ZGlmZiAtLWdpdCBhLy5tYWlsbWFwIGIvLm1haWxtYXAKaW5kZXggMmE5MWMxNC4uOTY3Zjg4MiAxMDA2NDQKLS0tIGEvLm1haWxtYXAKKysrIGIvLm1haWxtYXAKQEAgLTY5LDYgKzY5LDcgQEAKIEphbWVzIEJvdHRvbWxleSA8amVqYkB0aXRhbmljLmlsLnN0ZWVsZXllLmNvbT4KIEphbWVzIEUgV2lsc29uIDx3aWxzb25Ac3BlY2lmaXguY29tPgogSmFtZXMgS2V0cmVub3MgPGprZXRyZW5vQGlvLihub25lKT4KK0phdmkgTWVyaW5vIDxqYXZpLm1lcmlub0BrZXJuZWwub3JnPiA8amF2aS5tZXJpbm9AYXJtLmNvbT4KIDxqYXZpZXJAb3NnLnNhbXN1bmcuY29tPiA8amF2aWVyLm1hcnRpbmV6QGNvbGxhYm9yYS5jby51az4KIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4KIEplZmYgR2FyemlrIDxqZ2FyemlrQHByZXR6ZWwueXl6LnVzPgpAQCAtODgsNiArODksNyBAQAogS2VubmV0aCBXIENoZW4gPGtlbm5ldGgudy5jaGVuQGludGVsLmNvbT4KIEtvbnN0YW50aW4gS2hsZWJuaWtvdiA8a29jdDlpQGdtYWlsLmNvbT4gPGsua2hsZWJuaWtvdkBzYW1zdW5nLmNvbT4KIEtvdXNoaWsgPHJhZ2hhdmVuZHJhLmtvdXNoaWtAbmV0ZXJpb24uY29tPgorS3J6eXN6dG9mIEtvemxvd3NraSA8a3J6a0BrZXJuZWwub3JnPiA8ay5rb3psb3dza2lAc2Ftc3VuZy5jb20+CiBLcnp5c3p0b2YgS296bG93c2tpIDxrcnprQGtlcm5lbC5vcmc+IDxrLmtvemxvd3NraS5rQGdtYWlsLmNvbT4KIEt1bmlub3JpIE1vcmltb3RvIDxrdW5pbm9yaS5tb3JpbW90by5neEByZW5lc2FzLmNvbT4KIExlb25pZCBJIEFuYW5pZXYgPGxlb25pZC5pLmFuYW5pZXZAaW50ZWwuY29tPgpAQCAtMTU4LDYgKzE2MCw5IEBACiBWaXJlc2ggS3VtYXIgPHZpcmVzaGtAa2VybmVsLm9yZz4gPHZpcmVzaC5rdW1hckBzdC5jb20+CiBWaXJlc2ggS3VtYXIgPHZpcmVzaGtAa2VybmVsLm9yZz4gPHZpcmVzaC5saW51eEBnbWFpbC5jb20+CiBWaXJlc2ggS3VtYXIgPHZpcmVzaGtAa2VybmVsLm9yZz4gPHZpcmVzaC5rdW1hcjJAYXJtLmNvbT4KK1ZsYWQgRG9nYXJ1IDxkZHZsYWRAZ21haWwuY29tPiA8dmxhZC5kb2dhcnVAaW50ZWwuY29tPgorVmxhZGltaXIgRGF2eWRvdiA8dmRhdnlkb3YuZGV2QGdtYWlsLmNvbT4gPHZkYXZ5ZG92QHZpcnR1b3p6by5jb20+CitWbGFkaW1pciBEYXZ5ZG92IDx2ZGF2eWRvdi5kZXZAZ21haWwuY29tPiA8dmRhdnlkb3ZAcGFyYWxsZWxzLmNvbT4KIFRha2FzaGkgWU9TSElJIDx0YWthc2hpLnlvc2hpaS56akByZW5lc2FzLmNvbT4KIFl1c3VrZSBHb2RhIDxnb2RhLnl1c3VrZUByZW5lc2FzLmNvbT4KIEd1c3Rhdm8gUGFkb3ZhbiA8Z3VzdGF2b0BsYXMuaWMudW5pY2FtcC5icj4KZGlmZiAtLWdpdCBhL0NSRURJVFMgYi9DUkVESVRTCmluZGV4IDJhM2ZiY2QuLmRmMGE1MGUgMTAwNjQ0Ci0tLSBhL0NSRURJVFMKKysrIGIvQ1JFRElUUwpAQCAtMTA5MCw2ICsxMDkwLDEwIEBACiBTOiBQbGVhc2FudG9uLCBDQSA5NDU4OAogUzogVVNBCiAKK046IERtaXRyeSBFcmVtaW4tU29sZW5pa292CitFOiBkYmFyeXNoa292QGdtYWlsLmNvbQorRDogUG93ZXIgU3VwcGx5IE1haW50YWluZXIgZnJvbSB2My4xNCAtIHYzLjE1CisKIE46IERvdWcgRXZhbnMKIEU6IGRqZUBjeWdudXMuY29tCiBEOiBXcm90ZSBYZW5peCBGUyAocGFydCBvZiBzdGFuZGFyZCBrZXJuZWwgc2luY2UgMC45OS4xNSkKQEAgLTE5NDQsNiArMTk0OCwxMSBAQAogRToga3JheGVsQHN1c2UuZGUKIEQ6IHZpZGVvNGxpbnV4LCBidHR2LCB2ZXNhZmIsIHNvbWUgc2NzaSwgbWlzYyBmaXhlcwogCitOOiBIYW5zIEouIEtvY2gKK0Q6IFVTRVJTUEFDRSBJL08sIE1BWDY2NTAKK0Q6IEhhbnMgcGFzc2VkIGF3YXkgaW4gSnVuZSAyMDE2LCBhbmQgd2lsbCBiZSBncmVhdGx5IG1pc3NlZC4KK1c6IGh0dHBzOi8vbHduLm5ldC9BcnRpY2xlcy82OTEwMDAvCisKIE46IEhhcmFsZCBLb2VuaWcKIEU6IGtvZW5pZ0B0YXQucGh5c2lrLnVuaS10dWViaW5nZW4uZGUKIEQ6IFhGcmVlODYgKFMzKSwgRENGNzcsIHNvbWUga2VybmVsIGhhY2tzIGFuZCBmaXhlcwpAQCAtMzUxOCw2ICszNTI3LDEwIEBACiBTOiBOb3J0aGJvcm91Z2gsIE1BIDAxNTMyCiBTOiBVU0EKIAorTjogRG91ZyBUaG9tcHNvbgorRTogZG91Z3Rob21wc29uQHhtaXNzaW9uLmNvbQorRDogRURBQworCiBOOiBUb21teSBUaG9ybgogRTogVG9tbXkuVGhvcm5AaXJpc2EuZnIKIFc6IGh0dHA6Ly93d3cuaXJpc2EuZnIvcHJpdmUvdGhvcm4vaW5kZXguaHRtbApAQCAtMzY1NCw2ICszNjY3LDEwIEBACiBTOiA5NzA3OCBXdWVyemJ1cmcKIFM6IEdlcm1hbnkKIAorTjogSmFzb24gVWhsZW5rb3R0CitFOiBqdWhsZW5rb0Bha2FtYWkuY29tCitEOiBJMzAwMCBFREFDIGRyaXZlcgorCiBOOiBHcmVnIFVuZ2VyZXIKIEU6IGdlcmdAc25hcGdlYXIuY29tCiBEOiB1Q2xpbnV4IGtlcm5lbCBoYWNrZXIKQEAgLTM2OTEsNyArMzcwOCw3IEBACiBOOiBHZWVydCBVeXR0ZXJob2V2ZW4KIEU6IGdlZXJ0QGxpbnV4LW02OGsub3JnCiBXOiBodHRwOi8vdXNlcnMudGVsZW5ldC5iZS9nZWVydHUvCi1QOiAxMDI0Lzg2MjY3OEE2IEM1MUQgMzYxQyAwQkQxIDRDOTAgQjI3NSAgQzU1MyA2RUVBIDExQkEgODYyNiA3OEE2CitQOiA0MDk2Ui80ODA0QjRCQzNGNTVFRUZCIDc1MEQgODJCMCBBNzgxIDU0MzEgNUUyNSAgOTI1QiA0ODA0IEI0QkMgM0Y1NSBFRUZCCiBEOiBtNjhrL0FtaWdhIGFuZCBQUEMvQ0hSUCBMb25ndHJhaWwgY29vcmRpbmF0b3IKIEQ6IEZyYW1lIGJ1ZmZlciBkZXZpY2UgYW5kIFhGNjhfRkJEZXYgbWFpbnRhaW5lcgogRDogbTY4ayBJREUgbWFpbnRhaW5lcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3N5c2ZzLWRldmljZXMgYi9Eb2N1bWVudGF0aW9uL0FCSS9zdGFibGUvc3lzZnMtZGV2aWNlcwppbmRleCA0M2Y3OGI4OGQuLmRmNDQ5ZDcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3N0YWJsZS9zeXNmcy1kZXZpY2VzCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3N0YWJsZS9zeXNmcy1kZXZpY2VzCkBAIC0xLDcgKzEsNyBAQAogIyBOb3RlOiBUaGlzIGRvY3VtZW50cyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgb2YgYW55IGRldmljZSBiZXlvbmQgd2hhdAogIyBpcyBkb2N1bWVudGVkIGluIERvY3VtZW50YXRpb24vc3lzZnMtcnVsZXMudHh0CiAKLVdoYXQ6CQkvc3lzL2RldmljZXMvKi9vZl9wYXRoCitXaGF0OgkJL3N5cy9kZXZpY2VzLyovb2Zfbm9kZQogRGF0ZToJCUZlYnJ1YXJ5IDIwMTUKIENvbnRhY3Q6CURldmljZSBUcmVlIG1haWxpbmcgbGlzdCA8ZGV2aWNldHJlZUB2Z2VyLmtlcm5lbC5vcmc+CiBEZXNjcmlwdGlvbjoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtbGVkIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1sZWQKaW5kZXggMzY0NmVjOC4uODZhY2UyOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1sZWQKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1sZWQKQEAgLTI0LDcgKzI0LDggQEAKIAkJb2YgbGVkIGV2ZW50cy4KIAkJWW91IGNhbiBjaGFuZ2UgdHJpZ2dlcnMgaW4gYSBzaW1pbGFyIG1hbm5lciB0byB0aGUgd2F5IGFuIElPCiAJCXNjaGVkdWxlciBpcyBjaG9zZW4uIFRyaWdnZXIgc3BlY2lmaWMgcGFyYW1ldGVycyBjYW4gYXBwZWFyIGluCi0JCS9zeXMvY2xhc3MvbGVkcy88bGVkPiBvbmNlIGEgZ2l2ZW4gdHJpZ2dlciBpcyBzZWxlY3RlZC4KKwkJL3N5cy9jbGFzcy9sZWRzLzxsZWQ+IG9uY2UgYSBnaXZlbiB0cmlnZ2VyIGlzIHNlbGVjdGVkLiBGb3IKKwkJdGhlaXIgZG9jdW1lbnRhdGlvbiBzZWUgc3lzZnMtY2xhc3MtbGVkLXRyaWdnZXItKi4KIAogV2hhdDoJCS9zeXMvY2xhc3MvbGVkcy88bGVkPi9pbnZlcnRlZAogRGF0ZToJCUphbnVhcnkgMjAxMQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1sZWQtdHJpZ2dlci1vbmVzaG90IGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1sZWQtdHJpZ2dlci1vbmVzaG90Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OGEzYTQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLWxlZC10cmlnZ2VyLW9uZXNob3QKQEAgLTAsMCArMSwzNiBAQAorV2hhdDoJCS9zeXMvY2xhc3MvbGVkcy88bGVkPi9kZWxheV9vbgorRGF0ZToJCUp1biAyMDEyCitLZXJuZWxWZXJzaW9uOgkzLjYKK0NvbnRhY3Q6CWxpbnV4LWxlZHNAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJU3BlY2lmaWVzIGZvciBob3cgbWFueSBtaWxsaXNlY29uZHMgdGhlIExFRCBoYXMgdG8gc3RheSBhdAorCQlMRURfRlVMTCBicmlnaHRuZXNzIGFmdGVyIGl0IGhhcyBiZWVuIGFybWVkLgorCQlEZWZhdWx0cyB0byAxMDAgbXMuCisKK1doYXQ6CQkvc3lzL2NsYXNzL2xlZHMvPGxlZD4vZGVsYXlfb2ZmCitEYXRlOgkJSnVuIDIwMTIKK0tlcm5lbFZlcnNpb246CTMuNgorQ29udGFjdDoJbGludXgtbGVkc0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlTcGVjaWZpZXMgZm9yIGhvdyBtYW55IG1pbGxpc2Vjb25kcyB0aGUgTEVEIGhhcyB0byBzdGF5IGF0CisJCUxFRF9PRkYgYnJpZ2h0bmVzcyBhZnRlciBpdCBoYXMgYmVlbiBhcm1lZC4KKwkJRGVmYXVsdHMgdG8gMTAwIG1zLgorCitXaGF0OgkJL3N5cy9jbGFzcy9sZWRzLzxsZWQ+L2ludmVydAorRGF0ZToJCUp1biAyMDEyCitLZXJuZWxWZXJzaW9uOgkzLjYKK0NvbnRhY3Q6CWxpbnV4LWxlZHNAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJUmV2ZXJzZSB0aGUgYmxpbmsgbG9naWMuIElmIHNldCB0byAwIChkZWZhdWx0KSBibGluayBvbiBmb3IKKwkJZGVsYXlfb24gbXMsIHRoZW4gYmxpbmsgb2ZmIGZvciBkZWxheV9vZmYgbXMsIGxlYXZpbmcgdGhlIExFRAorCQlub3JtYWxseSBvZmYuIElmIHNldCB0byAxLCBibGluayBvZmYgZm9yIGRlbGF5X29mZiBtcywgdGhlbgorCQlibGluayBvbiBmb3IgZGVsYXlfb24gbXMsIGxlYXZpbmcgdGhlIExFRCBub3JtYWxseSBvbi4KKwkJU2V0dGluZyB0aGlzIHZhbHVlIGFsc28gaW1tZWRpYXRlbHkgY2hhbmdlcyB0aGUgTEVEIHN0YXRlLgorCitXaGF0OgkJL3N5cy9jbGFzcy9sZWRzLzxsZWQ+L3Nob3QKK0RhdGU6CQlKdW4gMjAxMgorS2VybmVsVmVyc2lvbjoJMy42CitDb250YWN0OglsaW51eC1sZWRzQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCVdyaXRlIGFueSBub24tZW1wdHkgc3RyaW5nIHRvIHNpZ25hbCBhbiBldmVudHMsIHRoaXMgc3RhcnRzIGEKKwkJYmxpbmsgc2VxdWVuY2UgaWYgbm90IGFscmVhZHkgcnVubmluZy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtbGVkLXRyaWdnZXItdXNicG9ydCBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtbGVkLXRyaWdnZXItdXNicG9ydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDQwZTY5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1sZWQtdHJpZ2dlci11c2Jwb3J0CkBAIC0wLDAgKzEsMTIgQEAKK1doYXQ6CQkvc3lzL2NsYXNzL2xlZHMvPGxlZD4vcG9ydHMvPHBvcnQ+CitEYXRlOgkJU2VwdGVtYmVyIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuOQorQ29udGFjdDoJbGludXgtbGVkc0B2Z2VyLmtlcm5lbC5vcmcKKwkJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUV2ZXJ5IGRpciBlbnRyeSByZXByZXNlbnRzIGEgc2luZ2xlIFVTQiBwb3J0IHRoYXQgY2FuIGJlCisJCXNlbGVjdGVkIGZvciB0aGUgVVNCIHBvcnQgdHJpZ2dlci4gU2VsZWN0aW5nIHBvcnRzIG1ha2VzIHRyaWdnZXIKKwkJb2JzZXJ2aW5nIHRoZW0gZm9yIGFueSBjb25uZWN0ZWQgZGV2aWNlcyBhbmQgbGlnaHRpbmcgb24gTEVEIGlmCisJCXRoZXJlIGFyZSBhbnkuCisJCUVjaG9pbmcgIjEiIHZhbHVlIHNlbGVjdHMgVVNCIHBvcnQuIEVjaG9pbmcgIjAiIHVuc2VsZWN0cyBpdC4KKwkJQ3VycmVudCBzdGF0ZSBjYW4gYmUgYWxzbyByZWFkLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1taWMudHh0IGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1taWMudHh0CmluZGV4IGQ0NWVlZDIuLjZlZjY4MjYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtbWljLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLW1pYy50eHQKQEAgLTE1Myw3ICsxNTMsNyBAQAogCiBXaGF0OgkJL3N5cy9jbGFzcy9taWMvbWljKHgpL2hlYXJ0YmVhdF9lbmFibGUKIERhdGU6CQlNYXJjaCAyMDE1Ci1LZXJuZWxWZXJzaW9uOgkzLjIwCitLZXJuZWxWZXJzaW9uOgk0LjQKIENvbnRhY3Q6CUFzaHV0b3NoIERpeGl0IDxhc2h1dG9zaC5kaXhpdEBpbnRlbC5jb20+CiBEZXNjcmlwdGlvbjoKIAkJVGhlIE1JQyBkcml2ZXJzIGRldGVjdCBhbmQgaW5mb3JtIHVzZXIgc3BhY2UgYWJvdXQgY2FyZCBjcmFzaGVzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLXBvd2VyIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1wb3dlcgppbmRleCBmYTA1NzE5Li5mODVjZTllIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLXBvd2VyCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtcG93ZXIKQEAgLTIyLDcgKzIyLDcgQEAKIFdoYXQ6CQkvc3lzL2NsYXNzL3Bvd2VyX3N1cHBseS9tYXgxNDU3Ny1jaGFyZ2VyL2RldmljZS9mYXN0X2NoYXJnZV90aW1lcgogRGF0ZToJCU9jdG9iZXIgMjAxNAogS2VybmVsVmVyc2lvbjoJMy4xOC4wCi1Db250YWN0OglLcnp5c3p0b2YgS296bG93c2tpIDxrLmtvemxvd3NraUBzYW1zdW5nLmNvbT4KK0NvbnRhY3Q6CUtyenlzenRvZiBLb3psb3dza2kgPGtyemtAa2VybmVsLm9yZz4KIERlc2NyaXB0aW9uOgogCQlUaGlzIGVudHJ5IHNob3dzIGFuZCBzZXRzIHRoZSBtYXhpbXVtIHRpbWUgdGhlIG1heDE0NTc3CiAJCWNoYXJnZXIgb3BlcmF0ZXMgaW4gZmFzdC1jaGFyZ2UgbW9kZS4gV2hlbiB0aGUgdGltZXIgZXhwaXJlcwpAQCAtMzYsNyArMzYsNyBAQAogV2hhdDoJCS9zeXMvY2xhc3MvcG93ZXJfc3VwcGx5L21heDc3NjkzLWNoYXJnZXIvZGV2aWNlL2Zhc3RfY2hhcmdlX3RpbWVyCiBEYXRlOgkJSmFudWFyeSAyMDE1CiBLZXJuZWxWZXJzaW9uOgkzLjE5LjAKLUNvbnRhY3Q6CUtyenlzenRvZiBLb3psb3dza2kgPGsua296bG93c2tpQHNhbXN1bmcuY29tPgorQ29udGFjdDoJS3J6eXN6dG9mIEtvemxvd3NraSA8a3J6a0BrZXJuZWwub3JnPgogRGVzY3JpcHRpb246CiAJCVRoaXMgZW50cnkgc2hvd3MgYW5kIHNldHMgdGhlIG1heGltdW0gdGltZSB0aGUgbWF4Nzc2OTMKIAkJY2hhcmdlciBvcGVyYXRlcyBpbiBmYXN0LWNoYXJnZSBtb2RlLiBXaGVuIHRoZSB0aW1lciBleHBpcmVzCkBAIC01MCw3ICs1MCw3IEBACiBXaGF0OgkJL3N5cy9jbGFzcy9wb3dlcl9zdXBwbHkvbWF4Nzc2OTMtY2hhcmdlci9kZXZpY2UvdG9wX29mZl90aHJlc2hvbGRfY3VycmVudAogRGF0ZToJCUphbnVhcnkgMjAxNQogS2VybmVsVmVyc2lvbjoJMy4xOS4wCi1Db250YWN0OglLcnp5c3p0b2YgS296bG93c2tpIDxrLmtvemxvd3NraUBzYW1zdW5nLmNvbT4KK0NvbnRhY3Q6CUtyenlzenRvZiBLb3psb3dza2kgPGtyemtAa2VybmVsLm9yZz4KIERlc2NyaXB0aW9uOgogCQlUaGlzIGVudHJ5IHNob3dzIGFuZCBzZXRzIHRoZSBjaGFyZ2luZyBjdXJyZW50IHRocmVzaG9sZCBmb3IKIAkJZW50ZXJpbmcgdG9wLW9mZiBjaGFyZ2luZyBtb2RlLiBXaGVuIGNoYXJnaW5nIGN1cnJlbnQgaW4gZmFzdApAQCAtNjUsNyArNjUsNyBAQAogV2hhdDoJCS9zeXMvY2xhc3MvcG93ZXJfc3VwcGx5L21heDc3NjkzLWNoYXJnZXIvZGV2aWNlL3RvcF9vZmZfdGltZXIKIERhdGU6CQlKYW51YXJ5IDIwMTUKIEtlcm5lbFZlcnNpb246CTMuMTkuMAotQ29udGFjdDoJS3J6eXN6dG9mIEtvemxvd3NraSA8ay5rb3psb3dza2lAc2Ftc3VuZy5jb20+CitDb250YWN0OglLcnp5c3p0b2YgS296bG93c2tpIDxrcnprQGtlcm5lbC5vcmc+CiBEZXNjcmlwdGlvbjoKIAkJVGhpcyBlbnRyeSBzaG93cyBhbmQgc2V0cyB0aGUgbWF4aW11bSB0aW1lIHRoZSBtYXg3NzY5MwogCQljaGFyZ2VyIG9wZXJhdGVzIGluIHRvcC1vZmYgY2hhcmdlIG1vZGUuIFdoZW4gdGhlIHRpbWVyIGV4cGlyZXMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtaTJjLWJtcDA4NSBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtaTJjLWJtcDA4NQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg1OTYyYS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWkyYy1ibXAwODUKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1XaGF0OgkJL3N5cy9idXMvaTJjL2RldmljZXMvPGJ1c251bT4tPGRldmFkZHI+L3ByZXNzdXJlMF9pbnB1dAotRGF0ZToJCUp1bmUgMjAxMAotQ29udGFjdDoJQ2hyaXN0b3BoIE1haXIgPGNocmlzdG9waC5tYWlyQGdtYWlsLmNvbT4KLURlc2NyaXB0aW9uOglTdGFydCBhIHByZXNzdXJlIG1lYXN1cmVtZW50IGFuZCByZWFkIHRoZSByZXN1bHQuIFZhbHVlcwotCQlyZXByZXNlbnQgdGhlIGFtYmllbnQgYWlyIHByZXNzdXJlIGluIHBhc2NhbCAoMC4wMSBtaWxsaWJhcikuCi0KLQkJUmVhZGluZzogcmV0dXJucyB0aGUgY3VycmVudCBhaXIgcHJlc3N1cmUuCi0KLQotV2hhdDoJCS9zeXMvYnVzL2kyYy9kZXZpY2VzLzxidXNudW0+LTxkZXZhZGRyPi90ZW1wMF9pbnB1dAotRGF0ZToJCUp1bmUgMjAxMAotQ29udGFjdDoJQ2hyaXN0b3BoIE1haXIgPGNocmlzdG9waC5tYWlyQGdtYWlsLmNvbT4KLURlc2NyaXB0aW9uOglNZWFzdXJlIHRoZSBhbWJpZW50IHRlbXBlcmF0dXJlLiBUaGUgcmV0dXJuZWQgdmFsdWUgcmVwcmVzZW50cwotCQl0aGUgYW1iaWVudCB0ZW1wZXJhdHVyZSBpbiB1bml0cyBvZiAwLjEgZGVncmVlIGNlbHNpdXMuCi0KLQkJUmVhZGluZzogcmV0dXJucyB0aGUgY3VycmVudCB0ZW1wZXJhdHVyZS4KLQotCi1XaGF0OgkJL3N5cy9idXMvaTJjL2RldmljZXMvPGJ1c251bT4tPGRldmFkZHI+L292ZXJzYW1wbGluZwotRGF0ZToJCUp1bmUgMjAxMAotQ29udGFjdDoJQ2hyaXN0b3BoIE1haXIgPGNocmlzdG9waC5tYWlyQGdtYWlsLmNvbT4KLURlc2NyaXB0aW9uOglUZWxsIHRoZSBibXAwODUgdG8gdXNlIG1vcmUgc2FtcGxlcyB0byBjYWxjdWxhdGUgYSBwcmVzc3VyZQotCQl2YWx1ZS4gV2hlbiB3cml0aW5nIHRvIHRoaXMgZmlsZSB0aGUgY2hpcCB3aWxsIHVzZSAyXnggc2FtcGxlcwotCQl0byBjYWxjdWxhdGUgdGhlIG5leHQgcHJlc3N1cmUgdmFsdWUgd2l0aCB4IGJlaW5nIHRoZSB2YWx1ZQotCQl3cml0dGVuLiBVc2luZyB0aGlzIGZlYXR1cmUgd2lsbCBkZWNyZWFzZSBSTVMgbm9pc2UgYW5kCi0JCWluY3JlYXNlIHRoZSBtZWFzdXJlbWVudCB0aW1lLgotCi0JCVJlYWRpbmc6IHJldHVybnMgdGhlIGN1cnJlbnQgb3ZlcnNhbXBsaW5nIHNldHRpbmcuCi0KLQkJV3JpdGluZzogc2V0cyBhIG5ldyBvdmVyc2FtcGxpbmcgc2V0dGluZy4KLQkJQWNjZXB0ZWQgdmFsdWVzOiAwLi4zLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1rZXJuZWwtaXJxIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1rZXJuZWwtaXJxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMDc0YjEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWtlcm5lbC1pcnEKQEAgLTAsMCArMSw1MyBAQAorV2hhdDoJCS9zeXMva2VybmVsL2lycQorRGF0ZToJCVNlcHRlbWJlciAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LjkKK0NvbnRhY3Q6CUNyYWlnIEdhbGxlayA8a3JhaWdAZ29vZ2xlLmNvbT4KK0Rlc2NyaXB0aW9uOglEaXJlY3RvcnkgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3lzdGVtJ3MgSVJRcy4KKwkJU3BlY2lmaWNhbGx5LCBkYXRhIGZyb20gdGhlIGFzc29jaWF0ZWQgc3RydWN0IGlycV9kZXNjLgorCQlUaGUgaW5mb3JtYXRpb24gaGVyZSBpcyBzaW1pbGFyIHRvIHRoYXQgaW4gL3Byb2MvaW50ZXJydXB0cworCQlidXQgaW4gYSBtb3JlIG1hY2hpbmUtZnJpZW5kbHkgZm9ybWF0LiAgVGhpcyBkaXJlY3RvcnkgY29udGFpbnMKKwkJb25lIHN1YmRpcmVjdG9yeSBmb3IgZWFjaCBMaW51eCBJUlEgbnVtYmVyLgorCitXaGF0OgkJL3N5cy9rZXJuZWwvaXJxLzxpcnE+L2FjdGlvbnMKK0RhdGU6CQlTZXB0ZW1iZXIgMjAxNgorS2VybmVsVmVyc2lvbjoJNC45CitDb250YWN0OglDcmFpZyBHYWxsZWsgPGtyYWlnQGdvb2dsZS5jb20+CitEZXNjcmlwdGlvbjoJVGhlIElSUSBhY3Rpb24gY2hhaW4uICBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHplcm8gb3IgbW9yZQorCQlkZXZpY2UgbmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW50ZXJydXB0LgorCitXaGF0OgkJL3N5cy9rZXJuZWwvaXJxLzxpcnE+L2NoaXBfbmFtZQorRGF0ZToJCVNlcHRlbWJlciAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LjkKK0NvbnRhY3Q6CUNyYWlnIEdhbGxlayA8a3JhaWdAZ29vZ2xlLmNvbT4KK0Rlc2NyaXB0aW9uOglIdW1hbi1yZWFkYWJsZSBjaGlwIG5hbWUgc3VwcGxpZWQgYnkgdGhlIGFzc29jaWF0ZWQgZGV2aWNlCisJCWRyaXZlci4KKworV2hhdDoJCS9zeXMva2VybmVsL2lycS88aXJxPi9od2lycQorRGF0ZToJCVNlcHRlbWJlciAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LjkKK0NvbnRhY3Q6CUNyYWlnIEdhbGxlayA8a3JhaWdAZ29vZ2xlLmNvbT4KK0Rlc2NyaXB0aW9uOglXaGVuIGludGVycnVwdCB0cmFuc2xhdGlvbiBkb21haW5zIGFyZSB1c2VkLCB0aGlzIGZpbGUgY29udGFpbnMKKwkJdGhlIHVuZGVybHlpbmcgaGFyZHdhcmUgSVJRIG51bWJlciB1c2VkIGZvciB0aGlzIExpbnV4IElSUS4KKworV2hhdDoJCS9zeXMva2VybmVsL2lycS88aXJxPi9uYW1lCitEYXRlOgkJU2VwdGVtYmVyIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuOQorQ29udGFjdDoJQ3JhaWcgR2FsbGVrIDxrcmFpZ0Bnb29nbGUuY29tPgorRGVzY3JpcHRpb246CUh1bWFuLXJlYWRhYmxlIGZsb3cgaGFuZGxlciBuYW1lIGFzIGRlZmluZWQgYnkgdGhlIGlycSBjaGlwCisJCWRyaXZlci4KKworV2hhdDoJCS9zeXMva2VybmVsL2lycS88aXJxPi9wZXJfY3B1X2NvdW50CitEYXRlOgkJU2VwdGVtYmVyIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuOQorQ29udGFjdDoJQ3JhaWcgR2FsbGVrIDxrcmFpZ0Bnb29nbGUuY29tPgorRGVzY3JpcHRpb246CVRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGludGVycnVwdCBoYXMgZmlyZWQgc2luY2UgYm9vdC4gIFRoaXMKKwkJaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBjb3VudGVyczsgb25lIHBlciBDUFUgaW4gQ1BVIGlkCisJCW9yZGVyLiAgTk9URTogVGhpcyBmaWxlIGNvbnNpc3RlbnRseSBzaG93cyBjb3VudGVycyBmb3IgYWxsCisJCUNQVSBpZHMuICBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgYmVoYXZpb3Igb2YgL3Byb2MvaW50ZXJydXB0cworCQl3aGljaCBvbmx5IHNob3dzIGNvdW50ZXJzIGZvciBvbmxpbmUgQ1BVcy4KKworV2hhdDoJCS9zeXMva2VybmVsL2lycS88aXJxPi90eXBlCitEYXRlOgkJU2VwdGVtYmVyIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuOQorQ29udGFjdDoJQ3JhaWcgR2FsbGVrIDxrcmFpZ0Bnb29nbGUuY29tPgorRGVzY3JpcHRpb246CVRoZSB0eXBlIG9mIHRoZSBpbnRlcnJ1cHQuICBFaXRoZXIgdGhlIHN0cmluZyAnbGV2ZWwnIG9yICdlZGdlJy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQ2hhbmdlcyBiL0RvY3VtZW50YXRpb24vQ2hhbmdlcwppbmRleCBlYzk3Yjc3Li4yMjc5N2ExIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0NoYW5nZXMKKysrIGIvRG9jdW1lbnRhdGlvbi9DaGFuZ2VzCkBAIC0xLDggKzEsMTMgQEAKKy4uIF9jaGFuZ2VzOgorCitNaW5pbWFsIHJlcXVlcmVtZW50cyB0byBjb21waWxlIHRoZSBLZXJuZWwKKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKworCiBJbnRybwogPT09PT0KIAogVGhpcyBkb2N1bWVudCBpcyBkZXNpZ25lZCB0byBwcm92aWRlIGEgbGlzdCBvZiB0aGUgbWluaW11bSBsZXZlbHMgb2YKLXNvZnR3YXJlIG5lY2Vzc2FyeSB0byBydW4gdGhlIDMuMCBrZXJuZWxzLgorc29mdHdhcmUgbmVjZXNzYXJ5IHRvIHJ1biB0aGUgNC54IGtlcm5lbHMuCiAKIFRoaXMgZG9jdW1lbnQgaXMgb3JpZ2luYWxseSBiYXNlZCBvbiBteSAiQ2hhbmdlcyIgZmlsZSBmb3IgMi4wLngga2VybmVscwogYW5kIHRoZXJlZm9yZSBvd2VzIGNyZWRpdCB0byB0aGUgc2FtZSBwZW9wbGUgYXMgdGhhdCBmaWxlIChKYXJlZCBNYXVjaCwKQEAgLTEwLDkgKzE1LDkgQEAKICduZXQpLgogCiBDdXJyZW50IE1pbmltYWwgUmVxdWlyZW1lbnRzCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKLVVwZ3JhZGUgdG8gYXQgKmxlYXN0KiB0aGVzZSBzb2Z0d2FyZSByZXZpc2lvbnMgYmVmb3JlIHRoaW5raW5nIHlvdSd2ZQorVXBncmFkZSB0byBhdCAqKmxlYXN0KiogdGhlc2Ugc29mdHdhcmUgcmV2aXNpb25zIGJlZm9yZSB0aGlua2luZyB5b3UndmUKIGVuY291bnRlcmVkIGEgYnVnISAgSWYgeW91J3JlIHVuc3VyZSB3aGF0IHZlcnNpb24geW91J3JlIGN1cnJlbnRseQogcnVubmluZywgdGhlIHN1Z2dlc3RlZCBjb21tYW5kIHNob3VsZCB0ZWxsIHlvdS4KIApAQCAtMjEsMzQgKzI2LDQwIEBACiBzeXN0ZW1zOyBvYnZpb3VzbHksIGlmIHlvdSBkb24ndCBoYXZlIGFueSBJU0ROIGhhcmR3YXJlLCBmb3IgZXhhbXBsZSwKIHlvdSBwcm9iYWJseSBuZWVkbid0IGNvbmNlcm4geW91cnNlbGYgd2l0aCBpc2RuNGstdXRpbHMuCiAKLW8gIEdOVSBDICAgICAgICAgICAgICAgICAgMy4yICAgICAgICAgICAgICAgICAgICAgIyBnY2MgLS12ZXJzaW9uCi1vICBHTlUgbWFrZSAgICAgICAgICAgICAgIDMuODAgICAgICAgICAgICAgICAgICAgICMgbWFrZSAtLXZlcnNpb24KLW8gIGJpbnV0aWxzICAgICAgICAgICAgICAgMi4xMiAgICAgICAgICAgICAgICAgICAgIyBsZCAtdgotbyAgdXRpbC1saW51eCAgICAgICAgICAgICAyLjEwbyAgICAgICAgICAgICAgICAgICAjIGZkZm9ybWF0IC0tdmVyc2lvbgotbyAgbW9kdWxlLWluaXQtdG9vbHMgICAgICAwLjkuMTAgICAgICAgICAgICAgICAgICAjIGRlcG1vZCAtVgotbyAgZTJmc3Byb2dzICAgICAgICAgICAgICAxLjQxLjQgICAgICAgICAgICAgICAgICAjIGUyZnNjayAtVgotbyAgamZzdXRpbHMgICAgICAgICAgICAgICAxLjEuMyAgICAgICAgICAgICAgICAgICAjIGZzY2suamZzIC1WCi1vICByZWlzZXJmc3Byb2dzICAgICAgICAgIDMuNi4zICAgICAgICAgICAgICAgICAgICMgcmVpc2VyZnNjayAtVgotbyAgeGZzcHJvZ3MgICAgICAgICAgICAgICAyLjYuMCAgICAgICAgICAgICAgICAgICAjIHhmc19kYiAtVgotbyAgc3F1YXNoZnMtdG9vbHMgICAgICAgICA0LjAgICAgICAgICAgICAgICAgICAgICAjIG1rc3F1YXNoZnMgLXZlcnNpb24KLW8gIGJ0cmZzLXByb2dzICAgICAgICAgICAgMC4xOCAgICAgICAgICAgICAgICAgICAgIyBidHJmc2NrCi1vICBwY21jaWF1dGlscyAgICAgICAgICAgIDAwNCAgICAgICAgICAgICAgICAgICAgICMgcGNjYXJkY3RsIC1WCi1vICBxdW90YS10b29scyAgICAgICAgICAgIDMuMDkgICAgICAgICAgICAgICAgICAgICMgcXVvdGEgLVYKLW8gIFBQUCAgICAgICAgICAgICAgICAgICAgMi40LjAgICAgICAgICAgICAgICAgICAgIyBwcHBkIC0tdmVyc2lvbgotbyAgaXNkbjRrLXV0aWxzICAgICAgICAgICAzLjFwcmUxICAgICAgICAgICAgICAgICAjIGlzZG5jdHJsIDI+JjF8Z3JlcCB2ZXJzaW9uCi1vICBuZnMtdXRpbHMgICAgICAgICAgICAgIDEuMC41ICAgICAgICAgICAgICAgICAgICMgc2hvd21vdW50IC0tdmVyc2lvbgotbyAgcHJvY3BzICAgICAgICAgICAgICAgICAzLjIuMCAgICAgICAgICAgICAgICAgICAjIHBzIC0tdmVyc2lvbgotbyAgb3Byb2ZpbGUgICAgICAgICAgICAgICAwLjkgICAgICAgICAgICAgICAgICAgICAjIG9wcm9maWxlZCAtLXZlcnNpb24KLW8gIHVkZXYgICAgICAgICAgICAgICAgICAgMDgxICAgICAgICAgICAgICAgICAgICAgIyB1ZGV2ZCAtLXZlcnNpb24KLW8gIGdydWIgICAgICAgICAgICAgICAgICAgMC45MyAgICAgICAgICAgICAgICAgICAgIyBncnViIC0tdmVyc2lvbiB8fCBncnViLWluc3RhbGwgLS12ZXJzaW9uCi1vICBtY2Vsb2cgICAgICAgICAgICAgICAgIDAuNiAgICAgICAgICAgICAgICAgICAgICMgbWNlbG9nIC0tdmVyc2lvbgotbyAgaXB0YWJsZXMgICAgICAgICAgICAgICAxLjQuMiAgICAgICAgICAgICAgICAgICAjIGlwdGFibGVzIC1WCi1vICBvcGVuc3NsICYgbGliY3J5cHRvICAgIDEuMC4wICAgICAgICAgICAgICAgICAgICMgb3BlbnNzbCB2ZXJzaW9uCi1vICBiYyAgICAgICAgICAgICAgICAgICAgIDEuMDYuOTUgICAgICAgICAgICAgICAgICMgYmMgLS12ZXJzaW9uCis9PT09PT09PT09PT09PT09PT09PT09ID09PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBQcm9ncmFtICAgICAgICBNaW5pbWFsIHZlcnNpb24gICAgICAgQ29tbWFuZCB0byBjaGVjayB0aGUgdmVyc2lvbgorPT09PT09PT09PT09PT09PT09PT09PSA9PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0dOVSBDICAgICAgICAgICAgICAgICAgMy4yICAgICAgICAgICAgICBnY2MgLS12ZXJzaW9uCitHTlUgbWFrZSAgICAgICAgICAgICAgIDMuODAgICAgICAgICAgICAgbWFrZSAtLXZlcnNpb24KK2JpbnV0aWxzICAgICAgICAgICAgICAgMi4xMiAgICAgICAgICAgICBsZCAtdgordXRpbC1saW51eCAgICAgICAgICAgICAyLjEwbyAgICAgICAgICAgIGZkZm9ybWF0IC0tdmVyc2lvbgorbW9kdWxlLWluaXQtdG9vbHMgICAgICAwLjkuMTAgICAgICAgICAgIGRlcG1vZCAtVgorZTJmc3Byb2dzICAgICAgICAgICAgICAxLjQxLjQgICAgICAgICAgIGUyZnNjayAtVgoramZzdXRpbHMgICAgICAgICAgICAgICAxLjEuMyAgICAgICAgICAgIGZzY2suamZzIC1WCityZWlzZXJmc3Byb2dzICAgICAgICAgIDMuNi4zICAgICAgICAgICAgcmVpc2VyZnNjayAtVgoreGZzcHJvZ3MgICAgICAgICAgICAgICAyLjYuMCAgICAgICAgICAgIHhmc19kYiAtVgorc3F1YXNoZnMtdG9vbHMgICAgICAgICA0LjAgICAgICAgICAgICAgIG1rc3F1YXNoZnMgLXZlcnNpb24KK2J0cmZzLXByb2dzICAgICAgICAgICAgMC4xOCAgICAgICAgICAgICBidHJmc2NrCitwY21jaWF1dGlscyAgICAgICAgICAgIDAwNCAgICAgICAgICAgICAgcGNjYXJkY3RsIC1WCitxdW90YS10b29scyAgICAgICAgICAgIDMuMDkgICAgICAgICAgICAgcXVvdGEgLVYKK1BQUCAgICAgICAgICAgICAgICAgICAgMi40LjAgICAgICAgICAgICBwcHBkIC0tdmVyc2lvbgoraXNkbjRrLXV0aWxzICAgICAgICAgICAzLjFwcmUxICAgICAgICAgIGlzZG5jdHJsIDI+JjF8Z3JlcCB2ZXJzaW9uCituZnMtdXRpbHMgICAgICAgICAgICAgIDEuMC41ICAgICAgICAgICAgc2hvd21vdW50IC0tdmVyc2lvbgorcHJvY3BzICAgICAgICAgICAgICAgICAzLjIuMCAgICAgICAgICAgIHBzIC0tdmVyc2lvbgorb3Byb2ZpbGUgICAgICAgICAgICAgICAwLjkgICAgICAgICAgICAgIG9wcm9maWxlZCAtLXZlcnNpb24KK3VkZXYgICAgICAgICAgICAgICAgICAgMDgxICAgICAgICAgICAgICB1ZGV2ZCAtLXZlcnNpb24KK2dydWIgICAgICAgICAgICAgICAgICAgMC45MyAgICAgICAgICAgICBncnViIC0tdmVyc2lvbiB8fCBncnViLWluc3RhbGwgLS12ZXJzaW9uCittY2Vsb2cgICAgICAgICAgICAgICAgIDAuNiAgICAgICAgICAgICAgbWNlbG9nIC0tdmVyc2lvbgoraXB0YWJsZXMgICAgICAgICAgICAgICAxLjQuMiAgICAgICAgICAgIGlwdGFibGVzIC1WCitvcGVuc3NsICYgbGliY3J5cHRvICAgIDEuMC4wICAgICAgICAgICAgb3BlbnNzbCB2ZXJzaW9uCitiYyAgICAgICAgICAgICAgICAgICAgIDEuMDYuOTUgICAgICAgICAgYmMgLS12ZXJzaW9uCitTcGhpbnhcIFsjZjFdXwkgICAgICAgMS4yCQlzcGhpbngtYnVpbGQgLS12ZXJzaW9uCis9PT09PT09PT09PT09PT09PT09PT09ID09PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCisuLiBbI2YxXSBTcGhpbnggaXMgbmVlZGVkIG9ubHkgdG8gYnVpbGQgdGhlIEtlcm5lbCBkb2N1bWVudGF0aW9uCiAKIEtlcm5lbCBjb21waWxhdGlvbgotPT09PT09PT09PT09PT09PT09CisqKioqKioqKioqKioqKioqKioKIAogR0NDCiAtLS0KQEAgLTY0LDE2ICs3NSwxNiBAQAogQmludXRpbHMKIC0tLS0tLS0tCiAKLUxpbnV4IG9uIElBLTMyIGhhcyByZWNlbnRseSBzd2l0Y2hlZCBmcm9tIHVzaW5nIGFzODYgdG8gdXNpbmcgZ2FzIGZvcgotYXNzZW1ibGluZyB0aGUgMTYtYml0IGJvb3QgY29kZSwgcmVtb3ZpbmcgdGhlIG5lZWQgZm9yIGFzODYgdG8gY29tcGlsZQorTGludXggb24gSUEtMzIgaGFzIHJlY2VudGx5IHN3aXRjaGVkIGZyb20gdXNpbmcgYGBhczg2YGAgdG8gdXNpbmcgYGBnYXNgYCBmb3IKK2Fzc2VtYmxpbmcgdGhlIDE2LWJpdCBib290IGNvZGUsIHJlbW92aW5nIHRoZSBuZWVkIGZvciBgYGFzODZgYCB0byBjb21waWxlCiB5b3VyIGtlcm5lbC4gIFRoaXMgY2hhbmdlIGRvZXMsIGhvd2V2ZXIsIG1lYW4gdGhhdCB5b3UgbmVlZCBhIHJlY2VudAogcmVsZWFzZSBvZiBiaW51dGlscy4KIAogUGVybAogLS0tLQogCi1Zb3Ugd2lsbCBuZWVkIHBlcmwgNSBhbmQgdGhlIGZvbGxvd2luZyBtb2R1bGVzOiBHZXRvcHQ6OkxvbmcsIEdldG9wdDo6U3RkLAotRmlsZTo6QmFzZW5hbWUsIGFuZCBGaWxlOjpGaW5kIHRvIGJ1aWxkIHRoZSBrZXJuZWwuCitZb3Ugd2lsbCBuZWVkIHBlcmwgNSBhbmQgdGhlIGZvbGxvd2luZyBtb2R1bGVzOiBgYEdldG9wdDo6TG9uZ2BgLAorYGBHZXRvcHQ6OlN0ZGBgLCBgYEZpbGU6OkJhc2VuYW1lYGAsIGFuZCBgYEZpbGU6OkZpbmRgYCB0byBidWlsZCB0aGUga2VybmVsLgogCiBCQwogLS0KQEAgLTkzLDcgKzEwNCw3IEBACiAKIAogU3lzdGVtIHV0aWxpdGllcwotPT09PT09PT09PT09PT09PQorKioqKioqKioqKioqKioqKgogCiBBcmNoaXRlY3R1cmFsIGNoYW5nZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTE1LDcgKzEyNiw3IEBACiBVdGlsLWxpbnV4CiAtLS0tLS0tLS0tCiAKLU5ldyB2ZXJzaW9ucyBvZiB1dGlsLWxpbnV4IHByb3ZpZGUgKmZkaXNrIHN1cHBvcnQgZm9yIGxhcmdlciBkaXNrcywKK05ldyB2ZXJzaW9ucyBvZiB1dGlsLWxpbnV4IHByb3ZpZGUgYGBmZGlza2BgIHN1cHBvcnQgZm9yIGxhcmdlciBkaXNrcywKIHN1cHBvcnQgbmV3IG9wdGlvbnMgdG8gbW91bnQsIHJlY29nbml6ZSBtb3JlIHN1cHBvcnRlZCBwYXJ0aXRpb24KIHR5cGVzLCBoYXZlIGEgZmRmb3JtYXQgd2hpY2ggd29ya3Mgd2l0aCAyLjQga2VybmVscywgYW5kIHNpbWlsYXIgZ29vZGllcy4KIFlvdSdsbCBwcm9iYWJseSB3YW50IHRvIHVwZ3JhZGUuCkBAIC0xMjUsNTQgKzEzNiw1NyBAQAogCiBJZiB0aGUgdW50aGlua2FibGUgaGFwcGVucyBhbmQgeW91ciBrZXJuZWwgb29wc2VzLCB5b3UgbWF5IG5lZWQgdGhlCiBrc3ltb29wcyB0b29sIHRvIGRlY29kZSBpdCwgYnV0IGluIG1vc3QgY2FzZXMgeW91IGRvbid0LgotSXQgaXMgZ2VuZXJhbGx5IHByZWZlcnJlZCB0byBidWlsZCB0aGUga2VybmVsIHdpdGggQ09ORklHX0tBTExTWU1TIHNvCitJdCBpcyBnZW5lcmFsbHkgcHJlZmVycmVkIHRvIGJ1aWxkIHRoZSBrZXJuZWwgd2l0aCBgYENPTkZJR19LQUxMU1lNU2BgIHNvCiB0aGF0IGl0IHByb2R1Y2VzIHJlYWRhYmxlIGR1bXBzIHRoYXQgY2FuIGJlIHVzZWQgYXMtaXMgKHRoaXMgYWxzbwogcHJvZHVjZXMgYmV0dGVyIG91dHB1dCB0aGFuIGtzeW1vb3BzKS4gIElmIGZvciBzb21lIHJlYXNvbiB5b3VyIGtlcm5lbAotaXMgbm90IGJ1aWxkIHdpdGggQ09ORklHX0tBTExTWU1TIGFuZCB5b3UgaGF2ZSBubyB3YXkgdG8gcmVidWlsZCBhbmQKK2lzIG5vdCBidWlsZCB3aXRoIGBgQ09ORklHX0tBTExTWU1TYGAgYW5kIHlvdSBoYXZlIG5vIHdheSB0byByZWJ1aWxkIGFuZAogcmVwcm9kdWNlIHRoZSBPb3BzIHdpdGggdGhhdCBvcHRpb24sIHRoZW4geW91IGNhbiBzdGlsbCBkZWNvZGUgdGhhdCBPb3BzCiB3aXRoIGtzeW1vb3BzLgogCiBNb2R1bGUtSW5pdC1Ub29scwogLS0tLS0tLS0tLS0tLS0tLS0KIAotQSBuZXcgbW9kdWxlIGxvYWRlciBpcyBub3cgaW4gdGhlIGtlcm5lbCB0aGF0IHJlcXVpcmVzIG1vZHVsZS1pbml0LXRvb2xzCitBIG5ldyBtb2R1bGUgbG9hZGVyIGlzIG5vdyBpbiB0aGUga2VybmVsIHRoYXQgcmVxdWlyZXMgYGBtb2R1bGUtaW5pdC10b29sc2BgCiB0byB1c2UuICBJdCBpcyBiYWNrd2FyZCBjb21wYXRpYmxlIHdpdGggdGhlIDIuNC54IHNlcmllcyBrZXJuZWxzLgogCiBNa2luaXRyZAogLS0tLS0tLS0KIAotVGhlc2UgY2hhbmdlcyB0byB0aGUgL2xpYi9tb2R1bGVzIGZpbGUgdHJlZSBsYXlvdXQgYWxzbyByZXF1aXJlIHRoYXQKK1RoZXNlIGNoYW5nZXMgdG8gdGhlIGBgL2xpYi9tb2R1bGVzYGAgZmlsZSB0cmVlIGxheW91dCBhbHNvIHJlcXVpcmUgdGhhdAogbWtpbml0cmQgYmUgdXBncmFkZWQuCiAKIEUyZnNwcm9ncwogLS0tLS0tLS0tCiAKLVRoZSBsYXRlc3QgdmVyc2lvbiBvZiBlMmZzcHJvZ3MgZml4ZXMgc2V2ZXJhbCBidWdzIGluIGZzY2sgYW5kCitUaGUgbGF0ZXN0IHZlcnNpb24gb2YgYGBlMmZzcHJvZ3NgYCBmaXhlcyBzZXZlcmFsIGJ1Z3MgaW4gZnNjayBhbmQKIGRlYnVnZnMuICBPYnZpb3VzbHksIGl0J3MgYSBnb29kIGlkZWEgdG8gdXBncmFkZS4KIAogSkZTdXRpbHMKIC0tLS0tLS0tCiAKLVRoZSBqZnN1dGlscyBwYWNrYWdlIGNvbnRhaW5zIHRoZSB1dGlsaXRpZXMgZm9yIHRoZSBmaWxlIHN5c3RlbS4KK1RoZSBgYGpmc3V0aWxzYGAgcGFja2FnZSBjb250YWlucyB0aGUgdXRpbGl0aWVzIGZvciB0aGUgZmlsZSBzeXN0ZW0uCiBUaGUgZm9sbG93aW5nIHV0aWxpdGllcyBhcmUgYXZhaWxhYmxlOgotbyBmc2NrLmpmcyAtIGluaXRpYXRlIHJlcGxheSBvZiB0aGUgdHJhbnNhY3Rpb24gbG9nLCBhbmQgY2hlY2sKKworLSBgYGZzY2suamZzYGAgLSBpbml0aWF0ZSByZXBsYXkgb2YgdGhlIHRyYW5zYWN0aW9uIGxvZywgYW5kIGNoZWNrCiAgIGFuZCByZXBhaXIgYSBKRlMgZm9ybWF0dGVkIHBhcnRpdGlvbi4KLW8gbWtmcy5qZnMgLSBjcmVhdGUgYSBKRlMgZm9ybWF0dGVkIHBhcnRpdGlvbi4KLW8gb3RoZXIgZmlsZSBzeXN0ZW0gdXRpbGl0aWVzIGFyZSBhbHNvIGF2YWlsYWJsZSBpbiB0aGlzIHBhY2thZ2UuCisKKy0gYGBta2ZzLmpmc2BgIC0gY3JlYXRlIGEgSkZTIGZvcm1hdHRlZCBwYXJ0aXRpb24uCisKKy0gb3RoZXIgZmlsZSBzeXN0ZW0gdXRpbGl0aWVzIGFyZSBhbHNvIGF2YWlsYWJsZSBpbiB0aGlzIHBhY2thZ2UuCiAKIFJlaXNlcmZzcHJvZ3MKIC0tLS0tLS0tLS0tLS0KIAogVGhlIHJlaXNlcmZzcHJvZ3MgcGFja2FnZSBzaG91bGQgYmUgdXNlZCBmb3IgcmVpc2VyZnMtMy42LngKIChMaW51eCBrZXJuZWxzIDIuNC54KS4gSXQgaXMgYSBjb21iaW5lZCBwYWNrYWdlIGFuZCBjb250YWlucyB3b3JraW5nCi12ZXJzaW9ucyBvZiBta3JlaXNlcmZzLCByZXNpemVfcmVpc2VyZnMsIGRlYnVncmVpc2VyZnMgYW5kCi1yZWlzZXJmc2NrLiBUaGVzZSB1dGlscyB3b3JrIG9uIGJvdGggaTM4NiBhbmQgYWxwaGEgcGxhdGZvcm1zLgordmVyc2lvbnMgb2YgYGBta3JlaXNlcmZzYGAsIGBgcmVzaXplX3JlaXNlcmZzYGAsIGBgZGVidWdyZWlzZXJmc2BgIGFuZAorYGByZWlzZXJmc2NrYGAuIFRoZXNlIHV0aWxzIHdvcmsgb24gYm90aCBpMzg2IGFuZCBhbHBoYSBwbGF0Zm9ybXMuCiAKIFhmc3Byb2dzCiAtLS0tLS0tLQogCi1UaGUgbGF0ZXN0IHZlcnNpb24gb2YgeGZzcHJvZ3MgY29udGFpbnMgbWtmcy54ZnMsIHhmc19kYiwgYW5kIHRoZQoteGZzX3JlcGFpciB1dGlsaXRpZXMsIGFtb25nIG90aGVycywgZm9yIHRoZSBYRlMgZmlsZXN5c3RlbS4gIEl0IGlzCitUaGUgbGF0ZXN0IHZlcnNpb24gb2YgYGB4ZnNwcm9nc2BgIGNvbnRhaW5zIGBgbWtmcy54ZnNgYCwgYGB4ZnNfZGJgYCwgYW5kIHRoZQorYGB4ZnNfcmVwYWlyYGAgdXRpbGl0aWVzLCBhbW9uZyBvdGhlcnMsIGZvciB0aGUgWEZTIGZpbGVzeXN0ZW0uICBJdCBpcwogYXJjaGl0ZWN0dXJlIGluZGVwZW5kZW50IGFuZCBhbnkgdmVyc2lvbiBmcm9tIDIuMC4wIG9ud2FyZCBzaG91bGQKIHdvcmsgY29ycmVjdGx5IHdpdGggdGhpcyB2ZXJzaW9uIG9mIHRoZSBYRlMga2VybmVsIGNvZGUgKDIuNi4wIG9yCiBsYXRlciBpcyByZWNvbW1lbmRlZCwgZHVlIHRvIHNvbWUgc2lnbmlmaWNhbnQgaW1wcm92ZW1lbnRzKS4KQEAgLTE4MCw3ICsxOTQsNyBAQAogUENNQ0lBdXRpbHMKIC0tLS0tLS0tLS0tCiAKLVBDTUNJQXV0aWxzIHJlcGxhY2VzIHBjbWNpYS1jcy4gSXQgcHJvcGVybHkgc2V0cyB1cAorUENNQ0lBdXRpbHMgcmVwbGFjZXMgYGBwY21jaWEtY3NgYC4gSXQgcHJvcGVybHkgc2V0cyB1cAogUENNQ0lBIHNvY2tldHMgYXQgc3lzdGVtIHN0YXJ0dXAgYW5kIGxvYWRzIHRoZSBhcHByb3ByaWF0ZSBtb2R1bGVzCiBmb3IgMTYtYml0IFBDTUNJQSBkZXZpY2VzIGlmIHRoZSBrZXJuZWwgaXMgbW9kdWxhcml6ZWQgYW5kIHRoZSBob3RwbHVnCiBzdWJzeXN0ZW0gaXMgdXNlZC4KQEAgLTE5OCwxOSArMjEyLDIwIEBACiAKIEEgZHJpdmVyIGhhcyBiZWVuIGFkZGVkIHRvIGFsbG93IHVwZGF0aW5nIG9mIEludGVsIElBMzIgbWljcm9jb2RlLAogYWNjZXNzaWJsZSBhcyBhIG5vcm1hbCAobWlzYykgY2hhcmFjdGVyIGRldmljZS4gIElmIHlvdSBhcmUgbm90IHVzaW5nCi11ZGV2IHlvdSBtYXkgbmVlZCB0bzoKK3VkZXYgeW91IG1heSBuZWVkIHRvOjoKIAotbWtkaXIgL2Rldi9jcHUKLW1rbm9kIC9kZXYvY3B1L21pY3JvY29kZSBjIDEwIDE4NAotY2htb2QgMDY0NCAvZGV2L2NwdS9taWNyb2NvZGUKKyAgbWtkaXIgL2Rldi9jcHUKKyAgbWtub2QgL2Rldi9jcHUvbWljcm9jb2RlIGMgMTAgMTg0CisgIGNobW9kIDA2NDQgL2Rldi9jcHUvbWljcm9jb2RlCiAKIGFzIHJvb3QgYmVmb3JlIHlvdSBjYW4gdXNlIHRoaXMuICBZb3UnbGwgcHJvYmFibHkgYWxzbyB3YW50IHRvCiBnZXQgdGhlIHVzZXItc3BhY2UgbWljcm9jb2RlX2N0bCB1dGlsaXR5IHRvIHVzZSB3aXRoIHRoaXMuCiAKIHVkZXYKIC0tLS0KLXVkZXYgaXMgYSB1c2Vyc3BhY2UgYXBwbGljYXRpb24gZm9yIHBvcHVsYXRpbmcgL2RldiBkeW5hbWljYWxseSB3aXRoCi1vbmx5IGVudHJpZXMgZm9yIGRldmljZXMgYWN0dWFsbHkgcHJlc2VudC4gIHVkZXYgcmVwbGFjZXMgdGhlIGJhc2ljCisKK2BgdWRldmBgIGlzIGEgdXNlcnNwYWNlIGFwcGxpY2F0aW9uIGZvciBwb3B1bGF0aW5nIGBgL2RldmBgIGR5bmFtaWNhbGx5IHdpdGgKK29ubHkgZW50cmllcyBmb3IgZGV2aWNlcyBhY3R1YWxseSBwcmVzZW50LiBgYHVkZXZgYCByZXBsYWNlcyB0aGUgYmFzaWMKIGZ1bmN0aW9uYWxpdHkgb2YgZGV2ZnMsIHdoaWxlIGFsbG93aW5nIHBlcnNpc3RlbnQgZGV2aWNlIG5hbWluZyBmb3IKIGRldmljZXMuCiAKQEAgLTIxOCwxMCArMjMzLDEwIEBACiAtLS0tCiAKIE5lZWRzIGxpYmZ1c2UgMi40LjAgb3IgbGF0ZXIuICBBYnNvbHV0ZSBtaW5pbXVtIGlzIDIuMy4wIGJ1dCBtb3VudAotb3B0aW9ucyAnZGlyZWN0X2lvJyBhbmQgJ2tlcm5lbF9jYWNoZScgd29uJ3Qgd29yay4KK29wdGlvbnMgYGBkaXJlY3RfaW9gYCBhbmQgYGBrZXJuZWxfY2FjaGVgYCB3b24ndCB3b3JrLgogCiBOZXR3b3JraW5nCi09PT09PT09PT09CisqKioqKioqKioqCiAKIEdlbmVyYWwgY2hhbmdlcwogLS0tLS0tLS0tLS0tLS0tCkBAIC0yNDMsOSArMjU4LDkgQEAKIHVwZ3JhZGUgcHBwZCB0byBhdCBsZWFzdCAyLjQuMC4KIAogSWYgeW91IGFyZSBub3QgdXNpbmcgdWRldiwgeW91IG11c3QgaGF2ZSB0aGUgZGV2aWNlIGZpbGUgL2Rldi9wcHAKLXdoaWNoIGNhbiBiZSBtYWRlIGJ5Ogord2hpY2ggY2FuIGJlIG1hZGUgYnk6OgogCi1ta25vZCAvZGV2L3BwcCBjIDEwOCAwCisgIG1rbm9kIC9kZXYvcHBwIGMgMTA4IDAKIAogYXMgcm9vdC4KIApAQCAtMjYwLDIyICsyNzUsMjIgQEAKIAogSW4gYW5jaWVudCAoMi40IGFuZCBlYXJsaWVyKSBrZXJuZWxzLCB0aGUgbmZzIHNlcnZlciBuZWVkZWQgdG8ga25vdwogYWJvdXQgYW55IGNsaWVudCB0aGF0IGV4cGVjdGVkIHRvIGJlIGFibGUgdG8gYWNjZXNzIGZpbGVzIHZpYSBORlMuICBUaGlzCi1pbmZvcm1hdGlvbiB3b3VsZCBiZSBnaXZlbiB0byB0aGUga2VybmVsIGJ5ICJtb3VudGQiIHdoZW4gdGhlIGNsaWVudAotbW91bnRlZCB0aGUgZmlsZXN5c3RlbSwgb3IgYnkgImV4cG9ydGZzIiBhdCBzeXN0ZW0gc3RhcnR1cC4gIGV4cG9ydGZzCi13b3VsZCB0YWtlIGluZm9ybWF0aW9uIGFib3V0IGFjdGl2ZSBjbGllbnRzIGZyb20gL3Zhci9saWIvbmZzL3JtdGFiLgoraW5mb3JtYXRpb24gd291bGQgYmUgZ2l2ZW4gdG8gdGhlIGtlcm5lbCBieSBgYG1vdW50ZGBgIHdoZW4gdGhlIGNsaWVudAorbW91bnRlZCB0aGUgZmlsZXN5c3RlbSwgb3IgYnkgYGBleHBvcnRmc2BgIGF0IHN5c3RlbSBzdGFydHVwLiAgZXhwb3J0ZnMKK3dvdWxkIHRha2UgaW5mb3JtYXRpb24gYWJvdXQgYWN0aXZlIGNsaWVudHMgZnJvbSBgYC92YXIvbGliL25mcy9ybXRhYmBgLgogCiBUaGlzIGFwcHJvYWNoIGlzIHF1aXRlIGZyYWdpbGUgYXMgaXQgZGVwZW5kcyBvbiBybXRhYiBiZWluZyBjb3JyZWN0CiB3aGljaCBpcyBub3QgYWx3YXlzIGVhc3ksIHBhcnRpY3VsYXJseSB3aGVuIHRyeWluZyB0byBpbXBsZW1lbnQKLWZhaWwtb3Zlci4gIEV2ZW4gd2hlbiB0aGUgc3lzdGVtIGlzIHdvcmtpbmcgd2VsbCwgcm10YWIgc3VmZmVycyBmcm9tCitmYWlsLW92ZXIuICBFdmVuIHdoZW4gdGhlIHN5c3RlbSBpcyB3b3JraW5nIHdlbGwsIGBgcm10YWJgYCBzdWZmZXJzIGZyb20KIGdldHRpbmcgbG90cyBvZiBvbGQgZW50cmllcyB0aGF0IG5ldmVyIGdldCByZW1vdmVkLgogCiBXaXRoIG1vZGVybiBrZXJuZWxzIHdlIGhhdmUgdGhlIG9wdGlvbiBvZiBoYXZpbmcgdGhlIGtlcm5lbCB0ZWxsIG1vdW50ZAogd2hlbiBpdCBnZXRzIGEgcmVxdWVzdCBmcm9tIGFuIHVua25vd24gaG9zdCwgYW5kIG1vdW50ZCBjYW4gZ2l2ZQogYXBwcm9wcmlhdGUgZXhwb3J0IGluZm9ybWF0aW9uIHRvIHRoZSBrZXJuZWwuICBUaGlzIHJlbW92ZXMgdGhlCi1kZXBlbmRlbmN5IG9uIHJtdGFiIGFuZCBtZWFucyB0aGF0IHRoZSBrZXJuZWwgb25seSBuZWVkcyB0byBrbm93IGFib3V0CitkZXBlbmRlbmN5IG9uIGBgcm10YWJgYCBhbmQgbWVhbnMgdGhhdCB0aGUga2VybmVsIG9ubHkgbmVlZHMgdG8ga25vdyBhYm91dAogY3VycmVudGx5IGFjdGl2ZSBjbGllbnRzLgogCi1UbyBlbmFibGUgdGhpcyBuZXcgZnVuY3Rpb25hbGl0eSwgeW91IG5lZWQgdG86CitUbyBlbmFibGUgdGhpcyBuZXcgZnVuY3Rpb25hbGl0eSwgeW91IG5lZWQgdG86OgogCiAgIG1vdW50IC10IG5mc2QgbmZzZCAvcHJvYy9mcy9uZnNkCiAKQEAgLTI4Nyw4ICszMDIsMzIgQEAKIC0tLS0tLQogCiBPbiB4ODYga2VybmVscyB0aGUgbWNlbG9nIHV0aWxpdHkgaXMgbmVlZGVkIHRvIHByb2Nlc3MgYW5kIGxvZyBtYWNoaW5lIGNoZWNrCi1ldmVudHMgd2hlbiBDT05GSUdfWDg2X01DRSBpcyBlbmFibGVkLiBNYWNoaW5lIGNoZWNrIGV2ZW50cyBhcmUgZXJyb3JzIHJlcG9ydGVkCi1ieSB0aGUgQ1BVLiBQcm9jZXNzaW5nIHRoZW0gaXMgc3Ryb25nbHkgZW5jb3VyYWdlZC4KK2V2ZW50cyB3aGVuIGBgQ09ORklHX1g4Nl9NQ0VgYCBpcyBlbmFibGVkLiBNYWNoaW5lIGNoZWNrIGV2ZW50cyBhcmUgZXJyb3JzCityZXBvcnRlZCBieSB0aGUgQ1BVLiBQcm9jZXNzaW5nIHRoZW0gaXMgc3Ryb25nbHkgZW5jb3VyYWdlZC4KKworS2VybmVsIGRvY3VtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqCisKK1NwaGlueAorLS0tLS0tCisKK1RoZSBSZVNUIG1hcmt1cHMgY3VycmVudGx5IHVzZWQgYnkgdGhlIERvY3VtZW50YXRpb24vIGZpbGVzIGFyZSBtZWFudCB0byBiZQorYnVpbHQgd2l0aCBgYFNwaGlueGBgIHZlcnNpb24gMS4yIG9yIHVwcGVyLiBJZiB5b3UncmUgZGVzaXJpbmcgdG8gYnVpbGQKK1BERiBvdXRwdXRzLCBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdmVyc2lvbiAxLjQuNi4KKworLi4gbm90ZTo6CisKKyAgUGxlYXNlIG5vdGljZSB0aGF0LCBmb3IgUERGIGFuZCBMYVRlWCBvdXRwdXQsIHlvdSdsbCBhbHNvIG5lZWQgYGBYZUxhVGVYYGAKKyAgdmVyc2lvbiAzLjE0MTU5MjY1LiBEZXBlbmRpbmcgb24gdGhlIGRpc3RyaWJ1dGlvbiwgeW91IG1heSBhbHNvIG5lZWQKKyAgdG8gaW5zdGFsbCBhIHNlcmllcyBvZiBgYHRleGxpdmVgYCBwYWNrYWdlcyB0aGF0IHByb3ZpZGUgdGhlIG1pbmltYWwKKyAgc2V0IG9mIGZ1bmN0aW9uYWxpdGllcyByZXF1aXJlZCBmb3IgYGBYZUxhVGV4YGAgdG8gd29yay4KKworT3RoZXIgdG9vbHMKKy0tLS0tLS0tLS0tCisKK0luIG9yZGVyIHRvIHByb2R1Y2UgZG9jdW1lbnRhdGlvbiBmcm9tIERvY0Jvb2ssIHlvdSdsbCBhbHNvIG5lZWQgYGB4bWx0b2BgLgorUGxlYXNlIG5vdGljZSwgaG93ZXZlciwgdGhhdCB3ZSdyZSBjdXJyZW50bHkgbWlncmF0aW5nIGFsbCBkb2N1bWVudHMgdG8gdXNlCitgYFNwaGlueGBgLgogCiBHZXR0aW5nIHVwZGF0ZWQgc29mdHdhcmUKID09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMjk4LDExNCArMzM3LDE0OSBAQAogCiBnY2MKIC0tLQotbyAgPGZ0cDovL2Z0cC5nbnUub3JnL2dudS9nY2MvPgorCistIDxmdHA6Ly9mdHAuZ251Lm9yZy9nbnUvZ2NjLz4KIAogTWFrZQogLS0tLQotbyAgPGZ0cDovL2Z0cC5nbnUub3JnL2dudS9tYWtlLz4KKworLSA8ZnRwOi8vZnRwLmdudS5vcmcvZ251L21ha2UvPgogCiBCaW51dGlscwogLS0tLS0tLS0KLW8gIDxmdHA6Ly9mdHAua2VybmVsLm9yZy9wdWIvbGludXgvZGV2ZWwvYmludXRpbHMvPgorCistIDxmdHA6Ly9mdHAua2VybmVsLm9yZy9wdWIvbGludXgvZGV2ZWwvYmludXRpbHMvPgogCiBPcGVuU1NMCiAtLS0tLS0tCi1vICA8aHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvPgorCistIDxodHRwczovL3d3dy5vcGVuc3NsLm9yZy8+CiAKIFN5c3RlbSB1dGlsaXRpZXMKICoqKioqKioqKioqKioqKioKIAogVXRpbC1saW51eAogLS0tLS0tLS0tLQotbyAgPGZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC91dGlscy91dGlsLWxpbnV4Lz4KKworLSA8ZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL3V0aWwtbGludXgvPgogCiBLc3ltb29wcwogLS0tLS0tLS0KLW8gIDxmdHA6Ly9mdHAua2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMva2VybmVsL2tzeW1vb3BzL3YyLjQvPgorCistIDxmdHA6Ly9mdHAua2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMva2VybmVsL2tzeW1vb3BzL3YyLjQvPgogCiBNb2R1bGUtSW5pdC1Ub29scwogLS0tLS0tLS0tLS0tLS0tLS0KLW8gIDxmdHA6Ly9mdHAua2VybmVsLm9yZy9wdWIvbGludXgva2VybmVsL3Blb3BsZS9ydXN0eS9tb2R1bGVzLz4KKworLSA8ZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC9wZW9wbGUvcnVzdHkvbW9kdWxlcy8+CiAKIE1raW5pdHJkCiAtLS0tLS0tLQotbyAgPGh0dHBzOi8vY29kZS5sYXVuY2hwYWQubmV0L2luaXRyZC10b29scy9tYWluPgorCistIDxodHRwczovL2NvZGUubGF1bmNocGFkLm5ldC9pbml0cmQtdG9vbHMvbWFpbj4KIAogRTJmc3Byb2dzCiAtLS0tLS0tLS0KLW8gIDxodHRwOi8vcHJkb3dubG9hZHMuc291cmNlZm9yZ2UubmV0L2UyZnNwcm9ncy9lMmZzcHJvZ3MtMS4yOS50YXIuZ3o+CisKKy0gPGh0dHA6Ly9wcmRvd25sb2Fkcy5zb3VyY2Vmb3JnZS5uZXQvZTJmc3Byb2dzL2UyZnNwcm9ncy0xLjI5LnRhci5nej4KIAogSkZTdXRpbHMKIC0tLS0tLS0tCi1vICA8aHR0cDovL2pmcy5zb3VyY2Vmb3JnZS5uZXQvPgorCistIDxodHRwOi8vamZzLnNvdXJjZWZvcmdlLm5ldC8+CiAKIFJlaXNlcmZzcHJvZ3MKIC0tLS0tLS0tLS0tLS0KLW8gIDxodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL2ZzL3JlaXNlcmZzLz4KKworLSA8aHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC91dGlscy9mcy9yZWlzZXJmcy8+CiAKIFhmc3Byb2dzCiAtLS0tLS0tLQotbyAgPGZ0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL3hmcy8+CisKKy0gPGZ0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL3hmcy8+CiAKIFBjbWNpYXV0aWxzCiAtLS0tLS0tLS0tLQotbyAgPGZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC91dGlscy9rZXJuZWwvcGNtY2lhLz4KKworLSA8ZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL2tlcm5lbC9wY21jaWEvPgogCiBRdW90YS10b29scwotLS0tLS0tLS0tLQotbyAgPGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGludXhxdW90YS8+CistLS0tLS0tLS0tLQorCistIDxodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpbnV4cXVvdGEvPgogCiBEb2NCb29rIFN0eWxlc2hlZXRzCiAtLS0tLS0tLS0tLS0tLS0tLS0tCi1vICA8aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9kb2Nib29rL2ZpbGVzL2RvY2Jvb2stZHNzc2wvPgorCistIDxodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2RvY2Jvb2svZmlsZXMvZG9jYm9vay1kc3NzbC8+CiAKIFhNTFRPIFhTTFQgRnJvbnRlbmQKIC0tLS0tLS0tLS0tLS0tLS0tLS0KLW8gIDxodHRwOi8vY3liZXJlbGsubmV0L3RpbS94bWx0by8+CisKKy0gPGh0dHA6Ly9jeWJlcmVsay5uZXQvdGltL3htbHRvLz4KIAogSW50ZWwgUDYgbWljcm9jb2RlCiAtLS0tLS0tLS0tLS0tLS0tLS0KLW8gIDxodHRwczovL2Rvd25sb2FkY2VudGVyLmludGVsLmNvbS8+CisKKy0gPGh0dHBzOi8vZG93bmxvYWRjZW50ZXIuaW50ZWwuY29tLz4KIAogdWRldgogLS0tLQotbyA8aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvc3lzdGVtZC9tYW4vdWRldi5odG1sPgorCistIDxodHRwOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9zeXN0ZW1kL21hbi91ZGV2Lmh0bWw+CiAKIEZVU0UKIC0tLS0KLW8gPGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZnVzZT4KKworLSA8aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9mdXNlPgogCiBtY2Vsb2cKIC0tLS0tLQotbyA8aHR0cDovL3d3dy5tY2Vsb2cub3JnLz4KKworLSA8aHR0cDovL3d3dy5tY2Vsb2cub3JnLz4KIAogTmV0d29ya2luZwogKioqKioqKioqKgogCiBQUFAKIC0tLQotbyAgPGZ0cDovL2Z0cC5zYW1iYS5vcmcvcHViL3BwcC8+CisKKy0gPGZ0cDovL2Z0cC5zYW1iYS5vcmcvcHViL3BwcC8+CiAKIElzZG40ay11dGlscwogLS0tLS0tLS0tLS0tCi1vICA8ZnRwOi8vZnRwLmlzZG40bGludXguZGUvcHViL2lzZG40bGludXgvdXRpbHMvPgorCistIDxmdHA6Ly9mdHAuaXNkbjRsaW51eC5kZS9wdWIvaXNkbjRsaW51eC91dGlscy8+CiAKIE5GUy11dGlscwogLS0tLS0tLS0tCi1vICA8aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L3Nob3dmaWxlcy5waHA/Z3JvdXBfaWQ9MTQ+CisKKy0gPGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9zaG93ZmlsZXMucGhwP2dyb3VwX2lkPTE0PgogCiBJcHRhYmxlcwogLS0tLS0tLS0KLW8gIDxodHRwOi8vd3d3LmlwdGFibGVzLm9yZy9kb3dubG9hZHMuaHRtbD4KKworLSA8aHR0cDovL3d3dy5pcHRhYmxlcy5vcmcvZG93bmxvYWRzLmh0bWw+CiAKIElwLXJvdXRlMgogLS0tLS0tLS0tCi1vICA8aHR0cHM6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMvbmV0L2lwcm91dGUyLz4KKworLSA8aHR0cHM6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMvbmV0L2lwcm91dGUyLz4KIAogT1Byb2ZpbGUKIC0tLS0tLS0tCi1vICA8aHR0cDovL29wcm9maWxlLnNmLm5ldC9kb3dubG9hZC8+CisKKy0gPGh0dHA6Ly9vcHJvZmlsZS5zZi5uZXQvZG93bmxvYWQvPgogCiBORlMtVXRpbHMKIC0tLS0tLS0tLQotbyAgPGh0dHA6Ly9uZnMuc291cmNlZm9yZ2UubmV0Lz4KKworLSA8aHR0cDovL25mcy5zb3VyY2Vmb3JnZS5uZXQvPgorCitLZXJuZWwgZG9jdW1lbnRhdGlvbgorKioqKioqKioqKioqKioqKioqKioKKworU3BoaW54CistLS0tLS0KKworLSA8aHR0cDovL3d3dy5zcGhpbngtZG9jLm9yZy8+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0NvZGVPZkNvbmZsaWN0IGIvRG9jdW1lbnRhdGlvbi9Db2RlT2ZDb25mbGljdAppbmRleCAxNjg0ZDBiLi40OWE4ZWNjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0NvZGVPZkNvbmZsaWN0CisrKyBiL0RvY3VtZW50YXRpb24vQ29kZU9mQ29uZmxpY3QKQEAgLTE5LDcgKzE5LDcgQEAKIHdpbGwgd29yayB0byByZXNvbHZlIHRoZSBpc3N1ZSB0byB0aGUgYmVzdCBvZiB0aGVpciBhYmlsaXR5LiAgRm9yIG1vcmUKIGluZm9ybWF0aW9uIG9uIHdobyBpcyBvbiB0aGUgVGVjaG5pY2FsIEFkdmlzb3J5IEJvYXJkIGFuZCB3aGF0IHRoZWlyCiByb2xlIGlzLCBwbGVhc2Ugc2VlOgotCWh0dHA6Ly93d3cubGludXhmb3VuZGF0aW9uLm9yZy9wcm9ncmFtcy9hZHZpc29yeS1jb3VuY2lscy90YWIKKwlodHRwOi8vd3d3LmxpbnV4Zm91bmRhdGlvbi5vcmcvcHJvamVjdHMvbGludXgvdGFiCiAKIEFzIGEgcmV2aWV3ZXIgb2YgY29kZSwgcGxlYXNlIHN0cml2ZSB0byBrZWVwIHRoaW5ncyBjaXZpbCBhbmQgZm9jdXNlZCBvbgogdGhlIHRlY2huaWNhbCBpc3N1ZXMgaW52b2x2ZWQuICBXZSBhcmUgYWxsIGh1bWFucywgYW5kIGZydXN0cmF0aW9ucyBjYW4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUgYi9Eb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlCmluZGV4IGEwOTY4MzYuLjljNjFjMDMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUKKysrIGIvRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZQpAQCAtMSw4ICsxLDEwIEBACisuLiBfY29kaW5nc3R5bGU6CiAKLQkJTGludXgga2VybmVsIGNvZGluZyBzdHlsZQorTGludXgga2VybmVsIGNvZGluZyBzdHlsZQorPT09PT09PT09PT09PT09PT09PT09PT09PQogCiBUaGlzIGlzIGEgc2hvcnQgZG9jdW1lbnQgZGVzY3JpYmluZyB0aGUgcHJlZmVycmVkIGNvZGluZyBzdHlsZSBmb3IgdGhlCi1saW51eCBrZXJuZWwuICBDb2Rpbmcgc3R5bGUgaXMgdmVyeSBwZXJzb25hbCwgYW5kIEkgd29uJ3QgX2ZvcmNlXyBteQorbGludXgga2VybmVsLiAgQ29kaW5nIHN0eWxlIGlzIHZlcnkgcGVyc29uYWwsIGFuZCBJIHdvbid0ICoqZm9yY2UqKiBteQogdmlld3Mgb24gYW55Ym9keSwgYnV0IHRoaXMgaXMgd2hhdCBnb2VzIGZvciBhbnl0aGluZyB0aGF0IEkgaGF2ZSB0byBiZQogYWJsZSB0byBtYWludGFpbiwgYW5kIEknZCBwcmVmZXIgaXQgZm9yIG1vc3Qgb3RoZXIgdGhpbmdzIHRvby4gIFBsZWFzZQogYXQgbGVhc3QgY29uc2lkZXIgdGhlIHBvaW50cyBtYWRlIGhlcmUuCkBAIC0xMyw3ICsxNSw4IEBACiBBbnl3YXksIGhlcmUgZ29lczoKIAogCi0JCUNoYXB0ZXIgMTogSW5kZW50YXRpb24KKzEpIEluZGVudGF0aW9uCistLS0tLS0tLS0tLS0tLQogCiBUYWJzIGFyZSA4IGNoYXJhY3RlcnMsIGFuZCB0aHVzIGluZGVudGF0aW9ucyBhcmUgYWxzbyA4IGNoYXJhY3RlcnMuCiBUaGVyZSBhcmUgaGVyZXRpYyBtb3ZlbWVudHMgdGhhdCB0cnkgdG8gbWFrZSBpbmRlbnRhdGlvbnMgNCAob3IgZXZlbiAyISkKQEAgLTM2LDggKzM5LDEwIEBACiBIZWVkIHRoYXQgd2FybmluZy4KIAogVGhlIHByZWZlcnJlZCB3YXkgdG8gZWFzZSBtdWx0aXBsZSBpbmRlbnRhdGlvbiBsZXZlbHMgaW4gYSBzd2l0Y2ggc3RhdGVtZW50IGlzCi10byBhbGlnbiB0aGUgInN3aXRjaCIgYW5kIGl0cyBzdWJvcmRpbmF0ZSAiY2FzZSIgbGFiZWxzIGluIHRoZSBzYW1lIGNvbHVtbgotaW5zdGVhZCBvZiAiZG91YmxlLWluZGVudGluZyIgdGhlICJjYXNlIiBsYWJlbHMuICBFLmcuOgordG8gYWxpZ24gdGhlIGBgc3dpdGNoYGAgYW5kIGl0cyBzdWJvcmRpbmF0ZSBgYGNhc2VgYCBsYWJlbHMgaW4gdGhlIHNhbWUgY29sdW1uCitpbnN0ZWFkIG9mIGBgZG91YmxlLWluZGVudGluZ2BgIHRoZSBgYGNhc2VgYCBsYWJlbHMuICBFLmcuOgorCisuLiBjb2RlLWJsb2NrOjogYwogCiAJc3dpdGNoIChzdWZmaXgpIHsKIAljYXNlICdHJzoKQEAgLTU5LDYgKzY0LDggQEAKIERvbid0IHB1dCBtdWx0aXBsZSBzdGF0ZW1lbnRzIG9uIGEgc2luZ2xlIGxpbmUgdW5sZXNzIHlvdSBoYXZlCiBzb21ldGhpbmcgdG8gaGlkZToKIAorLi4gY29kZS1ibG9jazo6IGMKKwogCWlmIChjb25kaXRpb24pIGRvX3RoaXM7CiAJICBkb19zb21ldGhpbmdfZXZlcnl0aW1lOwogCkBAIC03MSw3ICs3OCw4IEBACiBHZXQgYSBkZWNlbnQgZWRpdG9yIGFuZCBkb24ndCBsZWF2ZSB3aGl0ZXNwYWNlIGF0IHRoZSBlbmQgb2YgbGluZXMuCiAKIAotCQlDaGFwdGVyIDI6IEJyZWFraW5nIGxvbmcgbGluZXMgYW5kIHN0cmluZ3MKKzIpIEJyZWFraW5nIGxvbmcgbGluZXMgYW5kIHN0cmluZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQ29kaW5nIHN0eWxlIGlzIGFsbCBhYm91dCByZWFkYWJpbGl0eSBhbmQgbWFpbnRhaW5hYmlsaXR5IHVzaW5nIGNvbW1vbmx5CiBhdmFpbGFibGUgdG9vbHMuCkBAIC04Nyw3ICs5NSw4IEBACiBwcmludGsgbWVzc2FnZXMsIGJlY2F1c2UgdGhhdCBicmVha3MgdGhlIGFiaWxpdHkgdG8gZ3JlcCBmb3IgdGhlbS4KIAogCi0JCUNoYXB0ZXIgMzogUGxhY2luZyBCcmFjZXMgYW5kIFNwYWNlcworMykgUGxhY2luZyBCcmFjZXMgYW5kIFNwYWNlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBUaGUgb3RoZXIgaXNzdWUgdGhhdCBhbHdheXMgY29tZXMgdXAgaW4gQyBzdHlsaW5nIGlzIHRoZSBwbGFjZW1lbnQgb2YKIGJyYWNlcy4gIFVubGlrZSB0aGUgaW5kZW50IHNpemUsIHRoZXJlIGFyZSBmZXcgdGVjaG5pY2FsIHJlYXNvbnMgdG8KQEAgLTk1LDYgKzEwNCw4IEBACiBzaG93biB0byB1cyBieSB0aGUgcHJvcGhldHMgS2VybmlnaGFuIGFuZCBSaXRjaGllLCBpcyB0byBwdXQgdGhlIG9wZW5pbmcKIGJyYWNlIGxhc3Qgb24gdGhlIGxpbmUsIGFuZCBwdXQgdGhlIGNsb3NpbmcgYnJhY2UgZmlyc3QsIHRodXNseToKIAorLi4gY29kZS1ibG9jazo6IGMKKwogCWlmICh4IGlzIHRydWUpIHsKIAkJd2UgZG8geQogCX0KQEAgLTEwMiw2ICsxMTMsOCBAQAogVGhpcyBhcHBsaWVzIHRvIGFsbCBub24tZnVuY3Rpb24gc3RhdGVtZW50IGJsb2NrcyAoaWYsIHN3aXRjaCwgZm9yLAogd2hpbGUsIGRvKS4gIEUuZy46CiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgS09CSl9BREQ6CiAJCXJldHVybiAiYWRkIjsKQEAgLTExNiw2ICsxMjksOCBAQAogSG93ZXZlciwgdGhlcmUgaXMgb25lIHNwZWNpYWwgY2FzZSwgbmFtZWx5IGZ1bmN0aW9uczogdGhleSBoYXZlIHRoZQogb3BlbmluZyBicmFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGxpbmUsIHRodXM6CiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAlpbnQgZnVuY3Rpb24oaW50IHgpCiAJewogCQlib2R5IG9mIGZ1bmN0aW9uCkBAIC0xMjMsMjAgKzEzOCwyNCBAQAogCiBIZXJldGljIHBlb3BsZSBhbGwgb3ZlciB0aGUgd29ybGQgaGF2ZSBjbGFpbWVkIHRoYXQgdGhpcyBpbmNvbnNpc3RlbmN5CiBpcyAuLi4gIHdlbGwgLi4uICBpbmNvbnNpc3RlbnQsIGJ1dCBhbGwgcmlnaHQtdGhpbmtpbmcgcGVvcGxlIGtub3cgdGhhdAotKGEpIEsmUiBhcmUgX3JpZ2h0XyBhbmQgKGIpIEsmUiBhcmUgcmlnaHQuICBCZXNpZGVzLCBmdW5jdGlvbnMgYXJlCisoYSkgSyZSIGFyZSAqKnJpZ2h0KiogYW5kIChiKSBLJlIgYXJlIHJpZ2h0LiAgQmVzaWRlcywgZnVuY3Rpb25zIGFyZQogc3BlY2lhbCBhbnl3YXkgKHlvdSBjYW4ndCBuZXN0IHRoZW0gaW4gQykuCiAKLU5vdGUgdGhhdCB0aGUgY2xvc2luZyBicmFjZSBpcyBlbXB0eSBvbiBhIGxpbmUgb2YgaXRzIG93biwgX2V4Y2VwdF8gaW4KK05vdGUgdGhhdCB0aGUgY2xvc2luZyBicmFjZSBpcyBlbXB0eSBvbiBhIGxpbmUgb2YgaXRzIG93biwgKipleGNlcHQqKiBpbgogdGhlIGNhc2VzIHdoZXJlIGl0IGlzIGZvbGxvd2VkIGJ5IGEgY29udGludWF0aW9uIG9mIHRoZSBzYW1lIHN0YXRlbWVudCwKLWllIGEgIndoaWxlIiBpbiBhIGRvLXN0YXRlbWVudCBvciBhbiAiZWxzZSIgaW4gYW4gaWYtc3RhdGVtZW50LCBsaWtlCitpZSBhIGBgd2hpbGVgYCBpbiBhIGRvLXN0YXRlbWVudCBvciBhbiBgYGVsc2VgYCBpbiBhbiBpZi1zdGF0ZW1lbnQsIGxpa2UKIHRoaXM6CiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAlkbyB7CiAJCWJvZHkgb2YgZG8tbG9vcAogCX0gd2hpbGUgKGNvbmRpdGlvbik7CiAKIGFuZAogCisuLiBjb2RlLWJsb2NrOjogYworCiAJaWYgKHggPT0geSkgewogCQkuLgogCX0gZWxzZSBpZiAoeCA+IHkpIHsKQEAgLTE1NSwxMSArMTc0LDE1IEBACiAKIERvIG5vdCB1bm5lY2Vzc2FyaWx5IHVzZSBicmFjZXMgd2hlcmUgYSBzaW5nbGUgc3RhdGVtZW50IHdpbGwgZG8uCiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAlpZiAoY29uZGl0aW9uKQogCQlhY3Rpb24oKTsKIAogYW5kCiAKKy4uIGNvZGUtYmxvY2s6OiBub25lCisKIAlpZiAoY29uZGl0aW9uKQogCQlkb190aGlzKCk7CiAJZWxzZQpAQCAtMTY4LDYgKzE5MSw4IEBACiBUaGlzIGRvZXMgbm90IGFwcGx5IGlmIG9ubHkgb25lIGJyYW5jaCBvZiBhIGNvbmRpdGlvbmFsIHN0YXRlbWVudCBpcyBhIHNpbmdsZQogc3RhdGVtZW50OyBpbiB0aGUgbGF0dGVyIGNhc2UgdXNlIGJyYWNlcyBpbiBib3RoIGJyYW5jaGVzOgogCisuLiBjb2RlLWJsb2NrOjogYworCiAJaWYgKGNvbmRpdGlvbikgewogCQlkb190aGlzKCk7CiAJCWRvX3RoYXQoKTsKQEAgLTE3NSw1NyArMjAwLDY3IEBACiAJCW90aGVyd2lzZSgpOwogCX0KIAotCQkzLjE6ICBTcGFjZXMKKzMuMSkgU3BhY2VzCisqKioqKioqKioqKgogCiBMaW51eCBrZXJuZWwgc3R5bGUgZm9yIHVzZSBvZiBzcGFjZXMgZGVwZW5kcyAobW9zdGx5KSBvbgogZnVuY3Rpb24tdmVyc3VzLWtleXdvcmQgdXNhZ2UuICBVc2UgYSBzcGFjZSBhZnRlciAobW9zdCkga2V5d29yZHMuICBUaGUKIG5vdGFibGUgZXhjZXB0aW9ucyBhcmUgc2l6ZW9mLCB0eXBlb2YsIGFsaWdub2YsIGFuZCBfX2F0dHJpYnV0ZV9fLCB3aGljaCBsb29rCiBzb21ld2hhdCBsaWtlIGZ1bmN0aW9ucyAoYW5kIGFyZSB1c3VhbGx5IHVzZWQgd2l0aCBwYXJlbnRoZXNlcyBpbiBMaW51eCwKLWFsdGhvdWdoIHRoZXkgYXJlIG5vdCByZXF1aXJlZCBpbiB0aGUgbGFuZ3VhZ2UsIGFzIGluOiAic2l6ZW9mIGluZm8iIGFmdGVyCi0ic3RydWN0IGZpbGVpbmZvIGluZm87IiBpcyBkZWNsYXJlZCkuCithbHRob3VnaCB0aGV5IGFyZSBub3QgcmVxdWlyZWQgaW4gdGhlIGxhbmd1YWdlLCBhcyBpbjogYGBzaXplb2YgaW5mb2BgIGFmdGVyCitgYHN0cnVjdCBmaWxlaW5mbyBpbmZvO2BgIGlzIGRlY2xhcmVkKS4KIAotU28gdXNlIGEgc3BhY2UgYWZ0ZXIgdGhlc2Uga2V5d29yZHM6CitTbyB1c2UgYSBzcGFjZSBhZnRlciB0aGVzZSBrZXl3b3Jkczo6CiAKIAlpZiwgc3dpdGNoLCBjYXNlLCBmb3IsIGRvLCB3aGlsZQogCiBidXQgbm90IHdpdGggc2l6ZW9mLCB0eXBlb2YsIGFsaWdub2YsIG9yIF9fYXR0cmlidXRlX18uICBFLmcuLAogCisuLiBjb2RlLWJsb2NrOjogYworCisKIAlzID0gc2l6ZW9mKHN0cnVjdCBmaWxlKTsKIAogRG8gbm90IGFkZCBzcGFjZXMgYXJvdW5kIChpbnNpZGUpIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbnMuICBUaGlzIGV4YW1wbGUgaXMKLSpiYWQqOgorKipiYWQqKjoKKworLi4gY29kZS1ibG9jazo6IGMKKwogCiAJcyA9IHNpemVvZiggc3RydWN0IGZpbGUgKTsKIAogV2hlbiBkZWNsYXJpbmcgcG9pbnRlciBkYXRhIG9yIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcG9pbnRlciB0eXBlLCB0aGUKLXByZWZlcnJlZCB1c2Ugb2YgJyonIGlzIGFkamFjZW50IHRvIHRoZSBkYXRhIG5hbWUgb3IgZnVuY3Rpb24gbmFtZSBhbmQgbm90CitwcmVmZXJyZWQgdXNlIG9mIGBgKmBgIGlzIGFkamFjZW50IHRvIHRoZSBkYXRhIG5hbWUgb3IgZnVuY3Rpb24gbmFtZSBhbmQgbm90CiBhZGphY2VudCB0byB0aGUgdHlwZSBuYW1lLiAgRXhhbXBsZXM6CiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKKwogCWNoYXIgKmxpbnV4X2Jhbm5lcjsKIAl1bnNpZ25lZCBsb25nIGxvbmcgbWVtcGFyc2UoY2hhciAqcHRyLCBjaGFyICoqcmV0cHRyKTsKIAljaGFyICptYXRjaF9zdHJkdXAoc3Vic3RyaW5nX3QgKnMpOwogCiBVc2Ugb25lIHNwYWNlIGFyb3VuZCAob24gZWFjaCBzaWRlIG9mKSBtb3N0IGJpbmFyeSBhbmQgdGVybmFyeSBvcGVyYXRvcnMsCi1zdWNoIGFzIGFueSBvZiB0aGVzZToKK3N1Y2ggYXMgYW55IG9mIHRoZXNlOjoKIAogCT0gICsgIC0gIDwgID4gICogIC8gICUgIHwgICYgIF4gIDw9ICA+PSAgPT0gICE9ICA/ICA6CiAKLWJ1dCBubyBzcGFjZSBhZnRlciB1bmFyeSBvcGVyYXRvcnM6CitidXQgbm8gc3BhY2UgYWZ0ZXIgdW5hcnkgb3BlcmF0b3JzOjoKIAogCSYgICogICsgIC0gIH4gICEgIHNpemVvZiAgdHlwZW9mICBhbGlnbm9mICBfX2F0dHJpYnV0ZV9fICBkZWZpbmVkCiAKLW5vIHNwYWNlIGJlZm9yZSB0aGUgcG9zdGZpeCBpbmNyZW1lbnQgJiBkZWNyZW1lbnQgdW5hcnkgb3BlcmF0b3JzOgorbm8gc3BhY2UgYmVmb3JlIHRoZSBwb3N0Zml4IGluY3JlbWVudCAmIGRlY3JlbWVudCB1bmFyeSBvcGVyYXRvcnM6OgogCiAJKysgIC0tCiAKLW5vIHNwYWNlIGFmdGVyIHRoZSBwcmVmaXggaW5jcmVtZW50ICYgZGVjcmVtZW50IHVuYXJ5IG9wZXJhdG9yczoKK25vIHNwYWNlIGFmdGVyIHRoZSBwcmVmaXggaW5jcmVtZW50ICYgZGVjcmVtZW50IHVuYXJ5IG9wZXJhdG9yczo6CiAKIAkrKyAgLS0KIAotYW5kIG5vIHNwYWNlIGFyb3VuZCB0aGUgJy4nIGFuZCAiLT4iIHN0cnVjdHVyZSBtZW1iZXIgb3BlcmF0b3JzLgorYW5kIG5vIHNwYWNlIGFyb3VuZCB0aGUgYGAuYGAgYW5kIGBgLT5gYCBzdHJ1Y3R1cmUgbWVtYmVyIG9wZXJhdG9ycy4KIAogRG8gbm90IGxlYXZlIHRyYWlsaW5nIHdoaXRlc3BhY2UgYXQgdGhlIGVuZHMgb2YgbGluZXMuICBTb21lIGVkaXRvcnMgd2l0aAotInNtYXJ0IiBpbmRlbnRhdGlvbiB3aWxsIGluc2VydCB3aGl0ZXNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgb2YgbmV3IGxpbmVzIGFzCitgYHNtYXJ0YGAgaW5kZW50YXRpb24gd2lsbCBpbnNlcnQgd2hpdGVzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIG5ldyBsaW5lcyBhcwogYXBwcm9wcmlhdGUsIHNvIHlvdSBjYW4gc3RhcnQgdHlwaW5nIHRoZSBuZXh0IGxpbmUgb2YgY29kZSByaWdodCBhd2F5LgogSG93ZXZlciwgc29tZSBzdWNoIGVkaXRvcnMgZG8gbm90IHJlbW92ZSB0aGUgd2hpdGVzcGFjZSBpZiB5b3UgZW5kIHVwIG5vdAogcHV0dGluZyBhIGxpbmUgb2YgY29kZSB0aGVyZSwgc3VjaCBhcyBpZiB5b3UgbGVhdmUgYSBibGFuayBsaW5lLiAgQXMgYSByZXN1bHQsCkBAIC0yMzcsMjIgKzI3MiwyMyBAQAogY29udGV4dCBsaW5lcy4KIAogCi0JCUNoYXB0ZXIgNDogTmFtaW5nCis0KSBOYW1pbmcKKy0tLS0tLS0tLQogCiBDIGlzIGEgU3BhcnRhbiBsYW5ndWFnZSwgYW5kIHNvIHNob3VsZCB5b3VyIG5hbWluZyBiZS4gIFVubGlrZSBNb2R1bGEtMgogYW5kIFBhc2NhbCBwcm9ncmFtbWVycywgQyBwcm9ncmFtbWVycyBkbyBub3QgdXNlIGN1dGUgbmFtZXMgbGlrZQogVGhpc1ZhcmlhYmxlSXNBVGVtcG9yYXJ5Q291bnRlci4gIEEgQyBwcm9ncmFtbWVyIHdvdWxkIGNhbGwgdGhhdAotdmFyaWFibGUgInRtcCIsIHdoaWNoIGlzIG11Y2ggZWFzaWVyIHRvIHdyaXRlLCBhbmQgbm90IHRoZSBsZWFzdCBtb3JlCit2YXJpYWJsZSBgYHRtcGBgLCB3aGljaCBpcyBtdWNoIGVhc2llciB0byB3cml0ZSwgYW5kIG5vdCB0aGUgbGVhc3QgbW9yZQogZGlmZmljdWx0IHRvIHVuZGVyc3RhbmQuCiAKIEhPV0VWRVIsIHdoaWxlIG1peGVkLWNhc2UgbmFtZXMgYXJlIGZyb3duZWQgdXBvbiwgZGVzY3JpcHRpdmUgbmFtZXMgZm9yCi1nbG9iYWwgdmFyaWFibGVzIGFyZSBhIG11c3QuICBUbyBjYWxsIGEgZ2xvYmFsIGZ1bmN0aW9uICJmb28iIGlzIGEKK2dsb2JhbCB2YXJpYWJsZXMgYXJlIGEgbXVzdC4gIFRvIGNhbGwgYSBnbG9iYWwgZnVuY3Rpb24gYGBmb29gYCBpcyBhCiBzaG9vdGluZyBvZmZlbnNlLgogCi1HTE9CQUwgdmFyaWFibGVzICh0byBiZSB1c2VkIG9ubHkgaWYgeW91IF9yZWFsbHlfIG5lZWQgdGhlbSkgbmVlZCB0bworR0xPQkFMIHZhcmlhYmxlcyAodG8gYmUgdXNlZCBvbmx5IGlmIHlvdSAqKnJlYWxseSoqIG5lZWQgdGhlbSkgbmVlZCB0bwogaGF2ZSBkZXNjcmlwdGl2ZSBuYW1lcywgYXMgZG8gZ2xvYmFsIGZ1bmN0aW9ucy4gIElmIHlvdSBoYXZlIGEgZnVuY3Rpb24KIHRoYXQgY291bnRzIHRoZSBudW1iZXIgb2YgYWN0aXZlIHVzZXJzLCB5b3Ugc2hvdWxkIGNhbGwgdGhhdAotImNvdW50X2FjdGl2ZV91c2VycygpIiBvciBzaW1pbGFyLCB5b3Ugc2hvdWxkIF9ub3RfIGNhbGwgaXQgImNudHVzcigpIi4KK2BgY291bnRfYWN0aXZlX3VzZXJzKClgYCBvciBzaW1pbGFyLCB5b3Ugc2hvdWxkICoqbm90KiogY2FsbCBpdCBgYGNudHVzcigpYGAuCiAKIEVuY29kaW5nIHRoZSB0eXBlIG9mIGEgZnVuY3Rpb24gaW50byB0aGUgbmFtZSAoc28tY2FsbGVkIEh1bmdhcmlhbgogbm90YXRpb24pIGlzIGJyYWluIGRhbWFnZWQgLSB0aGUgY29tcGlsZXIga25vd3MgdGhlIHR5cGVzIGFueXdheSBhbmQgY2FuCkBAIC0yNjAsOSArMjk2LDkgQEAKIG1ha2VzIGJ1Z2d5IHByb2dyYW1zLgogCiBMT0NBTCB2YXJpYWJsZSBuYW1lcyBzaG91bGQgYmUgc2hvcnQsIGFuZCB0byB0aGUgcG9pbnQuICBJZiB5b3UgaGF2ZQotc29tZSByYW5kb20gaW50ZWdlciBsb29wIGNvdW50ZXIsIGl0IHNob3VsZCBwcm9iYWJseSBiZSBjYWxsZWQgImkiLgotQ2FsbGluZyBpdCAibG9vcF9jb3VudGVyIiBpcyBub24tcHJvZHVjdGl2ZSwgaWYgdGhlcmUgaXMgbm8gY2hhbmNlIG9mIGl0Ci1iZWluZyBtaXMtdW5kZXJzdG9vZC4gIFNpbWlsYXJseSwgInRtcCIgY2FuIGJlIGp1c3QgYWJvdXQgYW55IHR5cGUgb2YKK3NvbWUgcmFuZG9tIGludGVnZXIgbG9vcCBjb3VudGVyLCBpdCBzaG91bGQgcHJvYmFibHkgYmUgY2FsbGVkIGBgaWBgLgorQ2FsbGluZyBpdCBgYGxvb3BfY291bnRlcmBgIGlzIG5vbi1wcm9kdWN0aXZlLCBpZiB0aGVyZSBpcyBubyBjaGFuY2Ugb2YgaXQKK2JlaW5nIG1pcy11bmRlcnN0b29kLiAgU2ltaWxhcmx5LCBgYHRtcGBgIGNhbiBiZSBqdXN0IGFib3V0IGFueSB0eXBlIG9mCiB2YXJpYWJsZSB0aGF0IGlzIHVzZWQgdG8gaG9sZCBhIHRlbXBvcmFyeSB2YWx1ZS4KIAogSWYgeW91IGFyZSBhZnJhaWQgdG8gbWl4IHVwIHlvdXIgbG9jYWwgdmFyaWFibGUgbmFtZXMsIHlvdSBoYXZlIGFub3RoZXIKQEAgLTI3MCw1OSArMzA2LDY5IEBACiBTZWUgY2hhcHRlciA2IChGdW5jdGlvbnMpLgogCiAKLQkJQ2hhcHRlciA1OiBUeXBlZGVmcworNSkgVHlwZWRlZnMKKy0tLS0tLS0tLS0tCiAKLVBsZWFzZSBkb24ndCB1c2UgdGhpbmdzIGxpa2UgInZwc190Ii4KLUl0J3MgYSBfbWlzdGFrZV8gdG8gdXNlIHR5cGVkZWYgZm9yIHN0cnVjdHVyZXMgYW5kIHBvaW50ZXJzLiBXaGVuIHlvdSBzZWUgYQorUGxlYXNlIGRvbid0IHVzZSB0aGluZ3MgbGlrZSBgYHZwc190YGAuCitJdCdzIGEgKiptaXN0YWtlKiogdG8gdXNlIHR5cGVkZWYgZm9yIHN0cnVjdHVyZXMgYW5kIHBvaW50ZXJzLiBXaGVuIHlvdSBzZWUgYQorCisuLiBjb2RlLWJsb2NrOjogYworCiAKIAl2cHNfdCBhOwogCiBpbiB0aGUgc291cmNlLCB3aGF0IGRvZXMgaXQgbWVhbj8KIEluIGNvbnRyYXN0LCBpZiBpdCBzYXlzCiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAlzdHJ1Y3QgdmlydHVhbF9jb250YWluZXIgKmE7CiAKLXlvdSBjYW4gYWN0dWFsbHkgdGVsbCB3aGF0ICJhIiBpcy4KK3lvdSBjYW4gYWN0dWFsbHkgdGVsbCB3aGF0IGBgYWBgIGlzLgogCi1Mb3RzIG9mIHBlb3BsZSB0aGluayB0aGF0IHR5cGVkZWZzICJoZWxwIHJlYWRhYmlsaXR5Ii4gTm90IHNvLiBUaGV5IGFyZQorTG90cyBvZiBwZW9wbGUgdGhpbmsgdGhhdCB0eXBlZGVmcyBgYGhlbHAgcmVhZGFiaWxpdHlgYC4gTm90IHNvLiBUaGV5IGFyZQogdXNlZnVsIG9ubHkgZm9yOgogCi0gKGEpIHRvdGFsbHkgb3BhcXVlIG9iamVjdHMgKHdoZXJlIHRoZSB0eXBlZGVmIGlzIGFjdGl2ZWx5IHVzZWQgdG8gX2hpZGVfCisgKGEpIHRvdGFsbHkgb3BhcXVlIG9iamVjdHMgKHdoZXJlIHRoZSB0eXBlZGVmIGlzIGFjdGl2ZWx5IHVzZWQgdG8gKipoaWRlKioKICAgICAgd2hhdCB0aGUgb2JqZWN0IGlzKS4KIAotICAgICBFeGFtcGxlOiAicHRlX3QiIGV0Yy4gb3BhcXVlIG9iamVjdHMgdGhhdCB5b3UgY2FuIG9ubHkgYWNjZXNzIHVzaW5nCisgICAgIEV4YW1wbGU6IGBgcHRlX3RgYCBldGMuIG9wYXF1ZSBvYmplY3RzIHRoYXQgeW91IGNhbiBvbmx5IGFjY2VzcyB1c2luZwogICAgICB0aGUgcHJvcGVyIGFjY2Vzc29yIGZ1bmN0aW9ucy4KIAotICAgICBOT1RFISBPcGFxdWVuZXNzIGFuZCAiYWNjZXNzb3IgZnVuY3Rpb25zIiBhcmUgbm90IGdvb2QgaW4gdGhlbXNlbHZlcy4KLSAgICAgVGhlIHJlYXNvbiB3ZSBoYXZlIHRoZW0gZm9yIHRoaW5ncyBsaWtlIHB0ZV90IGV0Yy4gaXMgdGhhdCB0aGVyZQotICAgICByZWFsbHkgaXMgYWJzb2x1dGVseSBfemVyb18gcG9ydGFibHkgYWNjZXNzaWJsZSBpbmZvcm1hdGlvbiB0aGVyZS4KKyAgICAgLi4gbm90ZTo6CiAKLSAoYikgQ2xlYXIgaW50ZWdlciB0eXBlcywgd2hlcmUgdGhlIGFic3RyYWN0aW9uIF9oZWxwc18gYXZvaWQgY29uZnVzaW9uCi0gICAgIHdoZXRoZXIgaXQgaXMgImludCIgb3IgImxvbmciLgorICAgICAgIE9wYXF1ZW5lc3MgYW5kIGBgYWNjZXNzb3IgZnVuY3Rpb25zYGAgYXJlIG5vdCBnb29kIGluIHRoZW1zZWx2ZXMuCisgICAgICAgVGhlIHJlYXNvbiB3ZSBoYXZlIHRoZW0gZm9yIHRoaW5ncyBsaWtlIHB0ZV90IGV0Yy4gaXMgdGhhdCB0aGVyZQorICAgICAgIHJlYWxseSBpcyBhYnNvbHV0ZWx5ICoqemVybyoqIHBvcnRhYmx5IGFjY2Vzc2libGUgaW5mb3JtYXRpb24gdGhlcmUuCisKKyAoYikgQ2xlYXIgaW50ZWdlciB0eXBlcywgd2hlcmUgdGhlIGFic3RyYWN0aW9uICoqaGVscHMqKiBhdm9pZCBjb25mdXNpb24KKyAgICAgd2hldGhlciBpdCBpcyBgYGludGBgIG9yIGBgbG9uZ2BgLgogCiAgICAgIHU4L3UxNi91MzIgYXJlIHBlcmZlY3RseSBmaW5lIHR5cGVkZWZzLCBhbHRob3VnaCB0aGV5IGZpdCBpbnRvCiAgICAgIGNhdGVnb3J5IChkKSBiZXR0ZXIgdGhhbiBoZXJlLgogCi0gICAgIE5PVEUhIEFnYWluIC0gdGhlcmUgbmVlZHMgdG8gYmUgYSBfcmVhc29uXyBmb3IgdGhpcy4gSWYgc29tZXRoaW5nIGlzCi0gICAgICJ1bnNpZ25lZCBsb25nIiwgdGhlbiB0aGVyZSdzIG5vIHJlYXNvbiB0byBkbworICAgICAuLiBub3RlOjoKKworICAgICAgIEFnYWluIC0gdGhlcmUgbmVlZHMgdG8gYmUgYSAqKnJlYXNvbioqIGZvciB0aGlzLiBJZiBzb21ldGhpbmcgaXMKKyAgICAgICBgYHVuc2lnbmVkIGxvbmdgYCwgdGhlbiB0aGVyZSdzIG5vIHJlYXNvbiB0byBkbwogCiAJdHlwZWRlZiB1bnNpZ25lZCBsb25nIG15ZmxhZ3NfdDsKIAogICAgICBidXQgaWYgdGhlcmUgaXMgYSBjbGVhciByZWFzb24gZm9yIHdoeSBpdCB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMKLSAgICAgbWlnaHQgYmUgYW4gInVuc2lnbmVkIGludCIgYW5kIHVuZGVyIG90aGVyIGNvbmZpZ3VyYXRpb25zIG1pZ2h0IGJlCi0gICAgICJ1bnNpZ25lZCBsb25nIiwgdGhlbiBieSBhbGwgbWVhbnMgZ28gYWhlYWQgYW5kIHVzZSBhIHR5cGVkZWYuCisgICAgIG1pZ2h0IGJlIGFuIGBgdW5zaWduZWQgaW50YGAgYW5kIHVuZGVyIG90aGVyIGNvbmZpZ3VyYXRpb25zIG1pZ2h0IGJlCisgICAgIGBgdW5zaWduZWQgbG9uZ2BgLCB0aGVuIGJ5IGFsbCBtZWFucyBnbyBhaGVhZCBhbmQgdXNlIGEgdHlwZWRlZi4KIAotIChjKSB3aGVuIHlvdSB1c2Ugc3BhcnNlIHRvIGxpdGVyYWxseSBjcmVhdGUgYSBfbmV3XyB0eXBlIGZvcgorIChjKSB3aGVuIHlvdSB1c2Ugc3BhcnNlIHRvIGxpdGVyYWxseSBjcmVhdGUgYSAqKm5ldyoqIHR5cGUgZm9yCiAgICAgIHR5cGUtY2hlY2tpbmcuCiAKICAoZCkgTmV3IHR5cGVzIHdoaWNoIGFyZSBpZGVudGljYWwgdG8gc3RhbmRhcmQgQzk5IHR5cGVzLCBpbiBjZXJ0YWluCiAgICAgIGV4Y2VwdGlvbmFsIGNpcmN1bXN0YW5jZXMuCiAKICAgICAgQWx0aG91Z2ggaXQgd291bGQgb25seSB0YWtlIGEgc2hvcnQgYW1vdW50IG9mIHRpbWUgZm9yIHRoZSBleWVzIGFuZAotICAgICBicmFpbiB0byBiZWNvbWUgYWNjdXN0b21lZCB0byB0aGUgc3RhbmRhcmQgdHlwZXMgbGlrZSAndWludDMyX3QnLAorICAgICBicmFpbiB0byBiZWNvbWUgYWNjdXN0b21lZCB0byB0aGUgc3RhbmRhcmQgdHlwZXMgbGlrZSBgYHVpbnQzMl90YGAsCiAgICAgIHNvbWUgcGVvcGxlIG9iamVjdCB0byB0aGVpciB1c2UgYW55d2F5LgogCi0gICAgIFRoZXJlZm9yZSwgdGhlIExpbnV4LXNwZWNpZmljICd1OC91MTYvdTMyL3U2NCcgdHlwZXMgYW5kIHRoZWlyCisgICAgIFRoZXJlZm9yZSwgdGhlIExpbnV4LXNwZWNpZmljIGBgdTgvdTE2L3UzMi91NjRgYCB0eXBlcyBhbmQgdGhlaXIKICAgICAgc2lnbmVkIGVxdWl2YWxlbnRzIHdoaWNoIGFyZSBpZGVudGljYWwgdG8gc3RhbmRhcmQgdHlwZXMgYXJlCiAgICAgIHBlcm1pdHRlZCAtLSBhbHRob3VnaCB0aGV5IGFyZSBub3QgbWFuZGF0b3J5IGluIG5ldyBjb2RlIG9mIHlvdXIKICAgICAgb3duLgpAQCAtMzMzLDcgKzM3OSw3IEBACiAgKGUpIFR5cGVzIHNhZmUgZm9yIHVzZSBpbiB1c2Vyc3BhY2UuCiAKICAgICAgSW4gY2VydGFpbiBzdHJ1Y3R1cmVzIHdoaWNoIGFyZSB2aXNpYmxlIHRvIHVzZXJzcGFjZSwgd2UgY2Fubm90Ci0gICAgIHJlcXVpcmUgQzk5IHR5cGVzIGFuZCBjYW5ub3QgdXNlIHRoZSAndTMyJyBmb3JtIGFib3ZlLiBUaHVzLCB3ZQorICAgICByZXF1aXJlIEM5OSB0eXBlcyBhbmQgY2Fubm90IHVzZSB0aGUgYGB1MzJgYCBmb3JtIGFib3ZlLiBUaHVzLCB3ZQogICAgICB1c2UgX191MzIgYW5kIHNpbWlsYXIgdHlwZXMgaW4gYWxsIHN0cnVjdHVyZXMgd2hpY2ggYXJlIHNoYXJlZAogICAgICB3aXRoIHVzZXJzcGFjZS4KIApAQCAtMzQxLDEwICszODcsMTEgQEAKIEVWRVIgdXNlIGEgdHlwZWRlZiB1bmxlc3MgeW91IGNhbiBjbGVhcmx5IG1hdGNoIG9uZSBvZiB0aG9zZSBydWxlcy4KIAogSW4gZ2VuZXJhbCwgYSBwb2ludGVyLCBvciBhIHN0cnVjdCB0aGF0IGhhcyBlbGVtZW50cyB0aGF0IGNhbiByZWFzb25hYmx5Ci1iZSBkaXJlY3RseSBhY2Nlc3NlZCBzaG91bGQgX25ldmVyXyBiZSBhIHR5cGVkZWYuCitiZSBkaXJlY3RseSBhY2Nlc3NlZCBzaG91bGQgKipuZXZlcioqIGJlIGEgdHlwZWRlZi4KIAogCi0JCUNoYXB0ZXIgNjogRnVuY3Rpb25zCis2KSBGdW5jdGlvbnMKKy0tLS0tLS0tLS0tLQogCiBGdW5jdGlvbnMgc2hvdWxkIGJlIHNob3J0IGFuZCBzd2VldCwgYW5kIGRvIGp1c3Qgb25lIHRoaW5nLiAgVGhleSBzaG91bGQKIGZpdCBvbiBvbmUgb3IgdHdvIHNjcmVlbmZ1bHMgb2YgdGV4dCAodGhlIElTTy9BTlNJIHNjcmVlbiBzaXplIGlzIDgweDI0LApAQCAtMzcyLDggKzQxOSwxMCBAQAogdG8gdW5kZXJzdGFuZCB3aGF0IHlvdSBkaWQgMiB3ZWVrcyBmcm9tIG5vdy4KIAogSW4gc291cmNlIGZpbGVzLCBzZXBhcmF0ZSBmdW5jdGlvbnMgd2l0aCBvbmUgYmxhbmsgbGluZS4gIElmIHRoZSBmdW5jdGlvbiBpcwotZXhwb3J0ZWQsIHRoZSBFWFBPUlQqIG1hY3JvIGZvciBpdCBzaG91bGQgZm9sbG93IGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjbG9zaW5nCi1mdW5jdGlvbiBicmFjZSBsaW5lLiAgRS5nLjoKK2V4cG9ydGVkLCB0aGUgKipFWFBPUlQqKiBtYWNybyBmb3IgaXQgc2hvdWxkIGZvbGxvdyBpbW1lZGlhdGVseSBhZnRlciB0aGUKK2Nsb3NpbmcgZnVuY3Rpb24gYnJhY2UgbGluZS4gIEUuZy46CisKKy4uIGNvZGUtYmxvY2s6OiBjCiAKIAlpbnQgc3lzdGVtX2lzX3VwKHZvaWQpCiAJewpAQCAtMzg2LDcgKzQzNSw4IEBACiBiZWNhdXNlIGl0IGlzIGEgc2ltcGxlIHdheSB0byBhZGQgdmFsdWFibGUgaW5mb3JtYXRpb24gZm9yIHRoZSByZWFkZXIuCiAKIAotCQlDaGFwdGVyIDc6IENlbnRyYWxpemVkIGV4aXRpbmcgb2YgZnVuY3Rpb25zCis3KSBDZW50cmFsaXplZCBleGl0aW5nIG9mIGZ1bmN0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQWxiZWl0IGRlcHJlY2F0ZWQgYnkgc29tZSBwZW9wbGUsIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBnb3RvIHN0YXRlbWVudCBpcwogdXNlZCBmcmVxdWVudGx5IGJ5IGNvbXBpbGVycyBpbiBmb3JtIG9mIHRoZSB1bmNvbmRpdGlvbmFsIGp1bXAgaW5zdHJ1Y3Rpb24uCkBAIC0zOTYsMTggKzQ0NiwyMSBAQAogY2xlYW51cCBuZWVkZWQgdGhlbiBqdXN0IHJldHVybiBkaXJlY3RseS4KIAogQ2hvb3NlIGxhYmVsIG5hbWVzIHdoaWNoIHNheSB3aGF0IHRoZSBnb3RvIGRvZXMgb3Igd2h5IHRoZSBnb3RvIGV4aXN0cy4gIEFuCi1leGFtcGxlIG9mIGEgZ29vZCBuYW1lIGNvdWxkIGJlICJvdXRfYnVmZmVyOiIgaWYgdGhlIGdvdG8gZnJlZXMgImJ1ZmZlciIuICBBdm9pZAotdXNpbmcgR1ctQkFTSUMgbmFtZXMgbGlrZSAiZXJyMToiIGFuZCAiZXJyMjoiLiAgQWxzbyBkb24ndCBuYW1lIHRoZW0gYWZ0ZXIgdGhlCi1nb3RvIGxvY2F0aW9uIGxpa2UgImVycl9rbWFsbG9jX2ZhaWxlZDoiCitleGFtcGxlIG9mIGEgZ29vZCBuYW1lIGNvdWxkIGJlIGBgb3V0X2ZyZWVfYnVmZmVyOmBgIGlmIHRoZSBnb3RvIGZyZWVzIGBgYnVmZmVyYGAuCitBdm9pZCB1c2luZyBHVy1CQVNJQyBuYW1lcyBsaWtlIGBgZXJyMTpgYCBhbmQgYGBlcnIyOmBgLCBhcyB5b3Ugd291bGQgaGF2ZSB0bworcmVudW1iZXIgdGhlbSBpZiB5b3UgZXZlciBhZGQgb3IgcmVtb3ZlIGV4aXQgcGF0aHMsIGFuZCB0aGV5IG1ha2UgY29ycmVjdG5lc3MKK2RpZmZpY3VsdCB0byB2ZXJpZnkgYW55d2F5LgogCiBUaGUgcmF0aW9uYWxlIGZvciB1c2luZyBnb3RvcyBpczoKIAogLSB1bmNvbmRpdGlvbmFsIHN0YXRlbWVudHMgYXJlIGVhc2llciB0byB1bmRlcnN0YW5kIGFuZCBmb2xsb3cKIC0gbmVzdGluZyBpcyByZWR1Y2VkCiAtIGVycm9ycyBieSBub3QgdXBkYXRpbmcgaW5kaXZpZHVhbCBleGl0IHBvaW50cyB3aGVuIG1ha2luZwotICAgIG1vZGlmaWNhdGlvbnMgYXJlIHByZXZlbnRlZAorICBtb2RpZmljYXRpb25zIGFyZSBwcmV2ZW50ZWQKIC0gc2F2ZXMgdGhlIGNvbXBpbGVyIHdvcmsgdG8gb3B0aW1pemUgcmVkdW5kYW50IGNvZGUgYXdheSA7KQogCisuLiBjb2RlLWJsb2NrOjogYworCiAJaW50IGZ1bihpbnQgYSkKIAl7CiAJCWludCByZXN1bHQgPSAwOwpAQCAtNDI1LDI3ICs0NzgsNDEgQEAKIAkJCWdvdG8gb3V0X2J1ZmZlcjsKIAkJfQogCQkuLi4KLQlvdXRfYnVmZmVyOgorCW91dF9mcmVlX2J1ZmZlcjoKIAkJa2ZyZWUoYnVmZmVyKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKLUEgY29tbW9uIHR5cGUgb2YgYnVnIHRvIGJlIGF3YXJlIG9mIGlzICJvbmUgZXJyIGJ1Z3MiIHdoaWNoIGxvb2sgbGlrZSB0aGlzOgorQSBjb21tb24gdHlwZSBvZiBidWcgdG8gYmUgYXdhcmUgb2YgaXMgYGBvbmUgZXJyIGJ1Z3NgYCB3aGljaCBsb29rIGxpa2UgdGhpczoKKworLi4gY29kZS1ibG9jazo6IGMKIAogCWVycjoKIAkJa2ZyZWUoZm9vLT5iYXIpOwogCQlrZnJlZShmb28pOwogCQlyZXR1cm4gcmV0OwogCi1UaGUgYnVnIGluIHRoaXMgY29kZSBpcyB0aGF0IG9uIHNvbWUgZXhpdCBwYXRocyAiZm9vIiBpcyBOVUxMLiAgTm9ybWFsbHkgdGhlCi1maXggZm9yIHRoaXMgaXMgdG8gc3BsaXQgaXQgdXAgaW50byB0d28gZXJyb3IgbGFiZWxzICJlcnJfYmFyOiIgYW5kICJlcnJfZm9vOiIuCitUaGUgYnVnIGluIHRoaXMgY29kZSBpcyB0aGF0IG9uIHNvbWUgZXhpdCBwYXRocyBgYGZvb2BgIGlzIE5VTEwuICBOb3JtYWxseSB0aGUKK2ZpeCBmb3IgdGhpcyBpcyB0byBzcGxpdCBpdCB1cCBpbnRvIHR3byBlcnJvciBsYWJlbHMgYGBlcnJfZnJlZV9iYXI6YGAgYW5kCitgYGVycl9mcmVlX2ZvbzpgYDoKKworLi4gY29kZS1ibG9jazo6IGMKKworCSBlcnJfZnJlZV9iYXI6CisJCWtmcmVlKGZvby0+YmFyKTsKKwkgZXJyX2ZyZWVfZm9vOgorCQlrZnJlZShmb28pOworCQlyZXR1cm4gcmV0OworCitJZGVhbGx5IHlvdSBzaG91bGQgc2ltdWxhdGUgZXJyb3JzIHRvIHRlc3QgYWxsIGV4aXQgcGF0aHMuCiAKIAotCQlDaGFwdGVyIDg6IENvbW1lbnRpbmcKKzgpIENvbW1lbnRpbmcKKy0tLS0tLS0tLS0tLS0KIAogQ29tbWVudHMgYXJlIGdvb2QsIGJ1dCB0aGVyZSBpcyBhbHNvIGEgZGFuZ2VyIG9mIG92ZXItY29tbWVudGluZy4gIE5FVkVSCiB0cnkgdG8gZXhwbGFpbiBIT1cgeW91ciBjb2RlIHdvcmtzIGluIGEgY29tbWVudDogaXQncyBtdWNoIGJldHRlciB0bwotd3JpdGUgdGhlIGNvZGUgc28gdGhhdCB0aGUgX3dvcmtpbmdfIGlzIG9idmlvdXMsIGFuZCBpdCdzIGEgd2FzdGUgb2YKK3dyaXRlIHRoZSBjb2RlIHNvIHRoYXQgdGhlICoqd29ya2luZyoqIGlzIG9idmlvdXMsIGFuZCBpdCdzIGEgd2FzdGUgb2YKIHRpbWUgdG8gZXhwbGFpbiBiYWRseSB3cml0dGVuIGNvZGUuCiAKIEdlbmVyYWxseSwgeW91IHdhbnQgeW91ciBjb21tZW50cyB0byB0ZWxsIFdIQVQgeW91ciBjb2RlIGRvZXMsIG5vdCBIT1cuCkBAIC00NjEsMTEgKzUyOCwxMCBAQAogU2VlIHRoZSBmaWxlcyBEb2N1bWVudGF0aW9uL2tlcm5lbC1kb2N1bWVudGF0aW9uLnJzdCBhbmQgc2NyaXB0cy9rZXJuZWwtZG9jCiBmb3IgZGV0YWlscy4KIAotTGludXggc3R5bGUgZm9yIGNvbW1lbnRzIGlzIHRoZSBDODkgIi8qIC4uLiAqLyIgc3R5bGUuCi1Eb24ndCB1c2UgQzk5LXN0eWxlICIvLyAuLi4iIGNvbW1lbnRzLgotCiBUaGUgcHJlZmVycmVkIHN0eWxlIGZvciBsb25nIChtdWx0aS1saW5lKSBjb21tZW50cyBpczoKIAorLi4gY29kZS1ibG9jazo6IGMKKwogCS8qCiAJICogVGhpcyBpcyB0aGUgcHJlZmVycmVkIHN0eWxlIGZvciBtdWx0aS1saW5lCiAJICogY29tbWVudHMgaW4gdGhlIExpbnV4IGtlcm5lbCBzb3VyY2UgY29kZS4KQEAgLTQ3OCw2ICs1NDQsOCBAQAogRm9yIGZpbGVzIGluIG5ldC8gYW5kIGRyaXZlcnMvbmV0LyB0aGUgcHJlZmVycmVkIHN0eWxlIGZvciBsb25nIChtdWx0aS1saW5lKQogY29tbWVudHMgaXMgYSBsaXR0bGUgZGlmZmVyZW50LgogCisuLiBjb2RlLWJsb2NrOjogYworCiAJLyogVGhlIHByZWZlcnJlZCBjb21tZW50IHN0eWxlIGZvciBmaWxlcyBpbiBuZXQvIGFuZCBkcml2ZXJzL25ldAogCSAqIGxvb2tzIGxpa2UgdGhpcy4KIAkgKgpAQCAtNDkxLDEwICs1NTksMTEgQEAKIGl0ZW0sIGV4cGxhaW5pbmcgaXRzIHVzZS4KIAogCi0JCUNoYXB0ZXIgOTogWW91J3ZlIG1hZGUgYSBtZXNzIG9mIGl0Cis5KSBZb3UndmUgbWFkZSBhIG1lc3Mgb2YgaXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBUaGF0J3MgT0ssIHdlIGFsbCBkby4gIFlvdSd2ZSBwcm9iYWJseSBiZWVuIHRvbGQgYnkgeW91ciBsb25nLXRpbWUgVW5peAotdXNlciBoZWxwZXIgdGhhdCAiR05VIGVtYWNzIiBhdXRvbWF0aWNhbGx5IGZvcm1hdHMgdGhlIEMgc291cmNlcyBmb3IKK3VzZXIgaGVscGVyIHRoYXQgYGBHTlUgZW1hY3NgYCBhdXRvbWF0aWNhbGx5IGZvcm1hdHMgdGhlIEMgc291cmNlcyBmb3IKIHlvdSwgYW5kIHlvdSd2ZSBub3RpY2VkIHRoYXQgeWVzLCBpdCBkb2VzIGRvIHRoYXQsIGJ1dCB0aGUgZGVmYXVsdHMgaXQKIHVzZXMgYXJlIGxlc3MgdGhhbiBkZXNpcmFibGUgKGluIGZhY3QsIHRoZXkgYXJlIHdvcnNlIHRoYW4gcmFuZG9tCiB0eXBpbmcgLSBhbiBpbmZpbml0ZSBudW1iZXIgb2YgbW9ua2V5cyB0eXBpbmcgaW50byBHTlUgZW1hY3Mgd291bGQgbmV2ZXIKQEAgLTUwMyw2MyArNTcyLDY2IEBACiBTbywgeW91IGNhbiBlaXRoZXIgZ2V0IHJpZCBvZiBHTlUgZW1hY3MsIG9yIGNoYW5nZSBpdCB0byB1c2Ugc2FuZXIKIHZhbHVlcy4gIFRvIGRvIHRoZSBsYXR0ZXIsIHlvdSBjYW4gc3RpY2sgdGhlIGZvbGxvd2luZyBpbiB5b3VyIC5lbWFjcyBmaWxlOgogCi0oZGVmdW4gYy1saW5ldXAtYXJnbGlzdC10YWJzLW9ubHkgKGlnbm9yZWQpCi0gICJMaW5lIHVwIGFyZ3VtZW50IGxpc3RzIGJ5IHRhYnMsIG5vdCBzcGFjZXMiCi0gIChsZXQqICgoYW5jaG9yIChjLWxhbmdlbGVtLXBvcyBjLXN5bnRhY3RpYy1lbGVtZW50KSkKLSAgICAgICAgIChjb2x1bW4gKGMtbGFuZ2VsZW0tMm5kLXBvcyBjLXN5bnRhY3RpYy1lbGVtZW50KSkKLSAgICAgICAgIChvZmZzZXQgKC0gKDErIGNvbHVtbikgYW5jaG9yKSkKLSAgICAgICAgIChzdGVwcyAoZmxvb3Igb2Zmc2V0IGMtYmFzaWMtb2Zmc2V0KSkpCi0gICAgKCogKG1heCBzdGVwcyAxKQotICAgICAgIGMtYmFzaWMtb2Zmc2V0KSkpCisuLiBjb2RlLWJsb2NrOjogbm9uZQogCi0oYWRkLWhvb2sgJ2MtbW9kZS1jb21tb24taG9vawotICAgICAgICAgIChsYW1iZGEgKCkKLSAgICAgICAgICAgIDs7IEFkZCBrZXJuZWwgc3R5bGUKLSAgICAgICAgICAgIChjLWFkZC1zdHlsZQotICAgICAgICAgICAgICJsaW51eC10YWJzLW9ubHkiCi0gICAgICAgICAgICAgJygibGludXgiIChjLW9mZnNldHMtYWxpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgIChhcmdsaXN0LWNvbnQtbm9uZW1wdHkKLSAgICAgICAgICAgICAgICAgICAgICAgICBjLWxpbmV1cC1nY2MtYXNtLXJlZwotICAgICAgICAgICAgICAgICAgICAgICAgIGMtbGluZXVwLWFyZ2xpc3QtdGFicy1vbmx5KSkpKSkpCisgIChkZWZ1biBjLWxpbmV1cC1hcmdsaXN0LXRhYnMtb25seSAoaWdub3JlZCkKKyAgICAiTGluZSB1cCBhcmd1bWVudCBsaXN0cyBieSB0YWJzLCBub3Qgc3BhY2VzIgorICAgIChsZXQqICgoYW5jaG9yIChjLWxhbmdlbGVtLXBvcyBjLXN5bnRhY3RpYy1lbGVtZW50KSkKKyAgICAgICAgICAgKGNvbHVtbiAoYy1sYW5nZWxlbS0ybmQtcG9zIGMtc3ludGFjdGljLWVsZW1lbnQpKQorICAgICAgICAgICAob2Zmc2V0ICgtICgxKyBjb2x1bW4pIGFuY2hvcikpCisgICAgICAgICAgIChzdGVwcyAoZmxvb3Igb2Zmc2V0IGMtYmFzaWMtb2Zmc2V0KSkpCisgICAgICAoKiAobWF4IHN0ZXBzIDEpCisgICAgICAgICBjLWJhc2ljLW9mZnNldCkpKQogCi0oYWRkLWhvb2sgJ2MtbW9kZS1ob29rCi0gICAgICAgICAgKGxhbWJkYSAoKQotICAgICAgICAgICAgKGxldCAoKGZpbGVuYW1lIChidWZmZXItZmlsZS1uYW1lKSkpCi0gICAgICAgICAgICAgIDs7IEVuYWJsZSBrZXJuZWwgbW9kZSBmb3IgdGhlIGFwcHJvcHJpYXRlIGZpbGVzCi0gICAgICAgICAgICAgICh3aGVuIChhbmQgZmlsZW5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nLW1hdGNoIChleHBhbmQtZmlsZS1uYW1lICJ+L3NyYy9saW51eC10cmVlcyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSkpCi0gICAgICAgICAgICAgICAgKHNldHEgaW5kZW50LXRhYnMtbW9kZSB0KQotICAgICAgICAgICAgICAgIChzZXRxIHNob3ctdHJhaWxpbmctd2hpdGVzcGFjZSB0KQotICAgICAgICAgICAgICAgIChjLXNldC1zdHlsZSAibGludXgtdGFicy1vbmx5IikpKSkpCisgIChhZGQtaG9vayAnYy1tb2RlLWNvbW1vbi1ob29rCisgICAgICAgICAgICAobGFtYmRhICgpCisgICAgICAgICAgICAgIDs7IEFkZCBrZXJuZWwgc3R5bGUKKyAgICAgICAgICAgICAgKGMtYWRkLXN0eWxlCisgICAgICAgICAgICAgICAibGludXgtdGFicy1vbmx5IgorICAgICAgICAgICAgICAgJygibGludXgiIChjLW9mZnNldHMtYWxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGFyZ2xpc3QtY29udC1ub25lbXB0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYy1saW5ldXAtZ2NjLWFzbS1yZWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtbGluZXVwLWFyZ2xpc3QtdGFicy1vbmx5KSkpKSkpCisKKyAgKGFkZC1ob29rICdjLW1vZGUtaG9vaworICAgICAgICAgICAgKGxhbWJkYSAoKQorICAgICAgICAgICAgICAobGV0ICgoZmlsZW5hbWUgKGJ1ZmZlci1maWxlLW5hbWUpKSkKKyAgICAgICAgICAgICAgICA7OyBFbmFibGUga2VybmVsIG1vZGUgZm9yIHRoZSBhcHByb3ByaWF0ZSBmaWxlcworICAgICAgICAgICAgICAgICh3aGVuIChhbmQgZmlsZW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmctbWF0Y2ggKGV4cGFuZC1maWxlLW5hbWUgIn4vc3JjL2xpbnV4LXRyZWVzIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUpKQorICAgICAgICAgICAgICAgICAgKHNldHEgaW5kZW50LXRhYnMtbW9kZSB0KQorICAgICAgICAgICAgICAgICAgKHNldHEgc2hvdy10cmFpbGluZy13aGl0ZXNwYWNlIHQpCisgICAgICAgICAgICAgICAgICAoYy1zZXQtc3R5bGUgImxpbnV4LXRhYnMtb25seSIpKSkpKQogCiBUaGlzIHdpbGwgbWFrZSBlbWFjcyBnbyBiZXR0ZXIgd2l0aCB0aGUga2VybmVsIGNvZGluZyBzdHlsZSBmb3IgQwotZmlsZXMgYmVsb3cgfi9zcmMvbGludXgtdHJlZXMuCitmaWxlcyBiZWxvdyBgYH4vc3JjL2xpbnV4LXRyZWVzYGAuCiAKIEJ1dCBldmVuIGlmIHlvdSBmYWlsIGluIGdldHRpbmcgZW1hY3MgdG8gZG8gc2FuZSBmb3JtYXR0aW5nLCBub3QKLWV2ZXJ5dGhpbmcgaXMgbG9zdDogdXNlICJpbmRlbnQiLgorZXZlcnl0aGluZyBpcyBsb3N0OiB1c2UgYGBpbmRlbnRgYC4KIAogTm93LCBhZ2FpbiwgR05VIGluZGVudCBoYXMgdGhlIHNhbWUgYnJhaW4tZGVhZCBzZXR0aW5ncyB0aGF0IEdOVSBlbWFjcwogaGFzLCB3aGljaCBpcyB3aHkgeW91IG5lZWQgdG8gZ2l2ZSBpdCBhIGZldyBjb21tYW5kIGxpbmUgb3B0aW9ucy4KIEhvd2V2ZXIsIHRoYXQncyBub3QgdG9vIGJhZCwgYmVjYXVzZSBldmVuIHRoZSBtYWtlcnMgb2YgR05VIGluZGVudAogcmVjb2duaXplIHRoZSBhdXRob3JpdHkgb2YgSyZSICh0aGUgR05VIHBlb3BsZSBhcmVuJ3QgZXZpbCwgdGhleSBhcmUKIGp1c3Qgc2V2ZXJlbHkgbWlzZ3VpZGVkIGluIHRoaXMgbWF0dGVyKSwgc28geW91IGp1c3QgZ2l2ZSBpbmRlbnQgdGhlCi1vcHRpb25zICIta3IgLWk4IiAoc3RhbmRzIGZvciAiSyZSLCA4IGNoYXJhY3RlciBpbmRlbnRzIiksIG9yIHVzZQotInNjcmlwdHMvTGluZGVudCIsIHdoaWNoIGluZGVudHMgaW4gdGhlIGxhdGVzdCBzdHlsZS4KK29wdGlvbnMgYGAta3IgLWk4YGAgKHN0YW5kcyBmb3IgYGBLJlIsIDggY2hhcmFjdGVyIGluZGVudHNgYCksIG9yIHVzZQorYGBzY3JpcHRzL0xpbmRlbnRgYCwgd2hpY2ggaW5kZW50cyBpbiB0aGUgbGF0ZXN0IHN0eWxlLgogCi0iaW5kZW50IiBoYXMgYSBsb3Qgb2Ygb3B0aW9ucywgYW5kIGVzcGVjaWFsbHkgd2hlbiBpdCBjb21lcyB0byBjb21tZW50CitgYGluZGVudGBgIGhhcyBhIGxvdCBvZiBvcHRpb25zLCBhbmQgZXNwZWNpYWxseSB3aGVuIGl0IGNvbWVzIHRvIGNvbW1lbnQKIHJlLWZvcm1hdHRpbmcgeW91IG1heSB3YW50IHRvIHRha2UgYSBsb29rIGF0IHRoZSBtYW4gcGFnZS4gIEJ1dAotcmVtZW1iZXI6ICJpbmRlbnQiIGlzIG5vdCBhIGZpeCBmb3IgYmFkIHByb2dyYW1taW5nLgorcmVtZW1iZXI6IGBgaW5kZW50YGAgaXMgbm90IGEgZml4IGZvciBiYWQgcHJvZ3JhbW1pbmcuCiAKIAotCQlDaGFwdGVyIDEwOiBLY29uZmlnIGNvbmZpZ3VyYXRpb24gZmlsZXMKKzEwKSBLY29uZmlnIGNvbmZpZ3VyYXRpb24gZmlsZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogRm9yIGFsbCBvZiB0aGUgS2NvbmZpZyogY29uZmlndXJhdGlvbiBmaWxlcyB0aHJvdWdob3V0IHRoZSBzb3VyY2UgdHJlZSwKLXRoZSBpbmRlbnRhdGlvbiBpcyBzb21ld2hhdCBkaWZmZXJlbnQuICBMaW5lcyB1bmRlciBhICJjb25maWciIGRlZmluaXRpb24KK3RoZSBpbmRlbnRhdGlvbiBpcyBzb21ld2hhdCBkaWZmZXJlbnQuICBMaW5lcyB1bmRlciBhIGBgY29uZmlnYGAgZGVmaW5pdGlvbgogYXJlIGluZGVudGVkIHdpdGggb25lIHRhYiwgd2hpbGUgaGVscCB0ZXh0IGlzIGluZGVudGVkIGFuIGFkZGl0aW9uYWwgdHdvCi1zcGFjZXMuICBFeGFtcGxlOgorc3BhY2VzLiAgRXhhbXBsZTo6CiAKLWNvbmZpZyBBVURJVAorICBjb25maWcgQVVESVQKIAlib29sICJBdWRpdGluZyBzdXBwb3J0IgogCWRlcGVuZHMgb24gTkVUCiAJaGVscApAQCAtNTY5LDkgKzY0MSw5IEBACiAJICBhdWRpdGluZyB3aXRob3V0IENPTkZJR19BVURJVFNZU0NBTEwuCiAKIFNlcmlvdXNseSBkYW5nZXJvdXMgZmVhdHVyZXMgKHN1Y2ggYXMgd3JpdGUgc3VwcG9ydCBmb3IgY2VydGFpbgotZmlsZXN5c3RlbXMpIHNob3VsZCBhZHZlcnRpc2UgdGhpcyBwcm9taW5lbnRseSBpbiB0aGVpciBwcm9tcHQgc3RyaW5nOgorZmlsZXN5c3RlbXMpIHNob3VsZCBhZHZlcnRpc2UgdGhpcyBwcm9taW5lbnRseSBpbiB0aGVpciBwcm9tcHQgc3RyaW5nOjoKIAotY29uZmlnIEFERlNfRlNfUlcKKyAgY29uZmlnIEFERlNfRlNfUlcKIAlib29sICJBREZTIHdyaXRlIHN1cHBvcnQgKERBTkdFUk9VUykiCiAJZGVwZW5kcyBvbiBBREZTX0ZTCiAJLi4uCkBAIC01ODAsNDEgKzY1Miw0NSBAQAogRG9jdW1lbnRhdGlvbi9rYnVpbGQva2NvbmZpZy1sYW5ndWFnZS50eHQuCiAKIAotCQlDaGFwdGVyIDExOiBEYXRhIHN0cnVjdHVyZXMKKzExKSBEYXRhIHN0cnVjdHVyZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KIAogRGF0YSBzdHJ1Y3R1cmVzIHRoYXQgaGF2ZSB2aXNpYmlsaXR5IG91dHNpZGUgdGhlIHNpbmdsZS10aHJlYWRlZAogZW52aXJvbm1lbnQgdGhleSBhcmUgY3JlYXRlZCBhbmQgZGVzdHJveWVkIGluIHNob3VsZCBhbHdheXMgaGF2ZQogcmVmZXJlbmNlIGNvdW50cy4gIEluIHRoZSBrZXJuZWwsIGdhcmJhZ2UgY29sbGVjdGlvbiBkb2Vzbid0IGV4aXN0IChhbmQKIG91dHNpZGUgdGhlIGtlcm5lbCBnYXJiYWdlIGNvbGxlY3Rpb24gaXMgc2xvdyBhbmQgaW5lZmZpY2llbnQpLCB3aGljaAotbWVhbnMgdGhhdCB5b3UgYWJzb2x1dGVseSBfaGF2ZV8gdG8gcmVmZXJlbmNlIGNvdW50IGFsbCB5b3VyIHVzZXMuCittZWFucyB0aGF0IHlvdSBhYnNvbHV0ZWx5ICoqaGF2ZSoqIHRvIHJlZmVyZW5jZSBjb3VudCBhbGwgeW91ciB1c2VzLgogCiBSZWZlcmVuY2UgY291bnRpbmcgbWVhbnMgdGhhdCB5b3UgY2FuIGF2b2lkIGxvY2tpbmcsIGFuZCBhbGxvd3MgbXVsdGlwbGUKIHVzZXJzIHRvIGhhdmUgYWNjZXNzIHRvIHRoZSBkYXRhIHN0cnVjdHVyZSBpbiBwYXJhbGxlbCAtIGFuZCBub3QgaGF2aW5nCiB0byB3b3JyeSBhYm91dCB0aGUgc3RydWN0dXJlIHN1ZGRlbmx5IGdvaW5nIGF3YXkgZnJvbSB1bmRlciB0aGVtIGp1c3QKIGJlY2F1c2UgdGhleSBzbGVwdCBvciBkaWQgc29tZXRoaW5nIGVsc2UgZm9yIGEgd2hpbGUuCiAKLU5vdGUgdGhhdCBsb2NraW5nIGlzIF9ub3RfIGEgcmVwbGFjZW1lbnQgZm9yIHJlZmVyZW5jZSBjb3VudGluZy4KK05vdGUgdGhhdCBsb2NraW5nIGlzICoqbm90KiogYSByZXBsYWNlbWVudCBmb3IgcmVmZXJlbmNlIGNvdW50aW5nLgogTG9ja2luZyBpcyB1c2VkIHRvIGtlZXAgZGF0YSBzdHJ1Y3R1cmVzIGNvaGVyZW50LCB3aGlsZSByZWZlcmVuY2UKIGNvdW50aW5nIGlzIGEgbWVtb3J5IG1hbmFnZW1lbnQgdGVjaG5pcXVlLiAgVXN1YWxseSBib3RoIGFyZSBuZWVkZWQsIGFuZAogdGhleSBhcmUgbm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggZWFjaCBvdGhlci4KIAogTWFueSBkYXRhIHN0cnVjdHVyZXMgY2FuIGluZGVlZCBoYXZlIHR3byBsZXZlbHMgb2YgcmVmZXJlbmNlIGNvdW50aW5nLAotd2hlbiB0aGVyZSBhcmUgdXNlcnMgb2YgZGlmZmVyZW50ICJjbGFzc2VzIi4gIFRoZSBzdWJjbGFzcyBjb3VudCBjb3VudHMKK3doZW4gdGhlcmUgYXJlIHVzZXJzIG9mIGRpZmZlcmVudCBgYGNsYXNzZXNgYC4gIFRoZSBzdWJjbGFzcyBjb3VudCBjb3VudHMKIHRoZSBudW1iZXIgb2Ygc3ViY2xhc3MgdXNlcnMsIGFuZCBkZWNyZW1lbnRzIHRoZSBnbG9iYWwgY291bnQganVzdCBvbmNlCiB3aGVuIHRoZSBzdWJjbGFzcyBjb3VudCBnb2VzIHRvIHplcm8uCiAKLUV4YW1wbGVzIG9mIHRoaXMga2luZCBvZiAibXVsdGktbGV2ZWwtcmVmZXJlbmNlLWNvdW50aW5nIiBjYW4gYmUgZm91bmQgaW4KLW1lbW9yeSBtYW5hZ2VtZW50ICgic3RydWN0IG1tX3N0cnVjdCI6IG1tX3VzZXJzIGFuZCBtbV9jb3VudCksIGFuZCBpbgotZmlsZXN5c3RlbSBjb2RlICgic3RydWN0IHN1cGVyX2Jsb2NrIjogc19jb3VudCBhbmQgc19hY3RpdmUpLgorRXhhbXBsZXMgb2YgdGhpcyBraW5kIG9mIGBgbXVsdGktbGV2ZWwtcmVmZXJlbmNlLWNvdW50aW5nYGAgY2FuIGJlIGZvdW5kIGluCittZW1vcnkgbWFuYWdlbWVudCAoYGBzdHJ1Y3QgbW1fc3RydWN0YGA6IG1tX3VzZXJzIGFuZCBtbV9jb3VudCksIGFuZCBpbgorZmlsZXN5c3RlbSBjb2RlIChgYHN0cnVjdCBzdXBlcl9ibG9ja2BgOiBzX2NvdW50IGFuZCBzX2FjdGl2ZSkuCiAKIFJlbWVtYmVyOiBpZiBhbm90aGVyIHRocmVhZCBjYW4gZmluZCB5b3VyIGRhdGEgc3RydWN0dXJlLCBhbmQgeW91IGRvbid0CiBoYXZlIGEgcmVmZXJlbmNlIGNvdW50IG9uIGl0LCB5b3UgYWxtb3N0IGNlcnRhaW5seSBoYXZlIGEgYnVnLgogCiAKLQkJQ2hhcHRlciAxMjogTWFjcm9zLCBFbnVtcyBhbmQgUlRMCisxMikgTWFjcm9zLCBFbnVtcyBhbmQgUlRMCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIE5hbWVzIG9mIG1hY3JvcyBkZWZpbmluZyBjb25zdGFudHMgYW5kIGxhYmVscyBpbiBlbnVtcyBhcmUgY2FwaXRhbGl6ZWQuCiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAkjZGVmaW5lIENPTlNUQU5UIDB4MTIzNDUKIAogRW51bXMgYXJlIHByZWZlcnJlZCB3aGVuIGRlZmluaW5nIHNldmVyYWwgcmVsYXRlZCBjb25zdGFudHMuCkBAIC02MjYsNyArNzAyLDkgQEAKIAogTWFjcm9zIHdpdGggbXVsdGlwbGUgc3RhdGVtZW50cyBzaG91bGQgYmUgZW5jbG9zZWQgaW4gYSBkbyAtIHdoaWxlIGJsb2NrOgogCi0JI2RlZmluZSBtYWNyb2Z1bihhLCBiLCBjKSAJCQlcCisuLiBjb2RlLWJsb2NrOjogYworCisJI2RlZmluZSBtYWNyb2Z1bihhLCBiLCBjKQkJCVwKIAkJZG8gewkJCQkJXAogCQkJaWYgKGEgPT0gNSkJCQlcCiAJCQkJZG9fdGhpcyhiLCBjKTsJCVwKQEAgLTYzNiwxNyArNzE0LDIxIEBACiAKIDEpIG1hY3JvcyB0aGF0IGFmZmVjdCBjb250cm9sIGZsb3c6CiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAkjZGVmaW5lIEZPTyh4KQkJCQkJXAogCQlkbyB7CQkJCQlcCiAJCQlpZiAoYmxhaCh4KSA8IDApCQlcCiAJCQkJcmV0dXJuIC1FQlVHR0VSRUQ7CVwKIAkJfSB3aGlsZSAoMCkKIAotaXMgYSBfdmVyeV8gYmFkIGlkZWEuICBJdCBsb29rcyBsaWtlIGEgZnVuY3Rpb24gY2FsbCBidXQgZXhpdHMgdGhlICJjYWxsaW5nIgoraXMgYSAqKnZlcnkqKiBiYWQgaWRlYS4gIEl0IGxvb2tzIGxpa2UgYSBmdW5jdGlvbiBjYWxsIGJ1dCBleGl0cyB0aGUgYGBjYWxsaW5nYGAKIGZ1bmN0aW9uOyBkb24ndCBicmVhayB0aGUgaW50ZXJuYWwgcGFyc2VycyBvZiB0aG9zZSB3aG8gd2lsbCByZWFkIHRoZSBjb2RlLgogCiAyKSBtYWNyb3MgdGhhdCBkZXBlbmQgb24gaGF2aW5nIGEgbG9jYWwgdmFyaWFibGUgd2l0aCBhIG1hZ2ljIG5hbWU6CiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAkjZGVmaW5lIEZPTyh2YWwpIGJhcihpbmRleCwgdmFsKQogCiBtaWdodCBsb29rIGxpa2UgYSBnb29kIHRoaW5nLCBidXQgaXQncyBjb25mdXNpbmcgYXMgaGVsbCB3aGVuIG9uZSByZWFkcyB0aGUKQEAgLTY1OSwxOCArNzQxLDIyIEBACiBtdXN0IGVuY2xvc2UgdGhlIGV4cHJlc3Npb24gaW4gcGFyZW50aGVzZXMuIEJld2FyZSBvZiBzaW1pbGFyIGlzc3VlcyB3aXRoCiBtYWNyb3MgdXNpbmcgcGFyYW1ldGVycy4KIAorLi4gY29kZS1ibG9jazo6IGMKKwogCSNkZWZpbmUgQ09OU1RBTlQgMHg0MDAwCiAJI2RlZmluZSBDT05TVEVYUCAoQ09OU1RBTlQgfCAzKQogCiA1KSBuYW1lc3BhY2UgY29sbGlzaW9ucyB3aGVuIGRlZmluaW5nIGxvY2FsIHZhcmlhYmxlcyBpbiBtYWNyb3MgcmVzZW1ibGluZwogZnVuY3Rpb25zOgogCi0jZGVmaW5lIEZPTyh4KQkJCQlcCi0oewkJCQkJXAotCXR5cGVvZih4KSByZXQ7CQkJXAotCXJldCA9IGNhbGNfcmV0KHgpOwkJXAotCShyZXQpOwkJCQlcCi19KQorLi4gY29kZS1ibG9jazo6IGMKKworCSNkZWZpbmUgRk9PKHgpCQkJCVwKKwkoewkJCQkJXAorCQl0eXBlb2YoeCkgcmV0OwkJCVwKKwkJcmV0ID0gY2FsY19yZXQoeCk7CQlcCisJCShyZXQpOwkJCQlcCisJfSkKIAogcmV0IGlzIGEgY29tbW9uIG5hbWUgZm9yIGEgbG9jYWwgdmFyaWFibGUgLSBfX2Zvb19yZXQgaXMgbGVzcyBsaWtlbHkKIHRvIGNvbGxpZGUgd2l0aCBhbiBleGlzdGluZyB2YXJpYWJsZS4KQEAgLTY3OSwxMSArNzY1LDEyIEBACiBjb3ZlcnMgUlRMIHdoaWNoIGlzIHVzZWQgZnJlcXVlbnRseSB3aXRoIGFzc2VtYmx5IGxhbmd1YWdlIGluIHRoZSBrZXJuZWwuCiAKIAotCQlDaGFwdGVyIDEzOiBQcmludGluZyBrZXJuZWwgbWVzc2FnZXMKKzEzKSBQcmludGluZyBrZXJuZWwgbWVzc2FnZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogS2VybmVsIGRldmVsb3BlcnMgbGlrZSB0byBiZSBzZWVuIGFzIGxpdGVyYXRlLiBEbyBtaW5kIHRoZSBzcGVsbGluZwogb2Yga2VybmVsIG1lc3NhZ2VzIHRvIG1ha2UgYSBnb29kIGltcHJlc3Npb24uIERvIG5vdCB1c2UgY3JpcHBsZWQKLXdvcmRzIGxpa2UgImRvbnQiOyB1c2UgImRvIG5vdCIgb3IgImRvbid0IiBpbnN0ZWFkLiAgTWFrZSB0aGUgbWVzc2FnZXMKK3dvcmRzIGxpa2UgYGBkb250YGA7IHVzZSBgYGRvIG5vdGBgIG9yIGBgZG9uJ3RgYCBpbnN0ZWFkLiAgTWFrZSB0aGUgbWVzc2FnZXMKIGNvbmNpc2UsIGNsZWFyLCBhbmQgdW5hbWJpZ3VvdXMuCiAKIEtlcm5lbCBtZXNzYWdlcyBkbyBub3QgaGF2ZSB0byBiZSB0ZXJtaW5hdGVkIHdpdGggYSBwZXJpb2QuCkBAIC03MTMsNyArODAwLDggQEAKIHVzZWQuCiAKIAotCQlDaGFwdGVyIDE0OiBBbGxvY2F0aW5nIG1lbW9yeQorMTQpIEFsbG9jYXRpbmcgbWVtb3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogVGhlIGtlcm5lbCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGdlbmVyYWwgcHVycG9zZSBtZW1vcnkgYWxsb2NhdG9yczoKIGttYWxsb2MoKSwga3phbGxvYygpLCBrbWFsbG9jX2FycmF5KCksIGtjYWxsb2MoKSwgdm1hbGxvYygpLCBhbmQKQEAgLTcyMiw2ICs4MTAsOCBAQAogCiBUaGUgcHJlZmVycmVkIGZvcm0gZm9yIHBhc3NpbmcgYSBzaXplIG9mIGEgc3RydWN0IGlzIHRoZSBmb2xsb3dpbmc6CiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAlwID0ga21hbGxvYyhzaXplb2YoKnApLCAuLi4pOwogCiBUaGUgYWx0ZXJuYXRpdmUgZm9ybSB3aGVyZSBzdHJ1Y3QgbmFtZSBpcyBzcGVsbGVkIG91dCBodXJ0cyByZWFkYWJpbGl0eSBhbmQKQEAgLTczNCwyMCArODI0LDI1IEBACiAKIFRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgYWxsb2NhdGluZyBhbiBhcnJheSBpcyB0aGUgZm9sbG93aW5nOgogCisuLiBjb2RlLWJsb2NrOjogYworCiAJcCA9IGttYWxsb2NfYXJyYXkobiwgc2l6ZW9mKC4uLiksIC4uLik7CiAKIFRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgYWxsb2NhdGluZyBhIHplcm9lZCBhcnJheSBpcyB0aGUgZm9sbG93aW5nOgogCisuLiBjb2RlLWJsb2NrOjogYworCiAJcCA9IGtjYWxsb2Mobiwgc2l6ZW9mKC4uLiksIC4uLik7CiAKIEJvdGggZm9ybXMgY2hlY2sgZm9yIG92ZXJmbG93IG9uIHRoZSBhbGxvY2F0aW9uIHNpemUgbiAqIHNpemVvZiguLi4pLAogYW5kIHJldHVybiBOVUxMIGlmIHRoYXQgb2NjdXJyZWQuCiAKIAotCQlDaGFwdGVyIDE1OiBUaGUgaW5saW5lIGRpc2Vhc2UKKzE1KSBUaGUgaW5saW5lIGRpc2Vhc2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogVGhlcmUgYXBwZWFycyB0byBiZSBhIGNvbW1vbiBtaXNwZXJjZXB0aW9uIHRoYXQgZ2NjIGhhcyBhIG1hZ2ljICJtYWtlIG1lCi1mYXN0ZXIiIHNwZWVkdXAgb3B0aW9uIGNhbGxlZCAiaW5saW5lIi4gV2hpbGUgdGhlIHVzZSBvZiBpbmxpbmVzIGNhbiBiZQorZmFzdGVyIiBzcGVlZHVwIG9wdGlvbiBjYWxsZWQgYGBpbmxpbmVgYC4gV2hpbGUgdGhlIHVzZSBvZiBpbmxpbmVzIGNhbiBiZQogYXBwcm9wcmlhdGUgKGZvciBleGFtcGxlIGFzIGEgbWVhbnMgb2YgcmVwbGFjaW5nIG1hY3Jvcywgc2VlIENoYXB0ZXIgMTIpLCBpdAogdmVyeSBvZnRlbiBpcyBub3QuIEFidW5kYW50IHVzZSBvZiB0aGUgaW5saW5lIGtleXdvcmQgbGVhZHMgdG8gYSBtdWNoIGJpZ2dlcgoga2VybmVsLCB3aGljaCBpbiB0dXJuIHNsb3dzIHRoZSBzeXN0ZW0gYXMgYSB3aG9sZSBkb3duLCBkdWUgdG8gYSBiaWdnZXIKQEAgLTc3MSwyNiArODY2LDI3IEBACiBzb21ldGhpbmcgaXQgd291bGQgaGF2ZSBkb25lIGFueXdheS4KIAogCi0JCUNoYXB0ZXIgMTY6IEZ1bmN0aW9uIHJldHVybiB2YWx1ZXMgYW5kIG5hbWVzCisxNikgRnVuY3Rpb24gcmV0dXJuIHZhbHVlcyBhbmQgbmFtZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBGdW5jdGlvbnMgY2FuIHJldHVybiB2YWx1ZXMgb2YgbWFueSBkaWZmZXJlbnQga2luZHMsIGFuZCBvbmUgb2YgdGhlCiBtb3N0IGNvbW1vbiBpcyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgZnVuY3Rpb24gc3VjY2VlZGVkIG9yCiBmYWlsZWQuICBTdWNoIGEgdmFsdWUgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGFuIGVycm9yLWNvZGUgaW50ZWdlcgotKC1FeHh4ID0gZmFpbHVyZSwgMCA9IHN1Y2Nlc3MpIG9yIGEgInN1Y2NlZWRlZCIgYm9vbGVhbiAoMCA9IGZhaWx1cmUsCisoLUV4eHggPSBmYWlsdXJlLCAwID0gc3VjY2Vzcykgb3IgYSBgYHN1Y2NlZWRlZGBgIGJvb2xlYW4gKDAgPSBmYWlsdXJlLAogbm9uLXplcm8gPSBzdWNjZXNzKS4KIAogTWl4aW5nIHVwIHRoZXNlIHR3byBzb3J0cyBvZiByZXByZXNlbnRhdGlvbnMgaXMgYSBmZXJ0aWxlIHNvdXJjZSBvZgogZGlmZmljdWx0LXRvLWZpbmQgYnVncy4gIElmIHRoZSBDIGxhbmd1YWdlIGluY2x1ZGVkIGEgc3Ryb25nIGRpc3RpbmN0aW9uCiBiZXR3ZWVuIGludGVnZXJzIGFuZCBib29sZWFucyB0aGVuIHRoZSBjb21waWxlciB3b3VsZCBmaW5kIHRoZXNlIG1pc3Rha2VzCiBmb3IgdXMuLi4gYnV0IGl0IGRvZXNuJ3QuICBUbyBoZWxwIHByZXZlbnQgc3VjaCBidWdzLCBhbHdheXMgZm9sbG93IHRoaXMKLWNvbnZlbnRpb246Citjb252ZW50aW9uOjoKIAogCUlmIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gaXMgYW4gYWN0aW9uIG9yIGFuIGltcGVyYXRpdmUgY29tbWFuZCwKIAl0aGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhbiBlcnJvci1jb2RlIGludGVnZXIuICBJZiB0aGUgbmFtZQogCWlzIGEgcHJlZGljYXRlLCB0aGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhICJzdWNjZWVkZWQiIGJvb2xlYW4uCiAKLUZvciBleGFtcGxlLCAiYWRkIHdvcmsiIGlzIGEgY29tbWFuZCwgYW5kIHRoZSBhZGRfd29yaygpIGZ1bmN0aW9uIHJldHVybnMgMAotZm9yIHN1Y2Nlc3Mgb3IgLUVCVVNZIGZvciBmYWlsdXJlLiAgSW4gdGhlIHNhbWUgd2F5LCAiUENJIGRldmljZSBwcmVzZW50IiBpcworRm9yIGV4YW1wbGUsIGBgYWRkIHdvcmtgYCBpcyBhIGNvbW1hbmQsIGFuZCB0aGUgYWRkX3dvcmsoKSBmdW5jdGlvbiByZXR1cm5zIDAKK2ZvciBzdWNjZXNzIG9yIC1FQlVTWSBmb3IgZmFpbHVyZS4gIEluIHRoZSBzYW1lIHdheSwgYGBQQ0kgZGV2aWNlIHByZXNlbnRgYCBpcwogYSBwcmVkaWNhdGUsIGFuZCB0aGUgcGNpX2Rldl9wcmVzZW50KCkgZnVuY3Rpb24gcmV0dXJucyAxIGlmIGl0IHN1Y2NlZWRzIGluCiBmaW5kaW5nIGEgbWF0Y2hpbmcgZGV2aWNlIG9yIDAgaWYgaXQgZG9lc24ndC4KIApAQCAtODA1LDE3ICs5MDEsMjIgQEAKIE5VTEwgb3IgdGhlIEVSUl9QVFIgbWVjaGFuaXNtIHRvIHJlcG9ydCBmYWlsdXJlLgogCiAKLQkJQ2hhcHRlciAxNzogIERvbid0IHJlLWludmVudCB0aGUga2VybmVsIG1hY3JvcworMTcpIERvbid0IHJlLWludmVudCB0aGUga2VybmVsIG1hY3JvcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBUaGUgaGVhZGVyIGZpbGUgaW5jbHVkZS9saW51eC9rZXJuZWwuaCBjb250YWlucyBhIG51bWJlciBvZiBtYWNyb3MgdGhhdAogeW91IHNob3VsZCB1c2UsIHJhdGhlciB0aGFuIGV4cGxpY2l0bHkgY29kaW5nIHNvbWUgdmFyaWFudCBvZiB0aGVtIHlvdXJzZWxmLgogRm9yIGV4YW1wbGUsIGlmIHlvdSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIGFuIGFycmF5LCB0YWtlIGFkdmFudGFnZQogb2YgdGhlIG1hY3JvCiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAkjZGVmaW5lIEFSUkFZX1NJWkUoeCkgKHNpemVvZih4KSAvIHNpemVvZigoeClbMF0pKQogCiBTaW1pbGFybHksIGlmIHlvdSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiBzb21lIHN0cnVjdHVyZSBtZW1iZXIsIHVzZQogCisuLiBjb2RlLWJsb2NrOjogYworCiAJI2RlZmluZSBGSUVMRF9TSVpFT0YodCwgZikgKHNpemVvZigoKHQqKTApLT5mKSkKIAogVGhlcmUgYXJlIGFsc28gbWluKCkgYW5kIG1heCgpIG1hY3JvcyB0aGF0IGRvIHN0cmljdCB0eXBlIGNoZWNraW5nIGlmIHlvdQpAQCAtODIzLDE2ICs5MjQsMjEgQEAKIGRlZmluZWQgdGhhdCB5b3Ugc2hvdWxkbid0IHJlcHJvZHVjZSBpbiB5b3VyIGNvZGUuCiAKIAotCQlDaGFwdGVyIDE4OiAgRWRpdG9yIG1vZGVsaW5lcyBhbmQgb3RoZXIgY3J1ZnQKKzE4KSBFZGl0b3IgbW9kZWxpbmVzIGFuZCBvdGhlciBjcnVmdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFNvbWUgZWRpdG9ycyBjYW4gaW50ZXJwcmV0IGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZW1iZWRkZWQgaW4gc291cmNlIGZpbGVzLAogaW5kaWNhdGVkIHdpdGggc3BlY2lhbCBtYXJrZXJzLiAgRm9yIGV4YW1wbGUsIGVtYWNzIGludGVycHJldHMgbGluZXMgbWFya2VkCiBsaWtlIHRoaXM6CiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAktKi0gbW9kZTogYyAtKi0KIAogT3IgbGlrZSB0aGlzOgogCisuLiBjb2RlLWJsb2NrOjogYworCiAJLyoKIAlMb2NhbCBWYXJpYWJsZXM6CiAJY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETUFHSUNfREVCVUdfRkxBRyBmb28uYyIKQEAgLTg0MSw2ICs5NDcsOCBAQAogCiBWaW0gaW50ZXJwcmV0cyBtYXJrZXJzIHRoYXQgbG9vayBsaWtlIHRoaXM6CiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAkvKiB2aW06c2V0IHN3PTggbm9ldCAqLwogCiBEbyBub3QgaW5jbHVkZSBhbnkgb2YgdGhlc2UgaW4gc291cmNlIGZpbGVzLiAgUGVvcGxlIGhhdmUgdGhlaXIgb3duIHBlcnNvbmFsCkBAIC04NTAsNyArOTU4LDggQEAKIHdvcmsgY29ycmVjdGx5LgogCiAKLQkJQ2hhcHRlciAxOTogIElubGluZSBhc3NlbWJseQorMTkpIElubGluZSBhc3NlbWJseQorLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBJbiBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgY29kZSwgeW91IG1heSBuZWVkIHRvIHVzZSBpbmxpbmUgYXNzZW1ibHkgdG8gaW50ZXJmYWNlCiB3aXRoIENQVSBvciBwbGF0Zm9ybSBmdW5jdGlvbmFsaXR5LiAgRG9uJ3QgaGVzaXRhdGUgdG8gZG8gc28gd2hlbiBuZWNlc3NhcnkuCkBAIC04NjMsNyArOTcyLDcgQEAKIAogTGFyZ2UsIG5vbi10cml2aWFsIGFzc2VtYmx5IGZ1bmN0aW9ucyBzaG91bGQgZ28gaW4gLlMgZmlsZXMsIHdpdGggY29ycmVzcG9uZGluZwogQyBwcm90b3R5cGVzIGRlZmluZWQgaW4gQyBoZWFkZXIgZmlsZXMuICBUaGUgQyBwcm90b3R5cGVzIGZvciBhc3NlbWJseQotZnVuY3Rpb25zIHNob3VsZCB1c2UgImFzbWxpbmthZ2UiLgorZnVuY3Rpb25zIHNob3VsZCB1c2UgYGBhc21saW5rYWdlYGAuCiAKIFlvdSBtYXkgbmVlZCB0byBtYXJrIHlvdXIgYXNtIHN0YXRlbWVudCBhcyB2b2xhdGlsZSwgdG8gcHJldmVudCBHQ0MgZnJvbQogcmVtb3ZpbmcgaXQgaWYgR0NDIGRvZXNuJ3Qgbm90aWNlIGFueSBzaWRlIGVmZmVjdHMuICBZb3UgZG9uJ3QgYWx3YXlzIG5lZWQgdG8KQEAgLTg3NCwxMiArOTgzLDE1IEBACiBzdHJpbmcsIGFuZCBlbmQgZWFjaCBzdHJpbmcgZXhjZXB0IHRoZSBsYXN0IHdpdGggXG5cdCB0byBwcm9wZXJseSBpbmRlbnQgdGhlCiBuZXh0IGluc3RydWN0aW9uIGluIHRoZSBhc3NlbWJseSBvdXRwdXQ6CiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAlhc20gKCJtYWdpYyAlcmVnMSwgIzQyXG5cdCIKIAkgICAgICJtb3JlX21hZ2ljICVyZWcyLCAlcmVnMyIKIAkgICAgIDogLyogb3V0cHV0cyAqLyA6IC8qIGlucHV0cyAqLyA6IC8qIGNsb2JiZXJzICovKTsKIAogCi0JCUNoYXB0ZXIgMjA6IENvbmRpdGlvbmFsIENvbXBpbGF0aW9uCisyMCkgQ29uZGl0aW9uYWwgQ29tcGlsYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBXaGVyZXZlciBwb3NzaWJsZSwgZG9uJ3QgdXNlIHByZXByb2Nlc3NvciBjb25kaXRpb25hbHMgKCNpZiwgI2lmZGVmKSBpbiAuYwogZmlsZXM7IGRvaW5nIHNvIG1ha2VzIGNvZGUgaGFyZGVyIHRvIHJlYWQgYW5kIGxvZ2ljIGhhcmRlciB0byBmb2xsb3cuICBJbnN0ZWFkLApAQCAtOTAzLDYgKzEwMTUsOCBAQAogV2l0aGluIGNvZGUsIHdoZXJlIHBvc3NpYmxlLCB1c2UgdGhlIElTX0VOQUJMRUQgbWFjcm8gdG8gY29udmVydCBhIEtjb25maWcKIHN5bWJvbCBpbnRvIGEgQyBib29sZWFuIGV4cHJlc3Npb24sIGFuZCB1c2UgaXQgaW4gYSBub3JtYWwgQyBjb25kaXRpb25hbDoKIAorLi4gY29kZS1ibG9jazo6IGMKKwogCWlmIChJU19FTkFCTEVEKENPTkZJR19TT01FVEhJTkcpKSB7CiAJCS4uLgogCX0KQEAgLTkxOCwxMiArMTAzMiwxNSBAQAogcGxhY2UgYSBjb21tZW50IGFmdGVyIHRoZSAjZW5kaWYgb24gdGhlIHNhbWUgbGluZSwgbm90aW5nIHRoZSBjb25kaXRpb25hbAogZXhwcmVzc2lvbiB1c2VkLiAgRm9yIGluc3RhbmNlOgogCisuLiBjb2RlLWJsb2NrOjogYworCiAJI2lmZGVmIENPTkZJR19TT01FVEhJTkcKIAkuLi4KIAkjZW5kaWYgLyogQ09ORklHX1NPTUVUSElORyAqLwogCiAKLQkJQXBwZW5kaXggSTogUmVmZXJlbmNlcworQXBwZW5kaXggSSkgUmVmZXJlbmNlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBUaGUgQyBQcm9ncmFtbWluZyBMYW5ndWFnZSwgU2Vjb25kIEVkaXRpb24KIGJ5IEJyaWFuIFcuIEtlcm5pZ2hhbiBhbmQgRGVubmlzIE0uIFJpdGNoaWUuCkBAIC05NDMsNCArMTA2MCwzIEBACiAKIEtlcm5lbCBDb2RpbmdTdHlsZSwgYnkgZ3JlZ0Brcm9haC5jb20gYXQgT0xTIDIwMDI6CiBodHRwOi8vd3d3Lmtyb2FoLmNvbS9saW51eC90YWxrcy9vbHNfMjAwMl9rZXJuZWxfY29kaW5nc3R5bGVfdGFsay9odG1sLwotCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RNQS1BUEktSE9XVE8udHh0IGIvRG9jdW1lbnRhdGlvbi9ETUEtQVBJLUhPV1RPLnR4dAppbmRleCA3ODEwMjRlLi45NzkyMjhiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RNQS1BUEktSE9XVE8udHh0CisrKyBiL0RvY3VtZW50YXRpb24vRE1BLUFQSS1IT1dUTy50eHQKQEAgLTY5OSw3ICs2OTksNyBAQAogCQlkbWFfYWRkcl90IG1hcHBpbmc7CiAKIAkJbWFwcGluZyA9IGRtYV9tYXBfc2luZ2xlKGNwLT5kZXYsIGJ1ZmZlciwgbGVuLCBETUFfRlJPTV9ERVZJQ0UpOwotCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoY3AtPmRldiwgZG1hX2hhbmRsZSkpIHsKKwkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGNwLT5kZXYsIG1hcHBpbmcpKSB7CiAJCQkvKgogCQkJICogcmVkdWNlIGN1cnJlbnQgRE1BIG1hcHBpbmcgdXNhZ2UsCiAJCQkgKiBkZWxheSBhbmQgdHJ5IGFnYWluIGxhdGVyIG9yCkBAIC05MzEsMTAgKzkzMSw4IEBACiAKIDEpIFN0cnVjdCBzY2F0dGVybGlzdCByZXF1aXJlbWVudHMuCiAKLSAgIERvbid0IGludmVudCB0aGUgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIHN0cnVjdCBzY2F0dGVybGlzdDsganVzdCB1c2UKLSAgIDxhc20tZ2VuZXJpYy9zY2F0dGVybGlzdC5oPi4gWW91IG5lZWQgdG8gZW5hYmxlCi0gICBDT05GSUdfTkVFRF9TR19ETUFfTEVOR1RIIGlmIHRoZSBhcmNoaXRlY3R1cmUgc3VwcG9ydHMgSU9NTVVzCi0gICAoaW5jbHVkaW5nIHNvZnR3YXJlIElPTU1VKS4KKyAgIFlvdSBuZWVkIHRvIGVuYWJsZSBDT05GSUdfTkVFRF9TR19ETUFfTEVOR1RIIGlmIHRoZSBhcmNoaXRlY3R1cmUKKyAgIHN1cHBvcnRzIElPTU1VcyAoaW5jbHVkaW5nIHNvZnR3YXJlIElPTU1VKS4KIAogMikgQVJDSF9ETUFfTUlOQUxJR04KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ETUEtQVBJLnR4dCBiL0RvY3VtZW50YXRpb24vRE1BLUFQSS50eHQKaW5kZXggMWQyNmVlYjYuLjZiMjAxMjggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRE1BLUFQSS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9ETUEtQVBJLnR4dApAQCAtMjc3LDE0ICsyNzcsMjYgQEAKIHJlY29tbWVuZGVkIHRoYXQgeW91IG5ldmVyIHVzZSB0aGVzZSB1bmxlc3MgeW91IHJlYWxseSBrbm93IHdoYXQgdGhlCiBjYWNoZSB3aWR0aCBpcy4KIAorZG1hX2FkZHJfdAorZG1hX21hcF9yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBoeXNfYWRkcl90IHBoeXNfYWRkciwgc2l6ZV90IHNpemUsCisJCSBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsIHVuc2lnbmVkIGxvbmcgYXR0cnMpCisKK3ZvaWQKK2RtYV91bm1hcF9yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgYWRkciwgc2l6ZV90IHNpemUsCisJCSAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwgdW5zaWduZWQgbG9uZyBhdHRycykKKworQVBJIGZvciBtYXBwaW5nIGFuZCB1bm1hcHBpbmcgZm9yIE1NSU8gcmVzb3VyY2VzLiBBbGwgdGhlIG5vdGVzIGFuZAord2FybmluZ3MgZm9yIHRoZSBvdGhlciBtYXBwaW5nIEFQSXMgYXBwbHkgaGVyZS4gVGhlIEFQSSBzaG91bGQgb25seSBiZQordXNlZCB0byBtYXAgZGV2aWNlIE1NSU8gcmVzb3VyY2VzLCBtYXBwaW5nIG9mIFJBTSBpcyBub3QgcGVybWl0dGVkLgorCiBpbnQKIGRtYV9tYXBwaW5nX2Vycm9yKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkcikKIAotSW4gc29tZSBjaXJjdW1zdGFuY2VzIGRtYV9tYXBfc2luZ2xlKCkgYW5kIGRtYV9tYXBfcGFnZSgpIHdpbGwgZmFpbCB0byBjcmVhdGUKLWEgbWFwcGluZy4gQSBkcml2ZXIgY2FuIGNoZWNrIGZvciB0aGVzZSBlcnJvcnMgYnkgdGVzdGluZyB0aGUgcmV0dXJuZWQKLURNQSBhZGRyZXNzIHdpdGggZG1hX21hcHBpbmdfZXJyb3IoKS4gQSBub24temVybyByZXR1cm4gdmFsdWUgbWVhbnMgdGhlIG1hcHBpbmcKLWNvdWxkIG5vdCBiZSBjcmVhdGVkIGFuZCB0aGUgZHJpdmVyIHNob3VsZCB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiAoZS5nLgotcmVkdWNlIGN1cnJlbnQgRE1BIG1hcHBpbmcgdXNhZ2Ugb3IgZGVsYXkgYW5kIHRyeSBhZ2FpbiBsYXRlcikuCitJbiBzb21lIGNpcmN1bXN0YW5jZXMgZG1hX21hcF9zaW5nbGUoKSwgZG1hX21hcF9wYWdlKCkgYW5kIGRtYV9tYXBfcmVzb3VyY2UoKQord2lsbCBmYWlsIHRvIGNyZWF0ZSBhIG1hcHBpbmcuIEEgZHJpdmVyIGNhbiBjaGVjayBmb3IgdGhlc2UgZXJyb3JzIGJ5IHRlc3RpbmcKK3RoZSByZXR1cm5lZCBETUEgYWRkcmVzcyB3aXRoIGRtYV9tYXBwaW5nX2Vycm9yKCkuIEEgbm9uLXplcm8gcmV0dXJuIHZhbHVlCittZWFucyB0aGUgbWFwcGluZyBjb3VsZCBub3QgYmUgY3JlYXRlZCBhbmQgdGhlIGRyaXZlciBzaG91bGQgdGFrZSBhcHByb3ByaWF0ZQorYWN0aW9uIChlLmcuIHJlZHVjZSBjdXJyZW50IERNQSBtYXBwaW5nIHVzYWdlIG9yIGRlbGF5IGFuZCB0cnkgYWdhaW4gbGF0ZXIpLgogCiAJaW50CiAJZG1hX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svTWFrZWZpbGUgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svTWFrZWZpbGUKaW5kZXggNjQ0NjBhOC4uNzM2ZjU5MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL01ha2VmaWxlCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9NYWtlZmlsZQpAQCAtNiw3ICs2LDcgQEAKICMgVG8gYWRkIGEgbmV3IGJvb2sgdGhlIG9ubHkgc3RlcCByZXF1aXJlZCBpcyB0byBhZGQgdGhlIGJvb2sgdG8gdGhlCiAjIGxpc3Qgb2YgRE9DQk9PS1MuCiAKLURPQ0JPT0tTIDo9IHo4NTMwYm9vay54bWwgZGV2aWNlLWRyaXZlcnMueG1sIFwKK0RPQ0JPT0tTIDo9IHo4NTMwYm9vay54bWwgIFwKIAkgICAga2VybmVsLWhhY2tpbmcueG1sIGtlcm5lbC1sb2NraW5nLnhtbCBkZXZpY2Vpb2Jvb2sueG1sIFwKIAkgICAgd3JpdGluZ191c2JfZHJpdmVyLnhtbCBuZXR3b3JraW5nLnhtbCBcCiAJICAgIGtlcm5lbC1hcGkueG1sIGZpbGVzeXN0ZW1zLnhtbCBsc20ueG1sIHVzYi54bWwga2dkYi54bWwgXApAQCAtMjIsOCArMjIsMTQgQEAKICMgU2tpcCBEb2NCb29rIGJ1aWxkIGlmIHRoZSB1c2VyIGV4cGxpY2l0bHkgcmVxdWVzdGVkIG5vIERPQ0JPT0tTLgogLkRFRkFVTFQ6CiAJQGVjaG8gIiAgU0tJUCAgICBEb2NCb29rICRAIHRhcmdldCAoRE9DQk9PS1M9XCJcIiBzcGVjaWZpZWQpLiIKLQogZWxzZQoraWZuZXEgKCQoU1BISU5YRElSUyksKQorCisjIFNraXAgRG9jQm9vayBidWlsZCBpZiB0aGUgdXNlciBleHBsaWNpdGx5IHJlcXVlc3RlZCBhIHNwaGlueCBkaXIKKy5ERUZBVUxUOgorCUBlY2hvICIgIFNLSVAgICAgRG9jQm9vayAkQCB0YXJnZXQgKFNQSElOWERJUlMgc3BlY2lmaWVkKS4iCitlbHNlCisKIAogIyMjCiAjIFRoZSBidWlsZCBwcm9jZXNzIGlzIGFzIGZvbGxvd3MgKHRhcmdldHMpOgpAQCAtNjYsNiArNzIsNyBAQAogCiAjIG5vLW9wIGZvciB0aGUgRG9jQm9vayB0b29sY2hhaW4KIGVwdWJkb2NzOgorbGF0ZXhkb2NzOgogCiAjIyMKICNFeHRlcm5hbCBwcm9ncmFtcyB1c2VkCkBAIC0yMjEsNiArMjI4LDcgQEAKIAkgICBlY2hvICI8L3Byb2dyYW1saXN0aW5nPiIpICA+ICRACiAKIGVuZGlmICMgRE9DQk9PS1M9IiIKK2VuZGlmICMgU1BISU5ESVI9Li4uCiAKICMjIwogIyBIZWxwIHRhcmdldHMgYXMgdXNlZCBieSB0aGUgdG9wLWxldmVsIG1ha2VmaWxlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZGV2aWNlLWRyaXZlcnMudG1wbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9kZXZpY2UtZHJpdmVycy50bXBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzEwMDMwLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kZXZpY2UtZHJpdmVycy50bXBsCisrKyAvZGV2L251bGwKQEAgLTEsNTIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgYm9vayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMS4yLy9FTiIKLQkiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjEuMi9kb2Nib29reC5kdGQiIFtdPgotCi08Ym9vayBpZD0iTGludXhEcml2ZXJzQVBJIj4KLSA8Ym9va2luZm8+Ci0gIDx0aXRsZT5MaW51eCBEZXZpY2UgRHJpdmVyczwvdGl0bGU+Ci0KLSAgPGxlZ2Fsbm90aWNlPgotICAgPHBhcmE+Ci0gICAgIFRoaXMgZG9jdW1lbnRhdGlvbiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotICAgICBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCi0gICAgIHZlcnNpb24uCi0gICA8L3BhcmE+Ci0KLSAgIDxwYXJhPgotICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCi0gICAgIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLSAgICAgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICAgICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICA8L3BhcmE+Ci0KLSAgIDxwYXJhPgotICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAotICAgICBNQSAwMjExMS0xMzA3IFVTQQotICAgPC9wYXJhPgotCi0gICA8cGFyYT4KLSAgICAgRm9yIG1vcmUgZGV0YWlscyBzZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgc291cmNlCi0gICAgIGRpc3RyaWJ1dGlvbiBvZiBMaW51eC4KLSAgIDwvcGFyYT4KLSAgPC9sZWdhbG5vdGljZT4KLSA8L2Jvb2tpbmZvPgotCi08dG9jPjwvdG9jPgotCi0gIDxjaGFwdGVyIGlkPSJCYXNpY3MiPgotICAgICA8dGl0bGU+RHJpdmVyIEJhc2ljczwvdGl0bGU+Ci0gICAgIDxzZWN0MT48dGl0bGU+RHJpdmVyIEVudHJ5IGFuZCBFeGl0IHBvaW50czwvdGl0bGU+Ci0hSWluY2x1ZGUvbGludXgvaW5pdC5oCi0gICAgIDwvc2VjdDE+Ci0KLSAgICAgPHNlY3QxPjx0aXRsZT5BdG9taWMgYW5kIHBvaW50ZXIgbWFuaXB1bGF0aW9uPC90aXRsZT4KLSFJYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljLmgKLSAgICAgPC9zZWN0MT4KLQotICAgICA8c2VjdDE+PHRpdGxlPkRlbGF5aW5nLCBzY2hlZHVsaW5nLCBhbmQgdGltZXIgcm91dGluZXM8L3RpdGxlPgotIUlpbmNsdWRlL2xpbnV4L3NjaGVkLmgKLSFFa2VybmVsL3NjaGVkL2NvcmUuYwotIUlrZXJuZWwvc2NoZWQvY3B1cHJpLmMKLSFJa2VybmVsL3NjaGVkL2ZhaXIuYwotIUlpbmNsdWRlL2xpbnV4L2NvbXBsZXRpb24uaAotIUVrZXJuZWwvdGltZS90aW1lci5jCi0gICAgIDwvc2VjdDE+Ci0gICAgIDxzZWN0MT48dGl0bGU+V2FpdCBxdWV1ZXMgYW5kIFdha2UgZXZlbnRzPC90aXRsZT4KLSFJaW5jbHVkZS9saW51eC93YWl0LmgKLSFFa2VybmVsL3NjaGVkL3dhaXQuYwotICAgICA8L3NlY3QxPgotICAgICA8c2VjdDE+PHRpdGxlPkhpZ2gtcmVzb2x1dGlvbiB0aW1lcnM8L3RpdGxlPgotIUlpbmNsdWRlL2xpbnV4L2t0aW1lLmgKLSFJaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKLSFFa2VybmVsL3RpbWUvaHJ0aW1lci5jCi0gICAgIDwvc2VjdDE+Ci0gICAgIDxzZWN0MT48dGl0bGU+V29ya3F1ZXVlcyBhbmQgS2V2ZW50czwvdGl0bGU+Ci0hSWluY2x1ZGUvbGludXgvd29ya3F1ZXVlLmgKLSFFa2VybmVsL3dvcmtxdWV1ZS5jCi0gICAgIDwvc2VjdDE+Ci0gICAgIDxzZWN0MT48dGl0bGU+SW50ZXJuYWwgRnVuY3Rpb25zPC90aXRsZT4KLSFJa2VybmVsL2V4aXQuYwotIUlrZXJuZWwvc2lnbmFsLmMKLSFJaW5jbHVkZS9saW51eC9rdGhyZWFkLmgKLSFFa2VybmVsL2t0aHJlYWQuYwotICAgICA8L3NlY3QxPgotCi0gICAgIDxzZWN0MT48dGl0bGU+S2VybmVsIG9iamVjdHMgbWFuaXB1bGF0aW9uPC90aXRsZT4KLTwhLS0KLVghSWluY2x1ZGUvbGludXgva29iamVjdC5oCi0tLT4KLSFFbGliL2tvYmplY3QuYwotICAgICA8L3NlY3QxPgotCi0gICAgIDxzZWN0MT48dGl0bGU+S2VybmVsIHV0aWxpdHkgZnVuY3Rpb25zPC90aXRsZT4KLSFJaW5jbHVkZS9saW51eC9rZXJuZWwuaAotIUVrZXJuZWwvcHJpbnRrL3ByaW50ay5jCi0hRWtlcm5lbC9wYW5pYy5jCi0hRWtlcm5lbC9zeXMuYwotIUVrZXJuZWwvcmN1L3NyY3UuYwotIUVrZXJuZWwvcmN1L3RyZWUuYwotIUVrZXJuZWwvcmN1L3RyZWVfcGx1Z2luLmgKLSFFa2VybmVsL3JjdS91cGRhdGUuYwotICAgICA8L3NlY3QxPgotCi0gICAgIDxzZWN0MT48dGl0bGU+RGV2aWNlIFJlc291cmNlIE1hbmFnZW1lbnQ8L3RpdGxlPgotIUVkcml2ZXJzL2Jhc2UvZGV2cmVzLmMKLSAgICAgPC9zZWN0MT4KLQotICA8L2NoYXB0ZXI+Ci0KLSAgPGNoYXB0ZXIgaWQ9ImRldmRyaXZlcnMiPgotICAgICA8dGl0bGU+RGV2aWNlIGRyaXZlcnMgaW5mcmFzdHJ1Y3R1cmU8L3RpdGxlPgotICAgICA8c2VjdDE+PHRpdGxlPlRoZSBCYXNpYyBEZXZpY2UgRHJpdmVyLU1vZGVsIFN0cnVjdHVyZXMgPC90aXRsZT4KLSFJaW5jbHVkZS9saW51eC9kZXZpY2UuaAotICAgICA8L3NlY3QxPgotICAgICA8c2VjdDE+PHRpdGxlPkRldmljZSBEcml2ZXJzIEJhc2U8L3RpdGxlPgotIUlkcml2ZXJzL2Jhc2UvaW5pdC5jCi0hRWRyaXZlcnMvYmFzZS9kcml2ZXIuYwotIUVkcml2ZXJzL2Jhc2UvY29yZS5jCi0hRWRyaXZlcnMvYmFzZS9zeXNjb3JlLmMKLSFFZHJpdmVycy9iYXNlL2NsYXNzLmMKLSFJZHJpdmVycy9iYXNlL25vZGUuYwotIUVkcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYwotIUVkcml2ZXJzL2Jhc2UvdHJhbnNwb3J0X2NsYXNzLmMKLTwhLS0gQ2Fubm90IGJlIGluY2x1ZGVkLCBiZWNhdXNlCi0gICAgIGF0dHJpYnV0ZV9jb250YWluZXJfYWRkX2NsYXNzX2RldmljZV9hZGFwdGVyCi0gYW5kIGF0dHJpYnV0ZV9jb250YWluZXJfY2xhc3NkZXZfdG9fY29udGFpbmVyCi0gICAgIGV4Y2VlZCBhbGxvd2VkIDQ0IGNoYXJhY3RlcnMgbWF4aW11bQotWCFFZHJpdmVycy9iYXNlL2F0dHJpYnV0ZV9jb250YWluZXIuYwotLS0+Ci0hRWRyaXZlcnMvYmFzZS9kZC5jCi08IS0tCi1YIUVkcml2ZXJzL2Jhc2UvaW50ZXJmYWNlLmMKLS0tPgotIUlpbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RldmljZS5oCi0hRWRyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCi0hRWRyaXZlcnMvYmFzZS9idXMuYwotICAgICA8L3NlY3QxPgotICAgICA8c2VjdDE+Ci0gICAgICAgPHRpdGxlPkJ1ZmZlciBTaGFyaW5nIGFuZCBTeW5jaHJvbml6YXRpb248L3RpdGxlPgotICAgICAgIDxwYXJhPgotICAgICAgICAgVGhlIGRtYS1idWYgc3Vic3lzdGVtIHByb3ZpZGVzIHRoZSBmcmFtZXdvcmsgZm9yIHNoYXJpbmcgYnVmZmVycwotICAgICAgICAgZm9yIGhhcmR3YXJlIChETUEpIGFjY2VzcyBhY3Jvc3MgbXVsdGlwbGUgZGV2aWNlIGRyaXZlcnMgYW5kCi0gICAgICAgICBzdWJzeXN0ZW1zLCBhbmQgZm9yIHN5bmNocm9uaXppbmcgYXN5bmNocm9ub3VzIGhhcmR3YXJlIGFjY2Vzcy4KLSAgICAgICA8L3BhcmE+Ci0gICAgICAgPHBhcmE+Ci0gICAgICAgICBUaGlzIGlzIHVzZWQsIGZvciBleGFtcGxlLCBieSBkcm0gInByaW1lIiBtdWx0aS1HUFUgc3VwcG9ydCwgYnV0Ci0gICAgICAgICBpcyBvZiBjb3Vyc2Ugbm90IGxpbWl0ZWQgdG8gR1BVIHVzZSBjYXNlcy4KLSAgICAgICA8L3BhcmE+Ci0gICAgICAgPHBhcmE+Ci0gICAgICAgICBUaGUgdGhyZWUgbWFpbiBjb21wb25lbnRzIG9mIHRoaXMgYXJlOiAoMSkgZG1hLWJ1ZiwgcmVwcmVzZW50aW5nCi0gICAgICAgICBhIHNnX3RhYmxlIGFuZCBleHBvc2VkIHRvIHVzZXJzcGFjZSBhcyBhIGZpbGUgZGVzY3JpcHRvciB0byBhbGxvdwotICAgICAgICAgcGFzc2luZyBiZXR3ZWVuIGRldmljZXMsICgyKSBmZW5jZSwgd2hpY2ggcHJvdmlkZXMgYSBtZWNoYW5pc20KLSAgICAgICAgIHRvIHNpZ25hbCB3aGVuIG9uZSBkZXZpY2UgYXMgZmluaXNoZWQgYWNjZXNzLCBhbmQgKDMpIHJlc2VydmF0aW9uLAotICAgICAgICAgd2hpY2ggbWFuYWdlcyB0aGUgc2hhcmVkIG9yIGV4Y2x1c2l2ZSBmZW5jZShzKSBhc3NvY2lhdGVkIHdpdGgKLSAgICAgICAgIHRoZSBidWZmZXIuCi0gICAgICAgPC9wYXJhPgotICAgICAgIDxzZWN0Mj48dGl0bGU+ZG1hLWJ1ZjwvdGl0bGU+Ci0hRWRyaXZlcnMvZG1hLWJ1Zi9kbWEtYnVmLmMKLSFJaW5jbHVkZS9saW51eC9kbWEtYnVmLmgKLSAgICAgICA8L3NlY3QyPgotICAgICAgIDxzZWN0Mj48dGl0bGU+cmVzZXJ2YXRpb248L3RpdGxlPgotIVBkcml2ZXJzL2RtYS1idWYvcmVzZXJ2YXRpb24uYyBSZXNlcnZhdGlvbiBPYmplY3QgT3ZlcnZpZXcKLSFFZHJpdmVycy9kbWEtYnVmL3Jlc2VydmF0aW9uLmMKLSFJaW5jbHVkZS9saW51eC9yZXNlcnZhdGlvbi5oCi0gICAgICAgPC9zZWN0Mj4KLSAgICAgICA8c2VjdDI+PHRpdGxlPmZlbmNlPC90aXRsZT4KLSFFZHJpdmVycy9kbWEtYnVmL2ZlbmNlLmMKLSFJaW5jbHVkZS9saW51eC9mZW5jZS5oCi0hRWRyaXZlcnMvZG1hLWJ1Zi9zZXFuby1mZW5jZS5jCi0hSWluY2x1ZGUvbGludXgvc2Vxbm8tZmVuY2UuaAotIUVkcml2ZXJzL2RtYS1idWYvZmVuY2UtYXJyYXkuYwotIUlpbmNsdWRlL2xpbnV4L2ZlbmNlLWFycmF5LmgKLSFFZHJpdmVycy9kbWEtYnVmL3Jlc2VydmF0aW9uLmMKLSFJaW5jbHVkZS9saW51eC9yZXNlcnZhdGlvbi5oCi0hRWRyaXZlcnMvZG1hLWJ1Zi9zeW5jX2ZpbGUuYwotIUlpbmNsdWRlL2xpbnV4L3N5bmNfZmlsZS5oCi0gICAgICAgPC9zZWN0Mj4KLSAgICAgPC9zZWN0MT4KLSAgICAgPHNlY3QxPjx0aXRsZT5EZXZpY2UgRHJpdmVycyBETUEgTWFuYWdlbWVudDwvdGl0bGU+Ci0hRWRyaXZlcnMvYmFzZS9kbWEtY29oZXJlbnQuYwotIUVkcml2ZXJzL2Jhc2UvZG1hLW1hcHBpbmcuYwotICAgICA8L3NlY3QxPgotICAgICA8c2VjdDE+PHRpdGxlPkRldmljZSBEcml2ZXJzIFBvd2VyIE1hbmFnZW1lbnQ8L3RpdGxlPgotIUVkcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jCi0gICAgIDwvc2VjdDE+Ci0gICAgIDxzZWN0MT48dGl0bGU+RGV2aWNlIERyaXZlcnMgQUNQSSBTdXBwb3J0PC90aXRsZT4KLTwhLS0gSW50ZXJuYWwgZnVuY3Rpb25zIG9ubHkKLVghRWRyaXZlcnMvYWNwaS9zbGVlcC9tYWluLmMKLVghRWRyaXZlcnMvYWNwaS9zbGVlcC93YWtldXAuYwotWCFFZHJpdmVycy9hY3BpL21vdGhlcmJvYXJkLmMKLVghRWRyaXZlcnMvYWNwaS9idXMuYwotLS0+Ci0hRWRyaXZlcnMvYWNwaS9zY2FuLmMKLSFJZHJpdmVycy9hY3BpL3NjYW4uYwotPCEtLSBObyBjb3JyZWN0IHN0cnVjdHVyZWQgY29tbWVudHMKLVghRWRyaXZlcnMvYWNwaS9wY2lfYmluZC5jCi0tLT4KLSAgICAgPC9zZWN0MT4KLSAgICAgPHNlY3QxPjx0aXRsZT5EZXZpY2UgZHJpdmVycyBQblAgc3VwcG9ydDwvdGl0bGU+Ci0hSWRyaXZlcnMvcG5wL2NvcmUuYwotPCEtLSBObyBjb3JyZWN0IHN0cnVjdHVyZWQgY29tbWVudHMKLVghRWRyaXZlcnMvcG5wL3N5c3RlbS5jCi0gLS0+Ci0hRWRyaXZlcnMvcG5wL2NhcmQuYwotIUlkcml2ZXJzL3BucC9kcml2ZXIuYwotIUVkcml2ZXJzL3BucC9tYW5hZ2VyLmMKLSFFZHJpdmVycy9wbnAvc3VwcG9ydC5jCi0gICAgIDwvc2VjdDE+Ci0gICAgIDxzZWN0MT48dGl0bGU+VXNlcnNwYWNlIElPIGRldmljZXM8L3RpdGxlPgotIUVkcml2ZXJzL3Vpby91aW8uYwotIUlpbmNsdWRlL2xpbnV4L3Vpb19kcml2ZXIuaAotICAgICA8L3NlY3QxPgotICA8L2NoYXB0ZXI+Ci0KLSAgPGNoYXB0ZXIgaWQ9InBhcnBvcnRkZXYiPgotICAgICA8dGl0bGU+UGFyYWxsZWwgUG9ydCBEZXZpY2VzPC90aXRsZT4KLSFJaW5jbHVkZS9saW51eC9wYXJwb3J0LmgKLSFFZHJpdmVycy9wYXJwb3J0L2llZWUxMjg0LmMKLSFFZHJpdmVycy9wYXJwb3J0L3NoYXJlLmMKLSFJZHJpdmVycy9wYXJwb3J0L2RhaXN5LmMKLSAgPC9jaGFwdGVyPgotCi0gIDxjaGFwdGVyIGlkPSJtZXNzYWdlX2RldmljZXMiPgotCTx0aXRsZT5NZXNzYWdlLWJhc2VkIGRldmljZXM8L3RpdGxlPgotICAgICA8c2VjdDE+PHRpdGxlPkZ1c2lvbiBtZXNzYWdlIGRldmljZXM8L3RpdGxlPgotIUVkcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuYwotIUlkcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuYwotIUVkcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMKLSFJZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5jCi0hSWRyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0Y3RsLmMKLSFJZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzcGkuYwotIUlkcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGZjLmMKLSFJZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRsYW4uYwotICAgICA8L3NlY3QxPgotICA8L2NoYXB0ZXI+Ci0KLSAgPGNoYXB0ZXIgaWQ9InNuZGRldiI+Ci0gICAgIDx0aXRsZT5Tb3VuZCBEZXZpY2VzPC90aXRsZT4KLSFJaW5jbHVkZS9zb3VuZC9jb3JlLmgKLSFFc291bmQvc291bmRfY29yZS5jCi0hSWluY2x1ZGUvc291bmQvcGNtLmgKLSFFc291bmQvY29yZS9wY20uYwotIUVzb3VuZC9jb3JlL2RldmljZS5jCi0hRXNvdW5kL2NvcmUvaW5mby5jCi0hRXNvdW5kL2NvcmUvcmF3bWlkaS5jCi0hRXNvdW5kL2NvcmUvc291bmQuYwotIUVzb3VuZC9jb3JlL21lbW9yeS5jCi0hRXNvdW5kL2NvcmUvcGNtX21lbW9yeS5jCi0hRXNvdW5kL2NvcmUvaW5pdC5jCi0hRXNvdW5kL2NvcmUvaXNhZG1hLmMKLSFFc291bmQvY29yZS9jb250cm9sLmMKLSFFc291bmQvY29yZS9wY21fbGliLmMKLSFFc291bmQvY29yZS9od2RlcC5jCi0hRXNvdW5kL2NvcmUvcGNtX25hdGl2ZS5jCi0hRXNvdW5kL2NvcmUvbWVtYWxsb2MuYwotPCEtLSBGSVhNRTogUmVtb3ZlZCBmb3Igbm93IHNpbmNlIG5vIHN0cnVjdHVyZWQgY29tbWVudHMgaW4gc291cmNlCi1YIUlzb3VuZC9zb3VuZF9maXJtd2FyZS5jCi0tLT4KLSAgPC9jaGFwdGVyPgotCi0KLSAgPGNoYXB0ZXIgaWQ9InVhcnQxNng1MCI+Ci0gICAgIDx0aXRsZT4xNng1MCBVQVJUIERyaXZlcjwvdGl0bGU+Ci0hRWRyaXZlcnMvdHR5L3NlcmlhbC9zZXJpYWxfY29yZS5jCi0hRWRyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfY29yZS5jCi0gIDwvY2hhcHRlcj4KLQotICA8Y2hhcHRlciBpZD0iZmJkZXYiPgotICAgICA8dGl0bGU+RnJhbWUgQnVmZmVyIExpYnJhcnk8L3RpdGxlPgotCi0gICAgIDxwYXJhPgotICAgICAgIFRoZSBmcmFtZSBidWZmZXIgZHJpdmVycyBkZXBlbmQgaGVhdmlseSBvbiBmb3VyIGRhdGEgc3RydWN0dXJlcy4KLSAgICAgICBUaGVzZSBzdHJ1Y3R1cmVzIGFyZSBkZWNsYXJlZCBpbiBpbmNsdWRlL2xpbnV4L2ZiLmguICBUaGV5IGFyZQotICAgICAgIGZiX2luZm8sIGZiX3Zhcl9zY3JlZW5pbmZvLCBmYl9maXhfc2NyZWVuaW5mbyBhbmQgZmJfbW9ub3NwZWNzLgotICAgICAgIFRoZSBsYXN0IHRocmVlIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBhbmQgZnJvbSB1c2VybGFuZC4KLSAgICAgPC9wYXJhPgotCi0gICAgIDxwYXJhPgotICAgICAgIGZiX2luZm8gZGVmaW5lcyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIHBhcnRpY3VsYXIgdmlkZW8gY2FyZC4KLSAgICAgICBJbnNpZGUgZmJfaW5mbywgdGhlcmUgZXhpc3RzIGEgZmJfb3BzIHN0cnVjdHVyZSB3aGljaCBpcyBhCi0gICAgICAgY29sbGVjdGlvbiBvZiBuZWVkZWQgZnVuY3Rpb25zIHRvIG1ha2UgZmJkZXYgYW5kIGZiY29uIHdvcmsuCi0gICAgICAgZmJfaW5mbyBpcyBvbmx5IHZpc2libGUgdG8gdGhlIGtlcm5lbC4KLSAgICAgPC9wYXJhPgotCi0gICAgIDxwYXJhPgotICAgICAgIGZiX3Zhcl9zY3JlZW5pbmZvIGlzIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGZlYXR1cmVzIG9mIGEgdmlkZW8gY2FyZAotICAgICAgIHRoYXQgYXJlIHVzZXIgZGVmaW5lZC4gIFdpdGggZmJfdmFyX3NjcmVlbmluZm8sIHRoaW5ncyBzdWNoIGFzCi0gICAgICAgZGVwdGggYW5kIHRoZSByZXNvbHV0aW9uIG1heSBiZSBkZWZpbmVkLgotICAgICA8L3BhcmE+Ci0KLSAgICAgPHBhcmE+Ci0gICAgICAgVGhlIG5leHQgc3RydWN0dXJlIGlzIGZiX2ZpeF9zY3JlZW5pbmZvLiBUaGlzIGRlZmluZXMgdGhlCi0gICAgICAgcHJvcGVydGllcyBvZiBhIGNhcmQgdGhhdCBhcmUgY3JlYXRlZCB3aGVuIGEgbW9kZSBpcyBzZXQgYW5kIGNhbid0Ci0gICAgICAgYmUgY2hhbmdlZCBvdGhlcndpc2UuICBBIGdvb2QgZXhhbXBsZSBvZiB0aGlzIGlzIHRoZSBzdGFydCBvZiB0aGUKLSAgICAgICBmcmFtZSBidWZmZXIgbWVtb3J5LiAgVGhpcyAibG9ja3MiIHRoZSBhZGRyZXNzIG9mIHRoZSBmcmFtZSBidWZmZXIKLSAgICAgICBtZW1vcnksIHNvIHRoYXQgaXQgY2Fubm90IGJlIGNoYW5nZWQgb3IgbW92ZWQuCi0gICAgIDwvcGFyYT4KLQotICAgICA8cGFyYT4KLSAgICAgICBUaGUgbGFzdCBzdHJ1Y3R1cmUgaXMgZmJfbW9ub3NwZWNzLiBJbiB0aGUgb2xkIEFQSSwgdGhlcmUgd2FzCi0gICAgICAgbGl0dGxlIGltcG9ydGFuY2UgZm9yIGZiX21vbm9zcGVjcy4gVGhpcyBhbGxvd2VkIGZvciBmb3JiaWRkZW4gdGhpbmdzCi0gICAgICAgc3VjaCBhcyBzZXR0aW5nIGEgbW9kZSBvZiA4MDB4NjAwIG9uIGEgZml4IGZyZXF1ZW5jeSBtb25pdG9yLiBXaXRoCi0gICAgICAgdGhlIG5ldyBBUEksIGZiX21vbm9zcGVjcyBwcmV2ZW50cyBzdWNoIHRoaW5ncywgYW5kIGlmIHVzZWQKLSAgICAgICBjb3JyZWN0bHksIGNhbiBwcmV2ZW50IGEgbW9uaXRvciBmcm9tIGJlaW5nIGNvb2tlZC4gIGZiX21vbm9zcGVjcwotICAgICAgIHdpbGwgbm90IGJlIHVzZWZ1bCB1bnRpbCBrZXJuZWxzIDIuNS54LgotICAgICA8L3BhcmE+Ci0KLSAgICAgPHNlY3QxPjx0aXRsZT5GcmFtZSBCdWZmZXIgTWVtb3J5PC90aXRsZT4KLSFFZHJpdmVycy92aWRlby9mYmRldi9jb3JlL2ZibWVtLmMKLSAgICAgPC9zZWN0MT4KLTwhLS0KLSAgICAgPHNlY3QxPjx0aXRsZT5GcmFtZSBCdWZmZXIgQ29uc29sZTwvdGl0bGU+Ci1YIUVkcml2ZXJzL3ZpZGVvL2NvbnNvbGUvZmJjb24uYwotICAgICA8L3NlY3QxPgotLS0+Ci0gICAgIDxzZWN0MT48dGl0bGU+RnJhbWUgQnVmZmVyIENvbG9ybWFwPC90aXRsZT4KLSFFZHJpdmVycy92aWRlby9mYmRldi9jb3JlL2ZiY21hcC5jCi0gICAgIDwvc2VjdDE+Ci08IS0tIEZJWE1FOgotICBkcml2ZXJzL3ZpZGVvL2ZiZ2VuLmMgaGFzIG5vIGRvY3MsIHdoaWNoIHN0dWZmcyB1cCB0aGUgc2dtbC4gIENvbW1lbnQKLSAgb3V0IHVudGlsIHNvbWVib2R5IGFkZHMgZG9jcy4gIEtBTwotICAgICA8c2VjdDE+PHRpdGxlPkZyYW1lIEJ1ZmZlciBHZW5lcmljIEZ1bmN0aW9uczwvdGl0bGU+Ci1YIUlkcml2ZXJzL3ZpZGVvL2ZiZ2VuLmMKLSAgICAgPC9zZWN0MT4KLUtBTyAtLT4KLSAgICAgPHNlY3QxPjx0aXRsZT5GcmFtZSBCdWZmZXIgVmlkZW8gTW9kZSBEYXRhYmFzZTwvdGl0bGU+Ci0hSWRyaXZlcnMvdmlkZW8vZmJkZXYvY29yZS9tb2RlZGIuYwotIUVkcml2ZXJzL3ZpZGVvL2ZiZGV2L2NvcmUvbW9kZWRiLmMKLSAgICAgPC9zZWN0MT4KLSAgICAgPHNlY3QxPjx0aXRsZT5GcmFtZSBCdWZmZXIgTWFjaW50b3NoIFZpZGVvIE1vZGUgRGF0YWJhc2U8L3RpdGxlPgotIUVkcml2ZXJzL3ZpZGVvL2ZiZGV2L21hY21vZGVzLmMKLSAgICAgPC9zZWN0MT4KLSAgICAgPHNlY3QxPjx0aXRsZT5GcmFtZSBCdWZmZXIgRm9udHM8L3RpdGxlPgotICAgICAgICA8cGFyYT4KLSAgICAgICAgICAgUmVmZXIgdG8gdGhlIGZpbGUgbGliL2ZvbnRzL2ZvbnRzLmMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgICAgIDwvcGFyYT4KLTwhLS0gRklYTUU6IFJlbW92ZWQgZm9yIG5vdyBzaW5jZSBubyBzdHJ1Y3R1cmVkIGNvbW1lbnRzIGluIHNvdXJjZQotWCFJbGliL2ZvbnRzL2ZvbnRzLmMKLS0tPgotICAgICA8L3NlY3QxPgotICA8L2NoYXB0ZXI+Ci0KLSAgPGNoYXB0ZXIgaWQ9ImlucHV0X3N1YnN5c3RlbSI+Ci0gICAgIDx0aXRsZT5JbnB1dCBTdWJzeXN0ZW08L3RpdGxlPgotICAgICA8c2VjdDE+PHRpdGxlPklucHV0IGNvcmU8L3RpdGxlPgotIUlpbmNsdWRlL2xpbnV4L2lucHV0LmgKLSFFZHJpdmVycy9pbnB1dC9pbnB1dC5jCi0hRWRyaXZlcnMvaW5wdXQvZmYtY29yZS5jCi0hRWRyaXZlcnMvaW5wdXQvZmYtbWVtbGVzcy5jCi0gICAgIDwvc2VjdDE+Ci0gICAgIDxzZWN0MT48dGl0bGU+TXVsdGl0b3VjaCBMaWJyYXJ5PC90aXRsZT4KLSFJaW5jbHVkZS9saW51eC9pbnB1dC9tdC5oCi0hRWRyaXZlcnMvaW5wdXQvaW5wdXQtbXQuYwotICAgICA8L3NlY3QxPgotICAgICA8c2VjdDE+PHRpdGxlPlBvbGxlZCBpbnB1dCBkZXZpY2VzPC90aXRsZT4KLSFJaW5jbHVkZS9saW51eC9pbnB1dC1wb2xsZGV2LmgKLSFFZHJpdmVycy9pbnB1dC9pbnB1dC1wb2xsZGV2LmMKLSAgICAgPC9zZWN0MT4KLSAgICAgPHNlY3QxPjx0aXRsZT5NYXRyaXgga2V5Ym9hcmRzL2tleXBhZHM8L3RpdGxlPgotIUlpbmNsdWRlL2xpbnV4L2lucHV0L21hdHJpeF9rZXlwYWQuaAotICAgICA8L3NlY3QxPgotICAgICA8c2VjdDE+PHRpdGxlPlNwYXJzZSBrZXltYXAgc3VwcG9ydDwvdGl0bGU+Ci0hSWluY2x1ZGUvbGludXgvaW5wdXQvc3BhcnNlLWtleW1hcC5oCi0hRWRyaXZlcnMvaW5wdXQvc3BhcnNlLWtleW1hcC5jCi0gICAgIDwvc2VjdDE+Ci0gIDwvY2hhcHRlcj4KLQotICA8Y2hhcHRlciBpZD0ic3BpIj4KLSAgICAgIDx0aXRsZT5TZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKFNQSSk8L3RpdGxlPgotICA8cGFyYT4KLQlTUEkgaXMgdGhlICJTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UiLCB3aWRlbHkgdXNlZCB3aXRoCi0JZW1iZWRkZWQgc3lzdGVtcyBiZWNhdXNlIGl0IGlzIGEgc2ltcGxlIGFuZCBlZmZpY2llbnQKLQlpbnRlcmZhY2U6ICBiYXNpY2FsbHkgYSBtdWx0aXBsZXhlZCBzaGlmdCByZWdpc3Rlci4KLQlJdHMgdGhyZWUgc2lnbmFsIHdpcmVzIGhvbGQgYSBjbG9jayAoU0NLLCBvZnRlbiBpbiB0aGUgcmFuZ2UKLQlvZiAxLTIwIE1IeiksIGEgIk1hc3RlciBPdXQsIFNsYXZlIEluIiAoTU9TSSkgZGF0YSBsaW5lLCBhbmQKLQlhICJNYXN0ZXIgSW4sIFNsYXZlIE91dCIgKE1JU08pIGRhdGEgbGluZS4KLQlTUEkgaXMgYSBmdWxsIGR1cGxleCBwcm90b2NvbDsgZm9yIGVhY2ggYml0IHNoaWZ0ZWQgb3V0IHRoZQotCU1PU0kgbGluZSAob25lIHBlciBjbG9jaykgYW5vdGhlciBpcyBzaGlmdGVkIGluIG9uIHRoZSBNSVNPIGxpbmUuCi0JVGhvc2UgYml0cyBhcmUgYXNzZW1ibGVkIGludG8gd29yZHMgb2YgdmFyaW91cyBzaXplcyBvbiB0aGUKLQl3YXkgdG8gYW5kIGZyb20gc3lzdGVtIG1lbW9yeS4KLQlBbiBhZGRpdGlvbmFsIGNoaXBzZWxlY3QgbGluZSBpcyB1c3VhbGx5IGFjdGl2ZS1sb3cgKG5DUyk7Ci0JZm91ciBzaWduYWxzIGFyZSBub3JtYWxseSB1c2VkIGZvciBlYWNoIHBlcmlwaGVyYWwsIHBsdXMKLQlzb21ldGltZXMgYW4gaW50ZXJydXB0LgotICA8L3BhcmE+Ci0gIDxwYXJhPgotCVRoZSBTUEkgYnVzIGZhY2lsaXRpZXMgbGlzdGVkIGhlcmUgcHJvdmlkZSBhIGdlbmVyYWxpemVkCi0JaW50ZXJmYWNlIHRvIGRlY2xhcmUgU1BJIGJ1c3NlcyBhbmQgZGV2aWNlcywgbWFuYWdlIHRoZW0KLQlhY2NvcmRpbmcgdG8gdGhlIHN0YW5kYXJkIExpbnV4IGRyaXZlciBtb2RlbCwgYW5kIHBlcmZvcm0KLQlpbnB1dC9vdXRwdXQgb3BlcmF0aW9ucy4KLQlBdCB0aGlzIHRpbWUsIG9ubHkgIm1hc3RlciIgc2lkZSBpbnRlcmZhY2VzIGFyZSBzdXBwb3J0ZWQsCi0Jd2hlcmUgTGludXggdGFsa3MgdG8gU1BJIHBlcmlwaGVyYWxzIGFuZCBkb2VzIG5vdCBpbXBsZW1lbnQKLQlzdWNoIGEgcGVyaXBoZXJhbCBpdHNlbGYuCi0JKEludGVyZmFjZXMgdG8gc3VwcG9ydCBpbXBsZW1lbnRpbmcgU1BJIHNsYXZlcyB3b3VsZAotCW5lY2Vzc2FyaWx5IGxvb2sgZGlmZmVyZW50LikKLSAgPC9wYXJhPgotICA8cGFyYT4KLQlUaGUgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlIGlzIHN0cnVjdHVyZWQgYXJvdW5kIHR3byBraW5kcyBvZiBkcml2ZXIsCi0JYW5kIHR3byBraW5kcyBvZiBkZXZpY2UuCi0JQSAiQ29udHJvbGxlciBEcml2ZXIiIGFic3RyYWN0cyB0aGUgY29udHJvbGxlciBoYXJkd2FyZSwgd2hpY2ggbWF5Ci0JYmUgYXMgc2ltcGxlIGFzIGEgc2V0IG9mIEdQSU8gcGlucyBvciBhcyBjb21wbGV4IGFzIGEgcGFpciBvZiBGSUZPcwotCWNvbm5lY3RlZCB0byBkdWFsIERNQSBlbmdpbmVzIG9uIHRoZSBvdGhlciBzaWRlIG9mIHRoZSBTUEkgc2hpZnQKLQlyZWdpc3RlciAobWF4aW1pemluZyB0aHJvdWdocHV0KS4gIFN1Y2ggZHJpdmVycyBicmlkZ2UgYmV0d2VlbgotCXdoYXRldmVyIGJ1cyB0aGV5IHNpdCBvbiAob2Z0ZW4gdGhlIHBsYXRmb3JtIGJ1cykgYW5kIFNQSSwgYW5kCi0JZXhwb3NlIHRoZSBTUEkgc2lkZSBvZiB0aGVpciBkZXZpY2UgYXMgYQotCTxzdHJ1Y3RuYW1lPnN0cnVjdCBzcGlfbWFzdGVyPC9zdHJ1Y3RuYW1lPi4KLQlTUEkgZGV2aWNlcyBhcmUgY2hpbGRyZW4gb2YgdGhhdCBtYXN0ZXIsIHJlcHJlc2VudGVkIGFzIGEKLQk8c3RydWN0bmFtZT5zdHJ1Y3Qgc3BpX2RldmljZTwvc3RydWN0bmFtZT4gYW5kIG1hbnVmYWN0dXJlZCBmcm9tCi0JPHN0cnVjdG5hbWU+c3RydWN0IHNwaV9ib2FyZF9pbmZvPC9zdHJ1Y3RuYW1lPiBkZXNjcmlwdG9ycyB3aGljaAotCWFyZSB1c3VhbGx5IHByb3ZpZGVkIGJ5IGJvYXJkLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGNvZGUuCi0JQSA8c3RydWN0bmFtZT5zdHJ1Y3Qgc3BpX2RyaXZlcjwvc3RydWN0bmFtZT4gaXMgY2FsbGVkIGEKLQkiUHJvdG9jb2wgRHJpdmVyIiwgYW5kIGlzIGJvdW5kIHRvIGEgc3BpX2RldmljZSB1c2luZyBub3JtYWwKLQlkcml2ZXIgbW9kZWwgY2FsbHMuCi0gIDwvcGFyYT4KLSAgPHBhcmE+Ci0JVGhlIEkvTyBtb2RlbCBpcyBhIHNldCBvZiBxdWV1ZWQgbWVzc2FnZXMuICBQcm90b2NvbCBkcml2ZXJzCi0Jc3VibWl0IG9uZSBvciBtb3JlIDxzdHJ1Y3RuYW1lPnN0cnVjdCBzcGlfbWVzc2FnZTwvc3RydWN0bmFtZT4KLQlvYmplY3RzLCB3aGljaCBhcmUgcHJvY2Vzc2VkIGFuZCBjb21wbGV0ZWQgYXN5bmNocm9ub3VzbHkuCi0JKFRoZXJlIGFyZSBzeW5jaHJvbm91cyB3cmFwcGVycywgaG93ZXZlci4pICBNZXNzYWdlcyBhcmUKLQlidWlsdCBmcm9tIG9uZSBvciBtb3JlIDxzdHJ1Y3RuYW1lPnN0cnVjdCBzcGlfdHJhbnNmZXI8L3N0cnVjdG5hbWU+Ci0Jb2JqZWN0cywgZWFjaCBvZiB3aGljaCB3cmFwcyBhIGZ1bGwgZHVwbGV4IFNQSSB0cmFuc2Zlci4KLQlBIHZhcmlldHkgb2YgcHJvdG9jb2wgdHdlYWtpbmcgb3B0aW9ucyBhcmUgbmVlZGVkLCBiZWNhdXNlCi0JZGlmZmVyZW50IGNoaXBzIGFkb3B0IHZlcnkgZGlmZmVyZW50IHBvbGljaWVzIGZvciBob3cgdGhleQotCXVzZSB0aGUgYml0cyB0cmFuc2ZlcnJlZCB3aXRoIFNQSS4KLSAgPC9wYXJhPgotIUlpbmNsdWRlL2xpbnV4L3NwaS9zcGkuaAotIUZkcml2ZXJzL3NwaS9zcGkuYyBzcGlfcmVnaXN0ZXJfYm9hcmRfaW5mbwotIUVkcml2ZXJzL3NwaS9zcGkuYwotICA8L2NoYXB0ZXI+Ci0KLSAgPGNoYXB0ZXIgaWQ9ImkyYyI+Ci0gICAgIDx0aXRsZT5JPHN1cGVyc2NyaXB0PjI8L3N1cGVyc2NyaXB0PkMgYW5kIFNNQnVzIFN1YnN5c3RlbTwvdGl0bGU+Ci0KLSAgICAgPHBhcmE+Ci0JSTxzdXBlcnNjcmlwdD4yPC9zdXBlcnNjcmlwdD5DIChvciB3aXRob3V0IGZhbmN5IHR5cG9ncmFwaHksICJJMkMiKQotCWlzIGFuIGFjcm9ueW0gZm9yIHRoZSAiSW50ZXItSUMiIGJ1cywgYSBzaW1wbGUgYnVzIHByb3RvY29sIHdoaWNoIGlzCi0Jd2lkZWx5IHVzZWQgd2hlcmUgbG93IGRhdGEgcmF0ZSBjb21tdW5pY2F0aW9ucyBzdWZmaWNlLgotCVNpbmNlIGl0J3MgYWxzbyBhIGxpY2Vuc2VkIHRyYWRlbWFyaywgc29tZSB2ZW5kb3JzIHVzZSBhbm90aGVyCi0JbmFtZSAoc3VjaCBhcyAiVHdvLVdpcmUgSW50ZXJmYWNlIiwgVFdJKSBmb3IgdGhlIHNhbWUgYnVzLgotCUkyQyBvbmx5IG5lZWRzIHR3byBzaWduYWxzIChTQ0wgZm9yIGNsb2NrLCBTREEgZm9yIGRhdGEpLCBjb25zZXJ2aW5nCi0JYm9hcmQgcmVhbCBlc3RhdGUgYW5kIG1pbmltaXppbmcgc2lnbmFsIHF1YWxpdHkgaXNzdWVzLgotCU1vc3QgSTJDIGRldmljZXMgdXNlIHNldmVuIGJpdCBhZGRyZXNzZXMsIGFuZCBidXMgc3BlZWRzIG9mIHVwCi0JdG8gNDAwIGtIejsgdGhlcmUncyBhIGhpZ2ggc3BlZWQgZXh0ZW5zaW9uICgzLjQgTUh6KSB0aGF0J3Mgbm90IHlldAotCWZvdW5kIHdpZGUgdXNlLgotCUkyQyBpcyBhIG11bHRpLW1hc3RlciBidXM7IG9wZW4gZHJhaW4gc2lnbmFsaW5nIGlzIHVzZWQgdG8KLQlhcmJpdHJhdGUgYmV0d2VlbiBtYXN0ZXJzLCBhcyB3ZWxsIGFzIHRvIGhhbmRzaGFrZSBhbmQgdG8KLQlzeW5jaHJvbml6ZSBjbG9ja3MgZnJvbSBzbG93ZXIgY2xpZW50cy4KLSAgICAgPC9wYXJhPgotCi0gICAgIDxwYXJhPgotCVRoZSBMaW51eCBJMkMgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlcyBzdXBwb3J0IG9ubHkgdGhlIG1hc3RlcgotCXNpZGUgb2YgYnVzIGludGVyYWN0aW9ucywgbm90IHRoZSBzbGF2ZSBzaWRlLgotCVRoZSBwcm9ncmFtbWluZyBpbnRlcmZhY2UgaXMgc3RydWN0dXJlZCBhcm91bmQgdHdvIGtpbmRzIG9mIGRyaXZlciwKLQlhbmQgdHdvIGtpbmRzIG9mIGRldmljZS4KLQlBbiBJMkMgIkFkYXB0ZXIgRHJpdmVyIiBhYnN0cmFjdHMgdGhlIGNvbnRyb2xsZXIgaGFyZHdhcmU7IGl0IGJpbmRzCi0JdG8gYSBwaHlzaWNhbCBkZXZpY2UgKHBlcmhhcHMgYSBQQ0kgZGV2aWNlIG9yIHBsYXRmb3JtX2RldmljZSkgYW5kCi0JZXhwb3NlcyBhIDxzdHJ1Y3RuYW1lPnN0cnVjdCBpMmNfYWRhcHRlcjwvc3RydWN0bmFtZT4gcmVwcmVzZW50aW5nCi0JZWFjaCBJMkMgYnVzIHNlZ21lbnQgaXQgbWFuYWdlcy4KLQlPbiBlYWNoIEkyQyBidXMgc2VnbWVudCB3aWxsIGJlIEkyQyBkZXZpY2VzIHJlcHJlc2VudGVkIGJ5IGEKLQk8c3RydWN0bmFtZT5zdHJ1Y3QgaTJjX2NsaWVudDwvc3RydWN0bmFtZT4uICBUaG9zZSBkZXZpY2VzIHdpbGwKLQliZSBib3VuZCB0byBhIDxzdHJ1Y3RuYW1lPnN0cnVjdCBpMmNfZHJpdmVyPC9zdHJ1Y3RuYW1lPiwKLQl3aGljaCBzaG91bGQgZm9sbG93IHRoZSBzdGFuZGFyZCBMaW51eCBkcml2ZXIgbW9kZWwuCi0JKEF0IHRoaXMgd3JpdGluZywgYSBsZWdhY3kgbW9kZWwgaXMgbW9yZSB3aWRlbHkgdXNlZC4pCi0JVGhlcmUgYXJlIGZ1bmN0aW9ucyB0byBwZXJmb3JtIHZhcmlvdXMgSTJDIHByb3RvY29sIG9wZXJhdGlvbnM7IGF0Ci0JdGhpcyB3cml0aW5nIGFsbCBzdWNoIGZ1bmN0aW9ucyBhcmUgdXNhYmxlIG9ubHkgZnJvbSB0YXNrIGNvbnRleHQuCi0gICAgIDwvcGFyYT4KLQotICAgICA8cGFyYT4KLQlUaGUgU3lzdGVtIE1hbmFnZW1lbnQgQnVzIChTTUJ1cykgaXMgYSBzaWJsaW5nIHByb3RvY29sLiAgTW9zdCBTTUJ1cwotCXN5c3RlbXMgYXJlIGFsc28gSTJDIGNvbmZvcm1hbnQuICBUaGUgZWxlY3RyaWNhbCBjb25zdHJhaW50cyBhcmUKLQl0aWdodGVyIGZvciBTTUJ1cywgYW5kIGl0IHN0YW5kYXJkaXplcyBwYXJ0aWN1bGFyIHByb3RvY29sIG1lc3NhZ2VzCi0JYW5kIGlkaW9tcy4gIENvbnRyb2xsZXJzIHRoYXQgc3VwcG9ydCBJMkMgY2FuIGFsc28gc3VwcG9ydCBtb3N0Ci0JU01CdXMgb3BlcmF0aW9ucywgYnV0IFNNQnVzIGNvbnRyb2xsZXJzIGRvbid0IHN1cHBvcnQgYWxsIHRoZSBwcm90b2NvbAotCW9wdGlvbnMgdGhhdCBhbiBJMkMgY29udHJvbGxlciB3aWxsLgotCVRoZXJlIGFyZSBmdW5jdGlvbnMgdG8gcGVyZm9ybSB2YXJpb3VzIFNNQnVzIHByb3RvY29sIG9wZXJhdGlvbnMsCi0JZWl0aGVyIHVzaW5nIEkyQyBwcmltaXRpdmVzIG9yIGJ5IGlzc3VpbmcgU01CdXMgY29tbWFuZHMgdG8KLQlpMmNfYWRhcHRlciBkZXZpY2VzIHdoaWNoIGRvbid0IHN1cHBvcnQgdGhvc2UgSTJDIG9wZXJhdGlvbnMuCi0gICAgIDwvcGFyYT4KLQotIUlpbmNsdWRlL2xpbnV4L2kyYy5oCi0hRmRyaXZlcnMvaTJjL2kyYy1ib2FyZGluZm8uYyBpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbwotIUVkcml2ZXJzL2kyYy9pMmMtY29yZS5jCi0gIDwvY2hhcHRlcj4KLQotICA8Y2hhcHRlciBpZD0iaHNpIj4KLSAgICAgPHRpdGxlPkhpZ2ggU3BlZWQgU3luY2hyb25vdXMgU2VyaWFsIEludGVyZmFjZSAoSFNJKTwvdGl0bGU+Ci0KLSAgICAgPHBhcmE+Ci0JSGlnaCBTcGVlZCBTeW5jaHJvbm91cyBTZXJpYWwgSW50ZXJmYWNlIChIU0kpIGlzIGEKLQlzZXJpYWwgaW50ZXJmYWNlIG1haW5seSB1c2VkIGZvciBjb25uZWN0aW5nIGFwcGxpY2F0aW9uCi0JZW5naW5lcyAoQVBFKSB3aXRoIGNlbGx1bGFyIG1vZGVtIGVuZ2luZXMgKENNVCkgaW4gY2VsbHVsYXIKLQloYW5kc2V0cy4KLQotCUhTSSBwcm92aWRlcyBtdWx0aXBsZXhpbmcgZm9yIHVwIHRvIDE2IGxvZ2ljYWwgY2hhbm5lbHMsCi0JbG93LWxhdGVuY3kgYW5kIGZ1bGwgZHVwbGV4IGNvbW11bmljYXRpb24uCi0gICAgIDwvcGFyYT4KLQotIUlpbmNsdWRlL2xpbnV4L2hzaS9oc2kuaAotIUVkcml2ZXJzL2hzaS9oc2lfY29yZS5jCi0gIDwvY2hhcHRlcj4KLQotICA8Y2hhcHRlciBpZD0icHdtIj4KLSAgICA8dGl0bGU+UHVsc2UtV2lkdGggTW9kdWxhdGlvbiAoUFdNKTwvdGl0bGU+Ci0gICAgPHBhcmE+Ci0gICAgICBQdWxzZS13aWR0aCBtb2R1bGF0aW9uIGlzIGEgbW9kdWxhdGlvbiB0ZWNobmlxdWUgcHJpbWFyaWx5IHVzZWQgdG8KLSAgICAgIGNvbnRyb2wgcG93ZXIgc3VwcGxpZWQgdG8gZWxlY3RyaWNhbCBkZXZpY2VzLgotICAgIDwvcGFyYT4KLSAgICA8cGFyYT4KLSAgICAgIFRoZSBQV00gZnJhbWV3b3JrIHByb3ZpZGVzIGFuIGFic3RyYWN0aW9uIGZvciBwcm92aWRlcnMgYW5kIGNvbnN1bWVycwotICAgICAgb2YgUFdNIHNpZ25hbHMuIEEgY29udHJvbGxlciB0aGF0IHByb3ZpZGVzIG9uZSBvciBtb3JlIFBXTSBzaWduYWxzIGlzCi0gICAgICByZWdpc3RlcmVkIGFzIDxzdHJ1Y3RuYW1lPnN0cnVjdCBwd21fY2hpcDwvc3RydWN0bmFtZT4uIFByb3ZpZGVycyBhcmUKLSAgICAgIGV4cGVjdGVkIHRvIGVtYmVkIHRoaXMgc3RydWN0dXJlIGluIGEgZHJpdmVyLXNwZWNpZmljIHN0cnVjdHVyZS4gVGhpcwotICAgICAgc3RydWN0dXJlIGNvbnRhaW5zIGZpZWxkcyB0aGF0IGRlc2NyaWJlIGEgcGFydGljdWxhciBjaGlwLgotICAgIDwvcGFyYT4KLSAgICA8cGFyYT4KLSAgICAgIEEgY2hpcCBleHBvc2VzIG9uZSBvciBtb3JlIFBXTSBzaWduYWwgc291cmNlcywgZWFjaCBvZiB3aGljaCBleHBvc2VkCi0gICAgICBhcyBhIDxzdHJ1Y3RuYW1lPnN0cnVjdCBwd21fZGV2aWNlPC9zdHJ1Y3RuYW1lPi4gT3BlcmF0aW9ucyBjYW4gYmUKLSAgICAgIHBlcmZvcm1lZCBvbiBQV00gZGV2aWNlcyB0byBjb250cm9sIHRoZSBwZXJpb2QsIGR1dHkgY3ljbGUsIHBvbGFyaXR5Ci0gICAgICBhbmQgYWN0aXZlIHN0YXRlIG9mIHRoZSBzaWduYWwuCi0gICAgPC9wYXJhPgotICAgIDxwYXJhPgotICAgICAgTm90ZSB0aGF0IFBXTSBkZXZpY2VzIGFyZSBleGNsdXNpdmUgcmVzb3VyY2VzOiB0aGV5IGNhbiBhbHdheXMgb25seSBiZQotICAgICAgdXNlZCBieSBvbmUgY29uc3VtZXIgYXQgYSB0aW1lLgotICAgIDwvcGFyYT4KLSFJaW5jbHVkZS9saW51eC9wd20uaAotIUVkcml2ZXJzL3B3bS9jb3JlLmMKLSAgPC9jaGFwdGVyPgotCi08L2Jvb2s+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0hPV1RPIGIvRG9jdW1lbnRhdGlvbi9IT1dUTwppbmRleCAxZjM0NWRhLi41ZjA0MjM0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0hPV1RPCisrKyBiL0RvY3VtZW50YXRpb24vSE9XVE8KQEAgLTEsNSArMSw1IEBACiBIT1dUTyBkbyBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIFRoaXMgaXMgdGhlIGJlLWFsbCwgZW5kLWFsbCBkb2N1bWVudCBvbiB0aGlzIHRvcGljLiAgSXQgY29udGFpbnMKIGluc3RydWN0aW9ucyBvbiBob3cgdG8gYmVjb21lIGEgTGludXgga2VybmVsIGRldmVsb3BlciBhbmQgaG93IHRvIGxlYXJuCkBAIC0yOCw2ICsyOCw3IEBACiB5b3UgcGxhbiB0byBkbyBsb3ctbGV2ZWwgZGV2ZWxvcG1lbnQgZm9yIHRoYXQgYXJjaGl0ZWN0dXJlLiAgVGhvdWdoIHRoZXkKIGFyZSBub3QgYSBnb29kIHN1YnN0aXR1dGUgZm9yIGEgc29saWQgQyBlZHVjYXRpb24gYW5kL29yIHllYXJzIG9mCiBleHBlcmllbmNlLCB0aGUgZm9sbG93aW5nIGJvb2tzIGFyZSBnb29kIGZvciwgaWYgYW55dGhpbmcsIHJlZmVyZW5jZToKKwogIC0gIlRoZSBDIFByb2dyYW1taW5nIExhbmd1YWdlIiBieSBLZXJuaWdoYW4gYW5kIFJpdGNoaWUgW1ByZW50aWNlIEhhbGxdCiAgLSAiUHJhY3RpY2FsIEMgUHJvZ3JhbW1pbmciIGJ5IFN0ZXZlIE91YWxsaW5lIFtPJ1JlaWxseV0KICAtICJDOiAgQSBSZWZlcmVuY2UgTWFudWFsIiBieSBIYXJiaXNvbiBhbmQgU3RlZWxlIFtQcmVudGljZSBIYWxsXQpAQCAtNjQsNyArNjUsOCBAQAogdGhlaXIgc3RhdGVtZW50cyBvbiBsZWdhbCBtYXR0ZXJzLgogCiBGb3IgY29tbW9uIHF1ZXN0aW9ucyBhbmQgYW5zd2VycyBhYm91dCB0aGUgR1BMLCBwbGVhc2Ugc2VlOgotCWh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKworCWh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAKIAogRG9jdW1lbnRhdGlvbgpAQCAtODIsOTYgKzg0LDExOCBAQAogCiBIZXJlIGlzIGEgbGlzdCBvZiBmaWxlcyB0aGF0IGFyZSBpbiB0aGUga2VybmVsIHNvdXJjZSB0cmVlIHRoYXQgYXJlCiByZXF1aXJlZCByZWFkaW5nOgorCiAgIFJFQURNRQogICAgIFRoaXMgZmlsZSBnaXZlcyBhIHNob3J0IGJhY2tncm91bmQgb24gdGhlIExpbnV4IGtlcm5lbCBhbmQgZGVzY3JpYmVzCiAgICAgd2hhdCBpcyBuZWNlc3NhcnkgdG8gZG8gdG8gY29uZmlndXJlIGFuZCBidWlsZCB0aGUga2VybmVsLiAgUGVvcGxlCiAgICAgd2hvIGFyZSBuZXcgdG8gdGhlIGtlcm5lbCBzaG91bGQgc3RhcnQgaGVyZS4KIAotICBEb2N1bWVudGF0aW9uL0NoYW5nZXMKKyAgOnJlZjpgRG9jdW1lbnRhdGlvbi9DaGFuZ2VzIDxjaGFuZ2VzPmAKICAgICBUaGlzIGZpbGUgZ2l2ZXMgYSBsaXN0IG9mIHRoZSBtaW5pbXVtIGxldmVscyBvZiB2YXJpb3VzIHNvZnR3YXJlCiAgICAgcGFja2FnZXMgdGhhdCBhcmUgbmVjZXNzYXJ5IHRvIGJ1aWxkIGFuZCBydW4gdGhlIGtlcm5lbAogICAgIHN1Y2Nlc3NmdWxseS4KIAotICBEb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlCisgIDpyZWY6YERvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUgPGNvZGluZ3N0eWxlPmAKICAgICBUaGlzIGRlc2NyaWJlcyB0aGUgTGludXgga2VybmVsIGNvZGluZyBzdHlsZSwgYW5kIHNvbWUgb2YgdGhlCiAgICAgcmF0aW9uYWxlIGJlaGluZCBpdC4gQWxsIG5ldyBjb2RlIGlzIGV4cGVjdGVkIHRvIGZvbGxvdyB0aGUKICAgICBndWlkZWxpbmVzIGluIHRoaXMgZG9jdW1lbnQuIE1vc3QgbWFpbnRhaW5lcnMgd2lsbCBvbmx5IGFjY2VwdAogICAgIHBhdGNoZXMgaWYgdGhlc2UgcnVsZXMgYXJlIGZvbGxvd2VkLCBhbmQgbWFueSBwZW9wbGUgd2lsbCBvbmx5CiAgICAgcmV2aWV3IGNvZGUgaWYgaXQgaXMgaW4gdGhlIHByb3BlciBzdHlsZS4KIAotICBEb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzCi0gIERvY3VtZW50YXRpb24vU3VibWl0dGluZ0RyaXZlcnMKKyAgOnJlZjpgRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcyA8c3VibWl0dGluZ3BhdGNoZXM+YCBhbmQgOnJlZjpgRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nRHJpdmVycyA8c3VibWl0dGluZ2RyaXZlcnM+YAogICAgIFRoZXNlIGZpbGVzIGRlc2NyaWJlIGluIGV4cGxpY2l0IGRldGFpbCBob3cgdG8gc3VjY2Vzc2Z1bGx5IGNyZWF0ZQogICAgIGFuZCBzZW5kIGEgcGF0Y2gsIGluY2x1ZGluZyAoYnV0IG5vdCBsaW1pdGVkIHRvKToKKwogICAgICAgIC0gRW1haWwgY29udGVudHMKICAgICAgICAtIEVtYWlsIGZvcm1hdAogICAgICAgIC0gV2hvIHRvIHNlbmQgaXQgdG8KKwogICAgIEZvbGxvd2luZyB0aGVzZSBydWxlcyB3aWxsIG5vdCBndWFyYW50ZWUgc3VjY2VzcyAoYXMgYWxsIHBhdGNoZXMgYXJlCiAgICAgc3ViamVjdCB0byBzY3J1dGlueSBmb3IgY29udGVudCBhbmQgc3R5bGUpLCBidXQgbm90IGZvbGxvd2luZyB0aGVtCiAgICAgd2lsbCBhbG1vc3QgYWx3YXlzIHByZXZlbnQgaXQuCiAKICAgICBPdGhlciBleGNlbGxlbnQgZGVzY3JpcHRpb25zIG9mIGhvdyB0byBjcmVhdGUgcGF0Y2hlcyBwcm9wZXJseSBhcmU6CisKIAkiVGhlIFBlcmZlY3QgUGF0Y2giCi0JCWh0dHA6Ly93d3cub3psYWJzLm9yZy9+YWtwbS9zdHVmZi90cHAudHh0CisJCWh0dHBzOi8vd3d3Lm96bGFicy5vcmcvfmFrcG0vc3R1ZmYvdHBwLnR4dAorCiAJIkxpbnV4IGtlcm5lbCBwYXRjaCBzdWJtaXNzaW9uIGZvcm1hdCIKIAkJaHR0cDovL2xpbnV4Lnl5ei51cy9wYXRjaC1mb3JtYXQuaHRtbAogCi0gIERvY3VtZW50YXRpb24vc3RhYmxlX2FwaV9ub25zZW5zZS50eHQKKyAgOnJlZjpgRG9jdW1lbnRhdGlvbi9zdGFibGVfYXBpX25vbnNlbnNlLnR4dCA8c3RhYmxlX2FwaV9ub25zZW5zZT5gCiAgICAgVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgcmF0aW9uYWxlIGJlaGluZCB0aGUgY29uc2Npb3VzIGRlY2lzaW9uIHRvCiAgICAgbm90IGhhdmUgYSBzdGFibGUgQVBJIHdpdGhpbiB0aGUga2VybmVsLCBpbmNsdWRpbmcgdGhpbmdzIGxpa2U6CisKICAgICAgIC0gU3Vic3lzdGVtIHNoaW0tbGF5ZXJzIChmb3IgY29tcGF0aWJpbGl0eT8pCiAgICAgICAtIERyaXZlciBwb3J0YWJpbGl0eSBiZXR3ZWVuIE9wZXJhdGluZyBTeXN0ZW1zLgogICAgICAgLSBNaXRpZ2F0aW5nIHJhcGlkIGNoYW5nZSB3aXRoaW4gdGhlIGtlcm5lbCBzb3VyY2UgdHJlZSAob3IKIAlwcmV2ZW50aW5nIHJhcGlkIGNoYW5nZSkKKwogICAgIFRoaXMgZG9jdW1lbnQgaXMgY3J1Y2lhbCBmb3IgdW5kZXJzdGFuZGluZyB0aGUgTGludXggZGV2ZWxvcG1lbnQKICAgICBwaGlsb3NvcGh5IGFuZCBpcyB2ZXJ5IGltcG9ydGFudCBmb3IgcGVvcGxlIG1vdmluZyB0byBMaW51eCBmcm9tCiAgICAgZGV2ZWxvcG1lbnQgb24gb3RoZXIgT3BlcmF0aW5nIFN5c3RlbXMuCiAKLSAgRG9jdW1lbnRhdGlvbi9TZWN1cml0eUJ1Z3MKKyAgOnJlZjpgRG9jdW1lbnRhdGlvbi9TZWN1cml0eUJ1Z3MgPHNlY3VyaXR5YnVncz5gCiAgICAgSWYgeW91IGZlZWwgeW91IGhhdmUgZm91bmQgYSBzZWN1cml0eSBwcm9ibGVtIGluIHRoZSBMaW51eCBrZXJuZWwsCiAgICAgcGxlYXNlIGZvbGxvdyB0aGUgc3RlcHMgaW4gdGhpcyBkb2N1bWVudCB0byBoZWxwIG5vdGlmeSB0aGUga2VybmVsCiAgICAgZGV2ZWxvcGVycywgYW5kIGhlbHAgc29sdmUgdGhlIGlzc3VlLgogCi0gIERvY3VtZW50YXRpb24vTWFuYWdlbWVudFN0eWxlCisgIDpyZWY6YERvY3VtZW50YXRpb24vTWFuYWdlbWVudFN0eWxlIDxtYW5hZ2VtZW50c3R5bGU+YAogICAgIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGhvdyBMaW51eCBrZXJuZWwgbWFpbnRhaW5lcnMgb3BlcmF0ZSBhbmQgdGhlCiAgICAgc2hhcmVkIGV0aG9zIGJlaGluZCB0aGVpciBtZXRob2RvbG9naWVzLiAgVGhpcyBpcyBpbXBvcnRhbnQgcmVhZGluZwogICAgIGZvciBhbnlvbmUgbmV3IHRvIGtlcm5lbCBkZXZlbG9wbWVudCAob3IgYW55b25lIHNpbXBseSBjdXJpb3VzIGFib3V0CiAgICAgaXQpLCBhcyBpdCByZXNvbHZlcyBhIGxvdCBvZiBjb21tb24gbWlzY29uY2VwdGlvbnMgYW5kIGNvbmZ1c2lvbgogICAgIGFib3V0IHRoZSB1bmlxdWUgYmVoYXZpb3Igb2Yga2VybmVsIG1haW50YWluZXJzLgogCi0gIERvY3VtZW50YXRpb24vc3RhYmxlX2tlcm5lbF9ydWxlcy50eHQKKyAgOnJlZjpgRG9jdW1lbnRhdGlvbi9zdGFibGVfa2VybmVsX3J1bGVzLnR4dCA8c3RhYmxlX2tlcm5lbF9ydWxlcz5gCiAgICAgVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgcnVsZXMgb24gaG93IHRoZSBzdGFibGUga2VybmVsIHJlbGVhc2VzCiAgICAgaGFwcGVuLCBhbmQgd2hhdCB0byBkbyBpZiB5b3Ugd2FudCB0byBnZXQgYSBjaGFuZ2UgaW50byBvbmUgb2YgdGhlc2UKICAgICByZWxlYXNlcy4KIAotICBEb2N1bWVudGF0aW9uL2tlcm5lbC1kb2NzLnR4dAorICA6cmVmOmBEb2N1bWVudGF0aW9uL2tlcm5lbC1kb2NzLnR4dCA8a2VybmVsX2RvY3M+YAogICAgIEEgbGlzdCBvZiBleHRlcm5hbCBkb2N1bWVudGF0aW9uIHRoYXQgcGVydGFpbnMgdG8ga2VybmVsCiAgICAgZGV2ZWxvcG1lbnQuICBQbGVhc2UgY29uc3VsdCB0aGlzIGxpc3QgaWYgeW91IGRvIG5vdCBmaW5kIHdoYXQgeW91CiAgICAgYXJlIGxvb2tpbmcgZm9yIHdpdGhpbiB0aGUgaW4ta2VybmVsIGRvY3VtZW50YXRpb24uCiAKLSAgRG9jdW1lbnRhdGlvbi9hcHBseWluZy1wYXRjaGVzLnR4dAorICA6cmVmOmBEb2N1bWVudGF0aW9uL2FwcGx5aW5nLXBhdGNoZXMudHh0IDxhcHBseWluZ19wYXRjaGVzPmAKICAgICBBIGdvb2QgaW50cm9kdWN0aW9uIGRlc2NyaWJpbmcgZXhhY3RseSB3aGF0IGEgcGF0Y2ggaXMgYW5kIGhvdyB0bwogICAgIGFwcGx5IGl0IHRvIHRoZSBkaWZmZXJlbnQgZGV2ZWxvcG1lbnQgYnJhbmNoZXMgb2YgdGhlIGtlcm5lbC4KIAogVGhlIGtlcm5lbCBhbHNvIGhhcyBhIGxhcmdlIG51bWJlciBvZiBkb2N1bWVudHMgdGhhdCBjYW4gYmUKLWF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gdGhlIHNvdXJjZSBjb2RlIGl0c2VsZi4gIFRoaXMgaW5jbHVkZXMgYQorYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSB0aGUgc291cmNlIGNvZGUgaXRzZWxmIG9yIGZyb20KK1JlU3RydWN0dXJlZFRleHQgbWFya3VwcyAoUmVTVCksIGxpa2UgdGhpcyBvbmUuIFRoaXMgaW5jbHVkZXMgYQogZnVsbCBkZXNjcmlwdGlvbiBvZiB0aGUgaW4ta2VybmVsIEFQSSwgYW5kIHJ1bGVzIG9uIGhvdyB0byBoYW5kbGUKLWxvY2tpbmcgcHJvcGVybHkuICBUaGUgZG9jdW1lbnRzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUKLURvY3VtZW50YXRpb24vRG9jQm9vay8gZGlyZWN0b3J5IGFuZCBjYW4gYmUgZ2VuZXJhdGVkIGFzIFBERiwKLVBvc3RzY3JpcHQsIEhUTUwsIGFuZCBtYW4gcGFnZXMgYnkgcnVubmluZzoKK2xvY2tpbmcgcHJvcGVybHkuCisKK0FsbCBzdWNoIGRvY3VtZW50cyBjYW4gYmUgZ2VuZXJhdGVkIGFzIFBERiBvciBIVE1MIGJ5IHJ1bm5pbmc6OgorCiAJbWFrZSBwZGZkb2NzCi0JbWFrZSBwc2RvY3MKIAltYWtlIGh0bWxkb2NzCi0JbWFrZSBtYW5kb2NzCisKIHJlc3BlY3RpdmVseSBmcm9tIHRoZSBtYWluIGtlcm5lbCBzb3VyY2UgZGlyZWN0b3J5LgogCitUaGUgZG9jdW1lbnRzIHRoYXQgdXNlcyBSZVNUIG1hcmt1cCB3aWxsIGJlIGdlbmVyYXRlZCBhdCBEb2N1bWVudGF0aW9uL291dHB1dC4KK1RoZXkgY2FuIGFsc28gYmUgZ2VuZXJhdGVkIG9uIExhVGVYIGFuZCBlUHViIGZvcm1hdHMgd2l0aDo6CisKKwltYWtlIGxhdGV4ZG9jcworCW1ha2UgZXB1YmRvY3MKKworQ3VycmVudGx5LCB0aGVyZSBhcmUgc29tZSBkb2N1bWVudHMgd3JpdHRlbiBvbiBEb2NCb29rIHRoYXQgYXJlIGluCit0aGUgcHJvY2VzcyBvZiBjb252ZXJzaW9uIHRvIFJlU1QuIFN1Y2ggZG9jdW1lbnRzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUKK0RvY3VtZW50YXRpb24vRG9jQm9vay8gZGlyZWN0b3J5IGFuZCBjYW4gYmUgZ2VuZXJhdGVkIGFsc28gYXMKK1Bvc3RzY3JpcHQgb3IgbWFuIHBhZ2VzIGJ5IHJ1bm5pbmc6OgorCisJbWFrZSBwc2RvY3MKKwltYWtlIG1hbmRvY3MKIAogQmVjb21pbmcgQSBLZXJuZWwgRGV2ZWxvcGVyCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogSWYgeW91IGRvIG5vdCBrbm93IGFueXRoaW5nIGFib3V0IExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudCwgeW91IHNob3VsZAogbG9vayBhdCB0aGUgTGludXggS2VybmVsTmV3YmllcyBwcm9qZWN0OgotCWh0dHA6Ly9rZXJuZWxuZXdiaWVzLm9yZworCisJaHR0cHM6Ly9rZXJuZWxuZXdiaWVzLm9yZworCiBJdCBjb25zaXN0cyBvZiBhIGhlbHBmdWwgbWFpbGluZyBsaXN0IHdoZXJlIHlvdSBjYW4gYXNrIGFsbW9zdCBhbnkgdHlwZQogb2YgYmFzaWMga2VybmVsIGRldmVsb3BtZW50IHF1ZXN0aW9uIChtYWtlIHN1cmUgdG8gc2VhcmNoIHRoZSBhcmNoaXZlcwogZmlyc3QsIGJlZm9yZSBhc2tpbmcgc29tZXRoaW5nIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBhbnN3ZXJlZCBpbiB0aGUKQEAgLTE4Nyw3ICsyMTEsOSBAQAogSWYgeW91IGRvIG5vdCBrbm93IHdoZXJlIHlvdSB3YW50IHRvIHN0YXJ0LCBidXQgeW91IHdhbnQgdG8gbG9vayBmb3IKIHNvbWUgdGFzayB0byBzdGFydCBkb2luZyB0byBqb2luIGludG8gdGhlIGtlcm5lbCBkZXZlbG9wbWVudCBjb21tdW5pdHksCiBnbyB0byB0aGUgTGludXggS2VybmVsIEphbml0b3IncyBwcm9qZWN0OgotCWh0dHA6Ly9rZXJuZWxuZXdiaWVzLm9yZy9LZXJuZWxKYW5pdG9ycworCisJaHR0cHM6Ly9rZXJuZWxuZXdiaWVzLm9yZy9LZXJuZWxKYW5pdG9ycworCiBJdCBpcyBhIGdyZWF0IHBsYWNlIHRvIHN0YXJ0LiAgSXQgZGVzY3JpYmVzIGEgbGlzdCBvZiByZWxhdGl2ZWx5IHNpbXBsZQogcHJvYmxlbXMgdGhhdCBuZWVkIHRvIGJlIGNsZWFuZWQgdXAgYW5kIGZpeGVkIHdpdGhpbiB0aGUgTGludXgga2VybmVsCiBzb3VyY2UgdHJlZS4gIFdvcmtpbmcgd2l0aCB0aGUgZGV2ZWxvcGVycyBpbiBjaGFyZ2Ugb2YgdGhpcyBwcm9qZWN0LCB5b3UKQEAgLTE5OSw3ICsyMjUsOCBAQAogdHJlZSwgYnV0IG5lZWQgc29tZSBoZWxwIGdldHRpbmcgaXQgaW4gdGhlIHByb3BlciBmb3JtLCB0aGUKIGtlcm5lbC1tZW50b3JzIHByb2plY3Qgd2FzIGNyZWF0ZWQgdG8gaGVscCB5b3Ugb3V0IHdpdGggdGhpcy4gIEl0IGlzIGEKIG1haWxpbmcgbGlzdCwgYW5kIGNhbiBiZSBmb3VuZCBhdDoKLQlodHRwOi8vc2VsZW5pYy5jb20vbWFpbG1hbi9saXN0aW5mby9rZXJuZWwtbWVudG9ycworCisJaHR0cHM6Ly9zZWxlbmljLmNvbS9tYWlsbWFuL2xpc3RpbmZvL2tlcm5lbC1tZW50b3JzCiAKIEJlZm9yZSBtYWtpbmcgYW55IGFjdHVhbCBtb2RpZmljYXRpb25zIHRvIHRoZSBMaW51eCBrZXJuZWwgY29kZSwgaXQgaXMKIGltcGVyYXRpdmUgdG8gdW5kZXJzdGFuZCBob3cgdGhlIGNvZGUgaW4gcXVlc3Rpb24gd29ya3MuICBGb3IgdGhpcwpAQCAtMjA5LDYgKzIzNiw3IEBACiBDcm9zcy1SZWZlcmVuY2UgcHJvamVjdCwgd2hpY2ggaXMgYWJsZSB0byBwcmVzZW50IHNvdXJjZSBjb2RlIGluIGEKIHNlbGYtcmVmZXJlbnRpYWwsIGluZGV4ZWQgd2VicGFnZSBmb3JtYXQuIEFuIGV4Y2VsbGVudCB1cC10by1kYXRlCiByZXBvc2l0b3J5IG9mIHRoZSBrZXJuZWwgY29kZSBtYXkgYmUgZm91bmQgYXQ6CisKIAlodHRwOi8vbHhyLmZyZWUtZWxlY3Ryb25zLmNvbS8KIAogCkBAIC0yMTgsNiArMjQ2LDcgQEAKIExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudCBwcm9jZXNzIGN1cnJlbnRseSBjb25zaXN0cyBvZiBhIGZldyBkaWZmZXJlbnQKIG1haW4ga2VybmVsICJicmFuY2hlcyIgYW5kIGxvdHMgb2YgZGlmZmVyZW50IHN1YnN5c3RlbS1zcGVjaWZpYyBrZXJuZWwKIGJyYW5jaGVzLiAgVGhlc2UgZGlmZmVyZW50IGJyYW5jaGVzIGFyZToKKwogICAtIG1haW4gNC54IGtlcm5lbCB0cmVlCiAgIC0gNC54LnkgLXN0YWJsZSBrZXJuZWwgdHJlZQogICAtIDQueCAtZ2l0IGtlcm5lbCBwYXRjaGVzCkBAIC0yMjcsMTQgKzI1NiwxNSBAQAogNC54IGtlcm5lbCB0cmVlCiAtLS0tLS0tLS0tLS0tLS0tLQogNC54IGtlcm5lbHMgYXJlIG1haW50YWluZWQgYnkgTGludXMgVG9ydmFsZHMsIGFuZCBjYW4gYmUgZm91bmQgb24KLWtlcm5lbC5vcmcgaW4gdGhlIHB1Yi9saW51eC9rZXJuZWwvdjQueC8gZGlyZWN0b3J5LiAgSXRzIGRldmVsb3BtZW50CitodHRwczovL2tlcm5lbC5vcmcgaW4gdGhlIHB1Yi9saW51eC9rZXJuZWwvdjQueC8gZGlyZWN0b3J5LiAgSXRzIGRldmVsb3BtZW50CiBwcm9jZXNzIGlzIGFzIGZvbGxvd3M6CisKICAgLSBBcyBzb29uIGFzIGEgbmV3IGtlcm5lbCBpcyByZWxlYXNlZCBhIHR3byB3ZWVrcyB3aW5kb3cgaXMgb3BlbiwKICAgICBkdXJpbmcgdGhpcyBwZXJpb2Qgb2YgdGltZSBtYWludGFpbmVycyBjYW4gc3VibWl0IGJpZyBkaWZmcyB0bwogICAgIExpbnVzLCB1c3VhbGx5IHRoZSBwYXRjaGVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gaW5jbHVkZWQgaW4gdGhlCiAgICAgLW5leHQga2VybmVsIGZvciBhIGZldyB3ZWVrcy4gIFRoZSBwcmVmZXJyZWQgd2F5IHRvIHN1Ym1pdCBiaWcgY2hhbmdlcwogICAgIGlzIHVzaW5nIGdpdCAodGhlIGtlcm5lbCdzIHNvdXJjZSBtYW5hZ2VtZW50IHRvb2wsIG1vcmUgaW5mb3JtYXRpb24KLSAgICBjYW4gYmUgZm91bmQgYXQgaHR0cDovL2dpdC1zY20uY29tLykgYnV0IHBsYWluIHBhdGNoZXMgYXJlIGFsc28ganVzdAorICAgIGNhbiBiZSBmb3VuZCBhdCBodHRwczovL2dpdC1zY20uY29tLykgYnV0IHBsYWluIHBhdGNoZXMgYXJlIGFsc28ganVzdAogICAgIGZpbmUuCiAgIC0gQWZ0ZXIgdHdvIHdlZWtzIGEgLXJjMSBrZXJuZWwgaXMgcmVsZWFzZWQgaXQgaXMgbm93IHBvc3NpYmxlIHRvIHB1c2gKICAgICBvbmx5IHBhdGNoZXMgdGhhdCBkbyBub3QgaW5jbHVkZSBuZXcgZmVhdHVyZXMgdGhhdCBjb3VsZCBhZmZlY3QgdGhlCkBAIC0yNTMsOSArMjgzLDEwIEBACiAKIEl0IGlzIHdvcnRoIG1lbnRpb25pbmcgd2hhdCBBbmRyZXcgTW9ydG9uIHdyb3RlIG9uIHRoZSBsaW51eC1rZXJuZWwKIG1haWxpbmcgbGlzdCBhYm91dCBrZXJuZWwgcmVsZWFzZXM6Ci0JIk5vYm9keSBrbm93cyB3aGVuIGEga2VybmVsIHdpbGwgYmUgcmVsZWFzZWQsIGJlY2F1c2UgaXQncworCisJKiJOb2JvZHkga25vd3Mgd2hlbiBhIGtlcm5lbCB3aWxsIGJlIHJlbGVhc2VkLCBiZWNhdXNlIGl0J3MKIAlyZWxlYXNlZCBhY2NvcmRpbmcgdG8gcGVyY2VpdmVkIGJ1ZyBzdGF0dXMsIG5vdCBhY2NvcmRpbmcgdG8gYQotCXByZWNvbmNlaXZlZCB0aW1lbGluZS4iCisJcHJlY29uY2VpdmVkIHRpbWVsaW5lLiIqCiAKIDQueC55IC1zdGFibGUga2VybmVsIHRyZWUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTMwMSw3ICszMzIsNyBAQAogTW9zdCBvZiB0aGVzZSByZXBvc2l0b3JpZXMgYXJlIGdpdCB0cmVlcywgYnV0IHRoZXJlIGFyZSBhbHNvIG90aGVyIFNDTXMKIGluIHVzZSwgb3IgcGF0Y2ggcXVldWVzIGJlaW5nIHB1Ymxpc2hlZCBhcyBxdWlsdCBzZXJpZXMuICBBZGRyZXNzZXMgb2YKIHRoZXNlIHN1YnN5c3RlbSByZXBvc2l0b3JpZXMgYXJlIGxpc3RlZCBpbiB0aGUgTUFJTlRBSU5FUlMgZmlsZS4gIE1hbnkKLW9mIHRoZW0gY2FuIGJlIGJyb3dzZWQgYXQgaHR0cDovL2dpdC5rZXJuZWwub3JnLy4KK29mIHRoZW0gY2FuIGJlIGJyb3dzZWQgYXQgaHR0cHM6Ly9naXQua2VybmVsLm9yZy8uCiAKIEJlZm9yZSBhIHByb3Bvc2VkIHBhdGNoIGlzIGNvbW1pdHRlZCB0byBzdWNoIGEgc3Vic3lzdGVtIHRyZWUsIGl0IGlzCiBzdWJqZWN0IHRvIHJldmlldyB3aGljaCBwcmltYXJpbHkgaGFwcGVucyBvbiBtYWlsaW5nIGxpc3RzIChzZWUgdGhlCkBAIC0zMTAsNyArMzQxLDcgQEAKIGludGVyZmFjZSB3aGljaCBzaG93cyBwYXRjaCBwb3N0aW5ncywgYW55IGNvbW1lbnRzIG9uIGEgcGF0Y2ggb3IKIHJldmlzaW9ucyB0byBpdCwgYW5kIG1haW50YWluZXJzIGNhbiBtYXJrIHBhdGNoZXMgYXMgdW5kZXIgcmV2aWV3LAogYWNjZXB0ZWQsIG9yIHJlamVjdGVkLiAgTW9zdCBvZiB0aGVzZSBwYXRjaHdvcmsgc2l0ZXMgYXJlIGxpc3RlZCBhdAotaHR0cDovL3BhdGNod29yay5rZXJuZWwub3JnLy4KK2h0dHBzOi8vcGF0Y2h3b3JrLmtlcm5lbC5vcmcvLgogCiA0LnggLW5leHQga2VybmVsIHRyZWUgZm9yIGludGVncmF0aW9uIHRlc3RzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zMTgsNyArMzQ5LDggQEAKIHRyZWUsIHRoZXkgbmVlZCB0byBiZSBpbnRlZ3JhdGlvbi10ZXN0ZWQuICBGb3IgdGhpcyBwdXJwb3NlLCBhIHNwZWNpYWwKIHRlc3RpbmcgcmVwb3NpdG9yeSBleGlzdHMgaW50byB3aGljaCB2aXJ0dWFsbHkgYWxsIHN1YnN5c3RlbSB0cmVlcyBhcmUKIHB1bGxlZCBvbiBhbiBhbG1vc3QgZGFpbHkgYmFzaXM6Ci0JaHR0cDovL2dpdC5rZXJuZWwub3JnLz9wPWxpbnV4L2tlcm5lbC9naXQvbmV4dC9saW51eC1uZXh0LmdpdAorCisJaHR0cHM6Ly9naXQua2VybmVsLm9yZy8/cD1saW51eC9rZXJuZWwvZ2l0L25leHQvbGludXgtbmV4dC5naXQKIAogVGhpcyB3YXksIHRoZSAtbmV4dCBrZXJuZWwgZ2l2ZXMgYSBzdW1tYXJ5IG91dGxvb2sgb250byB3aGF0IHdpbGwgYmUKIGV4cGVjdGVkIHRvIGdvIGludG8gdGhlIG1haW5saW5lIGtlcm5lbCBhdCB0aGUgbmV4dCBtZXJnZSBwZXJpb2QuCkBAIC0zMjgsMTAgKzM2MCwxMSBAQAogQnVnIFJlcG9ydGluZwogLS0tLS0tLS0tLS0tLQogCi1idWd6aWxsYS5rZXJuZWwub3JnIGlzIHdoZXJlIHRoZSBMaW51eCBrZXJuZWwgZGV2ZWxvcGVycyB0cmFjayBrZXJuZWwKK2h0dHBzOi8vYnVnemlsbGEua2VybmVsLm9yZyBpcyB3aGVyZSB0aGUgTGludXgga2VybmVsIGRldmVsb3BlcnMgdHJhY2sga2VybmVsCiBidWdzLiAgVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gcmVwb3J0IGFsbCBidWdzIHRoYXQgdGhleSBmaW5kIGluIHRoaXMKIHRvb2wuICBGb3IgZGV0YWlscyBvbiBob3cgdG8gdXNlIHRoZSBrZXJuZWwgYnVnemlsbGEsIHBsZWFzZSBzZWU6Ci0JaHR0cDovL2J1Z3ppbGxhLmtlcm5lbC5vcmcvcGFnZS5jZ2k/aWQ9ZmFxLmh0bWwKKworCWh0dHBzOi8vYnVnemlsbGEua2VybmVsLm9yZy9wYWdlLmNnaT9pZD1mYXEuaHRtbAogCiBUaGUgZmlsZSBSRVBPUlRJTkctQlVHUyBpbiB0aGUgbWFpbiBrZXJuZWwgc291cmNlIGRpcmVjdG9yeSBoYXMgYSBnb29kCiB0ZW1wbGF0ZSBmb3IgaG93IHRvIHJlcG9ydCBhIHBvc3NpYmxlIGtlcm5lbCBidWcsIGFuZCBkZXRhaWxzIHdoYXQga2luZApAQCAtMzQ5LDEzICszODIsMTQgQEAKIGJ1Z3MgaXMgb25lIG9mIHRoZSBiZXN0IHdheXMgdG8gZ2V0IG1lcml0cyBhbW9uZyBvdGhlciBkZXZlbG9wZXJzLCBiZWNhdXNlCiBub3QgbWFueSBwZW9wbGUgbGlrZSB3YXN0aW5nIHRpbWUgZml4aW5nIG90aGVyIHBlb3BsZSdzIGJ1Z3MuCiAKLVRvIHdvcmsgaW4gdGhlIGFscmVhZHkgcmVwb3J0ZWQgYnVnIHJlcG9ydHMsIGdvIHRvIGh0dHA6Ly9idWd6aWxsYS5rZXJuZWwub3JnLgorVG8gd29yayBpbiB0aGUgYWxyZWFkeSByZXBvcnRlZCBidWcgcmVwb3J0cywgZ28gdG8gaHR0cHM6Ly9idWd6aWxsYS5rZXJuZWwub3JnLgogSWYgeW91IHdhbnQgdG8gYmUgYWR2aXNlZCBvZiB0aGUgZnV0dXJlIGJ1ZyByZXBvcnRzLCB5b3UgY2FuIHN1YnNjcmliZSB0byB0aGUKIGJ1Z21lLW5ldyBtYWlsaW5nIGxpc3QgKG9ubHkgbmV3IGJ1ZyByZXBvcnRzIGFyZSBtYWlsZWQgaGVyZSkgb3IgdG8gdGhlCiBidWdtZS1qYW5pdG9yIG1haWxpbmcgbGlzdCAoZXZlcnkgY2hhbmdlIGluIHRoZSBidWd6aWxsYSBpcyBtYWlsZWQgaGVyZSkKIAotCWh0dHA6Ly9saXN0cy5saW51eC1mb3VuZGF0aW9uLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2J1Z21lLW5ldwotCWh0dHA6Ly9saXN0cy5saW51eC1mb3VuZGF0aW9uLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2J1Z21lLWphbml0b3JzCisJaHR0cHM6Ly9saXN0cy5saW51eC1mb3VuZGF0aW9uLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2J1Z21lLW5ldworCisJaHR0cHM6Ly9saXN0cy5saW51eC1mb3VuZGF0aW9uLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2J1Z21lLWphbml0b3JzCiAKIAogCkBAIC0zNjUsMTAgKzM5OSwxNCBAQAogQXMgc29tZSBvZiB0aGUgYWJvdmUgZG9jdW1lbnRzIGRlc2NyaWJlLCB0aGUgbWFqb3JpdHkgb2YgdGhlIGNvcmUga2VybmVsCiBkZXZlbG9wZXJzIHBhcnRpY2lwYXRlIG9uIHRoZSBMaW51eCBLZXJuZWwgTWFpbGluZyBsaXN0LiAgRGV0YWlscyBvbiBob3cKIHRvIHN1YnNjcmliZSBhbmQgdW5zdWJzY3JpYmUgZnJvbSB0aGUgbGlzdCBjYW4gYmUgZm91bmQgYXQ6CisKIAlodHRwOi8vdmdlci5rZXJuZWwub3JnL3ZnZXItbGlzdHMuaHRtbCNsaW51eC1rZXJuZWwKKwogVGhlcmUgYXJlIGFyY2hpdmVzIG9mIHRoZSBtYWlsaW5nIGxpc3Qgb24gdGhlIHdlYiBpbiBtYW55IGRpZmZlcmVudAogcGxhY2VzLiAgVXNlIGEgc2VhcmNoIGVuZ2luZSB0byBmaW5kIHRoZXNlIGFyY2hpdmVzLiAgRm9yIGV4YW1wbGU6CisKIAlodHRwOi8vZGlyLmdtYW5lLm9yZy9nbWFuZS5saW51eC5rZXJuZWwKKwogSXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgeW91IHNlYXJjaCB0aGUgYXJjaGl2ZXMgYWJvdXQgdGhlIHRvcGljCiB5b3Ugd2FudCB0byBicmluZyB1cCwgYmVmb3JlIHlvdSBwb3N0IGl0IHRvIHRoZSBsaXN0LiBBIGxvdCBvZiB0aGluZ3MKIGFscmVhZHkgZGlzY3Vzc2VkIGluIGRldGFpbCBhcmUgb25seSByZWNvcmRlZCBhdCB0aGUgbWFpbGluZyBsaXN0CkBAIC0zODEsMTEgKzQxOSwxMyBAQAogCiBNYW55IG9mIHRoZSBsaXN0cyBhcmUgaG9zdGVkIG9uIGtlcm5lbC5vcmcuIEluZm9ybWF0aW9uIG9uIHRoZW0gY2FuIGJlCiBmb3VuZCBhdDoKKwogCWh0dHA6Ly92Z2VyLmtlcm5lbC5vcmcvdmdlci1saXN0cy5odG1sCiAKIFBsZWFzZSByZW1lbWJlciB0byBmb2xsb3cgZ29vZCBiZWhhdmlvcmFsIGhhYml0cyB3aGVuIHVzaW5nIHRoZSBsaXN0cy4KIFRob3VnaCBhIGJpdCBjaGVlc3ksIHRoZSBmb2xsb3dpbmcgVVJMIGhhcyBzb21lIHNpbXBsZSBndWlkZWxpbmVzIGZvcgogaW50ZXJhY3Rpbmcgd2l0aCB0aGUgbGlzdCAob3IgYW55IGxpc3QpOgorCiAJaHR0cDovL3d3dy5hbGJpb24uY29tL25ldGlxdWV0dGUvCiAKIElmIG11bHRpcGxlIHBlb3BsZSByZXNwb25kIHRvIHlvdXIgbWFpbCwgdGhlIENDOiBsaXN0IG9mIHJlY2lwaWVudHMgbWF5CkBAIC00MDAsMTMgKzQ0MCwxNCBAQAogd3JpdGluZyBhdCB0aGUgdG9wIG9mIHRoZSBtYWlsLgogCiBJZiB5b3UgYWRkIHBhdGNoZXMgdG8geW91ciBtYWlsLCBtYWtlIHN1cmUgdGhleSBhcmUgcGxhaW4gcmVhZGFibGUgdGV4dAotYXMgc3RhdGVkIGluIERvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMuIEtlcm5lbCBkZXZlbG9wZXJzIGRvbid0Ci13YW50IHRvIGRlYWwgd2l0aCBhdHRhY2htZW50cyBvciBjb21wcmVzc2VkIHBhdGNoZXM7IHRoZXkgbWF5IHdhbnQKLXRvIGNvbW1lbnQgb24gaW5kaXZpZHVhbCBsaW5lcyBvZiB5b3VyIHBhdGNoLCB3aGljaCB3b3JrcyBvbmx5IHRoYXQgd2F5LgotTWFrZSBzdXJlIHlvdSB1c2UgYSBtYWlsIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBtYW5nbGUgc3BhY2VzIGFuZCB0YWIKLWNoYXJhY3RlcnMuIEEgZ29vZCBmaXJzdCB0ZXN0IGlzIHRvIHNlbmQgdGhlIG1haWwgdG8geW91cnNlbGYgYW5kIHRyeQotdG8gYXBwbHkgeW91ciBvd24gcGF0Y2ggYnkgeW91cnNlbGYuIElmIHRoYXQgZG9lc24ndCB3b3JrLCBnZXQgeW91cgotbWFpbCBwcm9ncmFtIGZpeGVkIG9yIGNoYW5nZSBpdCB1bnRpbCBpdCB3b3Jrcy4KK2FzIHN0YXRlZCBpbiBEb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzLgorS2VybmVsIGRldmVsb3BlcnMgZG9uJ3Qgd2FudCB0byBkZWFsIHdpdGgKK2F0dGFjaG1lbnRzIG9yIGNvbXByZXNzZWQgcGF0Y2hlczsgdGhleSBtYXkgd2FudCB0byBjb21tZW50IG9uCitpbmRpdmlkdWFsIGxpbmVzIG9mIHlvdXIgcGF0Y2gsIHdoaWNoIHdvcmtzIG9ubHkgdGhhdCB3YXkuIE1ha2Ugc3VyZSB5b3UKK3VzZSBhIG1haWwgcHJvZ3JhbSB0aGF0IGRvZXMgbm90IG1hbmdsZSBzcGFjZXMgYW5kIHRhYiBjaGFyYWN0ZXJzLiBBCitnb29kIGZpcnN0IHRlc3QgaXMgdG8gc2VuZCB0aGUgbWFpbCB0byB5b3Vyc2VsZiBhbmQgdHJ5IHRvIGFwcGx5IHlvdXIKK293biBwYXRjaCBieSB5b3Vyc2VsZi4gSWYgdGhhdCBkb2Vzbid0IHdvcmssIGdldCB5b3VyIG1haWwgcHJvZ3JhbSBmaXhlZAorb3IgY2hhbmdlIGl0IHVudGlsIGl0IHdvcmtzLgogCiBBYm92ZSBhbGwsIHBsZWFzZSByZW1lbWJlciB0byBzaG93IHJlc3BlY3QgdG8gb3RoZXIgc3Vic2NyaWJlcnMuCiAKQEAgLTQxOCw2ICs0NTksNyBAQAogdGhlcmUgaXMuICBXaGVuIHlvdSBzdWJtaXQgYSBwYXRjaCBmb3IgYWNjZXB0YW5jZSwgaXQgd2lsbCBiZSByZXZpZXdlZAogb24gaXRzIHRlY2huaWNhbCBtZXJpdHMgYW5kIHRob3NlIGFsb25lLiAgU28sIHdoYXQgc2hvdWxkIHlvdSBiZQogZXhwZWN0aW5nPworCiAgIC0gY3JpdGljaXNtCiAgIC0gY29tbWVudHMKICAgLSByZXF1ZXN0cyBmb3IgY2hhbmdlCkBAIC00MzIsNiArNDc0LDcgQEAKIGFnYWluLCBzb21ldGltZXMgdGhpbmdzIGdldCBsb3N0IGluIHRoZSBodWdlIHZvbHVtZS4KIAogV2hhdCBzaG91bGQgeW91IG5vdCBkbz8KKwogICAtIGV4cGVjdCB5b3VyIHBhdGNoIHRvIGJlIGFjY2VwdGVkIHdpdGhvdXQgcXVlc3Rpb24KICAgLSBiZWNvbWUgZGVmZW5zaXZlCiAgIC0gaWdub3JlIGNvbW1lbnRzCkBAIC00NDUsOCArNDg4LDggQEAKIHRvd2FyZCBhIHNvbHV0aW9uIHRoYXQgaXMgcmlnaHQuCiAKIEl0IGlzIG5vcm1hbCB0aGF0IHRoZSBhbnN3ZXJzIHRvIHlvdXIgZmlyc3QgcGF0Y2ggbWlnaHQgc2ltcGx5IGJlIGEgbGlzdAotb2YgYSBkb3plbiB0aGluZ3MgeW91IHNob3VsZCBjb3JyZWN0LiAgVGhpcyBkb2VzIF9ub3RfIGltcGx5IHRoYXQgeW91cgotcGF0Y2ggd2lsbCBub3QgYmUgYWNjZXB0ZWQsIGFuZCBpdCBpcyBfbm90XyBtZWFudCBhZ2FpbnN0IHlvdQorb2YgYSBkb3plbiB0aGluZ3MgeW91IHNob3VsZCBjb3JyZWN0LiAgVGhpcyBkb2VzICoqbm90KiogaW1wbHkgdGhhdCB5b3VyCitwYXRjaCB3aWxsIG5vdCBiZSBhY2NlcHRlZCwgYW5kIGl0IGlzICoqbm90KiogbWVhbnQgYWdhaW5zdCB5b3UKIHBlcnNvbmFsbHkuICBTaW1wbHkgY29ycmVjdCBhbGwgaXNzdWVzIHJhaXNlZCBhZ2FpbnN0IHlvdXIgcGF0Y2ggYW5kCiByZXNlbmQgaXQuCiAKQEAgLTQ1Nyw3ICs1MDAsOSBAQAogVGhlIGtlcm5lbCBjb21tdW5pdHkgd29ya3MgZGlmZmVyZW50bHkgdGhhbiBtb3N0IHRyYWRpdGlvbmFsIGNvcnBvcmF0ZQogZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzLiAgSGVyZSBhcmUgYSBsaXN0IG9mIHRoaW5ncyB0aGF0IHlvdSBjYW4gdHJ5IHRvCiBkbyB0byBhdm9pZCBwcm9ibGVtczoKKwogICBHb29kIHRoaW5ncyB0byBzYXkgcmVnYXJkaW5nIHlvdXIgcHJvcG9zZWQgY2hhbmdlczoKKwogICAgIC0gIlRoaXMgc29sdmVzIG11bHRpcGxlIHByb2JsZW1zLiIKICAgICAtICJUaGlzIGRlbGV0ZXMgMjAwMCBsaW5lcyBvZiBjb2RlLiIKICAgICAtICJIZXJlIGlzIGEgcGF0Y2ggdGhhdCBleHBsYWlucyB3aGF0IEkgYW0gdHJ5aW5nIHRvIGRlc2NyaWJlLiIKQEAgLTQ2Niw2ICs1MTEsNyBAQAogICAgIC0gIlRoaXMgaW5jcmVhc2VzIHBlcmZvcm1hbmNlIG9uIHR5cGljYWwgbWFjaGluZXMuLi4iCiAKICAgQmFkIHRoaW5ncyB5b3Ugc2hvdWxkIGF2b2lkIHNheWluZzoKKwogICAgIC0gIldlIGRpZCBpdCB0aGlzIHdheSBpbiBBSVgvcHR4L1NvbGFyaXMsIHNvIHRoZXJlZm9yZSBpdCBtdXN0IGJlCiAgICAgICBnb29kLi4uIgogICAgIC0gIkkndmUgYmVpbmcgZG9pbmcgdGhpcyBmb3IgMjAgeWVhcnMsIHNvLi4uIgpAQCAtNTI3LDE3ICs1NzMsMTggQEAKICAgIGFuZCBzaW1wbGlmeSAob3Igc2ltcGx5IHJlLW9yZGVyKSBwYXRjaGVzIGJlZm9yZSBzdWJtaXR0aW5nIHRoZW0uCiAKIEhlcmUgaXMgYW4gYW5hbG9neSBmcm9tIGtlcm5lbCBkZXZlbG9wZXIgQWwgVmlybzoKLQkiVGhpbmsgb2YgYSB0ZWFjaGVyIGdyYWRpbmcgaG9tZXdvcmsgZnJvbSBhIG1hdGggc3R1ZGVudC4gIFRoZQorCisJKiJUaGluayBvZiBhIHRlYWNoZXIgZ3JhZGluZyBob21ld29yayBmcm9tIGEgbWF0aCBzdHVkZW50LiAgVGhlCiAJdGVhY2hlciBkb2VzIG5vdCB3YW50IHRvIHNlZSB0aGUgc3R1ZGVudCdzIHRyaWFscyBhbmQgZXJyb3JzCiAJYmVmb3JlIHRoZXkgY2FtZSB1cCB3aXRoIHRoZSBzb2x1dGlvbi4gVGhleSB3YW50IHRvIHNlZSB0aGUKIAljbGVhbmVzdCwgbW9zdCBlbGVnYW50IGFuc3dlci4gIEEgZ29vZCBzdHVkZW50IGtub3dzIHRoaXMsIGFuZAogCXdvdWxkIG5ldmVyIHN1Ym1pdCBoZXIgaW50ZXJtZWRpYXRlIHdvcmsgYmVmb3JlIHRoZSBmaW5hbAotCXNvbHV0aW9uLiIKKwlzb2x1dGlvbi4qCiAKLQlUaGUgc2FtZSBpcyB0cnVlIG9mIGtlcm5lbCBkZXZlbG9wbWVudC4gVGhlIG1haW50YWluZXJzIGFuZAorCSpUaGUgc2FtZSBpcyB0cnVlIG9mIGtlcm5lbCBkZXZlbG9wbWVudC4gVGhlIG1haW50YWluZXJzIGFuZAogCXJldmlld2VycyBkbyBub3Qgd2FudCB0byBzZWUgdGhlIHRob3VnaHQgcHJvY2VzcyBiZWhpbmQgdGhlCiAJc29sdXRpb24gdG8gdGhlIHByb2JsZW0gb25lIGlzIHNvbHZpbmcuIFRoZXkgd2FudCB0byBzZWUgYQotCXNpbXBsZSBhbmQgZWxlZ2FudCBzb2x1dGlvbi4iCisJc2ltcGxlIGFuZCBlbGVnYW50IHNvbHV0aW9uLiIqCiAKIEl0IG1heSBiZSBjaGFsbGVuZ2luZyB0byBrZWVwIHRoZSBiYWxhbmNlIGJldHdlZW4gcHJlc2VudGluZyBhbiBlbGVnYW50CiBzb2x1dGlvbiBhbmQgd29ya2luZyB0b2dldGhlciB3aXRoIHRoZSBjb21tdW5pdHkgYW5kIGRpc2N1c3NpbmcgeW91cgpAQCAtNTY1LDYgKzYxMiw3IEBACiB0aGUgdGV4dCBpbiB5b3VyIGVtYWlsLiAgVGhpcyBpbmZvcm1hdGlvbiB3aWxsIGJlY29tZSB0aGUgQ2hhbmdlTG9nCiBpbmZvcm1hdGlvbiBmb3IgdGhlIHBhdGNoLCBhbmQgd2lsbCBiZSBwcmVzZXJ2ZWQgZm9yIGV2ZXJ5b25lIHRvIHNlZSBmb3IKIGFsbCB0aW1lLiAgSXQgc2hvdWxkIGRlc2NyaWJlIHRoZSBwYXRjaCBjb21wbGV0ZWx5LCBjb250YWluaW5nOgorCiAgIC0gd2h5IHRoZSBjaGFuZ2UgaXMgbmVjZXNzYXJ5CiAgIC0gdGhlIG92ZXJhbGwgZGVzaWduIGFwcHJvYWNoIGluIHRoZSBwYXRjaAogICAtIGltcGxlbWVudGF0aW9uIGRldGFpbHMKQEAgLTU3MiwxMiArNjIwLDExIEBACiAKIEZvciBtb3JlIGRldGFpbHMgb24gd2hhdCB0aGlzIHNob3VsZCBhbGwgbG9vayBsaWtlLCBwbGVhc2Ugc2VlIHRoZQogQ2hhbmdlTG9nIHNlY3Rpb24gb2YgdGhlIGRvY3VtZW50OgorCiAgICJUaGUgUGVyZmVjdCBQYXRjaCIKICAgICAgIGh0dHA6Ly93d3cub3psYWJzLm9yZy9+YWtwbS9zdHVmZi90cHAudHh0CiAKIAotCi0KIEFsbCBvZiB0aGVzZSB0aGluZ3MgYXJlIHNvbWV0aW1lcyB2ZXJ5IGhhcmQgdG8gZG8uIEl0IGNhbiB0YWtlIHllYXJzIHRvCiBwZXJmZWN0IHRoZXNlIHByYWN0aWNlcyAoaWYgYXQgYWxsKS4gSXQncyBhIGNvbnRpbnVvdXMgcHJvY2VzcyBvZgogaW1wcm92ZW1lbnQgdGhhdCByZXF1aXJlcyBhIGxvdCBvZiBwYXRpZW5jZSBhbmQgZGV0ZXJtaW5hdGlvbi4gQnV0CkBAIC01ODgsOCArNjM1LDkgQEAKIAogCiAtLS0tLS0tLS0tCisKIFRoYW5rcyB0byBQYW9sbyBDaWFycm9jY2hpIHdobyBhbGxvd2VkIHRoZSAiRGV2ZWxvcG1lbnQgUHJvY2VzcyIKLShodHRwOi8vbHduLm5ldC9BcnRpY2xlcy85NDM4Ni8pIHNlY3Rpb24KKyhodHRwczovL2x3bi5uZXQvQXJ0aWNsZXMvOTQzODYvKSBzZWN0aW9uCiB0byBiZSBiYXNlZCBvbiB0ZXh0IGhlIGhhZCB3cml0dGVuLCBhbmQgdG8gUmFuZHkgRHVubGFwIGFuZCBHZXJyaXQKIEh1aXplbmdhIGZvciBzb21lIG9mIHRoZSBsaXN0IG9mIHRoaW5ncyB5b3Ugc2hvdWxkIGFuZCBzaG91bGQgbm90IHNheS4KIEFsc28gdGhhbmtzIHRvIFBhdCBNb2NoZWwsIEhhbm5hIExpbmRlciwgUmFuZHkgRHVubGFwLCBLYXkgU2lldmVycywKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vTWFrZWZpbGUuc3BoaW54IGIvRG9jdW1lbnRhdGlvbi9NYWtlZmlsZS5zcGhpbngKaW5kZXggODU3ZjFlMi4uOTJkZWVhMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9NYWtlZmlsZS5zcGhpbngKKysrIGIvRG9jdW1lbnRhdGlvbi9NYWtlZmlsZS5zcGhpbngKQEAgLTUsNiArNSw5IEBACiAjIFlvdSBjYW4gc2V0IHRoZXNlIHZhcmlhYmxlcyBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCiBTUEhJTlhCVUlMRCAgID0gc3BoaW54LWJ1aWxkCiBTUEhJTlhPUFRTICAgID0KK1NQSElOWERJUlMgICAgPSAuCitfU1BISU5YRElSUyAgID0gJChwYXRzdWJzdCAkKHNyY3RyZWUpL0RvY3VtZW50YXRpb24vJS9jb25mLnB5LCUsJCh3aWxkY2FyZCAkKHNyY3RyZWUpL0RvY3VtZW50YXRpb24vKi9jb25mLnB5KSkKK1NQSElOWF9DT05GICAgPSBjb25mLnB5CiBQQVBFUiAgICAgICAgID0KIEJVSUxERElSICAgICAgPSAkKG9iaikvb3V0cHV0CiAKQEAgLTI1LDM4ICsyOCw2MiBAQAogCiBlbHNlICMgSEFWRV9TUEhJTlgKIAotIyBVc2VyLWZyaWVuZGx5IGNoZWNrIGZvciByc3QycGRmCi1IQVZFX1JTVDJQREYgOj0gJChzaGVsbCBpZiBweXRob24gLWMgImltcG9ydCByc3QycGRmIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gZWNobyAxOyBlbHNlIGVjaG8gMDsgZmkpCisjIFVzZXItZnJpZW5kbHkgY2hlY2sgZm9yIHBkZmxhdGV4CitIQVZFX1BERkxBVEVYIDo9ICQoc2hlbGwgaWYgd2hpY2ggeGVsYXRleCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gZWNobyAxOyBlbHNlIGVjaG8gMDsgZmkpCiAKICMgSW50ZXJuYWwgdmFyaWFibGVzLgogUEFQRVJPUFRfYTQgICAgID0gLUQgbGF0ZXhfcGFwZXJfc2l6ZT1hNAogUEFQRVJPUFRfbGV0dGVyID0gLUQgbGF0ZXhfcGFwZXJfc2l6ZT1sZXR0ZXIKIEtFUk5FTERPQyAgICAgICA9ICQoc3JjdHJlZSkvc2NyaXB0cy9rZXJuZWwtZG9jCiBLRVJORUxET0NfQ09ORiAgPSAtRCBrZXJuZWxkb2Nfc3JjdHJlZT0kKHNyY3RyZWUpIC1EIGtlcm5lbGRvY19iaW49JChLRVJORUxET0MpCi1BTExTUEhJTlhPUFRTICAgPSAtRCB2ZXJzaW9uPSQoS0VSTkVMVkVSU0lPTikgLUQgcmVsZWFzZT0kKEtFUk5FTFJFTEVBU0UpIC1kICQoQlVJTERESVIpLy5kb2N0cmVlcyAkKEtFUk5FTERPQ19DT05GKSAkKFBBUEVST1BUXyQoUEFQRVIpKSAtYyAkKHNyY3RyZWUpLyQoc3JjKSAkKFNQSElOWE9QVFMpICQoc3JjdHJlZSkvJChzcmMpCitBTExTUEhJTlhPUFRTICAgPSAgJChLRVJORUxET0NfQ09ORikgJChQQVBFUk9QVF8kKFBBUEVSKSkgJChTUEhJTlhPUFRTKQogIyB0aGUgaTE4biBidWlsZGVyIGNhbm5vdCBzaGFyZSB0aGUgZW52aXJvbm1lbnQgYW5kIGRvY3RyZWVzIHdpdGggdGhlIG90aGVycwogSTE4TlNQSElOWE9QVFMgID0gJChQQVBFUk9QVF8kKFBBUEVSKSkgJChTUEhJTlhPUFRTKSAuCiAKLXF1aWV0X2NtZF9zcGhpbnggPSBTUEhJTlggICRACi0gICAgICBjbWRfc3BoaW54ID0gQlVJTERESVI9JChCVUlMRERJUikgJChTUEhJTlhCVUlMRCkgLWIgJDIgJChBTExTUEhJTlhPUFRTKSAkKEJVSUxERElSKS8kMgorIyBjb21tYW5kczsgdGhlICdjbWQnIGZyb20gc2NyaXB0cy9LYnVpbGQuaW5jbHVkZSBpcyBub3QgKmxvb3BhYmxlKgorbG9vcF9jbWQgPSAkKGVjaG8tY21kKSAkKGNtZF8kKDEpKQorCisjICQyIHNwaGlueCBidWlsZGVyIGUuZy4gImh0bWwiCisjICQzIG5hbWUgb2YgdGhlIGJ1aWxkIHN1YmZvbGRlciAvIGUuZy4gIm1lZGlhIiwgdXNlZCBhczoKKyMgICAgKiBkZXN0IGZvbGRlciByZWxhdGl2ZSB0byAkKEJVSUxERElSKSBhbmQKKyMgICAgKiBjYWNoZSBmb2xkZXIgcmVsYXRpdmUgdG8gJChCVUlMRERJUikvLmRvY3RyZWVzCisjICQ0IGRlc3Qgc3ViZm9sZGVyIGUuZy4gIm1hbiIgZm9yIG1hbiBwYWdlcyBhdCBtZWRpYS9tYW4KKyMgJDUgcmVTVCBzb3VyY2UgZm9sZGVyIHJlbGF0aXZlIHRvICQoc3JjdHJlZSkvJChzcmMpLAorIyAgICBlLmcuICJtZWRpYSIgZm9yIHRoZSBsaW51eC10diBib29rLXNldCBhdCAuL0RvY3VtZW50YXRpb24vbWVkaWEKKworcXVpZXRfY21kX3NwaGlueCA9IFNQSElOWCAgJEAgLS0+IGZpbGU6Ly8kKGFic3BhdGggJChCVUlMRERJUikvJDMvJDQpOworICAgICAgY21kX3NwaGlueCA9ICQoTUFLRSkgQlVJTERESVI9JChhYnNwYXRoICQoQlVJTERESVIpKSAkKGJ1aWxkKT1Eb2N1bWVudGF0aW9uL21lZGlhIGFsbDtcCisJQlVJTERESVI9JChhYnNwYXRoICQoQlVJTERESVIpKSBTUEhJTlhfQ09ORj0kKGFic3BhdGggJChzcmN0cmVlKS8kKHNyYykvJDUvJChTUEhJTlhfQ09ORikpIFwKKwkkKFNQSElOWEJVSUxEKSBcCisJLWIgJDIgXAorCS1jICQoYWJzcGF0aCAkKHNyY3RyZWUpLyQoc3JjKSkgXAorCS1kICQoYWJzcGF0aCAkKEJVSUxERElSKS8uZG9jdHJlZXMvJDMpIFwKKwktRCB2ZXJzaW9uPSQoS0VSTkVMVkVSU0lPTikgLUQgcmVsZWFzZT0kKEtFUk5FTFJFTEVBU0UpIFwKKwkkKEFMTFNQSElOWE9QVFMpIFwKKwkkKGFic3BhdGggJChzcmN0cmVlKS8kKHNyYykvJDUpIFwKKwkkKGFic3BhdGggJChCVUlMRERJUikvJDMvJDQpOwogCiBodG1sZG9jczoKLQkkKE1BS0UpIEJVSUxERElSPSQoQlVJTERESVIpIC1mICQoc3JjdHJlZSkvRG9jdW1lbnRhdGlvbi9tZWRpYS9NYWtlZmlsZSAkQAotCSQoY2FsbCBjbWQsc3BoaW54LGh0bWwpCisJQCQoZm9yZWFjaCB2YXIsJChTUEhJTlhESVJTKSwkKGNhbGwgbG9vcF9jbWQsc3BoaW54LGh0bWwsJCh2YXIpLCwkKHZhcikpKQogCi1wZGZkb2NzOgotaWZlcSAoJChIQVZFX1JTVDJQREYpLDApCi0JJCh3YXJuaW5nIFRoZSBQeXRob24gJ3JzdDJwZGYnIG1vZHVsZSB3YXMgbm90IGZvdW5kLiBNYWtlIHN1cmUgeW91IGhhdmUgdGhlIG1vZHVsZSBpbnN0YWxsZWQgdG8gcHJvZHVjZSBQREYgb3V0cHV0LikKK2xhdGV4ZG9jczoKK2lmZXEgKCQoSEFWRV9QREZMQVRFWCksMCkKKwkkKHdhcm5pbmcgVGhlICd4ZWxhdGV4JyBjb21tYW5kIHdhcyBub3QgZm91bmQuIE1ha2Ugc3VyZSB5b3UgaGF2ZSBpdCBpbnN0YWxsZWQgYW5kIGluIFBBVEggdG8gcHJvZHVjZSBQREYgb3V0cHV0LikKIAlAZWNobyAiICBTS0lQICAgIFNwaGlueCAkQCB0YXJnZXQuIgotZWxzZSAjIEhBVkVfUlNUMlBERgotCSQoY2FsbCBjbWQsc3BoaW54LHBkZikKLWVuZGlmICMgSEFWRV9SU1QyUERGCitlbHNlICMgSEFWRV9QREZMQVRFWAorCUAkKGZvcmVhY2ggdmFyLCQoU1BISU5YRElSUyksJChjYWxsIGxvb3BfY21kLHNwaGlueCxsYXRleCwkKHZhciksbGF0ZXgsJCh2YXIpKSkKK2VuZGlmICMgSEFWRV9QREZMQVRFWAorCitwZGZkb2NzOiBsYXRleGRvY3MKK2lmbmVxICgkKEhBVkVfUERGTEFURVgpLDApCisJJChmb3JlYWNoIHZhciwkKFNQSElOWERJUlMpLCAkKE1BS0UpIFBERkxBVEVYPXhlbGF0ZXggTEFURVhPUFRTPSItaW50ZXJhY3Rpb249bm9uc3RvcG1vZGUiIC1DICQoQlVJTERESVIpLyQodmFyKS9sYXRleCkKK2VuZGlmICMgSEFWRV9QREZMQVRFWAogCiBlcHViZG9jczoKLQkkKGNhbGwgY21kLHNwaGlueCxlcHViKQorCUAkKGZvcmVhY2ggdmFyLCQoU1BISU5YRElSUyksJChjYWxsIGxvb3BfY21kLHNwaGlueCxlcHViLCQodmFyKSxlcHViLCQodmFyKSkpCiAKIHhtbGRvY3M6Ci0JJChjYWxsIGNtZCxzcGhpbngseG1sKQorCUAkKGZvcmVhY2ggdmFyLCQoU1BISU5YRElSUyksJChjYWxsIGxvb3BfY21kLHNwaGlueCx4bWwsJCh2YXIpLHhtbCwkKHZhcikpKQogCiAjIG5vLW9wcyBmb3IgdGhlIFNwaGlueCB0b29sY2hhaW4KIHNnbWxkb2NzOgpAQCAtNzIsNyArOTksMTQgQEAKIGRvY2hlbHA6CiAJQGVjaG8gICcgTGludXgga2VybmVsIGludGVybmFsIGRvY3VtZW50YXRpb24gaW4gZGlmZmVyZW50IGZvcm1hdHMgKFNwaGlueCk6JwogCUBlY2hvICAnICBodG1sZG9jcyAgICAgICAgLSBIVE1MJworCUBlY2hvICAnICBsYXRleGRvY3MgICAgICAgLSBMYVRlWCcKIAlAZWNobyAgJyAgcGRmZG9jcyAgICAgICAgIC0gUERGJwogCUBlY2hvICAnICBlcHViZG9jcyAgICAgICAgLSBFUFVCJwogCUBlY2hvICAnICB4bWxkb2NzICAgICAgICAgLSBYTUwnCiAJQGVjaG8gICcgIGNsZWFuZG9jcyAgICAgICAtIGNsZWFuIGFsbCBnZW5lcmF0ZWQgZmlsZXMnCisJQGVjaG8KKwlAZWNobyAgJyAgbWFrZSBTUEhJTlhESVJTPSJzMSBzMiIgW3RhcmdldF0gR2VuZXJhdGUgb25seSBkb2NzIG9mIGZvbGRlciBzMSwgczInCisJQGVjaG8gICcgIHZhbGlkIHZhbHVlcyBmb3IgU1BISU5YRElSUyBhcmU6ICQoX1NQSElOWERJUlMpJworCUBlY2hvCisJQGVjaG8gICcgIG1ha2UgU1BISU5YX0NPTkY9e2NvbmYtZmlsZX0gW3RhcmdldF0gdXNlICphZGRpdGlvbmFsKiBzcGhpbngtYnVpbGQnCisJQGVjaG8gICcgIGNvbmZpZ3VyYXRpb24uIFRoaXMgaXMgZS5nLiB1c2VmdWwgdG8gYnVpbGQgd2l0aCBuaXQtcGlja2luZyBjb25maWcuJwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9NYW5hZ2VtZW50U3R5bGUgYi9Eb2N1bWVudGF0aW9uL01hbmFnZW1lbnRTdHlsZQppbmRleCBhMjExZWU4Li5kZWEyZTY2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL01hbmFnZW1lbnRTdHlsZQorKysgYi9Eb2N1bWVudGF0aW9uL01hbmFnZW1lbnRTdHlsZQpAQCAtMSwxMCArMSwxMiBAQAorLi4gX21hbmFnZW1lbnRzdHlsZToKIAotICAgICAgICAgICAgICAgIExpbnV4IGtlcm5lbCBtYW5hZ2VtZW50IHN0eWxlCitMaW51eCBrZXJuZWwgbWFuYWdlbWVudCBzdHlsZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogVGhpcyBpcyBhIHNob3J0IGRvY3VtZW50IGRlc2NyaWJpbmcgdGhlIHByZWZlcnJlZCAob3IgbWFkZSB1cCwgZGVwZW5kaW5nCiBvbiB3aG8geW91IGFzaykgbWFuYWdlbWVudCBzdHlsZSBmb3IgdGhlIGxpbnV4IGtlcm5lbC4gIEl0J3MgbWVhbnQgdG8KIG1pcnJvciB0aGUgQ29kaW5nU3R5bGUgZG9jdW1lbnQgdG8gc29tZSBkZWdyZWUsIGFuZCBtYWlubHkgd3JpdHRlbiB0bwotYXZvaWQgYW5zd2VyaW5nICgqKSB0aGUgc2FtZSAob3Igc2ltaWxhcikgcXVlc3Rpb25zIG92ZXIgYW5kIG92ZXIgYWdhaW4uIAorYXZvaWQgYW5zd2VyaW5nIFsjZjFdXyAgdGhlIHNhbWUgKG9yIHNpbWlsYXIpIHF1ZXN0aW9ucyBvdmVyIGFuZCBvdmVyIGFnYWluLgogCiBNYW5hZ2VtZW50IHN0eWxlIGlzIHZlcnkgcGVyc29uYWwgYW5kIG11Y2ggaGFyZGVyIHRvIHF1YW50aWZ5IHRoYW4KIHNpbXBsZSBjb2Rpbmcgc3R5bGUgcnVsZXMsIHNvIHRoaXMgZG9jdW1lbnQgbWF5IG9yIG1heSBub3QgaGF2ZSBhbnl0aGluZwpAQCAtMTQsNTAgKzE2LDUyIEBACiBCdHcsIHdoZW4gdGFsa2luZyBhYm91dCAia2VybmVsIG1hbmFnZXIiLCBpdCdzIGFsbCBhYm91dCB0aGUgdGVjaG5pY2FsCiBsZWFkIHBlcnNvbnMsIG5vdCB0aGUgcGVvcGxlIHdobyBkbyB0cmFkaXRpb25hbCBtYW5hZ2VtZW50IGluc2lkZQogY29tcGFuaWVzLiAgSWYgeW91IHNpZ24gcHVyY2hhc2Ugb3JkZXJzIG9yIHlvdSBoYXZlIGFueSBjbHVlIGFib3V0IHRoZQotYnVkZ2V0IG9mIHlvdXIgZ3JvdXAsIHlvdSdyZSBhbG1vc3QgY2VydGFpbmx5IG5vdCBhIGtlcm5lbCBtYW5hZ2VyLiAKLVRoZXNlIHN1Z2dlc3Rpb25zIG1heSBvciBtYXkgbm90IGFwcGx5IHRvIHlvdS4gCitidWRnZXQgb2YgeW91ciBncm91cCwgeW91J3JlIGFsbW9zdCBjZXJ0YWlubHkgbm90IGEga2VybmVsIG1hbmFnZXIuCitUaGVzZSBzdWdnZXN0aW9ucyBtYXkgb3IgbWF5IG5vdCBhcHBseSB0byB5b3UuCiAKIEZpcnN0IG9mZiwgSSdkIHN1Z2dlc3QgYnV5aW5nICJTZXZlbiBIYWJpdHMgb2YgSGlnaGx5IEVmZmVjdGl2ZQotUGVvcGxlIiwgYW5kIE5PVCByZWFkIGl0LiAgQnVybiBpdCwgaXQncyBhIGdyZWF0IHN5bWJvbGljIGdlc3R1cmUuIAorUGVvcGxlIiwgYW5kIE5PVCByZWFkIGl0LiAgQnVybiBpdCwgaXQncyBhIGdyZWF0IHN5bWJvbGljIGdlc3R1cmUuCiAKLSgqKSBUaGlzIGRvY3VtZW50IGRvZXMgc28gbm90IHNvIG11Y2ggYnkgYW5zd2VyaW5nIHRoZSBxdWVzdGlvbiwgYnV0IGJ5Ci1tYWtpbmcgaXQgcGFpbmZ1bGx5IG9idmlvdXMgdG8gdGhlIHF1ZXN0aW9uZXIgdGhhdCB3ZSBkb24ndCBoYXZlIGEgY2x1ZQotdG8gd2hhdCB0aGUgYW5zd2VyIGlzLiAKKy4uIFsjZjFdIFRoaXMgZG9jdW1lbnQgZG9lcyBzbyBub3Qgc28gbXVjaCBieSBhbnN3ZXJpbmcgdGhlIHF1ZXN0aW9uLCBidXQgYnkKKyAgbWFraW5nIGl0IHBhaW5mdWxseSBvYnZpb3VzIHRvIHRoZSBxdWVzdGlvbmVyIHRoYXQgd2UgZG9uJ3QgaGF2ZSBhIGNsdWUKKyAgdG8gd2hhdCB0aGUgYW5zd2VyIGlzLgogCiBBbnl3YXksIGhlcmUgZ29lczoKIAorLi4gX2RlY2lzaW9uczoKIAotCQlDaGFwdGVyIDE6IERlY2lzaW9ucworMSkgRGVjaXNpb25zCistLS0tLS0tLS0tLS0KIAogRXZlcnlib2R5IHRoaW5rcyBtYW5hZ2VycyBtYWtlIGRlY2lzaW9ucywgYW5kIHRoYXQgZGVjaXNpb24tbWFraW5nIGlzCiBpbXBvcnRhbnQuICBUaGUgYmlnZ2VyIGFuZCBtb3JlIHBhaW5mdWwgdGhlIGRlY2lzaW9uLCB0aGUgYmlnZ2VyIHRoZQogbWFuYWdlciBtdXN0IGJlIHRvIG1ha2UgaXQuICBUaGF0J3MgdmVyeSBkZWVwIGFuZCBvYnZpb3VzLCBidXQgaXQncyBub3QKLWFjdHVhbGx5IHRydWUuIAorYWN0dWFsbHkgdHJ1ZS4KIAotVGhlIG5hbWUgb2YgdGhlIGdhbWUgaXMgdG8gX2F2b2lkXyBoYXZpbmcgdG8gbWFrZSBhIGRlY2lzaW9uLiAgSW4KK1RoZSBuYW1lIG9mIHRoZSBnYW1lIGlzIHRvICoqYXZvaWQqKiBoYXZpbmcgdG8gbWFrZSBhIGRlY2lzaW9uLiAgSW4KIHBhcnRpY3VsYXIsIGlmIHNvbWVib2R5IHRlbGxzIHlvdSAiY2hvb3NlIChhKSBvciAoYiksIHdlIHJlYWxseSBuZWVkIHlvdQogdG8gZGVjaWRlIG9uIHRoaXMiLCB5b3UncmUgaW4gdHJvdWJsZSBhcyBhIG1hbmFnZXIuICBUaGUgcGVvcGxlIHlvdQogbWFuYWdlIGhhZCBiZXR0ZXIga25vdyB0aGUgZGV0YWlscyBiZXR0ZXIgdGhhbiB5b3UsIHNvIGlmIHRoZXkgY29tZSB0bwogeW91IGZvciBhIHRlY2huaWNhbCBkZWNpc2lvbiwgeW91J3JlIHNjcmV3ZWQuICBZb3UncmUgY2xlYXJseSBub3QKLWNvbXBldGVudCB0byBtYWtlIHRoYXQgZGVjaXNpb24gZm9yIHRoZW0uIAorY29tcGV0ZW50IHRvIG1ha2UgdGhhdCBkZWNpc2lvbiBmb3IgdGhlbS4KIAogKENvcm9sbGFyeTppZiB0aGUgcGVvcGxlIHlvdSBtYW5hZ2UgZG9uJ3Qga25vdyB0aGUgZGV0YWlscyBiZXR0ZXIgdGhhbgoteW91LCB5b3UncmUgYWxzbyBzY3Jld2VkLCBhbHRob3VnaCBmb3IgYSB0b3RhbGx5IGRpZmZlcmVudCByZWFzb24uIAotTmFtZWx5IHRoYXQgeW91IGFyZSBpbiB0aGUgd3Jvbmcgam9iLCBhbmQgdGhhdCBfdGhleV8gc2hvdWxkIGJlIG1hbmFnaW5nCi15b3VyIGJyaWxsaWFuY2UgaW5zdGVhZCkuIAoreW91LCB5b3UncmUgYWxzbyBzY3Jld2VkLCBhbHRob3VnaCBmb3IgYSB0b3RhbGx5IGRpZmZlcmVudCByZWFzb24uCitOYW1lbHkgdGhhdCB5b3UgYXJlIGluIHRoZSB3cm9uZyBqb2IsIGFuZCB0aGF0ICoqdGhleSoqIHNob3VsZCBiZSBtYW5hZ2luZworeW91ciBicmlsbGlhbmNlIGluc3RlYWQpLgogCi1TbyB0aGUgbmFtZSBvZiB0aGUgZ2FtZSBpcyB0byBfYXZvaWRfIGRlY2lzaW9ucywgYXQgbGVhc3QgdGhlIGJpZyBhbmQKK1NvIHRoZSBuYW1lIG9mIHRoZSBnYW1lIGlzIHRvICoqYXZvaWQqKiBkZWNpc2lvbnMsIGF0IGxlYXN0IHRoZSBiaWcgYW5kCiBwYWluZnVsIG9uZXMuICBNYWtpbmcgc21hbGwgYW5kIG5vbi1jb25zZXF1ZW50aWFsIGRlY2lzaW9ucyBpcyBmaW5lLCBhbmQKIG1ha2VzIHlvdSBsb29rIGxpa2UgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcsIHNvIHdoYXQgYSBrZXJuZWwgbWFuYWdlcgogbmVlZHMgdG8gZG8gaXMgdG8gdHVybiB0aGUgYmlnIGFuZCBwYWluZnVsIG9uZXMgaW50byBzbWFsbCB0aGluZ3Mgd2hlcmUKLW5vYm9keSByZWFsbHkgY2FyZXMuIAorbm9ib2R5IHJlYWxseSBjYXJlcy4KIAogSXQgaGVscHMgdG8gcmVhbGl6ZSB0aGF0IHRoZSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgYmlnIGRlY2lzaW9uIGFuZCBhCiBzbWFsbCBvbmUgaXMgd2hldGhlciB5b3UgY2FuIGZpeCB5b3VyIGRlY2lzaW9uIGFmdGVyd2FyZHMuICBBbnkgZGVjaXNpb24KIGNhbiBiZSBtYWRlIHNtYWxsIGJ5IGp1c3QgYWx3YXlzIG1ha2luZyBzdXJlIHRoYXQgaWYgeW91IHdlcmUgd3JvbmcgKGFuZAoteW91IF93aWxsXyBiZSB3cm9uZyksIHlvdSBjYW4gYWx3YXlzIHVuZG8gdGhlIGRhbWFnZSBsYXRlciBieQoreW91ICoqd2lsbCoqIGJlIHdyb25nKSwgeW91IGNhbiBhbHdheXMgdW5kbyB0aGUgZGFtYWdlIGxhdGVyIGJ5CiBiYWNrdHJhY2tpbmcuICBTdWRkZW5seSwgeW91IGdldCB0byBiZSBkb3VibHkgbWFuYWdlcmlhbCBmb3IgbWFraW5nCi1fdHdvXyBpbmNvbnNlcXVlbnRpYWwgZGVjaXNpb25zIC0gdGhlIHdyb25nIG9uZSBfYW5kXyB0aGUgcmlnaHQgb25lLiAKKyoqdHdvKiogaW5jb25zZXF1ZW50aWFsIGRlY2lzaW9ucyAtIHRoZSB3cm9uZyBvbmUgKiphbmQqKiB0aGUgcmlnaHQgb25lLgogCiBBbmQgcGVvcGxlIHdpbGwgZXZlbiBzZWUgdGhhdCBhcyB0cnVlIGxlYWRlcnNoaXAgKCpjb3VnaCogYnVsbHNoaXQKICpjb3VnaCopLgpAQCAtNjUsMTAgKzY5LDEwIEBACiBUaHVzIHRoZSBrZXkgdG8gYXZvaWRpbmcgYmlnIGRlY2lzaW9ucyBiZWNvbWVzIHRvIGp1c3QgYXZvaWRpbmcgdG8gZG8KIHRoaW5ncyB0aGF0IGNhbid0IGJlIHVuZG9uZS4gIERvbid0IGdldCB1c2hlcmVkIGludG8gYSBjb3JuZXIgZnJvbSB3aGljaAogeW91IGNhbm5vdCBlc2NhcGUuICBBIGNvcm5lcmVkIHJhdCBtYXkgYmUgZGFuZ2Vyb3VzIC0gYSBjb3JuZXJlZCBtYW5hZ2VyCi1pcyBqdXN0IHBpdGlmdWwuIAoraXMganVzdCBwaXRpZnVsLgogCiBJdCB0dXJucyBvdXQgdGhhdCBzaW5jZSBub2JvZHkgd291bGQgYmUgc3R1cGlkIGVub3VnaCB0byBldmVyIHJlYWxseSBsZXQKLWEga2VybmVsIG1hbmFnZXIgaGF2ZSBodWdlIGZpc2NhbCByZXNwb25zaWJpbGl0eSBfYW55d2F5XywgaXQncyB1c3VhbGx5CithIGtlcm5lbCBtYW5hZ2VyIGhhdmUgaHVnZSBmaXNjYWwgcmVzcG9uc2liaWxpdHkgKiphbnl3YXkqKiwgaXQncyB1c3VhbGx5CiBmYWlybHkgZWFzeSB0byBiYWNrdHJhY2suICBTaW5jZSB5b3UncmUgbm90IGdvaW5nIHRvIGJlIGFibGUgdG8gd2FzdGUKIGh1Z2UgYW1vdW50cyBvZiBtb25leSB0aGF0IHlvdSBtaWdodCBub3QgYmUgYWJsZSB0byByZXBheSwgdGhlIG9ubHkKIHRoaW5nIHlvdSBjYW4gYmFja3RyYWNrIG9uIGlzIGEgdGVjaG5pY2FsIGRlY2lzaW9uLCBhbmQgdGhlcmUKQEAgLTc2LDExMyArODAsMTE4IEBACiBpbmNvbXBldGVudCBuaW5jb21wb29wLCBzYXkgeW91J3JlIHNvcnJ5LCBhbmQgdW5kbyBhbGwgdGhlIHdvcnRobGVzcwogd29yayB5b3UgaGFkIHBlb3BsZSB3b3JrIG9uIGZvciB0aGUgbGFzdCB5ZWFyLiAgU3VkZGVubHkgdGhlIGRlY2lzaW9uCiB5b3UgbWFkZSBhIHllYXIgYWdvIHdhc24ndCBhIGJpZyBkZWNpc2lvbiBhZnRlciBhbGwsIHNpbmNlIGl0IGNvdWxkIGJlCi1lYXNpbHkgdW5kb25lLiAKK2Vhc2lseSB1bmRvbmUuCiAKIEl0IHR1cm5zIG91dCB0aGF0IHNvbWUgcGVvcGxlIGhhdmUgdHJvdWJsZSB3aXRoIHRoaXMgYXBwcm9hY2gsIGZvciB0d28KIHJlYXNvbnM6CisKICAtIGFkbWl0dGluZyB5b3Ugd2VyZSBhbiBpZGlvdCBpcyBoYXJkZXIgdGhhbiBpdCBsb29rcy4gIFdlIGFsbCBsaWtlIHRvCiAgICBtYWludGFpbiBhcHBlYXJhbmNlcywgYW5kIGNvbWluZyBvdXQgaW4gcHVibGljIHRvIHNheSB0aGF0IHlvdSB3ZXJlCi0gICB3cm9uZyBpcyBzb21ldGltZXMgdmVyeSBoYXJkIGluZGVlZC4gCisgICB3cm9uZyBpcyBzb21ldGltZXMgdmVyeSBoYXJkIGluZGVlZC4KICAtIGhhdmluZyBzb21lYm9keSB0ZWxsIHlvdSB0aGF0IHdoYXQgeW91IHdvcmtlZCBvbiBmb3IgdGhlIGxhc3QgeWVhcgogICAgd2Fzbid0IHdvcnRod2hpbGUgYWZ0ZXIgYWxsIGNhbiBiZSBoYXJkIG9uIHRoZSBwb29yIGxvd2x5IGVuZ2luZWVycwotICAgdG9vLCBhbmQgd2hpbGUgdGhlIGFjdHVhbCBfd29ya18gd2FzIGVhc3kgZW5vdWdoIHRvIHVuZG8gYnkganVzdAorICAgdG9vLCBhbmQgd2hpbGUgdGhlIGFjdHVhbCAqKndvcmsqKiB3YXMgZWFzeSBlbm91Z2ggdG8gdW5kbyBieSBqdXN0CiAgICBkZWxldGluZyBpdCwgeW91IG1heSBoYXZlIGlycmV2b2NhYmx5IGxvc3QgdGhlIHRydXN0IG9mIHRoYXQKICAgIGVuZ2luZWVyLiAgQW5kIHJlbWVtYmVyOiAiaXJyZXZvY2FibGUiIHdhcyB3aGF0IHdlIHRyaWVkIHRvIGF2b2lkIGluCiAgICB0aGUgZmlyc3QgcGxhY2UsIGFuZCB5b3VyIGRlY2lzaW9uIGVuZGVkIHVwIGJlaW5nIGEgYmlnIG9uZSBhZnRlcgotICAgYWxsLiAKKyAgIGFsbC4KIAogSGFwcGlseSwgYm90aCBvZiB0aGVzZSByZWFzb25zIGNhbiBiZSBtaXRpZ2F0ZWQgZWZmZWN0aXZlbHkgYnkganVzdAogYWRtaXR0aW5nIHVwLWZyb250IHRoYXQgeW91IGRvbid0IGhhdmUgYSBmcmlnZ2luJyBjbHVlLCBhbmQgdGVsbGluZwogcGVvcGxlIGFoZWFkIG9mIHRoZSBmYWN0IHRoYXQgeW91ciBkZWNpc2lvbiBpcyBwdXJlbHkgcHJlbGltaW5hcnksIGFuZAogbWlnaHQgYmUgdGhlIHdyb25nIHRoaW5nLiAgWW91IHNob3VsZCBhbHdheXMgcmVzZXJ2ZSB0aGUgcmlnaHQgdG8gY2hhbmdlCi15b3VyIG1pbmQsIGFuZCBtYWtlIHBlb3BsZSB2ZXJ5IF9hd2FyZV8gb2YgdGhhdC4gIEFuZCBpdCdzIG11Y2ggZWFzaWVyCi10byBhZG1pdCB0aGF0IHlvdSBhcmUgc3R1cGlkIHdoZW4geW91IGhhdmVuJ3QgX3lldF8gZG9uZSB0aGUgcmVhbGx5Cit5b3VyIG1pbmQsIGFuZCBtYWtlIHBlb3BsZSB2ZXJ5ICoqYXdhcmUqKiBvZiB0aGF0LiAgQW5kIGl0J3MgbXVjaCBlYXNpZXIKK3RvIGFkbWl0IHRoYXQgeW91IGFyZSBzdHVwaWQgd2hlbiB5b3UgaGF2ZW4ndCAqKnlldCoqIGRvbmUgdGhlIHJlYWxseQogc3R1cGlkIHRoaW5nLgogCiBUaGVuLCB3aGVuIGl0IHJlYWxseSBkb2VzIHR1cm4gb3V0IHRvIGJlIHN0dXBpZCwgcGVvcGxlIGp1c3Qgcm9sbCB0aGVpcgotZXllcyBhbmQgc2F5ICJPb3BzLCBoZSBkaWQgaXQgYWdhaW4iLiAgCitleWVzIGFuZCBzYXkgIk9vcHMsIGhlIGRpZCBpdCBhZ2FpbiIuCiAKIFRoaXMgcHJlZW1wdGl2ZSBhZG1pc3Npb24gb2YgaW5jb21wZXRlbmNlIG1pZ2h0IGFsc28gbWFrZSB0aGUgcGVvcGxlIHdobwogYWN0dWFsbHkgZG8gdGhlIHdvcmsgYWxzbyB0aGluayB0d2ljZSBhYm91dCB3aGV0aGVyIGl0J3Mgd29ydGggZG9pbmcgb3IKLW5vdC4gIEFmdGVyIGFsbCwgaWYgX3RoZXlfIGFyZW4ndCBjZXJ0YWluIHdoZXRoZXIgaXQncyBhIGdvb2QgaWRlYSwgeW91Citub3QuICBBZnRlciBhbGwsIGlmICoqdGhleSoqIGFyZW4ndCBjZXJ0YWluIHdoZXRoZXIgaXQncyBhIGdvb2QgaWRlYSwgeW91CiBzdXJlIGFzIGhlbGwgc2hvdWxkbid0IGVuY291cmFnZSB0aGVtIGJ5IHByb21pc2luZyB0aGVtIHRoYXQgd2hhdCB0aGV5CiB3b3JrIG9uIHdpbGwgYmUgaW5jbHVkZWQuICBNYWtlIHRoZW0gYXQgbGVhc3QgdGhpbmsgdHdpY2UgYmVmb3JlIHRoZXkKLWVtYmFyayBvbiBhIGJpZyBlbmRlYXZvci4gCitlbWJhcmsgb24gYSBiaWcgZW5kZWF2b3IuCiAKIFJlbWVtYmVyOiB0aGV5J2QgYmV0dGVyIGtub3cgbW9yZSBhYm91dCB0aGUgZGV0YWlscyB0aGFuIHlvdSBkbywgYW5kCiB0aGV5IHVzdWFsbHkgYWxyZWFkeSB0aGluayB0aGV5IGhhdmUgdGhlIGFuc3dlciB0byBldmVyeXRoaW5nLiAgVGhlIGJlc3QKIHRoaW5nIHlvdSBjYW4gZG8gYXMgYSBtYW5hZ2VyIGlzIG5vdCB0byBpbnN0aWxsIGNvbmZpZGVuY2UsIGJ1dCByYXRoZXIgYQotaGVhbHRoeSBkb3NlIG9mIGNyaXRpY2FsIHRoaW5raW5nIG9uIHdoYXQgdGhleSBkby4gCitoZWFsdGh5IGRvc2Ugb2YgY3JpdGljYWwgdGhpbmtpbmcgb24gd2hhdCB0aGV5IGRvLgogCiBCdHcsIGFub3RoZXIgd2F5IHRvIGF2b2lkIGEgZGVjaXNpb24gaXMgdG8gcGxhaW50aXZlbHkganVzdCB3aGluZSAiY2FuJ3QKIHdlIGp1c3QgZG8gYm90aD8iIGFuZCBsb29rIHBpdGlmdWwuICBUcnVzdCBtZSwgaXQgd29ya3MuICBJZiBpdCdzIG5vdAogY2xlYXIgd2hpY2ggYXBwcm9hY2ggaXMgYmV0dGVyLCB0aGV5J2xsIGV2ZW50dWFsbHkgZmlndXJlIGl0IG91dC4gIFRoZQogYW5zd2VyIG1heSBlbmQgdXAgYmVpbmcgdGhhdCBib3RoIHRlYW1zIGdldCBzbyBmcnVzdHJhdGVkIGJ5IHRoZQotc2l0dWF0aW9uIHRoYXQgdGhleSBqdXN0IGdpdmUgdXAuIAorc2l0dWF0aW9uIHRoYXQgdGhleSBqdXN0IGdpdmUgdXAuCiAKIFRoYXQgbWF5IHNvdW5kIGxpa2UgYSBmYWlsdXJlLCBidXQgaXQncyB1c3VhbGx5IGEgc2lnbiB0aGF0IHRoZXJlIHdhcwogc29tZXRoaW5nIHdyb25nIHdpdGggYm90aCBwcm9qZWN0cywgYW5kIHRoZSByZWFzb24gdGhlIHBlb3BsZSBpbnZvbHZlZAogY291bGRuJ3QgZGVjaWRlIHdhcyB0aGF0IHRoZXkgd2VyZSBib3RoIHdyb25nLiAgWW91IGVuZCB1cCBjb21pbmcgdXAKIHNtZWxsaW5nIGxpa2Ugcm9zZXMsIGFuZCB5b3UgYXZvaWRlZCB5ZXQgYW5vdGhlciBkZWNpc2lvbiB0aGF0IHlvdSBjb3VsZAotaGF2ZSBzY3Jld2VkIHVwIG9uLiAKK2hhdmUgc2NyZXdlZCB1cCBvbi4KIAogCi0JCUNoYXB0ZXIgMjogUGVvcGxlCisyKSBQZW9wbGUKKy0tLS0tLS0tLQogCiBNb3N0IHBlb3BsZSBhcmUgaWRpb3RzLCBhbmQgYmVpbmcgYSBtYW5hZ2VyIG1lYW5zIHlvdSdsbCBoYXZlIHRvIGRlYWwKLXdpdGggaXQsIGFuZCBwZXJoYXBzIG1vcmUgaW1wb3J0YW50bHksIHRoYXQgX3RoZXlfIGhhdmUgdG8gZGVhbCB3aXRoCi1feW91Xy4gCit3aXRoIGl0LCBhbmQgcGVyaGFwcyBtb3JlIGltcG9ydGFudGx5LCB0aGF0ICoqdGhleSoqIGhhdmUgdG8gZGVhbCB3aXRoCisqKnlvdSoqLgogCiBJdCB0dXJucyBvdXQgdGhhdCB3aGlsZSBpdCdzIGVhc3kgdG8gdW5kbyB0ZWNobmljYWwgbWlzdGFrZXMsIGl0J3Mgbm90CiBhcyBlYXN5IHRvIHVuZG8gcGVyc29uYWxpdHkgZGlzb3JkZXJzLiAgWW91IGp1c3QgaGF2ZSB0byBsaXZlIHdpdGgKLXRoZWlycyAtIGFuZCB5b3Vycy4gCit0aGVpcnMgLSBhbmQgeW91cnMuCiAKIEhvd2V2ZXIsIGluIG9yZGVyIHRvIHByZXBhcmUgeW91cnNlbGYgYXMgYSBrZXJuZWwgbWFuYWdlciwgaXQncyBiZXN0IHRvCiByZW1lbWJlciBub3QgdG8gYnVybiBhbnkgYnJpZGdlcywgYm9tYiBhbnkgaW5ub2NlbnQgdmlsbGFnZXJzLCBvcgogYWxpZW5hdGUgdG9vIG1hbnkga2VybmVsIGRldmVsb3BlcnMuIEl0IHR1cm5zIG91dCB0aGF0IGFsaWVuYXRpbmcgcGVvcGxlCiBpcyBmYWlybHkgZWFzeSwgYW5kIHVuLWFsaWVuYXRpbmcgdGhlbSBpcyBoYXJkLiBUaHVzICJhbGllbmF0aW5nIgogaW1tZWRpYXRlbHkgZmFsbHMgdW5kZXIgdGhlIGhlYWRpbmcgb2YgIm5vdCByZXZlcnNpYmxlIiwgYW5kIGJlY29tZXMgYQotbm8tbm8gYWNjb3JkaW5nIHRvIENoYXB0ZXIgMS4KK25vLW5vIGFjY29yZGluZyB0byA6cmVmOmBkZWNpc2lvbnNgLgogCiBUaGVyZSdzIGp1c3QgYSBmZXcgc2ltcGxlIHJ1bGVzIGhlcmU6CisKICAoMSkgZG9uJ3QgY2FsbCBwZW9wbGUgZCpja2hlYWRzIChhdCBsZWFzdCBub3QgaW4gcHVibGljKQogICgyKSBsZWFybiBob3cgdG8gYXBvbG9naXplIHdoZW4geW91IGZvcmdvdCBydWxlICgxKQogCiBUaGUgcHJvYmxlbSB3aXRoICMxIGlzIHRoYXQgaXQncyB2ZXJ5IGVhc3kgdG8gZG8sIHNpbmNlIHlvdSBjYW4gc2F5Ci0ieW91J3JlIGEgZCpja2hlYWQiIGluIG1pbGxpb25zIG9mIGRpZmZlcmVudCB3YXlzICgqKSwgc29tZXRpbWVzIHdpdGhvdXQKKyJ5b3UncmUgYSBkKmNraGVhZCIgaW4gbWlsbGlvbnMgb2YgZGlmZmVyZW50IHdheXMgWyNmMl1fLCBzb21ldGltZXMgd2l0aG91dAogZXZlbiByZWFsaXppbmcgaXQsIGFuZCBhbG1vc3QgYWx3YXlzIHdpdGggYSB3aGl0ZS1ob3QgY29udmljdGlvbiB0aGF0Ci15b3UgYXJlIHJpZ2h0LiAKK3lvdSBhcmUgcmlnaHQuCiAKIEFuZCB0aGUgbW9yZSBjb252aW5jZWQgeW91IGFyZSB0aGF0IHlvdSBhcmUgcmlnaHQgKGFuZCBsZXQncyBmYWNlIGl0LAoteW91IGNhbiBjYWxsIGp1c3QgYWJvdXQgX2FueWJvZHlfIGEgZCpja2hlYWQsIGFuZCB5b3Ugb2Z0ZW4gX3dpbGxfIGJlCi1yaWdodCksIHRoZSBoYXJkZXIgaXQgZW5kcyB1cCBiZWluZyB0byBhcG9sb2dpemUgYWZ0ZXJ3YXJkcy4gCit5b3UgY2FuIGNhbGwganVzdCBhYm91dCAqKmFueWJvZHkqKiBhIGQqY2toZWFkLCBhbmQgeW91IG9mdGVuICoqd2lsbCoqIGJlCityaWdodCksIHRoZSBoYXJkZXIgaXQgZW5kcyB1cCBiZWluZyB0byBhcG9sb2dpemUgYWZ0ZXJ3YXJkcy4KIAogVG8gc29sdmUgdGhpcyBwcm9ibGVtLCB5b3UgcmVhbGx5IG9ubHkgaGF2ZSB0d28gb3B0aW9uczoKKwogIC0gZ2V0IHJlYWxseSBnb29kIGF0IGFwb2xvZ2llcwogIC0gc3ByZWFkIHRoZSAibG92ZSIgb3V0IHNvIGV2ZW5seSB0aGF0IG5vYm9keSByZWFsbHkgZW5kcyB1cCBmZWVsaW5nCiAgICBsaWtlIHRoZXkgZ2V0IHVuZmFpcmx5IHRhcmdldGVkLiAgTWFrZSBpdCBpbnZlbnRpdmUgZW5vdWdoLCBhbmQgdGhleQotICAgbWlnaHQgZXZlbiBiZSBhbXVzZWQuIAorICAgbWlnaHQgZXZlbiBiZSBhbXVzZWQuCiAKIFRoZSBvcHRpb24gb2YgYmVpbmcgdW5mYWlsaW5nbHkgcG9saXRlIHJlYWxseSBkb2Vzbid0IGV4aXN0LiBOb2JvZHkgd2lsbAogdHJ1c3Qgc29tZWJvZHkgd2hvIGlzIHNvIGNsZWFybHkgaGlkaW5nIGhpcyB0cnVlIGNoYXJhY3Rlci4KIAotKCopIFBhdWwgU2ltb24gc2FuZyAiRmlmdHkgV2F5cyB0byBMZWF2ZSBZb3VyIExvdmVyIiwgYmVjYXVzZSBxdWl0ZQotZnJhbmtseSwgIkEgTWlsbGlvbiBXYXlzIHRvIFRlbGwgYSBEZXZlbG9wZXIgSGUgSXMgYSBEKmNraGVhZCIgZG9lc24ndAotc2NhbiBuZWFybHkgYXMgd2VsbC4gIEJ1dCBJJ20gc3VyZSBoZSB0aG91Z2h0IGFib3V0IGl0LiAKKy4uIFsjZjJdIFBhdWwgU2ltb24gc2FuZyAiRmlmdHkgV2F5cyB0byBMZWF2ZSBZb3VyIExvdmVyIiwgYmVjYXVzZSBxdWl0ZQorICBmcmFua2x5LCAiQSBNaWxsaW9uIFdheXMgdG8gVGVsbCBhIERldmVsb3BlciBIZSBJcyBhIEQqY2toZWFkIiBkb2Vzbid0CisgIHNjYW4gbmVhcmx5IGFzIHdlbGwuICBCdXQgSSdtIHN1cmUgaGUgdGhvdWdodCBhYm91dCBpdC4KIAogCi0JCUNoYXB0ZXIgMzogUGVvcGxlIElJIC0gdGhlIEdvb2QgS2luZAorMykgUGVvcGxlIElJIC0gdGhlIEdvb2QgS2luZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBXaGlsZSBpdCB0dXJucyBvdXQgdGhhdCBtb3N0IHBlb3BsZSBhcmUgaWRpb3RzLCB0aGUgY29yb2xsYXJ5IHRvIHRoYXQgaXMKIHNhZGx5IHRoYXQgeW91IGFyZSBvbmUgdG9vLCBhbmQgdGhhdCB3aGlsZSB3ZSBjYW4gYWxsIGJhc2sgaW4gdGhlIHNlY3VyZQoga25vd2xlZGdlIHRoYXQgd2UncmUgYmV0dGVyIHRoYW4gdGhlIGF2ZXJhZ2UgcGVyc29uIChsZXQncyBmYWNlIGl0LAogbm9ib2R5IGV2ZXIgYmVsaWV2ZXMgdGhhdCB0aGV5J3JlIGF2ZXJhZ2Ugb3IgYmVsb3ctYXZlcmFnZSksIHdlIHNob3VsZAogYWxzbyBhZG1pdCB0aGF0IHdlJ3JlIG5vdCB0aGUgc2hhcnBlc3Qga25pZmUgYXJvdW5kLCBhbmQgdGhlcmUgd2lsbCBiZQotb3RoZXIgcGVvcGxlIHRoYXQgYXJlIGxlc3Mgb2YgYW4gaWRpb3QgdGhhbiB5b3UgYXJlLiAKK290aGVyIHBlb3BsZSB0aGF0IGFyZSBsZXNzIG9mIGFuIGlkaW90IHRoYW4geW91IGFyZS4KIAotU29tZSBwZW9wbGUgcmVhY3QgYmFkbHkgdG8gc21hcnQgcGVvcGxlLiAgT3RoZXJzIHRha2UgYWR2YW50YWdlIG9mIHRoZW0uIAorU29tZSBwZW9wbGUgcmVhY3QgYmFkbHkgdG8gc21hcnQgcGVvcGxlLiAgT3RoZXJzIHRha2UgYWR2YW50YWdlIG9mIHRoZW0uCiAKLU1ha2Ugc3VyZSB0aGF0IHlvdSwgYXMgYSBrZXJuZWwgbWFpbnRhaW5lciwgYXJlIGluIHRoZSBzZWNvbmQgZ3JvdXAuIAorTWFrZSBzdXJlIHRoYXQgeW91LCBhcyBhIGtlcm5lbCBtYWludGFpbmVyLCBhcmUgaW4gdGhlIHNlY29uZCBncm91cC4KIFN1Y2sgdXAgdG8gdGhlbSwgYmVjYXVzZSB0aGV5IGFyZSB0aGUgcGVvcGxlIHdobyB3aWxsIG1ha2UgeW91ciBqb2IKIGVhc2llci4gSW4gcGFydGljdWxhciwgdGhleSdsbCBiZSBhYmxlIHRvIG1ha2UgeW91ciBkZWNpc2lvbnMgZm9yIHlvdSwKIHdoaWNoIGlzIHdoYXQgdGhlIGdhbWUgaXMgYWxsIGFib3V0LgpAQCAtMTkxLDcgKzIwMCw3IEBACiBtYW5hZ2VtZW50IHJlc3BvbnNpYmlsaXRpZXMgbGFyZ2VseSBiZWNvbWUgb25lcyBvZiBzYXlpbmcgIlNvdW5kcyBsaWtlIGEKIGdvb2QgaWRlYSAtIGdvIHdpbGQiLCBvciAiVGhhdCBzb3VuZHMgZ29vZCwgYnV0IHdoYXQgYWJvdXQgeHh4PyIuICBUaGUKIHNlY29uZCB2ZXJzaW9uIGluIHBhcnRpY3VsYXIgaXMgYSBncmVhdCB3YXkgdG8gZWl0aGVyIGxlYXJuIHNvbWV0aGluZwotbmV3IGFib3V0ICJ4eHgiIG9yIHNlZW0gX2V4dHJhXyBtYW5hZ2VyaWFsIGJ5IHBvaW50aW5nIG91dCBzb21ldGhpbmcgdGhlCituZXcgYWJvdXQgInh4eCIgb3Igc2VlbSAqKmV4dHJhKiogbWFuYWdlcmlhbCBieSBwb2ludGluZyBvdXQgc29tZXRoaW5nIHRoZQogc21hcnRlciBwZXJzb24gaGFkbid0IHRob3VnaHQgYWJvdXQuICBJbiBlaXRoZXIgY2FzZSwgeW91IHdpbi4KIAogT25lIHRoaW5nIHRvIGxvb2sgb3V0IGZvciBpcyB0byByZWFsaXplIHRoYXQgZ3JlYXRuZXNzIGluIG9uZSBhcmVhIGRvZXMKQEAgLTE5OSw0NyArMjA4LDQ5IEBACiBzcGVjaWZpYyBkaXJlY3Rpb25zLCBidXQgbGV0J3MgZmFjZSBpdCwgdGhleSBtaWdodCBiZSBnb29kIGF0IHdoYXQgdGhleQogZG8sIGFuZCBzdWNrIGF0IGV2ZXJ5dGhpbmcgZWxzZS4gIFRoZSBnb29kIG5ld3MgaXMgdGhhdCBwZW9wbGUgdGVuZCB0bwogbmF0dXJhbGx5IGdyYXZpdGF0ZSBiYWNrIHRvIHdoYXQgdGhleSBhcmUgZ29vZCBhdCwgc28gaXQncyBub3QgbGlrZSB5b3UKLWFyZSBkb2luZyBzb21ldGhpbmcgaXJyZXZlcnNpYmxlIHdoZW4geW91IF9kb18gcHJvZCB0aGVtIGluIHNvbWUKK2FyZSBkb2luZyBzb21ldGhpbmcgaXJyZXZlcnNpYmxlIHdoZW4geW91ICoqZG8qKiBwcm9kIHRoZW0gaW4gc29tZQogZGlyZWN0aW9uLCBqdXN0IGRvbid0IHB1c2ggdG9vIGhhcmQuCiAKIAotCQlDaGFwdGVyIDQ6IFBsYWNpbmcgYmxhbWUKKzQpIFBsYWNpbmcgYmxhbWUKKy0tLS0tLS0tLS0tLS0tLS0KIAogVGhpbmdzIHdpbGwgZ28gd3JvbmcsIGFuZCBwZW9wbGUgd2FudCBzb21lYm9keSB0byBibGFtZS4gVGFnLCB5b3UncmUgaXQuCiAKIEl0J3Mgbm90IGFjdHVhbGx5IHRoYXQgaGFyZCB0byBhY2NlcHQgdGhlIGJsYW1lLCBlc3BlY2lhbGx5IGlmIHBlb3BsZQota2luZCBvZiByZWFsaXplIHRoYXQgaXQgd2Fzbid0IF9hbGxfIHlvdXIgZmF1bHQuICBXaGljaCBicmluZ3MgdXMgdG8gdGhlCitraW5kIG9mIHJlYWxpemUgdGhhdCBpdCB3YXNuJ3QgKiphbGwqKiB5b3VyIGZhdWx0LiAgV2hpY2ggYnJpbmdzIHVzIHRvIHRoZQogYmVzdCB3YXkgb2YgdGFraW5nIHRoZSBibGFtZTogZG8gaXQgZm9yIGFub3RoZXIgZ3V5LiBZb3UnbGwgZmVlbCBnb29kCiBmb3IgdGFraW5nIHRoZSBmYWxsLCBoZSdsbCBmZWVsIGdvb2QgYWJvdXQgbm90IGdldHRpbmcgYmxhbWVkLCBhbmQgdGhlCiBndXkgd2hvIGxvc3QgaGlzIHdob2xlIDM2R0IgcG9ybi1jb2xsZWN0aW9uIGJlY2F1c2Ugb2YgeW91ciBpbmNvbXBldGVuY2UKIHdpbGwgZ3J1ZGdpbmdseSBhZG1pdCB0aGF0IHlvdSBhdCBsZWFzdCBkaWRuJ3QgdHJ5IHRvIHdlYXNlbCBvdXQgb2YgaXQuCiAKIFRoZW4gbWFrZSB0aGUgZGV2ZWxvcGVyIHdobyByZWFsbHkgc2NyZXdlZCB1cCAoaWYgeW91IGNhbiBmaW5kIGhpbSkga25vdwotX2luX3ByaXZhdGVfIHRoYXQgaGUgc2NyZXdlZCB1cC4gIE5vdCBqdXN0IHNvIGhlIGNhbiBhdm9pZCBpdCBpbiB0aGUKKyoqaW5fcHJpdmF0ZSoqIHRoYXQgaGUgc2NyZXdlZCB1cC4gIE5vdCBqdXN0IHNvIGhlIGNhbiBhdm9pZCBpdCBpbiB0aGUKIGZ1dHVyZSwgYnV0IHNvIHRoYXQgaGUga25vd3MgaGUgb3dlcyB5b3Ugb25lLiAgQW5kLCBwZXJoYXBzIGV2ZW4gbW9yZQogaW1wb3J0YW50bHksIGhlJ3MgYWxzbyBsaWtlbHkgdGhlIHBlcnNvbiB3aG8gY2FuIGZpeCBpdC4gIEJlY2F1c2UsIGxldCdzCi1mYWNlIGl0LCBpdCBzdXJlIGFpbid0IHlvdS4gCitmYWNlIGl0LCBpdCBzdXJlIGFpbid0IHlvdS4KIAotVGFraW5nIHRoZSBibGFtZSBpcyBhbHNvIHdoeSB5b3UgZ2V0IHRvIGJlIG1hbmFnZXIgaW4gdGhlIGZpcnN0IHBsYWNlLiAKK1Rha2luZyB0aGUgYmxhbWUgaXMgYWxzbyB3aHkgeW91IGdldCB0byBiZSBtYW5hZ2VyIGluIHRoZSBmaXJzdCBwbGFjZS4KIEl0J3MgcGFydCBvZiB3aGF0IG1ha2VzIHBlb3BsZSB0cnVzdCB5b3UsIGFuZCBhbGxvdyB5b3UgdGhlIHBvdGVudGlhbAogZ2xvcnksIGJlY2F1c2UgeW91J3JlIHRoZSBvbmUgd2hvIGdldHMgdG8gc2F5ICJJIHNjcmV3ZWQgdXAiLiAgQW5kIGlmCiB5b3UndmUgZm9sbG93ZWQgdGhlIHByZXZpb3VzIHJ1bGVzLCB5b3UnbGwgYmUgcHJldHR5IGdvb2QgYXQgc2F5aW5nIHRoYXQKLWJ5IG5vdy4gCitieSBub3cuCiAKIAotCQlDaGFwdGVyIDU6IFRoaW5ncyB0byBhdm9pZAorNSkgVGhpbmdzIHRvIGF2b2lkCistLS0tLS0tLS0tLS0tLS0tLS0KIAogVGhlcmUncyBvbmUgdGhpbmcgcGVvcGxlIGhhdGUgZXZlbiBtb3JlIHRoYW4gYmVpbmcgY2FsbGVkICJkKmNraGVhZCIsCiBhbmQgdGhhdCBpcyBiZWluZyBjYWxsZWQgYSAiZCpja2hlYWQiIGluIGEgc2FuY3RpbW9uaW91cyB2b2ljZS4gIFRoZQogZmlyc3QgeW91IGNhbiBhcG9sb2dpemUgZm9yLCB0aGUgc2Vjb25kIG9uZSB5b3Ugd29uJ3QgcmVhbGx5IGdldCB0aGUKIGNoYW5jZS4gIFRoZXkgbGlrZWx5IHdpbGwgbm8gbG9uZ2VyIGJlIGxpc3RlbmluZyBldmVuIGlmIHlvdSBvdGhlcndpc2UKLWRvIGEgZ29vZCBqb2IuIAorZG8gYSBnb29kIGpvYi4KIAogV2UgYWxsIHRoaW5rIHdlJ3JlIGJldHRlciB0aGFuIGFueWJvZHkgZWxzZSwgd2hpY2ggbWVhbnMgdGhhdCB3aGVuCi1zb21lYm9keSBlbHNlIHB1dHMgb24gYWlycywgaXQgX3JlYWxseV8gcnVicyB1cyB0aGUgd3Jvbmcgd2F5LiAgWW91IG1heQorc29tZWJvZHkgZWxzZSBwdXRzIG9uIGFpcnMsIGl0ICoqcmVhbGx5KiogcnVicyB1cyB0aGUgd3Jvbmcgd2F5LiAgWW91IG1heQogYmUgbW9yYWxseSBhbmQgaW50ZWxsZWN0dWFsbHkgc3VwZXJpb3IgdG8gZXZlcnlib2R5IGFyb3VuZCB5b3UsIGJ1dAotZG9uJ3QgdHJ5IHRvIG1ha2UgaXQgdG9vIG9idmlvdXMgdW5sZXNzIHlvdSByZWFsbHkgX2ludGVuZF8gdG8gaXJyaXRhdGUKLXNvbWVib2R5ICgqKS4gCitkb24ndCB0cnkgdG8gbWFrZSBpdCB0b28gb2J2aW91cyB1bmxlc3MgeW91IHJlYWxseSAqKmludGVuZCoqIHRvIGlycml0YXRlCitzb21lYm9keSBbI2YzXV8uCiAKIFNpbWlsYXJseSwgZG9uJ3QgYmUgdG9vIHBvbGl0ZSBvciBzdWJ0bGUgYWJvdXQgdGhpbmdzLiBQb2xpdGVuZXNzIGVhc2lseQogZW5kcyB1cCBnb2luZyBvdmVyYm9hcmQgYW5kIGhpZGluZyB0aGUgcHJvYmxlbSwgYW5kIGFzIHRoZXkgc2F5LCAiT24gdGhlCkBAIC0yNTEsMTUgKzI2MiwxNiBAQAogb3ZlcmJvYXJkIHRvIHRoZSBwb2ludCBvZiBiZWluZyByaWRpY3Vsb3VzIGNhbiBkcml2ZSBhIHBvaW50IGhvbWUKIHdpdGhvdXQgbWFraW5nIGl0IHBhaW5mdWwgdG8gdGhlIHJlY2lwaWVudCwgd2hvIGp1c3QgdGhpbmtzIHlvdSdyZSBiZWluZwogc2lsbHkuICBJdCBjYW4gdGh1cyBoZWxwIGdldCB0aHJvdWdoIHRoZSBwZXJzb25hbCBtZW50YWwgYmxvY2sgd2UgYWxsCi1oYXZlIGFib3V0IGNyaXRpY2lzbS4gCitoYXZlIGFib3V0IGNyaXRpY2lzbS4KIAotKCopIEhpbnQ6IGludGVybmV0IG5ld3Nncm91cHMgdGhhdCBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8geW91ciB3b3JrCi1hcmUgZ3JlYXQgd2F5cyB0byB0YWtlIG91dCB5b3VyIGZydXN0cmF0aW9ucyBhdCBvdGhlciBwZW9wbGUuIFdyaXRlCi1pbnN1bHRpbmcgcG9zdHMgd2l0aCBhIHNuZWVyIGp1c3QgdG8gZ2V0IGludG8gYSBnb29kIGZsYW1lIGV2ZXJ5IG9uY2UgaW4KLWEgd2hpbGUsIGFuZCB5b3UnbGwgZmVlbCBjbGVhbnNlZC4gSnVzdCBkb24ndCBjcmFwIHRvbyBjbG9zZSB0byBob21lLgorLi4gWyNmM10gSGludDogaW50ZXJuZXQgbmV3c2dyb3VwcyB0aGF0IGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byB5b3VyIHdvcmsKKyAgYXJlIGdyZWF0IHdheXMgdG8gdGFrZSBvdXQgeW91ciBmcnVzdHJhdGlvbnMgYXQgb3RoZXIgcGVvcGxlLiBXcml0ZQorICBpbnN1bHRpbmcgcG9zdHMgd2l0aCBhIHNuZWVyIGp1c3QgdG8gZ2V0IGludG8gYSBnb29kIGZsYW1lIGV2ZXJ5IG9uY2UgaW4KKyAgYSB3aGlsZSwgYW5kIHlvdSdsbCBmZWVsIGNsZWFuc2VkLiBKdXN0IGRvbid0IGNyYXAgdG9vIGNsb3NlIHRvIGhvbWUuCiAKIAotCQlDaGFwdGVyIDY6IFdoeSBtZT8KKzYpIFdoeSBtZT8KKy0tLS0tLS0tLS0KIAogU2luY2UgeW91ciBtYWluIHJlc3BvbnNpYmlsaXR5IHNlZW1zIHRvIGJlIHRvIHRha2UgdGhlIGJsYW1lIGZvciBvdGhlcgogcGVvcGxlcyBtaXN0YWtlcywgYW5kIG1ha2UgaXQgcGFpbmZ1bGx5IG9idmlvdXMgdG8gZXZlcnlib2R5IGVsc2UgdGhhdApAQCAtMjY4LDkgKzI4MCw5IEBACiAKIEZpcnN0IG9mZiwgd2hpbGUgeW91IG1heSBvciBtYXkgbm90IGdldCBzY3JlYW1pbmcgdGVlbmFnZSBnaXJscyAob3IKIGJveXMsIGxldCdzIG5vdCBiZSBqdWRnbWVudGFsIG9yIHNleGlzdCBoZXJlKSBrbm9ja2luZyBvbiB5b3VyIGRyZXNzaW5nCi1yb29tIGRvb3IsIHlvdSBfd2lsbF8gZ2V0IGFuIGltbWVuc2UgZmVlbGluZyBvZiBwZXJzb25hbCBhY2NvbXBsaXNobWVudAorcm9vbSBkb29yLCB5b3UgKip3aWxsKiogZ2V0IGFuIGltbWVuc2UgZmVlbGluZyBvZiBwZXJzb25hbCBhY2NvbXBsaXNobWVudAogZm9yIGJlaW5nICJpbiBjaGFyZ2UiLiAgTmV2ZXIgbWluZCB0aGUgZmFjdCB0aGF0IHlvdSdyZSByZWFsbHkgbGVhZGluZwogYnkgdHJ5aW5nIHRvIGtlZXAgdXAgd2l0aCBldmVyeWJvZHkgZWxzZSBhbmQgcnVubmluZyBhZnRlciB0aGVtIGFzIGZhc3QKLWFzIHlvdSBjYW4uICBFdmVyeWJvZHkgd2lsbCBzdGlsbCB0aGluayB5b3UncmUgdGhlIHBlcnNvbiBpbiBjaGFyZ2UuIAorYXMgeW91IGNhbi4gIEV2ZXJ5Ym9keSB3aWxsIHN0aWxsIHRoaW5rIHlvdSdyZSB0aGUgcGVyc29uIGluIGNoYXJnZS4KIAogSXQncyBhIGdyZWF0IGpvYiBpZiB5b3UgY2FuIGhhY2sgaXQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1BDSS9NU0ktSE9XVE8udHh0IGIvRG9jdW1lbnRhdGlvbi9QQ0kvTVNJLUhPV1RPLnR4dAppbmRleCBjNTVkZjI5Li5jZDljOWY2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1BDSS9NU0ktSE9XVE8udHh0CisrKyBiL0RvY3VtZW50YXRpb24vUENJL01TSS1IT1dUTy50eHQKQEAgLTk0LDE0ICs5NCwxMSBAQAogbWluX3ZlY3MgYXJndW1lbnQgc2V0IHRvIHRoaXMgbGltaXQsIGFuZCB0aGUgUENJIGNvcmUgd2lsbCByZXR1cm4gLUVOT1NQQwogaWYgaXQgY2FuJ3QgbWVldCB0aGUgbWluaW11bSBudW1iZXIgb2YgdmVjdG9ycy4KIAotVGhlIGZsYWdzIGFyZ3VtZW50IHNob3VsZCBub3JtYWxseSBiZSBzZXQgdG8gMCwgYnV0IGNhbiBiZSB1c2VkIHRvIHBhc3MgdGhlCi1QQ0lfSVJRX05PTVNJIGFuZCBQQ0lfSVJRX05PTVNJWCBmbGFnIGluIGNhc2UgYSBkZXZpY2UgY2xhaW1zIHRvIHN1cHBvcnQKLU1TSSBvciBNU0ktWCwgYnV0IHRoZSBzdXBwb3J0IGlzIGJyb2tlbiwgb3IgdG8gcGFzcyBQQ0lfSVJRX05PTEVHQUNZIGluCi1jYXNlIHRoZSBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBsZWdhY3kgaW50ZXJydXB0IGxpbmVzLgotCi1CeSBkZWZhdWx0IHRoaXMgZnVuY3Rpb24gd2lsbCBzcHJlYWQgdGhlIGludGVycnVwdHMgYXJvdW5kIHRoZSBhdmFpbGFibGUKLUNQVXMsIGJ1dCB0aGlzIGZlYXR1cmUgY2FuIGJlIGRpc2FibGVkIGJ5IHBhc3NpbmcgdGhlIFBDSV9JUlFfTk9BRkZJTklUWQotZmxhZy4KK1RoZSBmbGFncyBhcmd1bWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggdHlwZSBvZiBpbnRlcnJ1cHQgY2FuIGJlIHVzZWQKK2J5IHRoZSBkZXZpY2UgYW5kIHRoZSBkcml2ZXIgKFBDSV9JUlFfTEVHQUNZLCBQQ0lfSVJRX01TSSwgUENJX0lSUV9NU0lYKS4KK0EgY29udmVuaWVudCBzaG9ydC1oYW5kIChQQ0lfSVJRX0FMTF9UWVBFUykgaXMgYWxzbyBhdmFpbGFibGUgdG8gYXNrIGZvcgorYW55IHBvc3NpYmxlIGtpbmQgb2YgaW50ZXJydXB0LiAgSWYgdGhlIFBDSV9JUlFfQUZGSU5JVFkgZmxhZyBpcyBzZXQsCitwY2lfYWxsb2NfaXJxX3ZlY3RvcnMoKSB3aWxsIHNwcmVhZCB0aGUgaW50ZXJydXB0cyBhcm91bmQgdGhlIGF2YWlsYWJsZSBDUFVzLgogCiBUbyBnZXQgdGhlIExpbnV4IElSUSBudW1iZXJzIHBhc3NlZCB0byByZXF1ZXN0X2lycSgpIGFuZCBmcmVlX2lycSgpIGFuZCB0aGUKIHZlY3RvcnMsIHVzZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgpAQCAtMTMxLDcgKzEyOCw3IEBACiBjYXBwZWQgdG8gdGhlIHN1cHBvcnRlZCBsaW1pdCwgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBxdWVyeSB0aGUgbnVtYmVyIG9mCiB2ZWN0b3JzIHN1cHBvcnRlZCBiZWZvcmVoYW5kOgogCi0JbnZlYyA9IHBjaV9hbGxvY19pcnFfdmVjdG9ycyhwZGV2LCAxLCBudmVjLCAwKTsKKwludmVjID0gcGNpX2FsbG9jX2lycV92ZWN0b3JzKHBkZXYsIDEsIG52ZWMsIFBDSV9JUlFfQUxMX1RZUEVTKQogCWlmIChudmVjIDwgMCkKIAkJZ290byBvdXRfZXJyOwogCkBAIC0xNDAsNyArMTM3LDcgQEAKIG51bWJlciB0byBwY2lfYWxsb2NfaXJxX3ZlY3RvcnMoKSBmdW5jdGlvbiBhcyBib3RoICdtaW5fdmVjcycgYW5kCiAnbWF4X3ZlY3MnIHBhcmFtZXRlcnM6CiAKLQlyZXQgPSBwY2lfYWxsb2NfaXJxX3ZlY3RvcnMocGRldiwgbnZlYywgbnZlYywgMCk7CisJcmV0ID0gcGNpX2FsbG9jX2lycV92ZWN0b3JzKHBkZXYsIG52ZWMsIG52ZWMsIFBDSV9JUlFfQUxMX1RZUEVTKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXRfZXJyOwogCkBAIC0xNDgsMTUgKzE0NSwxNCBAQAogdGhlIHNpbmdsZSBNU0kgbW9kZSBmb3IgYSBkZXZpY2UuICBJdCBjb3VsZCBiZSBkb25lIGJ5IHBhc3NpbmcgdHdvIDFzIGFzCiAnbWluX3ZlY3MnIGFuZCAnbWF4X3ZlY3MnOgogCi0JcmV0ID0gcGNpX2FsbG9jX2lycV92ZWN0b3JzKHBkZXYsIDEsIDEsIDApOworCXJldCA9IHBjaV9hbGxvY19pcnFfdmVjdG9ycyhwZGV2LCAxLCAxLCBQQ0lfSVJRX0FMTF9UWVBFUyk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0X2VycjsKIAogU29tZSBkZXZpY2VzIG1pZ2h0IG5vdCBzdXBwb3J0IHVzaW5nIGxlZ2FjeSBsaW5lIGludGVycnVwdHMsIGluIHdoaWNoIGNhc2UKLXRoZSBQQ0lfSVJRX05PTEVHQUNZIGZsYWcgY2FuIGJlIHVzZWQgdG8gZmFpbCB0aGUgcmVxdWVzdCBpZiB0aGUgcGxhdGZvcm0KLWNhbid0IHByb3ZpZGUgTVNJIG9yIE1TSS1YIGludGVycnVwdHM6Cit0aGUgZHJpdmVyIGNhbiBzcGVjaWZ5IHRoYXQgb25seSBNU0kgb3IgTVNJLVggaXMgYWNjZXB0YWJsZToKIAotCW52ZWMgPSBwY2lfYWxsb2NfaXJxX3ZlY3RvcnMocGRldiwgMSwgbnZlYywgUENJX0lSUV9OT0xFR0FDWSk7CisJbnZlYyA9IHBjaV9hbGxvY19pcnFfdmVjdG9ycyhwZGV2LCAxLCBudmVjLCBQQ0lfSVJRX01TSSB8IFBDSV9JUlFfTVNJWCk7CiAJaWYgKG52ZWMgPCAwKQogCQlnb3RvIG91dF9lcnI7CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUENJL3BjaS50eHQgYi9Eb2N1bWVudGF0aW9uL1BDSS9wY2kudHh0CmluZGV4IDEyMzg4MWYuLjc3ZjQ5ZGMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vUENJL3BjaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9QQ0kvcGNpLnR4dApAQCAtMTI0LDcgKzEyNCw2IEBACiAKIFRoZSBJRCB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgcGNpX2RldmljZV9pZCBlbnRyaWVzIGVuZGluZyB3aXRoIGFuCiBhbGwtemVybyBlbnRyeS4gIERlZmluaXRpb25zIHdpdGggc3RhdGljIGNvbnN0IGFyZSBnZW5lcmFsbHkgcHJlZmVycmVkLgotVXNlIG9mIHRoZSBkZXByZWNhdGVkIG1hY3JvIERFRklORV9QQ0lfREVWSUNFX1RBQkxFIHNob3VsZCBiZSBhdm9pZGVkLgogCiBFYWNoIGVudHJ5IGNvbnNpc3RzIG9mOgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS9EZXNpZ24vUmVxdWlyZW1lbnRzL1JlcXVpcmVtZW50cy5odG1sIGIvRG9jdW1lbnRhdGlvbi9SQ1UvRGVzaWduL1JlcXVpcmVtZW50cy9SZXF1aXJlbWVudHMuaHRtbAppbmRleCBlY2U0MTBmLi5hNGQzODM4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1JDVS9EZXNpZ24vUmVxdWlyZW1lbnRzL1JlcXVpcmVtZW50cy5odG1sCisrKyBiL0RvY3VtZW50YXRpb24vUkNVL0Rlc2lnbi9SZXF1aXJlbWVudHMvUmVxdWlyZW1lbnRzLmh0bWwKQEAgLTI0OTMsNiArMjQ5MywyOCBAQAogdmFyaWFudCBvZiA8dHQ+Y2FsbF9yY3UoKTwvdHQ+IHRoYXQgbWlnaHQgb25lIGRheSBiZSBjcmVhdGVkIGZvcgogZW5lcmd5LWVmZmljaWVuY3kgcHVycG9zZXMuCiAKKzxwPgorVGhhdCBzYWlkLCB0aGVyZSBhcmUgbGltaXRzLgorUkNVIHJlcXVpcmVzIHRoYXQgdGhlIDx0dD5yY3VfaGVhZDwvdHQ+IHN0cnVjdHVyZSBiZSBhbGlnbmVkIHRvIGEKK3R3by1ieXRlIGJvdW5kYXJ5LCBhbmQgcGFzc2luZyBhIG1pc2FsaWduZWQgPHR0PnJjdV9oZWFkPC90dD4KK3N0cnVjdHVyZSB0byBvbmUgb2YgdGhlIDx0dD5jYWxsX3JjdSgpPC90dD4gZmFtaWx5IG9mIGZ1bmN0aW9ucword2lsbCByZXN1bHQgaW4gYSBzcGxhdC4KK0l0IGlzIHRoZXJlZm9yZSBuZWNlc3NhcnkgdG8gZXhlcmNpc2UgY2F1dGlvbiB3aGVuIHBhY2tpbmcKK3N0cnVjdHVyZXMgY29udGFpbmluZyBmaWVsZHMgb2YgdHlwZSA8dHQ+cmN1X2hlYWQ8L3R0Pi4KK1doeSBub3QgYSBmb3VyLWJ5dGUgb3IgZXZlbiBlaWdodC1ieXRlIGFsaWdubWVudCByZXF1aXJlbWVudD8KK0JlY2F1c2UgdGhlIG02OGsgYXJjaGl0ZWN0dXJlIHByb3ZpZGVzIG9ubHkgdHdvLWJ5dGUgYWxpZ25tZW50LAorYW5kIHRodXMgYWN0cyBhcyBhbGlnbm1lbnQncyBsZWFzdCBjb21tb24gZGVub21pbmF0b3IuCisKKzxwPgorVGhlIHJlYXNvbiBmb3IgcmVzZXJ2aW5nIHRoZSBib3R0b20gYml0IG9mIHBvaW50ZXJzIHRvCis8dHQ+cmN1X2hlYWQ8L3R0PiBzdHJ1Y3R1cmVzIGlzIHRvIGxlYXZlIHRoZSBkb29yIG9wZW4gdG8KKyZsZHF1bztsYXp5JnJkcXVvOyBjYWxsYmFja3Mgd2hvc2UgaW52b2NhdGlvbnMgY2FuIHNhZmVseSBiZSBkZWZlcnJlZC4KK0RlZmVycmluZyBpbnZvY2F0aW9uIGNvdWxkIHBvdGVudGlhbGx5IGhhdmUgZW5lcmd5LWVmZmljaWVuY3kKK2JlbmVmaXRzLCBidXQgb25seSBpZiB0aGUgcmF0ZSBvZiBub24tbGF6eSBjYWxsYmFja3MgZGVjcmVhc2VzCitzaWduaWZpY2FudGx5IGZvciBzb21lIGltcG9ydGFudCB3b3JrbG9hZC4KK0luIHRoZSBtZWFudGltZSwgcmVzZXJ2aW5nIHRoZSBib3R0b20gYml0IGtlZXBzIHRoaXMgb3B0aW9uIG9wZW4KK2luIGNhc2UgaXQgb25lIGRheSBiZWNvbWVzIHVzZWZ1bC4KKwogPGgzPjxhIG5hbWU9IlBlcmZvcm1hbmNlLCBTY2FsYWJpbGl0eSwgUmVzcG9uc2UgVGltZSwgYW5kIFJlbGlhYmlsaXR5Ij4KIFBlcmZvcm1hbmNlLCBTY2FsYWJpbGl0eSwgUmVzcG9uc2UgVGltZSwgYW5kIFJlbGlhYmlsaXR5PC9hPjwvaDM+CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUkNVL3RvcnR1cmUudHh0IGIvRG9jdW1lbnRhdGlvbi9SQ1UvdG9ydHVyZS50eHQKaW5kZXggMTE4ZTdjMS4uMjc4ZjZhOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9SQ1UvdG9ydHVyZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9SQ1UvdG9ydHVyZS50eHQKQEAgLTEwLDIxICsxMCw2IEBACiBjb21tYW5kIChwZXJoYXBzIGdyZXBwaW5nIGZvciAidG9ydHVyZSIpLiAgVGhlIHRlc3QgaXMgc3RhcnRlZAogd2hlbiB0aGUgbW9kdWxlIGlzIGxvYWRlZCwgYW5kIHN0b3BzIHdoZW4gdGhlIG1vZHVsZSBpcyB1bmxvYWRlZC4KIAotQ09ORklHX1JDVV9UT1JUVVJFX1RFU1RfUlVOTkFCTEUKLQotSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzcGVjaWZ5IENPTkZJR19SQ1VfVE9SVFVSRV9URVNUPXksIHdoaWNoIHdpbGwKLXJlc3VsdCBpbiB0aGUgdGVzdHMgYmVpbmcgbG9hZGVkIGludG8gdGhlIGJhc2Uga2VybmVsLiAgSW4gdGhpcyBjYXNlLAotdGhlIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUX1JVTk5BQkxFIGNvbmZpZyBvcHRpb24gaXMgdXNlZCB0byBzcGVjaWZ5Ci13aGV0aGVyIHRoZSBSQ1UgdG9ydHVyZSB0ZXN0cyBhcmUgdG8gYmUgc3RhcnRlZCBpbW1lZGlhdGVseSBkdXJpbmcKLWJvb3Qgb3Igd2hldGhlciB0aGUgL3Byb2Mvc3lzL2tlcm5lbC9yY3V0b3J0dXJlX3J1bm5hYmxlIGZpbGUgaXMgdXNlZAotdG8gZW5hYmxlIHRoZW0uICBUaGlzIC9wcm9jIGZpbGUgY2FuIGJlIHVzZWQgdG8gcmVwZWF0ZWRseSBwYXVzZSBhbmQKLXJlc3RhcnQgdGhlIHRlc3RzLCByZWdhcmRsZXNzIG9mIHRoZSBpbml0aWFsIHN0YXRlIHNwZWNpZmllZCBieSB0aGUKLUNPTkZJR19SQ1VfVE9SVFVSRV9URVNUX1JVTk5BQkxFIGNvbmZpZyBvcHRpb24uCi0KLVlvdSB3aWxsIG5vcm1hbGx5IC1ub3QtIHdhbnQgdG8gc3RhcnQgdGhlIFJDVSB0b3J0dXJlIHRlc3RzIGR1cmluZyBib290Ci0oYW5kIHRodXMgdGhlIGRlZmF1bHQgaXMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1RfUlVOTkFCTEU9biksIGJ1dCBkb2luZwotdGhpcyBjYW4gc29tZXRpbWVzIGJlIHVzZWZ1bCBpbiBmaW5kaW5nIGJvb3QtdGltZSBidWdzLgotCiAKIE1PRFVMRSBQQVJBTUVURVJTCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vU2VjdXJpdHlCdWdzIGIvRG9jdW1lbnRhdGlvbi9TZWN1cml0eUJ1Z3MKaW5kZXggYTY2MGQ0OS4uMzQyZDc2OSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9TZWN1cml0eUJ1Z3MKKysrIGIvRG9jdW1lbnRhdGlvbi9TZWN1cml0eUJ1Z3MKQEAgLTEsOSArMSwxNSBAQAorLi4gX3NlY3VyaXR5YnVnczoKKworU2VjdXJpdHkgYnVncworPT09PT09PT09PT09PQorCiBMaW51eCBrZXJuZWwgZGV2ZWxvcGVycyB0YWtlIHNlY3VyaXR5IHZlcnkgc2VyaW91c2x5LiAgQXMgc3VjaCwgd2UnZAogbGlrZSB0byBrbm93IHdoZW4gYSBzZWN1cml0eSBidWcgaXMgZm91bmQgc28gdGhhdCBpdCBjYW4gYmUgZml4ZWQgYW5kCiBkaXNjbG9zZWQgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS4gIFBsZWFzZSByZXBvcnQgc2VjdXJpdHkgYnVncyB0byB0aGUKIExpbnV4IGtlcm5lbCBzZWN1cml0eSB0ZWFtLgogCiAxKSBDb250YWN0CistLS0tLS0tLS0tCiAKIFRoZSBMaW51eCBrZXJuZWwgc2VjdXJpdHkgdGVhbSBjYW4gYmUgY29udGFjdGVkIGJ5IGVtYWlsIGF0CiA8c2VjdXJpdHlAa2VybmVsLm9yZz4uICBUaGlzIGlzIGEgcHJpdmF0ZSBsaXN0IG9mIHNlY3VyaXR5IG9mZmljZXJzCkBAIC0xOCw2ICsyNCw3IEBACiBjb25zZW50IGZyb20gdGhlIHJlcG9ydGVyIHVubGVzcyBpdCBoYXMgYWxyZWFkeSBiZWVuIG1hZGUgcHVibGljLgogCiAyKSBEaXNjbG9zdXJlCistLS0tLS0tLS0tLS0tCiAKIFRoZSBnb2FsIG9mIHRoZSBMaW51eCBrZXJuZWwgc2VjdXJpdHkgdGVhbSBpcyB0byB3b3JrIHdpdGggdGhlCiBidWcgc3VibWl0dGVyIHRvIGJ1ZyByZXNvbHV0aW9uIGFzIHdlbGwgYXMgZGlzY2xvc3VyZS4gIFdlIHByZWZlcgpAQCAtMzMsNiArNDAsNyBAQAogZGlzY2xvc3VyZSBkYXRlIHRvIGJlIG9uIHRoZSBvcmRlciBvZiA3IGRheXMuCiAKIDMpIE5vbi1kaXNjbG9zdXJlIGFncmVlbWVudHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogVGhlIExpbnV4IGtlcm5lbCBzZWN1cml0eSB0ZWFtIGlzIG5vdCBhIGZvcm1hbCBib2R5IGFuZCB0aGVyZWZvcmUgdW5hYmxlCiB0byBlbnRlciBhbnkgbm9uLWRpc2Nsb3N1cmUgYWdyZWVtZW50cy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vU3VibWl0Q2hlY2tsaXN0IGIvRG9jdW1lbnRhdGlvbi9TdWJtaXRDaGVja2xpc3QKaW5kZXggMmI3ZTMyZC4uODk0Mjg5YiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9TdWJtaXRDaGVja2xpc3QKKysrIGIvRG9jdW1lbnRhdGlvbi9TdWJtaXRDaGVja2xpc3QKQEAgLTEsMTA5ICsxLDEyMCBAQAorLi4gX3N1Ym1pdGNoZWNrbGlzdDoKKwogTGludXggS2VybmVsIHBhdGNoIHN1Ym1pc3Npb24gY2hlY2tsaXN0Ci1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiAKIEhlcmUgYXJlIHNvbWUgYmFzaWMgdGhpbmdzIHRoYXQgZGV2ZWxvcGVycyBzaG91bGQgZG8gaWYgdGhleSB3YW50IHRvIHNlZSB0aGVpcgoga2VybmVsIHBhdGNoIHN1Ym1pc3Npb25zIGFjY2VwdGVkIG1vcmUgcXVpY2tseS4KIAogVGhlc2UgYXJlIGFsbCBhYm92ZSBhbmQgYmV5b25kIHRoZSBkb2N1bWVudGF0aW9uIHRoYXQgaXMgcHJvdmlkZWQgaW4KLURvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMgYW5kIGVsc2V3aGVyZSByZWdhcmRpbmcgc3VibWl0dGluZyBMaW51eAota2VybmVsIHBhdGNoZXMuCis6cmVmOmBEb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzIDxzdWJtaXR0aW5ncGF0Y2hlcz5gCithbmQgZWxzZXdoZXJlIHJlZ2FyZGluZyBzdWJtaXR0aW5nIExpbnV4IGtlcm5lbCBwYXRjaGVzLgogCiAKLTE6IElmIHlvdSB1c2UgYSBmYWNpbGl0eSB0aGVuICNpbmNsdWRlIHRoZSBmaWxlIHRoYXQgZGVmaW5lcy9kZWNsYXJlcworMSkgSWYgeW91IHVzZSBhIGZhY2lsaXR5IHRoZW4gI2luY2x1ZGUgdGhlIGZpbGUgdGhhdCBkZWZpbmVzL2RlY2xhcmVzCiAgICB0aGF0IGZhY2lsaXR5LiAgRG9uJ3QgZGVwZW5kIG9uIG90aGVyIGhlYWRlciBmaWxlcyBwdWxsaW5nIGluIG9uZXMKICAgIHRoYXQgeW91IHVzZS4KIAotMjogQnVpbGRzIGNsZWFubHkgd2l0aCBhcHBsaWNhYmxlIG9yIG1vZGlmaWVkIENPTkZJRyBvcHRpb25zID15LCA9bSwgYW5kCi0gICA9bi4gIE5vIGdjYyB3YXJuaW5ncy9lcnJvcnMsIG5vIGxpbmtlciB3YXJuaW5ncy9lcnJvcnMuCisyKSBCdWlsZHMgY2xlYW5seToKIAotMmI6IFBhc3NlcyBhbGxub2NvbmZpZywgYWxsbW9kY29uZmlnCisgIGEpIHdpdGggYXBwbGljYWJsZSBvciBtb2RpZmllZCBgYENPTkZJR2BgIG9wdGlvbnMgYGA9eWBgLCBgYD1tYGAsIGFuZAorICAgICBgYD1uYGAuICBObyBgYGdjY2BgIHdhcm5pbmdzL2Vycm9ycywgbm8gbGlua2VyIHdhcm5pbmdzL2Vycm9ycy4KIAotMmM6IEJ1aWxkcyBzdWNjZXNzZnVsbHkgd2hlbiB1c2luZyBPPWJ1aWxkZGlyCisgIGIpIFBhc3NlcyBgYGFsbG5vY29uZmlnYGAsIGBgYWxsbW9kY29uZmlnYGAKIAotMzogQnVpbGRzIG9uIG11bHRpcGxlIENQVSBhcmNoaXRlY3R1cmVzIGJ5IHVzaW5nIGxvY2FsIGNyb3NzLWNvbXBpbGUgdG9vbHMKKyAgYykgQnVpbGRzIHN1Y2Nlc3NmdWxseSB3aGVuIHVzaW5nIGBgTz1idWlsZGRpcmBgCisKKzMpIEJ1aWxkcyBvbiBtdWx0aXBsZSBDUFUgYXJjaGl0ZWN0dXJlcyBieSB1c2luZyBsb2NhbCBjcm9zcy1jb21waWxlIHRvb2xzCiAgICBvciBzb21lIG90aGVyIGJ1aWxkIGZhcm0uCiAKLTQ6IHBwYzY0IGlzIGEgZ29vZCBhcmNoaXRlY3R1cmUgZm9yIGNyb3NzLWNvbXBpbGF0aW9uIGNoZWNraW5nIGJlY2F1c2UgaXQKLSAgIHRlbmRzIHRvIHVzZSBgdW5zaWduZWQgbG9uZycgZm9yIDY0LWJpdCBxdWFudGl0aWVzLgorNCkgcHBjNjQgaXMgYSBnb29kIGFyY2hpdGVjdHVyZSBmb3IgY3Jvc3MtY29tcGlsYXRpb24gY2hlY2tpbmcgYmVjYXVzZSBpdAorICAgdGVuZHMgdG8gdXNlIGBgdW5zaWduZWQgbG9uZ2BgIGZvciA2NC1iaXQgcXVhbnRpdGllcy4KIAotNTogQ2hlY2sgeW91ciBwYXRjaCBmb3IgZ2VuZXJhbCBzdHlsZSBhcyBkZXRhaWxlZCBpbgotICAgRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZS4gIENoZWNrIGZvciB0cml2aWFsIHZpb2xhdGlvbnMgd2l0aCB0aGUKLSAgIHBhdGNoIHN0eWxlIGNoZWNrZXIgcHJpb3IgdG8gc3VibWlzc2lvbiAoc2NyaXB0cy9jaGVja3BhdGNoLnBsKS4KKzUpIENoZWNrIHlvdXIgcGF0Y2ggZm9yIGdlbmVyYWwgc3R5bGUgYXMgZGV0YWlsZWQgaW4KKyAgIDpyZWY6YERvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUgPGNvZGluZ3N0eWxlPmAuCisgICBDaGVjayBmb3IgdHJpdmlhbCB2aW9sYXRpb25zIHdpdGggdGhlIHBhdGNoIHN0eWxlIGNoZWNrZXIgcHJpb3IgdG8KKyAgIHN1Ym1pc3Npb24gKGBgc2NyaXB0cy9jaGVja3BhdGNoLnBsYGApLgogICAgWW91IHNob3VsZCBiZSBhYmxlIHRvIGp1c3RpZnkgYWxsIHZpb2xhdGlvbnMgdGhhdCByZW1haW4gaW4KICAgIHlvdXIgcGF0Y2guCiAKLTY6IEFueSBuZXcgb3IgbW9kaWZpZWQgQ09ORklHIG9wdGlvbnMgZG9uJ3QgbXVjayB1cCB0aGUgY29uZmlnIG1lbnUuCis2KSBBbnkgbmV3IG9yIG1vZGlmaWVkIGBgQ09ORklHYGAgb3B0aW9ucyBkb24ndCBtdWNrIHVwIHRoZSBjb25maWcgbWVudS4KIAotNzogQWxsIG5ldyBLY29uZmlnIG9wdGlvbnMgaGF2ZSBoZWxwIHRleHQuCis3KSBBbGwgbmV3IGBgS2NvbmZpZ2BgIG9wdGlvbnMgaGF2ZSBoZWxwIHRleHQuCiAKLTg6IEhhcyBiZWVuIGNhcmVmdWxseSByZXZpZXdlZCB3aXRoIHJlc3BlY3QgdG8gcmVsZXZhbnQgS2NvbmZpZworOCkgSGFzIGJlZW4gY2FyZWZ1bGx5IHJldmlld2VkIHdpdGggcmVzcGVjdCB0byByZWxldmFudCBgYEtjb25maWdgYAogICAgY29tYmluYXRpb25zLiAgVGhpcyBpcyB2ZXJ5IGhhcmQgdG8gZ2V0IHJpZ2h0IHdpdGggdGVzdGluZyAtLSBicmFpbnBvd2VyCiAgICBwYXlzIG9mZiBoZXJlLgogCi05OiBDaGVjayBjbGVhbmx5IHdpdGggc3BhcnNlLgorOSkgQ2hlY2sgY2xlYW5seSB3aXRoIHNwYXJzZS4KIAotMTA6IFVzZSAnbWFrZSBjaGVja3N0YWNrJyBhbmQgJ21ha2UgbmFtZXNwYWNlY2hlY2snIGFuZCBmaXggYW55IHByb2JsZW1zCi0gICAgdGhhdCB0aGV5IGZpbmQuICBOb3RlOiBjaGVja3N0YWNrIGRvZXMgbm90IHBvaW50IG91dCBwcm9ibGVtcyBleHBsaWNpdGx5LAotICAgIGJ1dCBhbnkgb25lIGZ1bmN0aW9uIHRoYXQgdXNlcyBtb3JlIHRoYW4gNTEyIGJ5dGVzIG9uIHRoZSBzdGFjayBpcyBhCi0gICAgY2FuZGlkYXRlIGZvciBjaGFuZ2UuCisxMCkgVXNlIGBgbWFrZSBjaGVja3N0YWNrYGAgYW5kIGBgbWFrZSBuYW1lc3BhY2VjaGVja2BgIGFuZCBmaXggYW55IHByb2JsZW1zCisgICAgdGhhdCB0aGV5IGZpbmQuCiAKLTExOiBJbmNsdWRlIGtlcm5lbC1kb2MgdG8gZG9jdW1lbnQgZ2xvYmFsIGtlcm5lbCBBUElzLiAgKE5vdCByZXF1aXJlZCBmb3IKLSAgICBzdGF0aWMgZnVuY3Rpb25zLCBidXQgT0sgdGhlcmUgYWxzby4pIFVzZSAnbWFrZSBodG1sZG9jcycgb3IgJ21ha2UKLSAgICBtYW5kb2NzJyB0byBjaGVjayB0aGUga2VybmVsLWRvYyBhbmQgZml4IGFueSBpc3N1ZXMuCisgICAgLi4gbm90ZTo6CiAKLTEyOiBIYXMgYmVlbiB0ZXN0ZWQgd2l0aCBDT05GSUdfUFJFRU1QVCwgQ09ORklHX0RFQlVHX1BSRUVNUFQsCi0gICAgQ09ORklHX0RFQlVHX1NMQUIsIENPTkZJR19ERUJVR19QQUdFQUxMT0MsIENPTkZJR19ERUJVR19NVVRFWEVTLAotICAgIENPTkZJR19ERUJVR19TUElOTE9DSywgQ09ORklHX0RFQlVHX0FUT01JQ19TTEVFUCwgQ09ORklHX1BST1ZFX1JDVQotICAgIGFuZCBDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRCBhbGwgc2ltdWx0YW5lb3VzbHkgZW5hYmxlZC4KKyAgICAgICBgYGNoZWNrc3RhY2tgYCBkb2VzIG5vdCBwb2ludCBvdXQgcHJvYmxlbXMgZXhwbGljaXRseSwKKyAgICAgICBidXQgYW55IG9uZSBmdW5jdGlvbiB0aGF0IHVzZXMgbW9yZSB0aGFuIDUxMiBieXRlcyBvbiB0aGUgc3RhY2sgaXMgYQorICAgICAgIGNhbmRpZGF0ZSBmb3IgY2hhbmdlLgogCi0xMzogSGFzIGJlZW4gYnVpbGQtIGFuZCBydW50aW1lIHRlc3RlZCB3aXRoIGFuZCB3aXRob3V0IENPTkZJR19TTVAgYW5kCi0gICAgQ09ORklHX1BSRUVNUFQuCisxMSkgSW5jbHVkZSA6cmVmOmBrZXJuZWwtZG9jIDxrZXJuZWxfZG9jPmAgdG8gZG9jdW1lbnQgZ2xvYmFsICBrZXJuZWwgQVBJcy4KKyAgICAoTm90IHJlcXVpcmVkIGZvciBzdGF0aWMgZnVuY3Rpb25zLCBidXQgT0sgdGhlcmUgYWxzby4pIFVzZQorICAgIGBgbWFrZSBodG1sZG9jc2BgIG9yIGBgbWFrZSBwZGZkb2NzYGAgdG8gY2hlY2sgdGhlCisgICAgOnJlZjpga2VybmVsLWRvYyA8a2VybmVsX2RvYz5gIGFuZCBmaXggYW55IGlzc3Vlcy4KIAotMTQ6IElmIHRoZSBwYXRjaCBhZmZlY3RzIElPL0Rpc2ssIGV0YzogaGFzIGJlZW4gdGVzdGVkIHdpdGggYW5kIHdpdGhvdXQKLSAgICBDT05GSUdfTEJEQUYuCisxMikgSGFzIGJlZW4gdGVzdGVkIHdpdGggYGBDT05GSUdfUFJFRU1QVGBgLCBgYENPTkZJR19ERUJVR19QUkVFTVBUYGAsCisgICAgYGBDT05GSUdfREVCVUdfU0xBQmBgLCBgYENPTkZJR19ERUJVR19QQUdFQUxMT0NgYCwgYGBDT05GSUdfREVCVUdfTVVURVhFU2BgLAorICAgIGBgQ09ORklHX0RFQlVHX1NQSU5MT0NLYGAsIGBgQ09ORklHX0RFQlVHX0FUT01JQ19TTEVFUGBgLAorICAgIGBgQ09ORklHX1BST1ZFX1JDVWBgIGFuZCBgYENPTkZJR19ERUJVR19PQkpFQ1RTX1JDVV9IRUFEYGAgYWxsCisgICAgc2ltdWx0YW5lb3VzbHkgZW5hYmxlZC4KIAotMTU6IEFsbCBjb2RlcGF0aHMgaGF2ZSBiZWVuIGV4ZXJjaXNlZCB3aXRoIGFsbCBsb2NrZGVwIGZlYXR1cmVzIGVuYWJsZWQuCisxMykgSGFzIGJlZW4gYnVpbGQtIGFuZCBydW50aW1lIHRlc3RlZCB3aXRoIGFuZCB3aXRob3V0IGBgQ09ORklHX1NNUGBgIGFuZAorICAgIGBgQ09ORklHX1BSRUVNUFQuYGAKIAotMTY6IEFsbCBuZXcgL3Byb2MgZW50cmllcyBhcmUgZG9jdW1lbnRlZCB1bmRlciBEb2N1bWVudGF0aW9uLworMTQpIElmIHRoZSBwYXRjaCBhZmZlY3RzIElPL0Rpc2ssIGV0YzogaGFzIGJlZW4gdGVzdGVkIHdpdGggYW5kIHdpdGhvdXQKKyAgICBgYENPTkZJR19MQkRBRi5gYAogCi0xNzogQWxsIG5ldyBrZXJuZWwgYm9vdCBwYXJhbWV0ZXJzIGFyZSBkb2N1bWVudGVkIGluCi0gICAgRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQuCisxNSkgQWxsIGNvZGVwYXRocyBoYXZlIGJlZW4gZXhlcmNpc2VkIHdpdGggYWxsIGxvY2tkZXAgZmVhdHVyZXMgZW5hYmxlZC4KIAotMTg6IEFsbCBuZXcgbW9kdWxlIHBhcmFtZXRlcnMgYXJlIGRvY3VtZW50ZWQgd2l0aCBNT0RVTEVfUEFSTV9ERVNDKCkKKzE2KSBBbGwgbmV3IGBgL3Byb2NgYCBlbnRyaWVzIGFyZSBkb2N1bWVudGVkIHVuZGVyIGBgRG9jdW1lbnRhdGlvbi9gYAogCi0xOTogQWxsIG5ldyB1c2Vyc3BhY2UgaW50ZXJmYWNlcyBhcmUgZG9jdW1lbnRlZCBpbiBEb2N1bWVudGF0aW9uL0FCSS8uCi0gICAgU2VlIERvY3VtZW50YXRpb24vQUJJL1JFQURNRSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKzE3KSBBbGwgbmV3IGtlcm5lbCBib290IHBhcmFtZXRlcnMgYXJlIGRvY3VtZW50ZWQgaW4KKyAgICBgYERvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0YGAuCisKKzE4KSBBbGwgbmV3IG1vZHVsZSBwYXJhbWV0ZXJzIGFyZSBkb2N1bWVudGVkIHdpdGggYGBNT0RVTEVfUEFSTV9ERVNDKClgYAorCisxOSkgQWxsIG5ldyB1c2Vyc3BhY2UgaW50ZXJmYWNlcyBhcmUgZG9jdW1lbnRlZCBpbiBgYERvY3VtZW50YXRpb24vQUJJL2BgLgorICAgIFNlZSBgYERvY3VtZW50YXRpb24vQUJJL1JFQURNRWBgIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgIFBhdGNoZXMgdGhhdCBjaGFuZ2UgdXNlcnNwYWNlIGludGVyZmFjZXMgc2hvdWxkIGJlIENDZWQgdG8KICAgICBsaW51eC1hcGlAdmdlci5rZXJuZWwub3JnLgogCi0yMDogQ2hlY2sgdGhhdCBpdCBhbGwgcGFzc2VzIGBtYWtlIGhlYWRlcnNfY2hlY2snLgorMjApIENoZWNrIHRoYXQgaXQgYWxsIHBhc3NlcyBgYG1ha2UgaGVhZGVyc19jaGVja2BgLgogCi0yMTogSGFzIGJlZW4gY2hlY2tlZCB3aXRoIGluamVjdGlvbiBvZiBhdCBsZWFzdCBzbGFiIGFuZCBwYWdlLWFsbG9jYXRpb24KLSAgICBmYWlsdXJlcy4gIFNlZSBEb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi8uCisyMSkgSGFzIGJlZW4gY2hlY2tlZCB3aXRoIGluamVjdGlvbiBvZiBhdCBsZWFzdCBzbGFiIGFuZCBwYWdlLWFsbG9jYXRpb24KKyAgICBmYWlsdXJlcy4gIFNlZSBgYERvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2BgLgogCiAgICAgSWYgdGhlIG5ldyBjb2RlIGlzIHN1YnN0YW50aWFsLCBhZGRpdGlvbiBvZiBzdWJzeXN0ZW0tc3BlY2lmaWMgZmF1bHQKICAgICBpbmplY3Rpb24gbWlnaHQgYmUgYXBwcm9wcmlhdGUuCiAKLTIyOiBOZXdseS1hZGRlZCBjb2RlIGhhcyBiZWVuIGNvbXBpbGVkIHdpdGggYGdjYyAtVycgKHVzZSAibWFrZQotICAgIEVYVFJBX0NGTEFHUz0tVyIpLiAgVGhpcyB3aWxsIGdlbmVyYXRlIGxvdHMgb2Ygbm9pc2UsIGJ1dCBpcyBnb29kIGZvcgotICAgIGZpbmRpbmcgYnVncyBsaWtlICJ3YXJuaW5nOiBjb21wYXJpc29uIGJldHdlZW4gc2lnbmVkIGFuZCB1bnNpZ25lZCIuCisyMikgTmV3bHktYWRkZWQgY29kZSBoYXMgYmVlbiBjb21waWxlZCB3aXRoIGBgZ2NjIC1XYGAgKHVzZQorICAgIGBgbWFrZSBFWFRSQV9DRkxBR1M9LVdgYCkuICBUaGlzIHdpbGwgZ2VuZXJhdGUgbG90cyBvZiBub2lzZSwgYnV0IGlzIGdvb2QKKyAgICBmb3IgZmluZGluZyBidWdzIGxpa2UgIndhcm5pbmc6IGNvbXBhcmlzb24gYmV0d2VlbiBzaWduZWQgYW5kIHVuc2lnbmVkIi4KIAotMjM6IFRlc3RlZCBhZnRlciBpdCBoYXMgYmVlbiBtZXJnZWQgaW50byB0aGUgLW1tIHBhdGNoc2V0IHRvIG1ha2Ugc3VyZQorMjMpIFRlc3RlZCBhZnRlciBpdCBoYXMgYmVlbiBtZXJnZWQgaW50byB0aGUgLW1tIHBhdGNoc2V0IHRvIG1ha2Ugc3VyZQogICAgIHRoYXQgaXQgc3RpbGwgd29ya3Mgd2l0aCBhbGwgb2YgdGhlIG90aGVyIHF1ZXVlZCBwYXRjaGVzIGFuZCB2YXJpb3VzCiAgICAgY2hhbmdlcyBpbiB0aGUgVk0sIFZGUywgYW5kIG90aGVyIHN1YnN5c3RlbXMuCiAKLTI0OiBBbGwgbWVtb3J5IGJhcnJpZXJzIHtlLmcuLCBiYXJyaWVyKCksIHJtYigpLCB3bWIoKX0gbmVlZCBhIGNvbW1lbnQgaW4gdGhlCi0gICAgc291cmNlIGNvZGUgdGhhdCBleHBsYWlucyB0aGUgbG9naWMgb2Ygd2hhdCB0aGV5IGFyZSBkb2luZyBhbmQgd2h5LgorMjQpIEFsbCBtZW1vcnkgYmFycmllcnMge2UuZy4sIGBgYmFycmllcigpYGAsIGBgcm1iKClgYCwgYGB3bWIoKWBgfSBuZWVkIGEKKyAgICBjb21tZW50IGluIHRoZSBzb3VyY2UgY29kZSB0aGF0IGV4cGxhaW5zIHRoZSBsb2dpYyBvZiB3aGF0IHRoZXkgYXJlIGRvaW5nCisgICAgYW5kIHdoeS4KIAotMjU6IElmIGFueSBpb2N0bCdzIGFyZSBhZGRlZCBieSB0aGUgcGF0Y2gsIHRoZW4gYWxzbyB1cGRhdGUKLSAgICBEb2N1bWVudGF0aW9uL2lvY3RsL2lvY3RsLW51bWJlci50eHQuCisyNSkgSWYgYW55IGlvY3RsJ3MgYXJlIGFkZGVkIGJ5IHRoZSBwYXRjaCwgdGhlbiBhbHNvIHVwZGF0ZQorICAgIGBgRG9jdW1lbnRhdGlvbi9pb2N0bC9pb2N0bC1udW1iZXIudHh0YGAuCiAKLTI2OiBJZiB5b3VyIG1vZGlmaWVkIHNvdXJjZSBjb2RlIGRlcGVuZHMgb24gb3IgdXNlcyBhbnkgb2YgdGhlIGtlcm5lbAotICAgIEFQSXMgb3IgZmVhdHVyZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgZm9sbG93aW5nIGtjb25maWcgc3ltYm9scywKLSAgICB0aGVuIHRlc3QgbXVsdGlwbGUgYnVpbGRzIHdpdGggdGhlIHJlbGF0ZWQga2NvbmZpZyBzeW1ib2xzIGRpc2FibGVkCi0gICAgYW5kL29yID1tIChpZiB0aGF0IG9wdGlvbiBpcyBhdmFpbGFibGUpIFtub3QgYWxsIG9mIHRoZXNlIGF0IHRoZQorMjYpIElmIHlvdXIgbW9kaWZpZWQgc291cmNlIGNvZGUgZGVwZW5kcyBvbiBvciB1c2VzIGFueSBvZiB0aGUga2VybmVsCisgICAgQVBJcyBvciBmZWF0dXJlcyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoZSBmb2xsb3dpbmcgYGBLY29uZmlnYGAgc3ltYm9scywKKyAgICB0aGVuIHRlc3QgbXVsdGlwbGUgYnVpbGRzIHdpdGggdGhlIHJlbGF0ZWQgYGBLY29uZmlnYGAgc3ltYm9scyBkaXNhYmxlZAorICAgIGFuZC9vciBgYD1tYGAgKGlmIHRoYXQgb3B0aW9uIGlzIGF2YWlsYWJsZSkgW25vdCBhbGwgb2YgdGhlc2UgYXQgdGhlCiAgICAgc2FtZSB0aW1lLCBqdXN0IHZhcmlvdXMvcmFuZG9tIGNvbWJpbmF0aW9ucyBvZiB0aGVtXToKIAotICAgIENPTkZJR19TTVAsIENPTkZJR19TWVNGUywgQ09ORklHX1BST0NfRlMsIENPTkZJR19JTlBVVCwgQ09ORklHX1BDSSwKLSAgICBDT05GSUdfQkxPQ0ssIENPTkZJR19QTSwgQ09ORklHX01BR0lDX1NZU1JRLAotICAgIENPTkZJR19ORVQsIENPTkZJR19JTkVUPW4gKGJ1dCBsYXR0ZXIgd2l0aCBDT05GSUdfTkVUPXkpCisgICAgYGBDT05GSUdfU01QYGAsIGBgQ09ORklHX1NZU0ZTYGAsIGBgQ09ORklHX1BST0NfRlNgYCwgYGBDT05GSUdfSU5QVVRgYCwgYGBDT05GSUdfUENJYGAsIGBgQ09ORklHX0JMT0NLYGAsIGBgQ09ORklHX1BNYGAsIGBgQ09ORklHX01BR0lDX1NZU1JRYGAsCisgICAgYGBDT05GSUdfTkVUYGAsIGBgQ09ORklHX0lORVQ9bmBgIChidXQgbGF0dGVyIHdpdGggYGBDT05GSUdfTkVUPXlgYCkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdEcml2ZXJzIGIvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nRHJpdmVycwppbmRleCAzMWQzNzI2Li4yNTJiNzdhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdEcml2ZXJzCisrKyBiL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ0RyaXZlcnMKQEAgLTEsNSArMSw3IEBACisuLiBfc3VibWl0dGluZ2RyaXZlcnM6CisKIFN1Ym1pdHRpbmcgRHJpdmVycyBGb3IgVGhlIExpbnV4IEtlcm5lbAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogVGhpcyBkb2N1bWVudCBpcyBpbnRlbmRlZCB0byBleHBsYWluIGhvdyB0byBzdWJtaXQgZGV2aWNlIGRyaXZlcnMgdG8gdGhlCiB2YXJpb3VzIGtlcm5lbCB0cmVlcy4gTm90ZSB0aGF0IGlmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiB2aWRlbyBjYXJkIGRyaXZlcnMKQEAgLTM4LDQyICs0MCw0OCBAQAogCW1haW50YWluZXIgZG9lcyBub3QgcmVzcG9uZCBvciB5b3UgY2Fubm90IGZpbmQgdGhlIGFwcHJvcHJpYXRlCiAJbWFpbnRhaW5lciB0aGVuIHBsZWFzZSBjb250YWN0IFdpbGx5IFRhcnJlYXUgPHdAMXd0LmV1Pi4KIAotTGludXggMi42OgorTGludXggMi42IGFuZCB1cHBlcjoKIAlUaGUgc2FtZSBydWxlcyBhcHBseSBhcyAyLjQgZXhjZXB0IHRoYXQgeW91IHNob3VsZCBmb2xsb3cgbGludXgta2VybmVsCi0JdG8gdHJhY2sgY2hhbmdlcyBpbiBBUEkncy4gVGhlIGZpbmFsIGNvbnRhY3QgcG9pbnQgZm9yIExpbnV4IDIuNgorCXRvIHRyYWNrIGNoYW5nZXMgaW4gQVBJJ3MuIFRoZSBmaW5hbCBjb250YWN0IHBvaW50IGZvciBMaW51eCAyLjYrCiAJc3VibWlzc2lvbnMgaXMgQW5kcmV3IE1vcnRvbi4KIAogV2hhdCBDcml0ZXJpYSBEZXRlcm1pbmUgQWNjZXB0YW5jZQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1MaWNlbnNpbmc6CVRoZSBjb2RlIG11c3QgYmUgcmVsZWFzZWQgdG8gdXMgdW5kZXIgdGhlCitMaWNlbnNpbmc6CisJCVRoZSBjb2RlIG11c3QgYmUgcmVsZWFzZWQgdG8gdXMgdW5kZXIgdGhlCiAJCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiBXZSBkb24ndCBpbnNpc3Qgb24gYW55IGtpbmQKIAkJb2YgZXhjbHVzaXZlIEdQTCBsaWNlbnNpbmcsIGFuZCBpZiB5b3Ugd2lzaCB0aGUgZHJpdmVyCiAJCXRvIGJlIHVzZWZ1bCB0byBvdGhlciBjb21tdW5pdGllcyBzdWNoIGFzIEJTRCB5b3UgbWF5IHdlbGwKIAkJd2lzaCB0byByZWxlYXNlIHVuZGVyIG11bHRpcGxlIGxpY2Vuc2VzLgogCQlTZWUgYWNjZXB0ZWQgbGljZW5zZXMgYXQgaW5jbHVkZS9saW51eC9tb2R1bGUuaAogCi1Db3B5cmlnaHQ6CVRoZSBjb3B5cmlnaHQgb3duZXIgbXVzdCBhZ3JlZSB0byB1c2Ugb2YgR1BMLgorQ29weXJpZ2h0OgorCQlUaGUgY29weXJpZ2h0IG93bmVyIG11c3QgYWdyZWUgdG8gdXNlIG9mIEdQTC4KIAkJSXQncyBiZXN0IGlmIHRoZSBzdWJtaXR0ZXIgYW5kIGNvcHlyaWdodCBvd25lcgogCQlhcmUgdGhlIHNhbWUgcGVyc29uL2VudGl0eS4gSWYgbm90LCB0aGUgbmFtZSBvZgogCQl0aGUgcGVyc29uL2VudGl0eSBhdXRob3JpemluZyB1c2Ugb2YgR1BMIHNob3VsZCBiZQogCQlsaXN0ZWQgaW4gY2FzZSBpdCdzIG5lY2Vzc2FyeSB0byB2ZXJpZnkgdGhlIHdpbGwgb2YKIAkJdGhlIGNvcHlyaWdodCBvd25lci4KIAotSW50ZXJmYWNlczoJSWYgeW91ciBkcml2ZXIgdXNlcyBleGlzdGluZyBpbnRlcmZhY2VzIGFuZCBiZWhhdmVzIGxpa2UKK0ludGVyZmFjZXM6CisJCUlmIHlvdXIgZHJpdmVyIHVzZXMgZXhpc3RpbmcgaW50ZXJmYWNlcyBhbmQgYmVoYXZlcyBsaWtlCiAJCW90aGVyIGRyaXZlcnMgaW4gdGhlIHNhbWUgY2xhc3MgaXQgd2lsbCBiZSBtdWNoIG1vcmUgbGlrZWx5CiAJCXRvIGJlIGFjY2VwdGVkIHRoYW4gaWYgaXQgaW52ZW50cyBncmF0dWl0b3VzIG5ldyBvbmVzLgogCQlJZiB5b3UgbmVlZCB0byBpbXBsZW1lbnQgYSBjb21tb24gQVBJIG92ZXIgTGludXggYW5kIE5UCiAJCWRyaXZlcnMgZG8gaXQgaW4gdXNlcnNwYWNlLgogCi1Db2RlOgkJUGxlYXNlIHVzZSB0aGUgTGludXggc3R5bGUgb2YgY29kZSBmb3JtYXR0aW5nIGFzIGRvY3VtZW50ZWQKLQkJaW4gRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZS4gSWYgeW91IGhhdmUgc2VjdGlvbnMgb2YgY29kZQorQ29kZToKKwkJUGxlYXNlIHVzZSB0aGUgTGludXggc3R5bGUgb2YgY29kZSBmb3JtYXR0aW5nIGFzIGRvY3VtZW50ZWQKKwkJaW4gOnJlZjpgRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZSA8Y29kaW5nU3R5bGU+YC4KKwkJSWYgeW91IGhhdmUgc2VjdGlvbnMgb2YgY29kZQogCQl0aGF0IG5lZWQgdG8gYmUgaW4gb3RoZXIgZm9ybWF0cywgZm9yIGV4YW1wbGUgYmVjYXVzZSB0aGV5CiAJCWFyZSBzaGFyZWQgd2l0aCBhIHdpbmRvd3MgZHJpdmVyIGtpdCBhbmQgeW91IHdhbnQgdG8KIAkJbWFpbnRhaW4gdGhlbSBqdXN0IG9uY2Ugc2VwYXJhdGUgdGhlbSBvdXQgbmljZWx5IGFuZCBub3RlCiAJCXRoaXMgZmFjdC4KIAotUG9ydGFiaWxpdHk6CVBvaW50ZXJzIGFyZSBub3QgYWx3YXlzIDMyYml0cywgbm90IGFsbCBjb21wdXRlcnMgYXJlIGxpdHRsZQorUG9ydGFiaWxpdHk6CisJCVBvaW50ZXJzIGFyZSBub3QgYWx3YXlzIDMyYml0cywgbm90IGFsbCBjb21wdXRlcnMgYXJlIGxpdHRsZQogCQllbmRpYW4sIHBlb3BsZSBkbyBub3QgYWxsIGhhdmUgZmxvYXRpbmcgcG9pbnQgYW5kIHlvdQogCQlzaG91bGRuJ3QgdXNlIGlubGluZSB4ODYgYXNzZW1ibGVyIGluIHlvdXIgZHJpdmVyIHdpdGhvdXQKIAkJY2FyZWZ1bCB0aG91Z2h0LiBQdXJlIHg4NiBkcml2ZXJzIGdlbmVyYWxseSBhcmUgbm90IHBvcHVsYXIuCkBAIC04MSwxMiArODksMTQgQEAKIAkJYnV0IGl0IGlzIGVhc3kgdG8gbWFrZSBzdXJlIHRoZSBjb2RlIGNhbiBlYXNpbHkgYmUgbWFkZQogCQlwb3J0YWJsZS4KIAotQ2xhcml0eToJSXQgaGVscHMgaWYgYW55b25lIGNhbiBzZWUgaG93IHRvIGZpeCB0aGUgZHJpdmVyLiBJdCBoZWxwcworQ2xhcml0eToKKwkJSXQgaGVscHMgaWYgYW55b25lIGNhbiBzZWUgaG93IHRvIGZpeCB0aGUgZHJpdmVyLiBJdCBoZWxwcwogCQl5b3UgYmVjYXVzZSB5b3UgZ2V0IHBhdGNoZXMgbm90IGJ1ZyByZXBvcnRzLiBJZiB5b3Ugc3VibWl0IGEKIAkJZHJpdmVyIHRoYXQgaW50ZW50aW9uYWxseSBvYmZ1c2NhdGVzIGhvdyB0aGUgaGFyZHdhcmUgd29ya3MKIAkJaXQgd2lsbCBnbyBpbiB0aGUgYml0YnVja2V0LgogCi1QTSBzdXBwb3J0OglTaW5jZSBMaW51eCBpcyB1c2VkIG9uIG1hbnkgcG9ydGFibGUgYW5kIGRlc2t0b3Agc3lzdGVtcywgeW91cgorUE0gc3VwcG9ydDoKKwkJU2luY2UgTGludXggaXMgdXNlZCBvbiBtYW55IHBvcnRhYmxlIGFuZCBkZXNrdG9wIHN5c3RlbXMsIHlvdXIKIAkJZHJpdmVyIGlzIGxpa2VseSB0byBiZSB1c2VkIG9uIHN1Y2ggYSBzeXN0ZW0gYW5kIHRoZXJlZm9yZSBpdAogCQlzaG91bGQgc3VwcG9ydCBiYXNpYyBwb3dlciBtYW5hZ2VtZW50IGJ5IGltcGxlbWVudGluZywgaWYKIAkJbmVjZXNzYXJ5LCB0aGUgLnN1c3BlbmQgYW5kIC5yZXN1bWUgbWV0aG9kcyB1c2VkIGR1cmluZyB0aGUKQEAgLTEwMSw3ICsxMTEsOCBAQAogCQljb21wbGV0ZSBvdmVydmlldyBvZiB0aGUgcG93ZXIgbWFuYWdlbWVudCBpc3N1ZXMgcmVsYXRlZCB0bwogCQlkcml2ZXJzIHNlZSBEb2N1bWVudGF0aW9uL3Bvd2VyL2RldmljZXMudHh0IC4KIAotQ29udHJvbDoJSW4gZ2VuZXJhbCBpZiB0aGVyZSBpcyBhY3RpdmUgbWFpbnRlbmFuY2Ugb2YgYSBkcml2ZXIgYnkKK0NvbnRyb2w6CisJCUluIGdlbmVyYWwgaWYgdGhlcmUgaXMgYWN0aXZlIG1haW50ZW5hbmNlIG9mIGEgZHJpdmVyIGJ5CiAJCXRoZSBhdXRob3IgdGhlbiBwYXRjaGVzIHdpbGwgYmUgcmVkaXJlY3RlZCB0byB0aGVtIHVubGVzcwogCQl0aGV5IGFyZSB0b3RhbGx5IG9idmlvdXMgYW5kIHdpdGhvdXQgbmVlZCBvZiBjaGVja2luZy4KIAkJSWYgeW91IHdhbnQgdG8gYmUgdGhlIGNvbnRhY3QgYW5kIHVwZGF0ZSBwb2ludCBmb3IgdGhlCkBAIC0xMTEsMTMgKzEyMiwxNSBAQAogV2hhdCBDcml0ZXJpYSBEbyBOb3QgRGV0ZXJtaW5lIEFjY2VwdGFuY2UKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVZlbmRvcjoJCUJlaW5nIHRoZSBoYXJkd2FyZSB2ZW5kb3IgYW5kIG1haW50YWluaW5nIHRoZSBkcml2ZXIgaXMKK1ZlbmRvcjoKKwkJQmVpbmcgdGhlIGhhcmR3YXJlIHZlbmRvciBhbmQgbWFpbnRhaW5pbmcgdGhlIGRyaXZlciBpcwogCQlvZnRlbiBhIGdvb2QgdGhpbmcuIElmIHRoZXJlIGlzIGEgc3RhYmxlIHdvcmtpbmcgZHJpdmVyIGZyb20KIAkJb3RoZXIgcGVvcGxlIGFscmVhZHkgaW4gdGhlIHRyZWUgZG9uJ3QgZXhwZWN0ICd3ZSBhcmUgdGhlCiAJCXZlbmRvcicgdG8gZ2V0IHlvdXIgZHJpdmVyIGNob3Nlbi4gSWRlYWxseSB3b3JrIHdpdGggdGhlCiAJCWV4aXN0aW5nIGRyaXZlciBhdXRob3IgdG8gYnVpbGQgYSBzaW5nbGUgcGVyZmVjdCBkcml2ZXIuCiAKLUF1dGhvcjoJCUl0IGRvZXNuJ3QgbWF0dGVyIGlmIGEgbGFyZ2UgTGludXggY29tcGFueSB3cm90ZSB0aGUgZHJpdmVyLAorQXV0aG9yOgorCQlJdCBkb2Vzbid0IG1hdHRlciBpZiBhIGxhcmdlIExpbnV4IGNvbXBhbnkgd3JvdGUgdGhlIGRyaXZlciwKIAkJb3IgeW91IGRpZC4gTm9ib2R5IGhhcyBhbnkgc3BlY2lhbCBhY2Nlc3MgdG8gdGhlIGtlcm5lbAogCQl0cmVlLiBBbnlvbmUgd2hvIHRlbGxzIHlvdSBvdGhlcndpc2UgaXNuJ3QgdGVsbGluZyB0aGUKIAkJd2hvbGUgc3RvcnkuCkBAIC0xMjcsOCArMTQwLDEwIEBACiAtLS0tLS0tLS0KIAogTGludXgga2VybmVsIG1hc3RlciB0cmVlOgotCWZ0cC4/Py5rZXJuZWwub3JnOi9wdWIvbGludXgva2VybmVsLy4uLgotCT8/ID09IHlvdXIgY291bnRyeSBjb2RlLCBzdWNoIGFzICJ1cyIsICJ1ayIsICJmciIsIGV0Yy4KKwlmdHAuXCAqY291bnRyeV9jb2RlKlwgLmtlcm5lbC5vcmc6L3B1Yi9saW51eC9rZXJuZWwvLi4uCisKKwl3aGVyZSAqY291bnRyeV9jb2RlKiA9PSB5b3VyIGNvdW50cnkgY29kZSwgc3VjaCBhcworCSoqdXMqKiwgKip1ayoqLCAqKmZyKiosIGV0Yy4KIAogCWh0dHA6Ly9naXQua2VybmVsLm9yZy8/cD1saW51eC9rZXJuZWwvZ2l0L3RvcnZhbGRzL2xpbnV4LmdpdAogCkBAIC0xNDEsMTQgKzE1NiwxOSBAQAogCiBMV04ubmV0OgogCVdlZWtseSBzdW1tYXJ5IG9mIGtlcm5lbCBkZXZlbG9wbWVudCBhY3Rpdml0eSAtIGh0dHA6Ly9sd24ubmV0LworCiAJMi42IEFQSSBjaGFuZ2VzOgorCiAJCWh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzIuNi1rZXJuZWwtYXBpLworCiAJUG9ydGluZyBkcml2ZXJzIGZyb20gcHJpb3Iga2VybmVscyB0byAyLjY6CisKIAkJaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvZHJpdmVyLXBvcnRpbmcvCiAKIEtlcm5lbE5ld2JpZXM6CiAJRG9jdW1lbnRhdGlvbiBhbmQgYXNzaXN0YW5jZSBmb3IgbmV3IGtlcm5lbCBwcm9ncmFtbWVycwotCWh0dHA6Ly9rZXJuZWxuZXdiaWVzLm9yZy8KKworCQlodHRwOi8va2VybmVsbmV3Ymllcy5vcmcvCiAKIExpbnV4IFVTQiBwcm9qZWN0OgogCWh0dHA6Ly93d3cubGludXgtdXNiLm9yZy8KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMgYi9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzCmluZGV4IDhjNzlmMWQuLjM2ZjFkZWQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMKKysrIGIvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcwpAQCAtMSw5ICsxLDcgQEAKKy4uIF9zdWJtaXR0aW5ncGF0Y2hlczoKIAotCUhvdyB0byBHZXQgWW91ciBDaGFuZ2UgSW50byB0aGUgTGludXggS2VybmVsCi0JCW9yCi0JQ2FyZSBBbmQgT3BlcmF0aW9uIE9mIFlvdXIgTGludXMgVG9ydmFsZHMKLQotCitIb3cgdG8gR2V0IFlvdXIgQ2hhbmdlIEludG8gdGhlIExpbnV4IEtlcm5lbCBvciBDYXJlIEFuZCBPcGVyYXRpb24gT2YgWW91ciBMaW51cyBUb3J2YWxkcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogRm9yIGEgcGVyc29uIG9yIGNvbXBhbnkgd2hvIHdpc2hlcyB0byBzdWJtaXQgYSBjaGFuZ2UgdG8gdGhlIExpbnV4CiBrZXJuZWwsIHRoZSBwcm9jZXNzIGNhbiBzb21ldGltZXMgYmUgZGF1bnRpbmcgaWYgeW91J3JlIG5vdCBmYW1pbGlhcgpAQCAtMTIsNTcgKzEwLDU5IEBACiAKIFRoaXMgZG9jdW1lbnQgY29udGFpbnMgYSBsYXJnZSBudW1iZXIgb2Ygc3VnZ2VzdGlvbnMgaW4gYSByZWxhdGl2ZWx5IHRlcnNlCiBmb3JtYXQuICBGb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gaG93IHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvY2Vzcwotd29ya3MsIHNlZSBEb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MuICBBbHNvLCByZWFkCi1Eb2N1bWVudGF0aW9uL1N1Ym1pdENoZWNrbGlzdCBmb3IgYSBsaXN0IG9mIGl0ZW1zIHRvIGNoZWNrIGJlZm9yZQord29ya3MsIHNlZSA6cmVmOmBEb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MgPGRldmVsb3BtZW50X3Byb2Nlc3NfbWFpbj5gLgorQWxzbywgcmVhZCA6cmVmOmBEb2N1bWVudGF0aW9uL1N1Ym1pdENoZWNrbGlzdCA8c3VibWl0Y2hlY2tsaXN0PmAKK2ZvciBhIGxpc3Qgb2YgaXRlbXMgdG8gY2hlY2sgYmVmb3JlCiBzdWJtaXR0aW5nIGNvZGUuICBJZiB5b3UgYXJlIHN1Ym1pdHRpbmcgYSBkcml2ZXIsIGFsc28gcmVhZAotRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nRHJpdmVyczsgZm9yIGRldmljZSB0cmVlIGJpbmRpbmcgcGF0Y2hlcywgcmVhZAorOnJlZjpgRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nRHJpdmVycyA8c3VibWl0dGluZ2RyaXZlcnM+YDsKK2ZvciBkZXZpY2UgdHJlZSBiaW5kaW5nIHBhdGNoZXMsIHJlYWQKIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zdWJtaXR0aW5nLXBhdGNoZXMudHh0LgogCi1NYW55IG9mIHRoZXNlIHN0ZXBzIGRlc2NyaWJlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoZSBnaXQgdmVyc2lvbgotY29udHJvbCBzeXN0ZW07IGlmIHlvdSB1c2UgZ2l0IHRvIHByZXBhcmUgeW91ciBwYXRjaGVzLCB5b3UnbGwgZmluZCBtdWNoCitNYW55IG9mIHRoZXNlIHN0ZXBzIGRlc2NyaWJlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoZSBgYGdpdGBgIHZlcnNpb24KK2NvbnRyb2wgc3lzdGVtOyBpZiB5b3UgdXNlIGBgZ2l0YGAgdG8gcHJlcGFyZSB5b3VyIHBhdGNoZXMsIHlvdSdsbCBmaW5kIG11Y2gKIG9mIHRoZSBtZWNoYW5pY2FsIHdvcmsgZG9uZSBmb3IgeW91LCB0aG91Z2ggeW91J2xsIHN0aWxsIG5lZWQgdG8gcHJlcGFyZQotYW5kIGRvY3VtZW50IGEgc2Vuc2libGUgc2V0IG9mIHBhdGNoZXMuICBJbiBnZW5lcmFsLCB1c2Ugb2YgZ2l0IHdpbGwgbWFrZQorYW5kIGRvY3VtZW50IGEgc2Vuc2libGUgc2V0IG9mIHBhdGNoZXMuICBJbiBnZW5lcmFsLCB1c2Ugb2YgYGBnaXRgYCB3aWxsIG1ha2UKIHlvdXIgbGlmZSBhcyBhIGtlcm5lbCBkZXZlbG9wZXIgZWFzaWVyLgogCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU0VDVElPTiAxIC0gQ1JFQVRJTkcgQU5EIFNFTkRJTkcgWU9VUiBDSEFOR0UKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDcmVhdGluZyBhbmQgU2VuZGluZyB5b3VyIENoYW5nZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogCiAwKSBPYnRhaW4gYSBjdXJyZW50IHNvdXJjZSB0cmVlCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIElmIHlvdSBkbyBub3QgaGF2ZSBhIHJlcG9zaXRvcnkgd2l0aCB0aGUgY3VycmVudCBrZXJuZWwgc291cmNlIGhhbmR5LCB1c2UKLWdpdCB0byBvYnRhaW4gb25lLiAgWW91J2xsIHdhbnQgdG8gc3RhcnQgd2l0aCB0aGUgbWFpbmxpbmUgcmVwb3NpdG9yeSwKLXdoaWNoIGNhbiBiZSBncmFiYmVkIHdpdGg6CitgYGdpdGBgIHRvIG9idGFpbiBvbmUuICBZb3UnbGwgd2FudCB0byBzdGFydCB3aXRoIHRoZSBtYWlubGluZSByZXBvc2l0b3J5LAord2hpY2ggY2FuIGJlIGdyYWJiZWQgd2l0aDo6CiAKLSAgZ2l0IGNsb25lIGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC90b3J2YWxkcy9saW51eC5naXQgCisgIGdpdCBjbG9uZSBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvdG9ydmFsZHMvbGludXguZ2l0CiAKIE5vdGUsIGhvd2V2ZXIsIHRoYXQgeW91IG1heSBub3Qgd2FudCB0byBkZXZlbG9wIGFnYWluc3QgdGhlIG1haW5saW5lIHRyZWUKIGRpcmVjdGx5LiAgTW9zdCBzdWJzeXN0ZW0gbWFpbnRhaW5lcnMgcnVuIHRoZWlyIG93biB0cmVlcyBhbmQgd2FudCB0byBzZWUKLXBhdGNoZXMgcHJlcGFyZWQgYWdhaW5zdCB0aG9zZSB0cmVlcy4gIFNlZSB0aGUgIlQ6IiBlbnRyeSBmb3IgdGhlIHN1YnN5c3RlbQorcGF0Y2hlcyBwcmVwYXJlZCBhZ2FpbnN0IHRob3NlIHRyZWVzLiAgU2VlIHRoZSAqKlQ6KiogZW50cnkgZm9yIHRoZSBzdWJzeXN0ZW0KIGluIHRoZSBNQUlOVEFJTkVSUyBmaWxlIHRvIGZpbmQgdGhhdCB0cmVlLCBvciBzaW1wbHkgYXNrIHRoZSBtYWludGFpbmVyIGlmCiB0aGUgdHJlZSBpcyBub3QgbGlzdGVkIHRoZXJlLgogCiBJdCBpcyBzdGlsbCBwb3NzaWJsZSB0byBkb3dubG9hZCBrZXJuZWwgcmVsZWFzZXMgdmlhIHRhcmJhbGxzIChhcyBkZXNjcmliZWQKIGluIHRoZSBuZXh0IHNlY3Rpb24pLCBidXQgdGhhdCBpcyB0aGUgaGFyZCB3YXkgdG8gZG8ga2VybmVsIGRldmVsb3BtZW50LgogCi0xKSAiZGlmZiAtdXAiCi0tLS0tLS0tLS0tLS0KKzEpIGBgZGlmZiAtdXBgYAorLS0tLS0tLS0tLS0tLS0tCiAKLUlmIHlvdSBtdXN0IGdlbmVyYXRlIHlvdXIgcGF0Y2hlcyBieSBoYW5kLCB1c2UgImRpZmYgLXVwIiBvciAiZGlmZiAtdXByTiIKK0lmIHlvdSBtdXN0IGdlbmVyYXRlIHlvdXIgcGF0Y2hlcyBieSBoYW5kLCB1c2UgYGBkaWZmIC11cGBgIG9yIGBgZGlmZiAtdXByTmBgCiB0byBjcmVhdGUgcGF0Y2hlcy4gIEdpdCBnZW5lcmF0ZXMgcGF0Y2hlcyBpbiB0aGlzIGZvcm0gYnkgZGVmYXVsdDsgaWYKLXlvdSdyZSB1c2luZyBnaXQsIHlvdSBjYW4gc2tpcCB0aGlzIHNlY3Rpb24gZW50aXJlbHkuCit5b3UncmUgdXNpbmcgYGBnaXRgYCwgeW91IGNhbiBza2lwIHRoaXMgc2VjdGlvbiBlbnRpcmVseS4KIAogQWxsIGNoYW5nZXMgdG8gdGhlIExpbnV4IGtlcm5lbCBvY2N1ciBpbiB0aGUgZm9ybSBvZiBwYXRjaGVzLCBhcwotZ2VuZXJhdGVkIGJ5IGRpZmYoMSkuICBXaGVuIGNyZWF0aW5nIHlvdXIgcGF0Y2gsIG1ha2Ugc3VyZSB0byBjcmVhdGUgaXQKLWluICJ1bmlmaWVkIGRpZmYiIGZvcm1hdCwgYXMgc3VwcGxpZWQgYnkgdGhlICctdScgYXJndW1lbnQgdG8gZGlmZigxKS4KLUFsc28sIHBsZWFzZSB1c2UgdGhlICctcCcgYXJndW1lbnQgd2hpY2ggc2hvd3Mgd2hpY2ggQyBmdW5jdGlvbiBlYWNoCi1jaGFuZ2UgaXMgaW4gLSB0aGF0IG1ha2VzIHRoZSByZXN1bHRhbnQgZGlmZiBhIGxvdCBlYXNpZXIgdG8gcmVhZC4KK2dlbmVyYXRlZCBieSA6bWFucGFnZTpgZGlmZigxKWAuICBXaGVuIGNyZWF0aW5nIHlvdXIgcGF0Y2gsIG1ha2Ugc3VyZSB0bworY3JlYXRlIGl0IGluICJ1bmlmaWVkIGRpZmYiIGZvcm1hdCwgYXMgc3VwcGxpZWQgYnkgdGhlIGBgLXVgYCBhcmd1bWVudAordG8gOm1hbnBhZ2U6YGRpZmYoMSlgLgorQWxzbywgcGxlYXNlIHVzZSB0aGUgYGAtcGBgIGFyZ3VtZW50IHdoaWNoIHNob3dzIHdoaWNoIEMgZnVuY3Rpb24gZWFjaAorY2hhbmdlIGlzIGluIC0gdGhhdCBtYWtlcyB0aGUgcmVzdWx0YW50IGBgZGlmZmBgIGEgbG90IGVhc2llciB0byByZWFkLgogUGF0Y2hlcyBzaG91bGQgYmUgYmFzZWQgaW4gdGhlIHJvb3Qga2VybmVsIHNvdXJjZSBkaXJlY3RvcnksCiBub3QgaW4gYW55IGxvd2VyIHN1YmRpcmVjdG9yeS4KIAotVG8gY3JlYXRlIGEgcGF0Y2ggZm9yIGEgc2luZ2xlIGZpbGUsIGl0IGlzIG9mdGVuIHN1ZmZpY2llbnQgdG8gZG86CitUbyBjcmVhdGUgYSBwYXRjaCBmb3IgYSBzaW5nbGUgZmlsZSwgaXQgaXMgb2Z0ZW4gc3VmZmljaWVudCB0byBkbzo6CiAKIAlTUkNUUkVFPSBsaW51eAogCU1ZRklMRT0gIGRyaXZlcnMvbmV0L215ZHJpdmVyLmMKQEAgLTc0LDggKzc0LDggQEAKIAlkaWZmIC11cCAkU1JDVFJFRS8kTVlGSUxFey5vcmlnLH0gPiAvdG1wL3BhdGNoCiAKIFRvIGNyZWF0ZSBhIHBhdGNoIGZvciBtdWx0aXBsZSBmaWxlcywgeW91IHNob3VsZCB1bnBhY2sgYSAidmFuaWxsYSIsCi1vciB1bm1vZGlmaWVkIGtlcm5lbCBzb3VyY2UgdHJlZSwgYW5kIGdlbmVyYXRlIGEgZGlmZiBhZ2FpbnN0IHlvdXIKLW93biBzb3VyY2UgdHJlZS4gIEZvciBleGFtcGxlOgorb3IgdW5tb2RpZmllZCBrZXJuZWwgc291cmNlIHRyZWUsIGFuZCBnZW5lcmF0ZSBhIGBgZGlmZmBgIGFnYWluc3QgeW91cgorb3duIHNvdXJjZSB0cmVlLiAgRm9yIGV4YW1wbGU6OgogCiAJTVlTUkM9IC9kZXZlbC9saW51eAogCkBAIC04NCwyNyArODQsMjcgQEAKIAlkaWZmIC11cHJOIC1YIGxpbnV4LTMuMTktdmFuaWxsYS9Eb2N1bWVudGF0aW9uL2RvbnRkaWZmIFwKIAkJbGludXgtMy4xOS12YW5pbGxhICRNWVNSQyA+IC90bXAvcGF0Y2gKIAotImRvbnRkaWZmIiBpcyBhIGxpc3Qgb2YgZmlsZXMgd2hpY2ggYXJlIGdlbmVyYXRlZCBieSB0aGUga2VybmVsIGR1cmluZwotdGhlIGJ1aWxkIHByb2Nlc3MsIGFuZCBzaG91bGQgYmUgaWdub3JlZCBpbiBhbnkgZGlmZigxKS1nZW5lcmF0ZWQKK2BgZG9udGRpZmZgYCBpcyBhIGxpc3Qgb2YgZmlsZXMgd2hpY2ggYXJlIGdlbmVyYXRlZCBieSB0aGUga2VybmVsIGR1cmluZwordGhlIGJ1aWxkIHByb2Nlc3MsIGFuZCBzaG91bGQgYmUgaWdub3JlZCBpbiBhbnkgOm1hbnBhZ2U6YGRpZmYoMSlgLWdlbmVyYXRlZAogcGF0Y2guCiAKIE1ha2Ugc3VyZSB5b3VyIHBhdGNoIGRvZXMgbm90IGluY2x1ZGUgYW55IGV4dHJhIGZpbGVzIHdoaWNoIGRvIG5vdAogYmVsb25nIGluIGEgcGF0Y2ggc3VibWlzc2lvbi4gIE1ha2Ugc3VyZSB0byByZXZpZXcgeW91ciBwYXRjaCAtYWZ0ZXItCi1nZW5lcmF0aW5nIGl0IHdpdGggZGlmZigxKSwgdG8gZW5zdXJlIGFjY3VyYWN5LgorZ2VuZXJhdGluZyBpdCB3aXRoIDptYW5wYWdlOmBkaWZmKDEpYCwgdG8gZW5zdXJlIGFjY3VyYWN5LgogCiBJZiB5b3VyIGNoYW5nZXMgcHJvZHVjZSBhIGxvdCBvZiBkZWx0YXMsIHlvdSBuZWVkIHRvIHNwbGl0IHRoZW0gaW50bwotaW5kaXZpZHVhbCBwYXRjaGVzIHdoaWNoIG1vZGlmeSB0aGluZ3MgaW4gbG9naWNhbCBzdGFnZXM7IHNlZSBzZWN0aW9uCi0jMy4gIFRoaXMgd2lsbCBmYWNpbGl0YXRlIHJldmlldyBieSBvdGhlciBrZXJuZWwgZGV2ZWxvcGVycywKK2luZGl2aWR1YWwgcGF0Y2hlcyB3aGljaCBtb2RpZnkgdGhpbmdzIGluIGxvZ2ljYWwgc3RhZ2VzOyBzZWUKKzpyZWY6YHNwbGl0X2NoYW5nZXNgLiAgVGhpcyB3aWxsIGZhY2lsaXRhdGUgcmV2aWV3IGJ5IG90aGVyIGtlcm5lbCBkZXZlbG9wZXJzLAogdmVyeSBpbXBvcnRhbnQgaWYgeW91IHdhbnQgeW91ciBwYXRjaCBhY2NlcHRlZC4KIAotSWYgeW91J3JlIHVzaW5nIGdpdCwgImdpdCByZWJhc2UgLWkiIGNhbiBoZWxwIHlvdSB3aXRoIHRoaXMgcHJvY2Vzcy4gIElmCi15b3UncmUgbm90IHVzaW5nIGdpdCwgcXVpbHQgPGh0dHA6Ly9zYXZhbm5haC5ub25nbnUub3JnL3Byb2plY3RzL3F1aWx0PgorSWYgeW91J3JlIHVzaW5nIGBgZ2l0YGAsIGBgZ2l0IHJlYmFzZSAtaWBgIGNhbiBoZWxwIHlvdSB3aXRoIHRoaXMgcHJvY2Vzcy4gIElmCit5b3UncmUgbm90IHVzaW5nIGBgZ2l0YGAsIGBgcXVpbHRgYCA8aHR0cDovL3NhdmFubmFoLm5vbmdudS5vcmcvcHJvamVjdHMvcXVpbHQ+CiBpcyBhbm90aGVyIHBvcHVsYXIgYWx0ZXJuYXRpdmUuCiAKKy4uIF9kZXNjcmliZV9jaGFuZ2VzOgogCi0KLTIpIERlc2NyaWJlIHlvdXIgY2hhbmdlcy4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzIpIERlc2NyaWJlIHlvdXIgY2hhbmdlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIERlc2NyaWJlIHlvdXIgcHJvYmxlbS4gIFdoZXRoZXIgeW91ciBwYXRjaCBpcyBhIG9uZS1saW5lIGJ1ZyBmaXggb3IKIDUwMDAgbGluZXMgb2YgYSBuZXcgZmVhdHVyZSwgdGhlcmUgbXVzdCBiZSBhbiB1bmRlcmx5aW5nIHByb2JsZW0gdGhhdApAQCAtMTM3LDExICsxMzcsMTEgQEAKIAogVGhlIG1haW50YWluZXIgd2lsbCB0aGFuayB5b3UgaWYgeW91IHdyaXRlIHlvdXIgcGF0Y2ggZGVzY3JpcHRpb24gaW4gYQogZm9ybSB3aGljaCBjYW4gYmUgZWFzaWx5IHB1bGxlZCBpbnRvIExpbnV4J3Mgc291cmNlIGNvZGUgbWFuYWdlbWVudAotc3lzdGVtLCBnaXQsIGFzIGEgImNvbW1pdCBsb2ciLiAgU2VlICMxNSwgYmVsb3cuCitzeXN0ZW0sIGBgZ2l0YGAsIGFzIGEgImNvbW1pdCBsb2ciLiAgU2VlIDpyZWY6YGV4cGxpY2l0X2luX3JlcGx5X3RvYC4KIAogU29sdmUgb25seSBvbmUgcHJvYmxlbSBwZXIgcGF0Y2guICBJZiB5b3VyIGRlc2NyaXB0aW9uIHN0YXJ0cyB0byBnZXQKIGxvbmcsIHRoYXQncyBhIHNpZ24gdGhhdCB5b3UgcHJvYmFibHkgbmVlZCB0byBzcGxpdCB1cCB5b3VyIHBhdGNoLgotU2VlICMzLCBuZXh0LgorU2VlIDpyZWY6YHNwbGl0X2NoYW5nZXNgLgogCiBXaGVuIHlvdSBzdWJtaXQgb3IgcmVzdWJtaXQgYSBwYXRjaCBvciBwYXRjaCBzZXJpZXMsIGluY2x1ZGUgdGhlCiBjb21wbGV0ZSBwYXRjaCBkZXNjcmlwdGlvbiBhbmQganVzdGlmaWNhdGlvbiBmb3IgaXQuICBEb24ndCBqdXN0CkBAIC0xNjAsNyArMTYwLDcgQEAKIElmIHRoZSBwYXRjaCBmaXhlcyBhIGxvZ2dlZCBidWcgZW50cnksIHJlZmVyIHRvIHRoYXQgYnVnIGVudHJ5IGJ5CiBudW1iZXIgYW5kIFVSTC4gIElmIHRoZSBwYXRjaCBmb2xsb3dzIGZyb20gYSBtYWlsaW5nIGxpc3QgZGlzY3Vzc2lvbiwKIGdpdmUgYSBVUkwgdG8gdGhlIG1haWxpbmcgbGlzdCBhcmNoaXZlOyB1c2UgdGhlIGh0dHBzOi8vbGttbC5rZXJuZWwub3JnLwotcmVkaXJlY3RvciB3aXRoIGEgTWVzc2FnZS1JZCwgdG8gZW5zdXJlIHRoYXQgdGhlIGxpbmtzIGNhbm5vdCBiZWNvbWUKK3JlZGlyZWN0b3Igd2l0aCBhIGBgTWVzc2FnZS1JZGBgLCB0byBlbnN1cmUgdGhhdCB0aGUgbGlua3MgY2Fubm90IGJlY29tZQogc3RhbGUuCiAKIEhvd2V2ZXIsIHRyeSB0byBtYWtlIHlvdXIgZXhwbGFuYXRpb24gdW5kZXJzdGFuZGFibGUgd2l0aG91dCBleHRlcm5hbApAQCAtMTcxLDcgKzE3MSw3IEBACiBJZiB5b3Ugd2FudCB0byByZWZlciB0byBhIHNwZWNpZmljIGNvbW1pdCwgZG9uJ3QganVzdCByZWZlciB0byB0aGUKIFNIQS0xIElEIG9mIHRoZSBjb21taXQuIFBsZWFzZSBhbHNvIGluY2x1ZGUgdGhlIG9uZWxpbmUgc3VtbWFyeSBvZgogdGhlIGNvbW1pdCwgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIHJldmlld2VycyB0byBrbm93IHdoYXQgaXQgaXMgYWJvdXQuCi1FeGFtcGxlOgorRXhhbXBsZTo6CiAKIAlDb21taXQgZTIxZDIxNzBmMzY2MDJhZTI3MDggKCJ2aWRlbzogcmVtb3ZlIHVubmVjZXNzYXJ5CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEoKSIpIHJlbW92ZWQgdGhlIHVubmVjZXNzYXJ5CkBAIC0xODUsMjMgKzE4NSwyNSBAQAogY2hhbmdlIGZpdmUgeWVhcnMgZnJvbSBub3cuCiAKIElmIHlvdXIgcGF0Y2ggZml4ZXMgYSBidWcgaW4gYSBzcGVjaWZpYyBjb21taXQsIGUuZy4geW91IGZvdW5kIGFuIGlzc3VlIHVzaW5nCi1naXQtYmlzZWN0LCBwbGVhc2UgdXNlIHRoZSAnRml4ZXM6JyB0YWcgd2l0aCB0aGUgZmlyc3QgMTIgY2hhcmFjdGVycyBvZiB0aGUKLVNIQS0xIElELCBhbmQgdGhlIG9uZSBsaW5lIHN1bW1hcnkuICBGb3IgZXhhbXBsZToKK2BgZ2l0IGJpc2VjdGBgLCBwbGVhc2UgdXNlIHRoZSAnRml4ZXM6JyB0YWcgd2l0aCB0aGUgZmlyc3QgMTIgY2hhcmFjdGVycyBvZgordGhlIFNIQS0xIElELCBhbmQgdGhlIG9uZSBsaW5lIHN1bW1hcnkuICBGb3IgZXhhbXBsZTo6CiAKIAlGaXhlczogZTIxZDIxNzBmMzY2ICgidmlkZW86IHJlbW92ZSB1bm5lY2Vzc2FyeSBwbGF0Zm9ybV9zZXRfZHJ2ZGF0YSgpIikKIAotVGhlIGZvbGxvd2luZyBnaXQtY29uZmlnIHNldHRpbmdzIGNhbiBiZSB1c2VkIHRvIGFkZCBhIHByZXR0eSBmb3JtYXQgZm9yCi1vdXRwdXR0aW5nIHRoZSBhYm92ZSBzdHlsZSBpbiB0aGUgZ2l0IGxvZyBvciBnaXQgc2hvdyBjb21tYW5kcworVGhlIGZvbGxvd2luZyBgYGdpdCBjb25maWdgYCBzZXR0aW5ncyBjYW4gYmUgdXNlZCB0byBhZGQgYSBwcmV0dHkgZm9ybWF0IGZvcgorb3V0cHV0dGluZyB0aGUgYWJvdmUgc3R5bGUgaW4gdGhlIGBgZ2l0IGxvZ2BgIG9yIGBgZ2l0IHNob3dgYCBjb21tYW5kczo6CiAKIAlbY29yZV0KIAkJYWJicmV2ID0gMTIKIAlbcHJldHR5XQogCQlmaXhlcyA9IEZpeGVzOiAlaCAoXCIlc1wiKQogCi0zKSBTZXBhcmF0ZSB5b3VyIGNoYW5nZXMuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisuLiBfc3BsaXRfY2hhbmdlczoKIAotU2VwYXJhdGUgZWFjaCBfbG9naWNhbCBjaGFuZ2VfIGludG8gYSBzZXBhcmF0ZSBwYXRjaC4KKzMpIFNlcGFyYXRlIHlvdXIgY2hhbmdlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NlcGFyYXRlIGVhY2ggKipsb2dpY2FsIGNoYW5nZSoqIGludG8gYSBzZXBhcmF0ZSBwYXRjaC4KIAogRm9yIGV4YW1wbGUsIGlmIHlvdXIgY2hhbmdlcyBpbmNsdWRlIGJvdGggYnVnIGZpeGVzIGFuZCBwZXJmb3JtYW5jZQogZW5oYW5jZW1lbnRzIGZvciBhIHNpbmdsZSBkcml2ZXIsIHNlcGFyYXRlIHRob3NlIGNoYW5nZXMgaW50byB0d28KQEAgLTIxNywxMiArMjE5LDEyIEBACiBvbiBpdHMgb3duIG1lcml0cy4KIAogSWYgb25lIHBhdGNoIGRlcGVuZHMgb24gYW5vdGhlciBwYXRjaCBpbiBvcmRlciBmb3IgYSBjaGFuZ2UgdG8gYmUKLWNvbXBsZXRlLCB0aGF0IGlzIE9LLiAgU2ltcGx5IG5vdGUgInRoaXMgcGF0Y2ggZGVwZW5kcyBvbiBwYXRjaCBYIgorY29tcGxldGUsIHRoYXQgaXMgT0suICBTaW1wbHkgbm90ZSAqKiJ0aGlzIHBhdGNoIGRlcGVuZHMgb24gcGF0Y2ggWCIqKgogaW4geW91ciBwYXRjaCBkZXNjcmlwdGlvbi4KIAogV2hlbiBkaXZpZGluZyB5b3VyIGNoYW5nZSBpbnRvIGEgc2VyaWVzIG9mIHBhdGNoZXMsIHRha2Ugc3BlY2lhbCBjYXJlIHRvCiBlbnN1cmUgdGhhdCB0aGUga2VybmVsIGJ1aWxkcyBhbmQgcnVucyBwcm9wZXJseSBhZnRlciBlYWNoIHBhdGNoIGluIHRoZQotc2VyaWVzLiAgRGV2ZWxvcGVycyB1c2luZyAiZ2l0IGJpc2VjdCIgdG8gdHJhY2sgZG93biBhIHByb2JsZW0gY2FuIGVuZCB1cAorc2VyaWVzLiAgRGV2ZWxvcGVycyB1c2luZyBgYGdpdCBiaXNlY3RgYCB0byB0cmFjayBkb3duIGEgcHJvYmxlbSBjYW4gZW5kIHVwCiBzcGxpdHRpbmcgeW91ciBwYXRjaCBzZXJpZXMgYXQgYW55IHBvaW50OyB0aGV5IHdpbGwgbm90IHRoYW5rIHlvdSBpZiB5b3UKIGludHJvZHVjZSBidWdzIGluIHRoZSBtaWRkbGUuCiAKQEAgLTIzMSwxMSArMjMzLDEzIEBACiAKIAogCi00KSBTdHlsZS1jaGVjayB5b3VyIGNoYW5nZXMuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis0KSBTdHlsZS1jaGVjayB5b3VyIGNoYW5nZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBDaGVjayB5b3VyIHBhdGNoIGZvciBiYXNpYyBzdHlsZSB2aW9sYXRpb25zLCBkZXRhaWxzIG9mIHdoaWNoIGNhbiBiZQotZm91bmQgaW4gRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZS4gIEZhaWx1cmUgdG8gZG8gc28gc2ltcGx5IHdhc3RlcworZm91bmQgaW4KKzpyZWY6YERvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUgPGNvZGluZ3N0eWxlPmAuCitGYWlsdXJlIHRvIGRvIHNvIHNpbXBseSB3YXN0ZXMKIHRoZSByZXZpZXdlcnMgdGltZSBhbmQgd2lsbCBnZXQgeW91ciBwYXRjaCByZWplY3RlZCwgcHJvYmFibHkKIHdpdGhvdXQgZXZlbiBiZWluZyByZWFkLgogCkBAIC0yNjAsOCArMjY0LDggQEAKIHBhdGNoLgogCiAKLTUpIFNlbGVjdCB0aGUgcmVjaXBpZW50cyBmb3IgeW91ciBwYXRjaC4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzUpIFNlbGVjdCB0aGUgcmVjaXBpZW50cyBmb3IgeW91ciBwYXRjaAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFlvdSBzaG91bGQgYWx3YXlzIGNvcHkgdGhlIGFwcHJvcHJpYXRlIHN1YnN5c3RlbSBtYWludGFpbmVyKHMpIG9uIGFueSBwYXRjaAogdG8gY29kZSB0aGF0IHRoZXkgbWFpbnRhaW47IGxvb2sgdGhyb3VnaCB0aGUgTUFJTlRBSU5FUlMgZmlsZSBhbmQgdGhlCkBAIC0yOTUsMTMgKzI5OSwxNCBAQAogb2J2aW91c2x5LCB0aGUgcGF0Y2ggc2hvdWxkIG5vdCBiZSBzZW50IHRvIGFueSBwdWJsaWMgbGlzdHMuCiAKIFBhdGNoZXMgdGhhdCBmaXggYSBzZXZlcmUgYnVnIGluIGEgcmVsZWFzZWQga2VybmVsIHNob3VsZCBiZSBkaXJlY3RlZAotdG93YXJkIHRoZSBzdGFibGUgbWFpbnRhaW5lcnMgYnkgcHV0dGluZyBhIGxpbmUgbGlrZSB0aGlzOgordG93YXJkIHRoZSBzdGFibGUgbWFpbnRhaW5lcnMgYnkgcHV0dGluZyBhIGxpbmUgbGlrZSB0aGlzOjoKIAogICBDYzogc3RhYmxlQHZnZXIua2VybmVsLm9yZwogCiBpbnRvIHRoZSBzaWduLW9mZiBhcmVhIG9mIHlvdXIgcGF0Y2ggKG5vdGUsIE5PVCBhbiBlbWFpbCByZWNpcGllbnQpLiAgWW91Ci1zaG91bGQgYWxzbyByZWFkIERvY3VtZW50YXRpb24vc3RhYmxlX2tlcm5lbF9ydWxlcy50eHQgaW4gYWRkaXRpb24gdG8gdGhpcwotZmlsZS4KK3Nob3VsZCBhbHNvIHJlYWQKKzpyZWY6YERvY3VtZW50YXRpb24vc3RhYmxlX2tlcm5lbF9ydWxlcy50eHQgPHN0YWJsZV9rZXJuZWxfcnVsZXM+YAoraW4gYWRkaXRpb24gdG8gdGhpcyBmaWxlLgogCiBOb3RlLCBob3dldmVyLCB0aGF0IHNvbWUgc3Vic3lzdGVtIG1haW50YWluZXJzIHdhbnQgdG8gY29tZSB0byB0aGVpciBvd24KIGNvbmNsdXNpb25zIG9uIHdoaWNoIHBhdGNoZXMgc2hvdWxkIGdvIHRvIHRoZSBzdGFibGUgdHJlZXMuICBUaGUgbmV0d29ya2luZwpAQCAtMzEyLDI4ICszMTcsMzAgQEAKIG1haW50YWluZXIgKGFzIGxpc3RlZCBpbiB0aGUgTUFJTlRBSU5FUlMgZmlsZSkgYSBtYW4tcGFnZXMgcGF0Y2gsIG9yIGF0CiBsZWFzdCBhIG5vdGlmaWNhdGlvbiBvZiB0aGUgY2hhbmdlLCBzbyB0aGF0IHNvbWUgaW5mb3JtYXRpb24gbWFrZXMgaXRzIHdheQogaW50byB0aGUgbWFudWFsIHBhZ2VzLiAgVXNlci1zcGFjZSBBUEkgY2hhbmdlcyBzaG91bGQgYWxzbyBiZSBjb3BpZWQgdG8KLWxpbnV4LWFwaUB2Z2VyLmtlcm5lbC5vcmcuIAorbGludXgtYXBpQHZnZXIua2VybmVsLm9yZy4KIAogRm9yIHNtYWxsIHBhdGNoZXMgeW91IG1heSB3YW50IHRvIENDIHRoZSBUcml2aWFsIFBhdGNoIE1vbmtleQogdHJpdmlhbEBrZXJuZWwub3JnIHdoaWNoIGNvbGxlY3RzICJ0cml2aWFsIiBwYXRjaGVzLiBIYXZlIGEgbG9vawogaW50byB0aGUgTUFJTlRBSU5FUlMgZmlsZSBmb3IgaXRzIGN1cnJlbnQgbWFuYWdlci4KKwogVHJpdmlhbCBwYXRjaGVzIG11c3QgcXVhbGlmeSBmb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgcnVsZXM6Ci0gU3BlbGxpbmcgZml4ZXMgaW4gZG9jdW1lbnRhdGlvbgotIFNwZWxsaW5nIGZpeGVzIGZvciBlcnJvcnMgd2hpY2ggY291bGQgYnJlYWsgZ3JlcCgxKQotIFdhcm5pbmcgZml4ZXMgKGNsdXR0ZXJpbmcgd2l0aCB1c2VsZXNzIHdhcm5pbmdzIGlzIGJhZCkKLSBDb21waWxhdGlvbiBmaXhlcyAob25seSBpZiB0aGV5IGFyZSBhY3R1YWxseSBjb3JyZWN0KQotIFJ1bnRpbWUgZml4ZXMgKG9ubHkgaWYgdGhleSBhY3R1YWxseSBmaXggdGhpbmdzKQotIFJlbW92aW5nIHVzZSBvZiBkZXByZWNhdGVkIGZ1bmN0aW9ucy9tYWNyb3MKLSBDb250YWN0IGRldGFpbCBhbmQgZG9jdW1lbnRhdGlvbiBmaXhlcwotIE5vbi1wb3J0YWJsZSBjb2RlIHJlcGxhY2VkIGJ5IHBvcnRhYmxlIGNvZGUgKGV2ZW4gaW4gYXJjaC1zcGVjaWZpYywKLSBzaW5jZSBwZW9wbGUgY29weSwgYXMgbG9uZyBhcyBpdCdzIHRyaXZpYWwpCi0gQW55IGZpeCBieSB0aGUgYXV0aG9yL21haW50YWluZXIgb2YgdGhlIGZpbGUgKGllLiBwYXRjaCBtb25rZXkKLSBpbiByZS10cmFuc21pc3Npb24gbW9kZSkKKworLSBTcGVsbGluZyBmaXhlcyBpbiBkb2N1bWVudGF0aW9uCistIFNwZWxsaW5nIGZpeGVzIGZvciBlcnJvcnMgd2hpY2ggY291bGQgYnJlYWsgOm1hbnBhZ2U6YGdyZXAoMSlgCistIFdhcm5pbmcgZml4ZXMgKGNsdXR0ZXJpbmcgd2l0aCB1c2VsZXNzIHdhcm5pbmdzIGlzIGJhZCkKKy0gQ29tcGlsYXRpb24gZml4ZXMgKG9ubHkgaWYgdGhleSBhcmUgYWN0dWFsbHkgY29ycmVjdCkKKy0gUnVudGltZSBmaXhlcyAob25seSBpZiB0aGV5IGFjdHVhbGx5IGZpeCB0aGluZ3MpCistIFJlbW92aW5nIHVzZSBvZiBkZXByZWNhdGVkIGZ1bmN0aW9ucy9tYWNyb3MKKy0gQ29udGFjdCBkZXRhaWwgYW5kIGRvY3VtZW50YXRpb24gZml4ZXMKKy0gTm9uLXBvcnRhYmxlIGNvZGUgcmVwbGFjZWQgYnkgcG9ydGFibGUgY29kZSAoZXZlbiBpbiBhcmNoLXNwZWNpZmljLAorICBzaW5jZSBwZW9wbGUgY29weSwgYXMgbG9uZyBhcyBpdCdzIHRyaXZpYWwpCistIEFueSBmaXggYnkgdGhlIGF1dGhvci9tYWludGFpbmVyIG9mIHRoZSBmaWxlIChpZS4gcGF0Y2ggbW9ua2V5CisgIGluIHJlLXRyYW5zbWlzc2lvbiBtb2RlKQogCiAKIAotNikgTm8gTUlNRSwgbm8gbGlua3MsIG5vIGNvbXByZXNzaW9uLCBubyBhdHRhY2htZW50cy4gIEp1c3QgcGxhaW4gdGV4dC4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis2KSBObyBNSU1FLCBubyBsaW5rcywgbm8gY29tcHJlc3Npb24sIG5vIGF0dGFjaG1lbnRzLiAgSnVzdCBwbGFpbiB0ZXh0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIExpbnVzIGFuZCBvdGhlciBrZXJuZWwgZGV2ZWxvcGVycyBuZWVkIHRvIGJlIGFibGUgdG8gcmVhZCBhbmQgY29tbWVudAogb24gdGhlIGNoYW5nZXMgeW91IGFyZSBzdWJtaXR0aW5nLiAgSXQgaXMgaW1wb3J0YW50IGZvciBhIGtlcm5lbApAQCAtMzQxLDggKzM0OCwxMSBAQAogdG9vbHMsIHNvIHRoYXQgdGhleSBtYXkgY29tbWVudCBvbiBzcGVjaWZpYyBwb3J0aW9ucyBvZiB5b3VyIGNvZGUuCiAKIEZvciB0aGlzIHJlYXNvbiwgYWxsIHBhdGNoZXMgc2hvdWxkIGJlIHN1Ym1pdHRlZCBieSBlLW1haWwgImlubGluZSIuCi1XQVJOSU5HOiAgQmUgd2FyeSBvZiB5b3VyIGVkaXRvcidzIHdvcmQtd3JhcCBjb3JydXB0aW5nIHlvdXIgcGF0Y2gsCi1pZiB5b3UgY2hvb3NlIHRvIGN1dC1uLXBhc3RlIHlvdXIgcGF0Y2guCisKKy4uIHdhcm5pbmc6OgorCisgIEJlIHdhcnkgb2YgeW91ciBlZGl0b3IncyB3b3JkLXdyYXAgY29ycnVwdGluZyB5b3VyIHBhdGNoLAorICBpZiB5b3UgY2hvb3NlIHRvIGN1dC1uLXBhc3RlIHlvdXIgcGF0Y2guCiAKIERvIG5vdCBhdHRhY2ggdGhlIHBhdGNoIGFzIGEgTUlNRSBhdHRhY2htZW50LCBjb21wcmVzc2VkIG9yIG5vdC4KIE1hbnkgcG9wdWxhciBlLW1haWwgYXBwbGljYXRpb25zIHdpbGwgbm90IGFsd2F5cyB0cmFuc21pdCBhIE1JTUUKQEAgLTM1MywxMSArMzYzLDEyIEBACiBFeGNlcHRpb246ICBJZiB5b3VyIG1haWxlciBpcyBtYW5nbGluZyBwYXRjaGVzIHRoZW4gc29tZW9uZSBtYXkgYXNrCiB5b3UgdG8gcmUtc2VuZCB0aGVtIHVzaW5nIE1JTUUuCiAKLVNlZSBEb2N1bWVudGF0aW9uL2VtYWlsLWNsaWVudHMudHh0IGZvciBoaW50cyBhYm91dCBjb25maWd1cmluZwoteW91ciBlLW1haWwgY2xpZW50IHNvIHRoYXQgaXQgc2VuZHMgeW91ciBwYXRjaGVzIHVudG91Y2hlZC4KK1NlZSA6cmVmOmBEb2N1bWVudGF0aW9uL2VtYWlsLWNsaWVudHMudHh0IDxlbWFpbF9jbGllbnRzPmAKK2ZvciBoaW50cyBhYm91dCBjb25maWd1cmluZyB5b3VyIGUtbWFpbCBjbGllbnQgc28gdGhhdCBpdCBzZW5kcyB5b3VyIHBhdGNoZXMKK3VudG91Y2hlZC4KIAotNykgRS1tYWlsIHNpemUuCi0tLS0tLS0tLS0tLS0tLS0KKzcpIEUtbWFpbCBzaXplCistLS0tLS0tLS0tLS0tLQogCiBMYXJnZSBjaGFuZ2VzIGFyZSBub3QgYXBwcm9wcmlhdGUgZm9yIG1haWxpbmcgbGlzdHMsIGFuZCBzb21lCiBtYWludGFpbmVycy4gIElmIHlvdXIgcGF0Y2gsIHVuY29tcHJlc3NlZCwgZXhjZWVkcyAzMDAga0IgaW4gc2l6ZSwKQEAgLTM2Niw4ICszNzcsOCBAQAogdGhhdCBpZiB5b3VyIHBhdGNoIGV4Y2VlZHMgMzAwIGtCLCBpdCBhbG1vc3QgY2VydGFpbmx5IG5lZWRzIHRvIGJlIGJyb2tlbiB1cAogYW55d2F5LgogCi04KSBSZXNwb25kIHRvIHJldmlldyBjb21tZW50cy4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOCkgUmVzcG9uZCB0byByZXZpZXcgY29tbWVudHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFlvdXIgcGF0Y2ggd2lsbCBhbG1vc3QgY2VydGFpbmx5IGdldCBjb21tZW50cyBmcm9tIHJldmlld2VycyBvbiB3YXlzIGluCiB3aGljaCB0aGUgcGF0Y2ggY2FuIGJlIGltcHJvdmVkLiAgWW91IG11c3QgcmVzcG9uZCB0byB0aG9zZSBjb21tZW50czsKQEAgLTM4Miw4ICszOTMsOCBAQAogcG9saXRlbHkgYW5kIGFkZHJlc3MgdGhlIHByb2JsZW1zIHRoZXkgaGF2ZSBwb2ludGVkIG91dC4KIAogCi05KSBEb24ndCBnZXQgZGlzY291cmFnZWQgLSBvciBpbXBhdGllbnQuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis5KSBEb24ndCBnZXQgZGlzY291cmFnZWQgLSBvciBpbXBhdGllbnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBBZnRlciB5b3UgaGF2ZSBzdWJtaXR0ZWQgeW91ciBjaGFuZ2UsIGJlIHBhdGllbnQgYW5kIHdhaXQuICBSZXZpZXdlcnMgYXJlCiBidXN5IHBlb3BsZSBhbmQgbWF5IG5vdCBnZXQgdG8geW91ciBwYXRjaCByaWdodCBhd2F5LgpAQCAtNDE5LDkgKzQzMCwxMCBAQAogcGFzcyBpdCBvbiBhcyBhbiBvcGVuLXNvdXJjZSBwYXRjaC4gIFRoZSBydWxlcyBhcmUgcHJldHR5IHNpbXBsZTogaWYgeW91CiBjYW4gY2VydGlmeSB0aGUgYmVsb3c6CiAKLSAgICAgICAgRGV2ZWxvcGVyJ3MgQ2VydGlmaWNhdGUgb2YgT3JpZ2luIDEuMQorRGV2ZWxvcGVyJ3MgQ2VydGlmaWNhdGUgb2YgT3JpZ2luIDEuMQorXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgogCi0gICAgICAgIEJ5IG1ha2luZyBhIGNvbnRyaWJ1dGlvbiB0byB0aGlzIHByb2plY3QsIEkgY2VydGlmeSB0aGF0OgorQnkgbWFraW5nIGEgY29udHJpYnV0aW9uIHRvIHRoaXMgcHJvamVjdCwgSSBjZXJ0aWZ5IHRoYXQ6CiAKICAgICAgICAgKGEpIFRoZSBjb250cmlidXRpb24gd2FzIGNyZWF0ZWQgaW4gd2hvbGUgb3IgaW4gcGFydCBieSBtZSBhbmQgSQogICAgICAgICAgICAgaGF2ZSB0aGUgcmlnaHQgdG8gc3VibWl0IGl0IHVuZGVyIHRoZSBvcGVuIHNvdXJjZSBsaWNlbnNlCkBAIC00NDUsNyArNDU3LDcgQEAKICAgICAgICAgICAgIG1haW50YWluZWQgaW5kZWZpbml0ZWx5IGFuZCBtYXkgYmUgcmVkaXN0cmlidXRlZCBjb25zaXN0ZW50IHdpdGgKICAgICAgICAgICAgIHRoaXMgcHJvamVjdCBvciB0aGUgb3BlbiBzb3VyY2UgbGljZW5zZShzKSBpbnZvbHZlZC4KIAotdGhlbiB5b3UganVzdCBhZGQgYSBsaW5lIHNheWluZwordGhlbiB5b3UganVzdCBhZGQgYSBsaW5lIHNheWluZzo6CiAKIAlTaWduZWQtb2ZmLWJ5OiBSYW5kb20gSiBEZXZlbG9wZXIgPHJhbmRvbUBkZXZlbG9wZXIuZXhhbXBsZS5vcmc+CiAKQEAgLTQ2Niw3ICs0NzgsNyBAQAogdGhlIG5hdHVyZSBvZiB5b3VyIGNoYW5nZXMuIFdoaWxlIHRoZXJlIGlzIG5vdGhpbmcgbWFuZGF0b3J5IGFib3V0IHRoaXMsIGl0CiBzZWVtcyBsaWtlIHByZXBlbmRpbmcgdGhlIGRlc2NyaXB0aW9uIHdpdGggeW91ciBtYWlsIGFuZC9vciBuYW1lLCBhbGwKIGVuY2xvc2VkIGluIHNxdWFyZSBicmFja2V0cywgaXMgbm90aWNlYWJsZSBlbm91Z2ggdG8gbWFrZSBpdCBvYnZpb3VzIHRoYXQKLXlvdSBhcmUgcmVzcG9uc2libGUgZm9yIGxhc3QtbWludXRlIGNoYW5nZXMuIEV4YW1wbGUgOgoreW91IGFyZSByZXNwb25zaWJsZSBmb3IgbGFzdC1taW51dGUgY2hhbmdlcy4gRXhhbXBsZTo6CiAKIAlTaWduZWQtb2ZmLWJ5OiBSYW5kb20gSiBEZXZlbG9wZXIgPHJhbmRvbUBkZXZlbG9wZXIuZXhhbXBsZS5vcmc+CiAJW2x1Y2t5QG1haW50YWluZXIuZXhhbXBsZS5vcmc6IHN0cnVjdCBmb28gbW92ZWQgZnJvbSBmb28uYyB0byBmb28uaF0KQEAgLTQ4MSwxNSArNDkzLDE1IEBACiBTcGVjaWFsIG5vdGUgdG8gYmFjay1wb3J0ZXJzOiBJdCBzZWVtcyB0byBiZSBhIGNvbW1vbiBhbmQgdXNlZnVsIHByYWN0aWNlCiB0byBpbnNlcnQgYW4gaW5kaWNhdGlvbiBvZiB0aGUgb3JpZ2luIG9mIGEgcGF0Y2ggYXQgdGhlIHRvcCBvZiB0aGUgY29tbWl0CiBtZXNzYWdlIChqdXN0IGFmdGVyIHRoZSBzdWJqZWN0IGxpbmUpIHRvIGZhY2lsaXRhdGUgdHJhY2tpbmcuIEZvciBpbnN0YW5jZSwKLWhlcmUncyB3aGF0IHdlIHNlZSBpbiBhIDMueC1zdGFibGUgcmVsZWFzZToKK2hlcmUncyB3aGF0IHdlIHNlZSBpbiBhIDMueC1zdGFibGUgcmVsZWFzZTo6CiAKLURhdGU6ICAgVHVlIE9jdCA3IDA3OjI2OjM4IDIwMTQgLTA0MDAKKyAgRGF0ZTogICBUdWUgT2N0IDcgMDc6MjY6MzggMjAxNCAtMDQwMAogCiAgICAgbGliYXRhOiBVbi1icmVhayBBVEEgYmxhY2tsaXN0CiAKICAgICBjb21taXQgMWM0MDI3OTk2MGJjZDdkNTJkYmRmMWQ0NjZiMjBkMjRiOTkxNzZjOCB1cHN0cmVhbS4KIAotQW5kIGhlcmUncyB3aGF0IG1pZ2h0IGFwcGVhciBpbiBhbiBvbGRlciBrZXJuZWwgb25jZSBhIHBhdGNoIGlzIGJhY2twb3J0ZWQ6CitBbmQgaGVyZSdzIHdoYXQgbWlnaHQgYXBwZWFyIGluIGFuIG9sZGVyIGtlcm5lbCBvbmNlIGEgcGF0Y2ggaXMgYmFja3BvcnRlZDo6CiAKICAgICBEYXRlOiAgIFR1ZSBNYXkgMTMgMjI6MTI6MjcgMjAwOCArMDIwMAogCkBAIC01MjksNyArNTQxLDcgQEAKIGxpc3QgYXJjaGl2ZXMuCiAKIElmIGEgcGVyc29uIGhhcyBoYWQgdGhlIG9wcG9ydHVuaXR5IHRvIGNvbW1lbnQgb24gYSBwYXRjaCwgYnV0IGhhcyBub3QKLXByb3ZpZGVkIHN1Y2ggY29tbWVudHMsIHlvdSBtYXkgb3B0aW9uYWxseSBhZGQgYSAiQ2M6IiB0YWcgdG8gdGhlIHBhdGNoLgorcHJvdmlkZWQgc3VjaCBjb21tZW50cywgeW91IG1heSBvcHRpb25hbGx5IGFkZCBhIGBgQ2M6YGAgdGFnIHRvIHRoZSBwYXRjaC4KIFRoaXMgaXMgdGhlIG9ubHkgdGFnIHdoaWNoIG1pZ2h0IGJlIGFkZGVkIHdpdGhvdXQgYW4gZXhwbGljaXQgYWN0aW9uIGJ5IHRoZQogcGVyc29uIGl0IG5hbWVzIC0gYnV0IGl0IHNob3VsZCBpbmRpY2F0ZSB0aGF0IHRoaXMgcGVyc29uIHdhcyBjb3BpZWQgb24gdGhlCiBwYXRjaC4gIFRoaXMgdGFnIGRvY3VtZW50cyB0aGF0IHBvdGVudGlhbGx5IGludGVyZXN0ZWQgcGFydGllcwpAQCAtNTUyLDExICs1NjQsMTIgQEAKIFJldmlld2VkLWJ5OiwgaW5zdGVhZCwgaW5kaWNhdGVzIHRoYXQgdGhlIHBhdGNoIGhhcyBiZWVuIHJldmlld2VkIGFuZCBmb3VuZAogYWNjZXB0YWJsZSBhY2NvcmRpbmcgdG8gdGhlIFJldmlld2VyJ3MgU3RhdGVtZW50OgogCi0JUmV2aWV3ZXIncyBzdGF0ZW1lbnQgb2Ygb3ZlcnNpZ2h0CitSZXZpZXdlcidzIHN0YXRlbWVudCBvZiBvdmVyc2lnaHQKK15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgogCi0JQnkgb2ZmZXJpbmcgbXkgUmV2aWV3ZWQtYnk6IHRhZywgSSBzdGF0ZSB0aGF0OgorQnkgb2ZmZXJpbmcgbXkgUmV2aWV3ZWQtYnk6IHRhZywgSSBzdGF0ZSB0aGF0OgogCi0gCSAoYSkgSSBoYXZlIGNhcnJpZWQgb3V0IGEgdGVjaG5pY2FsIHJldmlldyBvZiB0aGlzIHBhdGNoIHRvCisJIChhKSBJIGhhdmUgY2FycmllZCBvdXQgYSB0ZWNobmljYWwgcmV2aWV3IG9mIHRoaXMgcGF0Y2ggdG8KIAkgICAgIGV2YWx1YXRlIGl0cyBhcHByb3ByaWF0ZW5lc3MgYW5kIHJlYWRpbmVzcyBmb3IgaW5jbHVzaW9uIGludG8KIAkgICAgIHRoZSBtYWlubGluZSBrZXJuZWwuCiAKQEAgLTU5NCwyNCArNjA3LDI1IEBACiBpcyB1c2VkIHRvIG1ha2UgaXQgZWFzeSB0byBkZXRlcm1pbmUgd2hlcmUgYSBidWcgb3JpZ2luYXRlZCwgd2hpY2ggY2FuIGhlbHAKIHJldmlldyBhIGJ1ZyBmaXguIFRoaXMgdGFnIGFsc28gYXNzaXN0cyB0aGUgc3RhYmxlIGtlcm5lbCB0ZWFtIGluIGRldGVybWluaW5nCiB3aGljaCBzdGFibGUga2VybmVsIHZlcnNpb25zIHNob3VsZCByZWNlaXZlIHlvdXIgZml4LiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQKLW1ldGhvZCBmb3IgaW5kaWNhdGluZyBhIGJ1ZyBmaXhlZCBieSB0aGUgcGF0Y2guIFNlZSAjMiBhYm92ZSBmb3IgbW9yZSBkZXRhaWxzLgorbWV0aG9kIGZvciBpbmRpY2F0aW5nIGEgYnVnIGZpeGVkIGJ5IHRoZSBwYXRjaC4gU2VlIDpyZWY6YGRlc2NyaWJlX2NoYW5nZXNgCitmb3IgbW9yZSBkZXRhaWxzLgogCiAKIDE0KSBUaGUgY2Fub25pY2FsIHBhdGNoIGZvcm1hdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgaG93IHRoZSBwYXRjaCBpdHNlbGYgc2hvdWxkIGJlIGZvcm1hdHRlZC4gIE5vdGUKLXRoYXQsIGlmIHlvdSBoYXZlIHlvdXIgcGF0Y2hlcyBzdG9yZWQgaW4gYSBnaXQgcmVwb3NpdG9yeSwgcHJvcGVyIHBhdGNoCi1mb3JtYXR0aW5nIGNhbiBiZSBoYWQgd2l0aCAiZ2l0IGZvcm1hdC1wYXRjaCIuICBUaGUgdG9vbHMgY2Fubm90IGNyZWF0ZQordGhhdCwgaWYgeW91IGhhdmUgeW91ciBwYXRjaGVzIHN0b3JlZCBpbiBhIGBgZ2l0YGAgcmVwb3NpdG9yeSwgcHJvcGVyIHBhdGNoCitmb3JtYXR0aW5nIGNhbiBiZSBoYWQgd2l0aCBgYGdpdCBmb3JtYXQtcGF0Y2hgYC4gIFRoZSB0b29scyBjYW5ub3QgY3JlYXRlCiB0aGUgbmVjZXNzYXJ5IHRleHQsIHRob3VnaCwgc28gcmVhZCB0aGUgaW5zdHJ1Y3Rpb25zIGJlbG93IGFueXdheS4KIAotVGhlIGNhbm9uaWNhbCBwYXRjaCBzdWJqZWN0IGxpbmUgaXM6CitUaGUgY2Fub25pY2FsIHBhdGNoIHN1YmplY3QgbGluZSBpczo6CiAKICAgICBTdWJqZWN0OiBbUEFUQ0ggMDAxLzEyM10gc3Vic3lzdGVtOiBzdW1tYXJ5IHBocmFzZQogCiBUaGUgY2Fub25pY2FsIHBhdGNoIG1lc3NhZ2UgYm9keSBjb250YWlucyB0aGUgZm9sbG93aW5nOgogCi0gIC0gQSAiZnJvbSIgbGluZSBzcGVjaWZ5aW5nIHRoZSBwYXRjaCBhdXRob3IgKG9ubHkgbmVlZGVkIGlmIHRoZSBwZXJzb24KKyAgLSBBIGBgZnJvbWBgIGxpbmUgc3BlY2lmeWluZyB0aGUgcGF0Y2ggYXV0aG9yIChvbmx5IG5lZWRlZCBpZiB0aGUgcGVyc29uCiAgICAgc2VuZGluZyB0aGUgcGF0Y2ggaXMgbm90IHRoZSBhdXRob3IpLgogCiAgIC0gQW4gZW1wdHkgbGluZS4KQEAgLTYxOSw0NiArNjMzLDQ2IEBACiAgIC0gVGhlIGJvZHkgb2YgdGhlIGV4cGxhbmF0aW9uLCBsaW5lIHdyYXBwZWQgYXQgNzUgY29sdW1ucywgd2hpY2ggd2lsbAogICAgIGJlIGNvcGllZCB0byB0aGUgcGVybWFuZW50IGNoYW5nZWxvZyB0byBkZXNjcmliZSB0aGlzIHBhdGNoLgogCi0gIC0gVGhlICJTaWduZWQtb2ZmLWJ5OiIgbGluZXMsIGRlc2NyaWJlZCBhYm92ZSwgd2hpY2ggd2lsbAorICAtIFRoZSBgYFNpZ25lZC1vZmYtYnk6YGAgbGluZXMsIGRlc2NyaWJlZCBhYm92ZSwgd2hpY2ggd2lsbAogICAgIGFsc28gZ28gaW4gdGhlIGNoYW5nZWxvZy4KIAotICAtIEEgbWFya2VyIGxpbmUgY29udGFpbmluZyBzaW1wbHkgIi0tLSIuCisgIC0gQSBtYXJrZXIgbGluZSBjb250YWluaW5nIHNpbXBseSBgYC0tLWBgLgogCiAgIC0gQW55IGFkZGl0aW9uYWwgY29tbWVudHMgbm90IHN1aXRhYmxlIGZvciB0aGUgY2hhbmdlbG9nLgogCi0gIC0gVGhlIGFjdHVhbCBwYXRjaCAoZGlmZiBvdXRwdXQpLgorICAtIFRoZSBhY3R1YWwgcGF0Y2ggKGBgZGlmZmBgIG91dHB1dCkuCiAKIFRoZSBTdWJqZWN0IGxpbmUgZm9ybWF0IG1ha2VzIGl0IHZlcnkgZWFzeSB0byBzb3J0IHRoZSBlbWFpbHMKIGFscGhhYmV0aWNhbGx5IGJ5IHN1YmplY3QgbGluZSAtIHByZXR0eSBtdWNoIGFueSBlbWFpbCByZWFkZXIgd2lsbAogc3VwcG9ydCB0aGF0IC0gc2luY2UgYmVjYXVzZSB0aGUgc2VxdWVuY2UgbnVtYmVyIGlzIHplcm8tcGFkZGVkLAogdGhlIG51bWVyaWNhbCBhbmQgYWxwaGFiZXRpYyBzb3J0IGlzIHRoZSBzYW1lLgogCi1UaGUgInN1YnN5c3RlbSIgaW4gdGhlIGVtYWlsJ3MgU3ViamVjdCBzaG91bGQgaWRlbnRpZnkgd2hpY2gKK1RoZSBgYHN1YnN5c3RlbWBgIGluIHRoZSBlbWFpbCdzIFN1YmplY3Qgc2hvdWxkIGlkZW50aWZ5IHdoaWNoCiBhcmVhIG9yIHN1YnN5c3RlbSBvZiB0aGUga2VybmVsIGlzIGJlaW5nIHBhdGNoZWQuCiAKLVRoZSAic3VtbWFyeSBwaHJhc2UiIGluIHRoZSBlbWFpbCdzIFN1YmplY3Qgc2hvdWxkIGNvbmNpc2VseQotZGVzY3JpYmUgdGhlIHBhdGNoIHdoaWNoIHRoYXQgZW1haWwgY29udGFpbnMuICBUaGUgInN1bW1hcnkKLXBocmFzZSIgc2hvdWxkIG5vdCBiZSBhIGZpbGVuYW1lLiAgRG8gbm90IHVzZSB0aGUgc2FtZSAic3VtbWFyeQotcGhyYXNlIiBmb3IgZXZlcnkgcGF0Y2ggaW4gYSB3aG9sZSBwYXRjaCBzZXJpZXMgKHdoZXJlIGEgInBhdGNoCi1zZXJpZXMiIGlzIGFuIG9yZGVyZWQgc2VxdWVuY2Ugb2YgbXVsdGlwbGUsIHJlbGF0ZWQgcGF0Y2hlcykuCitUaGUgYGBzdW1tYXJ5IHBocmFzZWBgIGluIHRoZSBlbWFpbCdzIFN1YmplY3Qgc2hvdWxkIGNvbmNpc2VseQorZGVzY3JpYmUgdGhlIHBhdGNoIHdoaWNoIHRoYXQgZW1haWwgY29udGFpbnMuICBUaGUgYGBzdW1tYXJ5CitwaHJhc2VgYCBzaG91bGQgbm90IGJlIGEgZmlsZW5hbWUuICBEbyBub3QgdXNlIHRoZSBzYW1lIGBgc3VtbWFyeQorcGhyYXNlYGAgZm9yIGV2ZXJ5IHBhdGNoIGluIGEgd2hvbGUgcGF0Y2ggc2VyaWVzICh3aGVyZSBhIGBgcGF0Y2gKK3Nlcmllc2BgIGlzIGFuIG9yZGVyZWQgc2VxdWVuY2Ugb2YgbXVsdGlwbGUsIHJlbGF0ZWQgcGF0Y2hlcykuCiAKLUJlYXIgaW4gbWluZCB0aGF0IHRoZSAic3VtbWFyeSBwaHJhc2UiIG9mIHlvdXIgZW1haWwgYmVjb21lcyBhCitCZWFyIGluIG1pbmQgdGhhdCB0aGUgYGBzdW1tYXJ5IHBocmFzZWBgIG9mIHlvdXIgZW1haWwgYmVjb21lcyBhCiBnbG9iYWxseS11bmlxdWUgaWRlbnRpZmllciBmb3IgdGhhdCBwYXRjaC4gIEl0IHByb3BhZ2F0ZXMgYWxsIHRoZSB3YXkKLWludG8gdGhlIGdpdCBjaGFuZ2Vsb2cuICBUaGUgInN1bW1hcnkgcGhyYXNlIiBtYXkgbGF0ZXIgYmUgdXNlZCBpbgoraW50byB0aGUgYGBnaXRgYCBjaGFuZ2Vsb2cuICBUaGUgYGBzdW1tYXJ5IHBocmFzZWBgIG1heSBsYXRlciBiZSB1c2VkIGluCiBkZXZlbG9wZXIgZGlzY3Vzc2lvbnMgd2hpY2ggcmVmZXIgdG8gdGhlIHBhdGNoLiAgUGVvcGxlIHdpbGwgd2FudCB0bwotZ29vZ2xlIGZvciB0aGUgInN1bW1hcnkgcGhyYXNlIiB0byByZWFkIGRpc2N1c3Npb24gcmVnYXJkaW5nIHRoYXQKK2dvb2dsZSBmb3IgdGhlIGBgc3VtbWFyeSBwaHJhc2VgYCB0byByZWFkIGRpc2N1c3Npb24gcmVnYXJkaW5nIHRoYXQKIHBhdGNoLiAgSXQgd2lsbCBhbHNvIGJlIHRoZSBvbmx5IHRoaW5nIHRoYXQgcGVvcGxlIG1heSBxdWlja2x5IHNlZQogd2hlbiwgdHdvIG9yIHRocmVlIG1vbnRocyBsYXRlciwgdGhleSBhcmUgZ29pbmcgdGhyb3VnaCBwZXJoYXBzCi10aG91c2FuZHMgb2YgcGF0Y2hlcyB1c2luZyB0b29scyBzdWNoIGFzICJnaXRrIiBvciAiZ2l0IGxvZwotLS1vbmVsaW5lIi4KK3Rob3VzYW5kcyBvZiBwYXRjaGVzIHVzaW5nIHRvb2xzIHN1Y2ggYXMgYGBnaXRrYGAgb3IgYGBnaXQgbG9nCistLW9uZWxpbmVgYC4KIAotRm9yIHRoZXNlIHJlYXNvbnMsIHRoZSAic3VtbWFyeSIgbXVzdCBiZSBubyBtb3JlIHRoYW4gNzAtNzUKK0ZvciB0aGVzZSByZWFzb25zLCB0aGUgYGBzdW1tYXJ5YGAgbXVzdCBiZSBubyBtb3JlIHRoYW4gNzAtNzUKIGNoYXJhY3RlcnMsIGFuZCBpdCBtdXN0IGRlc2NyaWJlIGJvdGggd2hhdCB0aGUgcGF0Y2ggY2hhbmdlcywgYXMgd2VsbAogYXMgd2h5IHRoZSBwYXRjaCBtaWdodCBiZSBuZWNlc3NhcnkuICBJdCBpcyBjaGFsbGVuZ2luZyB0byBiZSBib3RoCiBzdWNjaW5jdCBhbmQgZGVzY3JpcHRpdmUsIGJ1dCB0aGF0IGlzIHdoYXQgYSB3ZWxsLXdyaXR0ZW4gc3VtbWFyeQogc2hvdWxkIGRvLgogCi1UaGUgInN1bW1hcnkgcGhyYXNlIiBtYXkgYmUgcHJlZml4ZWQgYnkgdGFncyBlbmNsb3NlZCBpbiBzcXVhcmUKK1RoZSBgYHN1bW1hcnkgcGhyYXNlYGAgbWF5IGJlIHByZWZpeGVkIGJ5IHRhZ3MgZW5jbG9zZWQgaW4gc3F1YXJlCiBicmFja2V0czogIlN1YmplY3Q6IFtQQVRDSCA8dGFnPi4uLl0gPHN1bW1hcnkgcGhyYXNlPiIuICBUaGUgdGFncyBhcmUKIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHN1bW1hcnkgcGhyYXNlLCBidXQgZGVzY3JpYmUgaG93IHRoZSBwYXRjaAogc2hvdWxkIGJlIHRyZWF0ZWQuICBDb21tb24gdGFncyBtaWdodCBpbmNsdWRlIGEgdmVyc2lvbiBkZXNjcmlwdG9yIGlmCkBAIC02NzAsMTkgKzY4NCwxOSBAQAogYXBwbGllZCBhbmQgdGhhdCB0aGV5IGhhdmUgcmV2aWV3ZWQgb3IgYXBwbGllZCBhbGwgb2YgdGhlIHBhdGNoZXMgaW4KIHRoZSBwYXRjaCBzZXJpZXMuCiAKLUEgY291cGxlIG9mIGV4YW1wbGUgU3ViamVjdHM6CitBIGNvdXBsZSBvZiBleGFtcGxlIFN1YmplY3RzOjoKIAogICAgIFN1YmplY3Q6IFtQQVRDSCAyLzVdIGV4dDI6IGltcHJvdmUgc2NhbGFiaWxpdHkgb2YgYml0bWFwIHNlYXJjaGluZwogICAgIFN1YmplY3Q6IFtQQVRDSCB2MiAwMS8yN10geDg2OiBmaXggZWZsYWdzIHRyYWNraW5nCiAKLVRoZSAiZnJvbSIgbGluZSBtdXN0IGJlIHRoZSB2ZXJ5IGZpcnN0IGxpbmUgaW4gdGhlIG1lc3NhZ2UgYm9keSwKK1RoZSBgYGZyb21gYCBsaW5lIG11c3QgYmUgdGhlIHZlcnkgZmlyc3QgbGluZSBpbiB0aGUgbWVzc2FnZSBib2R5LAogYW5kIGhhcyB0aGUgZm9ybToKIAogICAgICAgICBGcm9tOiBPcmlnaW5hbCBBdXRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KIAotVGhlICJmcm9tIiBsaW5lIHNwZWNpZmllcyB3aG8gd2lsbCBiZSBjcmVkaXRlZCBhcyB0aGUgYXV0aG9yIG9mIHRoZQotcGF0Y2ggaW4gdGhlIHBlcm1hbmVudCBjaGFuZ2Vsb2cuICBJZiB0aGUgImZyb20iIGxpbmUgaXMgbWlzc2luZywKLXRoZW4gdGhlICJGcm9tOiIgbGluZSBmcm9tIHRoZSBlbWFpbCBoZWFkZXIgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZQorVGhlIGBgZnJvbWBgIGxpbmUgc3BlY2lmaWVzIHdobyB3aWxsIGJlIGNyZWRpdGVkIGFzIHRoZSBhdXRob3Igb2YgdGhlCitwYXRjaCBpbiB0aGUgcGVybWFuZW50IGNoYW5nZWxvZy4gIElmIHRoZSBgYGZyb21gYCBsaW5lIGlzIG1pc3NpbmcsCit0aGVuIHRoZSBgYEZyb206YGAgbGluZSBmcm9tIHRoZSBlbWFpbCBoZWFkZXIgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZQogdGhlIHBhdGNoIGF1dGhvciBpbiB0aGUgY2hhbmdlbG9nLgogCiBUaGUgZXhwbGFuYXRpb24gYm9keSB3aWxsIGJlIGNvbW1pdHRlZCB0byB0aGUgcGVybWFuZW50IHNvdXJjZQpAQCAtNjk0LDM1ICs3MDgsMzcgQEAKIGxvb2tpbmcgZm9yIHRoZSBhcHBsaWNhYmxlIHBhdGNoLiAgSWYgYSBwYXRjaCBmaXhlcyBhIGNvbXBpbGUgZmFpbHVyZSwKIGl0IG1heSBub3QgYmUgbmVjZXNzYXJ5IHRvIGluY2x1ZGUgX2FsbF8gb2YgdGhlIGNvbXBpbGUgZmFpbHVyZXM7IGp1c3QKIGVub3VnaCB0aGF0IGl0IGlzIGxpa2VseSB0aGF0IHNvbWVvbmUgc2VhcmNoaW5nIGZvciB0aGUgcGF0Y2ggY2FuIGZpbmQKLWl0LiAgQXMgaW4gdGhlICJzdW1tYXJ5IHBocmFzZSIsIGl0IGlzIGltcG9ydGFudCB0byBiZSBib3RoIHN1Y2NpbmN0IGFzCitpdC4gIEFzIGluIHRoZSBgYHN1bW1hcnkgcGhyYXNlYGAsIGl0IGlzIGltcG9ydGFudCB0byBiZSBib3RoIHN1Y2NpbmN0IGFzCiB3ZWxsIGFzIGRlc2NyaXB0aXZlLgogCi1UaGUgIi0tLSIgbWFya2VyIGxpbmUgc2VydmVzIHRoZSBlc3NlbnRpYWwgcHVycG9zZSBvZiBtYXJraW5nIGZvciBwYXRjaAorVGhlIGBgLS0tYGAgbWFya2VyIGxpbmUgc2VydmVzIHRoZSBlc3NlbnRpYWwgcHVycG9zZSBvZiBtYXJraW5nIGZvciBwYXRjaAogaGFuZGxpbmcgdG9vbHMgd2hlcmUgdGhlIGNoYW5nZWxvZyBtZXNzYWdlIGVuZHMuCiAKLU9uZSBnb29kIHVzZSBmb3IgdGhlIGFkZGl0aW9uYWwgY29tbWVudHMgYWZ0ZXIgdGhlICItLS0iIG1hcmtlciBpcyBmb3IKLWEgZGlmZnN0YXQsIHRvIHNob3cgd2hhdCBmaWxlcyBoYXZlIGNoYW5nZWQsIGFuZCB0aGUgbnVtYmVyIG9mCi1pbnNlcnRlZCBhbmQgZGVsZXRlZCBsaW5lcyBwZXIgZmlsZS4gIEEgZGlmZnN0YXQgaXMgZXNwZWNpYWxseSB1c2VmdWwKK09uZSBnb29kIHVzZSBmb3IgdGhlIGFkZGl0aW9uYWwgY29tbWVudHMgYWZ0ZXIgdGhlIGBgLS0tYGAgbWFya2VyIGlzIGZvcgorYSBgYGRpZmZzdGF0YGAsIHRvIHNob3cgd2hhdCBmaWxlcyBoYXZlIGNoYW5nZWQsIGFuZCB0aGUgbnVtYmVyIG9mCitpbnNlcnRlZCBhbmQgZGVsZXRlZCBsaW5lcyBwZXIgZmlsZS4gIEEgYGBkaWZmc3RhdGBgIGlzIGVzcGVjaWFsbHkgdXNlZnVsCiBvbiBiaWdnZXIgcGF0Y2hlcy4gIE90aGVyIGNvbW1lbnRzIHJlbGV2YW50IG9ubHkgdG8gdGhlIG1vbWVudCBvciB0aGUKIG1haW50YWluZXIsIG5vdCBzdWl0YWJsZSBmb3IgdGhlIHBlcm1hbmVudCBjaGFuZ2Vsb2csIHNob3VsZCBhbHNvIGdvCi1oZXJlLiAgQSBnb29kIGV4YW1wbGUgb2Ygc3VjaCBjb21tZW50cyBtaWdodCBiZSAicGF0Y2ggY2hhbmdlbG9ncyIKK2hlcmUuICBBIGdvb2QgZXhhbXBsZSBvZiBzdWNoIGNvbW1lbnRzIG1pZ2h0IGJlIGBgcGF0Y2ggY2hhbmdlbG9nc2BgCiB3aGljaCBkZXNjcmliZSB3aGF0IGhhcyBjaGFuZ2VkIGJldHdlZW4gdGhlIHYxIGFuZCB2MiB2ZXJzaW9uIG9mIHRoZQogcGF0Y2guCiAKLUlmIHlvdSBhcmUgZ29pbmcgdG8gaW5jbHVkZSBhIGRpZmZzdGF0IGFmdGVyIHRoZSAiLS0tIiBtYXJrZXIsIHBsZWFzZQotdXNlIGRpZmZzdGF0IG9wdGlvbnMgIi1wIDEgLXcgNzAiIHNvIHRoYXQgZmlsZW5hbWVzIGFyZSBsaXN0ZWQgZnJvbQorSWYgeW91IGFyZSBnb2luZyB0byBpbmNsdWRlIGEgYGBkaWZmc3RhdGBgIGFmdGVyIHRoZSBgYC0tLWBgIG1hcmtlciwgcGxlYXNlCit1c2UgYGBkaWZmc3RhdGBgIG9wdGlvbnMgYGAtcCAxIC13IDcwYGAgc28gdGhhdCBmaWxlbmFtZXMgYXJlIGxpc3RlZCBmcm9tCiB0aGUgdG9wIG9mIHRoZSBrZXJuZWwgc291cmNlIHRyZWUgYW5kIGRvbid0IHVzZSB0b28gbXVjaCBob3Jpem9udGFsCi1zcGFjZSAoZWFzaWx5IGZpdCBpbiA4MCBjb2x1bW5zLCBtYXliZSB3aXRoIHNvbWUgaW5kZW50YXRpb24pLiAgKGdpdAorc3BhY2UgKGVhc2lseSBmaXQgaW4gODAgY29sdW1ucywgbWF5YmUgd2l0aCBzb21lIGluZGVudGF0aW9uKS4gIChgYGdpdGBgCiBnZW5lcmF0ZXMgYXBwcm9wcmlhdGUgZGlmZnN0YXRzIGJ5IGRlZmF1bHQuKQogCiBTZWUgbW9yZSBkZXRhaWxzIG9uIHRoZSBwcm9wZXIgcGF0Y2ggZm9ybWF0IGluIHRoZSBmb2xsb3dpbmcKIHJlZmVyZW5jZXMuCiAKKy4uIF9leHBsaWNpdF9pbl9yZXBseV90bzoKKwogMTUpIEV4cGxpY2l0IEluLVJlcGx5LVRvIGhlYWRlcnMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEl0IGNhbiBiZSBoZWxwZnVsIHRvIG1hbnVhbGx5IGFkZCBJbi1SZXBseS1UbzogaGVhZGVycyB0byBhIHBhdGNoCi0oZS5nLiwgd2hlbiB1c2luZyAiZ2l0IHNlbmQtZW1haWwiKSB0byBhc3NvY2lhdGUgdGhlIHBhdGNoIHdpdGgKKyhlLmcuLCB3aGVuIHVzaW5nIGBgZ2l0IHNlbmQtZW1haWxgYCkgdG8gYXNzb2NpYXRlIHRoZSBwYXRjaCB3aXRoCiBwcmV2aW91cyByZWxldmFudCBkaXNjdXNzaW9uLCBlLmcuIHRvIGxpbmsgYSBidWcgZml4IHRvIHRoZSBlbWFpbCB3aXRoCiB0aGUgYnVnIHJlcG9ydC4gIEhvd2V2ZXIsIGZvciBhIG11bHRpLXBhdGNoIHNlcmllcywgaXQgaXMgZ2VuZXJhbGx5CiBiZXN0IHRvIGF2b2lkIHVzaW5nIEluLVJlcGx5LVRvOiB0byBsaW5rIHRvIG9sZGVyIHZlcnNpb25zIG9mIHRoZQpAQCAtNzMyLDEyICs3NDgsMTIgQEAKIHRoZSBjb3ZlciBlbWFpbCB0ZXh0KSB0byBsaW5rIHRvIGFuIGVhcmxpZXIgdmVyc2lvbiBvZiB0aGUgcGF0Y2ggc2VyaWVzLgogCiAKLTE2KSBTZW5kaW5nICJnaXQgcHVsbCIgcmVxdWVzdHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzE2KSBTZW5kaW5nIGBgZ2l0IHB1bGxgYCByZXF1ZXN0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIElmIHlvdSBoYXZlIGEgc2VyaWVzIG9mIHBhdGNoZXMsIGl0IG1heSBiZSBtb3N0IGNvbnZlbmllbnQgdG8gaGF2ZSB0aGUKIG1haW50YWluZXIgcHVsbCB0aGVtIGRpcmVjdGx5IGludG8gdGhlIHN1YnN5c3RlbSByZXBvc2l0b3J5IHdpdGggYQotImdpdCBwdWxsIiBvcGVyYXRpb24uICBOb3RlLCBob3dldmVyLCB0aGF0IHB1bGxpbmcgcGF0Y2hlcyBmcm9tIGEgZGV2ZWxvcGVyCitgYGdpdCBwdWxsYGAgb3BlcmF0aW9uLiAgTm90ZSwgaG93ZXZlciwgdGhhdCBwdWxsaW5nIHBhdGNoZXMgZnJvbSBhIGRldmVsb3BlcgogcmVxdWlyZXMgYSBoaWdoZXIgZGVncmVlIG9mIHRydXN0IHRoYW4gdGFraW5nIHBhdGNoZXMgZnJvbSBhIG1haWxpbmcgbGlzdC4KIEFzIGEgcmVzdWx0LCBtYW55IHN1YnN5c3RlbSBtYWludGFpbmVycyBhcmUgcmVsdWN0YW50IHRvIHRha2UgcHVsbAogcmVxdWVzdHMsIGVzcGVjaWFsbHkgZnJvbSBuZXcsIHVua25vd24gZGV2ZWxvcGVycy4gIElmIGluIGRvdWJ0IHlvdSBjYW4gdXNlCkBAIC03NDYsNyArNzYyLDcgQEAKIAogQSBwdWxsIHJlcXVlc3Qgc2hvdWxkIGhhdmUgW0dJVF0gb3IgW1BVTExdIGluIHRoZSBzdWJqZWN0IGxpbmUuICBUaGUKIHJlcXVlc3QgaXRzZWxmIHNob3VsZCBpbmNsdWRlIHRoZSByZXBvc2l0b3J5IG5hbWUgYW5kIHRoZSBicmFuY2ggb2YKLWludGVyZXN0IG9uIGEgc2luZ2xlIGxpbmU7IGl0IHNob3VsZCBsb29rIHNvbWV0aGluZyBsaWtlOgoraW50ZXJlc3Qgb24gYSBzaW5nbGUgbGluZTsgaXQgc2hvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2U6OgogCiAgIFBsZWFzZSBwdWxsIGZyb20KIApAQCAtNzU1LDEwICs3NzEsMTAgQEAKICAgdG8gZ2V0IHRoZXNlIGNoYW5nZXM6CiAKIEEgcHVsbCByZXF1ZXN0IHNob3VsZCBhbHNvIGluY2x1ZGUgYW4gb3ZlcmFsbCBtZXNzYWdlIHNheWluZyB3aGF0IHdpbGwgYmUKLWluY2x1ZGVkIGluIHRoZSByZXF1ZXN0LCBhICJnaXQgc2hvcnRsb2ciIGxpc3Rpbmcgb2YgdGhlIHBhdGNoZXMKLXRoZW1zZWx2ZXMsIGFuZCBhIGRpZmZzdGF0IHNob3dpbmcgdGhlIG92ZXJhbGwgZWZmZWN0IG9mIHRoZSBwYXRjaCBzZXJpZXMuCitpbmNsdWRlZCBpbiB0aGUgcmVxdWVzdCwgYSBgYGdpdCBzaG9ydGxvZ2BgIGxpc3Rpbmcgb2YgdGhlIHBhdGNoZXMKK3RoZW1zZWx2ZXMsIGFuZCBhIGBgZGlmZnN0YXRgYCBzaG93aW5nIHRoZSBvdmVyYWxsIGVmZmVjdCBvZiB0aGUgcGF0Y2ggc2VyaWVzLgogVGhlIGVhc2llc3Qgd2F5IHRvIGdldCBhbGwgdGhpcyBpbmZvcm1hdGlvbiB0b2dldGhlciBpcywgb2YgY291cnNlLCB0byBsZXQKLWdpdCBkbyBpdCBmb3IgeW91IHdpdGggdGhlICJnaXQgcmVxdWVzdC1wdWxsIiBjb21tYW5kLgorYGBnaXRgYCBkbyBpdCBmb3IgeW91IHdpdGggdGhlIGBgZ2l0IHJlcXVlc3QtcHVsbGBgIGNvbW1hbmQuCiAKIFNvbWUgbWFpbnRhaW5lcnMgKGluY2x1ZGluZyBMaW51cykgd2FudCB0byBzZWUgcHVsbCByZXF1ZXN0cyBmcm9tIHNpZ25lZAogY29tbWl0czsgdGhhdCBpbmNyZWFzZXMgdGhlaXIgY29uZmlkZW5jZSB0aGF0IHRoZSByZXF1ZXN0IGFjdHVhbGx5IGNhbWUKQEAgLTc3MCw4ICs3ODYsOCBAQAogbmV3IGRldmVsb3BlcnMsIGJ1dCB0aGVyZSBpcyBubyB3YXkgYXJvdW5kIGl0LiAgQXR0ZW5kaW5nIGNvbmZlcmVuY2VzIGNhbgogYmUgYSBnb29kIHdheSB0byBmaW5kIGRldmVsb3BlcnMgd2hvIGNhbiBzaWduIHlvdXIga2V5LgogCi1PbmNlIHlvdSBoYXZlIHByZXBhcmVkIGEgcGF0Y2ggc2VyaWVzIGluIGdpdCB0aGF0IHlvdSB3aXNoIHRvIGhhdmUgc29tZWJvZHkKLXB1bGwsIGNyZWF0ZSBhIHNpZ25lZCB0YWcgd2l0aCAiZ2l0IHRhZyAtcyIuICBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IHRhZworT25jZSB5b3UgaGF2ZSBwcmVwYXJlZCBhIHBhdGNoIHNlcmllcyBpbiBgYGdpdGBgIHRoYXQgeW91IHdpc2ggdG8gaGF2ZSBzb21lYm9keQorcHVsbCwgY3JlYXRlIGEgc2lnbmVkIHRhZyB3aXRoIGBgZ2l0IHRhZyAtc2BgLiAgVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyB0YWcKIGlkZW50aWZ5aW5nIHRoZSBsYXN0IGNvbW1pdCBpbiB0aGUgc2VyaWVzIGFuZCBjb250YWluaW5nIGEgc2lnbmF0dXJlCiBjcmVhdGVkIHdpdGggeW91ciBwcml2YXRlIGtleS4gIFlvdSB3aWxsIGFsc28gaGF2ZSB0aGUgb3Bwb3J0dW5pdHkgdG8gYWRkIGEKIGNoYW5nZWxvZy1zdHlsZSBtZXNzYWdlIHRvIHRoZSB0YWc7IHRoaXMgaXMgYW4gaWRlYWwgcGxhY2UgdG8gZGVzY3JpYmUgdGhlCkBAIC03ODIsMTQgKzc5OCwxMyBAQAogcHVibGljIHRyZWUuCiAKIFdoZW4gZ2VuZXJhdGluZyB5b3VyIHB1bGwgcmVxdWVzdCwgdXNlIHRoZSBzaWduZWQgdGFnIGFzIHRoZSB0YXJnZXQuICBBCi1jb21tYW5kIGxpa2UgdGhpcyB3aWxsIGRvIHRoZSB0cmljazoKK2NvbW1hbmQgbGlrZSB0aGlzIHdpbGwgZG8gdGhlIHRyaWNrOjoKIAogICBnaXQgcmVxdWVzdC1wdWxsIG1hc3RlciBnaXQ6Ly9teS5wdWJsaWMudHJlZS9saW51eC5naXQgbXktc2lnbmVkLXRhZwogCiAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNFQ1RJT04gMiAtIFJFRkVSRU5DRVMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1JFRkVSRU5DRVMKKyoqKioqKioqKioKIAogQW5kcmV3IE1vcnRvbiwgIlRoZSBwZXJmZWN0IHBhdGNoIiAodHBwKS4KICAgPGh0dHA6Ly93d3cub3psYWJzLm9yZy9+YWtwbS9zdHVmZi90cHAudHh0PgpAQCAtNzk5LDIzICs4MTQsMjggQEAKIAogR3JlZyBLcm9haC1IYXJ0bWFuLCAiSG93IHRvIHBpc3Mgb2ZmIGEga2VybmVsIHN1YnN5c3RlbSBtYWludGFpbmVyIi4KICAgPGh0dHA6Ly93d3cua3JvYWguY29tL2xvZy9saW51eC9tYWludGFpbmVyLmh0bWw+CisKICAgPGh0dHA6Ly93d3cua3JvYWguY29tL2xvZy9saW51eC9tYWludGFpbmVyLTAyLmh0bWw+CisKICAgPGh0dHA6Ly93d3cua3JvYWguY29tL2xvZy9saW51eC9tYWludGFpbmVyLTAzLmh0bWw+CisKICAgPGh0dHA6Ly93d3cua3JvYWguY29tL2xvZy9saW51eC9tYWludGFpbmVyLTA0Lmh0bWw+CisKICAgPGh0dHA6Ly93d3cua3JvYWguY29tL2xvZy9saW51eC9tYWludGFpbmVyLTA1Lmh0bWw+CisKICAgPGh0dHA6Ly93d3cua3JvYWguY29tL2xvZy9saW51eC9tYWludGFpbmVyLTA2Lmh0bWw+CiAKIE5PISEhISBObyBtb3JlIGh1Z2UgcGF0Y2ggYm9tYnMgdG8gbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZyBwZW9wbGUhCiAgIDxodHRwczovL2xrbWwub3JnL2xrbWwvMjAwNS83LzExLzMzNj4KIAogS2VybmVsIERvY3VtZW50YXRpb24vQ29kaW5nU3R5bGU6Ci0gIDxEb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlPgorICA6cmVmOmBEb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlIDxjb2RpbmdzdHlsZT5gCiAKIExpbnVzIFRvcnZhbGRzJ3MgbWFpbCBvbiB0aGUgY2Fub25pY2FsIHBhdGNoIGZvcm1hdDoKICAgPGh0dHA6Ly9sa21sLm9yZy9sa21sLzIwMDUvNC83LzE4Mz4KIAogQW5kaSBLbGVlbiwgIk9uIHN1Ym1pdHRpbmcga2VybmVsIHBhdGNoZXMiCiAgIFNvbWUgc3RyYXRlZ2llcyB0byBnZXQgZGlmZmljdWx0IG9yIGNvbnRyb3ZlcnNpYWwgY2hhbmdlcyBpbi4KKwogICBodHRwOi8vaGFsb2JhdGVzLmRlL29uLXN1Ym1pdHRpbmctcGF0Y2hlcy5wZGYKIAotLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWNwaS9hY3BpLWxpZC50eHQgYi9Eb2N1bWVudGF0aW9uL2FjcGkvYWNwaS1saWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZmU3YWYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2FjcGkvYWNwaS1saWQudHh0CkBAIC0wLDAgKzEsOTYgQEAKK1NwZWNpYWwgVXNhZ2UgTW9kZWwgb2YgdGhlIEFDUEkgQ29udHJvbCBNZXRob2QgTGlkIERldmljZQorCitDb3B5cmlnaHQgKEMpIDIwMTYsIEludGVsIENvcnBvcmF0aW9uCitBdXRob3I6IEx2IFpoZW5nIDxsdi56aGVuZ0BpbnRlbC5jb20+CisKKworQWJzdHJhY3Q6CisKK1BsYXRmb3JtcyBjb250YWluaW5nIGxpZHMgY29udmV5IGxpZCBzdGF0ZSAob3Blbi9jbG9zZSkgdG8gT1NQTXMgdXNpbmcgYQorY29udHJvbCBtZXRob2QgbGlkIGRldmljZS4gVG8gaW1wbGVtZW50IHRoaXMsIHRoZSBBTUwgdGFibGVzIGlzc3VlCitOb3RpZnkobGlkX2RldmljZSwgMHg4MCkgdG8gbm90aWZ5IHRoZSBPU1BNcyB3aGVuZXZlciB0aGUgbGlkIHN0YXRlIGhhcworY2hhbmdlZC4gVGhlIF9MSUQgY29udHJvbCBtZXRob2QgZm9yIHRoZSBsaWQgZGV2aWNlIG11c3QgYmUgaW1wbGVtZW50ZWQgdG8KK3JlcG9ydCB0aGUgImN1cnJlbnQiIHN0YXRlIG9mIHRoZSBsaWQgYXMgZWl0aGVyICJvcGVuZWQiIG9yICJjbG9zZWQiLgorCitGb3IgbW9zdCBwbGF0Zm9ybXMsIGJvdGggdGhlIF9MSUQgbWV0aG9kIGFuZCB0aGUgbGlkIG5vdGlmaWNhdGlvbnMgYXJlCityZWxpYWJsZS4gSG93ZXZlciwgdGhlcmUgYXJlIGV4Y2VwdGlvbnMuIEluIG9yZGVyIHRvIHdvcmsgd2l0aCB0aGVzZQorZXhjZXB0aW9uYWwgYnVnZ3kgcGxhdGZvcm1zLCBzcGVjaWFsIHJlc3RyaWN0aW9ucyBhbmQgZXhwZWN0aW9ucyBzaG91bGQgYmUKK3Rha2VuIGludG8gYWNjb3VudC4gVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIHJlc3RyaWN0aW9ucyBhbmQgdGhlCitleHBlY3Rpb25zIG9mIHRoZSBMaW51eCBBQ1BJIGxpZCBkZXZpY2UgZHJpdmVyLgorCisKKzEuIFJlc3RyaWN0aW9ucyBvZiB0aGUgcmV0dXJuaW5nIHZhbHVlIG9mIHRoZSBfTElEIGNvbnRyb2wgbWV0aG9kCisKK1RoZSBfTElEIGNvbnRyb2wgbWV0aG9kIGlzIGRlc2NyaWJlZCB0byByZXR1cm4gdGhlICJjdXJyZW50IiBsaWQgc3RhdGUuCitIb3dldmVyIHRoZSB3b3JkIG9mICJjdXJyZW50IiBoYXMgYW1iaWd1aXR5LCBzb21lIGJ1Z2d5IEFNTCB0YWJsZXMgcmV0dXJuCit0aGUgbGlkIHN0YXRlIHVwb24gdGhlIGxhc3QgbGlkIG5vdGlmaWNhdGlvbiBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgbGlkCitzdGF0ZSB1cG9uIHRoZSBsYXN0IF9MSUQgZXZhbHVhdGlvbi4gVGhlcmUgd29uJ3QgYmUgZGlmZmVyZW5jZSB3aGVuIHRoZQorX0xJRCBjb250cm9sIG1ldGhvZCBpcyBldmFsdWF0ZWQgZHVyaW5nIHRoZSBydW50aW1lLCB0aGUgcHJvYmxlbSBpcyBpdHMKK2luaXRpYWwgcmV0dXJuaW5nIHZhbHVlLiBXaGVuIHRoZSBBTUwgdGFibGVzIGltcGxlbWVudCB0aGlzIGNvbnRyb2wgbWV0aG9kCit3aXRoIGNhY2hlZCB2YWx1ZSwgdGhlIGluaXRpYWwgcmV0dXJuaW5nIHZhbHVlIGlzIGxpa2VseSBub3QgcmVsaWFibGUuCitUaGVyZSBhcmUgcGxhdGZvcm1zIGFsd2F5cyByZXR1biAiY2xvc2VkIiBhcyBpbml0aWFsIGxpZCBzdGF0ZS4KKworMi4gUmVzdHJpY3Rpb25zIG9mIHRoZSBsaWQgc3RhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbnMKKworVGhlcmUgYXJlIGJ1Z2d5IEFNTCB0YWJsZXMgbmV2ZXIgbm90aWZ5aW5nIHdoZW4gdGhlIGxpZCBkZXZpY2Ugc3RhdGUgaXMKK2NoYW5nZWQgdG8gIm9wZW5lZCIuIFRodXMgdGhlICJvcGVuZWQiIG5vdGlmaWNhdGlvbiBpcyBub3QgZ3VhcmFudGVlZC4gQnV0CitpdCBpcyBndWFyYW50ZWVkIHRoYXQgdGhlIEFNTCB0YWJsZXMgYWx3YXlzIG5vdGlmeSAiY2xvc2VkIiB3aGVuIHRoZSBsaWQKK3N0YXRlIGlzIGNoYW5nZWQgdG8gImNsb3NlZCIuIFRoZSAiY2xvc2VkIiBub3RpZmljYXRpb24gaXMgbm9ybWFsbHkgdXNlZCB0bwordHJpZ2dlciBzb21lIHN5c3RlbSBwb3dlciBzYXZpbmcgb3BlcmF0aW9ucyBvbiBXaW5kb3dzLiBTaW5jZSBpdCBpcyBmdWxseQordGVzdGVkLCBpdCBpcyByZWxpYWJsZSBmcm9tIGFsbCBBTUwgdGFibGVzLgorCiszLiBFeHBlY3Rpb25zIGZvciB0aGUgdXNlcnNwYWNlIHVzZXJzIG9mIHRoZSBBQ1BJIGxpZCBkZXZpY2UgZHJpdmVyCisKK1RoZSBBQ1BJIGJ1dHRvbiBkcml2ZXIgZXhwb3J0cyB0aGUgbGlkIHN0YXRlIHRvIHRoZSB1c2Vyc3BhY2UgdmlhIHRoZQorZm9sbG93aW5nIGZpbGU6CisgIC9wcm9jL2FjcGkvYnV0dG9uL2xpZC9MSUQwL3N0YXRlCitUaGlzIGZpbGUgYWN0dWFsbHkgY2FsbHMgdGhlIF9MSUQgY29udHJvbCBtZXRob2QgZGVzY3JpYmVkIGFib3ZlLiBBbmQgZ2l2ZW4KK3RoZSBwcmV2aW91cyBleHBsYW5hdGlvbiwgaXQgaXMgbm90IHJlbGlhYmxlIGVub3VnaCBvbiBzb21lIHBsYXRmb3Jtcy4gU28KK2l0IGlzIGFkdmlzZWQgZm9yIHRoZSB1c2Vyc3BhY2UgcHJvZ3JhbSB0byBub3QgdG8gc29sZWx5IHJlbHkgb24gdGhpcyBmaWxlCit0byBkZXRlcm1pbmUgdGhlIGFjdHVhbCBsaWQgc3RhdGUuCisKK1RoZSBBQ1BJIGJ1dHRvbiBkcml2ZXIgZW1pdHMgdGhlIGZvbGxvd2luZyBpbnB1dCBldmVudCB0byB0aGUgdXNlcnNwYWNlOgorICBTV19MSUQKK1RoZSBBQ1BJIGxpZCBkZXZpY2UgZHJpdmVyIGlzIGltcGxlbWVudGVkIHRvIHRyeSB0byBkZWxpdmVyIHRoZSBwbGF0Zm9ybQordHJpZ2dlcmVkIGV2ZW50cyB0byB0aGUgdXNlcnNwYWNlLiBIb3dldmVyLCBnaXZlbiB0aGUgZmFjdCB0aGF0IHRoZSBidWdneQorZmlybXdhcmUgY2Fubm90IG1ha2Ugc3VyZSAib3BlbmVkIi8iY2xvc2VkIiBldmVudHMgYXJlIHBhaXJlZCwgdGhlIEFDUEkKK2J1dHRvbiBkcml2ZXIgdXNlcyB0aGUgZm9sbG93aW5nIDMgbW9kZXMgaW4gb3JkZXIgbm90IHRvIHRyaWdnZXIgaXNzdWVzLgorCitJZiB0aGUgdXNlcnNwYWNlIGhhc24ndCBiZWVuIHByZXBhcmVkIHRvIGlnbm9yZSB0aGUgdW5yZWxpYWJsZSAib3BlbmVkIgorZXZlbnRzIGFuZCB0aGUgdW5yZWxpYWJsZSBpbml0aWFsIHN0YXRlIG5vdGlmaWNhdGlvbiwgTGludXggdXNlcnMgY2FuIHVzZQordGhlIGZvbGxvd2luZyBrZXJuZWwgcGFyYW1ldGVycyB0byBoYW5kbGUgdGhlIHBvc3NpYmxlIGlzc3VlczoKK0EuIGJ1dHRvbi5saWRfaW5pdF9zdGF0ZT1tZXRob2Q6CisgICBXaGVuIHRoaXMgb3B0aW9uIGlzIHNwZWNpZmllZCwgdGhlIEFDUEkgYnV0dG9uIGRyaXZlciByZXBvcnRzIHRoZQorICAgaW5pdGlhbCBsaWQgc3RhdGUgdXNpbmcgdGhlIHJldHVybmluZyB2YWx1ZSBvZiB0aGUgX0xJRCBjb250cm9sIG1ldGhvZAorICAgYW5kIHdoZXRoZXIgdGhlICJvcGVuZWQiLyJjbG9zZWQiIGV2ZW50cyBhcmUgcGFpcmVkIGZ1bGx5IHJlbGllcyBvbiB0aGUKKyAgIGZpcm13YXJlIGltcGxlbWVudGF0aW9uLgorICAgVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gZml4IHNvbWUgcGxhdGZvcm1zIHdoZXJlIHRoZSByZXR1cm5pbmcgdmFsdWUKKyAgIG9mIHRoZSBfTElEIGNvbnRyb2wgbWV0aG9kIGlzIHJlbGlhYmxlIGJ1dCB0aGUgaW5pdGlhbCBsaWQgc3RhdGUKKyAgIG5vdGlmaWNhdGlvbiBpcyBtaXNzaW5nLgorICAgVGhpcyBvcHRpb24gaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IgZHVyaW5nIHRoZSBwZXJpb2QgdGhlIHVzZXJzcGFjZQorICAgaXNuJ3QgcmVhZHkgdG8gaGFuZGxlIHRoZSBidWdneSBBTUwgdGFibGVzLgorQi4gYnV0dG9uLmxpZF9pbml0X3N0YXRlPW9wZW46CisgICBXaGVuIHRoaXMgb3B0aW9uIGlzIHNwZWNpZmllZCwgdGhlIEFDUEkgYnV0dG9uIGRyaXZlciBhbHdheXMgcmVwb3J0cyB0aGUKKyAgIGluaXRpYWwgbGlkIHN0YXRlIGFzICJvcGVuZWQiIGFuZCB3aGV0aGVyIHRoZSAib3BlbmVkIi8iY2xvc2VkIiBldmVudHMKKyAgIGFyZSBwYWlyZWQgZnVsbHkgcmVsaWVzIG9uIHRoZSBmaXJtd2FyZSBpbXBsZW1lbnRhdGlvbi4KKyAgIFRoaXMgbWF5IGZpeCBzb21lIHBsYXRmb3JtcyB3aGVyZSB0aGUgcmV0dXJuaW5nIHZhbHVlIG9mIHRoZSBfTElECisgICBjb250cm9sIG1ldGhvZCBpcyBub3QgcmVsaWFibGUgYW5kIHRoZSBpbml0aWFsIGxpZCBzdGF0ZSBub3RpZmljYXRpb24gaXMKKyAgIG1pc3NpbmcuCisKK0lmIHRoZSB1c2Vyc3BhY2UgaGFzIGJlZW4gcHJlcGFyZWQgdG8gaWdub3JlIHRoZSB1bnJlbGlhYmxlICJvcGVuZWQiIGV2ZW50cworYW5kIHRoZSB1bnJlbGlhYmxlIGluaXRpYWwgc3RhdGUgbm90aWZpY2F0aW9uLCBMaW51eCB1c2VycyBzaG91bGQgYWx3YXlzCit1c2UgdGhlIGZvbGxvd2luZyBrZXJuZWwgcGFyYW1ldGVyOgorQy4gYnV0dG9uLmxpZF9pbml0X3N0YXRlPWlnbm9yZToKKyAgIFdoZW4gdGhpcyBvcHRpb24gaXMgc3BlY2lmaWVkLCB0aGUgQUNQSSBidXR0b24gZHJpdmVyIG5ldmVyIHJlcG9ydHMgdGhlCisgICBpbml0aWFsIGxpZCBzdGF0ZSBhbmQgdGhlcmUgaXMgYSBjb21wZW5zYXRpb24gbWVjaGFuaXNtIGltcGxlbWVudGVkIHRvCisgICBlbnN1cmUgdGhhdCB0aGUgcmVsaWFibGUgImNsb3NlZCIgbm90aWZpY2F0aW9ucyBjYW4gYWx3YXlzIGJlIGRlbGlldmVyZWQKKyAgIHRvIHRoZSB1c2Vyc3BhY2UgYnkgYWx3YXlzIHBhaXJpbmcgImNsb3NlZCIgaW5wdXQgZXZlbnRzIHdpdGggY29tcGxlbWVudAorICAgIm9wZW5lZCIgaW5wdXQgZXZlbnRzLiBCdXQgdGhlcmUgaXMgc3RpbGwgbm8gZ3VhcmFudGVlIHRoYXQgdGhlICJvcGVuZWQiCisgICBub3RpZmljYXRpb25zIGNhbiBiZSBkZWxpdmVyZWQgdG8gdGhlIHVzZXJzcGFjZSB3aGVuIHRoZSBsaWQgaXMgYWN0dWFsbHkKKyAgIG9wZW5zIGdpdmVuIHRoYXQgc29tZSBBTUwgdGFibGVzIGRvIG5vdCBzZW5kICJvcGVuZWQiIG5vdGlmaWNhdGlvbnMKKyAgIHJlbGlhYmx5LgorICAgSW4gdGhpcyBtb2RlLCBpZiBldmVyeXRoaW5nIGlzIGNvcnJlY3RseSBpbXBsZW1lbnRlZCBieSB0aGUgcGxhdGZvcm0KKyAgIGZpcm13YXJlLCB0aGUgb2xkIHVzZXJzcGFjZSBwcm9ncmFtcyBzaG91bGQgc3RpbGwgd29yay4gT3RoZXJ3aXNlLCB0aGUKKyAgIG5ldyB1c2Vyc3BhY2UgcHJvZ3JhbXMgYXJlIHJlcXVpcmVkIHRvIHdvcmsgd2l0aCB0aGUgQUNQSSBidXR0b24gZHJpdmVyLgorICAgVGhpcyBvcHRpb24gd2lsbCBiZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBhZnRlciB0aGUgdXNlcnNwYWNlIGlzIHJlYWR5IHRvCisgICBoYW5kbGUgdGhlIGJ1Z2d5IEFNTCB0YWJsZXMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FjcGkvZ3Bpby1wcm9wZXJ0aWVzLnR4dCBiL0RvY3VtZW50YXRpb24vYWNwaS9ncGlvLXByb3BlcnRpZXMudHh0CmluZGV4IGYzNWRhZDEuLjVhYWZlMGIzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FjcGkvZ3Bpby1wcm9wZXJ0aWVzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2FjcGkvZ3Bpby1wcm9wZXJ0aWVzLnR4dApAQCAtMjgsOCArMjgsOCBAQAogICAgICAgICAgIFRvVVVJRCgiZGFmZmQ4MTQtNmViYS00ZDhjLThhOTEtYmM5YmJmNGFhMzAxIiksCiAgICAgICAgICAgUGFja2FnZSAoKQogCSAgewotICAgICAgICAgICAgICBQYWNrYWdlICgpIHsicmVzZXQtZ3BpbyIsIFBhY2thZ2UoKSB7XkJUSCwgMSwgMSwgMCB9fSwKLSAgICAgICAgICAgICAgUGFja2FnZSAoKSB7InNodXRkb3duLWdwaW8iLCBQYWNrYWdlKCkge15CVEgsIDAsIDAsIDAgfX0sCisgICAgICAgICAgICAgIFBhY2thZ2UgKCkgeyJyZXNldC1ncGlvcyIsIFBhY2thZ2UoKSB7XkJUSCwgMSwgMSwgMCB9fSwKKyAgICAgICAgICAgICAgUGFja2FnZSAoKSB7InNodXRkb3duLWdwaW9zIiwgUGFja2FnZSgpIHteQlRILCAwLCAwLCAwIH19LAogICAgICAgICAgIH0KICAgICAgIH0pCiAgIH0KQEAgLTQ4LDcgKzQ4LDcgQEAKIGFjdGl2ZSBsb3cgb3IgaGlnaCwgdGhlICJhY3RpdmVfbG93IiBhcmd1bWVudCBjYW4gYmUgdXNlZCBoZXJlLiAgU2V0dGluZwogaXQgdG8gMSBtYXJrcyB0aGUgR1BJTyBhcyBhY3RpdmUgbG93LgogCi1JbiBvdXIgQmx1ZXRvb3RoIGV4YW1wbGUgdGhlICJyZXNldC1ncGlvIiByZWZlcnMgdG8gdGhlIHNlY29uZCBHcGlvSW8oKQorSW4gb3VyIEJsdWV0b290aCBleGFtcGxlIHRoZSAicmVzZXQtZ3Bpb3MiIHJlZmVycyB0byB0aGUgc2Vjb25kIEdwaW9JbygpCiByZXNvdXJjZSwgc2Vjb25kIHBpbiBpbiB0aGF0IHJlc291cmNlIHdpdGggdGhlIEdQSU8gbnVtYmVyIG9mIDMxLgogCiBBQ1BJIEdQSU8gTWFwcGluZ3MgUHJvdmlkZWQgYnkgRHJpdmVycwpAQCAtODMsOCArODMsOCBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2dwaW9fcGFyYW1zIHNodXRkb3duX2dwaW8gPSB7IDAsIDAsIGZhbHNlIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9ncGlvX21hcHBpbmcgYmx1ZXRvb3RoX2FjcGlfZ3Bpb3NbXSA9IHsKLSAgeyAicmVzZXQtZ3BpbyIsICZyZXNldF9ncGlvLCAxIH0sCi0gIHsgInNodXRkb3duLWdwaW8iLCAmc2h1dGRvd25fZ3BpbywgMSB9LAorICB7ICJyZXNldC1ncGlvcyIsICZyZXNldF9ncGlvLCAxIH0sCisgIHsgInNodXRkb3duLWdwaW9zIiwgJnNodXRkb3duX2dwaW8sIDEgfSwKICAgeyB9LAogfTsKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hcHBseWluZy1wYXRjaGVzLnR4dCBiL0RvY3VtZW50YXRpb24vYXBwbHlpbmctcGF0Y2hlcy50eHQKaW5kZXggNzdkZjU1Yi4uMDJjZTQ5MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hcHBseWluZy1wYXRjaGVzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2FwcGx5aW5nLXBhdGNoZXMudHh0CkBAIC0xLDkgKzEsMTMgQEAKKy4uIF9hcHBseWluZ19wYXRjaGVzOgogCi0JQXBwbHlpbmcgUGF0Y2hlcyBUbyBUaGUgTGludXggS2VybmVsCi0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBcHBseWluZyBQYXRjaGVzIFRvIFRoZSBMaW51eCBLZXJuZWwKKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogCi0JT3JpZ2luYWwgYnk6IEplc3BlciBKdWhsLCBBdWd1c3QgMjAwNQotCUxhc3QgdXBkYXRlOiAyMDA2LTAxLTA1CitPcmlnaW5hbCBieToKKwlKZXNwZXIgSnVobCwgQXVndXN0IDIwMDUKKworTGFzdCB1cGRhdGU6CisJMjAxNi0wOS0xNAogCiAKIEEgZnJlcXVlbnRseSBhc2tlZCBxdWVzdGlvbiBvbiB0aGUgTGludXggS2VybmVsIE1haWxpbmcgTGlzdCBpcyBob3cgdG8gYXBwbHkKQEAgLTE3LDEwICsyMSwxMiBAQAogCiAKIFdoYXQgaXMgYSBwYXRjaD8KLS0tLQotIEEgcGF0Y2ggaXMgYSBzbWFsbCB0ZXh0IGRvY3VtZW50IGNvbnRhaW5pbmcgYSBkZWx0YSBvZiBjaGFuZ2VzIGJldHdlZW4gdHdvCi1kaWZmZXJlbnQgdmVyc2lvbnMgb2YgYSBzb3VyY2UgdHJlZS4gUGF0Y2hlcyBhcmUgY3JlYXRlZCB3aXRoIHRoZSBgZGlmZicKKz09PT09PT09PT09PT09PT0KKworQSBwYXRjaCBpcyBhIHNtYWxsIHRleHQgZG9jdW1lbnQgY29udGFpbmluZyBhIGRlbHRhIG9mIGNoYW5nZXMgYmV0d2VlbiB0d28KK2RpZmZlcmVudCB2ZXJzaW9ucyBvZiBhIHNvdXJjZSB0cmVlLiBQYXRjaGVzIGFyZSBjcmVhdGVkIHdpdGggdGhlIGBgZGlmZmBgCiBwcm9ncmFtLgorCiBUbyBjb3JyZWN0bHkgYXBwbHkgYSBwYXRjaCB5b3UgbmVlZCB0byBrbm93IHdoYXQgYmFzZSBpdCB3YXMgZ2VuZXJhdGVkIGZyb20KIGFuZCB3aGF0IG5ldyB2ZXJzaW9uIHRoZSBwYXRjaCB3aWxsIGNoYW5nZSB0aGUgc291cmNlIHRyZWUgaW50by4gVGhlc2UKIHNob3VsZCBib3RoIGJlIHByZXNlbnQgaW4gdGhlIHBhdGNoIGZpbGUgbWV0YWRhdGEgb3IgYmUgcG9zc2libGUgdG8gZGVkdWNlCkBAIC0yOCw4ICszNCw5IEBACiAKIAogSG93IGRvIEkgYXBwbHkgb3IgcmV2ZXJ0IGEgcGF0Y2g/Ci0tLS0KLSBZb3UgYXBwbHkgYSBwYXRjaCB3aXRoIHRoZSBgcGF0Y2gnIHByb2dyYW0uIFRoZSBwYXRjaCBwcm9ncmFtIHJlYWRzIGEgZGlmZgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1lvdSBhcHBseSBhIHBhdGNoIHdpdGggdGhlIGBgcGF0Y2hgYCBwcm9ncmFtLiBUaGUgcGF0Y2ggcHJvZ3JhbSByZWFkcyBhIGRpZmYKIChvciBwYXRjaCkgZmlsZSBhbmQgbWFrZXMgdGhlIGNoYW5nZXMgdG8gdGhlIHNvdXJjZSB0cmVlIGRlc2NyaWJlZCBpbiBpdC4KIAogUGF0Y2hlcyBmb3IgdGhlIExpbnV4IGtlcm5lbCBhcmUgZ2VuZXJhdGVkIHJlbGF0aXZlIHRvIHRoZSBwYXJlbnQgZGlyZWN0b3J5CkBAIC0zOCwyNiArNDUsMzMgQEAKIFRoaXMgbWVhbnMgdGhhdCBwYXRocyB0byBmaWxlcyBpbnNpZGUgdGhlIHBhdGNoIGZpbGUgY29udGFpbiB0aGUgbmFtZSBvZiB0aGUKIGtlcm5lbCBzb3VyY2UgZGlyZWN0b3JpZXMgaXQgd2FzIGdlbmVyYXRlZCBhZ2FpbnN0IChvciBzb21lIG90aGVyIGRpcmVjdG9yeQogbmFtZXMgbGlrZSAiYS8iIGFuZCAiYi8iKS4KKwogU2luY2UgdGhpcyBpcyB1bmxpa2VseSB0byBtYXRjaCB0aGUgbmFtZSBvZiB0aGUga2VybmVsIHNvdXJjZSBkaXIgb24geW91cgogbG9jYWwgbWFjaGluZSAoYnV0IGlzIG9mdGVuIHVzZWZ1bCBpbmZvIHRvIHNlZSB3aGF0IHZlcnNpb24gYW4gb3RoZXJ3aXNlCiB1bmxhYmVsZWQgcGF0Y2ggd2FzIGdlbmVyYXRlZCBhZ2FpbnN0KSB5b3Ugc2hvdWxkIGNoYW5nZSBpbnRvIHlvdXIga2VybmVsCiBzb3VyY2UgZGlyZWN0b3J5IGFuZCB0aGVuIHN0cmlwIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBwYXRoIGZyb20gZmlsZW5hbWVzCi1pbiB0aGUgcGF0Y2ggZmlsZSB3aGVuIGFwcGx5aW5nIGl0ICh0aGUgLXAxIGFyZ3VtZW50IHRvIGBwYXRjaCcgZG9lcyB0aGlzKS4KK2luIHRoZSBwYXRjaCBmaWxlIHdoZW4gYXBwbHlpbmcgaXQgKHRoZSBgYC1wMWBgIGFyZ3VtZW50IHRvIGBgcGF0Y2hgYCBkb2VzCit0aGlzKS4KIAogVG8gcmV2ZXJ0IGEgcHJldmlvdXNseSBhcHBsaWVkIHBhdGNoLCB1c2UgdGhlIC1SIGFyZ3VtZW50IHRvIHBhdGNoLgotU28sIGlmIHlvdSBhcHBsaWVkIGEgcGF0Y2ggbGlrZSB0aGlzOgorU28sIGlmIHlvdSBhcHBsaWVkIGEgcGF0Y2ggbGlrZSB0aGlzOjoKKwogCXBhdGNoIC1wMSA8IC4uL3BhdGNoLXgueS56CiAKLVlvdSBjYW4gcmV2ZXJ0ICh1bmRvKSBpdCBsaWtlIHRoaXM6CitZb3UgY2FuIHJldmVydCAodW5kbykgaXQgbGlrZSB0aGlzOjoKKwogCXBhdGNoIC1SIC1wMSA8IC4uL3BhdGNoLXgueS56CiAKIAotSG93IGRvIEkgZmVlZCBhIHBhdGNoL2RpZmYgZmlsZSB0byBgcGF0Y2gnPwotLS0tCi0gVGhpcyAoYXMgdXN1YWwgd2l0aCBMaW51eCBhbmQgb3RoZXIgVU5JWCBsaWtlIG9wZXJhdGluZyBzeXN0ZW1zKSBjYW4gYmUKK0hvdyBkbyBJIGZlZWQgYSBwYXRjaC9kaWZmIGZpbGUgdG8gYGBwYXRjaGBgPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgKGFzIHVzdWFsIHdpdGggTGludXggYW5kIG90aGVyIFVOSVggbGlrZSBvcGVyYXRpbmcgc3lzdGVtcykgY2FuIGJlCiBkb25lIGluIHNldmVyYWwgZGlmZmVyZW50IHdheXMuCisKIEluIGFsbCB0aGUgZXhhbXBsZXMgYmVsb3cgSSBmZWVkIHRoZSBmaWxlIChpbiB1bmNvbXByZXNzZWQgZm9ybSkgdG8gcGF0Y2gKLXZpYSBzdGRpbiB1c2luZyB0aGUgZm9sbG93aW5nIHN5bnRheDoKK3ZpYSBzdGRpbiB1c2luZyB0aGUgZm9sbG93aW5nIHN5bnRheDo6CisKIAlwYXRjaCAtcDEgPCBwYXRoL3RvL3BhdGNoLXgueS56CiAKIElmIHlvdSBqdXN0IHdhbnQgdG8gYmUgYWJsZSB0byBmb2xsb3cgdGhlIGV4YW1wbGVzIGJlbG93IGFuZCBkb24ndCB3YW50IHRvCkBAIC02NSwzNSArNzksNDAgQEAKIHNlY3Rpb24gaGVyZS4KIAogUGF0Y2ggY2FuIGFsc28gZ2V0IHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIHVzZSB2aWEgdGhlIC1pIGFyZ3VtZW50LCBsaWtlCi10aGlzOgordGhpczo6CisKIAlwYXRjaCAtcDEgLWkgcGF0aC90by9wYXRjaC14LnkuegogCi1JZiB5b3VyIHBhdGNoIGZpbGUgaXMgY29tcHJlc3NlZCB3aXRoIGd6aXAgb3IgYnppcDIgYW5kIHlvdSBkb24ndCB3YW50IHRvCitJZiB5b3VyIHBhdGNoIGZpbGUgaXMgY29tcHJlc3NlZCB3aXRoIGd6aXAgb3IgeHogYW5kIHlvdSBkb24ndCB3YW50IHRvCiB1bmNvbXByZXNzIGl0IGJlZm9yZSBhcHBseWluZyBpdCwgdGhlbiB5b3UgY2FuIGZlZWQgaXQgdG8gcGF0Y2ggbGlrZSB0aGlzCi1pbnN0ZWFkOgotCXpjYXQgcGF0aC90by9wYXRjaC14Lnkuei5neiB8IHBhdGNoIC1wMQotCWJ6Y2F0IHBhdGgvdG8vcGF0Y2gteC55LnouYnoyIHwgcGF0Y2ggLXAxCitpbnN0ZWFkOjoKKworCXh6Y2F0IHBhdGgvdG8vcGF0Y2gteC55LnoueHogfCBwYXRjaCAtcDEKKwliemNhdCBwYXRoL3RvL3BhdGNoLXgueS56Lmd6IHwgcGF0Y2ggLXAxCiAKIElmIHlvdSB3aXNoIHRvIHVuY29tcHJlc3MgdGhlIHBhdGNoIGZpbGUgYnkgaGFuZCBmaXJzdCBiZWZvcmUgYXBwbHlpbmcgaXQKICh3aGF0IEkgYXNzdW1lIHlvdSd2ZSBkb25lIGluIHRoZSBleGFtcGxlcyBiZWxvdyksIHRoZW4geW91IHNpbXBseSBydW4KLWd1bnppcCBvciBidW56aXAyIG9uIHRoZSBmaWxlIC0tIGxpa2UgdGhpczoKK2d1bnppcCBvciB4eiBvbiB0aGUgZmlsZSAtLSBsaWtlIHRoaXM6OgorCiAJZ3VuemlwIHBhdGNoLXgueS56Lmd6Ci0JYnVuemlwMiBwYXRjaC14Lnkuei5iejIKKwl4eiAtZCBwYXRjaC14Lnkuei54egogCiBXaGljaCB3aWxsIGxlYXZlIHlvdSB3aXRoIGEgcGxhaW4gdGV4dCBwYXRjaC14LnkueiBmaWxlIHRoYXQgeW91IGNhbiBmZWVkIHRvCi1wYXRjaCB2aWEgc3RkaW4gb3IgdGhlIC1pIGFyZ3VtZW50LCBhcyB5b3UgcHJlZmVyLgorcGF0Y2ggdmlhIHN0ZGluIG9yIHRoZSBgYC1pYGAgYXJndW1lbnQsIGFzIHlvdSBwcmVmZXIuCiAKLUEgZmV3IG90aGVyIG5pY2UgYXJndW1lbnRzIGZvciBwYXRjaCBhcmUgLXMgd2hpY2ggY2F1c2VzIHBhdGNoIHRvIGJlIHNpbGVudAorQSBmZXcgb3RoZXIgbmljZSBhcmd1bWVudHMgZm9yIHBhdGNoIGFyZSBgYC1zYGAgd2hpY2ggY2F1c2VzIHBhdGNoIHRvIGJlIHNpbGVudAogZXhjZXB0IGZvciBlcnJvcnMgd2hpY2ggaXMgbmljZSB0byBwcmV2ZW50IGVycm9ycyBmcm9tIHNjcm9sbGluZyBvdXQgb2YgdGhlCi1zY3JlZW4gdG9vIGZhc3QsIGFuZCAtLWRyeS1ydW4gd2hpY2ggY2F1c2VzIHBhdGNoIHRvIGp1c3QgcHJpbnQgYSBsaXN0aW5nIG9mCi13aGF0IHdvdWxkIGhhcHBlbiwgYnV0IGRvZXNuJ3QgYWN0dWFsbHkgbWFrZSBhbnkgY2hhbmdlcy4gRmluYWxseSAtLXZlcmJvc2UKK3NjcmVlbiB0b28gZmFzdCwgYW5kIGBgLS1kcnktcnVuYGAgd2hpY2ggY2F1c2VzIHBhdGNoIHRvIGp1c3QgcHJpbnQgYSBsaXN0aW5nIG9mCit3aGF0IHdvdWxkIGhhcHBlbiwgYnV0IGRvZXNuJ3QgYWN0dWFsbHkgbWFrZSBhbnkgY2hhbmdlcy4gRmluYWxseSBgYC0tdmVyYm9zZWBgCiB0ZWxscyBwYXRjaCB0byBwcmludCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB3b3JrIGJlaW5nIGRvbmUuCiAKIAogQ29tbW9uIGVycm9ycyB3aGVuIHBhdGNoaW5nCi0tLS0KLSBXaGVuIHBhdGNoIGFwcGxpZXMgYSBwYXRjaCBmaWxlIGl0IGF0dGVtcHRzIHRvIHZlcmlmeSB0aGUgc2FuaXR5IG9mIHRoZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1doZW4gcGF0Y2ggYXBwbGllcyBhIHBhdGNoIGZpbGUgaXQgYXR0ZW1wdHMgdG8gdmVyaWZ5IHRoZSBzYW5pdHkgb2YgdGhlCiBmaWxlIGluIGRpZmZlcmVudCB3YXlzLgorCiBDaGVja2luZyB0aGF0IHRoZSBmaWxlIGxvb2tzIGxpa2UgYSB2YWxpZCBwYXRjaCBmaWxlIGFuZCBjaGVja2luZyB0aGUgY29kZQogYXJvdW5kIHRoZSBiaXRzIGJlaW5nIG1vZGlmaWVkIG1hdGNoZXMgdGhlIGNvbnRleHQgcHJvdmlkZWQgaW4gdGhlIHBhdGNoIGFyZQoganVzdCB0d28gb2YgdGhlIGJhc2ljIHNhbml0eSBjaGVja3MgcGF0Y2ggZG9lcy4KQEAgLTExMSwxMyArMTMwLDEzIEBACiB1c3VhbGx5IGFkanVzdCB0aGUgbGluZSBudW1iZXJzIGFuZCBhcHBseSB0aGUgcGF0Y2guCiAKIFdoZW5ldmVyIHBhdGNoIGFwcGxpZXMgYSBwYXRjaCB0aGF0IGl0IGhhZCB0byBtb2RpZnkgYSBiaXQgdG8gbWFrZSBpdCBmaXQKLWl0J2xsIHRlbGwgeW91IGFib3V0IGl0IGJ5IHNheWluZyB0aGUgcGF0Y2ggYXBwbGllZCB3aXRoICdmdXp6Jy4KK2l0J2xsIHRlbGwgeW91IGFib3V0IGl0IGJ5IHNheWluZyB0aGUgcGF0Y2ggYXBwbGllZCB3aXRoICoqZnV6eioqLgogWW91IHNob3VsZCBiZSB3YXJ5IG9mIHN1Y2ggY2hhbmdlcyBzaW5jZSBldmVuIHRob3VnaCBwYXRjaCBwcm9iYWJseSBnb3QgaXQKIHJpZ2h0IGl0IGRvZXNuJ3QgL2Fsd2F5cy8gZ2V0IGl0IHJpZ2h0LCBhbmQgdGhlIHJlc3VsdCB3aWxsIHNvbWV0aW1lcyBiZQogd3JvbmcuCiAKIFdoZW4gcGF0Y2ggZW5jb3VudGVycyBhIGNoYW5nZSB0aGF0IGl0IGNhbid0IGZpeCB1cCB3aXRoIGZ1enogaXQgcmVqZWN0cyBpdAotb3V0cmlnaHQgYW5kIGxlYXZlcyBhIGZpbGUgd2l0aCBhIC5yZWogZXh0ZW5zaW9uIChhIHJlamVjdCBmaWxlKS4gWW91IGNhbgorb3V0cmlnaHQgYW5kIGxlYXZlcyBhIGZpbGUgd2l0aCBhIGBgLnJlamBgIGV4dGVuc2lvbiAoYSByZWplY3QgZmlsZSkuIFlvdSBjYW4KIHJlYWQgdGhpcyBmaWxlIHRvIHNlZSBleGFjdGx5IHdoYXQgY2hhbmdlIGNvdWxkbid0IGJlIGFwcGxpZWQsIHNvIHlvdSBjYW4KIGdvIGZpeCBpdCB1cCBieSBoYW5kIGlmIHlvdSB3aXNoLgogCkBAIC0xMzIsNDMgKzE1MSw0NyBAQAogCiBMZXQncyBsb29rIGEgYml0IG1vcmUgYXQgc29tZSBvZiB0aGUgbWVzc2FnZXMgcGF0Y2ggY2FuIHByb2R1Y2UuCiAKLUlmIHBhdGNoIHN0b3BzIGFuZCBwcmVzZW50cyBhICJGaWxlIHRvIHBhdGNoOiIgcHJvbXB0LCB0aGVuIHBhdGNoIGNvdWxkIG5vdAorSWYgcGF0Y2ggc3RvcHMgYW5kIHByZXNlbnRzIGEgYGBGaWxlIHRvIHBhdGNoOmBgIHByb21wdCwgdGhlbiBwYXRjaCBjb3VsZCBub3QKIGZpbmQgYSBmaWxlIHRvIGJlIHBhdGNoZWQuIE1vc3QgbGlrZWx5IHlvdSBmb3Jnb3QgdG8gc3BlY2lmeSAtcDEgb3IgeW91IGFyZQogaW4gdGhlIHdyb25nIGRpcmVjdG9yeS4gTGVzcyBvZnRlbiwgeW91J2xsIGZpbmQgcGF0Y2hlcyB0aGF0IG5lZWQgdG8gYmUKLWFwcGxpZWQgd2l0aCAtcDAgaW5zdGVhZCBvZiAtcDEgKHJlYWRpbmcgdGhlIHBhdGNoIGZpbGUgc2hvdWxkIHJldmVhbCBpZgorYXBwbGllZCB3aXRoIGBgLXAwYGAgaW5zdGVhZCBvZiBgYC1wMWBgIChyZWFkaW5nIHRoZSBwYXRjaCBmaWxlIHNob3VsZCByZXZlYWwgaWYKIHRoaXMgaXMgdGhlIGNhc2UgLS0gaWYgc28sIHRoZW4gdGhpcyBpcyBhbiBlcnJvciBieSB0aGUgcGVyc29uIHdobyBjcmVhdGVkCiB0aGUgcGF0Y2ggYnV0IGlzIG5vdCBmYXRhbCkuCiAKLUlmIHlvdSBnZXQgIkh1bmsgIzIgc3VjY2VlZGVkIGF0IDE4ODcgd2l0aCBmdXp6IDIgKG9mZnNldCA3IGxpbmVzKS4iIG9yIGEKK0lmIHlvdSBnZXQgYGBIdW5rICMyIHN1Y2NlZWRlZCBhdCAxODg3IHdpdGggZnV6eiAyIChvZmZzZXQgNyBsaW5lcykuYGAgb3IgYQogbWVzc2FnZSBzaW1pbGFyIHRvIHRoYXQsIHRoZW4gaXQgbWVhbnMgdGhhdCBwYXRjaCBoYWQgdG8gYWRqdXN0IHRoZSBsb2NhdGlvbgogb2YgdGhlIGNoYW5nZSAoaW4gdGhpcyBleGFtcGxlIGl0IG5lZWRlZCB0byBtb3ZlIDcgbGluZXMgZnJvbSB3aGVyZSBpdAogZXhwZWN0ZWQgdG8gbWFrZSB0aGUgY2hhbmdlIHRvIG1ha2UgaXQgZml0KS4KKwogVGhlIHJlc3VsdGluZyBmaWxlIG1heSBvciBtYXkgbm90IGJlIE9LLCBkZXBlbmRpbmcgb24gdGhlIHJlYXNvbiB0aGUgZmlsZQogd2FzIGRpZmZlcmVudCB0aGFuIGV4cGVjdGVkLgorCiBUaGlzIG9mdGVuIGhhcHBlbnMgaWYgeW91IHRyeSB0byBhcHBseSBhIHBhdGNoIHRoYXQgd2FzIGdlbmVyYXRlZCBhZ2FpbnN0IGEKIGRpZmZlcmVudCBrZXJuZWwgdmVyc2lvbiB0aGFuIHRoZSBvbmUgeW91IGFyZSB0cnlpbmcgdG8gcGF0Y2guCiAKLUlmIHlvdSBnZXQgYSBtZXNzYWdlIGxpa2UgIkh1bmsgIzMgRkFJTEVEIGF0IDIzODcuIiwgdGhlbiBpdCBtZWFucyB0aGF0IHRoZQorSWYgeW91IGdldCBhIG1lc3NhZ2UgbGlrZSBgYEh1bmsgIzMgRkFJTEVEIGF0IDIzODcuYGAsIHRoZW4gaXQgbWVhbnMgdGhhdCB0aGUKIHBhdGNoIGNvdWxkIG5vdCBiZSBhcHBsaWVkIGNvcnJlY3RseSBhbmQgdGhlIHBhdGNoIHByb2dyYW0gd2FzIHVuYWJsZSB0bwotZnV6eiBpdHMgd2F5IHRocm91Z2guIFRoaXMgd2lsbCBnZW5lcmF0ZSBhIC5yZWogZmlsZSB3aXRoIHRoZSBjaGFuZ2UgdGhhdAotY2F1c2VkIHRoZSBwYXRjaCB0byBmYWlsIGFuZCBhbHNvIGEgLm9yaWcgZmlsZSBzaG93aW5nIHlvdSB0aGUgb3JpZ2luYWwKK2Z1enogaXRzIHdheSB0aHJvdWdoLiBUaGlzIHdpbGwgZ2VuZXJhdGUgYSBgYC5yZWpgYCBmaWxlIHdpdGggdGhlIGNoYW5nZSB0aGF0CitjYXVzZWQgdGhlIHBhdGNoIHRvIGZhaWwgYW5kIGFsc28gYSBgYC5vcmlnYGAgZmlsZSBzaG93aW5nIHlvdSB0aGUgb3JpZ2luYWwKIGNvbnRlbnQgdGhhdCBjb3VsZG4ndCBiZSBjaGFuZ2VkLgogCi1JZiB5b3UgZ2V0ICJSZXZlcnNlZCAob3IgcHJldmlvdXNseSBhcHBsaWVkKSBwYXRjaCBkZXRlY3RlZCEgIEFzc3VtZSAtUj8gW25dIgorSWYgeW91IGdldCBgYFJldmVyc2VkIChvciBwcmV2aW91c2x5IGFwcGxpZWQpIHBhdGNoIGRldGVjdGVkISAgQXNzdW1lIC1SPyBbbl1gYAogdGhlbiBwYXRjaCBkZXRlY3RlZCB0aGF0IHRoZSBjaGFuZ2UgY29udGFpbmVkIGluIHRoZSBwYXRjaCBzZWVtcyB0byBoYXZlCiBhbHJlYWR5IGJlZW4gbWFkZS4KKwogSWYgeW91IGFjdHVhbGx5IGRpZCBhcHBseSB0aGlzIHBhdGNoIHByZXZpb3VzbHkgYW5kIHlvdSBqdXN0IHJlLWFwcGxpZWQgaXQKIGluIGVycm9yLCB0aGVuIGp1c3Qgc2F5IFtuXW8gYW5kIGFib3J0IHRoaXMgcGF0Y2guIElmIHlvdSBhcHBsaWVkIHRoaXMgcGF0Y2gKIHByZXZpb3VzbHkgYW5kIGFjdHVhbGx5IGludGVuZGVkIHRvIHJldmVydCBpdCwgYnV0IGZvcmdvdCB0byBzcGVjaWZ5IC1SLAotdGhlbiB5b3UgY2FuIHNheSBbeV1lcyBoZXJlIHRvIG1ha2UgcGF0Y2ggcmV2ZXJ0IGl0IGZvciB5b3UuCit0aGVuIHlvdSBjYW4gc2F5IFsqKnkqKl1lcyBoZXJlIHRvIG1ha2UgcGF0Y2ggcmV2ZXJ0IGl0IGZvciB5b3UuCisKIFRoaXMgY2FuIGFsc28gaGFwcGVuIGlmIHRoZSBjcmVhdG9yIG9mIHRoZSBwYXRjaCByZXZlcnNlZCB0aGUgc291cmNlIGFuZAogZGVzdGluYXRpb24gZGlyZWN0b3JpZXMgd2hlbiBjcmVhdGluZyB0aGUgcGF0Y2gsIGFuZCBpbiB0aGF0IGNhc2UgcmV2ZXJ0aW5nCiB0aGUgcGF0Y2ggd2lsbCBpbiBmYWN0IGFwcGx5IGl0LgogCi1BIG1lc3NhZ2Ugc2ltaWxhciB0byAicGF0Y2g6ICoqKiogdW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBwYXRjaCIgb3IgInBhdGNoCi11bmV4cGVjdGVkbHkgZW5kcyBpbiBtaWRkbGUgb2YgbGluZSIgbWVhbnMgdGhhdCBwYXRjaCBjb3VsZCBtYWtlIG5vIHNlbnNlIG9mCi10aGUgZmlsZSB5b3UgZmVkIHRvIGl0LiBFaXRoZXIgeW91ciBkb3dubG9hZCBpcyBicm9rZW4sIHlvdSB0cmllZCB0byBmZWVkCi1wYXRjaCBhIGNvbXByZXNzZWQgcGF0Y2ggZmlsZSB3aXRob3V0IHVuY29tcHJlc3NpbmcgaXQgZmlyc3QsIG9yIHRoZSBwYXRjaAorQSBtZXNzYWdlIHNpbWlsYXIgdG8gYGBwYXRjaDogKioqKiB1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIHBhdGNoYGAgb3IKK2BgcGF0Y2ggdW5leHBlY3RlZGx5IGVuZHMgaW4gbWlkZGxlIG9mIGxpbmVgYCBtZWFucyB0aGF0IHBhdGNoIGNvdWxkIG1ha2Ugbm8KK3NlbnNlIG9mIHRoZSBmaWxlIHlvdSBmZWQgdG8gaXQuIEVpdGhlciB5b3VyIGRvd25sb2FkIGlzIGJyb2tlbiwgeW91IHRyaWVkIHRvCitmZWVkIHBhdGNoIGEgY29tcHJlc3NlZCBwYXRjaCBmaWxlIHdpdGhvdXQgdW5jb21wcmVzc2luZyBpdCBmaXJzdCwgb3IgdGhlIHBhdGNoCiBmaWxlIHRoYXQgeW91IGFyZSB1c2luZyBoYXMgYmVlbiBtYW5nbGVkIGJ5IGEgbWFpbCBjbGllbnQgb3IgbWFpbCB0cmFuc2ZlcgogYWdlbnQgYWxvbmcgdGhlIHdheSBzb21ld2hlcmUsIGUuZy4sIGJ5IHNwbGl0dGluZyBhIGxvbmcgbGluZSBpbnRvIHR3byBsaW5lcy4KIE9mdGVuIHRoZXNlIHdhcm5pbmdzIGNhbiBlYXNpbHkgYmUgZml4ZWQgYnkgam9pbmluZyAoY29uY2F0ZW5hdGluZykgdGhlCkBAIC0xODIsMjggKzIwNSwzMiBAQAogd2lzaCB0byBhcHBseS4KIAogCi1BcmUgdGhlcmUgYW55IGFsdGVybmF0aXZlcyB0byBgcGF0Y2gnPwotLS0tCi0gWWVzIHRoZXJlIGFyZSBhbHRlcm5hdGl2ZXMuCitBcmUgdGhlcmUgYW55IGFsdGVybmF0aXZlcyB0byBgYHBhdGNoYGA/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLSBZb3UgY2FuIHVzZSB0aGUgYGludGVyZGlmZicgcHJvZ3JhbSAoaHR0cDovL2N5YmVyZWxrLm5ldC90aW0vcGF0Y2h1dGlscy8pIHRvCisKK1llcyB0aGVyZSBhcmUgYWx0ZXJuYXRpdmVzLgorCitZb3UgY2FuIHVzZSB0aGUgYGBpbnRlcmRpZmZgYCBwcm9ncmFtIChodHRwOi8vY3liZXJlbGsubmV0L3RpbS9wYXRjaHV0aWxzLykgdG8KIGdlbmVyYXRlIGEgcGF0Y2ggcmVwcmVzZW50aW5nIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHR3byBwYXRjaGVzIGFuZCB0aGVuCiBhcHBseSB0aGUgcmVzdWx0LgotVGhpcyB3aWxsIGxldCB5b3UgbW92ZSBmcm9tIHNvbWV0aGluZyBsaWtlIDIuNi4xMi4yIHRvIDIuNi4xMi4zIGluIGEgc2luZ2xlCisKK1RoaXMgd2lsbCBsZXQgeW91IG1vdmUgZnJvbSBzb21ldGhpbmcgbGlrZSA0LjcuMiB0byA0LjcuMyBpbiBhIHNpbmdsZQogc3RlcC4gVGhlIC16IGZsYWcgdG8gaW50ZXJkaWZmIHdpbGwgZXZlbiBsZXQgeW91IGZlZWQgaXQgcGF0Y2hlcyBpbiBnemlwIG9yCiBiemlwMiBjb21wcmVzc2VkIGZvcm0gZGlyZWN0bHkgd2l0aG91dCB0aGUgdXNlIG9mIHpjYXQgb3IgYnpjYXQgb3IgbWFudWFsCiBkZWNvbXByZXNzaW9uLgogCi1IZXJlJ3MgaG93IHlvdSdkIGdvIGZyb20gMi42LjEyLjIgdG8gMi42LjEyLjMgaW4gYSBzaW5nbGUgc3RlcDoKLQlpbnRlcmRpZmYgLXogLi4vcGF0Y2gtMi42LjEyLjIuYnoyIC4uL3BhdGNoLTIuNi4xMi4zLmd6IHwgcGF0Y2ggLXAxCitIZXJlJ3MgaG93IHlvdSdkIGdvIGZyb20gNC43LjIgdG8gNC43LjMgaW4gYSBzaW5nbGUgc3RlcDo6CisKKwlpbnRlcmRpZmYgLXogLi4vcGF0Y2gtNC43LjIuZ3ogLi4vcGF0Y2gtNC43LjMuZ3ogfCBwYXRjaCAtcDEKIAogQWx0aG91Z2ggaW50ZXJkaWZmIG1heSBzYXZlIHlvdSBhIHN0ZXAgb3IgdHdvIHlvdSBhcmUgZ2VuZXJhbGx5IGFkdmlzZWQgdG8KIGRvIHRoZSBhZGRpdGlvbmFsIHN0ZXBzIHNpbmNlIGludGVyZGlmZiBjYW4gZ2V0IHRoaW5ncyB3cm9uZyBpbiBzb21lIGNhc2VzLgogCi0gQW5vdGhlciBhbHRlcm5hdGl2ZSBpcyBga2V0Y2h1cCcsIHdoaWNoIGlzIGEgcHl0aG9uIHNjcmlwdCBmb3IgYXV0b21hdGljCitBbm90aGVyIGFsdGVybmF0aXZlIGlzIGBga2V0Y2h1cGBgLCB3aGljaCBpcyBhIHB5dGhvbiBzY3JpcHQgZm9yIGF1dG9tYXRpYwogZG93bmxvYWRpbmcgYW5kIGFwcGx5aW5nIG9mIHBhdGNoZXMgKGh0dHA6Ly93d3cuc2VsZW5pYy5jb20va2V0Y2h1cC8pLgogCi0gT3RoZXIgbmljZSB0b29scyBhcmUgZGlmZnN0YXQsIHdoaWNoIHNob3dzIGEgc3VtbWFyeSBvZiBjaGFuZ2VzIG1hZGUgYnkgYQorT3RoZXIgbmljZSB0b29scyBhcmUgZGlmZnN0YXQsIHdoaWNoIHNob3dzIGEgc3VtbWFyeSBvZiBjaGFuZ2VzIG1hZGUgYnkgYQogcGF0Y2g7IGxzZGlmZiwgd2hpY2ggZGlzcGxheXMgYSBzaG9ydCBsaXN0aW5nIG9mIGFmZmVjdGVkIGZpbGVzIGluIGEgcGF0Y2gKIGZpbGUsIGFsb25nIHdpdGggKG9wdGlvbmFsbHkpIHRoZSBsaW5lIG51bWJlcnMgb2YgdGhlIHN0YXJ0IG9mIGVhY2ggcGF0Y2g7CiBhbmQgZ3JlcGRpZmYsIHdoaWNoIGRpc3BsYXlzIGEgbGlzdCBvZiB0aGUgZmlsZXMgbW9kaWZpZWQgYnkgYSBwYXRjaCB3aGVyZQpAQCAtMjExLDk5ICsyMzgsMTAzIEBACiAKIAogV2hlcmUgY2FuIEkgZG93bmxvYWQgdGhlIHBhdGNoZXM/Ci0tLS0KLSBUaGUgcGF0Y2hlcyBhcmUgYXZhaWxhYmxlIGF0IGh0dHA6Ly9rZXJuZWwub3JnLworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBwYXRjaGVzIGFyZSBhdmFpbGFibGUgYXQgaHR0cDovL2tlcm5lbC5vcmcvCiBNb3N0IHJlY2VudCBwYXRjaGVzIGFyZSBsaW5rZWQgZnJvbSB0aGUgZnJvbnQgcGFnZSwgYnV0IHRoZXkgYWxzbyBoYXZlCiBzcGVjaWZpYyBob21lcy4KIAotVGhlIDIuNi54LnkgKC1zdGFibGUpIGFuZCAyLjYueCBwYXRjaGVzIGxpdmUgYXQKLSBmdHA6Ly9mdHAua2VybmVsLm9yZy9wdWIvbGludXgva2VybmVsL3YyLjYvCitUaGUgNC54LnkgKC1zdGFibGUpIGFuZCA0LnggcGF0Y2hlcyBsaXZlIGF0CisKKwlmdHA6Ly9mdHAua2VybmVsLm9yZy9wdWIvbGludXgva2VybmVsL3Y0LngvCiAKIFRoZSAtcmMgcGF0Y2hlcyBsaXZlIGF0Ci0gZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC92Mi42L3Rlc3RpbmcvCiAKLVRoZSAtZ2l0IHBhdGNoZXMgbGl2ZSBhdAotIGZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvdjIuNi9zbmFwc2hvdHMvCisJZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC92NC54L3Rlc3RpbmcvCiAKLVRoZSAtbW0ga2VybmVscyBsaXZlIGF0Ci0gZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC9wZW9wbGUvYWtwbS9wYXRjaGVzLzIuNi8KLQotSW4gcGxhY2Ugb2YgZnRwLmtlcm5lbC5vcmcgeW91IGNhbiB1c2UgZnRwLmNjLmtlcm5lbC5vcmcsIHdoZXJlIGNjIGlzIGEKK0luIHBsYWNlIG9mIGBgZnRwLmtlcm5lbC5vcmdgYCB5b3UgY2FuIHVzZSBgYGZ0cC5jYy5rZXJuZWwub3JnYGAsIHdoZXJlIGNjIGlzIGEKIGNvdW50cnkgY29kZS4gVGhpcyB3YXkgeW91J2xsIGJlIGRvd25sb2FkaW5nIGZyb20gYSBtaXJyb3Igc2l0ZSB0aGF0J3MgbW9zdAogbGlrZWx5IGdlb2dyYXBoaWNhbGx5IGNsb3NlciB0byB5b3UsIHJlc3VsdGluZyBpbiBmYXN0ZXIgZG93bmxvYWRzIGZvciB5b3UsCiBsZXNzIGJhbmR3aWR0aCB1c2VkIGdsb2JhbGx5IGFuZCBsZXNzIGxvYWQgb24gdGhlIG1haW4ga2VybmVsLm9yZyBzZXJ2ZXJzIC0tCiB0aGVzZSBhcmUgZ29vZCB0aGluZ3MsIHNvIGRvIHVzZSBtaXJyb3JzIHdoZW4gcG9zc2libGUuCiAKIAotVGhlIDIuNi54IGtlcm5lbHMKLS0tLQotIFRoZXNlIGFyZSB0aGUgYmFzZSBzdGFibGUgcmVsZWFzZXMgcmVsZWFzZWQgYnkgTGludXMuIFRoZSBoaWdoZXN0IG51bWJlcmVkCitUaGUgNC54IGtlcm5lbHMKKz09PT09PT09PT09PT09PQorCitUaGVzZSBhcmUgdGhlIGJhc2Ugc3RhYmxlIHJlbGVhc2VzIHJlbGVhc2VkIGJ5IExpbnVzLiBUaGUgaGlnaGVzdCBudW1iZXJlZAogcmVsZWFzZSBpcyB0aGUgbW9zdCByZWNlbnQuCiAKIElmIHJlZ3Jlc3Npb25zIG9yIG90aGVyIHNlcmlvdXMgZmxhd3MgYXJlIGZvdW5kLCB0aGVuIGEgLXN0YWJsZSBmaXggcGF0Y2gKLXdpbGwgYmUgcmVsZWFzZWQgKHNlZSBiZWxvdykgb24gdG9wIG9mIHRoaXMgYmFzZS4gT25jZSBhIG5ldyAyLjYueCBiYXNlCit3aWxsIGJlIHJlbGVhc2VkIChzZWUgYmVsb3cpIG9uIHRvcCBvZiB0aGlzIGJhc2UuIE9uY2UgYSBuZXcgNC54IGJhc2UKIGtlcm5lbCBpcyByZWxlYXNlZCwgYSBwYXRjaCBpcyBtYWRlIGF2YWlsYWJsZSB0aGF0IGlzIGEgZGVsdGEgYmV0d2VlbiB0aGUKLXByZXZpb3VzIDIuNi54IGtlcm5lbCBhbmQgdGhlIG5ldyBvbmUuCitwcmV2aW91cyA0Lngga2VybmVsIGFuZCB0aGUgbmV3IG9uZS4KIAotVG8gYXBwbHkgYSBwYXRjaCBtb3ZpbmcgZnJvbSAyLjYuMTEgdG8gMi42LjEyLCB5b3UnZCBkbyB0aGUgZm9sbG93aW5nIChub3RlCi10aGF0IHN1Y2ggcGF0Y2hlcyBkbyAqTk9UKiBhcHBseSBvbiB0b3Agb2YgMi42LngueSBrZXJuZWxzIGJ1dCBvbiB0b3Agb2YgdGhlCi1iYXNlIDIuNi54IGtlcm5lbCAtLSBpZiB5b3UgbmVlZCB0byBtb3ZlIGZyb20gMi42LngueSB0byAyLjYueCsxIHlvdSBuZWVkIHRvCi1maXJzdCByZXZlcnQgdGhlIDIuNi54LnkgcGF0Y2gpLgorVG8gYXBwbHkgYSBwYXRjaCBtb3ZpbmcgZnJvbSA0LjYgdG8gNC43LCB5b3UnZCBkbyB0aGUgZm9sbG93aW5nIChub3RlCit0aGF0IHN1Y2ggcGF0Y2hlcyBkbyAqKk5PVCoqIGFwcGx5IG9uIHRvcCBvZiA0LngueSBrZXJuZWxzIGJ1dCBvbiB0b3Agb2YgdGhlCitiYXNlIDQueCBrZXJuZWwgLS0gaWYgeW91IG5lZWQgdG8gbW92ZSBmcm9tIDQueC55IHRvIDQueCsxIHlvdSBuZWVkIHRvCitmaXJzdCByZXZlcnQgdGhlIDQueC55IHBhdGNoKS4KIAotSGVyZSBhcmUgc29tZSBleGFtcGxlczoKK0hlcmUgYXJlIHNvbWUgZXhhbXBsZXM6OgogCi0jIG1vdmluZyBmcm9tIDIuNi4xMSB0byAyLjYuMTIKLSQgY2Qgfi9saW51eC0yLjYuMTEJCQkjIGNoYW5nZSB0byBrZXJuZWwgc291cmNlIGRpcgotJCBwYXRjaCAtcDEgPCAuLi9wYXRjaC0yLjYuMTIJCSMgYXBwbHkgdGhlIDIuNi4xMiBwYXRjaAotJCBjZCAuLgotJCBtdiBsaW51eC0yLjYuMTEgbGludXgtMi42LjEyCQkjIHJlbmFtZSBzb3VyY2UgZGlyCisJIyBtb3ZpbmcgZnJvbSA0LjYgdG8gNC43CiAKLSMgbW92aW5nIGZyb20gMi42LjExLjEgdG8gMi42LjEyCi0kIGNkIH4vbGludXgtMi42LjExLjEJCQkjIGNoYW5nZSB0byBrZXJuZWwgc291cmNlIGRpcgotJCBwYXRjaCAtcDEgLVIgPCAuLi9wYXRjaC0yLjYuMTEuMQkjIHJldmVydCB0aGUgMi42LjExLjEgcGF0Y2gKLQkJCQkJIyBzb3VyY2UgZGlyIGlzIG5vdyAyLjYuMTEKLSQgcGF0Y2ggLXAxIDwgLi4vcGF0Y2gtMi42LjEyCQkjIGFwcGx5IG5ldyAyLjYuMTIgcGF0Y2gKLSQgY2QgLi4KLSQgbXYgbGludXgtMi42LjExLjEgbGludXgtMi42LjEyCQkjIHJlbmFtZSBzb3VyY2UgZGlyCisJJCBjZCB+L2xpbnV4LTQuNgkJIyBjaGFuZ2UgdG8ga2VybmVsIHNvdXJjZSBkaXIKKwkkIHBhdGNoIC1wMSA8IC4uL3BhdGNoLTQuNwkjIGFwcGx5IHRoZSA0LjcgcGF0Y2gKKwkkIGNkIC4uCisJJCBtdiBsaW51eC00LjYgbGludXgtNC43CSMgcmVuYW1lIHNvdXJjZSBkaXIKKworCSMgbW92aW5nIGZyb20gNC42LjEgdG8gNC43CisKKwkkIGNkIH4vbGludXgtNC42LjEJCSMgY2hhbmdlIHRvIGtlcm5lbCBzb3VyY2UgZGlyCisJJCBwYXRjaCAtcDEgLVIgPCAuLi9wYXRjaC00LjYuMQkjIHJldmVydCB0aGUgNC42LjEgcGF0Y2gKKwkJCQkJIyBzb3VyY2UgZGlyIGlzIG5vdyA0LjYKKwkkIHBhdGNoIC1wMSA8IC4uL3BhdGNoLTQuNwkjIGFwcGx5IG5ldyA0LjcgcGF0Y2gKKwkkIGNkIC4uCisJJCBtdiBsaW51eC00LjYuMSBsaW51eC00LjcJIyByZW5hbWUgc291cmNlIGRpcgogCiAKLVRoZSAyLjYueC55IGtlcm5lbHMKLS0tLQotIEtlcm5lbHMgd2l0aCA0LWRpZ2l0IHZlcnNpb25zIGFyZSAtc3RhYmxlIGtlcm5lbHMuIFRoZXkgY29udGFpbiBzbWFsbChpc2gpCitUaGUgNC54Lnkga2VybmVscworPT09PT09PT09PT09PT09PT0KKworS2VybmVscyB3aXRoIDMtZGlnaXQgdmVyc2lvbnMgYXJlIC1zdGFibGUga2VybmVscy4gVGhleSBjb250YWluIHNtYWxsKGlzaCkKIGNyaXRpY2FsIGZpeGVzIGZvciBzZWN1cml0eSBwcm9ibGVtcyBvciBzaWduaWZpY2FudCByZWdyZXNzaW9ucyBkaXNjb3ZlcmVkCi1pbiBhIGdpdmVuIDIuNi54IGtlcm5lbC4KK2luIGEgZ2l2ZW4gNC54IGtlcm5lbC4KIAogVGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgYnJhbmNoIGZvciB1c2VycyB3aG8gd2FudCB0aGUgbW9zdCByZWNlbnQgc3RhYmxlCiBrZXJuZWwgYW5kIGFyZSBub3QgaW50ZXJlc3RlZCBpbiBoZWxwaW5nIHRlc3QgZGV2ZWxvcG1lbnQvZXhwZXJpbWVudGFsCiB2ZXJzaW9ucy4KIAotSWYgbm8gMi42LngueSBrZXJuZWwgaXMgYXZhaWxhYmxlLCB0aGVuIHRoZSBoaWdoZXN0IG51bWJlcmVkIDIuNi54IGtlcm5lbCBpcworSWYgbm8gNC54Lnkga2VybmVsIGlzIGF2YWlsYWJsZSwgdGhlbiB0aGUgaGlnaGVzdCBudW1iZXJlZCA0Lngga2VybmVsIGlzCiB0aGUgY3VycmVudCBzdGFibGUga2VybmVsLgogCi0gbm90ZTogdGhlIC1zdGFibGUgdGVhbSB1c3VhbGx5IGRvIG1ha2UgaW5jcmVtZW50YWwgcGF0Y2hlcyBhdmFpbGFibGUgYXMgd2VsbAorLi4gbm90ZTo6CisKKyBUaGUgLXN0YWJsZSB0ZWFtIHVzdWFsbHkgZG8gbWFrZSBpbmNyZW1lbnRhbCBwYXRjaGVzIGF2YWlsYWJsZSBhcyB3ZWxsCiAgYXMgcGF0Y2hlcyBhZ2FpbnN0IHRoZSBsYXRlc3QgbWFpbmxpbmUgcmVsZWFzZSwgYnV0IEkgb25seSBjb3ZlciB0aGUKICBub24taW5jcmVtZW50YWwgb25lcyBiZWxvdy4gVGhlIGluY3JlbWVudGFsIG9uZXMgY2FuIGJlIGZvdW5kIGF0Ci0gZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC92Mi42L2luY3IvCisgZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC92NC54L2luY3IvCiAKLVRoZXNlIHBhdGNoZXMgYXJlIG5vdCBpbmNyZW1lbnRhbCwgbWVhbmluZyB0aGF0IGZvciBleGFtcGxlIHRoZSAyLjYuMTIuMwotcGF0Y2ggZG9lcyBub3QgYXBwbHkgb24gdG9wIG9mIHRoZSAyLjYuMTIuMiBrZXJuZWwgc291cmNlLCBidXQgcmF0aGVyIG9uIHRvcAotb2YgdGhlIGJhc2UgMi42LjEyIGtlcm5lbCBzb3VyY2UgLgotU28sIGluIG9yZGVyIHRvIGFwcGx5IHRoZSAyLjYuMTIuMyBwYXRjaCB0byB5b3VyIGV4aXN0aW5nIDIuNi4xMi4yIGtlcm5lbAotc291cmNlIHlvdSBoYXZlIHRvIGZpcnN0IGJhY2sgb3V0IHRoZSAyLjYuMTIuMiBwYXRjaCAoc28geW91IGFyZSBsZWZ0IHdpdGggYQotYmFzZSAyLjYuMTIga2VybmVsIHNvdXJjZSkgYW5kIHRoZW4gYXBwbHkgdGhlIG5ldyAyLjYuMTIuMyBwYXRjaC4KK1RoZXNlIHBhdGNoZXMgYXJlIG5vdCBpbmNyZW1lbnRhbCwgbWVhbmluZyB0aGF0IGZvciBleGFtcGxlIHRoZSA0LjcuMworcGF0Y2ggZG9lcyBub3QgYXBwbHkgb24gdG9wIG9mIHRoZSA0LjcuMiBrZXJuZWwgc291cmNlLCBidXQgcmF0aGVyIG9uIHRvcAorb2YgdGhlIGJhc2UgNC43IGtlcm5lbCBzb3VyY2UuCiAKLUhlcmUncyBhIHNtYWxsIGV4YW1wbGU6CitTbywgaW4gb3JkZXIgdG8gYXBwbHkgdGhlIDQuNy4zIHBhdGNoIHRvIHlvdXIgZXhpc3RpbmcgNC43LjIga2VybmVsCitzb3VyY2UgeW91IGhhdmUgdG8gZmlyc3QgYmFjayBvdXQgdGhlIDQuNy4yIHBhdGNoIChzbyB5b3UgYXJlIGxlZnQgd2l0aCBhCitiYXNlIDQuNyBrZXJuZWwgc291cmNlKSBhbmQgdGhlbiBhcHBseSB0aGUgbmV3IDQuNy4zIHBhdGNoLgogCi0kIGNkIH4vbGludXgtMi42LjEyLjIJCQkjIGNoYW5nZSBpbnRvIHRoZSBrZXJuZWwgc291cmNlIGRpcgotJCBwYXRjaCAtcDEgLVIgPCAuLi9wYXRjaC0yLjYuMTIuMgkjIHJldmVydCB0aGUgMi42LjEyLjIgcGF0Y2gKLSQgcGF0Y2ggLXAxIDwgLi4vcGF0Y2gtMi42LjEyLjMJCSMgYXBwbHkgdGhlIG5ldyAyLjYuMTIuMyBwYXRjaAotJCBjZCAuLgotJCBtdiBsaW51eC0yLjYuMTIuMiBsaW51eC0yLjYuMTIuMwkjIHJlbmFtZSB0aGUga2VybmVsIHNvdXJjZSBkaXIKK0hlcmUncyBhIHNtYWxsIGV4YW1wbGU6OgogCisJJCBjZCB+L2xpbnV4LTQuNy4yCQkjIGNoYW5nZSB0byB0aGUga2VybmVsIHNvdXJjZSBkaXIKKwkkIHBhdGNoIC1wMSAtUiA8IC4uL3BhdGNoLTQuNy4yCSMgcmV2ZXJ0IHRoZSA0LjcuMiBwYXRjaAorCSQgcGF0Y2ggLXAxIDwgLi4vcGF0Y2gtNC43LjMJIyBhcHBseSB0aGUgbmV3IDQuNy4zIHBhdGNoCisJJCBjZCAuLgorCSQgbXYgbGludXgtNC43LjIgbGludXgtNC43LjMJIyByZW5hbWUgdGhlIGtlcm5lbCBzb3VyY2UgZGlyCiAKIFRoZSAtcmMga2VybmVscwotLS0tCi0gVGhlc2UgYXJlIHJlbGVhc2UtY2FuZGlkYXRlIGtlcm5lbHMuIFRoZXNlIGFyZSBkZXZlbG9wbWVudCBrZXJuZWxzIHJlbGVhc2VkCis9PT09PT09PT09PT09PT0KKworVGhlc2UgYXJlIHJlbGVhc2UtY2FuZGlkYXRlIGtlcm5lbHMuIFRoZXNlIGFyZSBkZXZlbG9wbWVudCBrZXJuZWxzIHJlbGVhc2VkCiBieSBMaW51cyB3aGVuZXZlciBoZSBkZWVtcyB0aGUgY3VycmVudCBnaXQgKHRoZSBrZXJuZWwncyBzb3VyY2UgbWFuYWdlbWVudAogdG9vbCkgdHJlZSB0byBiZSBpbiBhIHJlYXNvbmFibHkgc2FuZSBzdGF0ZSBhZGVxdWF0ZSBmb3IgdGVzdGluZy4KIApAQCAtMzE3LDM5ICszNDgsNDQgQEAKIGRldmVsb3BtZW50IGtlcm5lbHMgYnV0IGRvIG5vdCB3YW50IHRvIHJ1biBzb21lIG9mIHRoZSByZWFsbHkgZXhwZXJpbWVudGFsCiBzdHVmZiAoc3VjaCBwZW9wbGUgc2hvdWxkIHNlZSB0aGUgc2VjdGlvbnMgYWJvdXQgLWdpdCBhbmQgLW1tIGtlcm5lbHMgYmVsb3cpLgogCi1UaGUgLXJjIHBhdGNoZXMgYXJlIG5vdCBpbmNyZW1lbnRhbCwgdGhleSBhcHBseSB0byBhIGJhc2UgMi42Lngga2VybmVsLCBqdXN0Ci1saWtlIHRoZSAyLjYueC55IHBhdGNoZXMgZGVzY3JpYmVkIGFib3ZlLiBUaGUga2VybmVsIHZlcnNpb24gYmVmb3JlIHRoZSAtcmNOCitUaGUgLXJjIHBhdGNoZXMgYXJlIG5vdCBpbmNyZW1lbnRhbCwgdGhleSBhcHBseSB0byBhIGJhc2UgNC54IGtlcm5lbCwganVzdAorbGlrZSB0aGUgNC54LnkgcGF0Y2hlcyBkZXNjcmliZWQgYWJvdmUuIFRoZSBrZXJuZWwgdmVyc2lvbiBiZWZvcmUgdGhlIC1yY04KIHN1ZmZpeCBkZW5vdGVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBrZXJuZWwgdGhhdCB0aGlzIC1yYyBrZXJuZWwgd2lsbCBldmVudHVhbGx5CiB0dXJuIGludG8uCi1TbywgMi42LjEzLXJjNSBtZWFucyB0aGF0IHRoaXMgaXMgdGhlIGZpZnRoIHJlbGVhc2UgY2FuZGlkYXRlIGZvciB0aGUgMi42LjEzCi1rZXJuZWwgYW5kIHRoZSBwYXRjaCBzaG91bGQgYmUgYXBwbGllZCBvbiB0b3Agb2YgdGhlIDIuNi4xMiBrZXJuZWwgc291cmNlLgogCi1IZXJlIGFyZSAzIGV4YW1wbGVzIG9mIGhvdyB0byBhcHBseSB0aGVzZSBwYXRjaGVzOgorU28sIDQuOC1yYzUgbWVhbnMgdGhhdCB0aGlzIGlzIHRoZSBmaWZ0aCByZWxlYXNlIGNhbmRpZGF0ZSBmb3IgdGhlIDQuOAora2VybmVsIGFuZCB0aGUgcGF0Y2ggc2hvdWxkIGJlIGFwcGxpZWQgb24gdG9wIG9mIHRoZSA0Ljcga2VybmVsIHNvdXJjZS4KIAotIyBmaXJzdCBhbiBleGFtcGxlIG9mIG1vdmluZyBmcm9tIDIuNi4xMiB0byAyLjYuMTMtcmMzCi0kIGNkIH4vbGludXgtMi42LjEyCQkJIyBjaGFuZ2UgaW50byB0aGUgMi42LjEyIHNvdXJjZSBkaXIKLSQgcGF0Y2ggLXAxIDwgLi4vcGF0Y2gtMi42LjEzLXJjMwkjIGFwcGx5IHRoZSAyLjYuMTMtcmMzIHBhdGNoCi0kIGNkIC4uCi0kIG12IGxpbnV4LTIuNi4xMiBsaW51eC0yLjYuMTMtcmMzCSMgcmVuYW1lIHRoZSBzb3VyY2UgZGlyCitIZXJlIGFyZSAzIGV4YW1wbGVzIG9mIGhvdyB0byBhcHBseSB0aGVzZSBwYXRjaGVzOjoKIAotIyBub3cgbGV0J3MgbW92ZSBmcm9tIDIuNi4xMy1yYzMgdG8gMi42LjEzLXJjNQotJCBjZCB+L2xpbnV4LTIuNi4xMy1yYzMJCQkjIGNoYW5nZSBpbnRvIHRoZSAyLjYuMTMtcmMzIGRpcgotJCBwYXRjaCAtcDEgLVIgPCAuLi9wYXRjaC0yLjYuMTMtcmMzCSMgcmV2ZXJ0IHRoZSAyLjYuMTMtcmMzIHBhdGNoCi0kIHBhdGNoIC1wMSA8IC4uL3BhdGNoLTIuNi4xMy1yYzUJIyBhcHBseSB0aGUgbmV3IDIuNi4xMy1yYzUgcGF0Y2gKLSQgY2QgLi4KLSQgbXYgbGludXgtMi42LjEzLXJjMyBsaW51eC0yLjYuMTMtcmM1CSMgcmVuYW1lIHRoZSBzb3VyY2UgZGlyCisJIyBmaXJzdCBhbiBleGFtcGxlIG9mIG1vdmluZyBmcm9tIDQuNyB0byA0LjgtcmMzCiAKLSMgZmluYWxseSBsZXQncyB0cnkgYW5kIG1vdmUgZnJvbSAyLjYuMTIuMyB0byAyLjYuMTMtcmM1Ci0kIGNkIH4vbGludXgtMi42LjEyLjMJCQkjIGNoYW5nZSB0byB0aGUga2VybmVsIHNvdXJjZSBkaXIKLSQgcGF0Y2ggLXAxIC1SIDwgLi4vcGF0Y2gtMi42LjEyLjMJIyByZXZlcnQgdGhlIDIuNi4xMi4zIHBhdGNoCi0kIHBhdGNoIC1wMSA8IC4uL3BhdGNoLTIuNi4xMy1yYzUJIyBhcHBseSBuZXcgMi42LjEzLXJjNSBwYXRjaAotJCBjZCAuLgotJCBtdiBsaW51eC0yLjYuMTIuMyBsaW51eC0yLjYuMTMtcmM1CSMgcmVuYW1lIHRoZSBrZXJuZWwgc291cmNlIGRpcgorCSQgY2Qgfi9saW51eC00LjcJCQkjIGNoYW5nZSB0byB0aGUgNC43IHNvdXJjZSBkaXIKKwkkIHBhdGNoIC1wMSA8IC4uL3BhdGNoLTQuOC1yYzMJCSMgYXBwbHkgdGhlIDQuOC1yYzMgcGF0Y2gKKwkkIGNkIC4uCisJJCBtdiBsaW51eC00LjcgbGludXgtNC44LXJjMwkJIyByZW5hbWUgdGhlIHNvdXJjZSBkaXIKKworCSMgbm93IGxldCdzIG1vdmUgZnJvbSA0LjgtcmMzIHRvIDQuOC1yYzUKKworCSQgY2Qgfi9saW51eC00LjgtcmMzCQkJIyBjaGFuZ2UgdG8gdGhlIDQuOC1yYzMgZGlyCisJJCBwYXRjaCAtcDEgLVIgPCAuLi9wYXRjaC00LjgtcmMzCSMgcmV2ZXJ0IHRoZSA0LjgtcmMzIHBhdGNoCisJJCBwYXRjaCAtcDEgPCAuLi9wYXRjaC00LjgtcmM1CQkjIGFwcGx5IHRoZSBuZXcgNC44LXJjNSBwYXRjaAorCSQgY2QgLi4KKwkkIG12IGxpbnV4LTQuOC1yYzMgbGludXgtNC44LXJjNQkjIHJlbmFtZSB0aGUgc291cmNlIGRpcgorCisJIyBmaW5hbGx5IGxldCdzIHRyeSBhbmQgbW92ZSBmcm9tIDQuNy4zIHRvIDQuOC1yYzUKKworCSQgY2Qgfi9saW51eC00LjcuMwkJCSMgY2hhbmdlIHRvIHRoZSBrZXJuZWwgc291cmNlIGRpcgorCSQgcGF0Y2ggLXAxIC1SIDwgLi4vcGF0Y2gtNC43LjMJCSMgcmV2ZXJ0IHRoZSA0LjcuMyBwYXRjaAorCSQgcGF0Y2ggLXAxIDwgLi4vcGF0Y2gtNC44LXJjNQkJIyBhcHBseSBuZXcgNC44LXJjNSBwYXRjaAorCSQgY2QgLi4KKwkkIG12IGxpbnV4LTQuNy4zIGxpbnV4LTQuOC1yYzUJCSMgcmVuYW1lIHRoZSBrZXJuZWwgc291cmNlIGRpcgogCiAKIFRoZSAtZ2l0IGtlcm5lbHMKLS0tLQotIFRoZXNlIGFyZSBkYWlseSBzbmFwc2hvdHMgb2YgTGludXMnIGtlcm5lbCB0cmVlIChtYW5hZ2VkIGluIGEgZ2l0Cis9PT09PT09PT09PT09PT09CisKK1RoZXNlIGFyZSBkYWlseSBzbmFwc2hvdHMgb2YgTGludXMnIGtlcm5lbCB0cmVlIChtYW5hZ2VkIGluIGEgZ2l0CiByZXBvc2l0b3J5LCBoZW5jZSB0aGUgbmFtZSkuCiAKIFRoZXNlIHBhdGNoZXMgYXJlIHVzdWFsbHkgcmVsZWFzZWQgZGFpbHkgYW5kIHJlcHJlc2VudCB0aGUgY3VycmVudCBzdGF0ZSBvZgpAQCAtMzU3LDkxICszOTMsNjYgQEAKIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHdpdGhvdXQgZXZlbiBhIGN1cnNvcnkgZ2xhbmNlIHRvIHNlZSBpZiB0aGV5IGFyZQogc2FuZS4KIAotLWdpdCBwYXRjaGVzIGFyZSBub3QgaW5jcmVtZW50YWwgYW5kIGFwcGx5IGVpdGhlciB0byBhIGJhc2UgMi42Lngga2VybmVsIG9yCi1hIGJhc2UgMi42LngtcmMga2VybmVsIC0tIHlvdSBjYW4gc2VlIHdoaWNoIGZyb20gdGhlaXIgbmFtZS4KLUEgcGF0Y2ggbmFtZWQgMi42LjEyLWdpdDEgYXBwbGllcyB0byB0aGUgMi42LjEyIGtlcm5lbCBzb3VyY2UgYW5kIGEgcGF0Y2gKLW5hbWVkIDIuNi4xMy1yYzMtZ2l0MiBhcHBsaWVzIHRvIHRoZSBzb3VyY2Ugb2YgdGhlIDIuNi4xMy1yYzMga2VybmVsLgorLWdpdCBwYXRjaGVzIGFyZSBub3QgaW5jcmVtZW50YWwgYW5kIGFwcGx5IGVpdGhlciB0byBhIGJhc2UgNC54IGtlcm5lbCBvcgorYSBiYXNlIDQueC1yYyBrZXJuZWwgLS0geW91IGNhbiBzZWUgd2hpY2ggZnJvbSB0aGVpciBuYW1lLgorQSBwYXRjaCBuYW1lZCA0LjctZ2l0MSBhcHBsaWVzIHRvIHRoZSA0Ljcga2VybmVsIHNvdXJjZSBhbmQgYSBwYXRjaAorbmFtZWQgNC44LXJjMy1naXQyIGFwcGxpZXMgdG8gdGhlIHNvdXJjZSBvZiB0aGUgNC44LXJjMyBrZXJuZWwuCiAKLUhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgaG93IHRvIGFwcGx5IHRoZXNlIHBhdGNoZXM6CitIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIGhvdyB0byBhcHBseSB0aGVzZSBwYXRjaGVzOjoKIAotIyBtb3ZpbmcgZnJvbSAyLjYuMTIgdG8gMi42LjEyLWdpdDEKLSQgY2Qgfi9saW51eC0yLjYuMTIJCQkjIGNoYW5nZSB0byB0aGUga2VybmVsIHNvdXJjZSBkaXIKLSQgcGF0Y2ggLXAxIDwgLi4vcGF0Y2gtMi42LjEyLWdpdDEJIyBhcHBseSB0aGUgMi42LjEyLWdpdDEgcGF0Y2gKLSQgY2QgLi4KLSQgbXYgbGludXgtMi42LjEyIGxpbnV4LTIuNi4xMi1naXQxCSMgcmVuYW1lIHRoZSBrZXJuZWwgc291cmNlIGRpcgorCSMgbW92aW5nIGZyb20gNC43IHRvIDQuNy1naXQxCiAKLSMgbW92aW5nIGZyb20gMi42LjEyLWdpdDEgdG8gMi42LjEzLXJjMi1naXQzCi0kIGNkIH4vbGludXgtMi42LjEyLWdpdDEJCSMgY2hhbmdlIHRvIHRoZSBrZXJuZWwgc291cmNlIGRpcgotJCBwYXRjaCAtcDEgLVIgPCAuLi9wYXRjaC0yLjYuMTItZ2l0MQkjIHJldmVydCB0aGUgMi42LjEyLWdpdDEgcGF0Y2gKLQkJCQkJIyB3ZSBub3cgaGF2ZSBhIDIuNi4xMiBrZXJuZWwKLSQgcGF0Y2ggLXAxIDwgLi4vcGF0Y2gtMi42LjEzLXJjMgkjIGFwcGx5IHRoZSAyLjYuMTMtcmMyIHBhdGNoCi0JCQkJCSMgdGhlIGtlcm5lbCBpcyBub3cgMi42LjEzLXJjMgotJCBwYXRjaCAtcDEgPCAuLi9wYXRjaC0yLjYuMTMtcmMyLWdpdDMJIyBhcHBseSB0aGUgMi42LjEzLXJjMi1naXQzIHBhdGNoCi0JCQkJCSMgdGhlIGtlcm5lbCBpcyBub3cgMi42LjEzLXJjMi1naXQzCi0kIGNkIC4uCi0kIG12IGxpbnV4LTIuNi4xMi1naXQxIGxpbnV4LTIuNi4xMy1yYzItZ2l0MwkjIHJlbmFtZSBzb3VyY2UgZGlyCisJJCBjZCB+L2xpbnV4LTQuNwkJCSMgY2hhbmdlIHRvIHRoZSBrZXJuZWwgc291cmNlIGRpcgorCSQgcGF0Y2ggLXAxIDwgLi4vcGF0Y2gtNC43LWdpdDEJCSMgYXBwbHkgdGhlIDQuNy1naXQxIHBhdGNoCisJJCBjZCAuLgorCSQgbXYgbGludXgtNC43IGxpbnV4LTQuNy1naXQxCQkjIHJlbmFtZSB0aGUga2VybmVsIHNvdXJjZSBkaXIKKworCSMgbW92aW5nIGZyb20gNC43LWdpdDEgdG8gNC44LXJjMi1naXQzCisKKwkkIGNkIH4vbGludXgtNC43LWdpdDEJCQkjIGNoYW5nZSB0byB0aGUga2VybmVsIHNvdXJjZSBkaXIKKwkkIHBhdGNoIC1wMSAtUiA8IC4uL3BhdGNoLTQuNy1naXQxCSMgcmV2ZXJ0IHRoZSA0LjctZ2l0MSBwYXRjaAorCQkJCQkJIyB3ZSBub3cgaGF2ZSBhIDQuNyBrZXJuZWwKKwkkIHBhdGNoIC1wMSA8IC4uL3BhdGNoLTQuOC1yYzIJCSMgYXBwbHkgdGhlIDQuOC1yYzIgcGF0Y2gKKwkJCQkJCSMgdGhlIGtlcm5lbCBpcyBub3cgNC44LXJjMgorCSQgcGF0Y2ggLXAxIDwgLi4vcGF0Y2gtNC44LXJjMi1naXQzCSMgYXBwbHkgdGhlIDQuOC1yYzItZ2l0MyBwYXRjaAorCQkJCQkJIyB0aGUga2VybmVsIGlzIG5vdyA0LjgtcmMyLWdpdDMKKwkkIGNkIC4uCisJJCBtdiBsaW51eC00LjctZ2l0MSBsaW51eC00LjgtcmMyLWdpdDMJIyByZW5hbWUgc291cmNlIGRpcgogCiAKLVRoZSAtbW0ga2VybmVscwotLS0tCi0gVGhlc2UgYXJlIGV4cGVyaW1lbnRhbCBrZXJuZWxzIHJlbGVhc2VkIGJ5IEFuZHJldyBNb3J0b24uCitUaGUgLW1tIHBhdGNoZXMgYW5kIHRoZSBsaW51eC1uZXh0IHRyZWUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1UaGUgLW1tIHRyZWUgc2VydmVzIGFzIGEgc29ydCBvZiBwcm92aW5nIGdyb3VuZCBmb3IgbmV3IGZlYXR1cmVzIGFuZCBvdGhlcgotZXhwZXJpbWVudGFsIHBhdGNoZXMuCi1PbmNlIGEgcGF0Y2ggaGFzIHByb3ZlZCBpdHMgd29ydGggaW4gLW1tIGZvciBhIHdoaWxlIEFuZHJldyBwdXNoZXMgaXQgb24gdG8KLUxpbnVzIGZvciBpbmNsdXNpb24gaW4gbWFpbmxpbmUuCitUaGUgLW1tIHBhdGNoZXMgYXJlIGV4cGVyaW1lbnRhbCBwYXRjaGVzIHJlbGVhc2VkIGJ5IEFuZHJldyBNb3J0b24uCiAKLUFsdGhvdWdoIGl0J3MgZW5jb3VyYWdlZCB0aGF0IHBhdGNoZXMgZmxvdyB0byBMaW51cyB2aWEgdGhlIC1tbSB0cmVlLCB0aGlzCi1pcyBub3QgYWx3YXlzIGVuZm9yY2VkLgotU3Vic3lzdGVtIG1haW50YWluZXJzIChvciBpbmRpdmlkdWFscykgc29tZXRpbWVzIHB1c2ggdGhlaXIgcGF0Y2hlcyBkaXJlY3RseQotdG8gTGludXMsIGV2ZW4gdGhvdWdoIChvciBhZnRlcikgdGhleSBoYXZlIGJlZW4gbWVyZ2VkIGFuZCB0ZXN0ZWQgaW4gLW1tIChvcgotc29tZXRpbWVzIGV2ZW4gd2l0aG91dCBwcmlvciB0ZXN0aW5nIGluIC1tbSkuCitJbiB0aGUgcGFzdCwgLW1tIHRyZWUgd2VyZSB1c2VkIHRvIGFsc28gdGVzdCBzdWJzeXN0ZW0gcGF0Y2hlcywgYnV0IHRoaXMKK2Z1bmN0aW9uIGlzIG5vdyBkb25lIHZpYSB0aGUKKzpyZWY6YGxpbnV4LW5leHQgPGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL21hbi1wYWdlcy9saW51eC1uZXh0Lmh0bWw+YAordHJlZS4gVGhlIFN1YnN5c3RlbSBtYWludGFpbmVycyBwdXNoIHRoZWlyIHBhdGNoZXMgZmlyc3QgdG8gbGludXgtbmV4dCwKK2FuZCwgZHVyaW5nIHRoZSBtZXJnZSB3aW5kb3csIHNlbmRzIHRoZW0gZGlyZWN0bHkgdG8gTGludXMuCiAKLVlvdSBzaG91bGQgZ2VuZXJhbGx5IHN0cml2ZSB0byBnZXQgeW91ciBwYXRjaGVzIGludG8gbWFpbmxpbmUgdmlhIC1tbSB0bwotZW5zdXJlIG1heGltdW0gdGVzdGluZy4KK1RoZSAtbW0gcGF0Y2hlcyBzZXJ2ZSBhcyBhIHNvcnQgb2YgcHJvdmluZyBncm91bmQgZm9yIG5ldyBmZWF0dXJlcyBhbmQgb3RoZXIKK2V4cGVyaW1lbnRhbCBwYXRjaGVzIHRoYXQgYXJlbid0IG1lcmdlZCB2aWEgYSBzdWJzeXN0ZW0gdHJlZS4KK09uY2Ugc3VjaCBwYXRjaGVzIGhhcyBwcm92ZWQgaXRzIHdvcnRoIGluIC1tbSBmb3IgYSB3aGlsZSBBbmRyZXcgcHVzaGVzCitpdCBvbiB0byBMaW51cyBmb3IgaW5jbHVzaW9uIGluIG1haW5saW5lLgogCi1UaGlzIGJyYW5jaCBpcyBpbiBjb25zdGFudCBmbHV4IGFuZCBjb250YWlucyBtYW55IGV4cGVyaW1lbnRhbCBmZWF0dXJlcywgYQorVGhlIGxpbnV4LW5leHQgdHJlZSBpcyBkYWlseSB1cGRhdGVkLCBhbmQgaW5jbHVkZXMgdGhlIC1tbSBwYXRjaGVzLgorQm90aCBhcmUgaW4gY29uc3RhbnQgZmx1eCBhbmQgY29udGFpbnMgbWFueSBleHBlcmltZW50YWwgZmVhdHVyZXMsIGEKIGxvdCBvZiBkZWJ1Z2dpbmcgcGF0Y2hlcyBub3QgYXBwcm9wcmlhdGUgZm9yIG1haW5saW5lIGV0Yy4sIGFuZCBpcyB0aGUgbW9zdAogZXhwZXJpbWVudGFsIG9mIHRoZSBicmFuY2hlcyBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4KIAotVGhlc2Uga2VybmVscyBhcmUgbm90IGFwcHJvcHJpYXRlIGZvciB1c2Ugb24gc3lzdGVtcyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZQorVGhlc2UgcGF0Y2hlcyBhcmUgbm90IGFwcHJvcHJpYXRlIGZvciB1c2Ugb24gc3lzdGVtcyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZQogc3RhYmxlIGFuZCB0aGV5IGFyZSBtb3JlIHJpc2t5IHRvIHJ1biB0aGFuIGFueSBvZiB0aGUgb3RoZXIgYnJhbmNoZXMgKG1ha2UKIHN1cmUgeW91IGhhdmUgdXAtdG8tZGF0ZSBiYWNrdXBzIC0tIHRoYXQgZ29lcyBmb3IgYW55IGV4cGVyaW1lbnRhbCBrZXJuZWwgYnV0Ci1ldmVuIG1vcmUgc28gZm9yIC1tbSBrZXJuZWxzKS4KK2V2ZW4gbW9yZSBzbyBmb3IgLW1tIHBhdGNoZXMgb3IgdXNpbmcgYSBLZXJuZWwgZnJvbSB0aGUgbGludXgtbmV4dCB0cmVlKS4KIAotVGhlc2Uga2VybmVscyBpbiBhZGRpdGlvbiB0byBhbGwgdGhlIG90aGVyIGV4cGVyaW1lbnRhbCBwYXRjaGVzIHRoZXkgY29udGFpbgotdXN1YWxseSBhbHNvIGNvbnRhaW4gYW55IGNoYW5nZXMgaW4gdGhlIG1haW5saW5lIC1naXQga2VybmVscyBhdmFpbGFibGUgYXQKLXRoZSB0aW1lIG9mIHJlbGVhc2UuCitUZXN0aW5nIG9mIC1tbSBwYXRjaGVzIGFuZCBsaW51eC1uZXh0IGlzIGdyZWF0bHkgYXBwcmVjaWF0ZWQgc2luY2UgdGhlIHdob2xlCitwb2ludCBvZiB0aG9zZSBhcmUgdG8gd2VlZCBvdXQgcmVncmVzc2lvbnMsIGNyYXNoZXMsIGRhdGEgY29ycnVwdGlvbiBidWdzLAorYnVpbGQgYnJlYWthZ2UgKGFuZCBhbnkgb3RoZXIgYnVnIGluIGdlbmVyYWwpIGJlZm9yZSBjaGFuZ2VzIGFyZSBtZXJnZWQgaW50bwordGhlIG1vcmUgc3RhYmxlIG1haW5saW5lIExpbnVzIHRyZWUuCiAKLVRlc3Rpbmcgb2YgLW1tIGtlcm5lbHMgaXMgZ3JlYXRseSBhcHByZWNpYXRlZCBzaW5jZSB0aGUgd2hvbGUgcG9pbnQgb2YgdGhlCi10cmVlIGlzIHRvIHdlZWQgb3V0IHJlZ3Jlc3Npb25zLCBjcmFzaGVzLCBkYXRhIGNvcnJ1cHRpb24gYnVncywgYnVpbGQKLWJyZWFrYWdlIChhbmQgYW55IG90aGVyIGJ1ZyBpbiBnZW5lcmFsKSBiZWZvcmUgY2hhbmdlcyBhcmUgbWVyZ2VkIGludG8gdGhlCi1tb3JlIHN0YWJsZSBtYWlubGluZSBMaW51cyB0cmVlLgotQnV0IHRlc3RlcnMgb2YgLW1tIHNob3VsZCBiZSBhd2FyZSB0aGF0IGJyZWFrYWdlIGluIHRoaXMgdHJlZSBpcyBtb3JlIGNvbW1vbgotdGhhbiBpbiBhbnkgb3RoZXIgdHJlZS4KLQotVGhlIC1tbSBrZXJuZWxzIGFyZSBub3QgcmVsZWFzZWQgb24gYSBmaXhlZCBzY2hlZHVsZSwgYnV0IHVzdWFsbHkgYSBmZXcgLW1tCi1rZXJuZWxzIGFyZSByZWxlYXNlZCBpbiBiZXR3ZWVuIGVhY2ggLXJjIGtlcm5lbCAoMSB0byAzIGlzIGNvbW1vbikuCi1UaGUgLW1tIGtlcm5lbHMgYXBwbHkgdG8gZWl0aGVyIGEgYmFzZSAyLjYueCBrZXJuZWwgKHdoZW4gbm8gLXJjIGtlcm5lbHMKLWhhdmUgYmVlbiByZWxlYXNlZCB5ZXQpIG9yIHRvIGEgTGludXMgLXJjIGtlcm5lbC4KLQotSGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiBhcHBseWluZyB0aGUgLW1tIHBhdGNoZXM6Ci0KLSMgbW92aW5nIGZyb20gMi42LjEyIHRvIDIuNi4xMi1tbTEKLSQgY2Qgfi9saW51eC0yLjYuMTIJCQkjIGNoYW5nZSB0byB0aGUgMi42LjEyIHNvdXJjZSBkaXIKLSQgcGF0Y2ggLXAxIDwgLi4vMi42LjEyLW1tMQkJIyBhcHBseSB0aGUgMi42LjEyLW1tMSBwYXRjaAotJCBjZCAuLgotJCBtdiBsaW51eC0yLjYuMTIgbGludXgtMi42LjEyLW1tMQkjIHJlbmFtZSB0aGUgc291cmNlIGFwcHJvcHJpYXRlbHkKLQotIyBtb3ZpbmcgZnJvbSAyLjYuMTItbW0xIHRvIDIuNi4xMy1yYzMtbW0zCi0kIGNkIH4vbGludXgtMi42LjEyLW1tMQotJCBwYXRjaCAtcDEgLVIgPCAuLi8yLjYuMTItbW0xCQkjIHJldmVydCB0aGUgMi42LjEyLW1tMSBwYXRjaAotCQkJCQkjIHdlIG5vdyBoYXZlIGEgMi42LjEyIHNvdXJjZQotJCBwYXRjaCAtcDEgPCAuLi9wYXRjaC0yLjYuMTMtcmMzCSMgYXBwbHkgdGhlIDIuNi4xMy1yYzMgcGF0Y2gKLQkJCQkJIyB3ZSBub3cgaGF2ZSBhIDIuNi4xMy1yYzMgc291cmNlCi0kIHBhdGNoIC1wMSA8IC4uLzIuNi4xMy1yYzMtbW0zCQkjIGFwcGx5IHRoZSAyLjYuMTMtcmMzLW1tMyBwYXRjaAotJCBjZCAuLgotJCBtdiBsaW51eC0yLjYuMTItbW0xIGxpbnV4LTIuNi4xMy1yYzMtbW0zCSMgcmVuYW1lIHRoZSBzb3VyY2UgZGlyCitCdXQgdGVzdGVycyBvZiAtbW0gYW5kIGxpbnV4LW5leHQgc2hvdWxkIGJlIGF3YXJlIHRoYXQgYnJlYWthZ2VzIGFyZQorbW9yZSBjb21tb24gdGhhbiBpbiBhbnkgb3RoZXIgdHJlZS4KIAogCiBUaGlzIGNvbmNsdWRlcyB0aGlzIGxpc3Qgb2YgZXhwbGFuYXRpb25zIG9mIHRoZSB2YXJpb3VzIGtlcm5lbCB0cmVlcy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYXJtL0NDTi50eHQgYi9Eb2N1bWVudGF0aW9uL2FybS9DQ04udHh0CmluZGV4IGZmY2E0NDMuLjE1Y2RiN2IgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYXJtL0NDTi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9hcm0vQ0NOLnR4dApAQCAtMTgsMTMgKzE4LDE3IEBACiBkaXJlY3RvcnkgcHJvdmlkZXMgY29uZmlndXJhdGlvbiB0ZW1wbGF0ZXMgZm9yIGFsbCBkb2N1bWVudGVkCiBldmVudHMsIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBwZXJmIHRvb2wuIEZvciBleGFtcGxlICJ4cF92YWxpZF9mbGl0IgogaXMgYW4gZXF1aXZhbGVudCBvZiAidHlwZT0weDgsZXZlbnQ9MHg0Ii4gT3RoZXIgcGFyYW1ldGVycyBtdXN0IGJlCi1leHBsaWNpdGx5IHNwZWNpZmllZC4gRm9yIGV2ZW50cyBvcmlnaW5hdGluZyBmcm9tIGRldmljZSwgIm5vZGUiCi1kZWZpbmVzIGl0cyBpbmRleC4gQWxsIGNyb3NzcG9pbnQgZXZlbnRzIHJlcXVpcmUgInhwIiAoaW5kZXgpLAotInBvcnQiIChkZXZpY2UgcG9ydCBudW1iZXIpIGFuZCAidmMiICh2aXJ0dWFsIGNoYW5uZWwgSUQpIGFuZAotImRpciIgKGRpcmVjdGlvbikuIFdhdGNocG9pbnRzIChzcGVjaWFsICJldmVudCIgdmFsdWUgMHhmZSkgYWxzbwotcmVxdWlyZSBjb21wYXJhdG9yIHZhbHVlcyAoImNtcF9sIiBhbmQgImNtcF9oIikgYW5kICJtYXNrIiwgYmVpbmcKLWluZGV4IG9mIHRoZSBjb21wYXJhdG9yIG1hc2suCitleHBsaWNpdGx5IHNwZWNpZmllZC4KIAorRm9yIGV2ZW50cyBvcmlnaW5hdGluZyBmcm9tIGRldmljZSwgIm5vZGUiIGRlZmluZXMgaXRzIGluZGV4LgorCitDcm9zc3BvaW50IFBNVSBldmVudHMgcmVxdWlyZSAieHAiIChpbmRleCksICJidXMiIChidXMgbnVtYmVyKQorYW5kICJ2YyIgKHZpcnR1YWwgY2hhbm5lbCBJRCkuCisKK0Nyb3NzcG9pbnQgd2F0Y2hwb2ludC1iYXNlZCBldmVudHMgKHNwZWNpYWwgImV2ZW50IiB2YWx1ZSAweGZlKQorcmVxdWlyZSAieHAiIGFuZCAidmMiIGFzIGFzIGFib3ZlIHBsdXMgInBvcnQiIChkZXZpY2UgcG9ydCBpbmRleCksCisiZGlyIiAodHJhbnNtaXQvcmVjZWl2ZSBkaXJlY3Rpb24pLCBjb21wYXJhdG9yIHZhbHVlcyAoImNtcF9sIgorYW5kICJjbXBfaCIpIGFuZCAibWFzayIsIGJlaW5nIGluZGV4IG9mIHRoZSBjb21wYXJhdG9yIG1hc2suCiBNYXNrcyBhcmUgZGVmaW5lZCBzZXBhcmF0ZWx5IGZyb20gdGhlIGV2ZW50IGRlc2NyaXB0aW9uCiAoZHVlIHRvIGxpbWl0ZWQgbnVtYmVyIG9mIHRoZSBjb25maWcgdmFsdWVzKSBpbiB0aGUgImNtcF9tYXNrIgogZGlyZWN0b3J5LCB3aXRoIGZpcnN0IDggY29uZmlndXJhYmxlIGJ5IHVzZXIgYW5kIGFkZGl0aW9uYWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYXJtL3N1bnhpL1JFQURNRSBiL0RvY3VtZW50YXRpb24vYXJtL3N1bnhpL1JFQURNRQppbmRleCBlNWExMTVmLi5jN2EwNTU0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FybS9zdW54aS9SRUFETUUKKysrIGIvRG9jdW1lbnRhdGlvbi9hcm0vc3VueGkvUkVBRE1FCkBAIC03Myw0ICs3MywxMyBAQAogICAgICogT2N0YSBBUk0gQ29ydGV4LUE3IGJhc2VkIFNvQ3MKICAgICAgIC0gQWxsd2lubmVyIEE4M1QKICAgICAgICAgKyBEYXRhc2hlZXQKLSAgICAgICAgICBodHRwOi8vZGwubGludXgtc3VueGkub3JnL0E4M1QvQTgzVF9kYXRhc2hlZXRfUmV2aXNpb25fMS4xLnBkZgorICAgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hbGx3aW5uZXItemgvZG9jdW1lbnRzL3Jhdy9tYXN0ZXIvQTgzVC9BODNUX0RhdGFzaGVldF92MS4zXzIwMTUwNTEwLnBkZgorICAgICAgICArIFVzZXIgTWFudWFsCisgICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2FsbHdpbm5lci16aC9kb2N1bWVudHMvcmF3L21hc3Rlci9BODNUL0E4M1RfVXNlcl9NYW51YWxfdjEuNS4xXzIwMTUwNTEzLnBkZgorCisgICAgKiBRdWFkIEFSTSBDb3J0ZXgtQTUzIGJhc2VkIFNvQ3MKKyAgICAgIC0gQWxsd2lubmVyIEE2NAorICAgICAgICArIERhdGFzaGVldAorICAgICAgICAgIGh0dHA6Ly9kbC5saW51eC1zdW54aS5vcmcvQTY0L0E2NF9EYXRhc2hlZXRfVjEuMS5wZGYKKyAgICAgICAgKyBVc2VyIE1hbnVhbAorICAgICAgICAgIGh0dHA6Ly9kbC5saW51eC1zdW54aS5vcmcvQTY0L0FsbHdpbm5lciUyMEE2NCUyMFVzZXIlMjBNYW51YWwlMjB2MS4wLnBkZgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hcm02NC9zaWxpY29uLWVycmF0YS50eHQgYi9Eb2N1bWVudGF0aW9uL2FybTY0L3NpbGljb24tZXJyYXRhLnR4dAppbmRleCA0ZGE2MGI0Li40MDVkYTExIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FybTY0L3NpbGljb24tZXJyYXRhLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2FybTY0L3NpbGljb24tZXJyYXRhLnR4dApAQCAtNTMsNiArNTMsNyBAQAogfCBBUk0gICAgICAgICAgICB8IENvcnRleC1BNTcgICAgICB8ICM4MzIwNzUgICAgICAgICB8IEFSTTY0X0VSUkFUVU1fODMyMDc1ICAgIHwKIHwgQVJNICAgICAgICAgICAgfCBDb3J0ZXgtQTU3ICAgICAgfCAjODUyNTIzICAgICAgICAgfCBOL0EgICAgICAgICAgICAgICAgICAgICB8CiB8IEFSTSAgICAgICAgICAgIHwgQ29ydGV4LUE1NyAgICAgIHwgIzgzNDIyMCAgICAgICAgIHwgQVJNNjRfRVJSQVRVTV84MzQyMjAgICAgfAorfCBBUk0gICAgICAgICAgICB8IENvcnRleC1BNzIgICAgICB8ICM4NTM3MDkgICAgICAgICB8IE4vQSAgICAgICAgICAgICAgICAgICAgIHwKIHwgQVJNICAgICAgICAgICAgfCBNTVUtNTAwICAgICAgICAgfCAjODQxMTE5LCM4MjY0MTkgfCBOL0EgICAgICAgICAgICAgICAgICAgICB8CiB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfAogfCBDYXZpdW0gICAgICAgICB8IFRodW5kZXJYIElUUyAgICB8ICMyMjM3NSwgIzI0MzEzICB8IENBVklVTV9FUlJBVFVNXzIyMzc1ICAgIHwKQEAgLTYwLDMgKzYxLDUgQEAKIHwgQ2F2aXVtICAgICAgICAgfCBUaHVuZGVyWCBHSUN2MyAgfCAjMjMxNTQgICAgICAgICAgfCBDQVZJVU1fRVJSQVRVTV8yMzE1NCAgICB8CiB8IENhdml1bSAgICAgICAgIHwgVGh1bmRlclggQ29yZSAgIHwgIzI3NDU2ICAgICAgICAgIHwgQ0FWSVVNX0VSUkFUVU1fMjc0NTYgICAgfAogfCBDYXZpdW0gICAgICAgICB8IFRodW5kZXJYIFNNTVV2MiB8ICMyNzcwNCAgICAgICAgICB8IE4vQQkJICAgICAgIHwKK3wgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IEZyZWVzY2FsZS9OWFAgIHwgTFMyMDgwQS9MUzEwNDNBIHwgQS0wMDg1ODUgICAgICAgIHwgRlNMX0VSUkFUVU1fQTAwODU4NSAgICAgfApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jbGsudHh0IGIvRG9jdW1lbnRhdGlvbi9jbGsudHh0CmluZGV4IDVjNGJjNGQuLjIyZjAyNmEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY2xrLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Nsay50eHQKQEAgLTMxLDI0ICszMSwyNSBAQAogaGFyZHdhcmUtc3BlY2lmaWMgYml0cyBmb3IgdGhlIGh5cG90aGV0aWNhbCAiZm9vIiBoYXJkd2FyZS4KIAogVHlpbmcgdGhlIHR3byBoYWx2ZXMgb2YgdGhpcyBpbnRlcmZhY2UgdG9nZXRoZXIgaXMgc3RydWN0IGNsa19odywgd2hpY2gKLWlzIGRlZmluZWQgaW4gc3RydWN0IGNsa19mb28gYW5kIHBvaW50ZWQgdG8gd2l0aGluIHN0cnVjdCBjbGsuICBUaGlzCitpcyBkZWZpbmVkIGluIHN0cnVjdCBjbGtfZm9vIGFuZCBwb2ludGVkIHRvIHdpdGhpbiBzdHJ1Y3QgY2xrX2NvcmUuICBUaGlzCiBhbGxvd3MgZm9yIGVhc3kgbmF2aWdhdGlvbiBiZXR3ZWVuIHRoZSB0d28gZGlzY3JldGUgaGFsdmVzIG9mIHRoZSBjb21tb24KIGNsb2NrIGludGVyZmFjZS4KIAogCVBhcnQgMiAtIGNvbW1vbiBkYXRhIHN0cnVjdHVyZXMgYW5kIGFwaQogCi1CZWxvdyBpcyB0aGUgY29tbW9uIHN0cnVjdCBjbGsgZGVmaW5pdGlvbiBmcm9tCi1pbmNsdWRlL2xpbnV4L2Nsay1wcml2YXRlLmgsIG1vZGlmaWVkIGZvciBicmV2aXR5OgorQmVsb3cgaXMgdGhlIGNvbW1vbiBzdHJ1Y3QgY2xrX2NvcmUgZGVmaW5pdGlvbiBmcm9tCitkcml2ZXJzL2Nsay9jbGsuYywgbW9kaWZpZWQgZm9yIGJyZXZpdHk6CiAKLQlzdHJ1Y3QgY2xrIHsKKwlzdHJ1Y3QgY2xrX2NvcmUgewogCQljb25zdCBjaGFyCQkqbmFtZTsKIAkJY29uc3Qgc3RydWN0IGNsa19vcHMJKm9wczsKIAkJc3RydWN0IGNsa19odwkJKmh3OwotCQljaGFyCQkJKipwYXJlbnRfbmFtZXM7Ci0JCXN0cnVjdCBjbGsJCSoqcGFyZW50czsKLQkJc3RydWN0IGNsawkJKnBhcmVudDsKLQkJc3RydWN0IGhsaXN0X2hlYWQJY2hpbGRyZW47Ci0JCXN0cnVjdCBobGlzdF9ub2RlCWNoaWxkX25vZGU7CisJCXN0cnVjdCBtb2R1bGUJCSpvd25lcjsKKwkJc3RydWN0IGNsa19jb3JlCQkqcGFyZW50OworCQljb25zdCBjaGFyCQkqKnBhcmVudF9uYW1lczsKKwkJc3RydWN0IGNsa19jb3JlCQkqKnBhcmVudHM7CisJCXU4CQkJbnVtX3BhcmVudHM7CisJCXU4CQkJbmV3X3BhcmVudF9pbmRleDsKIAkJLi4uCiAJfTsKIApAQCAtNTYsMTYgKzU3LDE5IEBACiBhcGkgaXRzZWxmIGRlZmluZXMgc2V2ZXJhbCBkcml2ZXItZmFjaW5nIGZ1bmN0aW9ucyB3aGljaCBvcGVyYXRlIG9uCiBzdHJ1Y3QgY2xrLiAgVGhhdCBhcGkgaXMgZG9jdW1lbnRlZCBpbiBpbmNsdWRlL2xpbnV4L2Nsay5oLgogCi1QbGF0Zm9ybXMgYW5kIGRldmljZXMgdXRpbGl6aW5nIHRoZSBjb21tb24gc3RydWN0IGNsayB1c2UgdGhlIHN0cnVjdAotY2xrX29wcyBwb2ludGVyIGluIHN0cnVjdCBjbGsgdG8gcGVyZm9ybSB0aGUgaGFyZHdhcmUtc3BlY2lmaWMgcGFydHMgb2YKLXRoZSBvcGVyYXRpb25zIGRlZmluZWQgaW4gY2xrLmg6CitQbGF0Zm9ybXMgYW5kIGRldmljZXMgdXRpbGl6aW5nIHRoZSBjb21tb24gc3RydWN0IGNsa19jb3JlIHVzZSB0aGUgc3RydWN0CitjbGtfb3BzIHBvaW50ZXIgaW4gc3RydWN0IGNsa19jb3JlIHRvIHBlcmZvcm0gdGhlIGhhcmR3YXJlLXNwZWNpZmljIHBhcnRzIG9mCit0aGUgb3BlcmF0aW9ucyBkZWZpbmVkIGluIGNsay1wcm92aWRlci5oOgogCiAJc3RydWN0IGNsa19vcHMgewogCQlpbnQJCSgqcHJlcGFyZSkoc3RydWN0IGNsa19odyAqaHcpOwogCQl2b2lkCQkoKnVucHJlcGFyZSkoc3RydWN0IGNsa19odyAqaHcpOworCQlpbnQJCSgqaXNfcHJlcGFyZWQpKHN0cnVjdCBjbGtfaHcgKmh3KTsKKwkJdm9pZAkJKCp1bnByZXBhcmVfdW51c2VkKShzdHJ1Y3QgY2xrX2h3ICpodyk7CiAJCWludAkJKCplbmFibGUpKHN0cnVjdCBjbGtfaHcgKmh3KTsKIAkJdm9pZAkJKCpkaXNhYmxlKShzdHJ1Y3QgY2xrX2h3ICpodyk7CiAJCWludAkJKCppc19lbmFibGVkKShzdHJ1Y3QgY2xrX2h3ICpodyk7CisJCXZvaWQJCSgqZGlzYWJsZV91bnVzZWQpKHN0cnVjdCBjbGtfaHcgKmh3KTsKIAkJdW5zaWduZWQgbG9uZwkoKnJlY2FsY19yYXRlKShzdHJ1Y3QgY2xrX2h3ICpodywKIAkJCQkJCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUpOwogCQlsb25nCQkoKnJvdW5kX3JhdGUpKHN0cnVjdCBjbGtfaHcgKmh3LApAQCAtODQsNiArODgsOCBAQAogCQkJCQkgICAgdTggaW5kZXgpOwogCQl1bnNpZ25lZCBsb25nCSgqcmVjYWxjX2FjY3VyYWN5KShzdHJ1Y3QgY2xrX2h3ICpodywKIAkJCQkJCXVuc2lnbmVkIGxvbmcgcGFyZW50X2FjY3VyYWN5KTsKKwkJaW50CQkoKmdldF9waGFzZSkoc3RydWN0IGNsa19odyAqaHcpOworCQlpbnQJCSgqc2V0X3BoYXNlKShzdHJ1Y3QgY2xrX2h3ICpodywgaW50IGRlZ3JlZXMpOwogCQl2b2lkCQkoKmluaXQpKHN0cnVjdCBjbGtfaHcgKmh3KTsKIAkJaW50CQkoKmRlYnVnX2luaXQpKHN0cnVjdCBjbGtfaHcgKmh3LAogCQkJCQkgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOwpAQCAtOTEsNyArOTcsNyBAQAogCiAJUGFydCAzIC0gaGFyZHdhcmUgY2xrIGltcGxlbWVudGF0aW9ucwogCi1UaGUgc3RyZW5ndGggb2YgdGhlIGNvbW1vbiBzdHJ1Y3QgY2xrIGNvbWVzIGZyb20gaXRzIC5vcHMgYW5kIC5odyBwb2ludGVycworVGhlIHN0cmVuZ3RoIG9mIHRoZSBjb21tb24gc3RydWN0IGNsa19jb3JlIGNvbWVzIGZyb20gaXRzIC5vcHMgYW5kIC5odyBwb2ludGVycwogd2hpY2ggYWJzdHJhY3QgdGhlIGRldGFpbHMgb2Ygc3RydWN0IGNsayBmcm9tIHRoZSBoYXJkd2FyZS1zcGVjaWZpYyBiaXRzLCBhbmQKIHZpY2UgdmVyc2EuICBUbyBpbGx1c3RyYXRlIGNvbnNpZGVyIHRoZSBzaW1wbGUgZ2F0ZWFibGUgY2xrIGltcGxlbWVudGF0aW9uIGluCiBkcml2ZXJzL2Nsay9jbGstZ2F0ZS5jOgpAQCAtMTA3LDcgKzExMyw3IEBACiBrbm93bGVkZ2UgYWJvdXQgd2hpY2ggcmVnaXN0ZXIgYW5kIGJpdCBjb250cm9scyB0aGlzIGNsaydzIGdhdGluZy4KIE5vdGhpbmcgYWJvdXQgY2xvY2sgdG9wb2xvZ3kgb3IgYWNjb3VudGluZywgc3VjaCBhcyBlbmFibGVfY291bnQgb3IKIG5vdGlmaWVyX2NvdW50LCBpcyBuZWVkZWQgaGVyZS4gIFRoYXQgaXMgYWxsIGhhbmRsZWQgYnkgdGhlIGNvbW1vbgotZnJhbWV3b3JrIGNvZGUgYW5kIHN0cnVjdCBjbGsuCitmcmFtZXdvcmsgY29kZSBhbmQgc3RydWN0IGNsa19jb3JlLgogCiBMZXQncyB3YWxrIHRocm91Z2ggZW5hYmxpbmcgdGhpcyBjbGsgZnJvbSBkcml2ZXIgY29kZToKIApAQCAtMTM5LDIyICsxNDUsMTggQEAKIAogTm90ZSB0aGF0IHRvX2Nsa19nYXRlIGlzIGRlZmluZWQgYXM6CiAKLSNkZWZpbmUgdG9fY2xrX2dhdGUoX2h3KSBjb250YWluZXJfb2YoX2h3LCBzdHJ1Y3QgY2xrX2dhdGUsIGNsaykKKyNkZWZpbmUgdG9fY2xrX2dhdGUoX2h3KSBjb250YWluZXJfb2YoX2h3LCBzdHJ1Y3QgY2xrX2dhdGUsIGh3KQogCiBUaGlzIHBhdHRlcm4gb2YgYWJzdHJhY3Rpb24gaXMgdXNlZCBmb3IgZXZlcnkgY2xvY2sgaGFyZHdhcmUKIHJlcHJlc2VudGF0aW9uLgogCiAJUGFydCA0IC0gc3VwcG9ydGluZyB5b3VyIG93biBjbGsgaGFyZHdhcmUKIAotV2hlbiBpbXBsZW1lbnRpbmcgc3VwcG9ydCBmb3IgYSBuZXcgdHlwZSBvZiBjbG9jayBpdCBvbmx5IG5lY2Vzc2FyeSB0bworV2hlbiBpbXBsZW1lbnRpbmcgc3VwcG9ydCBmb3IgYSBuZXcgdHlwZSBvZiBjbG9jayBpdCBpcyBvbmx5IG5lY2Vzc2FyeSB0bwogaW5jbHVkZSB0aGUgZm9sbG93aW5nIGhlYWRlcjoKIAogI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgogCi1pbmNsdWRlL2xpbnV4L2Nsay5oIGlzIGluY2x1ZGVkIHdpdGhpbiB0aGF0IGhlYWRlciBhbmQgY2xrLXByaXZhdGUuaAotbXVzdCBuZXZlciBiZSBpbmNsdWRlZCBmcm9tIHRoZSBjb2RlIHdoaWNoIGltcGxlbWVudHMgdGhlIG9wZXJhdGlvbnMgZm9yCi1hIGNsb2NrLiAgTW9yZSBvbiB0aGF0IGJlbG93IGluIFBhcnQgNS4KLQogVG8gY29uc3RydWN0IGEgY2xrIGhhcmR3YXJlIHN0cnVjdHVyZSBmb3IgeW91ciBwbGF0Zm9ybSB5b3UgbXVzdCBkZWZpbmUKIHRoZSBmb2xsb3dpbmc6CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY29jY2luZWxsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2NvY2NpbmVsbGUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWZiMWRhLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vY29jY2luZWxsZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0NzAgKzAsMCBAQAotQ29weXJpZ2h0IDIwMTAgTmljb2xhcyBQYWxpeCA8bnBhbGl4QGRpa3UuZGs+Ci1Db3B5cmlnaHQgMjAxMCBKdWxpYSBMYXdhbGwgPGp1bGlhQGRpa3UuZGs+Ci1Db3B5cmlnaHQgMjAxMCBHaWxsZXMgTXVsbGVyIDxHaWxsZXMuTXVsbGVyQGxpcDYuZnI+Ci0KLQotIEdldHRpbmcgQ29jY2luZWxsZQotfn5+fn5+fn5+fn5+fn5+fn5+fn4KLQotVGhlIHNlbWFudGljIHBhdGNoZXMgaW5jbHVkZWQgaW4gdGhlIGtlcm5lbCB1c2UgZmVhdHVyZXMgYW5kIG9wdGlvbnMKLXdoaWNoIGFyZSBwcm92aWRlZCBieSBDb2NjaW5lbGxlIHZlcnNpb24gMS4wLjAtcmMxMSBhbmQgYWJvdmUuCi1Vc2luZyBlYXJsaWVyIHZlcnNpb25zIHdpbGwgZmFpbCBhcyB0aGUgb3B0aW9uIG5hbWVzIHVzZWQgYnkKLXRoZSBDb2NjaW5lbGxlIGZpbGVzIGFuZCBjb2NjaWNoZWNrIGhhdmUgYmVlbiB1cGRhdGVkLgotCi1Db2NjaW5lbGxlIGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBwYWNrYWdlIG1hbmFnZXIKLW9mIG1hbnkgZGlzdHJpYnV0aW9ucywgZS5nLiA6Ci0KLSAtIERlYmlhbgotIC0gRmVkb3JhCi0gLSBVYnVudHUKLSAtIE9wZW5TVVNFCi0gLSBBcmNoIExpbnV4Ci0gLSBOZXRCU0QKLSAtIEZyZWVCU0QKLQotCi1Zb3UgY2FuIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gcmVsZWFzZWQgZnJvbSB0aGUgQ29jY2luZWxsZSBob21lcGFnZSBhdAotaHR0cDovL2NvY2NpbmVsbGUubGlwNi5mci8KLQotSW5mb3JtYXRpb24gYW5kIHRpcHMgYWJvdXQgQ29jY2luZWxsZSBhcmUgYWxzbyBwcm92aWRlZCBvbiB0aGUgd2lraQotcGFnZXMgYXQgaHR0cDovL2NvY2NpLmVrc3RyYW5ldC5kaWt1LmRrL3dpa2kvZG9rdS5waHAKLQotT25jZSB5b3UgaGF2ZSBpdCwgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKLQotICAgICAJLi9jb25maWd1cmUKLSAgICAgICAgbWFrZQotCi1hcyBhIHJlZ3VsYXIgdXNlciwgYW5kIGluc3RhbGwgaXQgd2l0aAotCi0gICAgICAgIHN1ZG8gbWFrZSBpbnN0YWxsCi0KLSBTdXBwbGVtZW50YWwgZG9jdW1lbnRhdGlvbgotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotCi1Gb3Igc3VwcGxlbWVudGFsIGRvY3VtZW50YXRpb24gcmVmZXIgdG8gdGhlIHdpa2k6Ci0KLWh0dHBzOi8vYm90dGVzdC53aWtpLmtlcm5lbC5vcmcvY29jY2ljaGVjawotCi1UaGUgd2lraSBkb2N1bWVudGF0aW9uIGFsd2F5cyByZWZlcnMgdG8gdGhlIGxpbnV4LW5leHQgdmVyc2lvbiBvZiB0aGUgc2NyaXB0LgotCi0gVXNpbmcgQ29jY2luZWxsZSBvbiB0aGUgTGludXgga2VybmVsCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotCi1BIENvY2NpbmVsbGUtc3BlY2lmaWMgdGFyZ2V0IGlzIGRlZmluZWQgaW4gdGhlIHRvcCBsZXZlbAotTWFrZWZpbGUuIFRoaXMgdGFyZ2V0IGlzIG5hbWVkICdjb2NjaWNoZWNrJyBhbmQgY2FsbHMgdGhlICdjb2NjaWNoZWNrJwotZnJvbnQtZW5kIGluIHRoZSAnc2NyaXB0cycgZGlyZWN0b3J5LgotCi1Gb3VyIGJhc2ljIG1vZGVzIGFyZSBkZWZpbmVkOiBwYXRjaCwgcmVwb3J0LCBjb250ZXh0LCBhbmQgb3JnLiBUaGUgbW9kZSB0bwotdXNlIGlzIHNwZWNpZmllZCBieSBzZXR0aW5nIHRoZSBNT0RFIHZhcmlhYmxlIHdpdGggJ01PREU9PG1vZGU+Jy4KLQotJ3BhdGNoJyBwcm9wb3NlcyBhIGZpeCwgd2hlbiBwb3NzaWJsZS4KLQotJ3JlcG9ydCcgZ2VuZXJhdGVzIGEgbGlzdCBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKLSAgZmlsZTpsaW5lOmNvbHVtbi1jb2x1bW46IG1lc3NhZ2UKLQotJ2NvbnRleHQnIGhpZ2hsaWdodHMgbGluZXMgb2YgaW50ZXJlc3QgYW5kIHRoZWlyIGNvbnRleHQgaW4gYQotZGlmZi1saWtlIHN0eWxlLkxpbmVzIG9mIGludGVyZXN0IGFyZSBpbmRpY2F0ZWQgd2l0aCAnLScuCi0KLSdvcmcnIGdlbmVyYXRlcyBhIHJlcG9ydCBpbiB0aGUgT3JnIG1vZGUgZm9ybWF0IG9mIEVtYWNzLgotCi1Ob3RlIHRoYXQgbm90IGFsbCBzZW1hbnRpYyBwYXRjaGVzIGltcGxlbWVudCBhbGwgbW9kZXMuIEZvciBlYXN5IHVzZQotb2YgQ29jY2luZWxsZSwgdGhlIGRlZmF1bHQgbW9kZSBpcyAicmVwb3J0Ii4KLQotVHdvIG90aGVyIG1vZGVzIHByb3ZpZGUgc29tZSBjb21tb24gY29tYmluYXRpb25zIG9mIHRoZXNlIG1vZGVzLgotCi0nY2hhaW4nIHRyaWVzIHRoZSBwcmV2aW91cyBtb2RlcyBpbiB0aGUgb3JkZXIgYWJvdmUgdW50aWwgb25lIHN1Y2NlZWRzLgotCi0ncmVwK2N0eHQnIHJ1bnMgc3VjY2Vzc2l2ZWx5IHRoZSByZXBvcnQgbW9kZSBhbmQgdGhlIGNvbnRleHQgbW9kZS4KLQkgICBJdCBzaG91bGQgYmUgdXNlZCB3aXRoIHRoZSBDIG9wdGlvbiAoZGVzY3JpYmVkIGxhdGVyKQotCSAgIHdoaWNoIGNoZWNrcyB0aGUgY29kZSBvbiBhIGZpbGUgYmFzaXMuCi0KLUV4YW1wbGVzOgotCVRvIG1ha2UgYSByZXBvcnQgZm9yIGV2ZXJ5IHNlbWFudGljIHBhdGNoLCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOgotCi0JCW1ha2UgY29jY2ljaGVjayBNT0RFPXJlcG9ydAotCi0JVG8gcHJvZHVjZSBwYXRjaGVzLCBydW46Ci0KLQkJbWFrZSBjb2NjaWNoZWNrIE1PREU9cGF0Y2gKLQotCi1UaGUgY29jY2ljaGVjayB0YXJnZXQgYXBwbGllcyBldmVyeSBzZW1hbnRpYyBwYXRjaCBhdmFpbGFibGUgaW4gdGhlCi1zdWItZGlyZWN0b3JpZXMgb2YgJ3NjcmlwdHMvY29jY2luZWxsZScgdG8gdGhlIGVudGlyZSBMaW51eCBrZXJuZWwuCi0KLUZvciBlYWNoIHNlbWFudGljIHBhdGNoLCBhIGNvbW1pdCBtZXNzYWdlIGlzIHByb3Bvc2VkLiAgSXQgZ2l2ZXMgYQotZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gYmVpbmcgY2hlY2tlZCBieSB0aGUgc2VtYW50aWMgcGF0Y2gsIGFuZAotaW5jbHVkZXMgYSByZWZlcmVuY2UgdG8gQ29jY2luZWxsZS4KLQotQXMgYW55IHN0YXRpYyBjb2RlIGFuYWx5emVyLCBDb2NjaW5lbGxlIHByb2R1Y2VzIGZhbHNlCi1wb3NpdGl2ZXMuIFRodXMsIHJlcG9ydHMgbXVzdCBiZSBjYXJlZnVsbHkgY2hlY2tlZCwgYW5kIHBhdGNoZXMKLXJldmlld2VkLgotCi1UbyBlbmFibGUgdmVyYm9zZSBtZXNzYWdlcyBzZXQgdGhlIFY9IHZhcmlhYmxlLCBmb3IgZXhhbXBsZToKLQotICAgbWFrZSBjb2NjaWNoZWNrIE1PREU9cmVwb3J0IFY9MQotCi0gQ29jY2luZWxsZSBwYXJhbGxlbGl6YXRpb24KLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLQotQnkgZGVmYXVsdCwgY29jY2ljaGVjayB0cmllcyB0byBydW4gYXMgcGFyYWxsZWwgYXMgcG9zc2libGUuIFRvIGNoYW5nZQotdGhlIHBhcmFsbGVsaXNtLCBzZXQgdGhlIEo9IHZhcmlhYmxlLiBGb3IgZXhhbXBsZSwgdG8gcnVuIGFjcm9zcyA0IENQVXM6Ci0KLSAgIG1ha2UgY29jY2ljaGVjayBNT0RFPXJlcG9ydCBKPTQKLQotQXMgb2YgQ29jY2luZWxsZSAxLjAuMiBDb2NjaW5lbGxlIHVzZXMgT2NhbWwgcGFybWFwIGZvciBwYXJhbGxlbGl6YXRpb24sCi1pZiBzdXBwb3J0IGZvciB0aGlzIGlzIGRldGVjdGVkIHlvdSB3aWxsIGJlbmVmaXQgZnJvbSBwYXJtYXAgcGFyYWxsZWxpemF0aW9uLgotCi1XaGVuIHBhcm1hcCBpcyBlbmFibGVkIGNvY2NpY2hlY2sgd2lsbCBlbmFibGUgZHluYW1pYyBsb2FkIGJhbGFuY2luZyBieSB1c2luZwotJy0tY2h1bmtzaXplIDEnIGFyZ3VtZW50LCB0aGlzIGVuc3VyZXMgd2Uga2VlcCBmZWVkaW5nIHRocmVhZHMgd2l0aCB3b3JrCi1vbmUgYnkgb25lLCBzbyB0aGF0IHdlIGF2b2lkIHRoZSBzaXR1YXRpb24gd2hlcmUgbW9zdCB3b3JrIGdldHMgZG9uZSBieSBvbmx5Ci1hIGZldyB0aHJlYWRzLiBXaXRoIGR5bmFtaWMgbG9hZCBiYWxhbmNpbmcsIGlmIGEgdGhyZWFkIGZpbmlzaGVzIGVhcmx5IHdlIGtlZXAKLWZlZWRpbmcgaXQgbW9yZSB3b3JrLgotCi1XaGVuIHBhcm1hcCBpcyBlbmFibGVkLCBpZiBhbiBlcnJvciBvY2N1cnMgaW4gQ29jY2luZWxsZSwgdGhpcyBlcnJvcgotdmFsdWUgaXMgcHJvcGFnYXRlZCBiYWNrLCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSAnbWFrZSBjb2NjaWNoZWNrJwotY2FwdHVyZXMgdGhpcyByZXR1cm4gdmFsdWUuCi0KLSBVc2luZyBDb2NjaW5lbGxlIHdpdGggYSBzaW5nbGUgc2VtYW50aWMgcGF0Y2gKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0KLVRoZSBvcHRpb25hbCBtYWtlIHZhcmlhYmxlIENPQ0NJIGNhbiBiZSB1c2VkIHRvIGNoZWNrIGEgc2luZ2xlCi1zZW1hbnRpYyBwYXRjaC4gSW4gdGhhdCBjYXNlLCB0aGUgdmFyaWFibGUgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoCi10aGUgbmFtZSBvZiB0aGUgc2VtYW50aWMgcGF0Y2ggdG8gYXBwbHkuCi0KLUZvciBpbnN0YW5jZToKLQotCW1ha2UgY29jY2ljaGVjayBDT0NDST08bXlfU1AuY29jY2k+IE1PREU9cGF0Y2gKLW9yCi0JbWFrZSBjb2NjaWNoZWNrIENPQ0NJPTxteV9TUC5jb2NjaT4gTU9ERT1yZXBvcnQKLQotCi0gQ29udHJvbGxpbmcgV2hpY2ggRmlsZXMgYXJlIFByb2Nlc3NlZCBieSBDb2NjaW5lbGxlCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLUJ5IGRlZmF1bHQgdGhlIGVudGlyZSBrZXJuZWwgc291cmNlIHRyZWUgaXMgY2hlY2tlZC4KLQotVG8gYXBwbHkgQ29jY2luZWxsZSB0byBhIHNwZWNpZmljIGRpcmVjdG9yeSwgTT0gY2FuIGJlIHVzZWQuCi1Gb3IgZXhhbXBsZSwgdG8gY2hlY2sgZHJpdmVycy9uZXQvd2lyZWxlc3MvIG9uZSBtYXkgd3JpdGU6Ci0KLSAgICBtYWtlIGNvY2NpY2hlY2sgTT1kcml2ZXJzL25ldC93aXJlbGVzcy8KLQotVG8gYXBwbHkgQ29jY2luZWxsZSBvbiBhIGZpbGUgYmFzaXMsIGluc3RlYWQgb2YgYSBkaXJlY3RvcnkgYmFzaXMsIHRoZQotZm9sbG93aW5nIGNvbW1hbmQgbWF5IGJlIHVzZWQ6Ci0KLSAgICBtYWtlIEM9MSBDSEVDSz0ic2NyaXB0cy9jb2NjaWNoZWNrIgotCi1UbyBjaGVjayBvbmx5IG5ld2x5IGVkaXRlZCBjb2RlLCB1c2UgdGhlIHZhbHVlIDIgZm9yIHRoZSBDIGZsYWcsIGkuZS4KLQotICAgIG1ha2UgQz0yIENIRUNLPSJzY3JpcHRzL2NvY2NpY2hlY2siCi0KLUluIHRoZXNlIG1vZGVzLCB3aGljaCB3b3JrcyBvbiBhIGZpbGUgYmFzaXMsIHRoZXJlIGlzIG5vIGluZm9ybWF0aW9uCi1hYm91dCBzZW1hbnRpYyBwYXRjaGVzIGRpc3BsYXllZCwgYW5kIG5vIGNvbW1pdCBtZXNzYWdlIHByb3Bvc2VkLgotCi1UaGlzIHJ1bnMgZXZlcnkgc2VtYW50aWMgcGF0Y2ggaW4gc2NyaXB0cy9jb2NjaW5lbGxlIGJ5IGRlZmF1bHQuIFRoZQotQ09DQ0kgdmFyaWFibGUgbWF5IGFkZGl0aW9uYWxseSBiZSB1c2VkIHRvIG9ubHkgYXBwbHkgYSBzaW5nbGUKLXNlbWFudGljIHBhdGNoIGFzIHNob3duIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLgotCi1UaGUgInJlcG9ydCIgbW9kZSBpcyB0aGUgZGVmYXVsdC4gWW91IGNhbiBzZWxlY3QgYW5vdGhlciBvbmUgd2l0aCB0aGUKLU1PREUgdmFyaWFibGUgZXhwbGFpbmVkIGFib3ZlLgotCi0gRGVidWdnaW5nIENvY2NpbmVsbGUgU21QTCBwYXRjaGVzCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0KLVVzaW5nIGNvY2NpY2hlY2sgaXMgYmVzdCBhcyBpdCBwcm92aWRlcyBpbiB0aGUgc3BhdGNoIGNvbW1hbmQgbGluZQotaW5jbHVkZSBvcHRpb25zIG1hdGNoaW5nIHRoZSBvcHRpb25zIHVzZWQgd2hlbiB3ZSBjb21waWxlIHRoZSBrZXJuZWwuCi1Zb3UgY2FuIGxlYXJuIHdoYXQgdGhlc2Ugb3B0aW9ucyBhcmUgYnkgdXNpbmcgVj0xLCB5b3UgY291bGQgdGhlbgotbWFudWFsbHkgcnVuIENvY2NpbmVsbGUgd2l0aCBkZWJ1ZyBvcHRpb25zIGFkZGVkLgotCi1BbHRlcm5hdGl2ZWx5IHlvdSBjYW4gZGVidWcgcnVubmluZyBDb2NjaW5lbGxlIGFnYWluc3QgU21QTCBwYXRjaGVzCi1ieSBhc2tpbmcgZm9yIHN0ZGVyciB0byBiZSByZWRpcmVjdGVkIHRvIHN0ZGVyciwgYnkgZGVmYXVsdCBzdGRlcnIKLWlzIHJlZGlyZWN0ZWQgdG8gL2Rldi9udWxsLCBpZiB5b3UnZCBsaWtlIHRvIGNhcHR1cmUgc3RkZXJyIHlvdQotY2FuIHNwZWNpZnkgdGhlIERFQlVHX0ZJTEU9ImZpbGUudHh0IiBvcHRpb24gdG8gY29jY2ljaGVjay4gRm9yCi1pbnN0YW5jZToKLQotICAgIHJtIC1mIGNvY2NpLmVycgotICAgIG1ha2UgY29jY2ljaGVjayBDT0NDST1zY3JpcHRzL2NvY2NpbmVsbGUvZnJlZS9rZnJlZS5jb2NjaSBNT0RFPXJlcG9ydCBERUJVR19GSUxFPWNvY2NpLmVycgotICAgIGNhdCBjb2NjaS5lcnIKLQotWW91IGNhbiB1c2UgU1BGTEFHUyB0byBhZGQgZGVidWdnaW5nIGZsYWdzLCBmb3IgaW5zdGFuY2UgeW91IG1heSB3YW50IHRvCi1hZGQgYm90aCAtLXByb2ZpbGUgLS1zaG93LXRyeWluZyB0byBTUEZMQUdTIHdoZW4gZGVidWdnaW5nLiBGb3IgaW5zdGFuY2UKLXlvdSBtYXkgd2FudCB0byB1c2U6Ci0KLSAgICBybSAtZiBlcnIubG9nCi0gICAgZXhwb3J0IENPQ0NJPXNjcmlwdHMvY29jY2luZWxsZS9taXNjL2lycWZfb25lc2hvdC5jb2NjaQotICAgIG1ha2UgY29jY2ljaGVjayBERUJVR19GSUxFPSJlcnIubG9nIiBNT0RFPXJlcG9ydCBTUEZMQUdTPSItLXByb2ZpbGUgLS1zaG93LXRyeWluZyIgTT0uL2RyaXZlcnMvbWZkL2FyaXpvbmEtaXJxLmMKLQotZXJyLmxvZyB3aWxsIG5vdyBoYXZlIHRoZSBwcm9maWxpbmcgaW5mb3JtYXRpb24sIHdoaWxlIHN0ZG91dCB3aWxsCi1wcm92aWRlIHNvbWUgcHJvZ3Jlc3MgaW5mb3JtYXRpb24gYXMgQ29jY2luZWxsZSBtb3ZlcyBmb3J3YXJkIHdpdGgKLXdvcmsuCi0KLURFQlVHX0ZJTEUgc3VwcG9ydCBpcyBvbmx5IHN1cHBvcnRlZCB3aGVuIHVzaW5nIGNvY2NpbmVsbGUgPj0gMS4yLgotCi0gLmNvY2NpY29uZmlnIHN1cHBvcnQKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLQotQ29jY2luZWxsZSBzdXBwb3J0cyByZWFkaW5nIC5jb2NjaWNvbmZpZyBmb3IgZGVmYXVsdCBDb2NjaW5lbGxlIG9wdGlvbnMgdGhhdAotc2hvdWxkIGJlIHVzZWQgZXZlcnkgdGltZSBzcGF0Y2ggaXMgc3Bhd25lZCwgdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZm9yCi12YXJpYWJsZXMgZm9yIC5jb2NjaWNvbmZpZyBpcyBhcyBmb2xsb3dzOgotCi0gIG8gWW91ciBjdXJyZW50IHVzZXIncyBob21lIGRpcmVjdG9yeSBpcyBwcm9jZXNzZWQgZmlyc3QKLSAgbyBZb3VyIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHNwYXRjaCBpcyBjYWxsZWQgaXMgcHJvY2Vzc2VkIG5leHQKLSAgbyBUaGUgZGlyZWN0b3J5IHByb3ZpZGVkIHdpdGggdGhlIC0tZGlyIG9wdGlvbiBpcyBwcm9jZXNzZWQgbGFzdCwgaWYgdXNlZAotCi1TaW5jZSBjb2NjaWNoZWNrIHJ1bnMgdGhyb3VnaCBtYWtlLCBpdCBuYXR1cmFsbHkgcnVucyBmcm9tIHRoZSBrZXJuZWwKLXByb3BlciBkaXIsIGFzIHN1Y2ggdGhlIHNlY29uZCBydWxlIGFib3ZlIHdvdWxkIGJlIGltcGxpZWQgZm9yIHBpY2tpbmcgdXAgYQotLmNvY2NpY29uZmlnIHdoZW4gdXNpbmcgJ21ha2UgY29jY2ljaGVjaycuCi0KLSdtYWtlIGNvY2NpY2hlY2snIGFsc28gc3VwcG9ydHMgdXNpbmcgTT0gdGFyZ2V0cy5JZiB5b3UgZG8gbm90IHN1cHBseQotYW55IE09IHRhcmdldCwgaXQgaXMgYXNzdW1lZCB5b3Ugd2FudCB0byB0YXJnZXQgdGhlIGVudGlyZSBrZXJuZWwuCi1UaGUga2VybmVsIGNvY2NpY2hlY2sgc2NyaXB0IGhhczoKLQotICAgIGlmIFsgIiRLQlVJTERfRVhUTU9EIiA9ICIiIF0gOyB0aGVuCi0gICAgICAgIE9QVElPTlM9Ii0tZGlyICRzcmN0cmVlICRDT0NDSUlOQ0xVREUiCi0gICAgZWxzZQotICAgICAgICBPUFRJT05TPSItLWRpciAkS0JVSUxEX0VYVE1PRCAkQ09DQ0lJTkNMVURFIgotICAgIGZpCi0KLUtCVUlMRF9FWFRNT0QgaXMgc2V0IHdoZW4gYW4gZXhwbGljaXQgdGFyZ2V0IHdpdGggTT0gaXMgdXNlZC4gRm9yIGJvdGggY2FzZXMKLXRoZSBzcGF0Y2ggLS1kaXIgYXJndW1lbnQgaXMgdXNlZCwgYXMgc3VjaCB0aGlyZCBydWxlIGFwcGxpZXMgd2hlbiB3aGV0aGVyIE09Ci1pcyB1c2VkIG9yIG5vdCwgYW5kIHdoZW4gTT0gaXMgdXNlZCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBjYW4gaGF2ZSBpdHMgb3duCi0uY29jY2ljb25maWcgZmlsZS4gV2hlbiBNPSBpcyBub3QgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIGNvY2NpY2hlY2sgdGhlCi10YXJnZXQgZGlyZWN0b3J5IGlzIHRoZSBzYW1lIGFzIHRoZSBkaXJlY3RvcnkgZnJvbSB3aGVyZSBzcGF0Y2ggd2FzIGNhbGxlZC4KLQotSWYgbm90IHVzaW5nIHRoZSBrZXJuZWwncyBjb2NjaWNoZWNrIHRhcmdldCwga2VlcCB0aGUgYWJvdmUgcHJlY2VkZW5jZQotb3JkZXIgbG9naWMgb2YgLmNvY2NpY29uZmlnIHJlYWRpbmcuIElmIHVzaW5nIHRoZSBrZXJuZWwncyBjb2NjaWNoZWNrIHRhcmdldCwKLW92ZXJyaWRlIGFueSBvZiB0aGUga2VybmVsJ3MgLmNvY2NpY2hlY2sncyBzZXR0aW5ncyB1c2luZyBTUEZMQUdTLgotCi1XZSBoZWxwIENvY2NpbmVsbGUgd2hlbiB1c2VkIGFnYWluc3QgTGludXggd2l0aCBhIHNldCBvZiBzZW5zaWJsZSBkZWZhdWx0cwotb3B0aW9ucyBmb3IgTGludXggd2l0aCBvdXIgb3duIExpbnV4IC5jb2NjaWNvbmZpZy4gVGhpcyBoaW50cyB0byBjb2NjaW5lbGxlCi1naXQgY2FuIGJlIHVzZWQgZm9yICdnaXQgZ3JlcCcgcXVlcmllcyBvdmVyIGNvY2NpZ3JlcC4gQSB0aW1lb3V0IG9mIDIwMAotc2Vjb25kcyBzaG91bGQgc3VmZmljZSBmb3Igbm93LgotCi1UaGUgb3B0aW9ucyBwaWNrZWQgdXAgYnkgY29jY2luZWxsZSB3aGVuIHJlYWRpbmcgYSAuY29jY2ljb25maWcgZG8gbm90IGFwcGVhcgotYXMgYXJndW1lbnRzIHRvIHNwYXRjaCBwcm9jZXNzZXMgcnVubmluZyBvbiB5b3VyIHN5c3RlbSwgdG8gY29uZmlybSB3aGF0Ci1vcHRpb25zIHdpbGwgYmUgdXNlZCBieSBDb2NjaW5lbGxlIHJ1bjoKLQotICAgICAgc3BhdGNoIC0tcHJpbnQtb3B0aW9ucy1vbmx5Ci0KLVlvdSBjYW4gb3ZlcnJpZGUgd2l0aCB5b3VyIG93biBwcmVmZXJyZWQgaW5kZXggb3B0aW9uIGJ5IHVzaW5nIFNQRkxBR1MuIFRha2UKLW5vdGUgdGhhdCB3aGVuIHRoZXJlIGFyZSBjb25mbGljdGluZyBvcHRpb25zIENvY2NpbmVsbGUgdGFrZXMgcHJlY2VkZW5jZSBmb3IKLXRoZSBsYXN0IG9wdGlvbnMgcGFzc2VkLiBVc2luZyAuY29jY2ljb25maWcgaXMgcG9zc2libGUgdG8gdXNlIGlkdXRpbHMsIGhvd2V2ZXIKLWdpdmVuIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGZvbGxvd2VkIGJ5IENvY2NpbmVsbGUsIHNpbmNlIHRoZSBrZXJuZWwgbm93Ci1jYXJyaWVzIGl0cyBvd24gLmNvY2NpY29uZmlnLCB5b3Ugd2lsbCBuZWVkIHRvIHVzZSBTUEZMQUdTIHRvIHVzZSBpZHV0aWxzIGlmCi1kZXNpcmVkLiBTZWUgYmVsb3cgc2VjdGlvbiAiQWRkaXRpb25hbCBmbGFncyIgZm9yIG1vcmUgZGV0YWlscyBvbiBob3cgdG8gdXNlCi1pZHV0aWxzLgotCi0gQWRkaXRpb25hbCBmbGFncwotfn5+fn5+fn5+fn5+fn5+fn5+Ci0KLUFkZGl0aW9uYWwgZmxhZ3MgY2FuIGJlIHBhc3NlZCB0byBzcGF0Y2ggdGhyb3VnaCB0aGUgU1BGTEFHUwotdmFyaWFibGUuIFRoaXMgd29ya3MgYXMgQ29jY2luZWxsZSByZXNwZWN0cyB0aGUgbGFzdCBmbGFncwotZ2l2ZW4gdG8gaXQgd2hlbiBvcHRpb25zIGFyZSBpbiBjb25mbGljdC4KLQotICAgIG1ha2UgU1BGTEFHUz0tLXVzZS1nbGltcHNlIGNvY2NpY2hlY2sKLQotQ29jY2luZWxsZSBzdXBwb3J0cyBpZHV0aWxzIGFzIHdlbGwgYnV0IHJlcXVpcmVzIGNvY2NpbmVsbGUgPj0gMS4wLjYuCi1XaGVuIG5vIElEIGZpbGUgaXMgc3BlY2lmaWVkIGNvY2NpbmVsbGUgYXNzdW1lcyB5b3VyIElEIGRhdGFiYXNlIGZpbGUKLWlzIGluIHRoZSBmaWxlIC5pZC11dGlscy5pbmRleCBvbiB0aGUgdG9wIGxldmVsIG9mIHRoZSBrZXJuZWwsIGNvY2NpbmVsbGUKLWNhcnJpZXMgYSBzY3JpcHQgc2NyaXB0cy9pZHV0aWxzX2luZGV4LnNoIHdoaWNoIGNyZWF0ZXMgdGhlIGRhdGFiYXNlIHdpdGgKLQotICAgIG1raWQgLWkgQyAtLW91dHB1dCAuaWQtdXRpbHMuaW5kZXgKLQotSWYgeW91IGhhdmUgYW5vdGhlciBkYXRhYmFzZSBmaWxlbmFtZSB5b3UgY2FuIGFsc28ganVzdCBzeW1saW5rIHdpdGggdGhpcwotbmFtZS4KLQotICAgIG1ha2UgU1BGTEFHUz0tLXVzZS1pZHV0aWxzIGNvY2NpY2hlY2sKLQotQWx0ZXJuYXRpdmVseSB5b3UgY2FuIHNwZWNpZnkgdGhlIGRhdGFiYXNlIGZpbGVuYW1lIGV4cGxpY2l0bHksIGZvcgotaW5zdGFuY2U6Ci0KLSAgICBtYWtlIFNQRkxBR1M9Ii0tdXNlLWlkdXRpbHMgL2Z1bGwtcGF0aC90by9JRCIgY29jY2ljaGVjawotCi1TZWUgc3BhdGNoIC0taGVscCB0byBsZWFybiBtb3JlIGFib3V0IHNwYXRjaCBvcHRpb25zLgotCi1Ob3RlIHRoYXQgdGhlICctLXVzZS1nbGltcHNlJyBhbmQgJy0tdXNlLWlkdXRpbHMnIG9wdGlvbnMKLXJlcXVpcmUgZXh0ZXJuYWwgdG9vbHMgZm9yIGluZGV4aW5nIHRoZSBjb2RlLiBOb25lIG9mIHRoZW0gaXMKLXRodXMgYWN0aXZlIGJ5IGRlZmF1bHQuIEhvd2V2ZXIsIGJ5IGluZGV4aW5nIHRoZSBjb2RlIHdpdGgKLW9uZSBvZiB0aGVzZSB0b29scywgYW5kIGFjY29yZGluZyB0byB0aGUgY29jY2kgZmlsZSB1c2VkLAotc3BhdGNoIGNvdWxkIHByb2NlZWQgdGhlIGVudGlyZSBjb2RlIGJhc2UgbW9yZSBxdWlja2x5LgotCi0gU21QTCBwYXRjaCBzcGVjaWZpYyBvcHRpb25zCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotCi1TbVBMIHBhdGNoZXMgY2FuIGhhdmUgdGhlaXIgb3duIHJlcXVpcmVtZW50cyBmb3Igb3B0aW9ucyBwYXNzZWQKLXRvIENvY2NpbmVsbGUuIFNtUEwgcGF0Y2ggc3BlY2lmaWMgb3B0aW9ucyBjYW4gYmUgcHJvdmlkZWQgYnkKLXByb3ZpZGluZyB0aGVtIGF0IHRoZSB0b3Agb2YgdGhlIFNtUEwgcGF0Y2gsIGZvciBpbnN0YW5jZToKLQotLy8gT3B0aW9uczogLS1uby1pbmNsdWRlcyAtLWluY2x1ZGUtaGVhZGVycwotCi0gU21QTCBwYXRjaCBDb2NjaW5lbGxlIHJlcXVpcmVtZW50cwotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0KLUFzIENvY2NpbmVsbGUgZmVhdHVyZXMgZ2V0IGFkZGVkIHNvbWUgbW9yZSBhZHZhbmNlZCBTbVBMIHBhdGNoZXMKLW1heSByZXF1aXJlIG5ld2VyIHZlcnNpb25zIG9mIENvY2NpbmVsbGUuIElmIGFuIFNtUEwgcGF0Y2ggcmVxdWlyZXMKLWF0IGxlYXN0IGEgdmVyc2lvbiBvZiBDb2NjaW5lbGxlLCB0aGlzIGNhbiBiZSBzcGVjaWZpZWQgYXMgZm9sbG93cywKLWFzIGFuIGV4YW1wbGUgaWYgcmVxdWlyaW5nIGF0IGxlYXN0IENvY2NpbmVsbGUgPj0gMS4wLjU6Ci0KLS8vIFJlcXVpcmVzOiAxLjAuNQotCi0gUHJvcG9zaW5nIG5ldyBzZW1hbnRpYyBwYXRjaGVzCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotCi1OZXcgc2VtYW50aWMgcGF0Y2hlcyBjYW4gYmUgcHJvcG9zZWQgYW5kIHN1Ym1pdHRlZCBieSBrZXJuZWwKLWRldmVsb3BlcnMuIEZvciBzYWtlIG9mIGNsYXJpdHksIHRoZXkgc2hvdWxkIGJlIG9yZ2FuaXplZCBpbiB0aGUKLXN1Yi1kaXJlY3RvcmllcyBvZiAnc2NyaXB0cy9jb2NjaW5lbGxlLycuCi0KLQotIERldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSAncmVwb3J0JyBtb2RlCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0KLSdyZXBvcnQnIGdlbmVyYXRlcyBhIGxpc3QgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6Ci0gIGZpbGU6bGluZTpjb2x1bW4tY29sdW1uOiBtZXNzYWdlCi0KLUV4YW1wbGU6Ci0KLVJ1bm5pbmcKLQotCW1ha2UgY29jY2ljaGVjayBNT0RFPXJlcG9ydCBDT0NDST1zY3JpcHRzL2NvY2NpbmVsbGUvYXBpL2Vycl9jYXN0LmNvY2NpCi0KLXdpbGwgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIHBhcnQgb2YgdGhlIFNtUEwgc2NyaXB0LgotCi08c21wbD4KLUByIGRlcGVuZHMgb24gIWNvbnRleHQgJiYgIXBhdGNoICYmIChvcmcgfHwgcmVwb3J0KUAKLWV4cHJlc3Npb24geDsKLXBvc2l0aW9uIHA7Ci1AQAotCi0gRVJSX1BUUkBwKFBUUl9FUlIoeCkpCi0KLUBzY3JpcHQ6cHl0aG9uIGRlcGVuZHMgb24gcmVwb3J0QAotcCA8PCByLnA7Ci14IDw8IHIueDsKLUBACi0KLW1zZz0iRVJSX0NBU1QgY2FuIGJlIHVzZWQgd2l0aCAlcyIgJSAoeCkKLWNvY2NpbGliLnJlcG9ydC5wcmludF9yZXBvcnQocFswXSwgbXNnKQotPC9zbXBsPgotCi1UaGlzIFNtUEwgZXhjZXJwdCBnZW5lcmF0ZXMgZW50cmllcyBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LCBhcwotaWxsdXN0cmF0ZWQgYmVsb3c6Ci0KLS9ob21lL3VzZXIvbGludXgvY3J5cHRvL2N0ci5jOjE4ODo5LTE2OiBFUlJfQ0FTVCBjYW4gYmUgdXNlZCB3aXRoIGFsZwotL2hvbWUvdXNlci9saW51eC9jcnlwdG8vYXV0aGVuYy5jOjYxOTo5LTE2OiBFUlJfQ0FTVCBjYW4gYmUgdXNlZCB3aXRoIGF1dGgKLS9ob21lL3VzZXIvbGludXgvY3J5cHRvL3h0cy5jOjIyNzo5LTE2OiBFUlJfQ0FTVCBjYW4gYmUgdXNlZCB3aXRoIGFsZwotCi0KLSBEZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgJ3BhdGNoJyBtb2RlCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0KLVdoZW4gdGhlICdwYXRjaCcgbW9kZSBpcyBhdmFpbGFibGUsIGl0IHByb3Bvc2VzIGEgZml4IGZvciBlYWNoIHByb2JsZW0KLWlkZW50aWZpZWQuCi0KLUV4YW1wbGU6Ci0KLVJ1bm5pbmcKLQltYWtlIGNvY2NpY2hlY2sgTU9ERT1wYXRjaCBDT0NDST1zY3JpcHRzL2NvY2NpbmVsbGUvYXBpL2Vycl9jYXN0LmNvY2NpCi0KLXdpbGwgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIHBhcnQgb2YgdGhlIFNtUEwgc2NyaXB0LgotCi08c21wbD4KLUAgZGVwZW5kcyBvbiAhY29udGV4dCAmJiBwYXRjaCAmJiAhb3JnICYmICFyZXBvcnQgQAotZXhwcmVzc2lvbiB4OwotQEAKLQotLSBFUlJfUFRSKFBUUl9FUlIoeCkpCi0rIEVSUl9DQVNUKHgpCi08L3NtcGw+Ci0KLVRoaXMgU21QTCBleGNlcnB0IGdlbmVyYXRlcyBwYXRjaCBodW5rcyBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LCBhcwotaWxsdXN0cmF0ZWQgYmVsb3c6Ci0KLWRpZmYgLXUgLXAgYS9jcnlwdG8vY3RyLmMgYi9jcnlwdG8vY3RyLmMKLS0tLSBhL2NyeXB0by9jdHIuYyAyMDEwLTA1LTI2IDEwOjQ5OjM4LjAwMDAwMDAwMCArMDIwMAotKysrIGIvY3J5cHRvL2N0ci5jIDIwMTAtMDYtMDMgMjM6NDQ6NDkuMDAwMDAwMDAwICswMjAwCi1AQCAtMTg1LDcgKzE4NSw3IEBAIHN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2luc3RhbmNlICpjcnlwdG9fY3QKLSAJYWxnID0gY3J5cHRvX2F0dHJfYWxnKHRiWzFdLCBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSLAotIAkJCQkgIENSWVBUT19BTEdfVFlQRV9NQVNLKTsKLSAJaWYgKElTX0VSUihhbGcpKQotLQkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihhbGcpKTsKLSsJCXJldHVybiBFUlJfQ0FTVChhbGcpOwotIAotIAkvKiBCbG9jayBzaXplIG11c3QgYmUgPj0gNCBieXRlcy4gKi8KLSAJZXJyID0gLUVJTlZBTDsKLQotIERldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSAnY29udGV4dCcgbW9kZQotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotCi0nY29udGV4dCcgaGlnaGxpZ2h0cyBsaW5lcyBvZiBpbnRlcmVzdCBhbmQgdGhlaXIgY29udGV4dAotaW4gYSBkaWZmLWxpa2Ugc3R5bGUuCi0KLU5PVEU6IFRoZSBkaWZmLWxpa2Ugb3V0cHV0IGdlbmVyYXRlZCBpcyBOT1QgYW4gYXBwbGljYWJsZSBwYXRjaC4gVGhlCi0gICAgICBpbnRlbnQgb2YgdGhlICdjb250ZXh0JyBtb2RlIGlzIHRvIGhpZ2hsaWdodCB0aGUgaW1wb3J0YW50IGxpbmVzCi0gICAgICAoYW5ub3RhdGVkIHdpdGggbWludXMsICctJykgYW5kIGdpdmVzIHNvbWUgc3Vycm91bmRpbmcgY29udGV4dAotICAgICAgbGluZXMgYXJvdW5kLiBUaGlzIG91dHB1dCBjYW4gYmUgdXNlZCB3aXRoIHRoZSBkaWZmIG1vZGUgb2YKLSAgICAgIEVtYWNzIHRvIHJldmlldyB0aGUgY29kZS4KLQotRXhhbXBsZToKLQotUnVubmluZwotCW1ha2UgY29jY2ljaGVjayBNT0RFPWNvbnRleHQgQ09DQ0k9c2NyaXB0cy9jb2NjaW5lbGxlL2FwaS9lcnJfY2FzdC5jb2NjaQotCi13aWxsIGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBwYXJ0IG9mIHRoZSBTbVBMIHNjcmlwdC4KLQotPHNtcGw+Ci1AIGRlcGVuZHMgb24gY29udGV4dCAmJiAhcGF0Y2ggJiYgIW9yZyAmJiAhcmVwb3J0QAotZXhwcmVzc2lvbiB4OwotQEAKLQotKiBFUlJfUFRSKFBUUl9FUlIoeCkpCi08L3NtcGw+Ci0KLVRoaXMgU21QTCBleGNlcnB0IGdlbmVyYXRlcyBkaWZmIGh1bmtzIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQsIGFzCi1pbGx1c3RyYXRlZCBiZWxvdzoKLQotZGlmZiAtdSAtcCAvaG9tZS91c2VyL2xpbnV4L2NyeXB0by9jdHIuYyAvdG1wL25vdGhpbmcKLS0tLSAvaG9tZS91c2VyL2xpbnV4L2NyeXB0by9jdHIuYwkyMDEwLTA1LTI2IDEwOjQ5OjM4LjAwMDAwMDAwMCArMDIwMAotKysrIC90bXAvbm90aGluZwotQEAgLTE4NSw3ICsxODUsNiBAQCBzdGF0aWMgc3RydWN0IGNyeXB0b19pbnN0YW5jZSAqY3J5cHRvX2N0Ci0gCWFsZyA9IGNyeXB0b19hdHRyX2FsZyh0YlsxXSwgQ1JZUFRPX0FMR19UWVBFX0NJUEhFUiwKLSAJCQkJICBDUllQVE9fQUxHX1RZUEVfTUFTSyk7Ci0gCWlmIChJU19FUlIoYWxnKSkKLS0JCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoYWxnKSk7Ci0gCi0gCS8qIEJsb2NrIHNpemUgbXVzdCBiZSA+PSA0IGJ5dGVzLiAqLwotIAllcnIgPSAtRUlOVkFMOwotCi0gRGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlICdvcmcnIG1vZGUKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLQotJ29yZycgZ2VuZXJhdGVzIGEgcmVwb3J0IGluIHRoZSBPcmcgbW9kZSBmb3JtYXQgb2YgRW1hY3MuCi0KLUV4YW1wbGU6Ci0KLVJ1bm5pbmcKLQltYWtlIGNvY2NpY2hlY2sgTU9ERT1vcmcgQ09DQ0k9c2NyaXB0cy9jb2NjaW5lbGxlL2FwaS9lcnJfY2FzdC5jb2NjaQotCi13aWxsIGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBwYXJ0IG9mIHRoZSBTbVBMIHNjcmlwdC4KLQotPHNtcGw+Ci1AciBkZXBlbmRzIG9uICFjb250ZXh0ICYmICFwYXRjaCAmJiAob3JnIHx8IHJlcG9ydClACi1leHByZXNzaW9uIHg7Ci1wb3NpdGlvbiBwOwotQEAKLQotIEVSUl9QVFJAcChQVFJfRVJSKHgpKQotCi1Ac2NyaXB0OnB5dGhvbiBkZXBlbmRzIG9uIG9yZ0AKLXAgPDwgci5wOwoteCA8PCByLng7Ci1AQAotCi1tc2c9IkVSUl9DQVNUIGNhbiBiZSB1c2VkIHdpdGggJXMiICUgKHgpCi1tc2dfc2FmZT1tc2cucmVwbGFjZSgiWyIsIkAoIikucmVwbGFjZSgiXSIsIikiKQotY29jY2lsaWIub3JnLnByaW50X3RvZG8ocFswXSwgbXNnX3NhZmUpCi08L3NtcGw+Ci0KLVRoaXMgU21QTCBleGNlcnB0IGdlbmVyYXRlcyBPcmcgZW50cmllcyBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LCBhcwotaWxsdXN0cmF0ZWQgYmVsb3c6Ci0KLSogVE9ETyBbW3ZpZXc6L2hvbWUvdXNlci9saW51eC9jcnlwdG8vY3RyLmM6OmZhY2U9b3ZsLWZhY2UxOjpsaW5iPTE4ODo6Y29sYj05Ojpjb2xlPTE2XVtFUlJfQ0FTVCBjYW4gYmUgdXNlZCB3aXRoIGFsZ11dCi0qIFRPRE8gW1t2aWV3Oi9ob21lL3VzZXIvbGludXgvY3J5cHRvL2F1dGhlbmMuYzo6ZmFjZT1vdmwtZmFjZTE6OmxpbmI9NjE5Ojpjb2xiPTk6OmNvbGU9MTZdW0VSUl9DQVNUIGNhbiBiZSB1c2VkIHdpdGggYXV0aF1dCi0qIFRPRE8gW1t2aWV3Oi9ob21lL3VzZXIvbGludXgvY3J5cHRvL3h0cy5jOjpmYWNlPW92bC1mYWNlMTo6bGluYj0yMjc6OmNvbGI9OTo6Y29sZT0xNl1bRVJSX0NBU1QgY2FuIGJlIHVzZWQgd2l0aCBhbGddXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb25mLnB5IGIvRG9jdW1lbnRhdGlvbi9jb25mLnB5CmluZGV4IDk2YjdhYTYuLjBjYzg3NjUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY29uZi5weQorKysgYi9Eb2N1bWVudGF0aW9uL2NvbmYucHkKQEAgLTE0LDExICsxNCwxNyBAQAogCiBpbXBvcnQgc3lzCiBpbXBvcnQgb3MKK2ltcG9ydCBzcGhpbngKKworIyBHZXQgU3BoaW54IHZlcnNpb24KK21ham9yLCBtaW5vciwgcGF0Y2ggPSBtYXAoaW50LCBzcGhpbnguX192ZXJzaW9uX18uc3BsaXQoIi4iKSkKKwogCiAjIElmIGV4dGVuc2lvbnMgKG9yIG1vZHVsZXMgdG8gZG9jdW1lbnQgd2l0aCBhdXRvZG9jKSBhcmUgaW4gYW5vdGhlciBkaXJlY3RvcnksCiAjIGFkZCB0aGVzZSBkaXJlY3RvcmllcyB0byBzeXMucGF0aCBoZXJlLiBJZiB0aGUgZGlyZWN0b3J5IGlzIHJlbGF0aXZlIHRvIHRoZQogIyBkb2N1bWVudGF0aW9uIHJvb3QsIHVzZSBvcy5wYXRoLmFic3BhdGggdG8gbWFrZSBpdCBhYnNvbHV0ZSwgbGlrZSBzaG93biBoZXJlLgogc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguYWJzcGF0aCgnc3BoaW54JykpCitmcm9tIGxvYWRfY29uZmlnIGltcG9ydCBsb2FkQ29uZmlnCiAKICMgLS0gR2VuZXJhbCBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0yOCwxNCArMzQsMTMgQEAKICMgQWRkIGFueSBTcGhpbnggZXh0ZW5zaW9uIG1vZHVsZSBuYW1lcyBoZXJlLCBhcyBzdHJpbmdzLiBUaGV5IGNhbiBiZQogIyBleHRlbnNpb25zIGNvbWluZyB3aXRoIFNwaGlueCAobmFtZWQgJ3NwaGlueC5leHQuKicpIG9yIHlvdXIgY3VzdG9tCiAjIG9uZXMuCi1leHRlbnNpb25zID0gWydrZXJuZWwtZG9jJywgJ3JzdEZsYXRUYWJsZScsICdrZXJuZWxfaW5jbHVkZSddCitleHRlbnNpb25zID0gWydrZXJuZWwtZG9jJywgJ3JzdEZsYXRUYWJsZScsICdrZXJuZWxfaW5jbHVkZScsICdjZG9tYWluJ10KIAotIyBHcmFjZWZ1bGx5IGhhbmRsZSBtaXNzaW5nIHJzdDJwZGYuCi10cnk6Ci0gICAgaW1wb3J0IHJzdDJwZGYKLSAgICBleHRlbnNpb25zICs9IFsncnN0MnBkZi5wZGZidWlsZGVyJ10KLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICBwYXNzCisjIFRoZSBuYW1lIG9mIHRoZSBtYXRoIGV4dGVuc2lvbiBjaGFuZ2VkIG9uIFNwaGlueCAxLjQKK2lmIG1pbm9yID4gMzoKKyAgICBleHRlbnNpb25zLmFwcGVuZCgic3BoaW54LmV4dC5pbWdtYXRoIikKK2Vsc2U6CisgICAgZXh0ZW5zaW9ucy5hcHBlbmQoInNwaGlueC5leHQucG5nbWF0aCIpCiAKICMgQWRkIGFueSBwYXRocyB0aGF0IGNvbnRhaW4gdGVtcGxhdGVzIGhlcmUsIHJlbGF0aXZlIHRvIHRoaXMgZGlyZWN0b3J5LgogdGVtcGxhdGVzX3BhdGggPSBbJ190ZW1wbGF0ZXMnXQpAQCAtMTMxLDcgKzEzNiw3IEBACiB0b2RvX2luY2x1ZGVfdG9kb3MgPSBGYWxzZQogCiBwcmltYXJ5X2RvbWFpbiA9ICdDJwotaGlnaGxpZ2h0X2xhbmd1YWdlID0gJ0MnCitoaWdobGlnaHRfbGFuZ3VhZ2UgPSAnZ3Vlc3MnCiAKICMgLS0gT3B0aW9ucyBmb3IgSFRNTCBvdXRwdXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0yNTIsMjMgKzI1Nyw5MCBAQAogCiBsYXRleF9lbGVtZW50cyA9IHsKICMgVGhlIHBhcGVyIHNpemUgKCdsZXR0ZXJwYXBlcicgb3IgJ2E0cGFwZXInKS4KLSMncGFwZXJzaXplJzogJ2xldHRlcnBhcGVyJywKKydwYXBlcnNpemUnOiAnYTRwYXBlcicsCiAKICMgVGhlIGZvbnQgc2l6ZSAoJzEwcHQnLCAnMTFwdCcgb3IgJzEycHQnKS4KLSMncG9pbnRzaXplJzogJzEwcHQnLAotCi0jIEFkZGl0aW9uYWwgc3R1ZmYgZm9yIHRoZSBMYVRlWCBwcmVhbWJsZS4KLSMncHJlYW1ibGUnOiAnJywKKydwb2ludHNpemUnOiAnOHB0JywKIAogIyBMYXRleCBmaWd1cmUgKGZsb2F0KSBhbGlnbm1lbnQKICMnZmlndXJlX2FsaWduJzogJ2h0YnAnLAorCisjIERvbid0IG1hbmdsZSB3aXRoIFVURi04IGNoYXJzCisnaW5wdXRlbmMnOiAnJywKKyd1dGY4ZXh0cmEnOiAnJywKKworIyBBZGRpdGlvbmFsIHN0dWZmIGZvciB0aGUgTGFUZVggcHJlYW1ibGUuCisgICAgJ3ByZWFtYmxlJzogJycnCisJJSBBZGp1c3QgbWFyZ2lucworCVxcdXNlcGFja2FnZVttYXJnaW49MC41aW4sIHRvcD0xaW4sIGJvdHRvbT0xaW5de2dlb21ldHJ5fQorCisgICAgICAgICUgQWxsb3cgZ2VuZXJhdGUgc29tZSBwYWdlcyBpbiBsYW5kc2NhcGUKKyAgICAgICAgXFx1c2VwYWNrYWdle2xzY2FwZX0KKworICAgICAgICAlIFB1dCBub3RlcyBpbiBjb2xvciBhbmQgbGV0IHRoZW0gYmUgaW5zaWRlIGEgdGFibGUKKwlcXGRlZmluZWNvbG9ye05vdGVDb2xvcn17UkdCfXsyMDQsMjU1LDI1NX0KKwlcXGRlZmluZWNvbG9ye1dhcm5pbmdDb2xvcn17UkdCfXsyNTUsMjA0LDIwNH0KKwlcXGRlZmluZWNvbG9ye0F0dGVudGlvbkNvbG9yfXtSR0J9ezI1NSwyNTUsMjA0fQorCVxcZGVmaW5lY29sb3J7T3RoZXJDb2xvcn17UkdCfXsyMDQsMjA0LDIwNH0KKyAgICAgICAgXFxuZXdsZW5ndGh7XFxteW5vdGljZWxlbmd0aH0KKyAgICAgICAgXFxtYWtlYXRsZXR0ZXJcXG5ld2Vudmlyb25tZW50e2NvbG9yZWRib3h9WzFdeyUKKwkgICBcXHNldGxlbmd0aHtcXGZib3hydWxlfXsxcHR9CisJICAgXFxzZXRsZW5ndGh7XFxmYm94c2VwfXs3cHR9CisJICAgXFxzZXRsZW5ndGh7XFxteW5vdGljZWxlbmd0aH17XFxsaW5ld2lkdGh9CisJICAgXFxhZGR0b2xlbmd0aHtcXG15bm90aWNlbGVuZ3RofXstMlxcZmJveHNlcH0KKwkgICBcXGFkZHRvbGVuZ3Roe1xcbXlub3RpY2VsZW5ndGh9ey0yXFxmYm94cnVsZX0KKyAgICAgICAgICAgXFxiZWdpbntscmJveH17XFxAdGVtcGJveGF9XFxiZWdpbnttaW5pcGFnZX17XFxteW5vdGljZWxlbmd0aH19e1xcZW5ke21pbmlwYWdlfVxcZW5ke2xyYm94fSUKKwkgICBcXGlmdGhlbmVsc2UlCisJICAgICAge1xcZXF1YWx7XFxweUBub3RpY2V0eXBlfXtub3RlfX0lCisJICAgICAge1xcY29sb3Jib3h7Tm90ZUNvbG9yfXtcXHVzZWJveHtcXEB0ZW1wYm94YX19fSUKKwkgICAgICB7JQorCSAgICAgICAgIFxcaWZ0aGVuZWxzZSUKKwkgICAgICAgICB7XFxlcXVhbHtcXHB5QG5vdGljZXR5cGV9e3dhcm5pbmd9fSUKKwkgICAgICAgICB7XFxjb2xvcmJveHtXYXJuaW5nQ29sb3J9e1xcdXNlYm94e1xcQHRlbXBib3hhfX19JQorCQkgeyUKKwkgICAgICAgICAgICBcXGlmdGhlbmVsc2UlCisJICAgICAgICAgICAge1xcZXF1YWx7XFxweUBub3RpY2V0eXBlfXthdHRlbnRpb259fSUKKwkgICAgICAgICAgICB7XFxjb2xvcmJveHtBdHRlbnRpb25Db2xvcn17XFx1c2Vib3h7XFxAdGVtcGJveGF9fX0lCisJICAgICAgICAgICAge1xcY29sb3Jib3h7T3RoZXJDb2xvcn17XFx1c2Vib3h7XFxAdGVtcGJveGF9fX0lCisJCSB9JQorCSAgICAgIH0lCisgICAgICAgIH1cXG1ha2VhdG90aGVyCisKKyAgICAgICAgXFxtYWtlYXRsZXR0ZXIKKyAgICAgICAgXFxyZW5ld2Vudmlyb25tZW50e25vdGljZX1bMl17JQorICAgICAgICAgIFxcZGVmXFxweUBub3RpY2V0eXBleyMxfQorICAgICAgICAgIFxcYmVnaW57Y29sb3JlZGJveH17IzF9CisgICAgICAgICAgXFxiZlxcaXQKKyAgICAgICAgICBcXHBhclxcc3Ryb25neyMyfQorICAgICAgICAgIFxcY3NuYW1lIHB5QG5vdGljZXN0YXJ0QCMxXFxlbmRjc25hbWUKKyAgICAgICAgfQorCXsKKyAgICAgICAgICBcXGNzbmFtZSBweUBub3RpY2VlbmRAXFxweUBub3RpY2V0eXBlXFxlbmRjc25hbWUKKyAgICAgICAgICBcXGVuZHtjb2xvcmVkYm94fQorICAgICAgICB9CisJXFxtYWtlYXRvdGhlcgorCisJJSBVc2Ugc29tZSBmb250IHdpdGggVVRGLTggc3VwcG9ydCB3aXRoIFhlTGFUZVgKKyAgICAgICAgXFx1c2VwYWNrYWdle2ZvbnRzcGVjfQorICAgICAgICBcXHNldHNhbnNmb250e0RlamFWdSBTZXJpZn0KKyAgICAgICAgXFxzZXRyb21hbmZvbnR7RGVqYVZ1IFNhbnN9CisgICAgICAgIFxcc2V0bW9ub2ZvbnR7RGVqYVZ1IFNhbnMgTW9ub30KKworCSUgVG8gYWxsb3cgYWRqdXN0aW5nIHRhYmxlIHNpemVzCisJXFx1c2VwYWNrYWdle2FkanVzdGJveH0KKworICAgICAnJycKIH0KIAogIyBHcm91cGluZyB0aGUgZG9jdW1lbnQgdHJlZSBpbnRvIExhVGVYIGZpbGVzLiBMaXN0IG9mIHR1cGxlcwogIyAoc291cmNlIHN0YXJ0IGZpbGUsIHRhcmdldCBuYW1lLCB0aXRsZSwKICMgIGF1dGhvciwgZG9jdW1lbnRjbGFzcyBbaG93dG8sIG1hbnVhbCwgb3Igb3duIGNsYXNzXSkuCiBsYXRleF9kb2N1bWVudHMgPSBbCi0gICAgKG1hc3Rlcl9kb2MsICdUaGVMaW51eEtlcm5lbC50ZXgnLCAnVGhlIExpbnV4IEtlcm5lbCBEb2N1bWVudGF0aW9uJywKKyAgICAoJ2tlcm5lbC1kb2N1bWVudGF0aW9uJywgJ2tlcm5lbC1kb2N1bWVudGF0aW9uLnRleCcsICdUaGUgTGludXggS2VybmVsIERvY3VtZW50YXRpb24nLAorICAgICAnVGhlIGtlcm5lbCBkZXZlbG9wbWVudCBjb21tdW5pdHknLCAnbWFudWFsJyksCisgICAgKCdkZXZlbG9wbWVudC1wcm9jZXNzL2luZGV4JywgJ2RldmVsb3BtZW50LXByb2Nlc3MudGV4JywgJ0xpbnV4IEtlcm5lbCBEZXZlbG9wbWVudCBEb2N1bWVudGF0aW9uJywKKyAgICAgJ1RoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgY29tbXVuaXR5JywgJ21hbnVhbCcpLAorICAgICgnZ3B1L2luZGV4JywgJ2dwdS50ZXgnLCAnTGludXggR1BVIERyaXZlciBEZXZlbG9wZXJcJ3MgR3VpZGUnLAogICAgICAnVGhlIGtlcm5lbCBkZXZlbG9wbWVudCBjb21tdW5pdHknLCAnbWFudWFsJyksCiBdCiAKQEAgLTQxOSwzICs0OTEsOSBAQAogIyBsaW5lIGFyZ3VtZW50cy4KIGtlcm5lbGRvY19iaW4gPSAnLi4vc2NyaXB0cy9rZXJuZWwtZG9jJwoga2VybmVsZG9jX3NyY3RyZWUgPSAnLi4nCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNpbmNlIGxvYWRDb25maWcgb3ZlcndyaXRlcyBzZXR0aW5ncyBmcm9tIHRoZSBnbG9iYWwgbmFtZXNwYWNlLCBpdCBoYXMgdG8gYmUKKyMgdGhlIGxhc3Qgc3RhdGVtZW50IGluIHRoZSBjb25mLnB5IGZpbGUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitsb2FkQ29uZmlnKGdsb2JhbHMoKSkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY3B1LWZyZXEvY3B1ZnJlcS1zdGF0cy50eHQgYi9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2NwdWZyZXEtc3RhdHMudHh0CmluZGV4IGZjNjQ3NDkuLjhkOTc3M2YgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY3B1LWZyZXEvY3B1ZnJlcS1zdGF0cy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS9jcHVmcmVxLXN0YXRzLnR4dApAQCAtMTAzLDcgKzEwMyw3IEBACiAJUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIChBQ1BJLCBBUE0pICAtLS0+CiAJCUNQVSBGcmVxdWVuY3kgc2NhbGluZyAgLS0tPgogCQkJWypdIENQVSBGcmVxdWVuY3kgc2NhbGluZwotCQkJPCo+ICAgQ1BVIGZyZXF1ZW5jeSB0cmFuc2xhdGlvbiBzdGF0aXN0aWNzIAorCQkJWypdICAgQ1BVIGZyZXF1ZW5jeSB0cmFuc2xhdGlvbiBzdGF0aXN0aWNzCiAJCQlbKl0gICAgIENQVSBmcmVxdWVuY3kgdHJhbnNsYXRpb24gc3RhdGlzdGljcyBkZXRhaWxzCiAKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMvY29jY2luZWxsZS5yc3QgYi9Eb2N1bWVudGF0aW9uL2Rldi10b29scy9jb2NjaW5lbGxlLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTY0YjRjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMvY29jY2luZWxsZS5yc3QKQEAgLTAsMCArMSw0OTEgQEAKKy4uIENvcHlyaWdodCAyMDEwIE5pY29sYXMgUGFsaXggPG5wYWxpeEBkaWt1LmRrPgorLi4gQ29weXJpZ2h0IDIwMTAgSnVsaWEgTGF3YWxsIDxqdWxpYUBkaWt1LmRrPgorLi4gQ29weXJpZ2h0IDIwMTAgR2lsbGVzIE11bGxlciA8R2lsbGVzLk11bGxlckBsaXA2LmZyPgorCisuLiBoaWdobGlnaHQ6OiBub25lCisKK0NvY2NpbmVsbGUKKz09PT09PT09PT0KKworQ29jY2luZWxsZSBpcyBhIHRvb2wgZm9yIHBhdHRlcm4gbWF0Y2hpbmcgYW5kIHRleHQgdHJhbnNmb3JtYXRpb24gdGhhdCBoYXMKK21hbnkgdXNlcyBpbiBrZXJuZWwgZGV2ZWxvcG1lbnQsIGluY2x1ZGluZyB0aGUgYXBwbGljYXRpb24gb2YgY29tcGxleCwKK3RyZWUtd2lkZSBwYXRjaGVzIGFuZCBkZXRlY3Rpb24gb2YgcHJvYmxlbWF0aWMgcHJvZ3JhbW1pbmcgcGF0dGVybnMuCisKK0dldHRpbmcgQ29jY2luZWxsZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgc2VtYW50aWMgcGF0Y2hlcyBpbmNsdWRlZCBpbiB0aGUga2VybmVsIHVzZSBmZWF0dXJlcyBhbmQgb3B0aW9ucword2hpY2ggYXJlIHByb3ZpZGVkIGJ5IENvY2NpbmVsbGUgdmVyc2lvbiAxLjAuMC1yYzExIGFuZCBhYm92ZS4KK1VzaW5nIGVhcmxpZXIgdmVyc2lvbnMgd2lsbCBmYWlsIGFzIHRoZSBvcHRpb24gbmFtZXMgdXNlZCBieQordGhlIENvY2NpbmVsbGUgZmlsZXMgYW5kIGNvY2NpY2hlY2sgaGF2ZSBiZWVuIHVwZGF0ZWQuCisKK0NvY2NpbmVsbGUgaXMgYXZhaWxhYmxlIHRocm91Z2ggdGhlIHBhY2thZ2UgbWFuYWdlcgorb2YgbWFueSBkaXN0cmlidXRpb25zLCBlLmcuIDoKKworIC0gRGViaWFuCisgLSBGZWRvcmEKKyAtIFVidW50dQorIC0gT3BlblNVU0UKKyAtIEFyY2ggTGludXgKKyAtIE5ldEJTRAorIC0gRnJlZUJTRAorCitZb3UgY2FuIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gcmVsZWFzZWQgZnJvbSB0aGUgQ29jY2luZWxsZSBob21lcGFnZSBhdAoraHR0cDovL2NvY2NpbmVsbGUubGlwNi5mci8KKworSW5mb3JtYXRpb24gYW5kIHRpcHMgYWJvdXQgQ29jY2luZWxsZSBhcmUgYWxzbyBwcm92aWRlZCBvbiB0aGUgd2lraQorcGFnZXMgYXQgaHR0cDovL2NvY2NpLmVrc3RyYW5ldC5kaWt1LmRrL3dpa2kvZG9rdS5waHAKKworT25jZSB5b3UgaGF2ZSBpdCwgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDo6CisKKyAgICAgCS4vY29uZmlndXJlCisgICAgICAgIG1ha2UKKworYXMgYSByZWd1bGFyIHVzZXIsIGFuZCBpbnN0YWxsIGl0IHdpdGg6OgorCisgICAgICAgIHN1ZG8gbWFrZSBpbnN0YWxsCisKK1N1cHBsZW1lbnRhbCBkb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRm9yIHN1cHBsZW1lbnRhbCBkb2N1bWVudGF0aW9uIHJlZmVyIHRvIHRoZSB3aWtpOgorCitodHRwczovL2JvdHRlc3Qud2lraS5rZXJuZWwub3JnL2NvY2NpY2hlY2sKKworVGhlIHdpa2kgZG9jdW1lbnRhdGlvbiBhbHdheXMgcmVmZXJzIHRvIHRoZSBsaW51eC1uZXh0IHZlcnNpb24gb2YgdGhlIHNjcmlwdC4KKworVXNpbmcgQ29jY2luZWxsZSBvbiB0aGUgTGludXgga2VybmVsCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQSBDb2NjaW5lbGxlLXNwZWNpZmljIHRhcmdldCBpcyBkZWZpbmVkIGluIHRoZSB0b3AgbGV2ZWwKK01ha2VmaWxlLiBUaGlzIHRhcmdldCBpcyBuYW1lZCBgYGNvY2NpY2hlY2tgYCBhbmQgY2FsbHMgdGhlIGBgY29jY2ljaGVja2BgCitmcm9udC1lbmQgaW4gdGhlIGBgc2NyaXB0c2BgIGRpcmVjdG9yeS4KKworRm91ciBiYXNpYyBtb2RlcyBhcmUgZGVmaW5lZDogYGBwYXRjaGBgLCBgYHJlcG9ydGBgLCBgYGNvbnRleHRgYCwgYW5kCitgYG9yZ2BgLiBUaGUgbW9kZSB0byB1c2UgaXMgc3BlY2lmaWVkIGJ5IHNldHRpbmcgdGhlIE1PREUgdmFyaWFibGUgd2l0aAorYGBNT0RFPTxtb2RlPmBgLgorCistIGBgcGF0Y2hgYCBwcm9wb3NlcyBhIGZpeCwgd2hlbiBwb3NzaWJsZS4KKworLSBgYHJlcG9ydGBgIGdlbmVyYXRlcyBhIGxpc3QgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisgIGZpbGU6bGluZTpjb2x1bW4tY29sdW1uOiBtZXNzYWdlCisKKy0gYGBjb250ZXh0YGAgaGlnaGxpZ2h0cyBsaW5lcyBvZiBpbnRlcmVzdCBhbmQgdGhlaXIgY29udGV4dCBpbiBhCisgIGRpZmYtbGlrZSBzdHlsZS5MaW5lcyBvZiBpbnRlcmVzdCBhcmUgaW5kaWNhdGVkIHdpdGggYGAtYGAuCisKKy0gYGBvcmdgYCBnZW5lcmF0ZXMgYSByZXBvcnQgaW4gdGhlIE9yZyBtb2RlIGZvcm1hdCBvZiBFbWFjcy4KKworTm90ZSB0aGF0IG5vdCBhbGwgc2VtYW50aWMgcGF0Y2hlcyBpbXBsZW1lbnQgYWxsIG1vZGVzLiBGb3IgZWFzeSB1c2UKK29mIENvY2NpbmVsbGUsIHRoZSBkZWZhdWx0IG1vZGUgaXMgInJlcG9ydCIuCisKK1R3byBvdGhlciBtb2RlcyBwcm92aWRlIHNvbWUgY29tbW9uIGNvbWJpbmF0aW9ucyBvZiB0aGVzZSBtb2Rlcy4KKworLSBgYGNoYWluYGAgdHJpZXMgdGhlIHByZXZpb3VzIG1vZGVzIGluIHRoZSBvcmRlciBhYm92ZSB1bnRpbCBvbmUgc3VjY2VlZHMuCisKKy0gYGByZXArY3R4dGBgIHJ1bnMgc3VjY2Vzc2l2ZWx5IHRoZSByZXBvcnQgbW9kZSBhbmQgdGhlIGNvbnRleHQgbW9kZS4KKyAgSXQgc2hvdWxkIGJlIHVzZWQgd2l0aCB0aGUgQyBvcHRpb24gKGRlc2NyaWJlZCBsYXRlcikKKyAgd2hpY2ggY2hlY2tzIHRoZSBjb2RlIG9uIGEgZmlsZSBiYXNpcy4KKworRXhhbXBsZXMKK35+fn5+fn5+CisKK1RvIG1ha2UgYSByZXBvcnQgZm9yIGV2ZXJ5IHNlbWFudGljIHBhdGNoLCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOjoKKworCQltYWtlIGNvY2NpY2hlY2sgTU9ERT1yZXBvcnQKKworVG8gcHJvZHVjZSBwYXRjaGVzLCBydW46OgorCisJCW1ha2UgY29jY2ljaGVjayBNT0RFPXBhdGNoCisKKworVGhlIGNvY2NpY2hlY2sgdGFyZ2V0IGFwcGxpZXMgZXZlcnkgc2VtYW50aWMgcGF0Y2ggYXZhaWxhYmxlIGluIHRoZQorc3ViLWRpcmVjdG9yaWVzIG9mIGBgc2NyaXB0cy9jb2NjaW5lbGxlYGAgdG8gdGhlIGVudGlyZSBMaW51eCBrZXJuZWwuCisKK0ZvciBlYWNoIHNlbWFudGljIHBhdGNoLCBhIGNvbW1pdCBtZXNzYWdlIGlzIHByb3Bvc2VkLiAgSXQgZ2l2ZXMgYQorZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gYmVpbmcgY2hlY2tlZCBieSB0aGUgc2VtYW50aWMgcGF0Y2gsIGFuZAoraW5jbHVkZXMgYSByZWZlcmVuY2UgdG8gQ29jY2luZWxsZS4KKworQXMgYW55IHN0YXRpYyBjb2RlIGFuYWx5emVyLCBDb2NjaW5lbGxlIHByb2R1Y2VzIGZhbHNlCitwb3NpdGl2ZXMuIFRodXMsIHJlcG9ydHMgbXVzdCBiZSBjYXJlZnVsbHkgY2hlY2tlZCwgYW5kIHBhdGNoZXMKK3Jldmlld2VkLgorCitUbyBlbmFibGUgdmVyYm9zZSBtZXNzYWdlcyBzZXQgdGhlIFY9IHZhcmlhYmxlLCBmb3IgZXhhbXBsZTo6CisKKyAgIG1ha2UgY29jY2ljaGVjayBNT0RFPXJlcG9ydCBWPTEKKworQ29jY2luZWxsZSBwYXJhbGxlbGl6YXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCeSBkZWZhdWx0LCBjb2NjaWNoZWNrIHRyaWVzIHRvIHJ1biBhcyBwYXJhbGxlbCBhcyBwb3NzaWJsZS4gVG8gY2hhbmdlCit0aGUgcGFyYWxsZWxpc20sIHNldCB0aGUgSj0gdmFyaWFibGUuIEZvciBleGFtcGxlLCB0byBydW4gYWNyb3NzIDQgQ1BVczo6CisKKyAgIG1ha2UgY29jY2ljaGVjayBNT0RFPXJlcG9ydCBKPTQKKworQXMgb2YgQ29jY2luZWxsZSAxLjAuMiBDb2NjaW5lbGxlIHVzZXMgT2NhbWwgcGFybWFwIGZvciBwYXJhbGxlbGl6YXRpb24sCitpZiBzdXBwb3J0IGZvciB0aGlzIGlzIGRldGVjdGVkIHlvdSB3aWxsIGJlbmVmaXQgZnJvbSBwYXJtYXAgcGFyYWxsZWxpemF0aW9uLgorCitXaGVuIHBhcm1hcCBpcyBlbmFibGVkIGNvY2NpY2hlY2sgd2lsbCBlbmFibGUgZHluYW1pYyBsb2FkIGJhbGFuY2luZyBieSB1c2luZworYGAtLWNodW5rc2l6ZSAxYGAgYXJndW1lbnQsIHRoaXMgZW5zdXJlcyB3ZSBrZWVwIGZlZWRpbmcgdGhyZWFkcyB3aXRoIHdvcmsKK29uZSBieSBvbmUsIHNvIHRoYXQgd2UgYXZvaWQgdGhlIHNpdHVhdGlvbiB3aGVyZSBtb3N0IHdvcmsgZ2V0cyBkb25lIGJ5IG9ubHkKK2EgZmV3IHRocmVhZHMuIFdpdGggZHluYW1pYyBsb2FkIGJhbGFuY2luZywgaWYgYSB0aHJlYWQgZmluaXNoZXMgZWFybHkgd2Uga2VlcAorZmVlZGluZyBpdCBtb3JlIHdvcmsuCisKK1doZW4gcGFybWFwIGlzIGVuYWJsZWQsIGlmIGFuIGVycm9yIG9jY3VycyBpbiBDb2NjaW5lbGxlLCB0aGlzIGVycm9yCit2YWx1ZSBpcyBwcm9wYWdhdGVkIGJhY2ssIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGBgbWFrZSBjb2NjaWNoZWNrYGAKK2NhcHR1cmVzIHRoaXMgcmV0dXJuIHZhbHVlLgorCitVc2luZyBDb2NjaW5lbGxlIHdpdGggYSBzaW5nbGUgc2VtYW50aWMgcGF0Y2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgb3B0aW9uYWwgbWFrZSB2YXJpYWJsZSBDT0NDSSBjYW4gYmUgdXNlZCB0byBjaGVjayBhIHNpbmdsZQorc2VtYW50aWMgcGF0Y2guIEluIHRoYXQgY2FzZSwgdGhlIHZhcmlhYmxlIG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aAordGhlIG5hbWUgb2YgdGhlIHNlbWFudGljIHBhdGNoIHRvIGFwcGx5LgorCitGb3IgaW5zdGFuY2U6OgorCisJbWFrZSBjb2NjaWNoZWNrIENPQ0NJPTxteV9TUC5jb2NjaT4gTU9ERT1wYXRjaAorCitvcjo6CisKKwltYWtlIGNvY2NpY2hlY2sgQ09DQ0k9PG15X1NQLmNvY2NpPiBNT0RFPXJlcG9ydAorCisKK0NvbnRyb2xsaW5nIFdoaWNoIEZpbGVzIGFyZSBQcm9jZXNzZWQgYnkgQ29jY2luZWxsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0J5IGRlZmF1bHQgdGhlIGVudGlyZSBrZXJuZWwgc291cmNlIHRyZWUgaXMgY2hlY2tlZC4KKworVG8gYXBwbHkgQ29jY2luZWxsZSB0byBhIHNwZWNpZmljIGRpcmVjdG9yeSwgYGBNPWBgIGNhbiBiZSB1c2VkLgorRm9yIGV4YW1wbGUsIHRvIGNoZWNrIGRyaXZlcnMvbmV0L3dpcmVsZXNzLyBvbmUgbWF5IHdyaXRlOjoKKworICAgIG1ha2UgY29jY2ljaGVjayBNPWRyaXZlcnMvbmV0L3dpcmVsZXNzLworCitUbyBhcHBseSBDb2NjaW5lbGxlIG9uIGEgZmlsZSBiYXNpcywgaW5zdGVhZCBvZiBhIGRpcmVjdG9yeSBiYXNpcywgdGhlCitmb2xsb3dpbmcgY29tbWFuZCBtYXkgYmUgdXNlZDo6CisKKyAgICBtYWtlIEM9MSBDSEVDSz0ic2NyaXB0cy9jb2NjaWNoZWNrIgorCitUbyBjaGVjayBvbmx5IG5ld2x5IGVkaXRlZCBjb2RlLCB1c2UgdGhlIHZhbHVlIDIgZm9yIHRoZSBDIGZsYWcsIGkuZS46OgorCisgICAgbWFrZSBDPTIgQ0hFQ0s9InNjcmlwdHMvY29jY2ljaGVjayIKKworSW4gdGhlc2UgbW9kZXMsIHdoaWNoIHdvcmtzIG9uIGEgZmlsZSBiYXNpcywgdGhlcmUgaXMgbm8gaW5mb3JtYXRpb24KK2Fib3V0IHNlbWFudGljIHBhdGNoZXMgZGlzcGxheWVkLCBhbmQgbm8gY29tbWl0IG1lc3NhZ2UgcHJvcG9zZWQuCisKK1RoaXMgcnVucyBldmVyeSBzZW1hbnRpYyBwYXRjaCBpbiBzY3JpcHRzL2NvY2NpbmVsbGUgYnkgZGVmYXVsdC4gVGhlCitDT0NDSSB2YXJpYWJsZSBtYXkgYWRkaXRpb25hbGx5IGJlIHVzZWQgdG8gb25seSBhcHBseSBhIHNpbmdsZQorc2VtYW50aWMgcGF0Y2ggYXMgc2hvd24gaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24uCisKK1RoZSAicmVwb3J0IiBtb2RlIGlzIHRoZSBkZWZhdWx0LiBZb3UgY2FuIHNlbGVjdCBhbm90aGVyIG9uZSB3aXRoIHRoZQorTU9ERSB2YXJpYWJsZSBleHBsYWluZWQgYWJvdmUuCisKK0RlYnVnZ2luZyBDb2NjaW5lbGxlIFNtUEwgcGF0Y2hlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1VzaW5nIGNvY2NpY2hlY2sgaXMgYmVzdCBhcyBpdCBwcm92aWRlcyBpbiB0aGUgc3BhdGNoIGNvbW1hbmQgbGluZQoraW5jbHVkZSBvcHRpb25zIG1hdGNoaW5nIHRoZSBvcHRpb25zIHVzZWQgd2hlbiB3ZSBjb21waWxlIHRoZSBrZXJuZWwuCitZb3UgY2FuIGxlYXJuIHdoYXQgdGhlc2Ugb3B0aW9ucyBhcmUgYnkgdXNpbmcgVj0xLCB5b3UgY291bGQgdGhlbgorbWFudWFsbHkgcnVuIENvY2NpbmVsbGUgd2l0aCBkZWJ1ZyBvcHRpb25zIGFkZGVkLgorCitBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gZGVidWcgcnVubmluZyBDb2NjaW5lbGxlIGFnYWluc3QgU21QTCBwYXRjaGVzCitieSBhc2tpbmcgZm9yIHN0ZGVyciB0byBiZSByZWRpcmVjdGVkIHRvIHN0ZGVyciwgYnkgZGVmYXVsdCBzdGRlcnIKK2lzIHJlZGlyZWN0ZWQgdG8gL2Rldi9udWxsLCBpZiB5b3UnZCBsaWtlIHRvIGNhcHR1cmUgc3RkZXJyIHlvdQorY2FuIHNwZWNpZnkgdGhlIGBgREVCVUdfRklMRT0iZmlsZS50eHQiYGAgb3B0aW9uIHRvIGNvY2NpY2hlY2suIEZvcgoraW5zdGFuY2U6OgorCisgICAgcm0gLWYgY29jY2kuZXJyCisgICAgbWFrZSBjb2NjaWNoZWNrIENPQ0NJPXNjcmlwdHMvY29jY2luZWxsZS9mcmVlL2tmcmVlLmNvY2NpIE1PREU9cmVwb3J0IERFQlVHX0ZJTEU9Y29jY2kuZXJyCisgICAgY2F0IGNvY2NpLmVycgorCitZb3UgY2FuIHVzZSBTUEZMQUdTIHRvIGFkZCBkZWJ1Z2dpbmcgZmxhZ3MsIGZvciBpbnN0YW5jZSB5b3UgbWF5IHdhbnQgdG8KK2FkZCBib3RoIC0tcHJvZmlsZSAtLXNob3ctdHJ5aW5nIHRvIFNQRkxBR1Mgd2hlbiBkZWJ1Z2dpbmcuIEZvciBpbnN0YW5jZQoreW91IG1heSB3YW50IHRvIHVzZTo6CisKKyAgICBybSAtZiBlcnIubG9nCisgICAgZXhwb3J0IENPQ0NJPXNjcmlwdHMvY29jY2luZWxsZS9taXNjL2lycWZfb25lc2hvdC5jb2NjaQorICAgIG1ha2UgY29jY2ljaGVjayBERUJVR19GSUxFPSJlcnIubG9nIiBNT0RFPXJlcG9ydCBTUEZMQUdTPSItLXByb2ZpbGUgLS1zaG93LXRyeWluZyIgTT0uL2RyaXZlcnMvbWZkL2FyaXpvbmEtaXJxLmMKKworZXJyLmxvZyB3aWxsIG5vdyBoYXZlIHRoZSBwcm9maWxpbmcgaW5mb3JtYXRpb24sIHdoaWxlIHN0ZG91dCB3aWxsCitwcm92aWRlIHNvbWUgcHJvZ3Jlc3MgaW5mb3JtYXRpb24gYXMgQ29jY2luZWxsZSBtb3ZlcyBmb3J3YXJkIHdpdGgKK3dvcmsuCisKK0RFQlVHX0ZJTEUgc3VwcG9ydCBpcyBvbmx5IHN1cHBvcnRlZCB3aGVuIHVzaW5nIGNvY2NpbmVsbGUgPj0gMS4yLgorCisuY29jY2ljb25maWcgc3VwcG9ydAorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ29jY2luZWxsZSBzdXBwb3J0cyByZWFkaW5nIC5jb2NjaWNvbmZpZyBmb3IgZGVmYXVsdCBDb2NjaW5lbGxlIG9wdGlvbnMgdGhhdAorc2hvdWxkIGJlIHVzZWQgZXZlcnkgdGltZSBzcGF0Y2ggaXMgc3Bhd25lZCwgdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZm9yCit2YXJpYWJsZXMgZm9yIC5jb2NjaWNvbmZpZyBpcyBhcyBmb2xsb3dzOgorCistIFlvdXIgY3VycmVudCB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkgaXMgcHJvY2Vzc2VkIGZpcnN0CistIFlvdXIgZGlyZWN0b3J5IGZyb20gd2hpY2ggc3BhdGNoIGlzIGNhbGxlZCBpcyBwcm9jZXNzZWQgbmV4dAorLSBUaGUgZGlyZWN0b3J5IHByb3ZpZGVkIHdpdGggdGhlIC0tZGlyIG9wdGlvbiBpcyBwcm9jZXNzZWQgbGFzdCwgaWYgdXNlZAorCitTaW5jZSBjb2NjaWNoZWNrIHJ1bnMgdGhyb3VnaCBtYWtlLCBpdCBuYXR1cmFsbHkgcnVucyBmcm9tIHRoZSBrZXJuZWwKK3Byb3BlciBkaXIsIGFzIHN1Y2ggdGhlIHNlY29uZCBydWxlIGFib3ZlIHdvdWxkIGJlIGltcGxpZWQgZm9yIHBpY2tpbmcgdXAgYQorLmNvY2NpY29uZmlnIHdoZW4gdXNpbmcgYGBtYWtlIGNvY2NpY2hlY2tgYC4KKworYGBtYWtlIGNvY2NpY2hlY2tgYCBhbHNvIHN1cHBvcnRzIHVzaW5nIE09IHRhcmdldHMuSWYgeW91IGRvIG5vdCBzdXBwbHkKK2FueSBNPSB0YXJnZXQsIGl0IGlzIGFzc3VtZWQgeW91IHdhbnQgdG8gdGFyZ2V0IHRoZSBlbnRpcmUga2VybmVsLgorVGhlIGtlcm5lbCBjb2NjaWNoZWNrIHNjcmlwdCBoYXM6OgorCisgICAgaWYgWyAiJEtCVUlMRF9FWFRNT0QiID0gIiIgXSA7IHRoZW4KKyAgICAgICAgT1BUSU9OUz0iLS1kaXIgJHNyY3RyZWUgJENPQ0NJSU5DTFVERSIKKyAgICBlbHNlCisgICAgICAgIE9QVElPTlM9Ii0tZGlyICRLQlVJTERfRVhUTU9EICRDT0NDSUlOQ0xVREUiCisgICAgZmkKKworS0JVSUxEX0VYVE1PRCBpcyBzZXQgd2hlbiBhbiBleHBsaWNpdCB0YXJnZXQgd2l0aCBNPSBpcyB1c2VkLiBGb3IgYm90aCBjYXNlcwordGhlIHNwYXRjaCAtLWRpciBhcmd1bWVudCBpcyB1c2VkLCBhcyBzdWNoIHRoaXJkIHJ1bGUgYXBwbGllcyB3aGVuIHdoZXRoZXIgTT0KK2lzIHVzZWQgb3Igbm90LCBhbmQgd2hlbiBNPSBpcyB1c2VkIHRoZSB0YXJnZXQgZGlyZWN0b3J5IGNhbiBoYXZlIGl0cyBvd24KKy5jb2NjaWNvbmZpZyBmaWxlLiBXaGVuIE09IGlzIG5vdCBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gY29jY2ljaGVjayB0aGUKK3RhcmdldCBkaXJlY3RvcnkgaXMgdGhlIHNhbWUgYXMgdGhlIGRpcmVjdG9yeSBmcm9tIHdoZXJlIHNwYXRjaCB3YXMgY2FsbGVkLgorCitJZiBub3QgdXNpbmcgdGhlIGtlcm5lbCdzIGNvY2NpY2hlY2sgdGFyZ2V0LCBrZWVwIHRoZSBhYm92ZSBwcmVjZWRlbmNlCitvcmRlciBsb2dpYyBvZiAuY29jY2ljb25maWcgcmVhZGluZy4gSWYgdXNpbmcgdGhlIGtlcm5lbCdzIGNvY2NpY2hlY2sgdGFyZ2V0LAorb3ZlcnJpZGUgYW55IG9mIHRoZSBrZXJuZWwncyAuY29jY2ljaGVjaydzIHNldHRpbmdzIHVzaW5nIFNQRkxBR1MuCisKK1dlIGhlbHAgQ29jY2luZWxsZSB3aGVuIHVzZWQgYWdhaW5zdCBMaW51eCB3aXRoIGEgc2V0IG9mIHNlbnNpYmxlIGRlZmF1bHRzCitvcHRpb25zIGZvciBMaW51eCB3aXRoIG91ciBvd24gTGludXggLmNvY2NpY29uZmlnLiBUaGlzIGhpbnRzIHRvIGNvY2NpbmVsbGUKK2dpdCBjYW4gYmUgdXNlZCBmb3IgYGBnaXQgZ3JlcGBgIHF1ZXJpZXMgb3ZlciBjb2NjaWdyZXAuIEEgdGltZW91dCBvZiAyMDAKK3NlY29uZHMgc2hvdWxkIHN1ZmZpY2UgZm9yIG5vdy4KKworVGhlIG9wdGlvbnMgcGlja2VkIHVwIGJ5IGNvY2NpbmVsbGUgd2hlbiByZWFkaW5nIGEgLmNvY2NpY29uZmlnIGRvIG5vdCBhcHBlYXIKK2FzIGFyZ3VtZW50cyB0byBzcGF0Y2ggcHJvY2Vzc2VzIHJ1bm5pbmcgb24geW91ciBzeXN0ZW0sIHRvIGNvbmZpcm0gd2hhdAorb3B0aW9ucyB3aWxsIGJlIHVzZWQgYnkgQ29jY2luZWxsZSBydW46OgorCisgICAgICBzcGF0Y2ggLS1wcmludC1vcHRpb25zLW9ubHkKKworWW91IGNhbiBvdmVycmlkZSB3aXRoIHlvdXIgb3duIHByZWZlcnJlZCBpbmRleCBvcHRpb24gYnkgdXNpbmcgU1BGTEFHUy4gVGFrZQorbm90ZSB0aGF0IHdoZW4gdGhlcmUgYXJlIGNvbmZsaWN0aW5nIG9wdGlvbnMgQ29jY2luZWxsZSB0YWtlcyBwcmVjZWRlbmNlIGZvcgordGhlIGxhc3Qgb3B0aW9ucyBwYXNzZWQuIFVzaW5nIC5jb2NjaWNvbmZpZyBpcyBwb3NzaWJsZSB0byB1c2UgaWR1dGlscywgaG93ZXZlcgorZ2l2ZW4gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZm9sbG93ZWQgYnkgQ29jY2luZWxsZSwgc2luY2UgdGhlIGtlcm5lbCBub3cKK2NhcnJpZXMgaXRzIG93biAuY29jY2ljb25maWcsIHlvdSB3aWxsIG5lZWQgdG8gdXNlIFNQRkxBR1MgdG8gdXNlIGlkdXRpbHMgaWYKK2Rlc2lyZWQuIFNlZSBiZWxvdyBzZWN0aW9uICJBZGRpdGlvbmFsIGZsYWdzIiBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyB0byB1c2UKK2lkdXRpbHMuCisKK0FkZGl0aW9uYWwgZmxhZ3MKKy0tLS0tLS0tLS0tLS0tLS0KKworQWRkaXRpb25hbCBmbGFncyBjYW4gYmUgcGFzc2VkIHRvIHNwYXRjaCB0aHJvdWdoIHRoZSBTUEZMQUdTCit2YXJpYWJsZS4gVGhpcyB3b3JrcyBhcyBDb2NjaW5lbGxlIHJlc3BlY3RzIHRoZSBsYXN0IGZsYWdzCitnaXZlbiB0byBpdCB3aGVuIG9wdGlvbnMgYXJlIGluIGNvbmZsaWN0LiA6OgorCisgICAgbWFrZSBTUEZMQUdTPS0tdXNlLWdsaW1wc2UgY29jY2ljaGVjaworCitDb2NjaW5lbGxlIHN1cHBvcnRzIGlkdXRpbHMgYXMgd2VsbCBidXQgcmVxdWlyZXMgY29jY2luZWxsZSA+PSAxLjAuNi4KK1doZW4gbm8gSUQgZmlsZSBpcyBzcGVjaWZpZWQgY29jY2luZWxsZSBhc3N1bWVzIHlvdXIgSUQgZGF0YWJhc2UgZmlsZQoraXMgaW4gdGhlIGZpbGUgLmlkLXV0aWxzLmluZGV4IG9uIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIGtlcm5lbCwgY29jY2luZWxsZQorY2FycmllcyBhIHNjcmlwdCBzY3JpcHRzL2lkdXRpbHNfaW5kZXguc2ggd2hpY2ggY3JlYXRlcyB0aGUgZGF0YWJhc2Ugd2l0aDo6CisKKyAgICBta2lkIC1pIEMgLS1vdXRwdXQgLmlkLXV0aWxzLmluZGV4CisKK0lmIHlvdSBoYXZlIGFub3RoZXIgZGF0YWJhc2UgZmlsZW5hbWUgeW91IGNhbiBhbHNvIGp1c3Qgc3ltbGluayB3aXRoIHRoaXMKK25hbWUuIDo6CisKKyAgICBtYWtlIFNQRkxBR1M9LS11c2UtaWR1dGlscyBjb2NjaWNoZWNrCisKK0FsdGVybmF0aXZlbHkgeW91IGNhbiBzcGVjaWZ5IHRoZSBkYXRhYmFzZSBmaWxlbmFtZSBleHBsaWNpdGx5LCBmb3IKK2luc3RhbmNlOjoKKworICAgIG1ha2UgU1BGTEFHUz0iLS11c2UtaWR1dGlscyAvZnVsbC1wYXRoL3RvL0lEIiBjb2NjaWNoZWNrCisKK1NlZSBgYHNwYXRjaCAtLWhlbHBgYCB0byBsZWFybiBtb3JlIGFib3V0IHNwYXRjaCBvcHRpb25zLgorCitOb3RlIHRoYXQgdGhlIGBgLS11c2UtZ2xpbXBzZWBgIGFuZCBgYC0tdXNlLWlkdXRpbHNgYCBvcHRpb25zCityZXF1aXJlIGV4dGVybmFsIHRvb2xzIGZvciBpbmRleGluZyB0aGUgY29kZS4gTm9uZSBvZiB0aGVtIGlzCit0aHVzIGFjdGl2ZSBieSBkZWZhdWx0LiBIb3dldmVyLCBieSBpbmRleGluZyB0aGUgY29kZSB3aXRoCitvbmUgb2YgdGhlc2UgdG9vbHMsIGFuZCBhY2NvcmRpbmcgdG8gdGhlIGNvY2NpIGZpbGUgdXNlZCwKK3NwYXRjaCBjb3VsZCBwcm9jZWVkIHRoZSBlbnRpcmUgY29kZSBiYXNlIG1vcmUgcXVpY2tseS4KKworU21QTCBwYXRjaCBzcGVjaWZpYyBvcHRpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU21QTCBwYXRjaGVzIGNhbiBoYXZlIHRoZWlyIG93biByZXF1aXJlbWVudHMgZm9yIG9wdGlvbnMgcGFzc2VkCit0byBDb2NjaW5lbGxlLiBTbVBMIHBhdGNoIHNwZWNpZmljIG9wdGlvbnMgY2FuIGJlIHByb3ZpZGVkIGJ5Citwcm92aWRpbmcgdGhlbSBhdCB0aGUgdG9wIG9mIHRoZSBTbVBMIHBhdGNoLCBmb3IgaW5zdGFuY2U6OgorCisJLy8gT3B0aW9uczogLS1uby1pbmNsdWRlcyAtLWluY2x1ZGUtaGVhZGVycworCitTbVBMIHBhdGNoIENvY2NpbmVsbGUgcmVxdWlyZW1lbnRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FzIENvY2NpbmVsbGUgZmVhdHVyZXMgZ2V0IGFkZGVkIHNvbWUgbW9yZSBhZHZhbmNlZCBTbVBMIHBhdGNoZXMKK21heSByZXF1aXJlIG5ld2VyIHZlcnNpb25zIG9mIENvY2NpbmVsbGUuIElmIGFuIFNtUEwgcGF0Y2ggcmVxdWlyZXMKK2F0IGxlYXN0IGEgdmVyc2lvbiBvZiBDb2NjaW5lbGxlLCB0aGlzIGNhbiBiZSBzcGVjaWZpZWQgYXMgZm9sbG93cywKK2FzIGFuIGV4YW1wbGUgaWYgcmVxdWlyaW5nIGF0IGxlYXN0IENvY2NpbmVsbGUgPj0gMS4wLjU6OgorCisJLy8gUmVxdWlyZXM6IDEuMC41CisKK1Byb3Bvc2luZyBuZXcgc2VtYW50aWMgcGF0Y2hlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOZXcgc2VtYW50aWMgcGF0Y2hlcyBjYW4gYmUgcHJvcG9zZWQgYW5kIHN1Ym1pdHRlZCBieSBrZXJuZWwKK2RldmVsb3BlcnMuIEZvciBzYWtlIG9mIGNsYXJpdHksIHRoZXkgc2hvdWxkIGJlIG9yZ2FuaXplZCBpbiB0aGUKK3N1Yi1kaXJlY3RvcmllcyBvZiBgYHNjcmlwdHMvY29jY2luZWxsZS9gYC4KKworCitEZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgYGByZXBvcnRgYCBtb2RlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2BgcmVwb3J0YGAgZ2VuZXJhdGVzIGEgbGlzdCBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDo6CisKKyAgZmlsZTpsaW5lOmNvbHVtbi1jb2x1bW46IG1lc3NhZ2UKKworRXhhbXBsZQorfn5+fn5+fgorCitSdW5uaW5nOjoKKworCW1ha2UgY29jY2ljaGVjayBNT0RFPXJlcG9ydCBDT0NDST1zY3JpcHRzL2NvY2NpbmVsbGUvYXBpL2Vycl9jYXN0LmNvY2NpCisKK3dpbGwgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIHBhcnQgb2YgdGhlIFNtUEwgc2NyaXB0OjoKKworICAgPHNtcGw+CisgICBAciBkZXBlbmRzIG9uICFjb250ZXh0ICYmICFwYXRjaCAmJiAob3JnIHx8IHJlcG9ydClACisgICBleHByZXNzaW9uIHg7CisgICBwb3NpdGlvbiBwOworICAgQEAKKworICAgICBFUlJfUFRSQHAoUFRSX0VSUih4KSkKKworICAgQHNjcmlwdDpweXRob24gZGVwZW5kcyBvbiByZXBvcnRACisgICBwIDw8IHIucDsKKyAgIHggPDwgci54OworICAgQEAKKworICAgbXNnPSJFUlJfQ0FTVCBjYW4gYmUgdXNlZCB3aXRoICVzIiAlICh4KQorICAgY29jY2lsaWIucmVwb3J0LnByaW50X3JlcG9ydChwWzBdLCBtc2cpCisgICA8L3NtcGw+CisKK1RoaXMgU21QTCBleGNlcnB0IGdlbmVyYXRlcyBlbnRyaWVzIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQsIGFzCitpbGx1c3RyYXRlZCBiZWxvdzo6CisKKyAgICAvaG9tZS91c2VyL2xpbnV4L2NyeXB0by9jdHIuYzoxODg6OS0xNjogRVJSX0NBU1QgY2FuIGJlIHVzZWQgd2l0aCBhbGcKKyAgICAvaG9tZS91c2VyL2xpbnV4L2NyeXB0by9hdXRoZW5jLmM6NjE5OjktMTY6IEVSUl9DQVNUIGNhbiBiZSB1c2VkIHdpdGggYXV0aAorICAgIC9ob21lL3VzZXIvbGludXgvY3J5cHRvL3h0cy5jOjIyNzo5LTE2OiBFUlJfQ0FTVCBjYW4gYmUgdXNlZCB3aXRoIGFsZworCisKK0RldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBgYHBhdGNoYGAgbW9kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doZW4gdGhlIGBgcGF0Y2hgYCBtb2RlIGlzIGF2YWlsYWJsZSwgaXQgcHJvcG9zZXMgYSBmaXggZm9yIGVhY2ggcHJvYmxlbQoraWRlbnRpZmllZC4KKworRXhhbXBsZQorfn5+fn5+fgorCitSdW5uaW5nOjoKKworCW1ha2UgY29jY2ljaGVjayBNT0RFPXBhdGNoIENPQ0NJPXNjcmlwdHMvY29jY2luZWxsZS9hcGkvZXJyX2Nhc3QuY29jY2kKKword2lsbCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgcGFydCBvZiB0aGUgU21QTCBzY3JpcHQ6OgorCisgICAgPHNtcGw+CisgICAgQCBkZXBlbmRzIG9uICFjb250ZXh0ICYmIHBhdGNoICYmICFvcmcgJiYgIXJlcG9ydCBACisgICAgZXhwcmVzc2lvbiB4OworICAgIEBACisKKyAgICAtIEVSUl9QVFIoUFRSX0VSUih4KSkKKyAgICArIEVSUl9DQVNUKHgpCisgICAgPC9zbXBsPgorCitUaGlzIFNtUEwgZXhjZXJwdCBnZW5lcmF0ZXMgcGF0Y2ggaHVua3Mgb24gdGhlIHN0YW5kYXJkIG91dHB1dCwgYXMKK2lsbHVzdHJhdGVkIGJlbG93OjoKKworICAgIGRpZmYgLXUgLXAgYS9jcnlwdG8vY3RyLmMgYi9jcnlwdG8vY3RyLmMKKyAgICAtLS0gYS9jcnlwdG8vY3RyLmMgMjAxMC0wNS0yNiAxMDo0OTozOC4wMDAwMDAwMDAgKzAyMDAKKyAgICArKysgYi9jcnlwdG8vY3RyLmMgMjAxMC0wNi0wMyAyMzo0NDo0OS4wMDAwMDAwMDAgKzAyMDAKKyAgICBAQCAtMTg1LDcgKzE4NSw3IEBAIHN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2luc3RhbmNlICpjcnlwdG9fY3QKKyAJYWxnID0gY3J5cHRvX2F0dHJfYWxnKHRiWzFdLCBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSLAorIAkJCQkgIENSWVBUT19BTEdfVFlQRV9NQVNLKTsKKyAJaWYgKElTX0VSUihhbGcpKQorICAgIC0JCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoYWxnKSk7CisgICAgKwkJcmV0dXJuIEVSUl9DQVNUKGFsZyk7CisKKyAJLyogQmxvY2sgc2l6ZSBtdXN0IGJlID49IDQgYnl0ZXMuICovCisgCWVyciA9IC1FSU5WQUw7CisKK0RldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBgYGNvbnRleHRgYCBtb2RlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitgYGNvbnRleHRgYCBoaWdobGlnaHRzIGxpbmVzIG9mIGludGVyZXN0IGFuZCB0aGVpciBjb250ZXh0CitpbiBhIGRpZmYtbGlrZSBzdHlsZS4KKworICAgICAgKipOT1RFKio6IFRoZSBkaWZmLWxpa2Ugb3V0cHV0IGdlbmVyYXRlZCBpcyBOT1QgYW4gYXBwbGljYWJsZSBwYXRjaC4gVGhlCisgICAgICBpbnRlbnQgb2YgdGhlIGBgY29udGV4dGBgIG1vZGUgaXMgdG8gaGlnaGxpZ2h0IHRoZSBpbXBvcnRhbnQgbGluZXMKKyAgICAgIChhbm5vdGF0ZWQgd2l0aCBtaW51cywgYGAtYGApIGFuZCBnaXZlcyBzb21lIHN1cnJvdW5kaW5nIGNvbnRleHQKKyAgICAgIGxpbmVzIGFyb3VuZC4gVGhpcyBvdXRwdXQgY2FuIGJlIHVzZWQgd2l0aCB0aGUgZGlmZiBtb2RlIG9mCisgICAgICBFbWFjcyB0byByZXZpZXcgdGhlIGNvZGUuCisKK0V4YW1wbGUKK35+fn5+fn4KKworUnVubmluZzo6CisKKwltYWtlIGNvY2NpY2hlY2sgTU9ERT1jb250ZXh0IENPQ0NJPXNjcmlwdHMvY29jY2luZWxsZS9hcGkvZXJyX2Nhc3QuY29jY2kKKword2lsbCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgcGFydCBvZiB0aGUgU21QTCBzY3JpcHQ6OgorCisgICAgPHNtcGw+CisgICAgQCBkZXBlbmRzIG9uIGNvbnRleHQgJiYgIXBhdGNoICYmICFvcmcgJiYgIXJlcG9ydEAKKyAgICBleHByZXNzaW9uIHg7CisgICAgQEAKKworICAgICogRVJSX1BUUihQVFJfRVJSKHgpKQorICAgIDwvc21wbD4KKworVGhpcyBTbVBMIGV4Y2VycHQgZ2VuZXJhdGVzIGRpZmYgaHVua3Mgb24gdGhlIHN0YW5kYXJkIG91dHB1dCwgYXMKK2lsbHVzdHJhdGVkIGJlbG93OjoKKworICAgIGRpZmYgLXUgLXAgL2hvbWUvdXNlci9saW51eC9jcnlwdG8vY3RyLmMgL3RtcC9ub3RoaW5nCisgICAgLS0tIC9ob21lL3VzZXIvbGludXgvY3J5cHRvL2N0ci5jCTIwMTAtMDUtMjYgMTA6NDk6MzguMDAwMDAwMDAwICswMjAwCisgICAgKysrIC90bXAvbm90aGluZworICAgIEBAIC0xODUsNyArMTg1LDYgQEAgc3RhdGljIHN0cnVjdCBjcnlwdG9faW5zdGFuY2UgKmNyeXB0b19jdAorIAlhbGcgPSBjcnlwdG9fYXR0cl9hbGcodGJbMV0sIENSWVBUT19BTEdfVFlQRV9DSVBIRVIsCisgCQkJCSAgQ1JZUFRPX0FMR19UWVBFX01BU0spOworIAlpZiAoSVNfRVJSKGFsZykpCisgICAgLQkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihhbGcpKTsKKworIAkvKiBCbG9jayBzaXplIG11c3QgYmUgPj0gNCBieXRlcy4gKi8KKyAJZXJyID0gLUVJTlZBTDsKKworRGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIGBgb3JnYGAgbW9kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitgYG9yZ2BgIGdlbmVyYXRlcyBhIHJlcG9ydCBpbiB0aGUgT3JnIG1vZGUgZm9ybWF0IG9mIEVtYWNzLgorCitFeGFtcGxlCit+fn5+fn5+CisKK1J1bm5pbmc6OgorCisJbWFrZSBjb2NjaWNoZWNrIE1PREU9b3JnIENPQ0NJPXNjcmlwdHMvY29jY2luZWxsZS9hcGkvZXJyX2Nhc3QuY29jY2kKKword2lsbCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgcGFydCBvZiB0aGUgU21QTCBzY3JpcHQ6OgorCisgICAgPHNtcGw+CisgICAgQHIgZGVwZW5kcyBvbiAhY29udGV4dCAmJiAhcGF0Y2ggJiYgKG9yZyB8fCByZXBvcnQpQAorICAgIGV4cHJlc3Npb24geDsKKyAgICBwb3NpdGlvbiBwOworICAgIEBACisKKyAgICAgIEVSUl9QVFJAcChQVFJfRVJSKHgpKQorCisgICAgQHNjcmlwdDpweXRob24gZGVwZW5kcyBvbiBvcmdACisgICAgcCA8PCByLnA7CisgICAgeCA8PCByLng7CisgICAgQEAKKworICAgIG1zZz0iRVJSX0NBU1QgY2FuIGJlIHVzZWQgd2l0aCAlcyIgJSAoeCkKKyAgICBtc2dfc2FmZT1tc2cucmVwbGFjZSgiWyIsIkAoIikucmVwbGFjZSgiXSIsIikiKQorICAgIGNvY2NpbGliLm9yZy5wcmludF90b2RvKHBbMF0sIG1zZ19zYWZlKQorICAgIDwvc21wbD4KKworVGhpcyBTbVBMIGV4Y2VycHQgZ2VuZXJhdGVzIE9yZyBlbnRyaWVzIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQsIGFzCitpbGx1c3RyYXRlZCBiZWxvdzo6CisKKyAgICAqIFRPRE8gW1t2aWV3Oi9ob21lL3VzZXIvbGludXgvY3J5cHRvL2N0ci5jOjpmYWNlPW92bC1mYWNlMTo6bGluYj0xODg6OmNvbGI9OTo6Y29sZT0xNl1bRVJSX0NBU1QgY2FuIGJlIHVzZWQgd2l0aCBhbGddXQorICAgICogVE9ETyBbW3ZpZXc6L2hvbWUvdXNlci9saW51eC9jcnlwdG8vYXV0aGVuYy5jOjpmYWNlPW92bC1mYWNlMTo6bGluYj02MTk6OmNvbGI9OTo6Y29sZT0xNl1bRVJSX0NBU1QgY2FuIGJlIHVzZWQgd2l0aCBhdXRoXV0KKyAgICAqIFRPRE8gW1t2aWV3Oi9ob21lL3VzZXIvbGludXgvY3J5cHRvL3h0cy5jOjpmYWNlPW92bC1mYWNlMTo6bGluYj0yMjc6OmNvbGI9OTo6Y29sZT0xNl1bRVJSX0NBU1QgY2FuIGJlIHVzZWQgd2l0aCBhbGddXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMvZ2Nvdi5yc3QgYi9Eb2N1bWVudGF0aW9uL2Rldi10b29scy9nY292LnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWVlZGZlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMvZ2Nvdi5yc3QKQEAgLTAsMCArMSwyNTYgQEAKK1VzaW5nIGdjb3Ygd2l0aCB0aGUgTGludXgga2VybmVsCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitnY292IHByb2ZpbGluZyBrZXJuZWwgc3VwcG9ydCBlbmFibGVzIHRoZSB1c2Ugb2YgR0NDJ3MgY292ZXJhZ2UgdGVzdGluZwordG9vbCBnY292XyB3aXRoIHRoZSBMaW51eCBrZXJuZWwuIENvdmVyYWdlIGRhdGEgb2YgYSBydW5uaW5nIGtlcm5lbAoraXMgZXhwb3J0ZWQgaW4gZ2Nvdi1jb21wYXRpYmxlIGZvcm1hdCB2aWEgdGhlICJnY292IiBkZWJ1Z2ZzIGRpcmVjdG9yeS4KK1RvIGdldCBjb3ZlcmFnZSBkYXRhIGZvciBhIHNwZWNpZmljIGZpbGUsIGNoYW5nZSB0byB0aGUga2VybmVsIGJ1aWxkCitkaXJlY3RvcnkgYW5kIHVzZSBnY292IHdpdGggdGhlIGBgLW9gYCBvcHRpb24gYXMgZm9sbG93cyAocmVxdWlyZXMgcm9vdCk6OgorCisgICAgIyBjZCAvdG1wL2xpbnV4LW91dAorICAgICMgZ2NvdiAtbyAvc3lzL2tlcm5lbC9kZWJ1Zy9nY292L3RtcC9saW51eC1vdXQva2VybmVsIHNwaW5sb2NrLmMKKworVGhpcyB3aWxsIGNyZWF0ZSBzb3VyY2UgY29kZSBmaWxlcyBhbm5vdGF0ZWQgd2l0aCBleGVjdXRpb24gY291bnRzCitpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuIEluIGFkZGl0aW9uLCBncmFwaGljYWwgZ2NvdiBmcm9udC1lbmRzIHN1Y2gKK2FzIGxjb3ZfIGNhbiBiZSB1c2VkIHRvIGF1dG9tYXRlIHRoZSBwcm9jZXNzIG9mIGNvbGxlY3RpbmcgZGF0YQorZm9yIHRoZSBlbnRpcmUga2VybmVsIGFuZCBwcm92aWRlIGNvdmVyYWdlIG92ZXJ2aWV3cyBpbiBIVE1MIGZvcm1hdC4KKworUG9zc2libGUgdXNlczoKKworKiBkZWJ1Z2dpbmcgKGhhcyB0aGlzIGxpbmUgYmVlbiByZWFjaGVkIGF0IGFsbD8pCisqIHRlc3QgaW1wcm92ZW1lbnQgKGhvdyBkbyBJIGNoYW5nZSBteSB0ZXN0IHRvIGNvdmVyIHRoZXNlIGxpbmVzPykKKyogbWluaW1pemluZyBrZXJuZWwgY29uZmlndXJhdGlvbnMgKGRvIEkgbmVlZCB0aGlzIG9wdGlvbiBpZiB0aGUKKyAgYXNzb2NpYXRlZCBjb2RlIGlzIG5ldmVyIHJ1bj8pCisKKy4uIF9nY292OiBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9nY2MvR2Nvdi5odG1sCisuLiBfbGNvdjogaHR0cDovL2x0cC5zb3VyY2Vmb3JnZS5uZXQvY292ZXJhZ2UvbGNvdi5waHAKKworCitQcmVwYXJhdGlvbgorLS0tLS0tLS0tLS0KKworQ29uZmlndXJlIHRoZSBrZXJuZWwgd2l0aDo6CisKKyAgICAgICAgQ09ORklHX0RFQlVHX0ZTPXkKKyAgICAgICAgQ09ORklHX0dDT1ZfS0VSTkVMPXkKKworc2VsZWN0IHRoZSBnY2MncyBnY292IGZvcm1hdCwgZGVmYXVsdCBpcyBhdXRvZGV0ZWN0IGJhc2VkIG9uIGdjYyB2ZXJzaW9uOjoKKworICAgICAgICBDT05GSUdfR0NPVl9GT1JNQVRfQVVUT0RFVEVDVD15CisKK2FuZCB0byBnZXQgY292ZXJhZ2UgZGF0YSBmb3IgdGhlIGVudGlyZSBrZXJuZWw6OgorCisgICAgICAgIENPTkZJR19HQ09WX1BST0ZJTEVfQUxMPXkKKworTm90ZSB0aGF0IGtlcm5lbHMgY29tcGlsZWQgd2l0aCBwcm9maWxpbmcgZmxhZ3Mgd2lsbCBiZSBzaWduaWZpY2FudGx5CitsYXJnZXIgYW5kIHJ1biBzbG93ZXIuIEFsc28gQ09ORklHX0dDT1ZfUFJPRklMRV9BTEwgbWF5IG5vdCBiZSBzdXBwb3J0ZWQKK29uIGFsbCBhcmNoaXRlY3R1cmVzLgorCitQcm9maWxpbmcgZGF0YSB3aWxsIG9ubHkgYmVjb21lIGFjY2Vzc2libGUgb25jZSBkZWJ1Z2ZzIGhhcyBiZWVuCittb3VudGVkOjoKKworICAgICAgICBtb3VudCAtdCBkZWJ1Z2ZzIG5vbmUgL3N5cy9rZXJuZWwvZGVidWcKKworCitDdXN0b21pemF0aW9uCistLS0tLS0tLS0tLS0tCisKK1RvIGVuYWJsZSBwcm9maWxpbmcgZm9yIHNwZWNpZmljIGZpbGVzIG9yIGRpcmVjdG9yaWVzLCBhZGQgYSBsaW5lCitzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmcgdG8gdGhlIHJlc3BlY3RpdmUga2VybmVsIE1ha2VmaWxlOgorCistIEZvciBhIHNpbmdsZSBmaWxlIChlLmcuIG1haW4ubyk6OgorCisJR0NPVl9QUk9GSUxFX21haW4ubyA6PSB5CisKKy0gRm9yIGFsbCBmaWxlcyBpbiBvbmUgZGlyZWN0b3J5OjoKKworCUdDT1ZfUFJPRklMRSA6PSB5CisKK1RvIGV4Y2x1ZGUgZmlsZXMgZnJvbSBiZWluZyBwcm9maWxlZCBldmVuIHdoZW4gQ09ORklHX0dDT1ZfUFJPRklMRV9BTEwKK2lzIHNwZWNpZmllZCwgdXNlOjoKKworCUdDT1ZfUFJPRklMRV9tYWluLm8gOj0gbgorCithbmQ6OgorCisJR0NPVl9QUk9GSUxFIDo9IG4KKworT25seSBmaWxlcyB3aGljaCBhcmUgbGlua2VkIHRvIHRoZSBtYWluIGtlcm5lbCBpbWFnZSBvciBhcmUgY29tcGlsZWQgYXMKK2tlcm5lbCBtb2R1bGVzIGFyZSBzdXBwb3J0ZWQgYnkgdGhpcyBtZWNoYW5pc20uCisKKworRmlsZXMKKy0tLS0tCisKK1RoZSBnY292IGtlcm5lbCBzdXBwb3J0IGNyZWF0ZXMgdGhlIGZvbGxvd2luZyBmaWxlcyBpbiBkZWJ1Z2ZzOgorCitgYC9zeXMva2VybmVsL2RlYnVnL2djb3ZgYAorCVBhcmVudCBkaXJlY3RvcnkgZm9yIGFsbCBnY292LXJlbGF0ZWQgZmlsZXMuCisKK2BgL3N5cy9rZXJuZWwvZGVidWcvZ2Nvdi9yZXNldGBgCisJR2xvYmFsIHJlc2V0IGZpbGU6IHJlc2V0cyBhbGwgY292ZXJhZ2UgZGF0YSB0byB6ZXJvIHdoZW4KKyAgICAgICAgd3JpdHRlbiB0by4KKworYGAvc3lzL2tlcm5lbC9kZWJ1Zy9nY292L3BhdGgvdG8vY29tcGlsZS9kaXIvZmlsZS5nY2RhYGAKKwlUaGUgYWN0dWFsIGdjb3YgZGF0YSBmaWxlIGFzIHVuZGVyc3Rvb2QgYnkgdGhlIGdjb3YKKyAgICAgICAgdG9vbC4gUmVzZXRzIGZpbGUgY292ZXJhZ2UgZGF0YSB0byB6ZXJvIHdoZW4gd3JpdHRlbiB0by4KKworYGAvc3lzL2tlcm5lbC9kZWJ1Zy9nY292L3BhdGgvdG8vY29tcGlsZS9kaXIvZmlsZS5nY25vYGAKKwlTeW1ib2xpYyBsaW5rIHRvIGEgc3RhdGljIGRhdGEgZmlsZSByZXF1aXJlZCBieSB0aGUgZ2NvdgorICAgICAgICB0b29sLiBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGdjYyB3aGVuIGNvbXBpbGluZyB3aXRoCisgICAgICAgIG9wdGlvbiBgYC1mdGVzdC1jb3ZlcmFnZWBgLgorCisKK01vZHVsZXMKKy0tLS0tLS0KKworS2VybmVsIG1vZHVsZXMgbWF5IGNvbnRhaW4gY2xlYW51cCBjb2RlIHdoaWNoIGlzIG9ubHkgcnVuIGR1cmluZworbW9kdWxlIHVubG9hZCB0aW1lLiBUaGUgZ2NvdiBtZWNoYW5pc20gcHJvdmlkZXMgYSBtZWFucyB0byBjb2xsZWN0Citjb3ZlcmFnZSBkYXRhIGZvciBzdWNoIGNvZGUgYnkga2VlcGluZyBhIGNvcHkgb2YgdGhlIGRhdGEgYXNzb2NpYXRlZAord2l0aCB0aGUgdW5sb2FkZWQgbW9kdWxlLiBUaGlzIGRhdGEgcmVtYWlucyBhdmFpbGFibGUgdGhyb3VnaCBkZWJ1Z2ZzLgorT25jZSB0aGUgbW9kdWxlIGlzIGxvYWRlZCBhZ2FpbiwgdGhlIGFzc29jaWF0ZWQgY292ZXJhZ2UgY291bnRlcnMgYXJlCitpbml0aWFsaXplZCB3aXRoIHRoZSBkYXRhIGZyb20gaXRzIHByZXZpb3VzIGluc3RhbnRpYXRpb24uCisKK1RoaXMgYmVoYXZpb3IgY2FuIGJlIGRlYWN0aXZhdGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGdjb3ZfcGVyc2lzdCBrZXJuZWwKK3BhcmFtZXRlcjo6CisKKyAgICAgICAgZ2Nvdl9wZXJzaXN0PTAKKworQXQgcnVuLXRpbWUsIGEgdXNlciBjYW4gYWxzbyBjaG9vc2UgdG8gZGlzY2FyZCBkYXRhIGZvciBhbiB1bmxvYWRlZAorbW9kdWxlIGJ5IHdyaXRpbmcgdG8gaXRzIGRhdGEgZmlsZSBvciB0aGUgZ2xvYmFsIHJlc2V0IGZpbGUuCisKKworU2VwYXJhdGVkIGJ1aWxkIGFuZCB0ZXN0IG1hY2hpbmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGdjb3Yga2VybmVsIHByb2ZpbGluZyBpbmZyYXN0cnVjdHVyZSBpcyBkZXNpZ25lZCB0byB3b3JrIG91dC1vZi10aGUKK2JveCBmb3Igc2V0dXBzIHdoZXJlIGtlcm5lbHMgYXJlIGJ1aWx0IGFuZCBydW4gb24gdGhlIHNhbWUgbWFjaGluZS4gSW4KK2Nhc2VzIHdoZXJlIHRoZSBrZXJuZWwgcnVucyBvbiBhIHNlcGFyYXRlIG1hY2hpbmUsIHNwZWNpYWwgcHJlcGFyYXRpb25zCittdXN0IGJlIG1hZGUsIGRlcGVuZGluZyBvbiB3aGVyZSB0aGUgZ2NvdiB0b29sIGlzIHVzZWQ6CisKK2EpIGdjb3YgaXMgcnVuIG9uIHRoZSBURVNUIG1hY2hpbmUKKworICAgIFRoZSBnY292IHRvb2wgdmVyc2lvbiBvbiB0aGUgdGVzdCBtYWNoaW5lIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoZQorICAgIGdjYyB2ZXJzaW9uIHVzZWQgZm9yIGtlcm5lbCBidWlsZC4gQWxzbyB0aGUgZm9sbG93aW5nIGZpbGVzIG5lZWQgdG8gYmUKKyAgICBjb3BpZWQgZnJvbSBidWlsZCB0byB0ZXN0IG1hY2hpbmU6CisKKyAgICBmcm9tIHRoZSBzb3VyY2UgdHJlZToKKyAgICAgIC0gYWxsIEMgc291cmNlIGZpbGVzICsgaGVhZGVycworCisgICAgZnJvbSB0aGUgYnVpbGQgdHJlZToKKyAgICAgIC0gYWxsIEMgc291cmNlIGZpbGVzICsgaGVhZGVycworICAgICAgLSBhbGwgLmdjZGEgYW5kIC5nY25vIGZpbGVzCisgICAgICAtIGFsbCBsaW5rcyB0byBkaXJlY3RvcmllcworCisgICAgSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGVzZSBmaWxlcyBuZWVkIHRvIGJlIHBsYWNlZCBpbnRvIHRoZQorICAgIGV4YWN0IHNhbWUgZmlsZSBzeXN0ZW0gbG9jYXRpb24gb24gdGhlIHRlc3QgbWFjaGluZSBhcyBvbiB0aGUgYnVpbGQKKyAgICBtYWNoaW5lLiBJZiBhbnkgb2YgdGhlIHBhdGggY29tcG9uZW50cyBpcyBzeW1ib2xpYyBsaW5rLCB0aGUgYWN0dWFsCisgICAgZGlyZWN0b3J5IG5lZWRzIHRvIGJlIHVzZWQgaW5zdGVhZCAoZHVlIHRvIG1ha2UncyBDVVJESVIgaGFuZGxpbmcpLgorCitiKSBnY292IGlzIHJ1biBvbiB0aGUgQlVJTEQgbWFjaGluZQorCisgICAgVGhlIGZvbGxvd2luZyBmaWxlcyBuZWVkIHRvIGJlIGNvcGllZCBhZnRlciBlYWNoIHRlc3QgY2FzZSBmcm9tIHRlc3QKKyAgICB0byBidWlsZCBtYWNoaW5lOgorCisgICAgZnJvbSB0aGUgZ2NvdiBkaXJlY3RvcnkgaW4gc3lzZnM6CisgICAgICAtIGFsbCAuZ2NkYSBmaWxlcworICAgICAgLSBhbGwgbGlua3MgdG8gLmdjbm8gZmlsZXMKKworICAgIFRoZXNlIGZpbGVzIGNhbiBiZSBjb3BpZWQgdG8gYW55IGxvY2F0aW9uIG9uIHRoZSBidWlsZCBtYWNoaW5lLiBnY292CisgICAgbXVzdCB0aGVuIGJlIGNhbGxlZCB3aXRoIHRoZSAtbyBvcHRpb24gcG9pbnRpbmcgdG8gdGhhdCBkaXJlY3RvcnkuCisKKyAgICBFeGFtcGxlIGRpcmVjdG9yeSBzZXR1cCBvbiB0aGUgYnVpbGQgbWFjaGluZTo6CisKKyAgICAgIC90bXAvbGludXg6ICAgIGtlcm5lbCBzb3VyY2UgdHJlZQorICAgICAgL3RtcC9vdXQ6ICAgICAga2VybmVsIGJ1aWxkIGRpcmVjdG9yeSBhcyBzcGVjaWZpZWQgYnkgbWFrZSBPPQorICAgICAgL3RtcC9jb3ZlcmFnZTogbG9jYXRpb24gb2YgdGhlIGZpbGVzIGNvcGllZCBmcm9tIHRoZSB0ZXN0IG1hY2hpbmUKKworICAgICAgW3VzZXJAYnVpbGRdIGNkIC90bXAvb3V0CisgICAgICBbdXNlckBidWlsZF0gZ2NvdiAtbyAvdG1wL2NvdmVyYWdlL3RtcC9vdXQvaW5pdCBtYWluLmMKKworCitUcm91Ymxlc2hvb3RpbmcKKy0tLS0tLS0tLS0tLS0tLQorCitQcm9ibGVtCisgICAgQ29tcGlsYXRpb24gYWJvcnRzIGR1cmluZyBsaW5rZXIgc3RlcC4KKworQ2F1c2UKKyAgICBQcm9maWxpbmcgZmxhZ3MgYXJlIHNwZWNpZmllZCBmb3Igc291cmNlIGZpbGVzIHdoaWNoIGFyZSBub3QKKyAgICBsaW5rZWQgdG8gdGhlIG1haW4ga2VybmVsIG9yIHdoaWNoIGFyZSBsaW5rZWQgYnkgYSBjdXN0b20KKyAgICBsaW5rZXIgcHJvY2VkdXJlLgorCitTb2x1dGlvbgorICAgIEV4Y2x1ZGUgYWZmZWN0ZWQgc291cmNlIGZpbGVzIGZyb20gcHJvZmlsaW5nIGJ5IHNwZWNpZnlpbmcKKyAgICBgYEdDT1ZfUFJPRklMRSA6PSBuYGAgb3IgYGBHQ09WX1BST0ZJTEVfYmFzZW5hbWUubyA6PSBuYGAgaW4gdGhlCisgICAgY29ycmVzcG9uZGluZyBNYWtlZmlsZS4KKworUHJvYmxlbQorICAgIEZpbGVzIGNvcGllZCBmcm9tIHN5c2ZzIGFwcGVhciBlbXB0eSBvciBpbmNvbXBsZXRlLgorCitDYXVzZQorICAgIER1ZSB0byB0aGUgd2F5IHNlcV9maWxlIHdvcmtzLCBzb21lIHRvb2xzIHN1Y2ggYXMgY3Agb3IgdGFyCisgICAgbWF5IG5vdCBjb3JyZWN0bHkgY29weSBmaWxlcyBmcm9tIHN5c2ZzLgorCitTb2x1dGlvbgorICAgIFVzZSBgYGNhdGBgJyB0byByZWFkIGBgLmdjZGFgYCBmaWxlcyBhbmQgYGBjcCAtZGBgIHRvIGNvcHkgbGlua3MuCisgICAgQWx0ZXJuYXRpdmVseSB1c2UgdGhlIG1lY2hhbmlzbSBzaG93biBpbiBBcHBlbmRpeCBCLgorCisKK0FwcGVuZGl4IEE6IGdhdGhlcl9vbl9idWlsZC5zaAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NhbXBsZSBzY3JpcHQgdG8gZ2F0aGVyIGNvdmVyYWdlIG1ldGEgZmlsZXMgb24gdGhlIGJ1aWxkIG1hY2hpbmUKKyhzZWUgNmEpOjoKKworICAgICMhL2Jpbi9iYXNoCisKKyAgICBLU1JDPSQxCisgICAgS09CSj0kMgorICAgIERFU1Q9JDMKKworICAgIGlmIFsgLXogIiRLU1JDIiBdIHx8IFsgLXogIiRLT0JKIiBdIHx8IFsgLXogIiRERVNUIiBdOyB0aGVuCisgICAgICBlY2hvICJVc2FnZTogJDAgPGtzcmMgZGlyZWN0b3J5PiA8a29iaiBkaXJlY3Rvcnk+IDxvdXRwdXQudGFyLmd6PiIgPiYyCisgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgS1NSQz0kKGNkICRLU1JDOyBwcmludGYgImFsbDpcblx0QGVjaG8gXCR7Q1VSRElSfVxuIiB8IG1ha2UgLWYgLSkKKyAgICBLT0JKPSQoY2QgJEtPQko7IHByaW50ZiAiYWxsOlxuXHRAZWNobyBcJHtDVVJESVJ9XG4iIHwgbWFrZSAtZiAtKQorCisgICAgZmluZCAkS1NSQyAkS09CSiBcKCAtbmFtZSAnKi5nY25vJyAtbyAtbmFtZSAnKi5bY2hdJyAtbyAtdHlwZSBsIFwpIC1hIFwKKyAgICAgICAgICAgICAgICAgICAgIC1wZXJtIC91K3IsZytyIHwgdGFyIGNmeiAkREVTVCAtUCAtVCAtCisKKyAgICBpZiBbICQ/IC1lcSAwIF0gOyB0aGVuCisgICAgICBlY2hvICIkREVTVCBzdWNjZXNzZnVsbHkgY3JlYXRlZCwgY29weSB0byB0ZXN0IHN5c3RlbSBhbmQgdW5wYWNrIHdpdGg6IgorICAgICAgZWNobyAiICB0YXIgeGZ6ICRERVNUIC1QIgorICAgIGVsc2UKKyAgICAgIGVjaG8gIkNvdWxkIG5vdCBjcmVhdGUgZmlsZSAkREVTVCIKKyAgICBmaQorCisKK0FwcGVuZGl4IEI6IGdhdGhlcl9vbl90ZXN0LnNoCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTYW1wbGUgc2NyaXB0IHRvIGdhdGhlciBjb3ZlcmFnZSBkYXRhIGZpbGVzIG9uIHRoZSB0ZXN0IG1hY2hpbmUKKyhzZWUgNmIpOjoKKworICAgICMhL2Jpbi9iYXNoIC1lCisKKyAgICBERVNUPSQxCisgICAgR0NEQT0vc3lzL2tlcm5lbC9kZWJ1Zy9nY292CisKKyAgICBpZiBbIC16ICIkREVTVCIgXSA7IHRoZW4KKyAgICAgIGVjaG8gIlVzYWdlOiAkMCA8b3V0cHV0LnRhci5nej4iID4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIFRFTVBESVI9JChta3RlbXAgLWQpCisgICAgZWNobyBDb2xsZWN0aW5nIGRhdGEuLgorICAgIGZpbmQgJEdDREEgLXR5cGUgZCAtZXhlYyBta2RpciAtcCAkVEVNUERJUi9ce1x9IFw7CisgICAgZmluZCAkR0NEQSAtbmFtZSAnKi5nY2RhJyAtZXhlYyBzaCAtYyAnY2F0IDwgJDAgPiAnJFRFTVBESVInLyQwJyB7fSBcOworICAgIGZpbmQgJEdDREEgLW5hbWUgJyouZ2NubycgLWV4ZWMgc2ggLWMgJ2NwIC1kICQwICckVEVNUERJUicvJDAnIHt9IFw7CisgICAgdGFyIGN6ZiAkREVTVCAtQyAkVEVNUERJUiBzeXMKKyAgICBybSAtcmYgJFRFTVBESVIKKworICAgIGVjaG8gIiRERVNUIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLCBjb3B5IHRvIGJ1aWxkIHN5c3RlbSBhbmQgdW5wYWNrIHdpdGg6IgorICAgIGVjaG8gIiAgdGFyIHhmeiAkREVTVCIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2dkYi1rZXJuZWwtZGVidWdnaW5nLnJzdCBiL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2dkYi1rZXJuZWwtZGVidWdnaW5nLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTkzYzliCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMvZ2RiLWtlcm5lbC1kZWJ1Z2dpbmcucnN0CkBAIC0wLDAgKzEsMTczIEBACisuLiBoaWdobGlnaHQ6OiBub25lCisKK0RlYnVnZ2luZyBrZXJuZWwgYW5kIG1vZHVsZXMgdmlhIGdkYgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBrZXJuZWwgZGVidWdnZXIga2dkYiwgaHlwZXJ2aXNvcnMgbGlrZSBRRU1VIG9yIEpUQUctYmFzZWQgaGFyZHdhcmUKK2ludGVyZmFjZXMgYWxsb3cgdG8gZGVidWcgdGhlIExpbnV4IGtlcm5lbCBhbmQgaXRzIG1vZHVsZXMgZHVyaW5nIHJ1bnRpbWUKK3VzaW5nIGdkYi4gR2RiIGNvbWVzIHdpdGggYSBwb3dlcmZ1bCBzY3JpcHRpbmcgaW50ZXJmYWNlIGZvciBweXRob24uIFRoZQora2VybmVsIHByb3ZpZGVzIGEgY29sbGVjdGlvbiBvZiBoZWxwZXIgc2NyaXB0cyB0aGF0IGNhbiBzaW1wbGlmeSB0eXBpY2FsCitrZXJuZWwgZGVidWdnaW5nIHN0ZXBzLiBUaGlzIGlzIGEgc2hvcnQgdHV0b3JpYWwgYWJvdXQgaG93IHRvIGVuYWJsZSBhbmQgdXNlCit0aGVtLiBJdCBmb2N1c2VzIG9uIFFFTVUvS1ZNIHZpcnR1YWwgbWFjaGluZXMgYXMgdGFyZ2V0LCBidXQgdGhlIGV4YW1wbGVzIGNhbgorYmUgdHJhbnNmZXJyZWQgdG8gdGhlIG90aGVyIGdkYiBzdHVicyBhcyB3ZWxsLgorCisKK1JlcXVpcmVtZW50cworLS0tLS0tLS0tLS0tCisKKy0gZ2RiIDcuMisgKHJlY29tbWVuZGVkOiA3LjQrKSB3aXRoIHB5dGhvbiBzdXBwb3J0IGVuYWJsZWQgKHR5cGljYWxseSB0cnVlCisgIGZvciBkaXN0cmlidXRpb25zKQorCisKK1NldHVwCistLS0tLQorCistIENyZWF0ZSBhIHZpcnR1YWwgTGludXggbWFjaGluZSBmb3IgUUVNVS9LVk0gKHNlZSB3d3cubGludXgta3ZtLm9yZyBhbmQKKyAgd3d3LnFlbXUub3JnIGZvciBtb3JlIGRldGFpbHMpLiBGb3IgY3Jvc3MtZGV2ZWxvcG1lbnQsCisgIGh0dHA6Ly9sYW5kbGV5Lm5ldC9hYm9yaWdpbmFsL2JpbiBrZWVwcyBhIHBvb2wgb2YgbWFjaGluZSBpbWFnZXMgYW5kCisgIHRvb2xjaGFpbnMgdGhhdCBjYW4gYmUgaGVscGZ1bCB0byBzdGFydCBmcm9tLgorCistIEJ1aWxkIHRoZSBrZXJuZWwgd2l0aCBDT05GSUdfR0RCX1NDUklQVFMgZW5hYmxlZCwgYnV0IGxlYXZlCisgIENPTkZJR19ERUJVR19JTkZPX1JFRFVDRUQgb2ZmLiBJZiB5b3VyIGFyY2hpdGVjdHVyZSBzdXBwb3J0cworICBDT05GSUdfRlJBTUVfUE9JTlRFUiwga2VlcCBpdCBlbmFibGVkLgorCistIEluc3RhbGwgdGhhdCBrZXJuZWwgb24gdGhlIGd1ZXN0LgorICBBbHRlcm5hdGl2ZWx5LCBRRU1VIGFsbG93cyB0byBib290IHRoZSBrZXJuZWwgZGlyZWN0bHkgdXNpbmcgLWtlcm5lbCwKKyAgLWFwcGVuZCwgLWluaXRyZCBjb21tYW5kIGxpbmUgc3dpdGNoZXMuIFRoaXMgaXMgZ2VuZXJhbGx5IG9ubHkgdXNlZnVsIGlmCisgIHlvdSBkbyBub3QgZGVwZW5kIG9uIG1vZHVsZXMuIFNlZSBRRU1VIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscyBvbgorICB0aGlzIG1vZGUuCisKKy0gRW5hYmxlIHRoZSBnZGIgc3R1YiBvZiBRRU1VL0tWTSwgZWl0aGVyCisKKyAgICAtIGF0IFZNIHN0YXJ0dXAgdGltZSBieSBhcHBlbmRpbmcgIi1zIiB0byB0aGUgUUVNVSBjb21tYW5kIGxpbmUKKworICBvcgorCisgICAgLSBkdXJpbmcgcnVudGltZSBieSBpc3N1aW5nICJnZGJzZXJ2ZXIiIGZyb20gdGhlIFFFTVUgbW9uaXRvcgorICAgICAgY29uc29sZQorCistIGNkIC9wYXRoL3RvL2xpbnV4LWJ1aWxkCisKKy0gU3RhcnQgZ2RiOiBnZGIgdm1saW51eAorCisgIE5vdGU6IFNvbWUgZGlzdHJvcyBtYXkgcmVzdHJpY3QgYXV0by1sb2FkaW5nIG9mIGdkYiBzY3JpcHRzIHRvIGtub3duIHNhZmUKKyAgZGlyZWN0b3JpZXMuIEluIGNhc2UgZ2RiIHJlcG9ydHMgdG8gcmVmdXNlIGxvYWRpbmcgdm1saW51eC1nZGIucHksIGFkZDo6CisKKyAgICBhZGQtYXV0by1sb2FkLXNhZmUtcGF0aCAvcGF0aC90by9saW51eC1idWlsZAorCisgIHRvIH4vLmdkYmluaXQuIFNlZSBnZGIgaGVscCBmb3IgbW9yZSBkZXRhaWxzLgorCistIEF0dGFjaCB0byB0aGUgYm9vdGVkIGd1ZXN0OjoKKworICAgIChnZGIpIHRhcmdldCByZW1vdGUgOjEyMzQKKworCitFeGFtcGxlcyBvZiB1c2luZyB0aGUgTGludXgtcHJvdmlkZWQgZ2RiIGhlbHBlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIExvYWQgbW9kdWxlIChhbmQgbWFpbiBrZXJuZWwpIHN5bWJvbHM6OgorCisgICAgKGdkYikgbHgtc3ltYm9scworICAgIGxvYWRpbmcgdm1saW51eAorICAgIHNjYW5uaW5nIGZvciBtb2R1bGVzIGluIC9ob21lL3VzZXIvbGludXgvYnVpbGQKKyAgICBsb2FkaW5nIEAweGZmZmZmZmZmYTAwMjAwMDA6IC9ob21lL3VzZXIvbGludXgvYnVpbGQvbmV0L25ldGZpbHRlci94dF90Y3B1ZHAua28KKyAgICBsb2FkaW5nIEAweGZmZmZmZmZmYTAwMTYwMDA6IC9ob21lL3VzZXIvbGludXgvYnVpbGQvbmV0L25ldGZpbHRlci94dF9wa3R0eXBlLmtvCisgICAgbG9hZGluZyBAMHhmZmZmZmZmZmEwMDAyMDAwOiAvaG9tZS91c2VyL2xpbnV4L2J1aWxkL25ldC9uZXRmaWx0ZXIveHRfbGltaXQua28KKyAgICBsb2FkaW5nIEAweGZmZmZmZmZmYTAwY2EwMDA6IC9ob21lL3VzZXIvbGludXgvYnVpbGQvbmV0L3BhY2tldC9hZl9wYWNrZXQua28KKyAgICBsb2FkaW5nIEAweGZmZmZmZmZmYTAwM2MwMDA6IC9ob21lL3VzZXIvbGludXgvYnVpbGQvZnMvZnVzZS9mdXNlLmtvCisgICAgLi4uCisgICAgbG9hZGluZyBAMHhmZmZmZmZmZmEwMDAwMDAwOiAvaG9tZS91c2VyL2xpbnV4L2J1aWxkL2RyaXZlcnMvYXRhL2F0YV9nZW5lcmljLmtvCisKKy0gU2V0IGEgYnJlYWtwb2ludCBvbiBzb21lIG5vdCB5ZXQgbG9hZGVkIG1vZHVsZSBmdW5jdGlvbiwgZS5nLjo6CisKKyAgICAoZ2RiKSBiIGJ0cmZzX2luaXRfc3lzZnMKKyAgICBGdW5jdGlvbiAiYnRyZnNfaW5pdF9zeXNmcyIgbm90IGRlZmluZWQuCisgICAgTWFrZSBicmVha3BvaW50IHBlbmRpbmcgb24gZnV0dXJlIHNoYXJlZCBsaWJyYXJ5IGxvYWQ/ICh5IG9yIFtuXSkgeQorICAgIEJyZWFrcG9pbnQgMSAoYnRyZnNfaW5pdF9zeXNmcykgcGVuZGluZy4KKworLSBDb250aW51ZSB0aGUgdGFyZ2V0OjoKKworICAgIChnZGIpIGMKKworLSBMb2FkIHRoZSBtb2R1bGUgb24gdGhlIHRhcmdldCBhbmQgd2F0Y2ggdGhlIHN5bWJvbHMgYmVpbmcgbG9hZGVkIGFzIHdlbGwgYXMKKyAgdGhlIGJyZWFrcG9pbnQgaGl0OjoKKworICAgIGxvYWRpbmcgQDB4ZmZmZmZmZmZhMDAzNDAwMDogL2hvbWUvdXNlci9saW51eC9idWlsZC9saWIvbGliY3JjMzJjLmtvCisgICAgbG9hZGluZyBAMHhmZmZmZmZmZmEwMDUwMDAwOiAvaG9tZS91c2VyL2xpbnV4L2J1aWxkL2xpYi9sem8vbHpvX2NvbXByZXNzLmtvCisgICAgbG9hZGluZyBAMHhmZmZmZmZmZmEwMDZlMDAwOiAvaG9tZS91c2VyL2xpbnV4L2J1aWxkL2xpYi96bGliX2RlZmxhdGUvemxpYl9kZWZsYXRlLmtvCisgICAgbG9hZGluZyBAMHhmZmZmZmZmZmEwMWIxMDAwOiAvaG9tZS91c2VyL2xpbnV4L2J1aWxkL2ZzL2J0cmZzL2J0cmZzLmtvCisKKyAgICBCcmVha3BvaW50IDEsIGJ0cmZzX2luaXRfc3lzZnMgKCkgYXQgL2hvbWUvdXNlci9saW51eC9mcy9idHJmcy9zeXNmcy5jOjM2CisgICAgMzYgICAgICAgICAgICAgIGJ0cmZzX2tzZXQgPSBrc2V0X2NyZWF0ZV9hbmRfYWRkKCJidHJmcyIsIE5VTEwsIGZzX2tvYmopOworCistIER1bXAgdGhlIGxvZyBidWZmZXIgb2YgdGhlIHRhcmdldCBrZXJuZWw6OgorCisgICAgKGdkYikgbHgtZG1lc2cKKyAgICBbICAgICAwLjAwMDAwMF0gSW5pdGlhbGl6aW5nIGNncm91cCBzdWJzeXMgY3B1c2V0CisgICAgWyAgICAgMC4wMDAwMDBdIEluaXRpYWxpemluZyBjZ3JvdXAgc3Vic3lzIGNwdQorICAgIFsgICAgIDAuMDAwMDAwXSBMaW51eCB2ZXJzaW9uIDMuOC4wLXJjNC1kYmcrICguLi4KKyAgICBbICAgICAwLjAwMDAwMF0gQ29tbWFuZCBsaW5lOiByb290PS9kZXYvc2RhMiByZXN1bWU9L2Rldi9zZGExIHZnYT0weDMxNAorICAgIFsgICAgIDAuMDAwMDAwXSBlODIwOiBCSU9TLXByb3ZpZGVkIHBoeXNpY2FsIFJBTSBtYXA6CisgICAgWyAgICAgMC4wMDAwMDBdIEJJT1MtZTgyMDogW21lbSAweDAwMDAwMDAwMDAwMDAwMDAtMHgwMDAwMDAwMDAwMDlmYmZmXSB1c2FibGUKKyAgICBbICAgICAwLjAwMDAwMF0gQklPUy1lODIwOiBbbWVtIDB4MDAwMDAwMDAwMDA5ZmMwMC0weDAwMDAwMDAwMDAwOWZmZmZdIHJlc2VydmVkCisgICAgLi4uLgorCistIEV4YW1pbmUgZmllbGRzIG9mIHRoZSBjdXJyZW50IHRhc2sgc3RydWN0OjoKKworICAgIChnZGIpIHAgJGx4X2N1cnJlbnQoKS5waWQKKyAgICAkMSA9IDQ5OTgKKyAgICAoZ2RiKSBwICRseF9jdXJyZW50KCkuY29tbQorICAgICQyID0gIm1vZHByb2JlXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCIKKworLSBNYWtlIHVzZSBvZiB0aGUgcGVyLWNwdSBmdW5jdGlvbiBmb3IgdGhlIGN1cnJlbnQgb3IgYSBzcGVjaWZpZWQgQ1BVOjoKKworICAgIChnZGIpIHAgJGx4X3Blcl9jcHUoInJ1bnF1ZXVlcyIpLm5yX3J1bm5pbmcKKyAgICAkMyA9IDEKKyAgICAoZ2RiKSBwICRseF9wZXJfY3B1KCJydW5xdWV1ZXMiLCAyKS5ucl9ydW5uaW5nCisgICAgJDQgPSAwCisKKy0gRGlnIGludG8gaHJ0aW1lcnMgdXNpbmcgdGhlIGNvbnRhaW5lcl9vZiBoZWxwZXI6OgorCisgICAgKGdkYikgc2V0ICRuZXh0ID0gJGx4X3Blcl9jcHUoImhydGltZXJfYmFzZXMiKS5jbG9ja19iYXNlWzBdLmFjdGl2ZS5uZXh0CisgICAgKGdkYikgcCAqJGNvbnRhaW5lcl9vZigkbmV4dCwgInN0cnVjdCBocnRpbWVyIiwgIm5vZGUiKQorICAgICQ1ID0geworICAgICAgbm9kZSA9IHsKKyAgICAgICAgbm9kZSA9IHsKKyAgICAgICAgICBfX3JiX3BhcmVudF9jb2xvciA9IDE4NDQ2NjEyMTMzMzU1MjU2MDcyLAorICAgICAgICAgIHJiX3JpZ2h0ID0gMHgwIDxpcnFfc3RhY2tfdW5pb24+LAorICAgICAgICAgIHJiX2xlZnQgPSAweDAgPGlycV9zdGFja191bmlvbj4KKyAgICAgICAgfSwKKyAgICAgICAgZXhwaXJlcyA9IHsKKyAgICAgICAgICB0djY0ID0gMTgzNTI2ODAwMDAwMAorICAgICAgICB9CisgICAgICB9LAorICAgICAgX3NvZnRleHBpcmVzID0geworICAgICAgICB0djY0ID0gMTgzNTI2ODAwMDAwMAorICAgICAgfSwKKyAgICAgIGZ1bmN0aW9uID0gMHhmZmZmZmZmZjgxMDc4MjMyIDx0aWNrX3NjaGVkX3RpbWVyPiwKKyAgICAgIGJhc2UgPSAweGZmZmY4ODAwM2ZkMGQ2ZjAsCisgICAgICBzdGF0ZSA9IDEsCisgICAgICBzdGFydF9waWQgPSAwLAorICAgICAgc3RhcnRfc2l0ZSA9IDB4ZmZmZmZmZmY4MTA1NWMxZiA8aHJ0aW1lcl9zdGFydF9yYW5nZV9ucysyMD4sCisgICAgICBzdGFydF9jb21tID0gInN3YXBwZXIvMlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCIKKyAgICB9CisKKworTGlzdCBvZiBjb21tYW5kcyBhbmQgZnVuY3Rpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIG51bWJlciBvZiBjb21tYW5kcyBhbmQgY29udmVuaWVuY2UgZnVuY3Rpb25zIG1heSBldm9sdmUgb3ZlciB0aGUgdGltZSwKK3RoaXMgaXMganVzdCBhIHNuYXBzaG90IG9mIHRoZSBpbml0aWFsIHZlcnNpb246OgorCisgKGdkYikgYXByb3BvcyBseAorIGZ1bmN0aW9uIGx4X2N1cnJlbnQgLS0gUmV0dXJuIGN1cnJlbnQgdGFzaworIGZ1bmN0aW9uIGx4X21vZHVsZSAtLSBGaW5kIG1vZHVsZSBieSBuYW1lIGFuZCByZXR1cm4gdGhlIG1vZHVsZSB2YXJpYWJsZQorIGZ1bmN0aW9uIGx4X3Blcl9jcHUgLS0gUmV0dXJuIHBlci1jcHUgdmFyaWFibGUKKyBmdW5jdGlvbiBseF90YXNrX2J5X3BpZCAtLSBGaW5kIExpbnV4IHRhc2sgYnkgUElEIGFuZCByZXR1cm4gdGhlIHRhc2tfc3RydWN0IHZhcmlhYmxlCisgZnVuY3Rpb24gbHhfdGhyZWFkX2luZm8gLS0gQ2FsY3VsYXRlIExpbnV4IHRocmVhZF9pbmZvIGZyb20gdGFzayB2YXJpYWJsZQorIGx4LWRtZXNnIC0tIFByaW50IExpbnV4IGtlcm5lbCBsb2cgYnVmZmVyCisgbHgtbHNtb2QgLS0gTGlzdCBjdXJyZW50bHkgbG9hZGVkIG1vZHVsZXMKKyBseC1zeW1ib2xzIC0tIChSZS0pbG9hZCBzeW1ib2xzIG9mIExpbnV4IGtlcm5lbCBhbmQgY3VycmVudGx5IGxvYWRlZCBtb2R1bGVzCisKK0RldGFpbGVkIGhlbHAgY2FuIGJlIG9idGFpbmVkIHZpYSAiaGVscCA8Y29tbWFuZC1uYW1lPiIgZm9yIGNvbW1hbmRzIGFuZCAiaGVscAorZnVuY3Rpb24gPGZ1bmN0aW9uLW5hbWU+IiBmb3IgY29udmVuaWVuY2UgZnVuY3Rpb25zLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMva2FzYW4ucnN0IGIvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMva2FzYW4ucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YTE4ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2Rldi10b29scy9rYXNhbi5yc3QKQEAgLTAsMCArMSwxNzMgQEAKK1RoZSBLZXJuZWwgQWRkcmVzcyBTYW5pdGl6ZXIgKEtBU0FOKQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK092ZXJ2aWV3CistLS0tLS0tLQorCitLZXJuZWxBZGRyZXNzU0FOaXRpemVyIChLQVNBTikgaXMgYSBkeW5hbWljIG1lbW9yeSBlcnJvciBkZXRlY3Rvci4gSXQgcHJvdmlkZXMKK2EgZmFzdCBhbmQgY29tcHJlaGVuc2l2ZSBzb2x1dGlvbiBmb3IgZmluZGluZyB1c2UtYWZ0ZXItZnJlZSBhbmQgb3V0LW9mLWJvdW5kcworYnVncy4KKworS0FTQU4gdXNlcyBjb21waWxlLXRpbWUgaW5zdHJ1bWVudGF0aW9uIGZvciBjaGVja2luZyBldmVyeSBtZW1vcnkgYWNjZXNzLAordGhlcmVmb3JlIHlvdSB3aWxsIG5lZWQgYSBHQ0MgdmVyc2lvbiA0LjkuMiBvciBsYXRlci4gR0NDIDUuMCBvciBsYXRlciBpcworcmVxdWlyZWQgZm9yIGRldGVjdGlvbiBvZiBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIHRvIHN0YWNrIG9yIGdsb2JhbCB2YXJpYWJsZXMuCisKK0N1cnJlbnRseSBLQVNBTiBpcyBzdXBwb3J0ZWQgb25seSBmb3IgdGhlIHg4Nl82NCBhbmQgYXJtNjQgYXJjaGl0ZWN0dXJlcy4KKworVXNhZ2UKKy0tLS0tCisKK1RvIGVuYWJsZSBLQVNBTiBjb25maWd1cmUga2VybmVsIHdpdGg6OgorCisJICBDT05GSUdfS0FTQU4gPSB5CisKK2FuZCBjaG9vc2UgYmV0d2VlbiBDT05GSUdfS0FTQU5fT1VUTElORSBhbmQgQ09ORklHX0tBU0FOX0lOTElORS4gT3V0bGluZSBhbmQKK2lubGluZSBhcmUgY29tcGlsZXIgaW5zdHJ1bWVudGF0aW9uIHR5cGVzLiBUaGUgZm9ybWVyIHByb2R1Y2VzIHNtYWxsZXIgYmluYXJ5Cit0aGUgbGF0dGVyIGlzIDEuMSAtIDIgdGltZXMgZmFzdGVyLiBJbmxpbmUgaW5zdHJ1bWVudGF0aW9uIHJlcXVpcmVzIGEgR0NDCit2ZXJzaW9uIDUuMCBvciBsYXRlci4KKworS0FTQU4gd29ya3Mgd2l0aCBib3RoIFNMVUIgYW5kIFNMQUIgbWVtb3J5IGFsbG9jYXRvcnMuCitGb3IgYmV0dGVyIGJ1ZyBkZXRlY3Rpb24gYW5kIG5pY2VyIHJlcG9ydGluZywgZW5hYmxlIENPTkZJR19TVEFDS1RSQUNFLgorCitUbyBkaXNhYmxlIGluc3RydW1lbnRhdGlvbiBmb3Igc3BlY2lmaWMgZmlsZXMgb3IgZGlyZWN0b3JpZXMsIGFkZCBhIGxpbmUKK3NpbWlsYXIgdG8gdGhlIGZvbGxvd2luZyB0byB0aGUgcmVzcGVjdGl2ZSBrZXJuZWwgTWFrZWZpbGU6CisKKy0gRm9yIGEgc2luZ2xlIGZpbGUgKGUuZy4gbWFpbi5vKTo6CisKKyAgICBLQVNBTl9TQU5JVElaRV9tYWluLm8gOj0gbgorCistIEZvciBhbGwgZmlsZXMgaW4gb25lIGRpcmVjdG9yeTo6CisKKyAgICBLQVNBTl9TQU5JVElaRSA6PSBuCisKK0Vycm9yIHJlcG9ydHMKK35+fn5+fn5+fn5+fn4KKworQSB0eXBpY2FsIG91dCBvZiBib3VuZHMgYWNjZXNzIHJlcG9ydCBsb29rcyBsaWtlIHRoaXM6OgorCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgQlVHOiBBZGRyZXNzU2FuaXRpemVyOiBvdXQgb2YgYm91bmRzIGFjY2VzcyBpbiBrbWFsbG9jX29vYl9yaWdodCsweDY1LzB4NzUgW3Rlc3Rfa2FzYW5dIGF0IGFkZHIgZmZmZjg4MDA2OTNiYzVkMworICAgIFdyaXRlIG9mIHNpemUgMSBieSB0YXNrIG1vZHByb2JlLzE2ODkKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEJVRyBrbWFsbG9jLTEyOCAoTm90IHRhaW50ZWQpOiBrYXNhbiBlcnJvcgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBEaXNhYmxpbmcgbG9jayBkZWJ1Z2dpbmcgZHVlIHRvIGtlcm5lbCB0YWludAorICAgIElORk86IEFsbG9jYXRlZCBpbiBrbWFsbG9jX29vYl9yaWdodCsweDNkLzB4NzUgW3Rlc3Rfa2FzYW5dIGFnZT0wIGNwdT0wIHBpZD0xNjg5CisgICAgIF9fc2xhYl9hbGxvYysweDRiNC8weDRmMAorICAgICBrbWVtX2NhY2hlX2FsbG9jX3RyYWNlKzB4MTBiLzB4MTkwCisgICAgIGttYWxsb2Nfb29iX3JpZ2h0KzB4M2QvMHg3NSBbdGVzdF9rYXNhbl0KKyAgICAgaW5pdF9tb2R1bGUrMHg5LzB4NDcgW3Rlc3Rfa2FzYW5dCisgICAgIGRvX29uZV9pbml0Y2FsbCsweDk5LzB4MjAwCisgICAgIGxvYWRfbW9kdWxlKzB4MmNiMy8weDNiMjAKKyAgICAgU3lTX2Zpbml0X21vZHVsZSsweDc2LzB4ODAKKyAgICAgc3lzdGVtX2NhbGxfZmFzdHBhdGgrMHgxMi8weDE3CisgICAgSU5GTzogU2xhYiAweGZmZmZlYTAwMDFhNGVmMDAgb2JqZWN0cz0xNyB1c2VkPTcgZnA9MHhmZmZmODgwMDY5M2JkNzI4IGZsYWdzPTB4MTAwMDAwMDAwMDA0MDgwCisgICAgSU5GTzogT2JqZWN0IDB4ZmZmZjg4MDA2OTNiYzU1OCBAb2Zmc2V0PTEzNjggZnA9MHhmZmZmODgwMDY5M2JjNzIwCisKKyAgICBCeXRlcyBiNCBmZmZmODgwMDY5M2JjNTQ4OiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCA1YSA1YSA1YSA1YSA1YSA1YSA1YSA1YSAgLi4uLi4uLi5aWlpaWlpaWgorICAgIE9iamVjdCBmZmZmODgwMDY5M2JjNTU4OiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiAga2tra2tra2tra2tra2traworICAgIE9iamVjdCBmZmZmODgwMDY5M2JjNTY4OiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiAga2tra2tra2tra2tra2traworICAgIE9iamVjdCBmZmZmODgwMDY5M2JjNTc4OiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiAga2tra2tra2tra2tra2traworICAgIE9iamVjdCBmZmZmODgwMDY5M2JjNTg4OiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiAga2tra2tra2tra2tra2traworICAgIE9iamVjdCBmZmZmODgwMDY5M2JjNTk4OiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiAga2tra2tra2tra2tra2traworICAgIE9iamVjdCBmZmZmODgwMDY5M2JjNWE4OiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiAga2tra2tra2tra2tra2traworICAgIE9iamVjdCBmZmZmODgwMDY5M2JjNWI4OiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiAga2tra2tra2tra2tra2traworICAgIE9iamVjdCBmZmZmODgwMDY5M2JjNWM4OiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiBhNSAga2tra2tra2tra2tra2trLgorICAgIFJlZHpvbmUgZmZmZjg4MDA2OTNiYzVkODogY2MgY2MgY2MgY2MgY2MgY2MgY2MgY2MgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLi4uLi4uCisgICAgUGFkZGluZyBmZmZmODgwMDY5M2JjNzE4OiA1YSA1YSA1YSA1YSA1YSA1YSA1YSA1YSAgICAgICAgICAgICAgICAgICAgICAgICAgWlpaWlpaWloKKyAgICBDUFU6IDAgUElEOiAxNjg5IENvbW06IG1vZHByb2JlIFRhaW50ZWQ6IEcgICAgQiAgICAgICAgICAzLjE4LjAtcmMxLW1tMSsgIzk4CisgICAgSGFyZHdhcmUgbmFtZTogUUVNVSBTdGFuZGFyZCBQQyAoaTQ0MEZYICsgUElJWCwgMTk5NiksIEJJT1MgcmVsLTEuNy41LTAtZ2U1MTQ4OGMtMjAxNDA2MDJfMTY0NjEyLW5pbHNzb24uaG9tZS5rcmF4ZWwub3JnIDA0LzAxLzIwMTQKKyAgICAgZmZmZjg4MDA2OTNiYzAwMCAwMDAwMDAwMDAwMDAwMDAwIGZmZmY4ODAwNjkzYmM1NTggZmZmZjg4MDA2OTIzYmI3OAorICAgICBmZmZmZmZmZjgxY2M2OGFlIDAwMDAwMDAwMDAwMDAwZjMgZmZmZjg4MDA2ZDQwNzYwMCBmZmZmODgwMDY5MjNiYmE4CisgICAgIGZmZmZmZmZmODExZmQ4NDggZmZmZjg4MDA2ZDQwNzYwMCBmZmZmZWEwMDAxYTRlZjAwIGZmZmY4ODAwNjkzYmM1NTgKKyAgICBDYWxsIFRyYWNlOgorICAgICBbPGZmZmZmZmZmODFjYzY4YWU+XSBkdW1wX3N0YWNrKzB4NDYvMHg1OAorICAgICBbPGZmZmZmZmZmODExZmQ4NDg+XSBwcmludF90cmFpbGVyKzB4ZjgvMHgxNjAKKyAgICAgWzxmZmZmZmZmZmEwMDAyNmE3Pl0gPyBrbWVtX2NhY2hlX29vYisweGMzLzB4YzMgW3Rlc3Rfa2FzYW5dCisgICAgIFs8ZmZmZmZmZmY4MTFmZjBmNT5dIG9iamVjdF9lcnIrMHgzNS8weDQwCisgICAgIFs8ZmZmZmZmZmZhMDAwMjA2NT5dID8ga21hbGxvY19vb2JfcmlnaHQrMHg2NS8weDc1IFt0ZXN0X2thc2FuXQorICAgICBbPGZmZmZmZmZmODEyMGI5ZmE+XSBrYXNhbl9yZXBvcnRfZXJyb3IrMHgzOGEvMHgzZjAKKyAgICAgWzxmZmZmZmZmZjgxMjBhNzlmPl0gPyBrYXNhbl9wb2lzb25fc2hhZG93KzB4MmYvMHg0MAorICAgICBbPGZmZmZmZmZmODEyMGIzNDQ+XSA/IGthc2FuX3VucG9pc29uX3NoYWRvdysweDE0LzB4NDAKKyAgICAgWzxmZmZmZmZmZjgxMjBhNzlmPl0gPyBrYXNhbl9wb2lzb25fc2hhZG93KzB4MmYvMHg0MAorICAgICBbPGZmZmZmZmZmYTAwMDI2YTc+XSA/IGttZW1fY2FjaGVfb29iKzB4YzMvMHhjMyBbdGVzdF9rYXNhbl0KKyAgICAgWzxmZmZmZmZmZjgxMjBhOTk1Pl0gX19hc2FuX3N0b3JlMSsweDc1LzB4YjAKKyAgICAgWzxmZmZmZmZmZmEwMDAyNjAxPl0gPyBrbWVtX2NhY2hlX29vYisweDFkLzB4YzMgW3Rlc3Rfa2FzYW5dCisgICAgIFs8ZmZmZmZmZmZhMDAwMjA2NT5dID8ga21hbGxvY19vb2JfcmlnaHQrMHg2NS8weDc1IFt0ZXN0X2thc2FuXQorICAgICBbPGZmZmZmZmZmYTAwMDIwNjU+XSBrbWFsbG9jX29vYl9yaWdodCsweDY1LzB4NzUgW3Rlc3Rfa2FzYW5dCisgICAgIFs8ZmZmZmZmZmZhMDAwMjZiMD5dIGluaXRfbW9kdWxlKzB4OS8weDQ3IFt0ZXN0X2thc2FuXQorICAgICBbPGZmZmZmZmZmODEwMDAyZDk+XSBkb19vbmVfaW5pdGNhbGwrMHg5OS8weDIwMAorICAgICBbPGZmZmZmZmZmODExZTRlNWM+XSA/IF9fdnVubWFwKzB4ZWMvMHgxNjAKKyAgICAgWzxmZmZmZmZmZjgxMTE0ZjYzPl0gbG9hZF9tb2R1bGUrMHgyY2IzLzB4M2IyMAorICAgICBbPGZmZmZmZmZmODExMGZkNzA+XSA/IG1fc2hvdysweDI0MC8weDI0MAorICAgICBbPGZmZmZmZmZmODExMTVmMDY+XSBTeVNfZmluaXRfbW9kdWxlKzB4NzYvMHg4MAorICAgICBbPGZmZmZmZmZmODFjZDMxMjk+XSBzeXN0ZW1fY2FsbF9mYXN0cGF0aCsweDEyLzB4MTcKKyAgICBNZW1vcnkgc3RhdGUgYXJvdW5kIHRoZSBidWdneSBhZGRyZXNzOgorICAgICBmZmZmODgwMDY5M2JjMzAwOiBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYworICAgICBmZmZmODgwMDY5M2JjMzgwOiBmYyBmYyAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCBmYworICAgICBmZmZmODgwMDY5M2JjNDAwOiBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYworICAgICBmZmZmODgwMDY5M2JjNDgwOiBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYworICAgICBmZmZmODgwMDY5M2JjNTAwOiBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyAwMCAwMCAwMCAwMCAwMAorICAgID5mZmZmODgwMDY5M2JjNTgwOiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMyBmYyBmYyBmYyBmYyBmYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgICAgZmZmZjg4MDA2OTNiYzYwMDogZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMKKyAgICAgZmZmZjg4MDA2OTNiYzY4MDogZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMKKyAgICAgZmZmZjg4MDA2OTNiYzcwMDogZmMgZmMgZmMgZmMgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIKKyAgICAgZmZmZjg4MDA2OTNiYzc4MDogZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIKKyAgICAgZmZmZjg4MDA2OTNiYzgwMDogZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIGhlYWRlciBvZiB0aGUgcmVwb3J0IGRpc2NyaWJlIHdoYXQga2luZCBvZiBidWcgaGFwcGVuZWQgYW5kIHdoYXQga2luZCBvZgorYWNjZXNzIGNhdXNlZCBpdC4gSXQncyBmb2xsb3dlZCBieSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGFjY2Vzc2VkIHNsdWIgb2JqZWN0Cisoc2VlICdTTFVCIERlYnVnIG91dHB1dCcgc2VjdGlvbiBpbiBEb2N1bWVudGF0aW9uL3ZtL3NsdWIudHh0IGZvciBkZXRhaWxzKSBhbmQKK3RoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYWNjZXNzZWQgbWVtb3J5IHBhZ2UuCisKK0luIHRoZSBsYXN0IHNlY3Rpb24gdGhlIHJlcG9ydCBzaG93cyBtZW1vcnkgc3RhdGUgYXJvdW5kIHRoZSBhY2Nlc3NlZCBhZGRyZXNzLgorUmVhZGluZyB0aGlzIHBhcnQgcmVxdWlyZXMgc29tZSB1bmRlcnN0YW5kaW5nIG9mIGhvdyBLQVNBTiB3b3Jrcy4KKworVGhlIHN0YXRlIG9mIGVhY2ggOCBhbGlnbmVkIGJ5dGVzIG9mIG1lbW9yeSBpcyBlbmNvZGVkIGluIG9uZSBzaGFkb3cgYnl0ZS4KK1Rob3NlIDggYnl0ZXMgY2FuIGJlIGFjY2Vzc2libGUsIHBhcnRpYWxseSBhY2Nlc3NpYmxlLCBmcmVlZCBvciBiZSBhIHJlZHpvbmUuCitXZSB1c2UgdGhlIGZvbGxvd2luZyBlbmNvZGluZyBmb3IgZWFjaCBzaGFkb3cgYnl0ZTogMCBtZWFucyB0aGF0IGFsbCA4IGJ5dGVzCitvZiB0aGUgY29ycmVzcG9uZGluZyBtZW1vcnkgcmVnaW9uIGFyZSBhY2Nlc3NpYmxlOyBudW1iZXIgTiAoMSA8PSBOIDw9IDcpIG1lYW5zCit0aGF0IHRoZSBmaXJzdCBOIGJ5dGVzIGFyZSBhY2Nlc3NpYmxlLCBhbmQgb3RoZXIgKDggLSBOKSBieXRlcyBhcmUgbm90OworYW55IG5lZ2F0aXZlIHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSBlbnRpcmUgOC1ieXRlIHdvcmQgaXMgaW5hY2Nlc3NpYmxlLgorV2UgdXNlIGRpZmZlcmVudCBuZWdhdGl2ZSB2YWx1ZXMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBkaWZmZXJlbnQga2luZHMgb2YKK2luYWNjZXNzaWJsZSBtZW1vcnkgbGlrZSByZWR6b25lcyBvciBmcmVlZCBtZW1vcnkgKHNlZSBtbS9rYXNhbi9rYXNhbi5oKS4KKworSW4gdGhlIHJlcG9ydCBhYm92ZSB0aGUgYXJyb3dzIHBvaW50IHRvIHRoZSBzaGFkb3cgYnl0ZSAwMywgd2hpY2ggbWVhbnMgdGhhdAordGhlIGFjY2Vzc2VkIGFkZHJlc3MgaXMgcGFydGlhbGx5IGFjY2Vzc2libGUuCisKKworSW1wbGVtZW50YXRpb24gZGV0YWlscworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitGcm9tIGEgaGlnaCBsZXZlbCwgb3VyIGFwcHJvYWNoIHRvIG1lbW9yeSBlcnJvciBkZXRlY3Rpb24gaXMgc2ltaWxhciB0byB0aGF0CitvZiBrbWVtY2hlY2s6IHVzZSBzaGFkb3cgbWVtb3J5IHRvIHJlY29yZCB3aGV0aGVyIGVhY2ggYnl0ZSBvZiBtZW1vcnkgaXMgc2FmZQordG8gYWNjZXNzLCBhbmQgdXNlIGNvbXBpbGUtdGltZSBpbnN0cnVtZW50YXRpb24gdG8gY2hlY2sgc2hhZG93IG1lbW9yeSBvbiBlYWNoCittZW1vcnkgYWNjZXNzLgorCitBZGRyZXNzU2FuaXRpemVyIGRlZGljYXRlcyAxLzggb2Yga2VybmVsIG1lbW9yeSB0byBpdHMgc2hhZG93IG1lbW9yeQorKGUuZy4gMTZUQiB0byBjb3ZlciAxMjhUQiBvbiB4ODZfNjQpIGFuZCB1c2VzIGRpcmVjdCBtYXBwaW5nIHdpdGggYSBzY2FsZSBhbmQKK29mZnNldCB0byB0cmFuc2xhdGUgYSBtZW1vcnkgYWRkcmVzcyB0byBpdHMgY29ycmVzcG9uZGluZyBzaGFkb3cgYWRkcmVzcy4KKworSGVyZSBpcyB0aGUgZnVuY3Rpb24gd2hpY2ggdHJhbnNsYXRlcyBhbiBhZGRyZXNzIHRvIGl0cyBjb3JyZXNwb25kaW5nIHNoYWRvdworYWRkcmVzczo6CisKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgKmthc2FuX21lbV90b19zaGFkb3coY29uc3Qgdm9pZCAqYWRkcikKKyAgICB7CisJcmV0dXJuICgodW5zaWduZWQgbG9uZylhZGRyID4+IEtBU0FOX1NIQURPV19TQ0FMRV9TSElGVCkKKwkJKyBLQVNBTl9TSEFET1dfT0ZGU0VUOworICAgIH0KKword2hlcmUgYGBLQVNBTl9TSEFET1dfU0NBTEVfU0hJRlQgPSAzYGAuCisKK0NvbXBpbGUtdGltZSBpbnN0cnVtZW50YXRpb24gdXNlZCBmb3IgY2hlY2tpbmcgbWVtb3J5IGFjY2Vzc2VzLiBDb21waWxlciBpbnNlcnRzCitmdW5jdGlvbiBjYWxscyAoX19hc2FuX2xvYWQqKGFkZHIpLCBfX2FzYW5fc3RvcmUqKGFkZHIpKSBiZWZvcmUgZWFjaCBtZW1vcnkKK2FjY2VzcyBvZiBzaXplIDEsIDIsIDQsIDggb3IgMTYuIFRoZXNlIGZ1bmN0aW9ucyBjaGVjayB3aGV0aGVyIG1lbW9yeSBhY2Nlc3MgaXMKK3ZhbGlkIG9yIG5vdCBieSBjaGVja2luZyBjb3JyZXNwb25kaW5nIHNoYWRvdyBtZW1vcnkuCisKK0dDQyA1LjAgaGFzIHBvc3NpYmlsaXR5IHRvIHBlcmZvcm0gaW5saW5lIGluc3RydW1lbnRhdGlvbi4gSW5zdGVhZCBvZiBtYWtpbmcKK2Z1bmN0aW9uIGNhbGxzIEdDQyBkaXJlY3RseSBpbnNlcnRzIHRoZSBjb2RlIHRvIGNoZWNrIHRoZSBzaGFkb3cgbWVtb3J5LgorVGhpcyBvcHRpb24gc2lnbmlmaWNhbnRseSBlbmxhcmdlcyBrZXJuZWwgYnV0IGl0IGdpdmVzIHgxLjEteDIgcGVyZm9ybWFuY2UKK2Jvb3N0IG92ZXIgb3V0bGluZSBpbnN0cnVtZW50ZWQga2VybmVsLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMva2Nvdi5yc3QgYi9Eb2N1bWVudGF0aW9uL2Rldi10b29scy9rY292LnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2EwZTI3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMva2Nvdi5yc3QKQEAgLTAsMCArMSwxMTEgQEAKK2tjb3Y6IGNvZGUgY292ZXJhZ2UgZm9yIGZ1enppbmcKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwora2NvdiBleHBvc2VzIGtlcm5lbCBjb2RlIGNvdmVyYWdlIGluZm9ybWF0aW9uIGluIGEgZm9ybSBzdWl0YWJsZSBmb3IgY292ZXJhZ2UtCitndWlkZWQgZnV6emluZyAocmFuZG9taXplZCB0ZXN0aW5nKS4gQ292ZXJhZ2UgZGF0YSBvZiBhIHJ1bm5pbmcga2VybmVsIGlzCitleHBvcnRlZCB2aWEgdGhlICJrY292IiBkZWJ1Z2ZzIGZpbGUuIENvdmVyYWdlIGNvbGxlY3Rpb24gaXMgZW5hYmxlZCBvbiBhIHRhc2sKK2Jhc2lzLCBhbmQgdGh1cyBpdCBjYW4gY2FwdHVyZSBwcmVjaXNlIGNvdmVyYWdlIG9mIGEgc2luZ2xlIHN5c3RlbSBjYWxsLgorCitOb3RlIHRoYXQga2NvdiBkb2VzIG5vdCBhaW0gdG8gY29sbGVjdCBhcyBtdWNoIGNvdmVyYWdlIGFzIHBvc3NpYmxlLiBJdCBhaW1zCit0byBjb2xsZWN0IG1vcmUgb3IgbGVzcyBzdGFibGUgY292ZXJhZ2UgdGhhdCBpcyBmdW5jdGlvbiBvZiBzeXNjYWxsIGlucHV0cy4KK1RvIGFjaGlldmUgdGhpcyBnb2FsIGl0IGRvZXMgbm90IGNvbGxlY3QgY292ZXJhZ2UgaW4gc29mdC9oYXJkIGludGVycnVwdHMKK2FuZCBpbnN0cnVtZW50YXRpb24gb2Ygc29tZSBpbmhlcmVudGx5IG5vbi1kZXRlcm1pbmlzdGljIHBhcnRzIG9mIGtlcm5lbCBpcworZGlzYmxlZCAoZS5nLiBzY2hlZHVsZXIsIGxvY2tpbmcpLgorCitVc2FnZQorLS0tLS0KKworQ29uZmlndXJlIHRoZSBrZXJuZWwgd2l0aDo6CisKKyAgICAgICAgQ09ORklHX0tDT1Y9eQorCitDT05GSUdfS0NPViByZXF1aXJlcyBnY2MgYnVpbHQgb24gcmV2aXNpb24gMjMxMjk2IG9yIGxhdGVyLgorUHJvZmlsaW5nIGRhdGEgd2lsbCBvbmx5IGJlY29tZSBhY2Nlc3NpYmxlIG9uY2UgZGVidWdmcyBoYXMgYmVlbiBtb3VudGVkOjoKKworICAgICAgICBtb3VudCAtdCBkZWJ1Z2ZzIG5vbmUgL3N5cy9rZXJuZWwvZGVidWcKKworVGhlIGZvbGxvd2luZyBwcm9ncmFtIGRlbW9uc3RyYXRlcyBrY292IHVzYWdlIGZyb20gd2l0aGluIGEgdGVzdCBwcm9ncmFtOjoKKworICAgICNpbmNsdWRlIDxzdGRpby5oPgorICAgICNpbmNsdWRlIDxzdGRkZWYuaD4KKyAgICAjaW5jbHVkZSA8c3RkaW50Lmg+CisgICAgI2luY2x1ZGUgPHN0ZGxpYi5oPgorICAgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAgICAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyAgICAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisgICAgI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisgICAgI2luY2x1ZGUgPHVuaXN0ZC5oPgorICAgICNpbmNsdWRlIDxmY250bC5oPgorCisgICAgI2RlZmluZSBLQ09WX0lOSVRfVFJBQ0UJCQlfSU9SKCdjJywgMSwgdW5zaWduZWQgbG9uZykKKyAgICAjZGVmaW5lIEtDT1ZfRU5BQkxFCQkJX0lPKCdjJywgMTAwKQorICAgICNkZWZpbmUgS0NPVl9ESVNBQkxFCQkJX0lPKCdjJywgMTAxKQorICAgICNkZWZpbmUgQ09WRVJfU0laRQkJCSg2NDw8MTApCisKKyAgICBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisgICAgeworCWludCBmZDsKKwl1bnNpZ25lZCBsb25nICpjb3ZlciwgbiwgaTsKKworCS8qIEEgc2luZ2xlIGZkIGRlc2NyaXB0b3IgYWxsb3dzIGNvdmVyYWdlIGNvbGxlY3Rpb24gb24gYSBzaW5nbGUKKwkgKiB0aHJlYWQuCisJICovCisJZmQgPSBvcGVuKCIvc3lzL2tlcm5lbC9kZWJ1Zy9rY292IiwgT19SRFdSKTsKKwlpZiAoZmQgPT0gLTEpCisJCXBlcnJvcigib3BlbiIpLCBleGl0KDEpOworCS8qIFNldHVwIHRyYWNlIG1vZGUgYW5kIHRyYWNlIHNpemUuICovCisJaWYgKGlvY3RsKGZkLCBLQ09WX0lOSVRfVFJBQ0UsIENPVkVSX1NJWkUpKQorCQlwZXJyb3IoImlvY3RsIiksIGV4aXQoMSk7CisJLyogTW1hcCBidWZmZXIgc2hhcmVkIGJldHdlZW4ga2VybmVsLSBhbmQgdXNlci1zcGFjZS4gKi8KKwljb3ZlciA9ICh1bnNpZ25lZCBsb25nKiltbWFwKE5VTEwsIENPVkVSX1NJWkUgKiBzaXplb2YodW5zaWduZWQgbG9uZyksCisJCQkJICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBmZCwgMCk7CisJaWYgKCh2b2lkKiljb3ZlciA9PSBNQVBfRkFJTEVEKQorCQlwZXJyb3IoIm1tYXAiKSwgZXhpdCgxKTsKKwkvKiBFbmFibGUgY292ZXJhZ2UgY29sbGVjdGlvbiBvbiB0aGUgY3VycmVudCB0aHJlYWQuICovCisJaWYgKGlvY3RsKGZkLCBLQ09WX0VOQUJMRSwgMCkpCisJCXBlcnJvcigiaW9jdGwiKSwgZXhpdCgxKTsKKwkvKiBSZXNldCBjb3ZlcmFnZSBmcm9tIHRoZSB0YWlsIG9mIHRoZSBpb2N0bCgpIGNhbGwuICovCisJX19hdG9taWNfc3RvcmVfbigmY292ZXJbMF0sIDAsIF9fQVRPTUlDX1JFTEFYRUQpOworCS8qIFRoYXQncyB0aGUgdGFyZ2V0IHN5c2NhbCBjYWxsLiAqLworCXJlYWQoLTEsIE5VTEwsIDApOworCS8qIFJlYWQgbnVtYmVyIG9mIFBDcyBjb2xsZWN0ZWQuICovCisJbiA9IF9fYXRvbWljX2xvYWRfbigmY292ZXJbMF0sIF9fQVRPTUlDX1JFTEFYRUQpOworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCXByaW50ZigiMHglbHhcbiIsIGNvdmVyW2kgKyAxXSk7CisJLyogRGlzYWJsZSBjb3ZlcmFnZSBjb2xsZWN0aW9uIGZvciB0aGUgY3VycmVudCB0aHJlYWQuIEFmdGVyIHRoaXMgY2FsbAorCSAqIGNvdmVyYWdlIGNhbiBiZSBlbmFibGVkIGZvciBhIGRpZmZlcmVudCB0aHJlYWQuCisJICovCisJaWYgKGlvY3RsKGZkLCBLQ09WX0RJU0FCTEUsIDApKQorCQlwZXJyb3IoImlvY3RsIiksIGV4aXQoMSk7CisJLyogRnJlZSByZXNvdXJjZXMuICovCisJaWYgKG11bm1hcChjb3ZlciwgQ09WRVJfU0laRSAqIHNpemVvZih1bnNpZ25lZCBsb25nKSkpCisJCXBlcnJvcigibXVubWFwIiksIGV4aXQoMSk7CisJaWYgKGNsb3NlKGZkKSkKKwkJcGVycm9yKCJjbG9zZSIpLCBleGl0KDEpOworCXJldHVybiAwOworICAgIH0KKworQWZ0ZXIgcGlwaW5nIHRocm91Z2ggYWRkcjJsaW5lIG91dHB1dCBvZiB0aGUgcHJvZ3JhbSBsb29rcyBhcyBmb2xsb3dzOjoKKworICAgIFN5U19yZWFkCisgICAgZnMvcmVhZF93cml0ZS5jOjU2MgorICAgIF9fZmRnZXRfcG9zCisgICAgZnMvZmlsZS5jOjc3NAorICAgIF9fZmdldF9saWdodAorICAgIGZzL2ZpbGUuYzo3NDYKKyAgICBfX2ZnZXRfbGlnaHQKKyAgICBmcy9maWxlLmM6NzUwCisgICAgX19mZ2V0X2xpZ2h0CisgICAgZnMvZmlsZS5jOjc2MAorICAgIF9fZmRnZXRfcG9zCisgICAgZnMvZmlsZS5jOjc4NAorICAgIFN5U19yZWFkCisgICAgZnMvcmVhZF93cml0ZS5jOjU2MgorCitJZiBhIHByb2dyYW0gbmVlZHMgdG8gY29sbGVjdCBjb3ZlcmFnZSBmcm9tIHNldmVyYWwgdGhyZWFkcyAoaW5kZXBlbmRlbnRseSksCitpdCBuZWVkcyB0byBvcGVuIC9zeXMva2VybmVsL2RlYnVnL2tjb3YgaW4gZWFjaCB0aHJlYWQgc2VwYXJhdGVseS4KKworVGhlIGludGVyZmFjZSBpcyBmaW5lLWdyYWluZWQgdG8gYWxsb3cgZWZmaWNpZW50IGZvcmtpbmcgb2YgdGVzdCBwcm9jZXNzZXMuCitUaGF0IGlzLCBhIHBhcmVudCBwcm9jZXNzIG9wZW5zIC9zeXMva2VybmVsL2RlYnVnL2tjb3YsIGVuYWJsZXMgdHJhY2UgbW9kZSwKK21tYXBzIGNvdmVyYWdlIGJ1ZmZlciBhbmQgdGhlbiBmb3JrcyBjaGlsZCBwcm9jZXNzZXMgaW4gYSBsb29wLiBDaGlsZCBwcm9jZXNzZXMKK29ubHkgbmVlZCB0byBlbmFibGUgY292ZXJhZ2UgKGRpc2FibGUgaGFwcGVucyBhdXRvbWF0aWNhbGx5IG9uIHRocmVhZCBlbmQpLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMva21lbWNoZWNrLnJzdCBiL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2ttZW1jaGVjay5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YzZDE5OAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2ttZW1jaGVjay5yc3QKQEAgLTAsMCArMSw3MzMgQEAKK0dldHRpbmcgc3RhcnRlZCB3aXRoIGttZW1jaGVjaworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1ZlZ2FyZCBOb3NzdW0gPHZlZ2FyZG5vQGlmaS51aW8ubm8+CisKKworSW50cm9kdWN0aW9uCistLS0tLS0tLS0tLS0KKwora21lbWNoZWNrIGlzIGEgZGVidWdnaW5nIGZlYXR1cmUgZm9yIHRoZSBMaW51eCBLZXJuZWwuIE1vcmUgc3BlY2lmaWNhbGx5LCBpdAoraXMgYSBkeW5hbWljIGNoZWNrZXIgdGhhdCBkZXRlY3RzIGFuZCB3YXJucyBhYm91dCBzb21lIHVzZXMgb2YgdW5pbml0aWFsaXplZAorbWVtb3J5LgorCitVc2Vyc3BhY2UgcHJvZ3JhbW1lcnMgbWlnaHQgYmUgZmFtaWxpYXIgd2l0aCBWYWxncmluZCdzIG1lbWNoZWNrLiBUaGUgbWFpbgorZGlmZmVyZW5jZSBiZXR3ZWVuIG1lbWNoZWNrIGFuZCBrbWVtY2hlY2sgaXMgdGhhdCBtZW1jaGVjayB3b3JrcyBmb3IgdXNlcnNwYWNlCitwcm9ncmFtcyBvbmx5LCBhbmQga21lbWNoZWNrIHdvcmtzIGZvciB0aGUga2VybmVsIG9ubHkuIFRoZSBpbXBsZW1lbnRhdGlvbnMKK2FyZSBvZiBjb3Vyc2UgdmFzdGx5IGRpZmZlcmVudC4gQmVjYXVzZSBvZiB0aGlzLCBrbWVtY2hlY2sgaXMgbm90IGFzIGFjY3VyYXRlCithcyBtZW1jaGVjaywgYnV0IGl0IHR1cm5zIG91dCB0byBiZSBnb29kIGVub3VnaCBpbiBwcmFjdGljZSB0byBkaXNjb3ZlciByZWFsCitwcm9ncmFtbWVyIGVycm9ycyB0aGF0IHRoZSBjb21waWxlciBpcyBub3QgYWJsZSB0byBmaW5kIHRocm91Z2ggc3RhdGljCithbmFseXNpcy4KKworRW5hYmxpbmcga21lbWNoZWNrIG9uIGEga2VybmVsIHdpbGwgcHJvYmFibHkgc2xvdyBpdCBkb3duIHRvIHRoZSBleHRlbnQgdGhhdAordGhlIG1hY2hpbmUgd2lsbCBub3QgYmUgdXNhYmxlIGZvciBub3JtYWwgd29ya2xvYWRzIHN1Y2ggYXMgZS5nLiBhbgoraW50ZXJhY3RpdmUgZGVza3RvcC4ga21lbWNoZWNrIHdpbGwgYWxzbyBjYXVzZSB0aGUga2VybmVsIHRvIHVzZSBhYm91dCB0d2ljZQorYXMgbXVjaCBtZW1vcnkgYXMgbm9ybWFsLiBGb3IgdGhpcyByZWFzb24sIGttZW1jaGVjayBpcyBzdHJpY3RseSBhIGRlYnVnZ2luZworZmVhdHVyZS4KKworCitEb3dubG9hZGluZworLS0tLS0tLS0tLS0KKworQXMgb2YgdmVyc2lvbiAyLjYuMzEtcmMxLCBrbWVtY2hlY2sgaXMgaW5jbHVkZWQgaW4gdGhlIG1haW5saW5lIGtlcm5lbC4KKworCitDb25maWd1cmluZyBhbmQgY29tcGlsaW5nCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ttZW1jaGVjayBvbmx5IHdvcmtzIGZvciB0aGUgeDg2IChib3RoIDMyLSBhbmQgNjQtYml0KSBwbGF0Zm9ybS4gQSBudW1iZXIgb2YKK2NvbmZpZ3VyYXRpb24gdmFyaWFibGVzIG11c3QgaGF2ZSBzcGVjaWZpYyBzZXR0aW5ncyBpbiBvcmRlciBmb3IgdGhlIGttZW1jaGVjaworbWVudSB0byBldmVuIGFwcGVhciBpbiAibWVudWNvbmZpZyIuIFRoZXNlIGFyZToKKworLSBgYENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT1uYGAKKwlUaGlzIG9wdGlvbiBpcyBsb2NhdGVkIHVuZGVyICJHZW5lcmFsIHNldHVwIiAvICJPcHRpbWl6ZSBmb3Igc2l6ZSIuCisKKwlXaXRob3V0IHRoaXMsIGdjYyB3aWxsIHVzZSBjZXJ0YWluIG9wdGltaXphdGlvbnMgdGhhdCB1c3VhbGx5IGxlYWQgdG8KKwlmYWxzZSBwb3NpdGl2ZSB3YXJuaW5ncyBmcm9tIGttZW1jaGVjay4gQW4gZXhhbXBsZSBvZiB0aGlzIGlzIGEgMTYtYml0CisJZmllbGQgaW4gYSBzdHJ1Y3QsIHdoZXJlIGdjYyBtYXkgbG9hZCAzMiBiaXRzLCB0aGVuIGRpc2NhcmQgdGhlIHVwcGVyCisJMTYgYml0cy4ga21lbWNoZWNrIHNlZXMgb25seSB0aGUgMzItYml0IGxvYWQsIGFuZCBtYXkgdHJpZ2dlciBhCisJd2FybmluZyBmb3IgdGhlIHVwcGVyIDE2IGJpdHMgKGlmIHRoZXkncmUgdW5pbml0aWFsaXplZCkuCisKKy0gYGBDT05GSUdfU0xBQj15YGAgb3IgYGBDT05GSUdfU0xVQj15YGAKKwlUaGlzIG9wdGlvbiBpcyBsb2NhdGVkIHVuZGVyICJHZW5lcmFsIHNldHVwIiAvICJDaG9vc2UgU0xBQgorCWFsbG9jYXRvciIuCisKKy0gYGBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSPW5gYAorCVRoaXMgb3B0aW9uIGlzIGxvY2F0ZWQgdW5kZXIgIktlcm5lbCBoYWNraW5nIiAvICJUcmFjZXJzIiAvICJLZXJuZWwKKwlGdW5jdGlvbiBUcmFjZXIiCisKKwlXaGVuIGZ1bmN0aW9uIHRyYWNpbmcgaXMgY29tcGlsZWQgaW4sIGdjYyBlbWl0cyBhIGNhbGwgdG8gYW5vdGhlcgorCWZ1bmN0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkgZnVuY3Rpb24uIFRoaXMgbWVhbnMgdGhhdCB3aGVuIHRoZQorCXBhZ2UgZmF1bHQgaGFuZGxlciBpcyBjYWxsZWQsIHRoZSBmdHJhY2UgZnJhbWV3b3JrIHdpbGwgYmUgY2FsbGVkCisJYmVmb3JlIGttZW1jaGVjayBoYXMgaGFkIGEgY2hhbmNlIHRvIGhhbmRsZSB0aGUgZmF1bHQuIElmIGZ0cmFjZSB0aGVuCisJbW9kaWZpZXMgbWVtb3J5IHRoYXQgd2FzIHRyYWNrZWQgYnkga21lbWNoZWNrLCB0aGUgcmVzdWx0IGlzIGFuCisJZW5kbGVzcyByZWN1cnNpdmUgcGFnZSBmYXVsdC4KKworLSBgYENPTkZJR19ERUJVR19QQUdFQUxMT0M9bmBgCisJVGhpcyBvcHRpb24gaXMgbG9jYXRlZCB1bmRlciAiS2VybmVsIGhhY2tpbmciIC8gIk1lbW9yeSBEZWJ1Z2dpbmciCisJLyAiRGVidWcgcGFnZSBtZW1vcnkgYWxsb2NhdGlvbnMiLgorCitJbiBhZGRpdGlvbiwgSSBoaWdobHkgcmVjb21tZW5kIHR1cm5pbmcgb24gYGBDT05GSUdfREVCVUdfSU5GTz15YGAuIFRoaXMgaXMgYWxzbworbG9jYXRlZCB1bmRlciAiS2VybmVsIGhhY2tpbmciLiBXaXRoIHRoaXMsIHlvdSB3aWxsIGJlIGFibGUgdG8gZ2V0IGxpbmUgbnVtYmVyCitpbmZvcm1hdGlvbiBmcm9tIHRoZSBrbWVtY2hlY2sgd2FybmluZ3MsIHdoaWNoIGlzIGV4dHJlbWVseSB2YWx1YWJsZSBpbgorZGVidWdnaW5nIGEgcHJvYmxlbS4gVGhpcyBvcHRpb24gaXMgbm90IG1hbmRhdG9yeSwgaG93ZXZlciwgYmVjYXVzZSBpdCBzbG93cworZG93biB0aGUgY29tcGlsYXRpb24gcHJvY2VzcyBhbmQgcHJvZHVjZXMgYSBtdWNoIGJpZ2dlciBrZXJuZWwgaW1hZ2UuCisKK05vdyB0aGUga21lbWNoZWNrIG1lbnUgc2hvdWxkIGJlIHZpc2libGUgKHVuZGVyICJLZXJuZWwgaGFja2luZyIgLyAiTWVtb3J5CitEZWJ1Z2dpbmciIC8gImttZW1jaGVjazogdHJhcCB1c2Ugb2YgdW5pbml0aWFsaXplZCBtZW1vcnkiKS4gSGVyZSBmb2xsb3dzCithIGRlc2NyaXB0aW9uIG9mIHRoZSBrbWVtY2hlY2sgY29uZmlndXJhdGlvbiB2YXJpYWJsZXM6CisKKy0gYGBDT05GSUdfS01FTUNIRUNLYGAKKwlUaGlzIG11c3QgYmUgZW5hYmxlZCBpbiBvcmRlciB0byB1c2Uga21lbWNoZWNrIGF0IGFsbC4uLgorCistIGBgQ09ORklHX0tNRU1DSEVDS19gYFtgYERJU0FCTEVEYGAgfCBgYEVOQUJMRURgYCB8IGBgT05FU0hPVGBgXWBgX0JZX0RFRkFVTFRgYAorCVRoaXMgb3B0aW9uIGNvbnRyb2xzIHRoZSBzdGF0dXMgb2Yga21lbWNoZWNrIGF0IGJvb3QtdGltZS4gIkVuYWJsZWQiCisJd2lsbCBlbmFibGUga21lbWNoZWNrIHJpZ2h0IGZyb20gdGhlIHN0YXJ0LCAiZGlzYWJsZWQiIHdpbGwgYm9vdCB0aGUKKwlrZXJuZWwgYXMgbm9ybWFsIChidXQgd2l0aCB0aGUga21lbWNoZWNrIGNvZGUgY29tcGlsZWQgaW4sIHNvIGl0IGNhbgorCWJlIGVuYWJsZWQgYXQgcnVuLXRpbWUgYWZ0ZXIgdGhlIGtlcm5lbCBoYXMgYm9vdGVkKSwgYW5kICJvbmUtc2hvdCIgaXMKKwlhIHNwZWNpYWwgbW9kZSB3aGljaCB3aWxsIHR1cm4ga21lbWNoZWNrIG9mZiBhdXRvbWF0aWNhbGx5IGFmdGVyCisJZGV0ZWN0aW5nIHRoZSBmaXJzdCB1c2Ugb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuCisKKwlJZiB5b3UgYXJlIHVzaW5nIGttZW1jaGVjayB0byBhY3RpdmVseSBkZWJ1ZyBhIHByb2JsZW0sIHRoZW4geW91CisJcHJvYmFibHkgd2FudCB0byBjaG9vc2UgImVuYWJsZWQiIGhlcmUuCisKKwlUaGUgb25lLXNob3QgbW9kZSBpcyBtb3N0bHkgdXNlZnVsIGluIGF1dG9tYXRlZCB0ZXN0IHNldHVwcyBiZWNhdXNlIGl0CisJY2FuIHByZXZlbnQgZmxvb2RzIG9mIHdhcm5pbmdzIGFuZCBpbmNyZWFzZSB0aGUgY2hhbmNlcyBvZiB0aGUgbWFjaGluZQorCXN1cnZpdmluZyBpbiBjYXNlIHNvbWV0aGluZyBpcyByZWFsbHkgd3JvbmcuIEluIG90aGVyIGNhc2VzLCB0aGUgb25lLQorCXNob3QgbW9kZSBjb3VsZCBhY3R1YWxseSBiZSBjb3VudGVyLXByb2R1Y3RpdmUgYmVjYXVzZSBpdCB3b3VsZCB0dXJuCisJaXRzZWxmIG9mZiBhdCB0aGUgdmVyeSBmaXJzdCBlcnJvciAtLSBpbiB0aGUgY2FzZSBvZiBhIGZhbHNlIHBvc2l0aXZlCisJdG9vIC0tIGFuZCB0aGlzIHdvdWxkIGNvbWUgaW4gdGhlIHdheSBvZiBkZWJ1Z2dpbmcgdGhlIHNwZWNpZmljCisJcHJvYmxlbSB5b3Ugd2VyZSBpbnRlcmVzdGVkIGluLgorCisJSWYgeW91IHdvdWxkIGxpa2UgdG8gdXNlIHlvdXIga2VybmVsIGFzIG5vcm1hbCwgYnV0IHdpdGggYSBjaGFuY2UgdG8KKwllbmFibGUga21lbWNoZWNrIGluIGNhc2Ugb2Ygc29tZSBwcm9ibGVtLCBpdCBtaWdodCBiZSBhIGdvb2QgaWRlYSB0bworCWNob29zZSAiZGlzYWJsZWQiIGhlcmUuIFdoZW4ga21lbWNoZWNrIGlzIGRpc2FibGVkLCBtb3N0IG9mIHRoZSBydW4tCisJdGltZSBvdmVyaGVhZCBpcyBub3QgaW5jdXJyZWQsIGFuZCB0aGUga2VybmVsIHdpbGwgYmUgYWxtb3N0IGFzIGZhc3QKKwlhcyBub3JtYWwuCisKKy0gYGBDT05GSUdfS01FTUNIRUNLX1FVRVVFX1NJWkVgYAorCVNlbGVjdCB0aGUgbWF4aW11bSBudW1iZXIgb2YgZXJyb3IgcmVwb3J0cyB0byBzdG9yZSBpbiBhbiBpbnRlcm5hbAorCShmaXhlZC1zaXplKSBidWZmZXIuIFNpbmNlIGVycm9ycyBjYW4gb2NjdXIgdmlydHVhbGx5IGFueXdoZXJlIGFuZCBpbgorCWFueSBjb250ZXh0LCB3ZSBuZWVkIGEgdGVtcG9yYXJ5IHN0b3JhZ2UgYXJlYSB3aGljaCBpcyBndWFyYW50ZWVkIG5vdAorCXRvIGdlbmVyYXRlIGFueSBvdGhlciBwYWdlIGZhdWx0cyB3aGVuIGFjY2Vzc2VkLiBUaGUgcXVldWUgd2lsbCBiZQorCWVtcHRpZWQgYXMgc29vbiBhcyBhIHRhc2tsZXQgbWF5IGJlIHNjaGVkdWxlZC4gSWYgdGhlIHF1ZXVlIGlzIGZ1bGwsCisJbmV3IGVycm9yIHJlcG9ydHMgd2lsbCBiZSBsb3N0LgorCisJVGhlIGRlZmF1bHQgdmFsdWUgb2YgNjQgaXMgcHJvYmFibHkgZmluZS4gSWYgc29tZSBjb2RlIHByb2R1Y2VzIG1vcmUKKwl0aGFuIDY0IGVycm9ycyB3aXRoaW4gYW4gaXJxcy1vZmYgc2VjdGlvbiwgdGhlbiB0aGUgY29kZSBpcyBsaWtlbHkgdG8KKwlwcm9kdWNlIG1hbnksIG1hbnkgbW9yZSwgdG9vLCBhbmQgdGhlc2UgYWRkaXRpb25hbCByZXBvcnRzIHNlbGRvbSBnaXZlCisJYW55IG1vcmUgaW5mb3JtYXRpb24gKHRoZSBmaXJzdCByZXBvcnQgaXMgdXN1YWxseSB0aGUgbW9zdCB2YWx1YWJsZQorCWFueXdheSkuCisKKwlUaGlzIG51bWJlciBtaWdodCBoYXZlIHRvIGJlIGFkanVzdGVkIGlmIHlvdSBhcmUgbm90IHVzaW5nIHNlcmlhbAorCWNvbnNvbGUgb3Igc2ltaWxhciB0byBjYXB0dXJlIHRoZSBrZXJuZWwgbG9nLiBJZiB5b3UgYXJlIHVzaW5nIHRoZQorCSJkbWVzZyIgY29tbWFuZCB0byBzYXZlIHRoZSBsb2csIHRoZW4gZ2V0dGluZyBhIGxvdCBvZiBrbWVtY2hlY2sKKwl3YXJuaW5ncyBtaWdodCBvdmVyZmxvdyB0aGUga2VybmVsIGxvZyBpdHNlbGYsIGFuZCB0aGUgZWFybGllciByZXBvcnRzCisJd2lsbCBnZXQgbG9zdCBpbiB0aGF0IHdheSBpbnN0ZWFkLiBUcnkgc2V0dGluZyB0aGlzIHRvIDEwIG9yIHNvIG9uCisJc3VjaCBhIHNldHVwLgorCistIGBgQ09ORklHX0tNRU1DSEVDS19TSEFET1dfQ09QWV9TSElGVGBgCisJU2VsZWN0IHRoZSBudW1iZXIgb2Ygc2hhZG93IGJ5dGVzIHRvIHNhdmUgYWxvbmcgd2l0aCBlYWNoIGVudHJ5IG9mIHRoZQorCWVycm9yLXJlcG9ydCBxdWV1ZS4gVGhlc2UgYnl0ZXMgaW5kaWNhdGUgd2hhdCBwYXJ0cyBvZiBhbiBhbGxvY2F0aW9uCisJYXJlIGluaXRpYWxpemVkLCB1bmluaXRpYWxpemVkLCBldGMuIGFuZCB3aWxsIGJlIGRpc3BsYXllZCB3aGVuIGFuCisJZXJyb3IgaXMgZGV0ZWN0ZWQgdG8gaGVscCB0aGUgZGVidWdnaW5nIG9mIGEgcGFydGljdWxhciBwcm9ibGVtLgorCisJVGhlIG51bWJlciBlbnRlcmVkIGhlcmUgaXMgYWN0dWFsbHkgdGhlIGxvZ2FyaXRobSBvZiB0aGUgbnVtYmVyIG9mCisJYnl0ZXMgdGhhdCB3aWxsIGJlIHNhdmVkLiBTbyBpZiB5b3UgcGljayBmb3IgZXhhbXBsZSA1IGhlcmUsIGttZW1jaGVjaworCXdpbGwgc2F2ZSAyXjUgPSAzMiBieXRlcy4KKworCVRoZSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZSBmaW5lIGZvciBkZWJ1Z2dpbmcgbW9zdCBwcm9ibGVtcy4gSXQgYWxzbworCWZpdHMgbmljZWx5IHdpdGhpbiA4MCBjb2x1bW5zLgorCistIGBgQ09ORklHX0tNRU1DSEVDS19QQVJUSUFMX09LYGAKKwlUaGlzIG9wdGlvbiAod2hlbiBlbmFibGVkKSB3b3JrcyBhcm91bmQgY2VydGFpbiBHQ0Mgb3B0aW1pemF0aW9ucyB0aGF0CisJcHJvZHVjZSAzMi1iaXQgcmVhZHMgZnJvbSAxNi1iaXQgdmFyaWFibGVzIHdoZXJlIHRoZSB1cHBlciAxNiBiaXRzIGFyZQorCXRocm93biBhd2F5IGFmdGVyd2FyZHMuCisKKwlUaGUgZGVmYXVsdCB2YWx1ZSAoZW5hYmxlZCkgaXMgcmVjb21tZW5kZWQuIFRoaXMgbWF5IG9mIGNvdXJzZSBoaWRlCisJc29tZSByZWFsIGVycm9ycywgYnV0IGRpc2FibGluZyBpdCB3b3VsZCBwcm9iYWJseSBwcm9kdWNlIGEgbG90IG9mCisJZmFsc2UgcG9zaXRpdmVzLgorCistIGBgQ09ORklHX0tNRU1DSEVDS19CSVRPUFNfT0tgYAorCVRoaXMgb3B0aW9uIHNpbGVuY2VzIHdhcm5pbmdzIHRoYXQgd291bGQgYmUgZ2VuZXJhdGVkIGZvciBiaXQtZmllbGQKKwlhY2Nlc3NlcyB3aGVyZSBub3QgYWxsIHRoZSBiaXRzIGFyZSBpbml0aWFsaXplZCBhdCB0aGUgc2FtZSB0aW1lLiBUaGlzCisJbWF5IGFsc28gaGlkZSBzb21lIHJlYWwgYnVncy4KKworCVRoaXMgb3B0aW9uIGlzIHByb2JhYmx5IG9ic29sZXRlLCBvciBpdCBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aAorCXRoZSBrbWVtY2hlY2stL2JpdGZpZWxkLWFubm90YXRpb25zIGZvciB0aGUgY29kZSBpbiBxdWVzdGlvbi4gVGhlCisJZGVmYXVsdCB2YWx1ZSBpcyB0aGVyZWZvcmUgZmluZS4KKworTm93IGNvbXBpbGUgdGhlIGtlcm5lbCBhcyB1c3VhbC4KKworCitIb3cgdG8gdXNlCistLS0tLS0tLS0tCisKK0Jvb3RpbmcKK35+fn5+fn4KKworRmlyc3Qgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnMuIFRoZXJlIGlzIG9ubHkgb25lCitvcHRpb24gc3BlY2lmaWMgdG8ga21lbWNoZWNrLCBhbmQgdGhpcyBpcyBjYWxsZWQgImttZW1jaGVjayIuIEl0IGNhbiBiZSB1c2VkCit0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBtb2RlIGFzIGNob3NlbiBieSB0aGUgYGBDT05GSUdfS01FTUNIRUNLXypfQllfREVGQVVMVGBgCitvcHRpb24uIEl0cyBwb3NzaWJsZSBzZXR0aW5ncyBhcmU6CisKKy0gYGBrbWVtY2hlY2s9MGBgIChkaXNhYmxlZCkKKy0gYGBrbWVtY2hlY2s9MWBgIChlbmFibGVkKQorLSBgYGttZW1jaGVjaz0yYGAgKG9uZS1zaG90IG1vZGUpCisKK0lmIFNMVUIgZGVidWdnaW5nIGhhcyBiZWVuIGVuYWJsZWQgaW4gdGhlIGtlcm5lbCwgaXQgbWF5IHRha2UgcHJlY2VkZW5jZSBvdmVyCitrbWVtY2hlY2sgaW4gc3VjaCBhIHdheSB0aGF0IHRoZSBzbGFiIGNhY2hlcyB3aGljaCBhcmUgdW5kZXIgU0xVQiBkZWJ1Z2dpbmcKK3dpbGwgbm90IGJlIHRyYWNrZWQgYnkga21lbWNoZWNrLiBJbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGlzIGRvZXNuJ3QgaGFwcGVuCisoZXZlbiB0aG91Z2ggaXQgc2hvdWxkbid0IGJ5IGRlZmF1bHQpLCB1c2UgU0xVQidzIGJvb3Qgb3B0aW9uIGBgc2x1Yl9kZWJ1Z2BgLAorbGlrZSB0aGlzOiBgYHNsdWJfZGVidWc9LWBgCisKK0luIGZhY3QsIHRoaXMgb3B0aW9uIG1heSBhbHNvIGJlIHVzZWQgZm9yIGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgU0xVQiB2cy4KK2ttZW1jaGVjay4gRm9yIGV4YW1wbGUsIGlmIHRoZSBjb21tYW5kIGxpbmUgaW5jbHVkZXMKK2Bga21lbWNoZWNrPTEgc2x1Yl9kZWJ1Zz0sZGVudHJ5YGAsIHRoZW4gU0xVQiBkZWJ1Z2dpbmcgd2lsbCBiZSB1c2VkIG9ubHkKK2ZvciB0aGUgImRlbnRyeSIgc2xhYiBjYWNoZSwgYW5kIHdpdGgga21lbWNoZWNrIHRyYWNraW5nIGFsbCB0aGUgb3RoZXIKK2NhY2hlcy4gVGhpcyBpcyBhZHZhbmNlZCB1c2FnZSwgaG93ZXZlciwgYW5kIGlzIG5vdCBnZW5lcmFsbHkgcmVjb21tZW5kZWQuCisKKworUnVuLXRpbWUgZW5hYmxlL2Rpc2FibGUKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1doZW4gdGhlIGtlcm5lbCBoYXMgYm9vdGVkLCBpdCBpcyBwb3NzaWJsZSB0byBlbmFibGUgb3IgZGlzYWJsZSBrbWVtY2hlY2sgYXQKK3J1bi10aW1lLiBXQVJOSU5HOiBUaGlzIGZlYXR1cmUgaXMgc3RpbGwgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2F1c2UgZmFsc2UKK3Bvc2l0aXZlIHdhcm5pbmdzIHRvIGFwcGVhci4gVGhlcmVmb3JlLCB0cnkgbm90IHRvIHVzZSB0aGlzLiBJZiB5b3UgZmluZCB0aGF0CitpdCBkb2Vzbid0IHdvcmsgcHJvcGVybHkgKGUuZy4geW91IHNlZSBhbiB1bnJlYXNvbmFibGUgYW1vdW50IG9mIHdhcm5pbmdzKSwgSQord2lsbCBiZSBoYXBweSB0byB0YWtlIGJ1ZyByZXBvcnRzLgorCitVc2UgdGhlIGZpbGUgYGAvcHJvYy9zeXMva2VybmVsL2ttZW1jaGVja2BgIGZvciB0aGlzIHB1cnBvc2UsIGUuZy46OgorCisJJCBlY2hvIDAgPiAvcHJvYy9zeXMva2VybmVsL2ttZW1jaGVjayAjIGRpc2FibGVzIGttZW1jaGVjaworCitUaGUgbnVtYmVycyBhcmUgdGhlIHNhbWUgYXMgZm9yIHRoZSBgYGttZW1jaGVjaz1gYCBjb21tYW5kLWxpbmUgb3B0aW9uLgorCisKK0RlYnVnZ2luZworfn5+fn5+fn5+CisKK0EgdHlwaWNhbCByZXBvcnQgd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6OgorCisgICAgV0FSTklORzoga21lbWNoZWNrOiBDYXVnaHQgMzItYml0IHJlYWQgZnJvbSB1bmluaXRpYWxpemVkIG1lbW9yeSAoZmZmZjg4MDAzZTRhMjAyNCkKKyAgICA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4OGZmZmYwMDAwMDAwMDAwMDAwMDAwCisgICAgIGkgaSBpIGkgdSB1IHUgdSBpIGkgaSBpIGkgaSBpIGkgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdQorICAgICAgICAgICAgIF4KKworICAgIFBpZDogMTg1NiwgY29tbTogbnRwZGF0ZSBOb3QgdGFpbnRlZCAyLjYuMjktcmM1ICMyNjQgOTQ1UC1BCisgICAgUklQOiAwMDEwOls8ZmZmZmZmZmY4MTA0ZWRlOD5dICBbPGZmZmZmZmZmODEwNGVkZTg+XSBfX2RlcXVldWVfc2lnbmFsKzB4YzgvMHgxOTAKKyAgICBSU1A6IDAwMTg6ZmZmZjg4MDAzY2RmN2Q5OCAgRUZMQUdTOiAwMDIxMDAwMgorICAgIFJBWDogMDAwMDAwMDAwMDAwMDAzMCBSQlg6IGZmZmY4ODAwM2Q0ZWE5NjggUkNYOiAwMDAwMDAwMDAwMDAwMDA5CisgICAgUkRYOiBmZmZmODgwMDNlNWQ2MDE4IFJTSTogZmZmZjg4MDAzZTVkNjAyNCBSREk6IGZmZmY4ODAwM2NkZjdlODQKKyAgICBSQlA6IGZmZmY4ODAwM2NkZjdkYjggUjA4OiBmZmZmODgwMDNlNWQ2MDAwIFIwOTogMDAwMDAwMDAwMDAwMDAwMAorICAgIFIxMDogMDAwMDAwMDAwMDAwMDA4MCBSMTE6IDAwMDAwMDAwMDAwMDAwMDAgUjEyOiAwMDAwMDAwMDAwMDAwMDBlCisgICAgUjEzOiBmZmZmODgwMDNjZGY3ZTc4IFIxNDogZmZmZjg4MDAzZDUzMDcxMCBSMTU6IGZmZmY4ODAwM2Q1YTk4YzgKKyAgICBGUzogIDAwMDAwMDAwMDAwMDAwMDAoMDAwMCkgR1M6ZmZmZjg4MDAwMTk4MjAwMCgwMDYzKSBrbmxHUzowMDAwMAorICAgIENTOiAgMDAxMCBEUzogMDAyYiBFUzogMDAyYiBDUjA6IDAwMDAwMDAwODAwNTAwMzMKKyAgICBDUjI6IGZmZmY4ODAwM2Y4MDZlYTAgQ1IzOiAwMDAwMDAwMDNjMDM2MDAwIENSNDogMDAwMDAwMDAwMDAwMDZhMAorICAgIERSMDogMDAwMDAwMDAwMDAwMDAwMCBEUjE6IDAwMDAwMDAwMDAwMDAwMDAgRFIyOiAwMDAwMDAwMDAwMDAwMDAwCisgICAgRFIzOiAwMDAwMDAwMDAwMDAwMDAwIERSNjogMDAwMDAwMDBmZmZmNGZmMCBEUjc6IDAwMDAwMDAwMDAwMDA0MDAKKyAgICAgWzxmZmZmZmZmZjgxMDRmMDRlPl0gZGVxdWV1ZV9zaWduYWwrMHg4ZS8weDE3MAorICAgICBbPGZmZmZmZmZmODEwNTBiZDg+XSBnZXRfc2lnbmFsX3RvX2RlbGl2ZXIrMHg5OC8weDM5MAorICAgICBbPGZmZmZmZmZmODEwMGI4N2Q+XSBkb19ub3RpZnlfcmVzdW1lKzB4YWQvMHg3ZDAKKyAgICAgWzxmZmZmZmZmZjgxMDBjN2I1Pl0gaW50X3NpZ25hbCsweDEyLzB4MTcKKyAgICAgWzxmZmZmZmZmZmZmZmZmZmZmPl0gMHhmZmZmZmZmZmZmZmZmZmZmCisKK1RoZSBzaW5nbGUgbW9zdCB2YWx1YWJsZSBpbmZvcm1hdGlvbiBpbiB0aGlzIHJlcG9ydCBpcyB0aGUgUklQIChvciBFSVAgb24gMzItCitiaXQpIHZhbHVlLiBUaGlzIHdpbGwgaGVscCB1cyBwaW5wb2ludCBleGFjdGx5IHdoaWNoIGluc3RydWN0aW9uIHRoYXQgY2F1c2VkCit0aGUgd2FybmluZy4KKworSWYgeW91ciBrZXJuZWwgd2FzIGNvbXBpbGVkIHdpdGggYGBDT05GSUdfREVCVUdfSU5GTz15YGAsIHRoZW4gYWxsIHdlIGhhdmUgdG8gZG8KK2lzIGdpdmUgdGhpcyBhZGRyZXNzIHRvIHRoZSBhZGRyMmxpbmUgcHJvZ3JhbSwgbGlrZSB0aGlzOjoKKworCSQgYWRkcjJsaW5lIC1lIHZtbGludXggLWkgZmZmZmZmZmY4MTA0ZWRlOAorCWFyY2gveDg2L2luY2x1ZGUvYXNtL3N0cmluZ182NC5oOjEyCisJaW5jbHVkZS9hc20tZ2VuZXJpYy9zaWdpbmZvLmg6Mjg3CisJa2VybmVsL3NpZ25hbC5jOjM4MAorCWtlcm5lbC9zaWduYWwuYzo0MTAKKworVGhlICJgYC1lIHZtbGludXhgYCIgdGVsbHMgYWRkcjJsaW5lIHdoaWNoIGZpbGUgdG8gbG9vayBpbi4gKipJTVBPUlRBTlQ6KioKK1RoaXMgbXVzdCBiZSB0aGUgdm1saW51eCBvZiB0aGUga2VybmVsIHRoYXQgcHJvZHVjZWQgdGhlIHdhcm5pbmcgaW4gdGhlCitmaXJzdCBwbGFjZSEgSWYgbm90LCB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlCit3cm9uZy4KKworVGhlICJgYC1pYGAiIHRlbGxzIGFkZHIybGluZSB0byBhbHNvIHByaW50IHRoZSBsaW5lIG51bWJlcnMgb2YgaW5saW5lZAorZnVuY3Rpb25zLiAgSW4gdGhpcyBjYXNlLCB0aGUgZmxhZyB3YXMgdmVyeSBpbXBvcnRhbnQsIGJlY2F1c2Ugb3RoZXJ3aXNlLAoraXQgd291bGQgb25seSBoYXZlIHByaW50ZWQgdGhlIGZpcnN0IGxpbmUsIHdoaWNoIGlzIGp1c3QgYSBjYWxsIHRvCitgYG1lbWNweSgpYGAsIHdoaWNoIGNvdWxkIGJlIGNhbGxlZCBmcm9tIGEgdGhvdXNhbmQgcGxhY2VzIGluIHRoZSBrZXJuZWwsIGFuZAoraXMgdGhlcmVmb3JlIG5vdCB2ZXJ5IHVzZWZ1bC4gIFRoZXNlIGlubGluZWQgZnVuY3Rpb25zIHdvdWxkIG5vdCBzaG93IHVwIGluCit0aGUgc3RhY2sgdHJhY2UgYWJvdmUsIHNpbXBseSBiZWNhdXNlIHRoZSBrZXJuZWwgZG9lc24ndCBsb2FkIHRoZSBleHRyYQorZGVidWdnaW5nIGluZm9ybWF0aW9uLiBUaGlzIHRlY2huaXF1ZSBjYW4gb2YgY291cnNlIGJlIHVzZWQgd2l0aCBvcmRpbmFyeQora2VybmVsIG9vcHNlcyBhcyB3ZWxsLgorCitJbiB0aGlzIGNhc2UsIGl0J3MgdGhlIGNhbGxlciBvZiBgYG1lbWNweSgpYGAgdGhhdCBpcyBpbnRlcmVzdGluZywgYW5kIGl0IGNhbiBiZQorZm91bmQgaW4gYGBpbmNsdWRlL2FzbS1nZW5lcmljL3NpZ2luZm8uaGBgLCBsaW5lIDI4Nzo6CisKKyAgICAyODEgc3RhdGljIGlubGluZSB2b2lkIGNvcHlfc2lnaW5mbyhzdHJ1Y3Qgc2lnaW5mbyAqdG8sIHN0cnVjdCBzaWdpbmZvICpmcm9tKQorICAgIDI4MiB7CisgICAgMjgzICAgICAgICAgaWYgKGZyb20tPnNpX2NvZGUgPCAwKQorICAgIDI4NCAgICAgICAgICAgICAgICAgbWVtY3B5KHRvLCBmcm9tLCBzaXplb2YoKnRvKSk7CisgICAgMjg1ICAgICAgICAgZWxzZQorICAgIDI4NiAgICAgICAgICAgICAgICAgLyogX3NpZ2NobGQgaXMgY3VycmVudGx5IHRoZSBsYXJnZXN0IGtub3cgdW5pb24gbWVtYmVyICovCisgICAgMjg3ICAgICAgICAgICAgICAgICBtZW1jcHkodG8sIGZyb20sIF9fQVJDSF9TSV9QUkVBTUJMRV9TSVpFICsgc2l6ZW9mKGZyb20tPl9zaWZpZWxkcy5fc2lnY2hsZCkpOworICAgIDI4OCB9CisKK1NpbmNlIHRoaXMgd2FzIGEgcmVhZCAoa21lbWNoZWNrIHVzdWFsbHkgd2FybnMgYWJvdXQgcmVhZHMgb25seSwgdGhvdWdoIGl0IGNhbgord2FybiBhYm91dCB3cml0ZXMgdG8gdW5hbGxvY2F0ZWQgb3IgZnJlZWQgbWVtb3J5IGFzIHdlbGwpLCBpdCB3YXMgcHJvYmFibHkgdGhlCisiZnJvbSIgYXJndW1lbnQgd2hpY2ggY29udGFpbmVkIHNvbWUgdW5pbml0aWFsaXplZCBieXRlcy4gRm9sbG93aW5nIHRoZSBjaGFpbgorb2YgY2FsbHMsIHdlIG1vdmUgdXB3YXJkcyB0byBzZWUgd2hlcmUgImZyb20iIHdhcyBhbGxvY2F0ZWQgb3IgaW5pdGlhbGl6ZWQsCitgYGtlcm5lbC9zaWduYWwuY2BgLCBsaW5lIDM4MDo6CisKKyAgICAzNTkgc3RhdGljIHZvaWQgY29sbGVjdF9zaWduYWwoaW50IHNpZywgc3RydWN0IHNpZ3BlbmRpbmcgKmxpc3QsIHNpZ2luZm9fdCAqaW5mbykKKyAgICAzNjAgeworICAgIC4uLgorICAgIDM2NyAgICAgICAgIGxpc3RfZm9yX2VhY2hfZW50cnkocSwgJmxpc3QtPmxpc3QsIGxpc3QpIHsKKyAgICAzNjggICAgICAgICAgICAgICAgIGlmIChxLT5pbmZvLnNpX3NpZ25vID09IHNpZykgeworICAgIDM2OSAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgMzcwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBzdGlsbF9wZW5kaW5nOworICAgIDM3MSAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IHE7CisgICAgLi4uCisgICAgMzc3ICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgMzc4IHN0aWxsX3BlbmRpbmc6CisgICAgMzc5ICAgICAgICAgICAgICAgICBsaXN0X2RlbF9pbml0KCZmaXJzdC0+bGlzdCk7CisgICAgMzgwICAgICAgICAgICAgICAgICBjb3B5X3NpZ2luZm8oaW5mbywgJmZpcnN0LT5pbmZvKTsKKyAgICAzODEgICAgICAgICAgICAgICAgIF9fc2lncXVldWVfZnJlZShmaXJzdCk7CisgICAgLi4uCisgICAgMzkyICAgICAgICAgfQorICAgIDM5MyB9CisKK0hlcmUsIGl0IGlzIGBgJmZpcnN0LT5pbmZvYGAgdGhhdCBpcyBiZWluZyBwYXNzZWQgb24gdG8gYGBjb3B5X3NpZ2luZm8oKWBgLiBUaGUKK3ZhcmlhYmxlIGBgZmlyc3RgYCB3YXMgZm91bmQgb24gYSBsaXN0IC0tIHBhc3NlZCBpbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvCitgYGNvbGxlY3Rfc2lnbmFsKClgYC4gV2UgIGNvbnRpbnVlIG91ciBqb3VybmV5IHRocm91Z2ggdGhlIHN0YWNrLCB0byBmaWd1cmUgb3V0Cit3aGVyZSB0aGUgaXRlbSBvbiAibGlzdCIgd2FzIGFsbG9jYXRlZCBvciBpbml0aWFsaXplZC4gV2UgbW92ZSB0byBsaW5lIDQxMDo6CisKKyAgICAzOTUgc3RhdGljIGludCBfX2RlcXVldWVfc2lnbmFsKHN0cnVjdCBzaWdwZW5kaW5nICpwZW5kaW5nLCBzaWdzZXRfdCAqbWFzaywKKyAgICAzOTYgICAgICAgICAgICAgICAgICAgICAgICAgc2lnaW5mb190ICppbmZvKQorICAgIDM5NyB7CisgICAgLi4uCisgICAgNDEwICAgICAgICAgICAgICAgICBjb2xsZWN0X3NpZ25hbChzaWcsIHBlbmRpbmcsIGluZm8pOworICAgIC4uLgorICAgIDQxNCB9CisKK05vdyB3ZSBuZWVkIHRvIGZvbGxvdyB0aGUgYGBwZW5kaW5nYGAgcG9pbnRlciwgc2luY2UgdGhhdCBpcyBiZWluZyBwYXNzZWQgb24gdG8KK2BgY29sbGVjdF9zaWduYWwoKWBgIGFzIGBgbGlzdGBgLiBBdCB0aGlzIHBvaW50LCB3ZSd2ZSBydW4gb3V0IG9mIGxpbmVzIGZyb20gdGhlCisiYWRkcjJsaW5lIiBvdXRwdXQuIE5vdCB0byB3b3JyeSwgd2UganVzdCBwYXN0ZSB0aGUgbmV4dCBhZGRyZXNzZXMgZnJvbSB0aGUKK2ttZW1jaGVjayBzdGFjayBkdW1wLCBpLmUuOjoKKworICAgICBbPGZmZmZmZmZmODEwNGYwNGU+XSBkZXF1ZXVlX3NpZ25hbCsweDhlLzB4MTcwCisgICAgIFs8ZmZmZmZmZmY4MTA1MGJkOD5dIGdldF9zaWduYWxfdG9fZGVsaXZlcisweDk4LzB4MzkwCisgICAgIFs8ZmZmZmZmZmY4MTAwYjg3ZD5dIGRvX25vdGlmeV9yZXN1bWUrMHhhZC8weDdkMAorICAgICBbPGZmZmZmZmZmODEwMGM3YjU+XSBpbnRfc2lnbmFsKzB4MTIvMHgxNworCisJJCBhZGRyMmxpbmUgLWUgdm1saW51eCAtaSBmZmZmZmZmZjgxMDRmMDRlIGZmZmZmZmZmODEwNTBiZDggXAorCQlmZmZmZmZmZjgxMDBiODdkIGZmZmZmZmZmODEwMGM3YjUKKwlrZXJuZWwvc2lnbmFsLmM6NDQ2CisJa2VybmVsL3NpZ25hbC5jOjE4MDYKKwlhcmNoL3g4Ni9rZXJuZWwvc2lnbmFsLmM6ODA1CisJYXJjaC94ODYva2VybmVsL3NpZ25hbC5jOjg3MQorCWFyY2gveDg2L2tlcm5lbC9lbnRyeV82NC5TOjY5NAorCitSZW1lbWJlciB0aGF0IHNpbmNlIHRoZXNlIGFkZHJlc3NlcyB3ZXJlIGZvdW5kIG9uIHRoZSBzdGFjayBhbmQgbm90IGFzIHRoZQorUklQIHZhbHVlLCB0aGV5IGFjdHVhbGx5IHBvaW50IHRvIHRoZSBfbmV4dF8gaW5zdHJ1Y3Rpb24gKHRoZXkgYXJlIHJldHVybgorYWRkcmVzc2VzKS4gVGhpcyBiZWNvbWVzIG9idmlvdXMgd2hlbiB3ZSBsb29rIGF0IHRoZSBjb2RlIGZvciBsaW5lIDQ0Njo6CisKKyAgICA0MjIgaW50IGRlcXVldWVfc2lnbmFsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzaWdzZXRfdCAqbWFzaywgc2lnaW5mb190ICppbmZvKQorICAgIDQyMyB7CisgICAgLi4uCisgICAgNDMxICAgICAgICAgICAgICAgICBzaWduciA9IF9fZGVxdWV1ZV9zaWduYWwoJnRzay0+c2lnbmFsLT5zaGFyZWRfcGVuZGluZywKKyAgICA0MzIJCQkJCQkgbWFzaywgaW5mbyk7CisgICAgNDMzCQkJLyoKKyAgICA0MzQJCQkgKiBpdGltZXIgc2lnbmFsID8KKyAgICA0MzUJCQkgKgorICAgIDQzNgkJCSAqIGl0aW1lcnMgYXJlIHByb2Nlc3Mgc2hhcmVkIGFuZCB3ZSByZXN0YXJ0IHBlcmlvZGljCisgICAgNDM3CQkJICogaXRpbWVycyBpbiB0aGUgc2lnbmFsIGRlbGl2ZXJ5IHBhdGggdG8gcHJldmVudCBEb1MKKyAgICA0MzgJCQkgKiBhdHRhY2tzIGluIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIgY2FzZS4gVGhpcyBpcworICAgIDQzOQkJCSAqIGNvbXBsaWFudCB3aXRoIHRoZSBvbGQgd2F5IG9mIHNlbGYgcmVzdGFydGluZworICAgIDQ0MAkJCSAqIGl0aW1lcnMsIGFzIHRoZSBTSUdBTFJNIGlzIGEgbGVnYWN5IHNpZ25hbCBhbmQgb25seQorICAgIDQ0MQkJCSAqIHF1ZXVlZCBvbmNlLiBDaGFuZ2luZyB0aGUgcmVzdGFydCBiZWhhdmlvdXIgdG8KKyAgICA0NDIJCQkgKiByZXN0YXJ0IHRoZSB0aW1lciBpbiB0aGUgc2lnbmFsIGRlcXVldWUgcGF0aCBpcworICAgIDQ0MwkJCSAqIHJlZHVjaW5nIHRoZSB0aW1lciBub2lzZSBvbiBoZWF2eSBsb2FkZWQgIWhpZ2hyZXMKKyAgICA0NDQJCQkgKiBzeXN0ZW1zIHRvby4KKyAgICA0NDUJCQkgKi8KKyAgICA0NDYJCQlpZiAodW5saWtlbHkoc2lnbnIgPT0gU0lHQUxSTSkpIHsKKyAgICAuLi4KKyAgICA0ODkgfQorCitTbyBpbnN0ZWFkIG9mIGxvb2tpbmcgYXQgNDQ2LCB3ZSBzaG91bGQgYmUgbG9va2luZyBhdCA0MzEsIHdoaWNoIGlzIHRoZSBsaW5lCit0aGF0IGV4ZWN1dGVzIGp1c3QgYmVmb3JlIDQ0Ni4gSGVyZSB3ZSBzZWUgdGhhdCB3aGF0IHdlIGFyZSBsb29raW5nIGZvciBpcworYGAmdHNrLT5zaWduYWwtPnNoYXJlZF9wZW5kaW5nYGAuCisKK091ciBuZXh0IHRhc2sgaXMgbm93IHRvIGZpZ3VyZSBvdXQgd2hpY2ggZnVuY3Rpb24gdGhhdCBwdXRzIGl0ZW1zIG9uIHRoaXMKK2Bgc2hhcmVkX3BlbmRpbmdgYCBsaXN0LiBBIGNydWRlLCBidXQgZWZmaWNpZW50IHRvb2wsIGlzIGBgZ2l0IGdyZXBgYDo6CisKKwkkIGdpdCBncmVwIC1uICdzaGFyZWRfcGVuZGluZycga2VybmVsLworCS4uLgorCWtlcm5lbC9zaWduYWwuYzo4Mjg6CXBlbmRpbmcgPSBncm91cCA/ICZ0LT5zaWduYWwtPnNoYXJlZF9wZW5kaW5nIDogJnQtPnBlbmRpbmc7CisJa2VybmVsL3NpZ25hbC5jOjEzMzk6CXBlbmRpbmcgPSBncm91cCA/ICZ0LT5zaWduYWwtPnNoYXJlZF9wZW5kaW5nIDogJnQtPnBlbmRpbmc7CisJLi4uCisKK1RoZXJlIHdlcmUgbW9yZSByZXN1bHRzLCBidXQgbm9uZSBvZiB0aGVtIHdlcmUgcmVsYXRlZCB0byBsaXN0IG9wZXJhdGlvbnMsCithbmQgdGhlc2Ugd2VyZSB0aGUgb25seSBhc3NpZ25tZW50cy4gV2UgaW5zcGVjdCB0aGUgbGluZSBudW1iZXJzIG1vcmUgY2xvc2VseQorYW5kIGZpbmQgdGhhdCB0aGlzIGlzIGluZGVlZCB3aGVyZSBpdGVtcyBhcmUgYmVpbmcgYWRkZWQgdG8gdGhlIGxpc3Q6OgorCisgICAgODE2IHN0YXRpYyBpbnQgc2VuZF9zaWduYWwoaW50IHNpZywgc3RydWN0IHNpZ2luZm8gKmluZm8sIHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwKKyAgICA4MTcJCQkJaW50IGdyb3VwKQorICAgIDgxOCB7CisgICAgLi4uCisgICAgODI4CQlwZW5kaW5nID0gZ3JvdXAgPyAmdC0+c2lnbmFsLT5zaGFyZWRfcGVuZGluZyA6ICZ0LT5wZW5kaW5nOworICAgIC4uLgorICAgIDg1MQkJcSA9IF9fc2lncXVldWVfYWxsb2ModCwgR0ZQX0FUT01JQywgKHNpZyA8IFNJR1JUTUlOICYmCisgICAgODUyCQkJCQkJICAgICAoaXNfc2lfc3BlY2lhbChpbmZvKSB8fAorICAgIDg1MwkJCQkJCSAgICAgIGluZm8tPnNpX2NvZGUgPj0gMCkpKTsKKyAgICA4NTQJCWlmIChxKSB7CisgICAgODU1CQkJbGlzdF9hZGRfdGFpbCgmcS0+bGlzdCwgJnBlbmRpbmctPmxpc3QpOworICAgIC4uLgorICAgIDg5MCB9CisKK2FuZDo6CisKKyAgICAxMzA5IGludCBzZW5kX3NpZ3F1ZXVlKHN0cnVjdCBzaWdxdWV1ZSAqcSwgc3RydWN0IHRhc2tfc3RydWN0ICp0LCBpbnQgZ3JvdXApCisgICAgMTMxMCB7CisgICAgLi4uLgorICAgIDEzMzkJIHBlbmRpbmcgPSBncm91cCA/ICZ0LT5zaWduYWwtPnNoYXJlZF9wZW5kaW5nIDogJnQtPnBlbmRpbmc7CisgICAgMTM0MAkgbGlzdF9hZGRfdGFpbCgmcS0+bGlzdCwgJnBlbmRpbmctPmxpc3QpOworICAgIC4uLi4KKyAgICAxMzQ3IH0KKworSW4gdGhlIGZpcnN0IGNhc2UsIHRoZSBsaXN0IGVsZW1lbnQgd2UgYXJlIGxvb2tpbmcgZm9yLCBgYHFgYCwgaXMgYmVpbmcKK3JldHVybmVkIGZyb20gdGhlIGZ1bmN0aW9uIGBgX19zaWdxdWV1ZV9hbGxvYygpYGAsIHdoaWNoIGxvb2tzIGxpa2UgYW4KK2FsbG9jYXRpb24gZnVuY3Rpb24uICBMZXQncyB0YWtlIGEgbG9vayBhdCBpdDo6CisKKyAgICAxODcgc3RhdGljIHN0cnVjdCBzaWdxdWV1ZSAqX19zaWdxdWV1ZV9hbGxvYyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsIGdmcF90IGZsYWdzLAorICAgIDE4OAkJCQkJCSBpbnQgb3ZlcnJpZGVfcmxpbWl0KQorICAgIDE4OSB7CisgICAgMTkwCQlzdHJ1Y3Qgc2lncXVldWUgKnEgPSBOVUxMOworICAgIDE5MQkJc3RydWN0IHVzZXJfc3RydWN0ICp1c2VyOworICAgIDE5MgorICAgIDE5MwkJLyoKKyAgICAxOTQJCSAqIFdlIHdvbid0IGdldCBwcm9ibGVtcyB3aXRoIHRoZSB0YXJnZXQncyBVSUQgY2hhbmdpbmcgdW5kZXIgdXMKKyAgICAxOTUJCSAqIGJlY2F1c2UgY2hhbmdpbmcgaXQgcmVxdWlyZXMgUkNVIGJlIHVzZWQsIGFuZCBpZiB0ICE9IGN1cnJlbnQsIHRoZQorICAgIDE5NgkJICogY2FsbGVyIG11c3QgYmUgaG9sZGluZyB0aGUgUkNVIHJlYWRsb2NrIChieSB3YXkgb2YgYSBzcGlubG9jaykgYW5kCisgICAgMTk3CQkgKiB3ZSB1c2UgUkNVIHByb3RlY3Rpb24gaGVyZQorICAgIDE5OAkJICovCisgICAgMTk5CQl1c2VyID0gZ2V0X3VpZChfX3Rhc2tfY3JlZCh0KS0+dXNlcik7CisgICAgMjAwCQlhdG9taWNfaW5jKCZ1c2VyLT5zaWdwZW5kaW5nKTsKKyAgICAyMDEJCWlmIChvdmVycmlkZV9ybGltaXQgfHwKKyAgICAyMDIJCSAgICBhdG9taWNfcmVhZCgmdXNlci0+c2lncGVuZGluZykgPD0KKyAgICAyMDMJCQkJdC0+c2lnbmFsLT5ybGltW1JMSU1JVF9TSUdQRU5ESU5HXS5ybGltX2N1cikKKyAgICAyMDQJCQlxID0ga21lbV9jYWNoZV9hbGxvYyhzaWdxdWV1ZV9jYWNoZXAsIGZsYWdzKTsKKyAgICAyMDUJCWlmICh1bmxpa2VseShxID09IE5VTEwpKSB7CisgICAgMjA2CQkJYXRvbWljX2RlYygmdXNlci0+c2lncGVuZGluZyk7CisgICAgMjA3CQkJZnJlZV91aWQodXNlcik7CisgICAgMjA4CQl9IGVsc2UgeworICAgIDIwOQkJCUlOSVRfTElTVF9IRUFEKCZxLT5saXN0KTsKKyAgICAyMTAJCQlxLT5mbGFncyA9IDA7CisgICAgMjExCQkJcS0+dXNlciA9IHVzZXI7CisgICAgMjEyCQl9CisgICAgMjEzCisgICAgMjE0CQlyZXR1cm4gcTsKKyAgICAyMTUgfQorCitXZSBzZWUgdGhhdCB0aGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIGBgcS0+bGlzdGBgLCBgYHEtPmZsYWdzYGAsIGFuZAorYGBxLT51c2VyYGAuIEl0IHNlZW1zIHRoYXQgbm93IGlzIHRoZSB0aW1lIHRvIGxvb2sgYXQgdGhlIGRlZmluaXRpb24gb2YKK2Bgc3RydWN0IHNpZ3F1ZXVlYGAsIGUuZy46OgorCisgICAgMTQgc3RydWN0IHNpZ3F1ZXVlIHsKKyAgICAxNQkgICAgICAgc3RydWN0IGxpc3RfaGVhZCBsaXN0OworICAgIDE2CSAgICAgICBpbnQgZmxhZ3M7CisgICAgMTcJICAgICAgIHNpZ2luZm9fdCBpbmZvOworICAgIDE4CSAgICAgICBzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKnVzZXI7CisgICAgMTkgfTsKKworQW5kLCB5b3UgbWlnaHQgcmVtZW1iZXIsIGl0IHdhcyBhIGBgbWVtY3B5KClgYCBvbiBgYCZmaXJzdC0+aW5mb2BgIHRoYXQKK2NhdXNlZCB0aGUgd2FybmluZywgc28gdGhpcyBtYWtlcyBwZXJmZWN0IHNlbnNlLiBJdCBhbHNvIHNlZW1zIHJlYXNvbmFibGUKK3RvIGFzc3VtZSB0aGF0IGl0IGlzIHRoZSBjYWxsZXIgb2YgYGBfX3NpZ3F1ZXVlX2FsbG9jKClgYCB0aGF0IGhhcyB0aGUKK3Jlc3BvbnNpYmlsaXR5IG9mIGZpbGxpbmcgb3V0IChpbml0aWFsaXppbmcpIHRoaXMgbWVtYmVyLgorCitCdXQganVzdCB3aGljaCBmaWVsZHMgb2YgdGhlIHN0cnVjdCB3ZXJlIHVuaW5pdGlhbGl6ZWQ/IExldCdzIGxvb2sgYXQKK2ttZW1jaGVjaydzIHJlcG9ydCBhZ2Fpbjo6CisKKyAgICBXQVJOSU5HOiBrbWVtY2hlY2s6IENhdWdodCAzMi1iaXQgcmVhZCBmcm9tIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IChmZmZmODgwMDNlNGEyMDI0KQorICAgIDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDg4ZmZmZjAwMDAwMDAwMDAwMDAwMDAKKyAgICAgaSBpIGkgaSB1IHUgdSB1IGkgaSBpIGkgaSBpIGkgaSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1CisJICAgICBeCisKK1RoZXNlIGZpcnN0IHR3byBsaW5lcyBhcmUgdGhlIG1lbW9yeSBkdW1wIG9mIHRoZSBtZW1vcnkgb2JqZWN0IGl0c2VsZiwgYW5kCit0aGUgc2hhZG93IGJ5dGVtYXAsIHJlc3BlY3RpdmVseS4gVGhlIG1lbW9yeSBvYmplY3QgaXRzZWxmIGlzIGluIHRoaXMgY2FzZQorYGAmZmlyc3QtPmluZm9gYC4gSnVzdCBiZXdhcmUgdGhhdCB0aGUgc3RhcnQgb2YgdGhpcyBkdW1wIGlzIE5PVCB0aGUgc3RhcnQKK29mIHRoZSBvYmplY3QgaXRzZWxmISBUaGUgcG9zaXRpb24gb2YgdGhlIGNhcmV0ICheKSBjb3JyZXNwb25kcyB3aXRoIHRoZQorYWRkcmVzcyBvZiB0aGUgcmVhZCAoZmZmZjg4MDAzZTRhMjAyNCkuCisKK1RoZSBzaGFkb3cgYnl0ZW1hcCBkdW1wIGxlZ2VuZCBpcyBhcyBmb2xsb3dzOgorCistIGk6IGluaXRpYWxpemVkCistIHU6IHVuaW5pdGlhbGl6ZWQKKy0gYTogdW5hbGxvY2F0ZWQgKG1lbW9yeSBoYXMgYmVlbiBhbGxvY2F0ZWQgYnkgdGhlIHNsYWIgbGF5ZXIsIGJ1dCBoYXMgbm90CisgIHlldCBiZWVuIGhhbmRlZCBvZmYgdG8gYW55Ym9keSkKKy0gZjogZnJlZWQgKG1lbW9yeSBoYXMgYmVlbiBhbGxvY2F0ZWQgYnkgdGhlIHNsYWIgbGF5ZXIsIGJ1dCBoYXMgYmVlbiBmcmVlZAorICBieSB0aGUgcHJldmlvdXMgb3duZXIpCisKK0luIG9yZGVyIHRvIGZpZ3VyZSBvdXQgd2hlcmUgKHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgb2JqZWN0KSB0aGUKK3VuaW5pdGlhbGl6ZWQgbWVtb3J5IHdhcyBsb2NhdGVkLCB3ZSBoYXZlIHRvIGxvb2sgYXQgdGhlIGRpc2Fzc2VtYmx5LiBGb3IKK3RoYXQsIHdlJ2xsIG5lZWQgdGhlIFJJUCBhZGRyZXNzIGFnYWluOjoKKworICAgIFJJUDogMDAxMDpbPGZmZmZmZmZmODEwNGVkZTg+XSAgWzxmZmZmZmZmZjgxMDRlZGU4Pl0gX19kZXF1ZXVlX3NpZ25hbCsweGM4LzB4MTkwCisKKwkkIG9iamR1bXAgLWQgLS1uby1zaG93LXJhdy1pbnNuIHZtbGludXggfCBncmVwIC1DIDggZmZmZmZmZmY4MTA0ZWRlODoKKwlmZmZmZmZmZjgxMDRlZGM4Ogltb3YgICAgJXI4LDB4OCglcjgpCisJZmZmZmZmZmY4MTA0ZWRjYzoJdGVzdCAgICVyMTBkLCVyMTBkCisJZmZmZmZmZmY4MTA0ZWRjZjoJanMgICAgIGZmZmZmZmZmODEwNGVlODggPF9fZGVxdWV1ZV9zaWduYWwrMHgxNjg+CisJZmZmZmZmZmY4MTA0ZWRkNToJbW92ICAgICVyYXgsJXJkeAorCWZmZmZmZmZmODEwNGVkZDg6CW1vdiAgICAkMHhjLCVlY3gKKwlmZmZmZmZmZjgxMDRlZGRkOgltb3YgICAgJXIxMywlcmRpCisJZmZmZmZmZmY4MTA0ZWRlMDoJbW92ICAgICQweDMwLCVlYXgKKwlmZmZmZmZmZjgxMDRlZGU1Ogltb3YgICAgJXJkeCwlcnNpCisJZmZmZmZmZmY4MTA0ZWRlODoJcmVwIG1vdnNsICVkczooJXJzaSksJWVzOiglcmRpKQorCWZmZmZmZmZmODEwNGVkZWE6CXRlc3QgICAkMHgyLCVhbAorCWZmZmZmZmZmODEwNGVkZWM6CWplICAgICBmZmZmZmZmZjgxMDRlZGYwIDxfX2RlcXVldWVfc2lnbmFsKzB4ZDA+CisJZmZmZmZmZmY4MTA0ZWRlZToJbW92c3cgICVkczooJXJzaSksJWVzOiglcmRpKQorCWZmZmZmZmZmODEwNGVkZjA6CXRlc3QgICAkMHgxLCVhbAorCWZmZmZmZmZmODEwNGVkZjI6CWplICAgICBmZmZmZmZmZjgxMDRlZGY1IDxfX2RlcXVldWVfc2lnbmFsKzB4ZDU+CisJZmZmZmZmZmY4MTA0ZWRmNDoJbW92c2IgICVkczooJXJzaSksJWVzOiglcmRpKQorCWZmZmZmZmZmODEwNGVkZjU6CW1vdiAgICAlcjgsJXJkaQorCWZmZmZmZmZmODEwNGVkZjg6CWNhbGxxICBmZmZmZmZmZjgxMDRkZTYwIDxfX3NpZ3F1ZXVlX2ZyZWU+CisKK0FzIGV4cGVjdGVkLCBpdCdzIHRoZSAiYGByZXAgbW92c2xgYCIgaW5zdHJ1Y3Rpb24gZnJvbSB0aGUgYGBtZW1jcHkoKWBgCit0aGF0IGNhdXNlcyB0aGUgd2FybmluZy4gV2Uga25vdyBhYm91dCBgYFJFUCBNT1ZTTGBgIHRoYXQgaXQgdXNlcyB0aGUgcmVnaXN0ZXIKK2BgUkNYYGAgdG8gY291bnQgdGhlIG51bWJlciBvZiByZW1haW5pbmcgaXRlcmF0aW9ucy4gQnkgdGFraW5nIGEgbG9vayBhdCB0aGUKK3JlZ2lzdGVyIGR1bXAgYWdhaW4gKGZyb20gdGhlIGttZW1jaGVjayByZXBvcnQpLCB3ZSBjYW4gZmlndXJlIG91dCBob3cgbWFueQorYnl0ZXMgd2VyZSBsZWZ0IHRvIGNvcHk6OgorCisgICAgUkFYOiAwMDAwMDAwMDAwMDAwMDMwIFJCWDogZmZmZjg4MDAzZDRlYTk2OCBSQ1g6IDAwMDAwMDAwMDAwMDAwMDkKKworQnkgbG9va2luZyBhdCB0aGUgZGlzYXNzZW1ibHksIHdlIGFsc28gc2VlIHRoYXQgYGAlZWN4YGAgaXMgYmVpbmcgbG9hZGVkCit3aXRoIHRoZSB2YWx1ZSBgYCQweGNgYCBqdXN0IGJlZm9yZSAoZmZmZmZmZmY4MTA0ZWRkOCksIHNvIHdlIGFyZSB2ZXJ5CitsdWNreS4gS2VlcCBpbiBtaW5kIHRoYXQgdGhpcyBpcyB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMsIG5vdCBieXRlcy4gQW5kCitzaW5jZSB0aGlzIGlzIGEgImxvbmciIG9wZXJhdGlvbiwgd2UgbmVlZCB0byBtdWx0aXBseSBieSA0IHRvIGdldCB0aGUKK251bWJlciBvZiBieXRlcy4gU28gdGhpcyBtZWFucyB0aGF0IHRoZSB1bmluaXRpYWxpemVkIHZhbHVlIHdhcyBlbmNvdW50ZXJlZAorYXQgNCAqICgweGMgLSAweDkpID0gMTIgYnl0ZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIG9iamVjdC4KKworV2UgY2FuIG5vdyB0cnkgdG8gZmlndXJlIG91dCB3aGljaCBmaWVsZCBvZiB0aGUgImBgc3RydWN0IHNpZ2luZm9gYCIgdGhhdAord2FzIG5vdCBpbml0aWFsaXplZC4gVGhpcyBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJ1Y3Q6OgorCisgICAgNDAgdHlwZWRlZiBzdHJ1Y3Qgc2lnaW5mbyB7CisgICAgNDEJICAgICAgIGludCBzaV9zaWdubzsKKyAgICA0MgkgICAgICAgaW50IHNpX2Vycm5vOworICAgIDQzCSAgICAgICBpbnQgc2lfY29kZTsKKyAgICA0NAorICAgIDQ1CSAgICAgICB1bmlvbiB7CisgICAgLi4KKyAgICA5MgkgICAgICAgfSBfc2lmaWVsZHM7CisgICAgOTMgfSBzaWdpbmZvX3Q7CisKK09uIDY0LWJpdCwgdGhlIGludCBpcyA0IGJ5dGVzIGxvbmcsIHNvIGl0IG11c3QgdGhlIHVuaW9uIG1lbWJlciB0aGF0IGhhcworbm90IGJlZW4gaW5pdGlhbGl6ZWQuIFdlIGNhbiB2ZXJpZnkgdGhpcyB1c2luZyBnZGI6OgorCisJJCBnZGIgdm1saW51eAorCS4uLgorCShnZGIpIHAgJigoc3RydWN0IHNpZ2luZm8gKikgMCktPl9zaWZpZWxkcworCSQxID0gKHVuaW9uIHsuLi59ICopIDB4MTAKKworQWN0dWFsbHksIGl0IHNlZW1zIHRoYXQgdGhlIHVuaW9uIG1lbWJlciBpcyBsb2NhdGVkIGF0IG9mZnNldCAweDEwIC0tIHdoaWNoCittZWFucyB0aGF0IGdjYyBoYXMgaW5zZXJ0ZWQgNCBieXRlcyBvZiBwYWRkaW5nIGJldHdlZW4gdGhlIG1lbWJlcnMgYGBzaV9jb2RlYGAKK2FuZCBgYF9zaWZpZWxkc2BgLiBXZSBjYW4gbm93IGdldCBhIGZ1bGxlciBwaWN0dXJlIG9mIHRoZSBtZW1vcnkgZHVtcDo6CisKKwkJIF8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT4gc2lfY29kZQorCQkvCSBfLS0tLS0tLS0tLS0tLS0tLS0tLS09PiAocGFkZGluZykKKwkgICAgICAgfAkvCSBfLS0tLS0tLS0tLS0tPT4gX3NpZmllbGRzKC5fa2lsbC5fcGlkKQorCSAgICAgICB8ICAgICAgIHwJLwkgXy0tLS09PiBfc2lmaWVsZHMoLl9raWxsLl91aWQpCisJICAgICAgIHwgICAgICAgfCAgICAgICB8CS8KKwktLS0tLS0tfC0tLS0tLS18LS0tLS0tLXwtLS0tLS0tfAorCTgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDg4ZmZmZjAwMDAwMDAwMDAwMDAwMDAKKwkgaSBpIGkgaSB1IHUgdSB1IGkgaSBpIGkgaSBpIGkgaSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1CisKK1RoaXMgYWxsb3dzIHVzIHRvIHJlYWxpemUgYW5vdGhlciBpbXBvcnRhbnQgZmFjdDogYGBzaV9jb2RlYGAgY29udGFpbnMgdGhlCit2YWx1ZSAweDgwLiBSZW1lbWJlciB0aGF0IHg4NiBpcyBsaXR0bGUgZW5kaWFuLCBzbyB0aGUgZmlyc3QgNCBieXRlcworIjgwMDAwMDAwIiBhcmUgcmVhbGx5IHRoZSBudW1iZXIgMHgwMDAwMDA4MC4gV2l0aCBhIGJpdCBvZiByZXNlYXJjaCwgd2UKK2ZpbmQgdGhhdCB0aGlzIGlzIGFjdHVhbGx5IHRoZSBjb25zdGFudCBgYFNJX0tFUk5FTGBgIGRlZmluZWQgaW4KK2BgaW5jbHVkZS9hc20tZ2VuZXJpYy9zaWdpbmZvLmhgYDo6CisKKyAgICAxNDQgI2RlZmluZSBTSV9LRVJORUwJMHg4MAkJLyogc2VudCBieSB0aGUga2VybmVsIGZyb20gc29tZXdoZXJlCSAqLworCitUaGlzIG1hY3JvIGlzIHVzZWQgaW4gZXhhY3RseSBvbmUgcGxhY2UgaW4gdGhlIHg4NiBrZXJuZWw6IEluIGBgc2VuZF9zaWduYWwoKWBgCitpbiBgYGtlcm5lbC9zaWduYWwuY2BgOjoKKworICAgIDgxNiBzdGF0aWMgaW50IHNlbmRfc2lnbmFsKGludCBzaWcsIHN0cnVjdCBzaWdpbmZvICppbmZvLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsCisgICAgODE3CQkJCWludCBncm91cCkKKyAgICA4MTggeworICAgIC4uLgorICAgIDgyOAkJcGVuZGluZyA9IGdyb3VwID8gJnQtPnNpZ25hbC0+c2hhcmVkX3BlbmRpbmcgOiAmdC0+cGVuZGluZzsKKyAgICAuLi4KKyAgICA4NTEJCXEgPSBfX3NpZ3F1ZXVlX2FsbG9jKHQsIEdGUF9BVE9NSUMsIChzaWcgPCBTSUdSVE1JTiAmJgorICAgIDg1MgkJCQkJCSAgICAgKGlzX3NpX3NwZWNpYWwoaW5mbykgfHwKKyAgICA4NTMJCQkJCQkgICAgICBpbmZvLT5zaV9jb2RlID49IDApKSk7CisgICAgODU0CQlpZiAocSkgeworICAgIDg1NQkJCWxpc3RfYWRkX3RhaWwoJnEtPmxpc3QsICZwZW5kaW5nLT5saXN0KTsKKyAgICA4NTYJCQlzd2l0Y2ggKCh1bnNpZ25lZCBsb25nKSBpbmZvKSB7CisgICAgLi4uCisgICAgODY1CQkJY2FzZSAodW5zaWduZWQgbG9uZykgU0VORF9TSUdfUFJJVjoKKyAgICA4NjYJCQkJcS0+aW5mby5zaV9zaWdubyA9IHNpZzsKKyAgICA4NjcJCQkJcS0+aW5mby5zaV9lcnJubyA9IDA7CisgICAgODY4CQkJCXEtPmluZm8uc2lfY29kZSA9IFNJX0tFUk5FTDsKKyAgICA4NjkJCQkJcS0+aW5mby5zaV9waWQgPSAwOworICAgIDg3MAkJCQlxLT5pbmZvLnNpX3VpZCA9IDA7CisgICAgODcxCQkJCWJyZWFrOworICAgIC4uLgorICAgIDg5MCB9CisKK05vdCBvbmx5IGRvZXMgdGhpcyBtYXRjaCB3aXRoIHRoZSBgYC5zaV9jb2RlYGAgbWVtYmVyLCBpdCBhbHNvIG1hdGNoZXMgdGhlIHBsYWNlCit3ZSBmb3VuZCBlYXJsaWVyIHdoZW4gbG9va2luZyBmb3Igd2hlcmUgc2lnaW5mb190IG9iamVjdHMgYXJlIGVucXVldWVkIG9uIHRoZQorYGBzaGFyZWRfcGVuZGluZ2BgIGxpc3QuCisKK1NvIHRvIHN1bSB1cDogSXQgc2VlbXMgdGhhdCBpdCBpcyB0aGUgcGFkZGluZyBpbnRyb2R1Y2VkIGJ5IHRoZSBjb21waWxlcgorYmV0d2VlbiB0d28gc3RydWN0IGZpZWxkcyB0aGF0IGlzIHVuaW5pdGlhbGl6ZWQsIGFuZCB0aGlzIGdldHMgcmVwb3J0ZWQgd2hlbgord2UgZG8gYSBgYG1lbWNweSgpYGAgb24gdGhlIHN0cnVjdC4gVGhpcyBtZWFucyB0aGF0IHdlIGhhdmUgaWRlbnRpZmllZCBhIGZhbHNlCitwb3NpdGl2ZSB3YXJuaW5nLgorCitOb3JtYWxseSwga21lbWNoZWNrIHdpbGwgbm90IHJlcG9ydCB1bmluaXRpYWxpemVkIGFjY2Vzc2VzIGluIGBgbWVtY3B5KClgYCBjYWxscword2hlbiBib3RoIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFkZHJlc3NlcyBhcmUgdHJhY2tlZC4gKEluc3RlYWQsIHdlIGNvcHkKK3RoZSBzaGFkb3cgYnl0ZW1hcCBhcyB3ZWxsKS4gSW4gdGhpcyBjYXNlLCB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBjbGVhcmx5Cit3YXMgbm90IHRyYWNrZWQuIFdlIGNhbiBkaWcgYSBsaXR0bGUgZGVlcGVyIGludG8gdGhlIHN0YWNrIHRyYWNlIGZyb20gYWJvdmU6OgorCisJYXJjaC94ODYva2VybmVsL3NpZ25hbC5jOjgwNQorCWFyY2gveDg2L2tlcm5lbC9zaWduYWwuYzo4NzEKKwlhcmNoL3g4Ni9rZXJuZWwvZW50cnlfNjQuUzo2OTQKKworQW5kIHdlIGNsZWFybHkgc2VlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIHNpZ2luZm8gb2JqZWN0IGlzIGxvY2F0ZWQgb24gdGhlCitzdGFjazo6CisKKyAgICA3ODIgc3RhdGljIHZvaWQgZG9fc2lnbmFsKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorICAgIDc4MyB7CisgICAgNzg0CQlzdHJ1Y3Qga19zaWdhY3Rpb24ga2E7CisgICAgNzg1CQlzaWdpbmZvX3QgaW5mbzsKKyAgICAuLi4KKyAgICA4MDQJCXNpZ25yID0gZ2V0X3NpZ25hbF90b19kZWxpdmVyKCZpbmZvLCAma2EsIHJlZ3MsIE5VTEwpOworICAgIC4uLgorICAgIDg1NCB9CisKK0FuZCB0aGlzIGBgJmluZm9gYCBpcyB3aGF0IGV2ZW50dWFsbHkgZ2V0cyBwYXNzZWQgdG8gYGBjb3B5X3NpZ2luZm8oKWBgIGFzIHRoZQorZGVzdGluYXRpb24gYXJndW1lbnQuCisKK05vdywgZXZlbiB0aG91Z2ggd2UgZGlkbid0IGZpbmQgYW4gYWN0dWFsIGVycm9yIGhlcmUsIHRoZSBleGFtcGxlIGlzIHN0aWxsIGEKK2dvb2Qgb25lLCBiZWNhdXNlIGl0IHNob3dzIGhvdyBvbmUgd291bGQgZ28gYWJvdXQgdG8gZmluZCBvdXQgd2hhdCB0aGUgcmVwb3J0Cit3YXMgYWxsIGFib3V0LgorCisKK0Fubm90YXRpbmcgZmFsc2UgcG9zaXRpdmVzCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGVyZSBhcmUgYSBmZXcgZGlmZmVyZW50IHdheXMgdG8gbWFrZSBhbm5vdGF0aW9ucyBpbiB0aGUgc291cmNlIGNvZGUgdGhhdAord2lsbCBrZWVwIGttZW1jaGVjayBmcm9tIGNoZWNraW5nIGFuZCByZXBvcnRpbmcgY2VydGFpbiBhbGxvY2F0aW9ucy4gSGVyZQordGhleSBhcmU6CisKKy0gYGBfX0dGUF9OT1RSQUNLX0ZBTFNFX1BPU0lUSVZFYGAKKwlUaGlzIGZsYWcgY2FuIGJlIHBhc3NlZCB0byBgYGttYWxsb2MoKWBgIG9yIGBga21lbV9jYWNoZV9hbGxvYygpYGAKKwkodGhlcmVmb3JlIGFsc28gdG8gb3RoZXIgZnVuY3Rpb25zIHRoYXQgZW5kIHVwIGNhbGxpbmcgb25lIG9mCisJdGhlc2UpIHRvIGluZGljYXRlIHRoYXQgdGhlIGFsbG9jYXRpb24gc2hvdWxkIG5vdCBiZSB0cmFja2VkCisJYmVjYXVzZSBpdCB3b3VsZCBsZWFkIHRvIGEgZmFsc2UgcG9zaXRpdmUgcmVwb3J0LiBUaGlzIGlzIGEgImJpZworCWhhbW1lciIgd2F5IG9mIHNpbGVuY2luZyBrbWVtY2hlY2s7IGFmdGVyIGFsbCwgZXZlbiBpZiB0aGUgZmFsc2UKKwlwb3NpdGl2ZSBwZXJ0YWlucyB0byBwYXJ0aWN1bGFyIGZpZWxkIGluIGEgc3RydWN0LCBmb3IgZXhhbXBsZSwgd2UKKwl3aWxsIG5vdyBsb3NlIHRoZSBhYmlsaXR5IHRvIGZpbmQgKHJlYWwpIGVycm9ycyBpbiBvdGhlciBwYXJ0cyBvZgorCXRoZSBzYW1lIHN0cnVjdC4KKworCUV4YW1wbGU6OgorCisJICAgIC8qIE5vIHdhcm5pbmdzIHdpbGwgZXZlciB0cmlnZ2VyIG9uIGFjY2Vzc2luZyBhbnkgcGFydCBvZiB4ICovCisJICAgIHggPSBrbWFsbG9jKHNpemVvZiAqeCwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PVFJBQ0tfRkFMU0VfUE9TSVRJVkUpOworCistIGBga21lbWNoZWNrX2JpdGZpZWxkX2JlZ2luKG5hbWUpYGAvYGBrbWVtY2hlY2tfYml0ZmllbGRfZW5kKG5hbWUpYGAgYW5kCisJYGBrbWVtY2hlY2tfYW5ub3RhdGVfYml0ZmllbGQocHRyLCBuYW1lKWBgCisJVGhlIGZpcnN0IHR3byBvZiB0aGVzZSB0aHJlZSBtYWNyb3MgY2FuIGJlIHVzZWQgaW5zaWRlIHN0cnVjdAorCWRlZmluaXRpb25zIHRvIHNpZ25hbCwgcmVzcGVjdGl2ZWx5LCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYQorCWJpdGZpZWxkLiBBZGRpdGlvbmFsbHksIHRoaXMgd2lsbCBhc3NpZ24gdGhlIGJpdGZpZWxkIGEgbmFtZSwgd2hpY2gKKwlpcyBnaXZlbiBhcyBhbiBhcmd1bWVudCB0byB0aGUgbWFjcm9zLgorCisJSGF2aW5nIHVzZWQgdGhlc2UgbWFya2Vycywgb25lIGNhbiBsYXRlciB1c2UKKwlrbWVtY2hlY2tfYW5ub3RhdGVfYml0ZmllbGQoKSBhdCB0aGUgcG9pbnQgb2YgYWxsb2NhdGlvbiwgdG8gaW5kaWNhdGUKKwl3aGljaCBwYXJ0cyBvZiB0aGUgYWxsb2NhdGlvbiBpcyBwYXJ0IG9mIGEgYml0ZmllbGQuCisKKwlFeGFtcGxlOjoKKworCSAgICBzdHJ1Y3QgZm9vIHsKKwkJaW50IHg7CisKKwkJa21lbWNoZWNrX2JpdGZpZWxkX2JlZ2luKGZsYWdzKTsKKwkJaW50IGZsYWdfYToxOworCQlpbnQgZmxhZ19iOjE7CisJCWttZW1jaGVja19iaXRmaWVsZF9lbmQoZmxhZ3MpOworCisJCWludCB5OworCSAgICB9OworCisJICAgIHN0cnVjdCBmb28gKnggPSBrbWFsbG9jKHNpemVvZiAqeCk7CisKKwkgICAgLyogTm8gd2FybmluZ3Mgd2lsbCB0cmlnZ2VyIG9uIGFjY2Vzc2luZyB0aGUgYml0ZmllbGQgb2YgeCAqLworCSAgICBrbWVtY2hlY2tfYW5ub3RhdGVfYml0ZmllbGQoeCwgZmxhZ3MpOworCisJTm90ZSB0aGF0IGBga21lbWNoZWNrX2Fubm90YXRlX2JpdGZpZWxkKClgYCBjYW4gYmUgdXNlZCBldmVuIGJlZm9yZSB0aGUKKwlyZXR1cm4gdmFsdWUgb2YgYGBrbWFsbG9jKClgYCBpcyBjaGVja2VkIC0tIGluIG90aGVyIHdvcmRzLCBwYXNzaW5nIE5VTEwKKwlhcyB0aGUgZmlyc3QgYXJndW1lbnQgaXMgbGVnYWwgKGFuZCB3aWxsIGRvIG5vdGhpbmcpLgorCisKK1JlcG9ydGluZyBlcnJvcnMKKy0tLS0tLS0tLS0tLS0tLS0KKworQXMgd2UgaGF2ZSBzZWVuLCBrbWVtY2hlY2sgd2lsbCBwcm9kdWNlIGZhbHNlIHBvc2l0aXZlIHJlcG9ydHMuIFRoZXJlZm9yZSwgaXQKK2lzIG5vdCB2ZXJ5IHdpc2UgdG8gYmxpbmRseSBwb3N0IGttZW1jaGVjayB3YXJuaW5ncyB0byBtYWlsaW5nIGxpc3RzIGFuZAorbWFpbnRhaW5lcnMuIEluc3RlYWQsIEkgZW5jb3VyYWdlIG1haW50YWluZXJzIGFuZCBkZXZlbG9wZXJzIHRvIGZpbmQgZXJyb3JzCitpbiB0aGVpciBvd24gY29kZS4gSWYgeW91IGdldCBhIHdhcm5pbmcsIHlvdSBjYW4gdHJ5IHRvIHdvcmsgYXJvdW5kIGl0LCB0cnkKK3RvIGZpZ3VyZSBvdXQgaWYgaXQncyBhIHJlYWwgZXJyb3Igb3Igbm90LCBvciBzaW1wbHkgaWdub3JlIGl0LiBNb3N0CitkZXZlbG9wZXJzIGtub3cgdGhlaXIgb3duIGNvZGUgYW5kIHdpbGwgcXVpY2tseSBhbmQgZWZmaWNpZW50bHkgZGV0ZXJtaW5lIHRoZQorcm9vdCBjYXVzZSBvZiBhIGttZW1jaGVjayByZXBvcnQuIFRoaXMgaXMgdGhlcmVmb3JlIGFsc28gdGhlIG1vc3QgZWZmaWNpZW50Cit3YXkgdG8gd29yayB3aXRoIGttZW1jaGVjay4KKworVGhhdCBzYWlkLCB3ZSAodGhlIGttZW1jaGVjayBtYWludGFpbmVycykgd2lsbCBhbHdheXMgYmUgb24gdGhlIGxvb2tvdXQgZm9yCitmYWxzZSBwb3NpdGl2ZXMgdGhhdCB3ZSBjYW4gYW5ub3RhdGUgYW5kIHNpbGVuY2UuIFNvIHdoYXRldmVyIHlvdSBmaW5kLAorcGxlYXNlIGRyb3AgdXMgYSBub3RlIHByaXZhdGVseSEgS2VybmVsIGNvbmZpZ3MgYW5kIHN0ZXBzIHRvIHJlcHJvZHVjZSAoaWYKK2F2YWlsYWJsZSkgYXJlIG9mIGNvdXJzZSBhIGdyZWF0IGhlbHAgdG9vLgorCitIYXBweSBoYWNraW5nIQorCisKK1RlY2huaWNhbCBkZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ttZW1jaGVjayB3b3JrcyBieSBtYXJraW5nIG1lbW9yeSBwYWdlcyBub24tcHJlc2VudC4gVGhpcyBtZWFucyB0aGF0IHdoZW5ldmVyCitzb21lYm9keSBhdHRlbXB0cyB0byBhY2Nlc3MgdGhlIHBhZ2UsIGEgcGFnZSBmYXVsdCBpcyBnZW5lcmF0ZWQuIFRoZSBwYWdlCitmYXVsdCBoYW5kbGVyIG5vdGljZXMgdGhhdCB0aGUgcGFnZSB3YXMgaW4gZmFjdCBvbmx5IGhpZGRlbiwgYW5kIHNvIGl0IGNhbGxzCitvbiB0aGUga21lbWNoZWNrIGNvZGUgdG8gbWFrZSBmdXJ0aGVyIGludmVzdGlnYXRpb25zLgorCitXaGVuIHRoZSBpbnZlc3RpZ2F0aW9ucyBhcmUgY29tcGxldGVkLCBrbWVtY2hlY2sgInNob3dzIiB0aGUgcGFnZSBieSBtYXJraW5nCitpdCBwcmVzZW50IChhcyBpdCB3b3VsZCBiZSB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcykuIFRoaXMgd2F5LCB0aGUKK2ludGVycnVwdGVkIGNvZGUgY2FuIGNvbnRpbnVlIGFzIHVzdWFsLgorCitCdXQgYWZ0ZXIgdGhlIGluc3RydWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLCB3ZSBzaG91bGQgaGlkZSB0aGUgcGFnZSBhZ2Fpbiwgc28KK3RoYXQgd2UgY2FuIGNhdGNoIHRoZSBuZXh0IGFjY2VzcyB0b28hIE5vdyBrbWVtY2hlY2sgbWFrZXMgdXNlIG9mIGEgZGVidWdnaW5nCitmZWF0dXJlIG9mIHRoZSBwcm9jZXNzb3IsIG5hbWVseSBzaW5nbGUtc3RlcHBpbmcuIFdoZW4gdGhlIHByb2Nlc3NvciBoYXMKK2ZpbmlzaGVkIHRoZSBvbmUgaW5zdHJ1Y3Rpb24gdGhhdCBnZW5lcmF0ZWQgdGhlIG1lbW9yeSBhY2Nlc3MsIGEgZGVidWcKK2V4Y2VwdGlvbiBpcyByYWlzZWQuIEZyb20gaGVyZSwgd2Ugc2ltcGx5IGhpZGUgdGhlIHBhZ2UgYWdhaW4gYW5kIGNvbnRpbnVlCitleGVjdXRpb24sIHRoaXMgdGltZSB3aXRoIHRoZSBzaW5nbGUtc3RlcHBpbmcgZmVhdHVyZSB0dXJuZWQgb2ZmLgorCitrbWVtY2hlY2sgcmVxdWlyZXMgc29tZSBhc3Npc3RhbmNlIGZyb20gdGhlIG1lbW9yeSBhbGxvY2F0b3IgaW4gb3JkZXIgdG8gd29yay4KK1RoZSBtZW1vcnkgYWxsb2NhdG9yIG5lZWRzIHRvCisKKyAgMS4gVGVsbCBrbWVtY2hlY2sgYWJvdXQgbmV3bHkgYWxsb2NhdGVkIHBhZ2VzIGFuZCBwYWdlcyB0aGF0IGFyZSBhYm91dCB0bworICAgICBiZSBmcmVlZC4gVGhpcyBhbGxvd3Mga21lbWNoZWNrIHRvIHNldCB1cCBhbmQgdGVhciBkb3duIHRoZSBzaGFkb3cgbWVtb3J5CisgICAgIGZvciB0aGUgcGFnZXMgaW4gcXVlc3Rpb24uIFRoZSBzaGFkb3cgbWVtb3J5IHN0b3JlcyB0aGUgc3RhdHVzIG9mIGVhY2gKKyAgICAgYnl0ZSBpbiB0aGUgYWxsb2NhdGlvbiBwcm9wZXIsIGUuZy4gd2hldGhlciBpdCBpcyBpbml0aWFsaXplZCBvcgorICAgICB1bmluaXRpYWxpemVkLgorCisgIDIuIFRlbGwga21lbWNoZWNrIHdoaWNoIHBhcnRzIG9mIG1lbW9yeSBzaG91bGQgYmUgbWFya2VkIHVuaW5pdGlhbGl6ZWQuCisgICAgIFRoZXJlIGFyZSBhY3R1YWxseSBhIGZldyBtb3JlIHN0YXRlcywgc3VjaCBhcyAibm90IHlldCBhbGxvY2F0ZWQiIGFuZAorICAgICAicmVjZW50bHkgZnJlZWQiLgorCitJZiBhIHNsYWIgY2FjaGUgaXMgc2V0IHVwIHVzaW5nIHRoZSBTTEFCX05PVFJBQ0sgZmxhZywgaXQgd2lsbCBuZXZlciByZXR1cm4KK21lbW9yeSB0aGF0IGNhbiB0YWtlIHBhZ2UgZmF1bHRzIGJlY2F1c2Ugb2Yga21lbWNoZWNrLgorCitJZiBhIHNsYWIgY2FjaGUgaXMgTk9UIHNldCB1cCB1c2luZyB0aGUgU0xBQl9OT1RSQUNLIGZsYWcsIGNhbGxlcnMgY2FuIHN0aWxsCityZXF1ZXN0IG1lbW9yeSB3aXRoIHRoZSBfX0dGUF9OT1RSQUNLIG9yIF9fR0ZQX05PVFJBQ0tfRkFMU0VfUE9TSVRJVkUgZmxhZ3MuCitUaGlzIGRvZXMgbm90IHByZXZlbnQgdGhlIHBhZ2UgZmF1bHRzIGZyb20gb2NjdXJyaW5nLCBob3dldmVyLCBidXQgbWFya3MgdGhlCitvYmplY3QgaW4gcXVlc3Rpb24gYXMgYmVpbmcgaW5pdGlhbGl6ZWQgc28gdGhhdCBubyB3YXJuaW5ncyB3aWxsIGV2ZXIgYmUKK3Byb2R1Y2VkIGZvciB0aGlzIG9iamVjdC4KKworQ3VycmVudGx5LCB0aGUgU0xBQiBhbmQgU0xVQiBhbGxvY2F0b3JzIGFyZSBzdXBwb3J0ZWQgYnkga21lbWNoZWNrLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMva21lbWxlYWsucnN0IGIvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMva21lbWxlYWsucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ODg3MjIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2Rldi10b29scy9rbWVtbGVhay5yc3QKQEAgLTAsMCArMSwyMTAgQEAKK0tlcm5lbCBNZW1vcnkgTGVhayBEZXRlY3RvcgorPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ttZW1sZWFrIHByb3ZpZGVzIGEgd2F5IG9mIGRldGVjdGluZyBwb3NzaWJsZSBrZXJuZWwgbWVtb3J5IGxlYWtzIGluIGEKK3dheSBzaW1pbGFyIHRvIGEgdHJhY2luZyBnYXJiYWdlIGNvbGxlY3RvcgorKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0dhcmJhZ2VfY29sbGVjdGlvbl8lMjhjb21wdXRlcl9zY2llbmNlJTI5I1RyYWNpbmdfZ2FyYmFnZV9jb2xsZWN0b3JzKSwKK3dpdGggdGhlIGRpZmZlcmVuY2UgdGhhdCB0aGUgb3JwaGFuIG9iamVjdHMgYXJlIG5vdCBmcmVlZCBidXQgb25seQorcmVwb3J0ZWQgdmlhIC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrLiBBIHNpbWlsYXIgbWV0aG9kIGlzIHVzZWQgYnkgdGhlCitWYWxncmluZCB0b29sIChgYG1lbWNoZWNrIC0tbGVhay1jaGVja2BgKSB0byBkZXRlY3QgdGhlIG1lbW9yeSBsZWFrcyBpbgordXNlci1zcGFjZSBhcHBsaWNhdGlvbnMuCitLbWVtbGVhayBpcyBzdXBwb3J0ZWQgb24geDg2LCBhcm0sIHBvd2VycGMsIHNwYXJjLCBzaCwgbWljcm9ibGF6ZSwgcHBjLCBtaXBzLCBzMzkwLCBtZXRhZyBhbmQgdGlsZS4KKworVXNhZ2UKKy0tLS0tCisKK0NPTkZJR19ERUJVR19LTUVNTEVBSyBpbiAiS2VybmVsIGhhY2tpbmciIGhhcyB0byBiZSBlbmFibGVkLiBBIGtlcm5lbAordGhyZWFkIHNjYW5zIHRoZSBtZW1vcnkgZXZlcnkgMTAgbWludXRlcyAoYnkgZGVmYXVsdCkgYW5kIHByaW50cyB0aGUKK251bWJlciBvZiBuZXcgdW5yZWZlcmVuY2VkIG9iamVjdHMgZm91bmQuIFRvIGRpc3BsYXkgdGhlIGRldGFpbHMgb2YgYWxsCit0aGUgcG9zc2libGUgbWVtb3J5IGxlYWtzOjoKKworICAjIG1vdW50IC10IGRlYnVnZnMgbm9kZXYgL3N5cy9rZXJuZWwvZGVidWcvCisgICMgY2F0IC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrCisKK1RvIHRyaWdnZXIgYW4gaW50ZXJtZWRpYXRlIG1lbW9yeSBzY2FuOjoKKworICAjIGVjaG8gc2NhbiA+IC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrCisKK1RvIGNsZWFyIHRoZSBsaXN0IG9mIGFsbCBjdXJyZW50IHBvc3NpYmxlIG1lbW9yeSBsZWFrczo6CisKKyAgIyBlY2hvIGNsZWFyID4gL3N5cy9rZXJuZWwvZGVidWcva21lbWxlYWsKKworTmV3IGxlYWtzIHdpbGwgdGhlbiBjb21lIHVwIHVwb24gcmVhZGluZyBgYC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrYGAKK2FnYWluLgorCitOb3RlIHRoYXQgdGhlIG9ycGhhbiBvYmplY3RzIGFyZSBsaXN0ZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBhbGxvY2F0ZWQKK2FuZCBvbmUgb2JqZWN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QgbWF5IGNhdXNlIG90aGVyIHN1YnNlcXVlbnQKK29iamVjdHMgdG8gYmUgcmVwb3J0ZWQgYXMgb3JwaGFuLgorCitNZW1vcnkgc2Nhbm5pbmcgcGFyYW1ldGVycyBjYW4gYmUgbW9kaWZpZWQgYXQgcnVuLXRpbWUgYnkgd3JpdGluZyB0byB0aGUKK2BgL3N5cy9rZXJuZWwvZGVidWcva21lbWxlYWtgYCBmaWxlLiBUaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIHN1cHBvcnRlZDoKKworLSBvZmYKKyAgICBkaXNhYmxlIGttZW1sZWFrIChpcnJldmVyc2libGUpCistIHN0YWNrPW9uCisgICAgZW5hYmxlIHRoZSB0YXNrIHN0YWNrcyBzY2FubmluZyAoZGVmYXVsdCkKKy0gc3RhY2s9b2ZmCisgICAgZGlzYWJsZSB0aGUgdGFza3Mgc3RhY2tzIHNjYW5uaW5nCistIHNjYW49b24KKyAgICBzdGFydCB0aGUgYXV0b21hdGljIG1lbW9yeSBzY2FubmluZyB0aHJlYWQgKGRlZmF1bHQpCistIHNjYW49b2ZmCisgICAgc3RvcCB0aGUgYXV0b21hdGljIG1lbW9yeSBzY2FubmluZyB0aHJlYWQKKy0gc2Nhbj08c2Vjcz4KKyAgICBzZXQgdGhlIGF1dG9tYXRpYyBtZW1vcnkgc2Nhbm5pbmcgcGVyaW9kIGluIHNlY29uZHMKKyAgICAoZGVmYXVsdCA2MDAsIDAgdG8gc3RvcCB0aGUgYXV0b21hdGljIHNjYW5uaW5nKQorLSBzY2FuCisgICAgdHJpZ2dlciBhIG1lbW9yeSBzY2FuCistIGNsZWFyCisgICAgY2xlYXIgbGlzdCBvZiBjdXJyZW50IG1lbW9yeSBsZWFrIHN1c3BlY3RzLCBkb25lIGJ5CisgICAgbWFya2luZyBhbGwgY3VycmVudCByZXBvcnRlZCB1bnJlZmVyZW5jZWQgb2JqZWN0cyBncmV5LAorICAgIG9yIGZyZWUgYWxsIGttZW1sZWFrIG9iamVjdHMgaWYga21lbWxlYWsgaGFzIGJlZW4gZGlzYWJsZWQuCistIGR1bXA9PGFkZHI+CisgICAgZHVtcCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb2JqZWN0IGZvdW5kIGF0IDxhZGRyPgorCitLbWVtbGVhayBjYW4gYWxzbyBiZSBkaXNhYmxlZCBhdCBib290LXRpbWUgYnkgcGFzc2luZyBgYGttZW1sZWFrPW9mZmBgIG9uCit0aGUga2VybmVsIGNvbW1hbmQgbGluZS4KKworTWVtb3J5IG1heSBiZSBhbGxvY2F0ZWQgb3IgZnJlZWQgYmVmb3JlIGttZW1sZWFrIGlzIGluaXRpYWxpc2VkIGFuZAordGhlc2UgYWN0aW9ucyBhcmUgc3RvcmVkIGluIGFuIGVhcmx5IGxvZyBidWZmZXIuIFRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCitpcyBjb25maWd1cmVkIHZpYSB0aGUgQ09ORklHX0RFQlVHX0tNRU1MRUFLX0VBUkxZX0xPR19TSVpFIG9wdGlvbi4KKworSWYgQ09ORklHX0RFQlVHX0tNRU1MRUFLX0RFRkFVTFRfT0ZGIGFyZSBlbmFibGVkLCB0aGUga21lbWxlYWsgaXMKK2Rpc2FibGVkIGJ5IGRlZmF1bHQuIFBhc3NpbmcgYGBrbWVtbGVhaz1vbmBgIG9uIHRoZSBrZXJuZWwgY29tbWFuZAorbGluZSBlbmFibGVzIHRoZSBmdW5jdGlvbi4gCisKK0Jhc2ljIEFsZ29yaXRobQorLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBtZW1vcnkgYWxsb2NhdGlvbnMgdmlhIDpjOmZ1bmM6YGttYWxsb2NgLCA6YzpmdW5jOmB2bWFsbG9jYCwKKzpjOmZ1bmM6YGttZW1fY2FjaGVfYWxsb2NgIGFuZAorZnJpZW5kcyBhcmUgdHJhY2VkIGFuZCB0aGUgcG9pbnRlcnMsIHRvZ2V0aGVyIHdpdGggYWRkaXRpb25hbAoraW5mb3JtYXRpb24gbGlrZSBzaXplIGFuZCBzdGFjayB0cmFjZSwgYXJlIHN0b3JlZCBpbiBhIHJidHJlZS4KK1RoZSBjb3JyZXNwb25kaW5nIGZyZWVpbmcgZnVuY3Rpb24gY2FsbHMgYXJlIHRyYWNrZWQgYW5kIHRoZSBwb2ludGVycworcmVtb3ZlZCBmcm9tIHRoZSBrbWVtbGVhayBkYXRhIHN0cnVjdHVyZXMuCisKK0FuIGFsbG9jYXRlZCBibG9jayBvZiBtZW1vcnkgaXMgY29uc2lkZXJlZCBvcnBoYW4gaWYgbm8gcG9pbnRlciB0byBpdHMKK3N0YXJ0IGFkZHJlc3Mgb3IgdG8gYW55IGxvY2F0aW9uIGluc2lkZSB0aGUgYmxvY2sgY2FuIGJlIGZvdW5kIGJ5CitzY2FubmluZyB0aGUgbWVtb3J5IChpbmNsdWRpbmcgc2F2ZWQgcmVnaXN0ZXJzKS4gVGhpcyBtZWFucyB0aGF0IHRoZXJlCittaWdodCBiZSBubyB3YXkgZm9yIHRoZSBrZXJuZWwgdG8gcGFzcyB0aGUgYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkCitibG9jayB0byBhIGZyZWVpbmcgZnVuY3Rpb24gYW5kIHRoZXJlZm9yZSB0aGUgYmxvY2sgaXMgY29uc2lkZXJlZCBhCittZW1vcnkgbGVhay4KKworVGhlIHNjYW5uaW5nIGFsZ29yaXRobSBzdGVwczoKKworICAxLiBtYXJrIGFsbCBvYmplY3RzIGFzIHdoaXRlIChyZW1haW5pbmcgd2hpdGUgb2JqZWN0cyB3aWxsIGxhdGVyIGJlCisgICAgIGNvbnNpZGVyZWQgb3JwaGFuKQorICAyLiBzY2FuIHRoZSBtZW1vcnkgc3RhcnRpbmcgd2l0aCB0aGUgZGF0YSBzZWN0aW9uIGFuZCBzdGFja3MsIGNoZWNraW5nCisgICAgIHRoZSB2YWx1ZXMgYWdhaW5zdCB0aGUgYWRkcmVzc2VzIHN0b3JlZCBpbiB0aGUgcmJ0cmVlLiBJZgorICAgICBhIHBvaW50ZXIgdG8gYSB3aGl0ZSBvYmplY3QgaXMgZm91bmQsIHRoZSBvYmplY3QgaXMgYWRkZWQgdG8gdGhlCisgICAgIGdyYXkgbGlzdAorICAzLiBzY2FuIHRoZSBncmF5IG9iamVjdHMgZm9yIG1hdGNoaW5nIGFkZHJlc3NlcyAoc29tZSB3aGl0ZSBvYmplY3RzCisgICAgIGNhbiBiZWNvbWUgZ3JheSBhbmQgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgZ3JheSBsaXN0KSB1bnRpbCB0aGUKKyAgICAgZ3JheSBzZXQgaXMgZmluaXNoZWQKKyAgNC4gdGhlIHJlbWFpbmluZyB3aGl0ZSBvYmplY3RzIGFyZSBjb25zaWRlcmVkIG9ycGhhbiBhbmQgcmVwb3J0ZWQgdmlhCisgICAgIC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrCisKK1NvbWUgYWxsb2NhdGVkIG1lbW9yeSBibG9ja3MgaGF2ZSBwb2ludGVycyBzdG9yZWQgaW4gdGhlIGtlcm5lbCdzCitpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgYW5kIHRoZXkgY2Fubm90IGJlIGRldGVjdGVkIGFzIG9ycGhhbnMuIFRvCithdm9pZCB0aGlzLCBrbWVtbGVhayBjYW4gYWxzbyBzdG9yZSB0aGUgbnVtYmVyIG9mIHZhbHVlcyBwb2ludGluZyB0byBhbgorYWRkcmVzcyBpbnNpZGUgdGhlIGJsb2NrIGFkZHJlc3MgcmFuZ2UgdGhhdCBuZWVkIHRvIGJlIGZvdW5kIHNvIHRoYXQgdGhlCitibG9jayBpcyBub3QgY29uc2lkZXJlZCBhIGxlYWsuIE9uZSBleGFtcGxlIGlzIF9fdm1hbGxvYygpLgorCitUZXN0aW5nIHNwZWNpZmljIHNlY3Rpb25zIHdpdGgga21lbWxlYWsKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitVcG9uIGluaXRpYWwgYm9vdHVwIHlvdXIgL3N5cy9rZXJuZWwvZGVidWcva21lbWxlYWsgb3V0cHV0IHBhZ2UgbWF5IGJlCitxdWl0ZSBleHRlbnNpdmUuIFRoaXMgY2FuIGFsc28gYmUgdGhlIGNhc2UgaWYgeW91IGhhdmUgdmVyeSBidWdneSBjb2RlCit3aGVuIGRvaW5nIGRldmVsb3BtZW50LiBUbyB3b3JrIGFyb3VuZCB0aGVzZSBzaXR1YXRpb25zIHlvdSBjYW4gdXNlIHRoZQorJ2NsZWFyJyBjb21tYW5kIHRvIGNsZWFyIGFsbCByZXBvcnRlZCB1bnJlZmVyZW5jZWQgb2JqZWN0cyBmcm9tIHRoZQorL3N5cy9rZXJuZWwvZGVidWcva21lbWxlYWsgb3V0cHV0LiBCeSBpc3N1aW5nIGEgJ3NjYW4nIGFmdGVyIGEgJ2NsZWFyJworeW91IGNhbiBmaW5kIG5ldyB1bnJlZmVyZW5jZWQgb2JqZWN0czsgdGhpcyBzaG91bGQgaGVscCB3aXRoIHRlc3RpbmcKK3NwZWNpZmljIHNlY3Rpb25zIG9mIGNvZGUuCisKK1RvIHRlc3QgYSBjcml0aWNhbCBzZWN0aW9uIG9uIGRlbWFuZCB3aXRoIGEgY2xlYW4ga21lbWxlYWsgZG86OgorCisgICMgZWNobyBjbGVhciA+IC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrCisgIC4uLiB0ZXN0IHlvdXIga2VybmVsIG9yIG1vZHVsZXMgLi4uCisgICMgZWNobyBzY2FuID4gL3N5cy9rZXJuZWwvZGVidWcva21lbWxlYWsKKworVGhlbiBhcyB1c3VhbCB0byBnZXQgeW91ciByZXBvcnQgd2l0aDo6CisKKyAgIyBjYXQgL3N5cy9rZXJuZWwvZGVidWcva21lbWxlYWsKKworRnJlZWluZyBrbWVtbGVhayBpbnRlcm5hbCBvYmplY3RzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVG8gYWxsb3cgYWNjZXNzIHRvIHByZXZpb3VzbHkgZm91bmQgbWVtb3J5IGxlYWtzIGFmdGVyIGttZW1sZWFrIGhhcyBiZWVuCitkaXNhYmxlZCBieSB0aGUgdXNlciBvciBkdWUgdG8gYW4gZmF0YWwgZXJyb3IsIGludGVybmFsIGttZW1sZWFrIG9iamVjdHMKK3dvbid0IGJlIGZyZWVkIHdoZW4ga21lbWxlYWsgaXMgZGlzYWJsZWQsIGFuZCB0aG9zZSBvYmplY3RzIG1heSBvY2N1cHkKK2EgbGFyZ2UgcGFydCBvZiBwaHlzaWNhbCBtZW1vcnkuCisKK0luIHRoaXMgc2l0dWF0aW9uLCB5b3UgbWF5IHJlY2xhaW0gbWVtb3J5IHdpdGg6OgorCisgICMgZWNobyBjbGVhciA+IC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrCisKK0ttZW1sZWFrIEFQSQorLS0tLS0tLS0tLS0tCisKK1NlZSB0aGUgaW5jbHVkZS9saW51eC9rbWVtbGVhay5oIGhlYWRlciBmb3IgdGhlIGZ1bmN0aW9ucyBwcm90b3R5cGUuCisKKy0gYGBrbWVtbGVha19pbml0YGAJCSAtIGluaXRpYWxpemUga21lbWxlYWsKKy0gYGBrbWVtbGVha19hbGxvY2BgCQkgLSBub3RpZnkgb2YgYSBtZW1vcnkgYmxvY2sgYWxsb2NhdGlvbgorLSBgYGttZW1sZWFrX2FsbG9jX3BlcmNwdWBgCSAtIG5vdGlmeSBvZiBhIHBlcmNwdSBtZW1vcnkgYmxvY2sgYWxsb2NhdGlvbgorLSBgYGttZW1sZWFrX2ZyZWVgYAkJIC0gbm90aWZ5IG9mIGEgbWVtb3J5IGJsb2NrIGZyZWVpbmcKKy0gYGBrbWVtbGVha19mcmVlX3BhcnRgYAkgLSBub3RpZnkgb2YgYSBwYXJ0aWFsIG1lbW9yeSBibG9jayBmcmVlaW5nCistIGBga21lbWxlYWtfZnJlZV9wZXJjcHVgYAkgLSBub3RpZnkgb2YgYSBwZXJjcHUgbWVtb3J5IGJsb2NrIGZyZWVpbmcKKy0gYGBrbWVtbGVha191cGRhdGVfdHJhY2VgYAkgLSB1cGRhdGUgb2JqZWN0IGFsbG9jYXRpb24gc3RhY2sgdHJhY2UKKy0gYGBrbWVtbGVha19ub3RfbGVha2BgCSAtIG1hcmsgYW4gb2JqZWN0IGFzIG5vdCBhIGxlYWsKKy0gYGBrbWVtbGVha19pZ25vcmVgYAkJIC0gZG8gbm90IHNjYW4gb3IgcmVwb3J0IGFuIG9iamVjdCBhcyBsZWFrCistIGBga21lbWxlYWtfc2Nhbl9hcmVhYGAJIC0gYWRkIHNjYW4gYXJlYXMgaW5zaWRlIGEgbWVtb3J5IGJsb2NrCistIGBga21lbWxlYWtfbm9fc2NhbmBgCSAtIGRvIG5vdCBzY2FuIGEgbWVtb3J5IGJsb2NrCistIGBga21lbWxlYWtfZXJhc2VgYAkJIC0gZXJhc2UgYW4gb2xkIHZhbHVlIGluIGEgcG9pbnRlciB2YXJpYWJsZQorLSBgYGttZW1sZWFrX2FsbG9jX3JlY3Vyc2l2ZWBgIC0gYXMga21lbWxlYWtfYWxsb2MgYnV0IGNoZWNrcyB0aGUgcmVjdXJzaXZlbmVzcworLSBgYGttZW1sZWFrX2ZyZWVfcmVjdXJzaXZlYGAJIC0gYXMga21lbWxlYWtfZnJlZSBidXQgY2hlY2tzIHRoZSByZWN1cnNpdmVuZXNzCisKK0RlYWxpbmcgd2l0aCBmYWxzZSBwb3NpdGl2ZXMvbmVnYXRpdmVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZmFsc2UgbmVnYXRpdmVzIGFyZSByZWFsIG1lbW9yeSBsZWFrcyAob3JwaGFuIG9iamVjdHMpIGJ1dCBub3QKK3JlcG9ydGVkIGJ5IGttZW1sZWFrIGJlY2F1c2UgdmFsdWVzIGZvdW5kIGR1cmluZyB0aGUgbWVtb3J5IHNjYW5uaW5nCitwb2ludCB0byBzdWNoIG9iamVjdHMuIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGZhbHNlIG5lZ2F0aXZlcywga21lbWxlYWsKK3Byb3ZpZGVzIHRoZSBrbWVtbGVha19pZ25vcmUsIGttZW1sZWFrX3NjYW5fYXJlYSwga21lbWxlYWtfbm9fc2NhbiBhbmQKK2ttZW1sZWFrX2VyYXNlIGZ1bmN0aW9ucyAoc2VlIGFib3ZlKS4gVGhlIHRhc2sgc3RhY2tzIGFsc28gaW5jcmVhc2UgdGhlCithbW91bnQgb2YgZmFsc2UgbmVnYXRpdmVzIGFuZCB0aGVpciBzY2FubmluZyBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0LgorCitUaGUgZmFsc2UgcG9zaXRpdmVzIGFyZSBvYmplY3RzIHdyb25nbHkgcmVwb3J0ZWQgYXMgYmVpbmcgbWVtb3J5IGxlYWtzCisob3JwaGFuKS4gRm9yIG9iamVjdHMga25vd24gbm90IHRvIGJlIGxlYWtzLCBrbWVtbGVhayBwcm92aWRlcyB0aGUKK2ttZW1sZWFrX25vdF9sZWFrIGZ1bmN0aW9uLiBUaGUga21lbWxlYWtfaWdub3JlIGNvdWxkIGFsc28gYmUgdXNlZCBpZgordGhlIG1lbW9yeSBibG9jayBpcyBrbm93biBub3QgdG8gY29udGFpbiBvdGhlciBwb2ludGVycyBhbmQgaXQgd2lsbCBubworbG9uZ2VyIGJlIHNjYW5uZWQuCisKK1NvbWUgb2YgdGhlIHJlcG9ydGVkIGxlYWtzIGFyZSBvbmx5IHRyYW5zaWVudCwgZXNwZWNpYWxseSBvbiBTTVAKK3N5c3RlbXMsIGJlY2F1c2Ugb2YgcG9pbnRlcnMgdGVtcG9yYXJpbHkgc3RvcmVkIGluIENQVSByZWdpc3RlcnMgb3IKK3N0YWNrcy4gS21lbWxlYWsgZGVmaW5lcyBNU0VDU19NSU5fQUdFIChkZWZhdWx0aW5nIHRvIDEwMDApIHJlcHJlc2VudGluZwordGhlIG1pbmltdW0gYWdlIG9mIGFuIG9iamVjdCB0byBiZSByZXBvcnRlZCBhcyBhIG1lbW9yeSBsZWFrLgorCitMaW1pdGF0aW9ucyBhbmQgRHJhd2JhY2tzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBtYWluIGRyYXdiYWNrIGlzIHRoZSByZWR1Y2VkIHBlcmZvcm1hbmNlIG9mIG1lbW9yeSBhbGxvY2F0aW9uIGFuZAorZnJlZWluZy4gVG8gYXZvaWQgb3RoZXIgcGVuYWx0aWVzLCB0aGUgbWVtb3J5IHNjYW5uaW5nIGlzIG9ubHkgcGVyZm9ybWVkCit3aGVuIHRoZSAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhayBmaWxlIGlzIHJlYWQuIEFueXdheSwgdGhpcyB0b29sIGlzCitpbnRlbmRlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIHdoZXJlIHRoZSBwZXJmb3JtYW5jZSBtaWdodCBub3QgYmUgdGhlCittb3N0IGltcG9ydGFudCByZXF1aXJlbWVudC4KKworVG8ga2VlcCB0aGUgYWxnb3JpdGhtIHNpbXBsZSwga21lbWxlYWsgc2NhbnMgZm9yIHZhbHVlcyBwb2ludGluZyB0byBhbnkKK2FkZHJlc3MgaW5zaWRlIGEgYmxvY2sncyBhZGRyZXNzIHJhbmdlLiBUaGlzIG1heSBsZWFkIHRvIGFuIGluY3JlYXNlZAorbnVtYmVyIG9mIGZhbHNlIG5lZ2F0aXZlcy4gSG93ZXZlciwgaXQgaXMgbGlrZWx5IHRoYXQgYSByZWFsIG1lbW9yeSBsZWFrCit3aWxsIGV2ZW50dWFsbHkgYmVjb21lIHZpc2libGUuCisKK0Fub3RoZXIgc291cmNlIG9mIGZhbHNlIG5lZ2F0aXZlcyBpcyB0aGUgZGF0YSBzdG9yZWQgaW4gbm9uLXBvaW50ZXIKK3ZhbHVlcy4gSW4gYSBmdXR1cmUgdmVyc2lvbiwga21lbWxlYWsgY291bGQgb25seSBzY2FuIHRoZSBwb2ludGVyCittZW1iZXJzIGluIHRoZSBhbGxvY2F0ZWQgc3RydWN0dXJlcy4gVGhpcyBmZWF0dXJlIHdvdWxkIHNvbHZlIG1hbnkgb2YKK3RoZSBmYWxzZSBuZWdhdGl2ZSBjYXNlcyBkZXNjcmliZWQgYWJvdmUuCisKK1RoZSB0b29sIGNhbiByZXBvcnQgZmFsc2UgcG9zaXRpdmVzLiBUaGVzZSBhcmUgY2FzZXMgd2hlcmUgYW4gYWxsb2NhdGVkCitibG9jayBkb2Vzbid0IG5lZWQgdG8gYmUgZnJlZWQgKHNvbWUgY2FzZXMgaW4gdGhlIGluaXRfY2FsbCBmdW5jdGlvbnMpLAordGhlIHBvaW50ZXIgaXMgY2FsY3VsYXRlZCBieSBvdGhlciBtZXRob2RzIHRoYW4gdGhlIHVzdWFsIGNvbnRhaW5lcl9vZgorbWFjcm8gb3IgdGhlIHBvaW50ZXIgaXMgc3RvcmVkIGluIGEgbG9jYXRpb24gbm90IHNjYW5uZWQgYnkga21lbWxlYWsuCisKK1BhZ2UgYWxsb2NhdGlvbnMgYW5kIGlvcmVtYXAgYXJlIG5vdCB0cmFja2VkLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMvc3BhcnNlLnJzdCBiL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL3NwYXJzZS5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMyNTBlOAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL3NwYXJzZS5yc3QKQEAgLTAsMCArMSwxMTcgQEAKKy4uIENvcHlyaWdodCAyMDA0IExpbnVzIFRvcnZhbGRzCisuLiBDb3B5cmlnaHQgMjAwNCBQYXZlbCBNYWNoZWsgPHBhdmVsQHVjdy5jej4KKy4uIENvcHlyaWdodCAyMDA2IEJvYiBDb3BlbGFuZCA8bWVAYm9iY29wZWxhbmQuY29tPgorCitTcGFyc2UKKz09PT09PQorCitTcGFyc2UgaXMgYSBzZW1hbnRpYyBjaGVja2VyIGZvciBDIHByb2dyYW1zOyBpdCBjYW4gYmUgdXNlZCB0byBmaW5kIGEKK251bWJlciBvZiBwb3RlbnRpYWwgcHJvYmxlbXMgd2l0aCBrZXJuZWwgY29kZS4gIFNlZQoraHR0cHM6Ly9sd24ubmV0L0FydGljbGVzLzY4OTkwNy8gZm9yIGFuIG92ZXJ2aWV3IG9mIHNwYXJzZTsgdGhpcyBkb2N1bWVudAorY29udGFpbnMgc29tZSBrZXJuZWwtc3BlY2lmaWMgc3BhcnNlIGluZm9ybWF0aW9uLgorCisKK1VzaW5nIHNwYXJzZSBmb3IgdHlwZWNoZWNraW5nCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisiX19iaXR3aXNlIiBpcyBhIHR5cGUgYXR0cmlidXRlLCBzbyB5b3UgaGF2ZSB0byBkbyBzb21ldGhpbmcgbGlrZSB0aGlzOjoKKworICAgICAgICB0eXBlZGVmIGludCBfX2JpdHdpc2UgcG1fcmVxdWVzdF90OworCisgICAgICAgIGVudW0gcG1fcmVxdWVzdCB7CisgICAgICAgICAgICAgICAgUE1fU1VTUEVORCA9IChfX2ZvcmNlIHBtX3JlcXVlc3RfdCkgMSwKKyAgICAgICAgICAgICAgICBQTV9SRVNVTUUgPSAoX19mb3JjZSBwbV9yZXF1ZXN0X3QpIDIKKyAgICAgICAgfTsKKword2hpY2ggbWFrZXMgUE1fU1VTUEVORCBhbmQgUE1fUkVTVU1FICJiaXR3aXNlIiBpbnRlZ2VycyAodGhlICJfX2ZvcmNlIiBpcwordGhlcmUgYmVjYXVzZSBzcGFyc2Ugd2lsbCBjb21wbGFpbiBhYm91dCBjYXN0aW5nIHRvL2Zyb20gYSBiaXR3aXNlIHR5cGUsCitidXQgaW4gdGhpcyBjYXNlIHdlIHJlYWxseSBfZG9fIHdhbnQgdG8gZm9yY2UgdGhlIGNvbnZlcnNpb24pLiBBbmQgYmVjYXVzZQordGhlIGVudW0gdmFsdWVzIGFyZSBhbGwgdGhlIHNhbWUgdHlwZSwgbm93ICJlbnVtIHBtX3JlcXVlc3QiIHdpbGwgYmUgdGhhdAordHlwZSB0b28uCisKK0FuZCB3aXRoIGdjYywgYWxsIHRoZSAiX19iaXR3aXNlIi8iX19mb3JjZSBzdHVmZiIgZ29lcyBhd2F5LCBhbmQgaXQgYWxsCitlbmRzIHVwIGxvb2tpbmcganVzdCBsaWtlIGludGVnZXJzIHRvIGdjYy4KKworUXVpdGUgZnJhbmtseSwgeW91IGRvbid0IG5lZWQgdGhlIGVudW0gdGhlcmUuIFRoZSBhYm92ZSBhbGwgcmVhbGx5IGp1c3QKK2JvaWxzIGRvd24gdG8gb25lIHNwZWNpYWwgImludCBfX2JpdHdpc2UiIHR5cGUuCisKK1NvIHRoZSBzaW1wbGVyIHdheSBpcyB0byBqdXN0IGRvOjoKKworICAgICAgICB0eXBlZGVmIGludCBfX2JpdHdpc2UgcG1fcmVxdWVzdF90OworCisgICAgICAgICNkZWZpbmUgUE1fU1VTUEVORCAoKF9fZm9yY2UgcG1fcmVxdWVzdF90KSAxKQorICAgICAgICAjZGVmaW5lIFBNX1JFU1VNRSAoKF9fZm9yY2UgcG1fcmVxdWVzdF90KSAyKQorCithbmQgeW91IG5vdyBoYXZlIGFsbCB0aGUgaW5mcmFzdHJ1Y3R1cmUgbmVlZGVkIGZvciBzdHJpY3QgdHlwZWNoZWNraW5nLgorCitPbmUgc21hbGwgbm90ZTogdGhlIGNvbnN0YW50IGludGVnZXIgIjAiIGlzIHNwZWNpYWwuIFlvdSBjYW4gdXNlIGEKK2NvbnN0YW50IHplcm8gYXMgYSBiaXR3aXNlIGludGVnZXIgdHlwZSB3aXRob3V0IHNwYXJzZSBldmVyIGNvbXBsYWluaW5nLgorVGhpcyBpcyBiZWNhdXNlICJiaXR3aXNlIiAoYXMgdGhlIG5hbWUgaW1wbGllcykgd2FzIGRlc2lnbmVkIGZvciBtYWtpbmcKK3N1cmUgdGhhdCBiaXR3aXNlIHR5cGVzIGRvbid0IGdldCBtaXhlZCB1cCAobGl0dGxlLWVuZGlhbiB2cyBiaWctZW5kaWFuCit2cyBjcHUtZW5kaWFuIHZzIHdoYXRldmVyKSwgYW5kIHRoZXJlIHRoZSBjb25zdGFudCAiMCIgcmVhbGx5IF9pc18KK3NwZWNpYWwuCisKK19fYml0d2lzZV9fIC0gdG8gYmUgdXNlZCBmb3IgcmVsYXRpdmVseSBjb21wYWN0IHN0dWZmIChnZnBfdCwgZXRjLikgdGhhdAoraXMgbW9zdGx5IHdhcm5pbmctZnJlZSBhbmQgaXMgc3VwcG9zZWQgdG8gc3RheSB0aGF0IHdheS4gIFdhcm5pbmdzIHdpbGwKK2JlIGdlbmVyYXRlZCB3aXRob3V0IF9fQ0hFQ0tfRU5ESUFOX18uCisKK19fYml0d2lzZSAtIG5vaXN5IHN0dWZmOyBpbiBwYXJ0aWN1bGFyLCBfX2xlKi9fX2JlKiBhcmUgdGhhdC4gIFdlIHJlYWxseQorZG9uJ3Qgd2FudCB0byBkcm93biBpbiBub2lzZSB1bmxlc3Mgd2UnZCBleHBsaWNpdGx5IGFza2VkIGZvciBpdC4KKworVXNpbmcgc3BhcnNlIGZvciBsb2NrIGNoZWNraW5nCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIHVuZGVmaW5lZCBmb3IgZ2NjIGFuZCBkZWZpbmVkIGR1cmluZyBhIHNwYXJzZQorcnVuIHRvIHVzZSB0aGUgImNvbnRleHQiIHRyYWNraW5nIGZlYXR1cmUgb2Ygc3BhcnNlLCBhcHBsaWVkIHRvCitsb2NraW5nLiAgVGhlc2UgYW5ub3RhdGlvbnMgdGVsbCBzcGFyc2Ugd2hlbiBhIGxvY2sgaXMgaGVsZCwgd2l0aAorcmVnYXJkIHRvIHRoZSBhbm5vdGF0ZWQgZnVuY3Rpb24ncyBlbnRyeSBhbmQgZXhpdC4KKworX19tdXN0X2hvbGQgLSBUaGUgc3BlY2lmaWVkIGxvY2sgaXMgaGVsZCBvbiBmdW5jdGlvbiBlbnRyeSBhbmQgZXhpdC4KKworX19hY3F1aXJlcyAtIFRoZSBzcGVjaWZpZWQgbG9jayBpcyBoZWxkIG9uIGZ1bmN0aW9uIGV4aXQsIGJ1dCBub3QgZW50cnkuCisKK19fcmVsZWFzZXMgLSBUaGUgc3BlY2lmaWVkIGxvY2sgaXMgaGVsZCBvbiBmdW5jdGlvbiBlbnRyeSwgYnV0IG5vdCBleGl0LgorCitJZiB0aGUgZnVuY3Rpb24gZW50ZXJzIGFuZCBleGl0cyB3aXRob3V0IHRoZSBsb2NrIGhlbGQsIGFjcXVpcmluZyBhbmQKK3JlbGVhc2luZyB0aGUgbG9jayBpbnNpZGUgdGhlIGZ1bmN0aW9uIGluIGEgYmFsYW5jZWQgd2F5LCBubworYW5ub3RhdGlvbiBpcyBuZWVkZWQuICBUaGUgdHJlZSBhbm5vdGF0aW9ucyBhYm92ZSBhcmUgZm9yIGNhc2VzIHdoZXJlCitzcGFyc2Ugd291bGQgb3RoZXJ3aXNlIHJlcG9ydCBhIGNvbnRleHQgaW1iYWxhbmNlLgorCitHZXR0aW5nIHNwYXJzZQorLS0tLS0tLS0tLS0tLS0KKworWW91IGNhbiBnZXQgbGF0ZXN0IHJlbGVhc2VkIHZlcnNpb25zIGZyb20gdGhlIFNwYXJzZSBob21lcGFnZSBhdAoraHR0cHM6Ly9zcGFyc2Uud2lraS5rZXJuZWwub3JnL2luZGV4LnBocC9NYWluX1BhZ2UKKworQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBnZXQgc25hcHNob3RzIG9mIHRoZSBsYXRlc3QgZGV2ZWxvcG1lbnQgdmVyc2lvbgorb2Ygc3BhcnNlIHVzaW5nIGdpdCB0byBjbG9uZTo6CisKKyAgICAgICAgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9kZXZlbC9zcGFyc2Uvc3BhcnNlLmdpdAorCitEYXZlSiBoYXMgaG91cmx5IGdlbmVyYXRlZCB0YXJiYWxscyBvZiB0aGUgZ2l0IHRyZWUgYXZhaWxhYmxlIGF0OjoKKworICAgICAgICBodHRwOi8vd3d3LmNvZGVtb25rZXkub3JnLnVrL3Byb2plY3RzL2dpdC1zbmFwc2hvdHMvc3BhcnNlLworCisKK09uY2UgeW91IGhhdmUgaXQsIGp1c3QgZG86OgorCisgICAgICAgIG1ha2UKKyAgICAgICAgbWFrZSBpbnN0YWxsCisKK2FzIGEgcmVndWxhciB1c2VyLCBhbmQgaXQgd2lsbCBpbnN0YWxsIHNwYXJzZSBpbiB5b3VyIH4vYmluIGRpcmVjdG9yeS4KKworVXNpbmcgc3BhcnNlCistLS0tLS0tLS0tLS0KKworRG8gYSBrZXJuZWwgbWFrZSB3aXRoICJtYWtlIEM9MSIgdG8gcnVuIHNwYXJzZSBvbiBhbGwgdGhlIEMgZmlsZXMgdGhhdCBnZXQKK3JlY29tcGlsZWQsIG9yIHVzZSAibWFrZSBDPTIiIHRvIHJ1biBzcGFyc2Ugb24gdGhlIGZpbGVzIHdoZXRoZXIgdGhleSBuZWVkIHRvCitiZSByZWNvbXBpbGVkIG9yIG5vdC4gIFRoZSBsYXR0ZXIgaXMgYSBmYXN0IHdheSB0byBjaGVjayB0aGUgd2hvbGUgdHJlZSBpZiB5b3UKK2hhdmUgYWxyZWFkeSBidWlsdCBpdC4KKworVGhlIG9wdGlvbmFsIG1ha2UgdmFyaWFibGUgQ0YgY2FuIGJlIHVzZWQgdG8gcGFzcyBhcmd1bWVudHMgdG8gc3BhcnNlLiAgVGhlCitidWlsZCBzeXN0ZW0gcGFzc2VzIC1XYml0d2lzZSB0byBzcGFyc2UgYXV0b21hdGljYWxseS4gIFRvIHBlcmZvcm0gZW5kaWFubmVzcworY2hlY2tzLCB5b3UgbWF5IGRlZmluZSBfX0NIRUNLX0VORElBTl9fOjoKKworICAgICAgICBtYWtlIEM9MiBDRj0iLURfX0NIRUNLX0VORElBTl9fIgorCitUaGVzZSBjaGVja3MgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQgYXMgdGhleSBnZW5lcmF0ZSBhIGhvc3Qgb2Ygd2FybmluZ3MuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Rldi10b29scy90b29scy5yc3QgYi9Eb2N1bWVudGF0aW9uL2Rldi10b29scy90b29scy5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI0YWU4ZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL3Rvb2xzLnJzdApAQCAtMCwwICsxLDI1IEBACis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorRGV2ZWxvcG1lbnQgdG9vbHMgZm9yIHRoZSBrZXJuZWwKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZG9jdW1lbnQgaXMgYSBjb2xsZWN0aW9uIG9mIGRvY3VtZW50cyBhYm91dCBkZXZlbG9wbWVudCB0b29scyB0aGF0IGNhbgorYmUgdXNlZCB0byB3b3JrIG9uIHRoZSBrZXJuZWwuICBGb3Igbm93LCB0aGUgZG9jdW1lbnRzIGhhdmUgYmVlbiBwdWxsZWQKK3RvZ2V0aGVyIHdpdGhvdXQgYW55IHNpZ25pZmljYW50IGVmZm90IHRvIGludGVncmF0ZSB0aGVtIGludG8gYSBjb2hlcmVudAord2hvbGU7IHBhdGNoZXMgd2VsY29tZSEKKworLi4gY2xhc3M6OiB0b2MtdGl0bGUKKworCSAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKy4uIHRvY3RyZWU6OgorICAgOm1heGRlcHRoOiAyCisKKyAgIGNvY2NpbmVsbGUKKyAgIHNwYXJzZQorICAga2NvdgorICAgZ2NvdgorICAga2FzYW4KKyAgIHVic2FuCisgICBrbWVtbGVhaworICAga21lbWNoZWNrCisgICBnZGIta2VybmVsLWRlYnVnZ2luZwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMvdWJzYW4ucnN0IGIvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMvdWJzYW4ucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NWU2YjYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2Rldi10b29scy91YnNhbi5yc3QKQEAgLTAsMCArMSw4OCBAQAorVGhlIFVuZGVmaW5lZCBCZWhhdmlvciBTYW5pdGl6ZXIgLSBVQlNBTgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitVQlNBTiBpcyBhIHJ1bnRpbWUgdW5kZWZpbmVkIGJlaGF2aW91ciBjaGVja2VyLgorCitVQlNBTiB1c2VzIGNvbXBpbGUtdGltZSBpbnN0cnVtZW50YXRpb24gdG8gY2F0Y2ggdW5kZWZpbmVkIGJlaGF2aW9yIChVQikuCitDb21waWxlciBpbnNlcnRzIGNvZGUgdGhhdCBwZXJmb3JtIGNlcnRhaW4ga2luZHMgb2YgY2hlY2tzIGJlZm9yZSBvcGVyYXRpb25zCit0aGF0IG1heSBjYXVzZSBVQi4gSWYgY2hlY2sgZmFpbHMgKGkuZS4gVUIgZGV0ZWN0ZWQpIF9fdWJzYW5faGFuZGxlXyoKK2Z1bmN0aW9uIGNhbGxlZCB0byBwcmludCBlcnJvciBtZXNzYWdlLgorCitHQ0MgaGFzIHRoYXQgZmVhdHVyZSBzaW5jZSA0LjkueCBbMV9dIChzZWUgYGAtZnNhbml0aXplPXVuZGVmaW5lZGBgIG9wdGlvbiBhbmQKK2l0cyBzdWJvcHRpb25zKS4gR0NDIDUueCBoYXMgbW9yZSBjaGVja2VycyBpbXBsZW1lbnRlZCBbMl9dLgorCitSZXBvcnQgZXhhbXBsZQorLS0tLS0tLS0tLS0tLS0KKworOjoKKworCSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCSBVQlNBTjogVW5kZWZpbmVkIGJlaGF2aW91ciBpbiAuLi9pbmNsdWRlL2xpbnV4L2JpdG9wcy5oOjExMDozMworCSBzaGlmdCBleHBvbmVudCAzMiBpcyB0byBsYXJnZSBmb3IgMzItYml0IHR5cGUgJ3Vuc2lnbmVkIGludCcKKwkgQ1BVOiAwIFBJRDogMCBDb21tOiBzd2FwcGVyIE5vdCB0YWludGVkIDQuNC4wLXJjMSsgIzI2CisJICAwMDAwMDAwMDAwMDAwMDAwIGZmZmZmZmZmODI0MDNjYzggZmZmZmZmZmY4MTVlNmNkNiAwMDAwMDAwMDAwMDAwMDAxCisJICBmZmZmZmZmZjgyNDAzY2Y4IGZmZmZmZmZmODI0MDNjZTAgZmZmZmZmZmY4MTYzYTVlZCAwMDAwMDAwMDAwMDAwMDIwCisJICBmZmZmZmZmZjgyNDAzZDc4IGZmZmZmZmZmODE2M2FjMmIgZmZmZmZmZmY4MTVmMDAwMSAwMDAwMDAwMDAwMDAwMDAyCisJIENhbGwgVHJhY2U6CisJICBbPGZmZmZmZmZmODE1ZTZjZDY+XSBkdW1wX3N0YWNrKzB4NDUvMHg1ZgorCSAgWzxmZmZmZmZmZjgxNjNhNWVkPl0gdWJzYW5fZXBpbG9ndWUrMHhkLzB4NDAKKwkgIFs8ZmZmZmZmZmY4MTYzYWMyYj5dIF9fdWJzYW5faGFuZGxlX3NoaWZ0X291dF9vZl9ib3VuZHMrMHhlYi8weDEzMAorCSAgWzxmZmZmZmZmZjgxNWYwMDAxPl0gPyByYWRpeF90cmVlX2dhbmdfbG9va3VwX3Nsb3QrMHg1MS8weDE1MAorCSAgWzxmZmZmZmZmZjgxNzNjNTg2Pl0gX21peF9wb29sX2J5dGVzKzB4MWU2LzB4NDgwCisJICBbPGZmZmZmZmZmODMxMDU2NTM+XSA/IGRtaV93YWxrX2Vhcmx5KzB4NDgvMHg1YworCSAgWzxmZmZmZmZmZjgxNzNjODgxPl0gYWRkX2RldmljZV9yYW5kb21uZXNzKzB4NjEvMHgxMzAKKwkgIFs8ZmZmZmZmZmY4MzEwNWIzNT5dID8gZG1pX3NhdmVfb25lX2RldmljZSsweGFhLzB4YWEKKwkgIFs8ZmZmZmZmZmY4MzEwNTY1Mz5dIGRtaV93YWxrX2Vhcmx5KzB4NDgvMHg1YworCSAgWzxmZmZmZmZmZjgzMTA2NmFlPl0gZG1pX3NjYW5fbWFjaGluZSsweDI3OC8weDRiNAorCSAgWzxmZmZmZmZmZjgxMTFkNThhPl0gPyB2cHJpbnRrX2RlZmF1bHQrMHgxYS8weDIwCisJICBbPGZmZmZmZmZmODMwYWQxMjA+XSA/IGVhcmx5X2lkdF9oYW5kbGVyX2FycmF5KzB4MTIwLzB4MTIwCisJICBbPGZmZmZmZmZmODMwYjIyNDA+XSBzZXR1cF9hcmNoKzB4NDA1LzB4YzJjCisJICBbPGZmZmZmZmZmODMwYWQxMjA+XSA/IGVhcmx5X2lkdF9oYW5kbGVyX2FycmF5KzB4MTIwLzB4MTIwCisJICBbPGZmZmZmZmZmODMwYWUwNTM+XSBzdGFydF9rZXJuZWwrMHg4My8weDQ5YQorCSAgWzxmZmZmZmZmZjgzMGFkMTIwPl0gPyBlYXJseV9pZHRfaGFuZGxlcl9hcnJheSsweDEyMC8weDEyMAorCSAgWzxmZmZmZmZmZjgzMGFkMzg2Pl0geDg2XzY0X3N0YXJ0X3Jlc2VydmF0aW9ucysweDJhLzB4MmMKKwkgIFs8ZmZmZmZmZmY4MzBhZDRmMz5dIHg4Nl82NF9zdGFydF9rZXJuZWwrMHgxNmIvMHgxN2EKKwkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVXNhZ2UKKy0tLS0tCisKK1RvIGVuYWJsZSBVQlNBTiBjb25maWd1cmUga2VybmVsIHdpdGg6OgorCisJQ09ORklHX1VCU0FOPXkKKworYW5kIHRvIGNoZWNrIHRoZSBlbnRpcmUga2VybmVsOjoKKworICAgICAgICBDT05GSUdfVUJTQU5fU0FOSVRJWkVfQUxMPXkKKworVG8gZW5hYmxlIGluc3RydW1lbnRhdGlvbiBmb3Igc3BlY2lmaWMgZmlsZXMgb3IgZGlyZWN0b3JpZXMsIGFkZCBhIGxpbmUKK3NpbWlsYXIgdG8gdGhlIGZvbGxvd2luZyB0byB0aGUgcmVzcGVjdGl2ZSBrZXJuZWwgTWFrZWZpbGU6CisKKy0gRm9yIGEgc2luZ2xlIGZpbGUgKGUuZy4gbWFpbi5vKTo6CisKKyAgICBVQlNBTl9TQU5JVElaRV9tYWluLm8gOj0geQorCistIEZvciBhbGwgZmlsZXMgaW4gb25lIGRpcmVjdG9yeTo6CisKKyAgICBVQlNBTl9TQU5JVElaRSA6PSB5CisKK1RvIGV4Y2x1ZGUgZmlsZXMgZnJvbSBiZWluZyBpbnN0cnVtZW50ZWQgZXZlbiBpZgorYGBDT05GSUdfVUJTQU5fU0FOSVRJWkVfQUxMPXlgYCwgdXNlOjoKKworICBVQlNBTl9TQU5JVElaRV9tYWluLm8gOj0gbgorCithbmQ6OgorCisgIFVCU0FOX1NBTklUSVpFIDo9IG4KKworRGV0ZWN0aW9uIG9mIHVuYWxpZ25lZCBhY2Nlc3NlcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIHNlcGFyYXRlIG9wdGlvbiAtCitDT05GSUdfVUJTQU5fQUxJR05NRU5ULiBJdCdzIG9mZiBieSBkZWZhdWx0IG9uIGFyY2hpdGVjdHVyZXMgdGhhdCBzdXBwb3J0Cit1bmFsaWduZWQgYWNjZXNzZXMgKENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTPXkpLiBPbmUgY291bGQKK3N0aWxsIGVuYWJsZSBpdCBpbiBjb25maWcsIGp1c3Qgbm90ZSB0aGF0IGl0IHdpbGwgcHJvZHVjZSBhIGxvdCBvZiBVQlNBTgorcmVwb3J0cy4KKworUmVmZXJlbmNlcworLS0tLS0tLS0tLQorCisuLiBfMTogaHR0cHM6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2djYy00LjkuMC9nY2MvRGVidWdnaW5nLU9wdGlvbnMuaHRtbAorLi4gXzI6IGh0dHBzOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9nY2MvRGVidWdnaW5nLU9wdGlvbnMuaHRtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzEuSW50cm8gYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvMS5JbnRybwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI2MTQ0OC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvMS5JbnRybworKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0xOiBBIEdVSURFIFRPIFRIRSBLRVJORUwgREVWRUxPUE1FTlQgUFJPQ0VTUwotCi1UaGUgcHVycG9zZSBvZiB0aGlzIGRvY3VtZW50IGlzIHRvIGhlbHAgZGV2ZWxvcGVycyAoYW5kIHRoZWlyIG1hbmFnZXJzKQotd29yayB3aXRoIHRoZSBkZXZlbG9wbWVudCBjb21tdW5pdHkgd2l0aCBhIG1pbmltdW0gb2YgZnJ1c3RyYXRpb24uICBJdCBpcwotYW4gYXR0ZW1wdCB0byBkb2N1bWVudCBob3cgdGhpcyBjb21tdW5pdHkgd29ya3MgaW4gYSB3YXkgd2hpY2ggaXMKLWFjY2Vzc2libGUgdG8gdGhvc2Ugd2hvIGFyZSBub3QgaW50aW1hdGVseSBmYW1pbGlhciB3aXRoIExpbnV4IGtlcm5lbAotZGV2ZWxvcG1lbnQgKG9yLCBpbmRlZWQsIGZyZWUgc29mdHdhcmUgZGV2ZWxvcG1lbnQgaW4gZ2VuZXJhbCkuICBXaGlsZQotdGhlcmUgaXMgc29tZSB0ZWNobmljYWwgbWF0ZXJpYWwgaGVyZSwgdGhpcyBpcyB2ZXJ5IG11Y2ggYSBwcm9jZXNzLW9yaWVudGVkCi1kaXNjdXNzaW9uIHdoaWNoIGRvZXMgbm90IHJlcXVpcmUgYSBkZWVwIGtub3dsZWRnZSBvZiBrZXJuZWwgcHJvZ3JhbW1pbmcgdG8KLXVuZGVyc3RhbmQuCi0KLQotMS4xOiBFWEVDVVRJVkUgU1VNTUFSWQotCi1UaGUgcmVzdCBvZiB0aGlzIHNlY3Rpb24gY292ZXJzIHRoZSBzY29wZSBvZiB0aGUga2VybmVsIGRldmVsb3BtZW50IHByb2Nlc3MKLWFuZCB0aGUga2luZHMgb2YgZnJ1c3RyYXRpb25zIHRoYXQgZGV2ZWxvcGVycyBhbmQgdGhlaXIgZW1wbG95ZXJzIGNhbgotZW5jb3VudGVyIHRoZXJlLiAgVGhlcmUgYXJlIGEgZ3JlYXQgbWFueSByZWFzb25zIHdoeSBrZXJuZWwgY29kZSBzaG91bGQgYmUKLW1lcmdlZCBpbnRvIHRoZSBvZmZpY2lhbCAoIm1haW5saW5lIikga2VybmVsLCBpbmNsdWRpbmcgYXV0b21hdGljCi1hdmFpbGFiaWxpdHkgdG8gdXNlcnMsIGNvbW11bml0eSBzdXBwb3J0IGluIG1hbnkgZm9ybXMsIGFuZCB0aGUgYWJpbGl0eSB0bwotaW5mbHVlbmNlIHRoZSBkaXJlY3Rpb24gb2Yga2VybmVsIGRldmVsb3BtZW50LiAgQ29kZSBjb250cmlidXRlZCB0byB0aGUKLUxpbnV4IGtlcm5lbCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGEgR1BMLWNvbXBhdGlibGUgbGljZW5zZS4KLQotU2VjdGlvbiAyIGludHJvZHVjZXMgdGhlIGRldmVsb3BtZW50IHByb2Nlc3MsIHRoZSBrZXJuZWwgcmVsZWFzZSBjeWNsZSwgYW5kCi10aGUgbWVjaGFuaWNzIG9mIHRoZSBtZXJnZSB3aW5kb3cuICBUaGUgdmFyaW91cyBwaGFzZXMgaW4gdGhlIHBhdGNoCi1kZXZlbG9wbWVudCwgcmV2aWV3LCBhbmQgbWVyZ2luZyBjeWNsZSBhcmUgY292ZXJlZC4gIFRoZXJlIGlzIHNvbWUKLWRpc2N1c3Npb24gb2YgdG9vbHMgYW5kIG1haWxpbmcgbGlzdHMuICBEZXZlbG9wZXJzIHdhbnRpbmcgdG8gZ2V0IHN0YXJ0ZWQKLXdpdGgga2VybmVsIGRldmVsb3BtZW50IGFyZSBlbmNvdXJhZ2VkIHRvIHRyYWNrIGRvd24gYW5kIGZpeCBidWdzIGFzIGFuCi1pbml0aWFsIGV4ZXJjaXNlLgotCi1TZWN0aW9uIDMgY292ZXJzIGVhcmx5LXN0YWdlIHByb2plY3QgcGxhbm5pbmcsIHdpdGggYW4gZW1waGFzaXMgb24KLWludm9sdmluZyB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5IGFzIHNvb24gYXMgcG9zc2libGUuCi0KLVNlY3Rpb24gNCBpcyBhYm91dCB0aGUgY29kaW5nIHByb2Nlc3M7IHNldmVyYWwgcGl0ZmFsbHMgd2hpY2ggaGF2ZSBiZWVuCi1lbmNvdW50ZXJlZCBieSBvdGhlciBkZXZlbG9wZXJzIGFyZSBkaXNjdXNzZWQuICBTb21lIHJlcXVpcmVtZW50cyBmb3IKLXBhdGNoZXMgYXJlIGNvdmVyZWQsIGFuZCB0aGVyZSBpcyBhbiBpbnRyb2R1Y3Rpb24gdG8gc29tZSBvZiB0aGUgdG9vbHMKLXdoaWNoIGNhbiBoZWxwIHRvIGVuc3VyZSB0aGF0IGtlcm5lbCBwYXRjaGVzIGFyZSBjb3JyZWN0LgotCi1TZWN0aW9uIDUgdGFsa3MgYWJvdXQgdGhlIHByb2Nlc3Mgb2YgcG9zdGluZyBwYXRjaGVzIGZvciByZXZpZXcuICBUbyBiZQotdGFrZW4gc2VyaW91c2x5IGJ5IHRoZSBkZXZlbG9wbWVudCBjb21tdW5pdHksIHBhdGNoZXMgbXVzdCBiZSBwcm9wZXJseQotZm9ybWF0dGVkIGFuZCBkZXNjcmliZWQsIGFuZCB0aGV5IG11c3QgYmUgc2VudCB0byB0aGUgcmlnaHQgcGxhY2UuCi1Gb2xsb3dpbmcgdGhlIGFkdmljZSBpbiB0aGlzIHNlY3Rpb24gc2hvdWxkIGhlbHAgdG8gZW5zdXJlIHRoZSBiZXN0Ci1wb3NzaWJsZSByZWNlcHRpb24gZm9yIHlvdXIgd29yay4KLQotU2VjdGlvbiA2IGNvdmVycyB3aGF0IGhhcHBlbnMgYWZ0ZXIgcG9zdGluZyBwYXRjaGVzOyB0aGUgam9iIGlzIGZhciBmcm9tCi1kb25lIGF0IHRoYXQgcG9pbnQuICBXb3JraW5nIHdpdGggcmV2aWV3ZXJzIGlzIGEgY3J1Y2lhbCBwYXJ0IG9mIHRoZQotZGV2ZWxvcG1lbnQgcHJvY2VzczsgdGhpcyBzZWN0aW9uIG9mZmVycyBhIG51bWJlciBvZiB0aXBzIG9uIGhvdyB0byBhdm9pZAotcHJvYmxlbXMgYXQgdGhpcyBpbXBvcnRhbnQgc3RhZ2UuICBEZXZlbG9wZXJzIGFyZSBjYXV0aW9uZWQgYWdhaW5zdAotYXNzdW1pbmcgdGhhdCB0aGUgam9iIGlzIGRvbmUgd2hlbiBhIHBhdGNoIGlzIG1lcmdlZCBpbnRvIHRoZSBtYWlubGluZS4KLQotU2VjdGlvbiA3IGludHJvZHVjZXMgYSBjb3VwbGUgb2YgImFkdmFuY2VkIiB0b3BpY3M6IG1hbmFnaW5nIHBhdGNoZXMgd2l0aAotZ2l0IGFuZCByZXZpZXdpbmcgcGF0Y2hlcyBwb3N0ZWQgYnkgb3RoZXJzLgotCi1TZWN0aW9uIDggY29uY2x1ZGVzIHRoZSBkb2N1bWVudCB3aXRoIHBvaW50ZXJzIHRvIHNvdXJjZXMgZm9yIG1vcmUKLWluZm9ybWF0aW9uIG9uIGtlcm5lbCBkZXZlbG9wbWVudC4KLQotCi0xLjI6IFdIQVQgVEhJUyBET0NVTUVOVCBJUyBBQk9VVAotCi1UaGUgTGludXgga2VybmVsLCBhdCBvdmVyIDggbWlsbGlvbiBsaW5lcyBvZiBjb2RlIGFuZCB3ZWxsIG92ZXIgMTAwMAotY29udHJpYnV0b3JzIHRvIGVhY2ggcmVsZWFzZSwgaXMgb25lIG9mIHRoZSBsYXJnZXN0IGFuZCBtb3N0IGFjdGl2ZSBmcmVlCi1zb2Z0d2FyZSBwcm9qZWN0cyBpbiBleGlzdGVuY2UuICBTaW5jZSBpdHMgaHVtYmxlIGJlZ2lubmluZyBpbiAxOTkxLCB0aGlzCi1rZXJuZWwgaGFzIGV2b2x2ZWQgaW50byBhIGJlc3Qtb2YtYnJlZWQgb3BlcmF0aW5nIHN5c3RlbSBjb21wb25lbnQgd2hpY2gKLXJ1bnMgb24gcG9ja2V0LXNpemVkIGRpZ2l0YWwgbXVzaWMgcGxheWVycywgZGVza3RvcCBQQ3MsIHRoZSBsYXJnZXN0Ci1zdXBlcmNvbXB1dGVycyBpbiBleGlzdGVuY2UsIGFuZCBhbGwgdHlwZXMgb2Ygc3lzdGVtcyBpbiBiZXR3ZWVuLiAgSXQgaXMgYQotcm9idXN0LCBlZmZpY2llbnQsIGFuZCBzY2FsYWJsZSBzb2x1dGlvbiBmb3IgYWxtb3N0IGFueSBzaXR1YXRpb24uCi0KLVdpdGggdGhlIGdyb3d0aCBvZiBMaW51eCBoYXMgY29tZSBhbiBpbmNyZWFzZSBpbiB0aGUgbnVtYmVyIG9mIGRldmVsb3BlcnMKLShhbmQgY29tcGFuaWVzKSB3aXNoaW5nIHRvIHBhcnRpY2lwYXRlIGluIGl0cyBkZXZlbG9wbWVudC4gIEhhcmR3YXJlCi12ZW5kb3JzIHdhbnQgdG8gZW5zdXJlIHRoYXQgTGludXggc3VwcG9ydHMgdGhlaXIgcHJvZHVjdHMgd2VsbCwgbWFraW5nCi10aG9zZSBwcm9kdWN0cyBhdHRyYWN0aXZlIHRvIExpbnV4IHVzZXJzLiAgRW1iZWRkZWQgc3lzdGVtcyB2ZW5kb3JzLCB3aG8KLXVzZSBMaW51eCBhcyBhIGNvbXBvbmVudCBpbiBhbiBpbnRlZ3JhdGVkIHByb2R1Y3QsIHdhbnQgTGludXggdG8gYmUgYXMKLWNhcGFibGUgYW5kIHdlbGwtc3VpdGVkIHRvIHRoZSB0YXNrIGF0IGhhbmQgYXMgcG9zc2libGUuICBEaXN0cmlidXRvcnMgYW5kCi1vdGhlciBzb2Z0d2FyZSB2ZW5kb3JzIHdobyBiYXNlIHRoZWlyIHByb2R1Y3RzIG9uIExpbnV4IGhhdmUgYSBjbGVhcgotaW50ZXJlc3QgaW4gdGhlIGNhcGFiaWxpdGllcywgcGVyZm9ybWFuY2UsIGFuZCByZWxpYWJpbGl0eSBvZiB0aGUgTGludXgKLWtlcm5lbC4gIEFuZCBlbmQgdXNlcnMsIHRvbywgd2lsbCBvZnRlbiB3aXNoIHRvIGNoYW5nZSBMaW51eCB0byBtYWtlIGl0Ci1iZXR0ZXIgc3VpdCB0aGVpciBuZWVkcy4KLQotT25lIG9mIHRoZSBtb3N0IGNvbXBlbGxpbmcgZmVhdHVyZXMgb2YgTGludXggaXMgdGhhdCBpdCBpcyBhY2Nlc3NpYmxlIHRvCi10aGVzZSBkZXZlbG9wZXJzOyBhbnlib2R5IHdpdGggdGhlIHJlcXVpc2l0ZSBza2lsbHMgY2FuIGltcHJvdmUgTGludXggYW5kCi1pbmZsdWVuY2UgdGhlIGRpcmVjdGlvbiBvZiBpdHMgZGV2ZWxvcG1lbnQuICBQcm9wcmlldGFyeSBwcm9kdWN0cyBjYW5ub3QKLW9mZmVyIHRoaXMga2luZCBvZiBvcGVubmVzcywgd2hpY2ggaXMgYSBjaGFyYWN0ZXJpc3RpYyBvZiB0aGUgZnJlZSBzb2Z0d2FyZQotcHJvY2Vzcy4gIEJ1dCwgaWYgYW55dGhpbmcsIHRoZSBrZXJuZWwgaXMgZXZlbiBtb3JlIG9wZW4gdGhhbiBtb3N0IG90aGVyCi1mcmVlIHNvZnR3YXJlIHByb2plY3RzLiAgQSB0eXBpY2FsIHRocmVlLW1vbnRoIGtlcm5lbCBkZXZlbG9wbWVudCBjeWNsZSBjYW4KLWludm9sdmUgb3ZlciAxMDAwIGRldmVsb3BlcnMgd29ya2luZyBmb3IgbW9yZSB0aGFuIDEwMCBkaWZmZXJlbnQgY29tcGFuaWVzCi0ob3IgZm9yIG5vIGNvbXBhbnkgYXQgYWxsKS4KLQotV29ya2luZyB3aXRoIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgY29tbXVuaXR5IGlzIG5vdCBlc3BlY2lhbGx5IGhhcmQuICBCdXQsCi10aGF0IG5vdHdpdGhzdGFuZGluZywgbWFueSBwb3RlbnRpYWwgY29udHJpYnV0b3JzIGhhdmUgZXhwZXJpZW5jZWQKLWRpZmZpY3VsdGllcyB3aGVuIHRyeWluZyB0byBkbyBrZXJuZWwgd29yay4gIFRoZSBrZXJuZWwgY29tbXVuaXR5IGhhcwotZXZvbHZlZCBpdHMgb3duIGRpc3RpbmN0IHdheXMgb2Ygb3BlcmF0aW5nIHdoaWNoIGFsbG93IGl0IHRvIGZ1bmN0aW9uCi1zbW9vdGhseSAoYW5kIHByb2R1Y2UgYSBoaWdoLXF1YWxpdHkgcHJvZHVjdCkgaW4gYW4gZW52aXJvbm1lbnQgd2hlcmUKLXRob3VzYW5kcyBvZiBsaW5lcyBvZiBjb2RlIGFyZSBiZWluZyBjaGFuZ2VkIGV2ZXJ5IGRheS4gIFNvIGl0IGlzIG5vdAotc3VycHJpc2luZyB0aGF0IExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudCBwcm9jZXNzIGRpZmZlcnMgZ3JlYXRseSBmcm9tCi1wcm9wcmlldGFyeSBkZXZlbG9wbWVudCBtZXRob2RzLgotCi1UaGUga2VybmVsJ3MgZGV2ZWxvcG1lbnQgcHJvY2VzcyBtYXkgY29tZSBhY3Jvc3MgYXMgc3RyYW5nZSBhbmQKLWludGltaWRhdGluZyB0byBuZXcgZGV2ZWxvcGVycywgYnV0IHRoZXJlIGFyZSBnb29kIHJlYXNvbnMgYW5kIHNvbGlkCi1leHBlcmllbmNlIGJlaGluZCBpdC4gIEEgZGV2ZWxvcGVyIHdobyBkb2VzIG5vdCB1bmRlcnN0YW5kIHRoZSBrZXJuZWwKLWNvbW11bml0eSdzIHdheXMgKG9yLCB3b3JzZSwgd2hvIHRyaWVzIHRvIGZsb3V0IG9yIGNpcmN1bXZlbnQgdGhlbSkgd2lsbAotaGF2ZSBhIGZydXN0cmF0aW5nIGV4cGVyaWVuY2UgaW4gc3RvcmUuICBUaGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5LCB3aGlsZQotYmVpbmcgaGVscGZ1bCB0byB0aG9zZSB3aG8gYXJlIHRyeWluZyB0byBsZWFybiwgaGFzIGxpdHRsZSB0aW1lIGZvciB0aG9zZQotd2hvIHdpbGwgbm90IGxpc3RlbiBvciB3aG8gZG8gbm90IGNhcmUgYWJvdXQgdGhlIGRldmVsb3BtZW50IHByb2Nlc3MuCi0KLUl0IGlzIGhvcGVkIHRoYXQgdGhvc2Ugd2hvIHJlYWQgdGhpcyBkb2N1bWVudCB3aWxsIGJlIGFibGUgdG8gYXZvaWQgdGhhdAotZnJ1c3RyYXRpbmcgZXhwZXJpZW5jZS4gIFRoZXJlIGlzIGEgbG90IG9mIG1hdGVyaWFsIGhlcmUsIGJ1dCB0aGUgZWZmb3J0Ci1pbnZvbHZlZCBpbiByZWFkaW5nIGl0IHdpbGwgYmUgcmVwYWlkIGluIHNob3J0IG9yZGVyLiAgVGhlIGRldmVsb3BtZW50Ci1jb21tdW5pdHkgaXMgYWx3YXlzIGluIG5lZWQgb2YgZGV2ZWxvcGVycyB3aG8gd2lsbCBoZWxwIHRvIG1ha2UgdGhlIGtlcm5lbAotYmV0dGVyOyB0aGUgZm9sbG93aW5nIHRleHQgc2hvdWxkIGhlbHAgeW91IC0gb3IgdGhvc2Ugd2hvIHdvcmsgZm9yIHlvdSAtCi1qb2luIG91ciBjb21tdW5pdHkuCi0KLQotMS4zOiBDUkVESVRTCi0KLVRoaXMgZG9jdW1lbnQgd2FzIHdyaXR0ZW4gYnkgSm9uYXRoYW4gQ29yYmV0LCBjb3JiZXRAbHduLm5ldC4gIEl0IGhhcyBiZWVuCi1pbXByb3ZlZCBieSBjb21tZW50cyBmcm9tIEpvaGFubmVzIEJlcmcsIEphbWVzIEJlcnJ5LCBBbGV4IENoaWFuZywgUm9sYW5kCi1EcmVpZXIsIFJhbmR5IER1bmxhcCwgSmFrZSBFZGdlLCBKaXJpIEtvc2luYSwgTWF0dCBNYWNrYWxsLCBBcnRodXIgTWFyc2gsCi1BbWFuZGEgTWNQaGVyc29uLCBBbmRyZXcgTW9ydG9uLCBBbmRyZXcgUHJpY2UsIFRzdWdpa2F6dSBTaGliYXRhLCBhbmQKLUpvY2hlbiBWb8OfLgotCi1UaGlzIHdvcmsgd2FzIHN1cHBvcnRlZCBieSB0aGUgTGludXggRm91bmRhdGlvbjsgdGhhbmtzIGVzcGVjaWFsbHkgdG8KLUFtYW5kYSBNY1BoZXJzb24sIHdobyBzYXcgdGhlIHZhbHVlIG9mIHRoaXMgZWZmb3J0IGFuZCBtYWRlIGl0IGFsbCBoYXBwZW4uCi0KLQotMS40OiBUSEUgSU1QT1JUQU5DRSBPRiBHRVRUSU5HIENPREUgSU5UTyBUSEUgTUFJTkxJTkUKLQotU29tZSBjb21wYW5pZXMgYW5kIGRldmVsb3BlcnMgb2NjYXNpb25hbGx5IHdvbmRlciB3aHkgdGhleSBzaG91bGQgYm90aGVyCi1sZWFybmluZyBob3cgdG8gd29yayB3aXRoIHRoZSBrZXJuZWwgY29tbXVuaXR5IGFuZCBnZXQgdGhlaXIgY29kZSBpbnRvIHRoZQotbWFpbmxpbmUga2VybmVsICh0aGUgIm1haW5saW5lIiBiZWluZyB0aGUga2VybmVsIG1haW50YWluZWQgYnkgTGludXMKLVRvcnZhbGRzIGFuZCB1c2VkIGFzIGEgYmFzZSBieSBMaW51eCBkaXN0cmlidXRvcnMpLiAgSW4gdGhlIHNob3J0IHRlcm0sCi1jb250cmlidXRpbmcgY29kZSBjYW4gbG9vayBsaWtlIGFuIGF2b2lkYWJsZSBleHBlbnNlOyBpdCBzZWVtcyBlYXNpZXIgdG8KLWp1c3Qga2VlcCB0aGUgY29kZSBzZXBhcmF0ZSBhbmQgc3VwcG9ydCB1c2VycyBkaXJlY3RseS4gIFRoZSB0cnV0aCBvZiB0aGUKLW1hdHRlciBpcyB0aGF0IGtlZXBpbmcgY29kZSBzZXBhcmF0ZSAoIm91dCBvZiB0cmVlIikgaXMgYSBmYWxzZSBlY29ub215LgotCi1BcyBhIHdheSBvZiBpbGx1c3RyYXRpbmcgdGhlIGNvc3RzIG9mIG91dC1vZi10cmVlIGNvZGUsIGhlcmUgYXJlIGEgZmV3Ci1yZWxldmFudCBhc3BlY3RzIG9mIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvY2VzczsgbW9zdCBvZiB0aGVzZSB3aWxsIGJlCi1kaXNjdXNzZWQgaW4gZ3JlYXRlciBkZXRhaWwgbGF0ZXIgaW4gdGhpcyBkb2N1bWVudC4gIENvbnNpZGVyOgotCi0tIENvZGUgd2hpY2ggaGFzIGJlZW4gbWVyZ2VkIGludG8gdGhlIG1haW5saW5lIGtlcm5lbCBpcyBhdmFpbGFibGUgdG8gYWxsCi0gIExpbnV4IHVzZXJzLiAgSXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHByZXNlbnQgb24gYWxsIGRpc3RyaWJ1dGlvbnMgd2hpY2gKLSAgZW5hYmxlIGl0LiAgVGhlcmUgaXMgbm8gbmVlZCBmb3IgZHJpdmVyIGRpc2tzLCBkb3dubG9hZHMsIG9yIHRoZSBoYXNzbGVzCi0gIG9mIHN1cHBvcnRpbmcgbXVsdGlwbGUgdmVyc2lvbnMgb2YgbXVsdGlwbGUgZGlzdHJpYnV0aW9uczsgaXQgYWxsIGp1c3QKLSAgd29ya3MsIGZvciB0aGUgZGV2ZWxvcGVyIGFuZCBmb3IgdGhlIHVzZXIuICBJbmNvcnBvcmF0aW9uIGludG8gdGhlCi0gIG1haW5saW5lIHNvbHZlcyBhIGxhcmdlIG51bWJlciBvZiBkaXN0cmlidXRpb24gYW5kIHN1cHBvcnQgcHJvYmxlbXMuCi0KLS0gV2hpbGUga2VybmVsIGRldmVsb3BlcnMgc3RyaXZlIHRvIG1haW50YWluIGEgc3RhYmxlIGludGVyZmFjZSB0byB1c2VyCi0gIHNwYWNlLCB0aGUgaW50ZXJuYWwga2VybmVsIEFQSSBpcyBpbiBjb25zdGFudCBmbHV4LiAgVGhlIGxhY2sgb2YgYSBzdGFibGUKLSAgaW50ZXJuYWwgaW50ZXJmYWNlIGlzIGEgZGVsaWJlcmF0ZSBkZXNpZ24gZGVjaXNpb247IGl0IGFsbG93cyBmdW5kYW1lbnRhbAotICBpbXByb3ZlbWVudHMgdG8gYmUgbWFkZSBhdCBhbnkgdGltZSBhbmQgcmVzdWx0cyBpbiBoaWdoZXItcXVhbGl0eSBjb2RlLgotICBCdXQgb25lIHJlc3VsdCBvZiB0aGF0IHBvbGljeSBpcyB0aGF0IGFueSBvdXQtb2YtdHJlZSBjb2RlIHJlcXVpcmVzCi0gIGNvbnN0YW50IHVwa2VlcCBpZiBpdCBpcyB0byB3b3JrIHdpdGggbmV3IGtlcm5lbHMuICBNYWludGFpbmluZwotICBvdXQtb2YtdHJlZSBjb2RlIHJlcXVpcmVzIHNpZ25pZmljYW50IGFtb3VudHMgb2Ygd29yayBqdXN0IHRvIGtlZXAgdGhhdAotICBjb2RlIHdvcmtpbmcuCi0KLSAgQ29kZSB3aGljaCBpcyBpbiB0aGUgbWFpbmxpbmUsIGluc3RlYWQsIGRvZXMgbm90IHJlcXVpcmUgdGhpcyB3b3JrIGFzIHRoZQotICByZXN1bHQgb2YgYSBzaW1wbGUgcnVsZSByZXF1aXJpbmcgYW55IGRldmVsb3BlciB3aG8gbWFrZXMgYW4gQVBJIGNoYW5nZQotICB0byBhbHNvIGZpeCBhbnkgY29kZSB0aGF0IGJyZWFrcyBhcyB0aGUgcmVzdWx0IG9mIHRoYXQgY2hhbmdlLiAgU28gY29kZQotICB3aGljaCBoYXMgYmVlbiBtZXJnZWQgaW50byB0aGUgbWFpbmxpbmUgaGFzIHNpZ25pZmljYW50bHkgbG93ZXIKLSAgbWFpbnRlbmFuY2UgY29zdHMuCi0KLS0gQmV5b25kIHRoYXQsIGNvZGUgd2hpY2ggaXMgaW4gdGhlIGtlcm5lbCB3aWxsIG9mdGVuIGJlIGltcHJvdmVkIGJ5IG90aGVyCi0gIGRldmVsb3BlcnMuICBTdXJwcmlzaW5nIHJlc3VsdHMgY2FuIGNvbWUgZnJvbSBlbXBvd2VyaW5nIHlvdXIgdXNlcgotICBjb21tdW5pdHkgYW5kIGN1c3RvbWVycyB0byBpbXByb3ZlIHlvdXIgcHJvZHVjdC4KLQotLSBLZXJuZWwgY29kZSBpcyBzdWJqZWN0ZWQgdG8gcmV2aWV3LCBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgbWVyZ2luZyBpbnRvCi0gIHRoZSBtYWlubGluZS4gIE5vIG1hdHRlciBob3cgc3Ryb25nIHRoZSBvcmlnaW5hbCBkZXZlbG9wZXIncyBza2lsbHMgYXJlLAotICB0aGlzIHJldmlldyBwcm9jZXNzIGludmFyaWFibHkgZmluZHMgd2F5cyBpbiB3aGljaCB0aGUgY29kZSBjYW4gYmUKLSAgaW1wcm92ZWQuICBPZnRlbiByZXZpZXcgZmluZHMgc2V2ZXJlIGJ1Z3MgYW5kIHNlY3VyaXR5IHByb2JsZW1zLiAgVGhpcyBpcwotICBlc3BlY2lhbGx5IHRydWUgZm9yIGNvZGUgd2hpY2ggaGFzIGJlZW4gZGV2ZWxvcGVkIGluIGEgY2xvc2VkCi0gIGVudmlyb25tZW50OyBzdWNoIGNvZGUgYmVuZWZpdHMgc3Ryb25nbHkgZnJvbSByZXZpZXcgYnkgb3V0c2lkZQotICBkZXZlbG9wZXJzLiAgT3V0LW9mLXRyZWUgY29kZSBpcyBsb3dlci1xdWFsaXR5IGNvZGUuCi0KLS0gUGFydGljaXBhdGlvbiBpbiB0aGUgZGV2ZWxvcG1lbnQgcHJvY2VzcyBpcyB5b3VyIHdheSB0byBpbmZsdWVuY2UgdGhlCi0gIGRpcmVjdGlvbiBvZiBrZXJuZWwgZGV2ZWxvcG1lbnQuICBVc2VycyB3aG8gY29tcGxhaW4gZnJvbSB0aGUgc2lkZWxpbmVzCi0gIGFyZSBoZWFyZCwgYnV0IGFjdGl2ZSBkZXZlbG9wZXJzIGhhdmUgYSBzdHJvbmdlciB2b2ljZSAtIGFuZCB0aGUgYWJpbGl0eQotICB0byBpbXBsZW1lbnQgY2hhbmdlcyB3aGljaCBtYWtlIHRoZSBrZXJuZWwgd29yayBiZXR0ZXIgZm9yIHRoZWlyIG5lZWRzLgotCi0tIFdoZW4gY29kZSBpcyBtYWludGFpbmVkIHNlcGFyYXRlbHksIHRoZSBwb3NzaWJpbGl0eSB0aGF0IGEgdGhpcmQgcGFydHkKLSAgd2lsbCBjb250cmlidXRlIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIG9mIGEgc2ltaWxhciBmZWF0dXJlIGFsd2F5cwotICBleGlzdHMuICBTaG91bGQgdGhhdCBoYXBwZW4sIGdldHRpbmcgeW91ciBjb2RlIG1lcmdlZCB3aWxsIGJlY29tZSBtdWNoCi0gIGhhcmRlciAtIHRvIHRoZSBwb2ludCBvZiBpbXBvc3NpYmlsaXR5LiAgVGhlbiB5b3Ugd2lsbCBiZSBmYWNlZCB3aXRoIHRoZQotICB1bnBsZWFzYW50IGFsdGVybmF0aXZlcyBvZiBlaXRoZXIgKDEpIG1haW50YWluaW5nIGEgbm9uc3RhbmRhcmQgZmVhdHVyZQotICBvdXQgb2YgdHJlZSBpbmRlZmluaXRlbHksIG9yICgyKSBhYmFuZG9uaW5nIHlvdXIgY29kZSBhbmQgbWlncmF0aW5nIHlvdXIKLSAgdXNlcnMgb3ZlciB0byB0aGUgaW4tdHJlZSB2ZXJzaW9uLgotCi0tIENvbnRyaWJ1dGlvbiBvZiBjb2RlIGlzIHRoZSBmdW5kYW1lbnRhbCBhY3Rpb24gd2hpY2ggbWFrZXMgdGhlIHdob2xlCi0gIHByb2Nlc3Mgd29yay4gIEJ5IGNvbnRyaWJ1dGluZyB5b3VyIGNvZGUgeW91IGNhbiBhZGQgbmV3IGZ1bmN0aW9uYWxpdHkgdG8KLSAgdGhlIGtlcm5lbCBhbmQgcHJvdmlkZSBjYXBhYmlsaXRpZXMgYW5kIGV4YW1wbGVzIHdoaWNoIGFyZSBvZiB1c2UgdG8KLSAgb3RoZXIga2VybmVsIGRldmVsb3BlcnMuICBJZiB5b3UgaGF2ZSBkZXZlbG9wZWQgY29kZSBmb3IgTGludXggKG9yIGFyZQotICB0aGlua2luZyBhYm91dCBkb2luZyBzbyksIHlvdSBjbGVhcmx5IGhhdmUgYW4gaW50ZXJlc3QgaW4gdGhlIGNvbnRpbnVlZAotICBzdWNjZXNzIG9mIHRoaXMgcGxhdGZvcm07IGNvbnRyaWJ1dGluZyBjb2RlIGlzIG9uZSBvZiB0aGUgYmVzdCB3YXlzIHRvCi0gIGhlbHAgZW5zdXJlIHRoYXQgc3VjY2Vzcy4KLQotQWxsIG9mIHRoZSByZWFzb25pbmcgYWJvdmUgYXBwbGllcyB0byBhbnkgb3V0LW9mLXRyZWUga2VybmVsIGNvZGUsCi1pbmNsdWRpbmcgY29kZSB3aGljaCBpcyBkaXN0cmlidXRlZCBpbiBwcm9wcmlldGFyeSwgYmluYXJ5LW9ubHkgZm9ybS4KLVRoZXJlIGFyZSwgaG93ZXZlciwgYWRkaXRpb25hbCBmYWN0b3JzIHdoaWNoIHNob3VsZCBiZSB0YWtlbiBpbnRvIGFjY291bnQKLWJlZm9yZSBjb25zaWRlcmluZyBhbnkgc29ydCBvZiBiaW5hcnktb25seSBrZXJuZWwgY29kZSBkaXN0cmlidXRpb24uICBUaGVzZQotaW5jbHVkZToKLQotLSBUaGUgbGVnYWwgaXNzdWVzIGFyb3VuZCB0aGUgZGlzdHJpYnV0aW9uIG9mIHByb3ByaWV0YXJ5IGtlcm5lbCBtb2R1bGVzCi0gIGFyZSBjbG91ZHkgYXQgYmVzdDsgcXVpdGUgYSBmZXcga2VybmVsIGNvcHlyaWdodCBob2xkZXJzIGJlbGlldmUgdGhhdAotICBtb3N0IGJpbmFyeS1vbmx5IG1vZHVsZXMgYXJlIGRlcml2ZWQgcHJvZHVjdHMgb2YgdGhlIGtlcm5lbCBhbmQgdGhhdCwgYXMKLSAgYSByZXN1bHQsIHRoZWlyIGRpc3RyaWJ1dGlvbiBpcyBhIHZpb2xhdGlvbiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gIGxpY2Vuc2UgKGFib3V0IHdoaWNoIG1vcmUgd2lsbCBiZSBzYWlkIGJlbG93KS4gIFlvdXIgYXV0aG9yIGlzIG5vdCBhCi0gIGxhd3llciwgYW5kIG5vdGhpbmcgaW4gdGhpcyBkb2N1bWVudCBjYW4gcG9zc2libHkgYmUgY29uc2lkZXJlZCB0byBiZQotICBsZWdhbCBhZHZpY2UuICBUaGUgdHJ1ZSBsZWdhbCBzdGF0dXMgb2YgY2xvc2VkLXNvdXJjZSBtb2R1bGVzIGNhbiBvbmx5IGJlCi0gIGRldGVybWluZWQgYnkgdGhlIGNvdXJ0cy4gIEJ1dCB0aGUgdW5jZXJ0YWludHkgd2hpY2ggaGF1bnRzIHRob3NlIG1vZHVsZXMKLSAgaXMgdGhlcmUgcmVnYXJkbGVzcy4KLQotLSBCaW5hcnkgbW9kdWxlcyBncmVhdGx5IGluY3JlYXNlIHRoZSBkaWZmaWN1bHR5IG9mIGRlYnVnZ2luZyBrZXJuZWwKLSAgcHJvYmxlbXMsIHRvIHRoZSBwb2ludCB0aGF0IG1vc3Qga2VybmVsIGRldmVsb3BlcnMgd2lsbCBub3QgZXZlbiB0cnkuICBTbwotICB0aGUgZGlzdHJpYnV0aW9uIG9mIGJpbmFyeS1vbmx5IG1vZHVsZXMgd2lsbCBtYWtlIGl0IGhhcmRlciBmb3IgeW91cgotICB1c2VycyB0byBnZXQgc3VwcG9ydCBmcm9tIHRoZSBjb21tdW5pdHkuCi0KLS0gU3VwcG9ydCBpcyBhbHNvIGhhcmRlciBmb3IgZGlzdHJpYnV0b3JzIG9mIGJpbmFyeS1vbmx5IG1vZHVsZXMsIHdobyBtdXN0Ci0gIHByb3ZpZGUgYSB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUgZm9yIGV2ZXJ5IGRpc3RyaWJ1dGlvbiBhbmQgZXZlcnkga2VybmVsCi0gIHZlcnNpb24gdGhleSB3aXNoIHRvIHN1cHBvcnQuICBEb3plbnMgb2YgYnVpbGRzIG9mIGEgc2luZ2xlIG1vZHVsZSBjYW4KLSAgYmUgcmVxdWlyZWQgdG8gcHJvdmlkZSByZWFzb25hYmx5IGNvbXByZWhlbnNpdmUgY292ZXJhZ2UsIGFuZCB5b3VyIHVzZXJzCi0gIHdpbGwgaGF2ZSB0byB1cGdyYWRlIHlvdXIgbW9kdWxlIHNlcGFyYXRlbHkgZXZlcnkgdGltZSB0aGV5IHVwZ3JhZGUgdGhlaXIKLSAga2VybmVsLgotCi0tIEV2ZXJ5dGhpbmcgdGhhdCB3YXMgc2FpZCBhYm92ZSBhYm91dCBjb2RlIHJldmlldyBhcHBsaWVzIGRvdWJseSB0bwotICBjbG9zZWQtc291cmNlIGNvZGUuICBTaW5jZSB0aGlzIGNvZGUgaXMgbm90IGF2YWlsYWJsZSBhdCBhbGwsIGl0IGNhbm5vdAotICBoYXZlIGJlZW4gcmV2aWV3ZWQgYnkgdGhlIGNvbW11bml0eSBhbmQgd2lsbCwgYmV5b25kIGRvdWJ0LCBoYXZlIHNlcmlvdXMKLSAgcHJvYmxlbXMuCi0KLU1ha2VycyBvZiBlbWJlZGRlZCBzeXN0ZW1zLCBpbiBwYXJ0aWN1bGFyLCBtYXkgYmUgdGVtcHRlZCB0byBkaXNyZWdhcmQgbXVjaAotb2Ygd2hhdCBoYXMgYmVlbiBzYWlkIGluIHRoaXMgc2VjdGlvbiBpbiB0aGUgYmVsaWVmIHRoYXQgdGhleSBhcmUgc2hpcHBpbmcKLWEgc2VsZi1jb250YWluZWQgcHJvZHVjdCB3aGljaCB1c2VzIGEgZnJvemVuIGtlcm5lbCB2ZXJzaW9uIGFuZCByZXF1aXJlcyBubwotbW9yZSBkZXZlbG9wbWVudCBhZnRlciBpdHMgcmVsZWFzZS4gIFRoaXMgYXJndW1lbnQgbWlzc2VzIHRoZSB2YWx1ZSBvZgotd2lkZXNwcmVhZCBjb2RlIHJldmlldyBhbmQgdGhlIHZhbHVlIG9mIGFsbG93aW5nIHlvdXIgdXNlcnMgdG8gYWRkCi1jYXBhYmlsaXRpZXMgdG8geW91ciBwcm9kdWN0LiAgQnV0IHRoZXNlIHByb2R1Y3RzLCB0b28sIGhhdmUgYSBsaW1pdGVkCi1jb21tZXJjaWFsIGxpZmUsIGFmdGVyIHdoaWNoIGEgbmV3IHZlcnNpb24gbXVzdCBiZSByZWxlYXNlZC4gIEF0IHRoYXQKLXBvaW50LCB2ZW5kb3JzIHdob3NlIGNvZGUgaXMgaW4gdGhlIG1haW5saW5lIGFuZCB3ZWxsIG1haW50YWluZWQgd2lsbCBiZQotbXVjaCBiZXR0ZXIgcG9zaXRpb25lZCB0byBnZXQgdGhlIG5ldyBwcm9kdWN0IHJlYWR5IGZvciBtYXJrZXQgcXVpY2tseS4KLQotCi0xLjU6IExJQ0VOU0lORwotCi1Db2RlIGlzIGNvbnRyaWJ1dGVkIHRvIHRoZSBMaW51eCBrZXJuZWwgdW5kZXIgYSBudW1iZXIgb2YgbGljZW5zZXMsIGJ1dCBhbGwKLWNvZGUgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotKEdQTHYyKSwgd2hpY2ggaXMgdGhlIGxpY2Vuc2UgY292ZXJpbmcgdGhlIGtlcm5lbCBkaXN0cmlidXRpb24gYXMgYSB3aG9sZS4KLUluIHByYWN0aWNlLCB0aGF0IG1lYW5zIHRoYXQgYWxsIGNvZGUgY29udHJpYnV0aW9ucyBhcmUgY292ZXJlZCBlaXRoZXIgYnkKLUdQTHYyICh3aXRoLCBvcHRpb25hbGx5LCBsYW5ndWFnZSBhbGxvd2luZyBkaXN0cmlidXRpb24gdW5kZXIgbGF0ZXIKLXZlcnNpb25zIG9mIHRoZSBHUEwpIG9yIHRoZSB0aHJlZS1jbGF1c2UgQlNEIGxpY2Vuc2UuICBBbnkgY29udHJpYnV0aW9ucwotd2hpY2ggYXJlIG5vdCBjb3ZlcmVkIGJ5IGEgY29tcGF0aWJsZSBsaWNlbnNlIHdpbGwgbm90IGJlIGFjY2VwdGVkIGludG8gdGhlCi1rZXJuZWwuCi0KLUNvcHlyaWdodCBhc3NpZ25tZW50cyBhcmUgbm90IHJlcXVpcmVkIChvciByZXF1ZXN0ZWQpIGZvciBjb2RlIGNvbnRyaWJ1dGVkCi10byB0aGUga2VybmVsLiAgQWxsIGNvZGUgbWVyZ2VkIGludG8gdGhlIG1haW5saW5lIGtlcm5lbCByZXRhaW5zIGl0cwotb3JpZ2luYWwgb3duZXJzaGlwOyBhcyBhIHJlc3VsdCwgdGhlIGtlcm5lbCBub3cgaGFzIHRob3VzYW5kcyBvZiBvd25lcnMuCi0KLU9uZSBpbXBsaWNhdGlvbiBvZiB0aGlzIG93bmVyc2hpcCBzdHJ1Y3R1cmUgaXMgdGhhdCBhbnkgYXR0ZW1wdCB0byBjaGFuZ2UKLXRoZSBsaWNlbnNpbmcgb2YgdGhlIGtlcm5lbCBpcyBkb29tZWQgdG8gYWxtb3N0IGNlcnRhaW4gZmFpbHVyZS4gIFRoZXJlIGFyZQotZmV3IHByYWN0aWNhbCBzY2VuYXJpb3Mgd2hlcmUgdGhlIGFncmVlbWVudCBvZiBhbGwgY29weXJpZ2h0IGhvbGRlcnMgY291bGQKLWJlIG9idGFpbmVkIChvciB0aGVpciBjb2RlIHJlbW92ZWQgZnJvbSB0aGUga2VybmVsKS4gIFNvLCBpbiBwYXJ0aWN1bGFyLAotdGhlcmUgaXMgbm8gcHJvc3BlY3Qgb2YgYSBtaWdyYXRpb24gdG8gdmVyc2lvbiAzIG9mIHRoZSBHUEwgaW4gdGhlCi1mb3Jlc2VlYWJsZSBmdXR1cmUuCi0KLUl0IGlzIGltcGVyYXRpdmUgdGhhdCBhbGwgY29kZSBjb250cmlidXRlZCB0byB0aGUga2VybmVsIGJlIGxlZ2l0aW1hdGVseQotZnJlZSBzb2Z0d2FyZS4gIEZvciB0aGF0IHJlYXNvbiwgY29kZSBmcm9tIGFub255bW91cyAob3IgcHNldWRvbnltb3VzKQotY29udHJpYnV0b3JzIHdpbGwgbm90IGJlIGFjY2VwdGVkLiAgQWxsIGNvbnRyaWJ1dG9ycyBhcmUgcmVxdWlyZWQgdG8gInNpZ24KLW9mZiIgb24gdGhlaXIgY29kZSwgc3RhdGluZyB0aGF0IHRoZSBjb2RlIGNhbiBiZSBkaXN0cmlidXRlZCB3aXRoIHRoZQota2VybmVsIHVuZGVyIHRoZSBHUEwuICBDb2RlIHdoaWNoIGhhcyBub3QgYmVlbiBsaWNlbnNlZCBhcyBmcmVlIHNvZnR3YXJlIGJ5Ci1pdHMgb3duZXIsIG9yIHdoaWNoIHJpc2tzIGNyZWF0aW5nIGNvcHlyaWdodC1yZWxhdGVkIHByb2JsZW1zIGZvciB0aGUKLWtlcm5lbCAoc3VjaCBhcyBjb2RlIHdoaWNoIGRlcml2ZXMgZnJvbSByZXZlcnNlLWVuZ2luZWVyaW5nIGVmZm9ydHMgbGFja2luZwotcHJvcGVyIHNhZmVndWFyZHMpIGNhbm5vdCBiZSBjb250cmlidXRlZC4KLQotUXVlc3Rpb25zIGFib3V0IGNvcHlyaWdodC1yZWxhdGVkIGlzc3VlcyBhcmUgY29tbW9uIG9uIExpbnV4IGRldmVsb3BtZW50Ci1tYWlsaW5nIGxpc3RzLiAgU3VjaCBxdWVzdGlvbnMgd2lsbCBub3JtYWxseSByZWNlaXZlIG5vIHNob3J0YWdlIG9mCi1hbnN3ZXJzLCBidXQgb25lIHNob3VsZCBiZWFyIGluIG1pbmQgdGhhdCB0aGUgcGVvcGxlIGFuc3dlcmluZyB0aG9zZQotcXVlc3Rpb25zIGFyZSBub3QgbGF3eWVycyBhbmQgY2Fubm90IHByb3ZpZGUgbGVnYWwgYWR2aWNlLiAgSWYgeW91IGhhdmUKLWxlZ2FsIHF1ZXN0aW9ucyByZWxhdGluZyB0byBMaW51eCBzb3VyY2UgY29kZSwgdGhlcmUgaXMgbm8gc3Vic3RpdHV0ZSBmb3IKLXRhbGtpbmcgd2l0aCBhIGxhd3llciB3aG8gdW5kZXJzdGFuZHMgdGhpcyBmaWVsZC4gIFJlbHlpbmcgb24gYW5zd2Vycwotb2J0YWluZWQgb24gdGVjaG5pY2FsIG1haWxpbmcgbGlzdHMgaXMgYSByaXNreSBhZmZhaXIuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvMS5JbnRyby5yc3QgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvMS5JbnRyby5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI2NDJiMwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy8xLkludHJvLnJzdApAQCAtMCwwICsxLDI2NiBAQAorSW50cm9kdXRpb24KKz09PT09PT09PT09CisKK0V4ZWN1dGl2ZSBzdW1tYXJ5CistLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgcmVzdCBvZiB0aGlzIHNlY3Rpb24gY292ZXJzIHRoZSBzY29wZSBvZiB0aGUga2VybmVsIGRldmVsb3BtZW50IHByb2Nlc3MKK2FuZCB0aGUga2luZHMgb2YgZnJ1c3RyYXRpb25zIHRoYXQgZGV2ZWxvcGVycyBhbmQgdGhlaXIgZW1wbG95ZXJzIGNhbgorZW5jb3VudGVyIHRoZXJlLiAgVGhlcmUgYXJlIGEgZ3JlYXQgbWFueSByZWFzb25zIHdoeSBrZXJuZWwgY29kZSBzaG91bGQgYmUKK21lcmdlZCBpbnRvIHRoZSBvZmZpY2lhbCAoIm1haW5saW5lIikga2VybmVsLCBpbmNsdWRpbmcgYXV0b21hdGljCithdmFpbGFiaWxpdHkgdG8gdXNlcnMsIGNvbW11bml0eSBzdXBwb3J0IGluIG1hbnkgZm9ybXMsIGFuZCB0aGUgYWJpbGl0eSB0bworaW5mbHVlbmNlIHRoZSBkaXJlY3Rpb24gb2Yga2VybmVsIGRldmVsb3BtZW50LiAgQ29kZSBjb250cmlidXRlZCB0byB0aGUKK0xpbnV4IGtlcm5lbCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGEgR1BMLWNvbXBhdGlibGUgbGljZW5zZS4KKworOnJlZjpgZGV2ZWxvcG1lbnRfcHJvY2Vzc2AgaW50cm9kdWNlcyB0aGUgZGV2ZWxvcG1lbnQgcHJvY2VzcywgdGhlIGtlcm5lbAorcmVsZWFzZSBjeWNsZSwgYW5kIHRoZSBtZWNoYW5pY3Mgb2YgdGhlIG1lcmdlIHdpbmRvdy4gIFRoZSB2YXJpb3VzIHBoYXNlcyBpbgordGhlIHBhdGNoIGRldmVsb3BtZW50LCByZXZpZXcsIGFuZCBtZXJnaW5nIGN5Y2xlIGFyZSBjb3ZlcmVkLiAgVGhlcmUgaXMgc29tZQorZGlzY3Vzc2lvbiBvZiB0b29scyBhbmQgbWFpbGluZyBsaXN0cy4gIERldmVsb3BlcnMgd2FudGluZyB0byBnZXQgc3RhcnRlZAord2l0aCBrZXJuZWwgZGV2ZWxvcG1lbnQgYXJlIGVuY291cmFnZWQgdG8gdHJhY2sgZG93biBhbmQgZml4IGJ1Z3MgYXMgYW4KK2luaXRpYWwgZXhlcmNpc2UuCisKKzpyZWY6YGRldmVsb3BtZW50X2Vhcmx5X3N0YWdlYCBjb3ZlcnMgZWFybHktc3RhZ2UgcHJvamVjdCBwbGFubmluZywgd2l0aCBhbgorZW1waGFzaXMgb24gaW52b2x2aW5nIHRoZSBkZXZlbG9wbWVudCBjb21tdW5pdHkgYXMgc29vbiBhcyBwb3NzaWJsZS4KKworOnJlZjpgZGV2ZWxvcG1lbnRfY29kaW5nYCBpcyBhYm91dCB0aGUgY29kaW5nIHByb2Nlc3M7IHNldmVyYWwgcGl0ZmFsbHMgd2hpY2gKK2hhdmUgYmVlbiBlbmNvdW50ZXJlZCBieSBvdGhlciBkZXZlbG9wZXJzIGFyZSBkaXNjdXNzZWQuICBTb21lIHJlcXVpcmVtZW50cyBmb3IKK3BhdGNoZXMgYXJlIGNvdmVyZWQsIGFuZCB0aGVyZSBpcyBhbiBpbnRyb2R1Y3Rpb24gdG8gc29tZSBvZiB0aGUgdG9vbHMKK3doaWNoIGNhbiBoZWxwIHRvIGVuc3VyZSB0aGF0IGtlcm5lbCBwYXRjaGVzIGFyZSBjb3JyZWN0LgorCis6cmVmOmBkZXZlbG9wbWVudF9wb3N0aW5nYCB0YWxrcyBhYm91dCB0aGUgcHJvY2VzcyBvZiBwb3N0aW5nIHBhdGNoZXMgZm9yCityZXZpZXcuIFRvIGJlIHRha2VuIHNlcmlvdXNseSBieSB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5LCBwYXRjaGVzIG11c3QgYmUKK3Byb3Blcmx5IGZvcm1hdHRlZCBhbmQgZGVzY3JpYmVkLCBhbmQgdGhleSBtdXN0IGJlIHNlbnQgdG8gdGhlIHJpZ2h0IHBsYWNlLgorRm9sbG93aW5nIHRoZSBhZHZpY2UgaW4gdGhpcyBzZWN0aW9uIHNob3VsZCBoZWxwIHRvIGVuc3VyZSB0aGUgYmVzdAorcG9zc2libGUgcmVjZXB0aW9uIGZvciB5b3VyIHdvcmsuCisKKzpyZWY6YGRldmVsb3BtZW50X2ZvbGxvd3Rocm91Z2hgIGNvdmVycyB3aGF0IGhhcHBlbnMgYWZ0ZXIgcG9zdGluZyBwYXRjaGVzOyB0aGUKK2pvYiBpcyBmYXIgZnJvbSBkb25lIGF0IHRoYXQgcG9pbnQuICBXb3JraW5nIHdpdGggcmV2aWV3ZXJzIGlzIGEgY3J1Y2lhbCBwYXJ0CitvZiB0aGUgZGV2ZWxvcG1lbnQgcHJvY2VzczsgdGhpcyBzZWN0aW9uIG9mZmVycyBhIG51bWJlciBvZiB0aXBzIG9uIGhvdyB0bworYXZvaWQgcHJvYmxlbXMgYXQgdGhpcyBpbXBvcnRhbnQgc3RhZ2UuICBEZXZlbG9wZXJzIGFyZSBjYXV0aW9uZWQgYWdhaW5zdAorYXNzdW1pbmcgdGhhdCB0aGUgam9iIGlzIGRvbmUgd2hlbiBhIHBhdGNoIGlzIG1lcmdlZCBpbnRvIHRoZSBtYWlubGluZS4KKworOnJlZjpgZGV2ZWxvcG1lbnRfYWR2YW5jZWR0b3BpY3NgIGludHJvZHVjZXMgYSBjb3VwbGUgb2YgImFkdmFuY2VkIiB0b3BpY3M6CittYW5hZ2luZyBwYXRjaGVzIHdpdGggZ2l0IGFuZCByZXZpZXdpbmcgcGF0Y2hlcyBwb3N0ZWQgYnkgb3RoZXJzLgorCis6cmVmOmBkZXZlbG9wbWVudF9jb25jbHVzaW9uYCBjb25jbHVkZXMgdGhlIGRvY3VtZW50IHdpdGggcG9pbnRlcnMgdG8gc291cmNlcworZm9yIG1vcmUgaW5mb3JtYXRpb24gb24ga2VybmVsIGRldmVsb3BtZW50LgorCitXaGF0IHRoaXMgZG9jdW1lbnQgaXMgYWJvdXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgTGludXgga2VybmVsLCBhdCBvdmVyIDggbWlsbGlvbiBsaW5lcyBvZiBjb2RlIGFuZCB3ZWxsIG92ZXIgMTAwMAorY29udHJpYnV0b3JzIHRvIGVhY2ggcmVsZWFzZSwgaXMgb25lIG9mIHRoZSBsYXJnZXN0IGFuZCBtb3N0IGFjdGl2ZSBmcmVlCitzb2Z0d2FyZSBwcm9qZWN0cyBpbiBleGlzdGVuY2UuICBTaW5jZSBpdHMgaHVtYmxlIGJlZ2lubmluZyBpbiAxOTkxLCB0aGlzCitrZXJuZWwgaGFzIGV2b2x2ZWQgaW50byBhIGJlc3Qtb2YtYnJlZWQgb3BlcmF0aW5nIHN5c3RlbSBjb21wb25lbnQgd2hpY2gKK3J1bnMgb24gcG9ja2V0LXNpemVkIGRpZ2l0YWwgbXVzaWMgcGxheWVycywgZGVza3RvcCBQQ3MsIHRoZSBsYXJnZXN0CitzdXBlcmNvbXB1dGVycyBpbiBleGlzdGVuY2UsIGFuZCBhbGwgdHlwZXMgb2Ygc3lzdGVtcyBpbiBiZXR3ZWVuLiAgSXQgaXMgYQorcm9idXN0LCBlZmZpY2llbnQsIGFuZCBzY2FsYWJsZSBzb2x1dGlvbiBmb3IgYWxtb3N0IGFueSBzaXR1YXRpb24uCisKK1dpdGggdGhlIGdyb3d0aCBvZiBMaW51eCBoYXMgY29tZSBhbiBpbmNyZWFzZSBpbiB0aGUgbnVtYmVyIG9mIGRldmVsb3BlcnMKKyhhbmQgY29tcGFuaWVzKSB3aXNoaW5nIHRvIHBhcnRpY2lwYXRlIGluIGl0cyBkZXZlbG9wbWVudC4gIEhhcmR3YXJlCit2ZW5kb3JzIHdhbnQgdG8gZW5zdXJlIHRoYXQgTGludXggc3VwcG9ydHMgdGhlaXIgcHJvZHVjdHMgd2VsbCwgbWFraW5nCit0aG9zZSBwcm9kdWN0cyBhdHRyYWN0aXZlIHRvIExpbnV4IHVzZXJzLiAgRW1iZWRkZWQgc3lzdGVtcyB2ZW5kb3JzLCB3aG8KK3VzZSBMaW51eCBhcyBhIGNvbXBvbmVudCBpbiBhbiBpbnRlZ3JhdGVkIHByb2R1Y3QsIHdhbnQgTGludXggdG8gYmUgYXMKK2NhcGFibGUgYW5kIHdlbGwtc3VpdGVkIHRvIHRoZSB0YXNrIGF0IGhhbmQgYXMgcG9zc2libGUuICBEaXN0cmlidXRvcnMgYW5kCitvdGhlciBzb2Z0d2FyZSB2ZW5kb3JzIHdobyBiYXNlIHRoZWlyIHByb2R1Y3RzIG9uIExpbnV4IGhhdmUgYSBjbGVhcgoraW50ZXJlc3QgaW4gdGhlIGNhcGFiaWxpdGllcywgcGVyZm9ybWFuY2UsIGFuZCByZWxpYWJpbGl0eSBvZiB0aGUgTGludXgKK2tlcm5lbC4gIEFuZCBlbmQgdXNlcnMsIHRvbywgd2lsbCBvZnRlbiB3aXNoIHRvIGNoYW5nZSBMaW51eCB0byBtYWtlIGl0CitiZXR0ZXIgc3VpdCB0aGVpciBuZWVkcy4KKworT25lIG9mIHRoZSBtb3N0IGNvbXBlbGxpbmcgZmVhdHVyZXMgb2YgTGludXggaXMgdGhhdCBpdCBpcyBhY2Nlc3NpYmxlIHRvCit0aGVzZSBkZXZlbG9wZXJzOyBhbnlib2R5IHdpdGggdGhlIHJlcXVpc2l0ZSBza2lsbHMgY2FuIGltcHJvdmUgTGludXggYW5kCitpbmZsdWVuY2UgdGhlIGRpcmVjdGlvbiBvZiBpdHMgZGV2ZWxvcG1lbnQuICBQcm9wcmlldGFyeSBwcm9kdWN0cyBjYW5ub3QKK29mZmVyIHRoaXMga2luZCBvZiBvcGVubmVzcywgd2hpY2ggaXMgYSBjaGFyYWN0ZXJpc3RpYyBvZiB0aGUgZnJlZSBzb2Z0d2FyZQorcHJvY2Vzcy4gIEJ1dCwgaWYgYW55dGhpbmcsIHRoZSBrZXJuZWwgaXMgZXZlbiBtb3JlIG9wZW4gdGhhbiBtb3N0IG90aGVyCitmcmVlIHNvZnR3YXJlIHByb2plY3RzLiAgQSB0eXBpY2FsIHRocmVlLW1vbnRoIGtlcm5lbCBkZXZlbG9wbWVudCBjeWNsZSBjYW4KK2ludm9sdmUgb3ZlciAxMDAwIGRldmVsb3BlcnMgd29ya2luZyBmb3IgbW9yZSB0aGFuIDEwMCBkaWZmZXJlbnQgY29tcGFuaWVzCisob3IgZm9yIG5vIGNvbXBhbnkgYXQgYWxsKS4KKworV29ya2luZyB3aXRoIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgY29tbXVuaXR5IGlzIG5vdCBlc3BlY2lhbGx5IGhhcmQuICBCdXQsCit0aGF0IG5vdHdpdGhzdGFuZGluZywgbWFueSBwb3RlbnRpYWwgY29udHJpYnV0b3JzIGhhdmUgZXhwZXJpZW5jZWQKK2RpZmZpY3VsdGllcyB3aGVuIHRyeWluZyB0byBkbyBrZXJuZWwgd29yay4gIFRoZSBrZXJuZWwgY29tbXVuaXR5IGhhcworZXZvbHZlZCBpdHMgb3duIGRpc3RpbmN0IHdheXMgb2Ygb3BlcmF0aW5nIHdoaWNoIGFsbG93IGl0IHRvIGZ1bmN0aW9uCitzbW9vdGhseSAoYW5kIHByb2R1Y2UgYSBoaWdoLXF1YWxpdHkgcHJvZHVjdCkgaW4gYW4gZW52aXJvbm1lbnQgd2hlcmUKK3Rob3VzYW5kcyBvZiBsaW5lcyBvZiBjb2RlIGFyZSBiZWluZyBjaGFuZ2VkIGV2ZXJ5IGRheS4gIFNvIGl0IGlzIG5vdAorc3VycHJpc2luZyB0aGF0IExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudCBwcm9jZXNzIGRpZmZlcnMgZ3JlYXRseSBmcm9tCitwcm9wcmlldGFyeSBkZXZlbG9wbWVudCBtZXRob2RzLgorCitUaGUga2VybmVsJ3MgZGV2ZWxvcG1lbnQgcHJvY2VzcyBtYXkgY29tZSBhY3Jvc3MgYXMgc3RyYW5nZSBhbmQKK2ludGltaWRhdGluZyB0byBuZXcgZGV2ZWxvcGVycywgYnV0IHRoZXJlIGFyZSBnb29kIHJlYXNvbnMgYW5kIHNvbGlkCitleHBlcmllbmNlIGJlaGluZCBpdC4gIEEgZGV2ZWxvcGVyIHdobyBkb2VzIG5vdCB1bmRlcnN0YW5kIHRoZSBrZXJuZWwKK2NvbW11bml0eSdzIHdheXMgKG9yLCB3b3JzZSwgd2hvIHRyaWVzIHRvIGZsb3V0IG9yIGNpcmN1bXZlbnQgdGhlbSkgd2lsbAoraGF2ZSBhIGZydXN0cmF0aW5nIGV4cGVyaWVuY2UgaW4gc3RvcmUuICBUaGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5LCB3aGlsZQorYmVpbmcgaGVscGZ1bCB0byB0aG9zZSB3aG8gYXJlIHRyeWluZyB0byBsZWFybiwgaGFzIGxpdHRsZSB0aW1lIGZvciB0aG9zZQord2hvIHdpbGwgbm90IGxpc3RlbiBvciB3aG8gZG8gbm90IGNhcmUgYWJvdXQgdGhlIGRldmVsb3BtZW50IHByb2Nlc3MuCisKK0l0IGlzIGhvcGVkIHRoYXQgdGhvc2Ugd2hvIHJlYWQgdGhpcyBkb2N1bWVudCB3aWxsIGJlIGFibGUgdG8gYXZvaWQgdGhhdAorZnJ1c3RyYXRpbmcgZXhwZXJpZW5jZS4gIFRoZXJlIGlzIGEgbG90IG9mIG1hdGVyaWFsIGhlcmUsIGJ1dCB0aGUgZWZmb3J0CitpbnZvbHZlZCBpbiByZWFkaW5nIGl0IHdpbGwgYmUgcmVwYWlkIGluIHNob3J0IG9yZGVyLiAgVGhlIGRldmVsb3BtZW50Citjb21tdW5pdHkgaXMgYWx3YXlzIGluIG5lZWQgb2YgZGV2ZWxvcGVycyB3aG8gd2lsbCBoZWxwIHRvIG1ha2UgdGhlIGtlcm5lbAorYmV0dGVyOyB0aGUgZm9sbG93aW5nIHRleHQgc2hvdWxkIGhlbHAgeW91IC0gb3IgdGhvc2Ugd2hvIHdvcmsgZm9yIHlvdSAtCitqb2luIG91ciBjb21tdW5pdHkuCisKK0NyZWRpdHMKKy0tLS0tLS0KKworVGhpcyBkb2N1bWVudCB3YXMgd3JpdHRlbiBieSBKb25hdGhhbiBDb3JiZXQsIGNvcmJldEBsd24ubmV0LiAgSXQgaGFzIGJlZW4KK2ltcHJvdmVkIGJ5IGNvbW1lbnRzIGZyb20gSm9oYW5uZXMgQmVyZywgSmFtZXMgQmVycnksIEFsZXggQ2hpYW5nLCBSb2xhbmQKK0RyZWllciwgUmFuZHkgRHVubGFwLCBKYWtlIEVkZ2UsIEppcmkgS29zaW5hLCBNYXR0IE1hY2thbGwsIEFydGh1ciBNYXJzaCwKK0FtYW5kYSBNY1BoZXJzb24sIEFuZHJldyBNb3J0b24sIEFuZHJldyBQcmljZSwgVHN1Z2lrYXp1IFNoaWJhdGEsIGFuZAorSm9jaGVuIFZvw58uCisKK1RoaXMgd29yayB3YXMgc3VwcG9ydGVkIGJ5IHRoZSBMaW51eCBGb3VuZGF0aW9uOyB0aGFua3MgZXNwZWNpYWxseSB0bworQW1hbmRhIE1jUGhlcnNvbiwgd2hvIHNhdyB0aGUgdmFsdWUgb2YgdGhpcyBlZmZvcnQgYW5kIG1hZGUgaXQgYWxsIGhhcHBlbi4KKworVGhlIGltcG9ydGFuY2Ugb2YgZ2V0dGluZyBjb2RlIGludG8gdGhlIG1haW5saW5lCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU29tZSBjb21wYW5pZXMgYW5kIGRldmVsb3BlcnMgb2NjYXNpb25hbGx5IHdvbmRlciB3aHkgdGhleSBzaG91bGQgYm90aGVyCitsZWFybmluZyBob3cgdG8gd29yayB3aXRoIHRoZSBrZXJuZWwgY29tbXVuaXR5IGFuZCBnZXQgdGhlaXIgY29kZSBpbnRvIHRoZQorbWFpbmxpbmUga2VybmVsICh0aGUgIm1haW5saW5lIiBiZWluZyB0aGUga2VybmVsIG1haW50YWluZWQgYnkgTGludXMKK1RvcnZhbGRzIGFuZCB1c2VkIGFzIGEgYmFzZSBieSBMaW51eCBkaXN0cmlidXRvcnMpLiAgSW4gdGhlIHNob3J0IHRlcm0sCitjb250cmlidXRpbmcgY29kZSBjYW4gbG9vayBsaWtlIGFuIGF2b2lkYWJsZSBleHBlbnNlOyBpdCBzZWVtcyBlYXNpZXIgdG8KK2p1c3Qga2VlcCB0aGUgY29kZSBzZXBhcmF0ZSBhbmQgc3VwcG9ydCB1c2VycyBkaXJlY3RseS4gIFRoZSB0cnV0aCBvZiB0aGUKK21hdHRlciBpcyB0aGF0IGtlZXBpbmcgY29kZSBzZXBhcmF0ZSAoIm91dCBvZiB0cmVlIikgaXMgYSBmYWxzZSBlY29ub215LgorCitBcyBhIHdheSBvZiBpbGx1c3RyYXRpbmcgdGhlIGNvc3RzIG9mIG91dC1vZi10cmVlIGNvZGUsIGhlcmUgYXJlIGEgZmV3CityZWxldmFudCBhc3BlY3RzIG9mIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvY2VzczsgbW9zdCBvZiB0aGVzZSB3aWxsIGJlCitkaXNjdXNzZWQgaW4gZ3JlYXRlciBkZXRhaWwgbGF0ZXIgaW4gdGhpcyBkb2N1bWVudC4gIENvbnNpZGVyOgorCistIENvZGUgd2hpY2ggaGFzIGJlZW4gbWVyZ2VkIGludG8gdGhlIG1haW5saW5lIGtlcm5lbCBpcyBhdmFpbGFibGUgdG8gYWxsCisgIExpbnV4IHVzZXJzLiAgSXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHByZXNlbnQgb24gYWxsIGRpc3RyaWJ1dGlvbnMgd2hpY2gKKyAgZW5hYmxlIGl0LiAgVGhlcmUgaXMgbm8gbmVlZCBmb3IgZHJpdmVyIGRpc2tzLCBkb3dubG9hZHMsIG9yIHRoZSBoYXNzbGVzCisgIG9mIHN1cHBvcnRpbmcgbXVsdGlwbGUgdmVyc2lvbnMgb2YgbXVsdGlwbGUgZGlzdHJpYnV0aW9uczsgaXQgYWxsIGp1c3QKKyAgd29ya3MsIGZvciB0aGUgZGV2ZWxvcGVyIGFuZCBmb3IgdGhlIHVzZXIuICBJbmNvcnBvcmF0aW9uIGludG8gdGhlCisgIG1haW5saW5lIHNvbHZlcyBhIGxhcmdlIG51bWJlciBvZiBkaXN0cmlidXRpb24gYW5kIHN1cHBvcnQgcHJvYmxlbXMuCisKKy0gV2hpbGUga2VybmVsIGRldmVsb3BlcnMgc3RyaXZlIHRvIG1haW50YWluIGEgc3RhYmxlIGludGVyZmFjZSB0byB1c2VyCisgIHNwYWNlLCB0aGUgaW50ZXJuYWwga2VybmVsIEFQSSBpcyBpbiBjb25zdGFudCBmbHV4LiAgVGhlIGxhY2sgb2YgYSBzdGFibGUKKyAgaW50ZXJuYWwgaW50ZXJmYWNlIGlzIGEgZGVsaWJlcmF0ZSBkZXNpZ24gZGVjaXNpb247IGl0IGFsbG93cyBmdW5kYW1lbnRhbAorICBpbXByb3ZlbWVudHMgdG8gYmUgbWFkZSBhdCBhbnkgdGltZSBhbmQgcmVzdWx0cyBpbiBoaWdoZXItcXVhbGl0eSBjb2RlLgorICBCdXQgb25lIHJlc3VsdCBvZiB0aGF0IHBvbGljeSBpcyB0aGF0IGFueSBvdXQtb2YtdHJlZSBjb2RlIHJlcXVpcmVzCisgIGNvbnN0YW50IHVwa2VlcCBpZiBpdCBpcyB0byB3b3JrIHdpdGggbmV3IGtlcm5lbHMuICBNYWludGFpbmluZworICBvdXQtb2YtdHJlZSBjb2RlIHJlcXVpcmVzIHNpZ25pZmljYW50IGFtb3VudHMgb2Ygd29yayBqdXN0IHRvIGtlZXAgdGhhdAorICBjb2RlIHdvcmtpbmcuCisKKyAgQ29kZSB3aGljaCBpcyBpbiB0aGUgbWFpbmxpbmUsIGluc3RlYWQsIGRvZXMgbm90IHJlcXVpcmUgdGhpcyB3b3JrIGFzIHRoZQorICByZXN1bHQgb2YgYSBzaW1wbGUgcnVsZSByZXF1aXJpbmcgYW55IGRldmVsb3BlciB3aG8gbWFrZXMgYW4gQVBJIGNoYW5nZQorICB0byBhbHNvIGZpeCBhbnkgY29kZSB0aGF0IGJyZWFrcyBhcyB0aGUgcmVzdWx0IG9mIHRoYXQgY2hhbmdlLiAgU28gY29kZQorICB3aGljaCBoYXMgYmVlbiBtZXJnZWQgaW50byB0aGUgbWFpbmxpbmUgaGFzIHNpZ25pZmljYW50bHkgbG93ZXIKKyAgbWFpbnRlbmFuY2UgY29zdHMuCisKKy0gQmV5b25kIHRoYXQsIGNvZGUgd2hpY2ggaXMgaW4gdGhlIGtlcm5lbCB3aWxsIG9mdGVuIGJlIGltcHJvdmVkIGJ5IG90aGVyCisgIGRldmVsb3BlcnMuICBTdXJwcmlzaW5nIHJlc3VsdHMgY2FuIGNvbWUgZnJvbSBlbXBvd2VyaW5nIHlvdXIgdXNlcgorICBjb21tdW5pdHkgYW5kIGN1c3RvbWVycyB0byBpbXByb3ZlIHlvdXIgcHJvZHVjdC4KKworLSBLZXJuZWwgY29kZSBpcyBzdWJqZWN0ZWQgdG8gcmV2aWV3LCBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgbWVyZ2luZyBpbnRvCisgIHRoZSBtYWlubGluZS4gIE5vIG1hdHRlciBob3cgc3Ryb25nIHRoZSBvcmlnaW5hbCBkZXZlbG9wZXIncyBza2lsbHMgYXJlLAorICB0aGlzIHJldmlldyBwcm9jZXNzIGludmFyaWFibHkgZmluZHMgd2F5cyBpbiB3aGljaCB0aGUgY29kZSBjYW4gYmUKKyAgaW1wcm92ZWQuICBPZnRlbiByZXZpZXcgZmluZHMgc2V2ZXJlIGJ1Z3MgYW5kIHNlY3VyaXR5IHByb2JsZW1zLiAgVGhpcyBpcworICBlc3BlY2lhbGx5IHRydWUgZm9yIGNvZGUgd2hpY2ggaGFzIGJlZW4gZGV2ZWxvcGVkIGluIGEgY2xvc2VkCisgIGVudmlyb25tZW50OyBzdWNoIGNvZGUgYmVuZWZpdHMgc3Ryb25nbHkgZnJvbSByZXZpZXcgYnkgb3V0c2lkZQorICBkZXZlbG9wZXJzLiAgT3V0LW9mLXRyZWUgY29kZSBpcyBsb3dlci1xdWFsaXR5IGNvZGUuCisKKy0gUGFydGljaXBhdGlvbiBpbiB0aGUgZGV2ZWxvcG1lbnQgcHJvY2VzcyBpcyB5b3VyIHdheSB0byBpbmZsdWVuY2UgdGhlCisgIGRpcmVjdGlvbiBvZiBrZXJuZWwgZGV2ZWxvcG1lbnQuICBVc2VycyB3aG8gY29tcGxhaW4gZnJvbSB0aGUgc2lkZWxpbmVzCisgIGFyZSBoZWFyZCwgYnV0IGFjdGl2ZSBkZXZlbG9wZXJzIGhhdmUgYSBzdHJvbmdlciB2b2ljZSAtIGFuZCB0aGUgYWJpbGl0eQorICB0byBpbXBsZW1lbnQgY2hhbmdlcyB3aGljaCBtYWtlIHRoZSBrZXJuZWwgd29yayBiZXR0ZXIgZm9yIHRoZWlyIG5lZWRzLgorCistIFdoZW4gY29kZSBpcyBtYWludGFpbmVkIHNlcGFyYXRlbHksIHRoZSBwb3NzaWJpbGl0eSB0aGF0IGEgdGhpcmQgcGFydHkKKyAgd2lsbCBjb250cmlidXRlIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIG9mIGEgc2ltaWxhciBmZWF0dXJlIGFsd2F5cworICBleGlzdHMuICBTaG91bGQgdGhhdCBoYXBwZW4sIGdldHRpbmcgeW91ciBjb2RlIG1lcmdlZCB3aWxsIGJlY29tZSBtdWNoCisgIGhhcmRlciAtIHRvIHRoZSBwb2ludCBvZiBpbXBvc3NpYmlsaXR5LiAgVGhlbiB5b3Ugd2lsbCBiZSBmYWNlZCB3aXRoIHRoZQorICB1bnBsZWFzYW50IGFsdGVybmF0aXZlcyBvZiBlaXRoZXIgKDEpIG1haW50YWluaW5nIGEgbm9uc3RhbmRhcmQgZmVhdHVyZQorICBvdXQgb2YgdHJlZSBpbmRlZmluaXRlbHksIG9yICgyKSBhYmFuZG9uaW5nIHlvdXIgY29kZSBhbmQgbWlncmF0aW5nIHlvdXIKKyAgdXNlcnMgb3ZlciB0byB0aGUgaW4tdHJlZSB2ZXJzaW9uLgorCistIENvbnRyaWJ1dGlvbiBvZiBjb2RlIGlzIHRoZSBmdW5kYW1lbnRhbCBhY3Rpb24gd2hpY2ggbWFrZXMgdGhlIHdob2xlCisgIHByb2Nlc3Mgd29yay4gIEJ5IGNvbnRyaWJ1dGluZyB5b3VyIGNvZGUgeW91IGNhbiBhZGQgbmV3IGZ1bmN0aW9uYWxpdHkgdG8KKyAgdGhlIGtlcm5lbCBhbmQgcHJvdmlkZSBjYXBhYmlsaXRpZXMgYW5kIGV4YW1wbGVzIHdoaWNoIGFyZSBvZiB1c2UgdG8KKyAgb3RoZXIga2VybmVsIGRldmVsb3BlcnMuICBJZiB5b3UgaGF2ZSBkZXZlbG9wZWQgY29kZSBmb3IgTGludXggKG9yIGFyZQorICB0aGlua2luZyBhYm91dCBkb2luZyBzbyksIHlvdSBjbGVhcmx5IGhhdmUgYW4gaW50ZXJlc3QgaW4gdGhlIGNvbnRpbnVlZAorICBzdWNjZXNzIG9mIHRoaXMgcGxhdGZvcm07IGNvbnRyaWJ1dGluZyBjb2RlIGlzIG9uZSBvZiB0aGUgYmVzdCB3YXlzIHRvCisgIGhlbHAgZW5zdXJlIHRoYXQgc3VjY2Vzcy4KKworQWxsIG9mIHRoZSByZWFzb25pbmcgYWJvdmUgYXBwbGllcyB0byBhbnkgb3V0LW9mLXRyZWUga2VybmVsIGNvZGUsCitpbmNsdWRpbmcgY29kZSB3aGljaCBpcyBkaXN0cmlidXRlZCBpbiBwcm9wcmlldGFyeSwgYmluYXJ5LW9ubHkgZm9ybS4KK1RoZXJlIGFyZSwgaG93ZXZlciwgYWRkaXRpb25hbCBmYWN0b3JzIHdoaWNoIHNob3VsZCBiZSB0YWtlbiBpbnRvIGFjY291bnQKK2JlZm9yZSBjb25zaWRlcmluZyBhbnkgc29ydCBvZiBiaW5hcnktb25seSBrZXJuZWwgY29kZSBkaXN0cmlidXRpb24uICBUaGVzZQoraW5jbHVkZToKKworLSBUaGUgbGVnYWwgaXNzdWVzIGFyb3VuZCB0aGUgZGlzdHJpYnV0aW9uIG9mIHByb3ByaWV0YXJ5IGtlcm5lbCBtb2R1bGVzCisgIGFyZSBjbG91ZHkgYXQgYmVzdDsgcXVpdGUgYSBmZXcga2VybmVsIGNvcHlyaWdodCBob2xkZXJzIGJlbGlldmUgdGhhdAorICBtb3N0IGJpbmFyeS1vbmx5IG1vZHVsZXMgYXJlIGRlcml2ZWQgcHJvZHVjdHMgb2YgdGhlIGtlcm5lbCBhbmQgdGhhdCwgYXMKKyAgYSByZXN1bHQsIHRoZWlyIGRpc3RyaWJ1dGlvbiBpcyBhIHZpb2xhdGlvbiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgIGxpY2Vuc2UgKGFib3V0IHdoaWNoIG1vcmUgd2lsbCBiZSBzYWlkIGJlbG93KS4gIFlvdXIgYXV0aG9yIGlzIG5vdCBhCisgIGxhd3llciwgYW5kIG5vdGhpbmcgaW4gdGhpcyBkb2N1bWVudCBjYW4gcG9zc2libHkgYmUgY29uc2lkZXJlZCB0byBiZQorICBsZWdhbCBhZHZpY2UuICBUaGUgdHJ1ZSBsZWdhbCBzdGF0dXMgb2YgY2xvc2VkLXNvdXJjZSBtb2R1bGVzIGNhbiBvbmx5IGJlCisgIGRldGVybWluZWQgYnkgdGhlIGNvdXJ0cy4gIEJ1dCB0aGUgdW5jZXJ0YWludHkgd2hpY2ggaGF1bnRzIHRob3NlIG1vZHVsZXMKKyAgaXMgdGhlcmUgcmVnYXJkbGVzcy4KKworLSBCaW5hcnkgbW9kdWxlcyBncmVhdGx5IGluY3JlYXNlIHRoZSBkaWZmaWN1bHR5IG9mIGRlYnVnZ2luZyBrZXJuZWwKKyAgcHJvYmxlbXMsIHRvIHRoZSBwb2ludCB0aGF0IG1vc3Qga2VybmVsIGRldmVsb3BlcnMgd2lsbCBub3QgZXZlbiB0cnkuICBTbworICB0aGUgZGlzdHJpYnV0aW9uIG9mIGJpbmFyeS1vbmx5IG1vZHVsZXMgd2lsbCBtYWtlIGl0IGhhcmRlciBmb3IgeW91cgorICB1c2VycyB0byBnZXQgc3VwcG9ydCBmcm9tIHRoZSBjb21tdW5pdHkuCisKKy0gU3VwcG9ydCBpcyBhbHNvIGhhcmRlciBmb3IgZGlzdHJpYnV0b3JzIG9mIGJpbmFyeS1vbmx5IG1vZHVsZXMsIHdobyBtdXN0CisgIHByb3ZpZGUgYSB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUgZm9yIGV2ZXJ5IGRpc3RyaWJ1dGlvbiBhbmQgZXZlcnkga2VybmVsCisgIHZlcnNpb24gdGhleSB3aXNoIHRvIHN1cHBvcnQuICBEb3plbnMgb2YgYnVpbGRzIG9mIGEgc2luZ2xlIG1vZHVsZSBjYW4KKyAgYmUgcmVxdWlyZWQgdG8gcHJvdmlkZSByZWFzb25hYmx5IGNvbXByZWhlbnNpdmUgY292ZXJhZ2UsIGFuZCB5b3VyIHVzZXJzCisgIHdpbGwgaGF2ZSB0byB1cGdyYWRlIHlvdXIgbW9kdWxlIHNlcGFyYXRlbHkgZXZlcnkgdGltZSB0aGV5IHVwZ3JhZGUgdGhlaXIKKyAga2VybmVsLgorCistIEV2ZXJ5dGhpbmcgdGhhdCB3YXMgc2FpZCBhYm92ZSBhYm91dCBjb2RlIHJldmlldyBhcHBsaWVzIGRvdWJseSB0bworICBjbG9zZWQtc291cmNlIGNvZGUuICBTaW5jZSB0aGlzIGNvZGUgaXMgbm90IGF2YWlsYWJsZSBhdCBhbGwsIGl0IGNhbm5vdAorICBoYXZlIGJlZW4gcmV2aWV3ZWQgYnkgdGhlIGNvbW11bml0eSBhbmQgd2lsbCwgYmV5b25kIGRvdWJ0LCBoYXZlIHNlcmlvdXMKKyAgcHJvYmxlbXMuCisKK01ha2VycyBvZiBlbWJlZGRlZCBzeXN0ZW1zLCBpbiBwYXJ0aWN1bGFyLCBtYXkgYmUgdGVtcHRlZCB0byBkaXNyZWdhcmQgbXVjaAorb2Ygd2hhdCBoYXMgYmVlbiBzYWlkIGluIHRoaXMgc2VjdGlvbiBpbiB0aGUgYmVsaWVmIHRoYXQgdGhleSBhcmUgc2hpcHBpbmcKK2Egc2VsZi1jb250YWluZWQgcHJvZHVjdCB3aGljaCB1c2VzIGEgZnJvemVuIGtlcm5lbCB2ZXJzaW9uIGFuZCByZXF1aXJlcyBubworbW9yZSBkZXZlbG9wbWVudCBhZnRlciBpdHMgcmVsZWFzZS4gIFRoaXMgYXJndW1lbnQgbWlzc2VzIHRoZSB2YWx1ZSBvZgord2lkZXNwcmVhZCBjb2RlIHJldmlldyBhbmQgdGhlIHZhbHVlIG9mIGFsbG93aW5nIHlvdXIgdXNlcnMgdG8gYWRkCitjYXBhYmlsaXRpZXMgdG8geW91ciBwcm9kdWN0LiAgQnV0IHRoZXNlIHByb2R1Y3RzLCB0b28sIGhhdmUgYSBsaW1pdGVkCitjb21tZXJjaWFsIGxpZmUsIGFmdGVyIHdoaWNoIGEgbmV3IHZlcnNpb24gbXVzdCBiZSByZWxlYXNlZC4gIEF0IHRoYXQKK3BvaW50LCB2ZW5kb3JzIHdob3NlIGNvZGUgaXMgaW4gdGhlIG1haW5saW5lIGFuZCB3ZWxsIG1haW50YWluZWQgd2lsbCBiZQorbXVjaCBiZXR0ZXIgcG9zaXRpb25lZCB0byBnZXQgdGhlIG5ldyBwcm9kdWN0IHJlYWR5IGZvciBtYXJrZXQgcXVpY2tseS4KKworTGljZW5zaW5nCistLS0tLS0tLS0KKworQ29kZSBpcyBjb250cmlidXRlZCB0byB0aGUgTGludXgga2VybmVsIHVuZGVyIGEgbnVtYmVyIG9mIGxpY2Vuc2VzLCBidXQgYWxsCitjb2RlIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyhHUEx2MiksIHdoaWNoIGlzIHRoZSBsaWNlbnNlIGNvdmVyaW5nIHRoZSBrZXJuZWwgZGlzdHJpYnV0aW9uIGFzIGEgd2hvbGUuCitJbiBwcmFjdGljZSwgdGhhdCBtZWFucyB0aGF0IGFsbCBjb2RlIGNvbnRyaWJ1dGlvbnMgYXJlIGNvdmVyZWQgZWl0aGVyIGJ5CitHUEx2MiAod2l0aCwgb3B0aW9uYWxseSwgbGFuZ3VhZ2UgYWxsb3dpbmcgZGlzdHJpYnV0aW9uIHVuZGVyIGxhdGVyCit2ZXJzaW9ucyBvZiB0aGUgR1BMKSBvciB0aGUgdGhyZWUtY2xhdXNlIEJTRCBsaWNlbnNlLiAgQW55IGNvbnRyaWJ1dGlvbnMKK3doaWNoIGFyZSBub3QgY292ZXJlZCBieSBhIGNvbXBhdGlibGUgbGljZW5zZSB3aWxsIG5vdCBiZSBhY2NlcHRlZCBpbnRvIHRoZQora2VybmVsLgorCitDb3B5cmlnaHQgYXNzaWdubWVudHMgYXJlIG5vdCByZXF1aXJlZCAob3IgcmVxdWVzdGVkKSBmb3IgY29kZSBjb250cmlidXRlZAordG8gdGhlIGtlcm5lbC4gIEFsbCBjb2RlIG1lcmdlZCBpbnRvIHRoZSBtYWlubGluZSBrZXJuZWwgcmV0YWlucyBpdHMKK29yaWdpbmFsIG93bmVyc2hpcDsgYXMgYSByZXN1bHQsIHRoZSBrZXJuZWwgbm93IGhhcyB0aG91c2FuZHMgb2Ygb3duZXJzLgorCitPbmUgaW1wbGljYXRpb24gb2YgdGhpcyBvd25lcnNoaXAgc3RydWN0dXJlIGlzIHRoYXQgYW55IGF0dGVtcHQgdG8gY2hhbmdlCit0aGUgbGljZW5zaW5nIG9mIHRoZSBrZXJuZWwgaXMgZG9vbWVkIHRvIGFsbW9zdCBjZXJ0YWluIGZhaWx1cmUuICBUaGVyZSBhcmUKK2ZldyBwcmFjdGljYWwgc2NlbmFyaW9zIHdoZXJlIHRoZSBhZ3JlZW1lbnQgb2YgYWxsIGNvcHlyaWdodCBob2xkZXJzIGNvdWxkCitiZSBvYnRhaW5lZCAob3IgdGhlaXIgY29kZSByZW1vdmVkIGZyb20gdGhlIGtlcm5lbCkuICBTbywgaW4gcGFydGljdWxhciwKK3RoZXJlIGlzIG5vIHByb3NwZWN0IG9mIGEgbWlncmF0aW9uIHRvIHZlcnNpb24gMyBvZiB0aGUgR1BMIGluIHRoZQorZm9yZXNlZWFibGUgZnV0dXJlLgorCitJdCBpcyBpbXBlcmF0aXZlIHRoYXQgYWxsIGNvZGUgY29udHJpYnV0ZWQgdG8gdGhlIGtlcm5lbCBiZSBsZWdpdGltYXRlbHkKK2ZyZWUgc29mdHdhcmUuICBGb3IgdGhhdCByZWFzb24sIGNvZGUgZnJvbSBhbm9ueW1vdXMgKG9yIHBzZXVkb255bW91cykKK2NvbnRyaWJ1dG9ycyB3aWxsIG5vdCBiZSBhY2NlcHRlZC4gIEFsbCBjb250cmlidXRvcnMgYXJlIHJlcXVpcmVkIHRvICJzaWduCitvZmYiIG9uIHRoZWlyIGNvZGUsIHN0YXRpbmcgdGhhdCB0aGUgY29kZSBjYW4gYmUgZGlzdHJpYnV0ZWQgd2l0aCB0aGUKK2tlcm5lbCB1bmRlciB0aGUgR1BMLiAgQ29kZSB3aGljaCBoYXMgbm90IGJlZW4gbGljZW5zZWQgYXMgZnJlZSBzb2Z0d2FyZSBieQoraXRzIG93bmVyLCBvciB3aGljaCByaXNrcyBjcmVhdGluZyBjb3B5cmlnaHQtcmVsYXRlZCBwcm9ibGVtcyBmb3IgdGhlCitrZXJuZWwgKHN1Y2ggYXMgY29kZSB3aGljaCBkZXJpdmVzIGZyb20gcmV2ZXJzZS1lbmdpbmVlcmluZyBlZmZvcnRzIGxhY2tpbmcKK3Byb3BlciBzYWZlZ3VhcmRzKSBjYW5ub3QgYmUgY29udHJpYnV0ZWQuCisKK1F1ZXN0aW9ucyBhYm91dCBjb3B5cmlnaHQtcmVsYXRlZCBpc3N1ZXMgYXJlIGNvbW1vbiBvbiBMaW51eCBkZXZlbG9wbWVudAorbWFpbGluZyBsaXN0cy4gIFN1Y2ggcXVlc3Rpb25zIHdpbGwgbm9ybWFsbHkgcmVjZWl2ZSBubyBzaG9ydGFnZSBvZgorYW5zd2VycywgYnV0IG9uZSBzaG91bGQgYmVhciBpbiBtaW5kIHRoYXQgdGhlIHBlb3BsZSBhbnN3ZXJpbmcgdGhvc2UKK3F1ZXN0aW9ucyBhcmUgbm90IGxhd3llcnMgYW5kIGNhbm5vdCBwcm92aWRlIGxlZ2FsIGFkdmljZS4gIElmIHlvdSBoYXZlCitsZWdhbCBxdWVzdGlvbnMgcmVsYXRpbmcgdG8gTGludXggc291cmNlIGNvZGUsIHRoZXJlIGlzIG5vIHN1YnN0aXR1dGUgZm9yCit0YWxraW5nIHdpdGggYSBsYXd5ZXIgd2hvIHVuZGVyc3RhbmRzIHRoaXMgZmllbGQuICBSZWx5aW5nIG9uIGFuc3dlcnMKK29idGFpbmVkIG9uIHRlY2huaWNhbCBtYWlsaW5nIGxpc3RzIGlzIGEgcmlza3kgYWZmYWlyLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzIuUHJvY2VzcyBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy8yLlByb2Nlc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNGUxNTYuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzIuUHJvY2VzcworKysgL2Rldi9udWxsCkBAIC0xLDQ3OCArMCwwIEBACi0yOiBIT1cgVEhFIERFVkVMT1BNRU5UIFBST0NFU1MgV09SS1MKLQotTGludXgga2VybmVsIGRldmVsb3BtZW50IGluIHRoZSBlYXJseSAxOTkwJ3Mgd2FzIGEgcHJldHR5IGxvb3NlIGFmZmFpciwKLXdpdGggcmVsYXRpdmVseSBzbWFsbCBudW1iZXJzIG9mIHVzZXJzIGFuZCBkZXZlbG9wZXJzIGludm9sdmVkLiAgV2l0aCBhCi11c2VyIGJhc2UgaW4gdGhlIG1pbGxpb25zIGFuZCB3aXRoIHNvbWUgMiwwMDAgZGV2ZWxvcGVycyBpbnZvbHZlZCBvdmVyIHRoZQotY291cnNlIG9mIG9uZSB5ZWFyLCB0aGUga2VybmVsIGhhcyBzaW5jZSBoYWQgdG8gZXZvbHZlIGEgbnVtYmVyIG9mCi1wcm9jZXNzZXMgdG8ga2VlcCBkZXZlbG9wbWVudCBoYXBwZW5pbmcgc21vb3RobHkuICBBIHNvbGlkIHVuZGVyc3RhbmRpbmcgb2YKLWhvdyB0aGUgcHJvY2VzcyB3b3JrcyBpcyByZXF1aXJlZCBpbiBvcmRlciB0byBiZSBhbiBlZmZlY3RpdmUgcGFydCBvZiBpdC4KLQotCi0yLjE6IFRIRSBCSUcgUElDVFVSRQotCi1UaGUga2VybmVsIGRldmVsb3BlcnMgdXNlIGEgbG9vc2VseSB0aW1lLWJhc2VkIHJlbGVhc2UgcHJvY2Vzcywgd2l0aCBhIG5ldwotbWFqb3Iga2VybmVsIHJlbGVhc2UgaGFwcGVuaW5nIGV2ZXJ5IHR3byBvciB0aHJlZSBtb250aHMuICBUaGUgcmVjZW50Ci1yZWxlYXNlIGhpc3RvcnkgbG9va3MgbGlrZSB0aGlzOgotCi0JMi42LjM4CU1hcmNoIDE0LCAyMDExCi0JMi42LjM3CUphbnVhcnkgNCwgMjAxMQotCTIuNi4zNglPY3RvYmVyIDIwLCAyMDEwCi0JMi42LjM1CUF1Z3VzdCAxLCAyMDEwCi0JMi42LjM0CU1heSAxNSwgMjAxMAotCTIuNi4zMwlGZWJydWFyeSAyNCwgMjAxMAotCi1FdmVyeSAyLjYueCByZWxlYXNlIGlzIGEgbWFqb3Iga2VybmVsIHJlbGVhc2Ugd2l0aCBuZXcgZmVhdHVyZXMsIGludGVybmFsCi1BUEkgY2hhbmdlcywgYW5kIG1vcmUuICBBIHR5cGljYWwgMi42IHJlbGVhc2UgY2FuIGNvbnRhaW4gbmVhcmx5IDEwLDAwMAotY2hhbmdlc2V0cyB3aXRoIGNoYW5nZXMgdG8gc2V2ZXJhbCBodW5kcmVkIHRob3VzYW5kIGxpbmVzIG9mIGNvZGUuICAyLjYgaXMKLXRodXMgdGhlIGxlYWRpbmcgZWRnZSBvZiBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQ7IHRoZSBrZXJuZWwgdXNlcyBhCi1yb2xsaW5nIGRldmVsb3BtZW50IG1vZGVsIHdoaWNoIGlzIGNvbnRpbnVhbGx5IGludGVncmF0aW5nIG1ham9yIGNoYW5nZXMuCi0KLUEgcmVsYXRpdmVseSBzdHJhaWdodGZvcndhcmQgZGlzY2lwbGluZSBpcyBmb2xsb3dlZCB3aXRoIHJlZ2FyZCB0byB0aGUKLW1lcmdpbmcgb2YgcGF0Y2hlcyBmb3IgZWFjaCByZWxlYXNlLiAgQXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGRldmVsb3BtZW50Ci1jeWNsZSwgdGhlICJtZXJnZSB3aW5kb3ciIGlzIHNhaWQgdG8gYmUgb3Blbi4gIEF0IHRoYXQgdGltZSwgY29kZSB3aGljaCBpcwotZGVlbWVkIHRvIGJlIHN1ZmZpY2llbnRseSBzdGFibGUgKGFuZCB3aGljaCBpcyBhY2NlcHRlZCBieSB0aGUgZGV2ZWxvcG1lbnQKLWNvbW11bml0eSkgaXMgbWVyZ2VkIGludG8gdGhlIG1haW5saW5lIGtlcm5lbC4gIFRoZSBidWxrIG9mIGNoYW5nZXMgZm9yIGEKLW5ldyBkZXZlbG9wbWVudCBjeWNsZSAoYW5kIGFsbCBvZiB0aGUgbWFqb3IgY2hhbmdlcykgd2lsbCBiZSBtZXJnZWQgZHVyaW5nCi10aGlzIHRpbWUsIGF0IGEgcmF0ZSBhcHByb2FjaGluZyAxLDAwMCBjaGFuZ2VzICgicGF0Y2hlcywiIG9yICJjaGFuZ2VzZXRzIikKLXBlciBkYXkuCi0KLShBcyBhbiBhc2lkZSwgaXQgaXMgd29ydGggbm90aW5nIHRoYXQgdGhlIGNoYW5nZXMgaW50ZWdyYXRlZCBkdXJpbmcgdGhlCi1tZXJnZSB3aW5kb3cgZG8gbm90IGNvbWUgb3V0IG9mIHRoaW4gYWlyOyB0aGV5IGhhdmUgYmVlbiBjb2xsZWN0ZWQsIHRlc3RlZCwKLWFuZCBzdGFnZWQgYWhlYWQgb2YgdGltZS4gIEhvdyB0aGF0IHByb2Nlc3Mgd29ya3Mgd2lsbCBiZSBkZXNjcmliZWQgaW4KLWRldGFpbCBsYXRlciBvbikuCi0KLVRoZSBtZXJnZSB3aW5kb3cgbGFzdHMgZm9yIGFwcHJveGltYXRlbHkgdHdvIHdlZWtzLiAgQXQgdGhlIGVuZCBvZiB0aGlzCi10aW1lLCBMaW51cyBUb3J2YWxkcyB3aWxsIGRlY2xhcmUgdGhhdCB0aGUgd2luZG93IGlzIGNsb3NlZCBhbmQgcmVsZWFzZSB0aGUKLWZpcnN0IG9mIHRoZSAicmMiIGtlcm5lbHMuICBGb3IgdGhlIGtlcm5lbCB3aGljaCBpcyBkZXN0aW5lZCB0byBiZSAyLjYuNDAsCi1mb3IgZXhhbXBsZSwgdGhlIHJlbGVhc2Ugd2hpY2ggaGFwcGVucyBhdCB0aGUgZW5kIG9mIHRoZSBtZXJnZSB3aW5kb3cgd2lsbAotYmUgY2FsbGVkIDIuNi40MC1yYzEuICBUaGUgLXJjMSByZWxlYXNlIGlzIHRoZSBzaWduYWwgdGhhdCB0aGUgdGltZSB0bwotbWVyZ2UgbmV3IGZlYXR1cmVzIGhhcyBwYXNzZWQsIGFuZCB0aGF0IHRoZSB0aW1lIHRvIHN0YWJpbGl6ZSB0aGUgbmV4dAota2VybmVsIGhhcyBiZWd1bi4KLQotT3ZlciB0aGUgbmV4dCBzaXggdG8gdGVuIHdlZWtzLCBvbmx5IHBhdGNoZXMgd2hpY2ggZml4IHByb2JsZW1zIHNob3VsZCBiZQotc3VibWl0dGVkIHRvIHRoZSBtYWlubGluZS4gIE9uIG9jY2FzaW9uIGEgbW9yZSBzaWduaWZpY2FudCBjaGFuZ2Ugd2lsbCBiZQotYWxsb3dlZCwgYnV0IHN1Y2ggb2NjYXNpb25zIGFyZSByYXJlOyBkZXZlbG9wZXJzIHdobyB0cnkgdG8gbWVyZ2UgbmV3Ci1mZWF0dXJlcyBvdXRzaWRlIG9mIHRoZSBtZXJnZSB3aW5kb3cgdGVuZCB0byBnZXQgYW4gdW5mcmllbmRseSByZWNlcHRpb24uCi1BcyBhIGdlbmVyYWwgcnVsZSwgaWYgeW91IG1pc3MgdGhlIG1lcmdlIHdpbmRvdyBmb3IgYSBnaXZlbiBmZWF0dXJlLCB0aGUKLWJlc3QgdGhpbmcgdG8gZG8gaXMgdG8gd2FpdCBmb3IgdGhlIG5leHQgZGV2ZWxvcG1lbnQgY3ljbGUuICAoQW4gb2NjYXNpb25hbAotZXhjZXB0aW9uIGlzIG1hZGUgZm9yIGRyaXZlcnMgZm9yIHByZXZpb3VzbHktdW5zdXBwb3J0ZWQgaGFyZHdhcmU7IGlmIHRoZXkKLXRvdWNoIG5vIGluLXRyZWUgY29kZSwgdGhleSBjYW5ub3QgY2F1c2UgcmVncmVzc2lvbnMgYW5kIHNob3VsZCBiZSBzYWZlIHRvCi1hZGQgYXQgYW55IHRpbWUpLgotCi1BcyBmaXhlcyBtYWtlIHRoZWlyIHdheSBpbnRvIHRoZSBtYWlubGluZSwgdGhlIHBhdGNoIHJhdGUgd2lsbCBzbG93IG92ZXIKLXRpbWUuICBMaW51cyByZWxlYXNlcyBuZXcgLXJjIGtlcm5lbHMgYWJvdXQgb25jZSBhIHdlZWs7IGEgbm9ybWFsIHNlcmllcwotd2lsbCBnZXQgdXAgdG8gc29tZXdoZXJlIGJldHdlZW4gLXJjNiBhbmQgLXJjOSBiZWZvcmUgdGhlIGtlcm5lbCBpcwotY29uc2lkZXJlZCB0byBiZSBzdWZmaWNpZW50bHkgc3RhYmxlIGFuZCB0aGUgZmluYWwgMi42LnggcmVsZWFzZSBpcyBtYWRlLgotQXQgdGhhdCBwb2ludCB0aGUgd2hvbGUgcHJvY2VzcyBzdGFydHMgb3ZlciBhZ2Fpbi4KLQotQXMgYW4gZXhhbXBsZSwgaGVyZSBpcyBob3cgdGhlIDIuNi4zOCBkZXZlbG9wbWVudCBjeWNsZSB3ZW50IChhbGwgZGF0ZXMgaW4KLTIwMTEpOgotCi0JSmFudWFyeSA0CTIuNi4zNyBzdGFibGUgcmVsZWFzZQotCUphbnVhcnkgMTgJMi42LjM4LXJjMSwgbWVyZ2Ugd2luZG93IGNsb3NlcwotCUphbnVhcnkgMjEJMi42LjM4LXJjMgotCUZlYnJ1YXJ5IDEJMi42LjM4LXJjMwotCUZlYnJ1YXJ5IDcJMi42LjM4LXJjNAotCUZlYnJ1YXJ5IDE1CTIuNi4zOC1yYzUKLQlGZWJydWFyeSAyMQkyLjYuMzgtcmM2Ci0JTWFyY2ggMQkJMi42LjM4LXJjNwotCU1hcmNoIDcJCTIuNi4zOC1yYzgKLQlNYXJjaCAxNAkyLjYuMzggc3RhYmxlIHJlbGVhc2UKLQotSG93IGRvIHRoZSBkZXZlbG9wZXJzIGRlY2lkZSB3aGVuIHRvIGNsb3NlIHRoZSBkZXZlbG9wbWVudCBjeWNsZSBhbmQgY3JlYXRlCi10aGUgc3RhYmxlIHJlbGVhc2U/ICBUaGUgbW9zdCBzaWduaWZpY2FudCBtZXRyaWMgdXNlZCBpcyB0aGUgbGlzdCBvZgotcmVncmVzc2lvbnMgZnJvbSBwcmV2aW91cyByZWxlYXNlcy4gIE5vIGJ1Z3MgYXJlIHdlbGNvbWUsIGJ1dCB0aG9zZSB3aGljaAotYnJlYWsgc3lzdGVtcyB3aGljaCB3b3JrZWQgaW4gdGhlIHBhc3QgYXJlIGNvbnNpZGVyZWQgdG8gYmUgZXNwZWNpYWxseQotc2VyaW91cy4gIEZvciB0aGlzIHJlYXNvbiwgcGF0Y2hlcyB3aGljaCBjYXVzZSByZWdyZXNzaW9ucyBhcmUgbG9va2VkIHVwb24KLXVuZmF2b3JhYmx5IGFuZCBhcmUgcXVpdGUgbGlrZWx5IHRvIGJlIHJldmVydGVkIGR1cmluZyB0aGUgc3RhYmlsaXphdGlvbgotcGVyaW9kLgotCi1UaGUgZGV2ZWxvcGVycycgZ29hbCBpcyB0byBmaXggYWxsIGtub3duIHJlZ3Jlc3Npb25zIGJlZm9yZSB0aGUgc3RhYmxlCi1yZWxlYXNlIGlzIG1hZGUuICBJbiB0aGUgcmVhbCB3b3JsZCwgdGhpcyBraW5kIG9mIHBlcmZlY3Rpb24gaXMgaGFyZCB0bwotYWNoaWV2ZTsgdGhlcmUgYXJlIGp1c3QgdG9vIG1hbnkgdmFyaWFibGVzIGluIGEgcHJvamVjdCBvZiB0aGlzIHNpemUuCi1UaGVyZSBjb21lcyBhIHBvaW50IHdoZXJlIGRlbGF5aW5nIHRoZSBmaW5hbCByZWxlYXNlIGp1c3QgbWFrZXMgdGhlIHByb2JsZW0KLXdvcnNlOyB0aGUgcGlsZSBvZiBjaGFuZ2VzIHdhaXRpbmcgZm9yIHRoZSBuZXh0IG1lcmdlIHdpbmRvdyB3aWxsIGdyb3cKLWxhcmdlciwgY3JlYXRpbmcgZXZlbiBtb3JlIHJlZ3Jlc3Npb25zIHRoZSBuZXh0IHRpbWUgYXJvdW5kLiAgU28gbW9zdCAyLjYueAota2VybmVscyBnbyBvdXQgd2l0aCBhIGhhbmRmdWwgb2Yga25vd24gcmVncmVzc2lvbnMgdGhvdWdoLCBob3BlZnVsbHksIG5vbmUKLW9mIHRoZW0gYXJlIHNlcmlvdXMuCi0KLU9uY2UgYSBzdGFibGUgcmVsZWFzZSBpcyBtYWRlLCBpdHMgb25nb2luZyBtYWludGVuYW5jZSBpcyBwYXNzZWQgb2ZmIHRvIHRoZQotInN0YWJsZSB0ZWFtLCIgY3VycmVudGx5IGNvbnNpc3Rpbmcgb2YgR3JlZyBLcm9haC1IYXJ0bWFuLiAgVGhlIHN0YWJsZSB0ZWFtCi13aWxsIHJlbGVhc2Ugb2NjYXNpb25hbCB1cGRhdGVzIHRvIHRoZSBzdGFibGUgcmVsZWFzZSB1c2luZyB0aGUgMi42LngueQotbnVtYmVyaW5nIHNjaGVtZS4gIFRvIGJlIGNvbnNpZGVyZWQgZm9yIGFuIHVwZGF0ZSByZWxlYXNlLCBhIHBhdGNoIG11c3QgKDEpCi1maXggYSBzaWduaWZpY2FudCBidWcsIGFuZCAoMikgYWxyZWFkeSBiZSBtZXJnZWQgaW50byB0aGUgbWFpbmxpbmUgZm9yIHRoZQotbmV4dCBkZXZlbG9wbWVudCBrZXJuZWwuICBLZXJuZWxzIHdpbGwgdHlwaWNhbGx5IHJlY2VpdmUgc3RhYmxlIHVwZGF0ZXMgZm9yCi1hIGxpdHRsZSBtb3JlIHRoYW4gb25lIGRldmVsb3BtZW50IGN5Y2xlIHBhc3QgdGhlaXIgaW5pdGlhbCByZWxlYXNlLiAgU28sCi1mb3IgZXhhbXBsZSwgdGhlIDIuNi4zNiBrZXJuZWwncyBoaXN0b3J5IGxvb2tlZCBsaWtlOgotCi0JT2N0b2JlciAxMAkyLjYuMzYgc3RhYmxlIHJlbGVhc2UKLQlOb3ZlbWJlciAyMgkyLjYuMzYuMQotCURlY2VtYmVyIDkJMi42LjM2LjIKLQlKYW51YXJ5IDcJMi42LjM2LjMKLQlGZWJydWFyeSAxNwkyLjYuMzYuNAotCi0yLjYuMzYuNCB3YXMgdGhlIGZpbmFsIHN0YWJsZSB1cGRhdGUgZm9yIHRoZSAyLjYuMzYgcmVsZWFzZS4KLQotU29tZSBrZXJuZWxzIGFyZSBkZXNpZ25hdGVkICJsb25nIHRlcm0iIGtlcm5lbHM7IHRoZXkgd2lsbCByZWNlaXZlIHN1cHBvcnQKLWZvciBhIGxvbmdlciBwZXJpb2QuICBBcyBvZiB0aGlzIHdyaXRpbmcsIHRoZSBjdXJyZW50IGxvbmcgdGVybSBrZXJuZWxzCi1hbmQgdGhlaXIgbWFpbnRhaW5lcnMgYXJlOgotCi0JMi42LjI3CVdpbGx5IFRhcnJlYXUJCShEZWVwLWZyb3plbiBzdGFibGUga2VybmVsKQotCTIuNi4zMglHcmVnIEtyb2FoLUhhcnRtYW4KLQkyLjYuMzUJQW5kaSBLbGVlbgkJKEVtYmVkZGVkIGZsYWcga2VybmVsKQotCi1UaGUgc2VsZWN0aW9uIG9mIGEga2VybmVsIGZvciBsb25nLXRlcm0gc3VwcG9ydCBpcyBwdXJlbHkgYSBtYXR0ZXIgb2YgYQotbWFpbnRhaW5lciBoYXZpbmcgdGhlIG5lZWQgYW5kIHRoZSB0aW1lIHRvIG1haW50YWluIHRoYXQgcmVsZWFzZS4gIFRoZXJlCi1hcmUgbm8ga25vd24gcGxhbnMgZm9yIGxvbmctdGVybSBzdXBwb3J0IGZvciBhbnkgc3BlY2lmaWMgdXBjb21pbmcKLXJlbGVhc2UuCi0KLQotMi4yOiBUSEUgTElGRUNZQ0xFIE9GIEEgUEFUQ0gKLQotUGF0Y2hlcyBkbyBub3QgZ28gZGlyZWN0bHkgZnJvbSB0aGUgZGV2ZWxvcGVyJ3Mga2V5Ym9hcmQgaW50byB0aGUgbWFpbmxpbmUKLWtlcm5lbC4gIFRoZXJlIGlzLCBpbnN0ZWFkLCBhIHNvbWV3aGF0IGludm9sdmVkIChpZiBzb21ld2hhdCBpbmZvcm1hbCkKLXByb2Nlc3MgZGVzaWduZWQgdG8gZW5zdXJlIHRoYXQgZWFjaCBwYXRjaCBpcyByZXZpZXdlZCBmb3IgcXVhbGl0eSBhbmQgdGhhdAotZWFjaCBwYXRjaCBpbXBsZW1lbnRzIGEgY2hhbmdlIHdoaWNoIGlzIGRlc2lyYWJsZSB0byBoYXZlIGluIHRoZSBtYWlubGluZS4KLVRoaXMgcHJvY2VzcyBjYW4gaGFwcGVuIHF1aWNrbHkgZm9yIG1pbm9yIGZpeGVzLCBvciwgaW4gdGhlIGNhc2Ugb2YgbGFyZ2UKLWFuZCBjb250cm92ZXJzaWFsIGNoYW5nZXMsIGdvIG9uIGZvciB5ZWFycy4gIE11Y2ggZGV2ZWxvcGVyIGZydXN0cmF0aW9uCi1jb21lcyBmcm9tIGEgbGFjayBvZiB1bmRlcnN0YW5kaW5nIG9mIHRoaXMgcHJvY2VzcyBvciBmcm9tIGF0dGVtcHRzIHRvCi1jaXJjdW12ZW50IGl0LgotCi1JbiB0aGUgaG9wZXMgb2YgcmVkdWNpbmcgdGhhdCBmcnVzdHJhdGlvbiwgdGhpcyBkb2N1bWVudCB3aWxsIGRlc2NyaWJlIGhvdwotYSBwYXRjaCBnZXRzIGludG8gdGhlIGtlcm5lbC4gIFdoYXQgZm9sbG93cyBiZWxvdyBpcyBhbiBpbnRyb2R1Y3Rpb24gd2hpY2gKLWRlc2NyaWJlcyB0aGUgcHJvY2VzcyBpbiBhIHNvbWV3aGF0IGlkZWFsaXplZCB3YXkuICBBIG11Y2ggbW9yZSBkZXRhaWxlZAotdHJlYXRtZW50IHdpbGwgY29tZSBpbiBsYXRlciBzZWN0aW9ucy4KLQotVGhlIHN0YWdlcyB0aGF0IGEgcGF0Y2ggZ29lcyB0aHJvdWdoIGFyZSwgZ2VuZXJhbGx5OgotCi0gLSBEZXNpZ24uICBUaGlzIGlzIHdoZXJlIHRoZSByZWFsIHJlcXVpcmVtZW50cyBmb3IgdGhlIHBhdGNoIC0gYW5kIHRoZSB3YXkKLSAgIHRob3NlIHJlcXVpcmVtZW50cyB3aWxsIGJlIG1ldCAtIGFyZSBsYWlkIG91dC4gIERlc2lnbiB3b3JrIGlzIG9mdGVuCi0gICBkb25lIHdpdGhvdXQgaW52b2x2aW5nIHRoZSBjb21tdW5pdHksIGJ1dCBpdCBpcyBiZXR0ZXIgdG8gZG8gdGhpcyB3b3JrCi0gICBpbiB0aGUgb3BlbiBpZiBhdCBhbGwgcG9zc2libGU7IGl0IGNhbiBzYXZlIGEgbG90IG9mIHRpbWUgcmVkZXNpZ25pbmcKLSAgIHRoaW5ncyBsYXRlci4KLQotIC0gRWFybHkgcmV2aWV3LiAgUGF0Y2hlcyBhcmUgcG9zdGVkIHRvIHRoZSByZWxldmFudCBtYWlsaW5nIGxpc3QsIGFuZAotICAgZGV2ZWxvcGVycyBvbiB0aGF0IGxpc3QgcmVwbHkgd2l0aCBhbnkgY29tbWVudHMgdGhleSBtYXkgaGF2ZS4gIFRoaXMKLSAgIHByb2Nlc3Mgc2hvdWxkIHR1cm4gdXAgYW55IG1ham9yIHByb2JsZW1zIHdpdGggYSBwYXRjaCBpZiBhbGwgZ29lcwotICAgd2VsbC4KLQotIC0gV2lkZXIgcmV2aWV3LiAgV2hlbiB0aGUgcGF0Y2ggaXMgZ2V0dGluZyBjbG9zZSB0byByZWFkeSBmb3IgbWFpbmxpbmUKLSAgIGluY2x1c2lvbiwgaXQgc2hvdWxkIGJlIGFjY2VwdGVkIGJ5IGEgcmVsZXZhbnQgc3Vic3lzdGVtIG1haW50YWluZXIgLQotICAgdGhvdWdoIHRoaXMgYWNjZXB0YW5jZSBpcyBub3QgYSBndWFyYW50ZWUgdGhhdCB0aGUgcGF0Y2ggd2lsbCBtYWtlIGl0Ci0gICBhbGwgdGhlIHdheSB0byB0aGUgbWFpbmxpbmUuICBUaGUgcGF0Y2ggd2lsbCBzaG93IHVwIGluIHRoZSBtYWludGFpbmVyJ3MKLSAgIHN1YnN5c3RlbSB0cmVlIGFuZCBpbnRvIHRoZSAtbmV4dCB0cmVlcyAoZGVzY3JpYmVkIGJlbG93KS4gIFdoZW4gdGhlCi0gICBwcm9jZXNzIHdvcmtzLCB0aGlzIHN0ZXAgbGVhZHMgdG8gbW9yZSBleHRlbnNpdmUgcmV2aWV3IG9mIHRoZSBwYXRjaCBhbmQKLSAgIHRoZSBkaXNjb3Zlcnkgb2YgYW55IHByb2JsZW1zIHJlc3VsdGluZyBmcm9tIHRoZSBpbnRlZ3JhdGlvbiBvZiB0aGlzCi0gICBwYXRjaCB3aXRoIHdvcmsgYmVpbmcgZG9uZSBieSBvdGhlcnMuCi0KLS0gIFBsZWFzZSBub3RlIHRoYXQgbW9zdCBtYWludGFpbmVycyBhbHNvIGhhdmUgZGF5IGpvYnMsIHNvIG1lcmdpbmcKLSAgIHlvdXIgcGF0Y2ggbWF5IG5vdCBiZSB0aGVpciBoaWdoZXN0IHByaW9yaXR5LiAgSWYgeW91ciBwYXRjaCBpcwotICAgZ2V0dGluZyBmZWVkYmFjayBhYm91dCBjaGFuZ2VzIHRoYXQgYXJlIG5lZWRlZCwgeW91IHNob3VsZCBlaXRoZXIKLSAgIG1ha2UgdGhvc2UgY2hhbmdlcyBvciBqdXN0aWZ5IHdoeSB0aGV5IHNob3VsZCBub3QgYmUgbWFkZS4gIElmIHlvdXIKLSAgIHBhdGNoIGhhcyBubyByZXZpZXcgY29tcGxhaW50cyBidXQgaXMgbm90IGJlaW5nIG1lcmdlZCBieSBpdHMKLSAgIGFwcHJvcHJpYXRlIHN1YnN5c3RlbSBvciBkcml2ZXIgbWFpbnRhaW5lciwgeW91IHNob3VsZCBiZSBwZXJzaXN0ZW50Ci0gICBpbiB1cGRhdGluZyB0aGUgcGF0Y2ggdG8gdGhlIGN1cnJlbnQga2VybmVsIHNvIHRoYXQgaXQgYXBwbGllcyBjbGVhbmx5Ci0gICBhbmQga2VlcCBzZW5kaW5nIGl0IGZvciByZXZpZXcgYW5kIG1lcmdpbmcuCi0KLSAtIE1lcmdpbmcgaW50byB0aGUgbWFpbmxpbmUuICBFdmVudHVhbGx5LCBhIHN1Y2Nlc3NmdWwgcGF0Y2ggd2lsbCBiZQotICAgbWVyZ2VkIGludG8gdGhlIG1haW5saW5lIHJlcG9zaXRvcnkgbWFuYWdlZCBieSBMaW51cyBUb3J2YWxkcy4gIE1vcmUKLSAgIGNvbW1lbnRzIGFuZC9vciBwcm9ibGVtcyBtYXkgc3VyZmFjZSBhdCB0aGlzIHRpbWU7IGl0IGlzIGltcG9ydGFudCB0aGF0Ci0gICB0aGUgZGV2ZWxvcGVyIGJlIHJlc3BvbnNpdmUgdG8gdGhlc2UgYW5kIGZpeCBhbnkgaXNzdWVzIHdoaWNoIGFyaXNlLgotCi0gLSBTdGFibGUgcmVsZWFzZS4gIFRoZSBudW1iZXIgb2YgdXNlcnMgcG90ZW50aWFsbHkgYWZmZWN0ZWQgYnkgdGhlIHBhdGNoCi0gICBpcyBub3cgbGFyZ2UsIHNvLCBvbmNlIGFnYWluLCBuZXcgcHJvYmxlbXMgbWF5IGFyaXNlLgotCi0gLSBMb25nLXRlcm0gbWFpbnRlbmFuY2UuICBXaGlsZSBpdCBpcyBjZXJ0YWlubHkgcG9zc2libGUgZm9yIGEgZGV2ZWxvcGVyCi0gICB0byBmb3JnZXQgYWJvdXQgY29kZSBhZnRlciBtZXJnaW5nIGl0LCB0aGF0IHNvcnQgb2YgYmVoYXZpb3IgdGVuZHMgdG8KLSAgIGxlYXZlIGEgcG9vciBpbXByZXNzaW9uIGluIHRoZSBkZXZlbG9wbWVudCBjb21tdW5pdHkuICBNZXJnaW5nIGNvZGUKLSAgIGVsaW1pbmF0ZXMgc29tZSBvZiB0aGUgbWFpbnRlbmFuY2UgYnVyZGVuLCBpbiB0aGF0IG90aGVycyB3aWxsIGZpeAotICAgcHJvYmxlbXMgY2F1c2VkIGJ5IEFQSSBjaGFuZ2VzLiAgQnV0IHRoZSBvcmlnaW5hbCBkZXZlbG9wZXIgc2hvdWxkCi0gICBjb250aW51ZSB0byB0YWtlIHJlc3BvbnNpYmlsaXR5IGZvciB0aGUgY29kZSBpZiBpdCBpcyB0byByZW1haW4gdXNlZnVsCi0gICBpbiB0aGUgbG9uZ2VyIHRlcm0uCi0KLU9uZSBvZiB0aGUgbGFyZ2VzdCBtaXN0YWtlcyBtYWRlIGJ5IGtlcm5lbCBkZXZlbG9wZXJzIChvciB0aGVpciBlbXBsb3llcnMpCi1pcyB0byB0cnkgdG8gY3V0IHRoZSBwcm9jZXNzIGRvd24gdG8gYSBzaW5nbGUgIm1lcmdpbmcgaW50byB0aGUgbWFpbmxpbmUiCi1zdGVwLiAgVGhpcyBhcHByb2FjaCBpbnZhcmlhYmx5IGxlYWRzIHRvIGZydXN0cmF0aW9uIGZvciBldmVyeWJvZHkKLWludm9sdmVkLgotCi0KLTIuMzogSE9XIFBBVENIRVMgR0VUIElOVE8gVEhFIEtFUk5FTAotCi1UaGVyZSBpcyBleGFjdGx5IG9uZSBwZXJzb24gd2hvIGNhbiBtZXJnZSBwYXRjaGVzIGludG8gdGhlIG1haW5saW5lIGtlcm5lbAotcmVwb3NpdG9yeTogTGludXMgVG9ydmFsZHMuICBCdXQsIG9mIHRoZSBvdmVyIDksNTAwIHBhdGNoZXMgd2hpY2ggd2VudAotaW50byB0aGUgMi42LjM4IGtlcm5lbCwgb25seSAxMTIgKGFyb3VuZCAxLjMlKSB3ZXJlIGRpcmVjdGx5IGNob3NlbiBieSBMaW51cwotaGltc2VsZi4gIFRoZSBrZXJuZWwgcHJvamVjdCBoYXMgbG9uZyBzaW5jZSBncm93biB0byBhIHNpemUgd2hlcmUgbm8gc2luZ2xlCi1kZXZlbG9wZXIgY291bGQgcG9zc2libHkgaW5zcGVjdCBhbmQgc2VsZWN0IGV2ZXJ5IHBhdGNoIHVuYXNzaXN0ZWQuICBUaGUKLXdheSB0aGUga2VybmVsIGRldmVsb3BlcnMgaGF2ZSBhZGRyZXNzZWQgdGhpcyBncm93dGggaXMgdGhyb3VnaCB0aGUgdXNlIG9mCi1hIGxpZXV0ZW5hbnQgc3lzdGVtIGJ1aWx0IGFyb3VuZCBhIGNoYWluIG9mIHRydXN0LgotCi1UaGUga2VybmVsIGNvZGUgYmFzZSBpcyBsb2dpY2FsbHkgYnJva2VuIGRvd24gaW50byBhIHNldCBvZiBzdWJzeXN0ZW1zOgotbmV0d29ya2luZywgc3BlY2lmaWMgYXJjaGl0ZWN0dXJlIHN1cHBvcnQsIG1lbW9yeSBtYW5hZ2VtZW50LCB2aWRlbwotZGV2aWNlcywgZXRjLiAgTW9zdCBzdWJzeXN0ZW1zIGhhdmUgYSBkZXNpZ25hdGVkIG1haW50YWluZXIsIGEgZGV2ZWxvcGVyCi13aG8gaGFzIG92ZXJhbGwgcmVzcG9uc2liaWxpdHkgZm9yIHRoZSBjb2RlIHdpdGhpbiB0aGF0IHN1YnN5c3RlbS4gIFRoZXNlCi1zdWJzeXN0ZW0gbWFpbnRhaW5lcnMgYXJlIHRoZSBnYXRla2VlcGVycyAoaW4gYSBsb29zZSB3YXkpIGZvciB0aGUgcG9ydGlvbgotb2YgdGhlIGtlcm5lbCB0aGV5IG1hbmFnZTsgdGhleSBhcmUgdGhlIG9uZXMgd2hvIHdpbGwgKHVzdWFsbHkpIGFjY2VwdCBhCi1wYXRjaCBmb3IgaW5jbHVzaW9uIGludG8gdGhlIG1haW5saW5lIGtlcm5lbC4KLQotU3Vic3lzdGVtIG1haW50YWluZXJzIGVhY2ggbWFuYWdlIHRoZWlyIG93biB2ZXJzaW9uIG9mIHRoZSBrZXJuZWwgc291cmNlCi10cmVlLCB1c3VhbGx5IChidXQgY2VydGFpbmx5IG5vdCBhbHdheXMpIHVzaW5nIHRoZSBnaXQgc291cmNlIG1hbmFnZW1lbnQKLXRvb2wuICBUb29scyBsaWtlIGdpdCAoYW5kIHJlbGF0ZWQgdG9vbHMgbGlrZSBxdWlsdCBvciBtZXJjdXJpYWwpIGFsbG93Ci1tYWludGFpbmVycyB0byB0cmFjayBhIGxpc3Qgb2YgcGF0Y2hlcywgaW5jbHVkaW5nIGF1dGhvcnNoaXAgaW5mb3JtYXRpb24KLWFuZCBvdGhlciBtZXRhZGF0YS4gIEF0IGFueSBnaXZlbiB0aW1lLCB0aGUgbWFpbnRhaW5lciBjYW4gaWRlbnRpZnkgd2hpY2gKLXBhdGNoZXMgaW4gaGlzIG9yIGhlciByZXBvc2l0b3J5IGFyZSBub3QgZm91bmQgaW4gdGhlIG1haW5saW5lLgotCi1XaGVuIHRoZSBtZXJnZSB3aW5kb3cgb3BlbnMsIHRvcC1sZXZlbCBtYWludGFpbmVycyB3aWxsIGFzayBMaW51cyB0byAicHVsbCIKLXRoZSBwYXRjaGVzIHRoZXkgaGF2ZSBzZWxlY3RlZCBmb3IgbWVyZ2luZyBmcm9tIHRoZWlyIHJlcG9zaXRvcmllcy4gIElmCi1MaW51cyBhZ3JlZXMsIHRoZSBzdHJlYW0gb2YgcGF0Y2hlcyB3aWxsIGZsb3cgdXAgaW50byBoaXMgcmVwb3NpdG9yeSwKLWJlY29taW5nIHBhcnQgb2YgdGhlIG1haW5saW5lIGtlcm5lbC4gIFRoZSBhbW91bnQgb2YgYXR0ZW50aW9uIHRoYXQgTGludXMKLXBheXMgdG8gc3BlY2lmaWMgcGF0Y2hlcyByZWNlaXZlZCBpbiBhIHB1bGwgb3BlcmF0aW9uIHZhcmllcy4gIEl0IGlzIGNsZWFyCi10aGF0LCBzb21ldGltZXMsIGhlIGxvb2tzIHF1aXRlIGNsb3NlbHkuICBCdXQsIGFzIGEgZ2VuZXJhbCBydWxlLCBMaW51cwotdHJ1c3RzIHRoZSBzdWJzeXN0ZW0gbWFpbnRhaW5lcnMgdG8gbm90IHNlbmQgYmFkIHBhdGNoZXMgdXBzdHJlYW0uCi0KLVN1YnN5c3RlbSBtYWludGFpbmVycywgaW4gdHVybiwgY2FuIHB1bGwgcGF0Y2hlcyBmcm9tIG90aGVyIG1haW50YWluZXJzLgotRm9yIGV4YW1wbGUsIHRoZSBuZXR3b3JraW5nIHRyZWUgaXMgYnVpbHQgZnJvbSBwYXRjaGVzIHdoaWNoIGFjY3VtdWxhdGVkCi1maXJzdCBpbiB0cmVlcyBkZWRpY2F0ZWQgdG8gbmV0d29yayBkZXZpY2UgZHJpdmVycywgd2lyZWxlc3MgbmV0d29ya2luZywKLWV0Yy4gIFRoaXMgY2hhaW4gb2YgcmVwb3NpdG9yaWVzIGNhbiBiZSBhcmJpdHJhcmlseSBsb25nLCB0aG91Z2ggaXQgcmFyZWx5Ci1leGNlZWRzIHR3byBvciB0aHJlZSBsaW5rcy4gIFNpbmNlIGVhY2ggbWFpbnRhaW5lciBpbiB0aGUgY2hhaW4gdHJ1c3RzCi10aG9zZSBtYW5hZ2luZyBsb3dlci1sZXZlbCB0cmVlcywgdGhpcyBwcm9jZXNzIGlzIGtub3duIGFzIHRoZSAiY2hhaW4gb2YKLXRydXN0LiIKLQotQ2xlYXJseSwgaW4gYSBzeXN0ZW0gbGlrZSB0aGlzLCBnZXR0aW5nIHBhdGNoZXMgaW50byB0aGUga2VybmVsIGRlcGVuZHMgb24KLWZpbmRpbmcgdGhlIHJpZ2h0IG1haW50YWluZXIuICBTZW5kaW5nIHBhdGNoZXMgZGlyZWN0bHkgdG8gTGludXMgaXMgbm90Ci1ub3JtYWxseSB0aGUgcmlnaHQgd2F5IHRvIGdvLgotCi0KLTIuNDogTkVYVCBUUkVFUwotCi1UaGUgY2hhaW4gb2Ygc3Vic3lzdGVtIHRyZWVzIGd1aWRlcyB0aGUgZmxvdyBvZiBwYXRjaGVzIGludG8gdGhlIGtlcm5lbCwKLWJ1dCBpdCBhbHNvIHJhaXNlcyBhbiBpbnRlcmVzdGluZyBxdWVzdGlvbjogd2hhdCBpZiBzb21lYm9keSB3YW50cyB0byBsb29rCi1hdCBhbGwgb2YgdGhlIHBhdGNoZXMgd2hpY2ggYXJlIGJlaW5nIHByZXBhcmVkIGZvciB0aGUgbmV4dCBtZXJnZSB3aW5kb3c/Ci1EZXZlbG9wZXJzIHdpbGwgYmUgaW50ZXJlc3RlZCBpbiB3aGF0IG90aGVyIGNoYW5nZXMgYXJlIHBlbmRpbmcgdG8gc2VlCi13aGV0aGVyIHRoZXJlIGFyZSBhbnkgY29uZmxpY3RzIHRvIHdvcnJ5IGFib3V0OyBhIHBhdGNoIHdoaWNoIGNoYW5nZXMgYQotY29yZSBrZXJuZWwgZnVuY3Rpb24gcHJvdG90eXBlLCBmb3IgZXhhbXBsZSwgd2lsbCBjb25mbGljdCB3aXRoIGFueSBvdGhlcgotcGF0Y2hlcyB3aGljaCB1c2UgdGhlIG9sZGVyIGZvcm0gb2YgdGhhdCBmdW5jdGlvbi4gIFJldmlld2VycyBhbmQgdGVzdGVycwotd2FudCBhY2Nlc3MgdG8gdGhlIGNoYW5nZXMgaW4gdGhlaXIgaW50ZWdyYXRlZCBmb3JtIGJlZm9yZSBhbGwgb2YgdGhvc2UKLWNoYW5nZXMgbGFuZCBpbiB0aGUgbWFpbmxpbmUga2VybmVsLiAgT25lIGNvdWxkIHB1bGwgY2hhbmdlcyBmcm9tIGFsbCBvZgotdGhlIGludGVyZXN0aW5nIHN1YnN5c3RlbSB0cmVlcywgYnV0IHRoYXQgd291bGQgYmUgYSBiaWcgYW5kIGVycm9yLXByb25lCi1qb2IuCi0KLVRoZSBhbnN3ZXIgY29tZXMgaW4gdGhlIGZvcm0gb2YgLW5leHQgdHJlZXMsIHdoZXJlIHN1YnN5c3RlbSB0cmVlcyBhcmUKLWNvbGxlY3RlZCBmb3IgdGVzdGluZyBhbmQgcmV2aWV3LiAgVGhlIG9sZGVyIG9mIHRoZXNlIHRyZWVzLCBtYWludGFpbmVkIGJ5Ci1BbmRyZXcgTW9ydG9uLCBpcyBjYWxsZWQgIi1tbSIgKGZvciBtZW1vcnkgbWFuYWdlbWVudCwgd2hpY2ggaXMgaG93IGl0IGdvdAotc3RhcnRlZCkuICBUaGUgLW1tIHRyZWUgaW50ZWdyYXRlcyBwYXRjaGVzIGZyb20gYSBsb25nIGxpc3Qgb2Ygc3Vic3lzdGVtCi10cmVlczsgaXQgYWxzbyBoYXMgc29tZSBwYXRjaGVzIGFpbWVkIGF0IGhlbHBpbmcgd2l0aCBkZWJ1Z2dpbmcuCi0KLUJleW9uZCB0aGF0LCAtbW0gY29udGFpbnMgYSBzaWduaWZpY2FudCBjb2xsZWN0aW9uIG9mIHBhdGNoZXMgd2hpY2ggaGF2ZQotYmVlbiBzZWxlY3RlZCBieSBBbmRyZXcgZGlyZWN0bHkuICBUaGVzZSBwYXRjaGVzIG1heSBoYXZlIGJlZW4gcG9zdGVkIG9uIGEKLW1haWxpbmcgbGlzdCwgb3IgdGhleSBtYXkgYXBwbHkgdG8gYSBwYXJ0IG9mIHRoZSBrZXJuZWwgZm9yIHdoaWNoIHRoZXJlIGlzCi1ubyBkZXNpZ25hdGVkIHN1YnN5c3RlbSB0cmVlLiAgQXMgYSByZXN1bHQsIC1tbSBvcGVyYXRlcyBhcyBhIHNvcnQgb2YKLXN1YnN5c3RlbSB0cmVlIG9mIGxhc3QgcmVzb3J0OyBpZiB0aGVyZSBpcyBubyBvdGhlciBvYnZpb3VzIHBhdGggZm9yIGEKLXBhdGNoIGludG8gdGhlIG1haW5saW5lLCBpdCBpcyBsaWtlbHkgdG8gZW5kIHVwIGluIC1tbS4gIE1pc2NlbGxhbmVvdXMKLXBhdGNoZXMgd2hpY2ggYWNjdW11bGF0ZSBpbiAtbW0gd2lsbCBldmVudHVhbGx5IGVpdGhlciBiZSBmb3J3YXJkZWQgb24gdG8KLWFuIGFwcHJvcHJpYXRlIHN1YnN5c3RlbSB0cmVlIG9yIGJlIHNlbnQgZGlyZWN0bHkgdG8gTGludXMuICBJbiBhIHR5cGljYWwKLWRldmVsb3BtZW50IGN5Y2xlLCBhcHByb3hpbWF0ZWx5IDUtMTAlIG9mIHRoZSBwYXRjaGVzIGdvaW5nIGludG8gdGhlCi1tYWlubGluZSBnZXQgdGhlcmUgdmlhIC1tbS4KLQotVGhlIGN1cnJlbnQgLW1tIHBhdGNoIGlzIGF2YWlsYWJsZSBpbiB0aGUgIm1tb3RtIiAoLW1tIG9mIHRoZSBtb21lbnQpCi1kaXJlY3RvcnkgYXQ6Ci0KLQlodHRwOi8vd3d3Lm96bGFicy5vcmcvfmFrcG0vbW1vdG0vCi0KLVVzZSBvZiB0aGUgTU1PVE0gdHJlZSBpcyBsaWtlbHkgdG8gYmUgYSBmcnVzdHJhdGluZyBleHBlcmllbmNlLCB0aG91Z2g7Ci10aGVyZSBpcyBhIGRlZmluaXRlIGNoYW5jZSB0aGF0IGl0IHdpbGwgbm90IGV2ZW4gY29tcGlsZS4KLQotVGhlIHByaW1hcnkgdHJlZSBmb3IgbmV4dC1jeWNsZSBwYXRjaCBtZXJnaW5nIGlzIGxpbnV4LW5leHQsIG1haW50YWluZWQgYnkKLVN0ZXBoZW4gUm90aHdlbGwuICBUaGUgbGludXgtbmV4dCB0cmVlIGlzLCBieSBkZXNpZ24sIGEgc25hcHNob3Qgb2Ygd2hhdAotdGhlIG1haW5saW5lIGlzIGV4cGVjdGVkIHRvIGxvb2sgbGlrZSBhZnRlciB0aGUgbmV4dCBtZXJnZSB3aW5kb3cgY2xvc2VzLgotTGludXgtbmV4dCB0cmVlcyBhcmUgYW5ub3VuY2VkIG9uIHRoZSBsaW51eC1rZXJuZWwgYW5kIGxpbnV4LW5leHQgbWFpbGluZwotbGlzdHMgd2hlbiB0aGV5IGFyZSBhc3NlbWJsZWQ7IHRoZXkgY2FuIGJlIGRvd25sb2FkZWQgZnJvbToKLQotCWh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgva2VybmVsL25leHQvCi0KLUxpbnV4LW5leHQgaGFzIGJlY29tZSBhbiBpbnRlZ3JhbCBwYXJ0IG9mIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvY2VzczsKLWFsbCBwYXRjaGVzIG1lcmdlZCBkdXJpbmcgYSBnaXZlbiBtZXJnZSB3aW5kb3cgc2hvdWxkIHJlYWxseSBoYXZlIGZvdW5kCi10aGVpciB3YXkgaW50byBsaW51eC1uZXh0IHNvbWUgdGltZSBiZWZvcmUgdGhlIG1lcmdlIHdpbmRvdyBvcGVucy4KLQotCi0yLjQuMTogU1RBR0lORyBUUkVFUwotCi1UaGUga2VybmVsIHNvdXJjZSB0cmVlIGNvbnRhaW5zIHRoZSBkcml2ZXJzL3N0YWdpbmcvIGRpcmVjdG9yeSwgd2hlcmUKLW1hbnkgc3ViLWRpcmVjdG9yaWVzIGZvciBkcml2ZXJzIG9yIGZpbGVzeXN0ZW1zIHRoYXQgYXJlIG9uIHRoZWlyIHdheSB0bwotYmVpbmcgYWRkZWQgdG8gdGhlIGtlcm5lbCB0cmVlIGxpdmUuICBUaGV5IHJlbWFpbiBpbiBkcml2ZXJzL3N0YWdpbmcgd2hpbGUKLXRoZXkgc3RpbGwgbmVlZCBtb3JlIHdvcms7IG9uY2UgY29tcGxldGUsIHRoZXkgY2FuIGJlIG1vdmVkIGludG8gdGhlCi1rZXJuZWwgcHJvcGVyLiAgVGhpcyBpcyBhIHdheSB0byBrZWVwIHRyYWNrIG9mIGRyaXZlcnMgdGhhdCBhcmVuJ3QKLXVwIHRvIExpbnV4IGtlcm5lbCBjb2Rpbmcgb3IgcXVhbGl0eSBzdGFuZGFyZHMsIGJ1dCBwZW9wbGUgbWF5IHdhbnQgdG8gdXNlCi10aGVtIGFuZCB0cmFjayBkZXZlbG9wbWVudC4KLQotR3JlZyBLcm9haC1IYXJ0bWFuIGN1cnJlbnRseSBtYWludGFpbnMgdGhlIHN0YWdpbmcgdHJlZS4gIERyaXZlcnMgdGhhdAotc3RpbGwgbmVlZCB3b3JrIGFyZSBzZW50IHRvIGhpbSwgd2l0aCBlYWNoIGRyaXZlciBoYXZpbmcgaXRzIG93bgotc3ViZGlyZWN0b3J5IGluIGRyaXZlcnMvc3RhZ2luZy8uICBBbG9uZyB3aXRoIHRoZSBkcml2ZXIgc291cmNlIGZpbGVzLCBhCi1UT0RPIGZpbGUgc2hvdWxkIGJlIHByZXNlbnQgaW4gdGhlIGRpcmVjdG9yeSBhcyB3ZWxsLiAgVGhlIFRPRE8gZmlsZSBsaXN0cwotdGhlIHBlbmRpbmcgd29yayB0aGF0IHRoZSBkcml2ZXIgbmVlZHMgZm9yIGFjY2VwdGFuY2UgaW50byB0aGUga2VybmVsCi1wcm9wZXIsIGFzIHdlbGwgYXMgYSBsaXN0IG9mIHBlb3BsZSB0aGF0IHNob3VsZCBiZSBDYydkIGZvciBhbnkgcGF0Y2hlcyB0bwotdGhlIGRyaXZlci4gIEN1cnJlbnQgcnVsZXMgcmVxdWlyZSB0aGF0IGRyaXZlcnMgY29udHJpYnV0ZWQgdG8gc3RhZ2luZwotbXVzdCwgYXQgYSBtaW5pbXVtLCBjb21waWxlIHByb3Blcmx5LgotCi1TdGFnaW5nIGNhbiBiZSBhIHJlbGF0aXZlbHkgZWFzeSB3YXkgdG8gZ2V0IG5ldyBkcml2ZXJzIGludG8gdGhlIG1haW5saW5lCi13aGVyZSwgd2l0aCBsdWNrLCB0aGV5IHdpbGwgY29tZSB0byB0aGUgYXR0ZW50aW9uIG9mIG90aGVyIGRldmVsb3BlcnMgYW5kCi1pbXByb3ZlIHF1aWNrbHkuICBFbnRyeSBpbnRvIHN0YWdpbmcgaXMgbm90IHRoZSBlbmQgb2YgdGhlIHN0b3J5LCB0aG91Z2g7Ci1jb2RlIGluIHN0YWdpbmcgd2hpY2ggaXMgbm90IHNlZWluZyByZWd1bGFyIHByb2dyZXNzIHdpbGwgZXZlbnR1YWxseSBiZQotcmVtb3ZlZC4gIERpc3RyaWJ1dG9ycyBhbHNvIHRlbmQgdG8gYmUgcmVsYXRpdmVseSByZWx1Y3RhbnQgdG8gZW5hYmxlCi1zdGFnaW5nIGRyaXZlcnMuICBTbyBzdGFnaW5nIGlzLCBhdCBiZXN0LCBhIHN0b3Agb24gdGhlIHdheSB0b3dhcmQgYmVjb21pbmcKLWEgcHJvcGVyIG1haW5saW5lIGRyaXZlci4KLQotCi0yLjU6IFRPT0xTCi0KLUFzIGNhbiBiZSBzZWVuIGZyb20gdGhlIGFib3ZlIHRleHQsIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyBkZXBlbmRzCi1oZWF2aWx5IG9uIHRoZSBhYmlsaXR5IHRvIGhlcmQgY29sbGVjdGlvbnMgb2YgcGF0Y2hlcyBpbiB2YXJpb3VzCi1kaXJlY3Rpb25zLiAgVGhlIHdob2xlIHRoaW5nIHdvdWxkIG5vdCB3b3JrIGFueXdoZXJlIG5lYXIgYXMgd2VsbCBhcyBpdAotZG9lcyB3aXRob3V0IHN1aXRhYmx5IHBvd2VyZnVsIHRvb2xzLiAgVHV0b3JpYWxzIG9uIGhvdyB0byB1c2UgdGhlc2UgdG9vbHMKLWFyZSB3ZWxsIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyBkb2N1bWVudCwgYnV0IHRoZXJlIGlzIHNwYWNlIGZvciBhIGZldwotcG9pbnRlcnMuCi0KLUJ5IGZhciB0aGUgZG9taW5hbnQgc291cmNlIGNvZGUgbWFuYWdlbWVudCBzeXN0ZW0gdXNlZCBieSB0aGUga2VybmVsCi1jb21tdW5pdHkgaXMgZ2l0LiAgR2l0IGlzIG9uZSBvZiBhIG51bWJlciBvZiBkaXN0cmlidXRlZCB2ZXJzaW9uIGNvbnRyb2wKLXN5c3RlbXMgYmVpbmcgZGV2ZWxvcGVkIGluIHRoZSBmcmVlIHNvZnR3YXJlIGNvbW11bml0eS4gIEl0IGlzIHdlbGwgdHVuZWQKLWZvciBrZXJuZWwgZGV2ZWxvcG1lbnQsIGluIHRoYXQgaXQgcGVyZm9ybXMgcXVpdGUgd2VsbCB3aGVuIGRlYWxpbmcgd2l0aAotbGFyZ2UgcmVwb3NpdG9yaWVzIGFuZCBsYXJnZSBudW1iZXJzIG9mIHBhdGNoZXMuICBJdCBhbHNvIGhhcyBhIHJlcHV0YXRpb24KLWZvciBiZWluZyBkaWZmaWN1bHQgdG8gbGVhcm4gYW5kIHVzZSwgdGhvdWdoIGl0IGhhcyBnb3R0ZW4gYmV0dGVyIG92ZXIKLXRpbWUuICBTb21lIHNvcnQgb2YgZmFtaWxpYXJpdHkgd2l0aCBnaXQgaXMgYWxtb3N0IGEgcmVxdWlyZW1lbnQgZm9yIGtlcm5lbAotZGV2ZWxvcGVyczsgZXZlbiBpZiB0aGV5IGRvIG5vdCB1c2UgaXQgZm9yIHRoZWlyIG93biB3b3JrLCB0aGV5J2xsIG5lZWQgZ2l0Ci10byBrZWVwIHVwIHdpdGggd2hhdCBvdGhlciBkZXZlbG9wZXJzIChhbmQgdGhlIG1haW5saW5lKSBhcmUgZG9pbmcuCi0KLUdpdCBpcyBub3cgcGFja2FnZWQgYnkgYWxtb3N0IGFsbCBMaW51eCBkaXN0cmlidXRpb25zLiAgVGhlcmUgaXMgYSBob21lCi1wYWdlIGF0OgotCi0JaHR0cDovL2dpdC1zY20uY29tLwotCi1UaGF0IHBhZ2UgaGFzIHBvaW50ZXJzIHRvIGRvY3VtZW50YXRpb24gYW5kIHR1dG9yaWFscy4KLQotQW1vbmcgdGhlIGtlcm5lbCBkZXZlbG9wZXJzIHdobyBkbyBub3QgdXNlIGdpdCwgdGhlIG1vc3QgcG9wdWxhciBjaG9pY2UgaXMKLWFsbW9zdCBjZXJ0YWlubHkgTWVyY3VyaWFsOgotCi0JaHR0cDovL3d3dy5zZWxlbmljLmNvbS9tZXJjdXJpYWwvCi0KLU1lcmN1cmlhbCBzaGFyZXMgbWFueSBmZWF0dXJlcyB3aXRoIGdpdCwgYnV0IGl0IHByb3ZpZGVzIGFuIGludGVyZmFjZSB3aGljaAotbWFueSBmaW5kIGVhc2llciB0byB1c2UuCi0KLVRoZSBvdGhlciB0b29sIHdvcnRoIGtub3dpbmcgYWJvdXQgaXMgUXVpbHQ6Ci0KLQlodHRwOi8vc2F2YW5uYWgubm9uZ251Lm9yZy9wcm9qZWN0cy9xdWlsdC8KLQotUXVpbHQgaXMgYSBwYXRjaCBtYW5hZ2VtZW50IHN5c3RlbSwgcmF0aGVyIHRoYW4gYSBzb3VyY2UgY29kZSBtYW5hZ2VtZW50Ci1zeXN0ZW0uICBJdCBkb2VzIG5vdCB0cmFjayBoaXN0b3J5IG92ZXIgdGltZTsgaXQgaXMsIGluc3RlYWQsIG9yaWVudGVkCi10b3dhcmQgdHJhY2tpbmcgYSBzcGVjaWZpYyBzZXQgb2YgY2hhbmdlcyBhZ2FpbnN0IGFuIGV2b2x2aW5nIGNvZGUgYmFzZS4KLVNvbWUgbWFqb3Igc3Vic3lzdGVtIG1haW50YWluZXJzIHVzZSBxdWlsdCB0byBtYW5hZ2UgcGF0Y2hlcyBpbnRlbmRlZCB0byBnbwotdXBzdHJlYW0uICBGb3IgdGhlIG1hbmFnZW1lbnQgb2YgY2VydGFpbiBraW5kcyBvZiB0cmVlcyAoLW1tLCBmb3IgZXhhbXBsZSksCi1xdWlsdCBpcyB0aGUgYmVzdCB0b29sIGZvciB0aGUgam9iLgotCi0KLTIuNjogTUFJTElORyBMSVNUUwotCi1BIGdyZWF0IGRlYWwgb2YgTGludXgga2VybmVsIGRldmVsb3BtZW50IHdvcmsgaXMgZG9uZSBieSB3YXkgb2YgbWFpbGluZwotbGlzdHMuICBJdCBpcyBoYXJkIHRvIGJlIGEgZnVsbHktZnVuY3Rpb25pbmcgbWVtYmVyIG9mIHRoZSBjb21tdW5pdHkKLXdpdGhvdXQgam9pbmluZyBhdCBsZWFzdCBvbmUgbGlzdCBzb21ld2hlcmUuICBCdXQgTGludXggbWFpbGluZyBsaXN0cyBhbHNvCi1yZXByZXNlbnQgYSBwb3RlbnRpYWwgaGF6YXJkIHRvIGRldmVsb3BlcnMsIHdobyByaXNrIGdldHRpbmcgYnVyaWVkIHVuZGVyIGEKLWxvYWQgb2YgZWxlY3Ryb25pYyBtYWlsLCBydW5uaW5nIGFmb3VsIG9mIHRoZSBjb252ZW50aW9ucyB1c2VkIG9uIHRoZSBMaW51eAotbGlzdHMsIG9yIGJvdGguCi0KLU1vc3Qga2VybmVsIG1haWxpbmcgbGlzdHMgYXJlIHJ1biBvbiB2Z2VyLmtlcm5lbC5vcmc7IHRoZSBtYXN0ZXIgbGlzdCBjYW4KLWJlIGZvdW5kIGF0OgotCi0JaHR0cDovL3ZnZXIua2VybmVsLm9yZy92Z2VyLWxpc3RzLmh0bWwKLQotVGhlcmUgYXJlIGxpc3RzIGhvc3RlZCBlbHNld2hlcmUsIHRob3VnaDsgYSBudW1iZXIgb2YgdGhlbSBhcmUgYXQKLWxpc3RzLnJlZGhhdC5jb20uCi0KLVRoZSBjb3JlIG1haWxpbmcgbGlzdCBmb3Iga2VybmVsIGRldmVsb3BtZW50IGlzLCBvZiBjb3Vyc2UsIGxpbnV4LWtlcm5lbC4KLVRoaXMgbGlzdCBpcyBhbiBpbnRpbWlkYXRpbmcgcGxhY2UgdG8gYmU7IHZvbHVtZSBjYW4gcmVhY2ggNTAwIG1lc3NhZ2VzIHBlcgotZGF5LCB0aGUgYW1vdW50IG9mIG5vaXNlIGlzIGhpZ2gsIHRoZSBjb252ZXJzYXRpb24gY2FuIGJlIHNldmVyZWx5Ci10ZWNobmljYWwsIGFuZCBwYXJ0aWNpcGFudHMgYXJlIG5vdCBhbHdheXMgY29uY2VybmVkIHdpdGggc2hvd2luZyBhIGhpZ2gKLWRlZ3JlZSBvZiBwb2xpdGVuZXNzLiAgQnV0IHRoZXJlIGlzIG5vIG90aGVyIHBsYWNlIHdoZXJlIHRoZSBrZXJuZWwKLWRldmVsb3BtZW50IGNvbW11bml0eSBjb21lcyB0b2dldGhlciBhcyBhIHdob2xlOyBkZXZlbG9wZXJzIHdobyBhdm9pZCB0aGlzCi1saXN0IHdpbGwgbWlzcyBpbXBvcnRhbnQgaW5mb3JtYXRpb24uCi0KLVRoZXJlIGFyZSBhIGZldyBoaW50cyB3aGljaCBjYW4gaGVscCB3aXRoIGxpbnV4LWtlcm5lbCBzdXJ2aXZhbDoKLQotLSBIYXZlIHRoZSBsaXN0IGRlbGl2ZXJlZCB0byBhIHNlcGFyYXRlIGZvbGRlciwgcmF0aGVyIHRoYW4geW91ciBtYWluCi0gIG1haWxib3guICBPbmUgbXVzdCBiZSBhYmxlIHRvIGlnbm9yZSB0aGUgc3RyZWFtIGZvciBzdXN0YWluZWQgcGVyaW9kcyBvZgotICB0aW1lLgotCi0tIERvIG5vdCB0cnkgdG8gZm9sbG93IGV2ZXJ5IGNvbnZlcnNhdGlvbiAtIG5vYm9keSBlbHNlIGRvZXMuICBJdCBpcwotICBpbXBvcnRhbnQgdG8gZmlsdGVyIG9uIGJvdGggdGhlIHRvcGljIG9mIGludGVyZXN0ICh0aG91Z2ggbm90ZSB0aGF0Ci0gIGxvbmctcnVubmluZyBjb252ZXJzYXRpb25zIGNhbiBkcmlmdCBhd2F5IGZyb20gdGhlIG9yaWdpbmFsIHN1YmplY3QKLSAgd2l0aG91dCBjaGFuZ2luZyB0aGUgZW1haWwgc3ViamVjdCBsaW5lKSBhbmQgdGhlIHBlb3BsZSB3aG8gYXJlCi0gIHBhcnRpY2lwYXRpbmcuCi0KLS0gRG8gbm90IGZlZWQgdGhlIHRyb2xscy4gIElmIHNvbWVib2R5IGlzIHRyeWluZyB0byBzdGlyIHVwIGFuIGFuZ3J5Ci0gIHJlc3BvbnNlLCBpZ25vcmUgdGhlbS4KLQotLSBXaGVuIHJlc3BvbmRpbmcgdG8gbGludXgta2VybmVsIGVtYWlsIChvciB0aGF0IG9uIG90aGVyIGxpc3RzKSBwcmVzZXJ2ZQotICB0aGUgQ2M6IGhlYWRlciBmb3IgYWxsIGludm9sdmVkLiAgSW4gdGhlIGFic2VuY2Ugb2YgYSBzdHJvbmcgcmVhc29uIChzdWNoCi0gIGFzIGFuIGV4cGxpY2l0IHJlcXVlc3QpLCB5b3Ugc2hvdWxkIG5ldmVyIHJlbW92ZSByZWNpcGllbnRzLiAgQWx3YXlzIG1ha2UKLSAgc3VyZSB0aGF0IHRoZSBwZXJzb24geW91IGFyZSByZXNwb25kaW5nIHRvIGlzIGluIHRoZSBDYzogbGlzdC4gIFRoaXMKLSAgY29udmVudGlvbiBhbHNvIG1ha2VzIGl0IHVubmVjZXNzYXJ5IHRvIGV4cGxpY2l0bHkgYXNrIHRvIGJlIGNvcGllZCBvbgotICByZXBsaWVzIHRvIHlvdXIgcG9zdGluZ3MuCi0KLS0gU2VhcmNoIHRoZSBsaXN0IGFyY2hpdmVzIChhbmQgdGhlIG5ldCBhcyBhIHdob2xlKSBiZWZvcmUgYXNraW5nCi0gIHF1ZXN0aW9ucy4gIFNvbWUgZGV2ZWxvcGVycyBjYW4gZ2V0IGltcGF0aWVudCB3aXRoIHBlb3BsZSB3aG8gY2xlYXJseQotICBoYXZlIG5vdCBkb25lIHRoZWlyIGhvbWV3b3JrLgotCi0tIEF2b2lkIHRvcC1wb3N0aW5nICh0aGUgcHJhY3RpY2Ugb2YgcHV0dGluZyB5b3VyIGFuc3dlciBhYm92ZSB0aGUgcXVvdGVkCi0gIHRleHQgeW91IGFyZSByZXNwb25kaW5nIHRvKS4gIEl0IG1ha2VzIHlvdXIgcmVzcG9uc2UgaGFyZGVyIHRvIHJlYWQgYW5kCi0gIG1ha2VzIGEgcG9vciBpbXByZXNzaW9uLgotCi0tIEFzayBvbiB0aGUgY29ycmVjdCBtYWlsaW5nIGxpc3QuICBMaW51eC1rZXJuZWwgbWF5IGJlIHRoZSBnZW5lcmFsIG1lZXRpbmcKLSAgcG9pbnQsIGJ1dCBpdCBpcyBub3QgdGhlIGJlc3QgcGxhY2UgdG8gZmluZCBkZXZlbG9wZXJzIGZyb20gYWxsCi0gIHN1YnN5c3RlbXMuCi0KLVRoZSBsYXN0IHBvaW50IC0gZmluZGluZyB0aGUgY29ycmVjdCBtYWlsaW5nIGxpc3QgLSBpcyBhIGNvbW1vbiBwbGFjZSBmb3IKLWJlZ2lubmluZyBkZXZlbG9wZXJzIHRvIGdvIHdyb25nLiAgU29tZWJvZHkgd2hvIGFza3MgYSBuZXR3b3JraW5nLXJlbGF0ZWQKLXF1ZXN0aW9uIG9uIGxpbnV4LWtlcm5lbCB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgcmVjZWl2ZSBhIHBvbGl0ZSBzdWdnZXN0aW9uCi10byBhc2sgb24gdGhlIG5ldGRldiBsaXN0IGluc3RlYWQsIGFzIHRoYXQgaXMgdGhlIGxpc3QgZnJlcXVlbnRlZCBieSBtb3N0Ci1uZXR3b3JraW5nIGRldmVsb3BlcnMuICBPdGhlciBsaXN0cyBleGlzdCBmb3IgdGhlIFNDU0ksIHZpZGVvNGxpbnV4LCBJREUsCi1maWxlc3lzdGVtLCBldGMuIHN1YnN5c3RlbXMuICBUaGUgYmVzdCBwbGFjZSB0byBsb29rIGZvciBtYWlsaW5nIGxpc3RzIGlzCi1pbiB0aGUgTUFJTlRBSU5FUlMgZmlsZSBwYWNrYWdlZCB3aXRoIHRoZSBrZXJuZWwgc291cmNlLgotCi0KLTIuNzogR0VUVElORyBTVEFSVEVEIFdJVEggS0VSTkVMIERFVkVMT1BNRU5UCi0KLVF1ZXN0aW9ucyBhYm91dCBob3cgdG8gZ2V0IHN0YXJ0ZWQgd2l0aCB0aGUga2VybmVsIGRldmVsb3BtZW50IHByb2Nlc3MgYXJlCi1jb21tb24gLSBmcm9tIGJvdGggaW5kaXZpZHVhbHMgYW5kIGNvbXBhbmllcy4gIEVxdWFsbHkgY29tbW9uIGFyZSBtaXNzdGVwcwotd2hpY2ggbWFrZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZWxhdGlvbnNoaXAgaGFyZGVyIHRoYW4gaXQgaGFzIHRvIGJlLgotCi1Db21wYW5pZXMgb2Z0ZW4gbG9vayB0byBoaXJlIHdlbGwta25vd24gZGV2ZWxvcGVycyB0byBnZXQgYSBkZXZlbG9wbWVudAotZ3JvdXAgc3RhcnRlZC4gIFRoaXMgY2FuLCBpbiBmYWN0LCBiZSBhbiBlZmZlY3RpdmUgdGVjaG5pcXVlLiAgQnV0IGl0IGFsc28KLXRlbmRzIHRvIGJlIGV4cGVuc2l2ZSBhbmQgZG9lcyBub3QgZG8gbXVjaCB0byBncm93IHRoZSBwb29sIG9mIGV4cGVyaWVuY2VkCi1rZXJuZWwgZGV2ZWxvcGVycy4gIEl0IGlzIHBvc3NpYmxlIHRvIGJyaW5nIGluLWhvdXNlIGRldmVsb3BlcnMgdXAgdG8gc3BlZWQKLW9uIExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudCwgZ2l2ZW4gdGhlIGludmVzdG1lbnQgb2YgYSBiaXQgb2YgdGltZS4gIFRha2luZwotdGhpcyB0aW1lIGNhbiBlbmRvdyBhbiBlbXBsb3llciB3aXRoIGEgZ3JvdXAgb2YgZGV2ZWxvcGVycyB3aG8gdW5kZXJzdGFuZAotdGhlIGtlcm5lbCBhbmQgdGhlIGNvbXBhbnkgYm90aCwgYW5kIHdobyBjYW4gaGVscCB0byB0cmFpbiBvdGhlcnMgYXMgd2VsbC4KLU92ZXIgdGhlIG1lZGl1bSB0ZXJtLCB0aGlzIGlzIG9mdGVuIHRoZSBtb3JlIHByb2ZpdGFibGUgYXBwcm9hY2guCi0KLUluZGl2aWR1YWwgZGV2ZWxvcGVycyBhcmUgb2Z0ZW4sIHVuZGVyc3RhbmRhYmx5LCBhdCBhIGxvc3MgZm9yIGEgcGxhY2UgdG8KLXN0YXJ0LiAgQmVnaW5uaW5nIHdpdGggYSBsYXJnZSBwcm9qZWN0IGNhbiBiZSBpbnRpbWlkYXRpbmc7IG9uZSBvZnRlbiB3YW50cwotdG8gdGVzdCB0aGUgd2F0ZXJzIHdpdGggc29tZXRoaW5nIHNtYWxsZXIgZmlyc3QuICBUaGlzIGlzIHRoZSBwb2ludCB3aGVyZQotc29tZSBkZXZlbG9wZXJzIGp1bXAgaW50byB0aGUgY3JlYXRpb24gb2YgcGF0Y2hlcyBmaXhpbmcgc3BlbGxpbmcgZXJyb3JzIG9yCi1taW5vciBjb2Rpbmcgc3R5bGUgaXNzdWVzLiAgVW5mb3J0dW5hdGVseSwgc3VjaCBwYXRjaGVzIGNyZWF0ZSBhIGxldmVsIG9mCi1ub2lzZSB3aGljaCBpcyBkaXN0cmFjdGluZyBmb3IgdGhlIGRldmVsb3BtZW50IGNvbW11bml0eSBhcyBhIHdob2xlLCBzbywKLWluY3JlYXNpbmdseSwgdGhleSBhcmUgbG9va2VkIGRvd24gdXBvbi4gIE5ldyBkZXZlbG9wZXJzIHdpc2hpbmcgdG8KLWludHJvZHVjZSB0aGVtc2VsdmVzIHRvIHRoZSBjb21tdW5pdHkgd2lsbCBub3QgZ2V0IHRoZSBzb3J0IG9mIHJlY2VwdGlvbgotdGhleSB3aXNoIGZvciBieSB0aGVzZSBtZWFucy4KLQotQW5kcmV3IE1vcnRvbiBnaXZlcyB0aGlzIGFkdmljZSBmb3IgYXNwaXJpbmcga2VybmVsIGRldmVsb3BlcnMKLQotCVRoZSAjMSBwcm9qZWN0IGZvciBhbGwga2VybmVsIGJlZ2lubmVycyBzaG91bGQgc3VyZWx5IGJlICJtYWtlIHN1cmUKLQl0aGF0IHRoZSBrZXJuZWwgcnVucyBwZXJmZWN0bHkgYXQgYWxsIHRpbWVzIG9uIGFsbCBtYWNoaW5lcyB3aGljaAotCXlvdSBjYW4gbGF5IHlvdXIgaGFuZHMgb24iLiAgVXN1YWxseSB0aGUgd2F5IHRvIGRvIHRoaXMgaXMgdG8gd29yawotCXdpdGggb3RoZXJzIG9uIGdldHRpbmcgdGhpbmdzIGZpeGVkIHVwICh0aGlzIGNhbiByZXF1aXJlCi0JcGVyc2lzdGVuY2UhKSBidXQgdGhhdCdzIGZpbmUgLSBpdCdzIGEgcGFydCBvZiBrZXJuZWwgZGV2ZWxvcG1lbnQuCi0KLShodHRwOi8vbHduLm5ldC9BcnRpY2xlcy8yODM5ODIvKS4KLQotSW4gdGhlIGFic2VuY2Ugb2Ygb2J2aW91cyBwcm9ibGVtcyB0byBmaXgsIGRldmVsb3BlcnMgYXJlIGFkdmlzZWQgdG8gbG9vawotYXQgdGhlIGN1cnJlbnQgbGlzdHMgb2YgcmVncmVzc2lvbnMgYW5kIG9wZW4gYnVncyBpbiBnZW5lcmFsLiAgVGhlcmUgaXMKLW5ldmVyIGFueSBzaG9ydGFnZSBvZiBpc3N1ZXMgaW4gbmVlZCBvZiBmaXhpbmc7IGJ5IGFkZHJlc3NpbmcgdGhlc2UgaXNzdWVzLAotZGV2ZWxvcGVycyB3aWxsIGdhaW4gZXhwZXJpZW5jZSB3aXRoIHRoZSBwcm9jZXNzIHdoaWxlLCBhdCB0aGUgc2FtZSB0aW1lLAotYnVpbGRpbmcgcmVzcGVjdCB3aXRoIHRoZSByZXN0IG9mIHRoZSBkZXZlbG9wbWVudCBjb21tdW5pdHkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvMi5Qcm9jZXNzLnJzdCBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy8yLlByb2Nlc3MucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNTU2MWIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvMi5Qcm9jZXNzLnJzdApAQCAtMCwwICsxLDQ5NyBAQAorLi4gX2RldmVsb3BtZW50X3Byb2Nlc3M6CisKK0hvdyB0aGUgZGV2ZWxvcG1lbnQgcHJvY2VzcyB3b3JrcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0xpbnV4IGtlcm5lbCBkZXZlbG9wbWVudCBpbiB0aGUgZWFybHkgMTk5MCdzIHdhcyBhIHByZXR0eSBsb29zZSBhZmZhaXIsCit3aXRoIHJlbGF0aXZlbHkgc21hbGwgbnVtYmVycyBvZiB1c2VycyBhbmQgZGV2ZWxvcGVycyBpbnZvbHZlZC4gIFdpdGggYQordXNlciBiYXNlIGluIHRoZSBtaWxsaW9ucyBhbmQgd2l0aCBzb21lIDIsMDAwIGRldmVsb3BlcnMgaW52b2x2ZWQgb3ZlciB0aGUKK2NvdXJzZSBvZiBvbmUgeWVhciwgdGhlIGtlcm5lbCBoYXMgc2luY2UgaGFkIHRvIGV2b2x2ZSBhIG51bWJlciBvZgorcHJvY2Vzc2VzIHRvIGtlZXAgZGV2ZWxvcG1lbnQgaGFwcGVuaW5nIHNtb290aGx5LiAgQSBzb2xpZCB1bmRlcnN0YW5kaW5nIG9mCitob3cgdGhlIHByb2Nlc3Mgd29ya3MgaXMgcmVxdWlyZWQgaW4gb3JkZXIgdG8gYmUgYW4gZWZmZWN0aXZlIHBhcnQgb2YgaXQuCisKK1RoZSBiaWcgcGljdHVyZQorLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBrZXJuZWwgZGV2ZWxvcGVycyB1c2UgYSBsb29zZWx5IHRpbWUtYmFzZWQgcmVsZWFzZSBwcm9jZXNzLCB3aXRoIGEgbmV3CittYWpvciBrZXJuZWwgcmVsZWFzZSBoYXBwZW5pbmcgZXZlcnkgdHdvIG9yIHRocmVlIG1vbnRocy4gIFRoZSByZWNlbnQKK3JlbGVhc2UgaGlzdG9yeSBsb29rcyBsaWtlIHRoaXM6CisKKwk9PT09PT0gID09PT09PT09PT09PT09PT09CisJMi42LjM4CU1hcmNoIDE0LCAyMDExCisJMi42LjM3CUphbnVhcnkgNCwgMjAxMQorCTIuNi4zNglPY3RvYmVyIDIwLCAyMDEwCisJMi42LjM1CUF1Z3VzdCAxLCAyMDEwCisJMi42LjM0CU1heSAxNSwgMjAxMAorCTIuNi4zMwlGZWJydWFyeSAyNCwgMjAxMAorCT09PT09PSAgPT09PT09PT09PT09PT09PT0KKworRXZlcnkgMi42LnggcmVsZWFzZSBpcyBhIG1ham9yIGtlcm5lbCByZWxlYXNlIHdpdGggbmV3IGZlYXR1cmVzLCBpbnRlcm5hbAorQVBJIGNoYW5nZXMsIGFuZCBtb3JlLiAgQSB0eXBpY2FsIDIuNiByZWxlYXNlIGNhbiBjb250YWluIG5lYXJseSAxMCwwMDAKK2NoYW5nZXNldHMgd2l0aCBjaGFuZ2VzIHRvIHNldmVyYWwgaHVuZHJlZCB0aG91c2FuZCBsaW5lcyBvZiBjb2RlLiAgMi42IGlzCit0aHVzIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgTGludXgga2VybmVsIGRldmVsb3BtZW50OyB0aGUga2VybmVsIHVzZXMgYQorcm9sbGluZyBkZXZlbG9wbWVudCBtb2RlbCB3aGljaCBpcyBjb250aW51YWxseSBpbnRlZ3JhdGluZyBtYWpvciBjaGFuZ2VzLgorCitBIHJlbGF0aXZlbHkgc3RyYWlnaHRmb3J3YXJkIGRpc2NpcGxpbmUgaXMgZm9sbG93ZWQgd2l0aCByZWdhcmQgdG8gdGhlCittZXJnaW5nIG9mIHBhdGNoZXMgZm9yIGVhY2ggcmVsZWFzZS4gIEF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBkZXZlbG9wbWVudAorY3ljbGUsIHRoZSAibWVyZ2Ugd2luZG93IiBpcyBzYWlkIHRvIGJlIG9wZW4uICBBdCB0aGF0IHRpbWUsIGNvZGUgd2hpY2ggaXMKK2RlZW1lZCB0byBiZSBzdWZmaWNpZW50bHkgc3RhYmxlIChhbmQgd2hpY2ggaXMgYWNjZXB0ZWQgYnkgdGhlIGRldmVsb3BtZW50Citjb21tdW5pdHkpIGlzIG1lcmdlZCBpbnRvIHRoZSBtYWlubGluZSBrZXJuZWwuICBUaGUgYnVsayBvZiBjaGFuZ2VzIGZvciBhCituZXcgZGV2ZWxvcG1lbnQgY3ljbGUgKGFuZCBhbGwgb2YgdGhlIG1ham9yIGNoYW5nZXMpIHdpbGwgYmUgbWVyZ2VkIGR1cmluZwordGhpcyB0aW1lLCBhdCBhIHJhdGUgYXBwcm9hY2hpbmcgMSwwMDAgY2hhbmdlcyAoInBhdGNoZXMsIiBvciAiY2hhbmdlc2V0cyIpCitwZXIgZGF5LgorCisoQXMgYW4gYXNpZGUsIGl0IGlzIHdvcnRoIG5vdGluZyB0aGF0IHRoZSBjaGFuZ2VzIGludGVncmF0ZWQgZHVyaW5nIHRoZQorbWVyZ2Ugd2luZG93IGRvIG5vdCBjb21lIG91dCBvZiB0aGluIGFpcjsgdGhleSBoYXZlIGJlZW4gY29sbGVjdGVkLCB0ZXN0ZWQsCithbmQgc3RhZ2VkIGFoZWFkIG9mIHRpbWUuICBIb3cgdGhhdCBwcm9jZXNzIHdvcmtzIHdpbGwgYmUgZGVzY3JpYmVkIGluCitkZXRhaWwgbGF0ZXIgb24pLgorCitUaGUgbWVyZ2Ugd2luZG93IGxhc3RzIGZvciBhcHByb3hpbWF0ZWx5IHR3byB3ZWVrcy4gIEF0IHRoZSBlbmQgb2YgdGhpcwordGltZSwgTGludXMgVG9ydmFsZHMgd2lsbCBkZWNsYXJlIHRoYXQgdGhlIHdpbmRvdyBpcyBjbG9zZWQgYW5kIHJlbGVhc2UgdGhlCitmaXJzdCBvZiB0aGUgInJjIiBrZXJuZWxzLiAgRm9yIHRoZSBrZXJuZWwgd2hpY2ggaXMgZGVzdGluZWQgdG8gYmUgMi42LjQwLAorZm9yIGV4YW1wbGUsIHRoZSByZWxlYXNlIHdoaWNoIGhhcHBlbnMgYXQgdGhlIGVuZCBvZiB0aGUgbWVyZ2Ugd2luZG93IHdpbGwKK2JlIGNhbGxlZCAyLjYuNDAtcmMxLiAgVGhlIC1yYzEgcmVsZWFzZSBpcyB0aGUgc2lnbmFsIHRoYXQgdGhlIHRpbWUgdG8KK21lcmdlIG5ldyBmZWF0dXJlcyBoYXMgcGFzc2VkLCBhbmQgdGhhdCB0aGUgdGltZSB0byBzdGFiaWxpemUgdGhlIG5leHQKK2tlcm5lbCBoYXMgYmVndW4uCisKK092ZXIgdGhlIG5leHQgc2l4IHRvIHRlbiB3ZWVrcywgb25seSBwYXRjaGVzIHdoaWNoIGZpeCBwcm9ibGVtcyBzaG91bGQgYmUKK3N1Ym1pdHRlZCB0byB0aGUgbWFpbmxpbmUuICBPbiBvY2Nhc2lvbiBhIG1vcmUgc2lnbmlmaWNhbnQgY2hhbmdlIHdpbGwgYmUKK2FsbG93ZWQsIGJ1dCBzdWNoIG9jY2FzaW9ucyBhcmUgcmFyZTsgZGV2ZWxvcGVycyB3aG8gdHJ5IHRvIG1lcmdlIG5ldworZmVhdHVyZXMgb3V0c2lkZSBvZiB0aGUgbWVyZ2Ugd2luZG93IHRlbmQgdG8gZ2V0IGFuIHVuZnJpZW5kbHkgcmVjZXB0aW9uLgorQXMgYSBnZW5lcmFsIHJ1bGUsIGlmIHlvdSBtaXNzIHRoZSBtZXJnZSB3aW5kb3cgZm9yIGEgZ2l2ZW4gZmVhdHVyZSwgdGhlCitiZXN0IHRoaW5nIHRvIGRvIGlzIHRvIHdhaXQgZm9yIHRoZSBuZXh0IGRldmVsb3BtZW50IGN5Y2xlLiAgKEFuIG9jY2FzaW9uYWwKK2V4Y2VwdGlvbiBpcyBtYWRlIGZvciBkcml2ZXJzIGZvciBwcmV2aW91c2x5LXVuc3VwcG9ydGVkIGhhcmR3YXJlOyBpZiB0aGV5Cit0b3VjaCBubyBpbi10cmVlIGNvZGUsIHRoZXkgY2Fubm90IGNhdXNlIHJlZ3Jlc3Npb25zIGFuZCBzaG91bGQgYmUgc2FmZSB0bworYWRkIGF0IGFueSB0aW1lKS4KKworQXMgZml4ZXMgbWFrZSB0aGVpciB3YXkgaW50byB0aGUgbWFpbmxpbmUsIHRoZSBwYXRjaCByYXRlIHdpbGwgc2xvdyBvdmVyCit0aW1lLiAgTGludXMgcmVsZWFzZXMgbmV3IC1yYyBrZXJuZWxzIGFib3V0IG9uY2UgYSB3ZWVrOyBhIG5vcm1hbCBzZXJpZXMKK3dpbGwgZ2V0IHVwIHRvIHNvbWV3aGVyZSBiZXR3ZWVuIC1yYzYgYW5kIC1yYzkgYmVmb3JlIHRoZSBrZXJuZWwgaXMKK2NvbnNpZGVyZWQgdG8gYmUgc3VmZmljaWVudGx5IHN0YWJsZSBhbmQgdGhlIGZpbmFsIDIuNi54IHJlbGVhc2UgaXMgbWFkZS4KK0F0IHRoYXQgcG9pbnQgdGhlIHdob2xlIHByb2Nlc3Mgc3RhcnRzIG92ZXIgYWdhaW4uCisKK0FzIGFuIGV4YW1wbGUsIGhlcmUgaXMgaG93IHRoZSAyLjYuMzggZGV2ZWxvcG1lbnQgY3ljbGUgd2VudCAoYWxsIGRhdGVzIGluCisyMDExKToKKworCT09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJSmFudWFyeSA0CTIuNi4zNyBzdGFibGUgcmVsZWFzZQorCUphbnVhcnkgMTgJMi42LjM4LXJjMSwgbWVyZ2Ugd2luZG93IGNsb3NlcworCUphbnVhcnkgMjEJMi42LjM4LXJjMgorCUZlYnJ1YXJ5IDEJMi42LjM4LXJjMworCUZlYnJ1YXJ5IDcJMi42LjM4LXJjNAorCUZlYnJ1YXJ5IDE1CTIuNi4zOC1yYzUKKwlGZWJydWFyeSAyMQkyLjYuMzgtcmM2CisJTWFyY2ggMQkJMi42LjM4LXJjNworCU1hcmNoIDcJCTIuNi4zOC1yYzgKKwlNYXJjaCAxNAkyLjYuMzggc3RhYmxlIHJlbGVhc2UKKwk9PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitIb3cgZG8gdGhlIGRldmVsb3BlcnMgZGVjaWRlIHdoZW4gdG8gY2xvc2UgdGhlIGRldmVsb3BtZW50IGN5Y2xlIGFuZCBjcmVhdGUKK3RoZSBzdGFibGUgcmVsZWFzZT8gIFRoZSBtb3N0IHNpZ25pZmljYW50IG1ldHJpYyB1c2VkIGlzIHRoZSBsaXN0IG9mCityZWdyZXNzaW9ucyBmcm9tIHByZXZpb3VzIHJlbGVhc2VzLiAgTm8gYnVncyBhcmUgd2VsY29tZSwgYnV0IHRob3NlIHdoaWNoCiticmVhayBzeXN0ZW1zIHdoaWNoIHdvcmtlZCBpbiB0aGUgcGFzdCBhcmUgY29uc2lkZXJlZCB0byBiZSBlc3BlY2lhbGx5CitzZXJpb3VzLiAgRm9yIHRoaXMgcmVhc29uLCBwYXRjaGVzIHdoaWNoIGNhdXNlIHJlZ3Jlc3Npb25zIGFyZSBsb29rZWQgdXBvbgordW5mYXZvcmFibHkgYW5kIGFyZSBxdWl0ZSBsaWtlbHkgdG8gYmUgcmV2ZXJ0ZWQgZHVyaW5nIHRoZSBzdGFiaWxpemF0aW9uCitwZXJpb2QuCisKK1RoZSBkZXZlbG9wZXJzJyBnb2FsIGlzIHRvIGZpeCBhbGwga25vd24gcmVncmVzc2lvbnMgYmVmb3JlIHRoZSBzdGFibGUKK3JlbGVhc2UgaXMgbWFkZS4gIEluIHRoZSByZWFsIHdvcmxkLCB0aGlzIGtpbmQgb2YgcGVyZmVjdGlvbiBpcyBoYXJkIHRvCithY2hpZXZlOyB0aGVyZSBhcmUganVzdCB0b28gbWFueSB2YXJpYWJsZXMgaW4gYSBwcm9qZWN0IG9mIHRoaXMgc2l6ZS4KK1RoZXJlIGNvbWVzIGEgcG9pbnQgd2hlcmUgZGVsYXlpbmcgdGhlIGZpbmFsIHJlbGVhc2UganVzdCBtYWtlcyB0aGUgcHJvYmxlbQord29yc2U7IHRoZSBwaWxlIG9mIGNoYW5nZXMgd2FpdGluZyBmb3IgdGhlIG5leHQgbWVyZ2Ugd2luZG93IHdpbGwgZ3JvdworbGFyZ2VyLCBjcmVhdGluZyBldmVuIG1vcmUgcmVncmVzc2lvbnMgdGhlIG5leHQgdGltZSBhcm91bmQuICBTbyBtb3N0IDIuNi54CitrZXJuZWxzIGdvIG91dCB3aXRoIGEgaGFuZGZ1bCBvZiBrbm93biByZWdyZXNzaW9ucyB0aG91Z2gsIGhvcGVmdWxseSwgbm9uZQorb2YgdGhlbSBhcmUgc2VyaW91cy4KKworT25jZSBhIHN0YWJsZSByZWxlYXNlIGlzIG1hZGUsIGl0cyBvbmdvaW5nIG1haW50ZW5hbmNlIGlzIHBhc3NlZCBvZmYgdG8gdGhlCisic3RhYmxlIHRlYW0sIiBjdXJyZW50bHkgY29uc2lzdGluZyBvZiBHcmVnIEtyb2FoLUhhcnRtYW4uICBUaGUgc3RhYmxlIHRlYW0KK3dpbGwgcmVsZWFzZSBvY2Nhc2lvbmFsIHVwZGF0ZXMgdG8gdGhlIHN0YWJsZSByZWxlYXNlIHVzaW5nIHRoZSAyLjYueC55CitudW1iZXJpbmcgc2NoZW1lLiAgVG8gYmUgY29uc2lkZXJlZCBmb3IgYW4gdXBkYXRlIHJlbGVhc2UsIGEgcGF0Y2ggbXVzdCAoMSkKK2ZpeCBhIHNpZ25pZmljYW50IGJ1ZywgYW5kICgyKSBhbHJlYWR5IGJlIG1lcmdlZCBpbnRvIHRoZSBtYWlubGluZSBmb3IgdGhlCituZXh0IGRldmVsb3BtZW50IGtlcm5lbC4gIEtlcm5lbHMgd2lsbCB0eXBpY2FsbHkgcmVjZWl2ZSBzdGFibGUgdXBkYXRlcyBmb3IKK2EgbGl0dGxlIG1vcmUgdGhhbiBvbmUgZGV2ZWxvcG1lbnQgY3ljbGUgcGFzdCB0aGVpciBpbml0aWFsIHJlbGVhc2UuICBTbywKK2ZvciBleGFtcGxlLCB0aGUgMi42LjM2IGtlcm5lbCdzIGhpc3RvcnkgbG9va2VkIGxpa2U6CisKKwk9PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCU9jdG9iZXIgMTAJMi42LjM2IHN0YWJsZSByZWxlYXNlCisJTm92ZW1iZXIgMjIJMi42LjM2LjEKKwlEZWNlbWJlciA5CTIuNi4zNi4yCisJSmFudWFyeSA3CTIuNi4zNi4zCisJRmVicnVhcnkgMTcJMi42LjM2LjQKKwk9PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisyLjYuMzYuNCB3YXMgdGhlIGZpbmFsIHN0YWJsZSB1cGRhdGUgZm9yIHRoZSAyLjYuMzYgcmVsZWFzZS4KKworU29tZSBrZXJuZWxzIGFyZSBkZXNpZ25hdGVkICJsb25nIHRlcm0iIGtlcm5lbHM7IHRoZXkgd2lsbCByZWNlaXZlIHN1cHBvcnQKK2ZvciBhIGxvbmdlciBwZXJpb2QuICBBcyBvZiB0aGlzIHdyaXRpbmcsIHRoZSBjdXJyZW50IGxvbmcgdGVybSBrZXJuZWxzCithbmQgdGhlaXIgbWFpbnRhaW5lcnMgYXJlOgorCisJPT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkyLjYuMjcJV2lsbHkgVGFycmVhdQkJKERlZXAtZnJvemVuIHN0YWJsZSBrZXJuZWwpCisJMi42LjMyCUdyZWcgS3JvYWgtSGFydG1hbgorCTIuNi4zNQlBbmRpIEtsZWVuCQkoRW1iZWRkZWQgZmxhZyBrZXJuZWwpCisJPT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIHNlbGVjdGlvbiBvZiBhIGtlcm5lbCBmb3IgbG9uZy10ZXJtIHN1cHBvcnQgaXMgcHVyZWx5IGEgbWF0dGVyIG9mIGEKK21haW50YWluZXIgaGF2aW5nIHRoZSBuZWVkIGFuZCB0aGUgdGltZSB0byBtYWludGFpbiB0aGF0IHJlbGVhc2UuICBUaGVyZQorYXJlIG5vIGtub3duIHBsYW5zIGZvciBsb25nLXRlcm0gc3VwcG9ydCBmb3IgYW55IHNwZWNpZmljIHVwY29taW5nCityZWxlYXNlLgorCisKK1RoZSBsaWZlY3ljbGUgb2YgYSBwYXRjaAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1BhdGNoZXMgZG8gbm90IGdvIGRpcmVjdGx5IGZyb20gdGhlIGRldmVsb3BlcidzIGtleWJvYXJkIGludG8gdGhlIG1haW5saW5lCitrZXJuZWwuICBUaGVyZSBpcywgaW5zdGVhZCwgYSBzb21ld2hhdCBpbnZvbHZlZCAoaWYgc29tZXdoYXQgaW5mb3JtYWwpCitwcm9jZXNzIGRlc2lnbmVkIHRvIGVuc3VyZSB0aGF0IGVhY2ggcGF0Y2ggaXMgcmV2aWV3ZWQgZm9yIHF1YWxpdHkgYW5kIHRoYXQKK2VhY2ggcGF0Y2ggaW1wbGVtZW50cyBhIGNoYW5nZSB3aGljaCBpcyBkZXNpcmFibGUgdG8gaGF2ZSBpbiB0aGUgbWFpbmxpbmUuCitUaGlzIHByb2Nlc3MgY2FuIGhhcHBlbiBxdWlja2x5IGZvciBtaW5vciBmaXhlcywgb3IsIGluIHRoZSBjYXNlIG9mIGxhcmdlCithbmQgY29udHJvdmVyc2lhbCBjaGFuZ2VzLCBnbyBvbiBmb3IgeWVhcnMuICBNdWNoIGRldmVsb3BlciBmcnVzdHJhdGlvbgorY29tZXMgZnJvbSBhIGxhY2sgb2YgdW5kZXJzdGFuZGluZyBvZiB0aGlzIHByb2Nlc3Mgb3IgZnJvbSBhdHRlbXB0cyB0bworY2lyY3VtdmVudCBpdC4KKworSW4gdGhlIGhvcGVzIG9mIHJlZHVjaW5nIHRoYXQgZnJ1c3RyYXRpb24sIHRoaXMgZG9jdW1lbnQgd2lsbCBkZXNjcmliZSBob3cKK2EgcGF0Y2ggZ2V0cyBpbnRvIHRoZSBrZXJuZWwuICBXaGF0IGZvbGxvd3MgYmVsb3cgaXMgYW4gaW50cm9kdWN0aW9uIHdoaWNoCitkZXNjcmliZXMgdGhlIHByb2Nlc3MgaW4gYSBzb21ld2hhdCBpZGVhbGl6ZWQgd2F5LiAgQSBtdWNoIG1vcmUgZGV0YWlsZWQKK3RyZWF0bWVudCB3aWxsIGNvbWUgaW4gbGF0ZXIgc2VjdGlvbnMuCisKK1RoZSBzdGFnZXMgdGhhdCBhIHBhdGNoIGdvZXMgdGhyb3VnaCBhcmUsIGdlbmVyYWxseToKKworIC0gRGVzaWduLiAgVGhpcyBpcyB3aGVyZSB0aGUgcmVhbCByZXF1aXJlbWVudHMgZm9yIHRoZSBwYXRjaCAtIGFuZCB0aGUgd2F5CisgICB0aG9zZSByZXF1aXJlbWVudHMgd2lsbCBiZSBtZXQgLSBhcmUgbGFpZCBvdXQuICBEZXNpZ24gd29yayBpcyBvZnRlbgorICAgZG9uZSB3aXRob3V0IGludm9sdmluZyB0aGUgY29tbXVuaXR5LCBidXQgaXQgaXMgYmV0dGVyIHRvIGRvIHRoaXMgd29yaworICAgaW4gdGhlIG9wZW4gaWYgYXQgYWxsIHBvc3NpYmxlOyBpdCBjYW4gc2F2ZSBhIGxvdCBvZiB0aW1lIHJlZGVzaWduaW5nCisgICB0aGluZ3MgbGF0ZXIuCisKKyAtIEVhcmx5IHJldmlldy4gIFBhdGNoZXMgYXJlIHBvc3RlZCB0byB0aGUgcmVsZXZhbnQgbWFpbGluZyBsaXN0LCBhbmQKKyAgIGRldmVsb3BlcnMgb24gdGhhdCBsaXN0IHJlcGx5IHdpdGggYW55IGNvbW1lbnRzIHRoZXkgbWF5IGhhdmUuICBUaGlzCisgICBwcm9jZXNzIHNob3VsZCB0dXJuIHVwIGFueSBtYWpvciBwcm9ibGVtcyB3aXRoIGEgcGF0Y2ggaWYgYWxsIGdvZXMKKyAgIHdlbGwuCisKKyAtIFdpZGVyIHJldmlldy4gIFdoZW4gdGhlIHBhdGNoIGlzIGdldHRpbmcgY2xvc2UgdG8gcmVhZHkgZm9yIG1haW5saW5lCisgICBpbmNsdXNpb24sIGl0IHNob3VsZCBiZSBhY2NlcHRlZCBieSBhIHJlbGV2YW50IHN1YnN5c3RlbSBtYWludGFpbmVyIC0KKyAgIHRob3VnaCB0aGlzIGFjY2VwdGFuY2UgaXMgbm90IGEgZ3VhcmFudGVlIHRoYXQgdGhlIHBhdGNoIHdpbGwgbWFrZSBpdAorICAgYWxsIHRoZSB3YXkgdG8gdGhlIG1haW5saW5lLiAgVGhlIHBhdGNoIHdpbGwgc2hvdyB1cCBpbiB0aGUgbWFpbnRhaW5lcidzCisgICBzdWJzeXN0ZW0gdHJlZSBhbmQgaW50byB0aGUgLW5leHQgdHJlZXMgKGRlc2NyaWJlZCBiZWxvdykuICBXaGVuIHRoZQorICAgcHJvY2VzcyB3b3JrcywgdGhpcyBzdGVwIGxlYWRzIHRvIG1vcmUgZXh0ZW5zaXZlIHJldmlldyBvZiB0aGUgcGF0Y2ggYW5kCisgICB0aGUgZGlzY292ZXJ5IG9mIGFueSBwcm9ibGVtcyByZXN1bHRpbmcgZnJvbSB0aGUgaW50ZWdyYXRpb24gb2YgdGhpcworICAgcGF0Y2ggd2l0aCB3b3JrIGJlaW5nIGRvbmUgYnkgb3RoZXJzLgorCistICBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFpbnRhaW5lcnMgYWxzbyBoYXZlIGRheSBqb2JzLCBzbyBtZXJnaW5nCisgICB5b3VyIHBhdGNoIG1heSBub3QgYmUgdGhlaXIgaGlnaGVzdCBwcmlvcml0eS4gIElmIHlvdXIgcGF0Y2ggaXMKKyAgIGdldHRpbmcgZmVlZGJhY2sgYWJvdXQgY2hhbmdlcyB0aGF0IGFyZSBuZWVkZWQsIHlvdSBzaG91bGQgZWl0aGVyCisgICBtYWtlIHRob3NlIGNoYW5nZXMgb3IganVzdGlmeSB3aHkgdGhleSBzaG91bGQgbm90IGJlIG1hZGUuICBJZiB5b3VyCisgICBwYXRjaCBoYXMgbm8gcmV2aWV3IGNvbXBsYWludHMgYnV0IGlzIG5vdCBiZWluZyBtZXJnZWQgYnkgaXRzCisgICBhcHByb3ByaWF0ZSBzdWJzeXN0ZW0gb3IgZHJpdmVyIG1haW50YWluZXIsIHlvdSBzaG91bGQgYmUgcGVyc2lzdGVudAorICAgaW4gdXBkYXRpbmcgdGhlIHBhdGNoIHRvIHRoZSBjdXJyZW50IGtlcm5lbCBzbyB0aGF0IGl0IGFwcGxpZXMgY2xlYW5seQorICAgYW5kIGtlZXAgc2VuZGluZyBpdCBmb3IgcmV2aWV3IGFuZCBtZXJnaW5nLgorCisgLSBNZXJnaW5nIGludG8gdGhlIG1haW5saW5lLiAgRXZlbnR1YWxseSwgYSBzdWNjZXNzZnVsIHBhdGNoIHdpbGwgYmUKKyAgIG1lcmdlZCBpbnRvIHRoZSBtYWlubGluZSByZXBvc2l0b3J5IG1hbmFnZWQgYnkgTGludXMgVG9ydmFsZHMuICBNb3JlCisgICBjb21tZW50cyBhbmQvb3IgcHJvYmxlbXMgbWF5IHN1cmZhY2UgYXQgdGhpcyB0aW1lOyBpdCBpcyBpbXBvcnRhbnQgdGhhdAorICAgdGhlIGRldmVsb3BlciBiZSByZXNwb25zaXZlIHRvIHRoZXNlIGFuZCBmaXggYW55IGlzc3VlcyB3aGljaCBhcmlzZS4KKworIC0gU3RhYmxlIHJlbGVhc2UuICBUaGUgbnVtYmVyIG9mIHVzZXJzIHBvdGVudGlhbGx5IGFmZmVjdGVkIGJ5IHRoZSBwYXRjaAorICAgaXMgbm93IGxhcmdlLCBzbywgb25jZSBhZ2FpbiwgbmV3IHByb2JsZW1zIG1heSBhcmlzZS4KKworIC0gTG9uZy10ZXJtIG1haW50ZW5hbmNlLiAgV2hpbGUgaXQgaXMgY2VydGFpbmx5IHBvc3NpYmxlIGZvciBhIGRldmVsb3BlcgorICAgdG8gZm9yZ2V0IGFib3V0IGNvZGUgYWZ0ZXIgbWVyZ2luZyBpdCwgdGhhdCBzb3J0IG9mIGJlaGF2aW9yIHRlbmRzIHRvCisgICBsZWF2ZSBhIHBvb3IgaW1wcmVzc2lvbiBpbiB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5LiAgTWVyZ2luZyBjb2RlCisgICBlbGltaW5hdGVzIHNvbWUgb2YgdGhlIG1haW50ZW5hbmNlIGJ1cmRlbiwgaW4gdGhhdCBvdGhlcnMgd2lsbCBmaXgKKyAgIHByb2JsZW1zIGNhdXNlZCBieSBBUEkgY2hhbmdlcy4gIEJ1dCB0aGUgb3JpZ2luYWwgZGV2ZWxvcGVyIHNob3VsZAorICAgY29udGludWUgdG8gdGFrZSByZXNwb25zaWJpbGl0eSBmb3IgdGhlIGNvZGUgaWYgaXQgaXMgdG8gcmVtYWluIHVzZWZ1bAorICAgaW4gdGhlIGxvbmdlciB0ZXJtLgorCitPbmUgb2YgdGhlIGxhcmdlc3QgbWlzdGFrZXMgbWFkZSBieSBrZXJuZWwgZGV2ZWxvcGVycyAob3IgdGhlaXIgZW1wbG95ZXJzKQoraXMgdG8gdHJ5IHRvIGN1dCB0aGUgcHJvY2VzcyBkb3duIHRvIGEgc2luZ2xlICJtZXJnaW5nIGludG8gdGhlIG1haW5saW5lIgorc3RlcC4gIFRoaXMgYXBwcm9hY2ggaW52YXJpYWJseSBsZWFkcyB0byBmcnVzdHJhdGlvbiBmb3IgZXZlcnlib2R5CitpbnZvbHZlZC4KKworSG93IHBhdGNoZXMgZ2V0IGludG8gdGhlIEtlcm5lbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGVyZSBpcyBleGFjdGx5IG9uZSBwZXJzb24gd2hvIGNhbiBtZXJnZSBwYXRjaGVzIGludG8gdGhlIG1haW5saW5lIGtlcm5lbAorcmVwb3NpdG9yeTogTGludXMgVG9ydmFsZHMuICBCdXQsIG9mIHRoZSBvdmVyIDksNTAwIHBhdGNoZXMgd2hpY2ggd2VudAoraW50byB0aGUgMi42LjM4IGtlcm5lbCwgb25seSAxMTIgKGFyb3VuZCAxLjMlKSB3ZXJlIGRpcmVjdGx5IGNob3NlbiBieSBMaW51cworaGltc2VsZi4gIFRoZSBrZXJuZWwgcHJvamVjdCBoYXMgbG9uZyBzaW5jZSBncm93biB0byBhIHNpemUgd2hlcmUgbm8gc2luZ2xlCitkZXZlbG9wZXIgY291bGQgcG9zc2libHkgaW5zcGVjdCBhbmQgc2VsZWN0IGV2ZXJ5IHBhdGNoIHVuYXNzaXN0ZWQuICBUaGUKK3dheSB0aGUga2VybmVsIGRldmVsb3BlcnMgaGF2ZSBhZGRyZXNzZWQgdGhpcyBncm93dGggaXMgdGhyb3VnaCB0aGUgdXNlIG9mCithIGxpZXV0ZW5hbnQgc3lzdGVtIGJ1aWx0IGFyb3VuZCBhIGNoYWluIG9mIHRydXN0LgorCitUaGUga2VybmVsIGNvZGUgYmFzZSBpcyBsb2dpY2FsbHkgYnJva2VuIGRvd24gaW50byBhIHNldCBvZiBzdWJzeXN0ZW1zOgorbmV0d29ya2luZywgc3BlY2lmaWMgYXJjaGl0ZWN0dXJlIHN1cHBvcnQsIG1lbW9yeSBtYW5hZ2VtZW50LCB2aWRlbworZGV2aWNlcywgZXRjLiAgTW9zdCBzdWJzeXN0ZW1zIGhhdmUgYSBkZXNpZ25hdGVkIG1haW50YWluZXIsIGEgZGV2ZWxvcGVyCit3aG8gaGFzIG92ZXJhbGwgcmVzcG9uc2liaWxpdHkgZm9yIHRoZSBjb2RlIHdpdGhpbiB0aGF0IHN1YnN5c3RlbS4gIFRoZXNlCitzdWJzeXN0ZW0gbWFpbnRhaW5lcnMgYXJlIHRoZSBnYXRla2VlcGVycyAoaW4gYSBsb29zZSB3YXkpIGZvciB0aGUgcG9ydGlvbgorb2YgdGhlIGtlcm5lbCB0aGV5IG1hbmFnZTsgdGhleSBhcmUgdGhlIG9uZXMgd2hvIHdpbGwgKHVzdWFsbHkpIGFjY2VwdCBhCitwYXRjaCBmb3IgaW5jbHVzaW9uIGludG8gdGhlIG1haW5saW5lIGtlcm5lbC4KKworU3Vic3lzdGVtIG1haW50YWluZXJzIGVhY2ggbWFuYWdlIHRoZWlyIG93biB2ZXJzaW9uIG9mIHRoZSBrZXJuZWwgc291cmNlCit0cmVlLCB1c3VhbGx5IChidXQgY2VydGFpbmx5IG5vdCBhbHdheXMpIHVzaW5nIHRoZSBnaXQgc291cmNlIG1hbmFnZW1lbnQKK3Rvb2wuICBUb29scyBsaWtlIGdpdCAoYW5kIHJlbGF0ZWQgdG9vbHMgbGlrZSBxdWlsdCBvciBtZXJjdXJpYWwpIGFsbG93CittYWludGFpbmVycyB0byB0cmFjayBhIGxpc3Qgb2YgcGF0Y2hlcywgaW5jbHVkaW5nIGF1dGhvcnNoaXAgaW5mb3JtYXRpb24KK2FuZCBvdGhlciBtZXRhZGF0YS4gIEF0IGFueSBnaXZlbiB0aW1lLCB0aGUgbWFpbnRhaW5lciBjYW4gaWRlbnRpZnkgd2hpY2gKK3BhdGNoZXMgaW4gaGlzIG9yIGhlciByZXBvc2l0b3J5IGFyZSBub3QgZm91bmQgaW4gdGhlIG1haW5saW5lLgorCitXaGVuIHRoZSBtZXJnZSB3aW5kb3cgb3BlbnMsIHRvcC1sZXZlbCBtYWludGFpbmVycyB3aWxsIGFzayBMaW51cyB0byAicHVsbCIKK3RoZSBwYXRjaGVzIHRoZXkgaGF2ZSBzZWxlY3RlZCBmb3IgbWVyZ2luZyBmcm9tIHRoZWlyIHJlcG9zaXRvcmllcy4gIElmCitMaW51cyBhZ3JlZXMsIHRoZSBzdHJlYW0gb2YgcGF0Y2hlcyB3aWxsIGZsb3cgdXAgaW50byBoaXMgcmVwb3NpdG9yeSwKK2JlY29taW5nIHBhcnQgb2YgdGhlIG1haW5saW5lIGtlcm5lbC4gIFRoZSBhbW91bnQgb2YgYXR0ZW50aW9uIHRoYXQgTGludXMKK3BheXMgdG8gc3BlY2lmaWMgcGF0Y2hlcyByZWNlaXZlZCBpbiBhIHB1bGwgb3BlcmF0aW9uIHZhcmllcy4gIEl0IGlzIGNsZWFyCit0aGF0LCBzb21ldGltZXMsIGhlIGxvb2tzIHF1aXRlIGNsb3NlbHkuICBCdXQsIGFzIGEgZ2VuZXJhbCBydWxlLCBMaW51cwordHJ1c3RzIHRoZSBzdWJzeXN0ZW0gbWFpbnRhaW5lcnMgdG8gbm90IHNlbmQgYmFkIHBhdGNoZXMgdXBzdHJlYW0uCisKK1N1YnN5c3RlbSBtYWludGFpbmVycywgaW4gdHVybiwgY2FuIHB1bGwgcGF0Y2hlcyBmcm9tIG90aGVyIG1haW50YWluZXJzLgorRm9yIGV4YW1wbGUsIHRoZSBuZXR3b3JraW5nIHRyZWUgaXMgYnVpbHQgZnJvbSBwYXRjaGVzIHdoaWNoIGFjY3VtdWxhdGVkCitmaXJzdCBpbiB0cmVlcyBkZWRpY2F0ZWQgdG8gbmV0d29yayBkZXZpY2UgZHJpdmVycywgd2lyZWxlc3MgbmV0d29ya2luZywKK2V0Yy4gIFRoaXMgY2hhaW4gb2YgcmVwb3NpdG9yaWVzIGNhbiBiZSBhcmJpdHJhcmlseSBsb25nLCB0aG91Z2ggaXQgcmFyZWx5CitleGNlZWRzIHR3byBvciB0aHJlZSBsaW5rcy4gIFNpbmNlIGVhY2ggbWFpbnRhaW5lciBpbiB0aGUgY2hhaW4gdHJ1c3RzCit0aG9zZSBtYW5hZ2luZyBsb3dlci1sZXZlbCB0cmVlcywgdGhpcyBwcm9jZXNzIGlzIGtub3duIGFzIHRoZSAiY2hhaW4gb2YKK3RydXN0LiIKKworQ2xlYXJseSwgaW4gYSBzeXN0ZW0gbGlrZSB0aGlzLCBnZXR0aW5nIHBhdGNoZXMgaW50byB0aGUga2VybmVsIGRlcGVuZHMgb24KK2ZpbmRpbmcgdGhlIHJpZ2h0IG1haW50YWluZXIuICBTZW5kaW5nIHBhdGNoZXMgZGlyZWN0bHkgdG8gTGludXMgaXMgbm90Citub3JtYWxseSB0aGUgcmlnaHQgd2F5IHRvIGdvLgorCisKK05leHQgdHJlZXMKKy0tLS0tLS0tLS0KKworVGhlIGNoYWluIG9mIHN1YnN5c3RlbSB0cmVlcyBndWlkZXMgdGhlIGZsb3cgb2YgcGF0Y2hlcyBpbnRvIHRoZSBrZXJuZWwsCitidXQgaXQgYWxzbyByYWlzZXMgYW4gaW50ZXJlc3RpbmcgcXVlc3Rpb246IHdoYXQgaWYgc29tZWJvZHkgd2FudHMgdG8gbG9vaworYXQgYWxsIG9mIHRoZSBwYXRjaGVzIHdoaWNoIGFyZSBiZWluZyBwcmVwYXJlZCBmb3IgdGhlIG5leHQgbWVyZ2Ugd2luZG93PworRGV2ZWxvcGVycyB3aWxsIGJlIGludGVyZXN0ZWQgaW4gd2hhdCBvdGhlciBjaGFuZ2VzIGFyZSBwZW5kaW5nIHRvIHNlZQord2hldGhlciB0aGVyZSBhcmUgYW55IGNvbmZsaWN0cyB0byB3b3JyeSBhYm91dDsgYSBwYXRjaCB3aGljaCBjaGFuZ2VzIGEKK2NvcmUga2VybmVsIGZ1bmN0aW9uIHByb3RvdHlwZSwgZm9yIGV4YW1wbGUsIHdpbGwgY29uZmxpY3Qgd2l0aCBhbnkgb3RoZXIKK3BhdGNoZXMgd2hpY2ggdXNlIHRoZSBvbGRlciBmb3JtIG9mIHRoYXQgZnVuY3Rpb24uICBSZXZpZXdlcnMgYW5kIHRlc3RlcnMKK3dhbnQgYWNjZXNzIHRvIHRoZSBjaGFuZ2VzIGluIHRoZWlyIGludGVncmF0ZWQgZm9ybSBiZWZvcmUgYWxsIG9mIHRob3NlCitjaGFuZ2VzIGxhbmQgaW4gdGhlIG1haW5saW5lIGtlcm5lbC4gIE9uZSBjb3VsZCBwdWxsIGNoYW5nZXMgZnJvbSBhbGwgb2YKK3RoZSBpbnRlcmVzdGluZyBzdWJzeXN0ZW0gdHJlZXMsIGJ1dCB0aGF0IHdvdWxkIGJlIGEgYmlnIGFuZCBlcnJvci1wcm9uZQoram9iLgorCitUaGUgYW5zd2VyIGNvbWVzIGluIHRoZSBmb3JtIG9mIC1uZXh0IHRyZWVzLCB3aGVyZSBzdWJzeXN0ZW0gdHJlZXMgYXJlCitjb2xsZWN0ZWQgZm9yIHRlc3RpbmcgYW5kIHJldmlldy4gIFRoZSBvbGRlciBvZiB0aGVzZSB0cmVlcywgbWFpbnRhaW5lZCBieQorQW5kcmV3IE1vcnRvbiwgaXMgY2FsbGVkICItbW0iIChmb3IgbWVtb3J5IG1hbmFnZW1lbnQsIHdoaWNoIGlzIGhvdyBpdCBnb3QKK3N0YXJ0ZWQpLiAgVGhlIC1tbSB0cmVlIGludGVncmF0ZXMgcGF0Y2hlcyBmcm9tIGEgbG9uZyBsaXN0IG9mIHN1YnN5c3RlbQordHJlZXM7IGl0IGFsc28gaGFzIHNvbWUgcGF0Y2hlcyBhaW1lZCBhdCBoZWxwaW5nIHdpdGggZGVidWdnaW5nLgorCitCZXlvbmQgdGhhdCwgLW1tIGNvbnRhaW5zIGEgc2lnbmlmaWNhbnQgY29sbGVjdGlvbiBvZiBwYXRjaGVzIHdoaWNoIGhhdmUKK2JlZW4gc2VsZWN0ZWQgYnkgQW5kcmV3IGRpcmVjdGx5LiAgVGhlc2UgcGF0Y2hlcyBtYXkgaGF2ZSBiZWVuIHBvc3RlZCBvbiBhCittYWlsaW5nIGxpc3QsIG9yIHRoZXkgbWF5IGFwcGx5IHRvIGEgcGFydCBvZiB0aGUga2VybmVsIGZvciB3aGljaCB0aGVyZSBpcworbm8gZGVzaWduYXRlZCBzdWJzeXN0ZW0gdHJlZS4gIEFzIGEgcmVzdWx0LCAtbW0gb3BlcmF0ZXMgYXMgYSBzb3J0IG9mCitzdWJzeXN0ZW0gdHJlZSBvZiBsYXN0IHJlc29ydDsgaWYgdGhlcmUgaXMgbm8gb3RoZXIgb2J2aW91cyBwYXRoIGZvciBhCitwYXRjaCBpbnRvIHRoZSBtYWlubGluZSwgaXQgaXMgbGlrZWx5IHRvIGVuZCB1cCBpbiAtbW0uICBNaXNjZWxsYW5lb3VzCitwYXRjaGVzIHdoaWNoIGFjY3VtdWxhdGUgaW4gLW1tIHdpbGwgZXZlbnR1YWxseSBlaXRoZXIgYmUgZm9yd2FyZGVkIG9uIHRvCithbiBhcHByb3ByaWF0ZSBzdWJzeXN0ZW0gdHJlZSBvciBiZSBzZW50IGRpcmVjdGx5IHRvIExpbnVzLiAgSW4gYSB0eXBpY2FsCitkZXZlbG9wbWVudCBjeWNsZSwgYXBwcm94aW1hdGVseSA1LTEwJSBvZiB0aGUgcGF0Y2hlcyBnb2luZyBpbnRvIHRoZQorbWFpbmxpbmUgZ2V0IHRoZXJlIHZpYSAtbW0uCisKK1RoZSBjdXJyZW50IC1tbSBwYXRjaCBpcyBhdmFpbGFibGUgaW4gdGhlICJtbW90bSIgKC1tbSBvZiB0aGUgbW9tZW50KQorZGlyZWN0b3J5IGF0OgorCisJaHR0cDovL3d3dy5vemxhYnMub3JnL35ha3BtL21tb3RtLworCitVc2Ugb2YgdGhlIE1NT1RNIHRyZWUgaXMgbGlrZWx5IHRvIGJlIGEgZnJ1c3RyYXRpbmcgZXhwZXJpZW5jZSwgdGhvdWdoOwordGhlcmUgaXMgYSBkZWZpbml0ZSBjaGFuY2UgdGhhdCBpdCB3aWxsIG5vdCBldmVuIGNvbXBpbGUuCisKK1RoZSBwcmltYXJ5IHRyZWUgZm9yIG5leHQtY3ljbGUgcGF0Y2ggbWVyZ2luZyBpcyBsaW51eC1uZXh0LCBtYWludGFpbmVkIGJ5CitTdGVwaGVuIFJvdGh3ZWxsLiAgVGhlIGxpbnV4LW5leHQgdHJlZSBpcywgYnkgZGVzaWduLCBhIHNuYXBzaG90IG9mIHdoYXQKK3RoZSBtYWlubGluZSBpcyBleHBlY3RlZCB0byBsb29rIGxpa2UgYWZ0ZXIgdGhlIG5leHQgbWVyZ2Ugd2luZG93IGNsb3Nlcy4KK0xpbnV4LW5leHQgdHJlZXMgYXJlIGFubm91bmNlZCBvbiB0aGUgbGludXgta2VybmVsIGFuZCBsaW51eC1uZXh0IG1haWxpbmcKK2xpc3RzIHdoZW4gdGhleSBhcmUgYXNzZW1ibGVkOyB0aGV5IGNhbiBiZSBkb3dubG9hZGVkIGZyb206CisKKwlodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC9uZXh0LworCitMaW51eC1uZXh0IGhhcyBiZWNvbWUgYW4gaW50ZWdyYWwgcGFydCBvZiB0aGUga2VybmVsIGRldmVsb3BtZW50IHByb2Nlc3M7CithbGwgcGF0Y2hlcyBtZXJnZWQgZHVyaW5nIGEgZ2l2ZW4gbWVyZ2Ugd2luZG93IHNob3VsZCByZWFsbHkgaGF2ZSBmb3VuZAordGhlaXIgd2F5IGludG8gbGludXgtbmV4dCBzb21lIHRpbWUgYmVmb3JlIHRoZSBtZXJnZSB3aW5kb3cgb3BlbnMuCisKKworU3RhZ2luZyB0cmVlcworLS0tLS0tLS0tLS0tLQorCitUaGUga2VybmVsIHNvdXJjZSB0cmVlIGNvbnRhaW5zIHRoZSBkcml2ZXJzL3N0YWdpbmcvIGRpcmVjdG9yeSwgd2hlcmUKK21hbnkgc3ViLWRpcmVjdG9yaWVzIGZvciBkcml2ZXJzIG9yIGZpbGVzeXN0ZW1zIHRoYXQgYXJlIG9uIHRoZWlyIHdheSB0bworYmVpbmcgYWRkZWQgdG8gdGhlIGtlcm5lbCB0cmVlIGxpdmUuICBUaGV5IHJlbWFpbiBpbiBkcml2ZXJzL3N0YWdpbmcgd2hpbGUKK3RoZXkgc3RpbGwgbmVlZCBtb3JlIHdvcms7IG9uY2UgY29tcGxldGUsIHRoZXkgY2FuIGJlIG1vdmVkIGludG8gdGhlCitrZXJuZWwgcHJvcGVyLiAgVGhpcyBpcyBhIHdheSB0byBrZWVwIHRyYWNrIG9mIGRyaXZlcnMgdGhhdCBhcmVuJ3QKK3VwIHRvIExpbnV4IGtlcm5lbCBjb2Rpbmcgb3IgcXVhbGl0eSBzdGFuZGFyZHMsIGJ1dCBwZW9wbGUgbWF5IHdhbnQgdG8gdXNlCit0aGVtIGFuZCB0cmFjayBkZXZlbG9wbWVudC4KKworR3JlZyBLcm9haC1IYXJ0bWFuIGN1cnJlbnRseSBtYWludGFpbnMgdGhlIHN0YWdpbmcgdHJlZS4gIERyaXZlcnMgdGhhdAorc3RpbGwgbmVlZCB3b3JrIGFyZSBzZW50IHRvIGhpbSwgd2l0aCBlYWNoIGRyaXZlciBoYXZpbmcgaXRzIG93bgorc3ViZGlyZWN0b3J5IGluIGRyaXZlcnMvc3RhZ2luZy8uICBBbG9uZyB3aXRoIHRoZSBkcml2ZXIgc291cmNlIGZpbGVzLCBhCitUT0RPIGZpbGUgc2hvdWxkIGJlIHByZXNlbnQgaW4gdGhlIGRpcmVjdG9yeSBhcyB3ZWxsLiAgVGhlIFRPRE8gZmlsZSBsaXN0cwordGhlIHBlbmRpbmcgd29yayB0aGF0IHRoZSBkcml2ZXIgbmVlZHMgZm9yIGFjY2VwdGFuY2UgaW50byB0aGUga2VybmVsCitwcm9wZXIsIGFzIHdlbGwgYXMgYSBsaXN0IG9mIHBlb3BsZSB0aGF0IHNob3VsZCBiZSBDYydkIGZvciBhbnkgcGF0Y2hlcyB0bwordGhlIGRyaXZlci4gIEN1cnJlbnQgcnVsZXMgcmVxdWlyZSB0aGF0IGRyaXZlcnMgY29udHJpYnV0ZWQgdG8gc3RhZ2luZworbXVzdCwgYXQgYSBtaW5pbXVtLCBjb21waWxlIHByb3Blcmx5LgorCitTdGFnaW5nIGNhbiBiZSBhIHJlbGF0aXZlbHkgZWFzeSB3YXkgdG8gZ2V0IG5ldyBkcml2ZXJzIGludG8gdGhlIG1haW5saW5lCit3aGVyZSwgd2l0aCBsdWNrLCB0aGV5IHdpbGwgY29tZSB0byB0aGUgYXR0ZW50aW9uIG9mIG90aGVyIGRldmVsb3BlcnMgYW5kCitpbXByb3ZlIHF1aWNrbHkuICBFbnRyeSBpbnRvIHN0YWdpbmcgaXMgbm90IHRoZSBlbmQgb2YgdGhlIHN0b3J5LCB0aG91Z2g7Citjb2RlIGluIHN0YWdpbmcgd2hpY2ggaXMgbm90IHNlZWluZyByZWd1bGFyIHByb2dyZXNzIHdpbGwgZXZlbnR1YWxseSBiZQorcmVtb3ZlZC4gIERpc3RyaWJ1dG9ycyBhbHNvIHRlbmQgdG8gYmUgcmVsYXRpdmVseSByZWx1Y3RhbnQgdG8gZW5hYmxlCitzdGFnaW5nIGRyaXZlcnMuICBTbyBzdGFnaW5nIGlzLCBhdCBiZXN0LCBhIHN0b3Agb24gdGhlIHdheSB0b3dhcmQgYmVjb21pbmcKK2EgcHJvcGVyIG1haW5saW5lIGRyaXZlci4KKworCitUb29scworLS0tLS0KKworQXMgY2FuIGJlIHNlZW4gZnJvbSB0aGUgYWJvdmUgdGV4dCwgdGhlIGtlcm5lbCBkZXZlbG9wbWVudCBwcm9jZXNzIGRlcGVuZHMKK2hlYXZpbHkgb24gdGhlIGFiaWxpdHkgdG8gaGVyZCBjb2xsZWN0aW9ucyBvZiBwYXRjaGVzIGluIHZhcmlvdXMKK2RpcmVjdGlvbnMuICBUaGUgd2hvbGUgdGhpbmcgd291bGQgbm90IHdvcmsgYW55d2hlcmUgbmVhciBhcyB3ZWxsIGFzIGl0Citkb2VzIHdpdGhvdXQgc3VpdGFibHkgcG93ZXJmdWwgdG9vbHMuICBUdXRvcmlhbHMgb24gaG93IHRvIHVzZSB0aGVzZSB0b29scworYXJlIHdlbGwgYmV5b25kIHRoZSBzY29wZSBvZiB0aGlzIGRvY3VtZW50LCBidXQgdGhlcmUgaXMgc3BhY2UgZm9yIGEgZmV3Citwb2ludGVycy4KKworQnkgZmFyIHRoZSBkb21pbmFudCBzb3VyY2UgY29kZSBtYW5hZ2VtZW50IHN5c3RlbSB1c2VkIGJ5IHRoZSBrZXJuZWwKK2NvbW11bml0eSBpcyBnaXQuICBHaXQgaXMgb25lIG9mIGEgbnVtYmVyIG9mIGRpc3RyaWJ1dGVkIHZlcnNpb24gY29udHJvbAorc3lzdGVtcyBiZWluZyBkZXZlbG9wZWQgaW4gdGhlIGZyZWUgc29mdHdhcmUgY29tbXVuaXR5LiAgSXQgaXMgd2VsbCB0dW5lZAorZm9yIGtlcm5lbCBkZXZlbG9wbWVudCwgaW4gdGhhdCBpdCBwZXJmb3JtcyBxdWl0ZSB3ZWxsIHdoZW4gZGVhbGluZyB3aXRoCitsYXJnZSByZXBvc2l0b3JpZXMgYW5kIGxhcmdlIG51bWJlcnMgb2YgcGF0Y2hlcy4gIEl0IGFsc28gaGFzIGEgcmVwdXRhdGlvbgorZm9yIGJlaW5nIGRpZmZpY3VsdCB0byBsZWFybiBhbmQgdXNlLCB0aG91Z2ggaXQgaGFzIGdvdHRlbiBiZXR0ZXIgb3ZlcgordGltZS4gIFNvbWUgc29ydCBvZiBmYW1pbGlhcml0eSB3aXRoIGdpdCBpcyBhbG1vc3QgYSByZXF1aXJlbWVudCBmb3Iga2VybmVsCitkZXZlbG9wZXJzOyBldmVuIGlmIHRoZXkgZG8gbm90IHVzZSBpdCBmb3IgdGhlaXIgb3duIHdvcmssIHRoZXknbGwgbmVlZCBnaXQKK3RvIGtlZXAgdXAgd2l0aCB3aGF0IG90aGVyIGRldmVsb3BlcnMgKGFuZCB0aGUgbWFpbmxpbmUpIGFyZSBkb2luZy4KKworR2l0IGlzIG5vdyBwYWNrYWdlZCBieSBhbG1vc3QgYWxsIExpbnV4IGRpc3RyaWJ1dGlvbnMuICBUaGVyZSBpcyBhIGhvbWUKK3BhZ2UgYXQ6CisKKwlodHRwOi8vZ2l0LXNjbS5jb20vCisKK1RoYXQgcGFnZSBoYXMgcG9pbnRlcnMgdG8gZG9jdW1lbnRhdGlvbiBhbmQgdHV0b3JpYWxzLgorCitBbW9uZyB0aGUga2VybmVsIGRldmVsb3BlcnMgd2hvIGRvIG5vdCB1c2UgZ2l0LCB0aGUgbW9zdCBwb3B1bGFyIGNob2ljZSBpcworYWxtb3N0IGNlcnRhaW5seSBNZXJjdXJpYWw6CisKKwlodHRwOi8vd3d3LnNlbGVuaWMuY29tL21lcmN1cmlhbC8KKworTWVyY3VyaWFsIHNoYXJlcyBtYW55IGZlYXR1cmVzIHdpdGggZ2l0LCBidXQgaXQgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHdoaWNoCittYW55IGZpbmQgZWFzaWVyIHRvIHVzZS4KKworVGhlIG90aGVyIHRvb2wgd29ydGgga25vd2luZyBhYm91dCBpcyBRdWlsdDoKKworCWh0dHA6Ly9zYXZhbm5haC5ub25nbnUub3JnL3Byb2plY3RzL3F1aWx0LworCitRdWlsdCBpcyBhIHBhdGNoIG1hbmFnZW1lbnQgc3lzdGVtLCByYXRoZXIgdGhhbiBhIHNvdXJjZSBjb2RlIG1hbmFnZW1lbnQKK3N5c3RlbS4gIEl0IGRvZXMgbm90IHRyYWNrIGhpc3Rvcnkgb3ZlciB0aW1lOyBpdCBpcywgaW5zdGVhZCwgb3JpZW50ZWQKK3Rvd2FyZCB0cmFja2luZyBhIHNwZWNpZmljIHNldCBvZiBjaGFuZ2VzIGFnYWluc3QgYW4gZXZvbHZpbmcgY29kZSBiYXNlLgorU29tZSBtYWpvciBzdWJzeXN0ZW0gbWFpbnRhaW5lcnMgdXNlIHF1aWx0IHRvIG1hbmFnZSBwYXRjaGVzIGludGVuZGVkIHRvIGdvCit1cHN0cmVhbS4gIEZvciB0aGUgbWFuYWdlbWVudCBvZiBjZXJ0YWluIGtpbmRzIG9mIHRyZWVzICgtbW0sIGZvciBleGFtcGxlKSwKK3F1aWx0IGlzIHRoZSBiZXN0IHRvb2wgZm9yIHRoZSBqb2IuCisKKworTWFpbGluZyBsaXN0cworLS0tLS0tLS0tLS0tLQorCitBIGdyZWF0IGRlYWwgb2YgTGludXgga2VybmVsIGRldmVsb3BtZW50IHdvcmsgaXMgZG9uZSBieSB3YXkgb2YgbWFpbGluZworbGlzdHMuICBJdCBpcyBoYXJkIHRvIGJlIGEgZnVsbHktZnVuY3Rpb25pbmcgbWVtYmVyIG9mIHRoZSBjb21tdW5pdHkKK3dpdGhvdXQgam9pbmluZyBhdCBsZWFzdCBvbmUgbGlzdCBzb21ld2hlcmUuICBCdXQgTGludXggbWFpbGluZyBsaXN0cyBhbHNvCityZXByZXNlbnQgYSBwb3RlbnRpYWwgaGF6YXJkIHRvIGRldmVsb3BlcnMsIHdobyByaXNrIGdldHRpbmcgYnVyaWVkIHVuZGVyIGEKK2xvYWQgb2YgZWxlY3Ryb25pYyBtYWlsLCBydW5uaW5nIGFmb3VsIG9mIHRoZSBjb252ZW50aW9ucyB1c2VkIG9uIHRoZSBMaW51eAorbGlzdHMsIG9yIGJvdGguCisKK01vc3Qga2VybmVsIG1haWxpbmcgbGlzdHMgYXJlIHJ1biBvbiB2Z2VyLmtlcm5lbC5vcmc7IHRoZSBtYXN0ZXIgbGlzdCBjYW4KK2JlIGZvdW5kIGF0OgorCisJaHR0cDovL3ZnZXIua2VybmVsLm9yZy92Z2VyLWxpc3RzLmh0bWwKKworVGhlcmUgYXJlIGxpc3RzIGhvc3RlZCBlbHNld2hlcmUsIHRob3VnaDsgYSBudW1iZXIgb2YgdGhlbSBhcmUgYXQKK2xpc3RzLnJlZGhhdC5jb20uCisKK1RoZSBjb3JlIG1haWxpbmcgbGlzdCBmb3Iga2VybmVsIGRldmVsb3BtZW50IGlzLCBvZiBjb3Vyc2UsIGxpbnV4LWtlcm5lbC4KK1RoaXMgbGlzdCBpcyBhbiBpbnRpbWlkYXRpbmcgcGxhY2UgdG8gYmU7IHZvbHVtZSBjYW4gcmVhY2ggNTAwIG1lc3NhZ2VzIHBlcgorZGF5LCB0aGUgYW1vdW50IG9mIG5vaXNlIGlzIGhpZ2gsIHRoZSBjb252ZXJzYXRpb24gY2FuIGJlIHNldmVyZWx5Cit0ZWNobmljYWwsIGFuZCBwYXJ0aWNpcGFudHMgYXJlIG5vdCBhbHdheXMgY29uY2VybmVkIHdpdGggc2hvd2luZyBhIGhpZ2gKK2RlZ3JlZSBvZiBwb2xpdGVuZXNzLiAgQnV0IHRoZXJlIGlzIG5vIG90aGVyIHBsYWNlIHdoZXJlIHRoZSBrZXJuZWwKK2RldmVsb3BtZW50IGNvbW11bml0eSBjb21lcyB0b2dldGhlciBhcyBhIHdob2xlOyBkZXZlbG9wZXJzIHdobyBhdm9pZCB0aGlzCitsaXN0IHdpbGwgbWlzcyBpbXBvcnRhbnQgaW5mb3JtYXRpb24uCisKK1RoZXJlIGFyZSBhIGZldyBoaW50cyB3aGljaCBjYW4gaGVscCB3aXRoIGxpbnV4LWtlcm5lbCBzdXJ2aXZhbDoKKworLSBIYXZlIHRoZSBsaXN0IGRlbGl2ZXJlZCB0byBhIHNlcGFyYXRlIGZvbGRlciwgcmF0aGVyIHRoYW4geW91ciBtYWluCisgIG1haWxib3guICBPbmUgbXVzdCBiZSBhYmxlIHRvIGlnbm9yZSB0aGUgc3RyZWFtIGZvciBzdXN0YWluZWQgcGVyaW9kcyBvZgorICB0aW1lLgorCistIERvIG5vdCB0cnkgdG8gZm9sbG93IGV2ZXJ5IGNvbnZlcnNhdGlvbiAtIG5vYm9keSBlbHNlIGRvZXMuICBJdCBpcworICBpbXBvcnRhbnQgdG8gZmlsdGVyIG9uIGJvdGggdGhlIHRvcGljIG9mIGludGVyZXN0ICh0aG91Z2ggbm90ZSB0aGF0CisgIGxvbmctcnVubmluZyBjb252ZXJzYXRpb25zIGNhbiBkcmlmdCBhd2F5IGZyb20gdGhlIG9yaWdpbmFsIHN1YmplY3QKKyAgd2l0aG91dCBjaGFuZ2luZyB0aGUgZW1haWwgc3ViamVjdCBsaW5lKSBhbmQgdGhlIHBlb3BsZSB3aG8gYXJlCisgIHBhcnRpY2lwYXRpbmcuCisKKy0gRG8gbm90IGZlZWQgdGhlIHRyb2xscy4gIElmIHNvbWVib2R5IGlzIHRyeWluZyB0byBzdGlyIHVwIGFuIGFuZ3J5CisgIHJlc3BvbnNlLCBpZ25vcmUgdGhlbS4KKworLSBXaGVuIHJlc3BvbmRpbmcgdG8gbGludXgta2VybmVsIGVtYWlsIChvciB0aGF0IG9uIG90aGVyIGxpc3RzKSBwcmVzZXJ2ZQorICB0aGUgQ2M6IGhlYWRlciBmb3IgYWxsIGludm9sdmVkLiAgSW4gdGhlIGFic2VuY2Ugb2YgYSBzdHJvbmcgcmVhc29uIChzdWNoCisgIGFzIGFuIGV4cGxpY2l0IHJlcXVlc3QpLCB5b3Ugc2hvdWxkIG5ldmVyIHJlbW92ZSByZWNpcGllbnRzLiAgQWx3YXlzIG1ha2UKKyAgc3VyZSB0aGF0IHRoZSBwZXJzb24geW91IGFyZSByZXNwb25kaW5nIHRvIGlzIGluIHRoZSBDYzogbGlzdC4gIFRoaXMKKyAgY29udmVudGlvbiBhbHNvIG1ha2VzIGl0IHVubmVjZXNzYXJ5IHRvIGV4cGxpY2l0bHkgYXNrIHRvIGJlIGNvcGllZCBvbgorICByZXBsaWVzIHRvIHlvdXIgcG9zdGluZ3MuCisKKy0gU2VhcmNoIHRoZSBsaXN0IGFyY2hpdmVzIChhbmQgdGhlIG5ldCBhcyBhIHdob2xlKSBiZWZvcmUgYXNraW5nCisgIHF1ZXN0aW9ucy4gIFNvbWUgZGV2ZWxvcGVycyBjYW4gZ2V0IGltcGF0aWVudCB3aXRoIHBlb3BsZSB3aG8gY2xlYXJseQorICBoYXZlIG5vdCBkb25lIHRoZWlyIGhvbWV3b3JrLgorCistIEF2b2lkIHRvcC1wb3N0aW5nICh0aGUgcHJhY3RpY2Ugb2YgcHV0dGluZyB5b3VyIGFuc3dlciBhYm92ZSB0aGUgcXVvdGVkCisgIHRleHQgeW91IGFyZSByZXNwb25kaW5nIHRvKS4gIEl0IG1ha2VzIHlvdXIgcmVzcG9uc2UgaGFyZGVyIHRvIHJlYWQgYW5kCisgIG1ha2VzIGEgcG9vciBpbXByZXNzaW9uLgorCistIEFzayBvbiB0aGUgY29ycmVjdCBtYWlsaW5nIGxpc3QuICBMaW51eC1rZXJuZWwgbWF5IGJlIHRoZSBnZW5lcmFsIG1lZXRpbmcKKyAgcG9pbnQsIGJ1dCBpdCBpcyBub3QgdGhlIGJlc3QgcGxhY2UgdG8gZmluZCBkZXZlbG9wZXJzIGZyb20gYWxsCisgIHN1YnN5c3RlbXMuCisKK1RoZSBsYXN0IHBvaW50IC0gZmluZGluZyB0aGUgY29ycmVjdCBtYWlsaW5nIGxpc3QgLSBpcyBhIGNvbW1vbiBwbGFjZSBmb3IKK2JlZ2lubmluZyBkZXZlbG9wZXJzIHRvIGdvIHdyb25nLiAgU29tZWJvZHkgd2hvIGFza3MgYSBuZXR3b3JraW5nLXJlbGF0ZWQKK3F1ZXN0aW9uIG9uIGxpbnV4LWtlcm5lbCB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgcmVjZWl2ZSBhIHBvbGl0ZSBzdWdnZXN0aW9uCit0byBhc2sgb24gdGhlIG5ldGRldiBsaXN0IGluc3RlYWQsIGFzIHRoYXQgaXMgdGhlIGxpc3QgZnJlcXVlbnRlZCBieSBtb3N0CituZXR3b3JraW5nIGRldmVsb3BlcnMuICBPdGhlciBsaXN0cyBleGlzdCBmb3IgdGhlIFNDU0ksIHZpZGVvNGxpbnV4LCBJREUsCitmaWxlc3lzdGVtLCBldGMuIHN1YnN5c3RlbXMuICBUaGUgYmVzdCBwbGFjZSB0byBsb29rIGZvciBtYWlsaW5nIGxpc3RzIGlzCitpbiB0aGUgTUFJTlRBSU5FUlMgZmlsZSBwYWNrYWdlZCB3aXRoIHRoZSBrZXJuZWwgc291cmNlLgorCisKK0dldHRpbmcgc3RhcnRlZCB3aXRoIEtlcm5lbCBkZXZlbG9wbWVudAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1F1ZXN0aW9ucyBhYm91dCBob3cgdG8gZ2V0IHN0YXJ0ZWQgd2l0aCB0aGUga2VybmVsIGRldmVsb3BtZW50IHByb2Nlc3MgYXJlCitjb21tb24gLSBmcm9tIGJvdGggaW5kaXZpZHVhbHMgYW5kIGNvbXBhbmllcy4gIEVxdWFsbHkgY29tbW9uIGFyZSBtaXNzdGVwcword2hpY2ggbWFrZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZWxhdGlvbnNoaXAgaGFyZGVyIHRoYW4gaXQgaGFzIHRvIGJlLgorCitDb21wYW5pZXMgb2Z0ZW4gbG9vayB0byBoaXJlIHdlbGwta25vd24gZGV2ZWxvcGVycyB0byBnZXQgYSBkZXZlbG9wbWVudAorZ3JvdXAgc3RhcnRlZC4gIFRoaXMgY2FuLCBpbiBmYWN0LCBiZSBhbiBlZmZlY3RpdmUgdGVjaG5pcXVlLiAgQnV0IGl0IGFsc28KK3RlbmRzIHRvIGJlIGV4cGVuc2l2ZSBhbmQgZG9lcyBub3QgZG8gbXVjaCB0byBncm93IHRoZSBwb29sIG9mIGV4cGVyaWVuY2VkCitrZXJuZWwgZGV2ZWxvcGVycy4gIEl0IGlzIHBvc3NpYmxlIHRvIGJyaW5nIGluLWhvdXNlIGRldmVsb3BlcnMgdXAgdG8gc3BlZWQKK29uIExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudCwgZ2l2ZW4gdGhlIGludmVzdG1lbnQgb2YgYSBiaXQgb2YgdGltZS4gIFRha2luZwordGhpcyB0aW1lIGNhbiBlbmRvdyBhbiBlbXBsb3llciB3aXRoIGEgZ3JvdXAgb2YgZGV2ZWxvcGVycyB3aG8gdW5kZXJzdGFuZAordGhlIGtlcm5lbCBhbmQgdGhlIGNvbXBhbnkgYm90aCwgYW5kIHdobyBjYW4gaGVscCB0byB0cmFpbiBvdGhlcnMgYXMgd2VsbC4KK092ZXIgdGhlIG1lZGl1bSB0ZXJtLCB0aGlzIGlzIG9mdGVuIHRoZSBtb3JlIHByb2ZpdGFibGUgYXBwcm9hY2guCisKK0luZGl2aWR1YWwgZGV2ZWxvcGVycyBhcmUgb2Z0ZW4sIHVuZGVyc3RhbmRhYmx5LCBhdCBhIGxvc3MgZm9yIGEgcGxhY2UgdG8KK3N0YXJ0LiAgQmVnaW5uaW5nIHdpdGggYSBsYXJnZSBwcm9qZWN0IGNhbiBiZSBpbnRpbWlkYXRpbmc7IG9uZSBvZnRlbiB3YW50cwordG8gdGVzdCB0aGUgd2F0ZXJzIHdpdGggc29tZXRoaW5nIHNtYWxsZXIgZmlyc3QuICBUaGlzIGlzIHRoZSBwb2ludCB3aGVyZQorc29tZSBkZXZlbG9wZXJzIGp1bXAgaW50byB0aGUgY3JlYXRpb24gb2YgcGF0Y2hlcyBmaXhpbmcgc3BlbGxpbmcgZXJyb3JzIG9yCittaW5vciBjb2Rpbmcgc3R5bGUgaXNzdWVzLiAgVW5mb3J0dW5hdGVseSwgc3VjaCBwYXRjaGVzIGNyZWF0ZSBhIGxldmVsIG9mCitub2lzZSB3aGljaCBpcyBkaXN0cmFjdGluZyBmb3IgdGhlIGRldmVsb3BtZW50IGNvbW11bml0eSBhcyBhIHdob2xlLCBzbywKK2luY3JlYXNpbmdseSwgdGhleSBhcmUgbG9va2VkIGRvd24gdXBvbi4gIE5ldyBkZXZlbG9wZXJzIHdpc2hpbmcgdG8KK2ludHJvZHVjZSB0aGVtc2VsdmVzIHRvIHRoZSBjb21tdW5pdHkgd2lsbCBub3QgZ2V0IHRoZSBzb3J0IG9mIHJlY2VwdGlvbgordGhleSB3aXNoIGZvciBieSB0aGVzZSBtZWFucy4KKworQW5kcmV3IE1vcnRvbiBnaXZlcyB0aGlzIGFkdmljZSBmb3IgYXNwaXJpbmcga2VybmVsIGRldmVsb3BlcnMKKworOjoKKworCVRoZSAjMSBwcm9qZWN0IGZvciBhbGwga2VybmVsIGJlZ2lubmVycyBzaG91bGQgc3VyZWx5IGJlICJtYWtlIHN1cmUKKwl0aGF0IHRoZSBrZXJuZWwgcnVucyBwZXJmZWN0bHkgYXQgYWxsIHRpbWVzIG9uIGFsbCBtYWNoaW5lcyB3aGljaAorCXlvdSBjYW4gbGF5IHlvdXIgaGFuZHMgb24iLiAgVXN1YWxseSB0aGUgd2F5IHRvIGRvIHRoaXMgaXMgdG8gd29yaworCXdpdGggb3RoZXJzIG9uIGdldHRpbmcgdGhpbmdzIGZpeGVkIHVwICh0aGlzIGNhbiByZXF1aXJlCisJcGVyc2lzdGVuY2UhKSBidXQgdGhhdCdzIGZpbmUgLSBpdCdzIGEgcGFydCBvZiBrZXJuZWwgZGV2ZWxvcG1lbnQuCisKKyhodHRwOi8vbHduLm5ldC9BcnRpY2xlcy8yODM5ODIvKS4KKworSW4gdGhlIGFic2VuY2Ugb2Ygb2J2aW91cyBwcm9ibGVtcyB0byBmaXgsIGRldmVsb3BlcnMgYXJlIGFkdmlzZWQgdG8gbG9vaworYXQgdGhlIGN1cnJlbnQgbGlzdHMgb2YgcmVncmVzc2lvbnMgYW5kIG9wZW4gYnVncyBpbiBnZW5lcmFsLiAgVGhlcmUgaXMKK25ldmVyIGFueSBzaG9ydGFnZSBvZiBpc3N1ZXMgaW4gbmVlZCBvZiBmaXhpbmc7IGJ5IGFkZHJlc3NpbmcgdGhlc2UgaXNzdWVzLAorZGV2ZWxvcGVycyB3aWxsIGdhaW4gZXhwZXJpZW5jZSB3aXRoIHRoZSBwcm9jZXNzIHdoaWxlLCBhdCB0aGUgc2FtZSB0aW1lLAorYnVpbGRpbmcgcmVzcGVjdCB3aXRoIHRoZSByZXN0IG9mIHRoZSBkZXZlbG9wbWVudCBjb21tdW5pdHkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvMy5FYXJseS1zdGFnZSBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy8zLkVhcmx5LXN0YWdlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODdiYTdiLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy8zLkVhcmx5LXN0YWdlCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLTM6IEVBUkxZLVNUQUdFIFBMQU5OSU5HCi0KLVdoZW4gY29udGVtcGxhdGluZyBhIExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudCBwcm9qZWN0LCBpdCBjYW4gYmUgdGVtcHRpbmcKLXRvIGp1bXAgcmlnaHQgaW4gYW5kIHN0YXJ0IGNvZGluZy4gIEFzIHdpdGggYW55IHNpZ25pZmljYW50IHByb2plY3QsCi10aG91Z2gsIG11Y2ggb2YgdGhlIGdyb3VuZHdvcmsgZm9yIHN1Y2Nlc3MgaXMgYmVzdCBsYWlkIGJlZm9yZSB0aGUgZmlyc3QKLWxpbmUgb2YgY29kZSBpcyB3cml0dGVuLiAgU29tZSB0aW1lIHNwZW50IGluIGVhcmx5IHBsYW5uaW5nIGFuZAotY29tbXVuaWNhdGlvbiBjYW4gc2F2ZSBmYXIgbW9yZSB0aW1lIGxhdGVyIG9uLgotCi0KLTMuMTogU1BFQ0lGWUlORyBUSEUgUFJPQkxFTQotCi1MaWtlIGFueSBlbmdpbmVlcmluZyBwcm9qZWN0LCBhIHN1Y2Nlc3NmdWwga2VybmVsIGVuaGFuY2VtZW50IHN0YXJ0cyB3aXRoIGEKLWNsZWFyIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIHRvIGJlIHNvbHZlZC4gIEluIHNvbWUgY2FzZXMsIHRoaXMgc3RlcCBpcwotZWFzeTogd2hlbiBhIGRyaXZlciBpcyBuZWVkZWQgZm9yIGEgc3BlY2lmaWMgcGllY2Ugb2YgaGFyZHdhcmUsIGZvcgotZXhhbXBsZS4gIEluIG90aGVycywgdGhvdWdoLCBpdCBpcyB0ZW1wdGluZyB0byBjb25mdXNlIHRoZSByZWFsIHByb2JsZW0KLXdpdGggdGhlIHByb3Bvc2VkIHNvbHV0aW9uLCBhbmQgdGhhdCBjYW4gbGVhZCB0byBkaWZmaWN1bHRpZXMuCi0KLUNvbnNpZGVyIGFuIGV4YW1wbGU6IHNvbWUgeWVhcnMgYWdvLCBkZXZlbG9wZXJzIHdvcmtpbmcgd2l0aCBMaW51eCBhdWRpbwotc291Z2h0IGEgd2F5IHRvIHJ1biBhcHBsaWNhdGlvbnMgd2l0aG91dCBkcm9wb3V0cyBvciBvdGhlciBhcnRpZmFjdHMgY2F1c2VkCi1ieSBleGNlc3NpdmUgbGF0ZW5jeSBpbiB0aGUgc3lzdGVtLiAgVGhlIHNvbHV0aW9uIHRoZXkgYXJyaXZlZCBhdCB3YXMgYQota2VybmVsIG1vZHVsZSBpbnRlbmRlZCB0byBob29rIGludG8gdGhlIExpbnV4IFNlY3VyaXR5IE1vZHVsZSAoTFNNKQotZnJhbWV3b3JrOyB0aGlzIG1vZHVsZSBjb3VsZCBiZSBjb25maWd1cmVkIHRvIGdpdmUgc3BlY2lmaWMgYXBwbGljYXRpb25zCi1hY2Nlc3MgdG8gdGhlIHJlYWx0aW1lIHNjaGVkdWxlci4gIFRoaXMgbW9kdWxlIHdhcyBpbXBsZW1lbnRlZCBhbmQgc2VudCB0bwotdGhlIGxpbnV4LWtlcm5lbCBtYWlsaW5nIGxpc3QsIHdoZXJlIGl0IGltbWVkaWF0ZWx5IHJhbiBpbnRvIHByb2JsZW1zLgotCi1UbyB0aGUgYXVkaW8gZGV2ZWxvcGVycywgdGhpcyBzZWN1cml0eSBtb2R1bGUgd2FzIHN1ZmZpY2llbnQgdG8gc29sdmUgdGhlaXIKLWltbWVkaWF0ZSBwcm9ibGVtLiAgVG8gdGhlIHdpZGVyIGtlcm5lbCBjb21tdW5pdHksIHRob3VnaCwgaXQgd2FzIHNlZW4gYXMgYQotbWlzdXNlIG9mIHRoZSBMU00gZnJhbWV3b3JrICh3aGljaCBpcyBub3QgaW50ZW5kZWQgdG8gY29uZmVyIHByaXZpbGVnZXMKLW9udG8gcHJvY2Vzc2VzIHdoaWNoIHRoZXkgd291bGQgbm90IG90aGVyd2lzZSBoYXZlKSBhbmQgYSByaXNrIHRvIHN5c3RlbQotc3RhYmlsaXR5LiAgVGhlaXIgcHJlZmVycmVkIHNvbHV0aW9ucyBpbnZvbHZlZCByZWFsdGltZSBzY2hlZHVsaW5nIGFjY2VzcwotdmlhIHRoZSBybGltaXQgbWVjaGFuaXNtIGZvciB0aGUgc2hvcnQgdGVybSwgYW5kIG9uZ29pbmcgbGF0ZW5jeSByZWR1Y3Rpb24KLXdvcmsgaW4gdGhlIGxvbmcgdGVybS4KLQotVGhlIGF1ZGlvIGNvbW11bml0eSwgaG93ZXZlciwgY291bGQgbm90IHNlZSBwYXN0IHRoZSBwYXJ0aWN1bGFyIHNvbHV0aW9uCi10aGV5IGhhZCBpbXBsZW1lbnRlZDsgdGhleSB3ZXJlIHVud2lsbGluZyB0byBhY2NlcHQgYWx0ZXJuYXRpdmVzLiAgVGhlCi1yZXN1bHRpbmcgZGlzYWdyZWVtZW50IGxlZnQgdGhvc2UgZGV2ZWxvcGVycyBmZWVsaW5nIGRpc2lsbHVzaW9uZWQgd2l0aCB0aGUKLWVudGlyZSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvY2Vzczsgb25lIG9mIHRoZW0gd2VudCBiYWNrIHRvIGFuIGF1ZGlvIGxpc3QKLWFuZCBwb3N0ZWQgdGhpczoKLQotCVRoZXJlIGFyZSBhIG51bWJlciBvZiB2ZXJ5IGdvb2QgTGludXgga2VybmVsIGRldmVsb3BlcnMsIGJ1dCB0aGV5Ci0JdGVuZCB0byBnZXQgb3V0c2hvdXRlZCBieSBhIGxhcmdlIGNyb3dkIG9mIGFycm9nYW50IGZvb2xzLiBUcnlpbmcKLQl0byBjb21tdW5pY2F0ZSB1c2VyIHJlcXVpcmVtZW50cyB0byB0aGVzZSBwZW9wbGUgaXMgYSB3YXN0ZSBvZgotCXRpbWUuIFRoZXkgYXJlIG11Y2ggdG9vICJpbnRlbGxpZ2VudCIgdG8gbGlzdGVuIHRvIGxlc3NlciBtb3J0YWxzLgotCi0oaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvMTMxNzc2LykuCi0KLVRoZSByZWFsaXR5IG9mIHRoZSBzaXR1YXRpb24gd2FzIGRpZmZlcmVudDsgdGhlIGtlcm5lbCBkZXZlbG9wZXJzIHdlcmUgZmFyCi1tb3JlIGNvbmNlcm5lZCBhYm91dCBzeXN0ZW0gc3RhYmlsaXR5LCBsb25nLXRlcm0gbWFpbnRlbmFuY2UsIGFuZCBmaW5kaW5nCi10aGUgcmlnaHQgc29sdXRpb24gdG8gdGhlIHByb2JsZW0gdGhhbiB0aGV5IHdlcmUgd2l0aCBhIHNwZWNpZmljIG1vZHVsZS4KLVRoZSBtb3JhbCBvZiB0aGUgc3RvcnkgaXMgdG8gZm9jdXMgb24gdGhlIHByb2JsZW0gLSBub3QgYSBzcGVjaWZpYyBzb2x1dGlvbgotLSBhbmQgdG8gZGlzY3VzcyBpdCB3aXRoIHRoZSBkZXZlbG9wbWVudCBjb21tdW5pdHkgYmVmb3JlIGludmVzdGluZyBpbiB0aGUKLWNyZWF0aW9uIG9mIGEgYm9keSBvZiBjb2RlLgotCi1Tbywgd2hlbiBjb250ZW1wbGF0aW5nIGEga2VybmVsIGRldmVsb3BtZW50IHByb2plY3QsIG9uZSBzaG91bGQgb2J0YWluCi1hbnN3ZXJzIHRvIGEgc2hvcnQgc2V0IG9mIHF1ZXN0aW9uczoKLQotIC0gV2hhdCwgZXhhY3RseSwgaXMgdGhlIHByb2JsZW0gd2hpY2ggbmVlZHMgdG8gYmUgc29sdmVkPwotCi0gLSBXaG8gYXJlIHRoZSB1c2VycyBhZmZlY3RlZCBieSB0aGlzIHByb2JsZW0/ICBXaGljaCB1c2UgY2FzZXMgc2hvdWxkIHRoZQotICAgc29sdXRpb24gYWRkcmVzcz8KLQotIC0gSG93IGRvZXMgdGhlIGtlcm5lbCBmYWxsIHNob3J0IGluIGFkZHJlc3NpbmcgdGhhdCBwcm9ibGVtIG5vdz8KLQotT25seSB0aGVuIGRvZXMgaXQgbWFrZSBzZW5zZSB0byBzdGFydCBjb25zaWRlcmluZyBwb3NzaWJsZSBzb2x1dGlvbnMuCi0KLQotMy4yOiBFQVJMWSBESVNDVVNTSU9OCi0KLVdoZW4gcGxhbm5pbmcgYSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvamVjdCwgaXQgbWFrZXMgZ3JlYXQgc2Vuc2UgdG8gaG9sZAotZGlzY3Vzc2lvbnMgd2l0aCB0aGUgY29tbXVuaXR5IGJlZm9yZSBsYXVuY2hpbmcgaW50byBpbXBsZW1lbnRhdGlvbi4gIEVhcmx5Ci1jb21tdW5pY2F0aW9uIGNhbiBzYXZlIHRpbWUgYW5kIHRyb3VibGUgaW4gYSBudW1iZXIgb2Ygd2F5czoKLQotIC0gSXQgbWF5IHdlbGwgYmUgdGhhdCB0aGUgcHJvYmxlbSBpcyBhZGRyZXNzZWQgYnkgdGhlIGtlcm5lbCBpbiB3YXlzIHdoaWNoCi0gICB5b3UgaGF2ZSBub3QgdW5kZXJzdG9vZC4gIFRoZSBMaW51eCBrZXJuZWwgaXMgbGFyZ2UgYW5kIGhhcyBhIG51bWJlciBvZgotICAgZmVhdHVyZXMgYW5kIGNhcGFiaWxpdGllcyB3aGljaCBhcmUgbm90IGltbWVkaWF0ZWx5IG9idmlvdXMuICBOb3QgYWxsCi0gICBrZXJuZWwgY2FwYWJpbGl0aWVzIGFyZSBkb2N1bWVudGVkIGFzIHdlbGwgYXMgb25lIG1pZ2h0IGxpa2UsIGFuZCBpdCBpcwotICAgZWFzeSB0byBtaXNzIHRoaW5ncy4gIFlvdXIgYXV0aG9yIGhhcyBzZWVuIHRoZSBwb3N0aW5nIG9mIGEgY29tcGxldGUKLSAgIGRyaXZlciB3aGljaCBkdXBsaWNhdGVkIGFuIGV4aXN0aW5nIGRyaXZlciB0aGF0IHRoZSBuZXcgYXV0aG9yIGhhZCBiZWVuCi0gICB1bmF3YXJlIG9mLiAgQ29kZSB3aGljaCByZWludmVudHMgZXhpc3Rpbmcgd2hlZWxzIGlzIG5vdCBvbmx5IHdhc3RlZnVsOwotICAgaXQgd2lsbCBhbHNvIG5vdCBiZSBhY2NlcHRlZCBpbnRvIHRoZSBtYWlubGluZSBrZXJuZWwuCi0KLSAtIFRoZXJlIG1heSBiZSBlbGVtZW50cyBvZiB0aGUgcHJvcG9zZWQgc29sdXRpb24gd2hpY2ggd2lsbCBub3QgYmUKLSAgIGFjY2VwdGFibGUgZm9yIG1haW5saW5lIG1lcmdpbmcuICBJdCBpcyBiZXR0ZXIgdG8gZmluZCBvdXQgYWJvdXQKLSAgIHByb2JsZW1zIGxpa2UgdGhpcyBiZWZvcmUgd3JpdGluZyB0aGUgY29kZS4KLQotIC0gSXQncyBlbnRpcmVseSBwb3NzaWJsZSB0aGF0IG90aGVyIGRldmVsb3BlcnMgaGF2ZSB0aG91Z2h0IGFib3V0IHRoZQotICAgcHJvYmxlbTsgdGhleSBtYXkgaGF2ZSBpZGVhcyBmb3IgYSBiZXR0ZXIgc29sdXRpb24sIGFuZCBtYXkgYmUgd2lsbGluZwotICAgdG8gaGVscCBpbiB0aGUgY3JlYXRpb24gb2YgdGhhdCBzb2x1dGlvbi4KLQotWWVhcnMgb2YgZXhwZXJpZW5jZSB3aXRoIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgY29tbXVuaXR5IGhhdmUgdGF1Z2h0IGEKLWNsZWFyIGxlc3Nvbjoga2VybmVsIGNvZGUgd2hpY2ggaXMgZGVzaWduZWQgYW5kIGRldmVsb3BlZCBiZWhpbmQgY2xvc2VkCi1kb29ycyBpbnZhcmlhYmx5IGhhcyBwcm9ibGVtcyB3aGljaCBhcmUgb25seSByZXZlYWxlZCB3aGVuIHRoZSBjb2RlIGlzCi1yZWxlYXNlZCBpbnRvIHRoZSBjb21tdW5pdHkuICBTb21ldGltZXMgdGhlc2UgcHJvYmxlbXMgYXJlIHNldmVyZSwKLXJlcXVpcmluZyBtb250aHMgb3IgeWVhcnMgb2YgZWZmb3J0IGJlZm9yZSB0aGUgY29kZSBjYW4gYmUgYnJvdWdodCB1cCB0bwotdGhlIGtlcm5lbCBjb21tdW5pdHkncyBzdGFuZGFyZHMuICBTb21lIGV4YW1wbGVzIGluY2x1ZGU6Ci0KLSAtIFRoZSBEZXZpY2VzY2FwZSBuZXR3b3JrIHN0YWNrIHdhcyBkZXNpZ25lZCBhbmQgaW1wbGVtZW50ZWQgZm9yCi0gICBzaW5nbGUtcHJvY2Vzc29yIHN5c3RlbXMuICBJdCBjb3VsZCBub3QgYmUgbWVyZ2VkIGludG8gdGhlIG1haW5saW5lCi0gICB1bnRpbCBpdCB3YXMgbWFkZSBzdWl0YWJsZSBmb3IgbXVsdGlwcm9jZXNzb3Igc3lzdGVtcy4gIFJldHJvZml0dGluZwotICAgbG9ja2luZyBhbmQgc3VjaCBpbnRvIGNvZGUgaXMgYSBkaWZmaWN1bHQgdGFzazsgYXMgYSByZXN1bHQsIHRoZSBtZXJnaW5nCi0gICBvZiB0aGlzIGNvZGUgKG5vdyBjYWxsZWQgbWFjODAyMTEpIHdhcyBkZWxheWVkIGZvciBvdmVyIGEgeWVhci4KLQotIC0gVGhlIFJlaXNlcjQgZmlsZXN5c3RlbSBpbmNsdWRlZCBhIG51bWJlciBvZiBjYXBhYmlsaXRpZXMgd2hpY2gsIGluIHRoZQotICAgY29yZSBrZXJuZWwgZGV2ZWxvcGVycycgb3Bpbmlvbiwgc2hvdWxkIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBpbiB0aGUKLSAgIHZpcnR1YWwgZmlsZXN5c3RlbSBsYXllciBpbnN0ZWFkLiAgSXQgYWxzbyBpbmNsdWRlZCBmZWF0dXJlcyB3aGljaCBjb3VsZAotICAgbm90IGVhc2lseSBiZSBpbXBsZW1lbnRlZCB3aXRob3V0IGV4cG9zaW5nIHRoZSBzeXN0ZW0gdG8gdXNlci1jYXVzZWQKLSAgIGRlYWRsb2Nrcy4gIFRoZSBsYXRlIHJldmVsYXRpb24gb2YgdGhlc2UgcHJvYmxlbXMgLSBhbmQgcmVmdXNhbCB0bwotICAgYWRkcmVzcyBzb21lIG9mIHRoZW0gLSBoYXMgY2F1c2VkIFJlaXNlcjQgdG8gc3RheSBvdXQgb2YgdGhlIG1haW5saW5lCi0gICBrZXJuZWwuCi0KLSAtIFRoZSBBcHBBcm1vciBzZWN1cml0eSBtb2R1bGUgbWFkZSB1c2Ugb2YgaW50ZXJuYWwgdmlydHVhbCBmaWxlc3lzdGVtCi0gICBkYXRhIHN0cnVjdHVyZXMgaW4gd2F5cyB3aGljaCB3ZXJlIGNvbnNpZGVyZWQgdG8gYmUgdW5zYWZlIGFuZAotICAgdW5yZWxpYWJsZS4gIFRoaXMgY29uY2VybiAoYW1vbmcgb3RoZXJzKSBrZXB0IEFwcEFybW9yIG91dCBvZiB0aGUKLSAgIG1haW5saW5lIGZvciB5ZWFycy4KLQotSW4gZWFjaCBvZiB0aGVzZSBjYXNlcywgYSBncmVhdCBkZWFsIG9mIHBhaW4gYW5kIGV4dHJhIHdvcmsgY291bGQgaGF2ZSBiZWVuCi1hdm9pZGVkIHdpdGggc29tZSBlYXJseSBkaXNjdXNzaW9uIHdpdGggdGhlIGtlcm5lbCBkZXZlbG9wZXJzLgotCi0KLTMuMzogV0hPIERPIFlPVSBUQUxLIFRPPwotCi1XaGVuIGRldmVsb3BlcnMgZGVjaWRlIHRvIHRha2UgdGhlaXIgcGxhbnMgcHVibGljLCB0aGUgbmV4dCBxdWVzdGlvbiB3aWxsCi1iZTogd2hlcmUgZG8gd2Ugc3RhcnQ/ICBUaGUgYW5zd2VyIGlzIHRvIGZpbmQgdGhlIHJpZ2h0IG1haWxpbmcgbGlzdChzKSBhbmQKLXRoZSByaWdodCBtYWludGFpbmVyLiAgRm9yIG1haWxpbmcgbGlzdHMsIHRoZSBiZXN0IGFwcHJvYWNoIGlzIHRvIGxvb2sgaW4KLXRoZSBNQUlOVEFJTkVSUyBmaWxlIGZvciBhIHJlbGV2YW50IHBsYWNlIHRvIHBvc3QuICBJZiB0aGVyZSBpcyBhIHN1aXRhYmxlCi1zdWJzeXN0ZW0gbGlzdCwgcG9zdGluZyB0aGVyZSBpcyBvZnRlbiBwcmVmZXJhYmxlIHRvIHBvc3Rpbmcgb24KLWxpbnV4LWtlcm5lbDsgeW91IGFyZSBtb3JlIGxpa2VseSB0byByZWFjaCBkZXZlbG9wZXJzIHdpdGggZXhwZXJ0aXNlIGluIHRoZQotcmVsZXZhbnQgc3Vic3lzdGVtIGFuZCB0aGUgZW52aXJvbm1lbnQgbWF5IGJlIG1vcmUgc3VwcG9ydGl2ZS4KLQotRmluZGluZyBtYWludGFpbmVycyBjYW4gYmUgYSBiaXQgaGFyZGVyLiAgQWdhaW4sIHRoZSBNQUlOVEFJTkVSUyBmaWxlIGlzCi10aGUgcGxhY2UgdG8gc3RhcnQuICBUaGF0IGZpbGUgdGVuZHMgdG8gbm90IGFsd2F5cyBiZSB1cCB0byBkYXRlLCB0aG91Z2gsCi1hbmQgbm90IGFsbCBzdWJzeXN0ZW1zIGFyZSByZXByZXNlbnRlZCB0aGVyZS4gIFRoZSBwZXJzb24gbGlzdGVkIGluIHRoZQotTUFJTlRBSU5FUlMgZmlsZSBtYXksIGluIGZhY3QsIG5vdCBiZSB0aGUgcGVyc29uIHdobyBpcyBhY3R1YWxseSBhY3RpbmcgaW4KLXRoYXQgcm9sZSBjdXJyZW50bHkuICBTbywgd2hlbiB0aGVyZSBpcyBkb3VidCBhYm91dCB3aG8gdG8gY29udGFjdCwgYQotdXNlZnVsIHRyaWNrIGlzIHRvIHVzZSBnaXQgKGFuZCAiZ2l0IGxvZyIgaW4gcGFydGljdWxhcikgdG8gc2VlIHdobyBpcwotY3VycmVudGx5IGFjdGl2ZSB3aXRoaW4gdGhlIHN1YnN5c3RlbSBvZiBpbnRlcmVzdC4gIExvb2sgYXQgd2hvIGlzIHdyaXRpbmcKLXBhdGNoZXMsIGFuZCB3aG8sIGlmIGFueWJvZHksIGlzIGF0dGFjaGluZyBTaWduZWQtb2ZmLWJ5IGxpbmVzIHRvIHRob3NlCi1wYXRjaGVzLiAgVGhvc2UgYXJlIHRoZSBwZW9wbGUgd2hvIHdpbGwgYmUgYmVzdCBwbGFjZWQgdG8gaGVscCB3aXRoIGEgbmV3Ci1kZXZlbG9wbWVudCBwcm9qZWN0LgotCi1UaGUgdGFzayBvZiBmaW5kaW5nIHRoZSByaWdodCBtYWludGFpbmVyIGlzIHNvbWV0aW1lcyBjaGFsbGVuZ2luZyBlbm91Z2gKLXRoYXQgdGhlIGtlcm5lbCBkZXZlbG9wZXJzIGhhdmUgYWRkZWQgYSBzY3JpcHQgdG8gZWFzZSB0aGUgcHJvY2VzczoKLQotCS4uLi9zY3JpcHRzL2dldF9tYWludGFpbmVyLnBsCi0KLVRoaXMgc2NyaXB0IHdpbGwgcmV0dXJuIHRoZSBjdXJyZW50IG1haW50YWluZXIocykgZm9yIGEgZ2l2ZW4gZmlsZSBvcgotZGlyZWN0b3J5IHdoZW4gZ2l2ZW4gdGhlICItZiIgb3B0aW9uLiAgSWYgcGFzc2VkIGEgcGF0Y2ggb24gdGhlCi1jb21tYW5kIGxpbmUsIGl0IHdpbGwgbGlzdCB0aGUgbWFpbnRhaW5lcnMgd2hvIHNob3VsZCBwcm9iYWJseSByZWNlaXZlCi1jb3BpZXMgb2YgdGhlIHBhdGNoLiAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIG9wdGlvbnMgcmVndWxhdGluZyBob3cgaGFyZAotZ2V0X21haW50YWluZXIucGwgd2lsbCBzZWFyY2ggZm9yIG1haW50YWluZXJzOyBwbGVhc2UgYmUgY2FyZWZ1bCBhYm91dAotdXNpbmcgdGhlIG1vcmUgYWdncmVzc2l2ZSBvcHRpb25zIGFzIHlvdSBtYXkgZW5kIHVwIGluY2x1ZGluZyBkZXZlbG9wZXJzCi13aG8gaGF2ZSBubyByZWFsIGludGVyZXN0IGluIHRoZSBjb2RlIHlvdSBhcmUgbW9kaWZ5aW5nLgotCi1JZiBhbGwgZWxzZSBmYWlscywgdGFsa2luZyB0byBBbmRyZXcgTW9ydG9uIGNhbiBiZSBhbiBlZmZlY3RpdmUgd2F5IHRvCi10cmFjayBkb3duIGEgbWFpbnRhaW5lciBmb3IgYSBzcGVjaWZpYyBwaWVjZSBvZiBjb2RlLgotCi0KLTMuNDogV0hFTiBUTyBQT1NUPwotCi1JZiBwb3NzaWJsZSwgcG9zdGluZyB5b3VyIHBsYW5zIGR1cmluZyB0aGUgZWFybHkgc3RhZ2VzIGNhbiBvbmx5IGJlCi1oZWxwZnVsLiAgRGVzY3JpYmUgdGhlIHByb2JsZW0gYmVpbmcgc29sdmVkIGFuZCBhbnkgcGxhbnMgdGhhdCBoYXZlIGJlZW4KLW1hZGUgb24gaG93IHRoZSBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIGRvbmUuICBBbnkgaW5mb3JtYXRpb24geW91IGNhbgotcHJvdmlkZSBjYW4gaGVscCB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5IHByb3ZpZGUgdXNlZnVsIGlucHV0IG9uIHRoZQotcHJvamVjdC4KLQotT25lIGRpc2NvdXJhZ2luZyB0aGluZyB3aGljaCBjYW4gaGFwcGVuIGF0IHRoaXMgc3RhZ2UgaXMgbm90IGEgaG9zdGlsZQotcmVhY3Rpb24sIGJ1dCwgaW5zdGVhZCwgbGl0dGxlIG9yIG5vIHJlYWN0aW9uIGF0IGFsbC4gIFRoZSBzYWQgdHJ1dGggb2YgdGhlCi1tYXR0ZXIgaXMgKDEpIGtlcm5lbCBkZXZlbG9wZXJzIHRlbmQgdG8gYmUgYnVzeSwgKDIpIHRoZXJlIGlzIG5vIHNob3J0YWdlCi1vZiBwZW9wbGUgd2l0aCBncmFuZCBwbGFucyBhbmQgbGl0dGxlIGNvZGUgKG9yIGV2ZW4gcHJvc3BlY3Qgb2YgY29kZSkgdG8KLWJhY2sgdGhlbSB1cCwgYW5kICgzKSBub2JvZHkgaXMgb2JsaWdhdGVkIHRvIHJldmlldyBvciBjb21tZW50IG9uIGlkZWFzCi1wb3N0ZWQgYnkgb3RoZXJzLiAgQmV5b25kIHRoYXQsIGhpZ2gtbGV2ZWwgZGVzaWducyBvZnRlbiBoaWRlIHByb2JsZW1zCi13aGljaCBhcmUgb25seSByZXZpZXdlZCB3aGVuIHNvbWVib2R5IGFjdHVhbGx5IHRyaWVzIHRvIGltcGxlbWVudCB0aG9zZQotZGVzaWduczsgZm9yIHRoYXQgcmVhc29uLCBrZXJuZWwgZGV2ZWxvcGVycyB3b3VsZCByYXRoZXIgc2VlIHRoZSBjb2RlLgotCi1JZiBhIHJlcXVlc3QtZm9yLWNvbW1lbnRzIHBvc3RpbmcgeWllbGRzIGxpdHRsZSBpbiB0aGUgd2F5IG9mIGNvbW1lbnRzLCBkbwotbm90IGFzc3VtZSB0aGF0IGl0IG1lYW5zIHRoZXJlIGlzIG5vIGludGVyZXN0IGluIHRoZSBwcm9qZWN0LgotVW5mb3J0dW5hdGVseSwgeW91IGFsc28gY2Fubm90IGFzc3VtZSB0aGF0IHRoZXJlIGFyZSBubyBwcm9ibGVtcyB3aXRoIHlvdXIKLWlkZWEuICBUaGUgYmVzdCB0aGluZyB0byBkbyBpbiB0aGlzIHNpdHVhdGlvbiBpcyB0byBwcm9jZWVkLCBrZWVwaW5nIHRoZQotY29tbXVuaXR5IGluZm9ybWVkIGFzIHlvdSBnby4KLQotCi0zLjU6IEdFVFRJTkcgT0ZGSUNJQUwgQlVZLUlOCi0KLUlmIHlvdXIgd29yayBpcyBiZWluZyBkb25lIGluIGEgY29ycG9yYXRlIGVudmlyb25tZW50IC0gYXMgbW9zdCBMaW51eAota2VybmVsIHdvcmsgaXMgLSB5b3UgbXVzdCwgb2J2aW91c2x5LCBoYXZlIHBlcm1pc3Npb24gZnJvbSBzdWl0YWJseQotZW1wb3dlcmVkIG1hbmFnZXJzIGJlZm9yZSB5b3UgY2FuIHBvc3QgeW91ciBjb21wYW55J3MgcGxhbnMgb3IgY29kZSB0byBhCi1wdWJsaWMgbWFpbGluZyBsaXN0LiAgVGhlIHBvc3Rpbmcgb2YgY29kZSB3aGljaCBoYXMgbm90IGJlZW4gY2xlYXJlZCBmb3IKLXJlbGVhc2UgdW5kZXIgYSBHUEwtY29tcGF0aWJsZSBsaWNlbnNlIGNhbiBiZSBlc3BlY2lhbGx5IHByb2JsZW1hdGljOyB0aGUKLXNvb25lciB0aGF0IGEgY29tcGFueSdzIG1hbmFnZW1lbnQgYW5kIGxlZ2FsIHN0YWZmIGNhbiBhZ3JlZSBvbiB0aGUgcG9zdGluZwotb2YgYSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvamVjdCwgdGhlIGJldHRlciBvZmYgZXZlcnlib2R5IGludm9sdmVkIHdpbGwgYmUuCi0KLVNvbWUgcmVhZGVycyBtYXkgYmUgdGhpbmtpbmcgYXQgdGhpcyBwb2ludCB0aGF0IHRoZWlyIGtlcm5lbCB3b3JrIGlzCi1pbnRlbmRlZCB0byBzdXBwb3J0IGEgcHJvZHVjdCB3aGljaCBkb2VzIG5vdCB5ZXQgaGF2ZSBhbiBvZmZpY2lhbGx5Ci1hY2tub3dsZWRnZWQgZXhpc3RlbmNlLiAgUmV2ZWFsaW5nIHRoZWlyIGVtcGxveWVyJ3MgcGxhbnMgb24gYSBwdWJsaWMKLW1haWxpbmcgbGlzdCBtYXkgbm90IGJlIGEgdmlhYmxlIG9wdGlvbi4gIEluIGNhc2VzIGxpa2UgdGhpcywgaXQgaXMgd29ydGgKLWNvbnNpZGVyaW5nIHdoZXRoZXIgdGhlIHNlY3JlY3kgaXMgcmVhbGx5IG5lY2Vzc2FyeTsgdGhlcmUgaXMgb2Z0ZW4gbm8gcmVhbAotbmVlZCB0byBrZWVwIGRldmVsb3BtZW50IHBsYW5zIGJlaGluZCBjbG9zZWQgZG9vcnMuCi0KLVRoYXQgc2FpZCwgdGhlcmUgYXJlIGFsc28gY2FzZXMgd2hlcmUgYSBjb21wYW55IGxlZ2l0aW1hdGVseSBjYW5ub3QKLWRpc2Nsb3NlIGl0cyBwbGFucyBlYXJseSBpbiB0aGUgZGV2ZWxvcG1lbnQgcHJvY2Vzcy4gIENvbXBhbmllcyB3aXRoCi1leHBlcmllbmNlZCBrZXJuZWwgZGV2ZWxvcGVycyBtYXkgY2hvb3NlIHRvIHByb2NlZWQgaW4gYW4gb3Blbi1sb29wIG1hbm5lcgotb24gdGhlIGFzc3VtcHRpb24gdGhhdCB0aGV5IHdpbGwgYmUgYWJsZSB0byBhdm9pZCBzZXJpb3VzIGludGVncmF0aW9uCi1wcm9ibGVtcyBsYXRlci4gIEZvciBjb21wYW5pZXMgd2l0aG91dCB0aGF0IHNvcnQgb2YgaW4taG91c2UgZXhwZXJ0aXNlLCB0aGUKLWJlc3Qgb3B0aW9uIGlzIG9mdGVuIHRvIGhpcmUgYW4gb3V0c2lkZSBkZXZlbG9wZXIgdG8gcmV2aWV3IHRoZSBwbGFucyB1bmRlcgotYSBub24tZGlzY2xvc3VyZSBhZ3JlZW1lbnQuICBUaGUgTGludXggRm91bmRhdGlvbiBvcGVyYXRlcyBhbiBOREEgcHJvZ3JhbQotZGVzaWduZWQgdG8gaGVscCB3aXRoIHRoaXMgc29ydCBvZiBzaXR1YXRpb247IG1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kCi1hdDoKLQotICAgIGh0dHA6Ly93d3cubGludXhmb3VuZGF0aW9uLm9yZy9lbi9OREFfcHJvZ3JhbQotCi1UaGlzIGtpbmQgb2YgcmV2aWV3IGlzIG9mdGVuIGVub3VnaCB0byBhdm9pZCBzZXJpb3VzIHByb2JsZW1zIGxhdGVyIG9uCi13aXRob3V0IHJlcXVpcmluZyBwdWJsaWMgZGlzY2xvc3VyZSBvZiB0aGUgcHJvamVjdC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy8zLkVhcmx5LXN0YWdlLnJzdCBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy8zLkVhcmx5LXN0YWdlLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjJjMGFmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzMuRWFybHktc3RhZ2UucnN0CkBAIC0wLDAgKzEsMjIyIEBACisuLiBfZGV2ZWxvcG1lbnRfZWFybHlfc3RhZ2U6CisKK0Vhcmx5LXN0YWdlIHBsYW5uaW5nCis9PT09PT09PT09PT09PT09PT09PQorCitXaGVuIGNvbnRlbXBsYXRpbmcgYSBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvamVjdCwgaXQgY2FuIGJlIHRlbXB0aW5nCit0byBqdW1wIHJpZ2h0IGluIGFuZCBzdGFydCBjb2RpbmcuICBBcyB3aXRoIGFueSBzaWduaWZpY2FudCBwcm9qZWN0LAordGhvdWdoLCBtdWNoIG9mIHRoZSBncm91bmR3b3JrIGZvciBzdWNjZXNzIGlzIGJlc3QgbGFpZCBiZWZvcmUgdGhlIGZpcnN0CitsaW5lIG9mIGNvZGUgaXMgd3JpdHRlbi4gIFNvbWUgdGltZSBzcGVudCBpbiBlYXJseSBwbGFubmluZyBhbmQKK2NvbW11bmljYXRpb24gY2FuIHNhdmUgZmFyIG1vcmUgdGltZSBsYXRlciBvbi4KKworCitTcGVjaWZ5aW5nIHRoZSBwcm9ibGVtCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xpa2UgYW55IGVuZ2luZWVyaW5nIHByb2plY3QsIGEgc3VjY2Vzc2Z1bCBrZXJuZWwgZW5oYW5jZW1lbnQgc3RhcnRzIHdpdGggYQorY2xlYXIgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdG8gYmUgc29sdmVkLiAgSW4gc29tZSBjYXNlcywgdGhpcyBzdGVwIGlzCitlYXN5OiB3aGVuIGEgZHJpdmVyIGlzIG5lZWRlZCBmb3IgYSBzcGVjaWZpYyBwaWVjZSBvZiBoYXJkd2FyZSwgZm9yCitleGFtcGxlLiAgSW4gb3RoZXJzLCB0aG91Z2gsIGl0IGlzIHRlbXB0aW5nIHRvIGNvbmZ1c2UgdGhlIHJlYWwgcHJvYmxlbQord2l0aCB0aGUgcHJvcG9zZWQgc29sdXRpb24sIGFuZCB0aGF0IGNhbiBsZWFkIHRvIGRpZmZpY3VsdGllcy4KKworQ29uc2lkZXIgYW4gZXhhbXBsZTogc29tZSB5ZWFycyBhZ28sIGRldmVsb3BlcnMgd29ya2luZyB3aXRoIExpbnV4IGF1ZGlvCitzb3VnaHQgYSB3YXkgdG8gcnVuIGFwcGxpY2F0aW9ucyB3aXRob3V0IGRyb3BvdXRzIG9yIG90aGVyIGFydGlmYWN0cyBjYXVzZWQKK2J5IGV4Y2Vzc2l2ZSBsYXRlbmN5IGluIHRoZSBzeXN0ZW0uICBUaGUgc29sdXRpb24gdGhleSBhcnJpdmVkIGF0IHdhcyBhCitrZXJuZWwgbW9kdWxlIGludGVuZGVkIHRvIGhvb2sgaW50byB0aGUgTGludXggU2VjdXJpdHkgTW9kdWxlIChMU00pCitmcmFtZXdvcms7IHRoaXMgbW9kdWxlIGNvdWxkIGJlIGNvbmZpZ3VyZWQgdG8gZ2l2ZSBzcGVjaWZpYyBhcHBsaWNhdGlvbnMKK2FjY2VzcyB0byB0aGUgcmVhbHRpbWUgc2NoZWR1bGVyLiAgVGhpcyBtb2R1bGUgd2FzIGltcGxlbWVudGVkIGFuZCBzZW50IHRvCit0aGUgbGludXgta2VybmVsIG1haWxpbmcgbGlzdCwgd2hlcmUgaXQgaW1tZWRpYXRlbHkgcmFuIGludG8gcHJvYmxlbXMuCisKK1RvIHRoZSBhdWRpbyBkZXZlbG9wZXJzLCB0aGlzIHNlY3VyaXR5IG1vZHVsZSB3YXMgc3VmZmljaWVudCB0byBzb2x2ZSB0aGVpcgoraW1tZWRpYXRlIHByb2JsZW0uICBUbyB0aGUgd2lkZXIga2VybmVsIGNvbW11bml0eSwgdGhvdWdoLCBpdCB3YXMgc2VlbiBhcyBhCittaXN1c2Ugb2YgdGhlIExTTSBmcmFtZXdvcmsgKHdoaWNoIGlzIG5vdCBpbnRlbmRlZCB0byBjb25mZXIgcHJpdmlsZWdlcworb250byBwcm9jZXNzZXMgd2hpY2ggdGhleSB3b3VsZCBub3Qgb3RoZXJ3aXNlIGhhdmUpIGFuZCBhIHJpc2sgdG8gc3lzdGVtCitzdGFiaWxpdHkuICBUaGVpciBwcmVmZXJyZWQgc29sdXRpb25zIGludm9sdmVkIHJlYWx0aW1lIHNjaGVkdWxpbmcgYWNjZXNzCit2aWEgdGhlIHJsaW1pdCBtZWNoYW5pc20gZm9yIHRoZSBzaG9ydCB0ZXJtLCBhbmQgb25nb2luZyBsYXRlbmN5IHJlZHVjdGlvbgord29yayBpbiB0aGUgbG9uZyB0ZXJtLgorCitUaGUgYXVkaW8gY29tbXVuaXR5LCBob3dldmVyLCBjb3VsZCBub3Qgc2VlIHBhc3QgdGhlIHBhcnRpY3VsYXIgc29sdXRpb24KK3RoZXkgaGFkIGltcGxlbWVudGVkOyB0aGV5IHdlcmUgdW53aWxsaW5nIHRvIGFjY2VwdCBhbHRlcm5hdGl2ZXMuICBUaGUKK3Jlc3VsdGluZyBkaXNhZ3JlZW1lbnQgbGVmdCB0aG9zZSBkZXZlbG9wZXJzIGZlZWxpbmcgZGlzaWxsdXNpb25lZCB3aXRoIHRoZQorZW50aXJlIGtlcm5lbCBkZXZlbG9wbWVudCBwcm9jZXNzOyBvbmUgb2YgdGhlbSB3ZW50IGJhY2sgdG8gYW4gYXVkaW8gbGlzdAorYW5kIHBvc3RlZCB0aGlzOgorCisJVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHZlcnkgZ29vZCBMaW51eCBrZXJuZWwgZGV2ZWxvcGVycywgYnV0IHRoZXkKKwl0ZW5kIHRvIGdldCBvdXRzaG91dGVkIGJ5IGEgbGFyZ2UgY3Jvd2Qgb2YgYXJyb2dhbnQgZm9vbHMuIFRyeWluZworCXRvIGNvbW11bmljYXRlIHVzZXIgcmVxdWlyZW1lbnRzIHRvIHRoZXNlIHBlb3BsZSBpcyBhIHdhc3RlIG9mCisJdGltZS4gVGhleSBhcmUgbXVjaCB0b28gImludGVsbGlnZW50IiB0byBsaXN0ZW4gdG8gbGVzc2VyIG1vcnRhbHMuCisKKyhodHRwOi8vbHduLm5ldC9BcnRpY2xlcy8xMzE3NzYvKS4KKworVGhlIHJlYWxpdHkgb2YgdGhlIHNpdHVhdGlvbiB3YXMgZGlmZmVyZW50OyB0aGUga2VybmVsIGRldmVsb3BlcnMgd2VyZSBmYXIKK21vcmUgY29uY2VybmVkIGFib3V0IHN5c3RlbSBzdGFiaWxpdHksIGxvbmctdGVybSBtYWludGVuYW5jZSwgYW5kIGZpbmRpbmcKK3RoZSByaWdodCBzb2x1dGlvbiB0byB0aGUgcHJvYmxlbSB0aGFuIHRoZXkgd2VyZSB3aXRoIGEgc3BlY2lmaWMgbW9kdWxlLgorVGhlIG1vcmFsIG9mIHRoZSBzdG9yeSBpcyB0byBmb2N1cyBvbiB0aGUgcHJvYmxlbSAtIG5vdCBhIHNwZWNpZmljIHNvbHV0aW9uCistIGFuZCB0byBkaXNjdXNzIGl0IHdpdGggdGhlIGRldmVsb3BtZW50IGNvbW11bml0eSBiZWZvcmUgaW52ZXN0aW5nIGluIHRoZQorY3JlYXRpb24gb2YgYSBib2R5IG9mIGNvZGUuCisKK1NvLCB3aGVuIGNvbnRlbXBsYXRpbmcgYSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvamVjdCwgb25lIHNob3VsZCBvYnRhaW4KK2Fuc3dlcnMgdG8gYSBzaG9ydCBzZXQgb2YgcXVlc3Rpb25zOgorCisgLSBXaGF0LCBleGFjdGx5LCBpcyB0aGUgcHJvYmxlbSB3aGljaCBuZWVkcyB0byBiZSBzb2x2ZWQ/CisKKyAtIFdobyBhcmUgdGhlIHVzZXJzIGFmZmVjdGVkIGJ5IHRoaXMgcHJvYmxlbT8gIFdoaWNoIHVzZSBjYXNlcyBzaG91bGQgdGhlCisgICBzb2x1dGlvbiBhZGRyZXNzPworCisgLSBIb3cgZG9lcyB0aGUga2VybmVsIGZhbGwgc2hvcnQgaW4gYWRkcmVzc2luZyB0aGF0IHByb2JsZW0gbm93PworCitPbmx5IHRoZW4gZG9lcyBpdCBtYWtlIHNlbnNlIHRvIHN0YXJ0IGNvbnNpZGVyaW5nIHBvc3NpYmxlIHNvbHV0aW9ucy4KKworCitFYXJseSBkaXNjdXNzaW9uCistLS0tLS0tLS0tLS0tLS0tCisKK1doZW4gcGxhbm5pbmcgYSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvamVjdCwgaXQgbWFrZXMgZ3JlYXQgc2Vuc2UgdG8gaG9sZAorZGlzY3Vzc2lvbnMgd2l0aCB0aGUgY29tbXVuaXR5IGJlZm9yZSBsYXVuY2hpbmcgaW50byBpbXBsZW1lbnRhdGlvbi4gIEVhcmx5Citjb21tdW5pY2F0aW9uIGNhbiBzYXZlIHRpbWUgYW5kIHRyb3VibGUgaW4gYSBudW1iZXIgb2Ygd2F5czoKKworIC0gSXQgbWF5IHdlbGwgYmUgdGhhdCB0aGUgcHJvYmxlbSBpcyBhZGRyZXNzZWQgYnkgdGhlIGtlcm5lbCBpbiB3YXlzIHdoaWNoCisgICB5b3UgaGF2ZSBub3QgdW5kZXJzdG9vZC4gIFRoZSBMaW51eCBrZXJuZWwgaXMgbGFyZ2UgYW5kIGhhcyBhIG51bWJlciBvZgorICAgZmVhdHVyZXMgYW5kIGNhcGFiaWxpdGllcyB3aGljaCBhcmUgbm90IGltbWVkaWF0ZWx5IG9idmlvdXMuICBOb3QgYWxsCisgICBrZXJuZWwgY2FwYWJpbGl0aWVzIGFyZSBkb2N1bWVudGVkIGFzIHdlbGwgYXMgb25lIG1pZ2h0IGxpa2UsIGFuZCBpdCBpcworICAgZWFzeSB0byBtaXNzIHRoaW5ncy4gIFlvdXIgYXV0aG9yIGhhcyBzZWVuIHRoZSBwb3N0aW5nIG9mIGEgY29tcGxldGUKKyAgIGRyaXZlciB3aGljaCBkdXBsaWNhdGVkIGFuIGV4aXN0aW5nIGRyaXZlciB0aGF0IHRoZSBuZXcgYXV0aG9yIGhhZCBiZWVuCisgICB1bmF3YXJlIG9mLiAgQ29kZSB3aGljaCByZWludmVudHMgZXhpc3Rpbmcgd2hlZWxzIGlzIG5vdCBvbmx5IHdhc3RlZnVsOworICAgaXQgd2lsbCBhbHNvIG5vdCBiZSBhY2NlcHRlZCBpbnRvIHRoZSBtYWlubGluZSBrZXJuZWwuCisKKyAtIFRoZXJlIG1heSBiZSBlbGVtZW50cyBvZiB0aGUgcHJvcG9zZWQgc29sdXRpb24gd2hpY2ggd2lsbCBub3QgYmUKKyAgIGFjY2VwdGFibGUgZm9yIG1haW5saW5lIG1lcmdpbmcuICBJdCBpcyBiZXR0ZXIgdG8gZmluZCBvdXQgYWJvdXQKKyAgIHByb2JsZW1zIGxpa2UgdGhpcyBiZWZvcmUgd3JpdGluZyB0aGUgY29kZS4KKworIC0gSXQncyBlbnRpcmVseSBwb3NzaWJsZSB0aGF0IG90aGVyIGRldmVsb3BlcnMgaGF2ZSB0aG91Z2h0IGFib3V0IHRoZQorICAgcHJvYmxlbTsgdGhleSBtYXkgaGF2ZSBpZGVhcyBmb3IgYSBiZXR0ZXIgc29sdXRpb24sIGFuZCBtYXkgYmUgd2lsbGluZworICAgdG8gaGVscCBpbiB0aGUgY3JlYXRpb24gb2YgdGhhdCBzb2x1dGlvbi4KKworWWVhcnMgb2YgZXhwZXJpZW5jZSB3aXRoIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgY29tbXVuaXR5IGhhdmUgdGF1Z2h0IGEKK2NsZWFyIGxlc3Nvbjoga2VybmVsIGNvZGUgd2hpY2ggaXMgZGVzaWduZWQgYW5kIGRldmVsb3BlZCBiZWhpbmQgY2xvc2VkCitkb29ycyBpbnZhcmlhYmx5IGhhcyBwcm9ibGVtcyB3aGljaCBhcmUgb25seSByZXZlYWxlZCB3aGVuIHRoZSBjb2RlIGlzCityZWxlYXNlZCBpbnRvIHRoZSBjb21tdW5pdHkuICBTb21ldGltZXMgdGhlc2UgcHJvYmxlbXMgYXJlIHNldmVyZSwKK3JlcXVpcmluZyBtb250aHMgb3IgeWVhcnMgb2YgZWZmb3J0IGJlZm9yZSB0aGUgY29kZSBjYW4gYmUgYnJvdWdodCB1cCB0bwordGhlIGtlcm5lbCBjb21tdW5pdHkncyBzdGFuZGFyZHMuICBTb21lIGV4YW1wbGVzIGluY2x1ZGU6CisKKyAtIFRoZSBEZXZpY2VzY2FwZSBuZXR3b3JrIHN0YWNrIHdhcyBkZXNpZ25lZCBhbmQgaW1wbGVtZW50ZWQgZm9yCisgICBzaW5nbGUtcHJvY2Vzc29yIHN5c3RlbXMuICBJdCBjb3VsZCBub3QgYmUgbWVyZ2VkIGludG8gdGhlIG1haW5saW5lCisgICB1bnRpbCBpdCB3YXMgbWFkZSBzdWl0YWJsZSBmb3IgbXVsdGlwcm9jZXNzb3Igc3lzdGVtcy4gIFJldHJvZml0dGluZworICAgbG9ja2luZyBhbmQgc3VjaCBpbnRvIGNvZGUgaXMgYSBkaWZmaWN1bHQgdGFzazsgYXMgYSByZXN1bHQsIHRoZSBtZXJnaW5nCisgICBvZiB0aGlzIGNvZGUgKG5vdyBjYWxsZWQgbWFjODAyMTEpIHdhcyBkZWxheWVkIGZvciBvdmVyIGEgeWVhci4KKworIC0gVGhlIFJlaXNlcjQgZmlsZXN5c3RlbSBpbmNsdWRlZCBhIG51bWJlciBvZiBjYXBhYmlsaXRpZXMgd2hpY2gsIGluIHRoZQorICAgY29yZSBrZXJuZWwgZGV2ZWxvcGVycycgb3Bpbmlvbiwgc2hvdWxkIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBpbiB0aGUKKyAgIHZpcnR1YWwgZmlsZXN5c3RlbSBsYXllciBpbnN0ZWFkLiAgSXQgYWxzbyBpbmNsdWRlZCBmZWF0dXJlcyB3aGljaCBjb3VsZAorICAgbm90IGVhc2lseSBiZSBpbXBsZW1lbnRlZCB3aXRob3V0IGV4cG9zaW5nIHRoZSBzeXN0ZW0gdG8gdXNlci1jYXVzZWQKKyAgIGRlYWRsb2Nrcy4gIFRoZSBsYXRlIHJldmVsYXRpb24gb2YgdGhlc2UgcHJvYmxlbXMgLSBhbmQgcmVmdXNhbCB0bworICAgYWRkcmVzcyBzb21lIG9mIHRoZW0gLSBoYXMgY2F1c2VkIFJlaXNlcjQgdG8gc3RheSBvdXQgb2YgdGhlIG1haW5saW5lCisgICBrZXJuZWwuCisKKyAtIFRoZSBBcHBBcm1vciBzZWN1cml0eSBtb2R1bGUgbWFkZSB1c2Ugb2YgaW50ZXJuYWwgdmlydHVhbCBmaWxlc3lzdGVtCisgICBkYXRhIHN0cnVjdHVyZXMgaW4gd2F5cyB3aGljaCB3ZXJlIGNvbnNpZGVyZWQgdG8gYmUgdW5zYWZlIGFuZAorICAgdW5yZWxpYWJsZS4gIFRoaXMgY29uY2VybiAoYW1vbmcgb3RoZXJzKSBrZXB0IEFwcEFybW9yIG91dCBvZiB0aGUKKyAgIG1haW5saW5lIGZvciB5ZWFycy4KKworSW4gZWFjaCBvZiB0aGVzZSBjYXNlcywgYSBncmVhdCBkZWFsIG9mIHBhaW4gYW5kIGV4dHJhIHdvcmsgY291bGQgaGF2ZSBiZWVuCithdm9pZGVkIHdpdGggc29tZSBlYXJseSBkaXNjdXNzaW9uIHdpdGggdGhlIGtlcm5lbCBkZXZlbG9wZXJzLgorCisKK1dobyBkbyB5b3UgdGFsayB0bz8KKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hlbiBkZXZlbG9wZXJzIGRlY2lkZSB0byB0YWtlIHRoZWlyIHBsYW5zIHB1YmxpYywgdGhlIG5leHQgcXVlc3Rpb24gd2lsbAorYmU6IHdoZXJlIGRvIHdlIHN0YXJ0PyAgVGhlIGFuc3dlciBpcyB0byBmaW5kIHRoZSByaWdodCBtYWlsaW5nIGxpc3QocykgYW5kCit0aGUgcmlnaHQgbWFpbnRhaW5lci4gIEZvciBtYWlsaW5nIGxpc3RzLCB0aGUgYmVzdCBhcHByb2FjaCBpcyB0byBsb29rIGluCit0aGUgTUFJTlRBSU5FUlMgZmlsZSBmb3IgYSByZWxldmFudCBwbGFjZSB0byBwb3N0LiAgSWYgdGhlcmUgaXMgYSBzdWl0YWJsZQorc3Vic3lzdGVtIGxpc3QsIHBvc3RpbmcgdGhlcmUgaXMgb2Z0ZW4gcHJlZmVyYWJsZSB0byBwb3N0aW5nIG9uCitsaW51eC1rZXJuZWw7IHlvdSBhcmUgbW9yZSBsaWtlbHkgdG8gcmVhY2ggZGV2ZWxvcGVycyB3aXRoIGV4cGVydGlzZSBpbiB0aGUKK3JlbGV2YW50IHN1YnN5c3RlbSBhbmQgdGhlIGVudmlyb25tZW50IG1heSBiZSBtb3JlIHN1cHBvcnRpdmUuCisKK0ZpbmRpbmcgbWFpbnRhaW5lcnMgY2FuIGJlIGEgYml0IGhhcmRlci4gIEFnYWluLCB0aGUgTUFJTlRBSU5FUlMgZmlsZSBpcwordGhlIHBsYWNlIHRvIHN0YXJ0LiAgVGhhdCBmaWxlIHRlbmRzIHRvIG5vdCBhbHdheXMgYmUgdXAgdG8gZGF0ZSwgdGhvdWdoLAorYW5kIG5vdCBhbGwgc3Vic3lzdGVtcyBhcmUgcmVwcmVzZW50ZWQgdGhlcmUuICBUaGUgcGVyc29uIGxpc3RlZCBpbiB0aGUKK01BSU5UQUlORVJTIGZpbGUgbWF5LCBpbiBmYWN0LCBub3QgYmUgdGhlIHBlcnNvbiB3aG8gaXMgYWN0dWFsbHkgYWN0aW5nIGluCit0aGF0IHJvbGUgY3VycmVudGx5LiAgU28sIHdoZW4gdGhlcmUgaXMgZG91YnQgYWJvdXQgd2hvIHRvIGNvbnRhY3QsIGEKK3VzZWZ1bCB0cmljayBpcyB0byB1c2UgZ2l0IChhbmQgImdpdCBsb2ciIGluIHBhcnRpY3VsYXIpIHRvIHNlZSB3aG8gaXMKK2N1cnJlbnRseSBhY3RpdmUgd2l0aGluIHRoZSBzdWJzeXN0ZW0gb2YgaW50ZXJlc3QuICBMb29rIGF0IHdobyBpcyB3cml0aW5nCitwYXRjaGVzLCBhbmQgd2hvLCBpZiBhbnlib2R5LCBpcyBhdHRhY2hpbmcgU2lnbmVkLW9mZi1ieSBsaW5lcyB0byB0aG9zZQorcGF0Y2hlcy4gIFRob3NlIGFyZSB0aGUgcGVvcGxlIHdobyB3aWxsIGJlIGJlc3QgcGxhY2VkIHRvIGhlbHAgd2l0aCBhIG5ldworZGV2ZWxvcG1lbnQgcHJvamVjdC4KKworVGhlIHRhc2sgb2YgZmluZGluZyB0aGUgcmlnaHQgbWFpbnRhaW5lciBpcyBzb21ldGltZXMgY2hhbGxlbmdpbmcgZW5vdWdoCit0aGF0IHRoZSBrZXJuZWwgZGV2ZWxvcGVycyBoYXZlIGFkZGVkIGEgc2NyaXB0IHRvIGVhc2UgdGhlIHByb2Nlc3M6CisKKzo6CisKKwkuLi4vc2NyaXB0cy9nZXRfbWFpbnRhaW5lci5wbAorCitUaGlzIHNjcmlwdCB3aWxsIHJldHVybiB0aGUgY3VycmVudCBtYWludGFpbmVyKHMpIGZvciBhIGdpdmVuIGZpbGUgb3IKK2RpcmVjdG9yeSB3aGVuIGdpdmVuIHRoZSAiLWYiIG9wdGlvbi4gIElmIHBhc3NlZCBhIHBhdGNoIG9uIHRoZQorY29tbWFuZCBsaW5lLCBpdCB3aWxsIGxpc3QgdGhlIG1haW50YWluZXJzIHdobyBzaG91bGQgcHJvYmFibHkgcmVjZWl2ZQorY29waWVzIG9mIHRoZSBwYXRjaC4gIFRoZXJlIGFyZSBhIG51bWJlciBvZiBvcHRpb25zIHJlZ3VsYXRpbmcgaG93IGhhcmQKK2dldF9tYWludGFpbmVyLnBsIHdpbGwgc2VhcmNoIGZvciBtYWludGFpbmVyczsgcGxlYXNlIGJlIGNhcmVmdWwgYWJvdXQKK3VzaW5nIHRoZSBtb3JlIGFnZ3Jlc3NpdmUgb3B0aW9ucyBhcyB5b3UgbWF5IGVuZCB1cCBpbmNsdWRpbmcgZGV2ZWxvcGVycword2hvIGhhdmUgbm8gcmVhbCBpbnRlcmVzdCBpbiB0aGUgY29kZSB5b3UgYXJlIG1vZGlmeWluZy4KKworSWYgYWxsIGVsc2UgZmFpbHMsIHRhbGtpbmcgdG8gQW5kcmV3IE1vcnRvbiBjYW4gYmUgYW4gZWZmZWN0aXZlIHdheSB0bwordHJhY2sgZG93biBhIG1haW50YWluZXIgZm9yIGEgc3BlY2lmaWMgcGllY2Ugb2YgY29kZS4KKworCitXaGVuIHRvIHBvc3Q/CistLS0tLS0tLS0tLS0tCisKK0lmIHBvc3NpYmxlLCBwb3N0aW5nIHlvdXIgcGxhbnMgZHVyaW5nIHRoZSBlYXJseSBzdGFnZXMgY2FuIG9ubHkgYmUKK2hlbHBmdWwuICBEZXNjcmliZSB0aGUgcHJvYmxlbSBiZWluZyBzb2x2ZWQgYW5kIGFueSBwbGFucyB0aGF0IGhhdmUgYmVlbgorbWFkZSBvbiBob3cgdGhlIGltcGxlbWVudGF0aW9uIHdpbGwgYmUgZG9uZS4gIEFueSBpbmZvcm1hdGlvbiB5b3UgY2FuCitwcm92aWRlIGNhbiBoZWxwIHRoZSBkZXZlbG9wbWVudCBjb21tdW5pdHkgcHJvdmlkZSB1c2VmdWwgaW5wdXQgb24gdGhlCitwcm9qZWN0LgorCitPbmUgZGlzY291cmFnaW5nIHRoaW5nIHdoaWNoIGNhbiBoYXBwZW4gYXQgdGhpcyBzdGFnZSBpcyBub3QgYSBob3N0aWxlCityZWFjdGlvbiwgYnV0LCBpbnN0ZWFkLCBsaXR0bGUgb3Igbm8gcmVhY3Rpb24gYXQgYWxsLiAgVGhlIHNhZCB0cnV0aCBvZiB0aGUKK21hdHRlciBpcyAoMSkga2VybmVsIGRldmVsb3BlcnMgdGVuZCB0byBiZSBidXN5LCAoMikgdGhlcmUgaXMgbm8gc2hvcnRhZ2UKK29mIHBlb3BsZSB3aXRoIGdyYW5kIHBsYW5zIGFuZCBsaXR0bGUgY29kZSAob3IgZXZlbiBwcm9zcGVjdCBvZiBjb2RlKSB0bworYmFjayB0aGVtIHVwLCBhbmQgKDMpIG5vYm9keSBpcyBvYmxpZ2F0ZWQgdG8gcmV2aWV3IG9yIGNvbW1lbnQgb24gaWRlYXMKK3Bvc3RlZCBieSBvdGhlcnMuICBCZXlvbmQgdGhhdCwgaGlnaC1sZXZlbCBkZXNpZ25zIG9mdGVuIGhpZGUgcHJvYmxlbXMKK3doaWNoIGFyZSBvbmx5IHJldmlld2VkIHdoZW4gc29tZWJvZHkgYWN0dWFsbHkgdHJpZXMgdG8gaW1wbGVtZW50IHRob3NlCitkZXNpZ25zOyBmb3IgdGhhdCByZWFzb24sIGtlcm5lbCBkZXZlbG9wZXJzIHdvdWxkIHJhdGhlciBzZWUgdGhlIGNvZGUuCisKK0lmIGEgcmVxdWVzdC1mb3ItY29tbWVudHMgcG9zdGluZyB5aWVsZHMgbGl0dGxlIGluIHRoZSB3YXkgb2YgY29tbWVudHMsIGRvCitub3QgYXNzdW1lIHRoYXQgaXQgbWVhbnMgdGhlcmUgaXMgbm8gaW50ZXJlc3QgaW4gdGhlIHByb2plY3QuCitVbmZvcnR1bmF0ZWx5LCB5b3UgYWxzbyBjYW5ub3QgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG5vIHByb2JsZW1zIHdpdGggeW91cgoraWRlYS4gIFRoZSBiZXN0IHRoaW5nIHRvIGRvIGluIHRoaXMgc2l0dWF0aW9uIGlzIHRvIHByb2NlZWQsIGtlZXBpbmcgdGhlCitjb21tdW5pdHkgaW5mb3JtZWQgYXMgeW91IGdvLgorCisKK0dldHRpbmcgb2ZmaWNpYWwgYnV5LWluCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJZiB5b3VyIHdvcmsgaXMgYmVpbmcgZG9uZSBpbiBhIGNvcnBvcmF0ZSBlbnZpcm9ubWVudCAtIGFzIG1vc3QgTGludXgKK2tlcm5lbCB3b3JrIGlzIC0geW91IG11c3QsIG9idmlvdXNseSwgaGF2ZSBwZXJtaXNzaW9uIGZyb20gc3VpdGFibHkKK2VtcG93ZXJlZCBtYW5hZ2VycyBiZWZvcmUgeW91IGNhbiBwb3N0IHlvdXIgY29tcGFueSdzIHBsYW5zIG9yIGNvZGUgdG8gYQorcHVibGljIG1haWxpbmcgbGlzdC4gIFRoZSBwb3N0aW5nIG9mIGNvZGUgd2hpY2ggaGFzIG5vdCBiZWVuIGNsZWFyZWQgZm9yCityZWxlYXNlIHVuZGVyIGEgR1BMLWNvbXBhdGlibGUgbGljZW5zZSBjYW4gYmUgZXNwZWNpYWxseSBwcm9ibGVtYXRpYzsgdGhlCitzb29uZXIgdGhhdCBhIGNvbXBhbnkncyBtYW5hZ2VtZW50IGFuZCBsZWdhbCBzdGFmZiBjYW4gYWdyZWUgb24gdGhlIHBvc3RpbmcKK29mIGEga2VybmVsIGRldmVsb3BtZW50IHByb2plY3QsIHRoZSBiZXR0ZXIgb2ZmIGV2ZXJ5Ym9keSBpbnZvbHZlZCB3aWxsIGJlLgorCitTb21lIHJlYWRlcnMgbWF5IGJlIHRoaW5raW5nIGF0IHRoaXMgcG9pbnQgdGhhdCB0aGVpciBrZXJuZWwgd29yayBpcworaW50ZW5kZWQgdG8gc3VwcG9ydCBhIHByb2R1Y3Qgd2hpY2ggZG9lcyBub3QgeWV0IGhhdmUgYW4gb2ZmaWNpYWxseQorYWNrbm93bGVkZ2VkIGV4aXN0ZW5jZS4gIFJldmVhbGluZyB0aGVpciBlbXBsb3llcidzIHBsYW5zIG9uIGEgcHVibGljCittYWlsaW5nIGxpc3QgbWF5IG5vdCBiZSBhIHZpYWJsZSBvcHRpb24uICBJbiBjYXNlcyBsaWtlIHRoaXMsIGl0IGlzIHdvcnRoCitjb25zaWRlcmluZyB3aGV0aGVyIHRoZSBzZWNyZWN5IGlzIHJlYWxseSBuZWNlc3Nhcnk7IHRoZXJlIGlzIG9mdGVuIG5vIHJlYWwKK25lZWQgdG8ga2VlcCBkZXZlbG9wbWVudCBwbGFucyBiZWhpbmQgY2xvc2VkIGRvb3JzLgorCitUaGF0IHNhaWQsIHRoZXJlIGFyZSBhbHNvIGNhc2VzIHdoZXJlIGEgY29tcGFueSBsZWdpdGltYXRlbHkgY2Fubm90CitkaXNjbG9zZSBpdHMgcGxhbnMgZWFybHkgaW4gdGhlIGRldmVsb3BtZW50IHByb2Nlc3MuICBDb21wYW5pZXMgd2l0aAorZXhwZXJpZW5jZWQga2VybmVsIGRldmVsb3BlcnMgbWF5IGNob29zZSB0byBwcm9jZWVkIGluIGFuIG9wZW4tbG9vcCBtYW5uZXIKK29uIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhleSB3aWxsIGJlIGFibGUgdG8gYXZvaWQgc2VyaW91cyBpbnRlZ3JhdGlvbgorcHJvYmxlbXMgbGF0ZXIuICBGb3IgY29tcGFuaWVzIHdpdGhvdXQgdGhhdCBzb3J0IG9mIGluLWhvdXNlIGV4cGVydGlzZSwgdGhlCitiZXN0IG9wdGlvbiBpcyBvZnRlbiB0byBoaXJlIGFuIG91dHNpZGUgZGV2ZWxvcGVyIHRvIHJldmlldyB0aGUgcGxhbnMgdW5kZXIKK2Egbm9uLWRpc2Nsb3N1cmUgYWdyZWVtZW50LiAgVGhlIExpbnV4IEZvdW5kYXRpb24gb3BlcmF0ZXMgYW4gTkRBIHByb2dyYW0KK2Rlc2lnbmVkIHRvIGhlbHAgd2l0aCB0aGlzIHNvcnQgb2Ygc2l0dWF0aW9uOyBtb3JlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZAorYXQ6CisKKyAgICBodHRwOi8vd3d3LmxpbnV4Zm91bmRhdGlvbi5vcmcvZW4vTkRBX3Byb2dyYW0KKworVGhpcyBraW5kIG9mIHJldmlldyBpcyBvZnRlbiBlbm91Z2ggdG8gYXZvaWQgc2VyaW91cyBwcm9ibGVtcyBsYXRlciBvbgord2l0aG91dCByZXF1aXJpbmcgcHVibGljIGRpc2Nsb3N1cmUgb2YgdGhlIHByb2plY3QuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNC5Db2RpbmcgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNC5Db2RpbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhM2VlNzcuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzQuQ29kaW5nCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLTQ6IEdFVFRJTkcgVEhFIENPREUgUklHSFQKLQotV2hpbGUgdGhlcmUgaXMgbXVjaCB0byBiZSBzYWlkIGZvciBhIHNvbGlkIGFuZCBjb21tdW5pdHktb3JpZW50ZWQgZGVzaWduCi1wcm9jZXNzLCB0aGUgcHJvb2Ygb2YgYW55IGtlcm5lbCBkZXZlbG9wbWVudCBwcm9qZWN0IGlzIGluIHRoZSByZXN1bHRpbmcKLWNvZGUuICBJdCBpcyB0aGUgY29kZSB3aGljaCB3aWxsIGJlIGV4YW1pbmVkIGJ5IG90aGVyIGRldmVsb3BlcnMgYW5kIG1lcmdlZAotKG9yIG5vdCkgaW50byB0aGUgbWFpbmxpbmUgdHJlZS4gIFNvIGl0IGlzIHRoZSBxdWFsaXR5IG9mIHRoaXMgY29kZSB3aGljaAotd2lsbCBkZXRlcm1pbmUgdGhlIHVsdGltYXRlIHN1Y2Nlc3Mgb2YgdGhlIHByb2plY3QuCi0KLVRoaXMgc2VjdGlvbiB3aWxsIGV4YW1pbmUgdGhlIGNvZGluZyBwcm9jZXNzLiAgV2UnbGwgc3RhcnQgd2l0aCBhIGxvb2sgYXQgYQotbnVtYmVyIG9mIHdheXMgaW4gd2hpY2gga2VybmVsIGRldmVsb3BlcnMgY2FuIGdvIHdyb25nLiAgVGhlbiB0aGUgZm9jdXMKLXdpbGwgc2hpZnQgdG93YXJkIGRvaW5nIHRoaW5ncyByaWdodCBhbmQgdGhlIHRvb2xzIHdoaWNoIGNhbiBoZWxwIGluIHRoYXQKLXF1ZXN0LgotCi0KLTQuMTogUElURkFMTFMKLQotKiBDb2Rpbmcgc3R5bGUKLQotVGhlIGtlcm5lbCBoYXMgbG9uZyBoYWQgYSBzdGFuZGFyZCBjb2Rpbmcgc3R5bGUsIGRlc2NyaWJlZCBpbgotRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZS4gIEZvciBtdWNoIG9mIHRoYXQgdGltZSwgdGhlIHBvbGljaWVzIGRlc2NyaWJlZAotaW4gdGhhdCBmaWxlIHdlcmUgdGFrZW4gYXMgYmVpbmcsIGF0IG1vc3QsIGFkdmlzb3J5LiAgQXMgYSByZXN1bHQsIHRoZXJlIGlzCi1hIHN1YnN0YW50aWFsIGFtb3VudCBvZiBjb2RlIGluIHRoZSBrZXJuZWwgd2hpY2ggZG9lcyBub3QgbWVldCB0aGUgY29kaW5nCi1zdHlsZSBndWlkZWxpbmVzLiAgVGhlIHByZXNlbmNlIG9mIHRoYXQgY29kZSBsZWFkcyB0byB0d28gaW5kZXBlbmRlbnQKLWhhemFyZHMgZm9yIGtlcm5lbCBkZXZlbG9wZXJzLgotCi1UaGUgZmlyc3Qgb2YgdGhlc2UgaXMgdG8gYmVsaWV2ZSB0aGF0IHRoZSBrZXJuZWwgY29kaW5nIHN0YW5kYXJkcyBkbyBub3QKLW1hdHRlciBhbmQgYXJlIG5vdCBlbmZvcmNlZC4gIFRoZSB0cnV0aCBvZiB0aGUgbWF0dGVyIGlzIHRoYXQgYWRkaW5nIG5ldwotY29kZSB0byB0aGUga2VybmVsIGlzIHZlcnkgZGlmZmljdWx0IGlmIHRoYXQgY29kZSBpcyBub3QgY29kZWQgYWNjb3JkaW5nIHRvCi10aGUgc3RhbmRhcmQ7IG1hbnkgZGV2ZWxvcGVycyB3aWxsIHJlcXVlc3QgdGhhdCB0aGUgY29kZSBiZSByZWZvcm1hdHRlZAotYmVmb3JlIHRoZXkgd2lsbCBldmVuIHJldmlldyBpdC4gIEEgY29kZSBiYXNlIGFzIGxhcmdlIGFzIHRoZSBrZXJuZWwKLXJlcXVpcmVzIHNvbWUgdW5pZm9ybWl0eSBvZiBjb2RlIHRvIG1ha2UgaXQgcG9zc2libGUgZm9yIGRldmVsb3BlcnMgdG8KLXF1aWNrbHkgdW5kZXJzdGFuZCBhbnkgcGFydCBvZiBpdC4gIFNvIHRoZXJlIGlzIG5vIGxvbmdlciByb29tIGZvcgotc3RyYW5nZWx5LWZvcm1hdHRlZCBjb2RlLgotCi1PY2Nhc2lvbmFsbHksIHRoZSBrZXJuZWwncyBjb2Rpbmcgc3R5bGUgd2lsbCBydW4gaW50byBjb25mbGljdCB3aXRoIGFuCi1lbXBsb3llcidzIG1hbmRhdGVkIHN0eWxlLiAgSW4gc3VjaCBjYXNlcywgdGhlIGtlcm5lbCdzIHN0eWxlIHdpbGwgaGF2ZSB0bwotd2luIGJlZm9yZSB0aGUgY29kZSBjYW4gYmUgbWVyZ2VkLiAgUHV0dGluZyBjb2RlIGludG8gdGhlIGtlcm5lbCBtZWFucwotZ2l2aW5nIHVwIGEgZGVncmVlIG9mIGNvbnRyb2wgaW4gYSBudW1iZXIgb2Ygd2F5cyAtIGluY2x1ZGluZyBjb250cm9sIG92ZXIKLWhvdyB0aGUgY29kZSBpcyBmb3JtYXR0ZWQuCi0KLVRoZSBvdGhlciB0cmFwIGlzIHRvIGFzc3VtZSB0aGF0IGNvZGUgd2hpY2ggaXMgYWxyZWFkeSBpbiB0aGUga2VybmVsIGlzCi11cmdlbnRseSBpbiBuZWVkIG9mIGNvZGluZyBzdHlsZSBmaXhlcy4gIERldmVsb3BlcnMgbWF5IHN0YXJ0IHRvIGdlbmVyYXRlCi1yZWZvcm1hdHRpbmcgcGF0Y2hlcyBhcyBhIHdheSBvZiBnYWluaW5nIGZhbWlsaWFyaXR5IHdpdGggdGhlIHByb2Nlc3MsIG9yCi1hcyBhIHdheSBvZiBnZXR0aW5nIHRoZWlyIG5hbWUgaW50byB0aGUga2VybmVsIGNoYW5nZWxvZ3MgLSBvciBib3RoLiAgQnV0Ci1wdXJlIGNvZGluZyBzdHlsZSBmaXhlcyBhcmUgc2VlbiBhcyBub2lzZSBieSB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5OwotdGhleSB0ZW5kIHRvIGdldCBhIGNoaWxseSByZWNlcHRpb24uICBTbyB0aGlzIHR5cGUgb2YgcGF0Y2ggaXMgYmVzdAotYXZvaWRlZC4gIEl0IGlzIG5hdHVyYWwgdG8gZml4IHRoZSBzdHlsZSBvZiBhIHBpZWNlIG9mIGNvZGUgd2hpbGUgd29ya2luZwotb24gaXQgZm9yIG90aGVyIHJlYXNvbnMsIGJ1dCBjb2Rpbmcgc3R5bGUgY2hhbmdlcyBzaG91bGQgbm90IGJlIG1hZGUgZm9yCi10aGVpciBvd24gc2FrZS4KLQotVGhlIGNvZGluZyBzdHlsZSBkb2N1bWVudCBhbHNvIHNob3VsZCBub3QgYmUgcmVhZCBhcyBhbiBhYnNvbHV0ZSBsYXcgd2hpY2gKLWNhbiBuZXZlciBiZSB0cmFuc2dyZXNzZWQuICBJZiB0aGVyZSBpcyBhIGdvb2QgcmVhc29uIHRvIGdvIGFnYWluc3QgdGhlCi1zdHlsZSAoYSBsaW5lIHdoaWNoIGJlY29tZXMgZmFyIGxlc3MgcmVhZGFibGUgaWYgc3BsaXQgdG8gZml0IHdpdGhpbiB0aGUKLTgwLWNvbHVtbiBsaW1pdCwgZm9yIGV4YW1wbGUpLCBqdXN0IGRvIGl0LgotCi0KLSogQWJzdHJhY3Rpb24gbGF5ZXJzCi0KLUNvbXB1dGVyIFNjaWVuY2UgcHJvZmVzc29ycyB0ZWFjaCBzdHVkZW50cyB0byBtYWtlIGV4dGVuc2l2ZSB1c2Ugb2YKLWFic3RyYWN0aW9uIGxheWVycyBpbiB0aGUgbmFtZSBvZiBmbGV4aWJpbGl0eSBhbmQgaW5mb3JtYXRpb24gaGlkaW5nLgotQ2VydGFpbmx5IHRoZSBrZXJuZWwgbWFrZXMgZXh0ZW5zaXZlIHVzZSBvZiBhYnN0cmFjdGlvbjsgbm8gcHJvamVjdAotaW52b2x2aW5nIHNldmVyYWwgbWlsbGlvbiBsaW5lcyBvZiBjb2RlIGNvdWxkIGRvIG90aGVyd2lzZSBhbmQgc3Vydml2ZS4KLUJ1dCBleHBlcmllbmNlIGhhcyBzaG93biB0aGF0IGV4Y2Vzc2l2ZSBvciBwcmVtYXR1cmUgYWJzdHJhY3Rpb24gY2FuIGJlCi1qdXN0IGFzIGhhcm1mdWwgYXMgcHJlbWF0dXJlIG9wdGltaXphdGlvbi4gIEFic3RyYWN0aW9uIHNob3VsZCBiZSB1c2VkIHRvCi10aGUgbGV2ZWwgcmVxdWlyZWQgYW5kIG5vIGZ1cnRoZXIuCi0KLUF0IGEgc2ltcGxlIGxldmVsLCBjb25zaWRlciBhIGZ1bmN0aW9uIHdoaWNoIGhhcyBhbiBhcmd1bWVudCB3aGljaCBpcwotYWx3YXlzIHBhc3NlZCBhcyB6ZXJvIGJ5IGFsbCBjYWxsZXJzLiAgT25lIGNvdWxkIHJldGFpbiB0aGF0IGFyZ3VtZW50IGp1c3QKLWluIGNhc2Ugc29tZWJvZHkgZXZlbnR1YWxseSBuZWVkcyB0byB1c2UgdGhlIGV4dHJhIGZsZXhpYmlsaXR5IHRoYXQgaXQKLXByb3ZpZGVzLiAgQnkgdGhhdCB0aW1lLCB0aG91Z2gsIGNoYW5jZXMgYXJlIGdvb2QgdGhhdCB0aGUgY29kZSB3aGljaAotaW1wbGVtZW50cyB0aGlzIGV4dHJhIGFyZ3VtZW50IGhhcyBiZWVuIGJyb2tlbiBpbiBzb21lIHN1YnRsZSB3YXkgd2hpY2ggd2FzCi1uZXZlciBub3RpY2VkIC0gYmVjYXVzZSBpdCBoYXMgbmV2ZXIgYmVlbiB1c2VkLiAgT3IsIHdoZW4gdGhlIG5lZWQgZm9yCi1leHRyYSBmbGV4aWJpbGl0eSBhcmlzZXMsIGl0IGRvZXMgbm90IGRvIHNvIGluIGEgd2F5IHdoaWNoIG1hdGNoZXMgdGhlCi1wcm9ncmFtbWVyJ3MgZWFybHkgZXhwZWN0YXRpb24uICBLZXJuZWwgZGV2ZWxvcGVycyB3aWxsIHJvdXRpbmVseSBzdWJtaXQKLXBhdGNoZXMgdG8gcmVtb3ZlIHVudXNlZCBhcmd1bWVudHM7IHRoZXkgc2hvdWxkLCBpbiBnZW5lcmFsLCBub3QgYmUgYWRkZWQKLWluIHRoZSBmaXJzdCBwbGFjZS4KLQotQWJzdHJhY3Rpb24gbGF5ZXJzIHdoaWNoIGhpZGUgYWNjZXNzIHRvIGhhcmR3YXJlIC0gb2Z0ZW4gdG8gYWxsb3cgdGhlIGJ1bGsKLW9mIGEgZHJpdmVyIHRvIGJlIHVzZWQgd2l0aCBtdWx0aXBsZSBvcGVyYXRpbmcgc3lzdGVtcyAtIGFyZSBlc3BlY2lhbGx5Ci1mcm93bmVkIHVwb24uICBTdWNoIGxheWVycyBvYnNjdXJlIHRoZSBjb2RlIGFuZCBtYXkgaW1wb3NlIGEgcGVyZm9ybWFuY2UKLXBlbmFsdHk7IHRoZXkgZG8gbm90IGJlbG9uZyBpbiB0aGUgTGludXgga2VybmVsLgotCi1PbiB0aGUgb3RoZXIgaGFuZCwgaWYgeW91IGZpbmQgeW91cnNlbGYgY29weWluZyBzaWduaWZpY2FudCBhbW91bnRzIG9mIGNvZGUKLWZyb20gYW5vdGhlciBrZXJuZWwgc3Vic3lzdGVtLCBpdCBpcyB0aW1lIHRvIGFzayB3aGV0aGVyIGl0IHdvdWxkLCBpbiBmYWN0LAotbWFrZSBzZW5zZSB0byBwdWxsIG91dCBzb21lIG9mIHRoYXQgY29kZSBpbnRvIGEgc2VwYXJhdGUgbGlicmFyeSBvciB0bwotaW1wbGVtZW50IHRoYXQgZnVuY3Rpb25hbGl0eSBhdCBhIGhpZ2hlciBsZXZlbC4gIFRoZXJlIGlzIG5vIHZhbHVlIGluCi1yZXBsaWNhdGluZyB0aGUgc2FtZSBjb2RlIHRocm91Z2hvdXQgdGhlIGtlcm5lbC4KLQotCi0qICNpZmRlZiBhbmQgcHJlcHJvY2Vzc29yIHVzZSBpbiBnZW5lcmFsCi0KLVRoZSBDIHByZXByb2Nlc3NvciBzZWVtcyB0byBwcmVzZW50IGEgcG93ZXJmdWwgdGVtcHRhdGlvbiB0byBzb21lIEMKLXByb2dyYW1tZXJzLCB3aG8gc2VlIGl0IGFzIGEgd2F5IHRvIGVmZmljaWVudGx5IGVuY29kZSBhIGdyZWF0IGRlYWwgb2YKLWZsZXhpYmlsaXR5IGludG8gYSBzb3VyY2UgZmlsZS4gIEJ1dCB0aGUgcHJlcHJvY2Vzc29yIGlzIG5vdCBDLCBhbmQgaGVhdnkKLXVzZSBvZiBpdCByZXN1bHRzIGluIGNvZGUgd2hpY2ggaXMgbXVjaCBoYXJkZXIgZm9yIG90aGVycyB0byByZWFkIGFuZAotaGFyZGVyIGZvciB0aGUgY29tcGlsZXIgdG8gY2hlY2sgZm9yIGNvcnJlY3RuZXNzLiAgSGVhdnkgcHJlcHJvY2Vzc29yIHVzZQotaXMgYWxtb3N0IGFsd2F5cyBhIHNpZ24gb2YgY29kZSB3aGljaCBuZWVkcyBzb21lIGNsZWFudXAgd29yay4KLQotQ29uZGl0aW9uYWwgY29tcGlsYXRpb24gd2l0aCAjaWZkZWYgaXMsIGluZGVlZCwgYSBwb3dlcmZ1bCBmZWF0dXJlLCBhbmQgaXQKLWlzIHVzZWQgd2l0aGluIHRoZSBrZXJuZWwuICBCdXQgdGhlcmUgaXMgbGl0dGxlIGRlc2lyZSB0byBzZWUgY29kZSB3aGljaCBpcwotc3ByaW5rbGVkIGxpYmVyYWxseSB3aXRoICNpZmRlZiBibG9ja3MuICBBcyBhIGdlbmVyYWwgcnVsZSwgI2lmZGVmIHVzZQotc2hvdWxkIGJlIGNvbmZpbmVkIHRvIGhlYWRlciBmaWxlcyB3aGVuZXZlciBwb3NzaWJsZS4KLUNvbmRpdGlvbmFsbHktY29tcGlsZWQgY29kZSBjYW4gYmUgY29uZmluZWQgdG8gZnVuY3Rpb25zIHdoaWNoLCBpZiB0aGUgY29kZQotaXMgbm90IHRvIGJlIHByZXNlbnQsIHNpbXBseSBiZWNvbWUgZW1wdHkuICBUaGUgY29tcGlsZXIgd2lsbCB0aGVuIHF1aWV0bHkKLW9wdGltaXplIG91dCB0aGUgY2FsbCB0byB0aGUgZW1wdHkgZnVuY3Rpb24uICBUaGUgcmVzdWx0IGlzIGZhciBjbGVhbmVyCi1jb2RlIHdoaWNoIGlzIGVhc2llciB0byBmb2xsb3cuCi0KLUMgcHJlcHJvY2Vzc29yIG1hY3JvcyBwcmVzZW50IGEgbnVtYmVyIG9mIGhhemFyZHMsIGluY2x1ZGluZyBwb3NzaWJsZQotbXVsdGlwbGUgZXZhbHVhdGlvbiBvZiBleHByZXNzaW9ucyB3aXRoIHNpZGUgZWZmZWN0cyBhbmQgbm8gdHlwZSBzYWZldHkuCi1JZiB5b3UgYXJlIHRlbXB0ZWQgdG8gZGVmaW5lIGEgbWFjcm8sIGNvbnNpZGVyIGNyZWF0aW5nIGFuIGlubGluZSBmdW5jdGlvbgotaW5zdGVhZC4gIFRoZSBjb2RlIHdoaWNoIHJlc3VsdHMgd2lsbCBiZSB0aGUgc2FtZSwgYnV0IGlubGluZSBmdW5jdGlvbnMgYXJlCi1lYXNpZXIgdG8gcmVhZCwgZG8gbm90IGV2YWx1YXRlIHRoZWlyIGFyZ3VtZW50cyBtdWx0aXBsZSB0aW1lcywgYW5kIGFsbG93Ci10aGUgY29tcGlsZXIgdG8gcGVyZm9ybSB0eXBlIGNoZWNraW5nIG9uIHRoZSBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZS4KLQotCi0qIElubGluZSBmdW5jdGlvbnMKLQotSW5saW5lIGZ1bmN0aW9ucyBwcmVzZW50IGEgaGF6YXJkIG9mIHRoZWlyIG93biwgdGhvdWdoLiAgUHJvZ3JhbW1lcnMgY2FuCi1iZWNvbWUgZW5hbW9yZWQgb2YgdGhlIHBlcmNlaXZlZCBlZmZpY2llbmN5IGluaGVyZW50IGluIGF2b2lkaW5nIGEgZnVuY3Rpb24KLWNhbGwgYW5kIGZpbGwgYSBzb3VyY2UgZmlsZSB3aXRoIGlubGluZSBmdW5jdGlvbnMuICBUaG9zZSBmdW5jdGlvbnMsCi1ob3dldmVyLCBjYW4gYWN0dWFsbHkgcmVkdWNlIHBlcmZvcm1hbmNlLiAgU2luY2UgdGhlaXIgY29kZSBpcyByZXBsaWNhdGVkCi1hdCBlYWNoIGNhbGwgc2l0ZSwgdGhleSBlbmQgdXAgYmxvYXRpbmcgdGhlIHNpemUgb2YgdGhlIGNvbXBpbGVkIGtlcm5lbC4KLVRoYXQsIGluIHR1cm4sIGNyZWF0ZXMgcHJlc3N1cmUgb24gdGhlIHByb2Nlc3NvcidzIG1lbW9yeSBjYWNoZXMsIHdoaWNoIGNhbgotc2xvdyBleGVjdXRpb24gZHJhbWF0aWNhbGx5LiAgSW5saW5lIGZ1bmN0aW9ucywgYXMgYSBydWxlLCBzaG91bGQgYmUgcXVpdGUKLXNtYWxsIGFuZCByZWxhdGl2ZWx5IHJhcmUuICBUaGUgY29zdCBvZiBhIGZ1bmN0aW9uIGNhbGwsIGFmdGVyIGFsbCwgaXMgbm90Ci10aGF0IGhpZ2g7IHRoZSBjcmVhdGlvbiBvZiBsYXJnZSBudW1iZXJzIG9mIGlubGluZSBmdW5jdGlvbnMgaXMgYSBjbGFzc2ljCi1leGFtcGxlIG9mIHByZW1hdHVyZSBvcHRpbWl6YXRpb24uCi0KLUluIGdlbmVyYWwsIGtlcm5lbCBwcm9ncmFtbWVycyBpZ25vcmUgY2FjaGUgZWZmZWN0cyBhdCB0aGVpciBwZXJpbC4gIFRoZQotY2xhc3NpYyB0aW1lL3NwYWNlIHRyYWRlb2ZmIHRhdWdodCBpbiBiZWdpbm5pbmcgZGF0YSBzdHJ1Y3R1cmVzIGNsYXNzZXMKLW9mdGVuIGRvZXMgbm90IGFwcGx5IHRvIGNvbnRlbXBvcmFyeSBoYXJkd2FyZS4gIFNwYWNlICppcyogdGltZSwgaW4gdGhhdCBhCi1sYXJnZXIgcHJvZ3JhbSB3aWxsIHJ1biBzbG93ZXIgdGhhbiBvbmUgd2hpY2ggaXMgbW9yZSBjb21wYWN0LgotCi1Nb3JlIHJlY2VudCBjb21waWxlcnMgdGFrZSBhbiBpbmNyZWFzaW5nbHkgYWN0aXZlIHJvbGUgaW4gZGVjaWRpbmcgd2hldGhlcgotYSBnaXZlbiBmdW5jdGlvbiBzaG91bGQgYWN0dWFsbHkgYmUgaW5saW5lZCBvciBub3QuICBTbyB0aGUgbGliZXJhbAotcGxhY2VtZW50IG9mICJpbmxpbmUiIGtleXdvcmRzIG1heSBub3QganVzdCBiZSBleGNlc3NpdmU7IGl0IGNvdWxkIGFsc28gYmUKLWlycmVsZXZhbnQuCi0KLQotKiBMb2NraW5nCi0KLUluIE1heSwgMjAwNiwgdGhlICJEZXZpY2VzY2FwZSIgbmV0d29ya2luZyBzdGFjayB3YXMsIHdpdGggZ3JlYXQKLWZhbmZhcmUsIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgYW5kIG1hZGUgYXZhaWxhYmxlIGZvciBpbmNsdXNpb24gaW4gdGhlCi1tYWlubGluZSBrZXJuZWwuICBUaGlzIGRvbmF0aW9uIHdhcyB3ZWxjb21lIG5ld3M7IHN1cHBvcnQgZm9yIHdpcmVsZXNzCi1uZXR3b3JraW5nIGluIExpbnV4IHdhcyBjb25zaWRlcmVkIHN1YnN0YW5kYXJkIGF0IGJlc3QsIGFuZCB0aGUgRGV2aWNlc2NhcGUKLXN0YWNrIG9mZmVyZWQgdGhlIHByb21pc2Ugb2YgZml4aW5nIHRoYXQgc2l0dWF0aW9uLiAgWWV0LCB0aGlzIGNvZGUgZGlkIG5vdAotYWN0dWFsbHkgbWFrZSBpdCBpbnRvIHRoZSBtYWlubGluZSB1bnRpbCBKdW5lLCAyMDA3ICgyLjYuMjIpLiAgV2hhdAotaGFwcGVuZWQ/Ci0KLVRoaXMgY29kZSBzaG93ZWQgYSBudW1iZXIgb2Ygc2lnbnMgb2YgaGF2aW5nIGJlZW4gZGV2ZWxvcGVkIGJlaGluZAotY29ycG9yYXRlIGRvb3JzLiAgQnV0IG9uZSBsYXJnZSBwcm9ibGVtIGluIHBhcnRpY3VsYXIgd2FzIHRoYXQgaXQgd2FzIG5vdAotZGVzaWduZWQgdG8gd29yayBvbiBtdWx0aXByb2Nlc3NvciBzeXN0ZW1zLiAgQmVmb3JlIHRoaXMgbmV0d29ya2luZyBzdGFjawotKG5vdyBjYWxsZWQgbWFjODAyMTEpIGNvdWxkIGJlIG1lcmdlZCwgYSBsb2NraW5nIHNjaGVtZSBuZWVkZWQgdG8gYmUKLXJldHJvZml0dGVkIG9udG8gaXQuICAKLQotT25jZSB1cG9uIGEgdGltZSwgTGludXgga2VybmVsIGNvZGUgY291bGQgYmUgZGV2ZWxvcGVkIHdpdGhvdXQgdGhpbmtpbmcKLWFib3V0IHRoZSBjb25jdXJyZW5jeSBpc3N1ZXMgcHJlc2VudGVkIGJ5IG11bHRpcHJvY2Vzc29yIHN5c3RlbXMuICBOb3csCi1ob3dldmVyLCB0aGlzIGRvY3VtZW50IGlzIGJlaW5nIHdyaXR0ZW4gb24gYSBkdWFsLWNvcmUgbGFwdG9wLiAgRXZlbiBvbgotc2luZ2xlLXByb2Nlc3NvciBzeXN0ZW1zLCB3b3JrIGJlaW5nIGRvbmUgdG8gaW1wcm92ZSByZXNwb25zaXZlbmVzcyB3aWxsCi1yYWlzZSB0aGUgbGV2ZWwgb2YgY29uY3VycmVuY3kgd2l0aGluIHRoZSBrZXJuZWwuICBUaGUgZGF5cyB3aGVuIGtlcm5lbAotY29kZSBjb3VsZCBiZSB3cml0dGVuIHdpdGhvdXQgdGhpbmtpbmcgYWJvdXQgbG9ja2luZyBhcmUgbG9uZyBwYXN0LgotCi1BbnkgcmVzb3VyY2UgKGRhdGEgc3RydWN0dXJlcywgaGFyZHdhcmUgcmVnaXN0ZXJzLCBldGMuKSB3aGljaCBjb3VsZCBiZQotYWNjZXNzZWQgY29uY3VycmVudGx5IGJ5IG1vcmUgdGhhbiBvbmUgdGhyZWFkIG11c3QgYmUgcHJvdGVjdGVkIGJ5IGEgbG9jay4KLU5ldyBjb2RlIHNob3VsZCBiZSB3cml0dGVuIHdpdGggdGhpcyByZXF1aXJlbWVudCBpbiBtaW5kOyByZXRyb2ZpdHRpbmcKLWxvY2tpbmcgYWZ0ZXIgdGhlIGZhY3QgaXMgYSByYXRoZXIgbW9yZSBkaWZmaWN1bHQgdGFzay4gIEtlcm5lbCBkZXZlbG9wZXJzCi1zaG91bGQgdGFrZSB0aGUgdGltZSB0byB1bmRlcnN0YW5kIHRoZSBhdmFpbGFibGUgbG9ja2luZyBwcmltaXRpdmVzIHdlbGwKLWVub3VnaCB0byBwaWNrIHRoZSByaWdodCB0b29sIGZvciB0aGUgam9iLiAgQ29kZSB3aGljaCBzaG93cyBhIGxhY2sgb2YKLWF0dGVudGlvbiB0byBjb25jdXJyZW5jeSB3aWxsIGhhdmUgYSBkaWZmaWN1bHQgcGF0aCBpbnRvIHRoZSBtYWlubGluZS4KLQotCi0qIFJlZ3Jlc3Npb25zCi0KLU9uZSBmaW5hbCBoYXphcmQgd29ydGggbWVudGlvbmluZyBpcyB0aGlzOiBpdCBjYW4gYmUgdGVtcHRpbmcgdG8gbWFrZSBhCi1jaGFuZ2UgKHdoaWNoIG1heSBicmluZyBiaWcgaW1wcm92ZW1lbnRzKSB3aGljaCBjYXVzZXMgc29tZXRoaW5nIHRvIGJyZWFrCi1mb3IgZXhpc3RpbmcgdXNlcnMuICBUaGlzIGtpbmQgb2YgY2hhbmdlIGlzIGNhbGxlZCBhICJyZWdyZXNzaW9uLCIgYW5kCi1yZWdyZXNzaW9ucyBoYXZlIGJlY29tZSBtb3N0IHVud2VsY29tZSBpbiB0aGUgbWFpbmxpbmUga2VybmVsLiAgV2l0aCBmZXcKLWV4Y2VwdGlvbnMsIGNoYW5nZXMgd2hpY2ggY2F1c2UgcmVncmVzc2lvbnMgd2lsbCBiZSBiYWNrZWQgb3V0IGlmIHRoZQotcmVncmVzc2lvbiBjYW5ub3QgYmUgZml4ZWQgaW4gYSB0aW1lbHkgbWFubmVyLiAgRmFyIGJldHRlciB0byBhdm9pZCB0aGUKLXJlZ3Jlc3Npb24gaW4gdGhlIGZpcnN0IHBsYWNlLgotCi1JdCBpcyBvZnRlbiBhcmd1ZWQgdGhhdCBhIHJlZ3Jlc3Npb24gY2FuIGJlIGp1c3RpZmllZCBpZiBpdCBjYXVzZXMgdGhpbmdzCi10byB3b3JrIGZvciBtb3JlIHBlb3BsZSB0aGFuIGl0IGNyZWF0ZXMgcHJvYmxlbXMgZm9yLiAgV2h5IG5vdCBtYWtlIGEKLWNoYW5nZSBpZiBpdCBicmluZ3MgbmV3IGZ1bmN0aW9uYWxpdHkgdG8gdGVuIHN5c3RlbXMgZm9yIGVhY2ggb25lIGl0Ci1icmVha3M/ICBUaGUgYmVzdCBhbnN3ZXIgdG8gdGhpcyBxdWVzdGlvbiB3YXMgZXhwcmVzc2VkIGJ5IExpbnVzIGluIEp1bHksCi0yMDA3OgotCi0JU28gd2UgZG9uJ3QgZml4IGJ1Z3MgYnkgaW50cm9kdWNpbmcgbmV3IHByb2JsZW1zLiAgVGhhdCB3YXkgbGllcwotCW1hZG5lc3MsIGFuZCBub2JvZHkgZXZlciBrbm93cyBpZiB5b3UgYWN0dWFsbHkgbWFrZSBhbnkgcmVhbAotCXByb2dyZXNzIGF0IGFsbC4gSXMgaXQgdHdvIHN0ZXBzIGZvcndhcmRzLCBvbmUgc3RlcCBiYWNrLCBvciBvbmUKLQlzdGVwIGZvcndhcmQgYW5kIHR3byBzdGVwcyBiYWNrPwotCi0oaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvMjQzNDYwLykuCi0KLUFuIGVzcGVjaWFsbHkgdW53ZWxjb21lIHR5cGUgb2YgcmVncmVzc2lvbiBpcyBhbnkgc29ydCBvZiBjaGFuZ2UgdG8gdGhlCi11c2VyLXNwYWNlIEFCSS4gIE9uY2UgYW4gaW50ZXJmYWNlIGhhcyBiZWVuIGV4cG9ydGVkIHRvIHVzZXIgc3BhY2UsIGl0IG11c3QKLWJlIHN1cHBvcnRlZCBpbmRlZmluaXRlbHkuICBUaGlzIGZhY3QgbWFrZXMgdGhlIGNyZWF0aW9uIG9mIHVzZXItc3BhY2UKLWludGVyZmFjZXMgcGFydGljdWxhcmx5IGNoYWxsZW5naW5nOiBzaW5jZSB0aGV5IGNhbm5vdCBiZSBjaGFuZ2VkIGluCi1pbmNvbXBhdGlibGUgd2F5cywgdGhleSBtdXN0IGJlIGRvbmUgcmlnaHQgdGhlIGZpcnN0IHRpbWUuICBGb3IgdGhpcwotcmVhc29uLCBhIGdyZWF0IGRlYWwgb2YgdGhvdWdodCwgY2xlYXIgZG9jdW1lbnRhdGlvbiwgYW5kIHdpZGUgcmV2aWV3IGZvcgotdXNlci1zcGFjZSBpbnRlcmZhY2VzIGlzIGFsd2F5cyByZXF1aXJlZC4KLQotCi0KLTQuMjogQ09ERSBDSEVDS0lORyBUT09MUwotCi1Gb3Igbm93LCBhdCBsZWFzdCwgdGhlIHdyaXRpbmcgb2YgZXJyb3ItZnJlZSBjb2RlIHJlbWFpbnMgYW4gaWRlYWwgdGhhdCBmZXcKLW9mIHVzIGNhbiByZWFjaC4gIFdoYXQgd2UgY2FuIGhvcGUgdG8gZG8sIHRob3VnaCwgaXMgdG8gY2F0Y2ggYW5kIGZpeCBhcwotbWFueSBvZiB0aG9zZSBlcnJvcnMgYXMgcG9zc2libGUgYmVmb3JlIG91ciBjb2RlIGdvZXMgaW50byB0aGUgbWFpbmxpbmUKLWtlcm5lbC4gIFRvIHRoYXQgZW5kLCB0aGUga2VybmVsIGRldmVsb3BlcnMgaGF2ZSBwdXQgdG9nZXRoZXIgYW4gaW1wcmVzc2l2ZQotYXJyYXkgb2YgdG9vbHMgd2hpY2ggY2FuIGNhdGNoIGEgd2lkZSB2YXJpZXR5IG9mIG9ic2N1cmUgcHJvYmxlbXMgaW4gYW4KLWF1dG9tYXRlZCB3YXkuICBBbnkgcHJvYmxlbSBjYXVnaHQgYnkgdGhlIGNvbXB1dGVyIGlzIGEgcHJvYmxlbSB3aGljaCB3aWxsCi1ub3QgYWZmbGljdCBhIHVzZXIgbGF0ZXIgb24sIHNvIGl0IHN0YW5kcyB0byByZWFzb24gdGhhdCB0aGUgYXV0b21hdGVkCi10b29scyBzaG91bGQgYmUgdXNlZCB3aGVuZXZlciBwb3NzaWJsZS4KLQotVGhlIGZpcnN0IHN0ZXAgaXMgc2ltcGx5IHRvIGhlZWQgdGhlIHdhcm5pbmdzIHByb2R1Y2VkIGJ5IHRoZSBjb21waWxlci4KLUNvbnRlbXBvcmFyeSB2ZXJzaW9ucyBvZiBnY2MgY2FuIGRldGVjdCAoYW5kIHdhcm4gYWJvdXQpIGEgbGFyZ2UgbnVtYmVyIG9mCi1wb3RlbnRpYWwgZXJyb3JzLiAgUXVpdGUgb2Z0ZW4sIHRoZXNlIHdhcm5pbmdzIHBvaW50IHRvIHJlYWwgcHJvYmxlbXMuCi1Db2RlIHN1Ym1pdHRlZCBmb3IgcmV2aWV3IHNob3VsZCwgYXMgYSBydWxlLCBub3QgcHJvZHVjZSBhbnkgY29tcGlsZXIKLXdhcm5pbmdzLiAgV2hlbiBzaWxlbmNpbmcgd2FybmluZ3MsIHRha2UgY2FyZSB0byB1bmRlcnN0YW5kIHRoZSByZWFsIGNhdXNlCi1hbmQgdHJ5IHRvIGF2b2lkICJmaXhlcyIgd2hpY2ggbWFrZSB0aGUgd2FybmluZyBnbyBhd2F5IHdpdGhvdXQgYWRkcmVzc2luZwotaXRzIGNhdXNlLgotCi1Ob3RlIHRoYXQgbm90IGFsbCBjb21waWxlciB3YXJuaW5ncyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0LiAgQnVpbGQgdGhlCi1rZXJuZWwgd2l0aCAibWFrZSBFWFRSQV9DRkxBR1M9LVciIHRvIGdldCB0aGUgZnVsbCBzZXQuCi0KLVRoZSBrZXJuZWwgcHJvdmlkZXMgc2V2ZXJhbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgd2hpY2ggdHVybiBvbiBkZWJ1Z2dpbmcKLWZlYXR1cmVzOyBtb3N0IG9mIHRoZXNlIGFyZSBmb3VuZCBpbiB0aGUgImtlcm5lbCBoYWNraW5nIiBzdWJtZW51LiAgU2V2ZXJhbAotb2YgdGhlc2Ugb3B0aW9ucyBzaG91bGQgYmUgdHVybmVkIG9uIGZvciBhbnkga2VybmVsIHVzZWQgZm9yIGRldmVsb3BtZW50IG9yCi10ZXN0aW5nIHB1cnBvc2VzLiAgSW4gcGFydGljdWxhciwgeW91IHNob3VsZCB0dXJuIG9uOgotCi0gLSBFTkFCTEVfV0FSTl9ERVBSRUNBVEVELCBFTkFCTEVfTVVTVF9DSEVDSywgYW5kIEZSQU1FX1dBUk4gdG8gZ2V0IGFuCi0gICBleHRyYSBzZXQgb2Ygd2FybmluZ3MgZm9yIHByb2JsZW1zIGxpa2UgdGhlIHVzZSBvZiBkZXByZWNhdGVkIGludGVyZmFjZXMKLSAgIG9yIGlnbm9yaW5nIGFuIGltcG9ydGFudCByZXR1cm4gdmFsdWUgZnJvbSBhIGZ1bmN0aW9uLiAgVGhlIG91dHB1dAotICAgZ2VuZXJhdGVkIGJ5IHRoZXNlIHdhcm5pbmdzIGNhbiBiZSB2ZXJib3NlLCBidXQgb25lIG5lZWQgbm90IHdvcnJ5IGFib3V0Ci0gICB3YXJuaW5ncyBmcm9tIG90aGVyIHBhcnRzIG9mIHRoZSBrZXJuZWwuCi0KLSAtIERFQlVHX09CSkVDVFMgd2lsbCBhZGQgY29kZSB0byB0cmFjayB0aGUgbGlmZXRpbWUgb2YgdmFyaW91cyBvYmplY3RzCi0gICBjcmVhdGVkIGJ5IHRoZSBrZXJuZWwgYW5kIHdhcm4gd2hlbiB0aGluZ3MgYXJlIGRvbmUgb3V0IG9mIG9yZGVyLiAgSWYKLSAgIHlvdSBhcmUgYWRkaW5nIGEgc3Vic3lzdGVtIHdoaWNoIGNyZWF0ZXMgKGFuZCBleHBvcnRzKSBjb21wbGV4IG9iamVjdHMKLSAgIG9mIGl0cyBvd24sIGNvbnNpZGVyIGFkZGluZyBzdXBwb3J0IGZvciB0aGUgb2JqZWN0IGRlYnVnZ2luZwotICAgaW5mcmFzdHJ1Y3R1cmUuCi0KLSAtIERFQlVHX1NMQUIgY2FuIGZpbmQgYSB2YXJpZXR5IG9mIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCB1c2UgZXJyb3JzOyBpdAotICAgc2hvdWxkIGJlIHVzZWQgb24gbW9zdCBkZXZlbG9wbWVudCBrZXJuZWxzLgotCi0gLSBERUJVR19TUElOTE9DSywgREVCVUdfQVRPTUlDX1NMRUVQLCBhbmQgREVCVUdfTVVURVhFUyB3aWxsIGZpbmQgYQotICAgbnVtYmVyIG9mIGNvbW1vbiBsb2NraW5nIGVycm9ycy4KLQotVGhlcmUgYXJlIHF1aXRlIGEgZmV3IG90aGVyIGRlYnVnZ2luZyBvcHRpb25zLCBzb21lIG9mIHdoaWNoIHdpbGwgYmUKLWRpc2N1c3NlZCBiZWxvdy4gIFNvbWUgb2YgdGhlbSBoYXZlIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaW1wYWN0IGFuZAotc2hvdWxkIG5vdCBiZSB1c2VkIGFsbCBvZiB0aGUgdGltZS4gIEJ1dCBzb21lIHRpbWUgc3BlbnQgbGVhcm5pbmcgdGhlCi1hdmFpbGFibGUgb3B0aW9ucyB3aWxsIGxpa2VseSBiZSBwYWlkIGJhY2sgbWFueSB0aW1lcyBvdmVyIGluIHNob3J0IG9yZGVyLiAKLQotT25lIG9mIHRoZSBoZWF2aWVyIGRlYnVnZ2luZyB0b29scyBpcyB0aGUgbG9ja2luZyBjaGVja2VyLCBvciAibG9ja2RlcC4iCi1UaGlzIHRvb2wgd2lsbCB0cmFjayB0aGUgYWNxdWlzaXRpb24gYW5kIHJlbGVhc2Ugb2YgZXZlcnkgbG9jayAoc3BpbmxvY2sgb3IKLW11dGV4KSBpbiB0aGUgc3lzdGVtLCB0aGUgb3JkZXIgaW4gd2hpY2ggbG9ja3MgYXJlIGFjcXVpcmVkIHJlbGF0aXZlIHRvCi1lYWNoIG90aGVyLCB0aGUgY3VycmVudCBpbnRlcnJ1cHQgZW52aXJvbm1lbnQsIGFuZCBtb3JlLiAgSXQgY2FuIHRoZW4KLWVuc3VyZSB0aGF0IGxvY2tzIGFyZSBhbHdheXMgYWNxdWlyZWQgaW4gdGhlIHNhbWUgb3JkZXIsIHRoYXQgdGhlIHNhbWUKLWludGVycnVwdCBhc3N1bXB0aW9ucyBhcHBseSBpbiBhbGwgc2l0dWF0aW9ucywgYW5kIHNvIG9uLiAgSW4gb3RoZXIgd29yZHMsCi1sb2NrZGVwIGNhbiBmaW5kIGEgbnVtYmVyIG9mIHNjZW5hcmlvcyBpbiB3aGljaCB0aGUgc3lzdGVtIGNvdWxkLCBvbiByYXJlCi1vY2Nhc2lvbiwgZGVhZGxvY2suICBUaGlzIGtpbmQgb2YgcHJvYmxlbSBjYW4gYmUgcGFpbmZ1bCAoZm9yIGJvdGgKLWRldmVsb3BlcnMgYW5kIHVzZXJzKSBpbiBhIGRlcGxveWVkIHN5c3RlbTsgbG9ja2RlcCBhbGxvd3MgdGhlbSB0byBiZSBmb3VuZAotaW4gYW4gYXV0b21hdGVkIG1hbm5lciBhaGVhZCBvZiB0aW1lLiAgQ29kZSB3aXRoIGFueSBzb3J0IG9mIG5vbi10cml2aWFsCi1sb2NraW5nIHNob3VsZCBiZSBydW4gd2l0aCBsb2NrZGVwIGVuYWJsZWQgYmVmb3JlIGJlaW5nIHN1Ym1pdHRlZCBmb3IKLWluY2x1c2lvbi4gCi0KLUFzIGEgZGlsaWdlbnQga2VybmVsIHByb2dyYW1tZXIsIHlvdSB3aWxsLCBiZXlvbmQgZG91YnQsIGNoZWNrIHRoZSByZXR1cm4KLXN0YXR1cyBvZiBhbnkgb3BlcmF0aW9uIChzdWNoIGFzIGEgbWVtb3J5IGFsbG9jYXRpb24pIHdoaWNoIGNhbiBmYWlsLiAgVGhlCi1mYWN0IG9mIHRoZSBtYXR0ZXIsIHRob3VnaCwgaXMgdGhhdCB0aGUgcmVzdWx0aW5nIGZhaWx1cmUgcmVjb3ZlcnkgcGF0aHMKLWFyZSwgcHJvYmFibHksIGNvbXBsZXRlbHkgdW50ZXN0ZWQuICBVbnRlc3RlZCBjb2RlIHRlbmRzIHRvIGJlIGJyb2tlbiBjb2RlOwoteW91IGNvdWxkIGJlIG11Y2ggbW9yZSBjb25maWRlbnQgb2YgeW91ciBjb2RlIGlmIGFsbCB0aG9zZSBlcnJvci1oYW5kbGluZwotcGF0aHMgaGFkIGJlZW4gZXhlcmNpc2VkIGEgZmV3IHRpbWVzLgotCi1UaGUga2VybmVsIHByb3ZpZGVzIGEgZmF1bHQgaW5qZWN0aW9uIGZyYW1ld29yayB3aGljaCBjYW4gZG8gZXhhY3RseSB0aGF0LAotZXNwZWNpYWxseSB3aGVyZSBtZW1vcnkgYWxsb2NhdGlvbnMgYXJlIGludm9sdmVkLiAgV2l0aCBmYXVsdCBpbmplY3Rpb24KLWVuYWJsZWQsIGEgY29uZmlndXJhYmxlIHBlcmNlbnRhZ2Ugb2YgbWVtb3J5IGFsbG9jYXRpb25zIHdpbGwgYmUgbWFkZSB0bwotZmFpbDsgdGhlc2UgZmFpbHVyZXMgY2FuIGJlIHJlc3RyaWN0ZWQgdG8gYSBzcGVjaWZpYyByYW5nZSBvZiBjb2RlLgotUnVubmluZyB3aXRoIGZhdWx0IGluamVjdGlvbiBlbmFibGVkIGFsbG93cyB0aGUgcHJvZ3JhbW1lciB0byBzZWUgaG93IHRoZQotY29kZSByZXNwb25kcyB3aGVuIHRoaW5ncyBnbyBiYWRseS4gIFNlZQotRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vZmF1bHQtaW5qZWN0aW9uLnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbgotaG93IHRvIHVzZSB0aGlzIGZhY2lsaXR5LgotCi1PdGhlciBraW5kcyBvZiBlcnJvcnMgY2FuIGJlIGZvdW5kIHdpdGggdGhlICJzcGFyc2UiIHN0YXRpYyBhbmFseXNpcyB0b29sLgotV2l0aCBzcGFyc2UsIHRoZSBwcm9ncmFtbWVyIGNhbiBiZSB3YXJuZWQgYWJvdXQgY29uZnVzaW9uIGJldHdlZW4KLXVzZXItc3BhY2UgYW5kIGtlcm5lbC1zcGFjZSBhZGRyZXNzZXMsIG1peHR1cmUgb2YgYmlnLWVuZGlhbiBhbmQKLXNtYWxsLWVuZGlhbiBxdWFudGl0aWVzLCB0aGUgcGFzc2luZyBvZiBpbnRlZ2VyIHZhbHVlcyB3aGVyZSBhIHNldCBvZiBiaXQKLWZsYWdzIGlzIGV4cGVjdGVkLCBhbmQgc28gb24uICBTcGFyc2UgbXVzdCBiZSBpbnN0YWxsZWQgc2VwYXJhdGVseSAoaXQgY2FuCi1iZSBmb3VuZCBhdCBodHRwczovL3NwYXJzZS53aWtpLmtlcm5lbC5vcmcvaW5kZXgucGhwL01haW5fUGFnZSBpZiB5b3VyCi1kaXN0cmlidXRvciBkb2VzIG5vdCBwYWNrYWdlIGl0KTsgaXQgY2FuIHRoZW4gYmUgcnVuIG9uIHRoZSBjb2RlIGJ5IGFkZGluZwotIkM9MSIgdG8geW91ciBtYWtlIGNvbW1hbmQuCi0KLVRoZSAiQ29jY2luZWxsZSIgdG9vbCAoaHR0cDovL2NvY2NpbmVsbGUubGlwNi5mci8pIGlzIGFibGUgdG8gZmluZCBhIHdpZGUKLXZhcmlldHkgb2YgcG90ZW50aWFsIGNvZGluZyBwcm9ibGVtczsgaXQgY2FuIGFsc28gcHJvcG9zZSBmaXhlcyBmb3IgdGhvc2UKLXByb2JsZW1zLiAgUXVpdGUgYSBmZXcgInNlbWFudGljIHBhdGNoZXMiIGZvciB0aGUga2VybmVsIGhhdmUgYmVlbiBwYWNrYWdlZAotdW5kZXIgdGhlIHNjcmlwdHMvY29jY2luZWxsZSBkaXJlY3Rvcnk7IHJ1bm5pbmcgIm1ha2UgY29jY2ljaGVjayIgd2lsbCBydW4KLXRocm91Z2ggdGhvc2Ugc2VtYW50aWMgcGF0Y2hlcyBhbmQgcmVwb3J0IG9uIGFueSBwcm9ibGVtcyBmb3VuZC4gIFNlZQotRG9jdW1lbnRhdGlvbi9jb2NjaW5lbGxlLnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotT3RoZXIga2luZHMgb2YgcG9ydGFiaWxpdHkgZXJyb3JzIGFyZSBiZXN0IGZvdW5kIGJ5IGNvbXBpbGluZyB5b3VyIGNvZGUgZm9yCi1vdGhlciBhcmNoaXRlY3R1cmVzLiAgSWYgeW91IGRvIG5vdCBoYXBwZW4gdG8gaGF2ZSBhbiBTLzM5MCBzeXN0ZW0gb3IgYQotQmxhY2tmaW4gZGV2ZWxvcG1lbnQgYm9hcmQgaGFuZHksIHlvdSBjYW4gc3RpbGwgcGVyZm9ybSB0aGUgY29tcGlsYXRpb24KLXN0ZXAuICBBIGxhcmdlIHNldCBvZiBjcm9zcyBjb21waWxlcnMgZm9yIHg4NiBzeXN0ZW1zIGNhbiBiZSBmb3VuZCBhdCAKLQotCWh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvdG9vbHMvY3Jvc3N0b29sLwotCi1Tb21lIHRpbWUgc3BlbnQgaW5zdGFsbGluZyBhbmQgdXNpbmcgdGhlc2UgY29tcGlsZXJzIHdpbGwgaGVscCBhdm9pZAotZW1iYXJyYXNzbWVudCBsYXRlci4KLQotCi00LjM6IERPQ1VNRU5UQVRJT04KLQotRG9jdW1lbnRhdGlvbiBoYXMgb2Z0ZW4gYmVlbiBtb3JlIHRoZSBleGNlcHRpb24gdGhhbiB0aGUgcnVsZSB3aXRoIGtlcm5lbAotZGV2ZWxvcG1lbnQuICBFdmVuIHNvLCBhZGVxdWF0ZSBkb2N1bWVudGF0aW9uIHdpbGwgaGVscCB0byBlYXNlIHRoZSBtZXJnaW5nCi1vZiBuZXcgY29kZSBpbnRvIHRoZSBrZXJuZWwsIG1ha2UgbGlmZSBlYXNpZXIgZm9yIG90aGVyIGRldmVsb3BlcnMsIGFuZAotd2lsbCBiZSBoZWxwZnVsIGZvciB5b3VyIHVzZXJzLiAgSW4gbWFueSBjYXNlcywgdGhlIGFkZGl0aW9uIG9mCi1kb2N1bWVudGF0aW9uIGhhcyBiZWNvbWUgZXNzZW50aWFsbHkgbWFuZGF0b3J5LgotCi1UaGUgZmlyc3QgcGllY2Ugb2YgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHBhdGNoIGlzIGl0cyBhc3NvY2lhdGVkCi1jaGFuZ2Vsb2cuICBMb2cgZW50cmllcyBzaG91bGQgZGVzY3JpYmUgdGhlIHByb2JsZW0gYmVpbmcgc29sdmVkLCB0aGUgZm9ybQotb2YgdGhlIHNvbHV0aW9uLCB0aGUgcGVvcGxlIHdobyB3b3JrZWQgb24gdGhlIHBhdGNoLCBhbnkgcmVsZXZhbnQKLWVmZmVjdHMgb24gcGVyZm9ybWFuY2UsIGFuZCBhbnl0aGluZyBlbHNlIHRoYXQgbWlnaHQgYmUgbmVlZGVkIHRvCi11bmRlcnN0YW5kIHRoZSBwYXRjaC4gIEJlIHN1cmUgdGhhdCB0aGUgY2hhbmdlbG9nIHNheXMgKndoeSogdGhlIHBhdGNoIGlzCi13b3J0aCBhcHBseWluZzsgYSBzdXJwcmlzaW5nIG51bWJlciBvZiBkZXZlbG9wZXJzIGZhaWwgdG8gcHJvdmlkZSB0aGF0Ci1pbmZvcm1hdGlvbi4KLQotQW55IGNvZGUgd2hpY2ggYWRkcyBhIG5ldyB1c2VyLXNwYWNlIGludGVyZmFjZSAtIGluY2x1ZGluZyBuZXcgc3lzZnMgb3IKLS9wcm9jIGZpbGVzIC0gc2hvdWxkIGluY2x1ZGUgZG9jdW1lbnRhdGlvbiBvZiB0aGF0IGludGVyZmFjZSB3aGljaCBlbmFibGVzCi11c2VyLXNwYWNlIGRldmVsb3BlcnMgdG8ga25vdyB3aGF0IHRoZXkgYXJlIHdvcmtpbmcgd2l0aC4gIFNlZQotRG9jdW1lbnRhdGlvbi9BQkkvUkVBRE1FIGZvciBhIGRlc2NyaXB0aW9uIG9mIGhvdyB0aGlzIGRvY3VtZW50YXRpb24gc2hvdWxkCi1iZSBmb3JtYXR0ZWQgYW5kIHdoYXQgaW5mb3JtYXRpb24gbmVlZHMgdG8gYmUgcHJvdmlkZWQuCi0KLVRoZSBmaWxlIERvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0IGRlc2NyaWJlcyBhbGwgb2YgdGhlIGtlcm5lbCdzCi1ib290LXRpbWUgcGFyYW1ldGVycy4gIEFueSBwYXRjaCB3aGljaCBhZGRzIG5ldyBwYXJhbWV0ZXJzIHNob3VsZCBhZGQgdGhlCi1hcHByb3ByaWF0ZSBlbnRyaWVzIHRvIHRoaXMgZmlsZS4KLQotQW55IG5ldyBjb25maWd1cmF0aW9uIG9wdGlvbnMgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBoZWxwIHRleHQgd2hpY2gKLWNsZWFybHkgZXhwbGFpbnMgdGhlIG9wdGlvbnMgYW5kIHdoZW4gdGhlIHVzZXIgbWlnaHQgd2FudCB0byBzZWxlY3QgdGhlbS4KLQotSW50ZXJuYWwgQVBJIGluZm9ybWF0aW9uIGZvciBtYW55IHN1YnN5c3RlbXMgaXMgZG9jdW1lbnRlZCBieSB3YXkgb2YKLXNwZWNpYWxseS1mb3JtYXR0ZWQgY29tbWVudHM7IHRoZXNlIGNvbW1lbnRzIGNhbiBiZSBleHRyYWN0ZWQgYW5kIGZvcm1hdHRlZAotaW4gYSBudW1iZXIgb2Ygd2F5cyBieSB0aGUgImtlcm5lbC1kb2MiIHNjcmlwdC4gIElmIHlvdSBhcmUgd29ya2luZyB3aXRoaW4KLWEgc3Vic3lzdGVtIHdoaWNoIGhhcyBrZXJuZWxkb2MgY29tbWVudHMsIHlvdSBzaG91bGQgbWFpbnRhaW4gdGhlbSBhbmQgYWRkCi10aGVtLCBhcyBhcHByb3ByaWF0ZSwgZm9yIGV4dGVybmFsbHktYXZhaWxhYmxlIGZ1bmN0aW9ucy4gIEV2ZW4gaW4gYXJlYXMKLXdoaWNoIGhhdmUgbm90IGJlZW4gc28gZG9jdW1lbnRlZCwgdGhlcmUgaXMgbm8gaGFybSBpbiBhZGRpbmcga2VybmVsZG9jCi1jb21tZW50cyBmb3IgdGhlIGZ1dHVyZTsgaW5kZWVkLCB0aGlzIGNhbiBiZSBhIHVzZWZ1bCBhY3Rpdml0eSBmb3IKLWJlZ2lubmluZyBrZXJuZWwgZGV2ZWxvcGVycy4gIFRoZSBmb3JtYXQgb2YgdGhlc2UgY29tbWVudHMsIGFsb25nIHdpdGggc29tZQotaW5mb3JtYXRpb24gb24gaG93IHRvIGNyZWF0ZSBrZXJuZWxkb2MgdGVtcGxhdGVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgZmlsZQotRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jdW1lbnRhdGlvbi5yc3QuCi0KLUFueWJvZHkgd2hvIHJlYWRzIHRocm91Z2ggYSBzaWduaWZpY2FudCBhbW91bnQgb2YgZXhpc3Rpbmcga2VybmVsIGNvZGUgd2lsbAotbm90ZSB0aGF0LCBvZnRlbiwgY29tbWVudHMgYXJlIG1vc3Qgbm90YWJsZSBieSB0aGVpciBhYnNlbmNlLiAgT25jZSBhZ2FpbiwKLXRoZSBleHBlY3RhdGlvbnMgZm9yIG5ldyBjb2RlIGFyZSBoaWdoZXIgdGhhbiB0aGV5IHdlcmUgaW4gdGhlIHBhc3Q7Ci1tZXJnaW5nIHVuY29tbWVudGVkIGNvZGUgd2lsbCBiZSBoYXJkZXIuICBUaGF0IHNhaWQsIHRoZXJlIGlzIGxpdHRsZSBkZXNpcmUKLWZvciB2ZXJib3NlbHktY29tbWVudGVkIGNvZGUuICBUaGUgY29kZSBzaG91bGQsIGl0c2VsZiwgYmUgcmVhZGFibGUsIHdpdGgKLWNvbW1lbnRzIGV4cGxhaW5pbmcgdGhlIG1vcmUgc3VidGxlIGFzcGVjdHMuCi0KLUNlcnRhaW4gdGhpbmdzIHNob3VsZCBhbHdheXMgYmUgY29tbWVudGVkLiAgVXNlcyBvZiBtZW1vcnkgYmFycmllcnMgc2hvdWxkCi1iZSBhY2NvbXBhbmllZCBieSBhIGxpbmUgZXhwbGFpbmluZyB3aHkgdGhlIGJhcnJpZXIgaXMgbmVjZXNzYXJ5LiAgVGhlCi1sb2NraW5nIHJ1bGVzIGZvciBkYXRhIHN0cnVjdHVyZXMgZ2VuZXJhbGx5IG5lZWQgdG8gYmUgZXhwbGFpbmVkIHNvbWV3aGVyZS4KLU1ham9yIGRhdGEgc3RydWN0dXJlcyBuZWVkIGNvbXByZWhlbnNpdmUgZG9jdW1lbnRhdGlvbiBpbiBnZW5lcmFsLgotTm9uLW9idmlvdXMgZGVwZW5kZW5jaWVzIGJldHdlZW4gc2VwYXJhdGUgYml0cyBvZiBjb2RlIHNob3VsZCBiZSBwb2ludGVkCi1vdXQuICBBbnl0aGluZyB3aGljaCBtaWdodCB0ZW1wdCBhIGNvZGUgamFuaXRvciB0byBtYWtlIGFuIGluY29ycmVjdAotImNsZWFudXAiIG5lZWRzIGEgY29tbWVudCBzYXlpbmcgd2h5IGl0IGlzIGRvbmUgdGhlIHdheSBpdCBpcy4gIEFuZCBzbyBvbi4KLQotCi00LjQ6IElOVEVSTkFMIEFQSSBDSEFOR0VTCi0KLVRoZSBiaW5hcnkgaW50ZXJmYWNlIHByb3ZpZGVkIGJ5IHRoZSBrZXJuZWwgdG8gdXNlciBzcGFjZSBjYW5ub3QgYmUgYnJva2VuCi1leGNlcHQgdW5kZXIgdGhlIG1vc3Qgc2V2ZXJlIGNpcmN1bXN0YW5jZXMuICBUaGUga2VybmVsJ3MgaW50ZXJuYWwKLXByb2dyYW1taW5nIGludGVyZmFjZXMsIGluc3RlYWQsIGFyZSBoaWdobHkgZmx1aWQgYW5kIGNhbiBiZSBjaGFuZ2VkIHdoZW4KLXRoZSBuZWVkIGFyaXNlcy4gIElmIHlvdSBmaW5kIHlvdXJzZWxmIGhhdmluZyB0byB3b3JrIGFyb3VuZCBhIGtlcm5lbCBBUEksCi1vciBzaW1wbHkgbm90IHVzaW5nIGEgc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSBiZWNhdXNlIGl0IGRvZXMgbm90IG1lZXQgeW91cgotbmVlZHMsIHRoYXQgbWF5IGJlIGEgc2lnbiB0aGF0IHRoZSBBUEkgbmVlZHMgdG8gY2hhbmdlLiAgQXMgYSBrZXJuZWwKLWRldmVsb3BlciwgeW91IGFyZSBlbXBvd2VyZWQgdG8gbWFrZSBzdWNoIGNoYW5nZXMuCi0KLVRoZXJlIGFyZSwgb2YgY291cnNlLCBzb21lIGNhdGNoZXMuICBBUEkgY2hhbmdlcyBjYW4gYmUgbWFkZSwgYnV0IHRoZXkgbmVlZAotdG8gYmUgd2VsbCBqdXN0aWZpZWQuICBTbyBhbnkgcGF0Y2ggbWFraW5nIGFuIGludGVybmFsIEFQSSBjaGFuZ2Ugc2hvdWxkIGJlCi1hY2NvbXBhbmllZCBieSBhIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhlIGNoYW5nZSBpcyBhbmQgd2h5IGl0IGlzCi1uZWNlc3NhcnkuICBUaGlzIGtpbmQgb2YgY2hhbmdlIHNob3VsZCBhbHNvIGJlIGJyb2tlbiBvdXQgaW50byBhIHNlcGFyYXRlCi1wYXRjaCwgcmF0aGVyIHRoYW4gYnVyaWVkIHdpdGhpbiBhIGxhcmdlciBwYXRjaC4KLQotVGhlIG90aGVyIGNhdGNoIGlzIHRoYXQgYSBkZXZlbG9wZXIgd2hvIGNoYW5nZXMgYW4gaW50ZXJuYWwgQVBJIGlzCi1nZW5lcmFsbHkgY2hhcmdlZCB3aXRoIHRoZSB0YXNrIG9mIGZpeGluZyBhbnkgY29kZSB3aXRoaW4gdGhlIGtlcm5lbCB0cmVlCi13aGljaCBpcyBicm9rZW4gYnkgdGhlIGNoYW5nZS4gIEZvciBhIHdpZGVseS11c2VkIGZ1bmN0aW9uLCB0aGlzIGR1dHkgY2FuCi1sZWFkIHRvIGxpdGVyYWxseSBodW5kcmVkcyBvciB0aG91c2FuZHMgb2YgY2hhbmdlcyAtIG1hbnkgb2Ygd2hpY2ggYXJlCi1saWtlbHkgdG8gY29uZmxpY3Qgd2l0aCB3b3JrIGJlaW5nIGRvbmUgYnkgb3RoZXIgZGV2ZWxvcGVycy4gIE5lZWRsZXNzIHRvCi1zYXksIHRoaXMgY2FuIGJlIGEgbGFyZ2Ugam9iLCBzbyBpdCBpcyBiZXN0IHRvIGJlIHN1cmUgdGhhdCB0aGUKLWp1c3RpZmljYXRpb24gaXMgc29saWQuICBOb3RlIHRoYXQgdGhlIENvY2NpbmVsbGUgdG9vbCBjYW4gaGVscCB3aXRoCi13aWRlLXJhbmdpbmcgQVBJIGNoYW5nZXMuCi0KLVdoZW4gbWFraW5nIGFuIGluY29tcGF0aWJsZSBBUEkgY2hhbmdlLCBvbmUgc2hvdWxkLCB3aGVuZXZlciBwb3NzaWJsZSwKLWVuc3VyZSB0aGF0IGNvZGUgd2hpY2ggaGFzIG5vdCBiZWVuIHVwZGF0ZWQgaXMgY2F1Z2h0IGJ5IHRoZSBjb21waWxlci4KLVRoaXMgd2lsbCBoZWxwIHlvdSB0byBiZSBzdXJlIHRoYXQgeW91IGhhdmUgZm91bmQgYWxsIGluLXRyZWUgdXNlcyBvZiB0aGF0Ci1pbnRlcmZhY2UuICBJdCB3aWxsIGFsc28gYWxlcnQgZGV2ZWxvcGVycyBvZiBvdXQtb2YtdHJlZSBjb2RlIHRoYXQgdGhlcmUgaXMKLWEgY2hhbmdlIHRoYXQgdGhleSBuZWVkIHRvIHJlc3BvbmQgdG8uICBTdXBwb3J0aW5nIG91dC1vZi10cmVlIGNvZGUgaXMgbm90Ci1zb21ldGhpbmcgdGhhdCBrZXJuZWwgZGV2ZWxvcGVycyBuZWVkIHRvIGJlIHdvcnJpZWQgYWJvdXQsIGJ1dCB3ZSBhbHNvIGRvCi1ub3QgaGF2ZSB0byBtYWtlIGxpZmUgaGFyZGVyIGZvciBvdXQtb2YtdHJlZSBkZXZlbG9wZXJzIHRoYW4gaXQgbmVlZHMgdG8KLWJlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzQuQ29kaW5nLnJzdCBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy80LkNvZGluZy5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1Y2VmOQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy80LkNvZGluZy5yc3QKQEAgLTAsMCArMSw0MTMgQEAKKy4uIF9kZXZlbG9wbWVudF9jb2Rpbmc6CisKK0dldHRpbmcgdGhlIGNvZGUgcmlnaHQKKz09PT09PT09PT09PT09PT09PT09PT0KKworV2hpbGUgdGhlcmUgaXMgbXVjaCB0byBiZSBzYWlkIGZvciBhIHNvbGlkIGFuZCBjb21tdW5pdHktb3JpZW50ZWQgZGVzaWduCitwcm9jZXNzLCB0aGUgcHJvb2Ygb2YgYW55IGtlcm5lbCBkZXZlbG9wbWVudCBwcm9qZWN0IGlzIGluIHRoZSByZXN1bHRpbmcKK2NvZGUuICBJdCBpcyB0aGUgY29kZSB3aGljaCB3aWxsIGJlIGV4YW1pbmVkIGJ5IG90aGVyIGRldmVsb3BlcnMgYW5kIG1lcmdlZAorKG9yIG5vdCkgaW50byB0aGUgbWFpbmxpbmUgdHJlZS4gIFNvIGl0IGlzIHRoZSBxdWFsaXR5IG9mIHRoaXMgY29kZSB3aGljaAord2lsbCBkZXRlcm1pbmUgdGhlIHVsdGltYXRlIHN1Y2Nlc3Mgb2YgdGhlIHByb2plY3QuCisKK1RoaXMgc2VjdGlvbiB3aWxsIGV4YW1pbmUgdGhlIGNvZGluZyBwcm9jZXNzLiAgV2UnbGwgc3RhcnQgd2l0aCBhIGxvb2sgYXQgYQorbnVtYmVyIG9mIHdheXMgaW4gd2hpY2gga2VybmVsIGRldmVsb3BlcnMgY2FuIGdvIHdyb25nLiAgVGhlbiB0aGUgZm9jdXMKK3dpbGwgc2hpZnQgdG93YXJkIGRvaW5nIHRoaW5ncyByaWdodCBhbmQgdGhlIHRvb2xzIHdoaWNoIGNhbiBoZWxwIGluIHRoYXQKK3F1ZXN0LgorCisKK1BpdGZhbGxzCistLS0tLS0tLS0KKworQ29kaW5nIHN0eWxlCisqKioqKioqKioqKioKKworVGhlIGtlcm5lbCBoYXMgbG9uZyBoYWQgYSBzdGFuZGFyZCBjb2Rpbmcgc3R5bGUsIGRlc2NyaWJlZCBpbgorRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZS4gIEZvciBtdWNoIG9mIHRoYXQgdGltZSwgdGhlIHBvbGljaWVzIGRlc2NyaWJlZAoraW4gdGhhdCBmaWxlIHdlcmUgdGFrZW4gYXMgYmVpbmcsIGF0IG1vc3QsIGFkdmlzb3J5LiAgQXMgYSByZXN1bHQsIHRoZXJlIGlzCithIHN1YnN0YW50aWFsIGFtb3VudCBvZiBjb2RlIGluIHRoZSBrZXJuZWwgd2hpY2ggZG9lcyBub3QgbWVldCB0aGUgY29kaW5nCitzdHlsZSBndWlkZWxpbmVzLiAgVGhlIHByZXNlbmNlIG9mIHRoYXQgY29kZSBsZWFkcyB0byB0d28gaW5kZXBlbmRlbnQKK2hhemFyZHMgZm9yIGtlcm5lbCBkZXZlbG9wZXJzLgorCitUaGUgZmlyc3Qgb2YgdGhlc2UgaXMgdG8gYmVsaWV2ZSB0aGF0IHRoZSBrZXJuZWwgY29kaW5nIHN0YW5kYXJkcyBkbyBub3QKK21hdHRlciBhbmQgYXJlIG5vdCBlbmZvcmNlZC4gIFRoZSB0cnV0aCBvZiB0aGUgbWF0dGVyIGlzIHRoYXQgYWRkaW5nIG5ldworY29kZSB0byB0aGUga2VybmVsIGlzIHZlcnkgZGlmZmljdWx0IGlmIHRoYXQgY29kZSBpcyBub3QgY29kZWQgYWNjb3JkaW5nIHRvCit0aGUgc3RhbmRhcmQ7IG1hbnkgZGV2ZWxvcGVycyB3aWxsIHJlcXVlc3QgdGhhdCB0aGUgY29kZSBiZSByZWZvcm1hdHRlZAorYmVmb3JlIHRoZXkgd2lsbCBldmVuIHJldmlldyBpdC4gIEEgY29kZSBiYXNlIGFzIGxhcmdlIGFzIHRoZSBrZXJuZWwKK3JlcXVpcmVzIHNvbWUgdW5pZm9ybWl0eSBvZiBjb2RlIHRvIG1ha2UgaXQgcG9zc2libGUgZm9yIGRldmVsb3BlcnMgdG8KK3F1aWNrbHkgdW5kZXJzdGFuZCBhbnkgcGFydCBvZiBpdC4gIFNvIHRoZXJlIGlzIG5vIGxvbmdlciByb29tIGZvcgorc3RyYW5nZWx5LWZvcm1hdHRlZCBjb2RlLgorCitPY2Nhc2lvbmFsbHksIHRoZSBrZXJuZWwncyBjb2Rpbmcgc3R5bGUgd2lsbCBydW4gaW50byBjb25mbGljdCB3aXRoIGFuCitlbXBsb3llcidzIG1hbmRhdGVkIHN0eWxlLiAgSW4gc3VjaCBjYXNlcywgdGhlIGtlcm5lbCdzIHN0eWxlIHdpbGwgaGF2ZSB0bword2luIGJlZm9yZSB0aGUgY29kZSBjYW4gYmUgbWVyZ2VkLiAgUHV0dGluZyBjb2RlIGludG8gdGhlIGtlcm5lbCBtZWFucworZ2l2aW5nIHVwIGEgZGVncmVlIG9mIGNvbnRyb2wgaW4gYSBudW1iZXIgb2Ygd2F5cyAtIGluY2x1ZGluZyBjb250cm9sIG92ZXIKK2hvdyB0aGUgY29kZSBpcyBmb3JtYXR0ZWQuCisKK1RoZSBvdGhlciB0cmFwIGlzIHRvIGFzc3VtZSB0aGF0IGNvZGUgd2hpY2ggaXMgYWxyZWFkeSBpbiB0aGUga2VybmVsIGlzCit1cmdlbnRseSBpbiBuZWVkIG9mIGNvZGluZyBzdHlsZSBmaXhlcy4gIERldmVsb3BlcnMgbWF5IHN0YXJ0IHRvIGdlbmVyYXRlCityZWZvcm1hdHRpbmcgcGF0Y2hlcyBhcyBhIHdheSBvZiBnYWluaW5nIGZhbWlsaWFyaXR5IHdpdGggdGhlIHByb2Nlc3MsIG9yCithcyBhIHdheSBvZiBnZXR0aW5nIHRoZWlyIG5hbWUgaW50byB0aGUga2VybmVsIGNoYW5nZWxvZ3MgLSBvciBib3RoLiAgQnV0CitwdXJlIGNvZGluZyBzdHlsZSBmaXhlcyBhcmUgc2VlbiBhcyBub2lzZSBieSB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5OwordGhleSB0ZW5kIHRvIGdldCBhIGNoaWxseSByZWNlcHRpb24uICBTbyB0aGlzIHR5cGUgb2YgcGF0Y2ggaXMgYmVzdAorYXZvaWRlZC4gIEl0IGlzIG5hdHVyYWwgdG8gZml4IHRoZSBzdHlsZSBvZiBhIHBpZWNlIG9mIGNvZGUgd2hpbGUgd29ya2luZworb24gaXQgZm9yIG90aGVyIHJlYXNvbnMsIGJ1dCBjb2Rpbmcgc3R5bGUgY2hhbmdlcyBzaG91bGQgbm90IGJlIG1hZGUgZm9yCit0aGVpciBvd24gc2FrZS4KKworVGhlIGNvZGluZyBzdHlsZSBkb2N1bWVudCBhbHNvIHNob3VsZCBub3QgYmUgcmVhZCBhcyBhbiBhYnNvbHV0ZSBsYXcgd2hpY2gKK2NhbiBuZXZlciBiZSB0cmFuc2dyZXNzZWQuICBJZiB0aGVyZSBpcyBhIGdvb2QgcmVhc29uIHRvIGdvIGFnYWluc3QgdGhlCitzdHlsZSAoYSBsaW5lIHdoaWNoIGJlY29tZXMgZmFyIGxlc3MgcmVhZGFibGUgaWYgc3BsaXQgdG8gZml0IHdpdGhpbiB0aGUKKzgwLWNvbHVtbiBsaW1pdCwgZm9yIGV4YW1wbGUpLCBqdXN0IGRvIGl0LgorCisKK0Fic3RyYWN0aW9uIGxheWVycworKioqKioqKioqKioqKioqKioqCisKK0NvbXB1dGVyIFNjaWVuY2UgcHJvZmVzc29ycyB0ZWFjaCBzdHVkZW50cyB0byBtYWtlIGV4dGVuc2l2ZSB1c2Ugb2YKK2Fic3RyYWN0aW9uIGxheWVycyBpbiB0aGUgbmFtZSBvZiBmbGV4aWJpbGl0eSBhbmQgaW5mb3JtYXRpb24gaGlkaW5nLgorQ2VydGFpbmx5IHRoZSBrZXJuZWwgbWFrZXMgZXh0ZW5zaXZlIHVzZSBvZiBhYnN0cmFjdGlvbjsgbm8gcHJvamVjdAoraW52b2x2aW5nIHNldmVyYWwgbWlsbGlvbiBsaW5lcyBvZiBjb2RlIGNvdWxkIGRvIG90aGVyd2lzZSBhbmQgc3Vydml2ZS4KK0J1dCBleHBlcmllbmNlIGhhcyBzaG93biB0aGF0IGV4Y2Vzc2l2ZSBvciBwcmVtYXR1cmUgYWJzdHJhY3Rpb24gY2FuIGJlCitqdXN0IGFzIGhhcm1mdWwgYXMgcHJlbWF0dXJlIG9wdGltaXphdGlvbi4gIEFic3RyYWN0aW9uIHNob3VsZCBiZSB1c2VkIHRvCit0aGUgbGV2ZWwgcmVxdWlyZWQgYW5kIG5vIGZ1cnRoZXIuCisKK0F0IGEgc2ltcGxlIGxldmVsLCBjb25zaWRlciBhIGZ1bmN0aW9uIHdoaWNoIGhhcyBhbiBhcmd1bWVudCB3aGljaCBpcworYWx3YXlzIHBhc3NlZCBhcyB6ZXJvIGJ5IGFsbCBjYWxsZXJzLiAgT25lIGNvdWxkIHJldGFpbiB0aGF0IGFyZ3VtZW50IGp1c3QKK2luIGNhc2Ugc29tZWJvZHkgZXZlbnR1YWxseSBuZWVkcyB0byB1c2UgdGhlIGV4dHJhIGZsZXhpYmlsaXR5IHRoYXQgaXQKK3Byb3ZpZGVzLiAgQnkgdGhhdCB0aW1lLCB0aG91Z2gsIGNoYW5jZXMgYXJlIGdvb2QgdGhhdCB0aGUgY29kZSB3aGljaAoraW1wbGVtZW50cyB0aGlzIGV4dHJhIGFyZ3VtZW50IGhhcyBiZWVuIGJyb2tlbiBpbiBzb21lIHN1YnRsZSB3YXkgd2hpY2ggd2FzCituZXZlciBub3RpY2VkIC0gYmVjYXVzZSBpdCBoYXMgbmV2ZXIgYmVlbiB1c2VkLiAgT3IsIHdoZW4gdGhlIG5lZWQgZm9yCitleHRyYSBmbGV4aWJpbGl0eSBhcmlzZXMsIGl0IGRvZXMgbm90IGRvIHNvIGluIGEgd2F5IHdoaWNoIG1hdGNoZXMgdGhlCitwcm9ncmFtbWVyJ3MgZWFybHkgZXhwZWN0YXRpb24uICBLZXJuZWwgZGV2ZWxvcGVycyB3aWxsIHJvdXRpbmVseSBzdWJtaXQKK3BhdGNoZXMgdG8gcmVtb3ZlIHVudXNlZCBhcmd1bWVudHM7IHRoZXkgc2hvdWxkLCBpbiBnZW5lcmFsLCBub3QgYmUgYWRkZWQKK2luIHRoZSBmaXJzdCBwbGFjZS4KKworQWJzdHJhY3Rpb24gbGF5ZXJzIHdoaWNoIGhpZGUgYWNjZXNzIHRvIGhhcmR3YXJlIC0gb2Z0ZW4gdG8gYWxsb3cgdGhlIGJ1bGsKK29mIGEgZHJpdmVyIHRvIGJlIHVzZWQgd2l0aCBtdWx0aXBsZSBvcGVyYXRpbmcgc3lzdGVtcyAtIGFyZSBlc3BlY2lhbGx5Citmcm93bmVkIHVwb24uICBTdWNoIGxheWVycyBvYnNjdXJlIHRoZSBjb2RlIGFuZCBtYXkgaW1wb3NlIGEgcGVyZm9ybWFuY2UKK3BlbmFsdHk7IHRoZXkgZG8gbm90IGJlbG9uZyBpbiB0aGUgTGludXgga2VybmVsLgorCitPbiB0aGUgb3RoZXIgaGFuZCwgaWYgeW91IGZpbmQgeW91cnNlbGYgY29weWluZyBzaWduaWZpY2FudCBhbW91bnRzIG9mIGNvZGUKK2Zyb20gYW5vdGhlciBrZXJuZWwgc3Vic3lzdGVtLCBpdCBpcyB0aW1lIHRvIGFzayB3aGV0aGVyIGl0IHdvdWxkLCBpbiBmYWN0LAorbWFrZSBzZW5zZSB0byBwdWxsIG91dCBzb21lIG9mIHRoYXQgY29kZSBpbnRvIGEgc2VwYXJhdGUgbGlicmFyeSBvciB0bworaW1wbGVtZW50IHRoYXQgZnVuY3Rpb25hbGl0eSBhdCBhIGhpZ2hlciBsZXZlbC4gIFRoZXJlIGlzIG5vIHZhbHVlIGluCityZXBsaWNhdGluZyB0aGUgc2FtZSBjb2RlIHRocm91Z2hvdXQgdGhlIGtlcm5lbC4KKworCisjaWZkZWYgYW5kIHByZXByb2Nlc3NvciB1c2UgaW4gZ2VuZXJhbAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworVGhlIEMgcHJlcHJvY2Vzc29yIHNlZW1zIHRvIHByZXNlbnQgYSBwb3dlcmZ1bCB0ZW1wdGF0aW9uIHRvIHNvbWUgQworcHJvZ3JhbW1lcnMsIHdobyBzZWUgaXQgYXMgYSB3YXkgdG8gZWZmaWNpZW50bHkgZW5jb2RlIGEgZ3JlYXQgZGVhbCBvZgorZmxleGliaWxpdHkgaW50byBhIHNvdXJjZSBmaWxlLiAgQnV0IHRoZSBwcmVwcm9jZXNzb3IgaXMgbm90IEMsIGFuZCBoZWF2eQordXNlIG9mIGl0IHJlc3VsdHMgaW4gY29kZSB3aGljaCBpcyBtdWNoIGhhcmRlciBmb3Igb3RoZXJzIHRvIHJlYWQgYW5kCitoYXJkZXIgZm9yIHRoZSBjb21waWxlciB0byBjaGVjayBmb3IgY29ycmVjdG5lc3MuICBIZWF2eSBwcmVwcm9jZXNzb3IgdXNlCitpcyBhbG1vc3QgYWx3YXlzIGEgc2lnbiBvZiBjb2RlIHdoaWNoIG5lZWRzIHNvbWUgY2xlYW51cCB3b3JrLgorCitDb25kaXRpb25hbCBjb21waWxhdGlvbiB3aXRoICNpZmRlZiBpcywgaW5kZWVkLCBhIHBvd2VyZnVsIGZlYXR1cmUsIGFuZCBpdAoraXMgdXNlZCB3aXRoaW4gdGhlIGtlcm5lbC4gIEJ1dCB0aGVyZSBpcyBsaXR0bGUgZGVzaXJlIHRvIHNlZSBjb2RlIHdoaWNoIGlzCitzcHJpbmtsZWQgbGliZXJhbGx5IHdpdGggI2lmZGVmIGJsb2Nrcy4gIEFzIGEgZ2VuZXJhbCBydWxlLCAjaWZkZWYgdXNlCitzaG91bGQgYmUgY29uZmluZWQgdG8gaGVhZGVyIGZpbGVzIHdoZW5ldmVyIHBvc3NpYmxlLgorQ29uZGl0aW9uYWxseS1jb21waWxlZCBjb2RlIGNhbiBiZSBjb25maW5lZCB0byBmdW5jdGlvbnMgd2hpY2gsIGlmIHRoZSBjb2RlCitpcyBub3QgdG8gYmUgcHJlc2VudCwgc2ltcGx5IGJlY29tZSBlbXB0eS4gIFRoZSBjb21waWxlciB3aWxsIHRoZW4gcXVpZXRseQorb3B0aW1pemUgb3V0IHRoZSBjYWxsIHRvIHRoZSBlbXB0eSBmdW5jdGlvbi4gIFRoZSByZXN1bHQgaXMgZmFyIGNsZWFuZXIKK2NvZGUgd2hpY2ggaXMgZWFzaWVyIHRvIGZvbGxvdy4KKworQyBwcmVwcm9jZXNzb3IgbWFjcm9zIHByZXNlbnQgYSBudW1iZXIgb2YgaGF6YXJkcywgaW5jbHVkaW5nIHBvc3NpYmxlCittdWx0aXBsZSBldmFsdWF0aW9uIG9mIGV4cHJlc3Npb25zIHdpdGggc2lkZSBlZmZlY3RzIGFuZCBubyB0eXBlIHNhZmV0eS4KK0lmIHlvdSBhcmUgdGVtcHRlZCB0byBkZWZpbmUgYSBtYWNybywgY29uc2lkZXIgY3JlYXRpbmcgYW4gaW5saW5lIGZ1bmN0aW9uCitpbnN0ZWFkLiAgVGhlIGNvZGUgd2hpY2ggcmVzdWx0cyB3aWxsIGJlIHRoZSBzYW1lLCBidXQgaW5saW5lIGZ1bmN0aW9ucyBhcmUKK2Vhc2llciB0byByZWFkLCBkbyBub3QgZXZhbHVhdGUgdGhlaXIgYXJndW1lbnRzIG11bHRpcGxlIHRpbWVzLCBhbmQgYWxsb3cKK3RoZSBjb21waWxlciB0byBwZXJmb3JtIHR5cGUgY2hlY2tpbmcgb24gdGhlIGFyZ3VtZW50cyBhbmQgcmV0dXJuIHZhbHVlLgorCisKK0lubGluZSBmdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioKKworSW5saW5lIGZ1bmN0aW9ucyBwcmVzZW50IGEgaGF6YXJkIG9mIHRoZWlyIG93biwgdGhvdWdoLiAgUHJvZ3JhbW1lcnMgY2FuCitiZWNvbWUgZW5hbW9yZWQgb2YgdGhlIHBlcmNlaXZlZCBlZmZpY2llbmN5IGluaGVyZW50IGluIGF2b2lkaW5nIGEgZnVuY3Rpb24KK2NhbGwgYW5kIGZpbGwgYSBzb3VyY2UgZmlsZSB3aXRoIGlubGluZSBmdW5jdGlvbnMuICBUaG9zZSBmdW5jdGlvbnMsCitob3dldmVyLCBjYW4gYWN0dWFsbHkgcmVkdWNlIHBlcmZvcm1hbmNlLiAgU2luY2UgdGhlaXIgY29kZSBpcyByZXBsaWNhdGVkCithdCBlYWNoIGNhbGwgc2l0ZSwgdGhleSBlbmQgdXAgYmxvYXRpbmcgdGhlIHNpemUgb2YgdGhlIGNvbXBpbGVkIGtlcm5lbC4KK1RoYXQsIGluIHR1cm4sIGNyZWF0ZXMgcHJlc3N1cmUgb24gdGhlIHByb2Nlc3NvcidzIG1lbW9yeSBjYWNoZXMsIHdoaWNoIGNhbgorc2xvdyBleGVjdXRpb24gZHJhbWF0aWNhbGx5LiAgSW5saW5lIGZ1bmN0aW9ucywgYXMgYSBydWxlLCBzaG91bGQgYmUgcXVpdGUKK3NtYWxsIGFuZCByZWxhdGl2ZWx5IHJhcmUuICBUaGUgY29zdCBvZiBhIGZ1bmN0aW9uIGNhbGwsIGFmdGVyIGFsbCwgaXMgbm90Cit0aGF0IGhpZ2g7IHRoZSBjcmVhdGlvbiBvZiBsYXJnZSBudW1iZXJzIG9mIGlubGluZSBmdW5jdGlvbnMgaXMgYSBjbGFzc2ljCitleGFtcGxlIG9mIHByZW1hdHVyZSBvcHRpbWl6YXRpb24uCisKK0luIGdlbmVyYWwsIGtlcm5lbCBwcm9ncmFtbWVycyBpZ25vcmUgY2FjaGUgZWZmZWN0cyBhdCB0aGVpciBwZXJpbC4gIFRoZQorY2xhc3NpYyB0aW1lL3NwYWNlIHRyYWRlb2ZmIHRhdWdodCBpbiBiZWdpbm5pbmcgZGF0YSBzdHJ1Y3R1cmVzIGNsYXNzZXMKK29mdGVuIGRvZXMgbm90IGFwcGx5IHRvIGNvbnRlbXBvcmFyeSBoYXJkd2FyZS4gIFNwYWNlICppcyogdGltZSwgaW4gdGhhdCBhCitsYXJnZXIgcHJvZ3JhbSB3aWxsIHJ1biBzbG93ZXIgdGhhbiBvbmUgd2hpY2ggaXMgbW9yZSBjb21wYWN0LgorCitNb3JlIHJlY2VudCBjb21waWxlcnMgdGFrZSBhbiBpbmNyZWFzaW5nbHkgYWN0aXZlIHJvbGUgaW4gZGVjaWRpbmcgd2hldGhlcgorYSBnaXZlbiBmdW5jdGlvbiBzaG91bGQgYWN0dWFsbHkgYmUgaW5saW5lZCBvciBub3QuICBTbyB0aGUgbGliZXJhbAorcGxhY2VtZW50IG9mICJpbmxpbmUiIGtleXdvcmRzIG1heSBub3QganVzdCBiZSBleGNlc3NpdmU7IGl0IGNvdWxkIGFsc28gYmUKK2lycmVsZXZhbnQuCisKKworTG9ja2luZworKioqKioqKgorCitJbiBNYXksIDIwMDYsIHRoZSAiRGV2aWNlc2NhcGUiIG5ldHdvcmtpbmcgc3RhY2sgd2FzLCB3aXRoIGdyZWF0CitmYW5mYXJlLCByZWxlYXNlZCB1bmRlciB0aGUgR1BMIGFuZCBtYWRlIGF2YWlsYWJsZSBmb3IgaW5jbHVzaW9uIGluIHRoZQorbWFpbmxpbmUga2VybmVsLiAgVGhpcyBkb25hdGlvbiB3YXMgd2VsY29tZSBuZXdzOyBzdXBwb3J0IGZvciB3aXJlbGVzcworbmV0d29ya2luZyBpbiBMaW51eCB3YXMgY29uc2lkZXJlZCBzdWJzdGFuZGFyZCBhdCBiZXN0LCBhbmQgdGhlIERldmljZXNjYXBlCitzdGFjayBvZmZlcmVkIHRoZSBwcm9taXNlIG9mIGZpeGluZyB0aGF0IHNpdHVhdGlvbi4gIFlldCwgdGhpcyBjb2RlIGRpZCBub3QKK2FjdHVhbGx5IG1ha2UgaXQgaW50byB0aGUgbWFpbmxpbmUgdW50aWwgSnVuZSwgMjAwNyAoMi42LjIyKS4gIFdoYXQKK2hhcHBlbmVkPworCitUaGlzIGNvZGUgc2hvd2VkIGEgbnVtYmVyIG9mIHNpZ25zIG9mIGhhdmluZyBiZWVuIGRldmVsb3BlZCBiZWhpbmQKK2NvcnBvcmF0ZSBkb29ycy4gIEJ1dCBvbmUgbGFyZ2UgcHJvYmxlbSBpbiBwYXJ0aWN1bGFyIHdhcyB0aGF0IGl0IHdhcyBub3QKK2Rlc2lnbmVkIHRvIHdvcmsgb24gbXVsdGlwcm9jZXNzb3Igc3lzdGVtcy4gIEJlZm9yZSB0aGlzIG5ldHdvcmtpbmcgc3RhY2sKKyhub3cgY2FsbGVkIG1hYzgwMjExKSBjb3VsZCBiZSBtZXJnZWQsIGEgbG9ja2luZyBzY2hlbWUgbmVlZGVkIHRvIGJlCityZXRyb2ZpdHRlZCBvbnRvIGl0LgorCitPbmNlIHVwb24gYSB0aW1lLCBMaW51eCBrZXJuZWwgY29kZSBjb3VsZCBiZSBkZXZlbG9wZWQgd2l0aG91dCB0aGlua2luZworYWJvdXQgdGhlIGNvbmN1cnJlbmN5IGlzc3VlcyBwcmVzZW50ZWQgYnkgbXVsdGlwcm9jZXNzb3Igc3lzdGVtcy4gIE5vdywKK2hvd2V2ZXIsIHRoaXMgZG9jdW1lbnQgaXMgYmVpbmcgd3JpdHRlbiBvbiBhIGR1YWwtY29yZSBsYXB0b3AuICBFdmVuIG9uCitzaW5nbGUtcHJvY2Vzc29yIHN5c3RlbXMsIHdvcmsgYmVpbmcgZG9uZSB0byBpbXByb3ZlIHJlc3BvbnNpdmVuZXNzIHdpbGwKK3JhaXNlIHRoZSBsZXZlbCBvZiBjb25jdXJyZW5jeSB3aXRoaW4gdGhlIGtlcm5lbC4gIFRoZSBkYXlzIHdoZW4ga2VybmVsCitjb2RlIGNvdWxkIGJlIHdyaXR0ZW4gd2l0aG91dCB0aGlua2luZyBhYm91dCBsb2NraW5nIGFyZSBsb25nIHBhc3QuCisKK0FueSByZXNvdXJjZSAoZGF0YSBzdHJ1Y3R1cmVzLCBoYXJkd2FyZSByZWdpc3RlcnMsIGV0Yy4pIHdoaWNoIGNvdWxkIGJlCithY2Nlc3NlZCBjb25jdXJyZW50bHkgYnkgbW9yZSB0aGFuIG9uZSB0aHJlYWQgbXVzdCBiZSBwcm90ZWN0ZWQgYnkgYSBsb2NrLgorTmV3IGNvZGUgc2hvdWxkIGJlIHdyaXR0ZW4gd2l0aCB0aGlzIHJlcXVpcmVtZW50IGluIG1pbmQ7IHJldHJvZml0dGluZworbG9ja2luZyBhZnRlciB0aGUgZmFjdCBpcyBhIHJhdGhlciBtb3JlIGRpZmZpY3VsdCB0YXNrLiAgS2VybmVsIGRldmVsb3BlcnMKK3Nob3VsZCB0YWtlIHRoZSB0aW1lIHRvIHVuZGVyc3RhbmQgdGhlIGF2YWlsYWJsZSBsb2NraW5nIHByaW1pdGl2ZXMgd2VsbAorZW5vdWdoIHRvIHBpY2sgdGhlIHJpZ2h0IHRvb2wgZm9yIHRoZSBqb2IuICBDb2RlIHdoaWNoIHNob3dzIGEgbGFjayBvZgorYXR0ZW50aW9uIHRvIGNvbmN1cnJlbmN5IHdpbGwgaGF2ZSBhIGRpZmZpY3VsdCBwYXRoIGludG8gdGhlIG1haW5saW5lLgorCisKK1JlZ3Jlc3Npb25zCisqKioqKioqKioqKgorCitPbmUgZmluYWwgaGF6YXJkIHdvcnRoIG1lbnRpb25pbmcgaXMgdGhpczogaXQgY2FuIGJlIHRlbXB0aW5nIHRvIG1ha2UgYQorY2hhbmdlICh3aGljaCBtYXkgYnJpbmcgYmlnIGltcHJvdmVtZW50cykgd2hpY2ggY2F1c2VzIHNvbWV0aGluZyB0byBicmVhaworZm9yIGV4aXN0aW5nIHVzZXJzLiAgVGhpcyBraW5kIG9mIGNoYW5nZSBpcyBjYWxsZWQgYSAicmVncmVzc2lvbiwiIGFuZAorcmVncmVzc2lvbnMgaGF2ZSBiZWNvbWUgbW9zdCB1bndlbGNvbWUgaW4gdGhlIG1haW5saW5lIGtlcm5lbC4gIFdpdGggZmV3CitleGNlcHRpb25zLCBjaGFuZ2VzIHdoaWNoIGNhdXNlIHJlZ3Jlc3Npb25zIHdpbGwgYmUgYmFja2VkIG91dCBpZiB0aGUKK3JlZ3Jlc3Npb24gY2Fubm90IGJlIGZpeGVkIGluIGEgdGltZWx5IG1hbm5lci4gIEZhciBiZXR0ZXIgdG8gYXZvaWQgdGhlCityZWdyZXNzaW9uIGluIHRoZSBmaXJzdCBwbGFjZS4KKworSXQgaXMgb2Z0ZW4gYXJndWVkIHRoYXQgYSByZWdyZXNzaW9uIGNhbiBiZSBqdXN0aWZpZWQgaWYgaXQgY2F1c2VzIHRoaW5ncwordG8gd29yayBmb3IgbW9yZSBwZW9wbGUgdGhhbiBpdCBjcmVhdGVzIHByb2JsZW1zIGZvci4gIFdoeSBub3QgbWFrZSBhCitjaGFuZ2UgaWYgaXQgYnJpbmdzIG5ldyBmdW5jdGlvbmFsaXR5IHRvIHRlbiBzeXN0ZW1zIGZvciBlYWNoIG9uZSBpdAorYnJlYWtzPyAgVGhlIGJlc3QgYW5zd2VyIHRvIHRoaXMgcXVlc3Rpb24gd2FzIGV4cHJlc3NlZCBieSBMaW51cyBpbiBKdWx5LAorMjAwNzoKKworOjoKKworCVNvIHdlIGRvbid0IGZpeCBidWdzIGJ5IGludHJvZHVjaW5nIG5ldyBwcm9ibGVtcy4gIFRoYXQgd2F5IGxpZXMKKwltYWRuZXNzLCBhbmQgbm9ib2R5IGV2ZXIga25vd3MgaWYgeW91IGFjdHVhbGx5IG1ha2UgYW55IHJlYWwKKwlwcm9ncmVzcyBhdCBhbGwuIElzIGl0IHR3byBzdGVwcyBmb3J3YXJkcywgb25lIHN0ZXAgYmFjaywgb3Igb25lCisJc3RlcCBmb3J3YXJkIGFuZCB0d28gc3RlcHMgYmFjaz8KKworKGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzI0MzQ2MC8pLgorCitBbiBlc3BlY2lhbGx5IHVud2VsY29tZSB0eXBlIG9mIHJlZ3Jlc3Npb24gaXMgYW55IHNvcnQgb2YgY2hhbmdlIHRvIHRoZQordXNlci1zcGFjZSBBQkkuICBPbmNlIGFuIGludGVyZmFjZSBoYXMgYmVlbiBleHBvcnRlZCB0byB1c2VyIHNwYWNlLCBpdCBtdXN0CitiZSBzdXBwb3J0ZWQgaW5kZWZpbml0ZWx5LiAgVGhpcyBmYWN0IG1ha2VzIHRoZSBjcmVhdGlvbiBvZiB1c2VyLXNwYWNlCitpbnRlcmZhY2VzIHBhcnRpY3VsYXJseSBjaGFsbGVuZ2luZzogc2luY2UgdGhleSBjYW5ub3QgYmUgY2hhbmdlZCBpbgoraW5jb21wYXRpYmxlIHdheXMsIHRoZXkgbXVzdCBiZSBkb25lIHJpZ2h0IHRoZSBmaXJzdCB0aW1lLiAgRm9yIHRoaXMKK3JlYXNvbiwgYSBncmVhdCBkZWFsIG9mIHRob3VnaHQsIGNsZWFyIGRvY3VtZW50YXRpb24sIGFuZCB3aWRlIHJldmlldyBmb3IKK3VzZXItc3BhY2UgaW50ZXJmYWNlcyBpcyBhbHdheXMgcmVxdWlyZWQuCisKKworQ29kZSBjaGVja2luZyB0b29scworLS0tLS0tLS0tLS0tLS0tLS0tLQorCitGb3Igbm93LCBhdCBsZWFzdCwgdGhlIHdyaXRpbmcgb2YgZXJyb3ItZnJlZSBjb2RlIHJlbWFpbnMgYW4gaWRlYWwgdGhhdCBmZXcKK29mIHVzIGNhbiByZWFjaC4gIFdoYXQgd2UgY2FuIGhvcGUgdG8gZG8sIHRob3VnaCwgaXMgdG8gY2F0Y2ggYW5kIGZpeCBhcworbWFueSBvZiB0aG9zZSBlcnJvcnMgYXMgcG9zc2libGUgYmVmb3JlIG91ciBjb2RlIGdvZXMgaW50byB0aGUgbWFpbmxpbmUKK2tlcm5lbC4gIFRvIHRoYXQgZW5kLCB0aGUga2VybmVsIGRldmVsb3BlcnMgaGF2ZSBwdXQgdG9nZXRoZXIgYW4gaW1wcmVzc2l2ZQorYXJyYXkgb2YgdG9vbHMgd2hpY2ggY2FuIGNhdGNoIGEgd2lkZSB2YXJpZXR5IG9mIG9ic2N1cmUgcHJvYmxlbXMgaW4gYW4KK2F1dG9tYXRlZCB3YXkuICBBbnkgcHJvYmxlbSBjYXVnaHQgYnkgdGhlIGNvbXB1dGVyIGlzIGEgcHJvYmxlbSB3aGljaCB3aWxsCitub3QgYWZmbGljdCBhIHVzZXIgbGF0ZXIgb24sIHNvIGl0IHN0YW5kcyB0byByZWFzb24gdGhhdCB0aGUgYXV0b21hdGVkCit0b29scyBzaG91bGQgYmUgdXNlZCB3aGVuZXZlciBwb3NzaWJsZS4KKworVGhlIGZpcnN0IHN0ZXAgaXMgc2ltcGx5IHRvIGhlZWQgdGhlIHdhcm5pbmdzIHByb2R1Y2VkIGJ5IHRoZSBjb21waWxlci4KK0NvbnRlbXBvcmFyeSB2ZXJzaW9ucyBvZiBnY2MgY2FuIGRldGVjdCAoYW5kIHdhcm4gYWJvdXQpIGEgbGFyZ2UgbnVtYmVyIG9mCitwb3RlbnRpYWwgZXJyb3JzLiAgUXVpdGUgb2Z0ZW4sIHRoZXNlIHdhcm5pbmdzIHBvaW50IHRvIHJlYWwgcHJvYmxlbXMuCitDb2RlIHN1Ym1pdHRlZCBmb3IgcmV2aWV3IHNob3VsZCwgYXMgYSBydWxlLCBub3QgcHJvZHVjZSBhbnkgY29tcGlsZXIKK3dhcm5pbmdzLiAgV2hlbiBzaWxlbmNpbmcgd2FybmluZ3MsIHRha2UgY2FyZSB0byB1bmRlcnN0YW5kIHRoZSByZWFsIGNhdXNlCithbmQgdHJ5IHRvIGF2b2lkICJmaXhlcyIgd2hpY2ggbWFrZSB0aGUgd2FybmluZyBnbyBhd2F5IHdpdGhvdXQgYWRkcmVzc2luZworaXRzIGNhdXNlLgorCitOb3RlIHRoYXQgbm90IGFsbCBjb21waWxlciB3YXJuaW5ncyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0LiAgQnVpbGQgdGhlCitrZXJuZWwgd2l0aCAibWFrZSBFWFRSQV9DRkxBR1M9LVciIHRvIGdldCB0aGUgZnVsbCBzZXQuCisKK1RoZSBrZXJuZWwgcHJvdmlkZXMgc2V2ZXJhbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgd2hpY2ggdHVybiBvbiBkZWJ1Z2dpbmcKK2ZlYXR1cmVzOyBtb3N0IG9mIHRoZXNlIGFyZSBmb3VuZCBpbiB0aGUgImtlcm5lbCBoYWNraW5nIiBzdWJtZW51LiAgU2V2ZXJhbAorb2YgdGhlc2Ugb3B0aW9ucyBzaG91bGQgYmUgdHVybmVkIG9uIGZvciBhbnkga2VybmVsIHVzZWQgZm9yIGRldmVsb3BtZW50IG9yCit0ZXN0aW5nIHB1cnBvc2VzLiAgSW4gcGFydGljdWxhciwgeW91IHNob3VsZCB0dXJuIG9uOgorCisgLSBFTkFCTEVfV0FSTl9ERVBSRUNBVEVELCBFTkFCTEVfTVVTVF9DSEVDSywgYW5kIEZSQU1FX1dBUk4gdG8gZ2V0IGFuCisgICBleHRyYSBzZXQgb2Ygd2FybmluZ3MgZm9yIHByb2JsZW1zIGxpa2UgdGhlIHVzZSBvZiBkZXByZWNhdGVkIGludGVyZmFjZXMKKyAgIG9yIGlnbm9yaW5nIGFuIGltcG9ydGFudCByZXR1cm4gdmFsdWUgZnJvbSBhIGZ1bmN0aW9uLiAgVGhlIG91dHB1dAorICAgZ2VuZXJhdGVkIGJ5IHRoZXNlIHdhcm5pbmdzIGNhbiBiZSB2ZXJib3NlLCBidXQgb25lIG5lZWQgbm90IHdvcnJ5IGFib3V0CisgICB3YXJuaW5ncyBmcm9tIG90aGVyIHBhcnRzIG9mIHRoZSBrZXJuZWwuCisKKyAtIERFQlVHX09CSkVDVFMgd2lsbCBhZGQgY29kZSB0byB0cmFjayB0aGUgbGlmZXRpbWUgb2YgdmFyaW91cyBvYmplY3RzCisgICBjcmVhdGVkIGJ5IHRoZSBrZXJuZWwgYW5kIHdhcm4gd2hlbiB0aGluZ3MgYXJlIGRvbmUgb3V0IG9mIG9yZGVyLiAgSWYKKyAgIHlvdSBhcmUgYWRkaW5nIGEgc3Vic3lzdGVtIHdoaWNoIGNyZWF0ZXMgKGFuZCBleHBvcnRzKSBjb21wbGV4IG9iamVjdHMKKyAgIG9mIGl0cyBvd24sIGNvbnNpZGVyIGFkZGluZyBzdXBwb3J0IGZvciB0aGUgb2JqZWN0IGRlYnVnZ2luZworICAgaW5mcmFzdHJ1Y3R1cmUuCisKKyAtIERFQlVHX1NMQUIgY2FuIGZpbmQgYSB2YXJpZXR5IG9mIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCB1c2UgZXJyb3JzOyBpdAorICAgc2hvdWxkIGJlIHVzZWQgb24gbW9zdCBkZXZlbG9wbWVudCBrZXJuZWxzLgorCisgLSBERUJVR19TUElOTE9DSywgREVCVUdfQVRPTUlDX1NMRUVQLCBhbmQgREVCVUdfTVVURVhFUyB3aWxsIGZpbmQgYQorICAgbnVtYmVyIG9mIGNvbW1vbiBsb2NraW5nIGVycm9ycy4KKworVGhlcmUgYXJlIHF1aXRlIGEgZmV3IG90aGVyIGRlYnVnZ2luZyBvcHRpb25zLCBzb21lIG9mIHdoaWNoIHdpbGwgYmUKK2Rpc2N1c3NlZCBiZWxvdy4gIFNvbWUgb2YgdGhlbSBoYXZlIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaW1wYWN0IGFuZAorc2hvdWxkIG5vdCBiZSB1c2VkIGFsbCBvZiB0aGUgdGltZS4gIEJ1dCBzb21lIHRpbWUgc3BlbnQgbGVhcm5pbmcgdGhlCithdmFpbGFibGUgb3B0aW9ucyB3aWxsIGxpa2VseSBiZSBwYWlkIGJhY2sgbWFueSB0aW1lcyBvdmVyIGluIHNob3J0IG9yZGVyLgorCitPbmUgb2YgdGhlIGhlYXZpZXIgZGVidWdnaW5nIHRvb2xzIGlzIHRoZSBsb2NraW5nIGNoZWNrZXIsIG9yICJsb2NrZGVwLiIKK1RoaXMgdG9vbCB3aWxsIHRyYWNrIHRoZSBhY3F1aXNpdGlvbiBhbmQgcmVsZWFzZSBvZiBldmVyeSBsb2NrIChzcGlubG9jayBvcgorbXV0ZXgpIGluIHRoZSBzeXN0ZW0sIHRoZSBvcmRlciBpbiB3aGljaCBsb2NrcyBhcmUgYWNxdWlyZWQgcmVsYXRpdmUgdG8KK2VhY2ggb3RoZXIsIHRoZSBjdXJyZW50IGludGVycnVwdCBlbnZpcm9ubWVudCwgYW5kIG1vcmUuICBJdCBjYW4gdGhlbgorZW5zdXJlIHRoYXQgbG9ja3MgYXJlIGFsd2F5cyBhY3F1aXJlZCBpbiB0aGUgc2FtZSBvcmRlciwgdGhhdCB0aGUgc2FtZQoraW50ZXJydXB0IGFzc3VtcHRpb25zIGFwcGx5IGluIGFsbCBzaXR1YXRpb25zLCBhbmQgc28gb24uICBJbiBvdGhlciB3b3JkcywKK2xvY2tkZXAgY2FuIGZpbmQgYSBudW1iZXIgb2Ygc2NlbmFyaW9zIGluIHdoaWNoIHRoZSBzeXN0ZW0gY291bGQsIG9uIHJhcmUKK29jY2FzaW9uLCBkZWFkbG9jay4gIFRoaXMga2luZCBvZiBwcm9ibGVtIGNhbiBiZSBwYWluZnVsIChmb3IgYm90aAorZGV2ZWxvcGVycyBhbmQgdXNlcnMpIGluIGEgZGVwbG95ZWQgc3lzdGVtOyBsb2NrZGVwIGFsbG93cyB0aGVtIHRvIGJlIGZvdW5kCitpbiBhbiBhdXRvbWF0ZWQgbWFubmVyIGFoZWFkIG9mIHRpbWUuICBDb2RlIHdpdGggYW55IHNvcnQgb2Ygbm9uLXRyaXZpYWwKK2xvY2tpbmcgc2hvdWxkIGJlIHJ1biB3aXRoIGxvY2tkZXAgZW5hYmxlZCBiZWZvcmUgYmVpbmcgc3VibWl0dGVkIGZvcgoraW5jbHVzaW9uLgorCitBcyBhIGRpbGlnZW50IGtlcm5lbCBwcm9ncmFtbWVyLCB5b3Ugd2lsbCwgYmV5b25kIGRvdWJ0LCBjaGVjayB0aGUgcmV0dXJuCitzdGF0dXMgb2YgYW55IG9wZXJhdGlvbiAoc3VjaCBhcyBhIG1lbW9yeSBhbGxvY2F0aW9uKSB3aGljaCBjYW4gZmFpbC4gIFRoZQorZmFjdCBvZiB0aGUgbWF0dGVyLCB0aG91Z2gsIGlzIHRoYXQgdGhlIHJlc3VsdGluZyBmYWlsdXJlIHJlY292ZXJ5IHBhdGhzCithcmUsIHByb2JhYmx5LCBjb21wbGV0ZWx5IHVudGVzdGVkLiAgVW50ZXN0ZWQgY29kZSB0ZW5kcyB0byBiZSBicm9rZW4gY29kZTsKK3lvdSBjb3VsZCBiZSBtdWNoIG1vcmUgY29uZmlkZW50IG9mIHlvdXIgY29kZSBpZiBhbGwgdGhvc2UgZXJyb3ItaGFuZGxpbmcKK3BhdGhzIGhhZCBiZWVuIGV4ZXJjaXNlZCBhIGZldyB0aW1lcy4KKworVGhlIGtlcm5lbCBwcm92aWRlcyBhIGZhdWx0IGluamVjdGlvbiBmcmFtZXdvcmsgd2hpY2ggY2FuIGRvIGV4YWN0bHkgdGhhdCwKK2VzcGVjaWFsbHkgd2hlcmUgbWVtb3J5IGFsbG9jYXRpb25zIGFyZSBpbnZvbHZlZC4gIFdpdGggZmF1bHQgaW5qZWN0aW9uCitlbmFibGVkLCBhIGNvbmZpZ3VyYWJsZSBwZXJjZW50YWdlIG9mIG1lbW9yeSBhbGxvY2F0aW9ucyB3aWxsIGJlIG1hZGUgdG8KK2ZhaWw7IHRoZXNlIGZhaWx1cmVzIGNhbiBiZSByZXN0cmljdGVkIHRvIGEgc3BlY2lmaWMgcmFuZ2Ugb2YgY29kZS4KK1J1bm5pbmcgd2l0aCBmYXVsdCBpbmplY3Rpb24gZW5hYmxlZCBhbGxvd3MgdGhlIHByb2dyYW1tZXIgdG8gc2VlIGhvdyB0aGUKK2NvZGUgcmVzcG9uZHMgd2hlbiB0aGluZ3MgZ28gYmFkbHkuICBTZWUKK0RvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhdWx0LWluamVjdGlvbi50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24KK2hvdyB0byB1c2UgdGhpcyBmYWNpbGl0eS4KKworT3RoZXIga2luZHMgb2YgZXJyb3JzIGNhbiBiZSBmb3VuZCB3aXRoIHRoZSAic3BhcnNlIiBzdGF0aWMgYW5hbHlzaXMgdG9vbC4KK1dpdGggc3BhcnNlLCB0aGUgcHJvZ3JhbW1lciBjYW4gYmUgd2FybmVkIGFib3V0IGNvbmZ1c2lvbiBiZXR3ZWVuCit1c2VyLXNwYWNlIGFuZCBrZXJuZWwtc3BhY2UgYWRkcmVzc2VzLCBtaXh0dXJlIG9mIGJpZy1lbmRpYW4gYW5kCitzbWFsbC1lbmRpYW4gcXVhbnRpdGllcywgdGhlIHBhc3Npbmcgb2YgaW50ZWdlciB2YWx1ZXMgd2hlcmUgYSBzZXQgb2YgYml0CitmbGFncyBpcyBleHBlY3RlZCwgYW5kIHNvIG9uLiAgU3BhcnNlIG11c3QgYmUgaW5zdGFsbGVkIHNlcGFyYXRlbHkgKGl0IGNhbgorYmUgZm91bmQgYXQgaHR0cHM6Ly9zcGFyc2Uud2lraS5rZXJuZWwub3JnL2luZGV4LnBocC9NYWluX1BhZ2UgaWYgeW91cgorZGlzdHJpYnV0b3IgZG9lcyBub3QgcGFja2FnZSBpdCk7IGl0IGNhbiB0aGVuIGJlIHJ1biBvbiB0aGUgY29kZSBieSBhZGRpbmcKKyJDPTEiIHRvIHlvdXIgbWFrZSBjb21tYW5kLgorCitUaGUgIkNvY2NpbmVsbGUiIHRvb2wgKGh0dHA6Ly9jb2NjaW5lbGxlLmxpcDYuZnIvKSBpcyBhYmxlIHRvIGZpbmQgYSB3aWRlCit2YXJpZXR5IG9mIHBvdGVudGlhbCBjb2RpbmcgcHJvYmxlbXM7IGl0IGNhbiBhbHNvIHByb3Bvc2UgZml4ZXMgZm9yIHRob3NlCitwcm9ibGVtcy4gIFF1aXRlIGEgZmV3ICJzZW1hbnRpYyBwYXRjaGVzIiBmb3IgdGhlIGtlcm5lbCBoYXZlIGJlZW4gcGFja2FnZWQKK3VuZGVyIHRoZSBzY3JpcHRzL2NvY2NpbmVsbGUgZGlyZWN0b3J5OyBydW5uaW5nICJtYWtlIGNvY2NpY2hlY2siIHdpbGwgcnVuCit0aHJvdWdoIHRob3NlIHNlbWFudGljIHBhdGNoZXMgYW5kIHJlcG9ydCBvbiBhbnkgcHJvYmxlbXMgZm91bmQuICBTZWUKK0RvY3VtZW50YXRpb24vY29jY2luZWxsZS50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK090aGVyIGtpbmRzIG9mIHBvcnRhYmlsaXR5IGVycm9ycyBhcmUgYmVzdCBmb3VuZCBieSBjb21waWxpbmcgeW91ciBjb2RlIGZvcgorb3RoZXIgYXJjaGl0ZWN0dXJlcy4gIElmIHlvdSBkbyBub3QgaGFwcGVuIHRvIGhhdmUgYW4gUy8zOTAgc3lzdGVtIG9yIGEKK0JsYWNrZmluIGRldmVsb3BtZW50IGJvYXJkIGhhbmR5LCB5b3UgY2FuIHN0aWxsIHBlcmZvcm0gdGhlIGNvbXBpbGF0aW9uCitzdGVwLiAgQSBsYXJnZSBzZXQgb2YgY3Jvc3MgY29tcGlsZXJzIGZvciB4ODYgc3lzdGVtcyBjYW4gYmUgZm91bmQgYXQKKworCWh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvdG9vbHMvY3Jvc3N0b29sLworCitTb21lIHRpbWUgc3BlbnQgaW5zdGFsbGluZyBhbmQgdXNpbmcgdGhlc2UgY29tcGlsZXJzIHdpbGwgaGVscCBhdm9pZAorZW1iYXJyYXNzbWVudCBsYXRlci4KKworCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tCisKK0RvY3VtZW50YXRpb24gaGFzIG9mdGVuIGJlZW4gbW9yZSB0aGUgZXhjZXB0aW9uIHRoYW4gdGhlIHJ1bGUgd2l0aCBrZXJuZWwKK2RldmVsb3BtZW50LiAgRXZlbiBzbywgYWRlcXVhdGUgZG9jdW1lbnRhdGlvbiB3aWxsIGhlbHAgdG8gZWFzZSB0aGUgbWVyZ2luZworb2YgbmV3IGNvZGUgaW50byB0aGUga2VybmVsLCBtYWtlIGxpZmUgZWFzaWVyIGZvciBvdGhlciBkZXZlbG9wZXJzLCBhbmQKK3dpbGwgYmUgaGVscGZ1bCBmb3IgeW91ciB1c2Vycy4gIEluIG1hbnkgY2FzZXMsIHRoZSBhZGRpdGlvbiBvZgorZG9jdW1lbnRhdGlvbiBoYXMgYmVjb21lIGVzc2VudGlhbGx5IG1hbmRhdG9yeS4KKworVGhlIGZpcnN0IHBpZWNlIG9mIGRvY3VtZW50YXRpb24gZm9yIGFueSBwYXRjaCBpcyBpdHMgYXNzb2NpYXRlZAorY2hhbmdlbG9nLiAgTG9nIGVudHJpZXMgc2hvdWxkIGRlc2NyaWJlIHRoZSBwcm9ibGVtIGJlaW5nIHNvbHZlZCwgdGhlIGZvcm0KK29mIHRoZSBzb2x1dGlvbiwgdGhlIHBlb3BsZSB3aG8gd29ya2VkIG9uIHRoZSBwYXRjaCwgYW55IHJlbGV2YW50CitlZmZlY3RzIG9uIHBlcmZvcm1hbmNlLCBhbmQgYW55dGhpbmcgZWxzZSB0aGF0IG1pZ2h0IGJlIG5lZWRlZCB0bwordW5kZXJzdGFuZCB0aGUgcGF0Y2guICBCZSBzdXJlIHRoYXQgdGhlIGNoYW5nZWxvZyBzYXlzICp3aHkqIHRoZSBwYXRjaCBpcword29ydGggYXBwbHlpbmc7IGEgc3VycHJpc2luZyBudW1iZXIgb2YgZGV2ZWxvcGVycyBmYWlsIHRvIHByb3ZpZGUgdGhhdAoraW5mb3JtYXRpb24uCisKK0FueSBjb2RlIHdoaWNoIGFkZHMgYSBuZXcgdXNlci1zcGFjZSBpbnRlcmZhY2UgLSBpbmNsdWRpbmcgbmV3IHN5c2ZzIG9yCisvcHJvYyBmaWxlcyAtIHNob3VsZCBpbmNsdWRlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBpbnRlcmZhY2Ugd2hpY2ggZW5hYmxlcwordXNlci1zcGFjZSBkZXZlbG9wZXJzIHRvIGtub3cgd2hhdCB0aGV5IGFyZSB3b3JraW5nIHdpdGguICBTZWUKK0RvY3VtZW50YXRpb24vQUJJL1JFQURNRSBmb3IgYSBkZXNjcmlwdGlvbiBvZiBob3cgdGhpcyBkb2N1bWVudGF0aW9uIHNob3VsZAorYmUgZm9ybWF0dGVkIGFuZCB3aGF0IGluZm9ybWF0aW9uIG5lZWRzIHRvIGJlIHByb3ZpZGVkLgorCitUaGUgZmlsZSBEb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCBkZXNjcmliZXMgYWxsIG9mIHRoZSBrZXJuZWwncworYm9vdC10aW1lIHBhcmFtZXRlcnMuICBBbnkgcGF0Y2ggd2hpY2ggYWRkcyBuZXcgcGFyYW1ldGVycyBzaG91bGQgYWRkIHRoZQorYXBwcm9wcmlhdGUgZW50cmllcyB0byB0aGlzIGZpbGUuCisKK0FueSBuZXcgY29uZmlndXJhdGlvbiBvcHRpb25zIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgaGVscCB0ZXh0IHdoaWNoCitjbGVhcmx5IGV4cGxhaW5zIHRoZSBvcHRpb25zIGFuZCB3aGVuIHRoZSB1c2VyIG1pZ2h0IHdhbnQgdG8gc2VsZWN0IHRoZW0uCisKK0ludGVybmFsIEFQSSBpbmZvcm1hdGlvbiBmb3IgbWFueSBzdWJzeXN0ZW1zIGlzIGRvY3VtZW50ZWQgYnkgd2F5IG9mCitzcGVjaWFsbHktZm9ybWF0dGVkIGNvbW1lbnRzOyB0aGVzZSBjb21tZW50cyBjYW4gYmUgZXh0cmFjdGVkIGFuZCBmb3JtYXR0ZWQKK2luIGEgbnVtYmVyIG9mIHdheXMgYnkgdGhlICJrZXJuZWwtZG9jIiBzY3JpcHQuICBJZiB5b3UgYXJlIHdvcmtpbmcgd2l0aGluCithIHN1YnN5c3RlbSB3aGljaCBoYXMga2VybmVsZG9jIGNvbW1lbnRzLCB5b3Ugc2hvdWxkIG1haW50YWluIHRoZW0gYW5kIGFkZAordGhlbSwgYXMgYXBwcm9wcmlhdGUsIGZvciBleHRlcm5hbGx5LWF2YWlsYWJsZSBmdW5jdGlvbnMuICBFdmVuIGluIGFyZWFzCit3aGljaCBoYXZlIG5vdCBiZWVuIHNvIGRvY3VtZW50ZWQsIHRoZXJlIGlzIG5vIGhhcm0gaW4gYWRkaW5nIGtlcm5lbGRvYworY29tbWVudHMgZm9yIHRoZSBmdXR1cmU7IGluZGVlZCwgdGhpcyBjYW4gYmUgYSB1c2VmdWwgYWN0aXZpdHkgZm9yCitiZWdpbm5pbmcga2VybmVsIGRldmVsb3BlcnMuICBUaGUgZm9ybWF0IG9mIHRoZXNlIGNvbW1lbnRzLCBhbG9uZyB3aXRoIHNvbWUKK2luZm9ybWF0aW9uIG9uIGhvdyB0byBjcmVhdGUga2VybmVsZG9jIHRlbXBsYXRlcyBjYW4gYmUgZm91bmQgaW4gdGhlIGZpbGUKK0RvY3VtZW50YXRpb24va2VybmVsLWRvY3VtZW50YXRpb24ucnN0LgorCitBbnlib2R5IHdobyByZWFkcyB0aHJvdWdoIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mIGV4aXN0aW5nIGtlcm5lbCBjb2RlIHdpbGwKK25vdGUgdGhhdCwgb2Z0ZW4sIGNvbW1lbnRzIGFyZSBtb3N0IG5vdGFibGUgYnkgdGhlaXIgYWJzZW5jZS4gIE9uY2UgYWdhaW4sCit0aGUgZXhwZWN0YXRpb25zIGZvciBuZXcgY29kZSBhcmUgaGlnaGVyIHRoYW4gdGhleSB3ZXJlIGluIHRoZSBwYXN0OworbWVyZ2luZyB1bmNvbW1lbnRlZCBjb2RlIHdpbGwgYmUgaGFyZGVyLiAgVGhhdCBzYWlkLCB0aGVyZSBpcyBsaXR0bGUgZGVzaXJlCitmb3IgdmVyYm9zZWx5LWNvbW1lbnRlZCBjb2RlLiAgVGhlIGNvZGUgc2hvdWxkLCBpdHNlbGYsIGJlIHJlYWRhYmxlLCB3aXRoCitjb21tZW50cyBleHBsYWluaW5nIHRoZSBtb3JlIHN1YnRsZSBhc3BlY3RzLgorCitDZXJ0YWluIHRoaW5ncyBzaG91bGQgYWx3YXlzIGJlIGNvbW1lbnRlZC4gIFVzZXMgb2YgbWVtb3J5IGJhcnJpZXJzIHNob3VsZAorYmUgYWNjb21wYW5pZWQgYnkgYSBsaW5lIGV4cGxhaW5pbmcgd2h5IHRoZSBiYXJyaWVyIGlzIG5lY2Vzc2FyeS4gIFRoZQorbG9ja2luZyBydWxlcyBmb3IgZGF0YSBzdHJ1Y3R1cmVzIGdlbmVyYWxseSBuZWVkIHRvIGJlIGV4cGxhaW5lZCBzb21ld2hlcmUuCitNYWpvciBkYXRhIHN0cnVjdHVyZXMgbmVlZCBjb21wcmVoZW5zaXZlIGRvY3VtZW50YXRpb24gaW4gZ2VuZXJhbC4KK05vbi1vYnZpb3VzIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHNlcGFyYXRlIGJpdHMgb2YgY29kZSBzaG91bGQgYmUgcG9pbnRlZAorb3V0LiAgQW55dGhpbmcgd2hpY2ggbWlnaHQgdGVtcHQgYSBjb2RlIGphbml0b3IgdG8gbWFrZSBhbiBpbmNvcnJlY3QKKyJjbGVhbnVwIiBuZWVkcyBhIGNvbW1lbnQgc2F5aW5nIHdoeSBpdCBpcyBkb25lIHRoZSB3YXkgaXQgaXMuICBBbmQgc28gb24uCisKKworSW50ZXJuYWwgQVBJIGNoYW5nZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBiaW5hcnkgaW50ZXJmYWNlIHByb3ZpZGVkIGJ5IHRoZSBrZXJuZWwgdG8gdXNlciBzcGFjZSBjYW5ub3QgYmUgYnJva2VuCitleGNlcHQgdW5kZXIgdGhlIG1vc3Qgc2V2ZXJlIGNpcmN1bXN0YW5jZXMuICBUaGUga2VybmVsJ3MgaW50ZXJuYWwKK3Byb2dyYW1taW5nIGludGVyZmFjZXMsIGluc3RlYWQsIGFyZSBoaWdobHkgZmx1aWQgYW5kIGNhbiBiZSBjaGFuZ2VkIHdoZW4KK3RoZSBuZWVkIGFyaXNlcy4gIElmIHlvdSBmaW5kIHlvdXJzZWxmIGhhdmluZyB0byB3b3JrIGFyb3VuZCBhIGtlcm5lbCBBUEksCitvciBzaW1wbHkgbm90IHVzaW5nIGEgc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSBiZWNhdXNlIGl0IGRvZXMgbm90IG1lZXQgeW91cgorbmVlZHMsIHRoYXQgbWF5IGJlIGEgc2lnbiB0aGF0IHRoZSBBUEkgbmVlZHMgdG8gY2hhbmdlLiAgQXMgYSBrZXJuZWwKK2RldmVsb3BlciwgeW91IGFyZSBlbXBvd2VyZWQgdG8gbWFrZSBzdWNoIGNoYW5nZXMuCisKK1RoZXJlIGFyZSwgb2YgY291cnNlLCBzb21lIGNhdGNoZXMuICBBUEkgY2hhbmdlcyBjYW4gYmUgbWFkZSwgYnV0IHRoZXkgbmVlZAordG8gYmUgd2VsbCBqdXN0aWZpZWQuICBTbyBhbnkgcGF0Y2ggbWFraW5nIGFuIGludGVybmFsIEFQSSBjaGFuZ2Ugc2hvdWxkIGJlCithY2NvbXBhbmllZCBieSBhIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhlIGNoYW5nZSBpcyBhbmQgd2h5IGl0IGlzCituZWNlc3NhcnkuICBUaGlzIGtpbmQgb2YgY2hhbmdlIHNob3VsZCBhbHNvIGJlIGJyb2tlbiBvdXQgaW50byBhIHNlcGFyYXRlCitwYXRjaCwgcmF0aGVyIHRoYW4gYnVyaWVkIHdpdGhpbiBhIGxhcmdlciBwYXRjaC4KKworVGhlIG90aGVyIGNhdGNoIGlzIHRoYXQgYSBkZXZlbG9wZXIgd2hvIGNoYW5nZXMgYW4gaW50ZXJuYWwgQVBJIGlzCitnZW5lcmFsbHkgY2hhcmdlZCB3aXRoIHRoZSB0YXNrIG9mIGZpeGluZyBhbnkgY29kZSB3aXRoaW4gdGhlIGtlcm5lbCB0cmVlCit3aGljaCBpcyBicm9rZW4gYnkgdGhlIGNoYW5nZS4gIEZvciBhIHdpZGVseS11c2VkIGZ1bmN0aW9uLCB0aGlzIGR1dHkgY2FuCitsZWFkIHRvIGxpdGVyYWxseSBodW5kcmVkcyBvciB0aG91c2FuZHMgb2YgY2hhbmdlcyAtIG1hbnkgb2Ygd2hpY2ggYXJlCitsaWtlbHkgdG8gY29uZmxpY3Qgd2l0aCB3b3JrIGJlaW5nIGRvbmUgYnkgb3RoZXIgZGV2ZWxvcGVycy4gIE5lZWRsZXNzIHRvCitzYXksIHRoaXMgY2FuIGJlIGEgbGFyZ2Ugam9iLCBzbyBpdCBpcyBiZXN0IHRvIGJlIHN1cmUgdGhhdCB0aGUKK2p1c3RpZmljYXRpb24gaXMgc29saWQuICBOb3RlIHRoYXQgdGhlIENvY2NpbmVsbGUgdG9vbCBjYW4gaGVscCB3aXRoCit3aWRlLXJhbmdpbmcgQVBJIGNoYW5nZXMuCisKK1doZW4gbWFraW5nIGFuIGluY29tcGF0aWJsZSBBUEkgY2hhbmdlLCBvbmUgc2hvdWxkLCB3aGVuZXZlciBwb3NzaWJsZSwKK2Vuc3VyZSB0aGF0IGNvZGUgd2hpY2ggaGFzIG5vdCBiZWVuIHVwZGF0ZWQgaXMgY2F1Z2h0IGJ5IHRoZSBjb21waWxlci4KK1RoaXMgd2lsbCBoZWxwIHlvdSB0byBiZSBzdXJlIHRoYXQgeW91IGhhdmUgZm91bmQgYWxsIGluLXRyZWUgdXNlcyBvZiB0aGF0CitpbnRlcmZhY2UuICBJdCB3aWxsIGFsc28gYWxlcnQgZGV2ZWxvcGVycyBvZiBvdXQtb2YtdHJlZSBjb2RlIHRoYXQgdGhlcmUgaXMKK2EgY2hhbmdlIHRoYXQgdGhleSBuZWVkIHRvIHJlc3BvbmQgdG8uICBTdXBwb3J0aW5nIG91dC1vZi10cmVlIGNvZGUgaXMgbm90Citzb21ldGhpbmcgdGhhdCBrZXJuZWwgZGV2ZWxvcGVycyBuZWVkIHRvIGJlIHdvcnJpZWQgYWJvdXQsIGJ1dCB3ZSBhbHNvIGRvCitub3QgaGF2ZSB0byBtYWtlIGxpZmUgaGFyZGVyIGZvciBvdXQtb2YtdHJlZSBkZXZlbG9wZXJzIHRoYW4gaXQgbmVlZHMgdG8KK2JlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzUuUG9zdGluZyBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy81LlBvc3RpbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNDhjOWIuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzUuUG9zdGluZworKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi01OiBQT1NUSU5HIFBBVENIRVMKLQotU29vbmVyIG9yIGxhdGVyLCB0aGUgdGltZSBjb21lcyB3aGVuIHlvdXIgd29yayBpcyByZWFkeSB0byBiZSBwcmVzZW50ZWQgdG8KLXRoZSBjb21tdW5pdHkgZm9yIHJldmlldyBhbmQsIGV2ZW50dWFsbHksIGluY2x1c2lvbiBpbnRvIHRoZSBtYWlubGluZQota2VybmVsLiAgVW5zdXJwcmlzaW5nbHksIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgY29tbXVuaXR5IGhhcyBldm9sdmVkIGEgc2V0Ci1vZiBjb252ZW50aW9ucyBhbmQgcHJvY2VkdXJlcyB3aGljaCBhcmUgdXNlZCBpbiB0aGUgcG9zdGluZyBvZiBwYXRjaGVzOwotZm9sbG93aW5nIHRoZW0gd2lsbCBtYWtlIGxpZmUgbXVjaCBlYXNpZXIgZm9yIGV2ZXJ5Ym9keSBpbnZvbHZlZC4gIFRoaXMKLWRvY3VtZW50IHdpbGwgYXR0ZW1wdCB0byBjb3ZlciB0aGVzZSBleHBlY3RhdGlvbnMgaW4gcmVhc29uYWJsZSBkZXRhaWw7Ci1tb3JlIGluZm9ybWF0aW9uIGNhbiBhbHNvIGJlIGZvdW5kIGluIHRoZSBmaWxlcyBTdWJtaXR0aW5nUGF0Y2hlcywKLVN1Ym1pdHRpbmdEcml2ZXJzLCBhbmQgU3VibWl0Q2hlY2tsaXN0IGluIHRoZSBrZXJuZWwgZG9jdW1lbnRhdGlvbgotZGlyZWN0b3J5LgotCi0KLTUuMTogV0hFTiBUTyBQT1NUCi0KLVRoZXJlIGlzIGEgY29uc3RhbnQgdGVtcHRhdGlvbiB0byBhdm9pZCBwb3N0aW5nIHBhdGNoZXMgYmVmb3JlIHRoZXkgYXJlCi1jb21wbGV0ZWx5ICJyZWFkeS4iICBGb3Igc2ltcGxlIHBhdGNoZXMsIHRoYXQgaXMgbm90IGEgcHJvYmxlbS4gIElmIHRoZQotd29yayBiZWluZyBkb25lIGlzIGNvbXBsZXgsIHRob3VnaCwgdGhlcmUgaXMgYSBsb3QgdG8gYmUgZ2FpbmVkIGJ5IGdldHRpbmcKLWZlZWRiYWNrIGZyb20gdGhlIGNvbW11bml0eSBiZWZvcmUgdGhlIHdvcmsgaXMgY29tcGxldGUuICBTbyB5b3Ugc2hvdWxkCi1jb25zaWRlciBwb3N0aW5nIGluLXByb2dyZXNzIHdvcmssIG9yIGV2ZW4gbWFraW5nIGEgZ2l0IHRyZWUgYXZhaWxhYmxlIHNvCi10aGF0IGludGVyZXN0ZWQgZGV2ZWxvcGVycyBjYW4gY2F0Y2ggdXAgd2l0aCB5b3VyIHdvcmsgYXQgYW55IHRpbWUuCi0KLVdoZW4gcG9zdGluZyBjb2RlIHdoaWNoIGlzIG5vdCB5ZXQgY29uc2lkZXJlZCByZWFkeSBmb3IgaW5jbHVzaW9uLCBpdCBpcyBhCi1nb29kIGlkZWEgdG8gc2F5IHNvIGluIHRoZSBwb3N0aW5nIGl0c2VsZi4gIEFsc28gbWVudGlvbiBhbnkgbWFqb3Igd29yawotd2hpY2ggcmVtYWlucyB0byBiZSBkb25lIGFuZCBhbnkga25vd24gcHJvYmxlbXMuICBGZXdlciBwZW9wbGUgd2lsbCBsb29rIGF0Ci1wYXRjaGVzIHdoaWNoIGFyZSBrbm93biB0byBiZSBoYWxmLWJha2VkLCBidXQgdGhvc2Ugd2hvIGRvIHdpbGwgY29tZSBpbgotd2l0aCB0aGUgaWRlYSB0aGF0IHRoZXkgY2FuIGhlbHAgeW91IGRyaXZlIHRoZSB3b3JrIGluIHRoZSByaWdodCBkaXJlY3Rpb24uCi0KLQotNS4yOiBCRUZPUkUgQ1JFQVRJTkcgUEFUQ0hFUwotCi1UaGVyZSBhcmUgYSBudW1iZXIgb2YgdGhpbmdzIHdoaWNoIHNob3VsZCBiZSBkb25lIGJlZm9yZSB5b3UgY29uc2lkZXIKLXNlbmRpbmcgcGF0Y2hlcyB0byB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5LiAgVGhlc2UgaW5jbHVkZToKLQotIC0gVGVzdCB0aGUgY29kZSB0byB0aGUgZXh0ZW50IHRoYXQgeW91IGNhbi4gIE1ha2UgdXNlIG9mIHRoZSBrZXJuZWwncwotICAgZGVidWdnaW5nIHRvb2xzLCBlbnN1cmUgdGhhdCB0aGUga2VybmVsIHdpbGwgYnVpbGQgd2l0aCBhbGwgcmVhc29uYWJsZQotICAgY29tYmluYXRpb25zIG9mIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgdXNlIGNyb3NzLWNvbXBpbGVycyB0byBidWlsZCBmb3IKLSAgIGRpZmZlcmVudCBhcmNoaXRlY3R1cmVzLCBldGMuCi0KLSAtIE1ha2Ugc3VyZSB5b3VyIGNvZGUgaXMgY29tcGxpYW50IHdpdGggdGhlIGtlcm5lbCBjb2Rpbmcgc3R5bGUKLSAgIGd1aWRlbGluZXMuCi0KLSAtIERvZXMgeW91ciBjaGFuZ2UgaGF2ZSBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnM/ICBJZiBzbywgeW91IHNob3VsZCBydW4KLSAgIGJlbmNobWFya3Mgc2hvd2luZyB3aGF0IHRoZSBpbXBhY3QgKG9yIGJlbmVmaXQpIG9mIHlvdXIgY2hhbmdlIGlzOyBhCi0gICBzdW1tYXJ5IG9mIHRoZSByZXN1bHRzIHNob3VsZCBiZSBpbmNsdWRlZCB3aXRoIHRoZSBwYXRjaC4KLQotIC0gQmUgc3VyZSB0aGF0IHlvdSBoYXZlIHRoZSByaWdodCB0byBwb3N0IHRoZSBjb2RlLiAgSWYgdGhpcyB3b3JrIHdhcyBkb25lCi0gICBmb3IgYW4gZW1wbG95ZXIsIHRoZSBlbXBsb3llciBsaWtlbHkgaGFzIGEgcmlnaHQgdG8gdGhlIHdvcmsgYW5kIG11c3QgYmUKLSAgIGFncmVlYWJsZSB3aXRoIGl0cyByZWxlYXNlIHVuZGVyIHRoZSBHUEwuCi0KLUFzIGEgZ2VuZXJhbCBydWxlLCBwdXR0aW5nIGluIHNvbWUgZXh0cmEgdGhvdWdodCBiZWZvcmUgcG9zdGluZyBjb2RlIGFsbW9zdAotYWx3YXlzIHBheXMgYmFjayB0aGUgZWZmb3J0IGluIHNob3J0IG9yZGVyLgotCi0KLTUuMzogUEFUQ0ggUFJFUEFSQVRJT04KLQotVGhlIHByZXBhcmF0aW9uIG9mIHBhdGNoZXMgZm9yIHBvc3RpbmcgY2FuIGJlIGEgc3VycHJpc2luZyBhbW91bnQgb2Ygd29yaywKLWJ1dCwgb25jZSBhZ2FpbiwgYXR0ZW1wdGluZyB0byBzYXZlIHRpbWUgaGVyZSBpcyBub3QgZ2VuZXJhbGx5IGFkdmlzYWJsZQotZXZlbiBpbiB0aGUgc2hvcnQgdGVybS4KLQotUGF0Y2hlcyBtdXN0IGJlIHByZXBhcmVkIGFnYWluc3QgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBrZXJuZWwuICBBcyBhCi1nZW5lcmFsIHJ1bGUsIGEgcGF0Y2ggc2hvdWxkIGJlIGJhc2VkIG9uIHRoZSBjdXJyZW50IG1haW5saW5lIGFzIGZvdW5kIGluCi1MaW51cydzIGdpdCB0cmVlLiAgV2hlbiBiYXNpbmcgb24gbWFpbmxpbmUsIHN0YXJ0IHdpdGggYSB3ZWxsLWtub3duIHJlbGVhc2UKLXBvaW50IC0gYSBzdGFibGUgb3IgLXJjIHJlbGVhc2UgLSByYXRoZXIgdGhhbiBicmFuY2hpbmcgb2ZmIHRoZSBtYWlubGluZSBhdAotYW4gYXJiaXRyYXJ5IHNwb3QuCi0KLUl0IG1heSBiZWNvbWUgbmVjZXNzYXJ5IHRvIG1ha2UgdmVyc2lvbnMgYWdhaW5zdCAtbW0sIGxpbnV4LW5leHQsIG9yIGEKLXN1YnN5c3RlbSB0cmVlLCB0aG91Z2gsIHRvIGZhY2lsaXRhdGUgd2lkZXIgdGVzdGluZyBhbmQgcmV2aWV3LiAgRGVwZW5kaW5nCi1vbiB0aGUgYXJlYSBvZiB5b3VyIHBhdGNoIGFuZCB3aGF0IGlzIGdvaW5nIG9uIGVsc2V3aGVyZSwgYmFzaW5nIGEgcGF0Y2gKLWFnYWluc3QgdGhlc2Ugb3RoZXIgdHJlZXMgY2FuIHJlcXVpcmUgYSBzaWduaWZpY2FudCBhbW91bnQgb2Ygd29yawotcmVzb2x2aW5nIGNvbmZsaWN0cyBhbmQgZGVhbGluZyB3aXRoIEFQSSBjaGFuZ2VzLgotCi1Pbmx5IHRoZSBtb3N0IHNpbXBsZSBjaGFuZ2VzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgYSBzaW5nbGUgcGF0Y2g7Ci1ldmVyeXRoaW5nIGVsc2Ugc2hvdWxkIGJlIG1hZGUgYXMgYSBsb2dpY2FsIHNlcmllcyBvZiBjaGFuZ2VzLiAgU3BsaXR0aW5nCi11cCBwYXRjaGVzIGlzIGEgYml0IG9mIGFuIGFydDsgc29tZSBkZXZlbG9wZXJzIHNwZW5kIGEgbG9uZyB0aW1lIGZpZ3VyaW5nCi1vdXQgaG93IHRvIGRvIGl0IGluIHRoZSB3YXkgdGhhdCB0aGUgY29tbXVuaXR5IGV4cGVjdHMuICBUaGVyZSBhcmUgYSBmZXcKLXJ1bGVzIG9mIHRodW1iLCBob3dldmVyLCB3aGljaCBjYW4gaGVscCBjb25zaWRlcmFibHk6Ci0KLSAtIFRoZSBwYXRjaCBzZXJpZXMgeW91IHBvc3Qgd2lsbCBhbG1vc3QgY2VydGFpbmx5IG5vdCBiZSB0aGUgc2VyaWVzIG9mCi0gICBjaGFuZ2VzIGZvdW5kIGluIHlvdXIgd29ya2luZyByZXZpc2lvbiBjb250cm9sIHN5c3RlbS4gIEluc3RlYWQsIHRoZQotICAgY2hhbmdlcyB5b3UgaGF2ZSBtYWRlIG5lZWQgdG8gYmUgY29uc2lkZXJlZCBpbiB0aGVpciBmaW5hbCBmb3JtLCB0aGVuCi0gICBzcGxpdCBhcGFydCBpbiB3YXlzIHdoaWNoIG1ha2Ugc2Vuc2UuICBUaGUgZGV2ZWxvcGVycyBhcmUgaW50ZXJlc3RlZCBpbgotICAgZGlzY3JldGUsIHNlbGYtY29udGFpbmVkIGNoYW5nZXMsIG5vdCB0aGUgcGF0aCB5b3UgdG9vayB0byBnZXQgdG8gdGhvc2UKLSAgIGNoYW5nZXMuCi0KLSAtIEVhY2ggbG9naWNhbGx5IGluZGVwZW5kZW50IGNoYW5nZSBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIGEgc2VwYXJhdGUKLSAgIHBhdGNoLiAgVGhlc2UgY2hhbmdlcyBjYW4gYmUgc21hbGwgKCJhZGQgYSBmaWVsZCB0byB0aGlzIHN0cnVjdHVyZSIpIG9yCi0gICBsYXJnZSAoYWRkaW5nIGEgc2lnbmlmaWNhbnQgbmV3IGRyaXZlciwgZm9yIGV4YW1wbGUpLCBidXQgdGhleSBzaG91bGQgYmUKLSAgIGNvbmNlcHR1YWxseSBzbWFsbCBhbmQgYW1lbmFibGUgdG8gYSBvbmUtbGluZSBkZXNjcmlwdGlvbi4gIEVhY2ggcGF0Y2gKLSAgIHNob3VsZCBtYWtlIGEgc3BlY2lmaWMgY2hhbmdlIHdoaWNoIGNhbiBiZSByZXZpZXdlZCBvbiBpdHMgb3duIGFuZAotICAgdmVyaWZpZWQgdG8gZG8gd2hhdCBpdCBzYXlzIGl0IGRvZXMuCi0KLSAtIEFzIGEgd2F5IG9mIHJlc3RhdGluZyB0aGUgZ3VpZGVsaW5lIGFib3ZlOiBkbyBub3QgbWl4IGRpZmZlcmVudCB0eXBlcyBvZgotICAgY2hhbmdlcyBpbiB0aGUgc2FtZSBwYXRjaC4gIElmIGEgc2luZ2xlIHBhdGNoIGZpeGVzIGEgY3JpdGljYWwgc2VjdXJpdHkKLSAgIGJ1ZywgcmVhcnJhbmdlcyBhIGZldyBzdHJ1Y3R1cmVzLCBhbmQgcmVmb3JtYXRzIHRoZSBjb2RlLCB0aGVyZSBpcyBhCi0gICBnb29kIGNoYW5jZSB0aGF0IGl0IHdpbGwgYmUgcGFzc2VkIG92ZXIgYW5kIHRoZSBpbXBvcnRhbnQgZml4IHdpbGwgYmUKLSAgIGxvc3QuCi0KLSAtIEVhY2ggcGF0Y2ggc2hvdWxkIHlpZWxkIGEga2VybmVsIHdoaWNoIGJ1aWxkcyBhbmQgcnVucyBwcm9wZXJseTsgaWYgeW91cgotICAgcGF0Y2ggc2VyaWVzIGlzIGludGVycnVwdGVkIGluIHRoZSBtaWRkbGUsIHRoZSByZXN1bHQgc2hvdWxkIHN0aWxsIGJlIGEKLSAgIHdvcmtpbmcga2VybmVsLiAgUGFydGlhbCBhcHBsaWNhdGlvbiBvZiBhIHBhdGNoIHNlcmllcyBpcyBhIGNvbW1vbgotICAgc2NlbmFyaW8gd2hlbiB0aGUgImdpdCBiaXNlY3QiIHRvb2wgaXMgdXNlZCB0byBmaW5kIHJlZ3Jlc3Npb25zOyBpZiB0aGUKLSAgIHJlc3VsdCBpcyBhIGJyb2tlbiBrZXJuZWwsIHlvdSB3aWxsIG1ha2UgbGlmZSBoYXJkZXIgZm9yIGRldmVsb3BlcnMgYW5kCi0gICB1c2VycyB3aG8gYXJlIGVuZ2FnaW5nIGluIHRoZSBub2JsZSB3b3JrIG9mIHRyYWNraW5nIGRvd24gcHJvYmxlbXMuCi0KLSAtIERvIG5vdCBvdmVyZG8gaXQsIHRob3VnaC4gIE9uZSBkZXZlbG9wZXIgb25jZSBwb3N0ZWQgYSBzZXQgb2YgZWRpdHMKLSAgIHRvIGEgc2luZ2xlIGZpbGUgYXMgNTAwIHNlcGFyYXRlIHBhdGNoZXMgLSBhbiBhY3Qgd2hpY2ggZGlkIG5vdCBtYWtlIGhpbQotICAgdGhlIG1vc3QgcG9wdWxhciBwZXJzb24gb24gdGhlIGtlcm5lbCBtYWlsaW5nIGxpc3QuICBBIHNpbmdsZSBwYXRjaCBjYW4KLSAgIGJlIHJlYXNvbmFibHkgbGFyZ2UgYXMgbG9uZyBhcyBpdCBzdGlsbCBjb250YWlucyBhIHNpbmdsZSAqbG9naWNhbCoKLSAgIGNoYW5nZS4KLQotIC0gSXQgY2FuIGJlIHRlbXB0aW5nIHRvIGFkZCBhIHdob2xlIG5ldyBpbmZyYXN0cnVjdHVyZSB3aXRoIGEgc2VyaWVzIG9mCi0gICBwYXRjaGVzLCBidXQgdG8gbGVhdmUgdGhhdCBpbmZyYXN0cnVjdHVyZSB1bnVzZWQgdW50aWwgdGhlIGZpbmFsIHBhdGNoCi0gICBpbiB0aGUgc2VyaWVzIGVuYWJsZXMgdGhlIHdob2xlIHRoaW5nLiAgVGhpcyB0ZW1wdGF0aW9uIHNob3VsZCBiZQotICAgYXZvaWRlZCBpZiBwb3NzaWJsZTsgaWYgdGhhdCBzZXJpZXMgYWRkcyByZWdyZXNzaW9ucywgYmlzZWN0aW9uIHdpbGwKLSAgIGZpbmdlciB0aGUgbGFzdCBwYXRjaCBhcyB0aGUgb25lIHdoaWNoIGNhdXNlZCB0aGUgcHJvYmxlbSwgZXZlbiB0aG91Z2gKLSAgIHRoZSByZWFsIGJ1ZyBpcyBlbHNld2hlcmUuICBXaGVuZXZlciBwb3NzaWJsZSwgYSBwYXRjaCB3aGljaCBhZGRzIG5ldwotICAgY29kZSBzaG91bGQgbWFrZSB0aGF0IGNvZGUgYWN0aXZlIGltbWVkaWF0ZWx5LgotCi1Xb3JraW5nIHRvIGNyZWF0ZSB0aGUgcGVyZmVjdCBwYXRjaCBzZXJpZXMgY2FuIGJlIGEgZnJ1c3RyYXRpbmcgcHJvY2Vzcwotd2hpY2ggdGFrZXMgcXVpdGUgYSBiaXQgb2YgdGltZSBhbmQgdGhvdWdodCBhZnRlciB0aGUgInJlYWwgd29yayIgaGFzIGJlZW4KLWRvbmUuICBXaGVuIGRvbmUgcHJvcGVybHksIHRob3VnaCwgaXQgaXMgdGltZSB3ZWxsIHNwZW50LgotCi0KLTUuNDogUEFUQ0ggRk9STUFUVElORyBBTkQgQ0hBTkdFTE9HUwotCi1TbyBub3cgeW91IGhhdmUgYSBwZXJmZWN0IHNlcmllcyBvZiBwYXRjaGVzIGZvciBwb3N0aW5nLCBidXQgdGhlIHdvcmsgaXMKLW5vdCBkb25lIHF1aXRlIHlldC4gIEVhY2ggcGF0Y2ggbmVlZHMgdG8gYmUgZm9ybWF0dGVkIGludG8gYSBtZXNzYWdlIHdoaWNoCi1xdWlja2x5IGFuZCBjbGVhcmx5IGNvbW11bmljYXRlcyBpdHMgcHVycG9zZSB0byB0aGUgcmVzdCBvZiB0aGUgd29ybGQuICBUbwotdGhhdCBlbmQsIGVhY2ggcGF0Y2ggd2lsbCBiZSBjb21wb3NlZCBvZiB0aGUgZm9sbG93aW5nOgotCi0gLSBBbiBvcHRpb25hbCAiRnJvbSIgbGluZSBuYW1pbmcgdGhlIGF1dGhvciBvZiB0aGUgcGF0Y2guICBUaGlzIGxpbmUgaXMKLSAgIG9ubHkgbmVjZXNzYXJ5IGlmIHlvdSBhcmUgcGFzc2luZyBvbiBzb21lYm9keSBlbHNlJ3MgcGF0Y2ggdmlhIGVtYWlsLAotICAgYnV0IGl0IG5ldmVyIGh1cnRzIHRvIGFkZCBpdCB3aGVuIGluIGRvdWJ0LgotCi0gLSBBIG9uZS1saW5lIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhlIHBhdGNoIGRvZXMuICBUaGlzIG1lc3NhZ2Ugc2hvdWxkIGJlCi0gICBlbm91Z2ggZm9yIGEgcmVhZGVyIHdobyBzZWVzIGl0IHdpdGggbm8gb3RoZXIgY29udGV4dCB0byBmaWd1cmUgb3V0IHRoZQotICAgc2NvcGUgb2YgdGhlIHBhdGNoOyBpdCBpcyB0aGUgbGluZSB0aGF0IHdpbGwgc2hvdyB1cCBpbiB0aGUgInNob3J0IGZvcm0iCi0gICBjaGFuZ2Vsb2dzLiAgVGhpcyBtZXNzYWdlIGlzIHVzdWFsbHkgZm9ybWF0dGVkIHdpdGggdGhlIHJlbGV2YW50Ci0gICBzdWJzeXN0ZW0gbmFtZSBmaXJzdCwgZm9sbG93ZWQgYnkgdGhlIHB1cnBvc2Ugb2YgdGhlIHBhdGNoLiAgRm9yCi0gICBleGFtcGxlOgotCi0JZ3BpbzogZml4IGJ1aWxkIG9uIENPTkZJR19HUElPX1NZU0ZTPW4KLQotIC0gQSBibGFuayBsaW5lIGZvbGxvd2VkIGJ5IGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIGNvbnRlbnRzIG9mIHRoZQotICAgcGF0Y2guICBUaGlzIGRlc2NyaXB0aW9uIGNhbiBiZSBhcyBsb25nIGFzIGlzIHJlcXVpcmVkOyBpdCBzaG91bGQgc2F5Ci0gICB3aGF0IHRoZSBwYXRjaCBkb2VzIGFuZCB3aHkgaXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIGtlcm5lbC4KLQotIC0gT25lIG9yIG1vcmUgdGFnIGxpbmVzLCB3aXRoLCBhdCBhIG1pbmltdW0sIG9uZSBTaWduZWQtb2ZmLWJ5OiBsaW5lIGZyb20KLSAgIHRoZSBhdXRob3Igb2YgdGhlIHBhdGNoLiAgVGFncyB3aWxsIGJlIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBiZWxvdy4KLQotVGhlIGl0ZW1zIGFib3ZlLCB0b2dldGhlciwgZm9ybSB0aGUgY2hhbmdlbG9nIGZvciB0aGUgcGF0Y2guICBXcml0aW5nIGdvb2QKLWNoYW5nZWxvZ3MgaXMgYSBjcnVjaWFsIGJ1dCBvZnRlbi1uZWdsZWN0ZWQgYXJ0OyBpdCdzIHdvcnRoIHNwZW5kaW5nCi1hbm90aGVyIG1vbWVudCBkaXNjdXNzaW5nIHRoaXMgaXNzdWUuICBXaGVuIHdyaXRpbmcgYSBjaGFuZ2Vsb2csIHlvdSBzaG91bGQKLWJlYXIgaW4gbWluZCB0aGF0IGEgbnVtYmVyIG9mIGRpZmZlcmVudCBwZW9wbGUgd2lsbCBiZSByZWFkaW5nIHlvdXIgd29yZHMuCi1UaGVzZSBpbmNsdWRlIHN1YnN5c3RlbSBtYWludGFpbmVycyBhbmQgcmV2aWV3ZXJzIHdobyBuZWVkIHRvIGRlY2lkZQotd2hldGhlciB0aGUgcGF0Y2ggc2hvdWxkIGJlIGluY2x1ZGVkLCBkaXN0cmlidXRvcnMgYW5kIG90aGVyIG1haW50YWluZXJzCi10cnlpbmcgdG8gZGVjaWRlIHdoZXRoZXIgYSBwYXRjaCBzaG91bGQgYmUgYmFja3BvcnRlZCB0byBvdGhlciBrZXJuZWxzLCBidWcKLWh1bnRlcnMgd29uZGVyaW5nIHdoZXRoZXIgdGhlIHBhdGNoIGlzIHJlc3BvbnNpYmxlIGZvciBhIHByb2JsZW0gdGhleSBhcmUKLWNoYXNpbmcsIHVzZXJzIHdobyB3YW50IHRvIGtub3cgaG93IHRoZSBrZXJuZWwgaGFzIGNoYW5nZWQsIGFuZCBtb3JlLiAgQQotZ29vZCBjaGFuZ2Vsb2cgY29udmV5cyB0aGUgbmVlZGVkIGluZm9ybWF0aW9uIHRvIGFsbCBvZiB0aGVzZSBwZW9wbGUgaW4gdGhlCi1tb3N0IGRpcmVjdCBhbmQgY29uY2lzZSB3YXkgcG9zc2libGUuCi0KLVRvIHRoYXQgZW5kLCB0aGUgc3VtbWFyeSBsaW5lIHNob3VsZCBkZXNjcmliZSB0aGUgZWZmZWN0cyBvZiBhbmQgbW90aXZhdGlvbgotZm9yIHRoZSBjaGFuZ2UgYXMgd2VsbCBhcyBwb3NzaWJsZSBnaXZlbiB0aGUgb25lLWxpbmUgY29uc3RyYWludC4gIFRoZQotZGV0YWlsZWQgZGVzY3JpcHRpb24gY2FuIHRoZW4gYW1wbGlmeSBvbiB0aG9zZSB0b3BpY3MgYW5kIHByb3ZpZGUgYW55Ci1uZWVkZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4gIElmIHRoZSBwYXRjaCBmaXhlcyBhIGJ1ZywgY2l0ZSB0aGUgY29tbWl0Ci13aGljaCBpbnRyb2R1Y2VkIHRoZSBidWcgaWYgcG9zc2libGUgKGFuZCBwbGVhc2UgcHJvdmlkZSBib3RoIHRoZSBjb21taXQgSUQKLWFuZCB0aGUgdGl0bGUgd2hlbiBjaXRpbmcgY29tbWl0cykuICBJZiBhIHByb2JsZW0gaXMgYXNzb2NpYXRlZCB3aXRoCi1zcGVjaWZpYyBsb2cgb3IgY29tcGlsZXIgb3V0cHV0LCBpbmNsdWRlIHRoYXQgb3V0cHV0IHRvIGhlbHAgb3RoZXJzCi1zZWFyY2hpbmcgZm9yIGEgc29sdXRpb24gdG8gdGhlIHNhbWUgcHJvYmxlbS4gIElmIHRoZSBjaGFuZ2UgaXMgbWVhbnQgdG8KLXN1cHBvcnQgb3RoZXIgY2hhbmdlcyBjb21pbmcgaW4gbGF0ZXIgcGF0Y2gsIHNheSBzby4gIElmIGludGVybmFsIEFQSXMgYXJlCi1jaGFuZ2VkLCBkZXRhaWwgdGhvc2UgY2hhbmdlcyBhbmQgaG93IG90aGVyIGRldmVsb3BlcnMgc2hvdWxkIHJlc3BvbmQuICBJbgotZ2VuZXJhbCwgdGhlIG1vcmUgeW91IGNhbiBwdXQgeW91cnNlbGYgaW50byB0aGUgc2hvZXMgb2YgZXZlcnlib2R5IHdobyB3aWxsCi1iZSByZWFkaW5nIHlvdXIgY2hhbmdlbG9nLCB0aGUgYmV0dGVyIHRoYXQgY2hhbmdlbG9nIChhbmQgdGhlIGtlcm5lbCBhcyBhCi13aG9sZSkgd2lsbCBiZS4KLQotTmVlZGxlc3MgdG8gc2F5LCB0aGUgY2hhbmdlbG9nIHNob3VsZCBiZSB0aGUgdGV4dCB1c2VkIHdoZW4gY29tbWl0dGluZyB0aGUKLWNoYW5nZSB0byBhIHJldmlzaW9uIGNvbnRyb2wgc3lzdGVtLiAgSXQgd2lsbCBiZSBmb2xsb3dlZCBieToKLQotIC0gVGhlIHBhdGNoIGl0c2VsZiwgaW4gdGhlIHVuaWZpZWQgKCItdSIpIHBhdGNoIGZvcm1hdC4gIFVzaW5nIHRoZSAiLXAiCi0gICBvcHRpb24gdG8gZGlmZiB3aWxsIGFzc29jaWF0ZSBmdW5jdGlvbiBuYW1lcyB3aXRoIGNoYW5nZXMsIG1ha2luZyB0aGUKLSAgIHJlc3VsdGluZyBwYXRjaCBlYXNpZXIgZm9yIG90aGVycyB0byByZWFkLgotCi1Zb3Ugc2hvdWxkIGF2b2lkIGluY2x1ZGluZyBjaGFuZ2VzIHRvIGlycmVsZXZhbnQgZmlsZXMgKHRob3NlIGdlbmVyYXRlZCBieQotdGhlIGJ1aWxkIHByb2Nlc3MsIGZvciBleGFtcGxlLCBvciBlZGl0b3IgYmFja3VwIGZpbGVzKSBpbiB0aGUgcGF0Y2guICBUaGUKLWZpbGUgImRvbnRkaWZmIiBpbiB0aGUgRG9jdW1lbnRhdGlvbiBkaXJlY3RvcnkgY2FuIGhlbHAgaW4gdGhpcyByZWdhcmQ7Ci1wYXNzIGl0IHRvIGRpZmYgd2l0aCB0aGUgIi1YIiBvcHRpb24uCi0KLVRoZSB0YWdzIG1lbnRpb25lZCBhYm92ZSBhcmUgdXNlZCB0byBkZXNjcmliZSBob3cgdmFyaW91cyBkZXZlbG9wZXJzIGhhdmUKLWJlZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXZlbG9wbWVudCBvZiB0aGlzIHBhdGNoLiAgVGhleSBhcmUgZGVzY3JpYmVkIGluCi1kZXRhaWwgaW4gdGhlIFN1Ym1pdHRpbmdQYXRjaGVzIGRvY3VtZW50OyB3aGF0IGZvbGxvd3MgaGVyZSBpcyBhIGJyaWVmCi1zdW1tYXJ5LiAgRWFjaCBvZiB0aGVzZSBsaW5lcyBoYXMgdGhlIGZvcm1hdDoKLQotCXRhZzogRnVsbCBOYW1lIDxlbWFpbCBhZGRyZXNzPiAgb3B0aW9uYWwtb3RoZXItc3R1ZmYKLQotVGhlIHRhZ3MgaW4gY29tbW9uIHVzZSBhcmU6Ci0KLSAtIFNpZ25lZC1vZmYtYnk6IHRoaXMgaXMgYSBkZXZlbG9wZXIncyBjZXJ0aWZpY2F0aW9uIHRoYXQgaGUgb3Igc2hlIGhhcwotICAgdGhlIHJpZ2h0IHRvIHN1Ym1pdCB0aGUgcGF0Y2ggZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBrZXJuZWwuICBJdCBpcyBhbgotICAgYWdyZWVtZW50IHRvIHRoZSBEZXZlbG9wZXIncyBDZXJ0aWZpY2F0ZSBvZiBPcmlnaW4sIHRoZSBmdWxsIHRleHQgb2YKLSAgIHdoaWNoIGNhbiBiZSBmb3VuZCBpbiBEb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzLiAgQ29kZSB3aXRob3V0IGEKLSAgIHByb3BlciBzaWdub2ZmIGNhbm5vdCBiZSBtZXJnZWQgaW50byB0aGUgbWFpbmxpbmUuCi0KLSAtIEFja2VkLWJ5OiBpbmRpY2F0ZXMgYW4gYWdyZWVtZW50IGJ5IGFub3RoZXIgZGV2ZWxvcGVyIChvZnRlbiBhCi0gICBtYWludGFpbmVyIG9mIHRoZSByZWxldmFudCBjb2RlKSB0aGF0IHRoZSBwYXRjaCBpcyBhcHByb3ByaWF0ZSBmb3IKLSAgIGluY2x1c2lvbiBpbnRvIHRoZSBrZXJuZWwuCi0KLSAtIFRlc3RlZC1ieTogc3RhdGVzIHRoYXQgdGhlIG5hbWVkIHBlcnNvbiBoYXMgdGVzdGVkIHRoZSBwYXRjaCBhbmQgZm91bmQKLSAgIGl0IHRvIHdvcmsuCi0KLSAtIFJldmlld2VkLWJ5OiB0aGUgbmFtZWQgZGV2ZWxvcGVyIGhhcyByZXZpZXdlZCB0aGUgcGF0Y2ggZm9yIGNvcnJlY3RuZXNzOwotICAgc2VlIHRoZSByZXZpZXdlcidzIHN0YXRlbWVudCBpbiBEb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzIGZvciBtb3JlCi0gICBkZXRhaWwuCi0KLSAtIFJlcG9ydGVkLWJ5OiBuYW1lcyBhIHVzZXIgd2hvIHJlcG9ydGVkIGEgcHJvYmxlbSB3aGljaCBpcyBmaXhlZCBieSB0aGlzCi0gICBwYXRjaDsgdGhpcyB0YWcgaXMgdXNlZCB0byBnaXZlIGNyZWRpdCB0byB0aGUgKG9mdGVuIHVuZGVyYXBwcmVjaWF0ZWQpCi0gICBwZW9wbGUgd2hvIHRlc3Qgb3VyIGNvZGUgYW5kIGxldCB1cyBrbm93IHdoZW4gdGhpbmdzIGRvIG5vdCB3b3JrCi0gICBjb3JyZWN0bHkuCi0KLSAtIENjOiB0aGUgbmFtZWQgcGVyc29uIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgcGF0Y2ggYW5kIGhhZCB0aGUKLSAgIG9wcG9ydHVuaXR5IHRvIGNvbW1lbnQgb24gaXQuCi0KLUJlIGNhcmVmdWwgaW4gdGhlIGFkZGl0aW9uIG9mIHRhZ3MgdG8geW91ciBwYXRjaGVzOiBvbmx5IENjOiBpcyBhcHByb3ByaWF0ZQotZm9yIGFkZGl0aW9uIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHBlcm1pc3Npb24gb2YgdGhlIHBlcnNvbiBuYW1lZC4KLQotCi01LjU6IFNFTkRJTkcgVEhFIFBBVENICi0KLUJlZm9yZSB5b3UgbWFpbCB5b3VyIHBhdGNoZXMsIHRoZXJlIGFyZSBhIGNvdXBsZSBvZiBvdGhlciB0aGluZ3MgeW91IHNob3VsZAotdGFrZSBjYXJlIG9mOgotCi0gLSBBcmUgeW91IHN1cmUgdGhhdCB5b3VyIG1haWxlciB3aWxsIG5vdCBjb3JydXB0IHRoZSBwYXRjaGVzPyAgUGF0Y2hlcwotICAgd2hpY2ggaGF2ZSBoYWQgZ3JhdHVpdG91cyB3aGl0ZS1zcGFjZSBjaGFuZ2VzIG9yIGxpbmUgd3JhcHBpbmcgcGVyZm9ybWVkCi0gICBieSB0aGUgbWFpbCBjbGllbnQgd2lsbCBub3QgYXBwbHkgYXQgdGhlIG90aGVyIGVuZCwgYW5kIG9mdGVuIHdpbGwgbm90Ci0gICBiZSBleGFtaW5lZCBpbiBhbnkgZGV0YWlsLiAgSWYgdGhlcmUgaXMgYW55IGRvdWJ0IGF0IGFsbCwgbWFpbCB0aGUgcGF0Y2gKLSAgIHRvIHlvdXJzZWxmIGFuZCBjb252aW5jZSB5b3Vyc2VsZiB0aGF0IGl0IHNob3dzIHVwIGludGFjdC4KLQotICAgRG9jdW1lbnRhdGlvbi9lbWFpbC1jbGllbnRzLnR4dCBoYXMgc29tZSBoZWxwZnVsIGhpbnRzIG9uIG1ha2luZwotICAgc3BlY2lmaWMgbWFpbCBjbGllbnRzIHdvcmsgZm9yIHNlbmRpbmcgcGF0Y2hlcy4KLQotIC0gQXJlIHlvdSBzdXJlIHlvdXIgcGF0Y2ggaXMgZnJlZSBvZiBzaWxseSBtaXN0YWtlcz8gIFlvdSBzaG91bGQgYWx3YXlzCi0gICBydW4gcGF0Y2hlcyB0aHJvdWdoIHNjcmlwdHMvY2hlY2twYXRjaC5wbCBhbmQgYWRkcmVzcyB0aGUgY29tcGxhaW50cyBpdAotICAgY29tZXMgdXAgd2l0aC4gIFBsZWFzZSBiZWFyIGluIG1pbmQgdGhhdCBjaGVja3BhdGNoLnBsLCB3aGlsZSBiZWluZyB0aGUKLSAgIGVtYm9kaW1lbnQgb2YgYSBmYWlyIGFtb3VudCBvZiB0aG91Z2h0IGFib3V0IHdoYXQga2VybmVsIHBhdGNoZXMgc2hvdWxkCi0gICBsb29rIGxpa2UsIGlzIG5vdCBzbWFydGVyIHRoYW4geW91LiAgSWYgZml4aW5nIGEgY2hlY2twYXRjaC5wbCBjb21wbGFpbnQKLSAgIHdvdWxkIG1ha2UgdGhlIGNvZGUgd29yc2UsIGRvbid0IGRvIGl0LgotCi1QYXRjaGVzIHNob3VsZCBhbHdheXMgYmUgc2VudCBhcyBwbGFpbiB0ZXh0LiAgUGxlYXNlIGRvIG5vdCBzZW5kIHRoZW0gYXMKLWF0dGFjaG1lbnRzOyB0aGF0IG1ha2VzIGl0IG11Y2ggaGFyZGVyIGZvciByZXZpZXdlcnMgdG8gcXVvdGUgc2VjdGlvbnMgb2YKLXRoZSBwYXRjaCBpbiB0aGVpciByZXBsaWVzLiAgSW5zdGVhZCwganVzdCBwdXQgdGhlIHBhdGNoIGRpcmVjdGx5IGludG8geW91cgotbWVzc2FnZS4KLQotV2hlbiBtYWlsaW5nIHBhdGNoZXMsIGl0IGlzIGltcG9ydGFudCB0byBzZW5kIGNvcGllcyB0byBhbnlib2R5IHdobyBtaWdodAotYmUgaW50ZXJlc3RlZCBpbiBpdC4gIFVubGlrZSBzb21lIG90aGVyIHByb2plY3RzLCB0aGUga2VybmVsIGVuY291cmFnZXMKLXBlb3BsZSB0byBlcnIgb24gdGhlIHNpZGUgb2Ygc2VuZGluZyB0b28gbWFueSBjb3BpZXM7IGRvbid0IGFzc3VtZSB0aGF0IHRoZQotcmVsZXZhbnQgcGVvcGxlIHdpbGwgc2VlIHlvdXIgcG9zdGluZyBvbiB0aGUgbWFpbGluZyBsaXN0cy4gIEluIHBhcnRpY3VsYXIsCi1jb3BpZXMgc2hvdWxkIGdvIHRvOgotCi0gLSBUaGUgbWFpbnRhaW5lcihzKSBvZiB0aGUgYWZmZWN0ZWQgc3Vic3lzdGVtKHMpLiAgQXMgZGVzY3JpYmVkIGVhcmxpZXIsCi0gICB0aGUgTUFJTlRBSU5FUlMgZmlsZSBpcyB0aGUgZmlyc3QgcGxhY2UgdG8gbG9vayBmb3IgdGhlc2UgcGVvcGxlLgotCi0gLSBPdGhlciBkZXZlbG9wZXJzIHdobyBoYXZlIGJlZW4gd29ya2luZyBpbiB0aGUgc2FtZSBhcmVhIC0gZXNwZWNpYWxseQotICAgdGhvc2Ugd2hvIG1pZ2h0IGJlIHdvcmtpbmcgdGhlcmUgbm93LiAgVXNpbmcgZ2l0IHRvIHNlZSB3aG8gZWxzZSBoYXMKLSAgIG1vZGlmaWVkIHRoZSBmaWxlcyB5b3UgYXJlIHdvcmtpbmcgb24gY2FuIGJlIGhlbHBmdWwuCi0KLSAtIElmIHlvdSBhcmUgcmVzcG9uZGluZyB0byBhIGJ1ZyByZXBvcnQgb3IgYSBmZWF0dXJlIHJlcXVlc3QsIGNvcHkgdGhlCi0gICBvcmlnaW5hbCBwb3N0ZXIgYXMgd2VsbC4KLQotIC0gU2VuZCBhIGNvcHkgdG8gdGhlIHJlbGV2YW50IG1haWxpbmcgbGlzdCwgb3IsIGlmIG5vdGhpbmcgZWxzZSBhcHBsaWVzLAotICAgdGhlIGxpbnV4LWtlcm5lbCBsaXN0LgotCi0gLSBJZiB5b3UgYXJlIGZpeGluZyBhIGJ1ZywgdGhpbmsgYWJvdXQgd2hldGhlciB0aGUgZml4IHNob3VsZCBnbyBpbnRvIHRoZQotICAgbmV4dCBzdGFibGUgdXBkYXRlLiAgSWYgc28sIHN0YWJsZUB2Z2VyLmtlcm5lbC5vcmcgc2hvdWxkIGdldCBhIGNvcHkgb2YKLSAgIHRoZSBwYXRjaC4gIEFsc28gYWRkIGEgIkNjOiBzdGFibGVAdmdlci5rZXJuZWwub3JnIiB0byB0aGUgdGFncyB3aXRoaW4KLSAgIHRoZSBwYXRjaCBpdHNlbGY7IHRoYXQgd2lsbCBjYXVzZSB0aGUgc3RhYmxlIHRlYW0gdG8gZ2V0IGEgbm90aWZpY2F0aW9uCi0gICB3aGVuIHlvdXIgZml4IGdvZXMgaW50byB0aGUgbWFpbmxpbmUuCi0KLVdoZW4gc2VsZWN0aW5nIHJlY2lwaWVudHMgZm9yIGEgcGF0Y2gsIGl0IGlzIGdvb2QgdG8gaGF2ZSBhbiBpZGVhIG9mIHdobwoteW91IHRoaW5rIHdpbGwgZXZlbnR1YWxseSBhY2NlcHQgdGhlIHBhdGNoIGFuZCBnZXQgaXQgbWVyZ2VkLiAgV2hpbGUgaXQKLWlzIHBvc3NpYmxlIHRvIHNlbmQgcGF0Y2hlcyBkaXJlY3RseSB0byBMaW51cyBUb3J2YWxkcyBhbmQgaGF2ZSBoaW0gbWVyZ2UKLXRoZW0sIHRoaW5ncyBhcmUgbm90IG5vcm1hbGx5IGRvbmUgdGhhdCB3YXkuICBMaW51cyBpcyBidXN5LCBhbmQgdGhlcmUgYXJlCi1zdWJzeXN0ZW0gbWFpbnRhaW5lcnMgd2hvIHdhdGNoIG92ZXIgc3BlY2lmaWMgcGFydHMgb2YgdGhlIGtlcm5lbC4gIFVzdWFsbHkKLXlvdSB3aWxsIGJlIHdhbnRpbmcgdGhhdCBtYWludGFpbmVyIHRvIG1lcmdlIHlvdXIgcGF0Y2hlcy4gIElmIHRoZXJlIGlzIG5vCi1vYnZpb3VzIG1haW50YWluZXIsIEFuZHJldyBNb3J0b24gaXMgb2Z0ZW4gdGhlIHBhdGNoIHRhcmdldCBvZiBsYXN0IHJlc29ydC4KLQotUGF0Y2hlcyBuZWVkIGdvb2Qgc3ViamVjdCBsaW5lcy4gIFRoZSBjYW5vbmljYWwgZm9ybWF0IGZvciBhIHBhdGNoIGxpbmUgaXMKLXNvbWV0aGluZyBsaWtlOgotCi0JW1BBVENIIG5uL21tXSBzdWJzeXM6IG9uZS1saW5lIGRlc2NyaXB0aW9uIG9mIHRoZSBwYXRjaAotCi13aGVyZSAibm4iIGlzIHRoZSBvcmRpbmFsIG51bWJlciBvZiB0aGUgcGF0Y2gsICJtbSIgaXMgdGhlIHRvdGFsIG51bWJlciBvZgotcGF0Y2hlcyBpbiB0aGUgc2VyaWVzLCBhbmQgInN1YnN5cyIgaXMgdGhlIG5hbWUgb2YgdGhlIGFmZmVjdGVkIHN1YnN5c3RlbS4KLUNsZWFybHksIG5uL21tIGNhbiBiZSBvbWl0dGVkIGZvciBhIHNpbmdsZSwgc3RhbmRhbG9uZSBwYXRjaC4KLQotSWYgeW91IGhhdmUgYSBzaWduaWZpY2FudCBzZXJpZXMgb2YgcGF0Y2hlcywgaXQgaXMgY3VzdG9tYXJ5IHRvIHNlbmQgYW4KLWludHJvZHVjdG9yeSBkZXNjcmlwdGlvbiBhcyBwYXJ0IHplcm8uICBUaGlzIGNvbnZlbnRpb24gaXMgbm90IHVuaXZlcnNhbGx5Ci1mb2xsb3dlZCB0aG91Z2g7IGlmIHlvdSB1c2UgaXQsIHJlbWVtYmVyIHRoYXQgaW5mb3JtYXRpb24gaW4gdGhlCi1pbnRyb2R1Y3Rpb24gZG9lcyBub3QgbWFrZSBpdCBpbnRvIHRoZSBrZXJuZWwgY2hhbmdlbG9ncy4gIFNvIHBsZWFzZSBlbnN1cmUKLXRoYXQgdGhlIHBhdGNoZXMsIHRoZW1zZWx2ZXMsIGhhdmUgY29tcGxldGUgY2hhbmdlbG9nIGluZm9ybWF0aW9uLgotCi1JbiBnZW5lcmFsLCB0aGUgc2Vjb25kIGFuZCBmb2xsb3dpbmcgcGFydHMgb2YgYSBtdWx0aS1wYXJ0IHBhdGNoIHNob3VsZCBiZQotc2VudCBhcyBhIHJlcGx5IHRvIHRoZSBmaXJzdCBwYXJ0IHNvIHRoYXQgdGhleSBhbGwgdGhyZWFkIHRvZ2V0aGVyIGF0IHRoZQotcmVjZWl2aW5nIGVuZC4gIFRvb2xzIGxpa2UgZ2l0IGFuZCBxdWlsdCBoYXZlIGNvbW1hbmRzIHRvIG1haWwgb3V0IGEgc2V0IG9mCi1wYXRjaGVzIHdpdGggdGhlIHByb3BlciB0aHJlYWRpbmcuICBJZiB5b3UgaGF2ZSBhIGxvbmcgc2VyaWVzLCB0aG91Z2gsIGFuZAotYXJlIHVzaW5nIGdpdCwgcGxlYXNlIHN0YXkgYXdheSBmcm9tIHRoZSAtLWNoYWluLXJlcGx5LXRvIG9wdGlvbiB0byBhdm9pZAotY3JlYXRpbmcgZXhjZXB0aW9uYWxseSBkZWVwIG5lc3RpbmcuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNS5Qb3N0aW5nLnJzdCBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy81LlBvc3RpbmcucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MTFkZGYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNS5Qb3N0aW5nLnJzdApAQCAtMCwwICsxLDMyMSBAQAorLi4gX2RldmVsb3BtZW50X3Bvc3Rpbmc6CisKK1Bvc3RpbmcgcGF0Y2hlcworPT09PT09PT09PT09PT09CisKK1Nvb25lciBvciBsYXRlciwgdGhlIHRpbWUgY29tZXMgd2hlbiB5b3VyIHdvcmsgaXMgcmVhZHkgdG8gYmUgcHJlc2VudGVkIHRvCit0aGUgY29tbXVuaXR5IGZvciByZXZpZXcgYW5kLCBldmVudHVhbGx5LCBpbmNsdXNpb24gaW50byB0aGUgbWFpbmxpbmUKK2tlcm5lbC4gIFVuc3VycHJpc2luZ2x5LCB0aGUga2VybmVsIGRldmVsb3BtZW50IGNvbW11bml0eSBoYXMgZXZvbHZlZCBhIHNldAorb2YgY29udmVudGlvbnMgYW5kIHByb2NlZHVyZXMgd2hpY2ggYXJlIHVzZWQgaW4gdGhlIHBvc3Rpbmcgb2YgcGF0Y2hlczsKK2ZvbGxvd2luZyB0aGVtIHdpbGwgbWFrZSBsaWZlIG11Y2ggZWFzaWVyIGZvciBldmVyeWJvZHkgaW52b2x2ZWQuICBUaGlzCitkb2N1bWVudCB3aWxsIGF0dGVtcHQgdG8gY292ZXIgdGhlc2UgZXhwZWN0YXRpb25zIGluIHJlYXNvbmFibGUgZGV0YWlsOworbW9yZSBpbmZvcm1hdGlvbiBjYW4gYWxzbyBiZSBmb3VuZCBpbiB0aGUgZmlsZXMgU3VibWl0dGluZ1BhdGNoZXMsCitTdWJtaXR0aW5nRHJpdmVycywgYW5kIFN1Ym1pdENoZWNrbGlzdCBpbiB0aGUga2VybmVsIGRvY3VtZW50YXRpb24KK2RpcmVjdG9yeS4KKworCitXaGVuIHRvIHBvc3QKKy0tLS0tLS0tLS0tLQorCitUaGVyZSBpcyBhIGNvbnN0YW50IHRlbXB0YXRpb24gdG8gYXZvaWQgcG9zdGluZyBwYXRjaGVzIGJlZm9yZSB0aGV5IGFyZQorY29tcGxldGVseSAicmVhZHkuIiAgRm9yIHNpbXBsZSBwYXRjaGVzLCB0aGF0IGlzIG5vdCBhIHByb2JsZW0uICBJZiB0aGUKK3dvcmsgYmVpbmcgZG9uZSBpcyBjb21wbGV4LCB0aG91Z2gsIHRoZXJlIGlzIGEgbG90IHRvIGJlIGdhaW5lZCBieSBnZXR0aW5nCitmZWVkYmFjayBmcm9tIHRoZSBjb21tdW5pdHkgYmVmb3JlIHRoZSB3b3JrIGlzIGNvbXBsZXRlLiAgU28geW91IHNob3VsZAorY29uc2lkZXIgcG9zdGluZyBpbi1wcm9ncmVzcyB3b3JrLCBvciBldmVuIG1ha2luZyBhIGdpdCB0cmVlIGF2YWlsYWJsZSBzbwordGhhdCBpbnRlcmVzdGVkIGRldmVsb3BlcnMgY2FuIGNhdGNoIHVwIHdpdGggeW91ciB3b3JrIGF0IGFueSB0aW1lLgorCitXaGVuIHBvc3RpbmcgY29kZSB3aGljaCBpcyBub3QgeWV0IGNvbnNpZGVyZWQgcmVhZHkgZm9yIGluY2x1c2lvbiwgaXQgaXMgYQorZ29vZCBpZGVhIHRvIHNheSBzbyBpbiB0aGUgcG9zdGluZyBpdHNlbGYuICBBbHNvIG1lbnRpb24gYW55IG1ham9yIHdvcmsKK3doaWNoIHJlbWFpbnMgdG8gYmUgZG9uZSBhbmQgYW55IGtub3duIHByb2JsZW1zLiAgRmV3ZXIgcGVvcGxlIHdpbGwgbG9vayBhdAorcGF0Y2hlcyB3aGljaCBhcmUga25vd24gdG8gYmUgaGFsZi1iYWtlZCwgYnV0IHRob3NlIHdobyBkbyB3aWxsIGNvbWUgaW4KK3dpdGggdGhlIGlkZWEgdGhhdCB0aGV5IGNhbiBoZWxwIHlvdSBkcml2ZSB0aGUgd29yayBpbiB0aGUgcmlnaHQgZGlyZWN0aW9uLgorCisKK0JlZm9yZSBjcmVhdGluZyBwYXRjaGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGVyZSBhcmUgYSBudW1iZXIgb2YgdGhpbmdzIHdoaWNoIHNob3VsZCBiZSBkb25lIGJlZm9yZSB5b3UgY29uc2lkZXIKK3NlbmRpbmcgcGF0Y2hlcyB0byB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5LiAgVGhlc2UgaW5jbHVkZToKKworIC0gVGVzdCB0aGUgY29kZSB0byB0aGUgZXh0ZW50IHRoYXQgeW91IGNhbi4gIE1ha2UgdXNlIG9mIHRoZSBrZXJuZWwncworICAgZGVidWdnaW5nIHRvb2xzLCBlbnN1cmUgdGhhdCB0aGUga2VybmVsIHdpbGwgYnVpbGQgd2l0aCBhbGwgcmVhc29uYWJsZQorICAgY29tYmluYXRpb25zIG9mIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgdXNlIGNyb3NzLWNvbXBpbGVycyB0byBidWlsZCBmb3IKKyAgIGRpZmZlcmVudCBhcmNoaXRlY3R1cmVzLCBldGMuCisKKyAtIE1ha2Ugc3VyZSB5b3VyIGNvZGUgaXMgY29tcGxpYW50IHdpdGggdGhlIGtlcm5lbCBjb2Rpbmcgc3R5bGUKKyAgIGd1aWRlbGluZXMuCisKKyAtIERvZXMgeW91ciBjaGFuZ2UgaGF2ZSBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnM/ICBJZiBzbywgeW91IHNob3VsZCBydW4KKyAgIGJlbmNobWFya3Mgc2hvd2luZyB3aGF0IHRoZSBpbXBhY3QgKG9yIGJlbmVmaXQpIG9mIHlvdXIgY2hhbmdlIGlzOyBhCisgICBzdW1tYXJ5IG9mIHRoZSByZXN1bHRzIHNob3VsZCBiZSBpbmNsdWRlZCB3aXRoIHRoZSBwYXRjaC4KKworIC0gQmUgc3VyZSB0aGF0IHlvdSBoYXZlIHRoZSByaWdodCB0byBwb3N0IHRoZSBjb2RlLiAgSWYgdGhpcyB3b3JrIHdhcyBkb25lCisgICBmb3IgYW4gZW1wbG95ZXIsIHRoZSBlbXBsb3llciBsaWtlbHkgaGFzIGEgcmlnaHQgdG8gdGhlIHdvcmsgYW5kIG11c3QgYmUKKyAgIGFncmVlYWJsZSB3aXRoIGl0cyByZWxlYXNlIHVuZGVyIHRoZSBHUEwuCisKK0FzIGEgZ2VuZXJhbCBydWxlLCBwdXR0aW5nIGluIHNvbWUgZXh0cmEgdGhvdWdodCBiZWZvcmUgcG9zdGluZyBjb2RlIGFsbW9zdAorYWx3YXlzIHBheXMgYmFjayB0aGUgZWZmb3J0IGluIHNob3J0IG9yZGVyLgorCisKK1BhdGNoIHByZXBhcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgcHJlcGFyYXRpb24gb2YgcGF0Y2hlcyBmb3IgcG9zdGluZyBjYW4gYmUgYSBzdXJwcmlzaW5nIGFtb3VudCBvZiB3b3JrLAorYnV0LCBvbmNlIGFnYWluLCBhdHRlbXB0aW5nIHRvIHNhdmUgdGltZSBoZXJlIGlzIG5vdCBnZW5lcmFsbHkgYWR2aXNhYmxlCitldmVuIGluIHRoZSBzaG9ydCB0ZXJtLgorCitQYXRjaGVzIG11c3QgYmUgcHJlcGFyZWQgYWdhaW5zdCBhIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIGtlcm5lbC4gIEFzIGEKK2dlbmVyYWwgcnVsZSwgYSBwYXRjaCBzaG91bGQgYmUgYmFzZWQgb24gdGhlIGN1cnJlbnQgbWFpbmxpbmUgYXMgZm91bmQgaW4KK0xpbnVzJ3MgZ2l0IHRyZWUuICBXaGVuIGJhc2luZyBvbiBtYWlubGluZSwgc3RhcnQgd2l0aCBhIHdlbGwta25vd24gcmVsZWFzZQorcG9pbnQgLSBhIHN0YWJsZSBvciAtcmMgcmVsZWFzZSAtIHJhdGhlciB0aGFuIGJyYW5jaGluZyBvZmYgdGhlIG1haW5saW5lIGF0CithbiBhcmJpdHJhcnkgc3BvdC4KKworSXQgbWF5IGJlY29tZSBuZWNlc3NhcnkgdG8gbWFrZSB2ZXJzaW9ucyBhZ2FpbnN0IC1tbSwgbGludXgtbmV4dCwgb3IgYQorc3Vic3lzdGVtIHRyZWUsIHRob3VnaCwgdG8gZmFjaWxpdGF0ZSB3aWRlciB0ZXN0aW5nIGFuZCByZXZpZXcuICBEZXBlbmRpbmcKK29uIHRoZSBhcmVhIG9mIHlvdXIgcGF0Y2ggYW5kIHdoYXQgaXMgZ29pbmcgb24gZWxzZXdoZXJlLCBiYXNpbmcgYSBwYXRjaAorYWdhaW5zdCB0aGVzZSBvdGhlciB0cmVlcyBjYW4gcmVxdWlyZSBhIHNpZ25pZmljYW50IGFtb3VudCBvZiB3b3JrCityZXNvbHZpbmcgY29uZmxpY3RzIGFuZCBkZWFsaW5nIHdpdGggQVBJIGNoYW5nZXMuCisKK09ubHkgdGhlIG1vc3Qgc2ltcGxlIGNoYW5nZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBhIHNpbmdsZSBwYXRjaDsKK2V2ZXJ5dGhpbmcgZWxzZSBzaG91bGQgYmUgbWFkZSBhcyBhIGxvZ2ljYWwgc2VyaWVzIG9mIGNoYW5nZXMuICBTcGxpdHRpbmcKK3VwIHBhdGNoZXMgaXMgYSBiaXQgb2YgYW4gYXJ0OyBzb21lIGRldmVsb3BlcnMgc3BlbmQgYSBsb25nIHRpbWUgZmlndXJpbmcKK291dCBob3cgdG8gZG8gaXQgaW4gdGhlIHdheSB0aGF0IHRoZSBjb21tdW5pdHkgZXhwZWN0cy4gIFRoZXJlIGFyZSBhIGZldworcnVsZXMgb2YgdGh1bWIsIGhvd2V2ZXIsIHdoaWNoIGNhbiBoZWxwIGNvbnNpZGVyYWJseToKKworIC0gVGhlIHBhdGNoIHNlcmllcyB5b3UgcG9zdCB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgbm90IGJlIHRoZSBzZXJpZXMgb2YKKyAgIGNoYW5nZXMgZm91bmQgaW4geW91ciB3b3JraW5nIHJldmlzaW9uIGNvbnRyb2wgc3lzdGVtLiAgSW5zdGVhZCwgdGhlCisgICBjaGFuZ2VzIHlvdSBoYXZlIG1hZGUgbmVlZCB0byBiZSBjb25zaWRlcmVkIGluIHRoZWlyIGZpbmFsIGZvcm0sIHRoZW4KKyAgIHNwbGl0IGFwYXJ0IGluIHdheXMgd2hpY2ggbWFrZSBzZW5zZS4gIFRoZSBkZXZlbG9wZXJzIGFyZSBpbnRlcmVzdGVkIGluCisgICBkaXNjcmV0ZSwgc2VsZi1jb250YWluZWQgY2hhbmdlcywgbm90IHRoZSBwYXRoIHlvdSB0b29rIHRvIGdldCB0byB0aG9zZQorICAgY2hhbmdlcy4KKworIC0gRWFjaCBsb2dpY2FsbHkgaW5kZXBlbmRlbnQgY2hhbmdlIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgYSBzZXBhcmF0ZQorICAgcGF0Y2guICBUaGVzZSBjaGFuZ2VzIGNhbiBiZSBzbWFsbCAoImFkZCBhIGZpZWxkIHRvIHRoaXMgc3RydWN0dXJlIikgb3IKKyAgIGxhcmdlIChhZGRpbmcgYSBzaWduaWZpY2FudCBuZXcgZHJpdmVyLCBmb3IgZXhhbXBsZSksIGJ1dCB0aGV5IHNob3VsZCBiZQorICAgY29uY2VwdHVhbGx5IHNtYWxsIGFuZCBhbWVuYWJsZSB0byBhIG9uZS1saW5lIGRlc2NyaXB0aW9uLiAgRWFjaCBwYXRjaAorICAgc2hvdWxkIG1ha2UgYSBzcGVjaWZpYyBjaGFuZ2Ugd2hpY2ggY2FuIGJlIHJldmlld2VkIG9uIGl0cyBvd24gYW5kCisgICB2ZXJpZmllZCB0byBkbyB3aGF0IGl0IHNheXMgaXQgZG9lcy4KKworIC0gQXMgYSB3YXkgb2YgcmVzdGF0aW5nIHRoZSBndWlkZWxpbmUgYWJvdmU6IGRvIG5vdCBtaXggZGlmZmVyZW50IHR5cGVzIG9mCisgICBjaGFuZ2VzIGluIHRoZSBzYW1lIHBhdGNoLiAgSWYgYSBzaW5nbGUgcGF0Y2ggZml4ZXMgYSBjcml0aWNhbCBzZWN1cml0eQorICAgYnVnLCByZWFycmFuZ2VzIGEgZmV3IHN0cnVjdHVyZXMsIGFuZCByZWZvcm1hdHMgdGhlIGNvZGUsIHRoZXJlIGlzIGEKKyAgIGdvb2QgY2hhbmNlIHRoYXQgaXQgd2lsbCBiZSBwYXNzZWQgb3ZlciBhbmQgdGhlIGltcG9ydGFudCBmaXggd2lsbCBiZQorICAgbG9zdC4KKworIC0gRWFjaCBwYXRjaCBzaG91bGQgeWllbGQgYSBrZXJuZWwgd2hpY2ggYnVpbGRzIGFuZCBydW5zIHByb3Blcmx5OyBpZiB5b3VyCisgICBwYXRjaCBzZXJpZXMgaXMgaW50ZXJydXB0ZWQgaW4gdGhlIG1pZGRsZSwgdGhlIHJlc3VsdCBzaG91bGQgc3RpbGwgYmUgYQorICAgd29ya2luZyBrZXJuZWwuICBQYXJ0aWFsIGFwcGxpY2F0aW9uIG9mIGEgcGF0Y2ggc2VyaWVzIGlzIGEgY29tbW9uCisgICBzY2VuYXJpbyB3aGVuIHRoZSAiZ2l0IGJpc2VjdCIgdG9vbCBpcyB1c2VkIHRvIGZpbmQgcmVncmVzc2lvbnM7IGlmIHRoZQorICAgcmVzdWx0IGlzIGEgYnJva2VuIGtlcm5lbCwgeW91IHdpbGwgbWFrZSBsaWZlIGhhcmRlciBmb3IgZGV2ZWxvcGVycyBhbmQKKyAgIHVzZXJzIHdobyBhcmUgZW5nYWdpbmcgaW4gdGhlIG5vYmxlIHdvcmsgb2YgdHJhY2tpbmcgZG93biBwcm9ibGVtcy4KKworIC0gRG8gbm90IG92ZXJkbyBpdCwgdGhvdWdoLiAgT25lIGRldmVsb3BlciBvbmNlIHBvc3RlZCBhIHNldCBvZiBlZGl0cworICAgdG8gYSBzaW5nbGUgZmlsZSBhcyA1MDAgc2VwYXJhdGUgcGF0Y2hlcyAtIGFuIGFjdCB3aGljaCBkaWQgbm90IG1ha2UgaGltCisgICB0aGUgbW9zdCBwb3B1bGFyIHBlcnNvbiBvbiB0aGUga2VybmVsIG1haWxpbmcgbGlzdC4gIEEgc2luZ2xlIHBhdGNoIGNhbgorICAgYmUgcmVhc29uYWJseSBsYXJnZSBhcyBsb25nIGFzIGl0IHN0aWxsIGNvbnRhaW5zIGEgc2luZ2xlICpsb2dpY2FsKgorICAgY2hhbmdlLgorCisgLSBJdCBjYW4gYmUgdGVtcHRpbmcgdG8gYWRkIGEgd2hvbGUgbmV3IGluZnJhc3RydWN0dXJlIHdpdGggYSBzZXJpZXMgb2YKKyAgIHBhdGNoZXMsIGJ1dCB0byBsZWF2ZSB0aGF0IGluZnJhc3RydWN0dXJlIHVudXNlZCB1bnRpbCB0aGUgZmluYWwgcGF0Y2gKKyAgIGluIHRoZSBzZXJpZXMgZW5hYmxlcyB0aGUgd2hvbGUgdGhpbmcuICBUaGlzIHRlbXB0YXRpb24gc2hvdWxkIGJlCisgICBhdm9pZGVkIGlmIHBvc3NpYmxlOyBpZiB0aGF0IHNlcmllcyBhZGRzIHJlZ3Jlc3Npb25zLCBiaXNlY3Rpb24gd2lsbAorICAgZmluZ2VyIHRoZSBsYXN0IHBhdGNoIGFzIHRoZSBvbmUgd2hpY2ggY2F1c2VkIHRoZSBwcm9ibGVtLCBldmVuIHRob3VnaAorICAgdGhlIHJlYWwgYnVnIGlzIGVsc2V3aGVyZS4gIFdoZW5ldmVyIHBvc3NpYmxlLCBhIHBhdGNoIHdoaWNoIGFkZHMgbmV3CisgICBjb2RlIHNob3VsZCBtYWtlIHRoYXQgY29kZSBhY3RpdmUgaW1tZWRpYXRlbHkuCisKK1dvcmtpbmcgdG8gY3JlYXRlIHRoZSBwZXJmZWN0IHBhdGNoIHNlcmllcyBjYW4gYmUgYSBmcnVzdHJhdGluZyBwcm9jZXNzCit3aGljaCB0YWtlcyBxdWl0ZSBhIGJpdCBvZiB0aW1lIGFuZCB0aG91Z2h0IGFmdGVyIHRoZSAicmVhbCB3b3JrIiBoYXMgYmVlbgorZG9uZS4gIFdoZW4gZG9uZSBwcm9wZXJseSwgdGhvdWdoLCBpdCBpcyB0aW1lIHdlbGwgc3BlbnQuCisKKworUGF0Y2ggZm9ybWF0dGluZyBhbmQgY2hhbmdlbG9ncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTbyBub3cgeW91IGhhdmUgYSBwZXJmZWN0IHNlcmllcyBvZiBwYXRjaGVzIGZvciBwb3N0aW5nLCBidXQgdGhlIHdvcmsgaXMKK25vdCBkb25lIHF1aXRlIHlldC4gIEVhY2ggcGF0Y2ggbmVlZHMgdG8gYmUgZm9ybWF0dGVkIGludG8gYSBtZXNzYWdlIHdoaWNoCitxdWlja2x5IGFuZCBjbGVhcmx5IGNvbW11bmljYXRlcyBpdHMgcHVycG9zZSB0byB0aGUgcmVzdCBvZiB0aGUgd29ybGQuICBUbwordGhhdCBlbmQsIGVhY2ggcGF0Y2ggd2lsbCBiZSBjb21wb3NlZCBvZiB0aGUgZm9sbG93aW5nOgorCisgLSBBbiBvcHRpb25hbCAiRnJvbSIgbGluZSBuYW1pbmcgdGhlIGF1dGhvciBvZiB0aGUgcGF0Y2guICBUaGlzIGxpbmUgaXMKKyAgIG9ubHkgbmVjZXNzYXJ5IGlmIHlvdSBhcmUgcGFzc2luZyBvbiBzb21lYm9keSBlbHNlJ3MgcGF0Y2ggdmlhIGVtYWlsLAorICAgYnV0IGl0IG5ldmVyIGh1cnRzIHRvIGFkZCBpdCB3aGVuIGluIGRvdWJ0LgorCisgLSBBIG9uZS1saW5lIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhlIHBhdGNoIGRvZXMuICBUaGlzIG1lc3NhZ2Ugc2hvdWxkIGJlCisgICBlbm91Z2ggZm9yIGEgcmVhZGVyIHdobyBzZWVzIGl0IHdpdGggbm8gb3RoZXIgY29udGV4dCB0byBmaWd1cmUgb3V0IHRoZQorICAgc2NvcGUgb2YgdGhlIHBhdGNoOyBpdCBpcyB0aGUgbGluZSB0aGF0IHdpbGwgc2hvdyB1cCBpbiB0aGUgInNob3J0IGZvcm0iCisgICBjaGFuZ2Vsb2dzLiAgVGhpcyBtZXNzYWdlIGlzIHVzdWFsbHkgZm9ybWF0dGVkIHdpdGggdGhlIHJlbGV2YW50CisgICBzdWJzeXN0ZW0gbmFtZSBmaXJzdCwgZm9sbG93ZWQgYnkgdGhlIHB1cnBvc2Ugb2YgdGhlIHBhdGNoLiAgRm9yCisgICBleGFtcGxlOgorCisgICA6OgorCisJZ3BpbzogZml4IGJ1aWxkIG9uIENPTkZJR19HUElPX1NZU0ZTPW4KKworIC0gQSBibGFuayBsaW5lIGZvbGxvd2VkIGJ5IGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIGNvbnRlbnRzIG9mIHRoZQorICAgcGF0Y2guICBUaGlzIGRlc2NyaXB0aW9uIGNhbiBiZSBhcyBsb25nIGFzIGlzIHJlcXVpcmVkOyBpdCBzaG91bGQgc2F5CisgICB3aGF0IHRoZSBwYXRjaCBkb2VzIGFuZCB3aHkgaXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIGtlcm5lbC4KKworIC0gT25lIG9yIG1vcmUgdGFnIGxpbmVzLCB3aXRoLCBhdCBhIG1pbmltdW0sIG9uZSBTaWduZWQtb2ZmLWJ5OiBsaW5lIGZyb20KKyAgIHRoZSBhdXRob3Igb2YgdGhlIHBhdGNoLiAgVGFncyB3aWxsIGJlIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBiZWxvdy4KKworVGhlIGl0ZW1zIGFib3ZlLCB0b2dldGhlciwgZm9ybSB0aGUgY2hhbmdlbG9nIGZvciB0aGUgcGF0Y2guICBXcml0aW5nIGdvb2QKK2NoYW5nZWxvZ3MgaXMgYSBjcnVjaWFsIGJ1dCBvZnRlbi1uZWdsZWN0ZWQgYXJ0OyBpdCdzIHdvcnRoIHNwZW5kaW5nCithbm90aGVyIG1vbWVudCBkaXNjdXNzaW5nIHRoaXMgaXNzdWUuICBXaGVuIHdyaXRpbmcgYSBjaGFuZ2Vsb2csIHlvdSBzaG91bGQKK2JlYXIgaW4gbWluZCB0aGF0IGEgbnVtYmVyIG9mIGRpZmZlcmVudCBwZW9wbGUgd2lsbCBiZSByZWFkaW5nIHlvdXIgd29yZHMuCitUaGVzZSBpbmNsdWRlIHN1YnN5c3RlbSBtYWludGFpbmVycyBhbmQgcmV2aWV3ZXJzIHdobyBuZWVkIHRvIGRlY2lkZQord2hldGhlciB0aGUgcGF0Y2ggc2hvdWxkIGJlIGluY2x1ZGVkLCBkaXN0cmlidXRvcnMgYW5kIG90aGVyIG1haW50YWluZXJzCit0cnlpbmcgdG8gZGVjaWRlIHdoZXRoZXIgYSBwYXRjaCBzaG91bGQgYmUgYmFja3BvcnRlZCB0byBvdGhlciBrZXJuZWxzLCBidWcKK2h1bnRlcnMgd29uZGVyaW5nIHdoZXRoZXIgdGhlIHBhdGNoIGlzIHJlc3BvbnNpYmxlIGZvciBhIHByb2JsZW0gdGhleSBhcmUKK2NoYXNpbmcsIHVzZXJzIHdobyB3YW50IHRvIGtub3cgaG93IHRoZSBrZXJuZWwgaGFzIGNoYW5nZWQsIGFuZCBtb3JlLiAgQQorZ29vZCBjaGFuZ2Vsb2cgY29udmV5cyB0aGUgbmVlZGVkIGluZm9ybWF0aW9uIHRvIGFsbCBvZiB0aGVzZSBwZW9wbGUgaW4gdGhlCittb3N0IGRpcmVjdCBhbmQgY29uY2lzZSB3YXkgcG9zc2libGUuCisKK1RvIHRoYXQgZW5kLCB0aGUgc3VtbWFyeSBsaW5lIHNob3VsZCBkZXNjcmliZSB0aGUgZWZmZWN0cyBvZiBhbmQgbW90aXZhdGlvbgorZm9yIHRoZSBjaGFuZ2UgYXMgd2VsbCBhcyBwb3NzaWJsZSBnaXZlbiB0aGUgb25lLWxpbmUgY29uc3RyYWludC4gIFRoZQorZGV0YWlsZWQgZGVzY3JpcHRpb24gY2FuIHRoZW4gYW1wbGlmeSBvbiB0aG9zZSB0b3BpY3MgYW5kIHByb3ZpZGUgYW55CituZWVkZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4gIElmIHRoZSBwYXRjaCBmaXhlcyBhIGJ1ZywgY2l0ZSB0aGUgY29tbWl0Cit3aGljaCBpbnRyb2R1Y2VkIHRoZSBidWcgaWYgcG9zc2libGUgKGFuZCBwbGVhc2UgcHJvdmlkZSBib3RoIHRoZSBjb21taXQgSUQKK2FuZCB0aGUgdGl0bGUgd2hlbiBjaXRpbmcgY29tbWl0cykuICBJZiBhIHByb2JsZW0gaXMgYXNzb2NpYXRlZCB3aXRoCitzcGVjaWZpYyBsb2cgb3IgY29tcGlsZXIgb3V0cHV0LCBpbmNsdWRlIHRoYXQgb3V0cHV0IHRvIGhlbHAgb3RoZXJzCitzZWFyY2hpbmcgZm9yIGEgc29sdXRpb24gdG8gdGhlIHNhbWUgcHJvYmxlbS4gIElmIHRoZSBjaGFuZ2UgaXMgbWVhbnQgdG8KK3N1cHBvcnQgb3RoZXIgY2hhbmdlcyBjb21pbmcgaW4gbGF0ZXIgcGF0Y2gsIHNheSBzby4gIElmIGludGVybmFsIEFQSXMgYXJlCitjaGFuZ2VkLCBkZXRhaWwgdGhvc2UgY2hhbmdlcyBhbmQgaG93IG90aGVyIGRldmVsb3BlcnMgc2hvdWxkIHJlc3BvbmQuICBJbgorZ2VuZXJhbCwgdGhlIG1vcmUgeW91IGNhbiBwdXQgeW91cnNlbGYgaW50byB0aGUgc2hvZXMgb2YgZXZlcnlib2R5IHdobyB3aWxsCitiZSByZWFkaW5nIHlvdXIgY2hhbmdlbG9nLCB0aGUgYmV0dGVyIHRoYXQgY2hhbmdlbG9nIChhbmQgdGhlIGtlcm5lbCBhcyBhCit3aG9sZSkgd2lsbCBiZS4KKworTmVlZGxlc3MgdG8gc2F5LCB0aGUgY2hhbmdlbG9nIHNob3VsZCBiZSB0aGUgdGV4dCB1c2VkIHdoZW4gY29tbWl0dGluZyB0aGUKK2NoYW5nZSB0byBhIHJldmlzaW9uIGNvbnRyb2wgc3lzdGVtLiAgSXQgd2lsbCBiZSBmb2xsb3dlZCBieToKKworIC0gVGhlIHBhdGNoIGl0c2VsZiwgaW4gdGhlIHVuaWZpZWQgKCItdSIpIHBhdGNoIGZvcm1hdC4gIFVzaW5nIHRoZSAiLXAiCisgICBvcHRpb24gdG8gZGlmZiB3aWxsIGFzc29jaWF0ZSBmdW5jdGlvbiBuYW1lcyB3aXRoIGNoYW5nZXMsIG1ha2luZyB0aGUKKyAgIHJlc3VsdGluZyBwYXRjaCBlYXNpZXIgZm9yIG90aGVycyB0byByZWFkLgorCitZb3Ugc2hvdWxkIGF2b2lkIGluY2x1ZGluZyBjaGFuZ2VzIHRvIGlycmVsZXZhbnQgZmlsZXMgKHRob3NlIGdlbmVyYXRlZCBieQordGhlIGJ1aWxkIHByb2Nlc3MsIGZvciBleGFtcGxlLCBvciBlZGl0b3IgYmFja3VwIGZpbGVzKSBpbiB0aGUgcGF0Y2guICBUaGUKK2ZpbGUgImRvbnRkaWZmIiBpbiB0aGUgRG9jdW1lbnRhdGlvbiBkaXJlY3RvcnkgY2FuIGhlbHAgaW4gdGhpcyByZWdhcmQ7CitwYXNzIGl0IHRvIGRpZmYgd2l0aCB0aGUgIi1YIiBvcHRpb24uCisKK1RoZSB0YWdzIG1lbnRpb25lZCBhYm92ZSBhcmUgdXNlZCB0byBkZXNjcmliZSBob3cgdmFyaW91cyBkZXZlbG9wZXJzIGhhdmUKK2JlZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXZlbG9wbWVudCBvZiB0aGlzIHBhdGNoLiAgVGhleSBhcmUgZGVzY3JpYmVkIGluCitkZXRhaWwgaW4gdGhlIFN1Ym1pdHRpbmdQYXRjaGVzIGRvY3VtZW50OyB3aGF0IGZvbGxvd3MgaGVyZSBpcyBhIGJyaWVmCitzdW1tYXJ5LiAgRWFjaCBvZiB0aGVzZSBsaW5lcyBoYXMgdGhlIGZvcm1hdDoKKworOjoKKworCXRhZzogRnVsbCBOYW1lIDxlbWFpbCBhZGRyZXNzPiAgb3B0aW9uYWwtb3RoZXItc3R1ZmYKKworVGhlIHRhZ3MgaW4gY29tbW9uIHVzZSBhcmU6CisKKyAtIFNpZ25lZC1vZmYtYnk6IHRoaXMgaXMgYSBkZXZlbG9wZXIncyBjZXJ0aWZpY2F0aW9uIHRoYXQgaGUgb3Igc2hlIGhhcworICAgdGhlIHJpZ2h0IHRvIHN1Ym1pdCB0aGUgcGF0Y2ggZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBrZXJuZWwuICBJdCBpcyBhbgorICAgYWdyZWVtZW50IHRvIHRoZSBEZXZlbG9wZXIncyBDZXJ0aWZpY2F0ZSBvZiBPcmlnaW4sIHRoZSBmdWxsIHRleHQgb2YKKyAgIHdoaWNoIGNhbiBiZSBmb3VuZCBpbiBEb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzLiAgQ29kZSB3aXRob3V0IGEKKyAgIHByb3BlciBzaWdub2ZmIGNhbm5vdCBiZSBtZXJnZWQgaW50byB0aGUgbWFpbmxpbmUuCisKKyAtIEFja2VkLWJ5OiBpbmRpY2F0ZXMgYW4gYWdyZWVtZW50IGJ5IGFub3RoZXIgZGV2ZWxvcGVyIChvZnRlbiBhCisgICBtYWludGFpbmVyIG9mIHRoZSByZWxldmFudCBjb2RlKSB0aGF0IHRoZSBwYXRjaCBpcyBhcHByb3ByaWF0ZSBmb3IKKyAgIGluY2x1c2lvbiBpbnRvIHRoZSBrZXJuZWwuCisKKyAtIFRlc3RlZC1ieTogc3RhdGVzIHRoYXQgdGhlIG5hbWVkIHBlcnNvbiBoYXMgdGVzdGVkIHRoZSBwYXRjaCBhbmQgZm91bmQKKyAgIGl0IHRvIHdvcmsuCisKKyAtIFJldmlld2VkLWJ5OiB0aGUgbmFtZWQgZGV2ZWxvcGVyIGhhcyByZXZpZXdlZCB0aGUgcGF0Y2ggZm9yIGNvcnJlY3RuZXNzOworICAgc2VlIHRoZSByZXZpZXdlcidzIHN0YXRlbWVudCBpbiBEb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzIGZvciBtb3JlCisgICBkZXRhaWwuCisKKyAtIFJlcG9ydGVkLWJ5OiBuYW1lcyBhIHVzZXIgd2hvIHJlcG9ydGVkIGEgcHJvYmxlbSB3aGljaCBpcyBmaXhlZCBieSB0aGlzCisgICBwYXRjaDsgdGhpcyB0YWcgaXMgdXNlZCB0byBnaXZlIGNyZWRpdCB0byB0aGUgKG9mdGVuIHVuZGVyYXBwcmVjaWF0ZWQpCisgICBwZW9wbGUgd2hvIHRlc3Qgb3VyIGNvZGUgYW5kIGxldCB1cyBrbm93IHdoZW4gdGhpbmdzIGRvIG5vdCB3b3JrCisgICBjb3JyZWN0bHkuCisKKyAtIENjOiB0aGUgbmFtZWQgcGVyc29uIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgcGF0Y2ggYW5kIGhhZCB0aGUKKyAgIG9wcG9ydHVuaXR5IHRvIGNvbW1lbnQgb24gaXQuCisKK0JlIGNhcmVmdWwgaW4gdGhlIGFkZGl0aW9uIG9mIHRhZ3MgdG8geW91ciBwYXRjaGVzOiBvbmx5IENjOiBpcyBhcHByb3ByaWF0ZQorZm9yIGFkZGl0aW9uIHdpdGhvdXQgdGhlIGV4cGxpY2l0IHBlcm1pc3Npb24gb2YgdGhlIHBlcnNvbiBuYW1lZC4KKworCitTZW5kaW5nIHRoZSBwYXRjaAorLS0tLS0tLS0tLS0tLS0tLS0KKworQmVmb3JlIHlvdSBtYWlsIHlvdXIgcGF0Y2hlcywgdGhlcmUgYXJlIGEgY291cGxlIG9mIG90aGVyIHRoaW5ncyB5b3Ugc2hvdWxkCit0YWtlIGNhcmUgb2Y6CisKKyAtIEFyZSB5b3Ugc3VyZSB0aGF0IHlvdXIgbWFpbGVyIHdpbGwgbm90IGNvcnJ1cHQgdGhlIHBhdGNoZXM/ICBQYXRjaGVzCisgICB3aGljaCBoYXZlIGhhZCBncmF0dWl0b3VzIHdoaXRlLXNwYWNlIGNoYW5nZXMgb3IgbGluZSB3cmFwcGluZyBwZXJmb3JtZWQKKyAgIGJ5IHRoZSBtYWlsIGNsaWVudCB3aWxsIG5vdCBhcHBseSBhdCB0aGUgb3RoZXIgZW5kLCBhbmQgb2Z0ZW4gd2lsbCBub3QKKyAgIGJlIGV4YW1pbmVkIGluIGFueSBkZXRhaWwuICBJZiB0aGVyZSBpcyBhbnkgZG91YnQgYXQgYWxsLCBtYWlsIHRoZSBwYXRjaAorICAgdG8geW91cnNlbGYgYW5kIGNvbnZpbmNlIHlvdXJzZWxmIHRoYXQgaXQgc2hvd3MgdXAgaW50YWN0LgorCisgICBEb2N1bWVudGF0aW9uL2VtYWlsLWNsaWVudHMudHh0IGhhcyBzb21lIGhlbHBmdWwgaGludHMgb24gbWFraW5nCisgICBzcGVjaWZpYyBtYWlsIGNsaWVudHMgd29yayBmb3Igc2VuZGluZyBwYXRjaGVzLgorCisgLSBBcmUgeW91IHN1cmUgeW91ciBwYXRjaCBpcyBmcmVlIG9mIHNpbGx5IG1pc3Rha2VzPyAgWW91IHNob3VsZCBhbHdheXMKKyAgIHJ1biBwYXRjaGVzIHRocm91Z2ggc2NyaXB0cy9jaGVja3BhdGNoLnBsIGFuZCBhZGRyZXNzIHRoZSBjb21wbGFpbnRzIGl0CisgICBjb21lcyB1cCB3aXRoLiAgUGxlYXNlIGJlYXIgaW4gbWluZCB0aGF0IGNoZWNrcGF0Y2gucGwsIHdoaWxlIGJlaW5nIHRoZQorICAgZW1ib2RpbWVudCBvZiBhIGZhaXIgYW1vdW50IG9mIHRob3VnaHQgYWJvdXQgd2hhdCBrZXJuZWwgcGF0Y2hlcyBzaG91bGQKKyAgIGxvb2sgbGlrZSwgaXMgbm90IHNtYXJ0ZXIgdGhhbiB5b3UuICBJZiBmaXhpbmcgYSBjaGVja3BhdGNoLnBsIGNvbXBsYWludAorICAgd291bGQgbWFrZSB0aGUgY29kZSB3b3JzZSwgZG9uJ3QgZG8gaXQuCisKK1BhdGNoZXMgc2hvdWxkIGFsd2F5cyBiZSBzZW50IGFzIHBsYWluIHRleHQuICBQbGVhc2UgZG8gbm90IHNlbmQgdGhlbSBhcworYXR0YWNobWVudHM7IHRoYXQgbWFrZXMgaXQgbXVjaCBoYXJkZXIgZm9yIHJldmlld2VycyB0byBxdW90ZSBzZWN0aW9ucyBvZgordGhlIHBhdGNoIGluIHRoZWlyIHJlcGxpZXMuICBJbnN0ZWFkLCBqdXN0IHB1dCB0aGUgcGF0Y2ggZGlyZWN0bHkgaW50byB5b3VyCittZXNzYWdlLgorCitXaGVuIG1haWxpbmcgcGF0Y2hlcywgaXQgaXMgaW1wb3J0YW50IHRvIHNlbmQgY29waWVzIHRvIGFueWJvZHkgd2hvIG1pZ2h0CitiZSBpbnRlcmVzdGVkIGluIGl0LiAgVW5saWtlIHNvbWUgb3RoZXIgcHJvamVjdHMsIHRoZSBrZXJuZWwgZW5jb3VyYWdlcworcGVvcGxlIHRvIGVyciBvbiB0aGUgc2lkZSBvZiBzZW5kaW5nIHRvbyBtYW55IGNvcGllczsgZG9uJ3QgYXNzdW1lIHRoYXQgdGhlCityZWxldmFudCBwZW9wbGUgd2lsbCBzZWUgeW91ciBwb3N0aW5nIG9uIHRoZSBtYWlsaW5nIGxpc3RzLiAgSW4gcGFydGljdWxhciwKK2NvcGllcyBzaG91bGQgZ28gdG86CisKKyAtIFRoZSBtYWludGFpbmVyKHMpIG9mIHRoZSBhZmZlY3RlZCBzdWJzeXN0ZW0ocykuICBBcyBkZXNjcmliZWQgZWFybGllciwKKyAgIHRoZSBNQUlOVEFJTkVSUyBmaWxlIGlzIHRoZSBmaXJzdCBwbGFjZSB0byBsb29rIGZvciB0aGVzZSBwZW9wbGUuCisKKyAtIE90aGVyIGRldmVsb3BlcnMgd2hvIGhhdmUgYmVlbiB3b3JraW5nIGluIHRoZSBzYW1lIGFyZWEgLSBlc3BlY2lhbGx5CisgICB0aG9zZSB3aG8gbWlnaHQgYmUgd29ya2luZyB0aGVyZSBub3cuICBVc2luZyBnaXQgdG8gc2VlIHdobyBlbHNlIGhhcworICAgbW9kaWZpZWQgdGhlIGZpbGVzIHlvdSBhcmUgd29ya2luZyBvbiBjYW4gYmUgaGVscGZ1bC4KKworIC0gSWYgeW91IGFyZSByZXNwb25kaW5nIHRvIGEgYnVnIHJlcG9ydCBvciBhIGZlYXR1cmUgcmVxdWVzdCwgY29weSB0aGUKKyAgIG9yaWdpbmFsIHBvc3RlciBhcyB3ZWxsLgorCisgLSBTZW5kIGEgY29weSB0byB0aGUgcmVsZXZhbnQgbWFpbGluZyBsaXN0LCBvciwgaWYgbm90aGluZyBlbHNlIGFwcGxpZXMsCisgICB0aGUgbGludXgta2VybmVsIGxpc3QuCisKKyAtIElmIHlvdSBhcmUgZml4aW5nIGEgYnVnLCB0aGluayBhYm91dCB3aGV0aGVyIHRoZSBmaXggc2hvdWxkIGdvIGludG8gdGhlCisgICBuZXh0IHN0YWJsZSB1cGRhdGUuICBJZiBzbywgc3RhYmxlQHZnZXIua2VybmVsLm9yZyBzaG91bGQgZ2V0IGEgY29weSBvZgorICAgdGhlIHBhdGNoLiAgQWxzbyBhZGQgYSAiQ2M6IHN0YWJsZUB2Z2VyLmtlcm5lbC5vcmciIHRvIHRoZSB0YWdzIHdpdGhpbgorICAgdGhlIHBhdGNoIGl0c2VsZjsgdGhhdCB3aWxsIGNhdXNlIHRoZSBzdGFibGUgdGVhbSB0byBnZXQgYSBub3RpZmljYXRpb24KKyAgIHdoZW4geW91ciBmaXggZ29lcyBpbnRvIHRoZSBtYWlubGluZS4KKworV2hlbiBzZWxlY3RpbmcgcmVjaXBpZW50cyBmb3IgYSBwYXRjaCwgaXQgaXMgZ29vZCB0byBoYXZlIGFuIGlkZWEgb2Ygd2hvCit5b3UgdGhpbmsgd2lsbCBldmVudHVhbGx5IGFjY2VwdCB0aGUgcGF0Y2ggYW5kIGdldCBpdCBtZXJnZWQuICBXaGlsZSBpdAoraXMgcG9zc2libGUgdG8gc2VuZCBwYXRjaGVzIGRpcmVjdGx5IHRvIExpbnVzIFRvcnZhbGRzIGFuZCBoYXZlIGhpbSBtZXJnZQordGhlbSwgdGhpbmdzIGFyZSBub3Qgbm9ybWFsbHkgZG9uZSB0aGF0IHdheS4gIExpbnVzIGlzIGJ1c3ksIGFuZCB0aGVyZSBhcmUKK3N1YnN5c3RlbSBtYWludGFpbmVycyB3aG8gd2F0Y2ggb3ZlciBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUga2VybmVsLiAgVXN1YWxseQoreW91IHdpbGwgYmUgd2FudGluZyB0aGF0IG1haW50YWluZXIgdG8gbWVyZ2UgeW91ciBwYXRjaGVzLiAgSWYgdGhlcmUgaXMgbm8KK29idmlvdXMgbWFpbnRhaW5lciwgQW5kcmV3IE1vcnRvbiBpcyBvZnRlbiB0aGUgcGF0Y2ggdGFyZ2V0IG9mIGxhc3QgcmVzb3J0LgorCitQYXRjaGVzIG5lZWQgZ29vZCBzdWJqZWN0IGxpbmVzLiAgVGhlIGNhbm9uaWNhbCBmb3JtYXQgZm9yIGEgcGF0Y2ggbGluZSBpcworc29tZXRoaW5nIGxpa2U6CisKKzo6CisKKwlbUEFUQ0ggbm4vbW1dIHN1YnN5czogb25lLWxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIHBhdGNoCisKK3doZXJlICJubiIgaXMgdGhlIG9yZGluYWwgbnVtYmVyIG9mIHRoZSBwYXRjaCwgIm1tIiBpcyB0aGUgdG90YWwgbnVtYmVyIG9mCitwYXRjaGVzIGluIHRoZSBzZXJpZXMsIGFuZCAic3Vic3lzIiBpcyB0aGUgbmFtZSBvZiB0aGUgYWZmZWN0ZWQgc3Vic3lzdGVtLgorQ2xlYXJseSwgbm4vbW0gY2FuIGJlIG9taXR0ZWQgZm9yIGEgc2luZ2xlLCBzdGFuZGFsb25lIHBhdGNoLgorCitJZiB5b3UgaGF2ZSBhIHNpZ25pZmljYW50IHNlcmllcyBvZiBwYXRjaGVzLCBpdCBpcyBjdXN0b21hcnkgdG8gc2VuZCBhbgoraW50cm9kdWN0b3J5IGRlc2NyaXB0aW9uIGFzIHBhcnQgemVyby4gIFRoaXMgY29udmVudGlvbiBpcyBub3QgdW5pdmVyc2FsbHkKK2ZvbGxvd2VkIHRob3VnaDsgaWYgeW91IHVzZSBpdCwgcmVtZW1iZXIgdGhhdCBpbmZvcm1hdGlvbiBpbiB0aGUKK2ludHJvZHVjdGlvbiBkb2VzIG5vdCBtYWtlIGl0IGludG8gdGhlIGtlcm5lbCBjaGFuZ2Vsb2dzLiAgU28gcGxlYXNlIGVuc3VyZQordGhhdCB0aGUgcGF0Y2hlcywgdGhlbXNlbHZlcywgaGF2ZSBjb21wbGV0ZSBjaGFuZ2Vsb2cgaW5mb3JtYXRpb24uCisKK0luIGdlbmVyYWwsIHRoZSBzZWNvbmQgYW5kIGZvbGxvd2luZyBwYXJ0cyBvZiBhIG11bHRpLXBhcnQgcGF0Y2ggc2hvdWxkIGJlCitzZW50IGFzIGEgcmVwbHkgdG8gdGhlIGZpcnN0IHBhcnQgc28gdGhhdCB0aGV5IGFsbCB0aHJlYWQgdG9nZXRoZXIgYXQgdGhlCityZWNlaXZpbmcgZW5kLiAgVG9vbHMgbGlrZSBnaXQgYW5kIHF1aWx0IGhhdmUgY29tbWFuZHMgdG8gbWFpbCBvdXQgYSBzZXQgb2YKK3BhdGNoZXMgd2l0aCB0aGUgcHJvcGVyIHRocmVhZGluZy4gIElmIHlvdSBoYXZlIGEgbG9uZyBzZXJpZXMsIHRob3VnaCwgYW5kCithcmUgdXNpbmcgZ2l0LCBwbGVhc2Ugc3RheSBhd2F5IGZyb20gdGhlIC0tY2hhaW4tcmVwbHktdG8gb3B0aW9uIHRvIGF2b2lkCitjcmVhdGluZyBleGNlcHRpb25hbGx5IGRlZXAgbmVzdGluZy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy82LkZvbGxvd3Rocm91Z2ggYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNi5Gb2xsb3d0aHJvdWdoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWQzMjRhLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy82LkZvbGxvd3Rocm91Z2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotNjogRk9MTE9XVEhST1VHSAotCi1BdCB0aGlzIHBvaW50LCB5b3UgaGF2ZSBmb2xsb3dlZCB0aGUgZ3VpZGVsaW5lcyBnaXZlbiBzbyBmYXIgYW5kLCB3aXRoIHRoZQotYWRkaXRpb24gb2YgeW91ciBvd24gZW5naW5lZXJpbmcgc2tpbGxzLCBoYXZlIHBvc3RlZCBhIHBlcmZlY3Qgc2VyaWVzIG9mCi1wYXRjaGVzLiAgT25lIG9mIHRoZSBiaWdnZXN0IG1pc3Rha2VzIHRoYXQgZXZlbiBleHBlcmllbmNlZCBrZXJuZWwKLWRldmVsb3BlcnMgY2FuIG1ha2UgaXMgdG8gY29uY2x1ZGUgdGhhdCB0aGVpciB3b3JrIGlzIG5vdyBkb25lLiAgSW4gdHJ1dGgsCi1wb3N0aW5nIHBhdGNoZXMgaW5kaWNhdGVzIGEgdHJhbnNpdGlvbiBpbnRvIHRoZSBuZXh0IHN0YWdlIG9mIHRoZSBwcm9jZXNzLAotd2l0aCwgcG9zc2libHksIHF1aXRlIGEgYml0IG9mIHdvcmsgeWV0IHRvIGJlIGRvbmUuCi0KLUl0IGlzIGEgcmFyZSBwYXRjaCB3aGljaCBpcyBzbyBnb29kIGF0IGl0cyBmaXJzdCBwb3N0aW5nIHRoYXQgdGhlcmUgaXMgbm8KLXJvb20gZm9yIGltcHJvdmVtZW50LiAgVGhlIGtlcm5lbCBkZXZlbG9wbWVudCBwcm9jZXNzIHJlY29nbml6ZXMgdGhpcyBmYWN0LAotYW5kLCBhcyBhIHJlc3VsdCwgaXMgaGVhdmlseSBvcmllbnRlZCB0b3dhcmQgdGhlIGltcHJvdmVtZW50IG9mIHBvc3RlZAotY29kZS4gIFlvdSwgYXMgdGhlIGF1dGhvciBvZiB0aGF0IGNvZGUsIHdpbGwgYmUgZXhwZWN0ZWQgdG8gd29yayB3aXRoIHRoZQota2VybmVsIGNvbW11bml0eSB0byBlbnN1cmUgdGhhdCB5b3VyIGNvZGUgaXMgdXAgdG8gdGhlIGtlcm5lbCdzIHF1YWxpdHkKLXN0YW5kYXJkcy4gIEEgZmFpbHVyZSB0byBwYXJ0aWNpcGF0ZSBpbiB0aGlzIHByb2Nlc3MgaXMgcXVpdGUgbGlrZWx5IHRvCi1wcmV2ZW50IHRoZSBpbmNsdXNpb24gb2YgeW91ciBwYXRjaGVzIGludG8gdGhlIG1haW5saW5lLgotCi0KLTYuMTogV09SS0lORyBXSVRIIFJFVklFV0VSUwotCi1BIHBhdGNoIG9mIGFueSBzaWduaWZpY2FuY2Ugd2lsbCByZXN1bHQgaW4gYSBudW1iZXIgb2YgY29tbWVudHMgZnJvbSBvdGhlcgotZGV2ZWxvcGVycyBhcyB0aGV5IHJldmlldyB0aGUgY29kZS4gIFdvcmtpbmcgd2l0aCByZXZpZXdlcnMgY2FuIGJlLCBmb3IKLW1hbnkgZGV2ZWxvcGVycywgdGhlIG1vc3QgaW50aW1pZGF0aW5nIHBhcnQgb2YgdGhlIGtlcm5lbCBkZXZlbG9wbWVudAotcHJvY2Vzcy4gIExpZmUgY2FuIGJlIG1hZGUgbXVjaCBlYXNpZXIsIHRob3VnaCwgaWYgeW91IGtlZXAgYSBmZXcgdGhpbmdzIGluCi1taW5kOgotCi0gLSBJZiB5b3UgaGF2ZSBleHBsYWluZWQgeW91ciBwYXRjaCB3ZWxsLCByZXZpZXdlcnMgd2lsbCB1bmRlcnN0YW5kIGl0cwotICAgdmFsdWUgYW5kIHdoeSB5b3Ugd2VudCB0byB0aGUgdHJvdWJsZSBvZiB3cml0aW5nIGl0LiAgQnV0IHRoYXQgdmFsdWUKLSAgIHdpbGwgbm90IGtlZXAgdGhlbSBmcm9tIGFza2luZyBhIGZ1bmRhbWVudGFsIHF1ZXN0aW9uOiB3aGF0IHdpbGwgaXQgYmUKLSAgIGxpa2UgdG8gbWFpbnRhaW4gYSBrZXJuZWwgd2l0aCB0aGlzIGNvZGUgaW4gaXQgZml2ZSBvciB0ZW4geWVhcnMgbGF0ZXI/Ci0gICBNYW55IG9mIHRoZSBjaGFuZ2VzIHlvdSBtYXkgYmUgYXNrZWQgdG8gbWFrZSAtIGZyb20gY29kaW5nIHN0eWxlIHR3ZWFrcwotICAgdG8gc3Vic3RhbnRpYWwgcmV3cml0ZXMgLSBjb21lIGZyb20gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBMaW51eCB3aWxsCi0gICBzdGlsbCBiZSBhcm91bmQgYW5kIHVuZGVyIGRldmVsb3BtZW50IGEgZGVjYWRlIGZyb20gbm93LgotCi0gLSBDb2RlIHJldmlldyBpcyBoYXJkIHdvcmssIGFuZCBpdCBpcyBhIHJlbGF0aXZlbHkgdGhhbmtsZXNzIG9jY3VwYXRpb247Ci0gICBwZW9wbGUgcmVtZW1iZXIgd2hvIHdyb3RlIGtlcm5lbCBjb2RlLCBidXQgdGhlcmUgaXMgbGl0dGxlIGxhc3RpbmcgZmFtZQotICAgZm9yIHRob3NlIHdobyByZXZpZXdlZCBpdC4gIFNvIHJldmlld2VycyBjYW4gZ2V0IGdydW1weSwgZXNwZWNpYWxseSB3aGVuCi0gICB0aGV5IHNlZSB0aGUgc2FtZSBtaXN0YWtlcyBiZWluZyBtYWRlIG92ZXIgYW5kIG92ZXIgYWdhaW4uICBJZiB5b3UgZ2V0IGEKLSAgIHJldmlldyB3aGljaCBzZWVtcyBhbmdyeSwgaW5zdWx0aW5nLCBvciBvdXRyaWdodCBvZmZlbnNpdmUsIHJlc2lzdCB0aGUKLSAgIGltcHVsc2UgdG8gcmVzcG9uZCBpbiBraW5kLiAgQ29kZSByZXZpZXcgaXMgYWJvdXQgdGhlIGNvZGUsIG5vdCBhYm91dAotICAgdGhlIHBlb3BsZSwgYW5kIGNvZGUgcmV2aWV3ZXJzIGFyZSBub3QgYXR0YWNraW5nIHlvdSBwZXJzb25hbGx5LgotCi0gLSBTaW1pbGFybHksIGNvZGUgcmV2aWV3ZXJzIGFyZSBub3QgdHJ5aW5nIHRvIHByb21vdGUgdGhlaXIgZW1wbG95ZXJzJwotICAgYWdlbmRhcyBhdCB0aGUgZXhwZW5zZSBvZiB5b3VyIG93bi4gIEtlcm5lbCBkZXZlbG9wZXJzIG9mdGVuIGV4cGVjdCB0bwotICAgYmUgd29ya2luZyBvbiB0aGUga2VybmVsIHllYXJzIGZyb20gbm93LCBidXQgdGhleSB1bmRlcnN0YW5kIHRoYXQgdGhlaXIKLSAgIGVtcGxveWVyIGNvdWxkIGNoYW5nZS4gIFRoZXkgdHJ1bHkgYXJlLCBhbG1vc3Qgd2l0aG91dCBleGNlcHRpb24sCi0gICB3b3JraW5nIHRvd2FyZCB0aGUgY3JlYXRpb24gb2YgdGhlIGJlc3Qga2VybmVsIHRoZXkgY2FuOyB0aGV5IGFyZSBub3QKLSAgIHRyeWluZyB0byBjcmVhdGUgZGlzY29tZm9ydCBmb3IgdGhlaXIgZW1wbG95ZXJzJyBjb21wZXRpdG9ycy4KLQotV2hhdCBhbGwgb2YgdGhpcyBjb21lcyBkb3duIHRvIGlzIHRoYXQsIHdoZW4gcmV2aWV3ZXJzIHNlbmQgeW91IGNvbW1lbnRzLAoteW91IG5lZWQgdG8gcGF5IGF0dGVudGlvbiB0byB0aGUgdGVjaG5pY2FsIG9ic2VydmF0aW9ucyB0aGF0IHRoZXkgYXJlCi1tYWtpbmcuICBEbyBub3QgbGV0IHRoZWlyIGZvcm0gb2YgZXhwcmVzc2lvbiBvciB5b3VyIG93biBwcmlkZSBrZWVwIHRoYXQKLWZyb20gaGFwcGVuaW5nLiAgV2hlbiB5b3UgZ2V0IHJldmlldyBjb21tZW50cyBvbiBhIHBhdGNoLCB0YWtlIHRoZSB0aW1lIHRvCi11bmRlcnN0YW5kIHdoYXQgdGhlIHJldmlld2VyIGlzIHRyeWluZyB0byBzYXkuICBJZiBwb3NzaWJsZSwgZml4IHRoZSB0aGluZ3MKLXRoYXQgdGhlIHJldmlld2VyIGlzIGFza2luZyB5b3UgdG8gZml4LiAgQW5kIHJlc3BvbmQgYmFjayB0byB0aGUgcmV2aWV3ZXI6Ci10aGFuayB0aGVtLCBhbmQgZGVzY3JpYmUgaG93IHlvdSB3aWxsIGFuc3dlciB0aGVpciBxdWVzdGlvbnMuCi0KLU5vdGUgdGhhdCB5b3UgZG8gbm90IGhhdmUgdG8gYWdyZWUgd2l0aCBldmVyeSBjaGFuZ2Ugc3VnZ2VzdGVkIGJ5Ci1yZXZpZXdlcnMuICBJZiB5b3UgYmVsaWV2ZSB0aGF0IHRoZSByZXZpZXdlciBoYXMgbWlzdW5kZXJzdG9vZCB5b3VyIGNvZGUsCi1leHBsYWluIHdoYXQgaXMgcmVhbGx5IGdvaW5nIG9uLiAgSWYgeW91IGhhdmUgYSB0ZWNobmljYWwgb2JqZWN0aW9uIHRvIGEKLXN1Z2dlc3RlZCBjaGFuZ2UsIGRlc2NyaWJlIGl0IGFuZCBqdXN0aWZ5IHlvdXIgc29sdXRpb24gdG8gdGhlIHByb2JsZW0uICBJZgoteW91ciBleHBsYW5hdGlvbnMgbWFrZSBzZW5zZSwgdGhlIHJldmlld2VyIHdpbGwgYWNjZXB0IHRoZW0uICBTaG91bGQgeW91cgotZXhwbGFuYXRpb24gbm90IHByb3ZlIHBlcnN1YXNpdmUsIHRob3VnaCwgZXNwZWNpYWxseSBpZiBvdGhlcnMgc3RhcnQgdG8KLWFncmVlIHdpdGggdGhlIHJldmlld2VyLCB0YWtlIHNvbWUgdGltZSB0byB0aGluayB0aGluZ3Mgb3ZlciBhZ2Fpbi4gIEl0IGNhbgotYmUgZWFzeSB0byBiZWNvbWUgYmxpbmRlZCBieSB5b3VyIG93biBzb2x1dGlvbiB0byBhIHByb2JsZW0gdG8gdGhlIHBvaW50Ci10aGF0IHlvdSBkb24ndCByZWFsaXplIHRoYXQgc29tZXRoaW5nIGlzIGZ1bmRhbWVudGFsbHkgd3Jvbmcgb3IsIHBlcmhhcHMsCi15b3UncmUgbm90IGV2ZW4gc29sdmluZyB0aGUgcmlnaHQgcHJvYmxlbS4KLQotQW5kcmV3IE1vcnRvbiBoYXMgc3VnZ2VzdGVkIHRoYXQgZXZlcnkgcmV2aWV3IGNvbW1lbnQgd2hpY2ggZG9lcyBub3QgcmVzdWx0Ci1pbiBhIGNvZGUgY2hhbmdlIHNob3VsZCByZXN1bHQgaW4gYW4gYWRkaXRpb25hbCBjb2RlIGNvbW1lbnQgaW5zdGVhZDsgdGhhdAotY2FuIGhlbHAgZnV0dXJlIHJldmlld2VycyBhdm9pZCB0aGUgcXVlc3Rpb25zIHdoaWNoIGNhbWUgdXAgdGhlIGZpcnN0IHRpbWUKLWFyb3VuZC4KLQotT25lIGZhdGFsIG1pc3Rha2UgaXMgdG8gaWdub3JlIHJldmlldyBjb21tZW50cyBpbiB0aGUgaG9wZSB0aGF0IHRoZXkgd2lsbAotZ28gYXdheS4gIFRoZXkgd2lsbCBub3QgZ28gYXdheS4gIElmIHlvdSByZXBvc3QgY29kZSB3aXRob3V0IGhhdmluZwotcmVzcG9uZGVkIHRvIHRoZSBjb21tZW50cyB5b3UgZ290IHRoZSB0aW1lIGJlZm9yZSwgeW91J3JlIGxpa2VseSB0byBmaW5kCi10aGF0IHlvdXIgcGF0Y2hlcyBnbyBub3doZXJlLgotCi1TcGVha2luZyBvZiByZXBvc3RpbmcgY29kZTogcGxlYXNlIGJlYXIgaW4gbWluZCB0aGF0IHJldmlld2VycyBhcmUgbm90Ci1nb2luZyB0byByZW1lbWJlciBhbGwgdGhlIGRldGFpbHMgb2YgdGhlIGNvZGUgeW91IHBvc3RlZCB0aGUgbGFzdCB0aW1lCi1hcm91bmQuICBTbyBpdCBpcyBhbHdheXMgYSBnb29kIGlkZWEgdG8gcmVtaW5kIHJldmlld2VycyBvZiBwcmV2aW91c2x5Ci1yYWlzZWQgaXNzdWVzIGFuZCBob3cgeW91IGRlYWx0IHdpdGggdGhlbTsgdGhlIHBhdGNoIGNoYW5nZWxvZyBpcyBhIGdvb2QKLXBsYWNlIGZvciB0aGlzIGtpbmQgb2YgaW5mb3JtYXRpb24uICBSZXZpZXdlcnMgc2hvdWxkIG5vdCBoYXZlIHRvIHNlYXJjaAotdGhyb3VnaCBsaXN0IGFyY2hpdmVzIHRvIGZhbWlsaWFyaXplIHRoZW1zZWx2ZXMgd2l0aCB3aGF0IHdhcyBzYWlkIGxhc3QKLXRpbWU7IGlmIHlvdSBoZWxwIHRoZW0gZ2V0IGEgcnVubmluZyBzdGFydCwgdGhleSB3aWxsIGJlIGluIGEgYmV0dGVyIG1vb2QKLXdoZW4gdGhleSByZXZpc2l0IHlvdXIgY29kZS4KLQotV2hhdCBpZiB5b3UndmUgdHJpZWQgdG8gZG8gZXZlcnl0aGluZyByaWdodCBhbmQgdGhpbmdzIHN0aWxsIGFyZW4ndCBnb2luZwotYW55d2hlcmU/ICBNb3N0IHRlY2huaWNhbCBkaXNhZ3JlZW1lbnRzIGNhbiBiZSByZXNvbHZlZCB0aHJvdWdoIGRpc2N1c3Npb24sCi1idXQgdGhlcmUgYXJlIHRpbWVzIHdoZW4gc29tZWJvZHkgc2ltcGx5IGhhcyB0byBtYWtlIGEgZGVjaXNpb24uICBJZiB5b3UKLWhvbmVzdGx5IGJlbGlldmUgdGhhdCB0aGlzIGRlY2lzaW9uIGlzIGdvaW5nIGFnYWluc3QgeW91IHdyb25nbHksIHlvdSBjYW4KLWFsd2F5cyB0cnkgYXBwZWFsaW5nIHRvIGEgaGlnaGVyIHBvd2VyLiAgQXMgb2YgdGhpcyB3cml0aW5nLCB0aGF0IGhpZ2hlcgotcG93ZXIgdGVuZHMgdG8gYmUgQW5kcmV3IE1vcnRvbi4gIEFuZHJldyBoYXMgYSBncmVhdCBkZWFsIG9mIHJlc3BlY3QgaW4gdGhlCi1rZXJuZWwgZGV2ZWxvcG1lbnQgY29tbXVuaXR5OyBoZSBjYW4gb2Z0ZW4gdW5qYW0gYSBzaXR1YXRpb24gd2hpY2ggc2VlbXMgdG8KLWJlIGhvcGVsZXNzbHkgYmxvY2tlZC4gIEFwcGVhbGluZyB0byBBbmRyZXcgc2hvdWxkIG5vdCBiZSBkb25lIGxpZ2h0bHksCi10aG91Z2gsIGFuZCBub3QgYmVmb3JlIGFsbCBvdGhlciBhbHRlcm5hdGl2ZXMgaGF2ZSBiZWVuIGV4cGxvcmVkLiAgQW5kIGJlYXIKLWluIG1pbmQsIG9mIGNvdXJzZSwgdGhhdCBoZSBtYXkgbm90IGFncmVlIHdpdGggeW91IGVpdGhlci4KLQotCi02LjI6IFdIQVQgSEFQUEVOUyBORVhUCi0KLUlmIGEgcGF0Y2ggaXMgY29uc2lkZXJlZCB0byBiZSBhIGdvb2QgdGhpbmcgdG8gYWRkIHRvIHRoZSBrZXJuZWwsIGFuZCBvbmNlCi1tb3N0IG9mIHRoZSByZXZpZXcgaXNzdWVzIGhhdmUgYmVlbiByZXNvbHZlZCwgdGhlIG5leHQgc3RlcCBpcyB1c3VhbGx5Ci1lbnRyeSBpbnRvIGEgc3Vic3lzdGVtIG1haW50YWluZXIncyB0cmVlLiAgSG93IHRoYXQgd29ya3MgdmFyaWVzIGZyb20gb25lCi1zdWJzeXN0ZW0gdG8gdGhlIG5leHQ7IGVhY2ggbWFpbnRhaW5lciBoYXMgaGlzIG9yIGhlciBvd24gd2F5IG9mIGRvaW5nCi10aGluZ3MuICBJbiBwYXJ0aWN1bGFyLCB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSB0cmVlIC0gb25lLCBwZXJoYXBzLAotZGVkaWNhdGVkIHRvIHBhdGNoZXMgcGxhbm5lZCBmb3IgdGhlIG5leHQgbWVyZ2Ugd2luZG93LCBhbmQgYW5vdGhlciBmb3IKLWxvbmdlci10ZXJtIHdvcmsuCi0KLUZvciBwYXRjaGVzIGFwcGx5aW5nIHRvIGFyZWFzIGZvciB3aGljaCB0aGVyZSBpcyBubyBvYnZpb3VzIHN1YnN5c3RlbSB0cmVlCi0obWVtb3J5IG1hbmFnZW1lbnQgcGF0Y2hlcywgZm9yIGV4YW1wbGUpLCB0aGUgZGVmYXVsdCB0cmVlIG9mdGVuIGVuZHMgdXAKLWJlaW5nIC1tbS4gIFBhdGNoZXMgd2hpY2ggYWZmZWN0IG11bHRpcGxlIHN1YnN5c3RlbXMgY2FuIGFsc28gZW5kIHVwIGdvaW5nCi10aHJvdWdoIHRoZSAtbW0gdHJlZS4KLQotSW5jbHVzaW9uIGludG8gYSBzdWJzeXN0ZW0gdHJlZSBjYW4gYnJpbmcgYSBoaWdoZXIgbGV2ZWwgb2YgdmlzaWJpbGl0eSB0byBhCi1wYXRjaC4gIE5vdyBvdGhlciBkZXZlbG9wZXJzIHdvcmtpbmcgd2l0aCB0aGF0IHRyZWUgd2lsbCBnZXQgdGhlIHBhdGNoIGJ5Ci1kZWZhdWx0LiAgU3Vic3lzdGVtIHRyZWVzIHR5cGljYWxseSBmZWVkIGxpbnV4LW5leHQgYXMgd2VsbCwgbWFraW5nIHRoZWlyCi1jb250ZW50cyB2aXNpYmxlIHRvIHRoZSBkZXZlbG9wbWVudCBjb21tdW5pdHkgYXMgYSB3aG9sZS4gIEF0IHRoaXMgcG9pbnQsCi10aGVyZSdzIGEgZ29vZCBjaGFuY2UgdGhhdCB5b3Ugd2lsbCBnZXQgbW9yZSBjb21tZW50cyBmcm9tIGEgbmV3IHNldCBvZgotcmV2aWV3ZXJzOyB0aGVzZSBjb21tZW50cyBuZWVkIHRvIGJlIGFuc3dlcmVkIGFzIGluIHRoZSBwcmV2aW91cyByb3VuZC4KLQotV2hhdCBtYXkgYWxzbyBoYXBwZW4gYXQgdGhpcyBwb2ludCwgZGVwZW5kaW5nIG9uIHRoZSBuYXR1cmUgb2YgeW91ciBwYXRjaCwKLWlzIHRoYXQgY29uZmxpY3RzIHdpdGggd29yayBiZWluZyBkb25lIGJ5IG90aGVycyB0dXJuIHVwLiAgSW4gdGhlIHdvcnN0Ci1jYXNlLCBoZWF2eSBwYXRjaCBjb25mbGljdHMgY2FuIHJlc3VsdCBpbiBzb21lIHdvcmsgYmVpbmcgcHV0IG9uIHRoZSBiYWNrCi1idXJuZXIgc28gdGhhdCB0aGUgcmVtYWluaW5nIHBhdGNoZXMgY2FuIGJlIHdvcmtlZCBpbnRvIHNoYXBlIGFuZCBtZXJnZWQuCi1PdGhlciB0aW1lcywgY29uZmxpY3QgcmVzb2x1dGlvbiB3aWxsIGludm9sdmUgd29ya2luZyB3aXRoIHRoZSBvdGhlcgotZGV2ZWxvcGVycyBhbmQsIHBvc3NpYmx5LCBtb3Zpbmcgc29tZSBwYXRjaGVzIGJldHdlZW4gdHJlZXMgdG8gZW5zdXJlIHRoYXQKLWV2ZXJ5dGhpbmcgYXBwbGllcyBjbGVhbmx5LiAgVGhpcyB3b3JrIGNhbiBiZSBhIHBhaW4sIGJ1dCBjb3VudCB5b3VyCi1ibGVzc2luZ3M6IGJlZm9yZSB0aGUgYWR2ZW50IG9mIHRoZSBsaW51eC1uZXh0IHRyZWUsIHRoZXNlIGNvbmZsaWN0cyBvZnRlbgotb25seSB0dXJuZWQgdXAgZHVyaW5nIHRoZSBtZXJnZSB3aW5kb3cgYW5kIGhhZCB0byBiZSBhZGRyZXNzZWQgaW4gYSBodXJyeS4KLU5vdyB0aGV5IGNhbiBiZSByZXNvbHZlZCBhdCBsZWlzdXJlLCBiZWZvcmUgdGhlIG1lcmdlIHdpbmRvdyBvcGVucy4KLQotU29tZSBkYXksIGlmIGFsbCBnb2VzIHdlbGwsIHlvdSdsbCBsb2cgb24gYW5kIHNlZSB0aGF0IHlvdXIgcGF0Y2ggaGFzIGJlZW4KLW1lcmdlZCBpbnRvIHRoZSBtYWlubGluZSBrZXJuZWwuICBDb25ncmF0dWxhdGlvbnMhICBPbmNlIHRoZSBjZWxlYnJhdGlvbiBpcwotY29tcGxldGUgKGFuZCB5b3UgaGF2ZSBhZGRlZCB5b3Vyc2VsZiB0byB0aGUgTUFJTlRBSU5FUlMgZmlsZSksIHRob3VnaCwgaXQKLWlzIHdvcnRoIHJlbWVtYmVyaW5nIGFuIGltcG9ydGFudCBsaXR0bGUgZmFjdDogdGhlIGpvYiBzdGlsbCBpcyBub3QgZG9uZS4KLU1lcmdpbmcgaW50byB0aGUgbWFpbmxpbmUgYnJpbmdzIGl0cyBvd24gY2hhbGxlbmdlcy4KLQotVG8gYmVnaW4gd2l0aCwgdGhlIHZpc2liaWxpdHkgb2YgeW91ciBwYXRjaCBoYXMgaW5jcmVhc2VkIHlldCBhZ2Fpbi4gIFRoZXJlCi1tYXkgYmUgYSBuZXcgcm91bmQgb2YgY29tbWVudHMgZnJvbSBkZXZlbG9wZXJzIHdobyBoYWQgbm90IGJlZW4gYXdhcmUgb2YKLXRoZSBwYXRjaCBiZWZvcmUuICBJdCBtYXkgYmUgdGVtcHRpbmcgdG8gaWdub3JlIHRoZW0sIHNpbmNlIHRoZXJlIGlzIG5vCi1sb25nZXIgYW55IHF1ZXN0aW9uIG9mIHlvdXIgY29kZSBiZWluZyBtZXJnZWQuICBSZXNpc3QgdGhhdCB0ZW1wdGF0aW9uLAotdGhvdWdoOyB5b3Ugc3RpbGwgbmVlZCB0byBiZSByZXNwb25zaXZlIHRvIGRldmVsb3BlcnMgd2hvIGhhdmUgcXVlc3Rpb25zIG9yCi1zdWdnZXN0aW9ucy4KLQotTW9yZSBpbXBvcnRhbnRseSwgdGhvdWdoOiBpbmNsdXNpb24gaW50byB0aGUgbWFpbmxpbmUgcHV0cyB5b3VyIGNvZGUgaW50bwotdGhlIGhhbmRzIG9mIGEgbXVjaCBsYXJnZXIgZ3JvdXAgb2YgdGVzdGVycy4gIEV2ZW4gaWYgeW91IGhhdmUgY29udHJpYnV0ZWQKLWEgZHJpdmVyIGZvciBoYXJkd2FyZSB3aGljaCBpcyBub3QgeWV0IGF2YWlsYWJsZSwgeW91IHdpbGwgYmUgc3VycHJpc2VkIGJ5Ci1ob3cgbWFueSBwZW9wbGUgd2lsbCBidWlsZCB5b3VyIGNvZGUgaW50byB0aGVpciBrZXJuZWxzLiAgQW5kLCBvZiBjb3Vyc2UsCi13aGVyZSB0aGVyZSBhcmUgdGVzdGVycywgdGhlcmUgd2lsbCBiZSBidWcgcmVwb3J0cy4KLQotVGhlIHdvcnN0IHNvcnQgb2YgYnVnIHJlcG9ydHMgYXJlIHJlZ3Jlc3Npb25zLiAgSWYgeW91ciBwYXRjaCBjYXVzZXMgYQotcmVncmVzc2lvbiwgeW91J2xsIGZpbmQgYW4gdW5jb21mb3J0YWJsZSBudW1iZXIgb2YgZXllcyB1cG9uIHlvdTsKLXJlZ3Jlc3Npb25zIG5lZWQgdG8gYmUgZml4ZWQgYXMgc29vbiBhcyBwb3NzaWJsZS4gIElmIHlvdSBhcmUgdW53aWxsaW5nIG9yCi11bmFibGUgdG8gZml4IHRoZSByZWdyZXNzaW9uIChhbmQgbm9ib2R5IGVsc2UgZG9lcyBpdCBmb3IgeW91KSwgeW91ciBwYXRjaAotd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIHJlbW92ZWQgZHVyaW5nIHRoZSBzdGFiaWxpemF0aW9uIHBlcmlvZC4gIEJleW9uZAotbmVnYXRpbmcgYWxsIG9mIHRoZSB3b3JrIHlvdSBoYXZlIGRvbmUgdG8gZ2V0IHlvdXIgcGF0Y2ggaW50byB0aGUgbWFpbmxpbmUsCi1oYXZpbmcgYSBwYXRjaCBwdWxsZWQgYXMgdGhlIHJlc3VsdCBvZiBhIGZhaWx1cmUgdG8gZml4IGEgcmVncmVzc2lvbiBjb3VsZAotd2VsbCBtYWtlIGl0IGhhcmRlciBmb3IgeW91IHRvIGdldCB3b3JrIG1lcmdlZCBpbiB0aGUgZnV0dXJlLgotCi1BZnRlciBhbnkgcmVncmVzc2lvbnMgaGF2ZSBiZWVuIGRlYWx0IHdpdGgsIHRoZXJlIG1heSBiZSBvdGhlciwgb3JkaW5hcnkKLWJ1Z3MgdG8gZGVhbCB3aXRoLiAgVGhlIHN0YWJpbGl6YXRpb24gcGVyaW9kIGlzIHlvdXIgYmVzdCBvcHBvcnR1bml0eSB0bwotZml4IHRoZXNlIGJ1Z3MgYW5kIGVuc3VyZSB0aGF0IHlvdXIgY29kZSdzIGRlYnV0IGluIGEgbWFpbmxpbmUga2VybmVsCi1yZWxlYXNlIGlzIGFzIHNvbGlkIGFzIHBvc3NpYmxlLiAgU28sIHBsZWFzZSwgYW5zd2VyIGJ1ZyByZXBvcnRzLCBhbmQgZml4Ci10aGUgcHJvYmxlbXMgaWYgYXQgYWxsIHBvc3NpYmxlLiAgVGhhdCdzIHdoYXQgdGhlIHN0YWJpbGl6YXRpb24gcGVyaW9kIGlzCi1mb3I7IHlvdSBjYW4gc3RhcnQgY3JlYXRpbmcgY29vbCBuZXcgcGF0Y2hlcyBvbmNlIGFueSBwcm9ibGVtcyB3aXRoIHRoZSBvbGQKLW9uZXMgaGF2ZSBiZWVuIHRha2VuIGNhcmUgb2YuCi0KLUFuZCBkb24ndCBmb3JnZXQgdGhhdCB0aGVyZSBhcmUgb3RoZXIgbWlsZXN0b25lcyB3aGljaCBtYXkgYWxzbyBjcmVhdGUgYnVnCi1yZXBvcnRzOiB0aGUgbmV4dCBtYWlubGluZSBzdGFibGUgcmVsZWFzZSwgd2hlbiBwcm9taW5lbnQgZGlzdHJpYnV0b3JzIHBpY2sKLXVwIGEgdmVyc2lvbiBvZiB0aGUga2VybmVsIGNvbnRhaW5pbmcgeW91ciBwYXRjaCwgZXRjLiAgQ29udGludWluZyB0bwotcmVzcG9uZCB0byB0aGVzZSByZXBvcnRzIGlzIGEgbWF0dGVyIG9mIGJhc2ljIHByaWRlIGluIHlvdXIgd29yay4gIElmIHRoYXQKLWlzIGluc3VmZmljaWVudCBtb3RpdmF0aW9uLCB0aG91Z2gsIGl0J3MgYWxzbyB3b3J0aCBjb25zaWRlcmluZyB0aGF0IHRoZQotZGV2ZWxvcG1lbnQgY29tbXVuaXR5IHJlbWVtYmVycyBkZXZlbG9wZXJzIHdobyBsb3NlIGludGVyZXN0IGluIHRoZWlyIGNvZGUKLWFmdGVyIGl0J3MgbWVyZ2VkLiAgVGhlIG5leHQgdGltZSB5b3UgcG9zdCBhIHBhdGNoLCB0aGV5IHdpbGwgYmUgZXZhbHVhdGluZwotaXQgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHlvdSB3aWxsIG5vdCBiZSBhcm91bmQgdG8gbWFpbnRhaW4gaXQKLWFmdGVyd2FyZC4KLQotCi02LjM6IE9USEVSIFRISU5HUyBUSEFUIENBTiBIQVBQRU4KLQotT25lIGRheSwgeW91IG1heSBvcGVuIHlvdXIgbWFpbCBjbGllbnQgYW5kIHNlZSB0aGF0IHNvbWVib2R5IGhhcyBtYWlsZWQgeW91Ci1hIHBhdGNoIHRvIHlvdXIgY29kZS4gIFRoYXQgaXMgb25lIG9mIHRoZSBhZHZhbnRhZ2VzIG9mIGhhdmluZyB5b3VyIGNvZGUKLW91dCB0aGVyZSBpbiB0aGUgb3BlbiwgYWZ0ZXIgYWxsLiAgSWYgeW91IGFncmVlIHdpdGggdGhlIHBhdGNoLCB5b3UgY2FuCi1laXRoZXIgZm9yd2FyZCBpdCBvbiB0byB0aGUgc3Vic3lzdGVtIG1haW50YWluZXIgKGJlIHN1cmUgdG8gaW5jbHVkZSBhCi1wcm9wZXIgRnJvbTogbGluZSBzbyB0aGF0IHRoZSBhdHRyaWJ1dGlvbiBpcyBjb3JyZWN0LCBhbmQgYWRkIGEgc2lnbm9mZiBvZgoteW91ciBvd24pLCBvciBzZW5kIGFuIEFja2VkLWJ5OiByZXNwb25zZSBiYWNrIGFuZCBsZXQgdGhlIG9yaWdpbmFsIHBvc3Rlcgotc2VuZCBpdCB1cHdhcmQuCi0KLUlmIHlvdSBkaXNhZ3JlZSB3aXRoIHRoZSBwYXRjaCwgc2VuZCBhIHBvbGl0ZSByZXNwb25zZSBleHBsYWluaW5nIHdoeS4gIElmCi1wb3NzaWJsZSwgdGVsbCB0aGUgYXV0aG9yIHdoYXQgY2hhbmdlcyBuZWVkIHRvIGJlIG1hZGUgdG8gbWFrZSB0aGUgcGF0Y2gKLWFjY2VwdGFibGUgdG8geW91LiAgVGhlcmUgaXMgYSBjZXJ0YWluIHJlc2lzdGFuY2UgdG8gbWVyZ2luZyBwYXRjaGVzIHdoaWNoCi1hcmUgb3Bwb3NlZCBieSB0aGUgYXV0aG9yIGFuZCBtYWludGFpbmVyIG9mIHRoZSBjb2RlLCBidXQgaXQgb25seSBnb2VzIHNvCi1mYXIuICBJZiB5b3UgYXJlIHNlZW4gYXMgbmVlZGxlc3NseSBibG9ja2luZyBnb29kIHdvcmssIHRob3NlIHBhdGNoZXMgd2lsbAotZXZlbnR1YWxseSBmbG93IGFyb3VuZCB5b3UgYW5kIGdldCBpbnRvIHRoZSBtYWlubGluZSBhbnl3YXkuICBJbiB0aGUgTGludXgKLWtlcm5lbCwgbm9ib2R5IGhhcyBhYnNvbHV0ZSB2ZXRvIHBvd2VyIG92ZXIgYW55IGNvZGUuICBFeGNlcHQgbWF5YmUgTGludXMuCi0KLU9uIHZlcnkgcmFyZSBvY2Nhc2lvbiwgeW91IG1heSBzZWUgc29tZXRoaW5nIGNvbXBsZXRlbHkgZGlmZmVyZW50OiBhbm90aGVyCi1kZXZlbG9wZXIgcG9zdHMgYSBkaWZmZXJlbnQgc29sdXRpb24gdG8geW91ciBwcm9ibGVtLiAgQXQgdGhhdCBwb2ludCwKLWNoYW5jZXMgYXJlIHRoYXQgb25lIG9mIHRoZSB0d28gcGF0Y2hlcyB3aWxsIG5vdCBiZSBtZXJnZWQsIGFuZCAibWluZSB3YXMKLWhlcmUgZmlyc3QiIGlzIG5vdCBjb25zaWRlcmVkIHRvIGJlIGEgY29tcGVsbGluZyB0ZWNobmljYWwgYXJndW1lbnQuICBJZgotc29tZWJvZHkgZWxzZSdzIHBhdGNoIGRpc3BsYWNlcyB5b3VycyBhbmQgZ2V0cyBpbnRvIHRoZSBtYWlubGluZSwgdGhlcmUgaXMKLXJlYWxseSBvbmx5IG9uZSB3YXkgdG8gcmVzcG9uZDogYmUgcGxlYXNlZCB0aGF0IHlvdXIgcHJvYmxlbSBnb3Qgc29sdmVkIGFuZAotZ2V0IG9uIHdpdGggeW91ciB3b3JrLiAgSGF2aW5nIG9uZSdzIHdvcmsgc2hvdmVkIGFzaWRlIGluIHRoaXMgbWFubmVyIGNhbgotYmUgaHVydGZ1bCBhbmQgZGlzY291cmFnaW5nLCBidXQgdGhlIGNvbW11bml0eSB3aWxsIHJlbWVtYmVyIHlvdXIgcmVhY3Rpb24KLWxvbmcgYWZ0ZXIgdGhleSBoYXZlIGZvcmdvdHRlbiB3aG9zZSBwYXRjaCBhY3R1YWxseSBnb3QgbWVyZ2VkLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzYuRm9sbG93dGhyb3VnaC5yc3QgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNi5Gb2xsb3d0aHJvdWdoLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTczY2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzYuRm9sbG93dGhyb3VnaC5yc3QKQEAgLTAsMCArMSwyMTIgQEAKKy4uIF9kZXZlbG9wbWVudF9mb2xsb3d0aHJvdWdoOgorCitGb2xsb3d0aHJvdWdoCis9PT09PT09PT09PT09CisKK0F0IHRoaXMgcG9pbnQsIHlvdSBoYXZlIGZvbGxvd2VkIHRoZSBndWlkZWxpbmVzIGdpdmVuIHNvIGZhciBhbmQsIHdpdGggdGhlCithZGRpdGlvbiBvZiB5b3VyIG93biBlbmdpbmVlcmluZyBza2lsbHMsIGhhdmUgcG9zdGVkIGEgcGVyZmVjdCBzZXJpZXMgb2YKK3BhdGNoZXMuICBPbmUgb2YgdGhlIGJpZ2dlc3QgbWlzdGFrZXMgdGhhdCBldmVuIGV4cGVyaWVuY2VkIGtlcm5lbAorZGV2ZWxvcGVycyBjYW4gbWFrZSBpcyB0byBjb25jbHVkZSB0aGF0IHRoZWlyIHdvcmsgaXMgbm93IGRvbmUuICBJbiB0cnV0aCwKK3Bvc3RpbmcgcGF0Y2hlcyBpbmRpY2F0ZXMgYSB0cmFuc2l0aW9uIGludG8gdGhlIG5leHQgc3RhZ2Ugb2YgdGhlIHByb2Nlc3MsCit3aXRoLCBwb3NzaWJseSwgcXVpdGUgYSBiaXQgb2Ygd29yayB5ZXQgdG8gYmUgZG9uZS4KKworSXQgaXMgYSByYXJlIHBhdGNoIHdoaWNoIGlzIHNvIGdvb2QgYXQgaXRzIGZpcnN0IHBvc3RpbmcgdGhhdCB0aGVyZSBpcyBubworcm9vbSBmb3IgaW1wcm92ZW1lbnQuICBUaGUga2VybmVsIGRldmVsb3BtZW50IHByb2Nlc3MgcmVjb2duaXplcyB0aGlzIGZhY3QsCithbmQsIGFzIGEgcmVzdWx0LCBpcyBoZWF2aWx5IG9yaWVudGVkIHRvd2FyZCB0aGUgaW1wcm92ZW1lbnQgb2YgcG9zdGVkCitjb2RlLiAgWW91LCBhcyB0aGUgYXV0aG9yIG9mIHRoYXQgY29kZSwgd2lsbCBiZSBleHBlY3RlZCB0byB3b3JrIHdpdGggdGhlCitrZXJuZWwgY29tbXVuaXR5IHRvIGVuc3VyZSB0aGF0IHlvdXIgY29kZSBpcyB1cCB0byB0aGUga2VybmVsJ3MgcXVhbGl0eQorc3RhbmRhcmRzLiAgQSBmYWlsdXJlIHRvIHBhcnRpY2lwYXRlIGluIHRoaXMgcHJvY2VzcyBpcyBxdWl0ZSBsaWtlbHkgdG8KK3ByZXZlbnQgdGhlIGluY2x1c2lvbiBvZiB5b3VyIHBhdGNoZXMgaW50byB0aGUgbWFpbmxpbmUuCisKKworV29ya2luZyB3aXRoIHJldmlld2VycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBIHBhdGNoIG9mIGFueSBzaWduaWZpY2FuY2Ugd2lsbCByZXN1bHQgaW4gYSBudW1iZXIgb2YgY29tbWVudHMgZnJvbSBvdGhlcgorZGV2ZWxvcGVycyBhcyB0aGV5IHJldmlldyB0aGUgY29kZS4gIFdvcmtpbmcgd2l0aCByZXZpZXdlcnMgY2FuIGJlLCBmb3IKK21hbnkgZGV2ZWxvcGVycywgdGhlIG1vc3QgaW50aW1pZGF0aW5nIHBhcnQgb2YgdGhlIGtlcm5lbCBkZXZlbG9wbWVudAorcHJvY2Vzcy4gIExpZmUgY2FuIGJlIG1hZGUgbXVjaCBlYXNpZXIsIHRob3VnaCwgaWYgeW91IGtlZXAgYSBmZXcgdGhpbmdzIGluCittaW5kOgorCisgLSBJZiB5b3UgaGF2ZSBleHBsYWluZWQgeW91ciBwYXRjaCB3ZWxsLCByZXZpZXdlcnMgd2lsbCB1bmRlcnN0YW5kIGl0cworICAgdmFsdWUgYW5kIHdoeSB5b3Ugd2VudCB0byB0aGUgdHJvdWJsZSBvZiB3cml0aW5nIGl0LiAgQnV0IHRoYXQgdmFsdWUKKyAgIHdpbGwgbm90IGtlZXAgdGhlbSBmcm9tIGFza2luZyBhIGZ1bmRhbWVudGFsIHF1ZXN0aW9uOiB3aGF0IHdpbGwgaXQgYmUKKyAgIGxpa2UgdG8gbWFpbnRhaW4gYSBrZXJuZWwgd2l0aCB0aGlzIGNvZGUgaW4gaXQgZml2ZSBvciB0ZW4geWVhcnMgbGF0ZXI/CisgICBNYW55IG9mIHRoZSBjaGFuZ2VzIHlvdSBtYXkgYmUgYXNrZWQgdG8gbWFrZSAtIGZyb20gY29kaW5nIHN0eWxlIHR3ZWFrcworICAgdG8gc3Vic3RhbnRpYWwgcmV3cml0ZXMgLSBjb21lIGZyb20gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBMaW51eCB3aWxsCisgICBzdGlsbCBiZSBhcm91bmQgYW5kIHVuZGVyIGRldmVsb3BtZW50IGEgZGVjYWRlIGZyb20gbm93LgorCisgLSBDb2RlIHJldmlldyBpcyBoYXJkIHdvcmssIGFuZCBpdCBpcyBhIHJlbGF0aXZlbHkgdGhhbmtsZXNzIG9jY3VwYXRpb247CisgICBwZW9wbGUgcmVtZW1iZXIgd2hvIHdyb3RlIGtlcm5lbCBjb2RlLCBidXQgdGhlcmUgaXMgbGl0dGxlIGxhc3RpbmcgZmFtZQorICAgZm9yIHRob3NlIHdobyByZXZpZXdlZCBpdC4gIFNvIHJldmlld2VycyBjYW4gZ2V0IGdydW1weSwgZXNwZWNpYWxseSB3aGVuCisgICB0aGV5IHNlZSB0aGUgc2FtZSBtaXN0YWtlcyBiZWluZyBtYWRlIG92ZXIgYW5kIG92ZXIgYWdhaW4uICBJZiB5b3UgZ2V0IGEKKyAgIHJldmlldyB3aGljaCBzZWVtcyBhbmdyeSwgaW5zdWx0aW5nLCBvciBvdXRyaWdodCBvZmZlbnNpdmUsIHJlc2lzdCB0aGUKKyAgIGltcHVsc2UgdG8gcmVzcG9uZCBpbiBraW5kLiAgQ29kZSByZXZpZXcgaXMgYWJvdXQgdGhlIGNvZGUsIG5vdCBhYm91dAorICAgdGhlIHBlb3BsZSwgYW5kIGNvZGUgcmV2aWV3ZXJzIGFyZSBub3QgYXR0YWNraW5nIHlvdSBwZXJzb25hbGx5LgorCisgLSBTaW1pbGFybHksIGNvZGUgcmV2aWV3ZXJzIGFyZSBub3QgdHJ5aW5nIHRvIHByb21vdGUgdGhlaXIgZW1wbG95ZXJzJworICAgYWdlbmRhcyBhdCB0aGUgZXhwZW5zZSBvZiB5b3VyIG93bi4gIEtlcm5lbCBkZXZlbG9wZXJzIG9mdGVuIGV4cGVjdCB0bworICAgYmUgd29ya2luZyBvbiB0aGUga2VybmVsIHllYXJzIGZyb20gbm93LCBidXQgdGhleSB1bmRlcnN0YW5kIHRoYXQgdGhlaXIKKyAgIGVtcGxveWVyIGNvdWxkIGNoYW5nZS4gIFRoZXkgdHJ1bHkgYXJlLCBhbG1vc3Qgd2l0aG91dCBleGNlcHRpb24sCisgICB3b3JraW5nIHRvd2FyZCB0aGUgY3JlYXRpb24gb2YgdGhlIGJlc3Qga2VybmVsIHRoZXkgY2FuOyB0aGV5IGFyZSBub3QKKyAgIHRyeWluZyB0byBjcmVhdGUgZGlzY29tZm9ydCBmb3IgdGhlaXIgZW1wbG95ZXJzJyBjb21wZXRpdG9ycy4KKworV2hhdCBhbGwgb2YgdGhpcyBjb21lcyBkb3duIHRvIGlzIHRoYXQsIHdoZW4gcmV2aWV3ZXJzIHNlbmQgeW91IGNvbW1lbnRzLAoreW91IG5lZWQgdG8gcGF5IGF0dGVudGlvbiB0byB0aGUgdGVjaG5pY2FsIG9ic2VydmF0aW9ucyB0aGF0IHRoZXkgYXJlCittYWtpbmcuICBEbyBub3QgbGV0IHRoZWlyIGZvcm0gb2YgZXhwcmVzc2lvbiBvciB5b3VyIG93biBwcmlkZSBrZWVwIHRoYXQKK2Zyb20gaGFwcGVuaW5nLiAgV2hlbiB5b3UgZ2V0IHJldmlldyBjb21tZW50cyBvbiBhIHBhdGNoLCB0YWtlIHRoZSB0aW1lIHRvCit1bmRlcnN0YW5kIHdoYXQgdGhlIHJldmlld2VyIGlzIHRyeWluZyB0byBzYXkuICBJZiBwb3NzaWJsZSwgZml4IHRoZSB0aGluZ3MKK3RoYXQgdGhlIHJldmlld2VyIGlzIGFza2luZyB5b3UgdG8gZml4LiAgQW5kIHJlc3BvbmQgYmFjayB0byB0aGUgcmV2aWV3ZXI6Cit0aGFuayB0aGVtLCBhbmQgZGVzY3JpYmUgaG93IHlvdSB3aWxsIGFuc3dlciB0aGVpciBxdWVzdGlvbnMuCisKK05vdGUgdGhhdCB5b3UgZG8gbm90IGhhdmUgdG8gYWdyZWUgd2l0aCBldmVyeSBjaGFuZ2Ugc3VnZ2VzdGVkIGJ5CityZXZpZXdlcnMuICBJZiB5b3UgYmVsaWV2ZSB0aGF0IHRoZSByZXZpZXdlciBoYXMgbWlzdW5kZXJzdG9vZCB5b3VyIGNvZGUsCitleHBsYWluIHdoYXQgaXMgcmVhbGx5IGdvaW5nIG9uLiAgSWYgeW91IGhhdmUgYSB0ZWNobmljYWwgb2JqZWN0aW9uIHRvIGEKK3N1Z2dlc3RlZCBjaGFuZ2UsIGRlc2NyaWJlIGl0IGFuZCBqdXN0aWZ5IHlvdXIgc29sdXRpb24gdG8gdGhlIHByb2JsZW0uICBJZgoreW91ciBleHBsYW5hdGlvbnMgbWFrZSBzZW5zZSwgdGhlIHJldmlld2VyIHdpbGwgYWNjZXB0IHRoZW0uICBTaG91bGQgeW91cgorZXhwbGFuYXRpb24gbm90IHByb3ZlIHBlcnN1YXNpdmUsIHRob3VnaCwgZXNwZWNpYWxseSBpZiBvdGhlcnMgc3RhcnQgdG8KK2FncmVlIHdpdGggdGhlIHJldmlld2VyLCB0YWtlIHNvbWUgdGltZSB0byB0aGluayB0aGluZ3Mgb3ZlciBhZ2Fpbi4gIEl0IGNhbgorYmUgZWFzeSB0byBiZWNvbWUgYmxpbmRlZCBieSB5b3VyIG93biBzb2x1dGlvbiB0byBhIHByb2JsZW0gdG8gdGhlIHBvaW50Cit0aGF0IHlvdSBkb24ndCByZWFsaXplIHRoYXQgc29tZXRoaW5nIGlzIGZ1bmRhbWVudGFsbHkgd3Jvbmcgb3IsIHBlcmhhcHMsCit5b3UncmUgbm90IGV2ZW4gc29sdmluZyB0aGUgcmlnaHQgcHJvYmxlbS4KKworQW5kcmV3IE1vcnRvbiBoYXMgc3VnZ2VzdGVkIHRoYXQgZXZlcnkgcmV2aWV3IGNvbW1lbnQgd2hpY2ggZG9lcyBub3QgcmVzdWx0CitpbiBhIGNvZGUgY2hhbmdlIHNob3VsZCByZXN1bHQgaW4gYW4gYWRkaXRpb25hbCBjb2RlIGNvbW1lbnQgaW5zdGVhZDsgdGhhdAorY2FuIGhlbHAgZnV0dXJlIHJldmlld2VycyBhdm9pZCB0aGUgcXVlc3Rpb25zIHdoaWNoIGNhbWUgdXAgdGhlIGZpcnN0IHRpbWUKK2Fyb3VuZC4KKworT25lIGZhdGFsIG1pc3Rha2UgaXMgdG8gaWdub3JlIHJldmlldyBjb21tZW50cyBpbiB0aGUgaG9wZSB0aGF0IHRoZXkgd2lsbAorZ28gYXdheS4gIFRoZXkgd2lsbCBub3QgZ28gYXdheS4gIElmIHlvdSByZXBvc3QgY29kZSB3aXRob3V0IGhhdmluZworcmVzcG9uZGVkIHRvIHRoZSBjb21tZW50cyB5b3UgZ290IHRoZSB0aW1lIGJlZm9yZSwgeW91J3JlIGxpa2VseSB0byBmaW5kCit0aGF0IHlvdXIgcGF0Y2hlcyBnbyBub3doZXJlLgorCitTcGVha2luZyBvZiByZXBvc3RpbmcgY29kZTogcGxlYXNlIGJlYXIgaW4gbWluZCB0aGF0IHJldmlld2VycyBhcmUgbm90Citnb2luZyB0byByZW1lbWJlciBhbGwgdGhlIGRldGFpbHMgb2YgdGhlIGNvZGUgeW91IHBvc3RlZCB0aGUgbGFzdCB0aW1lCithcm91bmQuICBTbyBpdCBpcyBhbHdheXMgYSBnb29kIGlkZWEgdG8gcmVtaW5kIHJldmlld2VycyBvZiBwcmV2aW91c2x5CityYWlzZWQgaXNzdWVzIGFuZCBob3cgeW91IGRlYWx0IHdpdGggdGhlbTsgdGhlIHBhdGNoIGNoYW5nZWxvZyBpcyBhIGdvb2QKK3BsYWNlIGZvciB0aGlzIGtpbmQgb2YgaW5mb3JtYXRpb24uICBSZXZpZXdlcnMgc2hvdWxkIG5vdCBoYXZlIHRvIHNlYXJjaAordGhyb3VnaCBsaXN0IGFyY2hpdmVzIHRvIGZhbWlsaWFyaXplIHRoZW1zZWx2ZXMgd2l0aCB3aGF0IHdhcyBzYWlkIGxhc3QKK3RpbWU7IGlmIHlvdSBoZWxwIHRoZW0gZ2V0IGEgcnVubmluZyBzdGFydCwgdGhleSB3aWxsIGJlIGluIGEgYmV0dGVyIG1vb2QKK3doZW4gdGhleSByZXZpc2l0IHlvdXIgY29kZS4KKworV2hhdCBpZiB5b3UndmUgdHJpZWQgdG8gZG8gZXZlcnl0aGluZyByaWdodCBhbmQgdGhpbmdzIHN0aWxsIGFyZW4ndCBnb2luZworYW55d2hlcmU/ICBNb3N0IHRlY2huaWNhbCBkaXNhZ3JlZW1lbnRzIGNhbiBiZSByZXNvbHZlZCB0aHJvdWdoIGRpc2N1c3Npb24sCitidXQgdGhlcmUgYXJlIHRpbWVzIHdoZW4gc29tZWJvZHkgc2ltcGx5IGhhcyB0byBtYWtlIGEgZGVjaXNpb24uICBJZiB5b3UKK2hvbmVzdGx5IGJlbGlldmUgdGhhdCB0aGlzIGRlY2lzaW9uIGlzIGdvaW5nIGFnYWluc3QgeW91IHdyb25nbHksIHlvdSBjYW4KK2Fsd2F5cyB0cnkgYXBwZWFsaW5nIHRvIGEgaGlnaGVyIHBvd2VyLiAgQXMgb2YgdGhpcyB3cml0aW5nLCB0aGF0IGhpZ2hlcgorcG93ZXIgdGVuZHMgdG8gYmUgQW5kcmV3IE1vcnRvbi4gIEFuZHJldyBoYXMgYSBncmVhdCBkZWFsIG9mIHJlc3BlY3QgaW4gdGhlCitrZXJuZWwgZGV2ZWxvcG1lbnQgY29tbXVuaXR5OyBoZSBjYW4gb2Z0ZW4gdW5qYW0gYSBzaXR1YXRpb24gd2hpY2ggc2VlbXMgdG8KK2JlIGhvcGVsZXNzbHkgYmxvY2tlZC4gIEFwcGVhbGluZyB0byBBbmRyZXcgc2hvdWxkIG5vdCBiZSBkb25lIGxpZ2h0bHksCit0aG91Z2gsIGFuZCBub3QgYmVmb3JlIGFsbCBvdGhlciBhbHRlcm5hdGl2ZXMgaGF2ZSBiZWVuIGV4cGxvcmVkLiAgQW5kIGJlYXIKK2luIG1pbmQsIG9mIGNvdXJzZSwgdGhhdCBoZSBtYXkgbm90IGFncmVlIHdpdGggeW91IGVpdGhlci4KKworCitXaGF0IGhhcHBlbnMgbmV4dAorLS0tLS0tLS0tLS0tLS0tLS0KKworSWYgYSBwYXRjaCBpcyBjb25zaWRlcmVkIHRvIGJlIGEgZ29vZCB0aGluZyB0byBhZGQgdG8gdGhlIGtlcm5lbCwgYW5kIG9uY2UKK21vc3Qgb2YgdGhlIHJldmlldyBpc3N1ZXMgaGF2ZSBiZWVuIHJlc29sdmVkLCB0aGUgbmV4dCBzdGVwIGlzIHVzdWFsbHkKK2VudHJ5IGludG8gYSBzdWJzeXN0ZW0gbWFpbnRhaW5lcidzIHRyZWUuICBIb3cgdGhhdCB3b3JrcyB2YXJpZXMgZnJvbSBvbmUKK3N1YnN5c3RlbSB0byB0aGUgbmV4dDsgZWFjaCBtYWludGFpbmVyIGhhcyBoaXMgb3IgaGVyIG93biB3YXkgb2YgZG9pbmcKK3RoaW5ncy4gIEluIHBhcnRpY3VsYXIsIHRoZXJlIG1heSBiZSBtb3JlIHRoYW4gb25lIHRyZWUgLSBvbmUsIHBlcmhhcHMsCitkZWRpY2F0ZWQgdG8gcGF0Y2hlcyBwbGFubmVkIGZvciB0aGUgbmV4dCBtZXJnZSB3aW5kb3csIGFuZCBhbm90aGVyIGZvcgorbG9uZ2VyLXRlcm0gd29yay4KKworRm9yIHBhdGNoZXMgYXBwbHlpbmcgdG8gYXJlYXMgZm9yIHdoaWNoIHRoZXJlIGlzIG5vIG9idmlvdXMgc3Vic3lzdGVtIHRyZWUKKyhtZW1vcnkgbWFuYWdlbWVudCBwYXRjaGVzLCBmb3IgZXhhbXBsZSksIHRoZSBkZWZhdWx0IHRyZWUgb2Z0ZW4gZW5kcyB1cAorYmVpbmcgLW1tLiAgUGF0Y2hlcyB3aGljaCBhZmZlY3QgbXVsdGlwbGUgc3Vic3lzdGVtcyBjYW4gYWxzbyBlbmQgdXAgZ29pbmcKK3Rocm91Z2ggdGhlIC1tbSB0cmVlLgorCitJbmNsdXNpb24gaW50byBhIHN1YnN5c3RlbSB0cmVlIGNhbiBicmluZyBhIGhpZ2hlciBsZXZlbCBvZiB2aXNpYmlsaXR5IHRvIGEKK3BhdGNoLiAgTm93IG90aGVyIGRldmVsb3BlcnMgd29ya2luZyB3aXRoIHRoYXQgdHJlZSB3aWxsIGdldCB0aGUgcGF0Y2ggYnkKK2RlZmF1bHQuICBTdWJzeXN0ZW0gdHJlZXMgdHlwaWNhbGx5IGZlZWQgbGludXgtbmV4dCBhcyB3ZWxsLCBtYWtpbmcgdGhlaXIKK2NvbnRlbnRzIHZpc2libGUgdG8gdGhlIGRldmVsb3BtZW50IGNvbW11bml0eSBhcyBhIHdob2xlLiAgQXQgdGhpcyBwb2ludCwKK3RoZXJlJ3MgYSBnb29kIGNoYW5jZSB0aGF0IHlvdSB3aWxsIGdldCBtb3JlIGNvbW1lbnRzIGZyb20gYSBuZXcgc2V0IG9mCityZXZpZXdlcnM7IHRoZXNlIGNvbW1lbnRzIG5lZWQgdG8gYmUgYW5zd2VyZWQgYXMgaW4gdGhlIHByZXZpb3VzIHJvdW5kLgorCitXaGF0IG1heSBhbHNvIGhhcHBlbiBhdCB0aGlzIHBvaW50LCBkZXBlbmRpbmcgb24gdGhlIG5hdHVyZSBvZiB5b3VyIHBhdGNoLAoraXMgdGhhdCBjb25mbGljdHMgd2l0aCB3b3JrIGJlaW5nIGRvbmUgYnkgb3RoZXJzIHR1cm4gdXAuICBJbiB0aGUgd29yc3QKK2Nhc2UsIGhlYXZ5IHBhdGNoIGNvbmZsaWN0cyBjYW4gcmVzdWx0IGluIHNvbWUgd29yayBiZWluZyBwdXQgb24gdGhlIGJhY2sKK2J1cm5lciBzbyB0aGF0IHRoZSByZW1haW5pbmcgcGF0Y2hlcyBjYW4gYmUgd29ya2VkIGludG8gc2hhcGUgYW5kIG1lcmdlZC4KK090aGVyIHRpbWVzLCBjb25mbGljdCByZXNvbHV0aW9uIHdpbGwgaW52b2x2ZSB3b3JraW5nIHdpdGggdGhlIG90aGVyCitkZXZlbG9wZXJzIGFuZCwgcG9zc2libHksIG1vdmluZyBzb21lIHBhdGNoZXMgYmV0d2VlbiB0cmVlcyB0byBlbnN1cmUgdGhhdAorZXZlcnl0aGluZyBhcHBsaWVzIGNsZWFubHkuICBUaGlzIHdvcmsgY2FuIGJlIGEgcGFpbiwgYnV0IGNvdW50IHlvdXIKK2JsZXNzaW5nczogYmVmb3JlIHRoZSBhZHZlbnQgb2YgdGhlIGxpbnV4LW5leHQgdHJlZSwgdGhlc2UgY29uZmxpY3RzIG9mdGVuCitvbmx5IHR1cm5lZCB1cCBkdXJpbmcgdGhlIG1lcmdlIHdpbmRvdyBhbmQgaGFkIHRvIGJlIGFkZHJlc3NlZCBpbiBhIGh1cnJ5LgorTm93IHRoZXkgY2FuIGJlIHJlc29sdmVkIGF0IGxlaXN1cmUsIGJlZm9yZSB0aGUgbWVyZ2Ugd2luZG93IG9wZW5zLgorCitTb21lIGRheSwgaWYgYWxsIGdvZXMgd2VsbCwgeW91J2xsIGxvZyBvbiBhbmQgc2VlIHRoYXQgeW91ciBwYXRjaCBoYXMgYmVlbgorbWVyZ2VkIGludG8gdGhlIG1haW5saW5lIGtlcm5lbC4gIENvbmdyYXR1bGF0aW9ucyEgIE9uY2UgdGhlIGNlbGVicmF0aW9uIGlzCitjb21wbGV0ZSAoYW5kIHlvdSBoYXZlIGFkZGVkIHlvdXJzZWxmIHRvIHRoZSBNQUlOVEFJTkVSUyBmaWxlKSwgdGhvdWdoLCBpdAoraXMgd29ydGggcmVtZW1iZXJpbmcgYW4gaW1wb3J0YW50IGxpdHRsZSBmYWN0OiB0aGUgam9iIHN0aWxsIGlzIG5vdCBkb25lLgorTWVyZ2luZyBpbnRvIHRoZSBtYWlubGluZSBicmluZ3MgaXRzIG93biBjaGFsbGVuZ2VzLgorCitUbyBiZWdpbiB3aXRoLCB0aGUgdmlzaWJpbGl0eSBvZiB5b3VyIHBhdGNoIGhhcyBpbmNyZWFzZWQgeWV0IGFnYWluLiAgVGhlcmUKK21heSBiZSBhIG5ldyByb3VuZCBvZiBjb21tZW50cyBmcm9tIGRldmVsb3BlcnMgd2hvIGhhZCBub3QgYmVlbiBhd2FyZSBvZgordGhlIHBhdGNoIGJlZm9yZS4gIEl0IG1heSBiZSB0ZW1wdGluZyB0byBpZ25vcmUgdGhlbSwgc2luY2UgdGhlcmUgaXMgbm8KK2xvbmdlciBhbnkgcXVlc3Rpb24gb2YgeW91ciBjb2RlIGJlaW5nIG1lcmdlZC4gIFJlc2lzdCB0aGF0IHRlbXB0YXRpb24sCit0aG91Z2g7IHlvdSBzdGlsbCBuZWVkIHRvIGJlIHJlc3BvbnNpdmUgdG8gZGV2ZWxvcGVycyB3aG8gaGF2ZSBxdWVzdGlvbnMgb3IKK3N1Z2dlc3Rpb25zLgorCitNb3JlIGltcG9ydGFudGx5LCB0aG91Z2g6IGluY2x1c2lvbiBpbnRvIHRoZSBtYWlubGluZSBwdXRzIHlvdXIgY29kZSBpbnRvCit0aGUgaGFuZHMgb2YgYSBtdWNoIGxhcmdlciBncm91cCBvZiB0ZXN0ZXJzLiAgRXZlbiBpZiB5b3UgaGF2ZSBjb250cmlidXRlZAorYSBkcml2ZXIgZm9yIGhhcmR3YXJlIHdoaWNoIGlzIG5vdCB5ZXQgYXZhaWxhYmxlLCB5b3Ugd2lsbCBiZSBzdXJwcmlzZWQgYnkKK2hvdyBtYW55IHBlb3BsZSB3aWxsIGJ1aWxkIHlvdXIgY29kZSBpbnRvIHRoZWlyIGtlcm5lbHMuICBBbmQsIG9mIGNvdXJzZSwKK3doZXJlIHRoZXJlIGFyZSB0ZXN0ZXJzLCB0aGVyZSB3aWxsIGJlIGJ1ZyByZXBvcnRzLgorCitUaGUgd29yc3Qgc29ydCBvZiBidWcgcmVwb3J0cyBhcmUgcmVncmVzc2lvbnMuICBJZiB5b3VyIHBhdGNoIGNhdXNlcyBhCityZWdyZXNzaW9uLCB5b3UnbGwgZmluZCBhbiB1bmNvbWZvcnRhYmxlIG51bWJlciBvZiBleWVzIHVwb24geW91OworcmVncmVzc2lvbnMgbmVlZCB0byBiZSBmaXhlZCBhcyBzb29uIGFzIHBvc3NpYmxlLiAgSWYgeW91IGFyZSB1bndpbGxpbmcgb3IKK3VuYWJsZSB0byBmaXggdGhlIHJlZ3Jlc3Npb24gKGFuZCBub2JvZHkgZWxzZSBkb2VzIGl0IGZvciB5b3UpLCB5b3VyIHBhdGNoCit3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgcmVtb3ZlZCBkdXJpbmcgdGhlIHN0YWJpbGl6YXRpb24gcGVyaW9kLiAgQmV5b25kCituZWdhdGluZyBhbGwgb2YgdGhlIHdvcmsgeW91IGhhdmUgZG9uZSB0byBnZXQgeW91ciBwYXRjaCBpbnRvIHRoZSBtYWlubGluZSwKK2hhdmluZyBhIHBhdGNoIHB1bGxlZCBhcyB0aGUgcmVzdWx0IG9mIGEgZmFpbHVyZSB0byBmaXggYSByZWdyZXNzaW9uIGNvdWxkCit3ZWxsIG1ha2UgaXQgaGFyZGVyIGZvciB5b3UgdG8gZ2V0IHdvcmsgbWVyZ2VkIGluIHRoZSBmdXR1cmUuCisKK0FmdGVyIGFueSByZWdyZXNzaW9ucyBoYXZlIGJlZW4gZGVhbHQgd2l0aCwgdGhlcmUgbWF5IGJlIG90aGVyLCBvcmRpbmFyeQorYnVncyB0byBkZWFsIHdpdGguICBUaGUgc3RhYmlsaXphdGlvbiBwZXJpb2QgaXMgeW91ciBiZXN0IG9wcG9ydHVuaXR5IHRvCitmaXggdGhlc2UgYnVncyBhbmQgZW5zdXJlIHRoYXQgeW91ciBjb2RlJ3MgZGVidXQgaW4gYSBtYWlubGluZSBrZXJuZWwKK3JlbGVhc2UgaXMgYXMgc29saWQgYXMgcG9zc2libGUuICBTbywgcGxlYXNlLCBhbnN3ZXIgYnVnIHJlcG9ydHMsIGFuZCBmaXgKK3RoZSBwcm9ibGVtcyBpZiBhdCBhbGwgcG9zc2libGUuICBUaGF0J3Mgd2hhdCB0aGUgc3RhYmlsaXphdGlvbiBwZXJpb2QgaXMKK2ZvcjsgeW91IGNhbiBzdGFydCBjcmVhdGluZyBjb29sIG5ldyBwYXRjaGVzIG9uY2UgYW55IHByb2JsZW1zIHdpdGggdGhlIG9sZAorb25lcyBoYXZlIGJlZW4gdGFrZW4gY2FyZSBvZi4KKworQW5kIGRvbid0IGZvcmdldCB0aGF0IHRoZXJlIGFyZSBvdGhlciBtaWxlc3RvbmVzIHdoaWNoIG1heSBhbHNvIGNyZWF0ZSBidWcKK3JlcG9ydHM6IHRoZSBuZXh0IG1haW5saW5lIHN0YWJsZSByZWxlYXNlLCB3aGVuIHByb21pbmVudCBkaXN0cmlidXRvcnMgcGljawordXAgYSB2ZXJzaW9uIG9mIHRoZSBrZXJuZWwgY29udGFpbmluZyB5b3VyIHBhdGNoLCBldGMuICBDb250aW51aW5nIHRvCityZXNwb25kIHRvIHRoZXNlIHJlcG9ydHMgaXMgYSBtYXR0ZXIgb2YgYmFzaWMgcHJpZGUgaW4geW91ciB3b3JrLiAgSWYgdGhhdAoraXMgaW5zdWZmaWNpZW50IG1vdGl2YXRpb24sIHRob3VnaCwgaXQncyBhbHNvIHdvcnRoIGNvbnNpZGVyaW5nIHRoYXQgdGhlCitkZXZlbG9wbWVudCBjb21tdW5pdHkgcmVtZW1iZXJzIGRldmVsb3BlcnMgd2hvIGxvc2UgaW50ZXJlc3QgaW4gdGhlaXIgY29kZQorYWZ0ZXIgaXQncyBtZXJnZWQuICBUaGUgbmV4dCB0aW1lIHlvdSBwb3N0IGEgcGF0Y2gsIHRoZXkgd2lsbCBiZSBldmFsdWF0aW5nCitpdCB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgeW91IHdpbGwgbm90IGJlIGFyb3VuZCB0byBtYWludGFpbiBpdAorYWZ0ZXJ3YXJkLgorCisKK090aGVyIHRoaW5ncyB0aGF0IGNhbiBoYXBwZW4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK09uZSBkYXksIHlvdSBtYXkgb3BlbiB5b3VyIG1haWwgY2xpZW50IGFuZCBzZWUgdGhhdCBzb21lYm9keSBoYXMgbWFpbGVkIHlvdQorYSBwYXRjaCB0byB5b3VyIGNvZGUuICBUaGF0IGlzIG9uZSBvZiB0aGUgYWR2YW50YWdlcyBvZiBoYXZpbmcgeW91ciBjb2RlCitvdXQgdGhlcmUgaW4gdGhlIG9wZW4sIGFmdGVyIGFsbC4gIElmIHlvdSBhZ3JlZSB3aXRoIHRoZSBwYXRjaCwgeW91IGNhbgorZWl0aGVyIGZvcndhcmQgaXQgb24gdG8gdGhlIHN1YnN5c3RlbSBtYWludGFpbmVyIChiZSBzdXJlIHRvIGluY2x1ZGUgYQorcHJvcGVyIEZyb206IGxpbmUgc28gdGhhdCB0aGUgYXR0cmlidXRpb24gaXMgY29ycmVjdCwgYW5kIGFkZCBhIHNpZ25vZmYgb2YKK3lvdXIgb3duKSwgb3Igc2VuZCBhbiBBY2tlZC1ieTogcmVzcG9uc2UgYmFjayBhbmQgbGV0IHRoZSBvcmlnaW5hbCBwb3N0ZXIKK3NlbmQgaXQgdXB3YXJkLgorCitJZiB5b3UgZGlzYWdyZWUgd2l0aCB0aGUgcGF0Y2gsIHNlbmQgYSBwb2xpdGUgcmVzcG9uc2UgZXhwbGFpbmluZyB3aHkuICBJZgorcG9zc2libGUsIHRlbGwgdGhlIGF1dGhvciB3aGF0IGNoYW5nZXMgbmVlZCB0byBiZSBtYWRlIHRvIG1ha2UgdGhlIHBhdGNoCithY2NlcHRhYmxlIHRvIHlvdS4gIFRoZXJlIGlzIGEgY2VydGFpbiByZXNpc3RhbmNlIHRvIG1lcmdpbmcgcGF0Y2hlcyB3aGljaAorYXJlIG9wcG9zZWQgYnkgdGhlIGF1dGhvciBhbmQgbWFpbnRhaW5lciBvZiB0aGUgY29kZSwgYnV0IGl0IG9ubHkgZ29lcyBzbworZmFyLiAgSWYgeW91IGFyZSBzZWVuIGFzIG5lZWRsZXNzbHkgYmxvY2tpbmcgZ29vZCB3b3JrLCB0aG9zZSBwYXRjaGVzIHdpbGwKK2V2ZW50dWFsbHkgZmxvdyBhcm91bmQgeW91IGFuZCBnZXQgaW50byB0aGUgbWFpbmxpbmUgYW55d2F5LiAgSW4gdGhlIExpbnV4CitrZXJuZWwsIG5vYm9keSBoYXMgYWJzb2x1dGUgdmV0byBwb3dlciBvdmVyIGFueSBjb2RlLiAgRXhjZXB0IG1heWJlIExpbnVzLgorCitPbiB2ZXJ5IHJhcmUgb2NjYXNpb24sIHlvdSBtYXkgc2VlIHNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudDogYW5vdGhlcgorZGV2ZWxvcGVyIHBvc3RzIGEgZGlmZmVyZW50IHNvbHV0aW9uIHRvIHlvdXIgcHJvYmxlbS4gIEF0IHRoYXQgcG9pbnQsCitjaGFuY2VzIGFyZSB0aGF0IG9uZSBvZiB0aGUgdHdvIHBhdGNoZXMgd2lsbCBub3QgYmUgbWVyZ2VkLCBhbmQgIm1pbmUgd2FzCitoZXJlIGZpcnN0IiBpcyBub3QgY29uc2lkZXJlZCB0byBiZSBhIGNvbXBlbGxpbmcgdGVjaG5pY2FsIGFyZ3VtZW50LiAgSWYKK3NvbWVib2R5IGVsc2UncyBwYXRjaCBkaXNwbGFjZXMgeW91cnMgYW5kIGdldHMgaW50byB0aGUgbWFpbmxpbmUsIHRoZXJlIGlzCityZWFsbHkgb25seSBvbmUgd2F5IHRvIHJlc3BvbmQ6IGJlIHBsZWFzZWQgdGhhdCB5b3VyIHByb2JsZW0gZ290IHNvbHZlZCBhbmQKK2dldCBvbiB3aXRoIHlvdXIgd29yay4gIEhhdmluZyBvbmUncyB3b3JrIHNob3ZlZCBhc2lkZSBpbiB0aGlzIG1hbm5lciBjYW4KK2JlIGh1cnRmdWwgYW5kIGRpc2NvdXJhZ2luZywgYnV0IHRoZSBjb21tdW5pdHkgd2lsbCByZW1lbWJlciB5b3VyIHJlYWN0aW9uCitsb25nIGFmdGVyIHRoZXkgaGF2ZSBmb3Jnb3R0ZW4gd2hvc2UgcGF0Y2ggYWN0dWFsbHkgZ290IG1lcmdlZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy83LkFkdmFuY2VkVG9waWNzIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzcuQWR2YW5jZWRUb3BpY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZGMzZmEuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzcuQWR2YW5jZWRUb3BpY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotNzogQURWQU5DRUQgVE9QSUNTCi0KLUF0IHRoaXMgcG9pbnQsIGhvcGVmdWxseSwgeW91IGhhdmUgYSBoYW5kbGUgb24gaG93IHRoZSBkZXZlbG9wbWVudCBwcm9jZXNzCi13b3Jrcy4gIFRoZXJlIGlzIHN0aWxsIG1vcmUgdG8gbGVhcm4sIGhvd2V2ZXIhICBUaGlzIHNlY3Rpb24gd2lsbCBjb3ZlciBhCi1udW1iZXIgb2YgdG9waWNzIHdoaWNoIGNhbiBiZSBoZWxwZnVsIGZvciBkZXZlbG9wZXJzIHdhbnRpbmcgdG8gYmVjb21lIGEKLXJlZ3VsYXIgcGFydCBvZiB0aGUgTGludXgga2VybmVsIGRldmVsb3BtZW50IHByb2Nlc3MuCi0KLTcuMTogTUFOQUdJTkcgUEFUQ0hFUyBXSVRIIEdJVAotCi1UaGUgdXNlIG9mIGRpc3RyaWJ1dGVkIHZlcnNpb24gY29udHJvbCBmb3IgdGhlIGtlcm5lbCBiZWdhbiBpbiBlYXJseSAyMDAyLAotd2hlbiBMaW51cyBmaXJzdCBzdGFydGVkIHBsYXlpbmcgd2l0aCB0aGUgcHJvcHJpZXRhcnkgQml0S2VlcGVyCi1hcHBsaWNhdGlvbi4gIFdoaWxlIEJpdEtlZXBlciB3YXMgY29udHJvdmVyc2lhbCwgdGhlIGFwcHJvYWNoIHRvIHNvZnR3YXJlCi12ZXJzaW9uIG1hbmFnZW1lbnQgaXQgZW1ib2RpZWQgbW9zdCBjZXJ0YWlubHkgd2FzIG5vdC4gIERpc3RyaWJ1dGVkIHZlcnNpb24KLWNvbnRyb2wgZW5hYmxlZCBhbiBpbW1lZGlhdGUgYWNjZWxlcmF0aW9uIG9mIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQKLXByb2plY3QuICBJbiBjdXJyZW50IHRpbWVzLCB0aGVyZSBhcmUgc2V2ZXJhbCBmcmVlIGFsdGVybmF0aXZlcyB0bwotQml0S2VlcGVyLiAgRm9yIGJldHRlciBvciBmb3Igd29yc2UsIHRoZSBrZXJuZWwgcHJvamVjdCBoYXMgc2V0dGxlZCBvbiBnaXQKLWFzIGl0cyB0b29sIG9mIGNob2ljZS4KLQotTWFuYWdpbmcgcGF0Y2hlcyB3aXRoIGdpdCBjYW4gbWFrZSBsaWZlIG11Y2ggZWFzaWVyIGZvciB0aGUgZGV2ZWxvcGVyLAotZXNwZWNpYWxseSBhcyB0aGUgdm9sdW1lIG9mIHRob3NlIHBhdGNoZXMgZ3Jvd3MuICBHaXQgYWxzbyBoYXMgaXRzIHJvdWdoCi1lZGdlcyBhbmQgcG9zZXMgY2VydGFpbiBoYXphcmRzOyBpdCBpcyBhIHlvdW5nIGFuZCBwb3dlcmZ1bCB0b29sIHdoaWNoIGlzCi1zdGlsbCBiZWluZyBjaXZpbGl6ZWQgYnkgaXRzIGRldmVsb3BlcnMuICBUaGlzIGRvY3VtZW50IHdpbGwgbm90IGF0dGVtcHQgdG8KLXRlYWNoIHRoZSByZWFkZXIgaG93IHRvIHVzZSBnaXQ7IHRoYXQgd291bGQgYmUgc3VmZmljaWVudCBtYXRlcmlhbCBmb3IgYQotbG9uZyBkb2N1bWVudCBpbiBpdHMgb3duIHJpZ2h0LiAgSW5zdGVhZCwgdGhlIGZvY3VzIGhlcmUgd2lsbCBiZSBvbiBob3cgZ2l0Ci1maXRzIGludG8gdGhlIGtlcm5lbCBkZXZlbG9wbWVudCBwcm9jZXNzIGluIHBhcnRpY3VsYXIuICBEZXZlbG9wZXJzIHdobwotd2lzaCB0byBjb21lIHVwIHRvIHNwZWVkIHdpdGggZ2l0IHdpbGwgZmluZCBtb3JlIGluZm9ybWF0aW9uIGF0OgotCi0JaHR0cDovL2dpdC1zY20uY29tLwotCi0JaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0L2RvY3MvdXNlci1tYW51YWwuaHRtbAotCi1hbmQgb24gdmFyaW91cyB0dXRvcmlhbHMgZm91bmQgb24gdGhlIHdlYi4KLQotVGhlIGZpcnN0IG9yZGVyIG9mIGJ1c2luZXNzIGlzIHRvIHJlYWQgdGhlIGFib3ZlIHNpdGVzIGFuZCBnZXQgYSBzb2xpZAotdW5kZXJzdGFuZGluZyBvZiBob3cgZ2l0IHdvcmtzIGJlZm9yZSB0cnlpbmcgdG8gdXNlIGl0IHRvIG1ha2UgcGF0Y2hlcwotYXZhaWxhYmxlIHRvIG90aGVycy4gIEEgZ2l0LXVzaW5nIGRldmVsb3BlciBzaG91bGQgYmUgYWJsZSB0byBvYnRhaW4gYSBjb3B5Ci1vZiB0aGUgbWFpbmxpbmUgcmVwb3NpdG9yeSwgZXhwbG9yZSB0aGUgcmV2aXNpb24gaGlzdG9yeSwgY29tbWl0IGNoYW5nZXMgdG8KLXRoZSB0cmVlLCB1c2UgYnJhbmNoZXMsIGV0Yy4gIEFuIHVuZGVyc3RhbmRpbmcgb2YgZ2l0J3MgdG9vbHMgZm9yIHRoZQotcmV3cml0aW5nIG9mIGhpc3RvcnkgKHN1Y2ggYXMgcmViYXNlKSBpcyBhbHNvIHVzZWZ1bC4gIEdpdCBjb21lcyB3aXRoIGl0cwotb3duIHRlcm1pbm9sb2d5IGFuZCBjb25jZXB0czsgYSBuZXcgdXNlciBvZiBnaXQgc2hvdWxkIGtub3cgYWJvdXQgcmVmcywKLXJlbW90ZSBicmFuY2hlcywgdGhlIGluZGV4LCBmYXN0LWZvcndhcmQgbWVyZ2VzLCBwdXNoZXMgYW5kIHB1bGxzLCBkZXRhY2hlZAotaGVhZHMsIGV0Yy4gIEl0IGNhbiBhbGwgYmUgYSBsaXR0bGUgaW50aW1pZGF0aW5nIGF0IHRoZSBvdXRzZXQsIGJ1dCB0aGUKLWNvbmNlcHRzIGFyZSBub3QgdGhhdCBoYXJkIHRvIGdyYXNwIHdpdGggYSBiaXQgb2Ygc3R1ZHkuCi0KLVVzaW5nIGdpdCB0byBnZW5lcmF0ZSBwYXRjaGVzIGZvciBzdWJtaXNzaW9uIGJ5IGVtYWlsIGNhbiBiZSBhIGdvb2QKLWV4ZXJjaXNlIHdoaWxlIGNvbWluZyB1cCB0byBzcGVlZC4KLQotV2hlbiB5b3UgYXJlIHJlYWR5IHRvIHN0YXJ0IHB1dHRpbmcgdXAgZ2l0IHRyZWVzIGZvciBvdGhlcnMgdG8gbG9vayBhdCwgeW91Ci13aWxsLCBvZiBjb3Vyc2UsIG5lZWQgYSBzZXJ2ZXIgdGhhdCBjYW4gYmUgcHVsbGVkIGZyb20uICBTZXR0aW5nIHVwIHN1Y2ggYQotc2VydmVyIHdpdGggZ2l0LWRhZW1vbiBpcyByZWxhdGl2ZWx5IHN0cmFpZ2h0Zm9yd2FyZCBpZiB5b3UgaGF2ZSBhIHN5c3RlbQotd2hpY2ggaXMgYWNjZXNzaWJsZSB0byB0aGUgSW50ZXJuZXQuICBPdGhlcndpc2UsIGZyZWUsIHB1YmxpYyBob3N0aW5nIHNpdGVzCi0oR2l0aHViLCBmb3IgZXhhbXBsZSkgYXJlIHN0YXJ0aW5nIHRvIGFwcGVhciBvbiB0aGUgbmV0LiAgRXN0YWJsaXNoZWQKLWRldmVsb3BlcnMgY2FuIGdldCBhbiBhY2NvdW50IG9uIGtlcm5lbC5vcmcsIGJ1dCB0aG9zZSBhcmUgbm90IGVhc3kgdG8gY29tZQotYnk7IHNlZSBodHRwOi8va2VybmVsLm9yZy9mYXEvIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1UaGUgbm9ybWFsIGdpdCB3b3JrZmxvdyBpbnZvbHZlcyB0aGUgdXNlIG9mIGEgbG90IG9mIGJyYW5jaGVzLiAgRWFjaCBsaW5lCi1vZiBkZXZlbG9wbWVudCBjYW4gYmUgc2VwYXJhdGVkIGludG8gYSBzZXBhcmF0ZSAidG9waWMgYnJhbmNoIiBhbmQKLW1haW50YWluZWQgaW5kZXBlbmRlbnRseS4gIEJyYW5jaGVzIGluIGdpdCBhcmUgY2hlYXAsIHRoZXJlIGlzIG5vIHJlYXNvbiB0bwotbm90IG1ha2UgZnJlZSB1c2Ugb2YgdGhlbS4gIEFuZCwgaW4gYW55IGNhc2UsIHlvdSBzaG91bGQgbm90IGRvIHlvdXIKLWRldmVsb3BtZW50IGluIGFueSBicmFuY2ggd2hpY2ggeW91IGludGVuZCB0byBhc2sgb3RoZXJzIHRvIHB1bGwgZnJvbS4KLVB1YmxpY2x5LWF2YWlsYWJsZSBicmFuY2hlcyBzaG91bGQgYmUgY3JlYXRlZCB3aXRoIGNhcmU7IG1lcmdlIGluIHBhdGNoZXMKLWZyb20gZGV2ZWxvcG1lbnQgYnJhbmNoZXMgd2hlbiB0aGV5IGFyZSBpbiBjb21wbGV0ZSBmb3JtIGFuZCByZWFkeSB0byBnbyAtCi1ub3QgYmVmb3JlLgotCi1HaXQgcHJvdmlkZXMgc29tZSBwb3dlcmZ1bCB0b29scyB3aGljaCBjYW4gYWxsb3cgeW91IHRvIHJld3JpdGUgeW91cgotZGV2ZWxvcG1lbnQgaGlzdG9yeS4gIEFuIGluY29udmVuaWVudCBwYXRjaCAob25lIHdoaWNoIGJyZWFrcyBiaXNlY3Rpb24sCi1zYXksIG9yIHdoaWNoIGhhcyBzb21lIG90aGVyIHNvcnQgb2Ygb2J2aW91cyBidWcpIGNhbiBiZSBmaXhlZCBpbiBwbGFjZSBvcgotbWFkZSB0byBkaXNhcHBlYXIgZnJvbSB0aGUgaGlzdG9yeSBlbnRpcmVseS4gIEEgcGF0Y2ggc2VyaWVzIGNhbiBiZQotcmV3cml0dGVuIGFzIGlmIGl0IGhhZCBiZWVuIHdyaXR0ZW4gb24gdG9wIG9mIHRvZGF5J3MgbWFpbmxpbmUsIGV2ZW4gdGhvdWdoCi15b3UgaGF2ZSBiZWVuIHdvcmtpbmcgb24gaXQgZm9yIG1vbnRocy4gIENoYW5nZXMgY2FuIGJlIHRyYW5zcGFyZW50bHkKLXNoaWZ0ZWQgZnJvbSBvbmUgYnJhbmNoIHRvIGFub3RoZXIuICBBbmQgc28gb24uICBKdWRpY2lvdXMgdXNlIG9mIGdpdCdzCi1hYmlsaXR5IHRvIHJldmlzZSBoaXN0b3J5IGNhbiBoZWxwIGluIHRoZSBjcmVhdGlvbiBvZiBjbGVhbiBwYXRjaCBzZXRzIHdpdGgKLWZld2VyIHByb2JsZW1zLgotCi1FeGNlc3NpdmUgdXNlIG9mIHRoaXMgY2FwYWJpbGl0eSBjYW4gbGVhZCB0byBvdGhlciBwcm9ibGVtcywgdGhvdWdoLCBiZXlvbmQKLWEgc2ltcGxlIG9ic2Vzc2lvbiBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBwZXJmZWN0IHByb2plY3QgaGlzdG9yeS4KLVJld3JpdGluZyBoaXN0b3J5IHdpbGwgcmV3cml0ZSB0aGUgY2hhbmdlcyBjb250YWluZWQgaW4gdGhhdCBoaXN0b3J5LAotdHVybmluZyBhIHRlc3RlZCAoaG9wZWZ1bGx5KSBrZXJuZWwgdHJlZSBpbnRvIGFuIHVudGVzdGVkIG9uZS4gIEJ1dCwgYmV5b25kCi10aGF0LCBkZXZlbG9wZXJzIGNhbm5vdCBlYXNpbHkgY29sbGFib3JhdGUgaWYgdGhleSBkbyBub3QgaGF2ZSBhIHNoYXJlZAotdmlldyBvZiB0aGUgcHJvamVjdCBoaXN0b3J5OyBpZiB5b3UgcmV3cml0ZSBoaXN0b3J5IHdoaWNoIG90aGVyIGRldmVsb3BlcnMKLWhhdmUgcHVsbGVkIGludG8gdGhlaXIgcmVwb3NpdG9yaWVzLCB5b3Ugd2lsbCBtYWtlIGxpZmUgbXVjaCBtb3JlIGRpZmZpY3VsdAotZm9yIHRob3NlIGRldmVsb3BlcnMuICBTbyBhIHNpbXBsZSBydWxlIG9mIHRodW1iIGFwcGxpZXMgaGVyZTogaGlzdG9yeQotd2hpY2ggaGFzIGJlZW4gZXhwb3J0ZWQgdG8gb3RoZXJzIHNob3VsZCBnZW5lcmFsbHkgYmUgc2VlbiBhcyBpbW11dGFibGUKLXRoZXJlYWZ0ZXIuCi0KLVNvLCBvbmNlIHlvdSBwdXNoIGEgc2V0IG9mIGNoYW5nZXMgdG8geW91ciBwdWJsaWNseS1hdmFpbGFibGUgc2VydmVyLCB0aG9zZQotY2hhbmdlcyBzaG91bGQgbm90IGJlIHJld3JpdHRlbi4gIEdpdCB3aWxsIGF0dGVtcHQgdG8gZW5mb3JjZSB0aGlzIHJ1bGUgaWYKLXlvdSB0cnkgdG8gcHVzaCBjaGFuZ2VzIHdoaWNoIGRvIG5vdCByZXN1bHQgaW4gYSBmYXN0LWZvcndhcmQgbWVyZ2UKLShpLmUuIGNoYW5nZXMgd2hpY2ggZG8gbm90IHNoYXJlIHRoZSBzYW1lIGhpc3RvcnkpLiAgSXQgaXMgcG9zc2libGUgdG8KLW92ZXJyaWRlIHRoaXMgY2hlY2ssIGFuZCB0aGVyZSBtYXkgYmUgdGltZXMgd2hlbiBpdCBpcyBuZWNlc3NhcnkgdG8gcmV3cml0ZQotYW4gZXhwb3J0ZWQgdHJlZS4gIE1vdmluZyBjaGFuZ2VzZXRzIGJldHdlZW4gdHJlZXMgdG8gYXZvaWQgY29uZmxpY3RzIGluCi1saW51eC1uZXh0IGlzIG9uZSBleGFtcGxlLiAgQnV0IHN1Y2ggYWN0aW9ucyBzaG91bGQgYmUgcmFyZS4gIFRoaXMgaXMgb25lCi1vZiB0aGUgcmVhc29ucyB3aHkgZGV2ZWxvcG1lbnQgc2hvdWxkIGJlIGRvbmUgaW4gcHJpdmF0ZSBicmFuY2hlcyAod2hpY2gKLWNhbiBiZSByZXdyaXR0ZW4gaWYgbmVjZXNzYXJ5KSBhbmQgb25seSBtb3ZlZCBpbnRvIHB1YmxpYyBicmFuY2hlcyB3aGVuCi1pdCdzIGluIGEgcmVhc29uYWJseSBhZHZhbmNlZCBzdGF0ZS4KLQotQXMgdGhlIG1haW5saW5lIChvciBvdGhlciB0cmVlIHVwb24gd2hpY2ggYSBzZXQgb2YgY2hhbmdlcyBpcyBiYXNlZCkKLWFkdmFuY2VzLCBpdCBpcyB0ZW1wdGluZyB0byBtZXJnZSB3aXRoIHRoYXQgdHJlZSB0byBzdGF5IG9uIHRoZSBsZWFkaW5nCi1lZGdlLiAgRm9yIGEgcHJpdmF0ZSBicmFuY2gsIHJlYmFzaW5nIGNhbiBiZSBhbiBlYXN5IHdheSB0byBrZWVwIHVwIHdpdGgKLWFub3RoZXIgdHJlZSwgYnV0IHJlYmFzaW5nIGlzIG5vdCBhbiBvcHRpb24gb25jZSBhIHRyZWUgaXMgZXhwb3J0ZWQgdG8gdGhlCi13b3JsZC4gIE9uY2UgdGhhdCBoYXBwZW5zLCBhIGZ1bGwgbWVyZ2UgbXVzdCBiZSBkb25lLiAgTWVyZ2luZyBvY2Nhc2lvbmFsbHkKLW1ha2VzIGdvb2Qgc2Vuc2UsIGJ1dCBvdmVybHkgZnJlcXVlbnQgbWVyZ2VzIGNhbiBjbHV0dGVyIHRoZSBoaXN0b3J5Ci1uZWVkbGVzc2x5LiAgU3VnZ2VzdGVkIHRlY2huaXF1ZSBpbiB0aGlzIGNhc2UgaXMgdG8gbWVyZ2UgaW5mcmVxdWVudGx5LCBhbmQKLWdlbmVyYWxseSBvbmx5IGF0IHNwZWNpZmljIHJlbGVhc2UgcG9pbnRzIChzdWNoIGFzIGEgbWFpbmxpbmUgLXJjCi1yZWxlYXNlKS4gIElmIHlvdSBhcmUgbmVydm91cyBhYm91dCBzcGVjaWZpYyBjaGFuZ2VzLCB5b3UgY2FuIGFsd2F5cwotcGVyZm9ybSB0ZXN0IG1lcmdlcyBpbiBhIHByaXZhdGUgYnJhbmNoLiAgVGhlIGdpdCAicmVyZXJlIiB0b29sIGNhbiBiZQotdXNlZnVsIGluIHN1Y2ggc2l0dWF0aW9uczsgaXQgcmVtZW1iZXJzIGhvdyBtZXJnZSBjb25mbGljdHMgd2VyZSByZXNvbHZlZAotc28gdGhhdCB5b3UgZG9uJ3QgaGF2ZSB0byBkbyB0aGUgc2FtZSB3b3JrIHR3aWNlLgotCi1PbmUgb2YgdGhlIGJpZ2dlc3QgcmVjdXJyaW5nIGNvbXBsYWludHMgYWJvdXQgdG9vbHMgbGlrZSBnaXQgaXMgdGhpczogdGhlCi1tYXNzIG1vdmVtZW50IG9mIHBhdGNoZXMgZnJvbSBvbmUgcmVwb3NpdG9yeSB0byBhbm90aGVyIG1ha2VzIGl0IGVhc3kgdG8KLXNsaXAgaW4gaWxsLWFkdmlzZWQgY2hhbmdlcyB3aGljaCBnbyBpbnRvIHRoZSBtYWlubGluZSBiZWxvdyB0aGUgcmV2aWV3Ci1yYWRhci4gIEtlcm5lbCBkZXZlbG9wZXJzIHRlbmQgdG8gZ2V0IHVuaGFwcHkgd2hlbiB0aGV5IHNlZSB0aGF0IGtpbmQgb2YKLXRoaW5nIGhhcHBlbmluZzsgcHV0dGluZyB1cCBhIGdpdCB0cmVlIHdpdGggdW5yZXZpZXdlZCBvciBvZmYtdG9waWMgcGF0Y2hlcwotY2FuIGFmZmVjdCB5b3VyIGFiaWxpdHkgdG8gZ2V0IHRyZWVzIHB1bGxlZCBpbiB0aGUgZnV0dXJlLiAgUXVvdGluZyBMaW51czoKLQotCVlvdSBjYW4gc2VuZCBtZSBwYXRjaGVzLCBidXQgZm9yIG1lIHRvIHB1bGwgYSBnaXQgcGF0Y2ggZnJvbSB5b3UsIEkKLQluZWVkIHRvIGtub3cgdGhhdCB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZywgYW5kIEkgbmVlZCB0byBiZSBhYmxlCi0JdG8gdHJ1c3QgdGhpbmdzICp3aXRob3V0KiB0aGVuIGhhdmluZyB0byBnbyBhbmQgY2hlY2sgZXZlcnkKLQlpbmRpdmlkdWFsIGNoYW5nZSBieSBoYW5kLgotCi0oaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvMjI0MTM1LykuCi0KLVRvIGF2b2lkIHRoaXMga2luZCBvZiBzaXR1YXRpb24sIGVuc3VyZSB0aGF0IGFsbCBwYXRjaGVzIHdpdGhpbiBhIGdpdmVuCi1icmFuY2ggc3RpY2sgY2xvc2VseSB0byB0aGUgYXNzb2NpYXRlZCB0b3BpYzsgYSAiZHJpdmVyIGZpeGVzIiBicmFuY2gKLXNob3VsZCBub3QgYmUgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgY29kZS4gIEFuZCwgbW9zdAotaW1wb3J0YW50bHksIGRvIG5vdCB1c2UgYSBnaXQgdHJlZSB0byBieXBhc3MgdGhlIHJldmlldyBwcm9jZXNzLiAgUG9zdCBhbgotb2NjYXNpb25hbCBzdW1tYXJ5IG9mIHRoZSB0cmVlIHRvIHRoZSByZWxldmFudCBsaXN0LCBhbmQsIHdoZW4gdGhlIHRpbWUgaXMKLXJpZ2h0LCByZXF1ZXN0IHRoYXQgdGhlIHRyZWUgYmUgaW5jbHVkZWQgaW4gbGludXgtbmV4dC4KLQotSWYgYW5kIHdoZW4gb3RoZXJzIHN0YXJ0IHRvIHNlbmQgcGF0Y2hlcyBmb3IgaW5jbHVzaW9uIGludG8geW91ciB0cmVlLAotZG9uJ3QgZm9yZ2V0IHRvIHJldmlldyB0aGVtLiAgQWxzbyBlbnN1cmUgdGhhdCB5b3UgbWFpbnRhaW4gdGhlIGNvcnJlY3QKLWF1dGhvcnNoaXAgaW5mb3JtYXRpb247IHRoZSBnaXQgImFtIiB0b29sIGRvZXMgaXRzIGJlc3QgaW4gdGhpcyByZWdhcmQsIGJ1dAoteW91IG1heSBoYXZlIHRvIGFkZCBhICJGcm9tOiIgbGluZSB0byB0aGUgcGF0Y2ggaWYgaXQgaGFzIGJlZW4gcmVsYXllZCB0bwoteW91IHZpYSBhIHRoaXJkIHBhcnR5LgotCi1XaGVuIHJlcXVlc3RpbmcgYSBwdWxsLCBiZSBzdXJlIHRvIGdpdmUgYWxsIHRoZSByZWxldmFudCBpbmZvcm1hdGlvbjogd2hlcmUKLXlvdXIgdHJlZSBpcywgd2hhdCBicmFuY2ggdG8gcHVsbCwgYW5kIHdoYXQgY2hhbmdlcyB3aWxsIHJlc3VsdCBmcm9tIHRoZQotcHVsbC4gIFRoZSBnaXQgcmVxdWVzdC1wdWxsIGNvbW1hbmQgY2FuIGJlIGhlbHBmdWwgaW4gdGhpcyByZWdhcmQ7IGl0IHdpbGwKLWZvcm1hdCB0aGUgcmVxdWVzdCBhcyBvdGhlciBkZXZlbG9wZXJzIGV4cGVjdCwgYW5kIHdpbGwgYWxzbyBjaGVjayB0byBiZQotc3VyZSB0aGF0IHlvdSBoYXZlIHJlbWVtYmVyZWQgdG8gcHVzaCB0aG9zZSBjaGFuZ2VzIHRvIHRoZSBwdWJsaWMgc2VydmVyLgotCi0KLTcuMjogUkVWSUVXSU5HIFBBVENIRVMKLQotU29tZSByZWFkZXJzIHdpbGwgY2VydGFpbmx5IG9iamVjdCB0byBwdXR0aW5nIHRoaXMgc2VjdGlvbiB3aXRoICJhZHZhbmNlZAotdG9waWNzIiBvbiB0aGUgZ3JvdW5kcyB0aGF0IGV2ZW4gYmVnaW5uaW5nIGtlcm5lbCBkZXZlbG9wZXJzIHNob3VsZCBiZQotcmV2aWV3aW5nIHBhdGNoZXMuICBJdCBpcyBjZXJ0YWlubHkgdHJ1ZSB0aGF0IHRoZXJlIGlzIG5vIGJldHRlciB3YXkgdG8KLWxlYXJuIGhvdyB0byBwcm9ncmFtIGluIHRoZSBrZXJuZWwgZW52aXJvbm1lbnQgdGhhbiBieSBsb29raW5nIGF0IGNvZGUKLXBvc3RlZCBieSBvdGhlcnMuICBJbiBhZGRpdGlvbiwgcmV2aWV3ZXJzIGFyZSBmb3JldmVyIGluIHNob3J0IHN1cHBseTsgYnkKLWxvb2tpbmcgYXQgY29kZSB5b3UgY2FuIG1ha2UgYSBzaWduaWZpY2FudCBjb250cmlidXRpb24gdG8gdGhlIHByb2Nlc3MgYXMgYQotd2hvbGUuCi0KLVJldmlld2luZyBjb2RlIGNhbiBiZSBhbiBpbnRpbWlkYXRpbmcgcHJvc3BlY3QsIGVzcGVjaWFsbHkgZm9yIGEgbmV3IGtlcm5lbAotZGV2ZWxvcGVyIHdobyBtYXkgd2VsbCBmZWVsIG5lcnZvdXMgYWJvdXQgcXVlc3Rpb25pbmcgY29kZSAtIGluIHB1YmxpYyAtCi13aGljaCBoYXMgYmVlbiBwb3N0ZWQgYnkgdGhvc2Ugd2l0aCBtb3JlIGV4cGVyaWVuY2UuICBFdmVuIGNvZGUgd3JpdHRlbiBieQotdGhlIG1vc3QgZXhwZXJpZW5jZWQgZGV2ZWxvcGVycyBjYW4gYmUgaW1wcm92ZWQsIHRob3VnaC4gIFBlcmhhcHMgdGhlIGJlc3QKLXBpZWNlIG9mIGFkdmljZSBmb3IgcmV2aWV3ZXJzIChhbGwgcmV2aWV3ZXJzKSBpcyB0aGlzOiBwaHJhc2UgcmV2aWV3Ci1jb21tZW50cyBhcyBxdWVzdGlvbnMgcmF0aGVyIHRoYW4gY3JpdGljaXNtcy4gIEFza2luZyAiaG93IGRvZXMgdGhlIGxvY2sKLWdldCByZWxlYXNlZCBpbiB0aGlzIHBhdGg/IiB3aWxsIGFsd2F5cyB3b3JrIGJldHRlciB0aGFuIHN0YXRpbmcgInRoZQotbG9ja2luZyBoZXJlIGlzIHdyb25nLiIKLQotRGlmZmVyZW50IGRldmVsb3BlcnMgd2lsbCByZXZpZXcgY29kZSBmcm9tIGRpZmZlcmVudCBwb2ludHMgb2Ygdmlldy4gIFNvbWUKLWFyZSBtb3N0bHkgY29uY2VybmVkIHdpdGggY29kaW5nIHN0eWxlIGFuZCB3aGV0aGVyIGNvZGUgbGluZXMgaGF2ZSB0cmFpbGluZwotd2hpdGUgc3BhY2UuICBPdGhlcnMgd2lsbCBmb2N1cyBwcmltYXJpbHkgb24gd2hldGhlciB0aGUgY2hhbmdlIGltcGxlbWVudGVkCi1ieSB0aGUgcGF0Y2ggYXMgYSB3aG9sZSBpcyBhIGdvb2QgdGhpbmcgZm9yIHRoZSBrZXJuZWwgb3Igbm90LiAgWWV0IG90aGVycwotd2lsbCBjaGVjayBmb3IgcHJvYmxlbWF0aWMgbG9ja2luZywgZXhjZXNzaXZlIHN0YWNrIHVzYWdlLCBwb3NzaWJsZQotc2VjdXJpdHkgaXNzdWVzLCBkdXBsaWNhdGlvbiBvZiBjb2RlIGZvdW5kIGVsc2V3aGVyZSwgYWRlcXVhdGUKLWRvY3VtZW50YXRpb24sIGFkdmVyc2UgZWZmZWN0cyBvbiBwZXJmb3JtYW5jZSwgdXNlci1zcGFjZSBBQkkgY2hhbmdlcywgZXRjLgotQWxsIHR5cGVzIG9mIHJldmlldywgaWYgdGhleSBsZWFkIHRvIGJldHRlciBjb2RlIGdvaW5nIGludG8gdGhlIGtlcm5lbCwgYXJlCi13ZWxjb21lIGFuZCB3b3J0aHdoaWxlLgotCi0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy83LkFkdmFuY2VkVG9waWNzLnJzdCBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy83LkFkdmFuY2VkVG9waWNzLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWQ2MWM1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzcuQWR2YW5jZWRUb3BpY3MucnN0CkBAIC0wLDAgKzEsMTgwIEBACisuLiBfZGV2ZWxvcG1lbnRfYWR2YW5jZWR0b3BpY3M6CisKK0FkdmFuY2VkIHRvcGljcworPT09PT09PT09PT09PT09CisKK0F0IHRoaXMgcG9pbnQsIGhvcGVmdWxseSwgeW91IGhhdmUgYSBoYW5kbGUgb24gaG93IHRoZSBkZXZlbG9wbWVudCBwcm9jZXNzCit3b3Jrcy4gIFRoZXJlIGlzIHN0aWxsIG1vcmUgdG8gbGVhcm4sIGhvd2V2ZXIhICBUaGlzIHNlY3Rpb24gd2lsbCBjb3ZlciBhCitudW1iZXIgb2YgdG9waWNzIHdoaWNoIGNhbiBiZSBoZWxwZnVsIGZvciBkZXZlbG9wZXJzIHdhbnRpbmcgdG8gYmVjb21lIGEKK3JlZ3VsYXIgcGFydCBvZiB0aGUgTGludXgga2VybmVsIGRldmVsb3BtZW50IHByb2Nlc3MuCisKK01hbmFnaW5nIHBhdGNoZXMgd2l0aCBnaXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHVzZSBvZiBkaXN0cmlidXRlZCB2ZXJzaW9uIGNvbnRyb2wgZm9yIHRoZSBrZXJuZWwgYmVnYW4gaW4gZWFybHkgMjAwMiwKK3doZW4gTGludXMgZmlyc3Qgc3RhcnRlZCBwbGF5aW5nIHdpdGggdGhlIHByb3ByaWV0YXJ5IEJpdEtlZXBlcgorYXBwbGljYXRpb24uICBXaGlsZSBCaXRLZWVwZXIgd2FzIGNvbnRyb3ZlcnNpYWwsIHRoZSBhcHByb2FjaCB0byBzb2Z0d2FyZQordmVyc2lvbiBtYW5hZ2VtZW50IGl0IGVtYm9kaWVkIG1vc3QgY2VydGFpbmx5IHdhcyBub3QuICBEaXN0cmlidXRlZCB2ZXJzaW9uCitjb250cm9sIGVuYWJsZWQgYW4gaW1tZWRpYXRlIGFjY2VsZXJhdGlvbiBvZiB0aGUga2VybmVsIGRldmVsb3BtZW50Citwcm9qZWN0LiAgSW4gY3VycmVudCB0aW1lcywgdGhlcmUgYXJlIHNldmVyYWwgZnJlZSBhbHRlcm5hdGl2ZXMgdG8KK0JpdEtlZXBlci4gIEZvciBiZXR0ZXIgb3IgZm9yIHdvcnNlLCB0aGUga2VybmVsIHByb2plY3QgaGFzIHNldHRsZWQgb24gZ2l0CithcyBpdHMgdG9vbCBvZiBjaG9pY2UuCisKK01hbmFnaW5nIHBhdGNoZXMgd2l0aCBnaXQgY2FuIG1ha2UgbGlmZSBtdWNoIGVhc2llciBmb3IgdGhlIGRldmVsb3BlciwKK2VzcGVjaWFsbHkgYXMgdGhlIHZvbHVtZSBvZiB0aG9zZSBwYXRjaGVzIGdyb3dzLiAgR2l0IGFsc28gaGFzIGl0cyByb3VnaAorZWRnZXMgYW5kIHBvc2VzIGNlcnRhaW4gaGF6YXJkczsgaXQgaXMgYSB5b3VuZyBhbmQgcG93ZXJmdWwgdG9vbCB3aGljaCBpcworc3RpbGwgYmVpbmcgY2l2aWxpemVkIGJ5IGl0cyBkZXZlbG9wZXJzLiAgVGhpcyBkb2N1bWVudCB3aWxsIG5vdCBhdHRlbXB0IHRvCit0ZWFjaCB0aGUgcmVhZGVyIGhvdyB0byB1c2UgZ2l0OyB0aGF0IHdvdWxkIGJlIHN1ZmZpY2llbnQgbWF0ZXJpYWwgZm9yIGEKK2xvbmcgZG9jdW1lbnQgaW4gaXRzIG93biByaWdodC4gIEluc3RlYWQsIHRoZSBmb2N1cyBoZXJlIHdpbGwgYmUgb24gaG93IGdpdAorZml0cyBpbnRvIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyBpbiBwYXJ0aWN1bGFyLiAgRGV2ZWxvcGVycyB3aG8KK3dpc2ggdG8gY29tZSB1cCB0byBzcGVlZCB3aXRoIGdpdCB3aWxsIGZpbmQgbW9yZSBpbmZvcm1hdGlvbiBhdDoKKworCWh0dHA6Ly9naXQtc2NtLmNvbS8KKworCWh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc29mdHdhcmUvc2NtL2dpdC9kb2NzL3VzZXItbWFudWFsLmh0bWwKKworYW5kIG9uIHZhcmlvdXMgdHV0b3JpYWxzIGZvdW5kIG9uIHRoZSB3ZWIuCisKK1RoZSBmaXJzdCBvcmRlciBvZiBidXNpbmVzcyBpcyB0byByZWFkIHRoZSBhYm92ZSBzaXRlcyBhbmQgZ2V0IGEgc29saWQKK3VuZGVyc3RhbmRpbmcgb2YgaG93IGdpdCB3b3JrcyBiZWZvcmUgdHJ5aW5nIHRvIHVzZSBpdCB0byBtYWtlIHBhdGNoZXMKK2F2YWlsYWJsZSB0byBvdGhlcnMuICBBIGdpdC11c2luZyBkZXZlbG9wZXIgc2hvdWxkIGJlIGFibGUgdG8gb2J0YWluIGEgY29weQorb2YgdGhlIG1haW5saW5lIHJlcG9zaXRvcnksIGV4cGxvcmUgdGhlIHJldmlzaW9uIGhpc3RvcnksIGNvbW1pdCBjaGFuZ2VzIHRvCit0aGUgdHJlZSwgdXNlIGJyYW5jaGVzLCBldGMuICBBbiB1bmRlcnN0YW5kaW5nIG9mIGdpdCdzIHRvb2xzIGZvciB0aGUKK3Jld3JpdGluZyBvZiBoaXN0b3J5IChzdWNoIGFzIHJlYmFzZSkgaXMgYWxzbyB1c2VmdWwuICBHaXQgY29tZXMgd2l0aCBpdHMKK293biB0ZXJtaW5vbG9neSBhbmQgY29uY2VwdHM7IGEgbmV3IHVzZXIgb2YgZ2l0IHNob3VsZCBrbm93IGFib3V0IHJlZnMsCityZW1vdGUgYnJhbmNoZXMsIHRoZSBpbmRleCwgZmFzdC1mb3J3YXJkIG1lcmdlcywgcHVzaGVzIGFuZCBwdWxscywgZGV0YWNoZWQKK2hlYWRzLCBldGMuICBJdCBjYW4gYWxsIGJlIGEgbGl0dGxlIGludGltaWRhdGluZyBhdCB0aGUgb3V0c2V0LCBidXQgdGhlCitjb25jZXB0cyBhcmUgbm90IHRoYXQgaGFyZCB0byBncmFzcCB3aXRoIGEgYml0IG9mIHN0dWR5LgorCitVc2luZyBnaXQgdG8gZ2VuZXJhdGUgcGF0Y2hlcyBmb3Igc3VibWlzc2lvbiBieSBlbWFpbCBjYW4gYmUgYSBnb29kCitleGVyY2lzZSB3aGlsZSBjb21pbmcgdXAgdG8gc3BlZWQuCisKK1doZW4geW91IGFyZSByZWFkeSB0byBzdGFydCBwdXR0aW5nIHVwIGdpdCB0cmVlcyBmb3Igb3RoZXJzIHRvIGxvb2sgYXQsIHlvdQord2lsbCwgb2YgY291cnNlLCBuZWVkIGEgc2VydmVyIHRoYXQgY2FuIGJlIHB1bGxlZCBmcm9tLiAgU2V0dGluZyB1cCBzdWNoIGEKK3NlcnZlciB3aXRoIGdpdC1kYWVtb24gaXMgcmVsYXRpdmVseSBzdHJhaWdodGZvcndhcmQgaWYgeW91IGhhdmUgYSBzeXN0ZW0KK3doaWNoIGlzIGFjY2Vzc2libGUgdG8gdGhlIEludGVybmV0LiAgT3RoZXJ3aXNlLCBmcmVlLCBwdWJsaWMgaG9zdGluZyBzaXRlcworKEdpdGh1YiwgZm9yIGV4YW1wbGUpIGFyZSBzdGFydGluZyB0byBhcHBlYXIgb24gdGhlIG5ldC4gIEVzdGFibGlzaGVkCitkZXZlbG9wZXJzIGNhbiBnZXQgYW4gYWNjb3VudCBvbiBrZXJuZWwub3JnLCBidXQgdGhvc2UgYXJlIG5vdCBlYXN5IHRvIGNvbWUKK2J5OyBzZWUgaHR0cDovL2tlcm5lbC5vcmcvZmFxLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworVGhlIG5vcm1hbCBnaXQgd29ya2Zsb3cgaW52b2x2ZXMgdGhlIHVzZSBvZiBhIGxvdCBvZiBicmFuY2hlcy4gIEVhY2ggbGluZQorb2YgZGV2ZWxvcG1lbnQgY2FuIGJlIHNlcGFyYXRlZCBpbnRvIGEgc2VwYXJhdGUgInRvcGljIGJyYW5jaCIgYW5kCittYWludGFpbmVkIGluZGVwZW5kZW50bHkuICBCcmFuY2hlcyBpbiBnaXQgYXJlIGNoZWFwLCB0aGVyZSBpcyBubyByZWFzb24gdG8KK25vdCBtYWtlIGZyZWUgdXNlIG9mIHRoZW0uICBBbmQsIGluIGFueSBjYXNlLCB5b3Ugc2hvdWxkIG5vdCBkbyB5b3VyCitkZXZlbG9wbWVudCBpbiBhbnkgYnJhbmNoIHdoaWNoIHlvdSBpbnRlbmQgdG8gYXNrIG90aGVycyB0byBwdWxsIGZyb20uCitQdWJsaWNseS1hdmFpbGFibGUgYnJhbmNoZXMgc2hvdWxkIGJlIGNyZWF0ZWQgd2l0aCBjYXJlOyBtZXJnZSBpbiBwYXRjaGVzCitmcm9tIGRldmVsb3BtZW50IGJyYW5jaGVzIHdoZW4gdGhleSBhcmUgaW4gY29tcGxldGUgZm9ybSBhbmQgcmVhZHkgdG8gZ28gLQorbm90IGJlZm9yZS4KKworR2l0IHByb3ZpZGVzIHNvbWUgcG93ZXJmdWwgdG9vbHMgd2hpY2ggY2FuIGFsbG93IHlvdSB0byByZXdyaXRlIHlvdXIKK2RldmVsb3BtZW50IGhpc3RvcnkuICBBbiBpbmNvbnZlbmllbnQgcGF0Y2ggKG9uZSB3aGljaCBicmVha3MgYmlzZWN0aW9uLAorc2F5LCBvciB3aGljaCBoYXMgc29tZSBvdGhlciBzb3J0IG9mIG9idmlvdXMgYnVnKSBjYW4gYmUgZml4ZWQgaW4gcGxhY2Ugb3IKK21hZGUgdG8gZGlzYXBwZWFyIGZyb20gdGhlIGhpc3RvcnkgZW50aXJlbHkuICBBIHBhdGNoIHNlcmllcyBjYW4gYmUKK3Jld3JpdHRlbiBhcyBpZiBpdCBoYWQgYmVlbiB3cml0dGVuIG9uIHRvcCBvZiB0b2RheSdzIG1haW5saW5lLCBldmVuIHRob3VnaAoreW91IGhhdmUgYmVlbiB3b3JraW5nIG9uIGl0IGZvciBtb250aHMuICBDaGFuZ2VzIGNhbiBiZSB0cmFuc3BhcmVudGx5CitzaGlmdGVkIGZyb20gb25lIGJyYW5jaCB0byBhbm90aGVyLiAgQW5kIHNvIG9uLiAgSnVkaWNpb3VzIHVzZSBvZiBnaXQncworYWJpbGl0eSB0byByZXZpc2UgaGlzdG9yeSBjYW4gaGVscCBpbiB0aGUgY3JlYXRpb24gb2YgY2xlYW4gcGF0Y2ggc2V0cyB3aXRoCitmZXdlciBwcm9ibGVtcy4KKworRXhjZXNzaXZlIHVzZSBvZiB0aGlzIGNhcGFiaWxpdHkgY2FuIGxlYWQgdG8gb3RoZXIgcHJvYmxlbXMsIHRob3VnaCwgYmV5b25kCithIHNpbXBsZSBvYnNlc3Npb24gZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgcGVyZmVjdCBwcm9qZWN0IGhpc3RvcnkuCitSZXdyaXRpbmcgaGlzdG9yeSB3aWxsIHJld3JpdGUgdGhlIGNoYW5nZXMgY29udGFpbmVkIGluIHRoYXQgaGlzdG9yeSwKK3R1cm5pbmcgYSB0ZXN0ZWQgKGhvcGVmdWxseSkga2VybmVsIHRyZWUgaW50byBhbiB1bnRlc3RlZCBvbmUuICBCdXQsIGJleW9uZAordGhhdCwgZGV2ZWxvcGVycyBjYW5ub3QgZWFzaWx5IGNvbGxhYm9yYXRlIGlmIHRoZXkgZG8gbm90IGhhdmUgYSBzaGFyZWQKK3ZpZXcgb2YgdGhlIHByb2plY3QgaGlzdG9yeTsgaWYgeW91IHJld3JpdGUgaGlzdG9yeSB3aGljaCBvdGhlciBkZXZlbG9wZXJzCitoYXZlIHB1bGxlZCBpbnRvIHRoZWlyIHJlcG9zaXRvcmllcywgeW91IHdpbGwgbWFrZSBsaWZlIG11Y2ggbW9yZSBkaWZmaWN1bHQKK2ZvciB0aG9zZSBkZXZlbG9wZXJzLiAgU28gYSBzaW1wbGUgcnVsZSBvZiB0aHVtYiBhcHBsaWVzIGhlcmU6IGhpc3RvcnkKK3doaWNoIGhhcyBiZWVuIGV4cG9ydGVkIHRvIG90aGVycyBzaG91bGQgZ2VuZXJhbGx5IGJlIHNlZW4gYXMgaW1tdXRhYmxlCit0aGVyZWFmdGVyLgorCitTbywgb25jZSB5b3UgcHVzaCBhIHNldCBvZiBjaGFuZ2VzIHRvIHlvdXIgcHVibGljbHktYXZhaWxhYmxlIHNlcnZlciwgdGhvc2UKK2NoYW5nZXMgc2hvdWxkIG5vdCBiZSByZXdyaXR0ZW4uICBHaXQgd2lsbCBhdHRlbXB0IHRvIGVuZm9yY2UgdGhpcyBydWxlIGlmCit5b3UgdHJ5IHRvIHB1c2ggY2hhbmdlcyB3aGljaCBkbyBub3QgcmVzdWx0IGluIGEgZmFzdC1mb3J3YXJkIG1lcmdlCisoaS5lLiBjaGFuZ2VzIHdoaWNoIGRvIG5vdCBzaGFyZSB0aGUgc2FtZSBoaXN0b3J5KS4gIEl0IGlzIHBvc3NpYmxlIHRvCitvdmVycmlkZSB0aGlzIGNoZWNrLCBhbmQgdGhlcmUgbWF5IGJlIHRpbWVzIHdoZW4gaXQgaXMgbmVjZXNzYXJ5IHRvIHJld3JpdGUKK2FuIGV4cG9ydGVkIHRyZWUuICBNb3ZpbmcgY2hhbmdlc2V0cyBiZXR3ZWVuIHRyZWVzIHRvIGF2b2lkIGNvbmZsaWN0cyBpbgorbGludXgtbmV4dCBpcyBvbmUgZXhhbXBsZS4gIEJ1dCBzdWNoIGFjdGlvbnMgc2hvdWxkIGJlIHJhcmUuICBUaGlzIGlzIG9uZQorb2YgdGhlIHJlYXNvbnMgd2h5IGRldmVsb3BtZW50IHNob3VsZCBiZSBkb25lIGluIHByaXZhdGUgYnJhbmNoZXMgKHdoaWNoCitjYW4gYmUgcmV3cml0dGVuIGlmIG5lY2Vzc2FyeSkgYW5kIG9ubHkgbW92ZWQgaW50byBwdWJsaWMgYnJhbmNoZXMgd2hlbgoraXQncyBpbiBhIHJlYXNvbmFibHkgYWR2YW5jZWQgc3RhdGUuCisKK0FzIHRoZSBtYWlubGluZSAob3Igb3RoZXIgdHJlZSB1cG9uIHdoaWNoIGEgc2V0IG9mIGNoYW5nZXMgaXMgYmFzZWQpCithZHZhbmNlcywgaXQgaXMgdGVtcHRpbmcgdG8gbWVyZ2Ugd2l0aCB0aGF0IHRyZWUgdG8gc3RheSBvbiB0aGUgbGVhZGluZworZWRnZS4gIEZvciBhIHByaXZhdGUgYnJhbmNoLCByZWJhc2luZyBjYW4gYmUgYW4gZWFzeSB3YXkgdG8ga2VlcCB1cCB3aXRoCithbm90aGVyIHRyZWUsIGJ1dCByZWJhc2luZyBpcyBub3QgYW4gb3B0aW9uIG9uY2UgYSB0cmVlIGlzIGV4cG9ydGVkIHRvIHRoZQord29ybGQuICBPbmNlIHRoYXQgaGFwcGVucywgYSBmdWxsIG1lcmdlIG11c3QgYmUgZG9uZS4gIE1lcmdpbmcgb2NjYXNpb25hbGx5CittYWtlcyBnb29kIHNlbnNlLCBidXQgb3Zlcmx5IGZyZXF1ZW50IG1lcmdlcyBjYW4gY2x1dHRlciB0aGUgaGlzdG9yeQorbmVlZGxlc3NseS4gIFN1Z2dlc3RlZCB0ZWNobmlxdWUgaW4gdGhpcyBjYXNlIGlzIHRvIG1lcmdlIGluZnJlcXVlbnRseSwgYW5kCitnZW5lcmFsbHkgb25seSBhdCBzcGVjaWZpYyByZWxlYXNlIHBvaW50cyAoc3VjaCBhcyBhIG1haW5saW5lIC1yYworcmVsZWFzZSkuICBJZiB5b3UgYXJlIG5lcnZvdXMgYWJvdXQgc3BlY2lmaWMgY2hhbmdlcywgeW91IGNhbiBhbHdheXMKK3BlcmZvcm0gdGVzdCBtZXJnZXMgaW4gYSBwcml2YXRlIGJyYW5jaC4gIFRoZSBnaXQgInJlcmVyZSIgdG9vbCBjYW4gYmUKK3VzZWZ1bCBpbiBzdWNoIHNpdHVhdGlvbnM7IGl0IHJlbWVtYmVycyBob3cgbWVyZ2UgY29uZmxpY3RzIHdlcmUgcmVzb2x2ZWQKK3NvIHRoYXQgeW91IGRvbid0IGhhdmUgdG8gZG8gdGhlIHNhbWUgd29yayB0d2ljZS4KKworT25lIG9mIHRoZSBiaWdnZXN0IHJlY3VycmluZyBjb21wbGFpbnRzIGFib3V0IHRvb2xzIGxpa2UgZ2l0IGlzIHRoaXM6IHRoZQorbWFzcyBtb3ZlbWVudCBvZiBwYXRjaGVzIGZyb20gb25lIHJlcG9zaXRvcnkgdG8gYW5vdGhlciBtYWtlcyBpdCBlYXN5IHRvCitzbGlwIGluIGlsbC1hZHZpc2VkIGNoYW5nZXMgd2hpY2ggZ28gaW50byB0aGUgbWFpbmxpbmUgYmVsb3cgdGhlIHJldmlldworcmFkYXIuICBLZXJuZWwgZGV2ZWxvcGVycyB0ZW5kIHRvIGdldCB1bmhhcHB5IHdoZW4gdGhleSBzZWUgdGhhdCBraW5kIG9mCit0aGluZyBoYXBwZW5pbmc7IHB1dHRpbmcgdXAgYSBnaXQgdHJlZSB3aXRoIHVucmV2aWV3ZWQgb3Igb2ZmLXRvcGljIHBhdGNoZXMKK2NhbiBhZmZlY3QgeW91ciBhYmlsaXR5IHRvIGdldCB0cmVlcyBwdWxsZWQgaW4gdGhlIGZ1dHVyZS4gIFF1b3RpbmcgTGludXM6CisKKzo6CisKKwlZb3UgY2FuIHNlbmQgbWUgcGF0Y2hlcywgYnV0IGZvciBtZSB0byBwdWxsIGEgZ2l0IHBhdGNoIGZyb20geW91LCBJCisJbmVlZCB0byBrbm93IHRoYXQgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcsIGFuZCBJIG5lZWQgdG8gYmUgYWJsZQorCXRvIHRydXN0IHRoaW5ncyAqd2l0aG91dCogdGhlbiBoYXZpbmcgdG8gZ28gYW5kIGNoZWNrIGV2ZXJ5CisJaW5kaXZpZHVhbCBjaGFuZ2UgYnkgaGFuZC4KKworKGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzIyNDEzNS8pLgorCitUbyBhdm9pZCB0aGlzIGtpbmQgb2Ygc2l0dWF0aW9uLCBlbnN1cmUgdGhhdCBhbGwgcGF0Y2hlcyB3aXRoaW4gYSBnaXZlbgorYnJhbmNoIHN0aWNrIGNsb3NlbHkgdG8gdGhlIGFzc29jaWF0ZWQgdG9waWM7IGEgImRyaXZlciBmaXhlcyIgYnJhbmNoCitzaG91bGQgbm90IGJlIG1ha2luZyBjaGFuZ2VzIHRvIHRoZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUuICBBbmQsIG1vc3QKK2ltcG9ydGFudGx5LCBkbyBub3QgdXNlIGEgZ2l0IHRyZWUgdG8gYnlwYXNzIHRoZSByZXZpZXcgcHJvY2Vzcy4gIFBvc3QgYW4KK29jY2FzaW9uYWwgc3VtbWFyeSBvZiB0aGUgdHJlZSB0byB0aGUgcmVsZXZhbnQgbGlzdCwgYW5kLCB3aGVuIHRoZSB0aW1lIGlzCityaWdodCwgcmVxdWVzdCB0aGF0IHRoZSB0cmVlIGJlIGluY2x1ZGVkIGluIGxpbnV4LW5leHQuCisKK0lmIGFuZCB3aGVuIG90aGVycyBzdGFydCB0byBzZW5kIHBhdGNoZXMgZm9yIGluY2x1c2lvbiBpbnRvIHlvdXIgdHJlZSwKK2Rvbid0IGZvcmdldCB0byByZXZpZXcgdGhlbS4gIEFsc28gZW5zdXJlIHRoYXQgeW91IG1haW50YWluIHRoZSBjb3JyZWN0CithdXRob3JzaGlwIGluZm9ybWF0aW9uOyB0aGUgZ2l0ICJhbSIgdG9vbCBkb2VzIGl0cyBiZXN0IGluIHRoaXMgcmVnYXJkLCBidXQKK3lvdSBtYXkgaGF2ZSB0byBhZGQgYSAiRnJvbToiIGxpbmUgdG8gdGhlIHBhdGNoIGlmIGl0IGhhcyBiZWVuIHJlbGF5ZWQgdG8KK3lvdSB2aWEgYSB0aGlyZCBwYXJ0eS4KKworV2hlbiByZXF1ZXN0aW5nIGEgcHVsbCwgYmUgc3VyZSB0byBnaXZlIGFsbCB0aGUgcmVsZXZhbnQgaW5mb3JtYXRpb246IHdoZXJlCit5b3VyIHRyZWUgaXMsIHdoYXQgYnJhbmNoIHRvIHB1bGwsIGFuZCB3aGF0IGNoYW5nZXMgd2lsbCByZXN1bHQgZnJvbSB0aGUKK3B1bGwuICBUaGUgZ2l0IHJlcXVlc3QtcHVsbCBjb21tYW5kIGNhbiBiZSBoZWxwZnVsIGluIHRoaXMgcmVnYXJkOyBpdCB3aWxsCitmb3JtYXQgdGhlIHJlcXVlc3QgYXMgb3RoZXIgZGV2ZWxvcGVycyBleHBlY3QsIGFuZCB3aWxsIGFsc28gY2hlY2sgdG8gYmUKK3N1cmUgdGhhdCB5b3UgaGF2ZSByZW1lbWJlcmVkIHRvIHB1c2ggdGhvc2UgY2hhbmdlcyB0byB0aGUgcHVibGljIHNlcnZlci4KKworCitSZXZpZXdpbmcgcGF0Y2hlcworLS0tLS0tLS0tLS0tLS0tLS0KKworU29tZSByZWFkZXJzIHdpbGwgY2VydGFpbmx5IG9iamVjdCB0byBwdXR0aW5nIHRoaXMgc2VjdGlvbiB3aXRoICJhZHZhbmNlZAordG9waWNzIiBvbiB0aGUgZ3JvdW5kcyB0aGF0IGV2ZW4gYmVnaW5uaW5nIGtlcm5lbCBkZXZlbG9wZXJzIHNob3VsZCBiZQorcmV2aWV3aW5nIHBhdGNoZXMuICBJdCBpcyBjZXJ0YWlubHkgdHJ1ZSB0aGF0IHRoZXJlIGlzIG5vIGJldHRlciB3YXkgdG8KK2xlYXJuIGhvdyB0byBwcm9ncmFtIGluIHRoZSBrZXJuZWwgZW52aXJvbm1lbnQgdGhhbiBieSBsb29raW5nIGF0IGNvZGUKK3Bvc3RlZCBieSBvdGhlcnMuICBJbiBhZGRpdGlvbiwgcmV2aWV3ZXJzIGFyZSBmb3JldmVyIGluIHNob3J0IHN1cHBseTsgYnkKK2xvb2tpbmcgYXQgY29kZSB5b3UgY2FuIG1ha2UgYSBzaWduaWZpY2FudCBjb250cmlidXRpb24gdG8gdGhlIHByb2Nlc3MgYXMgYQord2hvbGUuCisKK1Jldmlld2luZyBjb2RlIGNhbiBiZSBhbiBpbnRpbWlkYXRpbmcgcHJvc3BlY3QsIGVzcGVjaWFsbHkgZm9yIGEgbmV3IGtlcm5lbAorZGV2ZWxvcGVyIHdobyBtYXkgd2VsbCBmZWVsIG5lcnZvdXMgYWJvdXQgcXVlc3Rpb25pbmcgY29kZSAtIGluIHB1YmxpYyAtCit3aGljaCBoYXMgYmVlbiBwb3N0ZWQgYnkgdGhvc2Ugd2l0aCBtb3JlIGV4cGVyaWVuY2UuICBFdmVuIGNvZGUgd3JpdHRlbiBieQordGhlIG1vc3QgZXhwZXJpZW5jZWQgZGV2ZWxvcGVycyBjYW4gYmUgaW1wcm92ZWQsIHRob3VnaC4gIFBlcmhhcHMgdGhlIGJlc3QKK3BpZWNlIG9mIGFkdmljZSBmb3IgcmV2aWV3ZXJzIChhbGwgcmV2aWV3ZXJzKSBpcyB0aGlzOiBwaHJhc2UgcmV2aWV3Citjb21tZW50cyBhcyBxdWVzdGlvbnMgcmF0aGVyIHRoYW4gY3JpdGljaXNtcy4gIEFza2luZyAiaG93IGRvZXMgdGhlIGxvY2sKK2dldCByZWxlYXNlZCBpbiB0aGlzIHBhdGg/IiB3aWxsIGFsd2F5cyB3b3JrIGJldHRlciB0aGFuIHN0YXRpbmcgInRoZQorbG9ja2luZyBoZXJlIGlzIHdyb25nLiIKKworRGlmZmVyZW50IGRldmVsb3BlcnMgd2lsbCByZXZpZXcgY29kZSBmcm9tIGRpZmZlcmVudCBwb2ludHMgb2Ygdmlldy4gIFNvbWUKK2FyZSBtb3N0bHkgY29uY2VybmVkIHdpdGggY29kaW5nIHN0eWxlIGFuZCB3aGV0aGVyIGNvZGUgbGluZXMgaGF2ZSB0cmFpbGluZword2hpdGUgc3BhY2UuICBPdGhlcnMgd2lsbCBmb2N1cyBwcmltYXJpbHkgb24gd2hldGhlciB0aGUgY2hhbmdlIGltcGxlbWVudGVkCitieSB0aGUgcGF0Y2ggYXMgYSB3aG9sZSBpcyBhIGdvb2QgdGhpbmcgZm9yIHRoZSBrZXJuZWwgb3Igbm90LiAgWWV0IG90aGVycword2lsbCBjaGVjayBmb3IgcHJvYmxlbWF0aWMgbG9ja2luZywgZXhjZXNzaXZlIHN0YWNrIHVzYWdlLCBwb3NzaWJsZQorc2VjdXJpdHkgaXNzdWVzLCBkdXBsaWNhdGlvbiBvZiBjb2RlIGZvdW5kIGVsc2V3aGVyZSwgYWRlcXVhdGUKK2RvY3VtZW50YXRpb24sIGFkdmVyc2UgZWZmZWN0cyBvbiBwZXJmb3JtYW5jZSwgdXNlci1zcGFjZSBBQkkgY2hhbmdlcywgZXRjLgorQWxsIHR5cGVzIG9mIHJldmlldywgaWYgdGhleSBsZWFkIHRvIGJldHRlciBjb2RlIGdvaW5nIGludG8gdGhlIGtlcm5lbCwgYXJlCit3ZWxjb21lIGFuZCB3b3J0aHdoaWxlLgorCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy84LkNvbmNsdXNpb24gYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvOC5Db25jbHVzaW9uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWVmNjkwLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy84LkNvbmNsdXNpb24KKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi04OiBGT1IgTU9SRSBJTkZPUk1BVElPTgotCi1UaGVyZSBhcmUgbnVtZXJvdXMgc291cmNlcyBvZiBpbmZvcm1hdGlvbiBvbiBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQgYW5kCi1yZWxhdGVkIHRvcGljcy4gIEZpcnN0IGFtb25nIHRob3NlIHdpbGwgYWx3YXlzIGJlIHRoZSBEb2N1bWVudGF0aW9uCi1kaXJlY3RvcnkgZm91bmQgaW4gdGhlIGtlcm5lbCBzb3VyY2UgZGlzdHJpYnV0aW9uLiAgVGhlIHRvcC1sZXZlbCBIT1dUTwotZmlsZSBpcyBhbiBpbXBvcnRhbnQgc3RhcnRpbmcgcG9pbnQ7IFN1Ym1pdHRpbmdQYXRjaGVzIGFuZAotU3VibWl0dGluZ0RyaXZlcnMgYXJlIGFsc28gc29tZXRoaW5nIHdoaWNoIGFsbCBrZXJuZWwgZGV2ZWxvcGVycyBzaG91bGQKLXJlYWQuICBNYW55IGludGVybmFsIGtlcm5lbCBBUElzIGFyZSBkb2N1bWVudGVkIHVzaW5nIHRoZSBrZXJuZWxkb2MKLW1lY2hhbmlzbTsgIm1ha2UgaHRtbGRvY3MiIG9yICJtYWtlIHBkZmRvY3MiIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIHRob3NlCi1kb2N1bWVudHMgaW4gSFRNTCBvciBQREYgZm9ybWF0ICh0aG91Z2ggdGhlIHZlcnNpb24gb2YgVGVYIHNoaXBwZWQgYnkgc29tZQotZGlzdHJpYnV0aW9ucyBydW5zIGludG8gaW50ZXJuYWwgbGltaXRzIGFuZCBmYWlscyB0byBwcm9jZXNzIHRoZSBkb2N1bWVudHMKLXByb3Blcmx5KS4KLQotVmFyaW91cyB3ZWIgc2l0ZXMgZGlzY3VzcyBrZXJuZWwgZGV2ZWxvcG1lbnQgYXQgYWxsIGxldmVscyBvZiBkZXRhaWwuICBZb3VyCi1hdXRob3Igd291bGQgbGlrZSB0byBodW1ibHkgc3VnZ2VzdCBodHRwOi8vbHduLm5ldC8gYXMgYSBzb3VyY2U7Ci1pbmZvcm1hdGlvbiBvbiBtYW55IHNwZWNpZmljIGtlcm5lbCB0b3BpY3MgY2FuIGJlIGZvdW5kIHZpYSB0aGUgTFdOIGtlcm5lbAotaW5kZXggYXQ6Ci0KLQlodHRwOi8vbHduLm5ldC9LZXJuZWwvSW5kZXgvCi0KLUJleW9uZCB0aGF0LCBhIHZhbHVhYmxlIHJlc291cmNlIGZvciBrZXJuZWwgZGV2ZWxvcGVycyBpczoKLQotCWh0dHA6Ly9rZXJuZWxuZXdiaWVzLm9yZy8KLQotQW5kLCBvZiBjb3Vyc2UsIG9uZSBzaG91bGQgbm90IGZvcmdldCBodHRwOi8va2VybmVsLm9yZy8sIHRoZSBkZWZpbml0aXZlCi1sb2NhdGlvbiBmb3Iga2VybmVsIHJlbGVhc2UgaW5mb3JtYXRpb24uCi0KLVRoZXJlIGFyZSBhIG51bWJlciBvZiBib29rcyBvbiBrZXJuZWwgZGV2ZWxvcG1lbnQ6Ci0KLQlMaW51eCBEZXZpY2UgRHJpdmVycywgM3JkIEVkaXRpb24gKEpvbmF0aGFuIENvcmJldCwgQWxlc3NhbmRybwotCVJ1YmluaSwgYW5kIEdyZWcgS3JvYWgtSGFydG1hbikuICBPbmxpbmUgYXQKLQlodHRwOi8vbHduLm5ldC9LZXJuZWwvTEREMy8uCi0KLQlMaW51eCBLZXJuZWwgRGV2ZWxvcG1lbnQgKFJvYmVydCBMb3ZlKS4KLQotCVVuZGVyc3RhbmRpbmcgdGhlIExpbnV4IEtlcm5lbCAoRGFuaWVsIEJvdmV0IGFuZCBNYXJjbyBDZXNhdGkpLgotCi1BbGwgb2YgdGhlc2UgYm9va3Mgc3VmZmVyIGZyb20gYSBjb21tb24gZmF1bHQsIHRob3VnaDogdGhleSB0ZW5kIHRvIGJlCi1zb21ld2hhdCBvYnNvbGV0ZSBieSB0aGUgdGltZSB0aGV5IGhpdCB0aGUgc2hlbHZlcywgYW5kIHRoZXkgaGF2ZSBiZWVuIG9uCi10aGUgc2hlbHZlcyBmb3IgYSB3aGlsZSBub3cuICBTdGlsbCwgdGhlcmUgaXMgcXVpdGUgYSBiaXQgb2YgZ29vZAotaW5mb3JtYXRpb24gdG8gYmUgZm91bmQgdGhlcmUuCi0KLURvY3VtZW50YXRpb24gZm9yIGdpdCBjYW4gYmUgZm91bmQgYXQ6Ci0KLQlodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcy8KLQotCWh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc29mdHdhcmUvc2NtL2dpdC9kb2NzL3VzZXItbWFudWFsLmh0bWwKLQotCi05OiBDT05DTFVTSU9OCi0KLUNvbmdyYXR1bGF0aW9ucyB0byBhbnlib2R5IHdobyBoYXMgbWFkZSBpdCB0aHJvdWdoIHRoaXMgbG9uZy13aW5kZWQKLWRvY3VtZW50LiAgSG9wZWZ1bGx5IGl0IGhhcyBwcm92aWRlZCBhIGhlbHBmdWwgdW5kZXJzdGFuZGluZyBvZiBob3cgdGhlCi1MaW51eCBrZXJuZWwgaXMgZGV2ZWxvcGVkIGFuZCBob3cgeW91IGNhbiBwYXJ0aWNpcGF0ZSBpbiB0aGF0IHByb2Nlc3MuCi0KLUluIHRoZSBlbmQsIGl0J3MgdGhlIHBhcnRpY2lwYXRpb24gdGhhdCBtYXR0ZXJzLiAgQW55IG9wZW4gc291cmNlIHNvZnR3YXJlCi1wcm9qZWN0IGlzIG5vIG1vcmUgdGhhbiB0aGUgc3VtIG9mIHdoYXQgaXRzIGNvbnRyaWJ1dG9ycyBwdXQgaW50byBpdC4gIFRoZQotTGludXgga2VybmVsIGhhcyBwcm9ncmVzc2VkIGFzIHF1aWNrbHkgYW5kIGFzIHdlbGwgYXMgaXQgaGFzIGJlY2F1c2UgaXQgaGFzCi1iZWVuIGhlbHBlZCBieSBhbiBpbXByZXNzaXZlbHkgbGFyZ2UgZ3JvdXAgb2YgZGV2ZWxvcGVycywgYWxsIG9mIHdob20gYXJlCi13b3JraW5nIHRvIG1ha2UgaXQgYmV0dGVyLiAgVGhlIGtlcm5lbCBpcyBhIHByZW1pZXIgZXhhbXBsZSBvZiB3aGF0IGNhbiBiZQotZG9uZSB3aGVuIHRob3VzYW5kcyBvZiBwZW9wbGUgd29yayB0b2dldGhlciB0b3dhcmQgYSBjb21tb24gZ29hbC4KLQotVGhlIGtlcm5lbCBjYW4gYWx3YXlzIGJlbmVmaXQgZnJvbSBhIGxhcmdlciBkZXZlbG9wZXIgYmFzZSwgdGhvdWdoLiAgVGhlcmUKLWlzIGFsd2F5cyBtb3JlIHdvcmsgdG8gZG8uICBCdXQsIGp1c3QgYXMgaW1wb3J0YW50bHksIG1vc3Qgb3RoZXIKLXBhcnRpY2lwYW50cyBpbiB0aGUgTGludXggZWNvc3lzdGVtIGNhbiBiZW5lZml0IHRocm91Z2ggY29udHJpYnV0aW5nIHRvIHRoZQota2VybmVsLiAgR2V0dGluZyBjb2RlIGludG8gdGhlIG1haW5saW5lIGlzIHRoZSBrZXkgdG8gaGlnaGVyIGNvZGUgcXVhbGl0eSwKLWxvd2VyIG1haW50ZW5hbmNlIGFuZCBkaXN0cmlidXRpb24gY29zdHMsIGEgaGlnaGVyIGxldmVsIG9mIGluZmx1ZW5jZSBvdmVyCi10aGUgZGlyZWN0aW9uIG9mIGtlcm5lbCBkZXZlbG9wbWVudCwgYW5kIG1vcmUuICBJdCBpcyBhIHNpdHVhdGlvbiB3aGVyZQotZXZlcnlib2R5IGludm9sdmVkIHdpbnMuICBGaXJlIHVwIHlvdXIgZWRpdG9yIGFuZCBjb21lIGpvaW4gdXM7IHlvdSB3aWxsIGJlCi1tb3JlIHRoYW4gd2VsY29tZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy84LkNvbmNsdXNpb24ucnN0IGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzguQ29uY2x1c2lvbi5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNlYzdjYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy84LkNvbmNsdXNpb24ucnN0CkBAIC0wLDAgKzEsNzQgQEAKKy4uIF9kZXZlbG9wbWVudF9jb25jbHVzaW9uOgorCitGb3IgbW9yZSBpbmZvcm1hdGlvbgorPT09PT09PT09PT09PT09PT09PT0KKworVGhlcmUgYXJlIG51bWVyb3VzIHNvdXJjZXMgb2YgaW5mb3JtYXRpb24gb24gTGludXgga2VybmVsIGRldmVsb3BtZW50IGFuZAorcmVsYXRlZCB0b3BpY3MuICBGaXJzdCBhbW9uZyB0aG9zZSB3aWxsIGFsd2F5cyBiZSB0aGUgRG9jdW1lbnRhdGlvbgorZGlyZWN0b3J5IGZvdW5kIGluIHRoZSBrZXJuZWwgc291cmNlIGRpc3RyaWJ1dGlvbi4gIFRoZSB0b3AtbGV2ZWwgSE9XVE8KK2ZpbGUgaXMgYW4gaW1wb3J0YW50IHN0YXJ0aW5nIHBvaW50OyBTdWJtaXR0aW5nUGF0Y2hlcyBhbmQKK1N1Ym1pdHRpbmdEcml2ZXJzIGFyZSBhbHNvIHNvbWV0aGluZyB3aGljaCBhbGwga2VybmVsIGRldmVsb3BlcnMgc2hvdWxkCityZWFkLiAgTWFueSBpbnRlcm5hbCBrZXJuZWwgQVBJcyBhcmUgZG9jdW1lbnRlZCB1c2luZyB0aGUga2VybmVsZG9jCittZWNoYW5pc207ICJtYWtlIGh0bWxkb2NzIiBvciAibWFrZSBwZGZkb2NzIiBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSB0aG9zZQorZG9jdW1lbnRzIGluIEhUTUwgb3IgUERGIGZvcm1hdCAodGhvdWdoIHRoZSB2ZXJzaW9uIG9mIFRlWCBzaGlwcGVkIGJ5IHNvbWUKK2Rpc3RyaWJ1dGlvbnMgcnVucyBpbnRvIGludGVybmFsIGxpbWl0cyBhbmQgZmFpbHMgdG8gcHJvY2VzcyB0aGUgZG9jdW1lbnRzCitwcm9wZXJseSkuCisKK1ZhcmlvdXMgd2ViIHNpdGVzIGRpc2N1c3Mga2VybmVsIGRldmVsb3BtZW50IGF0IGFsbCBsZXZlbHMgb2YgZGV0YWlsLiAgWW91cgorYXV0aG9yIHdvdWxkIGxpa2UgdG8gaHVtYmx5IHN1Z2dlc3QgaHR0cDovL2x3bi5uZXQvIGFzIGEgc291cmNlOworaW5mb3JtYXRpb24gb24gbWFueSBzcGVjaWZpYyBrZXJuZWwgdG9waWNzIGNhbiBiZSBmb3VuZCB2aWEgdGhlIExXTiBrZXJuZWwKK2luZGV4IGF0OgorCisJaHR0cDovL2x3bi5uZXQvS2VybmVsL0luZGV4LworCitCZXlvbmQgdGhhdCwgYSB2YWx1YWJsZSByZXNvdXJjZSBmb3Iga2VybmVsIGRldmVsb3BlcnMgaXM6CisKKwlodHRwOi8va2VybmVsbmV3Ymllcy5vcmcvCisKK0FuZCwgb2YgY291cnNlLCBvbmUgc2hvdWxkIG5vdCBmb3JnZXQgaHR0cDovL2tlcm5lbC5vcmcvLCB0aGUgZGVmaW5pdGl2ZQorbG9jYXRpb24gZm9yIGtlcm5lbCByZWxlYXNlIGluZm9ybWF0aW9uLgorCitUaGVyZSBhcmUgYSBudW1iZXIgb2YgYm9va3Mgb24ga2VybmVsIGRldmVsb3BtZW50OgorCisJTGludXggRGV2aWNlIERyaXZlcnMsIDNyZCBFZGl0aW9uIChKb25hdGhhbiBDb3JiZXQsIEFsZXNzYW5kcm8KKwlSdWJpbmksIGFuZCBHcmVnIEtyb2FoLUhhcnRtYW4pLiAgT25saW5lIGF0CisJaHR0cDovL2x3bi5uZXQvS2VybmVsL0xERDMvLgorCisJTGludXggS2VybmVsIERldmVsb3BtZW50IChSb2JlcnQgTG92ZSkuCisKKwlVbmRlcnN0YW5kaW5nIHRoZSBMaW51eCBLZXJuZWwgKERhbmllbCBCb3ZldCBhbmQgTWFyY28gQ2VzYXRpKS4KKworQWxsIG9mIHRoZXNlIGJvb2tzIHN1ZmZlciBmcm9tIGEgY29tbW9uIGZhdWx0LCB0aG91Z2g6IHRoZXkgdGVuZCB0byBiZQorc29tZXdoYXQgb2Jzb2xldGUgYnkgdGhlIHRpbWUgdGhleSBoaXQgdGhlIHNoZWx2ZXMsIGFuZCB0aGV5IGhhdmUgYmVlbiBvbgordGhlIHNoZWx2ZXMgZm9yIGEgd2hpbGUgbm93LiAgU3RpbGwsIHRoZXJlIGlzIHF1aXRlIGEgYml0IG9mIGdvb2QKK2luZm9ybWF0aW9uIHRvIGJlIGZvdW5kIHRoZXJlLgorCitEb2N1bWVudGF0aW9uIGZvciBnaXQgY2FuIGJlIGZvdW5kIGF0OgorCisJaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0L2RvY3MvCisKKwlodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcy91c2VyLW1hbnVhbC5odG1sCisKKworQ29uY2x1c2lvbgorPT09PT09PT09PQorCitDb25ncmF0dWxhdGlvbnMgdG8gYW55Ym9keSB3aG8gaGFzIG1hZGUgaXQgdGhyb3VnaCB0aGlzIGxvbmctd2luZGVkCitkb2N1bWVudC4gIEhvcGVmdWxseSBpdCBoYXMgcHJvdmlkZWQgYSBoZWxwZnVsIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZQorTGludXgga2VybmVsIGlzIGRldmVsb3BlZCBhbmQgaG93IHlvdSBjYW4gcGFydGljaXBhdGUgaW4gdGhhdCBwcm9jZXNzLgorCitJbiB0aGUgZW5kLCBpdCdzIHRoZSBwYXJ0aWNpcGF0aW9uIHRoYXQgbWF0dGVycy4gIEFueSBvcGVuIHNvdXJjZSBzb2Z0d2FyZQorcHJvamVjdCBpcyBubyBtb3JlIHRoYW4gdGhlIHN1bSBvZiB3aGF0IGl0cyBjb250cmlidXRvcnMgcHV0IGludG8gaXQuICBUaGUKK0xpbnV4IGtlcm5lbCBoYXMgcHJvZ3Jlc3NlZCBhcyBxdWlja2x5IGFuZCBhcyB3ZWxsIGFzIGl0IGhhcyBiZWNhdXNlIGl0IGhhcworYmVlbiBoZWxwZWQgYnkgYW4gaW1wcmVzc2l2ZWx5IGxhcmdlIGdyb3VwIG9mIGRldmVsb3BlcnMsIGFsbCBvZiB3aG9tIGFyZQord29ya2luZyB0byBtYWtlIGl0IGJldHRlci4gIFRoZSBrZXJuZWwgaXMgYSBwcmVtaWVyIGV4YW1wbGUgb2Ygd2hhdCBjYW4gYmUKK2RvbmUgd2hlbiB0aG91c2FuZHMgb2YgcGVvcGxlIHdvcmsgdG9nZXRoZXIgdG93YXJkIGEgY29tbW9uIGdvYWwuCisKK1RoZSBrZXJuZWwgY2FuIGFsd2F5cyBiZW5lZml0IGZyb20gYSBsYXJnZXIgZGV2ZWxvcGVyIGJhc2UsIHRob3VnaC4gIFRoZXJlCitpcyBhbHdheXMgbW9yZSB3b3JrIHRvIGRvLiAgQnV0LCBqdXN0IGFzIGltcG9ydGFudGx5LCBtb3N0IG90aGVyCitwYXJ0aWNpcGFudHMgaW4gdGhlIExpbnV4IGVjb3N5c3RlbSBjYW4gYmVuZWZpdCB0aHJvdWdoIGNvbnRyaWJ1dGluZyB0byB0aGUKK2tlcm5lbC4gIEdldHRpbmcgY29kZSBpbnRvIHRoZSBtYWlubGluZSBpcyB0aGUga2V5IHRvIGhpZ2hlciBjb2RlIHF1YWxpdHksCitsb3dlciBtYWludGVuYW5jZSBhbmQgZGlzdHJpYnV0aW9uIGNvc3RzLCBhIGhpZ2hlciBsZXZlbCBvZiBpbmZsdWVuY2Ugb3ZlcgordGhlIGRpcmVjdGlvbiBvZiBrZXJuZWwgZGV2ZWxvcG1lbnQsIGFuZCBtb3JlLiAgSXQgaXMgYSBzaXR1YXRpb24gd2hlcmUKK2V2ZXJ5Ym9keSBpbnZvbHZlZCB3aW5zLiAgRmlyZSB1cCB5b3VyIGVkaXRvciBhbmQgY29tZSBqb2luIHVzOyB5b3Ugd2lsbCBiZQorbW9yZSB0aGFuIHdlbGNvbWUuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvY29uZi5weSBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy9jb25mLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNGExMmQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvY29uZi5weQpAQCAtMCwwICsxLDEwIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04OyBtb2RlOiBweXRob24gLSotCisKK3Byb2plY3QgPSAnTGludXggS2VybmVsIERldmVsb3BtZW50IERvY3VtZW50YXRpb24nCisKK3RhZ3MuYWRkKCJzdWJwcm9qZWN0IikKKworbGF0ZXhfZG9jdW1lbnRzID0gWworICAgICgnaW5kZXgnLCAnZGV2ZWxvcG1lbnQtcHJvY2Vzcy50ZXgnLCAnTGludXggS2VybmVsIERldmVsb3BtZW50IERvY3VtZW50YXRpb24nLAorICAgICAnVGhlIGtlcm5lbCBkZXZlbG9wbWVudCBjb21tdW5pdHknLCAnbWFudWFsJyksCitdCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvZGV2ZWxvcG1lbnQtcHJvY2Vzcy5yc3QgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvZGV2ZWxvcG1lbnQtcHJvY2Vzcy5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQxMzk5ZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy9kZXZlbG9wbWVudC1wcm9jZXNzLnJzdApAQCAtMCwwICsxLDI5IEBACisuLiBfZGV2ZWxvcG1lbnRfcHJvY2Vzc19tYWluOgorCitBIGd1aWRlIHRvIHRoZSBLZXJuZWwgRGV2ZWxvcG1lbnQgUHJvY2VzcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ29udGVudHM6CisKKy4uIHRvY3RyZWU6OgorICAgOm51bWJlcmVkOgorICAgOm1heGRlcHRoOiAyCisKKyAgIDEuSW50cm8KKyAgIDIuUHJvY2VzcworICAgMy5FYXJseS1zdGFnZQorICAgNC5Db2RpbmcKKyAgIDUuUG9zdGluZworICAgNi5Gb2xsb3d0aHJvdWdoCisgICA3LkFkdmFuY2VkVG9waWNzCisgICA4LkNvbmNsdXNpb24KKworVGhlIHB1cnBvc2Ugb2YgdGhpcyBkb2N1bWVudCBpcyB0byBoZWxwIGRldmVsb3BlcnMgKGFuZCB0aGVpciBtYW5hZ2VycykKK3dvcmsgd2l0aCB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5IHdpdGggYSBtaW5pbXVtIG9mIGZydXN0cmF0aW9uLiAgSXQgaXMKK2FuIGF0dGVtcHQgdG8gZG9jdW1lbnQgaG93IHRoaXMgY29tbXVuaXR5IHdvcmtzIGluIGEgd2F5IHdoaWNoIGlzCithY2Nlc3NpYmxlIHRvIHRob3NlIHdobyBhcmUgbm90IGludGltYXRlbHkgZmFtaWxpYXIgd2l0aCBMaW51eCBrZXJuZWwKK2RldmVsb3BtZW50IChvciwgaW5kZWVkLCBmcmVlIHNvZnR3YXJlIGRldmVsb3BtZW50IGluIGdlbmVyYWwpLiAgV2hpbGUKK3RoZXJlIGlzIHNvbWUgdGVjaG5pY2FsIG1hdGVyaWFsIGhlcmUsIHRoaXMgaXMgdmVyeSBtdWNoIGEgcHJvY2Vzcy1vcmllbnRlZAorZGlzY3Vzc2lvbiB3aGljaCBkb2VzIG5vdCByZXF1aXJlIGEgZGVlcCBrbm93bGVkZ2Ugb2Yga2VybmVsIHByb2dyYW1taW5nIHRvCit1bmRlcnN0YW5kLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvaW5kZXgucnN0IGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzL2luZGV4LnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzc0NzVkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzL2luZGV4LnJzdApAQCAtMCwwICsxLDkgQEAKK0xpbnV4IEtlcm5lbCBEZXZlbG9wbWVudCBEb2N1bWVudGF0aW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDb250ZW50czoKKworLi4gdG9jdHJlZTo6CisgICA6bWF4ZGVwdGg6IDIKKworICAgZGV2ZWxvcG1lbnQtcHJvY2VzcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9hbHRlcmEvc29jZnBnYS1lY2NtZ3IudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9hbHRlcmEvc29jZnBnYS1lY2NtZ3IudHh0CmluZGV4IGI1NDU4NTYuLjRhMTcxNGYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vYWx0ZXJhL3NvY2ZwZ2EtZWNjbWdyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2FsdGVyYS9zb2NmcGdhLWVjY21nci50eHQKQEAgLTkwLDYgKzkwLDQ3IEBACiAtIGludGVycnVwdHMgICAgICA6IFNob3VsZCBiZSBzaW5nbGUgYml0IGVycm9yIGludGVycnVwdCwgdGhlbiBkb3VibGUgYml0IGVycm9yCiAJaW50ZXJydXB0LCBpbiB0aGlzIG9yZGVyLgogCitOQU5EIEZJRk8gRUNDCitSZXF1aXJlZCBQcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlICAgICAgOiBTaG91bGQgYmUgImFsdHIsc29jZnBnYS1uYW5kLWVjYyIKKy0gcmVnICAgICAgICAgICAgIDogQWRkcmVzcyBhbmQgc2l6ZSBmb3IgRUNDIGJsb2NrIHJlZ2lzdGVycy4KKy0gYWx0cixlY2MtcGFyZW50IDogcGhhbmRsZSB0byBwYXJlbnQgTkFORCBub2RlLgorLSBpbnRlcnJ1cHRzICAgICAgOiBTaG91bGQgYmUgc2luZ2xlIGJpdCBlcnJvciBpbnRlcnJ1cHQsIHRoZW4gZG91YmxlIGJpdCBlcnJvcgorCWludGVycnVwdCwgaW4gdGhpcyBvcmRlci4KKworRE1BIEZJRk8gRUNDCitSZXF1aXJlZCBQcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlICAgICAgOiBTaG91bGQgYmUgImFsdHIsc29jZnBnYS1kbWEtZWNjIgorLSByZWcgICAgICAgICAgICAgOiBBZGRyZXNzIGFuZCBzaXplIGZvciBFQ0MgYmxvY2sgcmVnaXN0ZXJzLgorLSBhbHRyLGVjYy1wYXJlbnQgOiBwaGFuZGxlIHRvIHBhcmVudCBETUEgbm9kZS4KKy0gaW50ZXJydXB0cyAgICAgIDogU2hvdWxkIGJlIHNpbmdsZSBiaXQgZXJyb3IgaW50ZXJydXB0LCB0aGVuIGRvdWJsZSBiaXQgZXJyb3IKKwlpbnRlcnJ1cHQsIGluIHRoaXMgb3JkZXIuCisKK1VTQiBGSUZPIEVDQworUmVxdWlyZWQgUHJvcGVydGllczoKKy0gY29tcGF0aWJsZSAgICAgIDogU2hvdWxkIGJlICJhbHRyLHNvY2ZwZ2EtdXNiLWVjYyIKKy0gcmVnICAgICAgICAgICAgIDogQWRkcmVzcyBhbmQgc2l6ZSBmb3IgRUNDIGJsb2NrIHJlZ2lzdGVycy4KKy0gYWx0cixlY2MtcGFyZW50IDogcGhhbmRsZSB0byBwYXJlbnQgVVNCIG5vZGUuCistIGludGVycnVwdHMgICAgICA6IFNob3VsZCBiZSBzaW5nbGUgYml0IGVycm9yIGludGVycnVwdCwgdGhlbiBkb3VibGUgYml0IGVycm9yCisJaW50ZXJydXB0LCBpbiB0aGlzIG9yZGVyLgorCitRU1BJIEZJRk8gRUNDCitSZXF1aXJlZCBQcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlICAgICAgOiBTaG91bGQgYmUgImFsdHIsc29jZnBnYS1xc3BpLWVjYyIKKy0gcmVnICAgICAgICAgICAgIDogQWRkcmVzcyBhbmQgc2l6ZSBmb3IgRUNDIGJsb2NrIHJlZ2lzdGVycy4KKy0gYWx0cixlY2MtcGFyZW50IDogcGhhbmRsZSB0byBwYXJlbnQgUVNQSSBub2RlLgorLSBpbnRlcnJ1cHRzICAgICAgOiBTaG91bGQgYmUgc2luZ2xlIGJpdCBlcnJvciBpbnRlcnJ1cHQsIHRoZW4gZG91YmxlIGJpdCBlcnJvcgorCWludGVycnVwdCwgaW4gdGhpcyBvcmRlci4KKworU0RNTUMgRklGTyBFQ0MKK1JlcXVpcmVkIFByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgICAgICA6IFNob3VsZCBiZSAiYWx0cixzb2NmcGdhLXNkbW1jLWVjYyIKKy0gcmVnICAgICAgICAgICAgIDogQWRkcmVzcyBhbmQgc2l6ZSBmb3IgRUNDIGJsb2NrIHJlZ2lzdGVycy4KKy0gYWx0cixlY2MtcGFyZW50IDogcGhhbmRsZSB0byBwYXJlbnQgU0QvTU1DIG5vZGUuCistIGludGVycnVwdHMgICAgICA6IFNob3VsZCBiZSBzaW5nbGUgYml0IGVycm9yIGludGVycnVwdCwgdGhlbiBkb3VibGUgYml0IGVycm9yCisJaW50ZXJydXB0LCBpbiB0aGlzIG9yZGVyIGZvciBwb3J0IEEsIGFuZCB0aGVuIHNpbmdsZSBiaXQgZXJyb3IgaW50ZXJydXB0LAorCXRoZW4gZG91YmxlIGJpdCBlcnJvciBpbnRlcnJ1cHQgaW4gdGhpcyBvcmRlciBmb3IgcG9ydCBCLgorCiBFeGFtcGxlOgogCiAJZWNjbWdyOiBlY2NtZ3JAZmZkMDYwMDAgewpAQCAtMTMyLDQgKzE3Myw2MSBAQAogCQkJaW50ZXJydXB0cyA9IDw1IElSUV9UWVBFX0xFVkVMX0hJR0g+LAogCQkJCSAgICAgPDM3IElSUV9UWVBFX0xFVkVMX0hJR0g+OwogCQl9OworCisJCW5hbmQtYnVmLWVjY0BmZjhjMjAwMCB7CisJCQljb21wYXRpYmxlID0gImFsdHIsc29jZnBnYS1uYW5kLWVjYyI7CisJCQlyZWcgPSA8MHhmZjhjMjAwMCAweDQwMD47CisJCQlhbHRyLGVjYy1wYXJlbnQgPSA8Jm5hbmQ+OworCQkJaW50ZXJydXB0cyA9IDwxMSBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKKwkJCQkgICAgIDw0MyBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJfTsKKworCQluYW5kLXJkLWVjY0BmZjhjMjQwMCB7CisJCQljb21wYXRpYmxlID0gImFsdHIsc29jZnBnYS1uYW5kLWVjYyI7CisJCQlyZWcgPSA8MHhmZjhjMjQwMCAweDQwMD47CisJCQlhbHRyLGVjYy1wYXJlbnQgPSA8Jm5hbmQ+OworCQkJaW50ZXJydXB0cyA9IDwxMyBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKKwkJCQkgICAgIDw0NSBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJfTsKKworCQluYW5kLXdyLWVjY0BmZjhjMjgwMCB7CisJCQljb21wYXRpYmxlID0gImFsdHIsc29jZnBnYS1uYW5kLWVjYyI7CisJCQlyZWcgPSA8MHhmZjhjMjgwMCAweDQwMD47CisJCQlhbHRyLGVjYy1wYXJlbnQgPSA8Jm5hbmQ+OworCQkJaW50ZXJydXB0cyA9IDwxMiBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKKwkJCQkgICAgIDw0NCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJfTsKKworCQlkbWEtZWNjQGZmOGM4MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYWx0cixzb2NmcGdhLWRtYS1lY2MiOworCQkJcmVnID0gPDB4ZmY4YzgwMDAgMHg0MDA+OworCQkJYWx0cixlY2MtcGFyZW50ID0gPCZwZG1hPjsKKwkJCWludGVycnVwdHMgPSA8MTAgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCQkJICAgICA8NDIgSVJRX1RZUEVfTEVWRUxfSElHSD47CisKKwkJdXNiMC1lY2NAZmY4Yzg4MDAgeworCQkJY29tcGF0aWJsZSA9ICJhbHRyLHNvY2ZwZ2EtdXNiLWVjYyI7CisJCQlyZWcgPSA8MHhmZjhjODgwMCAweDQwMD47CisJCQlhbHRyLGVjYy1wYXJlbnQgPSA8JnVzYjA+OworCQkJaW50ZXJydXB0cyA9IDwyIElSUV9UWVBFX0xFVkVMX0hJR0g+LAorCQkJCSAgICAgPDM0IElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQl9OworCisJCXFzcGktZWNjQGZmOGM4NDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYWx0cixzb2NmcGdhLXFzcGktZWNjIjsKKwkJCXJlZyA9IDwweGZmOGM4NDAwIDB4NDAwPjsKKwkJCWFsdHIsZWNjLXBhcmVudCA9IDwmcXNwaT47CisJCQlpbnRlcnJ1cHRzID0gPDE0IElSUV9UWVBFX0xFVkVMX0hJR0g+LAorCQkJCSAgICAgPDQ2IElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQl9OworCisJCXNkbW1jLWVjY0BmZjhjMmMwMCB7CisJCQljb21wYXRpYmxlID0gImFsdHIsc29jZnBnYS1zZG1tYy1lY2MiOworCQkJcmVnID0gPDB4ZmY4YzJjMDAgMHg0MDA+OworCQkJYWx0cixlY2MtcGFyZW50ID0gPCZtbWM+OworCQkJaW50ZXJydXB0cyA9IDwxNSBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKKwkJCQkgICAgIDw0NyBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKKwkJCQkgICAgIDwxNiBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKKwkJCQkgICAgIDw0OCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJfTsKIAl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9hcmNoX3RpbWVyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vYXJjaF90aW1lci50eHQKaW5kZXggZTc3NDEyOC4uZWY1ZmJlOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9hcmNoX3RpbWVyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2FyY2hfdGltZXIudHh0CkBAIC0yNSw2ICsyNSwxMiBAQAogLSBhbHdheXMtb24gOiBhIGJvb2xlYW4gcHJvcGVydHkuIElmIHByZXNlbnQsIHRoZSB0aW1lciBpcyBwb3dlcmVkIHRocm91Z2ggYW4KICAgYWx3YXlzLW9uIHBvd2VyIGRvbWFpbiwgdGhlcmVmb3JlIGl0IG5ldmVyIGxvc2VzIGNvbnRleHQuCiAKKy0gZnNsLGVycmF0dW0tYTAwODU4NSA6IEEgYm9vbGVhbiBwcm9wZXJ0eS4gSW5kaWNhdGVzIHRoZSBwcmVzZW5jZSBvZgorICBRb3JJUSBlcnJhdHVtIEEtMDA4NTg1LCB3aGljaCBzYXlzIHRoYXQgcmVhZGluZyB0aGUgY291bnRlciBpcworICB1bnJlbGlhYmxlIHVubGVzcyB0aGUgc2FtZSB2YWx1ZSBpcyByZXR1cm5lZCBieSBiYWNrLXRvLWJhY2sgcmVhZHMuCisgIFRoaXMgYWxzbyBhZmZlY3RzIHdyaXRlcyB0byB0aGUgdHZhbCByZWdpc3RlciwgZHVlIHRvIHRoZSBpbXBsaWNpdAorICBjb3VudGVyIHJlYWQuCisKICoqIE9wdGlvbmFsIHByb3BlcnRpZXM6CiAKIC0gYXJtLGNwdS1yZWdpc3RlcnMtbm90LWZ3LWNvbmZpZ3VyZWQgOiBGaXJtd2FyZSBkb2VzIG5vdCBpbml0aWFsaXplCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21lZGlhdGVrL21lZGlhdGVrLGFwbWl4ZWRzeXMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxhcG1peGVkc3lzLnR4dAppbmRleCA5MzYxNjZmLi5jYjAwNTRhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21lZGlhdGVrL21lZGlhdGVrLGFwbWl4ZWRzeXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssYXBtaXhlZHN5cy50eHQKQEAgLTUsNyArNSw4IEBACiAKIFJlcXVpcmVkIFByb3BlcnRpZXM6CiAKLS0gY29tcGF0aWJsZTogU2hvdWxkIGJlOgorLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgb25lIG9mOgorCS0gIm1lZGlhdGVrLG10MjcwMS1hcG1peGVkc3lzIgogCS0gIm1lZGlhdGVrLG10ODEzNS1hcG1peGVkc3lzIgogCS0gIm1lZGlhdGVrLG10ODE3My1hcG1peGVkc3lzIgogLSAjY2xvY2stY2VsbHM6IE11c3QgYmUgMQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxiZHBzeXMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxiZHBzeXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMzcxOTYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21lZGlhdGVrL21lZGlhdGVrLGJkcHN5cy50eHQKQEAgLTAsMCArMSwyMiBAQAorTWVkaWF0ZWsgYmRwc3lzIGNvbnRyb2xsZXIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIE1lZGlhdGVrIGJkcHN5cyBjb250cm9sbGVyIHByb3ZpZGVzIHZhcmlvdXMgY2xvY2tzIHRvIHRoZSBzeXN0ZW0uCisKK1JlcXVpcmVkIFByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlOgorCS0gIm1lZGlhdGVrLG10MjcwMS1iZHBzeXMiLCAic3lzY29uIgorLSAjY2xvY2stY2VsbHM6IE11c3QgYmUgMQorCitUaGUgYmRwc3lzIGNvbnRyb2xsZXIgdXNlcyB0aGUgY29tbW9uIGNsayBiaW5kaW5nIGZyb20KK0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9jbG9jay1iaW5kaW5ncy50eHQKK1RoZSBhdmFpbGFibGUgY2xvY2tzIGFyZSBkZWZpbmVkIGluIGR0LWJpbmRpbmdzL2Nsb2NrL210Ki1jbGsuaC4KKworRXhhbXBsZToKKworYmRwc3lzOiBjbG9jay1jb250cm9sbGVyQDFjMDAwMDAwIHsKKwljb21wYXRpYmxlID0gIm1lZGlhdGVrLG10MjcwMS1iZHBzeXMiLCAic3lzY29uIjsKKwlyZWcgPSA8MCAweDFjMDAwMDAwIDAgMHgxMDAwPjsKKwkjY2xvY2stY2VsbHMgPSA8MT47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxldGhzeXMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxldGhzeXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2OGYzYTUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21lZGlhdGVrL21lZGlhdGVrLGV0aHN5cy50eHQKQEAgLTAsMCArMSwyMiBAQAorTWVkaWF0ZWsgZXRoc3lzIGNvbnRyb2xsZXIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIE1lZGlhdGVrIGV0aHN5cyBjb250cm9sbGVyIHByb3ZpZGVzIHZhcmlvdXMgY2xvY2tzIHRvIHRoZSBzeXN0ZW0uCisKK1JlcXVpcmVkIFByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlOgorCS0gIm1lZGlhdGVrLG10MjcwMS1ldGhzeXMiLCAic3lzY29uIgorLSAjY2xvY2stY2VsbHM6IE11c3QgYmUgMQorCitUaGUgZXRoc3lzIGNvbnRyb2xsZXIgdXNlcyB0aGUgY29tbW9uIGNsayBiaW5kaW5nIGZyb20KK0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9jbG9jay1iaW5kaW5ncy50eHQKK1RoZSBhdmFpbGFibGUgY2xvY2tzIGFyZSBkZWZpbmVkIGluIGR0LWJpbmRpbmdzL2Nsb2NrL210Ki1jbGsuaC4KKworRXhhbXBsZToKKworZXRoc3lzOiBjbG9jay1jb250cm9sbGVyQDFiMDAwMDAwIHsKKwljb21wYXRpYmxlID0gIm1lZGlhdGVrLG10MjcwMS1ldGhzeXMiLCAic3lzY29uIjsKKwlyZWcgPSA8MCAweDFiMDAwMDAwIDAgMHgxMDAwPjsKKwkjY2xvY2stY2VsbHMgPSA8MT47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxoaWZzeXMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxoaWZzeXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZWQ3YjUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21lZGlhdGVrL21lZGlhdGVrLGhpZnN5cy50eHQKQEAgLTAsMCArMSwyNCBAQAorTWVkaWF0ZWsgaGlmc3lzIGNvbnRyb2xsZXIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIE1lZGlhdGVrIGhpZnN5cyBjb250cm9sbGVyIHByb3ZpZGVzIHZhcmlvdXMgY2xvY2tzIGFuZCByZXNldAorb3V0cHV0cyB0byB0aGUgc3lzdGVtLgorCitSZXF1aXJlZCBQcm9wZXJ0aWVzOgorCistIGNvbXBhdGlibGU6IFNob3VsZCBiZToKKwktICJtZWRpYXRlayxtdDI3MDEtaGlmc3lzIiwgInN5c2NvbiIKKy0gI2Nsb2NrLWNlbGxzOiBNdXN0IGJlIDEKKworVGhlIGhpZnN5cyBjb250cm9sbGVyIHVzZXMgdGhlIGNvbW1vbiBjbGsgYmluZGluZyBmcm9tCitEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svY2xvY2stYmluZGluZ3MudHh0CitUaGUgYXZhaWxhYmxlIGNsb2NrcyBhcmUgZGVmaW5lZCBpbiBkdC1iaW5kaW5ncy9jbG9jay9tdCotY2xrLmguCisKK0V4YW1wbGU6CisKK2hpZnN5czogY2xvY2stY29udHJvbGxlckAxYTAwMDAwMCB7CisJY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDI3MDEtaGlmc3lzIiwgInN5c2NvbiI7CisJcmVnID0gPDAgMHgxYTAwMDAwMCAwIDB4MTAwMD47CisJI2Nsb2NrLWNlbGxzID0gPDE+OworCSNyZXNldC1jZWxscyA9IDwxPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21lZGlhdGVrL21lZGlhdGVrLGltZ3N5cy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21lZGlhdGVrL21lZGlhdGVrLGltZ3N5cy50eHQKaW5kZXggYjFmMmNlMS4uZjZhOTE2NiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxpbWdzeXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssaW1nc3lzLnR4dApAQCAtNSw3ICs1LDggQEAKIAogUmVxdWlyZWQgUHJvcGVydGllczoKIAotLSBjb21wYXRpYmxlOiBTaG91bGQgYmU6CistIGNvbXBhdGlibGU6IFNob3VsZCBiZSBvbmUgb2Y6CisJLSAibWVkaWF0ZWssbXQyNzAxLWltZ3N5cyIsICJzeXNjb24iCiAJLSAibWVkaWF0ZWssbXQ4MTczLWltZ3N5cyIsICJzeXNjb24iCiAtICNjbG9jay1jZWxsczogTXVzdCBiZSAxCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssaW5mcmFjZmcudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxpbmZyYWNmZy50eHQKaW5kZXggYWFmOGQxNC4uMTYyMGVjMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxpbmZyYWNmZy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxpbmZyYWNmZy50eHQKQEAgLTYsNyArNiw4IEBACiAKIFJlcXVpcmVkIFByb3BlcnRpZXM6CiAKLS0gY29tcGF0aWJsZTogU2hvdWxkIGJlOgorLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgb25lIG9mOgorCS0gIm1lZGlhdGVrLG10MjcwMS1pbmZyYWNmZyIsICJzeXNjb24iCiAJLSAibWVkaWF0ZWssbXQ4MTM1LWluZnJhY2ZnIiwgInN5c2NvbiIKIAktICJtZWRpYXRlayxtdDgxNzMtaW5mcmFjZmciLCAic3lzY29uIgogLSAjY2xvY2stY2VsbHM6IE11c3QgYmUgMQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxtbXN5cy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21lZGlhdGVrL21lZGlhdGVrLG1tc3lzLnR4dAppbmRleCA0Mzg1OTQ2Li42N2RkMmU0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21lZGlhdGVrL21lZGlhdGVrLG1tc3lzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21lZGlhdGVrL21lZGlhdGVrLG1tc3lzLnR4dApAQCAtNSw3ICs1LDggQEAKIAogUmVxdWlyZWQgUHJvcGVydGllczoKIAotLSBjb21wYXRpYmxlOiBTaG91bGQgYmU6CistIGNvbXBhdGlibGU6IFNob3VsZCBiZSBvbmUgb2Y6CisJLSAibWVkaWF0ZWssbXQyNzAxLW1tc3lzIiwgInN5c2NvbiIKIAktICJtZWRpYXRlayxtdDgxNzMtbW1zeXMiLCAic3lzY29uIgogLSAjY2xvY2stY2VsbHM6IE11c3QgYmUgMQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21lZGlhdGVrL21lZGlhdGVrLHBlcmljZmcudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxwZXJpY2ZnLnR4dAppbmRleCAyZjZmZjg2Li5lNDk0MzY2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21lZGlhdGVrL21lZGlhdGVrLHBlcmljZmcudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWsscGVyaWNmZy50eHQKQEAgLTYsNyArNiw4IEBACiAKIFJlcXVpcmVkIFByb3BlcnRpZXM6CiAKLS0gY29tcGF0aWJsZTogU2hvdWxkIGJlOgorLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgb25lIG9mOgorCS0gIm1lZGlhdGVrLG10MjcwMS1wZXJpY2ZnIiwgInN5c2NvbiIKIAktICJtZWRpYXRlayxtdDgxMzUtcGVyaWNmZyIsICJzeXNjb24iCiAJLSAibWVkaWF0ZWssbXQ4MTczLXBlcmljZmciLCAic3lzY29uIgogLSAjY2xvY2stY2VsbHM6IE11c3QgYmUgMQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayx0b3Bja2dlbi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21lZGlhdGVrL21lZGlhdGVrLHRvcGNrZ2VuLnR4dAppbmRleCBmOWU5MTc5Li45ZjJmZTc4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21lZGlhdGVrL21lZGlhdGVrLHRvcGNrZ2VuLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21lZGlhdGVrL21lZGlhdGVrLHRvcGNrZ2VuLnR4dApAQCAtNSw3ICs1LDggQEAKIAogUmVxdWlyZWQgUHJvcGVydGllczoKIAotLSBjb21wYXRpYmxlOiBTaG91bGQgYmU6CistIGNvbXBhdGlibGU6IFNob3VsZCBiZSBvbmUgb2Y6CisJLSAibWVkaWF0ZWssbXQyNzAxLXRvcGNrZ2VuIgogCS0gIm1lZGlhdGVrLG10ODEzNS10b3Bja2dlbiIKIAktICJtZWRpYXRlayxtdDgxNzMtdG9wY2tnZW4iCiAtICNjbG9jay1jZWxsczogTXVzdCBiZSAxCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21lZGlhdGVrL21lZGlhdGVrLHZkZWNzeXMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayx2ZGVjc3lzLnR4dAppbmRleCAxZmFhY2YxLi4yNDQwZjczIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21lZGlhdGVrL21lZGlhdGVrLHZkZWNzeXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssdmRlY3N5cy50eHQKQEAgLTUsNyArNSw4IEBACiAKIFJlcXVpcmVkIFByb3BlcnRpZXM6CiAKLS0gY29tcGF0aWJsZTogU2hvdWxkIGJlOgorLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgb25lIG9mOgorCS0gIm1lZGlhdGVrLG10MjcwMS12ZGVjc3lzIiwgInN5c2NvbiIKIAktICJtZWRpYXRlayxtdDgxNzMtdmRlY3N5cyIsICJzeXNjb24iCiAtICNjbG9jay1jZWxsczogTXVzdCBiZSAxCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9hbWxvZ2ljLGd4YmItYW9jbGtjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9hbWxvZ2ljLGd4YmItYW9jbGtjLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTVkMzFiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2FtbG9naWMsZ3hiYi1hb2Nsa2MudHh0CkBAIC0wLDAgKzEsNDUgQEAKKyogQW1sb2dpYyBHWEJCIEFPIENsb2NrIGFuZCBSZXNldCBVbml0CisKK1RoZSBBbWxvZ2ljIEdYQkIgQU8gY2xvY2sgY29udHJvbGxlciBnZW5lcmF0ZXMgYW5kIHN1cHBsaWVzIGNsb2NrIHRvIHZhcmlvdXMKK2NvbnRyb2xsZXJzIHdpdGhpbiB0aGUgQWx3YXlzLU9uIHBhcnQgb2YgdGhlIFNvQy4KKworUmVxdWlyZWQgUHJvcGVydGllczoKKworLSBjb21wYXRpYmxlOiBzaG91bGQgYmUgImFtbG9naWMsZ3hiYi1hb2Nsa2MiCistIHJlZzogcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSBjbG9jayBjb250cm9sbGVyIGFuZCBsZW5ndGggb2YgbWVtb3J5CisgICAgICAgbWFwcGVkIHJlZ2lvbi4KKworLSAjY2xvY2stY2VsbHM6IHNob3VsZCBiZSAxLgorCitFYWNoIGNsb2NrIGlzIGFzc2lnbmVkIGFuIGlkZW50aWZpZXIgYW5kIGNsaWVudCBub2RlcyBjYW4gdXNlIHRoaXMgaWRlbnRpZmllcgordG8gc3BlY2lmeSB0aGUgY2xvY2sgd2hpY2ggdGhleSBjb25zdW1lLiBBbGwgYXZhaWxhYmxlIGNsb2NrcyBhcmUgZGVmaW5lZCBhcworcHJlcHJvY2Vzc29yIG1hY3JvcyBpbiB0aGUgZHQtYmluZGluZ3MvY2xvY2svZ3hiYi1hb2Nsa2MuaCBoZWFkZXIgYW5kIGNhbiBiZQordXNlZCBpbiBkZXZpY2UgdHJlZSBzb3VyY2VzLgorCistICNyZXNldC1jZWxsczogc2hvdWxkIGJlIDEuCisKK0VhY2ggcmVzZXQgaXMgYXNzaWduZWQgYW4gaWRlbnRpZmllciBhbmQgY2xpZW50IG5vZGVzIGNhbiB1c2UgdGhpcyBpZGVudGlmaWVyCit0byBzcGVjaWZ5IHRoZSByZXNldCB3aGljaCB0aGV5IGNvbnN1bWUuIEFsbCBhdmFpbGFibGUgcmVzZXRzIGFyZSBkZWZpbmVkIGFzCitwcmVwcm9jZXNzb3IgbWFjcm9zIGluIHRoZSBkdC1iaW5kaW5ncy9yZXNldC9neGJiLWFvY2xrYy5oIGhlYWRlciBhbmQgY2FuIGJlCit1c2VkIGluIGRldmljZSB0cmVlIHNvdXJjZXMuCisKK0V4YW1wbGU6IEFPIENsb2NrIGNvbnRyb2xsZXIgbm9kZToKKworCWNsa2NfQU86IGNsb2NrLWNvbnRyb2xsZXJAMDQwIHsKKwkJY29tcGF0aWJsZSA9ICJhbWxvZ2ljLGd4YmItYW9jbGtjIjsKKwkJcmVnID0gPDB4MCAweDA0MCAweDAgMHg0PjsKKwkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkjcmVzZXQtY2VsbHMgPSA8MT47CisJfTsKKworRXhhbXBsZTogVUFSVCBjb250cm9sbGVyIG5vZGUgdGhhdCBjb25zdW1lcyB0aGUgY2xvY2sgYW5kIHJlc2V0IGdlbmVyYXRlZAorICBieSB0aGUgY2xvY2sgY29udHJvbGxlcjoKKworCXVhcnRfQU86IHNlcmlhbEA0YzAgeworCQljb21wYXRpYmxlID0gImFtbG9naWMsbWVzb24tdWFydCI7CisJCXJlZyA9IDwweDRjMCAweDE0PjsKKwkJaW50ZXJydXB0cyA9IDwwIDkwIDE+OworCQljbG9ja3MgPSA8JmNsa2NfQU8gQ0xLSURfQU9fVUFSVDE+OworCQlyZXNldHMgPSA8JmNsa2NfQU8gUkVTRVRfQU9fVUFSVDE+OworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYXJtLXN5c2Nvbi1pY3N0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9hcm0tc3lzY29uLWljc3QudHh0CmluZGV4IDhiNzE3N2MuLjI3NDY4MTEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9hcm0tc3lzY29uLWljc3QudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9hcm0tc3lzY29uLWljc3QudHh0CkBAIC01LDIwICs1LDUwIEBACiByZWZlcmVuY2UgZGVzaWducyBieSBhZGRpbmcgc3BlY2lhbCBjb250cm9sIHJlZ2lzdGVycyB0aGF0IG1hbmFnZSBzdWNoCiBvc2NpbGxhdG9ycyB0byB0aGVpciBzeXN0ZW0gY29udHJvbGxlcnMuCiAKLVRoZSBBUk0gc3lzdGVtIGNvbnRyb2xsZXIgY29udGFpbnMgbG9naWMgdG8gc2VyaWFsaXplIGFuZCBpbml0aWFsaXplCitUaGUgdmFyaW91cyBBUk0gc3lzdGVtIGNvbnRyb2xsZXJzIGNvbnRhaW4gbG9naWMgdG8gc2VyaWFsaXplIGFuZCBpbml0aWFsaXplCiBhbiBJQ1NUIGNsb2NrIHJlcXVlc3QgYWZ0ZXIgYSB3cml0ZSB0byB0aGUgMzIgYml0IHJlZ2lzdGVyIGF0IGFuIG9mZnNldAogaW50byB0aGUgc3lzdGVtIGNvbnRyb2xsZXIuIEZ1cnRoZXJtb3JlLCB0byBldmVuIGJlIGFibGUgdG8gYWx0ZXIgb25lIG9mCiB0aGVzZSBmcmVxdWVuY2llcywgdGhlIHN5c3RlbSBjb250cm9sbGVyIG11c3QgZmlyc3QgYmUgdW5sb2NrZWQgYnkKIHdyaXRpbmcgYSBzcGVjaWFsIHRva2VuIHRvIGFub3RoZXIgb2Zmc2V0IGluIHRoZSBzeXN0ZW0gY29udHJvbGxlci4KIAorU29tZSBBUk0gaGFyZHdhcmUgY29udGFpbiBzcGVjaWFsIHZlcnNpb25zIG9mIHRoZSBzZXJpYWwgaW50ZXJmYWNlIHRoYXQgb25seQorY29ubmVjdHMgdGhlIGxvdyA4IGJpdHMgb2YgdGhlIFZEVyAobWlzc2luZyBvbmUgYml0KSwgaGFyZHdpcmVzIFJEVyB0bworZGlmZmVyZW50IHZhbHVlcyBhbmQgc29tZXRpbWVzIGFsc28gaGFyZHdpcmUgdGhlIG91dHB1dCBkaXZpZGVyLiBUaGV5Cit0aGVyZWZvcmUgaGF2ZSBzcGVjaWFsIGNvbXBhdGlibGUgc3RyaW5ncyBhcyBwZXIgdGhpcyB0YWJsZSAodGhlIE9EIHZhbHVlIGlzCit0aGUgdmFsdWUgb24gdGhlIHBpbnMsIG5vdCB0aGUgcmVzdWx0aW5nIG91dHB1dCBkaXZpZGVyKToKKworSGFyZHdhcmUgdmFyaWFudDogICAgICAgIFJEVyAgICAgT0QgICAgICAgICAgVkRXCisKK0ludGVncmF0b3IvQVAgICAgICAgICAgICAyMiAgICAgIDEgICAgICAgICAgIEJpdCA4IDAsIHJlc3QgdmFyaWFibGUKK2ludGVncmF0b3JhcC1jbQorCitJbnRlZ3JhdG9yL0FQICAgICAgICAgICAgNDYgICAgICAzICAgICAgICAgICBCaXQgOCAwLCByZXN0IHZhcmlhYmxlCitpbnRlZ3JhdG9yYXAtc3lzCisKK0ludGVncmF0b3IvQVAgICAgICAgICAgICAyMiBvciAgIDEgICAgICAgICAgIDE3IG9yICgzMyBvciAyNSBNSHopCitpbnRlZ3JhdG9yYXAtcGNpICAgICAgICAgMTQgICAgICAxICAgICAgICAgICAxNAorCitJbnRlZ3JhdG9yL0NQICAgICAgICAgICAgMjIgICAgICB2YXJpYWJsZSAgICBCaXQgOCAwLCByZXN0IHZhcmlhYmxlCitpbnRlZ3JhdG9yY3AtY20tY29yZQorCitJbnRlZ3JhdG9yL0NQICAgICAgICAgICAgMjIgICAgICB2YXJpYWJsZSAgICBCaXQgOCAwLCByZXN0IHZhcmlhYmxlCitpbnRlZ3JhdG9yY3AtY20tbWVtCisKIFRoZSBJQ1NUIG9zY2lsbGF0b3IgbXVzdCBiZSBwcm92aWRlZCBpbnNpZGUgYSBzeXN0ZW0gY29udHJvbGxlciBub2RlLgogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBtdXN0IGJlIG9uZSBvZgorICAiYXJtLHN5c2Nvbi1pY3N0NTI1IgorICAiYXJtLHN5c2Nvbi1pY3N0MzA3IgorICAiYXJtLHN5c2Nvbi1pY3N0NTI1LWludGVncmF0b3JhcC1jbSIKKyAgImFybSxzeXNjb24taWNzdDUyNS1pbnRlZ3JhdG9yYXAtc3lzIgorICAiYXJtLHN5c2Nvbi1pY3N0NTI1LWludGVncmF0b3JhcC1wY2kiCisgICJhcm0sc3lzY29uLWljc3Q1MjUtaW50ZWdyYXRvcmNwLWNtLWNvcmUiCisgICJhcm0sc3lzY29uLWljc3Q1MjUtaW50ZWdyYXRvcmNwLWNtLW1lbSIKIC0gbG9jay1vZmZzZXQ6IHRoZSBvZmZzZXQgYWRkcmVzcyBpbnRvIHRoZSBzeXN0ZW0gY29udHJvbGxlciB3aGVyZSB0aGUKICAgdW5sb2NraW5nIHJlZ2lzdGVyIGlzIGxvY2F0ZWQKIC0gdmNvLW9mZnNldDogdGhlIG9mZnNldCBhZGRyZXNzIGludG8gdGhlIHN5c3RlbSBjb250cm9sbGVyIHdoZXJlIHRoZQogICBJQ1NUIGNvbnRyb2wgcmVnaXN0ZXIgaXMgbG9jYXRlZCAoZXZlbiAzMiBiaXQgYWRkcmVzcykKLS0gY29tcGF0aWJsZTogbXVzdCBiZSBvbmUgb2YgImFybSxzeXNjb24taWNzdDUyNSIgb3IgImFybSxzeXNjb24taWNzdDMwNyIKIC0gI2Nsb2NrLWNlbGxzOiBtdXN0IGJlIDwwPgogLSBjbG9ja3M6IHBhcmVudCBjbG9jaywgc2luY2UgdGhlIElDU1QgbmVlZHMgYSBwYXJlbnQgY2xvY2sgdG8gZGVyaXZlIGl0cwogICBmcmVxdWVuY3kgZnJvbSwgdGhpcyBhdHRyaWJ1dGUgaXMgY29tcHVsc29yeS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9hcm1hZGEzNzAwLXBlcmlwaC1jbG9jay50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYXJtYWRhMzcwMC1wZXJpcGgtY2xvY2sudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMzM3MGIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYXJtYWRhMzcwMC1wZXJpcGgtY2xvY2sudHh0CkBAIC0wLDAgKzEsNzAgQEAKKyogUGVyaXBoZXJhbCBDbG9jayBiaW5kaW5ncyBmb3IgTWFydmVsbCBBcm1hZGEgMzd4eCBTb0NzCisKK01hcnZlbGwgQXJtYWRhIDM3eHggU29DcyBwcm92aWRlIHBlcmlwaGVyYWwgY2xvY2tzIHdoaWNoIGFyZQordXNlZCBhcyBjbG9jayBzb3VyY2UgZm9yIHRoZSBwZXJpcGhlcmFsIG9mIHRoZSBTb0MuCisKK1RoZXJlIGFyZSB0d28gZGlmZmVyZW50IGJsb2NrcyBhc3NvY2lhdGVkIHRvIG5vcnRoIGJyaWRnZSBhbmQgc291dGgKK2JyaWRnZS4KKworVGhlIHBlcmlwaGVyYWwgY2xvY2sgY29uc3VtZXIgc2hvdWxkIHNwZWNpZnkgdGhlIGRlc2lyZWQgY2xvY2sgYnkKK2hhdmluZyB0aGUgY2xvY2sgSUQgaW4gaXRzICJjbG9ja3MiIHBoYW5kbGUgY2VsbC4KKworVGhlIGZvbGxvd2luZyBpcyBhIGxpc3Qgb2YgcHJvdmlkZWQgSURzIGZvciBBcm1hZGEgMzcwIE5vcnRoIGJyaWRnZSBjbG9ja3M6CitJRAlDbG9jayBuYW1lCURlc2NyaXB0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMAltbWMJCU1NQyBjb250cm9sbGVyCisxCXNhdGFfaG9zdAlTYXRhIEhvc3QKKzIJc2VjX2F0CQlTZWN1cml0eSBBVAorMwlzYWNfZGFwCQlTZWN1cml0eSBEQVAKKzQJdHNlY20JCVNlY3VyaXR5IEVuZ2luZQorNQlzZXRtX3RteAlTZXJpYWwgRW1iZWRkZWQgVHJhY2UgTW9kdWxlCis2CWF2cwkJQWRhcHRpdmUgVm9sdGFnZSBTY2FsaW5nCis3CXNxZgkJU1BJCis4CXB3bQkJUFdNCis5CWkyY18yCQlJMkMgMgorMTAJaTJjXzEJCUkyQyAxCisxMQlkZHJfcGh5CQlERFIgUEhZCisxMglkZHJfZmNsawlERFIgRiBjbG9jaworMTMJdHJhY2UJCVRyYWNlCisxNAljb3VudGVyCQlDb3VudGVyCisxNQllaXA5NwkJRUlQIDk3CisxNgljcHUJCUNQVQorCitUaGUgZm9sbG93aW5nIGlzIGEgbGlzdCBvZiBwcm92aWRlZCBJRHMgZm9yIEFybWFkYSAzNzAgU291dGggYnJpZGdlIGNsb2NrczoKK0lECUNsb2NrIG5hbWUJRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiswCWdiZS01MAkJNTAgTUh6IHBhcmVudCBjbG9jayBmb3IgR2lnYWJpdCBFdGhlcm5ldAorMQlnYmUtY29yZQlwYXJlbnQgY2xvY2sgZm9yIEdpZ2FiaXQgRXRoZXJuZXQgY29yZQorMglnYmUtMTI1CQkxMjUgTUh6IHBhcmVudCBjbG9jayBmb3IgR2lnYWJpdCBFdGhlcm5ldAorMwlnYmUxLTUwCQk1MCBNSHogY2xvY2sgZm9yIEdpZ2FiaXQgRXRoZXJuZXQgcG9ydCAxCis0CWdiZTAtNTAJCTUwIE1IeiBjbG9jayBmb3IgR2lnYWJpdCBFdGhlcm5ldCBwb3J0IDAKKzUJZ2JlMS0xMjUJMTI1IE1IeiBjbG9jayBmb3IgR2lnYWJpdCBFdGhlcm5ldCBwb3J0IDEKKzYJZ2JlMC0xMjUJMTI1IE1IeiBjbG9jayBmb3IgR2lnYWJpdCBFdGhlcm5ldCBwb3J0IDAKKzcJZ2JlMS1jb3JlCUdpZ2FiaXQgRXRoZXJuZXQgY29yZSBwb3J0IDEKKzgJZ2JlMC1jb3JlCUdpZ2FiaXQgRXRoZXJuZXQgY29yZSBwb3J0IDAKKzkJZ2JlLWJtCQlHaWdhYml0IEV0aGVybmV0IEJ1ZmZlciBNYW5hZ2VyCisxMAlzZGlvCQlTRElPCisxMQl1c2IzMi1zdWIyLXN5cwlVU0IgMiBjbG9jaworMTIJdXNiMzItc3Mtc3lzCVVTQiAzIGNsb2NrCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZSA6IHNoYWxsIGJlICJtYXJ2ZWxsLGFybWFkYS0zNzAwLXBlcmlwaC1jbG9jay1uYiIgZm9yIHRoZQorICBub3J0aCBicmlkZ2UgYmxvY2ssIG9yCisgICJtYXJ2ZWxsLGFybWFkYS0zNzAwLXBlcmlwaC1jbG9jay1zYiIgZm9yIHRoZSBzb3V0aCBicmlkZ2UgYmxvY2sKKy0gcmVnIDogbXVzdCBiZSB0aGUgcmVnaXN0ZXIgYWRkcmVzcyBvZiBOb3J0aC9Tb3V0aCBCcmlkZ2UgQ2xvY2sgcmVnaXN0ZXIKKy0gI2Nsb2NrLWNlbGxzIDogZnJvbSBjb21tb24gY2xvY2sgYmluZGluZzsgc2hhbGwgYmUgc2V0IHRvIDEKKworLSBjbG9ja3MgOiBsaXN0IG9mIHRoZSBwYXJlbnQgY2xvY2sgcGhhbmRsZSBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgorICBUQkctQSBQLCBUQkctQiBQLCBUQkctQSBTLCBUQkctQiBTIGFuZCBmaW5hbGx5IHRoZSB4dGFsIGNsb2NrLgorCisKK0V4YW1wbGU6CisKK25iX3BlcmloX2NsazogbmItcGVyaXBoLWNsa0AxMzAwMHsKKwljb21wYXRpYmxlID0gIm1hcnZlbGwsYXJtYWRhLTM3MDAtcGVyaXBoLWNsb2NrLW5iIjsKKwlyZWcgPSA8MHgxMzAwMCAweDEwMDA+OworCWNsb2NrcyA9IDwmdGJnIDA+LCA8JnRiZyAxPiwgPCZ0YmcgMj4sCisJPCZ0YmcgMz4sIDwmeHRhbGNsaz47CisJI2Nsb2NrLWNlbGxzID0gPDE+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9hcm1hZGEzNzAwLXRiZy1jbG9jay50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYXJtYWRhMzcwMC10YmctY2xvY2sudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYTFkODMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYXJtYWRhMzcwMC10YmctY2xvY2sudHh0CkBAIC0wLDAgKzEsMjcgQEAKKyogVGltZSBCYXNlIEdlbmVyYXRvciBDbG9jayBiaW5kaW5ncyBmb3IgTWFydmVsbCBBcm1hZGEgMzd4eCBTb0NzCisKK01hcnZlbGwgQXJtYWRhIDM3eHggU29DcyBwcm92ZGUgVGltZSBCYXNlIEdlbmVyYXRvciBjbG9ja3Mgd2hpY2ggYXJlCit1c2VkIGFzIHBhcmVudCBjbG9ja3MgZm9yIHRoZSBwZXJpcGhlcmFsIGNsb2Nrcy4KKworVGhlIFRCRyBjbG9jayBjb25zdW1lciBzaG91bGQgc3BlY2lmeSB0aGUgZGVzaXJlZCBjbG9jayBieSBoYXZpbmcgdGhlCitjbG9jayBJRCBpbiBpdHMgImNsb2NrcyIgcGhhbmRsZSBjZWxsLgorCitUaGUgZm9sbG93aW5nIGlzIGEgbGlzdCBvZiBwcm92aWRlZCBJRHMgYW5kIGNsb2NrIG5hbWVzIG9uIEFybWFkYSAzNzAwOgorIDAgPSBUQkcgQSBQCisgMSA9IFRCRyBCIFAKKyAyID0gVEJHIEEgUworIDMgPSBUQkcgQiBTCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiBzaGFsbCBiZSAibWFydmVsbCxhcm1hZGEtMzcwMC10YmctY2xvY2siCistIHJlZyA6IG11c3QgYmUgdGhlIHJlZ2lzdGVyIGFkZHJlc3Mgb2YgTm9ydGggQnJpZGdlIFBMTCByZWdpc3RlcgorLSAjY2xvY2stY2VsbHMgOiBmcm9tIGNvbW1vbiBjbG9jayBiaW5kaW5nOyBzaGFsbCBiZSBzZXQgdG8gMQorCitFeGFtcGxlOgorCit0Ymc6IHRiZ0AxMzIwMCB7CisJY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLGFybWFkYS0zNzAwLXRiZy1jbG9jayI7CisJcmVnID0gPDB4MTMyMDAgMHgxMDAwPjsKKwljbG9ja3MgPSA8Jnh0YWxjbGs+OworCSNjbG9jay1jZWxscyA9IDwxPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYXJtYWRhMzcwMC14dGFsLWNsb2NrLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9hcm1hZGEzNzAwLXh0YWwtY2xvY2sudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4OGYxZjAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYXJtYWRhMzcwMC14dGFsLWNsb2NrLnR4dApAQCAtMCwwICsxLDI4IEBACisqIFh0YWwgQ2xvY2sgYmluZGluZ3MgZm9yIE1hcnZlbGwgQXJtYWRhIDM3eHggU29DcworCitNYXJ2ZWxsIEFybWFkYSAzN3h4IFNvQ3MgYWxsb3cgdG8gZGV0ZXJtaW5lIHRoZSB4dGFsIGNsb2NrIGZyZXF1ZW5jaWVzIGJ5CityZWFkaW5nIHRoZSBncGlvIGxhdGNoIHJlZ2lzdGVyLgorCitUaGlzIG5vZGUgbXVzdCBiZSBhIHN1Ym5vZGUgb2YgdGhlIG5vZGUgZXhwb3NpbmcgdGhlIHJlZ2lzdGVyIGFkZHJlc3MKK29mIHRoZSBHUElPIGJsb2NrIHdoZXJlIHRoZSBncGlvIGxhdGNoIGlzIGxvY2F0ZWQuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiBzaGFsbCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKwkibWFydmVsbCxhcm1hZGEtMzcwMC14dGFsLWNsb2NrIgorLSAjY2xvY2stY2VsbHMgOiBmcm9tIGNvbW1vbiBjbG9jayBiaW5kaW5nOyBzaGFsbCBiZSBzZXQgdG8gMAorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBjbG9jay1vdXRwdXQtbmFtZXMgOiBmcm9tIGNvbW1vbiBjbG9jayBiaW5kaW5nOyBhbGxvd3Mgb3ZlcndyaXRlIGRlZmF1bHQgY2xvY2sKKwlvdXRwdXQgbmFtZXMgKCJ4dGFsIikKKworRXhhbXBsZToKK2dwaW8xOiBncGlvQDEzODAwIHsKKwljb21wYXRpYmxlID0gIm1hcnZlbGwsYXJtYWRhLTM3MDAtZ3BpbyIsICJzeXNjb24iLCAic2ltcGxlLW1mZCI7CisJcmVnID0gPDB4MTM4MDAgMHgxMDAwPjsKKworCXh0YWxjbGs6IHh0YWwtY2xrIHsKKwkJY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLGFybWFkYS0zNzAwLXh0YWwtY2xvY2siOworCQljbG9jay1vdXRwdXQtbmFtZXMgPSAieHRhbCI7CisJCSNjbG9jay1jZWxscyA9IDwwPjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9hdDkxLWNsb2NrLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9hdDkxLWNsb2NrLnR4dAppbmRleCAxODFiYzhhLi41ZjNhZDY1ZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2F0OTEtY2xvY2sudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9hdDkxLWNsb2NrLnR4dApAQCAtNiw3ICs2LDggQEAKIAogUmVxdWlyZWQgcHJvcGVydGllczoKIC0gY29tcGF0aWJsZSA6IHNoYWxsIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCSJhdG1lbCxhdDkxc2FtOXg1LXNja2MiOgorCSJhdG1lbCxhdDkxc2FtOXg1LXNja2MiIG9yCisJImF0bWVsLHNhbWE1ZDQtc2NrYyI6CiAJCWF0OTEgU0NLQyAoU2xvdyBDbG9jayBDb250cm9sbGVyKQogCQlUaGlzIG5vZGUgY29udGFpbnMgdGhlIHNsb3cgY2xvY2sgZGVmaW5pdGlvbnMuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9icmNtLGJjbTUzNTczLWlscC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYnJjbSxiY201MzU3My1pbHAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYmIxMDcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYnJjbSxiY201MzU3My1pbHAudHh0CkBAIC0wLDAgKzEsMzYgQEAKK0Jyb2FkY29tIEJDTTUzNTczIElMUCBjbG9jaworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgYmluZGluZyB1c2VzIHRoZSBjb21tb24gY2xvY2sgYmluZGluZzoKKyAgICBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svY2xvY2stYmluZGluZ3MudHh0CisKK1RoaXMgYmluZGluZyBpcyB1c2VkIGZvciBJTFAgY2xvY2sgKHNvbWV0aW1lcyByZWZlcnJlZCBhcyAic2xvdyBjbG9jayIpCitvbiBCcm9hZGNvbSBCQ001MzU3MyBkZXZpY2VzIHVzaW5nIENvcnRleC1BNyBDUFUuCisKK0lMUCdzIHJhdGUgaGFzIHRvIGJlIGNhbGN1bGF0ZWQgb24gcnVudGltZSBhbmQgaXQgZGVwZW5kcyBvbiBBTFAgY2xvY2sKK3doaWNoIGhhcyB0byBiZSByZWZlcmVuY2VkLgorCitUaGlzIGNsb2NrIGlzIHBhcnQgb2YgUE1VIChQb3dlciBNYW5hZ2VtZW50IFVuaXQpLCBhIEJyb2FkY29tJ3MgZGV2aWNlCitoYW5kaW5nIHBvd2VyLXJlbGF0ZWQgYXNwZWN0cy4gSXRzIG5vZGUgbXVzdCBiZSBzdWItbm9kZSBvZiB0aGUgUE1VCitkZXZpY2UuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6ICJicmNtLGJjbTUzNTczLWlscCIKKy0gY2xvY2tzOiBoYXMgdG8gcmVmZXJlbmNlIGFuIEFMUCBjbG9jaworLSAjY2xvY2stY2VsbHM6IHNob3VsZCBiZSA8MD4KKy0gY2xvY2stb3V0cHV0LW5hbWVzOiBmcm9tIGNvbW1vbiBjbG9jayBiaW5kaW5ncywgc2hvdWxkIGNvbnRhaW4gY2xvY2sKKwkJICAgICAgbmFtZQorCitFeGFtcGxlOgorCitwbXVAMTgwMTIwMDAgeworCWNvbXBhdGlibGUgPSAic2ltcGxlLW1mZCIsICJzeXNjb24iOworCXJlZyA9IDwweDE4MDEyMDAwIDB4MDAwMDEwMDA+OworCisJaWxwIHsKKwkJY29tcGF0aWJsZSA9ICJicmNtLGJjbTUzNTczLWlscCI7CisJCWNsb2NrcyA9IDwmYWxwPjsKKwkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiaWxwIjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9jbGstZXh5bm9zLWF1ZHNzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9jbGstZXh5bm9zLWF1ZHNzLnR4dAppbmRleCAxODBlODgzLi4wYzNkNjAxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svY2xrLWV4eW5vcy1hdWRzcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2Nsay1leHlub3MtYXVkc3MudHh0CkBAIC0xMCw2ICsxMCw4IEBACiAgIC0gInNhbXN1bmcsZXh5bm9zNDIxMC1hdWRzcy1jbG9jayIgLSBjb250cm9sbGVyIGNvbXBhdGlibGUgd2l0aCBhbGwgRXh5bm9zNCBTb0NzLgogICAtICJzYW1zdW5nLGV4eW5vczUyNTAtYXVkc3MtY2xvY2siIC0gY29udHJvbGxlciBjb21wYXRpYmxlIHdpdGggRXh5bm9zNTI1MAogICAgIFNvQ3MuCisgIC0gInNhbXN1bmcsZXh5bm9zNTQxMC1hdWRzcy1jbG9jayIgLSBjb250cm9sbGVyIGNvbXBhdGlibGUgd2l0aCBFeHlub3M1NDEwCisgICAgU29Dcy4KICAgLSAic2Ftc3VuZyxleHlub3M1NDIwLWF1ZHNzLWNsb2NrIiAtIGNvbnRyb2xsZXIgY29tcGF0aWJsZSB3aXRoIEV4eW5vczU0MjAKICAgICBTb0NzLgogLSByZWc6IHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSBjb250cm9sbGVyJ3MgcmVnaXN0ZXIgc2V0LgpAQCAtOTEsNSArOTMsNSBAQAogCQk8JmNsb2NrX2F1ZHNzIEVYWU5PU19NT1VUX0FVRFNTPiwKIAkJPCZjbG9ja19hdWRzcyBFWFlOT1NfTU9VVF9JMlM+OwogCWNsb2NrLW5hbWVzID0gImlpcyIsICJpMnNfb3BjbGswIiwgImkyc19vcGNsazEiLAotCSJtb3V0X2F1ZHNzIiwgIm1vdXRfaTJzIjsKKwkJICAgICAgIm1vdXRfYXVkc3MiLCAibW91dF9pMnMiOwogfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9leHlub3M1NDEwLWNsb2NrLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9leHlub3M1NDEwLWNsb2NrLnR4dAppbmRleCBhZWFiNjM1Li40NTI3ZGUzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svZXh5bm9zNTQxMC1jbG9jay50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2V4eW5vczU0MTAtY2xvY2sudHh0CkBAIC0xMiwyNCArMTIsMjkgQEAKIAogLSAjY2xvY2stY2VsbHM6IHNob3VsZCBiZSAxLgogCistIGNsb2Nrczogc2hvdWxkIGNvbnRhaW4gYW4gZW50cnkgc3BlY2lmeWluZyB0aGUgcm9vdCBjbG9jayBmcm9tIGV4dGVybmFsCisgIG9zY2lsbGF0b3Igc3VwcGxpZWQgdGhyb3VnaCBYWFRJIG9yIFh1c2JYVEkgcGluLiAgVGhpcyBjbG9jayBzaG91bGQgYmUKKyAgZGVmaW5lZCB1c2luZyBzdGFuZGFyZCBjbG9jayBiaW5kaW5ncyB3aXRoICJmaW5fcGxsIiBjbG9jay1vdXRwdXQtbmFtZS4KKyAgVGhhdCBjbG9jayBpcyBiZWluZyBwYXNzZWQgaW50ZXJuYWxseSB0byB0aGUgOSBQTExzLgorCiBBbGwgYXZhaWxhYmxlIGNsb2NrcyBhcmUgZGVmaW5lZCBhcyBwcmVwcm9jZXNzb3IgbWFjcm9zIGluCiBkdC1iaW5kaW5ncy9jbG9jay9leHlub3M1NDEwLmggaGVhZGVyIGFuZCBjYW4gYmUgdXNlZCBpbiBkZXZpY2UKIHRyZWUgc291cmNlcy4KIAotRXh0ZXJuYWwgY2xvY2s6Ci0KLVRoZXJlIGlzIGNsb2NrIHRoYXQgaXMgZ2VuZXJhdGVkIG91dHNpZGUgdGhlIFNvQy4gSXQKLWlzIGV4cGVjdGVkIHRoYXQgaXQgaXMgZGVmaW5lZCB1c2luZyBzdGFuZGFyZCBjbG9jayBiaW5kaW5ncwotd2l0aCBmb2xsb3dpbmcgY2xvY2stb3V0cHV0LW5hbWU6Ci0KLSAtICJmaW5fcGxsIiAtIFBMTCBpbnB1dCBjbG9jayBmcm9tIFhYVEkKLQogRXhhbXBsZSAxOiBBbiBleGFtcGxlIG9mIGEgY2xvY2sgY29udHJvbGxlciBub2RlIGlzIGxpc3RlZCBiZWxvdy4KIAorCWZpbl9wbGw6IHh4dGkgeworCQljb21wYXRpYmxlID0gImZpeGVkLWNsb2NrIjsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDI0MDAwMDAwPjsKKwkJY2xvY2stb3V0cHV0LW5hbWVzID0gImZpbl9wbGwiOworCQkjY2xvY2stY2VsbHMgPSA8MD47CisJfTsKKwogCWNsb2NrOiBjbG9jay1jb250cm9sbGVyQDB4MTAwMTAwMDAgewogCQljb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNTQxMC1jbG9jayI7CiAJCXJlZyA9IDwweDEwMDEwMDAwIDB4MzAwMDA+OwogCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCWNsb2NrcyA9IDwmZmluX3BsbD47CiAJfTsKIAogRXhhbXBsZSAyOiBVQVJUIGNvbnRyb2xsZXIgbm9kZSB0aGF0IGNvbnN1bWVzIHRoZSBjbG9jayBnZW5lcmF0ZWQgYnkgdGhlIGNsb2NrCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svbWF4aW0sbWF4Nzc2ODYudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL21heGltLG1heDc3Njg2LnR4dAppbmRleCA5YzQwNzM5Li44Mzk4YTNhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svbWF4aW0sbWF4Nzc2ODYudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9tYXhpbSxtYXg3NzY4Ni50eHQKQEAgLTEsMTAgKzEsMjQgQEAKLUJpbmRpbmcgZm9yIE1heGltIE1BWDc3Njg2IDMyayBjbG9jayBnZW5lcmF0b3IgYmxvY2sKK0JpbmRpbmcgZm9yIE1heGltIE1BWDc3Njg2L01BWDc3ODAyL01BWDc3NjIwIDMyayBjbG9jayBnZW5lcmF0b3IgYmxvY2sKIAotVGhpcyBpcyBhIHBhcnQgb2YgZGV2aWNlIHRyZWUgYmluZGluZ3Mgb2YgTUFYNzc2ODYgbXVsdGktZnVuY3Rpb24gZGV2aWNlLgotTW9yZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gYmluZGluZ3MvbWZkL21heDc3Njg2LnR4dCBmaWxlLgorVGhpcyBpcyBhIHBhcnQgb2YgZGV2aWNlIHRyZWUgYmluZGluZ3Mgb2YgTUFYNzc2ODYvTUFYNzc4MDIvTUFYNzc2MjAKK211bHRpLWZ1bmN0aW9uIGRldmljZS4gTW9yZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTUZEIERUIGJpbmRpbmcKK2RvYyBhcyBmb2xsb3dzOgorCWJpbmRpbmdzL21mZC9tYXg3NzY4Ni50eHQgZm9yIE1BWDc3Njg2IGFuZAorCWJpbmRpbmdzL21mZC9tYXg3NzgwMi50eHQgZm9yIE1BWDc3ODAyIGFuZAorCWJpbmRpbmdzL21mZC9tYXg3NzYyMC50eHQgZm9yIE1BWDc3NjIwLgogCiBUaGUgTUFYNzc2ODYgY29udGFpbnMgdGhyZWUgMzIuNzY4a2h6IGNsb2NrIG91dHB1dHMgdGhhdCBjYW4gYmUgY29udHJvbGxlZAotKGdhdGVkL3VuZ2F0ZWQpIG92ZXIgSTJDLgorKGdhdGVkL3VuZ2F0ZWQpIG92ZXIgSTJDLiBDbG9ja3MgYXJlIGRlZmluZWQgYXMgcHJlcHJvY2Vzc29yIG1hY3JvcyBpbgorZHQtYmluZGluZ3MvY2xvY2svbWF4aW0sbWF4Nzc2ODYuaC4KKworCitUaGUgTUFYNzc4MDIgY29udGFpbnMgdHdvIDMyLjc2OGtoeiBjbG9jayBvdXRwdXRzIHRoYXQgY2FuIGJlIGNvbnRyb2xsZWQKKyhnYXRlZC91bmdhdGVkKSBvdmVyIEkyQy4gQ2xvY2tzIGFyZSBkZWZpbmVkIGFzIHByZXByb2Nlc3NvciBtYWNyb3MgaW4KK2R0LWJpbmRpbmdzL2Nsb2NrL21heGltLG1heDc3ODAyLmguCisKK1RoZSBNQVg3NzY4NiBjb250YWlucyBvbmUgMzIuNzY4a2h6IGNsb2NrIG91dHB1dHMgdGhhdCBjYW4gYmUgY29udHJvbGxlZAorKGdhdGVkL3VuZ2F0ZWQpIG92ZXIgSTJDLiBDbG9ja3MgYXJlIGRlZmluZWQgYXMgcHJlcHJvY2Vzc29yIG1hY3JvcyBpbgorZHQtYmluZGluZ3MvY2xvY2svbWF4aW0sbWF4Nzc2MjAuaC4KIAogRm9sbG93aW5nIHByb3BlcnRpZXMgc2hvdWxkIGJlIHByZXNlbmQgaW4gbWFpbiBkZXZpY2Ugbm9kZSBvZiB0aGUgTUZEIGNoaXAuCiAKQEAgLTE3LDMwICszMSw4NCBAQAogCiBFYWNoIGNsb2NrIGlzIGFzc2lnbmVkIGFuIGlkZW50aWZpZXIgYW5kIGNsaWVudCBub2RlcyBjYW4gdXNlIHRoaXMgaWRlbnRpZmllcgogdG8gc3BlY2lmeSB0aGUgY2xvY2sgd2hpY2ggdGhleSBjb25zdW1lLiBGb2xsb3dpbmcgaW5kaWNlcyBhcmUgYWxsb3dlZDoKLSAgICAtIDA6IDMya2h6X2FwIGNsb2NrLAotICAgIC0gMTogMzJraHpfY3AgY2xvY2ssCi0gICAgLSAyOiAzMmtoel9wbWljIGNsb2NrLgorICAgIC0gMDogMzJraHpfYXAgY2xvY2sgKG1heDc3Njg2LCBtYXg3NzgwMiksIDMya2h6X291dDAgKG1heDc3NjIwKQorICAgIC0gMTogMzJraHpfY3AgY2xvY2sgKG1heDc3Njg2LCBtYXg3NzgwMiksCisgICAgLSAyOiAzMmtoel9wbWljIGNsb2NrIChtYXg3NzY4NikuCiAKLUNsb2NrcyBhcmUgZGVmaW5lZCBhcyBwcmVwcm9jZXNzb3IgbWFjcm9zIGluIGR0LWJpbmRpbmdzL2Nsb2NrL21heGltLG1heDc3Njg2LmgKLWhlYWRlciBhbmQgY2FuIGJlIHVzZWQgaW4gZGV2aWNlIHRyZWUgc291cmNlcy4KK0Nsb2NrcyBhcmUgZGVmaW5lZCBhcyBwcmVwcm9jZXNzb3IgbWFjcm9zIGluIGFib3ZlIGR0LWJpbmRpbmcgaGVhZGVyIGZvcgorcmVzcGVjdGl2ZSBjaGlwcy4KIAotRXhhbXBsZTogTm9kZSBvZiB0aGUgTUZEIGNoaXAKK0V4YW1wbGU6CiAKLQltYXg3NzY4NjogbWF4Nzc2ODZAMDkgewotCQljb21wYXRpYmxlID0gIm1heGltLG1heDc3Njg2IjsKLQkJaW50ZXJydXB0LXBhcmVudCA9IDwmd2FrZXVwX2VpbnQ+OwotCQlpbnRlcnJ1cHRzID0gPDI2IDA+OwotCQlyZWcgPSA8MHgwOT47Ci0JCSNjbG9jay1jZWxscyA9IDwxPjsKKzEuIFdpdGggTUFYNzc2ODY6CiAKLQkJLyogLi4uICovCi0JfTsKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9tYXhpbSxtYXg3NzY4Ni5oPgorLyogLi4uICovCiAKLUV4YW1wbGU6IENsb2NrIGNvbnN1bWVyIG5vZGUKKwlOb2RlIG9mIHRoZSBNRkQgY2hpcAorCQltYXg3NzY4NjogbWF4Nzc2ODZAMDkgeworCQkJY29tcGF0aWJsZSA9ICJtYXhpbSxtYXg3NzY4NiI7CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ3YWtldXBfZWludD47CisJCQlpbnRlcnJ1cHRzID0gPDI2IDA+OworCQkJcmVnID0gPDB4MDk+OworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OwogCi0JZm9vQDAgewotCQljb21wYXRpYmxlID0gImJhcixmb28iOwotCQkvKiAuLi4gKi8KLQkJY2xvY2stbmFtZXMgPSAibXktY2xvY2siOwotCQljbG9ja3MgPSA8Jm1heDc3Njg2IE1BWDc3Njg2X0NMS19QTUlDPjsKLQl9OworCQkJLyogLi4uICovCisJCX07CisKKwlDbG9jayBjb25zdW1lciBub2RlCisKKwkJZm9vQDAgeworCQkJY29tcGF0aWJsZSA9ICJiYXIsZm9vIjsKKwkJCS8qIC4uLiAqLworCQkJY2xvY2stbmFtZXMgPSAibXktY2xvY2siOworCQkJY2xvY2tzID0gPCZtYXg3NzY4NiBNQVg3NzY4Nl9DTEtfUE1JQz47CisJCX07CisKKzIuIFdpdGggTUFYNzc4MDI6CisKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9tYXhpbSxtYXg3NzgwMi5oPgorLyogLi4uICovCisKKwlOb2RlIG9mIHRoZSBNRkQgY2hpcAorCQltYXg3NzgwMjogbWF4Nzc4MDJAMDkgeworCQkJY29tcGF0aWJsZSA9ICJtYXhpbSxtYXg3NzgwMiI7CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ3YWtldXBfZWludD47CisJCQlpbnRlcnJ1cHRzID0gPDI2IDA+OworCQkJcmVnID0gPDB4MDk+OworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCisJCQkvKiAuLi4gKi8KKwkJfTsKKworCUNsb2NrIGNvbnN1bWVyIG5vZGUKKworCQlmb29AMCB7CisJCQljb21wYXRpYmxlID0gImJhcixmb28iOworCQkJLyogLi4uICovCisJCQljbG9jay1uYW1lcyA9ICJteS1jbG9jayI7CisJCQljbG9ja3MgPSA8Jm1heDc3ODAyIE1BWDc3ODAyX0NMS18zMktfQVA+OworCQl9OworCisKKzMuIFdpdGggTUFYNzc2MjA6CisKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9tYXhpbSxtYXg3NzYyMC5oPgorLyogLi4uICovCisKKwlOb2RlIG9mIHRoZSBNRkQgY2hpcAorCQltYXg3NzYyMDogbWF4Nzc2MjBAM2MgeworCQkJY29tcGF0aWJsZSA9ICJtYXhpbSxtYXg3NzYyMCI7CisJCQlyZWcgPSA8MHgzYz47CisJCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCQkvKiAuLi4gKi8KKwkJfTsKKworCUNsb2NrIGNvbnN1bWVyIG5vZGUKKworCQlmb29AMCB7CisJCQljb21wYXRpYmxlID0gImJhcixmb28iOworCQkJLyogLi4uICovCisJCQljbG9jay1uYW1lcyA9ICJteS1jbG9jayI7CisJCQljbG9ja3MgPSA8Jm1heDc3NjIwIE1BWDc3NjIwX0NMS18zMktfT1VUMD47CisJCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svbWF4aW0sbWF4Nzc4MDIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL21heGltLG1heDc3ODAyLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkYzc4My4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svbWF4aW0sbWF4Nzc4MDIudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotQmluZGluZyBmb3IgTWF4aW0gTUFYNzc4MDIgMzJrIGNsb2NrIGdlbmVyYXRvciBibG9jawotCi1UaGlzIGlzIGEgcGFydCBvZiBkZXZpY2UgdHJlZSBiaW5kaW5ncyBvZiBNQVg3NzgwMiBtdWx0aS1mdW5jdGlvbiBkZXZpY2UuCi1Nb3JlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBiaW5kaW5ncy9tZmQvbWF4Nzc4MDIudHh0IGZpbGUuCi0KLVRoZSBNQVg3NzgwMiBjb250YWlucyB0d28gMzIuNzY4a2h6IGNsb2NrIG91dHB1dHMgdGhhdCBjYW4gYmUgY29udHJvbGxlZAotKGdhdGVkL3VuZ2F0ZWQpIG92ZXIgSTJDLgotCi1Gb2xsb3dpbmcgcHJvcGVydGllcyBzaG91bGQgYmUgcHJlc2VudCBpbiBtYWluIGRldmljZSBub2RlIG9mIHRoZSBNRkQgY2hpcC4KLQotUmVxdWlyZWQgcHJvcGVydGllczoKLS0gI2Nsb2NrLWNlbGxzOiBGcm9tIGNvbW1vbiBjbG9jayBiaW5kaW5nOyBzaGFsbCBiZSBzZXQgdG8gMS4KLQotT3B0aW9uYWwgcHJvcGVydGllczoKLS0gY2xvY2stb3V0cHV0LW5hbWVzOiBGcm9tIGNvbW1vbiBjbG9jayBiaW5kaW5nLgotCi1FYWNoIGNsb2NrIGlzIGFzc2lnbmVkIGFuIGlkZW50aWZpZXIgYW5kIGNsaWVudCBub2RlcyBjYW4gdXNlIHRoaXMgaWRlbnRpZmllcgotdG8gc3BlY2lmeSB0aGUgY2xvY2sgd2hpY2ggdGhleSBjb25zdW1lLiBGb2xsb3dpbmcgaW5kaWNlcyBhcmUgYWxsb3dlZDoKLSAgICAgLSAwOiAzMmtoel9hcCBjbG9jaywKLSAgICAgLSAxOiAzMmtoel9jcCBjbG9jay4KLQotQ2xvY2tzIGFyZSBkZWZpbmVkIGFzIHByZXByb2Nlc3NvciBtYWNyb3MgaW4gZHQtYmluZGluZ3MvY2xvY2svbWF4aW0sbWF4Nzc4MDIuaAotaGVhZGVyIGFuZCBjYW4gYmUgdXNlZCBpbiBkZXZpY2UgdHJlZSBzb3VyY2VzLgotCi1FeGFtcGxlOiBOb2RlIG9mIHRoZSBNRkQgY2hpcAotCi0JbWF4Nzc4MDI6IG1heDc3ODAyQDA5IHsKLQkJY29tcGF0aWJsZSA9ICJtYXhpbSxtYXg3NzgwMiI7Ci0JCWludGVycnVwdC1wYXJlbnQgPSA8Jndha2V1cF9laW50PjsKLQkJaW50ZXJydXB0cyA9IDwyNiAwPjsKLQkJcmVnID0gPDB4MDk+OwotCQkjY2xvY2stY2VsbHMgPSA8MT47Ci0KLQkJLyogLi4uICovCi0JfTsKLQotRXhhbXBsZTogQ2xvY2sgY29uc3VtZXIgbm9kZQotCi0JZm9vQDAgewotCQljb21wYXRpYmxlID0gImJhcixmb28iOwotCQkvKiAuLi4gKi8KLQkJY2xvY2stbmFtZXMgPSAibXktY2xvY2siOwotCQljbG9ja3MgPSA8Jm1heDc3ODAyIE1BWDc3ODAyX0NMS18zMktfQVA+OwotCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svbXZlYnUtZ2F0ZWQtY2xvY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL212ZWJ1LWdhdGVkLWNsb2NrLnR4dAppbmRleCA2NjBlNjQ5Li5jYjg1NDJkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svbXZlYnUtZ2F0ZWQtY2xvY2sudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9tdmVidS1nYXRlZC1jbG9jay50eHQKQEAgLTg2LDYgKzg2LDggQEAKIDcJcGV4MwkJUENJZSAzCiA4CXBleDAJCVBDSWUgMAogOQl1c2IzaDAJCVVTQjMgSG9zdCAwCisxMAl1c2IzaDEJCVVTQjMgSG9zdCAxCisxNQlzYXRhMAkJU0FUQSAwCiAxNwlzZGlvCQlTRElPCiAyMgl4b3IwCQlYT1IgMAogMjgJeG9yMQkJWE9SIDEKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9xY29tLGdjYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svcWNvbSxnY2MudHh0CmluZGV4IDlhNjBmZGUuLjg2OWEyZjAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9xY29tLGdjYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3Fjb20sZ2NjLnR4dApAQCAtMTUsNiArMTUsNyBAQAogCQkJInFjb20sZ2NjLW1zbTg5NzRwcm8iCiAJCQkicWNvbSxnY2MtbXNtODk3NHByby1hYyIKIAkJCSJxY29tLGdjYy1tc204OTk2IgorCQkJInFjb20sZ2NjLW1kbTk2MTUiCiAKIC0gcmVnIDogc2hhbGwgY29udGFpbiBiYXNlIHJlZ2lzdGVyIGxvY2F0aW9uIGFuZCBsZW5ndGgKIC0gI2Nsb2NrLWNlbGxzIDogc2hhbGwgY29udGFpbiAxCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svcWNvbSxsY2MudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3Fjb20sbGNjLnR4dAppbmRleCBkZDc1NWJlLi5hM2M3OGFhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svcWNvbSxsY2MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9xY29tLGxjYy50eHQKQEAgLTcsNiArNyw3IEBACiAJCQkicWNvbSxsY2MtbXNtODk2MCIKIAkJCSJxY29tLGxjYy1hcHE4MDY0IgogCQkJInFjb20sbGNjLWlwcTgwNjQiCisJCQkicWNvbSxsY2MtbWRtOTYxNSIKIAogLSByZWcgOiBzaGFsbCBjb250YWluIGJhc2UgcmVnaXN0ZXIgbG9jYXRpb24gYW5kIGxlbmd0aAogLSAjY2xvY2stY2VsbHMgOiBzaGFsbCBjb250YWluIDEKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxjbGtnZW4tZGl2bXV4LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxjbGtnZW4tZGl2bXV4LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI0NzY1Mi4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QsY2xrZ2VuLWRpdm11eC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi1CaW5kaW5nIGZvciBhIFNUIGRpdmlkZXIgYW5kIG11bHRpcGxleGVyIGNsb2NrIGRyaXZlci4KLQotVGhpcyBiaW5kaW5nIHVzZXMgdGhlIGNvbW1vbiBjbG9jayBiaW5kaW5nWzFdLgotQmFzZSBhZGRyZXNzIGlzIGxvY2F0ZWQgdG8gdGhlIHBhcmVudCBub2RlLiBTZWUgY2xvY2sgYmluZGluZ1syXQotCi1bMV0gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2Nsb2NrLWJpbmRpbmdzLnR4dAotWzJdIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxjbGtnZW4udHh0Ci0KLVJlcXVpcmVkIHByb3BlcnRpZXM6Ci0KLS0gY29tcGF0aWJsZSA6IHNoYWxsIGJlOgotCSJzdCxjbGtnZW5hLWRpdm11eC1jNjUtaHMiLAkic3QsY2xrZ2VuYS1kaXZtdXgiCi0JInN0LGNsa2dlbmEtZGl2bXV4LWM2NS1scyIsCSJzdCxjbGtnZW5hLWRpdm11eCIKLQkic3QsY2xrZ2VuYS1kaXZtdXgtYzMyLW9kZjAiLAkic3QsY2xrZ2VuYS1kaXZtdXgiCi0JInN0LGNsa2dlbmEtZGl2bXV4LWMzMi1vZGYxIiwJInN0LGNsa2dlbmEtZGl2bXV4IgotCSJzdCxjbGtnZW5hLWRpdm11eC1jMzItb2RmMiIsCSJzdCxjbGtnZW5hLWRpdm11eCIKLQkic3QsY2xrZ2VuYS1kaXZtdXgtYzMyLW9kZjMiLAkic3QsY2xrZ2VuYS1kaXZtdXgiCi0KLS0gI2Nsb2NrLWNlbGxzIDogRnJvbSBjb21tb24gY2xvY2sgYmluZGluZzsgc2hhbGwgYmUgc2V0IHRvIDEuCi0KLS0gY2xvY2tzIDogRnJvbSBjb21tb24gY2xvY2sgYmluZGluZwotCi0tIGNsb2NrLW91dHB1dC1uYW1lcyA6IEZyb20gY29tbW9uIGNsb2NrIGJpbmRpbmcuCi0KLUV4YW1wbGU6Ci0KLQljbG9ja2dlbi1hQGZkMzQ1MDAwIHsKLQkJcmVnID0gPDB4ZmQzNDUwMDAgMHhiNTA+OwotCi0JCWNsa19tX2ExX2RpdjE6IGNsay1tLWExLWRpdjEgewotCQkJI2Nsb2NrLWNlbGxzID0gPDE+OwotCQkJY29tcGF0aWJsZSA9ICJzdCxjbGtnZW5hLWRpdm11eC1jMzItb2RmMSIsCi0JCQkJICAgICAic3QsY2xrZ2VuYS1kaXZtdXgiOwotCi0JCQljbG9ja3MgPSA8JmNsa19tX2ExX29zY19wcmVkaXY+LAotCQkJCSA8JmNsa19tX2ExX3BsbDAgMT4sIC8qIFBMTDAgUEhJMSAqLwotCQkJCSA8JmNsa19tX2ExX3BsbDEgMT47IC8qIFBMTDEgUEhJMSAqLwotCi0JCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY2xrLW0tcngtaWNuLXRzIiwKLQkJCQkJICAgICAiY2xrLW0tcngtaWNuLXZkcC0wIiwKLQkJCQkJICAgICAiIiwgLyogdW51c2VkICovCi0JCQkJCSAgICAgImNsay1tLXBydi10MS1idXMiLAotCQkJCQkgICAgICJjbGstbS1pY24tcmVnLTEyIiwKLQkJCQkJICAgICAiY2xrLW0taWNuLXJlZy0xMCIsCi0JCQkJCSAgICAgIiIsIC8qIHVudXNlZCAqLwotCQkJCQkgICAgICJjbGstbS1pY24tc3QyMzEiOwotCQl9OwotCX07Ci0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxjbGtnZW4tbXV4LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxjbGtnZW4tbXV4LnR4dAppbmRleCBmMWZhOTFjLi45YTQ2Y2IxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QsY2xrZ2VuLW11eC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGNsa2dlbi1tdXgudHh0CkBAIC0xMCwxNCArMTAsNyBAQAogUmVxdWlyZWQgcHJvcGVydGllczoKIAogLSBjb21wYXRpYmxlIDogc2hhbGwgYmU6Ci0JInN0LHN0aWg0MTYtY2xrZ2VuYy12Y2MtaGQiLAkic3QsY2xrZ2VuLW11eCIKLQkic3Qsc3RpaDQxNi1jbGtnZW5mLXZjYy1mdmRwIiwJInN0LGNsa2dlbi1tdXgiCi0JInN0LHN0aWg0MTYtY2xrZ2VuZi12Y2MtaHZhIiwgCSJzdCxjbGtnZW4tbXV4IgotCSJzdCxzdGloNDE2LWNsa2dlbmYtdmNjLWhkIiwJInN0LGNsa2dlbi1tdXgiCi0JInN0LHN0aWg0MTYtY2xrZ2VuZi12Y2Mtc2QiLAkic3QsY2xrZ2VuLW11eCIKLQkic3Qsc3RpaDQxNS1jbGtnZW4tYTktbXV4IiwJInN0LGNsa2dlbi1tdXgiCi0JInN0LHN0aWg0MTYtY2xrZ2VuLWE5LW11eCIsCSJzdCxjbGtnZW4tbXV4IgotCSJzdCxzdGloNDA3LWNsa2dlbi1hOS1tdXgiLAkic3QsY2xrZ2VuLW11eCIKKwkic3Qsc3RpaDQwNy1jbGtnZW4tYTktbXV4IgogCiAtICNjbG9jay1jZWxscyA6IGZyb20gY29tbW9uIGNsb2NrIGJpbmRpbmc7IHNoYWxsIGJlIHNldCB0byAwLgogCkBAIC0yNywxMCArMjAsMTMgQEAKIAogRXhhbXBsZToKIAotCWNsa19tX2h2YTogY2xrLW0taHZhQGZkNjkwODY4IHsKKwljbGtfbV9hOTogY2xrLW0tYTlAOTJiMDAwMCB7CiAJCSNjbG9jay1jZWxscyA9IDwwPjsKLQkJY29tcGF0aWJsZSA9ICJzdCxzdGloNDE2LWNsa2dlbmYtdmNjLWh2YSIsICJzdCxjbGtnZW4tbXV4IjsKLQkJcmVnID0gPDB4ZmQ2OTA4NjggND47CisJCWNvbXBhdGlibGUgPSAic3Qsc3RpaDQwNy1jbGtnZW4tYTktbXV4IjsKKwkJcmVnID0gPDB4OTJiMDAwMCAweDEwMDAwPjsKIAotCQljbG9ja3MgPSA8JmNsb2NrZ2VuX2YgMT4sIDwmY2xrX21fYTFfZGl2MCAzPjsKKwkJY2xvY2tzID0gPCZjbG9ja2dlbl9hOV9wbGwgMD4sCisJCQkgPCZjbG9ja2dlbl9hOV9wbGwgMD4sCisJCQkgPCZjbGtfc19jMF9mbGV4Z2VuIDEzPiwKKwkJCSA8JmNsa19tX2E5X2V4dDJmX2RpdjI+OwogCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QsY2xrZ2VuLXBsbC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QsY2xrZ2VuLXBsbC50eHQKaW5kZXggODQ0YjNhMC4uZjIwNzA1MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGNsa2dlbi1wbGwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxjbGtnZW4tcGxsLnR4dApAQCAtOSwyNCArOSwxMCBAQAogUmVxdWlyZWQgcHJvcGVydGllczoKIAogLSBjb21wYXRpYmxlIDogc2hhbGwgYmU6Ci0JInN0LGNsa2dlbmEtcHJlZGl2LWM2NSIsCSJzdCxjbGtnZW5hLXByZWRpdiIKLQkic3QsY2xrZ2VuYS1wcmVkaXYtYzMyIiwJInN0LGNsa2dlbmEtcHJlZGl2IgotCi0JInN0LGNsa2dlbmEtcGxscy1jNjUiCi0JInN0LHBsbHMtYzMyLWExeC0wIiwJCSJzdCxjbGtnZW4tcGxscy1jMzIiCi0JInN0LHBsbHMtYzMyLWExeC0xIiwJCSJzdCxjbGtnZW4tcGxscy1jMzIiCi0JInN0LHN0aWg0MTUtcGxscy1jMzItYTkiLAkic3QsY2xrZ2VuLXBsbHMtYzMyIgotCSJzdCxzdGloNDE1LXBsbHMtYzMyLWRkciIsCSJzdCxjbGtnZW4tcGxscy1jMzIiCi0JInN0LHN0aWg0MTYtcGxscy1jMzItYTkiLAkic3QsY2xrZ2VuLXBsbHMtYzMyIgotCSJzdCxzdGloNDE2LXBsbHMtYzMyLWRkciIsCSJzdCxjbGtnZW4tcGxscy1jMzIiCi0JInN0LHN0aWg0MDctcGxscy1jMzItYTAiLAkic3QsY2xrZ2VuLXBsbHMtYzMyIgotCSJzdCxzdGloNDA3LXBsbHMtYzMyLWE5IiwJInN0LGNsa2dlbi1wbGxzLWMzMiIKLQkic3N0LHBsbHMtYzMyLWN4XzAiLAkJInN0LGNsa2dlbi1wbGxzLWMzMiIKLQkic3N0LHBsbHMtYzMyLWN4XzEiLAkJInN0LGNsa2dlbi1wbGxzLWMzMiIKLQkic3Qsc3RpaDQxOC1wbGxzLWMyOC1hOSIsCSJzdCxjbGtnZW4tcGxscy1jMzIiCi0KLQkic3Qsc3RpaDQxNS1ncHUtcGxsLWMzMiIsCSJzdCxjbGtnZW5ncHUtcGxsLWMzMiIKLQkic3Qsc3RpaDQxNi1ncHUtcGxsLWMzMiIsCSJzdCxjbGtnZW5ncHUtcGxsLWMzMiIKKwkic3QsY2xrZ2VuLXBsbDAiCisJInN0LGNsa2dlbi1wbGwxIgorCSJzdCxzdGloNDA3LWNsa2dlbi1wbGxhOSIKKwkic3Qsc3RpaDQxOC1jbGtnZW4tcGxsYTkiCiAKIC0gI2Nsb2NrLWNlbGxzIDogRnJvbSBjb21tb24gY2xvY2sgYmluZGluZzsgc2hhbGwgYmUgc2V0IHRvIDEuCiAKQEAgLTM2LDE3ICsyMiwxNiBAQAogCiBFeGFtcGxlOgogCi0JY2xvY2tnZW4tYUBmZWU2MjAwMCB7Ci0JCXJlZyA9IDwweGZlZTYyMDAwIDB4YjQ4PjsKKwljbG9ja2dlbi1hOUA5MmIwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJzdCxjbGtnZW4tYzMyIjsKKwkJcmVnID0gPDB4OTJiMDAwMCAweGZmZmY+OwogCi0JCWNsa19zX2EwX3BsbDogY2xrLXMtYTAtcGxsIHsKKwkJY2xvY2tnZW5fYTlfcGxsOiBjbG9ja2dlbi1hOS1wbGwgewogCQkJI2Nsb2NrLWNlbGxzID0gPDE+OwotCQkJY29tcGF0aWJsZSA9ICJzdCxjbGtnZW5hLXBsbHMtYzY1IjsKKwkJCWNvbXBhdGlibGUgPSAic3Qsc3RpaDQwNy1jbGtnZW4tcGxsYTkiOwogCiAJCQljbG9ja3MgPSA8JmNsa19zeXNpbj47CiAKLQkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbGstcy1hMC1wbGwwLWhzIiwKLQkJCQkJICAgICAiY2xrLXMtYTAtcGxsMC1scyIsCi0JCQkJCSAgICAgImNsay1zLWEwLXBsbDEiOworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNsb2NrZ2VuLWE5LXBsbC1vZGYiOwogCQl9OwogCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QsY2xrZ2VuLXByZWRpdi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QsY2xrZ2VuLXByZWRpdi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNDc2NmMuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGNsa2dlbi1wcmVkaXYudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotQmluZGluZyBmb3IgYSBTVCBwcmUtZGl2aWRlciBjbG9jayBkcml2ZXIuCi0KLVRoaXMgYmluZGluZyB1c2VzIHRoZSBjb21tb24gY2xvY2sgYmluZGluZ1sxXS4KLUJhc2UgYWRkcmVzcyBpcyBsb2NhdGVkIHRvIHRoZSBwYXJlbnQgbm9kZS4gU2VlIGNsb2NrIGJpbmRpbmdbMl0KLQotWzFdIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9jbG9jay1iaW5kaW5ncy50eHQKLVsyXSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QsY2xrZ2VuLnR4dAotCi1SZXF1aXJlZCBwcm9wZXJ0aWVzOgotCi0tIGNvbXBhdGlibGUgOiBzaGFsbCBiZToKLQkic3QsY2xrZ2VuYS1wcmVkaXYtYzY1IiwJInN0LGNsa2dlbmEtcHJlZGl2IgotCSJzdCxjbGtnZW5hLXByZWRpdi1jMzIiLAkic3QsY2xrZ2VuYS1wcmVkaXYiCi0KLS0gI2Nsb2NrLWNlbGxzIDogRnJvbSBjb21tb24gY2xvY2sgYmluZGluZzsgc2hhbGwgYmUgc2V0IHRvIDAuCi0KLS0gY2xvY2tzIDogRnJvbSBjb21tb24gY2xvY2sgYmluZGluZwotCi0tIGNsb2NrLW91dHB1dC1uYW1lcyA6IEZyb20gY29tbW9uIGNsb2NrIGJpbmRpbmcuCi0KLUV4YW1wbGU6Ci0KLQljbG9ja2dlbi1hQGZkMzQ1MDAwIHsKLQkJcmVnID0gPDB4ZmQzNDUwMDAgMHhiNTA+OwotCi0JCWNsa19tX2EyX29zY19wcmVkaXY6IGNsay1tLWEyLW9zYy1wcmVkaXYgewotCQkJI2Nsb2NrLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJzdCxjbGtnZW5hLXByZWRpdi1jMzIiLAotCQkJCSAgICAgInN0LGNsa2dlbmEtcHJlZGl2IjsKLQotCQkJY2xvY2tzID0gPCZjbGtfc3lzaW4+OwotCi0JCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY2xrLW0tYTItb3NjLXByZWRpdiI7Ci0JCX07Ci0JfTsKLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGNsa2dlbi12Y2MudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGNsa2dlbi12Y2MudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDliM2VkLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxjbGtnZW4tdmNjLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLUJpbmRpbmcgZm9yIGEgdHlwZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3MgY2xvY2sgY3Jvc3NiYXIgKFZDQykuCi0KLVRoZSBjcm9zc2JhciBjYW4gdGFrZSB1cCB0byA0IGlucHV0IGNsb2NrcyBhbmQgY29udHJvbCB1cCB0byAxNgotb3V0cHV0IGNsb2Nrcy4gTm90IGFsbCBpbnB1dHMgb3Igb3V0cHV0cyBoYXZlIHRvIGJlIGluIHVzZSBpbiBhCi1wYXJ0aWN1bGFyIGluc3RhbnRpYXRpb24uIEVhY2ggb3V0cHV0IGNhbiBiZSBpbmRpdmlkdWFsbHkgZW5hYmxlZCwKLXNlbGVjdCBhbnkgb2YgdGhlIGlucHV0IGNsb2NrcyBhbmQgYXBwbHkgYSBkaXZpZGUgKGJ5IDEsMiw0IG9yIDgpIHRvCi10aGF0IHNlbGVjdGVkIGNsb2NrLgotCi1UaGlzIGJpbmRpbmcgdXNlcyB0aGUgY29tbW9uIGNsb2NrIGJpbmRpbmdbMV0uCi0KLVsxXSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svY2xvY2stYmluZGluZ3MudHh0Ci0KLVJlcXVpcmVkIHByb3BlcnRpZXM6Ci0KLS0gY29tcGF0aWJsZSA6IHNoYWxsIGJlOgotCSJzdCxzdGloNDE2LWNsa2dlbmMiLAkJInN0LHZjYyIKLQkic3Qsc3RpaDQxNi1jbGtnZW5mIiwJCSJzdCx2Y2MiCi0KLS0gI2Nsb2NrLWNlbGxzIDogZnJvbSBjb21tb24gY2xvY2sgYmluZGluZzsgc2hhbGwgYmUgc2V0IHRvIDEuCi0KLS0gcmVnIDogQSBCYXNlIGFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0LgotCi0tIGNsb2NrcyA6IGZyb20gY29tbW9uIGNsb2NrIGJpbmRpbmcKLQotLSBjbG9jay1vdXRwdXQtbmFtZXMgOiBGcm9tIGNvbW1vbiBjbG9jayBiaW5kaW5nLiBUaGUgYmxvY2sgaGFzIDE2Ci0gICAgICAgICAgICAgICAgICAgICAgIGNsb2NrIG91dHB1dHMgYnV0IG5vdCBhbGwgb2YgdGhlbSBpbiBhIHNwZWNpZmljIGluc3RhbmNlCi0gICAgICAgICAgICAgICAgICAgICAgIGhhdmUgdG8gYmUgdXNlZCBpbiB0aGUgU29DLiBJZiBhIGNsb2NrIG5hbWUgaXMgbGVmdCBhcwotICAgICAgICAgICAgICAgICAgICAgICBhbiBlbXB0eSBzdHJpbmcgdGhlbiBubyBjbG9jayB3aWxsIGJlIGNyZWF0ZWQgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgYXNzb2NpYXRlZCB3aXRoIHRoYXQgc3RyaW5nIGluZGV4LiBJZiBmZXdlciB0aGFuCi0gICAgICAgICAgICAgICAgICAgICAgIDE2IHN0cmluZ3MgYXJlIHByb3ZpZGVkIHRoZW4gbm8gY2xvY2tzIHdpbGwgYmUgY3JlYXRlZAotICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIHJlbWFpbmluZyBvdXRwdXRzLgotCi1FeGFtcGxlOgotCi0JY2xvY2tnZW5fY192Y2M6IGNsb2NrZ2VuLWMtdmNjQDB4ZmU4MzA4YWMgewotCQkjY2xvY2stY2VsbHMgPSA8MT47Ci0JCWNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNi1jbGtnZW5jIiwgInN0LGNsa2dlbi12Y2MiOwotCQlyZWcgPSA8MHhmZTgzMDhhYyAxMj47Ci0KLQkJY2xvY2tzID0gPCZjbGtfc192Y2NfaGQ+LAotCQkJIDwmY2xvY2tnZW5fYyAxPiwKLQkJCSA8JmNsa19zX3RtZHNfZnJvbXBoeT4sCi0JCQkgPCZjbG9ja2dlbl9jIDI+OwotCi0JCWNsb2NrLW91dHB1dC1uYW1lcyAgPSAiY2xrLXMtcGl4LWhkbWkiLAotCQkJCSAgICAgICJjbGstcy1waXgtZHZvIiwKLQkJCQkgICAgICAiY2xrLXMtb3V0LWR2byIsCi0JCQkJICAgICAgImNsay1zLXBpeC1oZCIsCi0JCQkJICAgICAgImNsay1zLWhkZGFjIiwKLQkJCQkgICAgICAiY2xrLXMtZGVuYyIsCi0JCQkJICAgICAgImNsay1zLXNkZGFjIiwKLQkJCQkgICAgICAiY2xrLXMtcGl4LW1haW4iLAotCQkJCSAgICAgICJjbGstcy1waXgtYXV4IiwKLQkJCQkgICAgICAiY2xrLXMtc3RmZS1mcmMtMCIsCi0JCQkJICAgICAgImNsay1zLXJlZi1tY3J1IiwKLQkJCQkgICAgICAiY2xrLXMtc2xhdmUtbWNydSIsCi0JCQkJICAgICAgImNsay1zLXRtZHMtaGRtaSIsCi0JCQkJICAgICAgImNsay1zLWhkbWktcmVqZWN0LXBsbCIsCi0JCQkJICAgICAgImNsay1zLXRoc2VucyI7Ci0JfTsKLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGNsa2dlbi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QsY2xrZ2VuLnR4dAppbmRleCBiMThiZjg2Li5jMzUzOTBmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QsY2xrZ2VuLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QsY2xrZ2VuLnR4dApAQCAtMTMsMTQgKzEzLDYgQEAKIAkJCS4uLgogCQl9OwogCi0JCXByZWRpdl9ub2RlIHsKLQkJCS4uLgotCQl9OwotCi0JCWRpdm11eF9ub2RlIHsKLQkJCS4uLgotCQl9OwotCiAJCXF1YWRmc19ub2RlIHsKIAkJCS4uLgogCQl9OwpAQCAtMjksMTAgKzIxLDYgQEAKIAkJCS4uLgogCQl9OwogCi0JCXZjY19ub2RlIHsKLQkJCS4uLgotCQl9OwotCiAJCWZsZXhnZW5fbm9kZSB7CiAJCQkuLi4KIAkJfTsKQEAgLTQzLDExICszMSw4IEBACiBFYWNoIHN1Ym5vZGUgc2hvdWxkIHVzZSB0aGUgYmluZGluZyBkZXNjcmliZWQgaW4gWzJdLi5bN10KIAogWzFdIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9jbG9jay1iaW5kaW5ncy50eHQKLVsyXSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3QsY2xrZ2VuLWRpdm11eC50eHQKIFszXSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3QsY2xrZ2VuLW11eC50eHQKIFs0XSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3QsY2xrZ2VuLXBsbC50eHQKLVs1XSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3QsY2xrZ2VuLXByZWRpdi50eHQKLVs2XSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3QsdmNjLnR4dAogWzddIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdCxxdWFkZnMudHh0CiBbOF0gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0LGZsZXhnZW4udHh0CiAKQEAgLTU3LDQ0ICs0MiwyNyBAQAogCiBFeGFtcGxlOgogCi0JY2xvY2tnZW4tYUBmZWU2MjAwMCB7Ci0KLQkJcmVnID0gPDB4ZmVlNjIwMDAgMHhiNDg+OworCWNsb2NrZ2VuLWFAMDkwZmYwMDAgeworCQljb21wYXRpYmxlID0gInN0LGNsa2dlbi1jMzIiOworCQlyZWcgPSA8MHg5MGZmMDAwIDB4MTAwMD47CiAKIAkJY2xrX3NfYTBfcGxsOiBjbGstcy1hMC1wbGwgewogCQkJI2Nsb2NrLWNlbGxzID0gPDE+OwotCQkJY29tcGF0aWJsZSA9ICJzdCxjbGtnZW5hLXBsbHMtYzY1IjsKLQotCQkJY2xvY2tzID0gPCZjbGstc3lzaW4+OwotCi0JCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY2xrLXMtYTAtcGxsMC1ocyIsCi0JCQkJCSAgICAgImNsay1zLWEwLXBsbDAtbHMiLAotCQkJCQkgICAgICJjbGstcy1hMC1wbGwxIjsKLQkJfTsKLQotCQljbGtfc19hMF9vc2NfcHJlZGl2OiBjbGstcy1hMC1vc2MtcHJlZGl2IHsKLQkJCSNjbG9jay1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAic3QsY2xrZ2VuYS1wcmVkaXYtYzY1IiwKLQkJCQkgICAgICJzdCxjbGtnZW5hLXByZWRpdiI7CisJCQljb21wYXRpYmxlID0gInN0LGNsa2dlbi1wbGwwIjsKIAogCQkJY2xvY2tzID0gPCZjbGtfc3lzaW4+OwogCi0JCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY2xrLXMtYTAtb3NjLXByZWRpdiI7CisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY2xrLXMtYTAtcGxsLW9mZC0wIjsKIAkJfTsKIAotCQljbGtfc19hMF9oczogY2xrLXMtYTAtaHMgeworCQljbGtfc19hMF9mbGV4Z2VuOiBjbGstcy1hMC1mbGV4Z2VuIHsKKwkJCWNvbXBhdGlibGUgPSAic3QsZmxleGdlbiI7CisKIAkJCSNjbG9jay1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAic3QsY2xrZ2VuYS1kaXZtdXgtYzY1LWhzIiwKLQkJCQkgICAgICJzdCxjbGtnZW5hLWRpdm11eCI7CiAKLQkJCWNsb2NrcyA9IDwmY2xrLXNfYTBfb3NjX3ByZWRpdj4sCi0JCQkJIDwmY2xrLXNfYTBfcGxsIDA+LCAvKiBwbGwwIGhzICovCi0JCQkJIDwmY2xrLXNfYTBfcGxsIDI+OyAvKiBwbGwxICovCisJCQljbG9ja3MgPSA8JmNsa19zX2EwX3BsbCAwPiwKKwkJCQkgPCZjbGtfc3lzaW4+OwogCi0JCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY2xrLXMtZmRtYS0wIiwKLQkJCQkJICAgICAiY2xrLXMtZmRtYS0xIiwKLQkJCQkJICAgICAiIjsgLyogY2xrLXMtaml0LXNlbnNlICovCi0JCQkJCSAgICAgLyogZm91cnRoIG91dHB1dCB1bnVzZWQgKi8KKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbGstaWMtbG1pMCI7CiAJCX07CiAJfTsKLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGZsZXhnZW4udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGZsZXhnZW4udHh0CmluZGV4IGI3ZWU1YzcuLjdmZjc3ZmMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxmbGV4Z2VuLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QsZmxleGdlbi50eHQKQEAgLTYwLDYgKzYwLDEwIEBACiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgogLSBjb21wYXRpYmxlIDogc2hhbGwgYmU6CiAgICJzdCxmbGV4Z2VuIgorICAic3QsZmxleGdlbi1hdWRpbyIsICJzdCxmbGV4Z2VuIiAoZW5hYmxlIGNsb2NrIHByb3BhZ2F0aW9uIG9uIHBhcmVudCBmb3IKKyAgYXVkaW8gdXNlIGNhc2UpCisgICJzdCxmbGV4Z2VuLXZpZGVvIiwgInN0LGZsZXhnZW4iIChlbmFibGUgY2xvY2sgcHJvcGFnYXRpb24gb24gcGFyZW50CisJCQkJCWFuZCBhY3RpdmF0ZSBzeW5jaHJvbm91cyBtb2RlKQogCiAtICNjbG9jay1jZWxscyA6IGZyb20gY29tbW9uIGNsb2NrIGJpbmRpbmc7IHNoYWxsIGJlIHNldCB0byAxIChtdWx0aXBsZSBjbG9jawogICBvdXRwdXRzKS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxxdWFkZnMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LHF1YWRmcy50eHQKaW5kZXggY2VkZWI5Yy4uZDkzZDQ5MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LHF1YWRmcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LHF1YWRmcy50eHQKQEAgLTExLDEyICsxMSw4IEBACiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAtIGNvbXBhdGlibGUgOiBzaGFsbCBiZToKLSAgInN0LHN0aWg0MTYtcXVhZGZzMjE2IiwJInN0LHF1YWRmcyIKLSAgInN0LHN0aWg0MTYtcXVhZGZzNDMyIiwJInN0LHF1YWRmcyIKLSAgInN0LHN0aWg0MTYtcXVhZGZzNjYwLUUiLAkic3QscXVhZGZzIgotICAic3Qsc3RpaDQxNi1xdWFkZnM2NjAtRiIsCSJzdCxxdWFkZnMiCi0gICJzdCxzdGloNDA3LXF1YWRmczY2MC1DIiwJInN0LHF1YWRmcyIKLSAgInN0LHN0aWg0MDctcXVhZGZzNjYwLUQiLAkic3QscXVhZGZzIgorICAic3QscXVhZGZzIgorICAic3QscXVhZGZzLXBsbCIKIAogCiAtICNjbG9jay1jZWxscyA6IGZyb20gY29tbW9uIGNsb2NrIGJpbmRpbmc7IHNoYWxsIGJlIHNldCB0byAxLgpAQCAtMzUsMTQgKzMxLDE1IEBACiAKIEV4YW1wbGU6CiAKLQljbG9ja2dlbl9lOiBjbG9ja2dlbi1lQGZkMzIwOGJjIHsKLSAgICAgICAgICAgICAgICAjY2xvY2stY2VsbHMgPSA8MT47Ci0gICAgICAgICAgICAgICAgY29tcGF0aWJsZSA9ICJzdCxzdGloNDE2LXF1YWRmczY2MC1FIiwgInN0LHF1YWRmcyI7Ci0gICAgICAgICAgICAgICAgcmVnID0gPDB4ZmQzMjA4YmMgMHhCMD47CisJY2xrX3NfYzBfcXVhZGZzOiBjbGstcy1jMC1xdWFkZnNAOTEwMzAwMCB7CisJCSNjbG9jay1jZWxscyA9IDwxPjsKKwkJY29tcGF0aWJsZSA9ICJzdCxxdWFkZnMtcGxsIjsKKwkJcmVnID0gPDB4OTEwMzAwMCAweDEwMDA+OwogCi0gICAgICAgICAgICAgICAgY2xvY2tzID0gPCZjbGtfc3lzaW4+OwotICAgICAgICAgICAgICAgIGNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbGstbS1waXgtbWR0cC0wIiwKLQkJCQkgICAgICJjbGstbS1waXgtbWR0cC0xIiwKLQkJCQkgICAgICJjbGstbS1waXgtbWR0cC0yIiwKLQkJCQkgICAgICJjbGstbS1tcGVscGMiOwotICAgICAgICB9OworCQljbG9ja3MgPSA8JmNsa19zeXNpbj47CisKKwkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNsay1zLWMwLWZzMC1jaDAiLAorCQkJCSAgICAgImNsay1zLWMwLWZzMC1jaDEiLAorCQkJCSAgICAgImNsay1zLWMwLWZzMC1jaDIiLAorCQkJCSAgICAgImNsay1zLWMwLWZzMC1jaDMiOworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3VueGktY2N1LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdW54aS1jY3UudHh0CmluZGV4IGNiOTE1MDcuLjM4Njg0NTggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdW54aS1jY3UudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdW54aS1jY3UudHh0CkBAIC0yLDcgKzIsMTAgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzIDoKLS0gY29tcGF0aWJsZTogbXVzdCBjb250YWluIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbXBhdGlibGU6CistIGNvbXBhdGlibGU6IG11c3QgY29udGFpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb21wYXRpYmxlczoKKwkJLSAiYWxsd2lubmVyLHN1bjZpLWEzMS1jY3UiCisJCS0gImFsbHdpbm5lcixzdW44aS1hMjMtY2N1IgorCQktICJhbGx3aW5uZXIsc3VuOGktYTMzLWNjdSIKIAkJLSAiYWxsd2lubmVyLHN1bjhpLWgzLWNjdSIKIAogLSByZWc6IE11c3QgY29udGFpbiB0aGUgcmVnaXN0ZXJzIGJhc2UgYWRkcmVzcyBhbmQgbGVuZ3RoCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svdW5pcGhpZXItY2xvY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3VuaXBoaWVyLWNsb2NrLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzE3OWQzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3VuaXBoaWVyLWNsb2NrLnR4dApAQCAtMCwwICsxLDEzNCBAQAorVW5pUGhpZXIgY2xvY2sgY29udHJvbGxlcgorCisKK1N5c3RlbSBjbG9jaworLS0tLS0tLS0tLS0tCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IHNob3VsZCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICAic29jaW9uZXh0LHVuaXBoaWVyLXNsZDMtY2xvY2siIC0gZm9yIHNMRDMgU29DLgorICAgICJzb2Npb25leHQsdW5pcGhpZXItbGQ0LWNsb2NrIiAgLSBmb3IgTEQ0IFNvQy4KKyAgICAic29jaW9uZXh0LHVuaXBoaWVyLXBybzQtY2xvY2siIC0gZm9yIFBybzQgU29DLgorICAgICJzb2Npb25leHQsdW5pcGhpZXItc2xkOC1jbG9jayIgLSBmb3Igc0xEOCBTb0MuCisgICAgInNvY2lvbmV4dCx1bmlwaGllci1wcm81LWNsb2NrIiAtIGZvciBQcm81IFNvQy4KKyAgICAic29jaW9uZXh0LHVuaXBoaWVyLXB4czItY2xvY2siIC0gZm9yIFBYczIvTEQ2YiBTb0MuCisgICAgInNvY2lvbmV4dCx1bmlwaGllci1sZDExLWNsb2NrIiAtIGZvciBMRDExIFNvQy4KKyAgICAic29jaW9uZXh0LHVuaXBoaWVyLWxkMjAtY2xvY2siIC0gZm9yIExEMjAgU29DLgorLSAjY2xvY2stY2VsbHM6IHNob3VsZCBiZSAxLgorCitFeGFtcGxlOgorCisJc3lzY3RybEA2MTg0MDAwMCB7CisJCWNvbXBhdGlibGUgPSAic29jaW9uZXh0LHVuaXBoaWVyLXN5c2N0cmwiLAorCQkJICAgICAic2ltcGxlLW1mZCIsICJzeXNjb24iOworCQlyZWcgPSA8MHg2MTg0MDAwMCAweDQwMDA+OworCisJCWNsb2NrIHsKKwkJCWNvbXBhdGlibGUgPSAic29jaW9uZXh0LHVuaXBoaWVyLWxkMjAtY2xvY2siOworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQl9OworCisJCW90aGVyIG5vZGVzIC4uLgorCX07CisKK1Byb3ZpZGVkIGNsb2NrczoKKworIDg6IFNUIERNQUMKKzEyOiBHSU8gKEdpZ2EgYml0IHN0cmVhbSBJL08pCisxNDogVVNCMyBjaDAgaG9zdAorMTU6IFVTQjMgY2gxIGhvc3QKKzE2OiBVU0IzIGNoMCBQSFkwCisxNzogVVNCMyBjaDAgUEhZMQorMjA6IFVTQjMgY2gxIFBIWTAKKzIxOiBVU0IzIGNoMSBQSFkxCisKKworTWVkaWEgSS9PIChNSU8pIGNsb2NrCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogc2hvdWxkIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICAgICJzb2Npb25leHQsdW5pcGhpZXItc2xkMy1taW8tY2xvY2siIC0gZm9yIHNMRDMgU29DLgorICAgICJzb2Npb25leHQsdW5pcGhpZXItbGQ0LW1pby1jbG9jayIgIC0gZm9yIExENCBTb0MuCisgICAgInNvY2lvbmV4dCx1bmlwaGllci1wcm80LW1pby1jbG9jayIgLSBmb3IgUHJvNCBTb0MuCisgICAgInNvY2lvbmV4dCx1bmlwaGllci1zbGQ4LW1pby1jbG9jayIgLSBmb3Igc0xEOCBTb0MuCisgICAgInNvY2lvbmV4dCx1bmlwaGllci1wcm81LW1pby1jbG9jayIgLSBmb3IgUHJvNSBTb0MuCisgICAgInNvY2lvbmV4dCx1bmlwaGllci1weHMyLW1pby1jbG9jayIgLSBmb3IgUFhzMi9MRDZiIFNvQy4KKyAgICAic29jaW9uZXh0LHVuaXBoaWVyLWxkMTEtbWlvLWNsb2NrIiAtIGZvciBMRDExIFNvQy4KKyAgICAic29jaW9uZXh0LHVuaXBoaWVyLWxkMjAtbWlvLWNsb2NrIiAtIGZvciBMRDIwIFNvQy4KKy0gI2Nsb2NrLWNlbGxzOiBzaG91bGQgYmUgMS4KKworRXhhbXBsZToKKworCW1pb2N0cmxANTk4MTAwMDAgeworCQljb21wYXRpYmxlID0gInNvY2lvbmV4dCx1bmlwaGllci1taW9jdHJsIiwKKwkJCSAgICAgInNpbXBsZS1tZmQiLCAic3lzY29uIjsKKwkJcmVnID0gPDB4NTk4MTAwMDAgMHg4MDA+OworCisJCWNsb2NrIHsKKwkJCWNvbXBhdGlibGUgPSAic29jaW9uZXh0LHVuaXBoaWVyLWxkMjAtbWlvLWNsb2NrIjsKKwkJCSNjbG9jay1jZWxscyA9IDwxPjsKKwkJfTsKKworCQlvdGhlciBub2RlcyAuLi4KKwl9OworCitQcm92aWRlZCBjbG9ja3M6CisKKyAwOiBTRCBjaDAgaG9zdAorIDE6IGVNTUMgaG9zdAorIDI6IFNEIGNoMSBob3N0CisgNzogTUlPIERNQUMKKyA4OiBVU0IyIGNoMCBob3N0CisgOTogVVNCMiBjaDEgaG9zdAorMTA6IFVTQjIgY2gyIGhvc3QKKzExOiBVU0IyIGNoMyBob3N0CisxMjogVVNCMiBjaDAgUEhZCisxMzogVVNCMiBjaDEgUEhZCisxNDogVVNCMiBjaDIgUEhZCisxNTogVVNCMiBjaDMgUEhZCisKKworUGVyaXBoZXJhbCBjbG9jaworLS0tLS0tLS0tLS0tLS0tLQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBzaG91bGQgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgInNvY2lvbmV4dCx1bmlwaGllci1zbGQzLXBlcmktY2xvY2siIC0gZm9yIHNMRDMgU29DLgorICAgICJzb2Npb25leHQsdW5pcGhpZXItbGQ0LXBlcmktY2xvY2siICAtIGZvciBMRDQgU29DLgorICAgICJzb2Npb25leHQsdW5pcGhpZXItcHJvNC1wZXJpLWNsb2NrIiAtIGZvciBQcm80IFNvQy4KKyAgICAic29jaW9uZXh0LHVuaXBoaWVyLXNsZDgtcGVyaS1jbG9jayIgLSBmb3Igc0xEOCBTb0MuCisgICAgInNvY2lvbmV4dCx1bmlwaGllci1wcm81LXBlcmktY2xvY2siIC0gZm9yIFBybzUgU29DLgorICAgICJzb2Npb25leHQsdW5pcGhpZXItcHhzMi1wZXJpLWNsb2NrIiAtIGZvciBQWHMyL0xENmIgU29DLgorICAgICJzb2Npb25leHQsdW5pcGhpZXItbGQxMS1wZXJpLWNsb2NrIiAtIGZvciBMRDExIFNvQy4KKyAgICAic29jaW9uZXh0LHVuaXBoaWVyLWxkMjAtcGVyaS1jbG9jayIgLSBmb3IgTEQyMCBTb0MuCistICNjbG9jay1jZWxsczogc2hvdWxkIGJlIDEuCisKK0V4YW1wbGU6CisKKwlwZXJpY3RybEA1OTgyMDAwMCB7CisJCWNvbXBhdGlibGUgPSAic29jaW9uZXh0LHVuaXBoaWVyLXBlcmljdHJsIiwKKwkJCSAgICAgInNpbXBsZS1tZmQiLCAic3lzY29uIjsKKwkJcmVnID0gPDB4NTk4MjAwMDAgMHgyMDA+OworCisJCWNsb2NrIHsKKwkJCWNvbXBhdGlibGUgPSAic29jaW9uZXh0LHVuaXBoaWVyLWxkMjAtcGVyaS1jbG9jayI7CisJCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCX07CisKKwkJb3RoZXIgbm9kZXMgLi4uCisJfTsKKworUHJvdmlkZWQgY2xvY2tzOgorCisgMDogVUFSVCBjaDAKKyAxOiBVQVJUIGNoMQorIDI6IFVBUlQgY2gyCisgMzogVUFSVCBjaDMKKyA0OiBJMkMgY2gwCisgNTogSTJDIGNoMQorIDY6IEkyQyBjaDIKKyA3OiBJMkMgY2gzCisgODogSTJDIGNoNAorIDk6IEkyQyBjaDUKKzEwOiBJMkMgY2g2CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2sveGdlbmUudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3hnZW5lLnR4dAppbmRleCA4MmY5NjM4Li44MjMzZTc3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2sveGdlbmUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay94Z2VuZS50eHQKQEAgLTgsNiArOCw3IEBACiAtIGNvbXBhdGlibGUgOiBzaGFsbCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKIAkiYXBtLHhnZW5lLXNvY3BsbC1jbG9jayIgLSBmb3IgYSBYLUdlbmUgU29DIFBMTCBjbG9jawogCSJhcG0seGdlbmUtcGNwcGxsLWNsb2NrIiAtIGZvciBhIFgtR2VuZSBQQ1AgUExMIGNsb2NrCisJImFwbSx4Z2VuZS1wbWQtY2xvY2siIC0gZm9yIGEgWC1HZW5lIFBNRCBjbG9jawogCSJhcG0seGdlbmUtZGV2aWNlLWNsb2NrIiAtIGZvciBhIFgtR2VuZSBkZXZpY2UgY2xvY2sKIAkiYXBtLHhnZW5lLXNvY3BsbC12Mi1jbG9jayIgLSBmb3IgYSBYLUdlbmUgU29DIFBMTCB2MiBjbG9jawogCSJhcG0seGdlbmUtcGNwcGxsLXYyLWNsb2NrIiAtIGZvciBhIFgtR2VuZSBQQ1AgUExMIHYyIGNsb2NrCkBAIC0yMiw2ICsyMywxNSBAQAogT3B0aW9uYWwgcHJvcGVydGllcyBmb3IgUExMIGNsb2NrczoKIC0gY2xvY2stbmFtZXMgOiBzaGFsbCBiZSB0aGUgbmFtZSBvZiB0aGUgUExMLiBJZiBtaXNzaW5nLCB1c2UgdGhlIGRldmljZSBuYW1lLgogCitSZXF1aXJlZCBwcm9wZXJ0aWVzIGZvciBQTUQgY2xvY2tzOgorLSByZWcgOiBzaGFsbCBiZSB0aGUgcGh5c2ljYWwgcmVnaXN0ZXIgYWRkcmVzcyBmb3IgdGhlIHBtZCBjbG9jay4KKy0gY2xvY2tzIDogc2hhbGwgYmUgdGhlIGlucHV0IHBhcmVudCBjbG9jayBwaGFuZGxlIGZvciB0aGUgY2xvY2suCistICNjbG9jay1jZWxscyA6IHNoYWxsIGJlIHNldCB0byAxLgorLSBjbG9jay1vdXRwdXQtbmFtZXMgOiBzaGFsbCBiZSB0aGUgbmFtZSBvZiB0aGUgY2xvY2sgcmVmZXJlbmNlZCBieSBkZXJpdmUKKyAgY2xvY2suCitPcHRpb25hbCBwcm9wZXJ0aWVzIGZvciBQTEwgY2xvY2tzOgorLSBjbG9jay1uYW1lcyA6IHNoYWxsIGJlIHRoZSBuYW1lIG9mIHRoZSBjbG9jay4gSWYgbWlzc2luZywgdXNlIHRoZSBkZXZpY2UgbmFtZS4KKwogUmVxdWlyZWQgcHJvcGVydGllcyBmb3IgZGV2aWNlIGNsb2NrczoKIC0gcmVnIDogc2hhbGwgYmUgYSBsaXN0IG9mIGFkZHJlc3MgYW5kIGxlbmd0aCBwYWlycyBkZXNjcmliaW5nIHRoZSBDU1IKICAgICAgICAgIHJlc2V0IGFuZC9vciB0aGUgZGl2aWRlci4gRWl0aGVyIG1heSBiZSBvbWl0dGVkLCBidXQgYXQgbGVhc3QKQEAgLTU5LDYgKzY5LDE0IEBACiAJCXR5cGUgPSA8MD47CiAJfTsKIAorCXBtZDBjbGs6IHBtZDBjbGtAN2UyMDAyMDAgeworCQljb21wYXRpYmxlID0gImFwbSx4Z2VuZS1wbWQtY2xvY2siOworCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCWNsb2NrcyA9IDwmcG1kcGxsIDA+OworCQlyZWcgPSA8MHgwIDB4N2UyMDAyMDAgMHgwIDB4MTA+OworCQljbG9jay1vdXRwdXQtbmFtZXMgPSAicG1kMGNsayI7CisJfTsKKwogCXNvY3BsbDogc29jcGxsQDE3MDAwMTIwIHsKIAkJY29tcGF0aWJsZSA9ICJhcG0seGdlbmUtc29jcGxsLWNsb2NrIjsKIAkJI2Nsb2NrLWNlbGxzID0gPDE+OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3p4Mjk2NzE4LWNsay50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svengyOTY3MTgtY2xrLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzE4YjdiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3p4Mjk2NzE4LWNsay50eHQKQEAgLTAsMCArMSwzNSBAQAorRGV2aWNlIFRyZWUgQ2xvY2sgYmluZGluZ3MgZm9yIFpURSB6eDI5NjcxOAorCitUaGlzIGJpbmRpbmcgdXNlcyB0aGUgY29tbW9uIGNsb2NrIGJpbmRpbmdbMV0uCisKK1sxXSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svY2xvY2stYmluZGluZ3MudHh0CisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiBzaGFsbCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKwkienRlLHp4Mjk2NzE4LXRvcGNybSI6CisJCXp4Mjk2NzE4IHRvcCBjbG9jayBzZWxlY3Rpb24sIGRpdmlkZXIgYW5kIGdhdGluZworCisJInp0ZSx6eDI5NjcxOC1sc3AwY3JtIiBhbmQKKwkienRlLHp4Mjk2NzE4LWxzcDFjcm0iOgorCQl6eDI5NjcxOCBkZXZpY2UgbGV2ZWwgY2xvY2sgc2VsZWN0aW9uIGFuZCBnYXRpbmcKKworLSByZWc6IEFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0CisKK1RoZSBjbG9jayBjb25zdW1lciBzaG91bGQgc3BlY2lmeSB0aGUgZGVzaXJlZCBjbG9jayBieSBoYXZpbmcgdGhlIGNsb2NrCitJRCBpbiBpdHMgImNsb2NrcyIgcGhhbmRsZSBjZWxsLiBTZWUgaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay96eDI5NjcxOC1jbG9jay5oCitmb3IgdGhlIGZ1bGwgbGlzdCBvZiB6eDI5NjcxOCBjbG9jayBJRHMuCisKKwordG9wY2xrOiB0b3Bjcm1AMTQ2MTAwMCB7CisgICAgICAgIGNvbXBhdGlibGUgPSAienRlLHp4Mjk2NzE4LXRvcGNybS1jbGsiOworICAgICAgICByZWcgPSA8MHgwMTQ2MTAwMCAweDEwMDA+OworICAgICAgICAjY2xvY2stY2VsbHMgPSA8MT47Cit9OworCit1c2JwaHkwOnVzYi1waHkwIHsKKwljb21wYXRpYmxlID0gInp0ZSx6eDI5NjcxOC11c2ItcGh5IjsKKwkjcGh5LWNlbGxzID0gPDA+OworCWNsb2NrcyA9IDwmdG9wY2xrIFVTQjIwX1BIWV9DTEs+OworCWNsb2NrLW5hbWVzID0gInBoeWNsayI7CisJc3RhdHVzID0gIm9rYXkiOworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kZXZmcmVxL2V2ZW50L3JvY2tjaGlwLWRmaS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZGV2ZnJlcS9ldmVudC9yb2NrY2hpcC1kZmkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMjMzMTMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZGV2ZnJlcS9ldmVudC9yb2NrY2hpcC1kZmkudHh0CkBAIC0wLDAgKzEsMTkgQEAKKworKiBSb2NrY2hpcCByazMzOTkgREZJIGRldmljZQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBNdXN0IGJlICJyb2NrY2hpcCxyazMzOTktZGZpIi4KKy0gcmVnOiBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgZWFjaCBERkkgYW5kIGxlbmd0aCBvZiBtZW1vcnkgbWFwcGVkIHJlZ2lvbgorLSByb2NrY2hpcCxwbXU6IHBoYW5kbGUgdG8gdGhlIHN5c2NvbiBtYW5hZ2luZyB0aGUgInBtdSBnZW5lcmFsIHJlZ2lzdGVyIGZpbGVzIgorLSBjbG9ja3M6IHBoYW5kbGVzIGZvciBjbG9jayBzcGVjaWZpZWQgaW4gImNsb2NrLW5hbWVzIiBwcm9wZXJ0eQorLSBjbG9jay1uYW1lcyA6IHRoZSBuYW1lIG9mIGNsb2NrIHVzZWQgYnkgdGhlIERGSSwgbXVzdCBiZSAicGNsa19kZHJfbW9uIjsKKworRXhhbXBsZToKKwlkZmk6IGRmaUAweGZmNjMwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzOTktZGZpIjsKKwkJcmVnID0gPDB4MDAgMHhmZjYzMDAwMCAweDAwIDB4NDAwMD47CisJCXJvY2tjaGlwLHBtdSA9IDwmcG11Z3JmPjsKKwkJY2xvY2tzID0gPCZjcnUgUENMS19ERFJfTU9OPjsKKwkJY2xvY2stbmFtZXMgPSAicGNsa19kZHJfbW9uIjsKKwkJc3RhdHVzID0gImRpc2FibGVkIjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2RldmZyZXEvcmszMzk5X2RtYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZGV2ZnJlcS9yazMzOTlfZG1jLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTllODYwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2RldmZyZXEvcmszMzk5X2RtYy50eHQKQEAgLTAsMCArMSwyMDkgQEAKKyogUm9ja2NoaXAgcmszMzk5IERNQyhEeW5hbWljIE1lbW9yeSBDb250cm9sbGVyKSBkZXZpY2UKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZToJCSBNdXN0IGJlICJyb2NrY2hpcCxyazMzOTktZG1jIi4KKy0gZGV2ZnJlcS1ldmVudHM6CSBOb2RlIHRvIGdldCBERFIgbG9hZGluZywgUmVmZXIgdG8KKwkJCSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZGV2ZnJlcS8KKwkJCSByb2NrY2hpcC1kZmkudHh0CistIGludGVycnVwdHM6CQkgVGhlIGludGVycnVwdCBudW1iZXIgdG8gdGhlIENQVS4gVGhlIGludGVycnVwdAorCQkJIHNwZWNpZmllciBmb3JtYXQgZGVwZW5kcyBvbiB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIuCisJCQkgSXQgc2hvdWxkIGJlIERDRiBpbnRlcnJ1cHRzLCB3aGVuIEREUiBkdmZzIGZpbmlzaCwKKwkJCSBpdCB3aWxsIGhhcHBlbi4KKy0gY2xvY2tzOgkJIFBoYW5kbGVzIGZvciBjbG9jayBzcGVjaWZpZWQgaW4gImNsb2NrLW5hbWVzIiBwcm9wZXJ0eQorLSBjbG9jay1uYW1lcyA6CQkgVGhlIG5hbWUgb2YgY2xvY2sgdXNlZCBieSB0aGUgREZJLCBtdXN0IGJlCisJCQkgInBjbGtfZGRyX21vbiI7CistIG9wZXJhdGluZy1wb2ludHMtdjI6CSBSZWZlciB0byBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvb3BwLnR4dAorCQkJIGZvciBkZXRhaWxzLgorLSBjZW50ZXItc3VwcGx5OgkgRE1DIHN1cHBseSBub2RlLgorLSBzdGF0dXM6CQkgTWFya3MgdGhlIG5vZGUgZW5hYmxlZC9kaXNhYmxlZC4KKworRm9sbG93aW5nIHByb3BlcnRpZXMgYXJlIGRkciB0aW1pbmc6CisKKy0gcm9ja2NoaXAsZHJhbV9zcGVlZF9iaW4gOgkgIFZhbHVlIHJlZmVyZW5jZSBpbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2Rkci5oLAorCQkJCSAgaXQgc2VsZWN0IGRkcjMgY2wtdHJwLXRyY2QgdHlwZSwgZGVmYXVsdCB2YWx1ZQorCQkJCSAgIkREUjNfREVGQVVMVCIuaXQgbXVzdCBzZWxlY3RlZCBhY2NvcmRpbmcgdG8KKwkJCQkgICJTcGVlZCBCaW4iIGluIGRkcjMgZGF0YXNoZWV0LCBETyBOT1QgdXNlCisJCQkJICBzbWFsbGVyICJTcGVlZCBCaW4iIHRoYW4gZGRyMyBleGFjdGx5IGlzLgorCistIHJvY2tjaGlwLHBkX2lkbGUgOgkJICBDb25maWcgdGhlIFBEX0lETEUgdmFsdWUsIGRlZmluZWQgdGhlIHBvd2VyLWRvd24KKwkJCQkgIGlkbGUgcGVyaW9kLCBtZW1vcmllcyBhcmUgcGxhY2VzIGludG8gcG93ZXItZG93bgorCQkJCSAgbW9kZSBpZiBidXMgaXMgaWRsZSBmb3IgUERfSURMRSBERkkgY2xvY2tzLgorCistIHJvY2tjaGlwLHNyX2lkbGUgOgkJICBDb25maWd1cmUgdGhlIFNSX0lETEUgdmFsdWUsIGRlZmluZWQgdGhlCisJCQkJICBzZWxmcmVmcmVzaCBpZGxlIHBlcmlvZCwgbWVtb3JpZXMgYXJlIHBsYWNlcworCQkJCSAgaW50byBzZWxmLXJlZnJlc2ggbW9kZSBpZiBidXMgaXMgaWRsZSBmb3IKKwkJCQkgIFNSX0lETEUqMTAyNCBERkkgY2xvY2tzIChERkkgY2xvY2tzIGZyZXEgaXMKKwkJCQkgIGhhbGYgb2YgZHJhbSdzIGNsb2NrcyksIGRlZmF1bGUgdmFsdWUgaXMgIjAiLgorCistIHJvY2tjaGlwLHNyX21jX2dhdGVfaWRsZSA6CSAgRGVmaW5lZCB0aGUgc2VsZi1yZWZyZXNoIHdpdGggbWVtb3J5IGFuZAorCQkJCSAgY29udHJvbGxlciBjbG9jayBnYXRpbmcgaWRsZSBwZXJpb2QsIG1lbW9yaWVzCisJCQkJICBhcmUgcGxhY2VzIGludG8gc2VsZi1yZWZyZXNoIG1vZGUgYW5kIG1lbW9yeQorCQkJCSAgY29udHJvbGxlciBjbG9jayBhcmcgZ2F0aW5nIGlmIGJ1cyBpcyBpZGxlIGZvcgorCQkJCSAgc3JfbWNfZ2F0ZV9pZGxlKjEwMjQgREZJIGNsb2Nrcy4KKworLSByb2NrY2hpcCxzcnBkX2xpdGVfaWRsZSA6CSAgRGVmaW5lZCB0aGUgc2VsZi1yZWZyZXNoIHBvd2VyIGRvd24gaWRsZQorCQkJCSAgcGVyaW9kLCBtZW1vcmllcyBhcmUgcGxhY2VzIGludG8gc2VsZi1yZWZyZXNoCisJCQkJICBwb3dlciBkb3duIG1vZGUgaWYgYnVzIGlzIGlkbGUgZm9yCisJCQkJICBzcnBkX2xpdGVfaWRsZSoxMDI0IERGSSBjbG9ja3MuIFRoaXMgcGFyYW1ldGVyCisJCQkJICBpcyBmb3IgTFBERFI0IG9ubHkuCisKKy0gcm9ja2NoaXAsc3RhbmRieV9pZGxlIDoJICBEZWZpbmVkIHRoZSBzdGFuZGJ5IGlkbGUgcGVyaW9kLCBtZW1vcmllcyBhcmUKKwkJCQkgIHBsYWNlcyBpbnRvIHNlbGYtcmVmcmVzaCB0aGFuIGNvbnRyb2xsZXIsIHBpLAorCQkJCSAgcGh5IGFuZCBkcmFtIGNsb2NrIHdpbGwgZ2F0aW5nIGlmIGJ1cyBpcyBpZGxlCisJCQkJICBmb3Igc3RhbmRieV9pZGxlICogREZJIGNsb2Nrcy4KKworLSByb2NrY2hpcCxkcmFtX2RsbF9kaXNiX2ZyZXEgOiAgSXQncyBkZWZpbmVkIHRoZSBERFIzIGRsbCBieXBhc3MgZnJlcXVlbmN5IGluCisJCQkJICBNSHosIHdoZW4gZGRyIGZyZXEgbGVzcyB0aGFuIERSQU1fRExMX0RJU0JfRlJFUSwKKwkJCQkgIGRkcjMgZGxsIHdpbGwgYnlwc3NlZCBub3RlOiBpZiBkbGwgd2FzIGJ5cGFzc2VkLAorCQkJCSAgdGhlIG9kdCBhbHNvIHN0b3Agd29ya2luZy4KKworLSByb2NrY2hpcCxwaHlfZGxsX2Rpc2JfZnJlcSA6CSAgRGVmaW5lZCB0aGUgUEhZIGRsbCBieXBhc3MgZnJlcXVlbmN5IGluCisJCQkJICBNSHogKE1lZ2EgSHopLCB3aGVuIGRkciBmcmVxIGxlc3MgdGhhbgorCQkJCSAgRFJBTV9ETExfRElTQl9GUkVRLCBwaHkgZGxsIHdpbGwgYnlwc3NlZC4KKwkJCQkgIG5vdGU6IHBoeSBkbGwgYW5kIHBoeSBvZHQgYXJlIGluZGVwZW5kZW50LgorCistIHJvY2tjaGlwLGRkcjNfb2R0X2Rpc2JfZnJlcSA6ICBXaGVuIGRyYW0gdHlwZSBpcyBERFIzLCB0aGlzIHBhcmFtZXRlciBkZWZpbmVkCisJCQkJICB0aGUgb2R0IGRpc2FibGUgZnJlcXVlbmN5IGluIE1IeiAoTWVnYSBIeiksCisJCQkJICB3aGVuIGRkciBmcmVxdWVuY3kgbGVzcyB0aGVuIGRkcjNfb2R0X2Rpc2JfZnJlcSwKKwkJCQkgIHRoZSBvZHQgb24gZHJhbSBzaWRlIGFuZCBjb250cm9sbGVyIHNpZGUgYXJlCisJCQkJICBib3RoIGRpc2FibGVkLgorCistIHJvY2tjaGlwLGRkcjNfZHJ2IDoJCSAgV2hlbiBkcmFtIHR5cGUgaXMgRERSMywgdGhpcyBwYXJhbWV0ZXIgZGVmaW5lCisJCQkJICB0aGUgZHJhbSBzaWRlIGRyaXZlciBzdGVuZ3RoIGluIG9obSwgZGVmYXVsdAorCQkJCSAgdmFsdWUgaXMgRERSM19EU180MG9obS4KKworLSByb2NrY2hpcCxkZHIzX29kdCA6CQkgIFdoZW4gZHJhbSB0eXBlIGlzIEREUjMsIHRoaXMgcGFyYW1ldGVyIGRlZmluZQorCQkJCSAgdGhlIGRyYW0gc2lkZSBPRFQgc3Rlbmd0aCBpbiBvaG0sIGRlZmF1bHQgdmFsdWUKKwkJCQkgIGlzIEREUjNfT0RUXzEyMG9obS4KKworLSByb2NrY2hpcCxwaHlfZGRyM19jYV9kcnYgOgkgIFdoZW4gZHJhbSB0eXBlIGlzIEREUjMsIHRoaXMgcGFyYW1ldGVyIGRlZmluZQorCQkJCSAgdGhlIHBoeSBzaWRlIENBIGxpbmUoaW5jbHVpbmcgY29tbWFuZCBsaW5lLAorCQkJCSAgYWRkcmVzcyBsaW5lIGFuZCBjbG9jayBsaW5lKSBkcml2ZXIgc3RyZW5ndGguCisJCQkJICBEZWZhdWx0IHZhbHVlIGlzIFBIWV9EUlZfT0RUXzQwLgorCistIHJvY2tjaGlwLHBoeV9kZHIzX2RxX2RydiA6CSAgV2hlbiBkcmFtIHR5cGUgaXMgRERSMywgdGhpcyBwYXJhbWV0ZXIgZGVmaW5lCisJCQkJICB0aGUgcGh5IHNpZGUgRFEgbGluZShpbmNsdWluZyBEUVMvRFEvRE0gbGluZSkKKwkJCQkgIGRyaXZlciBzdHJlbmd0aC4gZGVmYXVsdCB2YWx1ZSBpcyBQSFlfRFJWX09EVF80MC4KKworLSByb2NrY2hpcCxwaHlfZGRyM19vZHQgOiAJICBXaGVuIGRyYW0gdHlwZSBpcyBERFIzLCB0aGlzIHBhcmFtZXRlciBkZWZpbmUgdGhlCisJCQkJICBwaHkgc2lkZSBvZHQgc3RyZW5ndGgsIGRlZmF1bHQgdmFsdWUgaXMKKwkJCQkgIFBIWV9EUlZfT0RUXzI0MC4KKworLSByb2NrY2hpcCxscGRkcjNfb2R0X2Rpc2JfZnJlcSA6IFdoZW4gZHJhbSB0eXBlIGlzIExQRERSMywgdGhpcyBwYXJhbWV0ZXIgZGVmaW5lZAorCQkJCSAgdGhlbiBvZHQgZGlzYWJsZSBmcmVxdWVuY3kgaW4gTUh6IChNZWdhIEh6KSwKKwkJCQkgIHdoZW4gZGRyIGZyZXF1ZW5jeSBsZXNzIHRoZW4gZGRyM19vZHRfZGlzYl9mcmVxLAorCQkJCSAgdGhlIG9kdCBvbiBkcmFtIHNpZGUgYW5kIGNvbnRyb2xsZXIgc2lkZSBhcmUKKwkJCQkgIGJvdGggZGlzYWJsZWQuCisKKy0gcm9ja2NoaXAsbHBkZHIzX2RydiA6CSAgV2hlbiBkcmFtIHR5cGUgaXMgTFBERFIzLCB0aGlzIHBhcmFtZXRlciBkZWZpbmUKKwkJCQkgIHRoZSBkcmFtIHNpZGUgZHJpdmVyIHN0ZW5ndGggaW4gb2htLCBkZWZhdWx0CisJCQkJICB2YWx1ZSBpcyBMUDNfRFNfMzRvaG0uCisKKy0gcm9ja2NoaXAsbHBkZHIzX29kdCA6CSAgV2hlbiBkcmFtIHR5cGUgaXMgTFBERFIzLCB0aGlzIHBhcmFtZXRlciBkZWZpbmUKKwkJCQkgIHRoZSBkcmFtIHNpZGUgT0RUIHN0ZW5ndGggaW4gb2htLCBkZWZhdWx0IHZhbHVlCisJCQkJICBpcyBMUDNfT0RUXzI0MG9obS4KKworLSByb2NrY2hpcCxwaHlfbHBkZHIzX2NhX2RydiA6CSAgV2hlbiBkcmFtIHR5cGUgaXMgTFBERFIzLCB0aGlzIHBhcmFtZXRlciBkZWZpbmUKKwkJCQkgIHRoZSBwaHkgc2lkZSBDQSBsaW5lKGluY2x1aW5nIGNvbW1hbmQgbGluZSwKKwkJCQkgIGFkZHJlc3MgbGluZSBhbmQgY2xvY2sgbGluZSkgZHJpdmVyIHN0cmVuZ3RoLgorCQkJCSAgZGVmYXVsdCB2YWx1ZSBpcyBQSFlfRFJWX09EVF80MC4KKworLSByb2NrY2hpcCxwaHlfbHBkZHIzX2RxX2RydiA6CSAgV2hlbiBkcmFtIHR5cGUgaXMgTFBERFIzLCB0aGlzIHBhcmFtZXRlciBkZWZpbmUKKwkJCQkgIHRoZSBwaHkgc2lkZSBEUSBsaW5lKGluY2x1aW5nIERRUy9EUS9ETSBsaW5lKQorCQkJCSAgZHJpdmVyIHN0cmVuZ3RoLiBkZWZhdWx0IHZhbHVlIGlzCisJCQkJICBQSFlfRFJWX09EVF80MC4KKworLSByb2NrY2hpcCxwaHlfbHBkZHIzX29kdCA6IAkgIFdoZW4gZHJhbSB0eXBlIGlzIExQRERSMywgdGhpcyBwYXJhbWV0ZXIgZGVmaW5lCisJCQkJICB0aGUgcGh5IHNpZGUgb2R0IHN0cmVuZ3RoLCBkZWZhdWx0IHZhbHVlIGlzCisJCQkJICBQSFlfRFJWX09EVF8yNDAuCisKKy0gcm9ja2NoaXAsbHBkZHI0X29kdF9kaXNiX2ZyZXEgOiBXaGVuIGRyYW0gdHlwZSBpcyBMUEREUjQsIHRoaXMgcGFyYW1ldGVyCisJCQkJICBkZWZpbmVkIHRoZSBvZHQgZGlzYWJsZSBmcmVxdWVuY3kgaW4KKwkJCQkgIE1IeiAoTWVnYSBIeiksIHdoZW4gZGRyIGZyZXF1ZW5jeSBsZXNzIHRoZW4KKwkJCQkgIGRkcjNfb2R0X2Rpc2JfZnJlcSwgdGhlIG9kdCBvbiBkcmFtIHNpZGUgYW5kCisJCQkJICBjb250cm9sbGVyIHNpZGUgYXJlIGJvdGggZGlzYWJsZWQuCisKKy0gcm9ja2NoaXAsbHBkZHI0X2RydiA6CSAgV2hlbiBkcmFtIHR5cGUgaXMgTFBERFI0LCB0aGlzIHBhcmFtZXRlciBkZWZpbmUKKwkJCQkgIHRoZSBkcmFtIHNpZGUgZHJpdmVyIHN0ZW5ndGggaW4gb2htLCBkZWZhdWx0CisJCQkJICB2YWx1ZSBpcyBMUDRfUEREU182MG9obS4KKworLSByb2NrY2hpcCxscGRkcjRfZHFfb2R0IDogCSAgV2hlbiBkcmFtIHR5cGUgaXMgTFBERFI0LCB0aGlzIHBhcmFtZXRlciBkZWZpbmUKKwkJCQkgIHRoZSBkcmFtIHNpZGUgT0RUIG9uIGRxcy9kcSBsaW5lIHN0ZW5ndGggaW4gb2htLAorCQkJCSAgZGVmYXVsdCB2YWx1ZSBpcyBMUDRfRFFfT0RUXzQwb2htLgorCistIHJvY2tjaGlwLGxwZGRyNF9jYV9vZHQgOgkgIFdoZW4gZHJhbSB0eXBlIGlzIExQRERSNCwgdGhpcyBwYXJhbWV0ZXIgZGVmaW5lCisJCQkJICB0aGUgZHJhbSBzaWRlIE9EVCBvbiBjYSBsaW5lIHN0ZW5ndGggaW4gb2htLAorCQkJCSAgZGVmYXVsdCB2YWx1ZSBpcyBMUDRfQ0FfT0RUXzQwb2htLgorCistIHJvY2tjaGlwLHBoeV9scGRkcjRfY2FfZHJ2IDoJICBXaGVuIGRyYW0gdHlwZSBpcyBMUEREUjQsIHRoaXMgcGFyYW1ldGVyIGRlZmluZQorCQkJCSAgdGhlIHBoeSBzaWRlICBDQSBsaW5lKGluY2x1aW5nIGNvbW1hbmQgYWRkcmVzcworCQkJCSAgbGluZSkgZHJpdmVyIHN0cmVuZ3RoLiBkZWZhdWx0IHZhbHVlIGlzCisJCQkJICBQSFlfRFJWX09EVF80MC4KKworLSByb2NrY2hpcCxwaHlfbHBkZHI0X2NrX2NzX2RydiA6IFdoZW4gZHJhbSB0eXBlIGlzIExQRERSNCwgdGhpcyBwYXJhbWV0ZXIgZGVmaW5lCisJCQkJICB0aGUgcGh5IHNpZGUgY2xvY2sgbGluZSBhbmQgY3MgbGluZSBkcml2ZXIKKwkJCQkgIHN0cmVuZ3RoLiBkZWZhdWx0IHZhbHVlIGlzIFBIWV9EUlZfT0RUXzgwLgorCistIHJvY2tjaGlwLHBoeV9scGRkcjRfZHFfZHJ2IDoJICBXaGVuIGRyYW0gdHlwZSBpcyBMUEREUjQsIHRoaXMgcGFyYW1ldGVyIGRlZmluZQorCQkJCSAgdGhlIHBoeSBzaWRlIERRIGxpbmUoaW5jbHVpbmcgRFFTL0RRL0RNIGxpbmUpCisJCQkJICBkcml2ZXIgc3RyZW5ndGguIGRlZmF1bHQgdmFsdWUgaXMgUEhZX0RSVl9PRFRfODAuCisKKy0gcm9ja2NoaXAscGh5X2xwZGRyNF9vZHQgOgkgIFdoZW4gZHJhbSB0eXBlIGlzIExQRERSNCwgdGhpcyBwYXJhbWV0ZXIgZGVmaW5lCisJCQkJICB0aGUgcGh5IHNpZGUgb2R0IHN0cmVuZ3RoLCBkZWZhdWx0IHZhbHVlIGlzCisJCQkJICBQSFlfRFJWX09EVF82MC4KKworRXhhbXBsZToKKwlkbWNfb3BwX3RhYmxlOiBkbWNfb3BwX3RhYmxlIHsKKwkJY29tcGF0aWJsZSA9ICJvcGVyYXRpbmctcG9pbnRzLXYyIjsKKworCQlvcHAwMCB7CisJCQlvcHAtaHogPSAvYml0cy8gNjQgPDMwMDAwMDAwMD47CisJCQlvcHAtbWljcm92b2x0ID0gPDkwMDAwMD47CisJCX07CisJCW9wcDAxIHsKKwkJCW9wcC1oeiA9IC9iaXRzLyA2NCA8NjY2MDAwMDAwPjsKKwkJCW9wcC1taWNyb3ZvbHQgPSA8OTAwMDAwPjsKKwkJfTsKKwl9OworCisJZG1jOiBkbWMgeworCQljb21wYXRpYmxlID0gInJvY2tjaGlwLHJrMzM5OS1kbWMiOworCQlkZXZmcmVxLWV2ZW50cyA9IDwmZGZpPjsKKwkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDEgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCWNsb2NrcyA9IDwmY3J1IFNDTEtfRERSQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiZG1jX2NsayI7CisJCW9wZXJhdGluZy1wb2ludHMtdjIgPSA8JmRtY19vcHBfdGFibGU+OworCQljZW50ZXItc3VwcGx5ID0gPCZwcHZhcl9jZW50ZXJsb2dpYz47CisJCXVwdGhyZXNob2xkID0gPDE1PjsKKwkJZG93bmRpZmZlcmVudGlhbCA9IDwxMD47CisJCXJvY2tjaGlwLGRkcjNfc3BlZWRfYmluID0gPDIxPjsKKwkJcm9ja2NoaXAscGRfaWRsZSA9IDwweDQwPjsKKwkJcm9ja2NoaXAsc3JfaWRsZSA9IDwweDI+OworCQlyb2NrY2hpcCxzcl9tY19nYXRlX2lkbGUgPSA8MHgzPjsKKwkJcm9ja2NoaXAsc3JwZF9saXRlX2lkbGUJPSA8MHg0PjsKKwkJcm9ja2NoaXAsc3RhbmRieV9pZGxlID0gPDB4MjAwMD47CisJCXJvY2tjaGlwLGRyYW1fZGxsX2Rpc19mcmVxID0gPDMwMD47CisJCXJvY2tjaGlwLHBoeV9kbGxfZGlzX2ZyZXEgPSA8MTI1PjsKKwkJcm9ja2NoaXAsYXV0b19wZF9kaXNfZnJlcSA9IDw2NjY+OworCQlyb2NrY2hpcCxkZHIzX29kdF9kaXNfZnJlcSA9IDwzMzM+OworCQlyb2NrY2hpcCxkZHIzX2RydiA9IDxERFIzX0RTXzQwb2htPjsKKwkJcm9ja2NoaXAsZGRyM19vZHQgPSA8RERSM19PRFRfMTIwb2htPjsKKwkJcm9ja2NoaXAscGh5X2RkcjNfY2FfZHJ2ID0gPFBIWV9EUlZfT0RUXzQwPjsKKwkJcm9ja2NoaXAscGh5X2RkcjNfZHFfZHJ2ID0gPFBIWV9EUlZfT0RUXzQwPjsKKwkJcm9ja2NoaXAscGh5X2RkcjNfb2R0ID0gPFBIWV9EUlZfT0RUXzI0MD47CisJCXJvY2tjaGlwLGxwZGRyM19vZHRfZGlzX2ZyZXEgPSA8MzMzPjsKKwkJcm9ja2NoaXAsbHBkZHIzX2RydiA9IDxMUDNfRFNfMzRvaG0+OworCQlyb2NrY2hpcCxscGRkcjNfb2R0ID0gPExQM19PRFRfMjQwb2htPjsKKwkJcm9ja2NoaXAscGh5X2xwZGRyM19jYV9kcnYgPSA8UEhZX0RSVl9PRFRfNDA+OworCQlyb2NrY2hpcCxwaHlfbHBkZHIzX2RxX2RydiA9IDxQSFlfRFJWX09EVF80MD47CisJCXJvY2tjaGlwLHBoeV9scGRkcjNfb2R0ID0gPFBIWV9EUlZfT0RUXzI0MD47CisJCXJvY2tjaGlwLGxwZGRyNF9vZHRfZGlzX2ZyZXEgPSA8MzMzPjsKKwkJcm9ja2NoaXAsbHBkZHI0X2RydiA9IDxMUDRfUEREU182MG9obT47CisJCXJvY2tjaGlwLGxwZGRyNF9kcV9vZHQgPSA8TFA0X0RRX09EVF80MG9obT47CisJCXJvY2tjaGlwLGxwZGRyNF9jYV9vZHQgPSA8TFA0X0NBX09EVF80MG9obT47CisJCXJvY2tjaGlwLHBoeV9scGRkcjRfY2FfZHJ2ID0gPFBIWV9EUlZfT0RUXzQwPjsKKwkJcm9ja2NoaXAscGh5X2xwZGRyNF9ja19jc19kcnYgPSA8UEhZX0RSVl9PRFRfODA+OworCQlyb2NrY2hpcCxwaHlfbHBkZHI0X2RxX2RydiA9IDxQSFlfRFJWX09EVF84MD47CisJCXJvY2tjaGlwLHBoeV9scGRkcjRfb2R0ID0gPFBIWV9EUlZfT0RUXzYwPjsKKwkJc3RhdHVzID0gImRpc2FibGVkIjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2RtYS9mc2wtaW14LXNkbWEudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2RtYS9mc2wtaW14LXNkbWEudHh0CmluZGV4IDE3NWYwZTQuLjNjOWE1N2EgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kbWEvZnNsLWlteC1zZG1hLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZG1hL2ZzbC1pbXgtc2RtYS50eHQKQEAgLTgsNiArOCw3IEBACiAgICAgICAiZnNsLGlteDUxLXNkbWEiCiAgICAgICAiZnNsLGlteDUzLXNkbWEiCiAgICAgICAiZnNsLGlteDZxLXNkbWEiCisgICAgICAiZnNsLGlteDdkLXNkbWEiCiAgIFRoZSAtdG8gdmFyaWFudHMgc2hvdWxkIGJlIHByZWZlcnJlZCBzaW5jZSB0aGV5IGFsbG93IHRvIGRldGVybWluZSB0aGUKICAgY29ycmVjdCBST00gc2NyaXB0IGFkZHJlc3NlcyBuZWVkZWQgZm9yIHRoZSBkcml2ZXIgdG8gd29yayB3aXRob3V0IGFkZGl0aW9uYWwKICAgZmlybXdhcmUuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZG1hL3JlbmVzYXMscmNhci1kbWFjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kbWEvcmVuZXNhcyxyY2FyLWRtYWMudHh0CmluZGV4IDViOTAyYWMuLjVmMmNlNjYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kbWEvcmVuZXNhcyxyY2FyLWRtYWMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kbWEvcmVuZXNhcyxyY2FyLWRtYWMudHh0CkBAIC0xLDQgKzEsNCBAQAotKiBSZW5lc2FzIFItQ2FyIERNQSBDb250cm9sbGVyIERldmljZSBUcmVlIGJpbmRpbmdzCisqIFJlbmVzYXMgUi1DYXIgKFJaL0cpIERNQSBDb250cm9sbGVyIERldmljZSBUcmVlIGJpbmRpbmdzCiAKIFJlbmVzYXMgUi1DYXIgR2VuZXJhdGlvbiAyIFNvQ3MgaGF2ZSBtdWx0aXBsZSBtdWx0aS1jaGFubmVsIERNQQogY29udHJvbGxlciBpbnN0YW5jZXMgbmFtZWQgRE1BQyBjYXBhYmxlIG9mIHNlcnZpbmcgbXVsdGlwbGUgY2xpZW50cy4gQ2hhbm5lbHMKQEAgLTE2LDYgKzE2LDggQEAKIAogLSBjb21wYXRpYmxlOiAicmVuZXNhcyxkbWFjLTxzb2N0eXBlPiIsICJyZW5lc2FzLHJjYXItZG1hYyIgYXMgZmFsbGJhY2suCiAJICAgICAgRXhhbXBsZXMgd2l0aCBzb2N0eXBlcyBhcmU6CisJCS0gInJlbmVzYXMsZG1hYy1yOGE3NzQzIiAoUlovRzFNKQorCQktICJyZW5lc2FzLGRtYWMtcjhhNzc0NSIgKFJaL0cxRSkKIAkJLSAicmVuZXNhcyxkbWFjLXI4YTc3OTAiIChSLUNhciBIMikKIAkJLSAicmVuZXNhcyxkbWFjLXI4YTc3OTEiIChSLUNhciBNMi1XKQogCQktICJyZW5lc2FzLGRtYWMtcjhhNzc5MiIgKFItQ2FyIFYySCkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kbWEvc3VuNmktZG1hLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kbWEvc3VuNmktZG1hLnR4dAppbmRleCBkMTNjMTM2Li42YjI2NzA0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZG1hL3N1bjZpLWRtYS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2RtYS9zdW42aS1kbWEudHh0CkBAIC03LDYgKzcsNyBAQAogLSBjb21wYXRpYmxlOglNdXN0IGJlIG9uZSBvZgogCQkgICJhbGx3aW5uZXIsc3VuNmktYTMxLWRtYSIKIAkJICAiYWxsd2lubmVyLHN1bjhpLWEyMy1kbWEiCisJCSAgImFsbHdpbm5lcixzdW44aS1hODN0LWRtYSIKIAkJICAiYWxsd2lubmVyLHN1bjhpLWgzLWRtYSIKIC0gcmVnOgkJU2hvdWxkIGNvbnRhaW4gdGhlIHJlZ2lzdGVycyBiYXNlIGFkZHJlc3MgYW5kIGxlbmd0aAogLSBpbnRlcnJ1cHRzOglTaG91bGQgY29udGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgaW50ZXJydXB0IHVzZWQgYnkgdGhpcyBkZXZpY2UKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9leHRjb24vcWNvbSxwbTg5NDEtbWlzYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZXh0Y29uL3Fjb20scG04OTQxLW1pc2MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MzgzYWRiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2V4dGNvbi9xY29tLHBtODk0MS1taXNjLnR4dApAQCAtMCwwICsxLDQxIEBACitRdWFsY29tbSdzIFBNODk0MSBVU0IgSUQgRXh0Y29uIGRldmljZQorCitTb21lIFF1YWxjb21tIFBNSUNzIGhhdmUgYSAibWlzYyIgbW9kdWxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGV0ZWN0IHdoZW4KK3RoZSBVU0IgSUQgcGluIGhhcyBiZWVuIHB1bGxlZCBsb3cgb3IgaGlnaC4KKworUFJPUEVSVElFUworCistIGNvbXBhdGlibGU6CisgICAgVXNhZ2U6IHJlcXVpcmVkCisgICAgVmFsdWUgdHlwZTogPHN0cmluZz4KKyAgICBEZWZpbml0aW9uOiBTaG91bGQgY29udGFpbiAicWNvbSxwbTg5NDEtbWlzYyI7CisKKy0gcmVnOgorICAgIFVzYWdlOiByZXF1aXJlZAorICAgIFZhbHVlIHR5cGU6IDx1MzI+CisgICAgRGVmaW5pdGlvbjogU2hvdWxkIGNvbnRhaW4gdGhlIG9mZnNldCB0byB0aGUgbWlzYyBhZGRyZXNzIHNwYWNlCisKKy0gaW50ZXJydXB0czoKKyAgICBVc2FnZTogcmVxdWlyZWQKKyAgICBWYWx1ZSB0eXBlOiA8cHJvcC1lbmNvZGVkLWFycmF5PgorICAgIERlZmluaXRpb246IFNob3VsZCBjb250YWluIHRoZSB1c2IgaWQgaW50ZXJydXB0CisKKy0gaW50ZXJydXB0LW5hbWVzOgorICAgIFVzYWdlOiByZXF1aXJlZAorICAgIFZhbHVlIHR5cGU6IDxzdHJpbmdsaXN0PgorICAgIERlZmluaXRpb246IFNob3VsZCBjb250YWluIHRoZSBzdHJpbmcgInVzYl9pZCIgZm9yIHRoZSB1c2IgaWQgaW50ZXJydXB0CisKK0V4YW1wbGU6CisKKwlwbWljIHsKKwkJdXNiX2lkOiBtaXNjQDkwMCB7CisJCQljb21wYXRpYmxlID0gInFjb20scG04OTQxLW1pc2MiOworCQkJcmVnID0gPDB4OTAwPjsKKwkJCWludGVycnVwdHMgPSA8MHgwIDB4OSAwIElSUV9UWVBFX0VER0VfQk9USD47CisJCQlpbnRlcnJ1cHQtbmFtZXMgPSAidXNiX2lkIjsKKwkJfTsKKwl9CisKKwl1c2ItY29udHJvbGxlciB7CisJCWV4dGNvbiA9IDwmdXNiX2lkPjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vYnJjbSxiY202MzQ1LWdwaW8udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vYnJjbSxiY202MzQ1LWdwaW8udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ODUzMTQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3Bpby9icmNtLGJjbTYzNDUtZ3Bpby50eHQKQEAgLTAsMCArMSw0NiBAQAorQmluZGluZ3MgZm9yIHRoZSBCcm9hZGNvbSdzIGJyY20sYmNtNjM0NS1ncGlvIG1lbW9yeS1tYXBwZWQgR1BJTyBjb250cm9sbGVycy4KKworVGhlc2UgYmluZGluZ3MgY2FuIGJlIHVzZWQgb24gYW55IEJDTTYzeHggU29DLiBIb3dldmVyLCBCQ002MzM4IGFuZCBCQ002MzQ1CithcmUgdGhlIG9ubHkgb25lcyB3aGljaCBkb24ndCBuZWVkIGEgcGluY3RybCBkcml2ZXIuCitCQ002MzM4IGhhdmUgOC1iaXQgZGF0YSBhbmQgZGlyb3V0IHJlZ2lzdGVycywgd2hlcmUgR1BJTyBzdGF0ZSBjYW4gYmUgcmVhZAorYW5kL29yIHdyaXR0ZW4sIGFuZCB0aGUgZGlyZWN0aW9uIGNoYW5nZWQgZnJvbSBpbnB1dCB0byBvdXRwdXQuCitCQ002MzQ1IGhhdmUgMTYtYml0IGRhdGEgYW5kIGRpcm91dCByZWdpc3RlcnMsIHdoZXJlIEdQSU8gc3RhdGUgY2FuIGJlIHJlYWQKK2FuZC9vciB3cml0dGVuLCBhbmQgdGhlIGRpcmVjdGlvbiBjaGFuZ2VkIGZyb20gaW5wdXQgdG8gb3V0cHV0LgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCS0gY29tcGF0aWJsZTogc2hvdWxkIGJlICJicmNtLGJjbTYzNDUtZ3BpbyIKKwktIHJlZy1uYW1lczogbXVzdCBjb250YWluCisJCSJkYXQiIC0gZGF0YSByZWdpc3RlcgorCQkiZGlyb3V0IiAtIGRpcmVjdGlvbiAob3V0cHV0KSByZWdpc3RlcgorCS0gcmVnOiBhZGRyZXNzICsgc2l6ZSBwYWlycyBkZXNjcmliaW5nIHRoZSBHUElPIHJlZ2lzdGVyIHNldHM7CisJCW9yZGVyIG11c3QgY29ycmVzcG9uZCB3aXRoIHRoZSBvcmRlciBvZiBlbnRyaWVzIGluIHJlZy1uYW1lcworCS0gI2dwaW8tY2VsbHM6IG11c3QgYmUgc2V0IHRvIDIuIFRoZSBmaXJzdCBjZWxsIGlzIHRoZSBwaW4gbnVtYmVyIGFuZAorCQkJdGhlIHNlY29uZCBjZWxsIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZ3BpbyBwb2xhcml0eToKKwkJCTAgPSBhY3RpdmUgaGlnaAorCQkJMSA9IGFjdGl2ZSBsb3cKKwktIGdwaW8tY29udHJvbGxlcjogTWFya3MgdGhlIGRldmljZSBub2RlIGFzIGEgZ3BpbyBjb250cm9sbGVyLgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorCS0gbmF0aXZlLWVuZGlhbjogdXNlIG5hdGl2ZSBlbmRpYW4gbWVtb3J5LgorCitFeGFtcGxlczoKKwktIEJDTTYzMzg6CisJZ3BpbzogZ3Bpby1jb250cm9sbGVyQGZmZmUwNDA3IHsKKwkJY29tcGF0aWJsZSA9ICJicmNtLGJjbTYzNDUtZ3BpbyI7CisJCXJlZy1uYW1lcyA9ICJkaXJvdXQiLCAiZGF0IjsKKwkJcmVnID0gPDB4ZmZmZTA0MDcgMT4sIDwweGZmZmUwNDBmIDE+OworCisJCSNncGlvLWNlbGxzID0gPDI+OworCQlncGlvLWNvbnRyb2xsZXI7CisJfTsKKworCS0gQkNNNjM0NToKKwlncGlvOiBncGlvLWNvbnRyb2xsZXJAZmZmZTA0MDYgeworCQljb21wYXRpYmxlID0gImJyY20sYmNtNjM0NS1ncGlvIjsKKwkJcmVnLW5hbWVzID0gImRpcm91dCIsICJkYXQiOworCQlyZWcgPSA8MHhmZmZlMDQwNiAyPiwgPDB4ZmZmZTA0MGEgMj47CisJCW5hdGl2ZS1lbmRpYW47CisKKwkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCWdwaW8tY29udHJvbGxlcjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpby1hc3BlZWQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpby1hc3BlZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5M2JiMmUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3Bpby9ncGlvLWFzcGVlZC50eHQKQEAgLTAsMCArMSwzNiBAQAorQXNwZWVkIEdQSU8gY29udHJvbGxlciBEZXZpY2UgVHJlZSBCaW5kaW5ncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlCQk6IEVpdGhlciAiYXNwZWVkLGFzdDI0MDAtZ3BpbyIgb3IgImFzcGVlZCxhc3QyNTAwLWdwaW8iCisKKy0gI2dwaW8tY2VsbHMgCQk6IFNob3VsZCBiZSB0d28KKwkJCSAgLSBGaXJzdCBjZWxsIGlzIHRoZSBHUElPIGxpbmUgbnVtYmVyCisJCQkgIC0gU2Vjb25kIGNlbGwgaXMgdXNlZCB0byBzcGVjaWZ5IG9wdGlvbmFsCisJCQkgICAgcGFyYW1ldGVycyAodW51c2VkKQorCistIHJlZwkJCTogQWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBkZXZpY2UKKy0gZ3Bpby1jb250cm9sbGVyCTogTWFya3MgdGhlIGRldmljZSBub2RlIGFzIGEgR1BJTyBjb250cm9sbGVyLgorLSBpbnRlcnJ1cHRzCQk6IEludGVycnVwdCBzcGVjaWZpZXIgKHNlZSBpbnRlcnJ1cHQgYmluZGluZ3MgZm9yCisJCQkgIGRldGFpbHMpCistIGludGVycnVwdC1jb250cm9sbGVyCTogTWFyayB0aGUgR1BJTyBjb250cm9sbGVyIGFzIGFuIGludGVycnVwdC1jb250cm9sbGVyCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CisKKy0gaW50ZXJydXB0LXBhcmVudCAgICAgOiBUaGUgcGFyZW50IGludGVycnVwdCBjb250cm9sbGVyLCBvcHRpb25hbCBpZiBpbmhlcml0ZWQKKworVGhlIGdwaW8gYW5kIGludGVycnVwdCBwcm9wZXJ0aWVzIGFyZSBmdXJ0aGVyIGRlc2NyaWJlZCBpbiB0aGVpciByZXNwZWN0aXZlCitiaW5kaW5ncyBkb2N1bWVudGF0aW9uOgorCistIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2dwaW8udHh0CistIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9pbnRlcnJ1cHRzLnR4dAorCisgIEV4YW1wbGU6CisJZ3Bpb0AxZTc4MDAwMCB7CisJCSNncGlvLWNlbGxzID0gPDI+OworCQljb21wYXRpYmxlID0gImFzcGVlZCxhc3QyNDAwLWdwaW8iOworCQlncGlvLWNvbnRyb2xsZXI7CisJCWludGVycnVwdHMgPSA8MjA+OworCQlyZWcgPSA8MHgxZTc4MDAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpby1heHAyMDkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpby1heHAyMDkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NjExMzAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3Bpby9ncGlvLWF4cDIwOS50eHQKQEAgLTAsMCArMSwzMCBAQAorQVhQMjA5IEdQSU8gY29udHJvbGxlcgorCitUaGlzIGRyaXZlciBmb2xsb3dzIHRoZSB1c3VhbCBHUElPIGJpbmRpbmdzIGZvdW5kIGluCitEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3Bpby9ncGlvLnR4dAorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgIngtcG93ZXJzLGF4cDIwOS1ncGlvIgorLSAjZ3Bpby1jZWxsczogU2hvdWxkIGJlIHR3by4gVGhlIGZpcnN0IGNlbGwgaXMgdGhlIHBpbiBudW1iZXIgYW5kIHRoZQorICBzZWNvbmQgaXMgdGhlIEdQSU8gZmxhZ3MuCistIGdwaW8tY29udHJvbGxlcjogTWFya3MgdGhlIGRldmljZSBub2RlIGFzIGEgR1BJTyBjb250cm9sbGVyLgorCitUaGlzIG5vZGUgbXVzdCBiZSBhIHN1Ym5vZGUgb2YgdGhlIGF4cDIweCBQTUlDLCBkb2N1bWVudGVkIGluCitEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL2F4cDIweC50eHQKKworRXhhbXBsZToKKworYXhwMjA5OiBwbWljQDM0IHsKKwljb21wYXRpYmxlID0gIngtcG93ZXJzLGF4cDIwOSI7CisJcmVnID0gPDB4MzQ+OworCWludGVycnVwdC1wYXJlbnQgPSA8Jm5taV9pbnRjPjsKKwlpbnRlcnJ1cHRzID0gPDAgSVJRX1RZUEVfTEVWRUxfTE9XPjsKKwlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCisJYXhwX2dwaW86IGdwaW8geworCQljb21wYXRpYmxlID0gIngtcG93ZXJzLGF4cDIwOS1ncGlvIjsKKwkJZ3Bpby1jb250cm9sbGVyOworCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2dwaW8tdHBpYzI4MTAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpby10cGljMjgxMC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFmYzJkZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2dwaW8tdHBpYzI4MTAudHh0CkBAIC0wLDAgKzEsMTYgQEAKK1RQSUMyODEwIEdQSU8gY29udHJvbGxlciBiaW5kaW5ncworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorIC0gY29tcGF0aWJsZQkJOiBTaG91bGQgYmUgInRpLHRwaWMyODEwIi4KKyAtIHJlZwkJCTogVGhlIEkyQyBhZGRyZXNzIG9mIHRoZSBkZXZpY2UKKyAtIGdwaW8tY29udHJvbGxlcgk6IE1hcmtzIHRoZSBkZXZpY2Ugbm9kZSBhcyBhIEdQSU8gY29udHJvbGxlci4KKyAtICNncGlvLWNlbGxzCQk6IFNob3VsZCBiZSB0d28uIEZvciBjb25zdW1lciB1c2Ugc2VlIGdwaW8udHh0LgorCitFeGFtcGxlOgorCisJZ3Bpb0A2MCB7CisJCWNvbXBhdGlibGUgPSAidGksdHBpYzI4MTAiOworCQlyZWcgPSA8MHg2MD47CisJCWdwaW8tY29udHJvbGxlcjsKKwkJI2dwaW8tY2VsbHMgPSA8Mj47CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2dwaW8tdHBzNjUwODYudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpby10cHM2NTA4Ni50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDUxMDcuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpby10cHM2NTA4Ni50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0qIFRQUzY1MDg2IEdQTyBDb250cm9sbGVyIGJpbmRpbmdzCi0KLVJlcXVpcmVkIHByb3BlcnRpZXM6Ci0gLSBjb21wYXRpYmxlCQk6IFNob3VsZCBiZSAidGksdHBzNjUwODYtZ3BpbyIuCi0gLSBncGlvLWNvbnRyb2xsZXIJOiBNYXJrcyB0aGUgZGV2aWNlIG5vZGUgYXMgYSBHUElPIENvbnRyb2xsZXIuCi0gLSAjZ3Bpby1jZWxscwkJOiBTaG91bGQgYmUgdHdvLiBUaGUgZmlyc3QgY2VsbCBpcyB0aGUgcGluIG51bWJlcgotCQkJICAgIGFuZCB0aGUgc2Vjb25kIGNlbGwgaXMgdXNlZCB0byBzcGVjaWZ5IGZsYWdzLgotCQkJICAgIFNlZSAuLi9ncGlvL2dwaW8udHh0IGZvciBwb3NzaWJsZSB2YWx1ZXMuCi0KLUV4YW1wbGU6Ci0KLQlncGlvNDogZ3BpbyB7Ci0JCWNvbXBhdGlibGUgPSAidGksdHBzNjUwODYtZ3BpbyI7Ci0JCWdwaW8tY29udHJvbGxlcjsKLQkJI2dwaW8tY2VsbHMgPSA8Mj47Ci0JfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2dwaW8tdHM0OTAwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2dwaW8tdHM0OTAwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjhlNzFiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpby10czQ5MDAudHh0CkBAIC0wLDAgKzEsMzAgQEAKKyogVGVjaG5vbG9naWMgU3lzdGVtcyBJMkMtRlBHQSdzIEdQSU8gY29udHJvbGxlciBiaW5kaW5ncworCitUaGlzIGJpbmRpbmdzIGRlc2NyaWJlcyB0aGUgR1BJTyBjb250cm9sbGVyIGZvciBUZWNobm9sb2dpYydzIEZQR0EgY29yZS4KK1RTLTQ5MDAncyBGUEdBIGVuY29kZXMgdGhlIEdQSU8gc3RhdGUgb24gMyBiaXRzLCB3aGVyZWFzIHRoZSBUUy03OTcwJ3MgRlBHQQordXNlcyAyIGJpdHM6IGl0IGRvZXNuJ3QgdXNlIGEgZGVkaWNhdGVkIGlucHV0IGJpdC4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nCisJCSJ0ZWNobm9sb2dpYyx0czQ5MDAtZ3BpbyIKKwkJInRlY2hub2xvZ2ljLHRzNzk3MC1ncGlvIgorLSByZWc6IFBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgY29udHJvbGxlciBhbmQgbGVuZ3RoCisgICAgICAgb2YgbWVtb3J5IG1hcHBlZCByZWdpb24uCistICNncGlvLWNlbGxzOiBTaG91bGQgYmUgdHdvLiBUaGUgZmlyc3QgY2VsbCBpcyB0aGUgcGluIG51bWJlci4KKy0gZ3Bpby1jb250cm9sbGVyOiBNYXJrcyB0aGUgZGV2aWNlIG5vZGUgYXMgYSBncGlvIGNvbnRyb2xsZXIuCisKK09wdGlvbmFsIHByb3BlcnR5OgorLSBuZ3Bpb3M6IE51bWJlciBvZiBHUElPcyB0aGlzIGNvbnRyb2xsZXIgaXMgaW5zdGFudGlhdGVkIHdpdGgsCisgIHRoZSBkZWZhdWx0IGlzIDMyLiBTZWUgZ3Bpby50eHQgZm9yIG1vcmUgZGV0YWlscy4KKworRXhhbXBsZToKKworJmkyYzIgeworCWdwaW84OiBncGlvQDI4IHsKKwkJY29tcGF0aWJsZSA9ICJ0ZWNobm9sb2dpYyx0czQ5MDAtZ3BpbyI7CisJCXJlZyA9IDwweDI4PjsKKwkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCWdwaW8tY29udHJvbGxlcjsKKwkJbmdwaW9zID0gPDMyPjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL21ydmwtZ3Bpby50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3Bpby9tcnZsLWdwaW8udHh0CmluZGV4IDk4ZDE5ODMuLmMzZDAxNjUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL21ydmwtZ3Bpby50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vbXJ2bC1ncGlvLnR4dApAQCAtNDQsMjYgKzQ0LDMgQEAKIAkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CiAJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MHgyPjsKIAl9OwotCi0qIE1hcnZlbGwgT3Jpb24gR1BJTyBDb250cm9sbGVyCi0KLVJlcXVpcmVkIHByb3BlcnRpZXM6Ci0tIGNvbXBhdGlibGUgICAgICAgICA6IFNob3VsZCBiZSAibWFydmVsbCxvcmlvbi1ncGlvIgotLSByZWcgICAgICAgICAgICAgICAgOiBBZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgY29udHJvbGxlci4KLS0gZ3Bpby1jb250cm9sbGVyICAgIDogU28gd2Uga25vdyB0aGlzIGlzIGEgZ3BpbyBjb250cm9sbGVyLgotLSBuZ3BpbyAgICAgICAgICAgICAgOiBIb3cgbWFueSBncGlvcyB0aGlzIGNvbnRyb2xsZXIgaGFzLgotLSBpbnRlcnJ1cHRzCSAgICAgOiBVcCB0byA0IEludGVycnVwdHMgZm9yIHRoZSBjb250cm9sbGVyLgotCi1PcHRpb25hbCBwcm9wZXJ0aWVzOgotLSBtYXNrLW9mZnNldCAgICAgICAgOiBGb3IgU01QIE9yaW9ucywgb2Zmc2V0IGZvciBOdGggQ1BVCi0KLUV4YW1wbGU6Ci0KLQkJZ3BpbzA6IGdwaW9AMTAxMDAgewotCQkJY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLG9yaW9uLWdwaW8iOwotCQkJI2dwaW8tY2VsbHMgPSA8Mj47Ci0JCQlncGlvLWNvbnRyb2xsZXI7Ci0JCQlyZWcgPSA8MHgxMDEwMCAweDQwPjsKLQkJCW5ncGlvID0gPDMyPjsKLQkJCWludGVycnVwdHMgPSA8MzU+LCA8MzY+LCA8Mzc+LCA8Mzg+OwotCQl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vcmVuZXNhcyxncGlvLXJjYXIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vcmVuZXNhcyxncGlvLXJjYXIudHh0CmluZGV4IDhkYTI2YjMuLjdjMWFiM2IgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL3JlbmVzYXMsZ3Bpby1yY2FyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3Bpby9yZW5lc2FzLGdwaW8tcmNhci50eHQKQEAgLTExLDYgKzExLDcgQEAKICAgICAtICJyZW5lc2FzLGdwaW8tcjhhNzc5MyI6IGZvciBSOEE3NzkzIChSLUNhciBNMi1OKSBjb21wYXRpYmxlIEdQSU8gY29udHJvbGxlci4KICAgICAtICJyZW5lc2FzLGdwaW8tcjhhNzc5NCI6IGZvciBSOEE3Nzk0IChSLUNhciBFMikgY29tcGF0aWJsZSBHUElPIGNvbnRyb2xsZXIuCiAgICAgLSAicmVuZXNhcyxncGlvLXI4YTc3OTUiOiBmb3IgUjhBNzc5NSAoUi1DYXIgSDMpIGNvbXBhdGlibGUgR1BJTyBjb250cm9sbGVyLgorICAgIC0gInJlbmVzYXMsZ3Bpby1yOGE3Nzk2IjogZm9yIFI4QTc3OTYgKFItQ2FyIE0zLVcpIGNvbXBhdGlibGUgR1BJTyBjb250cm9sbGVyLgogICAgIC0gInJlbmVzYXMsZ3Bpby1yY2FyIjogZm9yIGdlbmVyaWMgUi1DYXIgR1BJTyBjb250cm9sbGVyLgogCiAgIC0gcmVnOiBCYXNlIGFkZHJlc3MgYW5kIGxlbmd0aCBvZiBlYWNoIG1lbW9yeSByZXNvdXJjZSB1c2VkIGJ5IHRoZSBHUElPCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaHdtb24vbHRjNDE1MS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaHdtb24vbHRjNDE1MS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAwOGE1ZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9od21vbi9sdGM0MTUxLnR4dApAQCAtMCwwICsxLDE4IEBACitMVEM0MTUxIEhpZ2ggVm9sdGFnZSBJMkMgQ3VycmVudCBhbmQgVm9sdGFnZSBNb25pdG9yCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IE11c3QgYmUgImxsdGMsbHRjNDE1MSIKKy0gcmVnOiBJMkMgYWRkcmVzcworCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBzaHVudC1yZXNpc3Rvci1taWNyby1vaG1zCisJU2h1bnQgcmVzaXN0b3IgdmFsdWUgaW4gbWljcm8tT2htcworCURlZmF1bHRzIHRvIDwxMDAwPiBpZiB1bnNldC4KKworRXhhbXBsZToKKworbHRjNDE1MUA2ZSB7CisJY29tcGF0aWJsZSA9ICJsbHRjLGx0YzQxNTEiOworCXJlZyA9IDwweDZlPjsKKwlzaHVudC1yZXNpc3Rvci1taWNyby1vaG1zID0gPDE1MDA+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9od21vbi9tYXg2NjUwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9od21vbi9tYXg2NjUwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmJkODdkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2h3bW9uL21heDY2NTAudHh0CkBAIC0wLDAgKzEsMjggQEAKK0JpbmRpbmdzIGZvciBNQVg2NjUxIGFuZCBNQVg2NjUwIEkyQyBmYW4gY29udHJvbGxlcnMKKworUmVmZXJlbmNlOgorWzFdCWh0dHBzOi8vZGF0YXNoZWV0cy5tYXhpbWludGVncmF0ZWQuY29tL2VuL2RzL01BWDY2NTAtTUFYNjY1MS5wZGYKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6IE9uZSBvZiAibWF4aW0sbWF4NjY1MCIgb3IgIm1heGltLG1heDY2NTEiCistIHJlZyAgICAgICAgOiBJMkMgYWRkcmVzcywgb25lIG9mIDB4MWIsIDB4MWYsIDB4NGIsIDB4NDguCisKK09wdGlvbmFsIHByb3BlcnRpZXMsIGRlZmF1bHQgaXMgdG8gcmV0YWluIHRoZSBjaGlwJ3MgY3VycmVudCBzZXR0aW5nOgorLSBtYXhpbSxmYW4tbWljcm92b2x0IDogVGhlIHN1cHBseSB2b2x0YWdlIG9mIHRoZSBmYW4sIGVpdGhlciA1MDAwMDAwIHVWIG9yCisJCQkxMjAwMDAwMCB1Vi4KKy0gbWF4aW0sZmFuLXByZXNjYWxlICA6IFByZS1zY2FsaW5nIHZhbHVlLCBhcyBwZXIgZGF0YXNoZWV0IFsxXS4gTG93ZXIgdmFsdWVzCisJCQlhbGxvdyBtb3JlIGZpbmUtZ3JhaW5lZCBjb250cm9sIG9mIHNsb3dlciBmYW5zLgorCQkJVmFsaWQ6IDEsIDIsIDQsIDgsIDE2LgorLSBtYXhpbSxmYW4tdGFyZ2V0LXJwbTogSW5pdGlhbCByZXF1ZXN0ZWQgZmFuIHJvdGF0aW9uIHNwZWVkLiBJZiBzcGVjaWZpZWQsIHRoZQorCQkJZHJpdmVyIHNlbGVjdHMgY2xvc2VkLWxvb3AgbW9kZSBhbmQgdGhlIHJlcXVlc3RlZCBzcGVlZC4KKwkJCVRoaXMgZW5zdXJlcyB0aGUgZmFuIGlzIGFscmVhZHkgcnVubmluZyBiZWZvcmUgdXNlcnNwYWNlCisJCQl0YWtlcyBvdmVyLgorCitFeGFtcGxlOgorCWZhbi1tYXg2NjUwOiBtYXg2NjUwQDFiIHsKKwkJcmVnID0gPDB4MWI+OworCQljb21wYXRpYmxlID0gIm1heGltLG1heDY2NTAiOworCQltYXhpbSxmYW4tbWljcm92b2x0ID0gPDEyMDAwMDAwPjsKKwkJbWF4aW0sZmFuLXByZXNjYWxlID0gPDQ+OworCQltYXhpbSxmYW4tdGFyZ2V0LXJwbSA9IDwxMjAwPjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy90cml2aWFsLWRldmljZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy90cml2aWFsLWRldmljZXMudHh0CmluZGV4IDVjNzBjZTkuLjE0MTZjNmEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvdHJpdmlhbC1kZXZpY2VzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL3RyaXZpYWwtZGV2aWNlcy50eHQKQEAgLTM4LDYgKzM4LDcgQEAKIGRhbGxhcyxkczc1CQlEaWdpdGFsIFRoZXJtb21ldGVyIGFuZCBUaGVybW9zdGF0CiBkbGcsZGE5MDUzCQlEQTkwNTM6IGZsZXhpYmxlIHN5c3RlbSBsZXZlbCBQTUlDIHdpdGggbXVsdGljb3JlIHN1cHBvcnQKIGRsZyxkYTkwNjMJCURBOTA2Mzogc3lzdGVtIFBNSUMgZm9yIHF1YWQtY29yZSBhcHBsaWNhdGlvbiBwcm9jZXNzb3JzCitkb21pbnRlY2gsZG1hcmQwOQlETUFSRDA5OiAzLWF4aXMgQWNjZWxlcm9tZXRlcgogZXBzb24scng4MDEwCQlJMkMtQlVTIElOVEVSRkFDRSBSRUFMIFRJTUUgQ0xPQ0sgTU9EVUxFCiBlcHNvbixyeDgwMjUJCUhpZ2gtU3RhYmlsaXR5LiBJMkMtQnVzIElOVEVSRkFDRSBSRUFMIFRJTUUgQ0xPQ0sgTU9EVUxFCiBlcHNvbixyeDg1ODEJCUkyQy1CVVMgSU5URVJGQUNFIFJFQUwgVElNRSBDTE9DSyBNT0RVTEUKQEAgLTU2LDYgKzU3LDcgQEAKIG1heGltLG1heDEyMzcJCUxvdy1Qb3dlciwgNC0vMTItQ2hhbm5lbCwgMi1XaXJlIFNlcmlhbCwgMTItQml0IEFEQ3MKIG1heGltLG1heDY2MjUJCTktQml0LzEyLUJpdCBUZW1wZXJhdHVyZSBTZW5zb3JzIHdpdGggScKyQy1Db21wYXRpYmxlIFNlcmlhbCBJbnRlcmZhY2UKIG1jLHJ2MzAyOWMyCQlSZWFsIFRpbWUgQ2xvY2sgTW9kdWxlIHdpdGggSTJDLUJ1cworbWN1YmUsbWMzMjMwCQltQ3ViZSAzLWF4aXMgOC1iaXQgZGlnaXRhbCBhY2NlbGVyb21ldGVyCiBtaWNyb2NoaXAsbWNwNDUzMS01MDIJTWljcm9jaGlwIDctYml0IFNpbmdsZSBJMkMgRGlnaXRhbCBQb3RlbnRpb21ldGVyICg1aykKIG1pY3JvY2hpcCxtY3A0NTMxLTEwMwlNaWNyb2NoaXAgNy1iaXQgU2luZ2xlIEkyQyBEaWdpdGFsIFBvdGVudGlvbWV0ZXIgKDEwaykKIG1pY3JvY2hpcCxtY3A0NTMxLTUwMwlNaWNyb2NoaXAgNy1iaXQgU2luZ2xlIEkyQyBEaWdpdGFsIFBvdGVudGlvbWV0ZXIgKDUwaykKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWNjZWwvZG1hcmQwNi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FjY2VsL2RtYXJkMDYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMTA1YTEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FjY2VsL2RtYXJkMDYudHh0CkBAIC0wLDAgKzEsMTkgQEAKK0RldmljZSB0cmVlIGJpbmRpbmdzIGZvciBEb21pbnRlY2ggRE1BUkQwNSwgRE1BUkQwNiwgRE1BUkQwNyBhY2NlbGVyb21ldGVycworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorIC0gY29tcGF0aWJsZQkJOiBTaG91bGQgYmUgImRvbWludGVjaCxkbWFyZDA1IgorCQkJCSBvciAiZG9taW50ZWNoLGRtYXJkMDYiCisJCQkJIG9yICJkb21pbnRlY2gsZG1hcmQwNyIKKyAtIHJlZwkJCTogSTJDIGFkZHJlc3Mgb2YgdGhlIGNoaXAuIFNob3VsZCBiZSAweDFjCisKK0V4YW1wbGU6CisJJmkyYzEgeworCQkvKiAuLi4gKi8KKworCQlhY2NlbGVyb21ldGVyQDFjIHsKKwkJCWNvbXBhdGlibGUgPSAiZG9taW50ZWNoLGRtYXJkMDYiOworCQkJcmVnID0gPDB4MWM+OworCQl9OworCisJCS8qIC4uLiAqLworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FjY2VsL2tpb25peCxreHNkOS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FjY2VsL2tpb25peCxreHNkOS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI1YmYzYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWNjZWwva2lvbml4LGt4c2Q5LnR4dApAQCAtMCwwICsxLDIyIEBACitLaW9uaXggS1hTRDkgQWNjZWxlcm9tZXRlciBkZXZpY2UgdHJlZSBiaW5kaW5ncworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorIC0gY29tcGF0aWJsZTogCQlzaG91bGQgYmUgc2V0IHRvICJraW9uaXgsa3hzZDkiCisgLSByZWc6CQkJaTJjIHNsYXZlIGFkZHJlc3MKKworT3B0aW9uYWwgcHJvcGVydGllczoKKyAtIHZkZC1zdXBwbHk6CQlUaGUgaW5wdXQgc3VwcGx5IGZvciBWREQKKyAtIGlvdmRkLXN1cHBseToJVGhlIGlucHV0IHN1cHBseSBmb3IgSU9WREQKKyAtIGludGVycnVwdHM6CQlUaGUgbW92ZW1lbnQgZGV0ZWN0aW9uIGludGVycnVwdAorIC0gbW91bnQtbWF0cml4OglTZWUgbW91bnQtbWF0cml4LnR4dAorCitFeGFtcGxlOgorCitreHNkOUAxOCB7CisJY29tcGF0aWJsZSA9ICJraW9uaXgsa3hzZDkiOworCXJlZyA9IDwweDE4PjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZmb28+OworCWludGVycnVwdHMgPSA8NTcgSVJRX1RZUEVfRURHRV9GQUxMSU5HPjsKKwlpb3ZkZC1zdXBwbHkgPSA8JmJhcj47CisJdmRkLXN1cHBseSA9IDwmYmF6PjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy9tdDY1NzdfYXV4YWRjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWRjL210NjU3N19hdXhhZGMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YzQ1Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy9tdDY1NzdfYXV4YWRjLnR4dApAQCAtMCwwICsxLDI5IEBACisqIE1lZGlhdGVrIEFVWEFEQyAtIEFuYWxvZyB0byBEaWdpdGFsIENvbnZlcnRlciBvbiBNZWRpYXRlayBtb2JpbGUgc29jIChtdDY1eHgvbXQ4MXh4L210Mjd4eCkKKz09PT09PT09PT09PT09PQorCitUaGUgQXV4aWxpYXJ5IEFuYWxvZy9EaWdpdGFsIENvbnZlcnRlciAoQVVYQURDKSBpcyBhbiBBREMgZm91bmQKK2luIHNvbWUgTWVkaWF0ZWsgU29DcyB3aGljaCBhbW9uZyBvdGhlciB0aGluZ3MgbWVhc3VyZXMgdGhlIHRlbXBlcmF0dXJlcworaW4gdGhlIFNvQy4gSXQgY2FuIGJlIHVzZWQgZGlyZWN0bHkgd2l0aCByZWdpc3RlciBhY2Nlc3NlcywgYnV0IGl0IGlzIGFsc28KK3VzZWQgYnkgdGhlcm1hbCBjb250cm9sbGVyIHdoaWNoIHJlYWRzIHRoZSB0ZW1wZXJhdHVyZXMgZnJvbSB0aGUgQVVYQURDCitkaXJlY3RseSB2aWEgaXRzIG93biBidXMgaW50ZXJmYWNlLiBTZWUKK0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90aGVybWFsL21lZGlhdGVrLXRoZXJtYWwudHh0Citmb3IgdGhlIFRoZXJtYWwgQ29udHJvbGxlciB3aGljaCBob2xkcyBhIHBoYW5kbGUgdG8gdGhlIEFVWEFEQy4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKyAgLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgb25lIG9mOgorICAgIC0gIm1lZGlhdGVrLG10MjcwMS1hdXhhZGMiOiBGb3IgTVQyNzAxIGZhbWlseSBvZiBTb0NzCisgICAgLSAibWVkaWF0ZWssbXQ4MTczLWF1eGFkYyI6IEZvciBNVDgxNzMgZmFtaWx5IG9mIFNvQ3MKKyAgLSByZWc6IEFkZHJlc3MgcmFuZ2Ugb2YgdGhlIEFVWEFEQyB1bml0LgorICAtIGNsb2NrczogU2hvdWxkIGNvbnRhaW4gYSBjbG9jayBzcGVjaWZpZXIgZm9yIGVhY2ggZW50cnkgaW4gY2xvY2stbmFtZXMKKyAgLSBjbG9jay1uYW1lczogU2hvdWxkIGNvbnRhaW4gIm1haW4iLgorICAtICNpby1jaGFubmVsLWNlbGxzOiBTaG91bGQgYmUgMSwgc2VlIC4uL2lpby1iaW5kaW5ncy50eHQKKworRXhhbXBsZToKKworYXV4YWRjOiBhZGNAMTEwMDEwMDAgeworCWNvbXBhdGlibGUgPSAibWVkaWF0ZWssbXQyNzAxLWF1eGFkYyI7CisJcmVnID0gPDAgMHgxMTAwMTAwMCAwIDB4MTAwMD47CisJY2xvY2tzID0gPCZwZXJpY2ZnIENMS19QRVJJX0FVWEFEQz47CisJY2xvY2stbmFtZXMgPSAibWFpbiI7CisJI2lvLWNoYW5uZWwtY2VsbHMgPSA8MT47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMvcm9ja2NoaXAtc2FyYWRjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWRjL3JvY2tjaGlwLXNhcmFkYy50eHQKaW5kZXggYmY5OWUyZi4uMjA1NTkzZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMvcm9ja2NoaXAtc2FyYWRjLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy9yb2NrY2hpcC1zYXJhZGMudHh0CkBAIC0xNiw2ICsxNiwxMSBAQAogLSB2cmVmLXN1cHBseTogVGhlIHJlZ3VsYXRvciBzdXBwbHkgQURDIHJlZmVyZW5jZSB2b2x0YWdlLgogLSAjaW8tY2hhbm5lbC1jZWxsczogU2hvdWxkIGJlIDEsIHNlZSAuLi9paW8tYmluZGluZ3MudHh0CiAKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIHJlc2V0czogTXVzdCBjb250YWluIGFuIGVudHJ5IGZvciBlYWNoIGVudHJ5IGluIHJlc2V0LW5hbWVzIGlmIG5lZWQgc3VwcG9ydAorCSAgdGhpcyBvcHRpb24uIFNlZSAuLi9yZXNldC9yZXNldC50eHQgZm9yIGRldGFpbHMuCistIHJlc2V0LW5hbWVzOiBNdXN0IGluY2x1ZGUgdGhlIG5hbWUgInNhcmFkYy1hcGIiLgorCiBFeGFtcGxlOgogCXNhcmFkYzogc2FyYWRjQDIwMDZjMDAwIHsKIAkJY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxzYXJhZGMiOwpAQCAtMjMsNiArMjgsOCBAQAogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMjYgSVJRX1RZUEVfTEVWRUxfSElHSD47CiAJCWNsb2NrcyA9IDwmY3J1IFNDTEtfU0FSQURDPiwgPCZjcnUgUENMS19TQVJBREM+OwogCQljbG9jay1uYW1lcyA9ICJzYXJhZGMiLCAiYXBiX3BjbGsiOworCQlyZXNldHMgPSA8JmNydSBTUlNUX1NBUkFEQz47CisJCXJlc2V0LW5hbWVzID0gInNhcmFkYy1hcGIiOwogCQkjaW8tY2hhbm5lbC1jZWxscyA9IDwxPjsKIAkJdnJlZi1zdXBwbHkgPSA8JnZjYzE4PjsKIAl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMvdGktYWRjMTIxMzgudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMvdGktYWRjMTIxMzgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OWExZDMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy90aS1hZGMxMjEzOC50eHQKQEAgLTAsMCArMSwzNyBAQAorKiBUZXhhcyBJbnN0cnVtZW50cycgQURDMTIxMzAvQURDMTIxMzIvQURDMTIxMzgKKworUmVxdWlyZWQgcHJvcGVydGllczoKKyAtIGNvbXBhdGlibGU6IFNob3VsZCBiZSBvbmUgb2YKKwkqICJ0aSxhZGMxMjEzMCIKKwkqICJ0aSxhZGMxMjEzMiIKKwkqICJ0aSxhZGMxMjEzOCIKKyAtIHJlZzogU1BJIGNoaXAgc2VsZWN0IG51bWJlciBmb3IgdGhlIGRldmljZQorIC0gaW50ZXJydXB0czogU2hvdWxkIGNvbnRhaW4gaW50ZXJydXB0IGZvciBFT0MgKGVuZCBvZiBjb252ZXJzaW9uKQorIC0gY2xvY2tzOiBwaGFuZGxlIHRvIGNvbnZlcnNpb24gY2xvY2sgaW5wdXQKKyAtIHNwaS1tYXgtZnJlcXVlbmN5OiBEZWZpbmlzaW9uIGFzIHBlcgorCURvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLWJ1cy50eHQKKyAtIHZyZWYtcC1zdXBwbHk6IFRoZSByZWd1bGF0b3Igc3VwcGx5IGZvciBwb3NpdGl2ZSBhbmFsb2cgdm9sdGFnZSByZWZlcmVuY2UKKworT3B0aW9uYWwgcHJvcGVydGllczoKKyAtIHZyZWYtbi1zdXBwbHk6IFRoZSByZWd1bGF0b3Igc3VwcGx5IGZvciBuZWdhdGl2ZSBhbmFsb2cgdm9sdGFnZSByZWZlcmVuY2UKKwkoTm90ZSB0aGF0IHRoaXMgbXVzdCBub3QgZ28gYmVsb3cgR05EIG9yIGV4Y2VlZCB2cmVmLXApCisJSWYgbm90IHNwZWNpZmllZCwgdGhpcyBpcyBhc3N1bWVkIHRvIGJlIGFuYWxvZyBncm91bmQuCisgLSB0aSxhY3F1aXNpdGlvbi10aW1lOiBUaGUgbnVtYmVyIG9mIGNvbnZlcnNpb24gY2xvY2sgcGVyaW9kcyBmb3IgdGhlIFMvSCdzCisJYWNxdWlzaXRpb24gdGltZS4gIFNob3VsZCBiZSBvbmUgb2YgNiwgMTAsIDE4LCAzNC4gIElmIG5vdCBzcGVjaWZpZWQsCisJZGVmYXVsdCB2YWx1ZSBvZiAxMCBpcyB1c2VkLgorCUZvciBoaWdoIHNvdXJjZSBpbXBlZGFuY2VzLCB0aGlzIHZhbHVlIGNhbiBiZSBpbmNyZWFzZWQgdG8gMTggb3IgMzQuCisJRm9yIGxlc3MgQURDIGFjY3VyYWN5IGFuZC9vciBzbG93ZXIgQ0NMSyBmcmVxdWVuY2llcyB0aGlzIHZhbHVlIG1heSBiZQorCWRlY3JlYXNlZCB0byA2LiAgU2VlIHNlY3Rpb24gNi4wIElOUFVUIFNPVVJDRSBSRVNJU1RBTkNFIGluIHRoZQorCWRhdGFzaGVldCBmb3IgZGV0YWlscy4KKworRXhhbXBsZToKK2FkY0AwIHsKKwljb21wYXRpYmxlID0gInRpLGFkYzEyMTM4IjsKKwlyZWcgPSA8MD47CisJaW50ZXJydXB0cyA9IDwyOCBJUlFfVFlQRV9FREdFX1JJU0lORz47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmZ3BpbzE+OworCWNsb2NrcyA9IDwmY2Nsaz47CisJdnJlZi1wLXN1cHBseSA9IDwmbGRvNF9yZWc+OworCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDUwMDAwMDA+OworCXRpLGFjcXVpc2l0aW9uLXRpbWUgPSA8Nj47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMvdGktYWRjMTYxczYyNi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy90aS1hZGMxNjFzNjI2LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWQyMzE1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMvdGktYWRjMTYxczYyNi50eHQKQEAgLTAsMCArMSwxNiBAQAorKiBUZXhhcyBJbnN0cnVtZW50cyBBREMxNDFTNjI2IGFuZCBBREMxNjFTNjI2IGNoaXBzCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisgLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgInRpLGFkYzE0MXM2MjYiIG9yICJ0aSxhZGMxNjFzNjI2IgorIC0gcmVnOiBzcGkgY2hpcCBzZWxlY3QgbnVtYmVyIGZvciB0aGUgZGV2aWNlCisKK1JlY29tbWVuZGVkIHByb3BlcnRpZXM6CisgLSBzcGktbWF4LWZyZXF1ZW5jeTogRGVmaW5pdGlvbiBhcyBwZXIKKwkJRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktYnVzLnR4dAorCitFeGFtcGxlOgorYWRjQDAgeworCWNvbXBhdGlibGUgPSAidGksYWRjMTYxczYyNiI7CisJcmVnID0gPDA+OworCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDQzMDAwMDA+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vY2hlbWljYWwvYXRsYXMsb3JwLXNtLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vY2hlbWljYWwvYXRsYXMsb3JwLXNtLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDhiNjg3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9jaGVtaWNhbC9hdGxhcyxvcnAtc20udHh0CkBAIC0wLDAgKzEsMjIgQEAKKyogQXRsYXMgU2NpZW50aWZpYyBPUlAtU00gT0VNIHNlbnNvcgorCitodHRwczovL3d3dy5hdGxhcy1zY2llbnRpZmljLmNvbS9fZmlsZXMvX2RhdGFzaGVldHMvX29lbS9PUlBfb2VtX2RhdGFzaGVldC5wZGYKKworUmVxdWlyZWQgcHJvcGVydGllczoKKworICAtIGNvbXBhdGlibGU6IG11c3QgYmUgImF0bGFzLG9ycC1zbSIKKyAgLSByZWc6IHRoZSBJMkMgYWRkcmVzcyBvZiB0aGUgc2Vuc29yCisgIC0gaW50ZXJydXB0LXBhcmVudDogc2hvdWxkIGJlIHRoZSBwaGFuZGxlIGZvciB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIKKyAgLSBpbnRlcnJ1cHRzOiB0aGUgc29sZSBpbnRlcnJ1cHQgZ2VuZXJhdGVkIGJ5IHRoZSBkZXZpY2UKKworICBSZWZlciB0byBpbnRlcnJ1cHQtY29udHJvbGxlci9pbnRlcnJ1cHRzLnR4dCBmb3IgZ2VuZXJpYyBpbnRlcnJ1cHQgY2xpZW50CisgIG5vZGUgYmluZGluZ3MuCisKK0V4YW1wbGU6CisKK2F0bGFzQDY2IHsKKwljb21wYXRpYmxlID0gImF0bGFzLG9ycC1zbSI7CisJcmVnID0gPDB4NjY+OworCWludGVycnVwdC1wYXJlbnQgPSA8JmdwaW8xPjsKKwlpbnRlcnJ1cHRzID0gPDE2IDI+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vbWFnbmV0b21ldGVyL2FrODk3NC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL21hZ25ldG9tZXRlci9hazg5NzQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZDVhYmExCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9tYWduZXRvbWV0ZXIvYWs4OTc0LnR4dApAQCAtMCwwICsxLDI5IEBACisqIEFzYWhpIEthc2VpIEFLODk3NCBtYWduZXRvbWV0ZXIgc2Vuc29yCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSAiYXNhaGkta2FzZWksYWs4OTc0IgorLSByZWcgOiB0aGUgSTJDIGFkZHJlc3Mgb2YgdGhlIG1hZ25ldG9tZXRlcgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorCistIGF2ZGQtc3VwcGx5OiByZWd1bGF0b3Igc3VwcGx5IGZvciB0aGUgYW5hbG9nIHZvbHRhZ2UKKyAgKHNlZSByZWd1bGF0b3IvcmVndWxhdG9yLnR4dCkKKy0gZHZkZC1zdXBwbHk6IHJlZ3VsYXRvciBzdXBwbHkgZm9yIHRoZSBkaWdpdGFsIHZvbHRhZ2UKKyAgKHNlZSByZWd1bGF0b3IvcmVndWxhdG9yLnR4dCkKKy0gaW50ZXJydXB0czogZGF0YSByZWFkeSAoRFJEWSkgYW5kIGludGVycnVwdCAoSU5UMSkgbGluZXMKKyAgZnJvbSB0aGUgY2hpcCwgdGhlIERSRFkgaW50ZXJydXB0IG11c3QgYmUgcGxhY2VkIGZpcnN0LgorICBUaGUgaW50ZXJydXB0cyBjYW4gYmUgdHJpZ2dlcmVkIG9uIHJpc2luZyBvciBmYWxsaW5nCisgIGVkZ2VzIGFsaWtlLgorLSBtb3VudC1tYXRyaXg6IGFuIG9wdGlvbmFsIDN4MyBtb3VudGluZyByb3RhdGlvbiBtYXRyaXgKKworRXhhbXBsZToKKworYWs4OTc0QDBmIHsKKwljb21wYXRpYmxlID0gImFzYWhpLWthc2VpLGFrODk3NCI7CisJcmVnID0gPDB4MGY+OworCWF2ZGQtc3VwcGx5ID0gPCZmb29fcmVnPjsKKwlkdmRkLXN1cHBseSA9IDwmYmFyX3JlZz47CisJaW50ZXJydXB0cyA9IDwwIElSUV9UWVBFX0VER0VfUklTSU5HPiwKKwkJICAgICA8MSBJUlFfVFlQRV9FREdFX1JJU0lORz47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9wcmVzc3VyZS96cGEyMzI2LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vcHJlc3N1cmUvenBhMjMyNi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI4NWRlNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vcHJlc3N1cmUvenBhMjMyNi50eHQKQEAgLTAsMCArMSwzMSBAQAorTXVyYXRhIFpQQTIzMjYgcHJlc3N1cmUgc2Vuc29yCisKK1ByZXNzdXJlIHNlbnNvciBmcm9tIE11cmF0YSB3aXRoIFNQSSBhbmQgSTJDIGJ1cyBpbnRlcmZhY2VzLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiAibXVyYXRhLHpwYTIzMjYiCistIHJlZzogdGhlIEkyQyBhZGRyZXNzIG9yIFNQSSBjaGlwIHNlbGVjdCB0aGUgZGV2aWNlIHdpbGwgcmVzcG9uZCB0bworCitSZWNvbW1lbmRlZCBwcm9wZXJ0aWVzIGZvciBTUEkgYnVzIHVzYWdlOgorLSBzcGktbWF4LWZyZXF1ZW5jeTogbWF4aW11bSBTUEkgYnVzIGZyZXF1ZW5jeSBhcyBkb2N1bWVudGVkIGluCisgIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLWJ1cy50eHQKKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gdnJlZi1zdXBwbHk6IGFuIG9wdGlvbmFsIHJlZ3VsYXRvciB0aGF0IG5lZWRzIHRvIGJlIG9uIHRvIHByb3ZpZGUgVlJFRgorICBwb3dlciB0byB0aGUgc2Vuc29yCistIHZkZC1zdXBwbHk6IGFuIG9wdGlvbmFsIHJlZ3VsYXRvciB0aGF0IG5lZWRzIHRvIGJlIG9uIHRvIHByb3ZpZGUgVkRECisgIHBvd2VyIHRvIHRoZSBzZW5zb3IKKy0gaW50ZXJydXB0LXBhcmVudDogcGhhbmRsZSB0byB0aGUgcGFyZW50IGludGVycnVwdCBjb250cm9sbGVyIGFzIGRvY3VtZW50ZWQgaW4KKyAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2ludGVycnVwdHMudHh0CistIGludGVycnVwdHM6IGludGVycnVwdCBtYXBwaW5nIGZvciBJUlEgYXMgZG9jdW1lbnRlZCBpbgorICBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvaW50ZXJydXB0cy50eHQKKworRXhhbXBsZToKKworenBhMjMyNkA1YyB7CisJY29tcGF0aWJsZSA9ICJtdXJhdGEsenBhMjMyNiI7CisJcmVnID0gPDB4NWM+OworCWludGVycnVwdC1wYXJlbnQgPSA8JmdwaW8+OworCWludGVycnVwdHMgPSA8MTI+OworCXZkZC1zdXBwbHkgPSA8Jmxkb18xdjhfZ25zcz47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9wcm94aW1pdHkvc3g5NTAwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vcHJveGltaXR5L3N4OTUwMC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMwMWRkMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vcHJveGltaXR5L3N4OTUwMC50eHQKQEAgLTAsMCArMSwyNCBAQAorU2VtdGVjaCdzIFNYOTUwMCBjYXBhY2l0aXZlIHByb3hpbWl0eSBidXR0b24gZGV2aWNlIGRyaXZlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCS0gY29tcGF0aWJsZTogbXVzdCBiZSAic2VtdGVjaCxzeDk1MDAiCisJLSByZWc6IGkyYyBhZGRyZXNzIHdoZXJlIHRvIGZpbmQgdGhlIGRldmljZQorCS0gaW50ZXJydXB0LXBhcmVudCA6IHNob3VsZCBiZSB0aGUgcGhhbmRsZSBmb3IgdGhlIGludGVycnVwdCBjb250cm9sbGVyCisJLSBpbnRlcnJ1cHRzIDogdGhlIHNvbGUgaW50ZXJydXB0IGdlbmVyYXRlZCBieSB0aGUgZGV2aWNlCisKKwlSZWZlciB0byBpbnRlcnJ1cHQtY29udHJvbGxlci9pbnRlcnJ1cHRzLnR4dCBmb3IgZ2VuZXJpYworCWludGVycnVwdCBjbGllbnQgbm9kZSBiaW5kaW5ncy4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKwktIHJlc2V0LWdwaW9zOiBSZWZlcmVuY2UgdG8gdGhlIEdQSU8gY29ubmVjdGVkIHRvIHRoZSBkZXZpY2UncyBhY3RpdmUKKwkgIGxvdyByZXNldCBwaW4uCisKK0V4YW1wbGU6CisKK3N4OTUwMEAyOCB7CisJY29tcGF0aWJsZSA9ICJzZW10ZWNoLHN4OTUwMCI7CisJcmVnID0gPDB4Mjg+OworCWludGVycnVwdC1wYXJlbnQgPSA8JmdwaW8yPjsKKwlpbnRlcnJ1cHRzID0gPDE2IElSUV9UWVBFX0xFVkVMX0xPVz47CisJcmVzZXQtZ3Bpb3MgPSA8JmdwaW8yIDEwIEdQSU9fQUNUSVZFX0xPVz47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby90ZW1wZXJhdHVyZS9tYXhpbV90aGVybW9jb3VwbGUudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby90ZW1wZXJhdHVyZS9tYXhpbV90aGVybW9jb3VwbGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YmM1YzQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL3RlbXBlcmF0dXJlL21heGltX3RoZXJtb2NvdXBsZS50eHQKQEAgLTAsMCArMSwyMSBAQAorTWF4aW0gdGhlcm1vY291cGxlIHN1cHBvcnQKKworKiBodHRwczovL2RhdGFzaGVldHMubWF4aW1pbnRlZ3JhdGVkLmNvbS9lbi9kcy9NQVg2Njc1LnBkZgorKiBodHRwczovL2RhdGFzaGVldHMubWF4aW1pbnRlZ3JhdGVkLmNvbS9lbi9kcy9NQVgzMTg1NS5wZGYKKworUmVxdWlyZWQgcHJvcGVydGllczoKKworCS0gY29tcGF0aWJsZTogbXVzdCBiZSAibWF4aW0sbWF4MzE4NTUiIG9yICJtYXhpbSxtYXg2Njc1IgorCS0gcmVnOiBTUEkgY2hpcCBzZWxlY3QgbnVtYmVyIGZvciB0aGUgZGV2aWNlCisJLSBzcGktbWF4LWZyZXF1ZW5jeTogbXVzdCBiZSA0MzAwMDAwCisJLSBzcGktY3BoYTogbXVzdCBiZSBkZWZpbmVkIGZvciBtYXg2Njc1IHRvIGVuYWJsZSBTUEkgbW9kZSAxCisKKwlSZWZlciB0byBzcGkvc3BpLWJ1cy50eHQgZm9yIGdlbmVyaWMgU1BJIHNsYXZlIGJpbmRpbmdzLgorCitFeGFtcGxlOgorCisJbWF4MzE4NTVAMCB7CisJCWNvbXBhdGlibGUgPSAibWF4aW0sbWF4MzE4NTUiOworCQlyZWcgPSA8MD47CisJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDQzMDAwMDA+OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvdG91Y2hzY3JlZW4vc2lsZWFkX2dzbDE2ODAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lucHV0L3RvdWNoc2NyZWVuL3NpbGVhZF9nc2wxNjgwLnR4dAppbmRleCAxMTEyZTBkLi44MjBmZWU0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvdG91Y2hzY3JlZW4vc2lsZWFkX2dzbDE2ODAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnB1dC90b3VjaHNjcmVlbi9zaWxlYWRfZ3NsMTY4MC50eHQKQEAgLTEzLDYgKzEzLDcgQEAKIC0gdG91Y2hzY3JlZW4tc2l6ZS15CSAgOiBTZWUgdG91Y2hzY3JlZW4udHh0CiAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CistIGZpcm13YXJlLW5hbWUJCSAgOiBGaWxlIGJhc2VuYW1lIChzdHJpbmcpIGZvciBib2FyZCBzcGVjaWZpYyBmaXJtd2FyZQogLSB0b3VjaHNjcmVlbi1pbnZlcnRlZC14ICA6IFNlZSB0b3VjaHNjcmVlbi50eHQKIC0gdG91Y2hzY3JlZW4taW52ZXJ0ZWQteSAgOiBTZWUgdG91Y2hzY3JlZW4udHh0CiAtIHRvdWNoc2NyZWVuLXN3YXBwZWQteC15IDogU2VlIHRvdWNoc2NyZWVuLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2pjb3JlLGFpYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvamNvcmUsYWljLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTJhZDM2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2pjb3JlLGFpYy50eHQKQEAgLTAsMCArMSwyNiBAQAorSi1Db3JlIEFkdmFuY2VkIEludGVycnVwdCBDb250cm9sbGVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJqY29yZSxhaWMxIiBmb3IgdGhlIChvYnNvbGV0ZSkgZmlyc3QtZ2VuZXJhdGlvbiBhaWMKKyAgd2l0aCA4IGludGVycnVwdCBsaW5lcyB3aXRoIHByb2dyYW1tYWJsZSBwcmlvcml0aWVzLCBvciAiamNvcmUsYWljMiIgZm9yCisgIHRoZSAiYWljMiIgY29yZSB3aXRoIDY0IGludGVycnVwdHMuCisKKy0gcmVnOiBNZW1vcnkgcmVnaW9uKHMpIGZvciBjb25maWd1cmF0aW9uLiBGb3IgU01QLCB0aGVyZSBzaG91bGQgYmUgb25lCisgIHJlZ2lvbiBwZXIgY3B1LCBpbmRleGVkIGJ5IHRoZSBzZXF1ZW50aWFsLCB6ZXJvLWJhc2VkIGhhcmR3YXJlIGNwdQorICBudW1iZXIuCisKKy0gaW50ZXJydXB0LWNvbnRyb2xsZXI6IElkZW50aWZpZXMgdGhlIG5vZGUgYXMgYW4gaW50ZXJydXB0IGNvbnRyb2xsZXIKKworLSAjaW50ZXJydXB0LWNlbGxzOiBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjZWxscyBuZWVkZWQgdG8gZW5jb2RlIGFuCisgIGludGVycnVwdCBzb3VyY2UuIFRoZSB2YWx1ZSBzaGFsbCBiZSAxLgorCisKK0V4YW1wbGU6CisKK2FpYzogaW50ZXJydXB0LWNvbnRyb2xsZXJAMjAwIHsKKwljb21wYXRpYmxlID0gImpjb3JlLGFpYzIiOworCXJlZyA9IDwgMHgyMDAgMHgzMCAweDUwMCAweDMwID47CisJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvbWFydmVsbCxhcm1hZGEtOGstcGljLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9tYXJ2ZWxsLGFybWFkYS04ay1waWMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YTdiNGNkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL21hcnZlbGwsYXJtYWRhLThrLXBpYy50eHQKQEAgLTAsMCArMSwyNSBAQAorTWFydmVsbCBBcm1hZGEgN0svOEsgUElDIEludGVycnVwdCBjb250cm9sbGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBpcyB0aGUgRGV2aWNlIFRyZWUgYmluZGluZyBmb3IgdGhlIFBJQywgYSBzZWNvbmRhcnkgaW50ZXJydXB0Citjb250cm9sbGVyIGF2YWlsYWJsZSBvbiB0aGUgTWFydmVsbCBBcm1hZGEgN0svOEsgQVJNNjQgU29DcywgYW5kCit0eXBpY2FsbHkgY29ubmVjdGVkIHRvIHRoZSBHSUMgYXMgdGhlIHByaW1hcnkgaW50ZXJydXB0IGNvbnRyb2xsZXIuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IHNob3VsZCBiZSAibWFydmVsbCxhcm1hZGEtOGstcGljIgorLSBpbnRlcnJ1cHQtY29udHJvbGxlcjogaWRlbnRpZmllcyB0aGUgbm9kZSBhcyBhbiBpbnRlcnJ1cHQgY29udHJvbGxlcgorLSAjaW50ZXJydXB0LWNlbGxzOiB0aGUgbnVtYmVyIG9mIGNlbGxzIHRvIGRlZmluZSBpbnRlcnJ1cHRzIG9uIHRoaXMKKyAgY29udHJvbGxlci4gU2hvdWxkIGJlIDEKKy0gcmVnOiB0aGUgcmVnaXN0ZXIgYXJlYSBmb3IgdGhlIFBJQyBpbnRlcnJ1cHQgY29udHJvbGxlcgorLSBpbnRlcnJ1cHRzOiB0aGUgaW50ZXJydXB0IHRvIHRoZSBwcmltYXJ5IGludGVycnVwdCBjb250cm9sbGVyLAorICB0eXBpY2FsbHkgdGhlIEdJQworCitFeGFtcGxlOgorCisJcGljOiBpbnRlcnJ1cHQtY29udHJvbGxlckAzZjAxMDAgeworCQljb21wYXRpYmxlID0gIm1hcnZlbGwsYXJtYWRhLThrLXBpYyI7CisJCXJlZyA9IDwweDNmMDEwMCAweDEwPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCWludGVycnVwdHMgPSA8R0lDX1BQSSAxNSBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL21hcnZlbGwsb2RtaS1jb250cm9sbGVyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9tYXJ2ZWxsLG9kbWktY29udHJvbGxlci50eHQKaW5kZXggOGFmMGE4ZS4uM2Y2NDQyYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL21hcnZlbGwsb2RtaS1jb250cm9sbGVyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvbWFydmVsbCxvZG1pLWNvbnRyb2xsZXIudHh0CkBAIC0zMSw3ICszMSw3IEBACiBFeGFtcGxlOgogCiAJb2RtaTogb2RtaUAzMDAwMDAgewotCQljb21wYXRpYmxlID0gIm1hcnZlbGwsYXA4MDYtb2RtLWNvbnRyb2xsZXIiLAorCQljb21wYXRpYmxlID0gIm1hcnZlbGwsYXA4MDYtb2RtaS1jb250cm9sbGVyIiwKIAkJCSAgICAgIm1hcnZlbGwsb2RtaS1jb250cm9sbGVyIjsKIAkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CiAJCW1zaS1jb250cm9sbGVyOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL3JlbmVzYXMsaXJxYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvcmVuZXNhcyxpcnFjLnR4dAppbmRleCBhZTUwNTRjLi5lM2YwNTJkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvcmVuZXNhcyxpcnFjLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvcmVuZXNhcyxpcnFjLnR4dApAQCAtMSwxMCArMSwxMiBAQAotRFQgYmluZGluZ3MgZm9yIHRoZSBSLU1vYmlsZS9SLUNhciBpbnRlcnJ1cHQgY29udHJvbGxlcgorRFQgYmluZGluZ3MgZm9yIHRoZSBSLU1vYmlsZS9SLUNhci9SWi9HIGludGVycnVwdCBjb250cm9sbGVyCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAKIC0gY29tcGF0aWJsZTogaGFzIHRvIGJlICJyZW5lc2FzLGlycWMtPHNvY3R5cGU+IiwgInJlbmVzYXMsaXJxYyIgYXMgZmFsbGJhY2suCiAgIEV4YW1wbGVzIHdpdGggc29jdHlwZXMgYXJlOgogICAgIC0gInJlbmVzYXMsaXJxYy1yOGE3M2E0IiAoUi1Nb2JpbGUgQVBFNikKKyAgICAtICJyZW5lc2FzLGlycWMtcjhhNzc0MyIgKFJaL0cxTSkKKyAgICAtICJyZW5lc2FzLGlycWMtcjhhNzc0NSIgKFJaL0cxRSkKICAgICAtICJyZW5lc2FzLGlycWMtcjhhNzc5MCIgKFItQ2FyIEgyKQogICAgIC0gInJlbmVzYXMsaXJxYy1yOGE3NzkxIiAoUi1DYXIgTTItVykKICAgICAtICJyZW5lc2FzLGlycWMtcjhhNzc5MiIgKFItQ2FyIFYySCkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9zdCxzdG0zMi1leHRpLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9zdCxzdG0zMi1leHRpLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTc3MDNkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL3N0LHN0bTMyLWV4dGkudHh0CkBAIC0wLDAgKzEsMjAgQEAKK1NUTTMyIEV4dGVybmFsIEludGVycnVwdCBDb250cm9sbGVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJzdCxzdG0zMi1leHRpIgorLSByZWc6IFNwZWNpZmllcyBiYXNlIHBoeXNpY2FsIGFkZHJlc3MgYW5kIHNpemUgb2YgdGhlIHJlZ2lzdGVycworLSBpbnRlcnJ1cHQtY29udHJvbGxlcjogSW5kZW50aWZpZXMgdGhlIG5vZGUgYXMgYW4gaW50ZXJydXB0IGNvbnRyb2xsZXIKKy0gI2ludGVycnVwdC1jZWxsczogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY2VsbHMgdG8gZW5jb2RlIGFuIGludGVycnVwdAorICBzcGVjaWZpZXIsIHNoYWxsIGJlIDIKKy0gaW50ZXJydXB0czogaW50ZXJydXB0cyByZWZlcmVuY2VzIHRvIHByaW1hcnkgaW50ZXJydXB0IGNvbnRyb2xsZXIKKworRXhhbXBsZToKKworZXh0aTogaW50ZXJydXB0LWNvbnRyb2xsZXJANDAwMTNjMDAgeworCWNvbXBhdGlibGUgPSAic3Qsc3RtMzItZXh0aSI7CisJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwlyZWcgPSA8MHg0MDAxM0MwMCAweDQwMD47CisJaW50ZXJydXB0cyA9IDwxPiwgPDI+LCA8Mz4sIDw2PiwgPDc+LCA8OD4sIDw5PiwgPDEwPiwgPDIzPiwgPDQwPiwgPDQxPiwgPDQyPiwgPDYyPiwgPDc2PjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9jb21tb24udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvY29tbW9uLnR4dAppbmRleCA5M2VmNmU2Li42OTZiZTU3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9jb21tb24udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2NvbW1vbi50eHQKQEAgLTE5LDYgKzE5LDEzIEBACiAJICBhIGRldmljZSwgaS5lLiBubyBvdGhlciBMRUQgY2xhc3MgZGV2aWNlIGNhbiBiZSBhc3NpZ25lZCB0aGUgc2FtZQogCSAgbGFiZWwuCiAKKy0gZGVmYXVsdC1zdGF0ZSA6IFRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBMRUQuIFZhbGlkIHZhbHVlcyBhcmUgIm9uIiwgIm9mZiIsCisgIGFuZCAia2VlcCIuIElmIHRoZSBMRUQgaXMgYWxyZWFkeSBvbiBvciBvZmYgYW5kIHRoZSBkZWZhdWx0LXN0YXRlIHByb3BlcnR5IGlzCisgIHNldCB0aGUgdG8gc2FtZSB2YWx1ZSwgdGhlbiBubyBnbGl0Y2ggc2hvdWxkIGJlIHByb2R1Y2VkIHdoZXJlIHRoZSBMRUQKKyAgbW9tZW50YXJpbHkgdHVybnMgb2ZmIChvciBvbikuIFRoZSAia2VlcCIgc2V0dGluZyB3aWxsIGtlZXAgdGhlIExFRCBhdAorICB3aGF0ZXZlciBpdHMgY3VycmVudCBzdGF0ZSBpcywgd2l0aG91dCBwcm9kdWNpbmcgYSBnbGl0Y2guICBUaGUgZGVmYXVsdCBpcworICBvZmYgaWYgdGhpcyBwcm9wZXJ0eSBpcyBub3QgcHJlc2VudC4KKwogLSBsaW51eCxkZWZhdWx0LXRyaWdnZXIgOiAgVGhpcyBwYXJhbWV0ZXIsIGlmIHByZXNlbnQsIGlzIGEKICAgICBzdHJpbmcgZGVmaW5pbmcgdGhlIHRyaWdnZXIgYXNzaWduZWQgdG8gdGhlIExFRC4gIEN1cnJlbnQgdHJpZ2dlcnMgYXJlOgogICAgICAiYmFja2xpZ2h0IiAtIExFRCB3aWxsIGFjdCBhcyBhIGJhY2stbGlnaHQsIGNvbnRyb2xsZWQgYnkgdGhlIGZyYW1lYnVmZmVyCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9sZWRzLWJjbTYzMjgudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvbGVkcy1iY202MzI4LnR4dAppbmRleCAzZjQ4YzFlLi5jY2ViY2U1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9sZWRzLWJjbTYzMjgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtYmNtNjMyOC50eHQKQEAgLTQ5LDcgKzQ5LDcgQEAKICAgICAtIGFjdGl2ZS1sb3cgOiBCb29sZWFuLCBtYWtlcyBMRUQgYWN0aXZlIGxvdy4KICAgICAgIERlZmF1bHQgOiBmYWxzZQogICAgIC0gZGVmYXVsdC1zdGF0ZSA6IHNlZQotICAgICAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvbGVkcy1ncGlvLnR4dAorICAgICAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvY29tbW9uLnR4dAogICAgIC0gbGludXgsZGVmYXVsdC10cmlnZ2VyIDogc2VlCiAgICAgICBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9jb21tb24udHh0CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtYmNtNjM1OC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9sZWRzLWJjbTYzNTgudHh0CmluZGV4IGIyMmE1NWIuLmRhNTcwOGUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtYmNtNjM1OC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvbGVkcy1iY202MzU4LnR4dApAQCAtMjgsNyArMjgsNyBAQAogICAtIGFjdGl2ZS1sb3cgOiBCb29sZWFuLCBtYWtlcyBMRUQgYWN0aXZlIGxvdy4KICAgICBEZWZhdWx0IDogZmFsc2UKICAgLSBkZWZhdWx0LXN0YXRlIDogc2VlCi0gICAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvbGVkcy1ncGlvLnR4dAorICAgIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2NvbW1vbi50eHQKICAgLSBsaW51eCxkZWZhdWx0LXRyaWdnZXIgOiBzZWUKICAgICBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9jb21tb24udHh0CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtZ3Bpby50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9sZWRzLWdwaW8udHh0CmluZGV4IDViMWI0M2EuLjc2NTM1Y2EgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtZ3Bpby50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvbGVkcy1ncGlvLnR4dApAQCAtMTQsMTMgKzE0LDggQEAKICAgc2VlIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2NvbW1vbi50eHQKIC0gbGludXgsZGVmYXVsdC10cmlnZ2VyIDogIChvcHRpb25hbCkKICAgc2VlIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2NvbW1vbi50eHQKLS0gZGVmYXVsdC1zdGF0ZTogIChvcHRpb25hbCkgVGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIExFRC4gIFZhbGlkCi0gIHZhbHVlcyBhcmUgIm9uIiwgIm9mZiIsIGFuZCAia2VlcCIuICBJZiB0aGUgTEVEIGlzIGFscmVhZHkgb24gb3Igb2ZmCi0gIGFuZCB0aGUgZGVmYXVsdC1zdGF0ZSBwcm9wZXJ0eSBpcyBzZXQgdGhlIHRvIHNhbWUgdmFsdWUsIHRoZW4gbm8KLSAgZ2xpdGNoIHNob3VsZCBiZSBwcm9kdWNlZCB3aGVyZSB0aGUgTEVEIG1vbWVudGFyaWx5IHR1cm5zIG9mZiAob3IKLSAgb24pLiAgVGhlICJrZWVwIiBzZXR0aW5nIHdpbGwga2VlcCB0aGUgTEVEIGF0IHdoYXRldmVyIGl0cyBjdXJyZW50Ci0gIHN0YXRlIGlzLCB3aXRob3V0IHByb2R1Y2luZyBhIGdsaXRjaC4gIFRoZSBkZWZhdWx0IGlzIG9mZiBpZiB0aGlzCi0gIHByb3BlcnR5IGlzIG5vdCBwcmVzZW50LgorLSBkZWZhdWx0LXN0YXRlOiAgKG9wdGlvbmFsKSBUaGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgTEVELgorICBzZWUgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvY29tbW9uLnR4dAogLSByZXRhaW4tc3RhdGUtc3VzcGVuZGVkOiAob3B0aW9uYWwpIFRoZSBzdXNwZW5kIHN0YXRlIGNhbiBiZSByZXRhaW5lZC5TdWNoCiAgIGFzIGNoYXJnZS1sZWQgZ3Bpby4KIC0gcGFuaWMtaW5kaWNhdG9yIDogKG9wdGlvbmFsKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvbGVkcy1pczMxZmwzMTl4LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtaXMzMWZsMzE5eC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMyNjAzNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtaXMzMWZsMzE5eC50eHQKQEAgLTAsMCArMSw1OSBAQAorTEVEcyBjb25uZWN0ZWQgdG8gaXMzMWZsMzE5eCBMRUQgY29udHJvbGxlciBjaGlwCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiBTaG91bGQgYmUgYW55IG9mCisJImlzc2ksaXMzMWZsMzE5MCIKKwkiaXNzaSxpczMxZmwzMTkxIgorCSJpc3NpLGlzMzFmbDMxOTMiCisJImlzc2ksaXMzMWZsMzE5NiIKKwkiaXNzaSxpczMxZmwzMTk5IgorCSJzaS1lbixzbjMxOTkiLgorLSAjYWRkcmVzcy1jZWxsczogTXVzdCBiZSAxLgorLSAjc2l6ZS1jZWxsczogTXVzdCBiZSAwLgorLSByZWc6IDB4NjQsIDB4NjUsIDB4NjYsIG9yIDB4NjcuCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIGF1ZGlvLWdhaW4tZGIgOiBhdWRpbyBnYWluIHNlbGVjdGlvbiBmb3IgZXh0ZXJuYWwgYW5hbG9nIG1vZHVsYXRpb24gaW5wdXQuCisJVmFsaWQgdmFsdWVzOiAwIC0gMjEsIHN0ZXAgYnkgMyAocm91bmRlZCBkb3duKQorCURlZmF1bHQ6IDAKKworRWFjaCBsZWQgaXMgcmVwcmVzZW50ZWQgYXMgYSBzdWItbm9kZSBvZiB0aGUgaXNzaSxpczMxZmwzMTl4IGRldmljZS4KK1RoZXJlIGNhbiBiZSBsZXNzIGxlZHMgc3Vibm9kZXMgdGhhbiB0aGUgY2hpcCBjYW4gc3VwcG9ydCBidXQgbm90IG1vcmUuCisKK1JlcXVpcmVkIGxlZCBzdWItbm9kZSBwcm9wZXJ0aWVzOgorLSByZWcgOiBudW1iZXIgb2YgTEVEIGxpbmUKKwlWYWxpZCB2YWx1ZXM6IDEgLSBudW1iZXIgb2YgbGVkcyBzdXBwb3J0ZWQgYnkgdGhlIGNoaXAgdmFyaWFudC4KKworT3B0aW9uYWwgbGVkIHN1Yi1ub2RlIHByb3BlcnRpZXM6CistIGxhYmVsIDogc2VlIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2NvbW1vbi50eHQuCistIGxpbnV4LGRlZmF1bHQtdHJpZ2dlciA6CisJc2VlIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2NvbW1vbi50eHQuCistIGxlZC1tYXgtbWljcm9hbXAgOiAob3B0aW9uYWwpCisJVmFsaWQgdmFsdWVzOiA1MDAwIC0gNDAwMDAsIHN0ZXAgYnkgNTAwMCAocm91bmRlZCBkb3duKQorCURlZmF1bHQ6IDIwMDAwICgyMCBtQSkKKwlOb3RlOiBhIGRyaXZlciB3aWxsIHRha2UgdGhlIGxvd2VzdCBvZiBhbGwgbGVkIGxpbWl0cyBzaW5jZSB0aGUKKwljaGlwIGhhcyBhIHNpbmdsZSBnbG9iYWwgc2V0dGluZy4gVGhlIGxvd2VzdCB2YWx1ZSB3aWxsIGJlIGNob3NlbgorCWR1ZSB0byB0aGUgUFdNIHNwZWNpZmljaXR5LCB3aGVyZSBsb3dlciBicmlnaHRuZXNzIGlzIGFjaGlldmVkCisJYnkgcmVkdWNpbmcgdGhlIGR1cnktY3ljbGUgb2YgcHVsc2VzIGFuZCBub3QgdGhlIGN1cnJlbnQsIHdoaWNoCisJd2lsbCBhbHdheXMgaGF2ZSBpdHMgcGVhayB2YWx1ZSBlcXVhbCB0byBsZWQtbWF4LW1pY3JvYW1wLgorCitFeGFtcGxlczoKKworZmFuY3lfbGVkczogbGVkc0A2NSB7CisJY29tcGF0aWJsZSA9ICJpc3NpLGlzMzFmbDMxOTYiOworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDA+OworCXJlZyA9IDwweDY1PjsKKworCXJlZF9hdXg6IGxlZEAxIHsKKwkJbGFiZWwgPSAicmVkOmF1eCI7CisJCXJlZyA9IDwxPjsKKwkJbGVkLW1heC1taWNyb2FtcCA9IDwxMDAwMD47CisJfTsKKworCWdyZWVuX3Bvd2VyOiBsZWRANSB7CisJCWxhYmVsID0gImdyZWVuOnBvd2VyIjsKKwkJcmVnID0gPDU+OworCQlsaW51eCxkZWZhdWx0LXRyaWdnZXIgPSAiZGVmYXVsdC1vbiI7CisJfTsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9sZWRzLXBtODA1OC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9sZWRzLXBtODA1OC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk1ODRjNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtcG04MDU4LnR4dApAQCAtMCwwICsxLDY3IEBACitRdWFsY29tbSBQTTgwNTggTEVEIGRyaXZlcgorCitUaGUgUXVhbGNvbW0gUE04MDU4IGlzIGEgbXVsdGktZnVuY3Rpb25hbCBkZXZpY2Ugd2hpY2ggY29udGFpbnMKK2FuIExFRCBkcml2ZXIgYmxvY2sgZm9yIHVwIHRvIHNpeCBMRURzOiB0aHJlZSBub3JtYWwgTEVEcywgdHdvCisiZmxhc2giIExFRHMgYW5kIG9uZSAia2V5cGFkIGJhY2tsaWdodCIgTEVELiBUaGUgbmFtZXMgYXJlCitxdW90ZWQgYmVjYXVzZSBzb21ldGltZXMgdGhlc2UgTEVEIGRyaXZlcnMgYXJlIHVzZWQgZm9yIHdpbGRseQorZGlmZmVyZW50IHRoaW5ncyB0aGFuIGZsYXNoIG9yIGtleXBhZCBiYWNrbGlnaHQ6IHRoZWlyIG5hbWVzCithcmUgbW9yZSBvZiBhIHN1Z2dlc3Rpb24gdGhhbiBhIGhhcmQtd2lyZWQgdXNlY2FzZS4KKworSGFyZHdhcmUtd2lzZSB0aGUgZGlmZmVyZW50IExFRHMgc3VwcG9ydCBzbGlnaHRseSBkaWZmZXJlbnQKK291dHB1dCBjdXJyZW50cy4gVGhlICJmbGFzaCIgTEVEcyBkbyBub3QgbmVlZCB0byBjaGFyZ2Ugbm9yCitkbyB0aGV5IHN1cHBvcnQgZXh0ZXJuYWwgdHJpZ2dlcnMuIFRoZXkgYXJlIGp1c3QgcG93ZXJmdWwgTEVECitkcml2ZXJzLgorCitUaGUgTEVEcyBhcHBlYXIgYXMgY2hpbGRyZW4gdG8gdGhlIFBNODA1OCBkZXZpY2UsIHdpdGggdGhlCitwcm9wZXIgY29tcGF0aWJsZSBzdHJpbmcuIEZvciB0aGUgUE04MDU4IGJpbmRpbmdzIHNlZToKK21mZC9xY29tLXBtOHh4eC50eHQuCisKK0VhY2ggTEVEIGlzIHJlcHJlc2VudGVkIGFzIGEgc3ViLW5vZGUgb2YgdGhlIHN5c2NvbiBkZXZpY2UuIEVhY2gKK25vZGUncyBuYW1lIHJlcHJlc2VudHMgdGhlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgTEVELgorCitMRUQgc3ViLW5vZGUgcHJvcGVydGllczoKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogb25lIG9mCisgICJxY29tLHBtODA1OC1sZWQiIChmb3IgdGhlIG5vcm1hbCBMRURzIGF0IDB4MTMxLCAweDEzMiBhbmQgMHgxMzMpCisgICJxY29tLHBtODA1OC1rZXlwYWQtbGVkIiAoZm9yIHRoZSAia2V5cGFkIiBMRUQgYXQgMHg0OCkKKyAgInFjb20scG04MDU4LWZsYXNoLWxlZCIgKGZvciB0aGUgImZsYXNoIiBMRURzIGF0IDB4NDkgYW5kIDB4RkIpCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIGxhYmVsOiBzZWUgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvY29tbW9uLnR4dAorLSBkZWZhdWx0LXN0YXRlOiBzZWUgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvY29tbW9uLnR4dAorLSBsaW51eCxkZWZhdWx0LXRyaWdnZXI6IHNlZSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9jb21tb24udHh0CisKK0V4YW1wbGU6CisKK3Fjb20sc3NiaUA1MDAwMDAgeworCXBtaWNpbnRjOiBwbWljQDAgeworCQljb21wYXRpYmxlID0gInFjb20scG04MDU4IjsKKwkJbGVkQDQ4IHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxwbTgwNTgta2V5cGFkLWxlZCI7CisJCQlyZWcgPSA8MHg0OD47CisJCQlsYWJlbCA9ICJwbTgwNTA6d2hpdGU6a2V5cGFkIjsKKwkJCWRlZmF1bHQtc3RhdGUgPSAib2ZmIjsKKwkJfTsKKwkJbGVkQDEzMSB7CisJCQljb21wYXRpYmxlID0gInFjb20scG04MDU4LWxlZCI7CisJCQlyZWcgPSA8MHgxMzE+OworCQkJbGFiZWwgPSAicG04MDU4OnJlZCI7CisJCQlkZWZhdWx0LXN0YXRlID0gIm9mZiI7CisJCX07CisJCWxlZEAxMzIgeworCQkJY29tcGF0aWJsZSA9ICJxY29tLHBtODA1OC1sZWQiOworCQkJcmVnID0gPDB4MTMyPjsKKwkJCWxhYmVsID0gInBtODA1ODp5ZWxsb3ciOworCQkJZGVmYXVsdC1zdGF0ZSA9ICJvZmYiOworCQkJbGludXgsZGVmYXVsdC10cmlnZ2VyID0gIm1tYzAiOworCQl9OworCQlsZWRAMTMzIHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxwbTgwNTgtbGVkIjsKKwkJCXJlZyA9IDwweDEzMz47CisJCQlsYWJlbCA9ICJwbTgwNTg6Z3JlZW4iOworCQkJZGVmYXVsdC1zdGF0ZSA9ICJvbiI7CisJCQlsaW51eCxkZWZhdWx0LXRyaWdnZXIgPSAiaGVhcnRiZWF0IjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL3JlZ2lzdGVyLWJpdC1sZWQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvcmVnaXN0ZXItYml0LWxlZC50eHQKaW5kZXggMzc5Y2VmZGMuLjU5YjU2MzYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL3JlZ2lzdGVyLWJpdC1sZWQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL3JlZ2lzdGVyLWJpdC1sZWQudHh0CkBAIC0yMywxMyArMjMsOCBAQAogICBzZWUgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvY29tbW9uLnR4dAogLSBsaW51eCxkZWZhdWx0LXRyaWdnZXIgOiAob3B0aW9uYWwpCiAgIHNlZSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9jb21tb24udHh0Ci0tIGRlZmF1bHQtc3RhdGU6IChvcHRpb25hbCkgVGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIExFRC4gVmFsaWQKLSAgdmFsdWVzIGFyZSAib24iLCAib2ZmIiwgYW5kICJrZWVwIi4gSWYgdGhlIExFRCBpcyBhbHJlYWR5IG9uIG9yIG9mZgotICBhbmQgdGhlIGRlZmF1bHQtc3RhdGUgcHJvcGVydHkgaXMgc2V0IHRoZSB0byBzYW1lIHZhbHVlLCB0aGVuIG5vCi0gIGdsaXRjaCBzaG91bGQgYmUgcHJvZHVjZWQgd2hlcmUgdGhlIExFRCBtb21lbnRhcmlseSB0dXJucyBvZmYgKG9yCi0gIG9uKS4gVGhlICJrZWVwIiBzZXR0aW5nIHdpbGwga2VlcCB0aGUgTEVEIGF0IHdoYXRldmVyIGl0cyBjdXJyZW50Ci0gIHN0YXRlIGlzLCB3aXRob3V0IHByb2R1Y2luZyBhIGdsaXRjaC4gIFRoZSBkZWZhdWx0IGlzIG9mZiBpZiB0aGlzCi0gIHByb3BlcnR5IGlzIG5vdCBwcmVzZW50LgorLSBkZWZhdWx0LXN0YXRlOiAob3B0aW9uYWwpIFRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBMRUQKKyAgc2VlIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2NvbW1vbi50eHQKIAogRXhhbXBsZToKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21haWxib3gvbWVzb24tbWh1LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tYWlsYm94L21lc29uLW1odS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUzMDMxMAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tYWlsYm94L21lc29uLW1odS50eHQKQEAgLTAsMCArMSwzNCBAQAorQW1sb2dpYyBNZXNvbiBNSFUgTWFpbGJveCBEcml2ZXIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBBbWxvZ2ljJ3MgTWVzb24gU29DcyBNZXNzYWdlLUhhbmRsaW5nLVVuaXQgKE1IVSkgaXMgYSBtYWlsYm94IGNvbnRyb2xsZXIKK3RoYXQgaGFzIDMgaW5kZXBlbmRlbnQgY2hhbm5lbHMvbGlua3MgdG8gY29tbXVuaWNhdGUgd2l0aCByZW1vdGUgcHJvY2Vzc29yKHMpLgorTUhVIGxpbmtzIGFyZSBoYXJkd2lyZWQgb24gYSBwbGF0Zm9ybS4gQSBsaW5rIHJhaXNlcyBpbnRlcnJ1cHQgZm9yIGFueQorcmVjZWl2ZWQgZGF0YS4gSG93ZXZlciwgdGhlcmUgaXMgbm8gc3BlY2lmaWVkIHdheSBvZiBrbm93aW5nIGlmIHRoZSBzZW50CitkYXRhIGhhcyBiZWVuIHJlYWQgYnkgdGhlIHJlbW90ZS4gVGhpcyBkcml2ZXIgYXNzdW1lcyB0aGUgc2VuZGVyIHBvbGxzCitTVEFUIHJlZ2lzdGVyIGFuZCB0aGUgcmVtb3RlIGNsZWFycyBpdCBhZnRlciBoYXZpbmcgcmVhZCB0aGUgZGF0YS4KKworTWFpbGJveCBEZXZpY2UgTm9kZToKKz09PT09PT09PT09PT09PT09PT09CisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistLS0tLS0tLS0tLS0tLS0tLS0tLQorLSBjb21wYXRpYmxlOgkJU2hhbGwgYmUgImFtbG9naWMsbWVzb24tZ3hiYi1taHUiCistIHJlZzoJCQlDb250YWlucyB0aGUgbWFpbGJveCByZWdpc3RlciBhZGRyZXNzIHJhbmdlIChiYXNlCisJCQlhZGRyZXNzIGFuZCBsZW5ndGgpCistICNtYm94LWNlbGxzCQlTaGFsbCBiZSAxIC0gdGhlIGluZGV4IG9mIHRoZSBjaGFubmVsIG5lZWRlZC4KKy0gaW50ZXJydXB0czoJCUNvbnRhaW5zIHRoZSBpbnRlcnJ1cHQgaW5mb3JtYXRpb24gY29ycmVzcG9uZGluZyB0bworCQkJZWFjaCBvZiB0aGUgMiBsaW5rcyBvZiBNSFUuCisKK0V4YW1wbGU6CistLS0tLS0tLQorCisJbWFpbGJveDogbWFpbGJveEBjODgzYzQwNCB7CisJCSNtYm94LWNlbGxzID0gPDE+OworCQljb21wYXRpYmxlID0gImFtbG9naWMsbWVzb24tZ3hiYi1taHUiOworCQlyZWcgPSA8MCAweGM4ODNjNDA0IDAgMHg0Yz47CisJCWludGVycnVwdHMgPSA8MCAyMDggSVJRX1RZUEVfRURHRV9SSVNJTkc+LAorCQkJICAgICA8MCAyMDkgSVJRX1RZUEVfRURHRV9SSVNJTkc+LAorCQkJICAgICA8MCAyMTAgSVJRX1RZUEVfRURHRV9SSVNJTkc+OworCQkjbWJveC1jZWxscyA9IDwxPjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21lbW9yeS1jb250cm9sbGVycy9mc2wvZGRyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZW1vcnktY29udHJvbGxlcnMvZnNsL2Rkci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRlNmQ4MwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZW1vcnktY29udHJvbGxlcnMvZnNsL2Rkci50eHQKQEAgLTAsMCArMSwyOSBAQAorRnJlZXNjYWxlIEREUiBtZW1vcnkgY29udHJvbGxlcgorCitQcm9wZXJ0aWVzOgorCistIGNvbXBhdGlibGUJOiBTaG91bGQgaW5jbHVkZSAiZnNsLGNoaXAtbWVtb3J5LWNvbnRyb2xsZXIiIHdoZXJlCisJCSAgY2hpcCBpcyB0aGUgcHJvY2Vzc29yIChic2M5MTMyLCBtcGM4NTcyIGV0Yy4pLCBvcgorCQkgICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXIiLgorLSByZWcJCTogQWRkcmVzcyBhbmQgc2l6ZSBvZiBERFIgY29udHJvbGxlciByZWdpc3RlcnMKKy0gaW50ZXJydXB0cwk6IEVycm9yIGludGVycnVwdCBvZiBERFIgY29udHJvbGxlcgorLSBsaXR0bGUtZW5kaWFuCTogU3BlY2lmaWVzIGxpdHRsZS1lbmRpYW4gYWNjZXNzIHRvIHJlZ2lzdGVycworCQkgIElmIG9taXR0ZWQsIGJpZy1lbmRpYW4gd2lsbCBiZSB1c2VkLgorCitFeGFtcGxlIDE6CisKKwltZW1vcnktY29udHJvbGxlckAyMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsYnNjOTEzMi1tZW1vcnktY29udHJvbGxlciI7CisJCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDEgOD47CisJfTsKKworCitFeGFtcGxlIDI6CisKKwlkZHIxOiBtZW1vcnktY29udHJvbGxlckA4MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXItdjQuNyIsCisJCQkJImZzbCxxb3JpcS1tZW1vcnktY29udHJvbGxlciI7CisJCXJlZyA9IDwweDgwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMjM+OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL21heDc3NjkzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvbWF4Nzc2OTMudHh0CmluZGV4IGQzNDI1ODQuLjZhMWFlM2EgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvbWF4Nzc2OTMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvbWF4Nzc2OTMudHh0CkBAIC0xNywyOCArMTcsMjggQEAKIC0gaW50ZXJydXB0LXBhcmVudCA6ICBUaGUgcGFyZW50IGludGVycnVwdCBjb250cm9sbGVyLgogCiBPcHRpb25hbCBwcm9wZXJ0aWVzOgotLSByZWd1bGF0b3JzIDogVGhlIHJlZ3VsYXRvcnMgb2YgbWF4Nzc2OTMgaGF2ZSB0byBiZSBpbnN0YW50aWF0ZWQgdW5kZXIgc3Vibm9kCistIHJlZ3VsYXRvcnMgOiBUaGUgcmVndWxhdG9ycyBvZiBtYXg3NzY5MyBoYXZlIHRvIGJlIGluc3RhbnRpYXRlZCB1bmRlciBzdWJub2RlCiAgIG5hbWVkICJyZWd1bGF0b3JzIiB1c2luZyB0aGUgZm9sbG93aW5nIGZvcm1hdC4KIAogCXJlZ3VsYXRvcnMgewotCQlyZWd1YWx0b3ItY29tcGF0aWJsZSA9IEVTQUZFT1VUMS9FU0FGRU9VVDIvQ0hBUkdFUgotCQlzdGFuZGFyZCByZWd1bGF0b3IgY29uc3RyYXRpbnRzWypdLgorCQlyZWd1bGF0b3ItY29tcGF0aWJsZSA9IEVTQUZFT1VUMS9FU0FGRU9VVDIvQ0hBUkdFUgorCQlzdGFuZGFyZCByZWd1bGF0b3IgY29uc3RyYWludHNbKl0uCiAJfTsKIAogCVsqXSByZWZlciBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL3JlZ3VsYXRvci50eHQKIAogLSBoYXB0aWMgOiBUaGUgTUFYNzc2OTMgaGFwdGljIGRldmljZSB1dGlsaXNlcyBhIFBXTSBjb250cm9sbGVkIG1vdG9yIHRvIHByb3ZpZGUKICAgdXNlcnMgd2l0aCB0YWN0aWxlIGZlZWRiYWNrLiBQV00gcGVyaW9kIGFuZCBkdXR5LWN5Y2xlIGFyZSB2YXJpZWQgaW4KLSAgb3JkZXIgdG8gcHJvdmlkZSB0aGUgYXBwcm9wcml0ZSBsZXZlbCBvZiBmZWVkYmFjay4KKyAgb3JkZXIgdG8gcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgbGV2ZWwgb2YgZmVlZGJhY2suCiAKICBSZXF1aXJlZCBwcm9wZXJ0aWVzOgotCS0gY29tcGF0aWJsZSA6IE11c3QgYmUgIm1heGltLG1heDc3NjkzLWhwYXRpYyIKKwktIGNvbXBhdGlibGUgOiBNdXN0IGJlICJtYXhpbSxtYXg3NzY5My1oYXB0aWMiCiAJLSBoYXB0aWMtc3VwcGx5IDogcG93ZXIgc3VwcGx5IGZvciB0aGUgaGFwdGljIG1vdG9yCiAJWypdIHJlZmVyIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvcmVndWxhdG9yLnR4dAogCS0gcHdtcyA6IHBoYW5kbGUgdG8gdGhlIHBoeXNpY2FsIFBXTShQdWxzZSBXaWR0aCBNb2R1bGF0aW9uKSBkZXZpY2UuCiAJIFBXTSBwcm9wZXJ0aWVzIHNob3VsZCBiZSBuYW1lZCAicHdtcyIuIEFuZCBudW1iZXIgb2YgY2VsbCBpcyBkaWZmZXJlbnQKIAkgZm9yIGVhY2ggcHdtIGRldmljZS4KLQkgVG8gZ2V0IG1vcmUgaW5mb3JtYXRpb25zLCBwbGVhc2UgcmVmZXIgdG8gZG9jdW1lbnRhaW9uLgorCSBUbyBnZXQgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlZmVyIHRvIGRvY3VtZW50YXRpb24uCiAJWypdIHJlZmVyIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wd20vcHdtLnR4dAogCiAtIGNoYXJnZXIgOiBOb2RlIGNvbmZpZ3VyaW5nIHRoZSBjaGFyZ2VyIGRyaXZlci4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvYXJhc2FuLHNkaGNpLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvYXJhc2FuLHNkaGNpLnR4dAppbmRleCAzNDA0YWZhLi40OWRmNjMwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL2FyYXNhbixzZGhjaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9hcmFzYW4sc2RoY2kudHh0CkBAIC0zNiw2ICszNiw5IEBACiAgIC0gI2Nsb2NrLWNlbGxzOiBJZiBzcGVjaWZpZWQgdGhpcyBzaG91bGQgYmUgdGhlIHZhbHVlIDwwPi4gIFdpdGggdGhpcyBwcm9wZXJ0eQogICAgIGluIHBsYWNlIHdlIHdpbGwgZXhwb3J0IGEgY2xvY2sgcmVwcmVzZW50aW5nIHRoZSBDYXJkIENsb2NrLiAgVGhpcyBjbG9jawogICAgIGlzIGV4cGVjdGVkIHRvIGJlIGNvbnN1bWVkIGJ5IG91ciBQSFkuICBZb3UgbXVzdCBhbHNvIHNwZWNpZnkKKyAgLSB4bG54LGZhaWxzLXdpdGhvdXQtdGVzdC1jZDogd2hlbiBwcmVzZW50LCB0aGUgY29udHJvbGxlciBkb2Vzbid0IHdvcmsgd2hlbgorICAgIHRoZSBDRCBsaW5lIGlzIG5vdCBjb25uZWN0ZWQgcHJvcGVybHksIGFuZCB0aGUgbGluZSBpcyBub3QgY29ubmVjdGVkCisgICAgcHJvcGVybHkuIFRlc3QgbW9kZSBjYW4gYmUgdXNlZCB0byBmb3JjZSB0aGUgY29udHJvbGxlciB0byBmdW5jdGlvbi4KIAogRXhhbXBsZToKIAlzZGhjaUBlMDEwMDAwMCB7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL2JyY20sYmNtNzQyNS1zZGhjaS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL2JyY20sYmNtNzQyNS1zZGhjaS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyODQ3MTcuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9icmNtLGJjbTc0MjUtc2RoY2kudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotKiBCUk9BRENPTSBCUkNNU1RCL0JNSVBTIFNESENJIENvbnRyb2xsZXIKLQotVGhpcyBmaWxlIGRvY3VtZW50cyBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBjb3JlIHByb3BlcnRpZXMgaW4gbW1jLnR4dAotYW5kIHRoZSBwcm9wZXJ0aWVzIHVzZWQgYnkgdGhlIHNkaGNpLWJyY21zdGIgZHJpdmVyLgotCi1OT1RFOiBUaGUgZHJpdmVyIGRpc2FibGVzIGFsbCBVSFMgc3BlZWQgbW9kZXMgYnkgZGVmYXVsdCBhbmQgZGVwZW5kcwotb24gRGV2aWNlIFRyZWUgcHJvcGVydGllcyB0byBlbmFibGUgdGhlbSBmb3IgU29DL0JvYXJkIGNvbWJpbmF0aW9ucwotdGhhdCBzdXBwb3J0IHRoZW0uCi0KLVJlcXVpcmVkIHByb3BlcnRpZXM6Ci0tIGNvbXBhdGlibGU6ICJicmNtLGJjbTc0MjUtc2RoY2kiCi0KLVJlZmVyIHRvIGNsb2Nrcy9jbG9jay1iaW5kaW5ncy50eHQgZm9yIGdlbmVyaWMgY2xvY2sgY29uc3VtZXIgcHJvcGVydGllcy4KLQotRXhhbXBsZToKLQotCXNkaGNpQGYwM2UwMTAwIHsKLQkJY29tcGF0aWJsZSA9ICJicmNtLGJjbTc0MjUtc2RoY2kiOwotCQlyZWcgPSA8MHhmMDNlMDAwMCAweDEwMD47Ci0JCWludGVycnVwdHMgPSA8MHgwIDB4MjYgMHgwPjsKLQkJc2RoY2ksYXV0by1jbWQxMjsKLQkJY2xvY2tzID0gPCZzd19zZGlvPjsKLQkJc2QtdWhzLXNkcjUwOwotCQlzZC11aHMtZGRyNTA7Ci0JfTsKLQotCXNkaGNpQGYwM2UwMzAwIHsKLQkJbm9uLXJlbW92YWJsZTsKLQkJYnVzLXdpZHRoID0gPDB4OD47Ci0JCWNvbXBhdGlibGUgPSAiYnJjbSxiY203NDI1LXNkaGNpIjsKLQkJcmVnID0gPDB4ZjAzZTAyMDAgMHgxMDA+OwotCQlpbnRlcnJ1cHRzID0gPDB4MCAweDI3IDB4MD47Ci0JCXNkaGNpLGF1dG8tY21kMTI7Ci0JCWNsb2NrcyA9IDxzd19zZGlvPjsKLQkJbW1jLWhzMjAwLTFfOHY7Ci0JfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvYnJjbSxzZGhjaS1icmNtc3RiLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvYnJjbSxzZGhjaS1icmNtc3RiLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzNiNjRhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9icmNtLHNkaGNpLWJyY21zdGIudHh0CkBAIC0wLDAgKzEsMzggQEAKKyogQlJPQURDT00gQlJDTVNUQi9CTUlQUyBTREhDSSBDb250cm9sbGVyCisKK1RoaXMgZmlsZSBkb2N1bWVudHMgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgY29yZSBwcm9wZXJ0aWVzIGluIG1tYy50eHQKK2FuZCB0aGUgcHJvcGVydGllcyB1c2VkIGJ5IHRoZSBzZGhjaS1icmNtc3RiIGRyaXZlci4KKworTk9URTogVGhlIGRyaXZlciBkaXNhYmxlcyBhbGwgVUhTIHNwZWVkIG1vZGVzIGJ5IGRlZmF1bHQgYW5kIGRlcGVuZHMKK29uIERldmljZSBUcmVlIHByb3BlcnRpZXMgdG8gZW5hYmxlIHRoZW0gZm9yIFNvQy9Cb2FyZCBjb21iaW5hdGlvbnMKK3RoYXQgc3VwcG9ydCB0aGVtLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBzaG91bGQgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcKKyAgLSAiYnJjbSxiY203NDI1LXNkaGNpIgorICAtICJicmNtLGJjbTc0NDUtc2RoY2kiCisKK1JlZmVyIHRvIGNsb2Nrcy9jbG9jay1iaW5kaW5ncy50eHQgZm9yIGdlbmVyaWMgY2xvY2sgY29uc3VtZXIgcHJvcGVydGllcy4KKworRXhhbXBsZToKKworCXNkaGNpQGYwM2UwMTAwIHsKKwkJY29tcGF0aWJsZSA9ICJicmNtLGJjbTc0MjUtc2RoY2kiOworCQlyZWcgPSA8MHhmMDNlMDAwMCAweDEwMD47CisJCWludGVycnVwdHMgPSA8MHgwIDB4MjYgMHgwPjsKKwkJc2RoY2ksYXV0by1jbWQxMjsKKwkJY2xvY2tzID0gPCZzd19zZGlvPjsKKwkJc2QtdWhzLXNkcjUwOworCQlzZC11aHMtZGRyNTA7CisJfTsKKworCXNkaGNpQGYwM2UwMzAwIHsKKwkJbm9uLXJlbW92YWJsZTsKKwkJYnVzLXdpZHRoID0gPDB4OD47CisJCWNvbXBhdGlibGUgPSAiYnJjbSxiY203NDI1LXNkaGNpIjsKKwkJcmVnID0gPDB4ZjAzZTAyMDAgMHgxMDA+OworCQlpbnRlcnJ1cHRzID0gPDB4MCAweDI3IDB4MD47CisJCXNkaGNpLGF1dG8tY21kMTI7CisJCWNsb2NrcyA9IDxzd19zZGlvPjsKKwkJbW1jLWhzMjAwLTFfOHY7CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvbW1jLXB3cnNlcS1zaW1wbGUudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9tbWMtcHdyc2VxLXNpbXBsZS50eHQKaW5kZXggY2UwZTc2Ny4uZTI1NDM2OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9tbWMtcHdyc2VxLXNpbXBsZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9tbWMtcHdyc2VxLXNpbXBsZS50eHQKQEAgLTE2LDYgKzE2LDggQEAKICAgU2VlIC4uL2Nsb2Nrcy9jbG9jay1iaW5kaW5ncy50eHQgZm9yIGRldGFpbHMuCiAtIGNsb2NrLW5hbWVzIDogTXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgZW50cnk6CiAgICJleHRfY2xvY2siIChFeHRlcm5hbCBjbG9jayBwcm92aWRlZCB0byB0aGUgY2FyZCkuCistIHBvc3QtcG93ZXItb24tZGVsYXktbXMgOiBEZWxheSBpbiBtcyBhZnRlciBwb3dlcmluZyB0aGUgY2FyZCBhbmQKKwlkZS1hc3NlcnRpbmcgdGhlIHJlc2V0LWdwaW9zIChpZiBhbnkpCiAKIEV4YW1wbGU6CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvbW1jLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvbW1jLnR4dAppbmRleCAyMmQxZTFmLi44YTM3NzgyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL21tYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9tbWMudHh0CkBAIC03NSw2ICs3NSwxNyBAQAogLSB3YWtldXAtc291cmNlOiBFbmFibGVzIHdha2UgdXAgb2YgaG9zdCBzeXN0ZW0gb24gU0RJTyBJUlEgYXNzZXJ0aW9uCiAJCSAoTGVnYWN5IHByb3BlcnR5IHN1cHBvcnRlZDogImVuYWJsZS1zZGlvLXdha2V1cCIpCiAKK01NQyBwb3dlcgorLS0tLS0tLS0tCisKK0NvbnRyb2xsZXJzIG1heSBpbXBsZW1lbnQgcG93ZXIgY29udHJvbCBmcm9tIGJvdGggdGhlIGNvbm5lY3RlZCBjYXJkcyBhbmQKK3RoZSBJTyBzaWduYWxpbmcgKGZvciBleGFtcGxlIHRvIGNoYW5nZSB0byBoaWdoLXNwZWVkIDEuOFYgc2lnbmFsbGluZykuIElmCit0aGUgc3lzdGVtIHN1cHBvcnRzIHRoaXMsIHRoZW4gdGhlIGZvbGxvd2luZyB0d28gcHJvcGVydGllcyBzaG91bGQgcG9pbnQKK3RvIHZhbGlkIHJlZ3VsYXRvciBub2RlczoKKworLSB2cW1tYy1zdXBwbHk6IHN1cHBseSBub2RlIGZvciBJTyBsaW5lIHBvd2VyCistIHZtbWMtc3VwcGx5OiBzdXBwbHkgbm9kZSBmb3IgY2FyZCdzIHBvd2VyCisKIAogTU1DIHBvd2VyIHNlcXVlbmNlczoKIC0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMDIsMTEgKzExMywxMyBAQAogLSAjc2l6ZS1jZWxsczogc2hvdWxkIGJlIHplcm8uCiAKIFJlcXVpcmVkIGZ1bmN0aW9uIHN1Ym5vZGUgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZTogbmFtZSBvZiBTRElPIGZ1bmN0aW9uIGZvbGxvd2luZyBnZW5lcmljIG5hbWVzIHJlY29tbWVuZGVkIHByYWN0aWNlCiAtIHJlZzogTXVzdCBjb250YWluIHRoZSBTRElPIGZ1bmN0aW9uIG51bWJlciBvZiB0aGUgZnVuY3Rpb24gdGhpcyBzdWJub2RlCiAgICAgICAgZGVzY3JpYmVzLiBBIHZhbHVlIG9mIDAgZGVub3RlcyB0aGUgbWVtb3J5IFNEIGZ1bmN0aW9uLCB2YWx1ZXMgZnJvbQogICAgICAgIDEgdG8gNyBkZW5vdGUgdGhlIFNESU8gZnVuY3Rpb25zLgogCitPcHRpb25hbCBmdW5jdGlvbiBzdWJub2RlIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IG5hbWUgb2YgU0RJTyBmdW5jdGlvbiBmb2xsb3dpbmcgZ2VuZXJpYyBuYW1lcyByZWNvbW1lbmRlZCBwcmFjdGljZQorCiAKIEV4YW1wbGVzCiAtLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9zZGhjaS1zdC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL3NkaGNpLXN0LnR4dAppbmRleCA4OGZhYTkxLi4zY2Q0YzQzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL3NkaGNpLXN0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL3NkaGNpLXN0LnR4dApAQCAtMTAsNyArMTAsNyBAQAogCQkJc3Vic3lzdGVtIChtbWNzcykgaW5zaWRlIHRoZSBGbGFzaFNTIChhdmFpbGFibGUgaW4gU1RpSDQwNyBTb0MKIAkJCWZhbWlseSkuCiAKLS0gY2xvY2stbmFtZXM6CQlTaG91bGQgYmUgIm1tYyIuCistIGNsb2NrLW5hbWVzOgkJU2hvdWxkIGJlICJtbWMiIGFuZCAiaWNuIi4gIChOQjogVGhlIGxhdHRlciBpcyBub3QgY29tcHVsc29yeSkKIAkJCVNlZTogRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Jlc291cmNlLW5hbWVzLnR4dAogLSBjbG9ja3M6CQlQaGFuZGxlIHRvIHRoZSBjbG9jay4KIAkJCVNlZTogRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2Nsb2NrLWJpbmRpbmdzLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9zdW54aS1tbWMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9zdW54aS1tbWMudHh0CmluZGV4IDRiZjQxZDguLjU1Y2RkODAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvc3VueGktbW1jLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL3N1bnhpLW1tYy50eHQKQEAgLTgsNyArOCwxMiBAQAogQWJzb2x1dGUgbWF4aW11bSB0cmFuc2ZlciByYXRlIGlzIDIwME1CL3MKIAogUmVxdWlyZWQgcHJvcGVydGllczoKLSAtIGNvbXBhdGlibGUgOiAiYWxsd2lubmVyLHN1bjRpLWExMC1tbWMiIG9yICJhbGx3aW5uZXIsc3VuNWktYTEzLW1tYyIKKyAtIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgb25lIG9mOgorICAgKiAiYWxsd2lubmVyLHN1bjRpLWExMC1tbWMiCisgICAqICJhbGx3aW5uZXIsc3VuNWktYTEzLW1tYyIKKyAgICogImFsbHdpbm5lcixzdW43aS1hMjAtbW1jIgorICAgKiAiYWxsd2lubmVyLHN1bjlpLWE4MC1tbWMiCisgICAqICJhbGx3aW5uZXIsc3VuNTBpLWE2NC1tbWMiCiAgLSByZWcgOiBtbWMgY29udHJvbGxlciBiYXNlIHJlZ2lzdGVycwogIC0gY2xvY2tzIDogYSBsaXN0IHdpdGggNCBwaGFuZGxlICsgY2xvY2sgc3BlY2lmaWVyIHBhaXJzCiAgLSBjbG9jay1uYW1lcyA6IG11c3QgY29udGFpbiAiYWhiIiwgIm1tYyIsICJvdXRwdXQiIGFuZCAic2FtcGxlIgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9zeW5vcHN5cy1kdy1tc2hjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvc3lub3BzeXMtZHctbXNoYy50eHQKaW5kZXggODYzNmY1YS4uNGUwMGU4NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9zeW5vcHN5cy1kdy1tc2hjLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL3N5bm9wc3lzLWR3LW1zaGMudHh0CkBAIC0zOSw2ICszOSwxMCBAQAogCiBPcHRpb25hbCBwcm9wZXJ0aWVzOgogCisqIHJlc2V0czogcGhhbmRsZSArIHJlc2V0IHNwZWNpZmllciBwYWlyLCBpbnRlbmRlZCB0byByZXByZXNlbnQgaGFyZHdhcmUKKyAgcmVzZXQgc2lnbmFsIHByZXNlbnQgaW50ZXJuYWxseSBpbiBzb21lIGhvc3QgY29udHJvbGxlciBJQyBkZXNpZ25zLgorICBTZWUgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Jlc2V0L3Jlc2V0LnR4dCBmb3IgZGV0YWlscy4KKwogKiBjbG9ja3M6IGZyb20gY29tbW9uIGNsb2NrIGJpbmRpbmc6IGhhbmRsZSB0byBiaXUgYW5kIGNpdSBjbG9ja3MgZm9yIHRoZQogICBidXMgaW50ZXJmYWNlIHVuaXQgY2xvY2sgYW5kIHRoZSBjYXJkIGludGVyZmFjZSB1bml0IGNsb2NrLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL3RtaW9fbW1jLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvdG1pb19tbWMudHh0CmluZGV4IDBmNjEwZDQuLjEzZGY5YzIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvdG1pb19tbWMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvdG1pb19tbWMudHh0CkBAIC0yMyw2ICsyMyw3IEBACiAJCSJyZW5lc2FzLHNkaGktcjhhNzc5MyIgLSBTREhJIElQIG9uIFI4QTc3OTMgU29DCiAJCSJyZW5lc2FzLHNkaGktcjhhNzc5NCIgLSBTREhJIElQIG9uIFI4QTc3OTQgU29DCiAJCSJyZW5lc2FzLHNkaGktcjhhNzc5NSIgLSBTREhJIElQIG9uIFI4QTc3OTUgU29DCisJCSJyZW5lc2FzLHNkaGktcjhhNzc5NiIgLSBTREhJIElQIG9uIFI4QTc3OTYgU29DCiAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CiAtIHRvc2hpYmEsbW1jLXdycHJvdGVjdC1kaXNhYmxlOiB3cml0ZS1wcm90ZWN0IGRldGVjdGlvbiBpcyB1bmF2YWlsYWJsZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9hcG0teGdlbmUtZW5ldC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2FwbS14Z2VuZS1lbmV0LnR4dAppbmRleCBlNDFiMmQ1Li5mNTkxYWI3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2FwbS14Z2VuZS1lbmV0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2FwbS14Z2VuZS1lbmV0LnR4dApAQCAtNDcsNiArNDcsOSBAQAogCSAgICBWYWxpZCB2YWx1ZXMgYXJlIGJldHdlZW4gMCB0byA3LCB0aGF0IG1hcHMgdG8KIAkgICAgMjczLCA1ODksIDg5OSwgMTIyMiwgMTQ4MCwgMTgwNiwgMjE0NywgMjQ2NCBwcwogCSAgICBEZWZhdWx0IHZhbHVlIGlzIDIsIHdoaWNoIGNvcnJlc3BvbmRzIHRvIDg5OSBwcworLSByeGxvcy1ncGlvczogSW5wdXQgZ3BpbyBmcm9tIFNGUCsgbW9kdWxlIHRvIGluZGljYXRlIGF2YWlsYWJpbGl0eSBvZgorCSAgICAgICBpbmNvbWluZyBzaWduYWwuCisKIAogRXhhbXBsZToKIAltZW5ldGNsazogbWVuZXRjbGsgewpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9icmNtLGJjbTc0NDUtc3dpdGNoLXY0LjAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9icmNtLGJjbTc0NDUtc3dpdGNoLXY0LjAudHh0CmluZGV4IDMwZDQ4NzUuLmZiNDA4OTEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvYnJjbSxiY203NDQ1LXN3aXRjaC12NC4wLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2JyY20sYmNtNzQ0NS1zd2l0Y2gtdjQuMC50eHQKQEAgLTYsOSArNiwxMyBAQAogLSByZWc6IGFkZHJlc3NlcyBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXRzIGZvciB0aGUgZGV2aWNlLCBtdXN0IGJlIDYKICAgcGFpcnMgb2YgcmVnaXN0ZXIgYWRkcmVzc2VzIGFuZCBsZW5ndGhzCiAtIGludGVycnVwdHM6IGludGVycnVwdHMgZm9yIHRoZSBkZXZpY2VzLCBtdXN0IGJlIHR3byBpbnRlcnJ1cHRzCistICNhZGRyZXNzLWNlbGxzOiBtdXN0IGJlIDEsIHNlZSBkc2EvZHNhLnR4dAorLSAjc2l6ZS1jZWxsczogbXVzdCBiZSAwLCBzZWUgZHNhL2RzYS50eHQKKworRGVwcmVjYXRlZCBiaW5kaW5nIHJlcXVpcmVkIHByb3BlcnRpZXM6CisKIC0gZHNhLG1paS1idXM6IHBoYW5kbGUgdG8gdGhlIE1ESU8gYnVzIGNvbnRyb2xsZXIsIHNlZSBkc2EvZHNhLnR4dAogLSBkc2EsZXRoZXJuZXQ6IHBoYW5kbGUgdG8gdGhlIENQVSBuZXR3b3JrIGludGVyZmFjZSBjb250cm9sbGVyLCBzZWUgZHNhL2RzYS50eHQKLS0gI3NpemUtY2VsbHM6IG11c3QgYmUgMAogLSAjYWRkcmVzcy1jZWxsczogbXVzdCBiZSAyLCBzZWUgZHNhL2RzYS50eHQKIAogU3Vibm9kZXM6CkBAIC00OCw2ICs1Miw0NSBAQAogCWV0aGVybmV0X3N3aXRjaEAwIHsKIAkJY29tcGF0aWJsZSA9ICJicmNtLGJjbTc0NDUtc3dpdGNoLXY0LjAiOwogCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCXJlZyA9IDwweDAgMHg0MDAwMAorCQkJMHg0MDAwMCAweDExMAorCQkJMHg0MDM0MCAweDMwCisJCQkweDQwMzgwIDB4MzAKKwkJCTB4NDA0MDAgMHgzNAorCQkJMHg0MDYwMCAweDIwOD47CisJCXJlZy1uYW1lcyA9ICJjb3JlIiwgInJlZyIsIGludHJsMl8wIiwgImludHJsMl8xIiwKKwkJCSAgICAiZmNiLCAiYWNiIjsKKwkJaW50ZXJydXB0cyA9IDwwIDB4MTggMAorCQkJCTAgMHgxOSAwPjsKKwkJYnJjbSxudW0tZ3BoeSA9IDwxPjsKKwkJYnJjbSxudW0tcmdtaWktcG9ydHMgPSA8Mj47CisJCWJyY20sZmNiLXBhdXNlLW92ZXJyaWRlOworCQlicmNtLGFjYi1wYWNrZXRzLWluZmxpZ2h0OworCisJCXBvcnRzIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJCXBvcnRAMCB7CisJCQkJbGFiZWwgPSAiZ3BoeSI7CisJCQkJcmVnID0gPDA+OworCQkJfTsKKwkJfTsKKwl9OworfTsKKworRXhhbXBsZSB1c2luZyB0aGUgb2xkIERTQSBEZXZpY2VUcmVlIGJpbmRpbmc6CisKK3N3aXRjaF90b3BAZjBiMDAwMDAgeworCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisJI3NpemUtY2VsbHMgPSA8MT47CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJcmFuZ2VzID0gPDAgMHhmMGIwMDAwMCAweDQwODA0PjsKKworCWV0aGVybmV0X3N3aXRjaEAwIHsKKwkJY29tcGF0aWJsZSA9ICJicmNtLGJjbTc0NDUtc3dpdGNoLXY0LjAiOworCQkjc2l6ZS1jZWxscyA9IDwwPjsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CiAJCXJlZyA9IDwweDAgMHg0MDAwMAogCQkJMHg0MDAwMCAweDExMApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9kc2EvcWNhOGsudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9kc2EvcWNhOGsudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNjdlZTQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2RzYS9xY2E4ay50eHQKQEAgLTAsMCArMSw4OSBAQAorKiBRdWFsY29tbSBBdGhlcm9zIFFDQTh4eHggc3dpdGNoIGZhbWlseQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCistIGNvbXBhdGlibGU6IHNob3VsZCBiZSAicWNhLHFjYTgzMzciCistICNzaXplLWNlbGxzOiBtdXN0IGJlIDAKKy0gI2FkZHJlc3MtY2VsbHM6IG11c3QgYmUgMQorCitTdWJub2RlczoKKworVGhlIGludGVncmF0ZWQgc3dpdGNoIHN1Ym5vZGUgc2hvdWxkIGJlIHNwZWNpZmllZCBhY2NvcmRpbmcgdG8gdGhlIGJpbmRpbmcKK2Rlc2NyaWJlZCBpbiBkc2EvZHNhLnR4dC4gQXMgdGhlIFFDQThLIHN3aXRjaGVzIGRvIG5vdCBoYXZlIGEgTjpOIG1hcHBpbmcgb2YKK3BvcnQgYW5kIFBIWSBpZCwgZWFjaCBzdWJub2RlIGRlc2NyaWJpbmcgYSBwb3J0IG5lZWRzIHRvIGhhdmUgYSB2YWxpZCBwaGFuZGxlCityZWZlcmVuY2luZyB0aGUgaW50ZXJuYWwgUEhZIGNvbm5lY3RlZCB0byBpdC4gVGhlIENQVSBwb3J0IG9mIHRoaXMgc3dpdGNoIGlzCithbHdheXMgcG9ydCAwLgorCitFeGFtcGxlOgorCisKKwkmbWRpbzAgeworCQlwaHlfcG9ydDE6IHBoeUAwIHsKKwkJCXJlZyA9IDwwPjsKKwkJfTsKKworCQlwaHlfcG9ydDI6IHBoeUAxIHsKKwkJCXJlZyA9IDwxPjsKKwkJfTsKKworCQlwaHlfcG9ydDM6IHBoeUAyIHsKKwkJCXJlZyA9IDwyPjsKKwkJfTsKKworCQlwaHlfcG9ydDQ6IHBoeUAzIHsKKwkJCXJlZyA9IDwzPjsKKwkJfTsKKworCQlwaHlfcG9ydDU6IHBoeUA0IHsKKwkJCXJlZyA9IDw0PjsKKwkJfTsKKworCQlzd2l0Y2gwQDAgeworCQkJY29tcGF0aWJsZSA9ICJxY2EscWNhODMzNyI7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCisJCQlyZWcgPSA8MD47CisKKwkJCXBvcnRzIHsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQlwb3J0QDAgeworCQkJCQlyZWcgPSA8MD47CisJCQkJCWxhYmVsID0gImNwdSI7CisJCQkJCWV0aGVybmV0ID0gPCZnbWFjMT47CisJCQkJCXBoeS1tb2RlID0gInJnbWlpIjsKKwkJCQl9OworCisJCQkJcG9ydEAxIHsKKwkJCQkJcmVnID0gPDE+OworCQkJCQlsYWJlbCA9ICJsYW4xIjsKKwkJCQkJcGh5LWhhbmRsZSA9IDwmcGh5X3BvcnQxPjsKKwkJCQl9OworCisJCQkJcG9ydEAyIHsKKwkJCQkJcmVnID0gPDI+OworCQkJCQlsYWJlbCA9ICJsYW4yIjsKKwkJCQkJcGh5LWhhbmRsZSA9IDwmcGh5X3BvcnQyPjsKKwkJCQl9OworCisJCQkJcG9ydEAzIHsKKwkJCQkJcmVnID0gPDM+OworCQkJCQlsYWJlbCA9ICJsYW4zIjsKKwkJCQkJcGh5LWhhbmRsZSA9IDwmcGh5X3BvcnQzPjsKKwkJCQl9OworCisJCQkJcG9ydEA0IHsKKwkJCQkJcmVnID0gPDQ+OworCQkJCQlsYWJlbCA9ICJsYW40IjsKKwkJCQkJcGh5LWhhbmRsZSA9IDwmcGh5X3BvcnQ0PjsKKwkJCQl9OworCisJCQkJcG9ydEA1IHsKKwkJCQkJcmVnID0gPDU+OworCQkJCQlsYWJlbCA9ICJ3YW4iOworCQkJCQlwaHktaGFuZGxlID0gPCZwaHlfcG9ydDU+OworCQkJCX07CisJCQl9OworCQl9OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2V0aGVybmV0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvZXRoZXJuZXQudHh0CmluZGV4IDVkODhmMzcuLmUxZDc2ODEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvZXRoZXJuZXQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvZXRoZXJuZXQudHh0CkBAIC0xMSw4ICsxMSw4IEBACiAgIHRoZSBtYXhpbXVtIGZyYW1lIHNpemUgKHRoZXJlJ3MgY29udHJhZGljdGlvbiBpbiBlUEFQUikuCiAtIHBoeS1tb2RlOiBzdHJpbmcsIG9wZXJhdGlvbiBtb2RlIG9mIHRoZSBQSFkgaW50ZXJmYWNlOyBzdXBwb3J0ZWQgdmFsdWVzIGFyZQogICAibWlpIiwgImdtaWkiLCAic2dtaWkiLCAicXNnbWlpIiwgInRiaSIsICJyZXYtbWlpIiwgInJtaWkiLCAicmdtaWkiLCAicmdtaWktaWQiLAotICAicmdtaWktcnhpZCIsICJyZ21paS10eGlkIiwgInJ0YmkiLCAic21paSIsICJ4Z21paSI7IHRoaXMgaXMgbm93IGEgZGUtZmFjdG8KLSAgc3RhbmRhcmQgcHJvcGVydHk7CisgICJyZ21paS1yeGlkIiwgInJnbWlpLXR4aWQiLCAicnRiaSIsICJzbWlpIiwgInhnbWlpIiwgInRyZ21paSI7IHRoaXMgaXMgbm93IGEKKyAgZGUtZmFjdG8gc3RhbmRhcmQgcHJvcGVydHk7CiAtIHBoeS1jb25uZWN0aW9uLXR5cGU6IHRoZSBzYW1lIGFzICJwaHktbW9kZSIgcHJvcGVydHkgYnV0IGRlc2NyaWJlZCBpbiBlUEFQUjsKIC0gcGh5LWhhbmRsZTogcGhhbmRsZSwgc3BlY2lmaWVzIGEgcmVmZXJlbmNlIHRvIGEgbm9kZSByZXByZXNlbnRpbmcgYSBQSFkKICAgZGV2aWNlOyB0aGlzIHByb3BlcnR5IGlzIGRlc2NyaWJlZCBpbiBlUEFQUiBhbmQgc28gcHJlZmVycmVkOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9tYWNiLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvbWFjYi50eHQKaW5kZXggYjVhNDJkZi4uMTUwNmU5NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9tYWNiLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L21hY2IudHh0CkBAIC0yMSw2ICsyMSw3IEBACiAtIGNsb2NrLW5hbWVzOiBUdXBsZSBsaXN0aW5nIGlucHV0IGNsb2NrIG5hbWVzLgogCVJlcXVpcmVkIGVsZW1lbnRzOiAncGNsaycsICdoY2xrJwogCU9wdGlvbmFsIGVsZW1lbnRzOiAndHhfY2xrJworCU9wdGlvbmFsIGVsZW1lbnRzOiAncnhfY2xrJyBhcHBsaWVzIHRvIGNkbnMsenlucW1wLWdlbQogLSBjbG9ja3M6IFBoYW5kbGVzIHRvIGlucHV0IGNsb2Nrcy4KIAogT3B0aW9uYWwgcHJvcGVydGllcyBmb3IgUEhZIGNoaWxkIG5vZGU6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L21lZGlhdGVrLW5ldC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L21lZGlhdGVrLW5ldC50eHQKaW5kZXggMzJlYWFjYS4uZjA5NTI1NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9tZWRpYXRlay1uZXQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvbWVkaWF0ZWstbmV0LnR4dApAQCAtMjQsMTQgKzI0LDE3IEBACiBPcHRpb25hbCBwcm9wZXJ0aWVzOgogLSBpbnRlcnJ1cHQtcGFyZW50OiBTaG91bGQgYmUgdGhlIHBoYW5kbGUgZm9yIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlcgogICB0aGF0IHNlcnZpY2VzIGludGVycnVwdHMgZm9yIHRoaXMgZGV2aWNlCi0KKy0gbWVkaWF0ZWssaHdscm86IHRoZSBjYXBhYmlsaXR5IGlmIHRoZSBoYXJkd2FyZSBzdXBwb3J0cyBMUk8gZnVuY3Rpb25zCiAKICogRXRoZXJuZXQgTUFDIG5vZGUKIAogUmVxdWlyZWQgcHJvcGVydGllczoKIC0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJtZWRpYXRlayxldGgtbWFjIgogLSByZWc6IFRoZSBudW1iZXIgb2YgdGhlIE1BQwotLSBwaHktaGFuZGxlOiBzZWUgZXRoZXJuZXQudHh0IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LgorLSBwaHktaGFuZGxlOiBzZWUgZXRoZXJuZXQudHh0IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFuZAorCXRoZSBwaHktbW9kZSAidHJnbWlpIiByZXF1aXJlZCBiZWluZyBwcm92aWRlZCB3aGVuIHJlZworCWlzIGVxdWFsIHRvIDAgYW5kIHRoZSBNQUMgdXNlcyBmaXhlZC1saW5rIHRvIGNvbm5lY3QKKwl3aXRoIGludGVybmFsIHN3aXRjaCBzdWNoIGFzIE1UNzUzMC4KIAogRXhhbXBsZToKIApAQCAtNTEsNiArNTQsNyBAQAogCXJlc2V0LW5hbWVzID0gImV0aCI7CiAJbWVkaWF0ZWssZXRoc3lzID0gPCZldGhzeXM+OwogCW1lZGlhdGVrLHBjdGwgPSA8JnN5c2NmZ19wY3RsX2E+OworCW1lZGlhdGVrLGh3bHJvOwogCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCSNzaXplLWNlbGxzID0gPDA+OwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L21zY2MtcGh5LXZzYzg1MzEudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9tc2NjLXBoeS12c2M4NTMxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWM3ZWIwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9tc2NjLXBoeS12c2M4NTMxLnR4dApAQCAtMCwwICsxLDU4IEBACisqIE1pY3Jvc2VtaSAtIHZzYzg1MzEgR2lnYSBiaXQgZXRoZXJuZXQgcGh5CisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUJOiBTaG91bGQgY29udGFpbiBwaHkgaWQgYXMgImV0aGVybmV0LXBoeS1pZEFBQUEuQkJCQiIKKwkJICBUaGUgUEhZIGRldmljZSB1c2VzIHRoZSBiaW5kaW5nIGRlc2NyaWJlZCBpbgorCQkgIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvcGh5LnR4dAorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSB2c2M4NTMxLHZkZG1hYwk6IFRoZSB2ZGRtYWMgaW4gbVYuCistIHZzYzg1MzEsZWRnZS1zbG93ZG93bgk6ICUgdGhlIGVkZ2Ugc2hvdWxkIGJlIHNsb3dlZCBkb3duIHJlbGF0aXZlIHRvCisJCQkgIHRoZSBmYXN0ZXN0IHBvc3NpYmxlIGVkZ2UgdGltZS4gTmF0aXZlIHNpZ24KKwkJCSAgbmVlZCBub3QgZW50ZXIuCisJCQkgIEVkZ2UgcmF0ZSBzZXRzIHRoZSBkcml2ZSBzdHJlbmd0aCBvZiB0aGUgTUFDCisJCQkgIGludGVyZmFjZSBvdXRwdXQgc2lnbmFscy4gIENoYW5naW5nIHRoZSBkcml2ZQorCQkJICBzdHJlbmd0aCB3aWxsIGFmZmVjdCB0aGUgZWRnZSByYXRlIG9mIHRoZSBvdXRwdXQKKwkJCSAgc2lnbmFsLiAgVGhlIGdvYWwgb2YgdGhpcyBzZXR0aW5nIGlzIHRvIGhlbHAKKwkJCSAgcmVkdWNlIGVsZWN0cmljYWwgZW1pc3Npb24gKEVNSSkgYnkgYmVpbmcgYWJsZQorCQkJICB0byByZXByb2dyYW0gZHJpdmUgc3RyZW5ndGggYW5kIGluIGVmZmVjdCBzbG93CisJCQkgIGRvd24gdGhlIGVkZ2UgcmF0ZSBpZiBkZXNpcmVkLiAgVGFibGUgMSBzaG93cyB0aGUKKwkJCSAgaW1wYWN0IHRvIHRoZSBlZGdlIHJhdGUgcGVyIFZERE1BQyBzdXBwbHkgZm9yIGVhY2gKKwkJCSAgZHJpdmUgc3RyZW5ndGggc2V0dGluZy4KKwkJCSAgUmVmOiBUYWJsZToxIC0gRWRnZSByYXRlIGNoYW5nZSBiZWxvdy4KKworTm90ZTogc2VlIGR0LWJpbmRpbmdzL25ldC9tc2NjLXBoeS12c2M4NTMxLmggZm9yIGFwcGxpY2FibGUgdmFsdWVzCisKK1RhYmxlOiAxIC0gRWRnZSByYXRlIGNoYW5nZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgCQlFZGdlIFJhdGUgQ2hhbmdlIChWRERNQUMpCQkJfAorfAkJCQkJCQkJfAorfCAzMzAwIG1WCTI1MDAgbVYJCTE4MDAgbVYJCTE1MDAgbVYJCXwKK3wtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IERlZmF1bHQJRGVhZnVsdAkJRGVmYXVsdAkJRGVmYXVsdAkJfAorfCAoRmFzdGVzdCkJCQkocmVjb21tZW5kZWQpCShyZWNvbW1lbmRlZCkJfAorfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgLTIlCQktMyUJCS01JQkJLTYlCQl8Cit8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCAtNCUJCS02JQkJLTklCQktMTQlCQl8Cit8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCAtNyUJCS0xMCUJCS0xNiUJCS0yMSUJCXwKK3wocmVjb21tZW5kZWQpCShyZWNvbW1lbmRlZCkJCQkJCXwKK3wtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IC0xMCUJCS0xNCUJCS0yMyUJCS0yOSUJCXwKK3wtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IC0xNyUJCS0yMyUJCS0zNSUJCS00MiUJCXwKK3wtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IC0yOSUJCS0zNyUJCS01MiUJCS01OCUJCXwKK3wtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IC01MyUJCS02MyUJCS03NiUJCS03NyUJCXwKK3wgKHNsb3dlc3QpCQkJCQkJCXwKK3wtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisKK0V4YW1wbGU6CisKKyAgICAgICAgdnNjODUzMV8wOiBldGhlcm5ldC1waHlAMCB7CisgICAgICAgICAgICAgICAgY29tcGF0aWJsZSA9ICJldGhlcm5ldC1waHktaWQwMDA3LjA1NzAiOworICAgICAgICAgICAgICAgIHZzYzg1MzEsdmRkbWFjCQk9IDwzMzAwPjsKKyAgICAgICAgICAgICAgICB2c2M4NTMxLGVkZ2Utc2xvd2Rvd24JPSA8MjE+OworICAgICAgICB9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9xY29tLWVtYWMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9xY29tLWVtYWMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NmU2YzcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3Fjb20tZW1hYy50eHQKQEAgLTAsMCArMSwxMTEgQEAKK1F1YWxjb21tIFRlY2hub2xvZ2llcyBFTUFDIEdpZ2FiaXQgRXRoZXJuZXQgQ29udHJvbGxlcgorCitUaGlzIG5ldHdvcmsgY29udHJvbGxlciBjb25zaXN0cyBvZiB0d28gZGV2aWNlczogYSBNQUMgYW5kIGFuIFNHTUlJCitpbnRlcm5hbCBQSFkuICBFYWNoIGRldmljZSBpcyByZXByZXNlbnRlZCBieSBhIGRldmljZSB0cmVlIG5vZGUuICBBIHBoYW5kbGUKK2Nvbm5lY3RzIHRoZSBNQUMgbm9kZSB0byBpdHMgY29ycmVzcG9uZGluZyBpbnRlcm5hbCBwaHkgbm9kZS4gIEFub3RoZXIKK3BoYW5kbGUgcG9pbnRzIHRvIHRoZSBleHRlcm5hbCBQSFkgbm9kZS4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKworTUFDIG5vZGU6CistIGNvbXBhdGlibGUgOiBTaG91bGQgYmUgInFjb20sZnNtOTkwMC1lbWFjIi4KKy0gcmVnIDogT2Zmc2V0IGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHJlZ2lvbnMgZm9yIHRoZSBkZXZpY2UKKy0gaW50ZXJydXB0cyA6IEludGVycnVwdCBudW1iZXIgdXNlZCBieSB0aGlzIGNvbnRyb2xsZXIKKy0gbWFjLWFkZHJlc3MgOiBUaGUgNi1ieXRlIE1BQyBhZGRyZXNzLiBJZiBwcmVzZW50LCBpdCBpcyB0aGUgZGVmYXVsdAorCU1BQyBhZGRyZXNzLgorLSBpbnRlcm5hbC1waHkgOiBwaGFuZGxlIHRvIHRoZSBpbnRlcm5hbCBQSFkgbm9kZQorLSBwaHktaGFuZGxlIDogcGhhbmRsZSB0aGUgdGhlIGV4dGVybmFsIFBIWSBub2RlCisKK0ludGVybmFsIFBIWSBub2RlOgorLSBjb21wYXRpYmxlIDogU2hvdWxkIGJlICJxY29tLGZzbTk5MDAtZW1hYy1zZ21paSIgb3IgInFjb20scWRmMjQzMi1lbWFjLXNnbWlpIi4KKy0gcmVnIDogT2Zmc2V0IGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHJlZ2lvbihzKSBmb3IgdGhlIGRldmljZQorLSBpbnRlcnJ1cHRzIDogSW50ZXJydXB0IG51bWJlciB1c2VkIGJ5IHRoaXMgY29udHJvbGxlcgorCitUaGUgZXh0ZXJuYWwgcGh5IGNoaWxkIG5vZGU6CistIHJlZyA6IFRoZSBwaHkgYWRkcmVzcworCitFeGFtcGxlOgorCitGU005OTAwOgorCitzb2MgeworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCisJZW1hYzA6IGV0aGVybmV0QGZlYjIwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLGZzbTk5MDAtZW1hYyI7CisJCXJlZyA9IDwweGZlYjIwMDAwIDB4MTAwMDA+LAorCQkgICAgICA8MHhmZWIzNjAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDc2PjsKKworCQljbG9ja3MgPSA8JmdjYyAwPiwgPCZnY2MgMT4sIDwmZ2NjIDM+LCA8JmdjYyA0PiwgPCZnY2MgNT4sCisJCQk8JmdjYyA2PiwgPCZnY2MgNz47CisJCWNsb2NrLW5hbWVzID0gImF4aV9jbGsiLCAiY2ZnX2FoYl9jbGsiLCAiaGlnaF9zcGVlZF9jbGsiLAorCQkJIm1kaW9fY2xrIiwgInR4X2NsayIsICJyeF9jbGsiLCAic3lzX2NsayI7CisKKwkJaW50ZXJuYWwtcGh5ID0gPCZlbWFjX3NnbWlpPjsKKworCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKKworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKKwkJCXJlZyA9IDwwPjsKKwkJfTsKKworCQlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOworCQlwaW5jdHJsLTAgPSA8Jm1kaW9fcGluc19hPjsKKwl9OworCisJZW1hY19zZ21paTogZXRoZXJuZXRAZmViMzgwMDAgeworCQljb21wYXRpYmxlID0gInFjb20sZnNtOTkwMC1lbWFjLXNnbWlpIjsKKwkJcmVnID0gPDB4ZmViMzgwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0cyA9IDw4MD47CisJfTsKKworCXRsbW06IHBpbmN0cmxAZmQ1MTAwMDAgeworCQljb21wYXRpYmxlID0gInFjb20sZnNtOTkwMC1waW5jdHJsIjsKKworCQltZGlvX3BpbnNfYTogbWRpbyB7CisJCQlzdGF0ZSB7CisJCQkJcGlucyA9ICJncGlvMTIzIiwgImdwaW8xMjQiOworCQkJCWZ1bmN0aW9uID0gIm1kaW8iOworCQkJfTsKKwkJfTsKKwl9OworCisKK1FERjI0MzI6CisKK3NvYyB7CisJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJI3NpemUtY2VsbHMgPSA8Mj47CisKKwllbWFjMDogZXRoZXJuZXRAMzg4MDAwMDAgeworCQljb21wYXRpYmxlID0gInFjb20sZnNtOTkwMC1lbWFjIjsKKwkJcmVnID0gPDB4MCAweDM4ODAwMDAwIDB4MCAweDEwMDAwPiwKKwkJICAgICAgPDB4MCAweDM4ODE2MDAwIDB4MCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDAgMjU2IDQ+OworCisJCWNsb2NrcyA9IDwmZ2NjIDA+LCA8JmdjYyAxPiwgPCZnY2MgMz4sIDwmZ2NjIDQ+LCA8JmdjYyA1PiwKKwkJCSA8JmdjYyA2PiwgPCZnY2MgNz47CisJCWNsb2NrLW5hbWVzID0gImF4aV9jbGsiLCAiY2ZnX2FoYl9jbGsiLCAiaGlnaF9zcGVlZF9jbGsiLAorCQkJIm1kaW9fY2xrIiwgInR4X2NsayIsICJyeF9jbGsiLCAic3lzX2NsayI7CisKKwkJaW50ZXJuYWwtcGh5ID0gPCZlbWFjX3NnbWlpPjsKKworCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKKworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisJCXBoeTA6IGV0aGVybmV0LXBoeUA0IHsKKwkJCXJlZyA9IDw0PjsKKwkJfTsKKwl9OworCisJZW1hY19zZ21paTogZXRoZXJuZXRANDEwNDAwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHFkZjI0MzItZW1hYy1zZ21paSI7CisJCXJlZyA9IDwweDAgMHgwMDQxMDQwMCAweDAgMHhjMDA+LCAvKiBCYXNlIGFkZHJlc3MgKi8KKwkJICAgICAgPDB4MCAweDAwNDEwMDAwIDB4MCAweDQwMD47IC8qIFBlci1sYW5lIGRpZ2l0YWwgKi8KKwkJaW50ZXJydXB0cyA9IDwwIDI1NCAxPjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9yb2NrY2hpcC1kd21hYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3JvY2tjaGlwLWR3bWFjLnR4dAppbmRleCBjY2NkOTQ1Li45NTM4M2M1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3JvY2tjaGlwLWR3bWFjLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3JvY2tjaGlwLWR3bWFjLnR4dApAQCAtMyw4ICszLDEyIEBACiBUaGUgZGV2aWNlIG5vZGUgaGFzIGZvbGxvd2luZyBwcm9wZXJ0aWVzLgogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgotIC0gY29tcGF0aWJsZTogQ2FuIGJlIG9uZSBvZiAicm9ja2NoaXAscmszMjI4LWdtYWMiLCAicm9ja2NoaXAscmszMjg4LWdtYWMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicm9ja2NoaXAscmszMzY4LWdtYWMiCisgLSBjb21wYXRpYmxlOiBzaG91bGQgYmUgInJvY2tjaGlwLDxuYW1lPi1nYW1jIgorICAgInJvY2tjaGlwLHJrMzIyOC1nbWFjIjogZm91bmQgb24gUkszMjJ4IFNvQ3MKKyAgICJyb2NrY2hpcCxyazMyODgtZ21hYyI6IGZvdW5kIG9uIFJLMzI4OCBTb0NzCisgICAicm9ja2NoaXAscmszMzY2LWdtYWMiOiBmb3VuZCBvbiBSSzMzNjYgU29DcworICAgInJvY2tjaGlwLHJrMzM2OC1nbWFjIjogZm91bmQgb24gUkszMzY4IFNvQ3MKKyAgICJyb2NrY2hpcCxyazMzOTktZ21hYyI6IGZvdW5kIG9uIFJLMzM5OSBTb0NzCiAgLSByZWc6IGFkZHJlc3NlcyBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXRzIGZvciB0aGUgZGV2aWNlLgogIC0gaW50ZXJydXB0czogU2hvdWxkIGNvbnRhaW4gdGhlIEdNQUMgaW50ZXJydXB0cy4KICAtIGludGVycnVwdC1uYW1lczogU2hvdWxkIGNvbnRhaW4gdGhlIGludGVycnVwdCBuYW1lcyAibWFjaXJxIi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvc2hfZXRoLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvc2hfZXRoLnR4dAppbmRleCAyZjZlYzg1Li4wMTE1Yzg1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3NoX2V0aC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9zaF9ldGgudHh0CkBAIC01LDYgKzUsOCBAQAogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgogLSBjb21wYXRpYmxlOiAicmVuZXNhcyxnZXRoZXItcjhhNzc0MCIgaWYgdGhlIGRldmljZSBpcyBhIHBhcnQgb2YgUjhBNzc0MCBTb0MuCisJICAgICAgInJlbmVzYXMsZXRoZXItcjhhNzc0MyIgIGlmIHRoZSBkZXZpY2UgaXMgYSBwYXJ0IG9mIFI4QTc3NDMgU29DLgorCSAgICAgICJyZW5lc2FzLGV0aGVyLXI4YTc3NDUiICBpZiB0aGUgZGV2aWNlIGlzIGEgcGFydCBvZiBSOEE3NzQ1IFNvQy4KIAkgICAgICAicmVuZXNhcyxldGhlci1yOGE3Nzc4IiAgaWYgdGhlIGRldmljZSBpcyBhIHBhcnQgb2YgUjhBNzc3OCBTb0MuCiAJICAgICAgInJlbmVzYXMsZXRoZXItcjhhNzc3OSIgIGlmIHRoZSBkZXZpY2UgaXMgYSBwYXJ0IG9mIFI4QTc3NzkgU29DLgogCSAgICAgICJyZW5lc2FzLGV0aGVyLXI4YTc3OTAiICBpZiB0aGUgZGV2aWNlIGlzIGEgcGFydCBvZiBSOEE3NzkwIFNvQy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvc21zYzkxMXgudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9zbXNjOTExeC50eHQKaW5kZXggM2ZlZDNjMS4uMTZjM2E5NTAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvc21zYzkxMXgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvc21zYzkxMXgudHh0CkBAIC0zLDkgKzMsMTEgQEAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAtIGNvbXBhdGlibGUgOiBTaG91bGQgYmUgInNtc2MsbGFuPG1vZGVsPiIsICJzbXNjLGxhbjkxMTUiCiAtIHJlZyA6IEFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgaW8gc3BhY2UgZm9yIFNNU0MgTEFOCi0tIGludGVycnVwdHMgOiBTaG91bGQgY29udGFpbiBTTVNDIExBTiBpbnRlcnJ1cHQgbGluZQotLSBpbnRlcnJ1cHQtcGFyZW50IDogU2hvdWxkIGJlIHRoZSBwaGFuZGxlIGZvciB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIKLSAgdGhhdCBzZXJ2aWNlcyBpbnRlcnJ1cHRzIGZvciB0aGlzIGRldmljZQorLSBpbnRlcnJ1cHRzIDogb25lIG9yIHR3byBpbnRlcnJ1cHQgc3BlY2lmaWVycworICAtIFRoZSBmaXJzdCBpbnRlcnJ1cHQgaXMgdGhlIFNNU0MgTEFOIGludGVycnVwdCBsaW5lCisgIC0gVGhlIHNlY29uZCBpbnRlcnJ1cHQgKGlmIHByZXNlbnQpIGlzIHRoZSBQTUUgKHBvd2VyCisgICAgbWFuYWdlbWVudCBldmVudCkgaW50ZXJydXB0IHRoYXQgaXMgYWJsZSB0byB3YWtlIHVwIHRoZSBob3N0CisgICAgIHN5c3RlbSB3aXRoIGEgNTBtcyBwdWxzZSBvbiBuZXR3b3JrIGFjdGl2aXR5CiAtIHBoeS1tb2RlIDogU2VlIGV0aGVybmV0LnR4dCBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeQogCiBPcHRpb25hbCBwcm9wZXJ0aWVzOgpAQCAtMjEsNiArMjMsMTAgQEAKICAgZXh0ZXJuYWwgUEhZCiAtIHNtc2Msc2F2ZS1tYWMtYWRkcmVzcyA6IEluZGljYXRlcyB0aGF0IG1hYyBhZGRyZXNzIG5lZWRzIHRvIGJlIHNhdmVkCiAgIGJlZm9yZSByZXNldHRpbmcgdGhlIGNvbnRyb2xsZXIKKy0gcmVzZXQtZ3Bpb3MgOiBhIEdQSU8gbGluZSBjb25uZWN0ZWQgdG8gdGhlIFJFU0VUIChhY3RpdmUgbG93KSBzaWduYWwKKyAgb2YgdGhlIGRldmljZS4gT24gbWFueSBzeXN0ZW1zIHRoaXMgaXMgd2lyZWQgaGlnaCBzbyB0aGUgZGV2aWNlIGdvZXMKKyAgb3V0IG9mIHJlc2V0IGF0IHBvd2VyLW9uLCBidXQgaWYgaXQgaXMgdW5kZXIgcHJvZ3JhbSBjb250cm9sLCB0aGlzCisgIG9wdGlvbmFsIEdQSU8gY2FuIHdha2UgdXAgaW4gcmVzcG9uc2UgdG8gaXQuCiAKIEV4YW1wbGVzOgogCkBAIC0yOSw3ICszNSw4IEBACiAJcmVnID0gPDB4ZjQwMDAwMDAgMHgyMDAwMDAwPjsKIAlwaHktbW9kZSA9ICJtaWkiOwogCWludGVycnVwdC1wYXJlbnQgPSA8JmdwaW8xPjsKLQlpbnRlcnJ1cHRzID0gPDMxPjsKKwlpbnRlcnJ1cHRzID0gPDMxPiwgPDMyPjsKKwlyZXNldC1ncGlvcyA9IDwmZ3BpbzEgMzAgR1BJT19BQ1RJVkVfTE9XPjsKIAlyZWctaW8td2lkdGggPSA8ND47CiAJc21zYyxpcnEtcHVzaC1wdWxsOwogfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvc25wcyxkd2MtcW9zLWV0aGVybmV0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvc25wcyxkd2MtcW9zLWV0aGVybmV0LnR4dAppbmRleCA1MWY4ZDJlLi5kOTNmNzFjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3NucHMsZHdjLXFvcy1ldGhlcm5ldC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9zbnBzLGR3Yy1xb3MtZXRoZXJuZXQudHh0CkBAIC0xLDIxICsxLDExMSBAQAogKiBTeW5vcHN5cyBEV0MgRXRoZXJuZXQgUW9TIElQIHZlcnNpb24gNC4xMCBkcml2ZXIgKEdNQUMpCiAKK1RoaXMgYmluZGluZyBzdXBwb3J0cyB0aGUgU3lub3BzeXMgRGVzaWdud2FyZSBFdGhlcm5ldCBRb1MgKFF1YWxpdHkgT2YgU2VydmljZSkKK0lQIGJsb2NrLiBUaGUgSVAgc3VwcG9ydHMgbXVsdGlwbGUgb3B0aW9ucyBmb3IgYnVzIHR5cGUsIGNsb2NraW5nIGFuZCByZXNldAorc3RydWN0dXJlLCBhbmQgZmVhdHVyZSBsaXN0LiBDb25zZXF1ZW50bHksIGEgbnVtYmVyIG9mIHByb3BlcnRpZXMgYW5kIGxpc3QKK2VudHJpZXMgaW4gcHJvcGVydGllcyBhcmUgbWFya2VkIGFzIG9wdGlvbmFsLCBvciBvbmx5IHJlcXVpcmVkIGluIHNwZWNpZmljIEhXCitjb25maWd1cmF0aW9ucy4KIAogUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJzbnBzLGR3Yy1xb3MtZXRoZXJuZXQtNC4xMCIKKy0gY29tcGF0aWJsZTogT25lIG9mOgorICAtICJheGlzLGFydHBlYzYtZXFvcyIsICJzbnBzLGR3Yy1xb3MtZXRoZXJuZXQtNC4xMCIKKyAgICBSZXByZXNlbnRzIHRoZSBJUCBjb3JlIHdoZW4gaW50ZWdyYXRlZCBpbnRvIHRoZSBBeGlzIEFSVFBFQy02IFNvQy4KKyAgLSAibnZpZGlhLHRlZ3JhMTg2LWVxb3MiLCAic25wcyxkd2MtcW9zLWV0aGVybmV0LTQuMTAiCisgICAgUmVwcmVzZW50cyB0aGUgSVAgY29yZSB3aGVuIGludGVncmF0ZWQgaW50byB0aGUgTlZJRElBIFRlZ3JhMTg2IFNvQy4KKyAgLSAic25wcyxkd2MtcW9zLWV0aGVybmV0LTQuMTAiCisgICAgVGhpcyBjb21iaW5hdGlvbiBpcyBkZXByZWNhdGVkLiBJdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBlcXVpdmFsZW50IHRvCisgICAgImF4aXMsYXJ0cGVjNi1lcW9zIiwgInNucHMsZHdjLXFvcy1ldGhlcm5ldC00LjEwIi4gSXQgaXMgc3VwcG9ydGVkIHRvIGJlCisgICAgY29tcGF0aWJsZSB3aXRoIGVhcmxpZXIgcmV2aXNpb25zIG9mIHRoaXMgYmluZGluZy4KIC0gcmVnOiBBZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZQotLSBjbG9ja3M6IFBoYW5kbGVzIHRvIHRoZSByZWZlcmVuY2UgY2xvY2sgYW5kIHRoZSBidXMgY2xvY2sKLS0gY2xvY2stbmFtZXM6IFNob3VsZCBiZSAicGh5X3JlZl9jbGsiIGZvciB0aGUgcmVmZXJlbmNlIGNsb2NrIGFuZCAiYXBiX3BjbGsiCi0gIGZvciB0aGUgYnVzIGNsb2NrLgorLSBjbG9ja3M6IFBoYW5kbGUgYW5kIGNsb2NrIHNwZWNpZmllcnMgZm9yIGVhY2ggZW50cnkgaW4gY2xvY2stbmFtZXMsIGluIHRoZQorICBzYW1lIG9yZGVyLiBTZWUgLi4vY2xvY2svY2xvY2stYmluZGluZ3MudHh0LgorLSBjbG9jay1uYW1lczogTWF5IGNvbnRhaW4gYW55L2FsbCBvZiB0aGUgZm9sbG93aW5nIGRlcGVuZGluZyBvbiB0aGUgSVAKKyAgY29uZmlndXJhdGlvbiwgaW4gYW55IG9yZGVyOgorICAtICJ0eCIKKyAgICBUaGUgRVFPUyB0cmFuc21pdCBwYXRoIGNsb2NrLiBUaGUgSFcgc2lnbmFsIG5hbWUgaXMgY2xrX3R4X2kuCisgICAgSW4gc29tZSBjb25maWd1cmF0aW9ucyAoZS5nLiBHTUlJL1JHTUlJKSwgdGhpcyBjbG9jayBhbHNvIGRyaXZlcyB0aGUgUEhZIFRYCisgICAgcGF0aC4gSW4gb3RoZXIgY29uZmlndXJhdGlvbnMsIG90aGVyIGNsb2NrcyAoc3VjaCBhcyB0eF8xMjUsIHJtaWkpIG1heQorICAgIGRyaXZlIHRoZSBQSFkgVFggcGF0aC4KKyAgLSAicngiCisgICAgVGhlIEVRT1MgcmVjZWl2ZSBwYXRoIGNsb2NrLiBUaGUgSFcgc2lnbmFsIG5hbWUgaXMgY2xrX3J4X2kuCisgICAgSW4gc29tZSBjb25maWd1cmF0aW9ucyAoZS5nLiBHTUlJL1JHTUlJKSwgdGhpcyBjbG9jayBpcyBkZXJpdmVkIGZyb20gdGhlCisgICAgUEhZJ3MgUlggY2xvY2sgb3V0cHV0LiBJbiBvdGhlciBjb25maWd1cmF0aW9ucywgb3RoZXIgY2xvY2tzIChzdWNoIGFzCisgICAgcnhfMTI1LCBybWlpKSBtYXkgZHJpdmUgdGhlIEVRT1MgUlggcGF0aC4KKyAgICBJbiBjYXNlcyB3aGVyZSB0aGUgUEhZIGNsb2NrIGlzIGRpcmVjdGx5IGZlZCBpbnRvIHRoZSBFUU9TIHJlY2VpdmUgcGF0aAorICAgIHdpdGhvdXQgaW50ZXJ2ZW5pbmcgbG9naWMsIHRoZSBEVCBuZWVkIG5vdCByZXByZXNlbnQgdGhpcyBjbG9jaywgc2luY2UgaXQKKyAgICBpcyBhc3N1bWVkIHRvIGJlIGZ1bGx5IHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSBQSFkgZGV2aWNlL2RyaXZlci4gSW4KKyAgICBjYXNlcyB3aGVyZSBTb0MgaW50ZWdyYXRpb24gYWRkcyBhZGRpdGlvbmFsIGxvZ2ljIHRvIHRoaXMgcGF0aCwgc3VjaCBhcyBhCisgICAgU1ctY29udHJvbGxlZCBjbG9jayBnYXRlLCB0aGlzIGNsb2NrIHNob3VsZCBiZSByZXByZXNlbnRlZCBpbiBEVC4KKyAgLSAic2xhdmVfYnVzIgorICAgIFRoZSBDUFUvc2xhdmUtYnVzIChDU1IpIGludGVyZmFjZSBjbG9jay4gVGhpcyBhcHBsaWVzIHRvIGFueSBidXMgdHlwZTsKKyAgICBBUEIsIEFIQiwgQVhJLCBldGMuIFRoZSBIVyBzaWduYWwgbmFtZSBpcyBoY2xrX2kgKEFIQikgb3IgY2xrX2Nzcl9pIChvdGhlcgorICAgIGJ1c2VzKS4KKyAgLSAibWFzdGVyX2J1cyIKKyAgICBUaGUgbWFzdGVyIGJ1cyBpbnRlcmZhY2UgY2xvY2suIE9ubHkgcmVxdWlyZWQgaW4gY29uZmlndXJhdGlvbnMgdGhhdCB1c2UgYQorICAgIHNlcGFyYXRlIGNsb2NrIGZvciB0aGUgbWFzdGVyIGFuZCBzbGF2ZSBidXMgaW50ZXJmYWNlcy4gVGhlIEhXIHNpZ25hbCBuYW1lCisgICAgaXMgaGNsa19pIChBSEIpIG9yIGFjbGtfaSAoQVhJKS4KKyAgLSAicHRwX3JlZiIKKyAgICBUaGUgUFRQIHJlZmVyZW5jZSBjbG9jay4gVGhlIEhXIHNpZ25hbCBuYW1lIGlzIGNsa19wdHBfcmVmX2kuCisgIC0gInBoeV9yZWZfY2xrIgorICAgIFRoaXMgY2xvY2sgaXMgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IG5ldyBjb21wYXRpYmxlIHZhbHVlcy4KKyAgICBJdCBpcyBlcXVpdmFsZW50IHRvICJ0eCIuCisgIC0gImFwYl9wY2xrIgorICAgIFRoaXMgY2xvY2sgaXMgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IG5ldyBjb21wYXRpYmxlIHZhbHVlcy4KKyAgICBJdCBpcyBlcXVpdmFsZW50IHRvICJzbGF2ZV9idXMiLgorCisgIE5vdGU6IFN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgSVAgY29uZmlndXJhdGlvbnMgbWF5IHJlcXVpcmUgYWRkaW5nIHRoZQorICBmb2xsb3dpbmcgY2xvY2tzIHRvIHRoaXMgbGlzdCBpbiB0aGUgZnV0dXJlOiBjbGtfcnhfMTI1X2ksIGNsa190eF8xMjVfaSwKKyAgY2xrX3BtYXJ4XzBfaSwgY2xrX3BtYXJ4MV9pLCBjbGtfcm1paV9pLCBjbGtfcmV2bWlpX3J4X2ksIGNsa19yZXZtaWlfdHhfaS4KKyAgQ29uZmlndXJhdGlvbnMgZXhpc3Qgd2hlcmUgbXVsdGlwbGUgc2ltaWxhciBjbG9ja3MgYXJlIHVzZWQgYXQgb25jZSwgZS5nLiBhbGwKKyAgb2YgY2xrX3J4XzEyNV9pLCBjbGtfcG1hcnhfMF9pLCBjbGtfcG1hcngxX2kuIEZvciB0aGlzIHJlYXNvbiBpdCBpcyBiZXN0IHRvCisgIGV4dGVuZCB0aGUgYmluZGluZyB3aXRoIGEgc2VwYXJhdGUgY2xvY2stbmFtZXMgZW50cnkgZm9yIGVhY2ggb2YgdGhvc2UgUlgKKyAgY2xvY2tzLCByYXRoZXIgdGhhbiByZXB1cnBvc2luZyB0aGUgZXhpc3RpbmcgInJ4IiBjbG9jay1uYW1lcyBlbnRyeSBhcyBhCisgIGdlbmVyaWMvbG9naWNhbCBjbG9jayBpbiBhIHNpbWlsYXIgZmFzaGlvbiB0byAibWFzdGVyX2J1cyIgYW5kICJzbGF2ZV9idXMiLgorICBUaGlzIHdpbGwgYWxsb3cgZWFzeSBzdXBwb3J0IGZvciBjb25maWd1cmF0aW9ucyB0aGF0IHN1cHBvcnQgbXVsdGlwbGUgUEhZCisgIGludGVyZmFjZXMgdXNpbmcgYSBtdXgsIGFuZCBoZW5jZSBuZWVkIHRvIGhhdmUgZXhwbGljaXQgY29udHJvbCBvdmVyCisgIHNwZWNpZmljIFJYIGNsb2Nrcy4KKworICBUaGUgZm9sbG93aW5nIGNvbXBhdGlibGUgdmFsdWVzIHJlcXVpcmUgdGhlIGZvbGxvd2luZyBzZXQgb2YgY2xvY2tzOgorICAtICJudmlkaWEsdGVncmExODYtZXFvcyIsICJzbnBzLGR3Yy1xb3MtZXRoZXJuZXQtNC4xMCI6CisgICAgLSAic2xhdmVfYnVzIgorICAgIC0gIm1hc3Rlcl9idXMiCisgICAgLSAicngiCisgICAgLSAidHgiCisgICAgLSAicHRwX3JlZiIKKyAgLSAiYXhpcyxhcnRwZWM2LWVxb3MiLCAic25wcyxkd2MtcW9zLWV0aGVybmV0LTQuMTAiOgorICAgIC0gInNsYXZlX2J1cyIKKyAgICAtICJtYXN0ZXJfYnVzIgorICAgIC0gInR4IgorICAgIC0gInB0cF9yZWYiCisgIC0gInNucHMsZHdjLXFvcy1ldGhlcm5ldC00LjEwIiAoZGVwcmVjYXRlZCk6CisgICAgLSAicGh5X3JlZl9jbGsiCisgICAgLSAiYXBiX2NsayIKIC0gaW50ZXJydXB0LXBhcmVudDogU2hvdWxkIGJlIHRoZSBwaGFuZGxlIGZvciB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIKICAgdGhhdCBzZXJ2aWNlcyBpbnRlcnJ1cHRzIGZvciB0aGlzIGRldmljZQogLSBpbnRlcnJ1cHRzOiBTaG91bGQgY29udGFpbiB0aGUgY29yZSdzIGNvbWJpbmVkIGludGVycnVwdCBzaWduYWwKIC0gcGh5LW1vZGU6IFNlZSBldGhlcm5ldC50eHQgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkKKy0gcmVzZXRzOiBQaGFuZGxlIGFuZCByZXNldCBzcGVjaWZpZXJzIGZvciBlYWNoIGVudHJ5IGluIHJlc2V0LW5hbWVzLCBpbiB0aGUKKyAgc2FtZSBvcmRlci4gU2VlIC4uL3Jlc2V0L3Jlc2V0LnR4dC4KKy0gcmVzZXQtbmFtZXM6IE1heSBjb250YWluIGFueS9hbGwgb2YgdGhlIGZvbGxvd2luZyBkZXBlbmRpbmcgb24gdGhlIElQCisgIGNvbmZpZ3VyYXRpb24sIGluIGFueSBvcmRlcjoKKyAgLSAiZXFvcyIuIFRoZSByZXNldCB0byB0aGUgZW50aXJlIG1vZHVsZS4gVGhlIEhXIHNpZ25hbCBuYW1lIGlzIGhyZXNldF9uCisgICAgKEFIQikgb3IgYXJlc2V0bl9pIChBWEkpLgorCisgIFRoZSBmb2xsb3dpbmcgY29tcGF0aWJsZSB2YWx1ZXMgcmVxdWlyZSB0aGUgZm9sbG93aW5nIHNldCBvZiByZXNldHM6CisgICh0aGUgcmVzZXQgcHJvcGVydGllcyBtYXkgYmUgb21pdHRlZCBpZiBlbXB0eSkKKyAgLSAibnZpZGlhLHRlZ3JhMTg2LWVxb3MiLCAic25wcyxkd2MtcW9zLWV0aGVybmV0LTQuMTAiOgorICAgIC0gImVxb3MiLgorICAtICJheGlzLGFydHBlYzYtZXFvcyIsICJzbnBzLGR3Yy1xb3MtZXRoZXJuZXQtNC4xMCI6CisgICAgLSBOb25lLgorICAtICJzbnBzLGR3Yy1xb3MtZXRoZXJuZXQtNC4xMCIgKGRlcHJlY2F0ZWQpOgorICAgIC0gTm9uZS4KIAogT3B0aW9uYWwgcHJvcGVydGllczoKIC0gZG1hLWNvaGVyZW50OiBQcmVzZW50IGlmIGRtYSBvcGVyYXRpb25zIGFyZSBjb2hlcmVudAogLSBtYWMtYWRkcmVzczogU2VlIGV0aGVybmV0LnR4dCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkKIC0gbG9jYWwtbWFjLWFkZHJlc3M6IFNlZSBldGhlcm5ldC50eHQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5CistIHBoeS1yZXNldC1ncGlvczogUGhhbmRsZSBhbmQgc3BlY2lmaWVyIGZvciBhbnkgR1BJTyB1c2VkIHRvIHJlc2V0IHRoZSBQSFkuCisgIFNlZSAuLi9ncGlvL2dwaW8udHh0LgogLSBzbnBzLGVuLWxwaTogSWYgcHJlc2VudCBpdCBlbmFibGVzIHVzZSBvZiB0aGUgQVhJIGxvdy1wb3dlciBpbnRlcmZhY2UKIC0gc25wcyx3cml0ZS1yZXF1ZXN0czogTnVtYmVyIG9mIHdyaXRlIHJlcXVlc3RzIHRoYXQgdGhlIEFYSSBwb3J0IGNhbiBpc3N1ZS4KICAgSXQgZGVwZW5kcyBvbiB0aGUgU29DIGNvbmZpZ3VyYXRpb24uCkBAIC01Miw2ICsxNDIsNyBAQAogCXJlZyA9IDwweDQwMDEwMDAwIDB4NDAwMD47CiAJcGh5LWhhbmRsZSA9IDwmcGh5Mj47CiAJcGh5LW1vZGUgPSAiZ21paSI7CisJcGh5LXJlc2V0LWdwaW9zID0gPCZncGlvY3RsciA0MyBHUElPX0FDVElWRV9MT1c+OwogCiAJc25wcyxlbi10eC1scGktY2xvY2tnYXRpbmc7CiAJc25wcyxlbi1scGk7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3N0bTMyLWR3bWFjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvc3RtMzItZHdtYWMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNWFmYjcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3N0bTMyLWR3bWFjLnR4dApAQCAtMCwwICsxLDMyIEBACitTVE1pY3JvZWxlY3Ryb25pY3MgU1RNMzIgLyBNQ1UgRFdNQUMgZ2x1ZSBsYXllciBjb250cm9sbGVyCisKK1RoaXMgZmlsZSBkb2N1bWVudHMgcGxhdGZvcm0gZ2x1ZSBsYXllciBmb3Igc3RtbWFjLgorUGxlYXNlIHNlZSBzdG1tYWMudHh0IGZvciB0aGUgb3RoZXIgdW5jaGFuZ2VkIHByb3BlcnRpZXMuCisKK1RoZSBkZXZpY2Ugbm9kZSBoYXMgZm9sbG93aW5nIHByb3BlcnRpZXMuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6ICBTaG91bGQgYmUgInN0LHN0bTMyLWR3bWFjIiB0byBzZWxlY3QgZ2x1ZSwgYW5kCisJICAgICAgICJzbnBzLGR3bWFjLTMuNTBhIiB0byBzZWxlY3QgSVAgdmVyc2lvbi4KKy0gY2xvY2tzOiBNdXN0IGNvbnRhaW4gYSBwaGFuZGxlIGZvciBlYWNoIGVudHJ5IGluIGNsb2NrLW5hbWVzLgorLSBjbG9jay1uYW1lczogU2hvdWxkIGJlICJzdG1tYWNldGgiIGZvciB0aGUgaG9zdCBjbG9jay4KKwkgICAgICAgU2hvdWxkIGJlICJtYWMtY2xrLXR4IiBmb3IgdGhlIE1BQyBUWCBjbG9jay4KKwkgICAgICAgU2hvdWxkIGJlICJtYWMtY2xrLXJ4IiBmb3IgdGhlIE1BQyBSWCBjbG9jay4KKy0gc3Qsc3lzY29uIDogU2hvdWxkIGJlIHBoYW5kbGUvb2Zmc2V0IHBhaXIuIFRoZSBwaGFuZGxlIHRvIHRoZSBzeXNjb24gbm9kZSB3aGljaAorCSAgICAgIGVuY29tcGFzZXMgdGhlIGdsdWUgcmVnaXN0ZXIsIGFuZCB0aGUgb2Zmc2V0IG9mIHRoZSBjb250cm9sIHJlZ2lzdGVyLgorRXhhbXBsZToKKworCWV0aGVybmV0QDQwMDI4MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJzdCxzdG0zMi1kd21hYyIsICJzbnBzLGR3bWFjLTMuNTBhIjsKKwkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJcmVnID0gPDB4NDAwMjgwMDAgMHg4MDAwPjsKKwkJcmVnLW5hbWVzID0gInN0bW1hY2V0aCI7CisJCWludGVycnVwdHMgPSA8MCA2MSAwPiwgPDAgNjIgMD47CisJCWludGVycnVwdC1uYW1lcyA9ICJtYWNpcnEiLCAiZXRoX3dha2VfaXJxIjsKKwkJY2xvY2stbmFtZXMgPSAic3RtbWFjZXRoIiwgIm1hYy1jbGstdHgiLCAibWFjLWNsay1yeCI7CisJCWNsb2NrcyA9IDwmcmNjIDAgMjU+LCA8JnJjYyAwIDI2PiwgPCZyY2MgMCAyNz47CisJCXN0LHN5c2NvbiA9IDwmc3lzY2ZnIDB4ND47CisJCXNucHMscGJsID0gPDg+OworCQlzbnBzLG1peGVkLWJ1cnN0OworCQlkbWEtcmFuZ2VzOworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3dpcmVsZXNzL2VzcCxlc3A4MDg5LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvd2lyZWxlc3MvZXNwLGVzcDgwODkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MzMxYmIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3dpcmVsZXNzL2VzcCxlc3A4MDg5LnR4dApAQCAtMCwwICsxLDMxIEBACitFc3ByZXNzaWYgRVNQODA4OSB3aXJlbGVzcyBTRElPIGRldmljZXMKKworVGhpcyBub2RlIHByb3ZpZGVzIHByb3BlcnRpZXMgZm9yIGNvbnRyb2xsaW5nIHRoZSBFU1A4MDg5IHdpcmVsZXNzIGRldmljZS4KK1RoZSBub2RlIGlzIGV4cGVjdGVkIHRvIGJlIHNwZWNpZmllZCBhcyBhIGNoaWxkIG5vZGUgdG8gdGhlIFNESU8gY29udHJvbGxlcgordGhhdCBjb25uZWN0cyB0aGUgZGV2aWNlIHRvIHRoZSBzeXN0ZW0uCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKyAtIGNvbXBhdGlibGUgOiBTaG91bGQgYmUgImVzcCxlc3A4MDg5Ii4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKyAtIGVzcCxjcnlzdGFsLTI2TS1lbjogSW50ZWdlciB2YWx1ZSBmb3IgdGhlIGNyeXN0YWxfMjZNX2VuIGZpcm13YXJlIHBhcmFtZXRlcgorCitFeGFtcGxlOgorCismbW1jMSB7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MD47CisKKwl2bW1jLXN1cHBseSA9IDwmcmVnX2RsZG8xPjsKKwltbWMtcHdyc2VxID0gPCZ3aWZpX3B3cnNlcT47CisJYnVzLXdpZHRoID0gPDQ+OworCW5vbi1yZW1vdmFibGU7CisJc3RhdHVzID0gIm9rYXkiOworCisJZXNwODA4OTogc2Rpb193aWZpQDEgeworCQljb21wYXRpYmxlID0gImVzcCxlc3A4MDg5IjsKKwkJcmVnID0gPDE+OworCQllc3AsY3J5c3RhbC0yNk0tZW4gPSA8Mj47CisJfTsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3hpbGlueF9nbWlpMnJnbWlpLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQveGlsaW54X2dtaWkycmdtaWkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOGRkYTQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3hpbGlueF9nbWlpMnJnbWlpLnR4dApAQCAtMCwwICsxLDM1IEBACitYSUxJTlggR01JSVRPUkdNSUkgQ29udmVydGVyIERyaXZlciBEZXZpY2UgVHJlZSBCaW5kaW5ncworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIEdpZ2FiaXQgTWVkaWEgSW5kZXBlbmRlbnQgSW50ZXJmYWNlIChHTUlJKSB0byBSZWR1Y2VkIEdpZ2FiaXQgTWVkaWEKK0luZGVwZW5kZW50IEludGVyZmFjZSAoUkdNSUkpIGNvcmUgcHJvdmlkZXMgdGhlIFJHTUlJIGJldHdlZW4gUkdNSUktY29tcGxpYW50CitFdGhlcm5ldCBwaHlzaWNhbCBtZWRpYSBkZXZpY2VzIChQSFkpIGFuZCB0aGUgR2lnYWJpdCBFdGhlcm5ldCBjb250cm9sbGVyLgorVGhpcyBjb3JlIGNhbiBiZSB1c2VkIGluIGFsbCB0aHJlZSBtb2RlcyBvZiBvcGVyYXRpb24oMTAvMTAwLzEwMDAgTWIvcykuCitUaGUgTWFuYWdlbWVudCBEYXRhIElucHV0L091dHB1dCAoTURJTykgaW50ZXJmYWNlIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZQorU3BlZWQgb2Ygb3BlcmF0aW9uLiBUaGlzIGNvcmUgY2FuIHN3aXRjaCBkeW5hbWljYWxseSBiZXR3ZWVuIHRoZSB0aHJlZQorRGlmZmVyZW50IHNwZWVkIG1vZGVzIGJ5IGNvbmZpZ3VyaW5nIHRoZSBjb252ZXRlciByZWdpc3RlciB0aHJvdWdoIG1kaW8gd3JpdGUuCisKK1RoaXMgY29udmVydGVyIHNpdHMgYmV0d2VlbiB0aGUgZXRoZXJuZXQgTUFDIGFuZCB0aGUgZXh0ZXJuYWwgcGh5LgorTUFDIDw9PT4gR01JSTJSR01JSSA8PT0+IFJHTUlJX1BIWQorCitGb3IgbW9yZSBkZXRhaWxzIGFib3V0IG1kaW8gcGxlYXNlIHJlZmVyIHBoeS50eHQgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUJOiBTaG91bGQgYmUgInhsbngsZ21paS10by1yZ21paS0xLjAiCistIHJlZwkJOiBUaGUgSUQgbnVtYmVyIGZvciB0aGUgcGh5LCB1c3VhbGx5IGEgc21hbGwgaW50ZWdlcgorLSBwaHktaGFuZGxlCTogU2hvdWxkIHBvaW50IHRvIHRoZSBleHRlcm5hbCBwaHkgZGV2aWNlLgorCQkgIFNlZSBldGhlcm5ldC50eHQgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCisKK0V4YW1wbGU6CisJbWRpbyB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJcGh5OiBldGhlcm5ldC1waHlAMCB7CisJCQkuLi4uLi4KKwkJfTsKKwkJZ21paXRvcmdtaWk6IGdtaWl0b3JnbWlpQDggeworCQkJY29tcGF0aWJsZSA9ICJ4bG54LGdtaWktdG8tcmdtaWktMS4wIjsKKwkJCXJlZyA9IDw4PjsKKwkJCXBoeS1oYW5kbGUgPSA8JnBoeT47CisJCX07CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9udm1lbS9yb2NrY2hpcC1lZnVzZS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbnZtZW0vcm9ja2NoaXAtZWZ1c2UudHh0CmluZGV4IDhmODZhYjMuLjk0YWVlZWEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9udm1lbS9yb2NrY2hpcC1lZnVzZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL252bWVtL3JvY2tjaGlwLWVmdXNlLnR4dApAQCAtMSwxMSArMSwyMCBAQAogPSBSb2NrY2hpcCBlRnVzZSBkZXZpY2UgdHJlZSBiaW5kaW5ncyA9CiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6Ci0tIGNvbXBhdGlibGU6IFNob3VsZCBiZSAicm9ja2NoaXAscm9ja2NoaXAtZWZ1c2UiCistIGNvbXBhdGlibGU6IFNob3VsZCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZy4KKyAgLSAicm9ja2NoaXAscmszMDY2YS1lZnVzZSIgLSBmb3IgUkszMDY2YSBTb0NzLgorICAtICJyb2NrY2hpcCxyazMxODgtZWZ1c2UiIC0gZm9yIFJLMzE4OCBTb0NzLgorICAtICJyb2NrY2hpcCxyazMyODgtZWZ1c2UiIC0gZm9yIFJLMzI4OCBTb0NzLgorICAtICJyb2NrY2hpcCxyazMzOTktZWZ1c2UiIC0gZm9yIFJLMzM5OSBTb0NzLgogLSByZWc6IFNob3VsZCBjb250YWluIHRoZSByZWdpc3RlcnMgbG9jYXRpb24gYW5kIGV4YWN0IGVGdXNlIHNpemUKIC0gY2xvY2tzOiBTaG91bGQgYmUgdGhlIGNsb2NrIGlkIG9mIGVGdXNlCiAtIGNsb2NrLW5hbWVzOiBTaG91bGQgYmUgInBjbGtfZWZ1c2UiCiAKK0RlcHJlY2F0ZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogInJvY2tjaGlwLHJvY2tjaGlwLWVmdXNlIgorICBPbGQgZWZ1c2UgY29tcGF0aWJsZSB2YWx1ZSBjb21wYXRpYmxlIHRvIHJrMzA2NmEsIHJrMzE4OCBhbmQgcmszMjg4CisgIGVmdXNlcworCiA9IERhdGEgY2VsbHMgPQogQXJlIGNoaWxkIG5vZGVzIG9mIGVGdXNlLCBiaW5kaW5ncyBvZiB3aGljaCBhcyBkZXNjcmliZWQgaW4KIGJpbmRpbmdzL252bWVtL252bWVtLnR4dApAQCAtMTMsNyArMjIsNyBAQAogRXhhbXBsZToKIAogCWVmdXNlOiBlZnVzZUBmZmI0MDAwMCB7Ci0JCWNvbXBhdGlibGUgPSAicm9ja2NoaXAscm9ja2NoaXAtZWZ1c2UiOworCQljb21wYXRpYmxlID0gInJvY2tjaGlwLHJrMzI4OC1lZnVzZSI7CiAJCXJlZyA9IDwweGZmYjQwMDAwIDB4MjA+OwogCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPSA8MT47CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGNpL2F4aXMsYXJ0cGVjNi1wY2llLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wY2kvYXhpcyxhcnRwZWM2LXBjaWUudHh0CmluZGV4IDMzMGE0NWIuLjVlY2FlYTEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wY2kvYXhpcyxhcnRwZWM2LXBjaWUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wY2kvYXhpcyxhcnRwZWM2LXBjaWUudHh0CkBAIC0yNCwxNiArMjQsMTcgQEAKIAkJY29tcGF0aWJsZSA9ICJheGlzLGFydHBlYzYtcGNpZSIsICJzbnBzLGR3LXBjaWUiOwogCQlyZWcgPSA8MHhmODA1MDAwMCAweDIwMDAKIAkJICAgICAgIDB4ZjgwNDAwMDAgMHgxMDAwCi0JCSAgICAgICAweGMwMDAwMDAwIDB4MTAwMD47CisJCSAgICAgICAweGMwMDAwMDAwIDB4MjAwMD47CiAJCXJlZy1uYW1lcyA9ICJkYmkiLCAicGh5IiwgImNvbmZpZyI7CiAJCSNhZGRyZXNzLWNlbGxzID0gPDM+OwogCQkjc2l6ZS1jZWxscyA9IDwyPjsKIAkJZGV2aWNlX3R5cGUgPSAicGNpIjsKIAkJCSAgLyogZG93bnN0cmVhbSBJL08gKi8KLQkJcmFuZ2VzID0gPDB4ODEwMDAwMDAgMCAweDAwMDEwMDAwIDB4YzAwMTAwMDAgMCAweDAwMDEwMDAwCisJCXJhbmdlcyA9IDwweDgxMDAwMDAwIDAgMCAweGMwMDAyMDAwIDAgMHgwMDAxMDAwMAogCQkJICAvKiBub24tcHJlZmV0Y2hhYmxlIG1lbW9yeSAqLwotCQkJICAweDgyMDAwMDAwIDAgMHhjMDAyMDAwMCAweGMwMDIwMDAwIDAgMHgxZmZlMDAwMD47CisJCQkgIDB4ODIwMDAwMDAgMCAweGMwMDEyMDAwIDB4YzAwMTIwMDAgMCAweDFmZmVlMDAwPjsKIAkJbnVtLWxhbmVzID0gPDI+OworCQlidXMtcmFuZ2UgPSA8MHgwMCAweGZmPjsKIAkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDE0OCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKIAkJaW50ZXJydXB0LW5hbWVzID0gIm1zaSI7CiAJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGNpL3hpbGlueC1ud2wtcGNpZS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGNpL3hpbGlueC1ud2wtcGNpZS50eHQKaW5kZXggMzM3ZmM5Ny4uMzI1OTc5OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BjaS94aWxpbngtbndsLXBjaWUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wY2kveGlsaW54LW53bC1wY2llLnR4dApAQCAtNTUsOSArNTUsMTAgQEAKIAltc2ktcGFyZW50ID0gPCZud2xfcGNpZT47CiAJcmVnID0gPDB4MCAweGZkMGUwMDAwIDB4MCAweDEwMDA+LAogCSAgICAgIDwweDAgMHhmZDQ4MDAwMCAweDAgMHgxMDAwPiwKLQkgICAgICA8MHgwIDB4ZTAwMDAwMDAgMHgwIDB4MTAwMDAwMD47CisJICAgICAgPDB4ODAgMHgwMDAwMDAwMCAweDAgMHgxMDAwMDAwPjsKIAlyZWctbmFtZXMgPSAiYnJlZyIsICJwY2lyZWciLCAiY2ZnIjsKLQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAweDAwMDAwMDAwIDB4ZTEwMDAwMDAgMHgwMDAwMDAwMCAweGUxMDAwMDAwIDAgMHgwZjAwMDAwMD47CisJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMHgwMDAwMDAwMCAweGUwMDAwMDAwIDB4MDAwMDAwMDAgMHhlMDAwMDAwMCAweDAwMDAwMDAwIDB4MTAwMDAwMDAgIC8qIG5vbi1wcmVmZXRjaGFibGUgbWVtb3J5ICovCisJCSAgMHg0MzAwMDAwMCAweDAwMDAwMDA2IDB4MDAwMDAwMDAgMHgwMDAwMDAwNiAweDAwMDAwMDAwIDB4MDAwMDAwMDIgMHgwMDAwMDAwMD47LyogcHJlZmV0Y2hhYmxlIG1lbW9yeSAqLwogCiAJcGNpZV9pbnRjOiBsZWdhY3ktaW50ZXJydXB0LWNvbnRyb2xsZXIgewogCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvYmNtLW5zLXVzYjMtcGh5LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvYmNtLW5zLXVzYjMtcGh5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWFlYmE5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9iY20tbnMtdXNiMy1waHkudHh0CkBAIC0wLDAgKzEsMjMgQEAKK0RyaXZlciBmb3IgQnJvYWRjb20gTm9ydGhzdGFyIFVTQiAzLjAgUEhZCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZTogb25lIG9mOiAiYnJjbSxucy1heC11c2IzLXBoeSIsICJicmNtLG5zLWJ4LXVzYjMtcGh5Ii4KKy0gcmVnOiByZWdpc3RlciBtYXBwaW5ncyBmb3IgRE1QIChEZXZpY2UgTWFuYWdlbWVudCBQbHVnaW4pIGFuZCBDaGlwQ29tbW9uIEIKKyAgICAgICBNTUkuCistIHJlZy1uYW1lczogImRtcCIgYW5kICJjY2ItbWlpIgorCitJbml0aWFsaXphdGlvbiBvZiBVU0IgMy4wIFBIWSBkZXBlbmRzIG9uIE5vcnRoc3RhciB2ZXJzaW9uLiBUaGVyZSBhcmUgY3VycmVudGx5Cit0aHJlZSBrbm93biBzZXJpZXM6IEF4LCBCeCBhbmQgQ3guCitLbm93biBBMDogQkNNNDcwNyByZXYgMAorS25vd24gQjA6IEJDTTQ3MDcgcmV2IDQsIEJDTTUzNTczIHJldiAyCitLbm93biBCMTogQkNNNDcwNyByZXYgNgorS25vd24gQzA6IEJDTTQ3MDk0IHJldiAwCisKK0V4YW1wbGU6CisJdXNiMy1waHkgeworCQljb21wYXRpYmxlID0gImJyY20sbnMtYXgtdXNiMy1waHkiOworCQlyZWcgPSA8MHgxODEwNTAwMCAweDEwMDA+LCA8MHgxODAwMzAwMCAweDEwMDA+OworCQlyZWctbmFtZXMgPSAiZG1wIiwgImNjYi1taWkiOworCQkjcGh5LWNlbGxzID0gPDA+OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L214cy11c2ItcGh5LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvbXhzLXVzYi1waHkudHh0CmluZGV4IDM3OWI4NGEuLjFkMjViMDQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvbXhzLXVzYi1waHkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvbXhzLXVzYi1waHkudHh0CkBAIC0xMiw2ICsxMiwxNiBAQAogLSBpbnRlcnJ1cHRzOiBTaG91bGQgY29udGFpbiBwaHkgaW50ZXJydXB0CiAtIGZzbCxhbmF0b3A6IHBoYW5kbGUgZm9yIGFuYXRvcCByZWdpc3RlciwgaXQgaXMgb25seSBmb3IgaW14NiBTb0Mgc2VyaWVzCiAKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIGZzbCx0eC1jYWwtNDUtZG4tb2htczogSW50ZWdlciBbMzAtNTVdLiBSZXNpc3RhbmNlIChpbiBvaG1zKSBvZiBzd2l0Y2hhYmxlCisgIGhpZ2gtc3BlZWQgdHJpbW1pbmcgcmVzaXN0b3IgY29ubmVjdGVkIGluIHBhcmFsbGVsIHdpdGggdGhlIDQ1IG9obSByZXNpc3RvcgorICB0aGF0IHRlcm1pbmF0ZXMgdGhlIEROIG91dHB1dCBzaWduYWwuIERlZmF1bHQ6IDQ1CistIGZzbCx0eC1jYWwtNDUtZHAtb2htczogSW50ZWdlciBbMzAtNTVdLiBSZXNpc3RhbmNlIChpbiBvaG1zKSBvZiBzd2l0Y2hhYmxlCisgIGhpZ2gtc3BlZWQgdHJpbW1pbmcgcmVzaXN0b3IgY29ubmVjdGVkIGluIHBhcmFsbGVsIHdpdGggdGhlIDQ1IG9obSByZXNpc3RvcgorICB0aGF0IHRlcm1pbmF0ZXMgdGhlIERQIG91dHB1dCBzaWduYWwuIERlZmF1bHQ6IDQ1CistIGZzbCx0eC1kLWNhbDogSW50ZWdlciBbNzktMTE5XS4gQ3VycmVudCB0cmltbWluZyB2YWx1ZSAoYXMgYSBwZXJjZW50YWdlKSBvZgorICB0aGUgMTcuNzhtQSBUWCByZWZlcmVuY2UgY3VycmVudC4gRGVmYXVsdDogMTAwCisKIEV4YW1wbGU6CiB1c2JwaHkxOiB1c2JwaHlAMDIwYzkwMDAgewogCWNvbXBhdGlibGUgPSAiZnNsLGlteDZxLXVzYnBoeSIsICJmc2wsaW14MjMtdXNicGh5IjsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvcGh5LXJvY2tjaGlwLWlubm8tdXNiMi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3BoeS1yb2NrY2hpcC1pbm5vLXVzYjIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMjljNzcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3BoeS1yb2NrY2hpcC1pbm5vLXVzYjIudHh0CkBAIC0wLDAgKzEsNjQgQEAKK1JPQ0tDSElQIFVTQjIuMCBQSFkgV0lUSCBJTk5PIElQIEJMT0NLCisKK1JlcXVpcmVkIHByb3BlcnRpZXMgKHBoeSAocGFyZW50KSBub2RlKToKKyAtIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgb25lIG9mIHRoZSBsaXN0ZWQgY29tcGF0aWJsZXM6CisJKiAicm9ja2NoaXAscmszMzY2LXVzYjJwaHkiCisJKiAicm9ja2NoaXAscmszMzk5LXVzYjJwaHkiCisgLSByZWcgOiB0aGUgYWRkcmVzcyBvZmZzZXQgb2YgZ3JmIGZvciB1c2ItcGh5IGNvbmZpZ3VyYXRpb24uCisgLSAjY2xvY2stY2VsbHMgOiBzaG91bGQgYmUgMC4KKyAtIGNsb2NrLW91dHB1dC1uYW1lcyA6IHNwZWNpZnkgdGhlIDQ4MG0gb3V0cHV0IGNsb2NrIG5hbWUuCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CisgLSBjbG9ja3MgOiBwaGFuZGxlICsgcGh5IHNwZWNpZmllciBwYWlyLCBmb3IgdGhlIGlucHV0IGNsb2NrIG9mIHBoeS4KKyAtIGNsb2NrLW5hbWVzIDogaW5wdXQgY2xvY2sgbmFtZSBvZiBwaHksIG11c3QgYmUgInBoeWNsayIuCisKK1JlcXVpcmVkIG5vZGVzIDogYSBzdWItbm9kZSBpcyByZXF1aXJlZCBmb3IgZWFjaCBwb3J0IHRoZSBwaHkgcHJvdmlkZXMuCisJCSBUaGUgc3ViLW5vZGUgbmFtZSBpcyB1c2VkIHRvIGlkZW50aWZ5IGhvc3Qgb3Igb3RnIHBvcnQsCisJCSBhbmQgc2hhbGwgYmUgdGhlIGZvbGxvd2luZyBlbnRyaWVzOgorCSogIm90Zy1wb3J0IiA6IHRoZSBuYW1lIG9mIG90ZyBwb3J0LgorCSogImhvc3QtcG9ydCIgOiB0aGUgbmFtZSBvZiBob3N0IHBvcnQuCisKK1JlcXVpcmVkIHByb3BlcnRpZXMgKHBvcnQgKGNoaWxkKSBub2RlKToKKyAtICNwaHktY2VsbHMgOiBtdXN0IGJlIDAuIFNlZSAuL3BoeS1iaW5kaW5ncy50eHQgZm9yIGRldGFpbHMuCisgLSBpbnRlcnJ1cHRzIDogc3BlY2lmeSBhbiBpbnRlcnJ1cHQgZm9yIGVhY2ggZW50cnkgaW4gaW50ZXJydXB0LW5hbWVzLgorIC0gaW50ZXJydXB0LW5hbWVzIDogYSBsaXN0IHdoaWNoIHNoYWxsIGJlIHRoZSBmb2xsb3dpbmcgZW50cmllczoKKwkqICJvdGctaWQiIDogZm9yIHRoZSBvdGcgaWQgaW50ZXJydXB0LgorCSogIm90Zy1idmFsaWQiIDogZm9yIHRoZSBvdGcgdmJ1cyBpbnRlcnJ1cHQuCisJKiAibGluZXN0YXRlIiA6IGZvciB0aGUgaG9zdC9vdGcgbGluZXN0YXRlIGludGVycnVwdC4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKyAtIHBoeS1zdXBwbHkgOiBwaGFuZGxlIHRvIGEgcmVndWxhdG9yIHRoYXQgcHJvdmlkZXMgcG93ZXIgdG8gVkJVUy4KKwkJU2VlIC4vcGh5LWJpbmRpbmdzLnR4dCBmb3IgZGV0YWlscy4KKworRXhhbXBsZToKKworZ3JmOiBzeXNjb25AZmY3NzAwMDAgeworCWNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMzY2LWdyZiIsICJzeXNjb24iLCAic2ltcGxlLW1mZCI7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisKKy4uLgorCisJdTJwaHk6IHVzYjItcGh5QDcwMCB7CisJCWNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMzY2LXVzYjJwaHkiOworCQlyZWcgPSA8MHg3MDAgMHgyYz47CisJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJY2xvY2stb3V0cHV0LW5hbWVzID0gInNjbGtfb3RncGh5MF80ODBtIjsKKworCQl1MnBoeV9vdGc6IG90Zy1wb3J0IHsKKwkJCSNwaHktY2VsbHMgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgOTMgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCQkJICAgICA8R0lDX1NQSSA5NCBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKKwkJCQkgICAgIDxHSUNfU1BJIDk1IElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQkJaW50ZXJydXB0LW5hbWVzID0gIm90Zy1pZCIsICJvdGctYnZhbGlkIiwgImxpbmVzdGF0ZSI7CisJCQlzdGF0dXMgPSAib2theSI7CisJCX07CisKKwkJdTJwaHlfaG9zdDogaG9zdC1wb3J0IHsKKwkJCSNwaHktY2VsbHMgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgOTYgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCQlpbnRlcnJ1cHQtbmFtZXMgPSAibGluZXN0YXRlIjsKKwkJCXN0YXR1cyA9ICJva2F5IjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvcGh5LXJvY2tjaGlwLXR5cGVjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvcGh5LXJvY2tjaGlwLXR5cGVjLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWE4NjdlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9waHktcm9ja2NoaXAtdHlwZWMudHh0CkBAIC0wLDAgKzEsMTAxIEBACisqIFJPQ0tDSElQIHR5cGUtYyBQSFkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorIC0gY29tcGF0aWJsZSA6IG11c3QgYmUgInJvY2tjaGlwLHJrMzM5OS10eXBlYy1waHkiCisgLSByZWc6IEFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgdXNiIHBoeSBjb250cm9sIHJlZ2lzdGVyIHNldAorIC0gcm9ja2NoaXAsZ3JmIDogcGhhbmRsZSB0byB0aGUgc3lzY29uIG1hbmFnaW5nIHRoZSAiZ2VuZXJhbAorICAgcmVnaXN0ZXIgZmlsZXMiCisgLSBjbG9ja3MgOiBwaGFuZGxlICsgY2xvY2sgc3BlY2lmaWVyIGZvciB0aGUgcGh5IGNsb2NrcworIC0gY2xvY2stbmFtZXMgOiBzdHJpbmcsIGNsb2NrIG5hbWUsIG11c3QgYmUgInRjcGRjb3JlIiwgInRjcGRwaHktcmVmIjsKKyAtIGFzc2lnbmVkLWNsb2NrczogbWFpbiBjbG9jaywgc2hvdWxkIGJlIDwmY3J1IFNDTEtfVVBIWTBfVENQRENPUkU+IG9yCisJCSAgICA8JmNydSBTQ0xLX1VQSFkxX1RDUERDT1JFPjsKKyAtIGFzc2lnbmVkLWNsb2NrLXJhdGVzIDogdGhlIHBoeSBjb3JlIGNsayBmcmVxdWVuY3ksIHNoYWxsIGJlOiA1MDAwMDAwMAorIC0gcmVzZXRzIDogYSBsaXN0IG9mIHBoYW5kbGUgKyByZXNldCBzcGVjaWZpZXIgcGFpcnMKKyAtIHJlc2V0LW5hbWVzIDogc3RyaW5nIHJlc2V0IG5hbWUsIG11c3QgYmU6CisJCSAidXBoeSIsICJ1cGh5LXBpcGUiLCAidXBoeS10Y3BoeSIKKyAtIGV4dGNvbiA6IGV4dGNvbiBzcGVjaWZpZXIgZm9yIHRoZSBQb3dlciBEZWxpdmVyeQorCitOb3RlLCB0aGVyZSBhcmUgMiB0eXBlLWMgcGh5cyBmb3IgUkszMzk5LCBhbmQgdGhleSBhcmUgYWxtb3N0IGlkZW50aWNhbCwgZXhjZXB0Cit0aGVzZSByZWdpc3RlcnMoZGVzY3JpcHRpb24gYmVsb3cpLCBldmVyeSByZWdpc3RlciBub2RlIGNvbnRhaW5zIDMgc2VjdGlvbnM6CitvZmZzZXQsIGVuYWJsZSBiaXQsIHdyaXRlIG1hc2sgYml0LgorIC0gcm9ja2NoaXAsdHlwZWMtY29ubi1kaXIgOiB0aGUgcmVnaXN0ZXIgb2YgdHlwZS1jIGNvbm5lY3RvciBkaXJlY3Rpb24sCisgICBmb3IgdHlwZS1jIHBoeTAsIGl0IG11c3QgYmUgPDB4ZTU4MCAwIDE2PjsKKyAgIGZvciB0eXBlLWMgcGh5MSwgaXQgbXVzdCBiZSA8MHhlNThjIDAgMTY+OworIC0gcm9ja2NoaXAsdXNiM3RvdXNiMi1lbiA6IHRoZSByZWdpc3RlciBvZiB0eXBlLWMgZm9yY2UgdXNiMyB0byB1c2IyIGVuYWJsZQorICAgY29udHJvbC4KKyAgIGZvciB0eXBlLWMgcGh5MCwgaXQgbXVzdCBiZSA8MHhlNTgwIDMgMTk+OworICAgZm9yIHR5cGUtYyBwaHkxLCBpdCBtdXN0IGJlIDwweGU1OGMgMyAxOT47CisgLSByb2NrY2hpcCxleHRlcm5hbC1wc20gOiB0aGUgcmVnaXN0ZXIgb2YgdHlwZS1jIHBoeSBleHRlcm5hbCBwc20gY2xvY2sKKyAgIHNlbGVjdGlvbi4KKyAgIGZvciB0eXBlLWMgcGh5MCwgaXQgbXVzdCBiZSA8MHhlNTg4IDE0IDMwPjsKKyAgIGZvciB0eXBlLWMgcGh5MSwgaXQgbXVzdCBiZSA8MHhlNTk0IDE0IDMwPjsKKyAtIHJvY2tjaGlwLHBpcGUtc3RhdHVzIDogdGhlIHJlZ2lzdGVyIG9mIHR5cGUtYyBwaHkgcGlwZSBzdGF0dXMuCisgICBmb3IgdHlwZS1jIHBoeTAsIGl0IG11c3QgYmUgPDB4ZTVjMCAwIDA+OworICAgZm9yIHR5cGUtYyBwaHkxLCBpdCBtdXN0IGJlIDwweGU1YzAgMTYgMTY+OworCitSZXF1aXJlZCBub2RlcyA6IGEgc3ViLW5vZGUgaXMgcmVxdWlyZWQgZm9yIGVhY2ggcG9ydCB0aGUgcGh5IHByb3ZpZGVzLgorCQkgVGhlIHN1Yi1ub2RlIG5hbWUgaXMgdXNlZCB0byBpZGVudGlmeSBkcCBvciB1c2IzIHBvcnQsCisJCSBhbmQgc2hhbGwgYmUgdGhlIGZvbGxvd2luZyBlbnRyaWVzOgorCSogImRwLXBvcnQiIDogdGhlIG5hbWUgb2YgRFAgcG9ydC4KKwkqICJ1c2IzLXBvcnQiIDogdGhlIG5hbWUgb2YgVVNCMyBwb3J0LgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzIChwb3J0IChjaGlsZCkgbm9kZSk6CistICNwaHktY2VsbHMgOiBtdXN0IGJlIDAsIFNlZSAuL3BoeS1iaW5kaW5ncy50eHQgZm9yIGRldGFpbHMuCisKK0V4YW1wbGU6CisJdGNwaHkwOiBwaHlAZmY3YzAwMDAgeworCQljb21wYXRpYmxlID0gInJvY2tjaGlwLHJrMzM5OS10eXBlYy1waHkiOworCQlyZWcgPSA8MHgwIDB4ZmY3YzAwMDAgMHgwIDB4NDAwMDA+OworCQlyb2NrY2hpcCxncmYgPSA8JmdyZj47CisJCWV4dGNvbiA9IDwmZnVzYjA+OworCQljbG9ja3MgPSA8JmNydSBTQ0xLX1VQSFkwX1RDUERDT1JFPiwKKwkJCSA8JmNydSBTQ0xLX1VQSFkwX1RDUERQSFlfUkVGPjsKKwkJY2xvY2stbmFtZXMgPSAidGNwZGNvcmUiLCAidGNwZHBoeS1yZWYiOworCQlhc3NpZ25lZC1jbG9ja3MgPSA8JmNydSBTQ0xLX1VQSFkwX1RDUERDT1JFPjsKKwkJYXNzaWduZWQtY2xvY2stcmF0ZXMgPSA8NTAwMDAwMDA+OworCQlyZXNldHMgPSA8JmNydSBTUlNUX1VQSFkwPiwKKwkJCSA8JmNydSBTUlNUX1VQSFkwX1BJUEVfTDAwPiwKKwkJCSA8JmNydSBTUlNUX1BfVVBIWTBfVENQSFk+OworCQlyZXNldC1uYW1lcyA9ICJ1cGh5IiwgInVwaHktcGlwZSIsICJ1cGh5LXRjcGh5IjsKKwkJcm9ja2NoaXAsdHlwZWMtY29ubi1kaXIgPSA8MHhlNTgwIDAgMTY+OworCQlyb2NrY2hpcCx1c2IzdG91c2IyLWVuID0gPDB4ZTU4MCAzIDE5PjsKKwkJcm9ja2NoaXAsZXh0ZXJuYWwtcHNtID0gPDB4ZTU4OCAxNCAzMD47CisJCXJvY2tjaGlwLHBpcGUtc3RhdHVzID0gPDB4ZTVjMCAwIDA+OworCisJCXRjcGh5MF9kcDogZHAtcG9ydCB7CisJCQkjcGh5LWNlbGxzID0gPDA+OworCQl9OworCisJCXRjcGh5MF91c2IzOiB1c2IzLXBvcnQgeworCQkJI3BoeS1jZWxscyA9IDwwPjsKKwkJfTsKKwl9OworCisJdGNwaHkxOiBwaHlAZmY4MDAwMDAgeworCQljb21wYXRpYmxlID0gInJvY2tjaGlwLHJrMzM5OS10eXBlYy1waHkiOworCQlyZWcgPSA8MHgwIDB4ZmY4MDAwMDAgMHgwIDB4NDAwMDA+OworCQlyb2NrY2hpcCxncmYgPSA8JmdyZj47CisJCWV4dGNvbiA9IDwmZnVzYjE+OworCQljbG9ja3MgPSA8JmNydSBTQ0xLX1VQSFkxX1RDUERDT1JFPiwKKwkJCSA8JmNydSBTQ0xLX1VQSFkxX1RDUERQSFlfUkVGPjsKKwkJY2xvY2stbmFtZXMgPSAidGNwZGNvcmUiLCAidGNwZHBoeS1yZWYiOworCQlhc3NpZ25lZC1jbG9ja3MgPSA8JmNydSBTQ0xLX1VQSFkxX1RDUERDT1JFPjsKKwkJYXNzaWduZWQtY2xvY2stcmF0ZXMgPSA8NTAwMDAwMDA+OworCQlyZXNldHMgPSA8JmNydSBTUlNUX1VQSFkxPiwKKwkJCSA8JmNydSBTUlNUX1VQSFkxX1BJUEVfTDAwPiwKKwkJCSA8JmNydSBTUlNUX1BfVVBIWTFfVENQSFk+OworCQlyZXNldC1uYW1lcyA9ICJ1cGh5IiwgInVwaHktcGlwZSIsICJ1cGh5LXRjcGh5IjsKKwkJcm9ja2NoaXAsdHlwZWMtY29ubi1kaXIgPSA8MHhlNThjIDAgMTY+OworCQlyb2NrY2hpcCx1c2IzdG91c2IyLWVuID0gPDB4ZTU4YyAzIDE5PjsKKwkJcm9ja2NoaXAsZXh0ZXJuYWwtcHNtID0gPDB4ZTU5NCAxNCAzMD47CisJCXJvY2tjaGlwLHBpcGUtc3RhdHVzID0gPDB4ZTVjMCAxNiAxNj47CisKKwkJdGNwaHkxX2RwOiBkcC1wb3J0IHsKKwkJCSNwaHktY2VsbHMgPSA8MD47CisJCX07CisKKwkJdGNwaHkxX3VzYjM6IHVzYjMtcG9ydCB7CisJCQkjcGh5LWNlbGxzID0gPDA+OworCQl9OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3JjYXItZ2VuMy1waHktdXNiMi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3JjYXItZ2VuMy1waHktdXNiMi50eHQKaW5kZXggMjI4MWQ2Yy4uYWNlOWNjZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9yY2FyLWdlbjMtcGh5LXVzYjIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvcmNhci1nZW4zLXBoeS11c2IyLnR4dApAQCAtNiw2ICs2LDggQEAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAtIGNvbXBhdGlibGU6ICJyZW5lc2FzLHVzYjItcGh5LXI4YTc3OTUiIGlmIHRoZSBkZXZpY2UgaXMgYSBwYXJ0IG9mIGFuIFI4QTc3OTUKIAkgICAgICBTb0MuCisJICAgICAgInJlbmVzYXMsdXNiMi1waHktcjhhNzc5NiIgaWYgdGhlIGRldmljZSBpcyBhIHBhcnQgb2YgYW4gUjhBNzc5NgorCSAgICAgIFNvQy4KIAkgICAgICAicmVuZXNhcyxyY2FyLWdlbjMtdXNiMi1waHkiIGZvciBhIGdlbmVyaWMgUi1DYXIgR2VuMyBjb21wYXRpYmxlIGRldmljZS4KIAogCSAgICAgIFdoZW4gY29tcGF0aWJsZSB3aXRoIHRoZSBnZW5lcmljIHZlcnNpb24sIG5vZGVzIG11c3QgbGlzdCB0aGUKQEAgLTMwLDExICszMiwxMSBAQAogCQljb21wYXRpYmxlID0gInJlbmVzYXMsdXNiMi1waHktcjhhNzc5NSIsICJyZW5lc2FzLHJjYXItZ2VuMy11c2IyLXBoeSI7CiAJCXJlZyA9IDwwIDB4ZWUwODAyMDAgMCAweDcwMD47CiAJCWludGVycnVwdHMgPSA8R0lDX1NQSSAxMDggSVJRX1RZUEVfTEVWRUxfSElHSD47Ci0JCWNsb2NrcyA9IDwmbXN0cDdfY2xrcyBSOEE3Nzk1X0NMS19FSENJMD47CisJCWNsb2NrcyA9IDwmY3BnIENQR19NT0QgNzAzPjsKIAl9OwogCiAJdXNiLXBoeUBlZTBhMDIwMCB7CiAJCWNvbXBhdGlibGUgPSAicmVuZXNhcyx1c2IyLXBoeS1yOGE3Nzk1IiwgInJlbmVzYXMscmNhci1nZW4zLXVzYjItcGh5IjsKIAkJcmVnID0gPDAgMHhlZTBhMDIwMCAwIDB4NzAwPjsKLQkJY2xvY2tzID0gPCZtc3RwN19jbGtzIFI4QTc3OTVfQ0xLX0VIQ0kwPjsKKwkJY2xvY2tzID0gPCZjcGcgQ1BHX01PRCA3MDI+OwogCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3JvY2tjaGlwLXBjaWUtcGh5LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvcm9ja2NoaXAtcGNpZS1waHkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNjIyMmEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3JvY2tjaGlwLXBjaWUtcGh5LnR4dApAQCAtMCwwICsxLDMxIEBACitSb2NrY2hpcCBQQ0lFIFBIWQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmVxdWlyZWQgcHJvcGVydGllczoKKyAtIGNvbXBhdGlibGU6IHJvY2tjaGlwLHJrMzM5OS1wY2llLXBoeQorIC0gI3BoeS1jZWxsczogbXVzdCBiZSAwCisgLSBjbG9ja3M6IE11c3QgY29udGFpbiBhbiBlbnRyeSBpbiBjbG9jay1uYW1lcy4KKwlTZWUgLi4vY2xvY2tzL2Nsb2NrLWJpbmRpbmdzLnR4dCBmb3IgZGV0YWlscy4KKyAtIGNsb2NrLW5hbWVzOiBNdXN0IGJlICJyZWZjbGsiCisgLSByZXNldHM6IE11c3QgY29udGFpbiBhbiBlbnRyeSBpbiByZXNldC1uYW1lcy4KKwlTZWUgLi4vcmVzZXQvcmVzZXQudHh0IGZvciBkZXRhaWxzLgorIC0gcmVzZXQtbmFtZXM6IE11c3QgYmUgInBoeSIKKworRXhhbXBsZToKKworZ3JmOiBzeXNjb25AZmY3NzAwMDAgeworCWNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMzk5LWdyZiIsICJzeXNjb24iLCAic2ltcGxlLW1mZCI7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisKKwkuLi4KKworCXBjaWVfcGh5OiBwY2llLXBoeSB7CisJCWNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMzk5LXBjaWUtcGh5IjsKKwkJI3BoeS1jZWxscyA9IDwwPjsKKwkJY2xvY2tzID0gPCZjcnUgU0NMS19QQ0lFUEhZX1JFRj47CisJCWNsb2NrLW5hbWVzID0gInJlZmNsayI7CisJCXJlc2V0cyA9IDwmY3J1IFNSU1RfUENJRVBIWT47CisJCXJlc2V0LW5hbWVzID0gInBoeSI7CisJfTsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3JvY2tjaGlwLXVzYi1waHkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9yb2NrY2hpcC11c2ItcGh5LnR4dAppbmRleCBjYzZiZTk2Li41N2RjMzg4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3JvY2tjaGlwLXVzYi1waHkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvcm9ja2NoaXAtdXNiLXBoeS50eHQKQEAgLTI3LDYgKzI3LDkgQEAKIC0gY2xvY2tzIDogcGhhbmRsZSArIGNsb2NrIHNwZWNpZmllciBmb3IgdGhlIHBoeSBjbG9ja3MKIC0gY2xvY2stbmFtZXM6IHN0cmluZywgY2xvY2sgbmFtZSwgbXVzdCBiZSAicGh5Y2xrIgogLSAjY2xvY2stY2VsbHM6IGZvciB1c2VycyBvZiB0aGUgcGh5LXBsbCwgc2hvdWxkIGJlIDAKKy0gcmVzZXQtbmFtZXM6IE9ubHkgYWxsb3cgdGhlIGZvbGxvd2luZyBlbnRyaWVzOgorIC0gcGh5LXJlc2V0CistIHJlc2V0czogTXVzdCBjb250YWluIGFuIGVudHJ5IGZvciBlYWNoIGVudHJ5IGluIHJlc2V0LW5hbWVzLgogCiBFeGFtcGxlOgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3N1bjRpLXVzYi1waHkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9zdW40aS11c2ItcGh5LnR4dAppbmRleCA5NTczNmQ3Li4yODcxNTBkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3N1bjRpLXVzYi1waHkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvc3VuNGktdXNiLXBoeS50eHQKQEAgLTEwLDYgKzEwLDcgQEAKICAgKiBhbGx3aW5uZXIsc3VuOGktYTIzLXVzYi1waHkKICAgKiBhbGx3aW5uZXIsc3VuOGktYTMzLXVzYi1waHkKICAgKiBhbGx3aW5uZXIsc3VuOGktaDMtdXNiLXBoeQorICAqIGFsbHdpbm5lcixzdW41MGktYTY0LXVzYi1waHkKIC0gcmVnIDogYSBsaXN0IG9mIG9mZnNldCArIGxlbmd0aCBwYWlycwogLSByZWctbmFtZXMgOgogICAqICJwaHlfY3RybCIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvdGktcGh5LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvdGktcGh5LnR4dAppbmRleCBhM2IzOTQ1Li5jZDEzZTYxNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS90aS1waHkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvdGktcGh5LnR4dApAQCAtMzEsNiArMzEsOCBAQAogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgogIC0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJ0aSxvbWFwLXVzYjIiCisJICAgICAgIFNob3VsZCBiZSAidGksZHJhN3gtdXNiMiIgZm9yIHRoZSAxc3QgaW5zdGFuY2Ugb2YgVVNCMiBQSFkgb24KKwkgICAgICAgRFJBN3gKIAkgICAgICAgU2hvdWxkIGJlICJ0aSxkcmE3eC11c2IyLXBoeTIiIGZvciB0aGUgMm5kIGluc3RhbmNlIG9mIFVTQjIgUEhZCiAJICAgICAgIGluIERSQTd4CiAgLSByZWcgOiBBZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL2FsbHdpbm5lcixzdW54aS1waW5jdHJsLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL2FsbHdpbm5lcixzdW54aS1waW5jdHJsLnR4dAppbmRleCA2OTYxNzIyLi4xNjg1ODIxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9hbGx3aW5uZXIsc3VueGktcGluY3RybC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvYWxsd2lubmVyLHN1bnhpLXBpbmN0cmwudHh0CkBAIC0yMyw2ICsyMyw3IEBACiAgICJhbGx3aW5uZXIsc3VuOGktaDMtcGluY3RybCIKICAgImFsbHdpbm5lcixzdW44aS1oMy1yLXBpbmN0cmwiCiAgICJhbGx3aW5uZXIsc3VuNTBpLWE2NC1waW5jdHJsIgorICAibmV4dHRoaW5nLGdyOC1waW5jdHJsIgogCiAtIHJlZzogU2hvdWxkIGNvbnRhaW4gdGhlIHJlZ2lzdGVyIHBoeXNpY2FsIGFkZHJlc3MgYW5kIGxlbmd0aCBmb3IgdGhlCiAgIHBpbiBjb250cm9sbGVyLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcGluY3RybC1hc3BlZWQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcGluY3RybC1hc3BlZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNjBhZDEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9waW5jdHJsLWFzcGVlZC50eHQKQEAgLTAsMCArMSw2NSBAQAorQXNwZWVkIFBpbiBDb250cm9sbGVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgQXNwZWVkIFNvQ3MgdmFyeSBpbiBmdW5jdGlvbmFsaXR5IGluc2lkZSBhIGdlbmVyYXRpb24gYnV0IGhhdmUgYSBjb21tb24gbXV4CitkZXZpY2UgcmVnaXN0ZXIgbGF5b3V0LgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogU2hvdWxkIGJlIGFueSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKwkJImFzcGVlZCxhc3QyNDAwLXBpbmN0cmwiCisJCSJhc3BlZWQsZzQtcGluY3RybCIKKwkJImFzcGVlZCxhc3QyNTAwLXBpbmN0cmwiCisJCSJhc3BlZWQsZzUtcGluY3RybCIKKworVGhlIHBpbiBjb250cm9sbGVyIG5vZGUgc2hvdWxkIGJlIGEgY2hpbGQgb2YgYSBzeXNjb24gbm9kZSB3aXRoIHRoZSByZXF1aXJlZAorcHJvcGVydHk6CistIGNvbXBhdGlibGU6ICJzeXNjb24iLCAic2ltcGxlLW1mZCIKKworUmVmZXIgdG8gdGhlIHRoZSBiaW5kaW5ncyBkZXNjcmliZWQgaW4KK0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvc3lzY29uLnR4dAorCitTdWJub2RlIEZvcm1hdAorLS0tLS0tLS0tLS0tLS0KKworVGhlIHJlcXVpcmVkIHByb3BlcnRpZXMgb2YgY2hpbGQgbm9kZXMgYXJlIChhcyBkZWZpbmVkIGluIHBpbmN0cmwtYmluZGluZ3MpOgorLSBmdW5jdGlvbgorLSBncm91cHMKKworRWFjaCBmdW5jdGlvbiBoYXMgb25seSBvbmUgYXNzb2NpYXRlZCBwaW4gZ3JvdXAuIEVhY2ggZ3JvdXAgaXMgbmFtZWQgYnkgaXRzCitmdW5jdGlvbi4gVGhlIGZvbGxvd2luZyB2YWx1ZXMgZm9yIHRoZSBmdW5jdGlvbiBhbmQgZ3JvdXBzIHByb3BlcnRpZXMgYXJlCitzdXBwb3J0ZWQ6CisKK2FzcGVlZCxhc3QyNDAwLXBpbmN0cmwsIGFzcGVlZCxnNC1waW5jdHJsOgorCitBQ1BJIEJNQ0lOVCBERENDTEsgRERDREFUIEZMQUNLIEZMQlVTWSBGTFdQIEdQSUQwIEdQSUUwIEdQSUUyIEdQSUU0IEdQSUU2IEkyQzEwCitJMkMxMSBJMkMxMiBJMkMxMyBJMkMzIEkyQzQgSTJDNSBJMkM2IEkyQzcgSTJDOCBJMkM5IExQQ1BEIExQQ1BNRSBMUENTTUkgTURJTzEKK01ESU8yIE5DVFMxIE5DVFMzIE5DVFM0IE5EQ0QxIE5EQ0QzIE5EQ0Q0IE5EU1IxIE5EU1IzIE5EVFIxIE5EVFIzIE5SSTEgTlJJMworTlJJNCBOUlRTMSBOUlRTMyBQV00wIFBXTTEgUFdNMiBQV00zIFBXTTQgUFdNNSBQV002IFBXTTcgUkdNSUkxIFJNSUkxIFJPTTE2CitST004IFJPTUNTMSBST01DUzIgUk9NQ1MzIFJPTUNTNCBSWEQxIFJYRDMgUlhENCBTRDEgU0dQTUkgU0lPUEJJIFNJT1BCTyBUSU1FUjMKK1RJTUVSNSBUSU1FUjYgVElNRVI3IFRJTUVSOCBUWEQxIFRYRDMgVFhENCBVQVJUNiBWR0FIUyBWR0FWUyBWUEkxOCBWUEkyNCBWUEkzMAorVlBPMTIgVlBPMjQKKworYXNwZWVkLGFzdDI1MDAtcGluY3RybCwgYXNwZWVkLGc1LXBpbmN0cmw6CisKK0dQSUQwIEdQSUQyIEdQSUUwIEkyQzEwIEkyQzExIEkyQzEyIEkyQzEzIEkyQzE0IEkyQzMgSTJDNCBJMkM1IEkyQzYgSTJDNyBJMkM4CitJMkM5IE1BQzFMSU5LIE1ESU8xIE1ESU8yIE9TQ0NMSyBQRVdBS0UgUFdNMCBQV00xIFBXTTIgUFdNMyBQV000IFBXTTUgUFdNNiBQV003CitSR01JSTEgUkdNSUkyIFJNSUkxIFJNSUkyIFNEMSBTUEkxIFRJTUVSNCBUSU1FUjUgVElNRVI2IFRJTUVSNyBUSU1FUjgKKworRXhhbXBsZXM6CisKK3N5c2Nvbjogc2N1QDFlNmUyMDAwIHsKKwljb21wYXRpYmxlID0gInN5c2NvbiIsICJzaW1wbGUtbWZkIjsKKwlyZWcgPSA8MHgxZTZlMjAwMCAweDFhOD47CisKKwlwaW5jdHJsOiBwaW5jdHJsIHsKKwkJY29tcGF0aWJsZSA9ICJhc3BlZWQsZzQtcGluY3RybCI7CisKKwkJcGluY3RybF9pMmMzX2RlZmF1bHQ6IGkyYzNfZGVmYXVsdCB7CisJCQlmdW5jdGlvbiA9ICJJMkMzIjsKKwkJCWdyb3VwcyA9ICJJMkMzIjsKKwkJfTsKKwl9OworfTsKKworUGxlYXNlIHJlZmVyIHRvIHBpbmN0cmwtYmluZGluZ3MudHh0IGluIHRoaXMgZGlyZWN0b3J5IGZvciBkZXRhaWxzIG9mIHRoZQorY29tbW9uIHBpbmN0cmwgYmluZGluZ3MgdXNlZCBieSBjbGllbnQgZGV2aWNlcy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3BpbmN0cmwtc3QudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcGluY3RybC1zdC50eHQKaW5kZXggMjZiY2IxOC4uMDEzYzY3NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcGluY3RybC1zdC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcGluY3RybC1zdC50eHQKQEAgLTMwLDggKzMwLDcgQEAKIAogUGluIGNvbnRyb2xsZXIgbm9kZToKIFJlcXVpcmVkIHByb3BlcnRpZXM6Ci0tIGNvbXBhdGlibGUJOiBzaG91bGQgYmUgInN0LDxTT0M+LTxwaW8tYmxvY2s+LXBpbmN0cmwiCi0JbGlrZSBzdCxzdGloNDE1LXNiYy1waW5jdHJsLCBzdCxzdGloNDE1LWZyb250LXBpbmN0cmwgYW5kIHNvIG9uLgorLSBjb21wYXRpYmxlCTogc2hvdWxkIGJlICJzdCxzdGloNDA3LTxwaW8tYmxvY2s+LXBpbmN0cmwiCiAtIHN0LHN5c2NmZwkJOiBTaG91bGQgYmUgYSBwaGFuZGxlIG9mIHRoZSBzeXNjZmcgbm9kZS4KIC0gc3QscmV0aW1lLXBpbi1tYXNrCTogU2hvdWxkIGJlIG1hc2sgdG8gc3BlY2lmeSB3aGljaCBwaW5zIGNhbiBiZSByZXRpbWVkLgogCUlmIHRoZSBwcm9wZXJ0eSBpcyBub3QgcHJlc2VudCwgaXQgaXMgYXNzdW1lZCB0aGF0IGFsbCB0aGUgcGlucyBpbiB0aGUKQEAgLTUwLDcgKzQ5LDExIEBACiBHUElPIGNvbnRyb2xsZXIvYmFuayBub2RlLgogUmVxdWlyZWQgcHJvcGVydGllczoKIC0gZ3Bpby1jb250cm9sbGVyIDogSW5kaWNhdGVzIHRoaXMgZGV2aWNlIGlzIGEgR1BJTyBjb250cm9sbGVyCi0tICNncGlvLWNlbGxzCSAgOiBTaG91bGQgYmUgb25lLiBUaGUgZmlyc3QgY2VsbCBpcyB0aGUgcGluIG51bWJlci4KKy0gI2dwaW8tY2VsbHMJICA6IE11c3QgYmUgdHdvLgorICAgICAtIEZpcnN0IGNlbGw6IHNwZWNpZmllcyB0aGUgcGluIG51bWJlciBpbnNpZGUgdGhlIGNvbnRyb2xsZXIKKyAgICAgLSBTZWNvbmQgY2VsbDogc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHBpbiBpcyBsb2dpY2FsbHkgaW52ZXJ0ZWQuCisgICAgICAgLSAwID0gYWN0aXZlIGhpZ2gKKyAgICAgICAtIDEgPSBhY3RpdmUgbG93CiAtIHN0LGJhbmstbmFtZQkgIDogU2hvdWxkIGJlIGEgbmFtZSBzdHJpbmcgZm9yIHRoaXMgYmFuayBhcyBzcGVjaWZpZWQgaW4KICAgZGF0YXNoZWV0LgogCkBAIC03NiwyMyArNzksMjMgQEAKIAogRXhhbXBsZToKIAlwaW4tY29udHJvbGxlci1zYmMgewotCQkjYWRkcmVzcy1jZWxscwk9IDwxPjsKLQkJI3NpemUtY2VsbHMJPSA8MT47Ci0JCWNvbXBhdGlibGUJPSAic3Qsc3RpaDQxNS1zYmMtcGluY3RybCI7Ci0JCXN0LHN5c2NmZwk9IDwmc3lzY2ZnX3NiYz47Ci0JCXJlZyAJCT0gPDB4ZmU2MWYwODAgMHg0PjsKLQkJcmVnLW5hbWVzCT0gImlycW11eCI7Ci0JCWludGVycnVwdHMgCT0gPEdJQ19TUEkgMTgwIElSUV9UWVBFX0xFVkVMX0hJR0g+OwotCQlpbnRlcnJ1cHQtbmFtZXMJPSAiaXJxbXV4IjsKLQkJcmFuZ2VzIAkJPSA8MCAweGZlNjEwMDAwIDB4NTAwMD47CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJY29tcGF0aWJsZSA9ICJzdCxzdGloNDA3LXNiYy1waW5jdHJsIjsKKwkJc3Qsc3lzY2ZnID0gPCZzeXNjZmdfc2JjPjsKKwkJcmVnID0gPDB4MDk2MWYwODAgMHg0PjsKKwkJcmVnLW5hbWVzID0gImlycW11eCI7CisJCWludGVycnVwdHMgPSA8R0lDX1NQSSAxODggSVJRX1RZUEVfTk9ORT47CisJCWludGVycnVwdC1uYW1lcyA9ICJpcnFtdXgiOworCQlyYW5nZXMgPSA8MCAweDA5NjEwMDAwIDB4NjAwMD47CiAKLQkJUElPMDogZ3Bpb0BmZTYxMDAwMCB7CisJCXBpbzA6IGdwaW9AMDk2MTAwMDAgewogCQkJZ3Bpby1jb250cm9sbGVyOwotCQkJI2dwaW8tY2VsbHMJPSA8MT47CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKIAkJCWludGVycnVwdC1jb250cm9sbGVyOwogCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKLQkJCXJlZwkJPSA8MCAweDEwMD47Ci0JCQlzdCxiYW5rLW5hbWUJPSAiUElPMCI7CisJCQlyZWcgPSA8MHgwIDB4MTAwPjsKKwkJCXN0LGJhbmstbmFtZSA9ICJQSU8wIjsKIAkJfTsKIAkJLi4uCiAJCXBpbi1mdW5jdGlvbnMgbm9kZXMgZm9sbG93Li4uCkBAIC0xNjIsNyArMTY1LDcgQEAKIAogc2RoY2kwOnNkaGNpQGZlODEwMDAwewogCS4uLgotCWludGVycnVwdC1wYXJlbnQgPSA8JlBJTzM+OworCWludGVycnVwdC1wYXJlbnQgPSA8JnBpbzM+OwogCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CiAJaW50ZXJydXB0cyA9IDwzIElSUV9UWVBFX0xFVkVMX0hJR0g+OyAvKiBJbnRlcnJ1cHQgbGluZSB2aWEgUElPMy0zICovCiAJaW50ZXJydXB0LW5hbWVzID0gImNhcmQtZGV0ZWN0IjsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3Fjb20scG1pYy1ncGlvLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3Fjb20scG1pYy1ncGlvLnR4dAppbmRleCBhNTRjMzllLi44ZDg5M2E4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9xY29tLHBtaWMtZ3Bpby50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcWNvbSxwbWljLWdwaW8udHh0CkBAIC0xNyw2ICsxNyw5IEBACiAJCSAgICAicWNvbSxwbTg5OTQtZ3BpbyIKIAkJICAgICJxY29tLHBtYTgwODQtZ3BpbyIKIAorCQkgICAgQW5kIG11c3QgY29udGFpbiBlaXRoZXIgInFjb20sc3BtaS1ncGlvIiBvciAicWNvbSxzc2JpLWdwaW8iCisJCSAgICBpZiB0aGUgZGV2aWNlIGlzIG9uIGFuIHNwbWkgYnVzIG9yIGFuIHNzYmkgYnVzIHJlc3BlY3RpdmVseQorCiAtIHJlZzoKIAlVc2FnZTogcmVxdWlyZWQKIAlWYWx1ZSB0eXBlOiA8cHJvcC1lbmNvZGVkLWFycmF5PgpAQCAtMTgzLDcgKzE4Niw3IEBACiBFeGFtcGxlOgogCiAJcG04OTIxX2dwaW86IGdwaW9AMTUwIHsKLQkJY29tcGF0aWJsZSA9ICJxY29tLHBtODkyMS1ncGlvIjsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHBtODkyMS1ncGlvIiwgInFjb20sc3NiaS1ncGlvIjsKIAkJcmVnID0gPDB4MTUwIDB4MTYwPjsKIAkJaW50ZXJydXB0cyA9IDwxOTIgMT4sIDwxOTMgMT4sIDwxOTQgMT4sCiAJCQkgICAgIDwxOTUgMT4sIDwxOTYgMT4sIDwxOTcgMT4sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9xY29tLHBtaWMtbXBwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3Fjb20scG1pYy1tcHAudHh0CmluZGV4IGI0ODRiYTEuLjJhYjk1YmMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3Fjb20scG1pYy1tcHAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3Fjb20scG1pYy1tcHAudHh0CkBAIC0xOSw2ICsxOSw5IEBACiAJCSAgICAicWNvbSxwbTg5OTQtbXBwIiwKIAkJICAgICJxY29tLHBtYTgwODQtbXBwIiwKIAorCQkgICAgQW5kIG11c3QgY29udGFpbiBlaXRoZXIgInFjb20sc3BtaS1tcHAiIG9yICJxY29tLHNzYmktbXBwIgorCQkgICAgaWYgdGhlIGRldmljZSBpcyBvbiBhbiBzcG1pIGJ1cyBvciBhbiBzc2JpIGJ1cyByZXNwZWN0aXZlbHkuCisKIC0gcmVnOgogCVVzYWdlOiByZXF1aXJlZAogCVZhbHVlIHR5cGU6IDxwcm9wLWVuY29kZWQtYXJyYXk+CkBAIC0xNTgsNyArMTYxLDcgQEAKIEV4YW1wbGU6CiAKIAltcHBzQGEwMDAgewotCQljb21wYXRpYmxlID0gInFjb20scG04ODQxLW1wcCI7CisJCWNvbXBhdGlibGUgPSAicWNvbSxwbTg4NDEtbXBwIiwgInFjb20sc3BtaS1tcHAiOwogCQlyZWcgPSA8MHhhMDAwPjsKIAkJZ3Bpby1jb250cm9sbGVyOwogCQkjZ3Bpby1jZWxscyA9IDwyPjsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3JlbmVzYXMscGZjLXBpbmN0cmwudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcmVuZXNhcyxwZmMtcGluY3RybC50eHQKaW5kZXggZTRjZjAyMi4uMTNkZjk0OSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcmVuZXNhcyxwZmMtcGluY3RybC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcmVuZXNhcyxwZmMtcGluY3RybC50eHQKQEAgLTE3LDkgKzE3LDExIEBACiAgICAgLSAicmVuZXNhcyxwZmMtcjhhNzc3OSI6IGZvciBSOEE3Nzc5IChSLUNhciBIMSkgY29tcGF0aWJsZSBwaW4tY29udHJvbGxlci4KICAgICAtICJyZW5lc2FzLHBmYy1yOGE3NzkwIjogZm9yIFI4QTc3OTAgKFItQ2FyIEgyKSBjb21wYXRpYmxlIHBpbi1jb250cm9sbGVyLgogICAgIC0gInJlbmVzYXMscGZjLXI4YTc3OTEiOiBmb3IgUjhBNzc5MSAoUi1DYXIgTTItVykgY29tcGF0aWJsZSBwaW4tY29udHJvbGxlci4KKyAgICAtICJyZW5lc2FzLHBmYy1yOGE3NzkyIjogZm9yIFI4QTc3OTIgKFItQ2FyIFYySCkgY29tcGF0aWJsZSBwaW4tY29udHJvbGxlci4KICAgICAtICJyZW5lc2FzLHBmYy1yOGE3NzkzIjogZm9yIFI4QTc3OTMgKFItQ2FyIE0yLU4pIGNvbXBhdGlibGUgcGluLWNvbnRyb2xsZXIuCiAgICAgLSAicmVuZXNhcyxwZmMtcjhhNzc5NCI6IGZvciBSOEE3Nzk0IChSLUNhciBFMikgY29tcGF0aWJsZSBwaW4tY29udHJvbGxlci4KICAgICAtICJyZW5lc2FzLHBmYy1yOGE3Nzk1IjogZm9yIFI4QTc3OTUgKFItQ2FyIEgzKSBjb21wYXRpYmxlIHBpbi1jb250cm9sbGVyLgorICAgIC0gInJlbmVzYXMscGZjLXI4YTc3OTYiOiBmb3IgUjhBNzc5NiAoUi1DYXIgTTMtVykgY29tcGF0aWJsZSBwaW4tY29udHJvbGxlci4KICAgICAtICJyZW5lc2FzLHBmYy1zaDczYTAiOiBmb3IgU0g3M0EwIChTSC1Nb2JpbGUgQUc1KSBjb21wYXRpYmxlIHBpbi1jb250cm9sbGVyLgogCiAgIC0gcmVnOiBCYXNlIGFkZHJlc3MgYW5kIGxlbmd0aCBvZiBlYWNoIG1lbW9yeSByZXNvdXJjZSB1c2VkIGJ5IHRoZSBwaW4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3N0LHN0bTMyLXBpbmN0cmwudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvc3Qsc3RtMzItcGluY3RybC50eHQKaW5kZXggNTg3YmZmYi4uZjk3NTNjNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvc3Qsc3RtMzItcGluY3RybC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvc3Qsc3RtMzItcGluY3RybC50eHQKQEAgLTE0LDYgKzE0LDExIEBACiAgLSAjc2l6ZS1jZWxscwk6IFRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IG11c3QgYmUgMQogIC0gcmFuZ2VzCTogZGVmaW5lcyBtYXBwaW5nIGJldHdlZW4gcGluIGNvbnRyb2xsZXIgbm9kZSAocGFyZW50KSB0bwogICAgZ3Bpby1iYW5rIG5vZGUgKGNoaWxkcmVuKS4KKyAtIGludGVycnVwdC1wYXJlbnQ6IHBoYW5kbGUgb2YgdGhlIGludGVycnVwdCBwYXJlbnQgdG8gd2hpY2ggdGhlIGV4dGVybmFsCisgICBHUElPIGludGVycnVwdHMgYXJlIGZvcndhcmRlZCB0by4KKyAtIHN0LHN5c2NmZzogU2hvdWxkIGJlIHBoYW5kbGUvb2Zmc2V0IHBhaXIuIFRoZSBwaGFuZGxlIHRvIHRoZSBzeXNjb24gbm9kZQorICAgd2hpY2ggaW5jbHVkZXMgSVJRIG11eCBzZWxlY3Rpb24gcmVnaXN0ZXIsIGFuZCB0aGUgb2Zmc2V0IG9mIHRoZSBJUlEgbXV4CisgICBzZWxlY3Rpb24gcmVnaXN0ZXIuCiAgLSBwaW5zLWFyZS1udW1iZXJlZDogU3BlY2lmeSB0aGUgc3Vibm9kZXMgYXJlIHVzaW5nIG51bWJlcmVkIHBpbm11eCB0bwogICAgc3BlY2lmeSBwaW5zLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvYWN0ODk0NWEtY2hhcmdlci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvYWN0ODk0NWEtY2hhcmdlci50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYTI1NGMuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL2FjdDg5NDVhLWNoYXJnZXIudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotRGV2aWNlLVRyZWUgYmluZGluZ3MgZm9yIGNoYXJnZXIgb2YgQWN0aXZlLXNlbWkgQUNUODk0NUEgTXVsdGktRnVuY3Rpb24gRGV2aWNlCi0KLVJlcXVpcmVkIHByb3BlcnRpZXM6Ci0gLSBjb21wYXRpYmxlOiAiYWN0aXZlLXNlbWksYWN0ODk0NWEiLCBwbGVhc2UgcmVmZXIgdG8gLi4vbWZkL2FjdDg5NDVhLnR4dC4KLSAtIGFjdGl2ZS1zZW1pLGNoZ2xldi1ncGlvczogY2hhcmdlIGN1cnJlbnQgbGV2ZWwgcGhhbmRsZSB3aXRoIGFyZ3MKLSAgIGFzIGRlc2NyaWJlZCBpbiAuLi9ncGlvL2dwaW8udHh0LgotCi1PcHRpb25hbCBwcm9wZXJ0aWVzOgotIC0gYWN0aXZlLXNlbWksY2hlY2stYmF0dGVyeS10ZW1wZXJhdHVyZTogYm9vbGVhbiB0byBjaGVjayB0aGUgYmF0dGVyeQotICAgdGVtcGVyYXR1cmUgb3Igbm90LgotIC0gYWN0aXZlLXNlbWksaW5wdXQtdm9sdGFnZS10aHJlc2hvbGQtbWljcm92b2x0OiB1bml0OiBtVjsKLSAgIFNwZWNpZmllcyB0aGUgY2hhcmdlcidzIGlucHV0IG92ZXItdm9sdGFnZSB0aHJlc2hvbGQgdmFsdWU7Ci0gICBUaGUgdmFsdWUgY2FuIGJlOiA2NjAwLCA3MDAwLCA3NTAwLCA4MDAwOyBkZWZhdWx0OiA2NjAwCi0gLSBhY3RpdmUtc2VtaSxwcmVjb25kaXRpb24tdGltZW91dDogdW5pdDogbWludXRlczsKLSAgIFNwZWNpZmllcyB0aGUgY2hhcmdlcidzIFBSRUNPTkRJVElPTiBzYWZldHkgdGltZXIgc2V0dGluZyB2YWx1ZTsKLSAgIFRoZSB2YWx1ZSBjYW4gYmU6IDQwLCA2MCwgODAsIDA7IElmIDAsIGl0IG1lYW5zIHRvIGRpc2FibGUgdGhpcyB0aW1lcjsKLSAgIGRlZmF1bHQ6IDQwLgotIC0gYWN0aXZlLXNlbWksdG90YWwtdGltZW91dDogdW5pdDogaG91cnM7Ci0gICBTcGVjaWZpZXMgdGhlIGNoYXJnZXIncyB0b3RhbCBzYWZldHkgdGltZXIgc2V0dGluZyB2YWx1ZTsKLSAgIFRoZSB2YWx1ZSBjYW4gYmU6IDMsIDQsIDUsIDA7IElmIDAsIGl0IG1lYW5zIHRvIGRpc2FibGUgdGhpcyB0aW1lcjsKLSAgIGRlZmF1bHQ6IDMuCi0KLUV4YW1wbGU6Ci0JcG1pY0A1YiB7Ci0JCWNvbXBhdGlibGUgPSAiYWN0aXZlLXNlbWksYWN0ODk0NWEiOwotCQlyZWcgPSA8MHg1Yj47Ci0JCXN0YXR1cyA9ICJva2F5IjsKLQotCQlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOwotCQlwaW5jdHJsLTAgPSA8JnBpbmN0cmxfY2hhcmdlcl9jaGdsZXY+OwotCQlhY3RpdmUtc2VtaSxjaGdsZXYtZ3Bpb3MgPSA8JnBpb0EgMTIgR1BJT19BQ1RJVkVfSElHSD47Ci0JCWFjdGl2ZS1zZW1pLGlucHV0LXZvbHRhZ2UtdGhyZXNob2xkLW1pY3Jvdm9sdCA9IDw2NjAwPjsKLQkJYWN0aXZlLXNlbWkscHJlY29uZGl0aW9uLXRpbWVvdXQgPSA8NDA+OwotCQlhY3RpdmUtc2VtaSx0b3RhbC10aW1lb3V0ID0gPDM+OwotCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L2F4eGlhLXJlc2V0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9yZXNldC9heHhpYS1yZXNldC50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvYXh4aWEtcmVzZXQudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvcmVzZXQvYXh4aWEtcmVzZXQudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L2lteC1zbnZzLXBvd2Vyb2ZmLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9yZXNldC9pbXgtc252cy1wb3dlcm9mZi50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvaW14LXNudnMtcG93ZXJvZmYudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvcmVzZXQvaW14LXNudnMtcG93ZXJvZmYudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L21zbS1wb3dlcm9mZi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvcmVzZXQvbXNtLXBvd2Vyb2ZmLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS9tc20tcG93ZXJvZmYudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvcmVzZXQvbXNtLXBvd2Vyb2ZmLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS9xbmFwLXBvd2Vyb2ZmLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9yZXNldC9xbmFwLXBvd2Vyb2ZmLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS9xbmFwLXBvd2Vyb2ZmLnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3Jlc2V0L3FuYXAtcG93ZXJvZmYudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L3Jlc3RhcnQtcG93ZXJvZmYudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3Jlc2V0L3Jlc3RhcnQtcG93ZXJvZmYudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L3Jlc3RhcnQtcG93ZXJvZmYudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvcmVzZXQvcmVzdGFydC1wb3dlcm9mZi50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9yZXNldC9zdC1yZXNldC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvcmVzZXQvc3QtcmVzZXQudHh0CmluZGV4IDgwOWFmNTQuLjgzNzM0ZGMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9yZXNldC9zdC1yZXNldC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3Jlc2V0L3N0LXJlc2V0LnR4dApAQCAtMSwxMSArMSwxMiBAQAogKkRldmljZS1UcmVlIGJpbmRpbmdzIGZvciBTVCBTVyByZXNldCBmdW5jdGlvbmFsaXR5CiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6Ci0tIGNvbXBhdGlibGU6IHNob3VsZCBiZSAic3QsPGNoaXA+LXJlc3RhcnQiLgorLSBjb21wYXRpYmxlOiBzaG91bGQgYmUgInN0aWg0MDctcmVzdGFydCIuCiAtIHN0LHN5c2NmZzogc2hvdWxkIGJlIGEgcGhhbmRsZSBvZiB0aGUgc3lzY2ZnIG5vZGUuCiAKIEV4YW1wbGUgbm9kZToKIAlyZXN0YXJ0IHsKLQkJY29tcGF0aWJsZSA9ICJzdCxzdGloNDE2LXJlc3RhcnQiOwotCQlzdCxzeXNjZmcgPSA8JnN5c2NmZ19zYmM+OworCQljb21wYXRpYmxlID0gInN0LHN0aWg0MDctcmVzdGFydCI7CisJCXN0LHN5c2NmZyA9IDwmc3lzY2ZnX3NiY19yZWc+OworCQlzdGF0dXMgPSAib2theSI7CiAJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvYWI4NTAwL2J0ZW1wLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvYWI4NTAwL2J0ZW1wLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS9hYjg1MDAvYnRlbXAudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L2FiODUwMC9idGVtcC50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvYWI4NTAwL2NoYXJnYWxnLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvYWI4NTAwL2NoYXJnYWxnLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS9hYjg1MDAvY2hhcmdhbGcudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L2FiODUwMC9jaGFyZ2FsZy50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvYWI4NTAwL2NoYXJnZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9hYjg1MDAvY2hhcmdlci50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvYWI4NTAwL2NoYXJnZXIudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L2FiODUwMC9jaGFyZ2VyLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS9hYjg1MDAvZmcudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9hYjg1MDAvZmcudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L2FiODUwMC9mZy50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvYWI4NTAwL2ZnLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9hY3Q4OTQ1YS1jaGFyZ2VyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvYWN0ODk0NWEtY2hhcmdlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU3OGQ3NgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvYWN0ODk0NWEtY2hhcmdlci50eHQKQEAgLTAsMCArMSw0OCBAQAorRGV2aWNlLVRyZWUgYmluZGluZ3MgZm9yIGNoYXJnZXIgb2YgQWN0aXZlLXNlbWkgQUNUODk0NUEgTXVsdGktRnVuY3Rpb24gRGV2aWNlCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisgLSBjb21wYXRpYmxlOiAiYWN0aXZlLXNlbWksYWN0ODk0NWEtY2hhcmdlciIuCisgLSBhY3RpdmUtc2VtaSxjaGdsZXYtZ3Bpb3M6IGNoYXJnZSBjdXJyZW50IGxldmVsIHBoYW5kbGUgd2l0aCBhcmdzCisgICBhcyBkZXNjcmliZWQgaW4gLi4vZ3Bpby9ncGlvLnR4dC4KKyAtIGFjdGl2ZS1zZW1pLGxiby1ncGlvczogc3BlY2lmeSB0aGUgbG93IGJhdHRlcnkgdm9sdGFnZSBkZXRlY3QgcGhhbmRsZQorICAgd2l0aCBhcmdzIGFzIGFzIGRlc2NyaWJlZCBpbiAuLi9ncGlvL2dwaW8udHh0LgorIC0gaW50ZXJydXB0czogPGEgYj4gd2hlcmUgYSBpcyB0aGUgaW50ZXJydXB0IG51bWJlciBhbmQgYiBpcyBhCisgICBmaWVsZCB0aGF0IHJlcHJlc2VudHMgYW4gZW5jb2Rpbmcgb2YgdGhlIHNlbnNlIGFuZCBsZXZlbAorICAgaW5mb3JtYXRpb24gZm9yIHRoZSBpbnRlcnJ1cHQuCisgLSBpbnRlcnJ1cHQtcGFyZW50OiB0aGUgcGhhbmRsZSBmb3IgdGhlIGludGVycnVwdCBjb250cm9sbGVyIHRoYXQKKyAgIHNlcnZpY2VzIGludGVycnVwdHMgZm9yIHRoaXMgZGV2aWNlLgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorIC0gYWN0aXZlLXNlbWksaW5wdXQtdm9sdGFnZS10aHJlc2hvbGQtbWljcm92b2x0OiB1bml0OiBtVjsKKyAgIFNwZWNpZmllcyB0aGUgY2hhcmdlcidzIGlucHV0IG92ZXItdm9sdGFnZSB0aHJlc2hvbGQgdmFsdWU7CisgICBUaGUgdmFsdWUgY2FuIGJlOiA2NjAwLCA3MDAwLCA3NTAwLCA4MDAwOyBkZWZhdWx0OiA2NjAwCisgLSBhY3RpdmUtc2VtaSxwcmVjb25kaXRpb24tdGltZW91dDogdW5pdDogbWludXRlczsKKyAgIFNwZWNpZmllcyB0aGUgY2hhcmdlcidzIFBSRUNPTkRJVElPTiBzYWZldHkgdGltZXIgc2V0dGluZyB2YWx1ZTsKKyAgIFRoZSB2YWx1ZSBjYW4gYmU6IDQwLCA2MCwgODAsIDA7IElmIDAsIGl0IG1lYW5zIHRvIGRpc2FibGUgdGhpcyB0aW1lcjsKKyAgIGRlZmF1bHQ6IDQwLgorIC0gYWN0aXZlLXNlbWksdG90YWwtdGltZW91dDogdW5pdDogaG91cnM7CisgICBTcGVjaWZpZXMgdGhlIGNoYXJnZXIncyB0b3RhbCBzYWZldHkgdGltZXIgc2V0dGluZyB2YWx1ZTsKKyAgIFRoZSB2YWx1ZSBjYW4gYmU6IDMsIDQsIDUsIDA7IElmIDAsIGl0IG1lYW5zIHRvIGRpc2FibGUgdGhpcyB0aW1lcjsKKyAgIGRlZmF1bHQ6IDMuCisKK0V4YW1wbGU6CisJcG1pY0A1YiB7CisJCWNvbXBhdGlibGUgPSAiYWN0aXZlLXNlbWksYWN0ODk0NWEiOworCQlyZWcgPSA8MHg1Yj47CisJCXN0YXR1cyA9ICJva2F5IjsKKworCQljaGFyZ2VyIHsKKwkJCWNvbXBhdGlibGUgPSAiYWN0aXZlLXNlbWksYWN0ODk0NWEtY2hhcmdlciI7CisJCQlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOworCQkJcGluY3RybC0wID0gPCZwaW5jdHJsX2NoYXJnZXJfY2hnbGV2ICZwaW5jdHJsX2NoYXJnZXJfbGJvICZwaW5jdHJsX2NoYXJnZXJfaXJxPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JnBpb0E+OworCQkJaW50ZXJydXB0cyA9IDw0NSBHUElPX0FDVElWRV9MT1c+OworCisJCQlhY3RpdmUtc2VtaSxjaGdsZXYtZ3Bpb3MgPSA8JnBpb0EgMTIgR1BJT19BQ1RJVkVfSElHSD47CisJCQlhY3RpdmUtc2VtaSxsYm8tZ3Bpb3MgPSA8JnBpb0EgNzIgR1BJT19BQ1RJVkVfTE9XPjsKKwkJCWFjdGl2ZS1zZW1pLGlucHV0LXZvbHRhZ2UtdGhyZXNob2xkLW1pY3Jvdm9sdCA9IDw2NjAwPjsKKwkJCWFjdGl2ZS1zZW1pLHByZWNvbmRpdGlvbi10aW1lb3V0ID0gPDQwPjsKKwkJCWFjdGl2ZS1zZW1pLHRvdGFsLXRpbWVvdXQgPSA8Mz47CisJCQlzdGF0dXMgPSAib2theSI7CisJCX07CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvYXhwMjB4X3VzYl9wb3dlci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L2F4cDIweF91c2JfcG93ZXIudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L2F4cDIweF91c2JfcG93ZXIudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L2F4cDIweF91c2JfcG93ZXIudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvYnEyNDE1eC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L2JxMjQxNXgudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvYnEyNDE1eC50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvYnEyNDE1eC50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9icTI0MjU3LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvYnEyNDI1Ny50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9icTI0MjU3LnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9icTI0MjU3LnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL2JxMjU4OTAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9icTI1ODkwLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL2JxMjU4OTAudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L2JxMjU4OTAudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L2NoYXJnZXItbWFuYWdlci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L2NoYXJnZXItbWFuYWdlci50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvY2hhcmdlci1tYW5hZ2VyLnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9jaGFyZ2VyLW1hbmFnZXIudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvZGE5MTUwLWNoYXJnZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9kYTkxNTAtY2hhcmdlci50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9kYTkxNTAtY2hhcmdlci50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvZGE5MTUwLWNoYXJnZXIudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvZGE5MTUwLWZnLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvZGE5MTUwLWZnLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL2RhOTE1MC1mZy50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvZGE5MTUwLWZnLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS9ncGlvLWNoYXJnZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9ncGlvLWNoYXJnZXIudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L2dwaW8tY2hhcmdlci50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvZ3Bpby1jaGFyZ2VyLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL2lzcDE3MDQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9pc3AxNzA0LnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL2lzcDE3MDQudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L2lzcDE3MDQudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L2xwODcyN19jaGFyZ2VyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvbHA4NzI3X2NoYXJnZXIudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L2xwODcyN19jaGFyZ2VyLnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9scDg3MjdfY2hhcmdlci50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9sdGMyOTQxLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvbHRjMjk0MS50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9sdGMyOTQxLnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9sdGMyOTQxLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS9tYXgxNzA0Ml9iYXR0ZXJ5LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvbWF4MTcwNDJfYmF0dGVyeS50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvbWF4MTcwNDJfYmF0dGVyeS50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvbWF4MTcwNDJfYmF0dGVyeS50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvbWF4ODkyNV9iYXR0ZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9tYXg4OTI1X2JhdHRlci50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvbWF4ODkyNV9iYXR0ZXIudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L21heDg5MjVfYmF0dGVyLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS9vbHBjX2JhdHRlcnkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9vbHBjX2JhdHRlcnkudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L29scGNfYmF0dGVyeS50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvb2xwY19iYXR0ZXJ5LnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS9wb3dlcl9zdXBwbHkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9wb3dlcl9zdXBwbHkudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L3Bvd2VyX3N1cHBseS50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvcG93ZXJfc3VwcGx5LnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3Fjb20sY29pbmNlbGwtY2hhcmdlci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L3Fjb20sY29pbmNlbGwtY2hhcmdlci50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9xY29tLGNvaW5jZWxsLWNoYXJnZXIudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L3Fjb20sY29pbmNlbGwtY2hhcmdlci50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvcWNvbV9zbWJiLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvcWNvbV9zbWJiLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS9xY29tX3NtYmIudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L3Fjb21fc21iYi50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9ydDk0NTVfY2hhcmdlci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L3J0OTQ1NV9jaGFyZ2VyLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3J0OTQ1NV9jaGFyZ2VyLnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9ydDk0NTVfY2hhcmdlci50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9yeDUxLWJhdHRlcnkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9yeDUxLWJhdHRlcnkudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvcng1MS1iYXR0ZXJ5LnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9yeDUxLWJhdHRlcnkudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L3Nic19zYnMtYmF0dGVyeS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L3Nic19zYnMtYmF0dGVyeS50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvc2JzX3Nicy1iYXR0ZXJ5LnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9zYnNfc2JzLWJhdHRlcnkudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L3RpLGJxMjQ3MzUudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS90aSxicTI0NzM1LnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS90aSxicTI0NzM1LnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS90aSxicTI0NzM1LnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS90cHM2NTA5MC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L3RwczY1MDkwLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS90cHM2NTA5MC50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvdHBzNjUwOTAudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L3RwczY1MjE3X2NoYXJnZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS90cHM2NTIxN19jaGFyZ2VyLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS90cHM2NTIxN19jaGFyZ2VyLnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS90cHM2NTIxN19jaGFyZ2VyLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3R3bC1jaGFyZ2VyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvdHdsLWNoYXJnZXIudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvdHdsLWNoYXJnZXIudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L3R3bC1jaGFyZ2VyLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VycGMvZnNsL21lbS1jdHJsci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJwYy9mc2wvbWVtLWN0cmxyLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg3ODU2Zi4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJwYy9mc2wvbWVtLWN0cmxyLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLUZyZWVzY2FsZSBERFIgbWVtb3J5IGNvbnRyb2xsZXIKLQotUHJvcGVydGllczoKLQotLSBjb21wYXRpYmxlCTogU2hvdWxkIGluY2x1ZGUgImZzbCxjaGlwLW1lbW9yeS1jb250cm9sbGVyIiB3aGVyZQotCQkgIGNoaXAgaXMgdGhlIHByb2Nlc3NvciAoYnNjOTEzMiwgbXBjODU3MiBldGMuKSwgb3IKLQkJICAiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyIi4KLS0gcmVnCQk6IEFkZHJlc3MgYW5kIHNpemUgb2YgRERSIGNvbnRyb2xsZXIgcmVnaXN0ZXJzCi0tIGludGVycnVwdHMJOiBFcnJvciBpbnRlcnJ1cHQgb2YgRERSIGNvbnRyb2xsZXIKLQotRXhhbXBsZSAxOgotCi0JbWVtb3J5LWNvbnRyb2xsZXJAMjAwMCB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLGJzYzkxMzItbWVtb3J5LWNvbnRyb2xsZXIiOwotCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47Ci0JCWludGVycnVwdHMgPSA8MTYgMiAxIDg+OwotCX07Ci0KLQotRXhhbXBsZSAyOgotCi0JZGRyMTogbWVtb3J5LWNvbnRyb2xsZXJAODAwMCB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyLXY0LjciLAotCQkJCSJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXIiOwotCQlyZWcgPSA8MHg4MDAwIDB4MTAwMD47Ci0JCWludGVycnVwdHMgPSA8MTYgMiAxIDIzPjsKLQl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9sdGMzNjc2LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvbHRjMzY3Ni50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRlYjM2NgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvbHRjMzY3Ni50eHQKQEAgLTAsMCArMSw5NCBAQAorTGluZWFyIFRlY2hub2xvZ3kgTFRDMzY3NiA4LW91dHB1dCByZWd1bGF0b3JzCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6ICJsbHRjLGx0YzM2NzYiCistIHJlZzogSTJDIHNsYXZlIGFkZHJlc3MKKworUmVxdWlyZWQgY2hpbGQgbm9kZToKKy0gcmVndWxhdG9yczogQ29udGFpbnMgZWlnaHQgcmVndWxhdG9yIGNoaWxkIG5vZGVzIHN3MSwgc3cyLCBzdzMsIHN3NCwKKyAgbGRvMSwgbGRvMiwgbGRvMywgYW5kIGxkbzQsIHNwZWNpZnlpbmcgdGhlIGluaXRpYWxpemF0aW9uIGRhdGEgYXMKKyAgZG9jdW1lbnRlZCBpbiBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL3JlZ3VsYXRvci50eHQuCisKK0VhY2ggcmVndWxhdG9yIGlzIGRlZmluZWQgdXNpbmcgdGhlIHN0YW5kYXJkIGJpbmRpbmcgZm9yIHJlZ3VsYXRvcnMuIFRoZQorbm9kZXMgZm9yIHN3MSwgc3cyLCBzdzMsIHN3NCwgbGRvMSwgbGRvMiBhbmQgbGRvNCBhZGRpdGlvbmFsbHkgbmVlZCB0byBzcGVjaWZ5Cit0aGUgcmVzaXN0b3IgdmFsdWVzIG9mIHRoZWlyIGV4dGVybmFsIGZlZWRiYWNrIHZvbHRhZ2UgZGl2aWRlcnM6CisKK1JlcXVpcmVkIHByb3BlcnRpZXMgKG5vdCBvbiBsZG8zKToKKy0gbGx0YyxmYi12b2x0YWdlLWRpdmlkZXI6IEFuIGFycmF5IG9mIHR3byBpbnRlZ2VycyBjb250YWluaW5nIHRoZSByZXNpc3RvcgorICB2YWx1ZXMgUjEgYW5kIFIyIG9mIHRoZSBmZWVkYmFjayB2b2x0YWdlIGRpdmlkZXIgaW4gb2htcy4KKworUmVndWxhdG9ycyBzdzEsIHN3Miwgc3czLCBzdzQgY2FuIHJlZ3VsYXRlIHRoZSBmZWVkYmFjayByZWZlcmVuY2UgZnJvbToKKzQxMi41bVYgdG8gODAwbVYgaW4gMTIuNSBtViBzdGVwcy4gVGhlIG91dHB1dCB2b2x0YWdlIHRodXMgcmFuZ2VzIGJldHdlZW4KKzAuNDEyNSAqICgxICsgUjEvUjIpIFYgYW5kIDAuOCAqICgxICsgUjEvUjIpIFYuCisKK1JlZ3VsYXRvcnMgbGRvMSwgbGRvMiwgYW5kIGxkbzQgaGF2ZSBhIGZpeGVkIDAuNzI1IFYgcmVmZXJlbmNlIGFuZCB0aHVzIG91dHB1dAorMC43MjUgKiAoMSArIFIxL1IyKSBWLiBUaGUgbGRvMyByZWd1bGF0b3IgaXMgZml4ZWQgdG8gMS44IFYuICBUaGUgbGRvMSBzdGFuZGJ5CityZWd1bGF0b3IgY2FuIG5vdCBiZSBkaXNhYmxlZCBhbmQgdGh1cyBzaG91bGQgaGF2ZSB0aGUgcmVndWxhdG9yLWFsd2F5cy1vbgorcHJvcGVydHkgc2V0LgorCitFeGFtcGxlOgorCisJbHRjMzY3NjogcG1pY0AzYyB7CisJCWNvbXBhdGlibGUgPSAibGx0YyxsdGMzNjc2IjsKKwkJcmVnID0gPDB4M2M+OworCisJCXJlZ3VsYXRvcnMgeworCQkJc3cxX3JlZzogc3cxIHsKKwkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDw2NzQ0MDA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDEzMDgwMDA+OworCQkJCWxsdGMsZmItdm9sdGFnZS1kaXZpZGVyID0gPDEyNzAwMCAyMDAwMDA+OworCQkJCXJlZ3VsYXRvci1yYW1wLWRlbGF5ID0gPDcwMDA+OworCQkJCXJlZ3VsYXRvci1ib290LW9uOworCQkJCXJlZ3VsYXRvci1hbHdheXMtb247CisJCQl9OworCisJCQlzdzJfcmVnOiBzdzIgeworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDEwMzMzMTA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDIwMDQwMD47CisJCQkJbGx0YyxmYi12b2x0YWdlLWRpdmlkZXIgPSA8MzAxMDAwIDIwMDAwMD47CisJCQkJcmVndWxhdG9yLXJhbXAtZGVsYXkgPSA8NzAwMD47CisJCQkJcmVndWxhdG9yLWJvb3Qtb247CisJCQkJcmVndWxhdG9yLWFsd2F5cy1vbjsKKwkJCX07CisKKwkJCXN3M19yZWc6IHN3MyB7CisJCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8Njc0NDAwPjsKKwkJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwxMzA4MDA+OworCQkJCWxsdGMsZmItdm9sdGFnZS1kaXZpZGVyID0gPDEyNzAwMCAyMDAwMDA+OworCQkJCXJlZ3VsYXRvci1yYW1wLWRlbGF5ID0gPDcwMDA+OworCQkJCXJlZ3VsYXRvci1ib290LW9uOworCQkJCXJlZ3VsYXRvci1hbHdheXMtb247CisJCQl9OworCisJCQlzdzRfcmVnOiBzdzQgeworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDg2ODMxMD47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MTY4NDAwPjsKKwkJCQlsbHRjLGZiLXZvbHRhZ2UtZGl2aWRlciA9IDwyMjEwMDAgMjAwMDAwPjsKKwkJCQlyZWd1bGF0b3ItcmFtcC1kZWxheSA9IDw3MDAwPjsKKwkJCQlyZWd1bGF0b3ItYm9vdC1vbjsKKwkJCQlyZWd1bGF0b3ItYWx3YXlzLW9uOworCQkJfTsKKworCQkJbGRvMl9yZWc6IGxkbzIgeworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDI0OTAzNzU+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDI0OTAzNzU+OworCQkJCWxsdGMsZmItdm9sdGFnZS1kaXZpZGVyID0gPDQ4NzAwMCAyMDAwMDA+OworCQkJCXJlZ3VsYXRvci1ib290LW9uOworCQkJCXJlZ3VsYXRvci1hbHdheXMtb247CisJCQl9OworCisJCQlsZG8zX3JlZzogbGRvMyB7CisJCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8MTgwMDAwMD47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MTgwMDAwMD47CisJCQkJcmVndWxhdG9yLWJvb3Qtb247CisJCQl9OworCisJCQlsZG80X3JlZzogbGRvNCB7CisJCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8MzAyMzI1MD47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MzAyMzI1MD47CisJCQkJbGx0YyxmYi12b2x0YWdlLWRpdmlkZXIgPSA8NjM0MDAwIDIwMDAwMD47CisJCQkJcmVndWxhdG9yLWJvb3Qtb247CisJCQkJcmVndWxhdG9yLWFsd2F5cy1vbjsKKwkJCX07CisJCX07CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvcHY4ODA4MC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL3B2ODgwODAudHh0CmluZGV4IDM4YTYxNDIuLmU2ZTRiOWMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvcHY4ODA4MC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9wdjg4MDgwLnR4dApAQCAtMSwyMiArMSwyOCBAQAogKiBQb3dlcnZlbnR1cmUgU2VtaWNvbmR1Y3RvciBQVjg4MDgwIFZvbHRhZ2UgUmVndWxhdG9yCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6Ci0tIGNvbXBhdGlibGU6ICJwdnMscHY4ODA4MCIuCi0tIHJlZzogSTJDIHNsYXZlIGFkZHJlc3MsIHVzdWFsbHkgMHg0OS4KKy0gY29tcGF0aWJsZTogTXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZywgZGVwZW5kaW5nIG9uIHRoZQorICBzaWxpY29uIHZlcnNpb246CisJLSAicHZzLHB2ODgwODAiIChERVBSRUNBVEVEKQorCisJLSAicHZzLHB2ODgwODAtYWEiIGZvciBQVjg4MDgwIEFBIG9yIEFCIHNpbGljb24KKwktICJwdnMscHY4ODA4MC1iYSIgZm9yIFBWODgwODAgQkEgb3IgQkIgc2lsaWNvbgorICBOT1RFOiBUaGUgdXNlIG9mIHRoZSBjb21wYXRpYmxlcyB3aXRoIG5vIHNpbGljb24gdmVyc2lvbiBpcyBkZXByZWNhdGVkLgorLSByZWc6IEkyQyBzbGF2ZSBhZGRyZXNzLCB1c3VhbGx5IDB4NDkKIC0gaW50ZXJydXB0czogdGhlIGludGVycnVwdCBvdXRwdXRzIG9mIHRoZSBjb250cm9sbGVyCiAtIHJlZ3VsYXRvcnM6IEEgbm9kZSB0aGF0IGhvdXNlcyBhIHN1Yi1ub2RlIGZvciBlYWNoIHJlZ3VsYXRvciB3aXRoaW4gdGhlCiAgIGRldmljZS4gRWFjaCBzdWItbm9kZSBpcyBpZGVudGlmaWVkIHVzaW5nIHRoZSBub2RlJ3MgbmFtZSwgd2l0aCB2YWxpZAogICB2YWx1ZXMgbGlzdGVkIGJlbG93LiBUaGUgY29udGVudCBvZiBlYWNoIHN1Yi1ub2RlIGlzIGRlZmluZWQgYnkgdGhlCiAgIHN0YW5kYXJkIGJpbmRpbmcgZm9yIHJlZ3VsYXRvcnM7IHNlZSByZWd1bGF0b3IudHh0LgotICBCVUNLMSwgQlVDSzIsIGFuZCBCVUNLMy4KKyAgQlVDSzEsIEJVQ0syLCBCVUNLMyBhbmQgSFZCVUNLLgogCiBPcHRpb25hbCBwcm9wZXJ0aWVzOgogLSBBbnkgb3B0aW9uYWwgcHJvcGVydHkgZGVmaW5lZCBpbiByZWd1bGF0b3IudHh0CiAKLUV4YW1wbGUKK0V4YW1wbGU6CiAKIAlwbWljOiBwdjg4MDgwQDQ5IHsKLQkJY29tcGF0aWJsZSA9ICJwdnMscHY4ODA4MCI7CisJCWNvbXBhdGlibGUgPSAicHZzLHB2ODgwODAtYmEiOwogCQlyZWcgPSA8MHg0OT47CiAJCWludGVycnVwdC1wYXJlbnQgPSA8JmdwaW8+OwogCQlpbnRlcnJ1cHRzID0gPDI0IDI0PjsKQEAgLTQ1LDUgKzUxLDEyIEBACiAJCQkJcmVndWxhdG9yLW1pbi1taWNyb2FtcCAJPSA8MTQ5NjAwMD47CiAJCQkJcmVndWxhdG9yLW1heC1taWNyb2FtcCAJPSA8NDE4OTAwMD47CiAJCQl9OworCisJCQlIVkJVQ0sgeworCQkJCXJlZ3VsYXRvci1uYW1lID0gImh2YnVjayI7CisJCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8ICAgNTAwMD47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MTI3NTAwMD47CisgCQkJfTsKIAkJfTsKIAl9OworCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL3JlZ3VsYXRvci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL3JlZ3VsYXRvci50eHQKaW5kZXggZWNmYzU5My4uNmFiNWFlZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9yZWd1bGF0b3IudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvcmVndWxhdG9yLnR4dApAQCAtMTMsNyArMTMsNyBAQAogLSByZWd1bGF0b3ItYWxsb3ctYnlwYXNzOiBhbGxvdyB0aGUgcmVndWxhdG9yIHRvIGdvIGludG8gYnlwYXNzIG1vZGUKIC0gcmVndWxhdG9yLWFsbG93LXNldC1sb2FkOiBhbGxvdyB0aGUgcmVndWxhdG9yIHBlcmZvcm1hbmNlIGxldmVsIHRvIGJlIGNvbmZpZ3VyZWQKIC0gPG5hbWU+LXN1cHBseTogcGhhbmRsZSB0byB0aGUgcGFyZW50IHN1cHBseS9yZWd1bGF0b3Igbm9kZQotLSByZWd1bGF0b3ItcmFtcC1kZWxheTogcmFtcCBkZWxheSBmb3IgcmVndWxhdG9yKGluIHVWL3VTKQorLSByZWd1bGF0b3ItcmFtcC1kZWxheTogcmFtcCBkZWxheSBmb3IgcmVndWxhdG9yKGluIHVWL3VzKQogICBGb3IgaGFyZHdhcmUgd2hpY2ggc3VwcG9ydHMgZGlzYWJsaW5nIHJhbXAgcmF0ZSwgaXQgc2hvdWxkIGJlIGV4cGxpY2l0bHkKICAgaW5pdGlhbGlzZWQgdG8gemVybyAocmVndWxhdG9yLXJhbXAtZGVsYXkgPSA8MD4pIGZvciBkaXNhYmxpbmcgcmFtcCBkZWxheS4KIC0gcmVndWxhdG9yLWVuYWJsZS1yYW1wLWRlbGF5OiBUaGUgdGltZSB0YWtlbiwgaW4gbWljcm9zZWNvbmRzLCBmb3IgdGhlIHN1cHBseQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlbW90ZXByb2MvcWNvbSx3Y25zcy1waWwudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlbW90ZXByb2MvcWNvbSx3Y25zcy1waWwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMjM2MWUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVtb3RlcHJvYy9xY29tLHdjbnNzLXBpbC50eHQKQEAgLTAsMCArMSwxMzIgQEAKK1F1YWxjb21tIFdDTlNTIFBlcmlwaGVyYWwgSW1hZ2UgTG9hZGVyCisKK1RoaXMgZG9jdW1lbnQgZGVmaW5lcyB0aGUgYmluZGluZyBmb3IgYSBjb21wb25lbnQgdGhhdCBsb2FkcyBhbmQgYm9vdHMgZmlybXdhcmUKK29uIHRoZSBRdWFsY29tbSBXQ05TUyBjb3JlLgorCistIGNvbXBhdGlibGU6CisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHN0cmluZz4KKwlEZWZpbml0aW9uOiBtdXN0IGJlIG9uZSBvZjoKKwkJICAgICJxY29tLHJpdmEtcGlsIiwKKwkJICAgICJxY29tLHByb250by12MS1waWwiLAorCQkgICAgInFjb20scHJvbnRvLXYyLXBpbCIKKworLSByZWc6CisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHByb3AtZW5jb2RlZC1hcnJheT4KKwlEZWZpbml0aW9uOiBtdXN0IHNwZWNpZnkgdGhlIGJhc2UgYWRkcmVzcyBhbmQgc2l6ZSBvZiB0aGUgQ0NVLCBEWEUgYW5kCisJCSAgICBQTVUgcmVnaXN0ZXIgYmxvY2tzCisKKy0gcmVnLW5hbWVzOgorCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDxzdHJpbmdsaXN0PgorCURlZmluaXRpb246IG11c3QgYmUgImNjdSIsICJkeGUiLCAicG11IgorCistIGludGVycnVwdHMtZXh0ZW5kZWQ6CisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHByb3AtZW5jb2RlZC1hcnJheT4KKwlEZWZpbml0aW9uOiBtdXN0IGxpc3QgdGhlIHdhdGNoZG9nIGFuZCBmYXRhbCBJUlFzIGFuZCBtYXkgc3BlY2lmeSB0aGUKKwkJICAgIHJlYWR5LCBoYW5kb3ZlciBhbmQgc3RvcC1hY2sgSVJRcworCistIGludGVycnVwdC1uYW1lczoKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8c3RyaW5nbGlzdD4KKwlEZWZpbml0aW9uOiBzaG91bGQgYmUgIndkb2ciLCAiZmF0YWwiLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5ICJyZWFkeSIsCisJCSAgICAiaGFuZG92ZXIiLCAic3RvcC1hY2siCisKKy0gdmRkbXgtc3VwcGx5OgorLSB2ZGRjeC1zdXBwbHk6CistIHZkZHB4LXN1cHBseToKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8cGhhbmRsZT4KKwlEZWZpbml0aW9uOiByZWZlcmVuY2UgdG8gdGhlIHJlZ3VsYXRvcnMgdG8gYmUgaGVsZCBvbiBiZWhhbGYgb2YgdGhlCisJCSAgICBib290aW5nIG9mIHRoZSBXQ05TUyBjb3JlCisKKy0gcWNvbSxzbWVtLXN0YXRlczoKKwlVc2FnZTogb3B0aW9uYWwKKwlWYWx1ZSB0eXBlOiA8cHJvcC1lbmNvZGVkLWFycmF5PgorCURlZmluaXRpb246IHJlZmVyZW5jZSB0byB0aGUgU01FTSBzdGF0ZSB1c2VkIHRvIGluZGljYXRlIHRvIFdDTlNTIHRoYXQKKwkJICAgIGl0IHNob3VsZCBzaHV0IGRvd24KKworLSBxY29tLHNtZW0tc3RhdGUtbmFtZXM6CisJVXNhZ2U6IG9wdGlvbmFsCisJVmFsdWUgdHlwZTogPHN0cmluZ2xpc3Q+CisJRGVmaW5pdGlvbjogc2hvdWxkIGJlICJzdG9wIgorCistIG1lbW9yeS1yZWdpb246CisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHByb3AtZW5jb2RlZC1hcnJheT4KKwlEZWZpbml0aW9uOiByZWZlcmVuY2UgdG8gcmVzZXJ2ZWQtbWVtb3J5IG5vZGUgZm9yIHRoZSByZW1vdGUgcHJvY2Vzc29yCisJCSAgICBzZWUgLi4vcmVzZXJ2ZWQtbWVtb3J5L3Jlc2VydmVkLW1lbW9yeS50eHQKKworPSBTVUJOT0RFUworQSBzaW5nbGUgc3Vibm9kZSBvZiB0aGUgV0NOU1MgUElMIGRlc2NyaWJlcyB0aGUgYXR0YWNoZWQgcmYgbW9kdWxlIGFuZCBpdHMKK3Jlc291cmNlIGRlcGVuZGVuY2llcy4KKworLSBjb21wYXRpYmxlOgorCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDxzdHJpbmc+CisJRGVmaW5pdGlvbjogbXVzdCBiZSBvbmUgb2Y6CisJCSAgICAicWNvbSx3Y24zNjIwIiwKKwkJICAgICJxY29tLHdjbjM2NjAiLAorCQkgICAgInFjb20sd2NuMzY4MCIKKworLSBjbG9ja3M6CisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHByb3AtZW5jb2RlZC1hcnJheT4KKwlEZWZpbml0aW9uOiBzaG91bGQgc3BlY2lmeSB0aGUgeG8gY2xvY2sgYW5kIG9wdGlvbmFsbHkgdGhlIHJmIGNsb2NrCisKKy0gY2xvY2stbmFtZXM6CisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHN0cmluZ2xpc3Q+CisJRGVmaW5pdGlvbjogc2hvdWxkIGJlICJ4byIsIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgInJmIgorCistIHZkZHhvLXN1cHBseToKKy0gdmRkcmZhLXN1cHBseToKKy0gdmRkcGEtc3VwcGx5OgorLSB2ZGRkaWctc3VwcGx5OgorCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDxwaGFuZGxlPgorCURlZmluaXRpb246IHJlZmVyZW5jZSB0byB0aGUgcmVndWxhdG9ycyB0byBiZSBoZWxkIG9uIGJlaGFsZiBvZiB0aGUKKwkJICAgIGJvb3Rpbmcgb2YgdGhlIFdDTlNTIGNvcmUKKworPSBFWEFNUExFCitUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVzY3JpYmVzIHRoZSByZXNvdXJjZXMgbmVlZGVkIHRvIGJvb3QgY29udHJvbCB0aGUgV0NOU1MsCit3aXRoIGF0dGFjaGVkIFdDTjM2ODAsIGFzIGl0IGlzIGNvbW1vbmx5IGZvdW5kIG9uIE1TTTg5NzQgYm9hcmRzLgorCitwcm9udG9AZmIyMDQwMDAgeworCWNvbXBhdGlibGUgPSAicWNvbSxwcm9udG8tdjItcGlsIjsKKwlyZWcgPSA8MHhmYjIwNDAwMCAweDIwMDA+LCA8MHhmYjIwMjAwMCAweDEwMDA+LCA8MHhmYjIxYjAwMCAweDMwMDA+OworCXJlZy1uYW1lcyA9ICJjY3UiLCAiZHhlIiwgInBtdSI7CisKKwlpbnRlcnJ1cHRzLWV4dGVuZGVkID0gPCZpbnRjIDAgMTQ5IDE+LAorCQkJICAgICAgPCZ3Y25zc19zbXAycF9zbGF2ZSAwIDA+LAorCQkJICAgICAgPCZ3Y25zc19zbXAycF9zbGF2ZSAxIDA+LAorCQkJICAgICAgPCZ3Y25zc19zbXAycF9zbGF2ZSAyIDA+LAorCQkJICAgICAgPCZ3Y25zc19zbXAycF9zbGF2ZSAzIDA+OworCWludGVycnVwdC1uYW1lcyA9ICJ3ZG9nIiwgImZhdGFsIiwgInJlYWR5IiwgImhhbmRvdmVyIiwgInN0b3AtYWNrIjsKKworCXZkZG14LXN1cHBseSA9IDwmcG04ODQxX3MxPjsKKwl2ZGRjeC1zdXBwbHkgPSA8JnBtODg0MV9zMj47CisJdmRkcHgtc3VwcGx5ID0gPCZwbTg5NDFfczM+OworCisJcWNvbSxzbWVtLXN0YXRlcyA9IDwmd2Nuc3Nfc21wMnBfb3V0IDA+OworCXFjb20sc21lbS1zdGF0ZS1uYW1lcyA9ICJzdG9wIjsKKworCW1lbW9yeS1yZWdpb24gPSA8JndjbnNzX3JlZ2lvbj47CisKKwlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOworCXBpbmN0cmwtMCA9IDwmd2Nuc3NfcGluX2E+OworCisJaXJpcyB7CisJCWNvbXBhdGlibGUgPSAicWNvbSx3Y24zNjgwIjsKKworCQljbG9ja3MgPSA8JnJwbWNjIFJQTV9DWE9fQ0xLX1NSQz4sIDwmcnBtY2MgUlBNX0NYT19BMj47CisJCWNsb2NrLW5hbWVzID0gInhvIiwgInJmIjsKKworCQl2ZGR4by1zdXBwbHkgPSA8JnBtODk0MV9sNj47CisJCXZkZHJmYS1zdXBwbHkgPSA8JnBtODk0MV9sMTE+OworCQl2ZGRwYS1zdXBwbHkgPSA8JnBtODk0MV9sMTk+OworCQl2ZGRkaWctc3VwcGx5ID0gPCZwbTg5NDFfczM+OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NlcmlhbC84MjUwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zZXJpYWwvODI1MC50eHQKaW5kZXggZjU1NjFhYy4uZjg2YmIwNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NlcmlhbC84MjUwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VyaWFsLzgyNTAudHh0CkBAIC00Miw5ICs0Miw4IEBACiAtIGF1dG8tZmxvdy1jb250cm9sOiBvbmUgd2F5IHRvIGVuYWJsZSBhdXRvbWF0aWMgZmxvdyBjb250cm9sIHN1cHBvcnQuIFRoZQogICBkcml2ZXIgaXMgYWxsb3dlZCB0byBkZXRlY3Qgc3VwcG9ydCBmb3IgdGhlIGNhcGFiaWxpdHkgZXZlbiB3aXRob3V0IHRoaXMKICAgcHJvcGVydHkuCi0tIHtydHMsY3RzLGR0cixkc3Iscm5nLGRjZH0tZ3Bpb3M6IHNwZWNpZnkgYSBHUElPIGZvciBSVFMvQ1RTL0RUUi9EU1IvUkkvRENECi0gIGxpbmUgcmVzcGVjdGl2ZWx5LiBJdCB3aWxsIHVzZSBzcGVjaWZpZWQgR1BJTyBpbnN0ZWFkIG9mIHRoZSBwZXJpcGhlcmFsCi0gIGZ1bmN0aW9uIHBpbiBmb3IgdGhlIFVBUlQgZmVhdHVyZS4gSWYgdW5zdXJlLCBkb24ndCBzcGVjaWZ5IHRoaXMgcHJvcGVydHkuCistIHR4LXRocmVzaG9sZDogU3BlY2lmeSB0aGUgVFggRklGTyBsb3cgd2F0ZXIgaW5kaWNhdGlvbiBmb3IgcGFydHMgd2l0aAorICBwcm9ncmFtbWFibGUgVFggRklGTyB0aHJlc2hvbGRzLgogCiBOb3RlOgogKiBmc2wsbnMxNjU1MDoKQEAgLTY2LDE5ICs2NSwzIEBACiAJCWludGVycnVwdHMgPSA8MTA+OwogCQlyZWctc2hpZnQgPSA8Mj47CiAJfTsKLQotRXhhbXBsZSBmb3IgT01BUCBVQVJUIHVzaW5nIEdQSU8tYmFzZWQgbW9kZW0gY29udHJvbCBzaWduYWxzOgotCi0JdWFydDQ6IHNlcmlhbEA0OTA0MjAwMCB7Ci0JCWNvbXBhdGlibGUgPSAidGksb21hcDMtdWFydCI7Ci0JCXJlZyA9IDwweDQ5MDQyMDAwIDB4NDAwPjsKLQkJaW50ZXJydXB0cyA9IDw4MD47Ci0JCXRpLGh3bW9kcyA9ICJ1YXJ0NCI7Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDw0ODAwMDAwMD47Ci0JCWN0cy1ncGlvcyA9IDwmZ3BpbzMgNSBHUElPX0FDVElWRV9MT1c+OwotCQlydHMtZ3Bpb3MgPSA8JmdwaW8zIDYgR1BJT19BQ1RJVkVfTE9XPjsKLQkJZHRyLWdwaW9zID0gPCZncGlvMSAxMiBHUElPX0FDVElWRV9MT1c+OwotCQlkc3ItZ3Bpb3MgPSA8JmdwaW8xIDEzIEdQSU9fQUNUSVZFX0xPVz47Ci0JCWRjZC1ncGlvcyA9IDwmZ3BpbzEgMTQgR1BJT19BQ1RJVkVfTE9XPjsKLQkJcm5nLWdwaW9zID0gPCZncGlvMSAxNSBHUElPX0FDVElWRV9MT1c+OwotCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VyaWFsL3N0LHN0bTMyLXVzYXJ0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zZXJpYWwvc3Qsc3RtMzItdXNhcnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZWM1ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VyaWFsL3N0LHN0bTMyLXVzYXJ0LnR4dApAQCAtMCwwICsxLDQ2IEBACisqIFNUTWljcm9lbGVjdHJvbmljcyBTVE0zMiBVU0FSVAorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBDYW4gYmUgZWl0aGVyICJzdCxzdG0zMi11c2FydCIsICJzdCxzdG0zMi11YXJ0IiwKKyJzdCxzdG0zMmY3LXVzYXJ0IiBvciAic3Qsc3RtMzJmNy11YXJ0IiBkZXBlbmRpbmcgb24gd2hldGhlcgordGhlIGRldmljZSBzdXBwb3J0cyBzeW5jaHJvbm91cyBtb2RlIGFuZCBpcyBjb21wYXRpYmxlIHdpdGgKK3N0bTMyKGY0KSBvciBzdG0zMmY3LgorLSByZWc6IFRoZSBhZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHNwYWNlCistIGludGVycnVwdHM6IFRoZSBpbnRlcnJ1cHQgbGluZSBvZiB0aGUgVVNBUlQgaW5zdGFuY2UKKy0gY2xvY2tzOiBUaGUgaW5wdXQgY2xvY2sgb2YgdGhlIFVTQVJUIGluc3RhbmNlCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIHBpbmN0cmw6IFRoZSByZWZlcmVuY2Ugb24gdGhlIHBpbnMgY29uZmlndXJhdGlvbgorLSBzdCxody1mbG93LWN0cmw6IGJvb2wgZmxhZyB0byBlbmFibGUgaGFyZHdhcmUgZmxvdyBjb250cm9sLgorLSBkbWFzOiBwaGFuZGxlKHMpIHRvIERNQSBjb250cm9sbGVyIG5vZGUocykuIFJlZmVyIHRvIHN0bTMyLWRtYS50eHQKKy0gZG1hLW5hbWVzOiAicngiIGFuZC9vciAidHgiCisKK0V4YW1wbGVzOgordXNhcnQ0OiBzZXJpYWxANDAwMDRjMDAgeworCWNvbXBhdGlibGUgPSAic3Qsc3RtMzItdWFydCI7CisJcmVnID0gPDB4NDAwMDRjMDAgMHg0MDA+OworCWludGVycnVwdHMgPSA8NTI+OworCWNsb2NrcyA9IDwmY2xrX3BjbGsxPjsKKwlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOworCXBpbmN0cmwtMCA9IDwmcGluY3RybF91c2FydDQ+OworfTsKKwordXNhcnQyOiBzZXJpYWxANDAwMDQ0MDAgeworCWNvbXBhdGlibGUgPSAic3Qsc3RtMzItdXNhcnQiLCAic3Qsc3RtMzItdWFydCI7CisJcmVnID0gPDB4NDAwMDQ0MDAgMHg0MDA+OworCWludGVycnVwdHMgPSA8Mzg+OworCWNsb2NrcyA9IDwmY2xrX3BjbGsxPjsKKwlzdCxody1mbG93LWN0cmw7CisJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKKwlwaW5jdHJsLTAgPSA8JnBpbmN0cmxfdXNhcnQyICZwaW5jdHJsX3VzYXJ0Ml9ydHNjdHM+OworfTsKKwordXNhcnQxOiBzZXJpYWxANDAwMTEwMDAgeworCWNvbXBhdGlibGUgPSAic3Qsc3RtMzItdXNhcnQiLCAic3Qsc3RtMzItdWFydCI7CisJcmVnID0gPDB4NDAwMTEwMDAgMHg0MDA+OworCWludGVycnVwdHMgPSA8Mzc+OworCWNsb2NrcyA9IDwmcmNjIDAgMTY0PjsKKwlkbWFzID0gPCZkbWEyIDIgNCAweDQxNCAweDA+LAorCSAgICAgICA8JmRtYTIgNyA0IDB4NDE0IDB4MD47CisJZG1hLW5hbWVzID0gInJ4IiwgInR4IjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc29jL21lZGlhdGVrL2F1eGFkYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc29jL21lZGlhdGVrL2F1eGFkYy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYjc4MjkuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvYy9tZWRpYXRlay9hdXhhZGMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTWVkaWFUZWsgQVVYQURDCi09PT09PT09PT09PT09PT0KLQotVGhlIEF1eGlsaWFyeSBBbmFsb2cvRGlnaXRhbCBDb252ZXJ0ZXIgKEFVWEFEQykgaXMgYW4gQURDIGZvdW5kCi1pbiBzb21lIE1lZGlhdGVrIFNvQ3Mgd2hpY2ggYW1vbmcgb3RoZXIgdGhpbmdzIG1lYXN1cmVzIHRoZSB0ZW1wZXJhdHVyZXMKLWluIHRoZSBTb0MuIEl0IGNhbiBiZSB1c2VkIGRpcmVjdGx5IHdpdGggcmVnaXN0ZXIgYWNjZXNzZXMsIGJ1dCBpdCBpcyBhbHNvCi11c2VkIGJ5IHRoZXJtYWwgY29udHJvbGxlciB3aGljaCByZWFkcyB0aGUgdGVtcGVyYXR1cmVzIGZyb20gdGhlIEFVWEFEQwotZGlyZWN0bHkgdmlhIGl0cyBvd24gYnVzIGludGVyZmFjZS4gU2VlCi1Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdGhlcm1hbC9tZWRpYXRlay10aGVybWFsLnR4dAotZm9yIHRoZSBUaGVybWFsIENvbnRyb2xsZXIgd2hpY2ggaG9sZHMgYSBwaGFuZGxlIHRvIHRoZSBBVVhBREMuCi0KLVJlcXVpcmVkIHByb3BlcnRpZXM6Ci0tIGNvbXBhdGlibGU6IE11c3QgYmUgIm1lZGlhdGVrLG10ODE3My1hdXhhZGMiCi0tIHJlZzogQWRkcmVzcyByYW5nZSBvZiB0aGUgQVVYQURDIHVuaXQKLQotRXhhbXBsZToKLQotYXV4YWRjOiBhdXhhZGNAMTEwMDEwMDAgewotCWNvbXBhdGlibGUgPSAibWVkaWF0ZWssbXQ4MTczLWF1eGFkYyI7Ci0JcmVnID0gPDAgMHgxMTAwMTAwMCAwIDB4MTAwMD47Ci19OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL25hdTg4MTAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL25hdTg4MTAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ODMwZTQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvbmF1ODgxMC50eHQKQEAgLTAsMCArMSwxNiBAQAorTkFVODgxMCBhdWRpbyBDT0RFQworCitUaGlzIGRldmljZSBzdXBwb3J0cyBJMkMgb25seS4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKworICAtIGNvbXBhdGlibGUgOiAibnV2b3RvbixuYXU4ODEwIgorCisgIC0gcmVnIDogdGhlIEkyQyBhZGRyZXNzIG9mIHRoZSBkZXZpY2UuCisKK0V4YW1wbGU6CisKK2NvZGVjOiBuYXU4ODEwQDFhIHsKKwljb21wYXRpYmxlID0gIm51dm90b24sbmF1ODgxMCI7CisJcmVnID0gPDB4MWE+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9udmlkaWEsdGVncmEtYXVkaW8tc2d0bDUwMDAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL252aWRpYSx0ZWdyYS1hdWRpby1zZ3RsNTAwMC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRhN2RhNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9udmlkaWEsdGVncmEtYXVkaW8tc2d0bDUwMDAudHh0CkBAIC0wLDAgKzEsNDIgQEAKK05WSURJQSBUZWdyYSBhdWRpbyBjb21wbGV4LCB3aXRoIFNHVEw1MDAwIENPREVDCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiAibnZpZGlhLHRlZ3JhLWF1ZGlvLXNndGw1MDAwIgorLSBjbG9ja3MgOiBNdXN0IGNvbnRhaW4gYW4gZW50cnkgZm9yIGVhY2ggZW50cnkgaW4gY2xvY2stbmFtZXMuCisgIFNlZSAuLi9jbG9ja3MvY2xvY2stYmluZGluZ3MudHh0IGZvciBkZXRhaWxzLgorLSBjbG9jay1uYW1lcyA6IE11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGVudHJpZXM6CisgIC0gcGxsX2EKKyAgLSBwbGxfYV9vdXQwCisgIC0gbWNsayAoVGhlIFRlZ3JhIGNkZXYxL2V4dGVybjEgY2xvY2ssIHdoaWNoIGZlZWRzIHRoZSBDT0RFQydzIG1jbGspCistIG52aWRpYSxtb2RlbCA6IFRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiB0aGlzIHNvdW5kIGNvbXBsZXguCistIG52aWRpYSxhdWRpby1yb3V0aW5nIDogQSBsaXN0IG9mIHRoZSBjb25uZWN0aW9ucyBiZXR3ZWVuIGF1ZGlvIGNvbXBvbmVudHMuCisgIEVhY2ggZW50cnkgaXMgYSBwYWlyIG9mIHN0cmluZ3MsIHRoZSBmaXJzdCBiZWluZyB0aGUgY29ubmVjdGlvbidzIHNpbmssCisgIHRoZSBzZWNvbmQgYmVpbmcgdGhlIGNvbm5lY3Rpb24ncyBzb3VyY2UuIFZhbGlkIG5hbWVzIGZvciBzb3VyY2VzIGFuZAorICBzaW5rcyBhcmUgdGhlIFNHVEw1MDAwJ3MgcGlucyAoYXMgZG9jdW1lbnRlZCBpbiBpdHMgYmluZGluZyksIGFuZCB0aGUgamFja3MKKyAgb24gdGhlIGJvYXJkOgorCisgICogSGVhZHBob25lIEphY2sKKyAgKiBMaW5lIEluIEphY2sKKyAgKiBNaWMgSmFjaworCistIG52aWRpYSxpMnMtY29udHJvbGxlciA6IFRoZSBwaGFuZGxlIG9mIHRoZSBUZWdyYSBJMlMgY29udHJvbGxlciB0aGF0J3MKKyAgY29ubmVjdGVkIHRvIHRoZSBDT0RFQy4KKy0gbnZpZGlhLGF1ZGlvLWNvZGVjIDogVGhlIHBoYW5kbGUgb2YgdGhlIFNHVEw1MDAwIGF1ZGlvIGNvZGVjLgorCitFeGFtcGxlOgorCitzb3VuZCB7CisJY29tcGF0aWJsZSA9ICJ0b3JhZGV4LHRlZ3JhLWF1ZGlvLXNndGw1MDAwLWFwYWxpc190MzAiLAorCQkgICAgICJudmlkaWEsdGVncmEtYXVkaW8tc2d0bDUwMDAiOworCW52aWRpYSxtb2RlbCA9ICJUb3JhZGV4IEFwYWxpcyBUMzAiOworCW52aWRpYSxhdWRpby1yb3V0aW5nID0KKwkJIkhlYWRwaG9uZSBKYWNrIiwgIkhQX09VVCIsCisJCSJMSU5FX0lOIiwgIkxpbmUgSW4gSmFjayIsCisJCSJNSUNfSU4iLCAiTWljIEphY2siOworCW52aWRpYSxpMnMtY29udHJvbGxlciA9IDwmdGVncmFfaTJzMj47CisJbnZpZGlhLGF1ZGlvLWNvZGVjID0gPCZzZ3RsNTAwMD47CisJY2xvY2tzID0gPCZ0ZWdyYV9jYXIgVEVHUkEzMF9DTEtfUExMX0E+LAorCQkgPCZ0ZWdyYV9jYXIgVEVHUkEzMF9DTEtfUExMX0FfT1VUMD4sCisJCSA8JnRlZ3JhX2NhciBURUdSQTMwX0NMS19FWFRFUk4xPjsKKwljbG9jay1uYW1lcyA9ICJwbGxfYSIsICJwbGxfYV9vdXQwIiwgIm1jbGsiOworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9vbWFwLW1jcGRtLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9vbWFwLW1jcGRtLnR4dAppbmRleCA2ZjZjMmY4Li4wNzQxZGZmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvb21hcC1tY3BkbS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL29tYXAtbWNwZG0udHh0CkBAIC04LDggKzgsNiBAQAogLSBpbnRlcnJ1cHRzOiBJbnRlcnJ1cHQgbnVtYmVyIGZvciBNY1BETQogLSBpbnRlcnJ1cHQtcGFyZW50OiBUaGUgcGFyZW50IGludGVycnVwdCBjb250cm9sbGVyCiAtIHRpLGh3bW9kczogTmFtZSBvZiB0aGUgaHdtb2QgYXNzb2NpYXRlZCB0byB0aGUgTWNQRE0KLS0gY2xvY2tzOiAgcGhhbmRsZSBmb3IgdGhlIHBkbWNsayBwcm92aWRlciwgbGlrZWx5IDwmdHdsNjA0MD4KLS0gY2xvY2stbmFtZXM6IE11c3QgYmUgInBkbWNsayIKIAogRXhhbXBsZToKIApAQCAtMjEsMTEgKzE5LDMgQEAKIAlpbnRlcnJ1cHQtcGFyZW50ID0gPCZnaWM+OwogCXRpLGh3bW9kcyA9ICJtY3BkbSI7CiB9OwotCi1JbiBib2FyZCBEVFMgZmlsZSB0aGUgcGRtY2xrIG5lZWRzIHRvIGJlIGFkZGVkOgotCi0mbWNwZG0gewotCWNsb2NrcyA9IDwmdHdsNjA0MD47Ci0JY2xvY2stbmFtZXMgPSAicGRtY2xrIjsKLQlzdGF0dXMgPSAib2theSI7Ci19OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3Fjb20sYXBxODAxNi1zYmMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3Fjb20sYXBxODAxNi1zYmMudHh0CmluZGV4IDQ4MTI5MzYuLmQ5ZDg2MzUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9xY29tLGFwcTgwMTYtc2JjLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvcWNvbSxhcHE4MDE2LXNiYy50eHQKQEAgLTE2LDYgKzE2LDI0IEBACiAJCQkJKiAic3Brci1pb211eCIKIC0gcWNvbSxtb2RlbAkJOiBOYW1lIG9mIHRoZSBzb3VuZCBjYXJkLgogCistIHFjb20sYXVkaW8tcm91dGluZwk6IEEgbGlzdCBvZiB0aGUgY29ubmVjdGlvbnMgYmV0d2VlbiBhdWRpbyBjb21wb25lbnRzLgorCQkJICBFYWNoIGVudHJ5IGlzIGEgcGFpciBvZiBzdHJpbmdzLCB0aGUgZmlyc3QgYmVpbmcgdGhlCisJCQkgIGNvbm5lY3Rpb24ncyBzaW5rLCB0aGUgc2Vjb25kIGJlaW5nIHRoZSBjb25uZWN0aW9uJ3MKKwkJCSAgc291cmNlLiBWYWxpZCBuYW1lcyBjb3VsZCBiZSBwb3dlciBzdXBwbGllcywgTWljQmlhcworCQkJICBvZiBtc204eDE2X3djZCBjb2RlYyBhbmQgdGhlIGphY2tzIG9uIHRoZSBib2FyZDoKKworCQkJICBQb3dlciBzdXBwbGllczoKKwkJCSAgKiBNSUMgQklBUyBFeHRlcm5hbDEKKwkJCSAgKiBNSUMgQklBUyBFeHRlcm5hbDIKKwkJCSAgKiBNSUMgQklBUyBJbnRlcm5hbDEKKwkJCSAgKiBNSUMgQklBUyBJbnRlcm5hbDIKKworCQkJICBCb2FyZCBjb25uZWN0b3JzOgorCQkJICAqIEhlYWRzZXQgTWljCisJCQkgICogU2Vjb25kYXJ5IE1pYyIsCisJCQkgICogRE1JQworCQkJICAqIEV4dCBTcGsKKwogRGFpLWxpbmsgc3Vibm9kZSBwcm9wZXJ0aWVzIGFuZCBzdWJub2RlczoKIAogUmVxdWlyZWQgZGFpLWxpbmsgc3Vibm9kZXM6CkBAIC0zNyw2ICs1NSwxOCBAQAogCXJlZy1uYW1lcyA9ICJtaWMtaW9tdXgiLCAic3Brci1pb211eCI7CiAJcWNvbSxtb2RlbCA9ICJEQjQxMGMiOwogCisJcWNvbSxhdWRpby1yb3V0aW5nID0KKwkJIk1JQyBCSUFTIEV4dGVybmFsMSIsICJIYW5kc2V0IE1pYyIsCisJCSJNSUMgQklBUyBJbnRlcm5hbDIiLCAiSGVhZHNldCBNaWMiLAorCQkiTUlDIEJJQVMgRXh0ZXJuYWwxIiwgIlNlY29uZGFyeSBNaWMiLAorCQkiQU1JQzEiLCAiTUlDIEJJQVMgRXh0ZXJuYWwxIiwKKwkJIkFNSUMyIiwgIk1JQyBCSUFTIEludGVybmFsMiIsCisJCSJBTUlDMyIsICJNSUMgQklBUyBFeHRlcm5hbDEiLAorCQkiRE1JQzEiLCAiTUlDIEJJQVMgSW50ZXJuYWwxIiwKKwkJIk1JQyBCSUFTIEludGVybmFsMSIsICJEaWdpdGFsIE1pYzEiLAorCQkiRE1JQzIiLCAiTUlDIEJJQVMgSW50ZXJuYWwxIiwKKwkJIk1JQyBCSUFTIEludGVybmFsMSIsICJEaWdpdGFsIE1pYzIiOworCiAJLyogSTJTIC0gSW50ZXJuYWwgY29kZWMgKi8KIAlpbnRlcm5hbC1kYWktbGlua0AwIHsKIAkJY3B1IHsgLyogUFJJTUFSWSAqLwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3JlbmVzYXMscnNyYy1jYXJkLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9yZW5lc2FzLHJzcmMtY2FyZC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NWVjZTMuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3JlbmVzYXMscnNyYy1jYXJkLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLVJlbmVzYXMgU2FtcGxpbmcgUmF0ZSBDb252ZXJ0IFNvdW5kIENhcmQ6Ci0KLVJlbmVzYXMgU2FtcGxpbmcgUmF0ZSBDb252ZXJ0IFNvdW5kIENhcmQgc3BlY2lmaWVzIGF1ZGlvIERBSSBjb25uZWN0aW9ucyBvZiBTb0MgPC0+IGNvZGVjLgotCi1SZXF1aXJlZCBwcm9wZXJ0aWVzOgotCi0tIGNvbXBhdGlibGUJCQkJOiAicmVuZXNhcyxyc3JjLWNhcmR7LDxib2FyZD59IgotCQkJCQkgIEV4YW1wbGVzIHdpdGggYm9hcmRzIGFyZToKLQkJCQkJICAgIC0gInJlbmVzYXMscnNyYy1jYXJkIgotCQkJCQkgICAgLSAicmVuZXNhcyxyc3JjLWNhcmQsbGFnZXIiCi0JCQkJCSAgICAtICJyZW5lc2FzLHJzcmMtY2FyZCxrb2Vsc2NoIgotT3B0aW9uYWwgcHJvcGVydGllczoKLQotLSBjYXJkX25hbWUJCQkJOiBVc2VyIHNwZWNpZmllZCBhdWRpbyBzb3VuZCBjYXJkIG5hbWUsIG9uZSBzdHJpbmcKLQkJCQkJICBwcm9wZXJ0eS4KLS0gY3B1CQkJCQk6IENQVSAgIHN1Yi1ub2RlCi0tIGNvZGVjCQkJCQk6IENPREVDIHN1Yi1ub2RlCi0KLU9wdGlvbmFsIHN1Ym5vZGUgcHJvcGVydGllczoKLQotLSBmb3JtYXQJCQkJOiBDUFUvQ09ERUMgY29tbW9uIGF1ZGlvIGZvcm1hdC4KLQkJCQkJICAiaTJzIiwgInJpZ2h0X2oiLCAibGVmdF9qIiAsICJkc3BfYSIKLQkJCQkJICAiZHNwX2IiLCAiYWM5NyIsICJwZG0iLCAibXNiIiwgImxzYiIKLS0gZnJhbWUtbWFzdGVyCQkJCTogSW5kaWNhdGVzIGRhaS1saW5rIGZyYW1lIG1hc3Rlci4KLQkJCQkJICBwaGFuZGxlIHRvIGEgY3B1IG9yIGNvZGVjIHN1Ym5vZGUuCi0tIGJpdGNsb2NrLW1hc3RlcgkJCTogSW5kaWNhdGVzIGRhaS1saW5rIGJpdCBjbG9jayBtYXN0ZXIuCi0JCQkJCSAgcGhhbmRsZSB0byBhIGNwdSBvciBjb2RlYyBzdWJub2RlLgotLSBiaXRjbG9jay1pbnZlcnNpb24JCQk6IGJvb2wgcHJvcGVydHkuIEFkZCB0aGlzIGlmIHRoZQotCQkJCQkgIGRhaS1saW5rIHVzZXMgYml0IGNsb2NrIGludmVyc2lvbi4KLS0gZnJhbWUtaW52ZXJzaW9uCQkJOiBib29sIHByb3BlcnR5LiBBZGQgdGhpcyBpZiB0aGUKLQkJCQkJICBkYWktbGluayB1c2VzIGZyYW1lIGNsb2NrIGludmVyc2lvbi4KLS0gY29udmVydC1yYXRlCQkJCTogcGxhdGZvcm0gc3BlY2lmaWVkIHNhbXBsaW5nIHJhdGUgY29udmVydAotLSBjb252ZXJ0LWNoYW5uZWxzCQkJOiBwbGF0Zm9ybSBzcGVjaWZpZWQgY29udmVydGVkIGNoYW5uZWwgc2l6ZSAoMiAtIDggY2gpCi0tIGF1ZGlvLXByZWZpeAkJCQk6IHNlZSBhdWRpby1yb3V0aW5nCi0tIGF1ZGlvLXJvdXRpbmcJCQkJOiBBIGxpc3Qgb2YgdGhlIGNvbm5lY3Rpb25zIGJldHdlZW4gYXVkaW8gY29tcG9uZW50cy4KLQkJCQkJICBFYWNoIGVudHJ5IGlzIGEgcGFpciBvZiBzdHJpbmdzLCB0aGUgZmlyc3QgYmVpbmcgdGhlIGNvbm5lY3Rpb24ncyBzaW5rLAotCQkJCQkgIHRoZSBzZWNvbmQgYmVpbmcgdGhlIGNvbm5lY3Rpb24ncyBzb3VyY2UuIFZhbGlkIG5hbWVzIGZvciBzb3VyY2VzLgotCQkJCQkgIHVzZSBhdWRpby1wcmVmaXggaWYgc29tZSBjb21wb25lbnRzIGlzIHVzaW5nIHNhbWUgc2luay9zb3VyY2VzIG5hbWluZy4KLQkJCQkJICBpdCBjYW4gYmUgdXNlZCBpZiBjb21wYXRpYmxlIHdhcyAicmVuZXNhcyxyc3JjLWNhcmQiOwotCi1SZXF1aXJlZCBDUFUvQ09ERUMgc3Vibm9kZXMgcHJvcGVydGllczoKLQotLSBzb3VuZC1kYWkJCQkJOiBwaGFuZGxlIGFuZCBwb3J0IG9mIENQVS9DT0RFQwotCi1PcHRpb25hbCBDUFUvQ09ERUMgc3Vibm9kZXMgcHJvcGVydGllczoKLQotLSBjbG9ja3MgLyBzeXN0ZW0tY2xvY2stZnJlcXVlbmN5CTogc3BlY2lmeSBzdWJub2RlJ3MgY2xvY2sgaWYgbmVlZGVkLgotCQkJCQkgIGl0IGNhbiBiZSBzcGVjaWZpZWQgdmlhICJjbG9ja3MiIGlmIHN5c3RlbSBoYXMKLQkJCQkJICBjbG9jayBub2RlICg9IGNvbW1vbiBjbG9jayksIG9yICJzeXN0ZW0tY2xvY2stZnJlcXVlbmN5IgotCQkJCQkgIChpZiBzeXN0ZW0gZG9lbnMndCBzdXBwb3J0IGNvbW1vbiBjbG9jaykKLQkJCQkJICBJZiBhIGNsb2NrIGlzIHNwZWNpZmllZCwgaXQgaXMKLQkJCQkJICBlbmFibGVkIHdpdGggY2xrX3ByZXBhcmVfZW5hYmxlKCkKLQkJCQkJICBpbiBkYWkgc3RhcnR1cCgpIGFuZCBkaXNhYmxlZCB3aXRoCi0JCQkJCSAgY2xrX2Rpc2FibGVfdW5wcmVwYXJlKCkgaW4gZGFpCi0JCQkJCSAgc2h1dGRvd24oKS4KLQotRXhhbXBsZQotCi1zb3VuZCB7Ci0JY29tcGF0aWJsZSA9ICJyZW5lc2FzLHJzcmMtY2FyZCxsYWdlciI7Ci0KLQljYXJkLW5hbWUgPSAicnNuZC1hazQ2NDMiOwotCWZvcm1hdCA9ICJsZWZ0X2oiOwotCWJpdGNsb2NrLW1hc3RlciA9IDwmc25kY29kZWM+OwotCWZyYW1lLW1hc3RlciA9IDwmc25kY29kZWM+OwotCi0Jc25kY3B1OiBjcHUgewotCQlzb3VuZC1kYWkgPSA8JnJjYXJfc291bmQ+OwotCX07Ci0KLQlzbmRjb2RlYzogY29kZWMgewotCQlzb3VuZC1kYWkgPSA8JmFrNDY0Mz47Ci0JCXN5c3RlbS1jbG9jay1mcmVxdWVuY3kgPSA8MTEyODk2MDA+OwotCX07Ci19OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3JvY2tjaGlwLHJrMzM5OS1ncnUtc291bmQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3JvY2tjaGlwLHJrMzM5OS1ncnUtc291bmQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYzkxZGIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvcm9ja2NoaXAscmszMzk5LWdydS1zb3VuZC50eHQKQEAgLTAsMCArMSwyMiBAQAorUk9DS0NISVAgd2l0aCBNQVg5ODM1N0EvUlQ1NTE0L0RBNzIxOSBjb2RlY3Mgb24gR1JVIGJvYXJkcworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiAicm9ja2NoaXAscmszMzk5LWdydS1zb3VuZCIKKy0gcm9ja2NoaXAsY3B1OiBUaGUgcGhhbmRsZSBvZiB0aGUgUm9ja2NoaXAgSTJTIGNvbnRyb2xsZXIgdGhhdCdzCisgIGNvbm5lY3RlZCB0byB0aGUgY29kZWNzCistIHJvY2tjaGlwLGNvZGVjOiBUaGUgcGhhbmRsZSBvZiB0aGUgTUFYOTgzNTdBL1JUNTUxNC9EQTcyMTkgY29kZWNzCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIGRtaWMtd2FrZXVwLWRlbGF5LW1zIDogc3BlY2lmeSBkZWxheSB0aW1lIChtcykgZm9yIERNSUMgcmVhZHkuCisgIElmIHRoaXMgb3B0aW9uIGlzIHNwZWNpZmllZCwgd2hpY2ggbWVhbnMgaXQncyByZXF1aXJlZCBkbWljIG5lZWQKKyAgZGVsYXkgZm9yIERNSUMgdG8gcmVhZHkgc28gdGhhdCBydDU1MTQgY2FuIGF2b2lkIHJlY29yZGluZyBiZWZvcmUKKyAgRE1JQyBzZW5kIHZhbGlkIGRhdGEKKworRXhhbXBsZToKKworc291bmQgeworCWNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMzk5LWdydS1zb3VuZCI7CisJcm9ja2NoaXAsY3B1ID0gPCZpMnMwPjsKKwlyb2NrY2hpcCxjb2RlYyA9IDwmbWF4OTgzNTdhICZydDU1MTQgJmRhNzIxOT47CisJZG1pYy13YWtldXAtZGVsYXktbXMgPSA8MjA+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9ydDU2NTkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3J0NTY1OS50eHQKaW5kZXggNWY3OWU3Zi4uMTc2NmUwNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3J0NTY1OS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3J0NTY1OS50eHQKQEAgLTEyLDYgKzEyLDkgQEAKIAogT3B0aW9uYWwgcHJvcGVydGllczoKIAorLSBjbG9ja3M6IFRoZSBwaGFuZGxlIG9mIHRoZSBtYXN0ZXIgY2xvY2sgdG8gdGhlIENPREVDCistIGNsb2NrLW5hbWVzOiBTaG91bGQgYmUgIm1jbGsiCisKIC0gcmVhbHRlayxpbjEtZGlmZmVyZW50aWFsCiAtIHJlYWx0ZWssaW4zLWRpZmZlcmVudGlhbAogLSByZWFsdGVrLGluNC1kaWZmZXJlbnRpYWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9ydDU2NjAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3J0NTY2MC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBiZTVmOQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9ydDU2NjAudHh0CkBAIC0wLDAgKzEsNDcgQEAKK1JUNTY2MCBhdWRpbyBDT0RFQworCitUaGlzIGRldmljZSBzdXBwb3J0cyBJMkMgb25seS4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKworLSBjb21wYXRpYmxlIDogInJlYWx0ZWsscnQ1NjYwIi4KKworLSByZWcgOiBUaGUgSTJDIGFkZHJlc3Mgb2YgdGhlIGRldmljZS4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKworLSBjbG9ja3M6IFRoZSBwaGFuZGxlIG9mIHRoZSBtYXN0ZXIgY2xvY2sgdG8gdGhlIENPREVDCistIGNsb2NrLW5hbWVzOiBTaG91bGQgYmUgIm1jbGsiCisKKy0gcmVhbHRlayxpbjEtZGlmZmVyZW50aWFsCistIHJlYWx0ZWssaW4zLWRpZmZlcmVudGlhbAorICBCb29sZWFuLiBJbmRpY2F0ZSBNSUMxLzMgaW5wdXQgYXJlIGRpZmZlcmVudGlhbCwgcmF0aGVyIHRoYW4gc2luZ2xlLWVuZGVkLgorCistIHJlYWx0ZWsscG93ZXJvZmYtaW4tc3VzcGVuZAorICBCb29sZWFuLiBJZiB0aGUgY29kZWMgd2lsbCBiZSBwb3dlcmVkIG9mZiBpbiBzdXNwZW5kLCB0aGUgcmVzdW1lIHNob3VsZCBiZQorICBhZGRlZCBkZWxheSB0aW1lIGZvciB3YWl0aW5nIGNvZGVjIHBvd2VyIHJlYWR5LgorCistIHJlYWx0ZWssZG1pYzEtZGF0YS1waW4KKyAgMDogZG1pYzEgaXMgbm90IHVzZWQKKyAgMTogdXNpbmcgR1BJTzIgcGluIGFzIGRtaWMxIGRhdGEgcGluCisgIDI6IHVzaW5nIElOMVAgcGluIGFzIGRtaWMxIGRhdGEgcGluCisKK1BpbnMgb24gdGhlIGRldmljZSAoZm9yIGxpbmtpbmcgaW50byBhdWRpbyByb3V0ZXMpIGZvciBSVDU2NjA6CisKKyAgKiBETUlDIEwxCisgICogRE1JQyBSMQorICAqIElOMVAKKyAgKiBJTjFOCisgICogSU4yUAorICAqIElOM1AKKyAgKiBJTjNOCisgICogU1BPCisgICogTE9VVEwKKyAgKiBMT1VUUgorCitFeGFtcGxlOgorCitydDU2NjAgeworCWNvbXBhdGlibGUgPSAicmVhbHRlayxydDU2NjAiOworCXJlZyA9IDwweDFjPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvcnQ1NjYzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9ydDU2NjMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkM2M5NzQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvcnQ1NjYzLnR4dApAQCAtMCwwICsxLDMwIEBACitSVDU2NjMvUlQ1NjY4IGF1ZGlvIENPREVDCisKK1RoaXMgZGV2aWNlIHN1cHBvcnRzIEkyQyBvbmx5LgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCistIGNvbXBhdGlibGUgOiBPbmUgb2YgInJlYWx0ZWsscnQ1NjYzIiBvciAicmVhbHRlayxydDU2NjgiLgorCistIHJlZyA6IFRoZSBJMkMgYWRkcmVzcyBvZiB0aGUgZGV2aWNlLgorCistIGludGVycnVwdHMgOiBUaGUgQ09ERUMncyBpbnRlcnJ1cHQgb3V0cHV0LgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorCitQaW5zIG9uIHRoZSBkZXZpY2UgKGZvciBsaW5raW5nIGludG8gYXVkaW8gcm91dGVzKSBmb3IgUlQ1NjYzL1JUNTY2ODoKKworICAqIElOMVAKKyAgKiBJTjFOCisgICogSU4yUAorICAqIElOMk4KKyAgKiBIUE9MCisgICogSFBPUgorCitFeGFtcGxlOgorCitjb2RlYzogcnQ1NjYzQDEyIHsKKwljb21wYXRpYmxlID0gInJlYWx0ZWsscnQ1NjYzIjsKKwlyZWcgPSA8MHgxMj47CisJaW50ZXJydXB0cyA9IDw3IElSUV9UWVBFX0VER0VfRkFMTElORz47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3NpbXBsZS1jYXJkLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zaW1wbGUtY2FyZC50eHQKaW5kZXggNTlkODYyOC4uYzdhOTM5MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3NpbXBsZS1jYXJkLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc2ltcGxlLWNhcmQudHh0CkBAIC0yMiw2ICsyMiw4IEBACiAJCQkJCSAgaGVhZHBob25lcyBhcmUgYXR0YWNoZWQuCiAtIHNpbXBsZS1hdWRpby1jYXJkLG1pYy1kZXQtZ3Bpbwk6IFJlZmVyZW5jZSB0byBHUElPIHRoYXQgc2lnbmFscyB3aGVuCiAJCQkJCSAgYSBtaWNyb3Bob25lIGlzIGF0dGFjaGVkLgorLSBzaW1wbGUtYXVkaW8tY2FyZCxhdXgtZGV2cwkJOiBMaXN0IG9mIHBoYW5kbGVzIHBvaW50aW5nIHRvIGF1eGlsaWFyeSBkZXZpY2VzLCBzdWNoCisJCQkJCSAgYXMgYW1wbGlmaWVycywgdG8gYmUgYWRkZWQgdG8gdGhlIHNvdW5kIGNhcmQuCiAKIE9wdGlvbmFsIHN1Ym5vZGVzOgogCkBAIC0xNjIsMyArMTY0LDM4IEBACiAJCX07CiAJfTsKIH07CisKK0V4YW1wbGUgMyAtIHJvdXRlIGF1ZGlvIGZyb20gSU1YNiBTU0kyIHRocm91Z2ggVExWMzIwREFDMzEwMCBjb2RlYwordGhyb3VnaCBUUEE2MTMwQTIgYW1wbGlmaWVyIHRvIGhlYWRwaG9uZXM6CisKKyZpMmMwIHsKKwljb2RlYzogdGx2MzIwZGFjMzEwMEAxOCB7CisJCWNvbXBhdGlibGUgPSAidGksdGx2MzIwZGFjMzEwMCI7CisJCS4uLgorCX0KKworCWFtcDogdHBhNjEzMGEyQDYwIHsKKwkJY29tcGF0aWJsZSA9ICJ0aSx0cGE2MTMwYTIiOworCQkuLi4KKwl9Cit9CisKK3NvdW5kIHsKKwljb21wYXRpYmxlID0gInNpbXBsZS1hdWRpby1jYXJkIjsKKwkuLi4KKwlzaW1wbGUtYXVkaW8tY2FyZCx3aWRnZXRzID0KKwkJIkhlYWRwaG9uZSIsICJIZWFkcGhvbmUgSmFjayI7CisJc2ltcGxlLWF1ZGlvLWNhcmQscm91dGluZyA9CisJCSJIZWFkcGhvbmUgSmFjayIsICJIUExFRlQiLAorCQkiSGVhZHBob25lIEphY2siLCAiSFBSSUdIVCIsCisJCSJMRUZUSU4iLCAiSFBMIiwKKwkJIlJJR0hUSU4iLCAiSFBSIjsKKwlzaW1wbGUtYXVkaW8tY2FyZCxhdXgtZGV2cyA9IDwmYW1wPjsKKwlzaW1wbGUtYXVkaW8tY2FyZCxjcHUgeworCQlzb3VuZC1kYWkgPSA8JnNzaTI+OworCX07CisJc2ltcGxlLWF1ZGlvLWNhcmQsY29kZWMgeworCQlzb3VuZC1kYWkgPSA8JmNvZGVjPjsKKwkJY2xvY2tzID0gLi4uCisJfTsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc2ltcGxlLXNjdS1jYXJkLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zaW1wbGUtc2N1LWNhcmQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZmU0N2UKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc2ltcGxlLXNjdS1jYXJkLnR4dApAQCAtMCwwICsxLDExMCBAQAorQVNvQyBzaW1wbGUgU0NVIFNvdW5kIENhcmQKKworU2ltcGxlLUNhcmQgc3BlY2lmaWVzIGF1ZGlvIERBSSBjb25uZWN0aW9ucyBvZiBTb0MgPC0+IGNvZGVjLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCistIGNvbXBhdGlibGUJCQkJOiAic2ltcGxlLXNjdS1hdWRpby1jYXJkIgorCQkJCQkgICJyZW5lc2FzLHJzcmMtY2FyZCIKKworT3B0aW9uYWwgcHJvcGVydGllczoKKworLSBzaW1wbGUtYXVkaW8tY2FyZCxuYW1lCQk6IFVzZXIgc3BlY2lmaWVkIGF1ZGlvIHNvdW5kIGNhcmQgbmFtZSwgb25lIHN0cmluZworCQkJCQkgIHByb3BlcnR5LgorLSBzaW1wbGUtYXVkaW8tY2FyZCxjcHUJCQk6IENQVSAgIHN1Yi1ub2RlCistIHNpbXBsZS1hdWRpby1jYXJkLGNvZGVjCQk6IENPREVDIHN1Yi1ub2RlCisKK09wdGlvbmFsIHN1Ym5vZGUgcHJvcGVydGllczoKKworLSBzaW1wbGUtYXVkaW8tY2FyZCxmb3JtYXQJCTogQ1BVL0NPREVDIGNvbW1vbiBhdWRpbyBmb3JtYXQuCisJCQkJCSAgImkycyIsICJyaWdodF9qIiwgImxlZnRfaiIgLCAiZHNwX2EiCisJCQkJCSAgImRzcF9iIiwgImFjOTciLCAicGRtIiwgIm1zYiIsICJsc2IiCistIHNpbXBsZS1hdWRpby1jYXJkLGZyYW1lLW1hc3Rlcgk6IEluZGljYXRlcyBkYWktbGluayBmcmFtZSBtYXN0ZXIuCisJCQkJCSAgcGhhbmRsZSB0byBhIGNwdSBvciBjb2RlYyBzdWJub2RlLgorLSBzaW1wbGUtYXVkaW8tY2FyZCxiaXRjbG9jay1tYXN0ZXIJOiBJbmRpY2F0ZXMgZGFpLWxpbmsgYml0IGNsb2NrIG1hc3Rlci4KKwkJCQkJICBwaGFuZGxlIHRvIGEgY3B1IG9yIGNvZGVjIHN1Ym5vZGUuCistIHNpbXBsZS1hdWRpby1jYXJkLGJpdGNsb2NrLWludmVyc2lvbgk6IGJvb2wgcHJvcGVydHkuIEFkZCB0aGlzIGlmIHRoZQorCQkJCQkgIGRhaS1saW5rIHVzZXMgYml0IGNsb2NrIGludmVyc2lvbi4KKy0gc2ltcGxlLWF1ZGlvLWNhcmQsZnJhbWUtaW52ZXJzaW9uCTogYm9vbCBwcm9wZXJ0eS4gQWRkIHRoaXMgaWYgdGhlCisJCQkJCSAgZGFpLWxpbmsgdXNlcyBmcmFtZSBjbG9jayBpbnZlcnNpb24uCistIHNpbXBsZS1hdWRpby1jYXJkLGNvbnZlcnQtcmF0ZQk6IHBsYXRmb3JtIHNwZWNpZmllZCBzYW1wbGluZyByYXRlIGNvbnZlcnQKKy0gc2ltcGxlLWF1ZGlvLWNhcmQsY29udmVydC1jaGFubmVscwk6IHBsYXRmb3JtIHNwZWNpZmllZCBjb252ZXJ0ZWQgY2hhbm5lbCBzaXplICgyIC0gOCBjaCkKKy0gc2ltcGxlLWF1ZGlvLWNhcmQscHJlZml4CQk6IHNlZSBhdWRpby1yb3V0aW5nCistIHNpbXBsZS1hdWRpby1jYXJkLHJvdXRpbmcJCTogQSBsaXN0IG9mIHRoZSBjb25uZWN0aW9ucyBiZXR3ZWVuIGF1ZGlvIGNvbXBvbmVudHMuCisJCQkJCSAgRWFjaCBlbnRyeSBpcyBhIHBhaXIgb2Ygc3RyaW5ncywgdGhlIGZpcnN0IGJlaW5nIHRoZSBjb25uZWN0aW9uJ3Mgc2luaywKKwkJCQkJICB0aGUgc2Vjb25kIGJlaW5nIHRoZSBjb25uZWN0aW9uJ3Mgc291cmNlLiBWYWxpZCBuYW1lcyBmb3Igc291cmNlcy4KKwkJCQkJICB1c2UgYXVkaW8tcHJlZml4IGlmIHNvbWUgY29tcG9uZW50cyBpcyB1c2luZyBzYW1lIHNpbmsvc291cmNlcyBuYW1pbmcuCisJCQkJCSAgaXQgY2FuIGJlIHVzZWQgaWYgY29tcGF0aWJsZSB3YXMgInJlbmVzYXMscnNyYy1jYXJkIjsKKworUmVxdWlyZWQgQ1BVL0NPREVDIHN1Ym5vZGVzIHByb3BlcnRpZXM6CisKKy0gc291bmQtZGFpCQkJCTogcGhhbmRsZSBhbmQgcG9ydCBvZiBDUFUvQ09ERUMKKworT3B0aW9uYWwgQ1BVL0NPREVDIHN1Ym5vZGVzIHByb3BlcnRpZXM6CisKKy0gY2xvY2tzIC8gc3lzdGVtLWNsb2NrLWZyZXF1ZW5jeQk6IHNwZWNpZnkgc3Vibm9kZSdzIGNsb2NrIGlmIG5lZWRlZC4KKwkJCQkJICBpdCBjYW4gYmUgc3BlY2lmaWVkIHZpYSAiY2xvY2tzIiBpZiBzeXN0ZW0gaGFzCisJCQkJCSAgY2xvY2sgbm9kZSAoPSBjb21tb24gY2xvY2spLCBvciAic3lzdGVtLWNsb2NrLWZyZXF1ZW5jeSIKKwkJCQkJICAoaWYgc3lzdGVtIGRvZW5zJ3Qgc3VwcG9ydCBjb21tb24gY2xvY2spCisJCQkJCSAgSWYgYSBjbG9jayBpcyBzcGVjaWZpZWQsIGl0IGlzCisJCQkJCSAgZW5hYmxlZCB3aXRoIGNsa19wcmVwYXJlX2VuYWJsZSgpCisJCQkJCSAgaW4gZGFpIHN0YXJ0dXAoKSBhbmQgZGlzYWJsZWQgd2l0aAorCQkJCQkgIGNsa19kaXNhYmxlX3VucHJlcGFyZSgpIGluIGRhaQorCQkJCQkgIHNodXRkb3duKCkuCisKK0V4YW1wbGUgMS4gU2FtcGxpbmcgUmF0ZSBDb3ZlcnQKKworc291bmQgeworCWNvbXBhdGlibGUgPSAic2ltcGxlLXNjdS1hdWRpby1jYXJkIjsKKworCXNpbXBsZS1hdWRpby1jYXJkLG5hbWUgPSAicnNuZC1hazQ2NDMiOworCXNpbXBsZS1hdWRpby1jYXJkLGZvcm1hdCA9ICJsZWZ0X2oiOworCXNpbXBsZS1hdWRpby1jYXJkLGZvcm1hdCA9ICJsZWZ0X2oiOworCXNpbXBsZS1hdWRpby1jYXJkLGJpdGNsb2NrLW1hc3RlciA9IDwmc25kY29kZWM+OworCXNpbXBsZS1hdWRpby1jYXJkLGZyYW1lLW1hc3RlciA9IDwmc25kY29kZWM+OworCisJc2ltcGxlLWF1ZGlvLWNhcmQsY29udmVydC1yYXRlID0gPDQ4MDAwPjsgLyogc2VlIGF1ZGlvX2Nsa19hICovCisKKwlzaW1wbGUtYXVkaW8tY2FyZCxwcmVmaXggPSAiYWs0NjQyIjsKKwlzaW1wbGUtYXVkaW8tY2FyZCxyb3V0aW5nID0gImFrNDY0MiBQbGF5YmFjayIsICJEQUkwIFBsYXliYWNrIiwKKwkJCSJEQUkwIENhcHR1cmUiLCAiYWs0NjQyIENhcHR1cmUiOworCisJc25kY3B1OiBzaW1wbGUtYXVkaW8tY2FyZCxjcHUgeworCQlzb3VuZC1kYWkgPSA8JnJjYXJfc291bmQ+OworCX07CisKKwlzbmRjb2RlYzogc2ltcGxlLWF1ZGlvLWNhcmQsY29kZWMgeworCQlzb3VuZC1kYWkgPSA8JmFrNDY0Mz47CisJCXN5c3RlbS1jbG9jay1mcmVxdWVuY3kgPSA8MTEyODk2MDA+OworCX07Cit9OworCitFeGFtcGxlIDIuIDIgQ1BVIDEgQ29kZWMKKworc291bmQgeworCWNvbXBhdGlibGUgPSAicmVuZXNhcyxyc3JjLWNhcmQiOworCisJY2FyZC1uYW1lID0gInJzbmQtYWs0NjQzIjsKKwlmb3JtYXQgPSAibGVmdF9qIjsKKwliaXRjbG9jay1tYXN0ZXIgPSA8JmRwY21jcHU+OworCWZyYW1lLW1hc3RlciA9IDwmZHBjbWNwdT47CisKKwljb252ZXJ0LXJhdGUgPSA8NDgwMDA+OyAgLyogc2VlIGF1ZGlvX2Nsa19hICovCisKKwlhdWRpby1wcmVmaXggPSAiYWs0NjQyIjsKKwlhdWRpby1yb3V0aW5nID0gImFrNDY0MiBQbGF5YmFjayIsICJEQUkwIFBsYXliYWNrIiwKKwkJCSJhazQ2NDIgUGxheWJhY2siLCAiREFJMSBQbGF5YmFjayI7CisKKwlkcGNtY3B1OiBjcHVAMCB7CisJCXNvdW5kLWRhaSA9IDwmcmNhcl9zb3VuZCAwPjsKKwl9OworCisJY3B1QDEgeworCQlzb3VuZC1kYWkgPSA8JnJjYXJfc291bmQgMT47CisJfTsKKworCWNvZGVjIHsKKwkJc291bmQtZGFpID0gPCZhazQ2NDM+OworCQljbG9ja3MgPSA8JmF1ZGlvX2Nsb2NrPjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zdCxzdGktYXNvYy1jYXJkLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zdCxzdGktYXNvYy1jYXJkLnR4dAppbmRleCAxNmJjZGZiLi43NDVkYzYyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc3Qsc3RpLWFzb2MtY2FyZC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3N0LHN0aS1hc29jLWNhcmQudHh0CkBAIC0xMSw3ICsxMSw5IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogUmVxdWlyZWQgcHJvcGVydGllczoKLSAgLSBjb21wYXRpYmxlOiAic3Qsc3RpLXVuaS1wbGF5ZXIiIG9yICJzdCxzdGktdW5pLXJlYWRlciIKKyAgLSBjb21wYXRpYmxlOiAic3Qsc3RpaDQwNy11bmktcGxheWVyLWhkbWkiLCAic3Qsc3RpaDQwNy11bmktcGxheWVyLXBjbS1vdXQiLAorCQkic3Qsc3RpaDQwNy11bmktcGxheWVyLWRhYyIsICJzdCxzdGloNDA3LXVuaS1wbGF5ZXItc3BkaWYiLAorCQkic3Qsc3RpaDQwNy11bmktcmVhZGVyLXBjbV9pbiIsICJzdCxzdGloNDA3LXVuaS1yZWFkZXItaGRtaSIsCiAKICAgLSBzdCxzeXNjZmc6IHBoYW5kbGUgdG8gYm9vdC1kZXZpY2Ugc3lzdGVtIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCiAKQEAgLTMzLDMyICszNSwyNCBAQAogCSJ0eCIgZm9yICJzdCxzdGktdW5pLXBsYXllciIgY29tcGF0aWJpbGl0eQogCSJyeCIgZm9yICJzdCxzdGktdW5pLXJlYWRlciIgY29tcGF0aWJpbGl0eQogCi0gIC0gc3QsdmVyc2lvbjogSVAgdmVyc2lvbiBpbnRlZ3JhdGVkIGluIFNPQy4KLQotICAtIGRhaS1uYW1lOiBEQUkgbmFtZSB0aGF0IGRlc2NyaWJlcyB0aGUgSVAuCi0KLSAgLSBzdCxtb2RlOiBJUCB3b3JraW5nIG1vZGUgZGVwZW5kaW5nIG9uIGFzc29jaWF0ZWQgY29kZWMuCi0JIkhETUkiIGNvbm5lY3RlZCB0byBIRE1JIGNvZGVjIGFuZCBzdXBwb3J0IElFQyBIRE1JIGZvcm1hdHMgKHBsYXllciBvbmx5KS4KLQkiU1BESUYiIGNvbm5lY3RlZCB0byBTUERJRiBjb2RlYyBhbmQgc3VwcG9ydCBTUERJRiBmb3JtYXRzIChwbGF5ZXIgb25seSkuCi0JIlBDTSIgUENNIHN0YW5kYXJkIG1vZGUgZm9yIEkyUyBvciBURE0gYnVzLgotCSJURE0iIFRETSBtb2RlIGZvciBURE0gYnVzLgotCiBSZXF1aXJlZCBwcm9wZXJ0aWVzICgic3Qsc3RpLXVuaS1wbGF5ZXIiIGNvbXBhdGliaWxpdHkgb25seSk6CiAgIC0gY2xvY2tzOiBDUFVfREFJIElQIGNsb2NrIHNvdXJjZSwgbGlzdGVkIGluIHRoZSBzYW1lIG9yZGVyIHRoYW4gdGhlCiAJICAgIENQVV9EQUkgcHJvcGVydGllcy4KIAotICAtIHN0LHVuaXBlcmlwaC1pZDogaW50ZXJuYWwgU09DIElQIGluc3RhbmNlIElELgotCiBPcHRpb25hbCBwcm9wZXJ0aWVzOgogICAtIHBpbmN0cmwtMDogZGVmaW5lZCBmb3IgQ1BVX0RBSUAxIGFuZCBDUFVfREFJQDQgdG8gZGVzY3JpYmUgSTJTIFBJT3MgZm9yCiAJICAgICAgIGV4dGVybmFsIGNvZGVjcyBjb25uZWN0aW9uLgogCiAgIC0gcGluY3RybC1uYW1lczogc2hvdWxkIGNvbnRhaW4gb25seSBvbmUgdmFsdWUgLSAiZGVmYXVsdCIuCiAKKyAgLSBzdCx0ZG0tbW9kZTogdG8gZGVjbGFyZSB0byBzZXQgVERNIG1vZGUgZm9yIHVuaXJlYWRlciBhbmQgdW5pcGxheWVyIElQcy4KKwlPbmx5IGNvbXBhcnRpYmxlIHdpdGggSVBzIGluIGNoYXJnZSBvZiB0aGUgZXh0ZXJuYWwgSTJTL1RETSBidXMuCisJU2hvdWxkIGJlIGRlY2xhcmVkIGRlcGVuZGluZyBvbiBhc3NvY2lhdGVkIGNvZGVjLgorCiBFeGFtcGxlOgogCi0Jc3RpX3VuaV9wbGF5ZXIxOiBzdGktdW5pLXBsYXllckAxIHsKLQkJY29tcGF0aWJsZSA9ICJzdCxzdGktdW5pLXBsYXllciI7CisJc3RpX3VuaV9wbGF5ZXIxOiBzdGktdW5pLXBsYXllckAweDhEODEwMDAgeworCQljb21wYXRpYmxlID0gInN0LHN0aWg0MDctdW5pLXBsYXllci1oZG1pIjsKIAkJc3RhdHVzID0gIm9rYXkiOwogCQkjc291bmQtZGFpLWNlbGxzID0gPDA+OwogCQlzdCxzeXNjZmcgPSA8JnN5c2NmZ19jb3JlPjsKQEAgLTY2LDE1ICs2MCwxMiBAQAogCQlyZWcgPSA8MHg4RDgxMDAwIDB4MTU4PjsKIAkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDg1IElSUV9UWVBFX05PTkU+OwogCQlkbWFzID0gPCZmZG1hMCAzIDAgMT47Ci0JCXN0LGRhaS1uYW1lID0gIlVuaSBQbGF5ZXIgIzEgKEkyUykiOwogCQlkbWEtbmFtZXMgPSAidHgiOwotCQlzdCx1bmlwZXJpcGgtaWQgPSA8MT47Ci0JCXN0LHZlcnNpb24gPSA8NT47Ci0JCXN0LG1vZGUgPSAiVERNIjsKKwkJc3QsdGRtLW1vZGUgPSA8MT47CiAJfTsKIAotCXN0aV91bmlfcGxheWVyMjogc3RpLXVuaS1wbGF5ZXJAMiB7Ci0JCWNvbXBhdGlibGUgPSAic3Qsc3RpLXVuaS1wbGF5ZXIiOworCXN0aV91bmlfcGxheWVyMjogc3RpLXVuaS1wbGF5ZXJAMHg4RDgyMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJzdCxzdGloNDA3LXVuaS1wbGF5ZXItcGNtLW91dCI7CiAJCXN0YXR1cyA9ICJva2F5IjsKIAkJI3NvdW5kLWRhaS1jZWxscyA9IDwwPjsKIAkJc3Qsc3lzY2ZnID0gPCZzeXNjZmdfY29yZT47CkBAIC04MiwxNSArNzMsMTEgQEAKIAkJcmVnID0gPDB4OEQ4MjAwMCAweDE1OD47CiAJCWludGVycnVwdHMgPSA8R0lDX1NQSSA4NiBJUlFfVFlQRV9OT05FPjsKIAkJZG1hcyA9IDwmZmRtYTAgNCAwIDE+OwotCQlkYWktbmFtZSA9ICJVbmkgUGxheWVyICMyIChEQUMpIjsKIAkJZG1hLW5hbWVzID0gInR4IjsKLQkJc3QsdW5pcGVyaXBoLWlkID0gPDI+OwotCQlzdCx2ZXJzaW9uID0gPDU+OwotCQlzdCxtb2RlID0gIlBDTSI7CiAJfTsKIAotCXN0aV91bmlfcGxheWVyMzogc3RpLXVuaS1wbGF5ZXJAMyB7Ci0JCWNvbXBhdGlibGUgPSAic3Qsc3RpLXVuaS1wbGF5ZXIiOworCXN0aV91bmlfcGxheWVyMzogc3RpLXVuaS1wbGF5ZXJAMHg4RDg1MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJzdCxzdGloNDA3LXVuaS1wbGF5ZXItc3BkaWYiOwogCQlzdGF0dXMgPSAib2theSI7CiAJCSNzb3VuZC1kYWktY2VsbHMgPSA8MD47CiAJCXN0LHN5c2NmZyA9IDwmc3lzY2ZnX2NvcmU+OwpAQCAtOTksMTQgKzg2LDEwIEBACiAJCWludGVycnVwdHMgPSA8R0lDX1NQSSA4OSBJUlFfVFlQRV9OT05FPjsKIAkJZG1hcyA9IDwmZmRtYTAgNyAwIDE+OwogCQlkbWEtbmFtZXMgPSAidHgiOwotCQlkYWktbmFtZSA9ICJVbmkgUGxheWVyICMzIChTUERJRikiOwotCQlzdCx1bmlwZXJpcGgtaWQgPSA8Mz47Ci0JCXN0LHZlcnNpb24gPSA8NT47Ci0JCXN0LG1vZGUgPSAiU1BESUYiOwogCX07CiAKLQlzdGlfdW5pX3JlYWRlcjE6IHN0aS11bmktcmVhZGVyQDEgewotCQljb21wYXRpYmxlID0gInN0LHN0aS11bmktcmVhZGVyIjsKKwlzdGlfdW5pX3JlYWRlcjE6IHN0aS11bmktcmVhZGVyQDB4OEQ4NDAwMCB7CisJCWNvbXBhdGlibGUgPSAic3Qsc3RpaDQwNy11bmktcmVhZGVyLWhkbWkiOwogCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQkjc291bmQtZGFpLWNlbGxzID0gPDA+OwogCQlzdCxzeXNjZmcgPSA8JnN5c2NmZ19jb3JlPjsKQEAgLTExNCw5ICs5Nyw2IEBACiAJCWludGVycnVwdHMgPSA8R0lDX1NQSSA4OCBJUlFfVFlQRV9OT05FPjsKIAkJZG1hcyA9IDwmZmRtYTAgNiAwIDE+OwogCQlkbWEtbmFtZXMgPSAicngiOwotCQlkYWktbmFtZSA9ICJVbmkgUmVhZGVyICMxIChIRE1JIFJYKSI7Ci0JCXN0LHZlcnNpb24gPSA8Mz47Ci0JCXN0LG1vZGUgPSAiUENNIjsKIAl9OwogCiAyKSBzdGktc2FzLWNvZGVjOiBpbnRlcm5hbCBhdWRpbyBjb2RlYyBJUHMgZHJpdmVyCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc3VueGksc3VuNGktc3BkaWYudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3N1bnhpLHN1bjRpLXNwZGlmLnR4dAppbmRleCAxMzUwM2FhLi4wMjMwYzRkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvc3VueGksc3VuNGktc3BkaWYudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zdW54aSxzdW40aS1zcGRpZi50eHQKQEAgLTksNiArOSw3IEBACiAKICAgLSBjb21wYXRpYmxlCQk6IHNob3VsZCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKICAgICAtICJhbGx3aW5uZXIsc3VuNGktYTEwLXNwZGlmIjogZm9yIHRoZSBBbGx3aW5uZXIgQTEwIFNvQworICAgIC0gImFsbHdpbm5lcixzdW42aS1hMzEtc3BkaWYiOiBmb3IgdGhlIEFsbHdpbm5lciBBMzEgU29DCiAKICAgLSByZWcJCQk6IE9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBkZXZpY2UuCiAKQEAgLTI1LDYgKzI2LDggQEAKIAkiYXBiIgkJICBjbG9jayBmb3IgdGhlIHNwZGlmIGJ1cy4KIAkic3BkaWYiCQkgIGNsb2NrIGZvciBzcGRpZiBjb250cm9sbGVyLgogCisgIC0gcmVzZXRzCQk6IHJlc2V0IHNwZWNpZmllciBmb3IgdGhlIGFoYiByZXNldCAoQTMxIGFuZCBuZXdlciBvbmx5KQorCiBFeGFtcGxlOgogCiBzcGRpZjogc3BkaWZAMDFjMjEwMDAgewpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3RsdjMyMGFpYzMxeHgudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3RsdjMyMGFpYzMxeHgudHh0CmluZGV4IGVmZjEyYmUuLjkzNDBkMmQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC90bHYzMjBhaWMzMXh4LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvdGx2MzIwYWljMzF4eC50eHQKQEAgLTExLDYgKzExLDcgQEAKICAgICAidGksdGx2MzIwYWljMzExMCIgLSBUTFYzMjBBSUMzMTEwIChzdGVyZW8gc3BlYWtlciBhbXAsIG5vIE1pbmlEU1ApCiAgICAgInRpLHRsdjMyMGFpYzMxMjAiIC0gVExWMzIwQUlDMzEyMCAobW9ubyBzcGVha2VyIGFtcCwgTWluaURTUCkKICAgICAidGksdGx2MzIwYWljMzExMSIgLSBUTFYzMjBBSUMzMTExIChzdGVyZW8gc3BlYWtlciBhbXAsIE1pbmlEU1ApCisgICAgInRpLHRsdjMyMGRhYzMxMDAiIC0gVExWMzIwREFDMzEwMCAobm8gQURDLCBtb25vIHNwZWFrZXIgYW1wLCBubyBNaW5pRFNQKQogCiAtIHJlZyAtIDxpbnQ+IC0gIEkyQyBzbGF2ZSBhZGRyZXNzCiAtIEhQVkRELXN1cHBseSwgU1BSVkRELXN1cHBseSwgU1BMVkRELXN1cHBseSwgQVZERC1zdXBwbHksIElPVkRELXN1cHBseSwKQEAgLTM3LDkgKzM4LDExIEBACiAgICogTUlDQklBUwogCiBDT0RFQyBpbnB1dCBwaW5zOgotICAqIE1JQzFMUAotICAqIE1JQzFSUAotICAqIE1JQzFMTQorICAqIE1JQzFMUCwgZGV2aWNlcyB3aXRoIEFEQworICAqIE1JQzFSUCwgZGV2aWNlcyB3aXRoIEFEQworICAqIE1JQzFMTSwgZGV2aWNlcyB3aXRoIEFEQworICAqIEFJTjEsIGRldmljZXMgd2l0aG91dCBBREMKKyAgKiBBSU4yLCBkZXZpY2VzIHdpdGhvdXQgQURDCiAKIFRoZSBwaW5zIGNhbiBiZSB1c2VkIGluIHJlZmVycmluZyBzb3VuZCBub2RlJ3MgYXVkaW8tcm91dGluZyBwcm9wZXJ0eS4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9icmNtLHNwaS1iY20tcXNwaS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL2JyY20sc3BpLWJjbS1xc3BpLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDdhYzgwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9icmNtLHNwaS1iY20tcXNwaS50eHQKQEAgLTAsMCArMSwyMzMgQEAKK0Jyb2FkY29tIFNQSSBjb250cm9sbGVyCisKK1RoZSBCcm9hZGNvbSBTUEkgY29udHJvbGxlciBpcyBhIFNQSSBtYXN0ZXIgZm91bmQgb24gdmFyaW91cyBTT0NzLCBpbmNsdWRpbmcKK0JSQ01TVEIgKEJDTTdYWFgpLCBDeWdudXMsIE5TUCBhbmQgTlMyLiBUaGUgQnJvYWRjb20gTWFzdGVyIFNQSSBodyBJUCBjb25zaXRzCitvZiA6CisgTVNQSSA6IFNQSSBtYXN0ZXIgY29udHJvbGxlciBjYW4gcmVhZCBhbmQgd3JpdGUgdG8gYSBTUEkgc2xhdmUgZGV2aWNlCisgQlNQSSA6IEJyb2FkY29tIFNQSSBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBNU1BJIGh3IElQIHByb3ZpZGVzIGFjY2VsZXJhdGlvbgorCWZvciBmbGFzaCByZWFkcyBhbmQgYmUgY29uZmlndXJlZCB0byBkbyBzaW5nbGUsIGRvdWJsZSwgcXVhZCBsYW5lCisJaW8gd2l0aCAzLWJ5dGUgYW5kIDQtYnl0ZSBhZGRyZXNzaW5nIHN1cHBvcnQuCisKKyBTdXBwb3J0ZWQgQnJvYWRjb20gU29DcyBoYXZlIG9uZSBpbnN0YW5jZSBvZiBNU1BJK0JTUEkgY29udHJvbGxlciBJUC4KKyBNU1BJIG1hc3RlciBjYW4gYmUgdXNlZCB3aWhvdXQgQlNQSS4gQlJDTVNUQiBTb0NzIGhhdmUgYW4gYWRkaXRpb25hbCBpbnN0YW5jZQorIG9mIGEgTVNQSSBtYXN0ZXIgd2l0aG91dCB0aGUgQlNQSSB0byB1c2Ugd2l0aCBub24gZmxhc2ggc2xhdmUgZGV2aWNlcyB0aGF0CisgdXNlIFNQSSBwcm90b2NvbC4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKworLSAjYWRkcmVzcy1jZWxsczoKKyAgICBNdXN0IGJlIDwxPiwgYXMgcmVxdWlyZWQgYnkgZ2VuZXJpYyBTUEkgYmluZGluZy4KKworLSAjc2l6ZS1jZWxsczoKKyAgICBNdXN0IGJlIDwwPiwgYWxzbyBhcyByZXF1aXJlZCBieSBnZW5lcmljIFNQSSBiaW5kaW5nLgorCistIGNvbXBhdGlibGU6CisgICAgTXVzdCBiZSBvbmUgb2YgOgorICAgICJicmNtLHNwaS1iY20tcXNwaSIsICJicmNtLHNwaS1icmNtc3RiLXFzcGkiIDogTVNQSStCU1BJIG9uIEJSQ01TVEIgU29DcworICAgICJicmNtLHNwaS1iY20tcXNwaSIsICJicmNtLHNwaS1icmNtc3RiLW1zcGkiIDogU2Vjb25kIEluc3RhbmNlIG9mIE1TUEkKKwkJCQkJCSAgIEJSQ01TVEIgIFNvQ3MKKyAgICAiYnJjbSxzcGktYmNtLXFzcGkiLCAiYnJjbSxzcGktbnNwLXFzcGkiICAgICA6IE1TUEkrQlNQSSBvbiBDeWdudXMsIE5TUAorICAgICJicmNtLHNwaS1iY20tcXNwaSIsICJicmNtLHNwaS1uczItcXNwaSIgICAgIDogTlMyIFNvQ3MKKworLSByZWc6CisgICAgRGVmaW5lIHRoZSBiYXNlcyBhbmQgcmFuZ2VzIG9mIHRoZSBhc3NvY2lhdGVkIEkvTyBhZGRyZXNzIHNwYWNlcy4KKyAgICBUaGUgcmVxdWlyZWQgcmFuZ2UgaXMgTVNQSSBjb250cm9sbGVyIHJlZ2lzdGVycy4KKworLSByZWctbmFtZXM6CisgICAgRmlyc3QgbmFtZSBkb2VzIG5vdCBtYXR0ZXIsIGJ1dCBtdXN0IGJlIHJlc2VydmVkIGZvciB0aGUgTVNQSSBjb250cm9sbGVyCisgICAgcmVnaXN0ZXIgcmFuZ2UgYXMgbWVudGlvbmVkIGluICdyZWcnIGFib3ZlLCBhbmQgd2lsbCB0eXBpY2FsbHkgY29udGFpbgorICAgIC0gImJzcGlfcmVncyI6IEJTUEkgcmVnaXN0ZXIgcmFuZ2UsIG5vdCByZXF1aXJlZCB3aXRoIGNvbXBhdGlibGUKKwkJICAgInNwaS1icmNtc3RiLW1zcGkiCisgICAgLSAibXNwaV9yZWdzIjogTVNQSSByZWdpc3RlciByYW5nZSBpcyByZXF1aXJlZCBmb3IgY29tcGF0aWJsZSBzdHJpbmdzCisgICAgLSAiaW50cl9yZWdzIiwgImludHJfc3RhdHVzX3JlZyIgOiBJbnRlcnJ1cHQgYW5kIHN0YXR1cyByZWdpc3RlciBmb3IKKyAgICAgIE5TUCwgTlMyLCBDeWdudXMgU29DCisKKy0gaW50ZXJydXB0cworICAgIFRoZSBpbnRlcnJ1cHRzIHVzZWQgYnkgdGhlIE1TUEkgYW5kL29yIEJTUEkgY29udHJvbGxlci4KKworLSBpbnRlcnJ1cHQtbmFtZXM6CisgICAgTmFtZXMgb2YgaW50ZXJydXB0cyBhc3NvY2lhdGVkIHdpdGggTVNQSQorICAgIC0gIm1zcGlfaGFsdGVkIiA6CisgICAgLSAibXNwaV9kb25lIjogSW5kaWNhdGVzIHRoYXQgdGhlIHJlcXVlc3RlZCBTUEkgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLgorICAgIC0gInNwaV9scl9mdWxsbmVzc19yZWFjaGVkIiA6IExpbmVhciByZWFkIEJTUEkgcGlwZSBmdWxsCisgICAgLSAic3BpX2xyX3Nlc3Npb25fYWJvcnRlZCIgIDogTGluZWFyIHJlYWQgQlNQSSBwaXBlIGFib3J0ZWQKKyAgICAtICJzcGlfbHJfaW1wYXRpZW50IiA6IExpbmVhciByZWFkIEJTUEkgcmVxdWVzdGVkIHdoZW4gcGlwZSBlbXB0eQorICAgIC0gInNwaV9scl9zZXNzaW9uX2RvbmUiIDogTGluZWFyIHJlYWQgQlNQSSBzZXNzaW9uIGRvbmUKKworLSBjbG9ja3M6CisgICAgQSBwaGFuZGxlIHRvIHRoZSByZWZlcmVuY2UgY2xvY2sgZm9yIHRoaXMgYmxvY2suCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CisKKworLSBuYXRpdmUtZW5kaWFuCisgICAgRGVmaW5lZCB3aGVuIHVzaW5nIEJFIFNvQyBhbmQgZGV2aWNlIHVzZXMgQkUgcmVnaXN0ZXIgcmVhZC93cml0ZQorCitSZWNvbW1lbmRlZCBvcHRpb25hbCBtMjVwODAgcHJvcGVydGllczoKKy0gc3BpLXJ4LWJ1cy13aWR0aDogRGVmaW5pdGlvbiBhcyBwZXIKKyAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktYnVzLnR4dAorCitFeGFtcGxlczoKKworQlJDTVNUQiBTb0MgRXhhbXBsZToKKworICBTUEkgTWFzdGVyIChNU1BJK0JTUEkpIGZvciBTUEktTk9SIGFjY2VzczoKKworICAgIHNwaUBmMDNlMzQwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDB4MT47CisJCSNzaXplLWNlbGxzID0gPDB4MD47CisJCWNvbXBhdGlibGUgPSAiYnJjbSxzcGktYnJjbXN0Yi1xc3BpIiwgImJyY20sc3BpLWJyY21zdGItcXNwaSI7CisJCXJlZyA9IDwweGYwM2UwOTIwIDB4NCAweGYwM2UzNDAwIDB4MTg4IDB4ZjAzZTMyMDAgMHg1MD47CisJCXJlZy1uYW1lcyA9ICJjc19yZWciLCAibXNwaSIsICJic3BpIjsKKwkJaW50ZXJydXB0cyA9IDwweDYgMHg1IDB4NCAweDMgMHgyIDB4MSAweDA+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPDB4MWM+OworCQlpbnRlcnJ1cHQtbmFtZXMgPSAibXNwaV9oYWx0ZWQiLAorCQkJCSAgIm1zcGlfZG9uZSIsCisJCQkJICAic3BpX2xyX292ZXJyZWFkIiwKKwkJCQkgICJzcGlfbHJfc2Vzc2lvbl9kb25lIiwKKwkJCQkgICJzcGlfbHJfaW1wYXRpZW50IiwKKwkJCQkgICJzcGlfbHJfc2Vzc2lvbl9hYm9ydGVkIiwKKwkJCQkgICJzcGlfbHJfZnVsbG5lc3NfcmVhY2hlZCI7CisKKwkJY2xvY2tzID0gPCZoaWZfc3BpPjsKKwkJY2xvY2stbmFtZXMgPSAic3dfc3BpIjsKKworCQltMjVwODBAMCB7CisJCQkjc2l6ZS1jZWxscyA9IDwweDI+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MHgyPjsKKwkJCWNvbXBhdGlibGUgPSAibTI1cDgwIjsKKwkJCXJlZyA9IDwweDA+OworCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8MHgyNjI1YTAwPjsKKwkJCXNwaS1jcG9sOworCQkJc3BpLWNwaGE7CisJCQltMjVwLGZhc3QtcmVhZDsKKworCQkJZmxhc2gwLmJvbHRAMCB7CisJCQkJcmVnID0gPDB4MCAweDAgMHgwIDB4MTAwMDAwPjsKKwkJCX07CisKKwkJCWZsYXNoMC5tYWNhZHJAMTAwMDAwIHsKKwkJCQlyZWcgPSA8MHgwIDB4MTAwMDAwIDB4MCAweDEwMDAwPjsKKwkJCX07CisKKwkJCWZsYXNoMC5udnJhbUAxMTAwMDAgeworCQkJCXJlZyA9IDwweDAgMHgxMTAwMDAgMHgwIDB4MTAwMDA+OworCQkJfTsKKworCQkJZmxhc2gwLmtlcm5lbEAxMjAwMDAgeworCQkJCXJlZyA9IDwweDAgMHgxMjAwMDAgMHgwIDB4NDAwMDAwPjsKKwkJCX07CisKKwkJCWZsYXNoMC5kZXZ0cmVlQDUyMDAwMCB7CisJCQkJcmVnID0gPDB4MCAweDUyMDAwMCAweDAgMHgxMDAwMD47CisJCQl9OworCisJCQlmbGFzaDAuc3BsYXNoQDUzMDAwMCB7CisJCQkJcmVnID0gPDB4MCAweDUzMDAwMCAweDAgMHg4MDAwMD47CisJCQl9OworCisJCQlmbGFzaDBAMCB7CisJCQkJcmVnID0gPDB4MCAweDAgMHgwIDB4NDAwMDAwMD47CisJCQl9OworCQl9OworCX07CisKKworICAgIE1TUEkgbWFzdGVyIGZvciBhbnkgU1BJIGRldmljZSA6CisKKwlzcGlAZjA0MTYwMDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisJCWNsb2NrcyA9IDwmdXBnX2ZpeGVkPjsKKwkJY29tcGF0aWJsZSA9ICJicmNtLHNwaS1icmNtc3RiLXFzcGkiLCAiYnJjbSxzcGktYnJjbXN0Yi1tc3BpIjsKKwkJcmVnID0gPDB4ZjA0MTYwMDAgMHgxODA+OworCQlyZWctbmFtZXMgPSAibXNwaSI7CisJCWludGVycnVwdHMgPSA8MHgxND47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JmlycTBfYW9uX2ludGM+OworCQlpbnRlcnJ1cHQtbmFtZXMgPSAibXNwaV9kb25lIjsKKwl9OworCitpUHJvYyBTb0MgRXhhbXBsZToKKworICAgIHFzcGk6IHNwaUAxODAyNzIwMCB7CisJY29tcGF0aWJsZSA9ICJicmNtLHNwaS1iY20tcXNwaSIsICJicmNtLHNwaS1uc3AtcXNwaSI7CisJcmVnID0gPDB4MTgwMjcyMDAgMHgxODQ+LAorCSAgICAgIDwweDE4MDI3MDAwIDB4MTI0PiwKKwkgICAgICA8MHgxODExYzQwOCAweDAwND4sCisJICAgICAgPDB4MTgwMjczYTAgMHgwMWM+OworCXJlZy1uYW1lcyA9ICJtc3BpX3JlZ3MiLCAiYnNwaV9yZWdzIiwgImludHJfcmVncyIsICJpbnRyX3N0YXR1c19yZWciOworCWludGVycnVwdHMgPSA8R0lDX1NQSSA3MiBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKKwkJICAgICA8R0lDX1NQSSA3MyBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKKwkJICAgICA8R0lDX1NQSSA3NCBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKKwkJICAgICA8R0lDX1NQSSA3NSBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKKwkJICAgICA8R0lDX1NQSSA3NiBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKKwkJICAgICA8R0lDX1NQSSA3NyBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKKwkJICAgICA8R0lDX1NQSSA3OCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwlpbnRlcnJ1cHQtbmFtZXMgPQorCQkgICAgICJzcGlfbHJfZnVsbG5lc3NfcmVhY2hlZCIsCisJCSAgICAgInNwaV9scl9zZXNzaW9uX2Fib3J0ZWQiLAorCQkgICAgICJzcGlfbHJfaW1wYXRpZW50IiwKKwkJICAgICAic3BpX2xyX3Nlc3Npb25fZG9uZSIsCisJCSAgICAgIm1zcGlfZG9uZSIsCisJCSAgICAgIm1zcGlfaGFsdGVkIjsKKwljbG9ja3MgPSA8Jmlwcm9jbWVkPjsKKwljbG9jay1uYW1lcyA9ICJpcHJvY21lZCI7CisJbnVtLWNzID0gPDI+OworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDA+OworICAgIH07CisKKworIE5TMiBTb0MgRXhhbXBsZToKKworCSAgICAgICBxc3BpOiBzcGlANjY0NzAyMDAgeworCQkgICAgICAgY29tcGF0aWJsZSA9ICJicmNtLHNwaS1iY20tcXNwaSIsICJicmNtLHNwaS1uczItcXNwaSI7CisJCSAgICAgICByZWcgPSA8MHg2NjQ3MDIwMCAweDE4ND4sCisJCQkgICAgIDwweDY2NDcwMDAwIDB4MTI0PiwKKwkJCSAgICAgPDB4NjcwMTc0MDggMHgwMDQ+LAorCQkJICAgICA8MHg2NjQ3MDNhMCAweDAxYz47CisJCSAgICAgICByZWctbmFtZXMgPSAibXNwaSIsICJic3BpIiwgImludHJfcmVncyIsCisJCQkiaW50cl9zdGF0dXNfcmVnIjsKKwkJICAgICAgIGludGVycnVwdHMgPSA8R0lDX1NQSSA0MTkgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCSAgICAgICBpbnRlcnJ1cHQtbmFtZXMgPSAic3BpX2wxX2ludHIiOworCQkJY2xvY2tzID0gPCZpcHJvY21lZD47CisJCQljbG9jay1uYW1lcyA9ICJpcHJvY21lZCI7CisJCQludW0tY3MgPSA8Mj47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCSAgICAgICB9OworCisKKyBtMjVwODAgbm9kZSBmb3IgTlNQLCBOUzIKKworCSAmcXNwaSB7CisJCSAgICAgIGZsYXNoOiBtMjVwODBAMCB7CisJCSAgICAgICNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkgICAgICAjc2l6ZS1jZWxscyA9IDwxPjsKKwkJICAgICAgY29tcGF0aWJsZSA9ICJtMjVwODAiOworCQkgICAgICByZWcgPSA8MHgwPjsKKwkJICAgICAgc3BpLW1heC1mcmVxdWVuY3kgPSA8MTI1MDAwMDA+OworCQkgICAgICBtMjVwLGZhc3QtcmVhZDsKKwkJICAgICAgc3BpLWNwb2w7CisJCSAgICAgIHNwaS1jcGhhOworCisJCSAgICAgIHBhcnRpdGlvbkAwIHsKKwkJCQkgIGxhYmVsID0gImJvb3QiOworCQkJCSAgcmVnID0gPDB4MDAwMDAwMDAgMHgwMDBhMDAwMD47CisJCSAgICAgIH07CisKKwkJICAgICAgcGFydGl0aW9uQGEwMDAwIHsKKwkJCQkgIGxhYmVsID0gImVudiI7CisJCQkJICByZWcgPSA8MHgwMDBhMDAwMCAweDAwMDYwMDAwPjsKKwkJICAgICAgfTsKKworCQkgICAgICBwYXJ0aXRpb25AMTAwMDAwIHsKKwkJCQkgIGxhYmVsID0gInN5c3RlbSI7CisJCQkJICByZWcgPSA8MHgwMDEwMDAwMCAweDAwNjAwMDAwPjsKKwkJICAgICAgfTsKKworCQkgICAgICBwYXJ0aXRpb25ANzAwMDAwIHsKKwkJCQkgIGxhYmVsID0gInJvb3RmcyI7CisJCQkJICByZWcgPSA8MHgwMDcwMDAwMCAweDAxOTAwMDAwPjsKKwkJICAgICAgfTsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9qY29yZSxzcGkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9qY29yZSxzcGkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzOTM2ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL2pjb3JlLHNwaS50eHQKQEAgLTAsMCArMSwzNCBAQAorSi1Db3JlIFNQSSBtYXN0ZXIKKworUmVxdWlyZWQgcHJvcGVydGllczoKKworLSBjb21wYXRpYmxlOiBNdXN0IGJlICJqY29yZSxzcGkyIi4KKworLSByZWc6IE1lbW9yeSByZWdpb24gZm9yIHJlZ2lzdGVycy4KKworLSAjYWRkcmVzcy1jZWxsczogTXVzdCBiZSAxLgorCistICNzaXplLWNlbGxzOiBNdXN0IGJlIDAuCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CisKKy0gY2xvY2tzOiBJZiBhIHBoYW5kbGUgbmFtZWQgInJlZl9jbGsiIGlzIHByZXNlbnQsIFNQSSBjbG9jayBzcGVlZAorICBwcm9ncmFtbWluZyBpcyByZWxhdGl2ZSB0byB0aGUgZnJlcXVlbmN5IG9mIHRoZSBpbmRpY2F0ZWQgY2xvY2suCisgIE5lY2Vzc2FyeSBvbmx5IGlmIHRoZSBpbnB1dCBjbG9jayByYXRlIGlzIHNvbWV0aGluZyBvdGhlciB0aGFuIGEKKyAgZml4ZWQgNTAgTUh6LgorCistIGNsb2NrLW5hbWVzOiBDbG9jayBuYW1lcywgb25lIGZvciBlYWNoIHBoYW5kbGUgaW4gY2xvY2tzLgorCitTZWUgc3BpLWJ1cy50eHQgZm9yIGFkZGl0aW9uYWwgcHJvcGVydGllcyBub3Qgc3BlY2lmaWMgdG8gdGhpcyBkZXZpY2UuCisKK0V4YW1wbGU6CisKK3NwaUA0MCB7CisJY29tcGF0aWJsZSA9ICJqY29yZSxzcGkyIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwwPjsKKwlyZWcgPSA8MHg0MCAweDg+OworCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDI1MDAwMDAwPjsKKwljbG9ja3MgPSA8JmJ1c19jbGs+OworCWNsb2NrLW5hbWVzID0gInJlZl9jbGsiOworfQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktYnVzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLWJ1cy50eHQKaW5kZXggMTc4MjI4Ni4uNGIxZDZlNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktYnVzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1idXMudHh0CkBAIC0zMSw3ICszMSw3IEBACiBTbyBpZiBmb3IgZXhhbXBsZSB0aGUgY29udHJvbGxlciBoYXMgMiBDUyBsaW5lcywgYW5kIHRoZSBjcy1ncGlvcwogcHJvcGVydHkgbG9va3MgbGlrZSB0aGlzOgogCi1jcy1ncGlvcyA9IDwmZ3BpbzEgMCAwPiA8MD4gPCZncGlvMSAxIDA+IDwmZ3BpbzEgMiAwPjsKK2NzLWdwaW9zID0gPCZncGlvMSAwIDA+LCA8MD4sIDwmZ3BpbzEgMSAwPiwgPCZncGlvMSAyIDA+OwogCiBUaGVuIGl0IHNob3VsZCBiZSBjb25maWd1cmVkIHNvIHRoYXQgbnVtX2NoaXBzZWxlY3QgPSA0IHdpdGggdGhlCiBmb2xsb3dpbmcgbWFwcGluZzoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLW1lc29uLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLW1lc29uLnR4dAppbmRleCBiYjUyYTg2Li5kYzZkMDMxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1tZXNvbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktbWVzb24udHh0CkBAIC03LDcgKzcsNyBAQAogcmVjZWl2ZSBidWZmZXIuCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6Ci0gLSBjb21wYXRpYmxlOiBzaG91bGQgYmUgImFtbG9naWMsbWVzb242LXNwaWZjIgorIC0gY29tcGF0aWJsZTogc2hvdWxkIGJlICJhbWxvZ2ljLG1lc29uNi1zcGlmYyIgb3IgImFtbG9naWMsbWVzb24tZ3hiYi1zcGlmYyIKICAtIHJlZzogcGh5c2ljYWwgYmFzZSBhZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIGNvbnRyb2xsZXIgcmVnaXN0ZXJzCiAgLSBjbG9ja3M6IHBoYW5kbGUgb2YgdGhlIGlucHV0IGNsb2NrIGZvciB0aGUgYmF1ZCByYXRlIGdlbmVyYXRvcgogIC0gI2FkZHJlc3MtY2VsbHM6IHNob3VsZCBiZSAxCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdGhlcm1hbC90aGVybWFsLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90aGVybWFsL3RoZXJtYWwudHh0CmluZGV4IDQxYjgxN2YuLjg4YjZlYTEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90aGVybWFsL3RoZXJtYWwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90aGVybWFsL3RoZXJtYWwudHh0CkBAIC02Miw3ICs2Miw3IEBACiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgogLSAjY29vbGluZy1jZWxsczoJVXNlZCB0byBwcm92aWRlIGNvb2xpbmcgZGV2aWNlIHNwZWNpZmljIGluZm9ybWF0aW9uCiAgIFR5cGU6IHVuc2lnbmVkCXdoaWxlIHJlZmVycmluZyB0byBpdC4gTXVzdCBiZSBhdCBsZWFzdCAyLCBpbiBvcmRlcgotICBTaXplOiBvbmUgY2VsbCAgICAgIAl0byBzcGVjaWZ5IG1pbmltdW0gYW5kIG1heGltdW0gY29vbGluZyBzdGF0ZSB1c2VkCisgIFNpemU6IG9uZSBjZWxsCXRvIHNwZWNpZnkgbWluaW11bSBhbmQgbWF4aW11bSBjb29saW5nIHN0YXRlIHVzZWQKIAkJCWluIHRoZSByZWZlcmVuY2UuIFRoZSBmaXJzdCBjZWxsIGlzIHRoZSBtaW5pbXVtCiAJCQljb29saW5nIHN0YXRlIHJlcXVlc3RlZCBhbmQgdGhlIHNlY29uZCBjZWxsIGlzCiAJCQl0aGUgbWF4aW11bSBjb29saW5nIHN0YXRlIHJlcXVlc3RlZCBpbiB0aGUgcmVmZXJlbmNlLgpAQCAtMTE5LDcgKzExOSw3IEBACiBPcHRpb25hbCBwcm9wZXJ0eToKIC0gY29udHJpYnV0aW9uOgkJVGhlIGNvb2xpbmcgY29udHJpYnV0aW9uIHRvIHRoZSB0aGVybWFsIHpvbmUgb2YgdGhlCiAgIFR5cGU6IHVuc2lnbmVkCXJlZmVycmVkIGNvb2xpbmcgZGV2aWNlIGF0IHRoZSByZWZlcnJlZCB0cmlwIHBvaW50LgotICBTaXplOiBvbmUgY2VsbCAgICAgIAlUaGUgY29udHJpYnV0aW9uIGlzIGEgcmF0aW8gb2YgdGhlIHN1bQorICBTaXplOiBvbmUgY2VsbAlUaGUgY29udHJpYnV0aW9uIGlzIGEgcmF0aW8gb2YgdGhlIHN1bQogCQkJb2YgYWxsIGNvb2xpbmcgY29udHJpYnV0aW9ucyB3aXRoaW4gYSB0aGVybWFsIHpvbmUuCiAKIE5vdGU6IFVzaW5nIHRoZSBUSEVSTUFMX05PX0xJTUlUICgtMVVMKSBjb25zdGFudCBpbiB0aGUgY29vbGluZy1kZXZpY2UgcGhhbmRsZQpAQCAtMTQ1LDcgKzE0NSw3IEBACiAgIFNpemU6IG9uZSBjZWxsCiAKIC0gdGhlcm1hbC1zZW5zb3JzOglBIGxpc3Qgb2YgdGhlcm1hbCBzZW5zb3IgcGhhbmRsZXMgYW5kIHNlbnNvciBzcGVjaWZpZXIKLSAgVHlwZTogbGlzdCBvZiAJdXNlZCB3aGlsZSBtb25pdG9yaW5nIHRoZSB0aGVybWFsIHpvbmUuCisgIFR5cGU6IGxpc3Qgb2YJCXVzZWQgd2hpbGUgbW9uaXRvcmluZyB0aGUgdGhlcm1hbCB6b25lLgogICBwaGFuZGxlcyArIHNlbnNvcgogICBzcGVjaWZpZXIKIApAQCAtNDczLDcgKzQ3Myw3IEBACiAJCQkJICA8JmFkYz47CS8qIHBjYiBub3J0aCAqLwogCiAJCS8qIGhvdHNwb3QgPSAxMDAgKiBiYW5kZ2FwIC0gMTIwICogYWRjICsgNDg0ICovCi0JCWNvZWZmaWNpZW50cyA9IAkJPDEwMAktMTIwCTQ4ND47CisJCWNvZWZmaWNpZW50cyA9CQk8MTAwCS0xMjAJNDg0PjsKIAogCQl0cmlwcyB7CiAJCQkuLi4KQEAgLTUwMiw3ICs1MDIsNyBAQAogICAgICAgICB0aGVybWFsLXNlbnNvcnMgPSAgPCZhZGM+OwogCiAJCS8qIGhvdHNwb3QgPSAxICogYWRjICsgNjAwMCAqLwotCWNvZWZmaWNpZW50cyA9IAkJPDEJNjAwMD47CisJY29lZmZpY2llbnRzID0JCTwxCTYwMDA+OwogCiAoZCkgLSBCb2FyZCB0aGVybWFsCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90aW1lci9tb3hhLG1veGFydC10aW1lci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdGltZXIvbW94YSxtb3hhcnQtdGltZXIudHh0CmluZGV4IGRhMmQ1MTAuLmUyMDdjMTEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90aW1lci9tb3hhLG1veGFydC10aW1lci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3RpbWVyL21veGEsbW94YXJ0LXRpbWVyLnR4dApAQCAtMiw3ICsyLDkgQEAKIAogUmVxdWlyZWQgcHJvcGVydGllczoKIAotLSBjb21wYXRpYmxlIDogTXVzdCBiZSAibW94YSxtb3hhcnQtdGltZXIiCistIGNvbXBhdGlibGUgOiBNdXN0IGJlIG9uZSBvZjoKKyAJLSAibW94YSxtb3hhcnQtdGltZXIiCisgCS0gImFzcGVlZCxhc3QyNDAwLXRpbWVyIgogLSByZWcgOiBTaG91bGQgY29udGFpbiByZWdpc3RlcnMgbG9jYXRpb24gYW5kIGxlbmd0aAogLSBpbnRlcnJ1cHRzIDogU2hvdWxkIGNvbnRhaW4gdGhlIHRpbWVyIGludGVycnVwdCBudW1iZXIKIC0gY2xvY2tzIDogU2hvdWxkIGNvbnRhaW4gcGhhbmRsZSBmb3IgdGhlIGNsb2NrIHRoYXQgZHJpdmVzIHRoZSBjb3VudGVyCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdGltZXIvb3hzZW1pLHJwcy10aW1lci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdGltZXIvb3hzZW1pLHJwcy10aW1lci50eHQKaW5kZXggM2NhODljZC4uZDE5MTYxMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3RpbWVyL294c2VtaSxycHMtdGltZXIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90aW1lci9veHNlbWkscnBzLXRpbWVyLnR4dApAQCAtMiw3ICsyLDcgQEAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgotLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgIm94c2VtaSxveDgxMHNlLXJwcy10aW1lciIKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJveHNlbWksb3g4MTBzZS1ycHMtdGltZXIiIG9yICJveHNlbWksb3g4MjAtcnBzLXRpbWVyIgogLSByZWcgOiBTcGVjaWZpZXMgYmFzZSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBzaXplIG9mIHRoZSByZWdpc3RlcnMuCiAtIGludGVycnVwdHMgOiBUaGUgaW50ZXJydXB0cyBvZiB0aGUgdHdvIHRpbWVycwogLSBjbG9ja3MgOiBUaGUgcGhhbmRsZSBvZiB0aGUgdGltZXIgY2xvY2sgc291cmNlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2NpLWhkcmMtdXNiMi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2NpLWhkcmMtdXNiMi50eHQKaW5kZXggMzQxZGM2Ny4uMGUwMzM0NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9jaS1oZHJjLXVzYjIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvY2ktaGRyYy11c2IyLnR4dApAQCAtODEsNiArODEsOCBAQAogLSBmc2wsdXNibWlzYzogcGhhbmRsZXIgb2Ygbm9uLWNvcmUgcmVnaXN0ZXIgZGV2aWNlLCB3aXRoIG9uZQogICBhcmd1bWVudCB0aGF0IGluZGljYXRlIHVzYiBjb250cm9sbGVyIGluZGV4CiAtIGRpc2FibGUtb3Zlci1jdXJyZW50OiBkaXNhYmxlIG92ZXIgY3VycmVudCBkZXRlY3QKKy0gb3Zlci1jdXJyZW50LWFjdGl2ZS1oaWdoOiBvdmVyIGN1cnJlbnQgc2lnbmFsIHBvbGFyaXR5IGlzIGhpZ2ggYWN0aXZlLAorICB0eXBpY2FsbHkgb3ZlciBjdXJyZW50IHNpZ25hbCBwb2xhcml0eSBpcyBsb3cgYWN0aXZlLgogLSBleHRlcm5hbC12YnVzLWRpdmlkZXI6IGVuYWJsZXMgb2ZmLWNoaXAgcmVzaXN0b3IgZGl2aWRlciBmb3IgVmJ1cwogCiBFeGFtcGxlOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9kd2MyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvZHdjMi50eHQKaW5kZXggMjBhNjhiZi4uN2QxNmViZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9kd2MyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2R3YzIudHh0CkBAIC0yNiw3ICsyNiwxMCBAQAogLSBnLXVzZS1kbWE6IGVuYWJsZSBkbWEgdXNhZ2UgaW4gZ2FkZ2V0IGRyaXZlci4KIC0gZy1yeC1maWZvLXNpemU6IHNpemUgb2YgcnggZmlmbyBzaXplIGluIGdhZGdldCBtb2RlLgogLSBnLW5wLXR4LWZpZm8tc2l6ZTogc2l6ZSBvZiBub24tcGVyaW9kaWMgdHggZmlmbyBzaXplIGluIGdhZGdldCBtb2RlLgotLSBnLXR4LWZpZm8tc2l6ZTogc2l6ZSBvZiBwZXJpb2RpYyB0eCBmaWZvIHBlciBlbmRwb2ludCAoZXhjZXB0IGVwMCkgaW4gZ2FkZ2V0IG1vZGUuCisKK0RlcHJlY2F0ZWQgcHJvcGVydGllczoKKy0gZy10eC1maWZvLXNpemU6IHNpemUgb2YgcGVyaW9kaWMgdHggZmlmbyBwZXIgZW5kcG9pbnQgKGV4Y2VwdCBlcDApCisgIGluIGdhZGdldCBtb2RlLgogCiBFeGFtcGxlOgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2R3YzMtY2F2aXVtLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvZHdjMy1jYXZpdW0udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMGI3ODIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2R3YzMtY2F2aXVtLnR4dApAQCAtMCwwICsxLDI4IEBACitDYXZpdW0gU3VwZXJTcGVlZCBEV0MzIFVTQiBTb0MgY29udHJvbGxlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOglTaG91bGQgY29udGFpbiAiY2F2aXVtLG9jdGVvbi03MTMwLXVzYi11Y3RsIgorCitSZXF1aXJlZCBjaGlsZCBub2RlOgorQSBjaGlsZCBub2RlIG11c3QgZXhpc3QgdG8gcmVwcmVzZW50IHRoZSBjb3JlIERXQzMgSVAgYmxvY2suIFRoZSBuYW1lIG9mCit0aGUgbm9kZSBpcyBub3QgaW1wb3J0YW50LiBUaGUgY29udGVudCBvZiB0aGUgbm9kZSBpcyBkZWZpbmVkIGluIGR3YzMudHh0LgorCitFeGFtcGxlIGRldmljZSBub2RlOgorCisJCSAgICB1Y3RsQDExODAwNjkwMDAwMDAgeworCQkJICAgIGNvbXBhdGlibGUgPSAiY2F2aXVtLG9jdGVvbi03MTMwLXVzYi11Y3RsIjsKKwkJCSAgICByZWcgPSA8MHgwMDAxMTgwMCAweDY5MDAwMDAwIDB4MDAwMDAwMDAgMHgwMDAwMDEwMD47CisJCQkgICAgcmFuZ2VzOworCQkJICAgICNhZGRyZXNzLWNlbGxzID0gPDB4MDAwMDAwMDI+OworCQkJICAgICNzaXplLWNlbGxzID0gPDB4MDAwMDAwMDI+OworCQkJICAgIHJlZmNsay1mcmVxdWVuY3kgPSA8MHgwNWY1ZTEwMD47CisJCQkgICAgcmVmY2xrLXR5cGUtc3MgPSAiZGxtY19yZWZfY2xrMCI7CisJCQkgICAgcmVmY2xrLXR5cGUtaHMgPSAiZGxtY19yZWZfY2xrMCI7CisJCQkgICAgcG93ZXIgPSA8MHgwMDAwMDAwMiAweDAwMDAwMDAyIDB4MDAwMDAwMDE+OworCQkJICAgIHhoY2lAMTY5MDAwMDAwMDAwMCB7CisJCQkJICAgIGNvbXBhdGlibGUgPSAiY2F2aXVtLG9jdGVvbi03MTMwLXhoY2kiLCAic3lub3BzeXMsZHdjMyI7CisJCQkJICAgIHJlZyA9IDwweDAwMDE2OTAwIDB4MDAwMDAwMDAgMHgwMDAwMDAxMCAweDAwMDAwMDAwPjsKKwkJCQkgICAgaW50ZXJydXB0LXBhcmVudCA9IDwweDAwMDAwMDEwPjsKKwkJCQkgICAgaW50ZXJydXB0cyA9IDwweDAwMDAwMDA5IDB4MDAwMDAwMDQ+OworCQkJICAgIH07CisJCSAgICB9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9kd2MzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvZHdjMy50eHQKaW5kZXggN2Q3Y2UwOC4uZTNlNjk4MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9kd2MzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2R3YzMudHh0CkBAIC0xMyw3ICsxMyw4IEBACiAgICBpbiB0aGUgYXJyYXkgaXMgZXhwZWN0ZWQgdG8gYmUgYSBoYW5kbGUgdG8gdGhlIFVTQjIvSFMgUEhZIGFuZAogICAgdGhlIHNlY29uZCBlbGVtZW50IGlzIGV4cGVjdGVkIHRvIGJlIGEgaGFuZGxlIHRvIHRoZSBVU0IzL1NTIFBIWQogIC0gcGh5czogZnJvbSB0aGUgKkdlbmVyaWMgUEhZKiBiaW5kaW5ncwotIC0gcGh5LW5hbWVzOiBmcm9tIHRoZSAqR2VuZXJpYyBQSFkqIGJpbmRpbmdzCisgLSBwaHktbmFtZXM6IGZyb20gdGhlICpHZW5lcmljIFBIWSogYmluZGluZ3M7IHN1cHBvcnRlZCBuYW1lcyBhcmUgInVzYjItcGh5IgorCW9yICJ1c2IzLXBoeSIuCiAgLSBzbnBzLHVzYjNfbHBtX2NhcGFibGU6IGRldGVybWluZXMgaWYgcGxhdGZvcm0gaXMgVVNCMyBMUE0gY2FwYWJsZQogIC0gc25wcyxkaXNhYmxlX3NjcmFtYmxlX3F1aXJrOiB0cnVlIHdoZW4gU1cgc2hvdWxkIGRpc2FibGUgZGF0YSBzY3JhbWJsaW5nLgogCU9ubHkgcmVhbGx5IHVzZWZ1bCBmb3IgRlBHQSBidWlsZHMuCkBAIC0zOSw2ICs0MCwxMSBAQAogCQkJZGlzYWJsaW5nIHRoZSBzdXNwZW5kIHNpZ25hbCB0byB0aGUgUEhZLgogIC0gc25wcyxkaXNfcnhkZXRfaW5wM19xdWlyazogd2hlbiBzZXQgY29yZSB3aWxsIGRpc2FibGUgcmVjZWl2ZXIgZGV0ZWN0aW9uCiAJCQlpbiBQSFkgUDMgcG93ZXIgc3RhdGUuCisgLSBzbnBzLGRpcy11Mi1mcmVlY2xrLWV4aXN0cy1xdWlyazogd2hlbiBzZXQsIGNsZWFyIHRoZSB1Ml9mcmVlY2xrX2V4aXN0cworCQkJaW4gR1VTQjJQSFlDRkcsIHNwZWNpZnkgdGhhdCBVU0IyIFBIWSBkb2Vzbid0IHByb3ZpZGUKKwkJCWEgZnJlZS1ydW5uaW5nIFBIWSBjbG9jay4KKyAtIHNucHMsZGlzLWRlbC1waHktcG93ZXItY2hnLXF1aXJrOiB3aGVuIHNldCBjb3JlIHdpbGwgY2hhbmdlIFBIWSBwb3dlcgorCQkJZnJvbSBQMCB0byBQMS9QMi9QMyB3aXRob3V0IGRlbGF5LgogIC0gc25wcyxpcy11dG1pLWwxLXN1c3BlbmQ6IHRydWUgd2hlbiBEV0MzIGFzc2VydHMgb3V0cHV0IHNpZ25hbAogCQkJdXRtaV9sMV9zdXNwZW5kX24sIGZhbHNlIHdoZW4gYXNzZXJ0cyB1dG1pX3NsZWVwX24KICAtIHNucHMsaGlyZC10aHJlc2hvbGQ6IEhJUkQgdGhyZXNob2xkCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2dlbmVyaWMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9nZW5lcmljLnR4dAppbmRleCBiYmE4MjU3Li5iZmFkZWIxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2dlbmVyaWMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvZ2VuZXJpYy50eHQKQEAgLTExLDYgKzExLDExIEBACiAJCQkicGVyaXBoZXJhbCIgYW5kICJvdGciLiBJbiBjYXNlIHRoaXMgYXR0cmlidXRlIGlzbid0CiAJCQlwYXNzZWQgdmlhIERULCBVU0IgRFJEIGNvbnRyb2xsZXJzIHNob3VsZCBkZWZhdWx0IHRvCiAJCQlPVEcuCisgLSBwaHlfdHlwZTogdGVsbHMgVVNCIGNvbnRyb2xsZXJzIHRoYXQgd2Ugd2FudCB0byBjb25maWd1cmUgdGhlIGNvcmUgdG8gc3VwcG9ydAorCQkJYSBVVE1JKyBQSFkgd2l0aCBhbiA4LSBvciAxNi1iaXQgaW50ZXJmYWNlIGlmIFVUTUkrIGlzCisJCQlzZWxlY3RlZC4gVmFsaWQgYXJndW1lbnRzIGFyZSAidXRtaSIgYW5kICJ1dG1pX3dpZGUiLgorCQkJSW4gY2FzZSB0aGlzIGlzbid0IHBhc3NlZCB2aWEgRFQsIFVTQiBjb250cm9sbGVycyBzaG91bGQKKwkJCWRlZmF1bHQgdG8gSFcgY2FwYWJpbGl0eS4KICAtIG90Zy1yZXY6IHRlbGxzIHVzYiBkcml2ZXIgdGhlIHJlbGVhc2UgbnVtYmVyIG9mIHRoZSBPVEcgYW5kIEVIIHN1cHBsZW1lbnQKIAkJCXdpdGggd2hpY2ggdGhlIGRldmljZSBhbmQgaXRzIGRlc2NyaXB0b3JzIGFyZSBjb21wbGlhbnQsCiAJCQlpbiBiaW5hcnktY29kZWQgZGVjaW1hbCAoaS5lLiAyLjAgaXMgMDIwMEgpLiBUaGlzCkBAIC0zNCw2ICszOSw3IEBACiAJdXNiLXBoeSA9IDwmdXNiMl9waHk+LCA8JnVzYjMscGh5PjsKIAltYXhpbXVtLXNwZWVkID0gInN1cGVyLXNwZWVkIjsKIAlkcl9tb2RlID0gIm90ZyI7CisJcGh5X3R5cGUgPSAidXRtaV93aWRlIjsKIAlvdGctcmV2ID0gPDB4MDIwMD47CiAJYWRwLWRpc2FibGU7CiB9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9yZW5lc2FzX3VzYmhzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvcmVuZXNhc191c2Jocy50eHQKaW5kZXggYjYwNDA1Ni4uOWUxOGUwMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9yZW5lc2FzX3VzYmhzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3JlbmVzYXNfdXNiaHMudHh0CkBAIC05LDYgKzksNyBAQAogCS0gInJlbmVzYXMsdXNiaHMtcjhhNzc5MyIgZm9yIHI4YTc3OTMgKFItQ2FyIE0yLU4pIGNvbXBhdGlibGUgZGV2aWNlCiAJLSAicmVuZXNhcyx1c2Jocy1yOGE3Nzk0IiBmb3IgcjhhNzc5NCAoUi1DYXIgRTIpIGNvbXBhdGlibGUgZGV2aWNlCiAJLSAicmVuZXNhcyx1c2Jocy1yOGE3Nzk1IiBmb3IgcjhhNzc5NSAoUi1DYXIgSDMpIGNvbXBhdGlibGUgZGV2aWNlCisJLSAicmVuZXNhcyx1c2Jocy1yOGE3Nzk2IiBmb3IgcjhhNzc5NiAoUi1DYXIgTTMtVykgY29tcGF0aWJsZSBkZXZpY2UKIAktICJyZW5lc2FzLHJjYXItZ2VuMi11c2JocyIgZm9yIFItQ2FyIEdlbjIgY29tcGF0aWJsZSBkZXZpY2UKIAktICJyZW5lc2FzLHJjYXItZ2VuMy11c2JocyIgZm9yIFItQ2FyIEdlbjMgY29tcGF0aWJsZSBkZXZpY2UKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9yb2NrY2hpcCxkd2MzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2Ivcm9ja2NoaXAsZHdjMy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUzNmE5MwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2Ivcm9ja2NoaXAsZHdjMy50eHQKQEAgLTAsMCArMSw1OSBAQAorUm9ja2NoaXAgU3VwZXJTcGVlZCBEV0MzIFVTQiBTb0MgY29udHJvbGxlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOglzaG91bGQgY29udGFpbiAicm9ja2NoaXAscmszMzk5LWR3YzMiIGZvciByazMzOTkgU29DCistIGNsb2NrczoJQSBsaXN0IG9mIHBoYW5kbGUgKyBjbG9jay1zcGVjaWZpZXIgcGFpcnMgZm9yIHRoZQorCQljbG9ja3MgbGlzdGVkIGluIGNsb2NrLW5hbWVzCistIGNsb2NrLW5hbWVzOglTaG91bGQgY29udGFpbiB0aGUgZm9sbG93aW5nOgorICAicmVmX2NsayIJQ29udHJvbGxlciByZWZlcmVuY2UgY2xrLCBoYXZlIHRvIGJlIDI0IE1IegorICAic3VzcGVuZF9jbGsiCUNvbnRyb2xsZXIgc3VzcGVuZCBjbGssIGhhdmUgdG8gYmUgMjQgTUh6IG9yIDMyIEtIegorICAiYnVzX2NsayIJTWFzdGVyL0NvcmUgY2xvY2ssIGhhdmUgdG8gYmUgPj0gNjIuNSBNSHogZm9yIFNTCisJCW9wZXJhdGlvbiBhbmQgPj0gMzBNSHogZm9yIEhTIG9wZXJhdGlvbgorICAiZ3JmX2NsayIJQ29udHJvbGxlciBncmYgY2xrCisKK1JlcXVpcmVkIGNoaWxkIG5vZGU6CitBIGNoaWxkIG5vZGUgbXVzdCBleGlzdCB0byByZXByZXNlbnQgdGhlIGNvcmUgRFdDMyBJUCBibG9jay4gVGhlIG5hbWUgb2YKK3RoZSBub2RlIGlzIG5vdCBpbXBvcnRhbnQuIFRoZSBjb250ZW50IG9mIHRoZSBub2RlIGlzIGRlZmluZWQgaW4gZHdjMy50eHQuCisKK1BoeSBkb2N1bWVudGF0aW9uIGlzIHByb3ZpZGVkIGluIHRoZSBmb2xsb3dpbmcgcGxhY2VzOgorRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9yb2NrY2hpcCxkd2MzLXVzYi1waHkudHh0CisKK0V4YW1wbGUgZGV2aWNlIG5vZGVzOgorCisJdXNiZHJkM18wOiB1c2JAZmU4MDAwMDAgeworCQljb21wYXRpYmxlID0gInJvY2tjaGlwLHJrMzM5OS1kd2MzIjsKKwkJY2xvY2tzID0gPCZjcnUgU0NMS19VU0IzT1RHMF9SRUY+LCA8JmNydSBTQ0xLX1VTQjNPVEcwX1NVU1BFTkQ+LAorCQkJIDwmY3J1IEFDTEtfVVNCM09URzA+LCA8JmNydSBBQ0xLX1VTQjNfR1JGPjsKKwkJY2xvY2stbmFtZXMgPSAicmVmX2NsayIsICJzdXNwZW5kX2NsayIsCisJCQkgICAgICAiYnVzX2NsayIsICJncmZfY2xrIjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQlyYW5nZXM7CisJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCXVzYmRyZF9kd2MzXzA6IGR3YzNAZmU4MDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJzbnBzLGR3YzMiOworCQkJcmVnID0gPDB4MCAweGZlODAwMDAwIDB4MCAweDEwMDAwMD47CisJCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMTA1IElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQkJZHJfbW9kZSA9ICJvdGciOworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKwl9OworCisJdXNiZHJkM18xOiB1c2JAZmU5MDAwMDAgeworCQljb21wYXRpYmxlID0gInJvY2tjaGlwLHJrMzM5OS1kd2MzIjsKKwkJY2xvY2tzID0gPCZjcnUgU0NMS19VU0IzT1RHMV9SRUY+LCA8JmNydSBTQ0xLX1VTQjNPVEcxX1NVU1BFTkQ+LAorCQkJIDwmY3J1IEFDTEtfVVNCM09URzE+LCA8JmNydSBBQ0xLX1VTQjNfR1JGPjsKKwkJY2xvY2stbmFtZXMgPSAicmVmX2NsayIsICJzdXNwZW5kX2NsayIsCisJCQkgICAgICAiYnVzX2NsayIsICJncmZfY2xrIjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQlyYW5nZXM7CisJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCXVzYmRyZF9kd2MzXzE6IGR3YzNAZmU5MDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJzbnBzLGR3YzMiOworCQkJcmVnID0gPDB4MCAweGZlOTAwMDAwIDB4MCAweDEwMDAwMD47CisJCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMTEwIElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQkJZHJfbW9kZSA9ICJvdGciOworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi91c2I0NjA0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdXNiNDYwNC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI1MDZkMQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdXNiNDYwNC50eHQKQEAgLTAsMCArMSwxOSBAQAorU01TQyBVU0I0NjA0IEhpZ2gtU3BlZWQgSHViIENvbnRyb2xsZXIKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJzbXNjLHVzYjQ2MDQiCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIHJlZzogU3BlY2lmaWVzIHRoZSBpMmMgc2xhdmUgYWRkcmVzcywgaXQgaXMgcmVxdWlyZWQgYW5kIHNob3VsZCBiZSAweDJkCisgICAgICAgaWYgSTJDIGlzIHVzZWQuCistIHJlc2V0LWdwaW9zOiBTaG91bGQgc3BlY2lmeSBHUElPIGZvciByZXNldC4KKy0gaW5pdGlhbC1tb2RlOiBTaG91bGQgc3BlY2lmeSBpbml0aWFsIG1vZGUuCisgICAgICAgICAgICAgICAgKDEgZm9yIEhVQiBtb2RlLCAyIGZvciBTVEFOREJZIG1vZGUpCisKK0V4YW1wbGVzOgorCXVzYi1odWJAMmQgeworCQljb21wYXRpYmxlID0gInNtc2MsdXNiNDYwNCI7CisJCXJlZyA9IDwweDJkPjsKKwkJcmVzZXQtZ3Bpb3MgPSA8JmdweDMgNSAxPjsKKwkJaW5pdGlhbC1tb2RlID0gPDE+OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYm1pc2MtaW14LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdXNibWlzYy1pbXgudHh0CmluZGV4IDM1MzlkNGUuLmYxZTI3ZmEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdXNibWlzYy1pbXgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdXNibWlzYy1pbXgudHh0CkBAIC02LDYgKzYsNyBAQAogCSJmc2wsaW14NnEtdXNibWlzYyIgZm9yIGlteDZxCiAJImZzbCx2ZjYxMC11c2JtaXNjIiBmb3IgVnlicmlkIHZmNjEwCiAJImZzbCxpbXg2c3gtdXNibWlzYyIgZm9yIGlteDZzeAorCSJmc2wsaW14N2QtdXNibWlzYyIgZm9yIGlteDdkCiAtIHJlZzogU2hvdWxkIGNvbnRhaW4gcmVnaXN0ZXJzIGxvY2F0aW9uIGFuZCBsZW5ndGgKIAogRXhhbXBsZXM6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdmVuZG9yLXByZWZpeGVzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy92ZW5kb3ItcHJlZml4ZXMudHh0CmluZGV4IDE5OTJhYTkuLjc3ZTk4NWYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy92ZW5kb3ItcHJlZml4ZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy92ZW5kb3ItcHJlZml4ZXMudHh0CkBAIC0zLDggKzMsOCBAQAogVGhpcyBpc24ndCBhbiBleGhhdXN0aXZlIGxpc3QsIGJ1dCB5b3Ugc2hvdWxkIGFkZCBuZXcgcHJlZml4ZXMgdG8gaXQgYmVmb3JlCiB1c2luZyB0aGVtIHRvIGF2b2lkIG5hbWUtc3BhY2UgY29sbGlzaW9ucy4KIAotYWJpbGlzCUFiaWxpcyBTeXN0ZW1zCiBhYmNuCUFicmFjb24gQ29ycG9yYXRpb24KK2FiaWxpcwlBYmlsaXMgU3lzdGVtcwogYWN0aXZlLXNlbWkJQWN0aXZlLVNlbWkgSW50ZXJuYXRpb25hbCBJbmMKIGFkCUF2aW9uaWMgRGVzaWduIEdtYkgKIGFkYXB0ZXZhCUFkYXB0ZXZhLCBJbmMuCkBAIC0zNiw2ICszNiw3IEBACiBhdGxhcwlBdGxhcyBTY2llbnRpZmljIExMQwogYXRtZWwJQXRtZWwgQ29ycG9yYXRpb24KIGF1bwlBVSBPcHRyb25pY3MgQ29ycG9yYXRpb24KK2F1dmlkZWEgQXV2aWRlYSBHbWJICiBhdmFnbwlBdmFnbyBUZWNobm9sb2dpZXMKIGF2aWMJU2hhbmdoYWkgQVZJQyBPcHRvZWxlY3Ryb25pY3MgQ28uLCBMdGQuCiBheGlzCUF4aXMgQ29tbXVuaWNhdGlvbnMgQUIKQEAgLTc1LDYgKzc2LDcgQEAKIGRsZwlEaWFsb2cgU2VtaWNvbmR1Y3RvcgogZGxpbmsJRC1MaW5rIENvcnBvcmF0aW9uCiBkbW8JRGF0YSBNb2R1bCBBRworZG9taW50ZWNoCURvbWludGVjaCBDby4sIEx0ZC4KIGRwdGVjaG5pY3MJRFBUZWNobmljcwogZHJhZ2lubwlEcmFnaW5vIFRlY2hub2xvZ3kgQ28uLCBMaW1pdGVkCiBlYQlFbWJlZGRlZCBBcnRpc3RzIEFCCkBAIC04NSw2ICs4Nyw3IEBACiBlbWJlc3QJU2hlbnpoZW4gRW1iZXN0IFRlY2hub2xvZ3kgQ28uLCBMdGQuCiBlbW1pY3JvCUVNIE1pY3JvZWxlY3Ryb25pYwogZW5lcmd5bWljcm8JU2lsaWNvbiBMYWJvcmF0b3JpZXMgKGZvcm1lcmx5IEVuZXJneSBNaWNybyBBUykKK2VuZ2ljYW0JRW5naWNhbSBTLnIubC4KIGVwY29zCUVQQ09TIEFHCiBlcGZsCUVjb2xlIFBvbHl0ZWNobmlxdWUgRsOpZMOpcmFsZSBkZSBMYXVzYW5uZQogZXBzb24JU2Vpa28gRXBzb24gQ29ycC4KQEAgLTEwMSw4ICsxMDQsOCBAQAogZnNsCUZyZWVzY2FsZSBTZW1pY29uZHVjdG9yCiBnZQlHZW5lcmFsIEVsZWN0cmljIENvbXBhbnkKIGdlZWtidXlpbmcJR2Vla0J1eWluZwotR0VGYW51YwlHRSBGYW51YyBJbnRlbGxpZ2VudCBQbGF0Zm9ybXMgRW1iZWRkZWQgU3lzdGVtcywgSW5jLgogZ2VmCUdFIEZhbnVjIEludGVsbGlnZW50IFBsYXRmb3JtcyBFbWJlZGRlZCBTeXN0ZW1zLCBJbmMuCitHRUZhbnVjCUdFIEZhbnVjIEludGVsbGlnZW50IFBsYXRmb3JtcyBFbWJlZGRlZCBTeXN0ZW1zLCBJbmMuCiBnZW5pYXRlY2gJR2VuaWF0ZWNoLCBJbmMuCiBnaWFudHBsdXMJR2lhbnRwbHVzIFRlY2hub2xvZ3kgQ28uLCBMdGQuCiBnbG9iYWxzY2FsZQlHbG9iYWxzY2FsZSBUZWNobm9sb2dpZXMsIEluYy4KQEAgLTEyNiw3ICsxMjksNiBAQAogaWJtCUludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgKElCTSkKIGlkdAlJbnRlZ3JhdGVkIERldmljZSBUZWNobm9sb2dpZXMsIEluYy4KIGlmaQlJbmdlbmlldXJidXJvIEZ1ciBJYy1UZWNobm9sb2dpZSAoSS9GL0kpCi1pb20JSW9tZWdhIENvcnBvcmF0aW9uCiBpbWcJSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzIEx0ZC4KIGluZmluZW9uIEluZmluZW9uIFRlY2hub2xvZ2llcwogaW5mb3JjZQlJbmZvcmNlIENvbXB1dGluZwpAQCAtMTM1LDExICsxMzcsMTQgQEAKIGludGVsCUludGVsIENvcnBvcmF0aW9uCiBpbnRlcmNvbnRyb2wJSW50ZXIgQ29udHJvbCBHcm91cAogaW52ZW5zZW5zZQlJbnZlblNlbnNlIEluYy4KK2lvbQlJb21lZ2EgQ29ycG9yYXRpb24KIGlzZWUJSVNFRSAyMDA3IFMuTC4KIGlzaWwJSW50ZXJzaWwKIGlzc2kJSW50ZWdyYXRlZCBTaWxpY29uIFNvbHV0aW9ucyBJbmMuCitqZGkJSmFwYW4gRGlzcGxheSBJbmMuCiBqZWRlYwlKRURFQyBTb2xpZCBTdGF0ZSBUZWNobm9sb2d5IEFzc29jaWF0aW9uCiBrYXJvCUthLVJvIGVsZWN0cm9uaWNzIEdtYkgKK2tlaXRoa29lcAlLZWl0aCAmIEtvZXAgR21iSAoga2V5bWlsZQlLZXltaWxlIEdtYkgKIGtpbmV0aWMgS2luZXRpYyBUZWNobm9sb2dpZXMKIGtvc2FnaQlTdXRhamlvIEtvLVVzYWdpIFBURSBMdGQuCkBAIC0xNDksOCArMTU0LDggQEAKIGxlbm92bwlMZW5vdm8gR3JvdXAgTHRkLgogbGcJTEcgQ29ycG9yYXRpb24KIGxpbnV4CUxpbnV4LXNwZWNpZmljIGJpbmRpbmcKLWxzaQlMU0kgQ29ycC4gKExTSSBMb2dpYykKIGxsdGMJTGluZWFyIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24KK2xzaQlMU0kgQ29ycC4gKExTSSBMb2dpYykKIG1hcnZlbGwJTWFydmVsbCBUZWNobm9sb2d5IEdyb3VwIEx0ZC4KIG1heGltCU1heGltIEludGVncmF0ZWQgUHJvZHVjdHMKIG1lYXMJTWVhc3VyZW1lbnQgU3BlY2lhbHRpZXMKQEAgLTE5MCwyMCArMTk1LDIwIEBACiBvbnRhdAlPbiBUYXQgSW5kdXN0cmlhbCBDb21wYW55CiBvcGVuY29yZXMJT3BlbkNvcmVzLm9yZwogb3B0aW9uCU9wdGlvbiBOVgorT1JDTAlPcmFjbGUgQ29ycG9yYXRpb24KIG9ydHVzdGVjaAlPcnR1cyBUZWNobm9sb2d5IENvLiwgTHRkLgogb3Z0aQlPbW5pVmlzaW9uIFRlY2hub2xvZ2llcwotT1JDTAlPcmFjbGUgQ29ycG9yYXRpb24KIG94c2VtaQlPeGZvcmQgU2VtaWNvbmR1Y3RvciwgTHRkLgogcGFuYXNvbmljCVBhbmFzb25pYyBDb3Jwb3JhdGlvbgogcGFyYWRlCVBhcmFkZSBUZWNobm9sb2dpZXMgSW5jLgogcGVyaWNvbQlQZXJpY29tIFRlY2hub2xvZ3kgSW5jLgogcGh5dGVjCVBIWVRFQyBNZXNzdGVjaG5payBHbWJICiBwaWNvY2hpcAlQaWNvY2hpcCBMdGQKK3BpeGNpciAgUElYQ0lSIE1JQ1JPRUxFQ1RST05JQ1MgQ28uLCBMdGQKIHBsYXRob21lCVBsYXQnSG9tZSBDby4sIEx0ZC4KIHBsZGEJUExEQQotcGl4Y2lyICBQSVhDSVIgTUlDUk9FTEVDVFJPTklDUyBDby4sIEx0ZAotcHVsc2VkbGlnaHQJUHVsc2VkTGlnaHQsIEluYwogcG93ZXJ2cglQb3dlclZSIChkZXByZWNhdGVkLCB1c2UgaW1nKQorcHVsc2VkbGlnaHQJUHVsc2VkTGlnaHQsIEluYwogcWNhCVF1YWxjb21tIEF0aGVyb3MsIEluYy4KIHFjb20JUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMKIHFlbXUJUUVNVSwgYSBnZW5lcmljIGFuZCBvcGVuIHNvdXJjZSBtYWNoaW5lIGVtdWxhdG9yIGFuZCB2aXJ0dWFsaXplcgpAQCAtMjMxLDEyICsyMzYsMTMgQEAKIHNoYXJwCVNoYXJwIENvcnBvcmF0aW9uCiBzaS1lbglTaS1FbiBUZWNobm9sb2d5IEx0ZC4KIHNpZ21hCVNpZ21hIERlc2lnbnMsIEluYy4KK3NpaQlTZWlrbyBJbnN0cnVtZW50cywgSW5jLgogc2lsCVNpbGljb24gSW1hZ2UKIHNpbGFicwlTaWxpY29uIExhYm9yYXRvcmllcworc2lsZWFkCVNpbGVhZCBJbmMuCitzaWxlcmd5CVNpbGVyZ3kgQ29ycC4KIHNpbGljb25taXR1cwlTaWxpY29uIE1pdHVzLCBJbmMuCiBzaW10ZWsKLXNpaQlTZWlrbyBJbnN0cnVtZW50cywgSW5jLgotc2lsZXJneQlTaWxlcmd5IENvcnAuCiBzaXJmCVNpUkYgVGVjaG5vbG9neSwgSW5jLgogc2lzCVNpbGljb24gSW50ZWdyYXRlZCBTeXN0ZW1zIENvcnAuCiBzaXRyb25peAlTaXRyb25peCBUZWNobm9sb2d5IENvcnBvcmF0aW9uCkBAIC0yNTQsOSArMjYwLDEyIEBACiBzdGFydGVrCVN0YXJ0ZWsKIHN0ZQlTVC1Fcmljc3Nvbgogc3Rlcmljc3NvbglTVC1Fcmljc3Nvbgorc3VtbWl0CVN1bW1pdCBtaWNyb2VsZWN0cm9uaWNzCitzdW5jaGlwCVNoZW56aGVuIFN1bmNoaXAgVGVjaG5vbG9neSBDby4sIEx0ZAorU1VOVwlTdW4gTWljcm9zeXN0ZW1zLCBJbmMKK3N3aXIJU2llcnJhIFdpcmVsZXNzCiBzeW5hCVN5bmFwdGljcyBJbmMuCiBzeW5vbG9neQlTeW5vbG9neSwgSW5jLgotU1VOVwlTdW4gTWljcm9zeXN0ZW1zLCBJbmMKIHRicwlUQlMgVGVjaG5vbG9naWVzCiB0Y2cJVHJ1c3RlZCBDb21wdXRpbmcgR3JvdXAKIHRjbAlUb2J5IENodXJjaGlsbCBMdGQuCkBAIC0yNjUsMTcgKzI3NCwxOCBAQAogdGhpbmUJVEhpbmUgRWxlY3Ryb25pY3MsIEluYy4KIHRpCVRleGFzIEluc3RydW1lbnRzCiB0bG0JVHJ1c3RlZCBMb2dpYyBNb2JpbGl0eQordG9wZWV0ICBUb3BlZXQKIHRvcmFkZXgJVG9yYWRleCBBRwogdG9zaGliYQlUb3NoaWJhIENvcnBvcmF0aW9uCiB0b3VtYXoJVG91bWF6Ci10cGxpbmsJVFAtTElOSyBUZWNobm9sb2dpZXMgQ28uLCBMdGQuCiB0cGsJVFBLIFUuUy5BLiBMTEMKK3RwbGluawlUUC1MSU5LIFRlY2hub2xvZ2llcyBDby4sIEx0ZC4KIHRyb25meQlUcm9uZnkKIHRyb25zbWFydAlUcm9uc21hcnQKIHRydWx5CVRydWx5IFNlbWljb25kdWN0b3JzIExpbWl0ZWQKIHR5YW4JVHlhbiBDb21wdXRlciBDb3Jwb3JhdGlvbgotdXBpc2VtaQl1UEkgU2VtaWNvbmR1Y3RvciBDb3JwLgogdW5pd2VzdAlVbml0ZWQgV2VzdGVybiBUZWNobm9sb2dpZXMgQ29ycCAoVW5pV2VzdCkKK3VwaXNlbWkJdVBJIFNlbWljb25kdWN0b3IgQ29ycC4KIHVydAlVbml0ZWQgUmFkaWFudCBUZWNobm9sb2d5IENvcnBvcmF0aW9uCiB1c2kJVW5pdmVyc2FsIFNjaWVudGlmaWMgSW5kdXN0cmlhbCBDby4sIEx0ZC4KIHYzCVYzIFNlbWljb25kdWN0b3IKQEAgLTI5Myw3ICszMDMsNyBAQAogeGVzCUV4dHJlbWUgRW5naW5lZXJpbmcgU29sdXRpb25zIChYLUVTKQogeGlsbHlidXMJWGlsbHlidXMgTHRkLgogeGxueAlYaWxpbngKLXp5eGVsCVp5WEVMIENvbW11bmljYXRpb25zIENvcnAuCiB6YXJsaW5rCVphcmxpbmsgU2VtaWNvbmR1Y3RvcgogemlpCVpvZGlhYyBJbmZsaWdodCBJbm5vdmF0aW9ucwogenRlCVpURSBDb3JwLgorenl4ZWwJWnlYRUwgQ29tbXVuaWNhdGlvbnMgQ29ycC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9jaGFuZ2VzZXRzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9jaGFuZ2VzZXRzLnR4dAppbmRleCA5MzViYTVhLi5jYjQ4OGVlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvY2hhbmdlc2V0cy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2NoYW5nZXNldHMudHh0CkBAIC0yMSwyMCArMjEsMTEgQEAKIEFsbCB0aGUgY2hhbmdlIG9wZXJhdGlvbnMgYXJlIHJlY29yZGVkIGluIHRoZSBvZl9jaGFuZ2VzZXQgJ2VudHJpZXMnCiBsaXN0LgogCi0zLiBtdXRleF9sb2NrKG9mX211dGV4KSAtIHN0YXJ0cyBhIGNoYW5nZXNldDsgVGhlIGdsb2JhbCBvZl9tdXRleAotZW5zdXJlcyB0aGVyZSBjYW4gb25seSBiZSBvbmUgZWRpdG9yIGF0IGEgdGltZS4KLQotNC4gb2ZfY2hhbmdlc2V0X2FwcGx5KCkgLSBBcHBseSB0aGUgY2hhbmdlcyB0byB0aGUgdHJlZS4gRWl0aGVyIHRoZQorMy4gb2ZfY2hhbmdlc2V0X2FwcGx5KCkgLSBBcHBseSB0aGUgY2hhbmdlcyB0byB0aGUgdHJlZS4gRWl0aGVyIHRoZQogZW50aXJlIGNoYW5nZXNldCB3aWxsIGdldCBhcHBsaWVkLCBvciBpZiB0aGVyZSBpcyBhbiBlcnJvciB0aGUgdHJlZSB3aWxsCi1iZSByZXN0b3JlZCB0byB0aGUgcHJldmlvdXMgc3RhdGUKLQotNS4gbXV0ZXhfdW5sb2NrKG9mX211dGV4KSAtIEFsbCBvcGVyYXRpb25zIGNvbXBsZXRlLCByZWxlYXNlIHRoZSBtdXRleAorYmUgcmVzdG9yZWQgdG8gdGhlIHByZXZpb3VzIHN0YXRlLiBUaGUgY29yZSBlbnN1cmVzIHByb3BlciBzZXJpYWxpemF0aW9uCit0aHJvdWdoIGxvY2tpbmcuIEFuIHVubG9ja2VkIHZlcnNpb24gX19vZl9jaGFuZ2VzZXRfYXBwbHkgaXMgYXZhaWxhYmxlLAoraWYgbmVlZGVkLgogCiBJZiBhIHN1Y2Nlc3NmdWxseSBhcHBsaWVkIGNoYW5nZXNldCBuZWVkcyB0byBiZSByZW1vdmVkLCBpdCBjYW4gYmUgZG9uZQotd2l0aCB0aGUgZm9sbG93aW5nIHNlcXVlbmNlLgotCi0xLiBtdXRleF9sb2NrKG9mX211dGV4KQotCi0yLiBvZl9jaGFuZ2VzZXRfcmV2ZXJ0KCkKLQotMy4gbXV0ZXhfdW5sb2NrKG9mX211dGV4KQord2l0aCBvZl9jaGFuZ2VzZXRfcmV2ZXJ0KCkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RtYWVuZ2luZS9wcm92aWRlci50eHQgYi9Eb2N1bWVudGF0aW9uL2RtYWVuZ2luZS9wcm92aWRlci50eHQKaW5kZXggOTFjZTgyZC4uYzRmZDQ3NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kbWFlbmdpbmUvcHJvdmlkZXIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZG1hZW5naW5lL3Byb3ZpZGVyLnR4dApAQCAtMjgyLDYgKzI4MiwxNyBAQAogCQkJdGhhdCBpcyBzdXBwb3NlZCB0byBwdXNoIHRoZSBjdXJyZW50CiAJCQl0cmFuc2FjdGlvbiBkZXNjcmlwdG9yIHRvIGEgcGVuZGluZyBxdWV1ZSwgd2FpdGluZwogCQkJZm9yIGlzc3VlX3BlbmRpbmcgdG8gYmUgY2FsbGVkLgorICAgICAtIEluIHRoaXMgc3RydWN0dXJlIHRoZSBmdW5jdGlvbiBwb2ludGVyIGNhbGxiYWNrX3Jlc3VsdCBjYW4gYmUKKyAgICAgICBpbml0aWFsaXplZCBpbiBvcmRlciBmb3IgdGhlIHN1Ym1pdHRlciB0byBiZSBub3RpZmllZCB0aGF0IGEKKyAgICAgICB0cmFuc2FjdGlvbiBoYXMgY29tcGxldGVkLiBJbiB0aGUgZWFybGllciBjb2RlIHRoZSBmdW5jdGlvbiBwb2ludGVyCisgICAgICAgY2FsbGJhY2sgaGFzIGJlZW4gdXNlZC4gSG93ZXZlciBpdCBkb2VzIG5vdCBwcm92aWRlIGFueSBzdGF0dXMgdG8gdGhlCisgICAgICAgdHJhbnNhY3Rpb24gYW5kIHdpbGwgYmUgZGVwcmVjYXRlZC4gVGhlIHJlc3VsdCBzdHJ1Y3R1cmUgZGVmaW5lZCBhcworICAgICAgIGRtYWVuZ2luZV9yZXN1bHQgdGhhdCBpcyBwYXNzZWQgaW4gdG8gY2FsbGJhY2tfcmVzdWx0IGhhcyB0d28gZmllbGRzOgorICAgICAgICsgcmVzdWx0OiBUaGlzIHByb3ZpZGVzIHRoZSB0cmFuc2ZlciByZXN1bHQgZGVmaW5lZCBieQorCQkgZG1hZW5naW5lX3R4X3Jlc3VsdC4gRWl0aGVyIHN1Y2Nlc3Mgb3Igc29tZSBlcnJvcgorCQkgY29uZGl0aW9uLgorICAgICAgICsgcmVzaWR1ZTogUHJvdmlkZXMgdGhlIHJlc2lkdWUgYnl0ZXMgb2YgdGhlIHRyYW5zZmVyIGZvciB0aG9zZSB0aGF0CisJCSAgc3VwcG9ydCByZXNpZHVlLgogCiAgICAqIGRldmljZV9pc3N1ZV9wZW5kaW5nCiAgICAgIC0gVGFrZXMgdGhlIGZpcnN0IHRyYW5zYWN0aW9uIGRlc2NyaXB0b3IgaW4gdGhlIHBlbmRpbmcgcXVldWUsCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RvY3V0aWxzLmNvbmYgYi9Eb2N1bWVudGF0aW9uL2RvY3V0aWxzLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgzMDc3MgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZG9jdXRpbHMuY29uZgpAQCAtMCwwICsxLDcgQEAKKyMgLSotIGNvZGluZzogdXRmLTggbW9kZTogY29uZi1jb2xvbiAtKi0KKyMKKyMgZG9jdXRpbHMgY29uZmlndXJhdGlvbiBmaWxlCisjIGh0dHA6Ly9kb2N1dGlscy5zb3VyY2Vmb3JnZS5uZXQvZG9jcy91c2VyL2NvbmZpZy5odG1sCisKK1tnZW5lcmFsXQoraGFsdF9sZXZlbDogc2V2ZXJlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL2Jhc2ljcy5yc3QgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvYmFzaWNzLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzViOWI4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL2Jhc2ljcy5yc3QKQEAgLTAsMCArMSwxMjAgQEAKK0RyaXZlciBCYXNpY3MKKz09PT09PT09PT09PT0KKworRHJpdmVyIEVudHJ5IGFuZCBFeGl0IHBvaW50cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9pbml0LmgKKyAgIDppbnRlcm5hbDoKKworQXRvbWljIGFuZCBwb2ludGVyIG1hbmlwdWxhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljLmgKKyAgIDppbnRlcm5hbDoKKworRGVsYXlpbmcsIHNjaGVkdWxpbmcsIGFuZCB0aW1lciByb3V0aW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9zY2hlZC5oCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBrZXJuZWwvc2NoZWQvY29yZS5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjoga2VybmVsL3NjaGVkL2NwdXByaS5jCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBrZXJuZWwvc2NoZWQvZmFpci5jCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L2NvbXBsZXRpb24uaAorICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjoga2VybmVsL3RpbWUvdGltZXIuYworICAgOmV4cG9ydDoKKworV2FpdCBxdWV1ZXMgYW5kIFdha2UgZXZlbnRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvbGludXgvd2FpdC5oCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBrZXJuZWwvc2NoZWQvd2FpdC5jCisgICA6ZXhwb3J0OgorCitIaWdoLXJlc29sdXRpb24gdGltZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L2t0aW1lLmgKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvbGludXgvaHJ0aW1lci5oCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBrZXJuZWwvdGltZS9ocnRpbWVyLmMKKyAgIDpleHBvcnQ6CisKK1dvcmtxdWV1ZXMgYW5kIEtldmVudHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvbGludXgvd29ya3F1ZXVlLmgKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGtlcm5lbC93b3JrcXVldWUuYworICAgOmV4cG9ydDoKKworSW50ZXJuYWwgRnVuY3Rpb25zCistLS0tLS0tLS0tLS0tLS0tLS0KKworLi4ga2VybmVsLWRvYzo6IGtlcm5lbC9leGl0LmMKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGtlcm5lbC9zaWduYWwuYworICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9rdGhyZWFkLmgKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGtlcm5lbC9rdGhyZWFkLmMKKyAgIDpleHBvcnQ6CisKK0tlcm5lbCBvYmplY3RzIG1hbmlwdWxhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIGtlcm5lbC1kb2M6OiBsaWIva29iamVjdC5jCisgICA6ZXhwb3J0OgorCitLZXJuZWwgdXRpbGl0eSBmdW5jdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9rZXJuZWwuaAorICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjoga2VybmVsL3ByaW50ay9wcmludGsuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGtlcm5lbC9wYW5pYy5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjoga2VybmVsL3N5cy5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjoga2VybmVsL3JjdS9zcmN1LmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBrZXJuZWwvcmN1L3RyZWUuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGtlcm5lbC9yY3UvdHJlZV9wbHVnaW4uaAorICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGtlcm5lbC9yY3UvdXBkYXRlLmMKKyAgIDpleHBvcnQ6CisKK0RldmljZSBSZXNvdXJjZSBNYW5hZ2VtZW50CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9iYXNlL2RldnJlcy5jCisgICA6ZXhwb3J0OgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvZnJhbWUtYnVmZmVyLnJzdCBiL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9mcmFtZS1idWZmZXIucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZDMwNjAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvZnJhbWUtYnVmZmVyLnJzdApAQCAtMCwwICsxLDYyIEBACitGcmFtZSBCdWZmZXIgTGlicmFyeQorPT09PT09PT09PT09PT09PT09PT0KKworVGhlIGZyYW1lIGJ1ZmZlciBkcml2ZXJzIGRlcGVuZCBoZWF2aWx5IG9uIGZvdXIgZGF0YSBzdHJ1Y3R1cmVzLiBUaGVzZQorc3RydWN0dXJlcyBhcmUgZGVjbGFyZWQgaW4gaW5jbHVkZS9saW51eC9mYi5oLiBUaGV5IGFyZSBmYl9pbmZvLAorZmJfdmFyX3NjcmVlbmluZm8sIGZiX2ZpeF9zY3JlZW5pbmZvIGFuZCBmYl9tb25vc3BlY3MuIFRoZSBsYXN0Cit0aHJlZSBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gYW5kIGZyb20gdXNlcmxhbmQuCisKK2ZiX2luZm8gZGVmaW5lcyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIHBhcnRpY3VsYXIgdmlkZW8gY2FyZC4gSW5zaWRlCitmYl9pbmZvLCB0aGVyZSBleGlzdHMgYSBmYl9vcHMgc3RydWN0dXJlIHdoaWNoIGlzIGEgY29sbGVjdGlvbiBvZgorbmVlZGVkIGZ1bmN0aW9ucyB0byBtYWtlIGZiZGV2IGFuZCBmYmNvbiB3b3JrLiBmYl9pbmZvIGlzIG9ubHkgdmlzaWJsZQordG8gdGhlIGtlcm5lbC4KKworZmJfdmFyX3NjcmVlbmluZm8gaXMgdXNlZCB0byBkZXNjcmliZSB0aGUgZmVhdHVyZXMgb2YgYSB2aWRlbyBjYXJkCit0aGF0IGFyZSB1c2VyIGRlZmluZWQuIFdpdGggZmJfdmFyX3NjcmVlbmluZm8sIHRoaW5ncyBzdWNoIGFzIGRlcHRoCithbmQgdGhlIHJlc29sdXRpb24gbWF5IGJlIGRlZmluZWQuCisKK1RoZSBuZXh0IHN0cnVjdHVyZSBpcyBmYl9maXhfc2NyZWVuaW5mby4gVGhpcyBkZWZpbmVzIHRoZSBwcm9wZXJ0aWVzCitvZiBhIGNhcmQgdGhhdCBhcmUgY3JlYXRlZCB3aGVuIGEgbW9kZSBpcyBzZXQgYW5kIGNhbid0IGJlIGNoYW5nZWQKK290aGVyd2lzZS4gQSBnb29kIGV4YW1wbGUgb2YgdGhpcyBpcyB0aGUgc3RhcnQgb2YgdGhlIGZyYW1lIGJ1ZmZlcgorbWVtb3J5LiBUaGlzICJsb2NrcyIgdGhlIGFkZHJlc3Mgb2YgdGhlIGZyYW1lIGJ1ZmZlciBtZW1vcnksIHNvIHRoYXQgaXQKK2Nhbm5vdCBiZSBjaGFuZ2VkIG9yIG1vdmVkLgorCitUaGUgbGFzdCBzdHJ1Y3R1cmUgaXMgZmJfbW9ub3NwZWNzLiBJbiB0aGUgb2xkIEFQSSwgdGhlcmUgd2FzIGxpdHRsZQoraW1wb3J0YW5jZSBmb3IgZmJfbW9ub3NwZWNzLiBUaGlzIGFsbG93ZWQgZm9yIGZvcmJpZGRlbiB0aGluZ3Mgc3VjaCBhcworc2V0dGluZyBhIG1vZGUgb2YgODAweDYwMCBvbiBhIGZpeCBmcmVxdWVuY3kgbW9uaXRvci4gV2l0aCB0aGUgbmV3IEFQSSwKK2ZiX21vbm9zcGVjcyBwcmV2ZW50cyBzdWNoIHRoaW5ncywgYW5kIGlmIHVzZWQgY29ycmVjdGx5LCBjYW4gcHJldmVudCBhCittb25pdG9yIGZyb20gYmVpbmcgY29va2VkLiBmYl9tb25vc3BlY3Mgd2lsbCBub3QgYmUgdXNlZnVsIHVudGlsCitrZXJuZWxzIDIuNS54LgorCitGcmFtZSBCdWZmZXIgTWVtb3J5CistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL3ZpZGVvL2ZiZGV2L2NvcmUvZmJtZW0uYworICAgOmV4cG9ydDoKKworRnJhbWUgQnVmZmVyIENvbG9ybWFwCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvdmlkZW8vZmJkZXYvY29yZS9mYmNtYXAuYworICAgOmV4cG9ydDoKKworRnJhbWUgQnVmZmVyIFZpZGVvIE1vZGUgRGF0YWJhc2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL3ZpZGVvL2ZiZGV2L2NvcmUvbW9kZWRiLmMKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvdmlkZW8vZmJkZXYvY29yZS9tb2RlZGIuYworICAgOmV4cG9ydDoKKworRnJhbWUgQnVmZmVyIE1hY2ludG9zaCBWaWRlbyBNb2RlIERhdGFiYXNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvdmlkZW8vZmJkZXYvbWFjbW9kZXMuYworICAgOmV4cG9ydDoKKworRnJhbWUgQnVmZmVyIEZvbnRzCistLS0tLS0tLS0tLS0tLS0tLS0KKworUmVmZXIgdG8gdGhlIGZpbGUgbGliL2ZvbnRzL2ZvbnRzLmMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9oc2kucnN0IGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL2hzaS5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljZWMwMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9oc2kucnN0CkBAIC0wLDAgKzEsODggQEAKK0hpZ2ggU3BlZWQgU3luY2hyb25vdXMgU2VyaWFsIEludGVyZmFjZSAoSFNJKQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ludHJvZHVjdGlvbgorLS0tLS0tLS0tLS0tLS0tCisKK0hpZ2ggU3BlZWQgU3luY3Jvbm91cyBJbnRlcmZhY2UgKEhTSSkgaXMgYSBmdWxsZHVwbGV4LCBsb3cgbGF0ZW5jeSBwcm90b2NvbCwKK3RoYXQgaXMgb3B0aW1pemVkIGZvciBkaWUtbGV2ZWwgaW50ZXJjb25uZWN0IGJldHdlZW4gYW4gQXBwbGljYXRpb24gUHJvY2Vzc29yCithbmQgYSBCYXNlYmFuZCBjaGlwc2V0LiBJdCBoYXMgYmVlbiBzcGVjaWZpZWQgYnkgdGhlIE1JUEkgYWxsaWFuY2UgaW4gMjAwMyBhbmQKK2ltcGxlbWVudGVkIGJ5IG11bHRpcGxlIHZlbmRvcnMgc2luY2UgdGhlbi4KKworVGhlIEhTSSBpbnRlcmZhY2Ugc3VwcG9ydHMgZnVsbCBkdXBsZXggY29tbXVuaWNhdGlvbiBvdmVyIG11bHRpcGxlIGNoYW5uZWxzCisodHlwaWNhbGx5IDgpIGFuZCBpcyBjYXBhYmxlIG9mIHJlYWNoaW5nIHNwZWVkcyB1cCB0byAyMDAgTWJpdC9zLgorCitUaGUgc2VyaWFsIHByb3RvY29sIHVzZXMgdHdvIHNpZ25hbHMsIERBVEEgYW5kIEZMQUcgYXMgY29tYmluZWQgZGF0YSBhbmQgY2xvY2sKK3NpZ25hbHMgYW5kIGFuIGFkZGl0aW9uYWwgUkVBRFkgc2lnbmFsIGZvciBmbG93IGNvbnRyb2wuIEFuIGFkZGl0aW9uYWwgV0FLRQorc2lnbmFsIGNhbiBiZSB1c2VkIHRvIHdha2V1cCB0aGUgY2hpcHMgZnJvbSBzdGFuZGJ5IG1vZGVzLiBUaGUgc2lnbmFscyBhcmUKK2NvbW1vbmx5IHByZWZpeGVkIGJ5IEFDIGZvciBzaWduYWxzIGdvaW5nIGZyb20gdGhlIGFwcGxpY2F0aW9uIGRpZSB0byB0aGUKK2NlbGx1bGFyIGRpZSBhbmQgQ0EgZm9yIHNpZ25hbHMgZ29pbmcgdGhlIG90aGVyIHdheSBhcm91bmQuCisKKzo6CisKKyAgICArLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgQ2VsbHVsYXIgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBBcHBsaWNhdGlvbiAgfAorICAgIHwgICAgRGllICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgIERpZSAgICAgIHwKKyAgICB8ICAgICAgICAgICAgfCAtIC0gLSAtIC0gLSBDQVdBS0UgLSAtIC0gLSAtIC0gPnwgICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgVHwtLS0tLS0tLS0tLS0gQ0FEQVRBIC0tLS0tLS0tLS0tLT58UiAgICAgICAgICAgICAgfAorICAgIHwgICAgICAgICAgIFh8LS0tLS0tLS0tLS0tIENBRkxBRyAtLS0tLS0tLS0tLS0+fFggICAgICAgICAgICAgIHwKKyAgICB8ICAgICAgICAgICAgfDwtLS0tLS0tLS0tLSBBQ1JFQURZIC0tLS0tLS0tLS0tLXwgICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAorICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKKyAgICB8ICAgICAgICAgICAgfDwgLSAtIC0gLSAtICBBQ1dBS0UgLSAtIC0gLSAtIC0gLXwgICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgUnw8LS0tLS0tLS0tLS0gQUNEQVRBIC0tLS0tLS0tLS0tLS18VCAgICAgICAgICAgICAgfAorICAgIHwgICAgICAgICAgIFh8PC0tLS0tLS0tLS0tIEFDRkxBRyAtLS0tLS0tLS0tLS0tfFggICAgICAgICAgICAgIHwKKyAgICB8ICAgICAgICAgICAgfC0tLS0tLS0tLS0tLSBDQVJFQURZIC0tLS0tLS0tLS0tPnwgICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAorICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0rCisKK0hTSSBTdWJzeXN0ZW0gaW4gTGludXgKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSW4gdGhlIExpbnV4IGtlcm5lbCB0aGUgaHNpIHN1YnN5c3RlbSBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIGZvciBIU0kgZGV2aWNlcy4KK1RoZSBoc2kgc3Vic3lzdGVtIGNvbnRhaW5zIGRyaXZlcnMgZm9yIGhzaSBjb250cm9sbGVycyBpbmNsdWRpbmcgc3VwcG9ydCBmb3IKK211bHRpLXBvcnQgY29udHJvbGxlcnMgYW5kIHByb3ZpZGVzIGEgZ2VuZXJpYyBBUEkgZm9yIHVzaW5nIHRoZSBIU0kgcG9ydHMuCisKK0l0IGFsc28gY29udGFpbnMgSFNJIGNsaWVudCBkcml2ZXJzLCB3aGljaCBtYWtlIHVzZSBvZiB0aGUgZ2VuZXJpYyBBUEkgdG8KK2ltcGxlbWVudCBhIHByb3RvY29sIHVzZWQgb24gdGhlIEhTSSBpbnRlcmZhY2UuIFRoZXNlIGNsaWVudCBkcml2ZXJzIGNhbgordXNlIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgY2hhbm5lbHMuCisKK2hzaS1jaGFyIERldmljZQorLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VhY2ggcG9ydCBhdXRvbWF0aWNhbGx5IHJlZ2lzdGVycyBhIGdlbmVyaWMgY2xpZW50IGRyaXZlciBjYWxsZWQgaHNpX2NoYXIsCit3aGljaCBwcm92aWRlcyBhIGNoYXJlY3RlciBkZXZpY2UgZm9yIHVzZXJzcGFjZSByZXByZXNlbnRpbmcgdGhlIEhTSSBwb3J0LgorSXQgY2FuIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgdmlhIEhTSSBmcm9tIHVzZXJzcGFjZS4gVXNlcnNwYWNlIG1heQorY29uZmlndXJlIHRoZSBoc2lfY2hhciBkZXZpY2UgdXNpbmcgdGhlIGZvbGxvd2luZyBpb2N0bCBjb21tYW5kczoKKworSFNDX1JFU0VUCisgZmx1c2ggdGhlIEhTSSBwb3J0CisKK0hTQ19TRVRfUE0KKyBlbmFibGUgb3IgZGlzYWJsZSB0aGUgY2xpZW50LgorCitIU0NfU0VORF9CUkVBSworIHNlbmQgYnJlYWsKKworSFNDX1NFVF9SWAorIHNldCBSWCBjb25maWd1cmF0aW9uCisKK0hTQ19HRVRfUlgKKyBnZXQgUlggY29uZmlndXJhdGlvbgorCitIU0NfU0VUX1RYCisgc2V0IFRYIGNvbmZpZ3VyYXRpb24KKworSFNDX0dFVF9UWAorIGdldCBUWCBjb25maWd1cmF0aW9uCisKK1RoZSBrZXJuZWwgSFNJIEFQSQorLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L2hzaS9oc2kuaAorICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9oc2kvaHNpX2NvcmUuYworICAgOmV4cG9ydDoKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL2kyYy5yc3QgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvaTJjLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzkzOWY3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL2kyYy5yc3QKQEAgLTAsMCArMSw0NiBAQAorSVwgOnN1cDpgMmBcIEMgYW5kIFNNQnVzIFN1YnN5c3RlbQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJXCA6c3VwOmAyYFwgQyAob3Igd2l0aG91dCBmYW5jeSB0eXBvZ3JhcGh5LCAiSTJDIikgaXMgYW4gYWNyb255bSBmb3IKK3RoZSAiSW50ZXItSUMiIGJ1cywgYSBzaW1wbGUgYnVzIHByb3RvY29sIHdoaWNoIGlzIHdpZGVseSB1c2VkIHdoZXJlIGxvdworZGF0YSByYXRlIGNvbW11bmljYXRpb25zIHN1ZmZpY2UuIFNpbmNlIGl0J3MgYWxzbyBhIGxpY2Vuc2VkIHRyYWRlbWFyaywKK3NvbWUgdmVuZG9ycyB1c2UgYW5vdGhlciBuYW1lIChzdWNoIGFzICJUd28tV2lyZSBJbnRlcmZhY2UiLCBUV0kpIGZvcgordGhlIHNhbWUgYnVzLiBJMkMgb25seSBuZWVkcyB0d28gc2lnbmFscyAoU0NMIGZvciBjbG9jaywgU0RBIGZvciBkYXRhKSwKK2NvbnNlcnZpbmcgYm9hcmQgcmVhbCBlc3RhdGUgYW5kIG1pbmltaXppbmcgc2lnbmFsIHF1YWxpdHkgaXNzdWVzLiBNb3N0CitJMkMgZGV2aWNlcyB1c2Ugc2V2ZW4gYml0IGFkZHJlc3NlcywgYW5kIGJ1cyBzcGVlZHMgb2YgdXAgdG8gNDAwIGtIejsKK3RoZXJlJ3MgYSBoaWdoIHNwZWVkIGV4dGVuc2lvbiAoMy40IE1IeikgdGhhdCdzIG5vdCB5ZXQgZm91bmQgd2lkZSB1c2UuCitJMkMgaXMgYSBtdWx0aS1tYXN0ZXIgYnVzOyBvcGVuIGRyYWluIHNpZ25hbGluZyBpcyB1c2VkIHRvIGFyYml0cmF0ZQorYmV0d2VlbiBtYXN0ZXJzLCBhcyB3ZWxsIGFzIHRvIGhhbmRzaGFrZSBhbmQgdG8gc3luY2hyb25pemUgY2xvY2tzIGZyb20KK3Nsb3dlciBjbGllbnRzLgorCitUaGUgTGludXggSTJDIHByb2dyYW1taW5nIGludGVyZmFjZXMgc3VwcG9ydCBvbmx5IHRoZSBtYXN0ZXIgc2lkZSBvZiBidXMKK2ludGVyYWN0aW9ucywgbm90IHRoZSBzbGF2ZSBzaWRlLiBUaGUgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlIGlzCitzdHJ1Y3R1cmVkIGFyb3VuZCB0d28ga2luZHMgb2YgZHJpdmVyLCBhbmQgdHdvIGtpbmRzIG9mIGRldmljZS4gQW4gSTJDCisiQWRhcHRlciBEcml2ZXIiIGFic3RyYWN0cyB0aGUgY29udHJvbGxlciBoYXJkd2FyZTsgaXQgYmluZHMgdG8gYQorcGh5c2ljYWwgZGV2aWNlIChwZXJoYXBzIGEgUENJIGRldmljZSBvciBwbGF0Zm9ybV9kZXZpY2UpIGFuZCBleHBvc2VzIGEKKzpjOnR5cGU6YHN0cnVjdCBpMmNfYWRhcHRlciA8aTJjX2FkYXB0ZXI+YCByZXByZXNlbnRpbmcgZWFjaAorSTJDIGJ1cyBzZWdtZW50IGl0IG1hbmFnZXMuIE9uIGVhY2ggSTJDIGJ1cyBzZWdtZW50IHdpbGwgYmUgSTJDIGRldmljZXMKK3JlcHJlc2VudGVkIGJ5IGEgOmM6dHlwZTpgc3RydWN0IGkyY19jbGllbnQgPGkyY19jbGllbnQ+YC4KK1Rob3NlIGRldmljZXMgd2lsbCBiZSBib3VuZCB0byBhIDpjOnR5cGU6YHN0cnVjdCBpMmNfZHJpdmVyCis8aTJjX2RyaXZlcj5gLCB3aGljaCBzaG91bGQgZm9sbG93IHRoZSBzdGFuZGFyZCBMaW51eCBkcml2ZXIKK21vZGVsLiAoQXQgdGhpcyB3cml0aW5nLCBhIGxlZ2FjeSBtb2RlbCBpcyBtb3JlIHdpZGVseSB1c2VkLikgVGhlcmUgYXJlCitmdW5jdGlvbnMgdG8gcGVyZm9ybSB2YXJpb3VzIEkyQyBwcm90b2NvbCBvcGVyYXRpb25zOyBhdCB0aGlzIHdyaXRpbmcKK2FsbCBzdWNoIGZ1bmN0aW9ucyBhcmUgdXNhYmxlIG9ubHkgZnJvbSB0YXNrIGNvbnRleHQuCisKK1RoZSBTeXN0ZW0gTWFuYWdlbWVudCBCdXMgKFNNQnVzKSBpcyBhIHNpYmxpbmcgcHJvdG9jb2wuIE1vc3QgU01CdXMKK3N5c3RlbXMgYXJlIGFsc28gSTJDIGNvbmZvcm1hbnQuIFRoZSBlbGVjdHJpY2FsIGNvbnN0cmFpbnRzIGFyZSB0aWdodGVyCitmb3IgU01CdXMsIGFuZCBpdCBzdGFuZGFyZGl6ZXMgcGFydGljdWxhciBwcm90b2NvbCBtZXNzYWdlcyBhbmQgaWRpb21zLgorQ29udHJvbGxlcnMgdGhhdCBzdXBwb3J0IEkyQyBjYW4gYWxzbyBzdXBwb3J0IG1vc3QgU01CdXMgb3BlcmF0aW9ucywgYnV0CitTTUJ1cyBjb250cm9sbGVycyBkb24ndCBzdXBwb3J0IGFsbCB0aGUgcHJvdG9jb2wgb3B0aW9ucyB0aGF0IGFuIEkyQworY29udHJvbGxlciB3aWxsLiBUaGVyZSBhcmUgZnVuY3Rpb25zIHRvIHBlcmZvcm0gdmFyaW91cyBTTUJ1cyBwcm90b2NvbAorb3BlcmF0aW9ucywgZWl0aGVyIHVzaW5nIEkyQyBwcmltaXRpdmVzIG9yIGJ5IGlzc3VpbmcgU01CdXMgY29tbWFuZHMgdG8KK2kyY19hZGFwdGVyIGRldmljZXMgd2hpY2ggZG9uJ3Qgc3VwcG9ydCB0aG9zZSBJMkMgb3BlcmF0aW9ucy4KKworLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvbGludXgvaTJjLmgKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvaTJjL2kyYy1ib2FyZGluZm8uYworICAgOmZ1bmN0aW9uczogaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8KKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvaTJjL2kyYy1jb3JlLmMKKyAgIDpleHBvcnQ6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvaW5kZXgucnN0IGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL2luZGV4LnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTI1OWM1ZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9pbmRleC5yc3QKQEAgLTAsMCArMSwyNiBAQAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVGhlIExpbnV4IGRyaXZlciBpbXBsZW1lbnRlcidzIEFQSSBndWlkZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUga2VybmVsIG9mZmVycyBhIHdpZGUgdmFyaWV0eSBvZiBpbnRlcmZhY2VzIHRvIHN1cHBvcnQgdGhlIGRldmVsb3BtZW50CitvZiBkZXZpY2UgZHJpdmVycy4gIFRoaXMgZG9jdW1lbnQgaXMgYW4gb25seSBzb21ld2hhdCBvcmdhbml6ZWQgY29sbGVjdGlvbgorb2Ygc29tZSBvZiB0aG9zZSBpbnRlcmZhY2VzIOKAlCBpdCB3aWxsIGhvcGVmdWxseSBnZXQgYmV0dGVyIG92ZXIgdGltZSEgIFRoZQorYXZhaWxhYmxlIHN1YnNlY3Rpb25zIGNhbiBiZSBzZWVuIGJlbG93LgorCisuLiBjbGFzczo6IHRvYy10aXRsZQorCisJICAgVGFibGUgb2YgY29udGVudHMKKworLi4gdG9jdHJlZTo6CisgICA6bWF4ZGVwdGg6IDIKKworICAgYmFzaWNzCisgICBpbmZyYXN0cnVjdHVyZQorICAgbWVzc2FnZS1iYXNlZAorICAgc291bmQKKyAgIGZyYW1lLWJ1ZmZlcgorICAgaW5wdXQKKyAgIHNwaQorICAgaTJjCisgICBoc2kKKyAgIG1pc2NlbGxhbmVvdXMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9pbmZyYXN0cnVjdHVyZS5yc3QgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvaW5mcmFzdHJ1Y3R1cmUucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNTBkNjcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvaW5mcmFzdHJ1Y3R1cmUucnN0CkBAIC0wLDAgKzEsMTY5IEBACitEZXZpY2UgZHJpdmVycyBpbmZyYXN0cnVjdHVyZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIEJhc2ljIERldmljZSBEcml2ZXItTW9kZWwgU3RydWN0dXJlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9kZXZpY2UuaAorICAgOmludGVybmFsOgorCitEZXZpY2UgRHJpdmVycyBCYXNlCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2Jhc2UvaW5pdC5jCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2Jhc2UvZHJpdmVyLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2Jhc2UvY29yZS5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9iYXNlL3N5c2NvcmUuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvYmFzZS9jbGFzcy5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9iYXNlL25vZGUuYworICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2Jhc2UvdHJhbnNwb3J0X2NsYXNzLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2Jhc2UvZGQuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvbGludXgvcGxhdGZvcm1fZGV2aWNlLmgKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9iYXNlL2J1cy5jCisgICA6ZXhwb3J0OgorCitCdWZmZXIgU2hhcmluZyBhbmQgU3luY2hyb25pemF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBkbWEtYnVmIHN1YnN5c3RlbSBwcm92aWRlcyB0aGUgZnJhbWV3b3JrIGZvciBzaGFyaW5nIGJ1ZmZlcnMgZm9yCitoYXJkd2FyZSAoRE1BKSBhY2Nlc3MgYWNyb3NzIG11bHRpcGxlIGRldmljZSBkcml2ZXJzIGFuZCBzdWJzeXN0ZW1zLCBhbmQKK2ZvciBzeW5jaHJvbml6aW5nIGFzeW5jaHJvbm91cyBoYXJkd2FyZSBhY2Nlc3MuCisKK1RoaXMgaXMgdXNlZCwgZm9yIGV4YW1wbGUsIGJ5IGRybSAicHJpbWUiIG11bHRpLUdQVSBzdXBwb3J0LCBidXQgaXMgb2YKK2NvdXJzZSBub3QgbGltaXRlZCB0byBHUFUgdXNlIGNhc2VzLgorCitUaGUgdGhyZWUgbWFpbiBjb21wb25lbnRzIG9mIHRoaXMgYXJlOiAoMSkgZG1hLWJ1ZiwgcmVwcmVzZW50aW5nIGEKK3NnX3RhYmxlIGFuZCBleHBvc2VkIHRvIHVzZXJzcGFjZSBhcyBhIGZpbGUgZGVzY3JpcHRvciB0byBhbGxvdyBwYXNzaW5nCitiZXR3ZWVuIGRldmljZXMsICgyKSBmZW5jZSwgd2hpY2ggcHJvdmlkZXMgYSBtZWNoYW5pc20gdG8gc2lnbmFsIHdoZW4KK29uZSBkZXZpY2UgYXMgZmluaXNoZWQgYWNjZXNzLCBhbmQgKDMpIHJlc2VydmF0aW9uLCB3aGljaCBtYW5hZ2VzIHRoZQorc2hhcmVkIG9yIGV4Y2x1c2l2ZSBmZW5jZShzKSBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1ZmZlci4KKworZG1hLWJ1Zgorfn5+fn5+fgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9kbWEtYnVmL2RtYS1idWYuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvbGludXgvZG1hLWJ1Zi5oCisgICA6aW50ZXJuYWw6CisKK3Jlc2VydmF0aW9uCit+fn5+fn5+fn5+fgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9kbWEtYnVmL3Jlc2VydmF0aW9uLmMKKyAgIDpkb2M6IFJlc2VydmF0aW9uIE9iamVjdCBPdmVydmlldworCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9kbWEtYnVmL3Jlc2VydmF0aW9uLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L3Jlc2VydmF0aW9uLmgKKyAgIDppbnRlcm5hbDoKKworZmVuY2UKK35+fn5+CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2RtYS1idWYvZmVuY2UuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvbGludXgvZmVuY2UuaAorICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9kbWEtYnVmL3NlcW5vLWZlbmNlLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L3NlcW5vLWZlbmNlLmgKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvZG1hLWJ1Zi9mZW5jZS1hcnJheS5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9mZW5jZS1hcnJheS5oCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2RtYS1idWYvcmVzZXJ2YXRpb24uYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvbGludXgvcmVzZXJ2YXRpb24uaAorICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9kbWEtYnVmL3N5bmNfZmlsZS5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9zeW5jX2ZpbGUuaAorICAgOmludGVybmFsOgorCitEZXZpY2UgRHJpdmVycyBETUEgTWFuYWdlbWVudAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvYmFzZS9kbWEtY29oZXJlbnQuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvYmFzZS9kbWEtbWFwcGluZy5jCisgICA6ZXhwb3J0OgorCitEZXZpY2UgRHJpdmVycyBQb3dlciBNYW5hZ2VtZW50CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jCisgICA6ZXhwb3J0OgorCitEZXZpY2UgRHJpdmVycyBBQ1BJIFN1cHBvcnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9hY3BpL3NjYW4uYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvYWNwaS9zY2FuLmMKKyAgIDppbnRlcm5hbDoKKworRGV2aWNlIGRyaXZlcnMgUG5QIHN1cHBvcnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL3BucC9jb3JlLmMKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvcG5wL2NhcmQuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvcG5wL2RyaXZlci5jCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL3BucC9tYW5hZ2VyLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL3BucC9zdXBwb3J0LmMKKyAgIDpleHBvcnQ6CisKK1VzZXJzcGFjZSBJTyBkZXZpY2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy91aW8vdWlvLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L3Vpb19kcml2ZXIuaAorICAgOmludGVybmFsOgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvaW5wdXQucnN0IGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL2lucHV0LnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDViZjU4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL2lucHV0LnJzdApAQCAtMCwwICsxLDUxIEBACitJbnB1dCBTdWJzeXN0ZW0KKz09PT09PT09PT09PT09PQorCitJbnB1dCBjb3JlCistLS0tLS0tLS0tCisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L2lucHV0LmgKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvaW5wdXQvaW5wdXQuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvaW5wdXQvZmYtY29yZS5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9pbnB1dC9mZi1tZW1sZXNzLmMKKyAgIDpleHBvcnQ6CisKK011bHRpdG91Y2ggTGlicmFyeQorLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L2lucHV0L210LmgKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvaW5wdXQvaW5wdXQtbXQuYworICAgOmV4cG9ydDoKKworUG9sbGVkIGlucHV0IGRldmljZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L2lucHV0LXBvbGxkZXYuaAorICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9pbnB1dC9pbnB1dC1wb2xsZGV2LmMKKyAgIDpleHBvcnQ6CisKK01hdHJpeCBrZXlib2FyZHMva2V5cGFkcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L2lucHV0L21hdHJpeF9rZXlwYWQuaAorICAgOmludGVybmFsOgorCitTcGFyc2Uga2V5bWFwIHN1cHBvcnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9pbnB1dC9zcGFyc2Uta2V5bWFwLmgKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvaW5wdXQvc3BhcnNlLWtleW1hcC5jCisgICA6ZXhwb3J0OgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvbWVzc2FnZS1iYXNlZC5yc3QgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvbWVzc2FnZS1iYXNlZC5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThmZjk0ZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9tZXNzYWdlLWJhc2VkLnJzdApAQCAtMCwwICsxLDEyIEBACitNZXNzYWdlLWJhc2VkIGRldmljZXMKKz09PT09PT09PT09PT09PT09PT09PQorCitGdXNpb24gbWVzc2FnZSBkZXZpY2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguYworICAgOmV4cG9ydDoKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL21pc2NlbGxhbmVvdXMucnN0IGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL21pc2NlbGxhbmVvdXMucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYTdkMTEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvbWlzY2VsbGFuZW91cy5yc3QKQEAgLTAsMCArMSw1MCBAQAorUGFyYWxsZWwgUG9ydCBEZXZpY2VzCis9PT09PT09PT09PT09PT09PT09PT0KKworLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvbGludXgvcGFycG9ydC5oCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL3BhcnBvcnQvaWVlZTEyODQuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvcGFycG9ydC9zaGFyZS5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9wYXJwb3J0L2RhaXN5LmMKKyAgIDppbnRlcm5hbDoKKworMTZ4NTAgVUFSVCBEcml2ZXIKKz09PT09PT09PT09PT09PT09CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL3R0eS9zZXJpYWwvc2VyaWFsX2NvcmUuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfY29yZS5jCisgICA6ZXhwb3J0OgorCitQdWxzZS1XaWR0aCBNb2R1bGF0aW9uIChQV00pCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1B1bHNlLXdpZHRoIG1vZHVsYXRpb24gaXMgYSBtb2R1bGF0aW9uIHRlY2huaXF1ZSBwcmltYXJpbHkgdXNlZCB0bworY29udHJvbCBwb3dlciBzdXBwbGllZCB0byBlbGVjdHJpY2FsIGRldmljZXMuCisKK1RoZSBQV00gZnJhbWV3b3JrIHByb3ZpZGVzIGFuIGFic3RyYWN0aW9uIGZvciBwcm92aWRlcnMgYW5kIGNvbnN1bWVycyBvZgorUFdNIHNpZ25hbHMuIEEgY29udHJvbGxlciB0aGF0IHByb3ZpZGVzIG9uZSBvciBtb3JlIFBXTSBzaWduYWxzIGlzCityZWdpc3RlcmVkIGFzIDpjOnR5cGU6YHN0cnVjdCBwd21fY2hpcCA8cHdtX2NoaXA+YC4gUHJvdmlkZXJzCithcmUgZXhwZWN0ZWQgdG8gZW1iZWQgdGhpcyBzdHJ1Y3R1cmUgaW4gYSBkcml2ZXItc3BlY2lmaWMgc3RydWN0dXJlLgorVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgZmllbGRzIHRoYXQgZGVzY3JpYmUgYSBwYXJ0aWN1bGFyIGNoaXAuCisKK0EgY2hpcCBleHBvc2VzIG9uZSBvciBtb3JlIFBXTSBzaWduYWwgc291cmNlcywgZWFjaCBvZiB3aGljaCBleHBvc2VkIGFzCithIDpjOnR5cGU6YHN0cnVjdCBwd21fZGV2aWNlIDxwd21fZGV2aWNlPmAuIE9wZXJhdGlvbnMgY2FuIGJlCitwZXJmb3JtZWQgb24gUFdNIGRldmljZXMgdG8gY29udHJvbCB0aGUgcGVyaW9kLCBkdXR5IGN5Y2xlLCBwb2xhcml0eSBhbmQKK2FjdGl2ZSBzdGF0ZSBvZiB0aGUgc2lnbmFsLgorCitOb3RlIHRoYXQgUFdNIGRldmljZXMgYXJlIGV4Y2x1c2l2ZSByZXNvdXJjZXM6IHRoZXkgY2FuIGFsd2F5cyBvbmx5IGJlCit1c2VkIGJ5IG9uZSBjb25zdW1lciBhdCBhIHRpbWUuCisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L3B3bS5oCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL3B3bS9jb3JlLmMKKyAgIDpleHBvcnQ6CisgICAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9zb3VuZC5yc3QgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvc291bmQucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZWY2ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvc291bmQucnN0CkBAIC0wLDAgKzEsNTQgQEAKK1NvdW5kIERldmljZXMKKz09PT09PT09PT09PT0KKworLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvc291bmQvY29yZS5oCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBzb3VuZC9zb3VuZF9jb3JlLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL3NvdW5kL3BjbS5oCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBzb3VuZC9jb3JlL3BjbS5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogc291bmQvY29yZS9kZXZpY2UuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IHNvdW5kL2NvcmUvaW5mby5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogc291bmQvY29yZS9yYXdtaWRpLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBzb3VuZC9jb3JlL3NvdW5kLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBzb3VuZC9jb3JlL21lbW9yeS5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogc291bmQvY29yZS9wY21fbWVtb3J5LmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBzb3VuZC9jb3JlL2luaXQuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IHNvdW5kL2NvcmUvaXNhZG1hLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBzb3VuZC9jb3JlL2NvbnRyb2wuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IHNvdW5kL2NvcmUvcGNtX2xpYi5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogc291bmQvY29yZS9od2RlcC5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogc291bmQvY29yZS9wY21fbmF0aXZlLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBzb3VuZC9jb3JlL21lbWFsbG9jLmMKKyAgIDpleHBvcnQ6CisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9zcGkucnN0IGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL3NwaS5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY0Y2I2NgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9zcGkucnN0CkBAIC0wLDAgKzEsNTMgQEAKK1NlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoU1BJKQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1NQSSBpcyB0aGUgIlNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSIsIHdpZGVseSB1c2VkIHdpdGggZW1iZWRkZWQKK3N5c3RlbXMgYmVjYXVzZSBpdCBpcyBhIHNpbXBsZSBhbmQgZWZmaWNpZW50IGludGVyZmFjZTogYmFzaWNhbGx5IGEKK211bHRpcGxleGVkIHNoaWZ0IHJlZ2lzdGVyLiBJdHMgdGhyZWUgc2lnbmFsIHdpcmVzIGhvbGQgYSBjbG9jayAoU0NLLAorb2Z0ZW4gaW4gdGhlIHJhbmdlIG9mIDEtMjAgTUh6KSwgYSAiTWFzdGVyIE91dCwgU2xhdmUgSW4iIChNT1NJKSBkYXRhCitsaW5lLCBhbmQgYSAiTWFzdGVyIEluLCBTbGF2ZSBPdXQiIChNSVNPKSBkYXRhIGxpbmUuIFNQSSBpcyBhIGZ1bGwKK2R1cGxleCBwcm90b2NvbDsgZm9yIGVhY2ggYml0IHNoaWZ0ZWQgb3V0IHRoZSBNT1NJIGxpbmUgKG9uZSBwZXIgY2xvY2spCithbm90aGVyIGlzIHNoaWZ0ZWQgaW4gb24gdGhlIE1JU08gbGluZS4gVGhvc2UgYml0cyBhcmUgYXNzZW1ibGVkIGludG8KK3dvcmRzIG9mIHZhcmlvdXMgc2l6ZXMgb24gdGhlIHdheSB0byBhbmQgZnJvbSBzeXN0ZW0gbWVtb3J5LiBBbgorYWRkaXRpb25hbCBjaGlwc2VsZWN0IGxpbmUgaXMgdXN1YWxseSBhY3RpdmUtbG93IChuQ1MpOyBmb3VyIHNpZ25hbHMgYXJlCitub3JtYWxseSB1c2VkIGZvciBlYWNoIHBlcmlwaGVyYWwsIHBsdXMgc29tZXRpbWVzIGFuIGludGVycnVwdC4KKworVGhlIFNQSSBidXMgZmFjaWxpdGllcyBsaXN0ZWQgaGVyZSBwcm92aWRlIGEgZ2VuZXJhbGl6ZWQgaW50ZXJmYWNlIHRvCitkZWNsYXJlIFNQSSBidXNzZXMgYW5kIGRldmljZXMsIG1hbmFnZSB0aGVtIGFjY29yZGluZyB0byB0aGUgc3RhbmRhcmQKK0xpbnV4IGRyaXZlciBtb2RlbCwgYW5kIHBlcmZvcm0gaW5wdXQvb3V0cHV0IG9wZXJhdGlvbnMuIEF0IHRoaXMgdGltZSwKK29ubHkgIm1hc3RlciIgc2lkZSBpbnRlcmZhY2VzIGFyZSBzdXBwb3J0ZWQsIHdoZXJlIExpbnV4IHRhbGtzIHRvIFNQSQorcGVyaXBoZXJhbHMgYW5kIGRvZXMgbm90IGltcGxlbWVudCBzdWNoIGEgcGVyaXBoZXJhbCBpdHNlbGYuIChJbnRlcmZhY2VzCit0byBzdXBwb3J0IGltcGxlbWVudGluZyBTUEkgc2xhdmVzIHdvdWxkIG5lY2Vzc2FyaWx5IGxvb2sgZGlmZmVyZW50LikKKworVGhlIHByb2dyYW1taW5nIGludGVyZmFjZSBpcyBzdHJ1Y3R1cmVkIGFyb3VuZCB0d28ga2luZHMgb2YgZHJpdmVyLCBhbmQKK3R3byBraW5kcyBvZiBkZXZpY2UuIEEgIkNvbnRyb2xsZXIgRHJpdmVyIiBhYnN0cmFjdHMgdGhlIGNvbnRyb2xsZXIKK2hhcmR3YXJlLCB3aGljaCBtYXkgYmUgYXMgc2ltcGxlIGFzIGEgc2V0IG9mIEdQSU8gcGlucyBvciBhcyBjb21wbGV4IGFzCithIHBhaXIgb2YgRklGT3MgY29ubmVjdGVkIHRvIGR1YWwgRE1BIGVuZ2luZXMgb24gdGhlIG90aGVyIHNpZGUgb2YgdGhlCitTUEkgc2hpZnQgcmVnaXN0ZXIgKG1heGltaXppbmcgdGhyb3VnaHB1dCkuIFN1Y2ggZHJpdmVycyBicmlkZ2UgYmV0d2Vlbgord2hhdGV2ZXIgYnVzIHRoZXkgc2l0IG9uIChvZnRlbiB0aGUgcGxhdGZvcm0gYnVzKSBhbmQgU1BJLCBhbmQgZXhwb3NlCit0aGUgU1BJIHNpZGUgb2YgdGhlaXIgZGV2aWNlIGFzIGEgOmM6dHlwZTpgc3RydWN0IHNwaV9tYXN0ZXIKKzxzcGlfbWFzdGVyPmAuIFNQSSBkZXZpY2VzIGFyZSBjaGlsZHJlbiBvZiB0aGF0IG1hc3RlciwKK3JlcHJlc2VudGVkIGFzIGEgOmM6dHlwZTpgc3RydWN0IHNwaV9kZXZpY2UgPHNwaV9kZXZpY2U+YCBhbmQKK21hbnVmYWN0dXJlZCBmcm9tIDpjOnR5cGU6YHN0cnVjdCBzcGlfYm9hcmRfaW5mbworPHNwaV9ib2FyZF9pbmZvPmAgZGVzY3JpcHRvcnMgd2hpY2ggYXJlIHVzdWFsbHkgcHJvdmlkZWQgYnkKK2JvYXJkLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGNvZGUuIEEgOmM6dHlwZTpgc3RydWN0IHNwaV9kcml2ZXIKKzxzcGlfZHJpdmVyPmAgaXMgY2FsbGVkIGEgIlByb3RvY29sIERyaXZlciIsIGFuZCBpcyBib3VuZCB0byBhCitzcGlfZGV2aWNlIHVzaW5nIG5vcm1hbCBkcml2ZXIgbW9kZWwgY2FsbHMuCisKK1RoZSBJL08gbW9kZWwgaXMgYSBzZXQgb2YgcXVldWVkIG1lc3NhZ2VzLiBQcm90b2NvbCBkcml2ZXJzIHN1Ym1pdCBvbmUKK29yIG1vcmUgOmM6dHlwZTpgc3RydWN0IHNwaV9tZXNzYWdlIDxzcGlfbWVzc2FnZT5gIG9iamVjdHMsCit3aGljaCBhcmUgcHJvY2Vzc2VkIGFuZCBjb21wbGV0ZWQgYXN5bmNocm9ub3VzbHkuIChUaGVyZSBhcmUgc3luY2hyb25vdXMKK3dyYXBwZXJzLCBob3dldmVyLikgTWVzc2FnZXMgYXJlIGJ1aWx0IGZyb20gb25lIG9yIG1vcmUKKzpjOnR5cGU6YHN0cnVjdCBzcGlfdHJhbnNmZXIgPHNwaV90cmFuc2Zlcj5gIG9iamVjdHMsIGVhY2ggb2YKK3doaWNoIHdyYXBzIGEgZnVsbCBkdXBsZXggU1BJIHRyYW5zZmVyLiBBIHZhcmlldHkgb2YgcHJvdG9jb2wgdHdlYWtpbmcKK29wdGlvbnMgYXJlIG5lZWRlZCwgYmVjYXVzZSBkaWZmZXJlbnQgY2hpcHMgYWRvcHQgdmVyeSBkaWZmZXJlbnQKK3BvbGljaWVzIGZvciBob3cgdGhleSB1c2UgdGhlIGJpdHMgdHJhbnNmZXJyZWQgd2l0aCBTUEkuCisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L3NwaS9zcGkuaAorICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9zcGkvc3BpLmMKKyAgIDpmdW5jdGlvbnM6IHNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvCisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL3NwaS9zcGkuYworICAgOmV4cG9ydDoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL2RldmljZS50eHQgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9kZXZpY2UudHh0CmluZGV4IDFlNzAyMjAuLjI0MDNlYjggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL2RldmljZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItbW9kZWwvZGV2aWNlLnR4dApAQCAtNTAsNyArNTAsNyBAQAogUGxlYXNlIHNlZSBEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3N5c2ZzLnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbgogb24gaG93IHN5c2ZzIHdvcmtzLgogCi1BcyBleHBsYWluZWQgaW4gRG9jdW1lbnRhdGlvbi9rb2JqZWN0LnR4dCwgZGV2aWNlIGF0dHJpYnV0ZXMgbXVzdCBiZSBiZQorQXMgZXhwbGFpbmVkIGluIERvY3VtZW50YXRpb24va29iamVjdC50eHQsIGRldmljZSBhdHRyaWJ1dGVzIG11c3QgYmUKIGNyZWF0ZWQgYmVmb3JlIHRoZSBLT0JKX0FERCB1ZXZlbnQgaXMgZ2VuZXJhdGVkLiBUaGUgb25seSB3YXkgdG8gcmVhbGl6ZQogdGhhdCBpcyBieSBkZWZpbmluZyBhbiBhdHRyaWJ1dGUgZ3JvdXAuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL2RldnJlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9kZXZyZXMudHh0CmluZGV4IGIwZDc3NWQuLjE2NzA3MDggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL2RldnJlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItbW9kZWwvZGV2cmVzLnR4dApAQCAtMjY2LDggKzI2NiwxMiBAQAogICBkZXZtX2lpb19kZXZpY2VfdW5yZWdpc3RlcigpCiAgIGRldm1faWlvX2tmaWZvX2FsbG9jYXRlKCkKICAgZGV2bV9paW9fa2ZpZm9fZnJlZSgpCisgIGRldm1faWlvX3RyaWdnZXJlZF9idWZmZXJfc2V0dXAoKQorICBkZXZtX2lpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoKQogICBkZXZtX2lpb190cmlnZ2VyX2FsbG9jKCkKICAgZGV2bV9paW9fdHJpZ2dlcl9mcmVlKCkKKyAgZGV2bV9paW9fdHJpZ2dlcl9yZWdpc3RlcigpCisgIGRldm1faWlvX3RyaWdnZXJfdW5yZWdpc3RlcigpCiAgIGRldm1faWlvX2NoYW5uZWxfZ2V0KCkKICAgZGV2bV9paW9fY2hhbm5lbF9yZWxlYXNlKCkKICAgZGV2bV9paW9fY2hhbm5lbF9nZXRfYWxsKCkKQEAgLTM0Miw2ICszNDYsMTAgQEAKICAgZGV2bV9waW5jdHJsX3JlZ2lzdGVyKCkKICAgZGV2bV9waW5jdHJsX3VucmVnaXN0ZXIoKQogCitQT1dFUgorICBkZXZtX3JlYm9vdF9tb2RlX3JlZ2lzdGVyKCkKKyAgZGV2bV9yZWJvb3RfbW9kZV91bnJlZ2lzdGVyKCkKKwogUFdNCiAgIGRldm1fcHdtX2dldCgpCiAgIGRldm1fcHdtX3B1dCgpCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2VtYWlsLWNsaWVudHMudHh0IGIvRG9jdW1lbnRhdGlvbi9lbWFpbC1jbGllbnRzLnR4dAppbmRleCAyZDQ4NWRlLi5hYzg5MmIzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2VtYWlsLWNsaWVudHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZW1haWwtY2xpZW50cy50eHQKQEAgLTEsMjMgKzEsMjcgQEAKKy4uIF9lbWFpbF9jbGllbnRzOgorCiBFbWFpbCBjbGllbnRzIGluZm8gZm9yIExpbnV4Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIEdpdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVGhlc2UgZGF5cyBtb3N0IGRldmVsb3BlcnMgdXNlIGBnaXQgc2VuZC1lbWFpbGAgaW5zdGVhZCBvZiByZWd1bGFyCi1lbWFpbCBjbGllbnRzLiAgVGhlIG1hbiBwYWdlIGZvciB0aGlzIGlzIHF1aXRlIGdvb2QuICBPbiB0aGUgcmVjZWl2aW5nCi1lbmQsIG1haW50YWluZXJzIHVzZSBgZ2l0IGFtYCB0byBhcHBseSB0aGUgcGF0Y2hlcy4KKy0tLQogCi1JZiB5b3UgYXJlIG5ldyB0byBnaXQgdGhlbiBzZW5kIHlvdXIgZmlyc3QgcGF0Y2ggdG8geW91cnNlbGYuICBTYXZlIGl0Ci1hcyByYXcgdGV4dCBpbmNsdWRpbmcgYWxsIHRoZSBoZWFkZXJzLiAgUnVuIGBnaXQgYW0gcmF3X2VtYWlsLnR4dGAgYW5kCi10aGVuIHJldmlldyB0aGUgY2hhbmdlbG9nIHdpdGggYGdpdCBsb2dgLiAgV2hlbiB0aGF0IHdvcmtzIHRoZW4gc2VuZAorVGhlc2UgZGF5cyBtb3N0IGRldmVsb3BlcnMgdXNlIGBgZ2l0IHNlbmQtZW1haWxgYCBpbnN0ZWFkIG9mIHJlZ3VsYXIKK2VtYWlsIGNsaWVudHMuICBUaGUgbWFuIHBhZ2UgZm9yIHRoaXMgaXMgcXVpdGUgZ29vZC4gIE9uIHRoZSByZWNlaXZpbmcKK2VuZCwgbWFpbnRhaW5lcnMgdXNlIGBgZ2l0IGFtYGAgdG8gYXBwbHkgdGhlIHBhdGNoZXMuCisKK0lmIHlvdSBhcmUgbmV3IHRvIGBgZ2l0YGAgdGhlbiBzZW5kIHlvdXIgZmlyc3QgcGF0Y2ggdG8geW91cnNlbGYuICBTYXZlIGl0CithcyByYXcgdGV4dCBpbmNsdWRpbmcgYWxsIHRoZSBoZWFkZXJzLiAgUnVuIGBgZ2l0IGFtIHJhd19lbWFpbC50eHRgYCBhbmQKK3RoZW4gcmV2aWV3IHRoZSBjaGFuZ2Vsb2cgd2l0aCBgYGdpdCBsb2dgYC4gIFdoZW4gdGhhdCB3b3JrcyB0aGVuIHNlbmQKIHRoZSBwYXRjaCB0byB0aGUgYXBwcm9wcmlhdGUgbWFpbGluZyBsaXN0KHMpLgogCiBHZW5lcmFsIFByZWZlcmVuY2VzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLS0tLS0tLS0tLS0tLS0tLS0tCisKIFBhdGNoZXMgZm9yIHRoZSBMaW51eCBrZXJuZWwgYXJlIHN1Ym1pdHRlZCB2aWEgZW1haWwsIHByZWZlcmFibHkgYXMKIGlubGluZSB0ZXh0IGluIHRoZSBib2R5IG9mIHRoZSBlbWFpbC4gIFNvbWUgbWFpbnRhaW5lcnMgYWNjZXB0CiBhdHRhY2htZW50cywgYnV0IHRoZW4gdGhlIGF0dGFjaG1lbnRzIHNob3VsZCBoYXZlIGNvbnRlbnQtdHlwZQotInRleHQvcGxhaW4iLiAgSG93ZXZlciwgYXR0YWNobWVudHMgYXJlIGdlbmVyYWxseSBmcm93bmVkIHVwb24gYmVjYXVzZQorYGB0ZXh0L3BsYWluYGAuICBIb3dldmVyLCBhdHRhY2htZW50cyBhcmUgZ2VuZXJhbGx5IGZyb3duZWQgdXBvbiBiZWNhdXNlCiBpdCBtYWtlcyBxdW90aW5nIHBvcnRpb25zIG9mIHRoZSBwYXRjaCBtb3JlIGRpZmZpY3VsdCBpbiB0aGUgcGF0Y2gKIHJldmlldyBwcm9jZXNzLgogCkBAIC0yNSw3ICsyOSw3IEBACiBwYXRjaCB0ZXh0IHVudG91Y2hlZC4gIEZvciBleGFtcGxlLCB0aGV5IHNob3VsZCBub3QgbW9kaWZ5IG9yIGRlbGV0ZSB0YWJzCiBvciBzcGFjZXMsIGV2ZW4gYXQgdGhlIGJlZ2lubmluZyBvciBlbmQgb2YgbGluZXMuCiAKLURvbid0IHNlbmQgcGF0Y2hlcyB3aXRoICJmb3JtYXQ9Zmxvd2VkIi4gIFRoaXMgY2FuIGNhdXNlIHVuZXhwZWN0ZWQKK0Rvbid0IHNlbmQgcGF0Y2hlcyB3aXRoIGBgZm9ybWF0PWZsb3dlZGBgLiAgVGhpcyBjYW4gY2F1c2UgdW5leHBlY3RlZAogYW5kIHVud2FudGVkIGxpbmUgYnJlYWtzLgogCiBEb24ndCBsZXQgeW91ciBlbWFpbCBjbGllbnQgZG8gYXV0b21hdGljIHdvcmQgd3JhcHBpbmcgZm9yIHlvdS4KQEAgLTU0LDU3ICs1OCw2MyBAQAogCiAKIFNvbWUgZW1haWwgY2xpZW50IChNVUEpIGhpbnRzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiBIZXJlIGFyZSBzb21lIHNwZWNpZmljIE1VQSBjb25maWd1cmF0aW9uIGhpbnRzIGZvciBlZGl0aW5nIGFuZCBzZW5kaW5nCiBwYXRjaGVzIGZvciB0aGUgTGludXgga2VybmVsLiAgVGhlc2UgYXJlIG5vdCBtZWFudCB0byBiZSBjb21wbGV0ZQogc29mdHdhcmUgcGFja2FnZSBjb25maWd1cmF0aW9uIHN1bW1hcmllcy4KIAotTGVnZW5kOgotVFVJID0gdGV4dC1iYXNlZCB1c2VyIGludGVyZmFjZQotR1VJID0gZ3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlCiAKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitMZWdlbmQ6CisKKy0gVFVJID0gdGV4dC1iYXNlZCB1c2VyIGludGVyZmFjZQorLSBHVUkgPSBncmFwaGljYWwgdXNlciBpbnRlcmZhY2UKKwogQWxwaW5lIChUVUkpCisqKioqKioqKioqKioKIAogQ29uZmlnIG9wdGlvbnM6Ci1JbiB0aGUgIlNlbmRpbmcgUHJlZmVyZW5jZXMiIHNlY3Rpb246CiAKLS0gIkRvIE5vdCBTZW5kIEZsb3dlZCBUZXh0IiBtdXN0IGJlIGVuYWJsZWQKLS0gIlN0cmlwIFdoaXRlc3BhY2UgQmVmb3JlIFNlbmRpbmciIG11c3QgYmUgZGlzYWJsZWQKK0luIHRoZSA6bWVudXNlbGVjdGlvbjpgU2VuZGluZyBQcmVmZXJlbmNlc2Agc2VjdGlvbjoKKworLSA6bWVudXNlbGVjdGlvbjpgRG8gTm90IFNlbmQgRmxvd2VkIFRleHRgIG11c3QgYmUgYGBlbmFibGVkYGAKKy0gOm1lbnVzZWxlY3Rpb246YFN0cmlwIFdoaXRlc3BhY2UgQmVmb3JlIFNlbmRpbmdgIG11c3QgYmUgYGBkaXNhYmxlZGBgCiAKIFdoZW4gY29tcG9zaW5nIHRoZSBtZXNzYWdlLCB0aGUgY3Vyc29yIHNob3VsZCBiZSBwbGFjZWQgd2hlcmUgdGhlIHBhdGNoCi1zaG91bGQgYXBwZWFyLCBhbmQgdGhlbiBwcmVzc2luZyBDVFJMLVIgbGV0IHlvdSBzcGVjaWZ5IHRoZSBwYXRjaCBmaWxlCitzaG91bGQgYXBwZWFyLCBhbmQgdGhlbiBwcmVzc2luZyA6a2JkOmBDVFJMLVJgIGxldCB5b3Ugc3BlY2lmeSB0aGUgcGF0Y2ggZmlsZQogdG8gaW5zZXJ0IGludG8gdGhlIG1lc3NhZ2UuCiAKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiBDbGF3cyBNYWlsIChHVUkpCisqKioqKioqKioqKioqKioqCiAKIFdvcmtzLiBTb21lIHBlb3BsZSB1c2UgdGhpcyBzdWNjZXNzZnVsbHkgZm9yIHBhdGNoZXMuCiAKLVRvIGluc2VydCBhIHBhdGNoIHVzZSBNZXNzYWdlLT5JbnNlcnQgRmlsZSAoQ1RSTCtpKSBvciBhbiBleHRlcm5hbCBlZGl0b3IuCitUbyBpbnNlcnQgYSBwYXRjaCB1c2UgOm1lbnVzZWxlY3Rpb246YE1lc3NhZ2UtLT5JbnNlcnRgIEZpbGUgKDprYmQ6YENUUkwtSWApCitvciBhbiBleHRlcm5hbCBlZGl0b3IuCiAKIElmIHRoZSBpbnNlcnRlZCBwYXRjaCBoYXMgdG8gYmUgZWRpdGVkIGluIHRoZSBDbGF3cyBjb21wb3NpdGlvbiB3aW5kb3cKLSJBdXRvIHdyYXBwaW5nIiBpbiBDb25maWd1cmF0aW9uLT5QcmVmZXJlbmNlcy0+Q29tcG9zZS0+V3JhcHBpbmcgc2hvdWxkIGJlCisiQXV0byB3cmFwcGluZyIgaW4KKzptZW51c2VsZWN0aW9uOmBDb25maWd1cmF0aW9uLS0+UHJlZmVyZW5jZXMtLT5Db21wb3NlLS0+V3JhcHBpbmdgIHNob3VsZCBiZQogZGlzYWJsZWQuCiAKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiBFdm9sdXRpb24gKEdVSSkKKyoqKioqKioqKioqKioqKgogCiBTb21lIHBlb3BsZSB1c2UgdGhpcyBzdWNjZXNzZnVsbHkgZm9yIHBhdGNoZXMuCiAKIFdoZW4gY29tcG9zaW5nIG1haWwgc2VsZWN0OiBQcmVmb3JtYXQKLSAgZnJvbSBGb3JtYXQtPlBhcmFncmFwaCBTdHlsZS0+UHJlZm9ybWF0dGVkIChDdHJsLTcpCisgIGZyb20gOm1lbnVzZWxlY3Rpb246YEZvcm1hdC0tPlBhcmFncmFwaCBTdHlsZS0tPlByZWZvcm1hdHRlZGAgKDprYmQ6YENUUkwtN2ApCiAgIG9yIHRoZSB0b29sYmFyCiAKIFRoZW4gdXNlOgotICBJbnNlcnQtPlRleHQgRmlsZS4uLiAoQWx0LW4geCkKKzptZW51c2VsZWN0aW9uOmBJbnNlcnQtLT5UZXh0IEZpbGUuLi5gICg6a2JkOmBBTFQtTiB4YCkKIHRvIGluc2VydCB0aGUgcGF0Y2guCiAKLVlvdSBjYW4gYWxzbyAiZGlmZiAtTnJ1IG9sZC5jIG5ldy5jIHwgeGNsaXAiLCBzZWxlY3QgUHJlZm9ybWF0LCB0aGVuCi1wYXN0ZSB3aXRoIHRoZSBtaWRkbGUgYnV0dG9uLgorWW91IGNhbiBhbHNvIGBgZGlmZiAtTnJ1IG9sZC5jIG5ldy5jIHwgeGNsaXBgYCwgc2VsZWN0Cis6bWVudXNlbGVjdGlvbjpgUHJlZm9ybWF0YCwgdGhlbiBwYXN0ZSB3aXRoIHRoZSBtaWRkbGUgYnV0dG9uLgogCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogS21haWwgKEdVSSkKKyoqKioqKioqKioqCiAKIFNvbWUgcGVvcGxlIHVzZSBLbWFpbCBzdWNjZXNzZnVsbHkgZm9yIHBhdGNoZXMuCiAKQEAgLTEyMCwxMSArMTMwLDEyIEBACiB3cmFwcGluZy4KIAogQXQgdGhlIGJvdHRvbSBvZiB5b3VyIGVtYWlsLCBwdXQgdGhlIGNvbW1vbmx5LXVzZWQgcGF0Y2ggZGVsaW1pdGVyIGJlZm9yZQotaW5zZXJ0aW5nIHlvdXIgcGF0Y2g6ICB0aHJlZSBoeXBoZW5zICgtLS0pLgoraW5zZXJ0aW5nIHlvdXIgcGF0Y2g6ICB0aHJlZSBoeXBoZW5zIChgYC0tLWBgKS4KIAotVGhlbiBmcm9tIHRoZSAiTWVzc2FnZSIgbWVudSBpdGVtLCBzZWxlY3QgaW5zZXJ0IGZpbGUgYW5kIGNob29zZSB5b3VyIHBhdGNoLgorVGhlbiBmcm9tIHRoZSA6bWVudXNlbGVjdGlvbjpgTWVzc2FnZWAgbWVudSBpdGVtLCBzZWxlY3QgaW5zZXJ0IGZpbGUgYW5kCitjaG9vc2UgeW91ciBwYXRjaC4KIEFzIGFuIGFkZGVkIGJvbnVzIHlvdSBjYW4gY3VzdG9taXNlIHRoZSBtZXNzYWdlIGNyZWF0aW9uIHRvb2xiYXIgbWVudQotYW5kIHB1dCB0aGUgImluc2VydCBmaWxlIiBpY29uIHRoZXJlLgorYW5kIHB1dCB0aGUgOm1lbnVzZWxlY3Rpb246YGluc2VydCBmaWxlYCBpY29uIHRoZXJlLgogCiBNYWtlIHRoZSBjb21wb3NlciB3aW5kb3cgd2lkZSBlbm91Z2ggc28gdGhhdCBubyBsaW5lcyB3cmFwLiBBcyBvZgogS01haWwgMS4xMy41IChLREUgNC41LjQpLCBLTWFpbCB3aWxsIGFwcGx5IHdvcmQgd3JhcHBpbmcgd2hlbiBzZW5kaW5nCkBAIC0xMzksODYgKzE1MCw5NiBAQAogCiBJZiB5b3UgYWJzb2x1dGVseSBtdXN0IHNlbmQgcGF0Y2hlcyBhcyBhdHRhY2htZW50cyBpbnN0ZWFkIG9mIGlubGluaW5nCiB0aGVtIGFzIHRleHQsIHJpZ2h0IGNsaWNrIG9uIHRoZSBhdHRhY2htZW50IGFuZCBzZWxlY3QgcHJvcGVydGllcywgYW5kCi1oaWdobGlnaHQgIlN1Z2dlc3QgYXV0b21hdGljIGRpc3BsYXkiIHRvIG1ha2UgdGhlIGF0dGFjaG1lbnQgaW5saW5lZCB0bwotbWFrZSBpdCBtb3JlIHZpZXdhYmxlLgoraGlnaGxpZ2h0IDptZW51c2VsZWN0aW9uOmBTdWdnZXN0IGF1dG9tYXRpYyBkaXNwbGF5YCB0byBtYWtlIHRoZSBhdHRhY2htZW50CitpbmxpbmVkIHRvIG1ha2UgaXQgbW9yZSB2aWV3YWJsZS4KIAogV2hlbiBzYXZpbmcgcGF0Y2hlcyB0aGF0IGFyZSBzZW50IGFzIGlubGluZWQgdGV4dCwgc2VsZWN0IHRoZSBlbWFpbCB0aGF0CiBjb250YWlucyB0aGUgcGF0Y2ggZnJvbSB0aGUgbWVzc2FnZSBsaXN0IHBhbmUsIHJpZ2h0IGNsaWNrIGFuZCBzZWxlY3QKLSJzYXZlIGFzIi4gIFlvdSBjYW4gdXNlIHRoZSB3aG9sZSBlbWFpbCB1bm1vZGlmaWVkIGFzIGEgcGF0Y2ggaWYgaXQgd2FzCi1wcm9wZXJseSBjb21wb3NlZC4gIFRoZXJlIGlzIG5vIG9wdGlvbiBjdXJyZW50bHkgdG8gc2F2ZSB0aGUgZW1haWwgd2hlbiB5b3UKLWFyZSBhY3R1YWxseSB2aWV3aW5nIGl0IGluIGl0cyBvd24gd2luZG93IC0tIHRoZXJlIGhhcyBiZWVuIGEgcmVxdWVzdCBmaWxlZAotYXQga21haWwncyBidWd6aWxsYSBhbmQgaG9wZWZ1bGx5IHRoaXMgd2lsbCBiZSBhZGRyZXNzZWQuICBFbWFpbHMgYXJlIHNhdmVkCi1hcyByZWFkLXdyaXRlIGZvciB1c2VyIG9ubHkgc28geW91IHdpbGwgaGF2ZSB0byBjaG1vZCB0aGVtIHRvIG1ha2UgdGhlbQorOm1lbnVzZWxlY3Rpb246YHNhdmUgYXNgLiAgWW91IGNhbiB1c2UgdGhlIHdob2xlIGVtYWlsIHVubW9kaWZpZWQgYXMgYSBwYXRjaAoraWYgaXQgd2FzIHByb3Blcmx5IGNvbXBvc2VkLiAgVGhlcmUgaXMgbm8gb3B0aW9uIGN1cnJlbnRseSB0byBzYXZlIHRoZSBlbWFpbAord2hlbiB5b3UgYXJlIGFjdHVhbGx5IHZpZXdpbmcgaXQgaW4gaXRzIG93biB3aW5kb3cgLS0gdGhlcmUgaGFzIGJlZW4gYSByZXF1ZXN0CitmaWxlZCBhdCBrbWFpbCdzIGJ1Z3ppbGxhIGFuZCBob3BlZnVsbHkgdGhpcyB3aWxsIGJlIGFkZHJlc3NlZC4gIEVtYWlscyBhcmUKK3NhdmVkIGFzIHJlYWQtd3JpdGUgZm9yIHVzZXIgb25seSBzbyB5b3Ugd2lsbCBoYXZlIHRvIGNobW9kIHRoZW0gdG8gbWFrZSB0aGVtCiBncm91cCBhbmQgd29ybGQgcmVhZGFibGUgaWYgeW91IGNvcHkgdGhlbSBlbHNld2hlcmUuCiAKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiBMb3R1cyBOb3RlcyAoR1VJKQorKioqKioqKioqKioqKioqKioKIAogUnVuIGF3YXkgZnJvbSBpdC4KIAotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIE11dHQgKFRVSSkKKyoqKioqKioqKioKIAotUGxlbnR5IG9mIExpbnV4IGRldmVsb3BlcnMgdXNlIG11dHQsIHNvIGl0IG11c3Qgd29yayBwcmV0dHkgd2VsbC4KK1BsZW50eSBvZiBMaW51eCBkZXZlbG9wZXJzIHVzZSBgYG11dHRgYCwgc28gaXQgbXVzdCB3b3JrIHByZXR0eSB3ZWxsLgogCiBNdXR0IGRvZXNuJ3QgY29tZSB3aXRoIGFuIGVkaXRvciwgc28gd2hhdGV2ZXIgZWRpdG9yIHlvdSB1c2Ugc2hvdWxkIGJlCiB1c2VkIGluIGEgd2F5IHRoYXQgdGhlcmUgYXJlIG5vIGF1dG9tYXRpYyBsaW5lYnJlYWtzLiAgTW9zdCBlZGl0b3JzIGhhdmUKLWFuICJpbnNlcnQgZmlsZSIgb3B0aW9uIHRoYXQgaW5zZXJ0cyB0aGUgY29udGVudHMgb2YgYSBmaWxlIHVuYWx0ZXJlZC4KK2FuIDptZW51c2VsZWN0aW9uOmBpbnNlcnQgZmlsZWAgb3B0aW9uIHRoYXQgaW5zZXJ0cyB0aGUgY29udGVudHMgb2YgYSBmaWxlCit1bmFsdGVyZWQuCiAKLVRvIHVzZSAndmltJyB3aXRoIG11dHQ6CitUbyB1c2UgYGB2aW1gYCB3aXRoIG11dHQ6OgorCiAgIHNldCBlZGl0b3I9InZpIgogCi0gIElmIHVzaW5nIHhjbGlwLCB0eXBlIHRoZSBjb21tYW5kCitJZiB1c2luZyB4Y2xpcCwgdHlwZSB0aGUgY29tbWFuZDo6CisKICAgOnNldCBwYXN0ZQotICBiZWZvcmUgbWlkZGxlIGJ1dHRvbiBvciBzaGlmdC1pbnNlcnQgb3IgdXNlCisKK2JlZm9yZSBtaWRkbGUgYnV0dG9uIG9yIHNoaWZ0LWluc2VydCBvciB1c2U6OgorCiAgIDpyIGZpbGVuYW1lCiAKIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgdGhlIHBhdGNoIGlubGluZS4KLShhKXR0YWNoIHdvcmtzIGZpbmUgd2l0aG91dCAic2V0IHBhc3RlIi4KKyhhKXR0YWNoIHdvcmtzIGZpbmUgd2l0aG91dCBgYHNldCBwYXN0ZWBgLgogCi1Zb3UgY2FuIGFsc28gZ2VuZXJhdGUgcGF0Y2hlcyB3aXRoICdnaXQgZm9ybWF0LXBhdGNoJyBhbmQgdGhlbiB1c2UgTXV0dAotdG8gc2VuZCB0aGVtOgorWW91IGNhbiBhbHNvIGdlbmVyYXRlIHBhdGNoZXMgd2l0aCBgYGdpdCBmb3JtYXQtcGF0Y2hgYCBhbmQgdGhlbiB1c2UgTXV0dAordG8gc2VuZCB0aGVtOjoKKwogICAgICQgbXV0dCAtSCAwMDAxLXNvbWUtYnVnLWZpeC5wYXRjaAogCiBDb25maWcgb3B0aW9uczoKKwogSXQgc2hvdWxkIHdvcmsgd2l0aCBkZWZhdWx0IHNldHRpbmdzLgotSG93ZXZlciwgaXQncyBhIGdvb2QgaWRlYSB0byBzZXQgdGhlICJzZW5kX2NoYXJzZXQiIHRvOgorSG93ZXZlciwgaXQncyBhIGdvb2QgaWRlYSB0byBzZXQgdGhlIGBgc2VuZF9jaGFyc2V0YGAgdG86OgorCiAgIHNldCBzZW5kX2NoYXJzZXQ9InVzLWFzY2lpOnV0Zi04IgogCiBNdXR0IGlzIGhpZ2hseSBjdXN0b21pemFibGUuIEhlcmUgaXMgYSBtaW5pbXVtIGNvbmZpZ3VyYXRpb24gdG8gc3RhcnQKLXVzaW5nIE11dHQgdG8gc2VuZCBwYXRjaGVzIHRocm91Z2ggR21haWw6Cit1c2luZyBNdXR0IHRvIHNlbmQgcGF0Y2hlcyB0aHJvdWdoIEdtYWlsOjoKIAotIyAubXV0dHJjCi0jID09PT09PT09PT09PT09PT0gIElNQVAgPT09PT09PT09PT09PT09PT09PT0KLXNldCBpbWFwX3VzZXIgPSAneW91cnVzZXJuYW1lQGdtYWlsLmNvbScKLXNldCBpbWFwX3Bhc3MgPSAneW91cnBhc3N3b3JkJwotc2V0IHNwb29sZmlsZSA9IGltYXBzOi8vaW1hcC5nbWFpbC5jb20vSU5CT1gKLXNldCBmb2xkZXIgPSBpbWFwczovL2ltYXAuZ21haWwuY29tLwotc2V0IHJlY29yZD0iaW1hcHM6Ly9pbWFwLmdtYWlsLmNvbS9bR21haWxdL1NlbnQgTWFpbCIKLXNldCBwb3N0cG9uZWQ9ImltYXBzOi8vaW1hcC5nbWFpbC5jb20vW0dtYWlsXS9EcmFmdHMiCi1zZXQgbWJveD0iaW1hcHM6Ly9pbWFwLmdtYWlsLmNvbS9bR21haWxdL0FsbCBNYWlsIgorICAjIC5tdXR0cmMKKyAgIyA9PT09PT09PT09PT09PT09ICBJTUFQID09PT09PT09PT09PT09PT09PT09CisgIHNldCBpbWFwX3VzZXIgPSAneW91cnVzZXJuYW1lQGdtYWlsLmNvbScKKyAgc2V0IGltYXBfcGFzcyA9ICd5b3VycGFzc3dvcmQnCisgIHNldCBzcG9vbGZpbGUgPSBpbWFwczovL2ltYXAuZ21haWwuY29tL0lOQk9YCisgIHNldCBmb2xkZXIgPSBpbWFwczovL2ltYXAuZ21haWwuY29tLworICBzZXQgcmVjb3JkPSJpbWFwczovL2ltYXAuZ21haWwuY29tL1tHbWFpbF0vU2VudCBNYWlsIgorICBzZXQgcG9zdHBvbmVkPSJpbWFwczovL2ltYXAuZ21haWwuY29tL1tHbWFpbF0vRHJhZnRzIgorICBzZXQgbWJveD0iaW1hcHM6Ly9pbWFwLmdtYWlsLmNvbS9bR21haWxdL0FsbCBNYWlsIgogCi0jID09PT09PT09PT09PT09PT0gIFNNVFAgID09PT09PT09PT09PT09PT09PT09Ci1zZXQgc210cF91cmwgPSAic210cDovL3VzZXJuYW1lQHNtdHAuZ21haWwuY29tOjU4Ny8iCi1zZXQgc210cF9wYXNzID0gJGltYXBfcGFzcwotc2V0IHNzbF9mb3JjZV90bHMgPSB5ZXMgIyBSZXF1aXJlIGVuY3J5cHRlZCBjb25uZWN0aW9uCisgICMgPT09PT09PT09PT09PT09PSAgU01UUCAgPT09PT09PT09PT09PT09PT09PT0KKyAgc2V0IHNtdHBfdXJsID0gInNtdHA6Ly91c2VybmFtZUBzbXRwLmdtYWlsLmNvbTo1ODcvIgorICBzZXQgc210cF9wYXNzID0gJGltYXBfcGFzcworICBzZXQgc3NsX2ZvcmNlX3RscyA9IHllcyAjIFJlcXVpcmUgZW5jcnlwdGVkIGNvbm5lY3Rpb24KIAotIyA9PT09PT09PT09PT09PT09ICBDb21wb3NpdGlvbiAgPT09PT09PT09PT09PT09PT09PT0KLXNldCBlZGl0b3IgPSBgZWNobyBcJEVESVRPUmAKLXNldCBlZGl0X2hlYWRlcnMgPSB5ZXMgICMgU2VlIHRoZSBoZWFkZXJzIHdoZW4gZWRpdGluZwotc2V0IGNoYXJzZXQgPSBVVEYtOCAgICAgIyB2YWx1ZSBvZiAkTEFORzsgYWxzbyBmYWxsYmFjayBmb3Igc2VuZF9jaGFyc2V0Ci0jIFNlbmRlciwgZW1haWwgYWRkcmVzcywgYW5kIHNpZ24tb2ZmIGxpbmUgbXVzdCBtYXRjaAotdW5zZXQgdXNlX2RvbWFpbiAgICAgICAgIyBiZWNhdXNlIGpvZUBsb2NhbGhvc3QgaXMganVzdCBlbWJhcnJhc3NpbmcKLXNldCByZWFsbmFtZSA9ICJZT1VSIE5BTUUiCi1zZXQgZnJvbSA9ICJ1c2VybmFtZUBnbWFpbC5jb20iCi1zZXQgdXNlX2Zyb20gPSB5ZXMKKyAgIyA9PT09PT09PT09PT09PT09ICBDb21wb3NpdGlvbiAgPT09PT09PT09PT09PT09PT09PT0KKyAgc2V0IGVkaXRvciA9IGBlY2hvIFwkRURJVE9SYAorICBzZXQgZWRpdF9oZWFkZXJzID0geWVzICAjIFNlZSB0aGUgaGVhZGVycyB3aGVuIGVkaXRpbmcKKyAgc2V0IGNoYXJzZXQgPSBVVEYtOCAgICAgIyB2YWx1ZSBvZiAkTEFORzsgYWxzbyBmYWxsYmFjayBmb3Igc2VuZF9jaGFyc2V0CisgICMgU2VuZGVyLCBlbWFpbCBhZGRyZXNzLCBhbmQgc2lnbi1vZmYgbGluZSBtdXN0IG1hdGNoCisgIHVuc2V0IHVzZV9kb21haW4gICAgICAgICMgYmVjYXVzZSBqb2VAbG9jYWxob3N0IGlzIGp1c3QgZW1iYXJyYXNzaW5nCisgIHNldCByZWFsbmFtZSA9ICJZT1VSIE5BTUUiCisgIHNldCBmcm9tID0gInVzZXJuYW1lQGdtYWlsLmNvbSIKKyAgc2V0IHVzZV9mcm9tID0geWVzCiAKIFRoZSBNdXR0IGRvY3MgaGF2ZSBsb3RzIG1vcmUgaW5mb3JtYXRpb246CisKICAgICBodHRwOi8vZGV2Lm11dHQub3JnL3RyYWMvd2lraS9Vc2VDYXNlcy9HbWFpbAorCiAgICAgaHR0cDovL2Rldi5tdXR0Lm9yZy9kb2MvbWFudWFsLmh0bWwKIAotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIFBpbmUgKFRVSSkKKyoqKioqKioqKioKIAogUGluZSBoYXMgaGFkIHNvbWUgd2hpdGVzcGFjZSB0cnVuY2F0aW9uIGlzc3VlcyBpbiB0aGUgcGFzdCwgYnV0IHRoZXNlCiBzaG91bGQgYWxsIGJlIGZpeGVkIG5vdy4KQEAgLTIyNiwxMiArMjQ3LDEzIEBACiBVc2UgYWxwaW5lIChwaW5lJ3Mgc3VjY2Vzc29yKSBpZiB5b3UgY2FuLgogCiBDb25maWcgb3B0aW9uczoKLS0gcXVlbGwtZmxvd2VkLXRleHQgaXMgbmVlZGVkIGZvciByZWNlbnQgdmVyc2lvbnMKLS0gdGhlICJuby1zdHJpcC13aGl0ZXNwYWNlLWJlZm9yZS1zZW5kIiBvcHRpb24gaXMgbmVlZGVkCisKKy0gYGBxdWVsbC1mbG93ZWQtdGV4dGBgIGlzIG5lZWRlZCBmb3IgcmVjZW50IHZlcnNpb25zCistIHRoZSBgYG5vLXN0cmlwLXdoaXRlc3BhY2UtYmVmb3JlLXNlbmRgYCBvcHRpb24gaXMgbmVlZGVkCiAKIAotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIFN5bHBoZWVkIChHVUkpCisqKioqKioqKioqKioqKgogCiAtIFdvcmtzIHdlbGwgZm9yIGlubGluaW5nIHRleHQgKG9yIHVzaW5nIGF0dGFjaG1lbnRzKS4KIC0gQWxsb3dzIHVzZSBvZiBhbiBleHRlcm5hbCBlZGl0b3IuCkBAIC0yNDEsNTAgKzI2Myw1MCBAQAogLSBBZGRpbmcgYWRkcmVzc2VzIHRvIGFkZHJlc3MgYm9vayBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlIGRpc3BsYXkgbmFtZQogICBwcm9wZXJseS4KIAotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIFRodW5kZXJiaXJkIChHVUkpCisqKioqKioqKioqKioqKioqKgogCiBUaHVuZGVyYmlyZCBpcyBhbiBPdXRsb29rIGNsb25lIHRoYXQgbGlrZXMgdG8gbWFuZ2xlIHRleHQsIGJ1dCB0aGVyZSBhcmUgd2F5cwogdG8gY29lcmNlIGl0IGludG8gYmVoYXZpbmcuCiAKIC0gQWxsb3cgdXNlIG9mIGFuIGV4dGVybmFsIGVkaXRvcjoKICAgVGhlIGVhc2llc3QgdGhpbmcgdG8gZG8gd2l0aCBUaHVuZGVyYmlyZCBhbmQgcGF0Y2hlcyBpcyB0byB1c2UgYW4KLSAgImV4dGVybmFsIGVkaXRvciIgZXh0ZW5zaW9uIGFuZCB0aGVuIGp1c3QgdXNlIHlvdXIgZmF2b3JpdGUgJEVESVRPUgorICAiZXh0ZXJuYWwgZWRpdG9yIiBleHRlbnNpb24gYW5kIHRoZW4ganVzdCB1c2UgeW91ciBmYXZvcml0ZSBgYCRFRElUT1JgYAogICBmb3IgcmVhZGluZy9tZXJnaW5nIHBhdGNoZXMgaW50byB0aGUgYm9keSB0ZXh0LiAgVG8gZG8gdGhpcywgZG93bmxvYWQKICAgYW5kIGluc3RhbGwgdGhlIGV4dGVuc2lvbiwgdGhlbiBhZGQgYSBidXR0b24gZm9yIGl0IHVzaW5nCi0gIFZpZXctPlRvb2xiYXJzLT5DdXN0b21pemUuLi4gYW5kIGZpbmFsbHkganVzdCBjbGljayBvbiBpdCB3aGVuIGluIHRoZQotICBDb21wb3NlIGRpYWxvZy4KKyAgOm1lbnVzZWxlY3Rpb246YFZpZXctLT5Ub29sYmFycy0tPkN1c3RvbWl6ZS4uLmAgYW5kIGZpbmFsbHkganVzdCBjbGljayBvbiBpdAorICB3aGVuIGluIHRoZSA6bWVudXNlbGVjdGlvbjpgQ29tcG9zZWAgZGlhbG9nLgogCiAgIFBsZWFzZSBub3RlIHRoYXQgImV4dGVybmFsIGVkaXRvciIgcmVxdWlyZXMgdGhhdCB5b3VyIGVkaXRvciBtdXN0IG5vdAogICBmb3JrLCBvciBpbiBvdGhlciB3b3JkcywgdGhlIGVkaXRvciBtdXN0IG5vdCByZXR1cm4gYmVmb3JlIGNsb3NpbmcuCiAgIFlvdSBtYXkgaGF2ZSB0byBwYXNzIGFkZGl0aW9uYWwgZmxhZ3Mgb3IgY2hhbmdlIHRoZSBzZXR0aW5ncyBvZiB5b3VyCiAgIGVkaXRvci4gTW9zdCBub3RhYmx5IGlmIHlvdSBhcmUgdXNpbmcgZ3ZpbSB0aGVuIHlvdSBtdXN0IHBhc3MgdGhlIC1mCi0gIG9wdGlvbiB0byBndmltIGJ5IHB1dHRpbmcgIi91c3IvYmluL2d2aW0gLWYiIChpZiB0aGUgYmluYXJ5IGlzIGluCi0gIC91c3IvYmluKSB0byB0aGUgdGV4dCBlZGl0b3IgZmllbGQgaW4gImV4dGVybmFsIGVkaXRvciIgc2V0dGluZ3MuIElmIHlvdQotICBhcmUgdXNpbmcgc29tZSBvdGhlciBlZGl0b3IgdGhlbiBwbGVhc2UgcmVhZCBpdHMgbWFudWFsIHRvIGZpbmQgb3V0IGhvdwotICB0byBkbyB0aGlzLgorICBvcHRpb24gdG8gZ3ZpbSBieSBwdXR0aW5nIGBgL3Vzci9iaW4vZ3ZpbSAtZmBgIChpZiB0aGUgYmluYXJ5IGlzIGluCisgIGBgL3Vzci9iaW5gYCkgdG8gdGhlIHRleHQgZWRpdG9yIGZpZWxkIGluIDptZW51c2VsZWN0aW9uOmBleHRlcm5hbCBlZGl0b3JgCisgIHNldHRpbmdzLiBJZiB5b3UgYXJlIHVzaW5nIHNvbWUgb3RoZXIgZWRpdG9yIHRoZW4gcGxlYXNlIHJlYWQgaXRzIG1hbnVhbAorICB0byBmaW5kIG91dCBob3cgdG8gZG8gdGhpcy4KIAogVG8gYmVhdCBzb21lIHNlbnNlIG91dCBvZiB0aGUgaW50ZXJuYWwgZWRpdG9yLCBkbyB0aGlzOgogCi0tIEVkaXQgeW91ciBUaHVuZGVyYmlyZCBjb25maWcgc2V0dGluZ3Mgc28gdGhhdCBpdCB3b24ndCB1c2UgZm9ybWF0PWZsb3dlZC4KLSAgR28gdG8gImVkaXQtPnByZWZlcmVuY2VzLT5hZHZhbmNlZC0+Y29uZmlnIGVkaXRvciIgdG8gYnJpbmcgdXAgdGhlCi0gIHRodW5kZXJiaXJkJ3MgcmVnaXN0cnkgZWRpdG9yLgorLSBFZGl0IHlvdXIgVGh1bmRlcmJpcmQgY29uZmlnIHNldHRpbmdzIHNvIHRoYXQgaXQgd29uJ3QgdXNlIGBgZm9ybWF0PWZsb3dlZGBgLgorICBHbyB0byA6bWVudXNlbGVjdGlvbjpgZWRpdC0tPnByZWZlcmVuY2VzLS0+YWR2YW5jZWQtLT5jb25maWcgZWRpdG9yYCB0byBicmluZyB1cAorICB0aGUgdGh1bmRlcmJpcmQncyByZWdpc3RyeSBlZGl0b3IuCiAKLS0gU2V0ICJtYWlsbmV3cy5zZW5kX3BsYWludGV4dF9mbG93ZWQiIHRvICJmYWxzZSIKKy0gU2V0IGBgbWFpbG5ld3Muc2VuZF9wbGFpbnRleHRfZmxvd2VkYGAgdG8gYGBmYWxzZWBgCiAKLS0gU2V0ICJtYWlsbmV3cy53cmFwbGVuZ3RoIiBmcm9tICI3MiIgdG8gIjAiCistIFNldCBgYG1haWxuZXdzLndyYXBsZW5ndGhgYCBmcm9tIGBgNzJgYCB0byBgYDBgYAogCi0tICJWaWV3IiA+ICJNZXNzYWdlIEJvZHkgQXMiID4gIlBsYWluIFRleHQiCistIDptZW51c2VsZWN0aW9uOmBWaWV3LS0+TWVzc2FnZSBCb2R5IEFzLS0+UGxhaW4gVGV4dGAKIAotLSAiVmlldyIgPiAiQ2hhcmFjdGVyIEVuY29kaW5nIiA+ICJVbmljb2RlIChVVEYtOCkiCistIDptZW51c2VsZWN0aW9uOmBWaWV3LS0+Q2hhcmFjdGVyIEVuY29kaW5nLS0+VW5pY29kZSAoVVRGLTgpYAogCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogVGtSYXQgKEdVSSkKKyoqKioqKioqKioqCiAKIFdvcmtzLiAgVXNlICJJbnNlcnQgZmlsZS4uLiIgb3IgZXh0ZXJuYWwgZWRpdG9yLgogCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogR21haWwgKFdlYiBHVUkpCisqKioqKioqKioqKioqKioKIAogRG9lcyBub3Qgd29yayBmb3Igc2VuZGluZyBwYXRjaGVzLgogCkBAIC0yOTUsNSArMzE3LDMgQEAKIAogQW5vdGhlciBwcm9ibGVtIGlzIHRoYXQgR21haWwgd2lsbCBiYXNlNjQtZW5jb2RlIGFueSBtZXNzYWdlIHRoYXQgaGFzIGEKIG5vbi1BU0NJSSBjaGFyYWN0ZXIuIFRoYXQgaW5jbHVkZXMgdGhpbmdzIGxpa2UgRXVyb3BlYW4gbmFtZXMuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2RheC50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2RheC50eHQKaW5kZXggMGMxNmEyMi4uMjNkMThiOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9kYXgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZGF4LnR4dApAQCAtMTIzLDkgKzEyMywxMiBAQAogbWFwcGVkIGNhY2hlcyBzdWNoIGFzIEFSTSwgTUlQUyBhbmQgU1BBUkMuCiAKIENhbGxpbmcgZ2V0X3VzZXJfcGFnZXMoKSBvbiBhIHJhbmdlIG9mIHVzZXIgbWVtb3J5IHRoYXQgaGFzIGJlZW4gbW1hcGVkCi1mcm9tIGEgREFYIGZpbGUgd2lsbCBmYWlsIGFzIHRoZXJlIGFyZSBubyAnc3RydWN0IHBhZ2UnIHRvIGRlc2NyaWJlCi10aG9zZSBwYWdlcy4gIFRoaXMgcHJvYmxlbSBpcyBiZWluZyB3b3JrZWQgb24uICBUaGF0IG1lYW5zIHRoYXQgT19ESVJFQ1QKLXJlYWRzL3dyaXRlcyB0byB0aG9zZSBtZW1vcnkgcmFuZ2VzIGZyb20gYSBub24tREFYIGZpbGUgd2lsbCBmYWlsIChub3RlCi10aGF0IE9fRElSRUNUIHJlYWRzL3dyaXRlcyBfb2YgYSBEQVggZmlsZV8gZG8gd29yaywgaXQgaXMgdGhlIG1lbW9yeQotdGhhdCBpcyBiZWluZyBhY2Nlc3NlZCB0aGF0IGlzIGtleSBoZXJlKS4gIE90aGVyIHRoaW5ncyB0aGF0IHdpbGwgbm90Ci13b3JrIGluY2x1ZGUgUkRNQSwgc2VuZGZpbGUoKSBhbmQgc3BsaWNlKCkuCitmcm9tIGEgREFYIGZpbGUgd2lsbCBmYWlsIHdoZW4gdGhlcmUgYXJlIG5vICdzdHJ1Y3QgcGFnZScgdG8gZGVzY3JpYmUKK3Rob3NlIHBhZ2VzLiAgVGhpcyBwcm9ibGVtIGhhcyBiZWVuIGFkZHJlc3NlZCBpbiBzb21lIGRldmljZSBkcml2ZXJzCitieSBhZGRpbmcgb3B0aW9uYWwgc3RydWN0IHBhZ2Ugc3VwcG9ydCBmb3IgcGFnZXMgdW5kZXIgdGhlIGNvbnRyb2wgb2YKK3RoZSBkcml2ZXIgKHNlZSBDT05GSUdfTlZESU1NX1BGTiBpbiBkcml2ZXJzL252ZGltbSBmb3IgYW4gZXhhbXBsZSBvZgoraG93IHRvIGRvIHRoaXMpLiBJbiB0aGUgbm9uIHN0cnVjdCBwYWdlIGNhc2VzIE9fRElSRUNUIHJlYWRzL3dyaXRlcyB0bwordGhvc2UgbWVtb3J5IHJhbmdlcyBmcm9tIGEgbm9uLURBWCBmaWxlIHdpbGwgZmFpbCAobm90ZSB0aGF0IE9fRElSRUNUCityZWFkcy93cml0ZXMgX29mIGEgREFYIGZpbGVfIGRvIHdvcmssIGl0IGlzIHRoZSBtZW1vcnkgdGhhdCBpcyBiZWluZworYWNjZXNzZWQgdGhhdCBpcyBrZXkgaGVyZSkuICBPdGhlciB0aGluZ3MgdGhhdCB3aWxsIG5vdCB3b3JrIGluIHRoZQorbm9uIHN0cnVjdCBwYWdlIGNhc2UgaW5jbHVkZSBSRE1BLCBzZW5kZmlsZSgpIGFuZCBzcGxpY2UoKS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZjJmcy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2YyZnMudHh0CmluZGV4IGVjZDgwODAuLjc1M2RkNGYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZjJmcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9mMmZzLnR4dApAQCAtMTMxLDYgKzEzMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSBlbnRyaWVzIGNhbiBiZSB3cml0dGVuIGludG8gaW5vZGUgYmxvY2suIFRoZQogICAgICAgICAgICAgICAgICAgICAgICBzcGFjZSBvZiBpbm9kZSBibG9jayB3aGljaCBpcyB1c2VkIHRvIHN0b3JlIGlubGluZQogICAgICAgICAgICAgICAgICAgICAgICBkZW50cmllcyBpcyBsaW1pdGVkIHRvIH4zLjRrLgorbm9pbmxpbmVfZGVudHJ5ICAgICAgICBEaWFibGUgdGhlIGlubGluZSBkZW50cnkgZmVhdHVyZS4KIGZsdXNoX21lcmdlCSAgICAgICBNZXJnZSBjb25jdXJyZW50IGNhY2hlX2ZsdXNoIGNvbW1hbmRzIGFzIG11Y2ggYXMgcG9zc2libGUKICAgICAgICAgICAgICAgICAgICAgICAgdG8gZWxpbWluYXRlIHJlZHVuZGFudCBjb21tYW5kIGlzc3Vlcy4gSWYgdGhlIHVuZGVybHlpbmcKIAkJICAgICAgIGRldmljZSBoYW5kbGVzIHRoZSBjYWNoZV9mbHVzaCBjb21tYW5kIHJlbGF0aXZlbHkgc2xvd2x5LApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9vdmVybGF5ZnMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9vdmVybGF5ZnMudHh0CmluZGV4IGQ2MjU5YzcuLmJjYmY5NzEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvb3ZlcmxheWZzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL292ZXJsYXlmcy50eHQKQEAgLTE4MywxMiArMTgzLDEwIEBACiBtb3ZlcyBpdCBvdmVyIHRvIHRoZSBvbGQgbmFtZS4gIFRoZSBuZXcgZmlsZSBtYXkgYmUgb24gYSBkaWZmZXJlbnQKIGZpbGVzeXN0ZW0sIHNvIGJvdGggc3RfZGV2IGFuZCBzdF9pbm8gb2YgdGhlIGZpbGUgbWF5IGNoYW5nZS4KIAotQW55IG9wZW4gZmlsZXMgcmVmZXJyaW5nIHRvIHRoaXMgaW5vZGUgd2lsbCBhY2Nlc3MgdGhlIG9sZCBkYXRhIGFuZAotbWV0YWRhdGEuICBTaW1pbGFybHkgYW55IGZpbGUgbG9ja3Mgb2J0YWluZWQgYmVmb3JlIGNvcHlfdXAgd2lsbCBub3QKLWFwcGx5IHRvIHRoZSBjb3BpZWQgdXAgZmlsZS4KK0FueSBvcGVuIGZpbGVzIHJlZmVycmluZyB0byB0aGlzIGlub2RlIHdpbGwgYWNjZXNzIHRoZSBvbGQgZGF0YS4KIAotT24gYSBmaWxlIG9wZW5lZCB3aXRoIE9fUkRPTkxZIGZjaG1vZCgyKSwgZmNob3duKDIpLCBmdXRpbWVzYXQoMikgYW5kCi1mc2V0eGF0dHIoMikgd2lsbCBmYWlsIHdpdGggRVJPRlMuCitBbnkgZmlsZSBsb2NrcyAoYW5kIGxlYXNlcykgb2J0YWluZWQgYmVmb3JlIGNvcHlfdXAgd2lsbCBub3QgYXBwbHkKK3RvIHRoZSBjb3BpZWQgdXAgZmlsZS4KIAogSWYgYSBmaWxlIHdpdGggbXVsdGlwbGUgaGFyZCBsaW5rcyBpcyBjb3BpZWQgdXAsIHRoZW4gdGhpcyB3aWxsCiAiYnJlYWsiIHRoZSBsaW5rLiAgQ2hhbmdlcyB3aWxsIG5vdCBiZSBwcm9wYWdhdGVkIHRvIG90aGVyIG5hbWVzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dAppbmRleCA2ODA4MGFkLi5mY2MxYWMwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKQEAgLTE0NSw3ICsxNDUsNyBAQAogCQlzeW1ib2wgdGhlIHRhc2sgaXMgYmxvY2tlZCBpbiAtIG9yICIwIiBpZiBub3QgYmxvY2tlZC4KICBwYWdlbWFwCVBhZ2UgdGFibGUKICBzdGFjawkJUmVwb3J0IGZ1bGwgc3RhY2sgdHJhY2UsIGVuYWJsZSB2aWEgQ09ORklHX1NUQUNLVFJBQ0UKLSBzbWFwcwkJYSBleHRlbnNpb24gYmFzZWQgb24gbWFwcywgc2hvd2luZyB0aGUgbWVtb3J5IGNvbnN1bXB0aW9uIG9mCisgc21hcHMJCWFuIGV4dGVuc2lvbiBiYXNlZCBvbiBtYXBzLCBzaG93aW5nIHRoZSBtZW1vcnkgY29uc3VtcHRpb24gb2YKIAkJZWFjaCBtYXBwaW5nIGFuZCBmbGFncyBhc3NvY2lhdGVkIHdpdGggaXQKICBudW1hX21hcHMJYW4gZXh0ZW5zaW9uIGJhc2VkIG9uIG1hcHMsIHNob3dpbmcgdGhlIG1lbW9yeSBsb2NhbGl0eSBhbmQKIAkJYmluZGluZyBwb2xpY3kgYXMgd2VsbCBhcyBtZW0gdXNhZ2UgKGluIHBhZ2VzKSBvZiBlYWNoIG1hcHBpbmcuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3hmcy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3hmcy50eHQKaW5kZXggODE0NmU5Zi4uYzJkNDRlNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy94ZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMveGZzLnR4dApAQCAtMzQ4LDMgKzM0OCwxMjYgQEAKICAgLS0tLQkJCQktLS0tLS0tCiAgIGZzLnhmcy54ZnNidWZkX2NlbnRpc2VjCXY0LjAKICAgZnMueGZzLmFnZV9idWZmZXJfY2VudGlzZWNzCXY0LjAKKworCitFcnJvciBoYW5kbGluZworPT09PT09PT09PT09PT0KKworWEZTIGNhbiBhY3QgZGlmZmVyZW50bHkgYWNjb3JkaW5nIHRvIHRoZSB0eXBlIG9mIGVycm9yIGZvdW5kIGR1cmluZyBpdHMKK29wZXJhdGlvbi4gVGhlIGltcGxlbWVudGF0aW9uIGludHJvZHVjZXMgdGhlIGZvbGxvd2luZyBjb25jZXB0cyB0byB0aGUgZXJyb3IKK2hhbmRsZXI6CisKKyAtZmFpbHVyZSBzcGVlZDoKKwlEZWZpbmVzIGhvdyBmYXN0IFhGUyBzaG91bGQgcHJvcGFnYXRlIGFuIGVycm9yIHVwd2FyZHMgd2hlbiBhIHNwZWNpZmljCisJZXJyb3IgaXMgZm91bmQgZHVyaW5nIHRoZSBmaWxlc3lzdGVtIG9wZXJhdGlvbi4gSXQgY2FuIHByb3BhZ2F0ZQorCWltbWVkaWF0ZWx5LCBhZnRlciBhIGRlZmluZWQgbnVtYmVyIG9mIHJldHJpZXMsIGFmdGVyIGEgc2V0IHRpbWUgcGVyaW9kLAorCW9yIHNpbXBseSByZXRyeSBmb3JldmVyLgorCisgLWVycm9yIGNsYXNzZXM6CisJU3BlY2lmaWVzIHRoZSBzdWJzeXN0ZW0gdGhlIGVycm9yIGNvbmZpZ3VyYXRpb24gd2lsbCBhcHBseSB0bywgc3VjaCBhcworCW1ldGFkYXRhIElPIG9yIG1lbW9yeSBhbGxvY2F0aW9uLiBEaWZmZXJlbnQgc3Vic3lzdGVtcyB3aWxsIGhhdmUKKwlkaWZmZXJlbnQgZXJyb3IgaGFuZGxlcnMgZm9yIHdoaWNoIGJlaGF2aW91ciBjYW4gYmUgY29uZmlndXJlZC4KKworIC1lcnJvciBoYW5kbGVyczoKKwlEZWZpbmVzIHRoZSBiZWhhdmlvciBmb3IgYSBzcGVjaWZpYyBlcnJvci4KKworVGhlIGZpbGVzeXN0ZW0gYmVoYXZpb3IgZHVyaW5nIGFuIGVycm9yIGNhbiBiZSBzZXQgdmlhIHN5c2ZzIGZpbGVzLiBFYWNoCitlcnJvciBoYW5kbGVyIHdvcmtzIGluZGVwZW5kZW50bHkgLSB0aGUgZmlyc3QgY29uZGl0aW9uIG1ldCBieSBhbiBlcnJvciBoYW5kbGVyCitmb3IgYSBzcGVjaWZpYyBjbGFzcyB3aWxsIGNhdXNlIHRoZSBlcnJvciB0byBiZSBwcm9wYWdhdGVkIHJhdGhlciB0aGFuIHJlc2V0IGFuZAorcmV0cmllZC4KKworVGhlIGFjdGlvbiB0YWtlbiBieSB0aGUgZmlsZXN5c3RlbSB3aGVuIHRoZSBlcnJvciBpcyBwcm9wYWdhdGVkIGlzIGNvbnRleHQKK2RlcGVuZGVudCAtIGl0IG1heSBjYXVzZSBhIHNodXQgZG93biBpbiB0aGUgY2FzZSBvZiBhbiB1bnJlY292ZXJhYmxlIGVycm9yLAoraXQgbWF5IGJlIHJlcG9ydGVkIGJhY2sgdG8gdXNlcnNwYWNlLCBvciBpdCBtYXkgZXZlbiBiZSBpZ25vcmVkIGJlY2F1c2UKK3RoZXJlJ3Mgbm90aGluZyB1c2VmdWwgd2UgY2FuIHdpdGggdGhlIGVycm9yIG9yIGFueW9uZSB3ZSBjYW4gcmVwb3J0IGl0IHRvIChlLmcuCitkdXJpbmcgdW5tb3VudCkuCisKK1RoZSBjb25maWd1cmF0aW9uIGZpbGVzIGFyZSBvcmdhbml6ZWQgaW50byB0aGUgZm9sbG93aW5nIGhpZXJhcmNoeSBmb3IgZWFjaAorbW91bnRlZCBmaWxlc3lzdGVtOgorCisgIC9zeXMvZnMveGZzLzxkZXY+L2Vycm9yLzxjbGFzcz4vPGVycm9yPi8KKworV2hlcmU6CisgIDxkZXY+CisJVGhlIHNob3J0IGRldmljZSBuYW1lIG9mIHRoZSBtb3VudGVkIGZpbGVzeXN0ZW0uIFRoaXMgaXMgdGhlIHNhbWUgZGV2aWNlCisJbmFtZSB0aGF0IHNob3dzIHVwIGluIFhGUyBrZXJuZWwgZXJyb3IgbWVzc2FnZXMgYXMgIlhGUyg8ZGV2Pik6IC4uLiIKKworICA8Y2xhc3M+CisJVGhlIHN1YnN5c3RlbSB0aGUgZXJyb3IgY29uZmlndXJhdGlvbiBiZWxvbmdzIHRvLiBBcyBvZiA0LjksIHRoZSBkZWZpbmVkCisJY2xhc3NlcyBhcmU6CisKKwkJLSAibWV0YWRhdGEiOiBhcHBsaWVzIG1ldGFkYXRhIGJ1ZmZlciB3cml0ZSBJTworCisgIDxlcnJvcj4KKwlUaGUgaW5kaXZpZHVhbCBlcnJvciBoYW5kbGVyIGNvbmZpZ3VyYXRpb25zLgorCisKK0VhY2ggZmlsZXN5c3RlbSBoYXMgImdsb2JhbCIgZXJyb3IgY29uZmlndXJhdGlvbiBvcHRpb25zIGRlZmluZWQgaW4gdGhlaXIgdG9wCitsZXZlbCBkaXJlY3Rvcnk6CisKKyAgL3N5cy9mcy94ZnMvPGRldj4vZXJyb3IvCisKKyAgZmFpbF9hdF91bm1vdW50CQkoTWluOiAgMCAgRGVmYXVsdDogIDEgIE1heDogMSkKKwlEZWZpbmVzIHRoZSBmaWxlc3lzdGVtIGVycm9yIGJlaGF2aW9yIGF0IHVubW91bnQgdGltZS4KKworCUlmIHNldCB0byBhIHZhbHVlIG9mIDEsIFhGUyB3aWxsIG92ZXJyaWRlIGFsbCBvdGhlciBlcnJvciBjb25maWd1cmF0aW9ucworCWR1cmluZyB1bm1vdW50IGFuZCByZXBsYWNlIHRoZW0gd2l0aCAiaW1tZWRpYXRlIGZhaWwiIGNoYXJhY3RlcmlzdGljcy4KKwlpLmUuIG5vIHJldHJpZXMsIG5vIHJldHJ5IHRpbWVvdXQuIFRoaXMgd2lsbCBhbHdheXMgYWxsb3cgdW5tb3VudCB0bworCXN1Y2NlZWQgd2hlbiB0aGVyZSBhcmUgcGVyc2lzdGVudCBlcnJvcnMgcHJlc2VudC4KKworCUlmIHNldCB0byAwLCB0aGUgY29uZmlndXJlZCByZXRyeSBiZWhhdmlvdXIgd2lsbCBjb250aW51ZSB1bnRpbCBhbGwKKwlyZXRyaWVzIGFuZC9vciB0aW1lb3V0cyBoYXZlIGJlZW4gZXhoYXVzdGVkLiBUaGlzIHdpbGwgZGVsYXkgdW5tb3VudAorCWNvbXBsZXRpb24gd2hlbiB0aGVyZSBhcmUgcGVyc2lzdGVudCBlcnJvcnMsIGFuZCBpdCBtYXkgcHJldmVudCB0aGUKKwlmaWxlc3lzdGVtIGZyb20gZXZlciB1bm1vdW50aW5nIGZ1bGx5IGluIHRoZSBjYXNlIG9mICJyZXRyeSBmb3JldmVyIgorCWhhbmRsZXIgY29uZmlndXJhdGlvbnMuCisKKwlOb3RlOiB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBmYWlsX2F0X3VubW91bnQgY2FuIGJlIHNldCB3aGlsc3QgYW4KKwl1bm1vdW50IGlzIGluIHByb2dyZXNzLiBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBzeXNmcyBlbnRyaWVzIGFyZQorCXJlbW92ZWQgYnkgdGhlIHVubW91bnRpbmcgZmlsZXN5c3RlbSBiZWZvcmUgYSAicmV0cnkgZm9yZXZlciIgZXJyb3IKKwloYW5kbGVyIGNvbmZpZ3VyYXRpb24gY2F1c2VzIHVubW91bnQgdG8gaGFuZywgYW5kIGhlbmNlIHRoZSBmaWxlc3lzdGVtCisJbXVzdCBiZSBjb25maWd1cmVkIGFwcHJvcHJpYXRlbHkgYmVmb3JlIHVubW91bnQgYmVnaW5zIHRvIHByZXZlbnQKKwl1bm1vdW50IGhhbmdzLgorCitFYWNoIGZpbGVzeXN0ZW0gaGFzIHNwZWNpZmljIGVycm9yIGNsYXNzIGhhbmRsZXJzIHRoYXQgZGVmaW5lIHRoZSBlcnJvcgorcHJvcGFnYXRpb24gYmVoYXZpb3VyIGZvciBzcGVjaWZpYyBlcnJvcnMuIFRoZXJlIGlzIGFsc28gYSAiZGVmYXVsdCIgZXJyb3IKK2hhbmRsZXIgZGVmaW5lZCwgd2hpY2ggZGVmaW5lcyB0aGUgYmVoYXZpb3VyIGZvciBhbGwgZXJyb3JzIHRoYXQgZG9uJ3QgaGF2ZQorc3BlY2lmaWMgaGFuZGxlcnMgZGVmaW5lZC4gV2hlcmUgbXVsdGlwbGUgcmV0cnkgY29uc3RyYWludHMgYXJlIGNvbmZpZ3VyZWRpIGZvcgorYSBzaW5nbGUgZXJyb3IsIHRoZSBmaXJzdCByZXRyeSBjb25maWd1cmF0aW9uIHRoYXQgZXhwaXJlcyB3aWxsIGNhdXNlIHRoZSBlcnJvcgordG8gYmUgcHJvcGFnYXRlZC4gVGhlIGhhbmRsZXIgY29uZmlndXJhdGlvbnMgYXJlIGZvdW5kIGluIHRoZSBkaXJlY3Rvcnk6CisKKyAgL3N5cy9mcy94ZnMvPGRldj4vZXJyb3IvPGNsYXNzPi88ZXJyb3I+LworCisgIG1heF9yZXRyaWVzCQkJKE1pbjogLTEgIERlZmF1bHQ6IFZhcmllcyAgTWF4OiBJTlRNQVgpCisJRGVmaW5lcyB0aGUgYWxsb3dlZCBudW1iZXIgb2YgcmV0cmllcyBvZiBhIHNwZWNpZmljIGVycm9yIGJlZm9yZQorCXRoZSBmaWxlc3lzdGVtIHdpbGwgcHJvcGFnYXRlIHRoZSBlcnJvci4gVGhlIHJldHJ5IGNvdW50IGZvciBhIGdpdmVuCisJZXJyb3IgY29udGV4dCAoZS5nLiBhIHNwZWNpZmljIG1ldGFkYXRhIGJ1ZmZlcikgaXMgcmVzZXQgZXZlcnkgdGltZQorCXRoZXJlIGlzIGEgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIHRoZSBvcGVyYXRpb24uCisKKwlTZXR0aW5nIHRoZSB2YWx1ZSB0byAiLTEiIHdpbGwgY2F1c2UgWEZTIHRvIHJldHJ5IGZvcmV2ZXIgZm9yIHRoaXMKKwlzcGVjaWZpYyBlcnJvci4KKworCVNldHRpbmcgdGhlIHZhbHVlIHRvICIwIiB3aWxsIGNhdXNlIFhGUyB0byBmYWlsIGltbWVkaWF0ZWx5IHdoZW4gdGhlCisJc3BlY2lmaWMgZXJyb3IgaXMgcmVwb3J0ZWQuCisKKwlTZXR0aW5nIHRoZSB2YWx1ZSB0byAiTiIgKHdoZXJlIDAgPCBOIDwgTWF4KSB3aWxsIG1ha2UgWEZTIHJldHJ5IHRoZQorCW9wZXJhdGlvbiAiTiIgdGltZXMgYmVmb3JlIHByb3BhZ2F0aW5nIHRoZSBlcnJvci4KKworICByZXRyeV90aW1lb3V0X3NlY29uZHMJCShNaW46ICAtMSAgRGVmYXVsdDogIFZhcmllcyAgTWF4OiAxIGRheSkKKwlEZWZpbmUgdGhlIGFtb3VudCBvZiB0aW1lIChpbiBzZWNvbmRzKSB0aGF0IHRoZSBmaWxlc3lzdGVtIGlzCisJYWxsb3dlZCB0byByZXRyeSBpdHMgb3BlcmF0aW9ucyB3aGVuIHRoZSBzcGVjaWZpYyBlcnJvciBpcworCWZvdW5kLgorCisJU2V0dGluZyB0aGUgdmFsdWUgdG8gIi0xIiB3aWxsIGFsbG93IFhGUyB0byByZXRyeSBmb3JldmVyIGZvciB0aGlzCisJc3BlY2lmaWMgZXJyb3IuCisKKwlTZXR0aW5nIHRoZSB2YWx1ZSB0byAiMCIgd2lsbCBjYXVzZSBYRlMgdG8gZmFpbCBpbW1lZGlhdGVseSB3aGVuIHRoZQorCXNwZWNpZmljIGVycm9yIGlzIHJlcG9ydGVkLgorCisJU2V0dGluZyB0aGUgdmFsdWUgdG8gIk4iICh3aGVyZSAwIDwgTiA8IE1heCkgd2lsbCBhbGxvdyBYRlMgdG8gcmV0cnkgdGhlCisJb3BlcmF0aW9uIGZvciB1cCB0byAiTiIgc2Vjb25kcyBiZWZvcmUgcHJvcGFnYXRpbmcgdGhlIGVycm9yLgorCitOb3RlOiBUaGUgZGVmYXVsdCBiZWhhdmlvdXIgZm9yIGEgc3BlY2lmaWMgZXJyb3IgaGFuZGxlciBpcyBkZXBlbmRlbnQgb24gYm90aAordGhlIGNsYXNzIGFuZCBlcnJvciBjb250ZXh0LiBGb3IgZXhhbXBsZSwgdGhlIGRlZmF1bHQgdmFsdWVzIGZvcgorIm1ldGFkYXRhL0VOT0RFViIgYXJlICIwIiByYXRoZXIgdGhhbiAiLTEiIHNvIHRoYXQgdGhpcyBlcnJvciBoYW5kbGVyIGRlZmF1bHRzCit0byAiZmFpbCBpbW1lZGlhdGVseSIgYmVoYXZpb3VyLiBUaGlzIGlzIGRvbmUgYmVjYXVzZSBFTk9ERVYgaXMgYSBmYXRhbCwKK3VucmVjb3ZlcmFibGUgZXJyb3Igbm8gbWF0dGVyIGhvdyBtYW55IHRpbWVzIHRoZSBtZXRhZGF0YSBJTyBpcyByZXRyaWVkLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9nY292LnR4dCBiL0RvY3VtZW50YXRpb24vZ2Nvdi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNzI3NzguLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9nY292LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi1Vc2luZyBnY292IHdpdGggdGhlIExpbnV4IGtlcm5lbAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotMS4gSW50cm9kdWN0aW9uCi0yLiBQcmVwYXJhdGlvbgotMy4gQ3VzdG9taXphdGlvbgotNC4gRmlsZXMKLTUuIE1vZHVsZXMKLTYuIFNlcGFyYXRlZCBidWlsZCBhbmQgdGVzdCBtYWNoaW5lcwotNy4gVHJvdWJsZXNob290aW5nCi1BcHBlbmRpeCBBOiBzYW1wbGUgc2NyaXB0OiBnYXRoZXJfb25fYnVpbGQuc2gKLUFwcGVuZGl4IEI6IHNhbXBsZSBzY3JpcHQ6IGdhdGhlcl9vbl90ZXN0LnNoCi0KLQotMS4gSW50cm9kdWN0aW9uCi09PT09PT09PT09PT09PT0KLQotZ2NvdiBwcm9maWxpbmcga2VybmVsIHN1cHBvcnQgZW5hYmxlcyB0aGUgdXNlIG9mIEdDQydzIGNvdmVyYWdlIHRlc3RpbmcKLXRvb2wgZ2NvdiBbMV0gd2l0aCB0aGUgTGludXgga2VybmVsLiBDb3ZlcmFnZSBkYXRhIG9mIGEgcnVubmluZyBrZXJuZWwKLWlzIGV4cG9ydGVkIGluIGdjb3YtY29tcGF0aWJsZSBmb3JtYXQgdmlhIHRoZSAiZ2NvdiIgZGVidWdmcyBkaXJlY3RvcnkuCi1UbyBnZXQgY292ZXJhZ2UgZGF0YSBmb3IgYSBzcGVjaWZpYyBmaWxlLCBjaGFuZ2UgdG8gdGhlIGtlcm5lbCBidWlsZAotZGlyZWN0b3J5IGFuZCB1c2UgZ2NvdiB3aXRoIHRoZSAtbyBvcHRpb24gYXMgZm9sbG93cyAocmVxdWlyZXMgcm9vdCk6Ci0KLSMgY2QgL3RtcC9saW51eC1vdXQKLSMgZ2NvdiAtbyAvc3lzL2tlcm5lbC9kZWJ1Zy9nY292L3RtcC9saW51eC1vdXQva2VybmVsIHNwaW5sb2NrLmMKLQotVGhpcyB3aWxsIGNyZWF0ZSBzb3VyY2UgY29kZSBmaWxlcyBhbm5vdGF0ZWQgd2l0aCBleGVjdXRpb24gY291bnRzCi1pbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuIEluIGFkZGl0aW9uLCBncmFwaGljYWwgZ2NvdiBmcm9udC1lbmRzIHN1Y2gKLWFzIGxjb3YgWzJdIGNhbiBiZSB1c2VkIHRvIGF1dG9tYXRlIHRoZSBwcm9jZXNzIG9mIGNvbGxlY3RpbmcgZGF0YQotZm9yIHRoZSBlbnRpcmUga2VybmVsIGFuZCBwcm92aWRlIGNvdmVyYWdlIG92ZXJ2aWV3cyBpbiBIVE1MIGZvcm1hdC4KLQotUG9zc2libGUgdXNlczoKLQotKiBkZWJ1Z2dpbmcgKGhhcyB0aGlzIGxpbmUgYmVlbiByZWFjaGVkIGF0IGFsbD8pCi0qIHRlc3QgaW1wcm92ZW1lbnQgKGhvdyBkbyBJIGNoYW5nZSBteSB0ZXN0IHRvIGNvdmVyIHRoZXNlIGxpbmVzPykKLSogbWluaW1pemluZyBrZXJuZWwgY29uZmlndXJhdGlvbnMgKGRvIEkgbmVlZCB0aGlzIG9wdGlvbiBpZiB0aGUKLSAgYXNzb2NpYXRlZCBjb2RlIGlzIG5ldmVyIHJ1bj8pCi0KLS0tCi0KLVsxXSBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9nY2MvR2Nvdi5odG1sCi1bMl0gaHR0cDovL2x0cC5zb3VyY2Vmb3JnZS5uZXQvY292ZXJhZ2UvbGNvdi5waHAKLQotCi0yLiBQcmVwYXJhdGlvbgotPT09PT09PT09PT09PT0KLQotQ29uZmlndXJlIHRoZSBrZXJuZWwgd2l0aDoKLQotICAgICAgICBDT05GSUdfREVCVUdfRlM9eQotICAgICAgICBDT05GSUdfR0NPVl9LRVJORUw9eQotCi1zZWxlY3QgdGhlIGdjYydzIGdjb3YgZm9ybWF0LCBkZWZhdWx0IGlzIGF1dG9kZXRlY3QgYmFzZWQgb24gZ2NjIHZlcnNpb246Ci0KLSAgICAgICAgQ09ORklHX0dDT1ZfRk9STUFUX0FVVE9ERVRFQ1Q9eQotCi1hbmQgdG8gZ2V0IGNvdmVyYWdlIGRhdGEgZm9yIHRoZSBlbnRpcmUga2VybmVsOgotCi0gICAgICAgIENPTkZJR19HQ09WX1BST0ZJTEVfQUxMPXkKLQotTm90ZSB0aGF0IGtlcm5lbHMgY29tcGlsZWQgd2l0aCBwcm9maWxpbmcgZmxhZ3Mgd2lsbCBiZSBzaWduaWZpY2FudGx5Ci1sYXJnZXIgYW5kIHJ1biBzbG93ZXIuIEFsc28gQ09ORklHX0dDT1ZfUFJPRklMRV9BTEwgbWF5IG5vdCBiZSBzdXBwb3J0ZWQKLW9uIGFsbCBhcmNoaXRlY3R1cmVzLgotCi1Qcm9maWxpbmcgZGF0YSB3aWxsIG9ubHkgYmVjb21lIGFjY2Vzc2libGUgb25jZSBkZWJ1Z2ZzIGhhcyBiZWVuCi1tb3VudGVkOgotCi0gICAgICAgIG1vdW50IC10IGRlYnVnZnMgbm9uZSAvc3lzL2tlcm5lbC9kZWJ1ZwotCi0KLTMuIEN1c3RvbWl6YXRpb24KLT09PT09PT09PT09PT09PT0KLQotVG8gZW5hYmxlIHByb2ZpbGluZyBmb3Igc3BlY2lmaWMgZmlsZXMgb3IgZGlyZWN0b3JpZXMsIGFkZCBhIGxpbmUKLXNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZyB0byB0aGUgcmVzcGVjdGl2ZSBrZXJuZWwgTWFrZWZpbGU6Ci0KLSAgICAgICAgRm9yIGEgc2luZ2xlIGZpbGUgKGUuZy4gbWFpbi5vKToKLSAgICAgICAgICAgICAgICBHQ09WX1BST0ZJTEVfbWFpbi5vIDo9IHkKLQotICAgICAgICBGb3IgYWxsIGZpbGVzIGluIG9uZSBkaXJlY3Rvcnk6Ci0gICAgICAgICAgICAgICAgR0NPVl9QUk9GSUxFIDo9IHkKLQotVG8gZXhjbHVkZSBmaWxlcyBmcm9tIGJlaW5nIHByb2ZpbGVkIGV2ZW4gd2hlbiBDT05GSUdfR0NPVl9QUk9GSUxFX0FMTAotaXMgc3BlY2lmaWVkLCB1c2U6Ci0KLSAgICAgICAgICAgICAgICBHQ09WX1BST0ZJTEVfbWFpbi5vIDo9IG4KLSAgICAgICAgYW5kOgotICAgICAgICAgICAgICAgIEdDT1ZfUFJPRklMRSA6PSBuCi0KLU9ubHkgZmlsZXMgd2hpY2ggYXJlIGxpbmtlZCB0byB0aGUgbWFpbiBrZXJuZWwgaW1hZ2Ugb3IgYXJlIGNvbXBpbGVkIGFzCi1rZXJuZWwgbW9kdWxlcyBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgbWVjaGFuaXNtLgotCi0KLTQuIEZpbGVzCi09PT09PT09PQotCi1UaGUgZ2NvdiBrZXJuZWwgc3VwcG9ydCBjcmVhdGVzIHRoZSBmb2xsb3dpbmcgZmlsZXMgaW4gZGVidWdmczoKLQotICAgICAgICAvc3lzL2tlcm5lbC9kZWJ1Zy9nY292Ci0gICAgICAgICAgICAgICAgUGFyZW50IGRpcmVjdG9yeSBmb3IgYWxsIGdjb3YtcmVsYXRlZCBmaWxlcy4KLQotICAgICAgICAvc3lzL2tlcm5lbC9kZWJ1Zy9nY292L3Jlc2V0Ci0gICAgICAgICAgICAgICAgR2xvYmFsIHJlc2V0IGZpbGU6IHJlc2V0cyBhbGwgY292ZXJhZ2UgZGF0YSB0byB6ZXJvIHdoZW4KLSAgICAgICAgICAgICAgICB3cml0dGVuIHRvLgotCi0gICAgICAgIC9zeXMva2VybmVsL2RlYnVnL2djb3YvcGF0aC90by9jb21waWxlL2Rpci9maWxlLmdjZGEKLSAgICAgICAgICAgICAgICBUaGUgYWN0dWFsIGdjb3YgZGF0YSBmaWxlIGFzIHVuZGVyc3Rvb2QgYnkgdGhlIGdjb3YKLSAgICAgICAgICAgICAgICB0b29sLiBSZXNldHMgZmlsZSBjb3ZlcmFnZSBkYXRhIHRvIHplcm8gd2hlbiB3cml0dGVuIHRvLgotCi0gICAgICAgIC9zeXMva2VybmVsL2RlYnVnL2djb3YvcGF0aC90by9jb21waWxlL2Rpci9maWxlLmdjbm8KLSAgICAgICAgICAgICAgICBTeW1ib2xpYyBsaW5rIHRvIGEgc3RhdGljIGRhdGEgZmlsZSByZXF1aXJlZCBieSB0aGUgZ2NvdgotICAgICAgICAgICAgICAgIHRvb2wuIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgZ2NjIHdoZW4gY29tcGlsaW5nIHdpdGgKLSAgICAgICAgICAgICAgICBvcHRpb24gLWZ0ZXN0LWNvdmVyYWdlLgotCi0KLTUuIE1vZHVsZXMKLT09PT09PT09PT0KLQotS2VybmVsIG1vZHVsZXMgbWF5IGNvbnRhaW4gY2xlYW51cCBjb2RlIHdoaWNoIGlzIG9ubHkgcnVuIGR1cmluZwotbW9kdWxlIHVubG9hZCB0aW1lLiBUaGUgZ2NvdiBtZWNoYW5pc20gcHJvdmlkZXMgYSBtZWFucyB0byBjb2xsZWN0Ci1jb3ZlcmFnZSBkYXRhIGZvciBzdWNoIGNvZGUgYnkga2VlcGluZyBhIGNvcHkgb2YgdGhlIGRhdGEgYXNzb2NpYXRlZAotd2l0aCB0aGUgdW5sb2FkZWQgbW9kdWxlLiBUaGlzIGRhdGEgcmVtYWlucyBhdmFpbGFibGUgdGhyb3VnaCBkZWJ1Z2ZzLgotT25jZSB0aGUgbW9kdWxlIGlzIGxvYWRlZCBhZ2FpbiwgdGhlIGFzc29jaWF0ZWQgY292ZXJhZ2UgY291bnRlcnMgYXJlCi1pbml0aWFsaXplZCB3aXRoIHRoZSBkYXRhIGZyb20gaXRzIHByZXZpb3VzIGluc3RhbnRpYXRpb24uCi0KLVRoaXMgYmVoYXZpb3IgY2FuIGJlIGRlYWN0aXZhdGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGdjb3ZfcGVyc2lzdCBrZXJuZWwKLXBhcmFtZXRlcjoKLQotICAgICAgICBnY292X3BlcnNpc3Q9MAotCi1BdCBydW4tdGltZSwgYSB1c2VyIGNhbiBhbHNvIGNob29zZSB0byBkaXNjYXJkIGRhdGEgZm9yIGFuIHVubG9hZGVkCi1tb2R1bGUgYnkgd3JpdGluZyB0byBpdHMgZGF0YSBmaWxlIG9yIHRoZSBnbG9iYWwgcmVzZXQgZmlsZS4KLQotCi02LiBTZXBhcmF0ZWQgYnVpbGQgYW5kIHRlc3QgbWFjaGluZXMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGUgZ2NvdiBrZXJuZWwgcHJvZmlsaW5nIGluZnJhc3RydWN0dXJlIGlzIGRlc2lnbmVkIHRvIHdvcmsgb3V0LW9mLXRoZQotYm94IGZvciBzZXR1cHMgd2hlcmUga2VybmVscyBhcmUgYnVpbHQgYW5kIHJ1biBvbiB0aGUgc2FtZSBtYWNoaW5lLiBJbgotY2FzZXMgd2hlcmUgdGhlIGtlcm5lbCBydW5zIG9uIGEgc2VwYXJhdGUgbWFjaGluZSwgc3BlY2lhbCBwcmVwYXJhdGlvbnMKLW11c3QgYmUgbWFkZSwgZGVwZW5kaW5nIG9uIHdoZXJlIHRoZSBnY292IHRvb2wgaXMgdXNlZDoKLQotYSkgZ2NvdiBpcyBydW4gb24gdGhlIFRFU1QgbWFjaGluZQotCi1UaGUgZ2NvdiB0b29sIHZlcnNpb24gb24gdGhlIHRlc3QgbWFjaGluZSBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUKLWdjYyB2ZXJzaW9uIHVzZWQgZm9yIGtlcm5lbCBidWlsZC4gQWxzbyB0aGUgZm9sbG93aW5nIGZpbGVzIG5lZWQgdG8gYmUKLWNvcGllZCBmcm9tIGJ1aWxkIHRvIHRlc3QgbWFjaGluZToKLQotZnJvbSB0aGUgc291cmNlIHRyZWU6Ci0gIC0gYWxsIEMgc291cmNlIGZpbGVzICsgaGVhZGVycwotCi1mcm9tIHRoZSBidWlsZCB0cmVlOgotICAtIGFsbCBDIHNvdXJjZSBmaWxlcyArIGhlYWRlcnMKLSAgLSBhbGwgLmdjZGEgYW5kIC5nY25vIGZpbGVzCi0gIC0gYWxsIGxpbmtzIHRvIGRpcmVjdG9yaWVzCi0KLUl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlc2UgZmlsZXMgbmVlZCB0byBiZSBwbGFjZWQgaW50byB0aGUKLWV4YWN0IHNhbWUgZmlsZSBzeXN0ZW0gbG9jYXRpb24gb24gdGhlIHRlc3QgbWFjaGluZSBhcyBvbiB0aGUgYnVpbGQKLW1hY2hpbmUuIElmIGFueSBvZiB0aGUgcGF0aCBjb21wb25lbnRzIGlzIHN5bWJvbGljIGxpbmssIHRoZSBhY3R1YWwKLWRpcmVjdG9yeSBuZWVkcyB0byBiZSB1c2VkIGluc3RlYWQgKGR1ZSB0byBtYWtlJ3MgQ1VSRElSIGhhbmRsaW5nKS4KLQotYikgZ2NvdiBpcyBydW4gb24gdGhlIEJVSUxEIG1hY2hpbmUKLQotVGhlIGZvbGxvd2luZyBmaWxlcyBuZWVkIHRvIGJlIGNvcGllZCBhZnRlciBlYWNoIHRlc3QgY2FzZSBmcm9tIHRlc3QKLXRvIGJ1aWxkIG1hY2hpbmU6Ci0KLWZyb20gdGhlIGdjb3YgZGlyZWN0b3J5IGluIHN5c2ZzOgotICAtIGFsbCAuZ2NkYSBmaWxlcwotICAtIGFsbCBsaW5rcyB0byAuZ2NubyBmaWxlcwotCi1UaGVzZSBmaWxlcyBjYW4gYmUgY29waWVkIHRvIGFueSBsb2NhdGlvbiBvbiB0aGUgYnVpbGQgbWFjaGluZS4gZ2NvdgotbXVzdCB0aGVuIGJlIGNhbGxlZCB3aXRoIHRoZSAtbyBvcHRpb24gcG9pbnRpbmcgdG8gdGhhdCBkaXJlY3RvcnkuCi0KLUV4YW1wbGUgZGlyZWN0b3J5IHNldHVwIG9uIHRoZSBidWlsZCBtYWNoaW5lOgotCi0gIC90bXAvbGludXg6ICAgIGtlcm5lbCBzb3VyY2UgdHJlZQotICAvdG1wL291dDogICAgICBrZXJuZWwgYnVpbGQgZGlyZWN0b3J5IGFzIHNwZWNpZmllZCBieSBtYWtlIE89Ci0gIC90bXAvY292ZXJhZ2U6IGxvY2F0aW9uIG9mIHRoZSBmaWxlcyBjb3BpZWQgZnJvbSB0aGUgdGVzdCBtYWNoaW5lCi0KLSAgW3VzZXJAYnVpbGRdIGNkIC90bXAvb3V0Ci0gIFt1c2VyQGJ1aWxkXSBnY292IC1vIC90bXAvY292ZXJhZ2UvdG1wL291dC9pbml0IG1haW4uYwotCi0KLTcuIFRyb3VibGVzaG9vdGluZwotPT09PT09PT09PT09PT09PT09Ci0KLVByb2JsZW06ICBDb21waWxhdGlvbiBhYm9ydHMgZHVyaW5nIGxpbmtlciBzdGVwLgotQ2F1c2U6ICAgIFByb2ZpbGluZyBmbGFncyBhcmUgc3BlY2lmaWVkIGZvciBzb3VyY2UgZmlsZXMgd2hpY2ggYXJlIG5vdAotICAgICAgICAgIGxpbmtlZCB0byB0aGUgbWFpbiBrZXJuZWwgb3Igd2hpY2ggYXJlIGxpbmtlZCBieSBhIGN1c3RvbQotICAgICAgICAgIGxpbmtlciBwcm9jZWR1cmUuCi1Tb2x1dGlvbjogRXhjbHVkZSBhZmZlY3RlZCBzb3VyY2UgZmlsZXMgZnJvbSBwcm9maWxpbmcgYnkgc3BlY2lmeWluZwotICAgICAgICAgIEdDT1ZfUFJPRklMRSA6PSBuIG9yIEdDT1ZfUFJPRklMRV9iYXNlbmFtZS5vIDo9IG4gaW4gdGhlCi0gICAgICAgICAgY29ycmVzcG9uZGluZyBNYWtlZmlsZS4KLQotUHJvYmxlbTogIEZpbGVzIGNvcGllZCBmcm9tIHN5c2ZzIGFwcGVhciBlbXB0eSBvciBpbmNvbXBsZXRlLgotQ2F1c2U6ICAgIER1ZSB0byB0aGUgd2F5IHNlcV9maWxlIHdvcmtzLCBzb21lIHRvb2xzIHN1Y2ggYXMgY3Agb3IgdGFyCi0gICAgICAgICAgbWF5IG5vdCBjb3JyZWN0bHkgY29weSBmaWxlcyBmcm9tIHN5c2ZzLgotU29sdXRpb246IFVzZSAnY2F0JyB0byByZWFkIC5nY2RhIGZpbGVzIGFuZCAnY3AgLWQnIHRvIGNvcHkgbGlua3MuCi0gICAgICAgICAgQWx0ZXJuYXRpdmVseSB1c2UgdGhlIG1lY2hhbmlzbSBzaG93biBpbiBBcHBlbmRpeCBCLgotCi0KLUFwcGVuZGl4IEE6IGdhdGhlcl9vbl9idWlsZC5zaAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVNhbXBsZSBzY3JpcHQgdG8gZ2F0aGVyIGNvdmVyYWdlIG1ldGEgZmlsZXMgb24gdGhlIGJ1aWxkIG1hY2hpbmUKLShzZWUgNmEpOgotIyEvYmluL2Jhc2gKLQotS1NSQz0kMQotS09CSj0kMgotREVTVD0kMwotCi1pZiBbIC16ICIkS1NSQyIgXSB8fCBbIC16ICIkS09CSiIgXSB8fCBbIC16ICIkREVTVCIgXTsgdGhlbgotICBlY2hvICJVc2FnZTogJDAgPGtzcmMgZGlyZWN0b3J5PiA8a29iaiBkaXJlY3Rvcnk+IDxvdXRwdXQudGFyLmd6PiIgPiYyCi0gIGV4aXQgMQotZmkKLQotS1NSQz0kKGNkICRLU1JDOyBwcmludGYgImFsbDpcblx0QGVjaG8gXCR7Q1VSRElSfVxuIiB8IG1ha2UgLWYgLSkKLUtPQko9JChjZCAkS09CSjsgcHJpbnRmICJhbGw6XG5cdEBlY2hvIFwke0NVUkRJUn1cbiIgfCBtYWtlIC1mIC0pCi0KLWZpbmQgJEtTUkMgJEtPQkogXCggLW5hbWUgJyouZ2NubycgLW8gLW5hbWUgJyouW2NoXScgLW8gLXR5cGUgbCBcKSAtYSBcCi0gICAgICAgICAgICAgICAgIC1wZXJtIC91K3IsZytyIHwgdGFyIGNmeiAkREVTVCAtUCAtVCAtCi0KLWlmIFsgJD8gLWVxIDAgXSA7IHRoZW4KLSAgZWNobyAiJERFU1Qgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQsIGNvcHkgdG8gdGVzdCBzeXN0ZW0gYW5kIHVucGFjayB3aXRoOiIKLSAgZWNobyAiICB0YXIgeGZ6ICRERVNUIC1QIgotZWxzZQotICBlY2hvICJDb3VsZCBub3QgY3JlYXRlIGZpbGUgJERFU1QiCi1maQotCi0KLUFwcGVuZGl4IEI6IGdhdGhlcl9vbl90ZXN0LnNoCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1TYW1wbGUgc2NyaXB0IHRvIGdhdGhlciBjb3ZlcmFnZSBkYXRhIGZpbGVzIG9uIHRoZSB0ZXN0IG1hY2hpbmUKLShzZWUgNmIpOgotCi0jIS9iaW4vYmFzaCAtZQotCi1ERVNUPSQxCi1HQ0RBPS9zeXMva2VybmVsL2RlYnVnL2djb3YKLQotaWYgWyAteiAiJERFU1QiIF0gOyB0aGVuCi0gIGVjaG8gIlVzYWdlOiAkMCA8b3V0cHV0LnRhci5nej4iID4mMgotICBleGl0IDEKLWZpCi0KLVRFTVBESVI9JChta3RlbXAgLWQpCi1lY2hvIENvbGxlY3RpbmcgZGF0YS4uCi1maW5kICRHQ0RBIC10eXBlIGQgLWV4ZWMgbWtkaXIgLXAgJFRFTVBESVIvXHtcfSBcOwotZmluZCAkR0NEQSAtbmFtZSAnKi5nY2RhJyAtZXhlYyBzaCAtYyAnY2F0IDwgJDAgPiAnJFRFTVBESVInLyQwJyB7fSBcOwotZmluZCAkR0NEQSAtbmFtZSAnKi5nY25vJyAtZXhlYyBzaCAtYyAnY3AgLWQgJDAgJyRURU1QRElSJy8kMCcge30gXDsKLXRhciBjemYgJERFU1QgLUMgJFRFTVBESVIgc3lzCi1ybSAtcmYgJFRFTVBESVIKLQotZWNobyAiJERFU1Qgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQsIGNvcHkgdG8gYnVpbGQgc3lzdGVtIGFuZCB1bnBhY2sgd2l0aDoiCi1lY2hvICIgIHRhciB4ZnogJERFU1QiCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dkYi1rZXJuZWwtZGVidWdnaW5nLnR4dCBiL0RvY3VtZW50YXRpb24vZ2RiLWtlcm5lbC1kZWJ1Z2dpbmcudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDUwY2U4Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZ2RiLWtlcm5lbC1kZWJ1Z2dpbmcudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLURlYnVnZ2luZyBrZXJuZWwgYW5kIG1vZHVsZXMgdmlhIGdkYgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoZSBrZXJuZWwgZGVidWdnZXIga2dkYiwgaHlwZXJ2aXNvcnMgbGlrZSBRRU1VIG9yIEpUQUctYmFzZWQgaGFyZHdhcmUKLWludGVyZmFjZXMgYWxsb3cgdG8gZGVidWcgdGhlIExpbnV4IGtlcm5lbCBhbmQgaXRzIG1vZHVsZXMgZHVyaW5nIHJ1bnRpbWUKLXVzaW5nIGdkYi4gR2RiIGNvbWVzIHdpdGggYSBwb3dlcmZ1bCBzY3JpcHRpbmcgaW50ZXJmYWNlIGZvciBweXRob24uIFRoZQota2VybmVsIHByb3ZpZGVzIGEgY29sbGVjdGlvbiBvZiBoZWxwZXIgc2NyaXB0cyB0aGF0IGNhbiBzaW1wbGlmeSB0eXBpY2FsCi1rZXJuZWwgZGVidWdnaW5nIHN0ZXBzLiBUaGlzIGlzIGEgc2hvcnQgdHV0b3JpYWwgYWJvdXQgaG93IHRvIGVuYWJsZSBhbmQgdXNlCi10aGVtLiBJdCBmb2N1c2VzIG9uIFFFTVUvS1ZNIHZpcnR1YWwgbWFjaGluZXMgYXMgdGFyZ2V0LCBidXQgdGhlIGV4YW1wbGVzIGNhbgotYmUgdHJhbnNmZXJyZWQgdG8gdGhlIG90aGVyIGdkYiBzdHVicyBhcyB3ZWxsLgotCi0KLVJlcXVpcmVtZW50cwotLS0tLS0tLS0tLS0tCi0KLSBvIGdkYiA3LjIrIChyZWNvbW1lbmRlZDogNy40Kykgd2l0aCBweXRob24gc3VwcG9ydCBlbmFibGVkICh0eXBpY2FsbHkgdHJ1ZQotICAgZm9yIGRpc3RyaWJ1dGlvbnMpCi0KLQotU2V0dXAKLS0tLS0tCi0KLSBvIENyZWF0ZSBhIHZpcnR1YWwgTGludXggbWFjaGluZSBmb3IgUUVNVS9LVk0gKHNlZSB3d3cubGludXgta3ZtLm9yZyBhbmQKLSAgIHd3dy5xZW11Lm9yZyBmb3IgbW9yZSBkZXRhaWxzKS4gRm9yIGNyb3NzLWRldmVsb3BtZW50LAotICAgaHR0cDovL2xhbmRsZXkubmV0L2Fib3JpZ2luYWwvYmluIGtlZXBzIGEgcG9vbCBvZiBtYWNoaW5lIGltYWdlcyBhbmQKLSAgIHRvb2xjaGFpbnMgdGhhdCBjYW4gYmUgaGVscGZ1bCB0byBzdGFydCBmcm9tLgotCi0gbyBCdWlsZCB0aGUga2VybmVsIHdpdGggQ09ORklHX0dEQl9TQ1JJUFRTIGVuYWJsZWQsIGJ1dCBsZWF2ZQotICAgQ09ORklHX0RFQlVHX0lORk9fUkVEVUNFRCBvZmYuIElmIHlvdXIgYXJjaGl0ZWN0dXJlIHN1cHBvcnRzCi0gICBDT05GSUdfRlJBTUVfUE9JTlRFUiwga2VlcCBpdCBlbmFibGVkLgotCi0gbyBJbnN0YWxsIHRoYXQga2VybmVsIG9uIHRoZSBndWVzdC4KLQotICAgQWx0ZXJuYXRpdmVseSwgUUVNVSBhbGxvd3MgdG8gYm9vdCB0aGUga2VybmVsIGRpcmVjdGx5IHVzaW5nIC1rZXJuZWwsCi0gICAtYXBwZW5kLCAtaW5pdHJkIGNvbW1hbmQgbGluZSBzd2l0Y2hlcy4gVGhpcyBpcyBnZW5lcmFsbHkgb25seSB1c2VmdWwgaWYKLSAgIHlvdSBkbyBub3QgZGVwZW5kIG9uIG1vZHVsZXMuIFNlZSBRRU1VIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscyBvbgotICAgdGhpcyBtb2RlLgotCi0gbyBFbmFibGUgdGhlIGdkYiBzdHViIG9mIFFFTVUvS1ZNLCBlaXRoZXIKLSAgICAtIGF0IFZNIHN0YXJ0dXAgdGltZSBieSBhcHBlbmRpbmcgIi1zIiB0byB0aGUgUUVNVSBjb21tYW5kIGxpbmUKLSAgIG9yCi0gICAgLSBkdXJpbmcgcnVudGltZSBieSBpc3N1aW5nICJnZGJzZXJ2ZXIiIGZyb20gdGhlIFFFTVUgbW9uaXRvcgotICAgICAgY29uc29sZQotCi0gbyBjZCAvcGF0aC90by9saW51eC1idWlsZAotCi0gbyBTdGFydCBnZGI6IGdkYiB2bWxpbnV4Ci0KLSAgIE5vdGU6IFNvbWUgZGlzdHJvcyBtYXkgcmVzdHJpY3QgYXV0by1sb2FkaW5nIG9mIGdkYiBzY3JpcHRzIHRvIGtub3duIHNhZmUKLSAgIGRpcmVjdG9yaWVzLiBJbiBjYXNlIGdkYiByZXBvcnRzIHRvIHJlZnVzZSBsb2FkaW5nIHZtbGludXgtZ2RiLnB5LCBhZGQKLQotICAgIGFkZC1hdXRvLWxvYWQtc2FmZS1wYXRoIC9wYXRoL3RvL2xpbnV4LWJ1aWxkCi0KLSAgIHRvIH4vLmdkYmluaXQuIFNlZSBnZGIgaGVscCBmb3IgbW9yZSBkZXRhaWxzLgotCi0gbyBBdHRhY2ggdG8gdGhlIGJvb3RlZCBndWVzdDoKLSAgICAoZ2RiKSB0YXJnZXQgcmVtb3RlIDoxMjM0Ci0KLQotRXhhbXBsZXMgb2YgdXNpbmcgdGhlIExpbnV4LXByb3ZpZGVkIGdkYiBoZWxwZXJzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIG8gTG9hZCBtb2R1bGUgKGFuZCBtYWluIGtlcm5lbCkgc3ltYm9sczoKLSAgICAoZ2RiKSBseC1zeW1ib2xzCi0gICAgbG9hZGluZyB2bWxpbnV4Ci0gICAgc2Nhbm5pbmcgZm9yIG1vZHVsZXMgaW4gL2hvbWUvdXNlci9saW51eC9idWlsZAotICAgIGxvYWRpbmcgQDB4ZmZmZmZmZmZhMDAyMDAwMDogL2hvbWUvdXNlci9saW51eC9idWlsZC9uZXQvbmV0ZmlsdGVyL3h0X3RjcHVkcC5rbwotICAgIGxvYWRpbmcgQDB4ZmZmZmZmZmZhMDAxNjAwMDogL2hvbWUvdXNlci9saW51eC9idWlsZC9uZXQvbmV0ZmlsdGVyL3h0X3BrdHR5cGUua28KLSAgICBsb2FkaW5nIEAweGZmZmZmZmZmYTAwMDIwMDA6IC9ob21lL3VzZXIvbGludXgvYnVpbGQvbmV0L25ldGZpbHRlci94dF9saW1pdC5rbwotICAgIGxvYWRpbmcgQDB4ZmZmZmZmZmZhMDBjYTAwMDogL2hvbWUvdXNlci9saW51eC9idWlsZC9uZXQvcGFja2V0L2FmX3BhY2tldC5rbwotICAgIGxvYWRpbmcgQDB4ZmZmZmZmZmZhMDAzYzAwMDogL2hvbWUvdXNlci9saW51eC9idWlsZC9mcy9mdXNlL2Z1c2Uua28KLSAgICAuLi4KLSAgICBsb2FkaW5nIEAweGZmZmZmZmZmYTAwMDAwMDA6IC9ob21lL3VzZXIvbGludXgvYnVpbGQvZHJpdmVycy9hdGEvYXRhX2dlbmVyaWMua28KLQotIG8gU2V0IGEgYnJlYWtwb2ludCBvbiBzb21lIG5vdCB5ZXQgbG9hZGVkIG1vZHVsZSBmdW5jdGlvbiwgZS5nLjoKLSAgICAoZ2RiKSBiIGJ0cmZzX2luaXRfc3lzZnMKLSAgICBGdW5jdGlvbiAiYnRyZnNfaW5pdF9zeXNmcyIgbm90IGRlZmluZWQuCi0gICAgTWFrZSBicmVha3BvaW50IHBlbmRpbmcgb24gZnV0dXJlIHNoYXJlZCBsaWJyYXJ5IGxvYWQ/ICh5IG9yIFtuXSkgeQotICAgIEJyZWFrcG9pbnQgMSAoYnRyZnNfaW5pdF9zeXNmcykgcGVuZGluZy4KLQotIG8gQ29udGludWUgdGhlIHRhcmdldAotICAgIChnZGIpIGMKLQotIG8gTG9hZCB0aGUgbW9kdWxlIG9uIHRoZSB0YXJnZXQgYW5kIHdhdGNoIHRoZSBzeW1ib2xzIGJlaW5nIGxvYWRlZCBhcyB3ZWxsIGFzCi0gICB0aGUgYnJlYWtwb2ludCBoaXQ6Ci0gICAgbG9hZGluZyBAMHhmZmZmZmZmZmEwMDM0MDAwOiAvaG9tZS91c2VyL2xpbnV4L2J1aWxkL2xpYi9saWJjcmMzMmMua28KLSAgICBsb2FkaW5nIEAweGZmZmZmZmZmYTAwNTAwMDA6IC9ob21lL3VzZXIvbGludXgvYnVpbGQvbGliL2x6by9sem9fY29tcHJlc3Mua28KLSAgICBsb2FkaW5nIEAweGZmZmZmZmZmYTAwNmUwMDA6IC9ob21lL3VzZXIvbGludXgvYnVpbGQvbGliL3psaWJfZGVmbGF0ZS96bGliX2RlZmxhdGUua28KLSAgICBsb2FkaW5nIEAweGZmZmZmZmZmYTAxYjEwMDA6IC9ob21lL3VzZXIvbGludXgvYnVpbGQvZnMvYnRyZnMvYnRyZnMua28KLQotICAgIEJyZWFrcG9pbnQgMSwgYnRyZnNfaW5pdF9zeXNmcyAoKSBhdCAvaG9tZS91c2VyL2xpbnV4L2ZzL2J0cmZzL3N5c2ZzLmM6MzYKLSAgICAzNiAgICAgICAgICAgICAgYnRyZnNfa3NldCA9IGtzZXRfY3JlYXRlX2FuZF9hZGQoImJ0cmZzIiwgTlVMTCwgZnNfa29iaik7Ci0KLSBvIER1bXAgdGhlIGxvZyBidWZmZXIgb2YgdGhlIHRhcmdldCBrZXJuZWw6Ci0gICAgKGdkYikgbHgtZG1lc2cKLSAgICBbICAgICAwLjAwMDAwMF0gSW5pdGlhbGl6aW5nIGNncm91cCBzdWJzeXMgY3B1c2V0Ci0gICAgWyAgICAgMC4wMDAwMDBdIEluaXRpYWxpemluZyBjZ3JvdXAgc3Vic3lzIGNwdQotICAgIFsgICAgIDAuMDAwMDAwXSBMaW51eCB2ZXJzaW9uIDMuOC4wLXJjNC1kYmcrICguLi4KLSAgICBbICAgICAwLjAwMDAwMF0gQ29tbWFuZCBsaW5lOiByb290PS9kZXYvc2RhMiByZXN1bWU9L2Rldi9zZGExIHZnYT0weDMxNAotICAgIFsgICAgIDAuMDAwMDAwXSBlODIwOiBCSU9TLXByb3ZpZGVkIHBoeXNpY2FsIFJBTSBtYXA6Ci0gICAgWyAgICAgMC4wMDAwMDBdIEJJT1MtZTgyMDogW21lbSAweDAwMDAwMDAwMDAwMDAwMDAtMHgwMDAwMDAwMDAwMDlmYmZmXSB1c2FibGUKLSAgICBbICAgICAwLjAwMDAwMF0gQklPUy1lODIwOiBbbWVtIDB4MDAwMDAwMDAwMDA5ZmMwMC0weDAwMDAwMDAwMDAwOWZmZmZdIHJlc2VydmVkCi0gICAgLi4uLgotCi0gbyBFeGFtaW5lIGZpZWxkcyBvZiB0aGUgY3VycmVudCB0YXNrIHN0cnVjdDoKLSAgICAoZ2RiKSBwICRseF9jdXJyZW50KCkucGlkCi0gICAgJDEgPSA0OTk4Ci0gICAgKGdkYikgcCAkbHhfY3VycmVudCgpLmNvbW0KLSAgICAkMiA9ICJtb2Rwcm9iZVwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAiCi0KLSBvIE1ha2UgdXNlIG9mIHRoZSBwZXItY3B1IGZ1bmN0aW9uIGZvciB0aGUgY3VycmVudCBvciBhIHNwZWNpZmllZCBDUFU6Ci0gICAgKGdkYikgcCAkbHhfcGVyX2NwdSgicnVucXVldWVzIikubnJfcnVubmluZwotICAgICQzID0gMQotICAgIChnZGIpIHAgJGx4X3Blcl9jcHUoInJ1bnF1ZXVlcyIsIDIpLm5yX3J1bm5pbmcKLSAgICAkNCA9IDAKLQotIG8gRGlnIGludG8gaHJ0aW1lcnMgdXNpbmcgdGhlIGNvbnRhaW5lcl9vZiBoZWxwZXI6Ci0gICAgKGdkYikgc2V0ICRuZXh0ID0gJGx4X3Blcl9jcHUoImhydGltZXJfYmFzZXMiKS5jbG9ja19iYXNlWzBdLmFjdGl2ZS5uZXh0Ci0gICAgKGdkYikgcCAqJGNvbnRhaW5lcl9vZigkbmV4dCwgInN0cnVjdCBocnRpbWVyIiwgIm5vZGUiKQotICAgICQ1ID0gewotICAgICAgbm9kZSA9IHsKLSAgICAgICAgbm9kZSA9IHsKLSAgICAgICAgICBfX3JiX3BhcmVudF9jb2xvciA9IDE4NDQ2NjEyMTMzMzU1MjU2MDcyLAotICAgICAgICAgIHJiX3JpZ2h0ID0gMHgwIDxpcnFfc3RhY2tfdW5pb24+LAotICAgICAgICAgIHJiX2xlZnQgPSAweDAgPGlycV9zdGFja191bmlvbj4KLSAgICAgICAgfSwKLSAgICAgICAgZXhwaXJlcyA9IHsKLSAgICAgICAgICB0djY0ID0gMTgzNTI2ODAwMDAwMAotICAgICAgICB9Ci0gICAgICB9LAotICAgICAgX3NvZnRleHBpcmVzID0gewotICAgICAgICB0djY0ID0gMTgzNTI2ODAwMDAwMAotICAgICAgfSwKLSAgICAgIGZ1bmN0aW9uID0gMHhmZmZmZmZmZjgxMDc4MjMyIDx0aWNrX3NjaGVkX3RpbWVyPiwKLSAgICAgIGJhc2UgPSAweGZmZmY4ODAwM2ZkMGQ2ZjAsCi0gICAgICBzdGF0ZSA9IDEsCi0gICAgICBzdGFydF9waWQgPSAwLAotICAgICAgc3RhcnRfc2l0ZSA9IDB4ZmZmZmZmZmY4MTA1NWMxZiA8aHJ0aW1lcl9zdGFydF9yYW5nZV9ucysyMD4sCi0gICAgICBzdGFydF9jb21tID0gInN3YXBwZXIvMlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCIKLSAgICB9Ci0KLQotTGlzdCBvZiBjb21tYW5kcyBhbmQgZnVuY3Rpb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIG51bWJlciBvZiBjb21tYW5kcyBhbmQgY29udmVuaWVuY2UgZnVuY3Rpb25zIG1heSBldm9sdmUgb3ZlciB0aGUgdGltZSwKLXRoaXMgaXMganVzdCBhIHNuYXBzaG90IG9mIHRoZSBpbml0aWFsIHZlcnNpb246Ci0KLSAoZ2RiKSBhcHJvcG9zIGx4Ci0gZnVuY3Rpb24gbHhfY3VycmVudCAtLSBSZXR1cm4gY3VycmVudCB0YXNrCi0gZnVuY3Rpb24gbHhfbW9kdWxlIC0tIEZpbmQgbW9kdWxlIGJ5IG5hbWUgYW5kIHJldHVybiB0aGUgbW9kdWxlIHZhcmlhYmxlCi0gZnVuY3Rpb24gbHhfcGVyX2NwdSAtLSBSZXR1cm4gcGVyLWNwdSB2YXJpYWJsZQotIGZ1bmN0aW9uIGx4X3Rhc2tfYnlfcGlkIC0tIEZpbmQgTGludXggdGFzayBieSBQSUQgYW5kIHJldHVybiB0aGUgdGFza19zdHJ1Y3QgdmFyaWFibGUKLSBmdW5jdGlvbiBseF90aHJlYWRfaW5mbyAtLSBDYWxjdWxhdGUgTGludXggdGhyZWFkX2luZm8gZnJvbSB0YXNrIHZhcmlhYmxlCi0gbHgtZG1lc2cgLS0gUHJpbnQgTGludXgga2VybmVsIGxvZyBidWZmZXIKLSBseC1sc21vZCAtLSBMaXN0IGN1cnJlbnRseSBsb2FkZWQgbW9kdWxlcwotIGx4LXN5bWJvbHMgLS0gKFJlLSlsb2FkIHN5bWJvbHMgb2YgTGludXgga2VybmVsIGFuZCBjdXJyZW50bHkgbG9hZGVkIG1vZHVsZXMKLQotRGV0YWlsZWQgaGVscCBjYW4gYmUgb2J0YWluZWQgdmlhICJoZWxwIDxjb21tYW5kLW5hbWU+IiBmb3IgY29tbWFuZHMgYW5kICJoZWxwCi1mdW5jdGlvbiA8ZnVuY3Rpb24tbmFtZT4iIGZvciBjb252ZW5pZW5jZSBmdW5jdGlvbnMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dwaW8vYm9hcmQudHh0IGIvRG9jdW1lbnRhdGlvbi9ncGlvL2JvYXJkLnR4dAppbmRleCA4NmQzZmE5Li40MDg4NGM0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2dwaW8vYm9hcmQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZ3Bpby9ib2FyZC50eHQKQEAgLTgsOSArOCw5IEBACiBpbnRlcmZhY2U7IHlvdSBqdXN0IGZldGNoIGFuIGludGVnZXIgZnJvbSBzb21ld2hlcmUgYW5kIHJlcXVlc3QgdGhlCiBjb3JyZXNwb25kaW5nIEdQSU8uCiAKLVBsYXRmb3JtcyB0aGF0IG1ha2UgdXNlIG9mIEdQSU9zIG11c3Qgc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCIChpZiBHUElPIHVzYWdlCi1pcyBtYW5kYXRvcnkpIG9yIEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCIChpZiBHUElPIHN1cHBvcnQgY2FuIGJlIG9taXR0ZWQpIGluCi10aGVpciBLY29uZmlnLiBUaGVuLCBob3cgR1BJT3MgYXJlIG1hcHBlZCBkZXBlbmRzIG9uIHdoYXQgdGhlIHBsYXRmb3JtIHVzZXMgdG8KK0FsbCBwbGF0Zm9ybXMgY2FuIGVuYWJsZSB0aGUgR1BJTyBsaWJyYXJ5LCBidXQgaWYgdGhlIHBsYXRmb3JtIHN0cmljdGx5CityZXF1aXJlcyBHUElPIGZ1bmN0aW9uYWxpdHkgdG8gYmUgcHJlc2VudCwgaXQgbmVlZHMgdG8gc2VsZWN0IEdQSU9MSUIgZnJvbSBpdHMKK0tjb25maWcuIFRoZW4sIGhvdyBHUElPcyBhcmUgbWFwcGVkIGRlcGVuZHMgb24gd2hhdCB0aGUgcGxhdGZvcm0gdXNlcyB0bwogZGVzY3JpYmUgaXRzIGhhcmR3YXJlIGxheW91dC4gQ3VycmVudGx5LCBtYXBwaW5ncyBjYW4gYmUgZGVmaW5lZCB0aHJvdWdoIGRldmljZQogdHJlZSwgQUNQSSwgYW5kIHBsYXRmb3JtIGRhdGEuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ3Bpby9kcml2ZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9ncGlvL2RyaXZlci50eHQKaW5kZXggNmNiMzVhNy4uMzY4ZDVhMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9ncGlvL2RyaXZlci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9ncGlvL2RyaXZlci50eHQKQEAgLTI2Miw2ICsyNjIsMTIgQEAKICAgdG8gdGhlIGNvbnRhaW5lciB1c2luZyBjb250YWluZXJfb2YoKS4KICAgKFNlZSBEb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9kZXNpZ24tcGF0dGVybnMudHh0KQogCisgIElmIHRoZXJlIGlzIGEgbmVlZCB0byBleGNsdWRlIGNlcnRhaW4gR1BJT3MgZnJvbSB0aGUgSVJRIGRvbWFpbiwgb25lIGNhbgorICBzZXQgLmlycV9uZWVkX3ZhbGlkX21hc2sgb2YgdGhlIGdwaW9jaGlwIGJlZm9yZSBncGlvY2hpcF9hZGRfZGF0YSgpIGlzCisgIGNhbGxlZC4gVGhpcyBhbGxvY2F0ZXMgLmlycV92YWxpZF9tYXNrIHdpdGggYXMgbWFueSBiaXRzIHNldCBhcyB0aGVyZSBhcmUKKyAgR1BJT3MgaW4gdGhlIGNoaXAuIERyaXZlcnMgY2FuIGV4Y2x1ZGUgR1BJT3MgYnkgY2xlYXJpbmcgYml0cyBmcm9tIHRoaXMKKyAgbWFzay4gVGhlIG1hc2sgbXVzdCBiZSBmaWxsZWQgaW4gYmVmb3JlIGdwaW9jaGlwX2lycWNoaXBfYWRkKCkgaXMgY2FsbGVkLgorCiAqIGdwaW9jaGlwX3NldF9jaGFpbmVkX2lycWNoaXAoKTogc2V0cyB1cCBhIGNoYWluZWQgaXJxIGhhbmRsZXIgZm9yIGEKICAgZ3Bpb19jaGlwIGZyb20gYSBwYXJlbnQgSVJRIGFuZCBwYXNzZXMgdGhlIHN0cnVjdCBncGlvX2NoaXAqIGFzIGhhbmRsZXIKICAgZGF0YS4gKE5vdGljZSBoYW5kbGVyIGRhdGEsIHNpbmNlIHRoZSBpcnFjaGlwIGRhdGEgaXMgbGlrZWx5IHVzZWQgYnkgdGhlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dwaW8vZ3Bpby1sZWdhY3kudHh0IGIvRG9jdW1lbnRhdGlvbi9ncGlvL2dwaW8tbGVnYWN5LnR4dAppbmRleCA3OWFiNTY0Li5iMzRmZDk0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2dwaW8vZ3Bpby1sZWdhY3kudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZ3Bpby9ncGlvLWxlZ2FjeS50eHQKQEAgLTcyLDggKzcyLDggQEAKIG5vdCBjYXJlIGhvdyBpdCdzIGltcGxlbWVudGVkLikKIAogVGhhdCBzYWlkLCBpZiB0aGUgY29udmVudGlvbiBpcyBzdXBwb3J0ZWQgb24gdGhlaXIgcGxhdGZvcm0sIGRyaXZlcnMgc2hvdWxkCi11c2UgaXQgd2hlbiBwb3NzaWJsZS4gIFBsYXRmb3JtcyBtdXN0IHNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQiBvcgotQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUIgaW4gdGhlaXIgS2NvbmZpZy4gIERyaXZlcnMgdGhhdCBjYW4ndCB3b3JrIHdpdGhvdXQKK3VzZSBpdCB3aGVuIHBvc3NpYmxlLiAgUGxhdGZvcm1zIG11c3Qgc2VsZWN0IEdQSU9MSUIgaWYgR1BJTyBmdW5jdGlvbmFsaXR5CitpcyBzdHJpY3RseSByZXF1aXJlZC4gIERyaXZlcnMgdGhhdCBjYW4ndCB3b3JrIHdpdGhvdXQKIHN0YW5kYXJkIEdQSU8gY2FsbHMgc2hvdWxkIGhhdmUgS2NvbmZpZyBlbnRyaWVzIHdoaWNoIGRlcGVuZCBvbiBHUElPTElCLiAgVGhlCiBHUElPIGNhbGxzIGFyZSBhdmFpbGFibGUsIGVpdGhlciBhcyAicmVhbCBjb2RlIiBvciBhcyBvcHRpbWl6ZWQtYXdheSBzdHVicywKIHdoZW4gZHJpdmVycyB1c2UgdGhlIGluY2x1ZGUgZmlsZToKQEAgLTU1MywyMiArNTUzLDE0IEBACiAKIFBsYXRmb3JtIFN1cHBvcnQKIC0tLS0tLS0tLS0tLS0tLS0KLVRvIHN1cHBvcnQgdGhpcyBmcmFtZXdvcmssIGEgcGxhdGZvcm0ncyBLY29uZmlnIHdpbGwgInNlbGVjdCIgZWl0aGVyCi1BUkNIX1JFUVVJUkVfR1BJT0xJQiBvciBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgotYW5kIGFycmFuZ2UgdGhhdCBpdHMgPGFzbS9ncGlvLmg+IGluY2x1ZGVzIDxhc20tZ2VuZXJpYy9ncGlvLmg+IGFuZCBkZWZpbmVzCi10aHJlZSBmdW5jdGlvbnM6IGdwaW9fZ2V0X3ZhbHVlKCksIGdwaW9fc2V0X3ZhbHVlKCksIGFuZCBncGlvX2NhbnNsZWVwKCkuCitUbyBmb3JjZS1lbmFibGUgdGhpcyBmcmFtZXdvcmssIGEgcGxhdGZvcm0ncyBLY29uZmlnIHdpbGwgInNlbGVjdCIgR1BJT0xJQiwKK2Vsc2UgaXQgaXMgdXAgdG8gdGhlIHVzZXIgdG8gY29uZmlndXJlIHN1cHBvcnQgZm9yIEdQSU8uCiAKIEl0IG1heSBhbHNvIHByb3ZpZGUgYSBjdXN0b20gdmFsdWUgZm9yIEFSQ0hfTlJfR1BJT1MsIHNvIHRoYXQgaXQgYmV0dGVyCiByZWZsZWN0cyB0aGUgbnVtYmVyIG9mIEdQSU9zIGluIGFjdHVhbCB1c2Ugb24gdGhhdCBwbGF0Zm9ybSwgd2l0aG91dAogd2FzdGluZyBzdGF0aWMgdGFibGUgc3BhY2UuICAoSXQgc2hvdWxkIGNvdW50IGJvdGggYnVpbHQtaW4vU29DIEdQSU9zIGFuZAogYWxzbyBvbmVzIG9uIEdQSU8gZXhwYW5kZXJzLgogCi1BUkNIX1JFUVVJUkVfR1BJT0xJQiBtZWFucyB0aGF0IHRoZSBncGlvbGliIGNvZGUgd2lsbCBhbHdheXMgZ2V0IGNvbXBpbGVkCi1pbnRvIHRoZSBrZXJuZWwgb24gdGhhdCBhcmNoaXRlY3R1cmUuCi0KLUFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCIG1lYW5zIHRoZSBncGlvbGliIGNvZGUgZGVmYXVsdHMgdG8gb2ZmIGFuZCB0aGUgdXNlcgotY2FuIGVuYWJsZSBpdCBhbmQgYnVpbGQgaXQgaW50byB0aGUga2VybmVsIG9wdGlvbmFsbHkuCi0KIElmIG5laXRoZXIgb2YgdGhlc2Ugb3B0aW9ucyBhcmUgc2VsZWN0ZWQsIHRoZSBwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0CiBHUElPcyB0aHJvdWdoIEdQSU8tbGliIGFuZCB0aGUgY29kZSBjYW5ub3QgYmUgZW5hYmxlZCBieSB0aGUgdXNlci4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ncHUvY29uZi5weSBiL0RvY3VtZW50YXRpb24vZ3B1L2NvbmYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMxNGQxNwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ3B1L2NvbmYucHkKQEAgLTAsMCArMSw1IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04OyBtb2RlOiBweXRob24gLSotCisKK3Byb2plY3QgPSAiTGludXggR1BVIERyaXZlciBEZXZlbG9wZXIncyBHdWlkZSIKKwordGFncy5hZGQoInN1YnByb2plY3QiKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ncHUvaW5kZXgucnN0IGIvRG9jdW1lbnRhdGlvbi9ncHUvaW5kZXgucnN0CmluZGV4IGZjYWMwZmEuLjVmZjNkMmIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZ3B1L2luZGV4LnJzdAorKysgYi9Eb2N1bWVudGF0aW9uL2dwdS9pbmRleC5yc3QKQEAgLTEyLDMgKzEyLDEwIEBACiAgICBkcm0tdWFwaQogICAgaTkxNQogICAgdmdhLXN3aXRjaGVyb28KKworLi4gb25seTo6ICBzdWJwcm9qZWN0CisKKyAgIEluZGljZXMKKyAgID09PT09PT0KKworICAgKiA6cmVmOmBnZW5pbmRleGAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHNpLnR4dCBiL0RvY3VtZW50YXRpb24vaHNpLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFjNmNkNS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2hzaS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi1IU0kgLSBIaWdoLXNwZWVkIFN5bmNocm9ub3VzIFNlcmlhbCBJbnRlcmZhY2UKLQotMS4gSW50cm9kdWN0aW9uCi1+fn5+fn5+fn5+fn5+fn4KLQotSGlnaCBTcGVlZCBTeW5jcm9ub3VzIEludGVyZmFjZSAoSFNJKSBpcyBhIGZ1bGxkdXBsZXgsIGxvdyBsYXRlbmN5IHByb3RvY29sLAotdGhhdCBpcyBvcHRpbWl6ZWQgZm9yIGRpZS1sZXZlbCBpbnRlcmNvbm5lY3QgYmV0d2VlbiBhbiBBcHBsaWNhdGlvbiBQcm9jZXNzb3IKLWFuZCBhIEJhc2ViYW5kIGNoaXBzZXQuIEl0IGhhcyBiZWVuIHNwZWNpZmllZCBieSB0aGUgTUlQSSBhbGxpYW5jZSBpbiAyMDAzIGFuZAotaW1wbGVtZW50ZWQgYnkgbXVsdGlwbGUgdmVuZG9ycyBzaW5jZSB0aGVuLgotCi1UaGUgSFNJIGludGVyZmFjZSBzdXBwb3J0cyBmdWxsIGR1cGxleCBjb21tdW5pY2F0aW9uIG92ZXIgbXVsdGlwbGUgY2hhbm5lbHMKLSh0eXBpY2FsbHkgOCkgYW5kIGlzIGNhcGFibGUgb2YgcmVhY2hpbmcgc3BlZWRzIHVwIHRvIDIwMCBNYml0L3MuCi0KLVRoZSBzZXJpYWwgcHJvdG9jb2wgdXNlcyB0d28gc2lnbmFscywgREFUQSBhbmQgRkxBRyBhcyBjb21iaW5lZCBkYXRhIGFuZCBjbG9jawotc2lnbmFscyBhbmQgYW4gYWRkaXRpb25hbCBSRUFEWSBzaWduYWwgZm9yIGZsb3cgY29udHJvbC4gQW4gYWRkaXRpb25hbCBXQUtFCi1zaWduYWwgY2FuIGJlIHVzZWQgdG8gd2FrZXVwIHRoZSBjaGlwcyBmcm9tIHN0YW5kYnkgbW9kZXMuIFRoZSBzaWduYWxzIGFyZQotY29tbW9ubHkgcHJlZml4ZWQgYnkgQUMgZm9yIHNpZ25hbHMgZ29pbmcgZnJvbSB0aGUgYXBwbGljYXRpb24gZGllIHRvIHRoZQotY2VsbHVsYXIgZGllIGFuZCBDQSBmb3Igc2lnbmFscyBnb2luZyB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KLQotKy0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tKwotfCAgQ2VsbHVsYXIgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBBcHBsaWNhdGlvbiAgfAotfCAgICBEaWUgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgRGllICAgICAgfAotfCAgICAgICAgICAgIHwgLSAtIC0gLSAtIC0gQ0FXQUtFIC0gLSAtIC0gLSAtID58ICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgVHwtLS0tLS0tLS0tLS0gQ0FEQVRBIC0tLS0tLS0tLS0tLT58UiAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgWHwtLS0tLS0tLS0tLS0gQ0FGTEFHIC0tLS0tLS0tLS0tLT58WCAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgIHw8LS0tLS0tLS0tLS0gQUNSRUFEWSAtLS0tLS0tLS0tLS18ICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgIHw8IC0gLSAtIC0gLSAgQUNXQUtFIC0gLSAtIC0gLSAtIC18ICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgUnw8LS0tLS0tLS0tLS0gQUNEQVRBIC0tLS0tLS0tLS0tLS18VCAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgWHw8LS0tLS0tLS0tLS0gQUNGTEFHIC0tLS0tLS0tLS0tLS18WCAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0gQ0FSRUFEWSAtLS0tLS0tLS0tLT58ICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tKwotCi0yLiBIU0kgU3Vic3lzdGVtIGluIExpbnV4Ci1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0KLUluIHRoZSBMaW51eCBrZXJuZWwgdGhlIGhzaSBzdWJzeXN0ZW0gaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBmb3IgSFNJIGRldmljZXMuCi1UaGUgaHNpIHN1YnN5c3RlbSBjb250YWlucyBkcml2ZXJzIGZvciBoc2kgY29udHJvbGxlcnMgaW5jbHVkaW5nIHN1cHBvcnQgZm9yCi1tdWx0aS1wb3J0IGNvbnRyb2xsZXJzIGFuZCBwcm92aWRlcyBhIGdlbmVyaWMgQVBJIGZvciB1c2luZyB0aGUgSFNJIHBvcnRzLgotCi1JdCBhbHNvIGNvbnRhaW5zIEhTSSBjbGllbnQgZHJpdmVycywgd2hpY2ggbWFrZSB1c2Ugb2YgdGhlIGdlbmVyaWMgQVBJIHRvCi1pbXBsZW1lbnQgYSBwcm90b2NvbCB1c2VkIG9uIHRoZSBIU0kgaW50ZXJmYWNlLiBUaGVzZSBjbGllbnQgZHJpdmVycyBjYW4KLXVzZSBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGNoYW5uZWxzLgotCi0zLiBoc2ktY2hhciBEZXZpY2UKLX5+fn5+fn5+fn5+fn5+fn5+fgotCi1FYWNoIHBvcnQgYXV0b21hdGljYWxseSByZWdpc3RlcnMgYSBnZW5lcmljIGNsaWVudCBkcml2ZXIgY2FsbGVkIGhzaV9jaGFyLAotd2hpY2ggcHJvdmlkZXMgYSBjaGFyZWN0ZXIgZGV2aWNlIGZvciB1c2Vyc3BhY2UgcmVwcmVzZW50aW5nIHRoZSBIU0kgcG9ydC4KLUl0IGNhbiBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHZpYSBIU0kgZnJvbSB1c2Vyc3BhY2UuIFVzZXJzcGFjZSBtYXkKLWNvbmZpZ3VyZSB0aGUgaHNpX2NoYXIgZGV2aWNlIHVzaW5nIHRoZSBmb2xsb3dpbmcgaW9jdGwgY29tbWFuZHM6Ci0KLSogSFNDX1JFU0VUOgotIC0gZmx1c2ggdGhlIEhTSSBwb3J0Ci0KLSogSFNDX1NFVF9QTQotIC0gZW5hYmxlIG9yIGRpc2FibGUgdGhlIGNsaWVudC4KLQotKiBIU0NfU0VORF9CUkVBSwotIC0gc2VuZCBicmVhawotCi0qIEhTQ19TRVRfUlgKLSAtIHNldCBSWCBjb25maWd1cmF0aW9uCi0KLSogSFNDX0dFVF9SWAotIC0gZ2V0IFJYIGNvbmZpZ3VyYXRpb24KLQotKiBIU0NfU0VUX1RYCi0gLSBzZXQgVFggY29uZmlndXJhdGlvbgotCi0qIEhTQ19HRVRfVFgKLSAtIGdldCBUWCBjb25maWd1cmF0aW9uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkdDc0NzAgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkdDc0NzAKaW5kZXggOGNlNGFhMC4uZmU2OGUxOGEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vYWR0NzQ3MAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkdDc0NzAKQEAgLTY1LDYgKzY1LDIzIEBACiB0ZW1wZXJhdHVyZSBzZW5zb3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBQV00gY29udHJvbCBleGNlZWRzCiBwd20jX2F1dG9fcG9pbnQyX3RlbXAuCiAKK1RoZSBkcml2ZXIgYWxzbyBhbGxvd3MgY29udHJvbCBvZiB0aGUgUFdNIGZyZXF1ZW5jeToKKworKiBwd20xX2ZyZXEKKworVGhlIFBXTSBmcmVxdWVuY3kgaXMgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBvbmUgb2Y6CisKKyogMTEuMCBIegorKiAxNC43IEh6CisqIDIyLjEgSHoKKyogMjkuNCBIegorKiAzNS4zIEh6CisqIDQ0LjEgSHoKKyogNTguOCBIegorKiA4OC4yIEh6CisqIDEuNCBrSHoKKyogMjIuNSBrSHoKKwogTm90ZXMKIC0tLS0tCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vZnRzdGV1dGF0ZXMgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2Z0c3RldXRhdGVzCmluZGV4IDJhMWJmNjkuLjhjMTBhOTEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vZnRzdGV1dGF0ZXMKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9mdHN0ZXV0YXRlcwpAQCAtMTksNSArMTksNSBAQAogaW1wbGVtZW50ZWQgaW4gdGhpcyBkcml2ZXIuCiAKIFNwZWNpZmljYXRpb24gb2YgdGhlIGNoaXAgY2FuIGJlIGZvdW5kIGhlcmU6Ci1mdHA6Ly8vcHViL01haW5ib2FyZC1PRU0tU2FsZXMvU2VydmljZXMvU29mdHdhcmUmVG9vbHMvTGludXhfU3lzdGVtTW9uaXRvcmluZyZXYXRjaGRvZyZHUElPL0JNQy1UZXV0YXRlc19TcGVjaWZpY2F0aW9uX1YxLjIxLnBkZgotZnRwOi8vL3B1Yi9NYWluYm9hcmQtT0VNLVNhbGVzL1NlcnZpY2VzL1NvZnR3YXJlJlRvb2xzL0xpbnV4X1N5c3RlbU1vbml0b3JpbmcmV2F0Y2hkb2cmR1BJTy9GdWppdHN1X21haW5ib2FyZHMtMS1TZW5zb3JzX0hvd1RvLWVuLVVTLnBkZgorZnRwOi8vZnRwLnRzLmZ1aml0c3UuY29tL3B1Yi9NYWluYm9hcmQtT0VNLVNhbGVzL1NlcnZpY2VzL1NvZnR3YXJlJlRvb2xzL0xpbnV4X1N5c3RlbU1vbml0b3JpbmcmV2F0Y2hkb2cmR1BJTy9CTUMtVGV1dGF0ZXNfU3BlY2lmaWNhdGlvbl9WMS4yMS5wZGYKK2Z0cDovL2Z0cC50cy5mdWppdHN1LmNvbS9wdWIvTWFpbmJvYXJkLU9FTS1TYWxlcy9TZXJ2aWNlcy9Tb2Z0d2FyZSZUb29scy9MaW51eF9TeXN0ZW1Nb25pdG9yaW5nJldhdGNoZG9nJkdQSU8vRnVqaXRzdV9tYWluYm9hcmRzLTEtU2Vuc29yc19Ib3dUby1lbi1VUy5wZGYKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vaHdtb24ta2VybmVsLWFwaS50eHQgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2h3bW9uLWtlcm5lbC1hcGkudHh0CmluZGV4IDJlY2RiZmMuLmVmOWQ3NDkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vaHdtb24ta2VybmVsLWFwaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9od21vbi1rZXJuZWwtYXBpLnR4dApAQCAtMzQsNiArMzQsMTkgQEAKIAkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqZHJ2ZGF0YSwKIAkJCQkgICAgICAgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqKmdyb3Vwcyk7CiAKK3N0cnVjdCBkZXZpY2UgKgoraHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqZHJ2ZGF0YSwKKwkJCQljb25zdCBzdHJ1Y3QgaHdtb25fY2hpcF9pbmZvICppbmZvLAorCQkJCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKipncm91cHMpOworCitzdHJ1Y3QgZGV2aWNlICoKK2Rldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICAgdm9pZCAqZHJ2ZGF0YSwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBod21vbl9jaGlwX2luZm8gKmluZm8sCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICoqZ3JvdXBzKTsKKwogdm9pZCBod21vbl9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpOwogdm9pZCBkZXZtX2h3bW9uX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldik7CiAKQEAgLTYwLDE1ICs3MywyMjkgQEAKIGh3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3Vwcy4gSG93ZXZlciwgaXQgaXMgZGV2aWNlIG1hbmFnZWQsIG1lYW5pbmcgdGhlCiBod21vbiBkZXZpY2UgZG9lcyBub3QgaGF2ZSB0byBiZSByZW1vdmVkIGV4cGxpY2l0bHkgYnkgdGhlIHJlbW92YWwgZnVuY3Rpb24uCiAKK2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8gaXMgdGhlIG1vc3QgY29tcHJlaGVuc2l2ZSBhbmQgcHJlZmVycmVkIG1lYW5zCit0byByZWdpc3RlciBhIGhhcmR3YXJlIG1vbml0b3JpbmcgZGV2aWNlLiBJdCBjcmVhdGVzIHRoZSBzdGFuZGFyZCBzeXNmcworYXR0cmlidXRlcyBpbiB0aGUgaGFyZHdhcmUgbW9uaXRvcmluZyBjb3JlLCBsZXR0aW5nIHRoZSBkcml2ZXIgZm9jdXMgb24gcmVhZGluZworZnJvbSBhbmQgd3JpdGluZyB0byB0aGUgY2hpcCBpbnN0ZWFkIG9mIGhhdmluZyB0byBib3RoZXIgd2l0aCBzeXNmcyBhdHRyaWJ1dGVzLgorSXRzIHBhcmFtZXRlcnMgYXJlIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBiZWxvdy4KKworZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvIGlzIHNpbWlsYXIgdG8KK2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8uIEhvd2V2ZXIsIGl0IGlzIGRldmljZSBtYW5hZ2VkLCBtZWFuaW5nIHRoZQoraHdtb24gZGV2aWNlIGRvZXMgbm90IGhhdmUgdG8gYmUgcmVtb3ZlZCBleHBsaWNpdGx5IGJ5IHRoZSByZW1vdmFsIGZ1bmN0aW9uLgorCiBod21vbl9kZXZpY2VfdW5yZWdpc3RlciBkZXJlZ2lzdGVycyBhIHJlZ2lzdGVyZWQgaGFyZHdhcmUgbW9uaXRvcmluZyBkZXZpY2UuCiBUaGUgcGFyYW1ldGVyIG9mIHRoaXMgZnVuY3Rpb24gaXMgdGhlIHBvaW50ZXIgdG8gdGhlIHJlZ2lzdGVyZWQgaGFyZHdhcmUKIG1vbml0b3JpbmcgZGV2aWNlIHN0cnVjdHVyZS4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBkcml2ZXIKIHJlbW92ZSBmdW5jdGlvbiBpZiB0aGUgaGFyZHdhcmUgbW9uaXRvcmluZyBkZXZpY2Ugd2FzIHJlZ2lzdGVyZWQgd2l0aAotaHdtb25fZGV2aWNlX3JlZ2lzdGVyIG9yIHdpdGggaHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzLgoraHdtb25fZGV2aWNlX3JlZ2lzdGVyLCBod21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMsIG9yCitod21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvLgogCiBkZXZtX2h3bW9uX2RldmljZV91bnJlZ2lzdGVyIGRvZXMgbm90IG5vcm1hbGx5IGhhdmUgdG8gYmUgY2FsbGVkLiBJdCBpcyBvbmx5CiBuZWVkZWQgZm9yIGVycm9yIGhhbmRsaW5nLCBhbmQgb25seSBuZWVkZWQgaWYgdGhlIGRyaXZlciBwcm9iZSBmYWlscyBhZnRlcgotdGhlIGNhbGwgdG8gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMuCit0aGUgY2FsbCB0byBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyBhbmQgaWYgdGhlIGF1dG9tYXRpYworKGRldmljZSBtYW5hZ2VkKSByZW1vdmFsIHdvdWxkIGJlIHRvbyBsYXRlLgorCitVc2luZyBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8oKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfaW5mbygpIHJlZ2lzdGVycyBhIGhhcmR3YXJlIG1vbml0b3JpbmcgZGV2aWNlLgorVGhlIHBhcmFtZXRlcnMgdG8gdGhpcyBmdW5jdGlvbiBhcmUKKworc3RydWN0IGRldmljZSAqZGV2CVBvaW50ZXIgdG8gcGFyZW50IGRldmljZQorY29uc3QgY2hhciAqbmFtZQlEZXZpY2UgbmFtZQordm9pZCAqZHJ2ZGF0YQkJRHJpdmVyIHByaXZhdGUgZGF0YQorY29uc3Qgc3RydWN0IGh3bW9uX2NoaXBfaW5mbyAqaW5mbworCQkJUG9pbnRlciB0byBjaGlwIGRlc2NyaXB0aW9uLgorY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqKmdyb3VwcworCQkJTnVsbC10ZXJtaW5hdGVkIGxpc3Qgb2YgYWRkaXRpb25hbCBzeXNmcyBhdHRyaWJ1dGUKKwkJCWdyb3Vwcy4KKworVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY3JlYXRlZCBoYXJkd2FyZSBtb25pdG9yaW5nIGRldmljZQorb24gc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGZvciBmYWlsdXJlLgorCitUaGUgaHdtb25fY2hpcF9pbmZvIHN0cnVjdHVyZSBsb29rcyBhcyBmb2xsb3dzLgorCitzdHJ1Y3QgaHdtb25fY2hpcF9pbmZvIHsKKwljb25zdCBzdHJ1Y3QgaHdtb25fb3BzICpvcHM7CisJY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyAqKmluZm87Cit9OworCitJdCBjb250YWlucyB0aGUgZm9sbG93aW5nIGZpZWxkczoKKworKiBvcHM6CVBvaW50ZXIgdG8gZGV2aWNlIG9wZXJhdGlvbnMuCisqIGluZm86IE5VTEwtdGVybWluYXRlZCBsaXN0IG9mIGRldmljZSBjaGFubmVsIGRlc2NyaXB0b3JzLgorCitUaGUgbGlzdCBvZiBod21vbiBvcGVyYXRpb25zIGlzIGRlZmluZWQgYXM6CisKK3N0cnVjdCBod21vbl9vcHMgeworCXVtb2RlX3QgKCppc192aXNpYmxlKShjb25zdCB2b2lkICosIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQkgICAgICB1MzIgYXR0ciwgaW50KTsKKwlpbnQgKCpyZWFkKShzdHJ1Y3QgZGV2aWNlICosIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCSAgICB1MzIgYXR0ciwgaW50LCBsb25nICopOworCWludCAoKndyaXRlKShzdHJ1Y3QgZGV2aWNlICosIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCSAgICAgdTMyIGF0dHIsIGludCwgbG9uZyk7Cit9OworCitJdCBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucy4KKworKiBpc192aXNpYmxlOiBQb2ludGVyIHRvIGEgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBmaWxlIG1vZGUgZm9yIGVhY2ggc3VwcG9ydGVkCisgIGF0dHJpYnV0ZS4gVGhpcyBmdW5jdGlvbiBpcyBtYW5kYXRvcnkuCisKKyogcmVhZDogUG9pbnRlciB0byBhIGZ1bmN0aW9uIGZvciByZWFkaW5nIGEgdmFsdWUgZnJvbSB0aGUgY2hpcC4gVGhpcyBmdW5jdGlvbgorICBpcyBvcHRpb25hbCwgYnV0IG11c3QgYmUgcHJvdmlkZWQgaWYgYW55IHJlYWRhYmxlIGF0dHJpYnV0ZXMgZXhpc3QuCisKKyogd3JpdGU6IFBvaW50ZXIgdG8gYSBmdW5jdGlvbiBmb3Igd3JpdGluZyBhIHZhbHVlIHRvIHRoZSBjaGlwLiBUaGlzIGZ1bmN0aW9uIGlzCisgIG9wdGlvbmFsLCBidXQgbXVzdCBiZSBwcm92aWRlZCBpZiBhbnkgd3JpdGVhYmxlIGF0dHJpYnV0ZXMgZXhpc3QuCisKK0VhY2ggc2Vuc29yIGNoYW5uZWwgaXMgZGVzY3JpYmVkIHdpdGggc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbywgd2hpY2ggaXMKK2RlZmluZWQgYXMgZm9sbG93cy4KKworc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyB7CisJZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZTsKKwl1MzIgKmNvbmZpZzsKK307CisKK0l0IGNvbnRhaW5zIGZvbGxvd2luZyBmaWVsZHM6CisKKyogdHlwZTogVGhlIGhhcmR3YXJlIG1vbml0b3Jpbmcgc2Vuc29yIHR5cGUuCisgIFN1cHBvcnRlZCBzZW5zb3IgdHlwZXMgYXJlCisgICogaHdtb25fY2hpcAkJQSB2aXJ0dWFsIHNlbnNvciB0eXBlLCB1c2VkIHRvIGRlc2NyaWJlIGF0dHJpYnV0ZXMKKwkJCXdoaWNoIGFwcGx5IHRvIHRoZSBlbnRpcmUgY2hpcC4KKyAgKiBod21vbl90ZW1wCQlUZW1wZXJhdHVyZSBzZW5zb3IKKyAgKiBod21vbl9pbgkJVm9sdGFnZSBzZW5zb3IKKyAgKiBod21vbl9jdXJyCQlDdXJyZW50IHNlbnNvcgorICAqIGh3bW9uX3Bvd2VyCQlQb3dlciBzZW5zb3IKKyAgKiBod21vbl9lbmVyZ3kJRW5lcmd5IHNlbnNvcgorICAqIGh3bW9uX2h1bWlkaXR5CUh1bWlkaXR5IHNlbnNvcgorICAqIGh3bW9uX2ZhbgkJRmFuIHNwZWVkIHNlbnNvcgorICAqIGh3bW9uX3B3bQkJUFdNIGNvbnRyb2wKKworKiBjb25maWc6IFBvaW50ZXIgdG8gYSAwLXRlcm1pbmF0ZWQgbGlzdCBvZiBjb25maWd1cmF0aW9uIHZhbHVlcyBmb3IgZWFjaAorICBzZW5zb3Igb2YgdGhlIGdpdmVuIHR5cGUuIEVhY2ggdmFsdWUgaXMgYSBjb21iaW5hdGlvbiBvZiBiaXQgdmFsdWVzCisgIGRlc2NyaWJpbmcgdGhlIGF0dHJpYnV0ZXMgc3VwcG9zZWQgYnkgYSBzaW5nbGUgc2Vuc29yLgorCitBcyBhbiBleGFtcGxlLCBoZXJlIGlzIHRoZSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBmaWxlIGZvciBhIExNNzUgY29tcGF0aWJsZQorc2Vuc29yIGNoaXAuIFRoZSBjaGlwIGhhcyBhIHNpbmdsZSB0ZW1wZXJhdHVyZSBzZW5zb3IuIFRoZSBkcml2ZXIgd2FudHMgdG8KK3JlZ2lzdGVyIHdpdGggdGhlIHRoZXJtYWwgc3Vic3lzdGVtIChIV01PTl9DX1JFR0lTVEVSX1RaKSwgYW5kIGl0IHN1cHBvcnRzCit0aGUgdXBkYXRlX2ludGVydmFsIGF0dHJpYnV0ZSAoSFdNT05fQ19VUERBVEVfSU5URVJWQUwpLiBUaGUgY2hpcCBzdXBwb3J0cworcmVhZGluZyB0aGUgdGVtcGVyYXR1cmUgKEhXTU9OX1RfSU5QVVQpLCBpdCBoYXMgYSBtYXhpbXVtIHRlbXBlcmF0dXJlCityZWdpc3RlciAoSFdNT05fVF9NQVgpIGFzIHdlbGwgYXMgYSBtYXhpbXVtIHRlbXBlcmF0dXJlIGh5c3RlcmVzaXMgcmVnaXN0ZXIKKyhIV01PTl9UX01BWF9IWVNUKS4KKworc3RhdGljIGNvbnN0IHUzMiBsbTc1X2NoaXBfY29uZmlnW10gPSB7CisJSFdNT05fQ19SRUdJU1RFUl9UWiB8IEhXTU9OX0NfVVBEQVRFX0lOVEVSVkFMLAorCTAKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIGxtNzVfY2hpcCA9IHsKKwkudHlwZSA9IGh3bW9uX2NoaXAsCisJLmNvbmZpZyA9IGxtNzVfY2hpcF9jb25maWcsCit9OworCitzdGF0aWMgY29uc3QgdTMyIGxtNzVfdGVtcF9jb25maWdbXSA9IHsKKwlIV01PTl9UX0lOUFVUIHwgSFdNT05fVF9NQVggfCBIV01PTl9UX01BWF9IWVNULAorCTAKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIGxtNzVfdGVtcCA9IHsKKwkudHlwZSA9IGh3bW9uX3RlbXAsCisJLmNvbmZpZyA9IGxtNzVfdGVtcF9jb25maWcsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyAqbG03NV9pbmZvW10gPSB7CisJJmxtNzVfY2hpcCwKKwkmbG03NV90ZW1wLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fb3BzIGxtNzVfaHdtb25fb3BzID0geworCS5pc192aXNpYmxlID0gbG03NV9pc192aXNpYmxlLAorCS5yZWFkID0gbG03NV9yZWFkLAorCS53cml0ZSA9IGxtNzVfd3JpdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoaXBfaW5mbyBsbTc1X2NoaXBfaW5mbyA9IHsKKwkub3BzID0gJmxtNzVfaHdtb25fb3BzLAorCS5pbmZvID0gbG03NV9pbmZvLAorfTsKKworQSBjb21wbGV0ZSBsaXN0IG9mIGJpdCB2YWx1ZXMgaW5kaWNhdGluZyBpbmRpdmlkdWFsIGF0dHJpYnV0ZSBzdXBwb3J0CitpcyBkZWZpbmVkIGluIGluY2x1ZGUvbGludXgvaHdtb24uaC4gRGVmaW5pdGlvbiBwcmVmaXhlcyBhcmUgYXMgZm9sbG93cy4KKworSFdNT05fQ194eHh4CUNoaXAgYXR0cmlidXRlcywgZm9yIHVzZSB3aXRoIGh3bW9uX2NoaXAuCitIV01PTl9UX3h4eHgJVGVtcGVyYXR1cmUgYXR0cmlidXRlcywgZm9yIHVzZSB3aXRoIGh3bW9uX3RlbXAuCitIV01PTl9JX3h4eHgJVm9sdGFnZSBhdHRyaWJ1dGVzLCBmb3IgdXNlIHdpdGggaHdtb25faW4uCitIV01PTl9DX3h4eHgJQ3VycmVudCBhdHRyaWJ1dGVzLCBmb3IgdXNlIHdpdGggaHdtb25fY3Vyci4KKwkJTm90aWNlIHRoZSBwcmVmaXggb3ZlcmxhcCB3aXRoIGNoaXAgYXR0cmlidXRlcy4KK0hXTU9OX1BfeHh4eAlQb3dlciBhdHRyaWJ1dGVzLCBmb3IgdXNlIHdpdGggaHdtb25fcG93ZXIuCitIV01PTl9FX3h4eHgJRW5lcmd5IGF0dHJpYnV0ZXMsIGZvciB1c2Ugd2l0aCBod21vbl9lbmVyZ3kuCitIV01PTl9IX3h4eHgJSHVtaWRpdHkgYXR0cmlidXRlcywgZm9yIHVzZSB3aXRoIGh3bW9uX2h1bWlkaXR5LgorSFdNT05fRl94eHh4CUZhbiBzcGVlZCBhdHRyaWJ1dGVzLCBmb3IgdXNlIHdpdGggaHdtb25fZmFuLgorSFdNT05fUFdNX3h4eHgJUFdNIGNvbnRyb2wgYXR0cmlidXRlcywgZm9yIHVzZSB3aXRoIGh3bW9uX3B3bS4KKworRHJpdmVyIGNhbGxiYWNrIGZ1bmN0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFYWNoIGRyaXZlciBwcm92aWRlcyBpc192aXNpYmxlLCByZWFkLCBhbmQgd3JpdGUgZnVuY3Rpb25zLiBQYXJhbWV0ZXJzCithbmQgcmV0dXJuIHZhbHVlcyBmb3IgdGhvc2UgZnVuY3Rpb25zIGFyZSBhcyBmb2xsb3dzLgorCit1bW9kZV90IGlzX3Zpc2libGVfZnVuYyhjb25zdCB2b2lkICpkYXRhLCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkJdTMyIGF0dHIsIGludCBjaGFubmVsKQorCitQYXJhbWV0ZXJzOgorCWRhdGE6CVBvaW50ZXIgdG8gZGV2aWNlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUuCisJdHlwZToJVGhlIHNlbnNvciB0eXBlLgorCWF0dHI6CUF0dHJpYnV0ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIGF0dHJpYnV0ZS4KKwkJRm9yIGV4YW1wbGUsIHRoZSBhdHRyaWJ1dGUgdmFsdWUgZm9yIEhXTU9OX1RfSU5QVVQgd291bGQgYmUKKwkJaHdtb25fdGVtcF9pbnB1dC4gRm9yIGNvbXBsZXRlIG1hcHBpbmdzIG9mIGJpdCBmaWVsZHMgdG8KKwkJYXR0cmlidXRlIHZhbHVlcyBwbGVhc2Ugc2VlIGluY2x1ZGUvbGludXgvaHdtb24uaC4KKwljaGFubmVsOlRoZSBzZW5zb3IgY2hhbm5lbCBudW1iZXIuCisKK1JldHVybiB2YWx1ZToKKwlUaGUgZmlsZSBtb2RlIGZvciB0aGlzIGF0dHJpYnV0ZS4gVHlwaWNhbGx5LCB0aGlzIHdpbGwgYmUgMCAodGhlCisJYXR0cmlidXRlIHdpbGwgbm90IGJlIGNyZWF0ZWQpLCBTX0lSVUdPLCBvciAnU19JUlVHTyB8IFNfSVdVU1InLgorCitpbnQgcmVhZF9mdW5jKHN0cnVjdCBkZXZpY2UgKmRldiwgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkgICAgICB1MzIgYXR0ciwgaW50IGNoYW5uZWwsIGxvbmcgKnZhbCkKKworUGFyYW1ldGVyczoKKwlkZXY6CVBvaW50ZXIgdG8gdGhlIGhhcmR3YXJlIG1vbml0b3JpbmcgZGV2aWNlLgorCXR5cGU6CVRoZSBzZW5zb3IgdHlwZS4KKwlhdHRyOglBdHRyaWJ1dGUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBhdHRyaWJ1dGUuCisJCUZvciBleGFtcGxlLCB0aGUgYXR0cmlidXRlIHZhbHVlIGZvciBIV01PTl9UX0lOUFVUIHdvdWxkIGJlCisJCWh3bW9uX3RlbXBfaW5wdXQuIEZvciBjb21wbGV0ZSBtYXBwaW5ncyBwbGVhc2Ugc2VlCisJCWluY2x1ZGUvbGludXgvaHdtb24uaC4KKwljaGFubmVsOlRoZSBzZW5zb3IgY2hhbm5lbCBudW1iZXIuCisJdmFsOglQb2ludGVyIHRvIGF0dHJpYnV0ZSB2YWx1ZS4KKworUmV0dXJuIHZhbHVlOgorCTAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIgb3RoZXJ3aXNlLgorCitpbnQgd3JpdGVfZnVuYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJICAgICAgIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyB2YWwpCisKK1BhcmFtZXRlcnM6CisJZGV2OglQb2ludGVyIHRvIHRoZSBoYXJkd2FyZSBtb25pdG9yaW5nIGRldmljZS4KKwl0eXBlOglUaGUgc2Vuc29yIHR5cGUuCisJYXR0cjoJQXR0cmlidXRlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgYXR0cmlidXRlLgorCQlGb3IgZXhhbXBsZSwgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBmb3IgSFdNT05fVF9JTlBVVCB3b3VsZCBiZQorCQlod21vbl90ZW1wX2lucHV0LiBGb3IgY29tcGxldGUgbWFwcGluZ3MgcGxlYXNlIHNlZQorCQlpbmNsdWRlL2xpbnV4L2h3bW9uLmguCisJY2hhbm5lbDpUaGUgc2Vuc29yIGNoYW5uZWwgbnVtYmVyLgorCXZhbDoJVGhlIHZhbHVlIHRvIHdyaXRlIHRvIHRoZSBjaGlwLgorCitSZXR1cm4gdmFsdWU6CisJMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm9yIG51bWJlciBvdGhlcndpc2UuCisKKworRHJpdmVyLXByb3ZpZGVkIHN5c2ZzIGF0dHJpYnV0ZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHRoZSBoYXJkd2FyZSBtb25pdG9yaW5nIGRldmljZSBpcyByZWdpc3RlcmVkIHdpdGgKK2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8gb3IgZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvLAoraXQgaXMgbW9zdCBsaWtlbHkgbm90IG5lY2Vzc2FyeSB0byBwcm92aWRlIHN5c2ZzIGF0dHJpYnV0ZXMuIE9ubHkgbm9uLXN0YW5kYXJkCitzeXNmcyBhdHRyaWJ1dGVzIG5lZWQgdG8gYmUgcHJvdmlkZWQgd2hlbiBvbmUgb2YgdGhvc2UgcmVnaXN0cmF0aW9uIGZ1bmN0aW9ucworaXMgdXNlZC4KIAogVGhlIGhlYWRlciBmaWxlIGxpbnV4L2h3bW9uLXN5c2ZzLmggcHJvdmlkZXMgYSBudW1iZXIgb2YgdXNlZnVsIG1hY3JvcyB0bwogZGVjbGFyZSBhbmQgdXNlIGhhcmR3YXJlIG1vbml0b3Jpbmcgc3lzZnMgYXR0cmlidXRlcy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vbWF4NjY1MCBiL0RvY3VtZW50YXRpb24vaHdtb24vbWF4NjY1MAppbmRleCA1OGQ5NjQ0Li5kZmYxZDI5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL21heDY2NTAKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9tYXg2NjUwCkBAIC0zNCw2ICszNCw3IEBACiBmYW40X2lucHV0CXJvCSIKIGZhbjFfdGFyZ2V0CXJ3CWRlc2lyZWQgZmFuIHNwZWVkIGluIFJQTSAoY2xvc2VkIGxvb3AgbW9kZSBvbmx5KQogcHdtMV9lbmFibGUJcncJcmVndWxhdG9yIG1vZGUsIDA9ZnVsbCBvbiwgMT1vcGVuIGxvb3AsIDI9Y2xvc2VkIGxvb3AKKwkJCTM9b2ZmCiBwd20xCQlydwlyZWxhdGl2ZSBzcGVlZCAoMC0yNTUpLCAyNTU9bWF4LiBzcGVlZC4KIAkJCVVzZWQgaW4gb3BlbiBsb29wIG1vZGUgb25seS4KIGZhbjFfZGl2CXJ3CXNldHMgdGhlIHNwZWVkIHJhbmdlIHRoZSBpbnB1dHMgY2FuIGhhbmRsZS4gTGVnYWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vdWNkOTAwMCBiL0RvY3VtZW50YXRpb24vaHdtb24vdWNkOTAwMAppbmRleCA4MDVlMzNlLi4yNjJlNzEzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL3VjZDkwMDAKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi91Y2Q5MDAwCkBAIC0yLDEyICsyLDEzIEBACiA9PT09PT09PT09PT09PT09PT09PT0KIAogU3VwcG9ydGVkIGNoaXBzOgotICAqIFRJIFVDRDkwMTIwLCBVQ0Q5MDEyNCwgVUNEOTA5MCwgYW5kIFVDRDkwOTEwCi0gICAgUHJlZml4ZXM6ICd1Y2Q5MDEyMCcsICd1Y2Q5MDEyNCcsICd1Y2Q5MDkwJywgJ3VjZDkwOTEwJworICAqIFRJIFVDRDkwMTIwLCBVQ0Q5MDEyNCwgVUNEOTAxNjAsIFVDRDkwOTAsIGFuZCBVQ0Q5MDkxMAorICAgIFByZWZpeGVzOiAndWNkOTAxMjAnLCAndWNkOTAxMjQnLCAndWNkOTAxNjAnLCAndWNkOTA5MCcsICd1Y2Q5MDkxMCcKICAgICBBZGRyZXNzZXMgc2Nhbm5lZDogLQogICAgIERhdGFzaGVldHM6CiAJaHR0cDovL2ZvY3VzLnRpLmNvbS9saXQvZHMvc3ltbGluay91Y2Q5MDEyMC5wZGYKIAlodHRwOi8vZm9jdXMudGkuY29tL2xpdC9kcy9zeW1saW5rL3VjZDkwMTI0LnBkZgorCWh0dHA6Ly9mb2N1cy50aS5jb20vbGl0L2RzL3N5bWxpbmsvdWNkOTAxNjAucGRmCiAJaHR0cDovL2ZvY3VzLnRpLmNvbS9saXQvZHMvc3ltbGluay91Y2Q5MDkwLnBkZgogCWh0dHA6Ly9mb2N1cy50aS5jb20vbGl0L2RzL3N5bWxpbmsvdWNkOTA5MTAucGRmCiAKQEAgLTMyLDYgKzMzLDEzIEBACiBmdW5jdGlvbmFsaXR5LiBVc2luZyB0aGVzZSBwaW5zLCB0aGUgVUNEOTAxMjQgb2ZmZXJzIHN1cHBvcnQgZm9yIGZhbiBjb250cm9sLAogbWFyZ2luaW5nLCBhbmQgZ2VuZXJhbC1wdXJwb3NlIFBXTSBmdW5jdGlvbnMuCiAKK1RoZSBVQ0Q5MDE2MCBpcyBhIDE2LXJhaWwgUE1CdXMvSTJDIGFkZHJlc3NhYmxlIHBvd2VyLXN1cHBseSBzZXF1ZW5jZXIgYW5kCittb25pdG9yLiBUaGUgZGV2aWNlIGludGVncmF0ZXMgYSAxMi1iaXQgQURDIGZvciBtb25pdG9yaW5nIHVwIHRvIDE2IHBvd2VyLXN1cHBseQordm9sdGFnZSBpbnB1dHMuIFR3ZW50eS1zaXggR1BJTyBwaW5zIGNhbiBiZSB1c2VkIGZvciBwb3dlciBzdXBwbHkgZW5hYmxlcywKK3Bvd2VyLW9uIHJlc2V0IHNpZ25hbHMsIGV4dGVybmFsIGludGVycnVwdHMsIGNhc2NhZGluZywgb3Igb3RoZXIgc3lzdGVtCitmdW5jdGlvbnMuIFR3ZWx2ZSBvZiB0aGVzZSBwaW5zIG9mZmVyIFBXTSBmdW5jdGlvbmFsaXR5LiBVc2luZyB0aGVzZSBwaW5zLCB0aGUKK1VDRDkwMTYwIG9mZmVycyBzdXBwb3J0IGZvciBtYXJnaW5pbmcsIGFuZCBnZW5lcmFsLXB1cnBvc2UgUFdNIGZ1bmN0aW9ucy4KKwogVGhlIFVDRDkwOTAgaXMgYSAxMC1yYWlsIFBNQnVzL0kyQyBhZGRyZXNzYWJsZSBwb3dlci1zdXBwbHkgc2VxdWVuY2VyIGFuZAogbW9uaXRvci4gVGhlIGRldmljZSBpbnRlZ3JhdGVzIGEgMTItYml0IEFEQyBmb3IgbW9uaXRvcmluZyB1cCB0byAxMCBwb3dlci1zdXBwbHkKIHZvbHRhZ2UgaW5wdXRzLiBUd2VudHktdGhyZWUgR1BJTyBwaW5zIGNhbiBiZSB1c2VkIGZvciBwb3dlciBzdXBwbHkgZW5hYmxlcywKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24veGdlbmUtaHdtb24gYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3hnZW5lLWh3bW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYzUwZWQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3hnZW5lLWh3bW9uCkBAIC0wLDAgKzEsMzAgQEAKK0tlcm5lbCBkcml2ZXIgeGdlbmUtaHdtb24KKz09PT09PT09PT09PT09PT09PT09PT09PQorCitTdXBwb3J0ZWQgY2hpcHM6CisgKiBBUE0gWC1HZW5lIFNvQworCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworVGhpcyBkcml2ZXIgYWRkcyBoYXJkd2FyZSB0ZW1wZXJhdHVyZSBhbmQgcG93ZXIgcmVhZGluZyBzdXBwb3J0IGZvcgorQVBNIFgtR2VuZSBTb0MgdXNpbmcgdGhlIG1haWxib3ggY29tbXVuaWNhdGlvbiBpbnRlcmZhY2UuCitGb3IgZGV2aWNlIHRyZWUsIGl0IGlzIHRoZSBzdGFuZGFyZCBEVCBtYWlsYm94LgorRm9yIEFDUEksIGl0IGlzIHRoZSBQQ0MgbWFpbGJveC4KKworVGhlIGZvbGxvd2luZyBzZW5zb3JzIGFyZSBzdXBwb3J0ZWQKKworICAqIFRlbXBlcmF0dXJlCisgICAgLSBTb0Mgb24tZGllIHRlbXBlcmF0dXJlIGluIG1pbGxpLWRlZ3JlZSBDCisgICAgLSBBbGFybSB3aGVuIGhpZ2gvb3ZlciB0ZW1wZXJhdHVyZSBvY2N1cnMKKyAgKiBQb3dlcgorICAgIC0gQ1BVIHBvd2VyIGluIHVXCisgICAgLSBJTyBwb3dlciBpbiB1VworCitzeXNmcy1JbnRlcmZhY2UKKy0tLS0tLS0tLS0tLS0tLQorCit0ZW1wMF9pbnB1dCAtIFNvQyBvbi1kaWUgdGVtcGVyYXR1cmUgKG1pbGxpLWRlZ3JlZSBDKQordGVtcDBfY3JpdGljYWxfYWxhcm0gLSBBbiAxIHdvdWxkIGluZGljYXRlcyBvbi1kaWUgdGVtcGVyYXR1cmUgZXhjZWVkZWQgdGhyZXNob2xkCitwb3dlcjBfaW5wdXQgLSBDUFUgcG93ZXIgaW4gKHVXKQorcG93ZXIxX2lucHV0IC0gSU8gcG93ZXIgaW4gKHVXKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvc2xhdmUtaW50ZXJmYWNlIGIvRG9jdW1lbnRhdGlvbi9pMmMvc2xhdmUtaW50ZXJmYWNlCmluZGV4IDgwODA3YWQuLjdlMmEyMjggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaTJjL3NsYXZlLWludGVyZmFjZQorKysgYi9Eb2N1bWVudGF0aW9uL2kyYy9zbGF2ZS1pbnRlcmZhY2UKQEAgLTE0NSw2ICsxNDUsMTEgQEAKIAogKiBDYXRjaCB0aGUgc2xhdmUgaW50ZXJydXB0cyBhbmQgc2VuZCBhcHByb3ByaWF0ZSBpMmNfc2xhdmVfZXZlbnRzIHRvIHRoZSBiYWNrZW5kLgogCitOb3RlIHRoYXQgbW9zdCBoYXJkd2FyZSBzdXBwb3J0cyBiZWluZyBtYXN0ZXIgX2FuZF8gc2xhdmUgb24gdGhlIHNhbWUgYnVzLiBTbywKK2lmIHlvdSBleHRlbmQgYSBidXMgZHJpdmVyLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgdGhlIGRyaXZlciBzdXBwb3J0cyB0aGF0IGFzCit3ZWxsLiBJbiBhbG1vc3QgYWxsIGNhc2VzLCBzbGF2ZSBzdXBwb3J0IGRvZXMgbm90IG5lZWQgdG8gZGlzYWJsZSB0aGUgbWFzdGVyCitmdW5jdGlvbmFsaXR5LgorCiBDaGVjayB0aGUgaTJjLXJjYXIgZHJpdmVyIGFzIGFuIGV4YW1wbGUuCiAKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9paW8vaWlvX2NvbmZpZ2ZzLnR4dCBiL0RvY3VtZW50YXRpb24vaWlvL2lpb19jb25maWdmcy50eHQKaW5kZXggZjBhZGQzNS4uNGU1ZjEwMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9paW8vaWlvX2NvbmZpZ2ZzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lpby9paW9fY29uZmlnZnMudHh0CkBAIC04Miw4ICs4Miw4IEBACiAKIGUuZzoKIAotJCBta2RpciAvY29uZmlnL3RyaWdnZXJzL2hydGltZXIvaW5zdGFuY2UxCi0kIHJtZGlyIC9jb25maWcvdHJpZ2dlcnMvaHJ0aW1lci9pbnN0YW5jZTEKKyQgbWtkaXIgL2NvbmZpZy9paW8vdHJpZ2dlcnMvaHJ0aW1lci9pbnN0YW5jZTEKKyQgcm1kaXIgL2NvbmZpZy9paW8vdHJpZ2dlcnMvaHJ0aW1lci9pbnN0YW5jZTEKIAogRWFjaCB0cmlnZ2VyIGNhbiBoYXZlIG9uZSBvciBtb3JlIGF0dHJpYnV0ZXMgc3BlY2lmaWMgdG8gdGhlIHRyaWdnZXIgdHlwZS4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pbmRleC5yc3QgYi9Eb2N1bWVudGF0aW9uL2luZGV4LnJzdAppbmRleCBlMGZjNzI5Li5kOWNjYjk0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2luZGV4LnJzdAorKysgYi9Eb2N1bWVudGF0aW9uL2luZGV4LnJzdApAQCAtNiwyMiArNiwxOSBAQAogV2VsY29tZSB0byBUaGUgTGludXggS2VybmVsJ3MgZG9jdW1lbnRhdGlvbiEKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLU5vdGhpbmcgZm9yIHlvdSB0byBzZWUgaGVyZSAqeWV0Ki4gUGxlYXNlIG1vdmUgYWxvbmcuCi0KIENvbnRlbnRzOgogCiAuLiB0b2N0cmVlOjoKICAgIDptYXhkZXB0aDogMgogCiAgICBrZXJuZWwtZG9jdW1lbnRhdGlvbgotICAgbWVkaWEvbWVkaWFfdWFwaQotICAgbWVkaWEvbWVkaWFfa2FwaQotICAgbWVkaWEvZHZiLWRyaXZlcnMvaW5kZXgKLSAgIG1lZGlhL3Y0bC1kcml2ZXJzL2luZGV4CisgICBkZXZlbG9wbWVudC1wcm9jZXNzL2luZGV4CisgICBkZXYtdG9vbHMvdG9vbHMKKyAgIGRyaXZlci1hcGkvaW5kZXgKKyAgIG1lZGlhL2luZGV4CiAgICBncHUvaW5kZXgKIAogSW5kaWNlcyBhbmQgdGFibGVzCiA9PT09PT09PT09PT09PT09PT0KIAogKiA6cmVmOmBnZW5pbmRleGAKLSogOnJlZjpgc2VhcmNoYApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pbmZpbmliYW5kL3N5c2ZzLnR4dCBiL0RvY3VtZW50YXRpb24vaW5maW5pYmFuZC9zeXNmcy50eHQKaW5kZXggNDViY2FmZS4uNzc1NzBkMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pbmZpbmliYW5kL3N5c2ZzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2luZmluaWJhbmQvc3lzZnMudHh0CkBAIC04OSw2ICs4OSwzNiBAQAogICAgbmN0eHRzIC0gbnVtYmVyIG9mIGFsbG93ZWQgY29udGV4dHMgKFBTTTIpCiAgICBjaGlwX3Jlc2V0IC0gZGlhZ25vc3RpYyAocm9vdCBvbmx5KQogICAgYm9hcmR2ZXJzaW9uIC0gYm9hcmQgdmVyc2lvbgorCisgICBzZG1hPE4+LyAtIG9uZSBkaXJlY3RvcnkgcGVyIHNkbWEgZW5naW5lICgwIC0gMTUpCisJc2RtYTxOPi9jcHVfbGlzdCAtIHJlYWQtd3JpdGUsIGxpc3Qgb2YgY3B1cyBmb3IgdXNlci1wcm9jZXNzIHRvIHNkbWEKKwkJCSAgIGVuZ2luZSBhc3NpZ25tZW50LgorCXNkbWE8Tj4vdmwgLSByZWFkLW9ubHksIHZsIHRoZSBzZG1hIGVuZ2luZSBtYXBzIHRvLgorCisJVGhlIG5ldyBpbnRlcmZhY2Ugd2lsbCBnaXZlIHRoZSB1c2VyIGNvbnRyb2wgb24gdGhlIGFmZmluaXR5IHNldHRpbmdzCisJZm9yIHRoZSBoZmkxIGRldmljZS4KKwlBcyBhbiBleGFtcGxlLCB0byBzZXQgYW4gc2RtYSBlbmdpbmUgaXJxIGFmZmluaXR5IGFuZCB0aHJlYWQgYWZmaW5pdHkKKwlvZiBhIHVzZXIgcHJvY2Vzc2VzIHRvIHVzZSB0aGUgc2RtYSBlbmdpbmUsIHdoaWNoIGlzICJuZWFyIiBpbiB0ZXJtcworCW9mIE5VTUEgY29uZmlndXJhdGlvbiwgb3IgcGh5c2ljYWwgY3B1IGxvY2F0aW9uLCB0aGUgdXNlciB3aWxsIGRvOgorCisJZWNobyAiMyIgPiAvcHJvYy9pcnEvPE4+L3NtcF9hZmZpbml0eV9saXN0CisJZWNobyAiNC03IiA+IC9zeXMvZGV2aWNlcy8uLi4vc2RtYTMvY3B1X2xpc3QKKwljYXQgL3N5cy9kZXZpY2VzLy4uLi9zZG1hMy92bAorCTAKKwllY2hvICI4IiA+IC9wcm9jL2lycS88TT4vc21wX2FmZmluaXR5X2xpc3QKKwllY2hvICI5LTEyIiA+IC9zeXMvZGV2aWNlcy8uLi4vc2RtYTQvY3B1X2xpc3QKKwljYXQgL3N5cy9kZXZpY2VzLy4uLi9zZG1hNC92bAorCTEKKworCXRvIG1ha2Ugc3VyZSB0aGF0IHdoZW4gYSBwcm9jZXNzIHJ1bnMgb24gY3B1cyA0LDUsNiwgb3IgNywKKwlhbmQgdXNlcyB2bD0wLCB0aGVuIHNkbWEgZW5naW5lIDMgaXMgc2VsZWN0ZWQgYnkgdGhlIGRyaXZlciwKKwlhbmQgYWxzbyB0aGUgaW50ZXJydXB0IG9mIHRoZSBzZG1hIGVuZ2luZSAzIGlzIHN0ZWVyZWQgdG8gY3B1IDMuCisJU2ltaWxhcmx5LCB3aGVuIGEgcHJvY2VzcyBydW5zIG9uIGNwdXMgOSwxMCwxMSwgb3IgMTIgYW5kIHNldHMgdmw9MSwKKwl0aGVuIGVuZ2luZSA0IHdpbGwgYmUgc2VsZWN0ZWQgYW5kIHRoZSBpcnEgb2YgdGhlIHNkbWEgZW5naW5lIDQgaXMKKwlzdGVlcmVkIHRvIGNwdSA4LgorCVRoaXMgYXNzdW1lcyB0aGF0IGluIHRoZSBhYm92ZSBOIGlzIHRoZSBpcnEgbnVtYmVyIG9mICJzZG1hMyIsCisJYW5kIE0gaXMgaXJxIG51bWJlciBvZiAic2RtYTQiIGluIHRoZSAvcHJvYy9pbnRlcnJ1cHRzIGZpbGUuCisKICAgIHBvcnRzLzEvCiAgICAgICAgICAgQ0NNZ3RBLwogICAgICAgICAgICAgICAgY2Nfc2V0dGluZ3NfYmluIC0gQ0NBIHRhYmxlcyB1c2VkIGJ5IFBTTTIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaW9jdGwvYm90Y2hpbmctdXAtaW9jdGxzLnR4dCBiL0RvY3VtZW50YXRpb24vaW9jdGwvYm90Y2hpbmctdXAtaW9jdGxzLnR4dAppbmRleCBjYzMwYjE0Li4zNjEzOGM2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2lvY3RsL2JvdGNoaW5nLXVwLWlvY3Rscy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9pb2N0bC9ib3RjaGluZy11cC1pb2N0bHMudHh0CkBAIC0zNCwxNSArMzQsMTggQEAKICAgIDY0LWJpdCBwbGF0Zm9ybXMgZG8uIFNvIHdlIGFsd2F5cyBuZWVkIHBhZGRpbmcgdG8gdGhlIG5hdHVyYWwgc2l6ZSB0byBnZXQKICAgIHRoaXMgcmlnaHQuCiAKLSAqIFBhZCB0aGUgZW50aXJlIHN0cnVjdCB0byBhIG11bHRpcGxlIG9mIDY0LWJpdHMgLSB0aGUgc3RydWN0dXJlIHNpemUgd2lsbAotICAgb3RoZXJ3aXNlIGRpZmZlciBvbiAzMi1iaXQgdmVyc3VzIDY0LWJpdC4gSGF2aW5nIGEgZGlmZmVyZW50IHN0cnVjdHVyZSBzaXplCi0gICBodXJ0cyB3aGVuIHBhc3NpbmcgYXJyYXlzIG9mIHN0cnVjdHVyZXMgdG8gdGhlIGtlcm5lbCwgb3IgaWYgdGhlIGtlcm5lbAotICAgY2hlY2tzIHRoZSBzdHJ1Y3R1cmUgc2l6ZSwgd2hpY2ggZS5nLiB0aGUgZHJtIGNvcmUgZG9lcy4KKyAqIFBhZCB0aGUgZW50aXJlIHN0cnVjdCB0byBhIG11bHRpcGxlIG9mIDY0LWJpdHMgaWYgdGhlIHN0cnVjdHVyZSBjb250YWlucworICAgNjQtYml0IHR5cGVzIC0gdGhlIHN0cnVjdHVyZSBzaXplIHdpbGwgb3RoZXJ3aXNlIGRpZmZlciBvbiAzMi1iaXQgdmVyc3VzCisgICA2NC1iaXQuIEhhdmluZyBhIGRpZmZlcmVudCBzdHJ1Y3R1cmUgc2l6ZSBodXJ0cyB3aGVuIHBhc3NpbmcgYXJyYXlzIG9mCisgICBzdHJ1Y3R1cmVzIHRvIHRoZSBrZXJuZWwsIG9yIGlmIHRoZSBrZXJuZWwgY2hlY2tzIHRoZSBzdHJ1Y3R1cmUgc2l6ZSwgd2hpY2gKKyAgIGUuZy4gdGhlIGRybSBjb3JlIGRvZXMuCiAKICAqIFBvaW50ZXJzIGFyZSBfX3U2NCwgY2FzdCBmcm9tL3RvIGEgdWludHBydF90IG9uIHRoZSB1c2Vyc3BhY2Ugc2lkZSBhbmQKICAgIGZyb20vdG8gYSB2b2lkIF9fdXNlciAqIGluIHRoZSBrZXJuZWwuIFRyeSByZWFsbHkgaGFyZCBub3QgdG8gZGVsYXkgdGhpcwogICAgY29udmVyc2lvbiBvciB3b3JzZSwgZmlkZGxlIHRoZSByYXcgX191NjQgdGhyb3VnaCB5b3VyIGNvZGUgc2luY2UgdGhhdAotICAgZGltaW5pc2hlcyB0aGUgY2hlY2tpbmcgdG9vbHMgbGlrZSBzcGFyc2UgY2FuIHByb3ZpZGUuCisgICBkaW1pbmlzaGVzIHRoZSBjaGVja2luZyB0b29scyBsaWtlIHNwYXJzZSBjYW4gcHJvdmlkZS4gVGhlIG1hY3JvCisgICB1NjRfdG9fdXNlcl9wdHIgY2FuIGJlIHVzZWQgaW4gdGhlIGtlcm5lbCB0byBhdm9pZCB3YXJuaW5ncyBhYm91dCBpbnRlZ2VycworICAgYW5kIHBvaW50cmVzIG9mIGRpZmZlcmVudCBzaXplcy4KIAogCiBCYXNpY3MKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2FzYW4udHh0IGIvRG9jdW1lbnRhdGlvbi9rYXNhbi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZDk1YjMuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9rYXNhbi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotS2VybmVsQWRkcmVzc1Nhbml0aXplciAoS0FTQU4pCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotMC4gT3ZlcnZpZXcKLT09PT09PT09PT09Ci0KLUtlcm5lbEFkZHJlc3NTQU5pdGl6ZXIgKEtBU0FOKSBpcyBhIGR5bmFtaWMgbWVtb3J5IGVycm9yIGRldGVjdG9yLiBJdCBwcm92aWRlcwotYSBmYXN0IGFuZCBjb21wcmVoZW5zaXZlIHNvbHV0aW9uIGZvciBmaW5kaW5nIHVzZS1hZnRlci1mcmVlIGFuZCBvdXQtb2YtYm91bmRzCi1idWdzLgotCi1LQVNBTiB1c2VzIGNvbXBpbGUtdGltZSBpbnN0cnVtZW50YXRpb24gZm9yIGNoZWNraW5nIGV2ZXJ5IG1lbW9yeSBhY2Nlc3MsCi10aGVyZWZvcmUgeW91IHdpbGwgbmVlZCBhIEdDQyB2ZXJzaW9uIDQuOS4yIG9yIGxhdGVyLiBHQ0MgNS4wIG9yIGxhdGVyIGlzCi1yZXF1aXJlZCBmb3IgZGV0ZWN0aW9uIG9mIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgdG8gc3RhY2sgb3IgZ2xvYmFsIHZhcmlhYmxlcy4KLQotQ3VycmVudGx5IEtBU0FOIGlzIHN1cHBvcnRlZCBvbmx5IGZvciB4ODZfNjQgYXJjaGl0ZWN0dXJlLgotCi0xLiBVc2FnZQotPT09PT09PT0KLQotVG8gZW5hYmxlIEtBU0FOIGNvbmZpZ3VyZSBrZXJuZWwgd2l0aDoKLQotCSAgQ09ORklHX0tBU0FOID0geQotCi1hbmQgY2hvb3NlIGJldHdlZW4gQ09ORklHX0tBU0FOX09VVExJTkUgYW5kIENPTkZJR19LQVNBTl9JTkxJTkUuIE91dGxpbmUgYW5kCi1pbmxpbmUgYXJlIGNvbXBpbGVyIGluc3RydW1lbnRhdGlvbiB0eXBlcy4gVGhlIGZvcm1lciBwcm9kdWNlcyBzbWFsbGVyIGJpbmFyeQotdGhlIGxhdHRlciBpcyAxLjEgLSAyIHRpbWVzIGZhc3Rlci4gSW5saW5lIGluc3RydW1lbnRhdGlvbiByZXF1aXJlcyBhIEdDQwotdmVyc2lvbiA1LjAgb3IgbGF0ZXIuCi0KLUtBU0FOIHdvcmtzIHdpdGggYm90aCBTTFVCIGFuZCBTTEFCIG1lbW9yeSBhbGxvY2F0b3JzLgotRm9yIGJldHRlciBidWcgZGV0ZWN0aW9uIGFuZCBuaWNlciByZXBvcnRpbmcsIGVuYWJsZSBDT05GSUdfU1RBQ0tUUkFDRS4KLQotVG8gZGlzYWJsZSBpbnN0cnVtZW50YXRpb24gZm9yIHNwZWNpZmljIGZpbGVzIG9yIGRpcmVjdG9yaWVzLCBhZGQgYSBsaW5lCi1zaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmcgdG8gdGhlIHJlc3BlY3RpdmUga2VybmVsIE1ha2VmaWxlOgotCi0gICAgICAgIEZvciBhIHNpbmdsZSBmaWxlIChlLmcuIG1haW4ubyk6Ci0gICAgICAgICAgICAgICAgS0FTQU5fU0FOSVRJWkVfbWFpbi5vIDo9IG4KLQotICAgICAgICBGb3IgYWxsIGZpbGVzIGluIG9uZSBkaXJlY3Rvcnk6Ci0gICAgICAgICAgICAgICAgS0FTQU5fU0FOSVRJWkUgOj0gbgotCi0xLjEgRXJyb3IgcmVwb3J0cwotPT09PT09PT09PT09PT09PT0KLQotQSB0eXBpY2FsIG91dCBvZiBib3VuZHMgYWNjZXNzIHJlcG9ydCBsb29rcyBsaWtlIHRoaXM6Ci0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQlVHOiBBZGRyZXNzU2FuaXRpemVyOiBvdXQgb2YgYm91bmRzIGFjY2VzcyBpbiBrbWFsbG9jX29vYl9yaWdodCsweDY1LzB4NzUgW3Rlc3Rfa2FzYW5dIGF0IGFkZHIgZmZmZjg4MDA2OTNiYzVkMwotV3JpdGUgb2Ygc2l6ZSAxIGJ5IHRhc2sgbW9kcHJvYmUvMTY4OQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUJVRyBrbWFsbG9jLTEyOCAoTm90IHRhaW50ZWQpOiBrYXNhbiBlcnJvcgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRGlzYWJsaW5nIGxvY2sgZGVidWdnaW5nIGR1ZSB0byBrZXJuZWwgdGFpbnQKLUlORk86IEFsbG9jYXRlZCBpbiBrbWFsbG9jX29vYl9yaWdodCsweDNkLzB4NzUgW3Rlc3Rfa2FzYW5dIGFnZT0wIGNwdT0wIHBpZD0xNjg5Ci0gX19zbGFiX2FsbG9jKzB4NGI0LzB4NGYwCi0ga21lbV9jYWNoZV9hbGxvY190cmFjZSsweDEwYi8weDE5MAotIGttYWxsb2Nfb29iX3JpZ2h0KzB4M2QvMHg3NSBbdGVzdF9rYXNhbl0KLSBpbml0X21vZHVsZSsweDkvMHg0NyBbdGVzdF9rYXNhbl0KLSBkb19vbmVfaW5pdGNhbGwrMHg5OS8weDIwMAotIGxvYWRfbW9kdWxlKzB4MmNiMy8weDNiMjAKLSBTeVNfZmluaXRfbW9kdWxlKzB4NzYvMHg4MAotIHN5c3RlbV9jYWxsX2Zhc3RwYXRoKzB4MTIvMHgxNwotSU5GTzogU2xhYiAweGZmZmZlYTAwMDFhNGVmMDAgb2JqZWN0cz0xNyB1c2VkPTcgZnA9MHhmZmZmODgwMDY5M2JkNzI4IGZsYWdzPTB4MTAwMDAwMDAwMDA0MDgwCi1JTkZPOiBPYmplY3QgMHhmZmZmODgwMDY5M2JjNTU4IEBvZmZzZXQ9MTM2OCBmcD0weGZmZmY4ODAwNjkzYmM3MjAKLQotQnl0ZXMgYjQgZmZmZjg4MDA2OTNiYzU0ODogMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgNWEgNWEgNWEgNWEgNWEgNWEgNWEgNWEgIC4uLi4uLi4uWlpaWlpaWloKLU9iamVjdCBmZmZmODgwMDY5M2JjNTU4OiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiAga2tra2tra2tra2tra2trawotT2JqZWN0IGZmZmY4ODAwNjkzYmM1Njg6IDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiICBra2tra2tra2tra2tra2trCi1PYmplY3QgZmZmZjg4MDA2OTNiYzU3ODogNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgIGtra2tra2tra2tra2tra2sKLU9iamVjdCBmZmZmODgwMDY5M2JjNTg4OiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiAga2tra2tra2tra2tra2trawotT2JqZWN0IGZmZmY4ODAwNjkzYmM1OTg6IDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiICBra2tra2tra2tra2tra2trCi1PYmplY3QgZmZmZjg4MDA2OTNiYzVhODogNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgIGtra2tra2tra2tra2tra2sKLU9iamVjdCBmZmZmODgwMDY5M2JjNWI4OiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiA2YiAga2tra2tra2tra2tra2trawotT2JqZWN0IGZmZmY4ODAwNjkzYmM1Yzg6IDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIDZiIGE1ICBra2tra2tra2tra2tra2suCi1SZWR6b25lIGZmZmY4ODAwNjkzYmM1ZDg6IGNjIGNjIGNjIGNjIGNjIGNjIGNjIGNjICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4uLi4uLgotUGFkZGluZyBmZmZmODgwMDY5M2JjNzE4OiA1YSA1YSA1YSA1YSA1YSA1YSA1YSA1YSAgICAgICAgICAgICAgICAgICAgICAgICAgWlpaWlpaWloKLUNQVTogMCBQSUQ6IDE2ODkgQ29tbTogbW9kcHJvYmUgVGFpbnRlZDogRyAgICBCICAgICAgICAgIDMuMTguMC1yYzEtbW0xKyAjOTgKLUhhcmR3YXJlIG5hbWU6IFFFTVUgU3RhbmRhcmQgUEMgKGk0NDBGWCArIFBJSVgsIDE5OTYpLCBCSU9TIHJlbC0xLjcuNS0wLWdlNTE0ODhjLTIwMTQwNjAyXzE2NDYxMi1uaWxzc29uLmhvbWUua3JheGVsLm9yZyAwNC8wMS8yMDE0Ci0gZmZmZjg4MDA2OTNiYzAwMCAwMDAwMDAwMDAwMDAwMDAwIGZmZmY4ODAwNjkzYmM1NTggZmZmZjg4MDA2OTIzYmI3OAotIGZmZmZmZmZmODFjYzY4YWUgMDAwMDAwMDAwMDAwMDBmMyBmZmZmODgwMDZkNDA3NjAwIGZmZmY4ODAwNjkyM2JiYTgKLSBmZmZmZmZmZjgxMWZkODQ4IGZmZmY4ODAwNmQ0MDc2MDAgZmZmZmVhMDAwMWE0ZWYwMCBmZmZmODgwMDY5M2JjNTU4Ci1DYWxsIFRyYWNlOgotIFs8ZmZmZmZmZmY4MWNjNjhhZT5dIGR1bXBfc3RhY2srMHg0Ni8weDU4Ci0gWzxmZmZmZmZmZjgxMWZkODQ4Pl0gcHJpbnRfdHJhaWxlcisweGY4LzB4MTYwCi0gWzxmZmZmZmZmZmEwMDAyNmE3Pl0gPyBrbWVtX2NhY2hlX29vYisweGMzLzB4YzMgW3Rlc3Rfa2FzYW5dCi0gWzxmZmZmZmZmZjgxMWZmMGY1Pl0gb2JqZWN0X2VycisweDM1LzB4NDAKLSBbPGZmZmZmZmZmYTAwMDIwNjU+XSA/IGttYWxsb2Nfb29iX3JpZ2h0KzB4NjUvMHg3NSBbdGVzdF9rYXNhbl0KLSBbPGZmZmZmZmZmODEyMGI5ZmE+XSBrYXNhbl9yZXBvcnRfZXJyb3IrMHgzOGEvMHgzZjAKLSBbPGZmZmZmZmZmODEyMGE3OWY+XSA/IGthc2FuX3BvaXNvbl9zaGFkb3crMHgyZi8weDQwCi0gWzxmZmZmZmZmZjgxMjBiMzQ0Pl0gPyBrYXNhbl91bnBvaXNvbl9zaGFkb3crMHgxNC8weDQwCi0gWzxmZmZmZmZmZjgxMjBhNzlmPl0gPyBrYXNhbl9wb2lzb25fc2hhZG93KzB4MmYvMHg0MAotIFs8ZmZmZmZmZmZhMDAwMjZhNz5dID8ga21lbV9jYWNoZV9vb2IrMHhjMy8weGMzIFt0ZXN0X2thc2FuXQotIFs8ZmZmZmZmZmY4MTIwYTk5NT5dIF9fYXNhbl9zdG9yZTErMHg3NS8weGIwCi0gWzxmZmZmZmZmZmEwMDAyNjAxPl0gPyBrbWVtX2NhY2hlX29vYisweDFkLzB4YzMgW3Rlc3Rfa2FzYW5dCi0gWzxmZmZmZmZmZmEwMDAyMDY1Pl0gPyBrbWFsbG9jX29vYl9yaWdodCsweDY1LzB4NzUgW3Rlc3Rfa2FzYW5dCi0gWzxmZmZmZmZmZmEwMDAyMDY1Pl0ga21hbGxvY19vb2JfcmlnaHQrMHg2NS8weDc1IFt0ZXN0X2thc2FuXQotIFs8ZmZmZmZmZmZhMDAwMjZiMD5dIGluaXRfbW9kdWxlKzB4OS8weDQ3IFt0ZXN0X2thc2FuXQotIFs8ZmZmZmZmZmY4MTAwMDJkOT5dIGRvX29uZV9pbml0Y2FsbCsweDk5LzB4MjAwCi0gWzxmZmZmZmZmZjgxMWU0ZTVjPl0gPyBfX3Z1bm1hcCsweGVjLzB4MTYwCi0gWzxmZmZmZmZmZjgxMTE0ZjYzPl0gbG9hZF9tb2R1bGUrMHgyY2IzLzB4M2IyMAotIFs8ZmZmZmZmZmY4MTEwZmQ3MD5dID8gbV9zaG93KzB4MjQwLzB4MjQwCi0gWzxmZmZmZmZmZjgxMTE1ZjA2Pl0gU3lTX2Zpbml0X21vZHVsZSsweDc2LzB4ODAKLSBbPGZmZmZmZmZmODFjZDMxMjk+XSBzeXN0ZW1fY2FsbF9mYXN0cGF0aCsweDEyLzB4MTcKLU1lbW9yeSBzdGF0ZSBhcm91bmQgdGhlIGJ1Z2d5IGFkZHJlc3M6Ci0gZmZmZjg4MDA2OTNiYzMwMDogZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMKLSBmZmZmODgwMDY5M2JjMzgwOiBmYyBmYyAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCBmYwotIGZmZmY4ODAwNjkzYmM0MDA6IGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjCi0gZmZmZjg4MDA2OTNiYzQ4MDogZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMKLSBmZmZmODgwMDY5M2JjNTAwOiBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyBmYyAwMCAwMCAwMCAwMCAwMAotPmZmZmY4ODAwNjkzYmM1ODA6IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAzIGZjIGZjIGZjIGZjIGZjCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgotIGZmZmY4ODAwNjkzYmM2MDA6IGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjCi0gZmZmZjg4MDA2OTNiYzY4MDogZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMKLSBmZmZmODgwMDY5M2JjNzAwOiBmYyBmYyBmYyBmYyBmYiBmYiBmYiBmYiBmYiBmYiBmYiBmYiBmYiBmYiBmYiBmYgotIGZmZmY4ODAwNjkzYmM3ODA6IGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiCi0gZmZmZjg4MDA2OTNiYzgwMDogZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIgZmIKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGUgaGVhZGVyIG9mIHRoZSByZXBvcnQgZGlzY3JpYmUgd2hhdCBraW5kIG9mIGJ1ZyBoYXBwZW5lZCBhbmQgd2hhdCBraW5kIG9mCi1hY2Nlc3MgY2F1c2VkIGl0LiBJdCdzIGZvbGxvd2VkIGJ5IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYWNjZXNzZWQgc2x1YiBvYmplY3QKLShzZWUgJ1NMVUIgRGVidWcgb3V0cHV0JyBzZWN0aW9uIGluIERvY3VtZW50YXRpb24vdm0vc2x1Yi50eHQgZm9yIGRldGFpbHMpIGFuZAotdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBhY2Nlc3NlZCBtZW1vcnkgcGFnZS4KLQotSW4gdGhlIGxhc3Qgc2VjdGlvbiB0aGUgcmVwb3J0IHNob3dzIG1lbW9yeSBzdGF0ZSBhcm91bmQgdGhlIGFjY2Vzc2VkIGFkZHJlc3MuCi1SZWFkaW5nIHRoaXMgcGFydCByZXF1aXJlcyBzb21lIHVuZGVyc3RhbmRpbmcgb2YgaG93IEtBU0FOIHdvcmtzLgotCi1UaGUgc3RhdGUgb2YgZWFjaCA4IGFsaWduZWQgYnl0ZXMgb2YgbWVtb3J5IGlzIGVuY29kZWQgaW4gb25lIHNoYWRvdyBieXRlLgotVGhvc2UgOCBieXRlcyBjYW4gYmUgYWNjZXNzaWJsZSwgcGFydGlhbGx5IGFjY2Vzc2libGUsIGZyZWVkIG9yIGJlIGEgcmVkem9uZS4KLVdlIHVzZSB0aGUgZm9sbG93aW5nIGVuY29kaW5nIGZvciBlYWNoIHNoYWRvdyBieXRlOiAwIG1lYW5zIHRoYXQgYWxsIDggYnl0ZXMKLW9mIHRoZSBjb3JyZXNwb25kaW5nIG1lbW9yeSByZWdpb24gYXJlIGFjY2Vzc2libGU7IG51bWJlciBOICgxIDw9IE4gPD0gNykgbWVhbnMKLXRoYXQgdGhlIGZpcnN0IE4gYnl0ZXMgYXJlIGFjY2Vzc2libGUsIGFuZCBvdGhlciAoOCAtIE4pIGJ5dGVzIGFyZSBub3Q7Ci1hbnkgbmVnYXRpdmUgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIGVudGlyZSA4LWJ5dGUgd29yZCBpcyBpbmFjY2Vzc2libGUuCi1XZSB1c2UgZGlmZmVyZW50IG5lZ2F0aXZlIHZhbHVlcyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGRpZmZlcmVudCBraW5kcyBvZgotaW5hY2Nlc3NpYmxlIG1lbW9yeSBsaWtlIHJlZHpvbmVzIG9yIGZyZWVkIG1lbW9yeSAoc2VlIG1tL2thc2FuL2thc2FuLmgpLgotCi1JbiB0aGUgcmVwb3J0IGFib3ZlIHRoZSBhcnJvd3MgcG9pbnQgdG8gdGhlIHNoYWRvdyBieXRlIDAzLCB3aGljaCBtZWFucyB0aGF0Ci10aGUgYWNjZXNzZWQgYWRkcmVzcyBpcyBwYXJ0aWFsbHkgYWNjZXNzaWJsZS4KLQotCi0yLiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzCi09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUZyb20gYSBoaWdoIGxldmVsLCBvdXIgYXBwcm9hY2ggdG8gbWVtb3J5IGVycm9yIGRldGVjdGlvbiBpcyBzaW1pbGFyIHRvIHRoYXQKLW9mIGttZW1jaGVjazogdXNlIHNoYWRvdyBtZW1vcnkgdG8gcmVjb3JkIHdoZXRoZXIgZWFjaCBieXRlIG9mIG1lbW9yeSBpcyBzYWZlCi10byBhY2Nlc3MsIGFuZCB1c2UgY29tcGlsZS10aW1lIGluc3RydW1lbnRhdGlvbiB0byBjaGVjayBzaGFkb3cgbWVtb3J5IG9uIGVhY2gKLW1lbW9yeSBhY2Nlc3MuCi0KLUFkZHJlc3NTYW5pdGl6ZXIgZGVkaWNhdGVzIDEvOCBvZiBrZXJuZWwgbWVtb3J5IHRvIGl0cyBzaGFkb3cgbWVtb3J5Ci0oZS5nLiAxNlRCIHRvIGNvdmVyIDEyOFRCIG9uIHg4Nl82NCkgYW5kIHVzZXMgZGlyZWN0IG1hcHBpbmcgd2l0aCBhIHNjYWxlIGFuZAotb2Zmc2V0IHRvIHRyYW5zbGF0ZSBhIG1lbW9yeSBhZGRyZXNzIHRvIGl0cyBjb3JyZXNwb25kaW5nIHNoYWRvdyBhZGRyZXNzLgotCi1IZXJlIGlzIHRoZSBmdW5jdGlvbiB3aGljaCB0cmFuc2xhdGVzIGFuIGFkZHJlc3MgdG8gaXRzIGNvcnJlc3BvbmRpbmcgc2hhZG93Ci1hZGRyZXNzOgotCi1zdGF0aWMgaW5saW5lIHZvaWQgKmthc2FuX21lbV90b19zaGFkb3coY29uc3Qgdm9pZCAqYWRkcikKLXsKLQlyZXR1cm4gKCh1bnNpZ25lZCBsb25nKWFkZHIgPj4gS0FTQU5fU0hBRE9XX1NDQUxFX1NISUZUKQotCQkrIEtBU0FOX1NIQURPV19PRkZTRVQ7Ci19Ci0KLXdoZXJlIEtBU0FOX1NIQURPV19TQ0FMRV9TSElGVCA9IDMuCi0KLUNvbXBpbGUtdGltZSBpbnN0cnVtZW50YXRpb24gdXNlZCBmb3IgY2hlY2tpbmcgbWVtb3J5IGFjY2Vzc2VzLiBDb21waWxlciBpbnNlcnRzCi1mdW5jdGlvbiBjYWxscyAoX19hc2FuX2xvYWQqKGFkZHIpLCBfX2FzYW5fc3RvcmUqKGFkZHIpKSBiZWZvcmUgZWFjaCBtZW1vcnkKLWFjY2VzcyBvZiBzaXplIDEsIDIsIDQsIDggb3IgMTYuIFRoZXNlIGZ1bmN0aW9ucyBjaGVjayB3aGV0aGVyIG1lbW9yeSBhY2Nlc3MgaXMKLXZhbGlkIG9yIG5vdCBieSBjaGVja2luZyBjb3JyZXNwb25kaW5nIHNoYWRvdyBtZW1vcnkuCi0KLUdDQyA1LjAgaGFzIHBvc3NpYmlsaXR5IHRvIHBlcmZvcm0gaW5saW5lIGluc3RydW1lbnRhdGlvbi4gSW5zdGVhZCBvZiBtYWtpbmcKLWZ1bmN0aW9uIGNhbGxzIEdDQyBkaXJlY3RseSBpbnNlcnRzIHRoZSBjb2RlIHRvIGNoZWNrIHRoZSBzaGFkb3cgbWVtb3J5LgotVGhpcyBvcHRpb24gc2lnbmlmaWNhbnRseSBlbmxhcmdlcyBrZXJuZWwgYnV0IGl0IGdpdmVzIHgxLjEteDIgcGVyZm9ybWFuY2UKLWJvb3N0IG92ZXIgb3V0bGluZSBpbnN0cnVtZW50ZWQga2VybmVsLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rYnVpbGQva2NvbmZpZy1sYW5ndWFnZS50eHQgYi9Eb2N1bWVudGF0aW9uL2tidWlsZC9rY29uZmlnLWxhbmd1YWdlLnR4dAppbmRleCBkYjEwMTg1Li4wNjlmY2IzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tidWlsZC9rY29uZmlnLWxhbmd1YWdlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tidWlsZC9rY29uZmlnLWxhbmd1YWdlLnR4dApAQCAtMjc0LDcgKzI3NCw0NCBAQAogCiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIHNpbXBsZSBjb25maWcgZW50cnkgYWJvdmUsIGJ1dCBpdCBhbHNvIGdpdmVzIGEKIGhpbnQgdG8gZnJvbnQgZW5kcywgdGhhdCBhbGwgc3Vib3B0aW9ucyBzaG91bGQgYmUgZGlzcGxheWVkIGFzIGEKLXNlcGFyYXRlIGxpc3Qgb2Ygb3B0aW9ucy4KK3NlcGFyYXRlIGxpc3Qgb2Ygb3B0aW9ucy4gVG8gbWFrZSBzdXJlIGFsbCB0aGUgc3Vib3B0aW9ucyB3aWxsIHJlYWxseQorc2hvdyB1cCB1bmRlciB0aGUgbWVudWNvbmZpZyBlbnRyeSBhbmQgbm90IG91dHNpZGUgb2YgaXQsIGV2ZXJ5IGl0ZW0KK2Zyb20gdGhlIDxjb25maWcgb3B0aW9ucz4gbGlzdCBtdXN0IGRlcGVuZCBvbiB0aGUgbWVudWNvbmZpZyBzeW1ib2wuCitJbiBwcmFjdGljZSwgdGhpcyBpcyBhY2hpZXZlZCBieSB1c2luZyBvbmUgb2YgdGhlIG5leHQgdHdvIGNvbnN0cnVjdHM6CisKKygxKToKK21lbnVjb25maWcgTQoraWYgTQorICAgIGNvbmZpZyBDMQorICAgIGNvbmZpZyBDMgorZW5kaWYKKworKDIpOgorbWVudWNvbmZpZyBNCitjb25maWcgQzEKKyAgICBkZXBlbmRzIG9uIE0KK2NvbmZpZyBDMgorICAgIGRlcGVuZHMgb24gTQorCitJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGVzICgzKSBhbmQgKDQpLCBDMSBhbmQgQzIgc3RpbGwgaGF2ZSB0aGUgTQorZGVwZW5kZW5jeSwgYnV0IHdpbGwgbm90IGFwcGVhciB1bmRlciBtZW51Y29uZmlnIE0gYW55bW9yZSwgYmVjYXVzZQorb2YgQzAsIHdoaWNoIGRvZXNuJ3QgZGVwZW5kIG9uIE06CisKKygzKToKK21lbnVjb25maWcgTQorICAgIGNvbmZpZyBDMAoraWYgTQorICAgIGNvbmZpZyBDMQorICAgIGNvbmZpZyBDMgorZW5kaWYKKworKDQpOgorbWVudWNvbmZpZyBNCitjb25maWcgQzAKK2NvbmZpZyBDMQorICAgIGRlcGVuZHMgb24gTQorY29uZmlnIEMyCisgICAgZGVwZW5kcyBvbiBNCiAKIGNob2ljZXM6CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2Nvdi50eHQgYi9Eb2N1bWVudGF0aW9uL2tjb3YudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzlmZjRhLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24va2Nvdi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAota2NvdjogY29kZSBjb3ZlcmFnZSBmb3IgZnV6emluZwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1rY292IGV4cG9zZXMga2VybmVsIGNvZGUgY292ZXJhZ2UgaW5mb3JtYXRpb24gaW4gYSBmb3JtIHN1aXRhYmxlIGZvciBjb3ZlcmFnZS0KLWd1aWRlZCBmdXp6aW5nIChyYW5kb21pemVkIHRlc3RpbmcpLiBDb3ZlcmFnZSBkYXRhIG9mIGEgcnVubmluZyBrZXJuZWwgaXMKLWV4cG9ydGVkIHZpYSB0aGUgImtjb3YiIGRlYnVnZnMgZmlsZS4gQ292ZXJhZ2UgY29sbGVjdGlvbiBpcyBlbmFibGVkIG9uIGEgdGFzawotYmFzaXMsIGFuZCB0aHVzIGl0IGNhbiBjYXB0dXJlIHByZWNpc2UgY292ZXJhZ2Ugb2YgYSBzaW5nbGUgc3lzdGVtIGNhbGwuCi0KLU5vdGUgdGhhdCBrY292IGRvZXMgbm90IGFpbSB0byBjb2xsZWN0IGFzIG11Y2ggY292ZXJhZ2UgYXMgcG9zc2libGUuIEl0IGFpbXMKLXRvIGNvbGxlY3QgbW9yZSBvciBsZXNzIHN0YWJsZSBjb3ZlcmFnZSB0aGF0IGlzIGZ1bmN0aW9uIG9mIHN5c2NhbGwgaW5wdXRzLgotVG8gYWNoaWV2ZSB0aGlzIGdvYWwgaXQgZG9lcyBub3QgY29sbGVjdCBjb3ZlcmFnZSBpbiBzb2Z0L2hhcmQgaW50ZXJydXB0cwotYW5kIGluc3RydW1lbnRhdGlvbiBvZiBzb21lIGluaGVyZW50bHkgbm9uLWRldGVybWluaXN0aWMgcGFydHMgb2Yga2VybmVsIGlzCi1kaXNibGVkIChlLmcuIHNjaGVkdWxlciwgbG9ja2luZykuCi0KLVVzYWdlOgotPT09PT09Ci0KLUNvbmZpZ3VyZSBrZXJuZWwgd2l0aDoKLQotICAgICAgICBDT05GSUdfS0NPVj15Ci0KLUNPTkZJR19LQ09WIHJlcXVpcmVzIGdjYyBidWlsdCBvbiByZXZpc2lvbiAyMzEyOTYgb3IgbGF0ZXIuCi1Qcm9maWxpbmcgZGF0YSB3aWxsIG9ubHkgYmVjb21lIGFjY2Vzc2libGUgb25jZSBkZWJ1Z2ZzIGhhcyBiZWVuIG1vdW50ZWQ6Ci0KLSAgICAgICAgbW91bnQgLXQgZGVidWdmcyBub25lIC9zeXMva2VybmVsL2RlYnVnCi0KLVRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBkZW1vbnN0cmF0ZXMga2NvdiB1c2FnZSBmcm9tIHdpdGhpbiBhIHRlc3QgcHJvZ3JhbToKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0KLSNkZWZpbmUgS0NPVl9JTklUX1RSQUNFCQkJX0lPUignYycsIDEsIHVuc2lnbmVkIGxvbmcpCi0jZGVmaW5lIEtDT1ZfRU5BQkxFCQkJX0lPKCdjJywgMTAwKQotI2RlZmluZSBLQ09WX0RJU0FCTEUJCQlfSU8oJ2MnLCAxMDEpCi0jZGVmaW5lIENPVkVSX1NJWkUJCQkoNjQ8PDEwKQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0JaW50IGZkOwotCXVuc2lnbmVkIGxvbmcgKmNvdmVyLCBuLCBpOwotCi0JLyogQSBzaW5nbGUgZmQgZGVzY3JpcHRvciBhbGxvd3MgY292ZXJhZ2UgY29sbGVjdGlvbiBvbiBhIHNpbmdsZQotCSAqIHRocmVhZC4KLQkgKi8KLQlmZCA9IG9wZW4oIi9zeXMva2VybmVsL2RlYnVnL2tjb3YiLCBPX1JEV1IpOwotCWlmIChmZCA9PSAtMSkKLQkJcGVycm9yKCJvcGVuIiksIGV4aXQoMSk7Ci0JLyogU2V0dXAgdHJhY2UgbW9kZSBhbmQgdHJhY2Ugc2l6ZS4gKi8KLQlpZiAoaW9jdGwoZmQsIEtDT1ZfSU5JVF9UUkFDRSwgQ09WRVJfU0laRSkpCi0JCXBlcnJvcigiaW9jdGwiKSwgZXhpdCgxKTsKLQkvKiBNbWFwIGJ1ZmZlciBzaGFyZWQgYmV0d2VlbiBrZXJuZWwtIGFuZCB1c2VyLXNwYWNlLiAqLwotCWNvdmVyID0gKHVuc2lnbmVkIGxvbmcqKW1tYXAoTlVMTCwgQ09WRVJfU0laRSAqIHNpemVvZih1bnNpZ25lZCBsb25nKSwKLQkJCQkgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkLCAwKTsKLQlpZiAoKHZvaWQqKWNvdmVyID09IE1BUF9GQUlMRUQpCi0JCXBlcnJvcigibW1hcCIpLCBleGl0KDEpOwotCS8qIEVuYWJsZSBjb3ZlcmFnZSBjb2xsZWN0aW9uIG9uIHRoZSBjdXJyZW50IHRocmVhZC4gKi8KLQlpZiAoaW9jdGwoZmQsIEtDT1ZfRU5BQkxFLCAwKSkKLQkJcGVycm9yKCJpb2N0bCIpLCBleGl0KDEpOwotCS8qIFJlc2V0IGNvdmVyYWdlIGZyb20gdGhlIHRhaWwgb2YgdGhlIGlvY3RsKCkgY2FsbC4gKi8KLQlfX2F0b21pY19zdG9yZV9uKCZjb3ZlclswXSwgMCwgX19BVE9NSUNfUkVMQVhFRCk7Ci0JLyogVGhhdCdzIHRoZSB0YXJnZXQgc3lzY2FsIGNhbGwuICovCi0JcmVhZCgtMSwgTlVMTCwgMCk7Ci0JLyogUmVhZCBudW1iZXIgb2YgUENzIGNvbGxlY3RlZC4gKi8KLQluID0gX19hdG9taWNfbG9hZF9uKCZjb3ZlclswXSwgX19BVE9NSUNfUkVMQVhFRCk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykKLQkJcHJpbnRmKCIweCVseFxuIiwgY292ZXJbaSArIDFdKTsKLQkvKiBEaXNhYmxlIGNvdmVyYWdlIGNvbGxlY3Rpb24gZm9yIHRoZSBjdXJyZW50IHRocmVhZC4gQWZ0ZXIgdGhpcyBjYWxsCi0JICogY292ZXJhZ2UgY2FuIGJlIGVuYWJsZWQgZm9yIGEgZGlmZmVyZW50IHRocmVhZC4KLQkgKi8KLQlpZiAoaW9jdGwoZmQsIEtDT1ZfRElTQUJMRSwgMCkpCi0JCXBlcnJvcigiaW9jdGwiKSwgZXhpdCgxKTsKLQkvKiBGcmVlIHJlc291cmNlcy4gKi8KLQlpZiAobXVubWFwKGNvdmVyLCBDT1ZFUl9TSVpFICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkKLQkJcGVycm9yKCJtdW5tYXAiKSwgZXhpdCgxKTsKLQlpZiAoY2xvc2UoZmQpKQotCQlwZXJyb3IoImNsb3NlIiksIGV4aXQoMSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLUFmdGVyIHBpcGluZyB0aHJvdWdoIGFkZHIybGluZSBvdXRwdXQgb2YgdGhlIHByb2dyYW0gbG9va3MgYXMgZm9sbG93czoKLQotU3lTX3JlYWQKLWZzL3JlYWRfd3JpdGUuYzo1NjIKLV9fZmRnZXRfcG9zCi1mcy9maWxlLmM6Nzc0Ci1fX2ZnZXRfbGlnaHQKLWZzL2ZpbGUuYzo3NDYKLV9fZmdldF9saWdodAotZnMvZmlsZS5jOjc1MAotX19mZ2V0X2xpZ2h0Ci1mcy9maWxlLmM6NzYwCi1fX2ZkZ2V0X3BvcwotZnMvZmlsZS5jOjc4NAotU3lTX3JlYWQKLWZzL3JlYWRfd3JpdGUuYzo1NjIKLQotSWYgYSBwcm9ncmFtIG5lZWRzIHRvIGNvbGxlY3QgY292ZXJhZ2UgZnJvbSBzZXZlcmFsIHRocmVhZHMgKGluZGVwZW5kZW50bHkpLAotaXQgbmVlZHMgdG8gb3BlbiAvc3lzL2tlcm5lbC9kZWJ1Zy9rY292IGluIGVhY2ggdGhyZWFkIHNlcGFyYXRlbHkuCi0KLVRoZSBpbnRlcmZhY2UgaXMgZmluZS1ncmFpbmVkIHRvIGFsbG93IGVmZmljaWVudCBmb3JraW5nIG9mIHRlc3QgcHJvY2Vzc2VzLgotVGhhdCBpcywgYSBwYXJlbnQgcHJvY2VzcyBvcGVucyAvc3lzL2tlcm5lbC9kZWJ1Zy9rY292LCBlbmFibGVzIHRyYWNlIG1vZGUsCi1tbWFwcyBjb3ZlcmFnZSBidWZmZXIgYW5kIHRoZW4gZm9ya3MgY2hpbGQgcHJvY2Vzc2VzIGluIGEgbG9vcC4gQ2hpbGQgcHJvY2Vzc2VzCi1vbmx5IG5lZWQgdG8gZW5hYmxlIGNvdmVyYWdlIChkaXNhYmxlIGhhcHBlbnMgYXV0b21hdGljYWxseSBvbiB0aHJlYWQgZW5kKS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2R1bXAva2R1bXAudHh0IGIvRG9jdW1lbnRhdGlvbi9rZHVtcC9rZHVtcC50eHQKaW5kZXggODhmZjYzZC4uYjBlYjI3YiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZHVtcC9rZHVtcC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZHVtcC9rZHVtcC50eHQKQEAgLTM5Myw2ICszOTMsMTUgQEAKICogV2UgZ2VuZXJhbGx5IGRvbicgaGF2ZSB0byBicmluZyB1cCBhIFNNUCBrZXJuZWwganVzdCB0byBjYXB0dXJlIHRoZQogICBkdW1wLiBIZW5jZSBnZW5lcmFsbHkgaXQgaXMgdXNlZnVsIGVpdGhlciB0byBidWlsZCBhIFVQIGR1bXAtY2FwdHVyZQogICBrZXJuZWwgb3Igc3BlY2lmeSBtYXhjcHVzPTEgb3B0aW9uIHdoaWxlIGxvYWRpbmcgZHVtcC1jYXB0dXJlIGtlcm5lbC4KKyAgTm90ZSwgdGhvdWdoIG1heGNwdXMgYWx3YXlzIHdvcmtzLCB5b3UgaGFkIGJldHRlciByZXBsYWNlIGl0IHdpdGgKKyAgbnJfY3B1cyB0byBzYXZlIG1lbW9yeSBpZiBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgQVJDSCwgc3VjaCBhcyB4ODYuCisKKyogWW91IHNob3VsZCBlbmFibGUgbXVsdGktY3B1IHN1cHBvcnQgaW4gZHVtcC1jYXB0dXJlIGtlcm5lbCBpZiB5b3UgaW50ZW5kCisgIHRvIHVzZSBtdWx0aS10aHJlYWQgcHJvZ3JhbXMgd2l0aCBpdCwgc3VjaCBhcyBwYXJhbGxlbCBkdW1wIGZlYXR1cmUgb2YKKyAgbWFrZWR1bXBmaWxlLiBPdGhlcndpc2UsIHRoZSBtdWx0aS10aHJlYWQgcHJvZ3JhbSBtYXkgaGF2ZSBhIGdyZWF0CisgIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uLiBUbyBlbmFibGUgbXVsdGktY3B1IHN1cHBvcnQsIHlvdSBzaG91bGQgYnJpbmcgdXAgYW4KKyAgU01QIGR1bXAtY2FwdHVyZSBrZXJuZWwgYW5kIHNwZWNpZnkgbWF4Y3B1cy9ucl9jcHVzLCBkaXNhYmxlX2NwdV9hcGljaWQ9W1hdCisgIG9wdGlvbnMgd2hpbGUgbG9hZGluZyBpdC4KIAogKiBGb3IgczM5MHggdGhlcmUgYXJlIHR3byBrZHVtcCBtb2RlczogSWYgYSBFTEYgaGVhZGVyIGlzIHNwZWNpZmllZCB3aXRoCiAgIHRoZSBlbGZjb3JlaGRyPSBrZXJuZWwgcGFyYW1ldGVyLCBpdCBpcyB1c2VkIGJ5IHRoZSBrZHVtcCBrZXJuZWwgYXMgaXQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2VybmVsLWRvY3MudHh0IGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jcy50eHQKaW5kZXggMWRhZmM1Mi4uMDVhNzg1NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jcy50eHQKQEAgLTEsNzMxICsxLDY1MiBAQAorLi4gX2tlcm5lbF9kb2NzOgogCi0gICAgSW5kZXggb2YgRG9jdW1lbnRhdGlvbiBmb3IgUGVvcGxlIEludGVyZXN0ZWQgaW4gV3JpdGluZyBhbmQvb3IKLQotICAgICAgICAgICAgICAgICAgIFVuZGVyc3RhbmRpbmcgdGhlIExpbnV4IEtlcm5lbC4KK0luZGV4IG9mIERvY3VtZW50YXRpb24gZm9yIFBlb3BsZSBJbnRlcmVzdGVkIGluIFdyaXRpbmcgYW5kL29yIFVuZGVyc3RhbmRpbmcgdGhlIExpbnV4IEtlcm5lbAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKICAgICAgICAgICBKdWFuLU1hcmlhbm8gZGUgR295ZW5lY2hlIDxqbXNleWFzQGRpdC51cG0uZXM+CiAKLS8qCi0gKiBUaGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudCBtYXkgYmUgZm91bmQgYXQ6Ci0gKiAgIGh0dHA6Ly93d3cuZGl0LnVwbS5lcy9+am1zZXlhcy9saW51eC9rZXJuZWwvaGFja2Vycy1kb2NzLmh0bWwKLSAqLworVGhlIG5lZWQgZm9yIGEgZG9jdW1lbnQgbGlrZSB0aGlzIG9uZSBiZWNhbWUgYXBwYXJlbnQgaW4gdGhlCitsaW51eC1rZXJuZWwgbWFpbGluZyBsaXN0IGFzIHRoZSBzYW1lIHF1ZXN0aW9ucywgYXNraW5nIGZvciBwb2ludGVycwordG8gaW5mb3JtYXRpb24sIGFwcGVhcmVkIGFnYWluIGFuZCBhZ2Fpbi4KIAotICAgVGhlIG5lZWQgZm9yIGEgZG9jdW1lbnQgbGlrZSB0aGlzIG9uZSBiZWNhbWUgYXBwYXJlbnQgaW4gdGhlCi0gICBsaW51eC1rZXJuZWwgbWFpbGluZyBsaXN0IGFzIHRoZSBzYW1lIHF1ZXN0aW9ucywgYXNraW5nIGZvciBwb2ludGVycwotICAgdG8gaW5mb3JtYXRpb24sIGFwcGVhcmVkIGFnYWluIGFuZCBhZ2Fpbi4KLSAgIAotICAgRm9ydHVuYXRlbHksIGFzIG1vcmUgYW5kIG1vcmUgcGVvcGxlIGdldCB0byBHTlUvTGludXgsIG1vcmUgYW5kIG1vcmUKLSAgIGdldCBpbnRlcmVzdGVkIGluIHRoZSBLZXJuZWwuIEJ1dCByZWFkaW5nIHRoZSBzb3VyY2VzIGlzIG5vdCBhbHdheXMKLSAgIGVub3VnaC4gSXQgaXMgZWFzeSB0byB1bmRlcnN0YW5kIHRoZSBjb2RlLCBidXQgbWlzcyB0aGUgY29uY2VwdHMsIHRoZQotICAgcGhpbG9zb3BoeSBhbmQgZGVzaWduIGRlY2lzaW9ucyBiZWhpbmQgdGhpcyBjb2RlLgotICAgCi0gICBVbmZvcnR1bmF0ZWx5LCBub3QgbWFueSBkb2N1bWVudHMgYXJlIGF2YWlsYWJsZSBmb3IgYmVnaW5uZXJzIHRvCi0gICBzdGFydC4gQW5kLCBldmVuIGlmIHRoZXkgZXhpc3QsIHRoZXJlIHdhcyBubyAid2VsbC1rbm93biIgcGxhY2Ugd2hpY2gKLSAgIGtlcHQgdHJhY2sgb2YgdGhlbS4gVGhlc2UgbGluZXMgdHJ5IHRvIGNvdmVyIHRoaXMgbGFjay4gQWxsIGRvY3VtZW50cwotICAgYXZhaWxhYmxlIG9uIGxpbmUga25vd24gYnkgdGhlIGF1dGhvciBhcmUgbGlzdGVkLCB3aGlsZSBzb21lIHJlZmVyZW5jZQotICAgYm9va3MgYXJlIGFsc28gbWVudGlvbmVkLgotICAgCi0gICBQTEVBU0UsIGlmIHlvdSBrbm93IGFueSBwYXBlciBub3QgbGlzdGVkIGhlcmUgb3Igd3JpdGUgYSBuZXcgZG9jdW1lbnQsCi0gICBzZW5kIG1lIGFuIGUtbWFpbCwgYW5kIEknbGwgaW5jbHVkZSBhIHJlZmVyZW5jZSB0byBpdCBoZXJlLiBBbnkKLSAgIGNvcnJlY3Rpb25zLCBpZGVhcyBvciBjb21tZW50cyBhcmUgYWxzbyB3ZWxjb21lZC4KLSAgIAotICAgVGhlIHBhcGVycyB0aGF0IGZvbGxvdyBhcmUgbGlzdGVkIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIuIEFsbCBhcmUKLSAgIGNhdGFsb2dlZCB3aXRoIHRoZSBmb2xsb3dpbmcgZmllbGRzOiB0aGUgZG9jdW1lbnQncyAiVGl0bGUiLCB0aGUKLSAgICJBdXRob3IiL3MsIHRoZSAiVVJMIiB3aGVyZSB0aGV5IGNhbiBiZSBmb3VuZCwgc29tZSAiS2V5d29yZHMiIGhlbHBmdWwKLSAgIHdoZW4gc2VhcmNoaW5nIGZvciBzcGVjaWZpYyB0b3BpY3MsIGFuZCBhIGJyaWVmICJEZXNjcmlwdGlvbiIgb2YgdGhlCi0gICBEb2N1bWVudC4KLSAgIAotICAgRW5qb3khCi0gICAKLSAgICAgT04tTElORSBET0NTOgotICAgICAgIAotICAgICAqIFRpdGxlOiAiTGludXggRGV2aWNlIERyaXZlcnMsIFRoaXJkIEVkaXRpb24iCi0gICAgICAgQXV0aG9yOiBKb25hdGhhbiBDb3JiZXQsIEFsZXNzYW5kcm8gUnViaW5pLCBHcmVnIEtyb2FoLUhhcnRtYW4KLSAgICAgICBVUkw6IGh0dHA6Ly9sd24ubmV0L0tlcm5lbC9MREQzLwotICAgICAgIERlc2NyaXB0aW9uOiBBIDYwMC1wYWdlIGJvb2sgY292ZXJpbmcgdGhlICgyLjYuMTApIGRyaXZlcgotICAgICAgIHByb2dyYW1taW5nIEFQSSBhbmQga2VybmVsIGhhY2tpbmcgaW4gZ2VuZXJhbC4gIEF2YWlsYWJsZSB1bmRlciB0aGUKLSAgICAgICBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLVNoYXJlQWxpa2UgMi4wIGxpY2Vuc2UuCitGb3J0dW5hdGVseSwgYXMgbW9yZSBhbmQgbW9yZSBwZW9wbGUgZ2V0IHRvIEdOVS9MaW51eCwgbW9yZSBhbmQgbW9yZQorZ2V0IGludGVyZXN0ZWQgaW4gdGhlIEtlcm5lbC4gQnV0IHJlYWRpbmcgdGhlIHNvdXJjZXMgaXMgbm90IGFsd2F5cworZW5vdWdoLiBJdCBpcyBlYXN5IHRvIHVuZGVyc3RhbmQgdGhlIGNvZGUsIGJ1dCBtaXNzIHRoZSBjb25jZXB0cywgdGhlCitwaGlsb3NvcGh5IGFuZCBkZXNpZ24gZGVjaXNpb25zIGJlaGluZCB0aGlzIGNvZGUuCiAKLSAgICAgKiBUaXRsZTogIlRoZSBMaW51eCBLZXJuZWwiCi0gICAgICAgQXV0aG9yOiBEYXZpZCBBLiBSdXNsaW5nLgotICAgICAgIFVSTDogaHR0cDovL3d3dy50bGRwLm9yZy9MRFAvdGxrL3Rsay5odG1sCi0gICAgICAgS2V5d29yZHM6IGV2ZXJ5dGhpbmchLCBib29rLgotICAgICAgIERlc2NyaXB0aW9uOiBPbiBsaW5lLCAyMDAgcGFnZXMgYm9vayBkZXNjcmliaW5nIG1vc3QgYXNwZWN0cyBvZgotICAgICAgIHRoZSBMaW51eCBLZXJuZWwuIFByb2JhYmx5LCB0aGUgZmlyc3QgcmVmZXJlbmNlIGZvciBiZWdpbm5lcnMuCi0gICAgICAgTG90cyBvZiBpbGx1c3RyYXRpb25zIGV4cGxhaW5pbmcgZGF0YSBzdHJ1Y3R1cmVzIHVzZSBhbmQKLSAgICAgICByZWxhdGlvbnNoaXBzIGluIHRoZSBwdXJlc3QgUmljaGFyZCBXLiBTdGV2ZW5zJyBzdHlsZS4gQ29udGVudHM6Ci0gICAgICAgIjEuLUhhcmR3YXJlIEJhc2ljcywgMi4tU29mdHdhcmUgQmFzaWNzLCAzLi1NZW1vcnkgTWFuYWdlbWVudCwKLSAgICAgICA0Li1Qcm9jZXNzZXMsIDUuLUludGVycHJvY2VzcyBDb21tdW5pY2F0aW9uIE1lY2hhbmlzbXMsIDYuLVBDSSwKLSAgICAgICA3Li1JbnRlcnJ1cHRzIGFuZCBJbnRlcnJ1cHQgSGFuZGxpbmcsIDguLURldmljZSBEcml2ZXJzLCA5Li1UaGUKLSAgICAgICBGaWxlIHN5c3RlbSwgMTAuLU5ldHdvcmtzLCAxMS4tS2VybmVsIE1lY2hhbmlzbXMsIDEyLi1Nb2R1bGVzLAotICAgICAgIDEzLi1UaGUgTGludXggS2VybmVsIFNvdXJjZXMsIEEuLUxpbnV4IERhdGEgU3RydWN0dXJlcywgQi4tVGhlCi0gICAgICAgQWxwaGEgQVhQIFByb2Nlc3NvciwgQy4tVXNlZnVsIFdlYiBhbmQgRlRQIFNpdGVzLCBELi1UaGUgR05VCi0gICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgR2xvc3NhcnkiLiBJbiBzaG9ydDogYSBtdXN0IGhhdmUuCitVbmZvcnR1bmF0ZWx5LCBub3QgbWFueSBkb2N1bWVudHMgYXJlIGF2YWlsYWJsZSBmb3IgYmVnaW5uZXJzIHRvCitzdGFydC4gQW5kLCBldmVuIGlmIHRoZXkgZXhpc3QsIHRoZXJlIHdhcyBubyAid2VsbC1rbm93biIgcGxhY2Ugd2hpY2gKK2tlcHQgdHJhY2sgb2YgdGhlbS4gVGhlc2UgbGluZXMgdHJ5IHRvIGNvdmVyIHRoaXMgbGFjay4gQWxsIGRvY3VtZW50cworYXZhaWxhYmxlIG9uIGxpbmUga25vd24gYnkgdGhlIGF1dGhvciBhcmUgbGlzdGVkLCB3aGlsZSBzb21lIHJlZmVyZW5jZQorYm9va3MgYXJlIGFsc28gbWVudGlvbmVkLgogCi0gICAgICogVGl0bGU6ICJMaW51eCBEZXZpY2UgRHJpdmVycywgMm5kIEVkaXRpb24iCi0gICAgICAgQXV0aG9yOiBBbGVzc2FuZHJvIFJ1YmluaSBhbmQgSm9uYXRoYW4gQ29yYmV0LgotICAgICAgIFVSTDogaHR0cDovL3d3dy54bWwuY29tL2xkZC9jaGFwdGVyL2Jvb2svaW5kZXguaHRtbAotICAgICAgIEtleXdvcmRzOiBkZXZpY2UgZHJpdmVycywgbW9kdWxlcywgZGVidWdnaW5nLCBtZW1vcnksIGhhcmR3YXJlLAotICAgICAgIGludGVycnVwdCBoYW5kbGluZywgY2hhciBkcml2ZXJzLCBibG9jayBkcml2ZXJzLCBrbW9kLCBtbWFwLCBETUEsCi0gICAgICAgYnVzZXMuCi0gICAgICAgRGVzY3JpcHRpb246IE8nUmVpbGx5J3MgcG9wdWxhciBib29rLCBub3cgYWxzbyBvbi1saW5lIHVuZGVyIHRoZQotICAgICAgIEdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZS4KLSAgICAgICBOb3RlczogWW91IGNhbiBhbHNvIGJ1eSBpdCBpbiBwYXBlci1mb3JtIGZyb20gTydSZWlsbHkuIFNlZSBiZWxvdwotICAgICAgIHVuZGVyIEJPT0tTIChOb3Qgb24tbGluZSkuCitQTEVBU0UsIGlmIHlvdSBrbm93IGFueSBwYXBlciBub3QgbGlzdGVkIGhlcmUgb3Igd3JpdGUgYSBuZXcgZG9jdW1lbnQsCitzZW5kIG1lIGFuIGUtbWFpbCwgYW5kIEknbGwgaW5jbHVkZSBhIHJlZmVyZW5jZSB0byBpdCBoZXJlLiBBbnkKK2NvcnJlY3Rpb25zLCBpZGVhcyBvciBjb21tZW50cyBhcmUgYWxzbyB3ZWxjb21lZC4KIAotICAgICAqIFRpdGxlOiAiQ29uY2VwdHVhbCBBcmNoaXRlY3R1cmUgb2YgdGhlIExpbnV4IEtlcm5lbCIKLSAgICAgICBBdXRob3I6IEl2YW4gVC4gQm93bWFuLgotICAgICAgIFVSTDogaHR0cDovL3BsZy51d2F0ZXJsb28uY2EvCi0gICAgICAgS2V5d29yZHM6IGNvbmNlcHR1YWwgc29mdHdhcmUgYXJjaGl0ZWN0dXJlLCBleHRyYWN0ZWQgZGVzaWduLAotICAgICAgIHJldmVyc2UgZW5naW5lZXJpbmcsIHN5c3RlbSBzdHJ1Y3R1cmUuCi0gICAgICAgRGVzY3JpcHRpb246IENvbmNlcHR1YWwgc29mdHdhcmUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBMaW51eCBrZXJuZWwsCi0gICAgICAgYXV0b21hdGljYWxseSBleHRyYWN0ZWQgZnJvbSB0aGUgc291cmNlIGNvZGUuIFZlcnkgZGV0YWlsZWQuIEdvb2QKLSAgICAgICBmaWd1cmVzLiBHaXZlcyBnb29kIG92ZXJhbGwga2VybmVsIHVuZGVyc3RhbmRpbmcuCitUaGUgcGFwZXJzIHRoYXQgZm9sbG93IGFyZSBsaXN0ZWQgaW4gbm8gcGFydGljdWxhciBvcmRlci4gQWxsIGFyZQorY2F0YWxvZ2VkIHdpdGggdGhlIGZvbGxvd2luZyBmaWVsZHM6IHRoZSBkb2N1bWVudCdzICJUaXRsZSIsIHRoZQorIkF1dGhvciIvcywgdGhlICJVUkwiIHdoZXJlIHRoZXkgY2FuIGJlIGZvdW5kLCBzb21lICJLZXl3b3JkcyIgaGVscGZ1bAord2hlbiBzZWFyY2hpbmcgZm9yIHNwZWNpZmljIHRvcGljcywgYW5kIGEgYnJpZWYgIkRlc2NyaXB0aW9uIiBvZiB0aGUKK0RvY3VtZW50LgogCi0gICAgICogVGl0bGU6ICJDb25jcmV0ZSBBcmNoaXRlY3R1cmUgb2YgdGhlIExpbnV4IEtlcm5lbCIKLSAgICAgICBBdXRob3I6IEl2YW4gVC4gQm93bWFuLCBTYWhlZW0gU2lkZGlxaSwgYW5kIE1leWVyIEMuIFRhbnVhbi4KLSAgICAgICBVUkw6IGh0dHA6Ly9wbGcudXdhdGVybG9vLmNhLwotICAgICAgIEtleXdvcmRzOiBjb25jcmV0ZSBhcmNoaXRlY3R1cmUsIGV4dHJhY3RlZCBkZXNpZ24sIHJldmVyc2UKLSAgICAgICBlbmdpbmVlcmluZywgc3lzdGVtIHN0cnVjdHVyZSwgZGVwZW5kZW5jaWVzLgotICAgICAgIERlc2NyaXB0aW9uOiBDb25jcmV0ZSBhcmNoaXRlY3R1cmUgb2YgdGhlIExpbnV4IGtlcm5lbCwKLSAgICAgICBhdXRvbWF0aWNhbGx5IGV4dHJhY3RlZCBmcm9tIHRoZSBzb3VyY2UgY29kZS4gVmVyeSBkZXRhaWxlZC4gR29vZAotICAgICAgIGZpZ3VyZXMuIEdpdmVzIGdvb2Qgb3ZlcmFsbCBrZXJuZWwgdW5kZXJzdGFuZGluZy4gVGhpcyBwYXBlcnMKLSAgICAgICBmb2N1cyBvbiBsb3dlciBkZXRhaWxzIHRoYW4gaXRzIHByZWRlY2Vzc29yIChmaWxlcywgdmFyaWFibGVzLi4uKS4KK0Vuam95IQogCi0gICAgICogVGl0bGU6ICJMaW51eCBhcyBhIENhc2UgU3R1ZHk6IEl0cyBFeHRyYWN0ZWQgU29mdHdhcmUKLSAgICAgICBBcmNoaXRlY3R1cmUiCi0gICAgICAgQXV0aG9yOiBJdmFuIFQuIEJvd21hbiwgUmljaGFyZCBDLiBIb2x0IGFuZCBOZWlsIFYuIEJyZXdzdGVyLgotICAgICAgIFVSTDogaHR0cDovL3BsZy51d2F0ZXJsb28uY2EvCi0gICAgICAgS2V5d29yZHM6IHNvZnR3YXJlIGFyY2hpdGVjdHVyZSwgYXJjaGl0ZWN0dXJlIHJlY292ZXJ5LAotICAgICAgIHJlZG9jdW1lbnRhdGlvbi4KLSAgICAgICBEZXNjcmlwdGlvbjogUGFwZXIgYXBwZWFyZWQgYXQgSUNTRSc5OSwgTG9zIEFuZ2VsZXMsIE1heSAxNi0yMiwKLSAgICAgICAxOTk5LiBBIG1peHR1cmUgb2YgdGhlIHByZXZpb3VzIHR3byBkb2N1bWVudHMgZnJvbSB0aGUgc2FtZQotICAgICAgIGF1dGhvci4KKy4uIG5vdGU6OgogCi0gICAgICogVGl0bGU6ICJPdmVydmlldyBvZiB0aGUgVmlydHVhbCBGaWxlIFN5c3RlbSIKLSAgICAgICBBdXRob3I6IFJpY2hhcmQgR29vY2guCi0gICAgICAgVVJMOiBodHRwOi8vd3d3Lm1qbXdpcmVkLm5ldC9rZXJuZWwvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZnMudHh0Ci0gICAgICAgS2V5d29yZHM6IFZGUywgRmlsZSBTeXN0ZW0sIG1vdW50aW5nIGZpbGVzeXN0ZW1zLCBvcGVuaW5nIGZpbGVzLAotICAgICAgIGRlbnRyaWVzLCBkY2FjaGUuCi0gICAgICAgRGVzY3JpcHRpb246IEJyaWVmIGludHJvZHVjdGlvbiB0byB0aGUgTGludXggVmlydHVhbCBGaWxlIFN5c3RlbS4KLSAgICAgICBXaGF0IGlzIGl0LCBob3cgaXQgd29ya3MsIG9wZXJhdGlvbnMgdGFrZW4gd2hlbiBvcGVuaW5nIGEgZmlsZSBvcgotICAgICAgIG1vdW50aW5nIGEgZmlsZSBzeXN0ZW0gYW5kIGRlc2NyaXB0aW9uIG9mIGltcG9ydGFudCBkYXRhCi0gICAgICAgc3RydWN0dXJlcyBleHBsYWluaW5nIHRoZSBwdXJwb3NlIG9mIGVhY2ggb2YgdGhlaXIgZW50cmllcy4KKyAgIFRoZSBkb2N1bWVudHMgb24gZWFjaCBzZWN0aW9uIG9mIHRoaXMgZG9jdW1lbnQgYXJlIG9yZGVyZWQgYnkgaXRzCisgICBwdWJsaXNoZWQgZGF0ZSwgZnJvbSB0aGUgbmV3ZXN0IHRvIHRoZSBvbGRlc3QuCiAKLSAgICAgKiBUaXRsZTogIlRoZSBMaW51eCBSQUlELTEsIDQsIDUgQ29kZSIKLSAgICAgICBBdXRob3I6IEluZ28gTW9sbmFyLCBHYWRpIE94bWFuIGFuZCBNaWd1ZWwgZGUgSWNhemEuCi0gICAgICAgVVJMOiBodHRwOi8vd3d3LmxpbnV4am91cm5hbC5jb20vYXJ0aWNsZS5waHA/c2lkPTIzOTEKLSAgICAgICBLZXl3b3JkczogUkFJRCwgTUQgZHJpdmVyLgotICAgICAgIERlc2NyaXB0aW9uOiBMaW51eCBKb3VybmFsIEtlcm5lbCBLb3JuZXIgYXJ0aWNsZS4gSGVyZSBpcyBpdHMKLSAgICAgICBhYnN0cmFjdDogIkEgZGVzY3JpcHRpb24gb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBSQUlELTEsCi0gICAgICAgUkFJRC00IGFuZCBSQUlELTUgcGVyc29uYWxpdGllcyBvZiB0aGUgTUQgZGV2aWNlIGRyaXZlciBpbiB0aGUKLSAgICAgICBMaW51eCBrZXJuZWwsIHByb3ZpZGluZyB1c2VycyB3aXRoIGhpZ2ggcGVyZm9ybWFuY2UgYW5kIHJlbGlhYmxlLAotICAgICAgIHNlY29uZGFyeS1zdG9yYWdlIGNhcGFiaWxpdHkgdXNpbmcgc29mdHdhcmUiLgorRG9jcyBhdCB0aGUgTGludXggS2VybmVsIHRyZWUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSAgICAgKiBUaXRsZTogIkR5bmFtaWMgS2VybmVsczogTW9kdWxhcml6ZWQgRGV2aWNlIERyaXZlcnMiCi0gICAgICAgQXV0aG9yOiBBbGVzc2FuZHJvIFJ1YmluaS4KLSAgICAgICBVUkw6IGh0dHA6Ly93d3cubGludXhqb3VybmFsLmNvbS9hcnRpY2xlLnBocD9zaWQ9MTIxOQotICAgICAgIEtleXdvcmRzOiBkZXZpY2UgZHJpdmVyLCBtb2R1bGUsIGxvYWRpbmcvdW5sb2FkaW5nIG1vZHVsZXMsCi0gICAgICAgYWxsb2NhdGluZyByZXNvdXJjZXMuCi0gICAgICAgRGVzY3JpcHRpb246IExpbnV4IEpvdXJuYWwgS2VybmVsIEtvcm5lciBhcnRpY2xlLiBIZXJlIGlzIGl0cwotICAgICAgIGFic3RyYWN0OiAiVGhpcyBpcyB0aGUgZmlyc3Qgb2YgYSBzZXJpZXMgb2YgZm91ciBhcnRpY2xlcwotICAgICAgIGNvLWF1dGhvcmVkIGJ5IEFsZXNzYW5kcm8gUnViaW5pIGFuZCBHZW9yZyBaZXpjaHdpdHogd2hpY2ggcHJlc2VudAotICAgICAgIGEgcHJhY3RpY2FsIGFwcHJvYWNoIHRvIHdyaXRpbmcgTGludXggZGV2aWNlIGRyaXZlcnMgYXMga2VybmVsCi0gICAgICAgbG9hZGFibGUgbW9kdWxlcy4gVGhpcyBpbnN0YWxsbWVudCBwcmVzZW50cyBhbiBpbnRyb2R1Y3Rpb24gdG8gdGhlCi0gICAgICAgdG9waWMsIHByZXBhcmluZyB0aGUgcmVhZGVyIHRvIHVuZGVyc3RhbmQgbmV4dCBtb250aCdzCi0gICAgICAgaW5zdGFsbG1lbnQiLgorVGhlIERvY0Jvb2sgYm9va3Mgc2hvdWxkIGJlIGJ1aWx0IHdpdGggYGBtYWtlIHtodG1sZG9jcyB8IHBzZG9jcyB8IHBkZmRvY3N9YGAuCitUaGUgU3BoaW54IGJvb2tzIHNob3VsZCBiZSBidWlsdCB3aXRoIGBgbWFrZSB7aHRtbGRvY3MgfCBwZGZkb2NzIHwgZXB1YmRvY3N9YGAuCiAKLSAgICAgKiBUaXRsZTogIkR5bmFtaWMgS2VybmVsczogRGlzY292ZXJ5IgotICAgICAgIEF1dGhvcjogQWxlc3NhbmRybyBSdWJpbmkuCi0gICAgICAgVVJMOiBodHRwOi8vd3d3LmxpbnV4am91cm5hbC5jb20vYXJ0aWNsZS5waHA/c2lkPTEyMjAKLSAgICAgICBLZXl3b3JkczogY2hhcmFjdGVyIGRyaXZlciwgaW5pdF9tb2R1bGUsIGNsZWFuX3VwIG1vZHVsZSwKLSAgICAgICBhdXRvZGV0ZWN0aW9uLCBtYXlvciBudW1iZXIsIG1pbm9yIG51bWJlciwgZmlsZSBvcGVyYXRpb25zLAotICAgICAgIG9wZW4oKSwgY2xvc2UoKS4KLSAgICAgICBEZXNjcmlwdGlvbjogTGludXggSm91cm5hbCBLZXJuZWwgS29ybmVyIGFydGljbGUuIEhlcmUgaXMgaXRzCi0gICAgICAgYWJzdHJhY3Q6ICJUaGlzIGFydGljbGUsIHRoZSBzZWNvbmQgb2YgZm91ciwgaW50cm9kdWNlcyBwYXJ0IG9mCi0gICAgICAgdGhlIGFjdHVhbCBjb2RlIHRvIGNyZWF0ZSBjdXN0b20gbW9kdWxlIGltcGxlbWVudGluZyBhIGNoYXJhY3RlcgotICAgICAgIGRldmljZSBkcml2ZXIuIEl0IGRlc2NyaWJlcyB0aGUgY29kZSBmb3IgbW9kdWxlIGluaXRpYWxpemF0aW9uIGFuZAotICAgICAgIGNsZWFudXAsIGFzIHdlbGwgYXMgdGhlIG9wZW4oKSBhbmQgY2xvc2UoKSBzeXN0ZW0gY2FsbHMiLgorICAgICogTmFtZTogKipsaW51eC9Eb2N1bWVudGF0aW9uKioKIAotICAgICAqIFRpdGxlOiAiVGhlIERldmlsJ3MgaW4gdGhlIERldGFpbHMiCi0gICAgICAgQXV0aG9yOiBHZW9yZyB2LiBaZXpzY2h3aXR6IGFuZCBBbGVzc2FuZHJvIFJ1YmluaS4KLSAgICAgICBVUkw6IGh0dHA6Ly93d3cubGludXhqb3VybmFsLmNvbS9hcnRpY2xlLnBocD9zaWQ9MTIyMQotICAgICAgIEtleXdvcmRzOiByZWFkKCksIHdyaXRlKCksIHNlbGVjdCgpLCBpb2N0bCgpLCBibG9ja2luZy9ub24KLSAgICAgICBibG9ja2luZyBtb2RlLCBpbnRlcnJ1cHQgaGFuZGxlci4KLSAgICAgICBEZXNjcmlwdGlvbjogTGludXggSm91cm5hbCBLZXJuZWwgS29ybmVyIGFydGljbGUuIEhlcmUgaXMgaXRzCi0gICAgICAgYWJzdHJhY3Q6ICJUaGlzIGFydGljbGUsIHRoZSB0aGlyZCBvZiBmb3VyIG9uIHdyaXRpbmcgY2hhcmFjdGVyCi0gICAgICAgZGV2aWNlIGRyaXZlcnMsIGludHJvZHVjZXMgY29uY2VwdHMgb2YgcmVhZGluZywgd3JpdGluZywgYW5kIHVzaW5nCi0gICAgICAgaW9jdGwtY2FsbHMiLgorICAgICAgOkF1dGhvcjogTWFueS4KKyAgICAgIDpMb2NhdGlvbjogRG9jdW1lbnRhdGlvbi8KKyAgICAgIDpLZXl3b3JkczogdGV4dCBmaWxlcywgU3BoaW54LCBEb2NCb29rLgorICAgICAgOkRlc2NyaXB0aW9uOiBEb2N1bWVudGF0aW9uIHRoYXQgY29tZXMgd2l0aCB0aGUga2VybmVsIHNvdXJjZXMsCisgICAgICAgIGluc2lkZSB0aGUgRG9jdW1lbnRhdGlvbiBkaXJlY3RvcnkuIFNvbWUgcGFnZXMgZnJvbSB0aGlzIGRvY3VtZW50CisgICAgICAgIChpbmNsdWRpbmcgdGhpcyBkb2N1bWVudCBpdHNlbGYpIGhhdmUgYmVlbiBtb3ZlZCB0aGVyZSwgYW5kIG1pZ2h0CisgICAgICAgIGJlIG1vcmUgdXAgdG8gZGF0ZSB0aGFuIHRoZSB3ZWIgdmVyc2lvbi4KIAotICAgICAqIFRpdGxlOiAiRGlzc2VjdGluZyBJbnRlcnJ1cHRzIGFuZCBCcm93c2luZyBETUEiCi0gICAgICAgQXV0aG9yOiBBbGVzc2FuZHJvIFJ1YmluaSBhbmQgR2Vvcmcgdi4gWmV6c2Nod2l0ei4KLSAgICAgICBVUkw6IGh0dHA6Ly93d3cubGludXhqb3VybmFsLmNvbS9hcnRpY2xlLnBocD9zaWQ9MTIyMgotICAgICAgIEtleXdvcmRzOiBpbnRlcnJ1cHRzLCBpcnFzLCBETUEsIGJvdHRvbSBoYWx2ZXMsIHRhc2sgcXVldWVzLgotICAgICAgIERlc2NyaXB0aW9uOiBMaW51eCBKb3VybmFsIEtlcm5lbCBLb3JuZXIgYXJ0aWNsZS4gSGVyZSBpcyBpdHMKLSAgICAgICBhYnN0cmFjdDogIlRoaXMgaXMgdGhlIGZvdXJ0aCBpbiBhIHNlcmllcyBvZiBhcnRpY2xlcyBhYm91dAotICAgICAgIHdyaXRpbmcgY2hhcmFjdGVyIGRldmljZSBkcml2ZXJzIGFzIGxvYWRhYmxlIGtlcm5lbCBtb2R1bGVzLiBUaGlzCi0gICAgICAgbW9udGgsIHdlIGZ1cnRoZXIgaW52ZXN0aWdhdGUgdGhlIGZpZWxkIG9mIGludGVycnVwdCBoYW5kbGluZy4KLSAgICAgICBUaG91Z2ggaXQgaXMgY29uY2VwdHVhbGx5IHNpbXBsZSwgcHJhY3RpY2FsIGxpbWl0YXRpb25zIGFuZAotICAgICAgIGNvbnN0cmFpbnRzIG1ha2UgdGhpcyBhbiBgYGludGVyZXN0aW5nJycgcGFydCBvZiBkZXZpY2UgZHJpdmVyCi0gICAgICAgd3JpdGluZywgYW5kIHNldmVyYWwgZGlmZmVyZW50IGZhY2lsaXRpZXMgaGF2ZSBiZWVuIHByb3ZpZGVkIGZvcgotICAgICAgIGRpZmZlcmVudCBzaXR1YXRpb25zLiBXZSBhbHNvIGludmVzdGlnYXRlIHRoZSBjb21wbGV4IHRvcGljIG9mCi0gICAgICAgRE1BIi4KKyAgICAqIFRpdGxlOiAqKlRoZSBLZXJuZWwgSGFja2luZyBIT1dUTyoqCiAKLSAgICAgKiBUaXRsZTogIkRldmljZSBEcml2ZXJzIENvbmNsdWRlZCIKLSAgICAgICBBdXRob3I6IEdlb3JnIHYuIFplenNjaHdpdHouCi0gICAgICAgVVJMOiBodHRwOi8vd3d3LmxpbnV4am91cm5hbC5jb20vYXJ0aWNsZS5waHA/c2lkPTEyODcKLSAgICAgICBLZXl3b3JkczogYWRkcmVzcyBzcGFjZXMsIHBhZ2VzLCBwYWdpbmF0aW9uLCBwYWdlIG1hbmFnZW1lbnQsCi0gICAgICAgZGVtYW5kIGxvYWRpbmcsIHN3YXBwaW5nLCBtZW1vcnkgcHJvdGVjdGlvbiwgbWVtb3J5IG1hcHBpbmcsIG1tYXAsCi0gICAgICAgdmlydHVhbCBtZW1vcnkgYXJlYXMgKFZNQXMpLCB2cmVtYXAsIFBDSS4KLSAgICAgICBEZXNjcmlwdGlvbjogRmluYWxseSwgdGhlIGFib3ZlIHR1cm5lZCBvdXQgaW50byBhIGZpdmUgYXJ0aWNsZXMKLSAgICAgICBzZXJpZXMuIFRoaXMgbGF0ZXN0IG9uZSdzIGludHJvZHVjdGlvbiByZWFkczogIlRoaXMgaXMgdGhlIGxhc3Qgb2YKLSAgICAgICBmaXZlIGFydGljbGVzIGFib3V0IGNoYXJhY3RlciBkZXZpY2UgZHJpdmVycy4gSW4gdGhpcyBmaW5hbAotICAgICAgIHNlY3Rpb24sIEdlb3JnIGRlYWxzIHdpdGggbWVtb3J5IG1hcHBpbmcgZGV2aWNlcywgYmVnaW5uaW5nIHdpdGgKLSAgICAgICBhbiBvdmVyYWxsIGRlc2NyaXB0aW9uIG9mIHRoZSBMaW51eCBtZW1vcnkgbWFuYWdlbWVudCBjb25jZXB0cyIuCisgICAgICA6QXV0aG9yOiBWYXJpb3VzIFRhbGVudGVkIFBlb3BsZSwgYW5kIFJ1c3R5LgorICAgICAgOkxvY2F0aW9uOiBEb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWhhY2tpbmcudG1wbAorICAgICAgOktleXdvcmRzOiBIT1dUTywga2VybmVsIGNvbnRleHRzLCBkZWFkbG9jaywgbG9ja2luZywgbW9kdWxlcywKKyAgICAgICAgc3ltYm9scywgcmV0dXJuIGNvbnZlbnRpb25zLgorICAgICAgOkRlc2NyaXB0aW9uOiBGcm9tIHRoZSBJbnRyb2R1Y3Rpb246ICJQbGVhc2UgdW5kZXJzdGFuZCB0aGF0IEkKKyAgICAgICAgbmV2ZXIgd2FudGVkIHRvIHdyaXRlIHRoaXMgZG9jdW1lbnQsIGJlaW5nIGdyb3NzbHkgdW5kZXJxdWFsaWZpZWQsCisgICAgICAgIGJ1dCBJIGFsd2F5cyB3YW50ZWQgdG8gcmVhZCBpdCwgYW5kIHRoaXMgd2FzIHRoZSBvbmx5IHdheS4gSQorICAgICAgICBzaW1wbHkgZXhwbGFpbiBzb21lIGJlc3QgcHJhY3RpY2VzLCBhbmQgZ2l2ZSByZWFkaW5nIGVudHJ5LXBvaW50cworICAgICAgICBpbnRvIHRoZSBrZXJuZWwgc291cmNlcy4gSSBhdm9pZCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzOiB0aGF0J3MKKyAgICAgICAgd2hhdCB0aGUgY29kZSBpcyBmb3IsIGFuZCBJIGlnbm9yZSB3aG9sZSB0cmFjdHMgb2YgdXNlZnVsCisgICAgICAgIHJvdXRpbmVzLiBUaGlzIGRvY3VtZW50IGFzc3VtZXMgZmFtaWxpYXJpdHkgd2l0aCBDLCBhbmQgYW4KKyAgICAgICAgdW5kZXJzdGFuZGluZyBvZiB3aGF0IHRoZSBrZXJuZWwgaXMsIGFuZCBob3cgaXQgaXMgdXNlZC4gSXQgd2FzCisgICAgICAgIG9yaWdpbmFsbHkgd3JpdHRlbiBmb3IgdGhlIDIuMyBrZXJuZWxzLCBidXQgbmVhcmx5IGFsbCBvZiBpdAorICAgICAgICBhcHBsaWVzIHRvIDIuMiB0b287IDIuMCBpcyBzbGlnaHRseSBkaWZmZXJlbnQiLgogCi0gICAgICogVGl0bGU6ICJOZXR3b3JrIEJ1ZmZlcnMgQW5kIE1lbW9yeSBNYW5hZ2VtZW50IgotICAgICAgIEF1dGhvcjogQWxhbiBDb3guCi0gICAgICAgVVJMOiBodHRwOi8vd3d3LmxpbnV4am91cm5hbC5jb20vYXJ0aWNsZS5waHA/c2lkPTEzMTIKLSAgICAgICBLZXl3b3Jkczogc2tfYnVmZnMsIG5ldHdvcmsgZGV2aWNlcywgcHJvdG9jb2wvbGluayBsYXllcgotICAgICAgIHZhcmlhYmxlcywgbmV0d29yayBkZXZpY2VzIGZsYWdzLCB0cmFuc21pdCwgcmVjZWl2ZSwKLSAgICAgICBjb25maWd1cmF0aW9uLCBtdWx0aWNhc3QuCi0gICAgICAgRGVzY3JpcHRpb246IExpbnV4IEpvdXJuYWwgS2VybmVsIEtvcm5lci4gSGVyZSBpcyB0aGUgYWJzdHJhY3Q6Ci0gICAgICAgIldyaXRpbmcgYSBuZXR3b3JrIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IGlzIGZ1bmRhbWVudGFsbHkKLSAgICAgICBzaW1wbGUtLS1tb3N0IG9mIHRoZSBjb21wbGV4aXR5IChvdGhlciB0aGFuIHRhbGtpbmcgdG8gdGhlCi0gICAgICAgaGFyZHdhcmUpIGludm9sdmVzIG1hbmFnaW5nIG5ldHdvcmsgcGFja2V0cyBpbiBtZW1vcnkiLgotICAgICAgIAotICAgICAqIFRpdGxlOiAiTGludXggS2VybmVsIEhhY2tlcnMnIEd1aWRlIgotICAgICAgIEF1dGhvcjogTWljaGFlbCBLLiBKb2huc29uLgotICAgICAgIFVSTDogaHR0cDovL3d3dy50bGRwLm9yZy9MRFAva2hnL0h5cGVyTmV3cy9nZXQva2hnLmh0bWwKLSAgICAgICBLZXl3b3JkczogZGV2aWNlIGRyaXZlcnMsIGZpbGVzLCBWRlMsIGtlcm5lbCBpbnRlcmZhY2UsIGNoYXJhY3RlciB2cwotICAgICAgIGJsb2NrIGRldmljZXMsIGhhcmR3YXJlIGludGVycnVwdHMsIHNjc2ksIERNQSwgYWNjZXNzIHRvIHVzZXIgbWVtb3J5LAotICAgICAgIG1lbW9yeSBhbGxvY2F0aW9uLCB0aW1lcnMuCi0gICAgICAgRGVzY3JpcHRpb246IEEgZ3VpZGUgZGVzaWduZWQgdG8gaGVscCB5b3UgZ2V0IHVwIHRvIHNwZWVkIG9uIHRoZQotICAgICAgIGNvbmNlcHRzIHRoYXQgYXJlIG5vdCBpbnR1aXRldmx5IG9idmlvdXMsIGFuZCB0byBkb2N1bWVudCB0aGUgaW50ZXJuYWwKLSAgICAgICBzdHJ1Y3R1cmVzIG9mIExpbnV4LgotICAgICAgIAotICAgICAqIFRpdGxlOiAiVGhlIFZlbnVzIGtlcm5lbCBpbnRlcmZhY2UiCi0gICAgICAgQXV0aG9yOiBQZXRlciBKLiBCcmFhbS4KLSAgICAgICBVUkw6Ci0gICAgICAgaHR0cDovL3d3dy5jb2RhLmNzLmNtdS5lZHUvZG9jL2h0bWwva2VybmVsLXZlbnVzLXByb3RvY29sLmh0bWwKLSAgICAgICBLZXl3b3JkczogY29kYSwgZmlsZXN5c3RlbSwgdmVudXMsIGNhY2hlIG1hbmFnZXIuCi0gICAgICAgRGVzY3JpcHRpb246ICJUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgY29tbXVuaWNhdGlvbiBiZXR3ZWVuCi0gICAgICAgVmVudXMgYW5kIGtlcm5lbCBsZXZlbCBmaWxlIHN5c3RlbSBjb2RlIG5lZWRlZCBmb3IgdGhlIG9wZXJhdGlvbgotICAgICAgIG9mIHRoZSBDb2RhIGZpbGVzeXN0ZW0uIFRoaXMgdmVyc2lvbiBkb2N1bWVudCBpcyBtZWFudCB0byBkZXNjcmliZQotICAgICAgIHRoZSBjdXJyZW50IGludGVyZmFjZSAodmVyc2lvbiAxLjApIGFzIHdlbGwgYXMgaW1wcm92ZW1lbnRzIHdlCi0gICAgICAgZW52aXNhZ2UiLgorICAgICogVGl0bGU6ICoqTGludXggS2VybmVsIExvY2tpbmcgSE9XVE8qKgogCi0gICAgICogVGl0bGU6ICJQcm9ncmFtbWluZyBQQ0ktRGV2aWNlcyB1bmRlciBMaW51eCIKLSAgICAgICBBdXRob3I6IENsYXVzIFNjaHJvZXRlci4KLSAgICAgICBVUkw6Ci0gICAgICAgZnRwOi8vZnRwLmxscC5mdS1iZXJsaW4uZGUvcHViL2xpbnV4L0xJTlVYLUxBQi93aGl0ZXBhcGVycy9wY2lwLnBzLmd6Ci0gICAgICAgS2V5d29yZHM6IFBDSSwgZGV2aWNlLCBidXNtYXN0ZXJpbmcuCi0gICAgICAgRGVzY3JpcHRpb246IDYgcGFnZXMgdHV0b3JpYWwgb24gUENJIHByb2dyYW1taW5nIHVuZGVyIExpbnV4LgotICAgICAgIEdpdmVzIHRoZSBiYXNpYyBjb25jZXB0cyBvbiB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBQQ0kgc3Vic3lzdGVtLAotICAgICAgIGFzIGxvbmcgYXMgYmFzaWMgZnVuY3Rpb25zIGFuZCBtYWNyb3MgdG8gcmVhZC93cml0ZSB0aGUgZGV2aWNlcwotICAgICAgIGFuZCBwZXJmb3JtIGJ1c21hc3RlcmluZy4KKyAgICAgIDpBdXRob3I6IFZhcmlvdXMgVGFsZW50ZWQgUGVvcGxlLCBhbmQgUnVzdHkuCisgICAgICA6TG9jYXRpb246IERvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtbG9ja2luZy50bXBsCisgICAgICA6S2V5d29yZHM6IGxvY2tzLCBsb2NraW5nLCBzcGlubG9jaywgc2VtYXBob3JlLCBhdG9taWMsIHJhY2UKKyAgICAgICAgY29uZGl0aW9uLCBib3R0b20gaGFsdmVzLCB0YXNrbGV0cywgc29mdGlycXMuCisgICAgICA6RGVzY3JpcHRpb246IFRoZSB0aXRsZSBzYXlzIGl0IGFsbDogZG9jdW1lbnQgZGVzY3JpYmluZyB0aGUKKyAgICAgICAgbG9ja2luZyBzeXN0ZW0gaW4gdGhlIExpbnV4IEtlcm5lbCBlaXRoZXIgaW4gdW5pcHJvY2Vzc29yIG9yIFNNUAorICAgICAgICBzeXN0ZW1zLgorICAgICAgOk5vdGVzOiAiSXQgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBmb3IgdGhlIGxhdGVyICg+Mi4zLjQ3KSAyLjMKKyAgICAgICAga2VybmVscywgYnV0IG1vc3Qgb2YgaXQgYXBwbGllcyB0byAyLjIgdG9vOyAyLjAgaXMgc2xpZ2h0bHkKKyAgICAgICAgZGlmZmVyZW50Ii4gRnJlZWx5IHJlZGlzdHJpYnV0YWJsZSB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiB0aGUgR05VCisgICAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAKLSAgICAgKiBUaXRsZTogIldyaXRpbmcgQ2hhcmFjdGVyIERldmljZSBEcml2ZXIgZm9yIExpbnV4IgotICAgICAgIEF1dGhvcjogUi4gQmFydWNoIGFuZCBDLiBTY2hyb2V0ZXIuCi0gICAgICAgVVJMOgotICAgICAgIGZ0cDovL2Z0cC5sbHAuZnUtYmVybGluLmRlL3B1Yi9saW51eC9MSU5VWC1MQUIvd2hpdGVwYXBlcnMvZHJpdmVycy5wcy5negotICAgICAgIEtleXdvcmRzOiBjaGFyYWN0ZXIgZGV2aWNlIGRyaXZlcnMsIEkvTywgc2lnbmFscywgRE1BLCBhY2Nlc3NpbmcKLSAgICAgICBwb3J0cyBpbiB1c2VyIHNwYWNlLCBrZXJuZWwgZW52aXJvbm1lbnQuCi0gICAgICAgRGVzY3JpcHRpb246IDY4IHBhZ2VzIHBhcGVyIG9uIHdyaXRpbmcgY2hhcmFjdGVyIGRyaXZlcnMuIEEgbGl0dGxlCi0gICAgICAgYml0IG9sZCAoMS45OTMsIDEuOTk0KSBhbHRob3VnaCBzdGlsbCB1c2VmdWwuCitPbi1saW5lIGRvY3MKKy0tLS0tLS0tLS0tLQogCi0gICAgICogVGl0bGU6ICJEZXNpZ24gYW5kIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTZWNvbmQgRXh0ZW5kZWQKLSAgICAgICBGaWxlc3lzdGVtIgotICAgICAgIEF1dGhvcjogUsOpbXkgQ2FyZCwgVGhlb2RvcmUgVHMnbywgU3RlcGhlbiBUd2VlZGllLgotICAgICAgIFVSTDogaHR0cDovL3dlYi5taXQuZWR1L3R5dHNvL3d3dy9saW51eC9leHQyaW50cm8uaHRtbAotICAgICAgIEtleXdvcmRzOiBleHQyLCBsaW51eCBmcyBoaXN0b3J5LCBpbm9kZSwgZGlyZWN0b3J5LCBsaW5rLCBkZXZpY2VzLAotICAgICAgIFZGUywgcGh5c2ljYWwgc3RydWN0dXJlLCBwZXJmb3JtYW5jZSwgYmVuY2htYXJrcywgZXh0MmZzIGxpYnJhcnksCi0gICAgICAgZXh0MmZzIHRvb2xzLCBlMmZzY2suCi0gICAgICAgRGVzY3JpcHRpb246IFBhcGVyIHdyaXR0ZW4gYnkgdGhyZWUgb2YgdGhlIHRvcCBleHQyIGhhY2tlcnMuCi0gICAgICAgQ292ZXJzIExpbnV4IGZpbGVzeXN0ZW1zIGhpc3RvcnksIGV4dDIgbW90aXZhdGlvbiwgZXh0MiBmZWF0dXJlcywKLSAgICAgICBkZXNpZ24sIHBoeXNpY2FsIHN0cnVjdHVyZSBvbiBkaXNrLCBwZXJmb3JtYW5jZSwgYmVuY2htYXJrcywKLSAgICAgICBlMmZzY2sncyBwYXNzZXMgZGVzY3JpcHRpb24uLi4gQSBtdXN0IHJlYWQhCi0gICAgICAgTm90ZXM6IFRoaXMgcGFwZXIgd2FzIGZpcnN0IHB1Ymxpc2hlZCBpbiB0aGUgUHJvY2VlZGluZ3Mgb2YgdGhlCi0gICAgICAgRmlyc3QgRHV0Y2ggSW50ZXJuYXRpb25hbCBTeW1wb3NpdW0gb24gTGludXgsIElTQk4gOTAtMzY3LTAzODUtOS4KKyAgICAqIFRpdGxlOiAqKkxpbnV4IEtlcm5lbCBNYWlsaW5nIExpc3QgR2xvc3NhcnkqKgogCi0gICAgICogVGl0bGU6ICJBbmFseXNpcyBvZiB0aGUgRXh0MmZzIHN0cnVjdHVyZSIKLSAgICAgICBBdXRob3I6IExvdWlzLURvbWluaXF1ZSBEdWJlYXUuCi0gICAgICAgVVJMOiBodHRwOi8vdGVhY2hpbmcuY3NzZS51d2EuZWR1LmF1L3VuaXRzL0NJVFMyMDAyL2ZzLWV4dDIvCi0gICAgICAgS2V5d29yZHM6IGV4dDIsIGZpbGVzeXN0ZW0sIGV4dDJmcy4KLSAgICAgICBEZXNjcmlwdGlvbjogRGVzY3JpcHRpb24gb2YgZXh0MidzIGJsb2NrcywgZGlyZWN0b3JpZXMsIGlub2RlcywKLSAgICAgICBiaXRtYXBzLCBpbnZhcmlhbnRzLi4uCisgICAgICA6QXV0aG9yOiB2YXJpb3VzCisgICAgICA6VVJMOiBodHRwOi8va2VybmVsbmV3Ymllcy5vcmcvZ2xvc3NhcnkvCisgICAgICA6RGF0ZTogcm9sbGluZyB2ZXJzaW9uCisgICAgICA6S2V5d29yZHM6IGdsb3NzYXJ5LCB0ZXJtcywgbGludXgta2VybmVsLgorICAgICAgOkRlc2NyaXB0aW9uOiBGcm9tIHRoZSBpbnRyb2R1Y3Rpb246ICJUaGlzIGdsb3NzYXJ5IGlzIGludGVuZGVkIGFzCisgICAgICAgIGEgYnJpZWYgZGVzY3JpcHRpb24gb2Ygc29tZSBvZiB0aGUgYWNyb255bXMgYW5kIHRlcm1zIHlvdSBtYXkgaGVhcgorICAgICAgICBkdXJpbmcgZGlzY3Vzc2lvbiBvZiB0aGUgTGludXgga2VybmVsIi4KIAotICAgICAqIFRpdGxlOiAiSm91cm5hbGluZyB0aGUgTGludXggZXh0MmZzIEZpbGVzeXN0ZW0iCi0gICAgICAgQXV0aG9yOiBTdGVwaGVuIEMuIFR3ZWVkaWUuCi0gICAgICAgVVJMOgotICAgICAgIGZ0cDovL2Z0cC51ay5saW51eC5vcmcvcHViL2xpbnV4L3NjdC9mcy9qZnMvam91cm5hbC1kZXNpZ24ucHMuZ3oKLSAgICAgICBLZXl3b3JkczogZXh0Mywgam91cm5hbGluZy4KLSAgICAgICBEZXNjcmlwdGlvbjogRXhjZWxsZW50IDgtcGFnZXMgcGFwZXIgZXhwbGFpbmluZyB0aGUgam91cm5hbGluZwotICAgICAgIGNhcGFiaWxpdGllcyBhZGRlZCB0byBleHQyIGJ5IHRoZSBhdXRob3IsIHNob3dpbmcgZGlmZmVyZW50Ci0gICAgICAgcHJvYmxlbXMgZmFjZWQgYW5kIHRoZSBhbHRlcm5hdGl2ZXMgY2hvc2VuLgorICAgICogVGl0bGU6ICoqVHJhY2luZyB0aGUgV2F5IG9mIERhdGEgaW4gYSBUQ1AgQ29ubmVjdGlvbiB0aHJvdWdoIHRoZSBMaW51eCBLZXJuZWwqKgogCi0gICAgICogVGl0bGU6ICJLZXJuZWwgQVBJIGNoYW5nZXMgZnJvbSAyLjAgdG8gMi4yIgotICAgICAgIEF1dGhvcjogUmljaGFyZCBHb29jaC4KLSAgICAgICBVUkw6IGh0dHA6Ly93d3cuc2FmZS1tYm94LmNvbS9+cmdvb2NoL2xpbnV4L2RvY3MvcG9ydGluZy10by0yLjIuaHRtbAotICAgICAgIEtleXdvcmRzOiAyLjIsIGNoYW5nZXMuCi0gICAgICAgRGVzY3JpcHRpb246IEtlcm5lbCBmdW5jdGlvbnMvc3RydWN0dXJlcy92YXJpYWJsZXMgd2hpY2ggY2hhbmdlZAotICAgICAgIGZyb20gMi4wLnggdG8gMi4yLnguCisgICAgICA6QXV0aG9yOiBSaWNoYXJkIFNhaWxlcgorICAgICAgOlVSTDogaHR0cHM6Ly9hcmNoaXZlLm9yZy9kZXRhaWxzL2xpbnV4X2tlcm5lbF9kYXRhX2Zsb3dfc2hvcnRfcGFwZXIKKyAgICAgIDpEYXRlOiAyMDE2CisgICAgICA6S2V5d29yZHM6IExpbnV4IEtlcm5lbCBOZXR3b3JraW5nLCBUQ1AsIHRyYWNpbmcsIGZ0cmFjZQorICAgICAgOkRlc2NyaXB0aW9uOiBBIHNlbWluYXIgcGFwZXIgZXhwbGFpbmluZyBmdHJhY2UgYW5kIGhvdyB0byB1c2UgaXQgZm9yCisgICAgICAgIHVuZGVyc3RhbmRpbmcgbGludXgga2VybmVsIGludGVybmFscywKKyAgICAgICAgaWxsdXN0cmF0ZWQgYXQgdHJhY2luZyB0aGUgd2F5IG9mIGEgVENQIHBhY2tldCB0aHJvdWdoIHRoZSBrZXJuZWwuCisgICAgICA6QWJzdHJhY3Q6ICpUaGlzIHNob3J0IHBhcGVyIG91dGxpbmVzIHRoZSB1c2FnZSBvZiBmdHJhY2UgYSB0cmFjaW5nIGZyYW1ld29yaworICAgICAgICBhcyBhIHRvb2wgdG8gdW5kZXJzdGFuZCBhIHJ1bm5pbmcgTGludXggc3lzdGVtLgorICAgICAgICBIYXZpbmcgb2J0YWluZWQgYSB0cmFjZS1sb2cgYSBrZXJuZWwgaGFja2VyIGNhbiByZWFkIGFuZCB1bmRlcnN0YW5kCisgICAgICAgIHNvdXJjZSBjb2RlIG1vcmUgZGV0ZXJtaW5lZCBhbmQgd2l0aCBjb250ZXh0LgorICAgICAgICBJbiBhIGRldGFpbGVkIGV4YW1wbGUgdGhpcyBhcHByb2FjaCBpcyBkZW1vbnN0cmF0ZWQgaW4gdHJhY2luZworICAgICAgICBhbmQgdGhlIHdheSBvZiBkYXRhIGluIGEgVENQIENvbm5lY3Rpb24gdGhyb3VnaCB0aGUga2VybmVsLgorICAgICAgICBGaW5hbGx5IHRoaXMgdHJhY2UtbG9nIGlzIHVzZWQgYXMgYmFzZSBmb3IgbW9yZSBhIGV4YWN0IGNvbmNlcHR1YWwKKyAgICAgICAgZXhwbG9yYXRpb24gYW5kIGRlc2NyaXB0aW9uIG9mIHRoZSBMaW51eCBUQ1AvSVAgaW1wbGVtZW50YXRpb24uKgogCi0gICAgICogVGl0bGU6ICJLZXJuZWwgQVBJIGNoYW5nZXMgZnJvbSAyLjIgdG8gMi40IgotICAgICAgIEF1dGhvcjogUmljaGFyZCBHb29jaC4KLSAgICAgICBVUkw6IGh0dHA6Ly93d3cuc2FmZS1tYm94LmNvbS9+cmdvb2NoL2xpbnV4L2RvY3MvcG9ydGluZy10by0yLjQuaHRtbAotICAgICAgIEtleXdvcmRzOiAyLjQsIGNoYW5nZXMuCi0gICAgICAgRGVzY3JpcHRpb246IEtlcm5lbCBmdW5jdGlvbnMvc3RydWN0dXJlcy92YXJpYWJsZXMgd2hpY2ggY2hhbmdlZAotICAgICAgIGZyb20gMi4yLnggdG8gMi40LnguCi0gICAgICAgCi0gICAgICogVGl0bGU6ICJMaW51eCBLZXJuZWwgTW9kdWxlIFByb2dyYW1taW5nIEd1aWRlIgotICAgICAgIEF1dGhvcjogT3JpIFBvbWVyYW50ei4KLSAgICAgICBVUkw6IGh0dHA6Ly90bGRwLm9yZy9MRFAvbGttcGcvMi42L2h0bWwvaW5kZXguaHRtbAotICAgICAgIEtleXdvcmRzOiBtb2R1bGVzLCBHUEwgYm9vaywgL3Byb2MsIGlvY3Rscywgc3lzdGVtIGNhbGxzLAotICAgICAgIGludGVycnVwdCBoYW5kbGVycyAuCi0gICAgICAgRGVzY3JpcHRpb246IFZlcnkgbmljZSA5MiBwYWdlcyBHUEwgYm9vayBvbiB0aGUgdG9waWMgb2YgbW9kdWxlcwotICAgICAgIHByb2dyYW1taW5nLiBMb3RzIG9mIGV4YW1wbGVzLgotICAgICAgIAotICAgICAqIFRpdGxlOiAiSS9PIEV2ZW50IEhhbmRsaW5nIFVuZGVyIExpbnV4IgotICAgICAgIEF1dGhvcjogUmljaGFyZCBHb29jaC4KLSAgICAgICBLZXl3b3JkczogSU8sIEkvTywgc2VsZWN0KDIpLCBwb2xsKDIpLCBGRHMsIGFpb19yZWFkKDIpLCByZWFkaW5lc3MKLSAgICAgICBldmVudCBxdWV1ZXMuCi0gICAgICAgRGVzY3JpcHRpb246IEZyb20gdGhlIEludHJvZHVjdGlvbjogIkkvTyBFdmVudCBoYW5kbGluZyBpcyBhYm91dAotICAgICAgIGhvdyB5b3VyIE9wZXJhdGluZyBTeXN0ZW0gYWxsb3dzIHlvdSB0byBtYW5hZ2UgYSBsYXJnZSBudW1iZXIgb2YKLSAgICAgICBvcGVuIGZpbGVzIChmaWxlIGRlc2NyaXB0b3JzIGluIFVOSVgvUE9TSVgsIG9yIEZEcykgaW4geW91cgotICAgICAgIGFwcGxpY2F0aW9uLiBZb3Ugd2FudCB0aGUgT1MgdG8gbm90aWZ5IHlvdSB3aGVuIEZEcyBiZWNvbWUgYWN0aXZlCi0gICAgICAgKGhhdmUgZGF0YSByZWFkeSB0byBiZSByZWFkIG9yIGFyZSByZWFkeSBmb3Igd3JpdGluZykuIElkZWFsbHkgeW91Ci0gICAgICAgd2FudCBhIG1lY2hhbmlzbSB0aGF0IGlzIHNjYWxhYmxlLiBUaGlzIG1lYW5zIGEgbGFyZ2UgbnVtYmVyIG9mCi0gICAgICAgaW5hY3RpdmUgRkRzIGNvc3QgdmVyeSBsaXR0bGUgaW4gbWVtb3J5IGFuZCBDUFUgdGltZSB0byBtYW5hZ2UiLgotICAgICAgIAotICAgICAqIFRpdGxlOiAiVGhlIEtlcm5lbCBIYWNraW5nIEhPV1RPIgotICAgICAgIEF1dGhvcjogVmFyaW91cyBUYWxlbnRlZCBQZW9wbGUsIGFuZCBSdXN0eS4KLSAgICAgICBMb2NhdGlvbjogaW4ga2VybmVsIHRyZWUsIERvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtaGFja2luZy50bXBsCi0gICAgICAgKG11c3QgYmUgYnVpbHQgYXMgIm1ha2Uge2h0bWxkb2NzIHwgcHNkb2NzIHwgcGRmZG9jc30pCi0gICAgICAgS2V5d29yZHM6IEhPV1RPLCBrZXJuZWwgY29udGV4dHMsIGRlYWRsb2NrLCBsb2NraW5nLCBtb2R1bGVzLAotICAgICAgIHN5bWJvbHMsIHJldHVybiBjb252ZW50aW9ucy4KLSAgICAgICBEZXNjcmlwdGlvbjogRnJvbSB0aGUgSW50cm9kdWN0aW9uOiAiUGxlYXNlIHVuZGVyc3RhbmQgdGhhdCBJCi0gICAgICAgbmV2ZXIgd2FudGVkIHRvIHdyaXRlIHRoaXMgZG9jdW1lbnQsIGJlaW5nIGdyb3NzbHkgdW5kZXJxdWFsaWZpZWQsCi0gICAgICAgYnV0IEkgYWx3YXlzIHdhbnRlZCB0byByZWFkIGl0LCBhbmQgdGhpcyB3YXMgdGhlIG9ubHkgd2F5LiBJCi0gICAgICAgc2ltcGx5IGV4cGxhaW4gc29tZSBiZXN0IHByYWN0aWNlcywgYW5kIGdpdmUgcmVhZGluZyBlbnRyeS1wb2ludHMKLSAgICAgICBpbnRvIHRoZSBrZXJuZWwgc291cmNlcy4gSSBhdm9pZCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzOiB0aGF0J3MKLSAgICAgICB3aGF0IHRoZSBjb2RlIGlzIGZvciwgYW5kIEkgaWdub3JlIHdob2xlIHRyYWN0cyBvZiB1c2VmdWwKLSAgICAgICByb3V0aW5lcy4gVGhpcyBkb2N1bWVudCBhc3N1bWVzIGZhbWlsaWFyaXR5IHdpdGggQywgYW5kIGFuCi0gICAgICAgdW5kZXJzdGFuZGluZyBvZiB3aGF0IHRoZSBrZXJuZWwgaXMsIGFuZCBob3cgaXQgaXMgdXNlZC4gSXQgd2FzCi0gICAgICAgb3JpZ2luYWxseSB3cml0dGVuIGZvciB0aGUgMi4zIGtlcm5lbHMsIGJ1dCBuZWFybHkgYWxsIG9mIGl0Ci0gICAgICAgYXBwbGllcyB0byAyLjIgdG9vOyAyLjAgaXMgc2xpZ2h0bHkgZGlmZmVyZW50Ii4KLSAgICAgICAKLSAgICAgKiBUaXRsZTogIldyaXRpbmcgYW4gQUxTQSBEcml2ZXIiCi0gICAgICAgQXV0aG9yOiBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+Ci0gICAgICAgVVJMOiBodHRwOi8vd3d3LmFsc2EtcHJvamVjdC5vcmcvfml3YWkvd3JpdGluZy1hbi1hbHNhLWRyaXZlci9pbmRleC5odG1sCi0gICAgICAgS2V5d29yZHM6IEFMU0EsIHNvdW5kLCBzb3VuZGNhcmQsIGRyaXZlciwgbG93bGV2ZWwsIGhhcmR3YXJlLgotICAgICAgIERlc2NyaXB0aW9uOiBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUgZm9yIGRldmVsb3BlcnMsCi0gICAgICAgYm90aCBhdCBrZXJuZWwgYW5kIHVzZXItbGV2ZWwgc2lkZXMuIEFMU0EgaXMgdGhlIExpbnV4IGtlcm5lbAotICAgICAgIHNvdW5kIGFyY2hpdGVjdHVyZSBpbiB0aGUgMi42IGtlcm5lbCB2ZXJzaW9uLgotICAgICAgIAotICAgICAqIFRpdGxlOiAiUHJvZ3JhbW1pbmcgR3VpZGUgZm9yIExpbnV4IFVTQiBEZXZpY2UgRHJpdmVycyIKLSAgICAgICBBdXRob3I6IERldGxlZiBGbGllZ2wuCi0gICAgICAgVVJMOiBodHRwOi8vdXNiLmluLnR1bS5kZS91c2Jkb2MvCi0gICAgICAgS2V5d29yZHM6IFVTQiwgdW5pdmVyc2FsIHNlcmlhbCBidXMuCi0gICAgICAgRGVzY3JpcHRpb246IEEgbXVzdC1yZWFkLiBGcm9tIHRoZSBQcmVmYWNlOiAiVGhpcyBkb2N1bWVudCBzaG91bGQKLSAgICAgICBnaXZlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBVU0IKLSAgICAgICBzdWJzeXN0ZW0gYW5kIGl0cyBBUEkgZm9yIFVTQiBkZXZpY2UgZHJpdmVycy4gVGhlIGZpcnN0IHNlY3Rpb24KLSAgICAgICB3aWxsIGRlYWwgd2l0aCB0aGUgYmFzaWNzIG9mIFVTQiBkZXZpY2VzLiBZb3Ugd2lsbCBsZWFybiBhYm91dAotICAgICAgIGRpZmZlcmVudCB0eXBlcyBvZiBkZXZpY2VzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiBHb2luZyBpbnRvIGRldGFpbAotICAgICAgIHlvdSB3aWxsIHNlZSBob3cgVVNCIGRldmljZXMgY29tbXVuaWNhdGUgb24gdGhlIGJ1cy4gVGhlIHNlY29uZAotICAgICAgIHNlY3Rpb24gZ2l2ZXMgYW4gb3ZlcnZpZXcgb2YgdGhlIExpbnV4IFVTQiBzdWJzeXN0ZW0gWzJdIGFuZCB0aGUKLSAgICAgICBkZXZpY2UgZHJpdmVyIGZyYW1ld29yay4gVGhlbiB0aGUgQVBJIGFuZCBpdHMgZGF0YSBzdHJ1Y3R1cmVzIHdpbGwKLSAgICAgICBiZSBleHBsYWluZWQgc3RlcCBieSBzdGVwLiBUaGUgbGFzdCBzZWN0aW9uIG9mIHRoaXMgZG9jdW1lbnQKLSAgICAgICBjb250YWlucyBhIHJlZmVyZW5jZSBvZiBhbGwgQVBJIGNhbGxzIGFuZCB0aGVpciByZXR1cm4gY29kZXMiLgotICAgICAgIE5vdGVzOiBCZXdhcmU6IHRoZSBtYWluIHBhZ2Ugc3RhdGVzOiAiVGhpcyBkb2N1bWVudCBtYXkgbm90IGJlCi0gICAgICAgcHVibGlzaGVkLCBwcmludGVkIG9yIHVzZWQgaW4gZXhjZXJwdHMgd2l0aG91dCBleHBsaWNpdCBwZXJtaXNzaW9uCi0gICAgICAgb2YgdGhlIGF1dGhvciIuIEZvcnR1bmF0ZWx5LCBpdCBtYXkgc3RpbGwgYmUgcmVhZC4uLgorICAgICogVGl0bGU6ICoqT24gc3VibWl0dGluZyBrZXJuZWwgUGF0Y2hlcyoqCiAKLSAgICAgKiBUaXRsZTogIkxpbnV4IEtlcm5lbCBNYWlsaW5nIExpc3QgR2xvc3NhcnkiCi0gICAgICAgQXV0aG9yOiB2YXJpb3VzCi0gICAgICAgVVJMOiBodHRwOi8va2VybmVsbmV3Ymllcy5vcmcvZ2xvc3NhcnkvCi0gICAgICAgS2V5d29yZHM6IGdsb3NzYXJ5LCB0ZXJtcywgbGludXgta2VybmVsLgotICAgICAgIERlc2NyaXB0aW9uOiBGcm9tIHRoZSBpbnRyb2R1Y3Rpb246ICJUaGlzIGdsb3NzYXJ5IGlzIGludGVuZGVkIGFzCi0gICAgICAgYSBicmllZiBkZXNjcmlwdGlvbiBvZiBzb21lIG9mIHRoZSBhY3JvbnltcyBhbmQgdGVybXMgeW91IG1heSBoZWFyCi0gICAgICAgZHVyaW5nIGRpc2N1c3Npb24gb2YgdGhlIExpbnV4IGtlcm5lbCIuCi0gICAgICAgCi0gICAgICogVGl0bGU6ICJMaW51eCBLZXJuZWwgTG9ja2luZyBIT1dUTyIKLSAgICAgICBBdXRob3I6IFZhcmlvdXMgVGFsZW50ZWQgUGVvcGxlLCBhbmQgUnVzdHkuCi0gICAgICAgTG9jYXRpb246IGluIGtlcm5lbCB0cmVlLCBEb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWxvY2tpbmcudG1wbAotICAgICAgIChtdXN0IGJlIGJ1aWx0IGFzICJtYWtlIHtodG1sZG9jcyB8IHBzZG9jcyB8IHBkZmRvY3N9KQotICAgICAgIEtleXdvcmRzOiBsb2NrcywgbG9ja2luZywgc3BpbmxvY2ssIHNlbWFwaG9yZSwgYXRvbWljLCByYWNlCi0gICAgICAgY29uZGl0aW9uLCBib3R0b20gaGFsdmVzLCB0YXNrbGV0cywgc29mdGlycXMuCi0gICAgICAgRGVzY3JpcHRpb246IFRoZSB0aXRsZSBzYXlzIGl0IGFsbDogZG9jdW1lbnQgZGVzY3JpYmluZyB0aGUKLSAgICAgICBsb2NraW5nIHN5c3RlbSBpbiB0aGUgTGludXggS2VybmVsIGVpdGhlciBpbiB1bmlwcm9jZXNzb3Igb3IgU01QCi0gICAgICAgc3lzdGVtcy4KLSAgICAgICBOb3RlczogIkl0IHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gZm9yIHRoZSBsYXRlciAoPjIuMy40NykgMi4zCi0gICAgICAga2VybmVscywgYnV0IG1vc3Qgb2YgaXQgYXBwbGllcyB0byAyLjIgdG9vOyAyLjAgaXMgc2xpZ2h0bHkKLSAgICAgICBkaWZmZXJlbnQiLiBGcmVlbHkgcmVkaXN0cmlidXRhYmxlIHVuZGVyIHRoZSBjb25kaXRpb25zIG9mIHRoZSBHTlUKLSAgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICAgICAgOkF1dGhvcjogQW5kaSBLbGVlbgorICAgICAgOlVSTDogaHR0cDovL2hhbG9iYXRlcy5kZS9vbi1zdWJtaXR0aW5nLWtlcm5lbC1wYXRjaGVzLnBkZgorICAgICAgOkRhdGU6IDIwMDgKKyAgICAgIDpLZXl3b3JkczogcGF0Y2hlcywgcmV2aWV3IHByb2Nlc3MsIHR5cGVzIG9mIHN1Ym1pc3Npb25zLCBiYXNpYyBydWxlcywgY2FzZSBzdHVkaWVzCisgICAgICA6RGVzY3JpcHRpb246IFRoaXMgcGFwZXIgZ2l2ZXMgc2V2ZXJhbCBleHBlcmllbmNlIHZhbHVlcyBvbiB3aGF0IHR5cGVzIG9mIHBhdGNoZXMKKyAgICAgICAgdGhlcmUgYXJlIGFuZCBob3cgbGlrbGV5IHRoZXkgZ2V0IG1lcmdlZC4KKyAgICAgIDpBYnN0cmFjdDoKKyAgICAgICAgWy4uLl0uIFRoaXMgcGFwZXIgZXhhbWluZXMgc29tZSBjb21tb24gcHJvYmxlbXMgZm9yCisgICAgICAgIHN1Ym1pdHRpbmcgbGFyZ2VyIGNoYW5nZXMgYW5kIHNvbWUgc3RyYXRlZ2llcyB0byBhdm9pZCBwcm9ibGVtcy4KIAotICAgICAqIFRpdGxlOiAiR2xvYmFsIHNwaW5sb2NrIGxpc3QgYW5kIHVzYWdlIgotICAgICAgIEF1dGhvcjogUmljayBMaW5kc2xleS4KLSAgICAgICBVUkw6IGh0dHA6Ly9sc2Uuc291cmNlZm9yZ2UubmV0L2xvY2toaWVyL2dsb2JhbC1zcGluLWxvY2sKLSAgICAgICBLZXl3b3Jkczogc3BpbmxvY2suCi0gICAgICAgRGVzY3JpcHRpb246IFRoaXMgaXMgYW4gYXR0ZW1wdCB0byBkb2N1bWVudCBib3RoIHRoZSBleGlzdGVuY2UgYW5kCi0gICAgICAgdXNhZ2Ugb2YgdGhlIHNwaW5sb2NrcyBpbiB0aGUgTGludXggMi40LjUga2VybmVsLiBDb21wcmVoZW5zaXZlCi0gICAgICAgbGlzdCBvZiBzcGlubG9ja3Mgc2hvd2luZyB3aGVuIHRoZXkgYXJlIHVzZWQsIHdoaWNoIGZ1bmN0aW9ucwotICAgICAgIGFjY2VzcyB0aGVtLCBob3cgZWFjaCBsb2NrIGlzIGFjcXVpcmVkLCB1bmRlciB3aGF0IGNvbmRpdGlvbnMgaXQKLSAgICAgICBpcyBoZWxkLCB3aGV0aGVyIGludGVycnVwdHMgY2FuIG9jY3VyIG9yIG5vdCB3aGlsZSBpdCBpcyBoZWxkLi4uCisgICAgKiBUaXRsZTogKipPdmVydmlldyBvZiB0aGUgVmlydHVhbCBGaWxlIFN5c3RlbSoqCiAKLSAgICAgKiBUaXRsZTogIlBvcnRpbmcgTGludXggMi4wIERyaXZlcnMgVG8gTGludXggMi4yOiBDaGFuZ2VzIGFuZCBOZXcKLSAgICAgICBGZWF0dXJlcyAiCi0gICAgICAgQXV0aG9yOiBBbGFuIENveC4KLSAgICAgICBVUkw6IGh0dHA6Ly93d3cubGludXgtbWFnLmNvbS8xOTk5LTA1L2dlYXJfMDEuaHRtbAotICAgICAgIEtleXdvcmRzOiBwb3J0cywgcG9ydGluZy4KLSAgICAgICBEZXNjcmlwdGlvbjogQXJ0aWNsZSBmcm9tIExpbnV4IE1hZ2F6aW5lIG9uIHBvcnRpbmcgZnJvbSAyLjAgdG8KLSAgICAgICAyLjIga2VybmVscy4KKyAgICAgIDpBdXRob3I6IFJpY2hhcmQgR29vY2guCisgICAgICA6VVJMOiBodHRwOi8vd3d3Lm1qbXdpcmVkLm5ldC9rZXJuZWwvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZnMudHh0CisgICAgICA6RGF0ZTogMjAwNworICAgICAgOktleXdvcmRzOiBWRlMsIEZpbGUgU3lzdGVtLCBtb3VudGluZyBmaWxlc3lzdGVtcywgb3BlbmluZyBmaWxlcywKKyAgICAgICAgZGVudHJpZXMsIGRjYWNoZS4KKyAgICAgIDpEZXNjcmlwdGlvbjogQnJpZWYgaW50cm9kdWN0aW9uIHRvIHRoZSBMaW51eCBWaXJ0dWFsIEZpbGUgU3lzdGVtLgorICAgICAgICBXaGF0IGlzIGl0LCBob3cgaXQgd29ya3MsIG9wZXJhdGlvbnMgdGFrZW4gd2hlbiBvcGVuaW5nIGEgZmlsZSBvcgorICAgICAgICBtb3VudGluZyBhIGZpbGUgc3lzdGVtIGFuZCBkZXNjcmlwdGlvbiBvZiBpbXBvcnRhbnQgZGF0YQorICAgICAgICBzdHJ1Y3R1cmVzIGV4cGxhaW5pbmcgdGhlIHB1cnBvc2Ugb2YgZWFjaCBvZiB0aGVpciBlbnRyaWVzLgogCi0gICAgICogVGl0bGU6ICJQb3J0aW5nIERldmljZSBEcml2ZXJzIFRvIExpbnV4IDIuMjogcGFydCBJSSIKLSAgICAgICBBdXRob3I6IEFsYW4gQ294LgotICAgICAgIFVSTDogaHR0cDovL3d3dy5saW51eC1tYWcuY29tL2lkLzIzOCAKLSAgICAgICBLZXl3b3JkczogcG9ydHMsIHBvcnRpbmcuCi0gICAgICAgRGVzY3JpcHRpb246IFNlY29uZCBwYXJ0IG9uIHBvcnRpbmcgZnJvbSAyLjAgdG8gMi4yIGtlcm5lbHMuCisgICAgKiBUaXRsZTogKipMaW51eCBEZXZpY2UgRHJpdmVycywgVGhpcmQgRWRpdGlvbioqCiAKLSAgICAgKiBUaXRsZTogIkhvdyBUbyBNYWtlIFN1cmUgWW91ciBEcml2ZXIgV2lsbCBXb3JrIE9uIFRoZSBQb3dlcgotICAgICAgIE1hY2ludG9zaCIKLSAgICAgICBBdXRob3I6IFBhdWwgTWFja2VycmFzLgotICAgICAgIFVSTDogaHR0cDovL3d3dy5saW51eC1tYWcuY29tL2lkLzI2MQotICAgICAgIEtleXdvcmRzOiBNYWMsIFBvd2VyIE1hY2ludG9zaCwgcG9ydGluZywgZHJpdmVycywgY29tcGF0aWJpbGl0eS4KLSAgICAgICBEZXNjcmlwdGlvbjogVGhlIHRpdGxlIHNheXMgaXQgYWxsLgorICAgICAgOkF1dGhvcjogSm9uYXRoYW4gQ29yYmV0LCBBbGVzc2FuZHJvIFJ1YmluaSwgR3JlZyBLcm9haC1IYXJ0bWFuCisgICAgICA6VVJMOiBodHRwOi8vbHduLm5ldC9LZXJuZWwvTEREMy8KKyAgICAgIDpEYXRlOiAyMDA1CisgICAgICA6RGVzY3JpcHRpb246IEEgNjAwLXBhZ2UgYm9vayBjb3ZlcmluZyB0aGUgKDIuNi4xMCkgZHJpdmVyCisgICAgICAgIHByb2dyYW1taW5nIEFQSSBhbmQga2VybmVsIGhhY2tpbmcgaW4gZ2VuZXJhbC4gIEF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICAgICAgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDIuMCBsaWNlbnNlLgorICAgICAgOm5vdGU6IFlvdSBjYW4gYWxzbyA6cmVmOmBwdXJjaGFzZSBhIGNvcHkgZnJvbSBPJ1JlaWxseSBvciBlbHNld2hlcmUgIDxsZGQzX3B1Ymxpc2hlZD5gLgogCi0gICAgICogVGl0bGU6ICJBbiBJbnRyb2R1Y3Rpb24gdG8gU0NTSSBEcml2ZXJzIgotICAgICAgIEF1dGhvcjogQWxhbiBDb3guCi0gICAgICAgVVJMOiBodHRwOi8vd3d3LmxpbnV4LW1hZy5jb20vaWQvMjg0Ci0gICAgICAgS2V5d29yZHM6IFNDU0ksIGRldmljZSwgZHJpdmVyLgotICAgICAgIERlc2NyaXB0aW9uOiBUaGUgdGl0bGUgc2F5cyBpdCBhbGwuCisgICAgKiBUaXRsZTogKipXcml0aW5nIGFuIEFMU0EgRHJpdmVyKioKIAotICAgICAqIFRpdGxlOiAiQWR2YW5jZWQgU0NTSSBEcml2ZXJzIEFuZCBPdGhlciBUYWxlcyIKLSAgICAgICBBdXRob3I6IEFsYW4gQ294LgotICAgICAgIFVSTDogaHR0cDovL3d3dy5saW51eC1tYWcuY29tL2lkLzMwNwotICAgICAgIEtleXdvcmRzOiBTQ1NJLCBkZXZpY2UsIGRyaXZlciwgYWR2YW5jZWQuCi0gICAgICAgRGVzY3JpcHRpb246IFRoZSB0aXRsZSBzYXlzIGl0IGFsbC4KKyAgICAgIDpBdXRob3I6IFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAgICAgIDpVUkw6IGh0dHA6Ly93d3cuYWxzYS1wcm9qZWN0Lm9yZy9+aXdhaS93cml0aW5nLWFuLWFsc2EtZHJpdmVyL2luZGV4Lmh0bWwKKyAgICAgIDpEYXRlOiAyMDA1CisgICAgICA6S2V5d29yZHM6IEFMU0EsIHNvdW5kLCBzb3VuZGNhcmQsIGRyaXZlciwgbG93bGV2ZWwsIGhhcmR3YXJlLgorICAgICAgOkRlc2NyaXB0aW9uOiBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUgZm9yIGRldmVsb3BlcnMsCisgICAgICAgIGJvdGggYXQga2VybmVsIGFuZCB1c2VyLWxldmVsIHNpZGVzLiBBTFNBIGlzIHRoZSBMaW51eCBrZXJuZWwKKyAgICAgICAgc291bmQgYXJjaGl0ZWN0dXJlIGluIHRoZSAyLjYga2VybmVsIHZlcnNpb24uCiAKLSAgICAgKiBUaXRsZTogIldyaXRpbmcgTGludXggTW91c2UgRHJpdmVycyIKLSAgICAgICBBdXRob3I6IEFsYW4gQ294LgotICAgICAgIFVSTDogaHR0cDovL3d3dy5saW51eC1tYWcuY29tL2lkLzMzMAotICAgICAgIEtleXdvcmRzOiBtb3VzZSwgZHJpdmVyLCBncG0uCi0gICAgICAgRGVzY3JpcHRpb246IFRoZSB0aXRsZSBzYXlzIGl0IGFsbC4KKyAgICAqIFRpdGxlOiAqKkxpbnV4IFBDTUNJQSBQcm9ncmFtbWVyJ3MgR3VpZGUqKgogCi0gICAgICogVGl0bGU6ICJNb3JlIG9uIE1vdXNlIERyaXZlcnMiCi0gICAgICAgQXV0aG9yOiBBbGFuIENveC4KLSAgICAgICBVUkw6IGh0dHA6Ly93d3cubGludXgtbWFnLmNvbS9pZC8zNTYKLSAgICAgICBLZXl3b3JkczogbW91c2UsIGRyaXZlciwgZ3BtLCByYWNlcywgYXN5bmNocm9ub3VzIEkvTy4KLSAgICAgICBEZXNjcmlwdGlvbjogVGhlIHRpdGxlIHN0aWxsIHNheXMgaXQgYWxsLgorICAgICAgOkF1dGhvcjogRGF2aWQgSGluZHMuCisgICAgICA6VVJMOiBodHRwOi8vcGNtY2lhLWNzLnNvdXJjZWZvcmdlLm5ldC9mdHAvZG9jL1BDTUNJQS1QUk9HLmh0bWwKKyAgICAgIDpEYXRlOiAyMDAzCisgICAgICA6S2V5d29yZHM6IFBDTUNJQS4KKyAgICAgIDpEZXNjcmlwdGlvbjogIlRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGhvdyB0byB3cml0ZSBrZXJuZWwgZGV2aWNlCisgICAgICAgIGRyaXZlcnMgZm9yIHRoZSBMaW51eCBQQ01DSUEgQ2FyZCBTZXJ2aWNlcyBpbnRlcmZhY2UuIEl0IGFsc28KKyAgICAgICAgZGVzY3JpYmVzIGhvdyB0byB3cml0ZSB1c2VyLW1vZGUgdXRpbGl0aWVzIGZvciBjb21tdW5pY2F0aW5nIHdpdGgKKyAgICAgICAgQ2FyZCBTZXJ2aWNlcy4KIAotICAgICAqIFRpdGxlOiAiV3JpdGluZyBWaWRlbzRsaW51eCBSYWRpbyBEcml2ZXIiCi0gICAgICAgQXV0aG9yOiBBbGFuIENveC4KLSAgICAgICBVUkw6IGh0dHA6Ly93d3cubGludXgtbWFnLmNvbS9pZC8zODEKLSAgICAgICBLZXl3b3JkczogdmlkZW80bGludXgsIGRyaXZlciwgcmFkaW8sIHJhZGlvIGRldmljZXMuCi0gICAgICAgRGVzY3JpcHRpb246IFRoZSB0aXRsZSBzYXlzIGl0IGFsbC4KKyAgICAqIFRpdGxlOiAqKkxpbnV4IEtlcm5lbCBNb2R1bGUgUHJvZ3JhbW1pbmcgR3VpZGUqKgogCi0gICAgICogVGl0bGU6ICJWaWRlbzRsaW51eCBEcml2ZXJzLCBQYXJ0IDE6IFZpZGVvLUNhcHR1cmUgRGV2aWNlIgotICAgICAgIEF1dGhvcjogQWxhbiBDb3guCi0gICAgICAgVVJMOiBodHRwOi8vd3d3LmxpbnV4LW1hZy5jb20vaWQvNDA2Ci0gICAgICAgS2V5d29yZHM6IHZpZGVvNGxpbnV4LCBkcml2ZXIsIHZpZGVvIGNhcHR1cmUsIGNhcHR1cmUgZGV2aWNlcywKLSAgICAgICBjYW1lcmEgZHJpdmVyLgotICAgICAgIERlc2NyaXB0aW9uOiBUaGUgdGl0bGUgc2F5cyBpdCBhbGwuCisgICAgICA6QXV0aG9yOiBPcmkgUG9tZXJhbnR6LgorICAgICAgOlVSTDogaHR0cDovL3RsZHAub3JnL0xEUC9sa21wZy8yLjYvaHRtbC9pbmRleC5odG1sCisgICAgICA6RGF0ZTogMjAwMQorICAgICAgOktleXdvcmRzOiBtb2R1bGVzLCBHUEwgYm9vaywgL3Byb2MsIGlvY3Rscywgc3lzdGVtIGNhbGxzLAorICAgICAgICBpbnRlcnJ1cHQgaGFuZGxlcnMgLgorICAgICAgOkRlc2NyaXB0aW9uOiBWZXJ5IG5pY2UgOTIgcGFnZXMgR1BMIGJvb2sgb24gdGhlIHRvcGljIG9mIG1vZHVsZXMKKyAgICAgICAgcHJvZ3JhbW1pbmcuIExvdHMgb2YgZXhhbXBsZXMuCiAKLSAgICAgKiBUaXRsZTogIlZpZGVvNGxpbnV4IERyaXZlcnMsIFBhcnQgMjogVmlkZW8tY2FwdHVyZSBEZXZpY2VzIgotICAgICAgIEF1dGhvcjogQWxhbiBDb3guCi0gICAgICAgVVJMOiBodHRwOi8vd3d3LmxpbnV4LW1hZy5jb20vaWQvNDI5Ci0gICAgICAgS2V5d29yZHM6IHZpZGVvNGxpbnV4LCBkcml2ZXIsIHZpZGVvIGNhcHR1cmUsIGNhcHR1cmUgZGV2aWNlcywKLSAgICAgICBjYW1lcmEgZHJpdmVyLCBjb250cm9sLCBxdWVyeSBjYXBhYmlsaXRpZXMsIGNhcGFiaWxpdHksIGZhY2lsaXR5LgotICAgICAgIERlc2NyaXB0aW9uOiBUaGUgdGl0bGUgc2F5cyBpdCBhbGwuCisgICAgKiBUaXRsZTogKipHbG9iYWwgc3BpbmxvY2sgbGlzdCBhbmQgdXNhZ2UqKgogCi0gICAgICogVGl0bGU6ICJQQ0kgTWFuYWdlbWVudCBpbiBMaW51eCAyLjIiCi0gICAgICAgQXV0aG9yOiBBbGFuIENveC4KLSAgICAgICBVUkw6IGh0dHA6Ly93d3cubGludXgtbWFnLmNvbS9pZC80NTIKLSAgICAgICBLZXl3b3JkczogUENJLCBidXMsIGJ1cy1tYXN0ZXJpbmcuCi0gICAgICAgRGVzY3JpcHRpb246IFRoZSB0aXRsZSBzYXlzIGl0IGFsbC4KKyAgICAgIDpBdXRob3I6IFJpY2sgTGluZHNsZXkuCisgICAgICA6VVJMOiBodHRwOi8vbHNlLnNvdXJjZWZvcmdlLm5ldC9sb2NraGllci9nbG9iYWwtc3Bpbi1sb2NrCisgICAgICA6RGF0ZTogMjAwMQorICAgICAgOktleXdvcmRzOiBzcGlubG9jay4KKyAgICAgIDpEZXNjcmlwdGlvbjogVGhpcyBpcyBhbiBhdHRlbXB0IHRvIGRvY3VtZW50IGJvdGggdGhlIGV4aXN0ZW5jZSBhbmQKKyAgICAgICAgdXNhZ2Ugb2YgdGhlIHNwaW5sb2NrcyBpbiB0aGUgTGludXggMi40LjUga2VybmVsLiBDb21wcmVoZW5zaXZlCisgICAgICAgIGxpc3Qgb2Ygc3BpbmxvY2tzIHNob3dpbmcgd2hlbiB0aGV5IGFyZSB1c2VkLCB3aGljaCBmdW5jdGlvbnMKKyAgICAgICAgYWNjZXNzIHRoZW0sIGhvdyBlYWNoIGxvY2sgaXMgYWNxdWlyZWQsIHVuZGVyIHdoYXQgY29uZGl0aW9ucyBpdAorICAgICAgICBpcyBoZWxkLCB3aGV0aGVyIGludGVycnVwdHMgY2FuIG9jY3VyIG9yIG5vdCB3aGlsZSBpdCBpcyBoZWxkLi4uCiAKLSAgICAgKiBUaXRsZTogIkxpbnV4IDIuNCBLZXJuZWwgSW50ZXJuYWxzIgotICAgICAgIEF1dGhvcjogVGlncmFuIEFpdmF6aWFuIGFuZCBDaHJpc3RvcGggSGVsbHdpZy4KLSAgICAgICBVUkw6IGh0dHA6Ly93d3cubW9zZXMudWtsaW51eC5uZXQvcGF0Y2hlcy9sa2kuaHRtbAotICAgICAgIEtleXdvcmRzOiBMaW51eCwga2VybmVsLCBib290aW5nLCBTTUIgYm9vdCwgVkZTLCBwYWdlIGNhY2hlLgotICAgICAgIERlc2NyaXB0aW9uOiBBIGxpdHRsZSBib29rIHVzZWQgZm9yIGEgc2hvcnQgdHJhaW5pbmcgY291cnNlLgotICAgICAgIENvdmVycyBidWlsZGluZyB0aGUga2VybmVsIGltYWdlLCBib290aW5nIChpbmNsdWRpbmcgU01QIGJvb3R1cCksCi0gICAgICAgcHJvY2VzcyBtYW5hZ2VtZW50LCBWRlMgYW5kIG1vcmUuCisgICAgKiBUaXRsZTogKipBIExpbnV4IHZtIFJFQURNRSoqCiAKLSAgICAgKiBUaXRsZTogIkxpbnV4IElQIE5ldHdvcmtpbmcuIEEgR3VpZGUgdG8gdGhlIEltcGxlbWVudGF0aW9uIGFuZAotICAgICAgIE1vZGlmaWNhdGlvbiBvZiB0aGUgTGludXggUHJvdG9jb2wgU3RhY2suIgotICAgICAgIEF1dGhvcjogR2xlbm4gSGVycmluLgotICAgICAgIFVSTDogaHR0cDovL3d3dy5jcy51bmguZWR1L2NucmcvZ2hlcnJpbgotICAgICAgIEtleXdvcmRzOiBuZXR3b3JrLCBuZXR3b3JraW5nLCBwcm90b2NvbCwgSVAsIFVEUCwgVENQLCBjb25uZWN0aW9uLAotICAgICAgIHNvY2tldCwgcmVjZWl2aW5nLCB0cmFuc21pdHRpbmcsIGZvcndhcmRpbmcsIHJvdXRpbmcsIHBhY2tldHMsCi0gICAgICAgbW9kdWxlcywgL3Byb2MsIHNrX2J1ZmYsIEZJQiwgdGFncy4KLSAgICAgICBEZXNjcmlwdGlvbjogRXhjZWxsZW50IHBhcGVyIGRldm90ZWQgdG8gdGhlIExpbnV4IElQIE5ldHdvcmtpbmcsCi0gICAgICAgZXhwbGFpbmluZyBhbnl0aGluZyBmcm9tIHRoZSBrZXJuZWwncyB0byB0aGUgdXNlciBzcGFjZQotICAgICAgIGNvbmZpZ3VyYXRpb24gdG9vbHMnIGNvZGUuIFZlcnkgZ29vZCB0byBnZXQgYSBnZW5lcmFsIG92ZXJ2aWV3IG9mCi0gICAgICAgdGhlIGtlcm5lbCBuZXR3b3JraW5nIGltcGxlbWVudGF0aW9uIGFuZCB1bmRlcnN0YW5kIGFsbCBzdGVwcwotICAgICAgIHBhY2tldHMgZm9sbG93IGZyb20gdGhlIHRpbWUgdGhleSBhcmUgcmVjZWl2ZWQgYXQgdGhlIG5ldHdvcmsKLSAgICAgICBkZXZpY2UgdGlsbCB0aGV5IGFyZSBkZWxpdmVyZWQgdG8gYXBwbGljYXRpb25zLiBUaGUgc3R1ZGllZCBrZXJuZWwKLSAgICAgICBjb2RlIGlzIGZyb20gMi4yLjE0IHZlcnNpb24uIFByb3ZpZGVzIGNvZGUgZm9yIGEgd29ya2luZyBwYWNrZXQKLSAgICAgICBkcm9wcGVyIGV4YW1wbGUuCi0gICAgICAgCi0gICAgICogVGl0bGU6ICJHZXQgdGhvc2UgYm9hcmRzIHRhbGtpbmcgdW5kZXIgTGludXguIgotICAgICAgIEF1dGhvcjogQWxleCBJdmNoZW5rby4KLSAgICAgICBVUkw6IGh0dHA6Ly93d3cuZWRuLmNvbS9hcnRpY2xlL0NBNDY5NjguaHRtbAotICAgICAgIEtleXdvcmRzOiBkYXRhLWFjcXVpc2l0aW9uIGJvYXJkcywgZHJpdmVycywgbW9kdWxlcywgaW50ZXJydXB0cywKLSAgICAgICBtZW1vcnkgYWxsb2NhdGlvbi4KLSAgICAgICBEZXNjcmlwdGlvbjogQXJ0aWNsZSB3cml0dGVuIGZvciBwZW9wbGUgd2lzaGluZyB0byBtYWtlIHRoZWlyIGRhdGEKLSAgICAgICBhY3F1aXNpdGlvbiBib2FyZHMgd29yayBvbiB0aGVpciBHTlUvTGludXggbWFjaGluZXMuIEdpdmVzIGEgYmFzaWMKLSAgICAgICBvdmVydmlldyBvbiB3cml0aW5nIGRyaXZlcnMsIGZyb20gdGhlIG5hbWluZyBvZiBmdW5jdGlvbnMgdG8KLSAgICAgICBpbnRlcnJ1cHQgaGFuZGxpbmcuCi0gICAgICAgTm90ZXM6IFR3by1wYXJ0cyBhcnRpY2xlLiBQYXJ0IElJIGlzIGF0Ci0gICAgICAgVVJMOiBodHRwOi8vd3d3LmVkbi5jb20vYXJ0aWNsZS9DQTQ2OTk4Lmh0bWwKLSAgICAgICAKLSAgICAgKiBUaXRsZTogIkxpbnV4IFBDTUNJQSBQcm9ncmFtbWVyJ3MgR3VpZGUiCi0gICAgICAgQXV0aG9yOiBEYXZpZCBIaW5kcy4KLSAgICAgICBVUkw6IGh0dHA6Ly9wY21jaWEtY3Muc291cmNlZm9yZ2UubmV0L2Z0cC9kb2MvUENNQ0lBLVBST0cuaHRtbAotICAgICAgIEtleXdvcmRzOiBQQ01DSUEuCi0gICAgICAgRGVzY3JpcHRpb246ICJUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBob3cgdG8gd3JpdGUga2VybmVsIGRldmljZQotICAgICAgIGRyaXZlcnMgZm9yIHRoZSBMaW51eCBQQ01DSUEgQ2FyZCBTZXJ2aWNlcyBpbnRlcmZhY2UuIEl0IGFsc28KLSAgICAgICBkZXNjcmliZXMgaG93IHRvIHdyaXRlIHVzZXItbW9kZSB1dGlsaXRpZXMgZm9yIGNvbW11bmljYXRpbmcgd2l0aAotICAgICAgIENhcmQgU2VydmljZXMuCisgICAgICA6QXV0aG9yOiBLYW5vaiBTYXJjYXIuCisgICAgICA6VVJMOiBodHRwOi8va29zLmVuaXgub3JnL3B1Yi9saW51eC12bW0uaHRtbAorICAgICAgOkRhdGU6IDIwMDEKKyAgICAgIDpLZXl3b3JkczogdmlydHVhbCBtZW1vcnksIG1tLCBwZ2QsIHZtYSwgcGFnZSwgcGFnZSBmbGFncywgcGFnZQorICAgICAgICBjYWNoZSwgc3dhcCBjYWNoZSwga3N3YXBkLgorICAgICAgOkRlc2NyaXB0aW9uOiBUZWxlZ3JhcGhpYywgc2hvcnQgZGVzY3JpcHRpb25zIGFuZCBkZWZpbml0aW9ucworICAgICAgICByZWxhdGluZyB0aGUgTGludXggdmlydHVhbCBtZW1vcnkgaW1wbGVtZW50YXRpb24uCiAKLSAgICAgKiBUaXRsZTogIlRoZSBMaW51eCBLZXJuZWwgTkZTRCBJbXBsZW1lbnRhdGlvbiIKLSAgICAgICBBdXRob3I6IE5laWwgQnJvd24uCi0gICAgICAgVVJMOgotICAgICAgIGh0dHA6Ly93d3cuY3NlLnVuc3cuZWR1LmF1L35uZWlsYi9vc3MvbGludXgtY29tbWVudGFyeS9uZnNkLmh0bWwKLSAgICAgICBLZXl3b3Jkczoga25mc2QsIG5mc2QsIE5GUywgUlBDLCBsb2NrZCwgbW91bnRkLCBzdGF0ZC4KLSAgICAgICBEZXNjcmlwdGlvbjogVGhlIHRpdGxlIHNheXMgaXQgYWxsLgotICAgICAgIE5vdGVzOiBDb3ZlcnMga25mc2QncyB2ZXJzaW9uIDEuNC43IChwYXRjaCBhZ2FpbnN0IDIuMi43IGtlcm5lbCkuCi0gICAgICAgCi0gICAgICogVGl0bGU6ICJBIExpbnV4IHZtIFJFQURNRSIKLSAgICAgICBBdXRob3I6IEthbm9qIFNhcmNhci4KLSAgICAgICBVUkw6IGh0dHA6Ly9rb3MuZW5peC5vcmcvcHViL2xpbnV4LXZtbS5odG1sCi0gICAgICAgS2V5d29yZHM6IHZpcnR1YWwgbWVtb3J5LCBtbSwgcGdkLCB2bWEsIHBhZ2UsIHBhZ2UgZmxhZ3MsIHBhZ2UKLSAgICAgICBjYWNoZSwgc3dhcCBjYWNoZSwga3N3YXBkLgotICAgICAgIERlc2NyaXB0aW9uOiBUZWxlZ3JhcGhpYywgc2hvcnQgZGVzY3JpcHRpb25zIGFuZCBkZWZpbml0aW9ucwotICAgICAgIHJlbGF0aW5nIHRoZSBMaW51eCB2aXJ0dWFsIG1lbW9yeSBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAKLSAgICAgKiBUaXRsZTogIihuZWFybHkpIENvbXBsZXRlIExpbnV4IExvYWRhYmxlIEtlcm5lbCBNb2R1bGVzLiBUaGUKLSAgICAgICBkZWZpbml0aXZlIGd1aWRlIGZvciBoYWNrZXJzLCB2aXJ1cyBjb2RlcnMgYW5kIHN5c3RlbQotICAgICAgIGFkbWluaXN0cmF0b3JzLiIKLSAgICAgICBBdXRob3I6IHByYWdtYXRpYy9USEMuCi0gICAgICAgVVJMOiBodHRwOi8vcGFja2V0c3Rvcm1zZWN1cml0eS5vcmcvZG9jcy9oYWNrL0xLTV9IQUNLSU5HLmh0bWwKLSAgICAgICBLZXl3b3Jkczogc3lzY2FsbHMsIGludGVyY2VwdCwgaGlkZSwgYWJ1c2UsIHN5bWJvbCB0YWJsZS4KLSAgICAgICBEZXNjcmlwdGlvbjogSW50ZXJlc3RpbmcgcGFwZXIgb24gaG93IHRvIGFidXNlIHRoZSBMaW51eCBrZXJuZWwgaW4KLSAgICAgICBvcmRlciB0byBpbnRlcmNlcHQgYW5kIG1vZGlmeSBzeXNjYWxscywgbWFrZQotICAgICAgIGZpbGVzL2RpcmVjdG9yaWVzL3Byb2Nlc3NlcyBpbnZpc2libGUsIGJlY29tZSByb290LCBoaWphY2sgdHR5cywKLSAgICAgICB3cml0ZSBrZXJuZWwgbW9kdWxlcyBiYXNlZCB2aXJ1cy4uLiBhbmQgc29sdXRpb25zIGZvciBhZG1pbnMgdG8KLSAgICAgICBhdm9pZCBhbGwgdGhvc2UgYWJ1c2VzLgotICAgICAgIE5vdGVzOiBGb3IgMi4wLngga2VybmVscy4gR2l2ZXMgZ3VpZGFuY2VzIHRvIHBvcnQgaXQgdG8gMi4yLngKLSAgICAgICBrZXJuZWxzLgotICAgICAgIAotICAgICBCT09LUzogKE5vdCBvbi1saW5lKQotICAgCi0gICAgICogVGl0bGU6ICJMaW51eCBEZXZpY2UgRHJpdmVycyIKLSAgICAgICBBdXRob3I6IEFsZXNzYW5kcm8gUnViaW5pLgotICAgICAgIFB1Ymxpc2hlcjogTydSZWlsbHkgJiBBc3NvY2lhdGVzLgotICAgICAgIERhdGU6IDE5OTguCi0gICAgICAgUGFnZXM6IDQzOS4KLSAgICAgICBJU0JOOiAxLTU2NTkyLTI5Mi0xCi0gICAgICAgCi0gICAgICogVGl0bGU6ICJMaW51eCBEZXZpY2UgRHJpdmVycywgMm5kIEVkaXRpb24iCi0gICAgICAgQXV0aG9yOiBBbGVzc2FuZHJvIFJ1YmluaSBhbmQgSm9uYXRoYW4gQ29yYmV0LgotICAgICAgIFB1Ymxpc2hlcjogTydSZWlsbHkgJiBBc3NvY2lhdGVzLgotICAgICAgIERhdGU6IDIwMDEuCi0gICAgICAgUGFnZXM6IDU4Ni4KLSAgICAgICBJU0JOOiAwLTU5NjAwLTAwOC0xCi0gICAgICAgTm90ZXM6IEZ1cnRoZXIgaW5mb3JtYXRpb24gaW4KLSAgICAgICBodHRwOi8vd3d3Lm9yZWlsbHkuY29tL2NhdGFsb2cvbGludXhkcml2ZTIvCisgICAgKiBUaXRsZTogKipWaWRlbzRsaW51eCBEcml2ZXJzLCBQYXJ0IDE6IFZpZGVvLUNhcHR1cmUgRGV2aWNlKioKIAotICAgICAqIFRpdGxlOiAiTGludXggRGV2aWNlIERyaXZlcnMsIDNyZCBFZGl0aW9uIgotICAgICAgIEF1dGhvcnM6IEpvbmF0aGFuIENvcmJldCwgQWxlc3NhbmRybyBSdWJpbmksIGFuZCBHcmVnIEtyb2FoLUhhcnRtYW4KLSAgICAgICBQdWJsaXNoZXI6IE8nUmVpbGx5ICYgQXNzb2NpYXRlcy4KLSAgICAgICBEYXRlOiAyMDA1LgotICAgICAgIFBhZ2VzOiA2MzYuCi0gICAgICAgSVNCTjogMC01OTYtMDA1OTAtMwotICAgICAgIE5vdGVzOiBGdXJ0aGVyIGluZm9ybWF0aW9uIGluCi0gICAgICAgaHR0cDovL3d3dy5vcmVpbGx5LmNvbS9jYXRhbG9nL2xpbnV4ZHJpdmUzLwotICAgICAgIFBERiBmb3JtYXQsIFVSTDogaHR0cDovL2x3bi5uZXQvS2VybmVsL0xERDMvCisgICAgICA6QXV0aG9yOiBBbGFuIENveC4KKyAgICAgIDpVUkw6IGh0dHA6Ly93d3cubGludXgtbWFnLmNvbS9pZC80MDYKKyAgICAgIDpEYXRlOiAyMDAwCisgICAgICA6S2V5d29yZHM6IHZpZGVvNGxpbnV4LCBkcml2ZXIsIHZpZGVvIGNhcHR1cmUsIGNhcHR1cmUgZGV2aWNlcywKKyAgICAgICAgY2FtZXJhIGRyaXZlci4KKyAgICAgIDpEZXNjcmlwdGlvbjogVGhlIHRpdGxlIHNheXMgaXQgYWxsLgogCi0gICAgICogVGl0bGU6ICJMaW51eCBLZXJuZWwgSW50ZXJuYWxzIgotICAgICAgIEF1dGhvcjogTWljaGFlbCBCZWNrLgotICAgICAgIFB1Ymxpc2hlcjogQWRkaXNvbi1XZXNsZXkuCi0gICAgICAgRGF0ZTogMTk5Ny4KLSAgICAgICBJU0JOOiAwLTIwMS0zMzE0My04IChzZWNvbmQgZWRpdGlvbikKLSAgICAgICAKLSAgICAgKiBUaXRsZTogIlRoZSBEZXNpZ24gb2YgdGhlIFVOSVggT3BlcmF0aW5nIFN5c3RlbSIKLSAgICAgICBBdXRob3I6IE1hdXJpY2UgSi4gQmFjaC4KLSAgICAgICBQdWJsaXNoZXI6IFByZW50aWNlIEhhbGwuCi0gICAgICAgRGF0ZTogMTk4Ni4KLSAgICAgICBQYWdlczogNDcxLgotICAgICAgIElTQk46IDAtMTMtMjAxNzU3LTEKLSAgICAgICAKLSAgICAgKiBUaXRsZTogIlRoZSBEZXNpZ24gYW5kIEltcGxlbWVudGF0aW9uIG9mIHRoZSA0LjMgQlNEIFVOSVgKLSAgICAgICBPcGVyYXRpbmcgU3lzdGVtIgotICAgICAgIEF1dGhvcjogU2FtdWVsIEouIExlZmZsZXIsIE1hcnNoYWxsIEtpcmsgTWNLdXNpY2ssIE1pY2hhZWwgSi4KLSAgICAgICBLYXJlbHMsIEpvaG4gUy4gUXVhcnRlcm1hbi4KLSAgICAgICBQdWJsaXNoZXI6IEFkZGlzb24tV2VzbGV5LgotICAgICAgIERhdGU6IDE5ODkgKHJlcHJpbnRlZCB3aXRoIGNvcnJlY3Rpb25zIG9uIE9jdG9iZXIsIDE5OTApLgotICAgICAgIElTQk46IDAtMjAxLTA2MTk2LTEKLSAgICAgICAKLSAgICAgKiBUaXRsZTogIlRoZSBEZXNpZ24gYW5kIEltcGxlbWVudGF0aW9uIG9mIHRoZSA0LjQgQlNEIFVOSVgKLSAgICAgICBPcGVyYXRpbmcgU3lzdGVtIgotICAgICAgIEF1dGhvcjogTWFyc2hhbGwgS2lyayBNY0t1c2ljaywgS2VpdGggQm9zdGljLCBNaWNoYWVsIEouIEthcmVscywKLSAgICAgICBKb2huIFMuIFF1YXJ0ZXJtYW4uCi0gICAgICAgUHVibGlzaGVyOiBBZGRpc29uLVdlc2xleS4KLSAgICAgICBEYXRlOiAxOTk2LgotICAgICAgIElTQk46IDAtMjAxLTU0OTc5LTQKLSAgICAgICAKLSAgICAgKiBUaXRsZTogIlByb2dyYW1tYXRpb24gTGludXggMi4wIEFQSSBzeXN0ZW1lIGV0IGZvbmN0aW9ubmVtZW50IGR1Ci0gICAgICAgbm95YXUiCi0gICAgICAgQXV0aG9yOiBSZW15IENhcmQsIEVyaWMgRHVtYXMsIEZyYW5jayBNZXZlbC4KLSAgICAgICBQdWJsaXNoZXI6IEV5cm9sbGVzLgotICAgICAgIERhdGU6IDE5OTcuCi0gICAgICAgUGFnZXM6IDUyMC4KLSAgICAgICBJU0JOOiAyLTIxMi0wODkzMi01Ci0gICAgICAgTm90ZXM6IEZyZW5jaC4KKyAgICAqIFRpdGxlOiAqKlZpZGVvNGxpbnV4IERyaXZlcnMsIFBhcnQgMjogVmlkZW8tY2FwdHVyZSBEZXZpY2VzKioKIAotICAgICAqIFRpdGxlOiAiVW5peCBpbnRlcm5hbHMgLS0gdGhlIG5ldyBmcm9udGllcnMiCi0gICAgICAgQXV0aG9yOiBVcmVzaCBWYWhhbGlhLgotICAgICAgIFB1Ymxpc2hlcjogUHJlbnRpY2UgSGFsbC4KLSAgICAgICBEYXRlOiAxOTk2LgotICAgICAgIFBhZ2VzOiA2MDAuCi0gICAgICAgSVNCTjogMC0xMy0xMDE5MDgtMgorICAgICAgOkF1dGhvcjogQWxhbiBDb3guCisgICAgICA6VVJMOiBodHRwOi8vd3d3LmxpbnV4LW1hZy5jb20vaWQvNDI5CisgICAgICA6RGF0ZTogMjAwMAorICAgICAgOktleXdvcmRzOiB2aWRlbzRsaW51eCwgZHJpdmVyLCB2aWRlbyBjYXB0dXJlLCBjYXB0dXJlIGRldmljZXMsCisgICAgICAgIGNhbWVyYSBkcml2ZXIsIGNvbnRyb2wsIHF1ZXJ5IGNhcGFiaWxpdGllcywgY2FwYWJpbGl0eSwgZmFjaWxpdHkuCisgICAgICA6RGVzY3JpcHRpb246IFRoZSB0aXRsZSBzYXlzIGl0IGFsbC4KIAotICAgICAqIFRpdGxlOiAiUHJvZ3JhbW1pbmcgZm9yIHRoZSByZWFsIHdvcmxkIC0gUE9TSVguNCIKLSAgICAgICBBdXRob3I6IEJpbGwgTy4gR2FsbG1laXN0ZXIuCi0gICAgICAgUHVibGlzaGVyOiBPJ1JlaWxseSAmIEFzc29jaWF0ZXMsIEluYy4uCi0gICAgICAgRGF0ZTogMTk5NS4KLSAgICAgICBQYWdlczogPz8/LgotICAgICAgIElTQk46IEktNTY1OTItMDc0LTAKLSAgICAgICBOb3RlczogVGhvdWdoIG5vdCBiZWluZyBkaXJlY3RseSBhYm91dCBMaW51eCwgTGludXggYWltcyB0byBiZQotICAgICAgIFBPU0lYLiBHb29kIHJlZmVyZW5jZS4KKyAgICAqIFRpdGxlOiAqKkxpbnV4IElQIE5ldHdvcmtpbmcuIEEgR3VpZGUgdG8gdGhlIEltcGxlbWVudGF0aW9uIGFuZCBNb2RpZmljYXRpb24gb2YgdGhlIExpbnV4IFByb3RvY29sIFN0YWNrLioqCiAKLSAgICAgKiBUaXRsZTogICJVTklYICBTeXN0ZW1zICBmb3IgIE1vZGVybiBBcmNoaXRlY3R1cmVzOiBTeW1tZXRyaWMKLSAgICAgICBNdWx0aXByb2Nlc3NpbmcgYW5kIENhY2hpbmcgZm9yIEtlcm5lbCBQcm9ncmFtbWVycyIKLSAgICAgICBBdXRob3I6IEN1cnQgU2NoaW1tZWwuCi0gICAgICAgUHVibGlzaGVyOiBBZGRpc29uIFdlc2xleS4KLSAgICAgICBEYXRlOiBKdW5lLCAxOTk0LgotICAgICAgIFBhZ2VzOiA0MzIuCi0gICAgICAgSVNCTjogMC0yMDEtNjMzMzgtOAorICAgICAgOkF1dGhvcjogR2xlbm4gSGVycmluLgorICAgICAgOlVSTDogaHR0cDovL3d3dy5jcy51bmguZWR1L2NucmcvZ2hlcnJpbgorICAgICAgOkRhdGU6IDIwMDAKKyAgICAgIDpLZXl3b3JkczogbmV0d29yaywgbmV0d29ya2luZywgcHJvdG9jb2wsIElQLCBVRFAsIFRDUCwgY29ubmVjdGlvbiwKKyAgICAgICAgc29ja2V0LCByZWNlaXZpbmcsIHRyYW5zbWl0dGluZywgZm9yd2FyZGluZywgcm91dGluZywgcGFja2V0cywKKyAgICAgICAgbW9kdWxlcywgL3Byb2MsIHNrX2J1ZmYsIEZJQiwgdGFncy4KKyAgICAgIDpEZXNjcmlwdGlvbjogRXhjZWxsZW50IHBhcGVyIGRldm90ZWQgdG8gdGhlIExpbnV4IElQIE5ldHdvcmtpbmcsCisgICAgICAgIGV4cGxhaW5pbmcgYW55dGhpbmcgZnJvbSB0aGUga2VybmVsJ3MgdG8gdGhlIHVzZXIgc3BhY2UKKyAgICAgICAgY29uZmlndXJhdGlvbiB0b29scycgY29kZS4gVmVyeSBnb29kIHRvIGdldCBhIGdlbmVyYWwgb3ZlcnZpZXcgb2YKKyAgICAgICAgdGhlIGtlcm5lbCBuZXR3b3JraW5nIGltcGxlbWVudGF0aW9uIGFuZCB1bmRlcnN0YW5kIGFsbCBzdGVwcworICAgICAgICBwYWNrZXRzIGZvbGxvdyBmcm9tIHRoZSB0aW1lIHRoZXkgYXJlIHJlY2VpdmVkIGF0IHRoZSBuZXR3b3JrCisgICAgICAgIGRldmljZSB0aWxsIHRoZXkgYXJlIGRlbGl2ZXJlZCB0byBhcHBsaWNhdGlvbnMuIFRoZSBzdHVkaWVkIGtlcm5lbAorICAgICAgICBjb2RlIGlzIGZyb20gMi4yLjE0IHZlcnNpb24uIFByb3ZpZGVzIGNvZGUgZm9yIGEgd29ya2luZyBwYWNrZXQKKyAgICAgICAgZHJvcHBlciBleGFtcGxlLgogCi0gICAgICogVGl0bGU6ICJMaW51eCBLZXJuZWwgRGV2ZWxvcG1lbnQsIDNyZCBFZGl0aW9uIgotICAgICAgIEF1dGhvcjogUm9iZXJ0IExvdmUKLSAgICAgICBQdWJsaXNoZXI6IEFkZGlzb24tV2VzbGV5LgotICAgICAgIERhdGU6IEp1bHksIDIwMTAKLSAgICAgICBQYWdlczogNDQwCi0gICAgICAgSVNCTjogOTc4LTA2NzIzMjk0NjMKKyAgICAqIFRpdGxlOiAqKkhvdyBUbyBNYWtlIFN1cmUgWW91ciBEcml2ZXIgV2lsbCBXb3JrIE9uIFRoZSBQb3dlciBNYWNpbnRvc2gqKgogCi0gICAgIE1JU0NFTExBTkVPVVM6CisgICAgICA6QXV0aG9yOiBQYXVsIE1hY2tlcnJhcy4KKyAgICAgIDpVUkw6IGh0dHA6Ly93d3cubGludXgtbWFnLmNvbS9pZC8yNjEKKyAgICAgIDpEYXRlOiAxOTk5CisgICAgICA6S2V5d29yZHM6IE1hYywgUG93ZXIgTWFjaW50b3NoLCBwb3J0aW5nLCBkcml2ZXJzLCBjb21wYXRpYmlsaXR5LgorICAgICAgOkRlc2NyaXB0aW9uOiBUaGUgdGl0bGUgc2F5cyBpdCBhbGwuCiAKLSAgICAgKiBOYW1lOiBsaW51eC9Eb2N1bWVudGF0aW9uCi0gICAgICAgQXV0aG9yOiBNYW55LgotICAgICAgIFVSTDogSnVzdCBsb29rIGluc2lkZSB5b3VyIGtlcm5lbCBzb3VyY2VzLgotICAgICAgIEtleXdvcmRzOiBhbnl0aGluZywgRG9jQm9vay4KLSAgICAgICBEZXNjcmlwdGlvbjogRG9jdW1lbnRhdGlvbiB0aGF0IGNvbWVzIHdpdGggdGhlIGtlcm5lbCBzb3VyY2VzLAotICAgICAgIGluc2lkZSB0aGUgRG9jdW1lbnRhdGlvbiBkaXJlY3RvcnkuIFNvbWUgcGFnZXMgZnJvbSB0aGlzIGRvY3VtZW50Ci0gICAgICAgKGluY2x1ZGluZyB0aGlzIGRvY3VtZW50IGl0c2VsZikgaGF2ZSBiZWVuIG1vdmVkIHRoZXJlLCBhbmQgbWlnaHQKLSAgICAgICBiZSBtb3JlIHVwIHRvIGRhdGUgdGhhbiB0aGUgd2ViIHZlcnNpb24uCisgICAgKiBUaXRsZTogKipBbiBJbnRyb2R1Y3Rpb24gdG8gU0NTSSBEcml2ZXJzKioKIAotICAgICAqIE5hbWU6ICJMaW51eCBLZXJuZWwgU291cmNlIFJlZmVyZW5jZSIKLSAgICAgICBBdXRob3I6IFRob21hcyBHcmFpY2hlbi4KLSAgICAgICBVUkw6IGh0dHA6Ly9tYXJjLmluZm8vP2w9bGludXgta2VybmVsJm09OTY0NDY2NDAxMDIyMDUmdz00Ci0gICAgICAgS2V5d29yZHM6IENWUywgd2ViLCBjdnN3ZWIsIGJyb3dzaW5nIHNvdXJjZSBjb2RlLgotICAgICAgIERlc2NyaXB0aW9uOiBXZWIgaW50ZXJmYWNlIHRvIGEgQ1ZTIHNlcnZlciB3aXRoIHRoZSBrZXJuZWwKLSAgICAgICBzb3VyY2VzLiAiSGVyZSB5b3UgY2FuIGhhdmUgYSBsb29rIGF0IGFueSBmaWxlIG9mIHRoZSBMaW51eCBrZXJuZWwKLSAgICAgICBzb3VyY2VzIG9mIGFueSB2ZXJzaW9uIHN0YXJ0aW5nIGZyb20gMS4wIHVwIHRvIHRoZSAoZGFpbHkgdXBkYXRlZCkKLSAgICAgICBjdXJyZW50IHZlcnNpb24gYXZhaWxhYmxlLiBBbHNvIHlvdSBjYW4gY2hlY2sgdGhlIGRpZmZlcmVuY2VzCi0gICAgICAgYmV0d2VlbiB0d28gdmVyc2lvbnMgb2YgYSBmaWxlIi4KKyAgICAgIDpBdXRob3I6IEFsYW4gQ294LgorICAgICAgOlVSTDogaHR0cDovL3d3dy5saW51eC1tYWcuY29tL2lkLzI4NAorICAgICAgOkRhdGU6IDE5OTkKKyAgICAgIDpLZXl3b3JkczogU0NTSSwgZGV2aWNlLCBkcml2ZXIuCisgICAgICA6RGVzY3JpcHRpb246IFRoZSB0aXRsZSBzYXlzIGl0IGFsbC4KIAotICAgICAqIE5hbWU6ICJDcm9zcy1SZWZlcmVuY2luZyBMaW51eCIKLSAgICAgICBVUkw6IGh0dHA6Ly9seHIuZnJlZS1lbGVjdHJvbnMuY29tLwotICAgICAgIEtleXdvcmRzOiBCcm93c2luZyBzb3VyY2UgY29kZS4KLSAgICAgICBEZXNjcmlwdGlvbjogQW5vdGhlciB3ZWItYmFzZWQgTGludXgga2VybmVsIHNvdXJjZSBjb2RlIGJyb3dzZXIuCi0gICAgICAgTG90cyBvZiBjcm9zcyByZWZlcmVuY2VzIHRvIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zLiBZb3UgY2FuIHNlZQotICAgICAgIHdoZXJlIHRoZXkgYXJlIGRlZmluZWQgYW5kIHdoZXJlIHRoZXkgYXJlIHVzZWQuCisgICAgKiBUaXRsZTogKipBZHZhbmNlZCBTQ1NJIERyaXZlcnMgQW5kIE90aGVyIFRhbGVzKioKIAotICAgICAqIE5hbWU6ICJMaW51eCBXZWVrbHkgTmV3cyIKLSAgICAgICBVUkw6IGh0dHA6Ly9sd24ubmV0Ci0gICAgICAgS2V5d29yZHM6IGxhdGVzdCBrZXJuZWwgbmV3cy4KLSAgICAgICBEZXNjcmlwdGlvbjogVGhlIHRpdGxlIHNheXMgaXQgYWxsLiBUaGVyZSdzIGEgZml4ZWQga2VybmVsIHNlY3Rpb24KLSAgICAgICBzdW1tYXJpemluZyBkZXZlbG9wZXJzJyB3b3JrLCBidWcgZml4ZXMsIG5ldyBmZWF0dXJlcyBhbmQgdmVyc2lvbnMKLSAgICAgICBwcm9kdWNlZCBkdXJpbmcgdGhlIHdlZWsuIFB1Ymxpc2hlZCBldmVyeSBUaHVyc2RheS4KKyAgICAgIDpBdXRob3I6IEFsYW4gQ294LgorICAgICAgOlVSTDogaHR0cDovL3d3dy5saW51eC1tYWcuY29tL2lkLzMwNworICAgICAgOkRhdGU6IDE5OTkKKyAgICAgIDpLZXl3b3JkczogU0NTSSwgZGV2aWNlLCBkcml2ZXIsIGFkdmFuY2VkLgorICAgICAgOkRlc2NyaXB0aW9uOiBUaGUgdGl0bGUgc2F5cyBpdCBhbGwuCiAKLSAgICAgKiBOYW1lOiAiS2VybmVsIFRyYWZmaWMiCi0gICAgICAgVVJMOiBodHRwOi8va3QuZWFydGgubGkva2VybmVsLXRyYWZmaWMvaW5kZXguaHRtbAotICAgICAgIEtleXdvcmRzOiBsaW51eC1rZXJuZWwgbWFpbGluZyBsaXN0LCB3ZWVrbHkga2VybmVsIG5ld3MuCi0gICAgICAgRGVzY3JpcHRpb246IFdlZWtseSBuZXdzbGV0dGVyIGNvdmVyaW5nIHRoZSBtb3N0IHJlbGV2YW50Ci0gICAgICAgZGlzY3Vzc2lvbnMgb2YgdGhlIGxpbnV4LWtlcm5lbCBtYWlsaW5nIGxpc3QuCisgICAgKiBUaXRsZTogKipXcml0aW5nIExpbnV4IE1vdXNlIERyaXZlcnMqKgogCi0gICAgICogTmFtZTogIkN1VFRpTkcuZURHZS5MaU51WCIKLSAgICAgICBVUkw6IGh0dHA6Ly9lZGdlLmtlcm5lbG5vdGVzLm9yZwotICAgICAgIEtleXdvcmRzOiBjaGFuZ2VsaXN0LgotICAgICAgIERlc2NyaXB0aW9uOiBTaXRlIHdoaWNoIHByb3ZpZGVzIHRoZSBjaGFuZ2VsaXN0IGZvciBldmVyeSBrZXJuZWwKLSAgICAgICByZWxlYXNlLiBXaGF0J3MgbmV3LCB3aGF0J3MgYmV0dGVyLCB3aGF0J3MgY2hhbmdlZC4gTXlyZHJhYWwgcmVhZHMKLSAgICAgICB0aGUgcGF0Y2hlcyBhbmQgZGVzY3JpYmVzIHRoZW0uIFBvaW50ZXJzIHRvIHRoZSBwYXRjaGVzIGFyZSB0aGVyZSwKLSAgICAgICB0b28uCisgICAgICA6QXV0aG9yOiBBbGFuIENveC4KKyAgICAgIDpVUkw6IGh0dHA6Ly93d3cubGludXgtbWFnLmNvbS9pZC8zMzAKKyAgICAgIDpEYXRlOiAxOTk5CisgICAgICA6S2V5d29yZHM6IG1vdXNlLCBkcml2ZXIsIGdwbS4KKyAgICAgIDpEZXNjcmlwdGlvbjogVGhlIHRpdGxlIHNheXMgaXQgYWxsLgogCi0gICAgICogTmFtZTogIk5ldyBsaW51eC1rZXJuZWwgTWFpbGluZyBMaXN0IEZBUSIKLSAgICAgICBVUkw6IGh0dHA6Ly93d3cudHV4Lm9yZy9sa21sLwotICAgICAgIEtleXdvcmRzOiBsaW51eC1rZXJuZWwgbWFpbGluZyBsaXN0IEZBUS4KLSAgICAgICBEZXNjcmlwdGlvbjogbGludXgta2VybmVsIGlzIGEgbWFpbGluZyBsaXN0IGZvciBkZXZlbG9wZXJzIHRvCi0gICAgICAgY29tbXVuaWNhdGUuIFRoaXMgRkFRIGJ1aWxkcyBvbiB0aGUgcHJldmlvdXMgbGludXgta2VybmVsIG1haWxpbmcKLSAgICAgICBsaXN0IEZBUSBtYWludGFpbmVkIGJ5IEZyb2h3YWx0IEVnZXJlciwgd2hvIG5vIGxvbmdlciBtYWludGFpbnMKLSAgICAgICBpdC4gUmVhZCBpdCB0byBzZWUgaG93IHRvIGpvaW4gdGhlIG1haWxpbmcgbGlzdC4gRG96ZW5zIG9mCi0gICAgICAgaW50ZXJlc3RpbmcgcXVlc3Rpb25zIHJlZ2FyZGluZyB0aGUgbGlzdCwgTGludXgsIGRldmVsb3BlcnMgKHdobwotICAgICAgIGlzIC4uLj8pLCB0ZXJtcyAod2hhdCBpcy4uLj8pIGFyZSBhbnN3ZXJlZCBoZXJlIHRvby4gSnVzdCByZWFkIGl0LgorICAgICogVGl0bGU6ICoqTW9yZSBvbiBNb3VzZSBEcml2ZXJzKioKIAotICAgICAqIE5hbWU6ICJMaW51eCBWaXJ0dWFsIEZpbGUgU3lzdGVtIgotICAgICAgIEF1dGhvcjogUGV0ZXIgSi4gQnJhYW0uCi0gICAgICAgVVJMOiBodHRwOi8vd3d3LmNvZGEuY3MuY211LmVkdS9kb2MvdGFsa3MvbGludXh2ZnMvCi0gICAgICAgS2V5d29yZHM6IHNsaWRlcywgVkZTLCBpbm9kZSwgc3VwZXJibG9jaywgZGVudHJ5LCBkY2FjaGUuCi0gICAgICAgRGVzY3JpcHRpb246IFNldCBvZiBzbGlkZXMsIHByZXN1bWFibHkgZnJvbSBhIHByZXNlbnRhdGlvbiBvbiB0aGUKLSAgICAgICBMaW51eCBWRlMgbGF5ZXIuIENvdmVycyB2ZXJzaW9uIDIuMS54LCB3aXRoIGRlbnRyaWVzIGFuZCB0aGUKLSAgICAgICBkY2FjaGUuCisgICAgICA6QXV0aG9yOiBBbGFuIENveC4KKyAgICAgIDpVUkw6IGh0dHA6Ly93d3cubGludXgtbWFnLmNvbS9pZC8zNTYKKyAgICAgIDpEYXRlOiAxOTk5CisgICAgICA6S2V5d29yZHM6IG1vdXNlLCBkcml2ZXIsIGdwbSwgcmFjZXMsIGFzeW5jaHJvbm91cyBJL08uCisgICAgICA6RGVzY3JpcHRpb246IFRoZSB0aXRsZSBzdGlsbCBzYXlzIGl0IGFsbC4KIAotICAgICAqIE5hbWU6ICJHYXJ5J3MgRW5jeWNsb3BlZGlhIC0gVGhlIExpbnV4IEtlcm5lbCIKLSAgICAgICBBdXRob3I6IEdhcnkgKEkgc3VwcG9zZS4uLikuCi0gICAgICAgVVJMOiBodHRwOi8vc2xlbmN5Y2xvcGVkaWEuYmVybGlvcy5kZS9pbmRleC5odG1sCi0gICAgICAgS2V5d29yZHM6IGxpbnV4LCBjb21tdW5pdHksIGV2ZXJ5dGhpbmchCi0gICAgICAgRGVzY3JpcHRpb246IEdhcnkncyBFbmN5Y2xvcGVkaWEgZXhpc3RzIHRvIGFsbG93IHRoZSByYXBpZCBmaW5kaW5nCi0gICAgICAgb2YgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgaW5mb3JtYXRpb24gb2YgaW50ZXJlc3QgdG8gR05VL0xpbnV4Ci0gICAgICAgdXNlcnMuIEl0IGhhcyBhYm91dCA0MDAwIGxpbmtzIHRvIGV4dGVybmFsIHBhZ2VzIGluIDE1MCBtYWpvcgotICAgICAgIGNhdGVnb3JpZXMuIFRoaXMgbGluayBpcyBmb3Iga2VybmVsLXNwZWNpZmljIGxpbmtzLCBkb2N1bWVudHMsCi0gICAgICAgc2l0ZXMuLi4gIFRoaXMgbGlzdCBpcyBub3cgaG9zdGVkIGJ5IGRldmVsb3Blci5CZXJsaW9zLmRlLAotICAgICAgIGJ1dCBzZWVtcyBub3QgdG8gaGF2ZSBiZWVuIHVwZGF0ZWQgc2luY2Ugc29tZXRpbWUgaW4gMTk5OS4KKyAgICAqIFRpdGxlOiAqKldyaXRpbmcgVmlkZW80bGludXggUmFkaW8gRHJpdmVyKioKIAotICAgICAqIE5hbWU6ICJUaGUgaG9tZSBwYWdlIG9mIExpbnV4LU1NIgotICAgICAgIEF1dGhvcjogVGhlIExpbnV4LU1NIHRlYW0uCi0gICAgICAgVVJMOiBodHRwOi8vbGludXgtbW0ub3JnLwotICAgICAgIEtleXdvcmRzOiBtZW1vcnkgbWFuYWdlbWVudCwgTGludXgtTU0sIG1tIHBhdGNoZXMsIFRPRE8sIGRvY3MsCi0gICAgICAgbWFpbGluZyBsaXN0LgotICAgICAgIERlc2NyaXB0aW9uOiBTaXRlIGRldm90ZWQgdG8gTGludXggTWVtb3J5IE1hbmFnZW1lbnQgZGV2ZWxvcG1lbnQuCi0gICAgICAgTWVtb3J5IHJlbGF0ZWQgcGF0Y2hlcywgSE9XVE9zLCBsaW5rcywgbW0gZGV2ZWxvcGVycy4uLiBEb24ndCBtaXNzCi0gICAgICAgaXQgaWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIG1lbW9yeSBtYW5hZ2VtZW50IGRldmVsb3BtZW50IQorICAgICAgOkF1dGhvcjogQWxhbiBDb3guCisgICAgICA6VVJMOiBodHRwOi8vd3d3LmxpbnV4LW1hZy5jb20vaWQvMzgxCisgICAgICA6RGF0ZTogMTk5OQorICAgICAgOktleXdvcmRzOiB2aWRlbzRsaW51eCwgZHJpdmVyLCByYWRpbywgcmFkaW8gZGV2aWNlcy4KKyAgICAgIDpEZXNjcmlwdGlvbjogVGhlIHRpdGxlIHNheXMgaXQgYWxsLgogCi0gICAgICogTmFtZTogIktlcm5lbCBOZXdiaWVzIElSQyBDaGFubmVsIGFuZCBXZWJzaXRlIgotICAgICAgIFVSTDogaHR0cDovL3d3dy5rZXJuZWxuZXdiaWVzLm9yZwotICAgICAgIEtleXdvcmRzOiBJUkMsIG5ld2JpZXMsIGNoYW5uZWwsIGFza2luZyBkb3VidHMuCi0gICAgICAgRGVzY3JpcHRpb246ICNrZXJuZWxuZXdiaWVzIG9uIGlyYy5vZnRjLm5ldC4KLSAgICAgICAja2VybmVsbmV3YmllcyBpcyBhbiBJUkMgbmV0d29yayBkZWRpY2F0ZWQgdG8gdGhlICduZXdiaWUnCi0gICAgICAga2VybmVsIGhhY2tlci4gVGhlIGF1ZGllbmNlIG1vc3RseSBjb25zaXN0cyBvZiBwZW9wbGUgd2hvIGFyZQotICAgICAgIGxlYXJuaW5nIGFib3V0IHRoZSBrZXJuZWwsIHdvcmtpbmcgb24ga2VybmVsIHByb2plY3RzIG9yCi0gICAgICAgcHJvZmVzc2lvbmFsIGtlcm5lbCBoYWNrZXJzIHRoYXQgd2FudCB0byBoZWxwIGxlc3Mgc2Vhc29uZWQga2VybmVsCi0gICAgICAgcGVvcGxlLgotICAgICAgICNrZXJuZWxuZXdiaWVzIGlzIG9uIHRoZSBPRlRDIElSQyBOZXR3b3JrLgotICAgICAgIFRyeSBpcmMub2Z0Yy5uZXQgYXMgeW91ciBzZXJ2ZXIgYW5kIHRoZW4gL2pvaW4gI2tlcm5lbG5ld2JpZXMuCi0gICAgICAgVGhlIGtlcm5lbG5ld2JpZXMgd2Vic2l0ZSBhbHNvIGhvc3RzIGFydGljbGVzLCBkb2N1bWVudHMsIEZBUXMuLi4KLSAgICAgICAKLSAgICAgKiBOYW1lOiAibGludXgta2VybmVsIG1haWxpbmcgbGlzdCBhcmNoaXZlcyBhbmQgc2VhcmNoIGVuZ2luZXMiCi0gICAgICAgVVJMOiBodHRwOi8vdmdlci5rZXJuZWwub3JnL3ZnZXItbGlzdHMuaHRtbAotICAgICAgIFVSTDogaHR0cDovL3d3dy51d3NnLmluZGlhbmEuZWR1L2h5cGVybWFpbC9saW51eC9rZXJuZWwvaW5kZXguaHRtbAotICAgICAgIFVSTDogaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD1saW51eC1rZXJuZWwKLSAgICAgICBVUkw6IGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9tbGlzdC5saW51eC5rZXJuZWwKLSAgICAgICBVUkw6IGh0dHA6Ly93d3cuY3MuaGVsc2lua2kuZmkvbGludXgvbGludXgta2VybmVsLwotICAgICAgIFVSTDogaHR0cDovL3d3dy5saWIudWFhLmFsYXNrYS5lZHUvbGludXgta2VybmVsLwotICAgICAgIEtleXdvcmRzOiBsaW51eC1rZXJuZWwsIGFyY2hpdmVzLCBzZWFyY2guCi0gICAgICAgRGVzY3JpcHRpb246IFNvbWUgb2YgdGhlIGxpbnV4LWtlcm5lbCBtYWlsaW5nIGxpc3QgYXJjaGl2ZXJzLiBJZgotICAgICAgIHlvdSBoYXZlIGEgYmV0dGVyL2Fub3RoZXIgb25lLCBwbGVhc2UgbGV0IG1lIGtub3cuCi0gICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0gICAKLSAgIERvY3VtZW50IGxhc3QgdXBkYXRlZCBvbiBTYXQgMjAwNS1OT1YtMTkKKyAgICAqIFRpdGxlOiAqKkkvTyBFdmVudCBIYW5kbGluZyBVbmRlciBMaW51eCoqCisKKyAgICAgIDpBdXRob3I6IFJpY2hhcmQgR29vY2guCisgICAgICA6VVJMOiBodHRwOi8vd2ViLm1pdC5lZHUvfnlhbmRyb3MvZG9jL2lvLWV2ZW50cy5odG1sCisgICAgICA6RGF0ZTogMTk5OQorICAgICAgOktleXdvcmRzOiBJTywgSS9PLCBzZWxlY3QoMiksIHBvbGwoMiksIEZEcywgYWlvX3JlYWQoMiksIHJlYWRpbmVzcworICAgICAgICBldmVudCBxdWV1ZXMuCisgICAgICA6RGVzY3JpcHRpb246IEZyb20gdGhlIEludHJvZHVjdGlvbjogIkkvTyBFdmVudCBoYW5kbGluZyBpcyBhYm91dAorICAgICAgICBob3cgeW91ciBPcGVyYXRpbmcgU3lzdGVtIGFsbG93cyB5b3UgdG8gbWFuYWdlIGEgbGFyZ2UgbnVtYmVyIG9mCisgICAgICAgIG9wZW4gZmlsZXMgKGZpbGUgZGVzY3JpcHRvcnMgaW4gVU5JWC9QT1NJWCwgb3IgRkRzKSBpbiB5b3VyCisgICAgICAgIGFwcGxpY2F0aW9uLiBZb3Ugd2FudCB0aGUgT1MgdG8gbm90aWZ5IHlvdSB3aGVuIEZEcyBiZWNvbWUgYWN0aXZlCisgICAgICAgIChoYXZlIGRhdGEgcmVhZHkgdG8gYmUgcmVhZCBvciBhcmUgcmVhZHkgZm9yIHdyaXRpbmcpLiBJZGVhbGx5IHlvdQorICAgICAgICB3YW50IGEgbWVjaGFuaXNtIHRoYXQgaXMgc2NhbGFibGUuIFRoaXMgbWVhbnMgYSBsYXJnZSBudW1iZXIgb2YKKyAgICAgICAgaW5hY3RpdmUgRkRzIGNvc3QgdmVyeSBsaXR0bGUgaW4gbWVtb3J5IGFuZCBDUFUgdGltZSB0byBtYW5hZ2UiLgorCisgICAgKiBUaXRsZTogKioobmVhcmx5KSBDb21wbGV0ZSBMaW51eCBMb2FkYWJsZSBLZXJuZWwgTW9kdWxlcy4gVGhlIGRlZmluaXRpdmUgZ3VpZGUgZm9yIGhhY2tlcnMsIHZpcnVzIGNvZGVycyBhbmQgc3lzdGVtIGFkbWluaXN0cmF0b3JzLioqCisKKyAgICAgIDpBdXRob3I6IHByYWdtYXRpYy9USEMuCisgICAgICA6VVJMOiBodHRwOi8vcGFja2V0c3Rvcm1zZWN1cml0eS5vcmcvZG9jcy9oYWNrL0xLTV9IQUNLSU5HLmh0bWwKKyAgICAgIDpEYXRlOiAxOTk5CisgICAgICA6S2V5d29yZHM6IHN5c2NhbGxzLCBpbnRlcmNlcHQsIGhpZGUsIGFidXNlLCBzeW1ib2wgdGFibGUuCisgICAgICA6RGVzY3JpcHRpb246IEludGVyZXN0aW5nIHBhcGVyIG9uIGhvdyB0byBhYnVzZSB0aGUgTGludXgga2VybmVsIGluCisgICAgICAgIG9yZGVyIHRvIGludGVyY2VwdCBhbmQgbW9kaWZ5IHN5c2NhbGxzLCBtYWtlCisgICAgICAgIGZpbGVzL2RpcmVjdG9yaWVzL3Byb2Nlc3NlcyBpbnZpc2libGUsIGJlY29tZSByb290LCBoaWphY2sgdHR5cywKKyAgICAgICAgd3JpdGUga2VybmVsIG1vZHVsZXMgYmFzZWQgdmlydXMuLi4gYW5kIHNvbHV0aW9ucyBmb3IgYWRtaW5zIHRvCisgICAgICAgIGF2b2lkIGFsbCB0aG9zZSBhYnVzZXMuCisgICAgICA6Tm90ZXM6IEZvciAyLjAueCBrZXJuZWxzLiBHaXZlcyBndWlkYW5jZXMgdG8gcG9ydCBpdCB0byAyLjIueAorICAgICAgICBrZXJuZWxzLgorCisgICAgKiBOYW1lOiAqKkxpbnV4IFZpcnR1YWwgRmlsZSBTeXN0ZW0qKgorCisgICAgICA6QXV0aG9yOiBQZXRlciBKLiBCcmFhbS4KKyAgICAgIDpVUkw6IGh0dHA6Ly93d3cuY29kYS5jcy5jbXUuZWR1L2RvYy90YWxrcy9saW51eHZmcy8KKyAgICAgIDpEYXRlOiAxOTk4CisgICAgICA6S2V5d29yZHM6IHNsaWRlcywgVkZTLCBpbm9kZSwgc3VwZXJibG9jaywgZGVudHJ5LCBkY2FjaGUuCisgICAgICA6RGVzY3JpcHRpb246IFNldCBvZiBzbGlkZXMsIHByZXN1bWFibHkgZnJvbSBhIHByZXNlbnRhdGlvbiBvbiB0aGUKKyAgICAgICAgTGludXggVkZTIGxheWVyLiBDb3ZlcnMgdmVyc2lvbiAyLjEueCwgd2l0aCBkZW50cmllcyBhbmQgdGhlCisgICAgICAgIGRjYWNoZS4KKworICAgICogVGl0bGU6ICoqVGhlIFZlbnVzIGtlcm5lbCBpbnRlcmZhY2UqKgorCisgICAgICA6QXV0aG9yOiBQZXRlciBKLiBCcmFhbS4KKyAgICAgIDpVUkw6IGh0dHA6Ly93d3cuY29kYS5jcy5jbXUuZWR1L2RvYy9odG1sL2tlcm5lbC12ZW51cy1wcm90b2NvbC5odG1sCisgICAgICA6RGF0ZTogMTk5OAorICAgICAgOktleXdvcmRzOiBjb2RhLCBmaWxlc3lzdGVtLCB2ZW51cywgY2FjaGUgbWFuYWdlci4KKyAgICAgIDpEZXNjcmlwdGlvbjogIlRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4KKyAgICAgICAgVmVudXMgYW5kIGtlcm5lbCBsZXZlbCBmaWxlIHN5c3RlbSBjb2RlIG5lZWRlZCBmb3IgdGhlIG9wZXJhdGlvbgorICAgICAgICBvZiB0aGUgQ29kYSBmaWxlc3lzdGVtLiBUaGlzIHZlcnNpb24gZG9jdW1lbnQgaXMgbWVhbnQgdG8gZGVzY3JpYmUKKyAgICAgICAgdGhlIGN1cnJlbnQgaW50ZXJmYWNlICh2ZXJzaW9uIDEuMCkgYXMgd2VsbCBhcyBpbXByb3ZlbWVudHMgd2UKKyAgICAgICAgZW52aXNhZ2UiLgorCisgICAgKiBUaXRsZTogKipEZXNpZ24gYW5kIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTZWNvbmQgRXh0ZW5kZWQgRmlsZXN5c3RlbSoqCisKKyAgICAgIDpBdXRob3I6IFLDqW15IENhcmQsIFRoZW9kb3JlIFRzJ28sIFN0ZXBoZW4gVHdlZWRpZS4KKyAgICAgIDpVUkw6IGh0dHA6Ly93ZWIubWl0LmVkdS90eXRzby93d3cvbGludXgvZXh0MmludHJvLmh0bWwKKyAgICAgIDpEYXRlOiAxOTk4CisgICAgICA6S2V5d29yZHM6IGV4dDIsIGxpbnV4IGZzIGhpc3RvcnksIGlub2RlLCBkaXJlY3RvcnksIGxpbmssIGRldmljZXMsCisgICAgICAgIFZGUywgcGh5c2ljYWwgc3RydWN0dXJlLCBwZXJmb3JtYW5jZSwgYmVuY2htYXJrcywgZXh0MmZzIGxpYnJhcnksCisgICAgICAgIGV4dDJmcyB0b29scywgZTJmc2NrLgorICAgICAgOkRlc2NyaXB0aW9uOiBQYXBlciB3cml0dGVuIGJ5IHRocmVlIG9mIHRoZSB0b3AgZXh0MiBoYWNrZXJzLgorICAgICAgICBDb3ZlcnMgTGludXggZmlsZXN5c3RlbXMgaGlzdG9yeSwgZXh0MiBtb3RpdmF0aW9uLCBleHQyIGZlYXR1cmVzLAorICAgICAgICBkZXNpZ24sIHBoeXNpY2FsIHN0cnVjdHVyZSBvbiBkaXNrLCBwZXJmb3JtYW5jZSwgYmVuY2htYXJrcywKKyAgICAgICAgZTJmc2NrJ3MgcGFzc2VzIGRlc2NyaXB0aW9uLi4uIEEgbXVzdCByZWFkIQorICAgICAgOk5vdGVzOiBUaGlzIHBhcGVyIHdhcyBmaXJzdCBwdWJsaXNoZWQgaW4gdGhlIFByb2NlZWRpbmdzIG9mIHRoZQorICAgICAgICBGaXJzdCBEdXRjaCBJbnRlcm5hdGlvbmFsIFN5bXBvc2l1bSBvbiBMaW51eCwgSVNCTiA5MC0zNjctMDM4NS05LgorCisgICAgKiBUaXRsZTogKipUaGUgTGludXggUkFJRC0xLCA0LCA1IENvZGUqKgorCisgICAgICA6QXV0aG9yOiBJbmdvIE1vbG5hciwgR2FkaSBPeG1hbiBhbmQgTWlndWVsIGRlIEljYXphLgorICAgICAgOlVSTDogaHR0cDovL3d3dy5saW51eGpvdXJuYWwuY29tL2FydGljbGUucGhwP3NpZD0yMzkxCisgICAgICA6RGF0ZTogMTk5NworICAgICAgOktleXdvcmRzOiBSQUlELCBNRCBkcml2ZXIuCisgICAgICA6RGVzY3JpcHRpb246IExpbnV4IEpvdXJuYWwgS2VybmVsIEtvcm5lciBhcnRpY2xlLiBIZXJlIGlzIGl0cworICAgICAgOkFic3RyYWN0OiAqQSBkZXNjcmlwdGlvbiBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJBSUQtMSwKKyAgICAgICAgUkFJRC00IGFuZCBSQUlELTUgcGVyc29uYWxpdGllcyBvZiB0aGUgTUQgZGV2aWNlIGRyaXZlciBpbiB0aGUKKyAgICAgICAgTGludXgga2VybmVsLCBwcm92aWRpbmcgdXNlcnMgd2l0aCBoaWdoIHBlcmZvcm1hbmNlIGFuZCByZWxpYWJsZSwKKyAgICAgICAgc2Vjb25kYXJ5LXN0b3JhZ2UgY2FwYWJpbGl0eSB1c2luZyBzb2Z0d2FyZSouCisKKyAgICAqIFRpdGxlOiAqKkxpbnV4IEtlcm5lbCBIYWNrZXJzJyBHdWlkZSoqCisKKyAgICAgIDpBdXRob3I6IE1pY2hhZWwgSy4gSm9obnNvbi4KKyAgICAgIDpVUkw6IGh0dHA6Ly93d3cudGxkcC5vcmcvTERQL2toZy9IeXBlck5ld3MvZ2V0L2toZy5odG1sCisgICAgICA6RGF0ZTogMTk5NworICAgICAgOktleXdvcmRzOiBkZXZpY2UgZHJpdmVycywgZmlsZXMsIFZGUywga2VybmVsIGludGVyZmFjZSwgY2hhcmFjdGVyIHZzCisgICAgICAgIGJsb2NrIGRldmljZXMsIGhhcmR3YXJlIGludGVycnVwdHMsIHNjc2ksIERNQSwgYWNjZXNzIHRvIHVzZXIgbWVtb3J5LAorICAgICAgICBtZW1vcnkgYWxsb2NhdGlvbiwgdGltZXJzLgorICAgICAgOkRlc2NyaXB0aW9uOiBBIGd1aWRlIGRlc2lnbmVkIHRvIGhlbHAgeW91IGdldCB1cCB0byBzcGVlZCBvbiB0aGUKKyAgICAgICAgY29uY2VwdHMgdGhhdCBhcmUgbm90IGludHVpdGV2bHkgb2J2aW91cywgYW5kIHRvIGRvY3VtZW50IHRoZSBpbnRlcm5hbAorICAgICAgICBzdHJ1Y3R1cmVzIG9mIExpbnV4LgorCisgICAgKiBUaXRsZTogKipEeW5hbWljIEtlcm5lbHM6IE1vZHVsYXJpemVkIERldmljZSBEcml2ZXJzKioKKworICAgICAgOkF1dGhvcjogQWxlc3NhbmRybyBSdWJpbmkuCisgICAgICA6VVJMOiBodHRwOi8vd3d3LmxpbnV4am91cm5hbC5jb20vYXJ0aWNsZS5waHA/c2lkPTEyMTkKKyAgICAgIDpEYXRlOiAxOTk2CisgICAgICA6S2V5d29yZHM6IGRldmljZSBkcml2ZXIsIG1vZHVsZSwgbG9hZGluZy91bmxvYWRpbmcgbW9kdWxlcywKKyAgICAgICAgYWxsb2NhdGluZyByZXNvdXJjZXMuCisgICAgICA6RGVzY3JpcHRpb246IExpbnV4IEpvdXJuYWwgS2VybmVsIEtvcm5lciBhcnRpY2xlLiBIZXJlIGlzIGl0cworICAgICAgOkFic3RyYWN0OiAqVGhpcyBpcyB0aGUgZmlyc3Qgb2YgYSBzZXJpZXMgb2YgZm91ciBhcnRpY2xlcworICAgICAgICBjby1hdXRob3JlZCBieSBBbGVzc2FuZHJvIFJ1YmluaSBhbmQgR2VvcmcgWmV6Y2h3aXR6IHdoaWNoIHByZXNlbnQKKyAgICAgICAgYSBwcmFjdGljYWwgYXBwcm9hY2ggdG8gd3JpdGluZyBMaW51eCBkZXZpY2UgZHJpdmVycyBhcyBrZXJuZWwKKyAgICAgICAgbG9hZGFibGUgbW9kdWxlcy4gVGhpcyBpbnN0YWxsbWVudCBwcmVzZW50cyBhbiBpbnRyb2R1Y3Rpb24gdG8gdGhlCisgICAgICAgIHRvcGljLCBwcmVwYXJpbmcgdGhlIHJlYWRlciB0byB1bmRlcnN0YW5kIG5leHQgbW9udGgncworICAgICAgICBpbnN0YWxsbWVudCouCisKKyAgICAqIFRpdGxlOiAqKkR5bmFtaWMgS2VybmVsczogRGlzY292ZXJ5KioKKworICAgICAgOkF1dGhvcjogQWxlc3NhbmRybyBSdWJpbmkuCisgICAgICA6VVJMOiBodHRwOi8vd3d3LmxpbnV4am91cm5hbC5jb20vYXJ0aWNsZS5waHA/c2lkPTEyMjAKKyAgICAgIDpEYXRlOiAxOTk2CisgICAgICA6S2V5d29yZHM6IGNoYXJhY3RlciBkcml2ZXIsIGluaXRfbW9kdWxlLCBjbGVhbl91cCBtb2R1bGUsCisgICAgICAgIGF1dG9kZXRlY3Rpb24sIG1heW9yIG51bWJlciwgbWlub3IgbnVtYmVyLCBmaWxlIG9wZXJhdGlvbnMsCisgICAgICAgIG9wZW4oKSwgY2xvc2UoKS4KKyAgICAgIDpEZXNjcmlwdGlvbjogTGludXggSm91cm5hbCBLZXJuZWwgS29ybmVyIGFydGljbGUuIEhlcmUgaXMgaXRzCisgICAgICA6QWJzdHJhY3Q6ICpUaGlzIGFydGljbGUsIHRoZSBzZWNvbmQgb2YgZm91ciwgaW50cm9kdWNlcyBwYXJ0IG9mCisgICAgICAgIHRoZSBhY3R1YWwgY29kZSB0byBjcmVhdGUgY3VzdG9tIG1vZHVsZSBpbXBsZW1lbnRpbmcgYSBjaGFyYWN0ZXIKKyAgICAgICAgZGV2aWNlIGRyaXZlci4gSXQgZGVzY3JpYmVzIHRoZSBjb2RlIGZvciBtb2R1bGUgaW5pdGlhbGl6YXRpb24gYW5kCisgICAgICAgIGNsZWFudXAsIGFzIHdlbGwgYXMgdGhlIG9wZW4oKSBhbmQgY2xvc2UoKSBzeXN0ZW0gY2FsbHMqLgorCisgICAgKiBUaXRsZTogKipUaGUgRGV2aWwncyBpbiB0aGUgRGV0YWlscyoqCisKKyAgICAgIDpBdXRob3I6IEdlb3JnIHYuIFplenNjaHdpdHogYW5kIEFsZXNzYW5kcm8gUnViaW5pLgorICAgICAgOlVSTDogaHR0cDovL3d3dy5saW51eGpvdXJuYWwuY29tL2FydGljbGUucGhwP3NpZD0xMjIxCisgICAgICA6RGF0ZTogMTk5NgorICAgICAgOktleXdvcmRzOiByZWFkKCksIHdyaXRlKCksIHNlbGVjdCgpLCBpb2N0bCgpLCBibG9ja2luZy9ub24KKyAgICAgICAgYmxvY2tpbmcgbW9kZSwgaW50ZXJydXB0IGhhbmRsZXIuCisgICAgICA6RGVzY3JpcHRpb246IExpbnV4IEpvdXJuYWwgS2VybmVsIEtvcm5lciBhcnRpY2xlLiBIZXJlIGlzIGl0cworICAgICAgOkFic3RyYWN0OiAqVGhpcyBhcnRpY2xlLCB0aGUgdGhpcmQgb2YgZm91ciBvbiB3cml0aW5nIGNoYXJhY3RlcgorICAgICAgICBkZXZpY2UgZHJpdmVycywgaW50cm9kdWNlcyBjb25jZXB0cyBvZiByZWFkaW5nLCB3cml0aW5nLCBhbmQgdXNpbmcKKyAgICAgICAgaW9jdGwtY2FsbHMqLgorCisgICAgKiBUaXRsZTogKipEaXNzZWN0aW5nIEludGVycnVwdHMgYW5kIEJyb3dzaW5nIERNQSoqCisKKyAgICAgIDpBdXRob3I6IEFsZXNzYW5kcm8gUnViaW5pIGFuZCBHZW9yZyB2LiBaZXpzY2h3aXR6LgorICAgICAgOlVSTDogaHR0cDovL3d3dy5saW51eGpvdXJuYWwuY29tL2FydGljbGUucGhwP3NpZD0xMjIyCisgICAgICA6RGF0ZTogMTk5NgorICAgICAgOktleXdvcmRzOiBpbnRlcnJ1cHRzLCBpcnFzLCBETUEsIGJvdHRvbSBoYWx2ZXMsIHRhc2sgcXVldWVzLgorICAgICAgOkRlc2NyaXB0aW9uOiBMaW51eCBKb3VybmFsIEtlcm5lbCBLb3JuZXIgYXJ0aWNsZS4gSGVyZSBpcyBpdHMKKyAgICAgIDpBYnN0cmFjdDogKlRoaXMgaXMgdGhlIGZvdXJ0aCBpbiBhIHNlcmllcyBvZiBhcnRpY2xlcyBhYm91dAorICAgICAgICB3cml0aW5nIGNoYXJhY3RlciBkZXZpY2UgZHJpdmVycyBhcyBsb2FkYWJsZSBrZXJuZWwgbW9kdWxlcy4gVGhpcworICAgICAgICBtb250aCwgd2UgZnVydGhlciBpbnZlc3RpZ2F0ZSB0aGUgZmllbGQgb2YgaW50ZXJydXB0IGhhbmRsaW5nLgorICAgICAgICBUaG91Z2ggaXQgaXMgY29uY2VwdHVhbGx5IHNpbXBsZSwgcHJhY3RpY2FsIGxpbWl0YXRpb25zIGFuZAorICAgICAgICBjb25zdHJhaW50cyBtYWtlIHRoaXMgYW4gJydpbnRlcmVzdGluZycnIHBhcnQgb2YgZGV2aWNlIGRyaXZlcgorICAgICAgICB3cml0aW5nLCBhbmQgc2V2ZXJhbCBkaWZmZXJlbnQgZmFjaWxpdGllcyBoYXZlIGJlZW4gcHJvdmlkZWQgZm9yCisgICAgICAgIGRpZmZlcmVudCBzaXR1YXRpb25zLiBXZSBhbHNvIGludmVzdGlnYXRlIHRoZSBjb21wbGV4IHRvcGljIG9mCisgICAgICAgIERNQSouCisKKyAgICAqIFRpdGxlOiAqKkRldmljZSBEcml2ZXJzIENvbmNsdWRlZCoqCisKKyAgICAgIDpBdXRob3I6IEdlb3JnIHYuIFplenNjaHdpdHouCisgICAgICA6VVJMOiBodHRwOi8vd3d3LmxpbnV4am91cm5hbC5jb20vYXJ0aWNsZS5waHA/c2lkPTEyODcKKyAgICAgIDpEYXRlOiAxOTk2CisgICAgICA6S2V5d29yZHM6IGFkZHJlc3Mgc3BhY2VzLCBwYWdlcywgcGFnaW5hdGlvbiwgcGFnZSBtYW5hZ2VtZW50LAorICAgICAgICBkZW1hbmQgbG9hZGluZywgc3dhcHBpbmcsIG1lbW9yeSBwcm90ZWN0aW9uLCBtZW1vcnkgbWFwcGluZywgbW1hcCwKKyAgICAgICAgdmlydHVhbCBtZW1vcnkgYXJlYXMgKFZNQXMpLCB2cmVtYXAsIFBDSS4KKyAgICAgIDpEZXNjcmlwdGlvbjogRmluYWxseSwgdGhlIGFib3ZlIHR1cm5lZCBvdXQgaW50byBhIGZpdmUgYXJ0aWNsZXMKKyAgICAgICAgc2VyaWVzLiBUaGlzIGxhdGVzdCBvbmUncyBpbnRyb2R1Y3Rpb24gcmVhZHM6ICJUaGlzIGlzIHRoZSBsYXN0IG9mCisgICAgICAgIGZpdmUgYXJ0aWNsZXMgYWJvdXQgY2hhcmFjdGVyIGRldmljZSBkcml2ZXJzLiBJbiB0aGlzIGZpbmFsCisgICAgICAgIHNlY3Rpb24sIEdlb3JnIGRlYWxzIHdpdGggbWVtb3J5IG1hcHBpbmcgZGV2aWNlcywgYmVnaW5uaW5nIHdpdGgKKyAgICAgICAgYW4gb3ZlcmFsbCBkZXNjcmlwdGlvbiBvZiB0aGUgTGludXggbWVtb3J5IG1hbmFnZW1lbnQgY29uY2VwdHMiLgorCisgICAgKiBUaXRsZTogKipOZXR3b3JrIEJ1ZmZlcnMgQW5kIE1lbW9yeSBNYW5hZ2VtZW50KioKKworICAgICAgOkF1dGhvcjogQWxhbiBDb3guCisgICAgICA6VVJMOiBodHRwOi8vd3d3LmxpbnV4am91cm5hbC5jb20vYXJ0aWNsZS5waHA/c2lkPTEzMTIKKyAgICAgIDpEYXRlOiAxOTk2CisgICAgICA6S2V5d29yZHM6IHNrX2J1ZmZzLCBuZXR3b3JrIGRldmljZXMsIHByb3RvY29sL2xpbmsgbGF5ZXIKKyAgICAgICAgdmFyaWFibGVzLCBuZXR3b3JrIGRldmljZXMgZmxhZ3MsIHRyYW5zbWl0LCByZWNlaXZlLAorICAgICAgICBjb25maWd1cmF0aW9uLCBtdWx0aWNhc3QuCisgICAgICA6RGVzY3JpcHRpb246IExpbnV4IEpvdXJuYWwgS2VybmVsIEtvcm5lci4KKyAgICAgIDpBYnN0cmFjdDogKldyaXRpbmcgYSBuZXR3b3JrIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IGlzIGZ1bmRhbWVudGFsbHkKKyAgICAgICAgc2ltcGxlLS0tbW9zdCBvZiB0aGUgY29tcGxleGl0eSAob3RoZXIgdGhhbiB0YWxraW5nIHRvIHRoZQorICAgICAgICBoYXJkd2FyZSkgaW52b2x2ZXMgbWFuYWdpbmcgbmV0d29yayBwYWNrZXRzIGluIG1lbW9yeSouCisKKyAgICAqIFRpdGxlOiAqKkFuYWx5c2lzIG9mIHRoZSBFeHQyZnMgc3RydWN0dXJlKioKKworICAgICAgOkF1dGhvcjogTG91aXMtRG9taW5pcXVlIER1YmVhdS4KKyAgICAgIDpVUkw6IGh0dHA6Ly90ZWFjaGluZy5jc3NlLnV3YS5lZHUuYXUvdW5pdHMvQ0lUUzIwMDIvZnMtZXh0Mi8KKyAgICAgIDpEYXRlOiAxOTk0CisgICAgICA6S2V5d29yZHM6IGV4dDIsIGZpbGVzeXN0ZW0sIGV4dDJmcy4KKyAgICAgIDpEZXNjcmlwdGlvbjogRGVzY3JpcHRpb24gb2YgZXh0MidzIGJsb2NrcywgZGlyZWN0b3JpZXMsIGlub2RlcywKKyAgICAgICAgYml0bWFwcywgaW52YXJpYW50cy4uLgorCitQdWJsaXNoZWQgYm9va3MKKy0tLS0tLS0tLS0tLS0tLQorCisgICAgKiBUaXRsZTogKipMaW51eCBUcmVpYmVyIGVudHdpY2tlbG4qKgorCisgICAgICA6QXV0aG9yOiBKw7xyZ2VuIFF1YWRlLCBFdmEtS2F0aGFyaW5hIEt1bnN0CisgICAgICA6UHVibGlzaGVyOiBkcHVua3QudmVybGFnCisgICAgICA6RGF0ZTogT2N0IDIwMTUgKDR0aCBlZGl0aW9uKQorICAgICAgOlBhZ2VzOiA2ODgKKyAgICAgIDpJU0JOOiA5NzgtMy04NjQ5MC0yODgtOAorICAgICAgOk5vdGU6IEdlcm1hbi4gVGhlIHRoaXJkIGVkaXRpb24gZnJvbSAyMDExIGlzCisgICAgICAgICBtdWNoIGNoZWFwZXIgYW5kIHN0aWxsIHF1aXRlIHVwLXRvLWRhdGUuCisKKyAgICAqIFRpdGxlOiAqKkxpbnV4IEtlcm5lbCBOZXR3b3JraW5nOiBJbXBsZW1lbnRhdGlvbiBhbmQgVGhlb3J5KioKKworICAgICAgOkF1dGhvcjogUmFtaSBSb3NlbgorICAgICAgOlB1Ymxpc2hlcjogQXByZXNzCisgICAgICA6RGF0ZTogRGVjZW1iZXIgMjIsIDIwMTMKKyAgICAgIDpQYWdlczogNjQ4CisgICAgICA6SVNCTjogOTc4LTE0MzAyNjE5NjQKKworICAgICogVGl0bGU6ICoqRW1iZWRkZWQgTGludXggUHJpbWVyOiBBIHByYWN0aWNhbCBSZWFsLVdvcmxkIEFwcHJvYWNoLCAybmQgRWRpdGlvbioqCisKKyAgICAgIDpBdXRob3I6IENocmlzdG9waGVyIEhhbGxpbmFuCisgICAgICA6UHVibGlzaGVyOiBQZWFyc29uCisgICAgICA6RGF0ZTogTm92ZW1iZXIsIDIwMTAKKyAgICAgIDpQYWdlczogNjU2CisgICAgICA6SVNCTjogOTc4LTAxMzcwMTc4MzYKKworICAgICogVGl0bGU6ICoqTGludXggS2VybmVsIERldmVsb3BtZW50LCAzcmQgRWRpdGlvbioqCisKKyAgICAgIDpBdXRob3I6IFJvYmVydCBMb3ZlCisgICAgICA6UHVibGlzaGVyOiBBZGRpc29uLVdlc2xleQorICAgICAgOkRhdGU6IEp1bHksIDIwMTAKKyAgICAgIDpQYWdlczogNDQwCisgICAgICA6SVNCTjogOTc4LTA2NzIzMjk0NjMKKworICAgICogVGl0bGU6ICoqRXNzZW50aWFsIExpbnV4IERldmljZSBEcml2ZXJzKioKKworICAgICAgOkF1dGhvcjogU3JlZWtyaXNobmFuIFZlbmthdGVzd2FyYW4KKyAgICAgIDpQdWJsaXNoZWQ6IFByZW50aWNlIEhhbGwKKyAgICAgIDpEYXRlOiBBcHJpbCwgMjAwOAorICAgICAgOlBhZ2VzOiA3NDQKKyAgICAgIDpJU0JOOiA5NzgtMDEzMjM5NjU1NAorCisuLiBfbGRkM19wdWJsaXNoZWQ6CisKKyAgICAqIFRpdGxlOiAqKkxpbnV4IERldmljZSBEcml2ZXJzLCAzcmQgRWRpdGlvbioqCisKKyAgICAgIDpBdXRob3JzOiBKb25hdGhhbiBDb3JiZXQsIEFsZXNzYW5kcm8gUnViaW5pLCBhbmQgR3JlZyBLcm9haC1IYXJ0bWFuCisgICAgICA6UHVibGlzaGVyOiBPJ1JlaWxseSAmIEFzc29jaWF0ZXMKKyAgICAgIDpEYXRlOiAyMDA1CisgICAgICA6UGFnZXM6IDYzNgorICAgICAgOklTQk46IDAtNTk2LTAwNTkwLTMKKyAgICAgIDpOb3RlczogRnVydGhlciBpbmZvcm1hdGlvbiBpbgorICAgICAgICBodHRwOi8vd3d3Lm9yZWlsbHkuY29tL2NhdGFsb2cvbGludXhkcml2ZTMvCisgICAgICAgIFBERiBmb3JtYXQsIFVSTDogaHR0cDovL2x3bi5uZXQvS2VybmVsL0xERDMvCisKKyAgICAqIFRpdGxlOiAqKkxpbnV4IEtlcm5lbCBJbnRlcm5hbHMqKgorCisgICAgICA6QXV0aG9yOiBNaWNoYWVsIEJlY2sKKyAgICAgIDpQdWJsaXNoZXI6IEFkZGlzb24tV2VzbGV5CisgICAgICA6RGF0ZTogMTk5NworICAgICAgOklTQk46IDAtMjAxLTMzMTQzLTggKHNlY29uZCBlZGl0aW9uKQorCisgICAgKiBUaXRsZTogKipQcm9ncmFtbWF0aW9uIExpbnV4IDIuMCBBUEkgc3lzdGVtZSBldCBmb25jdGlvbm5lbWVudCBkdSBub3lhdSoqCisKKyAgICAgIDpBdXRob3I6IFJlbXkgQ2FyZCwgRXJpYyBEdW1hcywgRnJhbmNrIE1ldmVsCisgICAgICA6UHVibGlzaGVyOiBFeXJvbGxlcworICAgICAgOkRhdGU6IDE5OTcKKyAgICAgIDpQYWdlczogNTIwCisgICAgICA6SVNCTjogMi0yMTItMDg5MzItNQorICAgICAgOk5vdGVzOiBGcmVuY2gKKworICAgICogVGl0bGU6ICoqVGhlIERlc2lnbiBhbmQgSW1wbGVtZW50YXRpb24gb2YgdGhlIDQuNCBCU0QgVU5JWCBPcGVyYXRpbmcgU3lzdGVtKioKKworICAgICAgOkF1dGhvcjogTWFyc2hhbGwgS2lyayBNY0t1c2ljaywgS2VpdGggQm9zdGljLCBNaWNoYWVsIEouIEthcmVscywKKyAgICAgICAgSm9obiBTLiBRdWFydGVybWFuCisgICAgICA6UHVibGlzaGVyOiBBZGRpc29uLVdlc2xleQorICAgICAgOkRhdGU6IDE5OTYKKyAgICAgIDpJU0JOOiAwLTIwMS01NDk3OS00CisKKyAgICAqIFRpdGxlOiAqKlVuaXggaW50ZXJuYWxzIC0tIHRoZSBuZXcgZnJvbnRpZXJzKioKKworICAgICAgOkF1dGhvcjogVXJlc2ggVmFoYWxpYQorICAgICAgOlB1Ymxpc2hlcjogUHJlbnRpY2UgSGFsbAorICAgICAgOkRhdGU6IDE5OTYKKyAgICAgIDpQYWdlczogNjAwCisgICAgICA6SVNCTjogMC0xMy0xMDE5MDgtMgorCisgICAgKiBUaXRsZTogKipQcm9ncmFtbWluZyBmb3IgdGhlIHJlYWwgd29ybGQgLSBQT1NJWC40KioKKworICAgICAgOkF1dGhvcjogQmlsbCBPLiBHYWxsbWVpc3RlcgorICAgICAgOlB1Ymxpc2hlcjogTydSZWlsbHkgJiBBc3NvY2lhdGVzLCBJbmMKKyAgICAgIDpEYXRlOiAxOTk1CisgICAgICA6UGFnZXM6IDU1MgorICAgICAgOklTQk46IEktNTY1OTItMDc0LTAKKyAgICAgIDpOb3RlczogVGhvdWdoIG5vdCBiZWluZyBkaXJlY3RseSBhYm91dCBMaW51eCwgTGludXggYWltcyB0byBiZQorICAgICAgICBQT1NJWC4gR29vZCByZWZlcmVuY2UuCisKKyAgICAqIFRpdGxlOiAgKipVTklYICBTeXN0ZW1zICBmb3IgIE1vZGVybiBBcmNoaXRlY3R1cmVzOiBTeW1tZXRyaWMgTXVsdGlwcm9jZXNzaW5nIGFuZCBDYWNoaW5nIGZvciBLZXJuZWwgUHJvZ3JhbW1lcnMqKgorCisgICAgICA6QXV0aG9yOiBDdXJ0IFNjaGltbWVsCisgICAgICA6UHVibGlzaGVyOiBBZGRpc29uIFdlc2xleQorICAgICAgOkRhdGU6IEp1bmUsIDE5OTQKKyAgICAgIDpQYWdlczogNDMyCisgICAgICA6SVNCTjogMC0yMDEtNjMzMzgtOAorCisgICAgKiBUaXRsZTogKipUaGUgRGVzaWduIGFuZCBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgNC4zIEJTRCBVTklYIE9wZXJhdGluZyBTeXN0ZW0qKgorCisgICAgICA6QXV0aG9yOiBTYW11ZWwgSi4gTGVmZmxlciwgTWFyc2hhbGwgS2lyayBNY0t1c2ljaywgTWljaGFlbCBKCisgICAgICAgIEthcmVscywgSm9obiBTLiBRdWFydGVybWFuCisgICAgICA6UHVibGlzaGVyOiBBZGRpc29uLVdlc2xleQorICAgICAgOkRhdGU6IDE5ODkgKHJlcHJpbnRlZCB3aXRoIGNvcnJlY3Rpb25zIG9uIE9jdG9iZXIsIDE5OTApCisgICAgICA6SVNCTjogMC0yMDEtMDYxOTYtMQorCisgICAgKiBUaXRsZTogKipUaGUgRGVzaWduIG9mIHRoZSBVTklYIE9wZXJhdGluZyBTeXN0ZW0qKgorCisgICAgICA6QXV0aG9yOiBNYXVyaWNlIEouIEJhY2gKKyAgICAgIDpQdWJsaXNoZXI6IFByZW50aWNlIEhhbGwKKyAgICAgIDpEYXRlOiAxOTg2CisgICAgICA6UGFnZXM6IDQ3MQorICAgICAgOklTQk46IDAtMTMtMjAxNzU3LTEKKworTWlzY2VsbGFuZW91cworLS0tLS0tLS0tLS0tLQorCisgICAgKiBOYW1lOiAqKkNyb3NzLVJlZmVyZW5jaW5nIExpbnV4KioKKworICAgICAgOlVSTDogaHR0cDovL2x4ci5mcmVlLWVsZWN0cm9ucy5jb20vCisgICAgICA6S2V5d29yZHM6IEJyb3dzaW5nIHNvdXJjZSBjb2RlLgorICAgICAgOkRlc2NyaXB0aW9uOiBBbm90aGVyIHdlYi1iYXNlZCBMaW51eCBrZXJuZWwgc291cmNlIGNvZGUgYnJvd3Nlci4KKyAgICAgICAgTG90cyBvZiBjcm9zcyByZWZlcmVuY2VzIHRvIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zLiBZb3UgY2FuIHNlZQorICAgICAgICB3aGVyZSB0aGV5IGFyZSBkZWZpbmVkIGFuZCB3aGVyZSB0aGV5IGFyZSB1c2VkLgorCisgICAgKiBOYW1lOiAqKkxpbnV4IFdlZWtseSBOZXdzKioKKworICAgICAgOlVSTDogaHR0cDovL2x3bi5uZXQKKyAgICAgIDpLZXl3b3JkczogbGF0ZXN0IGtlcm5lbCBuZXdzLgorICAgICAgOkRlc2NyaXB0aW9uOiBUaGUgdGl0bGUgc2F5cyBpdCBhbGwuIFRoZXJlJ3MgYSBmaXhlZCBrZXJuZWwgc2VjdGlvbgorICAgICAgICBzdW1tYXJpemluZyBkZXZlbG9wZXJzJyB3b3JrLCBidWcgZml4ZXMsIG5ldyBmZWF0dXJlcyBhbmQgdmVyc2lvbnMKKyAgICAgICAgcHJvZHVjZWQgZHVyaW5nIHRoZSB3ZWVrLiBQdWJsaXNoZWQgZXZlcnkgVGh1cnNkYXkuCisKKyAgICAqIE5hbWU6ICoqVGhlIGhvbWUgcGFnZSBvZiBMaW51eC1NTSoqCisKKyAgICAgIDpBdXRob3I6IFRoZSBMaW51eC1NTSB0ZWFtLgorICAgICAgOlVSTDogaHR0cDovL2xpbnV4LW1tLm9yZy8KKyAgICAgIDpLZXl3b3JkczogbWVtb3J5IG1hbmFnZW1lbnQsIExpbnV4LU1NLCBtbSBwYXRjaGVzLCBUT0RPLCBkb2NzLAorICAgICAgICBtYWlsaW5nIGxpc3QuCisgICAgICA6RGVzY3JpcHRpb246IFNpdGUgZGV2b3RlZCB0byBMaW51eCBNZW1vcnkgTWFuYWdlbWVudCBkZXZlbG9wbWVudC4KKyAgICAgICAgTWVtb3J5IHJlbGF0ZWQgcGF0Y2hlcywgSE9XVE9zLCBsaW5rcywgbW0gZGV2ZWxvcGVycy4uLiBEb24ndCBtaXNzCisgICAgICAgIGl0IGlmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBtZW1vcnkgbWFuYWdlbWVudCBkZXZlbG9wbWVudCEKKworICAgICogTmFtZTogKipLZXJuZWwgTmV3YmllcyBJUkMgQ2hhbm5lbCBhbmQgV2Vic2l0ZSoqCisKKyAgICAgIDpVUkw6IGh0dHA6Ly93d3cua2VybmVsbmV3Ymllcy5vcmcKKyAgICAgIDpLZXl3b3JkczogSVJDLCBuZXdiaWVzLCBjaGFubmVsLCBhc2tpbmcgZG91YnRzLgorICAgICAgOkRlc2NyaXB0aW9uOiAja2VybmVsbmV3YmllcyBvbiBpcmMub2Z0Yy5uZXQuCisgICAgICAgICNrZXJuZWxuZXdiaWVzIGlzIGFuIElSQyBuZXR3b3JrIGRlZGljYXRlZCB0byB0aGUgJ25ld2JpZScKKyAgICAgICAga2VybmVsIGhhY2tlci4gVGhlIGF1ZGllbmNlIG1vc3RseSBjb25zaXN0cyBvZiBwZW9wbGUgd2hvIGFyZQorICAgICAgICBsZWFybmluZyBhYm91dCB0aGUga2VybmVsLCB3b3JraW5nIG9uIGtlcm5lbCBwcm9qZWN0cyBvcgorICAgICAgICBwcm9mZXNzaW9uYWwga2VybmVsIGhhY2tlcnMgdGhhdCB3YW50IHRvIGhlbHAgbGVzcyBzZWFzb25lZCBrZXJuZWwKKyAgICAgICAgcGVvcGxlLgorICAgICAgICAja2VybmVsbmV3YmllcyBpcyBvbiB0aGUgT0ZUQyBJUkMgTmV0d29yay4KKyAgICAgICAgVHJ5IGlyYy5vZnRjLm5ldCBhcyB5b3VyIHNlcnZlciBhbmQgdGhlbiAvam9pbiAja2VybmVsbmV3Ymllcy4KKyAgICAgICAgVGhlIGtlcm5lbG5ld2JpZXMgd2Vic2l0ZSBhbHNvIGhvc3RzIGFydGljbGVzLCBkb2N1bWVudHMsIEZBUXMuLi4KKworICAgICogTmFtZTogKipsaW51eC1rZXJuZWwgbWFpbGluZyBsaXN0IGFyY2hpdmVzIGFuZCBzZWFyY2ggZW5naW5lcyoqCisKKyAgICAgIDpVUkw6IGh0dHA6Ly92Z2VyLmtlcm5lbC5vcmcvdmdlci1saXN0cy5odG1sCisgICAgICA6VVJMOiBodHRwOi8vd3d3LnV3c2cuaW5kaWFuYS5lZHUvaHlwZXJtYWlsL2xpbnV4L2tlcm5lbC9pbmRleC5odG1sCisgICAgICA6VVJMOiBodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvbWxpc3QubGludXgua2VybmVsCisgICAgICA6S2V5d29yZHM6IGxpbnV4LWtlcm5lbCwgYXJjaGl2ZXMsIHNlYXJjaC4KKyAgICAgIDpEZXNjcmlwdGlvbjogU29tZSBvZiB0aGUgbGludXgta2VybmVsIG1haWxpbmcgbGlzdCBhcmNoaXZlcnMuIElmCisgICAgICAgIHlvdSBoYXZlIGEgYmV0dGVyL2Fub3RoZXIgb25lLCBwbGVhc2UgbGV0IG1lIGtub3cuCisKKy0tLS0tLS0KKworRG9jdW1lbnQgbGFzdCB1cGRhdGVkIG9uIFR1ZSAyMDE2LVNlcC0yMAorCitUaGlzIGRvY3VtZW50IGlzIGJhc2VkIG9uOgorIGh0dHA6Ly93d3cuZGl0LnVwbS5lcy9+am1zZXlhcy9saW51eC9rZXJuZWwvaGFja2Vycy1kb2NzLmh0bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2VybmVsLWRvY3VtZW50YXRpb24ucnN0IGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jdW1lbnRhdGlvbi5yc3QKaW5kZXggYzRlYjUwNC4uMTBjYzdkZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jdW1lbnRhdGlvbi5yc3QKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jdW1lbnRhdGlvbi5yc3QKQEAgLTEwNyw2ICsxMDcsMzUgQEAKICAgdGhlIG9yZGVyIGFzIGVuY291bnRlcmVkLiIpLCBoYXZpbmcgdGhlIGhpZ2hlciBsZXZlbHMgdGhlIHNhbWUgb3ZlcmFsbCBtYWtlcwogICBpdCBlYXNpZXIgdG8gZm9sbG93IHRoZSBkb2N1bWVudHMuCiAKKwordGhlIEMgZG9tYWluCistLS0tLS0tLS0tLS0KKworVGhlIGBTcGhpbnggQyBEb21haW5gXyAobmFtZSBjKSBpcyBzdWl0ZWQgZm9yIGRvY3VtZW50YXRpb24gb2YgQyBBUEkuIEUuZy4gYQorZnVuY3Rpb24gcHJvdG90eXBlOgorCisuLiBjb2RlLWJsb2NrOjogcnN0CisKKyAgICAuLiBjOmZ1bmN0aW9uOjogaW50IGlvY3RsKCBpbnQgZmQsIGludCByZXF1ZXN0ICkKKworVGhlIEMgZG9tYWluIG9mIHRoZSBrZXJuZWwtZG9jIGhhcyBzb21lIGFkZGl0aW9uYWwgZmVhdHVyZXMuIEUuZy4geW91IGNhbgorKnJlbmFtZSogdGhlIHJlZmVyZW5jZSBuYW1lIG9mIGEgZnVuY3Rpb24gd2l0aCBhIGNvbW1vbiBuYW1lIGxpa2UgYGBvcGVuYGAgb3IKK2BgaW9jdGxgYDoKKworLi4gY29kZS1ibG9jazo6IHJzdAorCisgICAgIC4uIGM6ZnVuY3Rpb246OiBpbnQgaW9jdGwoIGludCBmZCwgaW50IHJlcXVlc3QgKQorICAgICAgICA6bmFtZTogVklESU9DX0xPR19TVEFUVVMKKworVGhlIGZ1bmMtbmFtZSAoZS5nLiBpb2N0bCkgcmVtYWlucyBpbiB0aGUgb3V0cHV0IGJ1dCB0aGUgcmVmLW5hbWUgY2hhbmdlZCBmcm9tCitgYGlvY3RsYGAgdG8gYGBWSURJT0NfTE9HX1NUQVRVU2BgLiBUaGUgaW5kZXggZW50cnkgZm9yIHRoaXMgZnVuY3Rpb24gaXMgYWxzbworY2hhbmdlZCB0byBgYFZJRElPQ19MT0dfU1RBVFVTYGAgYW5kIHRoZSBmdW5jdGlvbiBjYW4gbm93IHJlZmVyZW5jZWQgYnk6CisKKy4uIGNvZGUtYmxvY2s6OiByc3QKKworICAgICA6YzpmdW5jOmBWSURJT0NfTE9HX1NUQVRVU2AKKworCiBsaXN0IHRhYmxlcwogLS0tLS0tLS0tLS0KIApAQCAtMjY1LDYgKzI5NCw4IEBACiBgYHNjcmlwdHMva2VybmVsLWRvY2BgIHNjcmlwdCB0byBleHRyYWN0IHRoZSBkb2N1bWVudGF0aW9uIGNvbW1lbnRzIGZyb20gdGhlCiBzb3VyY2UuCiAKKy4uIF9rZXJuZWxfZG9jOgorCiBXcml0aW5nIGtlcm5lbC1kb2MgY29tbWVudHMKID09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0zNjYsOCArMzk3LDYgQEAKIENyb3NzLXJlZmVyZW5jaW5nIGZyb20gcmVTdHJ1Y3R1cmVkVGV4dAogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiAKLS4uIGhpZ2hsaWdodDo6IG5vbmUKLQogVG8gY3Jvc3MtcmVmZXJlbmNlIHRoZSBmdW5jdGlvbnMgYW5kIHR5cGVzIGRlZmluZWQgaW4gdGhlIGtlcm5lbC1kb2MgY29tbWVudHMKIGZyb20gcmVTdHJ1Y3R1cmVkVGV4dCBkb2N1bWVudHMsIHBsZWFzZSB1c2UgdGhlIGBTcGhpbnggQyBEb21haW5gXwogcmVmZXJlbmNlcy4gRm9yIGV4YW1wbGU6OgpAQCAtMzkwLDggKzQxOSw2IEBACiBGdW5jdGlvbiBkb2N1bWVudGF0aW9uCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS4uIGhpZ2hsaWdodDo6IGMKLQogVGhlIGdlbmVyYWwgZm9ybWF0IG9mIGEgZnVuY3Rpb24gYW5kIGZ1bmN0aW9uLWxpa2UgbWFjcm8ga2VybmVsLWRvYyBjb21tZW50IGlzOjoKIAogICAvKioKQEAgLTU3Miw4ICs1OTksNiBAQAogQ29udmVydGluZyBEb2NCb29rIHRvIFNwaGlueAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0uLiBoaWdobGlnaHQ6OiBub25lCi0KIE92ZXIgdGltZSwgd2UgZXhwZWN0IGFsbCBvZiB0aGUgZG9jdW1lbnRzIHVuZGVyIGBgRG9jdW1lbnRhdGlvbi9Eb2NCb29rYGAgdG8gYmUKIGNvbnZlcnRlZCB0byBTcGhpbnggYW5kIHJlU3RydWN0dXJlZFRleHQuIEZvciBtb3N0IERvY0Jvb2sgWE1MIGRvY3VtZW50cywgYSBnb29kCiBlbm91Z2ggc29sdXRpb24gaXMgdG8gdXNlIHRoZSBzaW1wbGUgYGBEb2N1bWVudGF0aW9uL3NwaGlueC90bXBsY3Z0YGAgc2NyaXB0LApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAppbmRleCA0NmMwMzBhLi5lYzhkODE0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dApAQCAtNDYwLDYgKzQ2MCwxNSBAQAogCQkJZHJpdmVyIHdpbGwgcHJpbnQgQUNQSSB0YWJsZXMgZm9yIEFNRCBJT01NVSBkdXJpbmcKIAkJCUlPTU1VIGluaXRpYWxpemF0aW9uLgogCisJYW1kX2lvbW11X2ludHI9CVtIVyxYODYtNjRdCisJCQlTcGVjaWZpZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgQU1EIElPTU1VIGludGVycnVwdAorCQkJcmVtYXBwaW5nIG1vZGVzOgorCQkJbGVnYWN5ICAgICAtIFVzZSBsZWdhY3kgaW50ZXJydXB0IHJlbWFwcGluZyBtb2RlLgorCQkJdmFwaWMgICAgICAtIFVzZSB2aXJ0dWFsIEFQSUMgbW9kZSwgd2hpY2ggYWxsb3dzIElPTU1VCisJCQkgICAgICAgICAgICAgdG8gaW5qZWN0IGludGVycnVwdHMgZGlyZWN0bHkgaW50byBndWVzdC4KKwkJCSAgICAgICAgICAgICBUaGlzIG1vZGUgcmVxdWlyZXMga3ZtLWFtZC5hdmljPTEuCisJCQkgICAgICAgICAgICAgKERlZmF1bHQgd2hlbiBJT01NVSBIVyBzdXBwb3J0IGlzIHByZXNlbnQuKQorCiAJYW1pam95Lm1hcD0JW0hXLEpPWV0gQW1pZ2Egam95c3RpY2sgc3VwcG9ydAogCQkJTWFwIG9mIGRldmljZXMgYXR0YWNoZWQgdG8gSk9ZMERBVCBhbmQgSk9ZMURBVAogCQkJRm9ybWF0OiA8YT4sPGI+CkBAIC02OTgsNiArNzA3LDE1IEBACiAJCQlsb29wcyBjYW4gYmUgZGVidWdnZWQgbW9yZSBlZmZlY3RpdmVseSBvbiBwcm9kdWN0aW9uCiAJCQlzeXN0ZW1zLgogCisJY2xvY2tzb3VyY2UuYXJtX2FyY2hfdGltZXIuZnNsLWEwMDg1ODU9CisJCQlbQVJNNjRdCisJCQlGb3JtYXQ6IDxib29sPgorCQkJRW5hYmxlL2Rpc2FibGUgdGhlIHdvcmthcm91bmQgb2YgRnJlZXNjYWxlL05YUAorCQkJZXJyYXR1bSBBLTAwODU4NS4gIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgS1ZNCisJCQlndWVzdHMsIGlmIHRoZSBndWVzdCBkZXZpY2UgdHJlZSBkb2Vzbid0IHNob3cgdGhlCisJCQllcnJhdHVtLiAgSWYgdW5zcGVjaWZpZWQsIHRoZSB3b3JrYXJvdW5kIGlzCisJCQllbmFibGVkIGJhc2VkIG9uIHRoZSBkZXZpY2UgdHJlZS4KKwogCWNsZWFyY3B1aWQ9QklUTlVNIFtYODZdCiAJCQlEaXNhYmxlIENQVUlEIGZlYXR1cmUgWCBmb3IgdGhlIGtlcm5lbC4gU2VlCiAJCQlhcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlcy5oIGZvciB0aGUgdmFsaWQgYml0CkBAIC0xMDQ1LDExICsxMDYzLDEyIEBACiAJCQlkZXRlcm1pbmVkIGJ5IHRoZSBzdGRvdXQtcGF0aCBwcm9wZXJ0eSBpbiBkZXZpY2UKIAkJCXRyZWUncyBjaG9zZW4gbm9kZS4KIAotCQljZG5zLDxhZGRyPgotCQkJU3RhcnQgYW4gZWFybHksIHBvbGxlZC1tb2RlIGNvbnNvbGUgb24gYSBjYWRlbmNlIHNlcmlhbAotCQkJcG9ydCBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuIFRoZSBjYWRlbmNlIHNlcmlhbCBwb3J0Ci0JCQltdXN0IGFscmVhZHkgYmUgc2V0dXAgYW5kIGNvbmZpZ3VyZWQuIE9wdGlvbnMgYXJlIG5vdAotCQkJeWV0IHN1cHBvcnRlZC4KKwkJY2Rucyw8YWRkcj5bLG9wdGlvbnNdCisJCQlTdGFydCBhbiBlYXJseSwgcG9sbGVkLW1vZGUgY29uc29sZSBvbiBhIENhZGVuY2UKKwkJCSh4dWFydHBzKSBzZXJpYWwgcG9ydCBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuIE9ubHkKKwkJCXN1cHBvcnRlZCBvcHRpb24gaXMgYmF1ZCByYXRlLiBJZiBiYXVkIHJhdGUgaXMgbm90CisJCQlzcGVjaWZpZWQsIHRoZSBzZXJpYWwgcG9ydCBtdXN0IGFscmVhZHkgYmUgc2V0dXAgYW5kCisJCQljb25maWd1cmVkLgogCiAJCXVhcnRbODI1MF0saW8sPGFkZHI+WyxvcHRpb25zXQogCQl1YXJ0WzgyNTBdLG1taW8sPGFkZHI+WyxvcHRpb25zXQpAQCAtMTM2NCw2ICsxMzgzLDEwIEBACiAJCQlGb3JtYXQ6IDx1bnNpZ25lZCBpbnQ+IHN1Y2ggdGhhdCAocnhzaXplICYgfjB4MWZmZmMwKSA9PSAwLgogCQkJRGVmYXVsdDogMTAyNAogCisJZ3Bpby1tb2NrdXAuZ3Bpb19tb2NrdXBfcmFuZ2VzCisJCQlbSFddIFNldHMgdGhlIHJhbmdlcyBvZiBncGlvY2hpcCBvZiBmb3IgdGhpcyBkZXZpY2UuCisJCQlGb3JtYXQ6IDxzdGFydDE+LDxlbmQxPiw8c3RhcnQyPiw8ZW5kMj4uLi4KKwogCWhhcmRsb2NrdXBfYWxsX2NwdV9iYWNrdHJhY2U9CiAJCQlbS05MXSBTaG91bGQgdGhlIGhhcmQtbG9ja3VwIGRldGVjdG9yIGdlbmVyYXRlCiAJCQliYWNrdHJhY2VzIG9uIGFsbCBjcHVzLgpAQCAtMTY4OCw3ICsxNzExLDcgQEAKIAogCWludGVsX2lkbGUubWF4X2NzdGF0ZT0JW0tOTCxIVyxBQ1BJLFg4Nl0KIAkJCTAJZGlzYWJsZXMgaW50ZWxfaWRsZSBhbmQgZmFsbCBiYWNrIG9uIGFjcGlfaWRsZS4KLQkJCTEgdG8gNglzcGVjaWZ5IG1heGltdW0gZGVwdGggb2YgQy1zdGF0ZS4KKwkJCTEgdG8gOQlzcGVjaWZ5IG1heGltdW0gZGVwdGggb2YgQy1zdGF0ZS4KIAogCWludGVsX3BzdGF0ZT0gIFtYODZdCiAJCSAgICAgICBkaXNhYmxlCkBAIC0yMTYxLDEwICsyMTg0LDEzIEBACiAJCQl0aGFuIG9yIGVxdWFsIHRvIHRoaXMgcGh5c2ljYWwgYWRkcmVzcyBpcyBpZ25vcmVkLgogCiAJbWF4Y3B1cz0JW1NNUF0gTWF4aW11bSBudW1iZXIgb2YgcHJvY2Vzc29ycyB0aGF0CWFuIFNNUCBrZXJuZWwKLQkJCXNob3VsZCBtYWtlIHVzZSBvZi4gIG1heGNwdXM9biA6IG4gPj0gMCBsaW1pdHMgdGhlCi0JCQlrZXJuZWwgdG8gdXNpbmcgJ24nIHByb2Nlc3NvcnMuICBuPTAgaXMgYSBzcGVjaWFsIGNhc2UsCi0JCQlpdCBpcyBlcXVpdmFsZW50IHRvICJub3NtcCIsIHdoaWNoIGFsc28gZGlzYWJsZXMKLQkJCXRoZSBJTyBBUElDLgorCQkJd2lsbCBicmluZyB1cCBkdXJpbmcgYm9vdHVwLiAgbWF4Y3B1cz1uIDogbiA+PSAwIGxpbWl0cworCQkJdGhlIGtlcm5lbCB0byBicmluZyB1cCAnbicgcHJvY2Vzc29ycy4gU3VyZWx5IGFmdGVyCisJCQlib290dXAgeW91IGNhbiBicmluZyB1cCB0aGUgb3RoZXIgcGx1Z2dlZCBjcHUgYnkgZXhlY3V0aW5nCisJCQkiZWNobyAxID4gL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1WC9vbmxpbmUiLiBTbyBtYXhjcHVzCisJCQlvbmx5IHRha2VzIGVmZmVjdCBkdXJpbmcgc3lzdGVtIGJvb3R1cC4KKwkJCVdoaWxlIG49MCBpcyBhIHNwZWNpYWwgY2FzZSwgaXQgaXMgZXF1aXZhbGVudCB0byAibm9zbXAiLAorCQkJd2hpY2ggYWxzbyBkaXNhYmxlcyB0aGUgSU8gQVBJQy4KIAogCW1heF9sb29wPQlbTE9PUF0gVGhlIG51bWJlciBvZiBsb29wIGJsb2NrIGRldmljZXMgdGhhdCBnZXQKIAkobG9vcC5tYXhfbG9vcCkJdW5jb25kaXRpb25hbGx5IHByZS1jcmVhdGVkIGF0IGluaXQgdGltZS4gVGhlIGRlZmF1bHQKQEAgLTI1NzEsOCArMjU5Nyw2IEBACiAKIAlub2RlbGF5YWNjdAlbS05MXSBEaXNhYmxlIHBlci10YXNrIGRlbGF5IGFjY291bnRpbmcKIAotCW5vZGlzY29ubmVjdAlbSFcsU0NTSSxNNjhLXSBEaXNhYmxlcyBTQ1NJIGRpc2Nvbm5lY3RzLgotCiAJbm9kc3AJCVtTSF0gRGlzYWJsZSBoYXJkd2FyZSBEU1AgYXQgYm9vdCB0aW1lLgogCiAJbm9lZmkJCURpc2FibGUgRUZJIHJ1bnRpbWUgc2VydmljZXMgc3VwcG9ydC4KQEAgLTI3NzMsOSArMjc5NywxMiBAQAogCiAJbnJfY3B1cz0JW1NNUF0gTWF4aW11bSBudW1iZXIgb2YgcHJvY2Vzc29ycyB0aGF0CWFuIFNNUCBrZXJuZWwKIAkJCWNvdWxkIHN1cHBvcnQuICBucl9jcHVzPW4gOiBuID49IDEgbGltaXRzIHRoZSBrZXJuZWwgdG8KLQkJCXN1cHBvcnRpbmcgJ24nIHByb2Nlc3NvcnMuIExhdGVyIGluIHJ1bnRpbWUgeW91IGNhbiBub3QKLQkJCXVzZSBob3RwbHVnIGNwdSBmZWF0dXJlIHRvIHB1dCBtb3JlIGNwdSBiYWNrIHRvIG9ubGluZS4KLQkJCWp1c3QgbGlrZSB5b3UgY29tcGlsZSB0aGUga2VybmVsIE5SX0NQVVM9bgorCQkJc3VwcG9ydCAnbicgcHJvY2Vzc29ycy4gSXQgY291bGQgYmUgbGFyZ2VyIHRoYW4gdGhlCisJCQludW1iZXIgb2YgYWxyZWFkeSBwbHVnZ2VkIENQVSBkdXJpbmcgYm9vdHVwLCBsYXRlciBpbgorCQkJcnVudGltZSB5b3UgY2FuIHBoeXNpY2FsbHkgYWRkIGV4dHJhIGNwdSB1bnRpbCBpdCByZWFjaGVzCisJCQluLiBTbyBkdXJpbmcgYm9vdCB1cCBzb21lIGJvb3QgdGltZSBtZW1vcnkgZm9yIHBlci1jcHUKKwkJCXZhcmlhYmxlcyBuZWVkIGJlIHByZS1hbGxvY2F0ZWQgZm9yIGxhdGVyIHBoeXNpY2FsIGNwdQorCQkJaG90IHBsdWdnaW5nLgogCiAJbnJfdWFydHM9CVtTRVJJQUxdIG1heGltdW0gbnVtYmVyIG9mIFVBUlRzIHRvIGJlIHJlZ2lzdGVyZWQuCiAKQEAgLTMwMzIsNiArMzA1OSwxMCBAQAogCQkJCVBBR0VfU0laRSBpcyB1c2VkIGFzIGFsaWdubWVudC4KIAkJCQlQQ0ktUENJIGJyaWRnZSBjYW4gYmUgc3BlY2lmaWVkLCBpZiByZXNvdXJjZQogCQkJCXdpbmRvd3MgbmVlZCB0byBiZSBleHBhbmRlZC4KKwkJCQlUbyBzcGVjaWZ5IHRoZSBhbGlnbm1lbnQgZm9yIHNldmVyYWwKKwkJCQlpbnN0YW5jZXMgb2YgYSBkZXZpY2UsIHRoZSBQQ0kgdmVuZG9yLAorCQkJCWRldmljZSwgc3VidmVuZG9yLCBhbmQgc3ViZGV2aWNlIG1heSBiZQorCQkJCXNwZWNpZmllZCwgZS5nLiwgNDA5NkBwY2k6ODA4Njo5YzIyOjEwM2M6MTk4ZgogCQllY3JjPQkJRW5hYmxlL2Rpc2FibGUgUENJZSBFQ1JDICh0cmFuc2FjdGlvbiBsYXllcgogCQkJCWVuZC10by1lbmQgQ1JDIGNoZWNraW5nKS4KIAkJCQliaW9zOiBVc2UgQklPUy9maXJtd2FyZSBzZXR0aW5ncy4gVGhpcyBpcyB0aGUKQEAgLTQyMzQsNiArNDI2NSw4IEBACiAJCQkJdSA9IElHTk9SRV9VQVMgKGRvbid0IGJpbmQgdG8gdGhlIHVhcyBkcml2ZXIpOwogCQkJCXcgPSBOT19XUF9ERVRFQ1QgKGRvbid0IHRlc3Qgd2hldGhlciB0aGUKIAkJCQkJbWVkaXVtIGlzIHdyaXRlLXByb3RlY3RlZCkuCisJCQkJeSA9IEFMV0FZU19TWU5DIChpc3N1ZSBhIFNZTkNIUk9OSVpFX0NBQ0hFCisJCQkJCWV2ZW4gaWYgdGhlIGRldmljZSBjbGFpbXMgbm8gY2FjaGUpCiAJCQlFeGFtcGxlOiBxdWlya3M9MDQxOTphYWY1OnJsLDA0MjE6MDQzMzpyYwogCiAJdXNlcl9kZWJ1Zz0JW0tOTCxBUk1dCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ttZW1jaGVjay50eHQgYi9Eb2N1bWVudGF0aW9uL2ttZW1jaGVjay50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYWFlODUuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9rbWVtY2hlY2sudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNzU0ICswLDAgQEAKLUdFVFRJTkcgU1RBUlRFRCBXSVRIIEtNRU1DSEVDSwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVZlZ2FyZCBOb3NzdW0gPHZlZ2FyZG5vQGlmaS51aW8ubm8+Ci0KLQotQ29udGVudHMKLT09PT09PT09Ci0wLiBJbnRyb2R1Y3Rpb24KLTEuIERvd25sb2FkaW5nCi0yLiBDb25maWd1cmluZyBhbmQgY29tcGlsaW5nCi0zLiBIb3cgdG8gdXNlCi0zLjEuIEJvb3RpbmcKLTMuMi4gUnVuLXRpbWUgZW5hYmxlL2Rpc2FibGUKLTMuMy4gRGVidWdnaW5nCi0zLjQuIEFubm90YXRpbmcgZmFsc2UgcG9zaXRpdmVzCi00LiBSZXBvcnRpbmcgZXJyb3JzCi01LiBUZWNobmljYWwgZGVzY3JpcHRpb24KLQotCi0wLiBJbnRyb2R1Y3Rpb24KLT09PT09PT09PT09PT09PQotCi1rbWVtY2hlY2sgaXMgYSBkZWJ1Z2dpbmcgZmVhdHVyZSBmb3IgdGhlIExpbnV4IEtlcm5lbC4gTW9yZSBzcGVjaWZpY2FsbHksIGl0Ci1pcyBhIGR5bmFtaWMgY2hlY2tlciB0aGF0IGRldGVjdHMgYW5kIHdhcm5zIGFib3V0IHNvbWUgdXNlcyBvZiB1bmluaXRpYWxpemVkCi1tZW1vcnkuCi0KLVVzZXJzcGFjZSBwcm9ncmFtbWVycyBtaWdodCBiZSBmYW1pbGlhciB3aXRoIFZhbGdyaW5kJ3MgbWVtY2hlY2suIFRoZSBtYWluCi1kaWZmZXJlbmNlIGJldHdlZW4gbWVtY2hlY2sgYW5kIGttZW1jaGVjayBpcyB0aGF0IG1lbWNoZWNrIHdvcmtzIGZvciB1c2Vyc3BhY2UKLXByb2dyYW1zIG9ubHksIGFuZCBrbWVtY2hlY2sgd29ya3MgZm9yIHRoZSBrZXJuZWwgb25seS4gVGhlIGltcGxlbWVudGF0aW9ucwotYXJlIG9mIGNvdXJzZSB2YXN0bHkgZGlmZmVyZW50LiBCZWNhdXNlIG9mIHRoaXMsIGttZW1jaGVjayBpcyBub3QgYXMgYWNjdXJhdGUKLWFzIG1lbWNoZWNrLCBidXQgaXQgdHVybnMgb3V0IHRvIGJlIGdvb2QgZW5vdWdoIGluIHByYWN0aWNlIHRvIGRpc2NvdmVyIHJlYWwKLXByb2dyYW1tZXIgZXJyb3JzIHRoYXQgdGhlIGNvbXBpbGVyIGlzIG5vdCBhYmxlIHRvIGZpbmQgdGhyb3VnaCBzdGF0aWMKLWFuYWx5c2lzLgotCi1FbmFibGluZyBrbWVtY2hlY2sgb24gYSBrZXJuZWwgd2lsbCBwcm9iYWJseSBzbG93IGl0IGRvd24gdG8gdGhlIGV4dGVudCB0aGF0Ci10aGUgbWFjaGluZSB3aWxsIG5vdCBiZSB1c2FibGUgZm9yIG5vcm1hbCB3b3JrbG9hZHMgc3VjaCBhcyBlLmcuIGFuCi1pbnRlcmFjdGl2ZSBkZXNrdG9wLiBrbWVtY2hlY2sgd2lsbCBhbHNvIGNhdXNlIHRoZSBrZXJuZWwgdG8gdXNlIGFib3V0IHR3aWNlCi1hcyBtdWNoIG1lbW9yeSBhcyBub3JtYWwuIEZvciB0aGlzIHJlYXNvbiwga21lbWNoZWNrIGlzIHN0cmljdGx5IGEgZGVidWdnaW5nCi1mZWF0dXJlLgotCi0KLTEuIERvd25sb2FkaW5nCi09PT09PT09PT09PT09PQotCi1BcyBvZiB2ZXJzaW9uIDIuNi4zMS1yYzEsIGttZW1jaGVjayBpcyBpbmNsdWRlZCBpbiB0aGUgbWFpbmxpbmUga2VybmVsLgotCi0KLTIuIENvbmZpZ3VyaW5nIGFuZCBjb21waWxpbmcKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQota21lbWNoZWNrIG9ubHkgd29ya3MgZm9yIHRoZSB4ODYgKGJvdGggMzItIGFuZCA2NC1iaXQpIHBsYXRmb3JtLiBBIG51bWJlciBvZgotY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgbXVzdCBoYXZlIHNwZWNpZmljIHNldHRpbmdzIGluIG9yZGVyIGZvciB0aGUga21lbWNoZWNrCi1tZW51IHRvIGV2ZW4gYXBwZWFyIGluICJtZW51Y29uZmlnIi4gVGhlc2UgYXJlOgotCi0gIG8gQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPW4KLQotCVRoaXMgb3B0aW9uIGlzIGxvY2F0ZWQgdW5kZXIgIkdlbmVyYWwgc2V0dXAiIC8gIk9wdGltaXplIGZvciBzaXplIi4KLQotCVdpdGhvdXQgdGhpcywgZ2NjIHdpbGwgdXNlIGNlcnRhaW4gb3B0aW1pemF0aW9ucyB0aGF0IHVzdWFsbHkgbGVhZCB0bwotCWZhbHNlIHBvc2l0aXZlIHdhcm5pbmdzIGZyb20ga21lbWNoZWNrLiBBbiBleGFtcGxlIG9mIHRoaXMgaXMgYSAxNi1iaXQKLQlmaWVsZCBpbiBhIHN0cnVjdCwgd2hlcmUgZ2NjIG1heSBsb2FkIDMyIGJpdHMsIHRoZW4gZGlzY2FyZCB0aGUgdXBwZXIKLQkxNiBiaXRzLiBrbWVtY2hlY2sgc2VlcyBvbmx5IHRoZSAzMi1iaXQgbG9hZCwgYW5kIG1heSB0cmlnZ2VyIGEKLQl3YXJuaW5nIGZvciB0aGUgdXBwZXIgMTYgYml0cyAoaWYgdGhleSdyZSB1bmluaXRpYWxpemVkKS4KLQotICBvIENPTkZJR19TTEFCPXkgb3IgQ09ORklHX1NMVUI9eQotCi0JVGhpcyBvcHRpb24gaXMgbG9jYXRlZCB1bmRlciAiR2VuZXJhbCBzZXR1cCIgLyAiQ2hvb3NlIFNMQUIKLQlhbGxvY2F0b3IiLgotCi0gIG8gQ09ORklHX0ZVTkNUSU9OX1RSQUNFUj1uCi0KLQlUaGlzIG9wdGlvbiBpcyBsb2NhdGVkIHVuZGVyICJLZXJuZWwgaGFja2luZyIgLyAiVHJhY2VycyIgLyAiS2VybmVsCi0JRnVuY3Rpb24gVHJhY2VyIgotCi0JV2hlbiBmdW5jdGlvbiB0cmFjaW5nIGlzIGNvbXBpbGVkIGluLCBnY2MgZW1pdHMgYSBjYWxsIHRvIGFub3RoZXIKLQlmdW5jdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5IGZ1bmN0aW9uLiBUaGlzIG1lYW5zIHRoYXQgd2hlbiB0aGUKLQlwYWdlIGZhdWx0IGhhbmRsZXIgaXMgY2FsbGVkLCB0aGUgZnRyYWNlIGZyYW1ld29yayB3aWxsIGJlIGNhbGxlZAotCWJlZm9yZSBrbWVtY2hlY2sgaGFzIGhhZCBhIGNoYW5jZSB0byBoYW5kbGUgdGhlIGZhdWx0LiBJZiBmdHJhY2UgdGhlbgotCW1vZGlmaWVzIG1lbW9yeSB0aGF0IHdhcyB0cmFja2VkIGJ5IGttZW1jaGVjaywgdGhlIHJlc3VsdCBpcyBhbgotCWVuZGxlc3MgcmVjdXJzaXZlIHBhZ2UgZmF1bHQuCi0KLSAgbyBDT05GSUdfREVCVUdfUEFHRUFMTE9DPW4KLQotCVRoaXMgb3B0aW9uIGlzIGxvY2F0ZWQgdW5kZXIgIktlcm5lbCBoYWNraW5nIiAvICJNZW1vcnkgRGVidWdnaW5nIgotCSAvICJEZWJ1ZyBwYWdlIG1lbW9yeSBhbGxvY2F0aW9ucyIuCi0KLUluIGFkZGl0aW9uLCBJIGhpZ2hseSByZWNvbW1lbmQgdHVybmluZyBvbiBDT05GSUdfREVCVUdfSU5GTz15LiBUaGlzIGlzIGFsc28KLWxvY2F0ZWQgdW5kZXIgIktlcm5lbCBoYWNraW5nIi4gV2l0aCB0aGlzLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIGdldCBsaW5lIG51bWJlcgotaW5mb3JtYXRpb24gZnJvbSB0aGUga21lbWNoZWNrIHdhcm5pbmdzLCB3aGljaCBpcyBleHRyZW1lbHkgdmFsdWFibGUgaW4KLWRlYnVnZ2luZyBhIHByb2JsZW0uIFRoaXMgb3B0aW9uIGlzIG5vdCBtYW5kYXRvcnksIGhvd2V2ZXIsIGJlY2F1c2UgaXQgc2xvd3MKLWRvd24gdGhlIGNvbXBpbGF0aW9uIHByb2Nlc3MgYW5kIHByb2R1Y2VzIGEgbXVjaCBiaWdnZXIga2VybmVsIGltYWdlLgotCi1Ob3cgdGhlIGttZW1jaGVjayBtZW51IHNob3VsZCBiZSB2aXNpYmxlICh1bmRlciAiS2VybmVsIGhhY2tpbmciIC8gIk1lbW9yeQotRGVidWdnaW5nIiAvICJrbWVtY2hlY2s6IHRyYXAgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IikuIEhlcmUgZm9sbG93cwotYSBkZXNjcmlwdGlvbiBvZiB0aGUga21lbWNoZWNrIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzOgotCi0gIG8gQ09ORklHX0tNRU1DSEVDSwotCi0JVGhpcyBtdXN0IGJlIGVuYWJsZWQgaW4gb3JkZXIgdG8gdXNlIGttZW1jaGVjayBhdCBhbGwuLi4KLQotICBvIENPTkZJR19LTUVNQ0hFQ0tfW0RJU0FCTEVEIHwgRU5BQkxFRCB8IE9ORVNIT1RdX0JZX0RFRkFVTFQKLQotCVRoaXMgb3B0aW9uIGNvbnRyb2xzIHRoZSBzdGF0dXMgb2Yga21lbWNoZWNrIGF0IGJvb3QtdGltZS4gIkVuYWJsZWQiCi0Jd2lsbCBlbmFibGUga21lbWNoZWNrIHJpZ2h0IGZyb20gdGhlIHN0YXJ0LCAiZGlzYWJsZWQiIHdpbGwgYm9vdCB0aGUKLQlrZXJuZWwgYXMgbm9ybWFsIChidXQgd2l0aCB0aGUga21lbWNoZWNrIGNvZGUgY29tcGlsZWQgaW4sIHNvIGl0IGNhbgotCWJlIGVuYWJsZWQgYXQgcnVuLXRpbWUgYWZ0ZXIgdGhlIGtlcm5lbCBoYXMgYm9vdGVkKSwgYW5kICJvbmUtc2hvdCIgaXMKLQlhIHNwZWNpYWwgbW9kZSB3aGljaCB3aWxsIHR1cm4ga21lbWNoZWNrIG9mZiBhdXRvbWF0aWNhbGx5IGFmdGVyCi0JZGV0ZWN0aW5nIHRoZSBmaXJzdCB1c2Ugb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuCi0KLQlJZiB5b3UgYXJlIHVzaW5nIGttZW1jaGVjayB0byBhY3RpdmVseSBkZWJ1ZyBhIHByb2JsZW0sIHRoZW4geW91Ci0JcHJvYmFibHkgd2FudCB0byBjaG9vc2UgImVuYWJsZWQiIGhlcmUuCi0KLQlUaGUgb25lLXNob3QgbW9kZSBpcyBtb3N0bHkgdXNlZnVsIGluIGF1dG9tYXRlZCB0ZXN0IHNldHVwcyBiZWNhdXNlIGl0Ci0JY2FuIHByZXZlbnQgZmxvb2RzIG9mIHdhcm5pbmdzIGFuZCBpbmNyZWFzZSB0aGUgY2hhbmNlcyBvZiB0aGUgbWFjaGluZQotCXN1cnZpdmluZyBpbiBjYXNlIHNvbWV0aGluZyBpcyByZWFsbHkgd3JvbmcuIEluIG90aGVyIGNhc2VzLCB0aGUgb25lLQotCXNob3QgbW9kZSBjb3VsZCBhY3R1YWxseSBiZSBjb3VudGVyLXByb2R1Y3RpdmUgYmVjYXVzZSBpdCB3b3VsZCB0dXJuCi0JaXRzZWxmIG9mZiBhdCB0aGUgdmVyeSBmaXJzdCBlcnJvciAtLSBpbiB0aGUgY2FzZSBvZiBhIGZhbHNlIHBvc2l0aXZlCi0JdG9vIC0tIGFuZCB0aGlzIHdvdWxkIGNvbWUgaW4gdGhlIHdheSBvZiBkZWJ1Z2dpbmcgdGhlIHNwZWNpZmljCi0JcHJvYmxlbSB5b3Ugd2VyZSBpbnRlcmVzdGVkIGluLgotCi0JSWYgeW91IHdvdWxkIGxpa2UgdG8gdXNlIHlvdXIga2VybmVsIGFzIG5vcm1hbCwgYnV0IHdpdGggYSBjaGFuY2UgdG8KLQllbmFibGUga21lbWNoZWNrIGluIGNhc2Ugb2Ygc29tZSBwcm9ibGVtLCBpdCBtaWdodCBiZSBhIGdvb2QgaWRlYSB0bwotCWNob29zZSAiZGlzYWJsZWQiIGhlcmUuIFdoZW4ga21lbWNoZWNrIGlzIGRpc2FibGVkLCBtb3N0IG9mIHRoZSBydW4tCi0JdGltZSBvdmVyaGVhZCBpcyBub3QgaW5jdXJyZWQsIGFuZCB0aGUga2VybmVsIHdpbGwgYmUgYWxtb3N0IGFzIGZhc3QKLQlhcyBub3JtYWwuCi0KLSAgbyBDT05GSUdfS01FTUNIRUNLX1FVRVVFX1NJWkUKLQotCVNlbGVjdCB0aGUgbWF4aW11bSBudW1iZXIgb2YgZXJyb3IgcmVwb3J0cyB0byBzdG9yZSBpbiBhbiBpbnRlcm5hbAotCShmaXhlZC1zaXplKSBidWZmZXIuIFNpbmNlIGVycm9ycyBjYW4gb2NjdXIgdmlydHVhbGx5IGFueXdoZXJlIGFuZCBpbgotCWFueSBjb250ZXh0LCB3ZSBuZWVkIGEgdGVtcG9yYXJ5IHN0b3JhZ2UgYXJlYSB3aGljaCBpcyBndWFyYW50ZWVkIG5vdAotCXRvIGdlbmVyYXRlIGFueSBvdGhlciBwYWdlIGZhdWx0cyB3aGVuIGFjY2Vzc2VkLiBUaGUgcXVldWUgd2lsbCBiZQotCWVtcHRpZWQgYXMgc29vbiBhcyBhIHRhc2tsZXQgbWF5IGJlIHNjaGVkdWxlZC4gSWYgdGhlIHF1ZXVlIGlzIGZ1bGwsCi0JbmV3IGVycm9yIHJlcG9ydHMgd2lsbCBiZSBsb3N0LgotCi0JVGhlIGRlZmF1bHQgdmFsdWUgb2YgNjQgaXMgcHJvYmFibHkgZmluZS4gSWYgc29tZSBjb2RlIHByb2R1Y2VzIG1vcmUKLQl0aGFuIDY0IGVycm9ycyB3aXRoaW4gYW4gaXJxcy1vZmYgc2VjdGlvbiwgdGhlbiB0aGUgY29kZSBpcyBsaWtlbHkgdG8KLQlwcm9kdWNlIG1hbnksIG1hbnkgbW9yZSwgdG9vLCBhbmQgdGhlc2UgYWRkaXRpb25hbCByZXBvcnRzIHNlbGRvbSBnaXZlCi0JYW55IG1vcmUgaW5mb3JtYXRpb24gKHRoZSBmaXJzdCByZXBvcnQgaXMgdXN1YWxseSB0aGUgbW9zdCB2YWx1YWJsZQotCWFueXdheSkuCi0KLQlUaGlzIG51bWJlciBtaWdodCBoYXZlIHRvIGJlIGFkanVzdGVkIGlmIHlvdSBhcmUgbm90IHVzaW5nIHNlcmlhbAotCWNvbnNvbGUgb3Igc2ltaWxhciB0byBjYXB0dXJlIHRoZSBrZXJuZWwgbG9nLiBJZiB5b3UgYXJlIHVzaW5nIHRoZQotCSJkbWVzZyIgY29tbWFuZCB0byBzYXZlIHRoZSBsb2csIHRoZW4gZ2V0dGluZyBhIGxvdCBvZiBrbWVtY2hlY2sKLQl3YXJuaW5ncyBtaWdodCBvdmVyZmxvdyB0aGUga2VybmVsIGxvZyBpdHNlbGYsIGFuZCB0aGUgZWFybGllciByZXBvcnRzCi0Jd2lsbCBnZXQgbG9zdCBpbiB0aGF0IHdheSBpbnN0ZWFkLiBUcnkgc2V0dGluZyB0aGlzIHRvIDEwIG9yIHNvIG9uCi0Jc3VjaCBhIHNldHVwLgotCi0gIG8gQ09ORklHX0tNRU1DSEVDS19TSEFET1dfQ09QWV9TSElGVAotCi0JU2VsZWN0IHRoZSBudW1iZXIgb2Ygc2hhZG93IGJ5dGVzIHRvIHNhdmUgYWxvbmcgd2l0aCBlYWNoIGVudHJ5IG9mIHRoZQotCWVycm9yLXJlcG9ydCBxdWV1ZS4gVGhlc2UgYnl0ZXMgaW5kaWNhdGUgd2hhdCBwYXJ0cyBvZiBhbiBhbGxvY2F0aW9uCi0JYXJlIGluaXRpYWxpemVkLCB1bmluaXRpYWxpemVkLCBldGMuIGFuZCB3aWxsIGJlIGRpc3BsYXllZCB3aGVuIGFuCi0JZXJyb3IgaXMgZGV0ZWN0ZWQgdG8gaGVscCB0aGUgZGVidWdnaW5nIG9mIGEgcGFydGljdWxhciBwcm9ibGVtLgotCi0JVGhlIG51bWJlciBlbnRlcmVkIGhlcmUgaXMgYWN0dWFsbHkgdGhlIGxvZ2FyaXRobSBvZiB0aGUgbnVtYmVyIG9mCi0JYnl0ZXMgdGhhdCB3aWxsIGJlIHNhdmVkLiBTbyBpZiB5b3UgcGljayBmb3IgZXhhbXBsZSA1IGhlcmUsIGttZW1jaGVjawotCXdpbGwgc2F2ZSAyXjUgPSAzMiBieXRlcy4KLQotCVRoZSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZSBmaW5lIGZvciBkZWJ1Z2dpbmcgbW9zdCBwcm9ibGVtcy4gSXQgYWxzbwotCWZpdHMgbmljZWx5IHdpdGhpbiA4MCBjb2x1bW5zLgotCi0gIG8gQ09ORklHX0tNRU1DSEVDS19QQVJUSUFMX09LCi0KLQlUaGlzIG9wdGlvbiAod2hlbiBlbmFibGVkKSB3b3JrcyBhcm91bmQgY2VydGFpbiBHQ0Mgb3B0aW1pemF0aW9ucyB0aGF0Ci0JcHJvZHVjZSAzMi1iaXQgcmVhZHMgZnJvbSAxNi1iaXQgdmFyaWFibGVzIHdoZXJlIHRoZSB1cHBlciAxNiBiaXRzIGFyZQotCXRocm93biBhd2F5IGFmdGVyd2FyZHMuCi0KLQlUaGUgZGVmYXVsdCB2YWx1ZSAoZW5hYmxlZCkgaXMgcmVjb21tZW5kZWQuIFRoaXMgbWF5IG9mIGNvdXJzZSBoaWRlCi0Jc29tZSByZWFsIGVycm9ycywgYnV0IGRpc2FibGluZyBpdCB3b3VsZCBwcm9iYWJseSBwcm9kdWNlIGEgbG90IG9mCi0JZmFsc2UgcG9zaXRpdmVzLgotCi0gIG8gQ09ORklHX0tNRU1DSEVDS19CSVRPUFNfT0sKLQotCVRoaXMgb3B0aW9uIHNpbGVuY2VzIHdhcm5pbmdzIHRoYXQgd291bGQgYmUgZ2VuZXJhdGVkIGZvciBiaXQtZmllbGQKLQlhY2Nlc3NlcyB3aGVyZSBub3QgYWxsIHRoZSBiaXRzIGFyZSBpbml0aWFsaXplZCBhdCB0aGUgc2FtZSB0aW1lLiBUaGlzCi0JbWF5IGFsc28gaGlkZSBzb21lIHJlYWwgYnVncy4KLQotCVRoaXMgb3B0aW9uIGlzIHByb2JhYmx5IG9ic29sZXRlLCBvciBpdCBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aAotCXRoZSBrbWVtY2hlY2stL2JpdGZpZWxkLWFubm90YXRpb25zIGZvciB0aGUgY29kZSBpbiBxdWVzdGlvbi4gVGhlCi0JZGVmYXVsdCB2YWx1ZSBpcyB0aGVyZWZvcmUgZmluZS4KLQotTm93IGNvbXBpbGUgdGhlIGtlcm5lbCBhcyB1c3VhbC4KLQotCi0zLiBIb3cgdG8gdXNlCi09PT09PT09PT09PT09Ci0KLTMuMS4gQm9vdGluZwotPT09PT09PT09PT09Ci0KLUZpcnN0IHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbW1hbmQtbGluZSBvcHRpb25zLiBUaGVyZSBpcyBvbmx5IG9uZQotb3B0aW9uIHNwZWNpZmljIHRvIGttZW1jaGVjaywgYW5kIHRoaXMgaXMgY2FsbGVkICJrbWVtY2hlY2siLiBJdCBjYW4gYmUgdXNlZAotdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgbW9kZSBhcyBjaG9zZW4gYnkgdGhlIENPTkZJR19LTUVNQ0hFQ0tfKl9CWV9ERUZBVUxUCi1vcHRpb24uIEl0cyBwb3NzaWJsZSBzZXR0aW5ncyBhcmU6Ci0KLSAgbyBrbWVtY2hlY2s9MCAoZGlzYWJsZWQpCi0gIG8ga21lbWNoZWNrPTEgKGVuYWJsZWQpCi0gIG8ga21lbWNoZWNrPTIgKG9uZS1zaG90IG1vZGUpCi0KLUlmIFNMVUIgZGVidWdnaW5nIGhhcyBiZWVuIGVuYWJsZWQgaW4gdGhlIGtlcm5lbCwgaXQgbWF5IHRha2UgcHJlY2VkZW5jZSBvdmVyCi1rbWVtY2hlY2sgaW4gc3VjaCBhIHdheSB0aGF0IHRoZSBzbGFiIGNhY2hlcyB3aGljaCBhcmUgdW5kZXIgU0xVQiBkZWJ1Z2dpbmcKLXdpbGwgbm90IGJlIHRyYWNrZWQgYnkga21lbWNoZWNrLiBJbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGlzIGRvZXNuJ3QgaGFwcGVuCi0oZXZlbiB0aG91Z2ggaXQgc2hvdWxkbid0IGJ5IGRlZmF1bHQpLCB1c2UgU0xVQidzIGJvb3Qgb3B0aW9uICJzbHViX2RlYnVnIiwKLWxpa2UgdGhpczogc2x1Yl9kZWJ1Zz0tCi0KLUluIGZhY3QsIHRoaXMgb3B0aW9uIG1heSBhbHNvIGJlIHVzZWQgZm9yIGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgU0xVQiB2cy4KLWttZW1jaGVjay4gRm9yIGV4YW1wbGUsIGlmIHRoZSBjb21tYW5kIGxpbmUgaW5jbHVkZXMgImttZW1jaGVjaz0xCi1zbHViX2RlYnVnPSxkZW50cnkiLCB0aGVuIFNMVUIgZGVidWdnaW5nIHdpbGwgYmUgdXNlZCBvbmx5IGZvciB0aGUgImRlbnRyeSIKLXNsYWIgY2FjaGUsIGFuZCB3aXRoIGttZW1jaGVjayB0cmFja2luZyBhbGwgdGhlIG90aGVyIGNhY2hlcy4gVGhpcyBpcyBhZHZhbmNlZAotdXNhZ2UsIGhvd2V2ZXIsIGFuZCBpcyBub3QgZ2VuZXJhbGx5IHJlY29tbWVuZGVkLgotCi0KLTMuMi4gUnVuLXRpbWUgZW5hYmxlL2Rpc2FibGUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotV2hlbiB0aGUga2VybmVsIGhhcyBib290ZWQsIGl0IGlzIHBvc3NpYmxlIHRvIGVuYWJsZSBvciBkaXNhYmxlIGttZW1jaGVjayBhdAotcnVuLXRpbWUuIFdBUk5JTkc6IFRoaXMgZmVhdHVyZSBpcyBzdGlsbCBleHBlcmltZW50YWwgYW5kIG1heSBjYXVzZSBmYWxzZQotcG9zaXRpdmUgd2FybmluZ3MgdG8gYXBwZWFyLiBUaGVyZWZvcmUsIHRyeSBub3QgdG8gdXNlIHRoaXMuIElmIHlvdSBmaW5kIHRoYXQKLWl0IGRvZXNuJ3Qgd29yayBwcm9wZXJseSAoZS5nLiB5b3Ugc2VlIGFuIHVucmVhc29uYWJsZSBhbW91bnQgb2Ygd2FybmluZ3MpLCBJCi13aWxsIGJlIGhhcHB5IHRvIHRha2UgYnVnIHJlcG9ydHMuCi0KLVVzZSB0aGUgZmlsZSAvcHJvYy9zeXMva2VybmVsL2ttZW1jaGVjayBmb3IgdGhpcyBwdXJwb3NlLCBlLmcuOgotCi0JJCBlY2hvIDAgPiAvcHJvYy9zeXMva2VybmVsL2ttZW1jaGVjayAjIGRpc2FibGVzIGttZW1jaGVjawotCi1UaGUgbnVtYmVycyBhcmUgdGhlIHNhbWUgYXMgZm9yIHRoZSBrbWVtY2hlY2s9IGNvbW1hbmQtbGluZSBvcHRpb24uCi0KLQotMy4zLiBEZWJ1Z2dpbmcKLT09PT09PT09PT09PT09Ci0KLUEgdHlwaWNhbCByZXBvcnQgd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0KLVdBUk5JTkc6IGttZW1jaGVjazogQ2F1Z2h0IDMyLWJpdCByZWFkIGZyb20gdW5pbml0aWFsaXplZCBtZW1vcnkgKGZmZmY4ODAwM2U0YTIwMjQpCi04MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4OGZmZmYwMDAwMDAwMDAwMDAwMDAwCi0gaSBpIGkgaSB1IHUgdSB1IGkgaSBpIGkgaSBpIGkgaSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1Ci0gICAgICAgICBeCi0KLVBpZDogMTg1NiwgY29tbTogbnRwZGF0ZSBOb3QgdGFpbnRlZCAyLjYuMjktcmM1ICMyNjQgOTQ1UC1BCi1SSVA6IDAwMTA6WzxmZmZmZmZmZjgxMDRlZGU4Pl0gIFs8ZmZmZmZmZmY4MTA0ZWRlOD5dIF9fZGVxdWV1ZV9zaWduYWwrMHhjOC8weDE5MAotUlNQOiAwMDE4OmZmZmY4ODAwM2NkZjdkOTggIEVGTEFHUzogMDAyMTAwMDIKLVJBWDogMDAwMDAwMDAwMDAwMDAzMCBSQlg6IGZmZmY4ODAwM2Q0ZWE5NjggUkNYOiAwMDAwMDAwMDAwMDAwMDA5Ci1SRFg6IGZmZmY4ODAwM2U1ZDYwMTggUlNJOiBmZmZmODgwMDNlNWQ2MDI0IFJESTogZmZmZjg4MDAzY2RmN2U4NAotUkJQOiBmZmZmODgwMDNjZGY3ZGI4IFIwODogZmZmZjg4MDAzZTVkNjAwMCBSMDk6IDAwMDAwMDAwMDAwMDAwMDAKLVIxMDogMDAwMDAwMDAwMDAwMDA4MCBSMTE6IDAwMDAwMDAwMDAwMDAwMDAgUjEyOiAwMDAwMDAwMDAwMDAwMDBlCi1SMTM6IGZmZmY4ODAwM2NkZjdlNzggUjE0OiBmZmZmODgwMDNkNTMwNzEwIFIxNTogZmZmZjg4MDAzZDVhOThjOAotRlM6ICAwMDAwMDAwMDAwMDAwMDAwKDAwMDApIEdTOmZmZmY4ODAwMDE5ODIwMDAoMDA2Mykga25sR1M6MDAwMDAKLUNTOiAgMDAxMCBEUzogMDAyYiBFUzogMDAyYiBDUjA6IDAwMDAwMDAwODAwNTAwMzMKLUNSMjogZmZmZjg4MDAzZjgwNmVhMCBDUjM6IDAwMDAwMDAwM2MwMzYwMDAgQ1I0OiAwMDAwMDAwMDAwMDAwNmEwCi1EUjA6IDAwMDAwMDAwMDAwMDAwMDAgRFIxOiAwMDAwMDAwMDAwMDAwMDAwIERSMjogMDAwMDAwMDAwMDAwMDAwMAotRFIzOiAwMDAwMDAwMDAwMDAwMDAwIERSNjogMDAwMDAwMDBmZmZmNGZmMCBEUjc6IDAwMDAwMDAwMDAwMDA0MDAKLSBbPGZmZmZmZmZmODEwNGYwNGU+XSBkZXF1ZXVlX3NpZ25hbCsweDhlLzB4MTcwCi0gWzxmZmZmZmZmZjgxMDUwYmQ4Pl0gZ2V0X3NpZ25hbF90b19kZWxpdmVyKzB4OTgvMHgzOTAKLSBbPGZmZmZmZmZmODEwMGI4N2Q+XSBkb19ub3RpZnlfcmVzdW1lKzB4YWQvMHg3ZDAKLSBbPGZmZmZmZmZmODEwMGM3YjU+XSBpbnRfc2lnbmFsKzB4MTIvMHgxNwotIFs8ZmZmZmZmZmZmZmZmZmZmZj5dIDB4ZmZmZmZmZmZmZmZmZmZmZgotCi1UaGUgc2luZ2xlIG1vc3QgdmFsdWFibGUgaW5mb3JtYXRpb24gaW4gdGhpcyByZXBvcnQgaXMgdGhlIFJJUCAob3IgRUlQIG9uIDMyLQotYml0KSB2YWx1ZS4gVGhpcyB3aWxsIGhlbHAgdXMgcGlucG9pbnQgZXhhY3RseSB3aGljaCBpbnN0cnVjdGlvbiB0aGF0IGNhdXNlZAotdGhlIHdhcm5pbmcuCi0KLUlmIHlvdXIga2VybmVsIHdhcyBjb21waWxlZCB3aXRoIENPTkZJR19ERUJVR19JTkZPPXksIHRoZW4gYWxsIHdlIGhhdmUgdG8gZG8KLWlzIGdpdmUgdGhpcyBhZGRyZXNzIHRvIHRoZSBhZGRyMmxpbmUgcHJvZ3JhbSwgbGlrZSB0aGlzOgotCi0JJCBhZGRyMmxpbmUgLWUgdm1saW51eCAtaSBmZmZmZmZmZjgxMDRlZGU4Ci0JYXJjaC94ODYvaW5jbHVkZS9hc20vc3RyaW5nXzY0Lmg6MTIKLQlpbmNsdWRlL2FzbS1nZW5lcmljL3NpZ2luZm8uaDoyODcKLQlrZXJuZWwvc2lnbmFsLmM6MzgwCi0Ja2VybmVsL3NpZ25hbC5jOjQxMAotCi1UaGUgIi1lIHZtbGludXgiIHRlbGxzIGFkZHIybGluZSB3aGljaCBmaWxlIHRvIGxvb2sgaW4uIElNUE9SVEFOVDogVGhpcyBtdXN0Ci1iZSB0aGUgdm1saW51eCBvZiB0aGUga2VybmVsIHRoYXQgcHJvZHVjZWQgdGhlIHdhcm5pbmcgaW4gdGhlIGZpcnN0IHBsYWNlISBJZgotbm90LCB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIHdyb25nLgotCi1UaGUgIi1pIiB0ZWxscyBhZGRyMmxpbmUgdG8gYWxzbyBwcmludCB0aGUgbGluZSBudW1iZXJzIG9mIGlubGluZWQgZnVuY3Rpb25zLgotSW4gdGhpcyBjYXNlLCB0aGUgZmxhZyB3YXMgdmVyeSBpbXBvcnRhbnQsIGJlY2F1c2Ugb3RoZXJ3aXNlLCBpdCB3b3VsZCBvbmx5Ci1oYXZlIHByaW50ZWQgdGhlIGZpcnN0IGxpbmUsIHdoaWNoIGlzIGp1c3QgYSBjYWxsIHRvIG1lbWNweSgpLCB3aGljaCBjb3VsZCBiZQotY2FsbGVkIGZyb20gYSB0aG91c2FuZCBwbGFjZXMgaW4gdGhlIGtlcm5lbCwgYW5kIGlzIHRoZXJlZm9yZSBub3QgdmVyeSB1c2VmdWwuCi1UaGVzZSBpbmxpbmVkIGZ1bmN0aW9ucyB3b3VsZCBub3Qgc2hvdyB1cCBpbiB0aGUgc3RhY2sgdHJhY2UgYWJvdmUsIHNpbXBseQotYmVjYXVzZSB0aGUga2VybmVsIGRvZXNuJ3QgbG9hZCB0aGUgZXh0cmEgZGVidWdnaW5nIGluZm9ybWF0aW9uLiBUaGlzCi10ZWNobmlxdWUgY2FuIG9mIGNvdXJzZSBiZSB1c2VkIHdpdGggb3JkaW5hcnkga2VybmVsIG9vcHNlcyBhcyB3ZWxsLgotCi1JbiB0aGlzIGNhc2UsIGl0J3MgdGhlIGNhbGxlciBvZiBtZW1jcHkoKSB0aGF0IGlzIGludGVyZXN0aW5nLCBhbmQgaXQgY2FuIGJlCi1mb3VuZCBpbiBpbmNsdWRlL2FzbS1nZW5lcmljL3NpZ2luZm8uaCwgbGluZSAyODc6Ci0KLTI4MSBzdGF0aWMgaW5saW5lIHZvaWQgY29weV9zaWdpbmZvKHN0cnVjdCBzaWdpbmZvICp0bywgc3RydWN0IHNpZ2luZm8gKmZyb20pCi0yODIgewotMjgzICAgICAgICAgaWYgKGZyb20tPnNpX2NvZGUgPCAwKQotMjg0ICAgICAgICAgICAgICAgICBtZW1jcHkodG8sIGZyb20sIHNpemVvZigqdG8pKTsKLTI4NSAgICAgICAgIGVsc2UKLTI4NiAgICAgICAgICAgICAgICAgLyogX3NpZ2NobGQgaXMgY3VycmVudGx5IHRoZSBsYXJnZXN0IGtub3cgdW5pb24gbWVtYmVyICovCi0yODcgICAgICAgICAgICAgICAgIG1lbWNweSh0bywgZnJvbSwgX19BUkNIX1NJX1BSRUFNQkxFX1NJWkUgKyBzaXplb2YoZnJvbS0+X3NpZmllbGRzLl9zaWdjaGxkKSk7Ci0yODggfQotCi1TaW5jZSB0aGlzIHdhcyBhIHJlYWQgKGttZW1jaGVjayB1c3VhbGx5IHdhcm5zIGFib3V0IHJlYWRzIG9ubHksIHRob3VnaCBpdCBjYW4KLXdhcm4gYWJvdXQgd3JpdGVzIHRvIHVuYWxsb2NhdGVkIG9yIGZyZWVkIG1lbW9yeSBhcyB3ZWxsKSwgaXQgd2FzIHByb2JhYmx5IHRoZQotImZyb20iIGFyZ3VtZW50IHdoaWNoIGNvbnRhaW5lZCBzb21lIHVuaW5pdGlhbGl6ZWQgYnl0ZXMuIEZvbGxvd2luZyB0aGUgY2hhaW4KLW9mIGNhbGxzLCB3ZSBtb3ZlIHVwd2FyZHMgdG8gc2VlIHdoZXJlICJmcm9tIiB3YXMgYWxsb2NhdGVkIG9yIGluaXRpYWxpemVkLAota2VybmVsL3NpZ25hbC5jLCBsaW5lIDM4MDoKLQotMzU5IHN0YXRpYyB2b2lkIGNvbGxlY3Rfc2lnbmFsKGludCBzaWcsIHN0cnVjdCBzaWdwZW5kaW5nICpsaXN0LCBzaWdpbmZvX3QgKmluZm8pCi0zNjAgewotLi4uCi0zNjcgICAgICAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5KHEsICZsaXN0LT5saXN0LCBsaXN0KSB7Ci0zNjggICAgICAgICAgICAgICAgIGlmIChxLT5pbmZvLnNpX3NpZ25vID09IHNpZykgewotMzY5ICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKLTM3MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gc3RpbGxfcGVuZGluZzsKLTM3MSAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IHE7Ci0uLi4KLTM3NyAgICAgICAgIGlmIChmaXJzdCkgewotMzc4IHN0aWxsX3BlbmRpbmc6Ci0zNzkgICAgICAgICAgICAgICAgIGxpc3RfZGVsX2luaXQoJmZpcnN0LT5saXN0KTsKLTM4MCAgICAgICAgICAgICAgICAgY29weV9zaWdpbmZvKGluZm8sICZmaXJzdC0+aW5mbyk7Ci0zODEgICAgICAgICAgICAgICAgIF9fc2lncXVldWVfZnJlZShmaXJzdCk7Ci0uLi4KLTM5MiAgICAgICAgIH0KLTM5MyB9Ci0KLUhlcmUsIGl0IGlzICZmaXJzdC0+aW5mbyB0aGF0IGlzIGJlaW5nIHBhc3NlZCBvbiB0byBjb3B5X3NpZ2luZm8oKS4gVGhlCi12YXJpYWJsZSAiZmlyc3QiIHdhcyBmb3VuZCBvbiBhIGxpc3QgLS0gcGFzc2VkIGluIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8KLWNvbGxlY3Rfc2lnbmFsKCkuIFdlICBjb250aW51ZSBvdXIgam91cm5leSB0aHJvdWdoIHRoZSBzdGFjaywgdG8gZmlndXJlIG91dAotd2hlcmUgdGhlIGl0ZW0gb24gImxpc3QiIHdhcyBhbGxvY2F0ZWQgb3IgaW5pdGlhbGl6ZWQuIFdlIG1vdmUgdG8gbGluZSA0MTA6Ci0KLTM5NSBzdGF0aWMgaW50IF9fZGVxdWV1ZV9zaWduYWwoc3RydWN0IHNpZ3BlbmRpbmcgKnBlbmRpbmcsIHNpZ3NldF90ICptYXNrLAotMzk2ICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ2luZm9fdCAqaW5mbykKLTM5NyB7Ci0uLi4KLTQxMCAgICAgICAgICAgICAgICAgY29sbGVjdF9zaWduYWwoc2lnLCBwZW5kaW5nLCBpbmZvKTsKLS4uLgotNDE0IH0KLQotTm93IHdlIG5lZWQgdG8gZm9sbG93IHRoZSAicGVuZGluZyIgcG9pbnRlciwgc2luY2UgdGhhdCBpcyBiZWluZyBwYXNzZWQgb24gdG8KLWNvbGxlY3Rfc2lnbmFsKCkgYXMgImxpc3QiLiBBdCB0aGlzIHBvaW50LCB3ZSd2ZSBydW4gb3V0IG9mIGxpbmVzIGZyb20gdGhlCi0iYWRkcjJsaW5lIiBvdXRwdXQuIE5vdCB0byB3b3JyeSwgd2UganVzdCBwYXN0ZSB0aGUgbmV4dCBhZGRyZXNzZXMgZnJvbSB0aGUKLWttZW1jaGVjayBzdGFjayBkdW1wLCBpLmUuOgotCi0gWzxmZmZmZmZmZjgxMDRmMDRlPl0gZGVxdWV1ZV9zaWduYWwrMHg4ZS8weDE3MAotIFs8ZmZmZmZmZmY4MTA1MGJkOD5dIGdldF9zaWduYWxfdG9fZGVsaXZlcisweDk4LzB4MzkwCi0gWzxmZmZmZmZmZjgxMDBiODdkPl0gZG9fbm90aWZ5X3Jlc3VtZSsweGFkLzB4N2QwCi0gWzxmZmZmZmZmZjgxMDBjN2I1Pl0gaW50X3NpZ25hbCsweDEyLzB4MTcKLQotCSQgYWRkcjJsaW5lIC1lIHZtbGludXggLWkgZmZmZmZmZmY4MTA0ZjA0ZSBmZmZmZmZmZjgxMDUwYmQ4IFwKLQkJZmZmZmZmZmY4MTAwYjg3ZCBmZmZmZmZmZjgxMDBjN2I1Ci0Ja2VybmVsL3NpZ25hbC5jOjQ0NgotCWtlcm5lbC9zaWduYWwuYzoxODA2Ci0JYXJjaC94ODYva2VybmVsL3NpZ25hbC5jOjgwNQotCWFyY2gveDg2L2tlcm5lbC9zaWduYWwuYzo4NzEKLQlhcmNoL3g4Ni9rZXJuZWwvZW50cnlfNjQuUzo2OTQKLQotUmVtZW1iZXIgdGhhdCBzaW5jZSB0aGVzZSBhZGRyZXNzZXMgd2VyZSBmb3VuZCBvbiB0aGUgc3RhY2sgYW5kIG5vdCBhcyB0aGUKLVJJUCB2YWx1ZSwgdGhleSBhY3R1YWxseSBwb2ludCB0byB0aGUgX25leHRfIGluc3RydWN0aW9uICh0aGV5IGFyZSByZXR1cm4KLWFkZHJlc3NlcykuIFRoaXMgYmVjb21lcyBvYnZpb3VzIHdoZW4gd2UgbG9vayBhdCB0aGUgY29kZSBmb3IgbGluZSA0NDY6Ci0KLTQyMiBpbnQgZGVxdWV1ZV9zaWduYWwoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHNpZ3NldF90ICptYXNrLCBzaWdpbmZvX3QgKmluZm8pCi00MjMgewotLi4uCi00MzEgICAgICAgICAgICAgICAgIHNpZ25yID0gX19kZXF1ZXVlX3NpZ25hbCgmdHNrLT5zaWduYWwtPnNoYXJlZF9wZW5kaW5nLAotNDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzaywgaW5mbyk7Ci00MzMgICAgICAgICAgICAgICAgIC8qCi00MzQgICAgICAgICAgICAgICAgICAqIGl0aW1lciBzaWduYWwgPwotNDM1ICAgICAgICAgICAgICAgICAgKgotNDM2ICAgICAgICAgICAgICAgICAgKiBpdGltZXJzIGFyZSBwcm9jZXNzIHNoYXJlZCBhbmQgd2UgcmVzdGFydCBwZXJpb2RpYwotNDM3ICAgICAgICAgICAgICAgICAgKiBpdGltZXJzIGluIHRoZSBzaWduYWwgZGVsaXZlcnkgcGF0aCB0byBwcmV2ZW50IERvUwotNDM4ICAgICAgICAgICAgICAgICAgKiBhdHRhY2tzIGluIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIgY2FzZS4gVGhpcyBpcwotNDM5ICAgICAgICAgICAgICAgICAgKiBjb21wbGlhbnQgd2l0aCB0aGUgb2xkIHdheSBvZiBzZWxmIHJlc3RhcnRpbmcKLTQ0MCAgICAgICAgICAgICAgICAgICogaXRpbWVycywgYXMgdGhlIFNJR0FMUk0gaXMgYSBsZWdhY3kgc2lnbmFsIGFuZCBvbmx5Ci00NDEgICAgICAgICAgICAgICAgICAqIHF1ZXVlZCBvbmNlLiBDaGFuZ2luZyB0aGUgcmVzdGFydCBiZWhhdmlvdXIgdG8KLTQ0MiAgICAgICAgICAgICAgICAgICogcmVzdGFydCB0aGUgdGltZXIgaW4gdGhlIHNpZ25hbCBkZXF1ZXVlIHBhdGggaXMKLTQ0MyAgICAgICAgICAgICAgICAgICogcmVkdWNpbmcgdGhlIHRpbWVyIG5vaXNlIG9uIGhlYXZ5IGxvYWRlZCAhaGlnaHJlcwotNDQ0ICAgICAgICAgICAgICAgICAgKiBzeXN0ZW1zIHRvby4KLTQ0NSAgICAgICAgICAgICAgICAgICovCi00NDYgICAgICAgICAgICAgICAgIGlmICh1bmxpa2VseShzaWduciA9PSBTSUdBTFJNKSkgewotLi4uCi00ODkgfQotCi1TbyBpbnN0ZWFkIG9mIGxvb2tpbmcgYXQgNDQ2LCB3ZSBzaG91bGQgYmUgbG9va2luZyBhdCA0MzEsIHdoaWNoIGlzIHRoZSBsaW5lCi10aGF0IGV4ZWN1dGVzIGp1c3QgYmVmb3JlIDQ0Ni4gSGVyZSB3ZSBzZWUgdGhhdCB3aGF0IHdlIGFyZSBsb29raW5nIGZvciBpcwotJnRzay0+c2lnbmFsLT5zaGFyZWRfcGVuZGluZy4KLQotT3VyIG5leHQgdGFzayBpcyBub3cgdG8gZmlndXJlIG91dCB3aGljaCBmdW5jdGlvbiB0aGF0IHB1dHMgaXRlbXMgb24gdGhpcwotInNoYXJlZF9wZW5kaW5nIiBsaXN0LiBBIGNydWRlLCBidXQgZWZmaWNpZW50IHRvb2wsIGlzIGdpdCBncmVwOgotCi0JJCBnaXQgZ3JlcCAtbiAnc2hhcmVkX3BlbmRpbmcnIGtlcm5lbC8KLQkuLi4KLQlrZXJuZWwvc2lnbmFsLmM6ODI4OiAgICBwZW5kaW5nID0gZ3JvdXAgPyAmdC0+c2lnbmFsLT5zaGFyZWRfcGVuZGluZyA6ICZ0LT5wZW5kaW5nOwotCWtlcm5lbC9zaWduYWwuYzoxMzM5OiAgIHBlbmRpbmcgPSBncm91cCA/ICZ0LT5zaWduYWwtPnNoYXJlZF9wZW5kaW5nIDogJnQtPnBlbmRpbmc7Ci0JLi4uCi0KLVRoZXJlIHdlcmUgbW9yZSByZXN1bHRzLCBidXQgbm9uZSBvZiB0aGVtIHdlcmUgcmVsYXRlZCB0byBsaXN0IG9wZXJhdGlvbnMsCi1hbmQgdGhlc2Ugd2VyZSB0aGUgb25seSBhc3NpZ25tZW50cy4gV2UgaW5zcGVjdCB0aGUgbGluZSBudW1iZXJzIG1vcmUgY2xvc2VseQotYW5kIGZpbmQgdGhhdCB0aGlzIGlzIGluZGVlZCB3aGVyZSBpdGVtcyBhcmUgYmVpbmcgYWRkZWQgdG8gdGhlIGxpc3Q6Ci0KLTgxNiBzdGF0aWMgaW50IHNlbmRfc2lnbmFsKGludCBzaWcsIHN0cnVjdCBzaWdpbmZvICppbmZvLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsCi04MTcgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyb3VwKQotODE4IHsKLS4uLgotODI4ICAgICAgICAgcGVuZGluZyA9IGdyb3VwID8gJnQtPnNpZ25hbC0+c2hhcmVkX3BlbmRpbmcgOiAmdC0+cGVuZGluZzsKLS4uLgotODUxICAgICAgICAgcSA9IF9fc2lncXVldWVfYWxsb2ModCwgR0ZQX0FUT01JQywgKHNpZyA8IFNJR1JUTUlOICYmCi04NTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzX3NpX3NwZWNpYWwoaW5mbykgfHwKLTg1MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2lfY29kZSA+PSAwKSkpOwotODU0ICAgICAgICAgaWYgKHEpIHsKLTg1NSAgICAgICAgICAgICAgICAgbGlzdF9hZGRfdGFpbCgmcS0+bGlzdCwgJnBlbmRpbmctPmxpc3QpOwotLi4uCi04OTAgfQotCi1hbmQ6Ci0KLTEzMDkgaW50IHNlbmRfc2lncXVldWUoc3RydWN0IHNpZ3F1ZXVlICpxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsIGludCBncm91cCkKLTEzMTAgewotLi4uLgotMTMzOSAgICAgICAgIHBlbmRpbmcgPSBncm91cCA/ICZ0LT5zaWduYWwtPnNoYXJlZF9wZW5kaW5nIDogJnQtPnBlbmRpbmc7Ci0xMzQwICAgICAgICAgbGlzdF9hZGRfdGFpbCgmcS0+bGlzdCwgJnBlbmRpbmctPmxpc3QpOwotLi4uLgotMTM0NyB9Ci0KLUluIHRoZSBmaXJzdCBjYXNlLCB0aGUgbGlzdCBlbGVtZW50IHdlIGFyZSBsb29raW5nIGZvciwgInEiLCBpcyBiZWluZyByZXR1cm5lZAotZnJvbSB0aGUgZnVuY3Rpb24gX19zaWdxdWV1ZV9hbGxvYygpLCB3aGljaCBsb29rcyBsaWtlIGFuIGFsbG9jYXRpb24gZnVuY3Rpb24uCi1MZXQncyB0YWtlIGEgbG9vayBhdCBpdDoKLQotMTg3IHN0YXRpYyBzdHJ1Y3Qgc2lncXVldWUgKl9fc2lncXVldWVfYWxsb2Moc3RydWN0IHRhc2tfc3RydWN0ICp0LCBnZnBfdCBmbGFncywKLTE4OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdmVycmlkZV9ybGltaXQpCi0xODkgewotMTkwICAgICAgICAgc3RydWN0IHNpZ3F1ZXVlICpxID0gTlVMTDsKLTE5MSAgICAgICAgIHN0cnVjdCB1c2VyX3N0cnVjdCAqdXNlcjsKLTE5MiAKLTE5MyAgICAgICAgIC8qCi0xOTQgICAgICAgICAgKiBXZSB3b24ndCBnZXQgcHJvYmxlbXMgd2l0aCB0aGUgdGFyZ2V0J3MgVUlEIGNoYW5naW5nIHVuZGVyIHVzCi0xOTUgICAgICAgICAgKiBiZWNhdXNlIGNoYW5naW5nIGl0IHJlcXVpcmVzIFJDVSBiZSB1c2VkLCBhbmQgaWYgdCAhPSBjdXJyZW50LCB0aGUKLTE5NiAgICAgICAgICAqIGNhbGxlciBtdXN0IGJlIGhvbGRpbmcgdGhlIFJDVSByZWFkbG9jayAoYnkgd2F5IG9mIGEgc3BpbmxvY2spIGFuZAotMTk3ICAgICAgICAgICogd2UgdXNlIFJDVSBwcm90ZWN0aW9uIGhlcmUKLTE5OCAgICAgICAgICAqLwotMTk5ICAgICAgICAgdXNlciA9IGdldF91aWQoX190YXNrX2NyZWQodCktPnVzZXIpOwotMjAwICAgICAgICAgYXRvbWljX2luYygmdXNlci0+c2lncGVuZGluZyk7Ci0yMDEgICAgICAgICBpZiAob3ZlcnJpZGVfcmxpbWl0IHx8Ci0yMDIgICAgICAgICAgICAgYXRvbWljX3JlYWQoJnVzZXItPnNpZ3BlbmRpbmcpIDw9Ci0yMDMgICAgICAgICAgICAgICAgICAgICAgICAgdC0+c2lnbmFsLT5ybGltW1JMSU1JVF9TSUdQRU5ESU5HXS5ybGltX2N1cikKLTIwNCAgICAgICAgICAgICAgICAgcSA9IGttZW1fY2FjaGVfYWxsb2Moc2lncXVldWVfY2FjaGVwLCBmbGFncyk7Ci0yMDUgICAgICAgICBpZiAodW5saWtlbHkocSA9PSBOVUxMKSkgewotMjA2ICAgICAgICAgICAgICAgICBhdG9taWNfZGVjKCZ1c2VyLT5zaWdwZW5kaW5nKTsKLTIwNyAgICAgICAgICAgICAgICAgZnJlZV91aWQodXNlcik7Ci0yMDggICAgICAgICB9IGVsc2UgewotMjA5ICAgICAgICAgICAgICAgICBJTklUX0xJU1RfSEVBRCgmcS0+bGlzdCk7Ci0yMTAgICAgICAgICAgICAgICAgIHEtPmZsYWdzID0gMDsKLTIxMSAgICAgICAgICAgICAgICAgcS0+dXNlciA9IHVzZXI7Ci0yMTIgICAgICAgICB9Ci0yMTMgCi0yMTQgICAgICAgICByZXR1cm4gcTsKLTIxNSB9Ci0KLVdlIHNlZSB0aGF0IHRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgcS0+bGlzdCwgcS0+ZmxhZ3MsIGFuZCBxLT51c2VyLiBJdCBzZWVtcwotdGhhdCBub3cgaXMgdGhlIHRpbWUgdG8gbG9vayBhdCB0aGUgZGVmaW5pdGlvbiBvZiAic3RydWN0IHNpZ3F1ZXVlIiwgZS5nLjoKLQotMTQgc3RydWN0IHNpZ3F1ZXVlIHsKLTE1ICAgICAgICAgc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotMTYgICAgICAgICBpbnQgZmxhZ3M7Ci0xNyAgICAgICAgIHNpZ2luZm9fdCBpbmZvOwotMTggICAgICAgICBzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKnVzZXI7Ci0xOSB9OwotCi1BbmQsIHlvdSBtaWdodCByZW1lbWJlciwgaXQgd2FzIGEgbWVtY3B5KCkgb24gJmZpcnN0LT5pbmZvIHRoYXQgY2F1c2VkIHRoZQotd2FybmluZywgc28gdGhpcyBtYWtlcyBwZXJmZWN0IHNlbnNlLiBJdCBhbHNvIHNlZW1zIHJlYXNvbmFibGUgdG8gYXNzdW1lIHRoYXQKLWl0IGlzIHRoZSBjYWxsZXIgb2YgX19zaWdxdWV1ZV9hbGxvYygpIHRoYXQgaGFzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBmaWxsaW5nCi1vdXQgKGluaXRpYWxpemluZykgdGhpcyBtZW1iZXIuCi0KLUJ1dCBqdXN0IHdoaWNoIGZpZWxkcyBvZiB0aGUgc3RydWN0IHdlcmUgdW5pbml0aWFsaXplZD8gTGV0J3MgbG9vayBhdAota21lbWNoZWNrJ3MgcmVwb3J0IGFnYWluOgotCi1XQVJOSU5HOiBrbWVtY2hlY2s6IENhdWdodCAzMi1iaXQgcmVhZCBmcm9tIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IChmZmZmODgwMDNlNGEyMDI0KQotODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODhmZmZmMDAwMDAwMDAwMDAwMDAwMAotIGkgaSBpIGkgdSB1IHUgdSBpIGkgaSBpIGkgaSBpIGkgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdQotICAgICAgICAgXgotCi1UaGVzZSBmaXJzdCB0d28gbGluZXMgYXJlIHRoZSBtZW1vcnkgZHVtcCBvZiB0aGUgbWVtb3J5IG9iamVjdCBpdHNlbGYsIGFuZCB0aGUKLXNoYWRvdyBieXRlbWFwLCByZXNwZWN0aXZlbHkuIFRoZSBtZW1vcnkgb2JqZWN0IGl0c2VsZiBpcyBpbiB0aGlzIGNhc2UKLSZmaXJzdC0+aW5mby4gSnVzdCBiZXdhcmUgdGhhdCB0aGUgc3RhcnQgb2YgdGhpcyBkdW1wIGlzIE5PVCB0aGUgc3RhcnQgb2YgdGhlCi1vYmplY3QgaXRzZWxmISBUaGUgcG9zaXRpb24gb2YgdGhlIGNhcmV0ICheKSBjb3JyZXNwb25kcyB3aXRoIHRoZSBhZGRyZXNzIG9mCi10aGUgcmVhZCAoZmZmZjg4MDAzZTRhMjAyNCkuCi0KLVRoZSBzaGFkb3cgYnl0ZW1hcCBkdW1wIGxlZ2VuZCBpcyBhcyBmb2xsb3dzOgotCi0gIGkgLSBpbml0aWFsaXplZAotICB1IC0gdW5pbml0aWFsaXplZAotICBhIC0gdW5hbGxvY2F0ZWQgKG1lbW9yeSBoYXMgYmVlbiBhbGxvY2F0ZWQgYnkgdGhlIHNsYWIgbGF5ZXIsIGJ1dCBoYXMgbm90Ci0gICAgICB5ZXQgYmVlbiBoYW5kZWQgb2ZmIHRvIGFueWJvZHkpCi0gIGYgLSBmcmVlZCAobWVtb3J5IGhhcyBiZWVuIGFsbG9jYXRlZCBieSB0aGUgc2xhYiBsYXllciwgYnV0IGhhcyBiZWVuIGZyZWVkCi0gICAgICBieSB0aGUgcHJldmlvdXMgb3duZXIpCi0KLUluIG9yZGVyIHRvIGZpZ3VyZSBvdXQgd2hlcmUgKHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgb2JqZWN0KSB0aGUKLXVuaW5pdGlhbGl6ZWQgbWVtb3J5IHdhcyBsb2NhdGVkLCB3ZSBoYXZlIHRvIGxvb2sgYXQgdGhlIGRpc2Fzc2VtYmx5LiBGb3IKLXRoYXQsIHdlJ2xsIG5lZWQgdGhlIFJJUCBhZGRyZXNzIGFnYWluOgotCi1SSVA6IDAwMTA6WzxmZmZmZmZmZjgxMDRlZGU4Pl0gIFs8ZmZmZmZmZmY4MTA0ZWRlOD5dIF9fZGVxdWV1ZV9zaWduYWwrMHhjOC8weDE5MAotCi0JJCBvYmpkdW1wIC1kIC0tbm8tc2hvdy1yYXctaW5zbiB2bWxpbnV4IHwgZ3JlcCAtQyA4IGZmZmZmZmZmODEwNGVkZTg6Ci0JZmZmZmZmZmY4MTA0ZWRjODogICAgICAgbW92ICAgICVyOCwweDgoJXI4KQotCWZmZmZmZmZmODEwNGVkY2M6ICAgICAgIHRlc3QgICAlcjEwZCwlcjEwZAotCWZmZmZmZmZmODEwNGVkY2Y6ICAgICAgIGpzICAgICBmZmZmZmZmZjgxMDRlZTg4IDxfX2RlcXVldWVfc2lnbmFsKzB4MTY4PgotCWZmZmZmZmZmODEwNGVkZDU6ICAgICAgIG1vdiAgICAlcmF4LCVyZHgKLQlmZmZmZmZmZjgxMDRlZGQ4OiAgICAgICBtb3YgICAgJDB4YywlZWN4Ci0JZmZmZmZmZmY4MTA0ZWRkZDogICAgICAgbW92ICAgICVyMTMsJXJkaQotCWZmZmZmZmZmODEwNGVkZTA6ICAgICAgIG1vdiAgICAkMHgzMCwlZWF4Ci0JZmZmZmZmZmY4MTA0ZWRlNTogICAgICAgbW92ICAgICVyZHgsJXJzaQotCWZmZmZmZmZmODEwNGVkZTg6ICAgICAgIHJlcCBtb3ZzbCAlZHM6KCVyc2kpLCVlczooJXJkaSkKLQlmZmZmZmZmZjgxMDRlZGVhOiAgICAgICB0ZXN0ICAgJDB4MiwlYWwKLQlmZmZmZmZmZjgxMDRlZGVjOiAgICAgICBqZSAgICAgZmZmZmZmZmY4MTA0ZWRmMCA8X19kZXF1ZXVlX3NpZ25hbCsweGQwPgotCWZmZmZmZmZmODEwNGVkZWU6ICAgICAgIG1vdnN3ICAlZHM6KCVyc2kpLCVlczooJXJkaSkKLQlmZmZmZmZmZjgxMDRlZGYwOiAgICAgICB0ZXN0ICAgJDB4MSwlYWwKLQlmZmZmZmZmZjgxMDRlZGYyOiAgICAgICBqZSAgICAgZmZmZmZmZmY4MTA0ZWRmNSA8X19kZXF1ZXVlX3NpZ25hbCsweGQ1PgotCWZmZmZmZmZmODEwNGVkZjQ6ICAgICAgIG1vdnNiICAlZHM6KCVyc2kpLCVlczooJXJkaSkKLQlmZmZmZmZmZjgxMDRlZGY1OiAgICAgICBtb3YgICAgJXI4LCVyZGkKLQlmZmZmZmZmZjgxMDRlZGY4OiAgICAgICBjYWxscSAgZmZmZmZmZmY4MTA0ZGU2MCA8X19zaWdxdWV1ZV9mcmVlPgotCi1BcyBleHBlY3RlZCwgaXQncyB0aGUgInJlcCBtb3ZzbCIgaW5zdHJ1Y3Rpb24gZnJvbSB0aGUgbWVtY3B5KCkgdGhhdCBjYXVzZXMKLXRoZSB3YXJuaW5nLiBXZSBrbm93IGFib3V0IFJFUCBNT1ZTTCB0aGF0IGl0IHVzZXMgdGhlIHJlZ2lzdGVyIFJDWCB0byBjb3VudAotdGhlIG51bWJlciBvZiByZW1haW5pbmcgaXRlcmF0aW9ucy4gQnkgdGFraW5nIGEgbG9vayBhdCB0aGUgcmVnaXN0ZXIgZHVtcAotYWdhaW4gKGZyb20gdGhlIGttZW1jaGVjayByZXBvcnQpLCB3ZSBjYW4gZmlndXJlIG91dCBob3cgbWFueSBieXRlcyB3ZXJlIGxlZnQKLXRvIGNvcHk6Ci0KLVJBWDogMDAwMDAwMDAwMDAwMDAzMCBSQlg6IGZmZmY4ODAwM2Q0ZWE5NjggUkNYOiAwMDAwMDAwMDAwMDAwMDA5Ci0KLUJ5IGxvb2tpbmcgYXQgdGhlIGRpc2Fzc2VtYmx5LCB3ZSBhbHNvIHNlZSB0aGF0ICVlY3ggaXMgYmVpbmcgbG9hZGVkIHdpdGggdGhlCi12YWx1ZSAkMHhjIGp1c3QgYmVmb3JlIChmZmZmZmZmZjgxMDRlZGQ4KSwgc28gd2UgYXJlIHZlcnkgbHVja3kuIEtlZXAgaW4gbWluZAotdGhhdCB0aGlzIGlzIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucywgbm90IGJ5dGVzLiBBbmQgc2luY2UgdGhpcyBpcyBhICJsb25nIgotb3BlcmF0aW9uLCB3ZSBuZWVkIHRvIG11bHRpcGx5IGJ5IDQgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMuIFNvIHRoaXMgbWVhbnMKLXRoYXQgdGhlIHVuaW5pdGlhbGl6ZWQgdmFsdWUgd2FzIGVuY291bnRlcmVkIGF0IDQgKiAoMHhjIC0gMHg5KSA9IDEyIGJ5dGVzCi1mcm9tIHRoZSBzdGFydCBvZiB0aGUgb2JqZWN0LgotCi1XZSBjYW4gbm93IHRyeSB0byBmaWd1cmUgb3V0IHdoaWNoIGZpZWxkIG9mIHRoZSAic3RydWN0IHNpZ2luZm8iIHRoYXQgd2FzIG5vdAotaW5pdGlhbGl6ZWQuIFRoaXMgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RydWN0OgotCi00MCB0eXBlZGVmIHN0cnVjdCBzaWdpbmZvIHsKLTQxICAgICAgICAgaW50IHNpX3NpZ25vOwotNDIgICAgICAgICBpbnQgc2lfZXJybm87Ci00MyAgICAgICAgIGludCBzaV9jb2RlOwotNDQgICAgICAgICAgICAgICAgIAotNDUgICAgICAgICB1bmlvbiB7Ci0uLgotOTIgICAgICAgICB9IF9zaWZpZWxkczsKLTkzIH0gc2lnaW5mb190OwotCi1PbiA2NC1iaXQsIHRoZSBpbnQgaXMgNCBieXRlcyBsb25nLCBzbyBpdCBtdXN0IHRoZSB1bmlvbiBtZW1iZXIgdGhhdCBoYXMKLW5vdCBiZWVuIGluaXRpYWxpemVkLiBXZSBjYW4gdmVyaWZ5IHRoaXMgdXNpbmcgZ2RiOgotCi0JJCBnZGIgdm1saW51eAotCS4uLgotCShnZGIpIHAgJigoc3RydWN0IHNpZ2luZm8gKikgMCktPl9zaWZpZWxkcwotCSQxID0gKHVuaW9uIHsuLi59ICopIDB4MTAKLQotQWN0dWFsbHksIGl0IHNlZW1zIHRoYXQgdGhlIHVuaW9uIG1lbWJlciBpcyBsb2NhdGVkIGF0IG9mZnNldCAweDEwIC0tIHdoaWNoCi1tZWFucyB0aGF0IGdjYyBoYXMgaW5zZXJ0ZWQgNCBieXRlcyBvZiBwYWRkaW5nIGJldHdlZW4gdGhlIG1lbWJlcnMgc2lfY29kZQotYW5kIF9zaWZpZWxkcy4gV2UgY2FuIG5vdyBnZXQgYSBmdWxsZXIgcGljdHVyZSBvZiB0aGUgbWVtb3J5IGR1bXA6Ci0KLSAgICAgICAgIF8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT4gc2lfY29kZQotICAgICAgICAvICAgICAgICBfLS0tLS0tLS0tLS0tLS0tLS0tLS09PiAocGFkZGluZykKLSAgICAgICB8ICAgICAgICAvICAgICAgICBfLS0tLS0tLS0tLS0tPT4gX3NpZmllbGRzKC5fa2lsbC5fcGlkKQotICAgICAgIHwgICAgICAgfCAgICAgICAgLyAgICAgICAgXy0tLS09PiBfc2lmaWVsZHMoLl9raWxsLl91aWQpCi0gICAgICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgIC8gCi0tLS0tLS0tfC0tLS0tLS18LS0tLS0tLXwtLS0tLS0tfAotODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODhmZmZmMDAwMDAwMDAwMDAwMDAwMAotIGkgaSBpIGkgdSB1IHUgdSBpIGkgaSBpIGkgaSBpIGkgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdQotCi1UaGlzIGFsbG93cyB1cyB0byByZWFsaXplIGFub3RoZXIgaW1wb3J0YW50IGZhY3Q6IHNpX2NvZGUgY29udGFpbnMgdGhlIHZhbHVlCi0weDgwLiBSZW1lbWJlciB0aGF0IHg4NiBpcyBsaXR0bGUgZW5kaWFuLCBzbyB0aGUgZmlyc3QgNCBieXRlcyAiODAwMDAwMDAiIGFyZQotcmVhbGx5IHRoZSBudW1iZXIgMHgwMDAwMDA4MC4gV2l0aCBhIGJpdCBvZiByZXNlYXJjaCwgd2UgZmluZCB0aGF0IHRoaXMgaXMKLWFjdHVhbGx5IHRoZSBjb25zdGFudCBTSV9LRVJORUwgZGVmaW5lZCBpbiBpbmNsdWRlL2FzbS1nZW5lcmljL3NpZ2luZm8uaDoKLQotMTQ0ICNkZWZpbmUgU0lfS0VSTkVMICAgICAgIDB4ODAgICAgICAgICAgICAvKiBzZW50IGJ5IHRoZSBrZXJuZWwgZnJvbSBzb21ld2hlcmUgICAgICovCi0KLVRoaXMgbWFjcm8gaXMgdXNlZCBpbiBleGFjdGx5IG9uZSBwbGFjZSBpbiB0aGUgeDg2IGtlcm5lbDogSW4gc2VuZF9zaWduYWwoKQotaW4ga2VybmVsL3NpZ25hbC5jOgotCi04MTYgc3RhdGljIGludCBzZW5kX3NpZ25hbChpbnQgc2lnLCBzdHJ1Y3Qgc2lnaW5mbyAqaW5mbywgc3RydWN0IHRhc2tfc3RydWN0ICp0LAotODE3ICAgICAgICAgICAgICAgICAgICAgICAgIGludCBncm91cCkKLTgxOCB7Ci0uLi4KLTgyOCAgICAgICAgIHBlbmRpbmcgPSBncm91cCA/ICZ0LT5zaWduYWwtPnNoYXJlZF9wZW5kaW5nIDogJnQtPnBlbmRpbmc7Ci0uLi4KLTg1MSAgICAgICAgIHEgPSBfX3NpZ3F1ZXVlX2FsbG9jKHQsIEdGUF9BVE9NSUMsIChzaWcgPCBTSUdSVE1JTiAmJgotODUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc19zaV9zcGVjaWFsKGluZm8pIHx8Ci04NTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNpX2NvZGUgPj0gMCkpKTsKLTg1NCAgICAgICAgIGlmIChxKSB7Ci04NTUgICAgICAgICAgICAgICAgIGxpc3RfYWRkX3RhaWwoJnEtPmxpc3QsICZwZW5kaW5nLT5saXN0KTsKLTg1NiAgICAgICAgICAgICAgICAgc3dpdGNoICgodW5zaWduZWQgbG9uZykgaW5mbykgewotLi4uCi04NjUgICAgICAgICAgICAgICAgIGNhc2UgKHVuc2lnbmVkIGxvbmcpIFNFTkRfU0lHX1BSSVY6Ci04NjYgICAgICAgICAgICAgICAgICAgICAgICAgcS0+aW5mby5zaV9zaWdubyA9IHNpZzsKLTg2NyAgICAgICAgICAgICAgICAgICAgICAgICBxLT5pbmZvLnNpX2Vycm5vID0gMDsKLTg2OCAgICAgICAgICAgICAgICAgICAgICAgICBxLT5pbmZvLnNpX2NvZGUgPSBTSV9LRVJORUw7Ci04NjkgICAgICAgICAgICAgICAgICAgICAgICAgcS0+aW5mby5zaV9waWQgPSAwOwotODcwICAgICAgICAgICAgICAgICAgICAgICAgIHEtPmluZm8uc2lfdWlkID0gMDsKLTg3MSAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLS4uLgotODkwIH0KLQotTm90IG9ubHkgZG9lcyB0aGlzIG1hdGNoIHdpdGggdGhlIC5zaV9jb2RlIG1lbWJlciwgaXQgYWxzbyBtYXRjaGVzIHRoZSBwbGFjZQotd2UgZm91bmQgZWFybGllciB3aGVuIGxvb2tpbmcgZm9yIHdoZXJlIHNpZ2luZm9fdCBvYmplY3RzIGFyZSBlbnF1ZXVlZCBvbiB0aGUKLSJzaGFyZWRfcGVuZGluZyIgbGlzdC4KLQotU28gdG8gc3VtIHVwOiBJdCBzZWVtcyB0aGF0IGl0IGlzIHRoZSBwYWRkaW5nIGludHJvZHVjZWQgYnkgdGhlIGNvbXBpbGVyCi1iZXR3ZWVuIHR3byBzdHJ1Y3QgZmllbGRzIHRoYXQgaXMgdW5pbml0aWFsaXplZCwgYW5kIHRoaXMgZ2V0cyByZXBvcnRlZCB3aGVuCi13ZSBkbyBhIG1lbWNweSgpIG9uIHRoZSBzdHJ1Y3QuIFRoaXMgbWVhbnMgdGhhdCB3ZSBoYXZlIGlkZW50aWZpZWQgYSBmYWxzZQotcG9zaXRpdmUgd2FybmluZy4KLQotTm9ybWFsbHksIGttZW1jaGVjayB3aWxsIG5vdCByZXBvcnQgdW5pbml0aWFsaXplZCBhY2Nlc3NlcyBpbiBtZW1jcHkoKSBjYWxscwotd2hlbiBib3RoIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFkZHJlc3NlcyBhcmUgdHJhY2tlZC4gKEluc3RlYWQsIHdlIGNvcHkKLXRoZSBzaGFkb3cgYnl0ZW1hcCBhcyB3ZWxsKS4gSW4gdGhpcyBjYXNlLCB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBjbGVhcmx5Ci13YXMgbm90IHRyYWNrZWQuIFdlIGNhbiBkaWcgYSBsaXR0bGUgZGVlcGVyIGludG8gdGhlIHN0YWNrIHRyYWNlIGZyb20gYWJvdmU6Ci0KLQlhcmNoL3g4Ni9rZXJuZWwvc2lnbmFsLmM6ODA1Ci0JYXJjaC94ODYva2VybmVsL3NpZ25hbC5jOjg3MQotCWFyY2gveDg2L2tlcm5lbC9lbnRyeV82NC5TOjY5NAotCi1BbmQgd2UgY2xlYXJseSBzZWUgdGhhdCB0aGUgZGVzdGluYXRpb24gc2lnaW5mbyBvYmplY3QgaXMgbG9jYXRlZCBvbiB0aGUKLXN0YWNrOgotCi03ODIgc3RhdGljIHZvaWQgZG9fc2lnbmFsKHN0cnVjdCBwdF9yZWdzICpyZWdzKQotNzgzIHsKLTc4NCAgICAgICAgIHN0cnVjdCBrX3NpZ2FjdGlvbiBrYTsKLTc4NSAgICAgICAgIHNpZ2luZm9fdCBpbmZvOwotLi4uCi04MDQgICAgICAgICBzaWduciA9IGdldF9zaWduYWxfdG9fZGVsaXZlcigmaW5mbywgJmthLCByZWdzLCBOVUxMKTsKLS4uLgotODU0IH0KLQotQW5kIHRoaXMgJmluZm8gaXMgd2hhdCBldmVudHVhbGx5IGdldHMgcGFzc2VkIHRvIGNvcHlfc2lnaW5mbygpIGFzIHRoZQotZGVzdGluYXRpb24gYXJndW1lbnQuCi0KLU5vdywgZXZlbiB0aG91Z2ggd2UgZGlkbid0IGZpbmQgYW4gYWN0dWFsIGVycm9yIGhlcmUsIHRoZSBleGFtcGxlIGlzIHN0aWxsIGEKLWdvb2Qgb25lLCBiZWNhdXNlIGl0IHNob3dzIGhvdyBvbmUgd291bGQgZ28gYWJvdXQgdG8gZmluZCBvdXQgd2hhdCB0aGUgcmVwb3J0Ci13YXMgYWxsIGFib3V0LgotCi0KLTMuNC4gQW5ub3RhdGluZyBmYWxzZSBwb3NpdGl2ZXMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhlcmUgYXJlIGEgZmV3IGRpZmZlcmVudCB3YXlzIHRvIG1ha2UgYW5ub3RhdGlvbnMgaW4gdGhlIHNvdXJjZSBjb2RlIHRoYXQKLXdpbGwga2VlcCBrbWVtY2hlY2sgZnJvbSBjaGVja2luZyBhbmQgcmVwb3J0aW5nIGNlcnRhaW4gYWxsb2NhdGlvbnMuIEhlcmUKLXRoZXkgYXJlOgotCi0gIG8gX19HRlBfTk9UUkFDS19GQUxTRV9QT1NJVElWRQotCi0JVGhpcyBmbGFnIGNhbiBiZSBwYXNzZWQgdG8ga21hbGxvYygpIG9yIGttZW1fY2FjaGVfYWxsb2MoKSAodGhlcmVmb3JlCi0JYWxzbyB0byBvdGhlciBmdW5jdGlvbnMgdGhhdCBlbmQgdXAgY2FsbGluZyBvbmUgb2YgdGhlc2UpIHRvIGluZGljYXRlCi0JdGhhdCB0aGUgYWxsb2NhdGlvbiBzaG91bGQgbm90IGJlIHRyYWNrZWQgYmVjYXVzZSBpdCB3b3VsZCBsZWFkIHRvCi0JYSBmYWxzZSBwb3NpdGl2ZSByZXBvcnQuIFRoaXMgaXMgYSAiYmlnIGhhbW1lciIgd2F5IG9mIHNpbGVuY2luZwotCWttZW1jaGVjazsgYWZ0ZXIgYWxsLCBldmVuIGlmIHRoZSBmYWxzZSBwb3NpdGl2ZSBwZXJ0YWlucyB0byAKLQlwYXJ0aWN1bGFyIGZpZWxkIGluIGEgc3RydWN0LCBmb3IgZXhhbXBsZSwgd2Ugd2lsbCBub3cgbG9zZSB0aGUKLQlhYmlsaXR5IHRvIGZpbmQgKHJlYWwpIGVycm9ycyBpbiBvdGhlciBwYXJ0cyBvZiB0aGUgc2FtZSBzdHJ1Y3QuCi0KLQlFeGFtcGxlOgotCi0JICAgIC8qIE5vIHdhcm5pbmdzIHdpbGwgZXZlciB0cmlnZ2VyIG9uIGFjY2Vzc2luZyBhbnkgcGFydCBvZiB4ICovCi0JICAgIHggPSBrbWFsbG9jKHNpemVvZiAqeCwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PVFJBQ0tfRkFMU0VfUE9TSVRJVkUpOwotCi0gIG8ga21lbWNoZWNrX2JpdGZpZWxkX2JlZ2luKG5hbWUpL2ttZW1jaGVja19iaXRmaWVsZF9lbmQobmFtZSkgYW5kCi0Ja21lbWNoZWNrX2Fubm90YXRlX2JpdGZpZWxkKHB0ciwgbmFtZSkKLQotCVRoZSBmaXJzdCB0d28gb2YgdGhlc2UgdGhyZWUgbWFjcm9zIGNhbiBiZSB1c2VkIGluc2lkZSBzdHJ1Y3QKLQlkZWZpbml0aW9ucyB0byBzaWduYWwsIHJlc3BlY3RpdmVseSwgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGEKLQliaXRmaWVsZC4gQWRkaXRpb25hbGx5LCB0aGlzIHdpbGwgYXNzaWduIHRoZSBiaXRmaWVsZCBhIG5hbWUsIHdoaWNoCi0JaXMgZ2l2ZW4gYXMgYW4gYXJndW1lbnQgdG8gdGhlIG1hY3Jvcy4KLQotCUhhdmluZyB1c2VkIHRoZXNlIG1hcmtlcnMsIG9uZSBjYW4gbGF0ZXIgdXNlCi0Ja21lbWNoZWNrX2Fubm90YXRlX2JpdGZpZWxkKCkgYXQgdGhlIHBvaW50IG9mIGFsbG9jYXRpb24sIHRvIGluZGljYXRlCi0Jd2hpY2ggcGFydHMgb2YgdGhlIGFsbG9jYXRpb24gaXMgcGFydCBvZiBhIGJpdGZpZWxkLgotCi0JRXhhbXBsZToKLQotCSAgICBzdHJ1Y3QgZm9vIHsKLQkJaW50IHg7Ci0KLQkJa21lbWNoZWNrX2JpdGZpZWxkX2JlZ2luKGZsYWdzKTsKLQkJaW50IGZsYWdfYToxOwotCQlpbnQgZmxhZ19iOjE7Ci0JCWttZW1jaGVja19iaXRmaWVsZF9lbmQoZmxhZ3MpOwotCi0JCWludCB5OwotCSAgICB9OwotCi0JICAgIHN0cnVjdCBmb28gKnggPSBrbWFsbG9jKHNpemVvZiAqeCk7Ci0KLQkgICAgLyogTm8gd2FybmluZ3Mgd2lsbCB0cmlnZ2VyIG9uIGFjY2Vzc2luZyB0aGUgYml0ZmllbGQgb2YgeCAqLwotCSAgICBrbWVtY2hlY2tfYW5ub3RhdGVfYml0ZmllbGQoeCwgZmxhZ3MpOwotCi0JTm90ZSB0aGF0IGttZW1jaGVja19hbm5vdGF0ZV9iaXRmaWVsZCgpIGNhbiBiZSB1c2VkIGV2ZW4gYmVmb3JlIHRoZQotCXJldHVybiB2YWx1ZSBvZiBrbWFsbG9jKCkgaXMgY2hlY2tlZCAtLSBpbiBvdGhlciB3b3JkcywgcGFzc2luZyBOVUxMCi0JYXMgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGxlZ2FsIChhbmQgd2lsbCBkbyBub3RoaW5nKS4KLQotCi00LiBSZXBvcnRpbmcgZXJyb3JzCi09PT09PT09PT09PT09PT09PT09Ci0KLUFzIHdlIGhhdmUgc2Vlbiwga21lbWNoZWNrIHdpbGwgcHJvZHVjZSBmYWxzZSBwb3NpdGl2ZSByZXBvcnRzLiBUaGVyZWZvcmUsIGl0Ci1pcyBub3QgdmVyeSB3aXNlIHRvIGJsaW5kbHkgcG9zdCBrbWVtY2hlY2sgd2FybmluZ3MgdG8gbWFpbGluZyBsaXN0cyBhbmQKLW1haW50YWluZXJzLiBJbnN0ZWFkLCBJIGVuY291cmFnZSBtYWludGFpbmVycyBhbmQgZGV2ZWxvcGVycyB0byBmaW5kIGVycm9ycwotaW4gdGhlaXIgb3duIGNvZGUuIElmIHlvdSBnZXQgYSB3YXJuaW5nLCB5b3UgY2FuIHRyeSB0byB3b3JrIGFyb3VuZCBpdCwgdHJ5Ci10byBmaWd1cmUgb3V0IGlmIGl0J3MgYSByZWFsIGVycm9yIG9yIG5vdCwgb3Igc2ltcGx5IGlnbm9yZSBpdC4gTW9zdAotZGV2ZWxvcGVycyBrbm93IHRoZWlyIG93biBjb2RlIGFuZCB3aWxsIHF1aWNrbHkgYW5kIGVmZmljaWVudGx5IGRldGVybWluZSB0aGUKLXJvb3QgY2F1c2Ugb2YgYSBrbWVtY2hlY2sgcmVwb3J0LiBUaGlzIGlzIHRoZXJlZm9yZSBhbHNvIHRoZSBtb3N0IGVmZmljaWVudAotd2F5IHRvIHdvcmsgd2l0aCBrbWVtY2hlY2suCi0KLVRoYXQgc2FpZCwgd2UgKHRoZSBrbWVtY2hlY2sgbWFpbnRhaW5lcnMpIHdpbGwgYWx3YXlzIGJlIG9uIHRoZSBsb29rb3V0IGZvcgotZmFsc2UgcG9zaXRpdmVzIHRoYXQgd2UgY2FuIGFubm90YXRlIGFuZCBzaWxlbmNlLiBTbyB3aGF0ZXZlciB5b3UgZmluZCwKLXBsZWFzZSBkcm9wIHVzIGEgbm90ZSBwcml2YXRlbHkhIEtlcm5lbCBjb25maWdzIGFuZCBzdGVwcyB0byByZXByb2R1Y2UgKGlmCi1hdmFpbGFibGUpIGFyZSBvZiBjb3Vyc2UgYSBncmVhdCBoZWxwIHRvby4KLQotSGFwcHkgaGFja2luZyEKLQotCi01LiBUZWNobmljYWwgZGVzY3JpcHRpb24KLT09PT09PT09PT09PT09PT09PT09PT09PQotCi1rbWVtY2hlY2sgd29ya3MgYnkgbWFya2luZyBtZW1vcnkgcGFnZXMgbm9uLXByZXNlbnQuIFRoaXMgbWVhbnMgdGhhdCB3aGVuZXZlcgotc29tZWJvZHkgYXR0ZW1wdHMgdG8gYWNjZXNzIHRoZSBwYWdlLCBhIHBhZ2UgZmF1bHQgaXMgZ2VuZXJhdGVkLiBUaGUgcGFnZQotZmF1bHQgaGFuZGxlciBub3RpY2VzIHRoYXQgdGhlIHBhZ2Ugd2FzIGluIGZhY3Qgb25seSBoaWRkZW4sIGFuZCBzbyBpdCBjYWxscwotb24gdGhlIGttZW1jaGVjayBjb2RlIHRvIG1ha2UgZnVydGhlciBpbnZlc3RpZ2F0aW9ucy4KLQotV2hlbiB0aGUgaW52ZXN0aWdhdGlvbnMgYXJlIGNvbXBsZXRlZCwga21lbWNoZWNrICJzaG93cyIgdGhlIHBhZ2UgYnkgbWFya2luZwotaXQgcHJlc2VudCAoYXMgaXQgd291bGQgYmUgdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMpLiBUaGlzIHdheSwgdGhlCi1pbnRlcnJ1cHRlZCBjb2RlIGNhbiBjb250aW51ZSBhcyB1c3VhbC4KLQotQnV0IGFmdGVyIHRoZSBpbnN0cnVjdGlvbiBoYXMgYmVlbiBleGVjdXRlZCwgd2Ugc2hvdWxkIGhpZGUgdGhlIHBhZ2UgYWdhaW4sIHNvCi10aGF0IHdlIGNhbiBjYXRjaCB0aGUgbmV4dCBhY2Nlc3MgdG9vISBOb3cga21lbWNoZWNrIG1ha2VzIHVzZSBvZiBhIGRlYnVnZ2luZwotZmVhdHVyZSBvZiB0aGUgcHJvY2Vzc29yLCBuYW1lbHkgc2luZ2xlLXN0ZXBwaW5nLiBXaGVuIHRoZSBwcm9jZXNzb3IgaGFzCi1maW5pc2hlZCB0aGUgb25lIGluc3RydWN0aW9uIHRoYXQgZ2VuZXJhdGVkIHRoZSBtZW1vcnkgYWNjZXNzLCBhIGRlYnVnCi1leGNlcHRpb24gaXMgcmFpc2VkLiBGcm9tIGhlcmUsIHdlIHNpbXBseSBoaWRlIHRoZSBwYWdlIGFnYWluIGFuZCBjb250aW51ZQotZXhlY3V0aW9uLCB0aGlzIHRpbWUgd2l0aCB0aGUgc2luZ2xlLXN0ZXBwaW5nIGZlYXR1cmUgdHVybmVkIG9mZi4KLQota21lbWNoZWNrIHJlcXVpcmVzIHNvbWUgYXNzaXN0YW5jZSBmcm9tIHRoZSBtZW1vcnkgYWxsb2NhdG9yIGluIG9yZGVyIHRvIHdvcmsuCi1UaGUgbWVtb3J5IGFsbG9jYXRvciBuZWVkcyB0bwotCi0gIDEuIFRlbGwga21lbWNoZWNrIGFib3V0IG5ld2x5IGFsbG9jYXRlZCBwYWdlcyBhbmQgcGFnZXMgdGhhdCBhcmUgYWJvdXQgdG8KLSAgICAgYmUgZnJlZWQuIFRoaXMgYWxsb3dzIGttZW1jaGVjayB0byBzZXQgdXAgYW5kIHRlYXIgZG93biB0aGUgc2hhZG93IG1lbW9yeQotICAgICBmb3IgdGhlIHBhZ2VzIGluIHF1ZXN0aW9uLiBUaGUgc2hhZG93IG1lbW9yeSBzdG9yZXMgdGhlIHN0YXR1cyBvZiBlYWNoCi0gICAgIGJ5dGUgaW4gdGhlIGFsbG9jYXRpb24gcHJvcGVyLCBlLmcuIHdoZXRoZXIgaXQgaXMgaW5pdGlhbGl6ZWQgb3IKLSAgICAgdW5pbml0aWFsaXplZC4KLQotICAyLiBUZWxsIGttZW1jaGVjayB3aGljaCBwYXJ0cyBvZiBtZW1vcnkgc2hvdWxkIGJlIG1hcmtlZCB1bmluaXRpYWxpemVkLgotICAgICBUaGVyZSBhcmUgYWN0dWFsbHkgYSBmZXcgbW9yZSBzdGF0ZXMsIHN1Y2ggYXMgIm5vdCB5ZXQgYWxsb2NhdGVkIiBhbmQKLSAgICAgInJlY2VudGx5IGZyZWVkIi4KLQotSWYgYSBzbGFiIGNhY2hlIGlzIHNldCB1cCB1c2luZyB0aGUgU0xBQl9OT1RSQUNLIGZsYWcsIGl0IHdpbGwgbmV2ZXIgcmV0dXJuCi1tZW1vcnkgdGhhdCBjYW4gdGFrZSBwYWdlIGZhdWx0cyBiZWNhdXNlIG9mIGttZW1jaGVjay4KLQotSWYgYSBzbGFiIGNhY2hlIGlzIE5PVCBzZXQgdXAgdXNpbmcgdGhlIFNMQUJfTk9UUkFDSyBmbGFnLCBjYWxsZXJzIGNhbiBzdGlsbAotcmVxdWVzdCBtZW1vcnkgd2l0aCB0aGUgX19HRlBfTk9UUkFDSyBvciBfX0dGUF9OT1RSQUNLX0ZBTFNFX1BPU0lUSVZFIGZsYWdzLgotVGhpcyBkb2VzIG5vdCBwcmV2ZW50IHRoZSBwYWdlIGZhdWx0cyBmcm9tIG9jY3VycmluZywgaG93ZXZlciwgYnV0IG1hcmtzIHRoZQotb2JqZWN0IGluIHF1ZXN0aW9uIGFzIGJlaW5nIGluaXRpYWxpemVkIHNvIHRoYXQgbm8gd2FybmluZ3Mgd2lsbCBldmVyIGJlCi1wcm9kdWNlZCBmb3IgdGhpcyBvYmplY3QuCi0KLUN1cnJlbnRseSwgdGhlIFNMQUIgYW5kIFNMVUIgYWxsb2NhdG9ycyBhcmUgc3VwcG9ydGVkIGJ5IGttZW1jaGVjay4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va21lbWxlYWsudHh0IGIvRG9jdW1lbnRhdGlvbi9rbWVtbGVhay50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZTI0YWIuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9rbWVtbGVhay50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotS2VybmVsIE1lbW9yeSBMZWFrIERldGVjdG9yCi09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotSW50cm9kdWN0aW9uCi0tLS0tLS0tLS0tLS0KLQotS21lbWxlYWsgcHJvdmlkZXMgYSB3YXkgb2YgZGV0ZWN0aW5nIHBvc3NpYmxlIGtlcm5lbCBtZW1vcnkgbGVha3MgaW4gYQotd2F5IHNpbWlsYXIgdG8gYSB0cmFjaW5nIGdhcmJhZ2UgY29sbGVjdG9yCi0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvR2FyYmFnZV9jb2xsZWN0aW9uXyUyOGNvbXB1dGVyX3NjaWVuY2UlMjkjVHJhY2luZ19nYXJiYWdlX2NvbGxlY3RvcnMpLAotd2l0aCB0aGUgZGlmZmVyZW5jZSB0aGF0IHRoZSBvcnBoYW4gb2JqZWN0cyBhcmUgbm90IGZyZWVkIGJ1dCBvbmx5Ci1yZXBvcnRlZCB2aWEgL3N5cy9rZXJuZWwvZGVidWcva21lbWxlYWsuIEEgc2ltaWxhciBtZXRob2QgaXMgdXNlZCBieSB0aGUKLVZhbGdyaW5kIHRvb2wgKG1lbWNoZWNrIC0tbGVhay1jaGVjaykgdG8gZGV0ZWN0IHRoZSBtZW1vcnkgbGVha3MgaW4KLXVzZXItc3BhY2UgYXBwbGljYXRpb25zLgotS21lbWxlYWsgaXMgc3VwcG9ydGVkIG9uIHg4NiwgYXJtLCBwb3dlcnBjLCBzcGFyYywgc2gsIG1pY3JvYmxhemUsIHBwYywgbWlwcywgczM5MCwgbWV0YWcgYW5kIHRpbGUuCi0KLVVzYWdlCi0tLS0tLQotCi1DT05GSUdfREVCVUdfS01FTUxFQUsgaW4gIktlcm5lbCBoYWNraW5nIiBoYXMgdG8gYmUgZW5hYmxlZC4gQSBrZXJuZWwKLXRocmVhZCBzY2FucyB0aGUgbWVtb3J5IGV2ZXJ5IDEwIG1pbnV0ZXMgKGJ5IGRlZmF1bHQpIGFuZCBwcmludHMgdGhlCi1udW1iZXIgb2YgbmV3IHVucmVmZXJlbmNlZCBvYmplY3RzIGZvdW5kLiBUbyBkaXNwbGF5IHRoZSBkZXRhaWxzIG9mIGFsbAotdGhlIHBvc3NpYmxlIG1lbW9yeSBsZWFrczoKLQotICAjIG1vdW50IC10IGRlYnVnZnMgbm9kZXYgL3N5cy9rZXJuZWwvZGVidWcvCi0gICMgY2F0IC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrCi0KLVRvIHRyaWdnZXIgYW4gaW50ZXJtZWRpYXRlIG1lbW9yeSBzY2FuOgotCi0gICMgZWNobyBzY2FuID4gL3N5cy9rZXJuZWwvZGVidWcva21lbWxlYWsKLQotVG8gY2xlYXIgdGhlIGxpc3Qgb2YgYWxsIGN1cnJlbnQgcG9zc2libGUgbWVtb3J5IGxlYWtzOgotCi0gICMgZWNobyBjbGVhciA+IC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrCi0KLU5ldyBsZWFrcyB3aWxsIHRoZW4gY29tZSB1cCB1cG9uIHJlYWRpbmcgL3N5cy9rZXJuZWwvZGVidWcva21lbWxlYWsKLWFnYWluLgotCi1Ob3RlIHRoYXQgdGhlIG9ycGhhbiBvYmplY3RzIGFyZSBsaXN0ZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBhbGxvY2F0ZWQKLWFuZCBvbmUgb2JqZWN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QgbWF5IGNhdXNlIG90aGVyIHN1YnNlcXVlbnQKLW9iamVjdHMgdG8gYmUgcmVwb3J0ZWQgYXMgb3JwaGFuLgotCi1NZW1vcnkgc2Nhbm5pbmcgcGFyYW1ldGVycyBjYW4gYmUgbW9kaWZpZWQgYXQgcnVuLXRpbWUgYnkgd3JpdGluZyB0byB0aGUKLS9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrIGZpbGUuIFRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgc3VwcG9ydGVkOgotCi0gIG9mZgkJLSBkaXNhYmxlIGttZW1sZWFrIChpcnJldmVyc2libGUpCi0gIHN0YWNrPW9uCS0gZW5hYmxlIHRoZSB0YXNrIHN0YWNrcyBzY2FubmluZyAoZGVmYXVsdCkKLSAgc3RhY2s9b2ZmCS0gZGlzYWJsZSB0aGUgdGFza3Mgc3RhY2tzIHNjYW5uaW5nCi0gIHNjYW49b24JLSBzdGFydCB0aGUgYXV0b21hdGljIG1lbW9yeSBzY2FubmluZyB0aHJlYWQgKGRlZmF1bHQpCi0gIHNjYW49b2ZmCS0gc3RvcCB0aGUgYXV0b21hdGljIG1lbW9yeSBzY2FubmluZyB0aHJlYWQKLSAgc2Nhbj08c2Vjcz4JLSBzZXQgdGhlIGF1dG9tYXRpYyBtZW1vcnkgc2Nhbm5pbmcgcGVyaW9kIGluIHNlY29uZHMKLQkJICAoZGVmYXVsdCA2MDAsIDAgdG8gc3RvcCB0aGUgYXV0b21hdGljIHNjYW5uaW5nKQotICBzY2FuCQktIHRyaWdnZXIgYSBtZW1vcnkgc2NhbgotICBjbGVhcgkJLSBjbGVhciBsaXN0IG9mIGN1cnJlbnQgbWVtb3J5IGxlYWsgc3VzcGVjdHMsIGRvbmUgYnkKLQkJICBtYXJraW5nIGFsbCBjdXJyZW50IHJlcG9ydGVkIHVucmVmZXJlbmNlZCBvYmplY3RzIGdyZXksCi0JCSAgb3IgZnJlZSBhbGwga21lbWxlYWsgb2JqZWN0cyBpZiBrbWVtbGVhayBoYXMgYmVlbiBkaXNhYmxlZC4KLSAgZHVtcD08YWRkcj4JLSBkdW1wIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QgZm91bmQgYXQgPGFkZHI+Ci0KLUttZW1sZWFrIGNhbiBhbHNvIGJlIGRpc2FibGVkIGF0IGJvb3QtdGltZSBieSBwYXNzaW5nICJrbWVtbGVhaz1vZmYiIG9uCi10aGUga2VybmVsIGNvbW1hbmQgbGluZS4KLQotTWVtb3J5IG1heSBiZSBhbGxvY2F0ZWQgb3IgZnJlZWQgYmVmb3JlIGttZW1sZWFrIGlzIGluaXRpYWxpc2VkIGFuZAotdGhlc2UgYWN0aW9ucyBhcmUgc3RvcmVkIGluIGFuIGVhcmx5IGxvZyBidWZmZXIuIFRoZSBzaXplIG9mIHRoaXMgYnVmZmVyCi1pcyBjb25maWd1cmVkIHZpYSB0aGUgQ09ORklHX0RFQlVHX0tNRU1MRUFLX0VBUkxZX0xPR19TSVpFIG9wdGlvbi4KLQotSWYgQ09ORklHX0RFQlVHX0tNRU1MRUFLX0RFRkFVTFRfT0ZGIGFyZSBlbmFibGVkLCB0aGUga21lbWxlYWsgaXMKLWRpc2FibGVkIGJ5IGRlZmF1bHQuIFBhc3NpbmcgImttZW1sZWFrPW9uIiBvbiB0aGUga2VybmVsIGNvbW1hbmQKLWxpbmUgZW5hYmxlcyB0aGUgZnVuY3Rpb24uIAotCi1CYXNpYyBBbGdvcml0aG0KLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgbWVtb3J5IGFsbG9jYXRpb25zIHZpYSBrbWFsbG9jLCB2bWFsbG9jLCBrbWVtX2NhY2hlX2FsbG9jIGFuZAotZnJpZW5kcyBhcmUgdHJhY2VkIGFuZCB0aGUgcG9pbnRlcnMsIHRvZ2V0aGVyIHdpdGggYWRkaXRpb25hbAotaW5mb3JtYXRpb24gbGlrZSBzaXplIGFuZCBzdGFjayB0cmFjZSwgYXJlIHN0b3JlZCBpbiBhIHJidHJlZS4KLVRoZSBjb3JyZXNwb25kaW5nIGZyZWVpbmcgZnVuY3Rpb24gY2FsbHMgYXJlIHRyYWNrZWQgYW5kIHRoZSBwb2ludGVycwotcmVtb3ZlZCBmcm9tIHRoZSBrbWVtbGVhayBkYXRhIHN0cnVjdHVyZXMuCi0KLUFuIGFsbG9jYXRlZCBibG9jayBvZiBtZW1vcnkgaXMgY29uc2lkZXJlZCBvcnBoYW4gaWYgbm8gcG9pbnRlciB0byBpdHMKLXN0YXJ0IGFkZHJlc3Mgb3IgdG8gYW55IGxvY2F0aW9uIGluc2lkZSB0aGUgYmxvY2sgY2FuIGJlIGZvdW5kIGJ5Ci1zY2FubmluZyB0aGUgbWVtb3J5IChpbmNsdWRpbmcgc2F2ZWQgcmVnaXN0ZXJzKS4gVGhpcyBtZWFucyB0aGF0IHRoZXJlCi1taWdodCBiZSBubyB3YXkgZm9yIHRoZSBrZXJuZWwgdG8gcGFzcyB0aGUgYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkCi1ibG9jayB0byBhIGZyZWVpbmcgZnVuY3Rpb24gYW5kIHRoZXJlZm9yZSB0aGUgYmxvY2sgaXMgY29uc2lkZXJlZCBhCi1tZW1vcnkgbGVhay4KLQotVGhlIHNjYW5uaW5nIGFsZ29yaXRobSBzdGVwczoKLQotICAxLiBtYXJrIGFsbCBvYmplY3RzIGFzIHdoaXRlIChyZW1haW5pbmcgd2hpdGUgb2JqZWN0cyB3aWxsIGxhdGVyIGJlCi0gICAgIGNvbnNpZGVyZWQgb3JwaGFuKQotICAyLiBzY2FuIHRoZSBtZW1vcnkgc3RhcnRpbmcgd2l0aCB0aGUgZGF0YSBzZWN0aW9uIGFuZCBzdGFja3MsIGNoZWNraW5nCi0gICAgIHRoZSB2YWx1ZXMgYWdhaW5zdCB0aGUgYWRkcmVzc2VzIHN0b3JlZCBpbiB0aGUgcmJ0cmVlLiBJZgotICAgICBhIHBvaW50ZXIgdG8gYSB3aGl0ZSBvYmplY3QgaXMgZm91bmQsIHRoZSBvYmplY3QgaXMgYWRkZWQgdG8gdGhlCi0gICAgIGdyYXkgbGlzdAotICAzLiBzY2FuIHRoZSBncmF5IG9iamVjdHMgZm9yIG1hdGNoaW5nIGFkZHJlc3NlcyAoc29tZSB3aGl0ZSBvYmplY3RzCi0gICAgIGNhbiBiZWNvbWUgZ3JheSBhbmQgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgZ3JheSBsaXN0KSB1bnRpbCB0aGUKLSAgICAgZ3JheSBzZXQgaXMgZmluaXNoZWQKLSAgNC4gdGhlIHJlbWFpbmluZyB3aGl0ZSBvYmplY3RzIGFyZSBjb25zaWRlcmVkIG9ycGhhbiBhbmQgcmVwb3J0ZWQgdmlhCi0gICAgIC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrCi0KLVNvbWUgYWxsb2NhdGVkIG1lbW9yeSBibG9ja3MgaGF2ZSBwb2ludGVycyBzdG9yZWQgaW4gdGhlIGtlcm5lbCdzCi1pbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgYW5kIHRoZXkgY2Fubm90IGJlIGRldGVjdGVkIGFzIG9ycGhhbnMuIFRvCi1hdm9pZCB0aGlzLCBrbWVtbGVhayBjYW4gYWxzbyBzdG9yZSB0aGUgbnVtYmVyIG9mIHZhbHVlcyBwb2ludGluZyB0byBhbgotYWRkcmVzcyBpbnNpZGUgdGhlIGJsb2NrIGFkZHJlc3MgcmFuZ2UgdGhhdCBuZWVkIHRvIGJlIGZvdW5kIHNvIHRoYXQgdGhlCi1ibG9jayBpcyBub3QgY29uc2lkZXJlZCBhIGxlYWsuIE9uZSBleGFtcGxlIGlzIF9fdm1hbGxvYygpLgotCi1UZXN0aW5nIHNwZWNpZmljIHNlY3Rpb25zIHdpdGgga21lbWxlYWsKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1VcG9uIGluaXRpYWwgYm9vdHVwIHlvdXIgL3N5cy9rZXJuZWwvZGVidWcva21lbWxlYWsgb3V0cHV0IHBhZ2UgbWF5IGJlCi1xdWl0ZSBleHRlbnNpdmUuIFRoaXMgY2FuIGFsc28gYmUgdGhlIGNhc2UgaWYgeW91IGhhdmUgdmVyeSBidWdneSBjb2RlCi13aGVuIGRvaW5nIGRldmVsb3BtZW50LiBUbyB3b3JrIGFyb3VuZCB0aGVzZSBzaXR1YXRpb25zIHlvdSBjYW4gdXNlIHRoZQotJ2NsZWFyJyBjb21tYW5kIHRvIGNsZWFyIGFsbCByZXBvcnRlZCB1bnJlZmVyZW5jZWQgb2JqZWN0cyBmcm9tIHRoZQotL3N5cy9rZXJuZWwvZGVidWcva21lbWxlYWsgb3V0cHV0LiBCeSBpc3N1aW5nIGEgJ3NjYW4nIGFmdGVyIGEgJ2NsZWFyJwoteW91IGNhbiBmaW5kIG5ldyB1bnJlZmVyZW5jZWQgb2JqZWN0czsgdGhpcyBzaG91bGQgaGVscCB3aXRoIHRlc3RpbmcKLXNwZWNpZmljIHNlY3Rpb25zIG9mIGNvZGUuCi0KLVRvIHRlc3QgYSBjcml0aWNhbCBzZWN0aW9uIG9uIGRlbWFuZCB3aXRoIGEgY2xlYW4ga21lbWxlYWsgZG86Ci0KLSAgIyBlY2hvIGNsZWFyID4gL3N5cy9rZXJuZWwvZGVidWcva21lbWxlYWsKLSAgLi4uIHRlc3QgeW91ciBrZXJuZWwgb3IgbW9kdWxlcyAuLi4KLSAgIyBlY2hvIHNjYW4gPiAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhawotCi1UaGVuIGFzIHVzdWFsIHRvIGdldCB5b3VyIHJlcG9ydCB3aXRoOgotCi0gICMgY2F0IC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrCi0KLUZyZWVpbmcga21lbWxlYWsgaW50ZXJuYWwgb2JqZWN0cwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRvIGFsbG93IGFjY2VzcyB0byBwcmV2aW91c2x5IGZvdW5kIG1lbW9yeSBsZWFrcyBhZnRlciBrbWVtbGVhayBoYXMgYmVlbgotZGlzYWJsZWQgYnkgdGhlIHVzZXIgb3IgZHVlIHRvIGFuIGZhdGFsIGVycm9yLCBpbnRlcm5hbCBrbWVtbGVhayBvYmplY3RzCi13b24ndCBiZSBmcmVlZCB3aGVuIGttZW1sZWFrIGlzIGRpc2FibGVkLCBhbmQgdGhvc2Ugb2JqZWN0cyBtYXkgb2NjdXB5Ci1hIGxhcmdlIHBhcnQgb2YgcGh5c2ljYWwgbWVtb3J5LgotCi1JbiB0aGlzIHNpdHVhdGlvbiwgeW91IG1heSByZWNsYWltIG1lbW9yeSB3aXRoOgotCi0gICMgZWNobyBjbGVhciA+IC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrCi0KLUttZW1sZWFrIEFQSQotLS0tLS0tLS0tLS0tCi0KLVNlZSB0aGUgaW5jbHVkZS9saW51eC9rbWVtbGVhay5oIGhlYWRlciBmb3IgdGhlIGZ1bmN0aW9ucyBwcm90b3R5cGUuCi0KLWttZW1sZWFrX2luaXQJCSAtIGluaXRpYWxpemUga21lbWxlYWsKLWttZW1sZWFrX2FsbG9jCQkgLSBub3RpZnkgb2YgYSBtZW1vcnkgYmxvY2sgYWxsb2NhdGlvbgota21lbWxlYWtfYWxsb2NfcGVyY3B1CSAtIG5vdGlmeSBvZiBhIHBlcmNwdSBtZW1vcnkgYmxvY2sgYWxsb2NhdGlvbgota21lbWxlYWtfZnJlZQkJIC0gbm90aWZ5IG9mIGEgbWVtb3J5IGJsb2NrIGZyZWVpbmcKLWttZW1sZWFrX2ZyZWVfcGFydAkgLSBub3RpZnkgb2YgYSBwYXJ0aWFsIG1lbW9yeSBibG9jayBmcmVlaW5nCi1rbWVtbGVha19mcmVlX3BlcmNwdQkgLSBub3RpZnkgb2YgYSBwZXJjcHUgbWVtb3J5IGJsb2NrIGZyZWVpbmcKLWttZW1sZWFrX3VwZGF0ZV90cmFjZQkgLSB1cGRhdGUgb2JqZWN0IGFsbG9jYXRpb24gc3RhY2sgdHJhY2UKLWttZW1sZWFrX25vdF9sZWFrCSAtIG1hcmsgYW4gb2JqZWN0IGFzIG5vdCBhIGxlYWsKLWttZW1sZWFrX2lnbm9yZQkJIC0gZG8gbm90IHNjYW4gb3IgcmVwb3J0IGFuIG9iamVjdCBhcyBsZWFrCi1rbWVtbGVha19zY2FuX2FyZWEJIC0gYWRkIHNjYW4gYXJlYXMgaW5zaWRlIGEgbWVtb3J5IGJsb2NrCi1rbWVtbGVha19ub19zY2FuCSAtIGRvIG5vdCBzY2FuIGEgbWVtb3J5IGJsb2NrCi1rbWVtbGVha19lcmFzZQkJIC0gZXJhc2UgYW4gb2xkIHZhbHVlIGluIGEgcG9pbnRlciB2YXJpYWJsZQota21lbWxlYWtfYWxsb2NfcmVjdXJzaXZlIC0gYXMga21lbWxlYWtfYWxsb2MgYnV0IGNoZWNrcyB0aGUgcmVjdXJzaXZlbmVzcwota21lbWxlYWtfZnJlZV9yZWN1cnNpdmUJIC0gYXMga21lbWxlYWtfZnJlZSBidXQgY2hlY2tzIHRoZSByZWN1cnNpdmVuZXNzCi0KLURlYWxpbmcgd2l0aCBmYWxzZSBwb3NpdGl2ZXMvbmVnYXRpdmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgZmFsc2UgbmVnYXRpdmVzIGFyZSByZWFsIG1lbW9yeSBsZWFrcyAob3JwaGFuIG9iamVjdHMpIGJ1dCBub3QKLXJlcG9ydGVkIGJ5IGttZW1sZWFrIGJlY2F1c2UgdmFsdWVzIGZvdW5kIGR1cmluZyB0aGUgbWVtb3J5IHNjYW5uaW5nCi1wb2ludCB0byBzdWNoIG9iamVjdHMuIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGZhbHNlIG5lZ2F0aXZlcywga21lbWxlYWsKLXByb3ZpZGVzIHRoZSBrbWVtbGVha19pZ25vcmUsIGttZW1sZWFrX3NjYW5fYXJlYSwga21lbWxlYWtfbm9fc2NhbiBhbmQKLWttZW1sZWFrX2VyYXNlIGZ1bmN0aW9ucyAoc2VlIGFib3ZlKS4gVGhlIHRhc2sgc3RhY2tzIGFsc28gaW5jcmVhc2UgdGhlCi1hbW91bnQgb2YgZmFsc2UgbmVnYXRpdmVzIGFuZCB0aGVpciBzY2FubmluZyBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0LgotCi1UaGUgZmFsc2UgcG9zaXRpdmVzIGFyZSBvYmplY3RzIHdyb25nbHkgcmVwb3J0ZWQgYXMgYmVpbmcgbWVtb3J5IGxlYWtzCi0ob3JwaGFuKS4gRm9yIG9iamVjdHMga25vd24gbm90IHRvIGJlIGxlYWtzLCBrbWVtbGVhayBwcm92aWRlcyB0aGUKLWttZW1sZWFrX25vdF9sZWFrIGZ1bmN0aW9uLiBUaGUga21lbWxlYWtfaWdub3JlIGNvdWxkIGFsc28gYmUgdXNlZCBpZgotdGhlIG1lbW9yeSBibG9jayBpcyBrbm93biBub3QgdG8gY29udGFpbiBvdGhlciBwb2ludGVycyBhbmQgaXQgd2lsbCBubwotbG9uZ2VyIGJlIHNjYW5uZWQuCi0KLVNvbWUgb2YgdGhlIHJlcG9ydGVkIGxlYWtzIGFyZSBvbmx5IHRyYW5zaWVudCwgZXNwZWNpYWxseSBvbiBTTVAKLXN5c3RlbXMsIGJlY2F1c2Ugb2YgcG9pbnRlcnMgdGVtcG9yYXJpbHkgc3RvcmVkIGluIENQVSByZWdpc3RlcnMgb3IKLXN0YWNrcy4gS21lbWxlYWsgZGVmaW5lcyBNU0VDU19NSU5fQUdFIChkZWZhdWx0aW5nIHRvIDEwMDApIHJlcHJlc2VudGluZwotdGhlIG1pbmltdW0gYWdlIG9mIGFuIG9iamVjdCB0byBiZSByZXBvcnRlZCBhcyBhIG1lbW9yeSBsZWFrLgotCi1MaW1pdGF0aW9ucyBhbmQgRHJhd2JhY2tzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBtYWluIGRyYXdiYWNrIGlzIHRoZSByZWR1Y2VkIHBlcmZvcm1hbmNlIG9mIG1lbW9yeSBhbGxvY2F0aW9uIGFuZAotZnJlZWluZy4gVG8gYXZvaWQgb3RoZXIgcGVuYWx0aWVzLCB0aGUgbWVtb3J5IHNjYW5uaW5nIGlzIG9ubHkgcGVyZm9ybWVkCi13aGVuIHRoZSAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhayBmaWxlIGlzIHJlYWQuIEFueXdheSwgdGhpcyB0b29sIGlzCi1pbnRlbmRlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIHdoZXJlIHRoZSBwZXJmb3JtYW5jZSBtaWdodCBub3QgYmUgdGhlCi1tb3N0IGltcG9ydGFudCByZXF1aXJlbWVudC4KLQotVG8ga2VlcCB0aGUgYWxnb3JpdGhtIHNpbXBsZSwga21lbWxlYWsgc2NhbnMgZm9yIHZhbHVlcyBwb2ludGluZyB0byBhbnkKLWFkZHJlc3MgaW5zaWRlIGEgYmxvY2sncyBhZGRyZXNzIHJhbmdlLiBUaGlzIG1heSBsZWFkIHRvIGFuIGluY3JlYXNlZAotbnVtYmVyIG9mIGZhbHNlIG5lZ2F0aXZlcy4gSG93ZXZlciwgaXQgaXMgbGlrZWx5IHRoYXQgYSByZWFsIG1lbW9yeSBsZWFrCi13aWxsIGV2ZW50dWFsbHkgYmVjb21lIHZpc2libGUuCi0KLUFub3RoZXIgc291cmNlIG9mIGZhbHNlIG5lZ2F0aXZlcyBpcyB0aGUgZGF0YSBzdG9yZWQgaW4gbm9uLXBvaW50ZXIKLXZhbHVlcy4gSW4gYSBmdXR1cmUgdmVyc2lvbiwga21lbWxlYWsgY291bGQgb25seSBzY2FuIHRoZSBwb2ludGVyCi1tZW1iZXJzIGluIHRoZSBhbGxvY2F0ZWQgc3RydWN0dXJlcy4gVGhpcyBmZWF0dXJlIHdvdWxkIHNvbHZlIG1hbnkgb2YKLXRoZSBmYWxzZSBuZWdhdGl2ZSBjYXNlcyBkZXNjcmliZWQgYWJvdmUuCi0KLVRoZSB0b29sIGNhbiByZXBvcnQgZmFsc2UgcG9zaXRpdmVzLiBUaGVzZSBhcmUgY2FzZXMgd2hlcmUgYW4gYWxsb2NhdGVkCi1ibG9jayBkb2Vzbid0IG5lZWQgdG8gYmUgZnJlZWQgKHNvbWUgY2FzZXMgaW4gdGhlIGluaXRfY2FsbCBmdW5jdGlvbnMpLAotdGhlIHBvaW50ZXIgaXMgY2FsY3VsYXRlZCBieSBvdGhlciBtZXRob2RzIHRoYW4gdGhlIHVzdWFsIGNvbnRhaW5lcl9vZgotbWFjcm8gb3IgdGhlIHBvaW50ZXIgaXMgc3RvcmVkIGluIGEgbG9jYXRpb24gbm90IHNjYW5uZWQgYnkga21lbWxlYWsuCi0KLVBhZ2UgYWxsb2NhdGlvbnMgYW5kIGlvcmVtYXAgYXJlIG5vdCB0cmFja2VkLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rb19LUi9tZW1vcnktYmFycmllcnMudHh0IGIvRG9jdW1lbnRhdGlvbi9rb19LUi9tZW1vcnktYmFycmllcnMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZDNkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2tvX0tSL21lbW9yeS1iYXJyaWVycy50eHQKQEAgLTAsMCArMSwzMTM1IEBACitOT1RFOgorVGhpcyBpcyBhIHZlcnNpb24gb2YgRG9jdW1lbnRhdGlvbi9tZW1vcnktYmFycmllcnMudHh0IHRyYW5zbGF0ZWQgaW50byBLb3JlYW4uCitUaGlzIGRvY3VtZW50IGlzIG1haW50YWluZWQgYnkgU2VvbmdKYWUgUGFyayA8c2ozOC5wYXJrQGdtYWlsLmNvbT4uCitJZiB5b3UgZmluZCBhbnkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgZG9jdW1lbnQgYW5kIHRoZSBvcmlnaW5hbCBmaWxlIG9yCithIHByb2JsZW0gd2l0aCB0aGUgdHJhbnNsYXRpb24sIHBsZWFzZSBjb250YWN0IHRoZSBtYWludGFpbmVyIG9mIHRoaXMgZmlsZS4KKworUGxlYXNlIGFsc28gbm90ZSB0aGF0IHRoZSBwdXJwb3NlIG9mIHRoaXMgZmlsZSBpcyB0byBiZSBlYXNpZXIgdG8KK3JlYWQgZm9yIG5vbiBFbmdsaXNoIChyZWFkOiBLb3JlYW4pIHNwZWFrZXJzIGFuZCBpcyBub3QgaW50ZW5kZWQgYXMKK2EgZm9yay4gIFNvIGlmIHlvdSBoYXZlIGFueSBjb21tZW50cyBvciB1cGRhdGVzIGZvciB0aGlzIGZpbGUgcGxlYXNlCit1cGRhdGUgdGhlIG9yaWdpbmFsIEVuZ2xpc2ggZmlsZSBmaXJzdC4gIFRoZSBFbmdsaXNoIHZlcnNpb24gaXMKK2RlZmluaXRpdmUsIGFuZCByZWFkZXJzIHNob3VsZCBsb29rIHRoZXJlIGlmIHRoZXkgaGF2ZSBhbnkgZG91YnQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CivsnbQg66y47ISc64qUCitEb2N1bWVudGF0aW9uL21lbW9yeS1iYXJyaWVycy50eHQKK+ydmCDtlZzquIAg67KI7Jet7J6F64uI64ukLgorCivsl63snpDvvJog67CV7ISx7J6sIDxzajM4LnBhcmtAZ21haWwuY29tPgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisJCQkgPT09PT09PT09PT09PT09PT09PT09PT09PQorCQkJIOumrOuIheyKpCDsu6TrhJAg66mU66qo66asIOuwsOumrOyWtAorCQkJID09PT09PT09PT09PT09PT09PT09PT09PT0KKwor7KCA7J6QOiBEYXZpZCBIb3dlbGxzIDxkaG93ZWxsc0ByZWRoYXQuY29tPgorICAgICAgUGF1bCBFLiBNY0tlbm5leSA8cGF1bG1ja0BsaW51eC52bmV0LmlibS5jb20+CisgICAgICBXaWxsIERlYWNvbiA8d2lsbC5kZWFjb25AYXJtLmNvbT4KKyAgICAgIFBldGVyIFppamxzdHJhIDxwZXRlcnpAaW5mcmFkZWFkLm9yZz4KKworPT09PT09PT0KK+uptOyxheyhsO2VrQorPT09PT09PT0KKwor7J20IOusuOyEnOuKlCDrqoXshLjshJzqsIAg7JWE64uZ64uI64ukOyDsnbQg66y47ISc64qUIOyZhOuyve2VmOyngCDslYrsnYDrjbAsIOqwhOqysOyEseydhCDsnITtlbQg7J2Y64+E65CcCivrtoDrtoTrj4Qg7J6I6rOgLCDsnZjrj4TtlZjsp4Qg7JWK7JWY7KeA66eMIOyCrOuejOyXkCDsnZjtlbQg7JOw7JiA64uk67O064uIIOu2iOyZhOyghO2VnCDrtoDrtoTrj4Qg7J6I7Iq164uI64ukLgor7J20IOusuOyEnOuKlCDrpqzriIXsiqTsl5DshJwg7KCc6rO17ZWY64qUIOuLpOyWke2VnCDrqZTrqqjrpqwg67Cw66as7Ja065Ok7J2EIOyCrOyaqe2VmOq4sCDsnITtlZwKK+yViOuCtOyEnOyeheuLiOuLpOunjCwg662U6rCAIOydtOyDge2VmOuLpCDsi7bsnLzrqbQgKOq3uOufsOqyjCDrp47snYQg6rKB64uI64ukKSDsp4jrrLjsnYQg67aA7YOB65Oc66a964uI64ukLgorCivri6Tsi5wg66eQ7ZWY7KeA66eMLCDsnbQg66y47ISc64qUIOumrOuIheyKpOqwgCDtlZjrk5zsm6jslrTsl5Ag6riw64yA7ZWY64qUIOyCrO2VreyXkCDrjIDtlZwg66qF7IS47ISc6rCACivslYTri5nri4jri6QuCisKK+ydtCDrrLjshJzsnZgg66qp7KCB7J2AIOuRkOqwgOyngOyeheuLiOuLpDoKKworICgxKSDslrTrlqQg7Yq57KCVIOuwsOumrOyWtOyXkCDrjIDtlbQg6riw64yA7ZWgIOyImCDsnojripQg7LWc7IaM7ZWc7J2YIOq4sOuKpeydhCDrqoXshLjtlZjquLAg7JyE7ZW07IScLAorICAgICDqt7jrpqzqs6AKKworICgyKSDsgqzsmqkg6rCA64ql7ZWcIOuwsOumrOyWtOuTpOyXkCDrjIDtlbQg7Ja065a76rKMIOyCrOyaqe2VtOyVvCDtlZjripTsp4Dsl5Ag64yA7ZWcIOyViOuCtOulvCDsoJzqs7XtlZjquLAKKyAgICAg7JyE7ZW07IScLgorCivslrTrlqQg7JWE7YKk7YWN7LOQ64qUIO2Kueygle2VnCDrsLDrpqzslrTrk6Tsl5Ag64yA7ZW07ISc64qUIOyXrOq4sOyEnCDsnbTslbzquLDtlZjripQg7LWc7IaM7ZWc7J2YCivsmpTqtazsgqztla3rk6Trs7Tri6Qg66eO7J2AIOq4sOuKpeydhCDsoJzqs7XtlaAg7IiY64+EIOyeiOyKteuLiOuLpOunjCwg7Jes6riw7IScIOydtOyVvOq4sO2VmOuKlAor7JqU6rWs7IKs7ZWt65Ok7J2EIOy2qeyhse2VmOyngCDslYrripQg7JWE7YKk7YWN7LOQ6rCAIOyeiOuLpOuptCDqt7gg7JWE7YKk7YWN7LOQ6rCAIOyemOuqu+uQnCDqsoPsnbTrnoAg7KCQ7J2ECivslYzslYTrkZDsi5zquLAg67CU656N64uI64ukLgorCivrmJDtlZwsIO2KueyglSDslYTtgqTthY3ss5Dsl5DshJwg7J2867aAIOuwsOumrOyWtOuKlCDtlbTri7kg7JWE7YKk7YWN7LOQ7J2YIO2KueyImO2VnCDrj5nsnpEg67Cp7Iud7Jy866GcIOyduO2VtAor7ZW064u5IOuwsOumrOyWtOydmCDrqoXsi5zsoIEg7IKs7Jqp7J20IOu2iO2VhOyalO2VtOyEnCBuby1vcCDsnbQg65Cg7IiY64+EIOyeiOydjOydhCDslYzslYTrkZDsi5zquLAKK+uwlOuejeuLiOuLpC4KKwor7Jet7J6QOiDrs7gg67KI7JetIOyXreyLnCDsmYTrsr3tlZjsp4Ag7JWK7J2A642wLCDsnbQg7Jet7IucIOu2gOu2hOyggeycvOuhnOuKlCDsnZjrj4TrkJwg6rKD7J206riw64+ECivtlanri4jri6QuICDsl6ztg4Ag6riw7IigIOusuOyEnOuTpOydtCDqt7jroIfrk68g7JmE67K97ZWcIOydtO2VtOulvCDsnITtlbTshJzripQg67KI7Jet66y46rO8IOybkOusuOydhCDtlajqu5gKK+ydveycvOyLnOuQmCDrsojsl63rrLjsnYQg7ZWY64KY7J2YIOqwgOydtOuTnOuhnCDtmZzsmqntlZjsi5zquLgg7LaU7LKc65Oc66as66mwLCDrsJzqsqzrkJjripQg7Jik7JetIOuTseyXkAor64yA7ZW07ISc64qUIOyWuOygnOuToCDsnZjqsqzsnYQg67aA7YOB65Oc66a964uI64ukLiAg6rO87ZWcIOuyiOyXreycvOuhnCDsnbjtlZwg7Jik7ZW066W8IOy1nOyGjO2ZlO2VmOq4sCDsnITtlbQKK+yVoOunpO2VnCDrtoDrtoTsnbQg7J6I7J2EIOqyveyasOyXkOuKlCDslrTsg4ntlajsnbQg7J6I642U652864+EIOybkOuemOydmCDsmqnslrTrpbwg7LCo7Jqp7ZWp64uI64ukLgorCisKKz09PT09CivrqqnssKg6Cis9PT09PQorCisgKCopIOy2lOyDgSDrqZTrqqjrpqwg7JWh7IS47IqkIOuqqOuNuC4KKworICAgICAtIOuUlOuwlOydtOyKpCDsmKTtjbzroIjsnbTshZguCisgICAgIC0g67O07J6l7IKs7ZWtLgorCisgKCopIOuplOuqqOumrCDrsLDrpqzslrTrnoAg66y07JeH7J246rCAPworCisgICAgIC0g66mU66qo66asIOuwsOumrOyWtOydmCDsooXrpZguCisgICAgIC0g66mU66qo66asIOuwsOumrOyWtOyXkCDrjIDtlbQg6rCA7KCV7ZW07ISgIOyViOuQoCDqsoMuCisgICAgIC0g642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrQuCisgICAgIC0g7Luo7Yq466GkIOydmOyhtOyEsS4KKyAgICAgLSBTTVAg67Cw66as7Ja0IOynneunnuy2lOq4sC4KKyAgICAgLSDrqZTrqqjrpqwg67Cw66as7Ja0IOyLnO2AgOyKpOydmCDsmIguCisgICAgIC0g7J296riwIOuplOuqqOumrCDrsLDrpqzslrQgdnMg66Gc65OcIOyYiOy4oS4KKyAgICAgLSDsnbTtlonshLEKKworICgqKSDrqoXsi5zsoIEg7Luk64SQIOuwsOumrOyWtC4KKworICAgICAtIOy7tO2MjOydvOufrCDrsLDrpqzslrQuCisgICAgIC0gQ1BVIOuplOuqqOumrCDrsLDrpqzslrQuCisgICAgIC0gTU1JTyDsk7DquLAg67Cw66as7Ja0LgorCisgKCopIOyVlOusteyggSDsu6TrhJAg66mU66qo66asIOuwsOumrOyWtC4KKworICAgICAtIOudvSBBY3F1aXNpdGlvbiDtlajsiJguCisgICAgIC0g7J247YSw65+97Yq4IOu5hO2ZnOyEse2ZlCDtlajsiJguCisgICAgIC0g7Iqs66a96rO8IOybqOydtO2BrOyXhSDtlajsiJguCisgICAgIC0g6re47Jm47J2YIO2VqOyImOuTpC4KKworICgqKSBDUFUg6rCEIEFDUVVJUklORyDrsLDrpqzslrTsnZgg7Zqo6rO8LgorCisgICAgIC0gQWNxdWlyZSB2cyDrqZTrqqjrpqwg7JWh7IS47IqkLgorICAgICAtIEFjcXVpcmUgdnMgSS9PIOyVoeyEuOyKpC4KKworICgqKSDrqZTrqqjrpqwg67Cw66as7Ja06rCAIO2VhOyalO2VnCDqs7MKKworICAgICAtIO2UhOuhnOyEuOyEnOqwhCDsg4HtmLgg7J6R7JqpLgorICAgICAtIOyWtO2GoOuvuSDsmKTtjbzroIjsnbTshZguCisgICAgIC0g65SU67CU7J207IqkIOyVoeyEuOyKpC4KKyAgICAgLSDsnbjthLDrn73tirguCisKKyAoKikg7Luk64SQIEkvTyDrsLDrpqzslrTsnZgg7Zqo6rO8LgorCisgKCopIOqwgOygleuQmOuKlCDqsIDsnqUg7JmE7ZmU65CcIOyLpO2WiSDsiJzshJwg66qo6424LgorCisgKCopIENQVSDsupDsi5zsnZgg7JiB7ZalLgorCisgICAgIC0g7LqQ7IucIOydvOq0gOyEsS4KKyAgICAgLSDsupDsi5wg7J286rSA7ISxIHZzIERNQS4KKyAgICAgLSDsupDsi5wg7J286rSA7ISxIHZzIE1NSU8uCisKKyAoKikgQ1BVIOuTpOydtCDsoIDsp4DrpbTripQg7J2865OkLgorCisgICAgIC0g6re466as6rOgLCBBbHBoYSDqsIAg7J6I64ukLgorICAgICAtIOqwgOyDgSDrqLjsi6Ag6rKM7Iqk7Yq4LgorCisgKCopIOyCrOyaqSDsmIguCisKKyAgICAgLSDsiJztmZjsi50g67KE7Y28LgorCisgKCopIOywuOqzoCDrrLjtl4wuCisKKworPT09PT09PT09PT09PT09PT09PT09PT0KK+y2lOyDgSDrqZTrqqjrpqwg7JWh7IS47IqkIOuqqOuNuAorPT09PT09PT09PT09PT09PT09PT09PT0KKwor64uk7J2M6rO8IOqwmeydtCDstpTsg4HtmZTrkJwg7Iuc7Iqk7YWcIOuqqOuNuOydhCDsg53qsIHtlbQg67SF7Iuc64ukOgorCisJCSAgICAgICAgICAgIDogICAgICAgICAgICAgICAgOgorCQkgICAgICAgICAgICA6ICAgICAgICAgICAgICAgIDoKKwkJICAgICAgICAgICAgOiAgICAgICAgICAgICAgICA6CisJCSstLS0tLS0tKyAgIDogICArLS0tLS0tLS0rICAgOiAgICstLS0tLS0tKworCQl8ICAgICAgIHwgICA6ICAgfCAgICAgICAgfCAgIDogICB8ICAgICAgIHwKKwkJfCAgICAgICB8ICAgOiAgIHwgICAgICAgIHwgICA6ICAgfCAgICAgICB8CisJCXwgQ1BVIDEgfDwtLS0tLT58IE1lbW9yeSB8PC0tLS0tPnwgQ1BVIDIgfAorCQl8ICAgICAgIHwgICA6ICAgfCAgICAgICAgfCAgIDogICB8ICAgICAgIHwKKwkJfCAgICAgICB8ICAgOiAgIHwgICAgICAgIHwgICA6ICAgfCAgICAgICB8CisJCSstLS0tLS0tKyAgIDogICArLS0tLS0tLS0rICAgOiAgICstLS0tLS0tKworCQkgICAgXiAgICAgICA6ICAgICAgIF4gICAgICAgIDogICAgICAgXgorCQkgICAgfCAgICAgICA6ICAgICAgIHwgICAgICAgIDogICAgICAgfAorCQkgICAgfCAgICAgICA6ICAgICAgIHwgICAgICAgIDogICAgICAgfAorCQkgICAgfCAgICAgICA6ICAgICAgIHYgICAgICAgIDogICAgICAgfAorCQkgICAgfCAgICAgICA6ICAgKy0tLS0tLS0tKyAgIDogICAgICAgfAorCQkgICAgfCAgICAgICA6ICAgfCAgICAgICAgfCAgIDogICAgICAgfAorCQkgICAgfCAgICAgICA6ICAgfCAgICAgICAgfCAgIDogICAgICAgfAorCQkgICAgKy0tLS0tLS0tLS0+fCBEZXZpY2UgfDwtLS0tLS0tLS0tKworCQkgICAgICAgICAgICA6ICAgfCAgICAgICAgfCAgIDoKKwkJICAgICAgICAgICAgOiAgIHwgICAgICAgIHwgICA6CisJCSAgICAgICAgICAgIDogICArLS0tLS0tLS0rICAgOgorCQkgICAgICAgICAgICA6ICAgICAgICAgICAgICAgIDoKKwor7ZSE66Gc6re4656o7J2AIOyXrOufrCDrqZTrqqjrpqwg7JWh7IS47IqkIOyYpO2NvOugiOydtOyFmOydhCDrsJzsg53si5ztgqTqs6AsIOqwgeqwgeydmCBDUFUg64qUIOq3uOufsAor7ZSE66Gc6re4656o65Ok7J2EIOyLpO2Wie2VqeuLiOuLpC4gIOy2lOyDge2ZlOuQnCBDUFUg66qo64247JeQ7IScIOuplOuqqOumrCDsmKTtjbzroIjsnbTshZjrk6TsnZgg7Iic7ISc64qUCivrp6TsmrAg7JmE7ZmU65CY7Ja0IOyeiOqzoCwgQ1BVIOuKlCDtlITroZzqt7jrnqjsnbQg7J246rO86rSA6rOE66W8IOyWtOq4sOyngCDslYrripQg7IOB7YOc66GcIOq0gOumrOuQnOuLpOqzoAor67O07J28IOyImOunjCDsnojri6TrqbQg66mU66qo66asIOyYpO2NvOugiOydtOyFmOydhCDsnpDsi6DsnbQg7JuQ7ZWY64qUIOyWtOuWpCDsiJzshJzrjIDroZzrk6Ag7J6s67Cw7LmY7ZW0Civrj5nsnpHsi5ztgqwg7IiYIOyeiOyKteuLiOuLpC4gIOu5hOyKt+2VmOqyjCwg7Lu07YyM7J2865+sIOuYkO2VnCDtlITroZzqt7jrnqjsnZgg7KCV7IOB7KCBIOuPmeyekeydhCDtlbTsuZjsp4AKK+yViuuKlCDtlZzrj4Qg64K07JeQ7ISc64qUIOyWtOuWpCDsiJzshJzroZzrk6Ag7J6Q7Iug7J20IOybkO2VmOuKlCDrjIDroZwg7J247Iqk7Yq465+t7IWY7J2EIOyerOuwsOy5mCDtlaAg7IiYCivsnojsirXri4jri6QuCisKK+uUsOudvOyEnCDsnITsnZgg64uk7J207Ja06re4656o7JeQ7IScIO2VnCBDUFXqsIAg64+Z7J6R7Iuc7YKk64qUIOuplOuqqOumrCDsmKTtjbzroIjsnbTshZjsnbQg66eM65Ok7Ja064K064qUCivrs4DtmZTripQg7ZW064u5IOyYpO2NvOugiOydtOyFmOydtCBDUFUg7JmAIOyLnOyKpO2FnOydmCDri6Trpbgg67aA67aE65OkIOyCrOydtOydmCDsnbjthLDtjpjsnbTsiqQo7KCQ7ISgKeulvAor7KeA64KY6rCA66m07IScIOyLnOyKpO2FnOydmCDrgpjrqLjsp4Ag67aA67aE65Ok7JeQIOyduOyngOuQqeuLiOuLpC4KKworCivsmIjrpbwg65Ok7Ja0LCDri6TsnYzsnZgg7J2866Co7J2YIOydtOuypO2KuOuTpOydhCDsg53qsIHtlbQg67SF7Iuc64ukOgorCisJQ1BVIDEJCUNQVSAyCisJPT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PQorCXsgQSA9PSAxOyBCID09IDIgfQorCUEgPSAzOwkJeCA9IEI7CisJQiA9IDQ7CQl5ID0gQTsKKwor64uk7J207Ja06re4656o7J2YIOqwgOyatOuNsOyXkCDsnITsuZjtlZwg66mU66qo66asIOyLnOyKpO2FnOyXkCDrs7Tsl6zsp4Dqsowg65CY64qUIOyVoeyEuOyKpOuTpOydgCDri6TsnYzsnZgg7LSdCisyNOqwnOydmCDsobDtlansnLzroZwg7J6s6rWs7ISx65CgIOyImCDsnojsirXri4jri6Q6CisKKwlTVE9SRSBBPTMsCVNUT1JFIEI9NCwJeT1MT0FEIEEtPjMsCXg9TE9BRCBCLT40CisJU1RPUkUgQT0zLAlTVE9SRSBCPTQsCXg9TE9BRCBCLT40LAl5PUxPQUQgQS0+MworCVNUT1JFIEE9MywJeT1MT0FEIEEtPjMsCVNUT1JFIEI9NCwJeD1MT0FEIEItPjQKKwlTVE9SRSBBPTMsCXk9TE9BRCBBLT4zLAl4PUxPQUQgQi0+MiwJU1RPUkUgQj00CisJU1RPUkUgQT0zLAl4PUxPQUQgQi0+MiwJU1RPUkUgQj00LAl5PUxPQUQgQS0+MworCVNUT1JFIEE9MywJeD1MT0FEIEItPjIsCXk9TE9BRCBBLT4zLAlTVE9SRSBCPTQKKwlTVE9SRSBCPTQsCVNUT1JFIEE9MywJeT1MT0FEIEEtPjMsCXg9TE9BRCBCLT40CisJU1RPUkUgQj00LCAuLi4KKwkuLi4KKwor65Sw65287IScIOuLpOydjOydmCDrhKTqsIDsp4Ag7KGw7ZWp7J2YIOqwkuuTpOydtCDrgpjsmKwg7IiYIOyeiOyKteuLiOuLpDoKKworCXggPT0gMiwgeSA9PSAxCisJeCA9PSAyLCB5ID09IDMKKwl4ID09IDQsIHkgPT0gMQorCXggPT0gNCwgeSA9PSAzCisKKwor7ZWc67CcIOuNlCDrgpjslYTqsIDshJwsIO2VnCBDUFUg6rCAIOuplOuqqOumrCDsi5zsiqTthZzsl5Ag67CY7JiB7ZWcIOyKpO2GoOyWtCDsmKTtjbzroIjsnbTshZjrk6TsnZgg6rKw6rO864qUCivri6TrpbggQ1BVIOyXkOyEnOydmCDroZzrk5wg7Jik7Y2866CI7J207IWY7J2EIO2Gte2VtCDsnbjsp4DrkJjripTrjbAsIOydtCDrlYwg7Iqk7Yag7Ja06rCAIOuwmOyYgeuQnCDsiJzshJzsmYAKK+uLpOuluCDsiJzshJzroZwg7J247KeA65CgIOyImOuPhCDsnojsirXri4jri6QuCisKKwor7JiI66GcLCDslYTrnpjsnZgg7J2866Co7J2YIOydtOuypO2KuOuTpOydhCDsg53qsIHtlbQg67SF7Iuc64ukOgorCisJQ1BVIDEJCUNQVSAyCisJPT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PQorCXsgQSA9PSAxLCBCID09IDIsIEMgPT0gMywgUCA9PSAmQSwgUSA9PSAmQyB9CisJQiA9IDQ7CQlRID0gUDsKKwlQID0gJkIJCUQgPSAqUTsKKworRCDroZwg7J297ZiA7KeA64qUIOqwkuydgCBDUFUgMiDsl5DshJwgUCDroZzrtoDthLAg7J297ZiA7KeEIOyjvOyGjOqwkuyXkCDsnZjsobTsoIHsnbTquLAg65WM66y47JeQIOyXrOq4sOyXlAor67aE66qF7ZWcIOuNsOydtO2EsCDsnZjsobTshLHsnbQg7J6I7Iq164uI64ukLiAg7ZWY7KeA66eMIOydtCDsnbTrsqTtirjrk6TsnZgg7Iuk7ZaJIOqysOqzvOuhnOuKlCDslYTrnpjsnZgKK+qysOqzvOuTpOydtCDrqqjrkZAg64KY7YOA64KgIOyImCDsnojsirXri4jri6Q6CisKKwkoUSA9PSAmQSkgYW5kIChEID09IDEpCisJKFEgPT0gJkIpIGFuZCAoRCA9PSAyKQorCShRID09ICZCKSBhbmQgKEQgPT0gNCkKKworQ1BVIDIg64qUICpRIOydmCDroZzrk5zrpbwg7JqU7LKt7ZWY6riwIOyghOyXkCBQIOulvCBRIOyXkCDrhKPquLAg65WM66y47JeQIEQg7JeQIEMg66W8IOynkeyWtOuEo+uKlAor7J287J2AIOyXhuydjOydhCDslYzslYTrkZDshLjsmpQuCisKKwor65SU67CU7J207IqkIOyYpO2NvOugiOydtOyFmAorLS0tLS0tLS0tLS0tLS0tLS0tLQorCivsnbzrtoAg65SU67CU7J207Iqk64qUIOyekOyLoOydmCDsu6jtirjroaQg7J247YSw7Y6Y7J207Iqk66W8IOuplOuqqOumrOydmCDtirnsoJUg7JiB7Jet7Jy866GcIOunpO2Vke2VtOyEnAor7KCc6rO17ZWY64qU642wKE1lbW9yeSBtYXBwZWQgSS9PKSwg7ZW064u5IOy7qO2KuOuhpCDroIjsp4DsiqTthLDsl5Ag7KCR6re87ZWY64qUIOyInOyEnOuKlCDrp6TsmrAKK+ykkeyalO2VqeuLiOuLpC4gIOyYiOulvCDrk6TslrQsIOyWtOuTnOugiOyKpCDtj6ztirgg66CI7KeA7Iqk7YSwIChBKSDsmYAg642w7J207YSwIO2PrO2KuCDroIjsp4DsiqTthLAgKEQpCivrpbwg7Ya17ZW0IOygkeq3vOuQmOuKlCDrgrTrtoAg66CI7KeA7Iqk7YSwIOynke2VqeydhCDqsJbripQg7J20642U64S3IOy5tOuTnOulvCDsg53qsIHtlbQg67SF7Iuc64ukLiAg64K067aA7J2YCis167KIIOugiOyngOyKpO2EsOulvCDsnb3quLAg7JyE7ZW0IOuLpOydjOydmCDsvZTrk5zqsIAg7IKs7Jqp65CgIOyImCDsnojsirXri4jri6Q6CisKKwkqQSA9IDU7CisJeCA9ICpEOworCivtlZjsp4Drp4wsIOydtOqxtCDri6TsnYzsnZgg65GQIOyhsO2VqSDspJEg7ZWY64KY66GcIOunjOuTpOyWtOyniCDsiJgg7J6I7Iq164uI64ukOgorCisJU1RPUkUgKkEgPSA1LCB4ID0gTE9BRCAqRAorCXggPSBMT0FEICpELCBTVE9SRSAqQSA9IDUKKwor65GQ67KI7Ke4IOyhsO2VqeydgCDrjbDsnbTthLDrpbwg7J297Ja07JioIF/tm4Tsl5BfIOyjvOyGjOulvCDshKTsoJXtlZjrr4DroZwsIOyYpOuPmeyekeydhCDsnbzsnLztgqwg6rKB64uI64ukLgorCisKK+uztOyepeyCrO2VrQorLS0tLS0tLS0KKworQ1BVIOyXkOqyjCDquLDrjIDtlaAg7IiYIOyeiOuKlCDstZzshoztlZzsnZgg67O07J6l7IKs7ZWtIOuqh+qwgOyngOqwgCDsnojsirXri4jri6Q6CisKKyAoKikg7Ja065akIENQVSDrk6AsIOydmOyhtOyEseydtCDsobTsnqztlZjripQg66mU66qo66asIOyVoeyEuOyKpOuTpOydgCDtlbTri7kgQ1BVIOyekOyLoOyXkOqyjAorICAgICDsnojslrTshJzripQg7Iic7ISc64yA66GcIOuplOuqqOumrCDsi5zsiqTthZzsl5Ag7IiY7ZaJIOyalOyyreuQqeuLiOuLpC4g7KaJLCDri6TsnYzsl5Ag64yA7ZW07IScOgorCisJUSA9IFJFQURfT05DRShQKTsgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCk7IEQgPSBSRUFEX09OQ0UoKlEpOworCisgICAgIENQVSDripQg64uk7J2M6rO8IOqwmeydgCDrqZTrqqjrpqwg7Jik7Y2866CI7J207IWYIOyLnO2AgOyKpOulvCDsiJjtlokg7JqU7LKt7ZWp64uI64ukOgorCisJUSA9IExPQUQgUCwgRCA9IExPQUQgKlEKKworICAgICDqt7jrpqzqs6Ag6re4IOyLnO2AgOyKpCDrgrTsl5DshJzsnZgg7Iic7ISc64qUIO2VreyDgSDsp4DsvJzsp5Hri4jri6QuICDrjIDrtoDrtoTsnZgg7Iuc7Iqk7YWc7JeQ7IScCisgICAgIHNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpIOuKlCDslYTrrLTsnbzrj4Qg7JWI7ZWY7KeA66eMIERFQyBBbHBoYSDsl5DshJzripQKKyAgICAg66qF7Iuc7KCB7Jy866GcIOyCrOyaqeuQmOyWtOyVvCDtlanri4jri6QuICDrs7TthrXsnZgg6rK97Jqw7JeQ64qUIHNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpCisgICAgIOulvCDsp4HsoJEg7IKs7Jqp7ZWY64qUIOuMgOyLoCByY3VfZGVyZWZlcmVuY2UoKSDqsJnsnYAg6rKD65Ok7J2EIOyCrOyaqe2VtOyVvCDtlajsnYQKKyAgICAg7JWM7JWE65GQ7IS47JqULgorCisgKCopIO2KueyglSBDUFUg64K07JeQ7IScIOqyuey5mOuKlCDsmIHsl63snZgg66mU66qo66as7JeQIO2Wie2VtOyngOuKlCDroZzrk5zsmYAg7Iqk7Yag7Ja0IOuTpOydgCDtlbTri7kKKyAgICAgQ1BVIOyViOyXkOyEnOuKlCDsiJzshJzqsIAg67CU64CM7KeAIOyViuydgCDqsoPsnLzroZwg67O07Jes7KeR64uI64ukLiAg7KaJLCDri6TsnYzsl5Ag64yA7ZW07IScOgorCisJYSA9IFJFQURfT05DRSgqWCk7IFdSSVRFX09OQ0UoKlgsIGIpOworCisgICAgIENQVSDripQg64uk7J2M7J2YIOuplOuqqOumrCDsmKTtjbzroIjsnbTshZgg7Iuc7YCA7Iqk66eM7J2EIOuplOuqqOumrOyXkCDsmpTssq3tlaAg6rKB64uI64ukOgorCisJYSA9IExPQUQgKlgsIFNUT1JFICpYID0gYgorCisgICAgIOq3uOumrOqzoCDri6TsnYzsl5Ag64yA7ZW07ISc64qUOgorCisJV1JJVEVfT05DRSgqWCwgYyk7IGQgPSBSRUFEX09OQ0UoKlgpOworCisgICAgIENQVSDripQg64uk7J2M7J2YIOyImO2WiSDsmpTssq3rp4zsnYQg66eM65Ok7Ja0IOuDheuLiOuLpDoKKworCVNUT1JFICpYID0gYywgZCA9IExPQUQgKlgKKworICAgICAo66Gc65OcIOyYpO2NvOugiOydtOyFmOqzvCDsiqTthqDslrQg7Jik7Y2866CI7J207IWY7J20IOqyuey5mOuKlCDrqZTrqqjrpqwg7JiB7Jet7JeQIOuMgO2VtAorICAgICDsiJjtlonrkJzri6TrqbQg7ZW064u5IOyYpO2NvOugiOydtOyFmOuTpOydgCDqsrnsuZzri6Tqs6Ag7ZGc7ZiE65Cp64uI64ukKS4KKwor6re466as6rOgIF/rsJjrk5zsi5xfIOuYkOuKlCBf7KCI64yA66GcXyDqsIDsoJXtlZjqsbDrgpgg6rCA7KCV7ZWY7KeAIOunkOyVhOyVvCDtlZjripQg6rKD65Ok7J20IOyeiOyKteuLiOuLpDoKKworICgqKSDsu7TtjIzsnbzrn6zqsIAgUkVBRF9PTkNFKCkg64KYIFdSSVRFX09OQ0UoKSDroZwg67O07Zi465CY7KeAIOyViuydgCDrqZTrqqjrpqwg7JWh7IS47Iqk66W8CisgICAgIOuLueyLoOydtCDsm5DtlZjripQg64yA66GcIO2VoCDqsoPsnbTrnbzripQg6rCA7KCV7J2AIF/soIjrjIDroZxfIO2VtOyEoCDslYjrkKnri4jri6QuICDqt7jqsoPrk6TsnbQKKyAgICAg7JeG64uk66m0LCDsu7TtjIzsnbzrn6zripQg7Lu07YyM7J2865+sIOuwsOumrOyWtCDshLnshZjsl5DshJwg64uk66Oo6rKMIOuQoCwg66qo65OgICLssL3snZjsoIHsnbgiCisgICAgIOuzgOqyveuTpOydhCDrp4zrk6TslrTrgrwg6raM7ZWc7J2EIOqwluqyjCDrkKnri4jri6QuCisKKyAoKikg6rCc67OE7KCB7J24IOuhnOuTnOyZgCDsiqTthqDslrTrk6TsnbQg7KO87Ja07KeEIOyInOyEnOuMgOuhnCDsmpTssq3rkKAg6rKD7J20652864qUIOqwgOygleydgCBf7KCI64yA66GcXworICAgICDtlZjsp4Ag66eQ7JWE7JW8IO2VqeuLiOuLpC4gIOydtCDrp5DsnYAg6rOnOgorCisJWCA9ICpBOyBZID0gKkI7ICpEID0gWjsKKworICAgICDripQg64uk7J2M7J2YIOqyg+uTpCDspJEg7Ja064qQIOqyg+ycvOuhnOuToCDrp4zrk6TslrTsp4gg7IiYIOyeiOuLpOuKlCDsnZjrr7jsnoXri4jri6Q6CisKKwlYID0gTE9BRCAqQSwgIFkgPSBMT0FEICpCLCAgU1RPUkUgKkQgPSBaCisJWCA9IExPQUQgKkEsICBTVE9SRSAqRCA9IFosIFkgPSBMT0FEICpCCisJWSA9IExPQUQgKkIsICBYID0gTE9BRCAqQSwgIFNUT1JFICpEID0gWgorCVkgPSBMT0FEICpCLCAgU1RPUkUgKkQgPSBaLCBYID0gTE9BRCAqQQorCVNUT1JFICpEID0gWiwgWCA9IExPQUQgKkEsICBZID0gTE9BRCAqQgorCVNUT1JFICpEID0gWiwgWSA9IExPQUQgKkIsICBYID0gTE9BRCAqQQorCisgKCopIOqyuey5mOuKlCDrqZTrqqjrpqwg7JWh7IS47Iqk65Ok7J2AIO2VqeyzkOyngOqxsOuCmCDrsoTroKTsp4gg7IiYIOyeiOydjOydhCBf67CY65Oc7IucXyDqsIDsoJXtlbTslbwKKyAgICAg7ZWp64uI64ukLiAg64uk7J2M7J2YIOy9lOuTnOuKlDoKKworCVggPSAqQTsgWSA9ICooQSArIDQpOworCisgICAgIOuLpOydjOydmCDqsoPrk6Qg7KSRIOutkOuToCDrkKAg7IiYIOyeiOyKteuLiOuLpDoKKworCVggPSBMT0FEICpBOyBZID0gTE9BRCAqKEEgKyA0KTsKKwlZID0gTE9BRCAqKEEgKyA0KTsgWCA9IExPQUQgKkE7CisJe1gsIFl9ID0gTE9BRCB7KkEsICooQSArIDQpIH07CisKKyAgICAg6re466as6rOgOgorCisJKkEgPSBYOyAqKEEgKyA0KSA9IFk7CisKKyAgICAg64qUIOuLpOydjCDspJEg662Q65OgIOuQoCDsiJgg7J6I7Iq164uI64ukOgorCisJU1RPUkUgKkEgPSBYOyBTVE9SRSAqKEEgKyA0KSA9IFk7CisJU1RPUkUgKihBICsgNCkgPSBZOyBTVE9SRSAqQSA9IFg7CisJU1RPUkUgeypBLCAqKEEgKyA0KSB9ID0ge1gsIFl9OworCivqt7jrpqzqs6Ag67O07J6l7IKs7ZWt7JeQIOuwmOuMgOuQmOuKlCDqsoPrk6QoYW50aS1ndWFyYW50ZWVzKeydtCDsnojsirXri4jri6Q6CisKKyAoKikg7J20IOuztOyepeyCrO2VreuTpOydgCBiaXRmaWVsZCDsl5DripQg7KCB7Jqp65CY7KeAIOyViuuKlOuNsCwg7Lu07YyM7J2865+s65Ok7J2AIGJpdGZpZWxkIOulvAorICAgICDsiJjsoJXtlZjripQg7L2U65Oc66W8IOyDneyEse2VoCDrlYwg7JuQ7J6Q7ISxIOyXhuuKlChub24tYXRvbWljKSDsnb3qs6At7IiY7KCV7ZWY6rOgLeyTsOuKlAorICAgICDsnbjsiqTtirjrn63shZjrk6TsnZgg7KGw7ZWp7J2EIOunjOuTnOuKlCDqsr3smrDqsIAg66eO6riwIOuVjOusuOyeheuLiOuLpC4gIOuzkeugrCDslYzqs6DrpqzsppjsnZgKKyAgICAg64+Z6riw7ZmU7JeQIGJpdGZpZWxkIOulvCDsgqzsmqntlZjroKQg7ZWY7KeAIOuniOyLreyLnOyYpC4KKworICgqKSBiaXRmaWVsZCDrk6TsnbQg7Jes65+sIOudveycvOuhnCDrs7TtmLjrkJjripQg6rK97Jqw6528IO2VmOuNlOudvOuPhCwg7ZWY64KY7J2YIGJpdGZpZWxkIOydmAorICAgICDrqqjrk6Ag7ZWE65Oc65Ok7J2AIO2VmOuCmOydmCDrnb3snLzroZwg67O07Zi465CY7Ja07JW8IO2VqeuLiOuLpC4gIOunjOyVvSDtlZwgYml0ZmllbGQg7J2YIOuRkAorICAgICDtlYTrk5zqsIAg7ISc66GcIOuLpOuluCDrnb3snLzroZwg67O07Zi465Cc64uk66m0LCDsu7TtjIzsnbzrn6zsnZgg7JuQ7J6Q7ISxIOyXhuuKlAorICAgICDsnb3qs6At7IiY7KCV7ZWY6rOgLeyTsOuKlCDsnbjsiqTtirjrn63shZgg7KGw7ZWp7J2AIO2VnCDtlYTrk5zsl5DsnZgg7JeF642w7J207Yq46rCAIOq3vOyymOydmAorICAgICDtlYTrk5zsl5Drj4Qg7JiB7Zal7J2EIOuBvOy5mOqyjCDtlaAg7IiYIOyeiOyKteuLiOuLpC4KKworICgqKSDsnbQg67O07J6l7IKs7ZWt65Ok7J2AIOyggeygiO2VmOqyjCDsoJXroKzrkJjqs6Ag7YGs6riw6rCAIOyeoe2ejCDsiqTsubzrnbwg67OA7IiY65Ok7JeQIOuMgO2VtOyEnOunjAorICAgICDsoIHsmqnrkKnri4jri6QuICAi7KCB7KCI7ZWY6rKMIO2BrOq4sOqwgCDsnqHtnowiIOydtOudvO2VqOydgCDtmITsnqzroZzsjajripQgImNoYXIiLCAic2hvcnQiLAorICAgICAiaW50IiDqt7jrpqzqs6AgImxvbmciIOqzvCDqsJnsnYAg7YGs6riw7J2YIOuzgOyImOuTpOydhCDsnZjrr7jtlanri4jri6QuICAi7KCB7KCI7ZWY6rKMIOygleugrOuQnCIKKyAgICAg7J2AIOyekOyXsOyKpOufsCDsoJXroKzsnYQg7J2Y66+47ZWY64qU642wLCDrlLDrnbzshJwgImNoYXIiIOyXkCDrjIDtlbTshJzripQg7JWE66y0IOygnOyVveydtCDsl4bqs6AsCisgICAgICJzaG9ydCIg7JeQIOuMgO2VtOyEnOuKlCAy67CU7J207Yq4IOygleugrOydhCwgImludCIg7JeQ64qUIDTrsJTsnbTtirgg7KCV66Cs7J2ELCDqt7jrpqzqs6AKKyAgICAgImxvbmciIOyXkCDrjIDtlbTshJzripQgMzItYml0IOyLnOyKpO2FnOyduOyngCA2NC1iaXQg7Iuc7Iqk7YWc7J247KeA7JeQIOuUsOudvCA067CU7J207Yq4IOuYkOuKlAorICAgICA467CU7J207Yq4IOygleugrOydhCDsnZjrr7jtlanri4jri6QuICDsnbQg67O07J6l7IKs7ZWt65Ok7J2AIEMxMSDtkZzspIDsl5DshJwg7IaM6rCc65CY7JeI7Jy866+A66GcLAorICAgICBDMTEg7KCE7J2YIOyYpOuemOuQnCDsu7TtjIzsnbzrn6wo7JiI66W8IOuTpOyWtCwgZ2NjIDQuNikg66W8IOyCrOyaqe2VoCDrlYzsl5Qg7KO87J2Y7ZWY7Iuc6riwCisgICAgIOuwlOuejeuLiOuLpC4gIO2RnOykgOyXkCDsnbQg67O07J6l7IKs7ZWt65Ok7J2AICJtZW1vcnkgbG9jYXRpb24iIOydhCDsoJXsnZjtlZjripQgMy4xNAorICAgICDshLnshZjsl5Ag64uk7J2M6rO8IOqwmeydtCDshKTrqoXrkJjslrQg7J6I7Iq164uI64ukOgorICAgICAo7Jet7J6QOiDsnbjsmqnrrLjsnbTrr4DroZwg67KI7Jet7ZWY7KeAIOyViuyKteuLiOuLpCkKKworCW1lbW9yeSBsb2NhdGlvbgorCQllaXRoZXIgYW4gb2JqZWN0IG9mIHNjYWxhciB0eXBlLCBvciBhIG1heGltYWwgc2VxdWVuY2UKKwkJb2YgYWRqYWNlbnQgYml0LWZpZWxkcyBhbGwgaGF2aW5nIG5vbnplcm8gd2lkdGgKKworCQlOT1RFIDE6IFR3byB0aHJlYWRzIG9mIGV4ZWN1dGlvbiBjYW4gdXBkYXRlIGFuZCBhY2Nlc3MKKwkJc2VwYXJhdGUgbWVtb3J5IGxvY2F0aW9ucyB3aXRob3V0IGludGVyZmVyaW5nIHdpdGgKKwkJZWFjaCBvdGhlci4KKworCQlOT1RFIDI6IEEgYml0LWZpZWxkIGFuZCBhbiBhZGphY2VudCBub24tYml0LWZpZWxkIG1lbWJlcgorCQlhcmUgaW4gc2VwYXJhdGUgbWVtb3J5IGxvY2F0aW9ucy4gVGhlIHNhbWUgYXBwbGllcworCQl0byB0d28gYml0LWZpZWxkcywgaWYgb25lIGlzIGRlY2xhcmVkIGluc2lkZSBhIG5lc3RlZAorCQlzdHJ1Y3R1cmUgZGVjbGFyYXRpb24gYW5kIHRoZSBvdGhlciBpcyBub3QsIG9yIGlmIHRoZSB0d28KKwkJYXJlIHNlcGFyYXRlZCBieSBhIHplcm8tbGVuZ3RoIGJpdC1maWVsZCBkZWNsYXJhdGlvbiwKKwkJb3IgaWYgdGhleSBhcmUgc2VwYXJhdGVkIGJ5IGEgbm9uLWJpdC1maWVsZCBtZW1iZXIKKwkJZGVjbGFyYXRpb24uIEl0IGlzIG5vdCBzYWZlIHRvIGNvbmN1cnJlbnRseSB1cGRhdGUgdHdvCisJCWJpdC1maWVsZHMgaW4gdGhlIHNhbWUgc3RydWN0dXJlIGlmIGFsbCBtZW1iZXJzIGRlY2xhcmVkCisJCWJldHdlZW4gdGhlbSBhcmUgYWxzbyBiaXQtZmllbGRzLCBubyBtYXR0ZXIgd2hhdCB0aGUKKwkJc2l6ZXMgb2YgdGhvc2UgaW50ZXJ2ZW5pbmcgYml0LWZpZWxkcyBoYXBwZW4gdG8gYmUuCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PQor66mU66qo66asIOuwsOumrOyWtOuegCDrrLTsl4fsnbjqsIA/Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisKK+yVnuyXkOyEnCDrtKTrk6/snbQsIOyDge2YuOqwhCDsnZjsobTshLHsnbQg7JeG64qUIOuplOuqqOumrCDsmKTtjbzroIjsnbTshZjrk6TsnYAg7Iuk7KCc66Gc64qUIOustOyekeychOyggQor7Iic7ISc66GcIOyImO2WieuQoCDsiJgg7J6I7Jy866mwLCDsnbTripQgQ1BVIOyZgCBDUFUg6rCE7J2YIOyDge2YuOyekeyaqeydtOuCmCBJL08g7JeQIOusuOygnOqwgCDrkKAg7IiYCivsnojsirXri4jri6QuICDrlLDrnbzshJwg7Lu07YyM7J2865+s7JmAIENQVSDqsIAg7Iic7ISc66W8IOuwlOq+uOuKlOuNsCDsoJzslb3snYQg6rG4IOyImCDsnojrj4TroZ0g6rCc7J6F7ZWgCivsiJgg7J6I64qUIOyWtOuWpCDrsKnrspXsnbQg7ZWE7JqU7ZWp64uI64ukLgorCivrqZTrqqjrpqwg67Cw66as7Ja064qUIOq3uOufsCDqsJzsnoUg7IiY64uo7J6F64uI64ukLiAg66mU66qo66asIOuwsOumrOyWtOuKlCDrsLDrpqzslrTrpbwg7IKs7J207JeQIOuRlCDslZ7qs7wKK+uSpCDslpHsuKHsnZgg66mU66qo66asIOyYpO2NvOugiOydtOyFmOuTpCDqsITsl5Ag67aA67aE7KCBIOyInOyEnOqwgCDsobTsnqztlZjrj4TroZ0g7ZWY64qUIO2aqOqzvOulvCDspI3ri4jri6QuCisKK+yLnOyKpO2FnOydmCBDUFUg65Ok6rO8IOyXrOufrCDrlJTrsJTsnbTsiqTrk6TsnYAg7ISx64ql7J2EIOyYrOumrOq4sCDsnITtlbQg66qF66C57Ja0IOyerOuwsOy5mCwg7Iuk7ZaJCivsnKDsmIgsIOuplOuqqOumrCDsmKTtjbzroIjsnbTshZjrk6TsnZgg7KGw7ZWpLCDsmIjsuKHsoIEg66Gc65OcKHNwZWN1bGF0aXZlIGxvYWQpLCDruIzrnpzsuZgKK+yYiOy4oShzcGVjdWxhdGl2ZSBicmFuY2ggcHJlZGljdGlvbiksIOuLpOyWke2VnCDsooXrpZjsnZgg7LqQ7IuxKGNhY2hpbmcpIOuTseydmCDri6TslpHtlZwKK+2KuOumreydhCDsgqzsmqntlaAg7IiYIOyeiOq4sCDrlYzrrLjsl5Ag7J2065+wIOqwleygnOugpeydgCDspJHsmpTtlanri4jri6QuICDrqZTrqqjrpqwg67Cw66as7Ja065Ok7J2AIOydtOufsAor7Yq466at65Ok7J2EIOustO2aqOuhnCDtlZjqsbDrgpgg7Ja17KCc7ZWY64qUIOuqqeyggeycvOuhnCDsgqzsmqnrkJjslrTsoLjshJwg7L2U65Oc6rCAIOyXrOufrCBDUFUg7JmACivrlJTrsJTsnbTsiqTrk6Qg6rCE7J2YIOyDge2YuOyekeyaqeydhCDsoJXsg4HsoIHsnLzroZwg7KCc7Ja07ZWgIOyImCDsnojqsowg7ZW07KSN64uI64ukLgorCisKK+uplOuqqOumrCDrsLDrpqzslrTsnZgg7KKF66WYCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCivrqZTrqqjrpqwg67Cw66as7Ja064qUIOuEpOqwnOydmCDquLDrs7gg7YOA7J6F7Jy866GcIOu2hOulmOuQqeuLiOuLpDoKKworICgxKSDsk7DquLAgKOuYkOuKlCDsiqTthqDslrQpIOuplOuqqOumrCDrsLDrpqzslrQuCisKKyAgICAg7JOw6riwIOuplOuqqOumrCDrsLDrpqzslrTripQg7Iuc7Iqk7YWc7J2YIOuLpOuluCDsu7Ttj6zrhIztirjrk6Tsl5Ag7ZW064u5IOuwsOumrOyWtOuztOuLpCDslZ7shJwKKyAgICAg66qF7Iuc65CcIOuqqOuToCBTVE9SRSDsmKTtjbzroIjsnbTshZjrk6TsnbQg7ZW064u5IOuwsOumrOyWtCDrkqTsl5Ag66qF7Iuc65CcIOuqqOuToCBTVE9SRQorICAgICDsmKTtjbzroIjsnbTshZjrk6Trs7Tri6Qg66i87KCAIOyImO2WieuQnCDqsoPsnLzroZwg67O07J28IOqyg+ydhCDrs7TsnqXtlanri4jri6QuCisKKyAgICAg7JOw6riwIOuwsOumrOyWtOuKlCDsiqTthqDslrQg7Jik7Y2866CI7J207IWY65Ok7JeQIOuMgO2VnCDrtoDrtoTsoIEg7Iic7IScIOyEuOyasOq4sOyeheuLiOuLpDsg66Gc65OcCisgICAgIOyYpO2NvOugiOydtOyFmOuTpOyXkCDrjIDtlbTshJzripQg7Ja065akIOyYge2WpeuPhCDrgbzsuZjsp4Ag7JWK7Iq164uI64ukLgorCisgICAgIENQVSDripQg7Iuc6rCE7J2YIO2dkOumhOyXkCDrlLDrnbwg66mU66qo66asIOyLnOyKpO2FnOyXkCDsnbzroKjsnZgg7Iqk7Yag7Ja0IOyYpO2NvOugiOydtOyFmOuTpOydhAorICAgICDtlZjrgpjslKkg7JqU7LKt7ZW0IOynkeyWtOuEo+yKteuLiOuLpC4gIOyTsOq4sCDrsLDrpqzslrQg7JWe7J2YIOuqqOuToCDsiqTthqDslrQg7Jik7Y2866CI7J207IWY65Ok7J2ACisgICAgIOyTsOq4sCDrsLDrpqzslrQg65Kk7J2YIOuqqOuToCDsiqTthqDslrQg7Jik7Y2866CI7J207IWY65Ok67O064ukIF/slZ7shJxfIOyImO2WieuQoCDqsoHri4jri6QuCisKKyAgICAgWyFdIOyTsOq4sCDrsLDrpqzslrTrk6TsnYAg7J296riwIOuYkOuKlCDrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtOyZgCDtlajqu5gg7Ked7J2EIOunnuy2sAorICAgICDsgqzsmqnrkJjslrTslbzrp4wg7ZWo7J2EIOyVjOyVhOuRkOyEuOyalDsgIlNNUCDrsLDrpqzslrQg7Ked66ee7LaU6riwIiDshJzruIzshLnshZjsnYQg7LC46rOg7ZWY7IS47JqULgorCisKKyAoMikg642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrQuCisKKyAgICAg642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrTripQg7J296riwIOuwsOumrOyWtOydmCDrs7Tri6Qg7JmE7ZmU65CcIO2Yle2DnOyeheuLiOuLpC4gIOuRkOqwnOydmCDroZzrk5wKKyAgICAg7Jik7Y2866CI7J207IWY7J20IOyeiOqzoCDrkZDrsojsp7gg6rKD7J20IOyyq+uyiOynuCDqsoPsnZgg6rKw6rO87JeQIOydmOyhtO2VmOqzoCDsnojsnYQg65WMKOyYiDoKKyAgICAg65GQ67KI7Ke4IOuhnOuTnOqwgCDssLjsobDtlaAg7KO87IaM66W8IOyyq+uyiOynuCDroZzrk5zqsIAg7J2964qUIOqyveyasCksIOuRkOuyiOynuCDroZzrk5zqsIAg7J297Ja07JisCisgICAgIOuNsOydtO2EsOuKlCDssqvrsojsp7gg66Gc65Oc7JeQIOydmO2VtCDqt7gg7KO87IaM6rCAIOyWu+yWtOyngOq4sCDsoITsl5Ag7JeF642w7J207Yq4IOuQmOyWtCDsnojsnYzsnYQKKyAgICAg67O07J6l7ZWY6riwIOychO2VtOyEnCDrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtOqwgCDtlYTsmpTtlaAg7IiYIOyeiOyKteuLiOuLpC4KKworICAgICDrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtOuKlCDsg4HtmLgg7J2Y7KG07KCB7J24IOuhnOuTnCDsmKTtjbzroIjsnbTshZjrk6Qg7IKs7J207J2YIOu2gOu2hOyggSDsiJzshJwKKyAgICAg7IS47Jqw6riw7J6F64uI64ukOyDsiqTthqDslrQg7Jik7Y2866CI7J207IWY65Ok7J2064KYIOuPheumveyggeyduCDroZzrk5zrk6QsIOuYkOuKlCDspJHrs7XrkJjripQKKyAgICAg66Gc65Oc65Ok7JeQIOuMgO2VtOyEnOuKlCDslrTrlqQg7JiB7Zal64+EIOuBvOy5mOyngCDslYrsirXri4jri6QuCisKKyAgICAgKDEpIOyXkOyEnCDslrjquIntlojrk6/snbQsIOyLnOyKpO2FnOydmCBDUFUg65Ok7J2AIOuplOuqqOumrCDsi5zsiqTthZzsl5Ag7J2866Co7J2YIOyKpO2GoOyWtAorICAgICDsmKTtjbzroIjsnbTshZjrk6TsnYQg642Y7KC4IOuEo+qzoCDsnojsnLzrqbAsIOqxsOq4sOyXkCDqtIDsi6zsnbQg7J6I64qUIOuLpOuluCBDUFUg64qUIOq3uAorICAgICDsmKTtjbzroIjsnbTshZjrk6TsnYQg66mU66qo66asIOyLnOyKpO2FnOydtCDsi6TtlontlZwg6rKw6rO866W8IOyduOyngO2VoCDsiJgg7J6I7Iq164uI64ukLiAg7J207LKY65+8CisgICAgIOuLpOuluCBDUFUg7J2YIOyKpO2GoOyWtCDsmKTtjbzroIjsnbTshZjsnZgg6rKw6rO87JeQIOq0gOyLrOydhCDrkZDqs6Ag7J6I64qUIENQVSDqsIAg7IiY7ZaJIOyalOyyre2VnAorICAgICDrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtOuKlCwg67Cw66as7Ja0IOyVnuydmCDslrTrlqQg66Gc65OcIOyYpO2NvOugiOydtOyFmOydtCDri6TrpbggQ1BVIOyXkOyEnAorICAgICDrjZjsoLgg64Sj7J2AIOyKpO2GoOyWtCDsmKTtjbzroIjsnbTshZjqs7wg6rCZ7J2AIOyYgeyXreydhCDtlqXtlojri6TrqbQsIOq3uOufsCDsiqTthqDslrQKKyAgICAg7Jik7Y2866CI7J207IWY65Ok7J20IOunjOuTpOyWtOuCtOuKlCDqsrDqs7zqsIAg642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrQg65Kk7J2YIOuhnOuTnAorICAgICDsmKTtjbzroIjsnbTshZjrk6Tsl5DqsozripQg67O07J28IOqyg+ydhCDrs7TsnqXtlanri4jri6QuCisKKyAgICAg7J20IOyInOyEnCDshLjsmrDquLAg7KCc7JW97JeQIOuMgO2VnCDqt7jrprzsnYQg67O06riwIOychO2VtOyEoCAi66mU66qo66asIOuwsOumrOyWtCDsi5ztgIDsiqTsnZgg7JiIIgorICAgICDshJzruIzshLnshZjsnYQg7LC46rOg7ZWY7Iuc6riwIOuwlOuejeuLiOuLpC4KKworICAgICBbIV0g7LKr67KI7Ke4IOuhnOuTnOuKlCDrsJjrk5zsi5wgX+uNsOydtO2EsF8g7J2Y7KG07ISx7J2EIOqwgOyguOyVvOyngCDsu6jtirjroaQg7J2Y7KG07ISx7J2EIOqwgOyguOyVvAorICAgICDtlZjripTqsowg7JWE64uY7J2EIOyVjOyVhOuRkOyLreyLnOyYpC4gIOunjOyVvSDrkZDrsojsp7gg66Gc65Oc66W8IOychO2VnCDso7zshozqsIAg7LKr67KI7Ke4IOuhnOuTnOyXkAorICAgICDsnZjsobTsoIHsnbTsp4Drp4wg6re4IOydmOyhtOyEseydgCDsobDqsbTsoIHsnbTsp4Ag6re4IOyjvOyGjCDsnpDssrTrpbwg6rCA7KC47Jik64qU6rKMIOyVhOuLiOudvOuptCwKKyAgICAg6re46rKD7J2AIF/su6jtirjroaRfIOydmOyhtOyEseydtOqzoCwg7J20IOqyveyasOyXkOuKlCDsnb3quLAg67Cw66as7Ja064KYIOq3uOuztOuLpCDqsJXroKXtlZwKKyAgICAg66y07Ja46rCA6rCAIO2VhOyalO2VqeuLiOuLpC4gIOuNlCDsnpDshLjtlZwg64K07Jqp7J2EIOychO2VtOyEnOuKlCAi7Luo7Yq466GkIOydmOyhtOyEsSIg7ISc67iM7IS57IWY7J2ECisgICAgIOywuOqzoO2VmOyLnOq4sCDrsJTrno3ri4jri6QuCisKKyAgICAgWyFdIOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja064qUIOuztO2GtSDsk7DquLAg67Cw66as7Ja065Ok6rO8IO2VqOq7mCDsp53snYQg66ee7LawIOyCrOyaqeuQmOyWtOyVvAorICAgICDtlanri4jri6Q7ICJTTVAg67Cw66as7Ja0IOynneunnuy2lOq4sCIg7ISc67iM7IS57IWY7J2EIOywuOqzoO2VmOyEuOyalC4KKworCisgKDMpIOydveq4sCAo65iQ64qUIOuhnOuTnCkg66mU66qo66asIOuwsOumrOyWtC4KKworICAgICDsnb3quLAg67Cw66as7Ja064qUIOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja0IOq4sOuKpeydmCDrs7TsnqXsgqztla3sl5Ag642U7ZW07IScIOuwsOumrOyWtOuztOuLpAorICAgICDslZ7shJwg66qF7Iuc65CcIOuqqOuToCBMT0FEIOyYpO2NvOugiOydtOyFmOuTpOydtCDrsLDrpqzslrQg65Kk7JeQIOuqheyLnOuQmOuKlCDrqqjrk6AgTE9BRAorICAgICDsmKTtjbzroIjsnbTshZjrk6Trs7Tri6Qg66i87KCAIO2Wie2VtOynhCDqsoPsnLzroZwg7Iuc7Iqk7YWc7J2YIOuLpOuluCDsu7Ttj6zrhIztirjrk6Tsl5Ag67O07Jes7KeIIOqyg+ydhAorICAgICDrs7TsnqXtlanri4jri6QuCisKKyAgICAg7J296riwIOuwsOumrOyWtOuKlCDroZzrk5wg7Jik7Y2866CI7J207IWY7JeQIO2Wie2VtOyngOuKlCDrtoDrtoTsoIEg7Iic7IScIOyEuOyasOq4sOyeheuLiOuLpDsg7Iqk7Yag7Ja0CisgICAgIOyYpO2NvOugiOydtOyFmOyXkCDrjIDtlbTshJzripQg7Ja065akIOyYge2WpeuPhCDrgbzsuZjsp4Ag7JWK7Iq164uI64ukLgorCisgICAgIOydveq4sCDrqZTrqqjrpqwg67Cw66as7Ja064qUIOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja066W8IOuCtOyepe2VmOuvgOuhnCDrjbDsnbTthLAg7J2Y7KG07ISxCisgICAgIOuwsOumrOyWtOulvCDrjIDsi6DtlaAg7IiYIOyeiOyKteuLiOuLpC4KKworICAgICBbIV0g7J296riwIOuwsOumrOyWtOuKlCDsnbzrsJjsoIHsnLzroZwg7JOw6riwIOuwsOumrOyWtOuTpOqzvCDtlajqu5gg7Ked7J2EIOunnuy2sCDsgqzsmqnrkJjslrTslbwKKyAgICAg7ZWp64uI64ukOyAiU01QIOuwsOumrOyWtCDsp53rp57stpTquLAiIOyEnOu4jOyEueyFmOydhCDssLjqs6DtlZjshLjsmpQuCisKKworICg0KSDrspTsmqkg66mU66qo66asIOuwsOumrOyWtC4KKworICAgICDrspTsmqkoZ2VuZXJhbCkg66mU66qo66asIOuwsOumrOyWtOuKlCDrsLDrpqzslrTrs7Tri6Qg7JWe7IScIOuqheyLnOuQnCDrqqjrk6AgTE9BRCDsmYAgU1RPUkUKKyAgICAg7Jik7Y2866CI7J207IWY65Ok7J20IOuwsOumrOyWtCDrkqTsl5Ag66qF7Iuc65CcIOuqqOuToCBMT0FEIOyZgCBTVE9SRSDsmKTtjbzroIjsnbTshZjrk6Trs7Tri6QKKyAgICAg66i87KCAIOyImO2WieuQnCDqsoPsnLzroZwg7Iuc7Iqk7YWc7J2YIOuCmOuouOyngCDsu7Ttj6zrhIztirjrk6Tsl5Ag67O07J206rKMIOuQqOydhCDrs7TsnqXtlanri4jri6QuCisKKyAgICAg67KU7JqpIOuplOuqqOumrCDrsLDrpqzslrTripQg66Gc65Oc7JmAIOyKpO2GoOyWtCDrqqjrkZDsl5Ag64yA7ZWcIOu2gOu2hOyggSDsiJzshJwg7IS47Jqw6riw7J6F64uI64ukLgorCisgICAgIOuylOyaqSDrqZTrqqjrpqwg67Cw66as7Ja064qUIOydveq4sCDrqZTrqqjrpqwg67Cw66as7Ja0LCDsk7DquLAg66mU66qo66asIOuwsOumrOyWtCDrqqjrkZDrpbwKKyAgICAg64K07J6l7ZWY66+A66GcLCDrkZAg67Cw66as7Ja066W8IOuqqOuRkCDrjIDsi6DtlaAg7IiYIOyeiOyKteuLiOuLpC4KKworCivqt7jrpqzqs6Ag65GQ6rCc7J2YIOuqheyLnOyggeydtOyngCDslYrsnYAg7YOA7J6F7J20IOyeiOyKteuLiOuLpDoKKworICg1KSBBQ1FVSVJFIOyYpO2NvOugiOydtOyFmC4KKworICAgICDsnbQg7YOA7J6F7J2YIOyYpO2NvOugiOydtOyFmOydgCDri6jrsKntlqXsnZgg7Yis6rO87ISxIOuwsOumrOyWtOyymOufvCDrj5nsnpHtlanri4jri6QuICBBQ1FVSVJFCisgICAgIOyYpO2NvOugiOydtOyFmCDrkqTsnZgg66qo65OgIOuplOuqqOumrCDsmKTtjbzroIjsnbTshZjrk6TsnbQgQUNRVUlSRSDsmKTtjbzroIjsnbTshZgg7ZuE7JeQCisgICAgIOydvOyWtOuCnCDqsoPsnLzroZwg7Iuc7Iqk7YWc7J2YIOuCmOuouOyngCDsu7Ttj6zrhIztirjrk6Tsl5Ag67O07J206rKMIOuQoCDqsoPsnbQg67O07J6l65Cp64uI64ukLgorICAgICBMT0NLIOyYpO2NvOugiOydtOyFmOqzvCBzbXBfbG9hZF9hY3F1aXJlKCksIHNtcF9jb25kX2FjcXVpcmUoKSDsmKTtjbzroIjsnbTshZjrj4QKKyAgICAgQUNRVUlSRSDsmKTtjbzroIjsnbTshZjsl5Ag7Y+s7ZWo65Cp64uI64ukLiAgc21wX2NvbmRfYWNxdWlyZSgpIOyYpO2NvOugiOydtOyFmOydgCDsu6jtirjroaQKKyAgICAg7J2Y7KG07ISx6rO8IHNtcF9ybWIoKSDrpbwg7IKs7Jqp7ZW07IScIEFDUVVJUkUg7J2YIOydmOuvuOyggSDsmpTqtazsgqztla0oc2VtYW50aWMp7J2ECisgICAgIOy2qeyhseyLnO2CteuLiOuLpC4KKworICAgICBBQ1FVSVJFIOyYpO2NvOugiOydtOyFmCDslZ7snZgg66mU66qo66asIOyYpO2NvOugiOydtOyFmOuTpOydgCBBQ1FVSVJFIOyYpO2NvOugiOydtOyFmCDsmYTro4wg7ZuE7JeQCisgICAgIOyImO2WieuQnCDqsoPsspjrn7wg67O07J28IOyImCDsnojsirXri4jri6QuCisKKyAgICAgQUNRVUlSRSDsmKTtjbzroIjsnbTshZjsnYAg6rGw7J2YIO2VreyDgSBSRUxFQVNFIOyYpO2NvOugiOydtOyFmOqzvCDsp53snYQg7KeA7Ja0IOyCrOyaqeuQmOyWtOyVvAorICAgICDtlanri4jri6QuCisKKworICg2KSBSRUxFQVNFIOyYpO2NvOugiOydtOyFmC4KKworICAgICDsnbQg7YOA7J6F7J2YIOyYpO2NvOugiOydtOyFmOuTpOuPhCDri6jrsKntlqUg7Yis6rO87ISxIOuwsOumrOyWtOyymOufvCDrj5nsnpHtlanri4jri6QuICBSRUxFQVNFCisgICAgIOyYpO2NvOugiOydtOyFmCDslZ7snZgg66qo65OgIOuplOuqqOumrCDsmKTtjbzroIjsnbTshZjrk6TsnYAgUkVMRUFTRSDsmKTtjbzroIjsnbTshZgg7KCE7JeQIOyZhOujjOuQnAorICAgICDqsoPsnLzroZwg7Iuc7Iqk7YWc7J2YIOuLpOuluCDsu7Ttj6zrhIztirjrk6Tsl5Ag67O07Jes7KeIIOqyg+ydtCDrs7TsnqXrkKnri4jri6QuICBVTkxPQ0sg66WY7J2YCisgICAgIOyYpO2NvOugiOydtOyFmOuTpOqzvCBzbXBfc3RvcmVfcmVsZWFzZSgpIOyYpO2NvOugiOydtOyFmOuPhCBSRUxFQVNFIOyYpO2NvOugiOydtOyFmOydmAorICAgICDsnbzsooXsnoXri4jri6QuCisKKyAgICAgUkVMRUFTRSDsmKTtjbzroIjsnbTshZgg65Kk7J2YIOuplOuqqOumrCDsmKTtjbzroIjsnbTshZjrk6TsnYAgUkVMRUFTRSDsmKTtjbzroIjsnbTshZjsnbQKKyAgICAg7JmE66OM65CY6riwIOyghOyXkCDtlontlbTsp4Qg6rKD7LKY65+8IOuztOydvCDsiJgg7J6I7Iq164uI64ukLgorCisgICAgIEFDUVVJUkUg7JmAIFJFTEVBU0Ug7Jik7Y2866CI7J207IWY7J2YIOyCrOyaqeydgCDsnbzrsJjsoIHsnLzroZwg64uk66W4IOuplOuqqOumrCDrsLDrpqzslrTsnZgKKyAgICAg7ZWE7JqU7ISx7J2EIOyXhuyVseuLiOuLpCAo7ZWY7KeA66eMICJNTUlPIOyTsOq4sCDrsLDrpqzslrQiIOyEnOu4jOyEueyFmOyXkOyEnCDshKTrqoXrkJjripQg7JiI7Jm466W8CisgICAgIOyVjOyVhOuRkOyEuOyalCkuICDrmJDtlZwsIFJFTEVBU0UrQUNRVUlSRSDsobDtlansnYAg67KU7JqpIOuplOuqqOumrCDrsLDrpqzslrTsspjrn7wg64+Z7J6R7ZWgCisgICAgIOqyg+ydhCDrs7TsnqXtlZjsp4AgLeyViuyKteuLiOuLpC0uICDtlZjsp4Drp4wsIOyWtOuWpCDrs4DsiJjsl5Ag64yA7ZWcIFJFTEVBU0Ug7Jik7Y2866CI7J207IWY7J2ECisgICAgIOyVnuyEnOuKlCDrqZTrqqjrpqwg7JWh7IS47Iqk65Ok7J2YIOyImO2WiSDqsrDqs7zripQg7J20IFJFTEVBU0Ug7Jik7Y2866CI7J207IWY7J2EIOuSpOydtOyWtCDqsJnsnYAKKyAgICAg67OA7IiY7JeQIOuMgO2VtCDsiJjtlonrkJwgQUNRVUlSRSDsmKTtjbzroIjsnbTshZjsnYQg65Kk65Sw66W064qUIOuplOuqqOumrCDslaHshLjsiqTsl5DripQg67O07Jes7KeICisgICAgIOqyg+ydtCDrs7TsnqXrkKnri4jri6QuICDri6TrpbTqsowg66eQ7ZWY7J6Q66m0LCDso7zslrTsp4Qg67OA7IiY7J2YIO2BrOumrO2LsOy7rCDshLnshZjsl5DshJzripQsIO2VtOuLuQorICAgICDrs4DsiJjsl5Ag64yA7ZWcIOyVnuydmCDtgazrpqzti7Dsu6wg7IS57IWY7JeQ7ISc7J2YIOuqqOuToCDslaHshLjsiqTrk6TsnbQg7JmE66OM65CY7JeI7J2EIOqyg+ydhAorICAgICDrs7TsnqXtlanri4jri6QuCisKKyAgICAg7KaJLCBBQ1FVSVJFIOuKlCDstZzshoztlZzsnZggIuy3qOuTnSIg64+Z7J6R7LKY65+8LCDqt7jrpqzqs6AgUkVMRUFTRSDripQg7LWc7IaM7ZWc7J2YICLqs7XqsJwiCisgICAgIOyymOufvCDrj5nsnpHtlZzri6TripQg7J2Y66+47J6F64uI64ukLgorCithdG9taWNfb3BzLnR4dCDsl5DshJwg7ISk66qF65CY64qUIOyWtO2GoOuvuSDsmKTtjbzroIjsnbTshZjrk6Qg7KSR7JeQ64qUIOyZhOyghO2eiCDsiJzshJzsnqHtnowg6rKD65Ok6rO8Ciso67Cw66as7Ja066W8IOyCrOyaqe2VmOyngCDslYrripQpIOyZhO2ZlOuQnCDsiJzshJzsnZgg6rKD65OkIOyZuOyXkCBBQ1FVSVJFIOyZgCBSRUxFQVNFIOu2gOulmOydmAor6rKD65Ok64+EIOyhtOyerO2VqeuLiOuLpC4gIOuhnOuTnOyZgCDsiqTthqDslrTrpbwg66qo65GQIOyImO2Wie2VmOuKlCDsobDtlanrkJwg7Ja07Yag66+5IOyYpO2NvOugiOydtOyFmOyXkOyEnCwKK0FDUVVJUkUg64qUIO2VtOuLuSDsmKTtjbzroIjsnbTshZjsnZgg66Gc65OcIOu2gOu2hOyXkOunjCDsoIHsmqnrkJjqs6AgUkVMRUFTRSDripQg7ZW064u5CivsmKTtjbzroIjsnbTshZjsnZgg7Iqk7Yag7Ja0IOu2gOu2hOyXkOunjCDsoIHsmqnrkKnri4jri6QuCisKK+uplOuqqOumrCDrsLDrpqzslrTrk6TsnYAg65GQIENQVSDqsIQsIOuYkOuKlCBDUFUg7JmAIOuUlOuwlOydtOyKpCDqsITsl5Ag7IOB7Zi47J6R7Jqp7J2YIOqwgOuKpeyEseydtCDsnojsnYQKK+uVjOyXkOunjCDtlYTsmpTtlanri4jri6QuICDrp4zslb0g7Ja065akIOy9lOuTnOyXkCDqt7jrn7Ag7IOB7Zi47J6R7Jqp7J20IOyXhuydhCDqsoPsnbQg67O07J6l65Cc64uk66m0LCDtlbTri7kKK+y9lOuTnOyXkOyEnOuKlCDrqZTrqqjrpqwg67Cw66as7Ja066W8IOyCrOyaqe2VoCDtlYTsmpTqsIAg7JeG7Iq164uI64ukLgorCisKK+ydtOqyg+uTpOydgCBf7LWc7IaM7ZWc7J2YXyDrs7TsnqXsgqztla3rk6TsnoTsnYQg7JWM7JWE65GQ7IS47JqULiAg64uk66W4IOyVhO2CpO2FjeyzkOyXkOyEnOuKlCDrjZQg6rCV66Cl7ZWcCivrs7TsnqXsgqztla3snYQg7KCc6rO17ZWgIOyImOuPhCDsnojsirXri4jri6Trp4wsIOq3uOufsCDrs7TsnqXsgqztla3snYAg7JWE7YKk7YWN7LOQIOyiheyGjeyggSDsvZTrk5wg7J207Jm47J2YCivrtoDrtoTsl5DshJzripQg7Iug66Kw65CY7KeAIF/slYrsnYRfIOqygeuLiOuLpC4KKworCivrqZTrqqjrpqwg67Cw66as7Ja07JeQIOuMgO2VtCDqsIDsoJXtlbTshKAg7JWI65CgIOqygworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCivrpqzriIXsiqQg7Luk64SQIOuplOuqqOumrCDrsLDrpqzslrTrk6TsnbQg67O07J6l7ZWY7KeAIOyViuuKlCDqsoPrk6TsnbQg7J6I7Iq164uI64ukOgorCisgKCopIOuplOuqqOumrCDrsLDrpqzslrQg7JWe7JeQ7IScIOuqheyLnOuQnCDslrTrlqQg66mU66qo66asIOyVoeyEuOyKpOuPhCDrqZTrqqjrpqwg67Cw66as7Ja0IOuqheugueydmCDsiJjtlokKKyAgICAg7JmE66OMIOyLnOygkOq5jOyngCBf7JmE66OMXyDrkKAg6rKD7J20656AIOuztOyepeydgCDsl4bsirXri4jri6Q7IOuwsOumrOyWtOqwgCDtlZjripQg7J287J2AIENQVSDsnZgKKyAgICAg7JWh7IS47IqkIO2BkOyXkCDtirnsoJUg7YOA7J6F7J2YIOyVoeyEuOyKpOuTpOydgCDrhJjsnYQg7IiYIOyXhuuKlCDshKDsnYQg6riL64qUIOqyg+ycvOuhnCDsg53qsIHrkKAg7IiYCisgICAgIOyeiOyKteuLiOuLpC4KKworICgqKSDtlZwgQ1BVIOyXkOyEnCDrqZTrqqjrpqwg67Cw66as7Ja066W8IOyImO2Wie2VmOuKlOqyjCDsi5zsiqTthZzsnZgg64uk66W4IENQVSDrgpgg7ZWY65Oc7Juo7Ja07JeQCisgICAgIOyWtOuWpCDsp4HsoJHsoIHsnbgg7JiB7Zal7J2EIOuBvOy5nOuLpOuKlCDrs7TsnqXsnYAg7KG07J6s7ZWY7KeAIOyViuyKteuLiOuLpC4gIOuwsOumrOyWtCDsiJjtlonsnbQKKyAgICAg66eM65Oc64qUIOqwhOygkeyggSDsmIHtlqXsnYAg65GQ67KI7Ke4IENQVSDqsIAg7LKr67KI7Ke4IENQVSDsnZgg7JWh7IS47Iqk65Ok7J2YIOqysOqzvOulvAorICAgICDrsJTrnbzrs7TripQg7Iic7ISc6rCAIOuQqeuLiOuLpOunjCwg64uk7J2MIO2VreuqqeydhCDrs7TshLjsmpQ6CisKKyAoKikg7LKr67KI7Ke4IENQVSDqsIAg65GQ67KI7Ke4IENQVSDsnZgg66mU66qo66asIOyVoeyEuOyKpOuTpOydmCDqsrDqs7zrpbwg67CU652867O8IOuVjCwgX+yEpOuguV8KKyAgICAg65GQ67KI7Ke4IENQVSDqsIAg66mU66qo66asIOuwsOumrOyWtOulvCDsgqzsmqntlZzri6Qg7ZW064+ELCDssqvrsojsp7ggQ1BVIF/rmJDtlZxfIOq3uOyXkCDrp57ripQKKyAgICAg66mU66qo66asIOuwsOumrOyWtOulvCDsgqzsmqntlZjsp4Ag7JWK64qU64uk66m0ICgiU01QIOuwsOumrOyWtCDsp53rp57stpTquLAiIOyEnOu4jOyEueyFmOydhAorICAgICDssLjqs6DtlZjshLjsmpQpIOq3uCDqsrDqs7zqsIAg7Jis67CU66W4IOyInOyEnOuhnCDrs7Tsl6zsp4Tri6TripQg67O07J6l7J2AIOyXhuyKteuLiOuLpC4KKworICgqKSBDUFUg67CU6rml7J2YIO2VmOuTnOybqOyWtFsqXSDqsIAg66mU66qo66asIOyVoeyEuOyKpOuTpOydmCDsiJzshJzrpbwg67CU6r647KeAIOyViuuKlOuLpOuKlCDrs7TsnqXsnYAKKyAgICAg7KG07J6s7ZWY7KeAIOyViuyKteuLiOuLpC4gIENQVSDsupDsi5wg7J286rSA7ISxIOuplOy7pOuLiOymmOydgCDrqZTrqqjrpqwg67Cw66as7Ja07J2YIOqwhOygkeyggQorICAgICDsmIHtlqXsnYQgQ1BVIOyCrOydtOyXkCDsoITtjIztlZjquLQg7ZWY7KeA66eMLCDsiJzshJzrjIDroZwg7KCE7YyM7ZWY7KeA64qUIOyViuydhCDsiJgg7J6I7Iq164uI64ukLgorCisJWypdIOuyhOyKpCDrp4jsiqTthLDrp4EgRE1BIOyZgCDsnbzqtIDshLHsl5Ag64yA7ZW07ISc64qUIOuLpOydjOydhCDssLjqs6DtlZjsi5zquLAg67CU656N64uI64ukOgorCisJICAgIERvY3VtZW50YXRpb24vUENJL3BjaS50eHQKKwkgICAgRG9jdW1lbnRhdGlvbi9ETUEtQVBJLUhPV1RPLnR4dAorCSAgICBEb2N1bWVudGF0aW9uL0RNQS1BUEkudHh0CisKKwor642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK+uNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja07J2YIOyCrOyaqeyXkCDsnojslrQg7KeA7Lyc7JW8IO2VmOuKlCDsgqztla3rk6TsnYAg7JW96rCEIOuvuOusmO2VmOqzoCwg642w7J207YSwCivsnZjsobTshLEg67Cw66as7Ja06rCAIOyCrOyaqeuQmOyWtOyVvCDtlZjripQg7IOB7Zmp64+EIO2VreyDgSDrqoXrsLHtlZjsp4DripQg7JWK7Iq164uI64ukLiAg7ISk66qF7J2EIOychO2VtAor64uk7J2M7J2YIOydtOuypO2KuCDsi5ztgIDsiqTrpbwg7IOd6rCB7ZW0IOu0heyLnOuLpDoKKworCUNQVSAxCQkgICAgICBDUFUgMgorCT09PT09PT09PT09PT09PQkgICAgICA9PT09PT09PT09PT09PT0KKwl7IEEgPT0gMSwgQiA9PSAyLCBDID09IDMsIFAgPT0gJkEsIFEgPT0gJkMgfQorCUIgPSA0OworCTzsk7DquLAg67Cw66as7Ja0PgorCVdSSVRFX09OQ0UoUCwgJkIpCisJCQkgICAgICBRID0gUkVBRF9PTkNFKFApOworCQkJICAgICAgRCA9ICpROworCivsl6zquLDsl5Qg67aE66qF7ZWcIOuNsOydtO2EsCDsnZjsobTshLHsnbQg7KG07J6s7ZWY66+A66GcLCDsnbQg7Iuc7YCA7Iqk6rCAIOuBneuCrOydhCDrlYwgUSDripQgJkEg65iQ64qUICZCCivsnbwg6rKD7J206rOgLCDrlLDrnbzshJw6CisKKwkoUSA9PSAmQSkg64qUIChEID09IDEpIOulvCwKKwkoUSA9PSAmQikg64qUIChEID09IDQpIOulvCDsnZjrr7jtlanri4jri6QuCisKK+2VmOyngOunjCEgIENQVSAyIOuKlCBCIOydmCDsl4XrjbDsnbTtirjrpbwg7J247Iud7ZWY6riwIOyghOyXkCBQIOydmCDsl4XrjbDsnbTtirjrpbwg7J247Iud7ZWgIOyImCDsnojqs6AsCivrlLDrnbzshJwg64uk7J2M7J2YIOqysOqzvOqwgCDqsIDriqXtlanri4jri6Q6CisKKwkoUSA9PSAmQikgYW5kIChEID09IDIpID8/Pz8KKwor7J2065+wIOqysOqzvOuKlCDsnbzqtIDshLHsnbTrgpgg7J246rO8IOq0gOqzhCDsnKDsp4DqsIAg7Iuk7Yyo7ZWcIOqyg+yymOufvCDrs7Tsnbwg7IiY64+EIOyeiOqyoOyngOunjCwKK+q3uOugh+yngCDslYrsirXri4jri6QsIOq3uOumrOqzoCDsnbQg7ZiE7IOB7J2AIChERUMgQWxwaGEg7JmAIOqwmeydgCkg7Jes65+sIENQVSDsl5DshJwg7Iuk7KCc66GcCivrsJzqsqzrkKAg7IiYIOyeiOyKteuLiOuLpC4KKwor7J20IOusuOygnCDsg4HtmansnYQg7KCc64yA66GcIO2VtOqysO2VmOq4sCDsnITtlbQsIOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja064KYIOq3uOuztOuLpCDqsJXtmZTrkJwKK+ustOyWuOqwgOqwgCDso7zshozrpbwg7J297Ja07JisIOuVjOyZgCDrjbDsnbTthLDrpbwg7J297Ja07JisIOuVjCDsgqzsnbTsl5Ag7LaU6rCA65CY7Ja07JW866eMIO2VqeuLiOuLpDoKKworCUNQVSAxCQkgICAgICBDUFUgMgorCT09PT09PT09PT09PT09PQkgICAgICA9PT09PT09PT09PT09PT0KKwl7IEEgPT0gMSwgQiA9PSAyLCBDID09IDMsIFAgPT0gJkEsIFEgPT0gJkMgfQorCUIgPSA0OworCTzsk7DquLAg67Cw66as7Ja0PgorCVdSSVRFX09OQ0UoUCwgJkIpOworCQkJICAgICAgUSA9IFJFQURfT05DRShQKTsKKwkJCSAgICAgIDzrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtD4KKwkJCSAgICAgIEQgPSAqUTsKKwor7J20IOuzgOqyveydgCDslZ7snZgg7LKY7J2MIOuRkOqwgOyngCDqsrDqs7wg7KSRIO2VmOuCmOunjOydtCDrsJzsg53tlaAg7IiYIOyeiOqzoCwg7IS467KI7Ke47J2YIOqysOqzvOuKlAor67Cc7IOd7ZWgIOyImCDsl4brj4TroZ0g7ZWp64uI64ukLgorCivrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtOuKlCDsnZjsobTsoIEg7JOw6riw7JeQIOuMgO2VtOyEnOuPhCDsiJzshJzrpbwg7J6h7JWE7KSN64uI64ukOgorCisJQ1BVIDEJCSAgICAgIENQVSAyCisJPT09PT09PT09PT09PT09CSAgICAgID09PT09PT09PT09PT09PQorCXsgQSA9PSAxLCBCID09IDIsIEMgPSAzLCBQID09ICZBLCBRID09ICZDIH0KKwlCID0gNDsKKwk87JOw6riwIOuwsOumrOyWtD4KKwlXUklURV9PTkNFKFAsICZCKTsKKwkJCSAgICAgIFEgPSBSRUFEX09OQ0UoUCk7CisJCQkgICAgICA8642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrQ+CisJCQkgICAgICAqUSA9IDU7CisKK+ydtCDrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtOuKlCBRIOuhnOydmCDsnb3quLDqsIAgKlEg66Gc7J2YIOyKpO2GoOyWtOyZgCDsiJzshJzrpbwg66ee7LaU6rKMCivtlbTspI3ri4jri6QuICDsnbTripQg64uk7J2M6rO8IOqwmeydgCDqsrDqs7zrpbwg66eJ7Iq164uI64ukOgorCisJKFEgPT0gJkIpICYmIChCID09IDQpCisKK+ydtOufsCDtjKjthLTsnYAg65Oc66y86rKMIOyCrOyaqeuQmOyWtOyVvCDtlajsnYQg7JWM7JWEIOuRkOyLnOq4sCDrsJTrno3ri4jri6QuICDrrLTsl4frs7Tri6Trj4QsIOydmOyhtOyEsQor7Iic7IScIOq3nOy5meydmCDsnZjrj4TripQg7JOw6riwIOyekeyXheydhCAt7JiI67CpLSDtlbTshJwg6re466GcIOyduO2VtCDrsJzsg53tlZjripQg67mE7Iu8IOy6kOyLnCDrr7jsiqTrj4QKK+yXhuyVoOugpOuKlCDqsoPsnoXri4jri6QuICDsnbQg7Yyo7YS07J2AIOuTnOusvOqyjCDrsJzsg53tlZjripQg7JeQ65+sIOyhsOqxtCDqsJnsnYDqsoPrk6TsnYQg6riw66Gd7ZWY64qU642wCivsgqzsmqnrkKAg7IiYIOyeiOqzoCwg7J2066CH6rKMIOuwsOumrOyWtOulvCDsgqzsmqntlbQg7Iic7ISc66W8IOyngO2CpOqyjCDtlajsnLzroZzsjagg6re465+wIOq4sOuhneydtAor7IKs65287KeA64qUIOqyg+ydhCDrp4nsirXri4jri6QuCisKKworWyFdIOyDgeuLue2eiCDruYTsp4HqtIDsoIHsnbgg7J20IOyDge2ZqeydgCDrtoTrpqzrkJwg7LqQ7Iuc66W8IOqwgOynhCDquLDqs4QsIOyYiOulvCDrk6TslrQg7ZWcIOy6kOyLnAor67GF7YGs6rCAIOynneyImOuyiCDsupDsi5wg65287J247J2EIOyymOumrO2VmOqzoCDri6Trpbgg67GF7YGs64qUIO2ZgOyImOuyiCDsupDsi5wg65287J247J2EIOyymOumrO2VmOuKlCDquLDqs4QKK+uTseyXkOyEnCDqsIDsnqUg7J6YIOuwnOyDne2VqeuLiOuLpC4gIO2PrOyduO2EsCBQIOuKlCDtmYDsiJgg67KI7Zi47J2YIOy6kOyLnCDrnbzsnbjsl5Ag7J6I6rOgLCDrs4DsiJggQiDripQKK+ynneyImCDrsojtmLgg7LqQ7IucIOudvOyduOyXkCDsnojri6Tqs6Ag7IOd6rCB7ZW0IOu0heyLnOuLpC4gIOq3uOufsCDsg4Htg5zsl5DshJwg7J296riwIOyekeyXheydhCDtlZjripQgQ1BVCivsnZgg7Ked7IiY67KIIOuxhe2BrOuKlCDtlaAg7J287J20IOyMk+yXrCDrp6TsmrAg67CU7IGY7KeA66eMIO2ZgOyImOuyiCDrsYXtgazripQg7ZWgIOydvOydtCDsl4bslrQg7JWE66y0Civsnbzrj4Qg7ZWY7KeAIOyViuqzoCAg7J6I7JeI64uk66m0LCDtj6zsnbjthLAgUCDripQg7IOIIOqwkiAoJkIpIOydhCwg6re466as6rOgIOuzgOyImCBCIOuKlCDsmJvrgqAg6rCSCisoMikg7J2EIOqwgOyngOqzoCDsnojripQg7IOB7YOc6rCAIOuztOyXrOyniCDsiJjrj4Qg7J6I7Iq164uI64ukLgorCisKK+uNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja064qUIOunpOyasCDspJHsmpTtlZzrjbAsIOyYiOulvCDrk6TslrQgUkNVIOyLnOyKpO2FnOyXkOyEnCDqt7jroIfsirXri4jri6QuCitpbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgg7J2YIHJjdV9hc3NpZ25fcG9pbnRlcigpIOyZgCByY3VfZGVyZWZlcmVuY2UoKSDrpbwKK+ywuOqzoO2VmOyEuOyalC4gIOyXrOq4sOyEnCDrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtOuKlCBSQ1Ug66GcIOq0gOumrOuQmOuKlCDtj6zsnbjthLDsnZgg7YOA6rKf7J2EIO2YhOyerAor7YOA6rKf7JeQ7IScIOyImOygleuQnCDsg4jroZzsmrQg7YOA6rKf7Jy866GcIOuwlOq+uOuKlCDsnpHsl4Xsl5DshJwg7IOI66GcIOyImOygleuQnCDtg4Dqsp/snbQg7LSI6riw7ZmU6rCACivsmYTro4zrkJjsp4Ag7JWK7J2AIOyxhOuhnCDrs7Tsl6zsp4DripQg7J287J20IOydvOyWtOuCmOyngCDslYrqsowg7ZW07KSN64uI64ukLgorCivrjZQg66eO7J2AIOyYiOulvCDsnITtlbTshKAgIuy6kOyLnCDsnbzqtIDshLEiIOyEnOu4jOyEueyFmOydhCDssLjqs6DtlZjshLjsmpQuCisKKwor7Luo7Yq466GkIOydmOyhtOyEsQorLS0tLS0tLS0tLS0tLQorCivroZzrk5wt66Gc65OcIOy7qO2KuOuhpCDsnZjsobTshLHsnYAg642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrTrp4zsnLzroZzripQg7KCV7ZmV7Z6IIOuPmeyeke2VoCDsiJjqsIAKK+yXhuyWtOyEnCDsnb3quLAg66mU66qo66asIOuwsOumrOyWtOulvCDtlYTsmpTroZwg7ZWp64uI64ukLiAg7JWE656Y7J2YIOy9lOuTnOulvCDrtIXsi5zri6Q6CisKKwlxID0gUkVBRF9PTkNFKGEpOworCWlmIChxKSB7CisJCTzrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtD4gIC8qIEJVRzogTm8gZGF0YSBkZXBlbmRlbmN5ISEhICovCisJCXAgPSBSRUFEX09OQ0UoYik7CisJfQorCivsnbQg7L2U65Oc64qUIOybkO2VmOuKlCDrjIDroZzsnZgg7Zqo6rO866W8IOuCtOyngCDrqrvtlaAg7IiYIOyeiOuKlOuNsCwg7J20IOy9lOuTnOyXkOuKlCDrjbDsnbTthLAg7J2Y7KG07ISx7J20CivslYTri4jrnbwg7Luo7Yq466GkIOydmOyhtOyEseydtCDsobTsnqztlZjquLAg65WM66y47Jy866GcLCDsnbTrn7Ag7IOB7Zmp7JeQ7IScIENQVSDripQg7Iuk7ZaJIOyGjeuPhOulvCDrjZQKK+u5oOultOqyjCDtlZjquLAg7JyE7ZW0IOu2hOq4sCDsobDqsbTsnZgg6rKw6rO866W8IOyYiOy4oe2VmOqzoCDsvZTrk5zrpbwg7J6s67Cw7LmYIO2VoCDsiJgg7J6I7Ja07IScIOuLpOuluAorQ1BVIOuKlCBiIOuhnOu2gO2EsOydmCDroZzrk5wg7Jik7Y2866CI7J207IWY7J20IGEg66Gc67aA7YSw7J2YIOuhnOuTnCDsmKTtjbzroIjsnbTshZjrs7Tri6Qg66i87KCAIOuwnOyDne2VnAor6rG466GcIOyduOyLne2VoCDsiJgg7J6I7Iq164uI64ukLiAg7Jes6riw7JeQIOygleunkOuhnCDtlYTsmpTtlojrjZgg6rG0IOuLpOydjOqzvCDqsJnsirXri4jri6Q6CisKKwlxID0gUkVBRF9PTkNFKGEpOworCWlmIChxKSB7CisJCTzsnb3quLAg67Cw66as7Ja0PgorCQlwID0gUkVBRF9PTkNFKGIpOworCX0KKwor7ZWY7KeA66eMLCDsiqTthqDslrQg7Jik7Y2866CI7J207IWY7J2AIOyYiOy4oeyggeycvOuhnCDsiJjtlonrkJjsp4Ag7JWK7Iq164uI64ukLiAg7KaJLCDri6TsnYwg7JiI7JeQ7ISc7JmACivqsJnsnbQg66Gc65OcLeyKpO2GoOyWtCDsu6jtirjroaQg7J2Y7KG07ISx7J20IOyhtOyerO2VmOuKlCDqsr3smrDsl5DripQg7Iic7ISc6rCAIC3sp4DsvJzsp4Tri6Qt64qUCivsnZjrr7jsnoXri4jri6QuCisKKwlxID0gUkVBRF9PTkNFKGEpOworCWlmIChxKSB7CisJCVdSSVRFX09OQ0UoYiwgcCk7CisJfQorCivsu6jtirjroaQg7J2Y7KG07ISx7J2AIOuztO2GtSDri6Trpbgg7YOA7J6F7J2YIOuwsOumrOyWtOuTpOqzvCDsp53snYQg66ee7LawIOyCrOyaqeuQqeuLiOuLpC4gIOq3uOugh+uLpOqzpAor7ZWY64KYLCBSRUFEX09OQ0UoKSDripQg67CY65Oc7IucIOyCrOyaqe2VtOyVvCDtlajsnYQg67aA65SUIOuqheyLrO2VmOyEuOyalCEgIFJFQURfT05DRSgpIOqwgAor7JeG64uk66m0LCDsu7TtjIzsnbzrn6zqsIAgJ2EnIOuhnOu2gO2EsOydmCDroZzrk5zrpbwgJ2EnIOuhnOu2gO2EsOydmCDrmJDri6Trpbgg66Gc65Oc7JmALCAnYicg66Gc7J2YCivsiqTthqDslrTrpbwgJ2InIOuhnOydmCDrmJDri6Trpbgg7Iqk7Yag7Ja07JmAIOyhsO2Vqe2VtCDrsoTroKQg66ek7JqwIOu5hOyngeq0gOyggeyduCDqsrDqs7zrpbwg7LSI656Y7ZWgIOyImAor7J6I7Iq164uI64ukLgorCivsnbTqsbjroZwg64Gd7J20IOyVhOuLjOqyjCwg7Lu07YyM7J2865+s6rCAIOuzgOyImCAnYScg7J2YIOqwkuydtCDtla3sg4EgMOydtCDslYTri4jrnbzqs6Ag7Kad66qF7ZWgIOyImAor7J6I64uk66m0LCDslZ7snZgg7JiI7JeQ7IScICJpZiIg66y47J2EIOyXhuyVoOyEnCDri6TsnYzqs7wg6rCZ7J20IOy1nOygge2ZlCDtlaAg7IiY64+EIOyeiOyKteuLiOuLpDoKKworCXEgPSBhOworCWIgPSBwOyAgLyogQlVHOiBDb21waWxlciBhbmQgQ1BVIGNhbiBib3RoIHJlb3JkZXIhISEgKi8KKwor6re465+s64uIIFJFQURfT05DRSgpIOulvCDrsJjrk5zsi5wg7IKs7Jqp7ZWY7IS47JqULgorCivri6TsnYzqs7wg6rCZ7J20ICJpZiIg66y47J2YIOyWkeqwiOuemCDruIzrnpzsuZjsl5Ag66qo65GQIOyhtOyerO2VmOuKlCDrj5nsnbztlZwg7Iqk7Yag7Ja07JeQIOuMgO2VtCDsiJzshJzrpbwKK+qwleygnO2VmOqzoCDsi7bsnYAg6rK97Jqw6rCAIOyeiOydhCDsiJgg7J6I7Iq164uI64ukOgorCisJcSA9IFJFQURfT05DRShhKTsKKwlpZiAocSkgeworCQliYXJyaWVyKCk7CisJCVdSSVRFX09OQ0UoYiwgcCk7CisJCWRvX3NvbWV0aGluZygpOworCX0gZWxzZSB7CisJCWJhcnJpZXIoKTsKKwkJV1JJVEVfT05DRShiLCBwKTsKKwkJZG9fc29tZXRoaW5nX2Vsc2UoKTsKKwl9CisKK+yViO2DgOq5neqyjOuPhCwg7ZiE7J6s7J2YIOy7tO2MjOydvOufrOuTpOydgCDrhpLsnYAg7LWc7KCB7ZmUIOugiOuyqOyXkOyEnOuKlCDsnbTqsbgg64uk7J2M6rO8IOqwmeydtAor67CU6r+U67KE66a964uI64ukOgorCisJcSA9IFJFQURfT05DRShhKTsKKwliYXJyaWVyKCk7CisJV1JJVEVfT05DRShiLCBwKTsgIC8qIEJVRzogTm8gb3JkZXJpbmcgdnMuIGxvYWQgZnJvbSBhISEhICovCisJaWYgKHEpIHsKKwkJLyogV1JJVEVfT05DRShiLCBwKTsgLS0gbW92ZWQgdXAsIEJVRyEhISAqLworCQlkb19zb21ldGhpbmcoKTsKKwl9IGVsc2UgeworCQkvKiBXUklURV9PTkNFKGIsIHApOyAtLSBtb3ZlZCB1cCwgQlVHISEhICovCisJCWRvX3NvbWV0aGluZ19lbHNlKCk7CisJfQorCivsnbTsoJwgJ2EnIOyXkOyEnOydmCDroZzrk5zsmYAgJ2InIOuhnOydmCDsiqTthqDslrQg7IKs7J207JeQ64qUIOyhsOqxtOyggSDqtIDqs4TqsIAg7JeG6riwIOuVjOusuOyXkCBDUFUKK+uKlCDsnbTrk6TsnZgg7Iic7ISc66W8IOuwlOq/gCDsiJgg7J6I6rKMIOuQqeuLiOuLpDog7J2065+wIOqyveyasOyXkCDsobDqsbTsoIEg6rSA6rOE64qUIOuwmOuTnOyLnAor7ZWE7JqU7ZWc642wLCDrqqjrk6Ag7Lu07YyM7J2865+sIOy1nOygge2ZlOqwgCDsnbTro6jslrTsp4Dqs6Ag64KcIO2bhOydmCDslrTshYjruJTrpqwg7L2U65Oc7JeQ7ISc64+ECivrp4jssKzqsIDsp4DsnoXri4jri6QuICDrlLDrnbzshJwsIOydtCDsmIjsl5DshJwg7Iic7ISc66W8IOyngO2CpOq4sCDsnITtlbTshJzripQgc21wX3N0b3JlX3JlbGVhc2UoKQor7JmAIOqwmeydgCDrqoXsi5zsoIEg66mU66qo66asIOuwsOumrOyWtOqwgCDtlYTsmpTtlanri4jri6Q6CisKKwlxID0gUkVBRF9PTkNFKGEpOworCWlmIChxKSB7CisJCXNtcF9zdG9yZV9yZWxlYXNlKCZiLCBwKTsKKwkJZG9fc29tZXRoaW5nKCk7CisJfSBlbHNlIHsKKwkJc21wX3N0b3JlX3JlbGVhc2UoJmIsIHApOworCQlkb19zb21ldGhpbmdfZWxzZSgpOworCX0KKwor67CY66m07JeQIOuqheyLnOyggSDrqZTrqqjrpqwg67Cw66as7Ja06rCAIOyXhuuLpOuptCwg7J2065+wIOqyveyasOydmCDsiJzshJzripQg7Iqk7Yag7Ja0IOyYpO2NvOugiOydtOyFmOuTpOydtAor7ISc66GcIOuLpOulvCDrlYzsl5Drp4wg67O07J6l65CY64qU642wLCDsmIjrpbwg65Ok66m0IOuLpOydjOqzvCDqsJnsnYAg6rK97Jqw7J6F64uI64ukOgorCisJcSA9IFJFQURfT05DRShhKTsKKwlpZiAocSkgeworCQlXUklURV9PTkNFKGIsIHApOworCQlkb19zb21ldGhpbmcoKTsKKwl9IGVsc2UgeworCQlXUklURV9PTkNFKGIsIHIpOworCQlkb19zb21ldGhpbmdfZWxzZSgpOworCX0KKwor7LKY7J2M7J2YIFJFQURfT05DRSgpIOuKlCDsu7TtjIzsnbzrn6zqsIAgJ2EnIOydmCDqsJLsnYQg7Kad66qF7ZW064K064qUIOqyg+ydhCDrp4nquLAg7JyE7ZW0IOyXrOyghO2eiAor7ZWE7JqU7ZWp64uI64ukLgorCivrmJDtlZwsIOuhnOy7rCDrs4DsiJggJ3EnIOulvCDqsIDsp4Dqs6Ag7ZWY64qUIOydvOyXkCDrjIDtlbQg7KO87J2Y7ZW07JW8IO2VmOuKlOuNsCwg6re465+s7KeAIOyViuycvOuptAor7Lu07YyM7J2865+s64qUIOq3uCDqsJLsnYQg7LaU7Lih7ZWY6rOgIOuYkOuLpOyLnCDtlYTsmpTtlZwg7KGw6rG06rSA6rOE66W8IOyXhuyVoOuyhOumtCDsiJgg7J6I7Iq164uI64ukLgor7JiI66W8IOuTpOuptDoKKworCXEgPSBSRUFEX09OQ0UoYSk7CisJaWYgKHEgJSBNQVgpIHsKKwkJV1JJVEVfT05DRShiLCBwKTsKKwkJZG9fc29tZXRoaW5nKCk7CisJfSBlbHNlIHsKKwkJV1JJVEVfT05DRShiLCByKTsKKwkJZG9fc29tZXRoaW5nX2Vsc2UoKTsKKwl9CisKK+unjOyVvSBNQVgg6rCAIDEg66GcIOygleydmOuQnCDsg4HsiJjrnbzrqbQsIOy7tO2MjOydvOufrOuKlCAocSAlIE1BWCkg64qUIDDsnbTrnoAg6rKD7J2EIOyVjOyVhOyxhOqzoCwKK+ychOydmCDsvZTrk5zrpbwg7JWE656Y7JmAIOqwmeydtCDrsJTqv5TrsoTrprQg7IiYIOyeiOyKteuLiOuLpDoKKworCXEgPSBSRUFEX09OQ0UoYSk7CisJV1JJVEVfT05DRShiLCBwKTsKKwlkb19zb21ldGhpbmdfZWxzZSgpOworCivsnbTroIfqsowg65CY66m0LCBDUFUg64qUIOuzgOyImCAnYScg66Gc67aA7YSw7J2YIOuhnOuTnOyZgCDrs4DsiJggJ2InIOuhnOydmCDsiqTthqDslrQg7IKs7J207J2YIOyInOyEnOulvAor7KeA7Lyc7KSEIO2VhOyalOqwgCDsl4bslrTsp5Hri4jri6QuICBiYXJyaWVyKCkg66W8IOy2lOqwgO2VtCDtlbTqsrDtlbQg67O06rOgIOyLtuqyoOyngOunjCwg6re46rG0Civrj4Tsm4DsnbQg7JWI65Cp64uI64ukLiAg7KGw6rG0IOq0gOqzhOuKlCDsgqzrnbzsoYzqs6AsIGJhcnJpZXIoKSDripQg7J2066W8IOuQmOuPjOumrOyngCDrqrvtlanri4jri6QuCivrlLDrnbzshJwsIOydtCDsiJzshJzrpbwg7KeA7Lyc7JW8IO2VnOuLpOuptCwgTUFYIOqwgCAxIOuztOuLpCDtgazri6TripQg6rKD7J2ELCDri6TsnYzqs7wg6rCZ7J2AIOuwqeuyleydhAor7IKs7Jqp7ZW0IOu2hOuqhe2eiCDtlbTslbwg7ZWp64uI64ukOgorCisJcSA9IFJFQURfT05DRShhKTsKKwlCVUlMRF9CVUdfT04oTUFYIDw9IDEpOyAvKiBPcmRlciBsb2FkIGZyb20gYSB3aXRoIHN0b3JlIHRvIGIuICovCisJaWYgKHEgJSBNQVgpIHsKKwkJV1JJVEVfT05DRShiLCBwKTsKKwkJZG9fc29tZXRoaW5nKCk7CisJfSBlbHNlIHsKKwkJV1JJVEVfT05DRShiLCByKTsKKwkJZG9fc29tZXRoaW5nX2Vsc2UoKTsKKwl9CisKKydiJyDroZzsnZgg7Iqk7Yag7Ja065Ok7J2AIOyXrOyghO2eiCDshJzroZwg64uk66aE7J2EIOyVjOyVhOuRkOyEuOyalC4gIOunjOyVvSDqt7jqsoPrk6TsnbQg64+Z7J287ZWY66m0LAor7JWe7JeQ7IScIOydtOyVvOq4sO2WiOuTrywg7Lu07YyM7J2865+s6rCAIOq3uCDsiqTthqDslrQg7Jik7Y2866CI7J207IWY65Ok7J2EICdpZicg66y4IOuwlOq5peycvOuhnAor64GE7KeR7Ja064K8IOyImCDsnojsirXri4jri6QuCisKK+uYkO2VnCDsnbTsp4Qg7KGw6rG066y4IO2PieqwgOyXkCDrhIjrrLQg7J2Y7KG07ZWY7KeAIOyViuuPhOuhnSDsobDsi6ztlbTslbwg7ZWp64uI64ukLiAg64uk7J2M7J2YIOyYiOulvAor67SF7Iuc64ukOgorCisJcSA9IFJFQURfT05DRShhKTsKKwlpZiAocSB8fCAxID4gMCkKKwkJV1JJVEVfT05DRShiLCAxKTsKKwor7LKr67KI7Ke4IOyhsOqxtOunjOycvOuhnOuKlCDruIzrnpzsuZgg7KGw6rG0IOyghOyytOulvCDqsbDsp5PsnLzroZwg66eM65OkIOyImCDsl4bqs6Ag65GQ67KI7Ke4IOyhsOqxtOydgCDtla3sg4EKK+ywuOydtOq4sCDrlYzrrLjsl5AsIOy7tO2MjOydvOufrOuKlCDsnbQg7JiI66W8IOuLpOydjOqzvCDqsJnsnbQg67CU6r+U7IScIOy7qO2KuOuhpCDsnZjsobTshLHsnYQg7JeG7JWg67KE66a0CivsiJgg7J6I7Iq164uI64ukOgorCisJcSA9IFJFQURfT05DRShhKTsKKwlXUklURV9PTkNFKGIsIDEpOworCivsnbQg7JiI64qUIOy7tO2MjOydvOufrOqwgCDsvZTrk5zrpbwg7LaU7Lih7Jy866GcIOyImOygle2VoCDsiJgg7JeG64+E66GdIOu2hOuqhe2eiCDtlbTslbwg7ZWc64uk64qUIOygkOydhAor6rCV7KGw7ZWp64uI64ukLiAg7KGw6riIIOuNlCDsnbzrsJjsoIHsnLzroZwg66eQ7ZW07IScLCBSRUFEX09OQ0UoKSDripQg7Lu07YyM7J2865+s7JeQ6rKMIOyjvOyWtOynhCDroZzrk5wKK+yYpO2NvOugiOydtOyFmOydhCDsnITtlZwg7L2U65Oc66W8IOygleunkOuhnCDrp4zrk6Trj4TroZ0g7ZWY7KeA66eMLCDsu7TtjIzsnbzrn6zqsIAg6re466CH6rKMIOunjOuTpOyWtOynhAor7L2U65Oc7J2YIOyImO2WiSDqsrDqs7zrpbwg7IKs7Jqp7ZWY64+E66GdIOqwleygnO2VmOyngOuKlCDslYrsirXri4jri6QuCisKK+uniOyngOunieycvOuhnCwg7Luo7Yq466GkIOydmOyhtOyEseydgCDsnbTtlonshLEgKHRyYW5zaXRpdml0eSkg7J2EIOygnOqzte2VmOyngCAt7JWK7Iq164uI64ukLS4gIOydtOqxtAoreCDsmYAgeSDqsIAg65GYIOuLpCAwIOydtOudvOuKlCDstIjquLDqsJLsnYQg6rCA7KGM64uk64qUIOqwgOyglSDtlZjsnZgg65GQ6rCc7J2YIOyYiOygnOuhnAor67O07J206rKg7Iq164uI64ukOgorCisJQ1BVIDAgICAgICAgICAgICAgICAgICAgICBDUFUgMQorCT09PT09PT09PT09PT09PT09PT09PT09ICAgPT09PT09PT09PT09PT09PT09PT09PT0KKwlyMSA9IFJFQURfT05DRSh4KTsgICAgICAgIHIyID0gUkVBRF9PTkNFKHkpOworCWlmIChyMSA+IDApICAgICAgICAgICAgICAgaWYgKHIyID4gMCkKKwkgIFdSSVRFX09OQ0UoeSwgMSk7ICAgICAgICAgV1JJVEVfT05DRSh4LCAxKTsKKworCWFzc2VydCghKHIxID09IDEgJiYgcjIgPT0gMSkpOworCivsnbQg65GQIENQVSDsmIjsoJzsl5DshJwgYXNzZXJ0KCkg7J2YIOyhsOqxtOydgCDtla3sg4Eg7LC47J28IOqyg+yeheuLiOuLpC4gIOq3uOumrOqzoCwg66eM7JW9IOy7qO2KuOuhpAor7J2Y7KG07ISx7J20IOydtO2WieyEseydhCAo7Iuk7KCc66Gc64qUIOq3uOufrOyngCDslYrsp4Drp4wpIOuztOyepe2VnOuLpOuptCwg64uk7J2M7J2YIENQVSDqsIAg7LaU6rCA65CY7Ja064+ECivslYTrnpjsnZggYXNzZXJ0KCkg7KGw6rG07J2AIOywuOydtCDrkKDqsoPsnoXri4jri6Q6CisKKwlDUFUgMgorCT09PT09PT09PT09PT09PT09PT09PQorCVdSSVRFX09OQ0UoeCwgMik7CisKKwlhc3NlcnQoIShyMSA9PSAyICYmIHIyID09IDEgJiYgeCA9PSAyKSk7IC8qIEZBSUxTISEhICovCisKK+2VmOyngOunjCDsu6jtirjroaQg7J2Y7KG07ISx7J2AIOydtO2WieyEseydhCDsoJzqs7XtlZjsp4AgLeyViuq4sC0g65WM66y47JeQLCDshLjqsJzsnZggQ1BVIOyYiOygnOqwgCDsi6TtlokKK+yZhOujjOuQnCDtm4Tsl5Ag7JyE7J2YIGFzc2VydCgpIOydmCDsobDqsbTsnYAg6rGw7KeT7Jy866GcIO2PieqwgOuQoCDsiJgg7J6I7Iq164uI64ukLiAg7IS46rCc7J2YIENQVQor7JiI7KCc6rCAIOyInOyEnOulvCDsp4DtgqTquLgg7JuQ7ZWc64uk66m0LCBDUFUgMCDsmYAgQ1BVIDEg7L2U65Oc7J2YIOuhnOuTnOyZgCDsiqTthqDslrQg7IKs7J20LCAiaWYiCivrrLgg67CU66GcIOuLpOydjOyXkCBzbXBfbWIoKeulvCDrhKPslrTslbwg7ZWp64uI64ukLiAg642UIOuCmOyVhOqwgOyEnCwg7LWc7LSI7J2YIOuRkCBDUFUg7JiI7KCc64qUCivrp6TsmrAg7JyE7ZeY7ZWY66+A66GcIOyCrOyaqeuQmOyngCDslYrslYTslbwg7ZWp64uI64ukLgorCivsnbQg65GQ6rCc7J2YIOyYiOygnOuKlCDri6TsnYwg64W866y4OgoraHR0cDovL3d3dy5jbC5jYW0uYWMudWsvdXNlcnMvcGVzMjAvcHBjLXN1cHBsZW1lbnRhbC90ZXN0Ni5wZGYg7JmACivsnbQg7IKs7J207Yq4OiBodHRwczovL3d3dy5jbC5jYW0uYWMudWsvfnBlczIwL3BwY21lbS9pbmRleC5odG1sIOyXkCDrgpjsmKggTEIg7JmAIFdXQwor66as7Yq466i47IqkIO2FjOyKpO2KuOyeheuLiOuLpC4KKwor7JqU7JW97ZWY7J6Q66m0OgorCisgICgqKSDsu6jtirjroaQg7J2Y7KG07ISx7J2AIOyVnuydmCDroZzrk5zrk6TsnYQg65Kk7J2YIOyKpO2GoOyWtOuTpOyXkCDrjIDtlbQg7Iic7ISc66W8IOunnuy2sOykjeuLiOuLpC4KKyAgICAgIO2VmOyngOunjCwg6re4IOyZuOydmCDslrTrlqQg7Iic7ISc64+EIOuztOyepe2VmOyngCAt7JWK7Iq164uI64ukLTog7JWe7J2YIOuhnOuTnOyZgCDrkqTsnZgg66Gc65Oc65OkCisgICAgICDsgqzsnbTsl5Drj4QsIOyVnuydmCDsiqTthqDslrTsmYAg65Kk7J2YIOyKpO2GoOyWtOuTpCDsgqzsnbTsl5Drj4TsmpQuICDsnbTrn7Ag64uk66W4IO2Yle2DnOydmAorICAgICAg7Iic7ISc6rCAIO2VhOyalO2VmOuLpOuptCBzbXBfcm1iKCkg64KYIHNtcF93bWIoKeulvCwg65iQ64qULCDslZ7snZgg7Iqk7Yag7Ja065Ok6rO8IOuSpOydmAorICAgICAg66Gc65Oc65OkIOyCrOydtOydmCDsiJzshJzrpbwg7JyE7ZW07ISc64qUIHNtcF9tYigpIOulvCDsgqzsmqntlZjshLjsmpQuCisKKyAgKCopICJpZiIg66y47J2YIOyWkeqwiOuemCDruIzrnpzsuZjqsIAg6rCZ7J2AIOuzgOyImOyXkOydmCDrj5nsnbztlZwg7Iqk7Yag7Ja066GcIOyLnOyeke2VnOuLpOuptCwg6re4CisgICAgICDsiqTthqDslrTrk6TsnYAg6rCBIOyKpO2GoOyWtCDslZ7sl5Agc21wX21iKCkg66W8IOuEo+qxsOuCmCBzbXBfc3RvcmVfcmVsZWFzZSgpIOulvAorICAgICAg7IKs7Jqp7ZW07IScIOyKpO2GoOyWtOulvCDtlZjripQg7Iud7Jy866GcIOyInOyEnOulvCDrp57strDspJjslbwg7ZWp64uI64ukLiAg7J20IOusuOygnOulvCDtlbTqsrDtlZjquLAKKyAgICAgIOychO2VtCAiaWYiIOusuOydmCDslpHqsIjrnpgg67iM656c7LmY7J2YIOyLnOyekSDsp4DsoJDsl5AgYmFycmllcigpIOulvCDrhKPripQg6rKD66eM7Jy866Gc64qUCisgICAgICDstqnrtoTtlZwg7ZW06rKw7J20IOuQmOyngCDslYrripTrjbAsIOydtOuKlCDslZ7snZgg7JiI7JeQ7IScIOuzuOqyg+qzvCDqsJnsnbQsIOy7tO2MjOydvOufrOydmAorICAgICAg7LWc7KCB7ZmU64qUIGJhcnJpZXIoKSDqsIAg7J2Y66+47ZWY64qUIOuwlOulvCDsp4DtgqTrqbTshJzrj4Qg7Luo7Yq466GkIOydmOyhtOyEseydhCDshpDsg4Hsi5ztgqwKKyAgICAgIOyImCDsnojquLAg65WM66y47J20652864qUIOygkOydhCDrtoDrlJQg7JWM7JWE65GQ7Iuc6riwIOuwlOuejeuLiOuLpC4KKworICAoKikg7Luo7Yq466GkIOydmOyhtOyEseydgCDslZ7snZgg66Gc65Oc7JmAIOuSpOydmCDsiqTthqDslrQg7IKs7J207JeQIOy1nOyGjCDtlZjrgpjsnZgsIOyLpO2WiQorICAgICAg7Iuc7KCQ7JeQ7ISc7J2YIOyhsOqxtOq0gOqzhOulvCDtlYTsmpTroZwg7ZWY66mwLCDsnbQg7KGw6rG06rSA6rOE64qUIOyVnuydmCDroZzrk5zsmYAg6rSA6rOE65CY7Ja07JW8CisgICAgICDtlanri4jri6QuICDrp4zslb0g7Lu07YyM7J2865+s6rCAIOyhsOqxtCDqtIDqs4Trpbwg7LWc7KCB7ZmU66GcIOyXhuyVqOyImCDsnojri6TrqbQsIOyInOyEnOuPhAorICAgICAg7LWc7KCB7ZmU66GcIOyXhuyVoOuyhOuguOydhCDqsoHri4jri6QuICBSRUFEX09OQ0UoKSDsmYAgV1JJVEVfT05DRSgpIOydmCDso7zsnZgg6rmK7J2ACisgICAgICDsgqzsmqnsnYAg7KO87Ja07KeEIOyhsOqxtCDqtIDqs4Trpbwg7Jyg7KeA7ZWY64qU642wIOuPhOybgOydtCDrkKAg7IiYIOyeiOyKteuLiOuLpC4KKworICAoKikg7Luo7Yq466GkIOydmOyhtOyEseydhCDsnITtlbTshKAg7Lu07YyM7J2865+s6rCAIOyhsOqxtOq0gOqzhOulvCDsl4bslaDrsoTrpqzripQg6rKD7J2EIOunieyVhOyVvAorICAgICAg7ZWp64uI64ukLiAg7KO87J2YIOq5iuydgCBSRUFEX09OQ0UoKSDrgpggYXRvbWljeyw2NH1fcmVhZCgpIOydmCDsgqzsmqnsnbQg7Luo7Yq466GkCisgICAgICDsnZjsobTshLHsnbQg7IKs65287KeA7KeAIOyViuqyjCDtlZjripTrjbAg64+E7JuA7J2EIOykhCDsiJgg7J6I7Iq164uI64ukLiAg642UIOunjuydgCDsoJXrs7TrpbwKKyAgICAgIOychO2VtOyEoCAi7Lu07YyM7J2865+sIOuwsOumrOyWtCIg7IS57IWY7J2EIOywuOqzoO2VmOyLnOq4sCDrsJTrno3ri4jri6QuCisKKyAgKCopIOy7qO2KuOuhpCDsnZjsobTshLHsnYAg67O07Ya1IOuLpOuluCDtg4DsnoXsnZgg67Cw66as7Ja065Ok6rO8IOynneydhCDrp57strAg7IKs7Jqp65Cp64uI64ukLgorCisgICgqKSDsu6jtirjroaQg7J2Y7KG07ISx7J2AIOydtO2WieyEseydhCDsoJzqs7XtlZjsp4AgLeyViuyKteuLiOuLpC0uICDsnbTtlonshLHsnbQg7ZWE7JqU7ZWY64uk66m0LAorICAgICAgc21wX21iKCkg66W8IOyCrOyaqe2VmOyEuOyalC4KKworCitTTVAg67Cw66as7Ja0IOynneunnuy2lOq4sAorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ1BVIOqwhCDsg4HtmLjsnpHsmqnsnYQg64uk66OwIOuVjOyXkCDsnbzrtoAg7YOA7J6F7J2YIOuplOuqqOumrCDrsLDrpqzslrTripQg7ZWt7IOBIOynneydhCDrp57strAKK+yCrOyaqeuQmOyWtOyVvCDtlanri4jri6QuICDsoIHsoIjtlZjqsowg7Ked7J2EIOunnuy2lOyngCDslYrsnYAg7L2U65Oc64qUIOyCrOyLpOyDgSDsl5Drn6zsl5Ag6rCA6rmd7Iq164uI64ukLgorCivrspTsmqkg67Cw66as7Ja065Ok7J2AIOuylOyaqSDrsLDrpqzslrTrgbzrpqzrj4Qg7Ked7J2EIOunnuy2lOyngOunjCDsnbTtlonshLHsnbQg7JeG64qUIOuMgOu2gOu2hOydmCDri6TrpbgKK+2DgOyeheydmCDrsLDrpqzslrTrk6Tqs7zrj4Qg7Ked7J2EIOunnuy2peuLiOuLpC4gIEFDUVVJUkUg67Cw66as7Ja064qUIFJFTEVBU0Ug67Cw66as7Ja07JmAIOynneydhAor66ee7Lal64uI64uk66eMLCDrkZgg64ukIOuylOyaqSDrsLDrpqzslrTrpbwg7Y+s7ZWo7ZW0IOuLpOuluCDrsLDrpqzslrTrk6Tqs7zrj4Qg7Ked7J2EIOunnuy2nCDsiJgg7J6I7Iq164uI64ukLgor7JOw6riwIOuwsOumrOyWtOuKlCDrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtOuCmCDsu6jtirjroaQg7J2Y7KG07ISxLCBBQ1FVSVJFIOuwsOumrOyWtCwgUkVMRUFTRQor67Cw66as7Ja0LCDsnb3quLAg67Cw66as7Ja0LCDrmJDripQg67KU7JqpIOuwsOumrOyWtOyZgCDsp53snYQg66ee7Lal64uI64ukLiAg67mE7Iq37ZWY6rKMIOydveq4sCDrsLDrpqzslrTrgpgKK+y7qO2KuOuhpCDsnZjsobTshLEsIOuYkOuKlCDrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtOuKlCDsk7DquLAg67Cw66as7Ja064KYIEFDUVVJUkUg67Cw66as7Ja0LAorUkVMRUFTRSDrsLDrpqzslrQsIOuYkOuKlCDrspTsmqkg67Cw66as7Ja07JmAIOynneydhCDrp57stpTripTrjbAsIOuLpOydjOqzvCDqsJnsirXri4jri6Q6CisKKwlDUFUgMQkJICAgICAgQ1BVIDIKKwk9PT09PT09PT09PT09PT0JICAgICAgPT09PT09PT09PT09PT09CisJV1JJVEVfT05DRShhLCAxKTsKKwk87JOw6riwIOuwsOumrOyWtD4KKwlXUklURV9PTkNFKGIsIDIpOyAgICAgeCA9IFJFQURfT05DRShiKTsKKwkJCSAgICAgIDzsnb3quLAg67Cw66as7Ja0PgorCQkJICAgICAgeSA9IFJFQURfT05DRShhKTsKKwor65iQ64qUOgorCisJQ1BVIDEJCSAgICAgIENQVSAyCisJPT09PT09PT09PT09PT09CSAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlhID0gMTsKKwk87JOw6riwIOuwsOumrOyWtD4KKwlXUklURV9PTkNFKGIsICZhKTsgICAgeCA9IFJFQURfT05DRShiKTsKKwkJCSAgICAgIDzrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtD4KKwkJCSAgICAgIHkgPSAqeDsKKwor65iQ64qUOgorCisJQ1BVIDEJCSAgICAgIENQVSAyCisJPT09PT09PT09PT09PT09CSAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlyMSA9IFJFQURfT05DRSh5KTsKKwk867KU7JqpIOuwsOumrOyWtD4KKwlXUklURV9PTkNFKHksIDEpOyAgICAgaWYgKHIyID0gUkVBRF9PTkNFKHgpKSB7CisJCQkgICAgICAgICA866y17Iuc7KCBIOy7qO2KuOuhpCDsnZjsobTshLE+CisJCQkgICAgICAgICBXUklURV9PTkNFKHksIDEpOworCQkJICAgICAgfQorCisJYXNzZXJ0KHIxID09IDAgfHwgcjIgPT0gMCk7CisKK+q4sOuzuOyggeycvOuhnCwg7Jes6riw7ISc7J2YIOydveq4sCDrsLDrpqzslrTripQgIuuNlCDsmYTtmZTrkJwiIO2DgOyeheydvCDsiJwg7J6I7Ja064+EIO2VreyDgSDsobTsnqztlbTslbwKK+2VqeuLiOuLpC4KKworWyFdIOyTsOq4sCDrsLDrpqzslrQg7JWe7J2YIOyKpO2GoOyWtCDsmKTtjbzroIjsnbTshZjsnYAg7J2867CY7KCB7Jy866GcIOydveq4sCDrsLDrpqzslrTrgpgg642w7J207YSwCivsnZjsobTshLEg67Cw66as7Ja0IOuSpOydmCDroZzrk5wg7Jik7Y2866CI7J207IWY6rO8IOunpOy5mOuQoCDqsoPsnbTqs6AsIOuwmOuMgOuPhCDrp4jssKzqsIDsp4DsnoXri4jri6Q6CisKKwlDUFUgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFUgMgorCT09PT09PT09PT09PT09PT09PT0gICAgICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT0KKwlXUklURV9PTkNFKGEsIDEpOyAgICB9LS0tLSAgIC0tLT57ICB2ID0gUkVBRF9PTkNFKGMpOworCVdSSVRFX09OQ0UoYiwgMik7ICAgIH0gICAgXCAvICAgIHsgIHcgPSBSRUFEX09OQ0UoZCk7CisJPOyTsOq4sCDrsLDrpqzslrQ+ICAgICAgICAgICAgICBcICAgICAgICA87J296riwIOuwsOumrOyWtD4KKwlXUklURV9PTkNFKGMsIDMpOyAgICB9ICAgIC8gXCAgICB7ICB4ID0gUkVBRF9PTkNFKGEpOworCVdSSVRFX09OQ0UoZCwgNCk7ICAgIH0tLS0tICAgLS0tPnsgIHkgPSBSRUFEX09OQ0UoYik7CisKKwor66mU66qo66asIOuwsOumrOyWtCDsi5ztgIDsiqTsnZgg7JiICistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK+yyq+ynuCwg7JOw6riwIOuwsOumrOyWtOuKlCDsiqTthqDslrQg7Jik7Y2866CI7J207IWY65Ok7J2YIOu2gOu2hOyggSDsiJzshJwg7IS47Jqw6riw66GcIOuPmeyeke2VqeuLiOuLpC4KK+yVhOuemOydmCDsnbTrsqTtirgg7Iuc7YCA7Iqk66W8IOuztOyEuOyalDoKKworCUNQVSAxCisJPT09PT09PT09PT09PT09PT09PT09PT0KKwlTVE9SRSBBID0gMQorCVNUT1JFIEIgPSAyCisJU1RPUkUgQyA9IDMKKwk87JOw6riwIOuwsOumrOyWtD4KKwlTVE9SRSBEID0gNAorCVNUT1JFIEUgPSA1CisKK+ydtCDsnbTrsqTtirgg7Iuc7YCA7Iqk64qUIOuplOuqqOumrCDsnbzqtIDshLEg7Iuc7Iqk7YWc7JeQIOybkOyGjOuBvOumrOydmCDsiJzshJzqsIAg7KG07J6s7ZWY7KeAIOyViuuKlCDsp5HtlakKK3sgU1RPUkUgQSwgU1RPUkUgQiwgU1RPUkUgQyB9IOqwgCDsl63si5wg7JuQ7IaM64G866as7J2YIOyInOyEnOqwgCDsobTsnqztlZjsp4Ag7JWK64qUIOynke2VqQoreyBTVE9SRSBELCBTVE9SRSBFIH0g67O064ukIOuovOyggCDsnbzslrTrgpwg6rKD7Jy866GcIOyLnOyKpO2FnOydmCDrgpjrqLjsp4Ag7JqU7IaM65Ok7JeQIOuztOydtOuPhOuhnQor7KCE64us65Cp64uI64ukOgorCisJKy0tLS0tLS0rICAgICAgIDogICAgICA6CisJfCAgICAgICB8ICAgICAgICstLS0tLS0rCisJfCAgICAgICB8LS0tLS0tPnwgQz0zICB8ICAgICB9ICAgICAvXAorCXwgICAgICAgfCAgOiAgICArLS0tLS0tKyAgICAgfS0tLS0tICBcICAtLS0tLT4g7Iuc7Iqk7YWc7J2YIOuCmOuouOyngCDsmpTshozsl5AKKwl8ICAgICAgIHwgIDogICAgfCBBPTEgIHwgICAgIH0gICAgICAgIFwvICAgICAgIOuztOyXrOyniCDsiJgg7J6I64qUIOydtOuypO2KuOuTpAorCXwgICAgICAgfCAgOiAgICArLS0tLS0tKyAgICAgfQorCXwgQ1BVIDEgfCAgOiAgICB8IEI9MiAgfCAgICAgfQorCXwgICAgICAgfCAgICAgICArLS0tLS0tKyAgICAgfQorCXwgICAgICAgfCAgIHd3d3d3d3d3d3d3d3d3d3cgfSAgIDwtLS0g7Jes6riw7IScIOyTsOq4sCDrsLDrpqzslrTripQg67Cw66as7Ja0IOyVnuydmAorCXwgICAgICAgfCAgICAgICArLS0tLS0tKyAgICAgfSAgICAgICAg66qo65OgIOyKpO2GoOyWtOqwgCDrsLDrpqzslrQg65Kk7J2YIOyKpO2GoOyWtAorCXwgICAgICAgfCAgOiAgICB8IEU9NSAgfCAgICAgfSAgICAgICAg7KCE7JeQIOuplOuqqOumrCDsi5zsiqTthZzsl5Ag7KCE64us65CY64+E66GdCisJfCAgICAgICB8ICA6ICAgICstLS0tLS0rICAgICB9ICAgICAgICDtlanri4jri6QKKwl8ICAgICAgIHwtLS0tLS0+fCBEPTQgIHwgICAgIH0KKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsKKwkrLS0tLS0tLSsgICAgICAgOiAgICAgIDoKKwkgICAgICAgICAgICAgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICB8IENQVSAxIOyXkCDsnZjtlbQg66mU66qo66asIOyLnOyKpO2FnOyXkCDsoITri6zrkJjripQKKwkgICAgICAgICAgICAgICAgICAgfCDsnbzroKjsnZgg7Iqk7Yag7Ja0IOyYpO2NvOugiOydtOyFmOuTpAorCSAgICAgICAgICAgICAgICAgICBWCisKKwor65GY7Ke4LCDrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtOuKlCDrjbDsnbTthLAg7J2Y7KG07KCBIOuhnOuTnCDsmKTtjbzroIjsnbTshZjrk6TsnZgg67aA67aE7KCBIOyInOyEnAor7IS47Jqw6riw66GcIOuPmeyeke2VqeuLiOuLpC4gIOuLpOydjCDsnbzroKjsnZgg7J2067Kk7Yq465Ok7J2EIOuztOyEuOyalDoKKworCUNQVSAxCQkJQ1BVIDIKKwk9PT09PT09PT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT09PT09PT09PQorCQl7IEIgPSA3OyBYID0gOTsgWSA9IDg7IEMgPSAmWSB9CisJU1RPUkUgQSA9IDEKKwlTVE9SRSBCID0gMgorCTzsk7DquLAg67Cw66as7Ja0PgorCVNUT1JFIEMgPSAmQgkJTE9BRCBYCisJU1RPUkUgRCA9IDQJCUxPQUQgQyAoZ2V0cyAmQikKKwkJCQlMT0FEICpDIChyZWFkcyBCKQorCivsl6zquLDsl5Ag67OE64uk66W4IOqwnOyeheydtCDsl4bri6TrqbQsIENQVSAxIOydmCDsk7DquLAg67Cw66as7Ja07JeQ64+EIOu2iOq1rO2VmOqzoCBDUFUgMiDripQgQ1BVIDEKK+ydmCDsnbTrsqTtirjrk6TsnYQg7JmE7KCE7Z6IIOustOyekeychOyggSDsiJzshJzroZwg7J247KeA7ZWY6rKMIOuQqeuLiOuLpDoKKworCSstLS0tLS0tKyAgICAgICA6ICAgICAgOiAgICAgICAgICAgICAgICA6ICAgICAgIDoKKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsgICAgICAgICAgICAgICAgKy0tLS0tLS0rICB8IENQVSAyIOyXkCDsnbjsp4DrkJjripQKKwl8ICAgICAgIHwtLS0tLS0+fCBCPTIgIHwtLS0tLSAgICAgICAtLS0+fCBZLT44ICB8ICB8IOyXheuNsOydtO2KuCDsnbTrsqTtirgKKwl8ICAgICAgIHwgIDogICAgKy0tLS0tLSsgICAgIFwgICAgICAgICAgKy0tLS0tLS0rICB8IOyLnO2AgOyKpAorCXwgQ1BVIDEgfCAgOiAgICB8IEE9MSAgfCAgICAgIFwgICAgIC0tLT58IEMtPiZZIHwgIFYKKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsgICAgICAgfCAgICAgICAgKy0tLS0tLS0rCisJfCAgICAgICB8ICAgd3d3d3d3d3d3d3d3d3d3dyAgIHwgICAgICAgIDogICAgICAgOgorCXwgICAgICAgfCAgICAgICArLS0tLS0tKyAgICAgICB8ICAgICAgICA6ICAgICAgIDoKKwl8ICAgICAgIHwgIDogICAgfCBDPSZCIHwtLS0gICAgfCAgICAgICAgOiAgICAgICA6ICAgICAgICstLS0tLS0tKworCXwgICAgICAgfCAgOiAgICArLS0tLS0tKyAgIFwgICB8ICAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJfCAgICAgICB8LS0tLS0tPnwgRD00ICB8ICAgIC0tLS0tLS0tLS0tPnwgQy0+JkIgfC0tLS0tLT58ICAgICAgIHwKKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsgICAgICAgfCAgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSstLS0tLS0tKyAgICAgICA6ICAgICAgOiAgICAgICB8ICAgICAgICA6ICAgICAgIDogICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgIDogICAgICAgOiAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgOiAgICAgICA6ICAgICAgIHwgQ1BVIDIgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJICAgIOu2hOuqhe2eiCDsnpjrqrvrkJwgICAgICAgIC0tLT4gIHwgICAgICAgIHwgQi0+NyAgfC0tLS0tLT58ICAgICAgIHwKKwkgICAgQiDsnZgg6rCSIOyduOyngCAoISkgICAgICAgICAgIHwgICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgOiAgICAgICA6ICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJICAgIFgg7J2YIOuhnOuTnOqwgCBCIOydmCAgICAtLS0+ICAgIFwgICAgICAgfCBYLT45ICB8LS0tLS0tPnwgICAgICAgfAorCSAgICDsnbzqtIDshLEg7Jyg7KeA66W8ICAgICAgICAgICAgICAgIFwgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJICAgIOyngOyXsOyLnO2CtCAgICAgICAgICAgICAgICAgICAgICAtLS0tLT58IEItPjIgIHwgICAgICAgKy0tLS0tLS0rCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDoKKworCivslZ7snZgg7JiI7JeQ7IScLCBDUFUgMiDripQgKEIg7J2YIOqwkuydtCDrkKApICpDIOydmCDqsJIg7J296riw6rCAIEMg7J2YIExPQUQg65Kk7JeQIOydtOyWtOynkOyXkOuPhAorQiDqsIAgNyDsnbTrnbzripQg6rKw6rO866W8IOyWu+yKteuLiOuLpC4KKwor7ZWY7KeA66eMLCDrp4zslb0g642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrTqsIAgQyDsnZgg66Gc65Oc7JmAICpDICjspoksIEIpIOydmCDroZzrk5wg7IKs7J207JeQCivsnojsl4jri6TrqbQ6CisKKwlDUFUgMQkJCUNQVSAyCisJPT09PT09PT09PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09PT09PT09PT0KKwkJeyBCID0gNzsgWCA9IDk7IFkgPSA4OyBDID0gJlkgfQorCVNUT1JFIEEgPSAxCisJU1RPUkUgQiA9IDIKKwk87JOw6riwIOuwsOumrOyWtD4KKwlTVE9SRSBDID0gJkIJCUxPQUQgWAorCVNUT1JFIEQgPSA0CQlMT0FEIEMgKGdldHMgJkIpCisJCQkJPOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja0PgorCQkJCUxPQUQgKkMgKHJlYWRzIEIpCisKK+uLpOydjOqzvCDqsJnsnbQg65Cp64uI64ukOgorCisJKy0tLS0tLS0rICAgICAgIDogICAgICA6ICAgICAgICAgICAgICAgIDogICAgICAgOgorCXwgICAgICAgfCAgICAgICArLS0tLS0tKyAgICAgICAgICAgICAgICArLS0tLS0tLSsKKwl8ICAgICAgIHwtLS0tLS0+fCBCPTIgIHwtLS0tLSAgICAgICAtLS0+fCBZLT44ICB8CisJfCAgICAgICB8ICA6ICAgICstLS0tLS0rICAgICBcICAgICAgICAgICstLS0tLS0tKworCXwgQ1BVIDEgfCAgOiAgICB8IEE9MSAgfCAgICAgIFwgICAgIC0tLT58IEMtPiZZIHwKKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsgICAgICAgfCAgICAgICAgKy0tLS0tLS0rCisJfCAgICAgICB8ICAgd3d3d3d3d3d3d3d3d3d3dyAgIHwgICAgICAgIDogICAgICAgOgorCXwgICAgICAgfCAgICAgICArLS0tLS0tKyAgICAgICB8ICAgICAgICA6ICAgICAgIDoKKwl8ICAgICAgIHwgIDogICAgfCBDPSZCIHwtLS0gICAgfCAgICAgICAgOiAgICAgICA6ICAgICAgICstLS0tLS0tKworCXwgICAgICAgfCAgOiAgICArLS0tLS0tKyAgIFwgICB8ICAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJfCAgICAgICB8LS0tLS0tPnwgRD00ICB8ICAgIC0tLS0tLS0tLS0tPnwgQy0+JkIgfC0tLS0tLT58ICAgICAgIHwKKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsgICAgICAgfCAgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSstLS0tLS0tKyAgICAgICA6ICAgICAgOiAgICAgICB8ICAgICAgICA6ICAgICAgIDogICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgIDogICAgICAgOiAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgOiAgICAgICA6ICAgICAgIHwgQ1BVIDIgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgIHwgWC0+OSAgfC0tLS0tLT58ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSAgQyDroZzsnZgg7Iqk7Yag7Ja0IOyVnuydmCAgICAgLS0tPiAgIFwgICBkZGRkZGRkZGRkZGRkZGRkZCAgIHwgICAgICAgfAorCSAg66qo65OgIOydtOuypO2KuCDqsrDqs7zqsIAgICAgICAgICAgICAgXCAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkgIOuSpOydmCDroZzrk5zsl5DqsowgICAgICAgICAgICAgICAgICAgLS0tLS0+fCBCLT4yICB8LS0tLS0tPnwgICAgICAgfAorCSAg67O07J206rKMIOqwleygnO2VnOuLpCAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDogICAgICAgKy0tLS0tLS0rCisKKwor7IWL7Ke4LCDsnb3quLAg67Cw66as7Ja064qUIOuhnOuTnCDsmKTtjbzroIjsnbTshZjrk6Tsl5DsnZgg67aA67aE7KCBIOyInOyEnCDshLjsmrDquLDroZwg64+Z7J6R7ZWp64uI64ukLgor7JWE656Y7J2YIOydvOugqOydmCDsnbTrsqTtirjrpbwg67SF7Iuc64ukOgorCisJQ1BVIDEJCQlDUFUgMgorCT09PT09PT09PT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09CisJCXsgQSA9IDAsIEIgPSA5IH0KKwlTVE9SRSBBPTEKKwk87JOw6riwIOuwsOumrOyWtD4KKwlTVE9SRSBCPTIKKwkJCQlMT0FEIEIKKwkJCQlMT0FEIEEKKworQ1BVIDEg7J2AIOyTsOq4sCDrsLDrpqzslrTrpbwg7LOk7KeA66eMLCDrs4Tri6Trpbgg6rCc7J6F7J20IOyXhuuLpOuptCBDUFUgMiDripQgQ1BVIDEg7JeQ7IScIO2Wie2VtOynhAor7J2067Kk7Yq47J2YIOqysOqzvOulvCDrrLTsnpHsnITsoIEg7Iic7ISc66GcIOyduOyngO2VmOqyjCDrkKnri4jri6QuCisKKwkrLS0tLS0tLSsgICAgICAgOiAgICAgIDogICAgICAgICAgICAgICAgOiAgICAgICA6CisJfCAgICAgICB8ICAgICAgICstLS0tLS0rICAgICAgICAgICAgICAgICstLS0tLS0tKworCXwgICAgICAgfC0tLS0tLT58IEE9MSAgfC0tLS0tLSAgICAgIC0tLT58IEEtPjAgIHwKKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsgICAgICBcICAgICAgICAgKy0tLS0tLS0rCisJfCBDUFUgMSB8ICAgd3d3d3d3d3d3d3d3d3d3dyAgIFwgICAgLS0tPnwgQi0+OSAgfAorCXwgICAgICAgfCAgICAgICArLS0tLS0tKyAgICAgICAgfCAgICAgICArLS0tLS0tLSsKKwl8ICAgICAgIHwtLS0tLS0+fCBCPTIgIHwtLS0gICAgIHwgICAgICAgOiAgICAgICA6CisJfCAgICAgICB8ICAgICAgICstLS0tLS0rICAgXCAgICB8ICAgICAgIDogICAgICAgOiAgICAgICArLS0tLS0tLSsKKwkrLS0tLS0tLSsgICAgICAgOiAgICAgIDogICAgXCAgIHwgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLT58IEItPjIgIHwtLS0tLS0+fCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICstLS0tLS0tKyAgICAgICB8IENQVSAyIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfCBBLT4wICB8LS0tLS0tPnwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIDogICAgICAgOiAgICAgICArLS0tLS0tLSsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcICAgICAgOiAgICAgICA6CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwgICAgICstLS0tLS0tKworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLT58IEEtPjEgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0rCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOgorCisKK+2VmOyngOunjCwg66eM7JW9IOydveq4sCDrsLDrpqzslrTqsIAgQiDsnZgg66Gc65Oc7JmAIEEg7J2YIOuhnOuTnCDsgqzsnbTsl5Ag7KG07J6s7ZWc64uk66m0OgorCisJQ1BVIDEJCQlDUFUgMgorCT09PT09PT09PT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09CisJCXsgQSA9IDAsIEIgPSA5IH0KKwlTVE9SRSBBPTEKKwk87JOw6riwIOuwsOumrOyWtD4KKwlTVE9SRSBCPTIKKwkJCQlMT0FEIEIKKwkJCQk87J296riwIOuwsOumrOyWtD4KKwkJCQlMT0FEIEEKKworQ1BVIDEg7JeQIOydmO2VtCDrp4zrk6TslrTsp4Qg67aA67aE7KCBIOyInOyEnOqwgCBDUFUgMiDsl5Drj4Qg6re464yA66GcIOyduOyngOuQqeuLiOuLpDoKKworCSstLS0tLS0tKyAgICAgICA6ICAgICAgOiAgICAgICAgICAgICAgICA6ICAgICAgIDoKKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsgICAgICAgICAgICAgICAgKy0tLS0tLS0rCisJfCAgICAgICB8LS0tLS0tPnwgQT0xICB8LS0tLS0tICAgICAgLS0tPnwgQS0+MCAgfAorCXwgICAgICAgfCAgICAgICArLS0tLS0tKyAgICAgIFwgICAgICAgICArLS0tLS0tLSsKKwl8IENQVSAxIHwgICB3d3d3d3d3d3d3d3d3d3d3ICAgXCAgICAtLS0+fCBCLT45ICB8CisJfCAgICAgICB8ICAgICAgICstLS0tLS0rICAgICAgICB8ICAgICAgICstLS0tLS0tKworCXwgICAgICAgfC0tLS0tLT58IEI9MiAgfC0tLSAgICAgfCAgICAgICA6ICAgICAgIDoKKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsgICBcICAgIHwgICAgICAgOiAgICAgICA6ICAgICAgICstLS0tLS0tKworCSstLS0tLS0tKyAgICAgICA6ICAgICAgOiAgICBcICAgfCAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tPnwgQi0+MiAgfC0tLS0tLT58ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgKy0tLS0tLS0rICAgICAgIHwgQ1BVIDIgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICA6ICAgICAgIDogICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIDogICAgICAgOiAgICAgICB8ICAgICAgIHwKKwkgIOyXrOq4sOyEnCDsnb3quLAg67Cw66as7Ja064qUICAgLS0tLT4gICBcICBycnJycnJycnJycnJycnJyciAgIHwgICAgICAgfAorCSAgQiDroZzsnZgg7Iqk7Yag7Ja0IOyghOydmCAgICAgICAgICAgICAgXCAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSAg66qo65OgIOqysOqzvOulvCBDUFUgMiDsl5AgICAgICAgICAgICAgLS0tLT58IEEtPjEgIHwtLS0tLS0+fCAgICAgICB8CisJICDrs7TsnbTrj4TroZ0g7ZWc64ukICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6ICAgICAgICstLS0tLS0tKworCisKK+uNlCDsmYTrsr3tlZwg7ISk66qF7J2EIOychO2VtCwgQSDsnZgg66Gc65Oc6rCAIOydveq4sCDrsLDrpqzslrQg7JWe6rO8IOuSpOyXkCDsnojsnLzrqbQg7Ja065a76rKMIOuQoOyngAor7IOd6rCB7ZW0IOu0heyLnOuLpDoKKworCUNQVSAxCQkJQ1BVIDIKKwk9PT09PT09PT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT09PT09PT09PQorCQl7IEEgPSAwLCBCID0gOSB9CisJU1RPUkUgQT0xCisJPOyTsOq4sCDrsLDrpqzslrQ+CisJU1RPUkUgQj0yCisJCQkJTE9BRCBCCisJCQkJTE9BRCBBIFtmaXJzdCBsb2FkIG9mIEFdCisJCQkJPOydveq4sCDrsLDrpqzslrQ+CisJCQkJTE9BRCBBIFtzZWNvbmQgbG9hZCBvZiBBXQorCitBIOydmCDroZzrk5wg65GQ6rCc6rCAIOuqqOuRkCBCIOydmCDroZzrk5wg65Kk7JeQIOyeiOyngOunjCwg7ISc66GcIOuLpOuluCDqsJLsnYQg7Ja77Ja07JisIOyImAor7J6I7Iq164uI64ukOgorCisJKy0tLS0tLS0rICAgICAgIDogICAgICA6ICAgICAgICAgICAgICAgIDogICAgICAgOgorCXwgICAgICAgfCAgICAgICArLS0tLS0tKyAgICAgICAgICAgICAgICArLS0tLS0tLSsKKwl8ICAgICAgIHwtLS0tLS0+fCBBPTEgIHwtLS0tLS0gICAgICAtLS0+fCBBLT4wICB8CisJfCAgICAgICB8ICAgICAgICstLS0tLS0rICAgICAgXCAgICAgICAgICstLS0tLS0tKworCXwgQ1BVIDEgfCAgIHd3d3d3d3d3d3d3d3d3d3cgICBcICAgIC0tLT58IEItPjkgIHwKKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsgICAgICAgIHwgICAgICAgKy0tLS0tLS0rCisJfCAgICAgICB8LS0tLS0tPnwgQj0yICB8LS0tICAgICB8ICAgICAgIDogICAgICAgOgorCXwgICAgICAgfCAgICAgICArLS0tLS0tKyAgIFwgICAgfCAgICAgICA6ICAgICAgIDogICAgICAgKy0tLS0tLS0rCisJKy0tLS0tLS0rICAgICAgIDogICAgICA6ICAgIFwgICB8ICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0+fCBCLT4yICB8LS0tLS0tPnwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICArLS0tLS0tLSsgICAgICAgfCBDUFUgMiB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIDogICAgICAgOiAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgOiAgICAgICA6ICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwgQS0+MCAgfC0tLS0tLT58IDFzdCAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSAg7Jes6riw7IScIOydveq4sCDrsLDrpqzslrTripQgICAtLS0tPiAgIFwgIHJycnJycnJycnJycnJycnJyICAgfCAgICAgICB8CisJICBCIOuhnOydmCDsiqTthqDslrQg7KCE7J2YICAgICAgICAgICAgICBcICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJICDrqqjrk6Ag6rKw6rO866W8IENQVSAyIOyXkCAgICAgICAgICAgICAtLS0tPnwgQS0+MSAgfC0tLS0tLT58IDJuZCAgIHwKKwkgIOuztOydtOuPhOuhnSDtlZzri6QgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDogICAgICAgKy0tLS0tLS0rCisKKwor7ZWY7KeA66eMIENQVSAxIOyXkOyEnOydmCBBIOyXheuNsOydtO2KuOuKlCDsnb3quLAg67Cw66as7Ja06rCAIOyZhOujjOuQmOq4sCDsoITsl5Drj4Qg67O07J28IOyImOuPhAor7J6I6ri0IO2VqeuLiOuLpDoKKworCSstLS0tLS0tKyAgICAgICA6ICAgICAgOiAgICAgICAgICAgICAgICA6ICAgICAgIDoKKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsgICAgICAgICAgICAgICAgKy0tLS0tLS0rCisJfCAgICAgICB8LS0tLS0tPnwgQT0xICB8LS0tLS0tICAgICAgLS0tPnwgQS0+MCAgfAorCXwgICAgICAgfCAgICAgICArLS0tLS0tKyAgICAgIFwgICAgICAgICArLS0tLS0tLSsKKwl8IENQVSAxIHwgICB3d3d3d3d3d3d3d3d3d3d3ICAgXCAgICAtLS0+fCBCLT45ICB8CisJfCAgICAgICB8ICAgICAgICstLS0tLS0rICAgICAgICB8ICAgICAgICstLS0tLS0tKworCXwgICAgICAgfC0tLS0tLT58IEI9MiAgfC0tLSAgICAgfCAgICAgICA6ICAgICAgIDoKKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsgICBcICAgIHwgICAgICAgOiAgICAgICA6ICAgICAgICstLS0tLS0tKworCSstLS0tLS0tKyAgICAgICA6ICAgICAgOiAgICBcICAgfCAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tPnwgQi0+MiAgfC0tLS0tLT58ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgKy0tLS0tLS0rICAgICAgIHwgQ1BVIDIgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICA6ICAgICAgIDogICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCAgICAgIDogICAgICAgOiAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLT58IEEtPjEgIHwtLS0tLS0+fCAxc3QgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycnJycnJycnJycnJycnJyciAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQS0+MSAgfC0tLS0tLT58IDJuZCAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDogICAgICAgKy0tLS0tLS0rCisKKwor7Jes6riw7IScIOuztOyepeuQmOuKlCDqsbQsIOunjOyVvSBCIOydmCDroZzrk5zqsIAgQiA9PSAyIOudvOuKlCDqsrDqs7zrpbwg67Sk64uk66m0LCBBIOyXkOydmCDrkZDrsojsp7gKK+uhnOuTnOuKlCDtla3sg4EgQSA9PSAxIOydhCDrs7Tqsowg65CgIOqyg+ydtOudvOuKlCDqsoHri4jri6QuICBBIOyXkOydmCDssqvrsojsp7gg66Gc65Oc7JeQ64qUIOq3uOufsAor67O07J6l7J20IOyXhuyKteuLiOuLpDsgQSA9PSAwIOydtOqxsOuCmCBBID09IDEg7J206rGw64KYIOuRmCDspJEg7ZWY64KY7J2YIOqysOqzvOulvCDrs7Tqsowg65Cg6rKB64uI64ukLgorCisKK+ydveq4sCDrqZTrqqjrpqwg67Cw66as7Ja0IFZTIOuhnOuTnCDsmIjsuKEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwor66eO7J2AIENQVeuTpOydtCDroZzrk5zrpbwg7JiI7Lih7KCB7Jy866GcIChzcGVjdWxhdGl2ZWx5KSDtlanri4jri6Q6IOyWtOuWpCDrjbDsnbTthLDrpbwg66mU66qo66as7JeQ7IScCivroZzrk5ztlbTslbwg7ZWY6rKMIOuQoOyngCDsmIjsuKHsnYQg7ZaI64uk66m0LCDtlbTri7kg642w7J207YSw66W8IOuhnOuTnO2VmOuKlCDsnbjsiqTtirjrn63shZjsnYQg7Iuk7KCc66Gc64qUCivslYTsp4Eg66eM64KY7KeAIOyViuyVmOuNlOudvOuPhCDri6Trpbgg66Gc65OcIOyekeyXheydtCDsl4bslrQg67KE7IqkIChidXMpIOqwgCDslYTrrLQg7J2864+EIO2VmOqzoCDsnojsp4AKK+yViuuLpOuptCwg6re4IOuNsOydtO2EsOulvCDroZzrk5ztlanri4jri6QuICDsnbTtm4Tsl5Ag7Iuk7KCcIOuhnOuTnCDsnbjsiqTtirjrn63shZjsnbQg7Iuk7ZaJ65CY66m0IENQVSDqsIAKK+ydtOuvuCDqt7gg6rCS7J2EIOqwgOyngOqzoCDsnojquLAg65WM66y47JeQIOq3uCDroZzrk5wg7J247Iqk7Yq465+t7IWY7J2AIOymieyLnCDsmYTro4zrkKnri4jri6QuCisKK+2VtOuLuSBDUFUg64qUIOyLpOygnOuhnOuKlCDqt7gg6rCS7J20IO2VhOyalOy5mCDslYrslZjri6TripQg7IKs7Iuk7J20IOuCmOykkeyXkCDrk5zrn6zrgqAg7IiY64+EIOyeiOuKlOuNsCAtCivtlbTri7kg66Gc65OcIOyduOyKpO2KuOufreyFmOydtCDruIzrnpzsuZjroZwg7Jqw7ZqM65CY6rGw64KYIO2WiOydhCDsiJgg7J6I6rKg7KOgIC0gLCDqt7jroIfqsowg65CY66m0IOyVnuyEnAor7J297Ja065GUIOqwkuydhCDrsoTrpqzqsbDrgpgg64KY7KSR7J2YIOyCrOyaqeydhCDsnITtlbQg7LqQ7Iuc7JeQIOuEo+yWtOuRmCDsiJgg7J6I7Iq164uI64ukLgorCivri6TsnYzsnYQg7IOd6rCB7ZW0IOu0heyLnOuLpDoKKworCUNQVSAxCQkJQ1BVIDIKKwk9PT09PT09PT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT09PT09PT09PQorCQkJCUxPQUQgQgorCQkJCURJVklERQkJfSDrgpjriITquLAg66qF66C57J2AIOydvOuwmOyggeycvOuhnAorCQkJCURJVklERQkJfSDquLQg7Iuc6rCE7J2EIO2VhOyalOuhnCDtlanri4jri6QKKwkJCQlMT0FEIEEKKwor64qUIOydtOugh+qyjCDrkKAg7IiYIOyeiOyKteuLiOuLpDoKKworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDogICAgICAgKy0tLS0tLS0rCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0+fCBCLT4yICB8LS0tLS0tPnwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSsgICAgICAgfCBDUFUgMiB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOkRJVklERSB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCeuCmOuIhOq4sCDtlZjripDrnbwg67CU7IGcICAgICAgIC0tLT4gICAgICAgLS0tPnwgQS0+MCAgfH5+fn4gICB8ICAgICAgIHwKKwlDUFUg64qUIEEg7J2YIExPQUQg66W8ICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0rICAgfiAgIHwgICAgICAgfAorCeyYiOy4oe2VtOyEnCDsiJjtlontlZzri6QgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOiAgIH4gICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6RElWSURFIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDogICB+ICAgfCAgICAgICB8CisJ64KY64iE6riw6rCAIOuBneuCmOuptCAgICAgICAtLS0+ICAgICAtLS0+ICAgICA6ICAgICAgIDogICB+LS0+fCAgICAgICB8CisJQ1BVIOuKlCDtlbTri7kgTE9BRCDrpbwgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDogICAgICAgfCAgICAgICB8CisJ7KaJ6rCBIOyZhOujjO2VnOuLpCAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOiAgICAgICArLS0tLS0tLSsKKworCivsnb3quLAg67Cw66as7Ja064KYIOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja066W8IOuRkOuyiOynuCDroZzrk5wg7KeB7KCE7JeQIOuGk+uKlOuLpOuptDoKKworCUNQVSAxCQkJQ1BVIDIKKwk9PT09PT09PT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT09PT09PT09PQorCQkJCUxPQUQgQgorCQkJCURJVklERQorCQkJCURJVklERQorCQkJCTzsnb3quLAg67Cw66as7Ja0PgorCQkJCUxPQUQgQQorCivsmIjsuKHsnLzroZwg7Ja77Ja07KeEIOqwkuydgCDsgqzsmqnrkJwg67Cw66as7Ja07J2YIO2DgOyeheyXkCDrlLDrnbzshJwg7ZW064u5IOqwkuydtCDsmLPsnYDsp4Ag6rKA7Yag65CY6rKMCivrkKnri4jri6QuICDrp4zslb0g7ZW064u5IOuplOuqqOumrCDsmIHsl63sl5Ag67OA7ZmU6rCAIOyXhuyXiOuLpOuptCwg7JiI7Lih7Jy866GcIOyWu+yWtOuRkOyXiOuNmCDqsJLsnbQKK+yCrOyaqeuQqeuLiOuLpDoKKworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDogICAgICAgKy0tLS0tLS0rCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0+fCBCLT4yICB8LS0tLS0tPnwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSsgICAgICAgfCBDUFUgMiB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOkRJVklERSB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCeuCmOuIhOq4sCDtlZjripDrnbwg67CU7IGcICAgICAgIC0tLT4gICAgICAgLS0tPnwgQS0+MCAgfH5+fn4gICB8ICAgICAgIHwKKwlDUFUg64qUIEEg7J2YIExPQUQg66W8ICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0rICAgfiAgIHwgICAgICAgfAorCeyYiOy4oe2VnOuLpCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6ICAgfiAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDpESVZJREUgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOiAgIH4gICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6ICAgfiAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJycnJycnJycnJycnJycnJ+ICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOiAgIH4gICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6ICAgfi0tPnwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDogICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOiAgICAgICArLS0tLS0tLSsKKworCivtlZjsp4Drp4wg64uk66W4IENQVSDsl5DshJwg7JeF642w7J207Yq464KYIOustO2aqO2ZlOqwgCDsnojsl4jri6TrqbQsIOq3uCDsmIjsuKHsnYAg66y07Zqo7ZmU65CY6rOgIOq3uCDqsJLsnYAKK+uLpOyLnCDsnb3tmIDsp5Hri4jri6Q6CisKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6ICAgICAgICstLS0tLS0tKworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tPnwgQi0+MiAgfC0tLS0tLT58ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0rICAgICAgIHwgQ1BVIDIgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDpESVZJREUgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwnrgpjriITquLAg7ZWY64qQ6528IOuwlOyBnCAgICAgICAtLS0+ICAgICAgIC0tLT58IEEtPjAgIHx+fn5+ICAgfCAgICAgICB8CisJQ1BVIOuKlCBBIOydmCBMT0FEIOulvCAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKyAgIH4gICB8ICAgICAgIHwKKwnsmIjsuKHtlZzri6QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOiAgIH4gICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6RElWSURFIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDogICB+ICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOiAgIH4gICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycnJycnJycnJycnJycnJyciAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJ7JiI7Lih7ISxIOuPmeyekeydgCDrrLTtmqjtmZQg65CY6rOgICAgIC0tLT4gICAtLS0+fCBBLT4xICB8LS0tLS0tPnwgICAgICAgfAorCeyXheuNsOydtO2KuOuQnCDqsJLsnbQg64uk7IucIOydve2YgOynhOuLpCAgICAgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDogICAgICAgKy0tLS0tLS0rCisKKwor7J207ZaJ7ISxCistLS0tLS0KKwor7J207ZaJ7ISxKHRyYW5zaXRpdml0eSnsnYAg7Iuk7KCc7J2YIOy7tO2TqO2EsCDsi5zsiqTthZzsl5DshJwg7ZWt7IOBIOygnOqzteuQmOyngOuKlCDslYrripQsIOyInOyEnAor66ee7LaU6riw7JeQIOuMgO2VnCDsg4Hri7ntnogg7KeB6rSA7KCB7J24IOqwnOuFkOyeheuLiOuLpC4gIOuLpOydjOydmCDsmIjqsIAg7J207ZaJ7ISx7J2EIOuztOyXrOykjeuLiOuLpDoKKworCUNQVSAxCQkJQ1BVIDIJCQlDUFUgMworCT09PT09PT09PT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09CisJCXsgWCA9IDAsIFkgPSAwIH0KKwlTVE9SRSBYPTEJCUxPQUQgWAkJCVNUT1JFIFk9MQorCQkJCTzrspTsmqkg67Cw66as7Ja0PgkJPOuylOyaqSDrsLDrpqzslrQ+CisJCQkJTE9BRCBZCQkJTE9BRCBYCisKK0NQVSAyIOydmCBYIOuhnOuTnOqwgCAx7J2EIOumrO2EtO2WiOqzoCBZIOuhnOuTnOqwgCAw7J2EIOumrO2EtO2WiOuLpOqzoCDtlbTrtIXsi5zri6QuICDsnbTripQgQ1BVIDIg7J2YCitYIOuhnOuTnOqwgCBDUFUgMSDsnZggWCDsiqTthqDslrQg65Kk7JeQIOydtOujqOyWtOyhjOqzoCBDUFUgMiDsnZggWSDroZzrk5zripQgQ1BVIDMg7J2YIFkg7Iqk7Yag7Ja0CivsoITsl5Ag7J2066Oo7Ja07KGM7J2M7J2EIOydmOuvuO2VqeuLiOuLpC4gIOq3uOufvCAiQ1BVIDMg7J2YIFgg66Gc65Oc64qUIDDsnYQg66as7YS07ZWgIOyImCDsnojrgpjsmpQ/IgorCitDUFUgMiDsnZggWCDroZzrk5zripQgQ1BVIDEg7J2YIOyKpO2GoOyWtCDtm4Tsl5Ag7J2066Oo7Ja07KGM7Jy864uILCBDUFUgMyDsnZggWCDroZzrk5zripQgMeydhAor66as7YS07ZWY64qU6rKMIOyekOyXsOyKpOufveyKteuLiOuLpC4gIOydtOufsCDsg53qsIHsnbQg7J207ZaJ7ISx7J2YIO2VnCDsmIjsnoXri4jri6Q6IENQVSBBIOyXkOyEnCDsi6TtlonrkJwKK+uhnOuTnOqwgCBDUFUgQiDsl5DshJzsnZgg6rCZ7J2AIOuzgOyImOyXkCDrjIDtlZwg66Gc65Oc66W8IOuSpOuUsOuluOuLpOuptCwgQ1BVIEEg7J2YIOuhnOuTnOuKlCBDUFUgQgor7J2YIOuhnOuTnOqwgCDrgrTrhpPsnYAg6rCS6rO8IOqwmeqxsOuCmCDqt7gg7ZuE7J2YIOqwkuydhCDrgrTrhpPslYTslbwg7ZWp64uI64ukLgorCivrpqzriIXsiqQg7Luk64SQ7JeQ7IScIOuylOyaqSDrsLDrpqzslrTsnZgg7IKs7Jqp7J2AIOydtO2WieyEseydhCDrs7TsnqXtlanri4jri6QuICDrlLDrnbzshJwsIOyVnuydmCDsmIjsl5DshJwKK0NQVSAyIOydmCBYIOuhnOuTnOqwgCAx7J2ELCBZIOuhnOuTnOuKlCAw7J2EIOumrO2EtO2WiOuLpOuptCwgQ1BVIDMg7J2YIFgg66Gc65Oc64qUIOuwmOuTnOyLnCAx7J2ECivrpqzthLTtlanri4jri6QuCisKK+2VmOyngOunjCwg7J296riw64KYIOyTsOq4sCDrsLDrpqzslrTsl5Ag64yA7ZW07ISc64qUIOydtO2WieyEseydtCDrs7TsnqXrkJjsp4AgLeyViuyKteuLiOuLpC0uICDsmIjrpbwg65Ok7Ja0LAor7JWe7J2YIOyYiOyXkOyEnCBDUFUgMiDsnZgg67KU7JqpIOuwsOumrOyWtOqwgCDslYTrnpjsspjrn7wg7J296riwIOuwsOumrOyWtOuhnCDrsJTrgJAg6rK97Jqw66W8IOyDneqwge2VtAor67SF7Iuc64ukOgorCisJQ1BVIDEJCQlDUFUgMgkJCUNQVSAzCisJPT09PT09PT09PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09PT09PT09PT0KKwkJeyBYID0gMCwgWSA9IDAgfQorCVNUT1JFIFg9MQkJTE9BRCBYCQkJU1RPUkUgWT0xCisJCQkJPOydveq4sCDrsLDrpqzslrQ+CQk867KU7JqpIOuwsOumrOyWtD4KKwkJCQlMT0FEIFkJCQlMT0FEIFgKKwor7J20IOy9lOuTnOuKlCDsnbTtlonshLHsnYQg6rCW7KeAIOyViuyKteuLiOuLpDog7J20IOyYiOyXkOyEnOuKlCwgQ1BVIDIg7J2YIFgg66Gc65Oc6rCAIDHsnYQKK+umrO2EtO2VmOqzoCwgWSDroZzrk5zripQgMOydhCDrpqzthLTtlZjsp4Drp4wgQ1BVIDMg7J2YIFgg66Gc65Oc6rCAIDDsnYQg66as7YS07ZWY64qUIOqyg+uPhCDsmYTsoITtnogKK+2VqeuyleyggeyeheuLiOuLpC4KKworQ1BVIDIg7J2YIOydveq4sCDrsLDrpqzslrTqsIAg7J6Q7Iug7J2YIOydveq4sOuKlCDsiJzshJzrpbwg66ee7Law7KSY64+ELCBDUFUgMSDsnZgg7Iqk7Yag7Ja07JmA7J2YCivsiJzshJzrpbwg66ee7Law7KSA64uk6rOg64qUIOuztOyepe2VoCDsiJgg7JeG64uk64qU6rKMIO2VteyLrOyeheuLiOuLpC4gIOuUsOudvOyEnCwgQ1BVIDEg6rO8IENQVSAyIOqwgAor67KE7Y2864KYIOy6kOyLnOulvCDqs7XsnKDtlZjripQg7Iuc7Iqk7YWc7JeQ7IScIOydtCDsmIjsoJwg7L2U65Oc6rCAIOyLpO2WieuQnOuLpOuptCwgQ1BVIDIg64qUIENQVSAxIOydtAor7JO0IOqwkuyXkCDsooAg67mo66asIOygkeq3vO2VoCDsiJgg7J6I7J2EIOqyg+yeheuLiOuLpC4gIOuUsOudvOyEnCBDUFUgMSDqs7wgQ1BVIDIg7J2YIOygkeq3vOycvOuhnAor7KGw7ZWp65CcIOyInOyEnOulvCDrqqjrk6AgQ1BVIOqwgCDrj5nsnZjtlaAg7IiYIOyeiOuPhOuhnSDtlZjquLAg7JyE7ZW0IOuylOyaqSDrsLDrpqzslrTqsIAg7ZWE7JqU7ZWp64uI64ukLgorCivrspTsmqkg67Cw66as7Ja064qUICLquIDroZzrsowg7J207ZaJ7ISxIuydhCDsoJzqs7XtlbTshJwsIOuqqOuToCBDUFUg65Ok7J20IOyYpO2NvOugiOydtOyFmOuTpOydmCDsiJzshJzsl5AKK+uPmeydmO2VmOqyjCDtlaAg6rKD7J6F64uI64ukLiAg67CY66m0LCByZWxlYXNlLWFjcXVpcmUg7KGw7ZWp7J2AICLroZzsu6wg7J207ZaJ7ISxIiDrp4zsnYQKK+ygnOqzte2VtOyEnCwg7ZW064u5IOyhsO2VqeydtCDsgqzsmqnrkJwgQ1BVIOuTpOunjOydtCDtlbTri7kg7JWh7IS47Iqk65Ok7J2YIOyhsO2VqeuQnCDsiJzshJzsl5Ag64+Z7J2Y7ZWo7J20Civrs7TsnqXrkKnri4jri6QuICDsmIjrpbwg65Ok7Ja0LCDsobTqsr3siqTrn7AgSGVybWFuIEhvbGxlcml0aCDsnZggQyDsvZTrk5zroZwg67O066m0OgorCisJaW50IHUsIHYsIHgsIHksIHo7CisKKwl2b2lkIGNwdTAodm9pZCkKKwl7CisJCXIwID0gc21wX2xvYWRfYWNxdWlyZSgmeCk7CisJCVdSSVRFX09OQ0UodSwgMSk7CisJCXNtcF9zdG9yZV9yZWxlYXNlKCZ5LCAxKTsKKwl9CisKKwl2b2lkIGNwdTEodm9pZCkKKwl7CisJCXIxID0gc21wX2xvYWRfYWNxdWlyZSgmeSk7CisJCXI0ID0gUkVBRF9PTkNFKHYpOworCQlyNSA9IFJFQURfT05DRSh1KTsKKwkJc21wX3N0b3JlX3JlbGVhc2UoJnosIDEpOworCX0KKworCXZvaWQgY3B1Mih2b2lkKQorCXsKKwkJcjIgPSBzbXBfbG9hZF9hY3F1aXJlKCZ6KTsKKwkJc21wX3N0b3JlX3JlbGVhc2UoJngsIDEpOworCX0KKworCXZvaWQgY3B1Myh2b2lkKQorCXsKKwkJV1JJVEVfT05DRSh2LCAxKTsKKwkJc21wX21iKCk7CisJCXIzID0gUkVBRF9PTkNFKHUpOworCX0KKworY3B1MCgpLCBjcHUxKCksIOq3uOumrOqzoCBjcHUyKCkg64qUIHNtcF9zdG9yZV9yZWxlYXNlKCkvc21wX2xvYWRfYWNxdWlyZSgpIOyMjeydmAor7Jew6rKw7J2EIO2Gte2VnCDroZzsu6wg7J207ZaJ7ISx7JeQIOuPmeywuO2VmOqzoCDsnojsnLzrr4DroZwsIOuLpOydjOqzvCDqsJnsnYAg6rKw6rO864qUIOuCmOyYpOyngCDslYrsnYQKK+qygeuLiOuLpDoKKworCXIwID09IDEgJiYgcjEgPT0gMSAmJiByMiA9PSAxCisKK+uNlCDrgpjslYTqsIDshJwsIGNwdTAoKSDsmYAgY3B1MSgpIOyCrOydtOydmCByZWxlYXNlLWFjcXVpcmUg6rSA6rOE66GcIOyduO2VtCwgY3B1MSgpIOydgAorY3B1MCgpIOydmCDsk7DquLDrpbwg67SQ7JW866eMIO2VmOuvgOuhnCwg64uk7J2M6rO8IOqwmeydgCDqsrDqs7zrj4Qg7JeG7J2EIOqygeuLiOuLpDoKKworCXIxID09IDEgJiYgcjUgPT0gMAorCivtlZjsp4Drp4wsIHJlbGVhc2UtYWNxdWlyZSDtg4Drj5nshLHsnYAg64+Z7LC47ZWcIENQVSDrk6Tsl5Drp4wg7KCB7Jqp65CY66+A66GcIGNwdTMoKSDsl5DripQKK+yggeyaqeuQmOyngCDslYrsirXri4jri6QuICDrlLDrnbzshJwsIOuLpOydjOqzvCDqsJnsnYAg6rKw6rO86rCAIOqwgOuKpe2VqeuLiOuLpDoKKworCXIwID09IDAgJiYgcjEgPT0gMSAmJiByMiA9PSAxICYmIHIzID09IDAgJiYgcjQgPT0gMAorCivruYTsirftlZjqsowsIOuLpOydjOqzvCDqsJnsnYAg6rKw6rO864+EIOqwgOuKpe2VqeuLiOuLpDoKKworCXIwID09IDAgJiYgcjEgPT0gMSAmJiByMiA9PSAxICYmIHIzID09IDAgJiYgcjQgPT0gMCAmJiByNSA9PSAxCisKK2NwdTAoKSwgY3B1MSgpLCDqt7jrpqzqs6AgY3B1MigpIOuKlCDqt7jrk6TsnZgg7J296riw7JmAIOyTsOq4sOulvCDsiJzshJzrjIDroZwg67O06rKMIOuQmOyngOunjCwKK3JlbGVhc2UtYWNxdWlyZSDssrTsnbjsl5Ag6rSA7Jes65CY7KeAIOyViuydgCBDUFUg65Ok7J2AIOq3uCDsiJzshJzsl5Ag7J206rKs7J2EIOqwgOyniCDsiJgKK+yeiOyKteuLiOuLpC4gIOydtOufsCDsnbTqsqzsnYAgc21wX2xvYWRfYWNxdWlyZSgpIOyZgCBzbXBfc3RvcmVfcmVsZWFzZSgpIOydmCDqtaztmITsl5AKK+yCrOyaqeuQmOuKlCDsmYTtmZTrkJwg66mU66qo66asIOuwsOumrOyWtCDsnbjsiqTtirjrn63shZjrk6TsnYAg7ZWt7IOBIOuwsOumrOyWtCDslZ7snZgg7Iqk7Yag7Ja065Ok7J2EIOuSpOydmAor66Gc65Oc65Ok7JeQIOyVnuyEuOyauCDtlYTsmpTripQg7JeG64uk64qUIOyCrOyLpOyXkOyEnCDquLDsnbjtlanri4jri6QuICDsnbQg66eQ7J2AIGNwdTMoKSDripQgY3B1MCgpIOydmAordSDroZzsnZgg7Iqk7Yag7Ja066W8IGNwdTEoKSDsnZggdiDroZzrtoDthLDsnZgg66Gc65OcIOuSpOyXkCDsnbzslrTrgpwg6rKD7Jy866GcIOuzvCDsiJgg7J6I64uk64qUCivrnLvsnoXri4jri6QsIGNwdTAoKSDsmYAgY3B1MSgpIOydgCDsnbQg65GQIOyYpO2NvOugiOydtOyFmOydtCDsnZjrj4TrkJwg7Iic7ISc64yA66GcIOydvOyWtOuCrOydjOyXkAor66qo65GQIOuPmeydmO2VmOuKlOuNsOuPhCDrp5DsnoXri4jri6QuCisKK+2VmOyngOunjCwgc21wX2xvYWRfYWNxdWlyZSgpIOuKlCDrp4jsiKDsnbQg7JWE64uY7J2EIOuqheyLrO2VmOyLnOq4sCDrsJTrno3ri4jri6QuICDqtazssrTsoIHsnLzroZwsCivsnbQg7ZWo7IiY64qUIOuLqOyInO2eiCDsiJzshJwg6rec7LmZ7J2EIOyngO2CpOupsCDsnbjsnpDroZzrtoDthLDsnZgg7J296riw66W8IOyImO2Wie2VqeuLiOuLpC4gIOydtOqyg+ydgAor7Ja065akIO2Kueygle2VnCDqsJLsnbQg7J297Z6QIOqyg+yduOyngOuKlCDrs7TsnqXtlZjsp4AgLeyViuyKteuLiOuLpC0uICDrlLDrnbzshJwsIOuLpOydjOqzvCDqsJnsnYAg6rKw6rO864+ECivqsIDriqXtlanri4jri6Q6CisKKwlyMCA9PSAwICYmIHIxID09IDAgJiYgcjIgPT0gMCAmJiByNSA9PSAwCisKK+ydtOufsCDqsrDqs7zripQg7Ja065akIOqyg+uPhCDsnqzrsLDsuZgg65CY7KeAIOyViuuKlCwg7Iic7LCo7KCBIOydvOq0gOyEseydhCDqsIDsp4Qg6rCA7IOB7J2YCivsi5zsiqTthZzsl5DshJzrj4Qg7J287Ja064KgIOyImCDsnojsnYzsnYQg6riw7Ja17ZW0IOuRkOyLnOq4sCDrsJTrno3ri4jri6QuCisKK+uLpOyLnCDrp5DtlZjsp4Drp4wsIOuLueyLoOydmCDsvZTrk5zqsIAg6riA66Gc67KMIOydtO2WieyEseydhCDtlYTsmpTroZwg7ZWc64uk66m0LCDrspTsmqkg67Cw66as7Ja066W8CivsgqzsmqntlZjsi63si5zsmKQuCisKKworPT09PT09PT09PT09PT09PT09CivrqoXsi5zsoIEg7Luk64SQIOuwsOumrOyWtAorPT09PT09PT09PT09PT09PT09CisKK+umrOuIheyKpCDsu6TrhJDsnYAg7ISc66GcIOuLpOuluCDri6jqs4Tsl5DshJwg64+Z7J6R7ZWY64qUIOuLpOyWke2VnCDrsLDrpqzslrTrk6TsnYQg6rCA7KeA6rOgIOyeiOyKteuLiOuLpDoKKworICAoKikg7Lu07YyM7J2865+sIOuwsOumrOyWtC4KKworICAoKikgQ1BVIOuplOuqqOumrCDrsLDrpqzslrQuCisKKyAgKCopIE1NSU8g7JOw6riwIOuwsOumrOyWtC4KKworCivsu7TtjIzsnbzrn6wg67Cw66as7Ja0CistLS0tLS0tLS0tLS0tLS0KKwor66as64iF7IqkIOy7pOuEkOydgCDsu7TtjIzsnbzrn6zqsIAg66mU66qo66asIOyVoeyEuOyKpOulvCDsnqzrsLDsuZgg7ZWY64qUIOqyg+ydhCDrp4nslYTso7zripQg66qF7Iuc7KCB7J24Civsu7TtjIzsnbzrn6wg67Cw66as7Ja066W8IOqwgOyngOqzoCDsnojsirXri4jri6Q6CisKKwliYXJyaWVyKCk7CisKK+ydtOqxtCDrspTsmqkg67Cw66as7Ja07J6F64uI64ukIC0tIGJhcnJpZXIoKSDsnZgg7J296riwLeydveq4sCDrgpgg7JOw6riwLeyTsOq4sCDrs4DsooXsnYAg7JeG7Iq164uI64ukLgor7ZWY7KeA66eMLCBSRUFEX09OQ0UoKSDsmYAgV1JJVEVfT05DRSgpIOuKlCDtirnsoJUg7JWh7IS47Iqk65Ok7JeQIOuMgO2VtOyEnOunjCDrj5nsnpHtlZjripQKK2JhcnJpZXIoKSDsnZgg7JmE7ZmU65CcIO2Yle2DnOuhnCDrs7wg7IiYIOyeiOyKteuLiOuLpC4KKworYmFycmllcigpIO2VqOyImOuKlCDri6TsnYzqs7wg6rCZ7J2AIO2aqOqzvOulvCDqsJbsirXri4jri6Q6CisKKyAoKikg7Lu07YyM7J2865+s6rCAIGJhcnJpZXIoKSDrkqTsnZgg7JWh7IS47Iqk65Ok7J20IGJhcnJpZXIoKSDslZ7snZgg7JWh7IS47Iqk67O064ukIOyVnuycvOuhnAorICAgICDsnqzrsLDsuZjrkJjsp4Ag66q77ZWY6rKMIO2VqeuLiOuLpC4gIOyYiOulvCDrk6TslrQsIOyduO2EsOufve2KuCDtlbjrk6Trn6wg7L2U65Oc7JmAIOyduO2EsOufve2KuCDri7ntlZwKKyAgICAg7L2U65OcIOyCrOydtOydmCDthrXsi6DsnYQg7Iug7KSR7Z6IIO2VmOq4sCDsnITtlbQg7IKs7Jqp65CgIOyImCDsnojsirXri4jri6QuCisKKyAoKikg66Oo7ZSE7JeQ7IScLCDsu7TtjIzsnbzrn6zqsIAg66Oo7ZSEIOyhsOqxtOyXkCDsgqzsmqnrkJwg67OA7IiY66W8IOunpCDsnbTthLDroIjsnbTshZjrp4jri6QKKyAgICAg66mU66qo66as7JeQ7IScIOuhnOuTnO2VmOyngCDslYrslYTrj4Qg65CY64+E66GdIOy1nOygge2ZlCDtlZjripTqsbgg67Cp7KeA7ZWp64uI64ukLgorCitSRUFEX09OQ0UoKSDsmYAgV1JJVEVfT05DRSgpIO2VqOyImOuKlCDsi7HquIAg7JOw66CI65OcIOy9lOuTnOyXkOyEnOuKlCDrrLjsoJwg7JeG7KeA66eMIOuPmeyLnOyEseydtAor7J6I64qUIOy9lOuTnOyXkOyEnOuKlCDrrLjsoJzqsIAg65CgIOyImCDsnojripQg66qo65OgIOy1nOygge2ZlOulvCDrp4nsirXri4jri6QuICDsnbTrn7Ag66WY7J2YIOy1nOygge2ZlOyXkAor64yA7ZWcIOyYiOulvCDrqofqsIDsp4Ag65Ok7Ja067O066m0IOuLpOydjOqzvCDqsJnsirXri4jri6Q6CisKKyAoKikg7Lu07YyM7J2865+s64qUIOqwmeydgCDrs4DsiJjsl5Ag64yA7ZWcIOuhnOuTnOyZgCDsiqTthqDslrTrpbwg7J6s67Cw7LmYIO2VoCDsiJgg7J6I6rOgLCDslrTrlqQKKyAgICAg6rK97Jqw7JeQ64qUIENQVeqwgCDqsJnsnYAg67OA7IiY66Gc67aA7YSw7J2YIOuhnOuTnOuTpOydhCDsnqzrsLDsuZjtlaAg7IiY64+EIOyeiOyKteuLiOuLpC4gIOydtOuKlAorICAgICDri6TsnYzsnZgg7L2U65Oc6rCAOgorCisJYVswXSA9IHg7CisJYVsxXSA9IHg7CisKKyAgICAgeCDsnZgg7JiI7KCEIOqwkuydtCBhWzFdIOyXkCwg7IOIIOqwkuydtCBhWzBdIOyXkCDsnojqsowg7ZWgIOyImCDsnojri6TripQg65y77J6F64uI64ukLgorICAgICDsu7TtjIzsnbzrn6zsmYAgQ1BV6rCAIOydtOufsCDsnbzsnYQg66q77ZWY6rKMIO2VmOugpOuptCDri6TsnYzqs7wg6rCZ7J20IO2VtOyVvCDtlanri4jri6Q6CisKKwlhWzBdID0gUkVBRF9PTkNFKHgpOworCWFbMV0gPSBSRUFEX09OQ0UoeCk7CisKKyAgICAg7KaJLCBSRUFEX09OQ0UoKSDsmYAgV1JJVEVfT05DRSgpIOuKlCDsl6zrn6wgQ1BVIOyXkOyEnCDtlZjrgpjsnZgg67OA7IiY7JeQIOqwgO2VtOyngOuKlAorICAgICDslaHshLjsiqTrk6Tsl5Ag7LqQ7IucIOydvOq0gOyEseydhCDsoJzqs7Xtlanri4jri6QuCisKKyAoKikg7Lu07YyM7J2865+s64qUIOqwmeydgCDrs4DsiJjsl5Ag64yA7ZWcIOyXsOyGjeyggeyduCDroZzrk5zrk6TsnYQg67OR7ZWp7ZWgIOyImCDsnojsirXri4jri6QuICDqt7jrn7AKKyAgICAg67OR7ZWpIOyekeyXheycvOuhnCDsu7TtjIzsnbzrn6zripQg64uk7J2M7J2YIOy9lOuTnOulvDoKKworCXdoaWxlICh0bXAgPSBhKQorCQlkb19zb21ldGhpbmdfd2l0aCh0bXApOworCisgICAgIOuLpOydjOqzvCDqsJnsnbQsIOyLseq4gCDsk7DroIjrk5wg7L2U65Oc7JeQ7ISc64qUIOunkOydtCDrkJjsp4Drp4wg6rCc67Cc7J6Q7J2YIOydmOuPhOyZgCDsoITtmIAg66ee7KeACisgICAgIOyViuuKlCDrsKntlqXsnLzroZwgIuy1nOygge2ZlCIg7ZWgIOyImCDsnojsirXri4jri6Q6CisKKwlpZiAodG1wID0gYSkKKwkJZm9yICg7OykKKwkJCWRvX3NvbWV0aGluZ193aXRoKHRtcCk7CisKKyAgICAg7Lu07YyM7J2865+s6rCAIOydtOufsCDsp5PsnYQg7ZWY7KeAIOuqu+2VmOqyjCDtlZjroKTrqbQgUkVBRF9PTkNFKCkg66W8IOyCrOyaqe2VmOyEuOyalDoKKworCXdoaWxlICh0bXAgPSBSRUFEX09OQ0UoYSkpCisJCWRvX3NvbWV0aGluZ193aXRoKHRtcCk7CisKKyAoKikg7JiI7Luo64yAIOugiOyngOyKpO2EsCDsgqzsmqnrn4nsnbQg66eO7JWEIOy7tO2MjOydvOufrOqwgCDrqqjrk6Ag642w7J207YSw66W8IOugiOyngOyKpO2EsOyXkCDri7TsnYQg7IiYCisgICAgIOyXhuuKlCDqsr3smrAsIOy7tO2MjOydvOufrOuKlCDrs4DsiJjrpbwg64uk7IucIOuhnOuTnO2VoCDsiJgg7J6I7Iq164uI64ukLiAg65Sw65287IScIOy7tO2MjOydvOufrOuKlAorICAgICDslZ7snZgg7JiI7JeQ7IScIOuzgOyImCAndG1wJyDsgqzsmqnsnYQg7LWc7KCB7ZmU66GcIOyXhuyVoOuyhOumtCDsiJgg7J6I7Iq164uI64ukOgorCisJd2hpbGUgKHRtcCA9IGEpCisJCWRvX3NvbWV0aGluZ193aXRoKHRtcCk7CisKKyAgICAg7J20IOy9lOuTnOuKlCDri6TsnYzqs7wg6rCZ7J20IOyLseq4gCDsk7DroIjrk5zsl5DshJzripQg7JmE67K97ZWY7KeA66eMIOuPmeyLnOyEseydtCDsobTsnqztlZjripQKKyAgICAg6rK97Jqw7JeUIOy5mOuqheyggeyduCDsvZTrk5zroZwg67CU64CUIOyImCDsnojsirXri4jri6Q6CisKKwl3aGlsZSAoYSkKKwkJZG9fc29tZXRoaW5nX3dpdGgoYSk7CisKKyAgICAg7JiI66W8IOuTpOyWtCwg7LWc7KCB7ZmU65CcIOydtCDsvZTrk5zripQg67OA7IiYIGEg6rCAIOuLpOuluCBDUFUg7JeQIOydmO2VtCAid2hpbGUiIOusuOqzvAorICAgICBkb19zb21ldGhpbmdfd2l0aCgpIO2YuOy2nCDsgqzsnbTsl5Ag67CU64CM7Ja0IGRvX3NvbWV0aGluZ193aXRoKCkg7JeQIDDsnYQg64SY6ri4CisgICAgIOyImOuPhCDsnojsirXri4jri6QuCisKKyAgICAg7J2067KI7JeQ64+ELCDsu7TtjIzsnbzrn6zqsIAg6re465+wIOynk+ydhCDtlZjripTqsbgg66eJ6riwIOychO2VtCBSRUFEX09OQ0UoKSDrpbwg7IKs7Jqp7ZWY7IS47JqUOgorCisJd2hpbGUgKHRtcCA9IFJFQURfT05DRShhKSkKKwkJZG9fc29tZXRoaW5nX3dpdGgodG1wKTsKKworICAgICDroIjsp4DsiqTthLDqsIAg67aA7KGx7ZWcIOyDge2ZqeydhCDqsqrripQg6rK97JqwLCDsu7TtjIzsnbzrn6zripQgdG1wIOulvCDsiqTtg53sl5Ag7KCA7J6l7ZW065GYIOyImOuPhAorICAgICDsnojsirXri4jri6QuICDsu7TtjIzsnbzrn6zqsIAg67OA7IiY66W8IOuLpOyLnCDsnb3slrTrk6TsnbTripTqsbQg7J2066CH6rKMIOyggOyepe2VtOuRkOqzoCDtm4Tsl5Ag64uk7IucCisgICAgIOydveyWtOuTpOydtOuKlOuNsCDrk5zripQg7Jik67KE7Zek65OcIOuVjOusuOyeheuLiOuLpC4gIOq3uOugh+qyjCDtlZjripTqsowg7Iux6riAIOyTsOugiOuTnAorICAgICDsvZTrk5zsl5DshJzripQg7JWI7KCE7ZWY66+A66GcLCDslYjsoITtlZjsp4Ag7JWK7J2AIOqyveyasOyXkOuKlCDsu7TtjIzsnbzrn6zsl5Dqsowg7KeB7KCRIOyVjOugpOykmOyVvAorICAgICDtlanri4jri6QuCisKKyAoKikg7Lu07YyM7J2865+s64qUIOq3uCDqsJLsnbQg66y07JeH7J287KeAIOyVjOqzoCDsnojri6TrqbQg66Gc65Oc66W8IOyVhOyYiCDslYjtlaAg7IiY64+EIOyeiOyKteuLiOuLpC4KKyAgICAg7JiI66W8IOuTpOyWtCwg64uk7J2M7J2YIOy9lOuTnOuKlCDrs4DsiJggJ2EnIOydmCDqsJLsnbQg7ZWt7IOBIDDsnoTsnYQg7Kad66qF7ZWgIOyImCDsnojri6TrqbQ6CisKKwl3aGlsZSAodG1wID0gYSkKKwkJZG9fc29tZXRoaW5nX3dpdGgodG1wKTsKKworICAgICDsnbTroIfqsowg7LWc7KCB7ZmUIOuQmOyWtOuyhOumtCDsiJgg7J6I7Iq164uI64ukOgorCisJZG8geyB9IHdoaWxlICgwKTsKKworICAgICDsnbQg67OA7ZmY7J2AIOyLseq4gCDsk7DroIjrk5wg7L2U65Oc7JeQ7ISc64qUIOuPhOybgOydtCDrkJjripTrjbAg66Gc65Oc7JmAIOu4jOuenOy5mOulvCDsoJzqsbDtlojquLAKKyAgICAg65WM66y47J6F64uI64ukLiAg66y47KCc64qUIOy7tO2MjOydvOufrOqwgCAnYScg7J2YIOqwkuydhCDsl4XrjbDsnbTtirgg7ZWY64qU6rG0IO2YhOyerOydmCBDUFUg7ZWY64KYCisgICAgIOu/kOydtOudvOuKlCDqsIDsoJUg7JyE7JeQ7IScIOymneuqheydhCDtlojri6TripTrjbAg7J6I7Iq164uI64ukLiAg66eM7JW9IOuzgOyImCAnYScg6rCAIOqzteycoOuQmOyWtAorICAgICDsnojri6TrqbQsIOy7tO2MjOydvOufrOydmCDspp3rqoXsnYAg7YuA66awIOqyg+ydtCDrkKDqsoHri4jri6QuICDsu7TtjIzsnbzrn6zripQg6re4IOyekOyLoOydtAorICAgICDsg53qsIHtlZjripQg6rKD66eM7YG8IOunjuydgCDqsoPsnYQg7JWM6rOgIOyeiOyngCDrqrvtlajsnYQg7Lu07YyM7J2865+s7JeQ6rKMIOyVjOumrOq4sCDsnITtlbQKKyAgICAgUkVBRF9PTkNFKCkg66W8IOyCrOyaqe2VmOyEuOyalDoKKworCXdoaWxlICh0bXAgPSBSRUFEX09OQ0UoYSkpCisJCWRvX3NvbWV0aGluZ193aXRoKHRtcCk7CisKKyAgICAg7ZWY7KeA66eMIOy7tO2MjOydvOufrOuKlCBSRUFEX09OQ0UoKSDrkqTsl5Ag64KY7Jik64qUIOqwkuyXkCDrjIDtlbTshJzrj4Qg64iI6ri47J2EIOuRkOqzoCDsnojsnYzsnYQKKyAgICAg6riw7Ja17ZWY7IS47JqULiAg7JiI66W8IOuTpOyWtCwg64uk7J2M7J2YIOy9lOuTnOyXkOyEnCBNQVgg64qUIOyghOyymOumrOq4sCDrp6TtgazroZzroZwsIDHsnZgg6rCS7J2ECisgICAgIOqwluuKlOuLpOqzoCDtlbTrtIXsi5zri6Q6CisKKwl3aGlsZSAoKHRtcCA9IFJFQURfT05DRShhKSkgJSBNQVgpCisJCWRvX3NvbWV0aGluZ193aXRoKHRtcCk7CisKKyAgICAg7J2066CH6rKMIOuQmOuptCDsu7TtjIzsnbzrn6zripQgTUFYIOulvCDqsIDsp4Dqs6Ag7IiY7ZaJ65CY64qUICIlIiDsmKTtjbzroIjsnbTthLDsnZgg6rKw6rO86rCAIO2VreyDgQorICAgICAw7J20652864qUIOqyg+ydhCDslYzqsowg65CY6rOgLCDsu7TtjIzsnbzrn6zqsIAg7L2U65Oc66W8IOyLpOyniOyggeycvOuhnOuKlCDsobTsnqztlZjsp4Ag7JWK64qUCisgICAgIOqyg+yymOufvCDstZzsoIHtmZQg7ZWY64qUIOqyg+ydtCDtl4jsmqnrkJjslrQg67KE66a964uI64ukLiAgKCdhJyDrs4DsiJjsnZgg66Gc65Oc64qUIOyXrOyghO2eiAorICAgICDtlontlbTsp4gg6rKB64uI64ukLikKKworICgqKSDruYTsirftlZjqsowsIOy7tO2MjOydvOufrOuKlCDrs4DsiJjqsIAg7KCA7J6l7ZWY66CkIO2VmOuKlCDqsJLsnYQg7J2066+4IOqwgOyngOqzoCDsnojri6TripQg6rKD7J2ECisgICAgIOyVjOuptCDsiqTthqDslrQg7J6Q7LK066W8IOygnOqxsO2VoCDsiJgg7J6I7Iq164uI64ukLiAg7J2067KI7JeQ64+ELCDsu7TtjIzsnbzrn6zripQg7ZiE7J6s7J2YIENQVQorICAgICDrp4zsnbQg6re4IOuzgOyImOyXkCDqsJLsnYQg7JOw64qUIOyYpOuhnOyngCDtlZjrgpjsnZgg7KG07J6s65286rOgIOyDneqwge2VmOyXrCDqs7XsnKDrkJwg67OA7IiY7JeQCisgICAgIOuMgO2VtOyEnOuKlCDsnpjrqrvrkJwg7J287J2EIO2VmOqyjCDrkKnri4jri6QuICDsmIjrpbwg65Ok7Ja0LCDri6TsnYzqs7wg6rCZ7J2AIOqyveyasOqwgCDsnojsnYQg7IiYCisgICAgIOyeiOyKteuLiOuLpDoKKworCWEgPSAwOworCS4uLiDrs4DsiJggYSDsl5Ag7Iqk7Yag7Ja066W8IO2VmOyngCDslYrripQg7L2U65OcIC4uLgorCWEgPSAwOworCisgICAgIOy7tO2MjOydvOufrOuKlCDrs4DsiJggJ2EnIOydmCDqsJLsnYAg7J2066+4IDDsnbTrnbzripQg6rKD7J2EIOyVjOqzoCwg65Sw65287IScIOuRkOuyiOynuCDsiqTthqDslrTrpbwKKyAgICAg7IKt7KCc7ZWgIOqygeuLiOuLpC4gIOunjOyVvSDri6TrpbggQ1BVIOqwgCDqt7gg7IKs7J20IOuzgOyImCAnYScg7JeQIOuLpOuluCDqsJLsnYQg7I2864uk66m0CisgICAgIO2ZqeuLue2VnCDqsrDqs7zqsIAg64KY7JisIOqygeuLiOuLpC4KKworICAgICDsu7TtjIzsnbzrn6zqsIAg6re465+wIOyemOuqu+uQnCDstpTsuKHsnYQg7ZWY7KeAIOyViuuPhOuhnSBXUklURV9PTkNFKCkg66W8IOyCrOyaqe2VmOyEuOyalDoKKworCVdSSVRFX09OQ0UoYSwgMCk7CisJLi4uIOuzgOyImCBhIOyXkCDsiqTthqDslrTrpbwg7ZWY7KeAIOyViuuKlCDsvZTrk5wgLi4uCisJV1JJVEVfT05DRShhLCAwKTsKKworICgqKSDsu7TtjIzsnbzrn6zripQg7ZWY7KeAIOunkOudvOqzoCDtlZjsp4Ag7JWK7Jy866m0IOuplOuqqOumrCDslaHshLjsiqTrk6TsnYQg7J6s67Cw7LmYIO2VoCDsiJgKKyAgICAg7J6I7Iq164uI64ukLiAg7JiI66W8IOuTpOyWtCwg64uk7J2M7J2YIO2UhOuhnOyEuOyKpCDroIjrsqgg7L2U65Oc7JmAIOyduO2EsOufve2KuCDtlbjrk6Trn6wg7IKs7J207J2YCisgICAgIOyDge2YuOyekeyaqeydhCDsg53qsIHtlbQg67SF7Iuc64ukOgorCisJdm9pZCBwcm9jZXNzX2xldmVsKHZvaWQpCisJeworCQltc2cgPSBnZXRfbWVzc2FnZSgpOworCQlmbGFnID0gdHJ1ZTsKKwl9CisKKwl2b2lkIGludGVycnVwdF9oYW5kbGVyKHZvaWQpCisJeworCQlpZiAoZmxhZykKKwkJCXByb2Nlc3NfbWVzc2FnZShtc2cpOworCX0KKworICAgICDsnbQg7L2U65Oc7JeQ64qUIOy7tO2MjOydvOufrOqwgCBwcm9jZXNzX2xldmVsKCkg7J2EIOuLpOydjOqzvCDqsJnsnbQg67OA7ZmY7ZWY64qUIOqyg+ydhCDrp4nsnYQKKyAgICAg7IiY64uo7J20IOyXhuqzoCwg7J2065+wIOuzgO2ZmOydgCDsi7HquIDsk7DroIjrk5zsl5DshJzrnbzrqbQg7Iuk7KCc66GcIO2bjOulre2VnCDshKDtg53snbwg7IiYCisgICAgIOyeiOyKteuLiOuLpDoKKworCXZvaWQgcHJvY2Vzc19sZXZlbCh2b2lkKQorCXsKKwkJZmxhZyA9IHRydWU7CisJCW1zZyA9IGdldF9tZXNzYWdlKCk7CisJfQorCisgICAgIOydtCDrkZDqsJzsnZgg66y47J6lIOyCrOydtOyXkCDsnbjthLDrn73tirjqsIAg67Cc7IOd7ZWc64uk66m0LCBpbnRlcnJ1cHRfaGFuZGxlcigpIOuKlCDsnZjrr7jrpbwKKyAgICAg7JWMIOyImCDsl4bripQg66mU7IS47KeA66W8IOuwm+ydhCDsiJjrj4Qg7J6I7Iq164uI64ukLiAg7J206rG4IOunieq4sCDsnITtlbQg64uk7J2M6rO8IOqwmeydtAorICAgICBXUklURV9PTkNFKCkg66W8IOyCrOyaqe2VmOyEuOyalDoKKworCXZvaWQgcHJvY2Vzc19sZXZlbCh2b2lkKQorCXsKKwkJV1JJVEVfT05DRShtc2csIGdldF9tZXNzYWdlKCkpOworCQlXUklURV9PTkNFKGZsYWcsIHRydWUpOworCX0KKworCXZvaWQgaW50ZXJydXB0X2hhbmRsZXIodm9pZCkKKwl7CisJCWlmIChSRUFEX09OQ0UoZmxhZykpCisJCQlwcm9jZXNzX21lc3NhZ2UoUkVBRF9PTkNFKG1zZykpOworCX0KKworICAgICBpbnRlcnJ1cHRfaGFuZGxlcigpIOyViOyXkOyEnOuPhCDspJHssqnrkJwg7J247YSw65+97Yq464KYIE5NSSDsmYAg6rCZ7J20IOyduO2EsOufve2KuCDtlbjrk6Trn6wKKyAgICAg7Jet7IucICdmbGFnJyDsmYAgJ21zZycg7JeQIOygkeq3vO2VmOuKlCDrmJDri6Trpbgg66y07Ja46rCA7JeQIOyduO2EsOufve2KuCDrkKAg7IiYIOyeiOuLpOuptAorICAgICBSRUFEX09OQ0UoKSDsmYAgV1JJVEVfT05DRSgpIOulvCDsgqzsmqntlbTslbwg7ZWo7J2EIOq4sOyWte2VtCDrkZDshLjsmpQuICDrp4zslb0g6re465+wCisgICAgIOqwgOuKpeyEseydtCDsl4bri6TrqbQsIGludGVycnVwdF9oYW5kbGVyKCkg7JWI7JeQ7ISc64qUIOusuOyEnO2ZlCDrqqnsoIHsnbQg7JWE64uI652866m0CisgICAgIFJFQURfT05DRSgpIOyZgCBXUklURV9PTkNFKCkg64qUIO2VhOyalOy5mCDslYrsirXri4jri6QuICAo6re8656Y7J2YIOumrOuIheyKpCDsu6TrhJDsl5DshJwKKyAgICAg7KSR7LKp65CcIOyduO2EsOufve2KuOuKlCDrs7TthrUg7J6YIOydvOyWtOuCmOyngCDslYrsnYzrj4Qg6riw7Ja17ZW0IOuRkOyEuOyalCwg7Iuk7KCc66GcLCDslrTrlqQKKyAgICAg7J247YSw65+97Yq4IO2VuOuTpOufrOqwgCDsnbjthLDrn73tirjqsIAg7Zmc7ISx7ZmU65CcIOyxhOuhnCDrpqzthLTtlZjrqbQgV0FSTl9PTkNFKCkg6rCACisgICAgIOyLpO2WieuQqeuLiOuLpC4pCisKKyAgICAg7Lu07YyM7J2865+s64qUIFJFQURfT05DRSgpIOyZgCBXUklURV9PTkNFKCkg65Kk7J2YIFJFQURfT05DRSgpIOuCmCBXUklURV9PTkNFKCksCisgICAgIGJhcnJpZXIoKSwg65iQ64qUIOu5hOyKt+2VnCDqsoPrk6TsnYQg64u06rOgIOyeiOyngCDslYrsnYAg7L2U65Oc66W8IOybgOyngeydvCDsiJgg7J6I7J2EIOqyg+ycvOuhnAorICAgICDqsIDsoJXrkJjslrTslbwg7ZWp64uI64ukLgorCisgICAgIOydtCDtmqjqs7zripQgYmFycmllcigpIOulvCDthrXtlbTshJzrj4Qg66eM65OkIOyImCDsnojsp4Drp4wsIFJFQURfT05DRSgpIOyZgAorICAgICBXUklURV9PTkNFKCkg6rCAIOyigCDrjZQg7JWI66qpIOuGkuydgCDshKDtg53snoXri4jri6Q6IFJFQURfT05DRSgpIOyZgCBXUklURV9PTkNFKCnripQKKyAgICAg7Lu07YyM7J2865+s7JeQIOyjvOyWtOynhCDrqZTrqqjrpqwg7JiB7Jet7JeQIOuMgO2VtOyEnOunjCDstZzsoIHtmZQg6rCA64ql7ISx7J2EIO2PrOq4sO2VmOuPhOuhnQorICAgICDtlZjsp4Drp4wsIGJhcnJpZXIoKSDripQg7Lu07YyM7J2865+s6rCAIOyngOq4iOq5jOyngCDquLDqs4TsnZgg66CI7KeA7Iqk7YSw7JeQIOy6kOyLnO2VtCDrhpPsnYAKKyAgICAg66qo65OgIOuplOuqqOumrCDsmIHsl63snZgg6rCS7J2EIOuyhOugpOyVvCDtlZjqsowg7ZWY6riwIOuVjOusuOyeheuLiOuLpC4gIOusvOuhoCwg7Lu07YyM7J2865+s64qUCisgICAgIFJFQURfT05DRSgpIOyZgCBXUklURV9PTkNFKCkg6rCAIOydvOyWtOuCnCDsiJzshJzrj4Qg7KeA7Lyc7KSN64uI64ukLCBDUFUg64qUIOuLueyXsO2eiAorICAgICDqt7gg7Iic7ISc66W8IOyngO2CrCDsnZjrrLTqsIAg7JeG7KeA66eM7JqULgorCisgKCopIOy7tO2MjOydvOufrOuKlCDri6TsnYzsnZgg7JiI7JeQ7ISc7JmAIOqwmeydtCDrs4DsiJjsl5DsnZgg7Iqk7Yag7Ja066W8IOuCoOyhsO2VtOuCvCDsiJjrj4Qg7J6I7Iq164uI64ukOgorCisJaWYgKGEpCisJCWIgPSBhOworCWVsc2UKKwkJYiA9IDQyOworCisgICAgIOy7tO2MjOydvOufrOuKlCDslYTrnpjsmYAg6rCZ7J2AIOy1nOygge2ZlOuhnCDruIzrnpzsuZjrpbwg7KSE7J28IOqygeuLiOuLpDoKKworCWIgPSA0MjsKKwlpZiAoYSkKKwkJYiA9IGE7CisKKyAgICAg7Iux6riAIOyTsOugiOuTnCDsvZTrk5zsl5DshJwg7J20IOy1nOygge2ZlOuKlCDslYjsoITtlaAg67+QIOyVhOuLiOudvCDruIzrnpzsuZgg6rCv7IiY66W8CisgICAgIOykhOyXrOykjeuLiOuLpC4gIO2VmOyngOunjCDslYjtg4DquZ3qsozrj4QsIOuPmeyLnOyEseydtCDsnojripQg7L2U65Oc7JeQ7ISc64qUIOydtCDstZzsoIHtmZTripQg64uk66W4CisgICAgIENQVSDqsIAgJ2InIOulvCDroZzrk5ztlaAg65WMLCAtLSAnYScg6rCAIDDsnbQg7JWE64uM642w64+EIC0tIOqwgOynnOyduCDqsJIsIDQy66W8IOuztOqyjAorICAgICDrkJjripQg6rK97Jqw66W8IOqwgOuKpe2VmOqyjCDtlanri4jri6QuICDsnbTqsbgg67Cp7KeA7ZWY6riwIOychO2VtCBXUklURV9PTkNFKCkg66W8CisgICAgIOyCrOyaqe2VmOyEuOyalDoKKworCWlmIChhKQorCQlXUklURV9PTkNFKGIsIGEpOworCWVsc2UKKwkJV1JJVEVfT05DRShiLCA0Mik7CisKKyAgICAg7Lu07YyM7J2865+s64qUIOuhnOuTnOulvCDrp4zrk6TslrTrgrwg7IiY64+EIOyeiOyKteuLiOuLpC4gIOydvOuwmOyggeycvOuhnOuKlCDrrLjsoJzrpbwg7J287Jy87YKk7KeACisgICAgIOyViuyngOunjCwg7LqQ7IucIOudvOyduCDrsJTsmrTsi7HsnYQg7J287Jy87LycIOyEseuKpeqzvCDtmZXsnqXshLHsnYQg65ao7Ja065yo66a0IOyImCDsnojsirXri4jri6QuCisgICAgIOuCoOyhsOuQnCDroZzrk5zrpbwg66eJ6riwIOychO2VtOyEoCBSRUFEX09OQ0UoKSDrpbwg7IKs7Jqp7ZWY7IS47JqULgorCisgKCopIOygleugrOuQnCDrqZTrqqjrpqwg7KO87IaM7JeQIOychOy5mO2VnCwg7ZWc67KI7J2YIOuplOuqqOumrCDssLjsobAg7J247Iqk7Yq465+t7IWY7Jy866GcIOyVoeyEuOyKpAorICAgICDqsIDriqXtlZwg7YGs6riw7J2YIOuNsOydtO2EsOuKlCDtlZjrgpjsnZgg7YGwIOyVoeyEuOyKpOqwgCDsl6zrn6zqsJzsnZgg7J6R7J2AIOyVoeyEuOyKpOuTpOuhnAorICAgICDrjIDssrTrkJjripQgIuuhnOuTnCDti7DslrTrp4EobG9hZCB0ZWFyaW5nKSIg6rO8ICLsiqTthqDslrQg7Yuw7Ja066eBKHN0b3JlIHRlYXJpbmcpIiDsnYQKKyAgICAg67Cp7KeA7ZWp64uI64ukLiAg7JiI66W8IOuTpOyWtCwg7KO87Ja07KeEIOyVhO2CpO2FjeyzkOqwgCA3LWJpdCBpbWVlZGlhdGUgZmllbGQg66W8IOqwluuKlAorICAgICAxNi1iaXQg7Iqk7Yag7Ja0IOyduOyKpO2KuOufreyFmOydhCDsoJzqs7XtlZzri6TrqbQsIOy7tO2MjOydvOufrOuKlCDri6TsnYzsnZggMzItYml0IOyKpO2GoOyWtOulvAorICAgICDqtaztmITtlZjripTrjbDsl5Ag65GQ6rCc7J2YIDE2LWJpdCBzdG9yZS1pbW1lZGlhdGUg66qF66C57J2EIOyCrOyaqe2VmOugpCDtlaDqsoHri4jri6Q6CisKKwlwID0gMHgwMDAxMDAwMjsKKworICAgICDsiqTthqDslrQg7ZWgIOyDgeyImOulvCDrp4zrk6Tqs6Ag6re4IOqwkuydhCDsiqTthqDslrQg7ZWY6riwIOychO2VtCDrkZDqsJzqsIAg64SY64qUIOyduOyKpO2KuOufreyFmOydhAorICAgICDsgqzsmqntlZjqsowg65CY64qULCDsnbTrn7Ag7KKF66WY7J2YIOy1nOygge2ZlOulvCBHQ0Mg64qUIOyLpOygnOuhnCDtlajsnYQg67aA65SUIOyVjOyVhCDrkZDsi63si5zsmKQuCisgICAgIOydtCDstZzsoIHtmZTripQg7Iux6riAIOyTsOugiOuTnCDsvZTrk5zsl5DshJzripQg7ISx6rO17KCB7J24IOy1nOygge2ZlCDsnoXri4jri6QuICDsi6TsoJzroZwsIOq3vOuemOyXkAorICAgICDrsJzsg53tlZwgKOq3uOumrOqzoCDqs6Dss5Dsp4QpIOuyhOq3uOuKlCBHQ0Mg6rCAIHZvbGF0aWxlIOyKpO2GoOyWtOyXkCDruYTsoJXsg4HsoIHsnLzroZwg7J20CisgICAgIOy1nOygge2ZlOulvCDsgqzsmqntlZjqsowg7ZaI7Iq164uI64ukLiAg6re465+wIOuyhOq3uOqwgCDsl4bri6TrqbQsIOuLpOydjOydmCDsmIjsl5DshJwKKyAgICAgV1JJVEVfT05DRSgpIOydmCDsgqzsmqnsnYAg7Iqk7Yag7Ja0IO2LsOyWtOungeydhCDrsKnsp4Dtlanri4jri6Q6CisKKwlXUklURV9PTkNFKHAsIDB4MDAwMTAwMDIpOworCisgICAgIFBhY2tlZCDqtazsobDssrTsnZgg7IKs7JqpIOyXreyLnCDri6TsnYzsnZgg7JiI7LKY65+8ICDroZzrk5wgLyDsiqTthqDslrQg7Yuw7Ja066eB7J2EIOycoOuwnO2VoCDsiJgKKyAgICAg7J6I7Iq164uI64ukOgorCisJc3RydWN0IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKSBmb28geworCQlzaG9ydCBhOworCQlpbnQgYjsKKwkJc2hvcnQgYzsKKwl9OworCXN0cnVjdCBmb28gZm9vMSwgZm9vMjsKKwkuLi4KKworCWZvbzIuYSA9IGZvbzEuYTsKKwlmb28yLmIgPSBmb28xLmI7CisJZm9vMi5jID0gZm9vMS5jOworCisgICAgIFJFQURfT05DRSgpIOuCmCBXUklURV9PTkNFKCkg64+EIOyXhuqzoCB2b2xhdGlsZSDrp4jtgrnrj4Qg7JeG6riwIOuVjOusuOyXkCwKKyAgICAg7Lu07YyM7J2865+s64qUIOydtCDshLjqsJzsnZgg64yA7J6F66y47J2EIOuRkOqwnOydmCAzMi1iaXQg66Gc65Oc7JmAIOuRkOqwnOydmCAzMi1iaXQg7Iqk7Yag7Ja066GcCisgICAgIOuzgO2ZmO2VoCDsiJgg7J6I7Iq164uI64ukLiAg7J2064qUICdmb28xLmInIOydmCDqsJLsnZgg66Gc65OcIO2LsOyWtOungeqzvCAnZm9vMi5iJyDsnZgKKyAgICAg7Iqk7Yag7Ja0IO2LsOyWtOungeydhCDstIjrnpjtlaAg6rKB64uI64ukLiAg7J20IOyYiOyXkOyEnOuPhCBSRUFEX09OQ0UoKSDsmYAgV1JJVEVfT05DRSgpCisgICAgIOqwgCDti7DslrTrp4HsnYQg66eJ7J2EIOyImCDsnojsirXri4jri6Q6CisKKwlmb28yLmEgPSBmb28xLmE7CisJV1JJVEVfT05DRShmb28yLmIsIFJFQURfT05DRShmb28xLmIpKTsKKwlmb28yLmMgPSBmb28xLmM7CisKK+q3uOugh+yngOunjCwgdm9sYXRpbGUg66GcIOuniO2BrOuQnCDrs4DsiJjsl5Ag64yA7ZW07ISc64qUIFJFQURfT05DRSgpIOyZgCBXUklURV9PTkNFKCkg6rCACivtlYTsmpTsuZgg7JWK7Iq164uI64ukLiAg7JiI66W8IOuTpOyWtCwgJ2ppZmZpZXMnIOuKlCB2b2xhdGlsZSDroZwg66eI7YGs65CY7Ja0IOyeiOq4sCDrlYzrrLjsl5AsCitSRUFEX09OQ0UoamlmZmllcykg65286rOgIO2VoCDtlYTsmpTqsIAg7JeG7Iq164uI64ukLiAgUkVBRF9PTkNFKCkg7JmAIFdSSVRFX09OQ0UoKSDqsIAKK+yLpOydgCB2b2xhdGlsZSDsupDsiqTtjIXsnLzroZwg6rWs7ZiE65CY7Ja0IOyeiOyWtOyEnCDsnbjsnpDqsIAg7J2066+4IHZvbGF0aWxlIOuhnCDrp4jtgazrkJjslrQKK+yeiOuLpOuptCDrmJDri6Trpbgg7Zqo6rO866W8IOuCtOyngOuKlCDslYrquLAg65WM66y47J6F64uI64ukLgorCivsnbQg7Lu07YyM7J2865+sIOuwsOumrOyWtOuTpOydgCBDUFUg7JeQ64qUIOyngeygkeyggSDtmqjqs7zrpbwg7KCE7ZiAIOunjOuTpOyngCDslYrquLAg65WM66y47JeQLCDqsrDqta3snYAKK+yerOuwsOy5mOqwgCDsnbzslrTrgqAg7IiY64+EIOyeiOydjOydhCDrtoDrlJQg6riw7Ja17ZW0IOuRkOyLreyLnOyYpC4KKworCitDUFUg66mU66qo66asIOuwsOumrOyWtAorLS0tLS0tLS0tLS0tLS0tLS0KKwor66as64iF7IqkIOy7pOuEkOydgCDri6TsnYzsnZgg7Jes642f6rCcIOq4sOuzuCBDUFUg66mU66qo66asIOuwsOumrOyWtOulvCDqsIDsp4Dqs6Ag7J6I7Iq164uI64ukOgorCisJVFlQRQkJTUFOREFUT1JZCQlTTVAgQ09ORElUSU9OQUwKKwk9PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09PT09PT09PT09PT09CisJ67KU7JqpCQltYigpCQkJc21wX21iKCkKKwnsk7DquLAJCXdtYigpCQkJc21wX3dtYigpCisJ7J296riwCQlybWIoKQkJCXNtcF9ybWIoKQorCeuNsOydtO2EsCDsnZjsobTshLEJcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQorCisKK+uNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja066W8IOygnOyZuO2VnCDrqqjrk6Ag66mU66qo66asIOuwsOumrOyWtOuKlCDsu7TtjIzsnbzrn6wg67Cw66as7Ja066W8Civtj6ztlajtlanri4jri6QuICDrjbDsnbTthLAg7J2Y7KG07ISx7J2AIOy7tO2MjOydvOufrOyXkOydmCDstpTqsIDsoIHsnbgg7Iic7IScIOuztOyepeydhCDtj6ztlajtlZjsp4AKK+yViuyKteuLiOuLpC4KKwor67Cp67CxOiDrjbDsnbTthLAg7J2Y7KG07ISx7J20IOyeiOuKlCDqsr3smrAsIOy7tO2MjOydvOufrOuKlCDtlbTri7kg66Gc65Oc66W8IOyYrOuwlOuluCDsiJzshJzroZwg7J287Jy87YKsCivqsoPsnLzroZwgKOyYiDogYGFbYl1gIOuKlCBhW2JdIOulvCDroZzrk5wg7ZWY6riwIOyghOyXkCBiIOydmCDqsJLsnYQg66i87KCAIOuhnOuTnO2VnOuLpCkKK+q4sOuMgOuQmOyngOunjCwgQyDslrjslrQg7IKs7JaR7JeQ64qUIOy7tO2MjOydvOufrOqwgCBiIOydmCDqsJLsnYQg7LaU7LihICjsmIg6IDEg6rO8IOqwmeydjCkg7ZW07IScCitiICDroZzrk5wg7KCE7JeQIGEg66Gc65Oc66W8IO2VmOuKlCDsvZTrk5wgKOyYiDogdG1wID0gYVsxXTsgaWYgKGIgIT0gMSkgdG1wID0gYVtiXTsgKSDrpbwKK+unjOuTpOyngCDslYrslYTslbwg7ZWc64uk64qUIOuCtOyaqSDqsJnsnYAg6rG0IOyXhuyKteuLiOuLpC4gIOuYkO2VnCDsu7TtjIzsnbzrn6zripQgYVtiXSDrpbwg66Gc65Oc7ZWcCivtm4Tsl5AgYiDrpbwg65iQ64uk7IucIOuhnOuTnO2VoCDsiJjrj4Qg7J6I7Ja07IScLCBhW2JdIOuztOuLpCDstZzsi6Ag67KE7KCE7J2YIGIg6rCS7J2EIOqwgOyniCDsiJjrj4QKK+yeiOyKteuLiOuLpC4gIOydtOufsCDrrLjsoJzrk6TsnZgg7ZW06rKw7LGF7JeQIOuMgO2VnCDsnZjqsqwg7J287LmY64qUIOyVhOyngSDsl4bsirXri4jri6Trp4wsIOydvOuLqAorUkVBRF9PTkNFKCkg66ek7YGs66Gc67aA7YSwIOuztOq4sCDsi5zsnpHtlZjripTqsowg7KKL7J2AIOyLnOyekeydtCDrkKDqsoHri4jri6QuCisKK1NNUCDrqZTrqqjrpqwg67Cw66as7Ja065Ok7J2AIOycoOuLiO2UhOuhnOyEuOyEnOuhnCDsu7TtjIzsnbzrkJwg7Iuc7Iqk7YWc7JeQ7ISc64qUIOy7tO2MjOydvOufrCDrsLDrpqzslrTroZwKK+uwlOuAjOuKlOuNsCwg7ZWY64KY7J2YIENQVSDripQg7Iqk7Iqk66GcIOydvOq0gOyEseydhCDsnKDsp4DtlZjqs6AsIOqyuey5mOuKlCDslaHshLjsiqTrk6Qg7Jet7IucIOyYrOuwlOuluAor7Iic7ISc66GcIO2Wie2VtOyniCDqsoPsnLzroZwg7IOd6rCB65CY6riwIOuVjOusuOyeheuLiOuLpC4gIO2VmOyngOunjCwg7JWE656Y7J2YICJWaXJ0dWFsIE1hY2hpbmUKK0d1ZXN0cyIg7ISc67iM7IS57IWY7J2EIOywuOqzoO2VmOyLreyLnOyYpC4KKworWyFdIFNNUCDsi5zsiqTthZzsl5DshJwg6rO17Jyg66mU66qo66as66Gc7J2YIOygkeq3vOuTpOydhCDsiJzshJwg7IS47JuM7JW8IO2VoCDrlYwsIFNNUCDrqZTrqqjrpqwKK+uwsOumrOyWtOuKlCBf67CY65Oc7IucXyDsgqzsmqnrkJjslrTslbwg7ZWo7J2EIOq4sOyWte2VmOyEuOyalCwg6re464yA7IugIOudveydhCDsgqzsmqntlZjripQg6rKD7Jy866Gc64+ECivstqnrtoTtlZjquLQg7ZWY7KeA66eMIOunkOydtOyjoC4KKworTWFuZGF0b3J5IOuwsOumrOyWtOuTpOydgCBTTVAg7Iuc7Iqk7YWc7JeQ7ISc64+EIFVQIOyLnOyKpO2FnOyXkOyEnOuPhCBTTVAg7Zqo6rO866eMIO2GteygnO2VmOq4sOyXkOuKlAor67aI7ZWE7JqU7ZWcIOyYpOuyhO2XpOuTnOulvCDqsJbquLAg65WM66y47JeQIFNNUCDtmqjqs7zrp4wg7Ya17KCc7ZWY66m0IOuQmOuKlCDqs7Psl5DripQg7IKs7Jqp65CY7KeAIOyViuyVhOyVvAor7ZWp64uI64ukLiAg7ZWY7KeA66eMLCDripDsiqjtlZwg7Iic7IScIOq3nOy5meydmCDrqZTrqqjrpqwgSS9PIOyciOuPhOyasOulvCDthrXtlZwgTU1JTyDsnZgg7Zqo6rO866W8CivthrXsoJztlaAg65WM7JeQ64qUIG1hbmRhdG9yeSDrsLDrpqzslrTrk6TsnbQg7IKs7Jqp65CgIOyImCDsnojsirXri4jri6QuICDsnbQg67Cw66as7Ja065Ok7J2ACivsu7TtjIzsnbzrn6zsmYAgQ1BVIOuqqOuRkCDsnqzrsLDsuZjrpbwg66q77ZWY64+E66GdIO2VqOycvOuhnOyNqCDrqZTrqqjrpqwg7Jik7Y2866CI7J207IWY65Ok7J20IOuUlOuwlOydtOyKpOyXkAor67O07Jes7KeA64qUIOyInOyEnOyXkOuPhCDsmIHtlqXsnYQg7KO86riwIOuVjOusuOyXkCwgU01QIOqwgCDslYTri4wg7Iuc7Iqk7YWc7J206528IO2VoOyngOudvOuPhCDtlYTsmpTtlaAg7IiYCivsnojsirXri4jri6QuCisKKwor7J2867aAIOqzoOq4iSDrsLDrpqzslrQg7ZWo7IiY65Ok64+EIOyeiOyKteuLiOuLpDoKKworICgqKSBzbXBfc3RvcmVfbWIodmFyLCB2YWx1ZSkKKworICAgICDsnbQg7ZWo7IiY64qUIO2KueyglSDrs4DsiJjsl5Ag7Yq57KCVIOqwkuydhCDrjIDsnoXtlZjqs6Ag67KU7JqpIOuplOuqqOumrCDrsLDrpqzslrTrpbwg7Lmp64uI64ukLgorICAgICBVUCDsu7TtjIzsnbzsl5DshJzripQg7Lu07YyM7J2865+sIOuwsOumrOyWtOuztOuLpCDrjZTtlZwg6rKD7J2EIOy5nOuLpOqzoOuKlCDrs7TsnqXrkJjsp4Ag7JWK7Iq164uI64ukLgorCisKKyAoKikgc21wX21iX19iZWZvcmVfYXRvbWljKCk7CisgKCopIHNtcF9tYl9fYWZ0ZXJfYXRvbWljKCk7CisKKyAgICAg7J206rKD65Ok7J2AIOqwkuydhCDrpqzthLTtlZjsp4Ag7JWK64qUICjrjZTtlZjquLAsIOu5vOq4sCwg7Kad6rCALCDqsJDshozsmYAg6rCZ7J2AKSDslrTthqDrr7kKKyAgICAg7ZWo7IiY65Ok7J2EIOychO2VnCwg7Yq57Z6IIOq3uOqyg+uTpOydtCDroIjtjbzrn7DsiqQg7Lm07Jq07YyF7JeQIOyCrOyaqeuQoCDrlYzrpbwg7JyE7ZWcCisgICAgIO2VqOyImOuTpOyeheuLiOuLpC4gIOydtCDtlajsiJjrk6TsnYAg66mU66qo66asIOuwsOumrOyWtOulvCDrgrTtj6ztlZjqs6Ag7J6I7KeA64qUIOyViuyKteuLiOuLpC4KKworICAgICDsnbTqsoPrk6TsnYAg6rCS7J2EIOumrO2EtO2VmOyngCDslYrsnLzrqbAg7Ja07Yag66+57ZWcIChzZXRfYml0IOqzvCBjbGVhcl9iaXQg6rCZ7J2AKSDruYTtirgKKyAgICAg7Jew7IKw7JeQ64+EIOyCrOyaqeuQoCDsiJgg7J6I7Iq164uI64ukLgorCisgICAgIO2VnCDsmIjroZwsIOqwneyytCDtlZjrgpjrpbwg66y07Zqo7ZWcIOqyg+ycvOuhnCDtkZzsi5ztlZjqs6Ag6re4IOqwneyytOydmCDroIjtjbzrn7DsiqQg7Lm07Jq07Yq466W8CisgICAgIOqwkOyGjOyLnO2CpOuKlCDri6TsnYwg7L2U65Oc66W8IOuztOyEuOyalDoKKworCW9iai0+ZGVhZCA9IDE7CisJc21wX21iX19iZWZvcmVfYXRvbWljKCk7CisJYXRvbWljX2RlYygmb2JqLT5yZWZfY291bnQpOworCisgICAgIOydtCDsvZTrk5zripQg6rCd7LK07J2YIOyXheuNsOydtO2KuOuQnCBkZWF0aCDrp4jtgazqsIAg66CI7Y2865+w7IqkIOy5tOyatO2EsCDqsJDshowg64+Z7J6RCisgICAgICrsoITsl5AqIOuztOydvCDqsoPsnYQg67O07J6l7ZWp64uI64ukLgorCisgICAgIOuNlCDrp47snYAg7KCV67O066W8IOychO2VtOyEoCBEb2N1bWVudGF0aW9uL2F0b21pY19vcHMudHh0IOusuOyEnOulvCDssLjqs6DtlZjshLjsmpQuCisgICAgIOyWtOuUlOyEnCDsnbTqsoPrk6TsnYQg7IKs7Jqp7ZW07JW8IO2VoOyngCDqtoHquIjtlZjri6TrqbQgIuyWtO2GoOuvuSDsmKTtjbzroIjsnbTshZgiIOyEnOu4jOyEueyFmOydhAorICAgICDssLjqs6DtlZjshLjsmpQuCisKKworICgqKSBsb2NrbGVzc19kZXJlZmVyZW5jZSgpOworCisgICAgIOydtCDtlajsiJjripQgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCkg642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrTrpbwg7IKs7Jqp7ZWY64qUCisgICAgIO2PrOyduO2EsCDsnb3slrTsmKTquLAg656Y7Y28KHdyYXBwZXIpIO2VqOyImOuhnCDsg53qsIHrkKAg7IiYIOyeiOyKteuLiOuLpC4KKworICAgICDqsJ3ssrTsnZgg65287J207ZSE7YOA7J6E7J20IFJDVSDsmbjsnZgg66mU7Luk64uI7KaY7Jy866GcIOq0gOumrOuQnOuLpOuKlCDsoJDsnYQg7KCc7Jm47ZWY66m0CisgICAgIHJjdV9kZXJlZmVyZW5jZSgpIOyZgOuPhCDsnKDsgqztlZzrjbAsIOyYiOulvCDrk6TrqbQg6rCd7LK06rCAIOyLnOyKpO2FnOydtCDqurzsp4gg65WM7JeQ66eMCisgICAgIOygnOqxsOuQmOuKlCDqsr3smrAg65Ox7J6F64uI64ukLiAg65iQ7ZWcLCBsb2NrbGVzc19kZXJlZmVyZW5jZSgpIOydgCBSQ1Ug7JmAIO2VqOq7mAorICAgICDsgqzsmqnrkKDsiJjrj4QsIFJDVSDsl4bsnbQg7IKs7Jqp65CgIOyImOuPhCDsnojripQg7J2867aAIOuNsOydtO2EsCDqtazsobDsl5Ag7IKs7Jqp65CY6rOgCisgICAgIOyeiOyKteuLiOuLpC4KKworCisgKCopIGRtYV93bWIoKTsKKyAoKikgZG1hX3JtYigpOworCisgICAgIOydtOqyg+uTpOydgCBDUFUg7JmAIERNQSDqsIDriqXtlZwg65SU67CU7J207Iqk7JeQ7IScIOuqqOuRkCDslaHshLjsiqQg6rCA64ql7ZWcIOqzteycoCDrqZTrqqjrpqzsnZgKKyAgICAg7J296riwLCDsk7DquLAg7J6R7JeF65Ok7J2YIOyInOyEnOulvCDrs7TsnqXtlZjquLAg7JyE7ZW0IGNvbnNpc3RlbnQgbWVtb3J5IOyXkOyEnCDsgqzsmqntlZjquLAKKyAgICAg7JyE7ZWcIOqyg+uTpOyeheuLiOuLpC4KKworICAgICDsmIjrpbwg65Ok7Ja0LCDrlJTrsJTsnbTsiqTsmYAg66mU66qo66as66W8IOqzteycoO2VmOupsCwg65SU7Iqk7YGs66a97YSwIOyDge2DnCDqsJLsnYQg7IKs7Jqp7ZW0CisgICAgIOuUlOyKpO2BrOumve2EsOqwgCDrlJTrsJTsnbTsiqTsl5Ag7IaN7ZW0IOyeiOuKlOyngCDslYTri4jrqbQgQ1BVIOyXkCDsho3tlbQg7J6I64qU7KeAIO2RnOyLnO2VmOqzoCwKKyAgICAg6rO17KeA7JqpIOy0iOyduOyihShkb29yYmVsbCkg7J2EIOyCrOyaqe2VtCDsl4XrjbDsnbTtirjrkJwg65SU7Iqk7YGs66a97YSw6rCAIOuUlOuwlOydtOyKpOyXkCDsgqzsmqkKKyAgICAg6rCA64ql7ZW07KGM7J2M7J2EIOqzteyngO2VmOuKlCDrlJTrsJTsnbTsiqQg65Oc65287J2067KE66W8IOyDneqwge2VtCDrtIXsi5zri6Q6CisKKwlpZiAoZGVzYy0+c3RhdHVzICE9IERFVklDRV9PV04pIHsKKwkJLyog65SU7Iqk7YGs66a97YSw66W8IOyGjOycoO2VmOq4sCDsoITsl5DripQg642w7J207YSw66W8IOydveyngCDslYrsnYwgKi8KKwkJZG1hX3JtYigpOworCisJCS8qIOuNsOydtO2EsOulvCDsnb3qs6Ag7JSAICovCisJCXJlYWRfZGF0YSA9IGRlc2MtPmRhdGE7CisJCWRlc2MtPmRhdGEgPSB3cml0ZV9kYXRhOworCisJCS8qIOyDge2DnCDsl4XrjbDsnbTtirgg7KCEIOyImOygleyCrO2VreydhCDrsJjsmIEgKi8KKwkJZG1hX3dtYigpOworCisJCS8qIOyGjOycoOq2jOydhCDsiJjsoJUgKi8KKwkJZGVzYy0+c3RhdHVzID0gREVWSUNFX09XTjsKKworCQkvKiBNTUlPIOulvCDthrXtlbQg65SU67CU7J207Iqk7JeQIOqzteyngOulvCDtlZjquLAg7KCE7JeQIOuplOuqqOumrOulvCDrj5nquLDtmZQgKi8KKwkJd21iKCk7CisKKwkJLyog7JeF642w7J207Yq465CcIOuUlOyKpO2BrOumve2EsOydmCDrlJTrsJTsnbTsiqTsl5Ag6rO17KeAICovCisJCXdyaXRlbChERVNDX05PVElGWSwgZG9vcmJlbGwpOworCX0KKworICAgICBkbWFfcm1iKCkg64qUIOuUlOyKpO2BrOumve2EsOuhnOu2gO2EsCDrjbDsnbTthLDrpbwg7J297Ja07Jik6riwIOyghOyXkCDrlJTrsJTsnbTsiqTqsIAg7IaM7Jyg6raM7J2ECisgICAgIOuCtOuGk+yVmOydjOydhCDrs7TsnqXtlZjqsowg7ZWY6rOgLCBkbWFfd21iKCkg64qUIOuUlOuwlOydtOyKpOqwgCDsnpDsi6DsnbQg7IaM7Jyg6raM7J2EIOuLpOyLnAorICAgICDqsIDsoYzsnYzsnYQg67O06riwIOyghOyXkCDrlJTsiqTtgazrpr3thLDsl5Ag642w7J207YSw6rCAIOyTsOyYgOydjOydhCDrs7TsnqXtlanri4jri6QuICB3bWIoKSDripQKKyAgICAg7LqQ7IucIOydvOq0gOyEseydtCDsl4bripQgKGNhY2hlIGluY29oZXJlbnQpIE1NSU8g7JiB7Jet7JeQIOyTsOq4sOulvCDsi5zrj4TtlZjquLAg7KCE7JeQCisgICAgIOy6kOyLnCDsnbzqtIDshLHsnbQg7J6I64qUIOuplOuqqOumrCAoY2FjaGUgY29oZXJlbnQgbWVtb3J5KSDsk7DquLDqsIAg7JmE66OM65CY7JeI7J2M7J2ECisgICAgIOuztOyepe2VtOyjvOq4sCDsnITtlbQg7ZWE7JqU7ZWp64uI64ukLgorCisgICAgIGNvbnNpc3RlbnQgbWVtb3J5IOyXkCDrjIDtlZwg7J6Q7IS47ZWcIOuCtOyaqeydhCDsnITtlbTshKAgRG9jdW1lbnRhdGlvbi9ETUEtQVBJLnR4dAorICAgICDrrLjshJzrpbwg7LC46rOg7ZWY7IS47JqULgorCisKK01NSU8g7JOw6riwIOuwsOumrOyWtAorLS0tLS0tLS0tLS0tLS0tLQorCivrpqzriIXsiqQg7Luk64SQ7J2AIOuYkO2VnCBtZW1vcnktbWFwcGVkIEkvTyDsk7DquLDrpbwg7JyE7ZWcIO2KueuzhO2VnCDrsLDrpqzslrTrj4Qg6rCA7KeA6rOgCivsnojsirXri4jri6Q6CisKKwltbWlvd2IoKTsKKwor7J206rKD7J2AIG1hbmRhdG9yeSDsk7DquLAg67Cw66as7Ja07J2YIOuzgOyiheycvOuhnCwg7JmE7ZmU65CcIOyInOyEnCDqt5zsuZnsnZggSS9PIOyYgeyXreyXkOycvOuhnOydmAor7JOw6riw6rCAIOu2gOu2hOyggeycvOuhnCDsiJzshJzrpbwg66ee7LaU64+E66GdIO2VtOykjeuLiOuLpC4gIOydtCDtlajsiJjripQgQ1BVLT7tlZjrk5zsm6jslrQg7IKs7J2066W8CivrhJjslrTshJwg7Iuk7KCcIO2VmOuTnOybqOyWtOyXkOq5jOyngCDsnbzrtoAg7IiY7KSA7J2YIOyYge2WpeydhCDrgbzsuanri4jri6QuCisKK+uNlCDrp47snYAg7KCV67O066W8IOychO2VtOyEoCAiQWNxdWlyZSB2cyBJL08g7JWh7IS47IqkIiDshJzruIzshLnshZjsnYQg7LC46rOg7ZWY7IS47JqULgorCisKKz09PT09PT09PT09PT09PT09PT09PT09PT0KK+yVlOusteyggSDsu6TrhJAg66mU66qo66asIOuwsOumrOyWtAorPT09PT09PT09PT09PT09PT09PT09PT09PQorCivrpqzriIXsiqQg7Luk64SQ7J2YIOydvOu2gCDtlajsiJjrk6TsnYAg66mU66qo66asIOuwsOumrOyWtOulvCDrgrTsnqXtlZjqs6Ag7J6I64qU642wLCDrnb0obG9jaynqs7wKK+yKpOy8gOyltOungSDqtIDroKgg7ZWo7IiY65Ok7J20IOuMgOu2gOu2hOyeheuLiOuLpC4KKwor7Jes6riw7ISgIF/stZzshoztlZzsnZhfIOuztOyepeydhCDshKTrqoXtlanri4jri6Q7IO2KueyglSDslYTtgqTthY3ss5Dsl5DshJzripQg7J20IOyEpOuqheuztOuLpCDrjZQg66eO7J2ACivrs7TsnqXsnYQg7KCc6rO17ZWgIOyImOuPhCDsnojsirXri4jri6Trp4wg7ZW064u5IOyVhO2CpO2FjeyzkOyXkCDsooXsho3soIHsnbgg7L2U65OcIOyZuOydmCDrtoDrtoTsl5DshJzripQKK+q3uOufsCDrs7TsnqXsnYQg6riw64yA7ZW07ISgIOyViOuQoOqygeuLiOuLpC4KKworCivrnb0gQUNRVUlTSVRJT04g7ZWo7IiYCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK+umrOuIheyKpCDsu6TrhJDsnYAg64uk7JaR7ZWcIOudvSDqtazshLHssrTrpbwg6rCA7KeA6rOgIOyeiOyKteuLiOuLpDoKKworICgqKSDsiqTtlYAg6529CisgKCopIFIvVyDsiqTtlYAg6529CisgKCopIOuupO2FjeyKpAorICgqKSDshLjrp4jtj6zslrQKKyAoKikgUi9XIOyEuOuniO2PrOyWtAorCivqsIEg6rWs7ISx7LK066eI64ukIOuqqOuToCDqsr3smrDsl5AgIkFDUVVJUkUiIOyYpO2NvOugiOydtOyFmOqzvCAiUkVMRUFTRSIg7Jik7Y2866CI7J207IWY7J2YIOuzgOyiheydtAor7KG07J6s7ZWp64uI64ukLiAg7J20IOyYpO2NvOugiOydtOyFmOuTpOydgCDrqqjrkZAg7KCB7KCI7ZWcIOuwsOumrOyWtOulvCDrgrTtj6ztlZjqs6Ag7J6I7Iq164uI64ukOgorCisgKDEpIEFDUVVJUkUg7Jik7Y2866CI7J207IWY7J2YIOyYge2WpToKKworICAgICBBQ1FVSVJFIOuSpOyXkOyEnCDsmpTssq3rkJwg66mU66qo66asIOyYpO2NvOugiOydtOyFmOydgCBBQ1FVSVJFIOyYpO2NvOugiOydtOyFmOydtCDsmYTro4zrkJwKKyAgICAg65Kk7JeQIOyZhOujjOuQqeuLiOuLpC4KKworICAgICBBQ1FVSVJFIOyVnuyXkOyEnCDsmpTssq3rkJwg66mU66qo66asIOyYpO2NvOugiOydtOyFmOydgCBBQ1FVSVJFIOyYpO2NvOugiOydtOyFmOydtCDsmYTro4zrkJwg7ZuE7JeQCisgICAgIOyZhOujjOuQoCDsiJgg7J6I7Iq164uI64ukLiAgc21wX21iX19iZWZvcmVfc3BpbmxvY2soKSDrkqTsl5AgQUNRVUlSRSDqsIAg7Iuk7ZaJ65CY64qUCisgICAgIOy9lOuTnCDruJTroZ3snYAg67iU66GdIOyVnuydmCDsiqTthqDslrTrpbwg67iU66GdIOuSpOydmCDroZzrk5zsmYAg7Iqk7Yag7Ja07JeQIOuMgO2VtCDsiJzshJwKKyAgICAg66ee7Lal64uI64ukLiAg7J206rG0IHNtcF9tYigpIOuztOuLpCDsmYTtmZTrkJwg6rKD7J6E7J2EIOq4sOyWte2VmOyEuOyalCEgIOunjuydgCDslYTtgqTthY3ss5Dsl5DshJwKKyAgICAgc21wX21iX19iZWZvcmVfc3BpbmxvY2soKSDsnYAg7IKs7IukIOyVhOustOydvOuPhCDtlZjsp4Ag7JWK7Iq164uI64ukLgorCisgKDIpIFJFTEVBU0Ug7Jik7Y2866CI7J207IWY7J2YIOyYge2WpToKKworICAgICBSRUxFQVNFIOyVnuyXkOyEnCDsmpTssq3rkJwg66mU66qo66asIOyYpO2NvOugiOydtOyFmOydgCBSRUxFQVNFIOyYpO2NvOugiOydtOyFmOydtCDsmYTro4zrkJjquLAKKyAgICAg7KCE7JeQIOyZhOujjOuQqeuLiOuLpC4KKworICAgICBSRUxFQVNFIOuSpOyXkOyEnCDsmpTssq3rkJwg66mU66qo66asIOyYpO2NvOugiOydtOyFmOydgCBSRUxFQVNFIOyYpO2NvOugiOydtOyFmCDsmYTro4wg7KCE7JeQCisgICAgIOyZhOujjOuQoCDsiJgg7J6I7Iq164uI64ukLgorCisgKDMpIEFDUVVJUkUgdnMgQUNRVUlSRSDsmIHtlqU6CisKKyAgICAg7Ja065akIEFDUVVJUkUg7Jik7Y2866CI7J207IWY67O064ukIOyVnuyXkOyEnCDsmpTssq3rkJwg66qo65OgIEFDUVVJUkUg7Jik7Y2866CI7J207IWY7J2AIOq3uAorICAgICBBQ1FVSVJFIOyYpO2NvOugiOydtOyFmCDsoITsl5Ag7JmE66OM65Cp64uI64ukLgorCisgKDQpIEFDUVVJUkUgdnMgUkVMRUFTRSBpbXBsaWNhdGlvbjoKKworICAgICDslrTrlqQgUkVMRUFTRSDsmKTtjbzroIjsnbTshZjrs7Tri6Qg7JWe7IScIOyalOyyreuQnCBBQ1FVSVJFIOyYpO2NvOugiOydtOyFmOydgCDqt7ggUkVMRUFTRQorICAgICDsmKTtjbzroIjsnbTshZjrs7Tri6Qg66i87KCAIOyZhOujjOuQqeuLiOuLpC4KKworICg1KSDsi6TtjKjtlZwg7KGw6rG07KCBIEFDUVVJUkUg7JiB7ZalOgorCisgICAgIEFDUVVJUkUg7Jik7Y2866CI7J207IWY7J2YIOydvOu2gCDrnb0obG9jaykg67OA7KKF7J2AIOudveydtCDqs6frsJTroZwg7ZqN65Od7ZWY6riw7JeQ64qUCisgICAgIOu2iOqwgOuKpe2VnCDsg4Htg5zsnbTqsbDrgpgg65297J20IO2ajeuTnSDqsIDriqXtlbTsp4Drj4TroZ0g6riw64uk66as64qUIOuPhOykkSDsi5zqt7jrhJDsnYQg67Cb6rGw64KYCisgICAgIO2VtOyEnCDsi6TtjKjtlaAg7IiYIOyeiOyKteuLiOuLpC4gIOyLpO2MqO2VnCDrnb3snYAg7Ja065akIOuwsOumrOyWtOuPhCDrgrTtj6ztlZjsp4Ag7JWK7Iq164uI64ukLgorCitbIV0g7LC46rOgOiDrnb0gQUNRVUlSRSDsmYAgUkVMRUFTRSDqsIAg64uo67Cp7ZalIOuwsOumrOyWtOyXrOyEnCDrgpjtg4DrgpjripQg7ZiE7IOBIOykkSDtlZjrgpjripQKK+2BrOumrO2LsOy7rCDshLnshZgg67CU6rml7J2YIOyduOyKpO2KuOufreyFmOydmCDsmIHtlqXsnbQg7YGs66as7Yuw7LusIOyEueyFmCDrgrTrtoDroZzrj4Qg65Ok7Ja07JisIOyImAor7J6I64uk64qUIOqyg+yeheuLiOuLpC4KKworUkVMRUFTRSDtm4Tsl5Ag7JqU7LKt65CY64qUIEFDUVVJUkUg64qUIOyghOyytCDrqZTrqqjrpqwg67Cw66as7Ja06528IOyXrOqyqOyngOuptCDslYjrkJjripTrjbAsCitBQ1FVSVJFIOyVnuydmCDslaHshLjsiqTqsIAgQUNRVUlSRSDtm4Tsl5Ag7IiY7ZaJ65CgIOyImCDsnojqs6AsIFJFTEVBU0Ug7ZuE7J2YIOyVoeyEuOyKpOqwgAorUkVMRUFTRSDsoITsl5Ag7IiY7ZaJ65CgIOyImOuPhCDsnojsnLzrqbAsIOq3uCDrkZDqsJzsnZgg7JWh7IS47Iqk6rCAIOyEnOuhnOulvCDsp4DrgpjsuaAg7IiY64+EIOyeiOq4sAor65WM66y47J6F64uI64ukOgorCisJKkEgPSBhOworCUFDUVVJUkUgTQorCVJFTEVBU0UgTQorCSpCID0gYjsKKwor64qUIOuLpOydjOqzvCDqsJnsnbQg65CgIOyImOuPhCDsnojsirXri4jri6Q6CisKKwlBQ1FVSVJFIE0sIFNUT1JFICpCLCBTVE9SRSAqQSwgUkVMRUFTRSBNCisKK0FDUVVJUkUg7JmAIFJFTEVBU0Ug6rCAIOudvSDtmo3rk53qs7wg7ZW07KCc652866m0LCDqt7jrpqzqs6Ag65297J2YIEFDUVVJUkUg7JmAIFJFTEVBU0Ug6rCACivqsJnsnYAg6529IOuzgOyImOyXkCDrjIDtlZwg6rKD7J20652866m0LCDtlbTri7kg65297J2EIOylkOqzoCDsnojsp4Ag7JWK7J2AIOuLpOuluCBDUFUg7J2YIOyLnOyVvOyXkOuKlAor7J207JmAIOqwmeydgCDsnqzrsLDsuZjqsIAg7J287Ja064KY64qUIOqyg+ycvOuhnCDrs7Tsnbwg7IiYIOyeiOyKteuLiOuLpC4gIOyalOyVve2VmOyekOuptCwgQUNRVUlSRSDsl5AKK+ydtOyWtCBSRUxFQVNFIOyYpO2NvOugiOydtOyFmOydhCDsiJzssKjsoIHsnLzroZwg7Iuk7ZaJ7ZWY64qUIO2WieychOqwgCDsoITssrQg66mU66qo66asIOuwsOumrOyWtOuhnAor7IOd6rCB65CY7Ja07ISgIC3slYjrkKnri4jri6QtLgorCivruYTsirftlZjqsowsIOyVnuydmCDrsJjrjIAg7LyA7J207Iqk7J24IFJFTEVBU0Ug7JmAIEFDUVVJUkUg65GQ6rCcIOyYpO2NvOugiOydtOyFmOydmCDsiJzssKjsoIEg7Iuk7ZaJCivsl63si5wg7KCE7LK0IOuplOuqqOumrCDrsLDrpqzslrTrpbwg64K07Y+s7ZWY7KeAIOyViuyKteuLiOuLpC4gIOuUsOudvOyEnCwgUkVMRUFTRSwgQUNRVUlSRSDroZwKK+q3nOygleuQmOuKlCDtgazrpqzti7Dsu6wg7IS57IWY7J2YIENQVSDsiJjtlonsnYAgUkVMRUFTRSDsmYAgQUNRVUlSRSDrpbwg6rCA66Gc7KeA66W8IOyImCDsnojsnLzrr4DroZwsCivri6TsnYzqs7wg6rCZ7J2AIOy9lOuTnOuKlDoKKworCSpBID0gYTsKKwlSRUxFQVNFIE0KKwlBQ1FVSVJFIE4KKwkqQiA9IGI7CisKK+uLpOydjOqzvCDqsJnsnbQg7IiY7ZaJ65CgIOyImCDsnojsirXri4jri6Q6CisKKwlBQ1FVSVJFIE4sIFNUT1JFICpCLCBTVE9SRSAqQSwgUkVMRUFTRSBNCisKK+ydtOufsCDsnqzrsLDsuZjripQg642w65Oc65297J2EIOydvOycvO2CrCDsiJjrj4Qg7J6I7J2EIOqyg+yymOufvCDrs7Tsnbwg7IiYIOyeiOyKteuLiOuLpC4gIO2VmOyngOunjCwg6re465+wCivrjbDrk5zrnb3snZgg7KGw7KeQ7J20IOyeiOuLpOuptCBSRUxFQVNFIOuKlCDri6jsiJztnogg7JmE66OM65CgIOqyg+ydtOuvgOuhnCDrjbDrk5zrnb3snYAg7KG07J6s7ZWgIOyImAor7JeG7Iq164uI64ukLgorCisJ7J206rKMIOyWtOuWu+qyjCDsmKzrsJTrpbgg64+Z7J6R7J2EIO2VoCDsiJgg7J6I7J2E6rmM7JqUPworCisJ7Jqw66as6rCAIOydtOyVvOq4sCDtlZjqs6Ag7J6I64qU6rG0IOyerOuwsOy5mOulvCDtlZjripQgQ1BVIOyXkCDrjIDtlZwg7J207JW86riw7J207KeALAorCey7tO2MjOydvOufrOyXkCDrjIDtlZwg6rKD7J20IOyVhOuLiOuegCDsoJDsnbQg7ZW17Ius7J6F64uI64ukLiAg7Lu07YyM7J2865+sICjrmJDripQsIOqwnOuwnOyekCkKKwnqsIAg7Jik7Y2866CI7J207IWY65Ok7J2EIOydtOugh+qyjCDsnqzrsLDsuZjtlZjrqbQsIOuNsOuTnOudveydtCDsnbzslrTrgqAg7IiYIC3snojsirUt64uI64ukLgorCisJ7ZWY7KeA66eMIENQVSDqsIAg7Jik7Y2866CI7J207IWY65Ok7J2EIOyerOuwsOy5mCDtlojri6TripTqsbgg7IOd6rCB7ZW0IOuztOyEuOyalC4gIOydtCDsmIjsl5DshJwsCisJ7Ja07IWI67iU66asIOy9lOuTnCDsg4HsnLzroZzripQg7Ja465297J20IOudveydhCDslZ7shJzqsowg65CY7Ja0IOyeiOyKteuLiOuLpC4gIENQVSDqsIAg7J2066W8CisJ7J6s67Cw7LmY7ZW07IScIOuSpOydmCDrnb0g7Jik7Y2866CI7J207IWY7J2EIOuovOyggCDsi6TtlontlZjqsowg65Cp64uI64ukLiAg66eM7JW9IOuNsOuTnOudveydtAorCeyhtOyerO2VnOuLpOuptCwg7J20IOudvSDsmKTtjbzroIjsnbTshZjsnYAg6re47KCAIOyKpO2VgOydhCDtlZjrqbAg6rOE7IaN7ZW07IScIOudveydhAorCeyLnOuPhO2VqeuLiOuLpCAo65iQ64qULCDtlZzssLgg7ZuE7JeQ6rKg7KeA66eMLCDsnqDrk63ri4jri6QpLiAgQ1BVIOuKlCDslrjsoKDqsIDripQKKwko7Ja07IWI67iU66asIOy9lOuTnOyXkOyEnOuKlCDrnb3snYQg7JWe7ISc64qUKSDslrjrnb0g7Jik7Y2866CI7J207IWY7J2EIOyLpO2Wie2VmOuKlOuNsCwg7J20IOyWuOudvQorCeyYpO2NvOugiOydtOyFmOydtCDsnqDsnqzsoIEg642w65Oc65297J2EIO2VtOqysO2VmOqzoCwg6529IOyYpO2NvOugiOydtOyFmOuPhCDrkqTsnbTslrQg7ISx6rO17ZWY6rKMCisJ65Cp64uI64ukLgorCisJ7ZWY7KeA66eMIOunjOyVvSDrnb3snbQg7J6g7J2EIOyekOuKlCDtg4DsnoXsnbTsl4jri6TrqbTsmpQ/ICDqt7jrn7Ag6rK97Jqw7JeQIOy9lOuTnOuKlAorCeyKpOy8gOyltOufrOuhnCDrk6TslrTqsIDroKQg7ZWgIOqxsOqzoCwg7Jes6riw7IScIOqysOq1reydgCDrqZTrqqjrpqwg67Cw66as7Ja066W8IOunjOuCmOqyjAorCeuQmOuKlOuNsCwg7J20IOuplOuqqOumrCDrsLDrpqzslrTripQg7JWe7J2YIOyWuOudvSDsmKTtjbzroIjsnbTshZjsnbQg7JmE66OM65CY64+E66GdIOunjOuTpOqzoCwKKwnrjbDrk5zrnb3snYAg7J2067KI7JeQ64+EIO2VtOqysOuQqeuLiOuLpC4gIOyeoOydhCDsnpDripQg7ZaJ7JyE7JmAIOyWuOudvSDsgqzsnbTsnZgg6rK97KO8IOyDge2ZqQorCShyYWNlKSDrj4Qg7J6I7J2EIOyImCDsnojqsqDsirXri4jri6Trp4wsIOudvSDqtIDroKgg6riw64ql65Ok7J2AIOq3uOufsCDqsr3so7wg7IOB7Zmp7J2EIOuqqOuToAorCeqyveyasOyXkCDsoJzrjIDroZwg7ZW06rKw7ZWgIOyImCDsnojslrTslbwg7ZWp64uI64ukLgorCivrnb3qs7wg7IS466eI7Y+s7Ja064qUIFVQIOy7tO2MjOydvOuQnCDsi5zsiqTthZzsl5DshJzsnZgg7Iic7ISc7JeQIOuMgO2VtCDrs7TsnqXsnYQg7ZWY7KeAIOyViuq4sCDrlYzrrLjsl5AsCivqt7jrn7Ag7IOB7Zmp7JeQ7IScIOyduO2EsOufve2KuCDruYTtmZzshLHtmZQg7Jik7Y2866CI7J207IWY6rO8IO2VqOq7mOqwgCDslYTri4jrnbzrqbQg7Ja065akIOydvOyXkOuPhCAtIO2Kue2eiAorSS9PIOyVoeyEuOyKpOyZgCDqtIDroKjtlbTshJzripQgLSDsoJzrjIDroZwg7IKs7Jqp65CgIOyImCDsl4bsnYQg6rKB64uI64ukLgorCisiQ1BVIOqwhCBBQ1FVSVJJTkcg67Cw66as7Ja0IO2aqOqzvCIg7IS57IWY64+EIOywuOqzoO2VmOyLnOq4sCDrsJTrno3ri4jri6QuCisKKwor7JiI66W8IOuTpOyWtCwg64uk7J2M6rO8IOqwmeydgCDsvZTrk5zrpbwg7IOd6rCB7ZW0IOu0heyLnOuLpDoKKworCSpBID0gYTsKKwkqQiA9IGI7CisJQUNRVUlSRQorCSpDID0gYzsKKwkqRCA9IGQ7CisJUkVMRUFTRQorCSpFID0gZTsKKwkqRiA9IGY7CisKK+yXrOq4sOyEoCDri6TsnYzsnZgg7J2067Kk7Yq4IOyLnO2AgOyKpOqwgCDsg53quLgg7IiYIOyeiOyKteuLiOuLpDoKKworCUFDUVVJUkUsIHsqRiwqQX0sICpFLCB7KkMsKkR9LCAqQiwgUkVMRUFTRQorCisJWytdIHsqRiwqQX0g64qUIOyhsO2VqeuQnCDslaHshLjsiqTrpbwg7J2Y66+47ZWp64uI64ukLgorCivtlZjsp4Drp4wg64uk7J2M6rO8IOqwmeydgCDqsbQg67aI6rCA64ql7ZWY7KOgOgorCisJeypGLCpBfSwgKkIsCUFDUVVJUkUsICpDLCAqRCwJUkVMRUFTRSwgKkUKKwkqQSwgKkIsICpDLAlBQ1FVSVJFLCAqRCwJCVJFTEVBU0UsICpFLCAqRgorCSpBLCAqQiwJCUFDUVVJUkUsICpDLAkJUkVMRUFTRSwgKkQsICpFLCAqRgorCSpCLAkJQUNRVUlSRSwgKkMsICpELAlSRUxFQVNFLCB7KkYsKkF9LCAqRQorCisKKwor7J247YSw65+97Yq4IOu5hO2ZnOyEse2ZlCDtlajsiJgKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwor7J247YSw65+97Yq466W8IOu5hO2ZnOyEse2ZlCDtlZjripQg7ZWo7IiYIChBQ1FVSVJFIOyZgCDrj5nsnbwpIOyZgCDsnbjthLDrn73tirjrpbwg7Zmc7ISx7ZmUIO2VmOuKlCDtlajsiJgKKyhSRUxFQVNFIOyZgCDrj5nsnbwpIOuKlCDsu7TtjIzsnbzrn6wg67Cw66as7Ja07LKY65+866eMIOuPmeyeke2VqeuLiOuLpC4gIOuUsOudvOyEnCwg67OE64+E7J2YIOuplOuqqOumrAor67Cw66as7Ja064KYIEkvTyDrsLDrpqzslrTqsIAg7ZWE7JqU7ZWcIOyDge2ZqeydtOudvOuptCDqt7gg67Cw66as7Ja065Ok7J2AIOyduO2EsOufve2KuCDruYTtmZzshLHtmZQg7ZWo7IiYCivsmbjsnZgg67Cp67KV7Jy866GcIOygnOqzteuQmOyWtOyVvOunjCDtlanri4jri6QuCisKKwor7Iqs66a96rO8IOybqOydtO2BrOyXhSDtlajsiJgKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK+q4gOuhnOuyjCDrjbDsnbTthLDsl5Ag7ZGc7Iuc65CcIOydtOuypO2KuOyXkCDsnZjtlbQg7ZSE66Gc7IS47Iqk66W8IOyeoOyXkCDruaDtirjrpqzripQg6rKD6rO8IOq5qOyasOuKlCDqsoPsnYAKK+2VtOuLuSDsnbTrsqTtirjrpbwg6riw64uk66as64qUIO2DnOyKpO2BrOydmCDtg5zsiqTtgawg7IOB7YOc7JmAIOq3uCDsnbTrsqTtirjrpbwg7JWM66as6riwIOychO2VtCDsgqzsmqnrkJjripQKK+q4gOuhnOuyjCDrjbDsnbTthLAsIOuRkCDrjbDsnbTthLDqsITsnZgg7IOB7Zi47J6R7Jqp7Jy866GcIOuzvCDsiJgg7J6I7Iq164uI64ukLiAg7J206rKD7J20IOyYs+ydgCDsiJzshJzrjIDroZwKK+ydvOyWtOuCqOydhCDrtoTrqoXtnogg7ZWY6riwIOychO2VtCwg7ZSE66Gc7IS47Iqk66W8IOyeoOyXkCDrk6Tqsowg7ZWY64qUIOq4sOuKpeqzvCDquajsmrDripQg6riw64ql7J2ACivrqofqsIDsp4Ag67Cw66as7Ja066W8IOuCtO2PrO2VqeuLiOuLpC4KKwor66i87KCALCDsnqDsnYQg7J6s7Jqw64qUIOyqveydgCDsnbzrsJjsoIHsnLzroZwg64uk7J2M6rO8IOqwmeydgCDsnbTrsqTtirgg7Iuc7YCA7Iqk66W8IOuUsOumheuLiOuLpDoKKworCWZvciAoOzspIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlpZiAoZXZlbnRfaW5kaWNhdGVkKQorCQkJYnJlYWs7CisJCXNjaGVkdWxlKCk7CisJfQorCitzZXRfY3VycmVudF9zdGF0ZSgpIOyXkCDsnZjtlbQsIO2DnOyKpO2BrCDsg4Htg5zqsIAg67CU64CQIO2bhCDrspTsmqkg66mU66qo66asIOuwsOumrOyWtOqwgAor7J6Q64+Z7Jy866GcIOyCveyeheuQqeuLiOuLpDoKKworCUNQVSAxCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCXNldF9jdXJyZW50X3N0YXRlKCk7CisJICBzbXBfc3RvcmVfbWIoKTsKKwkgICAgU1RPUkUgY3VycmVudC0+c3RhdGUKKwkgICAgPOuylOyaqSDrsLDrpqzslrQ+CisJTE9BRCBldmVudF9pbmRpY2F0ZWQKKworc2V0X2N1cnJlbnRfc3RhdGUoKSDripQg64uk7J2M7J2YIOqyg+uTpOuhnCDqsJDsi7jsp4gg7IiY64+EIOyeiOyKteuLiOuLpDoKKworCXByZXBhcmVfdG9fd2FpdCgpOworCXByZXBhcmVfdG9fd2FpdF9leGNsdXNpdmUoKTsKKwor7J206rKD65OkIOyXreyLnCDsg4Htg5zrpbwg7ISk7KCV7ZWcIO2bhCDrspTsmqkg66mU66qo66asIOuwsOumrOyWtOulvCDsgr3snoXtlanri4jri6QuCivslZ7snZgg7KCE7LK0IOyLnO2AgOyKpOuKlCDri6TsnYzqs7wg6rCZ7J2AIO2VqOyImOuTpOuhnCDtlZzrsojsl5Ag7IiY7ZaJIOqwgOuKpe2VnOuNsCwg7J206rKD65Ok7J2AIOuqqOuRkAor7Jis67CU66W4IOyepeyGjOyXkCDrqZTrqqjrpqwg67Cw66as7Ja066W8IOyCveyehe2VqeuLiOuLpDoKKworCXdhaXRfZXZlbnQoKTsKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoKTsKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfZXhjbHVzaXZlKCk7CisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoKTsKKwl3YWl0X2V2ZW50X2tpbGxhYmxlKCk7CisJd2FpdF9ldmVudF90aW1lb3V0KCk7CisJd2FpdF9vbl9iaXQoKTsKKwl3YWl0X29uX2JpdF9sb2NrKCk7CisKKwor65GQ67KI7Ke466GcLCDquajsmrDquLDrpbwg7IiY7ZaJ7ZWY64qUIOy9lOuTnOuKlCDsnbzrsJjsoIHsnLzroZwg64uk7J2M6rO8IOqwmeydhCDqsoHri4jri6Q6CisKKwlldmVudF9pbmRpY2F0ZWQgPSAxOworCXdha2VfdXAoJmV2ZW50X3dhaXRfcXVldWUpOworCivrmJDripQ6CisKKwlldmVudF9pbmRpY2F0ZWQgPSAxOworCXdha2VfdXBfcHJvY2VzcyhldmVudF9kYWVtb24pOworCit3YWtlX3VwKCkg66WY7JeQIOydmO2VtCDsk7DquLAg66mU66qo66asIOuwsOumrOyWtOqwgCDrgrTtj6zrkKnri4jri6QuICDrp4zslb0g6re46rKD65Ok7J20IOutlOqwgOulvAor6rmo7Jq064uk66m07JqULiAg7J20IOuwsOumrOyWtOuKlCDtg5zsiqTtgawg7IOB7YOc6rCAIOyngOybjOyngOq4sCDsoITsl5Ag7IiY7ZaJ65CY66+A66GcLCDsnbTrsqTtirjrpbwKK+yVjOumrOq4sCDsnITtlZwgU1RPUkUg7JmAIO2DnOyKpO2BrCDsg4Htg5zrpbwgVEFTS19SVU5OSU5HIOycvOuhnCDshKTsoJXtlZjripQgU1RPUkUg7IKs7J207JeQCivsnITsuZjtlZjqsowg65Cp64uI64ukLgorCisJQ1BVIDEJCQkJQ1BVIDIKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlzZXRfY3VycmVudF9zdGF0ZSgpOwkJU1RPUkUgZXZlbnRfaW5kaWNhdGVkCisJICBzbXBfc3RvcmVfbWIoKTsJCXdha2VfdXAoKTsKKwkgICAgU1RPUkUgY3VycmVudC0+c3RhdGUJICA87JOw6riwIOuwsOumrOyWtD4KKwkgICAgPOuylOyaqSDrsLDrpqzslrQ+CQkgIFNUT1JFIGN1cnJlbnQtPnN0YXRlCisJTE9BRCBldmVudF9pbmRpY2F0ZWQKKwor7ZWc67KI642UIOunkO2VqeuLiOuLpOunjCwg7J20IOyTsOq4sCDrqZTrqqjrpqwg67Cw66as7Ja064qUIOydtCDsvZTrk5zqsIAg7KCV66eQ66GcIOutlOqwgOulvCDquajsmrgg65WM7JeQ66eMCivsi6TtlonrkKnri4jri6QuICDsnbTqsbgg7ISk66qF7ZWY6riwIOychO2VtCwgWCDsmYAgWSDripQg66qo65GQIDAg7Jy866GcIOy0iOq4sO2ZlCDrkJjslrQg7J6I64uk64qUIOqwgOyglQor7ZWY7JeQIOyVhOuemOydmCDsnbTrsqTtirgg7Iuc7YCA7Iqk66W8IOyDneqwge2VtCDrtIXsi5zri6Q6CisKKwlDUFUgMQkJCQlDUFUgMgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVggPSAxOwkJCQlTVE9SRSBldmVudF9pbmRpY2F0ZWQKKwlzbXBfbWIoKTsJCQl3YWtlX3VwKCk7CisJWSA9IDE7CQkJCXdhaXRfZXZlbnQod3EsIFkgPT0gMSk7CisJd2FrZV91cCgpOwkJCSAgbG9hZCBmcm9tIFkgc2VlcyAxLCBubyBtZW1vcnkgYmFycmllcgorCQkJCQlsb2FkIGZyb20gWCBtaWdodCBzZWUgMAorCivsnIQg7JiI7KCc7JeQ7ISc7J2YIOqyveyasOyZgCDri6zrpqwg6rmo7Jqw6riw6rCAIOygleunkOuhnCDtlontlbTsoYzri6TrqbQsIENQVSAyIOydmCBYIOuhnOuTnOuKlCAxIOydhAor67O464uk6rOgIOuztOyepeuQoCDsiJgg7J6I7J2EIOqygeuLiOuLpC4KKwor7IKs7JqpIOqwgOuKpe2VnCDquajsmrDquLDrpZgg7ZWo7IiY65Ok66GcIOuLpOydjOqzvCDqsJnsnYAg6rKD65Ok7J20IOyeiOyKteuLiOuLpDoKKworCWNvbXBsZXRlKCk7CisJd2FrZV91cCgpOworCXdha2VfdXBfYWxsKCk7CisJd2FrZV91cF9iaXQoKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX25yKCk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX3BvbGwoKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfc3luYygpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9zeW5jX3BvbGwoKTsKKwl3YWtlX3VwX2xvY2tlZCgpOworCXdha2VfdXBfbG9ja2VkX3BvbGwoKTsKKwl3YWtlX3VwX25yKCk7CisJd2FrZV91cF9wb2xsKCk7CisJd2FrZV91cF9wcm9jZXNzKCk7CisKKworWyFdIOyeoOyerOyasOuKlCDsvZTrk5zsmYAg6rmo7Jqw64qUIOy9lOuTnOyXkCDrgrTtj6zrkJjripQg66mU66qo66asIOuwsOumrOyWtOuTpOydgCDquajsmrDquLAg7KCE7JeQCivsnbTro6jslrTsp4Qg7Iqk7Yag7Ja066W8IOyeoOyerOyasOuKlCDsvZTrk5zqsIAgc2V0X2N1cnJlbnRfc3RhdGUoKSDrpbwg7Zi47Lac7ZWcIO2bhOyXkCDtlontlZjripQKK+uhnOuTnOyXkCDrjIDtlbQg7Iic7ISc66W8IOunnuy2lOyngCBf7JWK64qU64uk64qUXyDsoJDsnYQg6riw7Ja17ZWY7IS47JqULiAg7JiI66W8IOuTpOyWtCwg7J6g7J6s7Jqw64qUCivsvZTrk5zqsIAg64uk7J2M6rO8IOqwmeqzoDoKKworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJaWYgKGV2ZW50X2luZGljYXRlZCkKKwkJYnJlYWs7CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCWRvX3NvbWV0aGluZyhteV9kYXRhKTsKKwor6rmo7Jqw64qUIOy9lOuTnOuKlCDri6TsnYzqs7wg6rCZ64uk66m0OgorCisJbXlfZGF0YSA9IHZhbHVlOworCWV2ZW50X2luZGljYXRlZCA9IDE7CisJd2FrZV91cCgmZXZlbnRfd2FpdF9xdWV1ZSk7CisKK2V2ZW50X2luZGVjYXRlZCDsl5DsnZgg67OA6rK97J20IOyeoOyerOyasOuKlCDsvZTrk5zsl5DqsowgbXlfZGF0YSDsl5DsnZgg67OA6rK9IO2bhOyXkCDsnbTro6jslrTsp4QKK+qyg+ycvOuhnCDsnbjsp4DrkKAg6rKD7J20652864qUIOuztOyepeydtCDsl4bsirXri4jri6QuICDsnbTrn7Ag6rK97Jqw7JeQ64qUIOyWkeyqvSDsvZTrk5wg66qo65GQIOqwgeqwgeydmAor642w7J207YSwIOyVoeyEuOyKpCDsgqzsnbTsl5Ag66mU66qo66asIOuwsOumrOyWtOulvCDsp4HsoJEg7LOQ7JW8IO2VqeuLiOuLpC4gIOuUsOudvOyEnCDslZ7snZgg7J6s7Jqw64qUCivsvZTrk5zripQg64uk7J2M6rO8IOqwmeydtDoKKworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJaWYgKGV2ZW50X2luZGljYXRlZCkgeworCQlzbXBfcm1iKCk7CisJCWRvX3NvbWV0aGluZyhteV9kYXRhKTsKKwl9CisKK+q3uOumrOqzoCDquajsmrDripQg7L2U65Oc64qUIOuLpOydjOqzvCDqsJnsnbQg65CY7Ja07JW8IO2VqeuLiOuLpDoKKworCW15X2RhdGEgPSB2YWx1ZTsKKwlzbXBfd21iKCk7CisJZXZlbnRfaW5kaWNhdGVkID0gMTsKKwl3YWtlX3VwKCZldmVudF93YWl0X3F1ZXVlKTsKKworCivqt7jsmbjsnZgg7ZWo7IiY65OkCistLS0tLS0tLS0tLS0tCisKK+q3uOyZuOydmCDrsLDrpqzslrTrpbwg64K07Y+s7ZWY64qUIO2VqOyImOuTpOydgCDri6TsnYzqs7wg6rCZ7Iq164uI64ukOgorCisgKCopIHNjaGVkdWxlKCkg6rO8IOq3uCDsnKDsgqztlZwg6rKD65Ok7J20IOyZhOyghO2VnCDrqZTrqqjrpqwg67Cw66as7Ja066W8IOuCtO2PrO2VqeuLiOuLpC4KKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0NQVSDqsIQgQUNRVUlSSU5HIOuwsOumrOyWtOydmCDtmqjqs7wKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitTTVAg7Iuc7Iqk7YWc7JeQ7ISc7J2YIOudvSDquLDriqXrk6TsnYAg642U7JqxIOqwleugpe2VnCDtmJXtg5zsnZgg67Cw66as7Ja066W8IOygnOqzte2VqeuLiOuLpDog7J20CivrsLDrpqzslrTripQg64+Z7J287ZWcIOudveydhCDsgqzsmqntlZjripQg64uk66W4IENQVSDrk6TsnZgg66mU66qo66asIOyVoeyEuOyKpCDsiJzshJzsl5Drj4Qg7JiB7Zal7J2ECivrgbzsuanri4jri6QuCisKKworQUNRVUlSRSBWUyDrqZTrqqjrpqwg7JWh7IS47IqkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwor64uk7J2M7J2YIOyYiOulvCDsg53qsIHtlbQg67SF7Iuc64ukOiDsi5zsiqTthZzsnYAg65GQ6rCc7J2YIOyKpO2VgOudvSAoTSkg6rO8IChRKSwg6re466as6rOgIOyEuOqwnOydmCBDUFUKK+ulvCDqsIDsp4Dqs6Ag7J6I7Iq164uI64ukOyDsl6zquLDsl5Ag64uk7J2M7J2YIOydtOuypO2KuCDsi5ztgIDsiqTqsIAg67Cc7IOd7ZWp64uI64ukOgorCisJQ1BVIDEJCQkJQ1BVIDIKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlXUklURV9PTkNFKCpBLCBhKTsJCVdSSVRFX09OQ0UoKkUsIGUpOworCUFDUVVJUkUgTQkJCUFDUVVJUkUgUQorCVdSSVRFX09OQ0UoKkIsIGIpOwkJV1JJVEVfT05DRSgqRiwgZik7CisJV1JJVEVfT05DRSgqQywgYyk7CQlXUklURV9PTkNFKCpHLCBnKTsKKwlSRUxFQVNFIE0JCQlSRUxFQVNFIFEKKwlXUklURV9PTkNFKCpELCBkKTsJCVdSSVRFX09OQ0UoKkgsIGgpOworCisqQSDroZzsnZgg7JWh7IS47Iqk67aA7YSwICpIIOuhnOydmCDslaHshLjsiqTquYzsp4DqsIAg7Ja065akIOyInOyEnOuhnCBDUFUgMyDsl5Dqsowg67O07Jes7KeI7KeA7JeQCivrjIDtlbTshJzripQg6rCBIENQVSDsl5DshJzsnZgg6529IOyCrOyaqeyXkCDsnZjtlbQg64K07Y+s65CY7Ja0IOyeiOuKlCDsoJzslb3snYQg7KCc7Jm47ZWY6rOg64qUIOyWtOuWpAor67O07J6l64+EIOyhtOyerO2VmOyngCDslYrsirXri4jri6QuICDsmIjrpbwg65Ok7Ja0LCBDUFUgMyDsl5Dqsowg64uk7J2M6rO8IOqwmeydgCDsiJzshJzroZwg67O07Jes7KeA64qUCivqsoPsnbQg6rCA64ql7ZWp64uI64ukOgorCisJKkUsIEFDUVVJUkUgTSwgQUNRVUlSRSBRLCAqRywgKkMsICpGLCAqQSwgKkIsIFJFTEVBU0UgUSwgKkQsICpILCBSRUxFQVNFIE0KKwor7ZWY7KeA66eMIOuLpOydjOqzvCDqsJnsnbQg67O07J207KeA64qUIOyViuydhCDqsoHri4jri6Q6CisKKwkqQiwgKkMgb3IgKkQgcHJlY2VkaW5nIEFDUVVJUkUgTQorCSpBLCAqQiBvciAqQyBmb2xsb3dpbmcgUkVMRUFTRSBNCisJKkYsICpHIG9yICpIIHByZWNlZGluZyBBQ1FVSVJFIFEKKwkqRSwgKkYgb3IgKkcgZm9sbG93aW5nIFJFTEVBU0UgUQorCisKKworQUNRVUlSRSBWUyBJL08g7JWh7IS47IqkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK+2Kueygle2VnCAo7Yq57Z6IIE5VTUEg6rCAIOq0gOugqOuQnCkg7ZmY6rK9IO2VmOyXkOyEnCDrkZDqsJzsnZggQ1BVIOyXkOyEnCDrj5nsnbztlZwg7Iqk7ZWA65297Jy866GcCivrs7TtmLjrkJjripQg65GQ6rCc7J2YIO2BrOumrO2LsOy7rCDshLnshZgg7JWI7J2YIEkvTyDslaHshLjsiqTripQgUENJIOu4jOumv+yngOyXkCDqsrnss5Dsp4QgSS9PCivslaHshLjsiqTroZwg67O07J28IOyImCDsnojripTrjbAsIFBDSSDruIzrpr/sp4DripQg7LqQ7IucIOydvOq0gOyEsSDtlITroZzthqDsvZzqs7wg7ZWp7J2EIOunnuy2sOyVvCDtlaAKK+ydmOustOqwgCDsl4bsnLzrr4DroZwsIO2VhOyalO2VnCDsnb3quLAg66mU66qo66asIOuwsOumrOyWtOqwgCDsmpTssq3rkJjsp4Ag7JWK6riwIOuVjOusuOyeheuLiOuLpC4KKwor7JiI66W8IOuTpOyWtOyEnDoKKworCUNQVSAxCQkJCUNQVSAyCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJc3Bpbl9sb2NrKFEpCisJd3JpdGVsKDAsIEFERFIpCisJd3JpdGVsKDEsIERBVEEpOworCXNwaW5fdW5sb2NrKFEpOworCQkJCQlzcGluX2xvY2soUSk7CisJCQkJCXdyaXRlbCg0LCBBRERSKTsKKwkJCQkJd3JpdGVsKDUsIERBVEEpOworCQkJCQlzcGluX3VubG9jayhRKTsKKwor64qUIFBDSSDruIzrpr/sp4Dsl5Ag64uk7J2M6rO8IOqwmeydtCDrs7Tsnbwg7IiYIOyeiOyKteuLiOuLpDoKKworCVNUT1JFICpBRERSID0gMCwgU1RPUkUgKkFERFIgPSA0LCBTVE9SRSAqREFUQSA9IDEsIFNUT1JFICpEQVRBID0gNQorCivsnbTroIfqsowg65CY66m0IO2VmOuTnOybqOyWtOydmCDsmKTrj5nsnpHsnYQg7J287Jy87YKsIOyImCDsnojsirXri4jri6QuCisKKwor7J2065+wIOqyveyasOyXlCDsnqHslYTrkZQg7Iqk7ZWA65297J2EIOuCtOugpOuGk+q4sCDsoITsl5AgbW1pb3diKCkg66W8IOyImO2Wie2VtOyVvCDtlZjripTrjbAsIOyYiOulvAor65Ok66m0IOuLpOydjOqzvCDqsJnsirXri4jri6Q6CisKKwlDUFUgMQkJCQlDUFUgMgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCXNwaW5fbG9jayhRKQorCXdyaXRlbCgwLCBBRERSKQorCXdyaXRlbCgxLCBEQVRBKTsKKwltbWlvd2IoKTsKKwlzcGluX3VubG9jayhRKTsKKwkJCQkJc3Bpbl9sb2NrKFEpOworCQkJCQl3cml0ZWwoNCwgQUREUik7CisJCQkJCXdyaXRlbCg1LCBEQVRBKTsKKwkJCQkJbW1pb3diKCk7CisJCQkJCXNwaW5fdW5sb2NrKFEpOworCivsnbQg7L2U65Oc64qUIENQVSAxIOyXkOyEnCDsmpTssq3rkJwg65GQ6rCc7J2YIOyKpO2GoOyWtOqwgCBQQ0kg67iM66a/7KeA7JeQIENQVSAyIOyXkOyEnCDsmpTssq3rkJwKK+yKpO2GoOyWtOuTpOuztOuLpCDrqLzsoIAg67O07Jes7KeQ7J2EIOuztOyepe2VqeuLiOuLpC4KKworCivrmJDtlZwsIOqwmeydgCDrlJTrsJTsnbTsiqTsl5DshJwg7Iqk7Yag7Ja066W8IOydtOyWtCDroZzrk5zqsIAg7IiY7ZaJ65CY66m0IOydtCDroZzrk5zripQg66Gc65Oc6rCAIOyImO2WieuQmOq4sAor7KCE7JeQIOyKpO2GoOyWtOqwgCDsmYTro4zrkJjquLDrpbwg6rCV7KCc7ZWY66+A66GcIG1taW93YigpIOydmCDtlYTsmpTqsIAg7JeG7Ja07KeR64uI64ukOgorCisJQ1BVIDEJCQkJQ1BVIDIKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlzcGluX2xvY2soUSkKKwl3cml0ZWwoMCwgQUREUikKKwlhID0gcmVhZGwoREFUQSk7CisJc3Bpbl91bmxvY2soUSk7CisJCQkJCXNwaW5fbG9jayhRKTsKKwkJCQkJd3JpdGVsKDQsIEFERFIpOworCQkJCQliID0gcmVhZGwoREFUQSk7CisJCQkJCXNwaW5fdW5sb2NrKFEpOworCisKK+uNlCDrp47snYAg7KCV67O066W8IOychO2VtOyEoCBEb2N1bWVuYXRhaW9uL0RvY0Jvb2svZGV2aWNlaW9ib29rLnRtcGwg7J2EIOywuOqzoO2VmOyEuOyalC4KKworCis9PT09PT09PT09PT09PT09PT09PT09PT09CivrqZTrqqjrpqwg67Cw66as7Ja06rCAIO2VhOyalO2VnCDqs7MKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKwor7ISk66C5IFNNUCDsu6TrhJDsnYQg7IKs7Jqp7ZWY642U652864+EIOyLseq4gCDsk7DroIjrk5zroZwg64+Z7J6R7ZWY64qUIOy9lOuTnOuKlCDsmKzrsJTrpbTqsowg64+Z7J6R7ZWY64qUCivqsoPsnLzroZwg67O07Jes7KeIIOqyg+ydtOq4sCDrlYzrrLjsl5AsIO2PieuylO2VnCDsi5zsiqTthZwg7Jq07JiB7KSR7JeQIOuplOuqqOumrCDsmKTtjbzroIjsnbTshZgg7J6s67Cw7LmY64qUCivsnbzrsJjsoIHsnLzroZwg66y47KCc6rCAIOuQmOyngCDslYrsirXri4jri6QuICDtlZjsp4Drp4wsIOyerOuwsOy5mOqwgCDrrLjsoJzqsIAgX+uQoCDsiJgg7J6I64qUXyDrhKTqsIDsp4AKK+2ZmOqyveydtCDsnojsirXri4jri6Q6CisKKyAoKikg7ZSE66Gc7IS47ISc6rCEIOyDge2YuCDsnpHsmqkuCisKKyAoKikg7Ja07Yag66+5IOyYpO2NvOugiOydtOyFmC4KKworICgqKSDrlJTrsJTsnbTsiqQg7JWh7IS47IqkLgorCisgKCopIOyduO2EsOufve2KuC4KKworCivtlITroZzshLjshJzqsIQg7IOB7Zi4IOyekeyaqQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwor65GQ6rCcIOydtOyDgeydmCDtlITroZzshLjshJzrpbwg6rCA7KeEIOyLnOyKpO2FnOydtCDsnojri6TrqbQsIOyLnOyKpO2FnOydmCDrkZDqsJwg7J207IOB7J2YIENQVSDripQg64+Z7Iuc7JeQCivqsJnsnYAg642w7J207YSw7JeQIOuMgO2VnCDsnpHsl4XsnYQg7ZWgIOyImCDsnojsirXri4jri6QuICDsnbTripQg64+Z6riw7ZmUIOusuOygnOulvCDsnbzsnLztgqwg7IiYIOyeiOqzoCwKK+ydtCDrrLjsoJzrpbwg7ZW06rKw7ZWY64qUIOydvOuwmOyggSDrsKnrspXsnYAg65297J2EIOyCrOyaqe2VmOuKlCDqsoPsnoXri4jri6QuICDtlZjsp4Drp4wsIOudveydgCDsg4Hri7ntnogKK+u5hOyaqeydtCDruYTsi7jshJwg6rCA64ql7ZWY66m0IOudveydhCDsgqzsmqntlZjsp4Ag7JWK6rOgIOydvOydhCDsspjrpqztlZjripQg6rKD7J20IOuCq+yKteuLiOuLpC4gIOydtOufsAor6rK97JqwLCDrkZAgQ1BVIOuqqOuRkOyXkCDsmIHtlqXsnYQg64G87LmY64qUIOyYpO2NvOugiOydtOyFmOuTpOydgCDsmKTrj5nsnpHsnYQg66eJ6riwIOychO2VtCDsi6DspJHtlZjqsowKK+yInOyEnOqwgCDrp57strDsoLjslbwg7ZWp64uI64ukLgorCivsmIjrpbwg65Ok7Ja0LCBSL1cg7IS466eI7Y+s7Ja07J2YIOuKkOumsCDsiJjtlonqsr3roZwgKHNsb3cgcGF0aCkg66W8IOyDneqwge2VtCDrtIXsi5zri6QuCivshLjrp4jtj6zslrTrpbwg7JyE7ZW0IOuMgOq4sOulvCDtlZjripQg7ZWY64KY7J2YIO2UhOuhnOyEuOyKpOqwgCDsnpDsi6DsnZgg7Iqk7YOdIOykkSDsnbzrtoDrpbwg7J20CivshLjrp4jtj6zslrTsnZgg64yA6riwIO2UhOuhnOyEuOyKpCDrpqzsiqTtirjsl5Ag66eB7YGs7ZWcIOyxhOuhnCDsnojsirXri4jri6Q6CisKKwlzdHJ1Y3Qgcndfc2VtYXBob3JlIHsKKwkJLi4uCisJCXNwaW5sb2NrX3QgbG9jazsKKwkJc3RydWN0IGxpc3RfaGVhZCB3YWl0ZXJzOworCX07CisKKwlzdHJ1Y3QgcndzZW1fd2FpdGVyIHsKKwkJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisJfTsKKwor7Yq57KCVIOuMgOq4sCDsg4Htg5wg7ZSE66Gc7IS47Iqk66W8IOq5qOyasOq4sCDsnITtlbQsIHVwX3JlYWQoKSDrgpggdXBfd3JpdGUoKSDtlajsiJjripQg64uk7J2M6rO8CivqsJnsnYAg7J287J2EIO2VqeuLiOuLpDoKKworICgxKSDri6TsnYwg64yA6riwIOyDge2DnCDtlITroZzshLjsiqQg66CI7L2U65Oc64qUIOyWtOuUlOyeiOuKlOyngCDslYzquLAg7JyE7ZW0IOydtCDrjIDquLAg7IOB7YOcCisgICAgIO2UhOuhnOyEuOyKpCDroIjsvZTrk5zsnZggbmV4dCDtj6zsnbjthLDrpbwg7J297Iq164uI64ukOworCisgKDIpIOydtCDrjIDquLAg7IOB7YOcIO2UhOuhnOyEuOyKpOydmCB0YXNrIOq1rOyhsOyytOuhnOydmCDtj6zsnbjthLDrpbwg7J297Iq164uI64ukOworCisgKDMpIOydtCDrjIDquLAg7IOB7YOcIO2UhOuhnOyEuOyKpOqwgCDshLjrp4jtj6zslrTrpbwg7ZqN65Od7ZaI7J2M7J2EIOyVjOumrOq4sCDsnITtlbQgdGFzaworICAgICDtj6zsnbjthLDrpbwg7LSI6riw7ZmUIO2VqeuLiOuLpDsKKworICg0KSDtlbTri7kg7YOc7Iqk7YGs7JeQIOuMgO2VtCB3YWtlX3VwX3Byb2Nlc3MoKSDrpbwg7Zi47Lac7ZWp64uI64ukOyDqt7jrpqzqs6AKKworICg1KSDtlbTri7kg64yA6riwIOyDge2DnCDtlITroZzshLjsiqTsnZggdGFzayDqtazsobDssrTrpbwg7J6h6rOgIOyeiOuNmCDroIjtjbzrn7DsiqTrpbwg7ZW07KCc7ZWp64uI64ukLgorCivri6zrpqwg66eQ7ZWY7J6Q66m0LCDri6TsnYwg7J2067Kk7Yq4IOyLnO2AgOyKpOulvCDsiJjtlontlbTslbwg7ZWp64uI64ukOgorCisJTE9BRCB3YWl0ZXItPmxpc3QubmV4dDsKKwlMT0FEIHdhaXRlci0+dGFzazsKKwlTVE9SRSB3YWl0ZXItPnRhc2s7CisJQ0FMTCB3YWtldXAKKwlSRUxFQVNFIHRhc2sKKwor6re466as6rOgIOydtCDsnbTrsqTtirjrk6TsnbQg64uk66W4IOyInOyEnOuhnCDsiJjtlonrkJzri6TrqbQsIOyYpOuPmeyekeydtCDsnbzslrTrgqAg7IiYIOyeiOyKteuLiOuLpC4KKwor7ZWc67KIIOyEuOuniO2PrOyWtOydmCDrjIDquLDspITsl5Ag65Ok7Ja06rCU6rOgIOyEuOuniO2PrOyWtCDrnb3snYQg64aT7JWY64uk66m0LCDtlbTri7kg64yA6riwIO2UhOuhnOyEuOyKpOuKlAor65297J2EIOuLpOyLnOuKlCDsnqHsp4Ag7JWK7Iq164uI64ukOyDrjIDsi6Ag7J6Q7Iug7J2YIHRhc2sg7Y+s7J247YSw6rCAIOy0iOq4sO2ZlCDrkJjquLgg6riw64uk66a964uI64ukLgor6re4IOugiOy9lOuTnOuKlCDrjIDquLAg7ZSE66Gc7IS47Iqk7J2YIOyKpO2DneyXkCDsnojquLAg65WM66y47JeQLCDrpqzsiqTtirjsnZggbmV4dCDtj6zsnbjthLDqsIAg7J297ZiA7KeA6riwCitf7KCE7JeQXyB0YXNrIO2PrOyduO2EsOqwgCDsp4Dsm4zsp4Tri6TrqbQsIOuLpOuluCBDUFUg64qUIO2VtOuLuSDrjIDquLAg7ZSE66Gc7IS47Iqk66W8IOyLnOyeke2VtCDrsoTrpqzqs6AKK3VwKigpIO2VqOyImOqwgCBuZXh0IO2PrOyduO2EsOulvCDsnb3quLAg7KCE7JeQIOuMgOq4sCDtlITroZzshLjsiqTsnZgg7Iqk7YOd7J2EIOuniOq1rCDqsbTrk5zrprQg7IiYCivsnojsirXri4jri6QuCisKK+q3uOugh+qyjCDrkJjrqbQg7JyE7J2YIOydtOuypO2KuCDsi5ztgIDsiqTsl5Ag7Ja065akIOydvOydtCDsnbzslrTrgpjripTsp4Ag7IOd6rCB7ZW0IOuztOyjoDoKKworCUNQVSAxCQkJCUNQVSAyCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCQkJCWRvd25feHh4KCkKKwkJCQkJUXVldWUgd2FpdGVyCisJCQkJCVNsZWVwCisJdXBfeXl5KCkKKwlMT0FEIHdhaXRlci0+dGFzazsKKwlTVE9SRSB3YWl0ZXItPnRhc2s7CisJCQkJCVdva2VuIHVwIGJ5IG90aGVyIGV2ZW50CisJPHByZWVtcHQ+CisJCQkJCVJlc3VtZSBwcm9jZXNzaW5nCisJCQkJCWRvd25feHh4KCkgcmV0dXJucworCQkJCQljYWxsIGZvbygpCisJCQkJCWZvbygpIGNsb2JiZXJzICp3YWl0ZXIKKwk8L3ByZWVtcHQ+CisJTE9BRCB3YWl0ZXItPmxpc3QubmV4dDsKKwktLS0gT09QUyAtLS0KKwor7J20IOusuOygnOuKlCDshLjrp4jtj6zslrQg65297J2YIOyCrOyaqeycvOuhnCDtlbTqsrDrkKAg7IiY64+EIOyeiOqyoOyngOunjCwg6re466CH6rKMIOuQmOuptCDquajslrTrgpwg7ZuE7JeQCitkb3duX3h4eCgpIO2VqOyImOqwgCDrtojtlYTsmpTtlZjqsowg7Iqk7ZWA65297J2EIOuYkOuLpOyLnCDslrvslrTslbzrp4wg7ZWp64uI64ukLgorCivsnbQg66y47KCc66W8IO2VtOqysO2VmOuKlCDrsKnrspXsnYAg67KU7JqpIFNNUCDrqZTrqqjrpqwg67Cw66as7Ja066W8IOy2lOqwgO2VmOuKlCDqsoHri4jri6Q6CisKKwlMT0FEIHdhaXRlci0+bGlzdC5uZXh0OworCUxPQUQgd2FpdGVyLT50YXNrOworCXNtcF9tYigpOworCVNUT1JFIHdhaXRlci0+dGFzazsKKwlDQUxMIHdha2V1cAorCVJFTEVBU0UgdGFzaworCivsnbQg6rK97Jqw7JeQLCDrsLDrpqzslrTripQg7Iuc7Iqk7YWc7J2YIOuCmOuouOyngCBDUFUg65Ok7JeQ6rKMIOuqqOuToCDrsLDrpqzslrQg7JWe7J2YIOuplOuqqOumrCDslaHshLjsiqTqsIAKK+uwsOumrOyWtCDrkqTsnZgg66mU66qo66asIOyVoeyEuOyKpOuztOuLpCDslZ7shJwg7J287Ja064KcIOqyg+ycvOuhnCDrs7TsnbTqsowg66eM65Ot64uI64ukLiAg67Cw66as7Ja0IOyVnuydmAor66mU66qo66asIOyVoeyEuOyKpOuTpOydtCDrsLDrpqzslrQg66qF66C5IOyekOyytOqwgCDsmYTro4zrkJjripQg7Iuc7KCQ6rmM7KeAIOyZhOujjOuQnOuLpOqzoOuKlCDrs7TsnqXtlZjsp4AKK1/slYrsirXri4jri6RfLgorCiso7J206rKMIOusuOygnOqwgCDrkJjsp4Ag7JWK7J2EKSDri6jsnbwg7ZSE66Gc7IS47IScIOyLnOyKpO2FnOyXkOyEnCBzbXBfbWIoKSDripQg7Iuk7KCc66Gc64qUIOq3uOyggAor7Lu07YyM7J2865+s6rCAIENQVSDslYjsl5DshJzsnZgg7Iic7ISc66W8IOuwlOq+uOqxsOuCmCDtlZjsp4Ag7JWK6rOgIOyjvOyWtOynhCDsiJzshJzrjIDroZwg66qF66C57J2ECivrgrTrpqzrj4TroZ0g7ZWY64qUIOy7tO2MjOydvOufrCDrsLDrpqzslrTsnbwg67+Q7J6F64uI64ukLiAg7Jik7KeBIO2VmOuCmOydmCBDUFUg66eMIOyeiOycvOuLiCwgQ1BVIOydmAor7J2Y7KG07ISxIOyInOyEnCDroZzsp4HsnbQg6re4IOyZuOydmCDrqqjrk6DqsoPsnYQg7JWM7JWE7IScIOyymOumrO2VoCDqsoHri4jri6QuCisKKwor7Ja07Yag66+5IOyYpO2NvOugiOydtOyFmAorLS0tLS0tLS0tLS0tLS0tLS0KKwor7Ja07Yag66+5IOyYpO2NvOugiOydtOyFmOydgCDquLDsiKDsoIHsnLzroZwg7ZSE66Gc7IS47ISc6rCEIOyDge2YuOyekeyaqeycvOuhnCDrtoTrpZjrkJjrqbAg6re4IOykkSDsnbzrtoDripQKK+yghOyytCDrqZTrqqjrpqwg67Cw66as7Ja066W8IOuCtO2PrO2VmOqzoCDrmJAg7J2867aA64qUIOuCtO2PrO2VmOyngCDslYrsp4Drp4wsIOy7pOuEkOyXkOyEnCDsg4Hri7ntnogKK+ydmOyhtOyggeycvOuhnCDsgqzsmqntlZjripQg6riw64qlIOykkSDtlZjrgpjsnoXri4jri6QuCisKK+uplOuqqOumrOydmCDslrTrlqQg7IOB7YOc66W8IOyImOygle2VmOqzoCDtlbTri7kg7IOB7YOc7JeQIOuMgO2VnCAo7JiI7KCE7J2YIOuYkOuKlCDstZzsi6DsnZgpIOygleuztOulvAor66as7YS07ZWY64qUIOyWtO2GoOuvuSDsmKTtjbzroIjsnbTshZjsnYAg66qo65GQIFNNUC3sobDqsbTsoIEg67KU7JqpIOuplOuqqOumrCDrsLDrpqzslrQoc21wX21iKCkp66W8Civsi6TsoJwg7Jik7Y2866CI7J207IWY7J2YIOyVnuqzvCDrkqTsl5Ag64K07Y+s7ZWp64uI64ukLiAg7J2065+wIOyYpO2NvOugiOydtOyFmOydgCDri6TsnYzsnZgg6rKD65Ok7J2ECivtj6ztlajtlanri4jri6Q6CisKKwl4Y2hnKCk7CisJYXRvbWljX3hjaGcoKTsJCQlhdG9taWNfbG9uZ194Y2hnKCk7CisJYXRvbWljX2luY19yZXR1cm4oKTsJCWF0b21pY19sb25nX2luY19yZXR1cm4oKTsKKwlhdG9taWNfZGVjX3JldHVybigpOwkJYXRvbWljX2xvbmdfZGVjX3JldHVybigpOworCWF0b21pY19hZGRfcmV0dXJuKCk7CQlhdG9taWNfbG9uZ19hZGRfcmV0dXJuKCk7CisJYXRvbWljX3N1Yl9yZXR1cm4oKTsJCWF0b21pY19sb25nX3N1Yl9yZXR1cm4oKTsKKwlhdG9taWNfaW5jX2FuZF90ZXN0KCk7CQlhdG9taWNfbG9uZ19pbmNfYW5kX3Rlc3QoKTsKKwlhdG9taWNfZGVjX2FuZF90ZXN0KCk7CQlhdG9taWNfbG9uZ19kZWNfYW5kX3Rlc3QoKTsKKwlhdG9taWNfc3ViX2FuZF90ZXN0KCk7CQlhdG9taWNfbG9uZ19zdWJfYW5kX3Rlc3QoKTsKKwlhdG9taWNfYWRkX25lZ2F0aXZlKCk7CQlhdG9taWNfbG9uZ19hZGRfbmVnYXRpdmUoKTsKKwl0ZXN0X2FuZF9zZXRfYml0KCk7CisJdGVzdF9hbmRfY2xlYXJfYml0KCk7CisJdGVzdF9hbmRfY2hhbmdlX2JpdCgpOworCisJLyogZXhjaGFuZ2Ug7KGw6rG07J20IOyEseqzte2VoCDrlYwgKi8KKwljbXB4Y2hnKCk7CisJYXRvbWljX2NtcHhjaGcoKTsJCWF0b21pY19sb25nX2NtcHhjaGcoKTsKKwlhdG9taWNfYWRkX3VubGVzcygpOwkJYXRvbWljX2xvbmdfYWRkX3VubGVzcygpOworCivsnbTqsoPrk6TsnYAg66mU66qo66asIOuwsOumrOyWtCDtmqjqs7zqsIAg7ZWE7JqU7ZWcIEFDUVVJUkUg67aA66WY7JmAIFJFTEVBU0Ug67aA66WYIOyYpO2NvOugiOydtOyFmOuTpOydhAor6rWs7ZiE7ZWgIOuVjCwg6re466as6rOgIOqwneyytCDtlbTsoJzrpbwg7JyE7ZW0IOugiO2NvOufsOyKpCDsubTsmrTthLDrpbwg7KGw7KCV7ZWgIOuVjCwg7JWU66y17KCBIOuplOuqqOumrAor67Cw66as7Ja0IO2aqOqzvOqwgCDtlYTsmpTtlZwg6rOzIOuTseyXkCDsgqzsmqnrkKnri4jri6QuCisKKwor64uk7J2M7J2YIOyYpO2NvOugiOydtOyFmOuTpOydgCDrqZTrqqjrpqwg67Cw66as7Ja066W8IOuCtO2PrO2VmOyngCBf7JWK6riwXyDrlYzrrLjsl5Ag66y47KCc6rCAIOuQoCDsiJgKK+yeiOyngOunjCwgUkVMRUFTRSDrtoDrpZjsnZgg7Jik7Y2866CI7J207IWY65Ok6rO8IOqwmeydgCDqsoPrk6TsnYQg6rWs7ZiE7ZWgIOuVjCDsgqzsmqnrkKAg7IiY64+ECivsnojsirXri4jri6Q6CisKKwlhdG9taWNfc2V0KCk7CisJc2V0X2JpdCgpOworCWNsZWFyX2JpdCgpOworCWNoYW5nZV9iaXQoKTsKKwor7J206rKD65Ok7J2EIOyCrOyaqe2VoCDrlYzsl5DripQg7ZWE7JqU7ZWY64uk66m0IOyggeygiO2VnCAo7JiI66W8IOuTpOuptCBzbXBfbWJfX2JlZm9yZV9hdG9taWMoKQor6rCZ7J2AKSDrqZTrqqjrpqwg67Cw66as7Ja06rCAIOuqheyLnOyggeycvOuhnCDtlajqu5gg7IKs7Jqp65CY7Ja07JW8IO2VqeuLiOuLpC4KKworCivslYTrnpjsnZgg6rKD65Ok64+EIOuplOuqqOumrCDrsLDrpqzslrTrpbwg64K07Y+s7ZWY7KeAIF/slYrquLBfIOuVjOusuOyXkCwg7J2867aAIO2ZmOqyveyXkOyEnOuKlCAo7JiI66W8Civrk6TrqbQgc21wX21iX19iZWZvcmVfYXRvbWljKCkg6rO8IOqwmeydgCkg66qF7Iuc7KCB7J24IOuplOuqqOumrCDrsLDrpqzslrQg7IKs7Jqp7J20IO2VhOyalO2VqeuLiOuLpC4KKworCWF0b21pY19hZGQoKTsKKwlhdG9taWNfc3ViKCk7CisJYXRvbWljX2luYygpOworCWF0b21pY19kZWMoKTsKKwor7J206rKD65Ok7J20IO2GteqzhCDsg53shLHsnYQg7JyE7ZW0IOyCrOyaqeuQnOuLpOuptCwg6re466as6rOgIO2GteqzhCDrjbDsnbTthLAg7IKs7J207JeQIOq0gOqzhOqwgCDsobTsnqztlZjsp4AKK+yViuuKlOuLpOuptCDrqZTrqqjrpqwg67Cw66as7Ja064qUIO2VhOyalOy5mCDslYrsnYQg6rKB64uI64ukLgorCivqsJ3ssrTsnZgg7IiY66qF7J2EIOq0gOumrO2VmOq4sCDsnITtlbQg66CI7Y2865+w7IqkIOy5tOyatO2MhSDrqqnsoIHsnLzroZwg7IKs7Jqp65Cc64uk66m0LCDroIjtjbzrn7DsiqQKK+y5tOyatO2EsOuKlCDrnb3snLzroZwg67O07Zi465CY64qUIOyEueyFmOyXkOyEnOunjCDsobDsoJXrkJjqsbDrgpgg7Zi47Lac7ZWY64qUIOyqveydtCDsnbTrr7gg7Lap67aE7ZWcCivroIjtjbzrn7DsiqTrpbwg7J6h6rOgIOyeiOydhCDqsoPsnbTquLAg65WM66y47JeQIOuplOuqqOumrCDrsLDrpqzslrTripQg7JWE66eIIO2VhOyalCDsl4bsnYQg6rKB64uI64ukLgorCivrp4zslb0g7Ja065akIOudveydhCDqtazshLHtlZjquLAg7JyE7ZW0IOyCrOyaqeuQnOuLpOuptCwg6529IOq0gOugqCDrj5nsnpHsnYAg7J2867CY7KCB7Jy866GcIOyekeyXheydhCDtirnsoJUKK+yInOyEnOuMgOuhnCDsp4TtlontlbTslbwg7ZWY66+A66GcIOuplOuqqOumrCDrsLDrpqzslrTqsIAg7ZWE7JqU7ZWgIOyImCDsnojsirXri4jri6QuCisKK+q4sOuzuOyggeycvOuhnCwg6rCBIOyCrOyaqeyymOyXkOyEnOuKlCDrqZTrqqjrpqwg67Cw66as7Ja06rCAIO2VhOyalO2VnOyngCDslYTri4zsp4Ag7Lap67aE7Z6IIOqzoOugpO2VtOyVvAor7ZWp64uI64ukLgorCivslYTrnpjsnZgg7Jik7Y2866CI7J207IWY65Ok7J2AIO2KueuzhO2VnCDrnb0g6rSA66CoIOuPmeyekeuTpOyeheuLiOuLpDoKKworCXRlc3RfYW5kX3NldF9iaXRfbG9jaygpOworCWNsZWFyX2JpdF91bmxvY2soKTsKKwlfX2NsZWFyX2JpdF91bmxvY2soKTsKKwor7J206rKD65Ok7J2AIEFDUVVJUkUg66WY7JmAIFJFTEVBU0Ug66WY7J2YIOyYpO2NvOugiOydtOyFmOuTpOydhCDqtaztmITtlanri4jri6QuICDrnb0g6rSA66CoIOuPhOq1rOulvAor6rWs7ZiE7ZWgIOuVjOyXkOuKlCDsnbTqsoPrk6TsnYQg7KKAIOuNlCDshKDtmLjtlZjripQg7Y647J20IOuCmOydgOuNsCwg7J206rKD65Ok7J2YIOq1rO2YhOydgCDrp47snYAKK+yVhO2CpO2FjeyzkOyXkOyEnCDstZzsoIHtmZQg65CgIOyImCDsnojquLAg65WM66y47J6F64uI64ukLgorCitbIV0g7J2065+wIOyDge2ZqeyXkCDsgqzsmqntlaAg7IiYIOyeiOuKlCDtirnsiJjtlZwg66mU66qo66asIOuwsOumrOyWtCDrj4Tqtazrk6TsnbQg7J6I7Iq164uI64uk66eMLCDsnbzrtoAKK0NQVSDsl5DshJzripQg7IKs7Jqp65CY64qUIOyWtO2GoOuvuSDsnbjsiqTtirjrn63shZgg7J6Q7LK07JeQIOuplOuqqOumrCDrsLDrpqzslrTqsIAg64K07Y+s65CY7Ja0IOyeiOyWtOyEnAor7Ja07Yag66+5IOyYpO2NvOugiOydtOyFmOqzvCDrqZTrqqjrpqwg67Cw66as7Ja066W8IO2VqOq7mCDsgqzsmqntlZjripQg6rKMIOu2iO2VhOyalO2VnCDsnbzsnbQg65CgIOyImAor7J6I64qU642wLCDqt7jrn7Ag6rK97Jqw7JeQIOydtCDtirnsiJgg66mU66qo66asIOuwsOumrOyWtCDrj4Tqtazrk6TsnYAgbm8tb3Ag7J20IOuQmOyWtCDsi6Tsp4jsoIHsnLzroZwKK+yVhOustOydvOuPhCDtlZjsp4Ag7JWK7Iq164uI64ukLgorCivrjZQg66eO7J2AIOuCtOyaqeydhCDsnITtlbTshKAgRG9jdW1lbnRhdGlvbi9hdG9taWNfb3BzLnR4dCDrpbwg7LC46rOg7ZWY7IS47JqULgorCisKK+uUlOuwlOydtOyKpCDslaHshLjsiqQKKy0tLS0tLS0tLS0tLS0tLQorCivrp47snYAg65SU67CU7J207Iqk6rCAIOuplOuqqOumrCDrp6TtlZEg6riw67KV7Jy866GcIOygnOyWtOuQoCDsiJgg7J6I64qU642wLCDqt7jroIfqsowg7KCc7Ja065CY64qUCivrlJTrsJTsnbTsiqTripQgQ1BVIOyXkOuKlCDri6jsp4Ag7Yq57KCVIOuplOuqqOumrCDsmIHsl63snZgg7KeR7ZWp7LKY65+8IOuztOydtOqyjCDrkKnri4jri6QuICDrk5zrnbzsnbTrsoTripQKK+q3uOufsCDrlJTrsJTsnbTsiqTrpbwg7KCc7Ja07ZWY6riwIOychO2VtCDsoJXtmZXtnogg7Jis67CU66W4IOyInOyEnOuhnCDsmKzrsJTrpbgg66mU66qo66asIOyVoeyEuOyKpOulvAor66eM65Ok7Ja07JW8IO2VqeuLiOuLpC4KKwor7ZWY7KeA66eMLCDslaHshLjsiqTrk6TsnYQg7J6s67Cw7LmYIO2VmOqxsOuCmCDsobDtlantlZjqsbDrgpgg67OR7ZWp7ZWY64qU6rKMIOuNlCDtmqjsnKjsoIHsnbTrnbwg7YyQ64uo7ZWY64qUCivsmIHrpqztlZwgQ1BVIOuCmCDsu7TtjIzsnbzrn6zrk6TsnYQg7IKs7Jqp7ZWY66m0IOuTnOudvOydtOuyhCDsvZTrk5zsnZgg7KGw7Ius7Iqk65+96rKMIOyInOyEnCDrp57strDsp4QKK+yVoeyEuOyKpOuTpOydtCDrlJTrsJTsnbTsiqTsl5DripQg7JqU7LKt65CcIOyInOyEnOuMgOuhnCDrj4TssKntlZjsp4Ag66q77ZWY6rKMIO2VoCDsiJgg7J6I64qUIC0g65SU67CU7J207Iqk6rCACivsmKTrj5nsnpHsnYQg7ZWY6rKMIO2VoCAtIOyeoOyerOyggSDrrLjsoJzqsIAg7IOd6ri4IOyImCDsnojsirXri4jri6QuCisKK+umrOuIheyKpCDsu6TrhJAg64K067aA7JeQ7IScLCBJL08g64qUIOyWtOuWu+qyjCDslaHshLjsiqTrk6TsnYQg7KCB7KCI7Z6IIOyInOywqOyggeydtOqyjCDrp4zrk6Qg7IiYIOyeiOuKlOyngAor7JWM6rOgIOyeiOuKlCwgLSBpbmIoKSDrgpggd3JpdGVsKCkg6rO8IOqwmeydgCAtIOyggeygiO2VnCDslaHshLjsiqQg66Oo7Yu07J2EIO2Gte2VtCDsnbTro6jslrTsoLjslbzrp4wKK+2VqeuLiOuLpC4gIOydtOqyg+uTpOydgCDrjIDrtoDrtoTsnZgg6rK97Jqw7JeQ64qUIOuqheyLnOyggSDrqZTrqqjrpqwg67Cw66as7Ja0IOyZgCDtlajqu5gg7IKs7Jqp65CgIO2VhOyalOqwgAor7JeG7Iq164uI64uk66eMLCDri6TsnYzsnZgg65GQ6rCA7KeAIOyDge2ZqeyXkOyEnOuKlCDrqoXsi5zsoIEg66mU66qo66asIOuwsOumrOyWtOqwgCDtlYTsmpTtlaAg7IiYIOyeiOyKteuLiOuLpDoKKworICgxKSDsnbzrtoAg7Iuc7Iqk7YWc7JeQ7IScIEkvTyDsiqTthqDslrTripQg66qo65OgIENQVSDsl5Ag7J286rSA65CY6rKMIOyInOyEnCDrp57strDsp4Dsp4Ag7JWK64qU642wLAorICAgICDrlLDrnbzshJwgX+uqqOuToF8g7J2867CY7KCB7J24IOuTnOudvOydtOuyhOuTpOyXkCDrnb3snbQg7IKs7Jqp65CY7Ja07JW866eMIO2VmOqzoCDsnbQg7YGs66as7Yuw7LusCisgICAgIOyEueyFmOydhCDruaDsoLjrgpjsmKTquLAg7KCE7JeQIG1taW93YigpIOqwgCDqvK0g7Zi47Lac65CY7Ja07JW8IO2VqeuLiOuLpC4KKworICgyKSDrp4zslb0g7JWh7IS47IqkIO2VqOyImOuTpOydtCDsmYTtmZTrkJwg66mU66qo66asIOyVoeyEuOyKpCDsho3shLHsnYQg6rCW64qUIEkvTyDrqZTrqqjrpqwg7JyI64+E7Jqw66W8CisgICAgIOyCrOyaqe2VnOuLpOuptCwg7Iic7ISc66W8IOqwleygnO2VmOq4sCDsnITtlbTshKAgX21hbmRhdG9yeV8g66mU66qo66asIOuwsOumrOyWtOqwgCDtlYTsmpTtlanri4jri6QuCisKK+uNlCDrp47snYAg7KCV67O066W8IOychO2VtOyEoCBEb2N1bWVudGF0aW9uL0RvY0Jvb2svZGV2aWNlaW9ib29rLnRtcGwg7J2EIOywuOqzoO2VmOyLreyLnOyYpC4KKworCivsnbjthLDrn73tirgKKy0tLS0tLS0tCisKK+uTnOudvOydtOuyhOuKlCDsnpDsi6DsnZgg7J247YSw65+97Yq4IOyEnOu5hOyKpCDro6jti7Tsl5Ag7J2Y7ZW0IOyduO2EsOufve2KuCDri7ntlaAg7IiYIOyeiOq4sCDrlYzrrLjsl5AKK+uTnOudvOydtOuyhOydmCDsnbQg65GQIOu2gOu2hOydgCDshJzroZzsnZgg65SU67CU7J207IqkIOygnOyWtCDrmJDripQg7JWh7IS47IqkIOu2gOu2hOqzvCDsg4HtmLgg6rCE7ISt7ZWgIOyImAor7J6I7Iq164uI64ukLgorCivsiqTsiqTroZzsl5Dqsowg7J247YSw65+97Yq4IOuLue2VmOuKlCDqsbgg67aI6rCA64ql7ZWY6rKMIO2VmOqzoCwg65Oc65287J2067KE7J2YIO2BrOumrO2LsOy7rO2VnAor7Jik7Y2866CI7J207IWY65Ok7J2EIOuqqOuRkCDsnbjthLDrn73tirjqsIAg67aI6rCA64ql7ZWY6rKMIOuQnCDsmIHsl63sl5Ag7KeR7Ja064Sj6rGw64KYIO2VmOuKlCDrsKnrspUgKOudveydmAor7ZWcIO2Yle2DnCkg7Jy866GcIOydtOufsCDsg4HtmLgg6rCE7ISt7J2EIC0g7LWc7IaM7ZWcIOu2gOu2hOyggeycvOuhnOudvOuPhCAtIOykhOydvCDsiJgg7J6I7Iq164uI64ukLgor65Oc65287J2067KE7J2YIOyduO2EsOufve2KuCDro6jti7TsnbQg7Iuk7ZaJIOykkeyduCDrj5nslYgsIO2VtOuLuSDrk5zrnbzsnbTrsoTsnZgg7L2U7Ja064qUIOqwmeydgCBDUFUg7JeQ7IScCivsiJjtlonrkJjsp4Ag7JWK7J2EIOqyg+ydtOupsCwg7ZiE7J6s7J2YIOyduO2EsOufve2KuOqwgCDsspjrpqzrkJjripQg7KSR7JeQ64qUIOuYkOuLpOyLnCDsnbjthLDrn73tirjqsIAKK+ydvOyWtOuCmOyngCDrqrvtlZjrj4TroZ0g65CY7Ja0IOyeiOycvOuLiCDsnbjthLDrn73tirgg7ZW465Ok65+s64qUIOq3uOyXkCDrjIDtlbTshJzripQg65297J2EIOyeoeyngCDslYrslYTrj4QKK+uQqeuLiOuLpC4KKwor7ZWY7KeA66eMLCDslrTrk5zroIjsiqQg66CI7KeA7Iqk7YSw7JmAIOuNsOydtO2EsCDroIjsp4DsiqTthLDrpbwg6rCW64qUIOydtOuNlOuEtyDsubTrk5zrpbwg64uk66Oo64qUCivrk5zrnbzsnbTrsoTrpbwg7IOd6rCB7ZW0IOu0heyLnOuLpC4gIOunjOyVvSDsnbQg65Oc65287J2067KE7J2YIOy9lOyWtOqwgCDsnbjthLDrn73tirjrpbwg67mE7Zmc7ISx7ZmU7Iuc7YKoCivssYTroZwg7J20642U64S3IOy5tOuTnOyZgCDrjIDtmZTtlZjqs6Ag65Oc65287J2067KE7J2YIOyduO2EsOufve2KuCDtlbjrk6Trn6zqsIAg7Zi47Lac65CY7JeI64uk66m0OgorCisJTE9DQUwgSVJRIERJU0FCTEUKKwl3cml0ZXcoQUREUiwgMyk7CisJd3JpdGV3KERBVEEsIHkpOworCUxPQ0FMIElSUSBFTkFCTEUKKwk8aW50ZXJydXB0PgorCXdyaXRldyhBRERSLCA0KTsKKwlxID0gcmVhZHcoREFUQSk7CisJPC9pbnRlcnJ1cHQ+CisKK+unjOyVvSDsiJzshJwg6rec7LmZ7J20IOy2qeu2hO2eiCDsmYTtmZTrkJjslrQg7J6I64uk66m0IOuNsOydtO2EsCDroIjsp4DsiqTthLDsl5DsnZgg7Iqk7Yag7Ja064qUIOyWtOuTnOugiOyKpAor66CI7KeA7Iqk7YSw7JeQIOuRkOuyiOynuOuhnCDtlontlbTsp4DripQg7Iqk7Yag7Ja0IOuSpOyXkCDsnbzslrTrgqAg7IiY64+EIOyeiOyKteuLiOuLpDoKKworCVNUT1JFICpBRERSID0gMywgU1RPUkUgKkFERFIgPSA0LCBTVE9SRSAqREFUQSA9IHksIHEgPSBMT0FEICpEQVRBCisKKwor66eM7JW9IOyInOyEnCDqt5zsuZnsnbQg7Lap67aE7Z6IIOyZhO2ZlOuQmOyWtCDsnojqs6Ag66y17Iuc7KCB7Jy866Gc65OgIOuqheyLnOyggeycvOuhnOuToCDrsLDrpqzslrTqsIAKK+yCrOyaqeuQmOyngCDslYrslZjri6TrqbQg7J247YSw65+97Yq4IOu5hO2ZnOyEse2ZlCDshLnshZjsl5DshJwg7J287Ja064KcIOyVoeyEuOyKpOqwgCDrsJTquaXsnLzroZwg7IOI7Ja07IScCivsnbjthLDrn73tirgg64K07JeQ7IScIOydvOyWtOuCnCDslaHshLjsiqTsmYAg7ISe7J28IOyImCDsnojri6Tqs6AgLSDqt7jrpqzqs6Ag6re4IOuwmOuMgOuPhCAtIOqwgOygle2VtOyVvOunjAor7ZWp64uI64ukLgorCivqt7jrn7Ag7JiB7JetIOyViOyXkOyEnCDsnbzslrTrgpjripQgSS9PIOyVoeyEuOyKpOuTpOydgCDsl4TqsqntlZwg7Iic7IScIOq3nOy5meydmCBJL08g66CI7KeA7Iqk7YSw7JeQCivrrLXsi5zsoIEgSS9PIOuwsOumrOyWtOulvCDtmJXshLHtlZjripQg64+Z6riw7KCBIChzeW5jaHJvbm91cykg66Gc65OcIOyYpO2NvOugiOydtOyFmOydhCDtj6ztlajtlZjquLAKK+uVjOusuOyXkCDsnbzrsJjsoIHsnLzroZzripQg7J2065+w6rKMIOusuOygnOqwgCDrkJjsp4Ag7JWK7Iq164uI64ukLiAg66eM7JW9IOydtOqxuOuhnOuKlCDstqnrtoTsuZgg7JWK64uk66m0CittbWlvd2IoKSDqsIAg66qF7Iuc7KCB7Jy866GcIOyCrOyaqeuQoCDtlYTsmpTqsIAg7J6I7Iq164uI64ukLgorCisKK+2VmOuCmOydmCDsnbjthLDrn73tirgg66Oo7Yu06rO8IOuzhOuPhOydmCBDUFUg7JeQ7IScIOyImO2WieykkeydtOupsCDshJzroZwg7Ya17Iug7J2EIO2VmOuKlCDrkZAg66Oo7Yu0CivsgqzsnbTsl5Drj4Qg67mE7Iq37ZWcIOyDge2ZqeydtCDsnbzslrTrgqAg7IiYIOyeiOyKteuLiOuLpC4gIOunjOyVvSDqt7jrn7Ag6rK97Jqw6rCAIOuwnOyDne2VoCDqsIDriqXshLHsnbQKK+yeiOuLpOuptCwg7Iic7ISc66W8IOuztOyepe2VmOq4sCDsnITtlbQg7J247YSw65+97Yq4IOu5hO2ZnOyEse2ZlCDrnb3snbQg7IKs7Jqp65CY7Ja07KC47JW866eMIO2VqeuLiOuLpC4KKworCis9PT09PT09PT09PT09PT09PT09PT09Civsu6TrhJAgSS9PIOuwsOumrOyWtOydmCDtmqjqs7wKKz09PT09PT09PT09PT09PT09PT09PT0KKworSS9PIOuplOuqqOumrOyXkCDslaHshLjsiqTtlaAg65WMLCDrk5zrnbzsnbTrsoTripQg7KCB7KCI7ZWcIOyVoeyEuOyKpCDtlajsiJjrpbwg7IKs7Jqp7ZW07JW8IO2VqeuLiOuLpDoKKworICgqKSBpblgoKSwgb3V0WCgpOgorCisgICAgIOydtOqyg+uTpOydgCDrqZTrqqjrpqwg6rO16rCE67O064uk64qUIEkvTyDqs7XqsITsl5Ag7J207JW86riw66W8IO2VmOugpOuKlCDsnZjrj4TroZwKKyAgICAg66eM65Ok7Ja07KGM7Iq164uI64uk66eMLCDqt7jqsbQg6riw67O47KCB7Jy866GcIENQVSDrp4jri6Qg64uk66W4IOy7qOyFieyeheuLiOuLpC4gIGkzODYg6rO8CisgICAgIHg4Nl82NCDtlITroZzshLjshJzrk6TsnYAg7Yq567OE7ZWcIEkvTyDqs7XqsIQg7JWh7IS47IqkIOyCrOydtO2BtOqzvCDrqoXroLnslrTrpbwg7Iuk7KCc66GcIOqwgOyngOqzoAorICAgICDsnojsp4Drp4wsIOuLpOuluCDrp47snYAgQ1BVIOuTpOyXkOuKlCDqt7jrn7Ag7Luo7IWJ7J20IOyhtOyerO2VmOyngCDslYrsirXri4jri6QuCisKKyAgICAg64uk66W4IOqyg+uTpCDspJHsl5DshJzrj4QgUENJIOuyhOyKpOqwgCBJL08g6rO16rCEIOy7qOyFieydhCDsoJXsnZjtlZjripTrjbAsIOydtOuKlCAtIGkzODYg6rO8CisgICAgIHg4Nl82NCDqsJnsnYAgQ1BVIOyXkOyEnCAtIENQVSDsnZggSS9PIOqzteqwhCDsu6jshYnsnLzroZwg7Im96rKMIOunpOy5mOuQqeuLiOuLpC4gIO2VmOyngOunjCwKKyAgICAg64yA7LK07ZWgIEkvTyDqs7XqsITsnbQg7JeG64qUIENQVSDsl5DshJzripQgQ1BVIOydmCDrqZTrqqjrpqwg66e17J2YIOqwgOyDgSBJL08g6rO16rCE7Jy866GcCisgICAgIOunpO2VkeuQoCDsiJjrj4Qg7J6I7Iq164uI64ukLgorCisgICAgIOydtCDqs7XqsITsnLzroZzsnZgg7JWh7IS47Iqk64qUIChpMzg2IOuTseyXkOyEnOuKlCkg7JmE7KCE7ZWY6rKMIOuPmeq4sO2ZlCDrkKnri4jri6Trp4wsIOykkeqwhOydmAorICAgICAoUENJIO2YuOyKpO2KuCDruIzrpqzsp4DsmYAg6rCZ7J2AKSDruIzrpqzsp4Drk6TsnYAg7J2066W8IOyZhOyghO2eiCDrs7TsnqXtlZjsp4Qg7JWK7J2E7IiY64+ECisgICAgIOyeiOyKteuLiOuLpC4KKworICAgICDsnbTqsoPrk6TsnZgg7IOB7Zi46rCE7J2YIOyInOyEnOuKlCDsmYTsoITtlZjqsowg67O07J6l65Cp64uI64ukLgorCisgICAgIOuLpOuluCDtg4DsnoXsnZgg66mU66qo66asIOyYpO2NvOugiOydtOyFmCwgSS9PIOyYpO2NvOugiOydtOyFmOyXkCDrjIDtlZwg7Iic7ISc64qUIOyZhOyghO2VmOqyjAorICAgICDrs7TsnqXrkJjsp4DripQg7JWK7Iq164uI64ukLgorCisgKCopIHJlYWRYKCksIHdyaXRlWCgpOgorCisgICAgIOydtOqyg+uTpOydtCDsiJjtlokg7JqU7LKt65CY64qUIENQVSDsl5DshJwg7ISc66Gc7JeQ6rKMIOyZhOyghO2eiCDsiJzshJzqsIAg66ee7Law7KeA6rOgIOuPheumveyggeycvOuhnAorICAgICDsiJjtlonrkJjripTsp4Dsl5Ag64yA7ZWcIOuztOyepSDsl6zrtoDripQg7J2065Ok7J20IOyVoeyEuOyKpCDtlZjripQg66mU66qo66asIOyciOuPhOyasOyXkCDsoJXsnZjrkJwKKyAgICAg7Yq57ISx7JeQIOydmO2VtCDqsrDsoJXrkKnri4jri6QuICDsmIjrpbwg65Ok7Ja0LCDstZzsi6DsnZggaTM4NiDslYTtgqTthY3ss5Ag66i47Iug7JeQ7ISc64qUIE1UUlIKKyAgICAg66CI7KeA7Iqk7YSw66GcIOydtCDtirnshLHsnbQg7KGw7KCV65Cp64uI64ukLgorCisgICAgIOydvOuwmOyggeycvOuhnOuKlCwg7ZSE66as7Y6Y7LmYIChwcmVmZXRjaCkg6rCA64ql7ZWcIOuUlOuwlOydtOyKpOulvCDslaHshLjsiqQg7ZWY64qU6rKMCisgICAgIOyVhOuLiOudvOuptCwg7J206rKD65Ok7J2AIOyZhOyghO2eiCDsiJzshJzqsIAg66ee7Law7KeA6rOgIOqysO2VqeuQmOyngCDslYrqsowg67O07J6l65CgIOqygeuLiOuLpC4KKworICAgICDtlZjsp4Drp4wsIChQQ0kg67iM66as7KeA7JmAIOqwmeydgCkg7KSR6rCE7J2YIO2VmOuTnOybqOyWtOuKlCDsnpDsi6DsnbQg7JuQ7ZWc64uk66m0IOynke2WieydhAorICAgICDsl7DquLDsi5ztgqwg7IiYIOyeiOyKteuLiOuLpDsg7Iqk7Yag7Ja0IOuqheugueydhCDsi6TsoJzroZwg7ZWY65Oc7Juo7Ja066GcIOuCtOugpOuztOuCtOq4sChmbHVzaCkKKyAgICAg7JyE7ZW07ISc64qUIOqwmeydgCDsnITsuZjroZzrtoDthLAg66Gc65Oc66W8IO2VmOuKlCDrsKnrspXsnbQg7J6I7Iq164uI64uk66eMWypdLCBQQ0kg7J2YIOqyveyasOuKlAorICAgICDqsJnsnYAg65SU67CU7J207Iqk64KYIO2ZmOqyvSDqtazshLEg7JiB7Jet7JeQ7ISc7J2YIOuhnOuTnOunjOycvOuhnOuPhCDstqnrtoTtlaAg6rKB64uI64ukLgorCisgICAgIFsqXSDso7zsnZghIOyTsOyXrOynhCDqsoPqs7wg6rCZ7J2AIOychOy5mOuhnOu2gO2EsOydmCDroZzrk5zrpbwg7Iuc64+E7ZWY64qUIOqyg+ydgCDsmKTrj5nsnpHsnYQKKwkg7J287Jy87YKsIOyImOuPhCDsnojsirXri4jri6QgLSDsmIjroZwgMTY2NTAgUngvVHgg7Iuc66as7Ja8IOugiOyngOyKpO2EsOulvCDsg53qsIHtlbQKKwkg67O07IS47JqULgorCisgICAgIO2UhOumrO2OmOy5mCDqsIDriqXtlZwgSS9PIOuplOuqqOumrOqwgCDsgqzsmqnrkJjrqbQsIOyKpO2GoOyWtCDrqoXroLnrk6TsnbQg7Iic7ISc66W8IOyngO2CpOuPhOuhnQorICAgICDtlZjquLAg7JyE7ZW0IG1taW93YigpIOuwsOumrOyWtOqwgCDtlYTsmpTtlaAg7IiYIOyeiOyKteuLiOuLpC4KKworICAgICBQQ0kg7Yq4656c7J6t7IWYIOyCrOydtOydmCDsg4HtmLjsnpHsmqnsl5Ag64yA7ZW0IOuNlCDrp47snYAg7KCV67O066W8IOychO2VtOyEoCBQQ0kg66qF7IS47ISc66W8CisgICAgIOywuOqzoO2VmOyLnOq4sCDrsJTrno3ri4jri6QuCisKKyAoKikgcmVhZFhfcmVsYXhlZCgpLCB3cml0ZVhfcmVsYXhlZCgpCisKKyAgICAg7J206rKD65Ok7J2AIHJlYWRYKCkg7JmAIHdyaXRlWCgpIOuekSDruYTsirftlZjsp4Drp4wsIOuNlCDsmYTtmZTrkJwg66mU66qo66asIOyInOyEnCDrs7TsnqXsnYQKKyAgICAg7KCc6rO17ZWp64uI64ukLiAg6rWs7LK07KCB7Jy866GcLCDsnbTqsoPrk6TsnYAg7J2867CY7KCBIOuplOuqqOumrCDslaHshLjsiqQgKOyYiDogRE1BIOuyhO2NvCkg7JeQ64+ECisgICAgIExPQ0sg7J2064KYIFVOTE9DSyDsmKTtjbzroIjsnbTshZjrk6Tsl5Drj4Qg7Iic7ISc66W8IOuztOyepe2VmOyngCDslYrsirXri4jri6QuICBMT0NLIOydtOuCmAorICAgICBVTkxPQ0sg7Jik7Y2866CI7J207IWY65Ok7JeQIOunnuy2sOyngOuKlCDsiJzshJzqsIAg7ZWE7JqU7ZWY64uk66m0LCBtbWlvd2IoKSDrsLDrpqzslrTqsIAg7IKs7Jqp65CgCisgICAgIOyImCDsnojsirXri4jri6QuICDqsJnsnYAg7KO867OAIOyepey5mOyXkOydmCDsmYTtmZTrkJwg7JWh7IS47Iqk64G866as64qUIOyInOyEnOqwgCDsp4DsvJzsp5DsnYQg7JWM7JWECisgICAgIOuRkOyLnOq4sCDrsJTrno3ri4jri6QuCisKKyAoKikgaW9yZWFkWCgpLCBpb3dyaXRlWCgpCisKKyAgICAg7J206rKD65Ok7J2AIGluWCgpL291dFgoKSDrgpggcmVhZFgoKS93cml0ZVgoKSDsspjrn7wg7Iuk7KCc66GcIOyImO2Wie2VmOuKlCDslaHshLjsiqTsnZgKKyAgICAg7KKF66WY7JeQIOuUsOudvCDsoIHsoIjtlZjqsowg7IiY7ZaJ65CgIOqyg+yeheuLiOuLpC4KKworCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQor6rCA7KCV65CY64qUIOqwgOyepSDsmYTtmZTrkJwg7Iuk7ZaJIOyInOyEnCDrqqjrjbgKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK+y7qOyFieyggeycvOuhnCBDUFUg64qUIOyjvOyWtOynhCDtlITroZzqt7jrnqjsl5Ag64yA7ZW0IO2UhOuhnOq3uOueqCDqt7gg7J6Q7LK07JeQ64qUIOyduOqzvOyEsSAocHJvZ3JhbQorY2F1c2FsaXR5KSDsnYQg7KeA7YKk64qUIOqyg+yymOufvCDrs7TsnbTqsowg7ZWY7KeA66eMIOydvOuwmOyggeycvOuhnOuKlCDsiJzshJzrpbwg6rGw7J2YIOyngOy8nOyjvOyngAor7JWK64qU64uk6rOgIOqwgOygleuQmOyWtOyVvOunjCDtlanri4jri6QuICAoaTM4NiDsnbTrgpggeDg2XzY0IOqwmeydgCkg7J2867aAIENQVSDrk6TsnYAg7L2U65OcCivsnqzrsLDsuZjsl5AgKHBvd2VycGMg64KYIGZydiDsmYAg6rCZ7J2AKSDri6Trpbgg6rKD65Ok7JeQIOu5hO2VtCDqsJXtlZwg7KCc7JW97J2EIOqwluyngOunjCwg7JWE7YKk7YWN7LOQCivsooXsho3soIEg7L2U65OcIOydtOyZuOydmCDsvZTrk5zsl5DshJzripQg7Iic7ISc7JeQIOuMgO2VnCDsoJzslb3snbQg6rCA7J6lIOyZhO2ZlOuQnCDqsr3smrAgKERFQyBBbHBoYSkKK+ulvCDqsIDsoJXtlbTslbwg7ZWp64uI64ukLgorCivsnbQg66eQ7J2ALCBDUFUg7JeQ6rKMIOyjvOyWtOyngOuKlCDsnbjsiqTtirjrn63shZgg7Iqk7Yq466a8IOuCtOydmCDtlZwg7J247Iqk7Yq465+t7IWY7J20IOyVnuydmAor7J247Iqk7Yq465+t7IWY7JeQIOyiheyGjeyggeydtOudvOuptCDslZ7snZgg7J247Iqk7Yq465+t7IWY7J2AIOuSpOydmCDsooXsho3soIEg7J247Iqk7Yq465+t7IWY7J20IOyLpO2WieuQmOq4sAor7KCE7JeQIOyZhOujjFsqXeuQoCDsiJgg7J6I7Ja07JW8IO2VnOuLpOuKlCDsoJzslb0gKOuLrOumrCDrp5DtlbTshJwsIOyduOqzvOyEseydtCDsp4DsvJzsp4DripQg6rKD7Jy866GcCivrs7TsnbTqsowg7ZWoKSDsmbjsl5DripQg7J6Q7Iug7J20IOybkO2VmOuKlCDsiJzshJzrjIDroZwgLSDsi6zsp4DslrQg67OR66Cs7KCB7Jy866Gc64+EIC0g6re4IOyKpO2KuOumvOydhAor7Iuk7ZaJ7ZWgIOyImCDsnojsnYzsnYQg7J2Y66+47ZWp64uI64ukCisKKyBbKl0g7J2867aAIOyduOyKpO2KuOufreyFmOydgCDtlZjrgpgg7J207IOB7J2YIOyYge2WpSAtIOyhsOqxtCDsvZTrk5zrpbwg67CU6r6864uk642Y7KeALCDroIjsp4DsiqTthLDrgpgKKyAgICAg66mU66qo66as66W8IOuwlOq+vOuLpOuNmOyngCAtIOydhCDrp4zrk6TslrTrgrTrqbAsIOuLpOuluCDsnbjsiqTtirjrn63shZjsnYAg64uk66W4IO2aqOqzvOyXkAorICAgICDsooXsho3soIHsnbwg7IiYIOyeiOyKteuLiOuLpC4KKworQ1BVIOuKlCDstZzsooXsoIHsnLzroZwg7JWE66y0IO2aqOqzvOuPhCDrp4zrk6Tsp4Ag7JWK64qUIOyduOyKpO2KuOufreyFmCDsi5ztgIDsiqTripQg7JeG7JWg67KE66a0IOyImOuPhAor7J6I7Iq164uI64ukLiAg7JiI66W8IOuTpOyWtCwg66eM7JW9IOuRkOqwnOydmCDsl7Dsho3rkJjripQg7J247Iqk7Yq465+t7IWY7J20IOuRmCDri6Qg6rCZ7J2AIOugiOyngOyKpO2EsOyXkAor7KeB7KCR7KCB7J24IOqwkiAoaW1tZWRpYXRlIHZhbHVlKSDsnYQg7KeR7Ja064Sj64qU64uk66m0LCDssqvrsojsp7gg7J247Iqk7Yq465+t7IWY7J2AIOuyhOugpOyniCDsiJjrj4QKK+yeiOyKteuLiOuLpC4KKworCivruYTsirftlZjqsowsIOy7tO2MjOydvOufrCDsl63si5wg7ZSE66Gc6re4656o7J2YIOyduOqzvOyEseunjCDsp4DsvJzspIDri6TrqbQg7J247Iqk7Yq465+t7IWYIOyKpO2KuOumvOydhAor7J6Q7Iug7J20IOuztOq4sOyXkCDsmKzrsJTrpbTri6Qg7IOd6rCB65CY64qU64yA66GcIOyerOuwsOy5mCDtlaAg7IiYIOyeiOyKteuLiOuLpC4KKworCis9PT09PT09PT09PT09PT0KK0NQVSDsupDsi5zsnZgg7JiB7ZalCis9PT09PT09PT09PT09PT0KKwor7LqQ7Iuc65CcIOuplOuqqOumrCDsmKTtjbzroIjsnbTshZjrk6TsnbQg7Iuc7Iqk7YWcIOyghOyytOyXkCDslrTrlrvqsowg7J247KeA65CY64qU7KeA64qUIENQVSDsmYAg66mU66qo66asCivsgqzsnbTsl5Ag7KG07J6s7ZWY64qUIOy6kOyLnOuTpCwg6re466as6rOgIOyLnOyKpO2FnCDsg4Htg5zsnZgg7J286rSA7ISx7J2EIOq0gOumrO2VmOuKlCDrqZTrqqjrpqwg7J286rSA7ISxCivsi5zsiqTthZzsl5Ag7IOB64u5IOu2gOu2hCDsmIHtlqXsnYQg67Cb7Iq164uI64ukLgorCivtlZwgQ1BVIOqwgCDsi5zsiqTthZzsnZgg64uk66W4IOu2gOu2hOuTpOqzvCDsupDsi5zrpbwg7Ya17ZW0IOyDge2YuOyekeyaqe2VnOuLpOuptCwg66mU66qo66asIOyLnOyKpO2FnOydgAorQ1BVIOydmCDsupDsi5zrk6TsnYQg7Y+s7ZWo7ZW07JW8IO2VmOupsCwgQ1BVIOyZgCBDUFUg7J6Q7Iug7J2YIOy6kOyLnCDsgqzsnbTsl5DshJzsnZgg64+Z7J6R7J2EIOychO2VnAor66mU66qo66asIOuwsOumrOyWtOulvCDqsIDsoLjslbwg7ZWp64uI64ukLiAo66mU66qo66asIOuwsOumrOyWtOuKlCDrhbzrpqzsoIHsnLzroZzripQg64uk7J2MIOq3uOumvOydmAor7KCQ7ISg7JeQ7IScIOuPmeyeke2VqeuLiOuLpCk6CisKKwkgICAgPC0tLSBDUFUgLS0tPiAgICAgICAgIDogICAgICAgPC0tLS0tLS0tLS0tIE1lbW9yeSAtLS0tLS0tLS0tLT4KKwkgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKwkrLS0tLS0tLS0rICAgICstLS0tLS0tLSsgIDogICArLS0tLS0tLS0rICAgICstLS0tLS0tLS0tLSsKKwl8ICAgICAgICB8ICAgIHwgICAgICAgIHwgIDogICB8ICAgICAgICB8ICAgIHwgICAgICAgICAgIHwgICAgKy0tLS0tLS0tKworCXwgIENQVSAgIHwgICAgfCBNZW1vcnkgfCAgOiAgIHwgQ1BVICAgIHwgICAgfCAgICAgICAgICAgfCAgICB8ICAgICAgICB8CisJfCAgQ29yZSAgfC0tLT58IEFjY2VzcyB8LS0tLS0+fCBDYWNoZSAgfDwtLT58ICAgICAgICAgICB8ICAgIHwgICAgICAgIHwKKwl8ICAgICAgICB8ICAgIHwgUXVldWUgIHwgIDogICB8ICAgICAgICB8ICAgIHwgICAgICAgICAgIHwtLS0+fCBNZW1vcnkgfAorCXwgICAgICAgIHwgICAgfCAgICAgICAgfCAgOiAgIHwgICAgICAgIHwgICAgfCAgICAgICAgICAgfCAgICB8ICAgICAgICB8CisJKy0tLS0tLS0tKyAgICArLS0tLS0tLS0rICA6ICAgKy0tLS0tLS0tKyAgICB8ICAgICAgICAgICB8ICAgIHwgICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgICAgICAgICAgIHwgQ2FjaGUgICAgIHwgICAgKy0tLS0tLS0tKworCSAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgfCBDb2hlcmVuY3kgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgfCBNZWNoYW5pc20gfCAgICArLS0tLS0tLS0rCisJKy0tLS0tLS0tKyAgICArLS0tLS0tLS0rICA6ICAgKy0tLS0tLS0tKyAgICB8ICAgICAgICAgICB8ICAgIHwJICAgICAgfAorCXwgICAgICAgIHwgICAgfCAgICAgICAgfCAgOiAgIHwgICAgICAgIHwgICAgfCAgICAgICAgICAgfCAgICB8ICAgICAgICB8CisJfCAgQ1BVICAgfCAgICB8IE1lbW9yeSB8ICA6ICAgfCBDUFUgICAgfCAgICB8ICAgICAgICAgICB8LS0tPnwgRGV2aWNlIHwKKwl8ICBDb3JlICB8LS0tPnwgQWNjZXNzIHwtLS0tLT58IENhY2hlICB8PC0tPnwgICAgICAgICAgIHwgICAgfCAgICAgICAgfAorCXwgICAgICAgIHwgICAgfCBRdWV1ZSAgfCAgOiAgIHwgICAgICAgIHwgICAgfCAgICAgICAgICAgfCAgICB8ICAgICAgICB8CisJfCAgICAgICAgfCAgICB8ICAgICAgICB8ICA6ICAgfCAgICAgICAgfCAgICB8ICAgICAgICAgICB8ICAgICstLS0tLS0tLSsKKwkrLS0tLS0tLS0rICAgICstLS0tLS0tLSsgIDogICArLS0tLS0tLS0rICAgICstLS0tLS0tLS0tLSsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKwkgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKwor7Yq57KCVIOuhnOuTnOuCmCDsiqTthqDslrTripQg7ZW064u5IOyYpO2NvOugiOydtOyFmOydhCDsmpTssq3tlZwgQ1BVIOydmCDsupDsi5wg64K07JeQ7IScIOuPmeyekeydhCDsmYTro4ztlaAKK+yImOuPhCDsnojquLAg65WM66y47JeQIO2VtOuLuSBDUFUg7J2YIOuwlOq5peyXkOuKlCDrs7TsnbTsp4Ag7JWK7J2EIOyImCDsnojsp4Drp4wsIOuLpOuluCBDUFUg6rCAIOq0gOyLrOydhAor6rCW64qU64uk66m0IOy6kOyLnCDsnbzqtIDshLEg66mU7Luk64uI7KaY7J20IO2VtOuLuSDsupDsi5zrnbzsnbjsnYQg7ZW064u5IENQVSDsl5Dqsowg7KCE64us7ZWY6rOgLCDtlbTri7kKK+uplOuqqOumrCDsmIHsl63sl5Ag64yA7ZWcIOyYpO2NvOugiOydtOyFmOydtCDrsJzsg53tlaAg65WM66eI64ukIOq3uCDsmIHtlqXsnYQg7KCE7YyM7Iuc7YKk6riwIOuVjOusuOyXkCwg7ZW064u5CivsmKTtjbzroIjsnbTshZjsnYAg66mU66qo66as7JeQIOyLpOygnOuhnCDslaHshLjsiqTrpbwg7ZWc6rKD7LKY65+8IOuCmO2DgOuCoCDqsoPsnoXri4jri6QuCisKK0NQVSDsvZTslrTripQg7ZSE66Gc6re4656o7J2YIOyduOqzvOyEseydtCDsnKDsp4DrkJzri6Tqs6Drp4wg7Jes6rKo7KeE64uk66m0IOyduOyKpO2KuOufreyFmOuTpOydhCDslrTrlqQKK+yInOyEnOuhnOuToCDsnqzrsLDsuZjtlbTshJwg7IiY7ZaJ7ZWgIOyImCDsnojsirXri4jri6QuICDsnbzrtoAg7J247Iqk7Yq465+t7IWY65Ok7J2AIOuhnOuTnOuCmCDsiqTthqDslrQKK+yYpO2NvOugiOydtOyFmOydhCDrp4zrk5zripTrjbAg7J20IOyYpO2NvOugiOydtOyFmOuTpOydgCDsnbTtm4Qg7IiY7ZaJ65CgIOuplOuqqOumrCDslaHshLjsiqQg7YGQ7JeQIOuTpOyWtOqwgOqyjAor65Cp64uI64ukLiAg7L2U7Ja064qUIOydtCDsmKTtjbzroIjsnbTshZjrk6TsnYQg7ZW064u5IO2BkOyXkCDslrTrlqQg7Iic7ISc66Gc65OgIOybkO2VmOuKlOuMgOuhnCDrhKPsnYQg7IiYCivsnojqs6AsIOuLpOuluCDsnbjsiqTtirjrn63shZjsnZgg7JmE66OM66W8IOq4sOuLpOumrOuPhOuhnSDqsJXsoJzrkJjquLAg7KCE6rmM7KeA64qUIOyImO2WieydhCDqs4Tsho3tlanri4jri6QuCisKK+uplOuqqOumrCDrsLDrpqzslrTqsIAg7ZWY64qUIOydvOydgCBDUFUg7Kq97JeQ7IScIOuplOuqqOumrCDsqr3snLzroZwg64SY7Ja06rCA64qUIOyVoeyEuOyKpOuTpOydmCDsiJzshJwsCivqt7jrpqzqs6Ag6re4IOyVoeyEuOyKpOydmCDqsrDqs7zqsIAg7Iuc7Iqk7YWc7J2YIOuLpOuluCDqtIDssLDsnpDrk6Tsl5Dqsowg7J247KeA65CY64qUIOyInOyEnOulvCDsoJzslrTtlZjripQKK+qyg+yeheuLiOuLpC4KKworWyFdIENQVSDrk6TsnYAg7ZWt7IOBIOq3uOuTpCDsnpDsi6DsnZgg66Gc65Oc7JmAIOyKpO2GoOyWtOuKlCDtlITroZzqt7jrnqgg7Iic7ISc64yA66GcIOydvOyWtOuCnCDqsoPsnLzroZwKK+uztOq4sCDrlYzrrLjsl5AsIOyjvOyWtOynhCBDUFUg64K07JeQ7ISc64qUIOuplOuqqOumrCDrsLDrpqzslrTrpbwg7IKs7Jqp7ZWgIO2VhOyalOqwgCBf7JeG7Iq164uI64ukXy4KKworWyFdIE1NSU8g64KYIOuLpOuluCDrlJTrsJTsnbTsiqQg7JWh7IS47Iqk65Ok7J2AIOy6kOyLnCDsi5zsiqTthZzsnYQg7Jqw7ZqM7ZWgIOyImOuPhCDsnojsirXri4jri6QuICDsmrDtmowKK+yXrOu2gOuKlCDrlJTrsJTsnbTsiqTqsIAg7JWh7IS47IqkIOuQmOuKlCDrqZTrqqjrpqwg7JyI64+E7Jqw7J2YIO2KueyEseyXkCDsnZjtlbQg6rKw7KCV65CgIOyImOuPhCDsnojqs6AsIENQVQor6rCAIOqwgOyngOqzoCDsnojsnYQg7IiYIOyeiOuKlCDtirnsiJjtlZwg65SU67CU7J207IqkIO2GteyLoCDsnbjsiqTtirjrn63shZjsnZgg7IKs7Jqp7JeQIOydmO2VtOyEnCDqsrDsoJXrkKAKK+yImOuPhCDsnojsirXri4jri6QuCisKKwor7LqQ7IucIOydvOq0gOyEsQorLS0tLS0tLS0tLS0KKwor7ZWY7KeA66eMIOyCtuydgCDslZ7sl5DshJwg7J207JW86riw7ZWcIOqyg+yymOufvCDri6jsiJztlZjsp4Ag7JWK7Iq164uI64ukOiDsupDsi5zrk6TsnYAg7J286rSA7KCB7J28IOqyg+ycvOuhnAor6riw64yA65CY7KeA66eMLCDqt7gg7J286rSA7ISx7J20IOyInOyEnOyXkOuPhCDsoIHsmqnrkKAg6rGw652864qUIOuztOyepeydgCDsl4bsirXri4jri6QuICDtlZwgQ1BVIOyXkOyEnAor66eM65Ok7Ja07KeEIOuzgOqyvSDsgqztla3snYAg7LWc7KKF7KCB7Jy866Gc64qUIOyLnOyKpO2FnOydmCDrqqjrk6AgQ1BVIOyXkOqyjCDrs7Tsl6zsp4Dqsowg65CY7KeA66eMLCDri6TrpbgKK0NQVSDrk6Tsl5Dqsozrj4Qg6rCZ7J2AIOyInOyEnOuhnCDrs7TsnbTqsowg65CgIOqxsOudvOuKlCDrs7TsnqXsnYAg7JeG64uk64qUIOucu+yeheuLiOuLpC4KKworCivrkZDqsJzsnZggQ1BVICgxICYgMikg6rCAIOuLrOugpCDsnojqs6AsIOqwgSBDUFUg7JeQIOuRkOqwnOydmCDrjbDsnbTthLAg7LqQ7IucKENQVSAxIOydgCBBL0Ig66W8LAorQ1BVIDIg64qUIEMvRCDrpbwg6rCW7Iq164uI64ukKeqwgCDrs5HroKzroZwg7Jew6rKw65CY7Ja0IOyeiOuKlCDsi5zsiqTthZzsnYQg64uk66Os64uk6rOgIOyDneqwge2VtAor67SF7Iuc64ukOgorCisJICAgICAgICAgICAgOgorCSAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLSsKKwkgICAgICAgICAgICA6ICAgICAgKy0tLS0tLS0tLSsgICAgICAgICB8ICAgICAgICB8CisJKy0tLS0tLS0tKyAgOiArLS0tPnwgQ2FjaGUgQSB8PC0tLS0tLS0+fCAgICAgICAgfAorCXwgICAgICAgIHwgIDogfCAgICArLS0tLS0tLS0tKyAgICAgICAgIHwgICAgICAgIHwKKwl8ICBDUFUgMSB8PC0tLSsgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8CisJfCAgICAgICAgfCAgOiB8ICAgICstLS0tLS0tLS0rICAgICAgICAgfCAgICAgICAgfAorCSstLS0tLS0tLSsgIDogKy0tLT58IENhY2hlIEIgfDwtLS0tLS0tPnwgICAgICAgIHwKKwkgICAgICAgICAgICA6ICAgICAgKy0tLS0tLS0tLSsgICAgICAgICB8ICAgICAgICB8CisJICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNZW1vcnkgfAorCSAgICAgICAgICAgIDogICAgICArLS0tLS0tLS0tKyAgICAgICAgIHwgU3lzdGVtIHwKKwkrLS0tLS0tLS0rICA6ICstLS0+fCBDYWNoZSBDIHw8LS0tLS0tLT58ICAgICAgICB8CisJfCAgICAgICAgfCAgOiB8ICAgICstLS0tLS0tLS0rICAgICAgICAgfCAgICAgICAgfAorCXwgIENQVSAyIHw8LS0tKyAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgIHwKKwl8ICAgICAgICB8ICA6IHwgICAgKy0tLS0tLS0tLSsgICAgICAgICB8ICAgICAgICB8CisJKy0tLS0tLS0tKyAgOiArLS0tPnwgQ2FjaGUgRCB8PC0tLS0tLS0+fCAgICAgICAgfAorCSAgICAgICAgICAgIDogICAgICArLS0tLS0tLS0tKyAgICAgICAgIHwgICAgICAgIHwKKwkgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0rCisJICAgICAgICAgICAgOgorCivsnbQg7Iuc7Iqk7YWc7J20IOuLpOydjOqzvCDqsJnsnYAg7Yq57ISx7J2EIOqwluuKlOuLpCDsg53qsIHtlbQg67SF7Iuc64ukOgorCisgKCopIO2ZgOyImOuyiCDsupDsi5zrnbzsnbjsnYAg7LqQ7IucIEEsIOy6kOyLnCBDIOuYkOuKlCDrqZTrqqjrpqzsl5Ag7JyE7LmY7ZWgIOyImCDsnojsnYw7CisKKyAoKikg7Ked7IiY67KIIOy6kOyLnOudvOyduOydgCDsupDsi5wgQiwg7LqQ7IucIEQg65iQ64qUIOuplOuqqOumrOyXkCDsnITsuZjtlaAg7IiYIOyeiOydjDsKKworICgqKSBDUFUg7L2U7Ja06rCAIO2VnOqwnOydmCDsupDsi5zsl5Ag7KCR6re87ZWY64qUIOuPmeyViCwg64uk66W4IOy6kOyLnOuKlCAtIOuNlO2LsCDsupDsi5zrnbzsnbjsnYQKKyAgICAg66mU66qo66as7JeQIOuCtOumrOqxsOuCmCDstpTsuKHshLEg66Gc65Oc66W8IO2VmOqxsOuCmCDtlZjquLAg7JyE7ZW0IC0g7Iuc7Iqk7YWc7J2YIOuLpOuluCDrtoDrtoTsl5AKKyAgICAg7JWh7IS47IqkIO2VmOq4sCDsnITtlbQg67KE7Iqk66W8IOyCrOyaqe2VoCDsiJgg7J6I7J2MOworCisgKCopIOqwgSDsupDsi5zripQg7Iuc7Iqk7YWc7J2YIOuCmOuouOyngCDrtoDrtoTrk6Tqs7wg7J286rSA7ISx7J2EIOunnuy2lOq4sCDsnITtlbQg7ZW064u5IOy6kOyLnOyXkAorICAgICDsoIHsmqnrkJjslrTslbwg7ZWgIOyYpO2NvOugiOydtOyFmOuTpOydmCDtgZDrpbwg6rCA7KeQOworCisgKCopIOydtCDsnbzqtIDshLEg7YGQ64qUIOy6kOyLnOyXkCDsnbTrr7gg7KG07J6s7ZWY64qUIOudvOyduOyXkCDqsIDtlbTsp4DripQg7Y+J67KU7ZWcIOuhnOuTnOyXkCDsnZjtlbTshJzripQKKyAgICAg67mE7JuM7KeA7KeAIOyViuuKlOuNsCwg7YGQ7J2YIOyYpO2NvOugiOydtOyFmOuTpOydtCDsnbQg66Gc65Oc7J2YIOqysOqzvOyXkCDsmIHtlqXsnYQg64G87LmgIOyImCDsnojri6QKKyAgICAg7ZWg7KeA652864+EIOq3uOufrO2VqC4KKwor7J207KCcLCDssqvrsojsp7ggQ1BVIOyXkOyEnCDrkZDqsJzsnZgg7JOw6riwIOyYpO2NvOugiOydtOyFmOydhCDrp4zrk5zripTrjbAsIO2VtOuLuSBDUFUg7J2YIOy6kOyLnOyXkAor7JqU7LKt65CcIOyInOyEnOuhnCDsmKTtjbzroIjsnbTshZjsnbQg64+E64us65Co7J2EIOuztOyepe2VmOq4sCDsnITtlbQg65GQIOyYpO2NvOugiOydtOyFmCDsgqzsnbTsl5Ag7JOw6riwCivrsLDrpqzslrTrpbwg7IKs7Jqp7ZWY64qUIOyDge2ZqeydhCDsg4Hsg4HtlbQg67SF7Iuc64ukOgorCisJQ1BVIDEJCUNQVSAyCQlDT01NRU5UCisJPT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJCQkJdSA9PSAwLCB2ID09IDEgYW5kIHAgPT0gJnUsIHEgPT0gJnUKKwl2ID0gMjsKKwlzbXBfd21iKCk7CQkJdiDsnZgg67OA6rK97J20IHAg7J2YIOuzgOqyvSDsoITsl5Ag67O07J28IOqyg+ydhAorCQkJCQkg67aE66qF7Z6IIO2VqAorCTxBOm1vZGlmeSB2PTI+CQkJdiDripQg7J207KCcIOy6kOyLnCBBIOyXkCDrj4XsoJDsoIHsnLzroZwg7KG07J6s7ZWoCisJcCA9ICZ2OworCTxCOm1vZGlmeSBwPSZ2PgkJCXAg64qUIOydtOygnCDsupDsi5wgQiDsl5Ag64+F7KCQ7KCB7Jy866GcIOyhtOyerO2VqAorCivsl6zquLDshJzsnZgg7JOw6riwIOuplOuqqOumrCDrsLDrpqzslrTripQgQ1BVIDEg7J2YIOy6kOyLnOqwgCDsmKzrsJTrpbgg7Iic7ISc66GcIOyXheuNsOydtO2KuCDrkJwg6rKD7Jy866GcCivsi5zsiqTthZzsnZgg64uk66W4IENQVSDrk6TsnbQg7J247KeA7ZWY6rKMIOunjOuTreuLiOuLpC4gIO2VmOyngOunjCwg7J207KCcIOuRkOuyiOynuCBDUFUg6rCAIOq3uCDqsJLrk6TsnYQKK+ydveycvOugpCDtlZjripQg7IOB7Zmp7J2EIOyDneqwge2VtCDrtIXsi5zri6Q6CisKKwlDUFUgMQkJQ1BVIDIJCUNPTU1FTlQKKwk9PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS4uLgorCQkJcSA9IHA7CisJCQl4ID0gKnE7CisKK+ychOydmCDrkZDqsJzsnZgg7J296riwIOyYpO2NvOugiOydtOyFmOydgCDsmIjsg4HrkJwg7Iic7ISc66GcIOydvOyWtOuCmOyngCDrqrvtlaAg7IiYIOyeiOuKlOuNsCwg65GQ67KI7Ke4IENQVQor7J2YIO2VnCDsupDsi5zsl5Ag64uk66W4IOy6kOyLnCDsnbTrsqTtirjqsIAg67Cc7IOd7ZW0IHYg66W8IOuLtOqzoCDsnojripQg7LqQ7Iuc65287J247J2YIO2VtOuLuSDsupDsi5zsl5DsnZgKK+yXheuNsOydtO2KuOqwgCDsp4Dsl7DrkJjripQg7IKs7J20LCBwIOulvCDri7Tqs6Ag7J6I64qUIOy6kOyLnOudvOyduOydgCDrkZDrsojsp7ggQ1BVIOydmCDri6Trpbgg7LqQ7Iuc7JeQCivsl4XrjbDsnbTtirgg65CY7Ja067KE66C47J2EIOyImCDsnojquLAg65WM66y47J6F64uI64ukLgorCisJQ1BVIDEJCUNQVSAyCQlDT01NRU5UCisJPT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJCQkJdSA9PSAwLCB2ID09IDEgYW5kIHAgPT0gJnUsIHEgPT0gJnUKKwl2ID0gMjsKKwlzbXBfd21iKCk7CisJPEE6bW9kaWZ5IHY9Mj4JPEM6YnVzeT4KKwkJCTxDOnF1ZXVlIHY9Mj4KKwlwID0gJnY7CQlxID0gcDsKKwkJCTxEOnJlcXVlc3QgcD4KKwk8Qjptb2RpZnkgcD0mdj4JPEQ6Y29tbWl0IHA9JnY+CisJCQk8RDpyZWFkIHA+CisJCQl4ID0gKnE7CisJCQk8QzpyZWFkICpxPgnsupDsi5zsl5Ag7JeF642w7J207Yq4IOuQmOq4sCDsoITsnZggdiDrpbwg7J297J2MCisJCQk8Qzp1bmJ1c3k+CisJCQk8Qzpjb21taXQgdj0yPgorCivquLDrs7jsoIHsnLzroZwsIOuRkOqwnOydmCDsupDsi5zrnbzsnbgg66qo65GQIENQVSAyIOyXkCDstZzsooXsoIHsnLzroZzripQg7JeF642w7J207Yq4IOuQoCDqsoPsnbTsp4Drp4wsCivrs4Trj4TsnZgg6rCc7J6FIOyXhuydtOuKlCwg7JeF642w7J207Yq47J2YIOyInOyEnOqwgCBDUFUgMSDsl5DshJwg66eM65Ok7Ja07KeEIOyInOyEnOyZgCDrj5nsnbztlaAKK+qyg+ydtOudvOuKlCDrs7TsnqXsnbQg7JeG7Iq164uI64ukLgorCisKK+yXrOq4sOyXkCDqsJzsnoXtlZjquLAg7JyE7ZW07ISgLCDrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtOuCmCDsnb3quLAg67Cw66as7Ja066W8IOuhnOuTnCDsmKTtjbzroIjsnbTshZjrk6QKK+yCrOydtOyXkCDrhKPslrTslbwg7ZWp64uI64ukLiAg7J2066CH6rKMIO2VqOycvOuhnOyNqCDsupDsi5zqsIAg64uk7J2MIOyalOyyreydhCDsspjrpqztlZjquLAg7KCE7JeQIOydvOq0gOyEsQor7YGQ66W8IOyymOumrO2VmOuPhOuhnSDqsJXsoJztlZjqsowg65Cp64uI64ukLgorCisJQ1BVIDEJCUNQVSAyCQlDT01NRU5UCisJPT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJCQkJdSA9PSAwLCB2ID09IDEgYW5kIHAgPT0gJnUsIHEgPT0gJnUKKwl2ID0gMjsKKwlzbXBfd21iKCk7CisJPEE6bW9kaWZ5IHY9Mj4JPEM6YnVzeT4KKwkJCTxDOnF1ZXVlIHY9Mj4KKwlwID0gJnY7CQlxID0gcDsKKwkJCTxEOnJlcXVlc3QgcD4KKwk8Qjptb2RpZnkgcD0mdj4JPEQ6Y29tbWl0IHA9JnY+CisJCQk8RDpyZWFkIHA+CisJCQlzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQorCQkJPEM6dW5idXN5PgorCQkJPEM6Y29tbWl0IHY9Mj4KKwkJCXggPSAqcTsKKwkJCTxDOnJlYWQgKnE+Cey6kOyLnOyXkCDsl4XrjbDsnbTtirgg65CcIHYg66W8IOydveydjAorCisKK+ydtOufsCDrtoDrpZjsnZgg66y47KCc64qUIERFQyBBbHBoYSDqs4Tsl7Qg7ZSE66Gc7IS47ISc65Ok7JeQ7IScIOuwnOqyrOuQoCDsiJgg7J6I64qU642wLCDsnbTrk6TsnYAKK+uNsOydtO2EsCDrsoTsiqTrpbwg7KKAIOuNlCDsnpgg7IKs7Jqp7ZW0IOyEseuKpeydhCDqsJzshKDtlaAg7IiYIOyeiOuKlCwg67aE7ZWg65CcIOy6kOyLnOulvCDqsIDsp4Dqs6Ag7J6I6riwCivrlYzrrLjsnoXri4jri6QuICDrjIDrtoDrtoTsnZggQ1BVIOuKlCDtlZjrgpjsnZgg7J296riwIOyYpO2NvOugiOydtOyFmOydmCDrqZTrqqjrpqwg7JWh7IS47Iqk6rCAIOuLpOuluCDsnb3quLAKK+yYpO2NvOugiOydtOyFmOyXkCDsnZjsobTsoIHsnbTrnbzrqbQg642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrTrpbwg64K07Y+s7Iuc7YK164uI64uk66eMLCDrqqjrkZDqsIAg6re465+w6rG0CivslYTri4jquLAg65WM66y47JeQIOydtOygkOyXkCDsnZjsobTtlbTshKAg7JWI65Cp64uI64ukLgorCivri6TrpbggQ1BVIOuTpOuPhCDrtoTtlaDrkJwg7LqQ7Iuc66W8IOqwgOyngOqzoCDsnojsnYQg7IiYIOyeiOyngOunjCwg6re465+wIENQVSDrk6TsnYAg7Y+J67KU7ZWcIOuplOuqqOumrAor7JWh7IS47Iqk66W8IOychO2VtOyEnOuPhCDsnbQg67aE7ZWg65CcIOy6kOyLnOuTpCDsgqzsnbTsnZgg7KGw7KCV7J2EIO2VtOyVvOunjCDtlanri4jri6QuICBBbHBoYSDripQg6rCA7J6lCivslb3tlZwg66mU66qo66asIOyInOyEnCDsi5zrp6jti7EgKHNlbWFudGljKSDsnYQg7ISg7YOd7ZWo7Jy866Gc7I2oIOuplOuqqOumrCDrsLDrpqzslrTqsIAg66qF7Iuc7KCB7Jy866GcCivsgqzsmqnrkJjsp4Ag7JWK7JWY7J2EIOuVjOyXkOuKlCDqt7jrn7Ag7KGw7KCV7J20IO2VhOyalO2VmOyngCDslYrqsowg7ZaI7Iq164uI64ukLgorCisKK+y6kOyLnCDsnbzqtIDshLEgVlMgRE1BCistLS0tLS0tLS0tLS0tLS0tLS0KKwor66qo65OgIOyLnOyKpO2FnOydtCBETUEg66W8IO2VmOuKlCDrlJTrsJTsnbTsiqTsl5Ag64yA7ZW07ISc6rmM7KeAIOy6kOyLnCDsnbzqtIDshLHsnYQg7Jyg7KeA7ZWY7KeA64qUCivslYrsirXri4jri6QuICDqt7jrn7Ag6rK97JqwLCBETUEg66W8IOyLnOuPhO2VmOuKlCDrlJTrsJTsnbTsiqTripQgUkFNIOycvOuhnOu2gO2EsCDsnpjrqrvrkJwg642w7J207YSw66W8Civsnb3snYQg7IiYIOyeiOuKlOuNsCwg642U7YuwIOy6kOyLnCDrnbzsnbjsnbQgQ1BVIOydmCDsupDsi5zsl5Ag66i466y066W06rOgIOyeiOqzoCwg67CU64CQIOqwkuydtCDslYTsp4EKK1JBTSDsl5Ag7I2o7KeA7KeAIOyViuyVmOydhCDsiJgg7J6I6riwIOuVjOusuOyeheuLiOuLpC4gIOydtCDrrLjsoJzrpbwg7ZW06rKw7ZWY6riwIOychO2VtOyEoCwg7Luk64SQ7J2YCivsoIHsoIjtlZwg67aA67aE7JeQ7IScIOqwgSBDUFUg7LqQ7Iuc7J2YIOusuOygnOuQmOuKlCDruYTtirjrk6TsnYQg7ZSM65+s7IucIChmbHVzaCkg7Iuc7Lyc7JW866eMIO2VqeuLiOuLpAorKOq3uOumrOqzoCDqt7jqsoPrk6TsnYQg66y07Zqo7ZmUIC0gaW52YWxpZGF0aW9uIC0g7Iuc7YKsIOyImOuPhCDsnojqsqDso6ApLgorCivrmJDtlZwsIOuUlOuwlOydtOyKpOyXkCDsnZjtlbQgUkFNIOyXkCBETUEg66GcIOyTsOyXrOynhCDqsJLsnYAg65SU67CU7J207Iqk6rCAIOyTsOq4sOulvCDsmYTro4ztlZwg7ZuE7JeQCitDUFUg7J2YIOy6kOyLnOyXkOyEnCBSQU0g7Jy866GcIOyTsOyXrOyngOuKlCDrjZTti7Ag7LqQ7IucIOudvOyduOyXkCDsnZjtlbQg642u7Ja07I2o7KeIIOyImOuPhCDsnojqs6AsIENQVQor7J2YIOy6kOyLnOyXkCDsobTsnqztlZjripQg7LqQ7IucIOudvOyduOydtCDtlbTri7kg7LqQ7Iuc7JeQ7IScIOyCreygnOuQmOqzoCDri6Tsi5wg6rCS7J2EIOydveyWtOuTpOydtOq4sAor7KCE6rmM7KeA64qUIFJBTSDsnbQg7JeF642w7J207Yq4IOuQmOyXiOuLpOuKlCDsgqzsi6Qg7J6Q7LK06rCAIOyIqOqyqOyguCDrsoTrprQg7IiY64+EIOyeiOyKteuLiOuLpC4gIOydtAor66y47KCc66W8IO2VtOqysO2VmOq4sCDsnITtlbTshKAsIOy7pOuEkOydmCDsoIHsoIjtlZwg67aA67aE7JeQ7IScIOqwgSBDUFUg7J2YIOy6kOyLnCDslYjsnZgg66y47KCc6rCAIOuQmOuKlAor67mE7Yq465Ok7J2EIOustO2aqO2ZlCDsi5zsvJzslbwg7ZWp64uI64ukLgorCivsupDsi5wg6rSA66as7JeQIOuMgO2VnCDrjZQg66eO7J2AIOygleuztOulvCDsnITtlbTshKAgRG9jdW1lbnRhdGlvbi9jYWNoZXRsYi50eHQg66W8CivssLjqs6DtlZjshLjsmpQuCisKKwor7LqQ7IucIOydvOq0gOyEsSBWUyBNTUlPCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK01lbW9yeSBtYXBwZWQgSS9PIOuKlCDsnbzrsJjsoIHsnLzroZwgQ1BVIOydmCDrqZTrqqjrpqwg6rO16rCEIOuCtOydmCDtlZwg7JyI64+E7Jqw7J2YIO2KueyglSDrtoDrtoQKK+uCtOydmCDrqZTrqqjrpqwg7KeA7Jet7JeQIOydtOujqOyWtOyngOuKlOuNsCwg7J20IOyciOuPhOyasOuKlCDsnbzrsJjsoIHsnbgsIFJBTSDsnLzroZwg7Zal7ZWY64qUCivsnIjrj4TsmrDsmYDripQg64uk66W4IO2KueyEseydhCDqsJbsirXri4jri6QuCisKK+q3uOufsCDtirnshLEg6rCA7Jq0642wIO2VmOuCmOuKlCwg7J2867CY7KCB7Jy866GcIOq3uOufsCDslaHshLjsiqTripQg7LqQ7Iuc66W8IOyZhOyghO2eiCDsmrDtmoztlZjqs6AKK+uUlOuwlOydtOyKpCDrsoTsiqTroZwg6rOn67CU66GcIO2Wpe2VnOuLpOuKlCDqsoPsnoXri4jri6QuICDsnbQg66eQ7J2AIE1NSU8g7JWh7IS47Iqk64qUIOuovOyggAor7Iuc7J6R65CY7Ja07IScIOy6kOyLnOyXkOyEnCDsmYTro4zrkJwg66mU66qo66asIOyVoeyEuOyKpOulvCDstpTsm5TtlaAg7IiYIOyeiOuLpOuKlCDrnLvsnoXri4jri6QuICDsnbTrn7AKK+qyveyasOyXlCDrqZTrqqjrpqwg67Cw66as7Ja066eM7Jy866Gc64qUIOy2qeu2hOy5mCDslYrqs6AsIOunjOyVvSDsupDsi5zrkJwg66mU66qo66asIOyTsOq4sCDsmKTtjbzroIjsnbTshZjqs7wKK01NSU8g7JWh7IS47Iqk6rCAIOyWtOuWpCDrsKnsi53snLzroZzrk6Ag7J2Y7KG07KCB7J20652866m0IO2VtOuLuSDsupDsi5zripQg65GQIOyYpO2NvOugiOydtOyFmCDsgqzsnbTsl5AKK+u5hOybjOyguChmbHVzaCnslbzrp4wg7ZWp64uI64ukLgorCisKKz09PT09PT09PT09PT09PT09PT09PT0KK0NQVSDrk6TsnbQg7KCA7KeA66W064qUIOydvOuTpAorPT09PT09PT09PT09PT09PT09PT09PQorCivtlITroZzqt7jrnpjrqLjripQgQ1BVIOqwgCDrqZTrqqjrpqwg7Jik7Y2866CI7J207IWY65Ok7J2EIOygle2Zle2eiCDsmpTssq3tlZzrjIDroZwg7IiY7ZaJ7ZW0IOykhCDqsoPsnbTrnbzqs6AKK+yDneqwge2VmOuKlOuNsCwg7JiI66W8IOuTpOyWtCDri6TsnYzqs7wg6rCZ7J2AIOy9lOuTnOulvCBDUFUg7JeQ6rKMIOuEmOq4tOuLpOuptDoKKworCWEgPSBSRUFEX09OQ0UoKkEpOworCVdSSVRFX09OQ0UoKkIsIGIpOworCWMgPSBSRUFEX09OQ0UoKkMpOworCWQgPSBSRUFEX09OQ0UoKkQpOworCVdSSVRFX09OQ0UoKkUsIGUpOworCitDUFUg64qUIOuLpOydjCDsnbjsiqTtirjrn63shZjsnYQg7LKY66as7ZWY6riwIOyghOyXkCDtmITsnqzsnZgg7J247Iqk7Yq465+t7IWY7J2EIOychO2VnCDrqZTrqqjrpqwKK+yYpO2NvOugiOydtOyFmOydhCDsmYTro4ztlaAg6rKD7J206528IOyDneqwge2VmOqzoCwg65Sw65287IScIOyLnOyKpO2FnCDsmbjrtoDsl5DshJwg6rSA7LCw7ZWY6riw7JeQ64+EIOygle2VtOynhAor7Iic7ISc64yA66GcIOyYpO2NvOugiOydtOyFmOydtCDsiJjtlonrkKAg6rKD7Jy866GcIOyYiOyDge2VqeuLiOuLpDoKKworCUxPQUQgKkEsIFNUT1JFICpCLCBMT0FEICpDLCBMT0FEICpELCBTVE9SRSAqRS4KKworCivri7nsl7DtlZjsp4Drp4wsIOyLpOygnOuhnOuKlCDtm6jslKwg7JeJ66ed7J6F64uI64ukLiAg66eO7J2AIENQVSDsmYAg7Lu07YyM7J2865+s7JeQ7IScIOyVnuydmCDqsIDsoJXsnYAKK+yEseumve2VmOyngCDrqrvtlZjripTrjbAg6re4IOydtOycoOuKlCDri6TsnYzqs7wg6rCZ7Iq164uI64ukOgorCisgKCopIOuhnOuTnCDsmKTtjbzroIjsnbTshZjrk6TsnYAg7Iuk7ZaJ7J2EIOqzhOyGjSDtlbTrgpjqsIDquLAg7JyE7ZW0IOqzp+uwlOuhnCDsmYTro4zrkKAg7ZWE7JqU6rCAIOyeiOuKlAorICAgICDqsr3smrDqsIAg66eO7J2AIOuwmOuptCwg7Iqk7Yag7Ja0IOyYpO2NvOugiOydtOyFmOuTpOydgCDsooXsooUg67OE64uk66W4IOusuOygnCDsl4bsnbQg7Jyg7JiI65CgIOyImAorICAgICDsnojsirXri4jri6Q7CisKKyAoKikg66Gc65OcIOyYpO2NvOugiOydtOyFmOuTpOydgCDsmIjsuKHsoIHsnLzroZwg7IiY7ZaJ65CgIOyImCDsnojsnLzrqbAsIO2VhOyalOyXhuuKlCDroZzrk5zsmIDri6Tqs6AKKyAgICAg7Kad66qF65CcIOyYiOy4oeyggSDroZzrk5zsnZgg6rKw6rO864qUIOuyhOugpOynkeuLiOuLpDsKKworICgqKSDroZzrk5wg7Jik7Y2866CI7J207IWY65Ok7J2AIOyYiOy4oeyggeycvOuhnCDsiJjtlonrkKAg7IiYIOyeiOycvOuvgOuhnCwg7JiI7IOB65CcIOydtOuypO2KuOydmAorICAgICDsi5ztgIDsiqTsmYAg64uk66W4IOyLnOqwhOyXkCDroZzrk5zqsIAg7J2066SE7KeIIOyImCDsnojsirXri4jri6Q7CisKKyAoKikg66mU66qo66asIOyVoeyEuOyKpCDsiJzshJzripQgQ1BVIOuyhOyKpOyZgCDsupDsi5zrpbwg7KKAIOuNlCDsnpgg7IKs7Jqp7ZWgIOyImCDsnojrj4TroZ0g7J6s67Cw7LmYCisgICAgIOuQoCDsiJgg7J6I7Iq164uI64ukOworCisgKCopIOuhnOuTnOyZgCDsiqTthqDslrTripQg7J247KCR7ZWcIOychOy5mOyXkOydmCDslaHshLjsiqTrk6TsnYQg7J286rSE7KCB7Jy866GcIOyymOumrO2VoCDsiJgg7J6I64qUCisgICAgIOuplOuqqOumrOuCmCBJL08g7ZWY65Oc7Juo7Ja0ICjrqZTrqqjrpqzsmYAgUENJIOuUlOuwlOydtOyKpCDrkZgg64ukIOydtOqyjCDqsIDriqXtlaAg7IiYCisgICAgIOyeiOyKteuLiOuLpCkg7JeQIOuMgO2VtCDsmpTssq3rkJjripQg6rK97JqwLCDqsJzrs4Qg7Jik7Y2866CI7J207IWY7J2EIOychO2VnCDtirjrnpzsnq3shZgg7ISk7KCVCisgICAgIOu5hOyaqeydhCDslYTrgbzquLAg7JyE7ZW0IOyhsO2VqeuQmOyWtCDsi6TtlonrkKAg7IiYIOyeiOyKteuLiOuLpDsg6re466as6rOgCisKKyAoKikg7ZW064u5IENQVSDsnZgg642w7J207YSwIOy6kOyLnOqwgCDsiJzshJzsl5Ag7JiB7Zal7J2EIOuBvOy5oCDsiJjrj4Qg7J6I6rOgLCDsupDsi5wg7J286rSA7ISxCisgICAgIOuplOy7pOuLiOymmOydtCAtIOyKpO2GoOyWtOqwgCDsi6TsoJzroZwg7LqQ7Iuc7JeQIOuPhOuLrO2VnOuLpOuptCAtIOydtCDrrLjsoJzrpbwg7JmE7ZmU7Iuc7YKsIOyImOuKlAorICAgICDsnojsp4Drp4wg7J20IOydvOq0gOyEsSDqtIDrpqzqsIAg64uk66W4IENQVSDrk6Tsl5Drj4Qg6rCZ7J2AIOyInOyEnOuhnCDsoITri6zrkJzri6TripQg67O07J6l7J2ACisgICAgIOyXhuyKteuLiOuLpC4KKwor65Sw65287IScLCDslZ7snZgg7L2U65Oc7JeQIOuMgO2VtCDri6TrpbggQ1BVIOqwgCDrs7TripQg6rKw6rO864qUIOuLpOydjOqzvCDqsJnsnYQg7IiYIOyeiOyKteuLiOuLpDoKKworCUxPQUQgKkEsIC4uLiwgTE9BRCB7KkMsKkR9LCBTVE9SRSAqRSwgU1RPUkUgKkIKKworCSgiTE9BRCB7KkMsKkR9IiDripQg7KGw7ZWp65CcIOuhnOuTnOyeheuLiOuLpCkKKworCivtlZjsp4Drp4wsIENQVSDripQg7Iqk7Iqk66Gc64qUIOydvOq0gOyggeydvCDqsoPsnYQg67O07J6l7ZWp64uI64ukOiBDUFUgX+yekOyLoF8g7J2YIOyVoeyEuOyKpOuTpOydgAor7J6Q7Iug7JeQ6rKM64qUIOuplOuqqOumrCDrsLDrpqzslrTqsIAg7JeG7J2M7JeQ64+EIOu2iOq1rO2VmOqzoCDsoJXtmZXtnogg7Iic7IScIOyEuOybjOynhCDqsoPsnLzroZwg67O07Jes7KeICivqsoPsnoXri4jri6QuICDsmIjrpbwg65Ok7Ja0IOuLpOydjOydmCDsvZTrk5zqsIAg7KO87Ja07KGM64uk66m0OgorCisJVSA9IFJFQURfT05DRSgqQSk7CisJV1JJVEVfT05DRSgqQSwgVik7CisJV1JJVEVfT05DRSgqQSwgVyk7CisJWCA9IFJFQURfT05DRSgqQSk7CisJV1JJVEVfT05DRSgqQSwgWSk7CisJWiA9IFJFQURfT05DRSgqQSk7CisKK+q3uOumrOqzoCDsmbjrtoDsnZgg7JiB7Zal7JeQIOydmO2VnCDqsITshK3snbQg7JeG64uk6rOgIOqwgOygle2VmOuptCwg7LWc7KKFIOqysOqzvOuKlCDri6TsnYzqs7wg6rCZ7J20Civrgpjtg4DrgqAg6rKD7J2065286rOgIOyYiOyDgeuQoCDsiJgg7J6I7Iq164uI64ukOgorCisJVSA9PSAqQSDsnZgg7LWc7LSIIOqwkgorCVggPT0gVworCVogPT0gWQorCSpBID09IFkKKwor7JWe7J2YIOy9lOuTnOuKlCBDUFUg6rCAIOuLpOydjOydmCDrqZTrqqjrpqwg7JWh7IS47IqkIOyLnO2AgOyKpOulvCDrp4zrk6Trj4TroZ0g7ZWg6rKB64uI64ukOgorCisJVT1MT0FEICpBLCBTVE9SRSAqQT1WLCBTVE9SRSAqQT1XLCBYPUxPQUQgKkEsIFNUT1JFICpBPVksIFo9TE9BRCAqQQorCivtlZjsp4Drp4wsIOuzhOuLpOuluCDqsJzsnoXsnbQg7JeG6rOgIO2UhOuhnOq3uOueqOydmCDsi5zslbzsl5Ag7J20IOyEuOyDgeydtCDsl6zsoITtnogg7J286rSA7KCB7J2065286rOgCivrs7Tsnbjri6TripQg67O07J6l66eMIOyngOy8nOynhOuLpOuptCDsnbQg7Iuc7YCA7Iqk64qUIOyWtOuWpCDsobDtlansnLzroZzrk6Ag7J6s6rWs7ISx65CgIOyImCDsnojsnLzrqbAsIOqwgQor7JWh7IS47Iqk65Ok7J2AIO2VqeyzkOyngOqxsOuCmCDrsoTroKTsp4gg7IiYIOyeiOyKteuLiOuLpC4gIOydvOu2gCDslYTtgqTthY3ss5Dsl5DshJwgQ1BVIOuKlCDqsJnsnYAg7JyE7LmY7JeQCivrjIDtlZwg7Jew7IaN7KCB7J24IOuhnOuTnCDsmKTtjbzroIjsnbTshZjrk6TsnYQg7J6s67Cw7LmYIO2VoCDsiJgg7J6I6riwIOuVjOusuOyXkCDslZ7snZgg7JiI7JeQ7ISc7J2YCitSRUFEX09OQ0UoKSDsmYAgV1JJVEVfT05DRSgpIOuKlCDrsJjrk5zsi5wg7KG07J6s7ZW07JW8IO2VqOydhCDslYzslYTrkZDshLjsmpQuICDqt7jrn7Ag7KKF66WY7J2YCivslYTtgqTthY3ss5Dsl5DshJwgUkVBRF9PTkNFKCkg7JmAIFdSSVRFX09OQ0UoKSDripQg7J20IOusuOygnOulvCDrp4nquLAg7JyE7ZW0IO2VhOyalO2VnCDsnbzsnYQKK+utkOqwgCDrkJDrk6Dsp4Ag7ZWY6rKMIOuQmOuKlOuNsCwg7JiI66W8IOuTpOyWtCBJdGFuaXVtIOyXkOyEnOuKlCBSRUFEX09OQ0UoKSDsmYAgV1JJVEVfT05DRSgpCivqsIAg7IKs7Jqp7ZWY64qUIHZvbGF0aWxlIOy6kOyKpO2MheydgCBHQ0Mg6rCAIOq3uOufsCDsnqzrsLDsuZjrpbwg67Cp7KeA7ZWY64qUIO2KueyImCDsnbjsiqTtirjrn63shZjsnbgKK2xkLmFjcSDsmYAgc3RsLnJlbCDsnbjsiqTtirjrn63shZjsnYQg6rCB6rCBIOunjOuTpOyWtCDrgrTrj4TroZ0g7ZWp64uI64ukLgorCivsu7TtjIzsnbzrn6wg7Jet7IucIOydtCDsi5ztgIDsiqTsnZgg7JWh7IS47Iqk65Ok7J2EIENQVSDqsIAg67O06riw64+EIOyghOyXkCDtlansuZjqsbDrgpgg67KE66as6rGw64KYIOuSpOuhnAor66+466SE67KE66a0IOyImCDsnojsirXri4jri6QuCisKK+yYiOulvCDrk6TslrQ6CisKKwkqQSA9IFY7CisJKkEgPSBXOworCivripQg64uk7J2M6rO8IOqwmeydtCDrs4DtmJXrkKAg7IiYIOyeiOyKteuLiOuLpDoKKworCSpBID0gVzsKKwor65Sw65287IScLCDsk7DquLAg67Cw66as7Ja064KYIFdSSVRFX09OQ0UoKSDqsIAg7JeG64uk66m0ICpBIOuhnOydmCBWIOqwkuydmCDsoIDsnqXsnZgg7Zqo6rO864qUCivsgqzrnbzsp4Tri6Tqs6Ag6rCA7KCV65CgIOyImCDsnojsirXri4jri6QuICDruYTsirftlZjqsow6CisKKwkqQSA9IFk7CisJWiA9ICpBOworCivripQsIOuplOuqqOumrCDrsLDrpqzslrTrgpggUkVBRF9PTkNFKCkg7JmAIFdSSVRFX09OQ0UoKSDsl4bsnbTripQg64uk7J2M6rO8IOqwmeydtCDrs4DtmJXrkKAg7IiYCivsnojsirXri4jri6Q6CisKKwkqQSA9IFk7CisJWiA9IFk7CisKK+q3uOumrOqzoCDsnbQgTE9BRCDsmKTtjbzroIjsnbTshZjsnYAgQ1BVIOuwlOq5peyXkOuKlCDslYTsmIgg67O07J207KeAIOyViuyKteuLiOuLpC4KKworCivqt7jrpqzqs6AsIEFMUEhBIOqwgCDsnojri6QKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitERUMgQWxwaGEgQ1BVIOuKlCDqsIDsnqUg7JmE7ZmU65CcIOuplOuqqOumrCDsiJzshJzsnZggQ1BVIOykkSDtlZjrgpjsnoXri4jri6QuICDrv5Drp4wg7JWE64uI6528LAorQWxwaGEgQ1BVIOydmCDsnbzrtoAg67KE7KCE7J2AIOu2hO2VoOuQnCDrjbDsnbTthLAg7LqQ7Iuc66W8IOqwgOyngOqzoCDsnojslrTshJwsIOydmOuvuOyggeycvOuhnAor6rSA6rOE65CY7Ja0IOyeiOuKlCDrkZDqsJzsnZgg7LqQ7IucIOudvOyduOydtCDshJzroZwg64uk66W4IOyLnOqwhOyXkCDsl4XrjbDsnbTtirgg65CY64qU6rKMIOqwgOuKpe2VqeuLiOuLpC4KK+ydtOqyjCDrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtOqwgCDsoJXrp5Ag7ZWE7JqU7ZW07KeA64qUIOu2gOu2hOyduOuNsCwg642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrTripQKK+uplOuqqOumrCDsnbzqtIDshLEg7Iuc7Iqk7YWc6rO8IO2VqOq7mCDrkZDqsJzsnZgg7LqQ7Iuc66W8IOuPmeq4sO2ZlCDsi5zsvJzshJwsIO2PrOyduO2EsCDrs4Dqsr3qs7wg7IOI66Gc7Jq0CivrjbDsnbTthLDsnZgg67Cc6rKs7J2EIOyYrOuwlOuluCDsiJzshJzroZwg7J287Ja064KY6rKMIO2VmOq4sCDrlYzrrLjsnoXri4jri6QuCisKK+umrOuIheyKpCDsu6TrhJDsnZgg66mU66qo66asIOuwsOumrOyWtCDrqqjrjbjsnYAgQWxwaGEg7JeQIOq4sOy0iO2VtOyEnCDsoJXsnZjrkJjsl4jsirXri4jri6QuCisKK+ychOydmCAi7LqQ7IucIOydvOq0gOyEsSIg7ISc67iM7IS57IWY7J2EIOywuOqzoO2VmOyEuOyalC4KKworCivqsIDsg4Eg66i47IugIOqyjOyKpO2KuAorLS0tLS0tLS0tLS0tLS0tLQorCivqsIDsg4Eg66i47Iug7JeQ7IScIOuPmeyeke2VmOuKlCDqsozsiqTtirjrk6TsnYAg6rKM7Iqk7Yq4IOyekOyytOuKlCBTTVAg7KeA7JuQIOyXhuydtCDsu7TtjIzsnbwg65CY7JeI64ukCivtlbTrj4QgU01QIOyYge2WpeydhCDrsJvsnYQg7IiYIOyeiOyKteuLiOuLpC4gIOydtOqxtCBVUCDsu6TrhJDsnYQg7IKs7Jqp7ZWY66m07IScIFNNUCDtmLjsiqTtirjsmYAKK+qysOu2gOuQmOyWtCDrsJzsg53tlZjripQg67aA7J6R7Jqp7J6F64uI64ukLiAg7J20IOqyveyasOyXkOuKlCBtYW5kYXRvcnkg67Cw66as7Ja066W8IOyCrOyaqe2VtOyEnCDrrLjsoJzrpbwKK+2VtOqysO2VoCDsiJgg7J6I6rKg7KeA66eMIOq3uOufsCDtlbTqsrDsnYAg64yA67aA67aE7J2YIOqyveyasCDstZzsoIHsnZgg7ZW06rKw7LGF7J20IOyVhOuLmeuLiOuLpC4KKwor7J20IOusuOygnOulvCDsmYTrsr3tlZjqsowg7ZW06rKw7ZWY6riwIOychO2VtCwg66Gc7JqwIOugiOuyqOydmCB2aXJ0X21iKCkg65Ox7J2YIOunpO2BrOuhnOulvCDsgqzsmqntlaAg7IiYCivsnojsirXri4jri6QuIOydtOqyg+uTpOydgCBTTVAg6rCAIO2ZnOyEse2ZlCDrkJjslrQg7J6I64uk66m0IHNtcF9tYigpIOuTseqzvCDrj5nsnbztlZwg7Zqo6rO866W8CivqsJbsirXri4jri6Trp4wsIFNNUCDsmYAgU01QIOyVhOuLjCDsi5zsiqTthZwg66qo65GQ7JeQIOuMgO2VtCDrj5nsnbztlZwg7L2U65Oc66W8IOunjOuTpOyWtOuDheuLiOuLpC4KK+yYiOulvCDrk6TslrQsIOqwgOyDgSDrqLjsi6Ag6rKM7Iqk7Yq465Ok7J2AIChTTVAg7J28IOyImCDsnojripQpIO2YuOyKpO2KuOyZgCDrj5nquLDtmZTrpbwg7ZWgIOuVjOyXkOuKlAorc21wX21iKCkg6rCAIOyVhOuLiOudvCB2aXJ0X21iKCkg66W8IOyCrOyaqe2VtOyVvCDtlanri4jri6QuCisKK+ydtOqyg+uTpOydgCBzbXBfbWIoKSDrpZjsnZgg6rKD65Ok6rO8IOuqqOuToCDrtoDrtoTsl5DshJwg64+Z7J287ZWY66mwLCDtirntnogsIE1NSU8g7J2YIOyYge2WpeyXkAor64yA7ZW07ISc64qUIOqwhOyXrO2VmOyngCDslYrsirXri4jri6Q6IE1NSU8g7J2YIOyYge2WpeydhCDsoJzslrTtlZjroKTrqbQsIG1hbmRhdG9yeSDrsLDrpqzslrTrpbwKK+yCrOyaqe2VmOyLnOq4sCDrsJTrno3ri4jri6QuCisKKworPT09PT09PQor7IKs7JqpIOyYiAorPT09PT09PQorCivsiJztmZjsi50g67KE7Y28CistLS0tLS0tLS0tLQorCivrqZTrqqjrpqwg67Cw66as7Ja064qUIOyInO2ZmOyLnSDrsoTtjbzrpbwg7IOd7ISx7J6QKHByb2R1Y2VyKeyZgCDshozruYTsnpAoY29uc3VtZXIpIOyCrOydtOydmAor64+Z6riw7ZmU7JeQIOudveydhCDsgqzsmqntlZjsp4Ag7JWK6rOgIOq1rO2YhO2VmOuKlOuNsOyXkCDsgqzsmqnrkKAg7IiYIOyeiOyKteuLiOuLpC4gIOuNlCDsnpDshLjtlZwg64K07Jqp7J2ECivsnITtlbTshKAg64uk7J2M7J2EIOywuOqzoO2VmOyEuOyalDoKKworCURvY3VtZW50YXRpb24vY2lyY3VsYXItYnVmZmVycy50eHQKKworCis9PT09PT09PT0KK+ywuOqzoCDrrLjtl4wKKz09PT09PT09PQorCitBbHBoYSBBWFAgQXJjaGl0ZWN0dXJlIFJlZmVyZW5jZSBNYW51YWwsIFNlY29uZCBFZGl0aW9uIChTaXRlcyAmIFdpdGVrLAorRGlnaXRhbCBQcmVzcykKKwlDaGFwdGVyIDUuMjogUGh5c2ljYWwgQWRkcmVzcyBTcGFjZSBDaGFyYWN0ZXJpc3RpY3MKKwlDaGFwdGVyIDUuNDogQ2FjaGVzIGFuZCBXcml0ZSBCdWZmZXJzCisJQ2hhcHRlciA1LjU6IERhdGEgU2hhcmluZworCUNoYXB0ZXIgNS42OiBSZWFkL1dyaXRlIE9yZGVyaW5nCisKK0FNRDY0IEFyY2hpdGVjdHVyZSBQcm9ncmFtbWVyJ3MgTWFudWFsIFZvbHVtZSAyOiBTeXN0ZW0gUHJvZ3JhbW1pbmcKKwlDaGFwdGVyIDcuMTogTWVtb3J5LUFjY2VzcyBPcmRlcmluZworCUNoYXB0ZXIgNy40OiBCdWZmZXJpbmcgYW5kIENvbWJpbmluZyBNZW1vcnkgV3JpdGVzCisKK0lBLTMyIEludGVsIEFyY2hpdGVjdHVyZSBTb2Z0d2FyZSBEZXZlbG9wZXIncyBNYW51YWwsIFZvbHVtZSAzOgorU3lzdGVtIFByb2dyYW1taW5nIEd1aWRlCisJQ2hhcHRlciA3LjE6IExvY2tlZCBBdG9taWMgT3BlcmF0aW9ucworCUNoYXB0ZXIgNy4yOiBNZW1vcnkgT3JkZXJpbmcKKwlDaGFwdGVyIDcuNDogU2VyaWFsaXppbmcgSW5zdHJ1Y3Rpb25zCisKK1RoZSBTUEFSQyBBcmNoaXRlY3R1cmUgTWFudWFsLCBWZXJzaW9uIDkKKwlDaGFwdGVyIDg6IE1lbW9yeSBNb2RlbHMKKwlBcHBlbmRpeCBEOiBGb3JtYWwgU3BlY2lmaWNhdGlvbiBvZiB0aGUgTWVtb3J5IE1vZGVscworCUFwcGVuZGl4IEo6IFByb2dyYW1taW5nIHdpdGggdGhlIE1lbW9yeSBNb2RlbHMKKworVWx0cmFTUEFSQyBQcm9ncmFtbWVyIFJlZmVyZW5jZSBNYW51YWwKKwlDaGFwdGVyIDU6IE1lbW9yeSBBY2Nlc3NlcyBhbmQgQ2FjaGVhYmlsaXR5CisJQ2hhcHRlciAxNTogU3BhcmMtVjkgTWVtb3J5IE1vZGVscworCitVbHRyYVNQQVJDIElJSSBDdSBVc2VyJ3MgTWFudWFsCisJQ2hhcHRlciA5OiBNZW1vcnkgTW9kZWxzCisKK1VsdHJhU1BBUkMgSUlJaSBQcm9jZXNzb3IgVXNlcidzIE1hbnVhbAorCUNoYXB0ZXIgODogTWVtb3J5IE1vZGVscworCitVbHRyYVNQQVJDIEFyY2hpdGVjdHVyZSAyMDA1CisJQ2hhcHRlciA5OiBNZW1vcnkKKwlBcHBlbmRpeCBEOiBGb3JtYWwgU3BlY2lmaWNhdGlvbnMgb2YgdGhlIE1lbW9yeSBNb2RlbHMKKworVWx0cmFTUEFSQyBUMSBTdXBwbGVtZW50IHRvIHRoZSBVbHRyYVNQQVJDIEFyY2hpdGVjdHVyZSAyMDA1CisJQ2hhcHRlciA4OiBNZW1vcnkgTW9kZWxzCisJQXBwZW5kaXggRjogQ2FjaGVzIGFuZCBDYWNoZSBDb2hlcmVuY3kKKworU29sYXJpcyBJbnRlcm5hbHMsIENvcmUgS2VybmVsIEFyY2hpdGVjdHVyZSwgcDYzLTY4OgorCUNoYXB0ZXIgMy4zOiBIYXJkd2FyZSBDb25zaWRlcmF0aW9ucyBmb3IgTG9ja3MgYW5kCisJCQlTeW5jaHJvbml6YXRpb24KKworVW5peCBTeXN0ZW1zIGZvciBNb2Rlcm4gQXJjaGl0ZWN0dXJlcywgU3ltbWV0cmljIE11bHRpcHJvY2Vzc2luZyBhbmQgQ2FjaGluZworZm9yIEtlcm5lbCBQcm9ncmFtbWVyczoKKwlDaGFwdGVyIDEzOiBPdGhlciBNZW1vcnkgTW9kZWxzCisKK0ludGVsIEl0YW5pdW0gQXJjaGl0ZWN0dXJlIFNvZnR3YXJlIERldmVsb3BlcidzIE1hbnVhbDogVm9sdW1lIDE6CisJU2VjdGlvbiAyLjY6IFNwZWN1bGF0aW9uCisJU2VjdGlvbiA0LjQ6IE1lbW9yeSBBY2Nlc3MKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va3Byb2Jlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2twcm9iZXMudHh0CmluZGV4IDFmOWIzZTIuLjFmNmQ0NWEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va3Byb2Jlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rcHJvYmVzLnR4dApAQCAtMTAzLDYgKzEwMywxNiBAQAogb3IgaW4gcmVnaXN0ZXJzLiAgVGhlIGpwcm9iZSB3aWxsIHdvcmsgaW4gZWl0aGVyIGNhc2UsIHNvIGxvbmcgYXMgdGhlCiBoYW5kbGVyJ3MgcHJvdG90eXBlIG1hdGNoZXMgdGhhdCBvZiB0aGUgcHJvYmVkIGZ1bmN0aW9uLgogCitOb3RlIHRoYXQgaW4gc29tZSBhcmNoaXRlY3R1cmVzIChlLmcuOiBhcm02NCBhbmQgc3BhcmM2NCkgdGhlIHN0YWNrCitjb3B5IGlzIG5vdCBkb25lLCBhcyB0aGUgYWN0dWFsIGxvY2F0aW9uIG9mIHN0YWNrZWQgcGFyYW1ldGVycyBtYXkgYmUKK291dHNpZGUgb2YgYSByZWFzb25hYmxlIE1BWF9TVEFDS19TSVpFIHZhbHVlIGFuZCBiZWNhdXNlIHRoYXQgbG9jYXRpb24KK2Nhbm5vdCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBqcHJvYmVzIGNvZGUuIEluIHRoaXMgY2FzZSB0aGUganByb2JlcwordXNlciBtdXN0IGJlIGNhcmVmdWwgdG8gbWFrZSBjZXJ0YWluIHRoZSBjYWxsaW5nIHNpZ25hdHVyZSBvZiB0aGUKK2Z1bmN0aW9uIGRvZXMgbm90IGNhdXNlIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIG9uIHRoZSBzdGFjayAoZS5nLjoKK21vcmUgdGhhbiBlaWdodCBmdW5jdGlvbiBhcmd1bWVudHMsIGFuIGFyZ3VtZW50IG9mIG1vcmUgdGhhbiBzaXh0ZWVuCitieXRlcywgb3IgbW9yZSB0aGFuIDY0IGJ5dGVzIG9mIGFyZ3VtZW50IGRhdGEsIGRlcGVuZGluZyBvbgorYXJjaGl0ZWN0dXJlKS4KKwogMS4zIFJldHVybiBQcm9iZXMKIAogMS4zLjEgSG93IERvZXMgYSBSZXR1cm4gUHJvYmUgV29yaz8KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbGVkcy9sZWRzLW1seGNwbGQudHh0IGIvRG9jdW1lbnRhdGlvbi9sZWRzL2xlZHMtbWx4Y3BsZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBlOGZkNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vbGVkcy9sZWRzLW1seGNwbGQudHh0CkBAIC0wLDAgKzEsMTEwIEBACitLZXJuZWwgZHJpdmVyIGZvciBNZWxsYW5veCBzeXN0ZW1zIExFRHMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitQcm92aWRlIHN5c3RlbSBMRUQgc3VwcG9ydCBmb3IgdGhlIG5leCBNZWxsYW5veCBzeXN0ZW1zOgorIm1zeDY3MTAiLCAibXN4NjcyMCIsICJtc2I3NzAwIiwgIm1zbjI3MDAiLCAibXN4MTQxMCIsCisibXNuMjQxMCIsICJtc2I3ODAwIiwgIm1zbjI3NDAiLCAibXNuMjEwMCIuCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorRHJpdmVyIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgTEVEcyBmb3IgdGhlIHN5c3RlbXMgIm1zeDY3MTAiLCAibXN4NjcyMCIsCisibXNiNzcwMCIsICJtc24yNzAwIiwgIm1zeDE0MTAiLCAibXNuMjQxMCIsICJtc2I3ODAwIiwgIm1zbjI3NDAiOgorICBtbHhjcGxkOmZhbjE6Z3JlZW4KKyAgbWx4Y3BsZDpmYW4xOnJlZAorICBtbHhjcGxkOmZhbjI6Z3JlZW4KKyAgbWx4Y3BsZDpmYW4yOnJlZAorICBtbHhjcGxkOmZhbjM6Z3JlZW4KKyAgbWx4Y3BsZDpmYW4zOnJlZAorICBtbHhjcGxkOmZhbjQ6Z3JlZW4KKyAgbWx4Y3BsZDpmYW40OnJlZAorICBtbHhjcGxkOnBzdTpncmVlbgorICBtbHhjcGxkOnBzdTpyZWQKKyAgbWx4Y3BsZDpzdGF0dXM6Z3JlZW4KKyAgbWx4Y3BsZDpzdGF0dXM6cmVkCisKKyAic3RhdHVzIgorICBDUExEIHJlZyBvZmZzZXQ6IDB4MjAKKyAgQml0cyBbMzowXQorCisgInBzdSIKKyAgQ1BMRCByZWcgb2Zmc2V0OiAweDIwCisgIEJpdHMgWzc6NF0KKworICJmYW4xIgorICBDUExEIHJlZyBvZmZzZXQ6IDB4MjEKKyAgQml0cyBbMzowXQorCisgImZhbjIiCisgIENQTEQgcmVnIG9mZnNldDogMHgyMQorICBCaXRzIFs3OjRdCisKKyAiZmFuMyIKKyAgQ1BMRCByZWcgb2Zmc2V0OiAweDIyCisgIEJpdHMgWzM6MF0KKworICJmYW40IgorICBDUExEIHJlZyBvZmZzZXQ6IDB4MjIKKyAgQml0cyBbNzo0XQorCisgQ29sb3IgbWFzayBmb3IgYWxsIHRoZSBhYm92ZSBMRURzOgorICBbYml0MyxiaXQyLGJpdDEsYml0MF0gb3IKKyAgW2JpdDcsYml0NixiaXQ1LGJpdDRdOgorCVswLDAsMCwwXSA9IExFRCBPRkYKKwlbMCwxLDAsMV0gPSBSZWQgc3RhdGljIE9OCisJWzEsMSwwLDFdID0gR3JlZW4gc3RhdGljIE9OCisJWzAsMSwxLDBdID0gUmVkIGJsaW5rIDNIegorCVsxLDEsMSwwXSA9IEdyZWVuIGJsaW5rIDNIegorCVswLDEsMSwxXSA9IFJlZCBibGluayA2SHoKKwlbMSwxLDEsMV0gPSBHcmVlbiBibGluayA2SHoKKworRHJpdmVyIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgTEVEcyBmb3IgdGhlIHN5c3RlbSAibXNuMjEwMCI6CisgIG1seGNwbGQ6ZmFuOmdyZWVuCisgIG1seGNwbGQ6ZmFuOnJlZAorICBtbHhjcGxkOnBzdTE6Z3JlZW4KKyAgbWx4Y3BsZDpwc3UxOnJlZAorICBtbHhjcGxkOnBzdTI6Z3JlZW4KKyAgbWx4Y3BsZDpwc3UyOnJlZAorICBtbHhjcGxkOnN0YXR1czpncmVlbgorICBtbHhjcGxkOnN0YXR1czpyZWQKKyAgbWx4Y3BsZDp1aWQ6Ymx1ZQorCisgInN0YXR1cyIKKyAgQ1BMRCByZWcgb2Zmc2V0OiAweDIwCisgIEJpdHMgWzM6MF0KKworICJmYW4iCisgIENQTEQgcmVnIG9mZnNldDogMHgyMQorICBCaXRzIFszOjBdCisKKyAicHN1MSIKKyAgQ1BMRCByZWcgb2Zmc2V0OiAweDIzCisgIEJpdHMgWzM6MF0KKworICJwc3UyIgorICBDUExEIHJlZyBvZmZzZXQ6IDB4MjMKKyAgQml0cyBbNzo0XQorCisgInVpZCIKKyAgQ1BMRCByZWcgb2Zmc2V0OiAweDI0CisgIEJpdHMgWzM6MF0KKworIENvbG9yIG1hc2sgZm9yIGFsbCB0aGUgYWJvdmUgTEVEcywgZXhjZXB0ZWQgdWlkOgorICBbYml0MyxiaXQyLGJpdDEsYml0MF0gb3IKKyAgW2JpdDcsYml0NixiaXQ1LGJpdDRdOgorCVswLDAsMCwwXSA9IExFRCBPRkYKKwlbMCwxLDAsMV0gPSBSZWQgc3RhdGljIE9OCisJWzEsMSwwLDFdID0gR3JlZW4gc3RhdGljIE9OCisJWzAsMSwxLDBdID0gUmVkIGJsaW5rIDNIegorCVsxLDEsMSwwXSA9IEdyZWVuIGJsaW5rIDNIegorCVswLDEsMSwxXSA9IFJlZCBibGluayA2SHoKKwlbMSwxLDEsMV0gPSBHcmVlbiBibGluayA2SHoKKworIENvbG9yIG1hc2sgZm9yIHVpZCBMRUQ6CisgIFtiaXQzLGJpdDIsYml0MSxiaXQwXToKKwlbMCwwLDAsMF0gPSBMRUQgT0ZGCisJWzEsMSwwLDFdID0gQmx1ZSBzdGF0aWMgT04KKwlbMSwxLDEsMF0gPSBCbHVlIGJsaW5rIDNIegorCVsxLDEsMSwxXSA9IEJsdWUgYmxpbmsgNkh6CisKK0RyaXZlciBzdXBwb3J0cyBIVyBibGlua2luZyBhdCAzSHogYW5kIDZIeiBmcmVxdWVuY3kgKDUwJSBkdXR5IGN5Y2xlKS4KK0ZvciAzSHogZHV0eSBjeWxjZSBpcyBhYm91dCAxNjcgbXNlYywgZm9yIDZIeiBpcyBhYm91dCA4MyBtc2VjLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9sZWRzL2xlZHRyaWctb25lc2hvdC50eHQgYi9Eb2N1bWVudGF0aW9uL2xlZHMvbGVkdHJpZy1vbmVzaG90LnR4dAppbmRleCAwN2NkMWZhLi5mZTU3NDc0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2xlZHMvbGVkdHJpZy1vbmVzaG90LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2xlZHMvbGVkdHJpZy1vbmVzaG90LnR4dApAQCAtMjEsMjQgKzIxLDggQEAKIAogICBlY2hvIG9uZXNob3QgPiB0cmlnZ2VyCiAKLVRoaXMgYWRkcyB0aGUgZm9sbG93aW5nIHN5c2ZzIGF0dHJpYnV0ZXMgdG8gdGhlIExFRDoKLQotICBkZWxheV9vbiAtIHNwZWNpZmllcyBmb3IgaG93IG1hbnkgbWlsbGlzZWNvbmRzIHRoZSBMRUQgaGFzIHRvIHN0YXkgYXQKLSAgICAgICAgICAgICBMRURfRlVMTCBicmlnaHRuZXNzIGFmdGVyIGl0IGhhcyBiZWVuIGFybWVkLgotICAgICAgICAgICAgIERlZmF1bHQgdG8gMTAwIG1zLgotCi0gIGRlbGF5X29mZiAtIHNwZWNpZmllcyBmb3IgaG93IG1hbnkgbWlsbGlzZWNvbmRzIHRoZSBMRUQgaGFzIHRvIHN0YXkgYXQKLSAgICAgICAgICAgICAgTEVEX09GRiBicmlnaHRuZXNzIGFmdGVyIGl0IGhhcyBiZWVuIGFybWVkLgotICAgICAgICAgICAgICBEZWZhdWx0IHRvIDEwMCBtcy4KLQotICBpbnZlcnQgLSByZXZlcnNlIHRoZSBibGluayBsb2dpYy4gIElmIHNldCB0byAwIChkZWZhdWx0KSBibGluayBvbiBmb3IgZGVsYXlfb24KLSAgICAgICAgICAgbXMsIHRoZW4gYmxpbmsgb2ZmIGZvciBkZWxheV9vZmYgbXMsIGxlYXZpbmcgdGhlIExFRCBub3JtYWxseSBvZmYuICBJZgotICAgICAgICAgICBzZXQgdG8gMSwgYmxpbmsgb2ZmIGZvciBkZWxheV9vZmYgbXMsIHRoZW4gYmxpbmsgb24gZm9yIGRlbGF5X29uIG1zLAotICAgICAgICAgICBsZWF2aW5nIHRoZSBMRUQgbm9ybWFsbHkgb24uCi0gICAgICAgICAgIFNldHRpbmcgdGhpcyB2YWx1ZSBhbHNvIGltbWVkaWF0ZWx5IGNoYW5nZSB0aGUgTEVEIHN0YXRlLgotCi0gIHNob3QgLSB3cml0ZSBhbnkgbm9uLWVtcHR5IHN0cmluZyB0byBzaWduYWwgYW4gZXZlbnRzLCB0aGlzIHN0YXJ0cyBhIGJsaW5rCi0gICAgICAgICBzZXF1ZW5jZSBpZiBub3QgYWxyZWFkeSBydW5uaW5nLgorVGhpcyBhZGRzIHN5c2ZzIGF0dHJpYnV0ZXMgdG8gdGhlIExFRCB0aGF0IGFyZSBkb2N1bWVudGVkIGluOgorRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1sZWQtdHJpZ2dlci1vbmVzaG90CiAKIEV4YW1wbGUgdXNlLWNhc2U6IG5ldHdvcmsgZGV2aWNlcywgaW5pdGlhbGl6YXRpb246CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbGVkcy9sZWR0cmlnLXVzYnBvcnQudHh0IGIvRG9jdW1lbnRhdGlvbi9sZWRzL2xlZHRyaWctdXNicG9ydC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlmNTRiZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vbGVkcy9sZWR0cmlnLXVzYnBvcnQudHh0CkBAIC0wLDAgKzEsNDEgQEAKK1VTQiBwb3J0IExFRCB0cmlnZ2VyCis9PT09PT09PT09PT09PT09PT09PQorCitUaGlzIExFRCB0cmlnZ2VyIGNhbiBiZSB1c2VkIGZvciBzaWduYWxsaW5nIHRvIHRoZSB1c2VyIGEgcHJlc2VuY2Ugb2YgVVNCIGRldmljZQoraW4gYSBnaXZlbiBwb3J0LiBJdCBzaW1wbHkgdHVybnMgb24gTEVEIHdoZW4gZGV2aWNlIGFwcGVhcnMgYW5kIHR1cm5zIGl0IG9mZgord2hlbiBpdCBkaXNhcHBlYXJzLgorCitJdCByZXF1aXJlcyBzZWxlY3RpbmcgVVNCIHBvcnRzIHRoYXQgc2hvdWxkIGJlIG9ic2VydmVkLiBBbGwgYXZhaWxhYmxlIG9uZXMgYXJlCitsaXN0ZWQgYXMgc2VwYXJhdGVkIGVudHJpZXMgaW4gYSAicG9ydHMiIHN1YmRpcmVjdG9yeS4gU2VsZWN0aW5nIGlzIGhhbmRsZWQgYnkKK2VjaG9pbmcgIjEiIHRvIGEgY2hvc2VuIHBvcnQuCisKK1BsZWFzZSBub3RlIHRoYXQgdGhpcyB0cmlnZ2VyIGFsbG93cyBzZWxlY3RpbmcgbXVsdGlwbGUgVVNCIHBvcnRzIGZvciBhIHNpbmdsZQorTEVELiBUaGlzIGNhbiBiZSB1c2VmdWwgaW4gdHdvIGNhc2VzOgorCisxKSBEZXZpY2Ugd2l0aCBzaW5nbGUgVVNCIExFRCBhbmQgZmV3IHBoeXNpY2FsIHBvcnRzCisKK0luIHN1Y2ggYSBjYXNlIExFRCB3aWxsIGJlIHR1cm5lZCBvbiBhcyBsb25nIGFzIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjb25uZWN0ZWQKK1VTQiBkZXZpY2UuCisKKzIpIERldmljZSB3aXRoIGEgcGh5c2ljYWwgcG9ydCBoYW5kbGVkIGJ5IGZldyBjb250cm9sbGVycworCitTb21lIGRldmljZXMgbWF5IGhhdmUgb25lIGNvbnRyb2xsZXIgcGVyIFBIWSBzdGFuZGFyZC4gRS5nLiBVU0IgMy4wIHBoeXNpY2FsCitwb3J0IG1heSBiZSBoYW5kbGVkIGJ5IG9oY2ktcGxhdGZvcm0sIGVoY2ktcGxhdGZvcm0gYW5kIHhoY2ktaGNkLiBJZiB0aGVyZSBpcworb25seSBvbmUgTEVEIHVzZXIgd2lsbCBtb3N0IGxpa2VseSB3YW50IHRvIGFzc2lnbiBwb3J0cyBmcm9tIGFsbCAzIGh1YnMuCisKKworVGhpcyB0cmlnZ2VyIGNhbiBiZSBhY3RpdmF0ZWQgZnJvbSB1c2VyIHNwYWNlIG9uIGxlZCBjbGFzcyBkZXZpY2VzIGFzIHNob3duCitiZWxvdzoKKworICBlY2hvIHVzYnBvcnQgPiB0cmlnZ2VyCisKK1RoaXMgYWRkcyBzeXNmcyBhdHRyaWJ1dGVzIHRvIHRoZSBMRUQgdGhhdCBhcmUgZG9jdW1lbnRlZCBpbjoKK0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtbGVkLXRyaWdnZXItdXNicG9ydAorCitFeGFtcGxlIHVzZS1jYXNlOgorCisgIGVjaG8gdXNicG9ydCA+IHRyaWdnZXIKKyAgZWNobyAxID4gcG9ydHMvdXNiMS1wb3J0MQorICBlY2hvIDEgPiBwb3J0cy91c2IyLXBvcnQxCisgIGNhdCBwb3J0cy91c2IxLXBvcnQxCisgIGVjaG8gMCA+IHBvcnRzL3VzYjEtcG9ydDEKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbG9ja2luZy9sZ2xvY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9sb2NraW5nL2xnbG9jay50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2OTcxZTMuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9sb2NraW5nL2xnbG9jay50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotbGdsb2NrIC0gbG9jYWwvZ2xvYmFsIGxvY2tzIGZvciBtb3N0bHkgbG9jYWwgYWNjZXNzIHBhdHRlcm5zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotT3JpZ2luOiBOaWNrIFBpZ2dpbidzIFZGUyBzY2FsYWJpbGl0eSBzZXJpZXMgaW50cm9kdWNlZCBkdXJpbmcKLQkyLjYuMzUrKyBbMV0gWzJdCi1Mb2NhdGlvbjoga2VybmVsL2xvY2tpbmcvbGdsb2NrLmMKLQlpbmNsdWRlL2xpbnV4L2xnbG9jay5oCi1Vc2VyczogY3VycmVudGx5IG9ubHkgdGhlIFZGUyBhbmQgc3RvcF9tYWNoaW5lIHJlbGF0ZWQgY29kZQotCi1EZXNpZ24gR29hbDoKLS0tLS0tLS0tLS0tLQotCi1JbXByb3ZlIHNjYWxhYmlsaXR5IG9mIGdsb2JhbGx5IHVzZWQgbGFyZ2UgZGF0YSBzZXRzIHRoYXQgYXJlCi1kaXN0cmlidXRlZCBvdmVyIGFsbCBDUFVzIGFzIHBlcl9jcHUgZWxlbWVudHMuCi0KLVRvIG1hbmFnZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgYXJlIHBhcnRpdGlvbmVkIG92ZXIgYWxsIENQVXMKLWFzIHBlcl9jcHUgZWxlbWVudHMgYnV0IGNhbiBiZSBtb3N0bHkgaGFuZGxlZCBieSBDUFUgbG9jYWwgYWN0aW9ucwotbGdsb2NrIHdpbGwgYmUgdXNlZCB3aGVyZSB0aGUgbWFqb3JpdHkgb2YgYWNjZXNzZXMgYXJlIGNwdSBsb2NhbAotcmVhZGluZyBhbmQgb2NjYXNpb25hbCBjcHUgbG9jYWwgd3JpdGluZyB3aXRoIHZlcnkgaW5mcmVxdWVudAotZ2xvYmFsIHdyaXRlIGFjY2Vzcy4KLQotCi0qIGRlYWwgd2l0aCB0aGluZ3MgbG9jYWxseSB3aGVuZXZlciBwb3NzaWJsZQotCS0gdmVyeSBmYXN0IGFjY2VzcyB0byB0aGUgbG9jYWwgcGVyX2NwdSBkYXRhCi0JLSByZWFzb25hYmx5IGZhc3QgYWNjZXNzIHRvIHNwZWNpZmljIHBlcl9jcHUgZGF0YSBvbiBhIGRpZmZlcmVudAotCSAgQ1BVCi0qIHdoaWxlIG1ha2luZyBnbG9iYWwgYWN0aW9uIHBvc3NpYmxlIHdoZW4gbmVlZGVkCi0JLSBieSBleHBlbnNpdmUgYWNjZXNzIHRvIGFsbCBDUFVzIGxvY2tzIC0gZWZmZWN0aXZlbHkKLQkgIHJlc3VsdGluZyBpbiBhIGdsb2JhbGx5IHZpc2libGUgY3JpdGljYWwgc2VjdGlvbi4KLQotRGVzaWduOgotLS0tLS0tLQotCi1CYXNpY2FsbHkgaXQgaXMgYW4gYXJyYXkgb2YgcGVyX2NwdSBzcGlubG9ja3Mgd2l0aCB0aGUKLWxnX2xvY2FsX2xvY2svdW5sb2NrIGFjY2Vzc2luZyB0aGUgbG9jYWwgQ1BVcyBsb2NrIG9iamVjdCBhbmQgdGhlCi1sZ19sb2NhbF9sb2NrX2NwdS91bmxvY2tfY3B1IGFjY2Vzc2luZyBhIHJlbW90ZSBDUFVzIGxvY2sgb2JqZWN0Ci10aGUgbGdfbG9jYWxfbG9jayBoYXMgdG8gZGlzYWJsZSBwcmVlbXB0aW9uIGFzIG1pZ3JhdGlvbiBwcm90ZWN0aW9uIHNvCi10aGF0IHRoZSByZWZlcmVuY2UgdG8gdGhlIGxvY2FsIENQVXMgbG9jayBkb2VzIG5vdCBnbyBvdXQgb2Ygc2NvcGUuCi1EdWUgdG8gdGhlIGxnX2xvY2FsX2xvY2svdW5sb2NrIG9ubHkgdG91Y2hpbmcgY3B1LWxvY2FsIHJlc291cmNlcyBpdAotaXMgZmFzdC4gVGFraW5nIHRoZSBsb2NhbCBsb2NrIG9uIGEgZGlmZmVyZW50IENQVSB3aWxsIGJlIG1vcmUKLWV4cGVuc2l2ZSBidXQgc3RpbGwgcmVsYXRpdmVseSBjaGVhcC4KLQotT25lIGNhbiByZWxheCB0aGUgbWlncmF0aW9uIGNvbnN0cmFpbnRzIGJ5IGFjcXVpcmluZyB0aGUgY3VycmVudAotQ1BVcyBsb2NrIHdpdGggbGdfbG9jYWxfbG9ja19jcHUsIHJlbWVtYmVyIHRoZSBjcHUsIGFuZCByZWxlYXNlIHRoYXQKLWxvY2sgYXQgdGhlIGVuZCBvZiB0aGUgY3JpdGljYWwgc2VjdGlvbiBldmVuIGlmIG1pZ3JhdGVkLiBUaGlzIHNob3VsZAotZ2l2ZSBtb3N0IG9mIHRoZSBwZXJmb3JtYW5jZSBiZW5lZml0cyB3aXRob3V0IGluaGliaXRpbmcgbWlncmF0aW9uCi10aG91Z2ggbmVlZHMgY2FyZWZ1bCBjb25zaWRlcmF0aW9ucyBmb3IgbmVzdGluZyBvZiBsZ2xvY2tzIGFuZAotY29uc2lkZXJhdGlvbiBvZiBkZWFkbG9ja3Mgd2l0aCBsZ19nbG9iYWxfbG9jay4KLQotVGhlIGxnX2dsb2JhbF9sb2NrL3VubG9jayBsb2NrcyBhbGwgdW5kZXJseWluZyBzcGlubG9ja3Mgb2YgYWxsCi1wb3NzaWJsZSBDUFVzIChpbmNsdWRpbmcgdGhvc2Ugb2ZmLWxpbmUpLiBUaGUgcHJlZW1wdGlvbiBkaXNhYmxlL2VuYWJsZQotYXJlIG5lZWRlZCBpbiB0aGUgbm9uLVJUIGtlcm5lbHMgdG8gcHJldmVudCBkZWFkbG9ja3MgbGlrZToKLQotICAgICAgICAgICAgICAgICAgICAgb24gY3B1IDEKLQotICAgICAgICAgICAgICB0YXNrIEEgICAgICAgICAgdGFzayBCCi0gICAgICAgICBsZ19nbG9iYWxfbG9jawotICAgICAgICAgICBnb3QgY3B1IDAgbG9jawotICAgICAgICAgICAgICAgICA8PDw8IHByZWVtcHQgPDw8PAotICAgICAgICAgICAgICAgICAgICAgICAgIGxnX2xvY2FsX2xvY2tfY3B1IGZvciBjcHUgMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BpbiBvbiBjcHUgMCBsb2NrCi0KLU9uIC1SVCB0aGlzIGRlYWRsb2NrIHNjZW5hcmlvIGlzIHJlc29sdmVkIGJ5IHRoZSBhcmNoX3NwaW5fbG9ja3MgaW4gdGhlCi1sZ2xvY2tzIGJlaW5nIHJlcGxhY2VkIGJ5IHJ0X211dGV4ZXMgd2hpY2ggcmVzb2x2ZSB0aGUgYWJvdmUgZGVhZGxvY2sKLWJ5IGJvb3N0aW5nIHRoZSBsb2NrLWhvbGRlci4KLQotCi1JbXBsZW1lbnRhdGlvbjoKLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgaW5pdGlhbCBsZ2xvY2sgaW1wbGVtZW50YXRpb24gZnJvbSBOaWNrIFBpZ2dpbiB1c2VkIHNvbWUgY29tcGxleAotbWFjcm9zIHRvIGdlbmVyYXRlIHRoZSBsZ2xvY2svYnJsb2NrIGluIGxnbG9jay5oIC0gdGhleSB3ZXJlIGxhdGVyCi10dXJuZWQgaW50byBhIHNldCBvZiBmdW5jdGlvbnMgYnkgQW5kaSBLbGVlbiBbN10uIFRoZSBjaGFuZ2UgdG8gZnVuY3Rpb25zCi13YXMgbW90aXZhdGVkIGJ5IHRoZSBwcmVzZW5jZSBvZiBtdWx0aXBsZSBsb2NrIHVzZXJzIGFuZCBhbHNvIGJ5IHRoZW0KLWJlaW5nIGVhc2llciB0byBtYWludGFpbiB0aGFuIHRoZSBnZW5lcmF0aW5nIG1hY3Jvcy4gVGhpcyBjaGFuZ2UgdG8KLWZ1bmN0aW9ucyBpcyBhbHNvIHRoZSBiYXNpcyB0byBlbGltaW5hdGVkIHRoZSByZXN0cmljdGlvbiBvZiBub3QKLWJlaW5nIGluaXRpYWxpemVhYmxlIGluIGtlcm5lbCBtb2R1bGVzICh0aGUgcmVtYWluaW5nIHByb2JsZW0gaXMgdGhhdAotbG9ja3MgYXJlIG5vdCBleHBsaWNpdGx5IGluaXRpYWxpemVkIC0gc2VlIGxvY2tkZXAtZGVzaWduLnR4dCkKLQotRGVjbGFyYXRpb24gYW5kIGluaXRpYWxpemF0aW9uOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICNpbmNsdWRlIDxsaW51eC9sZ2xvY2suaD4KLQotICBERUZJTkVfTEdMT0NLKG5hbWUpCi0gIG9yOgotICBERUZJTkVfU1RBVElDX0xHTE9DSyhuYW1lKTsKLQotICBsZ19sb2NrX2luaXQoJm5hbWUsICJsb2NrZGVwX25hbWVfc3RyaW5nIik7Ci0KLSAgb24gVVAgdGhpcyBpcyBtYXBwZWQgdG8gREVGSU5FX1NQSU5MT0NLKG5hbWUpIGluIGJvdGggY2FzZXMsIG5vdGUKLSAgYWxzbyB0aGF0IGFzIG9mIDMuMTgtcmM2IGFsbCBkZWNsYXJhdGlvbiBpbiB1c2UgYXJlIG9mIHRoZSBfU1RBVElDXwotICB2YXJpYW50IChhbmQgaXQgc2VlbXMgdGhhdCB0aGUgbm9uLXN0YXRpYyB3YXMgbmV2ZXIgaW4gdXNlKS4KLSAgbGdfbG9ja19pbml0IGlzIGluaXRpYWxpemluZyB0aGUgbG9ja2RlcCBtYXAgb25seS4KLQotVXNhZ2U6Ci0tLS0tLS0KLQotRnJvbSB0aGUgbG9ja2luZyBzZW1hbnRpY3MgaXQgaXMgYSBzcGlubG9jay4gSXQgY291bGQgYmUgY2FsbGVkIGEKLWxvY2FsaXR5IGF3YXJlIHNwaW5sb2NrLiBsZ19sb2NhbF8qIGJlaGF2ZXMgbGlrZSBhIHBlcl9jcHUKLXNwaW5sb2NrIGFuZCBsZ19nbG9iYWxfKiBsaWtlIGEgZ2xvYmFsIHNwaW5sb2NrLgotTm8gc3VycHJpc2VzIGluIHRoZSBBUEkuCi0KLSAgbGdfbG9jYWxfbG9jaygqbGdsb2NrKTsKLSAgICAgYWNjZXNzIHRvIHByb3RlY3RlZCBwZXJfY3B1IG9iamVjdCBvbiB0aGlzIENQVQotICBsZ19sb2NhbF91bmxvY2soKmxnbG9jayk7Ci0KLSAgbGdfbG9jYWxfbG9ja19jcHUoKmxnbG9jaywgY3B1KTsKLSAgICAgYWNjZXNzIHRvIHByb3RlY3RlZCBwZXJfY3B1IG9iamVjdCBvbiBvdGhlciBDUFUgY3B1Ci0gIGxnX2xvY2FsX3VubG9ja19jcHUoKmxnbG9jaywgY3B1KTsKLQotICBsZ19nbG9iYWxfbG9jaygqbGdsb2NrKTsKLSAgICAgYWNjZXNzIGFsbCBwcm90ZWN0ZWQgcGVyX2NwdSBvYmplY3RzIG9uIGFsbCBDUFVzCi0gIGxnX2dsb2JhbF91bmxvY2soKmxnbG9jayk7Ci0KLSAgVGhlcmUgYXJlIG5vIF90cnlsb2NrIHZhcmlhbnRzIG9mIHRoZSBsZ2xvY2tzLgotCi1Ob3RlIHRoYXQgdGhlIGxnX2dsb2JhbF9sb2NrL3VubG9jayBoYXMgdG8gaXRlcmF0ZSBvdmVyIGFsbCBwb3NzaWJsZQotQ1BVcyByYXRoZXIgdGhhbiB0aGUgYWN0dWFsbHkgcHJlc2VudCBDUFVzIG9yIGEgQ1BVIGNvdWxkIGdvIG9mZi1saW5lCi13aXRoIGEgaGVsZCBsb2NrIFs0XSBhbmQgdGhhdCBtYWtlcyBpdCB2ZXJ5IGV4cGVuc2l2ZS4gQSBkaXNjdXNzaW9uIG9uCi10aGVzZSBpc3N1ZXMgY2FuIGJlIGZvdW5kIGF0IFs1XQotCi1Db25zdHJhaW50czoKLS0tLS0tLS0tLS0tLQotCi0gICogY3VycmVudGx5IHRoZSBkZWNsYXJhdGlvbiBvZiBsZ2xvY2tzIGluIGtlcm5lbCBtb2R1bGVzIGlzIG5vdAotICAgIHBvc3NpYmxlLCB0aG91Z2ggdGhpcyBzaG91bGQgYmUgZG9hYmxlIHdpdGggbGl0dGxlIGNoYW5nZS4KLSAgKiBsZ2xvY2tzIGFyZSBub3QgcmVjdXJzaXZlLgotICAqIHN1aXRhYmxlIGZvciBjb2RlIHRoYXQgY2FuIGRvIG1vc3Qgb3BlcmF0aW9ucyBvbiB0aGUgQ1BVIGxvY2FsCi0gICAgZGF0YSBhbmQgd2lsbCB2ZXJ5IHJhcmVseSBuZWVkIHRoZSBnbG9iYWwgbG9jawotICAqIGxnX2dsb2JhbF9sb2NrL3VubG9jayBpcyAqdmVyeSogZXhwZW5zaXZlIGFuZCBkb2VzIG5vdCBzY2FsZQotICAqIG9uIFVQIHN5c3RlbXMgYWxsIGxnXyogcHJpbWl0aXZlcyBhcmUgc2ltcGx5IHNwaW5sb2NrcwotICAqIGluIFBSRUVNUFRfUlQgdGhlIHNwaW5sb2NrIGJlY29tZXMgYW4gcnQtbXV0ZXggYW5kIGNhbiBzbGVlcCBidXQKLSAgICBkb2VzIG5vdCBjaGFuZ2UgdGhlIHRhc2tzIHN0YXRlIHdoaWxlIHNsZWVwaW5nIFs2XS4KLSAgKiBpbiBQUkVFTVBUX1JUIHRoZSBwcmVlbXB0X2Rpc2FibGUvZW5hYmxlIGluIGxnX2xvY2FsX2xvY2svdW5sb2NrCi0gICAgaXMgZG93bmdyYWRlZCB0byBhIG1pZ3JhdGVfZGlzYWJsZS9lbmFibGUsIHRoZSBvdGhlcgotICAgIHByZWVtcHRfZGlzYWJsZS9lbmFibGUgYXJlIGRvd25ncmFkZWQgdG8gYmFycmllcnMgWzZdLgotICAgIFRoZSBkZWFkbG9jayBub3RlZCBmb3Igbm9uLVJUIGFib3ZlIGlzIHJlc29sdmVkIGR1ZSB0byBydF9tdXRleGVzCi0gICAgYm9vc3RpbmcgdGhlIGxvY2staG9sZGVyIGluIHRoaXMgY2FzZSB3aGljaCBhcmNoX3NwaW5fbG9ja3MgZG8KLSAgICBub3QgZG8uCi0KLWxnbG9ja3Mgd2VyZSBkZXNpZ25lZCBmb3IgdmVyeSBzcGVjaWZpYyBwcm9ibGVtcyBpbiB0aGUgVkZTIGFuZCBwcm9iYWJseQotb25seSBhcmUgdGhlIHJpZ2h0IGFuc3dlciBpbiB0aGVzZSBjb3JuZXIgY2FzZXMuIEFueSBuZXcgdXNlciB0aGF0IGxvb2tzCi1hdCBsZ2xvY2tzIHByb2JhYmx5IHdhbnRzIHRvIGxvb2sgYXQgdGhlIHNlcWxvY2sgYW5kIFJDVSBhbHRlcm5hdGl2ZXMgYXMKLWhlciBmaXJzdCBjaG9pY2UuIFRoZXJlIGFyZSBhbHNvIGVmZm9ydHMgdG8gcmVzb2x2ZSB0aGUgUkNVIGlzc3VlcyB0aGF0Ci1jdXJyZW50bHkgcHJldmVudCB1c2luZyBSQ1UgaW4gcGxhY2Ugb2YgdmlldyByZW1haW5pbmcgbGdsb2Nrcy4KLQotTm90ZSBvbiBicmxvY2sgaGlzdG9yeToKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSAnQmlnIFJlYWRlcicgcmVhZC13cml0ZSBzcGlubG9ja3Mgd2VyZSBvcmlnaW5hbGx5IGludHJvZHVjZWQgYnkKLUluZ28gTW9sbmFyIGluIDIwMDAgKDIuNC8yLjUga2VybmVsIHNlcmllcykgYW5kIHJlbW92ZWQgaW4gMjAwMy4gVGhleQotbGF0ZXIgd2VyZSBpbnRyb2R1Y2VkIGJ5IHRoZSBWRlMgc2NhbGFiaWxpdHkgcGF0Y2ggc2V0IGluIDIuNiBzZXJpZXMKLWFnYWluIGFzIHRoZSAiYmlnIHJlYWRlciBsb2NrIiBicmxvY2sgWzJdIHZhcmlhbnQgb2YgbGdsb2NrIHdoaWNoIGhhcwotYmVlbiByZXBsYWNlZCBieSBzZXFsb2NrIHByaW1pdGl2ZXMgb3IgYnkgUkNVIGJhc2VkIHByaW1pdGl2ZXMgaW4gdGhlCi0zLjEzIGtlcm5lbCBzZXJpZXMgYXMgd2FzIHN1Z2dlc3RlZCBpbiBbM10gaW4gMjAwMy4gVGhlIGJybG9jayB3YXMKLWVudGlyZWx5IHJlbW92ZWQgaW4gdGhlIDMuMTMga2VybmVsIHNlcmllcy4KLQotTGluazogMSBodHRwOi8vbGttbC5vcmcvbGttbC8yMDEwLzgvMi84MQotTGluazogMiBodHRwOi8vbHduLm5ldC9BcnRpY2xlcy80MDE3MzgvCi1MaW5rOiAzIGh0dHA6Ly9sa21sLm9yZy9sa21sLzIwMDMvMy85LzIwNQotTGluazogNCBodHRwczovL2xrbWwub3JnL2xrbWwvMjAxMS84LzI0LzE4NQotTGluazogNSBodHRwOi8vbGttbC5vcmcvbGttbC8yMDExLzEyLzE4LzE4OQotTGluazogNiBodHRwczovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvcHJvamVjdHMvcnQvCi0gICAgICAgIHBhdGNoIHNlcmllcyAtIGxnbG9ja3MtcnQucGF0Y2gucGF0Y2gKLUxpbms6IDcgaHR0cDovL2xrbWwub3JnL2xrbWwvMjAxMi8zLzUvMjYKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWVkaWEvTWFrZWZpbGUgYi9Eb2N1bWVudGF0aW9uL21lZGlhL01ha2VmaWxlCmluZGV4IDM5ZTJkNzYuLmE3ZmIzNTIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbWVkaWEvTWFrZWZpbGUKKysrIGIvRG9jdW1lbnRhdGlvbi9tZWRpYS9NYWtlZmlsZQpAQCAtMTAsNyArMTAsOCBAQAogCiBUQVJHRVRTIDo9ICQoYWRkcHJlZml4ICQoQlVJTERESVIpLywgJChGSUxFUykpCiAKLWh0bWxkb2NzOiAkKEJVSUxERElSKSAke1RBUkdFVFN9CisuUEhPTlk6IGFsbAorYWxsOiAkKEJVSUxERElSKSAke1RBUkdFVFN9CiAKICQoQlVJTERESVIpOgogCSQoUSlta2RpciAtcCAkQApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tZWRpYS9jb25mLnB5IGIvRG9jdW1lbnRhdGlvbi9tZWRpYS9jb25mLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZjkyN2IKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL21lZGlhL2NvbmYucHkKQEAgLTAsMCArMSwxMCBAQAorIyAtKi0gY29kaW5nOiB1dGYtODsgbW9kZTogcHl0aG9uIC0qLQorCitwcm9qZWN0ID0gJ0xpbnV4IE1lZGlhIFN1YnN5c3RlbSBEb2N1bWVudGF0aW9uJworCit0YWdzLmFkZCgic3VicHJvamVjdCIpCisKK2xhdGV4X2RvY3VtZW50cyA9IFsKKyAgICAoJ2luZGV4JywgJ21lZGlhLnRleCcsICdMaW51eCBNZWRpYSBTdWJzeXN0ZW0gRG9jdW1lbnRhdGlvbicsCisgICAgICdUaGUga2VybmVsIGRldmVsb3BtZW50IGNvbW11bml0eScsICdtYW51YWwnKSwKK10KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWVkaWEvY29uZl9uaXRwaWNrLnB5IGIvRG9jdW1lbnRhdGlvbi9tZWRpYS9jb25mX25pdHBpY2sucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFiZWFjMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vbWVkaWEvY29uZl9uaXRwaWNrLnB5CkBAIC0wLDAgKzEsOTMgQEAKKyMgLSotIGNvZGluZzogdXRmLTg7IG1vZGU6IHB5dGhvbiAtKi0KKworcHJvamVjdCA9ICdMaW51eCBNZWRpYSBTdWJzeXN0ZW0gRG9jdW1lbnRhdGlvbicKKworIyBJdCBpcyBwb3NzaWJsZSB0byBydW4gU3BoaW54IGluIG5pY2twaWNrIG1vZGUgd2l0aDoKK25pdHBpY2t5ID0gVHJ1ZQorCisjIHdpdGhpbiBuaXQtcGlja2luZyBidWlsZCwgZG8gbm90IHJlZmVyIHRvIGFueSBpbnRlcnNwaGlueCBvYmplY3QKK2ludGVyc3BoaW54X21hcHBpbmcgPSB7fQorCisjIEluIG5pY2twaWNrIG1vZGUsIGl0IHdpbGwgY29tcGxhaW4gYWJvdXQgbG90cyBvZiBtaXNzaW5nIHJlZmVyZW5jZXMgdGhhdAorIworIyAxKSBhcmUganVzdCB0eXBlZGVmcyBsaWtlOiBib29sLCBfX3UzMiwgZXRjOworIyAyKSBJdCB3aWxsIGNvbXBsYWluIGZvciB0aGluZ3MgbGlrZTogZW51bSwgTlVMTDsKKyMgMykgSXQgd2lsbCBjb21wbGFpbiBmb3Igc3ltYm9scyB0aGF0IHNob3VsZCBiZSBvbiBkaWZmZXJlbnQKKyMgICAgYm9va3MgKGJ1dCBjdXJyZW50bHkgYXJlbid0IHBvcnRlZCB0byBSZVNUKQorIworIyBUaGUgbGlzdCBiZWxvdyBoYXMgYSBsaXN0IG9mIHN1Y2ggc3ltYm9scyB0byBiZSBpZ25vcmVkIGluIG5pdHBpY2sgbW9kZQorIworbml0cGlja19pZ25vcmUgPSBbCisgICAgKCJjOmZ1bmMiLCAiY2xvY2tfZ2V0dGltZSIpLAorICAgICgiYzpmdW5jIiwgImNsb3NlIiksCisgICAgKCJjOmZ1bmMiLCAiY29udGFpbmVyX29mIiksCisgICAgKCJjOmZ1bmMiLCAiZGV0ZXJtaW5lX3ZhbGlkX2lvY3RscyIpLAorICAgICgiYzpmdW5jIiwgIkVSUl9QVFIiKSwKKyAgICAoImM6ZnVuYyIsICJpb2N0bCIpLAorICAgICgiYzpmdW5jIiwgIklTX0VSUiIpLAorICAgICgiYzpmdW5jIiwgIm1tYXAiKSwKKyAgICAoImM6ZnVuYyIsICJvcGVuIiksCisgICAgKCJjOmZ1bmMiLCAicGNpX25hbWUiKSwKKyAgICAoImM6ZnVuYyIsICJwb2xsIiksCisgICAgKCJjOmZ1bmMiLCAiUFRSX0VSUiIpLAorICAgICgiYzpmdW5jIiwgInJlYWQiKSwKKyAgICAoImM6ZnVuYyIsICJyZWxlYXNlIiksCisgICAgKCJjOmZ1bmMiLCAic2V0IiksCisgICAgKCJjOmZ1bmMiLCAic3RydWN0IGZkX3NldCIpLAorICAgICgiYzpmdW5jIiwgInN0cnVjdCBwb2xsZmQiKSwKKyAgICAoImM6ZnVuYyIsICJ1c2JfbWFrZV9wYXRoIiksCisgICAgKCJjOmZ1bmMiLCAid3JpdGUiKSwKKyAgICAoImM6dHlwZSIsICJhdG9taWNfdCIpLAorICAgICgiYzp0eXBlIiwgImJvb2wiKSwKKyAgICAoImM6dHlwZSIsICJidWZfcXVldWUiKSwKKyAgICAoImM6dHlwZSIsICJkZXZpY2UiKSwKKyAgICAoImM6dHlwZSIsICJkZXZpY2VfZHJpdmVyIiksCisgICAgKCJjOnR5cGUiLCAiZGV2aWNlX25vZGUiKSwKKyAgICAoImM6dHlwZSIsICJlbnVtIiksCisgICAgKCJjOnR5cGUiLCAiZmlsZSIpLAorICAgICgiYzp0eXBlIiwgImkyY19hZGFwdGVyIiksCisgICAgKCJjOnR5cGUiLCAiaTJjX2JvYXJkX2luZm8iKSwKKyAgICAoImM6dHlwZSIsICJpMmNfY2xpZW50IiksCisgICAgKCJjOnR5cGUiLCAia3RpbWVfdCIpLAorICAgICgiYzp0eXBlIiwgImxlZF9jbGFzc2Rldl9mbGFzaCIpLAorICAgICgiYzp0eXBlIiwgImxpc3RfaGVhZCIpLAorICAgICgiYzp0eXBlIiwgImxvY2tfY2xhc3Nfa2V5IiksCisgICAgKCJjOnR5cGUiLCAibW9kdWxlIiksCisgICAgKCJjOnR5cGUiLCAibXV0ZXgiKSwKKyAgICAoImM6dHlwZSIsICJwY2lfZGV2IiksCisgICAgKCJjOnR5cGUiLCAicGR2YmRldiIpLAorICAgICgiYzp0eXBlIiwgInBvbGxfdGFibGVfc3RydWN0IiksCisgICAgKCJjOnR5cGUiLCAiczMyIiksCisgICAgKCJjOnR5cGUiLCAiczY0IiksCisgICAgKCJjOnR5cGUiLCAic2QiKSwKKyAgICAoImM6dHlwZSIsICJzcGlfYm9hcmRfaW5mbyIpLAorICAgICgiYzp0eXBlIiwgInNwaV9kZXZpY2UiKSwKKyAgICAoImM6dHlwZSIsICJzcGlfbWFzdGVyIiksCisgICAgKCJjOnR5cGUiLCAic3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIiksCisgICAgKCJjOnR5cGUiLCAic3RydWN0IHBvbGxmZCIpLAorICAgICgiYzp0eXBlIiwgInN0cnVjdCB0aW1ldmFsIiksCisgICAgKCJjOnR5cGUiLCAic3RydWN0IHZpZGVvX2NhcGFiaWxpdHkiKSwKKyAgICAoImM6dHlwZSIsICJ1MTYiKSwKKyAgICAoImM6dHlwZSIsICJ1MzIiKSwKKyAgICAoImM6dHlwZSIsICJ1NjQiKSwKKyAgICAoImM6dHlwZSIsICJ1OCIpLAorICAgICgiYzp0eXBlIiwgInVuaW9uIiksCisgICAgKCJjOnR5cGUiLCAidXNiX2RldmljZSIpLAorCisgICAgKCJjcHA6dHlwZSIsICJib29sZWFuIiksCisgICAgKCJjcHA6dHlwZSIsICJmZCIpLAorICAgICgiY3BwOnR5cGUiLCAiZmRfc2V0IiksCisgICAgKCJjcHA6dHlwZSIsICJpbnQxNl90IiksCisgICAgKCJjcHA6dHlwZSIsICJOVUxMIiksCisgICAgKCJjcHA6dHlwZSIsICJvZmZfdCIpLAorICAgICgiY3BwOnR5cGUiLCAicG9sbGZkIiksCisgICAgKCJjcHA6dHlwZSIsICJzaXplX3QiKSwKKyAgICAoImNwcDp0eXBlIiwgInNzaXplX3QiKSwKKyAgICAoImNwcDp0eXBlIiwgInRpbWV2YWwiKSwKKyAgICAoImNwcDp0eXBlIiwgIl9fdTE2IiksCisgICAgKCJjcHA6dHlwZSIsICJfX3UzMiIpLAorICAgICgiY3BwOnR5cGUiLCAiX191NjQiKSwKKyAgICAoImNwcDp0eXBlIiwgInVpbnQxNl90IiksCisgICAgKCJjcHA6dHlwZSIsICJ1aW50MzJfdCIpLAorICAgICgiY3BwOnR5cGUiLCAidmlkZW9fc3lzdGVtX3QiKSwKK10KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWVkaWEvaW5kZXgucnN0IGIvRG9jdW1lbnRhdGlvbi9tZWRpYS9pbmRleC5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y4ZjBhZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vbWVkaWEvaW5kZXgucnN0CkBAIC0wLDAgKzEsMTkgQEAKK0xpbnV4IE1lZGlhIFN1YnN5c3RlbSBEb2N1bWVudGF0aW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDb250ZW50czoKKworLi4gdG9jdHJlZTo6CisgICA6bWF4ZGVwdGg6IDIKKworICAgbWVkaWFfdWFwaQorICAgbWVkaWFfa2FwaQorICAgZHZiLWRyaXZlcnMvaW5kZXgKKyAgIHY0bC1kcml2ZXJzL2luZGV4CisKKy4uIG9ubHk6OiAgc3VicHJvamVjdAorCisgICBJbmRpY2VzCisgICA9PT09PT09CisKKyAgICogOnJlZjpgZ2VuaW5kZXhgCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21lZGlhL3VhcGkvY2VjL2NlYy1mdW5jLW9wZW4ucnN0IGIvRG9jdW1lbnRhdGlvbi9tZWRpYS91YXBpL2NlYy9jZWMtZnVuYy1vcGVuLnJzdAppbmRleCAzOGZkN2UwLi43YzBmOTgxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL21lZGlhL3VhcGkvY2VjL2NlYy1mdW5jLW9wZW4ucnN0CisrKyBiL0RvY3VtZW50YXRpb24vbWVkaWEvdWFwaS9jZWMvY2VjLWZ1bmMtb3Blbi5yc3QKQEAgLTMyLDcgKzMyLDcgQEAKICAgICBPcGVuIGZsYWdzLiBBY2Nlc3MgbW9kZSBtdXN0IGJlIGBgT19SRFdSYGAuCiAKICAgICBXaGVuIHRoZSBgYE9fTk9OQkxPQ0tgYCBmbGFnIGlzIGdpdmVuLCB0aGUKLSAgICA6cmVmOmBDRUNfUkVDRUlWRSA8Q0VDX1JFQ0VJVkU+YCBhbmQgOnJlZjpgQ0VDX0RRRVZFTlQgPENFQ19EUUVWRU5UPmAgaW9jdGxzCisgICAgOnJlZjpgQ0VDX1JFQ0VJVkUgPENFQ19SRUNFSVZFPmAgYW5kIDpjOmZ1bmM6YENFQ19EUUVWRU5UYCBpb2N0bHMKICAgICB3aWxsIHJldHVybiB0aGUgYGBFQUdBSU5gYCBlcnJvciBjb2RlIHdoZW4gbm8gbWVzc2FnZSBvciBldmVudCBpcyBhdmFpbGFibGUsIGFuZAogICAgIGlvY3RscyA6cmVmOmBDRUNfVFJBTlNNSVQgPENFQ19UUkFOU01JVD5gLAogICAgIDpyZWY6YENFQ19BREFQX1NfUEhZU19BRERSIDxDRUNfQURBUF9TX1BIWVNfQUREUj5gIGFuZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tZWRpYS91YXBpL2NlYy9jZWMtaW9jLWFkYXAtZy1sb2ctYWRkcnMucnN0IGIvRG9jdW1lbnRhdGlvbi9tZWRpYS91YXBpL2NlYy9jZWMtaW9jLWFkYXAtZy1sb2ctYWRkcnMucnN0CmluZGV4IDA0ZWU5MDAuLjIwMWQ0ODMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbWVkaWEvdWFwaS9jZWMvY2VjLWlvYy1hZGFwLWctbG9nLWFkZHJzLnJzdAorKysgYi9Eb2N1bWVudGF0aW9uL21lZGlhL3VhcGkvY2VjL2NlYy1pb2MtYWRhcC1nLWxvZy1hZGRycy5yc3QKQEAgLTE0NCw3ICsxNDQsNyBAQAogCiAgICAgICAgLSAgYGBmbGFnc2BgCiAKLSAgICAgICAtICBGbGFncy4gTm8gZmxhZ3MgYXJlIGRlZmluZWQgeWV0LCBzbyBzZXQgdGhpcyB0byAwLgorICAgICAgIC0gIEZsYWdzLiBTZWUgOnJlZjpgY2VjLWxvZy1hZGRycy1mbGFnc2AgZm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgZmxhZ3MuCiAKICAgICAtICAuLiByb3cgNwogCkBAIC0yMDEsNiArMjAxLDI1IEBACiAgICAgICAgICAgZ2l2ZSB0aGUgQ0VDIGZyYW1ld29yayBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2UgdHlwZSwgZXZlbgogICAgICAgICAgIHRob3VnaCB0aGUgZnJhbWV3b3JrIHdvbid0IHVzZSBpdCBkaXJlY3RseSBpbiB0aGUgQ0VDIG1lc3NhZ2UuCiAKKy4uIF9jZWMtbG9nLWFkZHJzLWZsYWdzOgorCisuLiBmbGF0LXRhYmxlOjogRmxhZ3MgZm9yIHN0cnVjdCBjZWNfbG9nX2FkZHJzCisgICAgOmhlYWRlci1yb3dzOiAgMAorICAgIDpzdHViLWNvbHVtbnM6IDAKKyAgICA6d2lkdGhzOiAgICAgICAzIDEgNAorCisKKyAgICAtICAuLiBfYENFQy1MT0ctQUREUlMtRkwtQUxMT1ctVU5SRUctRkFMTEJBQ0tgOgorCisgICAgICAgLSAgYGBDRUNfTE9HX0FERFJTX0ZMX0FMTE9XX1VOUkVHX0ZBTExCQUNLYGAKKworICAgICAgIC0gIDEKKworICAgICAgIC0gIEJ5IGRlZmF1bHQgaWYgbm8gbG9naWNhbCBhZGRyZXNzIG9mIHRoZSByZXF1ZXN0ZWQgdHlwZSBjYW4gYmUgY2xhaW1lZCwgdGhlbgorCSAgaXQgd2lsbCBnbyBiYWNrIHRvIHRoZSB1bmNvbmZpZ3VyZWQgc3RhdGUuIElmIHRoaXMgZmxhZyBpcyBzZXQsIHRoZW4gaXQgd2lsbAorCSAgZmFsbGJhY2sgdG8gdGhlIFVucmVnaXN0ZXJlZCBsb2dpY2FsIGFkZHJlc3MuIE5vdGUgdGhhdCBpZiB0aGUgVW5yZWdpc3RlcmVkCisJICBsb2dpY2FsIGFkZHJlc3Mgd2FzIGV4cGxpY2l0bHkgcmVxdWVzdGVkLCB0aGVuIHRoaXMgZmxhZyBoYXMgbm8gZWZmZWN0LgorCiAuLiBfY2VjLXZlcnNpb25zOgogCiAuLiBmbGF0LXRhYmxlOjogQ0VDIFZlcnNpb25zCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21lZGlhL3VhcGkvY2VjL2NlYy1pb2MtZHFldmVudC5yc3QgYi9Eb2N1bWVudGF0aW9uL21lZGlhL3VhcGkvY2VjL2NlYy1pb2MtZHFldmVudC5yc3QKaW5kZXggN2E2ZDZkMC4uZjhjYWEyOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9tZWRpYS91YXBpL2NlYy9jZWMtaW9jLWRxZXZlbnQucnN0CisrKyBiL0RvY3VtZW50YXRpb24vbWVkaWEvdWFwaS9jZWMvY2VjLWlvYy1kcWV2ZW50LnJzdApAQCAtMTUsNyArMTUsOCBAQAogU3lub3BzaXMKID09PT09PT09CiAKLS4uIGNwcDpmdW5jdGlvbjo6IGludCBpb2N0bCggaW50IGZkLCBpbnQgcmVxdWVzdCwgc3RydWN0IGNlY19ldmVudCAqYXJncCApCisuLiBjOmZ1bmN0aW9uOjogaW50IGlvY3RsKCBpbnQgZmQsIGludCByZXF1ZXN0LCBzdHJ1Y3QgY2VjX2V2ZW50ICphcmdwICkKKyAgIDpuYW1lOiBDRUNfRFFFVkVOVAogCiBBcmd1bWVudHMKID09PT09PT09PQpAQCAtMzYsNyArMzcsNyBAQAogICAgYW5kIGlzIGN1cnJlbnRseSBvbmx5IGF2YWlsYWJsZSBhcyBhIHN0YWdpbmcga2VybmVsIG1vZHVsZS4KIAogQ0VDIGRldmljZXMgY2FuIHNlbmQgYXN5bmNocm9ub3VzIGV2ZW50cy4gVGhlc2UgY2FuIGJlIHJldHJpZXZlZCBieQotY2FsbGluZyA6cmVmOmBpb2N0bCBDRUNfRFFFVkVOVCA8Q0VDX0RRRVZFTlQ+YC4gSWYgdGhlIGZpbGUgZGVzY3JpcHRvciBpcyBpbgorY2FsbGluZyA6YzpmdW5jOmBDRUNfRFFFVkVOVGAuIElmIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgaW4KIG5vbi1ibG9ja2luZyBtb2RlIGFuZCBubyBldmVudCBpcyBwZW5kaW5nLCB0aGVuIGl0IHdpbGwgcmV0dXJuIC0xIGFuZAogc2V0IGVycm5vIHRvIHRoZSBgYEVBR0FJTmBgIGVycm9yIGNvZGUuCiAKQEAgLTY0LDcgKzY1LDggQEAKIAogICAgICAgIC0gIGBgcGh5c19hZGRyYGAKIAotICAgICAgIC0gIFRoZSBjdXJyZW50IHBoeXNpY2FsIGFkZHJlc3MuCisgICAgICAgLSAgVGhlIGN1cnJlbnQgcGh5c2ljYWwgYWRkcmVzcy4gVGhpcyBpcyBgYENFQ19QSFlTX0FERFJfSU5WQUxJRGBgIGlmIG5vCisgICAgICAgICAgdmFsaWQgcGh5c2ljYWwgYWRkcmVzcyBpcyBzZXQuCiAKICAgICAtICAuLiByb3cgMgogCkBAIC03Miw3ICs3NCwxMCBAQAogCiAgICAgICAgLSAgYGBsb2dfYWRkcl9tYXNrYGAKIAotICAgICAgIC0gIFRoZSBjdXJyZW50IHNldCBvZiBjbGFpbWVkIGxvZ2ljYWwgYWRkcmVzc2VzLgorICAgICAgIC0gIFRoZSBjdXJyZW50IHNldCBvZiBjbGFpbWVkIGxvZ2ljYWwgYWRkcmVzc2VzLiBUaGlzIGlzIDAgaWYgbm8gbG9naWNhbAorICAgICAgICAgIGFkZHJlc3NlcyBhcmUgY2xhaW1lZCBvciBpZiBgYHBoeXNfYWRkcmBgIGlzIGBgQ0VDX1BIWVNfQUREUl9JTlZBTElEYGAuCisJICBJZiBiaXQgMTUgaXMgc2V0IChgYDEgPDwgQ0VDX0xPR19BRERSX1VOUkVHSVNURVJFRGBgKSB0aGVuIHRoaXMgZGV2aWNlCisJICBoYXMgdGhlIHVucmVnaXN0ZXJlZCBsb2dpY2FsIGFkZHJlc3MuIEluIHRoYXQgY2FzZSBhbGwgb3RoZXIgYml0cyBhcmUgMC4KIAogCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWVtb3J5LWJhcnJpZXJzLnR4dCBiL0RvY3VtZW50YXRpb24vbWVtb3J5LWJhcnJpZXJzLnR4dAppbmRleCBhNGQwYTk5Li5iYTgxOGVjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL21lbW9yeS1iYXJyaWVycy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9tZW1vcnktYmFycmllcnMudHh0CkBAIC02MDksNyArNjA5LDcgQEAKIFRoZSBkYXRhLWRlcGVuZGVuY3kgYmFycmllciBtdXN0IG9yZGVyIHRoZSByZWFkIGludG8gUSB3aXRoIHRoZSBzdG9yZQogaW50byAqUS4gIFRoaXMgcHJvaGliaXRzIHRoaXMgb3V0Y29tZToKIAotCShRID09IEIpICYmIChCID09IDQpCisJKFEgPT0gJkIpICYmIChCID09IDQpCiAKIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBwYXR0ZXJuIHNob3VsZCBiZSByYXJlLiAgQWZ0ZXIgYWxsLCB0aGUgd2hvbGUgcG9pbnQKIG9mIGRlcGVuZGVuY3kgb3JkZXJpbmcgaXMgdG8gLXByZXZlbnQtIHdyaXRlcyB0byB0aGUgZGF0YSBzdHJ1Y3R1cmUsIGFsb25nCkBAIC0xOTI4LDYgKzE5MjgsNyBAQAogCiAgICAgIFNlZSBEb2N1bWVudGF0aW9uL0RNQS1BUEkudHh0IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGNvbnNpc3RlbnQgbWVtb3J5LgogCisKIE1NSU8gV1JJVEUgQkFSUklFUgogLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTIwNzUsNyArMjA3Niw3IEBACiBhbnl0aGluZyBhdCBhbGwgLSBlc3BlY2lhbGx5IHdpdGggcmVzcGVjdCB0byBJL08gYWNjZXNzZXMgLSB1bmxlc3MgY29tYmluZWQKIHdpdGggaW50ZXJydXB0IGRpc2FibGluZyBvcGVyYXRpb25zLgogCi1TZWUgYWxzbyB0aGUgc2VjdGlvbiBvbiAiSW50ZXItQ1BVIGxvY2tpbmcgYmFycmllciBlZmZlY3RzIi4KK1NlZSBhbHNvIHRoZSBzZWN0aW9uIG9uICJJbnRlci1DUFUgYWNxdWlyaW5nIGJhcnJpZXIgZWZmZWN0cyIuCiAKIAogQXMgYW4gZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZzoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy8wMC1JTkRFWAppbmRleCA0MTUxNTRhLi5hNzY5Nzc4MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nLzAwLUlOREVYCisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy8wMC1JTkRFWApAQCAtNzQsNiArNzQsOCBAQAogCS0gVGhlIEROUyByZXNvbHZlciBtb2R1bGUgYWxsb3dzIGtlcm5lbCBzZXJ2aWVzIHRvIG1ha2UgRE5TIHF1ZXJpZXMuCiBkcml2ZXIudHh0CiAJLSBTb2Z0bmV0IGRyaXZlciBpc3N1ZXMuCitlbmEudHh0CisJLSBpbmZvIG9uIEFtYXpvbidzIEVsYXN0aWMgTmV0d29yayBBZGFwdGVyIChFTkEpCiBlMTAwLnR4dAogCS0gaW5mbyBvbiBJbnRlbCdzIEV0aGVyRXhwcmVzcyBQUk8vMTAwIGxpbmUgb2YgMTAvMTAwIGJvYXJkcwogZTEwMDAudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYmF0bWFuLWFkdi50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYmF0bWFuLWFkdi50eHQKaW5kZXggMWI1ZTdhNy4uOGE4ZDNkOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JhdG1hbi1hZHYudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9iYXRtYW4tYWR2LnR4dApAQCAtNDMsMTAgKzQzLDE1IEBACiByZWxvYWQgdGhlIG1vZHVsZSBpZiB5b3UgcGx1ZyB5b3VyIFVTQiB3aWZpIGFkYXB0ZXIgaW50byB5b3VyIG1hLQogY2hpbmUgYWZ0ZXIgYmF0bWFuIGFkdmFuY2VkIHdhcyBpbml0aWFsbHkgbG9hZGVkLgogCi1UbyBhY3RpdmF0ZSBhICBnaXZlbiAgaW50ZXJmYWNlICBzaW1wbHkgIHdyaXRlICAiYmF0MCIgIGludG8gIGl0cwotIm1lc2hfaWZhY2UiIGZpbGUgaW5zaWRlIHRoZSBiYXRtYW5fYWR2IHN1YmZvbGRlcjoKK1RoZSBiYXRtYW4tYWR2IHNvZnQtaW50ZXJmYWNlIGNhbiBiZSBjcmVhdGVkIHVzaW5nICB0aGUgIGlwcm91dGUyCit0b29sICJpcCIKIAotIyBlY2hvIGJhdDAgPiAvc3lzL2NsYXNzL25ldC9ldGgwL2JhdG1hbl9hZHYvbWVzaF9pZmFjZQorIyBpcCBsaW5rIGFkZCBuYW1lIGJhdDAgdHlwZSBiYXRhZHYKKworVG8gIGFjdGl2YXRlIGEgIGdpdmVuICBpbnRlcmZhY2UgIHNpbXBseSAgYXR0YWNoIGl0IHRvIHRoZSAiYmF0MCIKK2ludGVyZmFjZQorCisjIGlwIGxpbmsgc2V0IGRldiBldGgwIG1hc3RlciBiYXQwCiAKIFJlcGVhdCAgdGhpcyBzdGVwIGZvciBhbGwgaW50ZXJmYWNlcyB5b3Ugd2lzaCB0byBhZGQuICBOb3cgYmF0bWFuCiBzdGFydHMgdXNpbmcvYnJvYWRjYXN0aW5nIG9uIHRoaXMvdGhlc2UgaW50ZXJmYWNlKHMpLgpAQCAtNTYsMTAgKzYxLDEwIEBACiAjIGNhdCAvc3lzL2NsYXNzL25ldC9ldGgwL2JhdG1hbl9hZHYvaWZhY2Vfc3RhdHVzCiAjIGFjdGl2ZQogCi1UbyBkZWFjdGl2YXRlIGFuIGludGVyZmFjZSB5b3UgaGF2ZSAgdG8gIHdyaXRlICAibm9uZSIgIGludG8gIGl0cwotIm1lc2hfaWZhY2UiIGZpbGU6CitUbyAgZGVhY3RpdmF0ZSAgYW4gIGludGVyZmFjZSAgeW91ICBoYXZlICAgdG8gIGRldGFjaCBpdCBmcm9tIHRoZQorImJhdDAiIGludGVyZmFjZToKIAotIyBlY2hvIG5vbmUgPiAvc3lzL2NsYXNzL25ldC9ldGgwL2JhdG1hbl9hZHYvbWVzaF9pZmFjZQorIyBpcCBsaW5rIHNldCBkZXYgZXRoMCBub21hc3RlcgogCiAKIEFsbCAgbWVzaCAgd2lkZSAgc2V0dGluZ3MgIGNhbiBiZSBmb3VuZCBpbiBiYXRtYW4ncyBvd24gaW50ZXJmYWNlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZHNhL2RzYS50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZHNhL2RzYS50eHQKaW5kZXggOWQwNWVkNy4uNmQ2YzA3YyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RzYS9kc2EudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kc2EvZHNhLnR4dApAQCAtMjI3LDkgKzIyNyw5IEBACiAKIGRzYV9zd2l0Y2g6IHN0cnVjdHVyZSBkZXNjcmliaW5nIGEgc3dpdGNoIGRldmljZSBpbiB0aGUgdHJlZSwgcmVmZXJlbmNpbmcgYQogZHNhX3N3aXRjaF90cmVlIGFzIGEgYmFja3BvaW50ZXIsIHNsYXZlIG5ldHdvcmsgZGV2aWNlcywgbWFzdGVyIG5ldHdvcmsgZGV2aWNlLAotYW5kIGEgcmVmZXJlbmNlIHRvIHRoZSBiYWNraW5nIGRzYV9zd2l0Y2hfZHJpdmVyCithbmQgYSByZWZlcmVuY2UgdG8gdGhlIGJhY2tpbmcgZHNhX3N3aXRjaF9vcHMKIAotZHNhX3N3aXRjaF9kcml2ZXI6IHN0cnVjdHVyZSByZWZlcmVuY2luZyBmdW5jdGlvbiBwb2ludGVycywgc2VlIGJlbG93IGZvciBhIGZ1bGwKK2RzYV9zd2l0Y2hfb3BzOiBzdHJ1Y3R1cmUgcmVmZXJlbmNpbmcgZnVuY3Rpb24gcG9pbnRlcnMsIHNlZSBiZWxvdyBmb3IgYSBmdWxsCiBkZXNjcmlwdGlvbi4KIAogRGVzaWduIGxpbWl0YXRpb25zCkBAIC0zNTcsMTAgKzM1NywxMCBAQAogRHJpdmVyIGRldmVsb3BtZW50CiA9PT09PT09PT09PT09PT09PT0KIAotRFNBIHN3aXRjaCBkcml2ZXJzIG5lZWQgdG8gaW1wbGVtZW50IGEgZHNhX3N3aXRjaF9kcml2ZXIgc3RydWN0dXJlIHdoaWNoIHdpbGwKK0RTQSBzd2l0Y2ggZHJpdmVycyBuZWVkIHRvIGltcGxlbWVudCBhIGRzYV9zd2l0Y2hfb3BzIHN0cnVjdHVyZSB3aGljaCB3aWxsCiBjb250YWluIHRoZSB2YXJpb3VzIG1lbWJlcnMgZGVzY3JpYmVkIGJlbG93LgogCi1yZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKCkgcmVnaXN0ZXJzIHRoaXMgZHNhX3N3aXRjaF9kcml2ZXIgaW4gaXRzIGludGVybmFsIGxpc3QKK3JlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoKSByZWdpc3RlcnMgdGhpcyBkc2Ffc3dpdGNoX29wcyBpbiBpdHMgaW50ZXJuYWwgbGlzdAogb2YgZHJpdmVycyB0byBwcm9iZSBmb3IuIHVucmVnaXN0ZXJfc3dpdGNoX2RyaXZlcigpIGRvZXMgdGhlIGV4YWN0IG9wcG9zaXRlLgogCiBVbmxlc3MgcmVxdWVzdGVkIGRpZmZlcmVudGx5IGJ5IHNldHRpbmcgdGhlIHByaXZfc2l6ZSBtZW1iZXIgYWNjb3JkaW5nbHksIERTQQpAQCAtMzc5LDcgKzM3OSw3IEBACiAgIGJ1c2VzLCByZXR1cm4gYSBub24tTlVMTCBzdHJpbmcKIAogLSBzZXR1cDogc2V0dXAgZnVuY3Rpb24gZm9yIHRoZSBzd2l0Y2gsIHRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHNldHRpbmcKLSAgdXAgdGhlIGRzYV9zd2l0Y2hfZHJpdmVyIHByaXZhdGUgc3RydWN0dXJlIHdpdGggYWxsIGl0IG5lZWRzOiByZWdpc3RlciBtYXBzLAorICB1cCB0aGUgZHNhX3N3aXRjaF9vcHMgcHJpdmF0ZSBzdHJ1Y3R1cmUgd2l0aCBhbGwgaXQgbmVlZHM6IHJlZ2lzdGVyIG1hcHMsCiAgIGludGVycnVwdHMsIG11dGV4ZXMsIGxvY2tzIGV0Yy4uIFRoaXMgZnVuY3Rpb24gaXMgYWxzbyBleHBlY3RlZCB0byBwcm9wZXJseQogICBjb25maWd1cmUgdGhlIHN3aXRjaCB0byBzZXBhcmF0ZSBhbGwgbmV0d29yayBpbnRlcmZhY2VzIGZyb20gZWFjaCBvdGhlciwgdGhhdAogICBpcywgdGhleSBzaG91bGQgYmUgaXNvbGF0ZWQgYnkgdGhlIHN3aXRjaCBoYXJkd2FyZSBpdHNlbGYsIHR5cGljYWxseSBieSBjcmVhdGluZwpAQCAtNTg0LDI5ICs1ODQsMzIgQEAKICAgZnVuY3Rpb24gdGhhdCB0aGUgZHJpdmVyIGhhcyB0byBjYWxsIGZvciBlYWNoIE1BQyBhZGRyZXNzIGtub3duIHRvIGJlIGJlaGluZAogICB0aGUgZ2l2ZW4gcG9ydC4gQSBzd2l0Y2hkZXYgb2JqZWN0IGlzIHVzZWQgdG8gY2FycnkgdGhlIFZJRCBhbmQgRkRCIGluZm8uCiAKKy0gcG9ydF9tZGJfcHJlcGFyZTogYnJpZGdlIGxheWVyIGZ1bmN0aW9uIGludm9rZWQgd2hlbiB0aGUgYnJpZGdlIHByZXBhcmVzIHRoZQorICBpbnN0YWxsYXRpb24gb2YgYSBtdWx0aWNhc3QgZGF0YWJhc2UgZW50cnkuIElmIHRoZSBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCwKKyAgdGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIC1FT1BOT1RTVVBQIHRvIGluZm9ybSB0aGUgYnJpZGdlIGNvZGUgdG8gZmFsbGJhY2sKKyAgdG8gYSBzb2Z0d2FyZSBpbXBsZW1lbnRhdGlvbi4gTm8gaGFyZHdhcmUgc2V0dXAgbXVzdCBiZSBkb25lIGluIHRoaXMgZnVuY3Rpb24uCisgIFNlZSBwb3J0X2ZkYl9hZGQgZm9yIHRoaXMgYW5kIGRldGFpbHMuCisKKy0gcG9ydF9tZGJfYWRkOiBicmlkZ2UgbGF5ZXIgZnVuY3Rpb24gaW52b2tlZCB3aGVuIHRoZSBicmlkZ2Ugd2FudHMgdG8gaW5zdGFsbAorICBhIG11bHRpY2FzdCBkYXRhYmFzZSBlbnRyeSwgdGhlIHN3aXRjaCBoYXJkd2FyZSBzaG91bGQgYmUgcHJvZ3JhbW1lZCB3aXRoIHRoZQorICBzcGVjaWZpZWQgYWRkcmVzcyBpbiB0aGUgc3BlY2lmaWVkIFZMQU4gSUQgaW4gdGhlIGZvcndhcmRpbmcgZGF0YWJhc2UKKyAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVkxBTiBJRC4KKworTm90ZTogVkxBTiBJRCAwIGNvcnJlc3BvbmRzIHRvIHRoZSBwb3J0IHByaXZhdGUgZGF0YWJhc2UsIHdoaWNoLCBpbiB0aGUgY29udGV4dAorb2YgRFNBLCB3b3VsZCBiZSB0aGUgaXRzIHBvcnQtYmFzZWQgVkxBTiwgdXNlZCBieSB0aGUgYXNzb2NpYXRlZCBicmlkZ2UgZGV2aWNlLgorCistIHBvcnRfbWRiX2RlbDogYnJpZGdlIGxheWVyIGZ1bmN0aW9uIGludm9rZWQgd2hlbiB0aGUgYnJpZGdlIHdhbnRzIHRvIHJlbW92ZSBhCisgIG11bHRpY2FzdCBkYXRhYmFzZSBlbnRyeSwgdGhlIHN3aXRjaCBoYXJkd2FyZSBzaG91bGQgYmUgcHJvZ3JhbW1lZCB0byBkZWxldGUKKyAgdGhlIHNwZWNpZmllZCBNQUMgYWRkcmVzcyBmcm9tIHRoZSBzcGVjaWZpZWQgVkxBTiBJRCBpZiBpdCB3YXMgbWFwcGVkIGludG8KKyAgdGhpcyBwb3J0IGZvcndhcmRpbmcgZGF0YWJhc2UuCisKKy0gcG9ydF9tZGJfZHVtcDogYnJpZGdlIGxheWVyIGZ1bmN0aW9uIGludm9rZWQgd2l0aCBhIHN3aXRjaGRldiBjYWxsYmFjaworICBmdW5jdGlvbiB0aGF0IHRoZSBkcml2ZXIgaGFzIHRvIGNhbGwgZm9yIGVhY2ggTUFDIGFkZHJlc3Mga25vd24gdG8gYmUgYmVoaW5kCisgIHRoZSBnaXZlbiBwb3J0LiBBIHN3aXRjaGRldiBvYmplY3QgaXMgdXNlZCB0byBjYXJyeSB0aGUgVklEIGFuZCBNREIgaW5mby4KKwogVE9ETwogPT09PQogCi1UaGUgcGxhdGZvcm0gZGV2aWNlIHByb2JsZW0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRFNBIGlzIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBhcyBhIHBsYXRmb3JtIGRldmljZSBkcml2ZXIgd2hpY2ggaXMgZmFyIGZyb20gaWRlYWwKLWFzIHdhcyBkaXNjdXNzZWQgaW4gdGhpcyB0aHJlYWQ6Ci0KLWh0dHA6Ly9wZXJtYWxpbmsuZ21hbmUub3JnL2dtYW5lLmxpbnV4Lm5ldHdvcmsvMzI5ODQ4Ci0KLVRoaXMgYmFzaWNhbGx5IHByZXZlbnRzIHRoZSBkZXZpY2UgZHJpdmVyIG1vZGVsIHRvIGJlIHByb3Blcmx5IHVzZWQgYW5kIGFwcGxpZWQsCi1hbmQgc3VwcG9ydCBub24tTURJTywgbm9uLU1NSU8gRXRoZXJuZXQgY29ubmVjdGVkIHN3aXRjaGVzLgotCi1Bbm90aGVyIHByb2JsZW0gd2l0aCB0aGUgcGxhdGZvcm0gZGV2aWNlIGRyaXZlciBhcHByb2FjaCBpcyB0aGF0IGl0IHByZXZlbnRzIHRoZQotdXNlIG9mIGEgbW9kdWxhciBzd2l0Y2ggZHJpdmVycyBidWlsZCBkdWUgdG8gYSBjaXJjdWxhciBkZXBlbmRlbmN5LCBpbGx1c3RyYXRlZAotaGVyZToKLQotaHR0cDovL2NvbW1lbnRzLmdtYW5lLm9yZy9nbWFuZS5saW51eC5uZXR3b3JrLzM0NTgwMwotCi1BdHRlbXB0cyBvZiByZXdvcmtpbmcgdGhpcyBoYXMgYmVlbiBkb25lIGhlcmU6Ci0KLWh0dHBzOi8vbHduLm5ldC9BcnRpY2xlcy82NDMxNDkvCi0KIE1ha2luZyBTV0lUQ0hERVYgYW5kIERTQSBjb252ZXJnZSB0b3dhcmRzIGFuIHVuaWZpZWQgY29kZWJhc2UKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2VuYS50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZW5hLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjRiNmY1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2VuYS50eHQKQEAgLTAsMCArMSwzMDUgQEAKK0xpbnV4IGtlcm5lbCBkcml2ZXIgZm9yIEVsYXN0aWMgTmV0d29yayBBZGFwdGVyIChFTkEpIGZhbWlseToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworT3ZlcnZpZXc6Cis9PT09PT09PT0KK0VOQSBpcyBhIG5ldHdvcmtpbmcgaW50ZXJmYWNlIGRlc2lnbmVkIHRvIG1ha2UgZ29vZCB1c2Ugb2YgbW9kZXJuIENQVQorZmVhdHVyZXMgYW5kIHN5c3RlbSBhcmNoaXRlY3R1cmVzLgorCitUaGUgRU5BIGRldmljZSBleHBvc2VzIGEgbGlnaHR3ZWlnaHQgbWFuYWdlbWVudCBpbnRlcmZhY2Ugd2l0aCBhCittaW5pbWFsIHNldCBvZiBtZW1vcnkgbWFwcGVkIHJlZ2lzdGVycyBhbmQgZXh0ZW5kYWJsZSBjb21tYW5kIHNldAordGhyb3VnaCBhbiBBZG1pbiBRdWV1ZS4KKworVGhlIGRyaXZlciBzdXBwb3J0cyBhIHJhbmdlIG9mIEVOQSBkZXZpY2VzLCBpcyBsaW5rLXNwZWVkIGluZGVwZW5kZW50CisoaS5lLiwgdGhlIHNhbWUgZHJpdmVyIGlzIHVzZWQgZm9yIDEwR2JFLCAyNUdiRSwgNDBHYkUsIGV0Yy4pLCBhbmQgaGFzCithIG5lZ290aWF0ZWQgYW5kIGV4dGVuZGFibGUgZmVhdHVyZSBzZXQuCisKK1NvbWUgRU5BIGRldmljZXMgc3VwcG9ydCBTUi1JT1YuIFRoaXMgZHJpdmVyIGlzIHVzZWQgZm9yIGJvdGggdGhlCitTUi1JT1YgUGh5c2ljYWwgRnVuY3Rpb24gKFBGKSBhbmQgVmlydHVhbCBGdW5jdGlvbiAoVkYpIGRldmljZXMuCisKK0VOQSBkZXZpY2VzIGVuYWJsZSBoaWdoIHNwZWVkIGFuZCBsb3cgb3ZlcmhlYWQgbmV0d29yayB0cmFmZmljCitwcm9jZXNzaW5nIGJ5IHByb3ZpZGluZyBtdWx0aXBsZSBUeC9SeCBxdWV1ZSBwYWlycyAodGhlIG1heGltdW0gbnVtYmVyCitpcyBhZHZlcnRpc2VkIGJ5IHRoZSBkZXZpY2UgdmlhIHRoZSBBZG1pbiBRdWV1ZSksIGEgZGVkaWNhdGVkIE1TSS1YCitpbnRlcnJ1cHQgdmVjdG9yIHBlciBUeC9SeCBxdWV1ZSBwYWlyLCBhZGFwdGl2ZSBpbnRlcnJ1cHQgbW9kZXJhdGlvbiwKK2FuZCBDUFUgY2FjaGVsaW5lIG9wdGltaXplZCBkYXRhIHBsYWNlbWVudC4KKworVGhlIEVOQSBkcml2ZXIgc3VwcG9ydHMgaW5kdXN0cnkgc3RhbmRhcmQgVENQL0lQIG9mZmxvYWQgZmVhdHVyZXMgc3VjaAorYXMgY2hlY2tzdW0gb2ZmbG9hZCBhbmQgVENQIHRyYW5zbWl0IHNlZ21lbnRhdGlvbiBvZmZsb2FkIChUU08pLgorUmVjZWl2ZS1zaWRlIHNjYWxpbmcgKFJTUykgaXMgc3VwcG9ydGVkIGZvciBtdWx0aS1jb3JlIHNjYWxpbmcuCisKK1RoZSBFTkEgZHJpdmVyIGFuZCBpdHMgY29ycmVzcG9uZGluZyBkZXZpY2VzIGltcGxlbWVudCBoZWFsdGgKK21vbml0b3JpbmcgbWVjaGFuaXNtcyBzdWNoIGFzIHdhdGNoZG9nLCBlbmFibGluZyB0aGUgZGV2aWNlIGFuZCBkcml2ZXIKK3RvIHJlY292ZXIgaW4gYSBtYW5uZXIgdHJhbnNwYXJlbnQgdG8gdGhlIGFwcGxpY2F0aW9uLCBhcyB3ZWxsIGFzCitkZWJ1ZyBsb2dzLgorCitTb21lIG9mIHRoZSBFTkEgZGV2aWNlcyBzdXBwb3J0IGEgd29ya2luZyBtb2RlIGNhbGxlZCBMb3ctbGF0ZW5jeQorUXVldWUgKExMUSksIHdoaWNoIHNhdmVzIHNldmVyYWwgbW9yZSBtaWNyb3NlY29uZHMuCisKK1N1cHBvcnRlZCBQQ0kgdmVuZG9yIElEL2RldmljZSBJRHM6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorMWQwZjowZWMyIC0gRU5BIFBGCisxZDBmOjFlYzIgLSBFTkEgUEYgd2l0aCBMTFEgc3VwcG9ydAorMWQwZjplYzIwIC0gRU5BIFZGCisxZDBmOmVjMjEgLSBFTkEgVkYgd2l0aCBMTFEgc3VwcG9ydAorCitFTkEgU291cmNlIENvZGUgRGlyZWN0b3J5IFN0cnVjdHVyZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZW5hX2NvbS5bY2hdICAgICAgLSBNYW5hZ2VtZW50IGNvbW11bmljYXRpb24gbGF5ZXIuIFRoaXMgbGF5ZXIgaXMKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2libGUgZm9yIHRoZSBoYW5kbGluZyBhbGwgdGhlIG1hbmFnZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgKGFkbWluKSBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIGRldmljZSBhbmQgdGhlCisgICAgICAgICAgICAgICAgICAgIGRyaXZlci4KK2VuYV9ldGhfY29tLltjaF0gIC0gVHgvUnggZGF0YSBwYXRoLgorZW5hX2FkbWluX2RlZnMuaCAgLSBEZWZpbml0aW9uIG9mIEVOQSBtYW5hZ2VtZW50IGludGVyZmFjZS4KK2VuYV9ldGhfaW9fZGVmcy5oIC0gRGVmaW5pdGlvbiBvZiBFTkEgZGF0YSBwYXRoIGludGVyZmFjZS4KK2VuYV9jb21tb25fZGVmcy5oIC0gQ29tbW9uIGRlZmluaXRpb25zIGZvciBlbmFfY29tIGxheWVyLgorZW5hX3JlZ3NfZGVmcy5oICAgLSBEZWZpbml0aW9uIG9mIEVOQSBQQ0kgbWVtb3J5LW1hcHBlZCAoTU1JTykgcmVnaXN0ZXJzLgorZW5hX25ldGRldi5bY2hdICAgLSBNYWluIExpbnV4IGtlcm5lbCBkcml2ZXIuCitlbmFfc3lmc2ZzLltjaF0gICAtIFN5c2ZzIGZpbGVzLgorZW5hX2V0aHRvb2wuYyAgICAgLSBldGh0b29sIGNhbGxiYWNrcy4KK2VuYV9wY2lfaWRfdGJsLmggIC0gU3VwcG9ydGVkIGRldmljZSBJRHMuCisKK01hbmFnZW1lbnQgSW50ZXJmYWNlOgorPT09PT09PT09PT09PT09PT09PT09CitFTkEgbWFuYWdlbWVudCBpbnRlcmZhY2UgaXMgZXhwb3NlZCBieSBtZWFucyBvZjoKKy0gUENJZSBDb25maWd1cmF0aW9uIFNwYWNlCistIERldmljZSBSZWdpc3RlcnMKKy0gQWRtaW4gUXVldWUgKEFRKSBhbmQgQWRtaW4gQ29tcGxldGlvbiBRdWV1ZSAoQUNRKQorLSBBc3luY2hyb25vdXMgRXZlbnQgTm90aWZpY2F0aW9uIFF1ZXVlIChBRU5RKQorCitFTkEgZGV2aWNlIE1NSU8gUmVnaXN0ZXJzIGFyZSBhY2Nlc3NlZCBvbmx5IGR1cmluZyBkcml2ZXIKK2luaXRpYWxpemF0aW9uIGFuZCBhcmUgbm90IGludm9sdmVkIGluIGZ1cnRoZXIgbm9ybWFsIGRldmljZQorb3BlcmF0aW9uLgorCitBUSBpcyB1c2VkIGZvciBzdWJtaXR0aW5nIG1hbmFnZW1lbnQgY29tbWFuZHMsIGFuZCB0aGUKK3Jlc3VsdHMvcmVzcG9uc2VzIGFyZSByZXBvcnRlZCBhc3luY2hyb25vdXNseSB0aHJvdWdoIEFDUS4KKworRU5BIGludHJvZHVjZXMgYSB2ZXJ5IHNtYWxsIHNldCBvZiBtYW5hZ2VtZW50IGNvbW1hbmRzIHdpdGggcm9vbSBmb3IKK3ZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zLiBNb3N0IG9mIHRoZSBtYW5hZ2VtZW50IG9wZXJhdGlvbnMgYXJlCitmcmFtZWQgaW4gYSBnZW5lcmljIEdldC9TZXQgZmVhdHVyZSBjb21tYW5kLgorCitUaGUgZm9sbG93aW5nIGFkbWluIHF1ZXVlIGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQ6CistIENyZWF0ZSBJL08gc3VibWlzc2lvbiBxdWV1ZQorLSBDcmVhdGUgSS9PIGNvbXBsZXRpb24gcXVldWUKKy0gRGVzdHJveSBJL08gc3VibWlzc2lvbiBxdWV1ZQorLSBEZXN0cm95IEkvTyBjb21wbGV0aW9uIHF1ZXVlCistIEdldCBmZWF0dXJlCistIFNldCBmZWF0dXJlCistIENvbmZpZ3VyZSBBRU5RCistIEdldCBzdGF0aXN0aWNzCisKK1JlZmVyIHRvIGVuYV9hZG1pbl9kZWZzLmggZm9yIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBHZXQvU2V0IEZlYXR1cmUKK3Byb3BlcnRpZXMuCisKK1RoZSBBc3luY2hyb25vdXMgRXZlbnQgTm90aWZpY2F0aW9uIFF1ZXVlIChBRU5RKSBpcyBhIHVuaS1kaXJlY3Rpb25hbAorcXVldWUgdXNlZCBieSB0aGUgRU5BIGRldmljZSB0byBzZW5kIHRvIHRoZSBkcml2ZXIgZXZlbnRzIHRoYXQgY2Fubm90CitiZSByZXBvcnRlZCB1c2luZyBBQ1EuIEFFTlEgZXZlbnRzIGFyZSBzdWJkaXZpZGVkIGludG8gZ3JvdXBzLiBFYWNoCitncm91cCBtYXkgaGF2ZSBtdWx0aXBsZSBzeW5kcm9tZXMsIGFzIHNob3duIGJlbG93CisKK1RoZSBldmVudHMgYXJlOgorCUdyb3VwCQkJU3luZHJvbWUKKwlMaW5rIHN0YXRlIGNoYW5nZQktIFggLQorCUZhdGFsIGVycm9yCQktIFggLQorCU5vdGlmaWNhdGlvbgkJU3VzcGVuZCB0cmFmZmljCisJTm90aWZpY2F0aW9uCQlSZXN1bWUgdHJhZmZpYworCUtlZXAtQWxpdmUJCS0gWCAtCisKK0FDUSBhbmQgQUVOUSBzaGFyZSB0aGUgc2FtZSBNU0ktWCB2ZWN0b3IuCisKK0tlZXAtQWxpdmUgaXMgYSBzcGVjaWFsIG1lY2hhbmlzbSB0aGF0IGFsbG93cyBtb25pdG9yaW5nIG9mIHRoZQorZGV2aWNlJ3MgaGVhbHRoLiBUaGUgZHJpdmVyIG1haW50YWlucyBhIHdhdGNoZG9nIChXRCkgaGFuZGxlciB3aGljaCwKK2lmIGZpcmVkLCBsb2dzIHRoZSBjdXJyZW50IHN0YXRlIGFuZCBzdGF0aXN0aWNzIHRoZW4gcmVzZXRzIGFuZAorcmVzdGFydHMgdGhlIEVOQSBkZXZpY2UgYW5kIGRyaXZlci4gQSBLZWVwLUFsaXZlIGV2ZW50IGlzIGRlbGl2ZXJlZCBieQordGhlIGRldmljZSBldmVyeSBzZWNvbmQuIFRoZSBkcml2ZXIgcmUtYXJtcyB0aGUgV0QgdXBvbiByZWNlcHRpb24gb2YgYQorS2VlcC1BbGl2ZSBldmVudC4gQSBtaXNzZWQgS2VlcC1BbGl2ZSBldmVudCBjYXVzZXMgdGhlIFdEIGhhbmRsZXIgdG8KK2ZpcmUuCisKK0RhdGEgUGF0aCBJbnRlcmZhY2U6Cis9PT09PT09PT09PT09PT09PT09PQorSS9PIG9wZXJhdGlvbnMgYXJlIGJhc2VkIG9uIFR4IGFuZCBSeCBTdWJtaXNzaW9uIFF1ZXVlcyAoVHggU1EgYW5kIFJ4CitTUSBjb3JyZXNwb25kaW5nbHkpLiBFYWNoIFNRIGhhcyBhIGNvbXBsZXRpb24gcXVldWUgKENRKSBhc3NvY2lhdGVkCit3aXRoIGl0LgorCitUaGUgU1FzIGFuZCBDUXMgYXJlIGltcGxlbWVudGVkIGFzIGRlc2NyaXB0b3IgcmluZ3MgaW4gY29udGlndW91cworcGh5c2ljYWwgbWVtb3J5LgorCitUaGUgRU5BIGRyaXZlciBzdXBwb3J0cyB0d28gUXVldWUgT3BlcmF0aW9uIG1vZGVzIGZvciBUeCBTUXM6CistIFJlZ3VsYXIgbW9kZQorICAqIEluIHRoaXMgbW9kZSB0aGUgVHggU1FzIHJlc2lkZSBpbiB0aGUgaG9zdCdzIG1lbW9yeS4gVGhlIEVOQQorICAgIGRldmljZSBmZXRjaGVzIHRoZSBFTkEgVHggZGVzY3JpcHRvcnMgYW5kIHBhY2tldCBkYXRhIGZyb20gaG9zdAorICAgIG1lbW9yeS4KKy0gTG93IExhdGVuY3kgUXVldWUgKExMUSkgbW9kZSBvciAicHVzaC1tb2RlIi4KKyAgKiBJbiB0aGlzIG1vZGUgdGhlIGRyaXZlciBwdXNoZXMgdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3JzIGFuZCB0aGUKKyAgICBmaXJzdCAxMjggYnl0ZXMgb2YgdGhlIHBhY2tldCBkaXJlY3RseSB0byB0aGUgRU5BIGRldmljZSBtZW1vcnkKKyAgICBzcGFjZS4gVGhlIHJlc3Qgb2YgdGhlIHBhY2tldCBwYXlsb2FkIGlzIGZldGNoZWQgYnkgdGhlCisgICAgZGV2aWNlLiBGb3IgdGhpcyBvcGVyYXRpb24gbW9kZSwgdGhlIGRyaXZlciB1c2VzIGEgZGVkaWNhdGVkIFBDSQorICAgIGRldmljZSBtZW1vcnkgQkFSLCB3aGljaCBpcyBtYXBwZWQgd2l0aCB3cml0ZS1jb21iaW5lIGNhcGFiaWxpdHkuCisKK1RoZSBSeCBTUXMgc3VwcG9ydCBvbmx5IHRoZSByZWd1bGFyIG1vZGUuCisKK05vdGU6IE5vdCBhbGwgRU5BIGRldmljZXMgc3VwcG9ydCBMTFEsIGFuZCB0aGlzIGZlYXR1cmUgaXMgbmVnb3RpYXRlZAorICAgICAgd2l0aCB0aGUgZGV2aWNlIHVwb24gaW5pdGlhbGl6YXRpb24uIElmIHRoZSBFTkEgZGV2aWNlIGRvZXMgbm90CisgICAgICBzdXBwb3J0IExMUSBtb2RlLCB0aGUgZHJpdmVyIGZhbGxzIGJhY2sgdG8gdGhlIHJlZ3VsYXIgbW9kZS4KKworVGhlIGRyaXZlciBzdXBwb3J0cyBtdWx0aS1xdWV1ZSBmb3IgYm90aCBUeCBhbmQgUnguIFRoaXMgaGFzIHZhcmlvdXMKK2JlbmVmaXRzOgorLSBSZWR1Y2VkIENQVS90aHJlYWQvcHJvY2VzcyBjb250ZW50aW9uIG9uIGEgZ2l2ZW4gRXRoZXJuZXQgaW50ZXJmYWNlLgorLSBDYWNoZSBtaXNzIHJhdGUgb24gY29tcGxldGlvbiBpcyByZWR1Y2VkLCBwYXJ0aWN1bGFybHkgZm9yIGRhdGEKKyAgY2FjaGUgbGluZXMgdGhhdCBob2xkIHRoZSBza19idWZmIHN0cnVjdHVyZXMuCistIEluY3JlYXNlZCBwcm9jZXNzLWxldmVsIHBhcmFsbGVsaXNtIHdoZW4gaGFuZGxpbmcgcmVjZWl2ZWQgcGFja2V0cy4KKy0gSW5jcmVhc2VkIGRhdGEgY2FjaGUgaGl0IHJhdGUsIGJ5IHN0ZWVyaW5nIGtlcm5lbCBwcm9jZXNzaW5nIG9mCisgIHBhY2tldHMgdG8gdGhlIENQVSwgd2hlcmUgdGhlIGFwcGxpY2F0aW9uIHRocmVhZCBjb25zdW1pbmcgdGhlCisgIHBhY2tldCBpcyBydW5uaW5nLgorLSBJbiBoYXJkd2FyZSBpbnRlcnJ1cHQgcmUtZGlyZWN0aW9uLgorCitJbnRlcnJ1cHQgTW9kZXM6Cis9PT09PT09PT09PT09PT09CitUaGUgZHJpdmVyIGFzc2lnbnMgYSBzaW5nbGUgTVNJLVggdmVjdG9yIHBlciBxdWV1ZSBwYWlyIChmb3IgYm90aCBUeAorYW5kIFJ4IGRpcmVjdGlvbnMpLiBUaGUgZHJpdmVyIGFzc2lnbnMgYW4gYWRkaXRpb25hbCBkZWRpY2F0ZWQgTVNJLVggdmVjdG9yCitmb3IgbWFuYWdlbWVudCAoZm9yIEFDUSBhbmQgQUVOUSkuCisKK01hbmFnZW1lbnQgaW50ZXJydXB0IHJlZ2lzdHJhdGlvbiBpcyBwZXJmb3JtZWQgd2hlbiB0aGUgTGludXgga2VybmVsCitwcm9iZXMgdGhlIGFkYXB0ZXIsIGFuZCBpdCBpcyBkZS1yZWdpc3RlcmVkIHdoZW4gdGhlIGFkYXB0ZXIgaXMKK3JlbW92ZWQuIEkvTyBxdWV1ZSBpbnRlcnJ1cHQgcmVnaXN0cmF0aW9uIGlzIHBlcmZvcm1lZCB3aGVuIHRoZSBMaW51eAoraW50ZXJmYWNlIG9mIHRoZSBhZGFwdGVyIGlzIG9wZW5lZCwgYW5kIGl0IGlzIGRlLXJlZ2lzdGVyZWQgd2hlbiB0aGUKK2ludGVyZmFjZSBpcyBjbG9zZWQuCisKK1RoZSBtYW5hZ2VtZW50IGludGVycnVwdCBpcyBuYW1lZDoKKyAgIGVuYS1tZ21udEBwY2k6PFBDSSBkb21haW46YnVzOnNsb3QuZnVuY3Rpb24+CithbmQgZm9yIGVhY2ggcXVldWUgcGFpciwgYW4gaW50ZXJydXB0IGlzIG5hbWVkOgorICAgPGludGVyZmFjZSBuYW1lPi1UeC1SeC08cXVldWUgaW5kZXg+CisKK1RoZSBFTkEgZGV2aWNlIG9wZXJhdGVzIGluIGF1dG8tbWFzayBhbmQgYXV0by1jbGVhciBpbnRlcnJ1cHQKK21vZGVzLiBUaGF0IGlzLCBvbmNlIE1TSS1YIGlzIGRlbGl2ZXJlZCB0byB0aGUgaG9zdCwgaXRzIENhdXNlIGJpdCBpcworYXV0b21hdGljYWxseSBjbGVhcmVkIGFuZCB0aGUgaW50ZXJydXB0IGlzIG1hc2tlZC4gVGhlIGludGVycnVwdCBpcwordW5tYXNrZWQgYnkgdGhlIGRyaXZlciBhZnRlciBOQVBJIHByb2Nlc3NpbmcgaXMgY29tcGxldGUuCisKK0ludGVycnVwdCBNb2RlcmF0aW9uOgorPT09PT09PT09PT09PT09PT09PT09CitFTkEgZHJpdmVyIGFuZCBkZXZpY2UgY2FuIG9wZXJhdGUgaW4gY29udmVudGlvbmFsIG9yIGFkYXB0aXZlIGludGVycnVwdAorbW9kZXJhdGlvbiBtb2RlLgorCitJbiBjb252ZW50aW9uYWwgbW9kZSB0aGUgZHJpdmVyIGluc3RydWN0cyBkZXZpY2UgdG8gcG9zdHBvbmUgaW50ZXJydXB0Citwb3N0aW5nIGFjY29yZGluZyB0byBzdGF0aWMgaW50ZXJydXB0IGRlbGF5IHZhbHVlLiBUaGUgaW50ZXJydXB0IGRlbGF5Cit2YWx1ZSBjYW4gYmUgY29uZmlndXJlZCB0aHJvdWdoIGV0aHRvb2woOCkuIFRoZSBmb2xsb3dpbmcgZXRodG9vbAorcGFyYW1ldGVycyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXI6IHR4LXVzZWNzLCByeC11c2VjcworCitJbiBhZGFwdGl2ZSBpbnRlcnJ1cHQgbW9kZXJhdGlvbiBtb2RlIHRoZSBpbnRlcnJ1cHQgZGVsYXkgdmFsdWUgaXMKK3VwZGF0ZWQgYnkgdGhlIGRyaXZlciBkeW5hbWljYWxseSBhbmQgYWRqdXN0ZWQgZXZlcnkgTkFQSSBjeWNsZQorYWNjb3JkaW5nIHRvIHRoZSB0cmFmZmljIG5hdHVyZS4KKworQnkgZGVmYXVsdCBFTkEgZHJpdmVyIGFwcGxpZXMgYWRhcHRpdmUgY29hbGVzY2luZyBvbiBSeCB0cmFmZmljIGFuZAorY29udmVudGlvbmFsIGNvYWxlc2Npbmcgb24gVHggdHJhZmZpYy4KKworQWRhcHRpdmUgY29hbGVzY2luZyBjYW4gYmUgc3dpdGNoZWQgb24vb2ZmIHRocm91Z2ggZXRodG9vbCg4KQorYWRhcHRpdmVfcnggb258b2ZmIHBhcmFtZXRlci4KKworVGhlIGRyaXZlciBjaG9vc2VzIGludGVycnVwdCBkZWxheSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZgorYnl0ZXMgYW5kIHBhY2tldHMgcmVjZWl2ZWQgYmV0d2VlbiBpbnRlcnJ1cHQgdW5tYXNraW5nIGFuZCBpbnRlcnJ1cHQKK3Bvc3RpbmcuIFRoZSBkcml2ZXIgdXNlcyBpbnRlcnJ1cHQgZGVsYXkgdGFibGUgdGhhdCBzdWJkaXZpZGVzIHRoZQorcmFuZ2Ugb2YgcmVjZWl2ZWQgYnl0ZXMvcGFja2V0cyBpbnRvIDUgbGV2ZWxzIGFuZCBhc3NpZ25zIGludGVycnVwdAorZGVsYXkgdmFsdWUgdG8gZWFjaCBsZXZlbC4KKworVGhlIHVzZXIgY2FuIGVuYWJsZS9kaXNhYmxlIGFkYXB0aXZlIG1vZGVyYXRpb24sIG1vZGlmeSB0aGUgaW50ZXJydXB0CitkZWxheSB0YWJsZSBhbmQgcmVzdG9yZSBpdHMgZGVmYXVsdCB2YWx1ZXMgdGhyb3VnaCBzeXNmcy4KKworVGhlIHJ4X2NvcHlicmVhayBpcyBpbml0aWFsaXplZCBieSBkZWZhdWx0IHRvIEVOQV9ERUZBVUxUX1JYX0NPUFlCUkVBSworYW5kIGNhbiBiZSBjb25maWd1cmVkIGJ5IHRoZSBFVEhUT09MX1NUVU5BQkxFIGNvbW1hbmQgb2YgdGhlCitTSU9DRVRIVE9PTCBpb2N0bC4KKworU0tCOgorVGhlIGRyaXZlci1hbGxvY2F0ZWQgU0tCIGZvciBmcmFtZXMgcmVjZWl2ZWQgZnJvbSBSeCBoYW5kbGluZyB1c2luZworTkFQSSBjb250ZXh0LiBUaGUgYWxsb2NhdGlvbiBtZXRob2QgZGVwZW5kcyBvbiB0aGUgc2l6ZSBvZiB0aGUgcGFja2V0LgorSWYgdGhlIGZyYW1lIGxlbmd0aCBpcyBsYXJnZXIgdGhhbiByeF9jb3B5YnJlYWssIG5hcGlfZ2V0X2ZyYWdzKCkKK2lzIHVzZWQsIG90aGVyd2lzZSBuZXRkZXZfYWxsb2Nfc2tiX2lwX2FsaWduKCkgaXMgdXNlZCwgdGhlIGJ1ZmZlcgorY29udGVudCBpcyBjb3BpZWQgKGJ5IENQVSkgdG8gdGhlIFNLQiwgYW5kIHRoZSBidWZmZXIgaXMgcmVjeWNsZWQuCisKK1N0YXRpc3RpY3M6Cis9PT09PT09PT09PQorVGhlIHVzZXIgY2FuIG9idGFpbiBFTkEgZGV2aWNlIGFuZCBkcml2ZXIgc3RhdGlzdGljcyB1c2luZyBldGh0b29sLgorVGhlIGRyaXZlciBjYW4gY29sbGVjdCByZWd1bGFyIG9yIGV4dGVuZGVkIHN0YXRpc3RpY3MgKGluY2x1ZGluZworcGVyLXF1ZXVlIHN0YXRzKSBmcm9tIHRoZSBkZXZpY2UuCisKK0luIGFkZGl0aW9uIHRoZSBkcml2ZXIgbG9ncyB0aGUgc3RhdHMgdG8gc3lzbG9nIHVwb24gZGV2aWNlIHJlc2V0LgorCitNVFU6Cis9PT09CitUaGUgZHJpdmVyIHN1cHBvcnRzIGFuIGFyYml0cmFyaWx5IGxhcmdlIE1UVSB3aXRoIGEgbWF4aW11bSB0aGF0IGlzCituZWdvdGlhdGVkIHdpdGggdGhlIGRldmljZS4gVGhlIGRyaXZlciBjb25maWd1cmVzIE1UVSB1c2luZyB0aGUKK1NldEZlYXR1cmUgY29tbWFuZCAoRU5BX0FETUlOX01UVSBwcm9wZXJ0eSkuIFRoZSB1c2VyIGNhbiBjaGFuZ2UgTVRVCit2aWEgaXAoOCkgYW5kIHNpbWlsYXIgbGVnYWN5IHRvb2xzLgorCitTdGF0ZWxlc3MgT2ZmbG9hZHM6Cis9PT09PT09PT09PT09PT09PT09CitUaGUgRU5BIGRyaXZlciBzdXBwb3J0czoKKy0gVFNPIG92ZXIgSVB2NC9JUHY2CistIFRTTyB3aXRoIEVDTgorLSBJUHY0IGhlYWRlciBjaGVja3N1bSBvZmZsb2FkCistIFRDUC9VRFAgb3ZlciBJUHY0L0lQdjYgY2hlY2tzdW0gb2ZmbG9hZHMKKworUlNTOgorPT09PQorLSBUaGUgRU5BIGRldmljZSBzdXBwb3J0cyBSU1MgdGhhdCBhbGxvd3MgZmxleGlibGUgUnggdHJhZmZpYworICBzdGVlcmluZy4KKy0gVG9lcGxpdHogYW5kIENSQzMyIGhhc2ggZnVuY3Rpb25zIGFyZSBzdXBwb3J0ZWQuCistIERpZmZlcmVudCBjb21iaW5hdGlvbnMgb2YgTDIvTDMvTDQgZmllbGRzIGNhbiBiZSBjb25maWd1cmVkIGFzCisgIGlucHV0cyBmb3IgaGFzaCBmdW5jdGlvbnMuCistIFRoZSBkcml2ZXIgY29uZmlndXJlcyBSU1Mgc2V0dGluZ3MgdXNpbmcgdGhlIEFRIFNldEZlYXR1cmUgY29tbWFuZAorICAoRU5BX0FETUlOX1JTU19IQVNIX0ZVTkNUSU9OLCBFTkFfQURNSU5fUlNTX0hBU0hfSU5QVVQgYW5kCisgIEVOQV9BRE1JTl9SU1NfUkVESVJFQ1RJT05fVEFCTEVfQ09ORklHIHByb3BlcnRpZXMpLgorLSBJZiB0aGUgTkVUSUZfRl9SWEhBU0ggZmxhZyBpcyBzZXQsIHRoZSAzMi1iaXQgcmVzdWx0IG9mIHRoZSBoYXNoCisgIGZ1bmN0aW9uIGRlbGl2ZXJlZCBpbiB0aGUgUnggQ1EgZGVzY3JpcHRvciBpcyBzZXQgaW4gdGhlIHJlY2VpdmVkCisgIFNLQi4KKy0gVGhlIHVzZXIgY2FuIHByb3ZpZGUgYSBoYXNoIGtleSwgaGFzaCBmdW5jdGlvbiwgYW5kIGNvbmZpZ3VyZSB0aGUKKyAgaW5kaXJlY3Rpb24gdGFibGUgdGhyb3VnaCBldGh0b29sKDgpLgorCitEQVRBIFBBVEg6Cis9PT09PT09PT09CitUeDoKKy0tLQorZW5kX3N0YXJ0X3htaXQoKSBpcyBjYWxsZWQgYnkgdGhlIHN0YWNrLiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIGZvbGxvd2luZzoKKy0gTWFwcyBkYXRhIGJ1ZmZlcnMgKHNrYi0+ZGF0YSBhbmQgZnJhZ3MpLgorLSBQb3B1bGF0ZXMgZW5hX2J1ZiBmb3IgdGhlIHB1c2ggYnVmZmVyIChpZiB0aGUgZHJpdmVyIGFuZCBkZXZpY2UgYXJlCisgIGluIHB1c2ggbW9kZS4pCistIFByZXBhcmVzIEVOQSBidWZzIGZvciB0aGUgcmVtYWluaW5nIGZyYWdzLgorLSBBbGxvY2F0ZXMgYSBuZXcgcmVxdWVzdCBJRCBmcm9tIHRoZSBlbXB0eSByZXFfaWQgcmluZy4gVGhlIHJlcXVlc3QKKyAgSUQgaXMgdGhlIGluZGV4IG9mIHRoZSBwYWNrZXQgaW4gdGhlIFR4IGluZm8uIFRoaXMgaXMgdXNlZCBmb3IKKyAgb3V0LW9mLW9yZGVyIFRYIGNvbXBsZXRpb25zLgorLSBBZGRzIHRoZSBwYWNrZXQgdG8gdGhlIHByb3BlciBwbGFjZSBpbiB0aGUgVHggcmluZy4KKy0gQ2FsbHMgZW5hX2NvbV9wcmVwYXJlX3R4KCksIGFuIEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHRoYXQgY29udmVydHMKKyAgdGhlIGVuYV9idWZzIHRvIEVOQSBkZXNjcmlwdG9ycyAoYW5kIGFkZHMgbWV0YSBFTkEgZGVzY3JpcHRvcnMgYXMKKyAgbmVlZGVkLikKKyAgKiBUaGlzIGZ1bmN0aW9uIGFsc28gY29waWVzIHRoZSBFTkEgZGVzY3JpcHRvcnMgYW5kIHRoZSBwdXNoIGJ1ZmZlcgorICAgIHRvIHRoZSBEZXZpY2UgbWVtb3J5IHNwYWNlIChpZiBpbiBwdXNoIG1vZGUuKQorLSBXcml0ZXMgZG9vcmJlbGwgdG8gdGhlIEVOQSBkZXZpY2UuCistIFdoZW4gdGhlIEVOQSBkZXZpY2UgZmluaXNoZXMgc2VuZGluZyB0aGUgcGFja2V0LCBhIGNvbXBsZXRpb24KKyAgaW50ZXJydXB0IGlzIHJhaXNlZC4KKy0gVGhlIGludGVycnVwdCBoYW5kbGVyIHNjaGVkdWxlcyBOQVBJLgorLSBUaGUgZW5hX2NsZWFuX3R4X2lycSgpIGZ1bmN0aW9uIGlzIGNhbGxlZC4gVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZQorICBjb21wbGV0aW9uIGRlc2NyaXB0b3JzIGdlbmVyYXRlZCBieSB0aGUgRU5BLCB3aXRoIGEgc2luZ2xlCisgIGNvbXBsZXRpb24gZGVzY3JpcHRvciBwZXIgY29tcGxldGVkIHBhY2tldC4KKyAgKiByZXFfaWQgaXMgcmV0cmlldmVkIGZyb20gdGhlIGNvbXBsZXRpb24gZGVzY3JpcHRvci4gVGhlIHR4X2luZm8gb2YKKyAgICB0aGUgcGFja2V0IGlzIHJldHJpZXZlZCB2aWEgdGhlIHJlcV9pZC4gVGhlIGRhdGEgYnVmZmVycyBhcmUKKyAgICB1bm1hcHBlZCBhbmQgcmVxX2lkIGlzIHJldHVybmVkIHRvIHRoZSBlbXB0eSByZXFfaWQgcmluZy4KKyAgKiBUaGUgZnVuY3Rpb24gc3RvcHMgd2hlbiB0aGUgY29tcGxldGlvbiBkZXNjcmlwdG9ycyBhcmUgY29tcGxldGVkIG9yCisgICAgdGhlIGJ1ZGdldCBpcyByZWFjaGVkLgorCitSeDoKKy0tLQorLSBXaGVuIGEgcGFja2V0IGlzIHJlY2VpdmVkIGZyb20gdGhlIEVOQSBkZXZpY2UuCistIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciBzY2hlZHVsZXMgTkFQSS4KKy0gVGhlIGVuYV9jbGVhbl9yeF9pcnEoKSBmdW5jdGlvbiBpcyBjYWxsZWQuIFRoaXMgZnVuY3Rpb24gY2FsbHMKKyAgZW5hX3J4X3BrdCgpLCBhbiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBmdW5jdGlvbiwgd2hpY2ggcmV0dXJucyB0aGUKKyAgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIHVzZWQgZm9yIGEgbmV3IHVuaGFuZGxlZCBwYWNrZXQsIGFuZCB6ZXJvIGlmCisgIG5vIG5ldyBwYWNrZXQgaXMgZm91bmQuCistIFRoZW4gaXQgY2FsbHMgdGhlIGVuYV9jbGVhbl9yeF9pcnEoKSBmdW5jdGlvbi4KKy0gZW5hX2V0aF9yeF9za2IoKSBjaGVja3MgcGFja2V0IGxlbmd0aDoKKyAgKiBJZiB0aGUgcGFja2V0IGlzIHNtYWxsIChsZW4gPCByeF9jb3B5YnJlYWspLCB0aGUgZHJpdmVyIGFsbG9jYXRlcworICAgIGEgU0tCIGZvciB0aGUgbmV3IHBhY2tldCwgYW5kIGNvcGllcyB0aGUgcGFja2V0IHBheWxvYWQgaW50byB0aGUKKyAgICBTS0IgZGF0YSBidWZmZXIuCisgICAgLSBJbiB0aGlzIHdheSB0aGUgb3JpZ2luYWwgZGF0YSBidWZmZXIgaXMgbm90IHBhc3NlZCB0byB0aGUgc3RhY2sKKyAgICAgIGFuZCBpcyByZXVzZWQgZm9yIGZ1dHVyZSBSeCBwYWNrZXRzLgorICAqIE90aGVyd2lzZSB0aGUgZnVuY3Rpb24gdW5tYXBzIHRoZSBSeCBidWZmZXIsIHRoZW4gYWxsb2NhdGVzIHRoZQorICAgIG5ldyBTS0Igc3RydWN0dXJlIGFuZCBob29rcyB0aGUgUnggYnVmZmVyIHRvIHRoZSBTS0IgZnJhZ3MuCistIFRoZSBuZXcgU0tCIGlzIHVwZGF0ZWQgd2l0aCB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIChwcm90b2NvbCwKKyAgY2hlY2tzdW0gaHcgdmVyaWZ5IHJlc3VsdCwgZXRjLiksIGFuZCB0aGVuIHBhc3NlZCB0byB0aGUgbmV0d29yaworICBzdGFjaywgdXNpbmcgdGhlIE5BUEkgaW50ZXJmYWNlIGZ1bmN0aW9uIG5hcGlfZ3JvX3JlY2VpdmUoKS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcC1zeXNjdGwudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwLXN5c2N0bC50eHQKaW5kZXggOWFlOTI5My4uM2RiOGM2NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwLXN5c2N0bC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwLXN5c2N0bC50eHQKQEAgLTU3NSwzMiArNTc1LDMzIEBACiAJdW5jb25kaXRpb25hbGx5IGdlbmVyYXRpb24gb2Ygc3luY29va2llcy4KIAogdGNwX2Zhc3RvcGVuIC0gSU5URUdFUgotCUVuYWJsZSBUQ1AgRmFzdCBPcGVuIGZlYXR1cmUgKGRyYWZ0LWlldGYtdGNwbS1mYXN0b3BlbikgdG8gc2VuZCBkYXRhCi0JaW4gdGhlIG9wZW5pbmcgU1lOIHBhY2tldC4gVG8gdXNlIHRoaXMgZmVhdHVyZSwgdGhlIGNsaWVudCBhcHBsaWNhdGlvbgotCW11c3QgdXNlIHNlbmRtc2coKSBvciBzZW5kdG8oKSB3aXRoIE1TR19GQVNUT1BFTiBmbGFnIHJhdGhlciB0aGFuCi0JY29ubmVjdCgpIHRvIHBlcmZvcm0gYSBUQ1AgaGFuZHNoYWtlIGF1dG9tYXRpY2FsbHkuCisJRW5hYmxlIFRDUCBGYXN0IE9wZW4gKFJGQzc0MTMpIHRvIHNlbmQgYW5kIGFjY2VwdCBkYXRhIGluIHRoZSBvcGVuaW5nCisJU1lOIHBhY2tldC4KKworCVRoZSBjbGllbnQgc3VwcG9ydCBpcyBlbmFibGVkIGJ5IGZsYWcgMHgxIChvbiBieSBkZWZhdWx0KS4gVGhlIGNsaWVudAorCXRoZW4gbXVzdCB1c2Ugc2VuZG1zZygpIG9yIHNlbmR0bygpIHdpdGggdGhlIE1TR19GQVNUT1BFTiBmbGFnLAorCXJhdGhlciB0aGFuIGNvbm5lY3QoKSB0byBzZW5kIGRhdGEgaW4gU1lOLgorCisJVGhlIHNlcnZlciBzdXBwb3J0IGlzIGVuYWJsZWQgYnkgZmxhZyAweDIgKG9mZiBieSBkZWZhdWx0KS4gVGhlbgorCWVpdGhlciBlbmFibGUgZm9yIGFsbCBsaXN0ZW5lcnMgd2l0aCBhbm90aGVyIGZsYWcgKDB4NDAwKSBvcgorCWVuYWJsZSBpbmRpdmlkdWFsIGxpc3RlbmVycyB2aWEgVENQX0ZBU1RPUEVOIHNvY2tldCBvcHRpb24gd2l0aAorCXRoZSBvcHRpb24gdmFsdWUgYmVpbmcgdGhlIGxlbmd0aCBvZiB0aGUgc3luLWRhdGEgYmFja2xvZy4KIAogCVRoZSB2YWx1ZXMgKGJpdG1hcCkgYXJlCi0JMTogRW5hYmxlcyBzZW5kaW5nIGRhdGEgaW4gdGhlIG9wZW5pbmcgU1lOIG9uIHRoZSBjbGllbnQgdy8gTVNHX0ZBU1RPUEVOLgotCTI6IEVuYWJsZXMgVENQIEZhc3QgT3BlbiBvbiB0aGUgc2VydmVyIHNpZGUsIGkuZS4sIGFsbG93aW5nIGRhdGEgaW4KLQkgICBhIFNZTiBwYWNrZXQgdG8gYmUgYWNjZXB0ZWQgYW5kIHBhc3NlZCB0byB0aGUgYXBwbGljYXRpb24gYmVmb3JlCi0JICAgMy13YXkgaGFuZCBzaGFrZSBmaW5pc2hlcy4KLQk0OiBTZW5kIGRhdGEgaW4gdGhlIG9wZW5pbmcgU1lOIHJlZ2FyZGxlc3Mgb2YgY29va2llIGF2YWlsYWJpbGl0eSBhbmQKLQkgICB3aXRob3V0IGEgY29va2llIG9wdGlvbi4KLQkweDEwMDogQWNjZXB0IFNZTiBkYXRhIHcvbyB2YWxpZGF0aW5nIHRoZSBjb29raWUuCi0JMHgyMDA6IEFjY2VwdCBkYXRhLWluLVNZTiB3L28gYW55IGNvb2tpZSBvcHRpb24gcHJlc2VudC4KLQkweDQwMC8weDgwMDogRW5hYmxlIEZhc3QgT3BlbiBvbiBhbGwgbGlzdGVuZXJzIHJlZ2FyZGxlc3Mgb2YgdGhlCi0JICAgVENQX0ZBU1RPUEVOIHNvY2tldCBvcHRpb24uIFRoZSB0d28gZGlmZmVyZW50IGZsYWdzIGRlc2lnbmF0ZSB0d28KLQkgICBkaWZmZXJlbnQgd2F5cyBvZiBzZXR0aW5nIG1heF9xbGVuIHdpdGhvdXQgdGhlIFRDUF9GQVNUT1BFTiBzb2NrZXQKLQkgICBvcHRpb24uCisJICAweDE6IChjbGllbnQpIGVuYWJsZXMgc2VuZGluZyBkYXRhIGluIHRoZSBvcGVuaW5nIFNZTiBvbiB0aGUgY2xpZW50LgorCSAgMHgyOiAoc2VydmVyKSBlbmFibGVzIHRoZSBzZXJ2ZXIgc3VwcG9ydCwgaS5lLiwgYWxsb3dpbmcgZGF0YSBpbgorCQkJYSBTWU4gcGFja2V0IHRvIGJlIGFjY2VwdGVkIGFuZCBwYXNzZWQgdG8gdGhlCisJCQlhcHBsaWNhdGlvbiBiZWZvcmUgMy13YXkgaGFuZHNoYWtlIGZpbmlzaGVzLgorCSAgMHg0OiAoY2xpZW50KSBzZW5kIGRhdGEgaW4gdGhlIG9wZW5pbmcgU1lOIHJlZ2FyZGxlc3Mgb2YgY29va2llCisJCQlhdmFpbGFiaWxpdHkgYW5kIHdpdGhvdXQgYSBjb29raWUgb3B0aW9uLgorCTB4MjAwOiAoc2VydmVyKSBhY2NlcHQgZGF0YS1pbi1TWU4gdy9vIGFueSBjb29raWUgb3B0aW9uIHByZXNlbnQuCisJMHg0MDA6IChzZXJ2ZXIpIGVuYWJsZSBhbGwgbGlzdGVuZXJzIHRvIHN1cHBvcnQgRmFzdCBPcGVuIGJ5CisJCQlkZWZhdWx0IHdpdGhvdXQgZXhwbGljaXQgVENQX0ZBU1RPUEVOIHNvY2tldCBvcHRpb24uCiAKLQlEZWZhdWx0OiAxCisJRGVmYXVsdDogMHgxCiAKLQlOb3RlIHRoYXQgdGhlIGNsaWVudCAmIHNlcnZlciBzaWRlIEZhc3QgT3BlbiBmbGFncyAoMSBhbmQgMgotCXJlc3BlY3RpdmVseSkgbXVzdCBiZSBhbHNvIGVuYWJsZWQgYmVmb3JlIHRoZSByZXN0IG9mIGZsYWdzIGNhbiB0YWtlCi0JZWZmZWN0LgotCi0JU2VlIGluY2x1ZGUvbmV0L3RjcC5oIGFuZCB0aGUgY29kZSBmb3IgbW9yZSBkZXRhaWxzLgorCU5vdGUgdGhhdCB0aGF0IGFkZGl0aW9uYWwgY2xpZW50IG9yIHNlcnZlciBmZWF0dXJlcyBhcmUgb25seQorCWVmZmVjdGl2ZSBpZiB0aGUgYmFzaWMgc3VwcG9ydCAoMHgxIGFuZCAweDIpIGFyZSBlbmFibGVkIHJlc3BlY3RpdmVseS4KIAogdGNwX3N5bl9yZXRyaWVzIC0gSU5URUdFUgogCU51bWJlciBvZiB0aW1lcyBpbml0aWFsIFNZTnMgZm9yIGFuIGFjdGl2ZSBUQ1AgY29ubmVjdGlvbiBhdHRlbXB0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXB2bGFuLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcHZsYW4udHh0CmluZGV4IDE0NDIyZjguLjI0MTk2Y2UgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcHZsYW4udHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcHZsYW4udHh0CkBAIC0yMiw3ICsyMiw3IEBACiAJVGhlcmUgYXJlIG5vIG1vZHVsZSBwYXJhbWV0ZXJzIGZvciB0aGlzIGRyaXZlciBhbmQgaXQgY2FuIGJlIGNvbmZpZ3VyZWQKIHVzaW5nIElQcm91dGUyL2lwIHV0aWxpdHkuCiAKLQlpcCBsaW5rIGFkZCBsaW5rIDxtYXN0ZXItZGV2PiA8c2xhdmUtZGV2PiB0eXBlIGlwdmxhbiBtb2RlIHsgbDIgfCBMMyB9CisJaXAgbGluayBhZGQgbGluayA8bWFzdGVyLWRldj4gPHNsYXZlLWRldj4gdHlwZSBpcHZsYW4gbW9kZSB7IGwyIHwgbDMgfCBsM3MgfQogCiAJZS5nLiBpcCBsaW5rIGFkZCBsaW5rIGlwdmwwIGV0aDAgdHlwZSBpcHZsYW4gbW9kZSBsMgogCkBAIC00OCw2ICs0OCwxMSBAQAogdXNlZCBiZWZvcmUgcGFja2V0cyBhcmUgcXVldWVkIG9uIHRoZSBvdXRib3VuZCBkZXZpY2UuIEluIHRoaXMgbW9kZSB0aGUgc2xhdmVzCiB3aWxsIG5vdCByZWNlaXZlIG5vciBjYW4gc2VuZCBtdWx0aWNhc3QgLyBicm9hZGNhc3QgdHJhZmZpYy4KIAorNC4zIEwzUyBtb2RlOgorCVRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIHRoZSBMMyBtb2RlIGV4Y2VwdCB0aGF0IGlwdGFibGVzIChjb25uLXRyYWNraW5nKQord29ya3MgaW4gdGhpcyBtb2RlIGFuZCBoZW5jZSBpdCBpcyBMMy1zeW1tZXRyaWMgKEwzcykuIFRoaXMgd2lsbCBoYXZlIHNsaWdodGx5IGxlc3MKK3BlcmZvcm1hbmNlIGJ1dCB0aGF0IHNob3VsZG4ndCBtYXR0ZXIgc2luY2UgeW91IGFyZSBjaG9vc2luZyB0aGlzIG1vZGUgb3ZlciBwbGFpbi1MMworbW9kZSB0byBtYWtlIGNvbm4tdHJhY2tpbmcgd29yay4KIAogNS4gV2hhdCB0byBjaG9vc2UgKG1hY3ZsYW4gdnMuIGlwdmxhbik/CiAJVGhlc2UgdHdvIGRldmljZXMgYXJlIHZlcnkgc2ltaWxhciBpbiBtYW55IHJlZ2FyZHMgYW5kIHRoZSBzcGVjaWZpYyB1c2UKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9yeHJwYy50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcnhycGMudHh0CmluZGV4IDE2YTkyNGMuLjFiNjNiYmMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9yeHJwYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3J4cnBjLnR4dApAQCAtNzI1LDcgKzcyNSw4IEBACiAKICAoKikgRW5kIGEgY2xpZW50IGNhbGwuCiAKLQl2b2lkIHJ4cnBjX2tlcm5lbF9lbmRfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCk7CisJdm9pZCByeHJwY19rZXJuZWxfZW5kX2NhbGwoc3RydWN0IHNvY2tldCAqc29jaywKKwkJCQkgICBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCk7CiAKICAgICAgVGhpcyBpcyB1c2VkIHRvIGVuZCBhIHByZXZpb3VzbHkgYmVndW4gY2FsbC4gIFRoZSB1c2VyX2NhbGxfSUQgaXMgZXhwdW5nZWQKICAgICAgZnJvbSBBRl9SWFJQQydzIGtub3dsZWRnZSBhbmQgd2lsbCBub3QgYmUgc2VlbiBhZ2FpbiBpbiBhc3NvY2lhdGlvbiB3aXRoCkBAIC03MzMsNyArNzM0LDkgQEAKIAogICgqKSBTZW5kIGRhdGEgdGhyb3VnaCBhIGNhbGwuCiAKLQlpbnQgcnhycGNfa2VybmVsX3NlbmRfZGF0YShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgc3RydWN0IG1zZ2hkciAqbXNnLAorCWludCByeHJwY19rZXJuZWxfc2VuZF9kYXRhKHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkJICAgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkJICAgc3RydWN0IG1zZ2hkciAqbXNnLAogCQkJCSAgIHNpemVfdCBsZW4pOwogCiAgICAgIFRoaXMgaXMgdXNlZCB0byBzdXBwbHkgZWl0aGVyIHRoZSByZXF1ZXN0IHBhcnQgb2YgYSBjbGllbnQgY2FsbCBvciB0aGUKQEAgLTc0NSw5ICs3NDgsNDIgQEAKICAgICAgVGhlIG1zZyBtdXN0IG5vdCBzcGVjaWZ5IGEgZGVzdGluYXRpb24gYWRkcmVzcywgY29udHJvbCBkYXRhIG9yIGFueSBmbGFncwogICAgICBvdGhlciB0aGFuIE1TR19NT1JFLiAgbGVuIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgZGF0YSB0byB0cmFuc21pdC4KIAorICgqKSBSZWNlaXZlIGRhdGEgZnJvbSBhIGNhbGwuCisKKwlpbnQgcnhycGNfa2VybmVsX3JlY3ZfZGF0YShzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJCSAgIHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJCSAgIHZvaWQgKmJ1ZiwKKwkJCQkgICBzaXplX3Qgc2l6ZSwKKwkJCQkgICBzaXplX3QgKl9vZmZzZXQsCisJCQkJICAgYm9vbCB3YW50X21vcmUsCisJCQkJICAgdTMyICpfYWJvcnQpCisKKyAgICAgIFRoaXMgaXMgdXNlZCB0byByZWNlaXZlIGRhdGEgZnJvbSBlaXRoZXIgdGhlIHJlcGx5IHBhcnQgb2YgYSBjbGllbnQgY2FsbAorICAgICAgb3IgdGhlIHJlcXVlc3QgcGFydCBvZiBhIHNlcnZpY2UgY2FsbC4gIGJ1ZiBhbmQgc2l6ZSBzcGVjaWZ5IGhvdyBtdWNoCisgICAgICBkYXRhIGlzIGRlc2lyZWQgYW5kIHdoZXJlIHRvIHN0b3JlIGl0LiAgKl9vZmZzZXQgaXMgYWRkZWQgb24gdG8gYnVmIGFuZAorICAgICAgc3VidHJhY3RlZCBmcm9tIHNpemUgaW50ZXJuYWxseTsgdGhlIGFtb3VudCBjb3BpZWQgaW50byB0aGUgYnVmZmVyIGlzCisgICAgICBhZGRlZCB0byAqX29mZnNldCBiZWZvcmUgcmV0dXJuaW5nLgorCisgICAgICB3YW50X21vcmUgc2hvdWxkIGJlIHRydWUgaWYgZnVydGhlciBkYXRhIHdpbGwgYmUgcmVxdWlyZWQgYWZ0ZXIgdGhpcyBpcworICAgICAgc2F0aXNmaWVkIGFuZCBmYWxzZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGl0ZW0gb2YgdGhlIHJlY2VpdmUgcGhhc2UuCisKKyAgICAgIFRoZXJlIGFyZSB0aHJlZSBub3JtYWwgcmV0dXJuczogMCBpZiB0aGUgYnVmZmVyIHdhcyBmaWxsZWQgYW5kIHdhbnRfbW9yZQorICAgICAgd2FzIHRydWU7IDEgaWYgdGhlIGJ1ZmZlciB3YXMgZmlsbGVkLCB0aGUgbGFzdCBEQVRBIHBhY2tldCBoYXMgYmVlbgorICAgICAgZW1wdGllZCBhbmQgd2FudF9tb3JlIHdhcyBmYWxzZTsgYW5kIC1FQUdBSU4gaWYgdGhlIGZ1bmN0aW9uIG5lZWRzIHRvIGJlCisgICAgICBjYWxsZWQgYWdhaW4uCisKKyAgICAgIElmIHRoZSBsYXN0IERBVEEgcGFja2V0IGlzIHByb2Nlc3NlZCBidXQgdGhlIGJ1ZmZlciBjb250YWlucyBsZXNzIHRoYW4KKyAgICAgIHRoZSBhbW91bnQgcmVxdWVzdGVkLCBFQkFETVNHIGlzIHJldHVybmVkLiAgSWYgd2FudF9tb3JlIHdhc24ndCBzZXQsIGJ1dAorICAgICAgbW9yZSBkYXRhIHdhcyBhdmFpbGFibGUsIEVNU0dTSVpFIGlzIHJldHVybmVkLgorCisgICAgICBJZiBhIHJlbW90ZSBBQk9SVCBpcyBkZXRlY3RlZCwgdGhlIGFib3J0IGNvZGUgcmVjZWl2ZWQgd2lsbCBiZSBzdG9yZWQgaW4KKyAgICAgICpfYWJvcnQgYW5kIEVDT05OQUJPUlRFRCB3aWxsIGJlIHJldHVybmVkLgorCiAgKCopIEFib3J0IGEgY2FsbC4KIAotCXZvaWQgcnhycGNfa2VybmVsX2Fib3J0X2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHUzMiBhYm9ydF9jb2RlKTsKKwl2b2lkIHJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsKHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkJICAgICBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkgICAgIHUzMiBhYm9ydF9jb2RlKTsKIAogICAgICBUaGlzIGlzIHVzZWQgdG8gYWJvcnQgYSBjYWxsIGlmIGl0J3Mgc3RpbGwgaW4gYW4gYWJvcnRhYmxlIHN0YXRlLiAgVGhlCiAgICAgIGFib3J0IGNvZGUgc3BlY2lmaWVkIHdpbGwgYmUgcGxhY2VkIGluIHRoZSBBQk9SVCBtZXNzYWdlIHNlbnQuCkBAIC03OTAsMTMgKzgyNiwxMiBAQAogICAgICBEYXRhIG1lc3NhZ2VzIGNhbiBoYXZlIHRoZWlyIGNvbnRlbnRzIGV4dHJhY3RlZCB3aXRoIHRoZSB1c3VhbCBidW5jaCBvZgogICAgICBzb2NrZXQgYnVmZmVyIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMuICBBIGRhdGEgbWVzc2FnZSBjYW4gYmUgZGV0ZXJtaW5lZCB0bwogICAgICBiZSB0aGUgbGFzdCBvbmUgaW4gYSBzZXF1ZW5jZSB3aXRoIHJ4cnBjX2tlcm5lbF9pc19kYXRhX2xhc3QoKS4gIFdoZW4gYQotICAgICBkYXRhIG1lc3NhZ2UgaGFzIGJlZW4gdXNlZCB1cCwgcnhycGNfa2VybmVsX2RhdGFfZGVsaXZlcmVkKCkgc2hvdWxkIGJlCi0gICAgIGNhbGxlZCBvbiBpdC4uCisgICAgIGRhdGEgbWVzc2FnZSBoYXMgYmVlbiB1c2VkIHVwLCByeHJwY19rZXJuZWxfZGF0YV9jb25zdW1lZCgpIHNob3VsZCBiZQorICAgICBjYWxsZWQgb24gaXQuCiAKLSAgICAgTm9uLWRhdGEgbWVzc2FnZXMgc2hvdWxkIGJlIGhhbmRsZWQgdG8gcnhycGNfa2VybmVsX2ZyZWVfc2tiKCkgdG8gZGlzcG9zZQotICAgICBvZi4gIEl0IGlzIHBvc3NpYmxlIHRvIGdldCBleHRyYSByZWZzIG9uIGFsbCB0eXBlcyBvZiBtZXNzYWdlIGZvciBsYXRlcgotICAgICBmcmVlaW5nLCBidXQgdGhpcyBtYXkgcGluIHRoZSBzdGF0ZSBvZiBhIGNhbGwgdW50aWwgdGhlIG1lc3NhZ2UgaXMgZmluYWxseQotICAgICBmcmVlZC4KKyAgICAgTWVzc2FnZXMgc2hvdWxkIGJlIGhhbmRsZWQgdG8gcnhycGNfa2VybmVsX2ZyZWVfc2tiKCkgdG8gZGlzcG9zZSBvZi4gIEl0CisgICAgIGlzIHBvc3NpYmxlIHRvIGdldCBleHRyYSByZWZzIG9uIGFsbCB0eXBlcyBvZiBtZXNzYWdlIGZvciBsYXRlciBmcmVlaW5nLAorICAgICBidXQgdGhpcyBtYXkgcGluIHRoZSBzdGF0ZSBvZiBhIGNhbGwgdW50aWwgdGhlIG1lc3NhZ2UgaXMgZmluYWxseSBmcmVlZC4KIAogICgqKSBBY2NlcHQgYW4gaW5jb21pbmcgY2FsbC4KIApAQCAtODIxLDQ1ICs4NTYsNiBAQAogICAgICBPdGhlciBlcnJvcnMgbWF5IGJlIHJldHVybmVkIGlmIHRoZSBjYWxsIGhhZCBiZWVuIGFib3J0ZWQgKC1FQ09OTkFCT1JURUQpCiAgICAgIG9yIGhhZCB0aW1lZCBvdXQgKC1FVElNRSkuCiAKLSAoKikgUmVjb3JkIHRoZSBkZWxpdmVyeSBvZiBhIGRhdGEgbWVzc2FnZSBhbmQgZnJlZSBpdC4KLQotCXZvaWQgcnhycGNfa2VybmVsX2RhdGFfZGVsaXZlcmVkKHN0cnVjdCBza19idWZmICpza2IpOwotCi0gICAgIFRoaXMgaXMgdXNlZCB0byByZWNvcmQgYSBkYXRhIG1lc3NhZ2UgYXMgaGF2aW5nIGJlZW4gZGVsaXZlcmVkIGFuZCB0bwotICAgICB1cGRhdGUgdGhlIEFDSyBzdGF0ZSBmb3IgdGhlIGNhbGwuICBUaGUgc29ja2V0IGJ1ZmZlciB3aWxsIGJlIGZyZWVkLgotCi0gKCopIEZyZWUgYSBtZXNzYWdlLgotCi0Jdm9pZCByeHJwY19rZXJuZWxfZnJlZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci0KLSAgICAgVGhpcyBpcyB1c2VkIHRvIGZyZWUgYSBub24tREFUQSBzb2NrZXQgYnVmZmVyIGludGVyY2VwdGVkIGZyb20gYW4gQUZfUlhSUEMKLSAgICAgc29ja2V0LgotCi0gKCopIERldGVybWluZSBpZiBhIGRhdGEgbWVzc2FnZSBpcyB0aGUgbGFzdCBvbmUgb24gYSBjYWxsLgotCi0JYm9vbCByeHJwY19rZXJuZWxfaXNfZGF0YV9sYXN0KHN0cnVjdCBza19idWZmICpza2IpOwotCi0gICAgIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBzb2NrZXQgYnVmZmVyIGhvbGRzIHRoZSBsYXN0IGRhdGEgbWVzc2FnZQotICAgICB0byBiZSByZWNlaXZlZCBmb3IgYSBjYWxsICh0cnVlIHdpbGwgYmUgcmV0dXJuZWQgaWYgaXQgZG9lcywgZmFsc2UKLSAgICAgaWYgbm90KS4KLQotICAgICBUaGUgZGF0YSBtZXNzYWdlIHdpbGwgYmUgcGFydCBvZiB0aGUgcmVwbHkgb24gYSBjbGllbnQgY2FsbCBhbmQgdGhlCi0gICAgIHJlcXVlc3Qgb24gYW4gaW5jb21pbmcgY2FsbC4gIEluIHRoZSBsYXR0ZXIgY2FzZSB0aGVyZSB3aWxsIGJlIG1vcmUKLSAgICAgbWVzc2FnZXMsIGJ1dCBpbiB0aGUgZm9ybWVyIGNhc2UgdGhlcmUgd2lsbCBub3QuCi0KLSAoKikgR2V0IHRoZSBhYm9ydCBjb2RlIGZyb20gYW4gYWJvcnQgbWVzc2FnZS4KLQotCXUzMiByeHJwY19rZXJuZWxfZ2V0X2Fib3J0X2NvZGUoc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci0KLSAgICAgVGhpcyBpcyB1c2VkIHRvIGV4dHJhY3QgdGhlIGFib3J0IGNvZGUgZnJvbSBhIHJlbW90ZSBhYm9ydCBtZXNzYWdlLgotCi0gKCopIEdldCB0aGUgZXJyb3IgbnVtYmVyIGZyb20gYSBsb2NhbCBvciBuZXR3b3JrIGVycm9yIG1lc3NhZ2UuCi0KLQlpbnQgcnhycGNfa2VybmVsX2dldF9lcnJvcl9udW1iZXIoc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci0KLSAgICAgVGhpcyBpcyB1c2VkIHRvIGV4dHJhY3QgdGhlIGVycm9yIG51bWJlciBmcm9tIGEgbWVzc2FnZSBpbmRpY2F0aW5nIGVpdGhlcgotICAgICBhIGxvY2FsIGVycm9yIG9jY3VycmVkIG9yIGEgbmV0d29yayBlcnJvciBvY2N1cnJlZC4KLQogICgqKSBBbGxvY2F0ZSBhIG51bGwga2V5IGZvciBkb2luZyBhbm9ueW1vdXMgc2VjdXJpdHkuCiAKIAlzdHJ1Y3Qga2V5ICpyeHJwY19nZXRfbnVsbF9rZXkoY29uc3QgY2hhciAqa2V5bmFtZSk7CkBAIC04NjcsNiArODYzLDEzIEBACiAgICAgIFRoaXMgaXMgdXNlZCB0byBhbGxvY2F0ZSBhIG51bGwgUnhSUEMga2V5IHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUKICAgICAgYW5vbnltb3VzIHNlY3VyaXR5IGZvciBhIHBhcnRpY3VsYXIgZG9tYWluLgogCisgKCopIEdldCB0aGUgcGVlciBhZGRyZXNzIG9mIGEgY2FsbC4KKworCXZvaWQgcnhycGNfa2VybmVsX2dldF9wZWVyKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJCSAgIHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqX3NyeCk7CisKKyAgICAgVGhpcyBpcyB1c2VkIHRvIGZpbmQgdGhlIHJlbW90ZSBwZWVyIGFkZHJlc3Mgb2YgYSBjYWxsLgorCiAKID09PT09PT09PT09PT09PT09PT09PT09CiBDT05GSUdVUkFCTEUgUEFSQU1FVEVSUwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3N0cnBhcnNlci50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvc3RycGFyc2VyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGJmNTczCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3N0cnBhcnNlci50eHQKQEAgLTAsMCArMSwxMzYgQEAKK1N0cmVhbSBQYXJzZXIKKy0tLS0tLS0tLS0tLS0KKworVGhlIHN0cmVhbSBwYXJzZXIgKHN0cnBhcnNlcikgaXMgYSB1dGlsaXR5IHRoYXQgcGFyc2VzIG1lc3NhZ2VzIG9mIGFuCithcHBsaWNhdGlvbiBsYXllciBwcm90b2NvbCBydW5uaW5nIG92ZXIgYSBUQ1AgY29ubmVjdGlvbi4gVGhlIHN0cmVhbQorcGFyc2VyIHdvcmtzIGluIGNvbmp1bmN0aW9uIHdpdGggYW4gdXBwZXIgbGF5ZXIgaW4gdGhlIGtlcm5lbCB0byBwcm92aWRlCitrZXJuZWwgc3VwcG9ydCBmb3IgYXBwbGljYXRpb24gbGF5ZXIgbWVzc2FnZXMuIEZvciBpbnN0YW5jZSwgS2VybmVsCitDb25uZWN0aW9uIE11bHRpcGxleG9yIChLQ00pIHVzZXMgdGhlIFN0cmVhbSBQYXJzZXIgdG8gcGFyc2UgbWVzc2FnZXMKK3VzaW5nIGEgQlBGIHByb2dyYW0uCisKK0ludGVyZmFjZQorLS0tLS0tLS0tCisKK1RoZSBBUEkgaW5jbHVkZXMgYSBjb250ZXh0IHN0cnVjdHVyZSwgYSBzZXQgb2YgY2FsbGJhY2tzLCB1dGlsaXR5CitmdW5jdGlvbnMsIGFuZCBhIGRhdGFfcmVhZHkgZnVuY3Rpb24uIFRoZSBjYWxsYmFja3MgaW5jbHVkZQorYSBwYXJzZV9tc2cgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgdG8gcGVyZm9ybSBwYXJzaW5nIChlLmcuCitCUEYgcGFyc2luZyBpbiBjYXNlIG9mIEtDTSksIGFuZCBhIHJjdl9tc2cgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQKK3doZW4gYSBmdWxsIG1lc3NhZ2UgaGFzIGJlZW4gY29tcGxldGVkLgorCitBIHN0cmVhbSBwYXJzZXIgY2FuIGJlIGluc3RhbnRpYXRlZCBmb3IgYSBUQ1AgY29ubmVjdGlvbi4gVGhpcyBpcyBkb25lCitieToKKworc3RycF9pbml0KHN0cnVjdCBzdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBzb2NrICpjc2ssCisJICBzdHJ1Y3Qgc3RycF9jYWxsYmFja3MgKmNiKQorCitzdHJwIGlzIGEgc3RydWN0IG9mIHR5cGUgc3RycGFyc2VyIHRoYXQgaXMgYWxsb2NhdGVkIGJ5IHRoZSB1cHBlciBsYXllci4KK2NzayBpcyB0aGUgVENQIHNvY2tldCBhc3NvY2lhdGVkIHdpdGggdGhlIHN0cmVhbSBwYXJzZXIuIENhbGxiYWNrcyBhcmUKK2NhbGxlZCBieSB0aGUgc3RyZWFtIHBhcnNlci4KKworQ2FsbGJhY2tzCistLS0tLS0tLS0KKworVGhlcmUgYXJlIGZvdXIgY2FsbGJhY2tzOgorCitpbnQgKCpwYXJzZV9tc2cpKHN0cnVjdCBzdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBza19idWZmICpza2IpOworCisgICAgcGFyc2VfbXNnIGlzIGNhbGxlZCB0byBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGUgbmV4dCBtZXNzYWdlCisgICAgaW4gdGhlIHN0cmVhbS4gVGhlIHVwcGVyIGxheWVyIG11c3QgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24uIEl0CisgICAgc2hvdWxkIHBhcnNlIHRoZSBza19idWZmIGFzIGNvbnRhaW5pbmcgdGhlIGhlYWRlcnMgZm9yIHRoZQorICAgIG5leHQgYXBwbGljYXRpb24gbGF5ZXIgbWVzc2FnZXMgaW4gdGhlIHN0cmVhbS4KKworICAgIFRoZSBza2ItPmNiIGluIHRoZSBpbnB1dCBza2IgaXMgYSBzdHJ1Y3Qgc3RycF9yeF9tc2cuIE9ubHkKKyAgICB0aGUgb2Zmc2V0IGZpZWxkIGlzIHJlbGV2YW50IGluIHBhcnNlX21zZyBhbmQgZ2l2ZXMgdGhlIG9mZnNldAorICAgIHdoZXJlIHRoZSBtZXNzYWdlIHN0YXJ0cyBpbiB0aGUgc2tiLgorCisgICAgVGhlIHJldHVybiB2YWx1ZXMgb2YgdGhpcyBmdW5jdGlvbiBhcmU6CisKKyAgICA+MCA6IGluZGljYXRlcyBsZW5ndGggb2Ygc3VjY2Vzc2Z1bGx5IHBhcnNlZCBtZXNzYWdlCisgICAgMCAgOiBpbmRpY2F0ZXMgbW9yZSBkYXRhIG11c3QgYmUgcmVjZWl2ZWQgdG8gcGFyc2UgdGhlIG1lc3NhZ2UKKyAgICAtRVNUUlBJUEUgOiBjdXJyZW50IG1lc3NhZ2Ugc2hvdWxkIG5vdCBiZSBwcm9jZXNzZWQgYnkgdGhlCisgICAgICAgICAga2VybmVsLCByZXR1cm4gY29udHJvbCBvZiB0aGUgc29ja2V0IHRvIHVzZXJzcGFjZSB3aGljaAorICAgICAgICAgIGNhbiBwcm9jZWVkIHRvIHJlYWQgdGhlIG1lc3NhZ2VzIGl0c2VsZgorICAgIG90aGVyIDwgMCA6IEVycm9yIGlzIHBhcnNpbmcsIGdpdmUgY29udHJvbCBiYWNrIHRvIHVzZXJzcGFjZQorICAgICAgICAgIGFzc3VtaW5nIHRoYXQgc3luY2hyb25pemF0aW9uIGlzIGxvc3QgYW5kIHRoZSBzdHJlYW0KKyAgICAgICAgICBpcyB1bnJlY292ZXJhYmxlIChhcHBsaWNhdGlvbiBleHBlY3RlZCB0byBjbG9zZSBUQ1Agc29ja2V0KQorCisgICAgSW4gdGhlIGNhc2UgdGhhdCBhbiBlcnJvciBpcyByZXR1cm5lZCAocmV0dXJuIHZhbHVlIGlzIGxlc3MgdGhhbgorICAgIHplcm8pIHRoZSBzdHJlYW0gcGFyc2VyIHdpbGwgc2V0IHRoZSBlcnJvciBvbiBUQ1Agc29ja2V0IGFuZCB3YWtlCisgICAgaXQgdXAuIElmIHBhcnNlX21zZyByZXR1cm5lZCAtRVNUUlBJUEUgYW5kIHRoZSBzdHJlYW0gcGFyc2VyIGhhZAorICAgIHByZXZpb3VzbHkgcmVhZCBzb21lIGJ5dGVzIGZvciB0aGUgY3VycmVudCBtZXNzYWdlLCB0aGVuIHRoZSBlcnJvcgorICAgIHNldCBvbiB0aGUgYXR0YWNoZWQgc29ja2V0IGlzIEVOT0RBVEEgc2luY2UgdGhlIHN0cmVhbSBpcworICAgIHVucmVjb3ZlcmFibGUgaW4gdGhhdCBjYXNlLgorCit2b2lkICgqcmN2X21zZykoc3RydWN0IHN0cnBhcnNlciAqc3RycCwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKyAgICByY3ZfbXNnIGlzIGNhbGxlZCB3aGVuIGEgZnVsbCBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkIGFuZAorICAgIGlzIHF1ZXVlZC4gVGhlIGNhbGxlZSBtdXN0IGNvbnN1bWUgdGhlIHNrX2J1ZmY7IGl0IGNhbgorICAgIGNhbGwgc3RycF9wYXVzZSB0byBwcmV2ZW50IGFueSBmdXJ0aGVyIG1lc3NhZ2VzIGZyb20gYmVpbmcKKyAgICByZWNlaXZlZCBpbiByY3ZfbXNnIChzZWUgc3RycF9wYXVzZSBiZWxvdykuIFRoaXMgY2FsbGJhY2sKKyAgICBtdXN0IGJlIHNldC4KKworICAgIFRoZSBza2ItPmNiIGluIHRoZSBpbnB1dCBza2IgaXMgYSBzdHJ1Y3Qgc3RycF9yeF9tc2cuIFRoaXMKKyAgICBzdHJ1Y3QgY29udGFpbnMgdHdvIGZpZWxkczogb2Zmc2V0IGFuZCBmdWxsX2xlbi4gT2Zmc2V0IGlzCisgICAgd2hlcmUgdGhlIG1lc3NhZ2Ugc3RhcnRzIGluIHRoZSBza2IsIGFuZCBmdWxsX2xlbiBpcyB0aGUKKyAgICB0aGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlLiBza2ItPmxlbiAtIG9mZnNldCBtYXkgYmUgZ3JlYXRlcgorICAgIHRoZW4gZnVsbF9sZW4gc2luY2Ugc3RycGFyc2VyIGRvZXMgbm90IHRyaW0gdGhlIHNrYi4KKworaW50ICgqcmVhZF9zb2NrX2RvbmUpKHN0cnVjdCBzdHJwYXJzZXIgKnN0cnAsIGludCBlcnIpOworCisgICAgIHJlYWRfc29ja19kb25lIGlzIGNhbGxlZCB3aGVuIHRoZSBzdHJlYW0gcGFyc2VyIGlzIGRvbmUgcmVhZGluZworICAgICB0aGUgVENQIHNvY2tldC4gVGhlIHN0cmVhbSBwYXJzZXIgbWF5IHJlYWQgbXVsdGlwbGUgbWVzc2FnZXMKKyAgICAgaW4gYSBsb29wIGFuZCB0aGlzIGZ1bmN0aW9uIGFsbG93cyBjbGVhbnVwIHRvIG9jY3VyIHdoZW4gZXhpc3RpbmcKKyAgICAgdGhlIGxvb3AuIElmIHRoZSBjYWxsYmFjayBpcyBub3Qgc2V0IChOVUxMIGluIHN0cnBfaW5pdCkgYQorICAgICBkZWZhdWx0IGZ1bmN0aW9uIGlzIHVzZWQuCisKK3ZvaWQgKCphYm9ydF9wYXJzZXIpKHN0cnVjdCBzdHJwYXJzZXIgKnN0cnAsIGludCBlcnIpOworCisgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gc3RyZWFtIHBhcnNlciBlbmNvdW50ZXJzIGFuIGVycm9yCisgICAgIGluIHBhcnNpbmcuIFRoZSBkZWZhdWx0IGZ1bmN0aW9uIHN0b3BzIHRoZSBzdHJlYW0gcGFyc2VyIGZvciB0aGUKKyAgICAgVENQIHNvY2tldCBhbmQgc2V0cyB0aGUgZXJyb3IgaW4gdGhlIHNvY2tldC4gVGhlIGRlZmF1bHQgZnVuY3Rpb24KKyAgICAgY2FuIGJlIGNoYW5nZWQgYnkgc2V0dGluZyB0aGUgY2FsbGJhY2sgdG8gbm9uLU5VTEwgaW4gc3RycF9pbml0LgorCitGdW5jdGlvbnMKKy0tLS0tLS0tLQorCitUaGUgdXBwZXIgbGF5ZXIgY2FsbHMgc3RycF90Y3BfZGF0YV9yZWFkeSB3aGVuIGRhdGEgaXMgcmVhZHkgb24gdGhlIGxvd2VyCitzb2NrZXQgZm9yIHN0cnBhcnNlciB0byBwcm9jZXNzLiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgZnJvbSBhIGRhdGFfcmVhZHkKK2NhbGxiYWNrIHRoYXQgaXMgc2V0IG9uIHRoZSBzb2NrZXQuCisKK3N0cnBfc3RvcCBpcyBjYWxsZWQgdG8gY29tcGxldGVseSBzdG9wIHN0cmVhbSBwYXJzZXIgb3BlcmF0aW9ucy4gVGhpcworaXMgY2FsbGVkIGludGVybmFsbHkgd2hlbiB0aGUgc3RyZWFtIHBhcnNlciBlbmNvdW50ZXJzIGFuIGVycm9yLCBhbmQKK2l0IGlzIGNhbGxlZCBmcm9tIHRoZSB1cHBlciBsYXllciB3aGVuIHVuYXR0YWNoaW5nIGEgVENQIHNvY2tldC4KKworc3RycF9kb25lIGlzIGNhbGxlZCB0byB1bmF0dGFjaCB0aGUgc3RyZWFtIHBhcnNlciBmcm9tIHRoZSBUQ1Agc29ja2V0LgorVGhpcyBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgc3RyZWFtIHByb2Nlc3NvciBoYXMgYmUgc3RvcHBlZC4KKworc3RycF9jaGVja19yY3YgaXMgY2FsbGVkIHRvIGNoZWNrIGZvciBuZXcgbWVzc2FnZXMgb24gdGhlIHNvY2tldC4gVGhpcworaXMgbm9ybWFsbHkgY2FsbGVkIGF0IGluaXRpYWxpemF0aW9uIG9mIHRoZSBhIHN0cmVhbSBwYXJzZXIgaW5zdGFuY2UKK29mIGFmdGVyIHN0cnBfdW5wYXVzZS4KKworU3RhdGlzdGljcworLS0tLS0tLS0tLQorCitWYXJpb3VzIGNvdW50ZXJzIGFyZSBrZXB0IGZvciBlYWNoIHN0cmVhbSBwYXJzZXIgZm9yIGEgVENQIHNvY2tldC4KK1RoZXNlIGFyZSBpbiB0aGUgc3RycF9zdGF0cyBzdHJ1Y3R1cmUuIHN0cnBfYWdncl9zdGF0cyBpcyBhIGNvbnZlbmllbmNlCitzdHJ1Y3R1cmUgZm9yIGFjY3VtdWxhdGluZyBzdGF0aXN0aWNzIGZvciBtdWx0aXBsZSBzdHJlYW0gcGFyc2VyCitpbnN0YW5jZXMuIHNhdmVfc3RycF9zdGF0cyBhbmQgYWdncmVnYXRlX3N0cnBfc3RhdHMgYXJlIGhlbHBlciBmdW5jdGlvbnMKK3RvIHNhdmUgYW5kIGFnZ3JlZ2F0ZSBzdGF0aXN0aWNzLgorCitNZXNzYWdlIGFzc2VtYmx5IGxpbWl0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHN0cmVhbSBwYXJzZXIgcHJvdmlkZSBtZWNoYW5pc21zIHRvIGxpbWl0IHRoZSByZXNvdXJjZXMgY29uc3VtZWQgYnkKK21lc3NhZ2UgYXNzZW1ibHkuCisKK0EgdGltZXIgaXMgc2V0IHdoZW4gYXNzZW1ibHkgc3RhcnRzIGZvciBhIG5ldyBtZXNzYWdlLiBUaGUgbWVzc2FnZQordGltZW91dCBpcyB0YWtlbiBmcm9tIHJjdnRpbWUgZm9yIHRoZSBhc3NvY2lhdGVkIFRDUCBzb2NrZXQuIElmIHRoZQordGltZXIgZmlyZXMgYmVmb3JlIGFzc2VtYmx5IGNvbXBsZXRlcyB0aGUgc3RyZWFtIHBhcnNlciBpcyBhYm9ydGVkCithbmQgdGhlIEVUSU1FRE9VVCBlcnJvciBpcyBzZXQgb24gdGhlIFRDUCBzb2NrZXQuCisKK01lc3NhZ2UgbGVuZ3RoIGlzIGxpbWl0ZWQgdG8gdGhlIHJlY2VpdmUgYnVmZmVyIHNpemUgb2YgdGhlIGFzc29jaWF0ZWQKK1RDUCBzb2NrZXQuIElmIHRoZSBsZW5ndGggcmV0dXJuZWQgYnkgcGFyc2VfbXNnIGlzIGdyZWF0ZXIgdGhhbgordGhlIHNvY2tldCBidWZmZXIgc2l6ZSB0aGVuIHRoZSBzdHJlYW0gcGFyc2VyIGlzIGFib3J0ZWQgd2l0aAorRU1TR1NJWkUgZXJyb3Igc2V0IG9uIHRoZSBUQ1Agc29ja2V0LiBOb3RlIHRoYXQgdGhpcyBtYWtlcyB0aGUKK21heGltdW0gc2l6ZSBvZiByZWNlaXZlIHNrYnVmZnMgZm9yIGEgc29ja2V0IHdpdGggYSBzdHJlYW0gcGFyc2VyCit0byBiZSAyKnNrX3JjdmJ1ZiBvZiB0aGUgVENQIHNvY2tldC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9zd2l0Y2hkZXYudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3N3aXRjaGRldi50eHQKaW5kZXggMzFjMzkxMS4uMmJiYWMwNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3N3aXRjaGRldi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3N3aXRjaGRldi50eHQKQEAgLTI4MywxNSArMjgzLDEwIEBACiBicmlkZ2Ugc2hvdWxkIG5vdCByZWZsb29kIHRoZSBwYWNrZXQgdG8gdGhlIHNhbWUgcG9ydHMgdGhlIGRldmljZSBmbG9vZGVkLAogb3RoZXJ3aXNlIHRoZXJlIHdpbGwgYmUgZHVwbGljYXRlIHBhY2tldHMgb24gdGhlIHdpcmUuCiAKLVRvIGF2b2lkIGR1cGxpY2F0ZSBwYWNrZXRzLCB0aGUgZGV2aWNlL2RyaXZlciBzaG91bGQgbWFyayBhIHBhY2tldCBhcyBhbHJlYWR5Ci1mb3J3YXJkZWQgdXNpbmcgc2tiLT5vZmZsb2FkX2Z3ZF9tYXJrLiAgVGhlIHNhbWUgbWFyayBpcyBzZXQgb24gdGhlIGRldmljZQotcG9ydHMgaW4gdGhlIGRvbWFpbiB1c2luZyBkZXYtPm9mZmxvYWRfZndkX21hcmsuICBJZiB0aGUgc2tiLT5vZmZsb2FkX2Z3ZF9tYXJrCi1pcyBub24temVybyBhbmQgbWF0Y2hlcyB0aGUgZm9yd2FyZGluZyBlZ3Jlc3MgcG9ydCdzIGRldi0+c2tiX21hcmssIHRoZSBrZXJuZWwKLXdpbGwgZHJvcCB0aGUgc2tiIHJpZ2h0IGJlZm9yZSB0cmFuc21pdCBvbiB0aGUgZWdyZXNzIHBvcnQsIHdpdGggdGhlCi11bmRlcnN0YW5kaW5nIHRoYXQgdGhlIGRldmljZSBhbHJlYWR5IGZvcndhcmRlZCB0aGUgcGFja2V0IG9uIHNhbWUgZWdyZXNzIHBvcnQuCi1UaGUgZHJpdmVyIGNhbiB1c2Ugc3dpdGNoZGV2X3BvcnRfZndkX21hcmtfc2V0KCkgdG8gc2V0IGEgZ2xvYmFsbHkgdW5pcXVlIG1hcmsKLWZvciBwb3J0J3MgZGV2LT5vZmZsb2FkX2Z3ZF9tYXJrLCBiYXNlZCBvbiB0aGUgcG9ydCdzIHBhcmVudCBJRCAoc3dpdGNoIElEKSBhbmQKLWEgZ3JvdXAgaWZpbmRleC4KK1RvIGF2b2lkIGR1cGxpY2F0ZSBwYWNrZXRzLCB0aGUgc3dpdGNoIGRyaXZlciBzaG91bGQgbWFyayBhIHBhY2tldCBhcyBhbHJlYWR5Citmb3J3YXJkZWQgYnkgc2V0dGluZyB0aGUgc2tiLT5vZmZsb2FkX2Z3ZF9tYXJrIGJpdC4gVGhlIGJyaWRnZSBkcml2ZXIgd2lsbCBtYXJrCit0aGUgc2tiIHVzaW5nIHRoZSBpbmdyZXNzIGJyaWRnZSBwb3J0J3MgbWFyayBhbmQgcHJldmVudCBpdCBmcm9tIGJlaW5nIGZvcndhcmRlZAordGhyb3VnaCBhbnkgYnJpZGdlIHBvcnQgd2l0aCB0aGUgc2FtZSBtYXJrLgogCiBJdCBpcyBwb3NzaWJsZSBmb3IgdGhlIHN3aXRjaCBkZXZpY2UgdG8gbm90IGhhbmRsZSBmbG9vZGluZyBhbmQgcHVzaCB0aGUKIHBhY2tldHMgdXAgdG8gdGhlIGJyaWRnZSBkcml2ZXIgZm9yIGZsb29kaW5nLiAgVGhpcyBpcyBub3QgaWRlYWwgYXMgdGhlIG51bWJlcgpAQCAtMzE5LDMwICszMTQsMjkgQEAKIGRvZXMgYSBsb25nZXN0IHByZWZpeCBtYXRjaCAoTFBNKSBvbiBGSUIgZW50cmllcyBtYXRjaGluZyByb3V0ZSBwcmVmaXggYW5kCiBmb3J3YXJkcyB0aGUgcGFja2V0IHRvIHRoZSBtYXRjaGluZyBGSUIgZW50cnkncyBuZXh0aG9wKHMpIGVncmVzcyBwb3J0cy4KIAotVG8gcHJvZ3JhbSB0aGUgZGV2aWNlLCB0aGUgZHJpdmVyIGltcGxlbWVudHMgc3VwcG9ydCBmb3IKLVNXSVRDSERFVl9PQkpfSVBWWzR8Nl1fRklCIG9iamVjdCB1c2luZyBzd2l0Y2hkZXZfcG9ydF9vYmpfeHh4IG9wcy4KLXN3aXRjaGRldl9wb3J0X29ial9hZGQgaXMgdXNlZCBmb3IgYm90aCBhZGRpbmcgYSBuZXcgRklCIGVudHJ5IHRvIHRoZSBkZXZpY2UsCi1vciBtb2RpZnlpbmcgYW4gZXhpc3RpbmcgZW50cnkgb24gdGhlIGRldmljZS4KK1RvIHByb2dyYW0gdGhlIGRldmljZSwgdGhlIGRyaXZlciBoYXMgdG8gcmVnaXN0ZXIgYSBGSUIgbm90aWZpZXIgaGFuZGxlcgordXNpbmcgcmVnaXN0ZXJfZmliX25vdGlmaWVyLiBUaGUgZm9sbG93aW5nIGV2ZW50cyBhcmUgYXZhaWxhYmxlOgorRklCX0VWRU5UX0VOVFJZX0FERDogdXNlZCBmb3IgYm90aCBhZGRpbmcgYSBuZXcgRklCIGVudHJ5IHRvIHRoZSBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICBvciBtb2RpZnlpbmcgYW4gZXhpc3RpbmcgZW50cnkgb24gdGhlIGRldmljZS4KK0ZJQl9FVkVOVF9FTlRSWV9ERUw6IHVzZWQgZm9yIHJlbW92aW5nIGEgRklCIGVudHJ5CitGSUJfRVZFTlRfUlVMRV9BREQsIEZJQl9FVkVOVF9SVUxFX0RFTDogdXNlZCB0byBwcm9wYWdhdGUgRklCIHJ1bGUgY2hhbmdlcwogCi1YWFg6IEN1cnJlbnRseSwgb25seSBTV0lUQ0hERVZfT0JKX0lEX0lQVjRfRklCIG9iamVjdHMgYXJlIHN1cHBvcnRlZC4KK0ZJQl9FVkVOVF9FTlRSWV9BREQgYW5kIEZJQl9FVkVOVF9FTlRSWV9ERUwgZXZlbnRzIHBhc3M6CiAKLVNXSVRDSERFVl9PQkpfSURfSVBWNF9GSUIgb2JqZWN0IHBhc3NlczoKLQotCXN0cnVjdCBzd2l0Y2hkZXZfb2JqX2lwdjRfZmliIHsgICAgICAgICAvKiBJUFY0X0ZJQiAqLworCXN0cnVjdCBmaWJfZW50cnlfbm90aWZpZXJfaW5mbyB7CisJCXN0cnVjdCBmaWJfbm90aWZpZXJfaW5mbyBpbmZvOyAvKiBtdXN0IGJlIGZpcnN0ICovCiAJCXUzMiBkc3Q7CiAJCWludCBkc3RfbGVuOwogCQlzdHJ1Y3QgZmliX2luZm8gKmZpOwogCQl1OCB0b3M7CiAJCXU4IHR5cGU7Ci0JCXUzMiBubGZsYWdzOwogCQl1MzIgdGJfaWQ7Ci0JfSBpcHY0X2ZpYjsKKwkJdTMyIG5sZmxhZ3M7CisJfTsKIAogdG8gYWRkL21vZGlmeS9kZWxldGUgSVB2NCBkc3QvZGVzdF9sZW4gcHJlZml4IG9uIHRhYmxlIHRiX2lkLiAgVGhlICpmaQogc3RydWN0dXJlIGhvbGRzIGRldGFpbHMgb24gdGhlIHJvdXRlIGFuZCByb3V0ZSdzIG5leHRob3BzLiAgKmRldiBpcyBvbmUgb2YgdGhlCi1wb3J0IG5ldGRldnMgbWVudGlvbmVkIGluIHRoZSByb3V0ZXMgbmV4dCBob3AgbGlzdC4gIElmIHRoZSBvdXRwdXQgcG9ydCBuZXRkZXZzCi1yZWZlcmVuY2VkIGluIHRoZSByb3V0ZSdzIG5leHRob3AgbGlzdCBkb24ndCBhbGwgaGF2ZSB0aGUgc2FtZSBzd2l0Y2ggSUQsIHRoZQotZHJpdmVyIGlzIG5vdCBjYWxsZWQgdG8gYWRkL21vZGlmeS9kZWxldGUgdGhlIEZJQiBlbnRyeS4KK3BvcnQgbmV0ZGV2cyBtZW50aW9uZWQgaW4gdGhlIHJvdXRlJ3MgbmV4dCBob3AgbGlzdC4KIAogUm91dGVzIG9mZmxvYWRlZCB0byB0aGUgZGV2aWNlIGFyZSBsYWJlbGVkIHdpdGggIm9mZmxvYWQiIGluIHRoZSBpcCByb3V0ZQogbGlzdGluZzoKQEAgLTM2MCw2ICszNTQsOCBAQAogCTEyLjAuMC40IHZpYSAxMS4wLjAuOSBkZXYgc3cxcDIgIHByb3RvIHplYnJhICBtZXRyaWMgMjAgb2ZmbG9hZAogCTE5Mi4xNjguMC4wLzI0IGRldiBldGgwICBwcm90byBrZXJuZWwgIHNjb3BlIGxpbmsgIHNyYyAxOTIuMTY4LjAuMTUKIAorVGhlICJvZmZsb2FkIiBmbGFnIGlzIHNldCBpbiBjYXNlIGF0IGxlYXN0IG9uZSBkZXZpY2Ugb2ZmbG9hZHMgdGhlIEZJQiBlbnRyeS4KKwogWFhYOiBhZGQvbW9kL2RlbCBJUHY2IEZJQiBBUEkKIAogTmV4dGhvcCBSZXNvbHV0aW9uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL2Jhc2ljLXBtLWRlYnVnZ2luZy50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL2Jhc2ljLXBtLWRlYnVnZ2luZy50eHQKaW5kZXggYjk2MDk4Yy4uNzA4Zjg3ZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlci9iYXNpYy1wbS1kZWJ1Z2dpbmcudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXIvYmFzaWMtcG0tZGVidWdnaW5nLnR4dApAQCAtMTY0LDcgKzE2NCwzMiBAQAogQWdhaW4sIGlmIHlvdSBmaW5kIHRoZSBvZmZlbmRpbmcgbW9kdWxlKHMpLCBpdCh0aGV5KSBtdXN0IGJlIHVubG9hZGVkIGV2ZXJ5IHRpbWUKIGJlZm9yZSBoaWJlcm5hdGlvbiwgYW5kIHBsZWFzZSByZXBvcnQgdGhlIHByb2JsZW0gd2l0aCBpdCh0aGVtKS4KIAotYykgQWR2YW5jZWQgZGVidWdnaW5nCitjKSBVc2luZyB0aGUgInRlc3RfcmVzdW1lIiBoaWJlcm5hdGlvbiBvcHRpb24KKworL3N5cy9wb3dlci9kaXNrIGdlbmVyYWxseSB0ZWxscyB0aGUga2VybmVsIHdoYXQgdG8gZG8gYWZ0ZXIgY3JlYXRpbmcgYQoraGliZXJuYXRpb24gaW1hZ2UuICBPbmUgb2YgdGhlIGF2YWlsYWJsZSBvcHRpb25zIGlzICJ0ZXN0X3Jlc3VtZSIgd2hpY2gKK2NhdXNlcyB0aGUganVzdCBjcmVhdGVkIGltYWdlIHRvIGJlIHVzZWQgZm9yIGltbWVkaWF0ZSByZXN0b3JhdGlvbi4gIE5hbWVseSwKK2FmdGVyIGRvaW5nOgorCisjIGVjaG8gdGVzdF9yZXN1bWUgPiAvc3lzL3Bvd2VyL2Rpc2sKKyMgZWNobyBkaXNrID4gL3N5cy9wb3dlci9zdGF0ZQorCithIGhpYmVybmF0aW9uIGltYWdlIHdpbGwgYmUgY3JlYXRlZCBhbmQgYSByZXN1bWUgZnJvbSBpdCB3aWxsIGJlIHRyaWdnZXJlZAoraW1tZWRpYXRlbHkgd2l0aG91dCBpbnZvbHZpbmcgdGhlIHBsYXRmb3JtIGZpcm13YXJlIGluIGFueSB3YXkuCisKK1RoYXQgdGVzdCBjYW4gYmUgdXNlZCB0byBjaGVjayBpZiBmYWlsdXJlcyB0byByZXN1bWUgZnJvbSBoaWJlcm5hdGlvbiBhcmUKK3JlbGF0ZWQgdG8gYmFkIGludGVyYWN0aW9ucyB3aXRoIHRoZSBwbGF0Zm9ybSBmaXJtd2FyZS4gIFRoYXQgaXMsIGlmIHRoZSBhYm92ZQord29ya3MgZXZlcnkgdGltZSwgYnV0IHJlc3VtZSBmcm9tIGFjdHVhbCBoaWJlcm5hdGlvbiBkb2VzIG5vdCB3b3JrIG9yIGlzCit1bnJlbGlhYmxlLCB0aGUgcGxhdGZvcm0gZmlybXdhcmUgbWF5IGJlIHJlc3BvbnNpYmxlIGZvciB0aGUgZmFpbHVyZXMuCisKK09uIGFyY2hpdGVjdHVyZXMgYW5kIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgdXNpbmcgZGlmZmVyZW50IGtlcm5lbHMgdG8gcmVzdG9yZQoraGliZXJuYXRpb24gaW1hZ2VzICh0aGF0IGlzLCB0aGUga2VybmVsIHVzZWQgdG8gcmVhZCB0aGUgaW1hZ2UgZnJvbSBzdG9yYWdlIGFuZAorbG9hZCBpdCBpbnRvIG1lbW9yeSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb25lIGluY2x1ZGVkIGluIHRoZSBpbWFnZSkgb3Igc3VwcG9ydAora2VybmVsIGFkZHJlc3Mgc3BhY2UgcmFuZG9taXphdGlvbiwgaXQgYWxzbyBjYW4gYmUgdXNlZCB0byBjaGVjayBpZiBmYWlsdXJlcwordG8gcmVzdW1lIG1heSBiZSByZWxhdGVkIHRvIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSByZXN0b3JlIGFuZCBpbWFnZQora2VybmVscy4KKworZCkgQWR2YW5jZWQgZGVidWdnaW5nCiAKIEluIGNhc2UgdGhhdCBoaWJlcm5hdGlvbiBkb2VzIG5vdCB3b3JrIG9uIHlvdXIgc3lzdGVtIGV2ZW4gaW4gdGhlIG1pbmltYWwKIGNvbmZpZ3VyYXRpb24gYW5kIGNvbXBpbGluZyBtb3JlIGRyaXZlcnMgYXMgbW9kdWxlcyBpcyBub3QgcHJhY3RpY2FsIG9yIHNvbWUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvaW50ZXJmYWNlLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXIvaW50ZXJmYWNlLnR4dAppbmRleCBmMWYwZjU5YS4uOTc0OTE2ZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlci9pbnRlcmZhY2UudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXIvaW50ZXJmYWNlLnR4dApAQCAtMSw3NSArMSw3NiBAQAotUG93ZXIgTWFuYWdlbWVudCBJbnRlcmZhY2UKK1Bvd2VyIE1hbmFnZW1lbnQgSW50ZXJmYWNlIGZvciBTeXN0ZW0gU2xlZXAKIAorQ29weXJpZ2h0IChjKSAyMDE2IEludGVsIENvcnAuLCBSYWZhZWwgSi4gV3lzb2NraSA8cmFmYWVsLmoud3lzb2NraUBpbnRlbC5jb20+CiAKLVRoZSBwb3dlciBtYW5hZ2VtZW50IHN1YnN5c3RlbSBwcm92aWRlcyBhIHVuaWZpZWQgc3lzZnMgaW50ZXJmYWNlIHRvIAotdXNlcnNwYWNlLCByZWdhcmRsZXNzIG9mIHdoYXQgYXJjaGl0ZWN0dXJlIG9yIHBsYXRmb3JtIG9uZSBpcwotcnVubmluZy4gVGhlIGludGVyZmFjZSBleGlzdHMgaW4gL3N5cy9wb3dlci8gZGlyZWN0b3J5IChhc3N1bWluZyBzeXNmcwotaXMgbW91bnRlZCBhdCAvc3lzKS4gCitUaGUgcG93ZXIgbWFuYWdlbWVudCBzdWJzeXN0ZW0gcHJvdmlkZXMgdXNlcnNwYWNlIHdpdGggYSB1bmlmaWVkIHN5c2ZzIGludGVyZmFjZQorZm9yIHN5c3RlbSBzbGVlcCByZWdhcmRsZXNzIG9mIHRoZSB1bmRlcmx5aW5nIHN5c3RlbSBhcmNoaXRlY3R1cmUgb3IgcGxhdGZvcm0uCitUaGUgaW50ZXJmYWNlIGlzIGxvY2F0ZWQgaW4gdGhlIC9zeXMvcG93ZXIvIGRpcmVjdG9yeSAoYXNzdW1pbmcgdGhhdCBzeXNmcyBpcworbW91bnRlZCBhdCAvc3lzKS4KIAotL3N5cy9wb3dlci9zdGF0ZSBjb250cm9scyBzeXN0ZW0gcG93ZXIgc3RhdGUuIFJlYWRpbmcgZnJvbSB0aGlzIGZpbGUKLXJldHVybnMgd2hhdCBzdGF0ZXMgYXJlIHN1cHBvcnRlZCwgd2hpY2ggaXMgaGFyZC1jb2RlZCB0byAnZnJlZXplJywKLSdzdGFuZGJ5JyAoUG93ZXItT24gU3VzcGVuZCksICdtZW0nIChTdXNwZW5kLXRvLVJBTSksIGFuZCAnZGlzaycKLShTdXNwZW5kLXRvLURpc2spLiAKKy9zeXMvcG93ZXIvc3RhdGUgaXMgdGhlIHN5c3RlbSBzbGVlcCBzdGF0ZSBjb250cm9sIGZpbGUuCiAKLVdyaXRpbmcgdG8gdGhpcyBmaWxlIG9uZSBvZiB0aG9zZSBzdHJpbmdzIGNhdXNlcyB0aGUgc3lzdGVtIHRvCi10cmFuc2l0aW9uIGludG8gdGhhdCBzdGF0ZS4gUGxlYXNlIHNlZSB0aGUgZmlsZQotRG9jdW1lbnRhdGlvbi9wb3dlci9zdGF0ZXMudHh0IGZvciBhIGRlc2NyaXB0aW9uIG9mIGVhY2ggb2YgdGhvc2UKLXN0YXRlcy4KK1JlYWRpbmcgZnJvbSBpdCByZXR1cm5zIGEgbGlzdCBvZiBzdXBwb3J0ZWQgc2xlZXAgc3RhdGVzLCBlbmNvZGVkIGFzOgogCisnZnJlZXplJyAoU3VzcGVuZC10by1JZGxlKQorJ3N0YW5kYnknIChQb3dlci1PbiBTdXNwZW5kKQorJ21lbScgKFN1c3BlbmQtdG8tUkFNKQorJ2Rpc2snIChTdXNwZW5kLXRvLURpc2spCiAKLS9zeXMvcG93ZXIvZGlzayBjb250cm9scyB0aGUgb3BlcmF0aW5nIG1vZGUgb2YgdGhlIHN1c3BlbmQtdG8tZGlzawotbWVjaGFuaXNtLiBTdXNwZW5kLXRvLWRpc2sgY2FuIGJlIGhhbmRsZWQgaW4gc2V2ZXJhbCB3YXlzLiBXZSBoYXZlIGEKLWZldyBvcHRpb25zIGZvciBwdXR0aW5nIHRoZSBzeXN0ZW0gdG8gc2xlZXAgLSB1c2luZyB0aGUgcGxhdGZvcm0gZHJpdmVyCi0oZS5nLiBBQ1BJIG9yIG90aGVyIHN1c3BlbmRfb3BzKSwgcG93ZXJpbmcgb2ZmIHRoZSBzeXN0ZW0gb3IgcmVib290aW5nIHRoZQotc3lzdGVtIChmb3IgdGVzdGluZykuCitTdXNwZW5kLXRvLUlkbGUgaXMgYWx3YXlzIHN1cHBvcnRlZC4gIFN1c3BlbmQtdG8tRGlzayBpcyBhbHdheXMgc3VwcG9ydGVkCit0b28gYXMgbG9uZyB0aGUga2VybmVsIGhhcyBiZWVuIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBoaWJlcm5hdGlvbiBhdCBhbGwKKyhpZS4gQ09ORklHX0hJQkVSTkFUSU9OIGlzIHNldCBpbiB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gZmlsZSkuICBTdXBwb3J0Citmb3IgU3VzcGVuZC10by1SQU0gYW5kIFBvd2VyLU9uIFN1c3BlbmQgZGVwZW5kcyBvbiB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZQorcGxhdGZvcm0uCiAKLUFkZGl0aW9uYWxseSwgL3N5cy9wb3dlci9kaXNrIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24gb25lIG9mIHRoZSB0d28gdGVzdGluZwotbW9kZXMgb2YgdGhlIHN1c3BlbmQtdG8tZGlzayBtZWNoYW5pc206ICd0ZXN0cHJvYycgb3IgJ3Rlc3QnLiAgSWYgdGhlCi1zdXNwZW5kLXRvLWRpc2sgbWVjaGFuaXNtIGlzIGluIHRoZSAndGVzdHByb2MnIG1vZGUsIHdyaXRpbmcgJ2Rpc2snIHRvCi0vc3lzL3Bvd2VyL3N0YXRlIHdpbGwgY2F1c2UgdGhlIGtlcm5lbCB0byBkaXNhYmxlIG5vbmJvb3QgQ1BVcyBhbmQgZnJlZXplCi10YXNrcywgd2FpdCBmb3IgNSBzZWNvbmRzLCB1bmZyZWV6ZSB0YXNrcyBhbmQgZW5hYmxlIG5vbmJvb3QgQ1BVcy4gIElmIGl0IGlzCi1pbiB0aGUgJ3Rlc3QnIG1vZGUsIHdyaXRpbmcgJ2Rpc2snIHRvIC9zeXMvcG93ZXIvc3RhdGUgd2lsbCBjYXVzZSB0aGUga2VybmVsCi10byBkaXNhYmxlIG5vbmJvb3QgQ1BVcyBhbmQgZnJlZXplIHRhc2tzLCBzaHJpbmsgbWVtb3J5LCBzdXNwZW5kIGRldmljZXMsIHdhaXQKLWZvciA1IHNlY29uZHMsIHJlc3VtZSBkZXZpY2VzLCB1bmZyZWV6ZSB0YXNrcyBhbmQgZW5hYmxlIG5vbmJvb3QgQ1BVcy4gIFRoZW4sCi13ZSBhcmUgYWJsZSB0byBsb29rIGluIHRoZSBsb2cgbWVzc2FnZXMgYW5kIHdvcmsgb3V0LCBmb3IgZXhhbXBsZSwgd2hpY2ggY29kZQotaXMgYmVpbmcgc2xvdyBhbmQgd2hpY2ggZGV2aWNlIGRyaXZlcnMgYXJlIG1pc2JlaGF2aW5nLgorSWYgb25lIG9mIHRoZSBzdHJpbmdzIGxpc3RlZCBpbiAvc3lzL3Bvd2VyL3N0YXRlIGlzIHdyaXR0ZW4gdG8gaXQsIHRoZSBzeXN0ZW0KK3dpbGwgYXR0ZW1wdCB0byB0cmFuc2l0aW9uIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgc2xlZXAgc3RhdGUuICBSZWZlciB0bworRG9jdW1lbnRhdGlvbi9wb3dlci9zdGF0ZXMudHh0IGZvciBhIGRlc2NyaXB0aW9uIG9mIGVhY2ggb2YgdGhvc2Ugc3RhdGVzLgogCi1SZWFkaW5nIGZyb20gdGhpcyBmaWxlIHdpbGwgZGlzcGxheSBhbGwgc3VwcG9ydGVkIG1vZGVzIGFuZCB0aGUgY3VycmVudGx5Ci1zZWxlY3RlZCBvbmUgaW4gYnJhY2tldHMsIGZvciBleGFtcGxlCisvc3lzL3Bvd2VyL2Rpc2sgY29udHJvbHMgdGhlIG9wZXJhdGluZyBtb2RlIG9mIGhpYmVybmF0aW9uIChTdXNwZW5kLXRvLURpc2spLgorU3BlY2lmaWNhbGx5LCBpdCB0ZWxscyB0aGUga2VybmVsIHdoYXQgdG8gZG8gYWZ0ZXIgY3JlYXRpbmcgYSBoaWJlcm5hdGlvbiBpbWFnZS4KIAotCVtzaHV0ZG93bl0gcmVib290IHRlc3QgdGVzdHByb2MKK1JlYWRpbmcgZnJvbSBpdCByZXR1cm5zIGEgbGlzdCBvZiBzdXBwb3J0ZWQgb3B0aW9ucyBlbmNvZGVkIGFzOgogCi1Xcml0aW5nIHRvIHRoaXMgZmlsZSB3aWxsIGFjY2VwdCBvbmUgb2YKKydwbGF0Zm9ybScgKHB1dCB0aGUgc3lzdGVtIGludG8gc2xlZXAgdXNpbmcgYSBwbGF0Zm9ybS1wcm92aWRlZCBtZXRob2QpCisnc2h1dGRvd24nIChzaHV0IHRoZSBzeXN0ZW0gZG93bikKKydyZWJvb3QnIChyZWJvb3QgdGhlIHN5c3RlbSkKKydzdXNwZW5kJyAodHJpZ2dlciBhIFN1c3BlbmQtdG8tUkFNIHRyYW5zaXRpb24pCisndGVzdF9yZXN1bWUnIChyZXN1bWUtYWZ0ZXItaGliZXJuYXRpb24gdGVzdCBtb2RlKQogCi0gICAgICAgJ3BsYXRmb3JtJyAob25seSBpZiB0aGUgcGxhdGZvcm0gc3VwcG9ydHMgaXQpCi0gICAgICAgJ3NodXRkb3duJwotICAgICAgICdyZWJvb3QnCi0gICAgICAgJ3Rlc3Rwcm9jJwotICAgICAgICd0ZXN0JworVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24gaXMgcHJpbnRlZCBpbiBzcXVhcmUgYnJhY2tldHMuCiAKLS9zeXMvcG93ZXIvaW1hZ2Vfc2l6ZSBjb250cm9scyB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2UgY3JlYXRlZCBieQotdGhlIHN1c3BlbmQtdG8tZGlzayBtZWNoYW5pc20uICBJdCBjYW4gYmUgd3JpdHRlbiBhIHN0cmluZwotcmVwcmVzZW50aW5nIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgdGhhdCB3aWxsIGJlIHVzZWQgYXMgYW4gdXBwZXIKLWxpbWl0IG9mIHRoZSBpbWFnZSBzaXplLCBpbiBieXRlcy4gIFRoZSBzdXNwZW5kLXRvLWRpc2sgbWVjaGFuaXNtIHdpbGwKLWRvIGl0cyBiZXN0IHRvIGVuc3VyZSB0aGUgaW1hZ2Ugc2l6ZSB3aWxsIG5vdCBleGNlZWQgdGhhdCBudW1iZXIuICBIb3dldmVyLAotaWYgdGhpcyB0dXJucyBvdXQgdG8gYmUgaW1wb3NzaWJsZSwgaXQgd2lsbCB0cnkgdG8gc3VzcGVuZCBhbnl3YXkgdXNpbmcgdGhlCi1zbWFsbGVzdCBpbWFnZSBwb3NzaWJsZS4gIEluIHBhcnRpY3VsYXIsIGlmICIwIiBpcyB3cml0dGVuIHRvIHRoaXMgZmlsZSwgdGhlCi1zdXNwZW5kIGltYWdlIHdpbGwgYmUgYXMgc21hbGwgYXMgcG9zc2libGUuCitUaGUgJ3BsYXRmb3JtJyBvcHRpb24gaXMgb25seSBhdmFpbGFibGUgaWYgdGhlIHBsYXRmb3JtIHByb3ZpZGVzIGEgc3BlY2lhbAorbWVjaGFuaXNtIHRvIHB1dCB0aGUgc3lzdGVtIHRvIHNsZWVwIGFmdGVyIGNyZWF0aW5nIGEgaGliZXJuYXRpb24gaW1hZ2UgKEFDUEkKK2RvZXMgdGhhdCwgZm9yIGV4YW1wbGUpLiAgVGhlICdzdXNwZW5kJyBvcHRpb24gaXMgYXZhaWxhYmxlIGlmIFN1c3BlbmQtdG8tUkFNCitpcyBzdXBwb3J0ZWQuICBSZWZlciB0byBEb2N1bWVudGF0aW9uL3Bvd2VyL2Jhc2ljX3BtX2RlYnVnZ2luZy50eHQgZm9yIHRoZQorZGVzY3JpcHRpb24gb2YgdGhlICd0ZXN0X3Jlc3VtZScgb3B0aW9uLgogCi1SZWFkaW5nIGZyb20gdGhpcyBmaWxlIHdpbGwgZGlzcGxheSB0aGUgY3VycmVudCBpbWFnZSBzaXplIGxpbWl0LCB3aGljaAotaXMgc2V0IHRvIDIvNSBvZiBhdmFpbGFibGUgUkFNIGJ5IGRlZmF1bHQuCitUbyBzZWxlY3QgYW4gb3B0aW9uLCB3cml0ZSB0aGUgc3RyaW5nIHJlcHJlc2VudGluZyBpdCB0byAvc3lzL3Bvd2VyL2Rpc2suCiAKLS9zeXMvcG93ZXIvcG1fdHJhY2UgY29udHJvbHMgdGhlIGNvZGUgd2hpY2ggc2F2ZXMgdGhlIGxhc3QgUE0gZXZlbnQgcG9pbnQgaW4KLXRoZSBSVEMgYWNyb3NzIHJlYm9vdHMsIHNvIHRoYXQgeW91IGNhbiBkZWJ1ZyBhIG1hY2hpbmUgdGhhdCBqdXN0IGhhbmdzCi1kdXJpbmcgc3VzcGVuZCAob3IgbW9yZSBjb21tb25seSwgZHVyaW5nIHJlc3VtZSkuICBOYW1lbHksIHRoZSBSVEMgaXMgb25seQotdXNlZCB0byBzYXZlIHRoZSBsYXN0IFBNIGV2ZW50IHBvaW50IGlmIHRoaXMgZmlsZSBjb250YWlucyAnMScuICBJbml0aWFsbHkgaXQKLWNvbnRhaW5zICcwJyB3aGljaCBtYXkgYmUgY2hhbmdlZCB0byAnMScgYnkgd3JpdGluZyBhIHN0cmluZyByZXByZXNlbnRpbmcgYQotbm9uemVybyBpbnRlZ2VyIGludG8gaXQuCisvc3lzL3Bvd2VyL2ltYWdlX3NpemUgY29udHJvbHMgdGhlIHNpemUgb2YgaGliZXJuYXRpb24gaW1hZ2VzLgogCi1UbyB1c2UgdGhpcyBkZWJ1Z2dpbmcgZmVhdHVyZSB5b3Ugc2hvdWxkIGF0dGVtcHQgdG8gc3VzcGVuZCB0aGUgbWFjaGluZSwgdGhlbgotcmVib290IGl0IGFuZCBydW4KK0l0IGNhbiBiZSB3cml0dGVuIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHRoYXQgd2lsbCBiZQordXNlZCBhcyBhIGJlc3QtZWZmb3J0IHVwcGVyIGxpbWl0IG9mIHRoZSBpbWFnZSBzaXplLCBpbiBieXRlcy4gIFRoZSBoaWJlcm5hdGlvbgorY29yZSB3aWxsIGRvIGl0cyBiZXN0IHRvIGVuc3VyZSB0aGF0IHRoZSBpbWFnZSBzaXplIHdpbGwgbm90IGV4Y2VlZCB0aGF0IG51bWJlci4KK0hvd2V2ZXIsIGlmIHRoYXQgdHVybnMgb3V0IHRvIGJlIGltcG9zc2libGUgdG8gYWNoaWV2ZSwgYSBoaWJlcm5hdGlvbiBpbWFnZSB3aWxsCitzdGlsbCBiZSBjcmVhdGVkIGFuZCBpdHMgc2l6ZSB3aWxsIGJlIGFzIHNtYWxsIGFzIHBvc3NpYmxlLiAgSW4gcGFydGljdWxhciwKK3dyaXRpbmcgJzAnIHRvIHRoaXMgZmlsZSB3aWxsIGVuZm9yY2UgaGliZXJuYXRpb24gaW1hZ2VzIHRvIGJlIGFzIHNtYWxsIGFzCitwb3NzaWJsZS4KIAotCWRtZXNnIC1zIDEwMDAwMDAgfCBncmVwICdoYXNoIG1hdGNoZXMnCitSZWFkaW5nIGZyb20gdGhpcyBmaWxlIHJldHVybnMgdGhlIGN1cnJlbnQgaW1hZ2Ugc2l6ZSBsaW1pdCwgd2hpY2ggaXMgc2V0IHRvCithcm91bmQgMi81IG9mIGF2YWlsYWJsZSBSQU0gYnkgZGVmYXVsdC4KIAotQ0FVVElPTjogVXNpbmcgaXQgd2lsbCBjYXVzZSB5b3VyIG1hY2hpbmUncyByZWFsLXRpbWUgKENNT1MpIGNsb2NrIHRvIGJlCi1zZXQgdG8gYSByYW5kb20gaW52YWxpZCB0aW1lIGFmdGVyIGEgcmVzdW1lLgorL3N5cy9wb3dlci9wbV90cmFjZSBjb250cm9scyB0aGUgUE0gdHJhY2UgbWVjaGFuaXNtIHNhdmluZyB0aGUgbGFzdCBzdXNwZW5kCitvciByZXN1bWUgZXZlbnQgcG9pbnQgaW4gdGhlIFJUQyBhY3Jvc3MgcmVib290cy4KKworSXQgaGVscHMgdG8gZGVidWcgaGFyZCBsb2NrdXBzIG9yIHJlYm9vdHMgZHVlIHRvIGRldmljZSBkcml2ZXIgZmFpbHVyZXMgdGhhdAorb2NjdXIgZHVyaW5nIHN5c3RlbSBzdXNwZW5kIG9yIHJlc3VtZSAod2hpY2ggaXMgbW9yZSBjb21tb24pIG1vcmUgZWZmZWN0aXZlbHkuCisKK0lmIC9zeXMvcG93ZXIvcG1fdHJhY2UgY29udGFpbnMgJzEnLCB0aGUgZmluZ2VycHJpbnQgb2YgZWFjaCBzdXNwZW5kL3Jlc3VtZQorZXZlbnQgcG9pbnQgaW4gdHVybiB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgUlRDIG1lbW9yeSAob3ZlcndyaXRpbmcgdGhlIGFjdHVhbAorUlRDIGluZm9ybWF0aW9uKSwgc28gaXQgd2lsbCBzdXJ2aXZlIGEgc3lzdGVtIGNyYXNoIGlmIG9uZSBvY2N1cnMgcmlnaHQgYWZ0ZXIKK3N0b3JpbmcgaXQgYW5kIGl0IGNhbiBiZSB1c2VkIGxhdGVyIHRvIGlkZW50aWZ5IHRoZSBkcml2ZXIgdGhhdCBjYXVzZWQgdGhlIGNyYXNoCit0byBoYXBwZW4gKHNlZSBEb2N1bWVudGF0aW9uL3Bvd2VyL3MycmFtLnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbikuCisKK0luaXRpYWxseSBpdCBjb250YWlucyAnMCcgd2hpY2ggbWF5IGJlIGNoYW5nZWQgdG8gJzEnIGJ5IHdyaXRpbmcgYSBzdHJpbmcKK3JlcHJlc2VudGluZyBhIG5vbnplcm8gaW50ZWdlciBpbnRvIGl0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9wb3dlcl9zdXBwbHlfY2xhc3MudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9wb3dlcl9zdXBwbHlfY2xhc3MudHh0CmluZGV4IDgyZGFjYzAuLjBjNzI1ODggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvcG93ZXJfc3VwcGx5X2NsYXNzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3Bvd2VyX3N1cHBseV9jbGFzcy50eHQKQEAgLTM5LDggKzM5LDggQEAKIG1hbm5lci4gUmVzdWx0cyBmb3IgZGlmZmVyZW50IHBvd2VyIHN1cHBsaWVzIGFuZCBtYWNoaW5lcyBhcmUgYWxzbyBkaXJlY3RseQogY29tcGFyYWJsZS4KIAotU2VlIGRyaXZlcnMvcG93ZXIvZHMyNzYwX2JhdHRlcnkuYyBhbmQgZHJpdmVycy9wb3dlci9wZGFfcG93ZXIuYyBmb3IgdGhlCi1leGFtcGxlIGhvdyB0byBkZWNsYXJlIGFuZCBoYW5kbGUgYXR0cmlidXRlcy4KK1NlZSBkcml2ZXJzL3Bvd2VyL3N1cHBseS9kczI3NjBfYmF0dGVyeS5jIGFuZCBkcml2ZXJzL3Bvd2VyL3N1cHBseS9wZGFfcG93ZXIuYworZm9yIHRoZSBleGFtcGxlIGhvdyB0byBkZWNsYXJlIGFuZCBoYW5kbGUgYXR0cmlidXRlcy4KIAogCiBVbml0cwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL3RyYW5zYWN0aW9uYWxfbWVtb3J5LnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXJwYy90cmFuc2FjdGlvbmFsX21lbW9yeS50eHQKaW5kZXggYmEwYTJhNC4uZTMyZmRiYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL3RyYW5zYWN0aW9uYWxfbWVtb3J5LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvdHJhbnNhY3Rpb25hbF9tZW1vcnkudHh0CkBAIC0xNjcsNiArMTY3LDggQEAKIEZvciBzaWduYWxzIHRha2VuIGluIG5vbi1UTSBvciBzdXNwZW5kZWQgbW9kZSwgd2UgdXNlIHRoZQogbm9ybWFsL25vbi1jaGVja3BvaW50ZWQgc3RhY2sgcG9pbnRlci4KIAorQW55IHRyYW5zYWN0aW9uIGluaXRpYXRlZCBpbnNpZGUgYSBzaWdoYW5kbGVyIGFuZCBzdXNwZW5kZWQgb24gcmV0dXJuCitmcm9tIHRoZSBzaWdoYW5kbGVyIHRvIHRoZSBrZXJuZWwgd2lsbCBnZXQgcmVjbGFpbWVkIGFuZCBkaXNjYXJkZWQuCiAKIEZhaWx1cmUgY2F1c2UgY29kZXMgdXNlZCBieSBrZXJuZWwKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcmFwaWRpby9tcG9ydF9jZGV2LnR4dCBiL0RvY3VtZW50YXRpb24vcmFwaWRpby9tcG9ydF9jZGV2LnR4dAppbmRleCA2ZTQ5MWE2Li5hNTNmNzg2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3JhcGlkaW8vbXBvcnRfY2Rldi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9yYXBpZGlvL21wb3J0X2NkZXYudHh0CkBAIC04MCw2ICs4MCwxMCBAQAogCiBJSUkuIE1vZHVsZSBwYXJhbWV0ZXJzCiAKKy0gJ2RtYV90aW1lb3V0JyAtIERNQSB0cmFuc2ZlciBjb21wbGV0aW9uIHRpbWVvdXQgKGluIG1zZWMsIGRlZmF1bHQgdmFsdWUgMzAwMCkuCisgICAgICAgIFRoaXMgcGFyYW1ldGVyIHNldCBhIG1heGltdW0gY29tcGxldGlvbiB3YWl0IHRpbWUgZm9yIFNZTkMgbW9kZSBETUEKKyAgICAgICAgdHJhbnNmZXIgcmVxdWVzdHMgYW5kIGZvciBSSU9fV0FJVF9GT1JfQVNZTkMgaW9jdGwgcmVxdWVzdHMuCisKIC0gJ2RiZ19sZXZlbCcgLSBUaGlzIHBhcmFtZXRlciBhbGxvd3MgdG8gY29udHJvbCBhbW91bnQgb2YgZGVidWcgaW5mb3JtYXRpb24KICAgICAgICAgZ2VuZXJhdGVkIGJ5IHRoaXMgZGV2aWNlIGRyaXZlci4gVGhpcyBwYXJhbWV0ZXIgaXMgZm9ybWVkIGJ5IHNldCBvZgogICAgICAgICBiaXQgbWFza3MgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBzcGVjaWZpYyBmdW5jdGlvbmFsIGJsb2Nrcy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcmVtb3RlcHJvYy50eHQgYi9Eb2N1bWVudGF0aW9uL3JlbW90ZXByb2MudHh0CmluZGV4IGVmMDIxOWYuLmYwNzU5NzQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcmVtb3RlcHJvYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9yZW1vdGVwcm9jLnR4dApAQCAtMTAxLDkgKzEwMSw5IEBACiAgICAgICBPbiBzdWNjZXNzLCB0aGUgbmV3IHJwcm9jIGlzIHJldHVybmVkLCBhbmQgb24gZmFpbHVyZSwgTlVMTC4KIAogICAgICAgTm90ZTogX25ldmVyXyBkaXJlY3RseSBkZWFsbG9jYXRlIEBycHJvYywgZXZlbiBpZiBpdCB3YXMgbm90IHJlZ2lzdGVyZWQKLSAgICAgIHlldC4gSW5zdGVhZCwgd2hlbiB5b3UgbmVlZCB0byB1bnJvbGwgcnByb2NfYWxsb2MoKSwgdXNlIHJwcm9jX3B1dCgpLgorICAgICAgeWV0LiBJbnN0ZWFkLCB3aGVuIHlvdSBuZWVkIHRvIHVucm9sbCBycHJvY19hbGxvYygpLCB1c2UgcnByb2NfZnJlZSgpLgogCi0gIHZvaWQgcnByb2NfcHV0KHN0cnVjdCBycHJvYyAqcnByb2MpCisgIHZvaWQgcnByb2NfZnJlZShzdHJ1Y3QgcnByb2MgKnJwcm9jKQogICAgIC0gRnJlZSBhbiBycHJvYyBoYW5kbGUgdGhhdCB3YXMgYWxsb2NhdGVkIGJ5IHJwcm9jX2FsbG9jLgogICAgICAgVGhpcyBmdW5jdGlvbiBlc3NlbnRpYWxseSB1bnJvbGxzIHJwcm9jX2FsbG9jKCksIGJ5IGRlY3JlbWVudGluZyB0aGUKICAgICAgIHJwcm9jJ3MgcmVmY291bnQuIEl0IGRvZXNuJ3QgZGlyZWN0bHkgZnJlZSBycHJvYzsgdGhhdCB3b3VsZCBoYXBwZW4KQEAgLTEzMSw3ICsxMzEsNyBAQAogICAgICAgaGFzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCiAKICAgICAgIEFmdGVyIHJwcm9jX2RlbCgpIHJldHVybnMsIEBycHJvYyBpcyBzdGlsbCB2YWxpZCwgYW5kIGl0cwotICAgICAgbGFzdCByZWZjb3VudCBzaG91bGQgYmUgZGVjcmVtZW50ZWQgYnkgY2FsbGluZyBycHJvY19wdXQoKS4KKyAgICAgIGxhc3QgcmVmY291bnQgc2hvdWxkIGJlIGRlY3JlbWVudGVkIGJ5IGNhbGxpbmcgcnByb2NfZnJlZSgpLgogCiAgICAgICBSZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgLUVJTlZBTCBpZiBAcnByb2MgaXNuJ3QgdmFsaWQuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NoZWR1bGVyL3NjaGVkLWRlYWRsaW5lLnR4dCBiL0RvY3VtZW50YXRpb24vc2NoZWR1bGVyL3NjaGVkLWRlYWRsaW5lLnR4dAppbmRleCA1M2EyZmUxLi44ZTM3YjBiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1kZWFkbGluZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtZGVhZGxpbmUudHh0CkBAIC0xNiw2ICsxNiw3IEBACiAgICA0LjEgU3lzdGVtLXdpZGUgc2V0dGluZ3MKICAgIDQuMiBUYXNrIGludGVyZmFjZQogICAgNC4zIERlZmF1bHQgYmVoYXZpb3IKKyAgIDQuNCBCZWhhdmlvciBvZiBzY2hlZF95aWVsZCgpCiAgNS4gVGFza3MgQ1BVIGFmZmluaXR5CiAgICA1LjEgU0NIRURfREVBRExJTkUgYW5kIGNwdXNldHMgSE9XVE8KICA2LiBGdXR1cmUgcGxhbnMKQEAgLTQyNiw2ICs0MjcsMjMgQEAKICBGaW5hbGx5LCBub3RpY2UgdGhhdCBpbiBvcmRlciBub3QgdG8gamVvcGFyZGl6ZSB0aGUgYWRtaXNzaW9uIGNvbnRyb2wgYQogIC1kZWFkbGluZSB0YXNrIGNhbm5vdCBmb3JrLgogCisKKzQuNCBCZWhhdmlvciBvZiBzY2hlZF95aWVsZCgpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgV2hlbiBhIFNDSEVEX0RFQURMSU5FIHRhc2sgY2FsbHMgc2NoZWRfeWllbGQoKSwgaXQgZ2l2ZXMgdXAgaXRzCisgcmVtYWluaW5nIHJ1bnRpbWUgYW5kIGlzIGltbWVkaWF0ZWx5IHRocm90dGxlZCwgdW50aWwgdGhlIG5leHQKKyBwZXJpb2QsIHdoZW4gaXRzIHJ1bnRpbWUgd2lsbCBiZSByZXBsZW5pc2hlZCAoYSBzcGVjaWFsIGZsYWcKKyBkbF95aWVsZGVkIGlzIHNldCBhbmQgdXNlZCB0byBoYW5kbGUgY29ycmVjdGx5IHRocm90dGxpbmcgYW5kIHJ1bnRpbWUKKyByZXBsZW5pc2htZW50IGFmdGVyIGEgY2FsbCB0byBzY2hlZF95aWVsZCgpKS4KKworIFRoaXMgYmVoYXZpb3Igb2Ygc2NoZWRfeWllbGQoKSBhbGxvd3MgdGhlIHRhc2sgdG8gd2FrZS11cCBleGFjdGx5IGF0CisgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBwZXJpb2QuIEFsc28sIHRoaXMgbWF5IGJlIHVzZWZ1bCBpbiB0aGUKKyBmdXR1cmUgd2l0aCBiYW5kd2lkdGggcmVjbGFpbWluZyBtZWNoYW5pc21zLCB3aGVyZSBzY2hlZF95aWVsZCgpIHdpbGwKKyBtYWtlIHRoZSBsZWZ0b2V2ZXIgcnVudGltZSBhdmFpbGFibGUgZm9yIHJlY2xhbWF0aW9uIGJ5IG90aGVyCisgU0NIRURfREVBRExJTkUgdGFza3MuCisKKwogNS4gVGFza3MgQ1BVIGFmZmluaXR5CiA9PT09PT09PT09PT09PT09PT09PT0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL3Njc2ktcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL3Njc2kvc2NzaS1wYXJhbWV0ZXJzLnR4dAppbmRleCAxMjQxYWMxLi5kNWFlNmNlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Njc2kvc2NzaS1wYXJhbWV0ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvc2NzaS1wYXJhbWV0ZXJzLnR4dApAQCAtNzksOCArNzksNiBAQAogCiAJbmNyNTNjOHh4PQlbSFcsU0NTSV0KIAotCW5vZGlzY29ubmVjdAlbSFcsU0NTSSxNNjhLXSBEaXNhYmxlcyBTQ1NJIGRpc2Nvbm5lY3RzLgotCiAJb3NzdD0JCVtIVyxTQ1NJXSBTQ1NJIFRhcGUgRHJpdmVyCiAJCQlGb3JtYXQ6IDxidWZmZXJfc2l6ZT4sPHdyaXRlX3RocmVzaG9sZD4KIAkJCVNlZSBhbHNvIERvY3VtZW50YXRpb24vc2NzaS9zdC50eHQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NlcmlhbC9zZXJpYWwtcnM0ODUudHh0IGIvRG9jdW1lbnRhdGlvbi9zZXJpYWwvc2VyaWFsLXJzNDg1LnR4dAppbmRleCAyMjUzYjhiLi4zODlmY2Q0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NlcmlhbC9zZXJpYWwtcnM0ODUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc2VyaWFsL3NlcmlhbC1yczQ4NS50eHQKQEAgLTQ1LDkgKzQ1LDggQEAKIAogCSNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KIAotCS8qIFJTNDg1IGlvY3RsczogKi8KLQkjZGVmaW5lIFRJT0NHUlM0ODUgICAgICAweDU0MkUKLQkjZGVmaW5lIFRJT0NTUlM0ODUgICAgICAweDU0MkYKKwkvKiBJbmNsdWRlIGRlZmluaXRpb24gZm9yIFJTNDg1IGlvY3RsczogVElPQ0dSUzQ4NSBhbmQgVElPQ1NSUzQ4NSAqLworCSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KIAogCS8qIE9wZW4geW91ciBzcGVjaWZpYyBkZXZpY2UgKGUuZy4sIC9kZXYvbXlkZXZpY2UpOiAqLwogCWludCBmZCA9IG9wZW4gKCIvZGV2L215ZGV2aWNlIiwgT19SRFdSKTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3BhcnNlLnR4dCBiL0RvY3VtZW50YXRpb24vc3BhcnNlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNlYWIxMy4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL3NwYXJzZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotQ29weXJpZ2h0IDIwMDQgTGludXMgVG9ydmFsZHMKLUNvcHlyaWdodCAyMDA0IFBhdmVsIE1hY2hlayA8cGF2ZWxAdWN3LmN6PgotQ29weXJpZ2h0IDIwMDYgQm9iIENvcGVsYW5kIDxtZUBib2Jjb3BlbGFuZC5jb20+Ci0KLVVzaW5nIHNwYXJzZSBmb3IgdHlwZWNoZWNraW5nCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotCi0iX19iaXR3aXNlIiBpcyBhIHR5cGUgYXR0cmlidXRlLCBzbyB5b3UgaGF2ZSB0byBkbyBzb21ldGhpbmcgbGlrZSB0aGlzOgotCi0gICAgICAgIHR5cGVkZWYgaW50IF9fYml0d2lzZSBwbV9yZXF1ZXN0X3Q7Ci0KLSAgICAgICAgZW51bSBwbV9yZXF1ZXN0IHsKLSAgICAgICAgICAgICAgICBQTV9TVVNQRU5EID0gKF9fZm9yY2UgcG1fcmVxdWVzdF90KSAxLAotICAgICAgICAgICAgICAgIFBNX1JFU1VNRSA9IChfX2ZvcmNlIHBtX3JlcXVlc3RfdCkgMgotICAgICAgICB9OwotCi13aGljaCBtYWtlcyBQTV9TVVNQRU5EIGFuZCBQTV9SRVNVTUUgImJpdHdpc2UiIGludGVnZXJzICh0aGUgIl9fZm9yY2UiIGlzCi10aGVyZSBiZWNhdXNlIHNwYXJzZSB3aWxsIGNvbXBsYWluIGFib3V0IGNhc3RpbmcgdG8vZnJvbSBhIGJpdHdpc2UgdHlwZSwKLWJ1dCBpbiB0aGlzIGNhc2Ugd2UgcmVhbGx5IF9kb18gd2FudCB0byBmb3JjZSB0aGUgY29udmVyc2lvbikuIEFuZCBiZWNhdXNlCi10aGUgZW51bSB2YWx1ZXMgYXJlIGFsbCB0aGUgc2FtZSB0eXBlLCBub3cgImVudW0gcG1fcmVxdWVzdCIgd2lsbCBiZSB0aGF0Ci10eXBlIHRvby4KLQotQW5kIHdpdGggZ2NjLCBhbGwgdGhlIF9fYml0d2lzZS9fX2ZvcmNlIHN0dWZmIGdvZXMgYXdheSwgYW5kIGl0IGFsbCBlbmRzCi11cCBsb29raW5nIGp1c3QgbGlrZSBpbnRlZ2VycyB0byBnY2MuCi0KLVF1aXRlIGZyYW5rbHksIHlvdSBkb24ndCBuZWVkIHRoZSBlbnVtIHRoZXJlLiBUaGUgYWJvdmUgYWxsIHJlYWxseSBqdXN0Ci1ib2lscyBkb3duIHRvIG9uZSBzcGVjaWFsICJpbnQgX19iaXR3aXNlIiB0eXBlLgotCi1TbyB0aGUgc2ltcGxlciB3YXkgaXMgdG8ganVzdCBkbwotCi0gICAgICAgIHR5cGVkZWYgaW50IF9fYml0d2lzZSBwbV9yZXF1ZXN0X3Q7Ci0KLSAgICAgICAgI2RlZmluZSBQTV9TVVNQRU5EICgoX19mb3JjZSBwbV9yZXF1ZXN0X3QpIDEpCi0gICAgICAgICNkZWZpbmUgUE1fUkVTVU1FICgoX19mb3JjZSBwbV9yZXF1ZXN0X3QpIDIpCi0KLWFuZCB5b3Ugbm93IGhhdmUgYWxsIHRoZSBpbmZyYXN0cnVjdHVyZSBuZWVkZWQgZm9yIHN0cmljdCB0eXBlY2hlY2tpbmcuCi0KLU9uZSBzbWFsbCBub3RlOiB0aGUgY29uc3RhbnQgaW50ZWdlciAiMCIgaXMgc3BlY2lhbC4gWW91IGNhbiB1c2UgYQotY29uc3RhbnQgemVybyBhcyBhIGJpdHdpc2UgaW50ZWdlciB0eXBlIHdpdGhvdXQgc3BhcnNlIGV2ZXIgY29tcGxhaW5pbmcuCi1UaGlzIGlzIGJlY2F1c2UgImJpdHdpc2UiIChhcyB0aGUgbmFtZSBpbXBsaWVzKSB3YXMgZGVzaWduZWQgZm9yIG1ha2luZwotc3VyZSB0aGF0IGJpdHdpc2UgdHlwZXMgZG9uJ3QgZ2V0IG1peGVkIHVwIChsaXR0bGUtZW5kaWFuIHZzIGJpZy1lbmRpYW4KLXZzIGNwdS1lbmRpYW4gdnMgd2hhdGV2ZXIpLCBhbmQgdGhlcmUgdGhlIGNvbnN0YW50ICIwIiByZWFsbHkgX2lzXwotc3BlY2lhbC4KLQotX19iaXR3aXNlX18gLSB0byBiZSB1c2VkIGZvciByZWxhdGl2ZWx5IGNvbXBhY3Qgc3R1ZmYgKGdmcF90LCBldGMuKSB0aGF0Ci1pcyBtb3N0bHkgd2FybmluZy1mcmVlIGFuZCBpcyBzdXBwb3NlZCB0byBzdGF5IHRoYXQgd2F5LiAgV2FybmluZ3Mgd2lsbAotYmUgZ2VuZXJhdGVkIHdpdGhvdXQgX19DSEVDS19FTkRJQU5fXy4KLQotX19iaXR3aXNlIC0gbm9pc3kgc3R1ZmY7IGluIHBhcnRpY3VsYXIsIF9fbGUqL19fYmUqIGFyZSB0aGF0LiAgV2UgcmVhbGx5Ci1kb24ndCB3YW50IHRvIGRyb3duIGluIG5vaXNlIHVubGVzcyB3ZSdkIGV4cGxpY2l0bHkgYXNrZWQgZm9yIGl0LgotCi1Vc2luZyBzcGFyc2UgZm9yIGxvY2sgY2hlY2tpbmcKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotCi1UaGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgdW5kZWZpbmVkIGZvciBnY2MgYW5kIGRlZmluZWQgZHVyaW5nIGEgc3BhcnNlCi1ydW4gdG8gdXNlIHRoZSAiY29udGV4dCIgdHJhY2tpbmcgZmVhdHVyZSBvZiBzcGFyc2UsIGFwcGxpZWQgdG8KLWxvY2tpbmcuICBUaGVzZSBhbm5vdGF0aW9ucyB0ZWxsIHNwYXJzZSB3aGVuIGEgbG9jayBpcyBoZWxkLCB3aXRoCi1yZWdhcmQgdG8gdGhlIGFubm90YXRlZCBmdW5jdGlvbidzIGVudHJ5IGFuZCBleGl0LgotCi1fX211c3RfaG9sZCAtIFRoZSBzcGVjaWZpZWQgbG9jayBpcyBoZWxkIG9uIGZ1bmN0aW9uIGVudHJ5IGFuZCBleGl0LgotCi1fX2FjcXVpcmVzIC0gVGhlIHNwZWNpZmllZCBsb2NrIGlzIGhlbGQgb24gZnVuY3Rpb24gZXhpdCwgYnV0IG5vdCBlbnRyeS4KLQotX19yZWxlYXNlcyAtIFRoZSBzcGVjaWZpZWQgbG9jayBpcyBoZWxkIG9uIGZ1bmN0aW9uIGVudHJ5LCBidXQgbm90IGV4aXQuCi0KLUlmIHRoZSBmdW5jdGlvbiBlbnRlcnMgYW5kIGV4aXRzIHdpdGhvdXQgdGhlIGxvY2sgaGVsZCwgYWNxdWlyaW5nIGFuZAotcmVsZWFzaW5nIHRoZSBsb2NrIGluc2lkZSB0aGUgZnVuY3Rpb24gaW4gYSBiYWxhbmNlZCB3YXksIG5vCi1hbm5vdGF0aW9uIGlzIG5lZWRlZC4gIFRoZSB0cmVlIGFubm90YXRpb25zIGFib3ZlIGFyZSBmb3IgY2FzZXMgd2hlcmUKLXNwYXJzZSB3b3VsZCBvdGhlcndpc2UgcmVwb3J0IGEgY29udGV4dCBpbWJhbGFuY2UuCi0KLUdldHRpbmcgc3BhcnNlCi1+fn5+fn5+fn5+fn5+fgotCi1Zb3UgY2FuIGdldCBsYXRlc3QgcmVsZWFzZWQgdmVyc2lvbnMgZnJvbSB0aGUgU3BhcnNlIGhvbWVwYWdlIGF0Ci1odHRwczovL3NwYXJzZS53aWtpLmtlcm5lbC5vcmcvaW5kZXgucGhwL01haW5fUGFnZQotCi1BbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGdldCBzbmFwc2hvdHMgb2YgdGhlIGxhdGVzdCBkZXZlbG9wbWVudCB2ZXJzaW9uCi1vZiBzcGFyc2UgdXNpbmcgZ2l0IHRvIGNsb25lLi4KLQotICAgICAgICBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2RldmVsL3NwYXJzZS9zcGFyc2UuZ2l0Ci0KLURhdmVKIGhhcyBob3VybHkgZ2VuZXJhdGVkIHRhcmJhbGxzIG9mIHRoZSBnaXQgdHJlZSBhdmFpbGFibGUgYXQuLgotCi0gICAgICAgIGh0dHA6Ly93d3cuY29kZW1vbmtleS5vcmcudWsvcHJvamVjdHMvZ2l0LXNuYXBzaG90cy9zcGFyc2UvCi0KLQotT25jZSB5b3UgaGF2ZSBpdCwganVzdCBkbwotCi0gICAgICAgIG1ha2UKLSAgICAgICAgbWFrZSBpbnN0YWxsCi0KLWFzIGEgcmVndWxhciB1c2VyLCBhbmQgaXQgd2lsbCBpbnN0YWxsIHNwYXJzZSBpbiB5b3VyIH4vYmluIGRpcmVjdG9yeS4KLQotVXNpbmcgc3BhcnNlCi1+fn5+fn5+fn5+fn4KLQotRG8gYSBrZXJuZWwgbWFrZSB3aXRoICJtYWtlIEM9MSIgdG8gcnVuIHNwYXJzZSBvbiBhbGwgdGhlIEMgZmlsZXMgdGhhdCBnZXQKLXJlY29tcGlsZWQsIG9yIHVzZSAibWFrZSBDPTIiIHRvIHJ1biBzcGFyc2Ugb24gdGhlIGZpbGVzIHdoZXRoZXIgdGhleSBuZWVkIHRvCi1iZSByZWNvbXBpbGVkIG9yIG5vdC4gIFRoZSBsYXR0ZXIgaXMgYSBmYXN0IHdheSB0byBjaGVjayB0aGUgd2hvbGUgdHJlZSBpZiB5b3UKLWhhdmUgYWxyZWFkeSBidWlsdCBpdC4KLQotVGhlIG9wdGlvbmFsIG1ha2UgdmFyaWFibGUgQ0YgY2FuIGJlIHVzZWQgdG8gcGFzcyBhcmd1bWVudHMgdG8gc3BhcnNlLiAgVGhlCi1idWlsZCBzeXN0ZW0gcGFzc2VzIC1XYml0d2lzZSB0byBzcGFyc2UgYXV0b21hdGljYWxseS4gIFRvIHBlcmZvcm0gZW5kaWFubmVzcwotY2hlY2tzLCB5b3UgbWF5IGRlZmluZSBfX0NIRUNLX0VORElBTl9fOgotCi0gICAgICAgIG1ha2UgQz0yIENGPSItRF9fQ0hFQ0tfRU5ESUFOX18iCi0KLVRoZXNlIGNoZWNrcyBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdCBhcyB0aGV5IGdlbmVyYXRlIGEgaG9zdCBvZiB3YXJuaW5ncy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3BoaW54LXN0YXRpYy90aGVtZV9vdmVycmlkZXMuY3NzIGIvRG9jdW1lbnRhdGlvbi9zcGhpbngtc3RhdGljL3RoZW1lX292ZXJyaWRlcy5jc3MKaW5kZXggM2EyYWM0Yi4uZDU3NjRhNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zcGhpbngtc3RhdGljL3RoZW1lX292ZXJyaWRlcy5jc3MKKysrIGIvRG9jdW1lbnRhdGlvbi9zcGhpbngtc3RhdGljL3RoZW1lX292ZXJyaWRlcy5jc3MKQEAgLTQyLDExICs0MiwyNiBAQAogICAgIGNhcHRpb24gYS5oZWFkZXJsaW5rIHsgb3BhY2l0eTogMDsgfQogICAgIGNhcHRpb24gYS5oZWFkZXJsaW5rOmhvdmVyIHsgb3BhY2l0eTogMTsgfQogCi0gICAgLyogaW5saW5lIGxpdGVyYWw6IGRyb3AgdGhlIGJvcmRlcmJveCBhbmQgcmVkIGNvbG9yICovCisgICAgLyogTWVudSBzZWxlY3Rpb24gYW5kIGtleXN0cm9rZXMgKi8KKworICAgIHNwYW4ubWVudXNlbGVjdGlvbiB7CisJY29sb3I6IGJsdWU7CisJZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm9zcGFjZQorICAgIH0KKworICAgIGNvZGUua2JkLCBjb2RlLmtiZCBzcGFuIHsKKwljb2xvcjogd2hpdGU7CisJYmFja2dyb3VuZC1jb2xvcjogZGFya2JsdWU7CisJZm9udC13ZWlnaHQ6IGJvbGQ7CisJZm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm9zcGFjZQorICAgIH0KKworICAgIC8qIGlubGluZSBsaXRlcmFsOiBkcm9wIHRoZSBib3JkZXJib3gsIHBhZGRpbmcgYW5kIHJlZCBjb2xvciAqLwogCiAgICAgY29kZSwgLnJzdC1jb250ZW50IHR0LCAucnN0LWNvbnRlbnQgY29kZSB7CiAgICAgICAgIGNvbG9yOiBpbmhlcml0OwogICAgICAgICBib3JkZXI6IG5vbmU7CisgICAgICAgIHBhZGRpbmc6IHVuc2V0OwogICAgICAgICBiYWNrZ3JvdW5kOiBpbmhlcml0OwogICAgICAgICBmb250LXNpemU6IDg1JTsKICAgICB9CkBAIC01NCw1ICs2OSw0IEBACiAgICAgLnJzdC1jb250ZW50IHR0LmxpdGVyYWwsLnJzdC1jb250ZW50IHR0LmxpdGVyYWwsLnJzdC1jb250ZW50IGNvZGUubGl0ZXJhbCB7CiAgICAgICAgIGNvbG9yOiBpbmhlcml0OwogICAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zcGhpbngvY2RvbWFpbi5weSBiL0RvY3VtZW50YXRpb24vc3BoaW54L2Nkb21haW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYwNDE5YwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vc3BoaW54L2Nkb21haW4ucHkKQEAgLTAsMCArMSwxNjUgQEAKKyMgLSotIGNvZGluZzogdXRmLTg7IG1vZGU6IHB5dGhvbiAtKi0KKyMgcHlsaW50OiBkaXNhYmxlPVcwMTQxLEMwMTEzLEMwMTAzLEMwMzI1Cit1IiIiCisgICAgY2RvbWFpbgorICAgIH5+fn5+fn4KKworICAgIFJlcGxhY2VtZW50IGZvciB0aGUgc3BoaW54IGMtZG9tYWluLgorCisgICAgOmNvcHlyaWdodDogIENvcHlyaWdodCAoQykgMjAxNiAgTWFya3VzIEhlaXNlcgorICAgIDpsaWNlbnNlOiAgICBHUEwgVmVyc2lvbiAyLCBKdW5lIDE5OTEgc2VlIExpbnV4L0NPUFlJTkcgZm9yIGRldGFpbHMuCisKKyAgICBMaXN0IG9mIGN1c3RvbWl6YXRpb25zOgorCisgICAgKiBNb3ZlZCB0aGUgKmR1cGxpY2F0ZSBDIG9iamVjdCBkZXNjcmlwdGlvbiogd2FybmluZ3MgZm9yIGZ1bmN0aW9uCisgICAgICBkZWNsYXJhdGlvbnMgaW4gdGhlIG5pdHBpY2t5IG1vZGUuIFNlZSBTcGhpbnggZG9jdW1lbnRhdGlvbiBmb3IKKyAgICAgIHRoZSBjb25maWcgdmFsdWVzIGZvciBgYG5pdHBpY2tgYCBhbmQgYGBuaXRwaWNrX2lnbm9yZWBgLgorCisgICAgKiBBZGQgb3B0aW9uICduYW1lJyB0byB0aGUgImM6ZnVuY3Rpb246IiBkaXJlY3RpdmUuICBXaXRoIG9wdGlvbiAnbmFtZScgdGhlCisgICAgICByZWYtbmFtZSBvZiBhIGZ1bmN0aW9uIGNhbiBiZSBtb2RpZmllZC4gRS5nLjo6CisKKyAgICAgICAgICAuLiBjOmZ1bmN0aW9uOjogaW50IGlvY3RsKCBpbnQgZmQsIGludCByZXF1ZXN0ICkKKyAgICAgICAgICAgICA6bmFtZTogVklESU9DX0xPR19TVEFUVVMKKworICAgICAgVGhlIGZ1bmMtbmFtZSAoZS5nLiBpb2N0bCkgcmVtYWlucyBpbiB0aGUgb3V0cHV0IGJ1dCB0aGUgcmVmLW5hbWUgY2hhbmdlZAorICAgICAgZnJvbSAnaW9jdGwnIHRvICdWSURJT0NfTE9HX1NUQVRVUycuIFRoZSBmdW5jdGlvbiBpcyByZWZlcmVuY2VkIGJ5OjoKKworICAgICAgICAgICogOmM6ZnVuYzpgVklESU9DX0xPR19TVEFUVVNgIG9yCisgICAgICAgICAgKiA6YW55OmBWSURJT0NfTE9HX1NUQVRVU2AgKGBgOmFueTpgYCBuZWVkcyBzcGhpbnggMS4zKQorCisgICAgICogSGFuZGxlIHNpZ25hdHVyZXMgb2YgZnVuY3Rpb24tbGlrZSBtYWNyb3Mgd2VsbC4gRG9uJ3QgdHJ5IHRvIGRlZHVjZQorICAgICAgIGFyZ3VtZW50cyB0eXBlcyBvZiBmdW5jdGlvbi1saWtlIG1hY3Jvcy4KKworIiIiCisKK2Zyb20gZG9jdXRpbHMgaW1wb3J0IG5vZGVzCitmcm9tIGRvY3V0aWxzLnBhcnNlcnMucnN0IGltcG9ydCBkaXJlY3RpdmVzCisKK2ltcG9ydCBzcGhpbngKK2Zyb20gc3BoaW54IGltcG9ydCBhZGRub2RlcworZnJvbSBzcGhpbnguZG9tYWlucy5jIGltcG9ydCBjX2Z1bmNwdHJfc2lnX3JlLCBjX3NpZ19yZQorZnJvbSBzcGhpbnguZG9tYWlucy5jIGltcG9ydCBDT2JqZWN0IGFzIEJhc2VfQ09iamVjdAorZnJvbSBzcGhpbnguZG9tYWlucy5jIGltcG9ydCBDRG9tYWluIGFzIEJhc2VfQ0RvbWFpbgorCitfX3ZlcnNpb25fXyAgPSAnMS4wJworCisjIEdldCBTcGhpbnggdmVyc2lvbgorbWFqb3IsIG1pbm9yLCBwYXRjaCA9IG1hcChpbnQsIHNwaGlueC5fX3ZlcnNpb25fXy5zcGxpdCgiLiIpKQorCitkZWYgc2V0dXAoYXBwKToKKworICAgIGFwcC5vdmVycmlkZV9kb21haW4oQ0RvbWFpbikKKworICAgIHJldHVybiBkaWN0KAorICAgICAgICB2ZXJzaW9uID0gX192ZXJzaW9uX18sCisgICAgICAgIHBhcmFsbGVsX3JlYWRfc2FmZSA9IFRydWUsCisgICAgICAgIHBhcmFsbGVsX3dyaXRlX3NhZmUgPSBUcnVlCisgICAgKQorCitjbGFzcyBDT2JqZWN0KEJhc2VfQ09iamVjdCk6CisKKyAgICAiIiIKKyAgICBEZXNjcmlwdGlvbiBvZiBhIEMgbGFuZ3VhZ2Ugb2JqZWN0LgorICAgICIiIgorICAgIG9wdGlvbl9zcGVjID0geworICAgICAgICAibmFtZSIgOiBkaXJlY3RpdmVzLnVuY2hhbmdlZAorICAgIH0KKworICAgIGRlZiBoYW5kbGVfZnVuY19saWtlX21hY3JvKHNlbGYsIHNpZywgc2lnbm9kZSk6CisgICAgICAgIHUiIiJIYW5kbGVzIHNpZ25hdHVyZXMgb2YgZnVuY3Rpb24tbGlrZSBtYWNyb3MuCisKKyAgICAgICAgSWYgdGhlIG9ianR5cGUgaXMgJ2Z1bmN0aW9uJyBhbmQgdGhlIHRoZSBzaWduYXR1cmUgYGBzaWdgYCBpcyBhCisgICAgICAgIGZ1bmN0aW9uLWxpa2UgbWFjcm8sIHRoZSBuYW1lIG9mIHRoZSBtYWNybyBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlCisgICAgICAgIGBgRmFsc2VgYCBpcyByZXR1cm5lZC4gICIiIgorCisgICAgICAgIGlmIG5vdCBzZWxmLm9ianR5cGUgPT0gJ2Z1bmN0aW9uJzoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIG0gPSBjX2Z1bmNwdHJfc2lnX3JlLm1hdGNoKHNpZykKKyAgICAgICAgaWYgbSBpcyBOb25lOgorICAgICAgICAgICAgbSA9IGNfc2lnX3JlLm1hdGNoKHNpZykKKyAgICAgICAgICAgIGlmIG0gaXMgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdubyBtYXRjaCcpCisKKyAgICAgICAgcmV0dHlwZSwgZnVsbG5hbWUsIGFyZ2xpc3QsIF9jb25zdCA9IG0uZ3JvdXBzKCkKKyAgICAgICAgYXJnbGlzdCA9IGFyZ2xpc3Quc3RyaXAoKQorICAgICAgICBpZiByZXR0eXBlIG9yIG5vdCBhcmdsaXN0OgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgYXJnbGlzdCA9IGFyZ2xpc3QucmVwbGFjZSgnYCcsICcnKS5yZXBsYWNlKCdcXCAnLCAnJykgIyByZW1vdmUgbWFya3VwCisgICAgICAgIGFyZ2xpc3QgPSBbYS5zdHJpcCgpIGZvciBhIGluIGFyZ2xpc3Quc3BsaXQoIiwiKV0KKworICAgICAgICAjIGhhcyB0aGUgZmlyc3QgYXJndW1lbnQgYSB0eXBlPworICAgICAgICBpZiBsZW4oYXJnbGlzdFswXS5zcGxpdCgiICIpKSA+IDE6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICAjIFRoaXMgaXMgYSBmdW5jdGlvbi1saWtlIG1hY3JvLCBpdCdzIGFyZ3VtZW50cyBhcmUgdHlwZWxlc3MhCisgICAgICAgIHNpZ25vZGUgICs9IGFkZG5vZGVzLmRlc2NfbmFtZShmdWxsbmFtZSwgZnVsbG5hbWUpCisgICAgICAgIHBhcmFtbGlzdCA9IGFkZG5vZGVzLmRlc2NfcGFyYW1ldGVybGlzdCgpCisgICAgICAgIHNpZ25vZGUgICs9IHBhcmFtbGlzdAorCisgICAgICAgIGZvciBhcmduYW1lIGluIGFyZ2xpc3Q6CisgICAgICAgICAgICBwYXJhbSA9IGFkZG5vZGVzLmRlc2NfcGFyYW1ldGVyKCcnLCAnJywgbm9lbXBoPVRydWUpCisgICAgICAgICAgICAjIHNlcGFyYXRlIGJ5IG5vbi1icmVha2luZyBzcGFjZSBpbiB0aGUgb3V0cHV0CisgICAgICAgICAgICBwYXJhbSArPSBub2Rlcy5lbXBoYXNpcyhhcmduYW1lLCBhcmduYW1lKQorICAgICAgICAgICAgcGFyYW1saXN0ICs9IHBhcmFtCisKKyAgICAgICAgcmV0dXJuIGZ1bGxuYW1lCisKKyAgICBkZWYgaGFuZGxlX3NpZ25hdHVyZShzZWxmLCBzaWcsIHNpZ25vZGUpOgorICAgICAgICAiIiJUcmFuc2Zvcm0gYSBDIHNpZ25hdHVyZSBpbnRvIFJTVCBub2Rlcy4iIiIKKworICAgICAgICBmdWxsbmFtZSA9IHNlbGYuaGFuZGxlX2Z1bmNfbGlrZV9tYWNybyhzaWcsIHNpZ25vZGUpCisgICAgICAgIGlmIG5vdCBmdWxsbmFtZToKKyAgICAgICAgICAgIGZ1bGxuYW1lID0gc3VwZXIoQ09iamVjdCwgc2VsZikuaGFuZGxlX3NpZ25hdHVyZShzaWcsIHNpZ25vZGUpCisKKyAgICAgICAgaWYgIm5hbWUiIGluIHNlbGYub3B0aW9uczoKKyAgICAgICAgICAgIGlmIHNlbGYub2JqdHlwZSA9PSAnZnVuY3Rpb24nOgorICAgICAgICAgICAgICAgIGZ1bGxuYW1lID0gc2VsZi5vcHRpb25zWyJuYW1lIl0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBGSVhNRTogaGFuZGxlIDpuYW1lOiB2YWx1ZSBvZiBvdGhlciBkZWNsYXJhdGlvbiB0eXBlcz8KKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHJldHVybiBmdWxsbmFtZQorCisgICAgZGVmIGFkZF90YXJnZXRfYW5kX2luZGV4KHNlbGYsIG5hbWUsIHNpZywgc2lnbm9kZSk6CisgICAgICAgICMgZm9yIEMgQVBJIGl0ZW1zIHdlIGFkZCBhIHByZWZpeCBzaW5jZSBuYW1lcyBhcmUgdXN1YWxseSBub3QgcXVhbGlmaWVkCisgICAgICAgICMgYnkgYSBtb2R1bGUgbmFtZSBhbmQgc28gZWFzaWx5IGNsYXNoIHdpdGggZS5nLiBzZWN0aW9uIHRpdGxlcworICAgICAgICB0YXJnZXRuYW1lID0gJ2MuJyArIG5hbWUKKyAgICAgICAgaWYgdGFyZ2V0bmFtZSBub3QgaW4gc2VsZi5zdGF0ZS5kb2N1bWVudC5pZHM6CisgICAgICAgICAgICBzaWdub2RlWyduYW1lcyddLmFwcGVuZCh0YXJnZXRuYW1lKQorICAgICAgICAgICAgc2lnbm9kZVsnaWRzJ10uYXBwZW5kKHRhcmdldG5hbWUpCisgICAgICAgICAgICBzaWdub2RlWydmaXJzdCddID0gKG5vdCBzZWxmLm5hbWVzKQorICAgICAgICAgICAgc2VsZi5zdGF0ZS5kb2N1bWVudC5ub3RlX2V4cGxpY2l0X3RhcmdldChzaWdub2RlKQorICAgICAgICAgICAgaW52ID0gc2VsZi5lbnYuZG9tYWluZGF0YVsnYyddWydvYmplY3RzJ10KKyAgICAgICAgICAgIGlmIChuYW1lIGluIGludiBhbmQgc2VsZi5lbnYuY29uZmlnLm5pdHBpY2t5KToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLm9ianR5cGUgPT0gJ2Z1bmN0aW9uJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCdjOmZ1bmMnLCBuYW1lKSBub3QgaW4gc2VsZi5lbnYuY29uZmlnLm5pdHBpY2tfaWdub3JlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZV9tYWNoaW5lLnJlcG9ydGVyLndhcm5pbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2R1cGxpY2F0ZSBDIG9iamVjdCBkZXNjcmlwdGlvbiBvZiAlcywgJyAlIG5hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvdGhlciBpbnN0YW5jZSBpbiAnICsgc2VsZi5lbnYuZG9jMnBhdGgoaW52W25hbWVdWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lPXNlbGYubGluZW5vKQorICAgICAgICAgICAgaW52W25hbWVdID0gKHNlbGYuZW52LmRvY25hbWUsIHNlbGYub2JqdHlwZSkKKworICAgICAgICBpbmRleHRleHQgPSBzZWxmLmdldF9pbmRleF90ZXh0KG5hbWUpCisgICAgICAgIGlmIGluZGV4dGV4dDoKKyAgICAgICAgICAgIGlmIG1ham9yID09IDEgYW5kIG1pbm9yIDwgNDoKKyAgICAgICAgICAgICAgICAjIGluZGV4bm9kZSdzIHR1cGxlIGNoYW5nZWQgaW4gMS40CisgICAgICAgICAgICAgICAgIyBodHRwczovL2dpdGh1Yi5jb20vc3BoaW54LWRvYy9zcGhpbngvY29tbWl0L2U2YTVhM2E5MmU5MzhmY2Q3NTg2NmI0MjI3ZGI5ZTA1MjRkNThmN2MKKyAgICAgICAgICAgICAgICBzZWxmLmluZGV4bm9kZVsnZW50cmllcyddLmFwcGVuZCgKKyAgICAgICAgICAgICAgICAgICAgKCdzaW5nbGUnLCBpbmRleHRleHQsIHRhcmdldG5hbWUsICcnKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5pbmRleG5vZGVbJ2VudHJpZXMnXS5hcHBlbmQoCisgICAgICAgICAgICAgICAgICAgICgnc2luZ2xlJywgaW5kZXh0ZXh0LCB0YXJnZXRuYW1lLCAnJywgTm9uZSkpCisKK2NsYXNzIENEb21haW4oQmFzZV9DRG9tYWluKToKKworICAgICIiIkMgbGFuZ3VhZ2UgZG9tYWluLiIiIgorICAgIG5hbWUgPSAnYycKKyAgICBsYWJlbCA9ICdDJworICAgIGRpcmVjdGl2ZXMgPSB7CisgICAgICAgICdmdW5jdGlvbic6IENPYmplY3QsCisgICAgICAgICdtZW1iZXInOiAgIENPYmplY3QsCisgICAgICAgICdtYWNybyc6ICAgIENPYmplY3QsCisgICAgICAgICd0eXBlJzogICAgIENPYmplY3QsCisgICAgICAgICd2YXInOiAgICAgIENPYmplY3QsCisgICAgfQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zcGhpbngva2VybmVsLWRvYy5weSBiL0RvY3VtZW50YXRpb24vc3BoaW54L2tlcm5lbC1kb2MucHkKaW5kZXggZjY5MjBjMC4uZDE1ZTA3ZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zcGhpbngva2VybmVsLWRvYy5weQorKysgYi9Eb2N1bWVudGF0aW9uL3NwaGlueC9rZXJuZWwtZG9jLnB5CkBAIC0zOSw2ICszOSw4IEBACiBmcm9tIHNwaGlueC51dGlsLmNvbXBhdCBpbXBvcnQgRGlyZWN0aXZlCiBmcm9tIHNwaGlueC5leHQuYXV0b2RvYyBpbXBvcnQgQXV0b2RvY1JlcG9ydGVyCiAKK19fdmVyc2lvbl9fICA9ICcxLjAnCisKIGNsYXNzIEtlcm5lbERvY0RpcmVjdGl2ZShEaXJlY3RpdmUpOgogICAgICIiIkV4dHJhY3Qga2VybmVsLWRvYyBjb21tZW50cyBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZSIiIgogICAgIHJlcXVpcmVkX2FyZ3VtZW50ID0gMQpAQCAtMTM5LDMgKzE0MSw5IEBACiAgICAgYXBwLmFkZF9jb25maWdfdmFsdWUoJ2tlcm5lbGRvY192ZXJib3NpdHknLCAxLCAnZW52JykKIAogICAgIGFwcC5hZGRfZGlyZWN0aXZlKCdrZXJuZWwtZG9jJywgS2VybmVsRG9jRGlyZWN0aXZlKQorCisgICAgcmV0dXJuIGRpY3QoCisgICAgICAgIHZlcnNpb24gPSBfX3ZlcnNpb25fXywKKyAgICAgICAgcGFyYWxsZWxfcmVhZF9zYWZlID0gVHJ1ZSwKKyAgICAgICAgcGFyYWxsZWxfd3JpdGVfc2FmZSA9IFRydWUKKyAgICApCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NwaGlueC9rZXJuZWxfaW5jbHVkZS5weSBiL0RvY3VtZW50YXRpb24vc3BoaW54L2tlcm5lbF9pbmNsdWRlLnB5CmluZGV4IGRiNTczODIuLmY1MjNhYTYgMTAwNzU1Ci0tLSBhL0RvY3VtZW50YXRpb24vc3BoaW54L2tlcm5lbF9pbmNsdWRlLnB5CisrKyBiL0RvY3VtZW50YXRpb24vc3BoaW54L2tlcm5lbF9pbmNsdWRlLnB5CkBAIC0zOSwxMSArMzksMTggQEAKIGZyb20gZG9jdXRpbHMucGFyc2Vycy5yc3QuZGlyZWN0aXZlcy5ib2R5IGltcG9ydCBDb2RlQmxvY2ssIE51bWJlckxpbmVzCiBmcm9tIGRvY3V0aWxzLnBhcnNlcnMucnN0LmRpcmVjdGl2ZXMubWlzYyBpbXBvcnQgSW5jbHVkZQogCitfX3ZlcnNpb25fXyAgPSAnMS4wJworCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogZGVmIHNldHVwKGFwcCk6CiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiAgICAgYXBwLmFkZF9kaXJlY3RpdmUoImtlcm5lbC1pbmNsdWRlIiwgS2VybmVsSW5jbHVkZSkKKyAgICByZXR1cm4gZGljdCgKKyAgICAgICAgdmVyc2lvbiA9IF9fdmVyc2lvbl9fLAorICAgICAgICBwYXJhbGxlbF9yZWFkX3NhZmUgPSBUcnVlLAorICAgICAgICBwYXJhbGxlbF93cml0ZV9zYWZlID0gVHJ1ZQorICAgICkKIAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIGNsYXNzIEtlcm5lbEluY2x1ZGUoSW5jbHVkZSk6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NwaGlueC9sb2FkX2NvbmZpZy5weSBiL0RvY3VtZW50YXRpb24vc3BoaW54L2xvYWRfY29uZmlnLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMWEyMWEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3NwaGlueC9sb2FkX2NvbmZpZy5weQpAQCAtMCwwICsxLDMyIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04OyBtb2RlOiBweXRob24gLSotCisjIHB5bGludDogZGlzYWJsZT1SMDkwMywgQzAzMzAsIFIwOTE0LCBSMDkxMiwgRTA0MDEKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitmcm9tIHNwaGlueC51dGlsLnB5Y29tcGF0IGltcG9ydCBleGVjZmlsZV8KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2RlZiBsb2FkQ29uZmlnKG5hbWVzcGFjZSk6CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgdSIiIkxvYWQgYW4gYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGZpbGUgaW50byAqbmFtZXNwYWNlKi4KKworICAgIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgdGFrZW4gZnJvbSB0aGUgZW52aXJvbm1lbnQKKyAgICBgYFNQSElOWF9DT05GYGAuIFRoZSBleHRlcm5hbCBjb25maWd1cmF0aW9uIGZpbGUgZXh0ZW5kcyAob3Igb3ZlcndyaXRlcykgdGhlCisgICAgY29uZmlndXJhdGlvbiB2YWx1ZXMgZnJvbSB0aGUgb3JpZ2luIGBgY29uZi5weWBgLiAgV2l0aCB0aGlzIHlvdSBhcmUgYWJsZSB0bworICAgIG1haW50YWluICpidWlsZCB0aGVtZXMqLiAgIiIiCisKKyAgICBjb25maWdfZmlsZSA9IG9zLmVudmlyb24uZ2V0KCJTUEhJTlhfQ09ORiIsIE5vbmUpCisgICAgaWYgKGNvbmZpZ19maWxlIGlzIG5vdCBOb25lCisgICAgICAgIGFuZCBvcy5wYXRoLm5vcm1wYXRoKG5hbWVzcGFjZVsiX19maWxlX18iXSkgIT0gb3MucGF0aC5ub3JtcGF0aChjb25maWdfZmlsZSkgKToKKyAgICAgICAgY29uZmlnX2ZpbGUgPSBvcy5wYXRoLmFic3BhdGgoY29uZmlnX2ZpbGUpCisKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoY29uZmlnX2ZpbGUpOgorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgibG9hZCBhZGRpdGlvbmFsIHNwaGlueC1jb25maWc6ICVzXG4iICUgY29uZmlnX2ZpbGUpCisgICAgICAgICAgICBjb25maWcgPSBuYW1lc3BhY2UuY29weSgpCisgICAgICAgICAgICBjb25maWdbJ19fZmlsZV9fJ10gPSBjb25maWdfZmlsZQorICAgICAgICAgICAgZXhlY2ZpbGVfKGNvbmZpZ19maWxlLCBjb25maWcpCisgICAgICAgICAgICBkZWwgY29uZmlnWydfX2ZpbGVfXyddCisgICAgICAgICAgICBuYW1lc3BhY2UudXBkYXRlKGNvbmZpZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIldBUk5JTkc6IGFkZGl0aW9uYWwgc3BoaW54LWNvbmZpZyBub3QgZm91bmQ6ICVzXG4iICUgY29uZmlnX2ZpbGUpCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NwaGlueC9wYXJzZS1oZWFkZXJzLnBsIGIvRG9jdW1lbnRhdGlvbi9zcGhpbngvcGFyc2UtaGVhZGVycy5wbAppbmRleCAzNGJkOWUyLi43NDA4OWIwIDEwMDc1NQotLS0gYS9Eb2N1bWVudGF0aW9uL3NwaGlueC9wYXJzZS1oZWFkZXJzLnBsCisrKyBiL0RvY3VtZW50YXRpb24vc3BoaW54L3BhcnNlLWhlYWRlcnMucGwKQEAgLTIyMCw3ICsyMjAsNyBAQAogIwogIyBBZGQgZXNjYXBlIGNvZGVzIGZvciBzcGVjaWFsIGNoYXJhY3RlcnMKICMKLSRkYXRhID1+IHMsKFtcX1xgXCpcPFw+XCZcXFxcOlwvXHxdKSxcXCQxLGc7CiskZGF0YSA9fiBzLChbXF9cYFwqXDxcPlwmXFxcXDpcL1x8XCVcJFwjXHtcfVx+XF5dKSxcXCQxLGc7CiAKICRkYXRhID1+IHMsREVQUkVDQVRFRCwqKkRFUFJFQ0FURUQqKixnOwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NwaGlueC9yc3RGbGF0VGFibGUucHkgYi9Eb2N1bWVudGF0aW9uL3NwaGlueC9yc3RGbGF0VGFibGUucHkKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAyNmRiODUyLi41NWYyNzU3Ci0tLSBhL0RvY3VtZW50YXRpb24vc3BoaW54L3JzdEZsYXRUYWJsZS5weQorKysgYi9Eb2N1bWVudGF0aW9uL3NwaGlueC9yc3RGbGF0VGFibGUucHkKQEAgLTczLDYgKzczLDEyIEBACiAgICAgcm9sZXMucmVnaXN0ZXJfbG9jYWxfcm9sZSgnY3NwYW4nLCBjX3NwYW4pCiAgICAgcm9sZXMucmVnaXN0ZXJfbG9jYWxfcm9sZSgncnNwYW4nLCByX3NwYW4pCiAKKyAgICByZXR1cm4gZGljdCgKKyAgICAgICAgdmVyc2lvbiA9IF9fdmVyc2lvbl9fLAorICAgICAgICBwYXJhbGxlbF9yZWFkX3NhZmUgPSBUcnVlLAorICAgICAgICBwYXJhbGxlbF93cml0ZV9zYWZlID0gVHJ1ZQorICAgICkKKwogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIGRlZiBjX3NwYW4obmFtZSwgcmF3dGV4dCwgdGV4dCwgbGluZW5vLCBpbmxpbmVyLCBvcHRpb25zPU5vbmUsIGNvbnRlbnQ9Tm9uZSk6CiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zdGFibGVfYXBpX25vbnNlbnNlLnR4dCBiL0RvY3VtZW50YXRpb24vc3RhYmxlX2FwaV9ub25zZW5zZS50eHQKaW5kZXggZGIzYmU4OS4uMjRmNWFlZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zdGFibGVfYXBpX25vbnNlbnNlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3N0YWJsZV9hcGlfbm9uc2Vuc2UudHh0CkBAIC0xLDE3ICsxLDI2IEBACisuLiBfc3RhYmxlX2FwaV9ub25zZW5zZToKKwogVGhlIExpbnV4IEtlcm5lbCBEcml2ZXIgSW50ZXJmYWNlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKIChhbGwgb2YgeW91ciBxdWVzdGlvbnMgYW5zd2VyZWQgYW5kIHRoZW4gc29tZSkKIAogR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KIAotVGhpcyBpcyBiZWluZyB3cml0dGVuIHRvIHRyeSB0byBleHBsYWluIHdoeSBMaW51eCBkb2VzIG5vdCBoYXZlIGEgYmluYXJ5Ci1rZXJuZWwgaW50ZXJmYWNlLCBub3IgZG9lcyBpdCBoYXZlIGEgc3RhYmxlIGtlcm5lbCBpbnRlcmZhY2UuICBQbGVhc2UKLXJlYWxpemUgdGhhdCB0aGlzIGFydGljbGUgZGVzY3JpYmVzIHRoZSBfaW4ga2VybmVsXyBpbnRlcmZhY2VzLCBub3QgdGhlCi1rZXJuZWwgdG8gdXNlcnNwYWNlIGludGVyZmFjZXMuICBUaGUga2VybmVsIHRvIHVzZXJzcGFjZSBpbnRlcmZhY2UgaXMKLXRoZSBvbmUgdGhhdCBhcHBsaWNhdGlvbiBwcm9ncmFtcyB1c2UsIHRoZSBzeXNjYWxsIGludGVyZmFjZS4gIFRoYXQKLWludGVyZmFjZSBpcyBfdmVyeV8gc3RhYmxlIG92ZXIgdGltZSwgYW5kIHdpbGwgbm90IGJyZWFrLiAgSSBoYXZlIG9sZAotcHJvZ3JhbXMgdGhhdCB3ZXJlIGJ1aWx0IG9uIGEgcHJlIDAuOXNvbWV0aGluZyBrZXJuZWwgdGhhdCBzdGlsbCB3b3JrCi1qdXN0IGZpbmUgb24gdGhlIGxhdGVzdCAyLjYga2VybmVsIHJlbGVhc2UuICBUaGF0IGludGVyZmFjZSBpcyB0aGUgb25lCi10aGF0IHVzZXJzIGFuZCBhcHBsaWNhdGlvbiBwcm9ncmFtbWVycyBjYW4gY291bnQgb24gYmVpbmcgc3RhYmxlLgorVGhpcyBpcyBiZWluZyB3cml0dGVuIHRvIHRyeSB0byBleHBsYWluIHdoeSBMaW51eCAqKmRvZXMgbm90IGhhdmUgYSBiaW5hcnkKK2tlcm5lbCBpbnRlcmZhY2UsIG5vciBkb2VzIGl0IGhhdmUgYSBzdGFibGUga2VybmVsIGludGVyZmFjZSoqLgorCisuLiBub3RlOjoKKworICBQbGVhc2UgcmVhbGl6ZSB0aGF0IHRoaXMgYXJ0aWNsZSBkZXNjcmliZXMgdGhlICoqaW4ga2VybmVsKiogaW50ZXJmYWNlcywgbm90CisgIHRoZSBrZXJuZWwgdG8gdXNlcnNwYWNlIGludGVyZmFjZXMuCisKKyAgVGhlIGtlcm5lbCB0byB1c2Vyc3BhY2UgaW50ZXJmYWNlIGlzIHRoZSBvbmUgdGhhdCBhcHBsaWNhdGlvbiBwcm9ncmFtcyB1c2UsCisgIHRoZSBzeXNjYWxsIGludGVyZmFjZS4gIFRoYXQgaW50ZXJmYWNlIGlzICoqdmVyeSoqIHN0YWJsZSBvdmVyIHRpbWUsIGFuZAorICB3aWxsIG5vdCBicmVhay4gIEkgaGF2ZSBvbGQgcHJvZ3JhbXMgdGhhdCB3ZXJlIGJ1aWx0IG9uIGEgcHJlIDAuOXNvbWV0aGluZworICBrZXJuZWwgdGhhdCBzdGlsbCB3b3JrIGp1c3QgZmluZSBvbiB0aGUgbGF0ZXN0IDIuNiBrZXJuZWwgcmVsZWFzZS4KKyAgVGhhdCBpbnRlcmZhY2UgaXMgdGhlIG9uZSB0aGF0IHVzZXJzIGFuZCBhcHBsaWNhdGlvbiBwcm9ncmFtbWVycyBjYW4gY291bnQKKyAgb24gYmVpbmcgc3RhYmxlLgogCiAKIEV4ZWN1dGl2ZSBTdW1tYXJ5CkBAIC0zMyw3ICs0Miw3IEBACiB0aGUgd29ybGQsIHRoZXkgbmVpdGhlciBzZWUgdGhpcyBpbnRlcmZhY2UsIG5vciBkbyB0aGV5IGNhcmUgYWJvdXQgaXQgYXQKIGFsbC4KIAotRmlyc3Qgb2ZmLCBJJ20gbm90IGdvaW5nIHRvIGFkZHJlc3MgX2FueV8gbGVnYWwgaXNzdWVzIGFib3V0IGNsb3NlZAorRmlyc3Qgb2ZmLCBJJ20gbm90IGdvaW5nIHRvIGFkZHJlc3MgKiphbnkqKiBsZWdhbCBpc3N1ZXMgYWJvdXQgY2xvc2VkCiBzb3VyY2UsIGhpZGRlbiBzb3VyY2UsIGJpbmFyeSBibG9icywgc291cmNlIHdyYXBwZXJzLCBvciBhbnkgb3RoZXIgdGVybQogdGhhdCBkZXNjcmliZXMga2VybmVsIGRyaXZlcnMgdGhhdCBkbyBub3QgaGF2ZSB0aGVpciBzb3VyY2UgY29kZQogcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4gIFBsZWFzZSBjb25zdWx0IGEgbGF3eWVyIGlmIHlvdSBoYXZlIGFueSBsZWdhbApAQCAtNTEsMTkgKzYwLDIzIEBACiBBc3N1bWluZyB0aGF0IHdlIGhhZCBhIHN0YWJsZSBrZXJuZWwgc291cmNlIGludGVyZmFjZSBmb3IgdGhlIGtlcm5lbCwgYQogYmluYXJ5IGludGVyZmFjZSB3b3VsZCBuYXR1cmFsbHkgaGFwcGVuIHRvbywgcmlnaHQ/ICBXcm9uZy4gIFBsZWFzZQogY29uc2lkZXIgdGhlIGZvbGxvd2luZyBmYWN0cyBhYm91dCB0aGUgTGludXgga2VybmVsOgorCiAgIC0gRGVwZW5kaW5nIG9uIHRoZSB2ZXJzaW9uIG9mIHRoZSBDIGNvbXBpbGVyIHlvdSB1c2UsIGRpZmZlcmVudCBrZXJuZWwKICAgICBkYXRhIHN0cnVjdHVyZXMgd2lsbCBjb250YWluIGRpZmZlcmVudCBhbGlnbm1lbnQgb2Ygc3RydWN0dXJlcywgYW5kCiAgICAgcG9zc2libHkgaW5jbHVkZSBkaWZmZXJlbnQgZnVuY3Rpb25zIGluIGRpZmZlcmVudCB3YXlzIChwdXR0aW5nCiAgICAgZnVuY3Rpb25zIGlubGluZSBvciBub3QuKSAgVGhlIGluZGl2aWR1YWwgZnVuY3Rpb24gb3JnYW5pemF0aW9uCiAgICAgaXNuJ3QgdGhhdCBpbXBvcnRhbnQsIGJ1dCB0aGUgZGlmZmVyZW50IGRhdGEgc3RydWN0dXJlIHBhZGRpbmcgaXMKICAgICB2ZXJ5IGltcG9ydGFudC4KKwogICAtIERlcGVuZGluZyBvbiB3aGF0IGtlcm5lbCBidWlsZCBvcHRpb25zIHlvdSBzZWxlY3QsIGEgd2lkZSByYW5nZSBvZgogICAgIGRpZmZlcmVudCB0aGluZ3MgY2FuIGJlIGFzc3VtZWQgYnkgdGhlIGtlcm5lbDoKKwogICAgICAgLSBkaWZmZXJlbnQgc3RydWN0dXJlcyBjYW4gY29udGFpbiBkaWZmZXJlbnQgZmllbGRzCiAgICAgICAtIFNvbWUgZnVuY3Rpb25zIG1heSBub3QgYmUgaW1wbGVtZW50ZWQgYXQgYWxsLCAoaS5lLiBzb21lIGxvY2tzCiAJY29tcGlsZSBhd2F5IHRvIG5vdGhpbmcgZm9yIG5vbi1TTVAgYnVpbGRzLikKICAgICAgIC0gTWVtb3J5IHdpdGhpbiB0aGUga2VybmVsIGNhbiBiZSBhbGlnbmVkIGluIGRpZmZlcmVudCB3YXlzLAogCWRlcGVuZGluZyBvbiB0aGUgYnVpbGQgb3B0aW9ucy4KKwogICAtIExpbnV4IHJ1bnMgb24gYSB3aWRlIHJhbmdlIG9mIGRpZmZlcmVudCBwcm9jZXNzb3IgYXJjaGl0ZWN0dXJlcy4KICAgICBUaGVyZSBpcyBubyB3YXkgdGhhdCBiaW5hcnkgZHJpdmVycyBmcm9tIG9uZSBhcmNoaXRlY3R1cmUgd2lsbCBydW4KICAgICBvbiBhbm90aGVyIGFyY2hpdGVjdHVyZSBwcm9wZXJseS4KQEAgLTEwNSw2ICsxMTgsNyBAQAogdW5kZXJnb25lIGF0IGxlYXN0IHRocmVlIGRpZmZlcmVudCByZXdvcmtzIG92ZXIgdGhlIGxpZmV0aW1lIG9mIHRoaXMKIHN1YnN5c3RlbS4gIFRoZXNlIHJld29ya3Mgd2VyZSBkb25lIHRvIGFkZHJlc3MgYSBudW1iZXIgb2YgZGlmZmVyZW50CiBpc3N1ZXM6CisKICAgLSBBIGNoYW5nZSBmcm9tIGEgc3luY2hyb25vdXMgbW9kZWwgb2YgZGF0YSBzdHJlYW1zIHRvIGFuIGFzeW5jaHJvbm91cwogICAgIG9uZS4gIFRoaXMgcmVkdWNlZCB0aGUgY29tcGxleGl0eSBvZiBhIG51bWJlciBvZiBkcml2ZXJzIGFuZAogICAgIGluY3JlYXNlZCB0aGUgdGhyb3VnaHB1dCBvZiBhbGwgVVNCIGRyaXZlcnMgc3VjaCB0aGF0IHdlIGFyZSBub3cKQEAgLTE2Niw2ICsxODAsNyBAQAogCiBUaGUgdmVyeSBnb29kIHNpZGUgZWZmZWN0cyBvZiBoYXZpbmcgeW91ciBkcml2ZXIgaW4gdGhlIG1haW4ga2VybmVsIHRyZWUKIGFyZToKKwogICAtIFRoZSBxdWFsaXR5IG9mIHRoZSBkcml2ZXIgd2lsbCByaXNlIGFzIHRoZSBtYWludGVuYW5jZSBjb3N0cyAodG8gdGhlCiAgICAgb3JpZ2luYWwgZGV2ZWxvcGVyKSB3aWxsIGRlY3JlYXNlLgogICAtIE90aGVyIGRldmVsb3BlcnMgd2lsbCBhZGQgZmVhdHVyZXMgdG8geW91ciBkcml2ZXIuCkBAIC0xNzUsNyArMTkwLDcgQEAKICAgICBjaGFuZ2VzIHJlcXVpcmUgaXQuCiAgIC0gVGhlIGRyaXZlciBhdXRvbWF0aWNhbGx5IGdldHMgc2hpcHBlZCBpbiBhbGwgTGludXggZGlzdHJpYnV0aW9ucwogICAgIHdpdGhvdXQgaGF2aW5nIHRvIGFzayB0aGUgZGlzdHJvcyB0byBhZGQgaXQuCi0gICAgCisKIEFzIExpbnV4IHN1cHBvcnRzIGEgbGFyZ2VyIG51bWJlciBvZiBkaWZmZXJlbnQgZGV2aWNlcyAib3V0IG9mIHRoZSBib3giCiB0aGFuIGFueSBvdGhlciBvcGVyYXRpbmcgc3lzdGVtLCBhbmQgaXQgc3VwcG9ydHMgdGhlc2UgZGV2aWNlcyBvbiBtb3JlCiBkaWZmZXJlbnQgcHJvY2Vzc29yIGFyY2hpdGVjdHVyZXMgdGhhbiBhbnkgb3RoZXIgb3BlcmF0aW5nIHN5c3RlbSwgdGhpcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zdGFibGVfa2VybmVsX3J1bGVzLnR4dCBiL0RvY3VtZW50YXRpb24vc3RhYmxlX2tlcm5lbF9ydWxlcy50eHQKaW5kZXggZmZkNDU3NS4uNGQ4MmUzMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zdGFibGVfa2VybmVsX3J1bGVzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3N0YWJsZV9rZXJuZWxfcnVsZXMudHh0CkBAIC0xLDQgKzEsNyBAQAotRXZlcnl0aGluZyB5b3UgZXZlciB3YW50ZWQgdG8ga25vdyBhYm91dCBMaW51eCAtc3RhYmxlIHJlbGVhc2VzLgorLi4gX3N0YWJsZV9rZXJuZWxfcnVsZXM6CisKK0V2ZXJ5dGhpbmcgeW91IGV2ZXIgd2FudGVkIHRvIGtub3cgYWJvdXQgTGludXggLXN0YWJsZSByZWxlYXNlcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIFJ1bGVzIG9uIHdoYXQga2luZCBvZiBwYXRjaGVzIGFyZSBhY2NlcHRlZCwgYW5kIHdoaWNoIG9uZXMgYXJlIG5vdCwgaW50byB0aGUKICItc3RhYmxlIiB0cmVlOgpAQCAtMjMsNjggKzI2LDk0IEBACiAgICByYWNlIGNhbiBiZSBleHBsb2l0ZWQgaXMgYWxzbyBwcm92aWRlZC4KICAtIEl0IGNhbm5vdCBjb250YWluIGFueSAidHJpdmlhbCIgZml4ZXMgaW4gaXQgKHNwZWxsaW5nIGNoYW5nZXMsCiAgICB3aGl0ZXNwYWNlIGNsZWFudXBzLCBldGMpLgotIC0gSXQgbXVzdCBmb2xsb3cgdGhlIERvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMgcnVsZXMuCisgLSBJdCBtdXN0IGZvbGxvdyB0aGUKKyAgIDpyZWY6YERvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMgPHN1Ym1pdHRpbmdwYXRjaGVzPmAKKyAgIHJ1bGVzLgogIC0gSXQgb3IgYW4gZXF1aXZhbGVudCBmaXggbXVzdCBhbHJlYWR5IGV4aXN0IGluIExpbnVzJyB0cmVlICh1cHN0cmVhbSkuCiAKIAotUHJvY2VkdXJlIGZvciBzdWJtaXR0aW5nIHBhdGNoZXMgdG8gdGhlIC1zdGFibGUgdHJlZToKK1Byb2NlZHVyZSBmb3Igc3VibWl0dGluZyBwYXRjaGVzIHRvIHRoZSAtc3RhYmxlIHRyZWUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogIC0gSWYgdGhlIHBhdGNoIGNvdmVycyBmaWxlcyBpbiBuZXQvIG9yIGRyaXZlcnMvbmV0IHBsZWFzZSBmb2xsb3cgbmV0ZGV2IHN0YWJsZQogICAgc3VibWlzc2lvbiBndWlkZWxpbmVzIGFzIGRlc2NyaWJlZCBpbgogICAgRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldGRldi1GQVEudHh0CiAgLSBTZWN1cml0eSBwYXRjaGVzIHNob3VsZCBub3QgYmUgaGFuZGxlZCAoc29sZWx5KSBieSB0aGUgLXN0YWJsZSByZXZpZXcKLSAgIHByb2Nlc3MgYnV0IHNob3VsZCBmb2xsb3cgdGhlIHByb2NlZHVyZXMgaW4gRG9jdW1lbnRhdGlvbi9TZWN1cml0eUJ1Z3MuCisgICBwcm9jZXNzIGJ1dCBzaG91bGQgZm9sbG93IHRoZSBwcm9jZWR1cmVzIGluCisgICA6cmVmOmBEb2N1bWVudGF0aW9uL1NlY3VyaXR5QnVncyA8c2VjdXJpdHlidWdzPmAuCiAKLUZvciBhbGwgb3RoZXIgc3VibWlzc2lvbnMsIGNob29zZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBwcm9jZWR1cmVzOgorRm9yIGFsbCBvdGhlciBzdWJtaXNzaW9ucywgY2hvb3NlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHByb2NlZHVyZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSAgIC0tLSBPcHRpb24gMSAtLS0KKy4uIF9vcHRpb25fMToKIAotICAgVG8gaGF2ZSB0aGUgcGF0Y2ggYXV0b21hdGljYWxseSBpbmNsdWRlZCBpbiB0aGUgc3RhYmxlIHRyZWUsIGFkZCB0aGUgdGFnCitPcHRpb24gMQorKioqKioqKioKKworVG8gaGF2ZSB0aGUgcGF0Y2ggYXV0b21hdGljYWxseSBpbmNsdWRlZCBpbiB0aGUgc3RhYmxlIHRyZWUsIGFkZCB0aGUgdGFnCisKKy4uIGNvZGUtYmxvY2s6OiBub25lCisKICAgICAgQ2M6IHN0YWJsZUB2Z2VyLmtlcm5lbC5vcmcKLSAgIGluIHRoZSBzaWduLW9mZiBhcmVhLiBPbmNlIHRoZSBwYXRjaCBpcyBtZXJnZWQgaXQgd2lsbCBiZSBhcHBsaWVkIHRvCi0gICB0aGUgc3RhYmxlIHRyZWUgd2l0aG91dCBhbnl0aGluZyBlbHNlIG5lZWRpbmcgdG8gYmUgZG9uZSBieSB0aGUgYXV0aG9yCi0gICBvciBzdWJzeXN0ZW0gbWFpbnRhaW5lci4KIAotICAgLS0tIE9wdGlvbiAyIC0tLQoraW4gdGhlIHNpZ24tb2ZmIGFyZWEuIE9uY2UgdGhlIHBhdGNoIGlzIG1lcmdlZCBpdCB3aWxsIGJlIGFwcGxpZWQgdG8KK3RoZSBzdGFibGUgdHJlZSB3aXRob3V0IGFueXRoaW5nIGVsc2UgbmVlZGluZyB0byBiZSBkb25lIGJ5IHRoZSBhdXRob3IKK29yIHN1YnN5c3RlbSBtYWludGFpbmVyLgogCi0gICBBZnRlciB0aGUgcGF0Y2ggaGFzIGJlZW4gbWVyZ2VkIHRvIExpbnVzJyB0cmVlLCBzZW5kIGFuIGVtYWlsIHRvCi0gICBzdGFibGVAdmdlci5rZXJuZWwub3JnIGNvbnRhaW5pbmcgdGhlIHN1YmplY3Qgb2YgdGhlIHBhdGNoLCB0aGUgY29tbWl0IElELAotICAgd2h5IHlvdSB0aGluayBpdCBzaG91bGQgYmUgYXBwbGllZCwgYW5kIHdoYXQga2VybmVsIHZlcnNpb24geW91IHdpc2ggaXQgdG8KLSAgIGJlIGFwcGxpZWQgdG8uCisuLiBfb3B0aW9uXzI6CiAKLSAgIC0tLSBPcHRpb24gMyAtLS0KK09wdGlvbiAyCisqKioqKioqKgogCi0gICBTZW5kIHRoZSBwYXRjaCwgYWZ0ZXIgdmVyaWZ5aW5nIHRoYXQgaXQgZm9sbG93cyB0aGUgYWJvdmUgcnVsZXMsIHRvCi0gICBzdGFibGVAdmdlci5rZXJuZWwub3JnLiAgWW91IG11c3Qgbm90ZSB0aGUgdXBzdHJlYW0gY29tbWl0IElEIGluIHRoZQotICAgY2hhbmdlbG9nIG9mIHlvdXIgc3VibWlzc2lvbiwgYXMgd2VsbCBhcyB0aGUga2VybmVsIHZlcnNpb24geW91IHdpc2gKLSAgIGl0IHRvIGJlIGFwcGxpZWQgdG8uCitBZnRlciB0aGUgcGF0Y2ggaGFzIGJlZW4gbWVyZ2VkIHRvIExpbnVzJyB0cmVlLCBzZW5kIGFuIGVtYWlsIHRvCitzdGFibGVAdmdlci5rZXJuZWwub3JnIGNvbnRhaW5pbmcgdGhlIHN1YmplY3Qgb2YgdGhlIHBhdGNoLCB0aGUgY29tbWl0IElELAord2h5IHlvdSB0aGluayBpdCBzaG91bGQgYmUgYXBwbGllZCwgYW5kIHdoYXQga2VybmVsIHZlcnNpb24geW91IHdpc2ggaXQgdG8KK2JlIGFwcGxpZWQgdG8uCiAKLU9wdGlvbiAxIGlzICpzdHJvbmdseSogcHJlZmVycmVkLCBpcyB0aGUgZWFzaWVzdCBhbmQgbW9zdCBjb21tb24uICBPcHRpb25zIDIgYW5kCi0zIGFyZSBtb3JlIHVzZWZ1bCBpZiB0aGUgcGF0Y2ggaXNuJ3QgZGVlbWVkIHdvcnRoeSBhdCB0aGUgdGltZSBpdCBpcyBhcHBsaWVkIHRvCi1hIHB1YmxpYyBnaXQgdHJlZSAoZm9yIGluc3RhbmNlLCBiZWNhdXNlIGl0IGRlc2VydmVzIG1vcmUgcmVncmVzc2lvbiB0ZXN0aW5nCi1maXJzdCkuICBPcHRpb24gMyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBpZiB0aGUgcGF0Y2ggbmVlZHMgc29tZSBzcGVjaWFsIGhhbmRsaW5nCi10byBhcHBseSB0byBhbiBvbGRlciBrZXJuZWwgKGUuZy4sIGlmIEFQSSdzIGhhdmUgY2hhbmdlZCBpbiB0aGUgbWVhbnRpbWUpLgorLi4gX29wdGlvbl8zOgogCi1Ob3RlIHRoYXQgZm9yIE9wdGlvbiAzLCBpZiB0aGUgcGF0Y2ggZGV2aWF0ZXMgZnJvbSB0aGUgb3JpZ2luYWwgdXBzdHJlYW0gcGF0Y2gKLShmb3IgZXhhbXBsZSBiZWNhdXNlIGl0IGhhZCB0byBiZSBiYWNrcG9ydGVkKSB0aGlzIG11c3QgYmUgdmVyeSBjbGVhcmx5Ci1kb2N1bWVudGVkIGFuZCBqdXN0aWZpZWQgaW4gdGhlIHBhdGNoIGRlc2NyaXB0aW9uLgorT3B0aW9uIDMKKyoqKioqKioqCisKK1NlbmQgdGhlIHBhdGNoLCBhZnRlciB2ZXJpZnlpbmcgdGhhdCBpdCBmb2xsb3dzIHRoZSBhYm92ZSBydWxlcywgdG8KK3N0YWJsZUB2Z2VyLmtlcm5lbC5vcmcuICBZb3UgbXVzdCBub3RlIHRoZSB1cHN0cmVhbSBjb21taXQgSUQgaW4gdGhlCitjaGFuZ2Vsb2cgb2YgeW91ciBzdWJtaXNzaW9uLCBhcyB3ZWxsIGFzIHRoZSBrZXJuZWwgdmVyc2lvbiB5b3Ugd2lzaAoraXQgdG8gYmUgYXBwbGllZCB0by4KKworOnJlZjpgb3B0aW9uXzFgIGlzICoqc3Ryb25nbHkqKiBwcmVmZXJyZWQsIGlzIHRoZSBlYXNpZXN0IGFuZCBtb3N0IGNvbW1vbi4KKzpyZWY6YG9wdGlvbl8yYCBhbmQgOnJlZjpgb3B0aW9uXzNgIGFyZSBtb3JlIHVzZWZ1bCBpZiB0aGUgcGF0Y2ggaXNuJ3QgZGVlbWVkCit3b3J0aHkgYXQgdGhlIHRpbWUgaXQgaXMgYXBwbGllZCB0byBhIHB1YmxpYyBnaXQgdHJlZSAoZm9yIGluc3RhbmNlLCBiZWNhdXNlCitpdCBkZXNlcnZlcyBtb3JlIHJlZ3Jlc3Npb24gdGVzdGluZyBmaXJzdCkuICA6cmVmOmBvcHRpb25fM2AgaXMgZXNwZWNpYWxseQordXNlZnVsIGlmIHRoZSBwYXRjaCBuZWVkcyBzb21lIHNwZWNpYWwgaGFuZGxpbmcgdG8gYXBwbHkgdG8gYW4gb2xkZXIga2VybmVsCisoZS5nLiwgaWYgQVBJJ3MgaGF2ZSBjaGFuZ2VkIGluIHRoZSBtZWFudGltZSkuCisKK05vdGUgdGhhdCBmb3IgOnJlZjpgb3B0aW9uXzNgLCBpZiB0aGUgcGF0Y2ggZGV2aWF0ZXMgZnJvbSB0aGUgb3JpZ2luYWwKK3Vwc3RyZWFtIHBhdGNoIChmb3IgZXhhbXBsZSBiZWNhdXNlIGl0IGhhZCB0byBiZSBiYWNrcG9ydGVkKSB0aGlzIG11c3QgYmUgdmVyeQorY2xlYXJseSBkb2N1bWVudGVkIGFuZCBqdXN0aWZpZWQgaW4gdGhlIHBhdGNoIGRlc2NyaXB0aW9uLgogCiBUaGUgdXBzdHJlYW0gY29tbWl0IElEIG11c3QgYmUgc3BlY2lmaWVkIHdpdGggYSBzZXBhcmF0ZSBsaW5lIGFib3ZlIHRoZSBjb21taXQKIHRleHQsIGxpa2UgdGhpczoKIAorLi4gY29kZS1ibG9jazo6IG5vbmUKKwogICAgIGNvbW1pdCA8c2hhMT4gdXBzdHJlYW0uCiAKIEFkZGl0aW9uYWxseSwgc29tZSBwYXRjaGVzIHN1Ym1pdHRlZCB2aWEgT3B0aW9uIDEgbWF5IGhhdmUgYWRkaXRpb25hbCBwYXRjaAogcHJlcmVxdWlzaXRlcyB3aGljaCBjYW4gYmUgY2hlcnJ5LXBpY2tlZC4gVGhpcyBjYW4gYmUgc3BlY2lmaWVkIGluIHRoZSBmb2xsb3dpbmcKIGZvcm1hdCBpbiB0aGUgc2lnbi1vZmYgYXJlYToKIAorLi4gY29kZS1ibG9jazo6IG5vbmUKKwogICAgICBDYzogPHN0YWJsZUB2Z2VyLmtlcm5lbC5vcmc+ICMgMy4zLng6IGExZjg0YTM6IHNjaGVkOiBDaGVjayBmb3IgaWRsZQogICAgICBDYzogPHN0YWJsZUB2Z2VyLmtlcm5lbC5vcmc+ICMgMy4zLng6IDFiOTUwOGY6IHNjaGVkOiBSYXRlLWxpbWl0IG5ld2lkbGUKICAgICAgQ2M6IDxzdGFibGVAdmdlci5rZXJuZWwub3JnPiAjIDMuMy54OiBmZDIxMDczOiBzY2hlZDogRml4IGFmZmluaXR5IGxvZ2ljCiAgICAgIENjOiA8c3RhYmxlQHZnZXIua2VybmVsLm9yZz4gIyAzLjMueAotICAgIFNpZ25lZC1vZmYtYnk6IEluZ28gTW9sbmFyIDxtaW5nb0BlbHRlLmh1PgorICAgICBTaWduZWQtb2ZmLWJ5OiBJbmdvIE1vbG5hciA8bWluZ29AZWx0ZS5odT4KIAotICAgVGhlIHRhZyBzZXF1ZW5jZSBoYXMgdGhlIG1lYW5pbmcgb2Y6CitUaGUgdGFnIHNlcXVlbmNlIGhhcyB0aGUgbWVhbmluZyBvZjoKKworLi4gY29kZS1ibG9jazo6IG5vbmUKKwogICAgICBnaXQgY2hlcnJ5LXBpY2sgYTFmODRhMwogICAgICBnaXQgY2hlcnJ5LXBpY2sgMWI5NTA4ZgogICAgICBnaXQgY2hlcnJ5LXBpY2sgZmQyMTA3MwpAQCAtOTMsMTIgKzEyMiwxNyBAQAogQWxzbywgc29tZSBwYXRjaGVzIG1heSBoYXZlIGtlcm5lbCB2ZXJzaW9uIHByZXJlcXVpc2l0ZXMuICBUaGlzIGNhbiBiZQogc3BlY2lmaWVkIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0IGluIHRoZSBzaWduLW9mZiBhcmVhOgogCisuLiBjb2RlLWJsb2NrOjogbm9uZQorCiAgICAgIENjOiA8c3RhYmxlQHZnZXIua2VybmVsLm9yZz4gIyAzLjMueC0KIAotICAgVGhlIHRhZyBoYXMgdGhlIG1lYW5pbmcgb2Y6CitUaGUgdGFnIGhhcyB0aGUgbWVhbmluZyBvZjoKKworLi4gY29kZS1ibG9jazo6IG5vbmUKKwogICAgICBnaXQgY2hlcnJ5LXBpY2sgPHRoaXMgY29tbWl0PgogCi0gICBGb3IgZWFjaCAiLXN0YWJsZSIgdHJlZSBzdGFydGluZyB3aXRoIHRoZSBzcGVjaWZpZWQgdmVyc2lvbi4KK0ZvciBlYWNoICItc3RhYmxlIiB0cmVlIHN0YXJ0aW5nIHdpdGggdGhlIHNwZWNpZmllZCB2ZXJzaW9uLgogCiBGb2xsb3dpbmcgdGhlIHN1Ym1pc3Npb246CiAKQEAgLTEwOSw3ICsxNDMsOCBAQAogICAgb3RoZXIgZGV2ZWxvcGVycyBhbmQgYnkgdGhlIHJlbGV2YW50IHN1YnN5c3RlbSBtYWludGFpbmVyLgogCiAKLVJldmlldyBjeWNsZToKK1JldmlldyBjeWNsZQorLS0tLS0tLS0tLS0tCiAKICAtIFdoZW4gdGhlIC1zdGFibGUgbWFpbnRhaW5lcnMgZGVjaWRlIGZvciBhIHJldmlldyBjeWNsZSwgdGhlIHBhdGNoZXMgd2lsbCBiZQogICAgc2VudCB0byB0aGUgcmV2aWV3IGNvbW1pdHRlZSwgYW5kIHRoZSBtYWludGFpbmVyIG9mIHRoZSBhZmZlY3RlZCBhcmVhIG9mCkBAIC0xMjUsMTcgKzE2MCwyMiBAQAogICAgc2VjdXJpdHkga2VybmVsIHRlYW0sIGFuZCBub3QgZ28gdGhyb3VnaCB0aGUgbm9ybWFsIHJldmlldyBjeWNsZS4KICAgIENvbnRhY3QgdGhlIGtlcm5lbCBzZWN1cml0eSB0ZWFtIGZvciBtb3JlIGRldGFpbHMgb24gdGhpcyBwcm9jZWR1cmUuCiAKLVRyZWVzOgorVHJlZXMKKy0tLS0tCiAKICAtIFRoZSBxdWV1ZXMgb2YgcGF0Y2hlcywgZm9yIGJvdGggY29tcGxldGVkIHZlcnNpb25zIGFuZCBpbiBwcm9ncmVzcwogICAgdmVyc2lvbnMgY2FuIGJlIGZvdW5kIGF0OgorCiAJaHR0cDovL2dpdC5rZXJuZWwub3JnLz9wPWxpbnV4L2tlcm5lbC9naXQvc3RhYmxlL3N0YWJsZS1xdWV1ZS5naXQKKwogIC0gVGhlIGZpbmFsaXplZCBhbmQgdGFnZ2VkIHJlbGVhc2VzIG9mIGFsbCBzdGFibGUga2VybmVscyBjYW4gYmUgZm91bmQKICAgIGluIHNlcGFyYXRlIGJyYW5jaGVzIHBlciB2ZXJzaW9uIGF0OgorCiAJaHR0cDovL2dpdC5rZXJuZWwub3JnLz9wPWxpbnV4L2tlcm5lbC9naXQvc3RhYmxlL2xpbnV4LXN0YWJsZS5naXQKIAogCi1SZXZpZXcgY29tbWl0dGVlOgorUmV2aWV3IGNvbW1pdHRlZQorLS0tLS0tLS0tLS0tLS0tLQogCiAgLSBUaGlzIGlzIG1hZGUgdXAgb2YgYSBudW1iZXIgb2Yga2VybmVsIGRldmVsb3BlcnMgd2hvIGhhdmUgdm9sdW50ZWVyZWQgZm9yCiAgICB0aGlzIHRhc2ssIGFuZCBhIGZldyB0aGF0IGhhdmVuJ3QuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3N0YXRpYy1rZXlzLnR4dCBiL0RvY3VtZW50YXRpb24vc3RhdGljLWtleXMudHh0CmluZGV4IDQ3NzkyN2IuLmVhOGQ3YjQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3RhdGljLWtleXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc3RhdGljLWtleXMudHh0CkBAIC0xNSw2ICsxNSw4IEBACiAKIERFRklORV9TVEFUSUNfS0VZX1RSVUUoa2V5KTsKIERFRklORV9TVEFUSUNfS0VZX0ZBTFNFKGtleSk7CitERUZJTkVfU1RBVElDX0tFWV9BUlJBWV9UUlVFKGtleXMsIGNvdW50KTsKK0RFRklORV9TVEFUSUNfS0VZX0FSUkFZX0ZBTFNFKGtleXMsIGNvdW50KTsKIHN0YXRpY19icmFuY2hfbGlrZWx5KCkKIHN0YXRpY19icmFuY2hfdW5saWtlbHkoKQogCkBAIC0xNDAsNiArMTQyLDEzIEBACiBrZXkgaXMgaW5pdGlhbGl6ZWQgZmFsc2UsIGEgJ3N0YXRpY19icmFuY2hfaW5jKCknLCB3aWxsIGNoYW5nZSB0aGUgYnJhbmNoIHRvCiB0cnVlLiBBbmQgdGhlbiBhICdzdGF0aWNfYnJhbmNoX2RlYygpJywgd2lsbCBhZ2FpbiBtYWtlIHRoZSBicmFuY2ggZmFsc2UuCiAKK1doZXJlIGFuIGFycmF5IG9mIGtleXMgaXMgcmVxdWlyZWQsIGl0IGNhbiBiZSBkZWZpbmVkIGFzOgorCisJREVGSU5FX1NUQVRJQ19LRVlfQVJSQVlfVFJVRShrZXlzLCBjb3VudCk7CisKK29yOgorCisJREVGSU5FX1NUQVRJQ19LRVlfQVJSQVlfRkFMU0Uoa2V5cywgY291bnQpOwogCiA0KSBBcmNoaXRlY3R1cmUgbGV2ZWwgY29kZSBwYXRjaGluZyBpbnRlcmZhY2UsICdqdW1wIGxhYmVscycKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zeXNjdGwvUkVBRE1FIGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwvUkVBRE1FCmluZGV4IDhjMzMwNmUuLjkxZjU0ZmYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3lzY3RsL1JFQURNRQorKysgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC9SRUFETUUKQEAgLTY5LDYgKzY5LDcgQEAKIHN1bnJwYy8JCVNVTiBSZW1vdGUgUHJvY2VkdXJlIENhbGwgKE5GUykKIHZtLwkJbWVtb3J5IG1hbmFnZW1lbnQgdHVuaW5nCiAJCWJ1ZmZlciBhbmQgY2FjaGUgbWFuYWdlbWVudAordXNlci8JCVBlciB1c2VyIHBlciB1c2VyIG5hbWVzcGFjZSBsaW1pdHMKIAogVGhlc2UgYXJlIHRoZSBzdWJkaXJzIEkgaGF2ZSBvbiBteSBzeXN0ZW0uIFRoZXJlIG1pZ2h0IGJlIG1vcmUKIG9yIG90aGVyIHN1YmRpcnMgaW4gYW5vdGhlciBzZXR1cC4gSWYgeW91IHNlZSBhbm90aGVyIGRpciwgSSdkCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC9mcy50eHQgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC9mcy50eHQKaW5kZXggMzAyYjVlZC4uMzVlMTdmNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zeXNjdGwvZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc3lzY3RsL2ZzLnR4dApAQCAtMjY1LDYgKzI2NSwxMyBAQAogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCittb3VudC1tYXg6CisKK1RoaXMgZGVub3RlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbW91bnRzIHRoYXQgbWF5IGV4aXN0CitpbiBhIG1vdW50IG5hbWVzcGFjZS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwogCiAyLiAvcHJvYy9zeXMvZnMvYmluZm10X21pc2MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3lzY3RsL3VzZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwvdXNlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI5MWM0OQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vc3lzY3RsL3VzZXIudHh0CkBAIC0wLDAgKzEsNjYgQEAKK0RvY3VtZW50YXRpb24gZm9yIC9wcm9jL3N5cy91c2VyLyoJa2VybmVsIHZlcnNpb24gNC45LjAKKwkoYykgMjAxNgkJRXJpYyBCaWVkZXJtYW4gPGViaWVkZXJtQHhtaXNzaW9uLmNvbT4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkb2N1bWV0YXRpb24gZm9yIHRoZSBzeXNjdGwgZmlsZXMgaW4KKy9wcm9jL3N5cy91c2VyLgorCitUaGUgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQKK2xpbWl0cyBvbiB0aGUgbnVtYmVyIG9mIG5hbWVzcGFjZXMgYW5kIG90aGVyIG9iamVjdHMgdGhhdCBoYXZlCitwZXIgdXNlciBwZXIgdXNlciBuYW1lc3BhY2UgbGltaXRzLgorCitUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIHRoZXNlIGxpbWl0cyBpcyB0byBzdG9wIHByb2dyYW1zIHRoYXQKK21hbGZ1bmN0aW9uIGFuZCBhdHRlbXB0IHRvIGNyZWF0ZSBhIHJpZGljdWxvdXMgbnVtYmVyIG9mIG9iamVjdHMsCitiZWZvcmUgdGhlIG1hbGZ1bmN0aW9uIGJlY29tZXMgYSBzeXN0ZW0gd2lkZSBwcm9ibGVtLiAgSXQgaXMgdGhlCitpbnRlbnRpb24gdGhhdCB0aGUgZGVmYXVsdHMgb2YgdGhlc2UgbGltaXRzIGFyZSBzZXQgaGlnaCBlbm91Z2ggdGhhdAorbm8gcHJvZ3JhbSBpbiBub3JtYWwgb3BlcmF0aW9uIHNob3VsZCBydW4gaW50byB0aGVzZSBsaW1pdHMuCisKK1RoZSBjcmVhdGlvbiBvZiBwZXIgdXNlciBwZXIgdXNlciBuYW1lc3BhY2Ugb2JqZWN0cyBhcmUgY2hhcmdlZCB0bwordGhlIHVzZXIgaW4gdGhlIHVzZXIgbmFtZXNwYWNlIHdobyBjcmVhdGVkIHRoZSBvYmplY3QgYW5kCit2ZXJpZmllZCB0byBiZSBiZWxvdyB0aGUgcGVyIHVzZXIgbGltaXQgaW4gdGhhdCB1c2VyIG5hbWVzcGFjZS4KKworVGhlIGNyZWF0aW9uIG9mIG9iamVjdHMgaXMgYWxzbyBjaGFyZ2VkIHRvIGFsbCBvZiB0aGUgdXNlcnMKK3dobyBjcmVhdGVkIHVzZXIgbmFtZXNwYWNlcyB0aGUgY3JlYXRpb24gb2YgdGhlIG9iamVjdCBoYXBwZW5zCitpbiAodXNlciBuYW1lc3BhY2VzIGNhbiBiZSBuZXN0ZWQpIGFuZCB2ZXJpZmllZCB0byBiZSBiZWxvdyB0aGUgcGVyIHVzZXIKK2xpbWl0cyBpbiB0aGUgdXNlciBuYW1lc3BhY2VzIG9mIHRob3NlIHVzZXJzLgorCitUaGlzIHJlY3Vyc2l2ZSBjb3VudGluZyBvZiBjcmVhdGVkIG9iamVjdHMgZW5zdXJlcyB0aGF0IGNyZWF0aW5nIGEKK3VzZXIgbmFtZXNwYWNlIGRvZXMgbm90IGFsbG93IGEgdXNlciB0byBlc2NhcGUgdGhlaXIgY3VycmVudCBsaW1pdHMuCisKK0N1cnJlbnRseSwgdGhlc2UgZmlsZXMgYXJlIGluIC9wcm9jL3N5cy91c2VyOgorCistIG1heF9jZ3JvdXBfbmFtZXNwYWNlcworCisgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjZ3JvdXAgbmFtZXNwYWNlcyB0aGF0IGFueSB1c2VyIGluIHRoZSBjdXJyZW50CisgIHVzZXIgbmFtZXNwYWNlIG1heSBjcmVhdGUuCisKKy0gbWF4X2lwY19uYW1lc3BhY2VzCisKKyAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGlwYyBuYW1lc3BhY2VzIHRoYXQgYW55IHVzZXIgaW4gdGhlIGN1cnJlbnQKKyAgdXNlciBuYW1lc3BhY2UgbWF5IGNyZWF0ZS4KKworLSBtYXhfbW50X25hbWVzcGFjZXMKKworICBUaGUgbWF4aW11bSBudW1iZXIgb2YgbW91bnQgbmFtZXNwYWNlcyB0aGF0IGFueSB1c2VyIGluIHRoZSBjdXJyZW50CisgIHVzZXIgbmFtZXNwYWNlIG1heSBjcmVhdGUuCisKKy0gbWF4X25ldF9uYW1lc3BhY2VzCisKKyAgVGhlIG1heGltdW0gbnVtYmVyIG9mIG5ldHdvcmsgbmFtZXNwYWNlcyB0aGF0IGFueSB1c2VyIGluIHRoZQorICBjdXJyZW50IHVzZXIgbmFtZXNwYWNlIG1heSBjcmVhdGUuCisKKy0gbWF4X3BpZF9uYW1lc3BhY2VzCisKKyAgVGhlIG1heGltdW0gbnVtYmVyIG9mIHBpZCBuYW1lc3BhY2VzIHRoYXQgYW55IHVzZXIgaW4gdGhlIGN1cnJlbnQKKyAgdXNlciBuYW1lc3BhY2UgbWF5IGNyZWF0ZS4KKworLSBtYXhfdXNlcl9uYW1lc3BhY2VzCisKKyAgVGhlIG1heGltdW0gbnVtYmVyIG9mIHVzZXIgbmFtZXNwYWNlcyB0aGF0IGFueSB1c2VyIGluIHRoZSBjdXJyZW50CisgIHVzZXIgbmFtZXNwYWNlIG1heSBjcmVhdGUuCisKKy0gbWF4X3V0c19uYW1lc3BhY2VzCisKKyAgVGhlIG1heGltdW0gbnVtYmVyIG9mIHVzZXIgbmFtZXNwYWNlcyB0aGF0IGFueSB1c2VyIGluIHRoZSBjdXJyZW50CisgIHVzZXIgbmFtZXNwYWNlIG1heSBjcmVhdGUuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3RyYWNlL2Z0cmFjZS1kZXNpZ24udHh0IGIvRG9jdW1lbnRhdGlvbi90cmFjZS9mdHJhY2UtZGVzaWduLnR4dAppbmRleCBkZDVmOTE2Li5hMjczZGQwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3RyYWNlL2Z0cmFjZS1kZXNpZ24udHh0CisrKyBiL0RvY3VtZW50YXRpb24vdHJhY2UvZnRyYWNlLWRlc2lnbi50eHQKQEAgLTIwMyw2ICsyMDMsMTcgQEAKIAogU2ltaWxhcmx5LCB3aGVuIHlvdSBjYWxsIGZ0cmFjZV9yZXR1cm5fdG9faGFuZGxlcigpLCBwYXNzIGl0IHRoZSBmcmFtZSBwb2ludGVyLgogCitIQVZFX0ZVTkNUSU9OX0dSQVBIX1JFVF9BRERSX1BUUgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQW4gYXJjaCBtYXkgcGFzcyBpbiBhIHBvaW50ZXIgdG8gdGhlIHJldHVybiBhZGRyZXNzIG9uIHRoZSBzdGFjay4gIFRoaXMKK3ByZXZlbnRzIHBvdGVudGlhbCBzdGFjayB1bndpbmRpbmcgaXNzdWVzIHdoZXJlIHRoZSB1bndpbmRlciBnZXRzIG91dCBvZgorc3luYyB3aXRoIHJldF9zdGFjayBhbmQgdGhlIHdyb25nIGFkZHJlc3NlcyBhcmUgcmVwb3J0ZWQgYnkKK2Z0cmFjZV9ncmFwaF9yZXRfYWRkcigpLgorCitBZGRpbmcgc3VwcG9ydCBmb3IgaXQgaXMgZWFzeToganVzdCBkZWZpbmUgdGhlIG1hY3JvIGluIGFzbS9mdHJhY2UuaCBhbmQKK3Bhc3MgdGhlIHJldHVybiBhZGRyZXNzIHBvaW50ZXIgYXMgdGhlICdyZXRwJyBhcmd1bWVudCB0bworZnRyYWNlX3B1c2hfcmV0dXJuX3RyYWNlKCkuCiAKIEhBVkVfRlRSQUNFX05NSV9FTlRFUgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3RyYWNlL2Z0cmFjZS50eHQgYi9Eb2N1bWVudGF0aW9uL3RyYWNlL2Z0cmFjZS50eHQKaW5kZXggYTZiMzcwNS4uMTg1YzM5ZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi90cmFjZS9mdHJhY2UudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdHJhY2UvZnRyYWNlLnR4dApAQCAtODU4LDExICs4NTgsMTEgQEAKIAkgICAgICAgV2hlbiBlbmFibGVkLCBpdCB3aWxsIGFjY291bnQgdGltZSB0aGUgdGFzayBoYXMgYmVlbgogCSAgICAgICBzY2hlZHVsZWQgb3V0IGFzIHBhcnQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwuCiAKLSAgZ3JhcGgtdGltZSAtIFdoZW4gcnVubmluZyBmdW5jdGlvbiBncmFwaCB0cmFjZXIsIHRvIGluY2x1ZGUgdGhlCi0gIAkgICAgICAgdGltZSB0byBjYWxsIG5lc3RlZCBmdW5jdGlvbnMuIFdoZW4gdGhpcyBpcyBub3Qgc2V0LAotCSAgICAgICB0aGUgdGltZSByZXBvcnRlZCBmb3IgdGhlIGZ1bmN0aW9uIHdpbGwgb25seSBpbmNsdWRlCi0JICAgICAgIHRoZSB0aW1lIHRoZSBmdW5jdGlvbiBpdHNlbGYgZXhlY3V0ZWQgZm9yLCBub3QgdGhlIHRpbWUKLQkgICAgICAgZm9yIGZ1bmN0aW9ucyB0aGF0IGl0IGNhbGxlZC4KKyAgZ3JhcGgtdGltZSAtIFdoZW4gcnVubmluZyBmdW5jdGlvbiBwcm9maWxlciB3aXRoIGZ1bmN0aW9uIGdyYXBoIHRyYWNlciwKKwkgICAgICAgdG8gaW5jbHVkZSB0aGUgdGltZSB0byBjYWxsIG5lc3RlZCBmdW5jdGlvbnMuIFdoZW4gdGhpcyBpcworCSAgICAgICBub3Qgc2V0LCB0aGUgdGltZSByZXBvcnRlZCBmb3IgdGhlIGZ1bmN0aW9uIHdpbGwgb25seQorCSAgICAgICBpbmNsdWRlIHRoZSB0aW1lIHRoZSBmdW5jdGlvbiBpdHNlbGYgZXhlY3V0ZWQgZm9yLCBub3QgdGhlCisJICAgICAgIHRpbWUgZm9yIGZ1bmN0aW9ucyB0aGF0IGl0IGNhbGxlZC4KIAogICByZWNvcmQtY21kIC0gV2hlbiBhbnkgZXZlbnQgb3IgdHJhY2VyIGlzIGVuYWJsZWQsIGEgaG9vayBpcyBlbmFibGVkCiAgIAkgICAgICAgaW4gdGhlIHNjaGVkX3N3aXRjaCB0cmFjZSBwb2ludCB0byBmaWxsIGNvbW0gY2FjaGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdHJhY2UvaHdsYXRfZGV0ZWN0b3IudHh0IGIvRG9jdW1lbnRhdGlvbi90cmFjZS9od2xhdF9kZXRlY3Rvci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIwNzcxNwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdHJhY2UvaHdsYXRfZGV0ZWN0b3IudHh0CkBAIC0wLDAgKzEsNzkgQEAKK0ludHJvZHVjdGlvbjoKKy0tLS0tLS0tLS0tLS0KKworVGhlIHRyYWNlciBod2xhdF9kZXRlY3RvciBpcyBhIHNwZWNpYWwgcHVycG9zZSB0cmFjZXIgdGhhdCBpcyB1c2VkIHRvCitkZXRlY3QgbGFyZ2Ugc3lzdGVtIGxhdGVuY2llcyBpbmR1Y2VkIGJ5IHRoZSBiZWhhdmlvciBvZiBjZXJ0YWluIHVuZGVybHlpbmcKK2hhcmR3YXJlIG9yIGZpcm13YXJlLCBpbmRlcGVuZGVudCBvZiBMaW51eCBpdHNlbGYuIFRoZSBjb2RlIHdhcyBkZXZlbG9wZWQKK29yaWdpbmFsbHkgdG8gZGV0ZWN0IFNNSXMgKFN5c3RlbSBNYW5hZ2VtZW50IEludGVycnVwdHMpIG9uIHg4NiBzeXN0ZW1zLAoraG93ZXZlciB0aGVyZSBpcyBub3RoaW5nIHg4NiBzcGVjaWZpYyBhYm91dCB0aGlzIHBhdGNoc2V0LiBJdCB3YXMKK29yaWdpbmFsbHkgd3JpdHRlbiBmb3IgdXNlIGJ5IHRoZSAiUlQiIHBhdGNoIHNpbmNlIHRoZSBSZWFsIFRpbWUKK2tlcm5lbCBpcyBoaWdobHkgbGF0ZW5jeSBzZW5zaXRpdmUuCisKK1NNSXMgYXJlIG5vdCBzZXJ2aWNlZCBieSB0aGUgTGludXgga2VybmVsLCB3aGljaCBtZWFucyB0aGF0IGl0IGRvZXMgbm90CitldmVuIGtub3cgdGhhdCB0aGV5IGFyZSBvY2N1cmluZy4gU01JcyBhcmUgaW5zdGVhZCBzZXQgdXAgYnkgQklPUyBjb2RlCithbmQgYXJlIHNlcnZpY2VkIGJ5IEJJT1MgY29kZSwgdXN1YWxseSBmb3IgImNyaXRpY2FsIiBldmVudHMgc3VjaCBhcworbWFuYWdlbWVudCBvZiB0aGVybWFsIHNlbnNvcnMgYW5kIGZhbnMuIFNvbWV0aW1lcyB0aG91Z2gsIFNNSXMgYXJlIHVzZWQgZm9yCitvdGhlciB0YXNrcyBhbmQgdGhvc2UgdGFza3MgY2FuIHNwZW5kIGFuIGlub3JkaW5hdGUgYW1vdW50IG9mIHRpbWUgaW4gdGhlCitoYW5kbGVyIChzb21ldGltZXMgbWVhc3VyZWQgaW4gbWlsbGlzZWNvbmRzKS4gT2J2aW91c2x5IHRoaXMgaXMgYSBwcm9ibGVtIGlmCit5b3UgYXJlIHRyeWluZyB0byBrZWVwIGV2ZW50IHNlcnZpY2UgbGF0ZW5jaWVzIGRvd24gaW4gdGhlIG1pY3Jvc2Vjb25kIHJhbmdlLgorCitUaGUgaGFyZHdhcmUgbGF0ZW5jeSBkZXRlY3RvciB3b3JrcyBieSBob2dnaW5nIG9uZSBvZiB0aGUgY3B1cyBmb3IgY29uZmlndXJhYmxlCithbW91bnRzIG9mIHRpbWUgKHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCksIHBvbGxpbmcgdGhlIENQVSBUaW1lIFN0YW1wIENvdW50ZXIKK2ZvciBzb21lIHBlcmlvZCwgdGhlbiBsb29raW5nIGZvciBnYXBzIGluIHRoZSBUU0MgZGF0YS4gQW55IGdhcCBpbmRpY2F0ZXMgYQordGltZSB3aGVuIHRoZSBwb2xsaW5nIHdhcyBpbnRlcnJ1cHRlZCBhbmQgc2luY2UgdGhlIGludGVycnVwdHMgYXJlIGRpc2FibGVkLAordGhlIG9ubHkgdGhpbmcgdGhhdCBjb3VsZCBkbyB0aGF0IHdvdWxkIGJlIGFuIFNNSSBvciBvdGhlciBoYXJkd2FyZSBoaWNjdXAKKyhvciBhbiBOTUksIGJ1dCB0aG9zZSBjYW4gYmUgdHJhY2tlZCkuCisKK05vdGUgdGhhdCB0aGUgaHdsYXQgZGV0ZWN0b3Igc2hvdWxkICpORVZFUiogYmUgdXNlZCBpbiBhIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQuCitJdCBpcyBpbnRlbmRlZCB0byBiZSBydW4gbWFudWFsbHkgdG8gZGV0ZXJtaW5lIGlmIHRoZSBoYXJkd2FyZSBwbGF0Zm9ybSBoYXMgYQorcHJvYmxlbSB3aXRoIGxvbmcgc3lzdGVtIGZpcm13YXJlIHNlcnZpY2Ugcm91dGluZXMuCisKK1VzYWdlOgorLS0tLS0tCisKK1dyaXRlIHRoZSBBU0NJSSB0ZXh0ICJod2xhdCIgaW50byB0aGUgY3VycmVudF90cmFjZXIgZmlsZSBvZiB0aGUgdHJhY2luZyBzeXN0ZW0KKyhtb3VudGVkIGF0IC9zeXMva2VybmVsL3RyYWNpbmcgb3IgL3N5cy9rZXJuZWwvdHJhY2luZykuIEl0IGlzIHBvc3NpYmxlIHRvCityZWRlZmluZSB0aGUgdGhyZXNob2xkIGluIG1pY3Jvc2Vjb25kcyAodXMpIGFib3ZlIHdoaWNoIGxhdGVuY3kgc3Bpa2VzIHdpbGwKK2JlIHRha2VuIGludG8gYWNjb3VudC4KKworRXhhbXBsZToKKworCSMgZWNobyBod2xhdCA+IC9zeXMva2VybmVsL3RyYWNpbmcvY3VycmVudF90cmFjZXIKKwkjIGVjaG8gMTAwID4gL3N5cy9rZXJuZWwvdHJhY2luZy90cmFjaW5nX3RocmVzaAorCitUaGUgL3N5cy9rZXJuZWwvdHJhY2luZy9od2xhdF9kZXRlY3RvciBpbnRlcmZhY2UgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWxlczoKKword2lkdGgJCQktIHRpbWUgcGVyaW9kIHRvIHNhbXBsZSB3aXRoIENQVXMgaGVsZCAodXNlY3MpCisJCQkgIG11c3QgYmUgbGVzcyB0aGFuIHRoZSB0b3RhbCB3aW5kb3cgc2l6ZSAoZW5mb3JjZWQpCit3aW5kb3cJCQktIHRvdGFsIHBlcmlvZCBvZiBzYW1wbGluZywgd2lkdGggYmVpbmcgaW5zaWRlICh1c2VjcykKKworQnkgZGVmYXVsdCB0aGUgd2lkdGggaXMgc2V0IHRvIDUwMCwwMDAgYW5kIHdpbmRvdyB0byAxLDAwMCwwMDAsIG1lYW5pbmcgdGhhdAorZm9yIGV2ZXJ5IDEsMDAwLDAwMCB1c2VjcyAoMXMpIHRoZSBod2xhdCBkZXRlY3RvciB3aWxsIHNwaW4gZm9yIDUwMCwwMDAgdXNlY3MKKygwLjVzKS4gSWYgdHJhY2luZ190aHJlc2ggY29udGFpbnMgemVybyB3aGVuIGh3bGF0IHRyYWNlciBpcyBlbmFibGVkLCBpdCB3aWxsCitjaGFuZ2UgdG8gYSBkZWZhdWx0IG9mIDEwIHVzZWNzLiBJZiBhbnkgbGF0ZW5jaWVzIHRoYXQgZXhjZWVkIHRoZSB0aHJlc2hvbGQgaXMKK29ic2VydmVkIHRoZW4gdGhlIGRhdGEgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSB0cmFjaW5nIHJpbmcgYnVmZmVyLgorCitUaGUgbWluaW11bSBzbGVlcCB0aW1lIGJldHdlZW4gcGVyaW9kcyBpcyAxIG1pbGxpc2Vjb25kLiBFdmVuIGlmIHdpZHRoCitpcyBsZXNzIHRoYW4gMSBtaWxsaXNlY29uZCBhcGFydCBmcm9tIHdpbmRvdywgdG8gYWxsb3cgdGhlIHN5c3RlbSB0byBub3QKK2JlIHRvdGFsbHkgc3RhcnZlZC4KKworSWYgdHJhY2luZ190aHJlc2ggd2FzIHplcm8gd2hlbiBod2xhdCBkZXRlY3RvciB3YXMgc3RhcnRlZCwgaXQgd2lsbCBiZSBzZXQKK2JhY2sgdG8gemVybyBpZiBhbm90aGVyIHRyYWNlciBpcyBsb2FkZWQuIE5vdGUsIHRoZSBsYXN0IHZhbHVlIGluCit0cmFjaW5nX3RocmVzaCB0aGF0IGh3bGF0IGRldGVjdG9yIGhhZCB3aWxsIGJlIHNhdmVkIGFuZCB0aGlzIHZhbHVlIHdpbGwKK2JlIHJlc3RvcmVkIGluIHRyYWNpbmdfdGhyZXNoIGlmIGl0IGlzIHN0aWxsIHplcm8gd2hlbiBod2xhdCBkZXRlY3RvciBpcworc3RhcnRlZCBhZ2Fpbi4KKworVGhlIGZvbGxvd2luZyB0cmFjaW5nIGRpcmVjdG9yeSBmaWxlcyBhcmUgdXNlZCBieSB0aGUgaHdsYXRfZGV0ZWN0b3I6CisKK2luIC9zeXMva2VybmVsL3RyYWNpbmc6CisKKyB0cmFjaW5nX3RocmVzaG9sZAktIG1pbmltdW0gbGF0ZW5jeSB2YWx1ZSB0byBiZSBjb25zaWRlcmVkICh1c2VjcykKKyB0cmFjaW5nX21heF9sYXRlbmN5CS0gbWF4aW11bSBoYXJkd2FyZSBsYXRlbmN5IGFjdHVhbGx5IG9ic2VydmVkICh1c2VjcykKKyB0cmFjaW5nX2NwdW1hc2sJLSB0aGUgQ1BVcyB0byBtb3ZlIHRoZSBod2xhdCB0aHJlYWQgYWNyb3NzCisgaHdsYXRfZGV0ZWN0b3Ivd2lkdGgJLSBzcGVjaWZpZWQgYW1vdW50IG9mIHRpbWUgdG8gc3BpbiB3aXRoaW4gd2luZG93ICh1c2VjcykKKyBod2xhdF9kZXRlY3Rvci93aW5kb3cJLSBhbW91bnQgb2YgdGltZSBiZXR3ZWVuICh3aWR0aCkgcnVucyAodXNlY3MpCisKK1RoZSBod2xhdCBkZXRlY3RvcidzIGtlcm5lbCB0aHJlYWQgd2lsbCBtaWdyYXRlIGFjcm9zcyBlYWNoIENQVSBzcGVjaWZpZWQgaW4KK3RyYWNpbmdfY3B1bWFzayBiZXR3ZWVuIGVhY2ggd2luZG93LiBUbyBsaW1pdCB0aGUgbWlncmF0aW9uLCBlaXRoZXIgbW9kaWZ5Cit0cmFjaW5nX2NwdW1hc2ssIG9yIG1vZGlmeSB0aGUgaHdsYXQga2VybmVsIHRocmVhZCAobmFtZWQgW2h3bGF0ZF0pIENQVQorYWZmaW5pdHkgZGlyZWN0bHksIGFuZCB0aGUgbWlncmF0aW9uIHdpbGwgc3RvcC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdHJhY2Uva3Byb2JldHJhY2UudHh0IGIvRG9jdW1lbnRhdGlvbi90cmFjZS9rcHJvYmV0cmFjZS50eHQKaW5kZXggZWE1MmVjMS4uZTQ5OTFmYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi90cmFjZS9rcHJvYmV0cmFjZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi90cmFjZS9rcHJvYmV0cmFjZS50eHQKQEAgLTQ0LDggKzQ0LDggQEAKICAgK3wtb2ZmcyhGRVRDSEFSRykgOiBGZXRjaCBtZW1vcnkgYXQgRkVUQ0hBUkcgK3wtIG9mZnMgYWRkcmVzcy4oKiopCiAgIE5BTUU9RkVUQ0hBUkcgOiBTZXQgTkFNRSBhcyB0aGUgYXJndW1lbnQgbmFtZSBvZiBGRVRDSEFSRy4KICAgRkVUQ0hBUkc6VFlQRSA6IFNldCBUWVBFIGFzIHRoZSB0eXBlIG9mIEZFVENIQVJHLiBDdXJyZW50bHksIGJhc2ljIHR5cGVzCi0JCSAgKHU4L3UxNi91MzIvdTY0L3M4L3MxNi9zMzIvczY0KSwgInN0cmluZyIgYW5kIGJpdGZpZWxkCi0JCSAgYXJlIHN1cHBvcnRlZC4KKwkJICAodTgvdTE2L3UzMi91NjQvczgvczE2L3MzMi9zNjQpLCBoZXhhZGVjaW1hbCB0eXBlcworCQkgICh4OC94MTYveDMyL3g2NCksICJzdHJpbmciIGFuZCBiaXRmaWVsZCBhcmUgc3VwcG9ydGVkLgogCiAgICgqKSBvbmx5IGZvciByZXR1cm4gcHJvYmUuCiAgICgqKikgdGhpcyBpcyB1c2VmdWwgZm9yIGZldGNoaW5nIGEgZmllbGQgb2YgZGF0YSBzdHJ1Y3R1cmVzLgpAQCAtNTQsNyArNTQsMTAgQEAKIC0tLS0tCiBTZXZlcmFsIHR5cGVzIGFyZSBzdXBwb3J0ZWQgZm9yIGZldGNoLWFyZ3MuIEtwcm9iZSB0cmFjZXIgd2lsbCBhY2Nlc3MgbWVtb3J5CiBieSBnaXZlbiB0eXBlLiBQcmVmaXggJ3MnIGFuZCAndScgbWVhbnMgdGhvc2UgdHlwZXMgYXJlIHNpZ25lZCBhbmQgdW5zaWduZWQKLXJlc3BlY3RpdmVseS4gVHJhY2VkIGFyZ3VtZW50cyBhcmUgc2hvd24gaW4gZGVjaW1hbCAoc2lnbmVkKSBvciBoZXggKHVuc2lnbmVkKS4KK3Jlc3BlY3RpdmVseS4gJ3gnIHByZWZpeCBpbXBsaWVzIGl0IGlzIHVuc2lnbmVkLiBUcmFjZWQgYXJndW1lbnRzIGFyZSBzaG93bgoraW4gZGVjaW1hbCAoJ3MnIGFuZCAndScpIG9yIGhleGFkZWNpbWFsICgneCcpLiBXaXRob3V0IHR5cGUgY2FzdGluZywgJ3gzMicKK29yICd4NjQnIGlzIHVzZWQgZGVwZW5kcyBvbiB0aGUgYXJjaGl0ZWN0dXJlIChlLmcuIHg4Ni0zMiB1c2VzIHgzMiwgYW5kCit4ODYtNjQgdXNlcyB4NjQpLgogU3RyaW5nIHR5cGUgaXMgYSBzcGVjaWFsIHR5cGUsIHdoaWNoIGZldGNoZXMgYSAibnVsbC10ZXJtaW5hdGVkIiBzdHJpbmcgZnJvbQoga2VybmVsIHNwYWNlLiBUaGlzIG1lYW5zIGl0IHdpbGwgZmFpbCBhbmQgc3RvcmUgTlVMTCBpZiB0aGUgc3RyaW5nIGNvbnRhaW5lcgogaGFzIGJlZW4gcGFnZWQgb3V0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90cmFjZS91cHJvYmV0cmFjZXIudHh0IGIvRG9jdW1lbnRhdGlvbi90cmFjZS91cHJvYmV0cmFjZXIudHh0CmluZGV4IDcyZDFjZDQuLjk0YjZiNDUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdHJhY2UvdXByb2JldHJhY2VyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3RyYWNlL3Vwcm9iZXRyYWNlci50eHQKQEAgLTQwLDggKzQwLDggQEAKICAgICt8LW9mZnMoRkVUQ0hBUkcpIDogRmV0Y2ggbWVtb3J5IGF0IEZFVENIQVJHICt8LSBvZmZzIGFkZHJlc3MuKCoqKQogICAgTkFNRT1GRVRDSEFSRyAgICAgOiBTZXQgTkFNRSBhcyB0aGUgYXJndW1lbnQgbmFtZSBvZiBGRVRDSEFSRy4KICAgIEZFVENIQVJHOlRZUEUgICAgIDogU2V0IFRZUEUgYXMgdGhlIHR5cGUgb2YgRkVUQ0hBUkcuIEN1cnJlbnRseSwgYmFzaWMgdHlwZXMKLQkJICAgICAgICh1OC91MTYvdTMyL3U2NC9zOC9zMTYvczMyL3M2NCksICJzdHJpbmciIGFuZCBiaXRmaWVsZAotCQkgICAgICAgYXJlIHN1cHBvcnRlZC4KKwkJICAgICAgICh1OC91MTYvdTMyL3U2NC9zOC9zMTYvczMyL3M2NCksIGhleGFkZWNpbWFsIHR5cGVzCisJCSAgICAgICAoeDgveDE2L3gzMi94NjQpLCAic3RyaW5nIiBhbmQgYml0ZmllbGQgYXJlIHN1cHBvcnRlZC4KIAogICAoKikgb25seSBmb3IgcmV0dXJuIHByb2JlLgogICAoKiopIHRoaXMgaXMgdXNlZnVsIGZvciBmZXRjaGluZyBhIGZpZWxkIG9mIGRhdGEgc3RydWN0dXJlcy4KQEAgLTUwLDcgKzUwLDEwIEBACiAtLS0tLQogU2V2ZXJhbCB0eXBlcyBhcmUgc3VwcG9ydGVkIGZvciBmZXRjaC1hcmdzLiBVcHJvYmUgdHJhY2VyIHdpbGwgYWNjZXNzIG1lbW9yeQogYnkgZ2l2ZW4gdHlwZS4gUHJlZml4ICdzJyBhbmQgJ3UnIG1lYW5zIHRob3NlIHR5cGVzIGFyZSBzaWduZWQgYW5kIHVuc2lnbmVkCi1yZXNwZWN0aXZlbHkuIFRyYWNlZCBhcmd1bWVudHMgYXJlIHNob3duIGluIGRlY2ltYWwgKHNpZ25lZCkgb3IgaGV4ICh1bnNpZ25lZCkuCityZXNwZWN0aXZlbHkuICd4JyBwcmVmaXggaW1wbGllcyBpdCBpcyB1bnNpZ25lZC4gVHJhY2VkIGFyZ3VtZW50cyBhcmUgc2hvd24KK2luIGRlY2ltYWwgKCdzJyBhbmQgJ3UnKSBvciBoZXhhZGVjaW1hbCAoJ3gnKS4gV2l0aG91dCB0eXBlIGNhc3RpbmcsICd4MzInCitvciAneDY0JyBpcyB1c2VkIGRlcGVuZHMgb24gdGhlIGFyY2hpdGVjdHVyZSAoZS5nLiB4ODYtMzIgdXNlcyB4MzIsIGFuZAoreDg2LTY0IHVzZXMgeDY0KS4KIFN0cmluZyB0eXBlIGlzIGEgc3BlY2lhbCB0eXBlLCB3aGljaCBmZXRjaGVzIGEgIm51bGwtdGVybWluYXRlZCIgc3RyaW5nIGZyb20KIHVzZXIgc3BhY2UuCiBCaXRmaWVsZCBpcyBhbm90aGVyIHNwZWNpYWwgdHlwZSwgd2hpY2ggdGFrZXMgMyBwYXJhbWV0ZXJzLCBiaXQtd2lkdGgsIGJpdC0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdWJzYW4udHh0IGIvRG9jdW1lbnRhdGlvbi91YnNhbi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ODIxNWUuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi91YnNhbi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi1VbmRlZmluZWQgQmVoYXZpb3IgU2FuaXRpemVyIC0gVUJTQU4KLQotT3ZlcnZpZXcKLS0tLS0tLS0tCi0KLVVCU0FOIGlzIGEgcnVudGltZSB1bmRlZmluZWQgYmVoYXZpb3VyIGNoZWNrZXIuCi0KLVVCU0FOIHVzZXMgY29tcGlsZS10aW1lIGluc3RydW1lbnRhdGlvbiB0byBjYXRjaCB1bmRlZmluZWQgYmVoYXZpb3IgKFVCKS4KLUNvbXBpbGVyIGluc2VydHMgY29kZSB0aGF0IHBlcmZvcm0gY2VydGFpbiBraW5kcyBvZiBjaGVja3MgYmVmb3JlIG9wZXJhdGlvbnMKLXRoYXQgbWF5IGNhdXNlIFVCLiBJZiBjaGVjayBmYWlscyAoaS5lLiBVQiBkZXRlY3RlZCkgX191YnNhbl9oYW5kbGVfKgotZnVuY3Rpb24gY2FsbGVkIHRvIHByaW50IGVycm9yIG1lc3NhZ2UuCi0KLUdDQyBoYXMgdGhhdCBmZWF0dXJlIHNpbmNlIDQuOS54IFsxXSAoc2VlIC1mc2FuaXRpemU9dW5kZWZpbmVkIG9wdGlvbiBhbmQKLWl0cyBzdWJvcHRpb25zKS4gR0NDIDUueCBoYXMgbW9yZSBjaGVja2VycyBpbXBsZW1lbnRlZCBbMl0uCi0KLVJlcG9ydCBleGFtcGxlCi0tLS0tLS0tLS0tLS0tLS0KLQotCSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCSBVQlNBTjogVW5kZWZpbmVkIGJlaGF2aW91ciBpbiAuLi9pbmNsdWRlL2xpbnV4L2JpdG9wcy5oOjExMDozMwotCSBzaGlmdCBleHBvbmVudCAzMiBpcyB0byBsYXJnZSBmb3IgMzItYml0IHR5cGUgJ3Vuc2lnbmVkIGludCcKLQkgQ1BVOiAwIFBJRDogMCBDb21tOiBzd2FwcGVyIE5vdCB0YWludGVkIDQuNC4wLXJjMSsgIzI2Ci0JICAwMDAwMDAwMDAwMDAwMDAwIGZmZmZmZmZmODI0MDNjYzggZmZmZmZmZmY4MTVlNmNkNiAwMDAwMDAwMDAwMDAwMDAxCi0JICBmZmZmZmZmZjgyNDAzY2Y4IGZmZmZmZmZmODI0MDNjZTAgZmZmZmZmZmY4MTYzYTVlZCAwMDAwMDAwMDAwMDAwMDIwCi0JICBmZmZmZmZmZjgyNDAzZDc4IGZmZmZmZmZmODE2M2FjMmIgZmZmZmZmZmY4MTVmMDAwMSAwMDAwMDAwMDAwMDAwMDAyCi0JIENhbGwgVHJhY2U6Ci0JICBbPGZmZmZmZmZmODE1ZTZjZDY+XSBkdW1wX3N0YWNrKzB4NDUvMHg1ZgotCSAgWzxmZmZmZmZmZjgxNjNhNWVkPl0gdWJzYW5fZXBpbG9ndWUrMHhkLzB4NDAKLQkgIFs8ZmZmZmZmZmY4MTYzYWMyYj5dIF9fdWJzYW5faGFuZGxlX3NoaWZ0X291dF9vZl9ib3VuZHMrMHhlYi8weDEzMAotCSAgWzxmZmZmZmZmZjgxNWYwMDAxPl0gPyByYWRpeF90cmVlX2dhbmdfbG9va3VwX3Nsb3QrMHg1MS8weDE1MAotCSAgWzxmZmZmZmZmZjgxNzNjNTg2Pl0gX21peF9wb29sX2J5dGVzKzB4MWU2LzB4NDgwCi0JICBbPGZmZmZmZmZmODMxMDU2NTM+XSA/IGRtaV93YWxrX2Vhcmx5KzB4NDgvMHg1YwotCSAgWzxmZmZmZmZmZjgxNzNjODgxPl0gYWRkX2RldmljZV9yYW5kb21uZXNzKzB4NjEvMHgxMzAKLQkgIFs8ZmZmZmZmZmY4MzEwNWIzNT5dID8gZG1pX3NhdmVfb25lX2RldmljZSsweGFhLzB4YWEKLQkgIFs8ZmZmZmZmZmY4MzEwNTY1Mz5dIGRtaV93YWxrX2Vhcmx5KzB4NDgvMHg1YwotCSAgWzxmZmZmZmZmZjgzMTA2NmFlPl0gZG1pX3NjYW5fbWFjaGluZSsweDI3OC8weDRiNAotCSAgWzxmZmZmZmZmZjgxMTFkNThhPl0gPyB2cHJpbnRrX2RlZmF1bHQrMHgxYS8weDIwCi0JICBbPGZmZmZmZmZmODMwYWQxMjA+XSA/IGVhcmx5X2lkdF9oYW5kbGVyX2FycmF5KzB4MTIwLzB4MTIwCi0JICBbPGZmZmZmZmZmODMwYjIyNDA+XSBzZXR1cF9hcmNoKzB4NDA1LzB4YzJjCi0JICBbPGZmZmZmZmZmODMwYWQxMjA+XSA/IGVhcmx5X2lkdF9oYW5kbGVyX2FycmF5KzB4MTIwLzB4MTIwCi0JICBbPGZmZmZmZmZmODMwYWUwNTM+XSBzdGFydF9rZXJuZWwrMHg4My8weDQ5YQotCSAgWzxmZmZmZmZmZjgzMGFkMTIwPl0gPyBlYXJseV9pZHRfaGFuZGxlcl9hcnJheSsweDEyMC8weDEyMAotCSAgWzxmZmZmZmZmZjgzMGFkMzg2Pl0geDg2XzY0X3N0YXJ0X3Jlc2VydmF0aW9ucysweDJhLzB4MmMKLQkgIFs8ZmZmZmZmZmY4MzBhZDRmMz5dIHg4Nl82NF9zdGFydF9rZXJuZWwrMHgxNmIvMHgxN2EKLQkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVXNhZ2UKLS0tLS0tCi0KLVRvIGVuYWJsZSBVQlNBTiBjb25maWd1cmUga2VybmVsIHdpdGg6Ci0KLQlDT05GSUdfVUJTQU49eQotCi1hbmQgdG8gY2hlY2sgdGhlIGVudGlyZSBrZXJuZWw6Ci0KLSAgICAgICAgQ09ORklHX1VCU0FOX1NBTklUSVpFX0FMTD15Ci0KLVRvIGVuYWJsZSBpbnN0cnVtZW50YXRpb24gZm9yIHNwZWNpZmljIGZpbGVzIG9yIGRpcmVjdG9yaWVzLCBhZGQgYSBsaW5lCi1zaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmcgdG8gdGhlIHJlc3BlY3RpdmUga2VybmVsIE1ha2VmaWxlOgotCi0gICAgICAgIEZvciBhIHNpbmdsZSBmaWxlIChlLmcuIG1haW4ubyk6Ci0gICAgICAgICAgICAgICAgVUJTQU5fU0FOSVRJWkVfbWFpbi5vIDo9IHkKLQotICAgICAgICBGb3IgYWxsIGZpbGVzIGluIG9uZSBkaXJlY3Rvcnk6Ci0gICAgICAgICAgICAgICAgVUJTQU5fU0FOSVRJWkUgOj0geQotCi1UbyBleGNsdWRlIGZpbGVzIGZyb20gYmVpbmcgaW5zdHJ1bWVudGVkIGV2ZW4gaWYKLUNPTkZJR19VQlNBTl9TQU5JVElaRV9BTEw9eSwgdXNlOgotCi0gICAgICAgICAgICAgICAgVUJTQU5fU0FOSVRJWkVfbWFpbi5vIDo9IG4KLSAgICAgICAgYW5kOgotICAgICAgICAgICAgICAgIFVCU0FOX1NBTklUSVpFIDo9IG4KLQotRGV0ZWN0aW9uIG9mIHVuYWxpZ25lZCBhY2Nlc3NlcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIHNlcGFyYXRlIG9wdGlvbiAtCi1DT05GSUdfVUJTQU5fQUxJR05NRU5ULiBJdCdzIG9mZiBieSBkZWZhdWx0IG9uIGFyY2hpdGVjdHVyZXMgdGhhdCBzdXBwb3J0Ci11bmFsaWduZWQgYWNjZXNzZXMgKENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTPXkpLiBPbmUgY291bGQKLXN0aWxsIGVuYWJsZSBpdCBpbiBjb25maWcsIGp1c3Qgbm90ZSB0aGF0IGl0IHdpbGwgcHJvZHVjZSBhIGxvdCBvZiBVQlNBTgotcmVwb3J0cy4KLQotUmVmZXJlbmNlcwotLS0tLS0tLS0tLQotCi1bMV0gLSBodHRwczovL2djYy5nbnUub3JnL29ubGluZWRvY3MvZ2NjLTQuOS4wL2djYy9EZWJ1Z2dpbmctT3B0aW9ucy5odG1sCi1bMl0gLSBodHRwczovL2djYy5nbnUub3JnL29ubGluZWRvY3MvZ2NjL0RlYnVnZ2luZy1PcHRpb25zLmh0bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vZGV2aWNlcy9hcm0tdmdpYy1pdHMudHh0IGIvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9kZXZpY2VzL2FybS12Z2ljLWl0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA4MWE1YgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vZGV2aWNlcy9hcm0tdmdpYy1pdHMudHh0CkBAIC0wLDAgKzEsMzggQEAKK0FSTSBWaXJ0dWFsIEludGVycnVwdCBUcmFuc2xhdGlvbiBTZXJ2aWNlIChJVFMpCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitEZXZpY2UgdHlwZXMgc3VwcG9ydGVkOgorICBLVk1fREVWX1RZUEVfQVJNX1ZHSUNfSVRTICAgIEFSTSBJbnRlcnJ1cHQgVHJhbnNsYXRpb24gU2VydmljZSBDb250cm9sbGVyCisKK1RoZSBJVFMgYWxsb3dzIE1TSSgtWCkgaW50ZXJydXB0cyB0byBiZSBpbmplY3RlZCBpbnRvIGd1ZXN0cy4gVGhpcyBleHRlbnNpb24gaXMKK29wdGlvbmFsLiAgQ3JlYXRpbmcgYSB2aXJ0dWFsIElUUyBjb250cm9sbGVyIGFsc28gcmVxdWlyZXMgYSBob3N0IEdJQ3YzIChzZWUKK2FybS12Z2ljLXYzLnR4dCksIGJ1dCBkb2VzIG5vdCBkZXBlbmQgb24gaGF2aW5nIHBoeXNpY2FsIElUUyBjb250cm9sbGVycy4KKworVGhlcmUgY2FuIGJlIG11bHRpcGxlIElUUyBjb250cm9sbGVycyBwZXIgZ3Vlc3QsIGVhY2ggb2YgdGhlbSBoYXMgdG8gaGF2ZQorYSBzZXBhcmF0ZSwgbm9uLW92ZXJsYXBwaW5nIE1NSU8gcmVnaW9uLgorCisKK0dyb3VwczoKKyAgS1ZNX0RFVl9BUk1fVkdJQ19HUlBfQUREUgorICBBdHRyaWJ1dGVzOgorICAgIEtWTV9WR0lDX0lUU19BRERSX1RZUEUgKHJ3LCA2NC1iaXQpCisgICAgICBCYXNlIGFkZHJlc3MgaW4gdGhlIGd1ZXN0IHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIEdJQ3YzIElUUworICAgICAgY29udHJvbCByZWdpc3RlciBmcmFtZS4KKyAgICAgIFRoaXMgYWRkcmVzcyBuZWVkcyB0byBiZSA2NEsgYWxpZ25lZCBhbmQgdGhlIHJlZ2lvbiBjb3ZlcnMgMTI4Sy4KKyAgRXJyb3JzOgorICAgIC1FMkJJRzogIEFkZHJlc3Mgb3V0c2lkZSBvZiBhZGRyZXNzYWJsZSBJUEEgcmFuZ2UKKyAgICAtRUlOVkFMOiBJbmNvcnJlY3RseSBhbGlnbmVkIGFkZHJlc3MKKyAgICAtRUVYSVNUOiBBZGRyZXNzIGFscmVhZHkgY29uZmlndXJlZAorICAgIC1FRkFVTFQ6IEludmFsaWQgdXNlciBwb2ludGVyIGZvciBhdHRyLT5hZGRyLgorICAgIC1FTk9ERVY6IEluY29ycmVjdCBhdHRyaWJ1dGUgb3IgdGhlIElUUyBpcyBub3Qgc3VwcG9ydGVkLgorCisKKyAgS1ZNX0RFVl9BUk1fVkdJQ19HUlBfQ1RSTAorICBBdHRyaWJ1dGVzOgorICAgIEtWTV9ERVZfQVJNX1ZHSUNfQ1RSTF9JTklUCisgICAgICByZXF1ZXN0IHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgSVRTLCBubyBhZGRpdGlvbmFsIHBhcmFtZXRlciBpbgorICAgICAga3ZtX2RldmljZV9hdHRyLmFkZHIuCisgIEVycm9yczoKKyAgICAtRU5YSU86ICBJVFMgbm90IHByb3Blcmx5IGNvbmZpZ3VyZWQgYXMgcmVxdWlyZWQgcHJpb3IgdG8gc2V0dGluZworICAgICAgICAgICAgIHRoaXMgYXR0cmlidXRlCisgICAgLUVOT01FTTogTWVtb3J5IHNob3J0YWdlIHdoZW4gYWxsb2NhdGluZyBJVFMgaW50ZXJuYWwgZGF0YQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9kZXZpY2VzL2FybS12Z2ljLXYzLnR4dCBiL0RvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vZGV2aWNlcy9hcm0tdmdpYy12My50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM0OGIzYwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vZGV2aWNlcy9hcm0tdmdpYy12My50eHQKQEAgLTAsMCArMSwyMDYgQEAKK0FSTSBWaXJ0dWFsIEdlbmVyaWMgSW50ZXJydXB0IENvbnRyb2xsZXIgdjMgYW5kIGxhdGVyIChWR0lDdjMpCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK0RldmljZSB0eXBlcyBzdXBwb3J0ZWQ6CisgIEtWTV9ERVZfVFlQRV9BUk1fVkdJQ19WMyAgICAgQVJNIEdlbmVyaWMgSW50ZXJydXB0IENvbnRyb2xsZXIgdjMuMAorCitPbmx5IG9uZSBWR0lDIGluc3RhbmNlIG1heSBiZSBpbnN0YW50aWF0ZWQgdGhyb3VnaCB0aGlzIEFQSS4gIFRoZSBjcmVhdGVkIFZHSUMKK3dpbGwgYWN0IGFzIHRoZSBWTSBpbnRlcnJ1cHQgY29udHJvbGxlciwgcmVxdWlyaW5nIGVtdWxhdGVkIHVzZXItc3BhY2UgZGV2aWNlcwordG8gaW5qZWN0IGludGVycnVwdHMgdG8gdGhlIFZHSUMgaW5zdGVhZCBvZiBkaXJlY3RseSB0byBDUFVzLiAgSXQgaXMgbm90Citwb3NzaWJsZSB0byBjcmVhdGUgYm90aCBhIEdJQ3YzIGFuZCBHSUN2MiBvbiB0aGUgc2FtZSBWTS4KKworQ3JlYXRpbmcgYSBndWVzdCBHSUN2MyBkZXZpY2UgcmVxdWlyZXMgYSBob3N0IEdJQ3YzIGFzIHdlbGwuCisKKworR3JvdXBzOgorICBLVk1fREVWX0FSTV9WR0lDX0dSUF9BRERSCisgIEF0dHJpYnV0ZXM6CisgICAgS1ZNX1ZHSUNfVjNfQUREUl9UWVBFX0RJU1QgKHJ3LCA2NC1iaXQpCisgICAgICBCYXNlIGFkZHJlc3MgaW4gdGhlIGd1ZXN0IHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIEdJQ3YzIGRpc3RyaWJ1dG9yCisgICAgICByZWdpc3RlciBtYXBwaW5ncy4gT25seSB2YWxpZCBmb3IgS1ZNX0RFVl9UWVBFX0FSTV9WR0lDX1YzLgorICAgICAgVGhpcyBhZGRyZXNzIG5lZWRzIHRvIGJlIDY0SyBhbGlnbmVkIGFuZCB0aGUgcmVnaW9uIGNvdmVycyA2NCBLQnl0ZS4KKworICAgIEtWTV9WR0lDX1YzX0FERFJfVFlQRV9SRURJU1QgKHJ3LCA2NC1iaXQpCisgICAgICBCYXNlIGFkZHJlc3MgaW4gdGhlIGd1ZXN0IHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIEdJQ3YzCisgICAgICByZWRpc3RyaWJ1dG9yIHJlZ2lzdGVyIG1hcHBpbmdzLiBUaGVyZSBhcmUgdHdvIDY0SyBwYWdlcyBmb3IgZWFjaAorICAgICAgVkNQVSBhbmQgYWxsIG9mIHRoZSByZWRpc3RyaWJ1dG9yIHBhZ2VzIGFyZSBjb250aWd1b3VzLgorICAgICAgT25seSB2YWxpZCBmb3IgS1ZNX0RFVl9UWVBFX0FSTV9WR0lDX1YzLgorICAgICAgVGhpcyBhZGRyZXNzIG5lZWRzIHRvIGJlIDY0SyBhbGlnbmVkLgorICBFcnJvcnM6CisgICAgLUUyQklHOiAgQWRkcmVzcyBvdXRzaWRlIG9mIGFkZHJlc3NhYmxlIElQQSByYW5nZQorICAgIC1FSU5WQUw6IEluY29ycmVjdGx5IGFsaWduZWQgYWRkcmVzcworICAgIC1FRVhJU1Q6IEFkZHJlc3MgYWxyZWFkeSBjb25maWd1cmVkCisgICAgLUVOWElPOiAgVGhlIGdyb3VwIG9yIGF0dHJpYnV0ZSBpcyB1bmtub3duL3Vuc3VwcG9ydGVkIGZvciB0aGlzIGRldmljZQorICAgICAgICAgICAgIG9yIGhhcmR3YXJlIHN1cHBvcnQgaXMgbWlzc2luZy4KKyAgICAtRUZBVUxUOiBJbnZhbGlkIHVzZXIgcG9pbnRlciBmb3IgYXR0ci0+YWRkci4KKworCisKKyAgS1ZNX0RFVl9BUk1fVkdJQ19HUlBfRElTVF9SRUdTCisgIEtWTV9ERVZfQVJNX1ZHSUNfR1JQX1JFRElTVF9SRUdTCisgIEF0dHJpYnV0ZXM6CisgICAgVGhlIGF0dHIgZmllbGQgb2Yga3ZtX2RldmljZV9hdHRyIGVuY29kZXMgdHdvIHZhbHVlczoKKyAgICBiaXRzOiAgICAgfCA2MyAgIC4uLi4gIDMyICB8ICAzMSAgIC4uLi4gICAgMCB8CisgICAgdmFsdWVzOiAgIHwgICAgICBtcGlkciAgICAgfCAgICAgIG9mZnNldCAgICAgfAorCisgICAgQWxsIGRpc3RyaWJ1dG9yIHJlZ3MgYXJlIChydywgMzItYml0KSBhbmQga3ZtX2RldmljZV9hdHRyLmFkZHIgcG9pbnRzIHRvIGEKKyAgICBfX3UzMiB2YWx1ZS4gIDY0LWJpdCByZWdpc3RlcnMgbXVzdCBiZSBhY2Nlc3NlZCBieSBzZXBhcmF0ZWx5IGFjY2Vzc2luZyB0aGUKKyAgICBsb3dlciBhbmQgaGlnaGVyIHdvcmQuCisKKyAgICBXcml0ZXMgdG8gcmVhZC1vbmx5IHJlZ2lzdGVycyBhcmUgaWdub3JlZCBieSB0aGUga2VybmVsLgorCisgICAgS1ZNX0RFVl9BUk1fVkdJQ19HUlBfRElTVF9SRUdTIGFjY2Vzc2VzIHRoZSBtYWluIGRpc3RyaWJ1dG9yIHJlZ2lzdGVycy4KKyAgICBLVk1fREVWX0FSTV9WR0lDX0dSUF9SRURJU1RfUkVHUyBhY2Nlc3NlcyB0aGUgcmVkaXN0cmlidXRvciBvZiB0aGUgQ1BVCisgICAgc3BlY2lmaWVkIGJ5IHRoZSBtcGlkci4KKworICAgIFRoZSBvZmZzZXQgaXMgcmVsYXRpdmUgdG8gdGhlICJbUmVdRGlzdHJpYnV0b3IgYmFzZSBhZGRyZXNzIiBhcyBkZWZpbmVkCisgICAgaW4gdGhlIEdJQ3YzLzQgc3BlY3MuICBHZXR0aW5nIG9yIHNldHRpbmcgc3VjaCBhIHJlZ2lzdGVyIGhhcyB0aGUgc2FtZQorICAgIGVmZmVjdCBhcyByZWFkaW5nIG9yIHdyaXRpbmcgdGhlIHJlZ2lzdGVyIG9uIHJlYWwgaGFyZHdhcmUsIGV4Y2VwdCBmb3IgdGhlCisgICAgZm9sbG93aW5nIHJlZ2lzdGVyczogR0lDRF9TVEFUVVNSLCBHSUNSX1NUQVRVU1IsIEdJQ0RfSVNQRU5EUiwKKyAgICBHSUNSX0lTUEVORFIwLCBHSUNEX0lDUEVORFIsIGFuZCBHSUNSX0lDUEVORFIwLiAgVGhlc2UgcmVnaXN0ZXJzIGJlaGF2ZQorICAgIGRpZmZlcmVudGx5IHdoZW4gYWNjZXNzZWQgdmlhIHRoaXMgaW50ZXJmYWNlIGNvbXBhcmVkIHRvIHRoZWlyCisgICAgYXJjaGl0ZWN0dXJhbGx5IGRlZmluZWQgYmVoYXZpb3IgdG8gYWxsb3cgc29mdHdhcmUgYSBmdWxsIHZpZXcgb2YgdGhlCisgICAgVkdJQydzIGludGVybmFsIHN0YXRlLgorCisgICAgVGhlIG1waWRyIGZpZWxkIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGljaAorICAgIHJlZGlzdHJpYnV0b3IgaXMgYWNjZXNzZWQuICBUaGUgbXBpZHIgaXMgaWdub3JlZCBmb3IgdGhlIGRpc3RyaWJ1dG9yLgorCisgICAgVGhlIG1waWRyIGVuY29kaW5nIGlzIGJhc2VkIG9uIHRoZSBhZmZpbml0eSBpbmZvcm1hdGlvbiBpbiB0aGUKKyAgICBhcmNoaXRlY3R1cmUgZGVmaW5lZCBNUElEUiwgYW5kIHRoZSBmaWVsZCBpcyBlbmNvZGVkIGFzIGZvbGxvd3M6CisgICAgICB8IDYzIC4uLi4gNTYgfCA1NSAuLi4uIDQ4IHwgNDcgLi4uLiA0MCB8IDM5IC4uLi4gMzIgfAorICAgICAgfCAgICBBZmYzICAgIHwgICAgQWZmMiAgICB8ICAgIEFmZjEgICAgfCAgICBBZmYwICAgIHwKKworICAgIE5vdGUgdGhhdCBkaXN0cmlidXRvciBmaWVsZHMgYXJlIG5vdCBiYW5rZWQsIGJ1dCByZXR1cm4gdGhlIHNhbWUgdmFsdWUKKyAgICByZWdhcmRsZXNzIG9mIHRoZSBtcGlkciB1c2VkIHRvIGFjY2VzcyB0aGUgcmVnaXN0ZXIuCisKKyAgICBUaGUgR0lDRF9TVEFUVVNSIGFuZCBHSUNSX1NUQVRVU1IgcmVnaXN0ZXJzIGFyZSBhcmNoaXRlY3R1cmFsbHkgZGVmaW5lZCBzdWNoCisgICAgdGhhdCBhIHdyaXRlIG9mIGEgY2xlYXIgYml0IGhhcyBubyBlZmZlY3QsIHdoZXJlYXMgYSB3cml0ZSB3aXRoIGEgc2V0IGJpdAorICAgIGNsZWFycyB0aGF0IHZhbHVlLiAgVG8gYWxsb3cgdXNlcnNwYWNlIHRvIGZyZWVseSBzZXQgdGhlIHZhbHVlcyBvZiB0aGVzZSB0d28KKyAgICByZWdpc3RlcnMsIHNldHRpbmcgdGhlIGF0dHJpYnV0ZXMgd2l0aCB0aGUgcmVnaXN0ZXIgb2Zmc2V0cyBmb3IgdGhlc2UgdHdvCisgICAgcmVnaXN0ZXJzIHNpbXBseSBzZXRzIHRoZSBub24tcmVzZXJ2ZWQgYml0cyB0byB0aGUgdmFsdWUgd3JpdHRlbi4KKworCisgICAgQWNjZXNzZXMgKHJlYWRzIGFuZCB3cml0ZXMpIHRvIHRoZSBHSUNEX0lTUEVORFIgcmVnaXN0ZXIgcmVnaW9uIGFuZAorICAgIEdJQ1JfSVNQRU5EUjAgcmVnaXN0ZXJzIGdldC9zZXQgdGhlIHZhbHVlIG9mIHRoZSBsYXRjaGVkIHBlbmRpbmcgc3RhdGUgZm9yCisgICAgdGhlIGludGVycnVwdHMuCisKKyAgICBUaGlzIGlzIGlkZW50aWNhbCB0byB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgYSBndWVzdCByZWFkIGZyb20gSVNQRU5EUiBmb3IgYW4KKyAgICBlZGdlIHRyaWdnZXJlZCBpbnRlcnJ1cHQsIGJ1dCBtYXkgZGlmZmVyIGZvciBsZXZlbCB0cmlnZ2VyZWQgaW50ZXJydXB0cy4KKyAgICBGb3IgZWRnZSB0cmlnZ2VyZWQgaW50ZXJydXB0cywgb25jZSBhbiBpbnRlcnJ1cHQgYmVjb21lcyBwZW5kaW5nICh3aGV0aGVyCisgICAgYmVjYXVzZSBvZiBhbiBlZGdlIGRldGVjdGVkIG9uIHRoZSBpbnB1dCBsaW5lIG9yIGJlY2F1c2Ugb2YgYSBndWVzdCB3cml0ZQorICAgIHRvIElTUEVORFIpIHRoaXMgc3RhdGUgaXMgImxhdGNoZWQiLCBhbmQgb25seSBjbGVhcmVkIHdoZW4gZWl0aGVyIHRoZQorICAgIGludGVycnVwdCBpcyBhY3RpdmF0ZWQgb3Igd2hlbiB0aGUgZ3Vlc3Qgd3JpdGVzIHRvIElDUEVORFIuIEEgbGV2ZWwKKyAgICB0cmlnZ2VyZWQgaW50ZXJydXB0IG1heSBiZSBwZW5kaW5nIGVpdGhlciBiZWNhdXNlIHRoZSBsZXZlbCBpbnB1dCBpcyBoZWxkCisgICAgaGlnaCBieSBhIGRldmljZSwgb3IgYmVjYXVzZSBvZiBhIGd1ZXN0IHdyaXRlIHRvIHRoZSBJU1BFTkRSIHJlZ2lzdGVyLiBPbmx5CisgICAgSVNQRU5EUiB3cml0ZXMgYXJlIGxhdGNoZWQ7IGlmIHRoZSBkZXZpY2UgbG93ZXJzIHRoZSBsaW5lIGxldmVsIHRoZW4gdGhlCisgICAgaW50ZXJydXB0IGlzIG5vIGxvbmdlciBwZW5kaW5nIHVubGVzcyB0aGUgZ3Vlc3QgYWxzbyB3cm90ZSB0byBJU1BFTkRSLCBhbmQKKyAgICBjb252ZXJzZWx5IHdyaXRlcyB0byBJQ1BFTkRSIG9yIGFjdGl2YXRpb25zIG9mIHRoZSBpbnRlcnJ1cHQgZG8gbm90IGNsZWFyCisgICAgdGhlIHBlbmRpbmcgc3RhdHVzIGlmIHRoZSBsaW5lIGxldmVsIGlzIHN0aWxsIGJlaW5nIGhlbGQgaGlnaC4gIChUaGVzZQorICAgIHJ1bGVzIGFyZSBkb2N1bWVudGVkIGluIHRoZSBHSUN2MyBzcGVjaWZpY2F0aW9uIGRlc2NyaXB0aW9ucyBvZiB0aGUgSUNQRU5EUgorICAgIGFuZCBJU1BFTkRSIHJlZ2lzdGVycy4pIEZvciBhIGxldmVsIHRyaWdnZXJlZCBpbnRlcnJ1cHQgdGhlIHZhbHVlIGFjY2Vzc2VkCisgICAgaGVyZSBpcyB0aGF0IG9mIHRoZSBsYXRjaCB3aGljaCBpcyBzZXQgYnkgSVNQRU5EUiBhbmQgY2xlYXJlZCBieSBJQ1BFTkRSIG9yCisgICAgaW50ZXJydXB0IGFjdGl2YXRpb24sIHdoZXJlYXMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IGEgZ3Vlc3QgcmVhZCBmcm9tCisgICAgSVNQRU5EUiBpcyB0aGUgbG9naWNhbCBPUiBvZiB0aGUgbGF0Y2ggdmFsdWUgYW5kIHRoZSBpbnB1dCBsaW5lIGxldmVsLgorCisgICAgUmF3IGFjY2VzcyB0byB0aGUgbGF0Y2ggc3RhdGUgaXMgcHJvdmlkZWQgdG8gdXNlcnNwYWNlIHNvIHRoYXQgaXQgY2FuIHNhdmUKKyAgICBhbmQgcmVzdG9yZSB0aGUgZW50aXJlIEdJQyBpbnRlcm5hbCBzdGF0ZSAod2hpY2ggaXMgZGVmaW5lZCBieSB0aGUKKyAgICBjb21iaW5hdGlvbiBvZiB0aGUgY3VycmVudCBpbnB1dCBsaW5lIGxldmVsIGFuZCB0aGUgbGF0Y2ggc3RhdGUsIGFuZCBjYW5ub3QKKyAgICBiZSBkZWR1Y2VkIGZyb20gcHVyZWx5IHRoZSBsaW5lIGxldmVsIGFuZCB0aGUgdmFsdWUgb2YgdGhlIElTUEVORFIKKyAgICByZWdpc3RlcnMpLgorCisgICAgQWNjZXNzZXMgdG8gR0lDRF9JQ1BFTkRSIHJlZ2lzdGVyIHJlZ2lvbiBhbmQgR0lDUl9JQ1BFTkRSMCByZWdpc3RlcnMgaGF2ZQorICAgIFJBWi9XSSBzZW1hbnRpY3MsIG1lYW5pbmcgdGhhdCByZWFkcyBhbHdheXMgcmV0dXJuIDAgYW5kIHdyaXRlcyBhcmUgYWx3YXlzCisgICAgaWdub3JlZC4KKworICBFcnJvcnM6CisgICAgLUVOWElPOiBHZXR0aW5nIG9yIHNldHRpbmcgdGhpcyByZWdpc3RlciBpcyBub3QgeWV0IHN1cHBvcnRlZAorICAgIC1FQlVTWTogT25lIG9yIG1vcmUgVkNQVXMgYXJlIHJ1bm5pbmcKKworCisgIEtWTV9ERVZfQVJNX1ZHSUNfQ1BVX1NZU1JFR1MKKyAgQXR0cmlidXRlczoKKyAgICBUaGUgYXR0ciBmaWVsZCBvZiBrdm1fZGV2aWNlX2F0dHIgZW5jb2RlcyB0d28gdmFsdWVzOgorICAgIGJpdHM6ICAgICB8IDYzICAgICAgLi4uLiAgICAgICAzMiB8IDMxICAuLi4uICAxNiB8IDE1ICAuLi4uICAwIHwKKyAgICB2YWx1ZXM6ICAgfCAgICAgICAgIG1waWRyICAgICAgICAgfCAgICAgIFJFUyAgICAgfCAgICBpbnN0ciAgICB8CisKKyAgICBUaGUgbXBpZHIgZmllbGQgZW5jb2RlcyB0aGUgQ1BVIElEIGJhc2VkIG9uIHRoZSBhZmZpbml0eSBpbmZvcm1hdGlvbiBpbiB0aGUKKyAgICBhcmNoaXRlY3R1cmUgZGVmaW5lZCBNUElEUiwgYW5kIHRoZSBmaWVsZCBpcyBlbmNvZGVkIGFzIGZvbGxvd3M6CisgICAgICB8IDYzIC4uLi4gNTYgfCA1NSAuLi4uIDQ4IHwgNDcgLi4uLiA0MCB8IDM5IC4uLi4gMzIgfAorICAgICAgfCAgICBBZmYzICAgIHwgICAgQWZmMiAgICB8ICAgIEFmZjEgICAgfCAgICBBZmYwICAgIHwKKworICAgIFRoZSBpbnN0ciBmaWVsZCBlbmNvZGVzIHRoZSBzeXN0ZW0gcmVnaXN0ZXIgdG8gYWNjZXNzIGJhc2VkIG9uIHRoZSBmaWVsZHMKKyAgICBkZWZpbmVkIGluIHRoZSBBNjQgaW5zdHJ1Y3Rpb24gc2V0IGVuY29kaW5nIGZvciBzeXN0ZW0gcmVnaXN0ZXIgYWNjZXNzCisgICAgKFJFUyBtZWFucyB0aGUgYml0cyBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIHNob3VsZCBiZSB6ZXJvKToKKworICAgICAgfCAxNSAuLi4gMTQgfCAxMyAuLi4gMTEgfCAxMCAuLi4gNyB8IDYgLi4uIDMgfCAyIC4uLiAwIHwKKyAgICAgIHwgICBPcCAwICAgIHwgICAgT3AxICAgIHwgICAgQ1JuICAgfCAgIENSbSAgIHwgICBPcDIgICB8CisKKyAgICBBbGwgc3lzdGVtIHJlZ3MgYWNjZXNzZWQgdGhyb3VnaCB0aGlzIEFQSSBhcmUgKHJ3LCA2NC1iaXQpIGFuZAorICAgIGt2bV9kZXZpY2VfYXR0ci5hZGRyIHBvaW50cyB0byBhIF9fdTY0IHZhbHVlLgorCisgICAgS1ZNX0RFVl9BUk1fVkdJQ19DUFVfU1lTUkVHUyBhY2Nlc3NlcyB0aGUgQ1BVIGludGVyZmFjZSByZWdpc3RlcnMgZm9yIHRoZQorICAgIENQVSBzcGVjaWZpZWQgYnkgdGhlIG1waWRyIGZpZWxkLgorCisgIEVycm9yczoKKyAgICAtRU5YSU86IEdldHRpbmcgb3Igc2V0dGluZyB0aGlzIHJlZ2lzdGVyIGlzIG5vdCB5ZXQgc3VwcG9ydGVkCisgICAgLUVCVVNZOiBWQ1BVIGlzIHJ1bm5pbmcKKyAgICAtRUlOVkFMOiBJbnZhbGlkIG1waWRyIHN1cHBsaWVkCisKKworICBLVk1fREVWX0FSTV9WR0lDX0dSUF9OUl9JUlFTCisgIEF0dHJpYnV0ZXM6CisgICAgQSB2YWx1ZSBkZXNjcmliaW5nIHRoZSBudW1iZXIgb2YgaW50ZXJydXB0cyAoU0dJLCBQUEkgYW5kIFNQSSkgZm9yCisgICAgdGhpcyBHSUMgaW5zdGFuY2UsIHJhbmdpbmcgZnJvbSA2NCB0byAxMDI0LCBpbiBpbmNyZW1lbnRzIG9mIDMyLgorCisgICAga3ZtX2RldmljZV9hdHRyLmFkZHIgcG9pbnRzIHRvIGEgX191MzIgdmFsdWUuCisKKyAgRXJyb3JzOgorICAgIC1FSU5WQUw6IFZhbHVlIHNldCBpcyBvdXQgb2YgdGhlIGV4cGVjdGVkIHJhbmdlCisgICAgLUVCVVNZOiBWYWx1ZSBoYXMgYWxyZWFkeSBiZSBzZXQuCisKKworICBLVk1fREVWX0FSTV9WR0lDX0dSUF9DVFJMCisgIEF0dHJpYnV0ZXM6CisgICAgS1ZNX0RFVl9BUk1fVkdJQ19DVFJMX0lOSVQKKyAgICAgIHJlcXVlc3QgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBWR0lDLCBubyBhZGRpdGlvbmFsIHBhcmFtZXRlciBpbgorICAgICAga3ZtX2RldmljZV9hdHRyLmFkZHIuCisgIEVycm9yczoKKyAgICAtRU5YSU86IFZHSUMgbm90IHByb3Blcmx5IGNvbmZpZ3VyZWQgYXMgcmVxdWlyZWQgcHJpb3IgdG8gY2FsbGluZworICAgICB0aGlzIGF0dHJpYnV0ZQorICAgIC1FTk9ERVY6IG5vIG9ubGluZSBWQ1BVCisgICAgLUVOT01FTTogbWVtb3J5IHNob3J0YWdlIHdoZW4gYWxsb2NhdGluZyB2Z2ljIGludGVybmFsIGRhdGEKKworCisgIEtWTV9ERVZfQVJNX1ZHSUNfR1JQX0xFVkVMX0lORk8KKyAgQXR0cmlidXRlczoKKyAgICBUaGUgYXR0ciBmaWVsZCBvZiBrdm1fZGV2aWNlX2F0dHIgZW5jb2RlcyB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAgICBiaXRzOiAgICAgfCA2MyAgICAgIC4uLi4gICAgICAgMzIgfCAzMSAgIC4uLi4gICAgMTAgfCA5ICAuLi4uICAwIHwKKyAgICB2YWx1ZXM6ICAgfCAgICAgICAgIG1waWRyICAgICAgICAgfCAgICAgIGluZm8gICAgICAgfCAgIHZJTlRJRCAgIHwKKworICAgIFRoZSB2SU5USUQgc3BlY2lmaWVzIHdoaWNoIHNldCBvZiBJUlFzIGlzIHJlcG9ydGVkIG9uLgorCisgICAgVGhlIGluZm8gZmllbGQgc3BlY2lmaWVzIHdoaWNoIGluZm9ybWF0aW9uIHVzZXJzcGFjZSB3YW50cyB0byBnZXQgb3Igc2V0CisgICAgdXNpbmcgdGhpcyBpbnRlcmZhY2UuICBDdXJyZW50bHkgd2Ugc3VwcG9ydCB0aGUgZm9sbG93aW5nIGluZm8gdmFsdWVzOgorCisgICAgICBWR0lDX0xFVkVMX0lORk9fTElORV9MRVZFTDoKKwlHZXQvU2V0IHRoZSBpbnB1dCBsZXZlbCBvZiB0aGUgSVJRIGxpbmUgZm9yIGEgc2V0IG9mIDMyIGNvbnRpZ3VvdXNseQorCW51bWJlcmVkIGludGVycnVwdHMuCisJdklOVElEIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi4KKworCWt2bV9kZXZpY2VfYXR0ci5hZGRyIHBvaW50cyB0byBhIF9fdTMyIHZhbHVlIHdoaWNoIHdpbGwgY29udGFpbiBhCisJYml0bWFwIHdoZXJlIGEgc2V0IGJpdCBtZWFucyB0aGUgaW50ZXJydXB0IGxldmVsIGlzIGFzc2VydGVkLgorCisJQml0W25dIGluZGljYXRlcyB0aGUgc3RhdHVzIGZvciBpbnRlcnJ1cHQgdklOVElEICsgbi4KKworICAgIFNHSXMgYW5kIGFueSBpbnRlcnJ1cHQgd2l0aCBhIGhpZ2hlciBJRCB0aGFuIHRoZSBudW1iZXIgb2YgaW50ZXJydXB0cworICAgIHN1cHBvcnRlZCwgd2lsbCBiZSBSQVovV0kuICBMUElzIGFyZSBhbHdheXMgZWRnZS10cmlnZ2VyZWQgYW5kIGFyZQorICAgIHRoZXJlZm9yZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgaW50ZXJmYWNlLgorCisgICAgUFBJcyBhcmUgcmVwb3J0ZWQgcGVyIFZDUFUgYXMgc3BlY2lmaWVkIGluIHRoZSBtcGlkciBmaWVsZCwgYW5kIFNQSXMgYXJlCisgICAgcmVwb3J0ZWQgd2l0aCB0aGUgc2FtZSB2YWx1ZSByZWdhcmRsZXNzIG9mIHRoZSBtcGlkciBzcGVjaWZpZWQuCisKKyAgICBUaGUgbXBpZHIgZmllbGQgZW5jb2RlcyB0aGUgQ1BVIElEIGJhc2VkIG9uIHRoZSBhZmZpbml0eSBpbmZvcm1hdGlvbiBpbiB0aGUKKyAgICBhcmNoaXRlY3R1cmUgZGVmaW5lZCBNUElEUiwgYW5kIHRoZSBmaWVsZCBpcyBlbmNvZGVkIGFzIGZvbGxvd3M6CisgICAgICB8IDYzIC4uLi4gNTYgfCA1NSAuLi4uIDQ4IHwgNDcgLi4uLiA0MCB8IDM5IC4uLi4gMzIgfAorICAgICAgfCAgICBBZmYzICAgIHwgICAgQWZmMiAgICB8ICAgIEFmZjEgICAgfCAgICBBZmYwICAgIHwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vZGV2aWNlcy9hcm0tdmdpYy50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwva3ZtL2RldmljZXMvYXJtLXZnaWMudHh0CmluZGV4IDg5MTgyZjguLjc2ZTYxYzggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vZGV2aWNlcy9hcm0tdmdpYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9kZXZpY2VzL2FybS12Z2ljLnR4dApAQCAtMSwyNCArMSwxOSBAQAotQVJNIFZpcnR1YWwgR2VuZXJpYyBJbnRlcnJ1cHQgQ29udHJvbGxlciAoVkdJQykKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitBUk0gVmlydHVhbCBHZW5lcmljIEludGVycnVwdCBDb250cm9sbGVyIHYyIChWR0lDKQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogRGV2aWNlIHR5cGVzIHN1cHBvcnRlZDoKICAgS1ZNX0RFVl9UWVBFX0FSTV9WR0lDX1YyICAgICBBUk0gR2VuZXJpYyBJbnRlcnJ1cHQgQ29udHJvbGxlciB2Mi4wCi0gIEtWTV9ERVZfVFlQRV9BUk1fVkdJQ19WMyAgICAgQVJNIEdlbmVyaWMgSW50ZXJydXB0IENvbnRyb2xsZXIgdjMuMAotICBLVk1fREVWX1RZUEVfQVJNX1ZHSUNfSVRTICAgIEFSTSBJbnRlcnJ1cHQgVHJhbnNsYXRpb24gU2VydmljZSBDb250cm9sbGVyCiAKLU9ubHkgb25lIFZHSUMgaW5zdGFuY2Ugb2YgdGhlIFYyL1YzIHR5cGVzIGFib3ZlIG1heSBiZSBpbnN0YW50aWF0ZWQgdGhyb3VnaAotZWl0aGVyIHRoaXMgQVBJIG9yIHRoZSBsZWdhY3kgS1ZNX0NSRUFURV9JUlFDSElQIGFwaS4gIFRoZSBjcmVhdGVkIFZHSUMgd2lsbAotYWN0IGFzIHRoZSBWTSBpbnRlcnJ1cHQgY29udHJvbGxlciwgcmVxdWlyaW5nIGVtdWxhdGVkIHVzZXItc3BhY2UgZGV2aWNlcyB0bwotaW5qZWN0IGludGVycnVwdHMgdG8gdGhlIFZHSUMgaW5zdGVhZCBvZiBkaXJlY3RseSB0byBDUFVzLgorT25seSBvbmUgVkdJQyBpbnN0YW5jZSBtYXkgYmUgaW5zdGFudGlhdGVkIHRocm91Z2ggZWl0aGVyIHRoaXMgQVBJIG9yIHRoZQorbGVnYWN5IEtWTV9DUkVBVEVfSVJRQ0hJUCBBUEkuICBUaGUgY3JlYXRlZCBWR0lDIHdpbGwgYWN0IGFzIHRoZSBWTSBpbnRlcnJ1cHQKK2NvbnRyb2xsZXIsIHJlcXVpcmluZyBlbXVsYXRlZCB1c2VyLXNwYWNlIGRldmljZXMgdG8gaW5qZWN0IGludGVycnVwdHMgdG8gdGhlCitWR0lDIGluc3RlYWQgb2YgZGlyZWN0bHkgdG8gQ1BVcy4KIAotQ3JlYXRpbmcgYSBndWVzdCBHSUN2MyBkZXZpY2UgcmVxdWlyZXMgYSBob3N0IEdJQ3YzIGFzIHdlbGwuCi1HSUN2MyBpbXBsZW1lbnRhdGlvbnMgd2l0aCBoYXJkd2FyZSBjb21wYXRpYmlsaXR5IHN1cHBvcnQgYWxsb3cgYSBndWVzdCBHSUN2MgotYXMgd2VsbC4KK0dJQ3YzIGltcGxlbWVudGF0aW9ucyB3aXRoIGhhcmR3YXJlIGNvbXBhdGliaWxpdHkgc3VwcG9ydCBhbGxvdyBjcmVhdGluZyBhCitndWVzdCBHSUN2MiB0aHJvdWdoIHRoaXMgaW50ZXJmYWNlLiAgRm9yIGluZm9ybWF0aW9uIG9uIGNyZWF0aW5nIGEgZ3Vlc3QgR0lDdjMKK2RldmljZSBhbmQgZ3Vlc3QgSVRTIGRldmljZXMsIHNlZSBhcm0tdmdpYy12My50eHQuICBJdCBpcyBub3QgcG9zc2libGUgdG8KK2NyZWF0ZSBib3RoIGEgR0lDdjMgYW5kIEdJQ3YyIGRldmljZSBvbiB0aGUgc2FtZSBWTS4KIAotQ3JlYXRpbmcgYSB2aXJ0dWFsIElUUyBjb250cm9sbGVyIHJlcXVpcmVzIGEgaG9zdCBHSUN2MyAoYnV0IGRvZXMgbm90IGRlcGVuZAotb24gaGF2aW5nIHBoeXNpY2FsIElUUyBjb250cm9sbGVycykuCi1UaGVyZSBjYW4gYmUgbXVsdGlwbGUgSVRTIGNvbnRyb2xsZXJzIHBlciBndWVzdCwgZWFjaCBvZiB0aGVtIGhhcyB0byBoYXZlCi1hIHNlcGFyYXRlLCBub24tb3ZlcmxhcHBpbmcgTU1JTyByZWdpb24uCiAKIEdyb3VwczoKICAgS1ZNX0RFVl9BUk1fVkdJQ19HUlBfQUREUgpAQCAtMzIsMjYgKzI3LDEzIEBACiAgICAgICBCYXNlIGFkZHJlc3MgaW4gdGhlIGd1ZXN0IHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIEdJQyB2aXJ0dWFsIGNwdQogICAgICAgaW50ZXJmYWNlIHJlZ2lzdGVyIG1hcHBpbmdzLiBPbmx5IHZhbGlkIGZvciBLVk1fREVWX1RZUEVfQVJNX1ZHSUNfVjIuCiAgICAgICBUaGlzIGFkZHJlc3MgbmVlZHMgdG8gYmUgNEsgYWxpZ25lZCBhbmQgdGhlIHJlZ2lvbiBjb3ZlcnMgNCBLQnl0ZS4KLQotICAgIEtWTV9WR0lDX1YzX0FERFJfVFlQRV9ESVNUIChydywgNjQtYml0KQotICAgICAgQmFzZSBhZGRyZXNzIGluIHRoZSBndWVzdCBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlIG9mIHRoZSBHSUN2MyBkaXN0cmlidXRvcgotICAgICAgcmVnaXN0ZXIgbWFwcGluZ3MuIE9ubHkgdmFsaWQgZm9yIEtWTV9ERVZfVFlQRV9BUk1fVkdJQ19WMy4KLSAgICAgIFRoaXMgYWRkcmVzcyBuZWVkcyB0byBiZSA2NEsgYWxpZ25lZCBhbmQgdGhlIHJlZ2lvbiBjb3ZlcnMgNjQgS0J5dGUuCi0KLSAgICBLVk1fVkdJQ19WM19BRERSX1RZUEVfUkVESVNUIChydywgNjQtYml0KQotICAgICAgQmFzZSBhZGRyZXNzIGluIHRoZSBndWVzdCBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlIG9mIHRoZSBHSUN2MwotICAgICAgcmVkaXN0cmlidXRvciByZWdpc3RlciBtYXBwaW5ncy4gVGhlcmUgYXJlIHR3byA2NEsgcGFnZXMgZm9yIGVhY2gKLSAgICAgIFZDUFUgYW5kIGFsbCBvZiB0aGUgcmVkaXN0cmlidXRvciBwYWdlcyBhcmUgY29udGlndW91cy4KLSAgICAgIE9ubHkgdmFsaWQgZm9yIEtWTV9ERVZfVFlQRV9BUk1fVkdJQ19WMy4KLSAgICAgIFRoaXMgYWRkcmVzcyBuZWVkcyB0byBiZSA2NEsgYWxpZ25lZC4KLQotICAgIEtWTV9WR0lDX1YzX0FERFJfVFlQRV9JVFMgKHJ3LCA2NC1iaXQpCi0gICAgICBCYXNlIGFkZHJlc3MgaW4gdGhlIGd1ZXN0IHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIEdJQ3YzIElUUwotICAgICAgY29udHJvbCByZWdpc3RlciBmcmFtZS4gVGhlIElUUyBhbGxvd3MgTVNJKC1YKSBpbnRlcnJ1cHRzIHRvIGJlCi0gICAgICBpbmplY3RlZCBpbnRvIGd1ZXN0cy4gVGhpcyBleHRlbnNpb24gaXMgb3B0aW9uYWwuIElmIHRoZSBrZXJuZWwKLSAgICAgIGRvZXMgbm90IHN1cHBvcnQgdGhlIElUUywgdGhlIGNhbGwgcmV0dXJucyAtRU5PREVWLgotICAgICAgT25seSB2YWxpZCBmb3IgS1ZNX0RFVl9UWVBFX0FSTV9WR0lDX0lUUy4KLSAgICAgIFRoaXMgYWRkcmVzcyBuZWVkcyB0byBiZSA2NEsgYWxpZ25lZCBhbmQgdGhlIHJlZ2lvbiBjb3ZlcnMgMTI4Sy4KKyAgRXJyb3JzOgorICAgIC1FMkJJRzogIEFkZHJlc3Mgb3V0c2lkZSBvZiBhZGRyZXNzYWJsZSBJUEEgcmFuZ2UKKyAgICAtRUlOVkFMOiBJbmNvcnJlY3RseSBhbGlnbmVkIGFkZHJlc3MKKyAgICAtRUVYSVNUOiBBZGRyZXNzIGFscmVhZHkgY29uZmlndXJlZAorICAgIC1FTlhJTzogIFRoZSBncm91cCBvciBhdHRyaWJ1dGUgaXMgdW5rbm93bi91bnN1cHBvcnRlZCBmb3IgdGhpcyBkZXZpY2UKKyAgICAgICAgICAgICBvciBoYXJkd2FyZSBzdXBwb3J0IGlzIG1pc3NpbmcuCisgICAgLUVGQVVMVDogSW52YWxpZCB1c2VyIHBvaW50ZXIgZm9yIGF0dHItPmFkZHIuCiAKICAgS1ZNX0RFVl9BUk1fVkdJQ19HUlBfRElTVF9SRUdTCiAgIEF0dHJpYnV0ZXM6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwva3ZtL2RldmljZXMvdmNwdS50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwva3ZtL2RldmljZXMvdmNwdS50eHQKaW5kZXggYzA0MTY1OC4uMDJmNTA2OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9kZXZpY2VzL3ZjcHUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vZGV2aWNlcy92Y3B1LnR4dApAQCAtMzAsNCArMzAsNiBAQAogICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUKICAgICAgICAgIC1FQlVTWTogUE1VdjMgYWxyZWFkeSBpbml0aWFsaXplZAogCi1SZXF1ZXN0IHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgUE1VdjMuCitSZXF1ZXN0IHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgUE1VdjMuICBUaGlzIG11c3QgYmUgZG9uZSBhZnRlciBjcmVhdGluZyB0aGUKK2luLWtlcm5lbCBpcnFjaGlwLiAgQ3JlYXRpbmcgYSBQTVUgd2l0aCBhIHVzZXJzcGFjZSBpcnFjaGlwIGlzIGN1cnJlbnRseSBub3QKK3N1cHBvcnRlZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdm1lX2FwaS50eHQgYi9Eb2N1bWVudGF0aW9uL3ZtZV9hcGkudHh0CmluZGV4IGNhNWI4MjcuLjkwMDA2NTUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdm1lX2FwaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92bWVfYXBpLnR4dApAQCAtOCwxMyArOCwxNCBAQAogd2l0aCB0aGUgVk1FIHN1YnN5c3RlbSwgdHlwaWNhbGx5IGNhbGxlZCBmcm9tIHRoZSBkZXZpY2VzIGluaXQgcm91dGluZS4gIFRoaXMgaXMKIGFjaGlldmVkIHZpYSBhIGNhbGwgdG8gdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoKIAotCWludCB2bWVfcmVnaXN0ZXJfZHJpdmVyIChzdHJ1Y3Qgdm1lX2RyaXZlciAqZHJpdmVyKTsKKwlpbnQgdm1lX3JlZ2lzdGVyX2RyaXZlciAoc3RydWN0IHZtZV9kcml2ZXIgKmRyaXZlciwgdW5zaWduZWQgaW50IG5kZXZzKTsKIAogSWYgZHJpdmVyIHJlZ2lzdHJhdGlvbiBpcyBzdWNjZXNzZnVsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvLCBpZiBhbiBlcnJvcgogb2NjdXJyZWQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIHdpbGwgYmUgcmV0dXJuZWQuCiAKIEEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSBvZiB0eXBlICd2bWVfZHJpdmVyJyBtdXN0IGJlIHByb3ZpZGVkIHRvIHRoZQotcmVnaXN0cmF0aW9uIGZ1bmN0aW9uLiBUaGUgc3RydWN0dXJlIGlzIGFzIGZvbGxvd3M6CityZWdpc3RyYXRpb24gZnVuY3Rpb24uIEFsb25nIHdpdGggbmRldnMsIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgZGV2aWNlcyB5b3VyCitkcml2ZXIgaXMgYWJsZSB0byBzdXBwb3J0LiBUaGUgc3RydWN0dXJlIGlzIGFzIGZvbGxvd3M6CiAKIAlzdHJ1Y3Qgdm1lX2RyaXZlciB7CiAJCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKQEAgLTMyLDggKzMzLDggQEAKIHNob3VsZCBiZSBjb3JyZWN0bHkgc2V0LiBUaGUgJy5uYW1lJyBlbGVtZW50IGlzIGEgcG9pbnRlciB0byBhIHN0cmluZyBob2xkaW5nCiB0aGUgZGV2aWNlIGRyaXZlcidzIG5hbWUuCiAKLVRoZSAnLm1hdGNoJyBmdW5jdGlvbiBhbGxvd3MgY29udHJvbGxpbmcgdGhlIG51bWJlciBvZiBkZXZpY2VzIHRoYXQgbmVlZCB0bwotYmUgcmVnaXN0ZXJlZC4gVGhlIG1hdGNoIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gMSBpZiBhIGRldmljZSBzaG91bGQgYmUKK1RoZSAnLm1hdGNoJyBmdW5jdGlvbiBhbGxvd3MgY29udHJvbCBvdmVyIHdoaWNoIFZNRSBkZXZpY2VzIHNob3VsZCBiZSByZWdpc3RlcmVkCit3aXRoIHRoZSBkcml2ZXIuIFRoZSBtYXRjaCBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIDEgaWYgYSBkZXZpY2Ugc2hvdWxkIGJlCiBwcm9iZWQgYW5kIDAgb3RoZXJ3aXNlLiBUaGlzIGV4YW1wbGUgbWF0Y2ggZnVuY3Rpb24gKGZyb20gdm1lX3VzZXIuYykgbGltaXRzCiB0aGUgbnVtYmVyIG9mIGRldmljZXMgcHJvYmVkIHRvIG9uZToKIApAQCAtMzg1LDEzICszODYsMTMgQEAKIGFkamFjZW50IGxvY2F0aW9uczoKIAogCWludCB2bWVfbG1fYXR0YWNoKHN0cnVjdCB2bWVfcmVzb3VyY2UgKnJlcywgaW50IG51bSwKLQkJdm9pZCAoKmNhbGxiYWNrKShpbnQpKTsKKwkJdm9pZCAoKmNhbGxiYWNrKSh2b2lkICopKTsKIAogCWludCB2bWVfbG1fZGV0YWNoKHN0cnVjdCB2bWVfcmVzb3VyY2UgKnJlcywgaW50IG51bSk7CiAKIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBkZWNsYXJlZCBhcyBmb2xsb3dzLgogCi0Jdm9pZCBjYWxsYmFjayhpbnQgbnVtKTsKKwl2b2lkIGNhbGxiYWNrKHZvaWQgKmRhdGEpOwogCiAKIFNsb3QgRGV0ZWN0aW9uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3g4Ni94ODZfNjQvbW0udHh0IGIvRG9jdW1lbnRhdGlvbi94ODYveDg2XzY0L21tLnR4dAppbmRleCA4YzdkZDU5NS4uNTcyNDA5MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi94ODYveDg2XzY0L21tLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3g4Ni94ODZfNjQvbW0udHh0CkBAIC0xMiwxMyArMTIsMTMgQEAKIGZmZmZlOTAwMDAwMDAwMDAgLSBmZmZmZTlmZmZmZmZmZmZmICg9NDAgYml0cykgaG9sZQogZmZmZmVhMDAwMDAwMDAwMCAtIGZmZmZlYWZmZmZmZmZmZmYgKD00MCBiaXRzKSB2aXJ0dWFsIG1lbW9yeSBtYXAgKDFUQikKIC4uLiB1bnVzZWQgaG9sZSAuLi4KLWZmZmZlYzAwMDAwMDAwMDAgLSBmZmZmZmMwMDAwMDAwMDAwICg9NDQgYml0cykga2FzYW4gc2hhZG93IG1lbW9yeSAoMTZUQikKK2ZmZmZlYzAwMDAwMDAwMDAgLSBmZmZmZmJmZmZmZmZmZmZmICg9NDQgYml0cykga2FzYW4gc2hhZG93IG1lbW9yeSAoMTZUQikKIC4uLiB1bnVzZWQgaG9sZSAuLi4KIGZmZmZmZjAwMDAwMDAwMDAgLSBmZmZmZmY3ZmZmZmZmZmZmICg9MzkgYml0cykgJWVzcCBmaXh1cCBzdGFja3MKIC4uLiB1bnVzZWQgaG9sZSAuLi4KLWZmZmZmZmVmMDAwMDAwMDAgLSBmZmZmZmZmZjAwMDAwMDAwICg9NjQgR0IpIEVGSSByZWdpb24gbWFwcGluZyBzcGFjZQorZmZmZmZmZWYwMDAwMDAwMCAtIGZmZmZmZmZlZmZmZmZmZmYgKD02NCBHQikgRUZJIHJlZ2lvbiBtYXBwaW5nIHNwYWNlCiAuLi4gdW51c2VkIGhvbGUgLi4uCi1mZmZmZmZmZjgwMDAwMDAwIC0gZmZmZmZmZmZhMDAwMDAwMCAoPTUxMiBNQikgIGtlcm5lbCB0ZXh0IG1hcHBpbmcsIGZyb20gcGh5cyAwCitmZmZmZmZmZjgwMDAwMDAwIC0gZmZmZmZmZmY5ZmZmZmZmZiAoPTUxMiBNQikgIGtlcm5lbCB0ZXh0IG1hcHBpbmcsIGZyb20gcGh5cyAwCiBmZmZmZmZmZmEwMDAwMDAwIC0gZmZmZmZmZmZmZjVmZmZmZiAoPTE1MjYgTUIpIG1vZHVsZSBtYXBwaW5nIHNwYWNlCiBmZmZmZmZmZmZmNjAwMDAwIC0gZmZmZmZmZmZmZmRmZmZmZiAoPTggTUIpIHZzeXNjYWxscwogZmZmZmZmZmZmZmUwMDAwMCAtIGZmZmZmZmZmZmZmZmZmZmYgKD0yIE1CKSB1bnVzZWQgaG9sZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi94dGVuc2EvbW11LnR4dCBiL0RvY3VtZW50YXRpb24veHRlbnNhL21tdS50eHQKaW5kZXggMDMxMmZlNi4uMjIyYTJjNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi94dGVuc2EvbW11LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3h0ZW5zYS9tbXUudHh0CkBAIC0zLDE1ICszLDggQEAKIFRoZSBjb2RlIGluIHRoZSBpbml0aWFsaXplX21tdSBtYWNybyBzZXRzIHVwIE1NVXYzIG1lbW9yeSBtYXBwaW5nCiBpZGVudGljYWxseSB0byBNTVV2MiBmaXhlZCBtZW1vcnkgbWFwcGluZy4gRGVwZW5kaW5nIG9uCiBDT05GSUdfSU5JVElBTElaRV9YVEVOU0FfTU1VX0lOU0lERV9WTUxJTlVYIHN5bWJvbCB0aGlzIGNvZGUgaXMKLWxvY2F0ZWQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgYWRkcmVzcyByYW5nZXM6Ci0KLSAgICAweEYwMDAwMDAwLi4weEZGRkZGRkZGICh3aWxsIGtlZXAgc2FtZSBhZGRyZXNzIGluIE1NVSB2MiBsYXlvdXQ7Ci0gICAgCQkJIHR5cGljYWxseSBST00pCi0gICAgMHgwMDAwMDAwMC4uMHgwN0ZGRkZGRiAoc3lzdGVtIFJBTTsgdGhpcyBjb2RlIGlzIGFjdHVhbGx5IGxpbmtlZAotICAgIAkJCSBhdCAweEQwMDAwMDAwLi4weEQ3RkZGRkZGIFtjYWNoZWRdCi0gICAgCQkJIG9yIDB4RDgwMDAwMDAuLjB4REZGRkZGRkYgW3VuY2FjaGVkXTsKLSAgICAJCQkgaW4gYW55IGNhc2UsIGluaXRpYWxseSBydW5zIGVsc2V3aGVyZQotICAgIAkJCSB0aGFuIGxpbmtlZCwgc28gaGF2ZSB0byBiZSBjYXJlZnVsKQorbG9jYXRlZCBpbiBhZGRyZXNzZXMgaXQgd2FzIGxpbmtlZCBmb3IgKHN5bWJvbCB1bmRlZmluZWQpLCBvciBub3QKKyhzeW1ib2wgZGVmaW5lZCksIHNvIGl0IG5lZWRzIHRvIGJlIHBvc2l0aW9uLWluZGVwZW5kZW50LgogCiBUaGUgY29kZSBoYXMgdGhlIGZvbGxvd2luZyBhc3N1bXB0aW9uczoKICAgVGhpcyBjb2RlIGZyYWdtZW50IGlzIHJ1biBvbmx5IG9uIGFuIE1NVSB2My4KQEAgLTI4LDI0ICsyMSwyNiBAQAogICAgIFBBID0gcGh5c2ljYWwgYWRkcmVzcyAodHdvIHVwcGVyIG5pYmJsZXMgb2YgaXQpOwogICAgIHBjID0gcGh5c2ljYWwgcmFuZ2UgdGhhdCBjb250YWlucyB0aGlzIGNvZGU7CiAKLUFmdGVyIHN0ZXAgMiwgd2UganVtcCB0byB2aXJ0dWFsIGFkZHJlc3MgaW4gMHg0MDAwMDAwMC4uMHg1ZmZmZmZmZgotdGhhdCBjb3JyZXNwb25kcyB0byBuZXh0IGluc3RydWN0aW9uIHRvIGV4ZWN1dGUgaW4gdGhpcyBjb2RlLgotQWZ0ZXIgc3RlcCA0LCB3ZSBqdW1wIHRvIGludGVuZGVkIChsaW5rZWQpIGFkZHJlc3Mgb2YgdGhpcyBjb2RlLgorQWZ0ZXIgc3RlcCAyLCB3ZSBqdW1wIHRvIHZpcnR1YWwgYWRkcmVzcyBpbiB0aGUgcmFuZ2UgMHg0MDAwMDAwMC4uMHg1ZmZmZmZmZgorb3IgMHgwMDAwMDAwMC4uMHgxZmZmZmZmZiwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGtlcm5lbCB3YXMgbG9hZGVkIGJlbG93CisweDQwMDAwMDAwIG9yIGFib3ZlLiBUaGF0IGFkZHJlc3MgY29ycmVzcG9uZHMgdG8gbmV4dCBpbnN0cnVjdGlvbiB0byBleGVjdXRlCitpbiB0aGlzIGNvZGUuIEFmdGVyIHN0ZXAgNCwgd2UganVtcCB0byBpbnRlbmRlZCAobGlua2VkKSBhZGRyZXNzIG9mIHRoaXMgY29kZS4KK1RoZSBzY2hlbWUgYmVsb3cgYXNzdW1lcyB0aGF0IHRoZSBrZXJuZWwgaXMgbG9hZGVkIGJlbG93IDB4NDAwMDAwMDAuCiAKLSAgICBTdGVwIDAgICAgIFN0ZXAxICAgICBTdGVwIDIgICAgIFN0ZXAzICAgICBTdGVwIDQgICAgIFN0ZXA1Ci0gPT09PT09PT09PT09ICA9PT09PSAgPT09PT09PT09PT09ICA9PT09PSAgPT09PT09PT09PT09ICA9PT09PQotICAgVkEgICAgICBQQSAgICAgUEEgICAgVkEgICAgICBQQSAgICAgUEEgICAgVkEgICAgICBQQSAgICAgUEEKLSAtLS0tLS0gICAgLS0gICAgIC0tICAtLS0tLS0gICAgLS0gICAgIC0tICAtLS0tLS0gICAgLS0gICAgIC0tCi0gRTAuLkZGIC0+IEUwICAtPiBFMCAgRTAuLkZGIC0+IEUwICAgICAgICAgRjAuLkZGIC0+IEYwICAtPiBGMAotIEMwLi5ERiAtPiBDMCAgLT4gQzAgIEMwLi5ERiAtPiBDMCAgICAgICAgIEUwLi5FRiAtPiBGMCAgLT4gRjAKLSBBMC4uQkYgLT4gQTAgIC0+IEEwICBBMC4uQkYgLT4gQTAgICAgICAgICBEOC4uREYgLT4gMDAgIC0+IDAwCi0gODAuLjlGIC0+IDgwICAtPiA4MCAgODAuLjlGIC0+IDgwICAgICAgICAgRDAuLkQ3IC0+IDAwICAtPiAwMAotIDYwLi43RiAtPiA2MCAgLT4gNjAgIDYwLi43RiAtPiA2MAotIDQwLi41RiAtPiA0MCAgICAgICAgIDQwLi41RiAtPiBwYyAgLT4gcGMgIDQwLi41RiAtPiBwYwotIDIwLi4zRiAtPiAyMCAgLT4gMjAgIDIwLi4zRiAtPiAyMAotIDAwLi4xRiAtPiAwMCAgLT4gMDAgIDAwLi4xRiAtPiAwMAorICAgICAgICBTdGVwMCAgU3RlcDEgIFN0ZXAyICBTdGVwMyAgICAgICAgICBTdGVwNCAgU3RlcDUKKyAgICAgICAgPT09PT0gID09PT09ICA9PT09PSAgPT09PT0gICAgICAgICAgPT09PT0gID09PT09CisgICBWQSAgICAgIFBBICAgICBQQSAgICAgUEEgICAgIFBBICAgICBWQSAgICAgIFBBICAgICBQQQorIC0tLS0tLSAgICAtLSAgICAgLS0gICAgIC0tICAgICAtLSAgIC0tLS0tLSAgICAtLSAgICAgLS0KKyBFMC4uRkYgLT4gRTAgIC0+IEUwICAtPiBFMCAgICAgICAgICBGMC4uRkYgLT4gRjAgIC0+IEYwCisgQzAuLkRGIC0+IEMwICAtPiBDMCAgLT4gQzAgICAgICAgICAgRTAuLkVGIC0+IEYwICAtPiBGMAorIEEwLi5CRiAtPiBBMCAgLT4gQTAgIC0+IEEwICAgICAgICAgIEQ4Li5ERiAtPiAwMCAgLT4gMDAKKyA4MC4uOUYgLT4gODAgIC0+IDgwICAtPiA4MCAgICAgICAgICBEMC4uRDcgLT4gMDAgIC0+IDAwCisgNjAuLjdGIC0+IDYwICAtPiA2MCAgLT4gNjAKKyA0MC4uNUYgLT4gNDAgICAgICAgICAtPiBwYyAgLT4gcGMgICA0MC4uNUYgLT4gcGMKKyAyMC4uM0YgLT4gMjAgIC0+IDIwICAtPiAyMAorIDAwLi4xRiAtPiAwMCAgLT4gMDAgIC0+IDAwCiAKLVRoZSBkZWZhdWx0IGxvY2F0aW9uIG9mIElPIHBlcmlwaGVyYWxzIGlzIGFib3ZlIDB4ZjAwMDAwMDAuIFRoaXMgbWF5IGNoYW5nZQorVGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgSU8gcGVyaXBoZXJhbHMgaXMgYWJvdmUgMHhmMDAwMDAwMC4gVGhpcyBtYXkgYmUgY2hhbmdlZAogdXNpbmcgYSAicmFuZ2VzIiBwcm9wZXJ0eSBpbiBhIGRldmljZSB0cmVlIHNpbXBsZS1idXMgbm9kZS4gU2VlIGVQQVBSIDEuMSwgwqc2LjUKIGZvciBkZXRhaWxzIG9uIHRoZSBzeW50YXggYW5kIHNlbWFudGljIG9mIHNpbXBsZS1idXMgbm9kZXMuIFRoZSBmb2xsb3dpbmcKIGxpbWl0YXRpb25zIGFwcGx5OgpAQCAtNjIsMyArNTcsMTI3IEBACiAKIDYuIFRoZSBJTyBhcmVhIGNvdmVycyB0aGUgZW50aXJlIDI1Nk1CIHNlZ21lbnQgb2YgcGFyZW50LWJ1cy1hZGRyZXNzOyB0aGUKICAgICJyYW5nZXMiIHRyaXBsZXQgbGVuZ3RoIGZpZWxkIGlzIGlnbm9yZWQKKworCitNTVV2MyBhZGRyZXNzIHNwYWNlIGxheW91dHMuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0RlZmF1bHQgTU1VdjItY29tcGF0aWJsZSBsYXlvdXQuCisKKyAgICAgICAgICAgICAgICAgICAgICBTeW1ib2wgICAgICAgICAgICAgICAgICAgVkFERFIgICAgICAgU2l6ZQorKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgVXNlcnNwYWNlICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMCAgVEFTS19TSVpFCisrLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKystLS0tLS0tLS0tLS0tLS0tLS0rCit8IFBhZ2UgdGFibGUgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKystLS0tLS0tLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDQwMDAwMAorKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgS01BUCBhcmVhICAgICAgICB8ICBQS01BUF9CQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgUFRSU19QRVJfUFRFICoKK3wgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRENBQ0hFX05fQ09MT1JTICoKK3wgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRV9TSVpFCit8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0TUIgKiBEQ0FDSEVfTl9DT0xPUlMpCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBBdG9taWMgS01BUCBhcmVhIHwgIEZJWEFERFJfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICBLTV9UWVBFX05SICoKK3wgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlJfQ1BVUyAqCit8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDQUNIRV9OX0NPTE9SUyAqCit8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0VfU0laRQorKy0tLS0tLS0tLS0tLS0tLS0tLSsgIEZJWEFERFJfVE9QICAgICAgICAgICAgICAweGJmZmZmMDAwCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBWTUFMTE9DIGFyZWEgICAgIHwgIFZNQUxMT0NfU1RBUlQgICAgICAgICAgICAweGMwMDAwMDAwICAxMjhNQiAtIDY0S0IKKystLS0tLS0tLS0tLS0tLS0tLS0rICBWTUFMTE9DX0VORAorfCBDYWNoZSBhbGlhc2luZyAgIHwgIFRMQlRFTVBfQkFTRV8xICAgICAgICAgICAweGM3ZmYwMDAwICBEQ0FDSEVfV0FZX1NJWkUKK3wgcmVtYXAgYXJlYSAxICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBDYWNoZSBhbGlhc2luZyAgIHwgIFRMQlRFTVBfQkFTRV8yICAgICAgICAgICAgICAgICAgICAgICBEQ0FDSEVfV0FZX1NJWkUKK3wgcmVtYXAgYXJlYSAyICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tKworKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgQ2FjaGVkIEtTRUcgICAgICB8ICBYQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUiAgMHhkMDAwMDAwMCAgMTI4TUIKKystLS0tLS0tLS0tLS0tLS0tLS0rCit8IFVuY2FjaGVkIEtTRUcgICAgfCAgWENIQUxfS1NFR19CWVBBU1NfVkFERFIgIDB4ZDgwMDAwMDAgIDEyOE1CCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBDYWNoZWQgS0lPICAgICAgIHwgIFhDSEFMX0tJT19DQUNIRURfVkFERFIgICAweGUwMDAwMDAwICAyNTZNQgorKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgVW5jYWNoZWQgS0lPICAgICB8ICBYQ0hBTF9LSU9fQllQQVNTX1ZBRERSICAgMHhmMDAwMDAwMCAgMjU2TUIKKystLS0tLS0tLS0tLS0tLS0tLS0rCisKKworMjU2TUIgY2FjaGVkICsgMjU2TUIgdW5jYWNoZWQgbGF5b3V0LgorCisgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sICAgICAgICAgICAgICAgICAgIFZBRERSICAgICAgIFNpemUKKystLS0tLS0tLS0tLS0tLS0tLS0rCit8IFVzZXJzcGFjZSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAgIFRBU0tfU0laRQorKy0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBQYWdlIHRhYmxlICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisrLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA0MDAwMDAKKystLS0tLS0tLS0tLS0tLS0tLS0rCit8IEtNQVAgYXJlYSAgICAgICAgfCAgUEtNQVBfQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUUlNfUEVSX1BURSAqCit8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDQUNIRV9OX0NPTE9SUyAqCit8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0VfU0laRQorfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNE1CICogRENBQ0hFX05fQ09MT1JTKQorKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgQXRvbWljIEtNQVAgYXJlYSB8ICBGSVhBRERSX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgS01fVFlQRV9OUiAqCit8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5SX0NQVVMgKgorfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQ0FDSEVfTl9DT0xPUlMgKgorfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFX1NJWkUKKystLS0tLS0tLS0tLS0tLS0tLS0rICBGSVhBRERSX1RPUCAgICAgICAgICAgICAgMHg5ZmZmZjAwMAorKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgVk1BTExPQyBhcmVhICAgICB8ICBWTUFMTE9DX1NUQVJUICAgICAgICAgICAgMHhhMDAwMDAwMCAgMTI4TUIgLSA2NEtCCisrLS0tLS0tLS0tLS0tLS0tLS0tKyAgVk1BTExPQ19FTkQKK3wgQ2FjaGUgYWxpYXNpbmcgICB8ICBUTEJURU1QX0JBU0VfMSAgICAgICAgICAgMHhhN2ZmMDAwMCAgRENBQ0hFX1dBWV9TSVpFCit8IHJlbWFwIGFyZWEgMSAgICAgfAorKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgQ2FjaGUgYWxpYXNpbmcgICB8ICBUTEJURU1QX0JBU0VfMiAgICAgICAgICAgICAgICAgICAgICAgRENBQ0hFX1dBWV9TSVpFCit8IHJlbWFwIGFyZWEgMiAgICAgfAorKy0tLS0tLS0tLS0tLS0tLS0tLSsKKystLS0tLS0tLS0tLS0tLS0tLS0rCit8IENhY2hlZCBLU0VHICAgICAgfCAgWENIQUxfS1NFR19DQUNIRURfVkFERFIgIDB4YjAwMDAwMDAgIDI1Nk1CCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBVbmNhY2hlZCBLU0VHICAgIHwgIFhDSEFMX0tTRUdfQllQQVNTX1ZBRERSICAweGMwMDAwMDAwICAyNTZNQgorKy0tLS0tLS0tLS0tLS0tLS0tLSsKKystLS0tLS0tLS0tLS0tLS0tLS0rCit8IENhY2hlZCBLSU8gICAgICAgfCAgWENIQUxfS0lPX0NBQ0hFRF9WQUREUiAgIDB4ZTAwMDAwMDAgIDI1Nk1CCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBVbmNhY2hlZCBLSU8gICAgIHwgIFhDSEFMX0tJT19CWVBBU1NfVkFERFIgICAweGYwMDAwMDAwICAyNTZNQgorKy0tLS0tLS0tLS0tLS0tLS0tLSsKKworCis1MTJNQiBjYWNoZWQgKyA1MTJNQiB1bmNhY2hlZCBsYXlvdXQuCisKKyAgICAgICAgICAgICAgICAgICAgICBTeW1ib2wgICAgICAgICAgICAgICAgICAgVkFERFIgICAgICAgU2l6ZQorKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgVXNlcnNwYWNlICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMCAgVEFTS19TSVpFCisrLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKystLS0tLS0tLS0tLS0tLS0tLS0rCit8IFBhZ2UgdGFibGUgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKystLS0tLS0tLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDQwMDAwMAorKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgS01BUCBhcmVhICAgICAgICB8ICBQS01BUF9CQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgUFRSU19QRVJfUFRFICoKK3wgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRENBQ0hFX05fQ09MT1JTICoKK3wgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRV9TSVpFCit8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0TUIgKiBEQ0FDSEVfTl9DT0xPUlMpCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBBdG9taWMgS01BUCBhcmVhIHwgIEZJWEFERFJfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICBLTV9UWVBFX05SICoKK3wgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlJfQ1BVUyAqCit8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDQUNIRV9OX0NPTE9SUyAqCit8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0VfU0laRQorKy0tLS0tLS0tLS0tLS0tLS0tLSsgIEZJWEFERFJfVE9QICAgICAgICAgICAgICAweDhmZmZmMDAwCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBWTUFMTE9DIGFyZWEgICAgIHwgIFZNQUxMT0NfU1RBUlQgICAgICAgICAgICAweDkwMDAwMDAwICAxMjhNQiAtIDY0S0IKKystLS0tLS0tLS0tLS0tLS0tLS0rICBWTUFMTE9DX0VORAorfCBDYWNoZSBhbGlhc2luZyAgIHwgIFRMQlRFTVBfQkFTRV8xICAgICAgICAgICAweDk3ZmYwMDAwICBEQ0FDSEVfV0FZX1NJWkUKK3wgcmVtYXAgYXJlYSAxICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBDYWNoZSBhbGlhc2luZyAgIHwgIFRMQlRFTVBfQkFTRV8yICAgICAgICAgICAgICAgICAgICAgICBEQ0FDSEVfV0FZX1NJWkUKK3wgcmVtYXAgYXJlYSAyICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tKworKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgQ2FjaGVkIEtTRUcgICAgICB8ICBYQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUiAgMHhhMDAwMDAwMCAgNTEyTUIKKystLS0tLS0tLS0tLS0tLS0tLS0rCit8IFVuY2FjaGVkIEtTRUcgICAgfCAgWENIQUxfS1NFR19CWVBBU1NfVkFERFIgIDB4YzAwMDAwMDAgIDUxMk1CCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBDYWNoZWQgS0lPICAgICAgIHwgIFhDSEFMX0tJT19DQUNIRURfVkFERFIgICAweGUwMDAwMDAwICAyNTZNQgorKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgVW5jYWNoZWQgS0lPICAgICB8ICBYQ0hBTF9LSU9fQllQQVNTX1ZBRERSICAgMHhmMDAwMDAwMCAgMjU2TUIKKystLS0tLS0tLS0tLS0tLS0tLS0rCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IDAyMmRhOGMuLjU4YzUyMDUgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCisrKyBiL01BSU5UQUlORVJTCkBAIC02MzYsNiArNjM2LDE1IEBACiBGOglpbmNsdWRlL2xpbnV4L2FsdGVyYV91YXJ0LmgKIEY6CWluY2x1ZGUvbGludXgvYWx0ZXJhX2p0YWd1YXJ0LmgKIAorQU1BWk9OIEVUSEVSTkVUIERSSVZFUlMKK006CU5ldGFuZWwgQmVsZ2F6YWwgPG5ldGFuZWxAYW5uYXB1cm5hbGFicy5jb20+CitSOglTYWVlZCBCaXNoYXJhIDxzYWVlZEBhbm5hcHVybmFsYWJzLmNvbT4KK1I6CVpvcmlrIE1hY2h1bHNreSA8em9yaWtAYW5uYXB1cm5hbGFicy5jb20+CitMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCitTOglTdXBwb3J0ZWQKK0Y6CURvY3VtZW50YXRpb24vbmV0d29ya2luZy9lbmEudHh0CitGOglkcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vCisKIEFNRCBDUllQVE9HUkFQSElDIENPUFJPQ0VTU09SIChDQ1ApIERSSVZFUgogTToJVG9tIExlbmRhY2t5IDx0aG9tYXMubGVuZGFja3lAYW1kLmNvbT4KIE06CUdhcnkgSG9vayA8Z2FyeS5ob29rQGFtZC5jb20+CkBAIC03OTgsNiArODA3LDcgQEAKIE06CVN1bWl0IFNlbXdhbCA8c3VtaXQuc2Vtd2FsQGxpbmFyby5vcmc+CiBMOglkZXZlbEBkcml2ZXJkZXYub3N1b3NsLm9yZwogUzoJU3VwcG9ydGVkCitGOglEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3RhZ2luZy9pb24vCiBGOglkcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24KIEY6CWRyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvaW9uLmgKIEY6CWRyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvaW9uX3Rlc3QuaApAQCAtODA5LDExICs4MTksMTEgQEAKIFM6CU1haW50YWluZWQKIEY6CXNvdW5kL2FvYS8KIAotQVBFWCBFTUJFRERFRCBTWVNURU1TIFNUWDEwNCBEQUMgRFJJVkVSCitBUEVYIEVNQkVEREVEIFNZU1RFTVMgU1RYMTA0IElJTyBEUklWRVIKIE06CVdpbGxpYW0gQnJlYXRoaXR0IEdyYXkgPHZpbGhlbG0uZ3JheUBnbWFpbC5jb20+CiBMOglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCi1GOglkcml2ZXJzL2lpby9kYWMvc3R4MTA0LmMKK0Y6CWRyaXZlcnMvaWlvL2FkYy9zdHgxMDQuYwogCiBBUE0gRFJJVkVSCiBNOglKaXJpIEtvc2luYSA8amlrb3NAa2VybmVsLm9yZz4KQEAgLTg4MSw2ICs4OTEsMTUgQEAKIEY6CWRyaXZlcnMvZ3B1L2RybS9hcmMvCiBGOglEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZGlzcGxheS9zbnBzLGFyY3BndS50eHQKIAorQVJNIEFSQ0hJVEVDVEVEIFRJTUVSIERSSVZFUgorTToJTWFyayBSdXRsYW5kIDxtYXJrLnJ1dGxhbmRAYXJtLmNvbT4KK006CU1hcmMgWnluZ2llciA8bWFyYy56eW5naWVyQGFybS5jb20+CitMOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQorUzoJTWFpbnRhaW5lZAorRjoJYXJjaC9hcm0vaW5jbHVkZS9hc20vYXJjaF90aW1lci5oCitGOglhcmNoL2FybTY0L2luY2x1ZGUvYXNtL2FyY2hfdGltZXIuaAorRjoJZHJpdmVycy9jbG9ja3NvdXJjZS9hcm1fYXJjaF90aW1lci5jCisKIEFSTSBIRExDRCBEUk0gRFJJVkVSCiBNOglMaXZpdSBEdWRhdSA8bGl2aXUuZHVkYXVAYXJtLmNvbT4KIFM6CVN1cHBvcnRlZApAQCAtOTAzLDE1ICs5MjIsMTcgQEAKIAogQVJNIFBNVSBQUk9GSUxJTkcgQU5EIERFQlVHR0lORwogTToJV2lsbCBEZWFjb24gPHdpbGwuZGVhY29uQGFybS5jb20+Ci1SOglNYXJrIFJ1dGxhbmQgPG1hcmsucnV0bGFuZEBhcm0uY29tPgorTToJTWFyayBSdXRsYW5kIDxtYXJrLnJ1dGxhbmRAYXJtLmNvbT4KIFM6CU1haW50YWluZWQKK0w6CWxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZyAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCiBGOglhcmNoL2FybSova2VybmVsL3BlcmZfKgogRjoJYXJjaC9hcm0vb3Byb2ZpbGUvY29tbW9uLmMKIEY6CWFyY2gvYXJtKi9rZXJuZWwvaHdfYnJlYWtwb2ludC5jCiBGOglhcmNoL2FybSovaW5jbHVkZS9hc20vaHdfYnJlYWtwb2ludC5oCiBGOglhcmNoL2FybSovaW5jbHVkZS9hc20vcGVyZl9ldmVudC5oCi1GOglkcml2ZXJzL3BlcmYvYXJtX3BtdS5jCitGOglkcml2ZXJzL3BlcmYvKgogRjoJaW5jbHVkZS9saW51eC9wZXJmL2FybV9wbXUuaAorRjoJRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9wbXUudHh0CiAKIEFSTSBQT1JUCiBNOglSdXNzZWxsIEtpbmcgPGxpbnV4QGFybWxpbnV4Lm9yZy51az4KQEAgLTExMTMsNiArMTEzNCwxMSBAQAogRjoJRG9jdW1lbnRhdGlvbi90cmFjZS9jb3Jlc2lnaHQudHh0CiBGOglEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2NvcmVzaWdodC50eHQKIEY6CURvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLWNvcmVzaWdodC1kZXZpY2VzLSoKK0Y6CXRvb2xzL3BlcmYvYXJjaC9hcm0vdXRpbC9wbXUuYworRjoJdG9vbHMvcGVyZi9hcmNoL2FybS91dGlsL2F1eHRyYWNlLmMKK0Y6CXRvb2xzL3BlcmYvYXJjaC9hcm0vdXRpbC9jcy1ldG0uYworRjoJdG9vbHMvcGVyZi9hcmNoL2FybS91dGlsL2NzLWV0bS5oCitGOgl0b29scy9wZXJmL3V0aWwvY3MtZXRtLmgKIAogQVJNL0NPUkdJIE1BQ0hJTkUgU1VQUE9SVAogTToJUmljaGFyZCBQdXJkaWUgPHJwdXJkaWVAcnBzeXMubmV0PgpAQCAtMTYxNCw3ICsxNjQwLDggQEAKIAogQVJNL1NBTVNVTkcgRVhZTk9TIEFSTSBBUkNISVRFQ1RVUkVTCiBNOglLdWtqaW4gS2ltIDxrZ2VuZUBrZXJuZWwub3JnPgotTToJS3J6eXN6dG9mIEtvemxvd3NraSA8ay5rb3psb3dza2lAc2Ftc3VuZy5jb20+CitNOglLcnp5c3p0b2YgS296bG93c2tpIDxrcnprQGtlcm5lbC5vcmc+CitSOglKYXZpZXIgTWFydGluZXogQ2FuaWxsYXMgPGphdmllckBvc2cuc2Ftc3VuZy5jb20+CiBMOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQogTDoJbGludXgtc2Ftc3VuZy1zb2NAdmdlci5rZXJuZWwub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKIFM6CU1haW50YWluZWQKQEAgLTE2MzQsNyArMTY2MSw2IEBACiBGOglkcml2ZXJzLyovKnM1cHYyMTAqCiBGOglkcml2ZXJzL21lbW9yeS9zYW1zdW5nLyoKIEY6CWRyaXZlcnMvc29jL3NhbXN1bmcvKgotRjoJZHJpdmVycy9zcGkvc3BpLXMzYyoKIEY6CURvY3VtZW50YXRpb24vYXJtL1NhbXN1bmcvCiBGOglEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL3NhbXN1bmcvCiBGOglEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3JhbS9zYW1zdW5nLXNyYW0udHh0CkBAIC0xODIyLDYgKzE4NDgsNyBAQAogQVJNL1VOSVBISUVSIEFSQ0hJVEVDVFVSRQogTToJTWFzYWhpcm8gWWFtYWRhIDx5YW1hZGEubWFzYWhpcm9Ac29jaW9uZXh0LmNvbT4KIEw6CWxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZyAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCitUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L21hc2FoaXJveS9saW51eC11bmlwaGllci5naXQKIFM6CU1haW50YWluZWQKIEY6CWFyY2gvYXJtL2Jvb3QvZHRzL3VuaXBoaWVyKgogRjoJYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvY2FjaGUtdW5pcGhpZXIuaApAQCAtMTgyOSw2ICsxODU2LDcgQEAKIEY6CWFyY2gvYXJtL21tL2NhY2hlLXVuaXBoaWVyLmMKIEY6CWFyY2gvYXJtNjQvYm9vdC9kdHMvc29jaW9uZXh0LwogRjoJZHJpdmVycy9idXMvdW5pcGhpZXItc3lzdGVtLWJ1cy5jCitGOglkcml2ZXJzL2Nsay91bmlwaGllci8KIEY6CWRyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdW5pcGhpZXIqCiBGOglkcml2ZXJzL3BpbmN0cmwvdW5pcGhpZXIvCiBGOglkcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX3VuaXBoaWVyLmMKQEAgLTE5NjUsNiArMTk5MywxMyBAQAogRjoJZHJpdmVycy9tZWRpYS9pMmMvYXMzNjQ1YS5jCiBGOglpbmNsdWRlL21lZGlhL2kyYy9hczM2NDVhLmgKIAorQVNBSEkgS0FTRUkgQUs4OTc0IERSSVZFUgorTToJTGludXMgV2FsbGVpaiA8bGludXMud2FsbGVpakBsaW5hcm8ub3JnPgorTDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworVzoJaHR0cDovL3d3dy5ha20uY29tLworUzoJU3VwcG9ydGVkCitGOglkcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvYWs4OTc0LmMKKwogQVNDNzYyMSBIQVJEV0FSRSBNT05JVE9SIERSSVZFUgogTToJR2VvcmdlIEpvc2VwaCA8Z2VvcmdlLmpvc2VwaEBmYWlydmlldzUuY29tPgogTDoJbGludXgtaHdtb25Admdlci5rZXJuZWwub3JnCkBAIC0yMTAzLDExICsyMTM4LDYgQEAKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvbW1jL2hvc3QvYXRtZWwtbWNpLmMKIAotQVRNRUwgQVQ5MSAvIEFUMzIgU0VSSUFMIERSSVZFUgotTToJTmljb2xhcyBGZXJyZSA8bmljb2xhcy5mZXJyZUBhdG1lbC5jb20+Ci1TOglTdXBwb3J0ZWQKLUY6CWRyaXZlcnMvdHR5L3NlcmlhbC9hdG1lbF9zZXJpYWwuYwotCiBBVE1FTCBBVDkxIFNBTUE1RDItQ29tcGF0aWJsZSBTaHV0ZG93biBDb250cm9sbGVyCiBNOglOaWNvbGFzIEZlcnJlIDxuaWNvbGFzLmZlcnJlQGF0bWVsLmNvbT4KIFM6CVN1cHBvcnRlZApAQCAtMjQ3NSw3ICsyNTA1LDcgQEAKIEJPTkRJTkcgRFJJVkVSCiBNOglKYXkgVm9zYnVyZ2ggPGoudm9zYnVyZ2hAZ21haWwuY29tPgogTToJVmVhY2VzbGF2IEZhbGljbyA8dmZhbGljb0BnbWFpbC5jb20+Ci1NOglBbmR5IEdvc3BvZGFyZWsgPGdvc3BvQGN1bXVsdXNuZXR3b3Jrcy5jb20+CitNOglBbmR5IEdvc3BvZGFyZWsgPGFuZHlAZ3JleWhvdXNlLm5ldD4KIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvYm9uZGluZy8KIFM6CVN1cHBvcnRlZApAQCAtMjQ5MCw3ICsyNTIwLDcgQEAKIEY6CWtlcm5lbC9icGYvCiAKIEJST0FEQ09NIEI0NCAxMC8xMDAgRVRIRVJORVQgRFJJVkVSCi1NOglHYXJ5IFphbWJyYW5vIDx6YW1icmFub0Bicm9hZGNvbS5jb20+CitNOglNaWNoYWVsIENoYW4gPG1pY2hhZWwuY2hhbkBicm9hZGNvbS5jb20+CiBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCiBTOglTdXBwb3J0ZWQKIEY6CWRyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2I0NC4qCkBAIC0zMTI1LDcgKzMxNTUsNyBAQAogVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tbWFyZWsva2J1aWxkLmdpdCBtaXNjCiBXOglodHRwOi8vY29jY2luZWxsZS5saXA2LmZyLwogUzoJU3VwcG9ydGVkCi1GOglEb2N1bWVudGF0aW9uL2NvY2NpbmVsbGUudHh0CitGOglEb2N1bWVudGF0aW9uL2Rldi10b29scy9jb2NjaW5lbGxlLnJzdAogRjoJc2NyaXB0cy9jb2NjaW5lbGxlLwogRjoJc2NyaXB0cy9jb2NjaWNoZWNrCiAKQEAgLTMxNTEsNiArMzE4MSw3IEBACiBNOglNaWNoYWVsIFR1cnF1ZXR0ZSA8bXR1cnF1ZXR0ZUBiYXlsaWJyZS5jb20+CiBNOglTdGVwaGVuIEJveWQgPHNib3lkQGNvZGVhdXJvcmEub3JnPgogTDoJbGludXgtY2xrQHZnZXIua2VybmVsLm9yZworUToJaHR0cDovL3BhdGNod29yay5rZXJuZWwub3JnL3Byb2plY3QvbGludXgtY2xrL2xpc3QvCiBUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2Nsay9saW51eC5naXQKIFM6CU1haW50YWluZWQKIEY6CURvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay8KQEAgLTMyMzgsNyArMzI2OSw3IEBACiBDT05UUk9MIEdST1VQIC0gTUVNT1JZIFJFU09VUkNFIENPTlRST0xMRVIgKE1FTUNHKQogTToJSm9oYW5uZXMgV2VpbmVyIDxoYW5uZXNAY21weGNoZy5vcmc+CiBNOglNaWNoYWwgSG9ja28gPG1ob2Nrb0BrZXJuZWwub3JnPgotTToJVmxhZGltaXIgRGF2eWRvdiA8dmRhdnlkb3ZAdmlydHVvenpvLmNvbT4KK006CVZsYWRpbWlyIERhdnlkb3YgPHZkYXZ5ZG92LmRldkBnbWFpbC5jb20+CiBMOgljZ3JvdXBzQHZnZXIua2VybmVsLm9yZwogTDoJbGludXgtbW1Aa3ZhY2sub3JnCiBTOglNYWludGFpbmVkCkBAIC0zMjU5LDcgKzMyOTAsNyBAQAogRjoJZHJpdmVycy9uZXQvd2FuL2Nvc2EqCiAKIENQTUFDIEVUSEVSTkVUIERSSVZFUgotTToJRmxvcmlhbiBGYWluZWxsaSA8ZmxvcmlhbkBvcGVud3J0Lm9yZz4KK006CUZsb3JpYW4gRmFpbmVsbGkgPGYuZmFpbmVsbGlAZ21haWwuY29tPgogTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvY3BtYWMuYwpAQCAtMzI3MSw2ICszMzAyLDcgQEAKIFM6CU1haW50YWluZWQKIFQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvcmFmYWVsL2xpbnV4LXBtLmdpdAogVDoJZ2l0IGdpdDovL2dpdC5saW5hcm8ub3JnL3Blb3BsZS92aXJlc2hrL2xpbnV4LmdpdCAoRm9yIEFSTSBVcGRhdGVzKQorRjoJRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS8KIEY6CWRyaXZlcnMvY3B1ZnJlcS8KIEY6CWluY2x1ZGUvbGludXgvY3B1ZnJlcS5oCiAKQEAgLTM3NTIsOCArMzc4NCw4IEBACiBGOglkcml2ZXJzL21mZC9kYTkwM3guYwogRjoJZHJpdmVycy9tZmQvZGE5MD8/LSouYwogRjoJZHJpdmVycy9tZmQvZGE5MT8/LSouYwotRjoJZHJpdmVycy9wb3dlci9kYTkwNTItYmF0dGVyeS5jCi1GOglkcml2ZXJzL3Bvd2VyL2RhOTE/Py0qLmMKK0Y6CWRyaXZlcnMvcG93ZXIvc3VwcGx5L2RhOTA1Mi1iYXR0ZXJ5LmMKK0Y6CWRyaXZlcnMvcG93ZXIvc3VwcGx5L2RhOTE/Py0qLmMKIEY6CWRyaXZlcnMvcmVndWxhdG9yL2RhOTAzeC5jCiBGOglkcml2ZXJzL3JlZ3VsYXRvci9kYTk/Pz8tcmVndWxhdG9yLltjaF0KIEY6CWRyaXZlcnMvcnRjL3J0Yy1kYTkwPz8uYwpAQCAtMzc2OSw2ICszODAxLDEyIEBACiBGOglpbmNsdWRlL3NvdW5kL2RhWzc5XSouaAogRjoJc291bmQvc29jL2NvZGVjcy9kYVs3OV0qLltjaF0KIAorRElBTU9ORCBTWVNURU1TIEdQSU8tTU0gR1BJTyBEUklWRVIKK006CVdpbGxpYW0gQnJlYXRoaXR0IEdyYXkgPHZpbGhlbG0uZ3JheUBnbWFpbC5jb20+CitMOglsaW51eC1ncGlvQHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy9ncGlvL2dwaW8tZ3Bpby1tbS5jCisKIERJR0kgTkVPIEFORCBDTEFTU0lDIFBDSSBQUk9EVUNUUwogTToJTGlkemEgTG91aW5hIDxsaWR6YS5sb3VpbmFAZ21haWwuY29tPgogTToJTWFyayBIb3Vuc2NoZWxsIDxtYXJraEBjb21wcm8ubmV0PgpAQCAtNDM5NCw3ICs0NDMyLDYgQEAKIEY6CWZzL2VjcnlwdGZzLwogCiBFREFDLUNPUkUKLU06CURvdWcgVGhvbXBzb24gPGRvdWd0aG9tcHNvbkB4bWlzc2lvbi5jb20+CiBNOglCb3Jpc2xhdiBQZXRrb3YgPGJwQGFsaWVuOC5kZT4KIE06CU1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBzLW9wZW5zb3VyY2UuY29tPgogTToJTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGtlcm5lbC5vcmc+CkBAIC00NDA3LDE0ICs0NDQ0LDEyIEBACiBGOglpbmNsdWRlL2xpbnV4L2VkYWMuaAogCiBFREFDLUFNRDY0Ci1NOglEb3VnIFRob21wc29uIDxkb3VndGhvbXBzb25AeG1pc3Npb24uY29tPgogTToJQm9yaXNsYXYgUGV0a292IDxicEBhbGllbjguZGU+CiBMOglsaW51eC1lZGFjQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy9lZGFjL2FtZDY0X2VkYWMqCiAKIEVEQUMtQ0FMWEVEQQotTToJRG91ZyBUaG9tcHNvbiA8ZG91Z3Rob21wc29uQHhtaXNzaW9uLmNvbT4KIE06CVJvYmVydCBSaWNodGVyIDxycmljQGtlcm5lbC5vcmc+CiBMOglsaW51eC1lZGFjQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZApAQCAtNDQzMCwxNyArNDQ2NSwyMSBAQAogCiBFREFDLUU3NTJYCiBNOglNYXJrIEdyb3NzIDxtYXJrLmdyb3NzQGludGVsLmNvbT4KLU06CURvdWcgVGhvbXBzb24gPGRvdWd0aG9tcHNvbkB4bWlzc2lvbi5jb20+CiBMOglsaW51eC1lZGFjQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy9lZGFjL2U3NTJ4X2VkYWMuYwogCiBFREFDLUU3WFhYCi1NOglEb3VnIFRob21wc29uIDxkb3VndGhvbXBzb25AeG1pc3Npb24uY29tPgogTDoJbGludXgtZWRhY0B2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvZWRhYy9lN3h4eF9lZGFjLmMKIAorRURBQy1GU0xfRERSCitNOglZb3JrIFN1biA8eW9yay5zdW5AbnhwLmNvbT4KK0w6CWxpbnV4LWVkYWNAdmdlci5rZXJuZWwub3JnCitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL2VkYWMvZnNsX2Rkcl9lZGFjLioKKwogRURBQy1HSEVTCiBNOglNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAcy1vcGVuc291cmNlLmNvbT4KIE06CU1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBrZXJuZWwub3JnPgpAQCAtNDQ1NSwxMyArNDQ5NCwxMSBAQAogRjoJZHJpdmVycy9lZGFjL2k4MjQ0M2J4Z3hfZWRhYy5jCiAKIEVEQUMtSTMwMDAKLU06CUphc29uIFVobGVua290dCA8anVobGVua29AYWthbWFpLmNvbT4KIEw6CWxpbnV4LWVkYWNAdmdlci5rZXJuZWwub3JnCi1TOglNYWludGFpbmVkCitTOglPcnBoYW4KIEY6CWRyaXZlcnMvZWRhYy9pMzAwMF9lZGFjLmMKIAogRURBQy1JNTAwMAotTToJRG91ZyBUaG9tcHNvbiA8ZG91Z3Rob21wc29uQHhtaXNzaW9uLmNvbT4KIEw6CWxpbnV4LWVkYWNAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL2VkYWMvaTUwMDBfZWRhYy5jCkBAIC00NTI1LDYgKzQ1NjIsMTIgQEAKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvZWRhYy9zYl9lZGFjLmMKIAorRURBQy1TS1lMQUtFCitNOglUb255IEx1Y2sgPHRvbnkubHVja0BpbnRlbC5jb20+CitMOglsaW51eC1lZGFjQHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy9lZGFjL3NreF9lZGFjLmMKKwogRURBQy1YR0VORQogQVBQTElFRCBNSUNSTyAoQVBNKSBYLUdFTkUgU09DIEVEQUMKIE06ICAgICBMb2MgSG8gPGxob0BhcG0uY29tPgpAQCAtNDU2Nyw2ICs0NjEwLDEzIEBACiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL3ZpZGVvL2ZiZGV2L2VmaWZiLmMKIAorRUZJIFRFU1QgRFJJVkVSCitMOglsaW51eC1lZmlAdmdlci5rZXJuZWwub3JnCitNOglJdmFuIEh1IDxpdmFuLmh1QGNhbm9uaWNhbC5jb20+CitNOglNYXR0IEZsZW1pbmcgPG1hdHRAY29kZWJsdWVwcmludC5jby51az4KK1M6CU1haW50YWluZWQKK0Y6CWRyaXZlcnMvZmlybXdhcmUvZWZpL3Rlc3QvCisKIEVGUyBGSUxFU1lTVEVNCiBXOglodHRwOi8vYWVzY2hpLmNoLmV1Lm9yZy9lZnMvCiBTOglPcnBoYW4KQEAgLTQ4MzQsNiArNDg4NCw3IEBACiAKIEZJUk1XQVJFIExPQURFUiAocmVxdWVzdF9maXJtd2FyZSkKIE06CU1pbmcgTGVpIDxtaW5nLmxlaUBjYW5vbmljYWwuY29tPgorTToJTHVpcyBSLiBSb2RyaWd1ZXogPG1jZ3JvZkBrZXJuZWwub3JnPgogTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogRjoJRG9jdW1lbnRhdGlvbi9maXJtd2FyZV9jbGFzcy8KQEAgLTUwNTQsMTAgKzUxMDUsOSBAQAogCiBGMkZTIEZJTEUgU1lTVEVNCiBNOglKYWVnZXVrIEtpbSA8amFlZ2V1a0BrZXJuZWwub3JnPgotTToJQ2hhbmdtYW4gTGVlIDxjbTIyNC5sZWVAc2Ftc3VuZy5jb20+Ci1SOglDaGFvIFl1IDx5dWNoYW8wQGh1YXdlaS5jb20+CitNOglDaGFvIFl1IDx5dWNoYW8wQGh1YXdlaS5jb20+CiBMOglsaW51eC1mMmZzLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAotVzoJaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GMkZTCitXOglodHRwczovL2YyZnMud2lraS5rZXJuZWwub3JnLwogVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9qYWVnZXVrL2YyZnMuZ2l0CiBTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2YyZnMudHh0CkBAIC01MTE5LDcgKzUxNjksNyBAQAogTToJUGV0ZXIgT2JlcnBhcmxlaXRlciA8b2JlcnBhckBsaW51eC52bmV0LmlibS5jb20+CiBTOglNYWludGFpbmVkCiBGOglrZXJuZWwvZ2Nvdi8KLUY6CURvY3VtZW50YXRpb24vZ2Nvdi50eHQKK0Y6CURvY3VtZW50YXRpb24vZGV2LXRvb2xzL2djb3YucnN0CiAKIEdEVCBTQ1NJIERJU0sgQVJSQVkgQ09OVFJPTExFUiBEUklWRVIKIE06CUFjaGltIExldWJuZXIgPGFjaGltX2xldWJuZXJAYWRhcHRlYy5jb20+CkBAIC01MjM2LDYgKzUyODYsMTMgQEAKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vZ29vZGl4LmMKIAorR1BJTyBNT0NLVVAgRFJJVkVSCitNOglCYW12b3IgSmlhbiBaaGFuZyA8YmFtdm9yLnpoYW5namlhbkBsaW5hcm8ub3JnPgorTDoJbGludXgtZ3Bpb0B2Z2VyLmtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKK0Y6CWRyaXZlcnMvZ3Bpby9ncGlvLW1vY2t1cC5jCitGOgl0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9ncGlvLworCiBHUElPIFNVQlNZU1RFTQogTToJTGludXMgV2FsbGVpaiA8bGludXMud2FsbGVpakBsaW5hcm8ub3JnPgogTToJQWxleGFuZHJlIENvdXJib3QgPGdudXJvdUBnbWFpbC5jb20+CkBAIC01MjY3LDYgKzUzMjQsNzcgQEAKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvbmV0L2V0aGVybmV0L2Flcm9mbGV4LwogCitHUkVZQlVTIFNVQlNZU1RFTQorTToJSm9oYW4gSG92b2xkIDxqb2hhbkBrZXJuZWwub3JnPgorTToJQWxleCBFbGRlciA8ZWxkZXJAa2VybmVsLm9yZz4KK006CUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQGxpbnV4Zm91bmRhdGlvbi5vcmc+CitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy8KKworR1JFWUJVUyBBVURJTyBQUk9UT0NPTFMgRFJJVkVSUworTToJVmFpYmhhdiBBZ2Fyd2FsIDx2YWliaGF2LnNyQGdtYWlsLmNvbT4KK006CU1hcmsgR3JlZXIgPG1ncmVlckBhbmltYWxjcmVlay5jb20+CitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19hcGJyaWRnZWEuYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fYXBicmlkZ2VhLmgKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX2NvZGVjLmMKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX2NvZGVjLmgKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX2diLmMKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX21hbmFnZXIuYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fbWFuYWdlci5oCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19tYW5hZ2VyX21vZHVsZS5jCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19tYW5hZ2VyX3ByaXZhdGUuaAorRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fbWFuYWdlcl9zeXNmcy5jCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19tb2R1bGUuYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fdG9wb2xvZ3kuYworCitHUkVZQlVTIFBST1RPQ09MUyBEUklWRVJTCitNOglSdWkgTWlndWVsIFNpbHZhIDxybWZyZnNAZ21haWwuY29tPgorUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvc2Rpby5jCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9saWdodC5jCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9ncGlvLmMKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3Bvd2VyX3N1cHBseS5jCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9zcGkuYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvc3BpbGliLmMKKworR1JFWUJVUyBQUk9UT0NPTFMgRFJJVkVSUworTToJQnJ5YW4gTydEb25vZ2h1ZSA8cHVyZS5sb2dpY0BuZXh1cy1zb2Z0d2FyZS5pZT4KK1M6CU1haW50YWluZWQKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2xvb3BiYWNrLmMKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3RpbWVzeW5jLmMKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3RpbWVzeW5jX3BsYXRmb3JtLmMKKworR1JFWUJVUyBQUk9UT0NPTFMgRFJJVkVSUworTToJVmlyZXNoIEt1bWFyIDx2aXJlc2hrQGtlcm5lbC5vcmc+CitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdXRoZW50aWNhdGlvbi5jCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9ib290cm9tLmMKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2Zpcm13YXJlLmgKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2Z3LWNvcmUuYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZnctZG93bmxvYWQuYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZnctbWFuYWdhbWVudC5jCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9ncmV5YnVzX2F1dGhlbnRpY2F0aW9uLmgKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2dyZXlidXNfZmlybXdhcmUuaAorRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvaGlkLmMKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2kyYy5jCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9zcGkuYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvc3BpbGliLmMKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3NwaWxpYi5oCisKK0dSRVlCVVMgUFJPVE9DT0xTIERSSVZFUlMKK006CURhdmlkIExpbiA8ZHR3bGluQGdtYWlsLmNvbT4KK1M6CU1haW50YWluZWQKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3VhcnQuYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvbG9nLmMKKworR1JFWUJVUyBQTEFURk9STSBEUklWRVJTCitNOglWYWliaGF2IEhpcmVtYXRoIDxodmFpYmhhdi5saW51eEBnbWFpbC5jb20+CitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hcmNoZS1wbGF0Zm9ybS5jCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hcmNoZS1hcGItY3RybC5jCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hcmNoZV9wbGF0Zm9ybS5oCisKIEdTUENBIEZJTkVQSVggU1VCRFJJVkVSCiBNOglGcmFuayBaYWdvIDxmcmFua0B6YWdvLm5ldD4KIEw6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZwpAQCAtNTU2NywxMCArNTY5NSw5IEBACiAKIEhPU1QgQVAgRFJJVkVSCiBNOglKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPgotTDoJaG9zdGFwQHNobW9vLmNvbSAoc3Vic2NyaWJlcnMtb25seSkKIEw6CWxpbnV4LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZwotVzoJaHR0cDovL2hvc3RhcC5lcGl0ZXN0LmZpLwotUzoJTWFpbnRhaW5lZAorVzoJaHR0cDovL3cxLmZpL2hvc3RhcC1kcml2ZXIuaHRtbAorUzoJT2Jzb2xldGUKIEY6CWRyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVyc2lsL2hvc3RhcC8KIAogSFAgQ09NUEFRIFRDMTEwMCBUQUJMRVQgV01JIEVYVFJBUyBEUklWRVIKQEAgLTU2MDcsNyArNTczNCw3IEBACiBUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3NyZS9saW51eC1oc2kuZ2l0CiBTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJ1cy1oc2kKLUY6CURvY3VtZW50YXRpb24vaHNpLnR4dAorRjoJRG9jdW1lbnRhdGlvbi9kZXZpY2UtZHJpdmVycy9zZXJpYWwtaW50ZXJmYWNlcy5yc3QKIEY6CWRyaXZlcnMvaHNpLwogRjoJaW5jbHVkZS9saW51eC9oc2kvCiBGOglpbmNsdWRlL3VhcGkvbGludXgvaHNpLwpAQCAtNjA4Niw3ICs2MjEzLDcgQEAKIEY6CWRyaXZlcnMvY3B1ZnJlcS9pbnRlbF9wc3RhdGUuYwogCiBJTlRFTCBGUkFNRUJVRkZFUiBEUklWRVIgKGV4Y2x1ZGluZyA4MTAgYW5kIDgxNSkKLU06CU1haWsgQnJvZW1tZSA8bWJyb2VtbWVAcGx1c3NlcnZlci5kZT4KK006CU1haWsgQnJvZW1tZSA8bWJyb2VtbWVAbGlibXBxLm9yZz4KIEw6CWxpbnV4LWZiZGV2QHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogRjoJRG9jdW1lbnRhdGlvbi9mYi9pbnRlbGZiLnR4dApAQCAtNjU4OCw3ICs2NzE1LDcgQEAKIFM6CU1haW50YWluZWQKIEY6CWFyY2gvKi9pbmNsdWRlL2FzbS9rYXNhbi5oCiBGOglhcmNoLyovbW0va2FzYW5faW5pdCoKLUY6CURvY3VtZW50YXRpb24va2FzYW4udHh0CitGOglEb2N1bWVudGF0aW9uL2Rldi10b29scy9rYXNhbi5yc3QKIEY6CWluY2x1ZGUvbGludXgva2FzYW4qLmgKIEY6CWxpYi90ZXN0X2thc2FuLmMKIEY6CW1tL2thc2FuLwpAQCAtNjgwNCw3ICs2OTMxLDcgQEAKIE06CVZlZ2FyZCBOb3NzdW0gPHZlZ2FyZG5vQGlmaS51aW8ubm8+CiBNOglQZWtrYSBFbmJlcmcgPHBlbmJlcmdAa2VybmVsLm9yZz4KIFM6CU1haW50YWluZWQKLUY6CURvY3VtZW50YXRpb24va21lbWNoZWNrLnR4dAorRjoJRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMva21lbWNoZWNrLnJzdAogRjoJYXJjaC94ODYvaW5jbHVkZS9hc20va21lbWNoZWNrLmgKIEY6CWFyY2gveDg2L21tL2ttZW1jaGVjay8KIEY6CWluY2x1ZGUvbGludXgva21lbWNoZWNrLmgKQEAgLTY4MTMsNyArNjk0MCw3IEBACiBLTUVNTEVBSwogTToJQ2F0YWxpbiBNYXJpbmFzIDxjYXRhbGluLm1hcmluYXNAYXJtLmNvbT4KIFM6CU1haW50YWluZWQKLUY6CURvY3VtZW50YXRpb24va21lbWxlYWsudHh0CitGOglEb2N1bWVudGF0aW9uL2Rldi10b29scy9rbWVtbGVhay5yc3QKIEY6CWluY2x1ZGUvbGludXgva21lbWxlYWsuaAogRjoJbW0va21lbWxlYWsuYwogRjoJbW0va21lbWxlYWstdGVzdC5jCkBAIC03NDI2LDkgKzc1NTMsOCBAQAogRjoJZHJpdmVycy9od21vbi9tYXgyMDc1MS5jCiAKIE1BWDY2NTAgSEFSRFdBUkUgTU9OSVRPUiBBTkQgRkFOIENPTlRST0xMRVIgRFJJVkVSCi1NOgkiSGFucyBKLiBLb2NoIiA8aGprQGhhbnNqa29jaC5kZT4KIEw6CWxpbnV4LWh3bW9uQHZnZXIua2VybmVsLm9yZwotUzoJTWFpbnRhaW5lZAorUzoJT3JwaGFuCiBGOglEb2N1bWVudGF0aW9uL2h3bW9uL21heDY2NTAKIEY6CWRyaXZlcnMvaHdtb24vbWF4NjY1MC5jCiAKQEAgLTc0NDksMTEgKzc1NzUsMTIgQEAKIEY6CXNvdW5kL3NvYy9jb2RlY3MvbWF4OTg2MC4qCiAKIE1BWElNIE1VSUMgQ0hBUkdFUiBEUklWRVJTIEZPUiBFWFlOT1MgQkFTRUQgQk9BUkRTCi1NOglLcnp5c3p0b2YgS296bG93c2tpIDxrLmtvemxvd3NraUBzYW1zdW5nLmNvbT4KK006CUtyenlzenRvZiBLb3psb3dza2kgPGtyemtAa2VybmVsLm9yZz4KK006CUJhcnRsb21pZWogWm9sbmllcmtpZXdpY3ogPGIuem9sbmllcmtpZUBzYW1zdW5nLmNvbT4KIEw6CWxpbnV4LXBtQHZnZXIua2VybmVsLm9yZwogUzoJU3VwcG9ydGVkCi1GOglkcml2ZXJzL3Bvd2VyL21heDE0NTc3X2NoYXJnZXIuYwotRjoJZHJpdmVycy9wb3dlci9tYXg3NzY5M19jaGFyZ2VyLmMKK0Y6CWRyaXZlcnMvcG93ZXIvc3VwcGx5L21heDE0NTc3X2NoYXJnZXIuYworRjoJZHJpdmVycy9wb3dlci9zdXBwbHkvbWF4Nzc2OTNfY2hhcmdlci5jCiAKIE1BWElNIE1BWDc3ODAyIE1VTFRJRlVOQ1RJT04gUE1JQyBERVZJQ0UgRFJJVkVSUwogTToJSmF2aWVyIE1hcnRpbmV6IENhbmlsbGFzIDxqYXZpZXJAb3NnLnNhbXN1bmcuY29tPgpAQCAtNzQ2NSw3ICs3NTkyLDggQEAKIAogTUFYSU0gUE1JQyBBTkQgTVVJQyBEUklWRVJTIEZPUiBFWFlOT1MgQkFTRUQgQk9BUkRTCiBNOglDaGFud29vIENob2kgPGN3MDAuY2hvaUBzYW1zdW5nLmNvbT4KLU06CUtyenlzenRvZiBLb3psb3dza2kgPGsua296bG93c2tpQHNhbXN1bmcuY29tPgorTToJS3J6eXN6dG9mIEtvemxvd3NraSA8a3J6a0BrZXJuZWwub3JnPgorTToJQmFydGxvbWllaiBab2xuaWVya2lld2ljeiA8Yi56b2xuaWVya2llQHNhbXN1bmcuY29tPgogTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZwogUzoJU3VwcG9ydGVkCiBGOglkcml2ZXJzLyovbWF4MTQ1NzcqLmMKQEAgLTc0OTcsNiArNzYyNSwxMiBAQAogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy9paW8vcG90ZW50aW9tZXRlci9tY3A0NTMxLmMKIAorTUVBU1VSRU1FTlQgQ09NUFVUSU5HIENJTy1EQUMgSUlPIERSSVZFUgorTToJV2lsbGlhbSBCcmVhdGhpdHQgR3JheSA8dmlsaGVsbS5ncmF5QGdtYWlsLmNvbT4KK0w6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKK0Y6CWRyaXZlcnMvaWlvL2RhYy9jaW8tZGFjLmMKKwogTUVESUEgRFJJVkVSUyBGT1IgUkVORVNBUyAtIEZDUAogTToJTGF1cmVudCBQaW5jaGFydCA8bGF1cmVudC5waW5jaGFydEBpZGVhc29uYm9hcmQuY29tPgogTDoJbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnCkBAIC03NjQ5LDEzICs3NzgzLDI2IEBACiBROglodHRwOi8vcGF0Y2h3b3JrLm96bGFicy5vcmcvcHJvamVjdC9uZXRkZXYvbGlzdC8KIEY6CWRyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3LwogCitNRUxMQU5PWCBNTFhDUExEIExFRCBEUklWRVIKK006CVZhZGltIFBhc3Rlcm5hayA8dmFkaW1wQG1lbGxhbm94LmNvbT4KK0w6CWxpbnV4LWxlZHNAdmdlci5rZXJuZWwub3JnCitTOglTdXBwb3J0ZWQKK0Y6CWRyaXZlcnMvbGVkcy9sZWRzLW1seGNwbGQuYworRjoJRG9jdW1lbnRhdGlvbi9sZWRzL2xlZHMtbWx4Y3BsZC50eHQKKworTUVMTEFOT1ggUExBVEZPUk0gRFJJVkVSCitNOiAgICAgIFZhZGltIFBhc3Rlcm5hayA8dmFkaW1wQG1lbGxhbm94LmNvbT4KK0w6ICAgICAgcGxhdGZvcm0tZHJpdmVyLXg4NkB2Z2VyLmtlcm5lbC5vcmcKK1M6ICAgICAgU3VwcG9ydGVkCitGOiAgICAgIGFyY2gveDg2L3BsYXRmb3JtL21lbGxhbm94L21seC1wbGF0Zm9ybS5jCisKIFNPRlQtUk9DRSBEUklWRVIgKHJ4ZSkKIE06CU1vbmkgU2hvdWEgPG1vbmlzQG1lbGxhbm94LmNvbT4KIEw6CWxpbnV4LXJkbWFAdmdlci5rZXJuZWwub3JnCiBTOglTdXBwb3J0ZWQKIFc6CWh0dHBzOi8vZ2l0aHViLmNvbS9Tb2Z0Um9DRS9yeGUtZGV2L3dpa2kvcnhlLWRldjotSG9tZQogUToJaHR0cDovL3BhdGNod29yay5rZXJuZWwub3JnL3Byb2plY3QvbGludXgtcmRtYS9saXN0LwotRjoJZHJpdmVycy9pbmZpbmliYW5kL2h3L3J4ZS8KK0Y6CWRyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvCiBGOglpbmNsdWRlL3VhcGkvcmRtYS9yZG1hX3VzZXJfcnhlLmgKIAogTUVNQkFSUklFUiBTVVBQT1JUCkBAIC03NzM0LDYgKzc4ODEsMTIgQEAKIFM6CVN1cHBvcnRlZAogRjoJYXJjaC9taWNyb2JsYXplLwogCitNSUNST0NISVAgLyBBVE1FTCBBVDkxIC8gQVQzMiBTRVJJQUwgRFJJVkVSCitNOglSaWNoYXJkIEdlbm91ZCA8cmljaGFyZC5nZW5vdWRAZ21haWwuY29tPgorUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy90dHkvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCitGOglpbmNsdWRlL2xpbnV4L2F0bWVsX3NlcmlhbC5oCisKIE1JQ1JPU09GVCBTVVJGQUNFIFBSTyAzIEJVVFRPTiBEUklWRVIKIE06CUNoZW4gWXUgPHl1LmMuY2hlbkBpbnRlbC5jb20+CiBMOglwbGF0Zm9ybS1kcml2ZXIteDg2QHZnZXIua2VybmVsLm9yZwpAQCAtODE0Myw2ICs4Mjk2LDE1IEBACiBXOglodHRwczovL2ZlZG9yYWhvc3RlZC5vcmcvZHJvcHdhdGNoLwogRjoJbmV0L2NvcmUvZHJvcF9tb25pdG9yLmMKIAorTkVUV09SS0lORyBbRFNBXQorTToJQW5kcmV3IEx1bm4gPGFuZHJld0BsdW5uLmNoPgorTToJVml2aWVuIERpZGVsb3QgPHZpdmllbi5kaWRlbG90QHNhdm9pcmZhaXJlbGludXguY29tPgorTToJRmxvcmlhbiBGYWluZWxsaSA8Zi5mYWluZWxsaUBnbWFpbC5jb20+CitTOglNYWludGFpbmVkCitGOgluZXQvZHNhLworRjoJaW5jbHVkZS9uZXQvZHNhLmgKK0Y6CWRyaXZlcnMvbmV0L2RzYS8KKwogTkVUV09SS0lORyBbR0VORVJBTF0KIE06CSJEYXZpZCBTLiBNaWxsZXIiIDxkYXZlbUBkYXZlbWxvZnQubmV0PgogTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZwpAQCAtODMyNSwxMSArODQ4NywxMSBAQAogRjoJaW5jbHVkZS9saW51eC9wb3dlci9icTI0MTV4X2NoYXJnZXIuaAogRjoJaW5jbHVkZS9saW51eC9wb3dlci9icTI3eHh4X2JhdHRlcnkuaAogRjoJaW5jbHVkZS9saW51eC9wb3dlci9pc3AxNzA0X2NoYXJnZXIuaAotRjoJZHJpdmVycy9wb3dlci9icTI0MTV4X2NoYXJnZXIuYwotRjoJZHJpdmVycy9wb3dlci9icTI3eHh4X2JhdHRlcnkuYwotRjoJZHJpdmVycy9wb3dlci9icTI3eHh4X2JhdHRlcnlfaTJjLmMKLUY6CWRyaXZlcnMvcG93ZXIvaXNwMTcwNF9jaGFyZ2VyLmMKLUY6CWRyaXZlcnMvcG93ZXIvcng1MV9iYXR0ZXJ5LmMKK0Y6CWRyaXZlcnMvcG93ZXIvc3VwcGx5L2JxMjQxNXhfY2hhcmdlci5jCitGOglkcml2ZXJzL3Bvd2VyL3N1cHBseS9icTI3eHh4X2JhdHRlcnkuYworRjoJZHJpdmVycy9wb3dlci9zdXBwbHkvYnEyN3h4eF9iYXR0ZXJ5X2kyYy5jCitGOglkcml2ZXJzL3Bvd2VyL3N1cHBseS9pc3AxNzA0X2NoYXJnZXIuYworRjoJZHJpdmVycy9wb3dlci9zdXBwbHkvcng1MV9iYXR0ZXJ5LmMKIAogTlRCIERSSVZFUiBDT1JFCiBNOglKb24gTWFzb24gPGpkbWFzb25Aa3VkenUudXM+CkBAIC04NzE4LDcgKzg4ODAsNyBAQAogRjoJaW5jbHVkZS9saW51eC9vcHJvZmlsZS5oCiAKIE9SQUNMRSBDTFVTVEVSIEZJTEVTWVNURU0gMiAoT0NGUzIpCi1NOglNYXJrIEZhc2hlaCA8bWZhc2hlaEBzdXNlLmNvbT4KK006CU1hcmsgRmFzaGVoIDxtZmFzaGVoQHZlcnNpdHkuY29tPgogTToJSm9lbCBCZWNrZXIgPGpsYmVjQGV2aWxwbGFuLm9yZz4KIEw6CW9jZnMyLWRldmVsQG9zcy5vcmFjbGUuY29tIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKIFc6CWh0dHA6Ly9vY2ZzMi53aWtpLmtlcm5lbC5vcmcKQEAgLTg4MzAsNiArODk5Miw3IEBACiBGOglEb2N1bWVudGF0aW9uL3ZpcnR1YWwvcGFyYXZpcnRfb3BzLnR4dAogRjoJYXJjaC8qL2tlcm5lbC9wYXJhdmlydCoKIEY6CWFyY2gvKi9pbmNsdWRlL2FzbS9wYXJhdmlydC5oCitGOglpbmNsdWRlL2xpbnV4L2h5cGVydmlzb3IuaAogCiBQQVJJREUgRFJJVkVSUyBGT1IgUEFSQUxMRUwgUE9SVCBJREUgREVWSUNFUwogTToJVGltIFdhdWdoIDx0aW1AY3liZXJlbGsubmV0PgpAQCAtOTIzMiw3ICs5Mzk1LDcgQEAKIAogUElOIENPTlRST0xMRVIgLSBTQU1TVU5HCiBNOglUb21hc3ogRmlnYSA8dG9tYXN6LmZpZ2FAZ21haWwuY29tPgotTToJS3J6eXN6dG9mIEtvemxvd3NraSA8ay5rb3psb3dza2lAc2Ftc3VuZy5jb20+CitNOglLcnp5c3p0b2YgS296bG93c2tpIDxrcnprQGtlcm5lbC5vcmc+CiBNOglTeWx3ZXN0ZXIgTmF3cm9ja2kgPHMubmF3cm9ja2lAc2Ftc3VuZy5jb20+CiBMOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQogTDoJbGludXgtc2Ftc3VuZy1zb2NAdmdlci5rZXJuZWwub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKQEAgLTkzMjgsMTYgKzk0OTEsMTIgQEAKIAogUE9XRVIgU1VQUExZIENMQVNTL1NVQlNZU1RFTSBhbmQgRFJJVkVSUwogTToJU2ViYXN0aWFuIFJlaWNoZWwgPHNyZUBrZXJuZWwub3JnPgotTToJRG1pdHJ5IEVyZW1pbi1Tb2xlbmlrb3YgPGRiYXJ5c2hrb3ZAZ21haWwuY29tPgotTToJRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgogTDoJbGludXgtcG1Admdlci5rZXJuZWwub3JnCi1UOglnaXQgZ2l0Oi8vZ2l0LmluZnJhZGVhZC5vcmcvYmF0dGVyeS0yLjYuZ2l0CitUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3NyZS9saW51eC1wb3dlci1zdXBwbHkuZ2l0CiBTOglNYWludGFpbmVkCi1GOglEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvCi1GOglEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5LworRjoJRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS8KIEY6CWluY2x1ZGUvbGludXgvcG93ZXJfc3VwcGx5LmgKLUY6CWRyaXZlcnMvcG93ZXIvCi1YOglkcml2ZXJzL3Bvd2VyL2F2cy8KK0Y6CWRyaXZlcnMvcG93ZXIvc3VwcGx5LwogCiBQT1dFUiBTVEFURSBDT09SRElOQVRJT04gSU5URVJGQUNFIChQU0NJKQogTToJTWFyayBSdXRsYW5kIDxtYXJrLnJ1dGxhbmRAYXJtLmNvbT4KQEAgLTk2NzMsNiArOTgzMiwxMiBAQAogUzoJU3VwcG9ydGVkCiBGOglkcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrLwogCitRVUFMQ09NTSBFTUFDIEdJR0FCSVQgRVRIRVJORVQgRFJJVkVSCitNOglUaW11ciBUYWJpIDx0aW11ckBjb2RlYXVyb3JhLm9yZz4KK0w6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKK1M6CVN1cHBvcnRlZAorRjoJZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy8KKwogUVVBTENPTU0gSEVYQUdPTiBBUkNISVRFQ1RVUkUKIE06CVJpY2hhcmQgS3VvIDxya3VvQGNvZGVhdXJvcmEub3JnPgogTDoJbGludXgtaGV4YWdvbkB2Z2VyLmtlcm5lbC5vcmcKQEAgLTk4OTMsNiArMTAwNTgsMTIgQEAKIEY6CURvY3VtZW50YXRpb24vcnBtc2cudHh0CiBGOglpbmNsdWRlL2xpbnV4L3JwbXNnLmgKIAorUkVORVNBUyBDTE9DSyBEUklWRVJTCitNOglHZWVydCBVeXR0ZXJob2V2ZW4gPGdlZXJ0K3JlbmVzYXNAZ2xpZGVyLmJlPgorTDoJbGludXgtcmVuZXNhcy1zb2NAdmdlci5rZXJuZWwub3JnCitTOglTdXBwb3J0ZWQKK0Y6CWRyaXZlcnMvY2xrL3JlbmVzYXMvCisKIFJFTkVTQVMgRVRIRVJORVQgRFJJVkVSUwogUjoJU2VyZ2VpIFNodHlseW92IDxzZXJnZWkuc2h0eWx5b3ZAY29nZW50ZW1iZWRkZWQuY29tPgogTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZwpAQCAtOTkyOCw2ICsxMDA5OSw3IEBACiAKIFJIQVNIVEFCTEUKIE06CVRob21hcyBHcmFmIDx0Z3JhZkBzdXVnLmNoPgorTToJSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgogTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogRjoJbGliL3JoYXNodGFibGUuYwpAQCAtMTAwNzEsOCArMTAyNDMsOCBAQAogRjoJZHJpdmVycy9zMzkwL2Npby8KIAogUzM5MCBEQVNEIERSSVZFUgotTToJU3RlZmFuIFdlaW5odWJlciA8d2VpbkBkZS5pYm0uY29tPgotTToJU3RlZmFuIEhhYmVybGFuZCA8c3RlZmFuLmhhYmVybGFuZEBkZS5pYm0uY29tPgorTToJU3RlZmFuIEhhYmVybGFuZCA8c3RoQGxpbnV4LnZuZXQuaWJtLmNvbT4KK006CUphbiBIb2VwcG5lciA8aG9lcHBuZXJAbGludXgudm5ldC5pYm0uY29tPgogTDoJbGludXgtczM5MEB2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHA6Ly93d3cuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9saW51eC9saW51eDM5MC8KIFM6CVN1cHBvcnRlZApAQCAtMTAxNjUsNyArMTAzMzcsNyBAQAogRjoJZHJpdmVycy9wbGF0Zm9ybS94ODYvc2Ftc3VuZy1sYXB0b3AuYwogCiBTQU1TVU5HIEFVRElPIChBU29DKSBEUklWRVJTCi1NOglLcnp5c3p0b2YgS296bG93c2tpIDxrLmtvemxvd3NraUBzYW1zdW5nLmNvbT4KK006CUtyenlzenRvZiBLb3psb3dza2kgPGtyemtAa2VybmVsLm9yZz4KIE06CVNhbmdiZW9tIEtpbSA8c2JraW03M0BzYW1zdW5nLmNvbT4KIE06CVN5bHdlc3RlciBOYXdyb2NraSA8cy5uYXdyb2NraUBzYW1zdW5nLmNvbT4KIEw6CWFsc2EtZGV2ZWxAYWxzYS1wcm9qZWN0Lm9yZyAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCkBAIC0xMDE4MCw3ICsxMDM1Miw4IEBACiAKIFNBTVNVTkcgTVVMVElGVU5DVElPTiBQTUlDIERFVklDRSBEUklWRVJTCiBNOglTYW5nYmVvbSBLaW0gPHNia2ltNzNAc2Ftc3VuZy5jb20+Ci1NOglLcnp5c3p0b2YgS296bG93c2tpIDxrLmtvemxvd3NraUBzYW1zdW5nLmNvbT4KK006CUtyenlzenRvZiBLb3psb3dza2kgPGtyemtAa2VybmVsLm9yZz4KK006CUJhcnRsb21pZWogWm9sbmllcmtpZXdpY3ogPGIuem9sbmllcmtpZUBzYW1zdW5nLmNvbT4KIEw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKIEw6CWxpbnV4LXNhbXN1bmctc29jQHZnZXIua2VybmVsLm9yZwogUzoJU3VwcG9ydGVkCkBAIC0xMDIzNSw5ICsxMDQwOCwyMyBAQAogU0FNU1VORyBTT0MgQ0xPQ0sgRFJJVkVSUwogTToJU3lsd2VzdGVyIE5hd3JvY2tpIDxzLm5hd3JvY2tpQHNhbXN1bmcuY29tPgogTToJVG9tYXN6IEZpZ2EgPHRvbWFzei5maWdhQGdtYWlsLmNvbT4KK006CUNoYW53b28gQ2hvaSA8Y3cwMC5jaG9pQHNhbXN1bmcuY29tPgogUzoJU3VwcG9ydGVkCiBMOglsaW51eC1zYW1zdW5nLXNvY0B2Z2VyLmtlcm5lbC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQogRjoJZHJpdmVycy9jbGsvc2Ftc3VuZy8KK0Y6CWluY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svZXh5bm9zKi5oCitGOglEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svZXh5bm9zKi50eHQKKworU0FNU1VORyBTUEkgRFJJVkVSUworTToJS3VramluIEtpbSA8a2dlbmVAa2VybmVsLm9yZz4KK006CUtyenlzenRvZiBLb3psb3dza2kgPGtyemtAa2VybmVsLm9yZz4KK006CUFuZGkgU2h5dGkgPGFuZGkuc2h5dGlAc2Ftc3VuZy5jb20+CitMOglsaW51eC1zcGlAdmdlci5rZXJuZWwub3JnCitMOglsaW51eC1zYW1zdW5nLXNvY0B2Z2VyLmtlcm5lbC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQorUzoJTWFpbnRhaW5lZAorRjoJRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktc2Ftc3VuZy50eHQKK0Y6CWRyaXZlcnMvc3BpL3NwaS1zM2MqCitGOglpbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvc3BpLXMzYzY0eHguaAogCiBTQU1TVU5HIFNYR0JFIERSSVZFUlMKIE06CUJ5dW5naG8gQW4gPGJoNzQuYW5Ac2Ftc3VuZy5jb20+CkBAIC0xMDMyNCw4ICsxMDUxMSw4IEBACiBUSSBCUTI3WFhYIFBPV0VSIFNVUFBMWSBEUklWRVIKIFI6CUFuZHJldyBGLiBEYXZpcyA8YWZkQHRpLmNvbT4KIEY6CWluY2x1ZGUvbGludXgvcG93ZXIvYnEyN3h4eF9iYXR0ZXJ5LmgKLUY6CWRyaXZlcnMvcG93ZXIvYnEyN3h4eF9iYXR0ZXJ5LmMKLUY6CWRyaXZlcnMvcG93ZXIvYnEyN3h4eF9iYXR0ZXJ5X2kyYy5jCitGOglkcml2ZXJzL3Bvd2VyL3N1cHBseS9icTI3eHh4X2JhdHRlcnkuYworRjoJZHJpdmVycy9wb3dlci9zdXBwbHkvYnEyN3h4eF9iYXR0ZXJ5X2kyYy5jCiAKIFRJTUVLRUVQSU5HLCBDTE9DS1NPVVJDRSBDT1JFLCBOVFAsIEFMQVJNVElNRVIKIE06CUpvaG4gU3R1bHR6IDxqb2huLnN0dWx0ekBsaW5hcm8ub3JnPgpAQCAtMTEwODUsNiArMTEyNzIsNyBAQAogRjoJZHJpdmVycy9zcGkvCiBGOglpbmNsdWRlL2xpbnV4L3NwaS8KIEY6CWluY2x1ZGUvdWFwaS9saW51eC9zcGkvCitGOgl0b29scy9zcGkvCiAKIFNQSURFUk5FVCBORVRXT1JLIERSSVZFUiBmb3IgQ0VMTAogTToJSXNoaXpha2kgS291IDxrb3UuaXNoaXpha2lAdG9zaGliYS5jby5qcD4KQEAgLTExMTU1LDYgKzExMzQzLDcgQEAKIFNUQUdJTkcgLSBMVVNUUkUgUEFSQUxMRUwgRklMRVNZU1RFTQogTToJT2xlZyBEcm9raW4gPG9sZWcuZHJva2luQGludGVsLmNvbT4KIE06CUFuZHJlYXMgRGlsZ2VyIDxhbmRyZWFzLmRpbGdlckBpbnRlbC5jb20+CitNOglKYW1lcyBTaW1tb25zIDxqc2ltbW9uc0BpbmZyYWRlYWQub3JnPgogTDoJbHVzdHJlLWRldmVsQGxpc3RzLmx1c3RyZS5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQogVzoJaHR0cDovL3dpa2kubHVzdHJlLm9yZy8KIFM6CU1haW50YWluZWQKQEAgLTExMTgxLDEzICsxMTM3MCw2IEBACiBTOglPZGQgRml4ZXMKIEY6CWRyaXZlcnMvc3RhZ2luZy9ydGw4NzEyLwogCi1TVEFHSU5HIC0gUkVBTFRFSyBSVEw4NzIzVSBXSVJFTEVTUyBEUklWRVIKLU06CUxhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KLU06CUplcyBTb3JlbnNlbiA8SmVzLlNvcmVuc2VuQHJlZGhhdC5jb20+Ci1MOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKLVM6CU1haW50YWluZWQKLUY6CWRyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvCi0KIFNUQUdJTkcgLSBTSUxJQ09OIE1PVElPTiBTTTc1MCBGUkFNRSBCVUZGRVIgRFJJVkVSCiBNOglTdWRpcCBNdWtoZXJqZWUgPHN1ZGlwbS5tdWtoZXJqZWVAZ21haWwuY29tPgogTToJVGVkZHkgV2FuZyA8dGVkZHkud2FuZ0BzaWxpY29ubW90aW9uLmNvbT4KQEAgLTExMjE4LDEyICsxMTQwMCw4IEBACiBGOglkcml2ZXJzL3N0YWdpbmcvdnQ2NjU/LwogCiBTVEFHSU5HIC0gV0lMQzEwMDAgV0lGSSBEUklWRVIKLU06CUpvaG5ueSBLaW0gPGpvaG5ueS5raW1AYXRtZWwuY29tPgotTToJQXVzdGluIFNoaW4gPGF1c3Rpbi5zaGluQGF0bWVsLmNvbT4KLU06CUNocmlzIFBhcmsgPGNocmlzLnBhcmtAYXRtZWwuY29tPgotTToJVG9ueSBDaG8gPHRvbnkuY2hvQGF0bWVsLmNvbT4KLU06CUdsZW4gTGVlIDxnbGVuLmxlZUBhdG1lbC5jb20+Ci1NOglMZW8gS2ltIDxsZW8ua2ltQGF0bWVsLmNvbT4KK006CUFkaXR5YSBTaGFua2FyIDxhZGl0eWEuc2hhbmthckBtaWNyb2NoaXAuY29tPgorTToJR2FuZXNoIEtyaXNobmEgPGdhbmVzaC5rcmlzaG5hQG1pY3JvY2hpcC5jb20+CiBMOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKIFM6CVN1cHBvcnRlZAogRjoJZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwLwpAQCAtMTEzMzEsNiArMTE1MDksMTQgQEAKIFM6CVN1cHBvcnRlZAogRjoJZHJpdmVycy9tZmQvc3lzY29uLmMKIAorU1lTVEVNIFJFU0VUL1NIVVRET1dOIERSSVZFUlMKK006CVNlYmFzdGlhbiBSZWljaGVsIDxzcmVAa2VybmVsLm9yZz4KK0w6CWxpbnV4LXBtQHZnZXIua2VybmVsLm9yZworVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9zcmUvbGludXgtcG93ZXItc3VwcGx5LmdpdAorUzoJTWFpbnRhaW5lZAorRjoJRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3Jlc2V0LworRjoJZHJpdmVycy9wb3dlci9yZXNldC8KKwogU1lTViBGSUxFU1lTVEVNCiBNOglDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGluZnJhZGVhZC5vcmc+CiBTOglNYWludGFpbmVkCkBAIC0xMTU5MSw3ICsxMTc3Nyw3IEBACiBUSEVSTUFML0NQVV9DT09MSU5HCiBNOglBbWl0IERhbmllbCBLYWNoaGFwIDxhbWl0LmthY2hoYXBAZ21haWwuY29tPgogTToJVmlyZXNoIEt1bWFyIDx2aXJlc2gua3VtYXJAbGluYXJvLm9yZz4KLU06CUphdmkgTWVyaW5vIDxqYXZpLm1lcmlub0Bhcm0uY29tPgorTToJSmF2aSBNZXJpbm8gPGphdmkubWVyaW5vQGtlcm5lbC5vcmc+CiBMOglsaW51eC1wbUB2Z2VyLmtlcm5lbC5vcmcKIFM6CVN1cHBvcnRlZAogRjoJRG9jdW1lbnRhdGlvbi90aGVybWFsL2NwdS1jb29saW5nLWFwaS50eHQKQEAgLTExNjc5LDcgKzExODY1LDcgQEAKIFRJIExQODcyNyBDSEFSR0VSIERSSVZFUgogTToJTWlsbyBLaW0gPG1pbG8ua2ltQHRpLmNvbT4KIFM6CU1haW50YWluZWQKLUY6CWRyaXZlcnMvcG93ZXIvbHA4NzI3X2NoYXJnZXIuYworRjoJZHJpdmVycy9wb3dlci9zdXBwbHkvbHA4NzI3X2NoYXJnZXIuYwogRjoJaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2xwODcyNy5oCiAKIFRJIExQODc4OCBNRkQgRFJJVkVSCkBAIC0xMTY4OCw3ICsxMTg3NCw3IEBACiBGOglkcml2ZXJzL2lpby9hZGMvbHA4Nzg4X2FkYy5jCiBGOglkcml2ZXJzL2xlZHMvbGVkcy1scDg3ODguYwogRjoJZHJpdmVycy9tZmQvbHA4Nzg4Ki5jCi1GOglkcml2ZXJzL3Bvd2VyL2xwODc4OC1jaGFyZ2VyLmMKK0Y6CWRyaXZlcnMvcG93ZXIvc3VwcGx5L2xwODc4OC1jaGFyZ2VyLmMKIEY6CWRyaXZlcnMvcmVndWxhdG9yL2xwODc4OC0qLmMKIEY6CWluY2x1ZGUvbGludXgvbWZkL2xwODc4OCouaAogCkBAIC0xMjE1OCw3ICsxMjM0NCw3IEBACiBGOglkcml2ZXJzL25ldC91c2IvbGFuNzh4eC4qCiAKIFVTQiBNQVNTIFNUT1JBR0UgRFJJVkVSCi1NOglNYXR0aGV3IERoYXJtIDxtZGhhcm0tdXNiQG9uZS1leWVkLWFsaWVuLm5ldD4KK006CUFsYW4gU3Rlcm4gPHN0ZXJuQHJvd2xhbmQuaGFydmFyZC5lZHU+CiBMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCiBMOgl1c2Itc3RvcmFnZUBsaXN0cy5vbmUtZXllZC1hbGllbi5uZXQKIFM6CU1haW50YWluZWQKQEAgLTEyMjQyLDYgKzEyNDI4LDcgQEAKIFVTQiBTRVJJQUwgU1VCU1lTVEVNCiBNOglKb2hhbiBIb3ZvbGQgPGpvaGFuQGtlcm5lbC5vcmc+CiBMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCitUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2pvaGFuL3VzYi1zZXJpYWwuZ2l0CiBTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uL3VzYi91c2Itc2VyaWFsLnR4dAogRjoJZHJpdmVycy91c2Ivc2VyaWFsLwpAQCAtMTIyNTUsNiArMTI0NDIsNyBAQAogCiBVU0IgU01TQzk1WFggRVRIRVJORVQgRFJJVkVSCiBNOglTdGV2ZSBHbGVuZGlubmluZyA8c3RldmUuZ2xlbmRpbm5pbmdAc2hhd2VsbC5uZXQ+CitNOglNaWNyb2NoaXAgTGludXggRHJpdmVyIFN1cHBvcnQgPFVOR0xpbnV4RHJpdmVyQG1pY3JvY2hpcC5jb20+CiBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL25ldC91c2Ivc21zYzk1eHguKgpAQCAtMTIzNjEsNyArMTI1NDksNiBAQAogRjoJZnMvaHBwZnMvCiAKIFVTRVJTUEFDRSBJL08gKFVJTykKLU06CSJIYW5zIEouIEtvY2giIDxoamtAaGFuc2prb2NoLmRlPgogTToJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAbGludXhmb3VuZGF0aW9uLm9yZz4KIFM6CU1haW50YWluZWQKIFQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvZ3JlZ2toL2NoYXItbWlzYy5naXQKQEAgLTEyNTQzLDcgKzEyNzMwLDcgQEAKIEY6CW5ldC84MDIxcS8KIAogVkxZTlEgQlVTCi1NOglGbG9yaWFuIEZhaW5lbGxpIDxmbG9yaWFuQG9wZW53cnQub3JnPgorTToJRmxvcmlhbiBGYWluZWxsaSA8Zi5mYWluZWxsaUBnbWFpbC5jb20+CiBMOglvcGVud3J0LWRldmVsQGxpc3RzLm9wZW53cnQub3JnIChzdWJzY3JpYmVycy1vbmx5KQogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy92bHlucS92bHlucS5jCkBAIC0xMjc2NCw3ICsxMjk1MSw3IEBACiBGOglkcml2ZXJzL21mZC9hcml6b25hKgogRjoJZHJpdmVycy9tZmQvd20qLmMKIEY6CWRyaXZlcnMvbWZkL2NzNDdsMjQqCi1GOglkcml2ZXJzL3Bvd2VyL3dtODMqLmMKK0Y6CWRyaXZlcnMvcG93ZXIvc3VwcGx5L3dtODMqLmMKIEY6CWRyaXZlcnMvcnRjL3J0Yy13bTgzKi5jCiBGOglkcml2ZXJzL3JlZ3VsYXRvci93bTgqLmMKIEY6CWRyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3dtODMqX2JsLmMKQEAgLTEyOTE2LDExICsxMzEwMywxMCBAQAogRjoJZHJpdmVycy94ZW4vKnN3aW90bGIqCiAKIFhGUyBGSUxFU1lTVEVNCi1QOglTaWxpY29uIEdyYXBoaWNzIEluYwogTToJRGF2ZSBDaGlubmVyIDxkYXZpZEBmcm9tb3JiaXQuY29tPgotTToJeGZzQG9zcy5zZ2kuY29tCi1MOgl4ZnNAb3NzLnNnaS5jb20KLVc6CWh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy94ZnMKK006CWxpbnV4LXhmc0B2Z2VyLmtlcm5lbC5vcmcKK0w6CWxpbnV4LXhmc0B2Z2VyLmtlcm5lbC5vcmcKK1c6CWh0dHA6Ly94ZnMub3JnLwogVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9kZ2MvbGludXgteGZzLmdpdAogUzoJU3VwcG9ydGVkCiBGOglEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3hmcy50eHQKZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggNWMxOGJhYS4uYWRkYjIzNSAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTEsNyArMSw3IEBACiBWRVJTSU9OID0gNAogUEFUQ0hMRVZFTCA9IDgKIFNVQkxFVkVMID0gMAotRVhUUkFWRVJTSU9OID0gLXJjMgorRVhUUkFWRVJTSU9OID0KIE5BTUUgPSBQc3ljaG90aWMgU3RvbmVkIFNoZWVwCiAKICMgKkRPQ1VNRU5UQVRJT04qCkBAIC0xNDI1LDcgKzE0MjUsNyBAQAogCiAjIERvY3VtZW50YXRpb24gdGFyZ2V0cwogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLURPQ19UQVJHRVRTIDo9IHhtbGRvY3Mgc2dtbGRvY3MgcHNkb2NzIHBkZmRvY3MgaHRtbGRvY3MgbWFuZG9jcyBpbnN0YWxsbWFuZG9jcyBlcHViZG9jcyBjbGVhbmRvY3MKK0RPQ19UQVJHRVRTIDo9IHhtbGRvY3Mgc2dtbGRvY3MgcHNkb2NzIGxhdGV4ZG9jcyBwZGZkb2NzIGh0bWxkb2NzIG1hbmRvY3MgaW5zdGFsbG1hbmRvY3MgZXB1YmRvY3MgY2xlYW5kb2NzCiBQSE9OWSArPSAkKERPQ19UQVJHRVRTKQogJChET0NfVEFSR0VUUyk6IHNjcmlwdHNfYmFzaWMgRk9SQ0UKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT1zY3JpcHRzIGJ1aWxkX2RvY3Byb2MgYnVpbGRfY2hlY2stbGNfY3R5cGUKZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQppbmRleCBlOGM4YTZkLi4wOWYzNGY3IDEwMDY0NAotLS0gYS9SRUFETUUKKysrIGIvUkVBRE1FCkBAIC0yMjksMTAgKzIyOSw2IEBACiAgICAgICB1bmRlciBzb21lIGNpcmN1bXN0YW5jZXMgbGVhZCB0byBwcm9ibGVtczogcHJvYmluZyBmb3IgYQogICAgICAgbm9uZXhpc3RlbnQgY29udHJvbGxlciBjYXJkIG1heSBjb25mdXNlIHlvdXIgb3RoZXIgY29udHJvbGxlcnMKIAotICAgIC0gQ29tcGlsaW5nIHRoZSBrZXJuZWwgd2l0aCAiUHJvY2Vzc29yIHR5cGUiIHNldCBoaWdoZXIgdGhhbiAzODYKLSAgICAgIHdpbGwgcmVzdWx0IGluIGEga2VybmVsIHRoYXQgZG9lcyBOT1Qgd29yayBvbiBhIDM4Ni4gIFRoZQotICAgICAga2VybmVsIHdpbGwgZGV0ZWN0IHRoaXMgb24gYm9vdHVwLCBhbmQgZ2l2ZSB1cC4KLQogICAgIC0gQSBrZXJuZWwgd2l0aCBtYXRoLWVtdWxhdGlvbiBjb21waWxlZCBpbiB3aWxsIHN0aWxsIHVzZSB0aGUKICAgICAgIGNvcHJvY2Vzc29yIGlmIG9uZSBpcyBwcmVzZW50OiB0aGUgbWF0aCBlbXVsYXRpb24gd2lsbCBqdXN0CiAgICAgICBuZXZlciBnZXQgdXNlZCBpbiB0aGF0IGNhc2UuICBUaGUga2VybmVsIHdpbGwgYmUgc2xpZ2h0bHkgbGFyZ2VyLApAQCAtMjg5LDcgKzI4NSw3IEBACiAgICBMT0NBTFZFUlNJT04gY2FuIGJlIHNldCBpbiB0aGUgIkdlbmVyYWwgU2V0dXAiIG1lbnUuCiAKICAtIEluIG9yZGVyIHRvIGJvb3QgeW91ciBuZXcga2VybmVsLCB5b3UnbGwgbmVlZCB0byBjb3B5IHRoZSBrZXJuZWwKLSAgIGltYWdlIChlLmcuIC4uLi9saW51eC9hcmNoL2kzODYvYm9vdC9iekltYWdlIGFmdGVyIGNvbXBpbGF0aW9uKQorICAgaW1hZ2UgKGUuZy4gLi4uL2xpbnV4L2FyY2gveDg2L2Jvb3QvYnpJbWFnZSBhZnRlciBjb21waWxhdGlvbikKICAgIHRvIHRoZSBwbGFjZSB3aGVyZSB5b3VyIHJlZ3VsYXIgYm9vdGFibGUga2VybmVsIGlzIGZvdW5kLgogCiAgLSBCb290aW5nIGEga2VybmVsIGRpcmVjdGx5IGZyb20gYSBmbG9wcHkgd2l0aG91dCB0aGUgYXNzaXN0YW5jZSBvZiBhCkBAIC0zOTEsNyArMzg3LDcgQEAKIAogIC0gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiB1c2UgZ2RiIG9uIGEgcnVubmluZyBrZXJuZWwuIChyZWFkLW9ubHk7IGkuZS4geW91CiAgICBjYW5ub3QgY2hhbmdlIHZhbHVlcyBvciBzZXQgYnJlYWsgcG9pbnRzLikgVG8gZG8gdGhpcywgZmlyc3QgY29tcGlsZSB0aGUKLSAgIGtlcm5lbCB3aXRoIC1nOyBlZGl0IGFyY2gvaTM4Ni9NYWtlZmlsZSBhcHByb3ByaWF0ZWx5LCB0aGVuIGRvIGEgIm1ha2UKKyAgIGtlcm5lbCB3aXRoIC1nOyBlZGl0IGFyY2gveDg2L01ha2VmaWxlIGFwcHJvcHJpYXRlbHksIHRoZW4gZG8gYSAibWFrZQogICAgY2xlYW4iLiBZb3UnbGwgYWxzbyBuZWVkIHRvIGVuYWJsZSBDT05GSUdfUFJPQ19GUyAodmlhICJtYWtlIGNvbmZpZyIpLgogCiAgICBBZnRlciB5b3UndmUgcmVib290ZWQgd2l0aCB0aGUgbmV3IGtlcm5lbCwgZG8gImdkYiB2bWxpbnV4IC9wcm9jL2tjb3JlIi4KZGlmZiAtLWdpdCBhL2FyY2gvS2NvbmZpZyBiL2FyY2gvS2NvbmZpZwppbmRleCBlOWM5MzM0Li4xODBlYTMzIDEwMDY0NAotLS0gYS9hcmNoL0tjb25maWcKKysrIGIvYXJjaC9LY29uZmlnCkBAIC0zMzYsMTcgKzMzNiw2IEBACiAJICAgIHJlc3VsdHMgaW4gdGhlIHN5c3RlbSBjYWxsIGJlaW5nIHNraXBwZWQgaW1tZWRpYXRlbHkuCiAJICAtIHNlY2NvbXAgc3lzY2FsbCB3aXJlZCB1cAogCi0JICBGb3IgYmVzdCBwZXJmb3JtYW5jZSwgYW4gYXJjaCBzaG91bGQgdXNlIHNlY2NvbXBfcGhhc2UxIGFuZAotCSAgc2VjY29tcF9waGFzZTIgZGlyZWN0bHkuICBJdCBzaG91bGQgY2FsbCBzZWNjb21wX3BoYXNlMSBmb3IgYWxsCi0JICBzeXNjYWxscyBpZiBUSUZfU0VDQ09NUCBpcyBzZXQsIGJ1dCBzZWNjb21wX3BoYXNlMSBkb2VzIG5vdAotCSAgbmVlZCB0byBiZSBjYWxsZWQgZnJvbSBhIHB0cmFjZS1zYWZlIGNvbnRleHQuICBJdCBtdXN0IHRoZW4KLQkgIGNhbGwgc2VjY29tcF9waGFzZTIgaWYgc2VjY29tcF9waGFzZTEgcmV0dXJucyBhbnl0aGluZyBvdGhlcgotCSAgdGhhbiBTRUNDT01QX1BIQVNFMV9PSyBvciBTRUNDT01QX1BIQVNFMV9TS0lQLgotCi0JICBBcyBhbiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbiwgYW4gYXJjaCBtYXkgcHJvdmlkZSBzZWNjb21wX2RhdGEKLQkgIGRpcmVjdGx5IHRvIHNlY2NvbXBfcGhhc2UxOyB0aGlzIGF2b2lkcyBtdWx0aXBsZSBjYWxscwotCSAgdG8gdGhlIHN5c2NhbGxfeHl6IGhlbHBlcnMgZm9yIGV2ZXJ5IHN5c2NhbGwuCi0KIGNvbmZpZyBTRUNDT01QX0ZJTFRFUgogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIEhBVkVfQVJDSF9TRUNDT01QX0ZJTFRFUiAmJiBTRUNDT01QICYmIE5FVApAQCAtNzA3LDQgKzY5NiwzOCBAQAogY29uZmlnIENQVV9OT19FRkZJQ0lFTlRfRkZTCiAJZGVmX2Jvb2wgbgogCitjb25maWcgSEFWRV9BUkNIX1ZNQVBfU1RBQ0sKKwlkZWZfYm9vbCBuCisJaGVscAorCSAgQW4gYXJjaCBzaG91bGQgc2VsZWN0IHRoaXMgc3ltYm9sIGlmIGl0IGNhbiBzdXBwb3J0IGtlcm5lbCBzdGFja3MKKwkgIGluIHZtYWxsb2Mgc3BhY2UuICBUaGlzIG1lYW5zOgorCisJICAtIHZtYWxsb2Mgc3BhY2UgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBtYW55IGtlcm5lbCBzdGFja3MuCisJICAgIFRoaXMgbWF5IHJ1bGUgb3V0IG1hbnkgMzItYml0IGFyY2hpdGVjdHVyZXMuCisKKwkgIC0gU3RhY2tzIGluIHZtYWxsb2Mgc3BhY2UgbmVlZCB0byB3b3JrIHJlbGlhYmx5LiAgRm9yIGV4YW1wbGUsIGlmCisJICAgIHZtYXAgcGFnZSB0YWJsZXMgYXJlIGNyZWF0ZWQgb24gZGVtYW5kLCBlaXRoZXIgdGhpcyBtZWNoYW5pc20KKwkgICAgbmVlZHMgdG8gd29yayB3aGlsZSB0aGUgc3RhY2sgcG9pbnRzIHRvIGEgdmlydHVhbCBhZGRyZXNzIHdpdGgKKwkgICAgdW5wb3B1bGF0ZWQgcGFnZSB0YWJsZXMgb3IgYXJjaCBjb2RlIChzd2l0Y2hfdG8oKSBhbmQgc3dpdGNoX21tKCksCisJICAgIG1vc3QgbGlrZWx5KSBuZWVkcyB0byBlbnN1cmUgdGhhdCB0aGUgc3RhY2sncyBwYWdlIHRhYmxlIGVudHJpZXMKKwkgICAgYXJlIHBvcHVsYXRlZCBiZWZvcmUgcnVubmluZyBvbiBhIHBvc3NpYmx5IHVucG9wdWxhdGVkIHN0YWNrLgorCisJICAtIElmIHRoZSBzdGFjayBvdmVyZmxvd3MgaW50byBhIGd1YXJkIHBhZ2UsIHNvbWV0aGluZyByZWFzb25hYmxlCisJICAgIHNob3VsZCBoYXBwZW4uICBUaGUgZGVmaW5pdGlvbiBvZiAicmVhc29uYWJsZSIgaXMgZmxleGlibGUsIGJ1dAorCSAgICBpbnN0YW50bHkgcmVib290aW5nIHdpdGhvdXQgbG9nZ2luZyBhbnl0aGluZyB3b3VsZCBiZSB1bmZyaWVuZGx5LgorCitjb25maWcgVk1BUF9TVEFDSworCWRlZmF1bHQgeQorCWJvb2wgIlVzZSBhIHZpcnR1YWxseS1tYXBwZWQgc3RhY2siCisJZGVwZW5kcyBvbiBIQVZFX0FSQ0hfVk1BUF9TVEFDSyAmJiAhS0FTQU4KKwktLS1oZWxwLS0tCisJICBFbmFibGUgdGhpcyBpZiB5b3Ugd2FudCB0aGUgdXNlIHZpcnR1YWxseS1tYXBwZWQga2VybmVsIHN0YWNrcworCSAgd2l0aCBndWFyZCBwYWdlcy4gIFRoaXMgY2F1c2VzIGtlcm5lbCBzdGFjayBvdmVyZmxvd3MgdG8gYmUKKwkgIGNhdWdodCBpbW1lZGlhdGVseSByYXRoZXIgdGhhbiBjYXVzaW5nIGRpZmZpY3VsdC10by1kaWFnbm9zZQorCSAgY29ycnVwdGlvbi4KKworCSAgVGhpcyBpcyBwcmVzZW50bHkgaW5jb21wYXRpYmxlIHdpdGggS0FTQU4gYmVjYXVzZSBLQVNBTiBleHBlY3RzCisJICB0aGUgc3RhY2sgdG8gbWFwIGRpcmVjdGx5IHRvIHRoZSBLQVNBTiBzaGFkb3cgbWFwIHVzaW5nIGEgZm9ybXVsYQorCSAgdGhhdCBpcyBpbmNvcnJlY3QgaWYgdGhlIHN0YWNrIGlzIGluIHZtYWxsb2Mgc3BhY2UuCisKIHNvdXJjZSAia2VybmVsL2djb3YvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggYzQxOWI0My4uNDY2ZTQyZSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTM3MSwxNCArMzcxLDYgQEAKIAlyZXR1cm4gX19jdV9sZW47CiB9CiAKLWV4dGVybiBpbmxpbmUgbG9uZwotX19jb3B5X3RvZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBsb25nIGxlbiwgY29uc3Qgdm9pZCBfX3VzZXIgKnZhbGlkYXRlKQotewotCWlmIChfX2FjY2Vzc19vaygodW5zaWduZWQgbG9uZyl2YWxpZGF0ZSwgbGVuLCBnZXRfZnMoKSkpCi0JCWxlbiA9IF9fY29weV90b2Zyb21fdXNlcl9ub2NoZWNrKHRvLCBmcm9tLCBsZW4pOwotCXJldHVybiBsZW47Ci19Ci0KICNkZWZpbmUgX19jb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pCQkJCQlcCiAoewkJCQkJCQkJCVwKIAlfX2Noa191c2VyX3B0cih0byk7CQkJCQkJXApAQCAtMzkzLDE3ICszODUsMjIgQEAKICNkZWZpbmUgX19jb3B5X3RvX3VzZXJfaW5hdG9taWMgX19jb3B5X3RvX3VzZXIKICNkZWZpbmUgX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyBfX2NvcHlfZnJvbV91c2VyCiAKLQogZXh0ZXJuIGlubGluZSBsb25nCiBjb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBsb25nIG4pCiB7Ci0JcmV0dXJuIF9fY29weV90b2Zyb21fdXNlcigoX19mb3JjZSB2b2lkICopdG8sIGZyb20sIG4sIHRvKTsKKwlpZiAobGlrZWx5KF9fYWNjZXNzX29rKCh1bnNpZ25lZCBsb25nKXRvLCBuLCBnZXRfZnMoKSkpKQorCQluID0gX19jb3B5X3RvZnJvbV91c2VyX25vY2hlY2soKF9fZm9yY2Ugdm9pZCAqKXRvLCBmcm9tLCBuKTsKKwlyZXR1cm4gbjsKIH0KIAogZXh0ZXJuIGlubGluZSBsb25nCiBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIGxvbmcgbikKIHsKLQlyZXR1cm4gX19jb3B5X3RvZnJvbV91c2VyKHRvLCAoX19mb3JjZSB2b2lkICopZnJvbSwgbiwgZnJvbSk7CisJaWYgKGxpa2VseShfX2FjY2Vzc19vaygodW5zaWduZWQgbG9uZylmcm9tLCBuLCBnZXRfZnMoKSkpKQorCQluID0gX19jb3B5X3RvZnJvbV91c2VyX25vY2hlY2sodG8sIChfX2ZvcmNlIHZvaWQgKilmcm9tLCBuKTsKKwllbHNlCisJCW1lbXNldCh0bywgMCwgbik7CisJcmV0dXJuIG47CiB9CiAKIGV4dGVybiB2b2lkIF9fZG9fY2xlYXJfdXNlcih2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL0tjb25maWcgYi9hcmNoL2FyYy9LY29uZmlnCmluZGV4IDBkM2U1OWYuLmVjZDEyMzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL0tjb25maWcKKysrIGIvYXJjaC9hcmMvS2NvbmZpZwpAQCAtMTMsNyArMTMsNyBAQAogCXNlbGVjdCBDTEtTUkNfT0YKIAlzZWxlY3QgQ0xPTkVfQkFDS1dBUkRTCiAJc2VsZWN0IENPTU1PTl9DTEsKLQlzZWxlY3QgR0VORVJJQ19BVE9NSUM2NAorCXNlbGVjdCBHRU5FUklDX0FUT01JQzY0IGlmICFJU0FfQVJDVjIgfHwgIShBUkNfSEFTX0xMNjQgJiYgQVJDX0hBU19MTFNDKQogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCiAJc2VsZWN0IEdFTkVSSUNfRklORF9GSVJTVF9CSVQKIAkjIGZvciBub3csIHdlIGRvbid0IG5lZWQgR0VORVJJQ19JUlFfUFJPQkUsIENPTkZJR19HRU5FUklDX0lSUV9DSElQCkBAIC0zNTMsOCArMzUzLDggQEAKIAogY29uZmlnIE5PREVTX1NISUZUCiAJaW50ICJNYXhpbXVtIE5VTUEgTm9kZXMgKGFzIGEgcG93ZXIgb2YgMikiCi0JZGVmYXVsdCAiMSIgaWYgIURJU0NPTlRJR01FTQotCWRlZmF1bHQgIjIiIGlmIERJU0NPTlRJR01FTQorCWRlZmF1bHQgIjAiIGlmICFESVNDT05USUdNRU0KKwlkZWZhdWx0ICIxIiBpZiBESVNDT05USUdNRU0KIAlkZXBlbmRzIG9uIE5FRURfTVVMVElQTEVfTk9ERVMKIAktLS1oZWxwLS0tCiAJICBBY2Nlc3NpbmcgbWVtb3J5IGJleW9uZCAxR0IgKHdpdGggb3Igdy9vIFBBRSkgcmVxdWlyZXMgMiBtZW1vcnkKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL01ha2VmaWxlIGIvYXJjaC9hcmMvTWFrZWZpbGUKaW5kZXggNjAxZWQxNy4uYWE4MmQxMyAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvTWFrZWZpbGUKKysrIGIvYXJjaC9hcmMvTWFrZWZpbGUKQEAgLTQ3LDcgKzQ3LDYgQEAKIAogdXB0b19nY2M0NCAgICA6PSAgJChjYWxsIGNjLWlmdmVyc2lvbiwgLWxlLCAwNDA0LCB5KQogYXRsZWFzdF9nY2M0NCA6PSAgJChjYWxsIGNjLWlmdmVyc2lvbiwgLWdlLCAwNDA0LCB5KQotYXRsZWFzdF9nY2M0OCA6PSAgJChjYWxsIGNjLWlmdmVyc2lvbiwgLWdlLCAwNDA4LCB5KQogCiBjZmxhZ3MtJChhdGxlYXN0X2djYzQ0KQkJCSs9IC1mc2VjdGlvbi1hbmNob3JzCiAKQEAgLTY2LDEwICs2NSw4IEBACiAKIGVuZGlmCiAKLSMgQnkgZGVmYXVsdCBnY2MgNC44IGdlbmVyYXRlcyBkd2FyZjQgd2hpY2gga2VybmVsIHVud2luZGVyIGNhbid0IGdyb2sKLWlmZXEgKCQoYXRsZWFzdF9nY2M0OCkseSkKLWNmbGFncy0kKENPTkZJR19BUkNfRFcyX1VOV0lORCkJCSs9IC1nZHdhcmYtMgotZW5kaWYKK2NmaSA6PSAkKGNhbGwgYXMtaW5zdHIsLmNmaV9zdGFydHByb2Ncbi5jZmlfZW5kcHJvYywtREFSQ19EVzJfVU5XSU5EX0FTX0NGSSkKK2NmbGFncy0kKENPTkZJR19BUkNfRFcyX1VOV0lORCkJCSs9IC1mYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgJChjZmkpCiAKIGlmbmRlZiBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUKICMgR2VuZXJpYyBidWlsZCBzeXN0ZW0gdXNlcyAtTzIsIHdlIHdhbnQgLU8zCmRpZmYgLS1naXQgYS9hcmNoL2FyYy9ib290L2R0cy9hYmlsaXNfdGIxMDBfZHZrLmR0cyBiL2FyY2gvYXJjL2Jvb3QvZHRzL2FiaWxpc190YjEwMF9kdmsuZHRzCmluZGV4IDNkZDZlZDkuLjNhY2YwNGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2Jvb3QvZHRzL2FiaWxpc190YjEwMF9kdmsuZHRzCisrKyBiL2FyY2gvYXJjL2Jvb3QvZHRzL2FiaWxpc190YjEwMF9kdmsuZHRzCkBAIC0yNCw2ICsyNCw3IEBACiAvaW5jbHVkZS8gImFiaWxpc190YjEwMC5kdHNpIgogCiAvIHsKKwltb2RlbCA9ICJhYmlsaXMsdGIxMDAiOwogCWNob3NlbiB7CiAJCWJvb3RhcmdzID0gImVhcmx5Y29uPXVhcnQ4MjUwLG1taW8zMiwweGZmMTAwMDAwLDk2MDBuOCBjb25zb2xlPXR0eVMwLDk2MDBuOCI7CiAJfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2Jvb3QvZHRzL2FiaWxpc190YjEwMV9kdmsuZHRzIGIvYXJjaC9hcmMvYm9vdC9kdHMvYWJpbGlzX3RiMTAxX2R2ay5kdHMKaW5kZXggMWNmNTFjMi4uMzdkODhjNSAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvYm9vdC9kdHMvYWJpbGlzX3RiMTAxX2R2ay5kdHMKKysrIGIvYXJjaC9hcmMvYm9vdC9kdHMvYWJpbGlzX3RiMTAxX2R2ay5kdHMKQEAgLTI0LDYgKzI0LDcgQEAKIC9pbmNsdWRlLyAiYWJpbGlzX3RiMTAxLmR0c2kiCiAKIC8geworCW1vZGVsID0gImFiaWxpcyx0YjEwMSI7CiAJY2hvc2VuIHsKIAkJYm9vdGFyZ3MgPSAiZWFybHljb249dWFydDgyNTAsbW1pbzMyLDB4ZmYxMDAwMDAsOTYwMG44IGNvbnNvbGU9dHR5UzAsOTYwMG44IjsKIAl9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvYm9vdC9kdHMvYXhzMTAxLmR0cyBiL2FyY2gvYXJjL2Jvb3QvZHRzL2F4czEwMS5kdHMKaW5kZXggM2Y5YjA1OC4uZDliOWI5ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvYm9vdC9kdHMvYXhzMTAxLmR0cworKysgYi9hcmNoL2FyYy9ib290L2R0cy9heHMxMDEuZHRzCkBAIC0xMyw2ICsxMyw3IEBACiAvaW5jbHVkZS8gImF4czEweF9tYi5kdHNpIgogCiAvIHsKKwltb2RlbCA9ICJzbnBzLGF4czEwMSI7CiAJY29tcGF0aWJsZSA9ICJzbnBzLGF4czEwMSIsICJzbnBzLGFyYy1zZHAiOwogCiAJY2hvc2VuIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2Jvb3QvZHRzL2F4czEwMy5kdHMgYi9hcmNoL2FyYy9ib290L2R0cy9heHMxMDMuZHRzCmluZGV4IGU2ZDBlMzEuLmVjN2ZiMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2Jvb3QvZHRzL2F4czEwMy5kdHMKKysrIGIvYXJjaC9hcmMvYm9vdC9kdHMvYXhzMTAzLmR0cwpAQCAtMTYsNiArMTYsNyBAQAogL2luY2x1ZGUvICJheHMxMHhfbWIuZHRzaSIKIAogLyB7CisJbW9kZWwgPSAic25wcyxheHMxMDMiOwogCWNvbXBhdGlibGUgPSAic25wcyxheHMxMDMiLCAic25wcyxhcmMtc2RwIjsKIAogCWNob3NlbiB7CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9ib290L2R0cy9heHMxMDNfaWR1LmR0cyBiL2FyY2gvYXJjL2Jvb3QvZHRzL2F4czEwM19pZHUuZHRzCmluZGV4IGY5OTlmZWYuLjA3MGMyOTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2Jvb3QvZHRzL2F4czEwM19pZHUuZHRzCisrKyBiL2FyY2gvYXJjL2Jvb3QvZHRzL2F4czEwM19pZHUuZHRzCkBAIC0xNiw2ICsxNiw3IEBACiAvaW5jbHVkZS8gImF4czEweF9tYi5kdHNpIgogCiAvIHsKKwltb2RlbCA9ICJzbnBzLGF4czEwMy1zbXAiOwogCWNvbXBhdGlibGUgPSAic25wcyxheHMxMDMiLCAic25wcyxhcmMtc2RwIjsKIAogCWNob3NlbiB7CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9ib290L2R0cy9uc2ltXzcwMC5kdHMgYi9hcmNoL2FyYy9ib290L2R0cy9uc2ltXzcwMC5kdHMKaW5kZXggNjM5NzA1MS4uY2UwY2NkMjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2Jvb3QvZHRzL25zaW1fNzAwLmR0cworKysgYi9hcmNoL2FyYy9ib290L2R0cy9uc2ltXzcwMC5kdHMKQEAgLTEwLDYgKzEwLDcgQEAKIC9pbmNsdWRlLyAic2tlbGV0b24uZHRzaSIKIAogLyB7CisJbW9kZWwgPSAic25wcyxuc2ltIjsKIAljb21wYXRpYmxlID0gInNucHMsbnNpbSI7CiAJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJI3NpemUtY2VsbHMgPSA8MT47CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9ib290L2R0cy9uc2ltX2hzLmR0cyBiL2FyY2gvYXJjL2Jvb3QvZHRzL25zaW1faHMuZHRzCmluZGV4IGJmMDVmZTUuLjM3NzJjNDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2Jvb3QvZHRzL25zaW1faHMuZHRzCisrKyBiL2FyY2gvYXJjL2Jvb3QvZHRzL25zaW1faHMuZHRzCkBAIC0xMCw2ICsxMCw3IEBACiAvaW5jbHVkZS8gInNrZWxldG9uX2hzLmR0c2kiCiAKIC8geworCW1vZGVsID0gInNucHMsbnNpbV9ocyI7CiAJY29tcGF0aWJsZSA9ICJzbnBzLG5zaW1faHMiOwogCSNhZGRyZXNzLWNlbGxzID0gPDI+OwogCSNzaXplLWNlbGxzID0gPDI+OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvYm9vdC9kdHMvbnNpbV9oc19pZHUuZHRzIGIvYXJjaC9hcmMvYm9vdC9kdHMvbnNpbV9oc19pZHUuZHRzCmluZGV4IDk5ZWFiZTEuLjQ4NDM0ZDdjIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9ib290L2R0cy9uc2ltX2hzX2lkdS5kdHMKKysrIGIvYXJjaC9hcmMvYm9vdC9kdHMvbnNpbV9oc19pZHUuZHRzCkBAIC0xMCw2ICsxMCw3IEBACiAvaW5jbHVkZS8gInNrZWxldG9uX2hzX2lkdS5kdHNpIgogCiAvIHsKKwltb2RlbCA9ICJzbnBzLG5zaW1faHMtc21wIjsKIAljb21wYXRpYmxlID0gInNucHMsbnNpbV9ocyI7CiAJaW50ZXJydXB0LXBhcmVudCA9IDwmY29yZV9pbnRjPjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvYm9vdC9kdHMvbnNpbW9zY2kuZHRzIGIvYXJjaC9hcmMvYm9vdC9kdHMvbnNpbW9zY2kuZHRzCmluZGV4IGU2NTlhMzQuLmJjZjYwMzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2Jvb3QvZHRzL25zaW1vc2NpLmR0cworKysgYi9hcmNoL2FyYy9ib290L2R0cy9uc2ltb3NjaS5kdHMKQEAgLTEwLDYgKzEwLDcgQEAKIC9pbmNsdWRlLyAic2tlbGV0b24uZHRzaSIKIAogLyB7CisJbW9kZWwgPSAic25wcyxuc2ltb3NjaSI7CiAJY29tcGF0aWJsZSA9ICJzbnBzLG5zaW1vc2NpIjsKIAkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkjc2l6ZS1jZWxscyA9IDwxPjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2Jvb3QvZHRzL25zaW1vc2NpX2hzLmR0cyBiL2FyY2gvYXJjL2Jvb3QvZHRzL25zaW1vc2NpX2hzLmR0cwppbmRleCAxNmNlNWQ2Li4xNGE3MjdjIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9ib290L2R0cy9uc2ltb3NjaV9ocy5kdHMKKysrIGIvYXJjaC9hcmMvYm9vdC9kdHMvbnNpbW9zY2lfaHMuZHRzCkBAIC0xMCw2ICsxMCw3IEBACiAvaW5jbHVkZS8gInNrZWxldG9uX2hzLmR0c2kiCiAKIC8geworCW1vZGVsID0gInNucHMsbnNpbW9zY2lfaHMiOwogCWNvbXBhdGlibGUgPSAic25wcyxuc2ltb3NjaV9ocyI7CiAJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJI3NpemUtY2VsbHMgPSA8MT47CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9ib290L2R0cy9uc2ltb3NjaV9oc19pZHUuZHRzIGIvYXJjaC9hcmMvYm9vdC9kdHMvbnNpbW9zY2lfaHNfaWR1LmR0cwppbmRleCBjZThkZmJjLi5jYmY2NWI2IDEwMDY0NAotLS0gYS9hcmNoL2FyYy9ib290L2R0cy9uc2ltb3NjaV9oc19pZHUuZHRzCisrKyBiL2FyY2gvYXJjL2Jvb3QvZHRzL25zaW1vc2NpX2hzX2lkdS5kdHMKQEAgLTEwLDYgKzEwLDcgQEAKIC9pbmNsdWRlLyAic2tlbGV0b25faHNfaWR1LmR0c2kiCiAKIC8geworCW1vZGVsID0gInNucHMsbnNpbW9zY2lfaHMtc21wIjsKIAljb21wYXRpYmxlID0gInNucHMsbnNpbW9zY2lfaHMiOwogCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCSNzaXplLWNlbGxzID0gPDE+OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvYm9vdC9kdHMvdmRrX2hzMzguZHRzIGIvYXJjaC9hcmMvYm9vdC9kdHMvdmRrX2hzMzguZHRzCmluZGV4IDVkODAzZGQuLjNjNTExMDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2Jvb3QvZHRzL3Zka19oczM4LmR0cworKysgYi9hcmNoL2FyYy9ib290L2R0cy92ZGtfaHMzOC5kdHMKQEAgLTEzLDYgKzEzLDcgQEAKIC9pbmNsdWRlLyAidmRrX2F4czEweF9tYi5kdHNpIgogCiAvIHsKKwltb2RlbCA9ICJzbnBzLHZka19hcmNocyI7CiAJY29tcGF0aWJsZSA9ICJzbnBzLGF4czEwMyI7CiAKIAljaG9zZW4gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvYm9vdC9kdHMvdmRrX2hzMzhfc21wLmR0cyBiL2FyY2gvYXJjL2Jvb3QvZHRzL3Zka19oczM4X3NtcC5kdHMKaW5kZXggMmJhNjBjMzkuLjZiZTY4MDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2Jvb3QvZHRzL3Zka19oczM4X3NtcC5kdHMKKysrIGIvYXJjaC9hcmMvYm9vdC9kdHMvdmRrX2hzMzhfc21wLmR0cwpAQCAtMTMsNiArMTMsNyBAQAogL2luY2x1ZGUvICJ2ZGtfYXhzMTB4X21iLmR0c2kiCiAKIC8geworCW1vZGVsID0gInNucHMsdmRrX2FyY2hzLXNtcCI7CiAJY29tcGF0aWJsZSA9ICJzbnBzLGF4czEwMyI7CiAKIAljaG9zZW4gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvYm9vdC9kdHMvemVidV9ocy5kdHMgYi9hcmNoL2FyYy9ib290L2R0cy96ZWJ1X2hzLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzEzMjRlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcmMvYm9vdC9kdHMvemVidV9ocy5kdHMKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNi0yMDE0IFN5bm9wc3lzLCBJbmMuICh3d3cuc3lub3BzeXMuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKy9kdHMtdjEvOworCisvaW5jbHVkZS8gInNrZWxldG9uX2hzLmR0c2kiCisKKy8geworCW1vZGVsID0gInNucHMsemVidV9ocyI7CisJY29tcGF0aWJsZSA9ICJzbnBzLHplYnVfaHMiOworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCWludGVycnVwdC1wYXJlbnQgPSA8JmNvcmVfaW50Yz47CisKKwltZW1vcnkgeworCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOworCQlyZWcgPSA8MHg4MDAwMDAwMCAweDIwMDAwMDAwPjsJLyogNTEyICovCisJfTsKKworCWNob3NlbiB7CisJCWJvb3RhcmdzID0gImVhcmx5Y29uPXVhcnQ4MjUwLG1taW8zMiwweGYwMDAwMDAwLDExNTIwMG44IGNvbnNvbGU9dHR5UzAsMTE1MjAwbjggZGVidWcgcHJpbnQtZmF0YWwtc2lnbmFscz0xIjsKKwl9OworCisJYWxpYXNlcyB7CisJCXNlcmlhbDAgPSAmdWFydDA7CisJfTsKKworCWZwZ2EgeworCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisKKwkJLyogY2hpbGQgYW5kIHBhcmVudCBhZGRyZXNzIHNwYWNlIDE6MSBtYXBwZWQgKi8KKwkJcmFuZ2VzOworCisJCWNvcmVfY2xrOiBjb3JlX2NsayB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZpeGVkLWNsb2NrIjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDw1MDAwMDAwMD47CisJCX07CisKKwkJY29yZV9pbnRjOiBpbnRlcnJ1cHQtY29udHJvbGxlciB7CisJCQljb21wYXRpYmxlID0gInNucHMsYXJjaHMtaW50YyI7CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCX07CisKKwkJdWFydDA6IHNlcmlhbEBmMDAwMDAwMCB7CisJCQljb21wYXRpYmxlID0gIm5zODI1MCI7CisJCQlyZWcgPSA8MHhmMDAwMDAwMCAweDIwMDA+OworCQkJaW50ZXJydXB0cyA9IDwyND47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8NTAwMDAwMDA+OworCQkJYmF1ZCA9IDwxMTUyMDA+OworCQkJcmVnLXNoaWZ0ID0gPDI+OworCQkJcmVnLWlvLXdpZHRoID0gPDQ+OworCQkJbm8tbG9vcGJhY2stdGVzdCA9IDwxPjsKKwkJfTsKKworCQlhcmNwY3QwOiBwY3QgeworCQkJY29tcGF0aWJsZSA9ICJzbnBzLGFyY2hzLXBjdCI7CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJaW50ZXJydXB0cyA9IDwyMD47CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9ib290L2R0cy96ZWJ1X2hzX2lkdS5kdHMgYi9hcmNoL2FyYy9ib290L2R0cy96ZWJ1X2hzX2lkdS5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUyMDRiNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJjL2Jvb3QvZHRzL3plYnVfaHNfaWR1LmR0cwpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2LTIwMTQgU3lub3BzeXMsIEluYy4gKHd3dy5zeW5vcHN5cy5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworL2R0cy12MS87CisKKy9pbmNsdWRlLyAic2tlbGV0b25faHNfaWR1LmR0c2kiCisKKy8geworCW1vZGVsID0gInNucHMsemVidV9ocy1zbXAiOworCWNvbXBhdGlibGUgPSAic25wcyx6ZWJ1X2hzIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZjb3JlX2ludGM+OworCisJbWVtb3J5IHsKKwkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKKwkJcmVnID0gPDB4ODAwMDAwMDAgMHgyMDAwMDAwMD47CS8qIDUxMiAqLworCX07CisKKwljaG9zZW4geworCQlib290YXJncyA9ICJlYXJseWNvbj11YXJ0ODI1MCxtbWlvMzIsMHhmMDAwMDAwMCwxMTUyMDBuOCBjb25zb2xlPXR0eVMwLDExNTIwMG44IGRlYnVnIjsKKwl9OworCisJYWxpYXNlcyB7CisJCXNlcmlhbDAgPSAmdWFydDA7CisJfTsKKworCWZwZ2EgeworCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisKKwkJLyogY2hpbGQgYW5kIHBhcmVudCBhZGRyZXNzIHNwYWNlIDE6MSBtYXBwZWQgKi8KKwkJcmFuZ2VzOworCisJCWNvcmVfY2xrOiBjb3JlX2NsayB7CisJCQkjY2xvY2stY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gImZpeGVkLWNsb2NrIjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDw1MDAwMDAwMD47CS8qIDUwIE1IWiAqLworCQl9OworCisJCWNvcmVfaW50YzogaW50ZXJydXB0LWNvbnRyb2xsZXIgeworCQkJY29tcGF0aWJsZSA9ICJzbnBzLGFyY2hzLWludGMiOworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworLyoJCQlpbnRlcnJ1cHRzID0gPDE2IDE3IDE4IDE5IDIwIDIxIDIyIDIzIDI0IDI1PjsgKi8KKwkJfTsKKworCQlpZHVfaW50YzogaWR1LWludGVycnVwdC1jb250cm9sbGVyIHsKKwkJCWNvbXBhdGlibGUgPSAic25wcyxhcmNocy1pZHUtaW50YyI7CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JmNvcmVfaW50Yz47CisJCQkvKiA8aHdpcnEgIGRpc3RyaWJ1dGlvbj4KKwkJCWRpc3RyaWJ1dGlvbjogMD1SUjsgMT1jcHUwLCAyPWNwdTEsIDQ9Y3B1MiwgOD1jcHUzICovCisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQkJaW50ZXJydXB0cyA9IDwyNCAyNSAyNiAyNyAyOCAyOSAzMCAzMT47CisKKwkJfTsKKworCQl1YXJ0MDogc2VyaWFsQGYwMDAwMDAwIHsKKwkJCS8qIGNvbXBhdGlibGUgPSAibnM4MjUwIjsgRG9lc24ndCB1c2UgRklGT3MgKi8KKwkJCWNvbXBhdGlibGUgPSAibnMxNjU1MGEiOworCQkJcmVnID0gPDB4ZjAwMDAwMDAgMHgyMDAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlkdV9pbnRjPjsKKwkJCS8qIGludGVycnVwdHMgPSA8MCAxPjsgIERFU1Q9MSovCisJCQkvKiBpbnRlcnJ1cHRzID0gPDAgMj47ICBERVNUPTIqLworCQkJaW50ZXJydXB0cyA9IDwwIDA+OyAgLyogUlIqLworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDUwMDAwMDAwPjsKKwkJCWJhdWQgPSA8MTE1MjAwPjsKKwkJCXJlZy1zaGlmdCA9IDwyPjsKKwkJCXJlZy1pby13aWR0aCA9IDw0PjsKKwkJCW5vLWxvb3BiYWNrLXRlc3QgPSA8MT47CisJCX07CisKKwkJYXJjcGN0MDogcGN0IHsKKwkJCWNvbXBhdGlibGUgPSAic25wcyxhcmNocy1wY3QiOworCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCWludGVycnVwdHMgPSA8MjA+OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvY29uZmlncy9heHMxMDFfZGVmY29uZmlnIGIvYXJjaC9hcmMvY29uZmlncy9heHMxMDFfZGVmY29uZmlnCmluZGV4IDZjZGZmZWEuLjBhMGVhZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2NvbmZpZ3MvYXhzMTAxX2RlZmNvbmZpZworKysgYi9hcmNoL2FyYy9jb25maWdzL2F4czEwMV9kZWZjb25maWcKQEAgLTE4LDYgKzE4LDkgQEAKICMgQ09ORklHX1NMVUJfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CiBDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQ9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQ9eQogQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CiBDT05GSUdfQVJDX1BMQVRfQVhTMTBYPXkKIENPTkZJR19BWFMxMDE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvY29uZmlncy9heHMxMDNfZGVmY29uZmlnIGIvYXJjaC9hcmMvY29uZmlncy9heHMxMDNfZGVmY29uZmlnCmluZGV4IDQ5MWIzYjUuLjIyMzNmNTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2NvbmZpZ3MvYXhzMTAzX2RlZmNvbmZpZworKysgYi9hcmNoL2FyYy9jb25maWdzL2F4czEwM19kZWZjb25maWcKQEAgLTE4LDYgKzE4LDkgQEAKICMgQ09ORklHX1NMVUJfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CiBDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQ9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQ9eQogQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CiBDT05GSUdfQVJDX1BMQVRfQVhTMTBYPXkKIENPTkZJR19BWFMxMDM9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvY29uZmlncy9heHMxMDNfc21wX2RlZmNvbmZpZyBiL2FyY2gvYXJjL2NvbmZpZ3MvYXhzMTAzX3NtcF9kZWZjb25maWcKaW5kZXggYjI1ZWU3My4uMTEwODc0NyAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvY29uZmlncy9heHMxMDNfc21wX2RlZmNvbmZpZworKysgYi9hcmNoL2FyYy9jb25maWdzL2F4czEwM19zbXBfZGVmY29uZmlnCkBAIC0xOCw2ICsxOCw5IEBACiAjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKIENPTkZJR19TTEFCPXkKIENPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRD15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CitDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRD15CiBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKIENPTkZJR19BUkNfUExBVF9BWFMxMFg9eQogQ09ORklHX0FYUzEwMz15CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9jb25maWdzL25zaW1faHNfZGVmY29uZmlnIGIvYXJjaC9hcmMvY29uZmlncy9uc2ltX2hzX2RlZmNvbmZpZwppbmRleCBhOTlkYzdhLi42NWFiOWZiIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9jb25maWdzL25zaW1faHNfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJjL2NvbmZpZ3MvbnNpbV9oc19kZWZjb25maWcKQEAgLTExLDEzICsxMSwxNiBAQAogIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKICMgQ09ORklHX1BJRF9OUyBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQotQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9Ii4uL2FyY19pbml0cmFtZnNfaHMvIgorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9Ii4uLy4uL2FyY19pbml0cmFtZnNfaHMvIgogQ09ORklHX0tBTExTWU1TX0FMTD15CiBDT05GSUdfRU1CRURERUQ9eQogIyBDT05GSUdfU0xVQl9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKIENPTkZJR19LUFJPQkVTPXkKIENPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRD15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CitDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRD15CiAjIENPTkZJR19MQkRBRiBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JT1NDSEVEX0RFQURMSU5FIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2NvbmZpZ3MvbnNpbV9oc19zbXBfZGVmY29uZmlnIGIvYXJjaC9hcmMvY29uZmlncy9uc2ltX2hzX3NtcF9kZWZjb25maWcKaW5kZXggNTlmMjIxZi4uM2IzOTkwYyAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvY29uZmlncy9uc2ltX2hzX3NtcF9kZWZjb25maWcKKysrIGIvYXJjaC9hcmMvY29uZmlncy9uc2ltX2hzX3NtcF9kZWZjb25maWcKQEAgLTE2LDYgKzE2LDkgQEAKICMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAogQ09ORklHX0tQUk9CRVM9eQogQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKK0NPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKICMgQ09ORklHX0xCREFGIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvY29uZmlncy96ZWJ1X2hzX2RlZmNvbmZpZyBiL2FyY2gvYXJjL2NvbmZpZ3MvemVidV9oc19kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY2MTY2YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJjL2NvbmZpZ3MvemVidV9oc19kZWZjb25maWcKQEAgLTAsMCArMSw4NiBAQAorQ09ORklHX0RFRkFVTFRfSE9TVE5BTUU9IkFSQ0xpbnV4IgorIyBDT05GSUdfU1dBUCBpcyBub3Qgc2V0CitDT05GSUdfU1lTVklQQz15CitDT05GSUdfUE9TSVhfTVFVRVVFPXkKKyMgQ09ORklHX0NST1NTX01FTU9SWV9BVFRBQ0ggaXMgbm90IHNldAorQ09ORklHX05PX0haX0lETEU9eQorQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CitDT05GSUdfSUtDT05GSUc9eQorQ09ORklHX0lLQ09ORklHX1BST0M9eQorQ09ORklHX05BTUVTUEFDRVM9eQorIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BJRF9OUyBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9Ii4uLy4uL2FyY19pbml0cmFtZnNfaHMvIgorQ09ORklHX0VYUEVSVD15CitDT05GSUdfUEVSRl9FVkVOVFM9eQorIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CitDT05GSUdfU0xBQj15CitDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19MQkRBRiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfQ0ZRIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNfUExBVF9TSU09eQorQ09ORklHX0lTQV9BUkNWMj15CitDT05GSUdfQVJDX0JVSUxUSU5fRFRCX05BTUU9InplYnVfaHMiCitDT05GSUdfUFJFRU1QVD15CisjIENPTkZJR19DT01QQUNUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19ORVQ9eQorQ09ORklHX1BBQ0tFVD15CitDT05GSUdfUEFDS0VUX0RJQUc9eQorQ09ORklHX1VOSVg9eQorQ09ORklHX1VOSVhfRElBRz15CitDT05GSUdfTkVUX0tFWT15CitDT05GSUdfSU5FVD15CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19XSVJFTEVTUyBpcyBub3Qgc2V0CitDT05GSUdfREVWVE1QRlM9eQorIyBDT05GSUdfU1RBTkRBTE9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZJUk1XQVJFX0lOX0tFUk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX05FVF9WRU5ET1JfQVJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfQlJPQURDT00gaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9JTlRFTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX01BUlZFTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9NSUNSRUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9OQVRTRU1JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfU0VFUSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1NUTUlDUk8gaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9WSUEgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9XSVpORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTiBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfRVZERVY9eQorQ09ORklHX01PVVNFX1BTMl9UT1VDSEtJVD15CisjIENPTkZJR19TRVJJT19TRVJQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJT19BUkNfUFMyPXkKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAorQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz0xCitDT05GSUdfU0VSSUFMXzgyNTBfUlVOVElNRV9VQVJUUz0xCitDT05GSUdfU0VSSUFMXzgyNTBfRFc9eQorQ09ORklHX1NFUklBTF9PRl9QTEFURk9STT15CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorQ09ORklHX0ZCPXkKK0NPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKK0NPTkZJR19MT0dPPXkKKyMgQ09ORklHX0hJRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19JT01NVV9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQyX0ZTPXkKK0NPTkZJR19FWFQyX0ZTX1hBVFRSPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19NSVNDX0ZJTEVTWVNURU1TIGlzIG5vdCBzZXQKK0NPTkZJR19ORlNfRlM9eQorIyBDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQ9eQorIyBDT05GSUdfREVCVUdfUFJFRU1QVCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9jb25maWdzL3plYnVfaHNfc21wX2RlZmNvbmZpZyBiL2FyY2gvYXJjL2NvbmZpZ3MvemVidV9oc19zbXBfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZTk2OTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FyYy9jb25maWdzL3plYnVfaHNfc21wX2RlZmNvbmZpZwpAQCAtMCwwICsxLDg5IEBACitDT05GSUdfREVGQVVMVF9IT1NUTkFNRT0iQVJDTGludXgiCisjIENPTkZJR19TV0FQIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19QT1NJWF9NUVVFVUU9eQorIyBDT05GSUdfQ1JPU1NfTUVNT1JZX0FUVEFDSCBpcyBub3Qgc2V0CitDT05GSUdfTk9fSFpfSURMRT15CitDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKK0NPTkZJR19JS0NPTkZJRz15CitDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfTkFNRVNQQUNFUz15CisjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAorIyBDT05GSUdfUElEX05TIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iLi4vLi4vYXJjX2luaXRyYW1mc19ocy8iCitDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX1BFUkZfRVZFTlRTPXkKKyMgQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAorQ09ORklHX1NMQUI9eQorQ09ORklHX0tQUk9CRVM9eQorQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTEJEQUYgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0NGUSBpcyBub3Qgc2V0CitDT05GSUdfQVJDX1BMQVRfU0lNPXkKK0NPTkZJR19JU0FfQVJDVjI9eQorQ09ORklHX1NNUD15CitDT05GSUdfQVJDX0JVSUxUSU5fRFRCX05BTUU9InplYnVfaHNfaWR1IgorQ09ORklHX1BSRUVNUFQ9eQorIyBDT05GSUdfQ09NUEFDVElPTiBpcyBub3Qgc2V0CitDT05GSUdfTkVUPXkKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1BBQ0tFVF9ESUFHPXkKK0NPTkZJR19VTklYPXkKK0NPTkZJR19VTklYX0RJQUc9eQorQ09ORklHX05FVF9LRVk9eQorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfV0lSRUxFU1MgaXMgbm90IHNldAorQ09ORklHX0RFVlRNUEZTPXkKKyMgQ09ORklHX1NUQU5EQUxPTkUgaXMgbm90IHNldAorIyBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRCBpcyBub3Qgc2V0CisjIENPTkZJR19GSVJNV0FSRV9JTl9LRVJORUwgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFViBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19ORVRfVkVORE9SX0FSQyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX0JST0FEQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfSU5URUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9NQVJWRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfTUlDUkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfTkFUU0VNSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1NFRVEgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9TVE1JQ1JPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfV0laTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dMQU4gaXMgbm90IHNldAorQ09ORklHX0lOUFVUX0VWREVWPXkKK0NPTkZJR19NT1VTRV9QUzJfVE9VQ0hLSVQ9eQorIyBDT05GSUdfU0VSSU9fU0VSUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSU9fQVJDX1BTMj15CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9MQorQ09ORklHX1NFUklBTF84MjUwX1JVTlRJTUVfVUFSVFM9MQorQ09ORklHX1NFUklBTF84MjUwX0RXPXkKK0NPTkZJR19TRVJJQUxfT0ZfUExBVEZPUk09eQorIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19GQj15CitDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15CitDT05GSUdfTE9HTz15CisjIENPTkZJR19ISUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSU9NTVVfU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfRVhUMl9GUz15CitDT05GSUdfRVhUMl9GU19YQVRUUj15CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfTUlTQ19GSUxFU1lTVEVNUyBpcyBub3Qgc2V0CitDT05GSUdfTkZTX0ZTPXkKKyMgQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQgaXMgbm90IHNldAorIyBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX0xPQ0tVUF9ERVRFQ1RPUj15CisjIENPTkZJR19ERUJVR19QUkVFTVBUIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2FyY3JlZ3MuaCBiL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2FyY3JlZ3MuaAppbmRleCA3ZmJhZWEwLi5kYjI1YzY1IDEwMDY0NAotLS0gYS9hcmNoL2FyYy9pbmNsdWRlL2FzbS9hcmNyZWdzLmgKKysrIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vYXJjcmVncy5oCkBAIC05NSw3ICs5NSw3IEBACiAvKiBBdXhpbGlhcnkgcmVnaXN0ZXJzICovCiAjZGVmaW5lIEFVWF9JREVOVElUWQkJNAogI2RlZmluZSBBVVhfSU5UUl9WRUNfQkFTRQkweDI1Ci0jZGVmaW5lIEFVWF9OT05fVk9MCQkweDVlCisjZGVmaW5lIEFVWF9WT0wJCQkweDVlCiAKIC8qCiAgKiBGbG9hdGluZyBQdCBSZWdpc3RlcnMKQEAgLTI0MCwxNCArMjQwLDYgQEAKICNlbmRpZgogfTsKIAotc3RydWN0IGJjcl9wZXJpcCB7Ci0jaWZkZWYgQ09ORklHX0NQVV9CSUdfRU5ESUFOCi0JdW5zaWduZWQgaW50IHN0YXJ0OjgsIHBhZDI6OCwgc3o6OCwgdmVyOjg7Ci0jZWxzZQotCXVuc2lnbmVkIGludCB2ZXI6OCwgc3o6OCwgcGFkMjo4LCBzdGFydDo4OwotI2VuZGlmCi19OwotCiBzdHJ1Y3QgYmNyX2ljY21fYXJjb21wYWN0IHsKICNpZmRlZiBDT05GSUdfQ1BVX0JJR19FTkRJQU4KIAl1bnNpZ25lZCBpbnQgYmFzZToxNiwgcGFkOjUsIHN6OjMsIHZlcjo4OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL2FyYy9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCA0ZTNjMWI2Li5iNjU5MzBhIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9pbmNsdWRlL2FzbS9hdG9taWMuaAorKysgYi9hcmNoL2FyYy9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtMjAsNiArMjAsNyBAQAogI2lmbmRlZiBDT05GSUdfQVJDX1BMQVRfRVpOUFMKIAogI2RlZmluZSBhdG9taWNfcmVhZCh2KSAgUkVBRF9PTkNFKCh2KS0+Y291bnRlcikKKyNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJeyAoaSkgfQogCiAjaWZkZWYgQ09ORklHX0FSQ19IQVNfTExTQwogCkBAIC0yODQsNiArMjg1LDcgQEAKIEFUT01JQ19PUFMoYWRkLCArPSwgQ1RPUF9JTlNUX0FBRERfRElfUjJfUjJfUjMpCiAjZGVmaW5lIGF0b21pY19zdWIoaSwgdikgYXRvbWljX2FkZCgtKGkpLCAodikpCiAjZGVmaW5lIGF0b21pY19zdWJfcmV0dXJuKGksIHYpIGF0b21pY19hZGRfcmV0dXJuKC0oaSksICh2KSkKKyNkZWZpbmUgYXRvbWljX2ZldGNoX3N1YihpLCB2KSBhdG9taWNfZmV0Y2hfYWRkKC0oaSksICh2KSkKIAogI3VuZGVmIEFUT01JQ19PUFMKICNkZWZpbmUgQVRPTUlDX09QUyhvcCwgY19vcCwgYXNtX29wKQkJCQkJXApAQCAtMjkyLDYgKzI5NCw3IEBACiAKIEFUT01JQ19PUFMoYW5kLCAmPSwgQ1RPUF9JTlNUX0FBTkRfRElfUjJfUjJfUjMpCiAjZGVmaW5lIGF0b21pY19hbmRub3QobWFzaywgdikgYXRvbWljX2FuZCh+KG1hc2spLCAodikpCisjZGVmaW5lIGF0b21pY19mZXRjaF9hbmRub3QobWFzaywgdikgYXRvbWljX2ZldGNoX2FuZCh+KG1hc2spLCAodikpCiBBVE9NSUNfT1BTKG9yLCB8PSwgQ1RPUF9JTlNUX0FPUl9ESV9SMl9SMl9SMykKIEFUT01JQ19PUFMoeG9yLCBePSwgQ1RPUF9JTlNUX0FYT1JfRElfUjJfUjJfUjMpCiAKQEAgLTM0MywxMCArMzQ2LDI2NiBAQAogCiAjZGVmaW5lIGF0b21pY19hZGRfbmVnYXRpdmUoaSwgdikJKGF0b21pY19hZGRfcmV0dXJuKGksIHYpIDwgMCkKIAotI2RlZmluZSBBVE9NSUNfSU5JVChpKQkJCXsgKGkpIH0KKworI2lmZGVmIENPTkZJR19HRU5FUklDX0FUT01JQzY0CiAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9hdG9taWM2NC5oPgogCi0jZW5kaWYKKyNlbHNlCS8qIEtjb25maWcgZW5zdXJlcyB0aGlzIGlzIG9ubHkgZW5hYmxlZCB3aXRoIG5lZWRlZCBoL3cgYXNzaXN0ICovCisKKy8qCisgKiBBUkN2MiBzdXBwb3J0cyA2NC1iaXQgZXhjbHVzaXZlIGxvYWQgKExMT0NLRCkgLyBzdG9yZSAoU0NPTkREKQorICogIC0gVGhlIGFkZHJlc3MgSEFTIHRvIGJlIDY0LWJpdCBhbGlnbmVkCisgKiAgLSBUaGVyZSBhcmUgMiBzZW1hbnRpY3MgaW52b2x2ZWQgaGVyZToKKyAqICAgID0gZXhjbHVzaXZlIGltcGxpZXMgbm8gaW50ZXJpbSB1cGRhdGUgYmV0d2VlbiBsb2FkL3N0b3JlIHRvIHNhbWUgYWRkcgorICogICAgPSBib3RoIHdvcmRzIGFyZSBvYnNlcnZlZC91cGRhdGVkIHRvZ2V0aGVyOiB0aGlzIGlzIGd1YXJhbnRlZWQgZXZlbgorICogICAgICBmb3IgcmVndWxhciA2NC1iaXQgbG9hZCAoTEREKSAvIHN0b3JlIChTVEQpLiBUaHVzIGF0b21pYzY0X3NldCgpCisgKiAgICAgIGlzIE5PVCByZXF1aXJlZCB0byB1c2UgTExPQ0tEK1NDT05ERCwgU1REIHN1ZmZpY2VzCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCWFsaWduZWRfdTY0IGNvdW50ZXI7Cit9IGF0b21pYzY0X3Q7CisKKyNkZWZpbmUgQVRPTUlDNjRfSU5JVChhKSB7IChhKSB9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBsb25nIGF0b21pYzY0X3JlYWQoY29uc3QgYXRvbWljNjRfdCAqdikKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdmFsOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJIglsZGQgICAlMCwgWyUxXQlcbiIKKwk6ICI9ciIodmFsKQorCTogInIiKCZ2LT5jb3VudGVyKSk7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljNjRfc2V0KGF0b21pYzY0X3QgKnYsIGxvbmcgbG9uZyBhKQoreworCS8qCisJICogVGhpcyBjb3VsZCBoYXZlIGJlZW4gYSBzaW1wbGUgYXNzaWdubWVudCBpbiAiQyIgYnV0IHdvdWxkIG5lZWQKKwkgKiBleHBsaWNpdCB2b2xhdGlsZS4gT3RoZXJ3aXNlIGdjYyBvcHRpbWl6ZXJzIGNvdWxkIGVsaWRlIHRoZSBzdG9yZQorCSAqIHdoaWNoIGJvcmtlZCBhdG9taWM2NCBzZWxmLXRlc3QKKwkgKiBJbiB0aGUgaW5saW5lIGFzbSB2ZXJzaW9uLCBtZW1vcnkgY2xvYmJlciBuZWVkZWQgZm9yIGV4YWN0IHNhbWUKKwkgKiByZWFzb24sIHRvIHRlbGwgZ2NjIGFib3V0IHRoZSBzdG9yZS4KKwkgKgorCSAqIFRoaXMgaG93ZXZlciBpcyBub3QgbmVlZGVkIGZvciBzaWJsaW5nIGF0b21pYzY0X2FkZCgpIGV0YyBzaW5jZSBib3RoCisJICogbG9hZC9zdG9yZSBhcmUgZXhwbGljaXRseSBkb25lIGluIGlubGluZSBhc20uIEFzIGxvbmcgYXMgQVBJIGlzIHVzZWQKKwkgKiBmb3IgZWFjaCBhY2Nlc3MsIGdjYyBoYXMgbm8gd2F5IHRvIG9wdGltaXplIGF3YXkgYW55IGxvYWQvc3RvcmUKKwkgKi8KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkiCXN0ZCAgICUwLCBbJTFdCVxuIgorCToKKwk6ICJyIihhKSwgInIiKCZ2LT5jb3VudGVyKQorCTogIm1lbW9yeSIpOworfQorCisjZGVmaW5lIEFUT01JQzY0X09QKG9wLCBvcDEsIG9wMikJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWM2NF8jI29wKGxvbmcgbG9uZyBhLCBhdG9taWM2NF90ICp2KQkJXAorewkJCQkJCQkJCVwKKwl1bnNpZ25lZCBsb25nIGxvbmcgdmFsOwkJCQkJCVwKKwkJCQkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCisJIjE6CQkJCVxuIgkJCQlcCisJIglsbG9ja2QgICUwLCBbJTFdCVxuIgkJCQlcCisJIgkiICNvcDEgIiAlTDAsICVMMCwgJUwyCVxuIgkJCQlcCisJIgkiICNvcDIgIiAlSDAsICVIMCwgJUgyCVxuIgkJCQlcCisJIglzY29uZGQgICAlMCwgWyUxXQlcbiIJCQkJXAorCSIJYm56ICAgICAxYgkJXG4iCQkJCVwKKwk6ICI9JnIiKHZhbCkJCQkJCQkJXAorCTogInIiKCZ2LT5jb3VudGVyKSwgImlyIihhKQkJCQkJXAorCTogImNjIik7CQkJCQkJXAorfQkJCQkJCQkJCVwKKworI2RlZmluZSBBVE9NSUM2NF9PUF9SRVRVUk4ob3AsIG9wMSwgb3AyKQkJICAgICAgICAJXAorc3RhdGljIGlubGluZSBsb25nIGxvbmcgYXRvbWljNjRfIyNvcCMjX3JldHVybihsb25nIGxvbmcgYSwgYXRvbWljNjRfdCAqdikJXAorewkJCQkJCQkJCVwKKwl1bnNpZ25lZCBsb25nIGxvbmcgdmFsOwkJCQkJCVwKKwkJCQkJCQkJCVwKKwlzbXBfbWIoKTsJCQkJCQkJXAorCQkJCQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKKwkiMToJCQkJXG4iCQkJCVwKKwkiCWxsb2NrZCAgICUwLCBbJTFdCVxuIgkJCQlcCisJIgkiICNvcDEgIiAlTDAsICVMMCwgJUwyCVxuIgkJCQlcCisJIgkiICNvcDIgIiAlSDAsICVIMCwgJUgyCVxuIgkJCQlcCisJIglzY29uZGQgICAlMCwgWyUxXQlcbiIJCQkJXAorCSIJYm56ICAgICAxYgkJXG4iCQkJCVwKKwk6IFt2YWxdICI9JnIiKHZhbCkJCQkJCQlcCisJOiAiciIoJnYtPmNvdW50ZXIpLCAiaXIiKGEpCQkJCQlcCisJOiAiY2MiKTsJLyogbWVtb3J5IGNsb2JiZXIgY29tZXMgZnJvbSBzbXBfbWIoKSAqLwlcCisJCQkJCQkJCQlcCisJc21wX21iKCk7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlyZXR1cm4gdmFsOwkJCQkJCQlcCit9CisKKyNkZWZpbmUgQVRPTUlDNjRfRkVUQ0hfT1Aob3AsIG9wMSwgb3AyKQkJICAgICAgICAJCVwKK3N0YXRpYyBpbmxpbmUgbG9uZyBsb25nIGF0b21pYzY0X2ZldGNoXyMjb3AobG9uZyBsb25nIGEsIGF0b21pYzY0X3QgKnYpCVwKK3sJCQkJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBsb25nIHZhbCwgb3JpZzsJCQkJCVwKKwkJCQkJCQkJCVwKKwlzbXBfbWIoKTsJCQkJCQkJXAorCQkJCQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKKwkiMToJCQkJXG4iCQkJCVwKKwkiCWxsb2NrZCAgICUwLCBbJTJdCVxuIgkJCQlcCisJIgkiICNvcDEgIiAlTDEsICVMMCwgJUwzCVxuIgkJCQlcCisJIgkiICNvcDIgIiAlSDEsICVIMCwgJUgzCVxuIgkJCQlcCisJIglzY29uZGQgICAlMSwgWyUyXQlcbiIJCQkJXAorCSIJYm56ICAgICAxYgkJXG4iCQkJCVwKKwk6ICI9JnIiKG9yaWcpLCAiPSZyIih2YWwpCQkJCQlcCisJOiAiciIoJnYtPmNvdW50ZXIpLCAiaXIiKGEpCQkJCQlcCisJOiAiY2MiKTsJLyogbWVtb3J5IGNsb2JiZXIgY29tZXMgZnJvbSBzbXBfbWIoKSAqLwlcCisJCQkJCQkJCQlcCisJc21wX21iKCk7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlyZXR1cm4gb3JpZzsJCQkJCQkJXAorfQorCisjZGVmaW5lIEFUT01JQzY0X09QUyhvcCwgb3AxLCBvcDIpCQkJCQlcCisJQVRPTUlDNjRfT1Aob3AsIG9wMSwgb3AyKQkJCQkJXAorCUFUT01JQzY0X09QX1JFVFVSTihvcCwgb3AxLCBvcDIpCQkJCVwKKwlBVE9NSUM2NF9GRVRDSF9PUChvcCwgb3AxLCBvcDIpCisKKyNkZWZpbmUgYXRvbWljNjRfYW5kbm90IGF0b21pYzY0X2FuZG5vdAorCitBVE9NSUM2NF9PUFMoYWRkLCBhZGQuZiwgYWRjKQorQVRPTUlDNjRfT1BTKHN1Yiwgc3ViLmYsIHNiYykKK0FUT01JQzY0X09QUyhhbmQsIGFuZCwgYW5kKQorQVRPTUlDNjRfT1BTKGFuZG5vdCwgYmljLCBiaWMpCitBVE9NSUM2NF9PUFMob3IsIG9yLCBvcikKK0FUT01JQzY0X09QUyh4b3IsIHhvciwgeG9yKQorCisjdW5kZWYgQVRPTUlDNjRfT1BTCisjdW5kZWYgQVRPTUlDNjRfRkVUQ0hfT1AKKyN1bmRlZiBBVE9NSUM2NF9PUF9SRVRVUk4KKyN1bmRlZiBBVE9NSUM2NF9PUAorCitzdGF0aWMgaW5saW5lIGxvbmcgbG9uZworYXRvbWljNjRfY21weGNoZyhhdG9taWM2NF90ICpwdHIsIGxvbmcgbG9uZyBleHBlY3RlZCwgbG9uZyBsb25nIG5ldykKK3sKKwlsb25nIGxvbmcgcHJldjsKKworCXNtcF9tYigpOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJIjE6CWxsb2NrZCAgJTAsIFslMV0JXG4iCisJIglicm5lICAgICVMMCwgJUwyLCAyZglcbiIKKwkiCWJybmUgICAgJUgwLCAlSDIsIDJmCVxuIgorCSIJc2NvbmRkICAlMywgWyUxXQlcbiIKKwkiCWJueiAgICAgMWIJCVxuIgorCSIyOgkJCQlcbiIKKwk6ICI9JnIiKHByZXYpCisJOiAiciIocHRyKSwgImlyIihleHBlY3RlZCksICJyIihuZXcpCisJOiAiY2MiKTsJLyogbWVtb3J5IGNsb2JiZXIgY29tZXMgZnJvbSBzbXBfbWIoKSAqLworCisJc21wX21iKCk7CisKKwlyZXR1cm4gcHJldjsKK30KKworc3RhdGljIGlubGluZSBsb25nIGxvbmcgYXRvbWljNjRfeGNoZyhhdG9taWM2NF90ICpwdHIsIGxvbmcgbG9uZyBuZXcpCit7CisJbG9uZyBsb25nIHByZXY7CisKKwlzbXBfbWIoKTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCSIxOglsbG9ja2QgICUwLCBbJTFdCVxuIgorCSIJc2NvbmRkICAlMiwgWyUxXQlcbiIKKwkiCWJueiAgICAgMWIJCVxuIgorCSIyOgkJCQlcbiIKKwk6ICI9JnIiKHByZXYpCisJOiAiciIocHRyKSwgInIiKG5ldykKKwk6ICJjYyIpOwkvKiBtZW1vcnkgY2xvYmJlciBjb21lcyBmcm9tIHNtcF9tYigpICovCisKKwlzbXBfbWIoKTsKKworCXJldHVybiBwcmV2OworfQorCisvKioKKyAqIGF0b21pYzY0X2RlY19pZl9wb3NpdGl2ZSAtIGRlY3JlbWVudCBieSAxIGlmIG9sZCB2YWx1ZSBwb3NpdGl2ZQorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWM2NF90CisgKgorICogVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIG9sZCB2YWx1ZSBvZiAqdiBtaW51cyAxLCBldmVuIGlmCisgKiB0aGUgYXRvbWljIHZhcmlhYmxlLCB2LCB3YXMgbm90IGRlY3JlbWVudGVkLgorICovCisKK3N0YXRpYyBpbmxpbmUgbG9uZyBsb25nIGF0b21pYzY0X2RlY19pZl9wb3NpdGl2ZShhdG9taWM2NF90ICp2KQoreworCWxvbmcgbG9uZyB2YWw7CisKKwlzbXBfbWIoKTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCSIxOglsbG9ja2QgICUwLCBbJTFdCVxuIgorCSIJc3ViLmYgICAlTDAsICVMMCwgMQkjIHcwIC0gMSwgc2V0IEMgb24gYm9ycm93XG4iCisJIglzdWIuYyAgICVIMCwgJUgwLCAxCSMgaWYgQyBzZXQsIHcxIC0gMVxuIgorCSIJYnJsdCAgICAlSDAsIDAsIDJmCVxuIgorCSIJc2NvbmRkICAlMCwgWyUxXQlcbiIKKwkiCWJueiAgICAgMWIJCVxuIgorCSIyOgkJCQlcbiIKKwk6ICI9JnIiKHZhbCkKKwk6ICJyIigmdi0+Y291bnRlcikKKwk6ICJjYyIpOwkvKiBtZW1vcnkgY2xvYmJlciBjb21lcyBmcm9tIHNtcF9tYigpICovCisKKwlzbXBfbWIoKTsKKworCXJldHVybiB2YWw7Cit9CisKKy8qKgorICogYXRvbWljNjRfYWRkX3VubGVzcyAtIGFkZCB1bmxlc3MgdGhlIG51bWJlciBpcyBhIGdpdmVuIHZhbHVlCisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pYzY0X3QKKyAqIEBhOiB0aGUgYW1vdW50IHRvIGFkZCB0byB2Li4uCisgKiBAdTogLi4udW5sZXNzIHYgaXMgZXF1YWwgdG8gdS4KKyAqCisgKiBpZiAodiAhPSB1KSB7IHYgKz0gYTsgcmV0ID0gMX0gZWxzZSB7cmV0ID0gMH0KKyAqIFJldHVybnMgMSBpZmYgQHYgd2FzIG5vdCBAdSAoaS5lLiBpZiBhZGQgYWN0dWFsbHkgaGFwcGVuZWQpCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pYzY0X2FkZF91bmxlc3MoYXRvbWljNjRfdCAqdiwgbG9uZyBsb25nIGEsIGxvbmcgbG9uZyB1KQoreworCWxvbmcgbG9uZyB2YWw7CisJaW50IG9wX2RvbmU7CisKKwlzbXBfbWIoKTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCSIxOglsbG9ja2QgICUwLCBbJTJdCVxuIgorCSIJbW92CSUxLCAxCQlcbiIKKwkiCWJybmUJJUwwLCAlTDQsIDJmCSMgY29udGludWUgdG8gYWRkIHNpbmNlIHYgIT0gdSBcbiIKKwkiCWJyZXEuZAklSDAsICVINCwgM2YJIyByZXR1cm4gc2luY2UgdiA9PSB1IFxuIgorCSIJbW92CSUxLCAwCQlcbiIKKwkiMjoJCQkJXG4iCisJIglhZGQuZiAgICVMMCwgJUwwLCAlTDMJXG4iCisJIglhZGMgICAgICVIMCwgJUgwLCAlSDMJXG4iCisJIglzY29uZGQgICUwLCBbJTJdCVxuIgorCSIJYm56ICAgICAxYgkJXG4iCisJIjM6CQkJCVxuIgorCTogIj0mciIodmFsKSwgIj0mciIgKG9wX2RvbmUpCisJOiAiciIoJnYtPmNvdW50ZXIpLCAiciIoYSksICJyIih1KQorCTogImNjIik7CS8qIG1lbW9yeSBjbG9iYmVyIGNvbWVzIGZyb20gc21wX21iKCkgKi8KKworCXNtcF9tYigpOworCisJcmV0dXJuIG9wX2RvbmU7Cit9CisKKyNkZWZpbmUgYXRvbWljNjRfYWRkX25lZ2F0aXZlKGEsIHYpCShhdG9taWM2NF9hZGRfcmV0dXJuKChhKSwgKHYpKSA8IDApCisjZGVmaW5lIGF0b21pYzY0X2luYyh2KQkJCWF0b21pYzY0X2FkZCgxTEwsICh2KSkKKyNkZWZpbmUgYXRvbWljNjRfaW5jX3JldHVybih2KQkJYXRvbWljNjRfYWRkX3JldHVybigxTEwsICh2KSkKKyNkZWZpbmUgYXRvbWljNjRfaW5jX2FuZF90ZXN0KHYpCShhdG9taWM2NF9pbmNfcmV0dXJuKHYpID09IDApCisjZGVmaW5lIGF0b21pYzY0X3N1Yl9hbmRfdGVzdChhLCB2KQkoYXRvbWljNjRfc3ViX3JldHVybigoYSksICh2KSkgPT0gMCkKKyNkZWZpbmUgYXRvbWljNjRfZGVjKHYpCQkJYXRvbWljNjRfc3ViKDFMTCwgKHYpKQorI2RlZmluZSBhdG9taWM2NF9kZWNfcmV0dXJuKHYpCQlhdG9taWM2NF9zdWJfcmV0dXJuKDFMTCwgKHYpKQorI2RlZmluZSBhdG9taWM2NF9kZWNfYW5kX3Rlc3QodikJKGF0b21pYzY0X2RlY19yZXR1cm4oKHYpKSA9PSAwKQorI2RlZmluZSBhdG9taWM2NF9pbmNfbm90X3plcm8odikJYXRvbWljNjRfYWRkX3VubGVzcygodiksIDFMTCwgMExMKQorCisjZW5kaWYJLyogIUNPTkZJR19HRU5FUklDX0FUT01JQzY0ICovCisKKyNlbmRpZgkvKiAhX19BU1NFTUJMWV9fICovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvaW5jbHVkZS9hc20vY2FjaGUuaCBiL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2NhY2hlLmgKaW5kZXggMjM3MDZjNi4uZmI3ODFlMyAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvaW5jbHVkZS9hc20vY2FjaGUuaAorKysgYi9hcmNoL2FyYy9pbmNsdWRlL2FzbS9jYWNoZS5oCkBAIC01NCw3ICs1NCw3IEBACiBleHRlcm4gdm9pZCByZWFkX2RlY29kZV9jYWNoZV9iY3Iodm9pZCk7CiAKIGV4dGVybiBpbnQgaW9jX2V4aXN0czsKLWV4dGVybiB1bnNpZ25lZCBsb25nIHBlcmlwX2Jhc2U7CitleHRlcm4gdW5zaWduZWQgbG9uZyBwZXJpcF9iYXNlLCBwZXJpcF9lbmQ7CiAKICNlbmRpZgkvKiAhX19BU1NFTUJMWV9fICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2R3YXJmLmggYi9hcmNoL2FyYy9pbmNsdWRlL2FzbS9kd2FyZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiN2JkYmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FyYy9pbmNsdWRlL2FzbS9kd2FyZi5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYtMTcgU3lub3BzeXMsIEluYy4gKHd3dy5zeW5vcHN5cy5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9BU01fQVJDX0RXQVJGX0gKKyNkZWZpbmUgX0FTTV9BUkNfRFdBUkZfSAorCisjaWZkZWYgX19BU1NFTUJMWV9fCisKKyNpZmRlZiBBUkNfRFcyX1VOV0lORF9BU19DRkkKKworI2RlZmluZSBDRklfU1RBUlRQUk9DCS5jZmlfc3RhcnRwcm9jCisjZGVmaW5lIENGSV9FTkRQUk9DCS5jZmlfZW5kcHJvYworI2RlZmluZSBDRklfREVGX0NGQQkuY2ZpX2RlZl9jZmEKKyNkZWZpbmUgQ0ZJX1JFR0lTVEVSCS5jZmlfcmVnaXN0ZXIKKyNkZWZpbmUgQ0ZJX1JFTF9PRkZTRVQJLmNmaV9yZWxfb2Zmc2V0CisjZGVmaW5lIENGSV9VTkRFRklORUQJLmNmaV91bmRlZmluZWQKKworI2Vsc2UKKworI2RlZmluZSBDRklfSUdOT1JFCSMKKworI2RlZmluZSBDRklfU1RBUlRQUk9DCUNGSV9JR05PUkUKKyNkZWZpbmUgQ0ZJX0VORFBST0MJQ0ZJX0lHTk9SRQorI2RlZmluZSBDRklfREVGX0NGQQlDRklfSUdOT1JFCisjZGVmaW5lIENGSV9SRUdJU1RFUglDRklfSUdOT1JFCisjZGVmaW5lIENGSV9SRUxfT0ZGU0VUCUNGSV9JR05PUkUKKyNkZWZpbmUgQ0ZJX1VOREVGSU5FRAlDRklfSUdOT1JFCisKKyNlbmRpZgkvKiAhQVJDX0RXMl9VTldJTkRfQVNfQ0ZJICovCisKKyNlbmRpZgkvKiBfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmCS8qIF9BU01fQVJDX0RXQVJGX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2VsZi5oIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vZWxmLmgKaW5kZXggNTFhOTllMi4uNzA5NmY5NyAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvaW5jbHVkZS9hc20vZWxmLmgKKysrIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vZWxmLmgKQEAgLTIzLDggKzIzLDcgQEAKIC8qIEFSQyBSZWxvY2F0aW9ucyAoa2VybmVsIE1vZHVsZXMgb25seSkgKi8KICNkZWZpbmUgIFJfQVJDXzMyCQkweDQKICNkZWZpbmUgIFJfQVJDXzMyX01FCQkweDFCCi0jZGVmaW5lICBSX0FSQ19TMjVIX1BDUkVMCTB4MTAKLSNkZWZpbmUgIFJfQVJDX1MyNVdfUENSRUwJMHgxMQorI2RlZmluZSAgUl9BUkNfMzJfUENSRUwJCTB4MzEKIAogLyp0byBzZXQgcGFyYW1ldGVycyBpbiB0aGUgY29yZSBkdW1wcyAqLwogI2RlZmluZSBFTEZfQVJDSAkJRU1fQVJDT01QQUNUCmRpZmYgLS1naXQgYS9hcmNoL2FyYy9pbmNsdWRlL2FzbS9lbnRyeS5oIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vZW50cnkuaAppbmRleCBhZDc4NjBjLi41MTU5N2YzIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9pbmNsdWRlL2FzbS9lbnRyeS5oCisrKyBiL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2VudHJ5LmgKQEAgLTE0Miw3ICsxNDIsNyBAQAogCiAjaWZkZWYgQ09ORklHX0FSQ19DVVJSX0lOX1JFRwogCTsgUmV0cmlldmUgb3JpZyByMjUgYW5kIHNhdmUgaXQgd2l0aCByZXN0IG9mIGNhbGxlZV9yZWdzCi0JbGQuYXMgICByMTIsIFtyMTIsIFBUX3VzZXJfcjI1XQorCWxkCXIxMiwgW3IxMiwgUFRfdXNlcl9yMjVdCiAJUFVTSAlyMTIKICNlbHNlCiAJUFVTSAlyMjUKQEAgLTE5OCw3ICsxOTgsNyBAQAogCiAJOyBTUCBpcyBiYWNrIHRvIHN0YXJ0IG9mIHB0X3JlZ3MKICNpZmRlZiBDT05GSUdfQVJDX0NVUlJfSU5fUkVHCi0Jc3QuYXMgICByMTIsIFtzcCwgUFRfdXNlcl9yMjVdCisJc3QJcjEyLCBbc3AsIFBUX3VzZXJfcjI1XQogI2VuZGlmCiAuZW5kbQogCmRpZmYgLS1naXQgYS9hcmNoL2FyYy9pbmNsdWRlL2FzbS9pcnFmbGFncy1hcmN2Mi5oIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vaXJxZmxhZ3MtYXJjdjIuaAppbmRleCBkMWVjN2Y2Li5lODgwZGZhIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9pbmNsdWRlL2FzbS9pcnFmbGFncy1hcmN2Mi5oCisrKyBiL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2lycWZsYWdzLWFyY3YyLmgKQEAgLTExMiw3ICsxMTIsNyBAQAogCSAqLwogCXRlbXAgPSAoMSA8PCA1KSB8CiAJCSgoISEodGVtcCAmIFNUQVRVU19JRV9NQVNLKSkgPDwgQ0xSSV9TVEFUVVNfSUVfQklUKSB8Ci0JCSh0ZW1wICYgQ0xSSV9TVEFUVVNfRV9NQVNLKTsKKwkJKCh0ZW1wID4+IDEpICYgQ0xSSV9TVEFUVVNfRV9NQVNLKTsKIAlyZXR1cm4gdGVtcDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvaW5jbHVkZS9hc20vaXJxZmxhZ3MtY29tcGFjdC5oIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vaXJxZmxhZ3MtY29tcGFjdC5oCmluZGV4IGMxZDM2NDUuLjRjNmVlZDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2lycWZsYWdzLWNvbXBhY3QuaAorKysgYi9hcmNoL2FyYy9pbmNsdWRlL2FzbS9pcnFmbGFncy1jb21wYWN0LmgKQEAgLTE4OCwxMCArMTg4LDEwIEBACiAuZW5kbQogCiAubWFjcm8gSVJRX0VOQUJMRSAgc2NyYXRjaAorCVRSQUNFX0FTTV9JUlFfRU5BQkxFCiAJbHIJXHNjcmF0Y2gsIFtzdGF0dXMzMl0KIAlvcglcc2NyYXRjaCwgXHNjcmF0Y2gsIChTVEFUVVNfRTFfTUFTSyB8IFNUQVRVU19FMl9NQVNLKQogCWZsYWcJXHNjcmF0Y2gKLQlUUkFDRV9BU01fSVJRX0VOQUJMRQogLmVuZG0KIAogI2VuZGlmCS8qIF9fQVNTRU1CTFlfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvaW5jbHVkZS9hc20vbGlua2FnZS5oIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vbGlua2FnZS5oCmluZGV4IDVmYWFkMTcuLmIyOWYxYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2xpbmthZ2UuaAorKysgYi9hcmNoL2FyYy9pbmNsdWRlL2FzbS9saW5rYWdlLmgKQEAgLTksNiArOSw4IEBACiAjaWZuZGVmIF9fQVNNX0xJTktBR0VfSAogI2RlZmluZSBfX0FTTV9MSU5LQUdFX0gKIAorI2luY2x1ZGUgPGFzbS9kd2FyZi5oPgorCiAjaWZkZWYgX19BU1NFTUJMWV9fCiAKICNkZWZpbmUgQVNNX05MCQkgYAkvKiB1c2UgJ2AnIHRvIG1hcmsgbmV3IGxpbmUgaW4gbWFjcm8gKi8KQEAgLTMyLDYgKzM0LDE2IEBACiAjZW5kaWYKIC5lbmRtCiAKKyNkZWZpbmUgRU5UUllfQ0ZJKG5hbWUpCQlcCisJLmdsb2JsIG5hbWUgQVNNX05MCVwKKwlBTElHTiBBU01fTkwgCQlcCisJbmFtZTogQVNNX05MCQlcCisJQ0ZJX1NUQVJUUFJPQyBBU01fTkwKKworI2RlZmluZSBFTkRfQ0ZJKG5hbWUpIAkJXAorCUNGSV9FTkRQUk9DIEFTTV9OTAlcCisJLnNpemUgbmFtZSwgLi1uYW1lCisKICNlbHNlCS8qICFfX0FTU0VNQkxZX18gKi8KIAogI2lmZGVmIENPTkZJR19BUkNfSEFTX0lDQ00KZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2luY2x1ZGUvYXNtL3BlcmZfZXZlbnQuaCBiL2FyY2gvYXJjL2luY2x1ZGUvYXNtL3BlcmZfZXZlbnQuaAppbmRleCA1ZjA3MTc2Li45MTg1NTQxIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9pbmNsdWRlL2FzbS9wZXJmX2V2ZW50LmgKKysrIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vcGVyZl9ldmVudC5oCkBAIC0xMTgsNiArMTE4LDkgQEAKIAlbUEVSRl9DT1VOVF9BUkNfSUNNXSA9ICJpY20iLAkJLyogSS1jYWNoZSBNaXNzICovCiAJW1BFUkZfQ09VTlRfQVJDX0VEVExCXSA9ICJlZHRsYiIsCS8qIEQtVExCIE1pc3MgKi8KIAlbUEVSRl9DT1VOVF9BUkNfRUlUTEJdID0gImVpdGxiIiwJLyogSS1UTEIgTWlzcyAqLworCisJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVGRVJFTkNFU10gPSAiaW1lbXJkYyIsCS8qIEluc3RyOiBtZW0gcmVhZCBjYWNoZWQgKi8KKwlbUEVSRl9DT1VOVF9IV19DQUNIRV9NSVNTRVNdID0gImRjbG0iLAkJLyogRC1jYWNoZSBMb2FkIE1pc3MgKi8KIH07CiAKICNkZWZpbmUgQyhfeCkJCQlQRVJGX0NPVU5UX0hXX0NBQ0hFXyMjX3gKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gvYXJjL2luY2x1ZGUvYXNtL3BndGFibGUuaAppbmRleCAwZjkyZDk3Li44OWVlYjM3IDEwMDY0NAotLS0gYS9hcmNoL2FyYy9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKKysrIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vcGd0YWJsZS5oCkBAIC0yODAsNyArMjgwLDcgQEAKIAogI2RlZmluZSBwdGVfcGFnZShwdGUpCQlwZm5fdG9fcGFnZShwdGVfcGZuKHB0ZSkpCiAjZGVmaW5lIG1rX3B0ZShwYWdlLCBwcm90KQlwZm5fcHRlKHBhZ2VfdG9fcGZuKHBhZ2UpLCBwcm90KQotI2RlZmluZSBwZm5fcHRlKHBmbiwgcHJvdCkJKF9fcHRlKCgocHRlX3QpKHBmbikgPDwgUEFHRV9TSElGVCkgfCBwZ3Byb3RfdmFsKHByb3QpKSkKKyNkZWZpbmUgcGZuX3B0ZShwZm4sIHByb3QpCV9fcHRlKCgocGZuKSA8PCBQQUdFX1NISUZUKSB8IHBncHJvdF92YWwocHJvdCkpCiAKIC8qIERvbid0IHVzZSB2aXJ0X3RvX3BmbiBmb3IgbWFjcm9zIGJlbG93OiBjb3VsZCBjYXVzZSB0cnVuY2F0aW9ucyBmb3IgUEFFNDAqLwogI2RlZmluZSBwdGVfcGZuKHB0ZSkJCShwdGVfdmFsKHB0ZSkgPj4gUEFHRV9TSElGVCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gvYXJjL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCBhNzhkNTY3Li40MWZhZjE3IDEwMDY0NAotLS0gYS9hcmNoL2FyYy9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC04Myw3ICs4MywxMCBAQAogCSIyOgk7bm9wXG4iCQkJCVwKIAkiCS5zZWN0aW9uIC5maXh1cCwgXCJheFwiXG4iCVwKIAkiCS5hbGlnbiA0XG4iCQkJXAotCSIzOgltb3YgJTAsICUzXG4iCQkJXAorCSIzOgkjIHJldHVybiAtRUZBVUxUXG4iCQlcCisJIgltb3YgJTAsICUzXG4iCQkJXAorCSIJIyB6ZXJvIG91dCBkc3QgcHRyXG4iCQlcCisJIgltb3YgJTEsICAwXG4iCQkJXAogCSIJaiAgIDJiXG4iCQkJXAogCSIJLnByZXZpb3VzXG4iCQkJXAogCSIJLnNlY3Rpb24gX19leF90YWJsZSwgXCJhXCJcbiIJXApAQCAtMTAxLDcgKzEwNCwxMSBAQAogCSIyOgk7bm9wXG4iCQkJCVwKIAkiCS5zZWN0aW9uIC5maXh1cCwgXCJheFwiXG4iCVwKIAkiCS5hbGlnbiA0XG4iCQkJXAotCSIzOgltb3YgJTAsICUzXG4iCQkJXAorCSIzOgkjIHJldHVybiAtRUZBVUxUXG4iCQlcCisJIgltb3YgJTAsICUzXG4iCQkJXAorCSIJIyB6ZXJvIG91dCBkc3QgcHRyXG4iCQlcCisJIgltb3YgJTEsICAwXG4iCQkJXAorCSIJbW92ICVSMSwgMFxuIgkJCVwKIAkiCWogICAyYlxuIgkJCVwKIAkiCS5wcmV2aW91c1xuIgkJCVwKIAkiCS5zZWN0aW9uIF9fZXhfdGFibGUsIFwiYVwiXG4iCVwKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2luY2x1ZGUvdWFwaS9hc20vZWxmLmggYi9hcmNoL2FyYy9pbmNsdWRlL3VhcGkvYXNtL2VsZi5oCmluZGV4IDBmOTlhYzguLjAwMzdhNTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2luY2x1ZGUvdWFwaS9hc20vZWxmLmgKKysrIGIvYXJjaC9hcmMvaW5jbHVkZS91YXBpL2FzbS9lbGYuaApAQCAtMTMsOCArMTMsMTUgQEAKIAogLyogTWFjaGluZSBzcGVjaWZpYyBFTEYgSGRyIGZsYWdzICovCiAjZGVmaW5lIEVGX0FSQ19PU0FCSV9NU0sJMHgwMDAwMGYwMAotI2RlZmluZSBFRl9BUkNfT1NBQklfT1JJRwkweDAwMDAwMDAwICAgLyogTVVTVCBiZSB6ZXJvIGZvciBiYWNrLWNvbXBhdCAqLwotI2RlZmluZSBFRl9BUkNfT1NBQklfQ1VSUkVOVAkweDAwMDAwMzAwICAgLyogdjMgKG5vIGxlZ2FjeSBzeXNjYWxscykgKi8KKworI2RlZmluZSBFRl9BUkNfT1NBQklfVjMJCTB4MDAwMDAzMDAgICAvKiB2MyAobm8gbGVnYWN5IHN5c2NhbGxzKSAqLworI2RlZmluZSBFRl9BUkNfT1NBQklfVjQJCTB4MDAwMDA0MDAgICAvKiB2NCAoNjRiaXQgZGF0YSBhbnkgcmVnIGFsaWduKSAqLworCisjaWYgX19HTlVDX18gPCA2CisjZGVmaW5lIEVGX0FSQ19PU0FCSV9DVVJSRU5UCUVGX0FSQ19PU0FCSV9WMworI2Vsc2UKKyNkZWZpbmUgRUZfQVJDX09TQUJJX0NVUlJFTlQJRUZfQVJDX09TQUJJX1Y0CisjZW5kaWYKIAogdHlwZWRlZiB1bnNpZ25lZCBsb25nIGVsZl9ncmVnX3Q7CiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgZWxmX2ZwcmVnc2V0X3Q7CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9rZXJuZWwvYXJja3N5bXMuYyBiL2FyY2gvYXJjL2tlcm5lbC9hcmNrc3ltcy5jCmluZGV4IDRkOWU3NzcuLjAwMGRkMDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2tlcm5lbC9hcmNrc3ltcy5jCisrKyBiL2FyY2gvYXJjL2tlcm5lbC9hcmNrc3ltcy5jCkBAIC0yOCw2ICsyOCw3IEBACiBleHRlcm4gdm9pZCBfX2RpdmRmMyh2b2lkKTsKIGV4dGVybiB2b2lkIF9fZmxvYXR1bnNpZGYodm9pZCk7CiBleHRlcm4gdm9pZCBfX2Zsb2F0dW5zaXNmKHZvaWQpOworZXh0ZXJuIHZvaWQgX191ZGl2ZGkzKHZvaWQpOwogCiBFWFBPUlRfU1lNQk9MKF9fYXNobGRpMyk7CiBFWFBPUlRfU1lNQk9MKF9fYXNocmRpMyk7CkBAIC00NSw2ICs0Niw3IEBACiBFWFBPUlRfU1lNQk9MKF9fZGl2ZGYzKTsKIEVYUE9SVF9TWU1CT0woX19mbG9hdHVuc2lkZik7CiBFWFBPUlRfU1lNQk9MKF9fZmxvYXR1bnNpc2YpOworRVhQT1JUX1NZTUJPTChfX3VkaXZkaTMpOwogCiAvKiBBUkMgb3B0aW1pc2VkIGFzc2VtYmxlciByb3V0aW5lcyAqLwogRVhQT1JUX1NZTUJPTChtZW1zZXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMva2VybmVsL2N0eF9zd19hc20uUyBiL2FyY2gvYXJjL2tlcm5lbC9jdHhfc3dfYXNtLlMKaW5kZXggZTY4OTBiMS4uN2MxZjM2NSAxMDA2NDQKLS0tIGEvYXJjaC9hcmMva2VybmVsL2N0eF9zd19hc20uUworKysgYi9hcmNoL2FyYy9rZXJuZWwvY3R4X3N3X2FzbS5TCkBAIC0yMyw2ICsyMyw3IEBACiAJLmdsb2JhbCBfX3N3aXRjaF90bwogCS50eXBlICAgX19zd2l0Y2hfdG8sIEBmdW5jdGlvbgogX19zd2l0Y2hfdG86CisJQ0ZJX1NUQVJUUFJPQwogCiAJLyogU2F2ZSByZWdzIG9uIGtlcm5lbCBtb2RlIHN0YWNrIG9mIHRhc2sgKi8KIAlzdC5hICAgIGJsaW5rLCBbc3AsIC00XQpAQCAtNTksNCArNjAsNCBAQAogCWxkLmFiICAgYmxpbmssIFtzcCwgNF0KIAlqICAgICAgIFtibGlua10KIAotRU5EKF9fc3dpdGNoX3RvKQorRU5EX0NGSShfX3N3aXRjaF90bykKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9hcmMva2VybmVsL2VudHJ5LlMKaW5kZXggMmVmYjA2MjUuLjFlZWE5OWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvYXJjL2tlcm5lbC9lbnRyeS5TCkBAIC0zNSw3ICszNSw3IEBACiAJYnRzdCByMTAsIFRJRl9TWVNDQUxMX1RSQUNFCiAJYm56ICB0cmFjZXN5c19leGl0CiAKLQliIHJldF9mcm9tX3N5c3RlbV9jYWxsCisJYiAuTHJldF9mcm9tX3N5c3RlbV9jYWxsCiBFTkQoc3lzX2Nsb25lX3dyYXBwZXIpCiAKIEVOVFJZKHJldF9mcm9tX2ZvcmspCkBAIC02MSwxOCArNjEsNiBAQAogCWIgICAgcmV0X2Zyb21fZXhjZXB0aW9uCiBFTkQocmV0X2Zyb21fZm9yaykKIAotI2lmZGVmIENPTkZJR19BUkNfRFcyX1VOV0lORAotOyBXb3JrYXJvdW5kIGZvciBidWcgOTQxNzkgKFNUQVIgKToKLTsgRGVzcGl0ZSAtZmFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzLCBsaW5rZXIgaXMgbm90IG1ha2luZyBkd2FyZjIgdW53aW5kZXIKLTsgc2VjdGlvbiAoLmRlYnVnX2ZyYW1lKSBhcyBsb2FkYWJsZS4gU28gd2UgZm9yY2UgaXQgaGVyZS4KLTsgVGhpcyBhbHNvIGZpeGVzIFNUQVIgOTAwMDQ4NzkzMyB3aGVyZSB0aGUgcHJldi13b3JrYXJvdW5kIChvYmpjb3B5IC0tc2V0ZmxhZykKLTsgd291bGQgbm90IHdvcmsgYWZ0ZXIgYSBjbGVhbiBidWlsZCBkdWUgdG8ga2VybmVsIGJ1aWxkIHN5c3RlbSBkZXBlbmRlbmNpZXMuCi0uc2VjdGlvbiAuZGVidWdfZnJhbWUsICJ3YSIsQHByb2diaXRzCi0KLTsgUmVzZXQgdG8gLnRleHQgYXMgdGhpcyBmaWxlIGlzIGluY2x1ZGVkIGluIGVudHJ5LTxpc2E+LlMKLS5zZWN0aW9uIC50ZXh0LCAiYXgiLEBwcm9nYml0cwotI2VuZGlmCi0KIDsjIyMjIyMjIyMjIyMjIyMjIyMjIE5vbiBUTEIgRXhjZXB0aW9uIEhhbmRsaW5nICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKIDsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yNjAsMjAgKzI0OCwxOCBAQAogCTsgc3lzY2FsbCBudW0gc2hkIG5vdCBleGNlZWQgdGhlIHRvdGFsIHN5c3RlbSBjYWxscyBhdmFpbAogCWNtcCAgICAgcjgsICBOUl9zeXNjYWxscwogCW1vdi5oaSAgcjAsIC1FTk9TWVMKLQliaGkgICAgIHJldF9mcm9tX3N5c3RlbV9jYWxsCisJYmhpICAgICAuTHJldF9mcm9tX3N5c3RlbV9jYWxsCiAKIAk7IE9mZnNldCBpbnRvIHRoZSBzeXNjYWxsX3RhYmxlIGFuZCBjYWxsIGhhbmRsZXIKIAlsZC5hcyAgIHI5LFtzeXNfY2FsbF90YWJsZSwgcjhdCiAJamwgICAgICBbcjldICAgICAgICA7IEVudHJ5IGludG8gU3lzIENhbGwgSGFuZGxlcgogCi0JOyBmYWxsIHRocm91Z2ggdG8gcmV0X2Zyb21fc3lzdGVtX2NhbGwKLUVORChFVl9UcmFwKQotCi1FTlRSWShyZXRfZnJvbV9zeXN0ZW1fY2FsbCkKKy5McmV0X2Zyb21fc3lzdGVtX2NhbGw6CiAKIAlzdCAgcjAsIFtzcCwgUFRfcjBdICAgICA7IHN5cyBjYWxsIHJldHVybiB2YWx1ZSBpbiBwdF9yZWdzCiAKLQk7IGZhbGwgdGhyb3VnaCB5ZXQgYWdhaW4gdG8gcmV0X2Zyb21fZXhjZXB0aW9uCisJOyBmYWxsIHRocm91Z2ggdG8gcmV0X2Zyb21fZXhjZXB0aW9uCitFTkQoRVZfVHJhcCkKIAogOyMjIyMjIyMjIyMjIyMgUmV0dXJuIGZyb20gSW50ci9FeGNwL1RyYXAgKExpbnV4IFNwZWNpZmljcykgIyMjIyMjIyMjIyMjIyMKIDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2tlcm5lbC9pbnRjLWFyY3YyLmMgYi9hcmNoL2FyYy9rZXJuZWwvaW50Yy1hcmN2Mi5jCmluZGV4IDZjMjRmYWYuLjYyYjU5NDA5IDEwMDY0NAotLS0gYS9hcmNoL2FyYy9rZXJuZWwvaW50Yy1hcmN2Mi5jCisrKyBiL2FyY2gvYXJjL2tlcm5lbC9pbnRjLWFyY3YyLmMKQEAgLTc0LDcgKzc0LDcgQEAKIAl0bXAgPSByZWFkX2F1eF9yZWcoMHhhKTsKIAl0bXAgfD0gU1RBVFVTX0FEX01BU0sgfCAoaXJxX3ByaW8gPDwgMSk7CiAJdG1wICY9IH5TVEFUVVNfSUVfTUFTSzsKLQlhc20gdm9sYXRpbGUoImZsYWcgJTAJXG4iOjoiciIodG1wKSk7CisJYXNtIHZvbGF0aWxlKCJrZmxhZyAlMAlcbiI6OiJyIih0bXApKTsKIH0KIAogc3RhdGljIHZvaWQgYXJjdjJfaXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkYXRhKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMva2VybmVsL21vZHVsZS5jIGIvYXJjaC9hcmMva2VybmVsL21vZHVsZS5jCmluZGV4IDM3NmUwNDYuLjlhMjg0OTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2tlcm5lbC9tb2R1bGUuYworKysgYi9hcmNoL2FyYy9rZXJuZWwvbW9kdWxlLmMKQEAgLTIyLDEzICsyMiw5IEBACiAJKihhZGRyICsgMSkgPSAodmFsdWUgJiAweGZmZmYpOwogfQogCi0vKiBBUkMgc3BlY2lmaWMgc2VjdGlvbiBxdWlya3MgLSBiZWZvcmUgcmVsb2NhdGlvbiBsb29wIGluIGdlbmVyaWMgbG9hZGVyCi0gKgotICogRm9yIGR3YXJmIHVud2luZGluZyBvdXQgb2YgbW9kdWxlcywgdGhpcyBuZWVkcyB0bwotICogMS4gRW5zdXJlIHRoZSAuZGVidWdfZnJhbWUgaXMgYWxsb2NhdGFibGUgKEFSQyBMaW5rZXIgYnVnOiBkZXNwaXRlCi0gKiAgICAtZmFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIGl0IGRvZXNuJ3QpLgotICogMi4gU2luY2Ugd2UgYXJlIGl0ZXJhdGluZyB0aHJ1IHNlYyBoZHIgdGJsIGFueXdheXMsIG1ha2UgYSBub3RlIG9mCi0gKiAgICB0aGUgZXhhY3Qgc2VjdGlvbiBpbmRleCwgZm9yIGxhdGVyIHVzZS4KKy8qCisgKiBUaGlzIGdldHMgY2FsbGVkIGJlZm9yZSByZWxvY2F0aW9uIGxvb3AgaW4gZ2VuZXJpYyBsb2FkZXIKKyAqIE1ha2UgYSBub3RlIG9mIHRoZSBzZWN0aW9uIGluZGV4IG9mIHVud2luZGluZyBzZWN0aW9uCiAgKi8KIGludCBtb2R1bGVfZnJvYl9hcmNoX3NlY3Rpb25zKEVsZl9FaGRyICpoZHIsIEVsZl9TaGRyICpzZWNoZHJzLAogCQkJICAgICAgY2hhciAqc2Vjc3RyLCBzdHJ1Y3QgbW9kdWxlICptb2QpCkBAIC00MCw4ICszNiw3IEBACiAJbW9kLT5hcmNoLnVud19pbmZvID0gTlVMTDsKIAogCWZvciAoaSA9IDE7IGkgPCBoZHItPmVfc2hudW07IGkrKykgewotCQlpZiAoc3RyY21wKHNlY3N0citzZWNoZHJzW2ldLnNoX25hbWUsICIuZGVidWdfZnJhbWUiKSA9PSAwKSB7Ci0JCQlzZWNoZHJzW2ldLnNoX2ZsYWdzIHw9IFNIRl9BTExPQzsKKwkJaWYgKHN0cmNtcChzZWNzdHIrc2VjaGRyc1tpXS5zaF9uYW1lLCAiLmVoX2ZyYW1lIikgPT0gMCkgewogCQkJbW9kLT5hcmNoLnVud19zZWNfaWR4ID0gaTsKIAkJCWJyZWFrOwogCQl9CkBAIC0xMDYsMTAgKzEwMSwxMiBAQAogCQkgKi8KIAkJcmVsb190eXBlID0gRUxGMzJfUl9UWVBFKHJlbF9lbnRyeVtpXS5yX2luZm8pOwogCi0JCWlmIChsaWtlbHkoUl9BUkNfMzJfTUUgPT0gcmVsb190eXBlKSkKKwkJaWYgKGxpa2VseShSX0FSQ18zMl9NRSA9PSByZWxvX3R5cGUpKQkvKiBNRSAoIFMgKyBBICkgKi8KIAkJCWFyY193cml0ZV9tZSgodW5zaWduZWQgc2hvcnQgKilsb2NhdGlvbiwgcmVsb2NhdGlvbik7Ci0JCWVsc2UgaWYgKFJfQVJDXzMyID09IHJlbG9fdHlwZSkKKwkJZWxzZSBpZiAoUl9BUkNfMzIgPT0gcmVsb190eXBlKQkJLyogKCBTICsgQSApICovCiAJCQkqKChFbGYzMl9BZGRyICopIGxvY2F0aW9uKSA9IHJlbG9jYXRpb247CisJCWVsc2UgaWYgKFJfQVJDXzMyX1BDUkVMID09IHJlbG9fdHlwZSkJLyogKCBTICsgQSApIC0gUERBVEEgKSAqLworCQkJKigoRWxmMzJfQWRkciAqKSBsb2NhdGlvbikgPSByZWxvY2F0aW9uIC0gbG9jYXRpb247CiAJCWVsc2UKIAkJCWdvdG8gcmVsb19lcnI7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2tlcm5lbC9wZXJmX2V2ZW50LmMgYi9hcmNoL2FyYy9rZXJuZWwvcGVyZl9ldmVudC5jCmluZGV4IDA4ZjAzZDkuLjJjZTI0ZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2tlcm5lbC9wZXJmX2V2ZW50LmMKKysrIGIvYXJjaC9hcmMva2VybmVsL3BlcmZfZXZlbnQuYwpAQCAtMTc5LDggKzE3OSw4IEBACiAJCWlmIChhcmNfcG11LT5ldl9od19pZHhbZXZlbnQtPmF0dHIuY29uZmlnXSA8IDApCiAJCQlyZXR1cm4gLUVOT0VOVDsKIAkJaHdjLT5jb25maWcgfD0gYXJjX3BtdS0+ZXZfaHdfaWR4W2V2ZW50LT5hdHRyLmNvbmZpZ107Ci0JCXByX2RlYnVnKCJpbml0IGV2ZW50ICVkIHdpdGggaC93ICVkIFwnJXNcJ1xuIiwKLQkJCSAoaW50KSBldmVudC0+YXR0ci5jb25maWcsIChpbnQpIGh3Yy0+Y29uZmlnLAorCQlwcl9kZWJ1ZygiaW5pdCBldmVudCAlZCB3aXRoIGgvdyAlMDh4IFwnJXNcJ1xuIiwKKwkJCSAoaW50KWV2ZW50LT5hdHRyLmNvbmZpZywgKGludClod2MtPmNvbmZpZywKIAkJCSBhcmNfcG11X2V2X2h3X21hcFtldmVudC0+YXR0ci5jb25maWddKTsKIAkJcmV0dXJuIDA7CiAKQEAgLTE4OSw2ICsxODksOCBAQAogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAJCWh3Yy0+Y29uZmlnIHw9IGFyY19wbXUtPmV2X2h3X2lkeFtyZXRdOworCQlwcl9kZWJ1ZygiaW5pdCBjYWNoZSBldmVudCB3aXRoIGgvdyAlMDh4IFwnJXNcJ1xuIiwKKwkJCSAoaW50KWh3Yy0+Y29uZmlnLCBhcmNfcG11X2V2X2h3X21hcFtyZXRdKTsKIAkJcmV0dXJuIDA7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9FTlQ7CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9hcmMva2VybmVsL3Byb2Nlc3MuYwppbmRleCBiNWRiOWU3Li5iZTE5NzJiIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvYXJjL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTE5OSw3ICsxOTksNyBAQAogCX0KIAogCWVmbGFncyA9IHgtPmVfZmxhZ3M7Ci0JaWYgKChlZmxhZ3MgJiBFRl9BUkNfT1NBQklfTVNLKSA8IEVGX0FSQ19PU0FCSV9DVVJSRU5UKSB7CisJaWYgKChlZmxhZ3MgJiBFRl9BUkNfT1NBQklfTVNLKSAhPSBFRl9BUkNfT1NBQklfQ1VSUkVOVCkgewogCQlwcl9lcnIoIkFCSSBtaXNtYXRjaCAtIHlvdSBuZWVkIG5ld2VyIHRvb2xjaGFpblxuIik7CiAJCWZvcmNlX3NpZ3NlZ3YoU0lHU0VHViwgY3VycmVudCk7CiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMva2VybmVsL3NldHVwLmMgYi9hcmNoL2FyYy9rZXJuZWwvc2V0dXAuYwppbmRleCBhOTQ2NDAwLi4zZGY3ZjljIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2FyYy9rZXJuZWwvc2V0dXAuYwpAQCAtMTcxLDYgKzE3MSw3IEBACiAjZWxzZQogCXsgezB4NTAsICJBUkMgSFMzOCBSMi4wIn0sIDB4NTF9LAogCXsgezB4NTIsICJBUkMgSFMzOCBSMi4xIn0sIDB4NTJ9LAorCXsgezB4NTMsICJBUkMgSFMzOCBSMy4wIn0sIDB4NTN9LAogI2VuZGlmCiAJeyB7MHgwMCwgTlVMTAkJfSB9CiB9OwpAQCAtMjcyLDggKzI3Myw4IEBACiAJRklYX1BUUihjcHUpOwogCiAJbiArPSBzY25wcmludGYoYnVmICsgbiwgbGVuIC0gbiwKLQkJICAgICAgICJWZWN0b3IgVGFibGVcdDogJSN4XG5VbmNhY2hlZCBCYXNlXHQ6ICUjbHhcbiIsCi0JCSAgICAgICBjcHUtPnZlY19iYXNlLCBwZXJpcF9iYXNlKTsKKwkJICAgICAgICJWZWN0b3IgVGFibGVcdDogJSN4XG5QZXJpcGhlcmFsc1x0OiAlI2x4OiUjbHhcbiIsCisJCSAgICAgICBjcHUtPnZlY19iYXNlLCBwZXJpcF9iYXNlLCBwZXJpcF9lbmQpOwogCiAJaWYgKGNwdS0+ZXh0bi5mcHVfc3AgfHwgY3B1LT5leHRuLmZwdV9kcCkKIAkJbiArPSBzY25wcmludGYoYnVmICsgbiwgbGVuIC0gbiwgIkZQVVx0XHQ6ICVzJXNcbiIsCkBAIC0yOTEsOCArMjkyLDEwIEBACiAJCQkgICAgICAgY3B1LT5kY2NtLmJhc2VfYWRkciwgVE9fS0IoY3B1LT5kY2NtLnN6KSwKIAkJCSAgICAgICBjcHUtPmljY20uYmFzZV9hZGRyLCBUT19LQihjcHUtPmljY20uc3opKTsKIAotCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIGxlbiAtIG4sCi0JCSAgICAgICAiT1MgQUJJIFt2M11cdDogbm8tbGVnYWN5LXN5c2NhbGxzXG4iKTsKKwluICs9IHNjbnByaW50ZihidWYgKyBuLCBsZW4gLSBuLCAiT1MgQUJJIFt2JWRdXHQ6ICVzXG4iLAorCQkJRUZfQVJDX09TQUJJX0NVUlJFTlQgPj4gOCwKKwkJCUVGX0FSQ19PU0FCSV9DVVJSRU5UID09IEVGX0FSQ19PU0FCSV9WMyA/CisJCQkibm8tbGVnYWN5LXN5c2NhbGxzIiA6ICI2NC1iaXQgZGF0YSBhbnkgcmVnaXN0ZXIgYWxpZ25lZCIpOwogCiAJcmV0dXJuIGJ1ZjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2tlcm5lbC91bndpbmQuYyBiL2FyY2gvYXJjL2tlcm5lbC91bndpbmQuYwppbmRleCAwNTg3YmYxLi42MWZkMWNlIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9rZXJuZWwvdW53aW5kLmMKKysrIGIvYXJjaC9hcmMva2VybmVsL3Vud2luZC5jCkBAIC0xMTEsNiArMTExLDggQEAKICNkZWZpbmUgRFdfRUhfUEVfaW5kaXJlY3QgMHg4MAogI2RlZmluZSBEV19FSF9QRV9vbWl0ICAgICAweGZmCiAKKyNkZWZpbmUgQ0lFX0lECTAKKwogdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVsZWIxMjhfdDsKIHR5cGVkZWYgc2lnbmVkIGxvbmcgc2xlYjEyOF90OwogCkBAIC0yMzIsNiArMjM0LDcgQEAKIAogc3RhdGljIGNvbnN0IHUzMiBiYWRfY2llLCBub3RfZmRlOwogc3RhdGljIGNvbnN0IHUzMiAqY2llX2Zvcl9mZGUoY29uc3QgdTMyICpmZGUsIGNvbnN0IHN0cnVjdCB1bndpbmRfdGFibGUgKik7CitzdGF0aWMgY29uc3QgdTMyICpfX2NpZV9mb3JfZmRlKGNvbnN0IHUzMiAqZmRlKTsKIHN0YXRpYyBzaWduZWQgZmRlX3BvaW50ZXJfdHlwZShjb25zdCB1MzIgKmNpZSk7CiAKIHN0cnVjdCBlaF9mcmFtZV9oZHJfdGFibGVfZW50cnkgewpAQCAtMzM4LDEwICszNDEsOSBAQAogCWZvciAoZmRlID0gdGFibGUtPmFkZHJlc3MsIHRhYmxlU2l6ZSA9IHRhYmxlLT5zaXplLCBuID0gMDsKIAkgICAgIHRhYmxlU2l6ZTsKIAkgICAgIHRhYmxlU2l6ZSAtPSBzaXplb2YoKmZkZSkgKyAqZmRlLCBmZGUgKz0gMSArICpmZGUgLyBzaXplb2YoKmZkZSkpIHsKLQkJLyogY29uc3QgdTMyICpjaWUgPSBmZGUgKyAxIC0gZmRlWzFdIC8gc2l6ZW9mKCpmZGUpOyAqLwotCQljb25zdCB1MzIgKmNpZSA9IChjb25zdCB1MzIgKikoZmRlWzFdKTsKKwkJY29uc3QgdTMyICpjaWUgPSBfX2NpZV9mb3JfZmRlKGZkZSk7CiAKLQkJaWYgKGZkZVsxXSA9PSAweGZmZmZmZmZmKQorCQlpZiAoZmRlWzFdID09IENJRV9JRCkKIAkJCWNvbnRpbnVlOwkvKiB0aGlzIGlzIGEgQ0lFICovCiAJCXB0ciA9IChjb25zdCB1OCAqKShmZGUgKyAyKTsKIAkJaGVhZGVyLT50YWJsZVtuXS5zdGFydCA9IHJlYWRfcG9pbnRlcigmcHRyLApAQCAtNTA0LDYgKzUwNiwxNSBAQAogCXJldHVybiB2YWx1ZTsKIH0KIAorc3RhdGljIGNvbnN0IHUzMiAqX19jaWVfZm9yX2ZkZShjb25zdCB1MzIgKmZkZSkKK3sKKwljb25zdCB1MzIgKmNpZTsKKworCWNpZSA9IGZkZSArIDEgLSBmZGVbMV0gLyBzaXplb2YoKmZkZSk7CisKKwlyZXR1cm4gY2llOworfQorCiBzdGF0aWMgY29uc3QgdTMyICpjaWVfZm9yX2ZkZShjb25zdCB1MzIgKmZkZSwgY29uc3Qgc3RydWN0IHVud2luZF90YWJsZSAqdGFibGUpCiB7CiAJY29uc3QgdTMyICpjaWU7CkBAIC01MTEsMTkgKzUyMiwxOCBAQAogCWlmICghKmZkZSB8fCAoKmZkZSAmIChzaXplb2YoKmZkZSkgLSAxKSkpCiAJCXJldHVybiAmYmFkX2NpZTsKIAotCWlmIChmZGVbMV0gPT0gMHhmZmZmZmZmZikKKwlpZiAoZmRlWzFdID09IENJRV9JRCkKIAkJcmV0dXJuICZub3RfZmRlOwkvKiB0aGlzIGlzIGEgQ0lFICovCiAKIAlpZiAoKGZkZVsxXSAmIChzaXplb2YoKmZkZSkgLSAxKSkpCiAvKiB8fCBmZGVbMV0gPiAodW5zaWduZWQgbG9uZykoZmRlICsgMSkgLSAodW5zaWduZWQgbG9uZyl0YWJsZS0+YWRkcmVzcykgKi8KIAkJcmV0dXJuIE5VTEw7CS8qIHRoaXMgaXMgbm90IGEgdmFsaWQgRkRFICovCiAKLQkvKiBjaWUgPSBmZGUgKyAxIC0gZmRlWzFdIC8gc2l6ZW9mKCpmZGUpOyAqLwotCWNpZSA9ICh1MzIgKikgZmRlWzFdOworCWNpZSA9IF9fY2llX2Zvcl9mZGUoZmRlKTsKIAogCWlmICgqY2llIDw9IHNpemVvZigqY2llKSArIDQgfHwgKmNpZSA+PSBmZGVbMV0gLSBzaXplb2YoKmZkZSkKIAkgICAgfHwgKCpjaWUgJiAoc2l6ZW9mKCpjaWUpIC0gMSkpCi0JICAgIHx8IChjaWVbMV0gIT0gMHhmZmZmZmZmZikpCisJICAgIHx8IChjaWVbMV0gIT0gQ0lFX0lEKSkKIAkJcmV0dXJuIE5VTEw7CS8qIHRoaXMgaXMgbm90IGEgKHZhbGlkKSBDSUUgKi8KIAlyZXR1cm4gY2llOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL2FyYy9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCA4OTRlNjk2Li4zNjYxMTA3IDEwMDY0NAotLS0gYS9hcmNoL2FyYy9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL2FyYy9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtODIsMTQgKzgyLDYgQEAKIAogCVBFUkNQVV9TRUNUSU9OKEwxX0NBQ0hFX0JZVEVTKQogCi0JLyoKLQkgKiAuZXhpdC50ZXh0IGlzIGRpc2NhcmQgYXQgcnVudGltZSwgbm90IGxpbmsgdGltZSwgdG8gZGVhbCB3aXRoCi0JICogcmVmZXJlbmNlcyBmcm9tIC5kZWJ1Z19mcmFtZQotCSAqIEl0IHdpbGwgYmUgaW5pdCBmcmVlZCwgYmVpbmcgaW5zaWRlIFtfX2luaXRfc3RhcnQgOiBfX2luaXRfZW5kXQotCSAqLwotCS5leGl0LnRleHQgOiB7IEVYSVRfVEVYVCB9Ci0JLmV4aXQuZGF0YSA6IHsgRVhJVF9EQVRBIH0KLQogCS4gPSBBTElHTihQQUdFX1NJWkUpOwogCV9faW5pdF9lbmQgPSAuOwogCkBAIC0xMjAsMTggKzExMiwxMyBAQAogCiAjaWZkZWYgQ09ORklHX0FSQ19EVzJfVU5XSU5ECiAJLiA9IEFMSUdOKFBBR0VfU0laRSk7Ci0JLmRlYnVnX2ZyYW1lICA6IHsKKwkuZWhfZnJhbWUgIDogewogCQlfX3N0YXJ0X3Vud2luZCA9IC47Ci0JCSooLmRlYnVnX2ZyYW1lKQorCQkqKC5laF9mcmFtZSkKIAkJX19lbmRfdW53aW5kID0gLjsKIAl9Ci0JLyoKLQkgKiBnY2MgNC44IGdlbmVyYXRlcyB0aGlzIGZvciAtZmFzeW5jaG9ub3VzLXVud2luZC10YWJsZXMsCi0JICogd2hpbGUgd2Ugc3RpbGwgdXNlIHRoZSAuZGVidWdfZnJhbWUgYmFzZWQgdW53aW5kZXIKLQkgKi8KLQkvRElTQ0FSRC8gOiB7CSooLmVoX2ZyYW1lKSB9CiAjZWxzZQotCS9ESVNDQVJELyA6IHsJKiguZGVidWdfZnJhbWUpIH0KKwkvRElTQ0FSRC8gOiB7CSooLmVoX2ZyYW1lKSB9CiAjZW5kaWYKIAogCU5PVEVTCkBAIC0xNDgsNyArMTM1LDcgQEAKIAl9CiAKICNpZm5kZWYgQ09ORklHX0RFQlVHX0lORk8KLQkvKiBvcGVuLWNvZGVkIGJlY2F1c2Ugd2UgbmVlZCAuZGVidWdfZnJhbWUgc2VwZXJhdGVseSBmb3IgdW53aW5kaW5nICovCisJL0RJU0NBUkQvIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQogCS9ESVNDQVJELyA6IHsgKiguZGVidWdfYXJhbmdlcykgfQogCS9ESVNDQVJELyA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KIAkvRElTQ0FSRC8gOiB7ICooLmRlYnVnX2luZm8pIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2xpYi9tZW1jbXAuUyBiL2FyY2gvYXJjL2xpYi9tZW1jbXAuUwppbmRleCBhNDAxNWU3Li4yMWExMDMwIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9saWIvbWVtY21wLlMKKysrIGIvYXJjaC9hcmMvbGliL21lbWNtcC5TCkBAIC0xNiw3ICsxNiw3IEBACiAjZGVmaW5lIFNISUZUIHIyCiAjZW5kaWYKIAotRU5UUlkobWVtY21wKQorRU5UUllfQ0ZJKG1lbWNtcCkKIAlvcglyMTIscjAscjEKIAlhc2xfcwlyMTIscjEyLDMwCiAJc3ViCXIzLHIyLDEKQEAgLTE0OSw0ICsxNDksNCBAQAogLkxuaWw6CiAJal9zLmQJW2JsaW5rXQogCW1vdglyMCwwCi1FTkQobWVtY21wKQorRU5EX0NGSShtZW1jbXApCmRpZmYgLS1naXQgYS9hcmNoL2FyYy9saWIvbWVtY3B5LTcwMC5TIGIvYXJjaC9hcmMvbGliL21lbWNweS03MDAuUwppbmRleCAzMjIyNTczLi5iYTBiZWNjIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9saWIvbWVtY3B5LTcwMC5TCisrKyBiL2FyY2gvYXJjL2xpYi9tZW1jcHktNzAwLlMKQEAgLTgsNyArOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAKLUVOVFJZKG1lbWNweSkKK0VOVFJZX0NGSShtZW1jcHkpCiAJb3IJcjMscjAscjEKIAlhc2xfcwlyMyxyMywzMAogCW1vdl9zCXI1LHIwCkBAIC02Myw0ICs2Myw0IEBACiAuTGVuZGJsb29wOgogCWpfcy5kCVtibGlua10KIAlzdGIJcjEyLFtyNSwwXQotRU5EKG1lbWNweSkKK0VORF9DRkkobWVtY3B5KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvbGliL21lbWNweS1hcmNocy5TIGIvYXJjaC9hcmMvbGliL21lbWNweS1hcmNocy5TCmluZGV4IGY5NmM3NWUuLmQ2MTA0NGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2xpYi9tZW1jcHktYXJjaHMuUworKysgYi9hcmNoL2FyYy9saWIvbWVtY3B5LWFyY2hzLlMKQEAgLTQwLDcgKzQwLDcgQEAKICMgZGVmaW5lIFpPTEFORAkJCTB4RgogI2VuZGlmCiAKLUVOVFJZKG1lbWNweSkKK0VOVFJZX0NGSShtZW1jcHkpCiAJcHJlZmV0Y2ggW3IxXQkJOyBQcmVmZXRjaCB0aGUgcmVhZCBsb2NhdGlvbgogCXByZWZldGNodyBbcjBdCQk7IFByZWZldGNoIHRoZSB3cml0ZSBsb2NhdGlvbgogCW1vdi5mCTAsIHIyCkBAIC0yMzMsNCArMjMzLDQgQEAKIC5MY29weWJ5dGV3aXNlXzM6CiAJaglbYmxpbmtdCiAKLUVORChtZW1jcHkpCitFTkRfQ0ZJKG1lbWNweSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2xpYi9tZW1zZXQtYXJjaHMuUyBiL2FyY2gvYXJjL2xpYi9tZW1zZXQtYXJjaHMuUwppbmRleCAzNjViMTgzLi42MmFkNGJjIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9saWIvbWVtc2V0LWFyY2hzLlMKKysrIGIvYXJjaC9hcmMvbGliL21lbXNldC1hcmNocy5TCkBAIC0xMCw3ICsxMCw3IEBACiAKICN1bmRlZiBQUkVBTExPQ19OT1RfQVZBSUwKIAotRU5UUlkobWVtc2V0KQorRU5UUllfQ0ZJKG1lbXNldCkKIAlwcmVmZXRjaHcgW3IwXQkJOyBQcmVmZXRjaCB0aGUgd3JpdGUgbG9jYXRpb24KIAltb3YuZgkwLCByMgogOzs7IGlmIHNpemUgaXMgemVybwpAQCAtMTEyLDExICsxMTIsMTEgQEAKIAogCWoJW2JsaW5rXQogCi1FTkQobWVtc2V0KQorRU5EX0NGSShtZW1zZXQpCiAKLUVOVFJZKG1lbXplcm8pCitFTlRSWV9DRkkobWVtemVybykKICAgICA7IGFkanVzdCBiemVybyBhcmdzIHRvIG1lbXNldCBhcmdzCiAgICAgbW92IHIyLCByMQogICAgIGIuZCAgbWVtc2V0ICAgIDt0YWlsIGNhbGwgc28gbmVlZCB0byB0aW5rZXIgd2l0aCBibGluawogICAgIG1vdiByMSwgMAotRU5EKG1lbXplcm8pCitFTkRfQ0ZJKG1lbXplcm8pCmRpZmYgLS1naXQgYS9hcmNoL2FyYy9saWIvbWVtc2V0LlMgYi9hcmNoL2FyYy9saWIvbWVtc2V0LlMKaW5kZXggZDM2YmQ0My4uY2Y3MzZmOSAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvbGliL21lbXNldC5TCisrKyBiL2FyY2gvYXJjL2xpYi9tZW1zZXQuUwpAQCAtMTAsNyArMTAsNyBAQAogCiAjZGVmaW5lIFNNQUxMCTcgLyogTXVzdCBiZSBhdCBsZWFzdCA2IHRvIGRlYWwgd2l0aCBhbGlnbm1lbnQvbG9vcCBpc3N1ZXMuICAqLwogCi1FTlRSWShtZW1zZXQpCitFTlRSWV9DRkkobWVtc2V0KQogCW1vdl9zCXI0LHIwCiAJb3IJcjEyLHIwLHIyCiAJYm1zay5mCXIxMixyMTIsMQpAQCAtNDYsMTQgKzQ2LDE0IEBACiAJc3RiLmFiCXIxLFtyNCwxXQogLkx0aW55X2VuZDoKIAlqX3MJW2JsaW5rXQotRU5EKG1lbXNldCkKK0VORF9DRkkobWVtc2V0KQogCiA7IG1lbXplcm86IEByMCA9IG1lbSwgQHIxID0gc2l6ZV90CiA7IG1lbXNldDogIEByMCA9IG1lbSwgQHIxID0gY2hhciwgQHIyID0gc2l6ZV90CiAKLUVOVFJZKG1lbXplcm8pCitFTlRSWV9DRkkobWVtemVybykKICAgICA7IGFkanVzdCBiemVybyBhcmdzIHRvIG1lbXNldCBhcmdzCiAgICAgbW92IHIyLCByMQogICAgIG1vdiByMSwgMAogICAgIGIgIG1lbXNldCAgICA7dGFpbCBjYWxsIHNvIG5lZWQgdG8gdGlua2VyIHdpdGggYmxpbmsKLUVORChtZW16ZXJvKQorRU5EX0NGSShtZW16ZXJvKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvbGliL3N0cmNoci03MDAuUyBiL2FyY2gvYXJjL2xpYi9zdHJjaHItNzAwLlMKaW5kZXggYjcyNWQ1OC4uMmQzMDBkYSAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvbGliL3N0cmNoci03MDAuUworKysgYi9hcmNoL2FyYy9saWIvc3RyY2hyLTcwMC5TCkBAIC0xMyw3ICsxMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAKLUVOVFJZKHN0cmNocikKK0VOVFJZX0NGSShzdHJjaHIpCiAJZXh0Yl9zCXIxLHIxCiAJYXNsCXI1LHIxLDgKIAlibXNrCXIyLHIwLDEKQEAgLTEzMCw0ICsxMzAsNCBAQAogCWpfcy5kCVtibGlua10KIAltb3YubWkJcjAsMAogI2VuZGlmIC8qIEVORElBTiAqLwotRU5EKHN0cmNocikKK0VORF9DRkkoc3RyY2hyKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvbGliL3N0cmNtcC1hcmNocy5TIGIvYXJjaC9hcmMvbGliL3N0cmNtcC1hcmNocy5TCmluZGV4IDRmMzM4ZWUuLmZhZTllODIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2xpYi9zdHJjbXAtYXJjaHMuUworKysgYi9hcmNoL2FyYy9saWIvc3RyY21wLWFyY2hzLlMKQEAgLTgsNyArOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAKLUVOVFJZKHN0cmNtcCkKK0VOVFJZX0NGSShzdHJjbXApCiAJb3IJcjIsIHIwLCByMQogCWJtc2tfcwlyMiwgcjIsIDEKIAlicm5lCXIyLCAwLCBALkxjaGFybG9vcApAQCAtNzUsNCArNzUsNCBAQAogLkxjbXBlbmQ6CiAJal9zLmQJW2JsaW5rXQogCXN1YglyMCwgcjIsIHIzCi1FTkQoc3RyY21wKQorRU5EX0NGSShzdHJjbXApCmRpZmYgLS1naXQgYS9hcmNoL2FyYy9saWIvc3RyY21wLlMgYi9hcmNoL2FyYy9saWIvc3RyY21wLlMKaW5kZXggMzU0NDYwMC4uZmIyMDA5NiAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvbGliL3N0cmNtcC5TCisrKyBiL2FyY2gvYXJjL2xpYi9zdHJjbXAuUwpAQCAtMTUsNyArMTUsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogCi1FTlRSWShzdHJjbXApCitFTlRSWV9DRkkoc3RyY21wKQogCW9yCXIyLHIwLHIxCiAJYm1za19zCXIyLHIyLDEKIAlicm5lCXIyLDAsLkxjaGFybG9vcApAQCAtOTMsNCArOTMsNCBAQAogLkxjbXBlbmQ6CiAJal9zLmQJW2JsaW5rXQogCXN1YglyMCxyMixyMwotRU5EKHN0cmNtcCkKK0VORF9DRkkoc3RyY21wKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvbGliL3N0cmNweS03MDAuUyBiL2FyY2gvYXJjL2xpYi9zdHJjcHktNzAwLlMKaW5kZXggODQyMmYzOC4uNmE2YzE1NSAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvbGliL3N0cmNweS03MDAuUworKysgYi9hcmNoL2FyYy9saWIvc3RyY3B5LTcwMC5TCkBAIC0xOCw3ICsxOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAKLUVOVFJZKHN0cmNweSkKK0VOVFJZX0NGSShzdHJjcHkpCiAJb3IJcjIscjAscjEKIAlibXNrX3MJcjIscjIsMQogCWJybmUuZAlyMiwwLGNoYXJsb29wCkBAIC02Nyw0ICs2Nyw0IEBACiAJYnJuZS5kCXIzLDAsY2hhcmxvb3AKIAlzdGIuYWIJcjMsW3IxMCwxXQogCWoJW2JsaW5rXQotRU5EKHN0cmNweSkKK0VORF9DRkkoc3RyY3B5KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvbGliL3N0cmxlbi5TIGIvYXJjaC9hcmMvbGliL3N0cmxlbi5TCmluZGV4IDUzY2ZkNTYuLjgzOWI0NGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2xpYi9zdHJsZW4uUworKysgYi9hcmNoL2FyYy9saWIvc3RybGVuLlMKQEAgLTgsNyArOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAKLUVOVFJZKHN0cmxlbikKK0VOVFJZX0NGSShzdHJsZW4pCiAJb3IJcjMscjAsNwogCWxkCXIyLFtyMywtN10KIAlsZC5hCXI2LFtyMywtM10KQEAgLTgwLDQgKzgwLDQgQEAKIC5MZWFybHlfZW5kOgogCWIuZAkuTGVuZAogCXN1Yl9zLm5lIHIxLHIxLHIxCi1FTkQoc3RybGVuKQorRU5EX0NGSShzdHJsZW4pCmRpZmYgLS1naXQgYS9hcmNoL2FyYy9tbS9jYWNoZS5jIGIvYXJjaC9hcmMvbW0vY2FjaGUuYwppbmRleCA1YTI5NGIyLi45N2RkZGJlIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9tbS9jYWNoZS5jCisrKyBiL2FyY2gvYXJjL21tL2NhY2hlLmMKQEAgLTI1LDYgKzI1LDcgQEAKIGludCBpb2NfZXhpc3RzOwogdm9sYXRpbGUgaW50IHNsY19lbmFibGUgPSAxLCBpb2NfZW5hYmxlID0gMTsKIHVuc2lnbmVkIGxvbmcgcGVyaXBfYmFzZSA9IEFSQ19VTkNBQ0hFRF9BRERSX1NQQUNFOyAvKiBsZWdhY3kgdmFsdWUgZm9yIGJvb3QgKi8KK3Vuc2lnbmVkIGxvbmcgcGVyaXBfZW5kID0gMHhGRkZGRkZGRjsgLyogbGVnYWN5IHZhbHVlICovCiAKIHZvaWQgKCpfY2FjaGVfbGluZV9sb29wX2ljX2ZuKShwaHlzX2FkZHJfdCBwYWRkciwgdW5zaWduZWQgbG9uZyB2YWRkciwKIAkJCSAgICAgICB1bnNpZ25lZCBsb25nIHN6LCBjb25zdCBpbnQgY2FjaGVvcCk7CkBAIC03Niw3ICs3Nyw2IEBACiBzdGF0aWMgdm9pZCByZWFkX2RlY29kZV9jYWNoZV9iY3JfYXJjdjIoaW50IGNwdSkKIHsKIAlzdHJ1Y3QgY3B1aW5mb19hcmNfY2FjaGUgKnBfc2xjID0gJmNwdWluZm9fYXJjNzAwW2NwdV0uc2xjOwotCXN0cnVjdCBiY3JfZ2VuZXJpYyB1bmNhY2hlZF9zcGFjZTsKIAlzdHJ1Y3QgYmNyX2dlbmVyaWMgc2JjcjsKIAogCXN0cnVjdCBiY3Jfc2xjX2NmZyB7CkBAIC05NSw2ICs5NSwxNSBAQAogI2VuZGlmCiAJfSBjYmNyOwogCisJc3RydWN0IGJjcl92b2xhdGlsZSB7CisjaWZkZWYgQ09ORklHX0NQVV9CSUdfRU5ESUFOCisJCXVuc2lnbmVkIGludCBzdGFydDo0LCBsaW1pdDo0LCBwYWQ6MjIsIG9yZGVyOjEsIGRpc2FibGU6MTsKKyNlbHNlCisJCXVuc2lnbmVkIGludCBkaXNhYmxlOjEsIG9yZGVyOjEsIHBhZDoyMiwgbGltaXQ6NCwgc3RhcnQ6NDsKKyNlbmRpZgorCX0gdm9sOworCisKIAlSRUFEX0JDUihBUkNfUkVHX1NMQ19CQ1IsIHNiY3IpOwogCWlmIChzYmNyLnZlcikgewogCQlSRUFEX0JDUihBUkNfUkVHX1NMQ19DRkcsIHNsY19jZmcpOwpAQCAtMTA3LDEwICsxMTYsMTQgQEAKIAlpZiAoY2Jjci5jICYmIGlvY19lbmFibGUpCiAJCWlvY19leGlzdHMgPSAxOwogCi0JLyogTGVnYWN5IERhdGEgVW5jYWNoZWQgQkNSIGlzIGRlcHJlY2F0ZWQgZnJvbSB2MyBvbndhcmRzICovCi0JUkVBRF9CQ1IoQVJDX1JFR19EX1VOQ0FDSF9CQ1IsIHVuY2FjaGVkX3NwYWNlKTsKLQlpZiAodW5jYWNoZWRfc3BhY2UudmVyID4gMikKLQkJcGVyaXBfYmFzZSA9IHJlYWRfYXV4X3JlZyhBVVhfTk9OX1ZPTCkgJiAweEYwMDAwMDAwOworCS8qIEhTIDIuMCBkaWRuJ3QgaGF2ZSBBVVhfVk9MICovCisJaWYgKGNwdWluZm9fYXJjNzAwW2NwdV0uY29yZS5mYW1pbHkgPiAweDUxKSB7CisJCVJFQURfQkNSKEFVWF9WT0wsIHZvbCk7CisJCXBlcmlwX2Jhc2UgPSB2b2wuc3RhcnQgPDwgMjg7CisJCS8qIEhTIDMuMCBoYXMgbGltaXQgYW5kIHN0cmljdC1vcmRlcmluZyBmaWVsZHMgKi8KKwkJaWYgKGNwdWluZm9fYXJjNzAwW2NwdV0uY29yZS5mYW1pbHkgPiAweDUyKQorCQkJcGVyaXBfZW5kID0gKHZvbC5saW1pdCA8PCAyOCkgLSAxOworCX0KIH0KIAogdm9pZCByZWFkX2RlY29kZV9jYWNoZV9iY3Iodm9pZCkKQEAgLTkyMSw2ICs5MzQsMTUgQEAKIAogCXByaW50ayhhcmNfY2FjaGVfbXVtYm9qdW1ibygwLCBzdHIsIHNpemVvZihzdHIpKSk7CiAKKwkvKgorCSAqIE9ubHkgbWFzdGVyIENQVSBuZWVkcyB0byBleGVjdXRlIHJlc3Qgb2YgZnVuY3Rpb246CisJICogIC0gQXNzdW1lIFNNUCBzbyBhbGwgY29yZXMgd2lsbCBoYXZlIHNhbWUgY2FjaGUgY29uZmlnIHNvCisJICogICAgYW55IGdlb210cnkgY2hlY2tzIHdpbGwgYmUgc2FtZSBmb3IgYWxsCisJICogIC0gSU9DIHNldHVwIC8gZG1hIGNhbGxiYWNrcyBvbmx5IG5lZWQgdG8gYmUgc2V0dXAgb25jZQorCSAqLworCWlmIChjcHUpCisJCXJldHVybjsKKwogCWlmIChJU19FTkFCTEVEKENPTkZJR19BUkNfSEFTX0lDQUNIRSkpIHsKIAkJc3RydWN0IGNwdWluZm9fYXJjX2NhY2hlICppYyA9ICZjcHVpbmZvX2FyYzcwMFtjcHVdLmljYWNoZTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvbW0vaGlnaG1lbS5jIGIvYXJjaC9hcmMvbW0vaGlnaG1lbS5jCmluZGV4IDA0ZjgzMzIuLjc3ZmY2NGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL21tL2hpZ2htZW0uYworKysgYi9hcmNoL2FyYy9tbS9oaWdobWVtLmMKQEAgLTYxLDYgKzYxLDcgQEAKIAogCXJldHVybiBrbWFwX2hpZ2gocGFnZSk7CiB9CitFWFBPUlRfU1lNQk9MKGttYXApOwogCiB2b2lkICprbWFwX2F0b21pYyhzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL21tL2lvcmVtYXAuYyBiL2FyY2gvYXJjL21tL2lvcmVtYXAuYwppbmRleCBmNTJiN2RiNi4uOTg4MWJkNyAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvbW0vaW9yZW1hcC5jCisrKyBiL2FyY2gvYXJjL21tL2lvcmVtYXAuYwpAQCAtMTksNyArMTksNyBAQAogCWlmIChpc19pc2FfYXJjb21wYWN0KCkpIHsKIAkJaWYgKHBhZGRyID49IEFSQ19VTkNBQ0hFRF9BRERSX1NQQUNFKQogCQkJcmV0dXJuIHRydWU7Ci0JfSBlbHNlIGlmIChwYWRkciA+PSBwZXJpcF9iYXNlICYmIHBhZGRyIDw9IDB4RkZGRkZGRkYpIHsKKwl9IGVsc2UgaWYgKHBhZGRyID49IHBlcmlwX2Jhc2UgJiYgcGFkZHIgPD0gcGVyaXBfZW5kKSB7CiAJCXJldHVybiB0cnVlOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvcGxhdC1zaW0vcGxhdGZvcm0uYyBiL2FyY2gvYXJjL3BsYXQtc2ltL3BsYXRmb3JtLmMKaW5kZXggZTRmZTUxNC4uYWVhODczOCAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvcGxhdC1zaW0vcGxhdGZvcm0uYworKysgYi9hcmNoL2FyYy9wbGF0LXNpbS9wbGF0Zm9ybS5jCkBAIC0yNCw2ICsyNCw3IEBACiAJInNucHMsbnNpbV9ocyIsCiAJInNucHMsbnNpbW9zY2kiLAogCSJzbnBzLG5zaW1vc2NpX2hzIiwKKwkic25wcyx6ZWJ1X2hzIiwKIAlOVUxMLAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vS2NvbmZpZyBiL2FyY2gvYXJtL0tjb25maWcKaW5kZXggYTljNGU0OC4uM2NkOTA0MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vS2NvbmZpZworKysgYi9hcmNoL2FybS9LY29uZmlnCkBAIC0xLDYgKzEsNyBAQAogY29uZmlnIEFSTQogCWJvb2wKIAlkZWZhdWx0IHkKKwlzZWxlY3QgQVJDSF9DTE9DS1NPVVJDRV9EQVRBCiAJc2VsZWN0IEFSQ0hfSEFTX0FUT01JQzY0X0RFQ19JRl9QT1NJVElWRQogCXNlbGVjdCBBUkNIX0hBU19ERVZNRU1fSVNfQUxMT1dFRAogCXNlbGVjdCBBUkNIX0hBU19FTEZfUkFORE9NSVpFCkBAIC04NzgsNiArODc5LDcgQEAKIAlzZWxlY3QgQ0xLU1JDX1NUTTMyCiAJc2VsZWN0IFBJTkNUUkwKIAlzZWxlY3QgUkVTRVRfQ09OVFJPTExFUgorCXNlbGVjdCBTVE0zMl9FWFRJCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgU1RNaWNyb2VsZWN0cm9uaWNzIFNUTTMyIHByb2Nlc3NvcnMuCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL01ha2VmaWxlIGIvYXJjaC9hcm0vTWFrZWZpbGUKaW5kZXggNjFmNmNjYy4uNmJlOWVlMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vTWFrZWZpbGUKQEAgLTIzLDcgKzIzLDYgQEAKIExERkxBR1NfTU9EVUxFCSs9IC1UICQoc3JjdHJlZSkvYXJjaC9hcm0va2VybmVsL21vZHVsZS5sZHMKIGVuZGlmCiAKLU9CSkNPUFlGTEFHUwk6PS1PIGJpbmFyeSAtUiAuY29tbWVudCAtUwogR1pGTEFHUwkJOj0tOQogI0tCVUlMRF9DRkxBR1MJKz0tcGlwZQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L01ha2VmaWxlIGIvYXJjaC9hcm0vYm9vdC9NYWtlZmlsZQppbmRleCBiZGMxZDVhLi41MGY4ZDFiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL2Jvb3QvTWFrZWZpbGUKQEAgLTExLDYgKzExLDggQEAKICMgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgUnVzc2VsbCBLaW5nCiAjCiAKK09CSkNPUFlGTEFHUwk6PS1PIGJpbmFyeSAtUiAuY29tbWVudCAtUworCiBpZm5lcSAoJChNQUNISU5FKSwpCiBpbmNsdWRlICQoTUFDSElORSkvTWFrZWZpbGUuYm9vdAogZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC5TCmluZGV4IGFmMTFjMmYuLmZjNmQ1NDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKKysrIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQuUwpAQCAtNzc5LDcgKzc3OSw3IEBACiAJCW9ycm5lCXIwLCByMCwgIzEJCUAgTU1VIGVuYWJsZWQKIAkJbW92bmUJcjEsICMweGZmZmZmZmZkCQlAIGRvbWFpbiAwID0gY2xpZW50CiAJCWJpYyAgICAgcjYsIHI2LCAjMSA8PCAzMSAgICAgICAgQCAzMi1iaXQgdHJhbnNsYXRpb24gc3lzdGVtCi0JCWJpYyAgICAgcjYsIHI2LCAjMyA8PCAwICAgICAgICAgQCB1c2Ugb25seSB0dGJyMAorCQliaWMgICAgIHI2LCByNiwgIyg3IDw8IDApIHwgKDEgPDwgNCkJQCB1c2Ugb25seSB0dGJyMAogCQltY3JuZQlwMTUsIDAsIHIzLCBjMiwgYzAsIDAJQCBsb2FkIHBhZ2UgdGFibGUgcG9pbnRlcgogCQltY3JuZQlwMTUsIDAsIHIxLCBjMywgYzAsIDAJQCBsb2FkIGRvbWFpbiBhY2Nlc3MgY29udHJvbAogCQltY3JuZSAgIHAxNSwgMCwgcjYsIGMyLCBjMCwgMiAgIEAgbG9hZCB0dGIgY29udHJvbApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvYW0zMzV4LWJhbHRvcy5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvYW0zMzV4LWJhbHRvcy5kdHNpCmluZGV4IGM4NjA5ZDguLmI2ODkxNzIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2FtMzM1eC1iYWx0b3MuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9hbTMzNXgtYmFsdG9zLmR0c2kKQEAgLTIyNiw3ICsyMjYsNyBAQAogCiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJZWxtX2lkID0gPCZlbG0+OworCQl0aSxlbG0taWQgPSA8JmVsbT47CiAJfTsKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2FtMzM1eC1pZ2VwMDAzMy5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvYW0zMzV4LWlnZXAwMDMzLmR0c2kKaW5kZXggZGY2MzQ4NC4uZTdkOWNhMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvYW0zMzV4LWlnZXAwMDMzLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvYW0zMzV4LWlnZXAwMDMzLmR0c2kKQEAgLTE2MSw3ICsxNjEsNyBAQAogCiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJZWxtX2lkID0gPCZlbG0+OworCQl0aSxlbG0taWQgPSA8JmVsbT47CiAKIAkJLyogTVREIHBhcnRpdGlvbiB0YWJsZSAqLwogCQlwYXJ0aXRpb25AMCB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9hbTMzNXgtcGh5Y29yZS1zb20uZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL2FtMzM1eC1waHljb3JlLXNvbS5kdHNpCmluZGV4IDg2Zjc3MzEuLjEyNjNjOWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2FtMzM1eC1waHljb3JlLXNvbS5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2FtMzM1eC1waHljb3JlLXNvbS5kdHNpCkBAIC0xOTcsNyArMTk3LDcgQEAKIAkJZ3BtYyx3ci1hY2Nlc3MtbnMgPSA8MzA+OwogCQlncG1jLHdyLWRhdGEtbXV4LWJ1cy1ucyA9IDwwPjsKIAotCQllbG1faWQgPSA8JmVsbT47CisJCXRpLGVsbS1pZCA9IDwmZWxtPjsKIAogCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJI3NpemUtY2VsbHMgPSA8MT47CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9hcm1hZGEtMzg4LWNsZWFyZm9nLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2FybWFkYS0zODgtY2xlYXJmb2cuZHRzCmluZGV4IDJlMDU1NmEuLmQzZTZiZDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2FybWFkYS0zODgtY2xlYXJmb2cuZHRzCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2FybWFkYS0zODgtY2xlYXJmb2cuZHRzCkBAIC0zOTAsMTIgKzM5MCwxMiBAQAogCiAJCQlwb3J0QDAgewogCQkJCXJlZyA9IDwwPjsKLQkJCQlsYWJlbCA9ICJsYW4xIjsKKwkJCQlsYWJlbCA9ICJsYW41IjsKIAkJCX07CiAKIAkJCXBvcnRAMSB7CiAJCQkJcmVnID0gPDE+OwotCQkJCWxhYmVsID0gImxhbjIiOworCQkJCWxhYmVsID0gImxhbjQiOwogCQkJfTsKIAogCQkJcG9ydEAyIHsKQEAgLTQwNSwxMiArNDA1LDEyIEBACiAKIAkJCXBvcnRAMyB7CiAJCQkJcmVnID0gPDM+OwotCQkJCWxhYmVsID0gImxhbjQiOworCQkJCWxhYmVsID0gImxhbjIiOwogCQkJfTsKIAogCQkJcG9ydEA0IHsKIAkJCQlyZWcgPSA8ND47Ci0JCQkJbGFiZWwgPSAibGFuNSI7CisJCQkJbGFiZWwgPSAibGFuMSI7CiAJCQl9OwogCiAJCQlwb3J0QDUgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvYmNtMjgzNS1ycGkuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL2JjbTI4MzUtcnBpLmR0c2kKaW5kZXggY2FmMjcwNy4uZTliNDdiMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvYmNtMjgzNS1ycGkuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9iY20yODM1LXJwaS5kdHNpCkBAIC0yLDYgKzIsNyBAQAogCiAvIHsKIAltZW1vcnkgeworCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOwogCQlyZWcgPSA8MCAweDEwMDAwMDAwPjsKIAl9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9iY20yODN4LmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9iY20yODN4LmR0c2kKaW5kZXggYjk4MjUyMi4uNDQ1NjI0YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvYmNtMjgzeC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2JjbTI4M3guZHRzaQpAQCAtMiw3ICsyLDYgQEAKICNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9iY20yODM1Lmg+CiAjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svYmNtMjgzNS1hdXguaD4KICNpbmNsdWRlIDxkdC1iaW5kaW5ncy9ncGlvL2dwaW8uaD4KLSNpbmNsdWRlICJza2VsZXRvbi5kdHNpIgogCiAvKiBUaGlzIGluY2x1ZGUgZmlsZSBjb3ZlcnMgdGhlIGNvbW1vbiBwZXJpcGhlcmFscyBhbmQgY29uZmlndXJhdGlvbiBiZXR3ZWVuCiAgKiBiY20yODM1IGFuZCBiY20yODM2IGltcGxlbWVudGF0aW9ucywgbGVhdmluZyB0aGUgQ1BVIGNvbmZpZ3VyYXRpb24gdG8KQEAgLTEzLDYgKzEyLDggQEAKIAljb21wYXRpYmxlID0gImJyY20sYmNtMjgzNSI7CiAJbW9kZWwgPSAiQkNNMjgzNSI7CiAJaW50ZXJydXB0LXBhcmVudCA9IDwmaW50Yz47CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CiAKIAljaG9zZW4gewogCQlib290YXJncyA9ICJlYXJseXByaW50ayBjb25zb2xlPXR0eUFNQTAiOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvZXh5bm9zNTQxMC1vZHJvaWR4dS5kdHMgYi9hcmNoL2FybS9ib290L2R0cy9leHlub3M1NDEwLW9kcm9pZHh1LmR0cwppbmRleCBkOTQ5OTMxLi5mNmQxMzUyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9leHlub3M1NDEwLW9kcm9pZHh1LmR0cworKysgYi9hcmNoL2FybS9ib290L2R0cy9leHlub3M1NDEwLW9kcm9pZHh1LmR0cwpAQCAtNDQ3LDE0ICs0NDcsMTEgQEAKIAlzYW1zdW5nLGR3LW1zaGMtY2l1LWRpdiA9IDwzPjsKIAlzYW1zdW5nLGR3LW1zaGMtc2RyLXRpbWluZyA9IDwwIDQ+OwogCXNhbXN1bmcsZHctbXNoYy1kZHItdGltaW5nID0gPDAgMj47Ci0Jc2Ftc3VuZyxkdy1tc2hjLWhzNDAwLXRpbWluZyA9IDwwIDI+OwotCXNhbXN1bmcscmVhZC1zdHJvYmUtZGVsYXkgPSA8OTA+OwogCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CiAJcGluY3RybC0wID0gPCZzZDBfY2xrICZzZDBfY21kICZzZDBfYnVzMSAmc2QwX2J1czQgJnNkMF9idXM4ICZzZDBfY2Q+OwogCWJ1cy13aWR0aCA9IDw4PjsKIAljYXAtbW1jLWhpZ2hzcGVlZDsKIAltbWMtaHMyMDAtMV84djsKLQltbWMtaHM0MDAtMV84djsKIAl2bW1jLXN1cHBseSA9IDwmbGRvMjBfcmVnPjsKIAl2cW1tYy1zdXBwbHkgPSA8JmxkbzExX3JlZz47CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnFkbC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnFkbC5kdHNpCmluZGV4IGI2MjBhYzguLmIxM2IwYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDZxZGwuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9pbXg2cWRsLmR0c2kKQEAgLTI0Myw3ICsyNDMsNyBAQAogCQkJCQljbG9ja3MgPSA8JmNsa3MgSU1YNlFETF9DTEtfU1BESUZfR0NMSz4sIDwmY2xrcyBJTVg2UURMX0NMS19PU0M+LAogCQkJCQkJIDwmY2xrcyBJTVg2UURMX0NMS19TUERJRj4sIDwmY2xrcyBJTVg2UURMX0NMS19BU1JDPiwKIAkJCQkJCSA8JmNsa3MgSU1YNlFETF9DTEtfRFVNTVk+LCA8JmNsa3MgSU1YNlFETF9DTEtfRVNBSV9FWFRBTD4sCi0JCQkJCQkgPCZjbGtzIElNWDZRRExfQ0xLX0lQRz4sIDwmY2xrcyBJTVg2UURMX0NMS19NTEI+LAorCQkJCQkJIDwmY2xrcyBJTVg2UURMX0NMS19JUEc+LCA8JmNsa3MgSU1YNlFETF9DTEtfRFVNTVk+LAogCQkJCQkJIDwmY2xrcyBJTVg2UURMX0NMS19EVU1NWT4sIDwmY2xrcyBJTVg2UURMX0NMS19TUEJBPjsKIAkJCQkJY2xvY2stbmFtZXMgPSAiY29yZSIsICAicnh0eDAiLAogCQkJCQkJICAgICAgInJ4dHgxIiwgInJ4dHgyIiwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDZzeC1zYWJyZWF1dG8uZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnN4LXNhYnJlYXV0by5kdHMKaW5kZXggOTZlYTkzNi4uMjQwYTI4NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnN4LXNhYnJlYXV0by5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14NnN4LXNhYnJlYXV0by5kdHMKQEAgLTY0LDcgKzY0LDcgQEAKIAljZC1ncGlvcyA9IDwmZ3BpbzcgMTEgR1BJT19BQ1RJVkVfTE9XPjsKIAluby0xLTgtdjsKIAlrZWVwLXBvd2VyLWluLXN1c3BlbmQ7Ci0JZW5hYmxlLXNkaW8td2FrdXA7CisJd2FrZXVwLXNvdXJjZTsKIAlzdGF0dXMgPSAib2theSI7CiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9pbXg3ZC1zZGIuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvaW14N2Qtc2RiLmR0cwppbmRleCA5NWVlMjY4Li4yZjMzYzQ2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9pbXg3ZC1zZGIuZHRzCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2lteDdkLXNkYi5kdHMKQEAgLTEzMSw3ICsxMzEsNyBAQAogCQl0aSx5LW1pbiA9IC9iaXRzLyAxNiA8MD47CiAJCXRpLHktbWF4ID0gL2JpdHMvIDE2IDwwPjsKIAkJdGkscHJlc3N1cmUtbWF4ID0gL2JpdHMvIDE2IDwwPjsKLQkJdGkseC1wbGF0LW9obXMgPSAvYml0cy8gMTYgPDQwMD47CisJCXRpLHgtcGxhdGUtb2htcyA9IC9iaXRzLyAxNiA8NDAwPjsKIAkJd2FrZXVwLXNvdXJjZTsKIAl9OwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2tpcmt3b29kLWliNjJ4MC5kdHMgYi9hcmNoL2FybS9ib290L2R0cy9raXJrd29vZC1pYjYyeDAuZHRzCmluZGV4IGVmODRkODYuLjViZjYyODkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2tpcmt3b29kLWliNjJ4MC5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMva2lya3dvb2QtaWI2MngwLmR0cwpAQCAtMTEzLDcgKzExMyw3IEBACiAKIAlwYXJ0aXRpb25AZTAwMDAgewogCQlsYWJlbCA9ICJ1LWJvb3QgZW52aXJvbm1lbnQiOwotCQlyZWcgPSA8MHhlMDAwMCAweDEwMDAwMD47CisJCXJlZyA9IDwweGUwMDAwIDB4MjAwMDA+OwogCX07CiAKIAlwYXJ0aXRpb25AMTAwMDAwIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2tpcmt3b29kLW9wZW5yZC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMva2lya3dvb2Qtb3BlbnJkLmR0c2kKaW5kZXggZTRlY2FiMS4uNzE3NTUxMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMva2lya3dvb2Qtb3BlbnJkLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMva2lya3dvb2Qtb3BlbnJkLmR0c2kKQEAgLTExNiw2ICsxMTYsMTAgQEAKIAl9OwogfTsKIAorJnBjaWVjIHsKKwlzdGF0dXMgPSAib2theSI7Cit9OworCiAmcGNpZTAgewogCXN0YXR1cyA9ICJva2F5IjsKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9sb2dpY3BkLXNvbS1sdi5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvbG9naWNwZC1zb20tbHYuZHRzaQppbmRleCAzNjVmMzlmZi4uMGZmMWMyZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvbG9naWNwZC1zb20tbHYuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9sb2dpY3BkLXNvbS1sdi5kdHNpCkBAIC0zNSwxMCArMzUsMTUgQEAKIAlyYW5nZXMgPSA8MCAwIDB4MDAwMDAwMDAgMHgxMDAwMDAwPjsJLyogQ1MwOiAxNk1CIGZvciBOQU5EICovCiAKIAluYW5kQDAsMCB7Ci0JCWxpbnV4LG10ZC1uYW1lID0gIm1pY3JvbixtdDI5ZjRnMTZhYmJkYTN3IjsKKwkJY29tcGF0aWJsZSA9ICJ0aSxvbWFwMi1uYW5kIjsKIAkJcmVnID0gPDAgMCA0PjsgLyogQ1MwLCBvZmZzZXQgMCwgSU8gc2l6ZSA0ICovCisJCWludGVycnVwdC1wYXJlbnQgPSA8JmdwbWM+OworCQlpbnRlcnJ1cHRzID0gPDAgSVJRX1RZUEVfTk9ORT4sIC8qIGZpZm9ldmVudCAqLworCQkJICAgICA8MSBJUlFfVFlQRV9OT05FPjsJLyogdGVybWNvdW50ICovCisJCWxpbnV4LG10ZC1uYW1lID0gIm1pY3JvbixtdDI5ZjRnMTZhYmJkYTN3IjsKIAkJbmFuZC1idXMtd2lkdGggPSA8MTY+OwogCQl0aSxuYW5kLWVjYy1vcHQgPSAiYmNoOCI7CisJCXJiLWdwaW9zID0gPCZncG1jIDAgR1BJT19BQ1RJVkVfSElHSD47IC8qIGdwbWNfd2FpdDAgKi8KIAkJZ3BtYyxzeW5jLWNsay1wcyA9IDwwPjsKIAkJZ3BtYyxjcy1vbi1ucyA9IDwwPjsKIAkJZ3BtYyxjcy1yZC1vZmYtbnMgPSA8NDQ+OwpAQCAtNTQsMTAgKzU5LDYgQEAKIAkJZ3BtYyx3ci1hY2Nlc3MtbnMgPSA8NDA+OwogCQlncG1jLHdyLWRhdGEtbXV4LWJ1cy1ucyA9IDwwPjsKIAkJZ3BtYyxkZXZpY2Utd2lkdGggPSA8Mj47Ci0KLQkJZ3BtYyxwYWdlLWJ1cnN0LWFjY2Vzcy1ucyA9IDw1PjsKLQkJZ3BtYyxjeWNsZTJjeWNsZS1kZWxheS1ucyA9IDw1MD47Ci0KIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDE+OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9sb2dpY3BkLXRvcnBlZG8tc29tLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9sb2dpY3BkLXRvcnBlZG8tc29tLmR0c2kKaW5kZXggNWU5YTEzYy4uMWMyYzc0NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvbG9naWNwZC10b3JwZWRvLXNvbS5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2xvZ2ljcGQtdG9ycGVkby1zb20uZHRzaQpAQCAtNDYsNiArNDYsNyBAQAogCQlsaW51eCxtdGQtbmFtZSA9ICJtaWNyb24sbXQyOWY0ZzE2YWJiZGEzdyI7CiAJCW5hbmQtYnVzLXdpZHRoID0gPDE2PjsKIAkJdGksbmFuZC1lY2Mtb3B0ID0gImJjaDgiOworCQlyYi1ncGlvcyA9IDwmZ3BtYyAwIEdQSU9fQUNUSVZFX0hJR0g+OyAvKiBncG1jX3dhaXQwICovCiAJCWdwbWMsc3luYy1jbGstcHMgPSA8MD47CiAJCWdwbWMsY3Mtb24tbnMgPSA8MD47CiAJCWdwbWMsY3MtcmQtb2ZmLW5zID0gPDQ0PjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXAzLW92ZXJvLWJhc2UuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXAzLW92ZXJvLWJhc2UuZHRzaQppbmRleCBkZTI1NmZhLi4zZTk0NmNhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9vbWFwMy1vdmVyby1iYXNlLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDMtb3Zlcm8tYmFzZS5kdHNpCkBAIC0yMjMsNyArMjIzLDkgQEAKIH07CiAKICZncG1jIHsKLQlyYW5nZXMgPSA8MCAwIDB4MDAwMDAwMDAgMHgyMDAwMDAwMD47CisJcmFuZ2VzID0gPDAgMCAweDMwMDAwMDAwIDB4MTAwMDAwMD4sCS8qIENTMCAqLworCQkgPDQgMCAweDJiMDAwMDAwIDB4MTAwMDAwMD4sCS8qIENTNCAqLworCQkgPDUgMCAweDJjMDAwMDAwIDB4MTAwMDAwMD47CS8qIENTNSAqLwogCiAJbmFuZEAwLDAgewogCQljb21wYXRpYmxlID0gInRpLG9tYXAyLW5hbmQiOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDMtb3Zlcm8tY2hlc3RudXQ0My1jb21tb24uZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXAzLW92ZXJvLWNoZXN0bnV0NDMtY29tbW9uLmR0c2kKaW5kZXggN2RmMjc5Mi4uNGY0YzZlZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDMtb3Zlcm8tY2hlc3RudXQ0My1jb21tb24uZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9vbWFwMy1vdmVyby1jaGVzdG51dDQzLWNvbW1vbi5kdHNpCkBAIC01NSw4ICs1NSw2IEBACiAjaW5jbHVkZSAib21hcC1ncG1jLXNtc2M5MjIxLmR0c2kiCiAKICZncG1jIHsKLQlyYW5nZXMgPSA8NSAwIDB4MmMwMDAwMDAgMHgxMDAwMDAwPjsJLyogQ1M1ICovCi0KIAlldGhlcm5ldEBncG1jIHsKIAkJcmVnID0gPDUgMCAweGZmPjsKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ3BpbzY+OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDMtb3Zlcm8tdG9iaS1jb21tb24uZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXAzLW92ZXJvLXRvYmktY29tbW9uLmR0c2kKaW5kZXggOWUyNGI2YS4uMWIzMDRlMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDMtb3Zlcm8tdG9iaS1jb21tb24uZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9vbWFwMy1vdmVyby10b2JpLWNvbW1vbi5kdHNpCkBAIC0yNyw4ICsyNyw2IEBACiAjaW5jbHVkZSAib21hcC1ncG1jLXNtc2M5MjIxLmR0c2kiCiAKICZncG1jIHsKLQlyYW5nZXMgPSA8NSAwIDB4MmMwMDAwMDAgMHgxMDAwMDAwPjsJLyogQ1M1ICovCi0KIAlldGhlcm5ldEBncG1jIHsKIAkJcmVnID0gPDUgMCAweGZmPjsKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ3BpbzY+OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDMtb3Zlcm8tdG9iaWR1by1jb21tb24uZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXAzLW92ZXJvLXRvYmlkdW8tY29tbW9uLmR0c2kKaW5kZXggMzM0MTA5ZS4uODJlOThlZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDMtb3Zlcm8tdG9iaWR1by1jb21tb24uZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9vbWFwMy1vdmVyby10b2JpZHVvLWNvbW1vbi5kdHNpCkBAIC0xNSw5ICsxNSw2IEBACiAjaW5jbHVkZSAib21hcC1ncG1jLXNtc2M5MjIxLmR0c2kiCiAKICZncG1jIHsKLQlyYW5nZXMgPSA8NCAwIDB4MmIwMDAwMDAgMHgxMDAwMDAwPiwJLyogQ1M0ICovCi0JCSA8NSAwIDB4MmMwMDAwMDAgMHgxMDAwMDAwPjsJLyogQ1M1ICovCi0KIAlzbXNjMTogZXRoZXJuZXRAZ3BtYyB7CiAJCXJlZyA9IDw1IDAgMHhmZj47CiAJCWludGVycnVwdC1wYXJlbnQgPSA8JmdwaW82PjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3JrMzA2NmEuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL3JrMzA2NmEuZHRzaQppbmRleCBjMGJhODZjLi4wZDBkYWUzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9yazMwNjZhLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvcmszMDY2YS5kdHNpCkBAIC0xOTcsNiArMTk3LDggQEAKIAkJY2xvY2stbmFtZXMgPSAic2FyYWRjIiwgImFwYl9wY2xrIjsKIAkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDIxIElSUV9UWVBFX0xFVkVMX0hJR0g+OwogCQkjaW8tY2hhbm5lbC1jZWxscyA9IDwxPjsKKwkJcmVzZXRzID0gPCZjcnUgU1JTVF9TQVJBREM+OworCQlyZXNldC1uYW1lcyA9ICJzYXJhZGMtYXBiIjsKIAkJc3RhdHVzID0gImRpc2FibGVkIjsKIAl9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9yazMyODguZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL3JrMzI4OC5kdHNpCmluZGV4IGNkMzNmMDEuLjkxYzRiM2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3JrMzI4OC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3JrMzI4OC5kdHNpCkBAIC0yNzksNiArMjc5LDggQEAKIAkJI2lvLWNoYW5uZWwtY2VsbHMgPSA8MT47CiAJCWNsb2NrcyA9IDwmY3J1IFNDTEtfU0FSQURDPiwgPCZjcnUgUENMS19TQVJBREM+OwogCQljbG9jay1uYW1lcyA9ICJzYXJhZGMiLCAiYXBiX3BjbGsiOworCQlyZXNldHMgPSA8JmNydSBTUlNUX1NBUkFEQz47CisJCXJlc2V0LW5hbWVzID0gInNhcmFkYy1hcGIiOwogCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCX07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3JrM3h4eC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvcmszeHh4LmR0c2kKaW5kZXggOTliYmNjMi4uZTJjZDY4MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvcmszeHh4LmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvcmszeHh4LmR0c2kKQEAgLTM5OSw2ICszOTksOCBAQAogCQkjaW8tY2hhbm5lbC1jZWxscyA9IDwxPjsKIAkJY2xvY2tzID0gPCZjcnUgU0NMS19TQVJBREM+LCA8JmNydSBQQ0xLX1NBUkFEQz47CiAJCWNsb2NrLW5hbWVzID0gInNhcmFkYyIsICJhcGJfcGNsayI7CisJCXJlc2V0cyA9IDwmY3J1IFNSU1RfU0FSQURDPjsKKwkJcmVzZXQtbmFtZXMgPSAic2FyYWRjLWFwYiI7CiAJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvc29jZnBnYV9hcnJpYTEwLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9zb2NmcGdhX2FycmlhMTAuZHRzaQppbmRleCA5NDAwMGNiLi5mNTIwY2JmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9zb2NmcGdhX2FycmlhMTAuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9zb2NmcGdhX2FycmlhMTAuZHRzaQpAQCAtNjM5LDYgKzYzOSwyMiBAQAogCQkJCWludGVycnVwdHMgPSA8NSBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKIAkJCQkJICAgICA8MzcgSVJRX1RZUEVfTEVWRUxfSElHSD47CiAJCQl9OworCisJCQlkbWEtZWNjQGZmOGM4MDAwIHsKKwkJCQljb21wYXRpYmxlID0gImFsdHIsc29jZnBnYS1kbWEtZWNjIjsKKwkJCQlyZWcgPSA8MHhmZjhjODAwMCAweDQwMD47CisJCQkJYWx0cixlY2MtcGFyZW50ID0gPCZwZG1hPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDEwIElSUV9UWVBFX0xFVkVMX0hJR0g+LAorCQkJCQkgICAgIDw0MiBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJCX07CisKKwkJCXVzYjAtZWNjQGZmOGM4ODAwIHsKKwkJCQljb21wYXRpYmxlID0gImFsdHIsc29jZnBnYS11c2ItZWNjIjsKKwkJCQlyZWcgPSA8MHhmZjhjODgwMCAweDQwMD47CisJCQkJYWx0cixlY2MtcGFyZW50ID0gPCZ1c2IwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDIgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCQkJCSAgICAgPDM0IElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQkJfTsKIAkJfTsKIAogCQlyc3Q6IHJzdG1nckBmZmQwNTAwMCB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9zb2NmcGdhX2FycmlhMTBfc29jZGtfc2RtbWMuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvc29jZnBnYV9hcnJpYTEwX3NvY2RrX3NkbW1jLmR0cwppbmRleCA4YTdkZmE0Li4wNDBhMTY0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9zb2NmcGdhX2FycmlhMTBfc29jZGtfc2RtbWMuZHRzCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3NvY2ZwZ2FfYXJyaWExMF9zb2Nka19zZG1tYy5kdHMKQEAgLTI1LDMgKzI1LDE1IEBACiAJYnJva2VuLWNkOwogCWJ1cy13aWR0aCA9IDw0PjsKIH07CisKKyZlY2NtZ3IgeworCXNkbW1jYS1lY2NAZmY4YzJjMDAgeworCQljb21wYXRpYmxlID0gImFsdHIsc29jZnBnYS1zZG1tYy1lY2MiOworCQlyZWcgPSA8MHhmZjhjMmMwMCAweDQwMD47CisJCWFsdHIsZWNjLXBhcmVudCA9IDwmbW1jPjsKKwkJaW50ZXJydXB0cyA9IDwxNSBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKKwkJCSAgICAgPDQ3IElSUV9UWVBFX0xFVkVMX0hJR0g+LAorCQkJICAgICA8MTYgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCQkgICAgIDw0OCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N0aWg0MDctZmFtaWx5LmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9zdGloNDA3LWZhbWlseS5kdHNpCmluZGV4IGQyOTRlODIuLjhiMDYzYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N0aWg0MDctZmFtaWx5LmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3RpaDQwNy1mYW1pbHkuZHRzaQpAQCAtNTUwLDggKzU1MCw5IEBACiAJCQlpbnRlcnJ1cHQtbmFtZXMgPSAibW1jaXJxIjsKIAkJCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CiAJCQlwaW5jdHJsLTAgPSA8JnBpbmN0cmxfbW1jMD47Ci0JCQljbG9jay1uYW1lcyA9ICJtbWMiOwotCQkJY2xvY2tzID0gPCZjbGtfc19jMF9mbGV4Z2VuIENMS19NTUNfMD47CisJCQljbG9jay1uYW1lcyA9ICJtbWMiLCAiaWNuIjsKKwkJCWNsb2NrcyA9IDwmY2xrX3NfYzBfZmxleGdlbiBDTEtfTU1DXzA+LAorCQkJCSA8JmNsa19zX2MwX2ZsZXhnZW4gQ0xLX1JYX0lDTl9IVkE+OwogCQkJYnVzLXdpZHRoID0gPDg+OwogCQkJbm9uLXJlbW92YWJsZTsKIAkJfTsKQEAgLTU2NSw4ICs1NjYsOSBAQAogCQkJaW50ZXJydXB0LW5hbWVzID0gIm1tY2lycSI7CiAJCQlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOwogCQkJcGluY3RybC0wID0gPCZwaW5jdHJsX3NkMT47Ci0JCQljbG9jay1uYW1lcyA9ICJtbWMiOwotCQkJY2xvY2tzID0gPCZjbGtfc19jMF9mbGV4Z2VuIENMS19NTUNfMT47CisJCQljbG9jay1uYW1lcyA9ICJtbWMiLCAiaWNuIjsKKwkJCWNsb2NrcyA9IDwmY2xrX3NfYzBfZmxleGdlbiBDTEtfTU1DXzE+LAorCQkJCSA8JmNsa19zX2MwX2ZsZXhnZW4gQ0xLX1JYX0lDTl9IVkE+OwogCQkJcmVzZXRzID0gPCZzb2Z0cmVzZXQgU1RJSDQwN19NTUMxX1NPRlRSRVNFVD47CiAJCQlidXMtd2lkdGggPSA8ND47CiAJCX07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9zdGloNDEwLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9zdGloNDEwLmR0c2kKaW5kZXggMThlZDFhZC4uNDAzMTg4NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvc3RpaDQxMC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3N0aWg0MTAuZHRzaQpAQCAtNDEsNyArNDEsOCBAQAogCQkJY29tcGF0aWJsZSA9ICJzdCxzdC1vaGNpLTMwMHgiOwogCQkJcmVnID0gPDB4OWEwM2MwMCAweDEwMD47CiAJCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMTgwIElSUV9UWVBFX05PTkU+OwotCQkJY2xvY2tzID0gPCZjbGtfc19jMF9mbGV4Z2VuIENMS19UWF9JQ05fRElTUF8wPjsKKwkJCWNsb2NrcyA9IDwmY2xrX3NfYzBfZmxleGdlbiBDTEtfVFhfSUNOX0RJU1BfMD4sCisJCQkJIDwmY2xrX3NfYzBfZmxleGdlbiBDTEtfUlhfSUNOX0RJU1BfMD47CiAJCQlyZXNldHMgPSA8JnBvd2VyZG93biBTVElINDA3X1VTQjJfUE9SVDBfUE9XRVJET1dOPiwKIAkJCQkgPCZzb2Z0cmVzZXQgU1RJSDQwN19VU0IyX1BPUlQwX1NPRlRSRVNFVD47CiAJCQlyZXNldC1uYW1lcyA9ICJwb3dlciIsICJzb2Z0cmVzZXQiOwpAQCAtNTcsNyArNTgsOCBAQAogCQkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDE1MSBJUlFfVFlQRV9OT05FPjsKIAkJCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CiAJCQlwaW5jdHJsLTAgPSA8JnBpbmN0cmxfdXNiMD47Ci0JCQljbG9ja3MgPSA8JmNsa19zX2MwX2ZsZXhnZW4gQ0xLX1RYX0lDTl9ESVNQXzA+OworCQkJY2xvY2tzID0gPCZjbGtfc19jMF9mbGV4Z2VuIENMS19UWF9JQ05fRElTUF8wPiwKKwkJCQkgPCZjbGtfc19jMF9mbGV4Z2VuIENMS19SWF9JQ05fRElTUF8wPjsKIAkJCXJlc2V0cyA9IDwmcG93ZXJkb3duIFNUSUg0MDdfVVNCMl9QT1JUMF9QT1dFUkRPV04+LAogCQkJCSA8JnNvZnRyZXNldCBTVElINDA3X1VTQjJfUE9SVDBfU09GVFJFU0VUPjsKIAkJCXJlc2V0LW5hbWVzID0gInBvd2VyIiwgInNvZnRyZXNldCI7CkBAIC03MSw3ICs3Myw4IEBACiAJCQljb21wYXRpYmxlID0gInN0LHN0LW9oY2ktMzAweCI7CiAJCQlyZWcgPSA8MHg5YTgzYzAwIDB4MTAwPjsKIAkJCWludGVycnVwdHMgPSA8R0lDX1NQSSAxODEgSVJRX1RZUEVfTk9ORT47Ci0JCQljbG9ja3MgPSA8JmNsa19zX2MwX2ZsZXhnZW4gQ0xLX1RYX0lDTl9ESVNQXzA+OworCQkJY2xvY2tzID0gPCZjbGtfc19jMF9mbGV4Z2VuIENMS19UWF9JQ05fRElTUF8wPiwKKwkJCQkgPCZjbGtfc19jMF9mbGV4Z2VuIENMS19SWF9JQ05fRElTUF8wPjsKIAkJCXJlc2V0cyA9IDwmcG93ZXJkb3duIFNUSUg0MDdfVVNCMl9QT1JUMV9QT1dFUkRPV04+LAogCQkJCSA8JnNvZnRyZXNldCBTVElINDA3X1VTQjJfUE9SVDFfU09GVFJFU0VUPjsKIAkJCXJlc2V0LW5hbWVzID0gInBvd2VyIiwgInNvZnRyZXNldCI7CkBAIC04Nyw3ICs5MCw4IEBACiAJCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMTUzIElSUV9UWVBFX05PTkU+OwogCQkJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKIAkJCXBpbmN0cmwtMCA9IDwmcGluY3RybF91c2IxPjsKLQkJCWNsb2NrcyA9IDwmY2xrX3NfYzBfZmxleGdlbiBDTEtfVFhfSUNOX0RJU1BfMD47CisJCQljbG9ja3MgPSA8JmNsa19zX2MwX2ZsZXhnZW4gQ0xLX1RYX0lDTl9ESVNQXzA+LAorCQkJCSA8JmNsa19zX2MwX2ZsZXhnZW4gQ0xLX1JYX0lDTl9ESVNQXzA+OwogCQkJcmVzZXRzID0gPCZwb3dlcmRvd24gU1RJSDQwN19VU0IyX1BPUlQxX1BPV0VSRE9XTj4sCiAJCQkJIDwmc29mdHJlc2V0IFNUSUg0MDdfVVNCMl9QT1JUMV9TT0ZUUkVTRVQ+OwogCQkJcmVzZXQtbmFtZXMgPSAicG93ZXIiLCAic29mdHJlc2V0IjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N0bTMyZjQyOS5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3RtMzJmNDI5LmR0c2kKaW5kZXggMzVkZjQ2Mi4uMWExODlkNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvc3RtMzJmNDI5LmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3RtMzJmNDI5LmR0c2kKQEAgLTE3Niw2ICsxNzYsMTQgQEAKIAkJCXJlZyA9IDwweDQwMDEzODAwIDB4NDAwPjsKIAkJfTsKIAorCQlleHRpOiBpbnRlcnJ1cHQtY29udHJvbGxlckA0MDAxM2MwMCB7CisJCQljb21wYXRpYmxlID0gInN0LHN0bTMyLWV4dGkiOworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQkJcmVnID0gPDB4NDAwMTNDMDAgMHg0MDA+OworCQkJaW50ZXJydXB0cyA9IDwxPiwgPDI+LCA8Mz4sIDw2PiwgPDc+LCA8OD4sIDw5PiwgPDEwPiwgPDIzPiwgPDQwPiwgPDQxPiwgPDQyPiwgPDYyPiwgPDc2PjsKKwkJfTsKKwogCQlwaW4tY29udHJvbGxlciB7CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDE+OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvc3VuNWktYTEzLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9zdW41aS1hMTMuZHRzaQppbmRleCBlMDEyODkwLi5hMTdiYTAyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9zdW41aS1hMTMuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9zdW41aS1hMTMuZHRzaQpAQCAtODQsNyArODQsNyBAQAogCQkJdHJpcHMgewogCQkJCWNwdV9hbGVydDA6IGNwdV9hbGVydDAgewogCQkJCQkvKiBtaWxsaUNlbHNpdXMgKi8KLQkJCQkJdGVtcGVyYXR1cmUgPSA8ODUwMDAwPjsKKwkJCQkJdGVtcGVyYXR1cmUgPSA8ODUwMDA+OwogCQkJCQloeXN0ZXJlc2lzID0gPDIwMDA+OwogCQkJCQl0eXBlID0gInBhc3NpdmUiOwogCQkJCX07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9zdW42aS1hMzEuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjZpLWEzMS5kdHNpCmluZGV4IDE4NjdhZjIuLjBkMjRmMTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjZpLWEzMS5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjZpLWEzMS5kdHNpCkBAIC00NjksNyArNDY5LDcgQEAKIAkJfTsKIAogCQltbWMwOiBtbWNAMDFjMGYwMDAgewotCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNWktYTEzLW1tYyI7CisJCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW43aS1hMjAtbW1jIjsKIAkJCXJlZyA9IDwweDAxYzBmMDAwIDB4MTAwMD47CiAJCQljbG9ja3MgPSA8JmFoYjFfZ2F0ZXMgOD4sCiAJCQkJIDwmbW1jMF9jbGsgMD4sCkBAIC00ODgsNyArNDg4LDcgQEAKIAkJfTsKIAogCQltbWMxOiBtbWNAMDFjMTAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNWktYTEzLW1tYyI7CisJCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW43aS1hMjAtbW1jIjsKIAkJCXJlZyA9IDwweDAxYzEwMDAwIDB4MTAwMD47CiAJCQljbG9ja3MgPSA8JmFoYjFfZ2F0ZXMgOT4sCiAJCQkJIDwmbW1jMV9jbGsgMD4sCkBAIC01MDcsNyArNTA3LDcgQEAKIAkJfTsKIAogCQltbWMyOiBtbWNAMDFjMTEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNWktYTEzLW1tYyI7CisJCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW43aS1hMjAtbW1jIjsKIAkJCXJlZyA9IDwweDAxYzExMDAwIDB4MTAwMD47CiAJCQljbG9ja3MgPSA8JmFoYjFfZ2F0ZXMgMTA+LAogCQkJCSA8Jm1tYzJfY2xrIDA+LApAQCAtNTI2LDcgKzUyNiw3IEBACiAJCX07CiAKIAkJbW1jMzogbW1jQDAxYzEyMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjVpLWExMy1tbWMiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuN2ktYTIwLW1tYyI7CiAJCQlyZWcgPSA8MHgwMWMxMjAwMCAweDEwMDA+OwogCQkJY2xvY2tzID0gPCZhaGIxX2dhdGVzIDExPiwKIAkJCQkgPCZtbWMzX2NsayAwPiwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjdpLWEyMC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3VuN2ktYTIwLmR0c2kKaW5kZXggYmQwYzQ3Ni4uOTRjZjVhMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvc3VuN2ktYTIwLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3VuN2ktYTIwLmR0c2kKQEAgLTkwNSw3ICs5MDUsNyBAQAogCQl9OwogCiAJCW1tYzA6IG1tY0AwMWMwZjAwMCB7Ci0JCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW41aS1hMTMtbW1jIjsKKwkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjdpLWEyMC1tbWMiOwogCQkJcmVnID0gPDB4MDFjMGYwMDAgMHgxMDAwPjsKIAkJCWNsb2NrcyA9IDwmYWhiX2dhdGVzIDg+LAogCQkJCSA8Jm1tYzBfY2xrIDA+LApAQCAtOTIyLDcgKzkyMiw3IEBACiAJCX07CiAKIAkJbW1jMTogbW1jQDAxYzEwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjVpLWExMy1tbWMiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuN2ktYTIwLW1tYyI7CiAJCQlyZWcgPSA8MHgwMWMxMDAwMCAweDEwMDA+OwogCQkJY2xvY2tzID0gPCZhaGJfZ2F0ZXMgOT4sCiAJCQkJIDwmbW1jMV9jbGsgMD4sCkBAIC05MzksNyArOTM5LDcgQEAKIAkJfTsKIAogCQltbWMyOiBtbWNAMDFjMTEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNWktYTEzLW1tYyI7CisJCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW43aS1hMjAtbW1jIjsKIAkJCXJlZyA9IDwweDAxYzExMDAwIDB4MTAwMD47CiAJCQljbG9ja3MgPSA8JmFoYl9nYXRlcyAxMD4sCiAJCQkJIDwmbW1jMl9jbGsgMD4sCkBAIC05NTYsNyArOTU2LDcgQEAKIAkJfTsKIAogCQltbWMzOiBtbWNAMDFjMTIwMDAgewotCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNWktYTEzLW1tYyI7CisJCQljb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW43aS1hMjAtbW1jIjsKIAkJCXJlZyA9IDwweDAxYzEyMDAwIDB4MTAwMD47CiAJCQljbG9ja3MgPSA8JmFoYl9nYXRlcyAxMT4sCiAJCQkJIDwmbW1jM19jbGsgMD4sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9zdW44aS1hMjMtYTMzLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9zdW44aS1hMjMtYTMzLmR0c2kKaW5kZXggN2UwNWUwOS4uZTNiMTk2ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvc3VuOGktYTIzLWEzMy5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjhpLWEyMy1hMzMuZHRzaQpAQCAtMjY2LDcgKzI2Niw3IEBACiAJCX07CiAKIAkJbW1jMDogbW1jQDAxYzBmMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjVpLWExMy1tbWMiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuN2ktYTIwLW1tYyI7CiAJCQlyZWcgPSA8MHgwMWMwZjAwMCAweDEwMDA+OwogCQkJY2xvY2tzID0gPCZhaGIxX2dhdGVzIDg+LAogCQkJCSA8Jm1tYzBfY2xrIDA+LApAQCAtMjg1LDcgKzI4NSw3IEBACiAJCX07CiAKIAkJbW1jMTogbW1jQDAxYzEwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjVpLWExMy1tbWMiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuN2ktYTIwLW1tYyI7CiAJCQlyZWcgPSA8MHgwMWMxMDAwMCAweDEwMDA+OwogCQkJY2xvY2tzID0gPCZhaGIxX2dhdGVzIDk+LAogCQkJCSA8Jm1tYzFfY2xrIDA+LApAQCAtMzA0LDcgKzMwNCw3IEBACiAJCX07CiAKIAkJbW1jMjogbW1jQDAxYzExMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjVpLWExMy1tbWMiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuN2ktYTIwLW1tYyI7CiAJCQlyZWcgPSA8MHgwMWMxMTAwMCAweDEwMDA+OwogCQkJY2xvY2tzID0gPCZhaGIxX2dhdGVzIDEwPiwKIAkJCQkgPCZtbWMyX2NsayAwPiwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjhpLWgzLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9zdW44aS1oMy5kdHNpCmluZGV4IGZkZjlmZGIuLjhhOTVlMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjhpLWgzLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3VuOGktaDMuZHRzaQpAQCAtMTUwLDcgKzE1MCw3IEBACiAJCX07CiAKIAkJbW1jMDogbW1jQDAxYzBmMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjVpLWExMy1tbWMiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuN2ktYTIwLW1tYyI7CiAJCQlyZWcgPSA8MHgwMWMwZjAwMCAweDEwMDA+OwogCQkJY2xvY2tzID0gPCZjY3UgQ0xLX0JVU19NTUMwPiwKIAkJCQkgPCZjY3UgQ0xLX01NQzA+LApAQCAtMTY5LDcgKzE2OSw3IEBACiAJCX07CiAKIAkJbW1jMTogbW1jQDAxYzEwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjVpLWExMy1tbWMiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuN2ktYTIwLW1tYyI7CiAJCQlyZWcgPSA8MHgwMWMxMDAwMCAweDEwMDA+OwogCQkJY2xvY2tzID0gPCZjY3UgQ0xLX0JVU19NTUMxPiwKIAkJCQkgPCZjY3UgQ0xLX01NQzE+LApAQCAtMTg4LDcgKzE4OCw3IEBACiAJCX07CiAKIAkJbW1jMjogbW1jQDAxYzExMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjVpLWExMy1tbWMiOworCQkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuN2ktYTIwLW1tYyI7CiAJCQlyZWcgPSA8MHgwMWMxMTAwMCAweDEwMDA+OwogCQkJY2xvY2tzID0gPCZjY3UgQ0xLX0JVU19NTUMyPiwKIAkJCQkgPCZjY3UgQ0xLX01NQzI+LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmExMTQtZGFsbW9yZS5kdHMgYi9hcmNoL2FybS9ib290L2R0cy90ZWdyYTExNC1kYWxtb3JlLmR0cwppbmRleCAxZGZjNDkyLi4xNDQ0ZmJkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy90ZWdyYTExNC1kYWxtb3JlLmR0cworKysgYi9hcmNoL2FybS9ib290L2R0cy90ZWdyYTExNC1kYWxtb3JlLmR0cwpAQCAtODk3LDcgKzg5Nyw3IEBACiAJCXBhbG1hczogdHBzNjU5MTNANTggewogCQkJY29tcGF0aWJsZSA9ICJ0aSxwYWxtYXMiOwogCQkJcmVnID0gPDB4NTg+OwotCQkJaW50ZXJydXB0cyA9IDwwIDg2IElSUV9UWVBFX0xFVkVMX0xPVz47CisJCQlpbnRlcnJ1cHRzID0gPDAgODYgSVJRX1RZUEVfTEVWRUxfSElHSD47CiAKIAkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CiAJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhMTE0LXJvdGguZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmExMTQtcm90aC5kdHMKaW5kZXggNzBjZjQwOS4uOTY2YTdmYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmExMTQtcm90aC5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmExMTQtcm90aC5kdHMKQEAgLTgwMiw3ICs4MDIsNyBAQAogCQlwYWxtYXM6IHBtaWNANTggewogCQkJY29tcGF0aWJsZSA9ICJ0aSxwYWxtYXMiOwogCQkJcmVnID0gPDB4NTg+OwotCQkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDg2IElSUV9UWVBFX0xFVkVMX0xPVz47CisJCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgODYgSVJRX1RZUEVfTEVWRUxfSElHSD47CiAKIAkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CiAJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhMTE0LXRuNy5kdHMgYi9hcmNoL2FybS9ib290L2R0cy90ZWdyYTExNC10bjcuZHRzCmluZGV4IDE3ZGQxNDUuLmExNjFmYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhMTE0LXRuNy5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmExMTQtdG43LmR0cwpAQCAtNjMsNyArNjMsNyBAQAogCQlwYWxtYXM6IHBtaWNANTggewogCQkJY29tcGF0aWJsZSA9ICJ0aSxwYWxtYXMiOwogCQkJcmVnID0gPDB4NTg+OwotCQkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDg2IElSUV9UWVBFX0xFVkVMX0xPVz47CisJCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgODYgSVJRX1RZUEVfTEVWRUxfSElHSD47CiAKIAkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CiAJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhMTI0LWpldHNvbi10azEuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmExMjQtamV0c29uLXRrMS5kdHMKaW5kZXggNjQwM2UwZC4uZTUyYjgyNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmExMjQtamV0c29uLXRrMS5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmExMjQtamV0c29uLXRrMS5kdHMKQEAgLTEzODIsNyArMTM4Miw3IEBACiAJICogICBQaW4gNDE6IEJSX1VBUlQxX1RYRAogCSAqICAgUGluIDQ0OiBCUl9VQVJUMV9SWEQKIAkgKi8KLQlzZXJpYWxAMCw3MDAwNjAwMCB7CisJc2VyaWFsQDcwMDA2MDAwIHsKIAkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmExMjQtaHN1YXJ0IiwgIm52aWRpYSx0ZWdyYTMwLWhzdWFydCI7CiAJCXN0YXR1cyA9ICJva2F5IjsKIAl9OwpAQCAtMTM5NCw3ICsxMzk0LDcgQEAKIAkgKiAgIFBpbiA3MTogVUFSVDJfQ1RTX0wKIAkgKiAgIFBpbiA3NDogVUFSVDJfUlRTX0wKIAkgKi8KLQlzZXJpYWxAMCw3MDAwNjA0MCB7CisJc2VyaWFsQDcwMDA2MDQwIHsKIAkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmExMjQtaHN1YXJ0IiwgIm52aWRpYSx0ZWdyYTMwLWhzdWFydCI7CiAJCXN0YXR1cyA9ICJva2F5IjsKIAl9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL2JMX3N3aXRjaGVyX2R1bW15X2lmLmMgYi9hcmNoL2FybS9jb21tb24vYkxfc3dpdGNoZXJfZHVtbXlfaWYuYwppbmRleCAzZjQ3ZjEyLi42MDUzZjY0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vYkxfc3dpdGNoZXJfZHVtbXlfaWYuYworKysgYi9hcmNoL2FybS9jb21tb24vYkxfc3dpdGNoZXJfZHVtbXlfaWYuYwpAQCAtNTYsMTYgKzU2LDQgQEAKIAkiYi5MX3N3aXRjaGVyIiwKIAkmYkxfc3dpdGNoZXJfZm9wcwogfTsKLQotc3RhdGljIGludCBfX2luaXQgYkxfc3dpdGNoZXJfZHVtbXlfaWZfaW5pdCh2b2lkKQotewotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZiTF9zd2l0Y2hlcl9kZXZpY2UpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYkxfc3dpdGNoZXJfZHVtbXlfaWZfZXhpdCh2b2lkKQotewotCW1pc2NfZGVyZWdpc3RlcigmYkxfc3dpdGNoZXJfZGV2aWNlKTsKLX0KLQotbW9kdWxlX2luaXQoYkxfc3dpdGNoZXJfZHVtbXlfaWZfaW5pdCk7Ci1tb2R1bGVfZXhpdChiTF9zd2l0Y2hlcl9kdW1teV9pZl9leGl0KTsKK21vZHVsZV9taXNjX2RldmljZShiTF9zd2l0Y2hlcl9kZXZpY2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL2xvY29tby5jIGIvYXJjaC9hcm0vY29tbW9uL2xvY29tby5jCmluZGV4IDBlOTdiNGIuLjZjN2IwNjg1NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL2xvY29tby5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9sb2NvbW8uYwpAQCAtMTQwLDcgKzE0MCw3IEBACiAKIHN0YXRpYyB2b2lkIGxvY29tb19oYW5kbGVyKHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKIHsKLQlzdHJ1Y3QgbG9jb21vICpsY2hpcCA9IGlycV9kZXNjX2dldF9jaGlwX2RhdGEoZGVzYyk7CisJc3RydWN0IGxvY29tbyAqbGNoaXAgPSBpcnFfZGVzY19nZXRfaGFuZGxlcl9kYXRhKGRlc2MpOwogCWludCByZXEsIGk7CiAKIAkvKiBBY2tub3dsZWRnZSB0aGUgcGFyZW50IElSUSAqLwpAQCAtMjAwLDggKzIwMCw3IEBACiAJICogSW5zdGFsbCBoYW5kbGVyIGZvciBJUlFfTE9DT01PX0hXLgogCSAqLwogCWlycV9zZXRfaXJxX3R5cGUobGNoaXAtPmlycSwgSVJRX1RZUEVfRURHRV9GQUxMSU5HKTsKLQlpcnFfc2V0X2NoaXBfZGF0YShsY2hpcC0+aXJxLCBsY2hpcCk7Ci0JaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIobGNoaXAtPmlycSwgbG9jb21vX2hhbmRsZXIpOworCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyX2FuZF9kYXRhKGxjaGlwLT5pcnEsIGxvY29tb19oYW5kbGVyLCBsY2hpcCk7CiAKIAkvKiBJbnN0YWxsIGhhbmRsZXJzIGZvciBJUlFfTE9DT01PXyogKi8KIAlmb3IgKCA7IGlycSA8PSBsY2hpcC0+aXJxX2Jhc2UgKyAzOyBpcnErKykgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL3NhMTExMS5jIGIvYXJjaC9hcm0vY29tbW9uL3NhMTExMS5jCmluZGV4IGZiMGEwYTQuLjRlY2Q1MTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbW1vbi9zYTExMTEuYworKysgYi9hcmNoL2FybS9jb21tb24vc2ExMTExLmMKQEAgLTE1LDYgKzE1LDcgQEAKICAqIGZyb20gbWFjaGluZSBzcGVjaWZpYyBjb2RlIHdpdGggcHJvcGVyIGFyZ3VtZW50cyB3aGVuIHJlcXVpcmVkLgogICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0xMDcsNiArMTA4LDcgQEAKIAlzcGlubG9ja190CWxvY2s7CiAJdm9pZCBfX2lvbWVtCSpiYXNlOwogCXN0cnVjdCBzYTExMTFfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IGdwaW9fY2hpcCBnYzsKICNpZmRlZiBDT05GSUdfUE0KIAl2b2lkCQkqc2F2ZWRfc3RhdGU7CiAjZW5kaWYKQEAgLTIzMSwzMCArMjMzLDQ0IEBACiAjZGVmaW5lIFNBMTExMV9JUlFNQVNLX0xPKHgpCSgxIDw8ICh4IC0gc2FjaGlwLT5pcnFfYmFzZSkpCiAjZGVmaW5lIFNBMTExMV9JUlFNQVNLX0hJKHgpCSgxIDw8ICh4IC0gc2FjaGlwLT5pcnFfYmFzZSAtIDMyKSkKIAorc3RhdGljIHUzMiBzYTExMTFfaXJxbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IHNhMTExMSAqc2FjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisKKwlyZXR1cm4gQklUKChkLT5pcnEgLSBzYWNoaXAtPmlycV9iYXNlKSAmIDMxKTsKK30KKworc3RhdGljIGludCBzYTExMTFfaXJxYmFuayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IHNhMTExMSAqc2FjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisKKwlyZXR1cm4gKChkLT5pcnEgLSBzYWNoaXAtPmlycV9iYXNlKSAvIDMyKSAqIDQ7Cit9CisKIHN0YXRpYyB2b2lkIHNhMTExMV9hY2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKIH0KIAotc3RhdGljIHZvaWQgc2ExMTExX21hc2tfbG93aXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3N0YXRpYyB2b2lkIHNhMTExMV9tYXNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7CiAJc3RydWN0IHNhMTExMSAqc2FjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7Ci0Jdm9pZCBfX2lvbWVtICptYXBiYXNlID0gc2FjaGlwLT5iYXNlICsgU0ExMTExX0lOVEM7Ci0JdW5zaWduZWQgbG9uZyBpZTA7CisJdm9pZCBfX2lvbWVtICptYXBiYXNlID0gc2FjaGlwLT5iYXNlICsgU0ExMTExX0lOVEMgKyBzYTExMTFfaXJxYmFuayhkKTsKKwl1MzIgaWU7CiAKLQlpZTAgPSBzYTExMTFfcmVhZGwobWFwYmFzZSArIFNBMTExMV9JTlRFTjApOwotCWllMCAmPSB+U0ExMTExX0lSUU1BU0tfTE8oZC0+aXJxKTsKLQl3cml0ZWwoaWUwLCBtYXBiYXNlICsgU0ExMTExX0lOVEVOMCk7CisJaWUgPSBzYTExMTFfcmVhZGwobWFwYmFzZSArIFNBMTExMV9JTlRFTjApOworCWllICY9IH5zYTExMTFfaXJxbWFzayhkKTsKKwlzYTExMTFfd3JpdGVsKGllLCBtYXBiYXNlICsgU0ExMTExX0lOVEVOMCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNhMTExMV91bm1hc2tfbG93aXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3N0YXRpYyB2b2lkIHNhMTExMV91bm1hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKIAlzdHJ1Y3Qgc2ExMTExICpzYWNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBzYWNoaXAtPmJhc2UgKyBTQTExMTFfSU5UQzsKLQl1bnNpZ25lZCBsb25nIGllMDsKKwl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBzYWNoaXAtPmJhc2UgKyBTQTExMTFfSU5UQyArIHNhMTExMV9pcnFiYW5rKGQpOworCXUzMiBpZTsKIAotCWllMCA9IHNhMTExMV9yZWFkbChtYXBiYXNlICsgU0ExMTExX0lOVEVOMCk7Ci0JaWUwIHw9IFNBMTExMV9JUlFNQVNLX0xPKGQtPmlycSk7Ci0Jc2ExMTExX3dyaXRlbChpZTAsIG1hcGJhc2UgKyBTQTExMTFfSU5URU4wKTsKKwlpZSA9IHNhMTExMV9yZWFkbChtYXBiYXNlICsgU0ExMTExX0lOVEVOMCk7CisJaWUgfD0gc2ExMTExX2lycW1hc2soZCk7CisJc2ExMTExX3dyaXRlbChpZSwgbWFwYmFzZSArIFNBMTExMV9JTlRFTjApOwogfQogCiAvKgpAQCAtMjY0LDE4ICsyODAsMTcgQEAKICAqIGJlIHRyaWdnZXJlZC4gIEluIGZhY3QsIGl0cyB2ZXJ5IGRpZmZpY3VsdCwgaWYgbm90IGltcG9zc2libGUgdG8gZ2V0CiAgKiBJTlRTRVQgdG8gcmUtdHJpZ2dlciB0aGUgaW50ZXJydXB0LgogICovCi1zdGF0aWMgaW50IHNhMTExMV9yZXRyaWdnZXJfbG93aXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3N0YXRpYyBpbnQgc2ExMTExX3JldHJpZ2dlcl9pcnEoc3RydWN0IGlycV9kYXRhICpkKQogewogCXN0cnVjdCBzYTExMTEgKnNhY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwotCXZvaWQgX19pb21lbSAqbWFwYmFzZSA9IHNhY2hpcC0+YmFzZSArIFNBMTExMV9JTlRDOwotCXVuc2lnbmVkIGludCBtYXNrID0gU0ExMTExX0lSUU1BU0tfTE8oZC0+aXJxKTsKLQl1bnNpZ25lZCBsb25nIGlwMDsKKwl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBzYWNoaXAtPmJhc2UgKyBTQTExMTFfSU5UQyArIHNhMTExMV9pcnFiYW5rKGQpOworCXUzMiBpcCwgbWFzayA9IHNhMTExMV9pcnFtYXNrKGQpOwogCWludCBpOwogCi0JaXAwID0gc2ExMTExX3JlYWRsKG1hcGJhc2UgKyBTQTExMTFfSU5UUE9MMCk7CisJaXAgPSBzYTExMTFfcmVhZGwobWFwYmFzZSArIFNBMTExMV9JTlRQT0wwKTsKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCXNhMTExMV93cml0ZWwoaXAwIF4gbWFzaywgbWFwYmFzZSArIFNBMTExMV9JTlRQT0wwKTsKLQkJc2ExMTExX3dyaXRlbChpcDAsIG1hcGJhc2UgKyBTQTExMTFfSU5UUE9MMCk7CisJCXNhMTExMV93cml0ZWwoaXAgXiBtYXNrLCBtYXBiYXNlICsgU0ExMTExX0lOVFBPTDApOworCQlzYTExMTFfd3JpdGVsKGlwLCBtYXBiYXNlICsgU0ExMTExX0lOVFBPTDApOwogCQlpZiAoc2ExMTExX3JlYWRsKG1hcGJhc2UgKyBTQTExMTFfSU5UU1RBVENMUjApICYgbWFzaykKIAkJCWJyZWFrOwogCX0KQEAgLTI4NiwxMiArMzAxLDExIEBACiAJcmV0dXJuIGkgPT0gOCA/IC0xIDogMDsKIH0KIAotc3RhdGljIGludCBzYTExMTFfdHlwZV9sb3dpcnEoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCitzdGF0aWMgaW50IHNhMTExMV90eXBlX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCBmbGFncykKIHsKIAlzdHJ1Y3Qgc2ExMTExICpzYWNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBzYWNoaXAtPmJhc2UgKyBTQTExMTFfSU5UQzsKLQl1bnNpZ25lZCBpbnQgbWFzayA9IFNBMTExMV9JUlFNQVNLX0xPKGQtPmlycSk7Ci0JdW5zaWduZWQgbG9uZyBpcDA7CisJdm9pZCBfX2lvbWVtICptYXBiYXNlID0gc2FjaGlwLT5iYXNlICsgU0ExMTExX0lOVEMgKyBzYTExMTFfaXJxYmFuayhkKTsKKwl1MzIgaXAsIG1hc2sgPSBzYTExMTFfaXJxbWFzayhkKTsKIAogCWlmIChmbGFncyA9PSBJUlFfVFlQRV9QUk9CRSkKIAkJcmV0dXJuIDA7CkBAIC0yOTksMTQ0ICszMTMsNDEgQEAKIAlpZiAoKCEoZmxhZ3MgJiBJUlFfVFlQRV9FREdFX1JJU0lORykgXiAhKGZsYWdzICYgSVJRX1RZUEVfRURHRV9GQUxMSU5HKSkgPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpcDAgPSBzYTExMTFfcmVhZGwobWFwYmFzZSArIFNBMTExMV9JTlRQT0wwKTsKKwlpcCA9IHNhMTExMV9yZWFkbChtYXBiYXNlICsgU0ExMTExX0lOVFBPTDApOwogCWlmIChmbGFncyAmIElSUV9UWVBFX0VER0VfUklTSU5HKQotCQlpcDAgJj0gfm1hc2s7CisJCWlwICY9IH5tYXNrOwogCWVsc2UKLQkJaXAwIHw9IG1hc2s7Ci0Jc2ExMTExX3dyaXRlbChpcDAsIG1hcGJhc2UgKyBTQTExMTFfSU5UUE9MMCk7Ci0Jc2ExMTExX3dyaXRlbChpcDAsIG1hcGJhc2UgKyBTQTExMTFfV0FLRVBPTDApOworCQlpcCB8PSBtYXNrOworCXNhMTExMV93cml0ZWwoaXAsIG1hcGJhc2UgKyBTQTExMTFfSU5UUE9MMCk7CisJc2ExMTExX3dyaXRlbChpcCwgbWFwYmFzZSArIFNBMTExMV9XQUtFUE9MMCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzYTExMTFfd2FrZV9sb3dpcnEoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgb24pCitzdGF0aWMgaW50IHNhMTExMV93YWtlX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCBvbikKIHsKIAlzdHJ1Y3Qgc2ExMTExICpzYWNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBzYWNoaXAtPmJhc2UgKyBTQTExMTFfSU5UQzsKLQl1bnNpZ25lZCBpbnQgbWFzayA9IFNBMTExMV9JUlFNQVNLX0xPKGQtPmlycSk7Ci0JdW5zaWduZWQgbG9uZyB3ZTA7CisJdm9pZCBfX2lvbWVtICptYXBiYXNlID0gc2FjaGlwLT5iYXNlICsgU0ExMTExX0lOVEMgKyBzYTExMTFfaXJxYmFuayhkKTsKKwl1MzIgd2UsIG1hc2sgPSBzYTExMTFfaXJxbWFzayhkKTsKIAotCXdlMCA9IHNhMTExMV9yZWFkbChtYXBiYXNlICsgU0ExMTExX1dBS0VFTjApOworCXdlID0gc2ExMTExX3JlYWRsKG1hcGJhc2UgKyBTQTExMTFfV0FLRUVOMCk7CiAJaWYgKG9uKQotCQl3ZTAgfD0gbWFzazsKKwkJd2UgfD0gbWFzazsKIAllbHNlCi0JCXdlMCAmPSB+bWFzazsKLQlzYTExMTFfd3JpdGVsKHdlMCwgbWFwYmFzZSArIFNBMTExMV9XQUtFRU4wKTsKKwkJd2UgJj0gfm1hc2s7CisJc2ExMTExX3dyaXRlbCh3ZSwgbWFwYmFzZSArIFNBMTExMV9XQUtFRU4wKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIHNhMTExMV9sb3dfY2hpcCA9IHsKLQkubmFtZQkJPSAiU0ExMTExLWwiLAorc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBzYTExMTFfaXJxX2NoaXAgPSB7CisJLm5hbWUJCT0gIlNBMTExMSIsCiAJLmlycV9hY2sJPSBzYTExMTFfYWNrX2lycSwKLQkuaXJxX21hc2sJPSBzYTExMTFfbWFza19sb3dpcnEsCi0JLmlycV91bm1hc2sJPSBzYTExMTFfdW5tYXNrX2xvd2lycSwKLQkuaXJxX3JldHJpZ2dlcgk9IHNhMTExMV9yZXRyaWdnZXJfbG93aXJxLAotCS5pcnFfc2V0X3R5cGUJPSBzYTExMTFfdHlwZV9sb3dpcnEsCi0JLmlycV9zZXRfd2FrZQk9IHNhMTExMV93YWtlX2xvd2lycSwKLX07Ci0KLXN0YXRpYyB2b2lkIHNhMTExMV9tYXNrX2hpZ2hpcnEoc3RydWN0IGlycV9kYXRhICpkKQotewotCXN0cnVjdCBzYTExMTEgKnNhY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwotCXZvaWQgX19pb21lbSAqbWFwYmFzZSA9IHNhY2hpcC0+YmFzZSArIFNBMTExMV9JTlRDOwotCXVuc2lnbmVkIGxvbmcgaWUxOwotCi0JaWUxID0gc2ExMTExX3JlYWRsKG1hcGJhc2UgKyBTQTExMTFfSU5URU4xKTsKLQlpZTEgJj0gflNBMTExMV9JUlFNQVNLX0hJKGQtPmlycSk7Ci0Jc2ExMTExX3dyaXRlbChpZTEsIG1hcGJhc2UgKyBTQTExMTFfSU5URU4xKTsKLX0KLQotc3RhdGljIHZvaWQgc2ExMTExX3VubWFza19oaWdoaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQlzdHJ1Y3Qgc2ExMTExICpzYWNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBzYWNoaXAtPmJhc2UgKyBTQTExMTFfSU5UQzsKLQl1bnNpZ25lZCBsb25nIGllMTsKLQotCWllMSA9IHNhMTExMV9yZWFkbChtYXBiYXNlICsgU0ExMTExX0lOVEVOMSk7Ci0JaWUxIHw9IFNBMTExMV9JUlFNQVNLX0hJKGQtPmlycSk7Ci0Jc2ExMTExX3dyaXRlbChpZTEsIG1hcGJhc2UgKyBTQTExMTFfSU5URU4xKTsKLX0KLQotLyoKLSAqIEF0dGVtcHQgdG8gcmUtdHJpZ2dlciB0aGUgaW50ZXJydXB0LiAgVGhlIFNBMTExMSBjb250YWlucyBhIHJlZ2lzdGVyCi0gKiAoSU5UU0VUKSB3aGljaCBjbGFpbXMgdG8gZG8gdGhpcy4gIEhvd2V2ZXIsIGluIHByYWN0aWNlIG5vIGFtb3VudCBvZgotICogbWFuaXB1bGF0aW9uIG9mIElOVEVOIGFuZCBJTlRTRVQgZ3VhcmFudGVlcyB0aGF0IHRoZSBpbnRlcnJ1cHQgd2lsbAotICogYmUgdHJpZ2dlcmVkLiAgSW4gZmFjdCwgaXRzIHZlcnkgZGlmZmljdWx0LCBpZiBub3QgaW1wb3NzaWJsZSB0byBnZXQKLSAqIElOVFNFVCB0byByZS10cmlnZ2VyIHRoZSBpbnRlcnJ1cHQuCi0gKi8KLXN0YXRpYyBpbnQgc2ExMTExX3JldHJpZ2dlcl9oaWdoaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQlzdHJ1Y3Qgc2ExMTExICpzYWNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBzYWNoaXAtPmJhc2UgKyBTQTExMTFfSU5UQzsKLQl1bnNpZ25lZCBpbnQgbWFzayA9IFNBMTExMV9JUlFNQVNLX0hJKGQtPmlycSk7Ci0JdW5zaWduZWQgbG9uZyBpcDE7Ci0JaW50IGk7Ci0KLQlpcDEgPSBzYTExMTFfcmVhZGwobWFwYmFzZSArIFNBMTExMV9JTlRQT0wxKTsKLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCXNhMTExMV93cml0ZWwoaXAxIF4gbWFzaywgbWFwYmFzZSArIFNBMTExMV9JTlRQT0wxKTsKLQkJc2ExMTExX3dyaXRlbChpcDEsIG1hcGJhc2UgKyBTQTExMTFfSU5UUE9MMSk7Ci0JCWlmIChzYTExMTFfcmVhZGwobWFwYmFzZSArIFNBMTExMV9JTlRTVEFUQ0xSMSkgJiBtYXNrKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGkgPT0gOCkKLQkJcHJfZXJyKCJEYW5nZXIgV2lsbCBSb2JpbnNvbjogZmFpbGVkIHRvIHJlLXRyaWdnZXIgSVJRJWRcbiIsCi0JCSAgICAgICBkLT5pcnEpOwotCXJldHVybiBpID09IDggPyAtMSA6IDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2ExMTExX3R5cGVfaGlnaGlycShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCBmbGFncykKLXsKLQlzdHJ1Y3Qgc2ExMTExICpzYWNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQl2b2lkIF9faW9tZW0gKm1hcGJhc2UgPSBzYWNoaXAtPmJhc2UgKyBTQTExMTFfSU5UQzsKLQl1bnNpZ25lZCBpbnQgbWFzayA9IFNBMTExMV9JUlFNQVNLX0hJKGQtPmlycSk7Ci0JdW5zaWduZWQgbG9uZyBpcDE7Ci0KLQlpZiAoZmxhZ3MgPT0gSVJRX1RZUEVfUFJPQkUpCi0JCXJldHVybiAwOwotCi0JaWYgKCghKGZsYWdzICYgSVJRX1RZUEVfRURHRV9SSVNJTkcpIF4gIShmbGFncyAmIElSUV9UWVBFX0VER0VfRkFMTElORykpID09IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaXAxID0gc2ExMTExX3JlYWRsKG1hcGJhc2UgKyBTQTExMTFfSU5UUE9MMSk7Ci0JaWYgKGZsYWdzICYgSVJRX1RZUEVfRURHRV9SSVNJTkcpCi0JCWlwMSAmPSB+bWFzazsKLQllbHNlCi0JCWlwMSB8PSBtYXNrOwotCXNhMTExMV93cml0ZWwoaXAxLCBtYXBiYXNlICsgU0ExMTExX0lOVFBPTDEpOwotCXNhMTExMV93cml0ZWwoaXAxLCBtYXBiYXNlICsgU0ExMTExX1dBS0VQT0wxKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNhMTExMV93YWtlX2hpZ2hpcnEoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgb24pCi17Ci0Jc3RydWN0IHNhMTExMSAqc2FjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7Ci0Jdm9pZCBfX2lvbWVtICptYXBiYXNlID0gc2FjaGlwLT5iYXNlICsgU0ExMTExX0lOVEM7Ci0JdW5zaWduZWQgaW50IG1hc2sgPSBTQTExMTFfSVJRTUFTS19ISShkLT5pcnEpOwotCXVuc2lnbmVkIGxvbmcgd2UxOwotCi0Jd2UxID0gc2ExMTExX3JlYWRsKG1hcGJhc2UgKyBTQTExMTFfV0FLRUVOMSk7Ci0JaWYgKG9uKQotCQl3ZTEgfD0gbWFzazsKLQllbHNlCi0JCXdlMSAmPSB+bWFzazsKLQlzYTExMTFfd3JpdGVsKHdlMSwgbWFwYmFzZSArIFNBMTExMV9XQUtFRU4xKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIHNhMTExMV9oaWdoX2NoaXAgPSB7Ci0JLm5hbWUJCT0gIlNBMTExMS1oIiwKLQkuaXJxX2Fjawk9IHNhMTExMV9hY2tfaXJxLAotCS5pcnFfbWFzawk9IHNhMTExMV9tYXNrX2hpZ2hpcnEsCi0JLmlycV91bm1hc2sJPSBzYTExMTFfdW5tYXNrX2hpZ2hpcnEsCi0JLmlycV9yZXRyaWdnZXIJPSBzYTExMTFfcmV0cmlnZ2VyX2hpZ2hpcnEsCi0JLmlycV9zZXRfdHlwZQk9IHNhMTExMV90eXBlX2hpZ2hpcnEsCi0JLmlycV9zZXRfd2FrZQk9IHNhMTExMV93YWtlX2hpZ2hpcnEsCisJLmlycV9tYXNrCT0gc2ExMTExX21hc2tfaXJxLAorCS5pcnFfdW5tYXNrCT0gc2ExMTExX3VubWFza19pcnEsCisJLmlycV9yZXRyaWdnZXIJPSBzYTExMTFfcmV0cmlnZ2VyX2lycSwKKwkuaXJxX3NldF90eXBlCT0gc2ExMTExX3R5cGVfaXJxLAorCS5pcnFfc2V0X3dha2UJPSBzYTExMTFfd2FrZV9pcnEsCiB9OwogCiBzdGF0aWMgaW50IHNhMTExMV9zZXR1cF9pcnEoc3RydWN0IHNhMTExMSAqc2FjaGlwLCB1bnNpZ25lZCBpcnFfYmFzZSkKQEAgLTQ3Miw4ICszODMsOCBAQAogCSAqIHNwZWNpZmllcyB0aGF0IFMwUmVhZHlJbnQgYW5kIFMxUmVhZHlJbnQgc2hvdWxkIGJlICcxJy4KIAkgKi8KIAlzYTExMTFfd3JpdGVsKDAsIGlycWJhc2UgKyBTQTExMTFfSU5UUE9MMCk7Ci0Jc2ExMTExX3dyaXRlbChTQTExMTFfSVJRTUFTS19ISShJUlFfUzBfUkVBRFlfTklOVCkgfAotCQkgICAgICBTQTExMTFfSVJRTUFTS19ISShJUlFfUzFfUkVBRFlfTklOVCksCisJc2ExMTExX3dyaXRlbChCSVQoSVJRX1MwX1JFQURZX05JTlQgJiAzMSkgfAorCQkgICAgICBCSVQoSVJRX1MxX1JFQURZX05JTlQgJiAzMSksCiAJCSAgICAgIGlycWJhc2UgKyBTQTExMTFfSU5UUE9MMSk7CiAKIAkvKiBjbGVhciBhbGwgSVJRcyAqLwpAQCAtNDgyLDE2ICszOTMsMTQgQEAKIAogCWZvciAoaSA9IElSUV9HUEFJTjA7IGkgPD0gU1NQUk9SOyBpKyspIHsKIAkJaXJxID0gc2FjaGlwLT5pcnFfYmFzZSArIGk7Ci0JCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpcnEsICZzYTExMTFfbG93X2NoaXAsCi0JCQkJCSBoYW5kbGVfZWRnZV9pcnEpOworCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmc2ExMTExX2lycV9jaGlwLCBoYW5kbGVfZWRnZV9pcnEpOwogCQlpcnFfc2V0X2NoaXBfZGF0YShpcnEsIHNhY2hpcCk7CiAJCWlycV9jbGVhcl9zdGF0dXNfZmxhZ3MoaXJxLCBJUlFfTk9SRVFVRVNUIHwgSVJRX05PUFJPQkUpOwogCX0KIAogCWZvciAoaSA9IEFVRFhNVERNQURPTkVBOyBpIDw9IElSUV9TMV9CVkQxX1NUU0NIRzsgaSsrKSB7CiAJCWlycSA9IHNhY2hpcC0+aXJxX2Jhc2UgKyBpOwotCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmc2ExMTExX2hpZ2hfY2hpcCwKLQkJCQkJIGhhbmRsZV9lZGdlX2lycSk7CisJCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpcnEsICZzYTExMTFfaXJxX2NoaXAsIGhhbmRsZV9lZGdlX2lycSk7CiAJCWlycV9zZXRfY2hpcF9kYXRhKGlycSwgc2FjaGlwKTsKIAkJaXJxX2NsZWFyX3N0YXR1c19mbGFncyhpcnEsIElSUV9OT1JFUVVFU1QgfCBJUlFfTk9QUk9CRSk7CiAJfQpAQCAtNTA5LDYgKzQxOCwxODEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgc2ExMTExX3JlbW92ZV9pcnEoc3RydWN0IHNhMTExMSAqc2FjaGlwKQoreworCXZvaWQgX19pb21lbSAqaXJxYmFzZSA9IHNhY2hpcC0+YmFzZSArIFNBMTExMV9JTlRDOworCisJLyogZGlzYWJsZSBhbGwgSVJRcyAqLworCXNhMTExMV93cml0ZWwoMCwgaXJxYmFzZSArIFNBMTExMV9JTlRFTjApOworCXNhMTExMV93cml0ZWwoMCwgaXJxYmFzZSArIFNBMTExMV9JTlRFTjEpOworCXNhMTExMV93cml0ZWwoMCwgaXJxYmFzZSArIFNBMTExMV9XQUtFRU4wKTsKKwlzYTExMTFfd3JpdGVsKDAsIGlycWJhc2UgKyBTQTExMTFfV0FLRUVOMSk7CisKKwlpZiAoc2FjaGlwLT5pcnEgIT0gTk9fSVJRKSB7CisJCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyX2FuZF9kYXRhKHNhY2hpcC0+aXJxLCBOVUxMLCBOVUxMKTsKKwkJaXJxX2ZyZWVfZGVzY3Moc2FjaGlwLT5pcnFfYmFzZSwgU0ExMTExX0lSUV9OUik7CisKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHNhY2hpcC0+cGh5cyArIFNBMTExMV9JTlRDLCA1MTIpOworCX0KK30KKworZW51bSB7CisJU0ExMTExX0dQSU9fUFhERFIgPSAoU0ExMTExX0dQSU9fUEFERFIgLSBTQTExMTFfR1BJT19QQUREUiksCisJU0ExMTExX0dQSU9fUFhEUlIgPSAoU0ExMTExX0dQSU9fUEFEUlIgLSBTQTExMTFfR1BJT19QQUREUiksCisJU0ExMTExX0dQSU9fUFhEV1IgPSAoU0ExMTExX0dQSU9fUEFEV1IgLSBTQTExMTFfR1BJT19QQUREUiksCisJU0ExMTExX0dQSU9fUFhTRFIgPSAoU0ExMTExX0dQSU9fUEFTRFIgLSBTQTExMTFfR1BJT19QQUREUiksCisJU0ExMTExX0dQSU9fUFhTU1IgPSAoU0ExMTExX0dQSU9fUEFTU1IgLSBTQTExMTFfR1BJT19QQUREUiksCit9OworCitzdGF0aWMgc3RydWN0IHNhMTExMSAqZ2NfdG9fc2ExMTExKHN0cnVjdCBncGlvX2NoaXAgKmdjKQoreworCXJldHVybiBjb250YWluZXJfb2YoZ2MsIHN0cnVjdCBzYTExMTEsIGdjKTsKK30KKworc3RhdGljIHZvaWQgX19pb21lbSAqc2ExMTExX2dwaW9fbWFwX3JlZyhzdHJ1Y3Qgc2ExMTExICpzYWNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwl2b2lkIF9faW9tZW0gKnJlZyA9IHNhY2hpcC0+YmFzZSArIFNBMTExMV9HUElPOworCisJaWYgKG9mZnNldCA8IDQpCisJCXJldHVybiByZWcgKyBTQTExMTFfR1BJT19QQUREUjsKKwlpZiAob2Zmc2V0IDwgMTApCisJCXJldHVybiByZWcgKyBTQTExMTFfR1BJT19QQkREUjsKKwlpZiAob2Zmc2V0IDwgMTgpCisJCXJldHVybiByZWcgKyBTQTExMTFfR1BJT19QQ0REUjsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHUzMiBzYTExMTFfZ3Bpb19tYXBfYml0KHVuc2lnbmVkIG9mZnNldCkKK3sKKwlpZiAob2Zmc2V0IDwgNCkKKwkJcmV0dXJuIEJJVChvZmZzZXQpOworCWlmIChvZmZzZXQgPCAxMCkKKwkJcmV0dXJuIEJJVChvZmZzZXQgLSA0KTsKKwlpZiAob2Zmc2V0IDwgMTgpCisJCXJldHVybiBCSVQob2Zmc2V0IC0gMTApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzYTExMTFfZ3Bpb19tb2RpZnkodm9pZCBfX2lvbWVtICpyZWcsIHUzMiBtYXNrLCB1MzIgc2V0KQoreworCXUzMiB2YWw7CisKKwl2YWwgPSByZWFkbF9yZWxheGVkKHJlZyk7CisJdmFsICY9IH5tYXNrOworCXZhbCB8PSBtYXNrICYgc2V0OworCXdyaXRlbF9yZWxheGVkKHZhbCwgcmVnKTsKK30KKworc3RhdGljIGludCBzYTExMTFfZ3Bpb19nZXRfZGlyZWN0aW9uKHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IHNhMTExMSAqc2FjaGlwID0gZ2NfdG9fc2ExMTExKGdjKTsKKwl2b2lkIF9faW9tZW0gKnJlZyA9IHNhMTExMV9ncGlvX21hcF9yZWcoc2FjaGlwLCBvZmZzZXQpOworCXUzMiBtYXNrID0gc2ExMTExX2dwaW9fbWFwX2JpdChvZmZzZXQpOworCisJcmV0dXJuICEhKHJlYWRsX3JlbGF4ZWQocmVnICsgU0ExMTExX0dQSU9fUFhERFIpICYgbWFzayk7Cit9CisKK3N0YXRpYyBpbnQgc2ExMTExX2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IHNhMTExMSAqc2FjaGlwID0gZ2NfdG9fc2ExMTExKGdjKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvaWQgX19pb21lbSAqcmVnID0gc2ExMTExX2dwaW9fbWFwX3JlZyhzYWNoaXAsIG9mZnNldCk7CisJdTMyIG1hc2sgPSBzYTExMTFfZ3Bpb19tYXBfYml0KG9mZnNldCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2FjaGlwLT5sb2NrLCBmbGFncyk7CisJc2ExMTExX2dwaW9fbW9kaWZ5KHJlZyArIFNBMTExMV9HUElPX1BYRERSLCBtYXNrLCBtYXNrKTsKKwlzYTExMTFfZ3Bpb19tb2RpZnkocmVnICsgU0ExMTExX0dQSU9fUFhTRFIsIG1hc2ssIG1hc2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNhY2hpcC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2ExMTExX2dwaW9fZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgb2Zmc2V0LAorCWludCB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc2ExMTExICpzYWNoaXAgPSBnY190b19zYTExMTEoZ2MpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdm9pZCBfX2lvbWVtICpyZWcgPSBzYTExMTFfZ3Bpb19tYXBfcmVnKHNhY2hpcCwgb2Zmc2V0KTsKKwl1MzIgbWFzayA9IHNhMTExMV9ncGlvX21hcF9iaXQob2Zmc2V0KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzYWNoaXAtPmxvY2ssIGZsYWdzKTsKKwlzYTExMTFfZ3Bpb19tb2RpZnkocmVnICsgU0ExMTExX0dQSU9fUFhEV1IsIG1hc2ssIHZhbHVlID8gbWFzayA6IDApOworCXNhMTExMV9ncGlvX21vZGlmeShyZWcgKyBTQTExMTFfR1BJT19QWFNTUiwgbWFzaywgdmFsdWUgPyBtYXNrIDogMCk7CisJc2ExMTExX2dwaW9fbW9kaWZ5KHJlZyArIFNBMTExMV9HUElPX1BYRERSLCBtYXNrLCAwKTsKKwlzYTExMTFfZ3Bpb19tb2RpZnkocmVnICsgU0ExMTExX0dQSU9fUFhTRFIsIG1hc2ssIDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNhY2hpcC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2ExMTExX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IHNhMTExMSAqc2FjaGlwID0gZ2NfdG9fc2ExMTExKGdjKTsKKwl2b2lkIF9faW9tZW0gKnJlZyA9IHNhMTExMV9ncGlvX21hcF9yZWcoc2FjaGlwLCBvZmZzZXQpOworCXUzMiBtYXNrID0gc2ExMTExX2dwaW9fbWFwX2JpdChvZmZzZXQpOworCisJcmV0dXJuICEhKHJlYWRsX3JlbGF4ZWQocmVnICsgU0ExMTExX0dQSU9fUFhEUlIpICYgbWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIHNhMTExMV9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJc3RydWN0IHNhMTExMSAqc2FjaGlwID0gZ2NfdG9fc2ExMTExKGdjKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvaWQgX19pb21lbSAqcmVnID0gc2ExMTExX2dwaW9fbWFwX3JlZyhzYWNoaXAsIG9mZnNldCk7CisJdTMyIG1hc2sgPSBzYTExMTFfZ3Bpb19tYXBfYml0KG9mZnNldCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2FjaGlwLT5sb2NrLCBmbGFncyk7CisJc2ExMTExX2dwaW9fbW9kaWZ5KHJlZyArIFNBMTExMV9HUElPX1BYRFdSLCBtYXNrLCB2YWx1ZSA/IG1hc2sgOiAwKTsKKwlzYTExMTFfZ3Bpb19tb2RpZnkocmVnICsgU0ExMTExX0dQSU9fUFhTU1IsIG1hc2ssIHZhbHVlID8gbWFzayA6IDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNhY2hpcC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzYTExMTFfZ3Bpb19zZXRfbXVsdGlwbGUoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGxvbmcgKm1hc2ssCisJdW5zaWduZWQgbG9uZyAqYml0cykKK3sKKwlzdHJ1Y3Qgc2ExMTExICpzYWNoaXAgPSBnY190b19zYTExMTEoZ2MpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdm9pZCBfX2lvbWVtICpyZWcgPSBzYWNoaXAtPmJhc2UgKyBTQTExMTFfR1BJTzsKKwl1MzIgbXNrLCB2YWw7CisKKwltc2sgPSAqbWFzazsKKwl2YWwgPSAqYml0czsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzYWNoaXAtPmxvY2ssIGZsYWdzKTsKKwlzYTExMTFfZ3Bpb19tb2RpZnkocmVnICsgU0ExMTExX0dQSU9fUEFEV1IsIG1zayAmIDE1LCB2YWwpOworCXNhMTExMV9ncGlvX21vZGlmeShyZWcgKyBTQTExMTFfR1BJT19QQVNTUiwgbXNrICYgMTUsIHZhbCk7CisJc2ExMTExX2dwaW9fbW9kaWZ5KHJlZyArIFNBMTExMV9HUElPX1BCRFdSLCAobXNrID4+IDQpICYgMjU1LCB2YWwgPj4gNCk7CisJc2ExMTExX2dwaW9fbW9kaWZ5KHJlZyArIFNBMTExMV9HUElPX1BCU1NSLCAobXNrID4+IDQpICYgMjU1LCB2YWwgPj4gNCk7CisJc2ExMTExX2dwaW9fbW9kaWZ5KHJlZyArIFNBMTExMV9HUElPX1BDRFdSLCAobXNrID4+IDEyKSAmIDI1NSwgdmFsID4+IDEyKTsKKwlzYTExMTFfZ3Bpb19tb2RpZnkocmVnICsgU0ExMTExX0dQSU9fUENTU1IsIChtc2sgPj4gMTIpICYgMjU1LCB2YWwgPj4gMTIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNhY2hpcC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHNhMTExMV9ncGlvX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBzYTExMTEgKnNhY2hpcCA9IGdjX3RvX3NhMTExMShnYyk7CisKKwlyZXR1cm4gc2FjaGlwLT5pcnFfYmFzZSArIG9mZnNldDsKK30KKworc3RhdGljIGludCBzYTExMTFfc2V0dXBfZ3Bpb3Moc3RydWN0IHNhMTExMSAqc2FjaGlwKQoreworCXNhY2hpcC0+Z2MubGFiZWwgPSAic2ExMTExIjsKKwlzYWNoaXAtPmdjLnBhcmVudCA9IHNhY2hpcC0+ZGV2OworCXNhY2hpcC0+Z2Mub3duZXIgPSBUSElTX01PRFVMRTsKKwlzYWNoaXAtPmdjLmdldF9kaXJlY3Rpb24gPSBzYTExMTFfZ3Bpb19nZXRfZGlyZWN0aW9uOworCXNhY2hpcC0+Z2MuZGlyZWN0aW9uX2lucHV0ID0gc2ExMTExX2dwaW9fZGlyZWN0aW9uX2lucHV0OworCXNhY2hpcC0+Z2MuZGlyZWN0aW9uX291dHB1dCA9IHNhMTExMV9ncGlvX2RpcmVjdGlvbl9vdXRwdXQ7CisJc2FjaGlwLT5nYy5nZXQgPSBzYTExMTFfZ3Bpb19nZXQ7CisJc2FjaGlwLT5nYy5zZXQgPSBzYTExMTFfZ3Bpb19zZXQ7CisJc2FjaGlwLT5nYy5zZXRfbXVsdGlwbGUgPSBzYTExMTFfZ3Bpb19zZXRfbXVsdGlwbGU7CisJc2FjaGlwLT5nYy50b19pcnEgPSBzYTExMTFfZ3Bpb190b19pcnE7CisJc2FjaGlwLT5nYy5iYXNlID0gLTE7CisJc2FjaGlwLT5nYy5uZ3BpbyA9IDE4OworCisJcmV0dXJuIGRldm1fZ3Bpb2NoaXBfYWRkX2RhdGEoc2FjaGlwLT5kZXYsICZzYWNoaXAtPmdjLCBzYWNoaXApOworfQorCiAvKgogICogQnJpbmcgdGhlIFNBMTExMSBvdXQgb2YgcmVzZXQuICBUaGlzIHJlcXVpcmVzIGEgc2V0IHByb2NlZHVyZToKICAqICAxLiBuUkVTRVQgYXNzZXJ0ZWQgKGJ5IGhhcmR3YXJlKQpAQCAtNjA3LDcgKzY5MSw3IEBACiAKIHN0YXRpYyB2b2lkIHNhMTExMV9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpfZGV2KQogewotCXN0cnVjdCBzYTExMTFfZGV2ICpkZXYgPSBTQTExMTFfREVWKF9kZXYpOworCXN0cnVjdCBzYTExMTFfZGV2ICpkZXYgPSB0b19zYTExMTFfZGV2aWNlKF9kZXYpOwogCiAJa2ZyZWUoZGV2KTsKIH0KQEAgLTY5NiwxOSArNzgwLDE3IEBACiAJaWYgKCFwZCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzYWNoaXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2ExMTExKSwgR0ZQX0tFUk5FTCk7CisJc2FjaGlwID0gZGV2bV9remFsbG9jKG1lLCBzaXplb2Yoc3RydWN0IHNhMTExMSksIEdGUF9LRVJORUwpOwogCWlmICghc2FjaGlwKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXNhY2hpcC0+Y2xrID0gY2xrX2dldChtZSwgIlNBMTExMV9DTEsiKTsKLQlpZiAoSVNfRVJSKHNhY2hpcC0+Y2xrKSkgewotCQlyZXQgPSBQVFJfRVJSKHNhY2hpcC0+Y2xrKTsKLQkJZ290byBlcnJfZnJlZTsKLQl9CisJc2FjaGlwLT5jbGsgPSBkZXZtX2Nsa19nZXQobWUsICJTQTExMTFfQ0xLIik7CisJaWYgKElTX0VSUihzYWNoaXAtPmNsaykpCisJCXJldHVybiBQVFJfRVJSKHNhY2hpcC0+Y2xrKTsKIAogCXJldCA9IGNsa19wcmVwYXJlKHNhY2hpcC0+Y2xrKTsKIAlpZiAocmV0KQotCQlnb3RvIGVycl9jbGtwdXQ7CisJCXJldHVybiByZXQ7CiAKIAlzcGluX2xvY2tfaW5pdCgmc2FjaGlwLT5sb2NrKTsKIApAQCAtNzU0LDkgKzgzNiwxNCBAQAogCWlmIChzYWNoaXAtPmlycSAhPSBOT19JUlEpIHsKIAkJcmV0ID0gc2ExMTExX3NldHVwX2lycShzYWNoaXAsIHBkLT5pcnFfYmFzZSk7CiAJCWlmIChyZXQpCi0JCQlnb3RvIGVycl91bm1hcDsKKwkJCWdvdG8gZXJyX2NsazsKIAl9CiAKKwkvKiBTZXR1cCB0aGUgR1BJT3MgLSBzaG91bGQgcmVhbGx5IGJlIGRvbmUgYWZ0ZXIgdGhlIElSUSBzZXR1cCAqLworCXJldCA9IHNhMTExMV9zZXR1cF9ncGlvcyhzYWNoaXApOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2lycTsKKwogI2lmZGVmIENPTkZJR19BUkNIX1NBMTEwMAogCXsKIAl1bnNpZ25lZCBpbnQgdmFsOwpAQCAtNzk5LDIwICs4ODYsMjIgQEAKIAogCXJldHVybiAwOwogCisgZXJyX2lycToKKwlzYTExMTFfcmVtb3ZlX2lycShzYWNoaXApOworIGVycl9jbGs6CisJY2xrX2Rpc2FibGUoc2FjaGlwLT5jbGspOwogIGVycl91bm1hcDoKIAlpb3VubWFwKHNhY2hpcC0+YmFzZSk7CiAgZXJyX2Nsa191bnByZXA6CiAJY2xrX3VucHJlcGFyZShzYWNoaXAtPmNsayk7Ci0gZXJyX2Nsa3B1dDoKLQljbGtfcHV0KHNhY2hpcC0+Y2xrKTsKLSBlcnJfZnJlZToKLQlrZnJlZShzYWNoaXApOwogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgc2ExMTExX3JlbW92ZV9vbmUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBzYTExMTFfZGV2ICpzYWRldiA9IFNBMTExMV9ERVYoZGV2KTsKKwlzdHJ1Y3Qgc2ExMTExX2RldiAqc2FkZXYgPSB0b19zYTExMTFfZGV2aWNlKGRldik7CisJaWYgKGRldi0+YnVzICE9ICZzYTExMTFfYnVzX3R5cGUpCisJCXJldHVybiAwOwogCWRldmljZV9kZWwoJnNhZGV2LT5kZXYpOwogCXJlbGVhc2VfcmVzb3VyY2UoJnNhZGV2LT5yZXMpOwogCXB1dF9kZXZpY2UoJnNhZGV2LT5kZXYpOwpAQCAtODIxLDI5ICs5MTAsMTQgQEAKIAogc3RhdGljIHZvaWQgX19zYTExMTFfcmVtb3ZlKHN0cnVjdCBzYTExMTEgKnNhY2hpcCkKIHsKLQl2b2lkIF9faW9tZW0gKmlycWJhc2UgPSBzYWNoaXAtPmJhc2UgKyBTQTExMTFfSU5UQzsKLQogCWRldmljZV9mb3JfZWFjaF9jaGlsZChzYWNoaXAtPmRldiwgTlVMTCwgc2ExMTExX3JlbW92ZV9vbmUpOwogCi0JLyogZGlzYWJsZSBhbGwgSVJRcyAqLwotCXNhMTExMV93cml0ZWwoMCwgaXJxYmFzZSArIFNBMTExMV9JTlRFTjApOwotCXNhMTExMV93cml0ZWwoMCwgaXJxYmFzZSArIFNBMTExMV9JTlRFTjEpOwotCXNhMTExMV93cml0ZWwoMCwgaXJxYmFzZSArIFNBMTExMV9XQUtFRU4wKTsKLQlzYTExMTFfd3JpdGVsKDAsIGlycWJhc2UgKyBTQTExMTFfV0FLRUVOMSk7CisJc2ExMTExX3JlbW92ZV9pcnEoc2FjaGlwKTsKIAogCWNsa19kaXNhYmxlKHNhY2hpcC0+Y2xrKTsKIAljbGtfdW5wcmVwYXJlKHNhY2hpcC0+Y2xrKTsKIAotCWlmIChzYWNoaXAtPmlycSAhPSBOT19JUlEpIHsKLQkJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXJfYW5kX2RhdGEoc2FjaGlwLT5pcnEsIE5VTEwsIE5VTEwpOwotCQlpcnFfZnJlZV9kZXNjcyhzYWNoaXAtPmlycV9iYXNlLCBTQTExMTFfSVJRX05SKTsKLQotCQlyZWxlYXNlX21lbV9yZWdpb24oc2FjaGlwLT5waHlzICsgU0ExMTExX0lOVEMsIDUxMik7Ci0JfQotCiAJaW91bm1hcChzYWNoaXAtPmJhc2UpOwotCWNsa19wdXQoc2FjaGlwLT5jbGspOwotCWtmcmVlKHNhY2hpcCk7CiB9CiAKIHN0cnVjdCBzYTExMTFfc2F2ZV9kYXRhIHsKQEAgLTg2OSw5ICs5NDMsOSBAQAogCiAjaWZkZWYgQ09ORklHX1BNCiAKLXN0YXRpYyBpbnQgc2ExMTExX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCitzdGF0aWMgaW50IHNhMTExMV9zdXNwZW5kX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgc2ExMTExICpzYWNoaXAgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzYTExMTEgKnNhY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBzYTExMTFfc2F2ZV9kYXRhICpzYXZlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IHZhbDsKQEAgLTkzNCw5ICsxMDA4LDkgQEAKICAqCXJlc3RvcmVkIGJ5IHRoZWlyIHJlc3BlY3RpdmUgZHJpdmVycywgYW5kIG11c3QgYmUgY2FsbGVkCiAgKgl2aWEgTERNIGFmdGVyIHRoaXMgZnVuY3Rpb24uCiAgKi8KLXN0YXRpYyBpbnQgc2ExMTExX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHNhMTExMV9yZXN1bWVfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBzYTExMTEgKnNhY2hpcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHNhMTExMSAqc2FjaGlwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IHNhMTExMV9zYXZlX2RhdGEgKnNhdmU7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgaWQ7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwpAQCAtOTUyLDcgKzEwMjYsNyBAQAogCWlkID0gc2ExMTExX3JlYWRsKHNhY2hpcC0+YmFzZSArIFNBMTExMV9TS0lEKTsKIAlpZiAoKGlkICYgU0tJRF9JRF9NQVNLKSAhPSBTS0lEX1NBMTExMV9JRCkgewogCQlfX3NhMTExMV9yZW1vdmUoc2FjaGlwKTsKLQkJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKKwkJZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CiAJCWtmcmVlKHNhdmUpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xMDAzLDggKzEwNzcsOCBAQAogfQogCiAjZWxzZQotI2RlZmluZSBzYTExMTFfc3VzcGVuZCBOVUxMCi0jZGVmaW5lIHNhMTExMV9yZXN1bWUgIE5VTEwKKyNkZWZpbmUgc2ExMTExX3N1c3BlbmRfbm9pcnEgTlVMTAorI2RlZmluZSBzYTExMTFfcmVzdW1lX25vaXJxICBOVUxMCiAjZW5kaWYKIAogc3RhdGljIGludCBzYTExMTFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTEwMTcsNyArMTA5MSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CiAJaWYgKGlycSA8IDApCi0JCXJldHVybiAtRU5YSU87CisJCXJldHVybiBpcnE7CiAKIAlyZXR1cm4gX19zYTExMTFfcHJvYmUoJnBkZXYtPmRldiwgbWVtLCBpcnEpOwogfQpAQCAtMTAzOCw2ICsxMTEyLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgZGV2X3BtX29wcyBzYTExMTFfcG1fb3BzID0geworCS5zdXNwZW5kX25vaXJxID0gc2ExMTExX3N1c3BlbmRfbm9pcnEsCisJLnJlc3VtZV9ub2lycSA9IHNhMTExMV9yZXN1bWVfbm9pcnEsCit9OworCiAvKgogICoJTm90IHN1cmUgaWYgdGhpcyBzaG91bGQgYmUgb24gdGhlIHN5c3RlbSBidXMgb3Igbm90IHlldC4KICAqCVdlIHJlYWxseSB3YW50IHNvbWUgd2F5IHRvIHJlZ2lzdGVyIGEgc3lzdGVtIGRldmljZSBhdApAQCAtMTA1MCwxMCArMTEyOSw5IEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzYTExMTFfZGV2aWNlX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gc2ExMTExX3Byb2JlLAogCS5yZW1vdmUJCT0gc2ExMTExX3JlbW92ZSwKLQkuc3VzcGVuZAk9IHNhMTExMV9zdXNwZW5kLAotCS5yZXN1bWUJCT0gc2ExMTExX3Jlc3VtZSwKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAic2ExMTExIiwKKwkJLnBtCT0gJnNhMTExMV9wbV9vcHMsCiAJfSwKIH07CiAKQEAgLTEyNzksNiArMTM1NywxNCBAQAogfQogRVhQT1JUX1NZTUJPTChzYTExMTFfZGlzYWJsZV9kZXZpY2UpOwogCitpbnQgc2ExMTExX2dldF9pcnEoc3RydWN0IHNhMTExMV9kZXYgKnNhZGV2LCB1bnNpZ25lZCBudW0pCit7CisJaWYgKG51bSA+PSBBUlJBWV9TSVpFKHNhZGV2LT5pcnEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gc2FkZXYtPmlycVtudW1dOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2ExMTExX2dldF9pcnEpOworCiAvKgogICoJU0ExMTExICJSZWdpc3RlciBBY2Nlc3MgQnVzLiIKICAqCkBAIC0xMjg3LDcgKzEzNzMsNyBAQAogICovCiBzdGF0aWMgaW50IHNhMTExMV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqX2RydikKIHsKLQlzdHJ1Y3Qgc2ExMTExX2RldiAqZGV2ID0gU0ExMTExX0RFVihfZGV2KTsKKwlzdHJ1Y3Qgc2ExMTExX2RldiAqZGV2ID0gdG9fc2ExMTExX2RldmljZShfZGV2KTsKIAlzdHJ1Y3Qgc2ExMTExX2RyaXZlciAqZHJ2ID0gU0ExMTExX0RSVihfZHJ2KTsKIAogCXJldHVybiAhIShkZXYtPmRldmlkICYgZHJ2LT5kZXZpZCk7CkBAIC0xMjk1LDcgKzEzODEsNyBAQAogCiBzdGF0aWMgaW50IHNhMTExMV9idXNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLQlzdHJ1Y3Qgc2ExMTExX2RldiAqc2FkZXYgPSBTQTExMTFfREVWKGRldik7CisJc3RydWN0IHNhMTExMV9kZXYgKnNhZGV2ID0gdG9fc2ExMTExX2RldmljZShkZXYpOwogCXN0cnVjdCBzYTExMTFfZHJpdmVyICpkcnYgPSBTQTExMTFfRFJWKGRldi0+ZHJpdmVyKTsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMTMwNiw3ICsxMzkyLDcgQEAKIAogc3RhdGljIGludCBzYTExMTFfYnVzX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHNhMTExMV9kZXYgKnNhZGV2ID0gU0ExMTExX0RFVihkZXYpOworCXN0cnVjdCBzYTExMTFfZGV2ICpzYWRldiA9IHRvX3NhMTExMV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3Qgc2ExMTExX2RyaXZlciAqZHJ2ID0gU0ExMTExX0RSVihkZXYtPmRyaXZlcik7CiAJaW50IHJldCA9IDA7CiAKQEAgLTEzMjAsMTIgKzE0MDYsMTIgQEAKIAlzdHJ1Y3Qgc2ExMTExX2RyaXZlciAqZHJ2ID0gU0ExMTExX0RSVihkZXYtPmRyaXZlcik7CiAKIAlpZiAoZHJ2ICYmIGRydi0+c2h1dGRvd24pCi0JCWRydi0+c2h1dGRvd24oU0ExMTExX0RFVihkZXYpKTsKKwkJZHJ2LT5zaHV0ZG93bih0b19zYTExMTFfZGV2aWNlKGRldikpOwogfQogCiBzdGF0aWMgaW50IHNhMTExMV9idXNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBzYTExMTFfZGV2ICpzYWRldiA9IFNBMTExMV9ERVYoZGV2KTsKKwlzdHJ1Y3Qgc2ExMTExX2RldiAqc2FkZXYgPSB0b19zYTExMTFfZGV2aWNlKGRldik7CiAJc3RydWN0IHNhMTExMV9kcml2ZXIgKmRydiA9IFNBMTExMV9EUlYoZGV2LT5kcml2ZXIpOwogCWludCByZXQgPSAtRU5PREVWOwogCkBAIC0xMzM2LDcgKzE0MjIsNyBAQAogCiBzdGF0aWMgaW50IHNhMTExMV9idXNfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgc2ExMTExX2RldiAqc2FkZXYgPSBTQTExMTFfREVWKGRldik7CisJc3RydWN0IHNhMTExMV9kZXYgKnNhZGV2ID0gdG9fc2ExMTExX2RldmljZShkZXYpOwogCXN0cnVjdCBzYTExMTFfZHJpdmVyICpkcnYgPSBTQTExMTFfRFJWKGRldi0+ZHJpdmVyKTsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMTQwMSw3ICsxNDg3LDcgQEAKIHN0YXRpYyBpbnQgc2ExMTExX25vdGlmaWVyX2NhbGwoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwKIAl2b2lkICpkYXRhKQogewotCXN0cnVjdCBzYTExMTFfZGV2ICpkZXYgPSBTQTExMTFfREVWKGRhdGEpOworCXN0cnVjdCBzYTExMTFfZGV2ICpkZXYgPSB0b19zYTExMTFfZGV2aWNlKGRhdGEpOwogCiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIEJVU19OT1RJRllfQUREX0RFVklDRToKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvZXh5bm9zX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvZXh5bm9zX2RlZmNvbmZpZwppbmRleCAwMTk4NmRlLi4zNmNjN2NjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2V4eW5vc19kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9leHlub3NfZGVmY29uZmlnCkBAIC0yOCw3ICsyOCw3IEBACiBDT05GSUdfQ1BVX0ZSRVFfR09WX1BPV0VSU0FWRT1tCiBDT05GSUdfQ1BVX0ZSRVFfR09WX1VTRVJTUEFDRT1tCiBDT05GSUdfQ1BVX0ZSRVFfR09WX0NPTlNFUlZBVElWRT1tCi1DT05GSUdfQ1BVX0ZSRVFfR09WX1NDSEVEVVRJTD1tCitDT05GSUdfQ1BVX0ZSRVFfR09WX1NDSEVEVVRJTD15CiBDT05GSUdfQ1BVRlJFUV9EVD15CiBDT05GSUdfQ1BVX0lETEU9eQogQ09ORklHX0FSTV9FWFlOT1NfQ1BVSURMRT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2tleXN0b25lX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3Mva2V5c3RvbmVfZGVmY29uZmlnCmluZGV4IDcxYjQyZTYuLjc4Y2QyZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3Mva2V5c3RvbmVfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3Mva2V5c3RvbmVfZGVmY29uZmlnCkBAIC0xNjEsNiArMTYxLDcgQEAKIENPTkZJR19VU0JfWEhDSV9IQ0Q9eQogQ09ORklHX1VTQl9TVE9SQUdFPXkKIENPTkZJR19VU0JfRFdDMz15CitDT05GSUdfTk9QX1VTQl9YQ0VJVj15CiBDT05GSUdfS0VZU1RPTkVfVVNCX1BIWT15CiBDT05GSUdfTkVXX0xFRFM9eQogQ09ORklHX0xFRFNfQ0xBU1M9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9tdWx0aV92N19kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL211bHRpX3Y3X2RlZmNvbmZpZwppbmRleCAyYzg2NjVjLi41ODQ1OTEwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL211bHRpX3Y3X2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL211bHRpX3Y3X2RlZmNvbmZpZwpAQCAtMTM1LDcgKzEzNSw3IEBACiBDT05GSUdfQ1BVX0ZSRVFfR09WX1BPV0VSU0FWRT1tCiBDT05GSUdfQ1BVX0ZSRVFfR09WX1VTRVJTUEFDRT1tCiBDT05GSUdfQ1BVX0ZSRVFfR09WX0NPTlNFUlZBVElWRT1tCi1DT05GSUdfQ1BVX0ZSRVFfR09WX1NDSEVEVVRJTD1tCitDT05GSUdfQ1BVX0ZSRVFfR09WX1NDSEVEVVRJTD15CiBDT05GSUdfUU9SSVFfQ1BVRlJFUT15CiBDT05GSUdfQ1BVX0lETEU9eQogQ09ORklHX0FSTV9DUFVJRExFPXkKQEAgLTc4MSw3ICs3ODEsNyBAQAogQ09ORklHX0RNQV9CQ00yODM1PXkKIENPTkZJR19ETUFfT01BUD15CiBDT05GSUdfUUNPTV9CQU1fRE1BPXkKLUNPTkZJR19YSUxJTlhfVkRNQT15CitDT05GSUdfWElMSU5YX0RNQT15CiBDT05GSUdfRE1BX1NVTjZJPXkKIENPTkZJR19TVEFHSU5HPXkKIENPTkZJR19TRU5TT1JTX0lTTDI5MDE4PXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NyeXB0by9hZXMtY2UtZ2x1ZS5jIGIvYXJjaC9hcm0vY3J5cHRvL2Flcy1jZS1nbHVlLmMKaW5kZXggZGEzYzA0Mi4uYWVmMDIyYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY3J5cHRvL2Flcy1jZS1nbHVlLmMKKysrIGIvYXJjaC9hcm0vY3J5cHRvL2Flcy1jZS1nbHVlLmMKQEAgLTI4NCw3ICsyODQsNyBAQAogCQllcnIgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsICZ3YWxrLAogCQkJCQkgIHdhbGsubmJ5dGVzICUgQUVTX0JMT0NLX1NJWkUpOwogCX0KLQlpZiAobmJ5dGVzKSB7CisJaWYgKHdhbGsubmJ5dGVzICUgQUVTX0JMT0NLX1NJWkUpIHsKIAkJdTggKnRkc3QgPSB3YWxrLmRzdC52aXJ0LmFkZHIgKyBibG9ja3MgKiBBRVNfQkxPQ0tfU0laRTsKIAkJdTggKnRzcmMgPSB3YWxrLnNyYy52aXJ0LmFkZHIgKyBibG9ja3MgKiBBRVNfQkxPQ0tfU0laRTsKIAkJdTggX19hbGlnbmVkKDgpIHRhaWxbQUVTX0JMT0NLX1NJWkVdOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXJjaF9naWN2My5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXJjaF9naWN2My5oCmluZGV4IGUwOGQxNTEuLmE4MDg4MjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2FyY2hfZ2ljdjMuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9hcmNoX2dpY3YzLmgKQEAgLTIyLDkgKzIyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL2JhcnJpZXIuaD4KLQotI2RlZmluZSBfX0FDQ0VTU19DUDE1KENSbiwgT3AxLCBDUm0sIE9wMikJcDE1LCBPcDEsICUwLCBDUm4sIENSbSwgT3AyCi0jZGVmaW5lIF9fQUNDRVNTX0NQMTVfNjQoT3AxLCBDUm0pCQlwMTUsIE9wMSwgJVEwLCAlUjAsIENSbQorI2luY2x1ZGUgPGFzbS9jcDE1Lmg+CiAKICNkZWZpbmUgSUNDX0VPSVIxCQkJX19BQ0NFU1NfQ1AxNShjMTIsIDAsIGMxMiwgMSkKICNkZWZpbmUgSUNDX0RJUgkJCQlfX0FDQ0VTU19DUDE1KGMxMiwgMCwgYzExLCAxKQpAQCAtMzQsNiArMzIsNyBAQAogI2RlZmluZSBJQ0NfQ1RMUgkJCV9fQUNDRVNTX0NQMTUoYzEyLCAwLCBjMTIsIDQpCiAjZGVmaW5lIElDQ19TUkUJCQkJX19BQ0NFU1NfQ1AxNShjMTIsIDAsIGMxMiwgNSkKICNkZWZpbmUgSUNDX0lHUlBFTjEJCQlfX0FDQ0VTU19DUDE1KGMxMiwgMCwgYzEyLCA3KQorI2RlZmluZSBJQ0NfQlBSMQkJCV9fQUNDRVNTX0NQMTUoYzEyLCAwLCBjMTIsIDMpCiAKICNkZWZpbmUgSUNDX0hTUkUJCQlfX0FDQ0VTU19DUDE1KGMxMiwgNCwgYzksIDUpCiAKQEAgLTk4LDY1ICs5NywxMzEgQEAKICNkZWZpbmUgSUNIX0FQMVIyCQkJX19BUDFSeCgyKQogI2RlZmluZSBJQ0hfQVAxUjMJCQlfX0FQMVJ4KDMpCiAKKy8qIEEzMi10by1BNjQgbWFwcGluZ3MgdXNlZCBieSBWR0lDIHNhdmUvcmVzdG9yZSAqLworCisjZGVmaW5lIENQVUlGX01BUChhMzIsIGE2NCkJCQlcCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfICMjIGE2NCh1MzIgdmFsKQlcCit7CQkJCQkJXAorCXdyaXRlX3N5c3JlZyh2YWwsIGEzMik7CQkJXAorfQkJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdTMyIHJlYWRfICMjIGE2NCh2b2lkKQkJXAorewkJCQkJCVwKKwlyZXR1cm4gcmVhZF9zeXNyZWcoYTMyKTsgCQlcCit9CQkJCQkJXAorCisjZGVmaW5lIENQVUlGX01BUF9MT19ISShhMzJsbywgYTMyaGksIGE2NCkJXAorc3RhdGljIGlubGluZSB2b2lkIHdyaXRlXyAjIyBhNjQodTY0IHZhbCkJXAorewkJCQkJCVwKKwl3cml0ZV9zeXNyZWcobG93ZXJfMzJfYml0cyh2YWwpLCBhMzJsbyk7XAorCXdyaXRlX3N5c3JlZyh1cHBlcl8zMl9iaXRzKHZhbCksIGEzMmhpKTtcCit9CQkJCQkJXAorc3RhdGljIGlubGluZSB1NjQgcmVhZF8gIyMgYTY0KHZvaWQpCQlcCit7CQkJCQkJXAorCXU2NCB2YWwgPSByZWFkX3N5c3JlZyhhMzJsbyk7CQlcCisJCQkJCQlcCisJdmFsIHw9CSh1NjQpcmVhZF9zeXNyZWcoYTMyaGkpIDw8IDMyOwlcCisJCQkJCQlcCisJcmV0dXJuIHZhbDsgCQkJCVwKK30KKworQ1BVSUZfTUFQKElDSF9IQ1IsIElDSF9IQ1JfRUwyKQorQ1BVSUZfTUFQKElDSF9WVFIsIElDSF9WVFJfRUwyKQorQ1BVSUZfTUFQKElDSF9NSVNSLCBJQ0hfTUlTUl9FTDIpCitDUFVJRl9NQVAoSUNIX0VJU1IsIElDSF9FSVNSX0VMMikKK0NQVUlGX01BUChJQ0hfRUxTUiwgSUNIX0VMU1JfRUwyKQorQ1BVSUZfTUFQKElDSF9WTUNSLCBJQ0hfVk1DUl9FTDIpCitDUFVJRl9NQVAoSUNIX0FQMFIzLCBJQ0hfQVAwUjNfRUwyKQorQ1BVSUZfTUFQKElDSF9BUDBSMiwgSUNIX0FQMFIyX0VMMikKK0NQVUlGX01BUChJQ0hfQVAwUjEsIElDSF9BUDBSMV9FTDIpCitDUFVJRl9NQVAoSUNIX0FQMFIwLCBJQ0hfQVAwUjBfRUwyKQorQ1BVSUZfTUFQKElDSF9BUDFSMywgSUNIX0FQMVIzX0VMMikKK0NQVUlGX01BUChJQ0hfQVAxUjIsIElDSF9BUDFSMl9FTDIpCitDUFVJRl9NQVAoSUNIX0FQMVIxLCBJQ0hfQVAxUjFfRUwyKQorQ1BVSUZfTUFQKElDSF9BUDFSMCwgSUNIX0FQMVIwX0VMMikKK0NQVUlGX01BUChJQ0NfSFNSRSwgSUNDX1NSRV9FTDIpCitDUFVJRl9NQVAoSUNDX1NSRSwgSUNDX1NSRV9FTDEpCisKK0NQVUlGX01BUF9MT19ISShJQ0hfTFIxNSwgSUNIX0xSQzE1LCBJQ0hfTFIxNV9FTDIpCitDUFVJRl9NQVBfTE9fSEkoSUNIX0xSMTQsIElDSF9MUkMxNCwgSUNIX0xSMTRfRUwyKQorQ1BVSUZfTUFQX0xPX0hJKElDSF9MUjEzLCBJQ0hfTFJDMTMsIElDSF9MUjEzX0VMMikKK0NQVUlGX01BUF9MT19ISShJQ0hfTFIxMiwgSUNIX0xSQzEyLCBJQ0hfTFIxMl9FTDIpCitDUFVJRl9NQVBfTE9fSEkoSUNIX0xSMTEsIElDSF9MUkMxMSwgSUNIX0xSMTFfRUwyKQorQ1BVSUZfTUFQX0xPX0hJKElDSF9MUjEwLCBJQ0hfTFJDMTAsIElDSF9MUjEwX0VMMikKK0NQVUlGX01BUF9MT19ISShJQ0hfTFI5LCBJQ0hfTFJDOSwgSUNIX0xSOV9FTDIpCitDUFVJRl9NQVBfTE9fSEkoSUNIX0xSOCwgSUNIX0xSQzgsIElDSF9MUjhfRUwyKQorQ1BVSUZfTUFQX0xPX0hJKElDSF9MUjcsIElDSF9MUkM3LCBJQ0hfTFI3X0VMMikKK0NQVUlGX01BUF9MT19ISShJQ0hfTFI2LCBJQ0hfTFJDNiwgSUNIX0xSNl9FTDIpCitDUFVJRl9NQVBfTE9fSEkoSUNIX0xSNSwgSUNIX0xSQzUsIElDSF9MUjVfRUwyKQorQ1BVSUZfTUFQX0xPX0hJKElDSF9MUjQsIElDSF9MUkM0LCBJQ0hfTFI0X0VMMikKK0NQVUlGX01BUF9MT19ISShJQ0hfTFIzLCBJQ0hfTFJDMywgSUNIX0xSM19FTDIpCitDUFVJRl9NQVBfTE9fSEkoSUNIX0xSMiwgSUNIX0xSQzIsIElDSF9MUjJfRUwyKQorQ1BVSUZfTUFQX0xPX0hJKElDSF9MUjEsIElDSF9MUkMxLCBJQ0hfTFIxX0VMMikKK0NQVUlGX01BUF9MT19ISShJQ0hfTFIwLCBJQ0hfTFJDMCwgSUNIX0xSMF9FTDIpCisKKyNkZWZpbmUgcmVhZF9naWNyZWcocikgICAgICAgICAgICAgICAgIHJlYWRfIyNyKCkKKyNkZWZpbmUgd3JpdGVfZ2ljcmVnKHYsIHIpICAgICAgICAgICAgIHdyaXRlXyMjcih2KQorCiAvKiBMb3ctbGV2ZWwgYWNjZXNzb3JzICovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBnaWNfd3JpdGVfZW9pcih1MzIgaXJxKQogewotCWFzbSB2b2xhdGlsZSgibWNyICIgX19zdHJpbmdpZnkoSUNDX0VPSVIxKSA6IDogInIiIChpcnEpKTsKKwl3cml0ZV9zeXNyZWcoaXJxLCBJQ0NfRU9JUjEpOwogCWlzYigpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZ2ljX3dyaXRlX2Rpcih1MzIgdmFsKQogewotCWFzbSB2b2xhdGlsZSgibWNyICIgX19zdHJpbmdpZnkoSUNDX0RJUikgOiA6ICJyIiAodmFsKSk7CisJd3JpdGVfc3lzcmVnKHZhbCwgSUNDX0RJUik7CiAJaXNiKCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTMyIGdpY19yZWFkX2lhcih2b2lkKQogewotCXUzMiBpcnFzdGF0OworCXUzMiBpcnFzdGF0ID0gcmVhZF9zeXNyZWcoSUNDX0lBUjEpOwogCi0JYXNtIHZvbGF0aWxlKCJtcmMgIiBfX3N0cmluZ2lmeShJQ0NfSUFSMSkgOiAiPXIiIChpcnFzdGF0KSk7CiAJZHNiKHN5KTsKKwogCXJldHVybiBpcnFzdGF0OwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZ2ljX3dyaXRlX3Btcih1MzIgdmFsKQogewotCWFzbSB2b2xhdGlsZSgibWNyICIgX19zdHJpbmdpZnkoSUNDX1BNUikgOiA6ICJyIiAodmFsKSk7CisJd3JpdGVfc3lzcmVnKHZhbCwgSUNDX1BNUik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBnaWNfd3JpdGVfY3Rscih1MzIgdmFsKQogewotCWFzbSB2b2xhdGlsZSgibWNyICIgX19zdHJpbmdpZnkoSUNDX0NUTFIpIDogOiAiciIgKHZhbCkpOworCXdyaXRlX3N5c3JlZyh2YWwsIElDQ19DVExSKTsKIAlpc2IoKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGdpY193cml0ZV9ncnBlbjEodTMyIHZhbCkKIHsKLQlhc20gdm9sYXRpbGUoIm1jciAiIF9fc3RyaW5naWZ5KElDQ19JR1JQRU4xKSA6IDogInIiICh2YWwpKTsKKwl3cml0ZV9zeXNyZWcodmFsLCBJQ0NfSUdSUEVOMSk7CiAJaXNiKCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBnaWNfd3JpdGVfc2dpMXIodTY0IHZhbCkKIHsKLQlhc20gdm9sYXRpbGUoIm1jcnIgIiBfX3N0cmluZ2lmeShJQ0NfU0dJMVIpIDogOiAiciIgKHZhbCkpOworCXdyaXRlX3N5c3JlZyh2YWwsIElDQ19TR0kxUik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTMyIGdpY19yZWFkX3NyZSh2b2lkKQogewotCXUzMiB2YWw7Ci0KLQlhc20gdm9sYXRpbGUoIm1yYyAiIF9fc3RyaW5naWZ5KElDQ19TUkUpIDogIj1yIiAodmFsKSk7Ci0JcmV0dXJuIHZhbDsKKwlyZXR1cm4gcmVhZF9zeXNyZWcoSUNDX1NSRSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBnaWNfd3JpdGVfc3JlKHUzMiB2YWwpCiB7Ci0JYXNtIHZvbGF0aWxlKCJtY3IgIiBfX3N0cmluZ2lmeShJQ0NfU1JFKSA6IDogInIiICh2YWwpKTsKKwl3cml0ZV9zeXNyZWcodmFsLCBJQ0NfU1JFKTsKIAlpc2IoKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGdpY193cml0ZV9icHIxKHUzMiB2YWwpCit7CisJd3JpdGVfc3lzcmVnKHZhbCwgSUNDX0JQUjEpOworfQorCiAvKgogICogRXZlbiBpbiAzMmJpdCBzeXN0ZW1zIHRoYXQgdXNlIExQQUUsIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBJL08KICAqIGludGVyZmFjZSBwcm92aWRlcyB0cnVlIDY0Yml0IGF0b21pYyBhY2Nlc3Nlcywgc28gdXNpbmcgc3RyZC9sZHJkIGRvZXNuJ3QKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2Fzc2VtYmxlci5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXNzZW1ibGVyLmgKaW5kZXggNGVhZWEyMS4uNjhiMDZmOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXNzZW1ibGVyLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXNzZW1ibGVyLmgKQEAgLTE1OSw3ICsxNTksMTEgQEAKIAkuZW5kbQogCiAJLm1hY3JvCXNhdmVfYW5kX2Rpc2FibGVfaXJxc19ub3RyYWNlLCBvbGRjcHNyCisjaWZkZWYgQ09ORklHX0NQVV9WN00KKwltcnMJXG9sZGNwc3IsIHByaW1hc2sKKyNlbHNlCiAJbXJzCVxvbGRjcHNyLCBjcHNyCisjZW5kaWYKIAlkaXNhYmxlX2lycV9ub3RyYWNlCiAJLmVuZG0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oCmluZGV4IDkxNTZmYzMuLmJkZDI4M2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKQEAgLTUwMSwyMSArNTAxLDQgQEAKIHZvaWQgZmx1c2hfdXByb2JlX3hvbF9hY2Nlc3Moc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgdWFkZHIsCiAJCQkgICAgIHZvaWQgKmthZGRyLCB1bnNpZ25lZCBsb25nIGxlbik7CiAKLS8qKgotICogc2VjdXJlX2ZsdXNoX2FyZWEgLSBlbnN1cmUgY29oZXJlbmN5IGFjcm9zcyB0aGUgc2VjdXJlIGJvdW5kYXJ5Ci0gKiBAYWRkcjogdmlydHVhbCBhZGRyZXNzCi0gKiBAc2l6ZTogc2l6ZSBvZiByZWdpb24KLSAqCi0gKiBFbnN1cmUgdGhhdCB0aGUgc3BlY2lmaWVkIGFyZWEgb2YgbWVtb3J5IGlzIGNvaGVyZW50IGFjcm9zcyB0aGUgc2VjdXJlCi0gKiBib3VuZGFyeSBmcm9tIHRoZSBub24tc2VjdXJlIHNpZGUuICBUaGlzIGlzIHVzZWQgd2hlbiBjYWxsaW5nIHNlY3VyZQotICogZmlybXdhcmUgd2hlcmUgdGhlIHNlY3VyZSBmaXJtd2FyZSBkb2VzIG5vdCBlbnN1cmUgY29oZXJlbmN5LgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgc2VjdXJlX2ZsdXNoX2FyZWEoY29uc3Qgdm9pZCAqYWRkciwgc2l6ZV90IHNpemUpCi17Ci0JcGh5c19hZGRyX3QgcGh5cyA9IF9fcGEoYWRkcik7Ci0KLQlfX2NwdWNfZmx1c2hfZGNhY2hlX2FyZWEoKHZvaWQgKilhZGRyLCBzaXplKTsKLQlvdXRlcl9mbHVzaF9yYW5nZShwaHlzLCBwaHlzICsgc2l6ZSk7Ci19Ci0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vY2FjaGV0eXBlLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9jYWNoZXR5cGUuaAppbmRleCA3ZWE3ODE0Li4wMTUwOWFlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9jYWNoZXR5cGUuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9jYWNoZXR5cGUuaApAQCAtNTYsNCArNTYsNDMgQEAKIAkgICAgICAgKH5fX0NBQ0hFSURfTkVWRVIgJiBfX0NBQ0hFSURfQVJDSF9NSU4gJiBtYXNrICYgY2FjaGVpZCk7CiB9CiAKKyNkZWZpbmUgQ1NTRUxSX0lDQUNIRQkxCisjZGVmaW5lIENTU0VMUl9EQ0FDSEUJMAorCisjZGVmaW5lIENTU0VMUl9MMQkoMCA8PCAxKQorI2RlZmluZSBDU1NFTFJfTDIJKDEgPDwgMSkKKyNkZWZpbmUgQ1NTRUxSX0wzCSgyIDw8IDEpCisjZGVmaW5lIENTU0VMUl9MNAkoMyA8PCAxKQorI2RlZmluZSBDU1NFTFJfTDUJKDQgPDwgMSkKKyNkZWZpbmUgQ1NTRUxSX0w2CSg1IDw8IDEpCisjZGVmaW5lIENTU0VMUl9MNwkoNiA8PCAxKQorCisjaWZuZGVmIENPTkZJR19DUFVfVjdNCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2Nzc2Vscih1bnNpZ25lZCBpbnQgY2FjaGVfc2VsZWN0b3IpCit7CisJYXNtIHZvbGF0aWxlKCJtY3IgcDE1LCAyLCAlMCwgYzAsIGMwLCAwIiA6IDogInIiIChjYWNoZV9zZWxlY3RvcikpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCByZWFkX2Njc2lkcih2b2lkKQoreworCXVuc2lnbmVkIGludCB2YWw7CisKKwlhc20gdm9sYXRpbGUoIm1yYyBwMTUsIDEsICUwLCBjMCwgYzAsIDAiIDogIj1yIiAodmFsKSk7CisJcmV0dXJuIHZhbDsKK30KKyNlbHNlIC8qIENPTkZJR19DUFVfVjdNICovCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlICJhc20vdjdtLmgiCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY3NzZWxyKHVuc2lnbmVkIGludCBjYWNoZV9zZWxlY3RvcikKK3sKKwl3cml0ZWwoY2FjaGVfc2VsZWN0b3IsIEJBU0VBRERSX1Y3TV9TQ0IgKyBWN01fU0NCX0NUUik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHJlYWRfY2NzaWRyKHZvaWQpCit7CisJcmV0dXJuIHJlYWRsKEJBU0VBRERSX1Y3TV9TQ0IgKyBWN01fU0NCX0NDU0lEUik7Cit9CisjZW5kaWYKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9jbG9ja3NvdXJjZS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vY2xvY2tzb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjM1MGE3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vY2xvY2tzb3VyY2UuaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgX0FTTV9DTE9DS1NPVVJDRV9ICisjZGVmaW5lIF9BU01fQ0xPQ0tTT1VSQ0VfSAorCitzdHJ1Y3QgYXJjaF9jbG9ja3NvdXJjZV9kYXRhIHsKKwlib29sIHZkc29fZGlyZWN0OwkvKiBVc2FibGUgZm9yIGRpcmVjdCBWRFNPIGFjY2Vzcz8gKi8KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vY3AxNS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vY3AxNS5oCmluZGV4IGMzZjExNTIuLmRiZGJjZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2NwMTUuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9jcDE1LmgKQEAgLTQ5LDYgKzQ5LDIxIEBACiAKICNpZmRlZiBDT05GSUdfQ1BVX0NQMTUKIAorI2RlZmluZSBfX0FDQ0VTU19DUDE1KENSbiwgT3AxLCBDUm0sIE9wMikJXAorCSJtcmMiLCAibWNyIiwgX19zdHJpbmdpZnkocDE1LCBPcDEsICUwLCBDUm4sIENSbSwgT3AyKSwgdTMyCisjZGVmaW5lIF9fQUNDRVNTX0NQMTVfNjQoT3AxLCBDUm0pCQlcCisJIm1ycmMiLCAibWNyciIsIF9fc3RyaW5naWZ5KHAxNSwgT3AxLCAlUTAsICVSMCwgQ1JtKSwgdTY0CisKKyNkZWZpbmUgX19yZWFkX3N5c3JlZyhyLCB3LCBjLCB0KSAoewkJCQlcCisJdCBfX3ZhbDsJCQkJCQlcCisJYXNtIHZvbGF0aWxlKHIgIiAiIGMgOiAiPXIiIChfX3ZhbCkpOwkJCVwKKwlfX3ZhbDsJCQkJCQkJXAorfSkKKyNkZWZpbmUgcmVhZF9zeXNyZWcoLi4uKQkJX19yZWFkX3N5c3JlZyhfX1ZBX0FSR1NfXykKKworI2RlZmluZSBfX3dyaXRlX3N5c3JlZyh2LCByLCB3LCBjLCB0KQlhc20gdm9sYXRpbGUodyAiICIgYyA6IDogInIiICgodCkodikpKQorI2RlZmluZSB3cml0ZV9zeXNyZWcodiwgLi4uKQkJX193cml0ZV9zeXNyZWcodiwgX19WQV9BUkdTX18pCisKIGV4dGVybiB1bnNpZ25lZCBsb25nIGNyX2FsaWdubWVudDsJLyogZGVmaW5lZCBpbiBlbnRyeS1hcm12LlMgKi8KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF9jcih2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vY3B1dHlwZS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vY3B1dHlwZS5oCmluZGV4IDFlZTk0YzcuLjUyMmI1ZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2NwdXR5cGUuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9jcHV0eXBlLmgKQEAgLTU1LDExICs1NSwxMyBAQAogCiAjZGVmaW5lIE1QSURSX0xFVkVMX0JJVFMgOAogI2RlZmluZSBNUElEUl9MRVZFTF9NQVNLICgoMSA8PCBNUElEUl9MRVZFTF9CSVRTKSAtIDEpCisjZGVmaW5lIE1QSURSX0xFVkVMX1NISUZUKGxldmVsKSAoTVBJRFJfTEVWRUxfQklUUyAqIGxldmVsKQogCiAjZGVmaW5lIE1QSURSX0FGRklOSVRZX0xFVkVMKG1waWRyLCBsZXZlbCkgXAogCSgobXBpZHIgPj4gKE1QSURSX0xFVkVMX0JJVFMgKiBsZXZlbCkpICYgTVBJRFJfTEVWRUxfTUFTSykKIAogI2RlZmluZSBBUk1fQ1BVX0lNUF9BUk0JCQkweDQxCisjZGVmaW5lIEFSTV9DUFVfSU1QX0RFQwkJCTB4NDQKICNkZWZpbmUgQVJNX0NQVV9JTVBfSU5URUwJCTB4NjkKIAogLyogQVJNIGltcGxlbWVudGVkIHByb2Nlc3NvcnMgKi8KQEAgLTc2LDYgKzc4LDE3IEBACiAjZGVmaW5lIEFSTV9DUFVfUEFSVF9DT1JURVhfQTE1CQkweDQxMDBjMGYwCiAjZGVmaW5lIEFSTV9DUFVfUEFSVF9NQVNLCQkweGZmMDBmZmYwCiAKKy8qIERFQyBpbXBsZW1lbnRlZCBjb3JlcyAqLworI2RlZmluZSBBUk1fQ1BVX1BBUlRfU0ExMTAwCQkweDQ0MDBhMTEwCisKKy8qIEludGVsIGltcGxlbWVudGVkIGNvcmVzICovCisjZGVmaW5lIEFSTV9DUFVfUEFSVF9TQTExMTAJCTB4NjkwMGIxMTAKKyNkZWZpbmUgQVJNX0NQVV9SRVZfU0ExMTEwX0EwCQkwCisjZGVmaW5lIEFSTV9DUFVfUkVWX1NBMTExMF9CMAkJNAorI2RlZmluZSBBUk1fQ1BVX1JFVl9TQTExMTBfQjEJCTUKKyNkZWZpbmUgQVJNX0NQVV9SRVZfU0ExMTEwX0IyCQk2CisjZGVmaW5lIEFSTV9DUFVfUkVWX1NBMTExMF9CNAkJOAorCiAjZGVmaW5lIEFSTV9DUFVfWFNDQUxFX0FSQ0hfTUFTSwkweGUwMDAKICNkZWZpbmUgQVJNX0NQVV9YU0NBTEVfQVJDSF9WMQkJMHgyMDAwCiAjZGVmaW5lIEFSTV9DUFVfWFNDQUxFX0FSQ0hfVjIJCTB4NDAwMApAQCAtMTUyLDYgKzE2NSwxMSBAQAogCXJldHVybiByZWFkX2NwdWlkKENQVUlEX0lEKTsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfY29uc3RfXyByZWFkX2NwdWlkX2NhY2hldHlwZSh2b2lkKQoreworCXJldHVybiByZWFkX2NwdWlkKENQVUlEX0NBQ0hFVFlQRSk7Cit9CisKICNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9WN00pCiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX2NvbnN0X18gcmVhZF9jcHVpZF9pZCh2b2lkKQpAQCAtMTU5LDYgKzE3NywxMSBAQAogCXJldHVybiByZWFkbChCQVNFQUREUl9WN01fU0NCICsgVjdNX1NDQl9DUFVJRCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX2NvbnN0X18gcmVhZF9jcHVpZF9jYWNoZXR5cGUodm9pZCkKK3sKKwlyZXR1cm4gcmVhZGwoQkFTRUFERFJfVjdNX1NDQiArIFY3TV9TQ0JfQ1RSKTsKK30KKwogI2Vsc2UgLyogaWZkZWYgQ09ORklHX0NQVV9DUDE1IC8gZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfVjdNKSAqLwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9jb25zdF9fIHJlYWRfY3B1aWRfaWQodm9pZCkKQEAgLTE3Myw2ICsxOTYsMTEgQEAKIAlyZXR1cm4gKHJlYWRfY3B1aWRfaWQoKSAmIDB4RkYwMDAwMDApID4+IDI0OwogfQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9jb25zdF9fIHJlYWRfY3B1aWRfcmV2aXNpb24odm9pZCkKK3sKKwlyZXR1cm4gcmVhZF9jcHVpZF9pZCgpICYgMHgwMDAwMDAwZjsKK30KKwogLyoKICAqIFRoZSBDUFUgcGFydCBudW1iZXIgaXMgbWVhbmluZ2xlc3Mgd2l0aG91dCByZWZlcnJpbmcgdG8gdGhlIENQVQogICogaW1wbGVtZW50ZXI6IGltcGxlbWVudGVycyBhcmUgZnJlZSB0byBkZWZpbmUgdGhlaXIgb3duIHBhcnQgbnVtYmVycwpAQCAtMTkzLDExICsyMjEsNiBAQAogCXJldHVybiByZWFkX2NwdWlkX2lkKCkgJiBBUk1fQ1BVX1hTQ0FMRV9BUkNIX01BU0s7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX2NvbnN0X18gcmVhZF9jcHVpZF9jYWNoZXR5cGUodm9pZCkKLXsKLQlyZXR1cm4gcmVhZF9jcHVpZChDUFVJRF9DQUNIRVRZUEUpOwotfQotCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9jb25zdF9fIHJlYWRfY3B1aWRfdGNtc3RhdHVzKHZvaWQpCiB7CiAJcmV0dXJuIHJlYWRfY3B1aWQoQ1BVSURfVENNKTsKQEAgLTIwOCw2ICsyMzEsMTAgQEAKIAlyZXR1cm4gcmVhZF9jcHVpZChDUFVJRF9NUElEUik7CiB9CiAKKy8qIFN0cm9uZ0FSTS0xMXgwIENQVXMgKi8KKyNkZWZpbmUgY3B1X2lzX3NhMTEwMCgpIChyZWFkX2NwdWlkX3BhcnQoKSA9PSBBUk1fQ1BVX1BBUlRfU0ExMTAwKQorI2RlZmluZSBjcHVfaXNfc2ExMTEwKCkgKHJlYWRfY3B1aWRfcGFydCgpID09IEFSTV9DUFVfUEFSVF9TQTExMTApCisKIC8qCiAgKiBJbnRlbCdzIFhTY2FsZTMgY29yZSBzdXBwb3J0cyBzb21lIHY2IGZlYXR1cmVzIChzdXBlcnNlY3Rpb25zLCBMMikKICAqIGJ1dCBhZHZlcnRpc2VzIGl0c2VsZiBhcyB2NSBhcyBpdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSB2NiBJU0EuICBGb3IKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2RlbGF5LmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9kZWxheS5oCmluZGV4IGI3YTQyODEuLmIxY2UwMzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2RlbGF5LmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZGVsYXkuaApAQCAtMTAsNyArMTAsNyBAQAogI2luY2x1ZGUgPGFzbS9wYXJhbS5oPgkvKiBIWiAqLwogCiAjZGVmaW5lIE1BWF9VREVMQVlfTVMJMgotI2RlZmluZSBVREVMQVlfTVVMVAlVTCgyMDQ3ICogSFogKyA0ODM2NDggKiBIWiAvIDEwMDAwMDApCisjZGVmaW5lIFVERUxBWV9NVUxUCVVMKDIxNDcgKiBIWiArIDQ4MzY0OCAqIEhaIC8gMTAwMDAwMCkKICNkZWZpbmUgVURFTEFZX1NISUZUCTMxCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaAppbmRleCBkMDA5Zjc5Li5iZjAyZGJkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKQEAgLTExMSw3ICsxMTEsNyBAQAogLyogVGhlIEFSTSBvdmVycmlkZSBmb3IgZG1hX21heF9wZm4oKSAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGRtYV9tYXhfcGZuKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gUEhZU19QRk5fT0ZGU0VUICsgZG1hX3RvX3BmbihkZXYsICpkZXYtPmRtYV9tYXNrKTsKKwlyZXR1cm4gZG1hX3RvX3BmbihkZXYsICpkZXYtPmRtYV9tYXNrKTsKIH0KICNkZWZpbmUgZG1hX21heF9wZm4oZGV2KSBkbWFfbWF4X3BmbihkZXYpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2ZsYXQuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2ZsYXQuaAppbmRleCBlODQ3ZDIzLi5hY2YxZDE0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9mbGF0LmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZmxhdC5oCkBAIC04LDggKzgsOSBAQAogI2RlZmluZQlmbGF0X2FyZ3ZwX2VudnBfb25fc3RhY2soKQkJMQogI2RlZmluZQlmbGF0X29sZF9yYW1fZmxhZyhmbGFncykJCShmbGFncykKICNkZWZpbmUJZmxhdF9yZWxvY192YWxpZChyZWxvYywgc2l6ZSkJCSgocmVsb2MpIDw9IChzaXplKSkKLSNkZWZpbmUJZmxhdF9nZXRfYWRkcl9mcm9tX3JwKHJwLCByZWx2YWwsIGZsYWdzLCBwZXJzaXN0ZW50KSAoKHZvaWQpcGVyc2lzdGVudCxnZXRfdW5hbGlnbmVkKHJwKSkKLSNkZWZpbmUJZmxhdF9wdXRfYWRkcl9hdF9ycChycCwgdmFsLCByZWx2YWwpCXB1dF91bmFsaWduZWQodmFsLHJwKQorI2RlZmluZQlmbGF0X2dldF9hZGRyX2Zyb21fcnAocnAsIHJlbHZhbCwgZmxhZ3MsIHBlcnNpc3RlbnQpIFwKKwkoeyB1bnNpZ25lZCBsb25nIF9fdmFsOyBfX2dldF91c2VyX3VuYWxpZ25lZChfX3ZhbCwgcnApOyBfX3ZhbDsgfSkKKyNkZWZpbmUJZmxhdF9wdXRfYWRkcl9hdF9ycChycCwgdmFsLCByZWx2YWwpCV9fcHV0X3VzZXJfdW5hbGlnbmVkKHZhbCwgcnApCiAjZGVmaW5lCWZsYXRfZ2V0X3JlbG9jYXRlX2FkZHIocmVsKQkJKHJlbCkKICNkZWZpbmUJZmxhdF9zZXRfcGVyc2lzdGVudChyZWx2YWwsIHApCQkwCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2dsdWUtY2FjaGUuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2dsdWUtY2FjaGUuaAppbmRleCBjYWIwN2Y2Li4wMWMzZDkyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9nbHVlLWNhY2hlLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZ2x1ZS1jYWNoZS5oCkBAIC0xMTgsMTEgKzExOCw3IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9WN00pCi0jIGlmZGVmIF9DQUNIRQogIyAgZGVmaW5lIE1VTFRJX0NBQ0hFIDEKLSMgZWxzZQotIyAgZGVmaW5lIF9DQUNIRSBub3AKLSMgZW5kaWYKICNlbmRpZgogCiAjaWYgIWRlZmluZWQoX0NBQ0hFKSAmJiAhZGVmaW5lZChNVUxUSV9DQUNIRSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2NhY2hlLWwyeDAuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2NhY2hlLWwyeDAuaAppbmRleCAzYTVlYzFjLi43MzYyOTJiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9jYWNoZS1sMngwLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvY2FjaGUtbDJ4MC5oCkBAIC04Nyw2ICs4NywxNSBAQAogI2RlZmluZSBMMzEwX0NBQ0hFX0lEX1JUTF9SM1AyCQkweDA4CiAjZGVmaW5lIEwzMTBfQ0FDSEVfSURfUlRMX1IzUDMJCTB4MDkKIAorI2RlZmluZSBMMlgwX0VWRU5UX0NOVF9DVFJMX0VOQUJMRQlCSVQoMCkKKworI2RlZmluZSBMMlgwX0VWRU5UX0NOVF9DRkdfU1JDX1NISUZUCTIKKyNkZWZpbmUgTDJYMF9FVkVOVF9DTlRfQ0ZHX1NSQ19NQVNLCTB4ZgorI2RlZmluZSBMMlgwX0VWRU5UX0NOVF9DRkdfU1JDX0RJU0FCTEVECTAKKyNkZWZpbmUgTDJYMF9FVkVOVF9DTlRfQ0ZHX0lOVF9ESVNBQkxFRAkwCisjZGVmaW5lIEwyWDBfRVZFTlRfQ05UX0NGR19JTlRfSU5DUgkxCisjZGVmaW5lIEwyWDBfRVZFTlRfQ05UX0NGR19JTlRfT1ZFUkZMT1cJMgorCiAvKiBMMkMgYXV4aWxpYXJ5IGNvbnRyb2wgcmVnaXN0ZXIgLSBiaXRzIGNvbW1vbiB0byBMMkMtMjEwLzIyMC8zMTAgKi8KICNkZWZpbmUgTDJDX0FVWF9DVFJMX1dBWV9TSVpFX1NISUZUCQkxNwogI2RlZmluZSBMMkNfQVVYX0NUUkxfV0FZX1NJWkVfTUFTSwkJKDcgPDwgMTcpCkBAIC0xNTcsNiArMTY2LDE2IEBACiB9CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19DQUNIRV9MMlgwX1BNVQordm9pZCBsMngwX3BtdV9yZWdpc3Rlcih2b2lkIF9faW9tZW0gKmJhc2UsIHUzMiBwYXJ0KTsKK3ZvaWQgbDJ4MF9wbXVfc3VzcGVuZCh2b2lkKTsKK3ZvaWQgbDJ4MF9wbXVfcmVzdW1lKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBsMngwX3BtdV9yZWdpc3Rlcih2b2lkIF9faW9tZW0gKmJhc2UsIHUzMiBwYXJ0KSB7fQorc3RhdGljIGlubGluZSB2b2lkIGwyeDBfcG11X3N1c3BlbmQodm9pZCkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBsMngwX3BtdV9yZXN1bWUodm9pZCkge30KKyNlbmRpZgorCiBzdHJ1Y3QgbDJ4MF9yZWdzIHsKIAl1bnNpZ25lZCBsb25nIHBoeV9iYXNlOwogCXVuc2lnbmVkIGxvbmcgYXV4X2N0cmw7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9zYTExMTEuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL3NhMTExMS5oCmluZGV4IDdjMmJiYzcuLjg5NzlmYTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL3NhMTExMS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL3NhMTExMS5oCkBAIC00MjAsNyArNDIwLDcgQEAKIAl1NjQJCWRtYV9tYXNrOwogfTsKIAotI2RlZmluZSBTQTExMTFfREVWKF9kKQljb250YWluZXJfb2YoKF9kKSwgc3RydWN0IHNhMTExMV9kZXYsIGRldikKKyNkZWZpbmUgdG9fc2ExMTExX2RldmljZSh4KQljb250YWluZXJfb2YoeCwgc3RydWN0IHNhMTExMV9kZXYsIGRldikKIAogI2RlZmluZSBzYTExMTFfZ2V0X2RydmRhdGEoZCkJZGV2X2dldF9kcnZkYXRhKCYoZCktPmRldikKICNkZWZpbmUgc2ExMTExX3NldF9kcnZkYXRhKGQscCkJZGV2X3NldF9kcnZkYXRhKCYoZCktPmRldiwgcCkKQEAgLTQ0Niw2ICs0NDYsOCBAQAogaW50IHNhMTExMV9lbmFibGVfZGV2aWNlKHN0cnVjdCBzYTExMTFfZGV2ICopOwogdm9pZCBzYTExMTFfZGlzYWJsZV9kZXZpY2Uoc3RydWN0IHNhMTExMV9kZXYgKik7CiAKK2ludCBzYTExMTFfZ2V0X2lycShzdHJ1Y3Qgc2ExMTExX2RldiAqLCB1bnNpZ25lZCBudW0pOworCiB1bnNpZ25lZCBpbnQgc2ExMTExX3BsbF9jbG9jayhzdHJ1Y3Qgc2ExMTExX2RldiAqKTsKIAogI2RlZmluZSBTQTExMTFfQVVESU9fQUNMSU5LCTAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2h3X2JyZWFrcG9pbnQuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2h3X2JyZWFrcG9pbnQuaAppbmRleCA4ZTQyN2M3Li5hZmNhZjhiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9od19icmVha3BvaW50LmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vaHdfYnJlYWtwb2ludC5oCkBAIC0xMTQsNyArMTE0LDYgQEAKIHN0cnVjdCBwZXJmX2V2ZW50Owogc3RydWN0IHBtdTsKIAotZXh0ZXJuIHN0cnVjdCBwbXUgcGVyZl9vcHNfYnA7CiBleHRlcm4gaW50IGFyY2hfYnBfZ2VuZXJpY19maWVsZHMoc3RydWN0IGFyY2hfaHdfYnJlYWtwb2ludF9jdHJsIGN0cmwsCiAJCQkJICBpbnQgKmdlbl9sZW4sIGludCAqZ2VuX3R5cGUpOwogZXh0ZXJuIGludCBhcmNoX2NoZWNrX2JwX2luX2tlcm5lbHNwYWNlKHN0cnVjdCBwZXJmX2V2ZW50ICpicCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1fYXNtLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1fYXNtLmgKaW5kZXggNThmYWZmNS4uZDdlYTZiYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20va3ZtX2FzbS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2t2bV9hc20uaApAQCAtMjEsNiArMjEsMTAgQEAKIAogI2luY2x1ZGUgPGFzbS92aXJ0Lmg+CiAKKyNkZWZpbmUgQVJNX0VYSVRfV0lUSF9BQk9SVF9CSVQgIDMxCisjZGVmaW5lIEFSTV9FWENFUFRJT05fQ09ERSh4KQkgICgoeCkgJiB+KDFVIDw8IEFSTV9FWElUX1dJVEhfQUJPUlRfQklUKSkKKyNkZWZpbmUgQVJNX0FCT1JUX1BFTkRJTkcoeCkJICAhISgoeCkgJiAoMVUgPDwgQVJNX0VYSVRfV0lUSF9BQk9SVF9CSVQpKQorCiAjZGVmaW5lIEFSTV9FWENFUFRJT05fUkVTRVQJICAwCiAjZGVmaW5lIEFSTV9FWENFUFRJT05fVU5ERUZJTkVEICAgMQogI2RlZmluZSBBUk1fRVhDRVBUSU9OX1NPRlRXQVJFICAgIDIKQEAgLTY4LDYgKzcyLDkgQEAKIGV4dGVybiB2b2lkIF9faW5pdF9zdGFnZTJfdHJhbnNsYXRpb24odm9pZCk7CiAKIGV4dGVybiB2b2lkIF9fa3ZtX2h5cF9yZXNldCh1bnNpZ25lZCBsb25nKTsKKworZXh0ZXJuIHU2NCBfX3ZnaWNfdjNfZ2V0X2ljaF92dHJfZWwyKHZvaWQpOworZXh0ZXJuIHZvaWQgX192Z2ljX3YzX2luaXRfbHJzKHZvaWQpOwogI2VuZGlmCiAKICNlbmRpZiAvKiBfX0FSTV9LVk1fQVNNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2t2bV9lbXVsYXRlLmgKaW5kZXggZWU1MzI4Zi4uOWE4YTQ1YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1fZW11bGF0ZS5oCkBAIC00MCwxOCArNDAsMjkgQEAKIAkqdmNwdV9yZWcodmNwdSwgcmVnX251bSkgPSB2YWw7CiB9CiAKLWJvb2wga3ZtX2NvbmRpdGlvbl92YWxpZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwotdm9pZCBrdm1fc2tpcF9pbnN0cihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGJvb2wgaXNfd2lkZV9pbnN0cik7Citib29sIGt2bV9jb25kaXRpb25fdmFsaWQzMihjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwordm9pZCBrdm1fc2tpcF9pbnN0cjMyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgYm9vbCBpc193aWRlX2luc3RyKTsKIHZvaWQga3ZtX2luamVjdF91bmRlZmluZWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKK3ZvaWQga3ZtX2luamVjdF92YWJ0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiB2b2lkIGt2bV9pbmplY3RfZGFidChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgYWRkcik7CiB2b2lkIGt2bV9pbmplY3RfcGFidChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgYWRkcik7CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBrdm1fY29uZGl0aW9uX3ZhbGlkKGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlyZXR1cm4ga3ZtX2NvbmRpdGlvbl92YWxpZDMyKHZjcHUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQga3ZtX3NraXBfaW5zdHIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBib29sIGlzX3dpZGVfaW5zdHIpCit7CisJa3ZtX3NraXBfaW5zdHIzMih2Y3B1LCBpc193aWRlX2luc3RyKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIHZjcHVfcmVzZXRfaGNyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAl2Y3B1LT5hcmNoLmhjciA9IEhDUl9HVUVTVF9NQVNLOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdmNwdV9nZXRfaGNyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB2Y3B1X2dldF9oY3IoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXJldHVybiB2Y3B1LT5hcmNoLmhjcjsKIH0KQEAgLTYxLDcgKzcyLDcgQEAKIAl2Y3B1LT5hcmNoLmhjciA9IGhjcjsKIH0KIAotc3RhdGljIGlubGluZSBib29sIHZjcHVfbW9kZV9pc18zMmJpdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCitzdGF0aWMgaW5saW5lIGJvb2wgdmNwdV9tb2RlX2lzXzMyYml0KGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlyZXR1cm4gMTsKIH0KQEAgLTcxLDkgKzgyLDkgQEAKIAlyZXR1cm4gJnZjcHUtPmFyY2guY3R4dC5ncF9yZWdzLnVzcl9yZWdzLkFSTV9wYzsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nICp2Y3B1X2Nwc3Ioc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nICp2Y3B1X2Nwc3IoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCXJldHVybiAmdmNwdS0+YXJjaC5jdHh0LmdwX3JlZ3MudXNyX3JlZ3MuQVJNX2Nwc3I7CisJcmV0dXJuICh1bnNpZ25lZCBsb25nICopJnZjcHUtPmFyY2guY3R4dC5ncF9yZWdzLnVzcl9yZWdzLkFSTV9jcHNyOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdmNwdV9zZXRfdGh1bWIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpAQCAtOTMsMTEgKzEwNCwyMSBAQAogCXJldHVybiBjcHNyX21vZGUgPiBVU1JfTU9ERTs7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyIGt2bV92Y3B1X2dldF9oc3Ioc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQorc3RhdGljIGlubGluZSB1MzIga3ZtX3ZjcHVfZ2V0X2hzcihjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJcmV0dXJuIHZjcHUtPmFyY2guZmF1bHQuaHNyOwogfQogCitzdGF0aWMgaW5saW5lIGludCBrdm1fdmNwdV9nZXRfY29uZGl0aW9uKGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl1MzIgaHNyID0ga3ZtX3ZjcHVfZ2V0X2hzcih2Y3B1KTsKKworCWlmIChoc3IgJiBIU1JfQ1YpCisJCXJldHVybiAoaHNyICYgSFNSX0NPTkQpID4+IEhTUl9DT05EX1NISUZUOworCisJcmV0dXJuIC0xOworfQorCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcga3ZtX3ZjcHVfZ2V0X2hmYXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXJldHVybiB2Y3B1LT5hcmNoLmZhdWx0Lmh4ZmFyOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20va3ZtX2hvc3QuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKaW5kZXggZGUzMzhkOS4uMmQxOWUwMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20va3ZtX2hvc3QuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCkBAIC0zOSw3ICszOSwxMiBAQAogCiAjaW5jbHVkZSA8a3ZtL2FybV92Z2ljLmg+CiAKKworI2lmZGVmIENPTkZJR19BUk1fR0lDX1YzCisjZGVmaW5lIEtWTV9NQVhfVkNQVVMgVkdJQ19WM19NQVhfQ1BVUworI2Vsc2UKICNkZWZpbmUgS1ZNX01BWF9WQ1BVUyBWR0lDX1YyX01BWF9DUFVTCisjZW5kaWYKIAogI2RlZmluZSBLVk1fUkVRX1ZDUFVfRVhJVAk4CiAKQEAgLTE4MywxNSArMTg4LDE1IEBACiB9OwogCiBzdHJ1Y3Qga3ZtX3ZtX3N0YXQgewotCXUzMiByZW1vdGVfdGxiX2ZsdXNoOworCXVsb25nIHJlbW90ZV90bGJfZmx1c2g7CiB9OwogCiBzdHJ1Y3Qga3ZtX3ZjcHVfc3RhdCB7Ci0JdTMyIGhhbHRfc3VjY2Vzc2Z1bF9wb2xsOwotCXUzMiBoYWx0X2F0dGVtcHRlZF9wb2xsOwotCXUzMiBoYWx0X3BvbGxfaW52YWxpZDsKLQl1MzIgaGFsdF93YWtldXA7Ci0JdTMyIGh2Y19leGl0X3N0YXQ7CisJdTY0IGhhbHRfc3VjY2Vzc2Z1bF9wb2xsOworCXU2NCBoYWx0X2F0dGVtcHRlZF9wb2xsOworCXU2NCBoYWx0X3BvbGxfaW52YWxpZDsKKwl1NjQgaGFsdF93YWtldXA7CisJdTY0IGh2Y19leGl0X3N0YXQ7CiAJdTY0IHdmZV9leGl0X3N0YXQ7CiAJdTY0IHdmaV9leGl0X3N0YXQ7CiAJdTY0IG1taW9fZXhpdF91c2VyOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20va3ZtX2h5cC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20va3ZtX2h5cC5oCmluZGV4IDZlYWZmMjguLjM0MzEzNWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2t2bV9oeXAuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1faHlwLmgKQEAgLTIwLDI4ICsyMCwxNSBAQAogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgorI2luY2x1ZGUgPGFzbS9jcDE1Lmg+CiAjaW5jbHVkZSA8YXNtL2t2bV9tbXUuaD4KICNpbmNsdWRlIDxhc20vdmZwLmg+CiAKICNkZWZpbmUgX19oeXBfdGV4dCBfX3NlY3Rpb24oLmh5cC50ZXh0KSBub3RyYWNlCiAKLSNkZWZpbmUgX19BQ0NFU1NfQ1AxNShDUm4sIE9wMSwgQ1JtLCBPcDIpCVwKLQkibXJjIiwgIm1jciIsIF9fc3RyaW5naWZ5KHAxNSwgT3AxLCAlMCwgQ1JuLCBDUm0sIE9wMiksIHUzMgotI2RlZmluZSBfX0FDQ0VTU19DUDE1XzY0KE9wMSwgQ1JtKQkJXAotCSJtcnJjIiwgIm1jcnIiLCBfX3N0cmluZ2lmeShwMTUsIE9wMSwgJVEwLCAlUjAsIENSbSksIHU2NAogI2RlZmluZSBfX0FDQ0VTU19WRlAoQ1JuKQkJCVwKIAkibXJjIiwgIm1jciIsIF9fc3RyaW5naWZ5KHAxMCwgNywgJTAsIENSbiwgY3IwLCAwKSwgdTMyCiAKLSNkZWZpbmUgX193cml0ZV9zeXNyZWcodiwgciwgdywgYywgdCkJYXNtIHZvbGF0aWxlKHcgIiAiIGMgOiA6ICJyIiAoKHQpKHYpKSkKLSNkZWZpbmUgd3JpdGVfc3lzcmVnKHYsIC4uLikJCV9fd3JpdGVfc3lzcmVnKHYsIF9fVkFfQVJHU19fKQotCi0jZGVmaW5lIF9fcmVhZF9zeXNyZWcociwgdywgYywgdCkgKHsJCQkJXAotCXQgX192YWw7CQkJCQkJXAotCWFzbSB2b2xhdGlsZShyICIgIiBjIDogIj1yIiAoX192YWwpKTsJCQlcCi0JX192YWw7CQkJCQkJCVwKLX0pCi0jZGVmaW5lIHJlYWRfc3lzcmVnKC4uLikJCV9fcmVhZF9zeXNyZWcoX19WQV9BUkdTX18pCi0KICNkZWZpbmUgd3JpdGVfc3BlY2lhbCh2LCByKQkJCQkJXAogCWFzbSB2b2xhdGlsZSgibXNyICIgX19zdHJpbmdpZnkocikgIiwgJTAiIDogOiAiciIgKHYpKQogI2RlZmluZSByZWFkX3NwZWNpYWwocikgKHsJCQkJCVwKQEAgLTExOSw2ICsxMDYsOSBAQAogdm9pZCBfX3N5c3JlZ19zYXZlX3N0YXRlKHN0cnVjdCBrdm1fY3B1X2NvbnRleHQgKmN0eHQpOwogdm9pZCBfX3N5c3JlZ19yZXN0b3JlX3N0YXRlKHN0cnVjdCBrdm1fY3B1X2NvbnRleHQgKmN0eHQpOwogCit2b2lkIF9fdmdpY192M19zYXZlX3N0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7Cit2b2lkIF9fdmdpY192M19yZXN0b3JlX3N0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CisKIHZvaWQgYXNtbGlua2FnZSBfX3ZmcF9zYXZlX3N0YXRlKHN0cnVjdCB2ZnBfaGFyZF9zdHJ1Y3QgKnZmcCk7CiB2b2lkIGFzbWxpbmthZ2UgX192ZnBfcmVzdG9yZV9zdGF0ZShzdHJ1Y3QgdmZwX2hhcmRfc3RydWN0ICp2ZnApOwogc3RhdGljIGlubGluZSBib29sIF9fdmZwX2VuYWJsZWQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2t2bV9tbXUuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2t2bV9tbXUuaAppbmRleCAzYmI4MDNkLi43NGE0NDcyNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20va3ZtX21tdS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2t2bV9tbXUuaApAQCAtNjMsMzcgKzYzLDEzIEBACiBzdGF0aWMgaW5saW5lIHZvaWQga3ZtX3NldF9wbWQocG1kX3QgKnBtZCwgcG1kX3QgbmV3X3BtZCkKIHsKIAkqcG1kID0gbmV3X3BtZDsKLQlmbHVzaF9wbWRfZW50cnkocG1kKTsKKwlkc2IoaXNoc3QpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQga3ZtX3NldF9wdGUocHRlX3QgKnB0ZSwgcHRlX3QgbmV3X3B0ZSkKIHsKIAkqcHRlID0gbmV3X3B0ZTsKLQkvKgotCSAqIGZsdXNoX3BtZF9lbnRyeSBqdXN0IHRha2VzIGEgdm9pZCBwb2ludGVyIGFuZCBjbGVhbnMgdGhlIG5lY2Vzc2FyeQotCSAqIGNhY2hlIGVudHJpZXMsIHNvIHdlIGNhbiByZXVzZSB0aGUgZnVuY3Rpb24gZm9yIHB0ZXMuCi0JICovCi0JZmx1c2hfcG1kX2VudHJ5KHB0ZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBrdm1fY2xlYW5fcGdkKHBnZF90ICpwZ2QpCi17Ci0JY2xlYW5fZGNhY2hlX2FyZWEocGdkLCBQVFJTX1BFUl9TMl9QR0QgKiBzaXplb2YocGdkX3QpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGt2bV9jbGVhbl9wbWQocG1kX3QgKnBtZCkKLXsKLQljbGVhbl9kY2FjaGVfYXJlYShwbWQsIFBUUlNfUEVSX1BNRCAqIHNpemVvZihwbWRfdCkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQga3ZtX2NsZWFuX3BtZF9lbnRyeShwbWRfdCAqcG1kKQotewotCWNsZWFuX3BtZF9lbnRyeShwbWQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQga3ZtX2NsZWFuX3B0ZShwdGVfdCAqcHRlKQotewotCWNsZWFuX3B0ZV90YWJsZShwdGUpOworCWRzYihpc2hzdCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgcHRlX3Qga3ZtX3MycHRlX21rd3JpdGUocHRlX3QgcHRlKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWVtb3J5LmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tZW1vcnkuaAppbmRleCAzMWMwN2EyLi43NmNiZDljIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tZW1vcnkuaApAQCAtMTU5LDEzICsxNTksOCBAQAogICogUEZOcyBhcmUgdXNlZCB0byBkZXNjcmliZSBhbnkgcGh5c2ljYWwgcGFnZTsgdGhpcyBtZWFucwogICogUEZOIDAgPT0gcGh5c2ljYWwgYWRkcmVzcyAwLgogICovCi0jaWYgZGVmaW5lZChfX3ZpcnRfdG9fcGh5cykKLSNkZWZpbmUgUEhZU19PRkZTRVQJUExBVF9QSFlTX09GRlNFVAotI2RlZmluZSBQSFlTX1BGTl9PRkZTRVQJKCh1bnNpZ25lZCBsb25nKShQSFlTX09GRlNFVCA+PiBQQUdFX1NISUZUKSkKIAotI2RlZmluZSB2aXJ0X3RvX3BmbihrYWRkcikgKF9fcGEoa2FkZHIpID4+IFBBR0VfU0hJRlQpCi0KLSNlbGlmIGRlZmluZWQoQ09ORklHX0FSTV9QQVRDSF9QSFlTX1ZJUlQpCisjaWYgZGVmaW5lZChDT05GSUdfQVJNX1BBVENIX1BIWVNfVklSVCkKIAogLyoKICAqIENvbnN0YW50cyB1c2VkIHRvIGZvcmNlIHRoZSByaWdodCBpbnN0cnVjdGlvbiBlbmNvZGluZ3MgYW5kIHNoaWZ0cwpAQCAtMTgyLDEwICsxNzcsNiBAQAogI2RlZmluZSBQSFlTX09GRlNFVAkoKHBoeXNfYWRkcl90KV9fcHZfcGh5c19wZm5fb2Zmc2V0IDw8IFBBR0VfU0hJRlQpCiAjZGVmaW5lIFBIWVNfUEZOX09GRlNFVAkoX19wdl9waHlzX3Bmbl9vZmZzZXQpCiAKLSNkZWZpbmUgdmlydF90b19wZm4oa2FkZHIpIFwKLQkoKCgodW5zaWduZWQgbG9uZykoa2FkZHIpIC0gUEFHRV9PRkZTRVQpID4+IFBBR0VfU0hJRlQpICsgXAotCSBQSFlTX1BGTl9PRkZTRVQpCi0KICNkZWZpbmUgX19wdl9zdHViKGZyb20sdG8saW5zdHIsdHlwZSkJCQlcCiAJX19hc21fXygiQCBfX3B2X3N0dWJcbiIJCQkJXAogCSIxOgkiIGluc3RyICIJJTAsICUxLCAlMlxuIgkJXApAQCAtMjU3LDEyICsyNDgsMTIgQEAKIAlyZXR1cm4geCAtIFBIWVNfT0ZGU0VUICsgUEFHRV9PRkZTRVQ7CiB9CiAKKyNlbmRpZgorCiAjZGVmaW5lIHZpcnRfdG9fcGZuKGthZGRyKSBcCiAJKCgoKHVuc2lnbmVkIGxvbmcpKGthZGRyKSAtIFBBR0VfT0ZGU0VUKSA+PiBQQUdFX1NISUZUKSArIFwKIAkgUEhZU19QRk5fT0ZGU0VUKQogCi0jZW5kaWYKLQogLyoKICAqIFRoZXNlIGFyZSAqb25seSogdmFsaWQgb24gdGhlIGtlcm5lbCBkaXJlY3QgbWFwcGVkIFJBTSBtZW1vcnkuCiAgKiBOb3RlOiBEcml2ZXJzIHNob3VsZCBOT1QgdXNlIHRoZXNlLiAgVGhleSBhcmUgdGhlIHdyb25nCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tb2R1bGUuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21vZHVsZS5oCmluZGV4IGUzNThiNzkuLjQ2NDc0OGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21vZHVsZS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21vZHVsZS5oCkBAIC0yMywxMCArMjMsOCBAQAogCXN0cnVjdCB1bndpbmRfdGFibGUgKnVud2luZFtBUk1fU0VDX01BWF07CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQVJNX01PRFVMRV9QTFRTCi0Jc3RydWN0IGVsZjMyX3NoZHIgICAqY29yZV9wbHQ7Ci0Jc3RydWN0IGVsZjMyX3NoZHIgICAqaW5pdF9wbHQ7Ci0JaW50CQkgICAgY29yZV9wbHRfY291bnQ7Ci0JaW50CQkgICAgaW5pdF9wbHRfY291bnQ7CisJc3RydWN0IGVsZjMyX3NoZHIgICAqcGx0OworCWludAkJICAgIHBsdF9jb3VudDsKICNlbmRpZgogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vcGd0YWJsZS0ybGV2ZWwtaHdkZWYuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BndGFibGUtMmxldmVsLWh3ZGVmLmgKaW5kZXggZDAxMzFlZS4uM2Y4MmU5ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vcGd0YWJsZS0ybGV2ZWwtaHdkZWYuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9wZ3RhYmxlLTJsZXZlbC1od2RlZi5oCkBAIC00Nyw2ICs0Nyw3IEBACiAjZGVmaW5lIFBNRF9TRUNUX1dCCQkoUE1EX1NFQ1RfQ0FDSEVBQkxFIHwgUE1EX1NFQ1RfQlVGRkVSQUJMRSkKICNkZWZpbmUgUE1EX1NFQ1RfTUlOSUNBQ0hFCShQTURfU0VDVF9URVgoMSkgfCBQTURfU0VDVF9DQUNIRUFCTEUpCiAjZGVmaW5lIFBNRF9TRUNUX1dCV0EJCShQTURfU0VDVF9URVgoMSkgfCBQTURfU0VDVF9DQUNIRUFCTEUgfCBQTURfU0VDVF9CVUZGRVJBQkxFKQorI2RlZmluZSBQTURfU0VDVF9DQUNIRV9NQVNLCShQTURfU0VDVF9URVgoMSkgfCBQTURfU0VDVF9DQUNIRUFCTEUgfCBQTURfU0VDVF9CVUZGRVJBQkxFKQogI2RlZmluZSBQTURfU0VDVF9OT05TSEFSRURfREVWCShQTURfU0VDVF9URVgoMikpCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wZ3RhYmxlLTNsZXZlbC1od2RlZi5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vcGd0YWJsZS0zbGV2ZWwtaHdkZWYuaAppbmRleCBmOGYxY2ZmLi40Y2Q2NjRhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wZ3RhYmxlLTNsZXZlbC1od2RlZi5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BndGFibGUtM2xldmVsLWh3ZGVmLmgKQEAgLTYyLDYgKzYyLDcgQEAKICNkZWZpbmUgUE1EX1NFQ1RfV1QJCShfQVQocG1kdmFsX3QsIDIpIDw8IDIpCS8qIG5vcm1hbCBpbm5lciB3cml0ZS10aHJvdWdoICovCiAjZGVmaW5lIFBNRF9TRUNUX1dCCQkoX0FUKHBtZHZhbF90LCAzKSA8PCAyKQkvKiBub3JtYWwgaW5uZXIgd3JpdGUtYmFjayAqLwogI2RlZmluZSBQTURfU0VDVF9XQldBCQkoX0FUKHBtZHZhbF90LCA3KSA8PCAyKQkvKiBub3JtYWwgaW5uZXIgd3JpdGUtYWxsb2MgKi8KKyNkZWZpbmUgUE1EX1NFQ1RfQ0FDSEVfTUFTSwkoX0FUKHBtZHZhbF90LCA3KSA8PCAyKQogCiAvKgogICogKyBMZXZlbCAzIGRlc2NyaXB0b3IgKFBURSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3Y3bS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vdjdtLmgKaW5kZXggNjE1NzgxYy4uMWZkNzc1YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vdjdtLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vdjdtLmgKQEAgLTI0LDYgKzI0LDkgQEAKIAogI2RlZmluZSBWN01fU0NCX0NDUgkJCTB4MTQKICNkZWZpbmUgVjdNX1NDQl9DQ1JfU1RLQUxJR04JCQkoMSA8PCA5KQorI2RlZmluZSBWN01fU0NCX0NDUl9EQwkJCQkoMSA8PCAxNikKKyNkZWZpbmUgVjdNX1NDQl9DQ1JfSUMJCQkJKDEgPDwgMTcpCisjZGVmaW5lIFY3TV9TQ0JfQ0NSX0JQCQkJCSgxIDw8IDE4KQogCiAjZGVmaW5lIFY3TV9TQ0JfU0hQUjIJCQkweDFjCiAjZGVmaW5lIFY3TV9TQ0JfU0hQUjMJCQkweDIwCkBAIC00Nyw2ICs1MCwyNSBAQAogI2RlZmluZSBFWENfUkVUX1NUQUNLX01BU0sJCQkweDAwMDAwMDA0CiAjZGVmaW5lIEVYQ19SRVRfVEhSRUFETU9ERV9QUk9DRVNTU1RBQ0sJCTB4ZmZmZmZmZmQKIAorLyogQ2FjaGUgcmVsYXRlZCBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lCVY3TV9TQ0JfQ0xJRFIJCTB4NzgJLyogQ2FjaGUgTGV2ZWwgSUQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJVjdNX1NDQl9DVFIJCTB4N2MJLyogQ2FjaGUgVHlwZSByZWdpc3RlciAqLworI2RlZmluZQlWN01fU0NCX0NDU0lEUgkJMHg4MAkvKiBDYWNoZSBzaXplIElEIHJlZ2lzdGVyICovCisjZGVmaW5lCVY3TV9TQ0JfQ1NTRUxSCQkweDg0CS8qIENhY2hlIHNpemUgc2VsZWN0aW9uIHJlZ2lzdGVyICovCisKKy8qIENhY2hlIG9wZWFydGlvbnMgKi8KKyNkZWZpbmUJVjdNX1NDQl9JQ0lBTExVCQkweDI1MAkvKiBJLWNhY2hlIGludmFsaWRhdGUgYWxsIHRvIFBvVSAqLworI2RlZmluZQlWN01fU0NCX0lDSU1WQVUJCTB4MjU4CS8qIEktY2FjaGUgaW52YWxpZGF0ZSBieSBNVkEgdG8gUG9VICovCisjZGVmaW5lCVY3TV9TQ0JfRENJTVZBQwkJMHgyNWMJLyogRC1jYWNoZSBpbnZhbGlkYXRlIGJ5IE1WQSB0byBQb0MgKi8KKyNkZWZpbmUJVjdNX1NDQl9EQ0lTVwkJMHgyNjAJLyogRC1jYWNoZSBpbnZhbGlkYXRlIGJ5IHNldC13YXkgKi8KKyNkZWZpbmUJVjdNX1NDQl9EQ0NNVkFVCQkweDI2NAkvKiBELWNhY2hlIGNsZWFuIGJ5IE1WQSB0byBQb1UgKi8KKyNkZWZpbmUJVjdNX1NDQl9EQ0NNVkFDCQkweDI2OAkvKiBELWNhY2hlIGNsZWFuIGJ5IE1WQSB0byBQb0MgKi8KKyNkZWZpbmUJVjdNX1NDQl9EQ0NTVwkJMHgyNmMJLyogRC1jYWNoZSBjbGVhbiBieSBzZXQtd2F5ICovCisjZGVmaW5lCVY3TV9TQ0JfRENDSU1WQUMJMHgyNzAJLyogRC1jYWNoZSBjbGVhbiBhbmQgaW52YWxpZGF0ZSBieSBNVkEgdG8gUG9DICovCisjZGVmaW5lCVY3TV9TQ0JfRENDSVNXCQkweDI3NAkvKiBELWNhY2hlIGNsZWFuIGFuZCBpbnZhbGlkYXRlIGJ5IHNldC13YXkgKi8KKyNkZWZpbmUJVjdNX1NDQl9CUElBTEwJCTB4Mjc4CS8qIEQtY2FjaGUgY2xlYW4gYW5kIGludmFsaWRhdGUgYnkgc2V0LXdheSAqLworCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCiBlbnVtIHJlYm9vdF9tb2RlOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS91YXBpL2FzbS9rdm0uaCBiL2FyY2gvYXJtL2luY2x1ZGUvdWFwaS9hc20va3ZtLmgKaW5kZXggYTJiM2ViMy4uYjM4YzEwYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS91YXBpL2FzbS9rdm0uaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL3VhcGkvYXNtL2t2bS5oCkBAIC04NCw2ICs4NCwxMyBAQAogI2RlZmluZSBLVk1fVkdJQ19WMl9ESVNUX1NJWkUJCTB4MTAwMAogI2RlZmluZSBLVk1fVkdJQ19WMl9DUFVfU0laRQkJMHgyMDAwCiAKKy8qIFN1cHBvcnRlZCBWR0lDdjMgYWRkcmVzcyB0eXBlcyAgKi8KKyNkZWZpbmUgS1ZNX1ZHSUNfVjNfQUREUl9UWVBFX0RJU1QJMgorI2RlZmluZSBLVk1fVkdJQ19WM19BRERSX1RZUEVfUkVESVNUCTMKKworI2RlZmluZSBLVk1fVkdJQ19WM19ESVNUX1NJWkUJCVNaXzY0SworI2RlZmluZSBLVk1fVkdJQ19WM19SRURJU1RfU0laRQkJKDIgKiBTWl82NEspCisKICNkZWZpbmUgS1ZNX0FSTV9WQ1BVX1BPV0VSX09GRgkJMCAvKiBDUFUgaXMgc3RhcnRlZCBpbiBPRkYgc3RhdGUgKi8KICNkZWZpbmUgS1ZNX0FSTV9WQ1BVX1BTQ0lfMF8yCQkxIC8qIENQVSB1c2VzIFBTQ0kgdjAuMiAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvY3B1aWRsZS5jIGIvYXJjaC9hcm0va2VybmVsL2NwdWlkbGUuYwppbmRleCA3ZGNjYzk2Li5hMzMwOGFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvY3B1aWRsZS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9jcHVpZGxlLmMKQEAgLTE5LDcgKzE5LDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfY3B1aWRsZV9tZXRob2QgX19jcHVpZGxlX21ldGhvZF9vZl90YWJsZV9zZW50aW5lbAogCV9fdXNlZCBfX3NlY3Rpb24oX19jcHVpZGxlX21ldGhvZF9vZl90YWJsZV9lbmQpOwogCi1zdGF0aWMgc3RydWN0IGNwdWlkbGVfb3BzIGNwdWlkbGVfb3BzW05SX0NQVVNdOworc3RhdGljIHN0cnVjdCBjcHVpZGxlX29wcyBjcHVpZGxlX29wc1tOUl9DUFVTXSBfX3JvX2FmdGVyX2luaXQ7CiAKIC8qKgogICogYXJtX2NwdWlkbGVfc2ltcGxlX2VudGVyKCkgLSBhIHdyYXBwZXIgdG8gY3B1X2RvX2lkbGUoKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2RldnRyZWUuYyBiL2FyY2gvYXJtL2tlcm5lbC9kZXZ0cmVlLmMKaW5kZXggNDBlY2Q1Zi4uZjY3NmZlYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2RldnRyZWUuYworKysgYi9hcmNoL2FybS9rZXJuZWwvZGV2dHJlZS5jCkBAIC04OCw2ICs4OCw4IEBACiAJCXJldHVybjsKIAogCWZvcl9lYWNoX2NoaWxkX29mX25vZGUoY3B1cywgY3B1KSB7CisJCWNvbnN0IF9fYmUzMiAqY2VsbDsKKwkJaW50IHByb3BfYnl0ZXM7CiAJCXUzMiBod2lkOwogCiAJCWlmIChvZl9ub2RlX2NtcChjcHUtPnR5cGUsICJjcHUiKSkKQEAgLTk5LDcgKzEwMSw4IEBACiAJCSAqIHByb3BlcnRpZXMgaXMgY29uc2lkZXJlZCBpbnZhbGlkIHRvIGJ1aWxkIHRoZQogCQkgKiBjcHVfbG9naWNhbF9tYXAuCiAJCSAqLwotCQlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIoY3B1LCAicmVnIiwgJmh3aWQpKSB7CisJCWNlbGwgPSBvZl9nZXRfcHJvcGVydHkoY3B1LCAicmVnIiwgJnByb3BfYnl0ZXMpOworCQlpZiAoIWNlbGwgfHwgcHJvcF9ieXRlcyA8IHNpemVvZigqY2VsbCkpIHsKIAkJCXByX2RlYnVnKCIgKiAlcyBtaXNzaW5nIHJlZyBwcm9wZXJ0eVxuIiwKIAkJCQkgICAgIGNwdS0+ZnVsbF9uYW1lKTsKIAkJCW9mX25vZGVfcHV0KGNwdSk7CkBAIC0xMDcsMTAgKzExMCwxNSBAQAogCQl9CiAKIAkJLyoKLQkJICogOCBNU0JzIG11c3QgYmUgc2V0IHRvIDAgaW4gdGhlIERUIHNpbmNlIHRoZSByZWcgcHJvcGVydHkKKwkJICogQml0cyBuOjI0IG11c3QgYmUgc2V0IHRvIDAgaW4gdGhlIERUIHNpbmNlIHRoZSByZWcgcHJvcGVydHkKIAkJICogZGVmaW5lcyB0aGUgTVBJRFJbMjM6MF0uCiAJCSAqLwotCQlpZiAoaHdpZCAmIH5NUElEUl9IV0lEX0JJVE1BU0spIHsKKwkJZG8geworCQkJaHdpZCA9IGJlMzJfdG9fY3B1KCpjZWxsKyspOworCQkJcHJvcF9ieXRlcyAtPSBzaXplb2YoKmNlbGwpOworCQl9IHdoaWxlICghaHdpZCAmJiBwcm9wX2J5dGVzID4gMCk7CisKKwkJaWYgKHByb3BfYnl0ZXMgfHwgKGh3aWQgJiB+TVBJRFJfSFdJRF9CSVRNQVNLKSkgewogCQkJb2Zfbm9kZV9wdXQoY3B1KTsKIAkJCXJldHVybjsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2VudHJ5LWFybXYuUyBiL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1hcm12LlMKaW5kZXggYmM1ZjUwNy4uOWYxNTdlNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2VudHJ5LWFybXYuUworKysgYi9hcmNoL2FybS9rZXJuZWwvZW50cnktYXJtdi5TCkBAIC0yOTUsNiArMjk1LDcgQEAKIAlibAlfX3VuZF9mYXVsdAogCiBfX3VuZF9zdmNfZmluaXNoOgorCWdldF90aHJlYWRfaW5mbyB0c2sKIAlsZHIJcjUsIFtzcCwgI1NfUFNSXQkJQCBHZXQgU1ZDIGNwc3IKIAlzdmNfZXhpdCByNQkJCQlAIHJldHVybiBmcm9tIGV4Y2VwdGlvbgogIFVOV0lORCguZm5lbmQJCSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9mdHJhY2UuYyBiL2FyY2gvYXJtL2tlcm5lbC9mdHJhY2UuYwppbmRleCA3MDllZTFkLi4zZjE3NTk0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvZnRyYWNlLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2Z0cmFjZS5jCkBAIC0yMTgsNyArMjE4LDcgQEAKIAl9CiAKIAllcnIgPSBmdHJhY2VfcHVzaF9yZXR1cm5fdHJhY2Uob2xkLCBzZWxmX2FkZHIsICZ0cmFjZS5kZXB0aCwKLQkJCQkgICAgICAgZnJhbWVfcG9pbnRlcik7CisJCQkJICAgICAgIGZyYW1lX3BvaW50ZXIsIE5VTEwpOwogCWlmIChlcnIgPT0gLUVCVVNZKSB7CiAJCSpwYXJlbnQgPSBvbGQ7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9oZWFkLW5vbW11LlMgYi9hcmNoL2FybS9rZXJuZWwvaGVhZC1ub21tdS5TCmluZGV4IGZiMWE2OWUuLjZiNGViMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9oZWFkLW5vbW11LlMKKysrIGIvYXJjaC9hcm0va2VybmVsL2hlYWQtbm9tbXUuUwpAQCAtMTU4LDcgKzE1OCwyMSBAQAogCWJpYwlyMCwgcjAsICNDUl9WCiAjZW5kaWYKIAltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCQlAIHdyaXRlIGNvbnRyb2wgcmVnCi0jZW5kaWYgLyogQ09ORklHX0NQVV9DUDE1ICovCisjZWxpZiBkZWZpbmVkIChDT05GSUdfQ1BVX1Y3TSkKKwkvKiBGb3IgVjdNIHN5c3RlbXMgd2Ugd2FudCB0byBtb2RpZnkgdGhlIENDUiBzaW1pbGFybHkgdG8gdGhlIFNDVExSICovCisjaWZkZWYgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRQorCWJpYwlyMCwgcjAsICNWN01fU0NCX0NDUl9EQworI2VuZGlmCisjaWZkZWYgQ09ORklHX0NQVV9CUFJFRElDVF9ESVNBQkxFCisJYmljCXIwLCByMCwgI1Y3TV9TQ0JfQ0NSX0JQCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ1BVX0lDQUNIRV9ESVNBQkxFCisJYmljCXIwLCByMCwgI1Y3TV9TQ0JfQ0NSX0lDCisjZW5kaWYKKwltb3Z3CXIzLCAjOmxvd2VyMTY6KEJBU0VBRERSX1Y3TV9TQ0IgKyBWN01fU0NCX0NDUikKKwltb3Z0CXIzLCAjOnVwcGVyMTY6KEJBU0VBRERSX1Y3TV9TQ0IgKyBWN01fU0NCX0NDUikKKwlzdHIJcjAsIFtyM10KKyNlbmRpZiAvKiBDT05GSUdfQ1BVX0NQMTUgZWxpZiBDT05GSUdfQ1BVX1Y3TSAqLwogCXJldAlscgogRU5EUFJPQyhfX2FmdGVyX3Byb2NfaW5pdCkKIAkubHRvcmcKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9oeXAtc3R1Yi5TIGIvYXJjaC9hcm0va2VybmVsL2h5cC1zdHViLlMKaW5kZXggMGIxZTRhOS4uMTVkMDczYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2h5cC1zdHViLlMKKysrIGIvYXJjaC9hcm0va2VybmVsL2h5cC1zdHViLlMKQEAgLTE0Miw2ICsxNDIsMTkgQEAKIAlhbmQJcjcsICMweDFmCQlAIFByZXNlcnZlIEhQTU4KIAltY3IJcDE1LCA0LCByNywgYzEsIGMxLCAxCUAgSERDUgogCisJQCBNYWtlIHN1cmUgTlMtU1ZDIGlzIGluaXRpYWxpc2VkIGFwcHJvcHJpYXRlbHkKKwltcmMJcDE1LCAwLCByNywgYzEsIGMwLCAwCUAgU0NUTFIKKwlvcnIJcjcsICMoMSA8PCA1KQkJQCBDUDE1IGJhcnJpZXJzIGVuYWJsZWQKKwliaWMJcjcsICMoMyA8PCA3KQkJQCBDbGVhciBTRUQvSVREIGZvciB2OCAoUkVTMCBmb3IgdjcpCisJYmljCXI3LCAjKDMgPDwgMTkpCQlAIFdYTiBhbmQgVVdYTiBkaXNhYmxlZAorCW1jcglwMTUsIDAsIHI3LCBjMSwgYzAsIDAJQCBTQ1RMUgorCisJbXJjCXAxNSwgMCwgcjcsIGMwLCBjMCwgMAlAIE1JRFIKKwltY3IJcDE1LCA0LCByNywgYzAsIGMwLCAwCUAgVlBJRFIKKworCW1yYwlwMTUsIDAsIHI3LCBjMCwgYzAsIDUJQCBNUElEUgorCW1jcglwMTUsIDQsIHI3LCBjMCwgYzAsIDUJQCBWTVBJRFIKKwogI2lmICFkZWZpbmVkKFpJTUFHRSkgJiYgZGVmaW5lZChDT05GSUdfQVJNX0FSQ0hfVElNRVIpCiAJQCBtYWtlIENOVFBfKiBhbmQgQ05UUENUIGFjY2Vzc2libGUgZnJvbSBQTDEKIAltcmMJcDE1LCAwLCByNywgYzAsIGMxLCAxCUAgSURfUEZSMQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL21vZHVsZS1wbHRzLmMgYi9hcmNoL2FybS9rZXJuZWwvbW9kdWxlLXBsdHMuYwppbmRleCAwYzdlZmMzLi4zYTVjYmE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvbW9kdWxlLXBsdHMuYworKysgYi9hcmNoL2FybS9rZXJuZWwvbW9kdWxlLXBsdHMuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lbGYuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KICNpbmNsdWRlIDxhc20vb3Bjb2Rlcy5oPgpAQCAtMzAsMTU0ICszMSwxOTggQEAKIAl1MzIJbGl0W1BMVF9FTlRfQ09VTlRdOwogfTsKIAotc3RhdGljIGJvb2wgaW5faW5pdChjb25zdCBzdHJ1Y3QgbW9kdWxlICptb2QsIHUzMiBhZGRyKQotewotCXJldHVybiBhZGRyIC0gKHUzMiltb2QtPmluaXRfbGF5b3V0LmJhc2UgPCBtb2QtPmluaXRfbGF5b3V0LnNpemU7Ci19Ci0KIHUzMiBnZXRfbW9kdWxlX3BsdChzdHJ1Y3QgbW9kdWxlICptb2QsIHVuc2lnbmVkIGxvbmcgbG9jLCBFbGYzMl9BZGRyIHZhbCkKIHsKLQlzdHJ1Y3QgcGx0X2VudHJpZXMgKnBsdCwgKnBsdF9lbmQ7Ci0JaW50IGMsICpjb3VudDsKKwlzdHJ1Y3QgcGx0X2VudHJpZXMgKnBsdCA9IChzdHJ1Y3QgcGx0X2VudHJpZXMgKiltb2QtPmFyY2gucGx0LT5zaF9hZGRyOworCWludCBpZHggPSAwOwogCi0JaWYgKGluX2luaXQobW9kLCBsb2MpKSB7Ci0JCXBsdCA9ICh2b2lkICopbW9kLT5hcmNoLmluaXRfcGx0LT5zaF9hZGRyOwotCQlwbHRfZW5kID0gKHZvaWQgKilwbHQgKyBtb2QtPmFyY2guaW5pdF9wbHQtPnNoX3NpemU7Ci0JCWNvdW50ID0gJm1vZC0+YXJjaC5pbml0X3BsdF9jb3VudDsKLQl9IGVsc2UgewotCQlwbHQgPSAodm9pZCAqKW1vZC0+YXJjaC5jb3JlX3BsdC0+c2hfYWRkcjsKLQkJcGx0X2VuZCA9ICh2b2lkICopcGx0ICsgbW9kLT5hcmNoLmNvcmVfcGx0LT5zaF9zaXplOwotCQljb3VudCA9ICZtb2QtPmFyY2guY29yZV9wbHRfY291bnQ7CisJLyoKKwkgKiBMb29rIGZvciBhbiBleGlzdGluZyBlbnRyeSBwb2ludGluZyB0byAndmFsJy4gR2l2ZW4gdGhhdCB0aGUKKwkgKiByZWxvY2F0aW9ucyBhcmUgc29ydGVkLCB0aGlzIHdpbGwgYmUgdGhlIGxhc3QgZW50cnkgd2UgYWxsb2NhdGVkLgorCSAqIChpZiBvbmUgZXhpc3RzKS4KKwkgKi8KKwlpZiAobW9kLT5hcmNoLnBsdF9jb3VudCA+IDApIHsKKwkJcGx0ICs9IChtb2QtPmFyY2gucGx0X2NvdW50IC0gMSkgLyBQTFRfRU5UX0NPVU5UOworCQlpZHggPSAobW9kLT5hcmNoLnBsdF9jb3VudCAtIDEpICUgUExUX0VOVF9DT1VOVDsKKworCQlpZiAocGx0LT5saXRbaWR4XSA9PSB2YWwpCisJCQlyZXR1cm4gKHUzMikmcGx0LT5sZHJbaWR4XTsKKworCQlpZHggPSAoaWR4ICsgMSkgJSBQTFRfRU5UX0NPVU5UOworCQlpZiAoIWlkeCkKKwkJCXBsdCsrOwogCX0KIAotCS8qIExvb2sgZm9yIGFuIGV4aXN0aW5nIGVudHJ5IHBvaW50aW5nIHRvICd2YWwnICovCi0JZm9yIChjID0gKmNvdW50OyBwbHQgPCBwbHRfZW5kOyBjIC09IFBMVF9FTlRfQ09VTlQsIHBsdCsrKSB7Ci0JCWludCBpOworCW1vZC0+YXJjaC5wbHRfY291bnQrKzsKKwlCVUdfT04obW9kLT5hcmNoLnBsdF9jb3VudCAqIFBMVF9FTlRfU0laRSA+IG1vZC0+YXJjaC5wbHQtPnNoX3NpemUpOwogCi0JCWlmICghYykgewotCQkJLyogUG9wdWxhdGUgYSBuZXcgc2V0IG9mIGVudHJpZXMgKi8KLQkJCSpwbHQgPSAoc3RydWN0IHBsdF9lbnRyaWVzKXsKLQkJCQl7IFswIC4uLiBQTFRfRU5UX0NPVU5UIC0gMV0gPSBQTFRfRU5UX0xEUiwgfSwKLQkJCQl7IHZhbCwgfQotCQkJfTsKLQkJCSsrKmNvdW50OwotCQkJcmV0dXJuICh1MzIpcGx0LT5sZHI7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IFBMVF9FTlRfQ09VTlQ7IGkrKykgewotCQkJaWYgKCFwbHQtPmxpdFtpXSkgewotCQkJCXBsdC0+bGl0W2ldID0gdmFsOwotCQkJCSsrKmNvdW50OwotCQkJfQotCQkJaWYgKHBsdC0+bGl0W2ldID09IHZhbCkKLQkJCQlyZXR1cm4gKHUzMikmcGx0LT5sZHJbaV07Ci0JCX0KKwlpZiAoIWlkeCkKKwkJLyogUG9wdWxhdGUgYSBuZXcgc2V0IG9mIGVudHJpZXMgKi8KKwkJKnBsdCA9IChzdHJ1Y3QgcGx0X2VudHJpZXMpeworCQkJeyBbMCAuLi4gUExUX0VOVF9DT1VOVCAtIDFdID0gUExUX0VOVF9MRFIsIH0sCisJCQl7IHZhbCwgfQorCQl9OworCWVsc2UKKwkJcGx0LT5saXRbaWR4XSA9IHZhbDsKKworCXJldHVybiAodTMyKSZwbHQtPmxkcltpZHhdOworfQorCisjZGVmaW5lIGNtcF8zd2F5KGEsYikJKChhKSA8IChiKSA/IC0xIDogKGEpID4gKGIpKQorCitzdGF0aWMgaW50IGNtcF9yZWwoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKwljb25zdCBFbGYzMl9SZWwgKnggPSBhLCAqeSA9IGI7CisJaW50IGk7CisKKwkvKiBzb3J0IGJ5IHR5cGUgYW5kIHN5bWJvbCBpbmRleCAqLworCWkgPSBjbXBfM3dheShFTEYzMl9SX1RZUEUoeC0+cl9pbmZvKSwgRUxGMzJfUl9UWVBFKHktPnJfaW5mbykpOworCWlmIChpID09IDApCisJCWkgPSBjbXBfM3dheShFTEYzMl9SX1NZTSh4LT5yX2luZm8pLCBFTEYzMl9SX1NZTSh5LT5yX2luZm8pKTsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGJvb2wgaXNfemVyb19hZGRlbmRfcmVsb2NhdGlvbihFbGYzMl9BZGRyIGJhc2UsIGNvbnN0IEVsZjMyX1JlbCAqcmVsKQoreworCXUzMiAqdHZhbCA9ICh1MzIgKikoYmFzZSArIHJlbC0+cl9vZmZzZXQpOworCisJLyoKKwkgKiBEbyBhIGJpdHdpc2UgY29tcGFyZSBvbiB0aGUgcmF3IGFkZGVuZCByYXRoZXIgdGhhbiBmdWxseSBkZWNvZGluZworCSAqIHRoZSBvZmZzZXQgYW5kIGRvaW5nIGFuIGFyaXRobWV0aWMgY29tcGFyaXNvbi4KKwkgKiBOb3RlIHRoYXQgYSB6ZXJvLWFkZGVuZCBqdW1wL2NhbGwgcmVsb2NhdGlvbiBpcyBlbmNvZGVkIHRha2luZyB0aGUKKwkgKiBQQyBiaWFzIGludG8gYWNjb3VudCwgaS5lLiwgLTggZm9yIEFSTSBhbmQgLTQgZm9yIFRodW1iMi4KKwkgKi8KKwlzd2l0Y2ggKEVMRjMyX1JfVFlQRShyZWwtPnJfaW5mbykpIHsKKwkJdTE2IHVwcGVyLCBsb3dlcjsKKworCWNhc2UgUl9BUk1fVEhNX0NBTEw6CisJY2FzZSBSX0FSTV9USE1fSlVNUDI0OgorCQl1cHBlciA9IF9fbWVtX3RvX29wY29kZV90aHVtYjE2KCgodTE2ICopdHZhbClbMF0pOworCQlsb3dlciA9IF9fbWVtX3RvX29wY29kZV90aHVtYjE2KCgodTE2ICopdHZhbClbMV0pOworCisJCXJldHVybiAodXBwZXIgJiAweDdmZikgPT0gMHg3ZmYgJiYgKGxvd2VyICYgMHgyZmZmKSA9PSAweDJmZmU7CisKKwljYXNlIFJfQVJNX0NBTEw6CisJY2FzZSBSX0FSTV9QQzI0OgorCWNhc2UgUl9BUk1fSlVNUDI0OgorCQlyZXR1cm4gKF9fbWVtX3RvX29wY29kZV9hcm0oKnR2YWwpICYgMHhmZmZmZmYpID09IDB4ZmZmZmZlOwogCX0KIAlCVUcoKTsKIH0KIAotc3RhdGljIGludCBkdXBsaWNhdGVfcmVsKEVsZjMyX0FkZHIgYmFzZSwgY29uc3QgRWxmMzJfUmVsICpyZWwsIGludCBudW0sCi0JCQkgICB1MzIgbWFzaykKK3N0YXRpYyBib29sIGR1cGxpY2F0ZV9yZWwoRWxmMzJfQWRkciBiYXNlLCBjb25zdCBFbGYzMl9SZWwgKnJlbCwgaW50IG51bSkKIHsKLQl1MzIgKmxvYzEsICpsb2MyOwotCWludCBpOworCWNvbnN0IEVsZjMyX1JlbCAqcHJldjsKIAotCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewotCQlpZiAocmVsW2ldLnJfaW5mbyAhPSByZWxbbnVtXS5yX2luZm8pCi0JCQljb250aW51ZTsKKwkvKgorCSAqIEVudHJpZXMgYXJlIHNvcnRlZCBieSB0eXBlIGFuZCBzeW1ib2wgaW5kZXguIFRoYXQgbWVhbnMgdGhhdCwKKwkgKiBpZiBhIGR1cGxpY2F0ZSBlbnRyeSBleGlzdHMsIGl0IG11c3QgYmUgaW4gdGhlIHByZWNlZGluZworCSAqIHNsb3QuCisJICovCisJaWYgKCFudW0pCisJCXJldHVybiBmYWxzZTsKIAotCQkvKgotCQkgKiBJZGVudGljYWwgcmVsb2NhdGlvbiB0eXBlcyBhZ2FpbnN0IGlkZW50aWNhbCBzeW1ib2xzIGNhbgotCQkgKiBzdGlsbCByZXN1bHQgaW4gZGlmZmVyZW50IFBMVCBlbnRyaWVzIGlmIHRoZSBhZGRlbmQgaW4gdGhlCi0JCSAqIHBsYWNlIGlzIGRpZmZlcmVudC4gU28gcmVzb2x2ZSB0aGUgdGFyZ2V0IG9mIHRoZSByZWxvY2F0aW9uCi0JCSAqIHRvIGNvbXBhcmUgdGhlIHZhbHVlcy4KLQkJICovCi0JCWxvYzEgPSAodTMyICopKGJhc2UgKyByZWxbaV0ucl9vZmZzZXQpOwotCQlsb2MyID0gKHUzMiAqKShiYXNlICsgcmVsW251bV0ucl9vZmZzZXQpOwotCQlpZiAoKCgqbG9jMSBeICpsb2MyKSAmIG1hc2spID09IDApCi0JCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7CisJcHJldiA9IHJlbCArIG51bSAtIDE7CisJcmV0dXJuIGNtcF9yZWwocmVsICsgbnVtLCBwcmV2KSA9PSAwICYmCisJICAgICAgIGlzX3plcm9fYWRkZW5kX3JlbG9jYXRpb24oYmFzZSwgcHJldik7CiB9CiAKIC8qIENvdW50IGhvdyBtYW55IFBMVCBlbnRyaWVzIHdlIG1heSBuZWVkICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGNvdW50X3BsdHMoRWxmMzJfQWRkciBiYXNlLCBjb25zdCBFbGYzMl9SZWwgKnJlbCwgaW50IG51bSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY291bnRfcGx0cyhjb25zdCBFbGYzMl9TeW0gKnN5bXMsIEVsZjMyX0FkZHIgYmFzZSwKKwkJCSAgICAgICBjb25zdCBFbGYzMl9SZWwgKnJlbCwgaW50IG51bSkKIHsKIAl1bnNpZ25lZCBpbnQgcmV0ID0gMDsKKwljb25zdCBFbGYzMl9TeW0gKnM7CiAJaW50IGk7CiAKLQkvKgotCSAqIFN1cmUsIHRoaXMgaXMgb3JkZXIobl4yKSwgYnV0IGl0J3MgdXN1YWxseSBzaG9ydCwgYW5kIG5vdAotCSAqIHRpbWUgY3JpdGljYWwKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CiAJCXN3aXRjaCAoRUxGMzJfUl9UWVBFKHJlbFtpXS5yX2luZm8pKSB7CiAJCWNhc2UgUl9BUk1fQ0FMTDoKIAkJY2FzZSBSX0FSTV9QQzI0OgogCQljYXNlIFJfQVJNX0pVTVAyNDoKLQkJCWlmICghZHVwbGljYXRlX3JlbChiYXNlLCByZWwsIGksCi0JCQkJCSAgIF9fb3Bjb2RlX3RvX21lbV9hcm0oMHgwMGZmZmZmZikpKQotCQkJCXJldCsrOwotCQkJYnJlYWs7Ci0jaWZkZWYgQ09ORklHX1RIVU1CMl9LRVJORUwKIAkJY2FzZSBSX0FSTV9USE1fQ0FMTDoKIAkJY2FzZSBSX0FSTV9USE1fSlVNUDI0OgotCQkJaWYgKCFkdXBsaWNhdGVfcmVsKGJhc2UsIHJlbCwgaSwKLQkJCQkJICAgX19vcGNvZGVfdG9fbWVtX3RodW1iMzIoMHgwN2ZmMmZmZikpKQorCQkJLyoKKwkJCSAqIFdlIG9ubHkgaGF2ZSB0byBjb25zaWRlciBicmFuY2ggdGFyZ2V0cyB0aGF0IHJlc29sdmUKKwkJCSAqIHRvIHVuZGVmaW5lZCBzeW1ib2xzLiBUaGlzIGlzIG5vdCBzaW1wbHkgYSBoZXVyaXN0aWMsCisJCQkgKiBpdCBpcyBhIGZ1bmRhbWVudGFsIGxpbWl0YXRpb24sIHNpbmNlIHRoZSBQTFQgaXRzZWxmCisJCQkgKiBpcyBwYXJ0IG9mIHRoZSBtb2R1bGUsIGFuZCBuZWVkcyB0byBiZSB3aXRoaW4gcmFuZ2UKKwkJCSAqIGFzIHdlbGwsIHNvIG1vZHVsZXMgY2FuIG5ldmVyIGdyb3cgYmV5b25kIHRoYXQgbGltaXQuCisJCQkgKi8KKwkJCXMgPSBzeW1zICsgRUxGMzJfUl9TWU0ocmVsW2ldLnJfaW5mbyk7CisJCQlpZiAocy0+c3Rfc2huZHggIT0gU0hOX1VOREVGKQorCQkJCWJyZWFrOworCisJCQkvKgorCQkJICogSnVtcCByZWxvY2F0aW9ucyB3aXRoIG5vbi16ZXJvIGFkZGVuZHMgYWdhaW5zdAorCQkJICogdW5kZWZpbmVkIHN5bWJvbHMgYXJlIHN1cHBvcnRlZCBieSB0aGUgRUxGIHNwZWMsIGJ1dAorCQkJICogZG8gbm90IG9jY3VyIGluIHByYWN0aWNlIChlLmcuLCAnanVtcCBuIGJ5dGVzIHBhc3QKKwkJCSAqIHRoZSBlbnRyeSBwb2ludCBvZiB1bmRlZmluZWQgZnVuY3Rpb24gc3ltYm9sIGYnKS4KKwkJCSAqIFNvIHdlIG5lZWQgdG8gc3VwcG9ydCB0aGVtLCBidXQgdGhlcmUgaXMgbm8gbmVlZCB0bworCQkJICogdGFrZSB0aGVtIGludG8gY29uc2lkZXJhdGlvbiB3aGVuIHRyeWluZyB0byBvcHRpbWl6ZQorCQkJICogdGhpcyBjb2RlLiBTbyBsZXQncyBvbmx5IGNoZWNrIGZvciBkdXBsaWNhdGVzIHdoZW4KKwkJCSAqIHRoZSBhZGRlbmQgaXMgemVyby4KKwkJCSAqLworCQkJaWYgKCFpc196ZXJvX2FkZGVuZF9yZWxvY2F0aW9uKGJhc2UsIHJlbCArIGkpIHx8CisJCQkgICAgIWR1cGxpY2F0ZV9yZWwoYmFzZSwgcmVsLCBpKSkKIAkJCQlyZXQrKzsKLSNlbmRpZgogCQl9CisJfQogCXJldHVybiByZXQ7CiB9CiAKIGludCBtb2R1bGVfZnJvYl9hcmNoX3NlY3Rpb25zKEVsZl9FaGRyICplaGRyLCBFbGZfU2hkciAqc2VjaGRycywKIAkJCSAgICAgIGNoYXIgKnNlY3N0cmluZ3MsIHN0cnVjdCBtb2R1bGUgKm1vZCkKIHsKLQl1bnNpZ25lZCBsb25nIGNvcmVfcGx0cyA9IDAsIGluaXRfcGx0cyA9IDA7CisJdW5zaWduZWQgbG9uZyBwbHRzID0gMDsKIAlFbGYzMl9TaGRyICpzLCAqc2VjaGRyc19lbmQgPSBzZWNoZHJzICsgZWhkci0+ZV9zaG51bTsKKwlFbGYzMl9TeW0gKnN5bXMgPSBOVUxMOwogCiAJLyoKIAkgKiBUbyBzdG9yZSB0aGUgUExUcywgd2UgZXhwYW5kIHRoZSAudGV4dCBzZWN0aW9uIGZvciBjb3JlIG1vZHVsZSBjb2RlCi0JICogYW5kIHRoZSAuaW5pdC50ZXh0IHNlY3Rpb24gZm9yIGluaXRpYWxpemF0aW9uIGNvZGUuCisJICogYW5kIGZvciBpbml0aWFsaXphdGlvbiBjb2RlLgogCSAqLwotCWZvciAocyA9IHNlY2hkcnM7IHMgPCBzZWNoZHJzX2VuZDsgKytzKQotCQlpZiAoc3RyY21wKCIuY29yZS5wbHQiLCBzZWNzdHJpbmdzICsgcy0+c2hfbmFtZSkgPT0gMCkKLQkJCW1vZC0+YXJjaC5jb3JlX3BsdCA9IHM7Ci0JCWVsc2UgaWYgKHN0cmNtcCgiLmluaXQucGx0Iiwgc2Vjc3RyaW5ncyArIHMtPnNoX25hbWUpID09IDApCi0JCQltb2QtPmFyY2guaW5pdF9wbHQgPSBzOworCWZvciAocyA9IHNlY2hkcnM7IHMgPCBzZWNoZHJzX2VuZDsgKytzKSB7CisJCWlmIChzdHJjbXAoIi5wbHQiLCBzZWNzdHJpbmdzICsgcy0+c2hfbmFtZSkgPT0gMCkKKwkJCW1vZC0+YXJjaC5wbHQgPSBzOworCQllbHNlIGlmIChzLT5zaF90eXBlID09IFNIVF9TWU1UQUIpCisJCQlzeW1zID0gKEVsZjMyX1N5bSAqKXMtPnNoX2FkZHI7CisJfQogCi0JaWYgKCFtb2QtPmFyY2guY29yZV9wbHQgfHwgIW1vZC0+YXJjaC5pbml0X3BsdCkgewotCQlwcl9lcnIoIiVzOiBzZWN0aW9ucyBtaXNzaW5nXG4iLCBtb2QtPm5hbWUpOworCWlmICghbW9kLT5hcmNoLnBsdCkgeworCQlwcl9lcnIoIiVzOiBtb2R1bGUgUExUIHNlY3Rpb24gbWlzc2luZ1xuIiwgbW9kLT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9FWEVDOworCX0KKwlpZiAoIXN5bXMpIHsKKwkJcHJfZXJyKCIlczogbW9kdWxlIHN5bXRhYiBzZWN0aW9uIG1pc3NpbmdcbiIsIG1vZC0+bmFtZSk7CiAJCXJldHVybiAtRU5PRVhFQzsKIAl9CiAKIAlmb3IgKHMgPSBzZWNoZHJzICsgMTsgcyA8IHNlY2hkcnNfZW5kOyArK3MpIHsKLQkJY29uc3QgRWxmMzJfUmVsICpyZWxzID0gKHZvaWQgKillaGRyICsgcy0+c2hfb2Zmc2V0OworCQlFbGYzMl9SZWwgKnJlbHMgPSAodm9pZCAqKWVoZHIgKyBzLT5zaF9vZmZzZXQ7CiAJCWludCBudW1yZWxzID0gcy0+c2hfc2l6ZSAvIHNpemVvZihFbGYzMl9SZWwpOwogCQlFbGYzMl9TaGRyICpkc3RzZWMgPSBzZWNoZHJzICsgcy0+c2hfaW5mbzsKIAogCQlpZiAocy0+c2hfdHlwZSAhPSBTSFRfUkVMKQogCQkJY29udGludWU7CiAKLQkJaWYgKHN0cnN0cihzZWNzdHJpbmdzICsgcy0+c2hfbmFtZSwgIi5pbml0IikpCi0JCQlpbml0X3BsdHMgKz0gY291bnRfcGx0cyhkc3RzZWMtPnNoX2FkZHIsIHJlbHMsIG51bXJlbHMpOwotCQllbHNlCi0JCQljb3JlX3BsdHMgKz0gY291bnRfcGx0cyhkc3RzZWMtPnNoX2FkZHIsIHJlbHMsIG51bXJlbHMpOworCQkvKiBpZ25vcmUgcmVsb2NhdGlvbnMgdGhhdCBvcGVyYXRlIG9uIG5vbi1leGVjIHNlY3Rpb25zICovCisJCWlmICghKGRzdHNlYy0+c2hfZmxhZ3MgJiBTSEZfRVhFQ0lOU1RSKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIHNvcnQgYnkgdHlwZSBhbmQgc3ltYm9sIGluZGV4ICovCisJCXNvcnQocmVscywgbnVtcmVscywgc2l6ZW9mKEVsZjMyX1JlbCksIGNtcF9yZWwsIE5VTEwpOworCisJCXBsdHMgKz0gY291bnRfcGx0cyhzeW1zLCBkc3RzZWMtPnNoX2FkZHIsIHJlbHMsIG51bXJlbHMpOwogCX0KIAotCW1vZC0+YXJjaC5jb3JlX3BsdC0+c2hfdHlwZSA9IFNIVF9OT0JJVFM7Ci0JbW9kLT5hcmNoLmNvcmVfcGx0LT5zaF9mbGFncyA9IFNIRl9FWEVDSU5TVFIgfCBTSEZfQUxMT0M7Ci0JbW9kLT5hcmNoLmNvcmVfcGx0LT5zaF9hZGRyYWxpZ24gPSBMMV9DQUNIRV9CWVRFUzsKLQltb2QtPmFyY2guY29yZV9wbHQtPnNoX3NpemUgPSByb3VuZF91cChjb3JlX3BsdHMgKiBQTFRfRU5UX1NJWkUsCi0JCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHBsdF9lbnRyaWVzKSk7Ci0JbW9kLT5hcmNoLmNvcmVfcGx0X2NvdW50ID0gMDsKKwltb2QtPmFyY2gucGx0LT5zaF90eXBlID0gU0hUX05PQklUUzsKKwltb2QtPmFyY2gucGx0LT5zaF9mbGFncyA9IFNIRl9FWEVDSU5TVFIgfCBTSEZfQUxMT0M7CisJbW9kLT5hcmNoLnBsdC0+c2hfYWRkcmFsaWduID0gTDFfQ0FDSEVfQllURVM7CisJbW9kLT5hcmNoLnBsdC0+c2hfc2l6ZSA9IHJvdW5kX3VwKHBsdHMgKiBQTFRfRU5UX1NJWkUsCisJCQkJCSAgc2l6ZW9mKHN0cnVjdCBwbHRfZW50cmllcykpOworCW1vZC0+YXJjaC5wbHRfY291bnQgPSAwOwogCi0JbW9kLT5hcmNoLmluaXRfcGx0LT5zaF90eXBlID0gU0hUX05PQklUUzsKLQltb2QtPmFyY2guaW5pdF9wbHQtPnNoX2ZsYWdzID0gU0hGX0VYRUNJTlNUUiB8IFNIRl9BTExPQzsKLQltb2QtPmFyY2guaW5pdF9wbHQtPnNoX2FkZHJhbGlnbiA9IEwxX0NBQ0hFX0JZVEVTOwotCW1vZC0+YXJjaC5pbml0X3BsdC0+c2hfc2l6ZSA9IHJvdW5kX3VwKGluaXRfcGx0cyAqIFBMVF9FTlRfU0laRSwKLQkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcGx0X2VudHJpZXMpKTsKLQltb2QtPmFyY2guaW5pdF9wbHRfY291bnQgPSAwOwotCXByX2RlYnVnKCIlczogY29yZS5wbHQ9JXgsIGluaXQucGx0PSV4XG4iLCBfX2Z1bmNfXywKLQkJIG1vZC0+YXJjaC5jb3JlX3BsdC0+c2hfc2l6ZSwgbW9kLT5hcmNoLmluaXRfcGx0LT5zaF9zaXplKTsKKwlwcl9kZWJ1ZygiJXM6IHBsdD0leFxuIiwgX19mdW5jX18sIG1vZC0+YXJjaC5wbHQtPnNoX3NpemUpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL21vZHVsZS5sZHMgYi9hcmNoL2FybS9rZXJuZWwvbW9kdWxlLmxkcwppbmRleCAzNjgyZmExLi4wNTg4MWUyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvbW9kdWxlLmxkcworKysgYi9hcmNoL2FybS9rZXJuZWwvbW9kdWxlLmxkcwpAQCAtMSw0ICsxLDMgQEAKIFNFQ1RJT05TIHsKLSAgICAgICAgLmNvcmUucGx0IDogeyBCWVRFKDApIH0KLSAgICAgICAgLmluaXQucGx0IDogeyBCWVRFKDApIH0KKwkucGx0IDogeyBCWVRFKDApIH0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50X3Y3LmMgYi9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudF92Ny5jCmluZGV4IDE1MDYzODUuLmI5NDIzNDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50X3Y3LmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnRfdjcuYwpAQCAtNTk2LDEyICs1OTYsNiBAQAogCS5hdHRycyA9IGFybXY3X3BtdXYxX2V2ZW50X2F0dHJzLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmFybXY3X3BtdXYxX2F0dHJfZ3JvdXBzW10gPSB7Ci0JJmFybXY3X3BtdXYxX2V2ZW50c19hdHRyX2dyb3VwLAotCSZhcm12N19wbXVfZm9ybWF0X2F0dHJfZ3JvdXAsCi0JTlVMTCwKLX07Ci0KIEFSTVY3X0VWRU5UX0FUVFIobWVtX2FjY2VzcywgQVJNVjdfUEVSRkNUUl9NRU1fQUNDRVNTKTsKIEFSTVY3X0VWRU5UX0FUVFIobDFpX2NhY2hlLCBBUk1WN19QRVJGQ1RSX0wxX0lDQUNIRV9BQ0NFU1MpOwogQVJNVjdfRVZFTlRfQVRUUihsMWRfY2FjaGVfd2IsIEFSTVY3X1BFUkZDVFJfTDFfRENBQ0hFX1dCKTsKQEAgLTY1MywxMiArNjQ3LDYgQEAKIAkuYXR0cnMgPSBhcm12N19wbXV2Ml9ldmVudF9hdHRycywKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICphcm12N19wbXV2Ml9hdHRyX2dyb3Vwc1tdID0gewotCSZhcm12N19wbXV2Ml9ldmVudHNfYXR0cl9ncm91cCwKLQkmYXJtdjdfcG11X2Zvcm1hdF9hdHRyX2dyb3VwLAotCU5VTEwsCi19OwotCiAvKgogICogUGVyZiBFdmVudHMnIGluZGljZXMKICAqLwpAQCAtMTIwOCw3ICsxMTk2LDEwIEBACiAJYXJtdjdwbXVfaW5pdChjcHVfcG11KTsKIAljcHVfcG11LT5uYW1lCQk9ICJhcm12N19jb3J0ZXhfYTgiOwogCWNwdV9wbXUtPm1hcF9ldmVudAk9IGFybXY3X2E4X21hcF9ldmVudDsKLQljcHVfcG11LT5wbXUuYXR0cl9ncm91cHMgPSBhcm12N19wbXV2MV9hdHRyX2dyb3VwczsKKwljcHVfcG11LT5hdHRyX2dyb3Vwc1tBUk1QTVVfQVRUUl9HUk9VUF9FVkVOVFNdID0KKwkJJmFybXY3X3BtdXYxX2V2ZW50c19hdHRyX2dyb3VwOworCWNwdV9wbXUtPmF0dHJfZ3JvdXBzW0FSTVBNVV9BVFRSX0dST1VQX0ZPUk1BVFNdID0KKwkJJmFybXY3X3BtdV9mb3JtYXRfYXR0cl9ncm91cDsKIAlyZXR1cm4gYXJtdjdfcHJvYmVfbnVtX2V2ZW50cyhjcHVfcG11KTsKIH0KIApAQCAtMTIxNyw3ICsxMjA4LDEwIEBACiAJYXJtdjdwbXVfaW5pdChjcHVfcG11KTsKIAljcHVfcG11LT5uYW1lCQk9ICJhcm12N19jb3J0ZXhfYTkiOwogCWNwdV9wbXUtPm1hcF9ldmVudAk9IGFybXY3X2E5X21hcF9ldmVudDsKLQljcHVfcG11LT5wbXUuYXR0cl9ncm91cHMgPSBhcm12N19wbXV2MV9hdHRyX2dyb3VwczsKKwljcHVfcG11LT5hdHRyX2dyb3Vwc1tBUk1QTVVfQVRUUl9HUk9VUF9FVkVOVFNdID0KKwkJJmFybXY3X3BtdXYxX2V2ZW50c19hdHRyX2dyb3VwOworCWNwdV9wbXUtPmF0dHJfZ3JvdXBzW0FSTVBNVV9BVFRSX0dST1VQX0ZPUk1BVFNdID0KKwkJJmFybXY3X3BtdV9mb3JtYXRfYXR0cl9ncm91cDsKIAlyZXR1cm4gYXJtdjdfcHJvYmVfbnVtX2V2ZW50cyhjcHVfcG11KTsKIH0KIApAQCAtMTIyNiw3ICsxMjIwLDEwIEBACiAJYXJtdjdwbXVfaW5pdChjcHVfcG11KTsKIAljcHVfcG11LT5uYW1lCQk9ICJhcm12N19jb3J0ZXhfYTUiOwogCWNwdV9wbXUtPm1hcF9ldmVudAk9IGFybXY3X2E1X21hcF9ldmVudDsKLQljcHVfcG11LT5wbXUuYXR0cl9ncm91cHMgPSBhcm12N19wbXV2MV9hdHRyX2dyb3VwczsKKwljcHVfcG11LT5hdHRyX2dyb3Vwc1tBUk1QTVVfQVRUUl9HUk9VUF9FVkVOVFNdID0KKwkJJmFybXY3X3BtdXYxX2V2ZW50c19hdHRyX2dyb3VwOworCWNwdV9wbXUtPmF0dHJfZ3JvdXBzW0FSTVBNVV9BVFRSX0dST1VQX0ZPUk1BVFNdID0KKwkJJmFybXY3X3BtdV9mb3JtYXRfYXR0cl9ncm91cDsKIAlyZXR1cm4gYXJtdjdfcHJvYmVfbnVtX2V2ZW50cyhjcHVfcG11KTsKIH0KIApAQCAtMTIzNiw3ICsxMjMzLDEwIEBACiAJY3B1X3BtdS0+bmFtZQkJPSAiYXJtdjdfY29ydGV4X2ExNSI7CiAJY3B1X3BtdS0+bWFwX2V2ZW50CT0gYXJtdjdfYTE1X21hcF9ldmVudDsKIAljcHVfcG11LT5zZXRfZXZlbnRfZmlsdGVyID0gYXJtdjdwbXVfc2V0X2V2ZW50X2ZpbHRlcjsKLQljcHVfcG11LT5wbXUuYXR0cl9ncm91cHMgPSBhcm12N19wbXV2Ml9hdHRyX2dyb3VwczsKKwljcHVfcG11LT5hdHRyX2dyb3Vwc1tBUk1QTVVfQVRUUl9HUk9VUF9FVkVOVFNdID0KKwkJJmFybXY3X3BtdXYyX2V2ZW50c19hdHRyX2dyb3VwOworCWNwdV9wbXUtPmF0dHJfZ3JvdXBzW0FSTVBNVV9BVFRSX0dST1VQX0ZPUk1BVFNdID0KKwkJJmFybXY3X3BtdV9mb3JtYXRfYXR0cl9ncm91cDsKIAlyZXR1cm4gYXJtdjdfcHJvYmVfbnVtX2V2ZW50cyhjcHVfcG11KTsKIH0KIApAQCAtMTI0Niw3ICsxMjQ2LDEwIEBACiAJY3B1X3BtdS0+bmFtZQkJPSAiYXJtdjdfY29ydGV4X2E3IjsKIAljcHVfcG11LT5tYXBfZXZlbnQJPSBhcm12N19hN19tYXBfZXZlbnQ7CiAJY3B1X3BtdS0+c2V0X2V2ZW50X2ZpbHRlciA9IGFybXY3cG11X3NldF9ldmVudF9maWx0ZXI7Ci0JY3B1X3BtdS0+cG11LmF0dHJfZ3JvdXBzID0gYXJtdjdfcG11djJfYXR0cl9ncm91cHM7CisJY3B1X3BtdS0+YXR0cl9ncm91cHNbQVJNUE1VX0FUVFJfR1JPVVBfRVZFTlRTXSA9CisJCSZhcm12N19wbXV2Ml9ldmVudHNfYXR0cl9ncm91cDsKKwljcHVfcG11LT5hdHRyX2dyb3Vwc1tBUk1QTVVfQVRUUl9HUk9VUF9GT1JNQVRTXSA9CisJCSZhcm12N19wbXVfZm9ybWF0X2F0dHJfZ3JvdXA7CiAJcmV0dXJuIGFybXY3X3Byb2JlX251bV9ldmVudHMoY3B1X3BtdSk7CiB9CiAKQEAgLTEyNTYsNyArMTI1OSwxMCBAQAogCWNwdV9wbXUtPm5hbWUJCT0gImFybXY3X2NvcnRleF9hMTIiOwogCWNwdV9wbXUtPm1hcF9ldmVudAk9IGFybXY3X2ExMl9tYXBfZXZlbnQ7CiAJY3B1X3BtdS0+c2V0X2V2ZW50X2ZpbHRlciA9IGFybXY3cG11X3NldF9ldmVudF9maWx0ZXI7Ci0JY3B1X3BtdS0+cG11LmF0dHJfZ3JvdXBzID0gYXJtdjdfcG11djJfYXR0cl9ncm91cHM7CisJY3B1X3BtdS0+YXR0cl9ncm91cHNbQVJNUE1VX0FUVFJfR1JPVVBfRVZFTlRTXSA9CisJCSZhcm12N19wbXV2Ml9ldmVudHNfYXR0cl9ncm91cDsKKwljcHVfcG11LT5hdHRyX2dyb3Vwc1tBUk1QTVVfQVRUUl9HUk9VUF9GT1JNQVRTXSA9CisJCSZhcm12N19wbXVfZm9ybWF0X2F0dHJfZ3JvdXA7CiAJcmV0dXJuIGFybXY3X3Byb2JlX251bV9ldmVudHMoY3B1X3BtdSk7CiB9CiAKQEAgLTEyNjQsNyArMTI3MCwxMCBAQAogewogCWludCByZXQgPSBhcm12N19hMTJfcG11X2luaXQoY3B1X3BtdSk7CiAJY3B1X3BtdS0+bmFtZSA9ICJhcm12N19jb3J0ZXhfYTE3IjsKLQljcHVfcG11LT5wbXUuYXR0cl9ncm91cHMgPSBhcm12N19wbXV2Ml9hdHRyX2dyb3VwczsKKwljcHVfcG11LT5hdHRyX2dyb3Vwc1tBUk1QTVVfQVRUUl9HUk9VUF9FVkVOVFNdID0KKwkJJmFybXY3X3BtdXYyX2V2ZW50c19hdHRyX2dyb3VwOworCWNwdV9wbXUtPmF0dHJfZ3JvdXBzW0FSTVBNVV9BVFRSX0dST1VQX0ZPUk1BVFNdID0KKwkJJmFybXY3X3BtdV9mb3JtYXRfYXR0cl9ncm91cDsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCmluZGV4IGRmN2YyYTcuLjM0ZTNmM2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCkBAIC0xMTQsMTkgKzExNCwxOSBAQAogCiAKICNpZmRlZiBNVUxUSV9DUFUKLXN0cnVjdCBwcm9jZXNzb3IgcHJvY2Vzc29yIF9fcmVhZF9tb3N0bHk7CitzdHJ1Y3QgcHJvY2Vzc29yIHByb2Nlc3NvciBfX3JvX2FmdGVyX2luaXQ7CiAjZW5kaWYKICNpZmRlZiBNVUxUSV9UTEIKLXN0cnVjdCBjcHVfdGxiX2ZucyBjcHVfdGxiIF9fcmVhZF9tb3N0bHk7CitzdHJ1Y3QgY3B1X3RsYl9mbnMgY3B1X3RsYiBfX3JvX2FmdGVyX2luaXQ7CiAjZW5kaWYKICNpZmRlZiBNVUxUSV9VU0VSCi1zdHJ1Y3QgY3B1X3VzZXJfZm5zIGNwdV91c2VyIF9fcmVhZF9tb3N0bHk7CitzdHJ1Y3QgY3B1X3VzZXJfZm5zIGNwdV91c2VyIF9fcm9fYWZ0ZXJfaW5pdDsKICNlbmRpZgogI2lmZGVmIE1VTFRJX0NBQ0hFCi1zdHJ1Y3QgY3B1X2NhY2hlX2ZucyBjcHVfY2FjaGUgX19yZWFkX21vc3RseTsKK3N0cnVjdCBjcHVfY2FjaGVfZm5zIGNwdV9jYWNoZSBfX3JvX2FmdGVyX2luaXQ7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfT1VURVJfQ0FDSEUKLXN0cnVjdCBvdXRlcl9jYWNoZV9mbnMgb3V0ZXJfY2FjaGUgX19yZWFkX21vc3RseTsKK3N0cnVjdCBvdXRlcl9jYWNoZV9mbnMgb3V0ZXJfY2FjaGUgX19yb19hZnRlcl9pbml0OwogRVhQT1JUX1NZTUJPTChvdXRlcl9jYWNoZSk7CiAjZW5kaWYKIApAQCAtMjkwLDEyICsyOTAsOSBAQAogCS8qIGFyY2ggc3BlY2lmaWVzIHRoZSByZWdpc3RlciBmb3JtYXQgKi8KIAlzd2l0Y2ggKGFyY2gpIHsKIAljYXNlIENQVV9BUkNIX0FSTXY3OgotCQlhc20oIm1jcglwMTUsIDIsICUwLCBjMCwgYzAsIDAgQCBzZXQgQ1NTRUxSIgotCQkgICAgOiAvKiBObyBvdXRwdXQgb3BlcmFuZHMgKi8KLQkJICAgIDogInIiICgxKSk7CisJCXNldF9jc3NlbHIoQ1NTRUxSX0lDQUNIRSB8IENTU0VMUl9MMSk7CiAJCWlzYigpOwotCQlhc20oIm1yYwlwMTUsIDEsICUwLCBjMCwgYzAsIDAgQCByZWFkIENDU0lEUiIKLQkJICAgIDogIj1yIiAoaWRfcmVnKSk7CisJCWlkX3JlZyA9IHJlYWRfY2NzaWRyKCk7CiAJCWxpbmVfc2l6ZSA9IDQgPDwgKChpZF9yZWcgJiAweDcpICsgMik7CiAJCW51bV9zZXRzID0gKChpZF9yZWcgPj4gMTMpICYgMHg3ZmZmKSArIDE7CiAJCWFsaWFzaW5nX2ljYWNoZSA9IChsaW5lX3NpemUgKiBudW1fc2V0cykgPiBQQUdFX1NJWkU7CkBAIC0zMTUsMTEgKzMxMiwxMiBAQAogewogCXVuc2lnbmVkIGludCBhcmNoID0gY3B1X2FyY2hpdGVjdHVyZSgpOwogCi0JaWYgKGFyY2ggPT0gQ1BVX0FSQ0hfQVJNdjdNKSB7Ci0JCWNhY2hlaWQgPSAwOwotCX0gZWxzZSBpZiAoYXJjaCA+PSBDUFVfQVJDSF9BUk12NikgeworCWlmIChhcmNoID49IENQVV9BUkNIX0FSTXY2KSB7CiAJCXVuc2lnbmVkIGludCBjYWNoZXR5cGUgPSByZWFkX2NwdWlkX2NhY2hldHlwZSgpOwotCQlpZiAoKGNhY2hldHlwZSAmICg3IDw8IDI5KSkgPT0gNCA8PCAyOSkgeworCisJCWlmICgoYXJjaCA9PSBDUFVfQVJDSF9BUk12N00pICYmICFjYWNoZXR5cGUpIHsKKwkJCWNhY2hlaWQgPSAwOworCQl9IGVsc2UgaWYgKChjYWNoZXR5cGUgJiAoNyA8PCAyOSkpID09IDQgPDwgMjkpIHsKIAkJCS8qIEFSTXY3IHJlZ2lzdGVyIGZvcm1hdCAqLwogCQkJYXJjaCA9IENQVV9BUkNIX0FSTXY3OwogCQkJY2FjaGVpZCA9IENBQ0hFSURfVklQVF9OT05BTElBU0lORzsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zbXAuYyBiL2FyY2gvYXJtL2tlcm5lbC9zbXAuYwppbmRleCA4NjE1MjE2Li45MzdjODkyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3NtcC5jCkBAIC04Miw3ICs4Miw3IEBACiAKIHN0YXRpYyBERUNMQVJFX0NPTVBMRVRJT04oY3B1X3J1bm5pbmcpOwogCi1zdGF0aWMgc3RydWN0IHNtcF9vcGVyYXRpb25zIHNtcF9vcHM7CitzdGF0aWMgc3RydWN0IHNtcF9vcGVyYXRpb25zIHNtcF9vcHMgX19yb19hZnRlcl9pbml0OwogCiB2b2lkIF9faW5pdCBzbXBfc2V0X29wcyhjb25zdCBzdHJ1Y3Qgc21wX29wZXJhdGlvbnMgKm9wcykKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC92ZHNvLmMgYi9hcmNoL2FybS9rZXJuZWwvdmRzby5jCmluZGV4IDk5NGU5NzEuLjUzY2Y4NmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC92ZHNvLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3Zkc28uYwpAQCAtMTcsNiArMTcsNyBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvZWxmLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0zOSw3ICs0MCw3IEBACiBzdGF0aWMgc3RydWN0IHBhZ2UgKip2ZHNvX3RleHRfcGFnZWxpc3Q7CiAKIC8qIFRvdGFsIG51bWJlciBvZiBwYWdlcyBuZWVkZWQgZm9yIHRoZSBkYXRhIGFuZCB0ZXh0IHBvcnRpb25zIG9mIHRoZSBWRFNPLiAqLwotdW5zaWduZWQgaW50IHZkc29fdG90YWxfcGFnZXMgX19yZWFkX21vc3RseTsKK3Vuc2lnbmVkIGludCB2ZHNvX3RvdGFsX3BhZ2VzIF9fcm9fYWZ0ZXJfaW5pdDsKIAogLyoKICAqIFRoZSBWRFNPIGRhdGEgcGFnZS4KQEAgLTQ3LDEzICs0OCwxMyBAQAogc3RhdGljIHVuaW9uIHZkc29fZGF0YV9zdG9yZSB2ZHNvX2RhdGFfc3RvcmUgX19wYWdlX2FsaWduZWRfZGF0YTsKIHN0YXRpYyBzdHJ1Y3QgdmRzb19kYXRhICp2ZHNvX2RhdGEgPSAmdmRzb19kYXRhX3N0b3JlLmRhdGE7CiAKLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqdmRzb19kYXRhX3BhZ2U7Ci1zdGF0aWMgc3RydWN0IHZtX3NwZWNpYWxfbWFwcGluZyB2ZHNvX2RhdGFfbWFwcGluZyA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqdmRzb19kYXRhX3BhZ2UgX19yb19hZnRlcl9pbml0Oworc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9zcGVjaWFsX21hcHBpbmcgdmRzb19kYXRhX21hcHBpbmcgPSB7CiAJLm5hbWUgPSAiW3Z2YXJdIiwKIAkucGFnZXMgPSAmdmRzb19kYXRhX3BhZ2UsCiB9OwogCi1zdGF0aWMgc3RydWN0IHZtX3NwZWNpYWxfbWFwcGluZyB2ZHNvX3RleHRfbWFwcGluZyA9IHsKK3N0YXRpYyBzdHJ1Y3Qgdm1fc3BlY2lhbF9tYXBwaW5nIHZkc29fdGV4dF9tYXBwaW5nIF9fcm9fYWZ0ZXJfaW5pdCA9IHsKIAkubmFtZSA9ICJbdmRzb10iLAogfTsKIApAQCAtNjcsNyArNjgsNyBAQAogLyogQ2FjaGVkIHJlc3VsdCBvZiBib290LXRpbWUgY2hlY2sgZm9yIHdoZXRoZXIgdGhlIGFyY2ggdGltZXIgZXhpc3RzLAogICogYW5kIGlmIHNvLCB3aGV0aGVyIHRoZSB2aXJ0dWFsIGNvdW50ZXIgaXMgdXNlYWJsZS4KICAqLwotc3RhdGljIGJvb2wgY250dmN0X29rIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgYm9vbCBjbnR2Y3Rfb2sgX19yb19hZnRlcl9pbml0OwogCiBzdGF0aWMgYm9vbCBfX2luaXQgY250dmN0X2Z1bmN0aW9uYWwodm9pZCkKIHsKQEAgLTI3MCw3ICsyNzEsNyBAQAogCWlmICghSVNfRU5BQkxFRChDT05GSUdfQVJNX0FSQ0hfVElNRVIpKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlpZiAoc3RyY21wKHRrLT50a3JfbW9uby5jbG9jay0+bmFtZSwgImFyY2hfc3lzX2NvdW50ZXIiKSAhPSAwKQorCWlmICghdGstPnRrcl9tb25vLmNsb2NrLT5hcmNoZGF0YS52ZHNvX2RpcmVjdCkKIAkJcmV0dXJuIGZhbHNlOwogCiAJcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rdm0vTWFrZWZpbGUgYi9hcmNoL2FybS9rdm0vTWFrZWZpbGUKaW5kZXggMTBkNzdhNi4uZjE5ODQyZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va3ZtL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL2t2bS9NYWtlZmlsZQpAQCAtMjEsMTMgKzIxLDE2IEBACiBvYmoteSArPSBrdm0tYXJtLm8gaW5pdC5vIGludGVycnVwdHMubwogb2JqLXkgKz0gYXJtLm8gaGFuZGxlX2V4aXQubyBndWVzdC5vIG1tdS5vIGVtdWxhdGUubyByZXNldC5vCiBvYmoteSArPSBjb3Byb2MubyBjb3Byb2NfYTE1Lm8gY29wcm9jX2E3Lm8gbW1pby5vIHBzY2kubyBwZXJmLm8KK29iai15ICs9ICQoS1ZNKS9hcm0vYWFyY2gzMi5vCiAKIG9iai15ICs9ICQoS1ZNKS9hcm0vdmdpYy92Z2ljLm8KIG9iai15ICs9ICQoS1ZNKS9hcm0vdmdpYy92Z2ljLWluaXQubwogb2JqLXkgKz0gJChLVk0pL2FybS92Z2ljL3ZnaWMtaXJxZmQubwogb2JqLXkgKz0gJChLVk0pL2FybS92Z2ljL3ZnaWMtdjIubworb2JqLXkgKz0gJChLVk0pL2FybS92Z2ljL3ZnaWMtdjMubwogb2JqLXkgKz0gJChLVk0pL2FybS92Z2ljL3ZnaWMtbW1pby5vCiBvYmoteSArPSAkKEtWTSkvYXJtL3ZnaWMvdmdpYy1tbWlvLXYyLm8KK29iai15ICs9ICQoS1ZNKS9hcm0vdmdpYy92Z2ljLW1taW8tdjMubwogb2JqLXkgKz0gJChLVk0pL2FybS92Z2ljL3ZnaWMta3ZtLWRldmljZS5vCiBvYmoteSArPSAkKEtWTSkvaXJxY2hpcC5vCiBvYmoteSArPSAkKEtWTSkvYXJtL2FyY2hfdGltZXIubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va3ZtL2FybS5jIGIvYXJjaC9hcm0va3ZtL2FybS5jCmluZGV4IDc1ZjEzMGUuLjAzZTkyNzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2t2bS9hcm0uYworKysgYi9hcmNoL2FybS9rdm0vYXJtLmMKQEAgLTE0NCw2ICsxNDQsMTYgQEAKIAlyZXR1cm4gcmV0OwogfQogCitib29sIGt2bV9hcmNoX2hhc192Y3B1X2RlYnVnZnModm9pZCkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisKK2ludCBrdm1fYXJjaF9jcmVhdGVfdmNwdV9kZWJ1Z2ZzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlyZXR1cm4gMDsKK30KKwogaW50IGt2bV9hcmNoX3ZjcHVfZmF1bHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZikKIHsKIAlyZXR1cm4gVk1fRkFVTFRfU0lHQlVTOwpAQCAtMTU4LDggKzE2OCw2IEBACiB7CiAJaW50IGk7CiAKLQlrdm1fZnJlZV9zdGFnZTJfcGdkKGt2bSk7Ci0KIAlmb3IgKGkgPSAwOyBpIDwgS1ZNX01BWF9WQ1BVUzsgKytpKSB7CiAJCWlmIChrdm0tPnZjcHVzW2ldKSB7CiAJCQlrdm1fYXJjaF92Y3B1X2ZyZWUoa3ZtLT52Y3B1c1tpXSk7CkBAIC0xMTc4LDYgKzExODYsMTAgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJLyogc2V0IHNpemUgb2YgVk1JRCBzdXBwb3J0ZWQgYnkgQ1BVICovCisJa3ZtX3ZtaWRfYml0cyA9IGt2bV9nZXRfdm1pZF9iaXRzKCk7CisJa3ZtX2luZm8oIiVkLWJpdCBWTUlEXG4iLCBrdm1fdm1pZF9iaXRzKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMjQzLDEwICsxMjU1LDYgQEAKIAogc3RhdGljIGludCBpbml0X3ZoZV9tb2RlKHZvaWQpCiB7Ci0JLyogc2V0IHNpemUgb2YgVk1JRCBzdXBwb3J0ZWQgYnkgQ1BVICovCi0Ja3ZtX3ZtaWRfYml0cyA9IGt2bV9nZXRfdm1pZF9iaXRzKCk7Ci0Ja3ZtX2luZm8oIiVkLWJpdCBWTUlEXG4iLCBrdm1fdm1pZF9iaXRzKTsKLQogCWt2bV9pbmZvKCJWSEUgbW9kZSBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHlcbiIpOwogCXJldHVybiAwOwogfQpAQCAtMTMzMCwxMCArMTMzOCw2IEBACiAJCX0KIAl9CiAKLQkvKiBzZXQgc2l6ZSBvZiBWTUlEIHN1cHBvcnRlZCBieSBDUFUgKi8KLQlrdm1fdm1pZF9iaXRzID0ga3ZtX2dldF92bWlkX2JpdHMoKTsKLQlrdm1faW5mbygiJWQtYml0IFZNSURcbiIsIGt2bV92bWlkX2JpdHMpOwotCiAJa3ZtX2luZm8oIkh5cCBtb2RlIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseVxuIik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2t2bS9jb3Byb2MuYyBiL2FyY2gvYXJtL2t2bS9jb3Byb2MuYwppbmRleCAxYmIyYjc5Li4zZTVlNDE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rdm0vY29wcm9jLmMKKysrIGIvYXJjaC9hcm0va3ZtL2NvcHJvYy5jCkBAIC0yMjgsNiArMjI4LDM1IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKK3N0YXRpYyBib29sIGFjY2Vzc19naWNfc2dpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCSAgIGNvbnN0IHN0cnVjdCBjb3Byb2NfcGFyYW1zICpwLAorCQkJICAgY29uc3Qgc3RydWN0IGNvcHJvY19yZWcgKnIpCit7CisJdTY0IHJlZzsKKworCWlmICghcC0+aXNfd3JpdGUpCisJCXJldHVybiByZWFkX2Zyb21fd3JpdGVfb25seSh2Y3B1LCBwKTsKKworCXJlZyA9ICh1NjQpKnZjcHVfcmVnKHZjcHUsIHAtPlJ0MikgPDwgMzI7CisJcmVnIHw9ICp2Y3B1X3JlZyh2Y3B1LCBwLT5SdDEpIDsKKworCXZnaWNfdjNfZGlzcGF0Y2hfc2dpKHZjcHUsIHJlZyk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgYWNjZXNzX2dpY19zcmUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJICAgY29uc3Qgc3RydWN0IGNvcHJvY19wYXJhbXMgKnAsCisJCQkgICBjb25zdCBzdHJ1Y3QgY29wcm9jX3JlZyAqcikKK3sKKwlpZiAocC0+aXNfd3JpdGUpCisJCXJldHVybiBpZ25vcmVfd3JpdGUodmNwdSwgcCk7CisKKwkqdmNwdV9yZWcodmNwdSwgcC0+UnQxKSA9IHZjcHUtPmFyY2gudmdpY19jcHUudmdpY192My52Z2ljX3NyZTsKKworCXJldHVybiB0cnVlOworfQorCiAvKgogICogV2UgY291bGQgdHJhcCBJRF9ERlIwIGFuZCB0ZWxsIHRoZSBndWVzdCB3ZSBkb24ndCBzdXBwb3J0IHBlcmZvcm1hbmNlCiAgKiBtb25pdG9yaW5nLiAgVW5mb3J0dW5hdGVseSB0aGUgcGF0Y2ggdG8gbWFrZSB0aGUga2VybmVsIGNoZWNrIElEX0RGUjAgd2FzCkBAIC0zNjEsMTAgKzM5MCwxNiBAQAogCXsgQ1JuKDEwKSwgQ1JtKCAzKSwgT3AxKCAwKSwgT3AyKCAxKSwgaXMzMiwKIAkJCWFjY2Vzc192bV9yZWcsIHJlc2V0X3Vua25vd24sIGMxMF9BTUFJUjF9LAogCisJLyogSUNDX1NHSTFSICovCisJeyBDUm02NCgxMiksIE9wMSggMCksIGlzNjQsIGFjY2Vzc19naWNfc2dpfSwKKwogCS8qIFZCQVI6IHN3YXBwZWQgYnkgaW50ZXJydXB0LlMuICovCiAJeyBDUm4oMTIpLCBDUm0oIDApLCBPcDEoIDApLCBPcDIoIDApLCBpczMyLAogCQkJTlVMTCwgcmVzZXRfdmFsLCBjMTJfVkJBUiwgMHgwMDAwMDAwMCB9LAogCisJLyogSUNDX1NSRSAqLworCXsgQ1JuKDEyKSwgQ1JtKDEyKSwgT3AxKCAwKSwgT3AyKDUpLCBpczMyLCBhY2Nlc3NfZ2ljX3NyZSB9LAorCiAJLyogQ09OVEVYVElEUi9UUElEUlVSVy9UUElEUlVSTy9UUElEUlBSVzogc3dhcHBlZCBieSBpbnRlcnJ1cHQuUy4gKi8KIAl7IENSbigxMyksIENSbSggMCksIE9wMSggMCksIE9wMiggMSksIGlzMzIsCiAJCQlhY2Nlc3Nfdm1fcmVnLCByZXNldF92YWwsIGMxM19DSUQsIDB4MDAwMDAwMDAgfSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2t2bS9lbXVsYXRlLmMgYi9hcmNoL2FybS9rdm0vZW11bGF0ZS5jCmluZGV4IGFmOTNlM2YuLjAwNjRiODYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2t2bS9lbXVsYXRlLmMKKysrIGIvYXJjaC9hcm0va3ZtL2VtdWxhdGUuYwpAQCAtMTYxLDEwNSArMTYxLDYgQEAKIAl9CiB9CiAKLS8qCi0gKiBBIGNvbmRpdGlvbmFsIGluc3RydWN0aW9uIGlzIGFsbG93ZWQgdG8gdHJhcCwgZXZlbiB0aG91Z2ggaXQKLSAqIHdvdWxkbid0IGJlIGV4ZWN1dGVkLiAgU28gbGV0J3MgcmUtaW1wbGVtZW50IHRoZSBoYXJkd2FyZSwgaW4KLSAqIHNvZnR3YXJlIQotICovCi1ib29sIGt2bV9jb25kaXRpb25fdmFsaWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQotewotCXVuc2lnbmVkIGxvbmcgY3BzciwgY29uZCwgaW5zbjsKLQotCS8qCi0JICogRXhjZXB0aW9uIENvZGUgMCBjYW4gb25seSBoYXBwZW4gaWYgd2Ugc2V0IEhDUi5UR0UgdG8gMSwgdG8KLQkgKiBjYXRjaCB1bmRlZmluZWQgaW5zdHJ1Y3Rpb25zLCBhbmQgdGhlbiB3ZSB3b24ndCBnZXQgcGFzdAotCSAqIHRoZSBhcm1fZXhpdF9oYW5kbGVycyB0ZXN0IGFueXdheS4KLQkgKi8KLQlCVUdfT04oIWt2bV92Y3B1X3RyYXBfZ2V0X2NsYXNzKHZjcHUpKTsKLQotCS8qIFRvcCB0d28gYml0cyBub24temVybz8gIFVuY29uZGl0aW9uYWwuICovCi0JaWYgKGt2bV92Y3B1X2dldF9oc3IodmNwdSkgPj4gMzApCi0JCXJldHVybiB0cnVlOwotCi0JY3BzciA9ICp2Y3B1X2Nwc3IodmNwdSk7Ci0KLQkvKiBJcyBjb25kaXRpb24gZmllbGQgdmFsaWQ/ICovCi0JaWYgKChrdm1fdmNwdV9nZXRfaHNyKHZjcHUpICYgSFNSX0NWKSA+PiBIU1JfQ1ZfU0hJRlQpCi0JCWNvbmQgPSAoa3ZtX3ZjcHVfZ2V0X2hzcih2Y3B1KSAmIEhTUl9DT05EKSA+PiBIU1JfQ09ORF9TSElGVDsKLQllbHNlIHsKLQkJLyogVGhpcyBjYW4gaGFwcGVuIGluIFRodW1iIG1vZGU6IGV4YW1pbmUgSVQgc3RhdGUuICovCi0JCXVuc2lnbmVkIGxvbmcgaXQ7Ci0KLQkJaXQgPSAoKGNwc3IgPj4gOCkgJiAweEZDKSB8ICgoY3BzciA+PiAyNSkgJiAweDMpOwotCi0JCS8qIGl0ID09IDAgPT4gdW5jb25kaXRpb25hbC4gKi8KLQkJaWYgKGl0ID09IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQkvKiBUaGUgY29uZCBmb3IgdGhpcyBpbnNuIHdvcmtzIG91dCBhcyB0aGUgdG9wIDQgYml0cy4gKi8KLQkJY29uZCA9IChpdCA+PiA0KTsKLQl9Ci0KLQkvKiBTaGlmdCBtYWtlcyBpdCBsb29rIGxpa2UgYW4gQVJNLW1vZGUgaW5zdHJ1Y3Rpb24gKi8KLQlpbnNuID0gY29uZCA8PCAyODsKLQlyZXR1cm4gYXJtX2NoZWNrX2NvbmRpdGlvbihpbnNuLCBjcHNyKSAhPSBBUk1fT1BDT0RFX0NPTkRURVNUX0ZBSUw7Ci19Ci0KLS8qKgotICogYWRqdXN0X2l0c3RhdGUgLSBhZGp1c3QgSVRTVEFURSB3aGVuIGVtdWxhdGluZyBpbnN0cnVjdGlvbnMgaW4gSVQtYmxvY2sKLSAqIEB2Y3B1OglUaGUgVkNQVSBwb2ludGVyCi0gKgotICogV2hlbiBleGNlcHRpb25zIG9jY3VyIHdoaWxlIGluc3RydWN0aW9ucyBhcmUgZXhlY3V0ZWQgaW4gVGh1bWIgSUYtVEhFTgotICogYmxvY2tzLCB0aGUgSVRTVEFURSBmaWVsZCBvZiB0aGUgQ1BTUiBpcyBub3QgYWR2YW5jZWQgKHVwZGF0ZWQpLCBzbyB3ZSBoYXZlCi0gKiB0byBkbyB0aGlzIGxpdHRsZSBiaXQgb2Ygd29yayBtYW51YWxseS4gVGhlIGZpZWxkcyBtYXAgbGlrZSB0aGlzOgotICoKLSAqIElUWzc6MF0gLT4gQ1BTUlsyNjoyNV0sQ1BTUlsxNToxMF0KLSAqLwotc3RhdGljIHZvaWQga3ZtX2FkanVzdF9pdHN0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQl1bnNpZ25lZCBsb25nIGl0Yml0cywgY29uZDsKLQl1bnNpZ25lZCBsb25nIGNwc3IgPSAqdmNwdV9jcHNyKHZjcHUpOwotCWJvb2wgaXNfYXJtID0gIShjcHNyICYgUFNSX1RfQklUKTsKLQotCUJVR19PTihpc19hcm0gJiYgKGNwc3IgJiBQU1JfSVRfTUFTSykpOwotCi0JaWYgKCEoY3BzciAmIFBTUl9JVF9NQVNLKSkKLQkJcmV0dXJuOwotCi0JY29uZCA9IChjcHNyICYgMHhlMDAwKSA+PiAxMzsKLQlpdGJpdHMgPSAoY3BzciAmIDB4MWMwMCkgPj4gKDEwIC0gMik7Ci0JaXRiaXRzIHw9IChjcHNyICYgKDB4MyA8PCAyNSkpID4+IDI1OwotCi0JLyogUGVyZm9ybSBJVEFkdmFuY2UgKHNlZSBwYWdlIEEtNTIgaW4gQVJNIERESSAwNDA2QykgKi8KLQlpZiAoKGl0Yml0cyAmIDB4NykgPT0gMCkKLQkJaXRiaXRzID0gY29uZCA9IDA7Ci0JZWxzZQotCQlpdGJpdHMgPSAoaXRiaXRzIDw8IDEpICYgMHgxZjsKLQotCWNwc3IgJj0gflBTUl9JVF9NQVNLOwotCWNwc3IgfD0gY29uZCA8PCAxMzsKLQljcHNyIHw9IChpdGJpdHMgJiAweDFjKSA8PCAoMTAgLSAyKTsKLQljcHNyIHw9IChpdGJpdHMgJiAweDMpIDw8IDI1OwotCSp2Y3B1X2Nwc3IodmNwdSkgPSBjcHNyOwotfQotCi0vKioKLSAqIGt2bV9za2lwX2luc3RyIC0gc2tpcCBhIHRyYXBwZWQgaW5zdHJ1Y3Rpb24gYW5kIHByb2NlZWQgdG8gdGhlIG5leHQKLSAqIEB2Y3B1OiBUaGUgdmNwdSBwb2ludGVyCi0gKi8KLXZvaWQga3ZtX3NraXBfaW5zdHIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBib29sIGlzX3dpZGVfaW5zdHIpCi17Ci0JYm9vbCBpc190aHVtYjsKLQotCWlzX3RodW1iID0gISEoKnZjcHVfY3Bzcih2Y3B1KSAmIFBTUl9UX0JJVCk7Ci0JaWYgKGlzX3RodW1iICYmICFpc193aWRlX2luc3RyKQotCQkqdmNwdV9wYyh2Y3B1KSArPSAyOwotCWVsc2UKLQkJKnZjcHVfcGModmNwdSkgKz0gNDsKLQlrdm1fYWRqdXN0X2l0c3RhdGUodmNwdSk7Ci19Ci0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSW5qZWN0IGV4Y2VwdGlvbnMgaW50byB0aGUgZ3Vlc3QKICAqLwpAQCAtNDAyLDMgKzMwMywxNSBAQAogewogCWluamVjdF9hYnQodmNwdSwgdHJ1ZSwgYWRkcik7CiB9CisKKy8qKgorICoga3ZtX2luamVjdF92YWJ0IC0gaW5qZWN0IGFuIGFzeW5jIGFib3J0IC8gU0Vycm9yIGludG8gdGhlIGd1ZXN0CisgKiBAdmNwdTogVGhlIFZDUFUgdG8gcmVjZWl2ZSB0aGUgZXhjZXB0aW9uCisgKgorICogSXQgaXMgYXNzdW1lZCB0aGF0IHRoaXMgY29kZSBpcyBjYWxsZWQgZnJvbSB0aGUgVkNQVSB0aHJlYWQgYW5kIHRoYXQgdGhlCisgKiBWQ1BVIHRoZXJlZm9yZSBpcyBub3QgY3VycmVudGx5IGV4ZWN1dGluZyBndWVzdCBjb2RlLgorICovCit2b2lkIGt2bV9pbmplY3RfdmFidChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJdmNwdV9zZXRfaGNyKHZjcHUsIHZjcHVfZ2V0X2hjcih2Y3B1KSB8IEhDUl9WQSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rdm0vaGFuZGxlX2V4aXQuYyBiL2FyY2gvYXJtL2t2bS9oYW5kbGVfZXhpdC5jCmluZGV4IDNmMWVmMGQuLjRlNDBkMTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2t2bS9oYW5kbGVfZXhpdC5jCisrKyBiL2FyY2gvYXJtL2t2bS9oYW5kbGVfZXhpdC5jCkBAIC0yOCwxNCArMjgsNiBAQAogCiB0eXBlZGVmIGludCAoKmV4aXRfaGFuZGxlX2ZuKShzdHJ1Y3Qga3ZtX3ZjcHUgKiwgc3RydWN0IGt2bV9ydW4gKik7CiAKLXN0YXRpYyBpbnQgaGFuZGxlX3N2Y19oeXAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqcnVuKQotewotCS8qIFNWQyBjYWxsZWQgZnJvbSBIeXAgbW9kZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUgKi8KLQlrdm1fZGVidWcoIlNWQyBjYWxsZWQgZnJvbSBIeXAgbW9kZSBzaG91bGRuJ3QgZ28gaGVyZVxuIik7Ci0JQlVHKCk7Ci0JcmV0dXJuIC1FSU5WQUw7IC8qIFNxdWFzaCB3YXJuaW5nICovCi19Ci0KIHN0YXRpYyBpbnQgaGFuZGxlX2h2YyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW4pCiB7CiAJaW50IHJldDsKQEAgLTU5LDIyICs1MSw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgaGFuZGxlX3BhYnRfaHlwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1bikKLXsKLQkvKiBUaGUgaHlwZXJ2aXNvciBzaG91bGQgbmV2ZXIgY2F1c2UgYWJvcnRzICovCi0Ja3ZtX2VycigiUHJlZmV0Y2ggQWJvcnQgdGFrZW4gZnJvbSBIeXAgbW9kZSBhdCAlIzA4bHggKEhTUjogJSMwOHgpXG4iLAotCQlrdm1fdmNwdV9nZXRfaGZhcih2Y3B1KSwga3ZtX3ZjcHVfZ2V0X2hzcih2Y3B1KSk7Ci0JcmV0dXJuIC1FRkFVTFQ7Ci19Ci0KLXN0YXRpYyBpbnQgaGFuZGxlX2RhYnRfaHlwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1bikKLXsKLQkvKiBUaGlzIGlzIGVpdGhlciBhbiBlcnJvciBpbiB0aGUgd3MuIGNvZGUgb3IgYW4gZXh0ZXJuYWwgYWJvcnQgKi8KLQlrdm1fZXJyKCJEYXRhIEFib3J0IHRha2VuIGZyb20gSHlwIG1vZGUgYXQgJSMwOGx4IChIU1I6ICUjMDh4KVxuIiwKLQkJa3ZtX3ZjcHVfZ2V0X2hmYXIodmNwdSksIGt2bV92Y3B1X2dldF9oc3IodmNwdSkpOwotCXJldHVybiAtRUZBVUxUOwotfQotCiAvKioKICAqIGt2bV9oYW5kbGVfd2Z4IC0gaGFuZGxlIGEgV0ZJIG9yIFdGRSBpbnN0cnVjdGlvbnMgdHJhcHBlZCBpbiBndWVzdHMKICAqIEB2Y3B1Ogl0aGUgdmNwdSBwb2ludGVyCkBAIC0xMTIsMTMgKzg4LDEwIEBACiAJW0hTUl9FQ19DUDE0XzY0XQk9IGt2bV9oYW5kbGVfY3AxNF9hY2Nlc3MsCiAJW0hTUl9FQ19DUF8wXzEzXQk9IGt2bV9oYW5kbGVfY3BfMF8xM19hY2Nlc3MsCiAJW0hTUl9FQ19DUDEwX0lEXQk9IGt2bV9oYW5kbGVfY3AxMF9pZCwKLQlbSFNSX0VDX1NWQ19IWVBdCT0gaGFuZGxlX3N2Y19oeXAsCiAJW0hTUl9FQ19IVkNdCQk9IGhhbmRsZV9odmMsCiAJW0hTUl9FQ19TTUNdCQk9IGhhbmRsZV9zbWMsCiAJW0hTUl9FQ19JQUJUXQkJPSBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0LAotCVtIU1JfRUNfSUFCVF9IWVBdCT0gaGFuZGxlX3BhYnRfaHlwLAogCVtIU1JfRUNfREFCVF0JCT0ga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydCwKLQlbSFNSX0VDX0RBQlRfSFlQXQk9IGhhbmRsZV9kYWJ0X2h5cCwKIH07CiAKIHN0YXRpYyBleGl0X2hhbmRsZV9mbiBrdm1fZ2V0X2V4aXRfaGFuZGxlcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCkBAIC0xNDQsNiArMTE3LDI1IEBACiB7CiAJZXhpdF9oYW5kbGVfZm4gZXhpdF9oYW5kbGVyOwogCisJaWYgKEFSTV9BQk9SVF9QRU5ESU5HKGV4Y2VwdGlvbl9pbmRleCkpIHsKKwkJdTggaHNyX2VjID0ga3ZtX3ZjcHVfdHJhcF9nZXRfY2xhc3ModmNwdSk7CisKKwkJLyoKKwkJICogSFZDL1NNQyBhbHJlYWR5IGhhdmUgYW4gYWRqdXN0ZWQgUEMsIHdoaWNoIHdlIG5lZWQKKwkJICogdG8gY29ycmVjdCBpbiBvcmRlciB0byByZXR1cm4gdG8gYWZ0ZXIgaGF2aW5nCisJCSAqIGluamVjdGVkIHRoZSBhYm9ydC4KKwkJICovCisJCWlmIChoc3JfZWMgPT0gSFNSX0VDX0hWQyB8fCBoc3JfZWMgPT0gSFNSX0VDX1NNQykgeworCQkJdTMyIGFkaiA9ICBrdm1fdmNwdV90cmFwX2lsX2lzMzJiaXQodmNwdSkgPyA0IDogMjsKKwkJCSp2Y3B1X3BjKHZjcHUpIC09IGFkajsKKwkJfQorCisJCWt2bV9pbmplY3RfdmFidCh2Y3B1KTsKKwkJcmV0dXJuIDE7CisJfQorCisJZXhjZXB0aW9uX2luZGV4ID0gQVJNX0VYQ0VQVElPTl9DT0RFKGV4Y2VwdGlvbl9pbmRleCk7CisKIAlzd2l0Y2ggKGV4Y2VwdGlvbl9pbmRleCkgewogCWNhc2UgQVJNX0VYQ0VQVElPTl9JUlE6CiAJCXJldHVybiAxOwpAQCAtMTYwLDYgKzE1Miw5IEBACiAJCWV4aXRfaGFuZGxlciA9IGt2bV9nZXRfZXhpdF9oYW5kbGVyKHZjcHUpOwogCiAJCXJldHVybiBleGl0X2hhbmRsZXIodmNwdSwgcnVuKTsKKwljYXNlIEFSTV9FWENFUFRJT05fREFUQV9BQk9SVDoKKwkJa3ZtX2luamVjdF92YWJ0KHZjcHUpOworCQlyZXR1cm4gMTsKIAlkZWZhdWx0OgogCQlrdm1fcHJfdW5pbXBsKCJVbnN1cHBvcnRlZCBleGNlcHRpb24gdHlwZTogJWQiLAogCQkJICAgICAgZXhjZXB0aW9uX2luZGV4KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2t2bS9oeXAvTWFrZWZpbGUgYi9hcmNoL2FybS9rdm0vaHlwL01ha2VmaWxlCmluZGV4IDhkZmE1ZjcuLjMwMjNiYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2t2bS9oeXAvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0va3ZtL2h5cC9NYWtlZmlsZQpAQCAtNSw2ICs1LDcgQEAKIEtWTT0uLi8uLi8uLi8uLi92aXJ0L2t2bQogCiBvYmotJChDT05GSUdfS1ZNX0FSTV9IT1NUKSArPSAkKEtWTSkvYXJtL2h5cC92Z2ljLXYyLXNyLm8KK29iai0kKENPTkZJR19LVk1fQVJNX0hPU1QpICs9ICQoS1ZNKS9hcm0vaHlwL3ZnaWMtdjMtc3Iubwogb2JqLSQoQ09ORklHX0tWTV9BUk1fSE9TVCkgKz0gJChLVk0pL2FybS9oeXAvdGltZXItc3IubwogCiBvYmotJChDT05GSUdfS1ZNX0FSTV9IT1NUKSArPSB0bGIubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va3ZtL2h5cC9lbnRyeS5TIGIvYXJjaC9hcm0va3ZtL2h5cC9lbnRyeS5TCmluZGV4IDIxYzIzODguLjYwNzgzZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2t2bS9oeXAvZW50cnkuUworKysgYi9hcmNoL2FybS9rdm0vaHlwL2VudHJ5LlMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL2t2bV9hcm0uaD4KKyNpbmNsdWRlIDxhc20va3ZtX2FzbS5oPgogCiAJLmFyY2hfZXh0ZW5zaW9uICAgICB2aXJ0CiAKQEAgLTYzLDYgKzY0LDM2IEBACiAJbGRyCWxyLCBbcjAsICM0XQogCiAJbW92CXIwLCByMQorCW1ycwlyMSwgU1BTUgorCW1ycwlyMiwgRUxSX2h5cAorCW1yYwlwMTUsIDQsIHIzLCBjNSwgYzIsIDAJQCBIU1IKKworCS8qCisJICogRm9yY2UgbG9hZHMgYW5kIHN0b3JlcyB0byBjb21wbGV0ZSBiZWZvcmUgdW5tYXNraW5nIGFib3J0cworCSAqIGFuZCBmb3JjaW5nIHRoZSBkZWxpdmVyeSBvZiB0aGUgZXhjZXB0aW9uLiBUaGlzIGdpdmVzIHVzIGEKKwkgKiBzaW5nbGUgaW5zdHJ1Y3Rpb24gd2luZG93LCB3aGljaCB0aGUgaGFuZGxlciB3aWxsIHRyeSB0bworCSAqIG1hdGNoLgorCSAqLworCWRzYglzeQorCWNwc2llCWEKKworCS5nbG9iYWwJYWJvcnRfZ3Vlc3RfZXhpdF9zdGFydAorYWJvcnRfZ3Vlc3RfZXhpdF9zdGFydDoKKworCWlzYgorCisJLmdsb2JhbAlhYm9ydF9ndWVzdF9leGl0X2VuZAorYWJvcnRfZ3Vlc3RfZXhpdF9lbmQ6CisKKwkvKgorCSAqIElmIHdlIHRvb2sgYW4gYWJvcnQsIHIwWzMxXSB3aWxsIGJlIHNldCwgYW5kIGNtcCB3aWxsIHNldAorCSAqIHRoZSBOIGJpdCBpbiBQU1RBVEUuCisJICovCisJY21wCXIwLCAjMAorCW1zcm1pCVNQU1JfY3hzZiwgcjEKKwltc3JtaQlFTFJfaHlwLCByMgorCW1jcm1pCXAxNSwgNCwgcjMsIGM1LCBjMiwgMAlAIEhTUgorCiAJYngJbHIKIEVORFBST0MoX19ndWVzdF9leGl0KQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rdm0vaHlwL2h5cC1lbnRyeS5TIGIvYXJjaC9hcm0va3ZtL2h5cC9oeXAtZW50cnkuUwppbmRleCA3ODA5MTM4Li45NmJlYjUzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rdm0vaHlwL2h5cC1lbnRyeS5TCisrKyBiL2FyY2gvYXJtL2t2bS9oeXAvaHlwLWVudHJ5LlMKQEAgLTgxLDcgKzgxLDYgQEAKIAlpbnZhbGlkX3ZlY3RvcgloeXBfdW5kZWYJQVJNX0VYQ0VQVElPTl9VTkRFRklORUQKIAlpbnZhbGlkX3ZlY3RvcgloeXBfc3ZjCQlBUk1fRVhDRVBUSU9OX1NPRlRXQVJFCiAJaW52YWxpZF92ZWN0b3IJaHlwX3BhYnQJQVJNX0VYQ0VQVElPTl9QUkVGX0FCT1JUCi0JaW52YWxpZF92ZWN0b3IJaHlwX2RhYnQJQVJNX0VYQ0VQVElPTl9EQVRBX0FCT1JUCiAJaW52YWxpZF92ZWN0b3IJaHlwX2ZpcQkJQVJNX0VYQ0VQVElPTl9GSVEKIAogRU5UUlkoX19oeXBfZG9fcGFuaWMpCkBAIC0xNjQsNiArMTYzLDIxIEBACiAJbG9hZF92Y3B1IHIwCQkJQCBMb2FkIFZDUFUgcG9pbnRlciB0byByMAogCWIJX19ndWVzdF9leGl0CiAKK2h5cF9kYWJ0OgorCXB1c2gJe3IwLCByMX0KKwltcnMJcjAsIEVMUl9oeXAKKwlsZHIJcjEsID1hYm9ydF9ndWVzdF9leGl0X3N0YXJ0CitUSFVNQigJYWRkCXIxLCByMSwgIzEpCisJY21wCXIwLCByMQorCWxkcm5lCXIxLCA9YWJvcnRfZ3Vlc3RfZXhpdF9lbmQKK1RIVU1CKAlhZGRuZQlyMSwgcjEsICMxKQorCWNtcG5lCXIwLCByMQorCXBvcAl7cjAsIHIxfQorCWJuZQlfX2h5cF9wYW5pYworCisJb3JyCXIwLCByMCwgIygxIDw8IEFSTV9FWElUX1dJVEhfQUJPUlRfQklUKQorCWVyZXQKKwogCS5sdG9yZwogCiAJLnBvcHNlY3Rpb24KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2t2bS9oeXAvc3dpdGNoLmMgYi9hcmNoL2FybS9rdm0vaHlwL3N3aXRjaC5jCmluZGV4IGIxM2NhYTkuLjkyNjc4YjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2t2bS9oeXAvc3dpdGNoLmMKKysrIGIvYXJjaC9hcm0va3ZtL2h5cC9zd2l0Y2guYwpAQCAtMTQsNiArMTQsNyBAQAogICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICovCisjaW5jbHVkZSA8bGludXgvanVtcF9sYWJlbC5oPgogCiAjaW5jbHVkZSA8YXNtL2t2bV9hc20uaD4KICNpbmNsdWRlIDxhc20va3ZtX2h5cC5oPgpAQCAtNTQsNiArNTUsMTUgQEAKIHsKIAl1MzIgdmFsOwogCisJLyoKKwkgKiBJZiB3ZSBwZW5kZWQgYSB2aXJ0dWFsIGFib3J0LCBwcmVzZXJ2ZSBpdCB1bnRpbCBpdCBnZXRzCisJICogY2xlYXJlZC4gU2VlIEIxLjkuOSAoVmlydHVhbCBBYm9ydCBleGNlcHRpb24pIGZvciBkZXRhaWxzLAorCSAqIGJ1dCB0aGUgY3J1Y2lhbCBiaXQgaXMgdGhlIHplcm9pbmcgb2YgSENSLlZBIGluIHRoZQorCSAqIHBzZXVkb2NvZGUuCisJICovCisJaWYgKHZjcHUtPmFyY2guaGNyICYgSENSX1ZBKQorCQl2Y3B1LT5hcmNoLmhjciA9IHJlYWRfc3lzcmVnKEhDUik7CisKIAl3cml0ZV9zeXNyZWcoMCwgSENSKTsKIAl3cml0ZV9zeXNyZWcoMCwgSFNUUik7CiAJdmFsID0gcmVhZF9zeXNyZWcoSERDUik7CkBAIC03NCwxNCArODQsMjEgQEAKIAl3cml0ZV9zeXNyZWcocmVhZF9zeXNyZWcoTUlEUiksIFZQSURSKTsKIH0KIAorCiBzdGF0aWMgdm9pZCBfX2h5cF90ZXh0IF9fdmdpY19zYXZlX3N0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQlfX3ZnaWNfdjJfc2F2ZV9zdGF0ZSh2Y3B1KTsKKwlpZiAoc3RhdGljX2JyYW5jaF91bmxpa2VseSgma3ZtX3ZnaWNfZ2xvYmFsX3N0YXRlLmdpY3YzX2NwdWlmKSkKKwkJX192Z2ljX3YzX3NhdmVfc3RhdGUodmNwdSk7CisJZWxzZQorCQlfX3ZnaWNfdjJfc2F2ZV9zdGF0ZSh2Y3B1KTsKIH0KIAogc3RhdGljIHZvaWQgX19oeXBfdGV4dCBfX3ZnaWNfcmVzdG9yZV9zdGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0JX192Z2ljX3YyX3Jlc3RvcmVfc3RhdGUodmNwdSk7CisJaWYgKHN0YXRpY19icmFuY2hfdW5saWtlbHkoJmt2bV92Z2ljX2dsb2JhbF9zdGF0ZS5naWN2M19jcHVpZikpCisJCV9fdmdpY192M19yZXN0b3JlX3N0YXRlKHZjcHUpOworCWVsc2UKKwkJX192Z2ljX3YyX3Jlc3RvcmVfc3RhdGUodmNwdSk7CiB9CiAKIHN0YXRpYyBib29sIF9faHlwX3RleHQgX19wb3B1bGF0ZV9mYXVsdF9pbmZvKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKQEAgLTEzNCw3ICsxNTEsNyBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgaW50IF9faHlwX3RleHQgX19ndWVzdF9ydW4oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoraW50IF9faHlwX3RleHQgX19rdm1fdmNwdV9ydW4oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXN0cnVjdCBrdm1fY3B1X2NvbnRleHQgKmhvc3RfY3R4dDsKIAlzdHJ1Y3Qga3ZtX2NwdV9jb250ZXh0ICpndWVzdF9jdHh0OwpAQCAtMTkxLDggKzIwOCw2IEBACiAJcmV0dXJuIGV4aXRfY29kZTsKIH0KIAotX19hbGlhcyhfX2d1ZXN0X3J1bikgaW50IF9fa3ZtX3ZjcHVfcnVuKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7Ci0KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgX19oeXBfcGFuaWNfc3RyaW5nW10gPSB7CiAJW0FSTV9FWENFUFRJT05fUkVTRVRdICAgICAgPSAiXG5IWVAgcGFuaWM6IFJTVCAgIFBDOiUwOHggQ1BTUjolMDh4IiwKIAlbQVJNX0VYQ0VQVElPTl9VTkRFRklORURdICA9ICJcbkhZUCBwYW5pYzogVU5ERUYgUEM6JTA4eCBDUFNSOiUwOHgiLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va3ZtL2h5cC90bGIuYyBiL2FyY2gvYXJtL2t2bS9oeXAvdGxiLmMKaW5kZXggYTI2MzYwMC4uNzI5NjUyOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va3ZtL2h5cC90bGIuYworKysgYi9hcmNoL2FybS9rdm0vaHlwL3RsYi5jCkBAIC0zNCw3ICszNCw3IEBACiAgKiBBcyB2NyBkb2VzIG5vdCBzdXBwb3J0IGZsdXNoaW5nIHBlciBJUEEsIGp1c3QgbnVrZSB0aGUgd2hvbGUgVExCCiAgKiBpbnN0ZWFkLCBpZ25vcmluZyB0aGUgaXBhIHZhbHVlLgogICovCi1zdGF0aWMgdm9pZCBfX2h5cF90ZXh0IF9fdGxiX2ZsdXNoX3ZtaWQoc3RydWN0IGt2bSAqa3ZtKQordm9pZCBfX2h5cF90ZXh0IF9fa3ZtX3RsYl9mbHVzaF92bWlkKHN0cnVjdCBrdm0gKmt2bSkKIHsKIAlkc2IoaXNoc3QpOwogCkBAIC01MCwyMSArNTAsMTQgQEAKIAl3cml0ZV9zeXNyZWcoMCwgVlRUQlIpOwogfQogCi1fX2FsaWFzKF9fdGxiX2ZsdXNoX3ZtaWQpIHZvaWQgX19rdm1fdGxiX2ZsdXNoX3ZtaWQoc3RydWN0IGt2bSAqa3ZtKTsKLQotc3RhdGljIHZvaWQgX19oeXBfdGV4dCBfX3RsYl9mbHVzaF92bWlkX2lwYShzdHJ1Y3Qga3ZtICprdm0sIHBoeXNfYWRkcl90IGlwYSkKK3ZvaWQgX19oeXBfdGV4dCBfX2t2bV90bGJfZmx1c2hfdm1pZF9pcGEoc3RydWN0IGt2bSAqa3ZtLCBwaHlzX2FkZHJfdCBpcGEpCiB7Ci0JX190bGJfZmx1c2hfdm1pZChrdm0pOworCV9fa3ZtX3RsYl9mbHVzaF92bWlkKGt2bSk7CiB9CiAKLV9fYWxpYXMoX190bGJfZmx1c2hfdm1pZF9pcGEpIHZvaWQgX19rdm1fdGxiX2ZsdXNoX3ZtaWRfaXBhKHN0cnVjdCBrdm0gKmt2bSwKLQkJCQkJCQkgICAgcGh5c19hZGRyX3QgaXBhKTsKLQotc3RhdGljIHZvaWQgX19oeXBfdGV4dCBfX3RsYl9mbHVzaF92bV9jb250ZXh0KHZvaWQpCit2b2lkIF9faHlwX3RleHQgX19rdm1fZmx1c2hfdm1fY29udGV4dCh2b2lkKQogewogCXdyaXRlX3N5c3JlZygwLCBUTEJJQUxMTlNOSElTKTsKIAl3cml0ZV9zeXNyZWcoMCwgSUNJQUxMVUlTKTsKIAlkc2IoaXNoKTsKIH0KLQotX19hbGlhcyhfX3RsYl9mbHVzaF92bV9jb250ZXh0KSB2b2lkIF9fa3ZtX2ZsdXNoX3ZtX2NvbnRleHQodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rdm0vbW1pby5jIGIvYXJjaC9hcm0va3ZtL21taW8uYwppbmRleCAxMGY4MGE2Li5iNmU3MTVmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rdm0vbW1pby5jCisrKyBiL2FyY2gvYXJtL2t2bS9tbWlvLmMKQEAgLTEyNiwxMiArMTI2LDYgQEAKIAlpbnQgYWNjZXNzX3NpemU7CiAJYm9vbCBzaWduX2V4dGVuZDsKIAotCWlmIChrdm1fdmNwdV9kYWJ0X2lzZXh0YWJ0KHZjcHUpKSB7Ci0JCS8qIGNhY2hlIG9wZXJhdGlvbiBvbiBJL08gYWRkciwgdGVsbCBndWVzdCB1bnN1cHBvcnRlZCAqLwotCQlrdm1faW5qZWN0X2RhYnQodmNwdSwga3ZtX3ZjcHVfZ2V0X2hmYXIodmNwdSkpOwotCQlyZXR1cm4gMTsKLQl9Ci0KIAlpZiAoa3ZtX3ZjcHVfZGFidF9pc3MxdHcodmNwdSkpIHsKIAkJLyogcGFnZSB0YWJsZSBhY2Nlc3NlcyBJTyBtZW06IHRlbGwgZ3Vlc3QgdG8gZml4IGl0cyBUVEJSICovCiAJCWt2bV9pbmplY3RfZGFidCh2Y3B1LCBrdm1fdmNwdV9nZXRfaGZhcih2Y3B1KSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rdm0vbW11LmMgYi9hcmNoL2FybS9rdm0vbW11LmMKaW5kZXggYmRhMjdiNi4uYTUyNjVlZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va3ZtL21tdS5jCisrKyBiL2FyY2gvYXJtL2t2bS9tbXUuYwpAQCAtNzQ0LDcgKzc0NCw2IEBACiAJaWYgKCFwZ2QpCiAJCXJldHVybiAtRU5PTUVNOwogCi0Ja3ZtX2NsZWFuX3BnZChwZ2QpOwogCWt2bS0+YXJjaC5wZ2QgPSBwZ2Q7CiAJcmV0dXJuIDA7CiB9CkBAIC05MzYsNyArOTM1LDYgQEAKIAkJaWYgKCFjYWNoZSkKIAkJCXJldHVybiAwOyAvKiBpZ25vcmUgY2FsbHMgZnJvbSBrdm1fc2V0X3NwdGVfaHZhICovCiAJCXB0ZSA9IG1tdV9tZW1vcnlfY2FjaGVfYWxsb2MoY2FjaGUpOwotCQlrdm1fY2xlYW5fcHRlKHB0ZSk7CiAJCXBtZF9wb3B1bGF0ZV9rZXJuZWwoTlVMTCwgcG1kLCBwdGUpOwogCQlnZXRfcGFnZSh2aXJ0X3RvX3BhZ2UocG1kKSk7CiAJfQpAQCAtMTMwOSw3ICsxMzA3LDcgQEAKIAlzbXBfcm1iKCk7CiAKIAlwZm4gPSBnZm5fdG9fcGZuX3Byb3Qoa3ZtLCBnZm4sIHdyaXRlX2ZhdWx0LCAmd3JpdGFibGUpOwotCWlmIChpc19lcnJvcl9wZm4ocGZuKSkKKwlpZiAoaXNfZXJyb3Jfbm9zbG90X3BmbihwZm4pKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCWlmIChrdm1faXNfZGV2aWNlX3BmbihwZm4pKSB7CkBAIC0xNDM0LDYgKzE0MzIsMTEgQEAKIAlpbnQgcmV0LCBpZHg7CiAKIAlpc19pYWJ0ID0ga3ZtX3ZjcHVfdHJhcF9pc19pYWJ0KHZjcHUpOworCWlmICh1bmxpa2VseSghaXNfaWFidCAmJiBrdm1fdmNwdV9kYWJ0X2lzZXh0YWJ0KHZjcHUpKSkgeworCQlrdm1faW5qZWN0X3ZhYnQodmNwdSk7CisJCXJldHVybiAxOworCX0KKwogCWZhdWx0X2lwYSA9IGt2bV92Y3B1X2dldF9mYXVsdF9pcGEodmNwdSk7CiAKIAl0cmFjZV9rdm1fZ3Vlc3RfZmF1bHQoKnZjcHVfcGModmNwdSksIGt2bV92Y3B1X2dldF9oc3IodmNwdSksCkBAIC0xNzE0LDcgKzE3MTcsOCBAQAogCQkga2Vybl9oeXBfdmEoUEFHRV9PRkZTRVQpLCBrZXJuX2h5cF92YSh+MFVMKSk7CiAKIAlpZiAoaHlwX2lkbWFwX3N0YXJ0ID49IGtlcm5faHlwX3ZhKFBBR0VfT0ZGU0VUKSAmJgotCSAgICBoeXBfaWRtYXBfc3RhcnQgPCAga2Vybl9oeXBfdmEofjBVTCkpIHsKKwkgICAgaHlwX2lkbWFwX3N0YXJ0IDwgIGtlcm5faHlwX3ZhKH4wVUwpICYmCisJICAgIGh5cF9pZG1hcF9zdGFydCAhPSAodW5zaWduZWQgbG9uZylfX2h5cF9pZG1hcF90ZXh0X3N0YXJ0KSB7CiAJCS8qCiAJCSAqIFRoZSBpZG1hcCBwYWdlIGlzIGludGVyc2VjdGluZyB3aXRoIHRoZSBWQSBzcGFjZSwKIAkJICogaXQgaXMgbm90IHNhZmUgdG8gY29udGludWUgZnVydGhlci4KQEAgLTE4OTMsNiArMTg5Nyw3IEBACiAKIHZvaWQga3ZtX2FyY2hfZmx1c2hfc2hhZG93X2FsbChzdHJ1Y3Qga3ZtICprdm0pCiB7CisJa3ZtX2ZyZWVfc3RhZ2UyX3BnZChrdm0pOwogfQogCiB2b2lkIGt2bV9hcmNoX2ZsdXNoX3NoYWRvd19tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9kZWxheS5jIGIvYXJjaC9hcm0vbGliL2RlbGF5LmMKaW5kZXggODA0NDU5MS4uMmNlZjExOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbGliL2RlbGF5LmMKKysrIGIvYXJjaC9hcm0vbGliL2RlbGF5LmMKQEAgLTI5LDcgKzI5LDcgQEAKIC8qCiAgKiBEZWZhdWx0IHRvIHRoZSBsb29wLWJhc2VkIGRlbGF5IGltcGxlbWVudGF0aW9uLgogICovCi1zdHJ1Y3QgYXJtX2RlbGF5X29wcyBhcm1fZGVsYXlfb3BzID0geworc3RydWN0IGFybV9kZWxheV9vcHMgYXJtX2RlbGF5X29wcyBfX3JvX2FmdGVyX2luaXQgPSB7CiAJLmRlbGF5CQk9IF9fbG9vcF9kZWxheSwKIAkuY29uc3RfdWRlbGF5CT0gX19sb29wX2NvbnN0X3VkZWxheSwKIAkudWRlbGF5CQk9IF9fbG9vcF91ZGVsYXksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWJjbS9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1iY20vS2NvbmZpZwppbmRleCAzNGYwZmNhLi43YmYzYWU3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWJjbS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtYmNtL0tjb25maWcKQEAgLTE1LDcgKzE1LDYgQEAKIAlzZWxlY3QgSEFWRV9BUk1fU0NVIGlmIFNNUAogCXNlbGVjdCBIQVZFX0FSTV9UV0QgaWYgU01QCiAJc2VsZWN0IEFSTV9HTE9CQUxfVElNRVIKLQlzZWxlY3QgQ09NTU9OX0NMS19JUFJPQwogCXNlbGVjdCBDTEtTUkNfTU1JTwogCXNlbGVjdCBHUElPTElCCiAJc2VsZWN0IEFSTV9BTUJBCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vcy9zdXNwZW5kLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9zdXNwZW5kLmMKaW5kZXggMzc1MDU3NS4uMDYzMzJmNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3Mvc3VzcGVuZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL3N1c3BlbmQuYwpAQCAtMjU1LDYgKzI1NSwxMiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKKwkvKgorCSAqIENsZWFyIHRoZSBPRl9QT1BVTEFURUQgZmxhZyBzZXQgaW4gb2ZfaXJxX2luaXQgc28gdGhhdAorCSAqIGxhdGVyIHRoZSBFeHlub3MgUE1VIHBsYXRmb3JtIGRldmljZSB3b24ndCBiZSBza2lwcGVkLgorCSAqLworCW9mX25vZGVfY2xlYXJfZmxhZyhub2RlLCBPRl9QT1BVTEFURUQpOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaCBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAppbmRleCAwMmY2ZDdhLi4yMGQ1YWQ3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCkBAIC01OSw3ICs1OSw3IEBACiAjZGVmaW5lIFhCVVNfU1dJVENIX0oxN18xMQkoKCpYQlVTX1NXSVRDSCkgJiAoMSA8PCA1KSkKICNkZWZpbmUgWEJVU19TV0lUQ0hfSjE3XzkJKCgqWEJVU19TV0lUQ0gpICYgKDEgPDwgNikpCiAKLSNkZWZpbmUgVU5DQUNIRUFCTEVfQUREUgkoQVJNQ1NSX0JBU0UgKyAweDEwOCkKKyNkZWZpbmUgVU5DQUNIRUFCTEVfQUREUgkoQVJNQ1NSX0JBU0UgKyAweDEwOCkJLyogQ1NSX1JPTUJBU0VNQVNLICovCiAKIAogLyogUElDIGlycSBjb250cm9sICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9ncGMuYyBiL2FyY2gvYXJtL21hY2gtaW14L2dwYy5jCmluZGV4IGZkODcyMDUuLjBkZjA2MmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2dwYy5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2dwYy5jCkBAIC0yNzEsNiArMjcxLDEyIEBACiAJZm9yIChpID0gMDsgaSA8IElNUl9OVU07IGkrKykKIAkJd3JpdGVsX3JlbGF4ZWQofjAsIGdwY19iYXNlICsgR1BDX0lNUjEgKyBpICogNCk7CiAKKwkvKgorCSAqIENsZWFyIHRoZSBPRl9QT1BVTEFURUQgZmxhZyBzZXQgaW4gb2ZfaXJxX2luaXQgc28gdGhhdAorCSAqIGxhdGVyIHRoZSBHUEMgcG93ZXIgZG9tYWluIGRyaXZlciB3aWxsIG5vdCBiZSBza2lwcGVkLgorCSAqLworCW9mX25vZGVfY2xlYXJfZmxhZyhub2RlLCBPRl9QT1BVTEFURUQpOworCiAJcmV0dXJuIDA7CiB9CiBJUlFDSElQX0RFQ0xBUkUoaW14X2dwYywgImZzbCxpbXg2cS1ncGMiLCBpbXhfZ3BjX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1pbXg2dWwuYyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtaW14NnVsLmMKaW5kZXggNWQ5YmZhYi4uNmJiN2Q5YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1pbXg2dWwuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWlteDZ1bC5jCkBAIC02NCw2ICs2NCw3IEBACiAJaWYgKHBhcmVudCA9PSBOVUxMKQogCQlwcl93YXJuKCJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBzb2MgZGV2aWNlXG4iKTsKIAorCW9mX3BsYXRmb3JtX2RlZmF1bHRfcG9wdWxhdGUoTlVMTCwgTlVMTCwgcGFyZW50KTsKIAlpbXg2dWxfZW5ldF9pbml0KCk7CiAJaW14X2FuYXRvcF9pbml0KCk7CiAJaW14NnVsX3BtX2luaXQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L3BtLWlteDYuYyBiL2FyY2gvYXJtL21hY2gtaW14L3BtLWlteDYuYwppbmRleCA1ODkyNGIzLi5mZTcwOGUyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9wbS1pbXg2LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvcG0taW14Ni5jCkBAIC0yOTUsNyArMjk1LDcgQEAKIAkJdmFsICY9IH5CTV9DTFBDUl9TQllPUzsKIAkJaWYgKGNwdV9pc19pbXg2c2woKSkKIAkJCXZhbCB8PSBCTV9DTFBDUl9CWVBBU1NfUE1JQ19SRUFEWTsKLQkJaWYgKGNwdV9pc19pbXg2c2woKSB8fCBjcHVfaXNfaW14NnN4KCkpCisJCWlmIChjcHVfaXNfaW14NnNsKCkgfHwgY3B1X2lzX2lteDZzeCgpIHx8IGNwdV9pc19pbXg2dWwoKSkKIAkJCXZhbCB8PSBCTV9DTFBDUl9CWVBfTU1EQ19DSDBfTFBNX0hTOwogCQllbHNlCiAJCQl2YWwgfD0gQk1fQ0xQQ1JfQllQX01NRENfQ0gxX0xQTV9IUzsKQEAgLTMxMCw3ICszMTAsNyBAQAogCQl2YWwgfD0gMHgzIDw8IEJQX0NMUENSX1NUQllfQ09VTlQ7CiAJCXZhbCB8PSBCTV9DTFBDUl9WU1RCWTsKIAkJdmFsIHw9IEJNX0NMUENSX1NCWU9TOwotCQlpZiAoY3B1X2lzX2lteDZzbCgpKQorCQlpZiAoY3B1X2lzX2lteDZzbCgpIHx8IGNwdV9pc19pbXg2c3goKSkKIAkJCXZhbCB8PSBCTV9DTFBDUl9CWVBBU1NfUE1JQ19SRUFEWTsKIAkJaWYgKGNwdV9pc19pbXg2c2woKSB8fCBjcHVfaXNfaW14NnN4KCkgfHwgY3B1X2lzX2lteDZ1bCgpKQogCQkJdmFsIHw9IEJNX0NMUENSX0JZUF9NTURDX0NIMF9MUE1fSFM7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEtcGVyaXBoZXJhbHMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS1wZXJpcGhlcmFscy5jCmluZGV4IGE1YWI3MTIuLjZkM2FmNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS1wZXJpcGhlcmFscy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS1wZXJpcGhlcmFscy5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvcG93ZXIvaXNwMTcwNF9jaGFyZ2VyLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9zcGktb21hcDItbWNzcGkuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL210ZC1vbmVuYW5kLW9tYXAyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxwbGF0L2RtdGltZXIuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbTMzeHguYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY20zM3h4LmMKaW5kZXggYzA3M2ZiNS4uNmYyZDBhZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbTMzeHguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NtMzN4eC5jCkBAIC0yMjAsOSArMjIwLDYgQEAKIHsKIAlpbnQgaSA9IDA7CiAKLQlpZiAoIWNsa2N0cmxfb2ZmcykKLQkJcmV0dXJuIDA7Ci0KIAlvbWFwX3Rlc3RfdGltZW91dChfaXNfbW9kdWxlX3JlYWR5KGluc3QsIGNsa2N0cmxfb2ZmcyksCiAJCQkgIE1BWF9NT0RVTEVfUkVBRFlfVElNRSwgaSk7CiAKQEAgLTI0Niw5ICsyNDMsNiBAQAogewogCWludCBpID0gMDsKIAotCWlmICghY2xrY3RybF9vZmZzKQotCQlyZXR1cm4gMDsKLQogCW9tYXBfdGVzdF90aW1lb3V0KChfY2xrY3RybF9pZGxlc3QoaW5zdCwgY2xrY3RybF9vZmZzKSA9PQogCQkJCUNMS0NUUkxfSURMRVNUX0RJU0FCTEVEKSwKIAkJCQlNQVhfTU9EVUxFX1JFQURZX1RJTUUsIGkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbWluc3Q0NHh4LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NtaW5zdDQ0eHguYwppbmRleCAyYzBlMDdlLi4yYWIyN2FkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2NtaW5zdDQ0eHguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NtaW5zdDQ0eHguYwpAQCAtMjc4LDkgKzI3OCw2IEBACiB7CiAJaW50IGkgPSAwOwogCi0JaWYgKCFjbGtjdHJsX29mZnMpCi0JCXJldHVybiAwOwotCiAJb21hcF90ZXN0X3RpbWVvdXQoX2lzX21vZHVsZV9yZWFkeShwYXJ0LCBpbnN0LCBjbGtjdHJsX29mZnMpLAogCQkJICBNQVhfTU9EVUxFX1JFQURZX1RJTUUsIGkpOwogCkBAIC0zMDQsOSArMzAxLDYgQEAKIHsKIAlpbnQgaSA9IDA7CiAKLQlpZiAoIWNsa2N0cmxfb2ZmcykKLQkJcmV0dXJuIDA7Ci0KIAlvbWFwX3Rlc3RfdGltZW91dCgoX2Nsa2N0cmxfaWRsZXN0KHBhcnQsIGluc3QsIGNsa2N0cmxfb2ZmcykgPT0KIAkJCSAgIENMS0NUUkxfSURMRVNUX0RJU0FCTEVEKSwKIAkJCSAgTUFYX01PRFVMRV9ESVNBQkxFX1RJTUUsIGkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwLXdha2V1cGdlbi5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwLXdha2V1cGdlbi5jCmluZGV4IDBjNDc1NDMuLjM2OWY5NWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcC13YWtldXBnZW4uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXAtd2FrZXVwZ2VuLmMKQEAgLTMyMiwzNCArMzIyLDI1IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotc3RhdGljIGludCBpcnFfY3B1X2hvdHBsdWdfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQorc3RhdGljIGludCBvbWFwX3dha2V1cGdlbl9jcHVfb25saW5lKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0JdW5zaWduZWQgaW50IGNwdSA9ICh1bnNpZ25lZCBpbnQpaGNwdTsKLQotCS8qCi0JICogQ29ycmVzcG9uZGluZyBGUk9aRU4gdHJhbnNpdGlvbnMgZG8gbm90IGhhdmUgdG8gYmUgaGFuZGxlZCwKLQkgKiB0aGV5IGFyZSBoYW5kbGVkIGJ5IGF0IGEgaGlnaGVyIGxldmVsCi0JICogKGRyaXZlcnMvY3B1aWRsZS9jb3VwbGVkLmMpLgotCSAqLwotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBDUFVfT05MSU5FOgotCQl3YWtldXBnZW5faXJxbWFza19hbGwoY3B1LCAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBDUFVfREVBRDoKLQkJd2FrZXVwZ2VuX2lycW1hc2tfYWxsKGNwdSwgMSk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gTk9USUZZX09LOworCXdha2V1cGdlbl9pcnFtYXNrX2FsbChjcHUsIDApOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGlycV9ob3RwbHVnX25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsID0gaXJxX2NwdV9ob3RwbHVnX25vdGlmeSwKLX07CitzdGF0aWMgaW50IG9tYXBfd2FrZXVwZ2VuX2NwdV9kZWFkKHVuc2lnbmVkIGludCBjcHUpCit7CisJd2FrZXVwZ2VuX2lycW1hc2tfYWxsKGNwdSwgMSk7CisJcmV0dXJuIDA7Cit9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBpcnFfaG90cGx1Z19pbml0KHZvaWQpCiB7Ci0JcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZpcnFfaG90cGx1Z19ub3RpZmllcik7CisJY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9BUF9PTkxJTkVfRFlOLCAiYXJtL29tYXAtd2FrZTpvbmxpbmUiLAorCQkJCSAgb21hcF93YWtldXBnZW5fY3B1X29ubGluZSwgTlVMTCk7CisJY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9BUk1fT01BUF9XQUtFX0RFQUQsCisJCQkJICAiYXJtL29tYXAtd2FrZTpkZWFkIiwgTlVMTCwKKwkJCQkgIG9tYXBfd2FrZXVwZ2VuX2NwdV9kZWFkKTsKIH0KICNlbHNlCiBzdGF0aWMgdm9pZCBfX2luaXQgaXJxX2hvdHBsdWdfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2QuYwppbmRleCA1YjcwOTM4Li4xMDUyYjI5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2QuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2QuYwpAQCAtMTA1Myw2ICsxMDUzLDEwIEBACiAJaWYgKG9oLT5mbGFncyAmIEhXTU9EX05PX0lETEVTVCkKIAkJcmV0dXJuIDA7CiAKKwlpZiAoIW9oLT5wcmNtLm9tYXA0LmNsa2N0cmxfb2ZmcyAmJgorCSAgICAhKG9oLT5wcmNtLm9tYXA0LmZsYWdzICYgSFdNT0RfT01BUDRfWkVST19DTEtDVFJMX09GRlNFVCkpCisJCXJldHVybiAwOworCiAJcmV0dXJuIG9tYXBfY21fd2FpdF9tb2R1bGVfaWRsZShvaC0+Y2xrZG0tPnByY21fcGFydGl0aW9uLAogCQkJCQlvaC0+Y2xrZG0tPmNtX2luc3QsCiAJCQkJCW9oLT5wcmNtLm9tYXA0LmNsa2N0cmxfb2ZmcywgMCk7CkBAIC0yOTcxLDYgKzI5NzUsMTAgQEAKIAlpZiAoIV9maW5kX21wdV9ydF9wb3J0KG9oKSkKIAkJcmV0dXJuIDA7CiAKKwlpZiAoIW9oLT5wcmNtLm9tYXA0LmNsa2N0cmxfb2ZmcyAmJgorCSAgICAhKG9oLT5wcmNtLm9tYXA0LmZsYWdzICYgSFdNT0RfT01BUDRfWkVST19DTEtDVFJMX09GRlNFVCkpCisJCXJldHVybiAwOworCiAJLyogWFhYIGNoZWNrIG1vZHVsZSBTSURMRU1PREUsIGhhcmRyZXNldCBzdGF0dXMgKi8KIAogCXJldHVybiBvbWFwX2NtX3dhaXRfbW9kdWxlX3JlYWR5KG9oLT5jbGtkbS0+cHJjbV9wYXJ0aXRpb24sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2QuaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZC5oCmluZGV4IDQwNDFiYWQuLjc4OTA0MDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZC5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZC5oCkBAIC00NDMsOCArNDQzLDEyIEBACiAgKiBIV01PRF9PTUFQNF9OT19DT05URVhUX0xPU1NfQklUOiBTb21lIElQIGJsb2NrcyBkb24ndCBoYXZlIGEgUFJDTQogICogICAgIG1vZHVsZS1sZXZlbCBjb250ZXh0IGxvc3MgcmVnaXN0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZW07IHRoaXMKICAqICAgICBmbGFnIGJpdCBzaG91bGQgYmUgc2V0IGluIHRob3NlIGNhc2VzCisgKiBIV01PRF9PTUFQNF9aRVJPX0NMS0NUUkxfT0ZGU0VUOiBTb21lIElQIGJsb2NrcyBoYXZlIGEgdmFsaWQgQ0xLQ1RSTAorICoJb2Zmc2V0IG9mIHplcm87IHRoaXMgZmxhZyBiaXQgc2hvdWxkIGJlIHNldCBpbiB0aG9zZSBjYXNlcyB0bworICoJZGlzdGluZ3Vpc2ggZnJvbSBod21vZHMgdGhhdCBoYXZlIG5vIGNsa2N0cmwgb2Zmc2V0LgogICovCiAjZGVmaW5lIEhXTU9EX09NQVA0X05PX0NPTlRFWFRfTE9TU19CSVQJCSgxIDw8IDApCisjZGVmaW5lIEhXTU9EX09NQVA0X1pFUk9fQ0xLQ1RSTF9PRkZTRVQJCSgxIDw8IDEpCiAKIC8qKgogICogc3RydWN0IG9tYXBfaHdtb2Rfb21hcDRfcHJjbSAtIE9NQVA0LXNwZWNpZmljIFBSQ00gZGF0YQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzMzeHhfNDN4eF9pcGJsb2NrX2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8zM3h4XzQzeHhfaXBibG9ja19kYXRhLmMKaW5kZXggNTVjNTg3OC4uZTJkODRhYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzMzeHhfNDN4eF9pcGJsb2NrX2RhdGEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfMzN4eF80M3h4X2lwYmxvY2tfZGF0YS5jCkBAIC0yOSw2ICsyOSw3IEBACiAjZGVmaW5lIENMS0NUUkwob2gsIGNsa2N0cmwpICgob2gpLnByY20ub21hcDQuY2xrY3RybF9vZmZzID0gKGNsa2N0cmwpKQogI2RlZmluZSBSU1RDVFJMKG9oLCByc3RjdHJsKSAoKG9oKS5wcmNtLm9tYXA0LnJzdGN0cmxfb2ZmcyA9IChyc3RjdHJsKSkKICNkZWZpbmUgUlNUU1Qob2gsIHJzdHN0KSAoKG9oKS5wcmNtLm9tYXA0LnJzdHN0X29mZnMgPSAocnN0c3QpKQorI2RlZmluZSBQUkNNX0ZMQUdTKG9oLCBmbGFnKSAoKG9oKS5wcmNtLm9tYXA0LmZsYWdzID0gKGZsYWcpKQogCiAvKgogICogJ2wzJyBjbGFzcwpAQCAtMTI5Niw2ICsxMjk3LDcgQEAKIAlDTEtDVFJMKGFtMzN4eF9pMmMxX2h3bW9kLCBBTTMzWFhfQ01fV0tVUF9JMkMwX0NMS0NUUkxfT0ZGU0VUKTsKIAlDTEtDVFJMKGFtMzN4eF93ZF90aW1lcjFfaHdtb2QsIEFNMzNYWF9DTV9XS1VQX1dEVDFfQ0xLQ1RSTF9PRkZTRVQpOwogCUNMS0NUUkwoYW0zM3h4X3J0Y19od21vZCwgQU0zM1hYX0NNX1JUQ19SVENfQ0xLQ1RSTF9PRkZTRVQpOworCVBSQ01fRkxBR1MoYW0zM3h4X3J0Y19od21vZCwgSFdNT0RfT01BUDRfWkVST19DTEtDVFJMX09GRlNFVCk7CiAJQ0xLQ1RSTChhbTMzeHhfbW1jMl9od21vZCwgQU0zM1hYX0NNX1BFUl9NTUMyX0NMS0NUUkxfT0ZGU0VUKTsKIAlDTEtDVFJMKGFtMzN4eF9ncG1jX2h3bW9kLCBBTTMzWFhfQ01fUEVSX0dQTUNfQ0xLQ1RSTF9PRkZTRVQpOwogCUNMS0NUUkwoYW0zM3h4X2w0X2xzX2h3bW9kLCBBTTMzWFhfQ01fUEVSX0w0TFNfQ0xLQ1RSTF9PRkZTRVQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzN4eHhfZGF0YS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzN4eHhfZGF0YS5jCmluZGV4IGQ3MmVlNjEuLjFjYzRhNmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8zeHh4X2RhdGEuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfM3h4eF9kYXRhLmMKQEAgLTcyMiw4ICs3MjIsMjAgQEAKICAqIGRpc3BsYXkgc2VyaWFsIGludGVyZmFjZSBjb250cm9sbGVyCiAgKi8KIAorc3RhdGljIHN0cnVjdCBvbWFwX2h3bW9kX2NsYXNzX3N5c2NvbmZpZyBvbWFwM3h4eF9kc2lfc3lzYyA9IHsKKwkucmV2X29mZnMJPSAweDAwMDAsCisJLnN5c2Nfb2Zmcwk9IDB4MDAxMCwKKwkuc3lzc19vZmZzCT0gMHgwMDE0LAorCS5zeXNjX2ZsYWdzCT0gKFNZU0NfSEFTX0FVVE9JRExFIHwgU1lTQ19IQVNfQ0xPQ0tBQ1RJVklUWSB8CisJCQkgICBTWVNDX0hBU19FTkFXQUtFVVAgfCBTWVNDX0hBU19TSURMRU1PREUgfAorCQkJICAgU1lTQ19IQVNfU09GVFJFU0VUIHwgU1lTU19IQVNfUkVTRVRfU1RBVFVTKSwKKwkuaWRsZW1vZGVzCT0gKFNJRExFX0ZPUkNFIHwgU0lETEVfTk8gfCBTSURMRV9TTUFSVCksCisJLnN5c2NfZmllbGRzCT0gJm9tYXBfaHdtb2Rfc3lzY190eXBlMSwKK307CisKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9jbGFzcyBvbWFwM3h4eF9kc2lfaHdtb2RfY2xhc3MgPSB7CiAJLm5hbWUgPSAiZHNpIiwKKwkuc3lzYwk9ICZvbWFwM3h4eF9kc2lfc3lzYywKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9pcnFfaW5mbyBvbWFwM3h4eF9kc2kxX2lycXNbXSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2h4NDcwMC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvaHg0NzAwLmMKaW5kZXggNGEyZjlhYi4uNjYxODRmNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaHg0NzAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaHg0NzAwLmMKQEAgLTI0LDEwICsyNCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQvbmF2cG9pbnQuaD4KICNpbmNsdWRlIDxsaW51eC9sY2QuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvaHRjLWVncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL2FzaWMzLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9wZGFfcG93ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL2dwaW8taHRjLWVncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcHdtLmg+CiAjaW5jbHVkZSA8bGludXgvcHdtX2JhY2tsaWdodC5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2lkcC5jIGIvYXJjaC9hcm0vbWFjaC1weGEvaWRwLmMKaW5kZXggYzQxMGQ4NC4uNjYwNzBhYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaWRwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaWRwLmMKQEAgLTgzLDcgKzgzLDggQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc21jOTF4X3BsYXRkYXRhIHNtYzkxeF9wbGF0ZGF0YSA9IHsKLQkuZmxhZ3MgPSBTTUM5MVhfVVNFXzMyQklUIHwgU01DOTFYX1VTRV9ETUEgfCBTTUM5MVhfTk9XQUlULAorCS5mbGFncyA9IFNNQzkxWF9VU0VfOEJJVCB8IFNNQzkxWF9VU0VfMTZCSVQgfCBTTUM5MVhfVVNFXzMyQklUIHwKKwkJIFNNQzkxWF9VU0VfRE1BIHwgU01DOTFYX05PV0FJVCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNtYzkxeF9kZXZpY2UgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9sdWJib2NrLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9sdWJib2NrLmMKaW5kZXggNzI0NWYzMy4uZDYxNTlmOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvbHViYm9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2x1YmJvY2suYwpAQCAtMTM3LDYgKzEzNywxOCBAQAogCS8vIG5vIEQrIHB1bGx1cDsgbHViYm9jayBjYW4ndCBjb25uZWN0L2Rpc2Nvbm5lY3QgaW4gc29mdHdhcmUKIH07CiAKK3N0YXRpYyB2b2lkIGx1YmJvY2tfaW5pdF9wY21jaWEodm9pZCkKK3sKKwlzdHJ1Y3QgY2xrICpjbGs7CisKKwkvKiBBZGQgYW4gYWxpYXMgZm9yIHRoZSBTQTExMTEgUENNQ0lBIGNsb2NrICovCisJY2xrID0gY2xrX2dldF9zeXMoInB4YTJ4eC1wY21jaWEiLCBOVUxMKTsKKwlpZiAoIUlTX0VSUihjbGspKSB7CisJCWNsa2Rldl9jcmVhdGUoY2xrLCBOVUxMLCAiMTgwMCIpOworCQljbGtfcHV0KGNsayk7CisJfQorfQorCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHNhMTExMV9yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7CiAJCS5zdGFydAk9IDB4MTAwMDAwMDAsCkBAIC00NjcsNiArNDc5LDggQEAKIAlweGFfc2V0X2J0dWFydF9pbmZvKE5VTEwpOwogCXB4YV9zZXRfc3R1YXJ0X2luZm8oTlVMTCk7CiAKKwlsdWJib2NrX2luaXRfcGNtY2lhKCk7CisKIAljbGtfYWRkX2FsaWFzKCJTQTExMTFfQ0xLIiwgTlVMTCwgIkdQSU8xMV9DTEsiLCBOVUxMKTsKIAlweGFfc2V0X3VkY19pbmZvKCZ1ZGNfaW5mbyk7CiAJcHhhX3NldF9mYl9pbmZvKE5VTEwsICZzaGFycF9sbTh2MzEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvbWFnaWNpYW4uYyBiL2FyY2gvYXJtL21hY2gtcHhhL21hZ2ljaWFuLmMKaW5kZXggYWJjOTE4MS4uMjY1ZjQ4YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvbWFnaWNpYW4uYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9tYWdpY2lhbi5jCkBAIC0yMCwxMCArMjAsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpb19rZXlzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvaHRjLWVncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL2h0Yy1wYXNpYzMuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BkYV9wb3dlci5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvZ3Bpby1odGMtZWdwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wd20uaD4KICNpbmNsdWRlIDxsaW51eC9wd21fYmFja2xpZ2h0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2RyaXZlci5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEveGNlcC5jIGIvYXJjaC9hcm0vbWFjaC1weGEveGNlcC5jCmluZGV4IDNmMDZjZDkuLjA1NjM2OWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3hjZXAuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS94Y2VwLmMKQEAgLTEyMCw3ICsxMjAsOCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzbWM5MXhfcGxhdGRhdGEgeGNlcF9zbWM5MXhfaW5mbyA9IHsKLQkuZmxhZ3MJPSBTTUM5MVhfVVNFXzMyQklUIHwgU01DOTFYX05PV0FJVCB8IFNNQzkxWF9VU0VfRE1BLAorCS5mbGFncwk9IFNNQzkxWF9VU0VfOEJJVCB8IFNNQzkxWF9VU0VfMTZCSVQgfCBTTUM5MVhfVVNFXzMyQklUIHwKKwkJICBTTUM5MVhfTk9XQUlUIHwgU01DOTFYX1VTRV9ETUEsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzbWM5MXhfZGV2aWNlID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2NvcmUuYwppbmRleCBiYWYxNzQ1Li5hMGVhZDBhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2NvcmUuYwpAQCAtOTMsNyArOTMsOCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzbWM5MXhfcGxhdGRhdGEgc21jOTF4X3BsYXRkYXRhID0gewotCS5mbGFncyA9IFNNQzkxWF9VU0VfMzJCSVQgfCBTTUM5MVhfTk9XQUlULAorCS5mbGFncyA9IFNNQzkxWF9VU0VfOEJJVCB8IFNNQzkxWF9VU0VfMTZCSVQgfCBTTUM5MVhfVVNFXzMyQklUIHwKKwkJIFNNQzkxWF9OT1dBSVQsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSByZWFsdmlld19ldGhfZGV2aWNlID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1ycGMvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmggYi9hcmNoL2FybS9tYWNoLXJwYy9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAppbmRleCAyNTcxNjZiLi5hYTc5ZmE0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJwYy9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAorKysgYi9hcmNoL2FybS9tYWNoLXJwYy9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaApAQCAtNDAsNyArNDAsNyBAQAogI2RlZmluZSBTQ1JFRU5fRU5ECQkweGRmYzAwMDAwCiAjZGVmaW5lIFNDUkVFTl9CQVNFCQkweGRmODAwMDAwCiAKLSNkZWZpbmUgVU5DQUNIRUFCTEVfQUREUgkweGRmMDEwMDAwCisjZGVmaW5lIFVOQ0FDSEVBQkxFX0FERFIJKEZMVVNIX0JBU0UgKyAweDEwMDAwKQogCiAvKgogICogSU8gQWRkcmVzc2VzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0eHgvY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0eHgvY29tbW9uLmMKaW5kZXggYmY1MDMyOC4uYmEwY2VlYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNHh4L2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjR4eC9jb21tb24uYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL2RtYS1zM2MyNHh4Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9yZWdzLWNsb2NrLmg+CkBAIC00MzksMTAgKzQ0MCw0NCBAQAogCVtETUFDSF9VU0JfRVA0XSA9IHsgUzNDMjRYWF9ETUFfQVBCLCB0cnVlLCBTM0MyNFhYX0RNQV9DSEFOUkVRKDQsIDMpLCB9LAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBkbWFfc2xhdmVfbWFwIHMzYzI0NDBfZG1hX3NsYXZlX21hcFtdID0geworCS8qIFRPRE86IERNQUNIX1hEMCAqLworCS8qIFRPRE86IERNQUNIX1hEMSAqLworCXsgInMzYzI0NDAtc2RpIiwgInJ4LXR4IiwgKHZvaWQgKilETUFDSF9TREkgfSwKKwl7ICJzM2MyNDEwLXNwaS4wIiwgInJ4IiwgKHZvaWQgKilETUFDSF9TUEkwIH0sCisJeyAiczNjMjQxMC1zcGkuMCIsICJ0eCIsICh2b2lkICopRE1BQ0hfU1BJMCB9LAorCXsgInMzYzI0MTAtc3BpLjEiLCAicngiLCAodm9pZCAqKURNQUNIX1NQSTEgfSwKKwl7ICJzM2MyNDEwLXNwaS4xIiwgInR4IiwgKHZvaWQgKilETUFDSF9TUEkxIH0sCisJeyAiczNjMjQ0MC11YXJ0LjAiLCAicngiLCAodm9pZCAqKURNQUNIX1VBUlQwIH0sCisJeyAiczNjMjQ0MC11YXJ0LjAiLCAidHgiLCAodm9pZCAqKURNQUNIX1VBUlQwIH0sCisJeyAiczNjMjQ0MC11YXJ0LjEiLCAicngiLCAodm9pZCAqKURNQUNIX1VBUlQxIH0sCisJeyAiczNjMjQ0MC11YXJ0LjEiLCAidHgiLCAodm9pZCAqKURNQUNIX1VBUlQxIH0sCisJeyAiczNjMjQ0MC11YXJ0LjIiLCAicngiLCAodm9pZCAqKURNQUNIX1VBUlQyIH0sCisJeyAiczNjMjQ0MC11YXJ0LjIiLCAidHgiLCAodm9pZCAqKURNQUNIX1VBUlQyIH0sCisJeyAiczNjMjQ0MC11YXJ0LjMiLCAicngiLCAodm9pZCAqKURNQUNIX1VBUlQzIH0sCisJeyAiczNjMjQ0MC11YXJ0LjMiLCAidHgiLCAodm9pZCAqKURNQUNIX1VBUlQzIH0sCisJLyogVE9ETzogRE1BQ0hfVElNRVIgKi8KKwl7ICJzM2MyNHh4LWlpcyIsICJyeCIsICh2b2lkICopRE1BQ0hfSTJTX0lOIH0sCisJeyAiczNjMjR4eC1paXMiLCAidHgiLCAodm9pZCAqKURNQUNIX0kyU19PVVQgfSwKKwl7ICJzYW1zdW5nLWFjOTciLCAicngiLCAodm9pZCAqKURNQUNIX1BDTV9JTiB9LAorCXsgInNhbXN1bmctYWM5NyIsICJ0eCIsICh2b2lkICopRE1BQ0hfUENNX09VVCB9LAorCXsgInNhbXN1bmctYWM5NyIsICJyeCIsICh2b2lkICopRE1BQ0hfTUlDX0lOIH0sCisJeyAiczNjLWhzdWRjIiwgInJ4MCIsICh2b2lkICopRE1BQ0hfVVNCX0VQMSB9LAorCXsgInMzYy1oc3VkYyIsICJyeDEiLCAodm9pZCAqKURNQUNIX1VTQl9FUDIgfSwKKwl7ICJzM2MtaHN1ZGMiLCAicngyIiwgKHZvaWQgKilETUFDSF9VU0JfRVAzIH0sCisJeyAiczNjLWhzdWRjIiwgInJ4MyIsICh2b2lkICopRE1BQ0hfVVNCX0VQNCB9LAorCXsgInMzYy1oc3VkYyIsICJ0eDAiLCAodm9pZCAqKURNQUNIX1VTQl9FUDEgfSwKKwl7ICJzM2MtaHN1ZGMiLCAidHgxIiwgKHZvaWQgKilETUFDSF9VU0JfRVAyIH0sCisJeyAiczNjLWhzdWRjIiwgInR4MiIsICh2b2lkICopRE1BQ0hfVVNCX0VQMyB9LAorCXsgInMzYy1oc3VkYyIsICJ0eDMiLCAodm9pZCAqKURNQUNIX1VTQl9FUDQgfQorfTsKKwogc3RhdGljIHN0cnVjdCBzM2MyNHh4X2RtYV9wbGF0ZGF0YSBzM2MyNDQwX2RtYV9wbGF0ZGF0YSA9IHsKIAkubnVtX3BoeV9jaGFubmVscyA9IDQsCiAJLmNoYW5uZWxzID0gczNjMjQ0MF9kbWFfY2hhbm5lbHMsCiAJLm51bV9jaGFubmVscyA9IERNQUNIX01BWCwKKwkuc2xhdmVfbWFwID0gczNjMjQ0MF9kbWFfc2xhdmVfbWFwLAorCS5zbGF2ZWNudCA9IEFSUkFZX1NJWkUoczNjMjQ0MF9kbWFfc2xhdmVfbWFwKSwKIH07CiAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgczNjMjQ0MF9kZXZpY2VfZG1hID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNHh4L21hY2gtbWluaTI0NDAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjR4eC9tYWNoLW1pbmkyNDQwLmMKaW5kZXggYTg1MjE2OC4uMTM5OTljMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNHh4L21hY2gtbWluaTI0NDAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0eHgvbWFjaC1taW5pMjQ0MC5jCkBAIC00OTcsOSArNDk3LDI4IEBACiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgdWRhMTM0eF9wbGF0Zm9ybV9kYXRhIHMzYzI0eHhfdWRhMTM0eCA9IHsKKwkubDMgPSB7CisJCS5ncGlvX2NsayA9IFMzQzI0MTBfR1BCKDQpLAorCQkuZ3Bpb19kYXRhID0gUzNDMjQxMF9HUEIoMyksCisJCS5ncGlvX21vZGUgPSBTM0MyNDEwX0dQQigyKSwKKwkJLnVzZV9ncGlvcyA9IDEsCisJCS5kYXRhX2hvbGQgPSAxLAorCQkuZGF0YV9zZXR1cCA9IDEsCisJCS5jbG9ja19oaWdoID0gMSwKKwkJLm1vZGVfaG9sZCA9IDEsCisJCS5tb2RlID0gMSwKKwkJLm1vZGVfc2V0dXAgPSAxLAorCX0sCisJLm1vZGVsID0gVURBMTM0WF9VREExMzQxLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdWRhMTM0MF9jb2RlYyA9IHsKIAkJLm5hbWUgPSAidWRhMTM0eC1jb2RlYyIsCiAJCS5pZCA9IC0xLAorCQkuZGV2ID0geworCQkJLnBsYXRmb3JtX2RhdGEJPSAmczNjMjR4eF91ZGExMzR4LAorCQl9LAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm1pbmkyNDQwX2RldmljZXNbXSBfX2luaXRkYXRhID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2Nsb2NrLmMKaW5kZXggY2JmNTNiYi4uMGRiNDY4OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9jbG9jay5jCkBAIC0xMjUsNiArMTI1LDggQEAKIH0KIAogc3RhdGljIHN0cnVjdCBjbGtvcHMgY2xrXzM2ODY0X29wcyA9IHsKKwkuZW5hYmxlCQk9IGNsa19jcHVfZW5hYmxlLAorCS5kaXNhYmxlCT0gY2xrX2NwdV9kaXNhYmxlLAogCS5nZXRfcmF0ZQk9IGNsa18zNjg2NF9nZXRfcmF0ZSwKIH07CiAKQEAgLTE0MCw5ICsxNDIsOCBAQAogCUNMS0RFVl9JTklUKE5VTEwsICJPU1RJTUVSMCIsICZjbGtfMzY4NjQpLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgc2ExMXh4X2Nsa19pbml0KHZvaWQpCitpbnQgX19pbml0IHNhMTF4eF9jbGtfaW5pdCh2b2lkKQogewogCWNsa2Rldl9hZGRfdGFibGUoc2ExMXh4X2Nsa3JlZ3MsIEFSUkFZX1NJWkUoc2ExMXh4X2Nsa3JlZ3MpKTsKIAlyZXR1cm4gMDsKIH0KLWNvcmVfaW5pdGNhbGwoc2ExMXh4X2Nsa19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2dlbmVyaWMuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2dlbmVyaWMuYwppbmRleCAzNDVlNjNmLi4zZTA5YmVkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9nZW5lcmljLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvZ2VuZXJpYy5jCkBAIC0zNCw2ICszNCw3IEBACiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CisjaW5jbHVkZSA8bWFjaC9yZXNldC5oPgogCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogI2luY2x1ZGUgPGNsb2Nrc291cmNlL3B4YS5oPgpAQCAtOTUsNiArOTYsOCBAQAogCiB2b2lkIHNhMTF4MF9yZXN0YXJ0KGVudW0gcmVib290X21vZGUgbW9kZSwgY29uc3QgY2hhciAqY21kKQogeworCWNsZWFyX3Jlc2V0X3N0YXR1cyhSRVNFVF9TVEFUVVNfQUxMKTsKKwogCWlmIChtb2RlID09IFJFQk9PVF9TT0ZUKSB7CiAJCS8qIEp1bXAgaW50byBST00gYXQgYWRkcmVzcyAwICovCiAJCXNvZnRfcmVzdGFydCgwKTsKQEAgLTM4OCw2ICszOTEsNyBAQAogCXNhMTF4MF9pbml0X2lycV9ub2R0KElSUV9HUElPMF9TQywgaXJxX3Jlc291cmNlLnN0YXJ0KTsKIAogCXNhMTEwMF9pbml0X2dwaW8oKTsKKwlzYTExeHhfY2xrX2luaXQoKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2dlbmVyaWMuaCBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2dlbmVyaWMuaAppbmRleCAwZDkyZTExLi42ODE5OWI2MDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2dlbmVyaWMuaAorKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9nZW5lcmljLmgKQEAgLTQ0LDMgKzQ0LDUgQEAKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBzYTExeDBfcG1faW5pdCh2b2lkKSB7IHJldHVybiAwOyB9CiAjZW5kaWYKKworaW50IHNhMTF4eF9jbGtfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2gzeHh4LmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9oM3h4eC5jCmluZGV4IGIxZDRmYWEuLmI2OWU3NjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2gzeHh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaDN4eHguYwpAQCAtMTQsOSArMTQsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvX2tleXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9odGMtZWdwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL2dwaW8taHRjLWVncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9zYTExeDAtc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKaW5kZXggY2JlZGQ3NS4uZDk0NGZkNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKQEAgLTEzLDcgKzEzLDcgQEAKICNkZWZpbmUgX19BU01fQVJDSF9IQVJEV0FSRV9ICiAKIAotI2RlZmluZSBVTkNBQ0hFQUJMRV9BRERSCTB4ZmEwNTAwMDAKKyNkZWZpbmUgVU5DQUNIRUFCTEVfQUREUgkweGZhMDUwMDAwCS8qIElDSVAgKi8KIAogCiAvKgpAQCAtMzYsMjggKzM2LDEwIEBACiAjZGVmaW5lIGlvX3YycCggeCApICAgICAgICAgICAgIFwKICAgICggKCgoeCkmMHgwMGZmZmZmZikgfCAoKCh4KSYoMHgzMDAwMDAwMD4+VklPX1NISUZUKSk8PFZJT19TSElGVCkpICsgUElPX1NUQVJUICkKIAotI2RlZmluZSBDUFVfU0ExMTEwX0EwCSgwKQotI2RlZmluZSBDUFVfU0ExMTEwX0IwCSg0KQotI2RlZmluZSBDUFVfU0ExMTEwX0IxCSg1KQotI2RlZmluZSBDUFVfU0ExMTEwX0IyCSg2KQotI2RlZmluZSBDUFVfU0ExMTEwX0I0CSg4KQotCi0jZGVmaW5lIENQVV9TQTExMDBfSUQJKDB4NDQwMWExMTApCi0jZGVmaW5lIENQVV9TQTExMDBfTUFTSwkoMHhmZmZmZmZmMCkKLSNkZWZpbmUgQ1BVX1NBMTExMF9JRAkoMHg2OTAxYjExMCkKLSNkZWZpbmUgQ1BVX1NBMTExMF9NQVNLCSgweGZmZmZmZmYwKQotCiAjZGVmaW5lIF9fTVJFRyh4KQlJT01FTShpb19wMnYoeCkpCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKLSNpbmNsdWRlIDxhc20vY3B1dHlwZS5oPgotCi0jZGVmaW5lIENQVV9SRVZJU0lPTgkocmVhZF9jcHVpZF9pZCgpICYgMTUpCi0KLSNkZWZpbmUgY3B1X2lzX3NhMTEwMCgpCSgocmVhZF9jcHVpZF9pZCgpICYgQ1BVX1NBMTEwMF9NQVNLKSA9PSBDUFVfU0ExMTAwX0lEKQotI2RlZmluZSBjcHVfaXNfc2ExMTEwKCkJKChyZWFkX2NwdWlkX2lkKCkgJiBDUFVfU0ExMTEwX01BU0spID09IENQVV9TQTExMTBfSUQpCi0KICMgZGVmaW5lIF9fUkVHKHgpCSgqKCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nIF9faW9tZW0gKilpb19wMnYoeCkpKQogIyBkZWZpbmUgX19QUkVHKHgpCShpb192MnAoKHVuc2lnbmVkIGxvbmcpJih4KSkpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL3BsZWIuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3BsZWIuYwppbmRleCAxNTI1ZDdiLi44ODE0OWY4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9wbGViLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvcGxlYi5jCkBAIC00NSw3ICs0NSw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNtYzkxeF9wbGF0ZGF0YSBzbWM5MXhfcGxhdGRhdGEgPSB7Ci0JLmZsYWdzID0gU01DOTFYX1VTRV8xNkJJVCB8IFNNQzkxWF9OT1dBSVQsCisJLmZsYWdzID0gU01DOTFYX1VTRV8xNkJJVCB8IFNNQzkxWF9VU0VfOEJJVCB8IFNNQzkxWF9OT1dBSVQsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzbWM5MXhfZGV2aWNlID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wbGF0c21wLXNjdS5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wbGF0c21wLXNjdS5jCmluZGV4IDhkNDc4ZjEuLmQxZWNhZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvcGxhdHNtcC1zY3UuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BsYXRzbXAtc2N1LmMKQEAgLTIxLDI2ICsyMSwxNCBAQAogc3RhdGljIHBoeXNfYWRkcl90IHNobW9iaWxlX3NjdV9iYXNlX3BoeXM7CiBzdGF0aWMgdm9pZCBfX2lvbWVtICpzaG1vYmlsZV9zY3VfYmFzZTsKIAotc3RhdGljIGludCBzaG1vYmlsZV9zbXBfc2N1X25vdGlmaWVyX2NhbGwoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCi0JCQkJCSAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCitzdGF0aWMgaW50IHNobW9iaWxlX3NjdV9jcHVfcHJlcGFyZSh1bnNpZ25lZCBpbnQgY3B1KQogewotCXVuc2lnbmVkIGludCBjcHUgPSAobG9uZyloY3B1OwotCi0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIENQVV9VUF9QUkVQQVJFOgotCQkvKiBGb3IgdGhpcyBwYXJ0aWN1bGFyIENQVSByZWdpc3RlciBTQ1UgU01QIGJvb3QgdmVjdG9yICovCi0JCXNobW9iaWxlX3NtcF9ob29rKGNwdSwgdmlydF90b19waHlzKHNobW9iaWxlX2Jvb3Rfc2N1KSwKLQkJCQkgIHNobW9iaWxlX3NjdV9iYXNlX3BoeXMpOwotCQlicmVhazsKLQl9OwotCi0JcmV0dXJuIE5PVElGWV9PSzsKKwkvKiBGb3IgdGhpcyBwYXJ0aWN1bGFyIENQVSByZWdpc3RlciBTQ1UgU01QIGJvb3QgdmVjdG9yICovCisJc2htb2JpbGVfc21wX2hvb2soY3B1LCB2aXJ0X3RvX3BoeXMoc2htb2JpbGVfYm9vdF9zY3UpLAorCQkJICBzaG1vYmlsZV9zY3VfYmFzZV9waHlzKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBzaG1vYmlsZV9zbXBfc2N1X25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsID0gc2htb2JpbGVfc21wX3NjdV9ub3RpZmllcl9jYWxsLAotfTsKLQogdm9pZCBfX2luaXQgc2htb2JpbGVfc21wX3NjdV9wcmVwYXJlX2NwdXMocGh5c19hZGRyX3Qgc2N1X2Jhc2VfcGh5cywKIAkJCQkJICB1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCiB7CkBAIC01NCw3ICs0Miw5IEBACiAJc2N1X3Bvd2VyX21vZGUoc2htb2JpbGVfc2N1X2Jhc2UsIFNDVV9QTV9OT1JNQUwpOwogCiAJLyogVXNlIENQVSBub3RpZmllciBmb3IgcmVzZXQgdmVjdG9yIGNvbnRyb2wgKi8KLQlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnNobW9iaWxlX3NtcF9zY3Vfbm90aWZpZXIpOworCWNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVJNX1NITU9CSUxFX1NDVV9QUkVQQVJFLAorCQkJCSAgImFybS9zaG1vYmlsZS1zY3U6cHJlcGFyZSIsCisJCQkJICBzaG1vYmlsZV9zY3VfY3B1X3ByZXBhcmUsIE5VTEwpOwogfQogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3JlZ3VsYXRvci1xdWlyay1yY2FyLWdlbjIuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvcmVndWxhdG9yLXF1aXJrLXJjYXItZ2VuMi5jCmluZGV4IDYyNDM3YjUuLjczZTNhZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvcmVndWxhdG9yLXF1aXJrLXJjYXItZ2VuMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvcmVndWxhdG9yLXF1aXJrLXJjYXItZ2VuMi5jCkBAIC00MSw0MCArNDEsMjcgQEAKIAogI2RlZmluZSBSRUdVTEFUT1JfSVJRX01BU0sJQklUKDIpCS8qIElSUTIsIGFjdGl2ZSBsb3cgKi8KIAorLyogc3RhcnQgb2YgREE5MjEwIFN5c3RlbSBDb250cm9sIGFuZCBFdmVudCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgREE5MjEwX1JFR19NQVNLX0EJCTB4NTQKKwogc3RhdGljIHZvaWQgX19pb21lbSAqaXJxYzsKIAotc3RhdGljIGNvbnN0IHU4IGRhOTA2M19tYXNrX3JlZ3NbXSA9IHsKLQlEQTkwNjNfUkVHX0lSUV9NQVNLX0EsCi0JREE5MDYzX1JFR19JUlFfTUFTS19CLAotCURBOTA2M19SRUdfSVJRX01BU0tfQywKLQlEQTkwNjNfUkVHX0lSUV9NQVNLX0QsCisvKiBmaXJzdCBieXRlIHNldHMgdGhlIG1lbW9yeSBwb2ludGVyLCBmb2xsb3dpbmcgYXJlIGNvbnNlY3V0aXZlIHJlZyB2YWx1ZXMgKi8KK3N0YXRpYyB1OCBkYTkwNjNfaXJxX2NscltdID0geyBEQTkwNjNfUkVHX0lSUV9NQVNLX0EsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfTsKK3N0YXRpYyB1OCBkYTkyMTBfaXJxX2NscltdID0geyBEQTkyMTBfUkVHX01BU0tfQSwgMHhmZiwgMHhmZiB9OworCitzdGF0aWMgc3RydWN0IGkyY19tc2cgZGE5eHh4X21zZ3NbMl0gPSB7CisJeworCQkuYWRkciA9IDB4NTgsCisJCS5sZW4gPSBBUlJBWV9TSVpFKGRhOTA2M19pcnFfY2xyKSwKKwkJLmJ1ZiA9IGRhOTA2M19pcnFfY2xyLAorCX0sIHsKKwkJLmFkZHIgPSAweDY4LAorCQkubGVuID0gQVJSQVlfU0laRShkYTkyMTBfaXJxX2NsciksCisJCS5idWYgPSBkYTkyMTBfaXJxX2NsciwKKwl9LAogfTsKIAotLyogREE5MjEwIFN5c3RlbSBDb250cm9sIGFuZCBFdmVudCBSZWdpc3RlcnMgKi8KLSNkZWZpbmUgREE5MjEwX1JFR19NQVNLX0EJCTB4NTQKLSNkZWZpbmUgREE5MjEwX1JFR19NQVNLX0IJCTB4NTUKLQotc3RhdGljIGNvbnN0IHU4IGRhOTIxMF9tYXNrX3JlZ3NbXSA9IHsKLQlEQTkyMTBfUkVHX01BU0tfQSwKLQlEQTkyMTBfUkVHX01BU0tfQiwKLX07Ci0KLXN0YXRpYyB2b2lkIGRhOXh4eF9tYXNrX2lycXMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgY29uc3QgdTggcmVnc1tdLAotCQkJICAgICB1bnNpZ25lZCBpbnQgbnJlZ3MpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJNYXNraW5nICVzIGludGVycnVwdCBzb3VyY2VzXG4iLCBjbGllbnQtPm5hbWUpOwotCi0JZm9yIChpID0gMDsgaSA8IG5yZWdzOyBpKyspIHsKLQkJaW50IGVycm9yID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZ3NbaV0sIH4wKTsKLQkJaWYgKGVycm9yKSB7Ci0JCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImkyYyBlcnJvciAlZFxuIiwgZXJyb3IpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotfQotCiBzdGF0aWMgaW50IHJlZ3VsYXRvcl9xdWlya19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpkYXRhKQogewpAQCAtOTMsMTIgKzgwLDE1IEBACiAJY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwogCWRldl9kYmcoZGV2LCAiRGV0ZWN0ZWQgJXNcbiIsIGNsaWVudC0+bmFtZSk7CiAKLQlpZiAoKGNsaWVudC0+YWRkciA9PSAweDU4ICYmICFzdHJjbXAoY2xpZW50LT5uYW1lLCAiZGE5MDYzIikpKQotCQlkYTl4eHhfbWFza19pcnFzKGNsaWVudCwgZGE5MDYzX21hc2tfcmVncywKLQkJCQkgQVJSQVlfU0laRShkYTkwNjNfbWFza19yZWdzKSk7Ci0JZWxzZSBpZiAoY2xpZW50LT5hZGRyID09IDB4NjggJiYgIXN0cmNtcChjbGllbnQtPm5hbWUsICJkYTkyMTAiKSkKLQkJZGE5eHh4X21hc2tfaXJxcyhjbGllbnQsIGRhOTIxMF9tYXNrX3JlZ3MsCi0JCQkJIEFSUkFZX1NJWkUoZGE5MjEwX21hc2tfcmVncykpOworCWlmICgoY2xpZW50LT5hZGRyID09IDB4NTggJiYgIXN0cmNtcChjbGllbnQtPm5hbWUsICJkYTkwNjMiKSkgfHwKKwkgICAgKGNsaWVudC0+YWRkciA9PSAweDY4ICYmICFzdHJjbXAoY2xpZW50LT5uYW1lLCAiZGE5MjEwIikpKSB7CisJCWludCByZXQ7CisKKwkJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiY2xlYXJpbmcgZGE5MDYzL2RhOTIxMCBpbnRlcnJ1cHRzXG4iKTsKKwkJcmV0ID0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgZGE5eHh4X21zZ3MsIEFSUkFZX1NJWkUoZGE5eHh4X21zZ3MpKTsKKwkJaWYgKHJldCAhPSBBUlJBWV9TSVpFKGRhOXh4eF9tc2dzKSkKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiaTJjIGVycm9yICVkXG4iLCByZXQpOworCX0KIAogCW1vbiA9IGlvcmVhZDMyKGlycWMgKyBJUlFDX01PTklUT1IpOwogCWlmIChtb24gJiBSRUdVTEFUT1JfSVJRX01BU0spCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9LY29uZmlnIGIvYXJjaC9hcm0vbW0vS2NvbmZpZwppbmRleCBkMTVhN2ZlLi5jMTc5OWRkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21tL0tjb25maWcKQEAgLTQwMyw2ICs0MDMsNyBAQAogCWJvb2wKIAlzZWxlY3QgQ1BVXzMydjdNCiAJc2VsZWN0IENQVV9BQlJUX05PTU1VCisJc2VsZWN0IENQVV9DQUNIRV9WN00KIAlzZWxlY3QgQ1BVX0NBQ0hFX05PUAogCXNlbGVjdCBDUFVfUEFCUlRfTEVHQUNZCiAJc2VsZWN0IENQVV9USFVNQk9OTFkKQEAgLTUxOCw2ICs1MTksOSBAQAogY29uZmlnIENQVV9DQUNIRV9GQQogCWJvb2wKIAorY29uZmlnIENQVV9DQUNIRV9WN00KKwlib29sCisKIGlmIE1NVQogIyBUaGUgY29weS1wYWdlIG1vZGVsCiBjb25maWcgQ1BVX0NPUFlfVjRXVApAQCAtNzUwLDE0ICs3NTQsMTQgQEAKIAogY29uZmlnIENQVV9JQ0FDSEVfRElTQUJMRQogCWJvb2wgIkRpc2FibGUgSS1DYWNoZSAoSS1iaXQpIgotCWRlcGVuZHMgb24gQ1BVX0NQMTUgJiYgIShDUFVfQVJNNzIwVCB8fCBDUFVfQVJNNzQwVCB8fCBDUFVfWFNDQUxFIHx8IENQVV9YU0MzKQorCWRlcGVuZHMgb24gKENQVV9DUDE1ICYmICEoQ1BVX0FSTTcyMFQgfHwgQ1BVX0FSTTc0MFQgfHwgQ1BVX1hTQ0FMRSB8fCBDUFVfWFNDMykpIHx8IENQVV9WN00KIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGRpc2FibGUgdGhlIHByb2Nlc3NvciBpbnN0cnVjdGlvbiBjYWNoZS4gVW5sZXNzCiAJICB5b3UgaGF2ZSBhIHJlYXNvbiBub3QgdG8gb3IgYXJlIHVuc3VyZSwgc2F5IE4uCiAKIGNvbmZpZyBDUFVfRENBQ0hFX0RJU0FCTEUKIAlib29sICJEaXNhYmxlIEQtQ2FjaGUgKEMtYml0KSIKLQlkZXBlbmRzIG9uIENQVV9DUDE1ICYmICFTTVAKKwlkZXBlbmRzIG9uIChDUFVfQ1AxNSAmJiAhU01QKSB8fCBDUFVfVjdNCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBkaXNhYmxlIHRoZSBwcm9jZXNzb3IgZGF0YSBjYWNoZS4gVW5sZXNzCiAJICB5b3UgaGF2ZSBhIHJlYXNvbiBub3QgdG8gb3IgYXJlIHVuc3VyZSwgc2F5IE4uCkBAIC03OTIsNyArNzk2LDcgQEAKIAogY29uZmlnIENQVV9CUFJFRElDVF9ESVNBQkxFCiAJYm9vbCAiRGlzYWJsZSBicmFuY2ggcHJlZGljdGlvbiIKLQlkZXBlbmRzIG9uIENQVV9BUk0xMDIwIHx8IENQVV9WNiB8fCBDUFVfVjZLIHx8IENQVV9NT0hBV0sgfHwgQ1BVX1hTQzMgfHwgQ1BVX1Y3IHx8IENQVV9GQTUyNgorCWRlcGVuZHMgb24gQ1BVX0FSTTEwMjAgfHwgQ1BVX1Y2IHx8IENQVV9WNksgfHwgQ1BVX01PSEFXSyB8fCBDUFVfWFNDMyB8fCBDUFVfVjcgfHwgQ1BVX0ZBNTI2IHx8IENQVV9WN00KIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGRpc2FibGUgYnJhbmNoIHByZWRpY3Rpb24uICBJZiB1bnN1cmUsIHNheSBOLgogCkBAIC05MTYsNiArOTIwLDEzIEBACiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgTDJ4MCBQcmltZUNlbGwuCiAKK2NvbmZpZyBDQUNIRV9MMlgwX1BNVQorCWJvb2wgIkwyeDAgcGVyZm9ybWFuY2UgbW9uaXRvciBzdXBwb3J0IiBpZiBDQUNIRV9MMlgwCisJZGVwZW5kcyBvbiBQRVJGX0VWRU5UUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcgZmVhdHVyZXMKKwkgIG9mIHRoZSBMMjIwIGFuZCBQTDMxMCBvdXRlciBjYWNoZSBjb250cm9sbGVycy4KKwogaWYgQ0FDSEVfTDJYMAogCiBjb25maWcgUEwzMTBfRVJSQVRBXzU4ODM2OQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vTWFrZWZpbGUgYi9hcmNoL2FybS9tbS9NYWtlZmlsZQppbmRleCA3Zjc2ZDk2Li5lODY5ODI0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tbS9NYWtlZmlsZQpAQCAtNDMsOSArNDMsMTEgQEAKIG9iai0kKENPTkZJR19DUFVfQ0FDSEVfVjcpCSs9IGNhY2hlLXY3Lm8KIG9iai0kKENPTkZJR19DUFVfQ0FDSEVfRkEpCSs9IGNhY2hlLWZhLm8KIG9iai0kKENPTkZJR19DUFVfQ0FDSEVfTk9QKQkrPSBjYWNoZS1ub3Aubworb2JqLSQoQ09ORklHX0NQVV9DQUNIRV9WN00pCSs9IGNhY2hlLXY3bS5vCiAKIEFGTEFHU19jYWNoZS12Ni5vCTo9LVdhLC1tYXJjaD1hcm12NgogQUZMQUdTX2NhY2hlLXY3Lm8JOj0tV2EsLW1hcmNoPWFybXY3LWEKK0FGTEFHU19jYWNoZS12N20ubwk6PS1XYSwtbWFyY2g9YXJtdjctbQogCiBvYmotJChDT05GSUdfQ1BVX0NPUFlfVjRXVCkJKz0gY29weXBhZ2UtdjR3dC5vCiBvYmotJChDT05GSUdfQ1BVX0NPUFlfVjRXQikJKz0gY29weXBhZ2UtdjR3Yi5vCkBAIC0xMDEsNiArMTAzLDcgQEAKIG9iai0kKENPTkZJR19PVVRFUl9DQUNIRSkJKz0gbDJjLWNvbW1vbi5vCiBvYmotJChDT05GSUdfQ0FDSEVfRkVST0NFT05fTDIpCSs9IGNhY2hlLWZlcm9jZW9uLWwyLm8KIG9iai0kKENPTkZJR19DQUNIRV9MMlgwKQkrPSBjYWNoZS1sMngwLm8gbDJjLWwyeDAtcmVzdW1lLm8KK29iai0kKENPTkZJR19DQUNIRV9MMlgwX1BNVSkJKz0gY2FjaGUtbDJ4MC1wbXUubwogb2JqLSQoQ09ORklHX0NBQ0hFX1hTQzNMMikJKz0gY2FjaGUteHNjM2wyLm8KIG9iai0kKENPTkZJR19DQUNIRV9UQVVST1MyKQkrPSBjYWNoZS10YXVyb3MyLm8KIG9iai0kKENPTkZJR19DQUNIRV9VTklQSElFUikJKz0gY2FjaGUtdW5pcGhpZXIubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vY2FjaGUtbDJ4MC1wbXUuYyBiL2FyY2gvYXJtL21tL2NhY2hlLWwyeDAtcG11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc2ZDMwNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21tL2NhY2hlLWwyeDAtcG11LmMKQEAgLTAsMCArMSw1ODQgQEAKKy8qCisgKiBMMjIwL0wzMTAgY2FjaGUgY29udHJvbGxlciBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFSTSBMaW1pdGVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jYWNoZS1sMngwLmg+CisKKyNkZWZpbmUgUE1VX05SX0NPVU5URVJTIDIKKworc3RhdGljIHZvaWQgX19pb21lbSAqbDJ4MF9iYXNlOworc3RhdGljIHN0cnVjdCBwbXUgKmwyeDBfcG11Oworc3RhdGljIGNwdW1hc2tfdCBwbXVfY3B1OworCitzdGF0aWMgY29uc3QgY2hhciAqbDJ4MF9uYW1lOworCitzdGF0aWMga3RpbWVfdCBsMngwX3BtdV9wb2xsX3BlcmlvZDsKK3N0YXRpYyBzdHJ1Y3QgaHJ0aW1lciBsMngwX3BtdV9ocnRpbWVyOworCisvKgorICogVGhlIEwyMjAvUEwzMTAgUE1VIGhhcyB0d28gZXF1aXZhbGVudCBjb3VudGVycywgQ291bnRlcjEgYW5kIENvdW50ZXIwLgorICogUmVnaXN0ZXJzIGNvbnRyb2xsaW5nIHRoZXNlIGFyZSBsYWlkIG91dCBpbiBwYWlycywgaW4gZGVzY2VuZGluZyBvcmRlciwgaS5lLgorICogdGhlIHJlZ2lzdGVyIGZvciBDb3VudGVyMSBjb21lcyBmaXJzdCwgZm9sbG93ZWQgYnkgdGhlIHJlZ2lzdGVyIGZvcgorICogQ291bnRlcjAuCisgKiBXZSBlbnN1cmUgdGhhdCBpZHggMCAtPiBDb3VudGVyMCwgYW5kIGlkeDEgLT4gQ291bnRlcjEuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnRzW1BNVV9OUl9DT1VOVEVSU107CisKKy8qIEZpbmQgYW4gdW51c2VkIGNvdW50ZXIgKi8KK3N0YXRpYyBpbnQgbDJ4MF9wbXVfZmluZF9pZHgodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBQTVVfTlJfQ09VTlRFUlM7IGkrKykgeworCQlpZiAoIWV2ZW50c1tpXSkKKwkJCXJldHVybiBpOworCX0KKworCXJldHVybiAtMTsKK30KKworLyogSG93IG1hbnkgY291bnRlcnMgYXJlIGFsbG9jYXRlZD8gKi8KK3N0YXRpYyBpbnQgbDJ4MF9wbXVfbnVtX2FjdGl2ZV9jb3VudGVycyh2b2lkKQoreworCWludCBpLCBjbnQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IFBNVV9OUl9DT1VOVEVSUzsgaSsrKSB7CisJCWlmIChldmVudHNbaV0pCisJCQljbnQrKzsKKwl9CisKKwlyZXR1cm4gY250OworfQorCitzdGF0aWMgdm9pZCBsMngwX3BtdV9jb3VudGVyX2NvbmZpZ193cml0ZShpbnQgaWR4LCB1MzIgdmFsKQoreworCXdyaXRlbF9yZWxheGVkKHZhbCwgbDJ4MF9iYXNlICsgTDJYMF9FVkVOVF9DTlQwX0NGRyAtIDQgKiBpZHgpOworfQorCitzdGF0aWMgdTMyIGwyeDBfcG11X2NvdW50ZXJfcmVhZChpbnQgaWR4KQoreworCXJldHVybiByZWFkbF9yZWxheGVkKGwyeDBfYmFzZSArIEwyWDBfRVZFTlRfQ05UMF9WQUwgLSA0ICogaWR4KTsKK30KKworc3RhdGljIHZvaWQgbDJ4MF9wbXVfY291bnRlcl93cml0ZShpbnQgaWR4LCB1MzIgdmFsKQoreworCXdyaXRlbF9yZWxheGVkKHZhbCwgbDJ4MF9iYXNlICsgTDJYMF9FVkVOVF9DTlQwX1ZBTCAtIDQgKiBpZHgpOworfQorCitzdGF0aWMgdm9pZCBfX2wyeDBfcG11X2VuYWJsZSh2b2lkKQoreworCXUzMiB2YWwgPSByZWFkbF9yZWxheGVkKGwyeDBfYmFzZSArIEwyWDBfRVZFTlRfQ05UX0NUUkwpOworCXZhbCB8PSBMMlgwX0VWRU5UX0NOVF9DVFJMX0VOQUJMRTsKKwl3cml0ZWxfcmVsYXhlZCh2YWwsIGwyeDBfYmFzZSArIEwyWDBfRVZFTlRfQ05UX0NUUkwpOworfQorCitzdGF0aWMgdm9pZCBfX2wyeDBfcG11X2Rpc2FibGUodm9pZCkKK3sKKwl1MzIgdmFsID0gcmVhZGxfcmVsYXhlZChsMngwX2Jhc2UgKyBMMlgwX0VWRU5UX0NOVF9DVFJMKTsKKwl2YWwgJj0gfkwyWDBfRVZFTlRfQ05UX0NUUkxfRU5BQkxFOworCXdyaXRlbF9yZWxheGVkKHZhbCwgbDJ4MF9iYXNlICsgTDJYMF9FVkVOVF9DTlRfQ1RSTCk7Cit9CisKK3N0YXRpYyB2b2lkIGwyeDBfcG11X2VuYWJsZShzdHJ1Y3QgcG11ICpwbXUpCit7CisJaWYgKGwyeDBfcG11X251bV9hY3RpdmVfY291bnRlcnMoKSA9PSAwKQorCQlyZXR1cm47CisKKwlfX2wyeDBfcG11X2VuYWJsZSgpOworfQorCitzdGF0aWMgdm9pZCBsMngwX3BtdV9kaXNhYmxlKHN0cnVjdCBwbXUgKnBtdSkKK3sKKwlpZiAobDJ4MF9wbXVfbnVtX2FjdGl2ZV9jb3VudGVycygpID09IDApCisJCXJldHVybjsKKworCV9fbDJ4MF9wbXVfZGlzYWJsZSgpOworfQorCitzdGF0aWMgdm9pZCB3YXJuX2lmX3NhdHVyYXRlZCh1MzIgY291bnQpCit7CisJaWYgKGNvdW50ICE9IDB4ZmZmZmZmZmYpCisJCXJldHVybjsKKworCXByX3dhcm5fcmF0ZWxpbWl0ZWQoIkwyWDAgY291bnRlciBzYXR1cmF0ZWQuIFBvbGwgcGVyaW9kIHRvbyBsb25nXG4iKTsKK30KKworc3RhdGljIHZvaWQgbDJ4MF9wbXVfZXZlbnRfcmVhZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3ID0gJmV2ZW50LT5odzsKKwl1NjQgcHJldl9jb3VudCwgbmV3X2NvdW50LCBtYXNrOworCisJZG8geworCQkgcHJldl9jb3VudCA9IGxvY2FsNjRfcmVhZCgmaHctPnByZXZfY291bnQpOworCQkgbmV3X2NvdW50ID0gbDJ4MF9wbXVfY291bnRlcl9yZWFkKGh3LT5pZHgpOworCX0gd2hpbGUgKGxvY2FsNjRfeGNoZygmaHctPnByZXZfY291bnQsIG5ld19jb3VudCkgIT0gcHJldl9jb3VudCk7CisKKwltYXNrID0gR0VOTUFTS19VTEwoMzEsIDApOworCWxvY2FsNjRfYWRkKChuZXdfY291bnQgLSBwcmV2X2NvdW50KSAmIG1hc2ssICZldmVudC0+Y291bnQpOworCisJd2Fybl9pZl9zYXR1cmF0ZWQobmV3X2NvdW50KTsKK30KKworc3RhdGljIHZvaWQgbDJ4MF9wbXVfZXZlbnRfY29uZmlndXJlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHcgPSAmZXZlbnQtPmh3OworCisJLyoKKwkgKiBUaGUgTDJYMCBjb3VudGVycyBzYXR1cmF0ZSBhdCAweGZmZmZmZmZmIHJhdGhlciB0aGFuIHdyYXBwaW5nLCBzbyB3ZQorCSAqIHdpbGwgKmFsd2F5cyogbG9zZSBzb21lIG51bWJlciBvZiBldmVudHMgd2hlbiBhIGNvdW50ZXIgc2F0dXJhdGVzLAorCSAqIGFuZCBoYXZlIG5vIHdheSBvZiBkZXRlY3RpbmcgaG93IG1hbnkgd2VyZSBsb3N0LgorCSAqCisJICogVG8gbWluaW1pemUgdGhlIGltcGFjdCBvZiB0aGlzLCB3ZSB0cnkgdG8gbWF4aW1pemUgdGhlIHBlcmlvZCBieQorCSAqIGFsd2F5cyBzdGFydGluZyBjb3VudGVycyBhdCB6ZXJvLiBUbyBlbnN1cmUgdGhhdCBncm91cCByYXRpb3MgYXJlCisJICogcmVwcmVzZW50YXRpdmUsIHdlIHBvbGwgcGVyaW9kaWNhbGx5IHRvIGF2b2lkIGNvdW50ZXJzIHNhdHVyYXRpbmcuCisJICogU2VlIGwyeDBfcG11X3BvbGwoKS4KKwkgKi8KKwlsb2NhbDY0X3NldCgmaHctPnByZXZfY291bnQsIDApOworCWwyeDBfcG11X2NvdW50ZXJfd3JpdGUoaHctPmlkeCwgMCk7Cit9CisKK3N0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydCBsMngwX3BtdV9wb2xsKHN0cnVjdCBocnRpbWVyICpocnRpbWVyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJX19sMngwX3BtdV9kaXNhYmxlKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUE1VX05SX0NPVU5URVJTOyBpKyspIHsKKwkJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50ID0gZXZlbnRzW2ldOworCisJCWlmICghZXZlbnQpCisJCQljb250aW51ZTsKKworCQlsMngwX3BtdV9ldmVudF9yZWFkKGV2ZW50KTsKKwkJbDJ4MF9wbXVfZXZlbnRfY29uZmlndXJlKGV2ZW50KTsKKwl9CisKKwlfX2wyeDBfcG11X2VuYWJsZSgpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCWhydGltZXJfZm9yd2FyZF9ub3coaHJ0aW1lciwgbDJ4MF9wbXVfcG9sbF9wZXJpb2QpOworCXJldHVybiBIUlRJTUVSX1JFU1RBUlQ7Cit9CisKKworc3RhdGljIHZvaWQgX19sMngwX3BtdV9ldmVudF9lbmFibGUoaW50IGlkeCwgdTMyIGV2ZW50KQoreworCXUzMiB2YWw7CisKKwl2YWwgPSBldmVudCA8PCBMMlgwX0VWRU5UX0NOVF9DRkdfU1JDX1NISUZUOworCXZhbCB8PSBMMlgwX0VWRU5UX0NOVF9DRkdfSU5UX0RJU0FCTEVEOworCWwyeDBfcG11X2NvdW50ZXJfY29uZmlnX3dyaXRlKGlkeCwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgbDJ4MF9wbXVfZXZlbnRfc3RhcnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3ID0gJmV2ZW50LT5odzsKKworCWlmIChXQVJOX09OX09OQ0UoIShldmVudC0+aHcuc3RhdGUgJiBQRVJGX0hFU19TVE9QUEVEKSkpCisJCXJldHVybjsKKworCWlmIChmbGFncyAmIFBFUkZfRUZfUkVMT0FEKSB7CisJCVdBUk5fT05fT05DRSghKGh3LT5zdGF0ZSAmIFBFUkZfSEVTX1VQVE9EQVRFKSk7CisJCWwyeDBfcG11X2V2ZW50X2NvbmZpZ3VyZShldmVudCk7CisJfQorCisJaHctPnN0YXRlID0gMDsKKworCV9fbDJ4MF9wbXVfZXZlbnRfZW5hYmxlKGh3LT5pZHgsIGh3LT5jb25maWdfYmFzZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fbDJ4MF9wbXVfZXZlbnRfZGlzYWJsZShpbnQgaWR4KQoreworCXUzMiB2YWw7CisKKwl2YWwgPSBMMlgwX0VWRU5UX0NOVF9DRkdfU1JDX0RJU0FCTEVEIDw8IEwyWDBfRVZFTlRfQ05UX0NGR19TUkNfU0hJRlQ7CisJdmFsIHw9IEwyWDBfRVZFTlRfQ05UX0NGR19JTlRfRElTQUJMRUQ7CisJbDJ4MF9wbXVfY291bnRlcl9jb25maWdfd3JpdGUoaWR4LCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBsMngwX3BtdV9ldmVudF9zdG9wKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGZsYWdzKQoreworCXN0cnVjdCBod19wZXJmX2V2ZW50ICpodyA9ICZldmVudC0+aHc7CisKKwlpZiAoV0FSTl9PTl9PTkNFKGV2ZW50LT5ody5zdGF0ZSAmIFBFUkZfSEVTX1NUT1BQRUQpKQorCQlyZXR1cm47CisKKwlfX2wyeDBfcG11X2V2ZW50X2Rpc2FibGUoaHctPmlkeCk7CisKKwlody0+c3RhdGUgfD0gUEVSRl9IRVNfU1RPUFBFRDsKKworCWlmIChmbGFncyAmIFBFUkZfRUZfVVBEQVRFKSB7CisJCWwyeDBfcG11X2V2ZW50X3JlYWQoZXZlbnQpOworCQlody0+c3RhdGUgfD0gUEVSRl9IRVNfVVBUT0RBVEU7CisJfQorfQorCitzdGF0aWMgaW50IGwyeDBfcG11X2V2ZW50X2FkZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHcgPSAmZXZlbnQtPmh3OworCWludCBpZHggPSBsMngwX3BtdV9maW5kX2lkeCgpOworCisJaWYgKGlkeCA9PSAtMSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwkvKgorCSAqIFBpbiB0aGUgdGltZXIsIHNvIHRoYXQgdGhlIG92ZXJmbG93cyBhcmUgaGFuZGxlZCBieSB0aGUgY2hvc2VuCisJICogZXZlbnQtPmNwdSAodGhpcyBpcyB0aGUgc2FtZSBvbmUgYXMgcHJlc2VudGVkIGluICJjcHVtYXNrIgorCSAqIGF0dHJpYnV0ZSkuCisJICovCisJaWYgKGwyeDBfcG11X251bV9hY3RpdmVfY291bnRlcnMoKSA9PSAwKQorCQlocnRpbWVyX3N0YXJ0KCZsMngwX3BtdV9ocnRpbWVyLCBsMngwX3BtdV9wb2xsX3BlcmlvZCwKKwkJCSAgICAgIEhSVElNRVJfTU9ERV9SRUxfUElOTkVEKTsKKworCWV2ZW50c1tpZHhdID0gZXZlbnQ7CisJaHctPmlkeCA9IGlkeDsKKworCWwyeDBfcG11X2V2ZW50X2NvbmZpZ3VyZShldmVudCk7CisKKwlody0+c3RhdGUgPSBQRVJGX0hFU19TVE9QUEVEIHwgUEVSRl9IRVNfVVBUT0RBVEU7CisKKwlpZiAoZmxhZ3MgJiBQRVJGX0VGX1NUQVJUKQorCQlsMngwX3BtdV9ldmVudF9zdGFydChldmVudCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbDJ4MF9wbXVfZXZlbnRfZGVsKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGZsYWdzKQoreworCXN0cnVjdCBod19wZXJmX2V2ZW50ICpodyA9ICZldmVudC0+aHc7CisKKwlsMngwX3BtdV9ldmVudF9zdG9wKGV2ZW50LCBQRVJGX0VGX1VQREFURSk7CisKKwlldmVudHNbaHctPmlkeF0gPSBOVUxMOworCWh3LT5pZHggPSAtMTsKKworCWlmIChsMngwX3BtdV9udW1fYWN0aXZlX2NvdW50ZXJzKCkgPT0gMCkKKwkJaHJ0aW1lcl9jYW5jZWwoJmwyeDBfcG11X2hydGltZXIpOworfQorCitzdGF0aWMgYm9vbCBsMngwX3BtdV9ncm91cF9pc192YWxpZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IHBtdSAqcG11ID0gZXZlbnQtPnBtdTsKKwlzdHJ1Y3QgcGVyZl9ldmVudCAqbGVhZGVyID0gZXZlbnQtPmdyb3VwX2xlYWRlcjsKKwlzdHJ1Y3QgcGVyZl9ldmVudCAqc2libGluZzsKKwlpbnQgbnVtX2h3ID0gMDsKKworCWlmIChsZWFkZXItPnBtdSA9PSBwbXUpCisJCW51bV9odysrOworCWVsc2UgaWYgKCFpc19zb2Z0d2FyZV9ldmVudChsZWFkZXIpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNpYmxpbmcsICZsZWFkZXItPnNpYmxpbmdfbGlzdCwgZ3JvdXBfZW50cnkpIHsKKwkJaWYgKHNpYmxpbmctPnBtdSA9PSBwbXUpCisJCQludW1faHcrKzsKKwkJZWxzZSBpZiAoIWlzX3NvZnR3YXJlX2V2ZW50KHNpYmxpbmcpKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiBudW1faHcgPD0gUE1VX05SX0NPVU5URVJTOworfQorCitzdGF0aWMgaW50IGwyeDBfcG11X2V2ZW50X2luaXQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCBod19wZXJmX2V2ZW50ICpodyA9ICZldmVudC0+aHc7CisKKwlpZiAoZXZlbnQtPmF0dHIudHlwZSAhPSBsMngwX3BtdS0+dHlwZSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlpZiAoaXNfc2FtcGxpbmdfZXZlbnQoZXZlbnQpIHx8CisJICAgIGV2ZW50LT5hdHRhY2hfc3RhdGUgJiBQRVJGX0FUVEFDSF9UQVNLKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChldmVudC0+YXR0ci5leGNsdWRlX3VzZXIgICB8fAorCSAgICBldmVudC0+YXR0ci5leGNsdWRlX2tlcm5lbCB8fAorCSAgICBldmVudC0+YXR0ci5leGNsdWRlX2h2ICAgICB8fAorCSAgICBldmVudC0+YXR0ci5leGNsdWRlX2lkbGUgICB8fAorCSAgICBldmVudC0+YXR0ci5leGNsdWRlX2hvc3QgICB8fAorCSAgICBldmVudC0+YXR0ci5leGNsdWRlX2d1ZXN0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChldmVudC0+Y3B1IDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZXZlbnQtPmF0dHIuY29uZmlnICYgfkwyWDBfRVZFTlRfQ05UX0NGR19TUkNfTUFTSykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlody0+Y29uZmlnX2Jhc2UgPSBldmVudC0+YXR0ci5jb25maWc7CisKKwlpZiAoIWwyeDBfcG11X2dyb3VwX2lzX3ZhbGlkKGV2ZW50KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlldmVudC0+Y3B1ID0gY3B1bWFza19maXJzdCgmcG11X2NwdSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGwyeDBfZXZlbnRfYXR0cmlidXRlIHsKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBhdHRyOworCXVuc2lnbmVkIGludCBjb25maWc7CisJYm9vbCBwbDMxMF9vbmx5OworfTsKKworI2RlZmluZSBMMlgwX0VWRU5UX0FUVFIoX25hbWUsIF9jb25maWcsIF9wbDMxMF9vbmx5KQkJCQlcCisJKCYoKHN0cnVjdCBsMngwX2V2ZW50X2F0dHJpYnV0ZVtdKSB7ewkJCQkJXAorCQkuYXR0ciA9IF9fQVRUUihfbmFtZSwgU19JUlVHTywgbDJ4MF9wbXVfZXZlbnRfc2hvdywgTlVMTCksCVwKKwkJLmNvbmZpZyA9IF9jb25maWcsCQkJCQkJXAorCQkucGwzMTBfb25seSA9IF9wbDMxMF9vbmx5LAkJCQkJXAorCX19KVswXS5hdHRyLmF0dHIpCisKKyNkZWZpbmUgTDIyMF9QTFVTX0VWRU5UX0FUVFIoX25hbWUsIF9jb25maWcpCQkJCQlcCisJTDJYMF9FVkVOVF9BVFRSKF9uYW1lLCBfY29uZmlnLCBmYWxzZSkKKworI2RlZmluZSBQTDMxMF9FVkVOVF9BVFRSKF9uYW1lLCBfY29uZmlnKQkJCQkJXAorCUwyWDBfRVZFTlRfQVRUUihfbmFtZSwgX2NvbmZpZywgdHJ1ZSkKKworc3RhdGljIHNzaXplX3QgbDJ4MF9wbXVfZXZlbnRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbDJ4MF9ldmVudF9hdHRyaWJ1dGUgKmxhdHRyOworCisJbGF0dHIgPSBjb250YWluZXJfb2YoYXR0ciwgdHlwZW9mKCpsYXR0ciksIGF0dHIpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgImNvbmZpZz0weCV4XG4iLCBsYXR0ci0+Y29uZmlnKTsKK30KKworc3RhdGljIHVtb2RlX3QgbDJ4MF9wbXVfZXZlbnRfYXR0cl9pc192aXNpYmxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCQkgICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJCQkgICAgICBpbnQgdW51c2VkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGtvYmpfdG9fZGV2KGtvYmopOworCXN0cnVjdCBwbXUgKnBtdSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBsMngwX2V2ZW50X2F0dHJpYnV0ZSAqbGF0dHI7CisKKwlsYXR0ciA9IGNvbnRhaW5lcl9vZihhdHRyLCB0eXBlb2YoKmxhdHRyKSwgYXR0ci5hdHRyKTsKKworCWlmICghbGF0dHItPnBsMzEwX29ubHkgfHwgc3RyY21wKCJsMmNfMzEwIiwgcG11LT5uYW1lKSA9PSAwKQorCQlyZXR1cm4gYXR0ci0+bW9kZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbDJ4MF9wbXVfZXZlbnRfYXR0cnNbXSA9IHsKKwlMMjIwX1BMVVNfRVZFTlRfQVRUUihjbywJMHgxKSwKKwlMMjIwX1BMVVNfRVZFTlRfQVRUUihkcmhpdCwJMHgyKSwKKwlMMjIwX1BMVVNfRVZFTlRfQVRUUihkcnJlcSwJMHgzKSwKKwlMMjIwX1BMVVNfRVZFTlRfQVRUUihkd2hpdCwJMHg0KSwKKwlMMjIwX1BMVVNfRVZFTlRfQVRUUihkd3JlcSwJMHg1KSwKKwlMMjIwX1BMVVNfRVZFTlRfQVRUUihkd3RyZXEsCTB4NiksCisJTDIyMF9QTFVTX0VWRU5UX0FUVFIoaXJoaXQsCTB4NyksCisJTDIyMF9QTFVTX0VWRU5UX0FUVFIoaXJyZXEsCTB4OCksCisJTDIyMF9QTFVTX0VWRU5UX0FUVFIod2EsCTB4OSksCisJUEwzMTBfRVZFTlRfQVRUUihpcGZhbGxvYywJMHhhKSwKKwlQTDMxMF9FVkVOVF9BVFRSKGVwZmhpdCwJMHhiKSwKKwlQTDMxMF9FVkVOVF9BVFRSKGVwZmFsbG9jLAkweGMpLAorCVBMMzEwX0VWRU5UX0FUVFIoc3JyY3ZkLAkweGQpLAorCVBMMzEwX0VWRU5UX0FUVFIoc3Jjb25mLAkweGUpLAorCVBMMzEwX0VWRU5UX0FUVFIoZXBmcmN2ZCwJMHhmKSwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBsMngwX3BtdV9ldmVudF9hdHRyc19ncm91cCA9IHsKKwkubmFtZSA9ICJldmVudHMiLAorCS5hdHRycyA9IGwyeDBfcG11X2V2ZW50X2F0dHJzLAorCS5pc192aXNpYmxlID0gbDJ4MF9wbXVfZXZlbnRfYXR0cl9pc192aXNpYmxlLAorfTsKKworc3RhdGljIHNzaXplX3QgbDJ4MF9wbXVfY3B1bWFza19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIGNwdW1hcF9wcmludF90b19wYWdlYnVmKHRydWUsIGJ1ZiwgJnBtdV9jcHUpOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgbDJ4MF9wbXVfY3B1bWFza19hdHRyID0KKwkJX19BVFRSKGNwdW1hc2ssIFNfSVJVR08sIGwyeDBfcG11X2NwdW1hc2tfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsMngwX3BtdV9jcHVtYXNrX2F0dHJzW10gPSB7CisJJmwyeDBfcG11X2NwdW1hc2tfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBsMngwX3BtdV9jcHVtYXNrX2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gbDJ4MF9wbXVfY3B1bWFza19hdHRycywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpsMngwX3BtdV9hdHRyX2dyb3Vwc1tdID0geworCSZsMngwX3BtdV9ldmVudF9hdHRyc19ncm91cCwKKwkmbDJ4MF9wbXVfY3B1bWFza19hdHRyX2dyb3VwLAorCU5VTEwsCit9OworCitzdGF0aWMgdm9pZCBsMngwX3BtdV9yZXNldCh2b2lkKQoreworCWludCBpOworCisJX19sMngwX3BtdV9kaXNhYmxlKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUE1VX05SX0NPVU5URVJTOyBpKyspCisJCV9fbDJ4MF9wbXVfZXZlbnRfZGlzYWJsZShpKTsKK30KKworc3RhdGljIGludCBsMngwX3BtdV9vZmZsaW5lX2NwdSh1bnNpZ25lZCBpbnQgY3B1KQoreworCXVuc2lnbmVkIGludCB0YXJnZXQ7CisKKwlpZiAoIWNwdW1hc2tfdGVzdF9hbmRfY2xlYXJfY3B1KGNwdSwgJnBtdV9jcHUpKQorCQlyZXR1cm4gMDsKKworCXRhcmdldCA9IGNwdW1hc2tfYW55X2J1dChjcHVfb25saW5lX21hc2ssIGNwdSk7CisJaWYgKHRhcmdldCA+PSBucl9jcHVfaWRzKQorCQlyZXR1cm4gMDsKKworCXBlcmZfcG11X21pZ3JhdGVfY29udGV4dChsMngwX3BtdSwgY3B1LCB0YXJnZXQpOworCWNwdW1hc2tfc2V0X2NwdSh0YXJnZXQsICZwbXVfY3B1KTsKKworCXJldHVybiAwOworfQorCit2b2lkIGwyeDBfcG11X3N1c3BlbmQodm9pZCkKK3sKKwlpbnQgaTsKKworCWlmICghbDJ4MF9wbXUpCisJCXJldHVybjsKKworCWwyeDBfcG11X2Rpc2FibGUobDJ4MF9wbXUpOworCisJZm9yIChpID0gMDsgaSA8IFBNVV9OUl9DT1VOVEVSUzsgaSsrKSB7CisJCWlmIChldmVudHNbaV0pCisJCQlsMngwX3BtdV9ldmVudF9zdG9wKGV2ZW50c1tpXSwgUEVSRl9FRl9VUERBVEUpOworCX0KKworfQorCit2b2lkIGwyeDBfcG11X3Jlc3VtZSh2b2lkKQoreworCWludCBpOworCisJaWYgKCFsMngwX3BtdSkKKwkJcmV0dXJuOworCisJbDJ4MF9wbXVfcmVzZXQoKTsKKworCWZvciAoaSA9IDA7IGkgPCBQTVVfTlJfQ09VTlRFUlM7IGkrKykgeworCQlpZiAoZXZlbnRzW2ldKQorCQkJbDJ4MF9wbXVfZXZlbnRfc3RhcnQoZXZlbnRzW2ldLCBQRVJGX0VGX1JFTE9BRCk7CisJfQorCisJbDJ4MF9wbXVfZW5hYmxlKGwyeDBfcG11KTsKK30KKwordm9pZCBfX2luaXQgbDJ4MF9wbXVfcmVnaXN0ZXIodm9pZCBfX2lvbWVtICpiYXNlLCB1MzIgcGFydCkKK3sKKwkvKgorCSAqIERldGVybWluZSB3aGV0aGVyIHdlIHN1cHBvcnQgdGhlIFBNVSwgYW5kIGNob29zZSB0aGUgbmFtZSBmb3Igc3lzZnMuCisJICogVGhpcyBpcyBhbHNvIHVzZWQgYnkgbDJ4MF9wbXVfZXZlbnRfYXR0cl9pc192aXNpYmxlIHRvIGRldGVybWluZQorCSAqIHdoaWNoIGV2ZW50cyB0byBkaXNwbGF5LCBhcyB0aGUgUEwzMTAgUE1VIHN1cHBvcnRzIGEgc3VwZXJzZXQgb2YKKwkgKiBMMjIwIGV2ZW50cy4KKwkgKgorCSAqIFRoZSBMMjEwIFBNVSBoYXMgYSBkaWZmZXJlbnQgcHJvZ3JhbW1lcidzIGludGVyZmFjZSwgYW5kIGlzIG5vdAorCSAqIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4KKwkgKgorCSAqIFdlIG11c3QgZGVmZXIgcmVnaXN0ZXJpbmcgdGhlIFBNVSB1bnRpbCB0aGUgcGVyZiBzdWJzeXN0ZW0gaXMgdXAgYW5kCisJICogcnVubmluZywgc28ganVzdCBzdGFzaCB0aGUgbmFtZSBhbmQgYmFzZSwgYW5kIGxlYXZlIHRoYXQgdG8gYW5vdGhlcgorCSAqIGluaXRjYWxsLgorCSAqLworCXN3aXRjaCAocGFydCAmIEwyWDBfQ0FDSEVfSURfUEFSVF9NQVNLKSB7CisJY2FzZSBMMlgwX0NBQ0hFX0lEX1BBUlRfTDIyMDoKKwkJbDJ4MF9uYW1lID0gImwyY18yMjAiOworCQlicmVhazsKKwljYXNlIEwyWDBfQ0FDSEVfSURfUEFSVF9MMzEwOgorCQlsMngwX25hbWUgPSAibDJjXzMxMCI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisKKwlsMngwX2Jhc2UgPSBiYXNlOworfQorCitzdGF0aWMgX19pbml0IGludCBsMngwX3BtdV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCWlmICghbDJ4MF9iYXNlKQorCQlyZXR1cm4gMDsKKworCWwyeDBfcG11ID0ga3phbGxvYyhzaXplb2YoKmwyeDBfcG11KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsMngwX3BtdSkgeworCQlwcl93YXJuKCJVbmFibGUgdG8gYWxsb2NhdGUgTDJ4MCBQTVVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkqbDJ4MF9wbXUgPSAoc3RydWN0IHBtdSkgeworCQkudGFza19jdHhfbnIgPSBwZXJmX2ludmFsaWRfY29udGV4dCwKKwkJLnBtdV9lbmFibGUgPSBsMngwX3BtdV9lbmFibGUsCisJCS5wbXVfZGlzYWJsZSA9IGwyeDBfcG11X2Rpc2FibGUsCisJCS5yZWFkID0gbDJ4MF9wbXVfZXZlbnRfcmVhZCwKKwkJLnN0YXJ0ID0gbDJ4MF9wbXVfZXZlbnRfc3RhcnQsCisJCS5zdG9wID0gbDJ4MF9wbXVfZXZlbnRfc3RvcCwKKwkJLmFkZCA9IGwyeDBfcG11X2V2ZW50X2FkZCwKKwkJLmRlbCA9IGwyeDBfcG11X2V2ZW50X2RlbCwKKwkJLmV2ZW50X2luaXQgPSBsMngwX3BtdV9ldmVudF9pbml0LAorCQkuYXR0cl9ncm91cHMgPSBsMngwX3BtdV9hdHRyX2dyb3VwcywKKwl9OworCisJbDJ4MF9wbXVfcmVzZXQoKTsKKworCS8qCisJICogV2UgYWx3YXlzIHVzZSBhIGhydGltZXIgcmF0aGVyIHRoYW4gYW4gaW50ZXJydXB0LgorCSAqIFNlZSBjb21tZW50cyBpbiBsMngwX3BtdV9ldmVudF9jb25maWd1cmUgYW5kIGwyeDBfcG11X3BvbGwuCisJICoKKwkgKiBQb2xsaW5nIG9uY2UgYSBzZWNvbmQgYWxsb3dzIHRoZSBjb3VudGVycyB0byBmaWxsIHVwIHRvIDEvMTI4dGggb24gYQorCSAqIHF1YWQtY29yZSB0ZXN0IGNoaXAgd2l0aCBjb3JlcyBjbG9ja2VkIGF0IDQwME1Iei4gSG9wZWZ1bGx5IHRoaXMKKwkgKiBsZWF2ZXMgc3VmZmljaWVudCBoZWFkcm9vbSB0byBhdm9pZCBvdmVyZmxvdyBvbiBwcm9kdWN0aW9uIHNpbGljb24KKwkgKiBhdCBoaWdoZXIgZnJlcXVlbmNpZXMuCisJICovCisJbDJ4MF9wbXVfcG9sbF9wZXJpb2QgPSBtc190b19rdGltZSgxMDAwKTsKKwlocnRpbWVyX2luaXQoJmwyeDBfcG11X2hydGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7CisJbDJ4MF9wbXVfaHJ0aW1lci5mdW5jdGlvbiA9IGwyeDBfcG11X3BvbGw7CisKKwljcHVtYXNrX3NldF9jcHUoMCwgJnBtdV9jcHUpOworCXJldCA9IGNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVBfUEVSRl9BUk1fTDJYMF9PTkxJTkUsCisJCQkJCSJBUF9QRVJGX0FSTV9MMlgwX09OTElORSIsIE5VTEwsCisJCQkJCWwyeDBfcG11X29mZmxpbmVfY3B1KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9wbXU7CisKKwlyZXQgPSBwZXJmX3BtdV9yZWdpc3RlcihsMngwX3BtdSwgbDJ4MF9uYW1lLCAtMSk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfY3B1aHA7CisKKwlyZXR1cm4gMDsKKworb3V0X2NwdWhwOgorCWNwdWhwX3JlbW92ZV9zdGF0ZV9ub2NhbGxzKENQVUhQX0FQX1BFUkZfQVJNX0wyWDBfT05MSU5FKTsKK291dF9wbXU6CisJa2ZyZWUobDJ4MF9wbXUpOworCWwyeDBfcG11ID0gTlVMTDsKKwlyZXR1cm4gcmV0OworfQorZGV2aWNlX2luaXRjYWxsKGwyeDBfcG11X2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vY2FjaGUtbDJ4MC5jIGIvYXJjaC9hcm0vbW0vY2FjaGUtbDJ4MC5jCmluZGV4IGNjMTI5MDUuLmQxODcwYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2NhY2hlLWwyeDAuYworKysgYi9hcmNoL2FybS9tbS9jYWNoZS1sMngwLmMKQEAgLTE0Miw2ICsxNDIsOCBAQAogewogCXZvaWQgX19pb21lbSAqYmFzZSA9IGwyeDBfYmFzZTsKIAorCWwyeDBfcG11X3N1c3BlbmQoKTsKKwogCW91dGVyX2NhY2hlLmZsdXNoX2FsbCgpOwogCWwyY193cml0ZV9zZWMoMCwgYmFzZSwgTDJYMF9DVFJMKTsKIAlkc2Ioc3QpOwpAQCAtMTU5LDYgKzE2MSw4IEBACiAJLyogRG8gbm90IHRvdWNoIHRoZSBjb250cm9sbGVyIGlmIGFscmVhZHkgZW5hYmxlZC4gKi8KIAlpZiAoIShyZWFkbF9yZWxheGVkKGJhc2UgKyBMMlgwX0NUUkwpICYgTDJYMF9DVFJMX0VOKSkKIAkJbDJjX2VuYWJsZShiYXNlLCBsMngwX2RhdGEtPm51bV9sb2NrKTsKKworCWwyeDBfcG11X3Jlc3VtZSgpOwogfQogCiAvKgpAQCAtNzA5LDkgKzcxMyw4IEBACiAJaWYgKHJldmlzaW9uID49IEwzMTBfQ0FDSEVfSURfUlRMX1IzUDAgJiYKIAkgICAgcmV2aXNpb24gPCBMMzEwX0NBQ0hFX0lEX1JUTF9SM1AyKSB7CiAJCXUzMiB2YWwgPSBsMngwX3NhdmVkX3JlZ3MucHJlZmV0Y2hfY3RybDsKLQkJLyogSSBkb24ndCB0aGluayBiaXQyMyBpcyByZXF1aXJlZCBoZXJlLi4uIGJ1dCBpTVg2IGRvZXMgc28gKi8KLQkJaWYgKHZhbCAmIChCSVQoMzApIHwgQklUKDIzKSkpIHsKLQkJCXZhbCAmPSB+KEJJVCgzMCkgfCBCSVQoMjMpKTsKKwkJaWYgKHZhbCAmIEwzMTBfUFJFRkVUQ0hfQ1RSTF9EQkxfTElORUZJTEwpIHsKKwkJCXZhbCAmPSB+TDMxMF9QUkVGRVRDSF9DVFJMX0RCTF9MSU5FRklMTDsKIAkJCWwyeDBfc2F2ZWRfcmVncy5wcmVmZXRjaF9jdHJsID0gdmFsOwogCQkJZXJyYXRhW24rK10gPSAiNzUyMjcxIjsKIAkJfQpAQCAtODkyLDYgKzg5NSw4IEBACiAJcHJfaW5mbygiJXM6IENBQ0hFX0lEIDB4JTA4eCwgQVVYX0NUUkwgMHglMDh4XG4iLAogCQlkYXRhLT50eXBlLCBjYWNoZV9pZCwgYXV4KTsKIAorCWwyeDBfcG11X3JlZ2lzdGVyKGwyeDBfYmFzZSwgY2FjaGVfaWQpOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NhY2hlLXY3bS5TIGIvYXJjaC9hcm0vbW0vY2FjaGUtdjdtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE2YTdlNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21tL2NhY2hlLXY3bS5TCkBAIC0wLDAgKzEsNDUzIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21tL2NhY2hlLXY3bS5TCisgKgorICogIEJhc2VkIG9uIGxpbnV4L2FyY2gvYXJtL21tL2NhY2hlLXY3LlMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkLgorICogIENvcHlyaWdodCAoQykgMjAwNSBBUk0gTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFRoaXMgaXMgdGhlICJzaGVsbCIgb2YgdGhlIEFSTXY3TSBwcm9jZXNzb3Igc3VwcG9ydC4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS91bndpbmQuaD4KKyNpbmNsdWRlIDxhc20vdjdtLmg+CisKKyNpbmNsdWRlICJwcm9jLW1hY3Jvcy5TIgorCisvKiBHZW5lcmljIFY3TSByZWFkL3dyaXRlIG1hY3JvcyBmb3IgbWVtb3J5IG1hcHBlZCBjYWNoZSBvcGVyYXRpb25zICovCisubWFjcm8gdjdtX2NhY2hlX3JlYWQsIHJ0LCByZWcKKwltb3Z3CVxydCwgIzpsb3dlcjE2OkJBU0VBRERSX1Y3TV9TQ0IgKyBccmVnCisJbW92dAlccnQsICM6dXBwZXIxNjpCQVNFQUREUl9WN01fU0NCICsgXHJlZworCWxkciAgICAgXHJ0LCBbXHJ0XQorLmVuZG0KKworLm1hY3JvIHY3bV9jYWNoZW9wLCBydCwgdG1wLCBvcCwgYyA9IGFsCisJbW92d1xjCVx0bXAsICM6bG93ZXIxNjpCQVNFQUREUl9WN01fU0NCICsgXG9wCisJbW92dFxjCVx0bXAsICM6dXBwZXIxNjpCQVNFQUREUl9WN01fU0NCICsgXG9wCisJc3RyXGMJXHJ0LCBbXHRtcF0KKy5lbmRtCisKKworLm1hY3JvCXJlYWRfY2NzaWRyLCBydAorCXY3bV9jYWNoZV9yZWFkIFxydCwgVjdNX1NDQl9DQ1NJRFIKKy5lbmRtCisKKy5tYWNybyByZWFkX2NsaWRyLCBydAorCXY3bV9jYWNoZV9yZWFkIFxydCwgVjdNX1NDQl9DTElEUgorLmVuZG0KKworLm1hY3JvCXdyaXRlX2Nzc2VsciwgcnQsIHRtcAorCXY3bV9jYWNoZW9wIFxydCwgXHRtcCwgVjdNX1NDQl9DU1NFTFIKKy5lbmRtCisKKy8qCisgKiBkY2lzdzogSW52YWxpZGF0ZSBkYXRhIGNhY2hlIGJ5IHNldC93YXkKKyAqLworLm1hY3JvIGRjaXN3LCBydCwgdG1wCisJdjdtX2NhY2hlb3AgXHJ0LCBcdG1wLCBWN01fU0NCX0RDSVNXCisuZW5kbQorCisvKgorICogZGNjaXN3OiBDbGVhbiBhbmQgaW52YWxpZGF0ZSBkYXRhIGNhY2hlIGJ5IHNldC93YXkKKyAqLworLm1hY3JvIGRjY2lzdywgcnQsIHRtcAorCXY3bV9jYWNoZW9wIFxydCwgXHRtcCwgVjdNX1NDQl9EQ0NJU1cKKy5lbmRtCisKKy8qCisgKiBkY2NpbXZhYzogQ2xlYW4gYW5kIGludmFsaWRhdGUgZGF0YSBjYWNoZSBsaW5lIGJ5IE1WQSB0byBQb0MuCisgKi8KKy5pcnAgICAgYywsZXEsbmUsY3MsY2MsbWkscGwsdnMsdmMsaGksbHMsZ2UsbHQsZ3QsbGUsaHMsbG8KKy5tYWNybyBkY2NpbXZhY1xjLCBydCwgdG1wCisJdjdtX2NhY2hlb3AgXHJ0LCBcdG1wLCBWN01fU0NCX0RDQ0lNVkFDLCBcYworLmVuZG0KKy5lbmRyCisKKy8qCisgKiBkY2ltdmFjOiBJbnZhbGlkYXRlIGRhdGEgY2FjaGUgbGluZSBieSBNVkEgdG8gUG9DCisgKi8KKy5tYWNybyBkY2ltdmFjLCBydCwgdG1wCisJdjdtX2NhY2hlb3AgXHJ0LCBcdG1wLCBWN01fU0NCX0RDSU1WQUMKKy5lbmRtCisKKy8qCisgKiBkY2NtdmF1OiBDbGVhbiBkYXRhIGNhY2hlIGxpbmUgYnkgTVZBIHRvIFBvVQorICovCisubWFjcm8gZGNjbXZhdSwgcnQsIHRtcAorCXY3bV9jYWNoZW9wIFxydCwgXHRtcCwgVjdNX1NDQl9EQ0NNVkFVCisuZW5kbQorCisvKgorICogZGNjbXZhYzogQ2xlYW4gZGF0YSBjYWNoZSBsaW5lIGJ5IE1WQSB0byBQb0MKKyAqLworLm1hY3JvIGRjY212YWMsICBydCwgdG1wCisJdjdtX2NhY2hlb3AgXHJ0LCBcdG1wLCBWN01fU0NCX0RDQ01WQUMKKy5lbmRtCisKKy8qCisgKiBpY2ltdmF1OiBJbnZhbGlkYXRlIGluc3RydWN0aW9uIGNhY2hlcyBieSBNVkEgdG8gUG9VCisgKi8KKy5tYWNybyBpY2ltdmF1LCBydCwgdG1wCisJdjdtX2NhY2hlb3AgXHJ0LCBcdG1wLCBWN01fU0NCX0lDSU1WQVUKKy5lbmRtCisKKy8qCisgKiBJbnZhbGlkYXRlIHRoZSBpY2FjaGUsIGlubmVyIHNoYXJlYWJsZSBpZiBTTVAsIGludmFsaWRhdGUgQlRCIGZvciBVUC4KKyAqIHJ0IGRhdGEgaWdub3JlZCBieSBJQ0lBTExVKElTKSwgc28gY2FuIGJlIHVzZWQgZm9yIHRoZSBhZGRyZXNzCisgKi8KKy5tYWNybyBpbnZhbGlkYXRlX2ljYWNoZSwgcnQKKwl2N21fY2FjaGVvcCBccnQsIFxydCwgVjdNX1NDQl9JQ0lBTExVCisJbW92IFxydCwgIzAKKy5lbmRtCisKKy8qCisgKiBJbnZhbGlkYXRlIHRoZSBCVEIsIGlubmVyIHNoYXJlYWJsZSBpZiBTTVAuCisgKiBydCBkYXRhIGlnbm9yZWQgYnkgQlBJQUxMLCBzbyBpdCBjYW4gYmUgdXNlZCBmb3IgdGhlIGFkZHJlc3MKKyAqLworLm1hY3JvIGludmFsaWRhdGVfYnAsIHJ0CisJdjdtX2NhY2hlb3AgXHJ0LCBccnQsIFY3TV9TQ0JfQlBJQUxMCisJbW92IFxydCwgIzAKKy5lbmRtCisKK0VOVFJZKHY3bV9pbnZhbGlkYXRlX2wxKQorCW1vdglyMCwgIzAKKworCXdyaXRlX2Nzc2VsciByMCwgcjEKKwlyZWFkX2Njc2lkciByMAorCisJbW92dwlyMSwgIzB4N2ZmZgorCWFuZAlyMiwgcjEsIHIwLCBsc3IgIzEzCisKKwltb3Z3CXIxLCAjMHgzZmYKKworCWFuZAlyMywgcjEsIHIwLCBsc3IgIzMgICAgICBAIE51bVdheXMgLSAxCisJYWRkCXIyLCByMiwgIzEgICAgICAgICAgICAgIEAgTnVtU2V0cworCisJYW5kCXIwLCByMCwgIzB4NworCWFkZAlyMCwgcjAsICM0ICAgICAgQCBTZXRTaGlmdAorCisJY2x6CXIxLCByMyAgICAgICAgICBAIFdheVNoaWZ0CisJYWRkCXI0LCByMywgIzEgICAgICBAIE51bVdheXMKKzE6CXN1YglyMiwgcjIsICMxICAgICAgQCBOdW1TZXRzLS0KKwltb3YJcjMsIHI0ICAgICAgICAgIEAgVGVtcCA9IE51bVdheXMKKzI6CXN1YnMJcjMsIHIzLCAjMSAgICAgIEAgVGVtcC0tCisJbW92CXI1LCByMywgbHNsIHIxCisJbW92CXI2LCByMiwgbHNsIHIwCisJb3JyCXI1LCByNSwgcjYgICAgICBAIFJlZyA9IChUZW1wPDxXYXlTaGlmdCl8KE51bVNldHM8PFNldFNoaWZ0KQorCWRjaXN3CXI1LCByNgorCWJndAkyYgorCWNtcAlyMiwgIzAKKwliZ3QJMWIKKwlkc2IJc3QKKwlpc2IKKwlyZXQJbHIKK0VORFBST0ModjdtX2ludmFsaWRhdGVfbDEpCisKKy8qCisgKgl2N21fZmx1c2hfaWNhY2hlX2FsbCgpCisgKgorICoJRmx1c2ggdGhlIHdob2xlIEktY2FjaGUuCisgKgorICoJUmVnaXN0ZXJzOgorICoJcjAgLSBzZXQgdG8gMAorICovCitFTlRSWSh2N21fZmx1c2hfaWNhY2hlX2FsbCkKKwlpbnZhbGlkYXRlX2ljYWNoZSByMAorCXJldAlscgorRU5EUFJPQyh2N21fZmx1c2hfaWNhY2hlX2FsbCkKKworLyoKKyAqCXY3bV9mbHVzaF9kY2FjaGVfYWxsKCkKKyAqCisgKglGbHVzaCB0aGUgd2hvbGUgRC1jYWNoZS4KKyAqCisgKglDb3JydXB0ZWQgcmVnaXN0ZXJzOiByMC1yNywgcjktcjExCisgKi8KK0VOVFJZKHY3bV9mbHVzaF9kY2FjaGVfYWxsKQorCWRtYgkJCQkJQCBlbnN1cmUgb3JkZXJpbmcgd2l0aCBwcmV2aW91cyBtZW1vcnkgYWNjZXNzZXMKKwlyZWFkX2NsaWRyIHIwCisJbW92CXIzLCByMCwgbHNyICMyMwkJCUAgbW92ZSBMb0MgaW50byBwb3NpdGlvbgorCWFuZHMJcjMsIHIzLCAjNyA8PCAxCQkJQCBleHRyYWN0IExvQyoyIGZyb20gY2xpZHIKKwliZXEJZmluaXNoZWQJCQlAIGlmIGxvYyBpcyAwLCB0aGVuIG5vIG5lZWQgdG8gY2xlYW4KK3N0YXJ0X2ZsdXNoX2xldmVsczoKKwltb3YJcjEwLCAjMAkJCQlAIHN0YXJ0IGNsZWFuIGF0IGNhY2hlIGxldmVsIDAKK2ZsdXNoX2xldmVsczoKKwlhZGQJcjIsIHIxMCwgcjEwLCBsc3IgIzEJCUAgd29yayBvdXQgM3ggY3VycmVudCBjYWNoZSBsZXZlbAorCW1vdglyMSwgcjAsIGxzciByMgkJCUAgZXh0cmFjdCBjYWNoZSB0eXBlIGJpdHMgZnJvbSBjbGlkcgorCWFuZAlyMSwgcjEsICM3CQkJQCBtYXNrIG9mIHRoZSBiaXRzIGZvciBjdXJyZW50IGNhY2hlIG9ubHkKKwljbXAJcjEsICMyCQkJCUAgc2VlIHdoYXQgY2FjaGUgd2UgaGF2ZSBhdCB0aGlzIGxldmVsCisJYmx0CXNraXAJCQkJQCBza2lwIGlmIG5vIGNhY2hlLCBvciBqdXN0IGktY2FjaGUKKyNpZmRlZiBDT05GSUdfUFJFRU1QVAorCXNhdmVfYW5kX2Rpc2FibGVfaXJxc19ub3RyYWNlIHI5CUAgbWFrZSBjc3NyJmNzaWRyIHJlYWQgYXRvbWljCisjZW5kaWYKKwl3cml0ZV9jc3NlbHIgcjEwLCByMQkJCUAgc2V0IGN1cnJlbnQgY2FjaGUgbGV2ZWwKKwlpc2IJCQkJCUAgaXNiIHRvIHN5Y2ggdGhlIG5ldyBjc3NyJmNzaWRyCisJcmVhZF9jY3NpZHIgcjEJCQkJQCByZWFkIHRoZSBuZXcgY3NpZHIKKyNpZmRlZiBDT05GSUdfUFJFRU1QVAorCXJlc3RvcmVfaXJxc19ub3RyYWNlIHI5CisjZW5kaWYKKwlhbmQJcjIsIHIxLCAjNwkJCUAgZXh0cmFjdCB0aGUgbGVuZ3RoIG9mIHRoZSBjYWNoZSBsaW5lcworCWFkZAlyMiwgcjIsICM0CQkJQCBhZGQgNCAobGluZSBsZW5ndGggb2Zmc2V0KQorCW1vdncJcjQsICMweDNmZgorCWFuZHMJcjQsIHI0LCByMSwgbHNyICMzCQlAIGZpbmQgbWF4aW11bSBudW1iZXIgb24gdGhlIHdheSBzaXplCisJY2x6CXI1LCByNAkJCQlAIGZpbmQgYml0IHBvc2l0aW9uIG9mIHdheSBzaXplIGluY3JlbWVudAorCW1vdncJcjcsICMweDdmZmYKKwlhbmRzCXI3LCByNywgcjEsIGxzciAjMTMJCUAgZXh0cmFjdCBtYXggbnVtYmVyIG9mIHRoZSBpbmRleCBzaXplCitsb29wMToKKwltb3YJcjksIHI3CQkJCUAgY3JlYXRlIHdvcmtpbmcgY29weSBvZiBtYXggaW5kZXgKK2xvb3AyOgorCWxzbAlyNiwgcjQsIHI1CisJb3JyCXIxMSwgcjEwLCByNgkJCUAgZmFjdG9yIHdheSBhbmQgY2FjaGUgbnVtYmVyIGludG8gcjExCisJbHNsCXI2LCByOSwgcjIKKwlvcnIJcjExLCByMTEsIHI2CQkJQCBmYWN0b3IgaW5kZXggbnVtYmVyIGludG8gcjExCisJZGNjaXN3CXIxMSwgcjYJCQkJQCBjbGVhbi9pbnZhbGlkYXRlIGJ5IHNldC93YXkKKwlzdWJzCXI5LCByOSwgIzEJCQlAIGRlY3JlbWVudCB0aGUgaW5kZXgKKwliZ2UJbG9vcDIKKwlzdWJzCXI0LCByNCwgIzEJCQlAIGRlY3JlbWVudCB0aGUgd2F5CisJYmdlCWxvb3AxCitza2lwOgorCWFkZAlyMTAsIHIxMCwgIzIJCQlAIGluY3JlbWVudCBjYWNoZSBudW1iZXIKKwljbXAJcjMsIHIxMAorCWJndAlmbHVzaF9sZXZlbHMKK2ZpbmlzaGVkOgorCW1vdglyMTAsICMwCQkJCUAgc3dpdGggYmFjayB0byBjYWNoZSBsZXZlbCAwCisJd3JpdGVfY3NzZWxyIHIxMCwgcjMJCQlAIHNlbGVjdCBjdXJyZW50IGNhY2hlIGxldmVsIGluIGNzc3IKKwlkc2IJc3QKKwlpc2IKKwlyZXQJbHIKK0VORFBST0ModjdtX2ZsdXNoX2RjYWNoZV9hbGwpCisKKy8qCisgKgl2N21fZmx1c2hfY2FjaGVfYWxsKCkKKyAqCisgKglGbHVzaCB0aGUgZW50aXJlIGNhY2hlIHN5c3RlbS4KKyAqICBUaGUgZGF0YSBjYWNoZSBmbHVzaCBpcyBub3cgYWNoaWV2ZWQgdXNpbmcgYXRvbWljIGNsZWFuIC8gaW52YWxpZGF0ZXMKKyAqICB3b3JraW5nIG91dHdhcmRzIGZyb20gTDEgY2FjaGUuIFRoaXMgaXMgZG9uZSB1c2luZyBTZXQvV2F5IGJhc2VkIGNhY2hlCisgKiAgbWFpbnRlbmFuY2UgaW5zdHJ1Y3Rpb25zLgorICogIFRoZSBpbnN0cnVjdGlvbiBjYWNoZSBjYW4gc3RpbGwgYmUgaW52YWxpZGF0ZWQgYmFjayB0byB0aGUgcG9pbnQgb2YKKyAqICB1bmlmaWNhdGlvbiBpbiBhIHNpbmdsZSBpbnN0cnVjdGlvbi4KKyAqCisgKi8KK0VOVFJZKHY3bV9mbHVzaF9rZXJuX2NhY2hlX2FsbCkKKwlzdG1mZAlzcCEsIHtyNC1yNywgcjktcjExLCBscn0KKwlibAl2N21fZmx1c2hfZGNhY2hlX2FsbAorCWludmFsaWRhdGVfaWNhY2hlIHIwCisJbGRtZmQJc3AhLCB7cjQtcjcsIHI5LXIxMSwgbHJ9CisJcmV0CWxyCitFTkRQUk9DKHY3bV9mbHVzaF9rZXJuX2NhY2hlX2FsbCkKKworLyoKKyAqCXY3bV9mbHVzaF9jYWNoZV9hbGwoKQorICoKKyAqCUZsdXNoIGFsbCBUTEIgZW50cmllcyBpbiBhIHBhcnRpY3VsYXIgYWRkcmVzcyBzcGFjZQorICoKKyAqCS0gbW0gICAgLSBtbV9zdHJ1Y3QgZGVzY3JpYmluZyBhZGRyZXNzIHNwYWNlCisgKi8KK0VOVFJZKHY3bV9mbHVzaF91c2VyX2NhY2hlX2FsbCkKKwkvKkZBTExUSFJPVUdIKi8KKworLyoKKyAqCXY3bV9mbHVzaF9jYWNoZV9yYW5nZShzdGFydCwgZW5kLCBmbGFncykKKyAqCisgKglGbHVzaCBhIHJhbmdlIG9mIFRMQiBlbnRyaWVzIGluIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBzcGFjZS4KKyAqCisgKgktIHN0YXJ0IC0gc3RhcnQgYWRkcmVzcyAobWF5IG5vdCBiZSBhbGlnbmVkKQorICoJLSBlbmQgICAtIGVuZCBhZGRyZXNzIChleGNsdXNpdmUsIG1heSBub3QgYmUgYWxpZ25lZCkKKyAqCS0gZmxhZ3MJLSB2bV9hcmVhX3N0cnVjdCBmbGFncyBkZXNjcmliaW5nIGFkZHJlc3Mgc3BhY2UKKyAqCisgKglJdCBpcyBhc3N1bWVkIHRoYXQ6CisgKgktIHdlIGhhdmUgYSBWSVBUIGNhY2hlLgorICovCitFTlRSWSh2N21fZmx1c2hfdXNlcl9jYWNoZV9yYW5nZSkKKwlyZXQJbHIKK0VORFBST0ModjdtX2ZsdXNoX3VzZXJfY2FjaGVfYWxsKQorRU5EUFJPQyh2N21fZmx1c2hfdXNlcl9jYWNoZV9yYW5nZSkKKworLyoKKyAqCXY3bV9jb2hlcmVudF9rZXJuX3JhbmdlKHN0YXJ0LGVuZCkKKyAqCisgKglFbnN1cmUgdGhhdCB0aGUgSSBhbmQgRCBjYWNoZXMgYXJlIGNvaGVyZW50IHdpdGhpbiBzcGVjaWZpZWQKKyAqCXJlZ2lvbi4gIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgd2hlbiBjb2RlIGhhcyBiZWVuIHdyaXR0ZW4gdG8KKyAqCWEgbWVtb3J5IHJlZ2lvbiwgYW5kIHdpbGwgYmUgZXhlY3V0ZWQuCisgKgorICoJLSBzdGFydCAgIC0gdmlydHVhbCBzdGFydCBhZGRyZXNzIG9mIHJlZ2lvbgorICoJLSBlbmQgICAgIC0gdmlydHVhbCBlbmQgYWRkcmVzcyBvZiByZWdpb24KKyAqCisgKglJdCBpcyBhc3N1bWVkIHRoYXQ6CisgKgktIHRoZSBJY2FjaGUgZG9lcyBub3QgcmVhZCBkYXRhIGZyb20gdGhlIHdyaXRlIGJ1ZmZlcgorICovCitFTlRSWSh2N21fY29oZXJlbnRfa2Vybl9yYW5nZSkKKwkvKiBGQUxMVEhST1VHSCAqLworCisvKgorICoJdjdtX2NvaGVyZW50X3VzZXJfcmFuZ2Uoc3RhcnQsZW5kKQorICoKKyAqCUVuc3VyZSB0aGF0IHRoZSBJIGFuZCBEIGNhY2hlcyBhcmUgY29oZXJlbnQgd2l0aGluIHNwZWNpZmllZAorICoJcmVnaW9uLiAgVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCB3aGVuIGNvZGUgaGFzIGJlZW4gd3JpdHRlbiB0bworICoJYSBtZW1vcnkgcmVnaW9uLCBhbmQgd2lsbCBiZSBleGVjdXRlZC4KKyAqCisgKgktIHN0YXJ0ICAgLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3Mgb2YgcmVnaW9uCisgKgktIGVuZCAgICAgLSB2aXJ0dWFsIGVuZCBhZGRyZXNzIG9mIHJlZ2lvbgorICoKKyAqCUl0IGlzIGFzc3VtZWQgdGhhdDoKKyAqCS0gdGhlIEljYWNoZSBkb2VzIG5vdCByZWFkIGRhdGEgZnJvbSB0aGUgd3JpdGUgYnVmZmVyCisgKi8KK0VOVFJZKHY3bV9jb2hlcmVudF91c2VyX3JhbmdlKQorIFVOV0lORCguZm5zdGFydAkJKQorCWRjYWNoZV9saW5lX3NpemUgcjIsIHIzCisJc3ViCXIzLCByMiwgIzEKKwliaWMJcjEyLCByMCwgcjMKKzE6CisvKgorICogV2UgdXNlIG9wZW4gY29kZWQgdmVyc2lvbiBvZiBkY2NtdmF1IG90aGVyd2lzZSBVU0VSKCkgd291bGQKKyAqIHBvaW50IGF0IG1vdncgaW5zdHJ1Y3Rpb24uCisgKi8KKwlkY2NtdmF1CXIxMiwgcjMKKwlhZGQJcjEyLCByMTIsIHIyCisJY21wCXIxMiwgcjEKKwlibG8JMWIKKwlkc2IJaXNoc3QKKwlpY2FjaGVfbGluZV9zaXplIHIyLCByMworCXN1YglyMywgcjIsICMxCisJYmljCXIxMiwgcjAsIHIzCisyOgorCWljaW12YXUgcjEyLCByMworCWFkZAlyMTIsIHIxMiwgcjIKKwljbXAJcjEyLCByMQorCWJsbwkyYgorCWludmFsaWRhdGVfYnAgcjAKKwlkc2IJaXNoc3QKKwlpc2IKKwlyZXQJbHIKKyBVTldJTkQoLmZuZW5kCQkpCitFTkRQUk9DKHY3bV9jb2hlcmVudF9rZXJuX3JhbmdlKQorRU5EUFJPQyh2N21fY29oZXJlbnRfdXNlcl9yYW5nZSkKKworLyoKKyAqCXY3bV9mbHVzaF9rZXJuX2RjYWNoZV9hcmVhKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKQorICoKKyAqCUVuc3VyZSB0aGF0IHRoZSBkYXRhIGhlbGQgaW4gdGhlIHBhZ2Uga2FkZHIgaXMgd3JpdHRlbiBiYWNrCisgKgl0byB0aGUgcGFnZSBpbiBxdWVzdGlvbi4KKyAqCisgKgktIGFkZHIJLSBrZXJuZWwgYWRkcmVzcworICoJLSBzaXplCS0gcmVnaW9uIHNpemUKKyAqLworRU5UUlkodjdtX2ZsdXNoX2tlcm5fZGNhY2hlX2FyZWEpCisJZGNhY2hlX2xpbmVfc2l6ZSByMiwgcjMKKwlhZGQJcjEsIHIwLCByMQorCXN1YglyMywgcjIsICMxCisJYmljCXIwLCByMCwgcjMKKzE6CisJZGNjaW12YWMgcjAsIHIzCQlAIGNsZWFuICYgaW52YWxpZGF0ZSBEIGxpbmUgLyB1bmlmaWVkIGxpbmUKKwlhZGQJcjAsIHIwLCByMgorCWNtcAlyMCwgcjEKKwlibG8JMWIKKwlkc2IJc3QKKwlyZXQJbHIKK0VORFBST0ModjdtX2ZsdXNoX2tlcm5fZGNhY2hlX2FyZWEpCisKKy8qCisgKgl2N21fZG1hX2ludl9yYW5nZShzdGFydCxlbmQpCisgKgorICoJSW52YWxpZGF0ZSB0aGUgZGF0YSBjYWNoZSB3aXRoaW4gdGhlIHNwZWNpZmllZCByZWdpb247IHdlIHdpbGwKKyAqCWJlIHBlcmZvcm1pbmcgYSBETUEgb3BlcmF0aW9uIGluIHRoaXMgcmVnaW9uIGFuZCB3ZSB3YW50IHRvCisgKglwdXJnZSBvbGQgZGF0YSBpbiB0aGUgY2FjaGUuCisgKgorICoJLSBzdGFydCAgIC0gdmlydHVhbCBzdGFydCBhZGRyZXNzIG9mIHJlZ2lvbgorICoJLSBlbmQgICAgIC0gdmlydHVhbCBlbmQgYWRkcmVzcyBvZiByZWdpb24KKyAqLwordjdtX2RtYV9pbnZfcmFuZ2U6CisJZGNhY2hlX2xpbmVfc2l6ZSByMiwgcjMKKwlzdWIJcjMsIHIyLCAjMQorCXRzdAlyMCwgcjMKKwliaWMJcjAsIHIwLCByMworCWRjY2ltdmFjbmUgcjAsIHIzCisJc3VibmUJcjMsIHIyLCAjMQlAIHJlc3RvcmUgcjMsIGNvcnJ1cHRlZCBieSB2N20ncyBkY2NpbXZhYworCXRzdAlyMSwgcjMKKwliaWMJcjEsIHIxLCByMworCWRjY2ltdmFjbmUgcjEsIHIzCisxOgorCWRjaW12YWMgcjAsIHIzCisJYWRkCXIwLCByMCwgcjIKKwljbXAJcjAsIHIxCisJYmxvCTFiCisJZHNiCXN0CisJcmV0CWxyCitFTkRQUk9DKHY3bV9kbWFfaW52X3JhbmdlKQorCisvKgorICoJdjdtX2RtYV9jbGVhbl9yYW5nZShzdGFydCxlbmQpCisgKgktIHN0YXJ0ICAgLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3Mgb2YgcmVnaW9uCisgKgktIGVuZCAgICAgLSB2aXJ0dWFsIGVuZCBhZGRyZXNzIG9mIHJlZ2lvbgorICovCit2N21fZG1hX2NsZWFuX3JhbmdlOgorCWRjYWNoZV9saW5lX3NpemUgcjIsIHIzCisJc3ViCXIzLCByMiwgIzEKKwliaWMJcjAsIHIwLCByMworMToKKwlkY2NtdmFjIHIwLCByMwkJCUAgY2xlYW4gRCAvIFUgbGluZQorCWFkZAlyMCwgcjAsIHIyCisJY21wCXIwLCByMQorCWJsbwkxYgorCWRzYglzdAorCXJldAlscgorRU5EUFJPQyh2N21fZG1hX2NsZWFuX3JhbmdlKQorCisvKgorICoJdjdtX2RtYV9mbHVzaF9yYW5nZShzdGFydCxlbmQpCisgKgktIHN0YXJ0ICAgLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3Mgb2YgcmVnaW9uCisgKgktIGVuZCAgICAgLSB2aXJ0dWFsIGVuZCBhZGRyZXNzIG9mIHJlZ2lvbgorICovCitFTlRSWSh2N21fZG1hX2ZsdXNoX3JhbmdlKQorCWRjYWNoZV9saW5lX3NpemUgcjIsIHIzCisJc3ViCXIzLCByMiwgIzEKKwliaWMJcjAsIHIwLCByMworMToKKwlkY2NpbXZhYyByMCwgcjMJCQkgQCBjbGVhbiAmIGludmFsaWRhdGUgRCAvIFUgbGluZQorCWFkZAlyMCwgcjAsIHIyCisJY21wCXIwLCByMQorCWJsbwkxYgorCWRzYglzdAorCXJldAlscgorRU5EUFJPQyh2N21fZG1hX2ZsdXNoX3JhbmdlKQorCisvKgorICoJZG1hX21hcF9hcmVhKHN0YXJ0LCBzaXplLCBkaXIpCisgKgktIHN0YXJ0CS0ga2VybmVsIHZpcnR1YWwgc3RhcnQgYWRkcmVzcworICoJLSBzaXplCS0gc2l6ZSBvZiByZWdpb24KKyAqCS0gZGlyCS0gRE1BIGRpcmVjdGlvbgorICovCitFTlRSWSh2N21fZG1hX21hcF9hcmVhKQorCWFkZAlyMSwgcjEsIHIwCisJdGVxCXIyLCAjRE1BX0ZST01fREVWSUNFCisJYmVxCXY3bV9kbWFfaW52X3JhbmdlCisJYgl2N21fZG1hX2NsZWFuX3JhbmdlCitFTkRQUk9DKHY3bV9kbWFfbWFwX2FyZWEpCisKKy8qCisgKglkbWFfdW5tYXBfYXJlYShzdGFydCwgc2l6ZSwgZGlyKQorICoJLSBzdGFydAktIGtlcm5lbCB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3MKKyAqCS0gc2l6ZQktIHNpemUgb2YgcmVnaW9uCisgKgktIGRpcgktIERNQSBkaXJlY3Rpb24KKyAqLworRU5UUlkodjdtX2RtYV91bm1hcF9hcmVhKQorCWFkZAlyMSwgcjEsIHIwCisJdGVxCXIyLCAjRE1BX1RPX0RFVklDRQorCWJuZQl2N21fZG1hX2ludl9yYW5nZQorCXJldAlscgorRU5EUFJPQyh2N21fZG1hX3VubWFwX2FyZWEpCisKKwkuZ2xvYmwJdjdtX2ZsdXNoX2tlcm5fY2FjaGVfbG91aXMKKwkuZXF1CXY3bV9mbHVzaF9rZXJuX2NhY2hlX2xvdWlzLCB2N21fZmx1c2hfa2Vybl9jYWNoZV9hbGwKKworCV9fSU5JVERBVEEKKworCUAgZGVmaW5lIHN0cnVjdCBjcHVfY2FjaGVfZm5zIChzZWUgPGFzbS9jYWNoZWZsdXNoLmg+IGFuZCBwcm9jLW1hY3Jvcy5TKQorCWRlZmluZV9jYWNoZV9mdW5jdGlvbnMgdjdtCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9kbWEtbWFwcGluZy5jIGIvYXJjaC9hcm0vbW0vZG1hLW1hcHBpbmcuYwppbmRleCBjNjgzNGMwLi5hYjRmNzQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9kbWEtbWFwcGluZy5jCisrKyBiL2FyY2gvYXJtL21tL2RtYS1tYXBwaW5nLmMKQEAgLTQzNiw3ICs0MzYsNyBAQAogCQlnZW5fcG9vbF9zZXRfYWxnbyhhdG9taWNfcG9vbCwKIAkJCQlnZW5fcG9vbF9maXJzdF9maXRfb3JkZXJfYWxpZ24sCiAJCQkJKHZvaWQgKilQQUdFX1NISUZUKTsKLQkJcHJfaW5mbygiRE1BOiBwcmVhbGxvY2F0ZWQgJXpkIEtpQiBwb29sIGZvciBhdG9taWMgY29oZXJlbnQgYWxsb2NhdGlvbnNcbiIsCisJCXByX2luZm8oIkRNQTogcHJlYWxsb2NhdGVkICV6dSBLaUIgcG9vbCBmb3IgYXRvbWljIGNvaGVyZW50IGFsbG9jYXRpb25zXG4iLAogCQkgICAgICAgYXRvbWljX3Bvb2xfc2l6ZSAvIDEwMjQpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC00NDUsNyArNDQ1LDcgQEAKIAlnZW5fcG9vbF9kZXN0cm95KGF0b21pY19wb29sKTsKIAlhdG9taWNfcG9vbCA9IE5VTEw7CiBvdXQ6Ci0JcHJfZXJyKCJETUE6IGZhaWxlZCB0byBhbGxvY2F0ZSAlenggS2lCIHBvb2wgZm9yIGF0b21pYyBjb2hlcmVudCBhbGxvY2F0aW9uXG4iLAorCXByX2VycigiRE1BOiBmYWlsZWQgdG8gYWxsb2NhdGUgJXp1IEtpQiBwb29sIGZvciBhdG9taWMgY29oZXJlbnQgYWxsb2NhdGlvblxuIiwKIAkgICAgICAgYXRvbWljX3Bvb2xfc2l6ZSAvIDEwMjQpOwogCXJldHVybiAtRU5PTUVNOwogfQpAQCAtMjAxNCw2ICsyMDE0LDYzIEBACiAJX19mcmVlX2lvdmEobWFwcGluZywgaW92YSwgbGVuKTsKIH0KIAorLyoqCisgKiBhcm1faW9tbXVfbWFwX3Jlc291cmNlIC0gbWFwIGEgZGV2aWNlIHJlc291cmNlIGZvciBETUEKKyAqIEBkZXY6IHZhbGlkIHN0cnVjdCBkZXZpY2UgcG9pbnRlcgorICogQHBoeXNfYWRkcjogcGh5c2ljYWwgYWRkcmVzcyBvZiByZXNvdXJjZQorICogQHNpemU6IHNpemUgb2YgcmVzb3VyY2UgdG8gbWFwCisgKiBAZGlyOiBETUEgdHJhbnNmZXIgZGlyZWN0aW9uCisgKi8KK3N0YXRpYyBkbWFfYWRkcl90IGFybV9pb21tdV9tYXBfcmVzb3VyY2Uoc3RydWN0IGRldmljZSAqZGV2LAorCQlwaHlzX2FkZHJfdCBwaHlzX2FkZHIsIHNpemVfdCBzaXplLAorCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsIHVuc2lnbmVkIGxvbmcgYXR0cnMpCit7CisJc3RydWN0IGRtYV9pb21tdV9tYXBwaW5nICptYXBwaW5nID0gdG9fZG1hX2lvbW11X21hcHBpbmcoZGV2KTsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCWludCByZXQsIHByb3Q7CisJcGh5c19hZGRyX3QgYWRkciA9IHBoeXNfYWRkciAmIFBBR0VfTUFTSzsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gcGh5c19hZGRyICYgflBBR0VfTUFTSzsKKwlzaXplX3QgbGVuID0gUEFHRV9BTElHTihzaXplICsgb2Zmc2V0KTsKKworCWRtYV9hZGRyID0gX19hbGxvY19pb3ZhKG1hcHBpbmcsIGxlbik7CisJaWYgKGRtYV9hZGRyID09IERNQV9FUlJPUl9DT0RFKQorCQlyZXR1cm4gZG1hX2FkZHI7CisKKwlwcm90ID0gX19kbWFfZGlyZWN0aW9uX3RvX3Byb3QoZGlyKSB8IElPTU1VX01NSU87CisKKwlyZXQgPSBpb21tdV9tYXAobWFwcGluZy0+ZG9tYWluLCBkbWFfYWRkciwgYWRkciwgbGVuLCBwcm90KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBmYWlsOworCisJcmV0dXJuIGRtYV9hZGRyICsgb2Zmc2V0OworZmFpbDoKKwlfX2ZyZWVfaW92YShtYXBwaW5nLCBkbWFfYWRkciwgbGVuKTsKKwlyZXR1cm4gRE1BX0VSUk9SX0NPREU7Cit9CisKKy8qKgorICogYXJtX2lvbW11X3VubWFwX3Jlc291cmNlIC0gdW5tYXAgYSBkZXZpY2UgRE1BIHJlc291cmNlCisgKiBAZGV2OiB2YWxpZCBzdHJ1Y3QgZGV2aWNlIHBvaW50ZXIKKyAqIEBkbWFfaGFuZGxlOiBETUEgYWRkcmVzcyB0byByZXNvdXJjZQorICogQHNpemU6IHNpemUgb2YgcmVzb3VyY2UgdG8gbWFwCisgKiBAZGlyOiBETUEgdHJhbnNmZXIgZGlyZWN0aW9uCisgKi8KK3N0YXRpYyB2b2lkIGFybV9pb21tdV91bm1hcF9yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKKwkJc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKKwkJdW5zaWduZWQgbG9uZyBhdHRycykKK3sKKwlzdHJ1Y3QgZG1hX2lvbW11X21hcHBpbmcgKm1hcHBpbmcgPSB0b19kbWFfaW9tbXVfbWFwcGluZyhkZXYpOworCWRtYV9hZGRyX3QgaW92YSA9IGRtYV9oYW5kbGUgJiBQQUdFX01BU0s7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IGRtYV9oYW5kbGUgJiB+UEFHRV9NQVNLOworCXNpemVfdCBsZW4gPSBQQUdFX0FMSUdOKHNpemUgKyBvZmZzZXQpOworCisJaWYgKCFpb3ZhKQorCQlyZXR1cm47CisKKwlpb21tdV91bm1hcChtYXBwaW5nLT5kb21haW4sIGlvdmEsIGxlbik7CisJX19mcmVlX2lvdmEobWFwcGluZywgaW92YSwgbGVuKTsKK30KKwogc3RhdGljIHZvaWQgYXJtX2lvbW11X3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqZGV2LAogCQlkbWFfYWRkcl90IGhhbmRsZSwgc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKIHsKQEAgLTIwNTcsNiArMjExNCw5IEBACiAJLnVubWFwX3NnCQk9IGFybV9pb21tdV91bm1hcF9zZywKIAkuc3luY19zZ19mb3JfY3B1CT0gYXJtX2lvbW11X3N5bmNfc2dfZm9yX2NwdSwKIAkuc3luY19zZ19mb3JfZGV2aWNlCT0gYXJtX2lvbW11X3N5bmNfc2dfZm9yX2RldmljZSwKKworCS5tYXBfcmVzb3VyY2UJCT0gYXJtX2lvbW11X21hcF9yZXNvdXJjZSwKKwkudW5tYXBfcmVzb3VyY2UJCT0gYXJtX2lvbW11X3VubWFwX3Jlc291cmNlLAogfTsKIAogc3RydWN0IGRtYV9tYXBfb3BzIGlvbW11X2NvaGVyZW50X29wcyA9IHsKQEAgLTIwNzAsNiArMjEzMCw5IEBACiAKIAkubWFwX3NnCQk9IGFybV9jb2hlcmVudF9pb21tdV9tYXBfc2csCiAJLnVubWFwX3NnCT0gYXJtX2NvaGVyZW50X2lvbW11X3VubWFwX3NnLAorCisJLm1hcF9yZXNvdXJjZQk9IGFybV9pb21tdV9tYXBfcmVzb3VyY2UsCisJLnVubWFwX3Jlc291cmNlCT0gYXJtX2lvbW11X3VubWFwX3Jlc291cmNlLAogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9tbXUuYyBiL2FyY2gvYXJtL21tL21tdS5jCmluZGV4IDYyZjRkMDEuLjQwMDFkZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL21tdS5jCisrKyBiL2FyY2gvYXJtL21tL21tdS5jCkBAIC0xMzcsNyArMTM3LDcgQEAKIAogCWluaXRpYWxfcG1kX3ZhbHVlID0gcG1kOwogCi0JcG1kICY9IFBNRF9TRUNUX1RFWCgxKSB8IFBNRF9TRUNUX0JVRkZFUkFCTEUgfCBQTURfU0VDVF9DQUNIRUFCTEU7CisJcG1kICY9IFBNRF9TRUNUX0NBQ0hFX01BU0s7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjYWNoZV9wb2xpY2llcyk7IGkrKykKIAkJaWYgKGNhY2hlX3BvbGljaWVzW2ldLnBtZCA9PSBwbWQpIHsKQEAgLTI0Myw3ICsyNDMsNyBAQAogI2RlZmluZSBQUk9UX1BURV9TMl9ERVZJQ0UJUFJPVF9QVEVfREVWSUNFCiAjZGVmaW5lIFBST1RfU0VDVF9ERVZJQ0UJUE1EX1RZUEVfU0VDVHxQTURfU0VDVF9BUF9XUklURQogCi1zdGF0aWMgc3RydWN0IG1lbV90eXBlIG1lbV90eXBlc1tdID0geworc3RhdGljIHN0cnVjdCBtZW1fdHlwZSBtZW1fdHlwZXNbXSBfX3JvX2FmdGVyX2luaXQgPSB7CiAJW01UX0RFVklDRV0gPSB7CQkgIC8qIFN0cm9uZ2x5IG9yZGVyZWQgLyBBUk12NiBzaGFyZWQgZGV2aWNlICovCiAJCS5wcm90X3B0ZQk9IFBST1RfUFRFX0RFVklDRSB8IExfUFRFX01UX0RFVl9TSEFSRUQgfAogCQkJCSAgTF9QVEVfU0hBUkVELApAQCAtNzI4LDcgKzcyOCw4IEBACiB7CiAJdm9pZCAqcHRyID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKFBHQUxMT0NfR0ZQLCBnZXRfb3JkZXIoc3opKTsKIAotCUJVR19PTighcHRyKTsKKwlpZiAoIXB0ciB8fCAhcGd0YWJsZV9wYWdlX2N0b3IodmlydF90b19wYWdlKHB0cikpKQorCQlCVUcoKTsKIAlyZXR1cm4gcHRyOwogfQogCkBAIC0xMTU1LDEwICsxMTU2LDE5IEBACiB7CiAJcGh5c19hZGRyX3QgbWVtYmxvY2tfbGltaXQgPSAwOwogCWludCBoaWdobWVtID0gMDsKLQlwaHlzX2FkZHJfdCB2bWFsbG9jX2xpbWl0ID0gX19wYSh2bWFsbG9jX21pbiAtIDEpICsgMTsKKwl1NjQgdm1hbGxvY19saW1pdDsKIAlzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyZWc7CiAJYm9vbCBzaG91bGRfdXNlX2hpZ2htZW0gPSBmYWxzZTsKIAorCS8qCisJICogTGV0J3MgdXNlIG91ciBvd24gKHVub3B0aW1pemVkKSBlcXVpdmFsZW50IG9mIF9fcGEoKSB0aGF0IGlzCisJICogbm90IGFmZmVjdGVkIGJ5IHdyYXAtYXJvdW5kcyB3aGVuIHNpemVvZihwaHlzX2FkZHJfdCkgPT0gNC4KKwkgKiBUaGUgcmVzdWx0IGlzIHVzZWQgYXMgdGhlIHVwcGVyIGJvdW5kIG9uIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzCisJICogYW5kIG1heSBpdHNlbGYgYmUgb3V0c2lkZSB0aGUgdmFsaWQgcmFuZ2UgZm9yIHdoaWNoIHBoeXNfYWRkcl90CisJICogYW5kIHRoZXJlZm9yZSBfX3BhKCkgaXMgZGVmaW5lZC4KKwkgKi8KKwl2bWFsbG9jX2xpbWl0ID0gKHU2NCkodWludHB0cl90KXZtYWxsb2NfbWluIC0gUEFHRV9PRkZTRVQgKyBQSFlTX09GRlNFVDsKKwogCWZvcl9lYWNoX21lbWJsb2NrKG1lbW9yeSwgcmVnKSB7CiAJCXBoeXNfYWRkcl90IGJsb2NrX3N0YXJ0ID0gcmVnLT5iYXNlOwogCQlwaHlzX2FkZHJfdCBibG9ja19lbmQgPSByZWctPmJhc2UgKyByZWctPnNpemU7CkBAIC0xMTgzLDEwICsxMTkzLDExIEBACiAJCQlpZiAocmVnLT5zaXplID4gc2l6ZV9saW1pdCkgewogCQkJCXBoeXNfYWRkcl90IG92ZXJsYXBfc2l6ZSA9IHJlZy0+c2l6ZSAtIHNpemVfbGltaXQ7CiAKLQkJCQlwcl9ub3RpY2UoIlRydW5jYXRpbmcgUkFNIGF0ICVwYS0lcGEgdG8gLSVwYSIsCi0JCQkJCSAgJmJsb2NrX3N0YXJ0LCAmYmxvY2tfZW5kLCAmdm1hbGxvY19saW1pdCk7Ci0JCQkJbWVtYmxvY2tfcmVtb3ZlKHZtYWxsb2NfbGltaXQsIG92ZXJsYXBfc2l6ZSk7CisJCQkJcHJfbm90aWNlKCJUcnVuY2F0aW5nIFJBTSBhdCAlcGEtJXBhIiwKKwkJCQkJICAmYmxvY2tfc3RhcnQsICZibG9ja19lbmQpOwogCQkJCWJsb2NrX2VuZCA9IHZtYWxsb2NfbGltaXQ7CisJCQkJcHJfY29udCgiIHRvIC0lcGEiLCAmYmxvY2tfZW5kKTsKKwkJCQltZW1ibG9ja19yZW1vdmUodm1hbGxvY19saW1pdCwgb3ZlcmxhcF9zaXplKTsKIAkJCQlzaG91bGRfdXNlX2hpZ2htZW0gPSB0cnVlOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLW1hY3Jvcy5TIGIvYXJjaC9hcm0vbW0vcHJvYy1tYWNyb3MuUwppbmRleCBjNjcxZjM0Li4wZDQwYzI4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLW1hY3Jvcy5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtbWFjcm9zLlMKQEAgLTcsNiArNywxMCBAQAogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogCisjaWZkZWYgQ09ORklHX0NQVV9WN00KKyNpbmNsdWRlIDxhc20vdjdtLmg+CisjZW5kaWYKKwogLyoKICAqIHZtYV92bV9tbSAtIGdldCBtbSBwb2ludGVyIGZyb20gdm1hIHBvaW50ZXIgKHZtYS0+dm1fbW0pCiAgKi8KQEAgLTcwLDcgKzc0LDEzIEBACiAgKiBvbiBBUk12Ny4KICAqLwogCS5tYWNybwlkY2FjaGVfbGluZV9zaXplLCByZWcsIHRtcAorI2lmZGVmIENPTkZJR19DUFVfVjdNCisJbW92dwlcdG1wLCAjOmxvd2VyMTY6QkFTRUFERFJfVjdNX1NDQiArIFY3TV9TQ0JfQ1RSCisJbW92dAlcdG1wLCAjOnVwcGVyMTY6QkFTRUFERFJfVjdNX1NDQiArIFY3TV9TQ0JfQ1RSCisJbGRyICAgICBcdG1wLCBbXHRtcF0KKyNlbHNlCiAJbXJjCXAxNSwgMCwgXHRtcCwgYzAsIGMwLCAxCQlAIHJlYWQgY3RyCisjZW5kaWYKIAlsc3IJXHRtcCwgXHRtcCwgIzE2CiAJYW5kCVx0bXAsIFx0bXAsICMweGYJCUAgY2FjaGUgbGluZSBzaXplIGVuY29kaW5nCiAJbW92CVxyZWcsICM0CQkJQCBieXRlcyBwZXIgd29yZApAQCAtODIsNyArOTIsMTMgQEAKICAqIG9uIEFSTXY3LgogICovCiAJLm1hY3JvCWljYWNoZV9saW5lX3NpemUsIHJlZywgdG1wCisjaWZkZWYgQ09ORklHX0NQVV9WN00KKwltb3Z3CVx0bXAsICM6bG93ZXIxNjpCQVNFQUREUl9WN01fU0NCICsgVjdNX1NDQl9DVFIKKwltb3Z0CVx0bXAsICM6dXBwZXIxNjpCQVNFQUREUl9WN01fU0NCICsgVjdNX1NDQl9DVFIKKwlsZHIgICAgIFx0bXAsIFtcdG1wXQorI2Vsc2UKIAltcmMJcDE1LCAwLCBcdG1wLCBjMCwgYzAsIDEJCUAgcmVhZCBjdHIKKyNlbmRpZgogCWFuZAlcdG1wLCBcdG1wLCAjMHhmCQlAIGNhY2hlIGxpbmUgc2l6ZSBlbmNvZGluZwogCW1vdglccmVnLCAjNAkJCUAgYnl0ZXMgcGVyIHdvcmQKIAltb3YJXHJlZywgXHJlZywgbHNsIFx0bXAJCUAgYWN0dWFsIGNhY2hlIGxpbmUgc2l6ZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy12Ny5TIGIvYXJjaC9hcm0vbW0vcHJvYy12Ny5TCmluZGV4IGE3MTIzYjQuLmQwMGQ1MmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtdjcuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLXY3LlMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxhc20vaHdjYXAuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS1od2RlZi5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL21lbW9yeS5oPgogCiAjaW5jbHVkZSAicHJvYy1tYWNyb3MuUyIKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy12N20uUyBiL2FyY2gvYXJtL21tL3Byb2MtdjdtLlMKaW5kZXggNzIyOWQ4ZC4uZjZkMzMzZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy12N20uUworKysgYi9hcmNoL2FybS9tbS9wcm9jLXY3bS5TCkBAIC03NCwxNCArNzQsNDIgQEAKIEVORFBST0MoY3B1X3Y3bV9kb19yZXN1bWUpCiAjZW5kaWYKIAorRU5UUlkoY3B1X2NtN19kY2FjaGVfY2xlYW5fYXJlYSkKKwlkY2FjaGVfbGluZV9zaXplIHIyLCByMworCW1vdncJcjMsICM6bG93ZXIxNjpCQVNFQUREUl9WN01fU0NCICsgVjdNX1NDQl9EQ0NNVkFDCisJbW92dAlyMywgIzp1cHBlcjE2OkJBU0VBRERSX1Y3TV9TQ0IgKyBWN01fU0NCX0RDQ01WQUMKKworMToJc3RyCXIwLCBbcjNdCQlAIGNsZWFuIEQgZW50cnkKKwlhZGQJcjAsIHIwLCByMgorCXN1YnMJcjEsIHIxLCByMgorCWJoaQkxYgorCWRzYgorCXJldAlscgorRU5EUFJPQyhjcHVfY203X2RjYWNoZV9jbGVhbl9hcmVhKQorCitFTlRSWShjcHVfY203X3Byb2NfZmluKQorCW1vdncJcjIsICM6bG93ZXIxNjooQkFTRUFERFJfVjdNX1NDQiArIFY3TV9TQ0JfQ0NSKQorCW1vdnQJcjIsICM6dXBwZXIxNjooQkFTRUFERFJfVjdNX1NDQiArIFY3TV9TQ0JfQ0NSKQorCWxkcglyMCwgW3IyXQorCWJpYwlyMCwgcjAsICMoVjdNX1NDQl9DQ1JfREMgfCBWN01fU0NCX0NDUl9JQykKKwlzdHIJcjAsIFtyMl0KKwlyZXQJbHIKK0VORFBST0MoY3B1X2NtN19wcm9jX2ZpbikKKwogCS5zZWN0aW9uICIudGV4dC5pbml0IiwgI2FsbG9jLCAjZXhlY2luc3RyCiAKK19fdjdtX2NtN19zZXR1cDoKKwltb3YJcjgsICMoVjdNX1NDQl9DQ1JfREMgfCBWN01fU0NCX0NDUl9JQ3wgVjdNX1NDQl9DQ1JfQlApCisJYglfX3Y3bV9zZXR1cF9jb250CiAvKgogICoJX192N21fc2V0dXAKICAqCiAgKglUaGlzIHNob3VsZCBiZSBhYmxlIHRvIGNvdmVyIGFsbCBBUk12Ny1NIGNvcmVzLgogICovCiBfX3Y3bV9zZXR1cDoKKwltb3YJcjgsIDAKKworX192N21fc2V0dXBfY29udDoKIAlAIENvbmZpZ3VyZSB0aGUgdmVjdG9yIHRhYmxlIGJhc2UgYWRkcmVzcwogCWxkcglyMCwgPUJBU0VBRERSX1Y3TV9TQ0IKIAlsZHIJcjEyLCA9dmVjdG9yX3RhYmxlCkBAIC0xMDQsNiArMTMyLDcgQEAKIAliYWRyCXIxLCAxZgogCWxkcglyNSwgW3IxMiwgIzExICogNF0JQCByZWFkIHRoZSBTVkMgdmVjdG9yIGVudHJ5CiAJc3RyCXIxLCBbcjEyLCAjMTEgKiA0XQlAIHdyaXRlIHRoZSB0ZW1wb3JhcnkgU1ZDIHZlY3RvciBlbnRyeQorCWRzYgogCW1vdglyNiwgbHIJCQlAIHNhdmUgTFIKIAlsZHIJc3AsID1pbml0X3RocmVhZF91bmlvbiArIFRIUkVBRF9TVEFSVF9TUAogCWNwc2llCWkKQEAgLTExNiwxNSArMTQ1LDMyIEBACiAJbW92CXIxLCAjMQogCW1zcgljb250cm9sLCByMQkJQCBUaHJlYWQgbW9kZSBoYXMgdW5wcml2aWxlZGdlZCBhY2Nlc3MKIAorCUAgQ29uZmlndXJlIGNhY2hlcyAoaWYgaW1wbGVtZW50ZWQpCisJdGVxICAgICByOCwgIzAKKwlzdG1uZWlhCXIxMiwge3IwLXI2LCBscn0JQCB2N21faW52YWxpZGF0ZV9sMSB0b3VjaGVzIHIwLXI2CisJYmxuZQl2N21faW52YWxpZGF0ZV9sMQorCXRlcSAgICAgcjgsICMwCQkJQCByZS1ldmFsdXRhZSBjb25kaXRpb24KKwlsZG1uZWlhCXIxMiwge3IwLXI2LCBscn0KKwogCUAgQ29uZmlndXJlIHRoZSBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciB0byBlbnN1cmUgOC1ieXRlIHN0YWNrIGFsaWdubWVudAogCUAgTm90ZSB0aGUgU1RLQUxJR04gYml0IGlzIGVpdGhlciBSVyBvciBSQU8uCi0JbGRyCXIxMiwgW3IwLCBWN01fU0NCX0NDUl0JQCBzeXN0ZW0gY29udHJvbCByZWdpc3RlcgotCW9ycglyMTIsICNWN01fU0NCX0NDUl9TVEtBTElHTgotCXN0cglyMTIsIFtyMCwgVjdNX1NDQl9DQ1JdCisJbGRyCXIwLCBbcjAsIFY3TV9TQ0JfQ0NSXSAgIEAgc3lzdGVtIGNvbnRyb2wgcmVnaXN0ZXIKKwlvcnIJcjAsICNWN01fU0NCX0NDUl9TVEtBTElHTgorCW9ycglyMCwgcjAsIHI4CisKIAlyZXQJbHIKIEVORFBST0MoX192N21fc2V0dXApCiAKKy8qCisgKiBDb3J0ZXgtTTcgcHJvY2Vzc29yIGZ1bmN0aW9ucworICovCisJZ2xvYmxfZXF1CWNwdV9jbTdfcHJvY19pbml0LAljcHVfdjdtX3Byb2NfaW5pdAorCWdsb2JsX2VxdQljcHVfY203X3Jlc2V0LAkJY3B1X3Y3bV9yZXNldAorCWdsb2JsX2VxdQljcHVfY203X2RvX2lkbGUsCWNwdV92N21fZG9faWRsZQorCWdsb2JsX2VxdQljcHVfY203X3N3aXRjaF9tbSwJY3B1X3Y3bV9zd2l0Y2hfbW0KKwogCWRlZmluZV9wcm9jZXNzb3JfZnVuY3Rpb25zIHY3bSwgZGFib3J0PW5vbW11X2Vhcmx5X2Fib3J0LCBwYWJvcnQ9bGVnYWN5X3BhYm9ydCwgbm9tbXU9MQorCWRlZmluZV9wcm9jZXNzb3JfZnVuY3Rpb25zIGNtNywgZGFib3J0PW5vbW11X2Vhcmx5X2Fib3J0LCBwYWJvcnQ9bGVnYWN5X3BhYm9ydCwgbm9tbXU9MQogCiAJLnNlY3Rpb24gIi5yb2RhdGEiCiAJc3RyaW5nIGNwdV9hcmNoX25hbWUsICJhcm12N20iCkBAIC0xMzMsNiArMTc5LDUwIEBACiAKIAkuc2VjdGlvbiAiLnByb2MuaW5mby5pbml0IiwgI2FsbG9jCiAKKy5tYWNybyBfX3Y3bV9wcm9jIG5hbWUsIGluaXRmdW5jLCBjYWNoZV9mbnMgPSBub3BfY2FjaGVfZm5zLCBod2NhcHMgPSAwLCAgcHJvY19mbnMgPSB2N21fcHJvY2Vzc29yX2Z1bmN0aW9ucworCS5sb25nCTAJCQkvKiBwcm9jX2luZm9fbGlzdC5fX2NwdV9tbV9tbXVfZmxhZ3MgKi8KKwkubG9uZwkwCQkJLyogcHJvY19pbmZvX2xpc3QuX19jcHVfaW9fbW11X2ZsYWdzICovCisJaW5pdGZuCVxpbml0ZnVuYywgXG5hbWUKKwkubG9uZwljcHVfYXJjaF9uYW1lCisJLmxvbmcJY3B1X2VsZl9uYW1lCisJLmxvbmcJSFdDQVBfSEFMRiB8IEhXQ0FQX1RIVU1CIHwgSFdDQVBfRkFTVF9NVUxUIHwgXGh3Y2FwcworCS5sb25nCWNwdV92N21fbmFtZQorCS5sb25nICAgXHByb2NfZm5zCisJLmxvbmcJMAkJCS8qIHByb2NfaW5mb19saXN0LnRsYiAqLworCS5sb25nCTAJCQkvKiBwcm9jX2luZm9fbGlzdC51c2VyICovCisJLmxvbmcJXGNhY2hlX2ZucworLmVuZG0KKworCS8qCisJICogTWF0Y2ggQVJNIENvcnRleC1NNyBwcm9jZXNzb3IuCisJICovCisJLnR5cGUJX192N21fY203X3Byb2NfaW5mbywgI29iamVjdAorX192N21fY203X3Byb2NfaW5mbzoKKwkubG9uZwkweDQxMGZjMjcwCQkvKiBBUk0gQ29ydGV4LU03IDB4QzI3ICovCisJLmxvbmcJMHhmZjBmZmZmMAkJLyogTWFzayBvZmYgcmV2aXNpb24sIHBhdGNoIHJlbGVhc2UgKi8KKwlfX3Y3bV9wcm9jIF9fdjdtX2NtN19wcm9jX2luZm8sIF9fdjdtX2NtN19zZXR1cCwgaHdjYXBzID0gSFdDQVBfRURTUCwgY2FjaGVfZm5zID0gdjdtX2NhY2hlX2ZucywgcHJvY19mbnMgPSBjbTdfcHJvY2Vzc29yX2Z1bmN0aW9ucworCS5zaXplCV9fdjdtX2NtN19wcm9jX2luZm8sIC4gLSBfX3Y3bV9jbTdfcHJvY19pbmZvCisKKwkvKgorCSAqIE1hdGNoIEFSTSBDb3J0ZXgtTTQgcHJvY2Vzc29yLgorCSAqLworCS50eXBlCV9fdjdtX2NtNF9wcm9jX2luZm8sICNvYmplY3QKK19fdjdtX2NtNF9wcm9jX2luZm86CisJLmxvbmcJMHg0MTBmYzI0MAkJLyogQVJNIENvcnRleC1NNCAweEMyNCAqLworCS5sb25nCTB4ZmYwZmZmZjAJCS8qIE1hc2sgb2ZmIHJldmlzaW9uLCBwYXRjaCByZWxlYXNlICovCisJX192N21fcHJvYyBfX3Y3bV9jbTRfcHJvY19pbmZvLCBfX3Y3bV9zZXR1cCwgaHdjYXBzID0gSFdDQVBfRURTUAorCS5zaXplCV9fdjdtX2NtNF9wcm9jX2luZm8sIC4gLSBfX3Y3bV9jbTRfcHJvY19pbmZvCisKKwkvKgorCSAqIE1hdGNoIEFSTSBDb3J0ZXgtTTMgcHJvY2Vzc29yLgorCSAqLworCS50eXBlCV9fdjdtX2NtM19wcm9jX2luZm8sICNvYmplY3QKK19fdjdtX2NtM19wcm9jX2luZm86CisJLmxvbmcJMHg0MTBmYzIzMAkJLyogQVJNIENvcnRleC1NMyAweEMyMyAqLworCS5sb25nCTB4ZmYwZmZmZjAJCS8qIE1hc2sgb2ZmIHJldmlzaW9uLCBwYXRjaCByZWxlYXNlICovCisJX192N21fcHJvYyBfX3Y3bV9jbTNfcHJvY19pbmZvLCBfX3Y3bV9zZXR1cAorCS5zaXplCV9fdjdtX2NtM19wcm9jX2luZm8sIC4gLSBfX3Y3bV9jbTNfcHJvY19pbmZvCisKIAkvKgogCSAqIE1hdGNoIGFueSBBUk12Ny1NIHByb2Nlc3NvciBjb3JlLgogCSAqLwpAQCAtMTQwLDE2ICsyMzAsNiBAQAogX192N21fcHJvY19pbmZvOgogCS5sb25nCTB4MDAwZjAwMDAJCUAgUmVxdWlyZWQgSUQgdmFsdWUKIAkubG9uZwkweDAwMGYwMDAwCQlAIE1hc2sgZm9yIElECi0JLmxvbmcgICAwCQkJQCBwcm9jX2luZm9fbGlzdC5fX2NwdV9tbV9tbXVfZmxhZ3MKLQkubG9uZyAgIDAJCQlAIHByb2NfaW5mb19saXN0Ll9fY3B1X2lvX21tdV9mbGFncwotCWluaXRmbglfX3Y3bV9zZXR1cCwgX192N21fcHJvY19pbmZvCUAgcHJvY19pbmZvX2xpc3QuX19jcHVfZmx1c2gKLQkubG9uZwljcHVfYXJjaF9uYW1lCi0JLmxvbmcJY3B1X2VsZl9uYW1lCi0JLmxvbmcJSFdDQVBfSEFMRnxIV0NBUF9USFVNQnxIV0NBUF9GQVNUX01VTFQKLQkubG9uZwljcHVfdjdtX25hbWUKLQkubG9uZwl2N21fcHJvY2Vzc29yX2Z1bmN0aW9ucwlAIHByb2NfaW5mb19saXN0LnByb2MKLQkubG9uZwkwCQkJQCBwcm9jX2luZm9fbGlzdC50bGIKLQkubG9uZwkwCQkJQCBwcm9jX2luZm9fbGlzdC51c2VyCi0JLmxvbmcJbm9wX2NhY2hlX2ZucwkJQCBwcm9jX2luZm9fbGlzdC5jYWNoZQorCV9fdjdtX3Byb2MgX192N21fcHJvY19pbmZvLCBfX3Y3bV9zZXR1cAogCS5zaXplCV9fdjdtX3Byb2NfaW5mbywgLiAtIF9fdjdtX3Byb2NfaW5mbwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS94ZW4vZW5saWdodGVuLmMgYi9hcmNoL2FybS94ZW4vZW5saWdodGVuLmMKaW5kZXggYjBiODJmNS4uZjE5MzQxNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0veGVuL2VubGlnaHRlbi5jCisrKyBiL2FyY2gvYXJtL3hlbi9lbmxpZ2h0ZW4uYwpAQCAtNTAsNyArNTAsNyBAQAogc3RhdGljIHN0cnVjdCB2Y3B1X2luZm8gX19wZXJjcHUgKnhlbl92Y3B1X2luZm87CiAKIC8qIExpbnV4IDwtPiBYZW4gdkNQVSBpZCBtYXBwaW5nICovCi1ERUZJTkVfUEVSX0NQVShpbnQsIHhlbl92Y3B1X2lkKSA9IC0xOworREVGSU5FX1BFUl9DUFUodWludDMyX3QsIHhlbl92Y3B1X2lkKTsKIEVYUE9SVF9QRVJfQ1BVX1NZTUJPTCh4ZW5fdmNwdV9pZCk7CiAKIC8qIFRoZXNlIGFyZSB1bnVzZWQgdW50aWwgd2Ugc3VwcG9ydCBib290aW5nICJwcmUtYmFsbG9vbmVkIiAqLwpAQCAtMTcwLDkgKzE3MCw2IEBACiAJcHJfaW5mbygiWGVuOiBpbml0aWFsaXppbmcgY3B1JWRcbiIsIGNwdSk7CiAJdmNwdXAgPSBwZXJfY3B1X3B0cih4ZW5fdmNwdV9pbmZvLCBjcHUpOwogCi0JLyogRGlyZWN0IHZDUFUgaWQgbWFwcGluZyBmb3IgQVJNIGd1ZXN0cy4gKi8KLQlwZXJfY3B1KHhlbl92Y3B1X2lkLCBjcHUpID0gY3B1OwotCiAJaW5mby5tZm4gPSB2aXJ0X3RvX2dmbih2Y3B1cCk7CiAJaW5mby5vZmZzZXQgPSB4ZW5fb2Zmc2V0X2luX3BhZ2UodmNwdXApOwogCkBAIC0zMzAsNiArMzI3LDcgQEAKIHsKIAlzdHJ1Y3QgeGVuX2FkZF90b19waHlzbWFwIHhhdHA7CiAJc3RydWN0IHNoYXJlZF9pbmZvICpzaGFyZWRfaW5mb19wYWdlID0gTlVMTDsKKwlpbnQgY3B1OwogCiAJaWYgKCF4ZW5fZG9tYWluKCkpCiAJCXJldHVybiAwOwpAQCAtMzgwLDcgKzM3OCw4IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJLyogRGlyZWN0IHZDUFUgaWQgbWFwcGluZyBmb3IgQVJNIGd1ZXN0cy4gKi8KLQlwZXJfY3B1KHhlbl92Y3B1X2lkLCAwKSA9IDA7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkKKwkJcGVyX2NwdSh4ZW5fdmNwdV9pZCwgY3B1KSA9IGNwdTsKIAogCXhlbl9hdXRvX3hsYXRfZ3JhbnRfZnJhbWVzLmNvdW50ID0gZ250dGFiX21heF9ncmFudF9mcmFtZXMoKTsKIAlpZiAoeGVuX3hsYXRlX21hcF9iYWxsb29uZWRfcGFnZXMoJnhlbl9hdXRvX3hsYXRfZ3JhbnRfZnJhbWVzLnBmbiwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvS2NvbmZpZyBiL2FyY2gvYXJtNjQvS2NvbmZpZwppbmRleCBiYzNmMDBmLi4wMTYwMDQwIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L0tjb25maWcKKysrIGIvYXJjaC9hcm02NC9LY29uZmlnCkBAIC00LDYgKzQsOCBAQAogCXNlbGVjdCBBQ1BJX0dFTkVSSUNfR1NJIGlmIEFDUEkKIAlzZWxlY3QgQUNQSV9SRURVQ0VEX0hBUkRXQVJFX09OTFkgaWYgQUNQSQogCXNlbGVjdCBBQ1BJX01DRkcgaWYgQUNQSQorCXNlbGVjdCBBQ1BJX1NQQ1JfVEFCTEUgaWYgQUNQSQorCXNlbGVjdCBBUkNIX0NMT0NLU09VUkNFX0RBVEEKIAlzZWxlY3QgQVJDSF9IQVNfREVWTUVNX0lTX0FMTE9XRUQKIAlzZWxlY3QgQVJDSF9IQVNfQUNQSV9UQUJMRV9VUEdSQURFIGlmIEFDUEkKIAlzZWxlY3QgQVJDSF9IQVNfQVRPTUlDNjRfREVDX0lGX1BPU0lUSVZFCkBAIC0xNSw3ICsxNyw2IEBACiAJc2VsZWN0IEFSQ0hfVVNFX0NNUFhDSEdfTE9DS1JFRgogCXNlbGVjdCBBUkNIX1NVUFBPUlRTX0FUT01JQ19STVcKIAlzZWxlY3QgQVJDSF9TVVBQT1JUU19OVU1BX0JBTEFOQ0lORwotCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgogCXNlbGVjdCBBUkNIX1dBTlRfQ09NUEFUX0lQQ19QQVJTRV9WRVJTSU9OCiAJc2VsZWN0IEFSQ0hfV0FOVF9GUkFNRV9QT0lOVEVSUwogCXNlbGVjdCBBUkNIX0hBU19VQlNBTl9TQU5JVElaRV9BTEwKQEAgLTEwMiwxMCArMTAzLDggQEAKIAlzZWxlY3QgTk9fQk9PVE1FTQogCXNlbGVjdCBPRgogCXNlbGVjdCBPRl9FQVJMWV9GTEFUVFJFRQotCXNlbGVjdCBPRl9OVU1BIGlmIE5VTUEgJiYgT0YKIAlzZWxlY3QgT0ZfUkVTRVJWRURfTUVNCiAJc2VsZWN0IFBDSV9FQ0FNIGlmIEFDUEkKLQlzZWxlY3QgUEVSRl9VU0VfVk1BTExPQwogCXNlbGVjdCBQT1dFUl9SRVNFVAogCXNlbGVjdCBQT1dFUl9TVVBQTFkKIAlzZWxlY3QgU1BBUlNFX0lSUQpAQCAtMTIyLDYgKzEyMSw5IEBACiBjb25maWcgTU1VCiAJZGVmX2Jvb2wgeQogCitjb25maWcgREVCVUdfUk9EQVRBCisJZGVmX2Jvb2wgeQorCiBjb25maWcgQVJNNjRfUEFHRV9TSElGVAogCWludAogCWRlZmF1bHQgMTYgaWYgQVJNNjRfNjRLX1BBR0VTCkBAIC00MTUsMTggKzQxNywxMyBAQAogCiBjb25maWcgQVJNNjRfRVJSQVRVTV84NDM0MTkKIAlib29sICJDb3J0ZXgtQTUzOiA4NDM0MTk6IEEgbG9hZCBvciBzdG9yZSBtaWdodCBhY2Nlc3MgYW4gaW5jb3JyZWN0IGFkZHJlc3MiCi0JZGVwZW5kcyBvbiBNT0RVTEVTCiAJZGVmYXVsdCB5Ci0Jc2VsZWN0IEFSTTY0X01PRFVMRV9DTU9ERUxfTEFSR0UKKwlzZWxlY3QgQVJNNjRfTU9EVUxFX0NNT0RFTF9MQVJHRSBpZiBNT0RVTEVTCiAJaGVscAotCSAgVGhpcyBvcHRpb24gYnVpbGRzIGtlcm5lbCBtb2R1bGVzIHVzaW5nIHRoZSBsYXJnZSBtZW1vcnkgbW9kZWwgaW4KLQkgIG9yZGVyIHRvIGF2b2lkIHRoZSB1c2Ugb2YgdGhlIEFEUlAgaW5zdHJ1Y3Rpb24sIHdoaWNoIGNhbiBjYXVzZQotCSAgYSBzdWJzZXF1ZW50IG1lbW9yeSBhY2Nlc3MgdG8gdXNlIGFuIGluY29ycmVjdCBhZGRyZXNzIG9uIENvcnRleC1BNTMKLQkgIHBhcnRzIHVwIHRvIHIwcDQuCi0KLQkgIE5vdGUgdGhhdCB0aGUga2VybmVsIGl0c2VsZiBtdXN0IGJlIGxpbmtlZCB3aXRoIGEgdmVyc2lvbiBvZiBsZAotCSAgd2hpY2ggZml4ZXMgcG90ZW50aWFsbHkgYWZmZWN0ZWQgQURSUCBpbnN0cnVjdGlvbnMgdGhyb3VnaCB0aGUKLQkgIHVzZSBvZiB2ZW5lZXJzLgorCSAgVGhpcyBvcHRpb24gbGlua3MgdGhlIGtlcm5lbCB3aXRoICctLWZpeC1jb3J0ZXgtYTUzLTg0MzQxOScgYW5kCisJICBidWlsZHMgbW9kdWxlcyB1c2luZyB0aGUgbGFyZ2UgbWVtb3J5IG1vZGVsIGluIG9yZGVyIHRvIGF2b2lkIHRoZSB1c2UKKwkgIG9mIHRoZSBBRFJQIGluc3RydWN0aW9uLCB3aGljaCBjYW4gY2F1c2UgYSBzdWJzZXF1ZW50IG1lbW9yeSBhY2Nlc3MKKwkgIHRvIHVzZSBhbiBpbmNvcnJlY3QgYWRkcmVzcyBvbiBDb3J0ZXgtQTUzIHBhcnRzIHVwIHRvIHIwcDQuCiAKIAkgIElmIHVuc3VyZSwgc2F5IFkuCiAKQEAgLTU4Miw3ICs1NzksOCBAQAogIyBDb21tb24gTlVNQSBGZWF0dXJlcwogY29uZmlnIE5VTUEKIAlib29sICJOdW1hIE1lbW9yeSBBbGxvY2F0aW9uIGFuZCBTY2hlZHVsZXIgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIFNNUAorCXNlbGVjdCBBQ1BJX05VTUEgaWYgQUNQSQorCXNlbGVjdCBPRl9OVU1BCiAJaGVscAogCSAgRW5hYmxlIE5VTUEgKE5vbiBVbmlmb3JtIE1lbW9yeSBBY2Nlc3MpIHN1cHBvcnQuCiAKQEAgLTYwMywxMSArNjAxLDE4IEBACiAJZGVmX2Jvb2wgeQogCWRlcGVuZHMgb24gTlVNQQogCitjb25maWcgSEFWRV9TRVRVUF9QRVJfQ1BVX0FSRUEKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBOVU1BCisKK2NvbmZpZyBORUVEX1BFUl9DUFVfRU1CRURfRklSU1RfQ0hVTksKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBOVU1BCisKIHNvdXJjZSBrZXJuZWwvS2NvbmZpZy5wcmVlbXB0CiBzb3VyY2Uga2VybmVsL0tjb25maWcuaHoKIAogY29uZmlnIEFSQ0hfU1VQUE9SVFNfREVCVUdfUEFHRUFMTE9DCi0JZGVwZW5kcyBvbiAhSElCRVJOQVRJT04KIAlkZWZfYm9vbCB5CiAKIGNvbmZpZyBBUkNIX0hBU19IT0xFU19NRU1PUllNT0RFTApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9LY29uZmlnLmRlYnVnIGIvYXJjaC9hcm02NC9LY29uZmlnLmRlYnVnCmluZGV4IDBjYzc1OGMuLmI2NjFmZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvS2NvbmZpZy5kZWJ1ZworKysgYi9hcmNoL2FybTY0L0tjb25maWcuZGVidWcKQEAgLTQ5LDE2ICs0OSw2IEBACiAKIAkgIElmIGluIGRvdWJ0LCBzYXkgWS4KIAotY29uZmlnIERFQlVHX1JPREFUQQotCWJvb2wgIk1ha2Uga2VybmVsIHRleHQgYW5kIHJvZGF0YSByZWFkLW9ubHkiCi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgSWYgdGhpcyBpcyBzZXQsIGtlcm5lbCB0ZXh0IGFuZCByb2RhdGEgd2lsbCBiZSBtYWRlIHJlYWQtb25seS4gVGhpcwotCSAgaXMgdG8gaGVscCBjYXRjaCBhY2NpZGVudGFsIG9yIG1hbGljaW91cyBhdHRlbXB0cyB0byBjaGFuZ2UgdGhlCi0JICBrZXJuZWwncyBleGVjdXRhYmxlIGNvZGUuCi0KLQkgIElmIGluIGRvdWJ0LCBzYXkgWS4KLQogY29uZmlnIERFQlVHX0FMSUdOX1JPREFUQQogCWRlcGVuZHMgb24gREVCVUdfUk9EQVRBCiAJYm9vbCAiQWxpZ24gbGlua2VyIHNlY3Rpb25zIHVwIHRvIFNFQ1RJT05fU0laRSIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvS2NvbmZpZy5wbGF0Zm9ybXMgYi9hcmNoL2FybTY0L0tjb25maWcucGxhdGZvcm1zCmluZGV4IGJlNWQ4MjQuLmI2YjM2NTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvS2NvbmZpZy5wbGF0Zm9ybXMKKysrIGIvYXJjaC9hcm02NC9LY29uZmlnLnBsYXRmb3JtcwpAQCAtMTUsOCArMTUsOCBAQAogCiBjb25maWcgQVJDSF9CQ00yODM1CiAJYm9vbCAiQnJvYWRjb20gQkNNMjgzNSBmYW1pbHkiCi0Jc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCiAJc2VsZWN0IENMS1NSQ19PRgorCXNlbGVjdCBHUElPTElCCiAJc2VsZWN0IFBJTkNUUkwKIAlzZWxlY3QgUElOQ1RSTF9CQ00yODM1CiAJc2VsZWN0IEFSTV9BTUJBCkBAIC0yOSwxNSArMjksMTUgQEAKIGNvbmZpZyBBUkNIX0JDTV9JUFJPQwogCWJvb2wgIkJyb2FkY29tIGlQcm9jIFNvQyBGYW1pbHkiCiAJc2VsZWN0IENPTU1PTl9DTEtfSVBST0MKKwlzZWxlY3QgR1BJT0xJQgogCXNlbGVjdCBQSU5DVFJMCi0Jc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCiAJaGVscAogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIEJyb2FkY29tIGlQcm9jIGJhc2VkIFNvQ3MKIAogY29uZmlnIEFSQ0hfQkVSTElOCiAJYm9vbCAiTWFydmVsbCBCZXJsaW4gU29DIEZhbWlseSIKLQlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKIAlzZWxlY3QgRFdfQVBCX0lDVEwKKwlzZWxlY3QgR1BJT0xJQgogCXNlbGVjdCBQSU5DVFJMCiAJaGVscAogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIE1hcnZlbGwgQmVybGluIFNvQyBGYW1pbHkKQEAgLTU1LDYgKzU1LDcgQEAKIAogY29uZmlnIEFSQ0hfTEFZRVJTQ0FQRQogCWJvb2wgIkFSTXY4IGJhc2VkIEZyZWVzY2FsZSBMYXllcnNjYXBlIFNvQyBmYW1pbHkiCisJc2VsZWN0IEVEQUNfU1VQUE9SVAogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgRnJlZXNjYWxlIExheWVyc2NhcGUgU29DIGZhbWlseS4KIApAQCAtOTMsNiArOTQsNyBAQAogCXNlbGVjdCBBUk1BREFfQ1AxMTBfU1lTQ09OCiAJc2VsZWN0IEFSTUFEQV8zN1hYX0NMSwogCXNlbGVjdCBNVkVCVV9PRE1JCisJc2VsZWN0IE1WRUJVX1BJQwogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBNYXJ2ZWxsIEVCVSBmYW1pbGx5LCBpbmNsdWRpbmc6CiAJICAgLSBBcm1hZGEgMzcwMCBTb0MgRmFtaWx5CkBAIC0xMDgsNyArMTEwLDcgQEAKIGNvbmZpZyBBUkNIX1JPQ0tDSElQCiAJYm9vbCAiUm9ja2NoaXAgUGxhdGZvcm1zIgogCXNlbGVjdCBBUkNIX0hBU19SRVNFVF9DT05UUk9MTEVSCi0Jc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCisJc2VsZWN0IEdQSU9MSUIKIAlzZWxlY3QgUElOQ1RSTAogCXNlbGVjdCBQSU5DVFJMX1JPQ0tDSElQCiAJc2VsZWN0IFJPQ0tDSElQX1RJTUVSCkBAIC0xNTQsMTIgKzE1NiwxMSBAQAogY29uZmlnIEFSQ0hfVEVHUkEKIAlib29sICJOVklESUEgVGVncmEgU29DIEZhbWlseSIKIAlzZWxlY3QgQVJDSF9IQVNfUkVTRVRfQ09OVFJPTExFUgotCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgogCXNlbGVjdCBDTEtERVZfTE9PS1VQCiAJc2VsZWN0IENMS1NSQ19NTUlPCiAJc2VsZWN0IENMS1NSQ19PRgogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCi0Jc2VsZWN0IEhBVkVfQ0xLCisJc2VsZWN0IEdQSU9MSUIKIAlzZWxlY3QgUElOQ1RSTAogCXNlbGVjdCBSRVNFVF9DT05UUk9MTEVSCiAJaGVscApAQCAtMTgzLDggKzE4NCw4IEBACiAKIGNvbmZpZyBBUkNIX1ZFWFBSRVNTCiAJYm9vbCAiQVJNdjggc29mdHdhcmUgbW9kZWwgKFZlcnNhdGlsZSBFeHByZXNzKSIKLQlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKIAlzZWxlY3QgQ09NTU9OX0NMS19WRVJTQVRJTEUKKwlzZWxlY3QgR1BJT0xJQgogCXNlbGVjdCBQTQogCXNlbGVjdCBQTV9HRU5FUklDX0RPTUFJTlMKIAlzZWxlY3QgUE9XRVJfUkVTRVRfVkVYUFJFU1MKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvTWFrZWZpbGUgYi9hcmNoL2FybTY0L01ha2VmaWxlCmluZGV4IDViNTRmOGMuLmFiNTFhZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm02NC9NYWtlZmlsZQpAQCAtMTgsNiArMTgsMTQgQEAKIExERkxBR1Nfdm1saW51eAkJKz0gLXBpZSAtQnN5bWJvbGljCiBlbmRpZgogCitpZmVxICgkKENPTkZJR19BUk02NF9FUlJBVFVNXzg0MzQxOSkseSkKKyAgaWZlcSAoJChjYWxsIGxkLW9wdGlvbiwgLS1maXgtY29ydGV4LWE1My04NDM0MTkpLCkKKyQod2FybmluZyBsZCBkb2VzIG5vdCBzdXBwb3J0IC0tZml4LWNvcnRleC1hNTMtODQzNDE5OyBrZXJuZWwgbWF5IGJlIHN1c2NlcHRpYmxlIHRvIGVycmF0dW0pCisgIGVsc2UKK0xERkxBR1Nfdm1saW51eAkrPSAtLWZpeC1jb3J0ZXgtYTUzLTg0MzQxOQorICBlbmRpZgorZW5kaWYKKwogS0JVSUxEX0RFRkNPTkZJRyA6PSBkZWZjb25maWcKIAogIyBDaGVjayBmb3IgYmludXRpbHMgc3VwcG9ydCBmb3Igc3BlY2lmaWMgZXh0ZW5zaW9ucwpAQCAtMzgsMTAgKzQ2LDEyIEBACiBLQlVJTERfQ1BQRkxBR1MJKz0gLW1iaWctZW5kaWFuCiBBUwkJKz0gLUVCCiBMRAkJKz0gLUVCCitVVFNfTUFDSElORQk6PSBhYXJjaDY0X2JlCiBlbHNlCiBLQlVJTERfQ1BQRkxBR1MJKz0gLW1saXR0bGUtZW5kaWFuCiBBUwkJKz0gLUVMCiBMRAkJKz0gLUVMCitVVFNfTUFDSElORQk6PSBhYXJjaDY0CiBlbmRpZgogCiBDSEVDS0ZMQUdTCSs9IC1EX19hYXJjaDY0X18KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvYWx0ZXJhL3NvY2ZwZ2Ffc3RyYXRpeDEwLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2FsdGVyYS9zb2NmcGdhX3N0cmF0aXgxMC5kdHNpCmluZGV4IDQ0NWFhNjcuLmMyYjliY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvYWx0ZXJhL3NvY2ZwZ2Ffc3RyYXRpeDEwLmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9hbHRlcmEvc29jZnBnYV9zdHJhdGl4MTAuZHRzaQpAQCAtMjU1LDEwICsyNTUsMTAgQEAKIAkJLyogTG9jYWwgdGltZXIgKi8KIAkJdGltZXIgewogCQkJY29tcGF0aWJsZSA9ICJhcm0sYXJtdjgtdGltZXIiOwotCQkJaW50ZXJydXB0cyA9IDwxIDEzIDB4ZjAxPiwKLQkJCQkgICAgIDwxIDE0IDB4ZjAxPiwKLQkJCQkgICAgIDwxIDExIDB4ZjAxPiwKLQkJCQkgICAgIDwxIDEwIDB4ZjAxPjsKKwkJCWludGVycnVwdHMgPSA8MSAxMyAweGYwOD4sCisJCQkJICAgICA8MSAxNCAweGYwOD4sCisJCQkJICAgICA8MSAxMSAweGYwOD4sCisJCQkJICAgICA8MSAxMCAweGYwOD47CiAJCX07CiAKIAkJdGltZXIwOiB0aW1lcjBAZmZjMDMwMDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9hbWxvZ2ljL21lc29uLWd4YmIuZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYW1sb2dpYy9tZXNvbi1neGJiLmR0c2kKaW5kZXggZTUwMmMyNC4uYmY2YzhkMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9ib290L2R0cy9hbWxvZ2ljL21lc29uLWd4YmIuZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2FtbG9naWMvbWVzb24tZ3hiYi5kdHNpCkBAIC0xMDIsMTMgKzEwMiwxMyBAQAogCXRpbWVyIHsKIAkJY29tcGF0aWJsZSA9ICJhcm0sYXJtdjgtdGltZXIiOwogCQlpbnRlcnJ1cHRzID0gPEdJQ19QUEkgMTMKLQkJCShHSUNfQ1BVX01BU0tfUkFXKDB4ZmYpIHwgSVJRX1RZUEVfRURHRV9SSVNJTkcpPiwKKwkJCShHSUNfQ1BVX01BU0tfUkFXKDB4ZmYpIHwgSVJRX1RZUEVfTEVWRUxfTE9XKT4sCiAJCQkgICAgIDxHSUNfUFBJIDE0Ci0JCQkoR0lDX0NQVV9NQVNLX1JBVygweGZmKSB8IElSUV9UWVBFX0VER0VfUklTSU5HKT4sCisJCQkoR0lDX0NQVV9NQVNLX1JBVygweGZmKSB8IElSUV9UWVBFX0xFVkVMX0xPVyk+LAogCQkJICAgICA8R0lDX1BQSSAxMQotCQkJKEdJQ19DUFVfTUFTS19SQVcoMHhmZikgfCBJUlFfVFlQRV9FREdFX1JJU0lORyk+LAorCQkJKEdJQ19DUFVfTUFTS19SQVcoMHhmZikgfCBJUlFfVFlQRV9MRVZFTF9MT1cpPiwKIAkJCSAgICAgPEdJQ19QUEkgMTAKLQkJCShHSUNfQ1BVX01BU0tfUkFXKDB4ZmYpIHwgSVJRX1RZUEVfRURHRV9SSVNJTkcpPjsKKwkJCShHSUNfQ1BVX01BU0tfUkFXKDB4ZmYpIHwgSVJRX1RZUEVfTEVWRUxfTE9XKT47CiAJfTsKIAogCXh0YWw6IHh0YWwtY2xrIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvYXBtL2FwbS1tdXN0YW5nLmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYXBtL2FwbS1tdXN0YW5nLmR0cwppbmRleCBiN2ZiNWQ5Li4zMmE5NjFjIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2FwbS9hcG0tbXVzdGFuZy5kdHMKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9hcG0vYXBtLW11c3RhbmcuZHRzCkBAIC03NCw2ICs3NCw3IEBACiAKICZ4Z2VuZXQgewogCXN0YXR1cyA9ICJvayI7CisJcnhsb3MtZ3Bpb3MgPSA8JnNiZ3BpbyAxMiAxPjsKIH07CiAKICZtbWMwIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvYXBtL2FwbS1zdG9ybS5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9hcG0vYXBtLXN0b3JtLmR0c2kKaW5kZXggZjFjMmM3MS4uMzFlYTcwYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9ib290L2R0cy9hcG0vYXBtLXN0b3JtLmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9hcG0vYXBtLXN0b3JtLmR0c2kKQEAgLTExMCwxMCArMTEwLDEwIEBACiAKIAl0aW1lciB7CiAJCWNvbXBhdGlibGUgPSAiYXJtLGFybXY4LXRpbWVyIjsKLQkJaW50ZXJydXB0cyA9IDwxIDAgMHhmZjAxPiwJLyogU2VjdXJlIFBoeXMgSVJRICovCi0JCQkgICAgIDwxIDEzIDB4ZmYwMT4sCS8qIE5vbi1zZWN1cmUgUGh5cyBJUlEgKi8KLQkJCSAgICAgPDEgMTQgMHhmZjAxPiwJLyogVmlydCBJUlEgKi8KLQkJCSAgICAgPDEgMTUgMHhmZjAxPjsJLyogSHlwIElSUSAqLworCQlpbnRlcnJ1cHRzID0gPDEgMCAweGZmMDg+LAkvKiBTZWN1cmUgUGh5cyBJUlEgKi8KKwkJCSAgICAgPDEgMTMgMHhmZjA4PiwJLyogTm9uLXNlY3VyZSBQaHlzIElSUSAqLworCQkJICAgICA8MSAxNCAweGZmMDg+LAkvKiBWaXJ0IElSUSAqLworCQkJICAgICA8MSAxNSAweGZmMDg+OwkvKiBIeXAgSVJRICovCiAJCWNsb2NrLWZyZXF1ZW5jeSA9IDw1MDAwMDAwMD47CiAJfTsKIApAQCAtOTIzLDcgKzkyMyw3IEBACiAJCQkvKiBtYWMgYWRkcmVzcyB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBib290bG9hZGVyICovCiAJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFswMCAwMCAwMCAwMCAwMCAwMF07CiAJCQlwaHktY29ubmVjdGlvbi10eXBlID0gInJnbWlpIjsKLQkJCXBoeS1oYW5kbGUgPSA8Jm1lbmV0MHBoeT4sPCZtZW5ldHBoeT47CisJCQlwaHktaGFuZGxlID0gPCZtZW5ldHBoeT4sPCZtZW5ldDBwaHk+OwogCQkJbWRpbyB7CiAJCQkJY29tcGF0aWJsZSA9ICJhcG0seGdlbmUtbWRpbyI7CiAJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2Jyb2FkY29tL2JjbTI4MzUtcnBpLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2Jyb2FkY29tL2JjbTI4MzUtcnBpLmR0c2kKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMzkzN2I3NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYnJvYWRjb20vYmNtMjgzNS1ycGkuZHRzaQpAQCAtMCwwICsxIEBACisuLi8uLi8uLi8uLi9hcm0vYm9vdC9kdHMvYmNtMjgzNS1ycGkuZHRzaQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvYnJvYWRjb20vYmNtMjgzNy1ycGktMy1iLmR0cyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYnJvYWRjb20vYmNtMjgzNy1ycGktMy1iLmR0cwppbmRleCA2ZjQ3ZGQyLi43ODQxYjcyIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2Jyb2FkY29tL2JjbTI4MzctcnBpLTMtYi5kdHMKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9icm9hZGNvbS9iY20yODM3LXJwaS0zLWIuZHRzCkBAIC0xLDcgKzEsNyBAQAogL2R0cy12MS87CiAjaW5jbHVkZSAiYmNtMjgzNy5kdHNpIgotI2luY2x1ZGUgIi4uLy4uLy4uLy4uL2FybS9ib290L2R0cy9iY20yODM1LXJwaS5kdHNpIgotI2luY2x1ZGUgIi4uLy4uLy4uLy4uL2FybS9ib290L2R0cy9iY20yODN4LXJwaS1zbXNjOTUxNC5kdHNpIgorI2luY2x1ZGUgImJjbTI4MzUtcnBpLmR0c2kiCisjaW5jbHVkZSAiYmNtMjgzeC1ycGktc21zYzk1MTQuZHRzaSIKIAogLyB7CiAJY29tcGF0aWJsZSA9ICJyYXNwYmVycnlwaSwzLW1vZGVsLWIiLCAiYnJjbSxiY20yODM3IjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvYnJvYWRjb20vYmNtMjgzNy5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9icm9hZGNvbS9iY20yODM3LmR0c2kKaW5kZXggZjJhMzFkMC4uODIxNmJiYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9ib290L2R0cy9icm9hZGNvbS9iY20yODM3LmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9icm9hZGNvbS9iY20yODM3LmR0c2kKQEAgLTEsNCArMSw0IEBACi0jaW5jbHVkZSAiLi4vLi4vLi4vLi4vYXJtL2Jvb3QvZHRzL2JjbTI4M3guZHRzaSIKKyNpbmNsdWRlICJiY20yODN4LmR0c2kiCiAKIC8gewogCWNvbXBhdGlibGUgPSAiYnJjbSxiY20yODM2IjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvYnJvYWRjb20vYmNtMjgzeC1ycGktc21zYzk1MTQuZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYnJvYWRjb20vYmNtMjgzeC1ycGktc21zYzk1MTQuZHRzaQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5kY2E3YzA1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9icm9hZGNvbS9iY20yODN4LXJwaS1zbXNjOTUxNC5kdHNpCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uLy4uL2FybS9ib290L2R0cy9iY20yODN4LXJwaS1zbXNjOTUxNC5kdHNpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9icm9hZGNvbS9iY20yODN4LmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2Jyb2FkY29tL2JjbTI4M3guZHRzaQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi41ZjU0ZTRjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9icm9hZGNvbS9iY20yODN4LmR0c2kKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vLi4vYXJtL2Jvb3QvZHRzL2JjbTI4M3guZHRzaQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvYnJvYWRjb20vbnMyLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2Jyb2FkY29tL25zMi5kdHNpCmluZGV4IGY1M2IwOTUuLmQ0YTEyZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvYnJvYWRjb20vbnMyLmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9icm9hZGNvbS9uczIuZHRzaQpAQCAtODgsMTMgKzg4LDEzIEBACiAJdGltZXIgewogCQljb21wYXRpYmxlID0gImFybSxhcm12OC10aW1lciI7CiAJCWludGVycnVwdHMgPSA8R0lDX1BQSSAxMyAoR0lDX0NQVV9NQVNLX1JBVygweGZmKSB8Ci0JCQkgICAgICBJUlFfVFlQRV9FREdFX1JJU0lORyk+LAorCQkJICAgICAgSVJRX1RZUEVfTEVWRUxfTE9XKT4sCiAJCQkgICAgIDxHSUNfUFBJIDE0IChHSUNfQ1BVX01BU0tfUkFXKDB4ZmYpIHwKLQkJCSAgICAgIElSUV9UWVBFX0VER0VfUklTSU5HKT4sCisJCQkgICAgICBJUlFfVFlQRV9MRVZFTF9MT1cpPiwKIAkJCSAgICAgPEdJQ19QUEkgMTEgKEdJQ19DUFVfTUFTS19SQVcoMHhmZikgfAotCQkJICAgICAgSVJRX1RZUEVfRURHRV9SSVNJTkcpPiwKKwkJCSAgICAgIElSUV9UWVBFX0xFVkVMX0xPVyk+LAogCQkJICAgICA8R0lDX1BQSSAxMCAoR0lDX0NQVV9NQVNLX1JBVygweGZmKSB8Ci0JCQkgICAgICBJUlFfVFlQRV9FREdFX1JJU0lORyk+OworCQkJICAgICAgSVJRX1RZUEVfTEVWRUxfTE9XKT47CiAJfTsKIAogCXBtdSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2Nhdml1bS90aHVuZGVyLTg4eHguZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvY2F2aXVtL3RodW5kZXItODh4eC5kdHNpCmluZGV4IDJlYjliMjIuLjA0ZGM4YTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvY2F2aXVtL3RodW5kZXItODh4eC5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvY2F2aXVtL3RodW5kZXItODh4eC5kdHNpCkBAIC0zNTQsMTAgKzM1NCwxMCBAQAogCiAJdGltZXIgewogCQljb21wYXRpYmxlID0gImFybSxhcm12OC10aW1lciI7Ci0JCWludGVycnVwdHMgPSA8MSAxMyAweGZmMDE+LAotCQkgICAgICAgICAgICAgPDEgMTQgMHhmZjAxPiwKLQkJICAgICAgICAgICAgIDwxIDExIDB4ZmYwMT4sCi0JCSAgICAgICAgICAgICA8MSAxMCAweGZmMDE+OworCQlpbnRlcnJ1cHRzID0gPDEgMTMgND4sCisJCSAgICAgICAgICAgICA8MSAxNCA0PiwKKwkJICAgICAgICAgICAgIDwxIDExIDQ+LAorCQkgICAgICAgICAgICAgPDEgMTAgND47CiAJfTsKIAogCXBtdSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2V4eW5vcy9leHlub3M3LmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2V4eW5vcy9leHlub3M3LmR0c2kKaW5kZXggY2E2NjNkZi4uMTYyODMxNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9ib290L2R0cy9leHlub3MvZXh5bm9zNy5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvZXh5bm9zL2V4eW5vczcuZHRzaQpAQCAtNDczLDEwICs0NzMsMTAgQEAKIAogCQl0aW1lciB7CiAJCQljb21wYXRpYmxlID0gImFybSxhcm12OC10aW1lciI7Ci0JCQlpbnRlcnJ1cHRzID0gPDEgMTMgMHhmZjAxPiwKLQkJCQkgICAgIDwxIDE0IDB4ZmYwMT4sCi0JCQkJICAgICA8MSAxMSAweGZmMDE+LAotCQkJCSAgICAgPDEgMTAgMHhmZjAxPjsKKwkJCWludGVycnVwdHMgPSA8MSAxMyAweGZmMDg+LAorCQkJCSAgICAgPDEgMTQgMHhmZjA4PiwKKwkJCQkgICAgIDwxIDExIDB4ZmYwOD4sCisJCQkJICAgICA8MSAxMCAweGZmMDg+OwogCQl9OwogCiAJCXBtdV9zeXN0ZW1fY29udHJvbGxlcjogc3lzdGVtLWNvbnRyb2xsZXJAMTA1YzAwMDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9mcmVlc2NhbGUvZnNsLWxzMTA0M2EuZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvZnJlZXNjYWxlL2ZzbC1sczEwNDNhLmR0c2kKaW5kZXggZTY2OWZiZC4uYTY3ZTIxMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9ib290L2R0cy9mcmVlc2NhbGUvZnNsLWxzMTA0M2EuZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2ZyZWVzY2FsZS9mc2wtbHMxMDQzYS5kdHNpCkBAIC0xMTksMTAgKzExOSwxMCBAQAogCiAJdGltZXIgewogCQljb21wYXRpYmxlID0gImFybSxhcm12OC10aW1lciI7Ci0JCWludGVycnVwdHMgPSA8MSAxMyAweDE+LCAvKiBQaHlzaWNhbCBTZWN1cmUgUFBJICovCi0JCQkgICAgIDwxIDE0IDB4MT4sIC8qIFBoeXNpY2FsIE5vbi1TZWN1cmUgUFBJICovCi0JCQkgICAgIDwxIDExIDB4MT4sIC8qIFZpcnR1YWwgUFBJICovCi0JCQkgICAgIDwxIDEwIDB4MT47IC8qIEh5cGVydmlzb3IgUFBJICovCisJCWludGVycnVwdHMgPSA8MSAxMyAweGYwOD4sIC8qIFBoeXNpY2FsIFNlY3VyZSBQUEkgKi8KKwkJCSAgICAgPDEgMTQgMHhmMDg+LCAvKiBQaHlzaWNhbCBOb24tU2VjdXJlIFBQSSAqLworCQkJICAgICA8MSAxMSAweGYwOD4sIC8qIFZpcnR1YWwgUFBJICovCisJCQkgICAgIDwxIDEwIDB4ZjA4PjsgLyogSHlwZXJ2aXNvciBQUEkgKi8KIAl9OwogCiAJcG11IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvZnJlZXNjYWxlL2ZzbC1sczIwODBhLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2ZyZWVzY2FsZS9mc2wtbHMyMDgwYS5kdHNpCmluZGV4IDIxMDIzYTMuLmUzYjYwMzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvZnJlZXNjYWxlL2ZzbC1sczIwODBhLmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9mcmVlc2NhbGUvZnNsLWxzMjA4MGEuZHRzaQpAQCAtMTkxLDEwICsxOTEsMTAgQEAKIAogCXRpbWVyIHsKIAkJY29tcGF0aWJsZSA9ICJhcm0sYXJtdjgtdGltZXIiOwotCQlpbnRlcnJ1cHRzID0gPDEgMTMgMHg4PiwgLyogUGh5c2ljYWwgU2VjdXJlIFBQSSwgYWN0aXZlLWxvdyAqLwotCQkJICAgICA8MSAxNCAweDg+LCAvKiBQaHlzaWNhbCBOb24tU2VjdXJlIFBQSSwgYWN0aXZlLWxvdyAqLwotCQkJICAgICA8MSAxMSAweDg+LCAvKiBWaXJ0dWFsIFBQSSwgYWN0aXZlLWxvdyAqLwotCQkJICAgICA8MSAxMCAweDg+OyAvKiBIeXBlcnZpc29yIFBQSSwgYWN0aXZlLWxvdyAqLworCQlpbnRlcnJ1cHRzID0gPDEgMTMgND4sIC8qIFBoeXNpY2FsIFNlY3VyZSBQUEksIGFjdGl2ZS1sb3cgKi8KKwkJCSAgICAgPDEgMTQgND4sIC8qIFBoeXNpY2FsIE5vbi1TZWN1cmUgUFBJLCBhY3RpdmUtbG93ICovCisJCQkgICAgIDwxIDExIDQ+LCAvKiBWaXJ0dWFsIFBQSSwgYWN0aXZlLWxvdyAqLworCQkJICAgICA8MSAxMCA0PjsgLyogSHlwZXJ2aXNvciBQUEksIGFjdGl2ZS1sb3cgKi8KIAl9OwogCiAJcG11IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvbWFydmVsbC9hcm1hZGEtYXA4MDYuZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvbWFydmVsbC9hcm1hZGEtYXA4MDYuZHRzaQppbmRleCBlYWIxYTQyLi5jMmE2NzQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL21hcnZlbGwvYXJtYWRhLWFwODA2LmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9tYXJ2ZWxsL2FybWFkYS1hcDgwNi5kdHNpCkBAIC0xMjIsMTAgKzEyMiwxMCBAQAogCiAJCQl0aW1lciB7CiAJCQkJY29tcGF0aWJsZSA9ICJhcm0sYXJtdjgtdGltZXIiOwotCQkJCWludGVycnVwdHMgPSA8R0lDX1BQSSAxMyAoR0lDX0NQVV9NQVNLX1NJTVBMRSg0KSB8IElSUV9UWVBFX0VER0VfUklTSU5HKT4sCi0JCQkJCSAgICAgPEdJQ19QUEkgMTQgKEdJQ19DUFVfTUFTS19TSU1QTEUoNCkgfCBJUlFfVFlQRV9FREdFX1JJU0lORyk+LAotCQkJCQkgICAgIDxHSUNfUFBJIDExIChHSUNfQ1BVX01BU0tfU0lNUExFKDQpIHwgSVJRX1RZUEVfRURHRV9SSVNJTkcpPiwKLQkJCQkJICAgICA8R0lDX1BQSSAxMCAoR0lDX0NQVV9NQVNLX1NJTVBMRSg0KSB8IElSUV9UWVBFX0VER0VfUklTSU5HKT47CisJCQkJaW50ZXJydXB0cyA9IDxHSUNfUFBJIDEzIChHSUNfQ1BVX01BU0tfU0lNUExFKDQpIHwgSVJRX1RZUEVfTEVWRUxfTE9XKT4sCisJCQkJCSAgICAgPEdJQ19QUEkgMTQgKEdJQ19DUFVfTUFTS19TSU1QTEUoNCkgfCBJUlFfVFlQRV9MRVZFTF9MT1cpPiwKKwkJCQkJICAgICA8R0lDX1BQSSAxMSAoR0lDX0NQVV9NQVNLX1NJTVBMRSg0KSB8IElSUV9UWVBFX0xFVkVMX0xPVyk+LAorCQkJCQkgICAgIDxHSUNfUFBJIDEwIChHSUNfQ1BVX01BU0tfU0lNUExFKDQpIHwgSVJRX1RZUEVfTEVWRUxfTE9XKT47CiAJCQl9OwogCiAJCQlvZG1pOiBvZG1pQDMwMDAwMCB7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3JvY2tjaGlwL3JrMzM2OC5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9yb2NrY2hpcC9yazMzNjguZHRzaQppbmRleCBkMDJhOTAwMy4uNGY0NGQxMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9ib290L2R0cy9yb2NrY2hpcC9yazMzNjguZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3JvY2tjaGlwL3JrMzM2OC5kdHNpCkBAIC0yNzAsNiArMjcwLDggQEAKIAkJI2lvLWNoYW5uZWwtY2VsbHMgPSA8MT47CiAJCWNsb2NrcyA9IDwmY3J1IFNDTEtfU0FSQURDPiwgPCZjcnUgUENMS19TQVJBREM+OwogCQljbG9jay1uYW1lcyA9ICJzYXJhZGMiLCAiYXBiX3BjbGsiOworCQlyZXNldHMgPSA8JmNydSBTUlNUX1NBUkFEQz47CisJCXJlc2V0LW5hbWVzID0gInNhcmFkYy1hcGIiOwogCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCX07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvc29jaW9uZXh0L3VuaXBoaWVyLXBoMS1sZDIwLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3NvY2lvbmV4dC91bmlwaGllci1waDEtbGQyMC5kdHNpCmluZGV4IGMyMjM5MTUuLmQ3M2JkYzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvc29jaW9uZXh0L3VuaXBoaWVyLXBoMS1sZDIwLmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9zb2Npb25leHQvdW5pcGhpZXItcGgxLWxkMjAuZHRzaQpAQCAtMTI5LDEwICsxMjksMTAgQEAKIAogCXRpbWVyIHsKIAkJY29tcGF0aWJsZSA9ICJhcm0sYXJtdjgtdGltZXIiOwotCQlpbnRlcnJ1cHRzID0gPDEgMTMgMHhmMDE+LAotCQkJICAgICA8MSAxNCAweGYwMT4sCi0JCQkgICAgIDwxIDExIDB4ZjAxPiwKLQkJCSAgICAgPDEgMTAgMHhmMDE+OworCQlpbnRlcnJ1cHRzID0gPDEgMTMgND4sCisJCQkgICAgIDwxIDE0IDQ+LAorCQkJICAgICA8MSAxMSA0PiwKKwkJCSAgICAgPDEgMTAgND47CiAJfTsKIAogCXNvYyB7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3hpbGlueC96eW5xbXAuZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMveGlsaW54L3p5bnFtcC5kdHNpCmluZGV4IGU1OTVmMjIuLjNlMmU1MWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMveGlsaW54L3p5bnFtcC5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMveGlsaW54L3p5bnFtcC5kdHNpCkBAIC02NSwxMCArNjUsMTAgQEAKIAl0aW1lciB7CiAJCWNvbXBhdGlibGUgPSAiYXJtLGFybXY4LXRpbWVyIjsKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKLQkJaW50ZXJydXB0cyA9IDwxIDEzIDB4ZjAxPiwKLQkJCSAgICAgPDEgMTQgMHhmMDE+LAotCQkJICAgICA8MSAxMSAweGYwMT4sCi0JCQkgICAgIDwxIDEwIDB4ZjAxPjsKKwkJaW50ZXJydXB0cyA9IDwxIDEzIDB4ZjA4PiwKKwkJCSAgICAgPDEgMTQgMHhmMDg+LAorCQkJICAgICA8MSAxMSAweGYwOD4sCisJCQkgICAgIDwxIDEwIDB4ZjA4PjsKIAl9OwogCiAJYW1iYV9hcHUgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9jcnlwdG8vYWVzLWdsdWUuYyBiL2FyY2gvYXJtNjQvY3J5cHRvL2Flcy1nbHVlLmMKaW5kZXggNWM4ODgwNC4uNmIyYWEwZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9jcnlwdG8vYWVzLWdsdWUuYworKysgYi9hcmNoL2FybTY0L2NyeXB0by9hZXMtZ2x1ZS5jCkBAIC0yMTYsNyArMjE2LDcgQEAKIAkJZXJyID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCAmd2FsaywKIAkJCQkJICB3YWxrLm5ieXRlcyAlIEFFU19CTE9DS19TSVpFKTsKIAl9Ci0JaWYgKG5ieXRlcykgeworCWlmICh3YWxrLm5ieXRlcyAlIEFFU19CTE9DS19TSVpFKSB7CiAJCXU4ICp0ZHN0ID0gd2Fsay5kc3QudmlydC5hZGRyICsgYmxvY2tzICogQUVTX0JMT0NLX1NJWkU7CiAJCXU4ICp0c3JjID0gd2Fsay5zcmMudmlydC5hZGRyICsgYmxvY2tzICogQUVTX0JMT0NLX1NJWkU7CiAJCXU4IF9fYWxpZ25lZCg4KSB0YWlsW0FFU19CTE9DS19TSVpFXTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9LYnVpbGQKaW5kZXggZjQzZDJjNC4uNDRlMWQ3ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTEsNCArMSwzIEBACi1nZW5lcmljLXkgKz0gYnVnLmgKIGdlbmVyaWMteSArPSBidWdzLmgKIGdlbmVyaWMteSArPSBjbGtkZXYuaAogZ2VuZXJpYy15ICs9IGNwdXRpbWUuaApAQCAtMTAsNyArOSw2IEBACiBnZW5lcmljLXkgKz0gZWFybHlfaW9yZW1hcC5oCiBnZW5lcmljLXkgKz0gZW1lcmdlbmN5LXJlc3RhcnQuaAogZ2VuZXJpYy15ICs9IGVycm5vLmgKLWdlbmVyaWMteSArPSBmdHJhY2UuaAogZ2VuZXJpYy15ICs9IGh3X2lycS5oCiBnZW5lcmljLXkgKz0gaW9jdGwuaAogZ2VuZXJpYy15ICs9IGlvY3Rscy5oCkBAIC0yNywxMiArMjUsMTAgQEAKIGdlbmVyaWMteSArPSBtc2didWYuaAogZ2VuZXJpYy15ICs9IG1zaS5oCiBnZW5lcmljLXkgKz0gbXV0ZXguaAotZ2VuZXJpYy15ICs9IHBjaS5oCiBnZW5lcmljLXkgKz0gcG9sbC5oCiBnZW5lcmljLXkgKz0gcHJlZW1wdC5oCiBnZW5lcmljLXkgKz0gcmVzb3VyY2UuaAogZ2VuZXJpYy15ICs9IHJ3c2VtLmgKLWdlbmVyaWMteSArPSBzZWN0aW9ucy5oCiBnZW5lcmljLXkgKz0gc2VnbWVudC5oCiBnZW5lcmljLXkgKz0gc2VtYnVmLmgKIGdlbmVyaWMteSArPSBzZXJpYWwuaApAQCAtNDUsNyArNDEsNiBAQAogZ2VuZXJpYy15ICs9IHN3aXRjaF90by5oCiBnZW5lcmljLXkgKz0gdGVybWJpdHMuaAogZ2VuZXJpYy15ICs9IHRlcm1pb3MuaAotZ2VuZXJpYy15ICs9IHRvcG9sb2d5LmgKIGdlbmVyaWMteSArPSB0cmFjZV9jbG9jay5oCiBnZW5lcmljLXkgKz0gdHlwZXMuaAogZ2VuZXJpYy15ICs9IHVuYWxpZ25lZC5oCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2FjcGkuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYWNwaS5oCmluZGV4IDU0MjBjYjAuLmU1MTcwODggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYWNwaS5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYWNwaS5oCkBAIC0xMiw3ICsxMiw3IEBACiAjaWZuZGVmIF9BU01fQUNQSV9ICiAjZGVmaW5lIF9BU01fQUNQSV9ICiAKLSNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcHNjaS5oPgogCiAjaW5jbHVkZSA8YXNtL2NwdXR5cGUuaD4KQEAgLTMyLDcgKzMyLDExIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqYWNwaV9vc19pb3JlbWFwKGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBwaHlzLAogCQkJCQkgICAgYWNwaV9zaXplIHNpemUpCiB7Ci0JaWYgKCFwYWdlX2lzX3JhbShwaHlzID4+IFBBR0VfU0hJRlQpKQorCS8qCisJICogRUZJJ3MgcmVzZXJ2ZV9yZWdpb25zKCkgY2FsbCBhZGRzIG1lbW9yeSB3aXRoIHRoZSBXQiBhdHRyaWJ1dGUKKwkgKiB0byBtZW1ibG9jayB2aWEgZWFybHlfaW5pdF9kdF9hZGRfbWVtb3J5X2FyY2goKS4KKwkgKi8KKwlpZiAoIW1lbWJsb2NrX2lzX21lbW9yeShwaHlzKSkKIAkJcmV0dXJuIGlvcmVtYXAocGh5cywgc2l6ZSk7CiAKIAlyZXR1cm4gaW9yZW1hcF9jYWNoZShwaHlzLCBzaXplKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYWx0ZXJuYXRpdmUuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYWx0ZXJuYXRpdmUuaAppbmRleCA4NzQ2ZmY2Li41NTEwMWJkIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2FsdGVybmF0aXZlLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS5oCkBAIC0yLDYgKzIsNyBAQAogI2RlZmluZSBfX0FTTV9BTFRFUk5BVElWRV9ICiAKICNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgorI2luY2x1ZGUgPGFzbS9pbnNuLmg+CiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKQEAgLTkwLDI0ICs5MSwxNSBAQAogLmVuZG0KIAogLyoKLSAqIEJlZ2luIGFuIGFsdGVybmF0aXZlIGNvZGUgc2VxdWVuY2UuCisgKiBBbHRlcm5hdGl2ZSBzZXF1ZW5jZXMKICAqCi0gKiBUaGUgY29kZSB0aGF0IGZvbGxvd3MgdGhpcyBtYWNybyB3aWxsIGJlIGFzc2VtYmxlZCBhbmQgbGlua2VkIGFzCi0gKiBub3JtYWwuIFRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdGhpcyBjb2RlLgotICovCi0ubWFjcm8gYWx0ZXJuYXRpdmVfaWZfbm90IGNhcAotCS5wdXNoc2VjdGlvbiAuYWx0aW5zdHJ1Y3Rpb25zLCAiYSIKLQlhbHRpbnN0cnVjdGlvbl9lbnRyeSA2NjFmLCA2NjNmLCBcY2FwLCA2NjJmLTY2MWYsIDY2NGYtNjYzZgotCS5wb3BzZWN0aW9uCi02NjE6Ci0uZW5kbQotCi0vKgotICogUHJvdmlkZSB0aGUgYWx0ZXJuYXRpdmUgY29kZSBzZXF1ZW5jZS4KKyAqIFRoZSBjb2RlIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgY2FwYWJpbGl0eSBpcyBub3QgcHJlc2VudCB3aWxsIGJlCisgKiBhc3NlbWJsZWQgYW5kIGxpbmtlZCBhcyBub3JtYWwuIFRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdGhpcworICogY29kZS4KICAqCi0gKiBUaGUgY29kZSB0aGF0IGZvbGxvd3MgdGhpcyBtYWNybyBpcyBhc3NlbWJsZWQgaW50byBhIHNwZWNpYWwKLSAqIHNlY3Rpb24gdG8gYmUgdXNlZCBmb3IgZHluYW1pYyBwYXRjaGluZy4gQ29kZSB0aGF0IGZvbGxvd3MgdGhpcwotICogbWFjcm8gbXVzdDoKKyAqIFRoZSBjb2RlIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgY2FwYWJpbGl0eSBpcyBwcmVzZW50IHdpbGwgYmUKKyAqIGFzc2VtYmxlZCBpbnRvIGEgc3BlY2lhbCBzZWN0aW9uIHRvIGJlIHVzZWQgZm9yIGR5bmFtaWMgcGF0Y2hpbmcuCisgKiBDb2RlIGZvciB0aGF0IGNhc2UgbXVzdDoKICAqCiAgKiAxLiBCZSBleGFjdGx5IHRoZSBzYW1lIGxlbmd0aCAoaW4gYnl0ZXMpIGFzIHRoZSBkZWZhdWx0IGNvZGUKICAqICAgIHNlcXVlbmNlLgpAQCAtMTE2LDggKzEwOCwzOCBAQAogICogICAgYWx0ZXJuYXRpdmUgc2VxdWVuY2UgaXQgaXMgZGVmaW5lZCBpbiAoYnJhbmNoZXMgaW50byBhbgogICogICAgYWx0ZXJuYXRpdmUgc2VxdWVuY2UgYXJlIG5vdCBmaXhlZCB1cCkuCiAgKi8KKworLyoKKyAqIEJlZ2luIGFuIGFsdGVybmF0aXZlIGNvZGUgc2VxdWVuY2UuCisgKi8KKy5tYWNybyBhbHRlcm5hdGl2ZV9pZl9ub3QgY2FwCisJLnNldCAuTGFzbV9hbHRfbW9kZSwgMAorCS5wdXNoc2VjdGlvbiAuYWx0aW5zdHJ1Y3Rpb25zLCAiYSIKKwlhbHRpbnN0cnVjdGlvbl9lbnRyeSA2NjFmLCA2NjNmLCBcY2FwLCA2NjJmLTY2MWYsIDY2NGYtNjYzZgorCS5wb3BzZWN0aW9uCis2NjE6CisuZW5kbQorCisubWFjcm8gYWx0ZXJuYXRpdmVfaWYgY2FwCisJLnNldCAuTGFzbV9hbHRfbW9kZSwgMQorCS5wdXNoc2VjdGlvbiAuYWx0aW5zdHJ1Y3Rpb25zLCAiYSIKKwlhbHRpbnN0cnVjdGlvbl9lbnRyeSA2NjNmLCA2NjFmLCBcY2FwLCA2NjRmLTY2M2YsIDY2MmYtNjYxZgorCS5wb3BzZWN0aW9uCisJLnB1c2hzZWN0aW9uIC5hbHRpbnN0cl9yZXBsYWNlbWVudCwgImF4IgorCS5hbGlnbiAyCS8qIFNvIEdBUyBrbm93cyBsYWJlbCA2NjEgaXMgc3VpdGFibHkgYWxpZ25lZCAqLworNjYxOgorLmVuZG0KKworLyoKKyAqIFByb3ZpZGUgdGhlIG90aGVyIGhhbGYgb2YgdGhlIGFsdGVybmF0aXZlIGNvZGUgc2VxdWVuY2UuCisgKi8KIC5tYWNybyBhbHRlcm5hdGl2ZV9lbHNlCi02NjI6CS5wdXNoc2VjdGlvbiAuYWx0aW5zdHJfcmVwbGFjZW1lbnQsICJheCIKKzY2MjoKKwkuaWYgLkxhc21fYWx0X21vZGU9PTAKKwkucHVzaHNlY3Rpb24gLmFsdGluc3RyX3JlcGxhY2VtZW50LCAiYXgiCisJLmVsc2UKKwkucG9wc2VjdGlvbgorCS5lbmRpZgogNjYzOgogLmVuZG0KIApAQCAtMTI1LDExICsxNDcsMjUgQEAKICAqIENvbXBsZXRlIGFuIGFsdGVybmF0aXZlIGNvZGUgc2VxdWVuY2UuCiAgKi8KIC5tYWNybyBhbHRlcm5hdGl2ZV9lbmRpZgotNjY0OgkucG9wc2VjdGlvbgorNjY0OgorCS5pZiAuTGFzbV9hbHRfbW9kZT09MAorCS5wb3BzZWN0aW9uCisJLmVuZGlmCiAJLm9yZwkuIC0gKDY2NGItNjYzYikgKyAoNjYyYi02NjFiKQogCS5vcmcJLiAtICg2NjJiLTY2MWIpICsgKDY2NGItNjYzYikKIC5lbmRtCiAKKy8qCisgKiBQcm92aWRlcyBhIHRyaXZpYWwgYWx0ZXJuYXRpdmUgb3IgZGVmYXVsdCBzZXF1ZW5jZSBjb25zaXN0aW5nIHNvbGVseQorICogb2YgTk9Qcy4gVGhlIG51bWJlciBvZiBOT1BzIGlzIGNob3NlbiBhdXRvbWF0aWNhbGx5IHRvIG1hdGNoIHRoZQorICogcHJldmlvdXMgY2FzZS4KKyAqLworLm1hY3JvIGFsdGVybmF0aXZlX2Vsc2Vfbm9wX2VuZGlmCithbHRlcm5hdGl2ZV9lbHNlCisJbm9wcwkoNjYyYi02NjFiKSAvIEFBUkNINjRfSU5TTl9TSVpFCithbHRlcm5hdGl2ZV9lbmRpZgorLmVuZG0KKwogI2RlZmluZSBfQUxURVJOQVRJVkVfQ0ZHKGluc24xLCBpbnNuMiwgY2FwLCBjZmcsIC4uLikJXAogCWFsdGVybmF0aXZlX2luc24gaW5zbjEsIGluc24yLCBjYXAsIElTX0VOQUJMRUQoY2ZnKQogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2FyY2hfZ2ljdjMuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYXJjaF9naWN2My5oCmluZGV4IDhlYzg4ZTUuLmY4YWU2ZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYXJjaF9naWN2My5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYXJjaF9naWN2My5oCkBAIC0yOCw2ICsyOCw3IEBACiAjZGVmaW5lIElDQ19DVExSX0VMMQkJCXN5c19yZWcoMywgMCwgMTIsIDEyLCA0KQogI2RlZmluZSBJQ0NfU1JFX0VMMQkJCXN5c19yZWcoMywgMCwgMTIsIDEyLCA1KQogI2RlZmluZSBJQ0NfR1JQRU4xX0VMMQkJCXN5c19yZWcoMywgMCwgMTIsIDEyLCA3KQorI2RlZmluZSBJQ0NfQlBSMV9FTDEJCQlzeXNfcmVnKDMsIDAsIDEyLCAxMiwgMykKIAogI2RlZmluZSBJQ0NfU1JFX0VMMgkJCXN5c19yZWcoMywgNCwgMTIsIDksIDUpCiAKQEAgLTc5LDYgKzgwLDE5IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CiAjaW5jbHVkZSA8YXNtL2JhcnJpZXIuaD4KIAorI2RlZmluZSByZWFkX2dpY3JlZyhyKQkJCQkJCQlcCisJKHsJCQkJCQkJCVwKKwkJdTY0IHJlZzsJCQkJCQlcCisJCWFzbSB2b2xhdGlsZSgibXJzX3MgJTAsICIgX19zdHJpbmdpZnkocikgOiAiPXIiIChyZWcpKTsJXAorCQlyZWc7CQkJCQkJCVwKKwl9KQorCisjZGVmaW5lIHdyaXRlX2dpY3JlZyh2LHIpCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJdTY0IF9fdmFsID0gKHYpOwkJCQkJXAorCQlhc20gdm9sYXRpbGUoIm1zcl9zICIgX19zdHJpbmdpZnkocikgIiwgJTAiIDogOiAiciIgKF9fdmFsKSk7XAorCX0gd2hpbGUgKDApCisKIC8qCiAgKiBMb3ctbGV2ZWwgYWNjZXNzb3JzCiAgKgpAQCAtMTY1LDYgKzE3OSwxMSBAQAogCWlzYigpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgZ2ljX3dyaXRlX2JwcjEodTMyIHZhbCkKK3sKKwlhc20gdm9sYXRpbGUoIm1zcl9zICIgX19zdHJpbmdpZnkoSUNDX0JQUjFfRUwxKSAiLCAlMCIgOiA6ICJyIiAodmFsKSk7Cit9CisKICNkZWZpbmUgZ2ljX3JlYWRfdHlwZXIoYykJCXJlYWRxX3JlbGF4ZWQoYykKICNkZWZpbmUgZ2ljX3dyaXRlX2lyb3V0ZXIodiwgYykJCXdyaXRlcV9yZWxheGVkKHYsIGMpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYXJjaF90aW1lci5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9hcmNoX3RpbWVyLmgKaW5kZXggZmJlMGNhMy4uZWFhNWJiZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9hcmNoX3RpbWVyLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9hcmNoX3RpbWVyLmgKQEAgLTIwLDEzICsyMCw1NSBAQAogI2RlZmluZSBfX0FTTV9BUkNIX1RJTUVSX0gKIAogI2luY2x1ZGUgPGFzbS9iYXJyaWVyLmg+CisjaW5jbHVkZSA8YXNtL3N5c3JlZy5oPgogCiAjaW5jbHVkZSA8bGludXgvYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2p1bXBfbGFiZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAjaW5jbHVkZSA8Y2xvY2tzb3VyY2UvYXJtX2FyY2hfdGltZXIuaD4KIAorI2lmIElTX0VOQUJMRUQoQ09ORklHX0ZTTF9FUlJBVFVNX0EwMDg1ODUpCitleHRlcm4gc3RydWN0IHN0YXRpY19rZXlfZmFsc2UgYXJjaF90aW1lcl9yZWFkX29vbF9lbmFibGVkOworI2RlZmluZSBuZWVkc19mc2xfYTAwODU4NV93b3JrYXJvdW5kKCkgXAorCXN0YXRpY19icmFuY2hfdW5saWtlbHkoJmFyY2hfdGltZXJfcmVhZF9vb2xfZW5hYmxlZCkKKyNlbHNlCisjZGVmaW5lIG5lZWRzX2ZzbF9hMDA4NTg1X3dvcmthcm91bmQoKSAgZmFsc2UKKyNlbmRpZgorCit1MzIgX19mc2xfYTAwODU4NV9yZWFkX2NudHBfdHZhbF9lbDAodm9pZCk7Cit1MzIgX19mc2xfYTAwODU4NV9yZWFkX2NudHZfdHZhbF9lbDAodm9pZCk7Cit1NjQgX19mc2xfYTAwODU4NV9yZWFkX2NudHZjdF9lbDAodm9pZCk7CisKKy8qCisgKiBUaGUgbnVtYmVyIG9mIHJldHJpZXMgaXMgYW4gYXJiaXRyYXJ5IHZhbHVlIHdlbGwgYmV5b25kIHRoZSBoaWdoZXN0IG51bWJlcgorICogb2YgaXRlcmF0aW9ucyB0aGUgbG9vcCBoYXMgYmVlbiBvYnNlcnZlZCB0byB0YWtlLgorICovCisjZGVmaW5lIF9fZnNsX2EwMDg1ODVfcmVhZF9yZWcocmVnKSAoewkJCVwKKwl1NjQgX29sZCwgX25ldzsJCQkJCVwKKwlpbnQgX3JldHJpZXMgPSAyMDA7CQkJCVwKKwkJCQkJCQlcCisJZG8gewkJCQkJCVwKKwkJX29sZCA9IHJlYWRfc3lzcmVnKHJlZyk7CQlcCisJCV9uZXcgPSByZWFkX3N5c3JlZyhyZWcpOwkJXAorCQlfcmV0cmllcy0tOwkJCQlcCisJfSB3aGlsZSAodW5saWtlbHkoX29sZCAhPSBfbmV3KSAmJiBfcmV0cmllcyk7CVwKKwkJCQkJCQlcCisJV0FSTl9PTl9PTkNFKCFfcmV0cmllcyk7CQkJXAorCV9uZXc7CQkJCQkJXAorfSkKKworI2RlZmluZSBhcmNoX3RpbWVyX3JlZ19yZWFkX3N0YWJsZShyZWcpIAkJXAorKHsJCQkJCQkJXAorCXU2NCBfdmFsOwkJCQkJXAorCWlmIChuZWVkc19mc2xfYTAwODU4NV93b3JrYXJvdW5kKCkpCQlcCisJCV92YWwgPSBfX2ZzbF9hMDA4NTg1X3JlYWRfIyNyZWcoKTsJXAorCWVsc2UJCQkJCQlcCisJCV92YWwgPSByZWFkX3N5c3JlZyhyZWcpOwkJXAorCV92YWw7CQkJCQkJXAorfSkKKwogLyoKICAqIFRoZXNlIHJlZ2lzdGVyIGFjY2Vzc29ycyBhcmUgbWFya2VkIGlubGluZSBzbyB0aGUgY29tcGlsZXIgY2FuCiAgKiBuaWNlbHkgd29yayBvdXQgd2hpY2ggcmVnaXN0ZXIgd2Ugd2FudCwgYW5kIGNodWNrIGF3YXkgdGhlIHJlc3Qgb2YKQEAgLTM4LDE5ICs4MCwxOSBAQAogCWlmIChhY2Nlc3MgPT0gQVJDSF9USU1FUl9QSFlTX0FDQ0VTUykgewogCQlzd2l0Y2ggKHJlZykgewogCQljYXNlIEFSQ0hfVElNRVJfUkVHX0NUUkw6Ci0JCQlhc20gdm9sYXRpbGUoIm1zciBjbnRwX2N0bF9lbDAsICAlMCIgOiA6ICJyIiAodmFsKSk7CisJCQl3cml0ZV9zeXNyZWcodmFsLCBjbnRwX2N0bF9lbDApOwogCQkJYnJlYWs7CiAJCWNhc2UgQVJDSF9USU1FUl9SRUdfVFZBTDoKLQkJCWFzbSB2b2xhdGlsZSgibXNyIGNudHBfdHZhbF9lbDAsICUwIiA6IDogInIiICh2YWwpKTsKKwkJCXdyaXRlX3N5c3JlZyh2YWwsIGNudHBfdHZhbF9lbDApOwogCQkJYnJlYWs7CiAJCX0KIAl9IGVsc2UgaWYgKGFjY2VzcyA9PSBBUkNIX1RJTUVSX1ZJUlRfQUNDRVNTKSB7CiAJCXN3aXRjaCAocmVnKSB7CiAJCWNhc2UgQVJDSF9USU1FUl9SRUdfQ1RSTDoKLQkJCWFzbSB2b2xhdGlsZSgibXNyIGNudHZfY3RsX2VsMCwgICUwIiA6IDogInIiICh2YWwpKTsKKwkJCXdyaXRlX3N5c3JlZyh2YWwsIGNudHZfY3RsX2VsMCk7CiAJCQlicmVhazsKIAkJY2FzZSBBUkNIX1RJTUVSX1JFR19UVkFMOgotCQkJYXNtIHZvbGF0aWxlKCJtc3IgY250dl90dmFsX2VsMCwgJTAiIDogOiAiciIgKHZhbCkpOworCQkJd3JpdGVfc3lzcmVnKHZhbCwgY250dl90dmFsX2VsMCk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTYxLDQ4ICsxMDMsMzggQEAKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUKIHUzMiBhcmNoX3RpbWVyX3JlZ19yZWFkX2NwMTUoaW50IGFjY2VzcywgZW51bSBhcmNoX3RpbWVyX3JlZyByZWcpCiB7Ci0JdTMyIHZhbDsKLQogCWlmIChhY2Nlc3MgPT0gQVJDSF9USU1FUl9QSFlTX0FDQ0VTUykgewogCQlzd2l0Y2ggKHJlZykgewogCQljYXNlIEFSQ0hfVElNRVJfUkVHX0NUUkw6Ci0JCQlhc20gdm9sYXRpbGUoIm1ycyAlMCwgIGNudHBfY3RsX2VsMCIgOiAiPXIiICh2YWwpKTsKLQkJCWJyZWFrOworCQkJcmV0dXJuIHJlYWRfc3lzcmVnKGNudHBfY3RsX2VsMCk7CiAJCWNhc2UgQVJDSF9USU1FUl9SRUdfVFZBTDoKLQkJCWFzbSB2b2xhdGlsZSgibXJzICUwLCBjbnRwX3R2YWxfZWwwIiA6ICI9ciIgKHZhbCkpOwotCQkJYnJlYWs7CisJCQlyZXR1cm4gYXJjaF90aW1lcl9yZWdfcmVhZF9zdGFibGUoY250cF90dmFsX2VsMCk7CiAJCX0KIAl9IGVsc2UgaWYgKGFjY2VzcyA9PSBBUkNIX1RJTUVSX1ZJUlRfQUNDRVNTKSB7CiAJCXN3aXRjaCAocmVnKSB7CiAJCWNhc2UgQVJDSF9USU1FUl9SRUdfQ1RSTDoKLQkJCWFzbSB2b2xhdGlsZSgibXJzICUwLCAgY250dl9jdGxfZWwwIiA6ICI9ciIgKHZhbCkpOwotCQkJYnJlYWs7CisJCQlyZXR1cm4gcmVhZF9zeXNyZWcoY250dl9jdGxfZWwwKTsKIAkJY2FzZSBBUkNIX1RJTUVSX1JFR19UVkFMOgotCQkJYXNtIHZvbGF0aWxlKCJtcnMgJTAsIGNudHZfdHZhbF9lbDAiIDogIj1yIiAodmFsKSk7Ci0JCQlicmVhazsKKwkJCXJldHVybiBhcmNoX3RpbWVyX3JlZ19yZWFkX3N0YWJsZShjbnR2X3R2YWxfZWwwKTsKIAkJfQogCX0KIAotCXJldHVybiB2YWw7CisJQlVHKCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTMyIGFyY2hfdGltZXJfZ2V0X2NudGZycSh2b2lkKQogewotCXUzMiB2YWw7Ci0JYXNtIHZvbGF0aWxlKCJtcnMgJTAsICAgY250ZnJxX2VsMCIgOiAiPXIiICh2YWwpKTsKLQlyZXR1cm4gdmFsOworCXJldHVybiByZWFkX3N5c3JlZyhjbnRmcnFfZWwwKTsKIH0KIAogc3RhdGljIGlubGluZSB1MzIgYXJjaF90aW1lcl9nZXRfY250a2N0bCh2b2lkKQogewotCXUzMiBjbnRrY3RsOwotCWFzbSB2b2xhdGlsZSgibXJzCSUwLCBjbnRrY3RsX2VsMSIgOiAiPXIiIChjbnRrY3RsKSk7Ci0JcmV0dXJuIGNudGtjdGw7CisJcmV0dXJuIHJlYWRfc3lzcmVnKGNudGtjdGxfZWwxKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGFyY2hfdGltZXJfc2V0X2NudGtjdGwodTMyIGNudGtjdGwpCiB7Ci0JYXNtIHZvbGF0aWxlKCJtc3IJY250a2N0bF9lbDEsICUwIiA6IDogInIiIChjbnRrY3RsKSk7CisJd3JpdGVfc3lzcmVnKGNudGtjdGwsIGNudGtjdGxfZWwxKTsKIH0KIAogc3RhdGljIGlubGluZSB1NjQgYXJjaF9jb3VudGVyX2dldF9jbnRwY3Qodm9pZCkKQEAgLTExNiwxMiArMTQ4LDggQEAKIAogc3RhdGljIGlubGluZSB1NjQgYXJjaF9jb3VudGVyX2dldF9jbnR2Y3Qodm9pZCkKIHsKLQl1NjQgY3ZhbDsKLQogCWlzYigpOwotCWFzbSB2b2xhdGlsZSgibXJzICUwLCBjbnR2Y3RfZWwwIiA6ICI9ciIgKGN2YWwpKTsKLQotCXJldHVybiBjdmFsOworCXJldHVybiBhcmNoX3RpbWVyX3JlZ19yZWFkX3N0YWJsZShjbnR2Y3RfZWwwKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgYXJjaF90aW1lcl9hcmNoX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYXNzZW1ibGVyLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Fzc2VtYmxlci5oCmluZGV4IGQ1MDI1YzYuLjI4YmZlNjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYXNzZW1ibGVyLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9hc3NlbWJsZXIuaApAQCAtODcsNiArODcsMTUgQEAKIAkuZW5kbQogCiAvKgorICogTk9QIHNlcXVlbmNlCisgKi8KKwkubWFjcm8Jbm9wcywgbnVtCisJLnJlcHQJXG51bQorCW5vcAorCS5lbmRyCisJLmVuZG0KKworLyoKICAqIEVtaXQgYW4gZW50cnkgaW50byB0aGUgZXhjZXB0aW9uIHRhYmxlCiAgKi8KIAkubWFjcm8JCV9hc21fZXh0YWJsZSwgZnJvbSwgdG8KQEAgLTIxNiwxMSArMjI1LDI2IEBACiAJLm1hY3JvCW1taWQsIHJkLCBybgogCWxkcglccmQsIFtccm4sICNNTV9DT05URVhUX0lEXQogCS5lbmRtCisvKgorICogcmVhZF9jdHIgLSByZWFkIENUUl9FTDAuIElmIHRoZSBzeXN0ZW0gaGFzIG1pc21hdGNoZWQKKyAqIGNhY2hlIGxpbmUgc2l6ZXMsIHByb3ZpZGUgdGhlIHN5c3RlbSB3aWRlIHNhZmUgdmFsdWUKKyAqIGZyb20gYXJtNjRfZnRyX3JlZ19jdHJlbDAuc3lzX3ZhbAorICovCisJLm1hY3JvCXJlYWRfY3RyLCByZWcKK2FsdGVybmF0aXZlX2lmX25vdCBBUk02NF9NSVNNQVRDSEVEX0NBQ0hFX0xJTkVfU0laRQorCW1ycwlccmVnLCBjdHJfZWwwCQkJLy8gcmVhZCBDVFIKKwlub3AKK2FsdGVybmF0aXZlX2Vsc2UKKwlsZHJfbAlccmVnLCBhcm02NF9mdHJfcmVnX2N0cmVsMCArIEFSTTY0X0ZUUl9TWVNWQUwKK2FsdGVybmF0aXZlX2VuZGlmCisJLmVuZG0KKwogCiAvKgotICogZGNhY2hlX2xpbmVfc2l6ZSAtIGdldCB0aGUgbWluaW11bSBELWNhY2hlIGxpbmUgc2l6ZSBmcm9tIHRoZSBDVFIgcmVnaXN0ZXIuCisgKiByYXdfZGNhY2hlX2xpbmVfc2l6ZSAtIGdldCB0aGUgbWluaW11bSBELWNhY2hlIGxpbmUgc2l6ZSBvbiB0aGlzIENQVQorICogZnJvbSB0aGUgQ1RSIHJlZ2lzdGVyLgogICovCi0JLm1hY3JvCWRjYWNoZV9saW5lX3NpemUsIHJlZywgdG1wCisJLm1hY3JvCXJhd19kY2FjaGVfbGluZV9zaXplLCByZWcsIHRtcAogCW1ycwlcdG1wLCBjdHJfZWwwCQkJLy8gcmVhZCBDVFIKIAl1YmZtCVx0bXAsIFx0bXAsICMxNiwgIzE5CQkvLyBjYWNoZSBsaW5lIHNpemUgZW5jb2RpbmcKIAltb3YJXHJlZywgIzQJCQkvLyBieXRlcyBwZXIgd29yZApAQCAtMjI4LDkgKzI1MiwyMCBAQAogCS5lbmRtCiAKIC8qCi0gKiBpY2FjaGVfbGluZV9zaXplIC0gZ2V0IHRoZSBtaW5pbXVtIEktY2FjaGUgbGluZSBzaXplIGZyb20gdGhlIENUUiByZWdpc3Rlci4KKyAqIGRjYWNoZV9saW5lX3NpemUgLSBnZXQgdGhlIHNhZmUgRC1jYWNoZSBsaW5lIHNpemUgYWNyb3NzIGFsbCBDUFVzCiAgKi8KLQkubWFjcm8JaWNhY2hlX2xpbmVfc2l6ZSwgcmVnLCB0bXAKKwkubWFjcm8JZGNhY2hlX2xpbmVfc2l6ZSwgcmVnLCB0bXAKKwlyZWFkX2N0cglcdG1wCisJdWJmbQkJXHRtcCwgXHRtcCwgIzE2LCAjMTkJLy8gY2FjaGUgbGluZSBzaXplIGVuY29kaW5nCisJbW92CQlccmVnLCAjNAkJLy8gYnl0ZXMgcGVyIHdvcmQKKwlsc2wJCVxyZWcsIFxyZWcsIFx0bXAJLy8gYWN0dWFsIGNhY2hlIGxpbmUgc2l6ZQorCS5lbmRtCisKKy8qCisgKiByYXdfaWNhY2hlX2xpbmVfc2l6ZSAtIGdldCB0aGUgbWluaW11bSBJLWNhY2hlIGxpbmUgc2l6ZSBvbiB0aGlzIENQVQorICogZnJvbSB0aGUgQ1RSIHJlZ2lzdGVyLgorICovCisJLm1hY3JvCXJhd19pY2FjaGVfbGluZV9zaXplLCByZWcsIHRtcAogCW1ycwlcdG1wLCBjdHJfZWwwCQkJLy8gcmVhZCBDVFIKIAlhbmQJXHRtcCwgXHRtcCwgIzB4ZgkJLy8gY2FjaGUgbGluZSBzaXplIGVuY29kaW5nCiAJbW92CVxyZWcsICM0CQkJLy8gYnl0ZXMgcGVyIHdvcmQKQEAgLTIzOCw2ICsyNzMsMTYgQEAKIAkuZW5kbQogCiAvKgorICogaWNhY2hlX2xpbmVfc2l6ZSAtIGdldCB0aGUgc2FmZSBJLWNhY2hlIGxpbmUgc2l6ZSBhY3Jvc3MgYWxsIENQVXMKKyAqLworCS5tYWNybwlpY2FjaGVfbGluZV9zaXplLCByZWcsIHRtcAorCXJlYWRfY3RyCVx0bXAKKwlhbmQJCVx0bXAsIFx0bXAsICMweGYJLy8gY2FjaGUgbGluZSBzaXplIGVuY29kaW5nCisJbW92CQlccmVnLCAjNAkJLy8gYnl0ZXMgcGVyIHdvcmQKKwlsc2wJCVxyZWcsIFxyZWcsIFx0bXAJLy8gYWN0dWFsIGNhY2hlIGxpbmUgc2l6ZQorCS5lbmRtCisKKy8qCiAgKiB0Y3Jfc2V0X2lkbWFwX3Qwc3ogLSB1cGRhdGUgVENSLlQwU1ogc28gdGhhdCB3ZSBjYW4gbG9hZCB0aGUgSUQgbWFwCiAgKi8KIAkubWFjcm8JdGNyX3NldF9pZG1hcF90MHN6LCB2YWxyZWcsIHRtcHJlZwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9hdG9taWNfbHNlLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2F0b21pY19sc2UuaAppbmRleCBiNTg5MGJlLi43NDU3Y2UwIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2F0b21pY19sc2UuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2F0b21pY19sc2UuaApAQCAtODYsOCArODYsOCBAQAogCQkJCQkJCQkJXAogCWFzbSB2b2xhdGlsZShBUk02NF9MU0VfQVRPTUlDX0lOU04oCQkJCVwKIAkvKiBMTC9TQyAqLwkJCQkJCQlcCi0JIglub3BcbiIJCQkJCQkJXAotCV9fTExfU0NfQVRPTUlDKGFkZF9yZXR1cm4jI25hbWUpLAkJCQlcCisJX19MTF9TQ19BVE9NSUMoYWRkX3JldHVybiMjbmFtZSkJCQkJXAorCV9fbm9wcygxKSwJCQkJCQkJXAogCS8qIExTRSBhdG9taWNzICovCQkJCQkJXAogCSIJbGRhZGQiICNtYiAiCSV3W2ldLCB3MzAsICVbdl1cbiIJCQlcCiAJIglhZGQJJXdbaV0sICV3W2ldLCB3MzAiKQkJCQlcCkBAIC0xMTIsOCArMTEyLDggQEAKIAogCWFzbSB2b2xhdGlsZShBUk02NF9MU0VfQVRPTUlDX0lOU04oCiAJLyogTEwvU0MgKi8KLQkiCW5vcFxuIgotCV9fTExfU0NfQVRPTUlDKGFuZCksCisJX19MTF9TQ19BVE9NSUMoYW5kKQorCV9fbm9wcygxKSwKIAkvKiBMU0UgYXRvbWljcyAqLwogCSIJbXZuCSV3W2ldLCAld1tpXVxuIgogCSIJc3RjbHIJJXdbaV0sICVbdl0iKQpAQCAtMTMwLDggKzEzMCw4IEBACiAJCQkJCQkJCQlcCiAJYXNtIHZvbGF0aWxlKEFSTTY0X0xTRV9BVE9NSUNfSU5TTigJCQkJXAogCS8qIExML1NDICovCQkJCQkJCVwKLQkiCW5vcFxuIgkJCQkJCQlcCi0JX19MTF9TQ19BVE9NSUMoZmV0Y2hfYW5kIyNuYW1lKSwJCQkJXAorCV9fTExfU0NfQVRPTUlDKGZldGNoX2FuZCMjbmFtZSkJCQkJCVwKKwlfX25vcHMoMSksCQkJCQkJCVwKIAkvKiBMU0UgYXRvbWljcyAqLwkJCQkJCVwKIAkiCW12bgkld1tpXSwgJXdbaV1cbiIJCQkJCVwKIAkiCWxkY2xyIiAjbWIgIgkld1tpXSwgJXdbaV0sICVbdl0iKQkJCVwKQEAgLTE1Niw4ICsxNTYsOCBAQAogCiAJYXNtIHZvbGF0aWxlKEFSTTY0X0xTRV9BVE9NSUNfSU5TTigKIAkvKiBMTC9TQyAqLwotCSIJbm9wXG4iCi0JX19MTF9TQ19BVE9NSUMoc3ViKSwKKwlfX0xMX1NDX0FUT01JQyhzdWIpCisJX19ub3BzKDEpLAogCS8qIExTRSBhdG9taWNzICovCiAJIgluZWcJJXdbaV0sICV3W2ldXG4iCiAJIglzdGFkZAkld1tpXSwgJVt2XSIpCkBAIC0xNzQsOSArMTc0LDggQEAKIAkJCQkJCQkJCVwKIAlhc20gdm9sYXRpbGUoQVJNNjRfTFNFX0FUT01JQ19JTlNOKAkJCQlcCiAJLyogTEwvU0MgKi8JCQkJCQkJXAotCSIJbm9wXG4iCQkJCQkJCVwKIAlfX0xMX1NDX0FUT01JQyhzdWJfcmV0dXJuIyNuYW1lKQkJCQlcCi0JIglub3AiLAkJCQkJCQlcCisJX19ub3BzKDIpLAkJCQkJCQlcCiAJLyogTFNFIGF0b21pY3MgKi8JCQkJCQlcCiAJIgluZWcJJXdbaV0sICV3W2ldXG4iCQkJCQlcCiAJIglsZGFkZCIgI21iICIJJXdbaV0sIHczMCwgJVt2XVxuIgkJCVwKQEAgLTIwMyw4ICsyMDIsOCBAQAogCQkJCQkJCQkJXAogCWFzbSB2b2xhdGlsZShBUk02NF9MU0VfQVRPTUlDX0lOU04oCQkJCVwKIAkvKiBMTC9TQyAqLwkJCQkJCQlcCi0JIglub3BcbiIJCQkJCQkJXAotCV9fTExfU0NfQVRPTUlDKGZldGNoX3N1YiMjbmFtZSksCQkJCVwKKwlfX0xMX1NDX0FUT01JQyhmZXRjaF9zdWIjI25hbWUpCQkJCQlcCisJX19ub3BzKDEpLAkJCQkJCQlcCiAJLyogTFNFIGF0b21pY3MgKi8JCQkJCQlcCiAJIgluZWcJJXdbaV0sICV3W2ldXG4iCQkJCQlcCiAJIglsZGFkZCIgI21iICIJJXdbaV0sICV3W2ldLCAlW3ZdIikJCQlcCkBAIC0yODQsOCArMjgzLDggQEAKIAkJCQkJCQkJCVwKIAlhc20gdm9sYXRpbGUoQVJNNjRfTFNFX0FUT01JQ19JTlNOKAkJCQlcCiAJLyogTEwvU0MgKi8JCQkJCQkJXAotCSIJbm9wXG4iCQkJCQkJCVwKLQlfX0xMX1NDX0FUT01JQzY0KGFkZF9yZXR1cm4jI25hbWUpLAkJCQlcCisJX19MTF9TQ19BVE9NSUM2NChhZGRfcmV0dXJuIyNuYW1lKQkJCQlcCisJX19ub3BzKDEpLAkJCQkJCQlcCiAJLyogTFNFIGF0b21pY3MgKi8JCQkJCQlcCiAJIglsZGFkZCIgI21iICIJJVtpXSwgeDMwLCAlW3ZdXG4iCQkJXAogCSIJYWRkCSVbaV0sICVbaV0sIHgzMCIpCQkJCVwKQEAgLTMxMCw4ICszMDksOCBAQAogCiAJYXNtIHZvbGF0aWxlKEFSTTY0X0xTRV9BVE9NSUNfSU5TTigKIAkvKiBMTC9TQyAqLwotCSIJbm9wXG4iCi0JX19MTF9TQ19BVE9NSUM2NChhbmQpLAorCV9fTExfU0NfQVRPTUlDNjQoYW5kKQorCV9fbm9wcygxKSwKIAkvKiBMU0UgYXRvbWljcyAqLwogCSIJbXZuCSVbaV0sICVbaV1cbiIKIAkiCXN0Y2xyCSVbaV0sICVbdl0iKQpAQCAtMzI4LDggKzMyNyw4IEBACiAJCQkJCQkJCQlcCiAJYXNtIHZvbGF0aWxlKEFSTTY0X0xTRV9BVE9NSUNfSU5TTigJCQkJXAogCS8qIExML1NDICovCQkJCQkJCVwKLQkiCW5vcFxuIgkJCQkJCQlcCi0JX19MTF9TQ19BVE9NSUM2NChmZXRjaF9hbmQjI25hbWUpLAkJCQlcCisJX19MTF9TQ19BVE9NSUM2NChmZXRjaF9hbmQjI25hbWUpCQkJCVwKKwlfX25vcHMoMSksCQkJCQkJCVwKIAkvKiBMU0UgYXRvbWljcyAqLwkJCQkJCVwKIAkiCW12bgklW2ldLCAlW2ldXG4iCQkJCQlcCiAJIglsZGNsciIgI21iICIJJVtpXSwgJVtpXSwgJVt2XSIpCQkJXApAQCAtMzU0LDggKzM1Myw4IEBACiAKIAlhc20gdm9sYXRpbGUoQVJNNjRfTFNFX0FUT01JQ19JTlNOKAogCS8qIExML1NDICovCi0JIglub3BcbiIKLQlfX0xMX1NDX0FUT01JQzY0KHN1YiksCisJX19MTF9TQ19BVE9NSUM2NChzdWIpCisJX19ub3BzKDEpLAogCS8qIExTRSBhdG9taWNzICovCiAJIgluZWcJJVtpXSwgJVtpXVxuIgogCSIJc3RhZGQJJVtpXSwgJVt2XSIpCkBAIC0zNzIsOSArMzcxLDggQEAKIAkJCQkJCQkJCVwKIAlhc20gdm9sYXRpbGUoQVJNNjRfTFNFX0FUT01JQ19JTlNOKAkJCQlcCiAJLyogTEwvU0MgKi8JCQkJCQkJXAotCSIJbm9wXG4iCQkJCQkJCVwKIAlfX0xMX1NDX0FUT01JQzY0KHN1Yl9yZXR1cm4jI25hbWUpCQkJCVwKLQkiCW5vcCIsCQkJCQkJCVwKKwlfX25vcHMoMiksCQkJCQkJCVwKIAkvKiBMU0UgYXRvbWljcyAqLwkJCQkJCVwKIAkiCW5lZwklW2ldLCAlW2ldXG4iCQkJCQlcCiAJIglsZGFkZCIgI21iICIJJVtpXSwgeDMwLCAlW3ZdXG4iCQkJXApAQCAtNDAxLDggKzM5OSw4IEBACiAJCQkJCQkJCQlcCiAJYXNtIHZvbGF0aWxlKEFSTTY0X0xTRV9BVE9NSUNfSU5TTigJCQkJXAogCS8qIExML1NDICovCQkJCQkJCVwKLQkiCW5vcFxuIgkJCQkJCQlcCi0JX19MTF9TQ19BVE9NSUM2NChmZXRjaF9zdWIjI25hbWUpLAkJCQlcCisJX19MTF9TQ19BVE9NSUM2NChmZXRjaF9zdWIjI25hbWUpCQkJCVwKKwlfX25vcHMoMSksCQkJCQkJCVwKIAkvKiBMU0UgYXRvbWljcyAqLwkJCQkJCVwKIAkiCW5lZwklW2ldLCAlW2ldXG4iCQkJCQlcCiAJIglsZGFkZCIgI21iICIJJVtpXSwgJVtpXSwgJVt2XSIpCQkJXApAQCAtNDI2LDEzICs0MjQsOCBAQAogCiAJYXNtIHZvbGF0aWxlKEFSTTY0X0xTRV9BVE9NSUNfSU5TTigKIAkvKiBMTC9TQyAqLwotCSIJbm9wXG4iCiAJX19MTF9TQ19BVE9NSUM2NChkZWNfaWZfcG9zaXRpdmUpCi0JIglub3BcbiIKLQkiCW5vcFxuIgotCSIJbm9wXG4iCi0JIglub3BcbiIKLQkiCW5vcCIsCisJX19ub3BzKDYpLAogCS8qIExTRSBhdG9taWNzICovCiAJIjE6CWxkcgl4MzAsICVbdl1cbiIKIAkiCXN1YnMJJVtyZXRdLCB4MzAsICMxXG4iCkBAIC00NjQsOSArNDU3LDggQEAKIAkJCQkJCQkJCVwKIAlhc20gdm9sYXRpbGUoQVJNNjRfTFNFX0FUT01JQ19JTlNOKAkJCQlcCiAJLyogTEwvU0MgKi8JCQkJCQkJXAotCSIJbm9wXG4iCQkJCQkJCVwKLQkJX19MTF9TQ19DTVBYQ0hHKG5hbWUpCQkJCQlcCi0JIglub3AiLAkJCQkJCQlcCisJX19MTF9TQ19DTVBYQ0hHKG5hbWUpCQkJCQkJXAorCV9fbm9wcygyKSwJCQkJCQkJXAogCS8qIExTRSBhdG9taWNzICovCQkJCQkJXAogCSIJbW92CSIgI3cgIjMwLCAlIiAjdyAiW29sZF1cbiIJCQlcCiAJIgljYXMiICNtYiAjc3ogIlx0IiAjdyAiMzAsICUiICN3ICJbbmV3XSwgJVt2XVxuIgkJXApAQCAtNTE3LDEwICs1MDksOCBAQAogCQkJCQkJCQkJXAogCWFzbSB2b2xhdGlsZShBUk02NF9MU0VfQVRPTUlDX0lOU04oCQkJCVwKIAkvKiBMTC9TQyAqLwkJCQkJCQlcCi0JIglub3BcbiIJCQkJCQkJXAotCSIJbm9wXG4iCQkJCQkJCVwKLQkiCW5vcFxuIgkJCQkJCQlcCi0JX19MTF9TQ19DTVBYQ0hHX0RCTChuYW1lKSwJCQkJCVwKKwlfX0xMX1NDX0NNUFhDSEdfREJMKG5hbWUpCQkJCQlcCisJX19ub3BzKDMpLAkJCQkJCQlcCiAJLyogTFNFIGF0b21pY3MgKi8JCQkJCQlcCiAJIgljYXNwIiAjbWIgIlx0JVtvbGQxXSwgJVtvbGQyXSwgJVtuZXcxXSwgJVtuZXcyXSwgJVt2XVxuIlwKIAkiCWVvcgklW29sZDFdLCAlW29sZDFdLCAlW29sZHZhbDFdXG4iCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9iYXJyaWVyLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2JhcnJpZXIuaAppbmRleCA0ZWVhN2Y2Li40ZTA0OTdmIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2JhcnJpZXIuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2JhcnJpZXIuaApAQCAtMjAsNiArMjAsOSBAQAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCisjZGVmaW5lIF9fbm9wcyhuKQkiLnJlcHQJIiAjbiAiXG5ub3Bcbi5lbmRyXG4iCisjZGVmaW5lIG5vcHMobikJCWFzbSB2b2xhdGlsZShfX25vcHMobikpCisKICNkZWZpbmUgc2V2KCkJCWFzbSB2b2xhdGlsZSgic2V2IiA6IDogOiAibWVtb3J5IikKICNkZWZpbmUgd2ZlKCkJCWFzbSB2b2xhdGlsZSgid2ZlIiA6IDogOiAibWVtb3J5IikKICNkZWZpbmUgd2ZpKCkJCWFzbSB2b2xhdGlsZSgid2ZpIiA6IDogOiAibWVtb3J5IikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKaW5kZXggYzY0MjY4ZC4uMmU1ZmI5NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKQEAgLTY4LDYgKzY4LDcgQEAKIGV4dGVybiB2b2lkIGZsdXNoX2NhY2hlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7CiBleHRlcm4gdm9pZCBmbHVzaF9pY2FjaGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOwogZXh0ZXJuIHZvaWQgX19mbHVzaF9kY2FjaGVfYXJlYSh2b2lkICphZGRyLCBzaXplX3QgbGVuKTsKK2V4dGVybiB2b2lkIF9fY2xlYW5fZGNhY2hlX2FyZWFfcG9jKHZvaWQgKmFkZHIsIHNpemVfdCBsZW4pOwogZXh0ZXJuIHZvaWQgX19jbGVhbl9kY2FjaGVfYXJlYV9wb3Uodm9pZCAqYWRkciwgc2l6ZV90IGxlbik7CiBleHRlcm4gbG9uZyBfX2ZsdXNoX2NhY2hlX3VzZXJfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOwogCkBAIC04NSw3ICs4Niw3IEBACiAgKi8KIGV4dGVybiB2b2lkIF9fZG1hX21hcF9hcmVhKGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBpbnQpOwogZXh0ZXJuIHZvaWQgX19kbWFfdW5tYXBfYXJlYShjb25zdCB2b2lkICosIHNpemVfdCwgaW50KTsKLWV4dGVybiB2b2lkIF9fZG1hX2ZsdXNoX3JhbmdlKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKTsKK2V4dGVybiB2b2lkIF9fZG1hX2ZsdXNoX2FyZWEoY29uc3Qgdm9pZCAqLCBzaXplX3QpOwogCiAvKgogICogQ29weSB1c2VyIGRhdGEgZnJvbS90byBhIHBhZ2Ugd2hpY2ggaXMgbWFwcGVkIGludG8gYSBkaWZmZXJlbnQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY2xvY2tzb3VyY2UuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY2xvY2tzb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjM1MGE3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9jbG9ja3NvdXJjZS5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfQVNNX0NMT0NLU09VUkNFX0gKKyNkZWZpbmUgX0FTTV9DTE9DS1NPVVJDRV9ICisKK3N0cnVjdCBhcmNoX2Nsb2Nrc291cmNlX2RhdGEgeworCWJvb2wgdmRzb19kaXJlY3Q7CS8qIFVzYWJsZSBmb3IgZGlyZWN0IFZEU08gYWNjZXNzPyAqLworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NtcHhjaGcuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY21weGNoZy5oCmluZGV4IGJkODZhNzkuLjkxYjI2ZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY21weGNoZy5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY21weGNoZy5oCkBAIC00MywxMCArNDMsOCBAQAogCSIJY2JuegkldzEsIDFiXG4iCQkJCQlcCiAJIgkiICNtYiwJCQkJCQkJXAogCS8qIExTRSBhdG9taWNzICovCQkJCQkJXAotCSIJbm9wXG4iCQkJCQkJCVwKLQkiCW5vcFxuIgkJCQkJCQlcCiAJIglzd3AiICNhY3FfbHNlICNyZWwgI3N6ICJcdCUiICN3ICIzLCAlIiAjdyAiMCwgJTJcbiIJXAotCSIJbm9wXG4iCQkJCQkJCVwKKwkJX19ub3BzKDMpCQkJCQkJXAogCSIJIiAjbm9wX2xzZSkJCQkJCQlcCiAJOiAiPSZyIiAocmV0KSwgIj0mciIgKHRtcCksICIrUSIgKCoodTggKilwdHIpCQkJXAogCTogInIiICh4KQkJCQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmUuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oCmluZGV4IDcwOTlmMjYuLjc1OGQ3NGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oCkBAIC05LDYgKzksOCBAQAogI2lmbmRlZiBfX0FTTV9DUFVGRUFUVVJFX0gKICNkZWZpbmUgX19BU01fQ1BVRkVBVFVSRV9ICiAKKyNpbmNsdWRlIDxsaW51eC9qdW1wX2xhYmVsLmg+CisKICNpbmNsdWRlIDxhc20vaHdjYXAuaD4KICNpbmNsdWRlIDxhc20vc3lzcmVnLmg+CiAKQEAgLTM3LDggKzM5LDkgQEAKICNkZWZpbmUgQVJNNjRfV09SS0FST1VORF9DQVZJVU1fMjc0NTYJCTEyCiAjZGVmaW5lIEFSTTY0X0hBU18zMkJJVF9FTDAJCQkxMwogI2RlZmluZSBBUk02NF9IWVBfT0ZGU0VUX0xPVwkJCTE0CisjZGVmaW5lIEFSTTY0X01JU01BVENIRURfQ0FDSEVfTElORV9TSVpFCTE1CiAKLSNkZWZpbmUgQVJNNjRfTkNBUFMJCQkJMTUKKyNkZWZpbmUgQVJNNjRfTkNBUFMJCQkJMTYKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIApAQCAtNjMsNyArNjYsNyBAQAogCWVudW0gZnRyX3R5cGUJdHlwZTsKIAl1OAkJc2hpZnQ7CiAJdTgJCXdpZHRoOwotCXM2NAkJc2FmZV92YWw7IC8qIHNhZmUgdmFsdWUgZm9yIGRpc2NyZXRlIGZlYXR1cmVzICovCisJczY0CQlzYWZlX3ZhbDsgLyogc2FmZSB2YWx1ZSBmb3IgRlRSX0VYQUNUIGZlYXR1cmVzICovCiB9OwogCiAvKgpAQCAtNzIsMTMgKzc1LDE0IEBACiAgKiBAc3lzX3ZhbAkJU2FmZSB2YWx1ZSBhY3Jvc3MgdGhlIENQVXMgKHN5c3RlbSB2aWV3KQogICovCiBzdHJ1Y3QgYXJtNjRfZnRyX3JlZyB7Ci0JdTMyCQkJc3lzX2lkOwotCWNvbnN0IGNoYXIJCSpuYW1lOwotCXU2NAkJCXN0cmljdF9tYXNrOwotCXU2NAkJCXN5c192YWw7Ci0Jc3RydWN0IGFybTY0X2Z0cl9iaXRzCSpmdHJfYml0czsKKwljb25zdCBjaGFyCQkJKm5hbWU7CisJdTY0CQkJCXN0cmljdF9tYXNrOworCXU2NAkJCQlzeXNfdmFsOworCWNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cwkqZnRyX2JpdHM7CiB9OwogCitleHRlcm4gc3RydWN0IGFybTY0X2Z0cl9yZWcgYXJtNjRfZnRyX3JlZ19jdHJlbDA7CisKIC8qIHNjb3BlIG9mIGNhcGFiaWxpdHkgY2hlY2sgKi8KIGVudW0gewogCVNDT1BFX1NZU1RFTSwKQEAgLTEwOSw2ICsxMTMsNyBAQAogfTsKIAogZXh0ZXJuIERFQ0xBUkVfQklUTUFQKGNwdV9od2NhcHMsIEFSTTY0X05DQVBTKTsKK2V4dGVybiBzdHJ1Y3Qgc3RhdGljX2tleV9mYWxzZSBjcHVfaHdjYXBfa2V5c1tBUk02NF9OQ0FQU107CiAKIGJvb2wgdGhpc19jcHVfaGFzX2NhcCh1bnNpZ25lZCBpbnQgY2FwKTsKIApAQCAtMTIxLDE2ICsxMjYsMjEgQEAKIHsKIAlpZiAobnVtID49IEFSTTY0X05DQVBTKQogCQlyZXR1cm4gZmFsc2U7Ci0JcmV0dXJuIHRlc3RfYml0KG51bSwgY3B1X2h3Y2Fwcyk7CisJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKG51bSkpCisJCXJldHVybiBzdGF0aWNfYnJhbmNoX3VubGlrZWx5KCZjcHVfaHdjYXBfa2V5c1tudW1dKTsKKwllbHNlCisJCXJldHVybiB0ZXN0X2JpdChudW0sIGNwdV9od2NhcHMpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY3B1c19zZXRfY2FwKHVuc2lnbmVkIGludCBudW0pCiB7Ci0JaWYgKG51bSA+PSBBUk02NF9OQ0FQUykKKwlpZiAobnVtID49IEFSTTY0X05DQVBTKSB7CiAJCXByX3dhcm4oIkF0dGVtcHQgdG8gc2V0IGFuIGlsbGVnYWwgQ1BVIGNhcGFiaWxpdHkgKCVkID49ICVkKVxuIiwKIAkJCW51bSwgQVJNNjRfTkNBUFMpOwotCWVsc2UKKwl9IGVsc2UgewogCQlfX3NldF9iaXQobnVtLCBjcHVfaHdjYXBzKTsKKwkJc3RhdGljX2JyYW5jaF9lbmFibGUoJmNwdV9od2NhcF9rZXlzW251bV0pOworCX0KIH0KIAogc3RhdGljIGlubGluZSBpbnQgX19hdHRyaWJ1dGVfY29uc3RfXwpAQCAtMTU3LDcgKzE2Nyw3IEBACiAJcmV0dXJuIGNwdWlkX2ZlYXR1cmVfZXh0cmFjdF91bnNpZ25lZF9maWVsZF93aWR0aChmZWF0dXJlcywgZmllbGQsIDQpOwogfQogCi1zdGF0aWMgaW5saW5lIHU2NCBhcm02NF9mdHJfbWFzayhzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgKmZ0cnApCitzdGF0aWMgaW5saW5lIHU2NCBhcm02NF9mdHJfbWFzayhjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgKmZ0cnApCiB7CiAJcmV0dXJuICh1NjQpR0VOTUFTSyhmdHJwLT5zaGlmdCArIGZ0cnAtPndpZHRoIC0gMSwgZnRycC0+c2hpZnQpOwogfQpAQCAtMTcwLDcgKzE4MCw3IEBACiAJCWNwdWlkX2ZlYXR1cmVfZXh0cmFjdF91bnNpZ25lZF9maWVsZChmZWF0dXJlcywgZmllbGQpOwogfQogCi1zdGF0aWMgaW5saW5lIHM2NCBhcm02NF9mdHJfdmFsdWUoc3RydWN0IGFybTY0X2Z0cl9iaXRzICpmdHJwLCB1NjQgdmFsKQorc3RhdGljIGlubGluZSBzNjQgYXJtNjRfZnRyX3ZhbHVlKGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyAqZnRycCwgdTY0IHZhbCkKIHsKIAlyZXR1cm4gKHM2NCljcHVpZF9mZWF0dXJlX2V4dHJhY3RfZmllbGQodmFsLCBmdHJwLT5zaGlmdCwgZnRycC0+c2lnbik7CiB9CkBAIC0xOTMsMTEgKzIwMywxMSBAQAogdm9pZCB1cGRhdGVfY3B1X2NhcGFiaWxpdGllcyhjb25zdCBzdHJ1Y3QgYXJtNjRfY3B1X2NhcGFiaWxpdGllcyAqY2FwcywKIAkJCSAgICBjb25zdCBjaGFyICppbmZvKTsKIHZvaWQgZW5hYmxlX2NwdV9jYXBhYmlsaXRpZXMoY29uc3Qgc3RydWN0IGFybTY0X2NwdV9jYXBhYmlsaXRpZXMgKmNhcHMpOwotdm9pZCBjaGVja19sb2NhbF9jcHVfZXJyYXRhKHZvaWQpOwotdm9pZCBfX2luaXQgZW5hYmxlX2VycmF0YV93b3JrYXJvdW5kcyh2b2lkKTsKK3ZvaWQgY2hlY2tfbG9jYWxfY3B1X2NhcGFiaWxpdGllcyh2b2lkKTsKIAotdm9pZCB2ZXJpZnlfbG9jYWxfY3B1X2VycmF0YSh2b2lkKTsKLXZvaWQgdmVyaWZ5X2xvY2FsX2NwdV9jYXBhYmlsaXRpZXModm9pZCk7Cit2b2lkIHVwZGF0ZV9jcHVfZXJyYXRhX3dvcmthcm91bmRzKHZvaWQpOwordm9pZCBfX2luaXQgZW5hYmxlX2VycmF0YV93b3JrYXJvdW5kcyh2b2lkKTsKK3ZvaWQgdmVyaWZ5X2xvY2FsX2NwdV9lcnJhdGFfd29ya2Fyb3VuZHModm9pZCk7CiAKIHU2NCByZWFkX3N5c3RlbV9yZWcodTMyIGlkKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9jcHV0eXBlLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NwdXR5cGUuaAppbmRleCA5ZDlmZDRiLi4yNmE2OGRkIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NwdXR5cGUuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NwdXR5cGUuaApAQCAtOTMsMTEgKzkzLDcgQEAKIAogI2luY2x1ZGUgPGFzbS9zeXNyZWcuaD4KIAotI2RlZmluZSByZWFkX2NwdWlkKHJlZykgKHsJCQkJCQlcCi0JdTY0IF9fdmFsOwkJCQkJCQlcCi0JYXNtKCJtcnNfcwklMCwgIiBfX3N0cmluZ2lmeShTWVNfICMjIHJlZykgOiAiPXIiIChfX3ZhbCkpOwlcCi0JX192YWw7CQkJCQkJCQlcCi19KQorI2RlZmluZSByZWFkX2NwdWlkKHJlZykJCQlyZWFkX3N5c3JlZ19zKFNZU18gIyMgcmVnKQogCiAvKgogICogVGhlIENQVSBJRCBuZXZlciBjaGFuZ2VzIGF0IHJ1biB0aW1lLCBzbyB3ZSBtaWdodCBhcyB3ZWxsIHRlbGwgdGhlCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2RjYy5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9kY2MuaAppbmRleCA2NWUwMTkwLi44MzZiMDU2IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2RjYy5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZGNjLmgKQEAgLTIxLDIxICsyMSwxNiBAQAogI2RlZmluZSBfX0FTTV9EQ0NfSAogCiAjaW5jbHVkZSA8YXNtL2JhcnJpZXIuaD4KKyNpbmNsdWRlIDxhc20vc3lzcmVnLmg+CiAKIHN0YXRpYyBpbmxpbmUgdTMyIF9fZGNjX2dldHN0YXR1cyh2b2lkKQogewotCXUzMiByZXQ7Ci0KLQlhc20gdm9sYXRpbGUoIm1ycyAlMCwgbWRjY3NyX2VsMCIgOiAiPXIiIChyZXQpKTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIHJlYWRfc3lzcmVnKG1kY2Nzcl9lbDApOwogfQogCiBzdGF0aWMgaW5saW5lIGNoYXIgX19kY2NfZ2V0Y2hhcih2b2lkKQogewotCWNoYXIgYzsKLQotCWFzbSB2b2xhdGlsZSgibXJzICUwLCBkYmdkdHJyeF9lbDAiIDogIj1yIiAoYykpOworCWNoYXIgYyA9IHJlYWRfc3lzcmVnKGRiZ2R0cnJ4X2VsMCk7CiAJaXNiKCk7CiAKIAlyZXR1cm4gYzsKQEAgLTQ3LDggKzQyLDcgQEAKIAkgKiBUaGUgdHlwZWNhc3QgaXMgdG8gbWFrZSBhYnNvbHV0ZWx5IGNlcnRhaW4gdGhhdCAnYycgaXMKIAkgKiB6ZXJvLWV4dGVuZGVkLgogCSAqLwotCWFzbSB2b2xhdGlsZSgibXNyIGRiZ2R0cnR4X2VsMCwgJTAiCi0JCQk6IDogInIiICgodW5zaWduZWQgbG9uZykodW5zaWduZWQgY2hhciljKSk7CisJd3JpdGVfc3lzcmVnKCh1bnNpZ25lZCBjaGFyKWMsIGRiZ2R0cnR4X2VsMCk7CiAJaXNiKCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZGVidWctbW9uaXRvcnMuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZGVidWctbW9uaXRvcnMuaAppbmRleCA0YjZiM2Y3Li5iNzE0MjBhIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2RlYnVnLW1vbml0b3JzLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9kZWJ1Zy1tb25pdG9ycy5oCkBAIC02MSw4ICs2MSw2IEBACiAKICNkZWZpbmUgQUFSQ0g2NF9CUkVBS19LR0RCX0RZTl9EQkcJXAogCShBQVJDSDY0X0JSRUFLX01PTiB8IChLR0RCX0RZTl9EQkdfQlJLX0lNTSA8PCA1KSkKLSNkZWZpbmUgS0dEQl9EWU5fQlJLX0lOU19CWVRFKHgpCVwKLQkoKEFBUkNINjRfQlJFQUtfS0dEQl9EWU5fREJHID4+ICg4ICogKHgpKSkgJiAweGZmKQogCiAjZGVmaW5lIENBQ0hFX0ZMVVNIX0lTX1NBRkUJCTEKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9lc3IuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXNyLmgKaW5kZXggZjc3MmUxNS4uZDE0YzQ3OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9lc3IuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Vzci5oCkBAIC03OCw2ICs3OCwyMyBAQAogCiAjZGVmaW5lIEVTUl9FTHhfSUwJCShVTCgxKSA8PCAyNSkKICNkZWZpbmUgRVNSX0VMeF9JU1NfTUFTSwkoRVNSX0VMeF9JTCAtIDEpCisKKy8qIElTUyBmaWVsZCBkZWZpbml0aW9ucyBzaGFyZWQgYnkgZGlmZmVyZW50IGNsYXNzZXMgKi8KKyNkZWZpbmUgRVNSX0VMeF9XTlIJCShVTCgxKSA8PCA2KQorCisvKiBTaGFyZWQgSVNTIGZpZWxkIGRlZmluaXRpb25zIGZvciBEYXRhL0luc3RydWN0aW9uIGFib3J0cyAqLworI2RlZmluZSBFU1JfRUx4X0VBCQkoVUwoMSkgPDwgOSkKKyNkZWZpbmUgRVNSX0VMeF9TMVBUVwkJKFVMKDEpIDw8IDcpCisKKy8qIFNoYXJlZCBJU1MgZmF1bHQgc3RhdHVzIGNvZGUoSUZTQy9ERlNDKSBmb3IgRGF0YS9JbnN0cnVjdGlvbiBhYm9ydHMgKi8KKyNkZWZpbmUgRVNSX0VMeF9GU0MJCSgweDNGKQorI2RlZmluZSBFU1JfRUx4X0ZTQ19UWVBFCSgweDNDKQorI2RlZmluZSBFU1JfRUx4X0ZTQ19FWFRBQlQJKDB4MTApCisjZGVmaW5lIEVTUl9FTHhfRlNDX0FDQ0VTUwkoMHgwOCkKKyNkZWZpbmUgRVNSX0VMeF9GU0NfRkFVTFQJKDB4MDQpCisjZGVmaW5lIEVTUl9FTHhfRlNDX1BFUk0JKDB4MEMpCisKKy8qIElTUyBmaWVsZCBkZWZpbml0aW9ucyBmb3IgRGF0YSBBYm9ydHMgKi8KICNkZWZpbmUgRVNSX0VMeF9JU1YJCShVTCgxKSA8PCAyNCkKICNkZWZpbmUgRVNSX0VMeF9TQVNfU0hJRlQJKDIyKQogI2RlZmluZSBFU1JfRUx4X1NBUwkJKFVMKDMpIDw8IEVTUl9FTHhfU0FTX1NISUZUKQpAQCAtODYsMTYgKzEwMyw5IEBACiAjZGVmaW5lIEVTUl9FTHhfU1JUX01BU0sJKFVMKDB4MUYpIDw8IEVTUl9FTHhfU1JUX1NISUZUKQogI2RlZmluZSBFU1JfRUx4X1NGIAkJKFVMKDEpIDw8IDE1KQogI2RlZmluZSBFU1JfRUx4X0FSIAkJKFVMKDEpIDw8IDE0KQotI2RlZmluZSBFU1JfRUx4X0VBIAkJKFVMKDEpIDw8IDkpCiAjZGVmaW5lIEVTUl9FTHhfQ00gCQkoVUwoMSkgPDwgOCkKLSNkZWZpbmUgRVNSX0VMeF9TMVBUVyAJCShVTCgxKSA8PCA3KQotI2RlZmluZSBFU1JfRUx4X1dOUgkJKFVMKDEpIDw8IDYpCi0jZGVmaW5lIEVTUl9FTHhfRlNDCQkoMHgzRikKLSNkZWZpbmUgRVNSX0VMeF9GU0NfVFlQRQkoMHgzQykKLSNkZWZpbmUgRVNSX0VMeF9GU0NfRVhUQUJUCSgweDEwKQotI2RlZmluZSBFU1JfRUx4X0ZTQ19BQ0NFU1MJKDB4MDgpCi0jZGVmaW5lIEVTUl9FTHhfRlNDX0ZBVUxUCSgweDA0KQotI2RlZmluZSBFU1JfRUx4X0ZTQ19QRVJNCSgweDBDKQorCisvKiBJU1MgZmllbGQgZGVmaW5pdGlvbnMgZm9yIGV4Y2VwdGlvbnMgdGFrZW4gaW4gdG8gSHlwICovCiAjZGVmaW5lIEVTUl9FTHhfQ1YJCShVTCgxKSA8PCAyNCkKICNkZWZpbmUgRVNSX0VMeF9DT05EX1NISUZUCSgyMCkKICNkZWZpbmUgRVNSX0VMeF9DT05EX01BU0sJKFVMKDB4RikgPDwgRVNSX0VMeF9DT05EX1NISUZUKQpAQCAtMTA5LDYgKzExOSw2MiBAQAogCSgoRVNSX0VMeF9FQ19CUks2NCA8PCBFU1JfRUx4X0VDX1NISUZUKSB8IEVTUl9FTHhfSUwgfAlcCiAJICgoaW1tKSAmIDB4ZmZmZikpCiAKKy8qIElTUyBmaWVsZCBkZWZpbml0aW9ucyBmb3IgU3lzdGVtIGluc3RydWN0aW9uIHRyYXBzICovCisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX1JFUzBfU0hJRlQJMjIKKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfUkVTMF9NQVNLCShVTCgweDcpIDw8IEVTUl9FTHhfU1lTNjRfSVNTX1JFUzBfU0hJRlQpCisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX0RJUl9NQVNLCTB4MQorI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19ESVJfUkVBRAkweDEKKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfRElSX1dSSVRFCTB4MAorCisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX1JUX1NISUZUCTUKKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfUlRfTUFTSwkoVUwoMHgxZikgPDwgRVNSX0VMeF9TWVM2NF9JU1NfUlRfU0hJRlQpCisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX0NSTV9TSElGVAkxCisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX0NSTV9NQVNLCShVTCgweGYpIDw8IEVTUl9FTHhfU1lTNjRfSVNTX0NSTV9TSElGVCkKKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfQ1JOX1NISUZUCTEwCisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX0NSTl9NQVNLCShVTCgweGYpIDw8IEVTUl9FTHhfU1lTNjRfSVNTX0NSTl9TSElGVCkKKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfT1AxX1NISUZUCTE0CisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX09QMV9NQVNLCShVTCgweDcpIDw8IEVTUl9FTHhfU1lTNjRfSVNTX09QMV9TSElGVCkKKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfT1AyX1NISUZUCTE3CisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX09QMl9NQVNLCShVTCgweDcpIDw8IEVTUl9FTHhfU1lTNjRfSVNTX09QMl9TSElGVCkKKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfT1AwX1NISUZUCTIwCisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX09QMF9NQVNLCShVTCgweDMpIDw8IEVTUl9FTHhfU1lTNjRfSVNTX09QMF9TSElGVCkKKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfU1lTX01BU0sJKEVTUl9FTHhfU1lTNjRfSVNTX09QMF9NQVNLIHwgXAorCQkJCQkgRVNSX0VMeF9TWVM2NF9JU1NfT1AxX01BU0sgfCBcCisJCQkJCSBFU1JfRUx4X1NZUzY0X0lTU19PUDJfTUFTSyB8IFwKKwkJCQkJIEVTUl9FTHhfU1lTNjRfSVNTX0NSTl9NQVNLIHwgXAorCQkJCQkgRVNSX0VMeF9TWVM2NF9JU1NfQ1JNX01BU0spCisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX1NZU19WQUwob3AwLCBvcDEsIG9wMiwgY3JuLCBjcm0pIFwKKwkJCQkJKCgob3AwKSA8PCBFU1JfRUx4X1NZUzY0X0lTU19PUDBfU0hJRlQpIHwgXAorCQkJCQkgKChvcDEpIDw8IEVTUl9FTHhfU1lTNjRfSVNTX09QMV9TSElGVCkgfCBcCisJCQkJCSAoKG9wMikgPDwgRVNSX0VMeF9TWVM2NF9JU1NfT1AyX1NISUZUKSB8IFwKKwkJCQkJICgoY3JuKSA8PCBFU1JfRUx4X1NZUzY0X0lTU19DUk5fU0hJRlQpIHwgXAorCQkJCQkgKChjcm0pIDw8IEVTUl9FTHhfU1lTNjRfSVNTX0NSTV9TSElGVCkpCisKKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfU1lTX09QX01BU0sJKEVTUl9FTHhfU1lTNjRfSVNTX1NZU19NQVNLIHwgXAorCQkJCQkgRVNSX0VMeF9TWVM2NF9JU1NfRElSX01BU0spCisvKgorICogVXNlciBzcGFjZSBjYWNoZSBvcGVyYXRpb25zIGhhdmUgdGhlIGZvbGxvd2luZyBzeXNyZWcgZW5jb2RpbmcKKyAqIGluIFN5c3RlbSBpbnN0cnVjdGlvbnMuCisgKiBvcDA9MSwgb3AxPTMsIG9wMj0xLCBjcm49NywgY3JtPXsgNSwgMTAsIDExLCAxNCB9LCBXUklURSAoTD0wKQorICovCisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX0NSTV9EQ19DSVZBQwkxNAorI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19DUk1fRENfQ1ZBVQkxMQorI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19DUk1fRENfQ1ZBQwkxMAorI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19DUk1fSUNfSVZBVQk1CisKKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfRUwwX0NBQ0hFX09QX01BU0sJKEVTUl9FTHhfU1lTNjRfSVNTX09QMF9NQVNLIHwgXAorCQkJCQkJIEVTUl9FTHhfU1lTNjRfSVNTX09QMV9NQVNLIHwgXAorCQkJCQkJIEVTUl9FTHhfU1lTNjRfSVNTX09QMl9NQVNLIHwgXAorCQkJCQkJIEVTUl9FTHhfU1lTNjRfSVNTX0NSTl9NQVNLIHwgXAorCQkJCQkJIEVTUl9FTHhfU1lTNjRfSVNTX0RJUl9NQVNLKQorI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19FTDBfQ0FDSEVfT1BfVkFMIFwKKwkJCQkoRVNSX0VMeF9TWVM2NF9JU1NfU1lTX1ZBTCgxLCAzLCAxLCA3LCAwKSB8IFwKKwkJCQkgRVNSX0VMeF9TWVM2NF9JU1NfRElSX1dSSVRFKQorCisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX1NZU19DVFIJRVNSX0VMeF9TWVM2NF9JU1NfU1lTX1ZBTCgzLCAzLCAxLCAwLCAwKQorI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19TWVNfQ1RSX1JFQUQJKEVTUl9FTHhfU1lTNjRfSVNTX1NZU19DVFIgfCBcCisJCQkJCSBFU1JfRUx4X1NZUzY0X0lTU19ESVJfUkVBRCkKKwogI2lmbmRlZiBfX0FTU0VNQkxZX18KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9od19icmVha3BvaW50LmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2h3X2JyZWFrcG9pbnQuaAppbmRleCAxMTVlYTJhLi45NTEwYWNlIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2h3X2JyZWFrcG9pbnQuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2h3X2JyZWFrcG9pbnQuaApAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSA8YXNtL2NwdXR5cGUuaD4KICNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgorI2luY2x1ZGUgPGFzbS9zeXNyZWcuaD4KICNpbmNsdWRlIDxhc20vdmlydC5oPgogCiAjaWZkZWYgX19LRVJORUxfXwpAQCAtOTgsMTggKzk5LDE4IEBACiAjZGVmaW5lIEFBUkNINjRfREJHX1JFR19XQ1IJKEFBUkNINjRfREJHX1JFR19XVlIgKyBBUk1fTUFYX1dSUCkKIAogLyogRGVidWcgcmVnaXN0ZXIgbmFtZXMuICovCi0jZGVmaW5lIEFBUkNINjRfREJHX1JFR19OQU1FX0JWUgkiYnZyIgotI2RlZmluZSBBQVJDSDY0X0RCR19SRUdfTkFNRV9CQ1IJImJjciIKLSNkZWZpbmUgQUFSQ0g2NF9EQkdfUkVHX05BTUVfV1ZSCSJ3dnIiCi0jZGVmaW5lIEFBUkNINjRfREJHX1JFR19OQU1FX1dDUgkid2NyIgorI2RlZmluZSBBQVJDSDY0X0RCR19SRUdfTkFNRV9CVlIJYnZyCisjZGVmaW5lIEFBUkNINjRfREJHX1JFR19OQU1FX0JDUgliY3IKKyNkZWZpbmUgQUFSQ0g2NF9EQkdfUkVHX05BTUVfV1ZSCXd2cgorI2RlZmluZSBBQVJDSDY0X0RCR19SRUdfTkFNRV9XQ1IJd2NyCiAKIC8qIEFjY2Vzc29yIG1hY3JvcyBmb3IgdGhlIGRlYnVnIHJlZ2lzdGVycy4gKi8KICNkZWZpbmUgQUFSQ0g2NF9EQkdfUkVBRChOLCBSRUcsIFZBTCkgZG8ge1wKLQlhc20gdm9sYXRpbGUoIm1ycyAlMCwgZGJnIiBSRUcgI04gIl9lbDEiIDogIj1yIiAoVkFMKSk7XAorCVZBTCA9IHJlYWRfc3lzcmVnKGRiZyMjUkVHIyNOIyNfZWwxKTtcCiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIEFBUkNINjRfREJHX1dSSVRFKE4sIFJFRywgVkFMKSBkbyB7XAotCWFzbSB2b2xhdGlsZSgibXNyIGRiZyIgUkVHICNOICJfZWwxLCAlMCIgOjogInIiIChWQUwpKTtcCisJd3JpdGVfc3lzcmVnKFZBTCwgZGJnIyNSRUcjI04jI19lbDEpO1wKIH0gd2hpbGUgKDApCiAKIHN0cnVjdCB0YXNrX3N0cnVjdDsKQEAgLTE0MSw4ICsxNDIsNiBAQAogfQogI2VuZGlmCiAKLWV4dGVybiBzdHJ1Y3QgcG11IHBlcmZfb3BzX2JwOwotCiAvKiBEZXRlcm1pbmUgbnVtYmVyIG9mIEJSUCByZWdpc3RlcnMgYXZhaWxhYmxlLiAqLwogc3RhdGljIGlubGluZSBpbnQgZ2V0X251bV9icnBzKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2luc24uaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaW5zbi5oCmluZGV4IDFkYmFhOTAuLmJjODUzNjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaW5zbi5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaW5zbi5oCkBAIC0yNDYsNyArMjQ2LDggQEAKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdTMyIGFhcmNoNjRfaW5zbl9nZXRfIyNhYmJyIyNfdmFsdWUodm9pZCkgXAogeyByZXR1cm4gKHZhbCk7IH0KIAotX19BQVJDSDY0X0lOU05fRlVOQ1MoYWRyX2FkcnAsCTB4MUYwMDAwMDAsIDB4MTAwMDAwMDApCitfX0FBUkNINjRfSU5TTl9GVU5DUyhhZHIsCTB4OUYwMDAwMDAsIDB4MTAwMDAwMDApCitfX0FBUkNINjRfSU5TTl9GVU5DUyhhZHJwLAkweDlGMDAwMDAwLCAweDkwMDAwMDAwKQogX19BQVJDSDY0X0lOU05fRlVOQ1MocHJmbV9saXQsCTB4RkYwMDAwMDAsIDB4RDgwMDAwMDApCiBfX0FBUkNINjRfSU5TTl9GVU5DUyhzdHJfcmVnLAkweDNGRTBFQzAwLCAweDM4MjA2ODAwKQogX19BQVJDSDY0X0lOU05fRlVOQ1MobGRyX3JlZywJMHgzRkUwRUMwMCwgMHgzODYwNjgwMCkKQEAgLTMxOCw2ICszMTksMTEgQEAKIGJvb2wgYWFyY2g2NF9pbnNuX2lzX25vcCh1MzIgaW5zbik7CiBib29sIGFhcmNoNjRfaW5zbl9pc19icmFuY2hfaW1tKHUzMiBpbnNuKTsKIAorc3RhdGljIGlubGluZSBib29sIGFhcmNoNjRfaW5zbl9pc19hZHJfYWRycCh1MzIgaW5zbikKK3sKKwlyZXR1cm4gYWFyY2g2NF9pbnNuX2lzX2FkcihpbnNuKSB8fCBhYXJjaDY0X2luc25faXNfYWRycChpbnNuKTsKK30KKwogaW50IGFhcmNoNjRfaW5zbl9yZWFkKHZvaWQgKmFkZHIsIHUzMiAqaW5zbnApOwogaW50IGFhcmNoNjRfaW5zbl93cml0ZSh2b2lkICphZGRyLCB1MzIgaW5zbik7CiBlbnVtIGFhcmNoNjRfaW5zbl9lbmNvZGluZ19jbGFzcyBhYXJjaDY0X2dldF9pbnNuX2NsYXNzKHUzMiBpbnNuKTsKQEAgLTM5OCw2ICs0MDQsOSBAQAogaW50IGFhcmNoNjRfaW5zbl9wYXRjaF90ZXh0X3N5bmModm9pZCAqYWRkcnNbXSwgdTMyIGluc25zW10sIGludCBjbnQpOwogaW50IGFhcmNoNjRfaW5zbl9wYXRjaF90ZXh0KHZvaWQgKmFkZHJzW10sIHUzMiBpbnNuc1tdLCBpbnQgY250KTsKIAorczMyIGFhcmNoNjRfaW5zbl9hZHJwX2dldF9vZmZzZXQodTMyIGluc24pOwordTMyIGFhcmNoNjRfaW5zbl9hZHJwX3NldF9vZmZzZXQodTMyIGluc24sIHMzMiBvZmZzZXQpOworCiBib29sIGFhcmNoMzJfaW5zbl9pc193aWRlKHUzMiBpbnNuKTsKIAogI2RlZmluZSBBMzJfUk5fT0ZGU0VUCTE2CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2lvLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2lvLmgKaW5kZXggOWI2ZTQwOC4uMGJiYTQyNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9pby5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaW8uaApAQCAtNDAsMjUgKzQwLDI1IEBACiAjZGVmaW5lIF9fcmF3X3dyaXRlYiBfX3Jhd193cml0ZWIKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZWIodTggdmFsLCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JYXNtIHZvbGF0aWxlKCJzdHJiICV3MCwgWyUxXSIgOiA6ICJyIiAodmFsKSwgInIiIChhZGRyKSk7CisJYXNtIHZvbGF0aWxlKCJzdHJiICV3MCwgWyUxXSIgOiA6ICJyWiIgKHZhbCksICJyIiAoYWRkcikpOwogfQogCiAjZGVmaW5lIF9fcmF3X3dyaXRldyBfX3Jhd193cml0ZXcKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZXcodTE2IHZhbCwgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewotCWFzbSB2b2xhdGlsZSgic3RyaCAldzAsIFslMV0iIDogOiAiciIgKHZhbCksICJyIiAoYWRkcikpOworCWFzbSB2b2xhdGlsZSgic3RyaCAldzAsIFslMV0iIDogOiAicloiICh2YWwpLCAiciIgKGFkZHIpKTsKIH0KIAogI2RlZmluZSBfX3Jhd193cml0ZWwgX19yYXdfd3JpdGVsCiBzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfd3JpdGVsKHUzMiB2YWwsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQlhc20gdm9sYXRpbGUoInN0ciAldzAsIFslMV0iIDogOiAiciIgKHZhbCksICJyIiAoYWRkcikpOworCWFzbSB2b2xhdGlsZSgic3RyICV3MCwgWyUxXSIgOiA6ICJyWiIgKHZhbCksICJyIiAoYWRkcikpOwogfQogCiAjZGVmaW5lIF9fcmF3X3dyaXRlcSBfX3Jhd193cml0ZXEKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZXEodTY0IHZhbCwgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewotCWFzbSB2b2xhdGlsZSgic3RyICUwLCBbJTFdIiA6IDogInIiICh2YWwpLCAiciIgKGFkZHIpKTsKKwlhc20gdm9sYXRpbGUoInN0ciAleDAsIFslMV0iIDogOiAicloiICh2YWwpLCAiciIgKGFkZHIpKTsKIH0KIAogI2RlZmluZSBfX3Jhd19yZWFkYiBfX3Jhd19yZWFkYgpAQCAtMTg0LDE3ICsxODQsNiBAQAogI2RlZmluZSBpb3dyaXRlMzJiZSh2LHApCSh7IF9faW93bWIoKTsgX19yYXdfd3JpdGVsKChfX2ZvcmNlIF9fdTMyKWNwdV90b19iZTMyKHYpLCBwKTsgfSkKICNkZWZpbmUgaW93cml0ZTY0YmUodixwKQkoeyBfX2lvd21iKCk7IF9fcmF3X3dyaXRlcSgoX19mb3JjZSBfX3U2NCljcHVfdG9fYmU2NCh2KSwgcCk7IH0pCiAKLS8qCi0gKiBDb252ZXJ0IGEgcGh5c2ljYWwgcG9pbnRlciB0byBhIHZpcnR1YWwga2VybmVsIHBvaW50ZXIgZm9yIC9kZXYvbWVtCi0gKiBhY2Nlc3MKLSAqLwotI2RlZmluZSB4bGF0ZV9kZXZfbWVtX3B0cihwKQlfX3ZhKHApCi0KLS8qCi0gKiBDb252ZXJ0IGEgdmlydHVhbCBjYWNoZWQgcG9pbnRlciB0byBhbiB1bmNhY2hlZCBwb2ludGVyCi0gKi8KLSNkZWZpbmUgeGxhdGVfZGV2X2ttZW1fcHRyKHApCXAKLQogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2lvLmg+CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9hcm0uaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2FybS5oCmluZGV4IDRiNWM5NzcuLjJhMjc1MmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2FybS5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2FybS5oCkBAIC01MCw3ICs1MCw3IEBACiAjZGVmaW5lIEhDUl9CU1UJCSgzIDw8IDEwKQogI2RlZmluZSBIQ1JfQlNVX0lTCShVTCgxKSA8PCAxMCkKICNkZWZpbmUgSENSX0ZCCQkoVUwoMSkgPDwgOSkKLSNkZWZpbmUgSENSX1ZBCQkoVUwoMSkgPDwgOCkKKyNkZWZpbmUgSENSX1ZTRQkJKFVMKDEpIDw8IDgpCiAjZGVmaW5lIEhDUl9WSQkJKFVMKDEpIDw8IDcpCiAjZGVmaW5lIEhDUl9WRgkJKFVMKDEpIDw8IDYpCiAjZGVmaW5lIEhDUl9BTU8JCShVTCgxKSA8PCA1KQpAQCAtODAsNyArODAsNyBAQAogI2RlZmluZSBIQ1JfR1VFU1RfRkxBR1MgKEhDUl9UU0MgfCBIQ1JfVFNXIHwgSENSX1RXRSB8IEhDUl9UV0kgfCBIQ1JfVk0gfCBcCiAJCQkgSENSX1RWTSB8IEhDUl9CU1VfSVMgfCBIQ1JfRkIgfCBIQ1JfVEFDIHwgXAogCQkJIEhDUl9BTU8gfCBIQ1JfU1dJTyB8IEhDUl9USURDUCB8IEhDUl9SVykKLSNkZWZpbmUgSENSX1ZJUlRfRVhDUF9NQVNLIChIQ1JfVkEgfCBIQ1JfVkkgfCBIQ1JfVkYpCisjZGVmaW5lIEhDUl9WSVJUX0VYQ1BfTUFTSyAoSENSX1ZTRSB8IEhDUl9WSSB8IEhDUl9WRikKICNkZWZpbmUgSENSX0lOVF9PVkVSUklERSAgIChIQ1JfRk1PIHwgSENSX0lNTykKICNkZWZpbmUgSENSX0hPU1RfVkhFX0ZMQUdTIChIQ1JfUlcgfCBIQ1JfVEdFIHwgSENSX0UySCkKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fYXNtLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9hc20uaAppbmRleCA3NTYxZjYzLi4xOGY3NDY1IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9hc20uaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9hc20uaApAQCAtMjAsMTAgKzIwLDE1IEBACiAKICNpbmNsdWRlIDxhc20vdmlydC5oPgogCisjZGVmaW5lIEFSTV9FWElUX1dJVEhfU0VSUk9SX0JJVCAgMzEKKyNkZWZpbmUgQVJNX0VYQ0VQVElPTl9DT0RFKHgpCSAgKCh4KSAmIH4oMVUgPDwgQVJNX0VYSVRfV0lUSF9TRVJST1JfQklUKSkKKyNkZWZpbmUgQVJNX1NFUlJPUl9QRU5ESU5HKHgpCSAgISEoKHgpICYgKDFVIDw8IEFSTV9FWElUX1dJVEhfU0VSUk9SX0JJVCkpCisKICNkZWZpbmUgQVJNX0VYQ0VQVElPTl9JUlEJICAwCi0jZGVmaW5lIEFSTV9FWENFUFRJT05fVFJBUAkgIDEKKyNkZWZpbmUgQVJNX0VYQ0VQVElPTl9FTDFfU0VSUk9SICAxCisjZGVmaW5lIEFSTV9FWENFUFRJT05fVFJBUAkgIDIKIC8qIFRoZSBoeXAtc3R1YiB3aWxsIHJldHVybiB0aGlzIGZvciBhbnkga3ZtX2NhbGxfaHlwKCkgY2FsbCAqLwotI2RlZmluZSBBUk1fRVhDRVBUSU9OX0hZUF9HT05FCSAgMgorI2RlZmluZSBBUk1fRVhDRVBUSU9OX0hZUF9HT05FCSAgMwogCiAjZGVmaW5lIEtWTV9BUk02NF9ERUJVR19ESVJUWV9TSElGVAkwCiAjZGVmaW5lIEtWTV9BUk02NF9ERUJVR19ESVJUWQkJKDEgPDwgS1ZNX0FSTTY0X0RFQlVHX0RJUlRZX1NISUZUKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fZW11bGF0ZS5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fZW11bGF0ZS5oCmluZGV4IDRjZGVhZTMuLmZkOWQ1ZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9lbXVsYXRlLmgKQEAgLTM4LDYgKzM4LDcgQEAKIHZvaWQga3ZtX3NraXBfaW5zdHIzMihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGJvb2wgaXNfd2lkZV9pbnN0cik7CiAKIHZvaWQga3ZtX2luamVjdF91bmRlZmluZWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKK3ZvaWQga3ZtX2luamVjdF92YWJ0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiB2b2lkIGt2bV9pbmplY3RfZGFidChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgYWRkcik7CiB2b2lkIGt2bV9pbmplY3RfcGFidChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgYWRkcik7CiAKQEAgLTE0Nyw2ICsxNDgsMTYgQEAKIAlyZXR1cm4gdmNwdS0+YXJjaC5mYXVsdC5lc3JfZWwyOwogfQogCitzdGF0aWMgaW5saW5lIGludCBrdm1fdmNwdV9nZXRfY29uZGl0aW9uKGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl1MzIgZXNyID0ga3ZtX3ZjcHVfZ2V0X2hzcih2Y3B1KTsKKworCWlmIChlc3IgJiBFU1JfRUx4X0NWKQorCQlyZXR1cm4gKGVzciAmIEVTUl9FTHhfQ09ORF9NQVNLKSA+PiBFU1JfRUx4X0NPTkRfU0hJRlQ7CisKKwlyZXR1cm4gLTE7Cit9CisKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBrdm1fdmNwdV9nZXRfaGZhcihjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJcmV0dXJuIHZjcHUtPmFyY2guZmF1bHQuZmFyX2VsMjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2hvc3QuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2hvc3QuaAppbmRleCAzZWRhOTc1Li5iZDk0ZTY3IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCkBAIC0yOTAsMTUgKzI5MCwxNSBAQAogI2VuZGlmCiAKIHN0cnVjdCBrdm1fdm1fc3RhdCB7Ci0JdTMyIHJlbW90ZV90bGJfZmx1c2g7CisJdWxvbmcgcmVtb3RlX3RsYl9mbHVzaDsKIH07CiAKIHN0cnVjdCBrdm1fdmNwdV9zdGF0IHsKLQl1MzIgaGFsdF9zdWNjZXNzZnVsX3BvbGw7Ci0JdTMyIGhhbHRfYXR0ZW1wdGVkX3BvbGw7Ci0JdTMyIGhhbHRfcG9sbF9pbnZhbGlkOwotCXUzMiBoYWx0X3dha2V1cDsKLQl1MzIgaHZjX2V4aXRfc3RhdDsKKwl1NjQgaGFsdF9zdWNjZXNzZnVsX3BvbGw7CisJdTY0IGhhbHRfYXR0ZW1wdGVkX3BvbGw7CisJdTY0IGhhbHRfcG9sbF9pbnZhbGlkOworCXU2NCBoYWx0X3dha2V1cDsKKwl1NjQgaHZjX2V4aXRfc3RhdDsKIAl1NjQgd2ZlX2V4aXRfc3RhdDsKIAl1NjQgd2ZpX2V4aXRfc3RhdDsKIAl1NjQgbW1pb19leGl0X3VzZXI7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9oeXAuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2h5cC5oCmluZGV4IGNmZjUxMDUuLmIxOGU4NTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2h5cC5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2h5cC5oCkBAIC0xMjMsNiArMTIzLDcgQEAKIAogdm9pZCBfX3ZnaWNfdjJfc2F2ZV9zdGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogdm9pZCBfX3ZnaWNfdjJfcmVzdG9yZV9zdGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworaW50IF9fdmdpY192Ml9wZXJmb3JtX2NwdWlmX2FjY2VzcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCiB2b2lkIF9fdmdpY192M19zYXZlX3N0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiB2b2lkIF9fdmdpY192M19yZXN0b3JlX3N0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9tbXUuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX21tdS5oCmluZGV4IGI2YmI4MzQuLmE3OWI5NjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX21tdS5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX21tdS5oCkBAIC05OSwxNCArOTksMTAgQEAKIC5tYWNybyBrZXJuX2h5cF92YQlyZWcKIGFsdGVybmF0aXZlX2lmX25vdCBBUk02NF9IQVNfVklSVF9IT1NUX0VYVE4KIAlhbmQgICAgIFxyZWcsIFxyZWcsICNIWVBfUEFHRV9PRkZTRVRfSElHSF9NQVNLCi1hbHRlcm5hdGl2ZV9lbHNlCi0Jbm9wCi1hbHRlcm5hdGl2ZV9lbmRpZgotYWx0ZXJuYXRpdmVfaWZfbm90IEFSTTY0X0hZUF9PRkZTRVRfTE9XCi0Jbm9wCi1hbHRlcm5hdGl2ZV9lbHNlCithbHRlcm5hdGl2ZV9lbHNlX25vcF9lbmRpZgorYWx0ZXJuYXRpdmVfaWYgQVJNNjRfSFlQX09GRlNFVF9MT1cKIAlhbmQgICAgIFxyZWcsIFxyZWcsICNIWVBfUEFHRV9PRkZTRVRfTE9XX01BU0sKLWFsdGVybmF0aXZlX2VuZGlmCithbHRlcm5hdGl2ZV9lbHNlX25vcF9lbmRpZgogLmVuZG0KIAogI2Vsc2UKQEAgLTE2NiwxMiArMTYyLDYgQEAKICNkZWZpbmUJa3ZtX3NldF9wdGUocHRlcCwgcHRlKQkJc2V0X3B0ZShwdGVwLCBwdGUpCiAjZGVmaW5lCWt2bV9zZXRfcG1kKHBtZHAsIHBtZCkJCXNldF9wbWQocG1kcCwgcG1kKQogCi1zdGF0aWMgaW5saW5lIHZvaWQga3ZtX2NsZWFuX3BnZChwZ2RfdCAqcGdkKSB7fQotc3RhdGljIGlubGluZSB2b2lkIGt2bV9jbGVhbl9wbWQocG1kX3QgKnBtZCkge30KLXN0YXRpYyBpbmxpbmUgdm9pZCBrdm1fY2xlYW5fcG1kX2VudHJ5KHBtZF90ICpwbWQpIHt9Ci1zdGF0aWMgaW5saW5lIHZvaWQga3ZtX2NsZWFuX3B0ZShwdGVfdCAqcHRlKSB7fQotc3RhdGljIGlubGluZSB2b2lkIGt2bV9jbGVhbl9wdGVfZW50cnkocHRlX3QgKnB0ZSkge30KLQogc3RhdGljIGlubGluZSBwdGVfdCBrdm1fczJwdGVfbWt3cml0ZShwdGVfdCBwdGUpCiB7CiAJcHRlX3ZhbChwdGUpIHw9IFBURV9TMl9SRFdSOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9tZW1vcnkuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vbWVtb3J5LmgKaW5kZXggMzFiNzMyMi4uYmE2MmRmOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9tZW1vcnkuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL21lbW9yeS5oCkBAIC0yMTQsNyArMjE0LDcgQEAKIAogI2lmbmRlZiBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVAKICNkZWZpbmUgdmlydF90b19wYWdlKGthZGRyKQlwZm5fdG9fcGFnZShfX3BhKGthZGRyKSA+PiBQQUdFX1NISUZUKQotI2RlZmluZSB2aXJ0X2FkZHJfdmFsaWQoa2FkZHIpCXBmbl92YWxpZChfX3BhKGthZGRyKSA+PiBQQUdFX1NISUZUKQorI2RlZmluZSBfdmlydF9hZGRyX3ZhbGlkKGthZGRyKQlwZm5fdmFsaWQoX19wYShrYWRkcikgPj4gUEFHRV9TSElGVCkKICNlbHNlCiAjZGVmaW5lIF9fdmlydF90b19wZ29mZihrYWRkcikJKCgodTY0KShrYWRkcikgJiB+UEFHRV9PRkZTRVQpIC8gUEFHRV9TSVpFICogc2l6ZW9mKHN0cnVjdCBwYWdlKSkKICNkZWZpbmUgX19wYWdlX3RvX3ZvZmYoa2FkZHIpCSgoKHU2NCkocGFnZSkgJiB+Vk1FTU1BUF9TVEFSVCkgKiBQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IHBhZ2UpKQpAQCAtMjIyLDExICsyMjIsMTUgQEAKICNkZWZpbmUgcGFnZV90b192aXJ0KHBhZ2UpCSgodm9pZCAqKSgoX19wYWdlX3RvX3ZvZmYocGFnZSkpIHwgUEFHRV9PRkZTRVQpKQogI2RlZmluZSB2aXJ0X3RvX3BhZ2UodmFkZHIpCSgoc3RydWN0IHBhZ2UgKikoKF9fdmlydF90b19wZ29mZih2YWRkcikpIHwgVk1FTU1BUF9TVEFSVCkpCiAKLSNkZWZpbmUgdmlydF9hZGRyX3ZhbGlkKGthZGRyKQlwZm5fdmFsaWQoKCgodTY0KShrYWRkcikgJiB+UEFHRV9PRkZTRVQpIFwKKyNkZWZpbmUgX3ZpcnRfYWRkcl92YWxpZChrYWRkcikJcGZuX3ZhbGlkKCgoKHU2NCkoa2FkZHIpICYgflBBR0VfT0ZGU0VUKSBcCiAJCQkJCSAgICsgUEhZU19PRkZTRVQpID4+IFBBR0VfU0hJRlQpCiAjZW5kaWYKICNlbmRpZgogCisjZGVmaW5lIF92aXJ0X2FkZHJfaXNfbGluZWFyKGthZGRyKQkoKCh1NjQpKGthZGRyKSkgPj0gUEFHRV9PRkZTRVQpCisjZGVmaW5lIHZpcnRfYWRkcl92YWxpZChrYWRkcikJCShfdmlydF9hZGRyX2lzX2xpbmVhcihrYWRkcikgJiYgXAorCQkJCQkgX3ZpcnRfYWRkcl92YWxpZChrYWRkcikpCisKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tZW1vcnlfbW9kZWwuaD4KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKaW5kZXggYjE4OTJhMC4uYTUwMTg1MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaApAQCAtMjcsMjIgKzI3LDE3IEBACiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbW1faG9va3MuaD4KICNpbmNsdWRlIDxhc20vY3B1dHlwZS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3N5c3JlZy5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogCi0jaWZkZWYgQ09ORklHX1BJRF9JTl9DT05URVhUSURSCiBzdGF0aWMgaW5saW5lIHZvaWQgY29udGV4dGlkcl90aHJlYWRfc3dpdGNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKIHsKLQlhc20oCi0JIgltc3IJY29udGV4dGlkcl9lbDEsICUwXG4iCi0JIglpc2IiCi0JOgotCTogInIiICh0YXNrX3BpZF9ucihuZXh0KSkpOworCWlmICghSVNfRU5BQkxFRChDT05GSUdfUElEX0lOX0NPTlRFWFRJRFIpKQorCQlyZXR1cm47CisKKwl3cml0ZV9zeXNyZWcodGFza19waWRfbnIobmV4dCksIGNvbnRleHRpZHJfZWwxKTsKKwlpc2IoKTsKIH0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgY29udGV4dGlkcl90aHJlYWRfc3dpdGNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKLXsKLX0KLSNlbmRpZgogCiAvKgogICogU2V0IFRUQlIwIHRvIGVtcHR5X3plcm9fcGFnZS4gTm8gdHJhbnNsYXRpb25zIHdpbGwgYmUgcG9zc2libGUgdmlhIFRUQlIwLgpAQCAtNTEsMTEgKzQ2LDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIHR0YnIgPSB2aXJ0X3RvX3BoeXMoZW1wdHlfemVyb19wYWdlKTsKIAotCWFzbSgKLQkiCW1zcgl0dGJyMF9lbDEsICUwCQkJLy8gc2V0IFRUQlIwXG4iCi0JIglpc2IiCi0JOgotCTogInIiICh0dGJyKSk7CisJd3JpdGVfc3lzcmVnKHR0YnIsIHR0YnIwX2VsMSk7CisJaXNiKCk7CiB9CiAKIC8qCkBAIC04MSwxMyArNzMsMTEgQEAKIAlpZiAoIV9fY3B1X3VzZXNfZXh0ZW5kZWRfaWRtYXAoKSkKIAkJcmV0dXJuOwogCi0JYXNtIHZvbGF0aWxlICgKLQkiCW1ycwklMCwgdGNyX2VsMQk7IgotCSIJYmZpCSUwLCAlMSwgJTIsICUzCTsiCi0JIgltc3IJdGNyX2VsMSwgJTAJOyIKLQkiCWlzYiIKLQk6ICI9JnIiICh0Y3IpCi0JOiAiciIodDBzeiksICJJIihUQ1JfVDBTWl9PRkZTRVQpLCAiSSIoVENSX1R4U1pfV0lEVEgpKTsKKwl0Y3IgPSByZWFkX3N5c3JlZyh0Y3JfZWwxKTsKKwl0Y3IgJj0gflRDUl9UMFNaX01BU0s7CisJdGNyIHw9IHQwc3ogPDwgVENSX1QwU1pfT0ZGU0VUOworCXdyaXRlX3N5c3JlZyh0Y3IsIHRjcl9lbDEpOworCWlzYigpOwogfQogCiAjZGVmaW5lIGNwdV9zZXRfZGVmYXVsdF90Y3JfdDBzeigpCV9fY3B1X3NldF90Y3JfdDBzeihUQ1JfVDBTWihWQV9CSVRTKSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGVyY3B1LmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BlcmNwdS5oCmluZGV4IDBhNDU2YmUuLjJmZWUyZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGVyY3B1LmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZXJjcHUuaApAQCAtMTk5LDE5ICsxOTksMTkgQEAKICNkZWZpbmUgX3BlcmNwdV9yZWFkKHBjcCkJCQkJCQlcCiAoewkJCQkJCQkJCVwKIAl0eXBlb2YocGNwKSBfX3JldHZhbDsJCQkJCQlcCi0JcHJlZW1wdF9kaXNhYmxlKCk7CQkJCQkJXAorCXByZWVtcHRfZGlzYWJsZV9ub3RyYWNlKCk7CQkJCQlcCiAJX19yZXR2YWwgPSAodHlwZW9mKHBjcCkpX19wZXJjcHVfcmVhZChyYXdfY3B1X3B0cigmKHBjcCkpLCAJXAogCQkJCQkgICAgICBzaXplb2YocGNwKSk7CQlcCi0JcHJlZW1wdF9lbmFibGUoKTsJCQkJCQlcCisJcHJlZW1wdF9lbmFibGVfbm90cmFjZSgpOwkJCQkJXAogCV9fcmV0dmFsOwkJCQkJCQlcCiB9KQogCiAjZGVmaW5lIF9wZXJjcHVfd3JpdGUocGNwLCB2YWwpCQkJCQkJXAogZG8gewkJCQkJCQkJCVwKLQlwcmVlbXB0X2Rpc2FibGUoKTsJCQkJCQlcCisJcHJlZW1wdF9kaXNhYmxlX25vdHJhY2UoKTsJCQkJCVwKIAlfX3BlcmNwdV93cml0ZShyYXdfY3B1X3B0cigmKHBjcCkpLCAodW5zaWduZWQgbG9uZykodmFsKSwgCVwKIAkJCQlzaXplb2YocGNwKSk7CQkJCVwKLQlwcmVlbXB0X2VuYWJsZSgpOwkJCQkJCVwKKwlwcmVlbXB0X2VuYWJsZV9ub3RyYWNlKCk7CQkJCQlcCiB9IHdoaWxlKDApCQkJCQkJCQlcCiAKICNkZWZpbmUgX3BjcF9wcm90ZWN0KG9wZXJhdGlvbiwgcGNwLCB2YWwpCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLWh3ZGVmLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BndGFibGUtaHdkZWYuaAppbmRleCBjM2FlMjM5Li5lYjBjMmJkIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BndGFibGUtaHdkZWYuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BndGFibGUtaHdkZWYuaApAQCAtMjA4LDYgKzIwOCw3IEBACiAjZGVmaW5lIFRDUl9UMVNaKHgpCQkoKFVMKDY0KSAtICh4KSkgPDwgVENSX1QxU1pfT0ZGU0VUKQogI2RlZmluZSBUQ1JfVHhTWih4KQkJKFRDUl9UMFNaKHgpIHwgVENSX1QxU1ooeCkpCiAjZGVmaW5lIFRDUl9UeFNaX1dJRFRICQk2CisjZGVmaW5lIFRDUl9UMFNaX01BU0sJCSgoKFVMKDEpIDw8IFRDUl9UeFNaX1dJRFRIKSAtIDEpIDw8IFRDUl9UMFNaX09GRlNFVCkKIAogI2RlZmluZSBUQ1JfSVJHTjBfU0hJRlQJCTgKICNkZWZpbmUgVENSX0lSR04wX01BU0sJCShVTCgzKSA8PCBUQ1JfSVJHTjBfU0hJRlQpCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BndGFibGUtcHJvdC5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLXByb3QuaAppbmRleCAzOWY1MjUyLi4yMTQyYzc3IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BndGFibGUtcHJvdC5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGd0YWJsZS1wcm90LmgKQEAgLTcwLDEyICs3MCwxMyBAQAogI2RlZmluZSBQQUdFX0NPUFlfRVhFQwkJX19wZ3Byb3QoX1BBR0VfREVGQVVMVCB8IFBURV9VU0VSIHwgUFRFX05HIHwgUFRFX1BYTikKICNkZWZpbmUgUEFHRV9SRUFET05MWQkJX19wZ3Byb3QoX1BBR0VfREVGQVVMVCB8IFBURV9VU0VSIHwgUFRFX05HIHwgUFRFX1BYTiB8IFBURV9VWE4pCiAjZGVmaW5lIFBBR0VfUkVBRE9OTFlfRVhFQwlfX3BncHJvdChfUEFHRV9ERUZBVUxUIHwgUFRFX1VTRVIgfCBQVEVfTkcgfCBQVEVfUFhOKQorI2RlZmluZSBQQUdFX0VYRUNPTkxZCQlfX3BncHJvdChfUEFHRV9ERUZBVUxUIHwgUFRFX05HIHwgUFRFX1BYTikKIAogI2RlZmluZSBfX1AwMDAgIFBBR0VfTk9ORQogI2RlZmluZSBfX1AwMDEgIFBBR0VfUkVBRE9OTFkKICNkZWZpbmUgX19QMDEwICBQQUdFX0NPUFkKICNkZWZpbmUgX19QMDExICBQQUdFX0NPUFkKLSNkZWZpbmUgX19QMTAwICBQQUdFX1JFQURPTkxZX0VYRUMKKyNkZWZpbmUgX19QMTAwICBQQUdFX0VYRUNPTkxZCiAjZGVmaW5lIF9fUDEwMSAgUEFHRV9SRUFET05MWV9FWEVDCiAjZGVmaW5lIF9fUDExMCAgUEFHRV9DT1BZX0VYRUMKICNkZWZpbmUgX19QMTExICBQQUdFX0NPUFlfRVhFQwpAQCAtODQsNyArODUsNyBAQAogI2RlZmluZSBfX1MwMDEgIFBBR0VfUkVBRE9OTFkKICNkZWZpbmUgX19TMDEwICBQQUdFX1NIQVJFRAogI2RlZmluZSBfX1MwMTEgIFBBR0VfU0hBUkVECi0jZGVmaW5lIF9fUzEwMCAgUEFHRV9SRUFET05MWV9FWEVDCisjZGVmaW5lIF9fUzEwMCAgUEFHRV9FWEVDT05MWQogI2RlZmluZSBfX1MxMDEgIFBBR0VfUkVBRE9OTFlfRVhFQwogI2RlZmluZSBfX1MxMTAgIFBBR0VfU0hBUkVEX0VYRUMKICNkZWZpbmUgX19TMTExICBQQUdFX1NIQVJFRF9FWEVDCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGd0YWJsZS5oCmluZGV4IGUyMGJkNDMuLmZmYmI5YTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGd0YWJsZS5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGd0YWJsZS5oCkBAIC03Myw3ICs3Myw3IEBACiAjZGVmaW5lIHB0ZV93cml0ZShwdGUpCQkoISEocHRlX3ZhbChwdGUpICYgUFRFX1dSSVRFKSkKICNkZWZpbmUgcHRlX2V4ZWMocHRlKQkJKCEocHRlX3ZhbChwdGUpICYgUFRFX1VYTikpCiAjZGVmaW5lIHB0ZV9jb250KHB0ZSkJCSghIShwdGVfdmFsKHB0ZSkgJiBQVEVfQ09OVCkpCi0jZGVmaW5lIHB0ZV91c2VyKHB0ZSkJCSghIShwdGVfdmFsKHB0ZSkgJiBQVEVfVVNFUikpCisjZGVmaW5lIHB0ZV9uZyhwdGUpCQkoISEocHRlX3ZhbChwdGUpICYgUFRFX05HKSkKIAogI2lmZGVmIENPTkZJR19BUk02NF9IV19BRkRCTQogI2RlZmluZSBwdGVfaHdfZGlydHkocHRlKQkocHRlX3dyaXRlKHB0ZSkgJiYgIShwdGVfdmFsKHB0ZSkgJiBQVEVfUkRPTkxZKSkKQEAgLTg0LDggKzg0LDggQEAKICNkZWZpbmUgcHRlX2RpcnR5KHB0ZSkJCShwdGVfc3dfZGlydHkocHRlKSB8fCBwdGVfaHdfZGlydHkocHRlKSkKIAogI2RlZmluZSBwdGVfdmFsaWQocHRlKQkJKCEhKHB0ZV92YWwocHRlKSAmIFBURV9WQUxJRCkpCi0jZGVmaW5lIHB0ZV92YWxpZF9ub3RfdXNlcihwdGUpIFwKLQkoKHB0ZV92YWwocHRlKSAmIChQVEVfVkFMSUQgfCBQVEVfVVNFUikpID09IFBURV9WQUxJRCkKKyNkZWZpbmUgcHRlX3ZhbGlkX2dsb2JhbChwdGUpIFwKKwkoKHB0ZV92YWwocHRlKSAmIChQVEVfVkFMSUQgfCBQVEVfTkcpKSA9PSBQVEVfVkFMSUQpCiAjZGVmaW5lIHB0ZV92YWxpZF95b3VuZyhwdGUpIFwKIAkoKHB0ZV92YWwocHRlKSAmIChQVEVfVkFMSUQgfCBQVEVfQUYpKSA9PSAoUFRFX1ZBTElEIHwgUFRFX0FGKSkKIApAQCAtMTU1LDYgKzE1NSwxNiBAQAogCXJldHVybiBjbGVhcl9wdGVfYml0KHB0ZSwgX19wZ3Byb3QoUFRFX0NPTlQpKTsKIH0KIAorc3RhdGljIGlubGluZSBwdGVfdCBwdGVfY2xlYXJfcmRvbmx5KHB0ZV90IHB0ZSkKK3sKKwlyZXR1cm4gY2xlYXJfcHRlX2JpdChwdGUsIF9fcGdwcm90KFBURV9SRE9OTFkpKTsKK30KKworc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtwcmVzZW50KHB0ZV90IHB0ZSkKK3sKKwlyZXR1cm4gc2V0X3B0ZV9iaXQocHRlLCBfX3BncHJvdChQVEVfVkFMSUQpKTsKK30KKwogc3RhdGljIGlubGluZSBwbWRfdCBwbWRfbWtjb250KHBtZF90IHBtZCkKIHsKIAlyZXR1cm4gX19wbWQocG1kX3ZhbChwbWQpIHwgUE1EX1NFQ1RfQ09OVCk7CkBAIC0xNjgsNyArMTc4LDcgQEAKIAkgKiBPbmx5IGlmIHRoZSBuZXcgcHRlIGlzIHZhbGlkIGFuZCBrZXJuZWwsIG90aGVyd2lzZSBUTEIgbWFpbnRlbmFuY2UKIAkgKiBvciB1cGRhdGVfbW11X2NhY2hlKCkgaGF2ZSB0aGUgbmVjZXNzYXJ5IGJhcnJpZXJzLgogCSAqLwotCWlmIChwdGVfdmFsaWRfbm90X3VzZXIocHRlKSkgeworCWlmIChwdGVfdmFsaWRfZ2xvYmFsKHB0ZSkpIHsKIAkJZHNiKGlzaHN0KTsKIAkJaXNiKCk7CiAJfQpAQCAtMjAyLDcgKzIxMiw3IEBACiAJCQlwdGVfdmFsKHB0ZSkgJj0gflBURV9SRE9OTFk7CiAJCWVsc2UKIAkJCXB0ZV92YWwocHRlKSB8PSBQVEVfUkRPTkxZOwotCQlpZiAocHRlX3VzZXIocHRlKSAmJiBwdGVfZXhlYyhwdGUpICYmICFwdGVfc3BlY2lhbChwdGUpKQorCQlpZiAocHRlX25nKHB0ZSkgJiYgcHRlX2V4ZWMocHRlKSAmJiAhcHRlX3NwZWNpYWwocHRlKSkKIAkJCV9fc3luY19pY2FjaGVfZGNhY2hlKHB0ZSwgYWRkcik7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCBhY2UwYTk2Li5kZjJlNTNkIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKQEAgLTM3LDcgKzM3LDYgQEAKICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAKLSNpZmRlZiBfX0tFUk5FTF9fCiAjZGVmaW5lIFNUQUNLX1RPUF9NQVgJCVRBU0tfU0laRV82NAogI2lmZGVmIENPTkZJR19DT01QQVQKICNkZWZpbmUgQUFSQ0gzMl9WRUNUT1JTX0JBU0UJMHhmZmZmMDAwMApAQCAtNDksNyArNDgsNiBAQAogCiBleHRlcm4gcGh5c19hZGRyX3QgYXJtNjRfZG1hX3BoeXNfbGltaXQ7CiAjZGVmaW5lIEFSQ0hfTE9XX0FERFJFU1NfTElNSVQJKGFybTY0X2RtYV9waHlzX2xpbWl0IC0gMSkKLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKIHN0cnVjdCBkZWJ1Z19pbmZvIHsKIAkvKiBIYXZlIHdlIHN1c3BlbmRlZCBzdGVwcGluZyBieSBhIGRlYnVnZ2VyPyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9zZWN0aW9ucy5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9zZWN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlN2U3MDYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3NlY3Rpb25zLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBUk0gTGltaXRlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKyNpZm5kZWYgX19BU01fU0VDVElPTlNfSAorI2RlZmluZSBfX0FTTV9TRUNUSU9OU19ICisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zZWN0aW9ucy5oPgorCitleHRlcm4gY2hhciBfX2FsdF9pbnN0cnVjdGlvbnNbXSwgX19hbHRfaW5zdHJ1Y3Rpb25zX2VuZFtdOworZXh0ZXJuIGNoYXIgX19leGNlcHRpb25fdGV4dF9zdGFydFtdLCBfX2V4Y2VwdGlvbl90ZXh0X2VuZFtdOworZXh0ZXJuIGNoYXIgX19oaWJlcm5hdGVfZXhpdF90ZXh0X3N0YXJ0W10sIF9faGliZXJuYXRlX2V4aXRfdGV4dF9lbmRbXTsKK2V4dGVybiBjaGFyIF9faHlwX2lkbWFwX3RleHRfc3RhcnRbXSwgX19oeXBfaWRtYXBfdGV4dF9lbmRbXTsKK2V4dGVybiBjaGFyIF9faHlwX3RleHRfc3RhcnRbXSwgX19oeXBfdGV4dF9lbmRbXTsKK2V4dGVybiBjaGFyIF9faWRtYXBfdGV4dF9zdGFydFtdLCBfX2lkbWFwX3RleHRfZW5kW107CitleHRlcm4gY2hhciBfX2lycWVudHJ5X3RleHRfc3RhcnRbXSwgX19pcnFlbnRyeV90ZXh0X2VuZFtdOworZXh0ZXJuIGNoYXIgX19tbXVvZmZfZGF0YV9zdGFydFtdLCBfX21tdW9mZl9kYXRhX2VuZFtdOworCisjZW5kaWYgLyogX19BU01fU0VDVElPTlNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9zcGlubG9jay5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9zcGlubG9jay5oCmluZGV4IGU4NzVhNWEuLmNhZTMzMWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vc3BpbmxvY2suaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKQEAgLTY2LDggKzY2LDcgQEAKIAlBUk02NF9MU0VfQVRPTUlDX0lOU04oCiAJLyogTEwvU0MgKi8KICIJc3R4cgkldzEsICV3MCwgJTJcbiIKLSIJbm9wXG4iCi0iCW5vcFxuIiwKKwlfX25vcHMoMiksCiAJLyogTFNFIGF0b21pY3MgKi8KICIJbW92CSV3MSwgJXcwXG4iCiAiCWNhcwkldzAsICV3MCwgJTJcbiIKQEAgLTk5LDkgKzk4LDcgQEAKIAkvKiBMU0UgYXRvbWljcyAqLwogIgltb3YJJXcyLCAldzVcbiIKICIJbGRhZGRhCSV3MiwgJXcwLCAlM1xuIgotIglub3BcbiIKLSIJbm9wXG4iCi0iCW5vcFxuIgorCV9fbm9wcygzKQogCSkKIAogCS8qIERpZCB3ZSBnZXQgdGhlIGxvY2s/ICovCkBAIC0xNjUsOCArMTYyLDggQEAKIAkiCXN0bHJoCSV3MSwgJTAiLAogCS8qIExTRSBhdG9taWNzICovCiAJIgltb3YJJXcxLCAjMVxuIgotCSIJbm9wXG4iCi0JIglzdGFkZGxoCSV3MSwgJTAiKQorCSIJc3RhZGRsaAkldzEsICUwXG4iCisJX19ub3BzKDEpKQogCTogIj1RIiAobG9jay0+b3duZXIpLCAiPSZyIiAodG1wKQogCToKIAk6ICJtZW1vcnkiKTsKQEAgLTIxMiw3ICsyMDksNyBAQAogCSIJY2JuegkldzAsIDFiXG4iCiAJIglzdHhyCSV3MCwgJXcyLCAlMVxuIgogCSIJY2JuegkldzAsIDJiXG4iCi0JIglub3AiLAorCV9fbm9wcygxKSwKIAkvKiBMU0UgYXRvbWljcyAqLwogCSIxOgltb3YJJXcwLCB3enJcbiIKIAkiMjoJY2FzYQkldzAsICV3MiwgJTFcbiIKQEAgLTI0MSw4ICsyMzgsNyBAQAogCS8qIExTRSBhdG9taWNzICovCiAJIgltb3YJJXcwLCB3enJcbiIKIAkiCWNhc2EJJXcwLCAldzIsICUxXG4iCi0JIglub3BcbiIKLQkiCW5vcCIpCisJX19ub3BzKDIpKQogCTogIj0mciIgKHRtcCksICIrUSIgKHJ3LT5sb2NrKQogCTogInIiICgweDgwMDAwMDAwKQogCTogIm1lbW9yeSIpOwpAQCAtMjkwLDggKzI4Niw4IEBACiAJIglhZGQJJXcwLCAldzAsICMxXG4iCiAJIgl0Ym56CSV3MCwgIzMxLCAxYlxuIgogCSIJc3R4cgkldzEsICV3MCwgJTJcbiIKLQkiCW5vcFxuIgotCSIJY2JuegkldzEsIDJiIiwKKwkiCWNibnoJJXcxLCAyYlxuIgorCV9fbm9wcygxKSwKIAkvKiBMU0UgYXRvbWljcyAqLwogCSIxOgl3ZmVcbiIKIAkiMjoJbGR4cgkldzAsICUyXG4iCkBAIC0zMTcsOSArMzEzLDggQEAKIAkiCWNibnoJJXcxLCAxYiIsCiAJLyogTFNFIGF0b21pY3MgKi8KIAkiCW1vdm4JJXcwLCAjMFxuIgotCSIJbm9wXG4iCi0JIglub3BcbiIKLQkiCXN0YWRkbAkldzAsICUyIikKKwkiCXN0YWRkbAkldzAsICUyXG4iCisJX19ub3BzKDIpKQogCTogIj0mciIgKHRtcCksICI9JnIiICh0bXAyKSwgIitRIiAocnctPmxvY2spCiAJOgogCTogIm1lbW9yeSIpOwpAQCAtMzQ0LDcgKzMzOSw3IEBACiAJIgl0Ym56CSV3MSwgIzMxLCAxZlxuIgogCSIJY2FzYQkldzAsICV3MSwgJTJcbiIKIAkiCXNiYwkldzEsICV3MSwgJXcwXG4iCi0JIglub3BcbiIKKwlfX25vcHMoMSkKIAkiMToiKQogCTogIj0mciIgKHRtcCksICI9JnIiICh0bXAyKSwgIitRIiAocnctPmxvY2spCiAJOgpAQCAtMzYzLDQgKzM1OCwxNCBAQAogI2RlZmluZSBhcmNoX3JlYWRfcmVsYXgobG9jaykJY3B1X3JlbGF4KCkKICNkZWZpbmUgYXJjaF93cml0ZV9yZWxheChsb2NrKQljcHVfcmVsYXgoKQogCisvKgorICogQWNjZXNzZXMgYXBwZWFyaW5nIGluIHByb2dyYW0gb3JkZXIgYmVmb3JlIGEgc3Bpbl9sb2NrKCkgb3BlcmF0aW9uCisgKiBjYW4gYmUgcmVvcmRlcmVkIHdpdGggYWNjZXNzZXMgaW5zaWRlIHRoZSBjcml0aWNhbCBzZWN0aW9uLCBieSB2aXJ0dWUKKyAqIG9mIGFyY2hfc3Bpbl9sb2NrIGJlaW5nIGNvbnN0cnVjdGVkIHVzaW5nIGFjcXVpcmUgc2VtYW50aWNzLgorICoKKyAqIEluIGNhc2VzIHdoZXJlIHRoaXMgaXMgcHJvYmxlbWF0aWMgKGUuZy4gdHJ5X3RvX3dha2VfdXApLCBhbgorICogc21wX21iX19iZWZvcmVfc3BpbmxvY2soKSBjYW4gcmVzdG9yZSB0aGUgcmVxdWlyZWQgb3JkZXJpbmcuCisgKi8KKyNkZWZpbmUgc21wX21iX19iZWZvcmVfc3BpbmxvY2soKQlzbXBfbWIoKQorCiAjZW5kaWYgLyogX19BU01fU1BJTkxPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9zdXNwZW5kLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3N1c3BlbmQuaAppbmRleCAwMjRkNjIzLi5iOGEzMTNmIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3N1c3BlbmQuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3N1c3BlbmQuaApAQCAtNDcsNCArNDcsNyBAQAogaW50IGFyY2hfaGliZXJuYXRpb25faGVhZGVyX3NhdmUodm9pZCAqYWRkciwgdW5zaWduZWQgaW50IG1heF9zaXplKTsKIGludCBhcmNoX2hpYmVybmF0aW9uX2hlYWRlcl9yZXN0b3JlKHZvaWQgKmFkZHIpOwogCisvKiBVc2VkIHRvIHJlc3VtZSBvbiB0aGUgQ1BVIHdlIGhpYmVybmF0ZWQgb24gKi8KK2ludCBoaWJlcm5hdGVfcmVzdW1lX25vbmJvb3RfY3B1X2Rpc2FibGUodm9pZCk7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9zeXNyZWcuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vc3lzcmVnLmgKaW5kZXggY2MwNjc5NC4uZThkNDZlOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9zeXNyZWcuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3N5c3JlZy5oCkBAIC0xMDAsNiArMTAwLDcgQEAKIC8qIFNDVExSX0VMMSBzcGVjaWZpYyBmbGFncy4gKi8KICNkZWZpbmUgU0NUTFJfRUwxX1VDSQkJKDEgPDwgMjYpCiAjZGVmaW5lIFNDVExSX0VMMV9TUEFOCQkoMSA8PCAyMykKKyNkZWZpbmUgU0NUTFJfRUwxX1VDVAkJKDEgPDwgMTUpCiAjZGVmaW5lIFNDVExSX0VMMV9TRUQJCSgxIDw8IDgpCiAjZGVmaW5lIFNDVExSX0VMMV9DUDE1QkVOCSgxIDw8IDUpCiAKQEAgLTI1MywxNiArMjU0LDYgQEAKICIJLmVuZG1cbiIKICk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjb25maWdfc2N0bHJfZWwxKHUzMiBjbGVhciwgdTMyIHNldCkKLXsKLQl1MzIgdmFsOwotCi0JYXNtIHZvbGF0aWxlKCJtcnMgJTAsIHNjdGxyX2VsMSIgOiAiPXIiICh2YWwpKTsKLQl2YWwgJj0gfmNsZWFyOwotCXZhbCB8PSBzZXQ7Ci0JYXNtIHZvbGF0aWxlKCJtc3Igc2N0bHJfZWwxLCAlMCIgOiA6ICJyIiAodmFsKSk7Ci19Ci0KIC8qCiAgKiBVbmxpa2UgcmVhZF9jcHVpZCwgY2FsbHMgdG8gcmVhZF9zeXNyZWcgYXJlIG5ldmVyIGV4cGVjdGVkIHRvIGJlCiAgKiBvcHRpbWl6ZWQgYXdheSBvciByZXBsYWNlZCB3aXRoIHN5bnRoZXRpYyB2YWx1ZXMuCkBAIC0yNzMsMTIgKzI2NCw0MSBAQAogCV9fdmFsOwkJCQkJCQlcCiB9KQogCisvKgorICogVGhlICJaIiBjb25zdHJhaW50IG5vcm1hbGx5IG1lYW5zIGEgemVybyBpbW1lZGlhdGUsIGJ1dCB3aGVuIGNvbWJpbmVkIHdpdGgKKyAqIHRoZSAiJXgwIiB0ZW1wbGF0ZSBtZWFucyBYWlIuCisgKi8KICNkZWZpbmUgd3JpdGVfc3lzcmVnKHYsIHIpIGRvIHsJCQkJCVwKIAl1NjQgX192YWwgPSAodTY0KXY7CQkJCQlcCi0JYXNtIHZvbGF0aWxlKCJtc3IgIiBfX3N0cmluZ2lmeShyKSAiLCAlMCIJCVwKLQkJICAgICA6IDogInIiIChfX3ZhbCkpOwkJCQlcCisJYXNtIHZvbGF0aWxlKCJtc3IgIiBfX3N0cmluZ2lmeShyKSAiLCAleDAiCQlcCisJCSAgICAgOiA6ICJyWiIgKF9fdmFsKSk7CQkJCVwKIH0gd2hpbGUgKDApCiAKKy8qCisgKiBGb3IgcmVnaXN0ZXJzIHdpdGhvdXQgYXJjaGl0ZWN0dXJhbCBuYW1lcywgb3Igc2ltcGx5IHVuc3VwcG9ydGVkIGJ5CisgKiBHQVMuCisgKi8KKyNkZWZpbmUgcmVhZF9zeXNyZWdfcyhyKSAoewkJCQkJCVwKKwl1NjQgX192YWw7CQkJCQkJCVwKKwlhc20gdm9sYXRpbGUoIm1yc19zICUwLCAiIF9fc3RyaW5naWZ5KHIpIDogIj1yIiAoX192YWwpKTsJXAorCV9fdmFsOwkJCQkJCQkJXAorfSkKKworI2RlZmluZSB3cml0ZV9zeXNyZWdfcyh2LCByKSBkbyB7CQkJCQlcCisJdTY0IF9fdmFsID0gKHU2NCl2OwkJCQkJCVwKKwlhc20gdm9sYXRpbGUoIm1zcl9zICIgX19zdHJpbmdpZnkocikgIiwgJTAiIDogOiAicloiIChfX3ZhbCkpOwlcCit9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIHZvaWQgY29uZmlnX3NjdGxyX2VsMSh1MzIgY2xlYXIsIHUzMiBzZXQpCit7CisJdTMyIHZhbDsKKworCXZhbCA9IHJlYWRfc3lzcmVnKHNjdGxyX2VsMSk7CisJdmFsICY9IH5jbGVhcjsKKwl2YWwgfD0gc2V0OworCXdyaXRlX3N5c3JlZyh2YWwsIHNjdGxyX2VsMSk7Cit9CisKICNlbmRpZgogCiAjZW5kaWYJLyogX19BU01fU1lTUkVHX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vc3lzdGVtX21pc2MuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vc3lzdGVtX21pc2MuaAppbmRleCA1N2YxMTBiLi5iYzgxMjQzIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3N5c3RlbV9taXNjLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9zeXN0ZW1fbWlzYy5oCkBAIC01NiwxMiArNTYsNiBAQAogCV9fc2hvd19yYXRlbGltaXRlZDsJCQkJCQlcCiB9KQogCi0jZGVmaW5lIFVEQkdfVU5ERUZJTkVECSgxIDw8IDApCi0jZGVmaW5lIFVEQkdfU1lTQ0FMTAkoMSA8PCAxKQotI2RlZmluZSBVREJHX0JBREFCT1JUCSgxIDw8IDIpCi0jZGVmaW5lIFVEQkdfU0VHVgkoMSA8PCAzKQotI2RlZmluZSBVREJHX0JVUwkoMSA8PCA0KQotCiAjZW5kaWYJLyogX19BU1NFTUJMWV9fICovCiAKICNlbmRpZgkvKiBfX0FTTV9TWVNURU1fTUlTQ19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggYWJkNjRiZC4uZTllYTVhNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtNzUsNiArNzUsOSBAQAogCiAvKgogICogc3RydWN0IHRocmVhZF9pbmZvIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSB2aWEgc3BfZWwwLgorICoKKyAqIFdlIGRvbid0IHVzZSByZWFkX3N5c3JlZygpIGFzIHdlIHdhbnQgdGhlIGNvbXBpbGVyIHRvIGNhY2hlIHRoZSB2YWx1ZSB3aGVyZQorICogcG9zc2libGUuCiAgKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRocmVhZF9pbmZvICpjdXJyZW50X3RocmVhZF9pbmZvKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3RsYmZsdXNoLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKaW5kZXggYjQ2MGFlMi4uZGVhYjUyMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS90bGJmbHVzaC5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vdGxiZmx1c2guaApAQCAtMjUsNiArMjUsMjQgQEAKICNpbmNsdWRlIDxhc20vY3B1dHlwZS5oPgogCiAvKgorICogUmF3IFRMQkkgb3BlcmF0aW9ucy4KKyAqCisgKiBXaGVyZSBuZWNlc3NhcnksIHVzZSB0aGUgX190bGJpKCkgbWFjcm8gdG8gYXZvaWQgYXNtKCkKKyAqIGJvaWxlcnBsYXRlLiBEcml2ZXJzIGFuZCBtb3N0IGtlcm5lbCBjb2RlIHNob3VsZCB1c2UgdGhlIFRMQgorICogbWFuYWdlbWVudCByb3V0aW5lcyBpbiBwcmVmZXJlbmNlIHRvIHRoZSBtYWNybyBiZWxvdy4KKyAqCisgKiBUaGUgbWFjcm8gY2FuIGJlIHVzZWQgYXMgX190bGJpKG9wKSBvciBfX3RsYmkob3AsIGFyZyksIGRlcGVuZGluZworICogb24gd2hldGhlciBhIHBhcnRpY3VsYXIgVExCSSBvcGVyYXRpb24gdGFrZXMgYW4gYXJndW1lbnQgb3IKKyAqIG5vdC4gVGhlIG1hY3JvcyBoYW5kbGVzIGludm9raW5nIHRoZSBhc20gd2l0aCBvciB3aXRob3V0IHRoZQorICogcmVnaXN0ZXIgYXJndW1lbnQgYXMgYXBwcm9wcmlhdGUuCisgKi8KKyNkZWZpbmUgX19UTEJJXzAob3AsIGFyZykJCWFzbSAoInRsYmkgIiAjb3ApCisjZGVmaW5lIF9fVExCSV8xKG9wLCBhcmcpCQlhc20gKCJ0bGJpICIgI29wICIsICUwIiA6IDogInIiIChhcmcpKQorI2RlZmluZSBfX1RMQklfTihvcCwgYXJnLCBuLCAuLi4pCV9fVExCSV8jI24ob3AsIGFyZykKKworI2RlZmluZSBfX3RsYmkob3AsIC4uLikJCV9fVExCSV9OKG9wLCAjI19fVkFfQVJHU19fLCAxLCAwKQorCisvKgogICoJVExCIE1hbmFnZW1lbnQKICAqCT09PT09PT09PT09PT09CiAgKgpAQCAtNjYsNyArODQsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIGxvY2FsX2ZsdXNoX3RsYl9hbGwodm9pZCkKIHsKIAlkc2IobnNoc3QpOwotCWFzbSgidGxiaQl2bWFsbGUxIik7CisJX190bGJpKHZtYWxsZTEpOwogCWRzYihuc2gpOwogCWlzYigpOwogfQpAQCAtNzQsNyArOTIsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX3RsYl9hbGwodm9pZCkKIHsKIAlkc2IoaXNoc3QpOwotCWFzbSgidGxiaQl2bWFsbGUxaXMiKTsKKwlfX3RsYmkodm1hbGxlMWlzKTsKIAlkc2IoaXNoKTsKIAlpc2IoKTsKIH0KQEAgLTg0LDcgKzEwMiw3IEBACiAJdW5zaWduZWQgbG9uZyBhc2lkID0gQVNJRChtbSkgPDwgNDg7CiAKIAlkc2IoaXNoc3QpOwotCWFzbSgidGxiaQlhc2lkZTFpcywgJTAiIDogOiAiciIgKGFzaWQpKTsKKwlfX3RsYmkoYXNpZGUxaXMsIGFzaWQpOwogCWRzYihpc2gpOwogfQogCkBAIC05NCw3ICsxMTIsNyBAQAogCXVuc2lnbmVkIGxvbmcgYWRkciA9IHVhZGRyID4+IDEyIHwgKEFTSUQodm1hLT52bV9tbSkgPDwgNDgpOwogCiAJZHNiKGlzaHN0KTsKLQlhc20oInRsYmkJdmFsZTFpcywgJTAiIDogOiAiciIgKGFkZHIpKTsKKwlfX3RsYmkodmFsZTFpcywgYWRkcik7CiAJZHNiKGlzaCk7CiB9CiAKQEAgLTEyMiw5ICsxNDAsOSBAQAogCWRzYihpc2hzdCk7CiAJZm9yIChhZGRyID0gc3RhcnQ7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gMSA8PCAoUEFHRV9TSElGVCAtIDEyKSkgewogCQlpZiAobGFzdF9sZXZlbCkKLQkJCWFzbSgidGxiaSB2YWxlMWlzLCAlMCIgOiA6ICJyIihhZGRyKSk7CisJCQlfX3RsYmkodmFsZTFpcywgYWRkcik7CiAJCWVsc2UKLQkJCWFzbSgidGxiaSB2YWUxaXMsICUwIiA6IDogInIiKGFkZHIpKTsKKwkJCV9fdGxiaSh2YWUxaXMsIGFkZHIpOwogCX0KIAlkc2IoaXNoKTsKIH0KQEAgLTE0OSw3ICsxNjcsNyBAQAogCiAJZHNiKGlzaHN0KTsKIAlmb3IgKGFkZHIgPSBzdGFydDsgYWRkciA8IGVuZDsgYWRkciArPSAxIDw8IChQQUdFX1NISUZUIC0gMTIpKQotCQlhc20oInRsYmkgdmFhZTFpcywgJTAiIDogOiAiciIoYWRkcikpOworCQlfX3RsYmkodmFhZTFpcywgYWRkcik7CiAJZHNiKGlzaCk7CiAJaXNiKCk7CiB9CkBAIC0xNjMsNyArMTgxLDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSB1YWRkciA+PiAxMiB8IChBU0lEKG1tKSA8PCA0OCk7CiAKLQlhc20oInRsYmkJdmFlMWlzLCAlMCIgOiA6ICJyIiAoYWRkcikpOworCV9fdGxiaSh2YWUxaXMsIGFkZHIpOwogCWRzYihpc2gpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3RyYXBzLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3RyYXBzLmgKaW5kZXggOWNkMDNmMy4uMDJlOTAzNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS90cmFwcy5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vdHJhcHMuaApAQCAtMTksNiArMTksNyBAQAogI2RlZmluZSBfX0FTTV9UUkFQX0gKIAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KIAogc3RydWN0IHB0X3JlZ3M7CiAKQEAgLTM5LDkgKzQwLDYgQEAKICNpZmRlZiBDT05GSUdfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSCiBzdGF0aWMgaW5saW5lIGludCBfX2luX2lycWVudHJ5X3RleHQodW5zaWduZWQgbG9uZyBwdHIpCiB7Ci0JZXh0ZXJuIGNoYXIgX19pcnFlbnRyeV90ZXh0X3N0YXJ0W107Ci0JZXh0ZXJuIGNoYXIgX19pcnFlbnRyeV90ZXh0X2VuZFtdOwotCiAJcmV0dXJuIHB0ciA+PSAodW5zaWduZWQgbG9uZykmX19pcnFlbnRyeV90ZXh0X3N0YXJ0ICYmCiAJICAgICAgIHB0ciA8ICh1bnNpZ25lZCBsb25nKSZfX2lycWVudHJ5X3RleHRfZW5kOwogfQpAQCAtNTQsOCArNTIsNiBAQAogCiBzdGF0aWMgaW5saW5lIGludCBpbl9leGNlcHRpb25fdGV4dCh1bnNpZ25lZCBsb25nIHB0cikKIHsKLQlleHRlcm4gY2hhciBfX2V4Y2VwdGlvbl90ZXh0X3N0YXJ0W107Ci0JZXh0ZXJuIGNoYXIgX19leGNlcHRpb25fdGV4dF9lbmRbXTsKIAlpbnQgaW47CiAKIAlpbiA9IHB0ciA+PSAodW5zaWduZWQgbG9uZykmX19leGNlcHRpb25fdGV4dF9zdGFydCAmJgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS92aXJ0LmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3ZpcnQuaAppbmRleCAxNzg4NTQ1Li5mZWExMDczIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3ZpcnQuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3ZpcnQuaApAQCAtNDUsNiArNDUsOCBAQAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KKyNpbmNsdWRlIDxhc20vc3lzcmVnLmg+CiAKIC8qCiAgKiBfX2Jvb3RfY3B1X21vZGUgcmVjb3JkcyB3aGF0IG1vZGUgQ1BVcyB3ZXJlIGJvb3RlZCBpbi4KQEAgLTc1LDEwICs3Nyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBpc19rZXJuZWxfaW5faHlwX21vZGUodm9pZCkKIHsKLQl1NjQgZWw7Ci0KLQlhc20oIm1ycyAlMCwgQ3VycmVudEVMIiA6ICI9ciIgKGVsKSk7Ci0JcmV0dXJuIGVsID09IEN1cnJlbnRFTF9FTDI7CisJcmV0dXJuIHJlYWRfc3lzcmVnKEN1cnJlbnRFTCkgPT0gQ3VycmVudEVMX0VMMjsKIH0KIAogI2lmZGVmIENPTkZJR19BUk02NF9WSEUKQEAgLTg3LDE0ICs4Niw2IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgdmVyaWZ5X2NwdV9ydW5fZWwodm9pZCkge30KICNlbmRpZgogCi0vKiBUaGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSBoeXBlcnZpc29yIGlkbWFwIHRleHQgKi8KLWV4dGVybiBjaGFyIF9faHlwX2lkbWFwX3RleHRfc3RhcnRbXTsKLWV4dGVybiBjaGFyIF9faHlwX2lkbWFwX3RleHRfZW5kW107Ci0KLS8qIFRoZSBzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIGh5cGVydmlzb3IgdGV4dCAqLwotZXh0ZXJuIGNoYXIgX19oeXBfdGV4dF9zdGFydFtdOwotZXh0ZXJuIGNoYXIgX19oeXBfdGV4dF9lbmRbXTsKLQogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAjZW5kaWYgLyogISBfX0FTTV9fVklSVF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlCmluZGV4IDE0ZjdiNjUuLjdkNjZiYmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL01ha2VmaWxlCkBAIC0xMCw2ICsxMCw4IEBACiBDRkxBR1NfUkVNT1ZFX2luc24ubyA9IC1wZwogQ0ZMQUdTX1JFTU9WRV9yZXR1cm5fYWRkcmVzcy5vID0gLXBnCiAKK0NGTEFHU19zZXR1cC5vID0gLURVVFNfTUFDSElORT0nIiQoVVRTX01BQ0hJTkUpIicKKwogIyBPYmplY3QgZmlsZSBsaXN0cy4KIGFybTY0LW9iai15CQk6PSBkZWJ1Zy1tb25pdG9ycy5vIGVudHJ5Lm8gaXJxLm8gZnBzaW1kLm8JCVwKIAkJCSAgIGVudHJ5LWZwc2ltZC5vIHByb2Nlc3MubyBwdHJhY2UubyBzZXR1cC5vIHNpZ25hbC5vCVwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2FjcGkuYyBiL2FyY2gvYXJtNjQva2VybmVsL2FjcGkuYwppbmRleCAzZTRmMWE0Li4yNTJhNmQ5IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9hY3BpLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvYWNwaS5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9vZl9mZHQuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogCiAjaW5jbHVkZSA8YXNtL2NwdXR5cGUuaD4KICNpbmNsdWRlIDxhc20vY3B1X29wcy5oPgpAQCAtMjA2LDcgKzIwNyw3IEBACiAJaWYgKHBhcmFtX2FjcGlfb2ZmIHx8CiAJICAgICghcGFyYW1fYWNwaV9vbiAmJiAhcGFyYW1fYWNwaV9mb3JjZSAmJgogCSAgICAgb2Zfc2Nhbl9mbGF0X2R0KGR0X3NjYW5fZGVwdGgxX25vZGVzLCBOVUxMKSkpCi0JCXJldHVybjsKKwkJZ290byBkb25lOwogCiAJLyoKIAkgKiBBQ1BJIGlzIGRpc2FibGVkIGF0IHRoaXMgcG9pbnQuIEVuYWJsZSBpdCBpbiBvcmRlciB0byBwYXJzZQpAQCAtMjI2LDYgKzIyNywxNCBAQAogCQlpZiAoIXBhcmFtX2FjcGlfZm9yY2UpCiAJCQlkaXNhYmxlX2FjcGkoKTsKIAl9CisKK2RvbmU6CisJaWYgKGFjcGlfZGlzYWJsZWQpIHsKKwkJaWYgKGVhcmx5Y29uX2luaXRfaXNfZGVmZXJyZWQpCisJCQllYXJseV9pbml0X2R0X3NjYW5fY2hvc2VuX3N0ZG91dCgpOworCX0gZWxzZSB7CisJCXBhcnNlX3NwY3IoZWFybHljb25faW5pdF9pc19kZWZlcnJlZCk7CisJfQogfQogCiAjaWZkZWYgQ09ORklHX0FDUElfQVBFSQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvYWNwaV9udW1hLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9hY3BpX251bWEuYwppbmRleCBmODUxNDljLi5mMDFmYWI2IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9hY3BpX251bWEuYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9hY3BpX251bWEuYwpAQCAtMTA1LDggKzEwNSwxMCBAQAogCWludCByZXQ7CiAKIAlyZXQgPSBhY3BpX251bWFfaW5pdCgpOwotCWlmIChyZXQpCisJaWYgKHJldCkgeworCQlwcl9pbmZvKCJGYWlsZWQgdG8gaW5pdGlhbGlzZSBmcm9tIGZpcm13YXJlXG4iKTsKIAkJcmV0dXJuIHJldDsKKwl9CiAKIAlyZXR1cm4gc3JhdF9kaXNhYmxlZCgpID8gLUVJTlZBTCA6IDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9hbHRlcm5hdGl2ZS5jIGIvYXJjaC9hcm02NC9rZXJuZWwvYWx0ZXJuYXRpdmUuYwppbmRleCBkMmVlMWIyLi4wNmQ2NTBmIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9hbHRlcm5hdGl2ZS5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2FsdGVybmF0aXZlLmMKQEAgLTI1LDE0ICsyNSwxMyBAQAogI2luY2x1ZGUgPGFzbS9hbHRlcm5hdGl2ZS5oPgogI2luY2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+CiAjaW5jbHVkZSA8YXNtL2luc24uaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxsaW51eC9zdG9wX21hY2hpbmUuaD4KIAogI2RlZmluZSBfX0FMVF9QVFIoYSxmKQkJKHUzMiAqKSgodm9pZCAqKSYoYSktPmYgKyAoYSktPmYpCiAjZGVmaW5lIEFMVF9PUklHX1BUUihhKQkJX19BTFRfUFRSKGEsIG9yaWdfb2Zmc2V0KQogI2RlZmluZSBBTFRfUkVQTF9QVFIoYSkJCV9fQUxUX1BUUihhLCBhbHRfb2Zmc2V0KQogCi1leHRlcm4gc3RydWN0IGFsdF9pbnN0ciBfX2FsdF9pbnN0cnVjdGlvbnNbXSwgX19hbHRfaW5zdHJ1Y3Rpb25zX2VuZFtdOwotCiBzdHJ1Y3QgYWx0X3JlZ2lvbiB7CiAJc3RydWN0IGFsdF9pbnN0ciAqYmVnaW47CiAJc3RydWN0IGFsdF9pbnN0ciAqZW5kOwpAQCAtNTksNiArNTgsOCBAQAogCUJVRygpOwogfQogCisjZGVmaW5lIGFsaWduX2Rvd24oeCwgYSkJKCh1bnNpZ25lZCBsb25nKSh4KSAmIH4oKCh1bnNpZ25lZCBsb25nKShhKSkgLSAxKSkKKwogc3RhdGljIHUzMiBnZXRfYWx0X2luc24oc3RydWN0IGFsdF9pbnN0ciAqYWx0LCB1MzIgKmluc25wdHIsIHUzMiAqYWx0aW5zbnB0cikKIHsKIAl1MzIgaW5zbjsKQEAgLTgwLDYgKzgxLDI1IEBACiAJCQlvZmZzZXQgPSB0YXJnZXQgLSAodW5zaWduZWQgbG9uZylpbnNucHRyOwogCQkJaW5zbiA9IGFhcmNoNjRfc2V0X2JyYW5jaF9vZmZzZXQoaW5zbiwgb2Zmc2V0KTsKIAkJfQorCX0gZWxzZSBpZiAoYWFyY2g2NF9pbnNuX2lzX2FkcnAoaW5zbikpIHsKKwkJczMyIG9yaWdfb2Zmc2V0LCBuZXdfb2Zmc2V0OworCQl1bnNpZ25lZCBsb25nIHRhcmdldDsKKworCQkvKgorCQkgKiBJZiB3ZSdyZSByZXBsYWNpbmcgYW4gYWRycCBpbnN0cnVjdGlvbiwgd2hpY2ggdXNlcyBQQy1yZWxhdGl2ZQorCQkgKiBpbW1lZGlhdGUgYWRkcmVzc2luZywgYWRqdXN0IHRoZSBvZmZzZXQgdG8gcmVmbGVjdCB0aGUgbmV3CisJCSAqIFBDLiBhZHJwIG9wZXJhdGVzIG9uIDRLIGFsaWduZWQgYWRkcmVzc2VzLgorCQkgKi8KKwkJb3JpZ19vZmZzZXQgID0gYWFyY2g2NF9pbnNuX2FkcnBfZ2V0X29mZnNldChpbnNuKTsKKwkJdGFyZ2V0ID0gYWxpZ25fZG93bihhbHRpbnNucHRyLCBTWl80SykgKyBvcmlnX29mZnNldDsKKwkJbmV3X29mZnNldCA9IHRhcmdldCAtIGFsaWduX2Rvd24oaW5zbnB0ciwgU1pfNEspOworCQlpbnNuID0gYWFyY2g2NF9pbnNuX2FkcnBfc2V0X29mZnNldChpbnNuLCBuZXdfb2Zmc2V0KTsKKwl9IGVsc2UgaWYgKGFhcmNoNjRfaW5zbl91c2VzX2xpdGVyYWwoaW5zbikpIHsKKwkJLyoKKwkJICogRGlzYWxsb3cgcGF0Y2hpbmcgdW5oYW5kbGVkIGluc3RydWN0aW9ucyB1c2luZyBQQyByZWxhdGl2ZQorCQkgKiBsaXRlcmFsIGFkZHJlc3NlcworCQkgKi8KKwkJQlVHKCk7CiAJfQogCiAJcmV0dXJuIGluc247CkBAIC0xMjQsOCArMTQ0LDggQEAKIHsKIAlzdGF0aWMgaW50IHBhdGNoZWQgPSAwOwogCXN0cnVjdCBhbHRfcmVnaW9uIHJlZ2lvbiA9IHsKLQkJLmJlZ2luCT0gX19hbHRfaW5zdHJ1Y3Rpb25zLAotCQkuZW5kCT0gX19hbHRfaW5zdHJ1Y3Rpb25zX2VuZCwKKwkJLmJlZ2luCT0gKHN0cnVjdCBhbHRfaW5zdHIgKilfX2FsdF9pbnN0cnVjdGlvbnMsCisJCS5lbmQJPSAoc3RydWN0IGFsdF9pbnN0ciAqKV9fYWx0X2luc3RydWN0aW9uc19lbmQsCiAJfTsKIAogCS8qIFdlIGFsd2F5cyBoYXZlIGEgQ1BVIDAgYXQgdGhpcyBwb2ludCAoX19pbml0KSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvYXJtNjQva2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggMDUwNzBiNy4uNGEyZjBmMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KICNpbmNsdWRlIDxhc20vc21wX3BsYXQuaD4KQEAgLTE0NSw1ICsxNDYsNiBAQAogICBERUZJTkUoSElCRVJOX1BCRV9PUklHLAlvZmZzZXRvZihzdHJ1Y3QgcGJlLCBvcmlnX2FkZHJlc3MpKTsKICAgREVGSU5FKEhJQkVSTl9QQkVfQUREUiwJb2Zmc2V0b2Yoc3RydWN0IHBiZSwgYWRkcmVzcykpOwogICBERUZJTkUoSElCRVJOX1BCRV9ORVhULAlvZmZzZXRvZihzdHJ1Y3QgcGJlLCBuZXh0KSk7CisgIERFRklORShBUk02NF9GVFJfU1lTVkFMLAlvZmZzZXRvZihzdHJ1Y3QgYXJtNjRfZnRyX3JlZywgc3lzX3ZhbCkpOwogICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2NhY2hlaW5mby5jIGIvYXJjaC9hcm02NC9rZXJuZWwvY2FjaGVpbmZvLmMKaW5kZXggYjg2MjlkNS4uOTYxNzMwMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvY2FjaGVpbmZvLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvY2FjaGVpbmZvLmMKQEAgLTM5LDcgKzM5LDcgQEAKIAogCWlmIChsZXZlbCA+IE1BWF9DQUNIRV9MRVZFTCkKIAkJcmV0dXJuIENBQ0hFX1RZUEVfTk9DQUNIRTsKLQlhc20gdm9sYXRpbGUgKCJtcnMgICAgICV4MCwgY2xpZHJfZWwxIiA6ICI9ciIgKGNsaWRyKSk7CisJY2xpZHIgPSByZWFkX3N5c3JlZyhjbGlkcl9lbDEpOwogCXJldHVybiBDTElEUl9DVFlQRShjbGlkciwgbGV2ZWwpOwogfQogCkBAIC01NSwxMSArNTUsOSBAQAogCiAJV0FSTl9PTihwcmVlbXB0aWJsZSgpKTsKIAotCS8qIFB1dCB2YWx1ZSBpbnRvIENTU0VMUiAqLwotCWFzbSB2b2xhdGlsZSgibXNyIGNzc2Vscl9lbDEsICV4MCIgOiA6ICJyIiAoY3NzZWxyKSk7CisJd3JpdGVfc3lzcmVnKGNzc2VsciwgY3NzZWxyX2VsMSk7CiAJaXNiKCk7Ci0JLyogUmVhZCByZXN1bHQgb3V0IG9mIENDU0lEUiAqLwotCWFzbSB2b2xhdGlsZSgibXJzICV4MCwgY2NzaWRyX2VsMSIgOiAiPXIiIChjY3NpZHIpKTsKKwljY3NpZHIgPSByZWFkX3N5c3JlZyhjY3NpZHJfZWwxKTsKIAogCXJldHVybiBjY3NpZHI7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVfZXJyYXRhLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9jcHVfZXJyYXRhLmMKaW5kZXggODJiMGZjMi4uMDE1MDM5NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvY3B1X2VycmF0YS5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdV9lcnJhdGEuYwpAQCAtMzAsNiArMzAsMjEgQEAKIAkJCQkgICAgICAgZW50cnktPm1pZHJfcmFuZ2VfbWF4KTsKIH0KIAorc3RhdGljIGJvb2wKK2hhc19taXNtYXRjaGVkX2NhY2hlX2xpbmVfc2l6ZShjb25zdCBzdHJ1Y3QgYXJtNjRfY3B1X2NhcGFiaWxpdGllcyAqZW50cnksCisJCQkJaW50IHNjb3BlKQoreworCVdBUk5fT04oc2NvcGUgIT0gU0NPUEVfTE9DQUxfQ1BVIHx8IHByZWVtcHRpYmxlKCkpOworCXJldHVybiAocmVhZF9jcHVpZF9jYWNoZXR5cGUoKSAmIGFybTY0X2Z0cl9yZWdfY3RyZWwwLnN0cmljdF9tYXNrKSAhPQorCQkoYXJtNjRfZnRyX3JlZ19jdHJlbDAuc3lzX3ZhbCAmIGFybTY0X2Z0cl9yZWdfY3RyZWwwLnN0cmljdF9tYXNrKTsKK30KKworc3RhdGljIHZvaWQgY3B1X2VuYWJsZV90cmFwX2N0cl9hY2Nlc3Modm9pZCAqX191bnVzZWQpCit7CisJLyogQ2xlYXIgU0NUTFJfRUwxLlVDVCAqLworCWNvbmZpZ19zY3Rscl9lbDEoU0NUTFJfRUwxX1VDVCwgMCk7Cit9CisKICNkZWZpbmUgTUlEUl9SQU5HRShtb2RlbCwgbWluLCBtYXgpIFwKIAkuZGVmX3Njb3BlID0gU0NPUEVfTE9DQUxfQ1BVLCBcCiAJLm1hdGNoZXMgPSBpc19hZmZlY3RlZF9taWRyX3JhbmdlLCBcCkBAIC0xMDgsNiArMTIzLDEzIEBACiAJfSwKICNlbmRpZgogCXsKKwkJLmRlc2MgPSAiTWlzbWF0Y2hlZCBjYWNoZSBsaW5lIHNpemUiLAorCQkuY2FwYWJpbGl0eSA9IEFSTTY0X01JU01BVENIRURfQ0FDSEVfTElORV9TSVpFLAorCQkubWF0Y2hlcyA9IGhhc19taXNtYXRjaGVkX2NhY2hlX2xpbmVfc2l6ZSwKKwkJLmRlZl9zY29wZSA9IFNDT1BFX0xPQ0FMX0NQVSwKKwkJLmVuYWJsZSA9IGNwdV9lbmFibGVfdHJhcF9jdHJfYWNjZXNzLAorCX0sCisJewogCX0KIH07CiAKQEAgLTExNiw3ICsxMzgsNyBAQAogICogYW5kIHRoZSByZWxhdGVkIGluZm9ybWF0aW9uIGlzIGZyZWVkIHNvb24gYWZ0ZXIuIElmIHRoZSBuZXcgQ1BVIHJlcXVpcmVzCiAgKiBhbiBlcnJhdGEgbm90IGRldGVjdGVkIGF0IGJvb3QsIGZhaWwgdGhpcyBDUFUuCiAgKi8KLXZvaWQgdmVyaWZ5X2xvY2FsX2NwdV9lcnJhdGEodm9pZCkKK3ZvaWQgdmVyaWZ5X2xvY2FsX2NwdV9lcnJhdGFfd29ya2Fyb3VuZHModm9pZCkKIHsKIAljb25zdCBzdHJ1Y3QgYXJtNjRfY3B1X2NhcGFiaWxpdGllcyAqY2FwcyA9IGFybTY0X2VycmF0YTsKIApAQCAtMTMxLDcgKzE1Myw3IEBACiAJCX0KIH0KIAotdm9pZCBjaGVja19sb2NhbF9jcHVfZXJyYXRhKHZvaWQpCit2b2lkIHVwZGF0ZV9jcHVfZXJyYXRhX3dvcmthcm91bmRzKHZvaWQpCiB7CiAJdXBkYXRlX2NwdV9jYXBhYmlsaXRpZXMoYXJtNjRfZXJyYXRhLCAiZW5hYmxpbmcgd29ya2Fyb3VuZCBmb3IiKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2NwdV9vcHMuYyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdV9vcHMuYwppbmRleCBjN2NmYjhmLi5lMTM3Y2VhIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVfb3BzLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvY3B1X29wcy5jCkBAIC0xNyw2ICsxNyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KQEAgLTI4LDcgKzI5LDcgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgY3B1X29wZXJhdGlvbnMgYWNwaV9wYXJraW5nX3Byb3RvY29sX29wczsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgY3B1X29wZXJhdGlvbnMgY3B1X3BzY2lfb3BzOwogCi1jb25zdCBzdHJ1Y3QgY3B1X29wZXJhdGlvbnMgKmNwdV9vcHNbTlJfQ1BVU107Citjb25zdCBzdHJ1Y3QgY3B1X29wZXJhdGlvbnMgKmNwdV9vcHNbTlJfQ1BVU10gX19yb19hZnRlcl9pbml0OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNwdV9vcGVyYXRpb25zICpkdF9zdXBwb3J0ZWRfY3B1X29wc1tdIF9faW5pdGNvbnN0ID0gewogCSZzbXBfc3Bpbl90YWJsZV9vcHMsCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmMKaW5kZXggNjIyNzJlYS4uZDU3N2YyNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuYwpAQCAtNDYsNiArNDYsOSBAQAogCiBERUNMQVJFX0JJVE1BUChjcHVfaHdjYXBzLCBBUk02NF9OQ0FQUyk7CiAKK0RFRklORV9TVEFUSUNfS0VZX0FSUkFZX0ZBTFNFKGNwdV9od2NhcF9rZXlzLCBBUk02NF9OQ0FQUyk7CitFWFBPUlRfU1lNQk9MKGNwdV9od2NhcF9rZXlzKTsKKwogI2RlZmluZSBfX0FSTTY0X0ZUUl9CSVRTKFNJR05FRCwgU1RSSUNULCBUWVBFLCBTSElGVCwgV0lEVEgsIFNBRkVfVkFMKSBcCiAJewkJCQkJCVwKIAkJLnNpZ24gPSBTSUdORUQsCQkJCVwKQEAgLTc0LDcgKzc3LDcgQEAKIGNwdWZlYXR1cmVfcGFuX25vdF91YW8oY29uc3Qgc3RydWN0IGFybTY0X2NwdV9jYXBhYmlsaXRpZXMgKmVudHJ5LCBpbnQgX191bnVzZWQpOwogCiAKLXN0YXRpYyBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRpc2FyMFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NGlzYXIwW10gPSB7CiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCAzMiwgMzIsIDApLAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgSURfQUE2NElTQVIwX1JETV9TSElGVCwgNCwgMCksCiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCAyNCwgNCwgMCksCkBAIC04Nyw3ICs5MCw3IEBACiAJQVJNNjRfRlRSX0VORCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRwZnIwW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9hYTY0cGZyMFtdID0gewogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgMzIsIDMyLCAwKSwKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIDI4LCA0LCAwKSwKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIElEX0FBNjRQRlIwX0dJQ19TSElGVCwgNCwgMCksCkBAIC0xMDEsNyArMTA0LDcgQEAKIAlBUk02NF9GVFJfRU5ELAogfTsKIAotc3RhdGljIHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NG1tZnIwW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9hYTY0bW1mcjBbXSA9IHsKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIDMyLCAzMiwgMCksCiAJU19BUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIElEX0FBNjRNTUZSMF9UR1JBTjRfU0hJRlQsIDQsIElEX0FBNjRNTUZSMF9UR1JBTjRfTkkpLAogCVNfQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCBJRF9BQTY0TU1GUjBfVEdSQU42NF9TSElGVCwgNCwgSURfQUE2NE1NRlIwX1RHUkFONjRfTkkpLApAQCAtMTE5LDcgKzEyMiw3IEBACiAJQVJNNjRfRlRSX0VORCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRtbWZyMVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NG1tZnIxW10gPSB7CiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCAzMiwgMzIsIDApLAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0TU1GUjFfUEFOX1NISUZULCA0LCAwKSwKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIElEX0FBNjRNTUZSMV9MT1JfU0hJRlQsIDQsIDApLApAQCAtMTMwLDcgKzEzMyw3IEBACiAJQVJNNjRfRlRSX0VORCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRtbWZyMltdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NG1tZnIyW10gPSB7CiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCBJRF9BQTY0TU1GUjJfTFZBX1NISUZULCA0LCAwKSwKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIElEX0FBNjRNTUZSMl9JRVNCX1NISUZULCA0LCAwKSwKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIElEX0FBNjRNTUZSMl9MU01fU0hJRlQsIDQsIDApLApAQCAtMTM5LDcgKzE0Miw3IEBACiAJQVJNNjRfRlRSX0VORCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2N0cltdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfY3RyW10gPSB7CiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCAzMSwgMSwgMSksCS8qIFJBTyAqLwogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgMjgsIDMsIDApLAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9ISUdIRVJfU0FGRSwgMjQsIDQsIDApLAkvKiBDV0cgKi8KQEAgLTE0NywxNSArMTUwLDIxIEBACiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIDE2LCA0LCAxKSwJLyogRG1pbkxpbmUgKi8KIAkvKgogCSAqIExpbnV4IGNhbiBoYW5kbGUgZGlmZmVyaW5nIEktY2FjaGUgcG9saWNpZXMuIFVzZXJzcGFjZSBKSVRzIHdpbGwKLQkgKiBtYWtlIHVzZSBvZiAqbWluTGluZQorCSAqIG1ha2UgdXNlIG9mICptaW5MaW5lLgorCSAqIElmIHdlIGhhdmUgZGlmZmVyaW5nIEktY2FjaGUgcG9saWNpZXMsIHJlcG9ydCBpdCBhcyB0aGUgd2Vha2VzdCAtIEFJVklWVC4KIAkgKi8KLQlBUk02NF9GVFJfQklUUyhGVFJfTk9OU1RSSUNULCBGVFJfRVhBQ1QsIDE0LCAyLCAwKSwJLyogTDFJcCAqLworCUFSTTY0X0ZUUl9CSVRTKEZUUl9OT05TVFJJQ1QsIEZUUl9FWEFDVCwgMTQsIDIsIElDQUNIRV9QT0xJQ1lfQUlWSVZUKSwJLyogTDFJcCAqLwogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgNCwgMTAsIDApLAkvKiBSQVogKi8KIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgMCwgNCwgMCksCS8qIEltaW5MaW5lICovCiAJQVJNNjRfRlRSX0VORCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX21tZnIwW10gPSB7CitzdHJ1Y3QgYXJtNjRfZnRyX3JlZyBhcm02NF9mdHJfcmVnX2N0cmVsMCA9IHsKKwkubmFtZQkJPSAiU1lTX0NUUl9FTDAiLAorCS5mdHJfYml0cwk9IGZ0cl9jdHIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX21tZnIwW10gPSB7CiAJU19BUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIDI4LCA0LCAweGYpLAkvKiBJbm5lclNociAqLwogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgMjQsIDQsIDApLAkvKiBGQ1NFICovCiAJQVJNNjRfRlRSX0JJVFMoRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIDIwLCA0LCAwKSwJLyogQXV4UmVnICovCkBAIC0xNjcsNyArMTc2LDcgQEAKIAlBUk02NF9GVFJfRU5ELAogfTsKIAotc3RhdGljIHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NGRmcjBbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRkZnIwW10gPSB7CiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCAzMiwgMzIsIDApLAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0REZSMF9DVFhfQ01QU19TSElGVCwgNCwgMCksCiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRERlIwX1dSUFNfU0hJRlQsIDQsIDApLApAQCAtMTc4LDE0ICsxODcsMTQgQEAKIAlBUk02NF9GVFJfRU5ELAogfTsKIAotc3RhdGljIHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfbXZmcjJbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX212ZnIyW10gPSB7CiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCA4LCAyNCwgMCksCS8qIFJBWiAqLwogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgNCwgNCwgMCksCQkvKiBGUE1pc2MgKi8KIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIDAsIDQsIDApLAkJLyogU0lNRE1pc2MgKi8KIAlBUk02NF9GVFJfRU5ELAogfTsKIAotc3RhdGljIHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfZGN6aWRbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2RjemlkW10gPSB7CiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCA1LCAyNywgMCksCS8qIFJBWiAqLwogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgNCwgMSwgMSksCQkvKiBEWlAgKi8KIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgMCwgNCwgMCksCS8qIEJTICovCkBAIC0xOTMsNyArMjAyLDcgQEAKIH07CiAKIAotc3RhdGljIHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfaXNhcjVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2lzYXI1W10gPSB7CiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCBJRF9JU0FSNV9SRE1fU0hJRlQsIDQsIDApLAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgMjAsIDQsIDApLAkvKiBSQVogKi8KIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIElEX0lTQVI1X0NSQzMyX1NISUZULCA0LCAwKSwKQEAgLTIwNCwxNCArMjEzLDE0IEBACiAJQVJNNjRfRlRSX0VORCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX21tZnI0W10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9tbWZyNFtdID0gewogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgOCwgMjQsIDApLAkvKiBSQVogKi8KIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIDQsIDQsIDApLAkJLyogYWMyICovCiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCAwLCA0LCAwKSwJCS8qIFJBWiAqLwogCUFSTTY0X0ZUUl9FTkQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9wZnIwW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9wZnIwW10gPSB7CiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCAxNiwgMTYsIDApLAkvKiBSQVogKi8KIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIDEyLCA0LCAwKSwJLyogU3RhdGUzICovCiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCA4LCA0LCAwKSwJCS8qIFN0YXRlMiAqLwpAQCAtMjIwLDcgKzIyOSw3IEBACiAJQVJNNjRfRlRSX0VORCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2RmcjBbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2RmcjBbXSA9IHsKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgMjgsIDQsIDApLAogCVNfQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIDI0LCA0LCAweGYpLAkvKiBQZXJmTW9uICovCiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIDIwLCA0LCAwKSwKQEAgLTIzOCw3ICsyNDcsNyBAQAogICogMC4gQ292ZXJzIHRoZSBmb2xsb3dpbmcgMzJiaXQgcmVnaXN0ZXJzOgogICogaWRfaXNhclswLTRdLCBpZF9tbWZyWzEtM10sIGlkX3BmcjEsIG12ZnJbMC0xXQogICovCi1zdGF0aWMgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9nZW5lcmljXzMyYml0c1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfZ2VuZXJpY18zMmJpdHNbXSA9IHsKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgMjgsIDQsIDApLAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCAyNCwgNCwgMCksCiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIDIwLCA0LCAwKSwKQEAgLTI1MCwyOSArMjU5LDMyIEBACiAJQVJNNjRfRlRSX0VORCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2dlbmVyaWNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2dlbmVyaWNbXSA9IHsKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIDAsIDY0LCAwKSwKIAlBUk02NF9GVFJfRU5ELAogfTsKIAotc3RhdGljIHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfZ2VuZXJpYzMyW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9nZW5lcmljMzJbXSA9IHsKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIDAsIDMyLCAwKSwKIAlBUk02NF9GVFJfRU5ELAogfTsKIAotc3RhdGljIHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfYWE2NHJheltdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfYWE2NHJheltdID0gewogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgMCwgNjQsIDApLAogCUFSTTY0X0ZUUl9FTkQsCiB9OwogCi0jZGVmaW5lIEFSTTY0X0ZUUl9SRUcoaWQsIHRhYmxlKQkJXAotCXsJCQkJCVwKLQkJLnN5c19pZCA9IGlkLAkJCVwKKyNkZWZpbmUgQVJNNjRfRlRSX1JFRyhpZCwgdGFibGUpIHsJCVwKKwkuc3lzX2lkID0gaWQsCQkJCVwKKwkucmVnID0gCSYoc3RydWN0IGFybTY0X2Z0cl9yZWcpewlcCiAJCS5uYW1lID0gI2lkLAkJCVwKIAkJLmZ0cl9iaXRzID0gJigodGFibGUpWzBdKSwJXAotCX0KKwl9fQogCi1zdGF0aWMgc3RydWN0IGFybTY0X2Z0cl9yZWcgYXJtNjRfZnRyX3JlZ3NbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgX19mdHJfcmVnX2VudHJ5IHsKKwl1MzIJCQlzeXNfaWQ7CisJc3RydWN0IGFybTY0X2Z0cl9yZWcgCSpyZWc7Cit9IGFybTY0X2Z0cl9yZWdzW10gPSB7CiAKIAkvKiBPcDEgPSAwLCBDUm4gPSAwLCBDUm0gPSAxICovCiAJQVJNNjRfRlRSX1JFRyhTWVNfSURfUEZSMF9FTDEsIGZ0cl9pZF9wZnIwKSwKQEAgLTMxNSw3ICszMjcsNyBAQAogCUFSTTY0X0ZUUl9SRUcoU1lTX0lEX0FBNjRNTUZSMl9FTDEsIGZ0cl9pZF9hYTY0bW1mcjIpLAogCiAJLyogT3AxID0gMywgQ1JuID0gMCwgQ1JtID0gMCAqLwotCUFSTTY0X0ZUUl9SRUcoU1lTX0NUUl9FTDAsIGZ0cl9jdHIpLAorCXsgU1lTX0NUUl9FTDAsICZhcm02NF9mdHJfcmVnX2N0cmVsMCB9LAogCUFSTTY0X0ZUUl9SRUcoU1lTX0RDWklEX0VMMCwgZnRyX2RjemlkKSwKIAogCS8qIE9wMSA9IDMsIENSbiA9IDE0LCBDUm0gPSAwICovCkBAIC0zMjQsNyArMzM2LDcgQEAKIAogc3RhdGljIGludCBzZWFyY2hfY21wX2Z0cl9yZWcoY29uc3Qgdm9pZCAqaWQsIGNvbnN0IHZvaWQgKnJlZ3ApCiB7Ci0JcmV0dXJuIChpbnQpKHVuc2lnbmVkIGxvbmcpaWQgLSAoaW50KSgoY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9yZWcgKilyZWdwKS0+c3lzX2lkOworCXJldHVybiAoaW50KSh1bnNpZ25lZCBsb25nKWlkIC0gKGludCkoKGNvbnN0IHN0cnVjdCBfX2Z0cl9yZWdfZW50cnkgKilyZWdwKS0+c3lzX2lkOwogfQogCiAvKgpAQCAtMzM5LDE0ICszNTEsMjAgQEAKICAqLwogc3RhdGljIHN0cnVjdCBhcm02NF9mdHJfcmVnICpnZXRfYXJtNjRfZnRyX3JlZyh1MzIgc3lzX2lkKQogewotCXJldHVybiBic2VhcmNoKChjb25zdCB2b2lkICopKHVuc2lnbmVkIGxvbmcpc3lzX2lkLAorCWNvbnN0IHN0cnVjdCBfX2Z0cl9yZWdfZW50cnkgKnJldDsKKworCXJldCA9IGJzZWFyY2goKGNvbnN0IHZvaWQgKikodW5zaWduZWQgbG9uZylzeXNfaWQsCiAJCQlhcm02NF9mdHJfcmVncywKIAkJCUFSUkFZX1NJWkUoYXJtNjRfZnRyX3JlZ3MpLAogCQkJc2l6ZW9mKGFybTY0X2Z0cl9yZWdzWzBdKSwKIAkJCXNlYXJjaF9jbXBfZnRyX3JlZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldC0+cmVnOworCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdTY0IGFybTY0X2Z0cl9zZXRfdmFsdWUoc3RydWN0IGFybTY0X2Z0cl9iaXRzICpmdHJwLCBzNjQgcmVnLCBzNjQgZnRyX3ZhbCkKK3N0YXRpYyB1NjQgYXJtNjRfZnRyX3NldF92YWx1ZShjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgKmZ0cnAsIHM2NCByZWcsCisJCQkgICAgICAgczY0IGZ0cl92YWwpCiB7CiAJdTY0IG1hc2sgPSBhcm02NF9mdHJfbWFzayhmdHJwKTsKIApAQCAtMzU1LDcgKzM3Myw4IEBACiAJcmV0dXJuIHJlZzsKIH0KIAotc3RhdGljIHM2NCBhcm02NF9mdHJfc2FmZV92YWx1ZShzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgKmZ0cnAsIHM2NCBuZXcsIHM2NCBjdXIpCitzdGF0aWMgczY0IGFybTY0X2Z0cl9zYWZlX3ZhbHVlKGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyAqZnRycCwgczY0IG5ldywKKwkJCQlzNjQgY3VyKQogewogCXM2NCByZXQgPSAwOwogCkBAIC0zNzYsMjcgKzM5NSwxMyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHNvcnRfY21wX2Z0cl9yZWdzKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCi17Ci0JcmV0dXJuICgoY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9yZWcgKilhKS0+c3lzX2lkIC0KLQkJICgoY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9yZWcgKiliKS0+c3lzX2lkOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgc3dhcF9mdHJfcmVncyh2b2lkICphLCB2b2lkICpiLCBpbnQgc2l6ZSkKLXsKLQlzdHJ1Y3QgYXJtNjRfZnRyX3JlZyB0bXAgPSAqKHN0cnVjdCBhcm02NF9mdHJfcmVnICopYTsKLQkqKHN0cnVjdCBhcm02NF9mdHJfcmVnICopYSA9ICooc3RydWN0IGFybTY0X2Z0cl9yZWcgKiliOwotCSooc3RydWN0IGFybTY0X2Z0cl9yZWcgKiliID0gdG1wOwotfQotCiBzdGF0aWMgdm9pZCBfX2luaXQgc29ydF9mdHJfcmVncyh2b2lkKQogewotCS8qIEtlZXAgdGhlIGFycmF5IHNvcnRlZCBzbyB0aGF0IHdlIGNhbiBkbyB0aGUgYmluYXJ5IHNlYXJjaCAqLwotCXNvcnQoYXJtNjRfZnRyX3JlZ3MsCi0JCUFSUkFZX1NJWkUoYXJtNjRfZnRyX3JlZ3MpLAotCQlzaXplb2YoYXJtNjRfZnRyX3JlZ3NbMF0pLAotCQlzb3J0X2NtcF9mdHJfcmVncywKLQkJc3dhcF9mdHJfcmVncyk7CisJaW50IGk7CisKKwkvKiBDaGVjayB0aGF0IHRoZSBhcnJheSBpcyBzb3J0ZWQgc28gdGhhdCB3ZSBjYW4gZG8gdGhlIGJpbmFyeSBzZWFyY2ggKi8KKwlmb3IgKGkgPSAxOyBpIDwgQVJSQVlfU0laRShhcm02NF9mdHJfcmVncyk7IGkrKykKKwkJQlVHX09OKGFybTY0X2Z0cl9yZWdzW2ldLnN5c19pZCA8IGFybTY0X2Z0cl9yZWdzW2kgLSAxXS5zeXNfaWQpOwogfQogCiAvKgpAQCAtNDA3LDcgKzQxMiw3IEBACiB7CiAJdTY0IHZhbCA9IDA7CiAJdTY0IHN0cmljdF9tYXNrID0gfjB4MFVMTDsKLQlzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgKmZ0cnA7CisJY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzICpmdHJwOwogCXN0cnVjdCBhcm02NF9mdHJfcmVnICpyZWcgPSBnZXRfYXJtNjRfZnRyX3JlZyhzeXNfcmVnKTsKIAogCUJVR19PTighcmVnKTsKQEAgLTQ2NCw3ICs0NjksNyBAQAogCiBzdGF0aWMgdm9pZCB1cGRhdGVfY3B1X2Z0cl9yZWcoc3RydWN0IGFybTY0X2Z0cl9yZWcgKnJlZywgdTY0IG5ldykKIHsKLQlzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgKmZ0cnA7CisJY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzICpmdHJwOwogCiAJZm9yIChmdHJwID0gcmVnLT5mdHJfYml0czsgZnRycC0+d2lkdGg7IGZ0cnArKykgewogCQlzNjQgZnRyX2N1ciA9IGFybTY0X2Z0cl92YWx1ZShmdHJwLCByZWctPnN5c192YWwpOwpAQCAtMTAwNCwyNSArMTAwOSwzNSBAQAogICogY2Fubm90IGRvIGFueXRoaW5nIHRvIGZpeCBpdCB1cCBhbmQgY291bGQgY2F1c2UgdW5leHBlY3RlZCBmYWlsdXJlcy4gU28KICAqIHdlIHBhcmsgdGhlIENQVS4KICAqLwotdm9pZCB2ZXJpZnlfbG9jYWxfY3B1X2NhcGFiaWxpdGllcyh2b2lkKQorc3RhdGljIHZvaWQgdmVyaWZ5X2xvY2FsX2NwdV9jYXBhYmlsaXRpZXModm9pZCkKIHsKLQotCWNoZWNrX2Vhcmx5X2NwdV9mZWF0dXJlcygpOwotCi0JLyoKLQkgKiBJZiB3ZSBoYXZlbid0IGNvbXB1dGVkIHRoZSBzeXN0ZW0gY2FwYWJpbGl0aWVzLCB0aGVyZSBpcyBub3RoaW5nCi0JICogdG8gdmVyaWZ5LgotCSAqLwotCWlmICghc3lzX2NhcHNfaW5pdGlhbGlzZWQpCi0JCXJldHVybjsKLQotCXZlcmlmeV9sb2NhbF9jcHVfZXJyYXRhKCk7CisJdmVyaWZ5X2xvY2FsX2NwdV9lcnJhdGFfd29ya2Fyb3VuZHMoKTsKIAl2ZXJpZnlfbG9jYWxfY3B1X2ZlYXR1cmVzKGFybTY0X2ZlYXR1cmVzKTsKIAl2ZXJpZnlfbG9jYWxfZWxmX2h3Y2Fwcyhhcm02NF9lbGZfaHdjYXBzKTsKIAlpZiAoc3lzdGVtX3N1cHBvcnRzXzMyYml0X2VsMCgpKQogCQl2ZXJpZnlfbG9jYWxfZWxmX2h3Y2Fwcyhjb21wYXRfZWxmX2h3Y2Fwcyk7CiB9CiAKK3ZvaWQgY2hlY2tfbG9jYWxfY3B1X2NhcGFiaWxpdGllcyh2b2lkKQoreworCS8qCisJICogQWxsIHNlY29uZGFyeSBDUFVzIHNob3VsZCBjb25mb3JtIHRvIHRoZSBlYXJseSBDUFUgZmVhdHVyZXMKKwkgKiBpbiB1c2UgYnkgdGhlIGtlcm5lbCBiYXNlZCBvbiBib290IENQVS4KKwkgKi8KKwljaGVja19lYXJseV9jcHVfZmVhdHVyZXMoKTsKKworCS8qCisJICogSWYgd2UgaGF2ZW4ndCBmaW5hbGlzZWQgdGhlIHN5c3RlbSBjYXBhYmlsaXRpZXMsIHRoaXMgQ1BVIGdldHMKKwkgKiBhIGNoYW5jZSB0byB1cGRhdGUgdGhlIGVycmF0YSB3b3JrIGFyb3VuZHMuCisJICogT3RoZXJ3aXNlLCB0aGlzIENQVSBzaG91bGQgdmVyaWZ5IHRoYXQgaXQgaGFzIGFsbCB0aGUgc3lzdGVtCisJICogYWR2ZXJ0aXNlZCBjYXBhYmlsaXRpZXMuCisJICovCisJaWYgKCFzeXNfY2Fwc19pbml0aWFsaXNlZCkKKwkJdXBkYXRlX2NwdV9lcnJhdGFfd29ya2Fyb3VuZHMoKTsKKwllbHNlCisJCXZlcmlmeV9sb2NhbF9jcHVfY2FwYWJpbGl0aWVzKCk7Cit9CisKIHN0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9mZWF0dXJlX2NhcGFiaWxpdGllcyh2b2lkKQogewogCXVwZGF0ZV9jcHVfY2FwYWJpbGl0aWVzKGFybTY0X2ZlYXR1cmVzLCAiZGV0ZWN0ZWQgZmVhdHVyZToiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2NwdWluZm8uYyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdWluZm8uYwppbmRleCBlZDFiODRmLi5iM2Q1YjNlIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVpbmZvLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvY3B1aW5mby5jCkBAIC0zNjMsOCArMzYzLDYgQEAKIAl9CiAKIAljcHVpbmZvX2RldGVjdF9pY2FjaGVfcG9saWN5KGluZm8pOwotCi0JY2hlY2tfbG9jYWxfY3B1X2VycmF0YSgpOwogfQogCiB2b2lkIGNwdWluZm9fc3RvcmVfY3B1KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9kZWJ1Zy1tb25pdG9ycy5jIGIvYXJjaC9hcm02NC9rZXJuZWwvZGVidWctbW9uaXRvcnMuYwppbmRleCA5MWZmZjQ4Li43M2FlOTBlIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9kZWJ1Zy1tb25pdG9ycy5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2RlYnVnLW1vbml0b3JzLmMKQEAgLTQ2LDE2ICs0NiwxNCBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJbG9jYWxfZGJnX3NhdmUoZmxhZ3MpOwotCWFzbSB2b2xhdGlsZSgibXNyIG1kc2NyX2VsMSwgJTAiIDo6ICJyIiAobWRzY3IpKTsKKwl3cml0ZV9zeXNyZWcobWRzY3IsIG1kc2NyX2VsMSk7CiAJbG9jYWxfZGJnX3Jlc3RvcmUoZmxhZ3MpOwogfQogTk9LUFJPQkVfU1lNQk9MKG1kc2NyX3dyaXRlKTsKIAogc3RhdGljIHUzMiBtZHNjcl9yZWFkKHZvaWQpCiB7Ci0JdTMyIG1kc2NyOwotCWFzbSB2b2xhdGlsZSgibXJzICUwLCBtZHNjcl9lbDEiIDogIj1yIiAobWRzY3IpKTsKLQlyZXR1cm4gbWRzY3I7CisJcmV0dXJuIHJlYWRfc3lzcmVnKG1kc2NyX2VsMSk7CiB9CiBOT0tQUk9CRV9TWU1CT0wobWRzY3JfcmVhZCk7CiAKQEAgLTEzMiwzNiArMTMwLDE4IEBACiAvKgogICogT1MgbG9jayBjbGVhcmluZy4KICAqLwotc3RhdGljIHZvaWQgY2xlYXJfb3NfbG9jayh2b2lkICp1bnVzZWQpCitzdGF0aWMgaW50IGNsZWFyX29zX2xvY2sodW5zaWduZWQgaW50IGNwdSkKIHsKLQlhc20gdm9sYXRpbGUoIm1zciBvc2xhcl9lbDEsICUwIiA6IDogInIiICgwKSk7CisJd3JpdGVfc3lzcmVnKDAsIG9zbGFyX2VsMSk7CisJaXNiKCk7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb3NfbG9ja19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqZGF0YSkKLXsKLQlpZiAoKGFjdGlvbiAmIH5DUFVfVEFTS1NfRlJPWkVOKSA9PSBDUFVfT05MSU5FKQotCQljbGVhcl9vc19sb2NrKE5VTEwpOwotCXJldHVybiBOT1RJRllfT0s7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgb3NfbG9ja19uYiA9IHsKLQkubm90aWZpZXJfY2FsbCA9IG9zX2xvY2tfbm90aWZ5LAotfTsKLQogc3RhdGljIGludCBkZWJ1Z19tb25pdG9yc19pbml0KHZvaWQpCiB7Ci0JY3B1X25vdGlmaWVyX3JlZ2lzdGVyX2JlZ2luKCk7Ci0KLQkvKiBDbGVhciB0aGUgT1MgbG9jay4gKi8KLQlvbl9lYWNoX2NwdShjbGVhcl9vc19sb2NrLCBOVUxMLCAxKTsKLQlpc2IoKTsKLQotCS8qIFJlZ2lzdGVyIGhvdHBsdWcgaGFuZGxlci4gKi8KLQlfX3JlZ2lzdGVyX2NwdV9ub3RpZmllcigmb3NfbG9ja19uYik7Ci0KLQljcHVfbm90aWZpZXJfcmVnaXN0ZXJfZG9uZSgpOwotCXJldHVybiAwOworCXJldHVybiBjcHVocF9zZXR1cF9zdGF0ZShDUFVIUF9BUF9BUk02NF9ERUJVR19NT05JVE9SU19TVEFSVElORywKKwkJCQkgIkNQVUhQX0FQX0FSTTY0X0RFQlVHX01PTklUT1JTX1NUQVJUSU5HIiwKKwkJCQkgY2xlYXJfb3NfbG9jaywgTlVMTCk7CiB9CiBwb3N0Y29yZV9pbml0Y2FsbChkZWJ1Z19tb25pdG9yc19pbml0KTsKIApAQCAtMjU0LDcgKzIzNCw3IEBACiAJCXJldHVybiAwOwogCiAJaWYgKHVzZXJfbW9kZShyZWdzKSkgewotCQlzZW5kX3VzZXJfc2lndHJhcChUUkFQX0hXQktQVCk7CisJCXNlbmRfdXNlcl9zaWd0cmFwKFRSQVBfVFJBQ0UpOwogCiAJCS8qCiAJCSAqIHB0cmFjZSB3aWxsIGRpc2FibGUgc2luZ2xlIHN0ZXAgdW5sZXNzIGV4cGxpY2l0bHkKQEAgLTM4Miw3ICszNjIsNyBAQAogc3RhdGljIGludCBfX2luaXQgZGVidWdfdHJhcHNfaW5pdCh2b2lkKQogewogCWhvb2tfZGVidWdfZmF1bHRfY29kZShEQkdfRVNSX0VWVF9IV1NTLCBzaW5nbGVfc3RlcF9oYW5kbGVyLCBTSUdUUkFQLAotCQkJICAgICAgVFJBUF9IV0JLUFQsICJzaW5nbGUtc3RlcCBoYW5kbGVyIik7CisJCQkgICAgICBUUkFQX1RSQUNFLCAic2luZ2xlLXN0ZXAgaGFuZGxlciIpOwogCWhvb2tfZGVidWdfZmF1bHRfY29kZShEQkdfRVNSX0VWVF9CUkssIGJya19oYW5kbGVyLCBTSUdUUkFQLAogCQkJICAgICAgVFJBUF9CUktQVCwgInB0cmFjZSBCUksgaGFuZGxlciIpOwogCXJldHVybiAwOwpAQCAtNDM1LDggKzQxNSwxMCBAQAogLyogcHRyYWNlIEFQSSAqLwogdm9pZCB1c2VyX2VuYWJsZV9zaW5nbGVfc3RlcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7Ci0Jc2V0X3RpX3RocmVhZF9mbGFnKHRhc2tfdGhyZWFkX2luZm8odGFzayksIFRJRl9TSU5HTEVTVEVQKTsKLQlzZXRfcmVnc19zcHNyX3NzKHRhc2tfcHRfcmVncyh0YXNrKSk7CisJc3RydWN0IHRocmVhZF9pbmZvICp0aSA9IHRhc2tfdGhyZWFkX2luZm8odGFzayk7CisKKwlpZiAoIXRlc3RfYW5kX3NldF90aV90aHJlYWRfZmxhZyh0aSwgVElGX1NJTkdMRVNURVApKQorCQlzZXRfcmVnc19zcHNyX3NzKHRhc2tfcHRfcmVncyh0YXNrKSk7CiB9CiBOT0tQUk9CRV9TWU1CT0wodXNlcl9lbmFibGVfc2luZ2xlX3N0ZXApOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9lbnRyeS1mdHJhY2UuUyBiL2FyY2gvYXJtNjQva2VybmVsL2VudHJ5LWZ0cmFjZS5TCmluZGV4IDBmMDNhOGYuLmFlZjAyZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL2VudHJ5LWZ0cmFjZS5TCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2VudHJ5LWZ0cmFjZS5TCkBAIC0yMTksNyArMjE5LDcgQEAKICAqCiAgKiBSdW4gZnRyYWNlX3JldHVybl90b19oYW5kbGVyKCkgYmVmb3JlIGdvaW5nIGJhY2sgdG8gcGFyZW50LgogICogQGZwIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgdmFsdWUgcGFzc2VkIGJ5IGZ0cmFjZV9ncmFwaF9jYWxsZXIoKQotICogb25seSB3aGVuIENPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX0ZQX1RFU1QgaXMgZW5hYmxlZC4KKyAqIG9ubHkgd2hlbiBIQVZFX0ZVTkNUSU9OX0dSQVBIX0ZQX1RFU1QgaXMgZW5hYmxlZC4KICAqLwogRU5UUlkocmV0dXJuX3RvX2hhbmRsZXIpCiAJc2F2ZV9yZXR1cm5fcmVncwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvZW50cnkuUyBiL2FyY2gvYXJtNjQva2VybmVsL2VudHJ5LlMKaW5kZXggNDQxNDIwYy4uMjIzZDU0YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9lbnRyeS5TCkBAIC0xMDQsNyArMTA0LDcgQEAKIAlzdHIJeDIwLCBbc3AsICNTX09SSUdfQUREUl9MSU1JVF0KIAltb3YJeDIwLCAjVEFTS19TSVpFXzY0CiAJc3RyCXgyMCwgW3RzaywgI1RJX0FERFJfTElNSVRdCi0JQUxURVJOQVRJVkUobm9wLCBTRVRfUFNUQVRFX1VBTygwKSwgQVJNNjRfSEFTX1VBTywgQ09ORklHX0FSTTY0X1VBTykKKwkvKiBObyBuZWVkIHRvIHJlc2V0IFBTVEFURS5VQU8sIGhhcmR3YXJlJ3MgYWxyZWFkeSBzZXQgaXQgdG8gMCBmb3IgdXMgKi8KIAkuZW5kaWYgLyogXGVsID09IDAgKi8KIAltcnMJeDIyLCBlbHJfZWwxCiAJbXJzCXgyMywgc3Bzcl9lbDEKQEAgLTE1MCwxMyArMTUwLDcgQEAKIAlsZHIJeDIzLCBbc3AsICNTX1NQXQkJLy8gbG9hZCByZXR1cm4gc3RhY2sgcG9pbnRlcgogCW1zcglzcF9lbDAsIHgyMwogI2lmZGVmIENPTkZJR19BUk02NF9FUlJBVFVNXzg0NTcxOQotYWx0ZXJuYXRpdmVfaWZfbm90IEFSTTY0X1dPUktBUk9VTkRfODQ1NzE5Ci0Jbm9wCi0Jbm9wCi0jaWZkZWYgQ09ORklHX1BJRF9JTl9DT05URVhUSURSCi0Jbm9wCi0jZW5kaWYKLWFsdGVybmF0aXZlX2Vsc2UKK2FsdGVybmF0aXZlX2lmIEFSTTY0X1dPUktBUk9VTkRfODQ1NzE5CiAJdGJ6CXgyMiwgIzQsIDFmCiAjaWZkZWYgQ09ORklHX1BJRF9JTl9DT05URVhUSURSCiAJbXJzCXgyOSwgY29udGV4dGlkcl9lbDEKQEAgLTE2NSw3ICsxNTksNyBAQAogCW1zciBjb250ZXh0aWRyX2VsMSwgeHpyCiAjZW5kaWYKIDE6Ci1hbHRlcm5hdGl2ZV9lbmRpZgorYWx0ZXJuYXRpdmVfZWxzZV9ub3BfZW5kaWYKICNlbmRpZgogCS5lbmRpZgogCW1zcgllbHJfZWwxLCB4MjEJCQkvLyBzZXQgdXAgdGhlIHJldHVybiBkYXRhCkBAIC03MDcsMTggKzcwMSwxMyBAQAogICogT2ssIHdlIG5lZWQgdG8gZG8gZXh0cmEgcHJvY2Vzc2luZywgZW50ZXIgdGhlIHNsb3cgcGF0aC4KICAqLwogd29ya19wZW5kaW5nOgotCXRibnoJeDEsICNUSUZfTkVFRF9SRVNDSEVELCB3b3JrX3Jlc2NoZWQKLQkvKiBUSUZfU0lHUEVORElORywgVElGX05PVElGWV9SRVNVTUUgb3IgVElGX0ZPUkVJR05fRlBTVEFURSBjYXNlICovCiAJbW92CXgwLCBzcAkJCQkvLyAncmVncycKLQllbmFibGVfaXJxCQkJCS8vIGVuYWJsZSBpbnRlcnJ1cHRzIGZvciBkb19ub3RpZnlfcmVzdW1lKCkKIAlibAlkb19ub3RpZnlfcmVzdW1lCi0JYglyZXRfdG9fdXNlcgotd29ya19yZXNjaGVkOgogI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUwotCWJsCXRyYWNlX2hhcmRpcnFzX29mZgkJLy8gdGhlIElSUXMgYXJlIG9mZiBoZXJlLCBpbmZvcm0gdGhlIHRyYWNpbmcgY29kZQorCWJsCXRyYWNlX2hhcmRpcnFzX29uCQkvLyBlbmFibGVkIHdoaWxlIGluIHVzZXJzcGFjZQogI2VuZGlmCi0JYmwJc2NoZWR1bGUKLQorCWxkcgl4MSwgW3RzaywgI1RJX0ZMQUdTXQkJLy8gcmUtY2hlY2sgZm9yIHNpbmdsZS1zdGVwCisJYglmaW5pc2hfcmV0X3RvX3VzZXIKIC8qCiAgKiAic2xvdyIgc3lzY2FsbCByZXR1cm4gcGF0aC4KICAqLwpAQCAtNzI3LDYgKzcxNiw3IEBACiAJbGRyCXgxLCBbdHNrLCAjVElfRkxBR1NdCiAJYW5kCXgyLCB4MSwgI19USUZfV09SS19NQVNLCiAJY2Juegl4Miwgd29ya19wZW5kaW5nCitmaW5pc2hfcmV0X3RvX3VzZXI6CiAJZW5hYmxlX3N0ZXBfdHNrIHgxLCB4MgogCWtlcm5lbF9leGl0IDAKIEVORFBST0MocmV0X3RvX3VzZXIpCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9mcHNpbWQuYyBiL2FyY2gvYXJtNjQva2VybmVsL2Zwc2ltZC5jCmluZGV4IDk3NWIyNzQuLjM5NGM2MWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL2Zwc2ltZC5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2Zwc2ltZC5jCkBAIC0yOTksMjggKzI5OSwxNiBAQAogI2VuZGlmIC8qIENPTkZJR19DUFVfUE0gKi8KIAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotc3RhdGljIGludCBmcHNpbWRfY3B1X2hvdHBsdWdfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCi0JCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLAotCQkJCSAgICAgICB2b2lkICpoY3B1KQorc3RhdGljIGludCBmcHNpbWRfY3B1X2RlYWQodW5zaWduZWQgaW50IGNwdSkKIHsKLQl1bnNpZ25lZCBpbnQgY3B1ID0gKGxvbmcpaGNwdTsKLQotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBDUFVfREVBRDoKLQljYXNlIENQVV9ERUFEX0ZST1pFTjoKLQkJcGVyX2NwdShmcHNpbWRfbGFzdF9zdGF0ZSwgY3B1KSA9IE5VTEw7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gTk9USUZZX09LOworCXBlcl9jcHUoZnBzaW1kX2xhc3Rfc3RhdGUsIGNwdSkgPSBOVUxMOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGZwc2ltZF9jcHVfaG90cGx1Z19ub3RpZmllcl9ibG9jayA9IHsKLQkubm90aWZpZXJfY2FsbCA9IGZwc2ltZF9jcHVfaG90cGx1Z19ub3RpZmllciwKLX07Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBmcHNpbWRfaG90cGx1Z19pbml0KHZvaWQpCiB7Ci0JcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZmcHNpbWRfY3B1X2hvdHBsdWdfbm90aWZpZXJfYmxvY2spOworCWNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVJNNjRfRlBTSU1EX0RFQUQsICJhcm02NC9mcHNpbWQ6ZGVhZCIsCisJCQkJICBOVUxMLCBmcHNpbWRfY3B1X2RlYWQpOwogfQogCiAjZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvZnRyYWNlLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9mdHJhY2UuYwppbmRleCBlYmVjZjlhLi40MGFkMDhhIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9mdHJhY2UuYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9mdHJhY2UuYwpAQCAtMTM4LDcgKzEzOCw3IEBACiAJCXJldHVybjsKIAogCWVyciA9IGZ0cmFjZV9wdXNoX3JldHVybl90cmFjZShvbGQsIHNlbGZfYWRkciwgJnRyYWNlLmRlcHRoLAotCQkJCSAgICAgICBmcmFtZV9wb2ludGVyKTsKKwkJCQkgICAgICAgZnJhbWVfcG9pbnRlciwgTlVMTCk7CiAJaWYgKGVyciA9PSAtRUJVU1kpCiAJCXJldHVybjsKIAllbHNlCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9oZWFkLlMgYi9hcmNoL2FybTY0L2tlcm5lbC9oZWFkLlMKaW5kZXggYjc3ZjU4My4uNDI3ZjZkMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2hlYWQuUwpAQCAtMjA4LDEzICsyMDgsMjMgQEAKIAogCV9fSU5JVAogCisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIGNhbGxlZSBzYXZlZCBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIGFyZSB1c2VkIG9uIHRoZQorCSAqIHByaW1hcnkgbG93bGV2ZWwgYm9vdCBwYXRoOgorCSAqCisJICogIFJlZ2lzdGVyICAgU2NvcGUgICAgICAgICAgICAgICAgICAgICAgUHVycG9zZQorCSAqICB4MjEgICAgICAgIHN0ZXh0KCkgLi4gc3RhcnRfa2VybmVsKCkgIEZEVCBwb2ludGVyIHBhc3NlZCBhdCBib290IGluIHgwCisJICogIHgyMyAgICAgICAgc3RleHQoKSAuLiBzdGFydF9rZXJuZWwoKSAgcGh5c2ljYWwgbWlzYWxpZ25tZW50L0tBU0xSIG9mZnNldAorCSAqICB4MjggICAgICAgIF9fY3JlYXRlX3BhZ2VfdGFibGVzKCkgICAgIGNhbGxlZSBwcmVzZXJ2ZWQgdGVtcCByZWdpc3RlcgorCSAqICB4MTkveDIwICAgIF9fcHJpbWFyeV9zd2l0Y2goKSAgICAgICAgIGNhbGxlZSBwcmVzZXJ2ZWQgdGVtcCByZWdpc3RlcnMKKwkgKi8KIEVOVFJZKHN0ZXh0KQogCWJsCXByZXNlcnZlX2Jvb3RfYXJncwotCWJsCWVsMl9zZXR1cAkJCS8vIERyb3AgdG8gRUwxLCB3MjA9Y3B1X2Jvb3RfbW9kZQotCWFkcnAJeDI0LCBfX1BIWVNfT0ZGU0VUCi0JYW5kCXgyMywgeDI0LCBNSU5fS0lNR19BTElHTiAtIDEJLy8gS0FTTFIgb2Zmc2V0LCBkZWZhdWx0cyB0byAwCisJYmwJZWwyX3NldHVwCQkJLy8gRHJvcCB0byBFTDEsIHcwPWNwdV9ib290X21vZGUKKwlhZHJwCXgyMywgX19QSFlTX09GRlNFVAorCWFuZAl4MjMsIHgyMywgTUlOX0tJTUdfQUxJR04gLSAxCS8vIEtBU0xSIG9mZnNldCwgZGVmYXVsdHMgdG8gMAogCWJsCXNldF9jcHVfYm9vdF9tb2RlX2ZsYWcKLQlibAlfX2NyZWF0ZV9wYWdlX3RhYmxlcwkJLy8geDI1PVRUQlIwLCB4MjY9VFRCUjEKKwlibAlfX2NyZWF0ZV9wYWdlX3RhYmxlcwogCS8qCiAJICogVGhlIGZvbGxvd2luZyBjYWxscyBDUFUgc2V0dXAgY29kZSwgc2VlIGFyY2gvYXJtNjQvbW0vcHJvYy5TIGZvcgogCSAqIGRldGFpbHMuCkBAIC0yMjIsOSArMjMyLDcgQEAKIAkgKiB0aGUgVENSIHdpbGwgaGF2ZSBiZWVuIHNldC4KIAkgKi8KIAlibAlfX2NwdV9zZXR1cAkJCS8vIGluaXRpYWxpc2UgcHJvY2Vzc29yCi0JYWRyX2wJeDI3LCBfX3ByaW1hcnlfc3dpdGNoCQkvLyBhZGRyZXNzIHRvIGp1bXAgdG8gYWZ0ZXIKLQkJCQkJCS8vIE1NVSBoYXMgYmVlbiBlbmFibGVkCi0JYglfX2VuYWJsZV9tbXUKKwliCV9fcHJpbWFyeV9zd2l0Y2gKIEVORFBST0Moc3RleHQpCiAKIC8qCkBAIC0zMTEsMjMgKzMxOSwyMSBAQAogICogICAgIGJlZW4gZW5hYmxlZAogICovCiBfX2NyZWF0ZV9wYWdlX3RhYmxlczoKLQlhZHJwCXgyNSwgaWRtYXBfcGdfZGlyCi0JYWRycAl4MjYsIHN3YXBwZXJfcGdfZGlyCiAJbW92CXgyOCwgbHIKIAogCS8qCiAJICogSW52YWxpZGF0ZSB0aGUgaWRtYXAgYW5kIHN3YXBwZXIgcGFnZSB0YWJsZXMgdG8gYXZvaWQgcG90ZW50aWFsCiAJICogZGlydHkgY2FjaGUgbGluZXMgYmVpbmcgZXZpY3RlZC4KIAkgKi8KLQltb3YJeDAsIHgyNQotCWFkZAl4MSwgeDI2LCAjU1dBUFBFUl9ESVJfU0laRQorCWFkcnAJeDAsIGlkbWFwX3BnX2RpcgorCWFkcnAJeDEsIHN3YXBwZXJfcGdfZGlyICsgU1dBUFBFUl9ESVJfU0laRQogCWJsCV9faW52YWxfY2FjaGVfcmFuZ2UKIAogCS8qCiAJICogQ2xlYXIgdGhlIGlkbWFwIGFuZCBzd2FwcGVyIHBhZ2UgdGFibGVzLgogCSAqLwotCW1vdgl4MCwgeDI1Ci0JYWRkCXg2LCB4MjYsICNTV0FQUEVSX0RJUl9TSVpFCisJYWRycAl4MCwgaWRtYXBfcGdfZGlyCisJYWRycAl4Niwgc3dhcHBlcl9wZ19kaXIgKyBTV0FQUEVSX0RJUl9TSVpFCiAxOglzdHAJeHpyLCB4enIsIFt4MF0sICMxNgogCXN0cAl4enIsIHh6ciwgW3gwXSwgIzE2CiAJc3RwCXh6ciwgeHpyLCBbeDBdLCAjMTYKQEAgLTM0MCw3ICszNDYsNyBAQAogCS8qCiAJICogQ3JlYXRlIHRoZSBpZGVudGl0eSBtYXBwaW5nLgogCSAqLwotCW1vdgl4MCwgeDI1CQkJCS8vIGlkbWFwX3BnX2RpcgorCWFkcnAJeDAsIGlkbWFwX3BnX2RpcgogCWFkcnAJeDMsIF9faWRtYXBfdGV4dF9zdGFydAkJLy8gX19wYShfX2lkbWFwX3RleHRfc3RhcnQpCiAKICNpZm5kZWYgQ09ORklHX0FSTTY0X1ZBX0JJVFNfNDgKQEAgLTM5MCw3ICszOTYsNyBAQAogCS8qCiAJICogTWFwIHRoZSBrZXJuZWwgaW1hZ2UgKHN0YXJ0aW5nIHdpdGggUEhZU19PRkZTRVQpLgogCSAqLwotCW1vdgl4MCwgeDI2CQkJCS8vIHN3YXBwZXJfcGdfZGlyCisJYWRycAl4MCwgc3dhcHBlcl9wZ19kaXIKIAltb3ZfcQl4NSwgS0lNQUdFX1ZBRERSICsgVEVYVF9PRkZTRVQJLy8gY29tcGlsZSB0aW1lIF9fdmEoX3RleHQpCiAJYWRkCXg1LCB4NSwgeDIzCQkJLy8gYWRkIEtBU0xSIGRpc3BsYWNlbWVudAogCWNyZWF0ZV9wZ2RfZW50cnkgeDAsIHg1LCB4MywgeDYKQEAgLTQwNSw4ICs0MTEsOCBAQAogCSAqIGFjY2Vzc2VzIChNTVUgZGlzYWJsZWQpLCBpbnZhbGlkYXRlIHRoZSBpZG1hcCBhbmQgc3dhcHBlciBwYWdlCiAJICogdGFibGVzIGFnYWluIHRvIHJlbW92ZSBhbnkgc3BlY3VsYXRpdmVseSBsb2FkZWQgY2FjaGUgbGluZXMuCiAJICovCi0JbW92CXgwLCB4MjUKLQlhZGQJeDEsIHgyNiwgI1NXQVBQRVJfRElSX1NJWkUKKwlhZHJwCXgwLCBpZG1hcF9wZ19kaXIKKwlhZHJwCXgxLCBzd2FwcGVyX3BnX2RpciArIFNXQVBQRVJfRElSX1NJWkUKIAlkbWIJc3kKIAlibAlfX2ludmFsX2NhY2hlX3JhbmdlCiAKQEAgLTQxNiwxNCArNDIyLDI3IEBACiAKIC8qCiAgKiBUaGUgZm9sbG93aW5nIGZyYWdtZW50IG9mIGNvZGUgaXMgZXhlY3V0ZWQgd2l0aCB0aGUgTU1VIGVuYWJsZWQuCisgKgorICogICB4MCA9IF9fUEhZU19PRkZTRVQKICAqLwotCS5zZXQJaW5pdGlhbF9zcCwgaW5pdF90aHJlYWRfdW5pb24gKyBUSFJFQURfU1RBUlRfU1AKIF9fcHJpbWFyeV9zd2l0Y2hlZDoKLQltb3YJeDI4LCBscgkJCQkvLyBwcmVzZXJ2ZSBMUgorCWFkcnAJeDQsIGluaXRfdGhyZWFkX3VuaW9uCisJYWRkCXNwLCB4NCwgI1RIUkVBRF9TSVpFCisJbXNyCXNwX2VsMCwgeDQJCQkvLyBTYXZlIHRocmVhZF9pbmZvCisKIAlhZHJfbAl4OCwgdmVjdG9ycwkJCS8vIGxvYWQgVkJBUl9FTDEgd2l0aCB2aXJ0dWFsCiAJbXNyCXZiYXJfZWwxLCB4OAkJCS8vIHZlY3RvciB0YWJsZSBhZGRyZXNzCiAJaXNiCiAKKwlzdHAJeHpyLCB4MzAsIFtzcCwgIy0xNl0hCisJbW92CXgyOSwgc3AKKworCXN0cl9sCXgyMSwgX19mZHRfcG9pbnRlciwgeDUJCS8vIFNhdmUgRkRUIHBvaW50ZXIKKworCWxkcl9sCXg0LCBraW1hZ2VfdmFkZHIJCS8vIFNhdmUgdGhlIG9mZnNldCBiZXR3ZWVuCisJc3ViCXg0LCB4NCwgeDAJCQkvLyB0aGUga2VybmVsIHZpcnR1YWwgYW5kCisJc3RyX2wJeDQsIGtpbWFnZV92b2Zmc2V0LCB4NQkJLy8gcGh5c2ljYWwgbWFwcGluZ3MKKwogCS8vIENsZWFyIEJTUwogCWFkcl9sCXgwLCBfX2Jzc19zdGFydAogCW1vdgl4MSwgeHpyCkBAIC00MzIsMTcgKzQ1MSw2IEBACiAJYmwJX19waV9tZW1zZXQKIAlkc2IJaXNoc3QJCQkJLy8gTWFrZSB6ZXJvIHBhZ2UgdmlzaWJsZSB0byBQVFcKIAotCWFkcl9sCXNwLCBpbml0aWFsX3NwLCB4NAotCW1vdgl4NCwgc3AKLQlhbmQJeDQsIHg0LCAjfihUSFJFQURfU0laRSAtIDEpCi0JbXNyCXNwX2VsMCwgeDQJCQkvLyBTYXZlIHRocmVhZF9pbmZvCi0Jc3RyX2wJeDIxLCBfX2ZkdF9wb2ludGVyLCB4NQkJLy8gU2F2ZSBGRFQgcG9pbnRlcgotCi0JbGRyX2wJeDQsIGtpbWFnZV92YWRkcgkJLy8gU2F2ZSB0aGUgb2Zmc2V0IGJldHdlZW4KLQlzdWIJeDQsIHg0LCB4MjQJCQkvLyB0aGUga2VybmVsIHZpcnR1YWwgYW5kCi0Jc3RyX2wJeDQsIGtpbWFnZV92b2Zmc2V0LCB4NQkJLy8gcGh5c2ljYWwgbWFwcGluZ3MKLQotCW1vdgl4MjksICMwCiAjaWZkZWYgQ09ORklHX0tBU0FOCiAJYmwJa2FzYW5fZWFybHlfaW5pdAogI2VuZGlmCkBAIC00NTQsOCArNDYyLDggQEAKIAlibAlrYXNscl9lYXJseV9pbml0CQkvLyBwYXJzZSBGRFQgZm9yIEtBU0xSIG9wdGlvbnMKIAljYnoJeDAsIDBmCQkJCS8vIEtBU0xSIGRpc2FibGVkPyBqdXN0IHByb2NlZWQKIAlvcnIJeDIzLCB4MjMsIHgwCQkJLy8gcmVjb3JkIEtBU0xSIG9mZnNldAotCXJldAl4MjgJCQkJLy8gd2UgbXVzdCBlbmFibGUgS0FTTFIsIHJldHVybgotCQkJCQkJLy8gdG8gX19lbmFibGVfbW11KCkKKwlsZHAJeDI5LCB4MzAsIFtzcF0sICMxNgkJLy8gd2UgbXVzdCBlbmFibGUgS0FTTFIsIHJldHVybgorCXJldAkJCQkJLy8gdG8gX19wcmltYXJ5X3N3aXRjaCgpCiAwOgogI2VuZGlmCiAJYglzdGFydF9rZXJuZWwKQEAgLTQ2NSw3ICs0NzMsNyBAQAogICogZW5kIGVhcmx5IGhlYWQgc2VjdGlvbiwgYmVnaW4gaGVhZCBjb2RlIHRoYXQgaXMgYWxzbyB1c2VkIGZvcgogICogaG90cGx1ZyBhbmQgbmVlZHMgdG8gaGF2ZSB0aGUgc2FtZSBwcm90ZWN0aW9ucyBhcyB0aGUgdGV4dCByZWdpb24KICAqLwotCS5zZWN0aW9uICIudGV4dCIsImF4IgorCS5zZWN0aW9uICIuaWRtYXAudGV4dCIsImF4IgogCiBFTlRSWShraW1hZ2VfdmFkZHIpCiAJLnF1YWQJCV90ZXh0IC0gVEVYVF9PRkZTRVQKQEAgLTQ5MCw3ICs0OTgsNyBAQAogQ1BVX0JFKAlvcnIJeDAsIHgwLCAjKDMgPDwgMjQpCSkJLy8gU2V0IHRoZSBFRSBhbmQgRTBFIGJpdHMgZm9yIEVMMQogQ1BVX0xFKAliaWMJeDAsIHgwLCAjKDMgPDwgMjQpCSkJLy8gQ2xlYXIgdGhlIEVFIGFuZCBFMEUgYml0cyBmb3IgRUwxCiAJbXNyCXNjdGxyX2VsMSwgeDAKLQltb3YJdzIwLCAjQk9PVF9DUFVfTU9ERV9FTDEJCS8vIFRoaXMgY3B1IGJvb3RlZCBpbiBFTDEKKwltb3YJdzAsICNCT09UX0NQVV9NT0RFX0VMMQkJLy8gVGhpcyBjcHUgYm9vdGVkIGluIEVMMQogCWlzYgogCXJldAogCkBAIC01ODYsNyArNTk0LDcgQEAKIAogCWNiegl4MiwgaW5zdGFsbF9lbDJfc3R1YgogCi0JbW92CXcyMCwgI0JPT1RfQ1BVX01PREVfRUwyCQkvLyBUaGlzIENQVSBib290ZWQgaW4gRUwyCisJbW92CXcwLCAjQk9PVF9DUFVfTU9ERV9FTDIJCS8vIFRoaXMgQ1BVIGJvb3RlZCBpbiBFTDIKIAlpc2IKIAlyZXQKIApAQCAtNjAxLDcgKzYwOSw3IEBACiAJCSAgICAgIFBTUl9NT0RFX0VMMWgpCiAJbXNyCXNwc3JfZWwyLCB4MAogCW1zcgllbHJfZWwyLCBscgotCW1vdgl3MjAsICNCT09UX0NQVV9NT0RFX0VMMgkJLy8gVGhpcyBDUFUgYm9vdGVkIGluIEVMMgorCW1vdgl3MCwgI0JPT1RfQ1BVX01PREVfRUwyCQkvLyBUaGlzIENQVSBib290ZWQgaW4gRUwyCiAJZXJldAogRU5EUFJPQyhlbDJfc2V0dXApCiAKQEAgLTYxMSwyNyArNjE5LDM5IEBACiAgKi8KIHNldF9jcHVfYm9vdF9tb2RlX2ZsYWc6CiAJYWRyX2wJeDEsIF9fYm9vdF9jcHVfbW9kZQotCWNtcAl3MjAsICNCT09UX0NQVV9NT0RFX0VMMgorCWNtcAl3MCwgI0JPT1RfQ1BVX01PREVfRUwyCiAJYi5uZQkxZgogCWFkZAl4MSwgeDEsICM0Ci0xOglzdHIJdzIwLCBbeDFdCQkJLy8gVGhpcyBDUFUgaGFzIGJvb3RlZCBpbiBFTDEKKzE6CXN0cgl3MCwgW3gxXQkJCS8vIFRoaXMgQ1BVIGhhcyBib290ZWQgaW4gRUwxCiAJZG1iCXN5CiAJZGMJaXZhYywgeDEJCQkvLyBJbnZhbGlkYXRlIHBvdGVudGlhbGx5IHN0YWxlIGNhY2hlIGxpbmUKIAlyZXQKIEVORFBST0Moc2V0X2NwdV9ib290X21vZGVfZmxhZykKIAogLyoKKyAqIFRoZXNlIHZhbHVlcyBhcmUgd3JpdHRlbiB3aXRoIHRoZSBNTVUgb2ZmLCBidXQgcmVhZCB3aXRoIHRoZSBNTVUgb24uCisgKiBXcml0ZXJzIHdpbGwgaW52YWxpZGF0ZSB0aGUgY29ycmVzcG9uZGluZyBhZGRyZXNzLCBkaXNjYXJkaW5nIHVwIHRvIGEKKyAqICdDYWNoZSBXcml0ZWJhY2sgR3JhbnVsZScgKENXRykgd29ydGggb2YgZGF0YS4gVGhlIGxpbmtlciBzY3JpcHQgZW5zdXJlcworICogc3VmZmljaWVudCBhbGlnbm1lbnQgdGhhdCB0aGUgQ1dHIGRvZXNuJ3Qgb3ZlcmxhcCBhbm90aGVyIHNlY3Rpb24uCisgKi8KKwkucHVzaHNlY3Rpb24gIi5tbXVvZmYuZGF0YS53cml0ZSIsICJhdyIKKy8qCiAgKiBXZSBuZWVkIHRvIGZpbmQgb3V0IHRoZSBDUFUgYm9vdCBtb2RlIGxvbmcgYWZ0ZXIgYm9vdCwgc28gd2UgbmVlZCB0bwogICogc3RvcmUgaXQgaW4gYSB3cml0YWJsZSB2YXJpYWJsZS4KICAqCiAgKiBUaGlzIGlzIG5vdCBpbiAuYnNzLCBiZWNhdXNlIHdlIHNldCBpdCBzdWZmaWNpZW50bHkgZWFybHkgdGhhdCB0aGUgYm9vdC10aW1lCiAgKiB6ZXJvaW5nIG9mIC5ic3Mgd291bGQgY2xvYmJlciBpdC4KICAqLwotCS5wdXNoc2VjdGlvbgkuZGF0YS4uY2FjaGVsaW5lX2FsaWduZWQKLQkuYWxpZ24JTDFfQ0FDSEVfU0hJRlQKIEVOVFJZKF9fYm9vdF9jcHVfbW9kZSkKIAkubG9uZwlCT09UX0NQVV9NT0RFX0VMMgogCS5sb25nCUJPT1RfQ1BVX01PREVfRUwxCisvKgorICogVGhlIGJvb3RpbmcgQ1BVIHVwZGF0ZXMgdGhlIGZhaWxlZCBzdGF0dXMgQF9fZWFybHlfY3B1X2Jvb3Rfc3RhdHVzLAorICogd2l0aCBNTVUgdHVybmVkIG9mZi4KKyAqLworRU5UUlkoX19lYXJseV9jcHVfYm9vdF9zdGF0dXMpCisJLmxvbmcgCTAKKwogCS5wb3BzZWN0aW9uCiAKIAkvKgpAQCAtNjM5LDcgKzY1OSw3IEBACiAJICogY29yZXMgYXJlIGhlbGQgdW50aWwgd2UncmUgcmVhZHkgZm9yIHRoZW0gdG8gaW5pdGlhbGlzZS4KIAkgKi8KIEVOVFJZKHNlY29uZGFyeV9ob2xkaW5nX3BlbikKLQlibAllbDJfc2V0dXAJCQkvLyBEcm9wIHRvIEVMMSwgdzIwPWNwdV9ib290X21vZGUKKwlibAllbDJfc2V0dXAJCQkvLyBEcm9wIHRvIEVMMSwgdzA9Y3B1X2Jvb3RfbW9kZQogCWJsCXNldF9jcHVfYm9vdF9tb2RlX2ZsYWcKIAltcnMJeDAsIG1waWRyX2VsMQogCW1vdl9xCXgxLCBNUElEUl9IV0lEX0JJVE1BU0sKQEAgLTY2NiwxMiArNjg2LDEwIEBACiAJLyoKIAkgKiBDb21tb24gZW50cnkgcG9pbnQgZm9yIHNlY29uZGFyeSBDUFVzLgogCSAqLwotCWFkcnAJeDI1LCBpZG1hcF9wZ19kaXIKLQlhZHJwCXgyNiwgc3dhcHBlcl9wZ19kaXIKIAlibAlfX2NwdV9zZXR1cAkJCS8vIGluaXRpYWxpc2UgcHJvY2Vzc29yCi0KLQlhZHJfbAl4MjcsIF9fc2Vjb25kYXJ5X3N3aXRjaAkJLy8gYWRkcmVzcyB0byBqdW1wIHRvIGFmdGVyIGVuYWJsaW5nIHRoZSBNTVUKLQliCV9fZW5hYmxlX21tdQorCWJsCV9fZW5hYmxlX21tdQorCWxkcgl4OCwgPV9fc2Vjb25kYXJ5X3N3aXRjaGVkCisJYnIJeDgKIEVORFBST0Moc2Vjb25kYXJ5X3N0YXJ0dXApCiAKIF9fc2Vjb25kYXJ5X3N3aXRjaGVkOgpAQCAtNzA2LDMzICs3MjQsMjcgQEAKIAlkYwlpdmFjLCBcdG1wMQkJCS8vIEludmFsaWRhdGUgcG90ZW50aWFsbHkgc3RhbGUgY2FjaGUgbGluZQogCS5lbmRtCiAKLQkucHVzaHNlY3Rpb24JLmRhdGEuLmNhY2hlbGluZV9hbGlnbmVkCi0JLmFsaWduCUwxX0NBQ0hFX1NISUZUCi1FTlRSWShfX2Vhcmx5X2NwdV9ib290X3N0YXR1cykKLQkubG9uZyAJMAotCS5wb3BzZWN0aW9uCi0KIC8qCiAgKiBFbmFibGUgdGhlIE1NVS4KICAqCiAgKiAgeDAgID0gU0NUTFJfRUwxIHZhbHVlIGZvciB0dXJuaW5nIG9uIHRoZSBNTVUuCi0gKiAgeDI3ID0gKnZpcnR1YWwqIGFkZHJlc3MgdG8ganVtcCB0byB1cG9uIGNvbXBsZXRpb24KICAqCi0gKiBPdGhlciByZWdpc3RlcnMgZGVwZW5kIG9uIHRoZSBmdW5jdGlvbiBjYWxsZWQgdXBvbiBjb21wbGV0aW9uLgorICogUmV0dXJucyB0byB0aGUgY2FsbGVyIHZpYSB4MzAvbHIuIFRoaXMgcmVxdWlyZXMgdGhlIGNhbGxlciB0byBiZSBjb3ZlcmVkCisgKiBieSB0aGUgLmlkbWFwLnRleHQgc2VjdGlvbi4KICAqCiAgKiBDaGVja3MgaWYgdGhlIHNlbGVjdGVkIGdyYW51bGUgc2l6ZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIENQVS4KICAqIElmIGl0IGlzbid0LCBwYXJrIHRoZSBDUFUKICAqLwotCS5zZWN0aW9uCSIuaWRtYXAudGV4dCIsICJheCIKIEVOVFJZKF9fZW5hYmxlX21tdSkKLQltcnMJeDIyLCBzY3Rscl9lbDEJCQkvLyBwcmVzZXJ2ZSBvbGQgU0NUTFJfRUwxIHZhbHVlCiAJbXJzCXgxLCBJRF9BQTY0TU1GUjBfRUwxCiAJdWJmeAl4MiwgeDEsICNJRF9BQTY0TU1GUjBfVEdSQU5fU0hJRlQsIDQKIAljbXAJeDIsICNJRF9BQTY0TU1GUjBfVEdSQU5fU1VQUE9SVEVECiAJYi5uZQlfX25vX2dyYW51bGVfc3VwcG9ydAogCXVwZGF0ZV9lYXJseV9jcHVfYm9vdF9zdGF0dXMgMCwgeDEsIHgyCi0JbXNyCXR0YnIwX2VsMSwgeDI1CQkJLy8gbG9hZCBUVEJSMAotCW1zcgl0dGJyMV9lbDEsIHgyNgkJCS8vIGxvYWQgVFRCUjEKKwlhZHJwCXgxLCBpZG1hcF9wZ19kaXIKKwlhZHJwCXgyLCBzd2FwcGVyX3BnX2RpcgorCW1zcgl0dGJyMF9lbDEsIHgxCQkJLy8gbG9hZCBUVEJSMAorCW1zcgl0dGJyMV9lbDEsIHgyCQkJLy8gbG9hZCBUVEJSMQogCWlzYgogCW1zcglzY3Rscl9lbDEsIHgwCiAJaXNiCkBAIC03NDQsMjYgKzc1Niw3IEBACiAJaWMJaWFsbHUKIAlkc2IJbnNoCiAJaXNiCi0jaWZkZWYgQ09ORklHX1JBTkRPTUlaRV9CQVNFCi0JbW92CXgxOSwgeDAJCQkJLy8gcHJlc2VydmUgbmV3IFNDVExSX0VMMSB2YWx1ZQotCWJscgl4MjcKLQotCS8qCi0JICogSWYgd2UgcmV0dXJuIGhlcmUsIHdlIGhhdmUgYSBLQVNMUiBkaXNwbGFjZW1lbnQgaW4geDIzIHdoaWNoIHdlIG5lZWQKLQkgKiB0byB0YWtlIGludG8gYWNjb3VudCBieSBkaXNjYXJkaW5nIHRoZSBjdXJyZW50IGtlcm5lbCBtYXBwaW5nIGFuZAotCSAqIGNyZWF0aW5nIGEgbmV3IG9uZS4KLQkgKi8KLQltc3IJc2N0bHJfZWwxLCB4MjIJCQkvLyBkaXNhYmxlIHRoZSBNTVUKLQlpc2IKLQlibAlfX2NyZWF0ZV9wYWdlX3RhYmxlcwkJLy8gcmVjcmVhdGUga2VybmVsIG1hcHBpbmcKLQotCW1zcglzY3Rscl9lbDEsIHgxOQkJCS8vIHJlLWVuYWJsZSB0aGUgTU1VCi0JaXNiCi0JaWMJaWFsbHUJCQkJLy8gZmx1c2ggaW5zdHJ1Y3Rpb25zIGZldGNoZWQKLQlkc2IJbnNoCQkJCS8vIHZpYSBvbGQgbWFwcGluZwotCWlzYgotI2VuZGlmCi0JYnIJeDI3CisJcmV0CiBFTkRQUk9DKF9fZW5hYmxlX21tdSkKIAogX19ub19ncmFudWxlX3N1cHBvcnQ6CkBAIC03NzIsMTEgKzc2NSwxMSBAQAogMToKIAl3ZmUKIAl3ZmkKLQliIDFiCisJYgkxYgogRU5EUFJPQyhfX25vX2dyYW51bGVfc3VwcG9ydCkKIAotX19wcmltYXJ5X3N3aXRjaDoKICNpZmRlZiBDT05GSUdfUkVMT0NBVEFCTEUKK19fcmVsb2NhdGVfa2VybmVsOgogCS8qCiAJICogSXRlcmF0ZSBvdmVyIGVhY2ggZW50cnkgaW4gdGhlIHJlbG9jYXRpb24gdGFibGUsIGFuZCBhcHBseSB0aGUKIAkgKiByZWxvY2F0aW9ucyBpbiBwbGFjZS4KQEAgLTc5OCwxNCArNzkxLDQ2IEBACiAJYWRkCXgxMywgeDEzLCB4MjMJCQkvLyByZWxvY2F0ZQogCXN0cgl4MTMsIFt4MTEsIHgyM10KIAliCTBiCisxOglyZXQKK0VORFBST0MoX19yZWxvY2F0ZV9rZXJuZWwpCisjZW5kaWYKIAotMToKK19fcHJpbWFyeV9zd2l0Y2g6CisjaWZkZWYgQ09ORklHX1JBTkRPTUlaRV9CQVNFCisJbW92CXgxOSwgeDAJCQkJLy8gcHJlc2VydmUgbmV3IFNDVExSX0VMMSB2YWx1ZQorCW1ycwl4MjAsIHNjdGxyX2VsMQkJCS8vIHByZXNlcnZlIG9sZCBTQ1RMUl9FTDEgdmFsdWUKKyNlbmRpZgorCisJYmwJX19lbmFibGVfbW11CisjaWZkZWYgQ09ORklHX1JFTE9DQVRBQkxFCisJYmwJX19yZWxvY2F0ZV9rZXJuZWwKKyNpZmRlZiBDT05GSUdfUkFORE9NSVpFX0JBU0UKKwlsZHIJeDgsID1fX3ByaW1hcnlfc3dpdGNoZWQKKwlhZHJwCXgwLCBfX1BIWVNfT0ZGU0VUCisJYmxyCXg4CisKKwkvKgorCSAqIElmIHdlIHJldHVybiBoZXJlLCB3ZSBoYXZlIGEgS0FTTFIgZGlzcGxhY2VtZW50IGluIHgyMyB3aGljaCB3ZSBuZWVkCisJICogdG8gdGFrZSBpbnRvIGFjY291bnQgYnkgZGlzY2FyZGluZyB0aGUgY3VycmVudCBrZXJuZWwgbWFwcGluZyBhbmQKKwkgKiBjcmVhdGluZyBhIG5ldyBvbmUuCisJICovCisJbXNyCXNjdGxyX2VsMSwgeDIwCQkJLy8gZGlzYWJsZSB0aGUgTU1VCisJaXNiCisJYmwJX19jcmVhdGVfcGFnZV90YWJsZXMJCS8vIHJlY3JlYXRlIGtlcm5lbCBtYXBwaW5nCisKKwl0bGJpCXZtYWxsZTEJCQkJLy8gUmVtb3ZlIGFueSBzdGFsZSBUTEIgZW50cmllcworCWRzYgluc2gKKworCW1zcglzY3Rscl9lbDEsIHgxOQkJCS8vIHJlLWVuYWJsZSB0aGUgTU1VCisJaXNiCisJaWMJaWFsbHUJCQkJLy8gZmx1c2ggaW5zdHJ1Y3Rpb25zIGZldGNoZWQKKwlkc2IJbnNoCQkJCS8vIHZpYSBvbGQgbWFwcGluZworCWlzYgorCisJYmwJX19yZWxvY2F0ZV9rZXJuZWwKKyNlbmRpZgogI2VuZGlmCiAJbGRyCXg4LCA9X19wcmltYXJ5X3N3aXRjaGVkCisJYWRycAl4MCwgX19QSFlTX09GRlNFVAogCWJyCXg4CiBFTkRQUk9DKF9fcHJpbWFyeV9zd2l0Y2gpCi0KLV9fc2Vjb25kYXJ5X3N3aXRjaDoKLQlsZHIJeDgsID1fX3NlY29uZGFyeV9zd2l0Y2hlZAotCWJyCXg4Ci1FTkRQUk9DKF9fc2Vjb25kYXJ5X3N3aXRjaCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2hpYmVybmF0ZS1hc20uUyBiL2FyY2gvYXJtNjQva2VybmVsL2hpYmVybmF0ZS1hc20uUwppbmRleCA0NmYyOWI2Li5lNTZkODQ4IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9oaWJlcm5hdGUtYXNtLlMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvaGliZXJuYXRlLWFzbS5TCkBAIC0zNiw4ICszNiw4IEBACiAubWFjcm8gYnJlYWtfYmVmb3JlX21ha2VfdHRicl9zd2l0Y2ggemVyb19wYWdlLCBwYWdlX3RhYmxlCiAJbXNyCXR0YnIxX2VsMSwgXHplcm9fcGFnZQogCWlzYgotCXRsYmkJdm1hbGxlMWlzCi0JZHNiCWlzaAorCXRsYmkJdm1hbGxlMQorCWRzYgluc2gKIAltc3IJdHRicjFfZWwxLCBccGFnZV90YWJsZQogCWlzYgogLmVuZG0KQEAgLTk2LDcgKzk2LDcgQEAKIAogCWFkZAl4MSwgeDEwLCAjUEFHRV9TSVpFCiAJLyogQ2xlYW4gdGhlIGNvcGllZCBwYWdlIHRvIFBvVSAtIGJhc2VkIG9uIGZsdXNoX2ljYWNoZV9yYW5nZSgpICovCi0JZGNhY2hlX2xpbmVfc2l6ZSB4MiwgeDMKKwlyYXdfZGNhY2hlX2xpbmVfc2l6ZSB4MiwgeDMKIAlzdWIJeDMsIHgyLCAjMQogCWJpYwl4NCwgeDEwLCB4MwogMjoJZGMJY3ZhdSwgeDQJLyogY2xlYW4gRCBsaW5lIC8gdW5pZmllZCBsaW5lICovCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9oaWJlcm5hdGUuYyBiL2FyY2gvYXJtNjQva2VybmVsL2hpYmVybmF0ZS5jCmluZGV4IDY1ZDgxZjkuLmQ1NWE3YjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL2hpYmVybmF0ZS5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2hpYmVybmF0ZS5jCkBAIC0xNSw5ICsxNSw5IEBACiAgKiBMaWNlbnNlIHRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSB2ZXJzaW9uIDIKICAqLwogI2RlZmluZSBwcl9mbXQoeCkgImhpYmVybmF0ZTogIiB4CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KQEAgLTI2LDYgKzI2LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9iYXJyaWVyLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vY3B1dHlwZS5oPgogI2luY2x1ZGUgPGFzbS9pcnFmbGFncy5oPgogI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KQEAgLTM0LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS1od2RlZi5oPgogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KKyNpbmNsdWRlIDxhc20vc21wX3BsYXQuaD4KICNpbmNsdWRlIDxhc20vc3VzcGVuZC5oPgogI2luY2x1ZGUgPGFzbS9zeXNyZWcuaD4KICNpbmNsdWRlIDxhc20vdmlydC5oPgpAQCAtNTQsMTIgKzU2LDYgQEAKIC8qIERvIHdlIG5lZWQgdG8gcmVzZXQgZWwyPyAqLwogI2RlZmluZSBlbDJfcmVzZXRfbmVlZGVkKCkgKGlzX2h5cF9tb2RlX2F2YWlsYWJsZSgpICYmICFpc19rZXJuZWxfaW5faHlwX21vZGUoKSkKIAotLyoKLSAqIFN0YXJ0L2VuZCBvZiB0aGUgaGliZXJuYXRlIGV4aXQgY29kZSwgdGhpcyBtdXN0IGJlIGNvcGllZCB0byBhICdzYWZlJwotICogbG9jYXRpb24gaW4gbWVtb3J5LCBhbmQgZXhlY3V0ZWQgZnJvbSB0aGVyZS4KLSAqLwotZXh0ZXJuIGNoYXIgX19oaWJlcm5hdGVfZXhpdF90ZXh0X3N0YXJ0W10sIF9faGliZXJuYXRlX2V4aXRfdGV4dF9lbmRbXTsKLQogLyogdGVtcG9yYXJ5IGVsMiB2ZWN0b3JzIGluIHRoZSBfX2hpYmVybmF0ZV9leGl0X3RleHQgc2VjdGlvbi4gKi8KIGV4dGVybiBjaGFyIGhpYmVybmF0ZV9lbDJfdmVjdG9yc1tdOwogCkBAIC02Nyw2ICs2MywxMiBAQAogZXh0ZXJuIGNoYXIgX19oeXBfc3R1Yl92ZWN0b3JzW107CiAKIC8qCisgKiBUaGUgbG9naWNhbCBjcHUgbnVtYmVyIHdlIHNob3VsZCByZXN1bWUgb24sIGluaXRpYWxpc2VkIHRvIGEgbm9uLWNwdQorICogbnVtYmVyLgorICovCitzdGF0aWMgaW50IHNsZWVwX2NwdSA9IC1FSU5WQUw7CisKKy8qCiAgKiBWYWx1ZXMgdGhhdCBtYXkgbm90IGNoYW5nZSBvdmVyIGhpYmVybmF0ZS9yZXN1bWUuIFdlIHB1dCB0aGUgYnVpbGQgbnVtYmVyCiAgKiBhbmQgZGF0ZSBpbiBoZXJlIHNvIHRoYXQgd2UgZ3VhcmFudGVlIG5vdCB0byByZXN1bWUgd2l0aCBhIGRpZmZlcmVudAogICoga2VybmVsLgpAQCAtODgsNiArOTAsOCBAQAogCSAqIHJlLWNvbmZpZ3VyZSBlbDIuCiAJICovCiAJcGh5c19hZGRyX3QJX19oeXBfc3R1Yl92ZWN0b3JzOworCisJdTY0CQlzbGVlcF9jcHVfbXBpZHI7CiB9IHJlc3VtZV9oZHI7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2hkcl9pbnZhcmlhbnRzKHN0cnVjdCBhcmNoX2hpYmVybmF0ZV9oZHJfaW52YXJpYW50cyAqaSkKQEAgLTEzMCwxMiArMTM0LDIyIEBACiAJZWxzZQogCQloZHItPl9faHlwX3N0dWJfdmVjdG9ycyA9IDA7CiAKKwkvKiBTYXZlIHRoZSBtcGlkciBvZiB0aGUgY3B1IHdlIGNhbGxlZCBjcHVfc3VzcGVuZCgpIG9uLi4uICovCisJaWYgKHNsZWVwX2NwdSA8IDApIHsKKwkJcHJfZXJyKCJGYWlsaW5nIHRvIGhpYmVybmF0ZSBvbiBhbiB1bmtvd24gQ1BVLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwloZHItPnNsZWVwX2NwdV9tcGlkciA9IGNwdV9sb2dpY2FsX21hcChzbGVlcF9jcHUpOworCXByX2luZm8oIkhpYmVybmF0aW5nIG9uIENQVSAlZCBbbXBpZHI6MHglbGx4XVxuIiwgc2xlZXBfY3B1LAorCQloZHItPnNsZWVwX2NwdV9tcGlkcik7CisKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woYXJjaF9oaWJlcm5hdGlvbl9oZWFkZXJfc2F2ZSk7CiAKIGludCBhcmNoX2hpYmVybmF0aW9uX2hlYWRlcl9yZXN0b3JlKHZvaWQgKmFkZHIpCiB7CisJaW50IHJldDsKIAlzdHJ1Y3QgYXJjaF9oaWJlcm5hdGVfaGRyX2ludmFyaWFudHMgaW52YXJpYW50czsKIAlzdHJ1Y3QgYXJjaF9oaWJlcm5hdGVfaGRyICpoZHIgPSBhZGRyOwogCkBAIC0xNDUsNiArMTU5LDI0IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCXNsZWVwX2NwdSA9IGdldF9sb2dpY2FsX2luZGV4KGhkci0+c2xlZXBfY3B1X21waWRyKTsKKwlwcl9pbmZvKCJIaWJlcm5hdGVkIG9uIENQVSAlZCBbbXBpZHI6MHglbGx4XVxuIiwgc2xlZXBfY3B1LAorCQloZHItPnNsZWVwX2NwdV9tcGlkcik7CisJaWYgKHNsZWVwX2NwdSA8IDApIHsKKwkJcHJfY3JpdCgiSGliZXJuYXRlZCBvbiBhIENQVSBub3Qga25vd24gdG8gdGhpcyBrZXJuZWwhXG4iKTsKKwkJc2xlZXBfY3B1ID0gLUVJTlZBTDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghY3B1X29ubGluZShzbGVlcF9jcHUpKSB7CisJCXByX2luZm8oIkhpYmVybmF0ZWQgb24gYSBDUFUgdGhhdCBpcyBvZmZsaW5lISBCcmluZ2luZyBDUFUgdXAuXG4iKTsKKwkJcmV0ID0gY3B1X3VwKHNsZWVwX2NwdSk7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiRmFpbGVkIHRvIGJyaW5nIGhpYmVybmF0ZS1DUFUgdXAhXG4iKTsKKwkJCXNsZWVwX2NwdSA9IC1FSU5WQUw7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCiAJcmVzdW1lX2hkciA9ICpoZHI7CiAKIAlyZXR1cm4gMDsKQEAgLTI0MSw2ICsyNzMsNyBAQAogCXJldHVybiByYzsKIH0KIAorI2RlZmluZSBkY2FjaGVfY2xlYW5fcmFuZ2Uoc3RhcnQsIGVuZCkJX19mbHVzaF9kY2FjaGVfYXJlYShzdGFydCwgKGVuZCAtIHN0YXJ0KSkKIAogaW50IHN3c3VzcF9hcmNoX3N1c3BlbmQodm9pZCkKIHsKQEAgLTI1NiwxMCArMjg5LDE2IEBACiAJbG9jYWxfZGJnX3NhdmUoZmxhZ3MpOwogCiAJaWYgKF9fY3B1X3N1c3BlbmRfZW50ZXIoJnN0YXRlKSkgeworCQlzbGVlcF9jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJCXJldCA9IHN3c3VzcF9zYXZlKCk7CiAJfSBlbHNlIHsKLQkJLyogQ2xlYW4ga2VybmVsIHRvIFBvQyBmb3Igc2Vjb25kYXJ5IGNvcmUgc3RhcnR1cCAqLwotCQlfX2ZsdXNoX2RjYWNoZV9hcmVhKExNQUREUihLRVJORUxfU1RBUlQpLCBLRVJORUxfRU5EIC0gS0VSTkVMX1NUQVJUKTsKKwkJLyogQ2xlYW4ga2VybmVsIGNvcmUgc3RhcnR1cC9pZGxlIGNvZGUgdG8gUG9DKi8KKwkJZGNhY2hlX2NsZWFuX3JhbmdlKF9fbW11b2ZmX2RhdGFfc3RhcnQsIF9fbW11b2ZmX2RhdGFfZW5kKTsKKwkJZGNhY2hlX2NsZWFuX3JhbmdlKF9faWRtYXBfdGV4dF9zdGFydCwgX19pZG1hcF90ZXh0X2VuZCk7CisKKwkJLyogQ2xlYW4ga3ZtIHNldHVwIGNvZGUgdG8gUG9DPyAqLworCQlpZiAoZWwyX3Jlc2V0X25lZWRlZCgpKQorCQkJZGNhY2hlX2NsZWFuX3JhbmdlKF9faHlwX2lkbWFwX3RleHRfc3RhcnQsIF9faHlwX2lkbWFwX3RleHRfZW5kKTsKIAogCQkvKgogCQkgKiBUZWxsIHRoZSBoaWJlcm5hdGlvbiBjb3JlIHRoYXQgd2UndmUganVzdCByZXN0b3JlZApAQCAtMjY3LDYgKzMwNiw3IEBACiAJCSAqLwogCQlpbl9zdXNwZW5kID0gMDsKIAorCQlzbGVlcF9jcHUgPSAtRUlOVkFMOwogCQlfX2NwdV9zdXNwZW5kX2V4aXQoKTsKIAl9CiAKQEAgLTI3NSw2ICszMTUsMzMgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCBfY29weV9wdGUocHRlX3QgKmRzdF9wdGUsIHB0ZV90ICpzcmNfcHRlLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJcHRlX3QgcHRlID0gKnNyY19wdGU7CisKKwlpZiAocHRlX3ZhbGlkKHB0ZSkpIHsKKwkJLyoKKwkJICogUmVzdW1lIHdpbGwgb3ZlcndyaXRlIGFyZWFzIHRoYXQgbWF5IGJlIG1hcmtlZAorCQkgKiByZWFkIG9ubHkgKGNvZGUsIHJvZGF0YSkuIENsZWFyIHRoZSBSRE9OTFkgYml0IGZyb20KKwkJICogdGhlIHRlbXBvcmFyeSBtYXBwaW5ncyB3ZSB1c2UgZHVyaW5nIHJlc3RvcmUuCisJCSAqLworCQlzZXRfcHRlKGRzdF9wdGUsIHB0ZV9jbGVhcl9yZG9ubHkocHRlKSk7CisJfSBlbHNlIGlmIChkZWJ1Z19wYWdlYWxsb2NfZW5hYmxlZCgpICYmICFwdGVfbm9uZShwdGUpKSB7CisJCS8qCisJCSAqIGRlYnVnX3BhZ2VhbGxvYyB3aWxsIHJlbW92ZWQgdGhlIFBURV9WQUxJRCBiaXQgaWYKKwkJICogdGhlIHBhZ2UgaXNuJ3QgaW4gdXNlIGJ5IHRoZSByZXN1bWUga2VybmVsLiBJdCBtYXkgaGF2ZQorCQkgKiBiZWVuIGluIHVzZSBieSB0aGUgb3JpZ2luYWwga2VybmVsLCBpbiB3aGljaCBjYXNlIHdlIG5lZWQKKwkJICogdG8gcHV0IGl0IGJhY2sgaW4gb3VyIGNvcHkgdG8gZG8gdGhlIHJlc3RvcmUuCisJCSAqCisJCSAqIEJlZm9yZSBtYXJraW5nIHRoaXMgZW50cnkgdmFsaWQsIGNoZWNrIHRoZSBwZm4gc2hvdWxkCisJCSAqIGJlIG1hcHBlZC4KKwkJICovCisJCUJVR19PTighcGZuX3ZhbGlkKHB0ZV9wZm4ocHRlKSkpOworCisJCXNldF9wdGUoZHN0X3B0ZSwgcHRlX21rcHJlc2VudChwdGVfY2xlYXJfcmRvbmx5KHB0ZSkpKTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgY29weV9wdGUocG1kX3QgKmRzdF9wbWQsIHBtZF90ICpzcmNfcG1kLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAogCQkgICAgdW5zaWduZWQgbG9uZyBlbmQpCiB7CkBAIC0yOTAsMTMgKzM1Nyw3IEBACiAKIAlzcmNfcHRlID0gcHRlX29mZnNldF9rZXJuZWwoc3JjX3BtZCwgc3RhcnQpOwogCWRvIHsKLQkJaWYgKCFwdGVfbm9uZSgqc3JjX3B0ZSkpCi0JCQkvKgotCQkJICogUmVzdW1lIHdpbGwgb3ZlcndyaXRlIGFyZWFzIHRoYXQgbWF5IGJlIG1hcmtlZAotCQkJICogcmVhZCBvbmx5IChjb2RlLCByb2RhdGEpLiBDbGVhciB0aGUgUkRPTkxZIGJpdCBmcm9tCi0JCQkgKiB0aGUgdGVtcG9yYXJ5IG1hcHBpbmdzIHdlIHVzZSBkdXJpbmcgcmVzdG9yZS4KLQkJCSAqLwotCQkJc2V0X3B0ZShkc3RfcHRlLCBfX3B0ZShwdGVfdmFsKCpzcmNfcHRlKSAmIH5QVEVfUkRPTkxZKSk7CisJCV9jb3B5X3B0ZShkc3RfcHRlLCBzcmNfcHRlLCBhZGRyKTsKIAl9IHdoaWxlIChkc3RfcHRlKyssIHNyY19wdGUrKywgYWRkciArPSBQQUdFX1NJWkUsIGFkZHIgIT0gZW5kKTsKIAogCXJldHVybiAwOwpAQCAtNDgzLDI3ICs1NDQsMTIgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tfYm9vdF9jcHVfb25saW5lX3BtX2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCi0JCQkJCSAgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKnB0cikKK2ludCBoaWJlcm5hdGVfcmVzdW1lX25vbmJvb3RfY3B1X2Rpc2FibGUodm9pZCkKIHsKLQlpZiAoYWN0aW9uID09IFBNX0hJQkVSTkFUSU9OX1BSRVBBUkUgJiYKLQkgICAgIGNwdW1hc2tfZmlyc3QoY3B1X29ubGluZV9tYXNrKSAhPSAwKSB7Ci0JCXByX3dhcm4oIkNQVTAgaXMgb2ZmbGluZS5cbiIpOwotCQlyZXR1cm4gbm90aWZpZXJfZnJvbV9lcnJubygtRU5PREVWKTsKKwlpZiAoc2xlZXBfY3B1IDwgMCkgeworCQlwcl9lcnIoIkZhaWxpbmcgdG8gcmVzdW1lIGZyb20gaGliZXJuYXRlIG9uIGFuIHVua293biBDUFUuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JcmV0dXJuIE5PVElGWV9PSzsKKwlyZXR1cm4gZnJlZXplX3NlY29uZGFyeV9jcHVzKHNsZWVwX2NwdSk7CiB9Ci0KLXN0YXRpYyBpbnQgX19pbml0IGNoZWNrX2Jvb3RfY3B1X29ubGluZV9pbml0KHZvaWQpCi17Ci0JLyoKLQkgKiBTZXQgdGhpcyBwbV9ub3RpZmllciBjYWxsYmFjayB3aXRoIGEgbG93ZXIgcHJpb3JpdHkgdGhhbgotCSAqIGNwdV9ob3RwbHVnX3BtX2NhbGxiYWNrLCBzbyB0aGF0IGNwdV9ob3RwbHVnX3BtX2NhbGxiYWNrIHdpbGwgYmUKLQkgKiBjYWxsZWQgZWFybGllciB0byBkaXNhYmxlIGNwdSBob3RwbHVnIGJlZm9yZSB0aGUgY3B1IG9ubGluZSBjaGVjay4KLQkgKi8KLQlwbV9ub3RpZmllcihjaGVja19ib290X2NwdV9vbmxpbmVfcG1fY2FsbGJhY2ssIC1JTlRfTUFYKTsKLQotCXJldHVybiAwOwotfQotY29yZV9pbml0Y2FsbChjaGVja19ib290X2NwdV9vbmxpbmVfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9od19icmVha3BvaW50LmMgYi9hcmNoL2FybTY0L2tlcm5lbC9od19icmVha3BvaW50LmMKaW5kZXggMjZhNmJmNy4uOTQ4YjczMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvaHdfYnJlYWtwb2ludC5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2h3X2JyZWFrcG9pbnQuYwpAQCAtODU3LDcgKzg1Nyw3IEBACiAvKgogICogQ1BVIGluaXRpYWxpc2F0aW9uLgogICovCi1zdGF0aWMgdm9pZCBod19icmVha3BvaW50X3Jlc2V0KHZvaWQgKnVudXNlZCkKK3N0YXRpYyBpbnQgaHdfYnJlYWtwb2ludF9yZXNldCh1bnNpZ25lZCBpbnQgY3B1KQogewogCWludCBpOwogCXN0cnVjdCBwZXJmX2V2ZW50ICoqc2xvdHM7CkBAIC04ODgsMjggKzg4OCwxNCBAQAogCQkJd3JpdGVfd2JfcmVnKEFBUkNINjRfREJHX1JFR19XVlIsIGksIDBVTCk7CiAJCX0KIAl9Ci19CiAKLXN0YXRpYyBpbnQgaHdfYnJlYWtwb2ludF9yZXNldF9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAotCQkJCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24sCi0JCQkJCQl2b2lkICpoY3B1KQotewotCWlmICgoYWN0aW9uICYgfkNQVV9UQVNLU19GUk9aRU4pID09IENQVV9PTkxJTkUpIHsKLQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQkJaHdfYnJlYWtwb2ludF9yZXNldChOVUxMKTsKLQkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCX0KLQlyZXR1cm4gTk9USUZZX09LOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGh3X2JyZWFrcG9pbnRfcmVzZXRfbmIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSBod19icmVha3BvaW50X3Jlc2V0X25vdGlmeSwKLX07Ci0KICNpZmRlZiBDT05GSUdfQ1BVX1BNCi1leHRlcm4gdm9pZCBjcHVfc3VzcGVuZF9zZXRfZGJnX3Jlc3RvcmVyKHZvaWQgKCpod19icF9yZXN0b3JlKSh2b2lkICopKTsKK2V4dGVybiB2b2lkIGNwdV9zdXNwZW5kX3NldF9kYmdfcmVzdG9yZXIoaW50ICgqaHdfYnBfcmVzdG9yZSkodW5zaWduZWQgaW50KSk7CiAjZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGNwdV9zdXNwZW5kX3NldF9kYmdfcmVzdG9yZXIodm9pZCAoKmh3X2JwX3Jlc3RvcmUpKHZvaWQgKikpCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1X3N1c3BlbmRfc2V0X2RiZ19yZXN0b3JlcihpbnQgKCpod19icF9yZXN0b3JlKSh1bnNpZ25lZCBpbnQpKQogewogfQogI2VuZGlmCkBAIC05MTksMzYgKzkwNSwzNCBAQAogICovCiBzdGF0aWMgaW50IF9faW5pdCBhcmNoX2h3X2JyZWFrcG9pbnRfaW5pdCh2b2lkKQogeworCWludCByZXQ7CisKIAljb3JlX251bV9icnBzID0gZ2V0X251bV9icnBzKCk7CiAJY29yZV9udW1fd3JwcyA9IGdldF9udW1fd3JwcygpOwogCiAJcHJfaW5mbygiZm91bmQgJWQgYnJlYWtwb2ludCBhbmQgJWQgd2F0Y2hwb2ludCByZWdpc3RlcnMuXG4iLAogCQljb3JlX251bV9icnBzLCBjb3JlX251bV93cnBzKTsKIAotCWNwdV9ub3RpZmllcl9yZWdpc3Rlcl9iZWdpbigpOwotCi0JLyoKLQkgKiBSZXNldCB0aGUgYnJlYWtwb2ludCByZXNvdXJjZXMuIFdlIGFzc3VtZSB0aGF0IGEgaGFsdGluZwotCSAqIGRlYnVnZ2VyIHdpbGwgbGVhdmUgdGhlIHdvcmxkIGluIGEgbmljZSBzdGF0ZSBmb3IgdXMuCi0JICovCi0Jc21wX2NhbGxfZnVuY3Rpb24oaHdfYnJlYWtwb2ludF9yZXNldCwgTlVMTCwgMSk7Ci0JaHdfYnJlYWtwb2ludF9yZXNldChOVUxMKTsKLQogCS8qIFJlZ2lzdGVyIGRlYnVnIGZhdWx0IGhhbmRsZXJzLiAqLwogCWhvb2tfZGVidWdfZmF1bHRfY29kZShEQkdfRVNSX0VWVF9IV0JQLCBicmVha3BvaW50X2hhbmRsZXIsIFNJR1RSQVAsCiAJCQkgICAgICBUUkFQX0hXQktQVCwgImh3LWJyZWFrcG9pbnQgaGFuZGxlciIpOwogCWhvb2tfZGVidWdfZmF1bHRfY29kZShEQkdfRVNSX0VWVF9IV1dQLCB3YXRjaHBvaW50X2hhbmRsZXIsIFNJR1RSQVAsCiAJCQkgICAgICBUUkFQX0hXQktQVCwgImh3LXdhdGNocG9pbnQgaGFuZGxlciIpOwogCi0JLyogUmVnaXN0ZXIgaG90cGx1ZyBub3RpZmllci4gKi8KLQlfX3JlZ2lzdGVyX2NwdV9ub3RpZmllcigmaHdfYnJlYWtwb2ludF9yZXNldF9uYik7Ci0KLQljcHVfbm90aWZpZXJfcmVnaXN0ZXJfZG9uZSgpOworCS8qCisJICogUmVzZXQgdGhlIGJyZWFrcG9pbnQgcmVzb3VyY2VzLiBXZSBhc3N1bWUgdGhhdCBhIGhhbHRpbmcKKwkgKiBkZWJ1Z2dlciB3aWxsIGxlYXZlIHRoZSB3b3JsZCBpbiBhIG5pY2Ugc3RhdGUgZm9yIHVzLgorCSAqLworCXJldCA9IGNwdWhwX3NldHVwX3N0YXRlKENQVUhQX0FQX1BFUkZfQVJNX0hXX0JSRUFLUE9JTlRfU1RBUlRJTkcsCisJCQkgICJDUFVIUF9BUF9QRVJGX0FSTV9IV19CUkVBS1BPSU5UX1NUQVJUSU5HIiwKKwkJCSAgaHdfYnJlYWtwb2ludF9yZXNldCwgTlVMTCk7CisJaWYgKHJldCkKKwkJcHJfZXJyKCJmYWlsZWQgdG8gcmVnaXN0ZXIgQ1BVIGhvdHBsdWcgbm90aWZpZXI6ICVkXG4iLCByZXQpOwogCiAJLyogUmVnaXN0ZXIgY3B1X3N1c3BlbmQgaHcgYnJlYWtwb2ludCByZXN0b3JlIGhvb2sgKi8KIAljcHVfc3VzcGVuZF9zZXRfZGJnX3Jlc3RvcmVyKGh3X2JyZWFrcG9pbnRfcmVzZXQpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKIH0KIGFyY2hfaW5pdGNhbGwoYXJjaF9od19icmVha3BvaW50X2luaXQpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9pbnNuLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9pbnNuLmMKaW5kZXggNjNmOTQzMi4uNmYyYWM0ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvaW5zbi5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2luc24uYwpAQCAtOTYsNyArOTYsNyBAQAogCiAJaWYgKG1vZHVsZSAmJiBJU19FTkFCTEVEKENPTkZJR19ERUJVR19TRVRfTU9EVUxFX1JPTlgpKQogCQlwYWdlID0gdm1hbGxvY190b19wYWdlKGFkZHIpOwotCWVsc2UgaWYgKCFtb2R1bGUgJiYgSVNfRU5BQkxFRChDT05GSUdfREVCVUdfUk9EQVRBKSkKKwllbHNlIGlmICghbW9kdWxlKQogCQlwYWdlID0gcGZuX3RvX3BhZ2UoUEhZU19QRk4oX19wYShhZGRyKSkpOwogCWVsc2UKIAkJcmV0dXJuIGFkZHI7CkBAIC0xMjAyLDYgKzEyMDIsMTkgQEAKIAlCVUcoKTsKIH0KIAorczMyIGFhcmNoNjRfaW5zbl9hZHJwX2dldF9vZmZzZXQodTMyIGluc24pCit7CisJQlVHX09OKCFhYXJjaDY0X2luc25faXNfYWRycChpbnNuKSk7CisJcmV0dXJuIGFhcmNoNjRfaW5zbl9kZWNvZGVfaW1tZWRpYXRlKEFBUkNINjRfSU5TTl9JTU1fQURSLCBpbnNuKSA8PCAxMjsKK30KKwordTMyIGFhcmNoNjRfaW5zbl9hZHJwX3NldF9vZmZzZXQodTMyIGluc24sIHMzMiBvZmZzZXQpCit7CisJQlVHX09OKCFhYXJjaDY0X2luc25faXNfYWRycChpbnNuKSk7CisJcmV0dXJuIGFhcmNoNjRfaW5zbl9lbmNvZGVfaW1tZWRpYXRlKEFBUkNINjRfSU5TTl9JTU1fQURSLCBpbnNuLAorCQkJCQkJb2Zmc2V0ID4+IDEyKTsKK30KKwogLyoKICAqIEV4dHJhY3QgdGhlIE9wL0NSIGRhdGEgZnJvbSBhIG1zci9tcnMgaW5zdHJ1Y3Rpb24uCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2thc2xyLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9rYXNsci5jCmluZGV4IGIwNTQ2OTEuLjc2OWYyNGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL2thc2xyLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwva2FzbHIuYwpAQCAtNiw2ICs2LDcgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpYmZkdC5oPgpAQCAtMjAsNyArMjEsNyBAQAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAKLXU2NCBfX3JlYWRfbW9zdGx5IG1vZHVsZV9hbGxvY19iYXNlOwordTY0IF9fcm9fYWZ0ZXJfaW5pdCBtb2R1bGVfYWxsb2NfYmFzZTsKIHUxNiBfX2luaXRkYXRhIG1lbXN0YXJ0X29mZnNldF9zZWVkOwogCiBzdGF0aWMgX19pbml0IHU2NCBnZXRfa2FzbHJfc2VlZCh2b2lkICpmZHQpCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9rZ2RiLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9rZ2RiLmMKaW5kZXggOGM1N2Y2NC4uZTAxN2E5NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwva2dkYi5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2tnZGIuYwpAQCAtMTksMTAgKzE5LDEzIEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CiAjaW5jbHVkZSA8bGludXgva2dkYi5oPgogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KKyNpbmNsdWRlIDxhc20vZGVidWctbW9uaXRvcnMuaD4KKyNpbmNsdWRlIDxhc20vaW5zbi5oPgogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogCiBzdHJ1Y3QgZGJnX3JlZ19kZWZfdCBkYmdfcmVnX2RlZltEQkdfTUFYX1JFR19OVU1dID0gewpAQCAtMzM4LDE1ICszNDEsMjQgQEAKIAl1bnJlZ2lzdGVyX2RpZV9ub3RpZmllcigma2dkYl9ub3RpZmllcik7CiB9CiAKLS8qCi0gKiBBUk0gaW5zdHJ1Y3Rpb25zIGFyZSBhbHdheXMgaW4gTEUuCi0gKiBCcmVhayBpbnN0cnVjdGlvbiBpcyBlbmNvZGVkIGluIExFIGZvcm1hdAotICovCi1zdHJ1Y3Qga2dkYl9hcmNoIGFyY2hfa2dkYl9vcHMgPSB7Ci0JLmdkYl9icHRfaW5zdHIgPSB7Ci0JCUtHREJfRFlOX0JSS19JTlNfQllURSgwKSwKLQkJS0dEQl9EWU5fQlJLX0lOU19CWVRFKDEpLAotCQlLR0RCX0RZTl9CUktfSU5TX0JZVEUoMiksCi0JCUtHREJfRFlOX0JSS19JTlNfQllURSgzKSwKLQl9Ci19Oworc3RydWN0IGtnZGJfYXJjaCBhcmNoX2tnZGJfb3BzOworCitpbnQga2dkYl9hcmNoX3NldF9icmVha3BvaW50KHN0cnVjdCBrZ2RiX2JrcHQgKmJwdCkKK3sKKwlpbnQgZXJyOworCisJQlVJTERfQlVHX09OKEFBUkNINjRfSU5TTl9TSVpFICE9IEJSRUFLX0lOU1RSX1NJWkUpOworCisJZXJyID0gYWFyY2g2NF9pbnNuX3JlYWQoKHZvaWQgKilicHQtPmJwdF9hZGRyLCAodTMyICopYnB0LT5zYXZlZF9pbnN0cik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiBhYXJjaDY0X2luc25fd3JpdGUoKHZvaWQgKilicHQtPmJwdF9hZGRyLAorCQkJKHUzMilBQVJDSDY0X0JSRUFLX0tHREJfRFlOX0RCRyk7Cit9CisKK2ludCBrZ2RiX2FyY2hfcmVtb3ZlX2JyZWFrcG9pbnQoc3RydWN0IGtnZGJfYmtwdCAqYnB0KQoreworCXJldHVybiBhYXJjaDY0X2luc25fd3JpdGUoKHZvaWQgKilicHQtPmJwdF9hZGRyLAorCQkJKih1MzIgKilicHQtPnNhdmVkX2luc3RyKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3BlcmZfZXZlbnQuYyBiL2FyY2gvYXJtNjQva2VybmVsL3BlcmZfZXZlbnQuYwppbmRleCA4MzhjY2YxLi5hOTMxMGE2IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9wZXJmX2V2ZW50LmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvcGVyZl9ldmVudC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8YXNtL3N5c3JlZy5oPgogI2luY2x1ZGUgPGFzbS92aXJ0Lmg+CiAKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJmL2FybV9wbXUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTE5MCwxMyArMTkxLDIzIEBACiAjZGVmaW5lIEFSTVY4X1RIVU5ERVJfUEVSRkNUUl9MMUlfQ0FDSEVfUFJFRl9NSVNTCQkweEVECiAKIC8qIFBNVXYzIEhXIGV2ZW50cyBtYXBwaW5nLiAqLworCisvKgorICogQVJNdjggQXJjaGl0ZWN0dXJhbCBkZWZpbmVkIGV2ZW50cywgbm90IGFsbCBvZiB0aGVzZSBtYXkKKyAqIGJlIHN1cHBvcnRlZCBvbiBhbnkgZ2l2ZW4gaW1wbGVtZW50YXRpb24uIFVuZGVmaW5lZCBldmVudHMgd2lsbAorICogYmUgZGlzYWJsZWQgYXQgcnVuLXRpbWUuCisgKi8KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBhcm12OF9wbXV2M19wZXJmX21hcFtQRVJGX0NPVU5UX0hXX01BWF0gPSB7CiAJUEVSRl9NQVBfQUxMX1VOU1VQUE9SVEVELAogCVtQRVJGX0NPVU5UX0hXX0NQVV9DWUNMRVNdCQk9IEFSTVY4X1BNVVYzX1BFUkZDVFJfQ1BVX0NZQ0xFUywKIAlbUEVSRl9DT1VOVF9IV19JTlNUUlVDVElPTlNdCQk9IEFSTVY4X1BNVVYzX1BFUkZDVFJfSU5TVF9SRVRJUkVELAogCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFRkVSRU5DRVNdCT0gQVJNVjhfUE1VVjNfUEVSRkNUUl9MMURfQ0FDSEUsCiAJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUlTU0VTXQkJPSBBUk1WOF9QTVVWM19QRVJGQ1RSX0wxRF9DQUNIRV9SRUZJTEwsCisJW1BFUkZfQ09VTlRfSFdfQlJBTkNIX0lOU1RSVUNUSU9OU10JPSBBUk1WOF9QTVVWM19QRVJGQ1RSX1BDX1dSSVRFX1JFVElSRUQsCiAJW1BFUkZfQ09VTlRfSFdfQlJBTkNIX01JU1NFU10JCT0gQVJNVjhfUE1VVjNfUEVSRkNUUl9CUl9NSVNfUFJFRCwKKwlbUEVSRl9DT1VOVF9IV19CVVNfQ1lDTEVTXQkJPSBBUk1WOF9QTVVWM19QRVJGQ1RSX0JVU19DWUNMRVMsCisJW1BFUkZfQ09VTlRfSFdfU1RBTExFRF9DWUNMRVNfRlJPTlRFTkRdCT0gQVJNVjhfUE1VVjNfUEVSRkNUUl9TVEFMTF9GUk9OVEVORCwKKwlbUEVSRl9DT1VOVF9IV19TVEFMTEVEX0NZQ0xFU19CQUNLRU5EXQk9IEFSTVY4X1BNVVYzX1BFUkZDVFJfU1RBTExfQkFDS0VORCwKIH07CiAKIC8qIEFSTSBDb3J0ZXgtQTUzIEhXIGV2ZW50cyBtYXBwaW5nLiAqLwpAQCAtMjU4LDYgKzI2OSwxNSBAQAogCVtDKEwxRCldW0MoT1BfV1JJVEUpXVtDKFJFU1VMVF9BQ0NFU1MpXQk9IEFSTVY4X1BNVVYzX1BFUkZDVFJfTDFEX0NBQ0hFLAogCVtDKEwxRCldW0MoT1BfV1JJVEUpXVtDKFJFU1VMVF9NSVNTKV0JPSBBUk1WOF9QTVVWM19QRVJGQ1RSX0wxRF9DQUNIRV9SRUZJTEwsCiAKKwlbQyhMMUkpXVtDKE9QX1JFQUQpXVtDKFJFU1VMVF9BQ0NFU1MpXQk9IEFSTVY4X1BNVVYzX1BFUkZDVFJfTDFJX0NBQ0hFLAorCVtDKEwxSSldW0MoT1BfUkVBRCldW0MoUkVTVUxUX01JU1MpXQk9IEFSTVY4X1BNVVYzX1BFUkZDVFJfTDFJX0NBQ0hFX1JFRklMTCwKKworCVtDKERUTEIpXVtDKE9QX1JFQUQpXVtDKFJFU1VMVF9NSVNTKV0JPSBBUk1WOF9QTVVWM19QRVJGQ1RSX0wxRF9UTEJfUkVGSUxMLAorCVtDKERUTEIpXVtDKE9QX1JFQUQpXVtDKFJFU1VMVF9BQ0NFU1MpXQk9IEFSTVY4X1BNVVYzX1BFUkZDVFJfTDFEX1RMQiwKKworCVtDKElUTEIpXVtDKE9QX1JFQUQpXVtDKFJFU1VMVF9NSVNTKV0JPSBBUk1WOF9QTVVWM19QRVJGQ1RSX0wxSV9UTEJfUkVGSUxMLAorCVtDKElUTEIpXVtDKE9QX1JFQUQpXVtDKFJFU1VMVF9BQ0NFU1MpXQk9IEFSTVY4X1BNVVYzX1BFUkZDVFJfTDFJX1RMQiwKKwogCVtDKEJQVSldW0MoT1BfUkVBRCldW0MoUkVTVUxUX0FDQ0VTUyldCT0gQVJNVjhfUE1VVjNfUEVSRkNUUl9CUl9QUkVELAogCVtDKEJQVSldW0MoT1BfUkVBRCldW0MoUkVTVUxUX01JU1MpXQk9IEFSTVY4X1BNVVYzX1BFUkZDVFJfQlJfTUlTX1BSRUQsCiAJW0MoQlBVKV1bQyhPUF9XUklURSldW0MoUkVTVUxUX0FDQ0VTUyldCT0gQVJNVjhfUE1VVjNfUEVSRkNUUl9CUl9QUkVELApAQCAtNTIzLDEyICs1NDMsNiBAQAogCS5hdHRycyA9IGFybXY4X3BtdXYzX2Zvcm1hdF9hdHRycywKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICphcm12OF9wbXV2M19hdHRyX2dyb3Vwc1tdID0gewotCSZhcm12OF9wbXV2M19ldmVudHNfYXR0cl9ncm91cCwKLQkmYXJtdjhfcG11djNfZm9ybWF0X2F0dHJfZ3JvdXAsCi0JTlVMTCwKLX07Ci0KIC8qCiAgKiBQZXJmIEV2ZW50cycgaW5kaWNlcwogICovCkBAIC05MDUsOSArOTE5LDIyIEBACiAKIHN0YXRpYyBpbnQgYXJtdjhfcG11djNfbWFwX2V2ZW50KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKLQlyZXR1cm4gYXJtcG11X21hcF9ldmVudChldmVudCwgJmFybXY4X3BtdXYzX3BlcmZfbWFwLAotCQkJCSZhcm12OF9wbXV2M19wZXJmX2NhY2hlX21hcCwKLQkJCQlBUk1WOF9QTVVfRVZUWVBFX0VWRU5UKTsKKwlpbnQgaHdfZXZlbnRfaWQ7CisJc3RydWN0IGFybV9wbXUgKmFybXBtdSA9IHRvX2FybV9wbXUoZXZlbnQtPnBtdSk7CisKKwlod19ldmVudF9pZCA9IGFybXBtdV9tYXBfZXZlbnQoZXZlbnQsICZhcm12OF9wbXV2M19wZXJmX21hcCwKKwkJCQkgICAgICAgJmFybXY4X3BtdXYzX3BlcmZfY2FjaGVfbWFwLAorCQkJCSAgICAgICBBUk1WOF9QTVVfRVZUWVBFX0VWRU5UKTsKKwlpZiAoaHdfZXZlbnRfaWQgPCAwKQorCQlyZXR1cm4gaHdfZXZlbnRfaWQ7CisKKwkvKiBkaXNhYmxlIG1pY3JvL2FyY2ggZXZlbnRzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBQTVUgKi8KKwlpZiAoKGh3X2V2ZW50X2lkIDwgQVJNVjhfUE1VVjNfTUFYX0NPTU1PTl9FVkVOVFMpICYmCisJCSF0ZXN0X2JpdChod19ldmVudF9pZCwgYXJtcG11LT5wbWNlaWRfYml0bWFwKSkgeworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCXJldHVybiBod19ldmVudF9pZDsKIH0KIAogc3RhdGljIGludCBhcm12OF9hNTNfbWFwX2V2ZW50KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKQEAgLTk4NSw3ICsxMDEyLDEwIEBACiAJYXJtdjhfcG11X2luaXQoY3B1X3BtdSk7CiAJY3B1X3BtdS0+bmFtZQkJCT0gImFybXY4X3BtdXYzIjsKIAljcHVfcG11LT5tYXBfZXZlbnQJCT0gYXJtdjhfcG11djNfbWFwX2V2ZW50OwotCWNwdV9wbXUtPnBtdS5hdHRyX2dyb3Vwcwk9IGFybXY4X3BtdXYzX2F0dHJfZ3JvdXBzOworCWNwdV9wbXUtPmF0dHJfZ3JvdXBzW0FSTVBNVV9BVFRSX0dST1VQX0VWRU5UU10gPQorCQkmYXJtdjhfcG11djNfZXZlbnRzX2F0dHJfZ3JvdXA7CisJY3B1X3BtdS0+YXR0cl9ncm91cHNbQVJNUE1VX0FUVFJfR1JPVVBfRk9STUFUU10gPQorCQkmYXJtdjhfcG11djNfZm9ybWF0X2F0dHJfZ3JvdXA7CiAJcmV0dXJuIGFybXY4cG11X3Byb2JlX3BtdShjcHVfcG11KTsKIH0KIApAQCAtOTk0LDcgKzEwMjQsMTAgQEAKIAlhcm12OF9wbXVfaW5pdChjcHVfcG11KTsKIAljcHVfcG11LT5uYW1lCQkJPSAiYXJtdjhfY29ydGV4X2E1MyI7CiAJY3B1X3BtdS0+bWFwX2V2ZW50CQk9IGFybXY4X2E1M19tYXBfZXZlbnQ7Ci0JY3B1X3BtdS0+cG11LmF0dHJfZ3JvdXBzCT0gYXJtdjhfcG11djNfYXR0cl9ncm91cHM7CisJY3B1X3BtdS0+YXR0cl9ncm91cHNbQVJNUE1VX0FUVFJfR1JPVVBfRVZFTlRTXSA9CisJCSZhcm12OF9wbXV2M19ldmVudHNfYXR0cl9ncm91cDsKKwljcHVfcG11LT5hdHRyX2dyb3Vwc1tBUk1QTVVfQVRUUl9HUk9VUF9GT1JNQVRTXSA9CisJCSZhcm12OF9wbXV2M19mb3JtYXRfYXR0cl9ncm91cDsKIAlyZXR1cm4gYXJtdjhwbXVfcHJvYmVfcG11KGNwdV9wbXUpOwogfQogCkBAIC0xMDAzLDcgKzEwMzYsMTAgQEAKIAlhcm12OF9wbXVfaW5pdChjcHVfcG11KTsKIAljcHVfcG11LT5uYW1lCQkJPSAiYXJtdjhfY29ydGV4X2E1NyI7CiAJY3B1X3BtdS0+bWFwX2V2ZW50CQk9IGFybXY4X2E1N19tYXBfZXZlbnQ7Ci0JY3B1X3BtdS0+cG11LmF0dHJfZ3JvdXBzCT0gYXJtdjhfcG11djNfYXR0cl9ncm91cHM7CisJY3B1X3BtdS0+YXR0cl9ncm91cHNbQVJNUE1VX0FUVFJfR1JPVVBfRVZFTlRTXSA9CisJCSZhcm12OF9wbXV2M19ldmVudHNfYXR0cl9ncm91cDsKKwljcHVfcG11LT5hdHRyX2dyb3Vwc1tBUk1QTVVfQVRUUl9HUk9VUF9GT1JNQVRTXSA9CisJCSZhcm12OF9wbXV2M19mb3JtYXRfYXR0cl9ncm91cDsKIAlyZXR1cm4gYXJtdjhwbXVfcHJvYmVfcG11KGNwdV9wbXUpOwogfQogCkBAIC0xMDEyLDcgKzEwNDgsMTAgQEAKIAlhcm12OF9wbXVfaW5pdChjcHVfcG11KTsKIAljcHVfcG11LT5uYW1lCQkJPSAiYXJtdjhfY29ydGV4X2E3MiI7CiAJY3B1X3BtdS0+bWFwX2V2ZW50CQk9IGFybXY4X2E1N19tYXBfZXZlbnQ7Ci0JY3B1X3BtdS0+cG11LmF0dHJfZ3JvdXBzCT0gYXJtdjhfcG11djNfYXR0cl9ncm91cHM7CisJY3B1X3BtdS0+YXR0cl9ncm91cHNbQVJNUE1VX0FUVFJfR1JPVVBfRVZFTlRTXSA9CisJCSZhcm12OF9wbXV2M19ldmVudHNfYXR0cl9ncm91cDsKKwljcHVfcG11LT5hdHRyX2dyb3Vwc1tBUk1QTVVfQVRUUl9HUk9VUF9GT1JNQVRTXSA9CisJCSZhcm12OF9wbXV2M19mb3JtYXRfYXR0cl9ncm91cDsKIAlyZXR1cm4gYXJtdjhwbXVfcHJvYmVfcG11KGNwdV9wbXUpOwogfQogCkBAIC0xMDIxLDcgKzEwNjAsMTAgQEAKIAlhcm12OF9wbXVfaW5pdChjcHVfcG11KTsKIAljcHVfcG11LT5uYW1lCQkJPSAiYXJtdjhfY2F2aXVtX3RodW5kZXIiOwogCWNwdV9wbXUtPm1hcF9ldmVudAkJPSBhcm12OF90aHVuZGVyX21hcF9ldmVudDsKLQljcHVfcG11LT5wbXUuYXR0cl9ncm91cHMJPSBhcm12OF9wbXV2M19hdHRyX2dyb3VwczsKKwljcHVfcG11LT5hdHRyX2dyb3Vwc1tBUk1QTVVfQVRUUl9HUk9VUF9FVkVOVFNdID0KKwkJJmFybXY4X3BtdXYzX2V2ZW50c19hdHRyX2dyb3VwOworCWNwdV9wbXUtPmF0dHJfZ3JvdXBzW0FSTVBNVV9BVFRSX0dST1VQX0ZPUk1BVFNdID0KKwkJJmFybXY4X3BtdXYzX2Zvcm1hdF9hdHRyX2dyb3VwOwogCXJldHVybiBhcm12OHBtdV9wcm9iZV9wbXUoY3B1X3BtdSk7CiB9CiAKQEAgLTEwMzAsNyArMTA3MiwxMCBAQAogCWFybXY4X3BtdV9pbml0KGNwdV9wbXUpOwogCWNwdV9wbXUtPm5hbWUJCQk9ICJhcm12OF9icmNtX3Z1bGNhbiI7CiAJY3B1X3BtdS0+bWFwX2V2ZW50CQk9IGFybXY4X3Z1bGNhbl9tYXBfZXZlbnQ7Ci0JY3B1X3BtdS0+cG11LmF0dHJfZ3JvdXBzCT0gYXJtdjhfcG11djNfYXR0cl9ncm91cHM7CisJY3B1X3BtdS0+YXR0cl9ncm91cHNbQVJNUE1VX0FUVFJfR1JPVVBfRVZFTlRTXSA9CisJCSZhcm12OF9wbXV2M19ldmVudHNfYXR0cl9ncm91cDsKKwljcHVfcG11LT5hdHRyX2dyb3Vwc1tBUk1QTVVfQVRUUl9HUk9VUF9GT1JNQVRTXSA9CisJCSZhcm12OF9wbXV2M19mb3JtYXRfYXR0cl9ncm91cDsKIAlyZXR1cm4gYXJtdjhwbXVfcHJvYmVfcG11KGNwdV9wbXUpOwogfQogCkBAIC0xMDQ0LDIxICsxMDg5LDMyIEBACiAJe30sCiB9OwogCisvKgorICogTm9uIERUIHN5c3RlbXMgaGF2ZSB0aGVpciBtaWNyby9hcmNoIGV2ZW50cyBwcm9iZWQgYXQgcnVuLXRpbWUuCisgKiBBIGZhaXJseSBjb21wbGV0ZSBsaXN0IG9mIGdlbmVyaWMgZXZlbnRzIGFyZSBwcm92aWRlZCBhbmQgb25lcyB0aGF0CisgKiBhcmVuJ3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IFBNVSBhcmUgZGlzYWJsZWQuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG11X3Byb2JlX2luZm8gYXJtdjhfcG11X3Byb2JlX3RhYmxlW10gPSB7CisJUE1VX1BST0JFKDAsIDAsIGFybXY4X3BtdXYzX2luaXQpLCAvKiBlbmFibGUgYWxsIGRlZmluZWQgY291bnRlcnMgKi8KKwl7IC8qIHNlbnRpbmVsIHZhbHVlICovIH0KK307CisKIHN0YXRpYyBpbnQgYXJtdjhfcG11X2RldmljZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXJldHVybiBhcm1fcG11X2RldmljZV9wcm9iZShwZGV2LCBhcm12OF9wbXVfb2ZfZGV2aWNlX2lkcywgTlVMTCk7CisJaWYgKGFjcGlfZGlzYWJsZWQpCisJCXJldHVybiBhcm1fcG11X2RldmljZV9wcm9iZShwZGV2LCBhcm12OF9wbXVfb2ZfZGV2aWNlX2lkcywKKwkJCQkJICAgIE5VTEwpOworCisJcmV0dXJuIGFybV9wbXVfZGV2aWNlX3Byb2JlKHBkZXYsIGFybXY4X3BtdV9vZl9kZXZpY2VfaWRzLAorCQkJCSAgICBhcm12OF9wbXVfcHJvYmVfdGFibGUpOwogfQogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhcm12OF9wbXVfZHJpdmVyID0gewogCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJhcm12OC1wbXUiLAorCQkubmFtZQk9IEFSTVY4X1BNVV9QREVWX05BTUUsCiAJCS5vZl9tYXRjaF90YWJsZSA9IGFybXY4X3BtdV9vZl9kZXZpY2VfaWRzLAogCX0sCiAJLnByb2JlCQk9IGFybXY4X3BtdV9kZXZpY2VfcHJvYmUsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCByZWdpc3Rlcl9hcm12OF9wbXVfZHJpdmVyKHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXJtdjhfcG11X2RyaXZlcik7Ci19Ci1kZXZpY2VfaW5pdGNhbGwocmVnaXN0ZXJfYXJtdjhfcG11X2RyaXZlcik7CitidWlsdGluX3BsYXRmb3JtX2RyaXZlcihhcm12OF9wbXVfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3Byb2Jlcy9kZWNvZGUtaW5zbi5jIGIvYXJjaC9hcm02NC9rZXJuZWwvcHJvYmVzL2RlY29kZS1pbnNuLmMKaW5kZXggMzdlNDdhOS4uZDE3MzFiZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvcHJvYmVzL2RlY29kZS1pbnNuLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvcHJvYmVzL2RlY29kZS1pbnNuLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxhc20va3Byb2Jlcy5oPgogI2luY2x1ZGUgPGFzbS9pbnNuLmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CkBAIC0xMjIsNyArMTIzLDcgQEAKIHN0YXRpYyBib29sIF9fa3Byb2JlcwogaXNfcHJvYmVkX2FkZHJlc3NfYXRvbWljKGtwcm9iZV9vcGNvZGVfdCAqc2Nhbl9zdGFydCwga3Byb2JlX29wY29kZV90ICpzY2FuX2VuZCkKIHsKLQl3aGlsZSAoc2Nhbl9zdGFydCA+IHNjYW5fZW5kKSB7CisJd2hpbGUgKHNjYW5fc3RhcnQgPj0gc2Nhbl9lbmQpIHsKIAkJLyoKIAkJICogYXRvbWljIHJlZ2lvbiBzdGFydHMgZnJvbSBleGNsdXNpdmUgbG9hZCBhbmQgZW5kcyB3aXRoCiAJCSAqIGV4Y2x1c2l2ZSBzdG9yZS4KQEAgLTE0MiwzMyArMTQzLDMwIEBACiB7CiAJZW51bSBrcHJvYmVfaW5zbiBkZWNvZGVkOwogCWtwcm9iZV9vcGNvZGVfdCBpbnNuID0gbGUzMl90b19jcHUoKmFkZHIpOwotCWtwcm9iZV9vcGNvZGVfdCAqc2Nhbl9zdGFydCA9IGFkZHIgLSAxOwotCWtwcm9iZV9vcGNvZGVfdCAqc2Nhbl9lbmQgPSBhZGRyIC0gTUFYX0FUT01JQ19DT05URVhUX1NJWkU7Ci0jaWYgZGVmaW5lZChDT05GSUdfTU9EVUxFUykgJiYgZGVmaW5lZChNT0RVTEVTX1ZBRERSKQotCXN0cnVjdCBtb2R1bGUgKm1vZDsKLSNlbmRpZgorCWtwcm9iZV9vcGNvZGVfdCAqc2Nhbl9lbmQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IDAsIG9mZnNldCA9IDA7CiAKLQlpZiAoYWRkciA+PSAoa3Byb2JlX29wY29kZV90ICopX3RleHQgJiYKLQkgICAgc2Nhbl9lbmQgPCAoa3Byb2JlX29wY29kZV90ICopX3RleHQpCi0JCXNjYW5fZW5kID0gKGtwcm9iZV9vcGNvZGVfdCAqKV90ZXh0OwotI2lmIGRlZmluZWQoQ09ORklHX01PRFVMRVMpICYmIGRlZmluZWQoTU9EVUxFU19WQUREUikKLQllbHNlIHsKLQkJcHJlZW1wdF9kaXNhYmxlKCk7Ci0JCW1vZCA9IF9fbW9kdWxlX2FkZHJlc3MoKHVuc2lnbmVkIGxvbmcpYWRkcik7Ci0JCWlmIChtb2QgJiYgd2l0aGluX21vZHVsZV9pbml0KCh1bnNpZ25lZCBsb25nKWFkZHIsIG1vZCkgJiYKLQkJCSF3aXRoaW5fbW9kdWxlX2luaXQoKHVuc2lnbmVkIGxvbmcpc2Nhbl9lbmQsIG1vZCkpCi0JCQlzY2FuX2VuZCA9IChrcHJvYmVfb3Bjb2RlX3QgKiltb2QtPmluaXRfbGF5b3V0LmJhc2U7Ci0JCWVsc2UgaWYgKG1vZCAmJiB3aXRoaW5fbW9kdWxlX2NvcmUoKHVuc2lnbmVkIGxvbmcpYWRkciwgbW9kKSAmJgotCQkJIXdpdGhpbl9tb2R1bGVfY29yZSgodW5zaWduZWQgbG9uZylzY2FuX2VuZCwgbW9kKSkKLQkJCXNjYW5fZW5kID0gKGtwcm9iZV9vcGNvZGVfdCAqKW1vZC0+Y29yZV9sYXlvdXQuYmFzZTsKLQkJcHJlZW1wdF9lbmFibGUoKTsKKwkvKgorCSAqIElmIHRoZXJlJ3MgYSBzeW1ib2wgZGVmaW5lZCBpbiBmcm9udCBvZiBhbmQgbmVhciBlbm91Z2ggdG8KKwkgKiB0aGUgcHJvYmUgYWRkcmVzcyBhc3N1bWUgaXQgaXMgdGhlIGVudHJ5IHBvaW50IHRvIHRoaXMKKwkgKiBjb2RlIGFuZCB1c2UgaXQgdG8gZnVydGhlciBsaW1pdCBob3cgZmFyIGJhY2sgd2Ugc2VhcmNoCisJICogd2hlbiBkZXRlcm1pbmluZyBpZiB3ZSdyZSBpbiBhbiBhdG9taWMgc2VxdWVuY2UuIElmIHdlIGNvdWxkCisJICogbm90IGZpbmQgYW55IHN5bWJvbCBza2lwIHRoZSBhdG9taWMgdGVzdCBhbHRvZ2V0aGVyIGFzIHdlCisJICogY291bGQgb3RoZXJ3aXNlIGVuZCB1cCBzZWFyY2hpbmcgaXJyZWxldmFudCB0ZXh0L2xpdGVyYWxzLgorCSAqIEtQUk9CRVMgZGVwZW5kcyBvbiBLQUxMU1lNUyBzbyB0aGlzIGxhc3QgY2FzZSBzaG91bGQgbmV2ZXIKKwkgKiBoYXBwZW4uCisJICovCisJaWYgKGthbGxzeW1zX2xvb2t1cF9zaXplX29mZnNldCgodW5zaWduZWQgbG9uZykgYWRkciwgJnNpemUsICZvZmZzZXQpKSB7CisJCWlmIChvZmZzZXQgPCAoTUFYX0FUT01JQ19DT05URVhUX1NJWkUqc2l6ZW9mKGtwcm9iZV9vcGNvZGVfdCkpKQorCQkJc2Nhbl9lbmQgPSBhZGRyIC0gKG9mZnNldCAvIHNpemVvZihrcHJvYmVfb3Bjb2RlX3QpKTsKKwkJZWxzZQorCQkJc2Nhbl9lbmQgPSBhZGRyIC0gTUFYX0FUT01JQ19DT05URVhUX1NJWkU7CiAJfQotI2VuZGlmCiAJZGVjb2RlZCA9IGFybV9wcm9iZV9kZWNvZGVfaW5zbihpbnNuLCBhc2kpOwogCi0JaWYgKGRlY29kZWQgPT0gSU5TTl9SRUpFQ1RFRCB8fAotCQkJaXNfcHJvYmVkX2FkZHJlc3NfYXRvbWljKHNjYW5fc3RhcnQsIHNjYW5fZW5kKSkKLQkJcmV0dXJuIElOU05fUkVKRUNURUQ7CisJaWYgKGRlY29kZWQgIT0gSU5TTl9SRUpFQ1RFRCAmJiBzY2FuX2VuZCkKKwkJaWYgKGlzX3Byb2JlZF9hZGRyZXNzX2F0b21pYyhhZGRyIC0gMSwgc2Nhbl9lbmQpKQorCQkJcmV0dXJuIElOU05fUkVKRUNURUQ7CiAKIAlyZXR1cm4gZGVjb2RlZDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3Byb2Jlcy9rcHJvYmVzLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9wcm9iZXMva3Byb2Jlcy5jCmluZGV4IGM2YjBmNDAuLmY1MDc3ZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3Byb2Jlcy9rcHJvYmVzLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvcHJvYmVzL2twcm9iZXMuYwpAQCAtMTksNyArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2thc2FuLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3RvcF9tYWNoaW5lLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8YXNtL2luc24uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zZWN0aW9ucy5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogCiAjaW5jbHVkZSAiZGVjb2RlLWluc24uaCIKIApAQCAtMTY2LDEzICsxNjYsMTggQEAKIH0KIAogLyoKLSAqIFRoZSBELWZsYWcgKERlYnVnIG1hc2spIGlzIHNldCAobWFza2VkKSB1cG9uIGRlYnVnIGV4Y2VwdGlvbiBlbnRyeS4KLSAqIEtwcm9iZXMgbmVlZHMgdG8gY2xlYXIgKHVubWFzaykgRC1mbGFnIC1PTkxZLSBpbiBjYXNlIG9mIHJlY3Vyc2l2ZQotICogcHJvYmUgaS5lLiB3aGVuIHByb2JlIGhpdCBmcm9tIGtwcm9iZSBoYW5kbGVyIGNvbnRleHQgdXBvbgotICogZXhlY3V0aW5nIHRoZSBwcmUvcG9zdCBoYW5kbGVycy4gSW4gdGhpcyBjYXNlIHdlIHJldHVybiB3aXRoCi0gKiBELWZsYWcgY2xlYXIgc28gdGhhdCBzaW5nbGUtc3RlcHBpbmcgY2FuIGJlIGNhcnJpZWQtb3V0LgotICoKLSAqIExlYXZlIEQtZmxhZyBzZXQgaW4gYWxsIG90aGVyIGNhc2VzLgorICogV2hlbiBQU1RBVEUuRCBpcyBzZXQgKG1hc2tlZCksIHRoZW4gc29mdHdhcmUgc3RlcCBleGNlcHRpb25zIGNhbiBub3QgYmUKKyAqIGdlbmVyYXRlZC4KKyAqIFNQU1IncyBEIGJpdCBzaG93cyB0aGUgdmFsdWUgb2YgUFNUQVRFLkQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZQorICogZXhjZXB0aW9uIHdhcyB0YWtlbi4gUFNUQVRFLkQgaXMgc2V0IHdoaWxlIGVudGVyaW5nIGludG8gYW55IGV4Y2VwdGlvbgorICogbW9kZSwgaG93ZXZlciBzb2Z0d2FyZSBjbGVhcnMgaXQgZm9yIGFueSBub3JtYWwgKG5vbmUtZGVidWctZXhjZXB0aW9uKQorICogbW9kZSBpbiB0aGUgZXhjZXB0aW9uIGVudHJ5LiBUaGVyZWZvcmUsIHdoZW4gd2UgYXJlIGVudGVyaW5nIGludG8ga3Byb2JlCisgKiBicmVha3BvaW50IGhhbmRsZXIgZnJvbSBhbnkgbm9ybWFsIG1vZGUgdGhlbiBTUFNSLkQgYml0IGlzIGFscmVhZHkKKyAqIGNsZWFyZWQsIGhvd2V2ZXIgaXQgaXMgc2V0IHdoZW4gd2UgYXJlIGVudGVyaW5nIGZyb20gYW55IGRlYnVnIGV4Y2VwdGlvbgorICogbW9kZS4KKyAqIFNpbmNlIHdlIGFsd2F5cyBuZWVkIHRvIGdlbmVyYXRlIHNpbmdsZSBzdGVwIGV4Y2VwdGlvbiBhZnRlciBhIGtwcm9iZQorICogYnJlYWtwb2ludCBleGNlcHRpb24gdGhlcmVmb3JlIHdlIG5lZWQgdG8gY2xlYXIgaXQgdW5jb25kaXRpb25hbGx5LCB3aGVuCisgKiB3ZSBiZWNvbWUgc3VyZSB0aGF0IHRoZSBjdXJyZW50IGJyZWFrcG9pbnQgZXhjZXB0aW9uIGlzIGZvciBrcHJvYmUuCiAgKi8KIHN0YXRpYyB2b2lkIF9fa3Byb2Jlcwogc3Bzcl9zZXRfZGVidWdfZmxhZyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IG1hc2spCkBAIC0yNDUsMTAgKzI1MCw3IEBACiAKIAkJc2V0X3NzX2NvbnRleHQoa2NiLCBzbG90KTsJLyogbWFyayBwZW5kaW5nIHNzICovCiAKLQkJaWYgKGtjYi0+a3Byb2JlX3N0YXR1cyA9PSBLUFJPQkVfUkVFTlRFUikKLQkJCXNwc3Jfc2V0X2RlYnVnX2ZsYWcocmVncywgMCk7Ci0JCWVsc2UKLQkJCVdBUk5fT04ocmVncy0+cHN0YXRlICYgUFNSX0RfQklUKTsKKwkJc3Bzcl9zZXRfZGVidWdfZmxhZyhyZWdzLCAwKTsKIAogCQkvKiBJUlFzIGFuZCBzaW5nbGUgc3RlcHBpbmcgZG8gbm90IG1peCB3ZWxsLiAqLwogCQlrcHJvYmVzX3NhdmVfbG9jYWxfaXJxZmxhZyhrY2IsIHJlZ3MpOwpAQCAtMzMzLDggKzMzNSw2IEBACiAJCQlCVUcoKTsKIAogCQlrZXJuZWxfZGlzYWJsZV9zaW5nbGVfc3RlcCgpOwotCQlpZiAoa2NiLT5rcHJvYmVfc3RhdHVzID09IEtQUk9CRV9SRUVOVEVSKQotCQkJc3Bzcl9zZXRfZGVidWdfZmxhZyhyZWdzLCAxKTsKIAogCQlpZiAoa2NiLT5rcHJvYmVfc3RhdHVzID09IEtQUk9CRV9SRUVOVEVSKQogCQkJcmVzdG9yZV9wcmV2aW91c19rcHJvYmUoa2NiKTsKQEAgLTQ1Nyw5ICs0NTcsNiBAQAogCQlrcHJvYmVzX3Jlc3RvcmVfbG9jYWxfaXJxZmxhZyhrY2IsIHJlZ3MpOwogCQlrZXJuZWxfZGlzYWJsZV9zaW5nbGVfc3RlcCgpOwogCi0JCWlmIChrY2ItPmtwcm9iZV9zdGF0dXMgPT0gS1BST0JFX1JFRU5URVIpCi0JCQlzcHNyX3NldF9kZWJ1Z19mbGFnKHJlZ3MsIDEpOwotCiAJCXBvc3Rfa3Byb2JlX2hhbmRsZXIoa2NiLCByZWdzKTsKIAl9CiAKQEAgLTU0Myw5ICs1NDAsNiBAQAogCiBib29sIGFyY2hfd2l0aGluX2twcm9iZV9ibGFja2xpc3QodW5zaWduZWQgbG9uZyBhZGRyKQogewotCWV4dGVybiBjaGFyIF9faWRtYXBfdGV4dF9zdGFydFtdLCBfX2lkbWFwX3RleHRfZW5kW107Ci0JZXh0ZXJuIGNoYXIgX19oeXBfaWRtYXBfdGV4dF9zdGFydFtdLCBfX2h5cF9pZG1hcF90ZXh0X2VuZFtdOwotCiAJaWYgKChhZGRyID49ICh1bnNpZ25lZCBsb25nKV9fa3Byb2Jlc190ZXh0X3N0YXJ0ICYmCiAJICAgIGFkZHIgPCAodW5zaWduZWQgbG9uZylfX2twcm9iZXNfdGV4dF9lbmQpIHx8CiAJICAgIChhZGRyID49ICh1bnNpZ25lZCBsb25nKV9fZW50cnlfdGV4dF9zdGFydCAmJgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9hcm02NC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDZjZDI2MTIuLmE0ZjVmNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTIwMiw3ICsyMDIsNyBAQAogCiBzdGF0aWMgdm9pZCB0bHNfdGhyZWFkX2ZsdXNoKHZvaWQpCiB7Ci0JYXNtICgibXNyIHRwaWRyX2VsMCwgeHpyIik7CisJd3JpdGVfc3lzcmVnKDAsIHRwaWRyX2VsMCk7CiAKIAlpZiAoaXNfY29tcGF0X3Rhc2soKSkgewogCQljdXJyZW50LT50aHJlYWQudHBfdmFsdWUgPSAwOwpAQCAtMjEzLDcgKzIxMyw3IEBACiAJCSAqIHdpdGggYSBzdGFsZSBzaGFkb3cgc3RhdGUgZHVyaW5nIGNvbnRleHQgc3dpdGNoLgogCQkgKi8KIAkJYmFycmllcigpOwotCQlhc20gKCJtc3IgdHBpZHJyb19lbDAsIHh6ciIpOworCQl3cml0ZV9zeXNyZWcoMCwgdHBpZHJyb19lbDApOwogCX0KIH0KIApAQCAtMjUzLDcgKzI1Myw3IEBACiAJCSAqIFJlYWQgdGhlIGN1cnJlbnQgVExTIHBvaW50ZXIgZnJvbSB0cGlkcl9lbDAgYXMgaXQgbWF5IGJlCiAJCSAqIG91dC1vZi1zeW5jIHdpdGggdGhlIHNhdmVkIHZhbHVlLgogCQkgKi8KLQkJYXNtKCJtcnMgJTAsIHRwaWRyX2VsMCIgOiAiPXIiICgqdGFza191c2VyX3RscyhwKSkpOworCQkqdGFza191c2VyX3RscyhwKSA9IHJlYWRfc3lzcmVnKHRwaWRyX2VsMCk7CiAKIAkJaWYgKHN0YWNrX3N0YXJ0KSB7CiAJCQlpZiAoaXNfY29tcGF0X3RocmVhZCh0YXNrX3RocmVhZF9pbmZvKHApKSkKQEAgLTI4OSwxNyArMjg5LDE1IEBACiB7CiAJdW5zaWduZWQgbG9uZyB0cGlkciwgdHBpZHJybzsKIAotCWFzbSgibXJzICUwLCB0cGlkcl9lbDAiIDogIj1yIiAodHBpZHIpKTsKKwl0cGlkciA9IHJlYWRfc3lzcmVnKHRwaWRyX2VsMCk7CiAJKnRhc2tfdXNlcl90bHMoY3VycmVudCkgPSB0cGlkcjsKIAogCXRwaWRyID0gKnRhc2tfdXNlcl90bHMobmV4dCk7CiAJdHBpZHJybyA9IGlzX2NvbXBhdF90aHJlYWQodGFza190aHJlYWRfaW5mbyhuZXh0KSkgPwogCQkgIG5leHQtPnRocmVhZC50cF92YWx1ZSA6IDA7CiAKLQlhc20oCi0JIgltc3IJdHBpZHJfZWwwLCAlMFxuIgotCSIJbXNyCXRwaWRycm9fZWwwLCAlMSIKLQk6IDogInIiICh0cGlkciksICJyIiAodHBpZHJybykpOworCXdyaXRlX3N5c3JlZyh0cGlkciwgdHBpZHJfZWwwKTsKKwl3cml0ZV9zeXNyZWcodHBpZHJybywgdHBpZHJyb19lbDApOwogfQogCiAvKiBSZXN0b3JlIHRoZSBVQU8gc3RhdGUgZGVwZW5kaW5nIG9uIG5leHQncyBhZGRyX2xpbWl0ICovCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUyBiL2FyY2gvYXJtNjQva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TCmluZGV4IDUxYjczY2QuLmNlNzA0YTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TCkBAIC0zNCw3ICszNCw3IEBACiAJLyogU2V0dXAgdGhlIGxpc3QgbG9vcCB2YXJpYWJsZXMuICovCiAJbW92CXgxNywgeDEJCQkJLyogeDE3ID0ga2ltYWdlX3N0YXJ0ICovCiAJbW92CXgxNiwgeDAJCQkJLyogeDE2ID0ga2ltYWdlX2hlYWQgKi8KLQlkY2FjaGVfbGluZV9zaXplIHgxNSwgeDAJCS8qIHgxNSA9IGRjYWNoZSBsaW5lIHNpemUgKi8KKwlyYXdfZGNhY2hlX2xpbmVfc2l6ZSB4MTUsIHgwCQkvKiB4MTUgPSBkY2FjaGUgbGluZSBzaXplICovCiAJbW92CXgxNCwgeHpyCQkJLyogeDE0ID0gZW50cnkgcHRyICovCiAJbW92CXgxMywgeHpyCQkJLyogeDEzID0gY29weSBkZXN0ICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3NldHVwLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9zZXR1cC5jCmluZGV4IDUzNmRjZTIuLmY1MzRmNDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvc2V0dXAuYwpAQCAtMjA2LDEwICsyMDYsMTUgQEAKIAogCWZvcl9lYWNoX21lbWJsb2NrKG1lbW9yeSwgcmVnaW9uKSB7CiAJCXJlcyA9IGFsbG9jX2Jvb3RtZW1fbG93KHNpemVvZigqcmVzKSk7Ci0JCXJlcy0+bmFtZSAgPSAiU3lzdGVtIFJBTSI7CisJCWlmIChtZW1ibG9ja19pc19ub21hcChyZWdpb24pKSB7CisJCQlyZXMtPm5hbWUgID0gInJlc2VydmVkIjsKKwkJCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX01FTSB8IElPUkVTT1VSQ0VfQlVTWTsKKwkJfSBlbHNlIHsKKwkJCXJlcy0+bmFtZSAgPSAiU3lzdGVtIFJBTSI7CisJCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9TWVNURU1fUkFNIHwgSU9SRVNPVVJDRV9CVVNZOworCQl9CiAJCXJlcy0+c3RhcnQgPSBfX3Bmbl90b19waHlzKG1lbWJsb2NrX3JlZ2lvbl9tZW1vcnlfYmFzZV9wZm4ocmVnaW9uKSk7CiAJCXJlcy0+ZW5kID0gX19wZm5fdG9fcGh5cyhtZW1ibG9ja19yZWdpb25fbWVtb3J5X2VuZF9wZm4ocmVnaW9uKSkgLSAxOwotCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9TWVNURU1fUkFNIHwgSU9SRVNPVVJDRV9CVVNZOwogCiAJCXJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCByZXMpOwogCkBAIC0yMjgsNyArMjMzLDcgQEAKIHsKIAlwcl9pbmZvKCJCb290IENQVTogQUFyY2g2NCBQcm9jZXNzb3IgWyUwOHhdXG4iLCByZWFkX2NwdWlkX2lkKCkpOwogCi0Jc3ByaW50Zihpbml0X3V0c25hbWUoKS0+bWFjaGluZSwgRUxGX1BMQVRGT1JNKTsKKwlzcHJpbnRmKGluaXRfdXRzbmFtZSgpLT5tYWNoaW5lLCBVVFNfTUFDSElORSk7CiAJaW5pdF9tbS5zdGFydF9jb2RlID0gKHVuc2lnbmVkIGxvbmcpIF90ZXh0OwogCWluaXRfbW0uZW5kX2NvZGUgICA9ICh1bnNpZ25lZCBsb25nKSBfZXRleHQ7CiAJaW5pdF9tbS5lbmRfZGF0YSAgID0gKHVuc2lnbmVkIGxvbmcpIF9lZGF0YTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9hcm02NC9rZXJuZWwvc2lnbmFsLmMKaW5kZXggYThlYWZkYi4uNDA0ZGQ2NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvc2lnbmFsLmMKQEAgLTQwMiwxNSArNDAyLDMxIEBACiBhc21saW5rYWdlIHZvaWQgZG9fbm90aWZ5X3Jlc3VtZShzdHJ1Y3QgcHRfcmVncyAqcmVncywKIAkJCQkgdW5zaWduZWQgaW50IHRocmVhZF9mbGFncykKIHsKLQlpZiAodGhyZWFkX2ZsYWdzICYgX1RJRl9TSUdQRU5ESU5HKQotCQlkb19zaWduYWwocmVncyk7CisJLyoKKwkgKiBUaGUgYXNzZW1ibHkgY29kZSBlbnRlcnMgdXMgd2l0aCBJUlFzIG9mZiwgYnV0IGl0IGhhc24ndAorCSAqIGluZm9ybWVkIHRoZSB0cmFjaW5nIGNvZGUgb2YgdGhhdCBmb3IgZWZmaWNpZW5jeSByZWFzb25zLgorCSAqIFVwZGF0ZSB0aGUgdHJhY2UgY29kZSB3aXRoIHRoZSBjdXJyZW50IHN0YXR1cy4KKwkgKi8KKwl0cmFjZV9oYXJkaXJxc19vZmYoKTsKKwlkbyB7CisJCWlmICh0aHJlYWRfZmxhZ3MgJiBfVElGX05FRURfUkVTQ0hFRCkgeworCQkJc2NoZWR1bGUoKTsKKwkJfSBlbHNlIHsKKwkJCWxvY2FsX2lycV9lbmFibGUoKTsKIAotCWlmICh0aHJlYWRfZmxhZ3MgJiBfVElGX05PVElGWV9SRVNVTUUpIHsKLQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX05PVElGWV9SRVNVTUUpOwotCQl0cmFjZWhvb2tfbm90aWZ5X3Jlc3VtZShyZWdzKTsKLQl9CisJCQlpZiAodGhyZWFkX2ZsYWdzICYgX1RJRl9TSUdQRU5ESU5HKQorCQkJCWRvX3NpZ25hbChyZWdzKTsKIAotCWlmICh0aHJlYWRfZmxhZ3MgJiBfVElGX0ZPUkVJR05fRlBTVEFURSkKLQkJZnBzaW1kX3Jlc3RvcmVfY3VycmVudF9zdGF0ZSgpOworCQkJaWYgKHRocmVhZF9mbGFncyAmIF9USUZfTk9USUZZX1JFU1VNRSkgeworCQkJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9OT1RJRllfUkVTVU1FKTsKKwkJCQl0cmFjZWhvb2tfbm90aWZ5X3Jlc3VtZShyZWdzKTsKKwkJCX0KIAorCQkJaWYgKHRocmVhZF9mbGFncyAmIF9USUZfRk9SRUlHTl9GUFNUQVRFKQorCQkJCWZwc2ltZF9yZXN0b3JlX2N1cnJlbnRfc3RhdGUoKTsKKwkJfQorCisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCXRocmVhZF9mbGFncyA9IFJFQURfT05DRShjdXJyZW50X3RocmVhZF9pbmZvKCktPmZsYWdzKTsKKwl9IHdoaWxlICh0aHJlYWRfZmxhZ3MgJiBfVElGX1dPUktfTUFTSyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9zbGVlcC5TIGIvYXJjaC9hcm02NC9rZXJuZWwvc2xlZXAuUwppbmRleCA5YTNhZWM5Li5iODc5OWU3IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9zbGVlcC5TCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL3NsZWVwLlMKQEAgLTczLDEwICs3Myw5IEBACiAJc3RyCXgyLCBbeDAsICNTTEVFUF9TVEFDS19EQVRBX1NZU1RFTV9SRUdTICsgQ1BVX0NUWF9TUF0KIAogCS8qIGZpbmQgdGhlIG1waWRyX2hhc2ggKi8KLQlsZHIJeDEsID1zbGVlcF9zYXZlX3N0YXNoCi0JbGRyCXgxLCBbeDFdCisJbGRyX2wJeDEsIHNsZWVwX3NhdmVfc3Rhc2gKIAltcnMJeDcsIG1waWRyX2VsMQotCWxkcgl4OSwgPW1waWRyX2hhc2gKKwlhZHJfbAl4OSwgbXBpZHJfaGFzaAogCWxkcgl4MTAsIFt4OSwgI01QSURSX0hBU0hfTUFTS10KIAkvKgogCSAqIEZvbGxvd2luZyBjb2RlIHJlbGllcyBvbiB0aGUgc3RydWN0IG1waWRyX2hhc2gKQEAgLTk1LDI4ICs5NCwzMCBAQAogCW1vdgl4MCwgIzEKIAlyZXQKIEVORFBST0MoX19jcHVfc3VzcGVuZF9lbnRlcikKLQkubHRvcmcKIAorCS5wdXNoc2VjdGlvbiAiLmlkbWFwLnRleHQiLCAiYXgiCiBFTlRSWShjcHVfcmVzdW1lKQogCWJsCWVsMl9zZXR1cAkJLy8gaWYgaW4gRUwyIGRyb3AgdG8gRUwxIGNsZWFubHkKKwlibAlfX2NwdV9zZXR1cAogCS8qIGVuYWJsZSB0aGUgTU1VIGVhcmx5IC0gc28gd2UgY2FuIGFjY2VzcyBzbGVlcF9zYXZlX3N0YXNoIGJ5IHZhICovCi0JYWRyX2wJbHIsIF9fZW5hYmxlX21tdQkvKiBfX2NwdV9zZXR1cCB3aWxsIHJldHVybiBoZXJlICovCi0JbGRyCXgyNywgPV9jcHVfcmVzdW1lCS8qIF9fZW5hYmxlX21tdSB3aWxsIGJyYW5jaCBoZXJlICovCi0JYWRycAl4MjUsIGlkbWFwX3BnX2RpcgotCWFkcnAJeDI2LCBzd2FwcGVyX3BnX2RpcgotCWIJX19jcHVfc2V0dXAKKwlibAlfX2VuYWJsZV9tbXUKKwlsZHIJeDgsID1fY3B1X3Jlc3VtZQorCWJyCXg4CiBFTkRQUk9DKGNwdV9yZXN1bWUpCisJLmx0b3JnCisJLnBvcHNlY3Rpb24KIAogRU5UUlkoX2NwdV9yZXN1bWUpCiAJbXJzCXgxLCBtcGlkcl9lbDEKLQlhZHJwCXg4LCBtcGlkcl9oYXNoCi0JYWRkIHg4LCB4OCwgIzpsbzEyOm1waWRyX2hhc2ggLy8geDggPSBzdHJ1Y3QgbXBpZHJfaGFzaCBwaHlzIGFkZHJlc3MKLSAgICAgICAgLyogcmV0cmlldmUgbXBpZHJfaGFzaCBtZW1iZXJzIHRvIGNvbXB1dGUgdGhlIGhhc2ggKi8KKwlhZHJfbAl4OCwgbXBpZHJfaGFzaAkJLy8geDggPSBzdHJ1Y3QgbXBpZHJfaGFzaCB2aXJ0IGFkZHJlc3MKKworCS8qIHJldHJpZXZlIG1waWRyX2hhc2ggbWVtYmVycyB0byBjb21wdXRlIHRoZSBoYXNoICovCiAJbGRyCXgyLCBbeDgsICNNUElEUl9IQVNIX01BU0tdCiAJbGRwCXczLCB3NCwgW3g4LCAjTVBJRFJfSEFTSF9TSElGVFNdCiAJbGRwCXc1LCB3NiwgW3g4LCAjKE1QSURSX0hBU0hfU0hJRlRTICsgOCldCiAJY29tcHV0ZV9tcGlkcl9oYXNoIHg3LCB4MywgeDQsIHg1LCB4NiwgeDEsIHgyCi0gICAgICAgIC8qIHg3IGNvbnRhaW5zIGhhc2ggaW5kZXgsIGxldCdzIHVzZSBpdCB0byBncmFiIGNvbnRleHQgcG9pbnRlciAqLworCisJLyogeDcgY29udGFpbnMgaGFzaCBpbmRleCwgbGV0J3MgdXNlIGl0IHRvIGdyYWIgY29udGV4dCBwb2ludGVyICovCiAJbGRyX2wJeDAsIHNsZWVwX3NhdmVfc3Rhc2gKIAlsZHIJeDAsIFt4MCwgeDcsIGxzbCAjM10KIAlhZGQJeDI5LCB4MCwgI1NMRUVQX1NUQUNLX0RBVEFfQ0FMTEVFX1JFR1MKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3NtcC5jIGIvYXJjaC9hcm02NC9rZXJuZWwvc21wLmMKaW5kZXggZDkzZDQzMy4uZDNmMTUxYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvc21wLmMKQEAgLTIwMSwxMiArMjAxLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBzbXBfc3RvcmVfY3B1X2luZm8odW5zaWduZWQgaW50IGNwdWlkKQotewotCXN0b3JlX2NwdV90b3BvbG9neShjcHVpZCk7Ci0JbnVtYV9zdG9yZV9jcHVfaW5mbyhjcHVpZCk7Ci19Ci0KIC8qCiAgKiBUaGlzIGlzIHRoZSBzZWNvbmRhcnkgQ1BVIGJvb3QgZW50cnkuICBXZSdyZSB1c2luZyB0aGlzIENQVXMKICAqIGlkbGUgdGhyZWFkIHN0YWNrLCBidXQgYSBzZXQgb2YgdGVtcG9yYXJ5IHBhZ2UgdGFibGVzLgpAQCAtMjM5LDcgKzIzMyw3IEBACiAJICogdGhpcyBDUFUgdGlja3MgYWxsIG9mIHRob3NlLiBJZiBpdCBkb2Vzbid0LCB0aGUgQ1BVIHdpbGwKIAkgKiBmYWlsIHRvIGNvbWUgb25saW5lLgogCSAqLwotCXZlcmlmeV9sb2NhbF9jcHVfY2FwYWJpbGl0aWVzKCk7CisJY2hlY2tfbG9jYWxfY3B1X2NhcGFiaWxpdGllcygpOwogCiAJaWYgKGNwdV9vcHNbY3B1XS0+Y3B1X3Bvc3Rib290KQogCQljcHVfb3BzW2NwdV0tPmNwdV9wb3N0Ym9vdCgpOwpAQCAtMjU0LDcgKzI0OCw3IEBACiAJICovCiAJbm90aWZ5X2NwdV9zdGFydGluZyhjcHUpOwogCi0Jc21wX3N0b3JlX2NwdV9pbmZvKGNwdSk7CisJc3RvcmVfY3B1X3RvcG9sb2d5KGNwdSk7CiAKIAkvKgogCSAqIE9LLCBub3cgaXQncyBzYWZlIHRvIGxldCB0aGUgYm9vdCBDUFUgY29udGludWUuICBXYWl0IGZvcgpAQCAtNDM3LDggKzQzMSwxOSBAQAogdm9pZCBfX2luaXQgc21wX3ByZXBhcmVfYm9vdF9jcHUodm9pZCkKIHsKIAlzZXRfbXlfY3B1X29mZnNldChwZXJfY3B1X29mZnNldChzbXBfcHJvY2Vzc29yX2lkKCkpKTsKKwkvKgorCSAqIEluaXRpYWxpc2UgdGhlIHN0YXRpYyBrZXlzIGVhcmx5IGFzIHRoZXkgbWF5IGJlIGVuYWJsZWQgYnkgdGhlCisJICogY3B1ZmVhdHVyZSBjb2RlLgorCSAqLworCWp1bXBfbGFiZWxfaW5pdCgpOwogCWNwdWluZm9fc3RvcmVfYm9vdF9jcHUoKTsKIAlzYXZlX2Jvb3RfY3B1X3J1bl9lbCgpOworCS8qCisJICogUnVuIHRoZSBlcnJhdGEgd29yayBhcm91bmQgY2hlY2tzIG9uIHRoZSBib290IENQVSwgb25jZSB3ZSBoYXZlCisJICogaW5pdGlhbGlzZWQgdGhlIGNwdSBmZWF0dXJlIGluZnJhc3RydWN0dXJlIGZyb20KKwkgKiBjcHVpbmZvX3N0b3JlX2Jvb3RfY3B1KCkgYWJvdmUuCisJICovCisJdXBkYXRlX2NwdV9lcnJhdGFfd29ya2Fyb3VuZHMoKTsKIH0KIAogc3RhdGljIHU2NCBfX2luaXQgb2ZfZ2V0X2NwdV9tcGlkcihzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKQpAQCAtNjE5LDYgKzYyNCw3IEBACiAJCQl9CiAKIAkJCWJvb3RjcHVfdmFsaWQgPSB0cnVlOworCQkJZWFybHlfbWFwX2NwdV90b19ub2RlKDAsIG9mX25vZGVfdG9fbmlkKGRuKSk7CiAKIAkJCS8qCiAJCQkgKiBjcHVfbG9naWNhbF9tYXAgaGFzIGFscmVhZHkgYmVlbgpAQCAtNjg5LDEwICs2OTUsMTMgQEAKIHsKIAlpbnQgZXJyOwogCXVuc2lnbmVkIGludCBjcHU7CisJdW5zaWduZWQgaW50IHRoaXNfY3B1OwogCiAJaW5pdF9jcHVfdG9wb2xvZ3koKTsKIAotCXNtcF9zdG9yZV9jcHVfaW5mbyhzbXBfcHJvY2Vzc29yX2lkKCkpOworCXRoaXNfY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXN0b3JlX2NwdV90b3BvbG9neSh0aGlzX2NwdSk7CisJbnVtYV9zdG9yZV9jcHVfaW5mbyh0aGlzX2NwdSk7CiAKIAkvKgogCSAqIElmIFVQIGlzIG1hbmRhdGVkIGJ5ICJub3NtcCIgKHdoaWNoIGltcGxpZXMgIm1heGNwdXM9MCIpLCBkb24ndCBzZXQKQEAgLTcxOSw2ICs3MjgsNyBAQAogCQkJY29udGludWU7CiAKIAkJc2V0X2NwdV9wcmVzZW50KGNwdSwgdHJ1ZSk7CisJCW51bWFfc3RvcmVfY3B1X2luZm8oY3B1KTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3NtcF9zcGluX3RhYmxlLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9zbXBfc3Bpbl90YWJsZS5jCmluZGV4IDE4YTcxYmMuLjlhMDBlZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3NtcF9zcGluX3RhYmxlLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvc21wX3NwaW5fdGFibGUuYwpAQCAtMjksNyArMjksOCBAQAogI2luY2x1ZGUgPGFzbS9zbXBfcGxhdC5oPgogCiBleHRlcm4gdm9pZCBzZWNvbmRhcnlfaG9sZGluZ19wZW4odm9pZCk7Ci12b2xhdGlsZSB1bnNpZ25lZCBsb25nIHNlY29uZGFyeV9ob2xkaW5nX3Blbl9yZWxlYXNlID0gSU5WQUxJRF9IV0lEOwordm9sYXRpbGUgdW5zaWduZWQgbG9uZyBfX3NlY3Rpb24oIi5tbXVvZmYuZGF0YS5yZWFkIikKK3NlY29uZGFyeV9ob2xkaW5nX3Blbl9yZWxlYXNlID0gSU5WQUxJRF9IV0lEOwogCiBzdGF0aWMgcGh5c19hZGRyX3QgY3B1X3JlbGVhc2VfYWRkcltOUl9DUFVTXTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvc3RhY2t0cmFjZS5jIGIvYXJjaC9hcm02NC9rZXJuZWwvc3RhY2t0cmFjZS5jCmluZGV4IGQ5NzUxYTQuLmMyZWZkZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3N0YWNrdHJhY2UuYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9zdGFja3RyYWNlLmMKQEAgLTQzLDYgKzQzLDkgQEAKIAl1bnNpZ25lZCBsb25nIGZwID0gZnJhbWUtPmZwOwogCXVuc2lnbmVkIGxvbmcgaXJxX3N0YWNrX3B0cjsKIAorCWlmICghdHNrKQorCQl0c2sgPSBjdXJyZW50OworCiAJLyoKIAkgKiBTd2l0Y2hpbmcgYmV0d2VlbiBzdGFja3MgaXMgdmFsaWQgd2hlbiB0cmFjaW5nIGN1cnJlbnQgYW5kIGluCiAJICogbm9uLXByZWVtcHRpYmxlIGNvbnRleHQuCkBAIC02Nyw3ICs3MCw3IEBACiAJZnJhbWUtPnBjID0gUkVBRF9PTkNFX05PQ0hFQ0soKih1bnNpZ25lZCBsb25nICopKGZwICsgOCkpOwogCiAjaWZkZWYgQ09ORklHX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUgotCWlmICh0c2sgJiYgdHNrLT5yZXRfc3RhY2sgJiYKKwlpZiAodHNrLT5yZXRfc3RhY2sgJiYKIAkJCShmcmFtZS0+cGMgPT0gKHVuc2lnbmVkIGxvbmcpcmV0dXJuX3RvX2hhbmRsZXIpKSB7CiAJCS8qCiAJCSAqIFRoaXMgaXMgYSBjYXNlIHdoZXJlIGZ1bmN0aW9uIGdyYXBoIHRyYWNlciBoYXMKQEAgLTE1Miw2ICsxNTUsMjcgQEAKIAlyZXR1cm4gdHJhY2UtPm5yX2VudHJpZXMgPj0gdHJhY2UtPm1heF9lbnRyaWVzOwogfQogCit2b2lkIHNhdmVfc3RhY2tfdHJhY2VfcmVncyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSkKK3sKKwlzdHJ1Y3Qgc3RhY2tfdHJhY2VfZGF0YSBkYXRhOworCXN0cnVjdCBzdGFja2ZyYW1lIGZyYW1lOworCisJZGF0YS50cmFjZSA9IHRyYWNlOworCWRhdGEuc2tpcCA9IHRyYWNlLT5za2lwOworCWRhdGEubm9fc2NoZWRfZnVuY3Rpb25zID0gMDsKKworCWZyYW1lLmZwID0gcmVncy0+cmVnc1syOV07CisJZnJhbWUuc3AgPSByZWdzLT5zcDsKKwlmcmFtZS5wYyA9IHJlZ3MtPnBjOworI2lmZGVmIENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIKKwlmcmFtZS5ncmFwaCA9IGN1cnJlbnQtPmN1cnJfcmV0X3N0YWNrOworI2VuZGlmCisKKwl3YWxrX3N0YWNrZnJhbWUoY3VycmVudCwgJmZyYW1lLCBzYXZlX3RyYWNlLCAmZGF0YSk7CisJaWYgKHRyYWNlLT5ucl9lbnRyaWVzIDwgdHJhY2UtPm1heF9lbnRyaWVzKQorCQl0cmFjZS0+ZW50cmllc1t0cmFjZS0+bnJfZW50cmllcysrXSA9IFVMT05HX01BWDsKK30KKwogdm9pZCBzYXZlX3N0YWNrX3RyYWNlX3RzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSkKIHsKIAlzdHJ1Y3Qgc3RhY2tfdHJhY2VfZGF0YSBkYXRhOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvc3VzcGVuZC5jIGIvYXJjaC9hcm02NC9rZXJuZWwvc3VzcGVuZC5jCmluZGV4IGI2MTZlMzYuLmFkNzM0MTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3N1c3BlbmQuYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9zdXNwZW5kLmMKQEAgLTIzLDggKzIzLDggQEAKICAqIHRpbWUgdGhlIG5vdGlmaWVyIHJ1bnMgZGVidWcgZXhjZXB0aW9ucyBtaWdodCBoYXZlIGJlZW4gZW5hYmxlZCBhbHJlYWR5LAogICogd2l0aCBIVyBicmVha3BvaW50cyByZWdpc3RlcnMgY29udGVudCBzdGlsbCBpbiBhbiB1bmtub3duIHN0YXRlLgogICovCi1zdGF0aWMgdm9pZCAoKmh3X2JyZWFrcG9pbnRfcmVzdG9yZSkodm9pZCAqKTsKLXZvaWQgX19pbml0IGNwdV9zdXNwZW5kX3NldF9kYmdfcmVzdG9yZXIodm9pZCAoKmh3X2JwX3Jlc3RvcmUpKHZvaWQgKikpCitzdGF0aWMgaW50ICgqaHdfYnJlYWtwb2ludF9yZXN0b3JlKSh1bnNpZ25lZCBpbnQpOwordm9pZCBfX2luaXQgY3B1X3N1c3BlbmRfc2V0X2RiZ19yZXN0b3JlcihpbnQgKCpod19icF9yZXN0b3JlKSh1bnNpZ25lZCBpbnQpKQogewogCS8qIFByZXZlbnQgbXVsdGlwbGUgcmVzdG9yZSBob29rIGluaXRpYWxpemF0aW9ucyAqLwogCWlmIChXQVJOX09OKGh3X2JyZWFrcG9pbnRfcmVzdG9yZSkpCkBAIC0zNCw2ICszNCw4IEBACiAKIHZvaWQgbm90cmFjZSBfX2NwdV9zdXNwZW5kX2V4aXQodm9pZCkKIHsKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCiAJLyoKIAkgKiBXZSBhcmUgcmVzdW1pbmcgZnJvbSByZXNldCB3aXRoIHRoZSBpZG1hcCBhY3RpdmUgaW4gVFRCUjBfRUwxLgogCSAqIFdlIG11c3QgdW5pbnN0YWxsIHRoZSBpZG1hcCBhbmQgcmVzdG9yZSB0aGUgZXhwZWN0ZWQgTU1VCkBAIC00NSw3ICs0Nyw3IEBACiAJICogUmVzdG9yZSBwZXItY3B1IG9mZnNldCBiZWZvcmUgYW55IGtlcm5lbAogCSAqIHN1YnN5c3RlbSByZWx5aW5nIG9uIGl0IGhhcyBhIGNoYW5jZSB0byBydW4uCiAJICovCi0Jc2V0X215X2NwdV9vZmZzZXQocGVyX2NwdV9vZmZzZXQoc21wX3Byb2Nlc3Nvcl9pZCgpKSk7CisJc2V0X215X2NwdV9vZmZzZXQocGVyX2NwdV9vZmZzZXQoY3B1KSk7CiAKIAkvKgogCSAqIFJlc3RvcmUgSFcgYnJlYWtwb2ludCByZWdpc3RlcnMgdG8gc2FuZSB2YWx1ZXMKQEAgLTUzLDcgKzU1LDcgQEAKIAkgKiB0aHJvdWdoIGxvY2FsX2RiZ19yZXN0b3JlLgogCSAqLwogCWlmIChod19icmVha3BvaW50X3Jlc3RvcmUpCi0JCWh3X2JyZWFrcG9pbnRfcmVzdG9yZShOVUxMKTsKKwkJaHdfYnJlYWtwb2ludF9yZXN0b3JlKGNwdSk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9zeXNfY29tcGF0LmMgYi9hcmNoL2FybTY0L2tlcm5lbC9zeXNfY29tcGF0LmMKaW5kZXggMjhjNTExYi4uYWJhZjU4MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvc3lzX2NvbXBhdC5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL3N5c19jb21wYXQuYwpAQCAtOTQsNyArOTQsNyBAQAogCQkgKiBTZWUgY29tbWVudCBpbiB0bHNfdGhyZWFkX2ZsdXNoLgogCQkgKi8KIAkJYmFycmllcigpOwotCQlhc20gKCJtc3IgdHBpZHJyb19lbDAsICUwIiA6IDogInIiIChyZWdzLT5yZWdzWzBdKSk7CisJCXdyaXRlX3N5c3JlZyhyZWdzLT5yZWdzWzBdLCB0cGlkcnJvX2VsMCk7CiAJCXJldHVybiAwOwogCiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3RyYXBzLmMgYi9hcmNoL2FybTY0L2tlcm5lbC90cmFwcy5jCmluZGV4IGUwNGY4MzguLjVmZjAyMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvdHJhcHMuYwpAQCAtMTQyLDYgKzE0MiwxMSBAQAogCXVuc2lnbmVkIGxvbmcgaXJxX3N0YWNrX3B0cjsKIAlpbnQgc2tpcDsKIAorCXByX2RlYnVnKCIlcyhyZWdzID0gJXAgdHNrID0gJXApXG4iLCBfX2Z1bmNfXywgcmVncywgdHNrKTsKKworCWlmICghdHNrKQorCQl0c2sgPSBjdXJyZW50OworCiAJLyoKIAkgKiBTd2l0Y2hpbmcgYmV0d2VlbiBzdGFja3MgaXMgdmFsaWQgd2hlbiB0cmFjaW5nIGN1cnJlbnQgYW5kIGluCiAJICogbm9uLXByZWVtcHRpYmxlIGNvbnRleHQuCkBAIC0xNTEsMTEgKzE1Niw2IEBACiAJZWxzZQogCQlpcnFfc3RhY2tfcHRyID0gMDsKIAotCXByX2RlYnVnKCIlcyhyZWdzID0gJXAgdHNrID0gJXApXG4iLCBfX2Z1bmNfXywgcmVncywgdHNrKTsKLQotCWlmICghdHNrKQotCQl0c2sgPSBjdXJyZW50OwotCiAJaWYgKHRzayA9PSBjdXJyZW50KSB7CiAJCWZyYW1lLmZwID0gKHVuc2lnbmVkIGxvbmcpX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk7CiAJCWZyYW1lLnNwID0gY3VycmVudF9zdGFja19wb2ludGVyOwpAQCAtNDQ3LDM2ICs0NDcsMjkgQEAKIAkJOiAiPXIiIChyZXMpCQkJCQlcCiAJCTogInIiIChhZGRyZXNzKSwgImkiICgtRUZBVUxUKSApCiAKLWFzbWxpbmthZ2Ugdm9pZCBfX2V4Y2VwdGlvbiBkb19zeXNpbnN0cih1bnNpZ25lZCBpbnQgZXNyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyB2b2lkIHVzZXJfY2FjaGVfbWFpbnRfaGFuZGxlcih1bnNpZ25lZCBpbnQgZXNyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHJlc3M7Ci0JaW50IHJldDsKKwlpbnQgcnQgPSAoZXNyICYgRVNSX0VMeF9TWVM2NF9JU1NfUlRfTUFTSykgPj4gRVNSX0VMeF9TWVM2NF9JU1NfUlRfU0hJRlQ7CisJaW50IGNybSA9IChlc3IgJiBFU1JfRUx4X1NZUzY0X0lTU19DUk1fTUFTSykgPj4gRVNSX0VMeF9TWVM2NF9JU1NfQ1JNX1NISUZUOworCWludCByZXQgPSAwOwogCi0JLyogaWYgdGhpcyBpcyBhIHdyaXRlIHdpdGg6IE9wMD0xLCBPcDI9MSwgT3AxPTMsIENSbj03ICovCi0JaWYgKChlc3IgJiAweDAxZmZmYzAxKSA9PSAweDAwMTJkYzAwKSB7Ci0JCWludCBydCA9IChlc3IgPj4gNSkgJiAweDFmOwotCQlpbnQgY3JtID0gKGVzciA+PiAxKSAmIDB4MGY7CisJYWRkcmVzcyA9IChydCA9PSAzMSkgPyAwIDogcmVncy0+cmVnc1tydF07CiAKLQkJYWRkcmVzcyA9IChydCA9PSAzMSkgPyAwIDogcmVncy0+cmVnc1tydF07Ci0KLQkJc3dpdGNoIChjcm0pIHsKLQkJY2FzZSAxMToJCS8qIERDIENWQVUsIGdldHMgcHJvbW90ZWQgKi8KLQkJCV9fdXNlcl9jYWNoZV9tYWludCgiZGMgY2l2YWMiLCBhZGRyZXNzLCByZXQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTA6CQkvKiBEQyBDVkFDLCBnZXRzIHByb21vdGVkICovCi0JCQlfX3VzZXJfY2FjaGVfbWFpbnQoImRjIGNpdmFjIiwgYWRkcmVzcywgcmV0KTsKLQkJCWJyZWFrOwotCQljYXNlIDE0OgkJLyogREMgQ0lWQUMgKi8KLQkJCV9fdXNlcl9jYWNoZV9tYWludCgiZGMgY2l2YWMiLCBhZGRyZXNzLCByZXQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgNToJCQkvKiBJQyBJVkFVICovCi0JCQlfX3VzZXJfY2FjaGVfbWFpbnQoImljIGl2YXUiLCBhZGRyZXNzLCByZXQpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlmb3JjZV9zaWduYWxfaW5qZWN0KFNJR0lMTCwgSUxMX0lMTE9QQywgcmVncywgMCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9IGVsc2UgeworCXN3aXRjaCAoY3JtKSB7CisJY2FzZSBFU1JfRUx4X1NZUzY0X0lTU19DUk1fRENfQ1ZBVToJLyogREMgQ1ZBVSwgZ2V0cyBwcm9tb3RlZCAqLworCQlfX3VzZXJfY2FjaGVfbWFpbnQoImRjIGNpdmFjIiwgYWRkcmVzcywgcmV0KTsKKwkJYnJlYWs7CisJY2FzZSBFU1JfRUx4X1NZUzY0X0lTU19DUk1fRENfQ1ZBQzoJLyogREMgQ1ZBQywgZ2V0cyBwcm9tb3RlZCAqLworCQlfX3VzZXJfY2FjaGVfbWFpbnQoImRjIGNpdmFjIiwgYWRkcmVzcywgcmV0KTsKKwkJYnJlYWs7CisJY2FzZSBFU1JfRUx4X1NZUzY0X0lTU19DUk1fRENfQ0lWQUM6CS8qIERDIENJVkFDICovCisJCV9fdXNlcl9jYWNoZV9tYWludCgiZGMgY2l2YWMiLCBhZGRyZXNzLCByZXQpOworCQlicmVhazsKKwljYXNlIEVTUl9FTHhfU1lTNjRfSVNTX0NSTV9JQ19JVkFVOgkvKiBJQyBJVkFVICovCisJCV9fdXNlcl9jYWNoZV9tYWludCgiaWMgaXZhdSIsIGFkZHJlc3MsIHJldCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CiAJCWZvcmNlX3NpZ25hbF9pbmplY3QoU0lHSUxMLCBJTExfSUxMT1BDLCByZWdzLCAwKTsKIAkJcmV0dXJuOwogCX0KQEAgLTQ4Nyw2ICs0ODAsNDggQEAKIAkJcmVncy0+cGMgKz0gNDsKIH0KIAorc3RhdGljIHZvaWQgY3RyX3JlYWRfaGFuZGxlcih1bnNpZ25lZCBpbnQgZXNyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgcnQgPSAoZXNyICYgRVNSX0VMeF9TWVM2NF9JU1NfUlRfTUFTSykgPj4gRVNSX0VMeF9TWVM2NF9JU1NfUlRfU0hJRlQ7CisKKwlyZWdzLT5yZWdzW3J0XSA9IGFybTY0X2Z0cl9yZWdfY3RyZWwwLnN5c192YWw7CisJcmVncy0+cGMgKz0gNDsKK30KKworc3RydWN0IHN5czY0X2hvb2sgeworCXVuc2lnbmVkIGludCBlc3JfbWFzazsKKwl1bnNpZ25lZCBpbnQgZXNyX3ZhbDsKKwl2b2lkICgqaGFuZGxlcikodW5zaWduZWQgaW50IGVzciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworfTsKKworc3RhdGljIHN0cnVjdCBzeXM2NF9ob29rIHN5czY0X2hvb2tzW10gPSB7CisJeworCQkuZXNyX21hc2sgPSBFU1JfRUx4X1NZUzY0X0lTU19FTDBfQ0FDSEVfT1BfTUFTSywKKwkJLmVzcl92YWwgPSBFU1JfRUx4X1NZUzY0X0lTU19FTDBfQ0FDSEVfT1BfVkFMLAorCQkuaGFuZGxlciA9IHVzZXJfY2FjaGVfbWFpbnRfaGFuZGxlciwKKwl9LAorCXsKKwkJLyogVHJhcCByZWFkIGFjY2VzcyB0byBDVFJfRUwwICovCisJCS5lc3JfbWFzayA9IEVTUl9FTHhfU1lTNjRfSVNTX1NZU19PUF9NQVNLLAorCQkuZXNyX3ZhbCA9IEVTUl9FTHhfU1lTNjRfSVNTX1NZU19DVFJfUkVBRCwKKwkJLmhhbmRsZXIgPSBjdHJfcmVhZF9oYW5kbGVyLAorCX0sCisJe30sCit9OworCithc21saW5rYWdlIHZvaWQgX19leGNlcHRpb24gZG9fc3lzaW5zdHIodW5zaWduZWQgaW50IGVzciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHN5czY0X2hvb2sgKmhvb2s7CisKKwlmb3IgKGhvb2sgPSBzeXM2NF9ob29rczsgaG9vay0+aGFuZGxlcjsgaG9vaysrKQorCQlpZiAoKGhvb2stPmVzcl9tYXNrICYgZXNyKSA9PSBob29rLT5lc3JfdmFsKSB7CisJCQlob29rLT5oYW5kbGVyKGVzciwgcmVncyk7CisJCQlyZXR1cm47CisJCX0KKworCWZvcmNlX3NpZ25hbF9pbmplY3QoU0lHSUxMLCBJTExfSUxMT1BDLCByZWdzLCAwKTsKK30KKwogbG9uZyBjb21wYXRfYXJtX3N5c2NhbGwoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogCiBhc21saW5rYWdlIGxvbmcgZG9fbmlfc3lzY2FsbChzdHJ1Y3QgcHRfcmVncyAqcmVncykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3Zkc28uYyBiL2FyY2gvYXJtNjQva2VybmVsL3Zkc28uYwppbmRleCAwNzYzMTJiLi5hMmMyNDc4IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC92ZHNvLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvdmRzby5jCkBAIC0xOCwxMiArMTgsMTMgQEAKICAqIEF1dGhvcjogV2lsbCBEZWFjb24gPHdpbGwuZGVhY29uQGFybS5jb20+CiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KICNpbmNsdWRlIDxsaW51eC9lbGYuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KQEAgLTM3LDggKzM4LDcgQEAKICNpbmNsdWRlIDxhc20vdmRzb19kYXRhcGFnZS5oPgogCiBleHRlcm4gY2hhciB2ZHNvX3N0YXJ0LCB2ZHNvX2VuZDsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHZkc29fcGFnZXM7Ci1zdGF0aWMgc3RydWN0IHBhZ2UgKip2ZHNvX3BhZ2VsaXN0Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgdmRzb19wYWdlcyBfX3JvX2FmdGVyX2luaXQ7CiAKIC8qCiAgKiBUaGUgdkRTTyBkYXRhIHBhZ2UuCkBAIC01Myw5ICs1Myw5IEBACiAvKgogICogQ3JlYXRlIGFuZCBtYXAgdGhlIHZlY3RvcnMgcGFnZSBmb3IgQUFyY2gzMiB0YXNrcy4KICAqLwotc3RhdGljIHN0cnVjdCBwYWdlICp2ZWN0b3JzX3BhZ2VbMV07CitzdGF0aWMgc3RydWN0IHBhZ2UgKnZlY3RvcnNfcGFnZVsxXSBfX3JvX2FmdGVyX2luaXQ7CiAKLXN0YXRpYyBpbnQgYWxsb2NfdmVjdG9yc19wYWdlKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBhbGxvY192ZWN0b3JzX3BhZ2Uodm9pZCkKIHsKIAlleHRlcm4gY2hhciBfX2t1c2VyX2hlbHBlcl9zdGFydFtdLCBfX2t1c2VyX2hlbHBlcl9lbmRbXTsKIAlleHRlcm4gY2hhciBfX2FhcmNoMzJfc2lncmV0X2NvZGVfc3RhcnRbXSwgX19hYXJjaDMyX3NpZ3JldF9jb2RlX2VuZFtdOwpAQCAtODgsNyArODgsNyBAQAogewogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gQUFSQ0gzMl9WRUNUT1JTX0JBU0U7Ci0Jc3RhdGljIHN0cnVjdCB2bV9zcGVjaWFsX21hcHBpbmcgc3BlYyA9IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHZtX3NwZWNpYWxfbWFwcGluZyBzcGVjID0gewogCQkubmFtZQk9ICJbdmVjdG9yc10iLAogCQkucGFnZXMJPSB2ZWN0b3JzX3BhZ2UsCiAKQEAgLTExMCwxMSArMTEwLDE5IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX0NPTVBBVCAqLwogCi1zdGF0aWMgc3RydWN0IHZtX3NwZWNpYWxfbWFwcGluZyB2ZHNvX3NwZWNbMl07CitzdGF0aWMgc3RydWN0IHZtX3NwZWNpYWxfbWFwcGluZyB2ZHNvX3NwZWNbMl0gX19yb19hZnRlcl9pbml0ID0geworCXsKKwkJLm5hbWUJPSAiW3Z2YXJdIiwKKwl9LAorCXsKKwkJLm5hbWUJPSAiW3Zkc29dIiwKKwl9LAorfTsKIAogc3RhdGljIGludCBfX2luaXQgdmRzb19pbml0KHZvaWQpCiB7CiAJaW50IGk7CisJc3RydWN0IHBhZ2UgKip2ZHNvX3BhZ2VsaXN0OwogCiAJaWYgKG1lbWNtcCgmdmRzb19zdGFydCwgIlwxNzdFTEYiLCA0KSkgewogCQlwcl9lcnIoInZEU08gaXMgbm90IGEgdmFsaWQgRUxGIG9iamVjdCFcbiIpOwpAQCAtMTM4LDE2ICsxNDYsOCBAQAogCWZvciAoaSA9IDA7IGkgPCB2ZHNvX3BhZ2VzOyBpKyspCiAJCXZkc29fcGFnZWxpc3RbaSArIDFdID0gcGZuX3RvX3BhZ2UoUEhZU19QRk4oX19wYSgmdmRzb19zdGFydCkpICsgaSk7CiAKLQkvKiBQb3B1bGF0ZSB0aGUgc3BlY2lhbCBtYXBwaW5nIHN0cnVjdHVyZXMgKi8KLQl2ZHNvX3NwZWNbMF0gPSAoc3RydWN0IHZtX3NwZWNpYWxfbWFwcGluZykgewotCQkubmFtZQk9ICJbdnZhcl0iLAotCQkucGFnZXMJPSB2ZHNvX3BhZ2VsaXN0LAotCX07Ci0KLQl2ZHNvX3NwZWNbMV0gPSAoc3RydWN0IHZtX3NwZWNpYWxfbWFwcGluZykgewotCQkubmFtZQk9ICJbdmRzb10iLAotCQkucGFnZXMJPSAmdmRzb19wYWdlbGlzdFsxXSwKLQl9OworCXZkc29fc3BlY1swXS5wYWdlcyA9ICZ2ZHNvX3BhZ2VsaXN0WzBdOworCXZkc29fc3BlY1sxXS5wYWdlcyA9ICZ2ZHNvX3BhZ2VsaXN0WzFdOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMDEsNyArMjAxLDcgQEAKICAqLwogdm9pZCB1cGRhdGVfdnN5c2NhbGwoc3RydWN0IHRpbWVrZWVwZXIgKnRrKQogewotCXUzMiB1c2Vfc3lzY2FsbCA9IHN0cmNtcCh0ay0+dGtyX21vbm8uY2xvY2stPm5hbWUsICJhcmNoX3N5c19jb3VudGVyIik7CisJdTMyIHVzZV9zeXNjYWxsID0gIXRrLT50a3JfbW9uby5jbG9jay0+YXJjaGRhdGEudmRzb19kaXJlY3Q7CiAKIAkrK3Zkc29fZGF0YS0+dGJfc2VxX2NvdW50OwogCXNtcF93bWIoKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL2FybTY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDY1OTk2M2QuLjVjZTliMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMTg1LDYgKzE4NSwyNSBAQAogCV9kYXRhID0gLjsKIAlfc2RhdGEgPSAuOwogCVJXX0RBVEFfU0VDVElPTihMMV9DQUNIRV9CWVRFUywgUEFHRV9TSVpFLCBUSFJFQURfU0laRSkKKworCS8qCisJICogRGF0YSB3cml0dGVuIHdpdGggdGhlIE1NVSBvZmYgYnV0IHJlYWQgd2l0aCB0aGUgTU1VIG9uIHJlcXVpcmVzCisJICogY2FjaGUgbGluZXMgdG8gYmUgaW52YWxpZGF0ZWQsIGRpc2NhcmRpbmcgdXAgdG8gYSBDYWNoZSBXcml0ZWJhY2sKKwkgKiBHcmFudWxlIChDV0cpIG9mIGRhdGEgZnJvbSB0aGUgY2FjaGUuIEtlZXAgdGhlIHNlY3Rpb24gdGhhdAorCSAqIHJlcXVpcmVzIHRoaXMgdHlwZSBvZiBtYWludGVuYW5jZSB0byBiZSBpbiBpdHMgb3duIENhY2hlIFdyaXRlYmFjaworCSAqIEdyYW51bGUgKENXRykgYXJlYSBzbyB0aGUgY2FjaGUgbWFpbnRlbmFuY2Ugb3BlcmF0aW9ucyBkb24ndAorCSAqIGludGVyZmVyZSB3aXRoIGFkamFjZW50IGRhdGEuCisJICovCisJLm1tdW9mZi5kYXRhLndyaXRlIDogQUxJR04oU1pfMkspIHsKKwkJX19tbXVvZmZfZGF0YV9zdGFydCA9IC47CisJCSooLm1tdW9mZi5kYXRhLndyaXRlKQorCX0KKwkuID0gQUxJR04oU1pfMkspOworCS5tbXVvZmYuZGF0YS5yZWFkIDogeworCQkqKC5tbXVvZmYuZGF0YS5yZWFkKQorCQlfX21tdW9mZl9kYXRhX2VuZCA9IC47CisJfQorCiAJUEVDT0ZGX0VEQVRBX1BBRERJTkcKIAlfZWRhdGEgPSAuOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9LY29uZmlnIGIvYXJjaC9hcm02NC9rdm0vS2NvbmZpZwppbmRleCA5YzllZGM5Li42ZWFmMTJjIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2t2bS9LY29uZmlnCisrKyBiL2FyY2gvYXJtNjQva3ZtL0tjb25maWcKQEAgLTE2LDcgKzE2LDcgQEAKIAogaWYgVklSVFVBTElaQVRJT04KIAotY29uZmlnIEtWTV9BUk1fVkdJQ19WMworY29uZmlnIEtWTV9BUk1fVkdJQ19WM19JVFMKIAlib29sCiAKIGNvbmZpZyBLVk0KQEAgLTM0LDcgKzM0LDcgQEAKIAlzZWxlY3QgS1ZNX1ZGSU8KIAlzZWxlY3QgSEFWRV9LVk1fRVZFTlRGRAogCXNlbGVjdCBIQVZFX0tWTV9JUlFGRAotCXNlbGVjdCBLVk1fQVJNX1ZHSUNfVjMKKwlzZWxlY3QgS1ZNX0FSTV9WR0lDX1YzX0lUUwogCXNlbGVjdCBLVk1fQVJNX1BNVSBpZiBIV19QRVJGX0VWRU5UUwogCXNlbGVjdCBIQVZFX0tWTV9NU0kKIAlzZWxlY3QgSEFWRV9LVk1fSVJRQ0hJUApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vTWFrZWZpbGUgYi9hcmNoL2FybTY0L2t2bS9NYWtlZmlsZQppbmRleCA2OTVlYjNjLi5kNTBhODJhIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2t2bS9NYWtlZmlsZQorKysgYi9hcmNoL2FybTY0L2t2bS9NYWtlZmlsZQpAQCAtMTYsOSArMTYsMTAgQEAKIGt2bS0kKENPTkZJR19LVk1fQVJNX0hPU1QpICs9ICQoQVJNKS9hcm0ubyAkKEFSTSkvbW11Lm8gJChBUk0pL21taW8ubwoga3ZtLSQoQ09ORklHX0tWTV9BUk1fSE9TVCkgKz0gJChBUk0pL3BzY2kubyAkKEFSTSkvcGVyZi5vCiAKLWt2bS0kKENPTkZJR19LVk1fQVJNX0hPU1QpICs9IGVtdWxhdGUubyBpbmplY3RfZmF1bHQubyByZWdtYXAubwora3ZtLSQoQ09ORklHX0tWTV9BUk1fSE9TVCkgKz0gaW5qZWN0X2ZhdWx0Lm8gcmVnbWFwLm8KIGt2bS0kKENPTkZJR19LVk1fQVJNX0hPU1QpICs9IGh5cC5vIGh5cC1pbml0Lm8gaGFuZGxlX2V4aXQubwoga3ZtLSQoQ09ORklHX0tWTV9BUk1fSE9TVCkgKz0gZ3Vlc3QubyBkZWJ1Zy5vIHJlc2V0Lm8gc3lzX3JlZ3MubyBzeXNfcmVnc19nZW5lcmljX3Y4Lm8KK2t2bS0kKENPTkZJR19LVk1fQVJNX0hPU1QpICs9ICQoS1ZNKS9hcm0vYWFyY2gzMi5vCiAKIGt2bS0kKENPTkZJR19LVk1fQVJNX0hPU1QpICs9ICQoS1ZNKS9hcm0vdmdpYy92Z2ljLm8KIGt2bS0kKENPTkZJR19LVk1fQVJNX0hPU1QpICs9ICQoS1ZNKS9hcm0vdmdpYy92Z2ljLWluaXQubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vZW11bGF0ZS5jIGIvYXJjaC9hcm02NC9rdm0vZW11bGF0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODdkOGZiLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtNjQva3ZtL2VtdWxhdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKgotICogKG5vdCBtdWNoIG9mIGFuKSBFbXVsYXRpb24gbGF5ZXIgZm9yIDMyYml0IGd1ZXN0cy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIsMjAxMyAtIEFSTSBMdGQKLSAqIEF1dGhvcjogTWFyYyBaeW5naWVyIDxtYXJjLnp5bmdpZXJAYXJtLmNvbT4KLSAqCi0gKiBiYXNlZCBvbiBhcmNoL2FybS9rdm0vZW11bGF0ZS5jCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgLSBWaXJ0dWFsIE9wZW4gU3lzdGVtcyBhbmQgQ29sdW1iaWEgVW5pdmVyc2l0eQotICogQXV0aG9yOiBDaHJpc3RvZmZlciBEYWxsIDxjLmRhbGxAdmlydHVhbG9wZW5zeXN0ZW1zLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgotI2luY2x1ZGUgPGFzbS9lc3IuaD4KLSNpbmNsdWRlIDxhc20va3ZtX2VtdWxhdGUuaD4KLQotLyoKLSAqIHN0b2xlbiBmcm9tIGFyY2gvYXJtL2tlcm5lbC9vcGNvZGVzLmMKLSAqCi0gKiBjb25kaXRpb24gY29kZSBsb29rdXAgdGFibGUKLSAqIGluZGV4IGludG8gdGhlIHRhYmxlIGlzIHRlc3QgY29kZTogRVEsIE5FLCAuLi4gTFQsIEdULCBBTCwgTlYKLSAqCi0gKiBiaXQgcG9zaXRpb24gaW4gc2hvcnQgaXMgY29uZGl0aW9uIGNvZGU6IE5aQ1YKLSAqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGNjX21hcFsxNl0gPSB7Ci0JMHhGMEYwLAkJCS8qIEVRID09IFogc2V0ICAgICAgICAgICAgKi8KLQkweDBGMEYsCQkJLyogTkUgICAgICAgICAgICAgICAgICAgICAqLwotCTB4Q0NDQywJCQkvKiBDUyA9PSBDIHNldCAgICAgICAgICAgICovCi0JMHgzMzMzLAkJCS8qIENDICAgICAgICAgICAgICAgICAgICAgKi8KLQkweEZGMDAsCQkJLyogTUkgPT0gTiBzZXQgICAgICAgICAgICAqLwotCTB4MDBGRiwJCQkvKiBQTCAgICAgICAgICAgICAgICAgICAgICovCi0JMHhBQUFBLAkJCS8qIFZTID09IFYgc2V0ICAgICAgICAgICAgKi8KLQkweDU1NTUsCQkJLyogVkMgICAgICAgICAgICAgICAgICAgICAqLwotCTB4MEMwQywJCQkvKiBISSA9PSBDIHNldCAmJiBaIGNsZWFyICovCi0JMHhGM0YzLAkJCS8qIExTID09IEMgY2xlYXIgfHwgWiBzZXQgKi8KLQkweEFBNTUsCQkJLyogR0UgPT0gKE49PVYpICAgICAgICAgICAqLwotCTB4NTVBQSwJCQkvKiBMVCA9PSAoTiE9VikgICAgICAgICAgICovCi0JMHgwQTA1LAkJCS8qIEdUID09ICghWiAmJiAoTj09VikpICAgKi8KLQkweEY1RkEsCQkJLyogTEUgPT0gKFogfHwgKE4hPVYpKSAgICAqLwotCTB4RkZGRiwJCQkvKiBBTCBhbHdheXMgICAgICAgICAgICAgICovCi0JMAkJCS8qIE5WICAgICAgICAgICAgICAgICAgICAgKi8KLX07Ci0KLXN0YXRpYyBpbnQga3ZtX3ZjcHVfZ2V0X2NvbmRpdGlvbihjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCi17Ci0JdTMyIGVzciA9IGt2bV92Y3B1X2dldF9oc3IodmNwdSk7Ci0KLQlpZiAoZXNyICYgRVNSX0VMeF9DVikKLQkJcmV0dXJuIChlc3IgJiBFU1JfRUx4X0NPTkRfTUFTSykgPj4gRVNSX0VMeF9DT05EX1NISUZUOwotCi0JcmV0dXJuIC0xOwotfQotCi0vKgotICogQ2hlY2sgaWYgYSB0cmFwcGVkIGluc3RydWN0aW9uIHNob3VsZCBoYXZlIGJlZW4gZXhlY3V0ZWQgb3Igbm90LgotICovCi1ib29sIGt2bV9jb25kaXRpb25fdmFsaWQzMihjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCi17Ci0JdW5zaWduZWQgbG9uZyBjcHNyOwotCXUzMiBjcHNyX2NvbmQ7Ci0JaW50IGNvbmQ7Ci0KLQkvKiBUb3AgdHdvIGJpdHMgbm9uLXplcm8/ICBVbmNvbmRpdGlvbmFsLiAqLwotCWlmIChrdm1fdmNwdV9nZXRfaHNyKHZjcHUpID4+IDMwKQotCQlyZXR1cm4gdHJ1ZTsKLQotCS8qIElzIGNvbmRpdGlvbiBmaWVsZCB2YWxpZD8gKi8KLQljb25kID0ga3ZtX3ZjcHVfZ2V0X2NvbmRpdGlvbih2Y3B1KTsKLQlpZiAoY29uZCA9PSAweEUpCi0JCXJldHVybiB0cnVlOwotCi0JY3BzciA9ICp2Y3B1X2Nwc3IodmNwdSk7Ci0KLQlpZiAoY29uZCA8IDApIHsKLQkJLyogVGhpcyBjYW4gaGFwcGVuIGluIFRodW1iIG1vZGU6IGV4YW1pbmUgSVQgc3RhdGUuICovCi0JCXVuc2lnbmVkIGxvbmcgaXQ7Ci0KLQkJaXQgPSAoKGNwc3IgPj4gOCkgJiAweEZDKSB8ICgoY3BzciA+PiAyNSkgJiAweDMpOwotCi0JCS8qIGl0ID09IDAgPT4gdW5jb25kaXRpb25hbC4gKi8KLQkJaWYgKGl0ID09IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQkvKiBUaGUgY29uZCBmb3IgdGhpcyBpbnNuIHdvcmtzIG91dCBhcyB0aGUgdG9wIDQgYml0cy4gKi8KLQkJY29uZCA9IChpdCA+PiA0KTsKLQl9Ci0KLQljcHNyX2NvbmQgPSBjcHNyID4+IDI4OwotCi0JaWYgKCEoKGNjX21hcFtjb25kXSA+PiBjcHNyX2NvbmQpICYgMSkpCi0JCXJldHVybiBmYWxzZTsKLQotCXJldHVybiB0cnVlOwotfQotCi0vKioKLSAqIGFkanVzdF9pdHN0YXRlIC0gYWRqdXN0IElUU1RBVEUgd2hlbiBlbXVsYXRpbmcgaW5zdHJ1Y3Rpb25zIGluIElULWJsb2NrCi0gKiBAdmNwdToJVGhlIFZDUFUgcG9pbnRlcgotICoKLSAqIFdoZW4gZXhjZXB0aW9ucyBvY2N1ciB3aGlsZSBpbnN0cnVjdGlvbnMgYXJlIGV4ZWN1dGVkIGluIFRodW1iIElGLVRIRU4KLSAqIGJsb2NrcywgdGhlIElUU1RBVEUgZmllbGQgb2YgdGhlIENQU1IgaXMgbm90IGFkdmFuY2VkICh1cGRhdGVkKSwgc28gd2UgaGF2ZQotICogdG8gZG8gdGhpcyBsaXR0bGUgYml0IG9mIHdvcmsgbWFudWFsbHkuIFRoZSBmaWVsZHMgbWFwIGxpa2UgdGhpczoKLSAqCi0gKiBJVFs3OjBdIC0+IENQU1JbMjY6MjVdLENQU1JbMTU6MTBdCi0gKi8KLXN0YXRpYyB2b2lkIGt2bV9hZGp1c3RfaXRzdGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCi17Ci0JdW5zaWduZWQgbG9uZyBpdGJpdHMsIGNvbmQ7Ci0JdW5zaWduZWQgbG9uZyBjcHNyID0gKnZjcHVfY3Bzcih2Y3B1KTsKLQlib29sIGlzX2FybSA9ICEoY3BzciAmIENPTVBBVF9QU1JfVF9CSVQpOwotCi0JQlVHX09OKGlzX2FybSAmJiAoY3BzciAmIENPTVBBVF9QU1JfSVRfTUFTSykpOwotCi0JaWYgKCEoY3BzciAmIENPTVBBVF9QU1JfSVRfTUFTSykpCi0JCXJldHVybjsKLQotCWNvbmQgPSAoY3BzciAmIDB4ZTAwMCkgPj4gMTM7Ci0JaXRiaXRzID0gKGNwc3IgJiAweDFjMDApID4+ICgxMCAtIDIpOwotCWl0Yml0cyB8PSAoY3BzciAmICgweDMgPDwgMjUpKSA+PiAyNTsKLQotCS8qIFBlcmZvcm0gSVRBZHZhbmNlIChzZWUgcGFnZSBBMi01MiBpbiBBUk0gRERJIDA0MDZDKSAqLwotCWlmICgoaXRiaXRzICYgMHg3KSA9PSAwKQotCQlpdGJpdHMgPSBjb25kID0gMDsKLQllbHNlCi0JCWl0Yml0cyA9IChpdGJpdHMgPDwgMSkgJiAweDFmOwotCi0JY3BzciAmPSB+Q09NUEFUX1BTUl9JVF9NQVNLOwotCWNwc3IgfD0gY29uZCA8PCAxMzsKLQljcHNyIHw9IChpdGJpdHMgJiAweDFjKSA8PCAoMTAgLSAyKTsKLQljcHNyIHw9IChpdGJpdHMgJiAweDMpIDw8IDI1OwotCSp2Y3B1X2Nwc3IodmNwdSkgPSBjcHNyOwotfQotCi0vKioKLSAqIGt2bV9za2lwX2luc3RyIC0gc2tpcCBhIHRyYXBwZWQgaW5zdHJ1Y3Rpb24gYW5kIHByb2NlZWQgdG8gdGhlIG5leHQKLSAqIEB2Y3B1OiBUaGUgdmNwdSBwb2ludGVyCi0gKi8KLXZvaWQga3ZtX3NraXBfaW5zdHIzMihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGJvb2wgaXNfd2lkZV9pbnN0cikKLXsKLQlib29sIGlzX3RodW1iOwotCi0JaXNfdGh1bWIgPSAhISgqdmNwdV9jcHNyKHZjcHUpICYgQ09NUEFUX1BTUl9UX0JJVCk7Ci0JaWYgKGlzX3RodW1iICYmICFpc193aWRlX2luc3RyKQotCQkqdmNwdV9wYyh2Y3B1KSArPSAyOwotCWVsc2UKLQkJKnZjcHVfcGModmNwdSkgKz0gNDsKLQlrdm1fYWRqdXN0X2l0c3RhdGUodmNwdSk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9oYW5kbGVfZXhpdC5jIGIvYXJjaC9hcm02NC9rdm0vaGFuZGxlX2V4aXQuYwppbmRleCBmYTk2ZmUyLi5hMjA0YWRmIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2t2bS9oYW5kbGVfZXhpdC5jCisrKyBiL2FyY2gvYXJtNjQva3ZtL2hhbmRsZV9leGl0LmMKQEAgLTE3MCw5ICsxNzAsMzIgQEAKIHsKIAlleGl0X2hhbmRsZV9mbiBleGl0X2hhbmRsZXI7CiAKKwlpZiAoQVJNX1NFUlJPUl9QRU5ESU5HKGV4Y2VwdGlvbl9pbmRleCkpIHsKKwkJdTggaHNyX2VjID0gRVNSX0VMeF9FQyhrdm1fdmNwdV9nZXRfaHNyKHZjcHUpKTsKKworCQkvKgorCQkgKiBIVkMvU01DIGFscmVhZHkgaGF2ZSBhbiBhZGp1c3RlZCBQQywgd2hpY2ggd2UgbmVlZAorCQkgKiB0byBjb3JyZWN0IGluIG9yZGVyIHRvIHJldHVybiB0byBhZnRlciBoYXZpbmcKKwkJICogaW5qZWN0ZWQgdGhlIFNFcnJvci4KKwkJICovCisJCWlmIChoc3JfZWMgPT0gRVNSX0VMeF9FQ19IVkMzMiB8fCBoc3JfZWMgPT0gRVNSX0VMeF9FQ19IVkM2NCB8fAorCQkgICAgaHNyX2VjID09IEVTUl9FTHhfRUNfU01DMzIgfHwgaHNyX2VjID09IEVTUl9FTHhfRUNfU01DNjQpIHsKKwkJCXUzMiBhZGogPSAga3ZtX3ZjcHVfdHJhcF9pbF9pczMyYml0KHZjcHUpID8gNCA6IDI7CisJCQkqdmNwdV9wYyh2Y3B1KSAtPSBhZGo7CisJCX0KKworCQlrdm1faW5qZWN0X3ZhYnQodmNwdSk7CisJCXJldHVybiAxOworCX0KKworCWV4Y2VwdGlvbl9pbmRleCA9IEFSTV9FWENFUFRJT05fQ09ERShleGNlcHRpb25faW5kZXgpOworCiAJc3dpdGNoIChleGNlcHRpb25faW5kZXgpIHsKIAljYXNlIEFSTV9FWENFUFRJT05fSVJROgogCQlyZXR1cm4gMTsKKwljYXNlIEFSTV9FWENFUFRJT05fRUwxX1NFUlJPUjoKKwkJa3ZtX2luamVjdF92YWJ0KHZjcHUpOworCQlyZXR1cm4gMTsKIAljYXNlIEFSTV9FWENFUFRJT05fVFJBUDoKIAkJLyoKIAkJICogU2VlIEFSTSBBUk0gQjEuMTQuMTogIkh5cCB0cmFwcyBvbiBpbnN0cnVjdGlvbnMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL2h5cC5TIGIvYXJjaC9hcm02NC9rdm0vaHlwLlMKaW5kZXggN2NlOTMxNS4uMjcyNjYzNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rdm0vaHlwLlMKKysrIGIvYXJjaC9hcm02NC9rdm0vaHlwLlMKQEAgLTQ2LDEwICs0Niw2IEBACiAJaHZjCSMwCiAJbGRyICAgICBsciwgW3NwXSwgIzE2CiAJcmV0Ci1hbHRlcm5hdGl2ZV9lbHNlCithbHRlcm5hdGl2ZV9lbHNlX25vcF9lbmRpZgogCWIJX192aGVfaHlwX2NhbGwKLQlub3AKLQlub3AKLQlub3AKLWFsdGVybmF0aXZlX2VuZGlmCiBFTkRQUk9DKF9fa3ZtX2NhbGxfaHlwKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vaHlwL01ha2VmaWxlIGIvYXJjaC9hcm02NC9rdm0vaHlwL01ha2VmaWxlCmluZGV4IDBjODVmZWIuLmFhZjQyYWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva3ZtL2h5cC9NYWtlZmlsZQorKysgYi9hcmNoL2FybTY0L2t2bS9oeXAvTWFrZWZpbGUKQEAgLTUsOSArNSw5IEBACiBLVk09Li4vLi4vLi4vLi4vdmlydC9rdm0KIAogb2JqLSQoQ09ORklHX0tWTV9BUk1fSE9TVCkgKz0gJChLVk0pL2FybS9oeXAvdmdpYy12Mi1zci5vCitvYmotJChDT05GSUdfS1ZNX0FSTV9IT1NUKSArPSAkKEtWTSkvYXJtL2h5cC92Z2ljLXYzLXNyLm8KIG9iai0kKENPTkZJR19LVk1fQVJNX0hPU1QpICs9ICQoS1ZNKS9hcm0vaHlwL3RpbWVyLXNyLm8KIAotb2JqLSQoQ09ORklHX0tWTV9BUk1fSE9TVCkgKz0gdmdpYy12My1zci5vCiBvYmotJChDT05GSUdfS1ZNX0FSTV9IT1NUKSArPSBzeXNyZWctc3Iubwogb2JqLSQoQ09ORklHX0tWTV9BUk1fSE9TVCkgKz0gZGVidWctc3Iubwogb2JqLSQoQ09ORklHX0tWTV9BUk1fSE9TVCkgKz0gZW50cnkubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vaHlwL2RlYnVnLXNyLmMgYi9hcmNoL2FybTY0L2t2bS9oeXAvZGVidWctc3IuYwppbmRleCAzMzM0MmE3Li40YmE1YzkwIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2t2bS9oeXAvZGVidWctc3IuYworKysgYi9hcmNoL2FybTY0L2t2bS9oeXAvZGVidWctc3IuYwpAQCAtMTMxLDkgKzEzMSw3IEBACiAJCXZjcHUtPmFyY2guZGVidWdfZmxhZ3MgJj0gfktWTV9BUk02NF9ERUJVR19ESVJUWTsKIH0KIAotc3RhdGljIHUzMiBfX2h5cF90ZXh0IF9fZGVidWdfcmVhZF9tZGNyX2VsMih2b2lkKQordTMyIF9faHlwX3RleHQgX19rdm1fZ2V0X21kY3JfZWwyKHZvaWQpCiB7CiAJcmV0dXJuIHJlYWRfc3lzcmVnKG1kY3JfZWwyKTsKIH0KLQotX19hbGlhcyhfX2RlYnVnX3JlYWRfbWRjcl9lbDIpIHUzMiBfX2t2bV9nZXRfbWRjcl9lbDIodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9oeXAvZW50cnkuUyBiL2FyY2gvYXJtNjQva3ZtL2h5cC9lbnRyeS5TCmluZGV4IGNlOWU1ZTUuLjEyZWU2MmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva3ZtL2h5cC9lbnRyeS5TCisrKyBiL2FyY2gvYXJtNjQva3ZtL2h5cC9lbnRyeS5TCkBAIC01NSw3OSArNTUsMTExIEBACiAgKi8KIEVOVFJZKF9fZ3Vlc3RfZW50ZXIpCiAJLy8geDA6IHZjcHUKLQkvLyB4MTogaG9zdC9ndWVzdCBjb250ZXh0Ci0JLy8geDIteDE4OiBjbG9iYmVyZWQgYnkgbWFjcm9zCisJLy8geDE6IGhvc3QgY29udGV4dAorCS8vIHgyLXgxNzogY2xvYmJlcmVkIGJ5IG1hY3JvcworCS8vIHgxODogZ3Vlc3QgY29udGV4dAogCiAJLy8gU3RvcmUgdGhlIGhvc3QgcmVncwogCXNhdmVfY2FsbGVlX3NhdmVkX3JlZ3MgeDEKIAotCS8vIFByZXNlcnZlIHZjcHUgJiBob3N0X2N0eHQgZm9yIHVzZSBhdCBleGl0IHRpbWUKLQlzdHAJeDAsIHgxLCBbc3AsICMtMTZdIQorCS8vIFN0b3JlIHRoZSBob3N0X2N0eHQgZm9yIHVzZSBhdCBleGl0IHRpbWUKKwlzdHIJeDEsIFtzcCwgIy0xNl0hCiAKLQlhZGQJeDEsIHgwLCAjVkNQVV9DT05URVhUCisJYWRkCXgxOCwgeDAsICNWQ1BVX0NPTlRFWFQKIAotCS8vIFByZXBhcmUgeDAteDEgZm9yIGxhdGVyIHJlc3RvcmUgYnkgcHVzaGluZyB0aGVtIG9udG8gdGhlIHN0YWNrCi0JbGRwCXgyLCB4MywgW3gxLCAjQ1BVX1hSRUdfT0ZGU0VUKDApXQotCXN0cAl4MiwgeDMsIFtzcCwgIy0xNl0hCisJLy8gUmVzdG9yZSBndWVzdCByZWdzIHgwLXgxNworCWxkcAl4MCwgeDEsICAgW3gxOCwgI0NQVV9YUkVHX09GRlNFVCgwKV0KKwlsZHAJeDIsIHgzLCAgIFt4MTgsICNDUFVfWFJFR19PRkZTRVQoMildCisJbGRwCXg0LCB4NSwgICBbeDE4LCAjQ1BVX1hSRUdfT0ZGU0VUKDQpXQorCWxkcAl4NiwgeDcsICAgW3gxOCwgI0NQVV9YUkVHX09GRlNFVCg2KV0KKwlsZHAJeDgsIHg5LCAgIFt4MTgsICNDUFVfWFJFR19PRkZTRVQoOCldCisJbGRwCXgxMCwgeDExLCBbeDE4LCAjQ1BVX1hSRUdfT0ZGU0VUKDEwKV0KKwlsZHAJeDEyLCB4MTMsIFt4MTgsICNDUFVfWFJFR19PRkZTRVQoMTIpXQorCWxkcAl4MTQsIHgxNSwgW3gxOCwgI0NQVV9YUkVHX09GRlNFVCgxNCldCisJbGRwCXgxNiwgeDE3LCBbeDE4LCAjQ1BVX1hSRUdfT0ZGU0VUKDE2KV0KIAotCS8vIHgyLXgxOAotCWxkcAl4MiwgeDMsICAgW3gxLCAjQ1BVX1hSRUdfT0ZGU0VUKDIpXQotCWxkcAl4NCwgeDUsICAgW3gxLCAjQ1BVX1hSRUdfT0ZGU0VUKDQpXQotCWxkcAl4NiwgeDcsICAgW3gxLCAjQ1BVX1hSRUdfT0ZGU0VUKDYpXQotCWxkcAl4OCwgeDksICAgW3gxLCAjQ1BVX1hSRUdfT0ZGU0VUKDgpXQotCWxkcAl4MTAsIHgxMSwgW3gxLCAjQ1BVX1hSRUdfT0ZGU0VUKDEwKV0KLQlsZHAJeDEyLCB4MTMsIFt4MSwgI0NQVV9YUkVHX09GRlNFVCgxMildCi0JbGRwCXgxNCwgeDE1LCBbeDEsICNDUFVfWFJFR19PRkZTRVQoMTQpXQotCWxkcAl4MTYsIHgxNywgW3gxLCAjQ1BVX1hSRUdfT0ZGU0VUKDE2KV0KLQlsZHIJeDE4LCAgICAgIFt4MSwgI0NQVV9YUkVHX09GRlNFVCgxOCldCisJLy8gUmVzdG9yZSBndWVzdCByZWdzIHgxOS14MjksIGxyCisJcmVzdG9yZV9jYWxsZWVfc2F2ZWRfcmVncyB4MTgKIAotCS8vIHgxOS14MjksIGxyCi0JcmVzdG9yZV9jYWxsZWVfc2F2ZWRfcmVncyB4MQotCi0JLy8gTGFzdCBiaXRzIG9mIHRoZSA2NGJpdCBzdGF0ZQotCWxkcAl4MCwgeDEsIFtzcF0sICMxNgorCS8vIFJlc3RvcmUgZ3Vlc3QgcmVnIHgxOAorCWxkcgl4MTgsICAgICAgW3gxOCwgI0NQVV9YUkVHX09GRlNFVCgxOCldCiAKIAkvLyBEbyBub3QgdG91Y2ggYW55IHJlZ2lzdGVyIGFmdGVyIHRoaXMhCiAJZXJldAogRU5EUFJPQyhfX2d1ZXN0X2VudGVyKQogCiBFTlRSWShfX2d1ZXN0X2V4aXQpCi0JLy8geDA6IHZjcHUKLQkvLyB4MTogcmV0dXJuIGNvZGUKLQkvLyB4Mi14MzogZnJlZQotCS8vIHg0LXgyOSxscjogdmNwdSByZWdzCi0JLy8gdmNwdSB4MC14MyBvbiB0aGUgc3RhY2sKKwkvLyB4MDogcmV0dXJuIGNvZGUKKwkvLyB4MTogdmNwdQorCS8vIHgyLXgyOSxscjogdmNwdSByZWdzCisJLy8gdmNwdSB4MC14MSBvbiB0aGUgc3RhY2sKIAotCWFkZAl4MiwgeDAsICNWQ1BVX0NPTlRFWFQKKwlhZGQJeDEsIHgxLCAjVkNQVV9DT05URVhUCiAKLQlzdHAJeDQsIHg1LCAgIFt4MiwgI0NQVV9YUkVHX09GRlNFVCg0KV0KLQlzdHAJeDYsIHg3LCAgIFt4MiwgI0NQVV9YUkVHX09GRlNFVCg2KV0KLQlzdHAJeDgsIHg5LCAgIFt4MiwgI0NQVV9YUkVHX09GRlNFVCg4KV0KLQlzdHAJeDEwLCB4MTEsIFt4MiwgI0NQVV9YUkVHX09GRlNFVCgxMCldCi0Jc3RwCXgxMiwgeDEzLCBbeDIsICNDUFVfWFJFR19PRkZTRVQoMTIpXQotCXN0cAl4MTQsIHgxNSwgW3gyLCAjQ1BVX1hSRUdfT0ZGU0VUKDE0KV0KLQlzdHAJeDE2LCB4MTcsIFt4MiwgI0NQVV9YUkVHX09GRlNFVCgxNildCi0Jc3RyCXgxOCwgICAgICBbeDIsICNDUFVfWFJFR19PRkZTRVQoMTgpXQorCUFMVEVSTkFUSVZFKG5vcCwgU0VUX1BTVEFURV9QQU4oMSksIEFSTTY0X0hBU19QQU4sIENPTkZJR19BUk02NF9QQU4pCiAKLQlsZHAJeDYsIHg3LCBbc3BdLCAjMTYJLy8geDIsIHgzCi0JbGRwCXg0LCB4NSwgW3NwXSwgIzE2CS8vIHgwLCB4MQorCS8vIFN0b3JlIHRoZSBndWVzdCByZWdzIHgyIGFuZCB4MworCXN0cAl4MiwgeDMsICAgW3gxLCAjQ1BVX1hSRUdfT0ZGU0VUKDIpXQogCi0Jc3RwCXg0LCB4NSwgW3gyLCAjQ1BVX1hSRUdfT0ZGU0VUKDApXQotCXN0cAl4NiwgeDcsIFt4MiwgI0NQVV9YUkVHX09GRlNFVCgyKV0KKwkvLyBSZXRyaWV2ZSB0aGUgZ3Vlc3QgcmVncyB4MC14MSBmcm9tIHRoZSBzdGFjaworCWxkcAl4MiwgeDMsIFtzcF0sICMxNgkvLyB4MCwgeDEKIAotCXNhdmVfY2FsbGVlX3NhdmVkX3JlZ3MgeDIKKwkvLyBTdG9yZSB0aGUgZ3Vlc3QgcmVncyB4MC14MSBhbmQgeDQteDE4CisJc3RwCXgyLCB4MywgICBbeDEsICNDUFVfWFJFR19PRkZTRVQoMCldCisJc3RwCXg0LCB4NSwgICBbeDEsICNDUFVfWFJFR19PRkZTRVQoNCldCisJc3RwCXg2LCB4NywgICBbeDEsICNDUFVfWFJFR19PRkZTRVQoNildCisJc3RwCXg4LCB4OSwgICBbeDEsICNDUFVfWFJFR19PRkZTRVQoOCldCisJc3RwCXgxMCwgeDExLCBbeDEsICNDUFVfWFJFR19PRkZTRVQoMTApXQorCXN0cAl4MTIsIHgxMywgW3gxLCAjQ1BVX1hSRUdfT0ZGU0VUKDEyKV0KKwlzdHAJeDE0LCB4MTUsIFt4MSwgI0NQVV9YUkVHX09GRlNFVCgxNCldCisJc3RwCXgxNiwgeDE3LCBbeDEsICNDUFVfWFJFR19PRkZTRVQoMTYpXQorCXN0cgl4MTgsICAgICAgW3gxLCAjQ1BVX1hSRUdfT0ZGU0VUKDE4KV0KIAotCS8vIFJlc3RvcmUgdmNwdSAmIGhvc3RfY3R4dCBmcm9tIHRoZSBzdGFjawotCS8vIChwcmVzZXJ2aW5nIHJldHVybiBjb2RlIGluIHgxKQotCWxkcAl4MCwgeDIsIFtzcF0sICMxNgorCS8vIFN0b3JlIHRoZSBndWVzdCByZWdzIHgxOS14MjksIGxyCisJc2F2ZV9jYWxsZWVfc2F2ZWRfcmVncyB4MQorCisJLy8gUmVzdG9yZSB0aGUgaG9zdF9jdHh0IGZyb20gdGhlIHN0YWNrCisJbGRyCXgyLCBbc3BdLCAjMTYKKwogCS8vIE5vdyByZXN0b3JlIHRoZSBob3N0IHJlZ3MKIAlyZXN0b3JlX2NhbGxlZV9zYXZlZF9yZWdzIHgyCiAKLQltb3YJeDAsIHgxCi0JcmV0CisJLy8gSWYgd2UgaGF2ZSBhIHBlbmRpbmcgYXN5bmNocm9ub3VzIGFib3J0LCBub3cgaXMgdGhlCisJLy8gdGltZSB0byBmaW5kIG91dC4gRnJvbSB5b3VyIFZBWG9yY2lzdCBib29rLCBwYWdlIDY2NjoKKwkvLyAiVGhyZWF0ZW4gbWUgbm90LCBvaCBFdmlsIG9uZSEgIEZvciBJIHNwZWFrIHdpdGgKKwkvLyB0aGUgcG93ZXIgb2YgREVDLCBhbmQgSSBjb21tYW5kIHRoZWUgdG8gc2hvdyB0aHlzZWxmISIKKwltcnMJeDIsIGVscl9lbDIKKwltcnMJeDMsIGVzcl9lbDIKKwltcnMJeDQsIHNwc3JfZWwyCisJbW92CXg1LCB4MAorCisJZHNiCXN5CQkvLyBTeW5jaHJvbml6ZSBhZ2FpbnN0IGluLWZsaWdodCBsZC9zdAorCW1zcglkYWlmY2xyLCAjNAkvLyBVbm1hc2sgYWJvcnRzCisKKwkvLyBUaGlzIGlzIG91ciBzaW5nbGUgaW5zdHJ1Y3Rpb24gZXhjZXB0aW9uIHdpbmRvdy4gQSBwZW5kaW5nCisJLy8gU0Vycm9yIGlzIGd1YXJhbnRlZWQgdG8gb2NjdXIgYXQgdGhlIGVhcmxpZXN0IHdoZW4gd2UgdW5tYXNrCisJLy8gaXQsIGFuZCBhdCB0aGUgbGF0ZXN0IGp1c3QgYWZ0ZXIgdGhlIElTQi4KKwkuZ2xvYmFsCWFib3J0X2d1ZXN0X2V4aXRfc3RhcnQKK2Fib3J0X2d1ZXN0X2V4aXRfc3RhcnQ6CisKKwlpc2IKKworCS5nbG9iYWwJYWJvcnRfZ3Vlc3RfZXhpdF9lbmQKK2Fib3J0X2d1ZXN0X2V4aXRfZW5kOgorCisJLy8gSWYgdGhlIGV4Y2VwdGlvbiB0b29rIHBsYWNlLCByZXN0b3JlIHRoZSBFTDEgZXhjZXB0aW9uCisJLy8gY29udGV4dCBzbyB0aGF0IHdlIGNhbiByZXBvcnQgc29tZSBpbmZvcm1hdGlvbi4KKwkvLyBNZXJnZSB0aGUgZXhjZXB0aW9uIGNvZGUgd2l0aCB0aGUgU0Vycm9yIHBlbmRpbmcgYml0LgorCXRiegl4MCwgI0FSTV9FWElUX1dJVEhfU0VSUk9SX0JJVCwgMWYKKwltc3IJZWxyX2VsMiwgeDIKKwltc3IJZXNyX2VsMiwgeDMKKwltc3IJc3Bzcl9lbDIsIHg0CisJb3JyCXgwLCB4MCwgeDUKKzE6CXJldAogRU5EUFJPQyhfX2d1ZXN0X2V4aXQpCiAKIEVOVFJZKF9fZnBzaW1kX2d1ZXN0X3Jlc3RvcmUpCisJc3RwCXgyLCB4MywgW3NwLCAjLTE2XSEKIAlzdHAJeDQsIGxyLCBbc3AsICMtMTZdIQogCiBhbHRlcm5hdGl2ZV9pZl9ub3QgQVJNNjRfSEFTX1ZJUlRfSE9TVF9FWFROCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9oeXAvaHlwLWVudHJ5LlMgYi9hcmNoL2FybTY0L2t2bS9oeXAvaHlwLWVudHJ5LlMKaW5kZXggZjZkOTY5NC4uNGU5MjM5OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rdm0vaHlwL2h5cC1lbnRyeS5TCisrKyBiL2FyY2gvYXJtNjQva3ZtL2h5cC9oeXAtZW50cnkuUwpAQCAtMjcsMTYgKzI3LDYgQEAKIAkudGV4dAogCS5wdXNoc2VjdGlvbgkuaHlwLnRleHQsICJheCIKIAotLm1hY3JvCXNhdmVfeDBfdG9feDMKLQlzdHAJeDAsIHgxLCBbc3AsICMtMTZdIQotCXN0cAl4MiwgeDMsIFtzcCwgIy0xNl0hCi0uZW5kbQotCi0ubWFjcm8JcmVzdG9yZV94MF90b194MwotCWxkcAl4MiwgeDMsIFtzcF0sICMxNgotCWxkcAl4MCwgeDEsIFtzcF0sICMxNgotLmVuZG0KLQogLm1hY3JvIGRvX2VsMl9jYWxsCiAJLyoKIAkgKiBTaHVmZmxlIHRoZSBwYXJhbWV0ZXJzIGJlZm9yZSBjYWxsaW5nIHRoZSBmdW5jdGlvbgpAQCAtNzksMjMgKzY5LDIzIEBACiBFTkRQUk9DKF9fa3ZtX2h5cF90ZWFyZG93bikKIAkKIGVsMV9zeW5jOgkJCQkvLyBHdWVzdCB0cmFwcGVkIGludG8gRUwyCi0Jc2F2ZV94MF90b194MworCXN0cAl4MCwgeDEsIFtzcCwgIy0xNl0hCiAKIGFsdGVybmF0aXZlX2lmX25vdCBBUk02NF9IQVNfVklSVF9IT1NUX0VYVE4KIAltcnMJeDEsIGVzcl9lbDIKIGFsdGVybmF0aXZlX2Vsc2UKIAltcnMJeDEsIGVzcl9lbDEKIGFsdGVybmF0aXZlX2VuZGlmCi0JbHNyCXgyLCB4MSwgI0VTUl9FTHhfRUNfU0hJRlQKKwlsc3IJeDAsIHgxLCAjRVNSX0VMeF9FQ19TSElGVAogCi0JY21wCXgyLCAjRVNSX0VMeF9FQ19IVkM2NAorCWNtcAl4MCwgI0VTUl9FTHhfRUNfSFZDNjQKIAliLm5lCWVsMV90cmFwCiAKLQltcnMJeDMsIHZ0dGJyX2VsMgkJLy8gSWYgdnR0YnIgaXMgdmFsaWQsIHRoZSA2NGJpdCBndWVzdAotCWNibnoJeDMsIGVsMV90cmFwCQkvLyBjYWxsZWQgSFZDCisJbXJzCXgxLCB2dHRicl9lbDIJCS8vIElmIHZ0dGJyIGlzIHZhbGlkLCB0aGUgNjRiaXQgZ3Vlc3QKKwljYm56CXgxLCBlbDFfdHJhcAkJLy8gY2FsbGVkIEhWQwogCiAJLyogSGVyZSwgd2UncmUgcHJldHR5IHN1cmUgdGhlIGhvc3QgY2FsbGVkIEhWQy4gKi8KLQlyZXN0b3JlX3gwX3RvX3gzCisJbGRwCXgwLCB4MSwgW3NwXSwgIzE2CiAKIAljbXAJeDAsICNIVkNfR0VUX1ZFQ1RPUlMKIAliLm5lCTFmCkBAIC0xMTMsMjQgKzEwMyw1MSBAQAogCiBlbDFfdHJhcDoKIAkvKgotCSAqIHgxOiBFU1IKLQkgKiB4MjogRVNSX0VDCisJICogeDA6IEVTUl9FQwogCSAqLwogCiAJLyogR3Vlc3QgYWNjZXNzZWQgVkZQL1NJTUQgcmVnaXN0ZXJzLCBzYXZlIGhvc3QsIHJlc3RvcmUgR3Vlc3QgKi8KLQljbXAJeDIsICNFU1JfRUx4X0VDX0ZQX0FTSU1ECisJY21wCXgwLCAjRVNSX0VMeF9FQ19GUF9BU0lNRAogCWIuZXEJX19mcHNpbWRfZ3Vlc3RfcmVzdG9yZQogCi0JbXJzCXgwLCB0cGlkcl9lbDIKLQltb3YJeDEsICNBUk1fRVhDRVBUSU9OX1RSQVAKKwltcnMJeDEsIHRwaWRyX2VsMgorCW1vdgl4MCwgI0FSTV9FWENFUFRJT05fVFJBUAogCWIJX19ndWVzdF9leGl0CiAKIGVsMV9pcnE6Ci0Jc2F2ZV94MF90b194MwotCW1ycwl4MCwgdHBpZHJfZWwyCi0JbW92CXgxLCAjQVJNX0VYQ0VQVElPTl9JUlEKKwlzdHAgICAgIHgwLCB4MSwgW3NwLCAjLTE2XSEKKwltcnMJeDEsIHRwaWRyX2VsMgorCW1vdgl4MCwgI0FSTV9FWENFUFRJT05fSVJRCiAJYglfX2d1ZXN0X2V4aXQKIAorZWwxX2Vycm9yOgorCXN0cCAgICAgeDAsIHgxLCBbc3AsICMtMTZdIQorCW1ycwl4MSwgdHBpZHJfZWwyCisJbW92CXgwLCAjQVJNX0VYQ0VQVElPTl9FTDFfU0VSUk9SCisJYglfX2d1ZXN0X2V4aXQKKworZWwyX2Vycm9yOgorCS8qCisJICogT25seSB0d28gcG9zc2liaWxpdGllczoKKwkgKiAxKSBFaXRoZXIgd2UgY29tZSBmcm9tIHRoZSBleGl0IHBhdGgsIGhhdmluZyBqdXN0IHVubWFza2VkCisJICogICAgUFNUQVRFLkE6IGNoYW5nZSB0aGUgcmV0dXJuIGNvZGUgdG8gYW4gRUwyIGZhdWx0LCBhbmQKKwkgKiAgICBjYXJyeSBvbiwgYXMgd2UncmUgYWxyZWFkeSBpbiBhIHNhbmUgc3RhdGUgdG8gaGFuZGxlIGl0LgorCSAqIDIpIE9yIHdlIGNvbWUgZnJvbSBhbnl3aGVyZSBlbHNlLCBhbmQgdGhhdCdzIGEgYnVnOiB3ZSBwYW5pYy4KKwkgKgorCSAqIEZvciAoMSksIHgwIGNvbnRhaW5zIHRoZSBvcmlnaW5hbCByZXR1cm4gY29kZSBhbmQgeDEgZG9lc24ndAorCSAqIGNvbnRhaW4gYW55dGhpbmcgbWVhbmluZ2Z1bCBhdCB0aGF0IHN0YWdlLiBXZSBjYW4gcmV1c2UgdGhlbQorCSAqIGFzIHRlbXAgcmVnaXN0ZXJzLgorCSAqIEZvciAoMiksIHdobyBjYXJlcz8KKwkgKi8KKwltcnMJeDAsIGVscl9lbDIKKwlhZHIJeDEsIGFib3J0X2d1ZXN0X2V4aXRfc3RhcnQKKwljbXAJeDAsIHgxCisJYWRyCXgxLCBhYm9ydF9ndWVzdF9leGl0X2VuZAorCWNjbXAJeDAsIHgxLCAjNCwgbmUKKwliLm5lCV9faHlwX3BhbmljCisJbW92CXgwLCAjKDEgPDwgQVJNX0VYSVRfV0lUSF9TRVJST1JfQklUKQorCWVyZXQKKwogRU5UUlkoX19oeXBfZG9fcGFuaWMpCiAJbW92CWxyLCAjKFBTUl9GX0JJVCB8IFBTUl9JX0JJVCB8IFBTUl9BX0JJVCB8IFBTUl9EX0JJVCB8XAogCQkgICAgICBQU1JfTU9ERV9FTDFoKQpAQCAtMTU1LDExICsxNzIsOSBAQAogCWludmFsaWRfdmVjdG9yCWVsMmhfc3luY19pbnZhbGlkCiAJaW52YWxpZF92ZWN0b3IJZWwyaF9pcnFfaW52YWxpZAogCWludmFsaWRfdmVjdG9yCWVsMmhfZmlxX2ludmFsaWQKLQlpbnZhbGlkX3ZlY3RvcgllbDJoX2Vycm9yX2ludmFsaWQKIAlpbnZhbGlkX3ZlY3RvcgllbDFfc3luY19pbnZhbGlkCiAJaW52YWxpZF92ZWN0b3IJZWwxX2lycV9pbnZhbGlkCiAJaW52YWxpZF92ZWN0b3IJZWwxX2ZpcV9pbnZhbGlkCi0JaW52YWxpZF92ZWN0b3IJZWwxX2Vycm9yX2ludmFsaWQKIAogCS5sdG9yZwogCkBAIC0xNzQsMTUgKzE4OSwxNSBAQAogCXZlbnRyeQllbDJoX3N5bmNfaW52YWxpZAkJLy8gU3luY2hyb25vdXMgRUwyaAogCXZlbnRyeQllbDJoX2lycV9pbnZhbGlkCQkvLyBJUlEgRUwyaAogCXZlbnRyeQllbDJoX2ZpcV9pbnZhbGlkCQkvLyBGSVEgRUwyaAotCXZlbnRyeQllbDJoX2Vycm9yX2ludmFsaWQJCS8vIEVycm9yIEVMMmgKKwl2ZW50cnkJZWwyX2Vycm9yCQkJLy8gRXJyb3IgRUwyaAogCiAJdmVudHJ5CWVsMV9zeW5jCQkJLy8gU3luY2hyb25vdXMgNjQtYml0IEVMMQogCXZlbnRyeQllbDFfaXJxCQkJCS8vIElSUSA2NC1iaXQgRUwxCiAJdmVudHJ5CWVsMV9maXFfaW52YWxpZAkJCS8vIEZJUSA2NC1iaXQgRUwxCi0JdmVudHJ5CWVsMV9lcnJvcl9pbnZhbGlkCQkvLyBFcnJvciA2NC1iaXQgRUwxCisJdmVudHJ5CWVsMV9lcnJvcgkJCS8vIEVycm9yIDY0LWJpdCBFTDEKIAogCXZlbnRyeQllbDFfc3luYwkJCS8vIFN5bmNocm9ub3VzIDMyLWJpdCBFTDEKIAl2ZW50cnkJZWwxX2lycQkJCQkvLyBJUlEgMzItYml0IEVMMQogCXZlbnRyeQllbDFfZmlxX2ludmFsaWQJCQkvLyBGSVEgMzItYml0IEVMMQotCXZlbnRyeQllbDFfZXJyb3JfaW52YWxpZAkJLy8gRXJyb3IgMzItYml0IEVMMQorCXZlbnRyeQllbDFfZXJyb3IJCQkvLyBFcnJvciAzMi1iaXQgRUwxCiBFTkRQUk9DKF9fa3ZtX2h5cF92ZWN0b3IpCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9oeXAvc3dpdGNoLmMgYi9hcmNoL2FybTY0L2t2bS9oeXAvc3dpdGNoLmMKaW5kZXggYWU3ODU1Zi4uODMwMzdjZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rdm0vaHlwL3N3aXRjaC5jCisrKyBiL2FyY2gvYXJtNjQva3ZtL2h5cC9zd2l0Y2guYwpAQCAtMTYsNyArMTYsMTAgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9qdW1wX2xhYmVsLmg+CisKICNpbmNsdWRlIDxhc20va3ZtX2FzbS5oPgorI2luY2x1ZGUgPGFzbS9rdm1fZW11bGF0ZS5oPgogI2luY2x1ZGUgPGFzbS9rdm1faHlwLmg+CiAKIHN0YXRpYyBib29sIF9faHlwX3RleHQgX19mcHNpbWRfZW5hYmxlZF9udmhlKHZvaWQpCkBAIC0xMDksNiArMTEyLDE1IEBACiAKIHN0YXRpYyB2b2lkIF9faHlwX3RleHQgX19kZWFjdGl2YXRlX3RyYXBzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKKwkvKgorCSAqIElmIHdlIHBlbmRlZCBhIHZpcnR1YWwgYWJvcnQsIHByZXNlcnZlIGl0IHVudGlsIGl0IGdldHMKKwkgKiBjbGVhcmVkLiBTZWUgRDEuMTQuMyAoVmlydHVhbCBJbnRlcnJ1cHRzKSBmb3IgZGV0YWlscywgYnV0CisJICogdGhlIGNydWNpYWwgYml0IGlzICJPbiB0YWtpbmcgYSB2U0Vycm9yIGludGVycnVwdCwKKwkgKiBIQ1JfRUwyLlZTRSBpcyBjbGVhcmVkIHRvIDAuIgorCSAqLworCWlmICh2Y3B1LT5hcmNoLmhjcl9lbDIgJiBIQ1JfVlNFKQorCQl2Y3B1LT5hcmNoLmhjcl9lbDIgPSByZWFkX3N5c3JlZyhoY3JfZWwyKTsKKwogCV9fZGVhY3RpdmF0ZV90cmFwc19hcmNoKCkoKTsKIAl3cml0ZV9zeXNyZWcoMCwgaHN0cl9lbDIpOwogCXdyaXRlX3N5c3JlZyhyZWFkX3N5c3JlZyhtZGNyX2VsMikgJiBNRENSX0VMMl9IUE1OX01BU0ssIG1kY3JfZWwyKTsKQEAgLTEyNiwxNyArMTM4LDEzIEBACiAJd3JpdGVfc3lzcmVnKDAsIHZ0dGJyX2VsMik7CiB9CiAKLXN0YXRpYyBoeXBfYWx0ZXJuYXRlX3NlbGVjdChfX3ZnaWNfY2FsbF9zYXZlX3N0YXRlLAotCQkJICAgIF9fdmdpY192Ml9zYXZlX3N0YXRlLCBfX3ZnaWNfdjNfc2F2ZV9zdGF0ZSwKLQkJCSAgICBBUk02NF9IQVNfU1lTUkVHX0dJQ19DUFVJRik7Ci0KLXN0YXRpYyBoeXBfYWx0ZXJuYXRlX3NlbGVjdChfX3ZnaWNfY2FsbF9yZXN0b3JlX3N0YXRlLAotCQkJICAgIF9fdmdpY192Ml9yZXN0b3JlX3N0YXRlLCBfX3ZnaWNfdjNfcmVzdG9yZV9zdGF0ZSwKLQkJCSAgICBBUk02NF9IQVNfU1lTUkVHX0dJQ19DUFVJRik7Ci0KIHN0YXRpYyB2b2lkIF9faHlwX3RleHQgX192Z2ljX3NhdmVfc3RhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCV9fdmdpY19jYWxsX3NhdmVfc3RhdGUoKSh2Y3B1KTsKKwlpZiAoc3RhdGljX2JyYW5jaF91bmxpa2VseSgma3ZtX3ZnaWNfZ2xvYmFsX3N0YXRlLmdpY3YzX2NwdWlmKSkKKwkJX192Z2ljX3YzX3NhdmVfc3RhdGUodmNwdSk7CisJZWxzZQorCQlfX3ZnaWNfdjJfc2F2ZV9zdGF0ZSh2Y3B1KTsKKwogCXdyaXRlX3N5c3JlZyhyZWFkX3N5c3JlZyhoY3JfZWwyKSAmIH5IQ1JfSU5UX09WRVJSSURFLCBoY3JfZWwyKTsKIH0KIApAQCAtMTQ5LDcgKzE1NywxMCBAQAogCXZhbCB8PSB2Y3B1LT5hcmNoLmlycV9saW5lczsKIAl3cml0ZV9zeXNyZWcodmFsLCBoY3JfZWwyKTsKIAotCV9fdmdpY19jYWxsX3Jlc3RvcmVfc3RhdGUoKSh2Y3B1KTsKKwlpZiAoc3RhdGljX2JyYW5jaF91bmxpa2VseSgma3ZtX3ZnaWNfZ2xvYmFsX3N0YXRlLmdpY3YzX2NwdWlmKSkKKwkJX192Z2ljX3YzX3Jlc3RvcmVfc3RhdGUodmNwdSk7CisJZWxzZQorCQlfX3ZnaWNfdjJfcmVzdG9yZV9zdGF0ZSh2Y3B1KTsKIH0KIAogc3RhdGljIGJvb2wgX19oeXBfdGV4dCBfX3RydWVfdmFsdWUodm9pZCkKQEAgLTIzMiw3ICsyNDMsMjIgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIGludCBfX2h5cF90ZXh0IF9fZ3Vlc3RfcnVuKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3N0YXRpYyB2b2lkIF9faHlwX3RleHQgX19za2lwX2luc3RyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwkqdmNwdV9wYyh2Y3B1KSA9IHJlYWRfc3lzcmVnX2VsMihlbHIpOworCisJaWYgKHZjcHVfbW9kZV9pc18zMmJpdCh2Y3B1KSkgeworCQl2Y3B1LT5hcmNoLmN0eHQuZ3BfcmVncy5yZWdzLnBzdGF0ZSA9IHJlYWRfc3lzcmVnX2VsMihzcHNyKTsKKwkJa3ZtX3NraXBfaW5zdHIzMih2Y3B1LCBrdm1fdmNwdV90cmFwX2lsX2lzMzJiaXQodmNwdSkpOworCQl3cml0ZV9zeXNyZWdfZWwyKHZjcHUtPmFyY2guY3R4dC5ncF9yZWdzLnJlZ3MucHN0YXRlLCBzcHNyKTsKKwl9IGVsc2UgeworCQkqdmNwdV9wYyh2Y3B1KSArPSA0OworCX0KKworCXdyaXRlX3N5c3JlZ19lbDIoKnZjcHVfcGModmNwdSksIGVscik7Cit9CisKK2ludCBfX2h5cF90ZXh0IF9fa3ZtX3ZjcHVfcnVuKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlzdHJ1Y3Qga3ZtX2NwdV9jb250ZXh0ICpob3N0X2N0eHQ7CiAJc3RydWN0IGt2bV9jcHVfY29udGV4dCAqZ3Vlc3RfY3R4dDsKQEAgLTI1Niw3ICsyODIsNyBAQAogCiAJLyoKIAkgKiBXZSBtdXN0IHJlc3RvcmUgdGhlIDMyLWJpdCBzdGF0ZSBiZWZvcmUgdGhlIHN5c3JlZ3MsIHRoYW5rcwotCSAqIHRvIENvcnRleC1BNTcgZXJyYXR1bSAjODUyNTIzLgorCSAqIHRvIGVycmF0dW0gIzg1MjUyMyAoQ29ydGV4LUE1Nykgb3IgIzg1MzcwOSAoQ29ydGV4LUE3MikuCiAJICovCiAJX19zeXNyZWczMl9yZXN0b3JlX3N0YXRlKHZjcHUpOwogCV9fc3lzcmVnX3Jlc3RvcmVfZ3Vlc3Rfc3RhdGUoZ3Vlc3RfY3R4dCk7CkBAIC0yNjcsOSArMjkzLDQzIEBACiAJZXhpdF9jb2RlID0gX19ndWVzdF9lbnRlcih2Y3B1LCBob3N0X2N0eHQpOwogCS8qIEFuZCB3ZSdyZSBiYWFhY2shICovCiAKKwkvKgorCSAqIFdlJ3JlIHVzaW5nIHRoZSByYXcgZXhjZXB0aW9uIGNvZGUgaW4gb3JkZXIgdG8gb25seSBwcm9jZXNzCisJICogdGhlIHRyYXAgaWYgbm8gU0Vycm9yIGlzIHBlbmRpbmcuIFdlIHdpbGwgY29tZSBiYWNrIHRvIHRoZQorCSAqIHNhbWUgUEMgb25jZSB0aGUgU0Vycm9yIGhhcyBiZWVuIGluamVjdGVkLCBhbmQgcmVwbGF5IHRoZQorCSAqIHRyYXBwaW5nIGluc3RydWN0aW9uLgorCSAqLwogCWlmIChleGl0X2NvZGUgPT0gQVJNX0VYQ0VQVElPTl9UUkFQICYmICFfX3BvcHVsYXRlX2ZhdWx0X2luZm8odmNwdSkpCiAJCWdvdG8gYWdhaW47CiAKKwlpZiAoc3RhdGljX2JyYW5jaF91bmxpa2VseSgmdmdpY192Ml9jcHVpZl90cmFwKSAmJgorCSAgICBleGl0X2NvZGUgPT0gQVJNX0VYQ0VQVElPTl9UUkFQKSB7CisJCWJvb2wgdmFsaWQ7CisKKwkJdmFsaWQgPSBrdm1fdmNwdV90cmFwX2dldF9jbGFzcyh2Y3B1KSA9PSBFU1JfRUx4X0VDX0RBQlRfTE9XICYmCisJCQlrdm1fdmNwdV90cmFwX2dldF9mYXVsdF90eXBlKHZjcHUpID09IEZTQ19GQVVMVCAmJgorCQkJa3ZtX3ZjcHVfZGFidF9pc3ZhbGlkKHZjcHUpICYmCisJCQkha3ZtX3ZjcHVfZGFidF9pc2V4dGFidCh2Y3B1KSAmJgorCQkJIWt2bV92Y3B1X2RhYnRfaXNzMXR3KHZjcHUpOworCisJCWlmICh2YWxpZCkgeworCQkJaW50IHJldCA9IF9fdmdpY192Ml9wZXJmb3JtX2NwdWlmX2FjY2Vzcyh2Y3B1KTsKKworCQkJaWYgKHJldCA9PSAxKSB7CisJCQkJX19za2lwX2luc3RyKHZjcHUpOworCQkJCWdvdG8gYWdhaW47CisJCQl9CisKKwkJCWlmIChyZXQgPT0gLTEpIHsKKwkJCQkvKiBQcm9tb3RlIGFuIGlsbGVnYWwgYWNjZXNzIHRvIGFuIFNFcnJvciAqLworCQkJCV9fc2tpcF9pbnN0cih2Y3B1KTsKKwkJCQlleGl0X2NvZGUgPSBBUk1fRVhDRVBUSU9OX0VMMV9TRVJST1I7CisJCQl9CisKKwkJCS8qIDAgZmFsbHMgdGhyb3VnaCB0byBiZSBoYW5kbGVyIG91dCBvZiBFTDIgKi8KKwkJfQorCX0KKwogCWZwX2VuYWJsZWQgPSBfX2Zwc2ltZF9lbmFibGVkKCk7CiAKIAlfX3N5c3JlZ19zYXZlX2d1ZXN0X3N0YXRlKGd1ZXN0X2N0eHQpOwpAQCAtMjkzLDggKzM1Myw2IEBACiAJcmV0dXJuIGV4aXRfY29kZTsKIH0KIAotX19hbGlhcyhfX2d1ZXN0X3J1bikgaW50IF9fa3ZtX3ZjcHVfcnVuKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7Ci0KIHN0YXRpYyBjb25zdCBjaGFyIF9faHlwX3BhbmljX3N0cmluZ1tdID0gIkhZUCBwYW5pYzpcblBTOiUwOGxseCBQQzolMDE2bGx4IEVTUjolMDhsbHhcbkZBUjolMDE2bGx4IEhQRkFSOiUwMTZsbHggUEFSOiUwMTZsbHhcblZDUFU6JXBcbiI7CiAKIHN0YXRpYyB2b2lkIF9faHlwX3RleHQgX19oeXBfY2FsbF9wYW5pY19udmhlKHU2NCBzcHNyLCB1NjQgZWxyLCB1NjQgcGFyKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vaHlwL3RsYi5jIGIvYXJjaC9hcm02NC9rdm0vaHlwL3RsYi5jCmluZGV4IGJlODE3N2MuLjljYzBlYTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva3ZtL2h5cC90bGIuYworKysgYi9hcmNoL2FybTY0L2t2bS9oeXAvdGxiLmMKQEAgLTE3LDcgKzE3LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9rdm1faHlwLmg+CiAKLXN0YXRpYyB2b2lkIF9faHlwX3RleHQgX190bGJfZmx1c2hfdm1pZF9pcGEoc3RydWN0IGt2bSAqa3ZtLCBwaHlzX2FkZHJfdCBpcGEpCit2b2lkIF9faHlwX3RleHQgX19rdm1fdGxiX2ZsdXNoX3ZtaWRfaXBhKHN0cnVjdCBrdm0gKmt2bSwgcGh5c19hZGRyX3QgaXBhKQogewogCWRzYihpc2hzdCk7CiAKQEAgLTQ4LDEwICs0OCw3IEBACiAJd3JpdGVfc3lzcmVnKDAsIHZ0dGJyX2VsMik7CiB9CiAKLV9fYWxpYXMoX190bGJfZmx1c2hfdm1pZF9pcGEpIHZvaWQgX19rdm1fdGxiX2ZsdXNoX3ZtaWRfaXBhKHN0cnVjdCBrdm0gKmt2bSwKLQkJCQkJCQkgICAgcGh5c19hZGRyX3QgaXBhKTsKLQotc3RhdGljIHZvaWQgX19oeXBfdGV4dCBfX3RsYl9mbHVzaF92bWlkKHN0cnVjdCBrdm0gKmt2bSkKK3ZvaWQgX19oeXBfdGV4dCBfX2t2bV90bGJfZmx1c2hfdm1pZChzdHJ1Y3Qga3ZtICprdm0pCiB7CiAJZHNiKGlzaHN0KTsKIApAQCAtNjcsMTQgKzY0LDEwIEBACiAJd3JpdGVfc3lzcmVnKDAsIHZ0dGJyX2VsMik7CiB9CiAKLV9fYWxpYXMoX190bGJfZmx1c2hfdm1pZCkgdm9pZCBfX2t2bV90bGJfZmx1c2hfdm1pZChzdHJ1Y3Qga3ZtICprdm0pOwotCi1zdGF0aWMgdm9pZCBfX2h5cF90ZXh0IF9fdGxiX2ZsdXNoX3ZtX2NvbnRleHQodm9pZCkKK3ZvaWQgX19oeXBfdGV4dCBfX2t2bV9mbHVzaF92bV9jb250ZXh0KHZvaWQpCiB7CiAJZHNiKGlzaHN0KTsKIAlhc20gdm9sYXRpbGUoInRsYmkgYWxsZTFpcwlcbiIKIAkJICAgICAiaWMgaWFsbHVpcwkgICI6IDogKTsKIAlkc2IoaXNoKTsKIH0KLQotX19hbGlhcyhfX3RsYl9mbHVzaF92bV9jb250ZXh0KSB2b2lkIF9fa3ZtX2ZsdXNoX3ZtX2NvbnRleHQodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9oeXAvdmdpYy12My1zci5jIGIvYXJjaC9hcm02NC9rdm0vaHlwL3ZnaWMtdjMtc3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4ZjgwYi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybTY0L2t2bS9oeXAvdmdpYy12My1zci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNSAtIEFSTSBMdGQKLSAqIEF1dGhvcjogTWFyYyBaeW5naWVyIDxtYXJjLnp5bmdpZXJAYXJtLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAvYXJtLWdpYy12My5oPgotI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+Ci0KLSNpbmNsdWRlIDxhc20va3ZtX2h5cC5oPgotCi0jZGVmaW5lIHZ0cl90b19tYXhfbHJfaWR4KHYpCQkoKHYpICYgMHhmKQotI2RlZmluZSB2dHJfdG9fbnJfcHJpX2JpdHModikJCSgoKHUzMikodikgPj4gMjkpICsgMSkKLQotI2RlZmluZSByZWFkX2dpY3JlZyhyKQkJCQkJCQlcCi0JKHsJCQkJCQkJCVwKLQkJdTY0IHJlZzsJCQkJCQlcCi0JCWFzbSB2b2xhdGlsZSgibXJzX3MgJTAsICIgX19zdHJpbmdpZnkocikgOiAiPXIiIChyZWcpKTsJXAotCQlyZWc7CQkJCQkJCVwKLQl9KQotCi0jZGVmaW5lIHdyaXRlX2dpY3JlZyh2LHIpCQkJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkJdTY0IF9fdmFsID0gKHYpOwkJCQkJXAotCQlhc20gdm9sYXRpbGUoIm1zcl9zICIgX19zdHJpbmdpZnkocikgIiwgJTAiIDogOiAiciIgKF9fdmFsKSk7XAotCX0gd2hpbGUgKDApCi0KLXN0YXRpYyB1NjQgX19oeXBfdGV4dCBfX2dpY192M19nZXRfbHIodW5zaWduZWQgaW50IGxyKQotewotCXN3aXRjaCAobHIgJiAweGYpIHsKLQljYXNlIDA6Ci0JCXJldHVybiByZWFkX2dpY3JlZyhJQ0hfTFIwX0VMMik7Ci0JY2FzZSAxOgotCQlyZXR1cm4gcmVhZF9naWNyZWcoSUNIX0xSMV9FTDIpOwotCWNhc2UgMjoKLQkJcmV0dXJuIHJlYWRfZ2ljcmVnKElDSF9MUjJfRUwyKTsKLQljYXNlIDM6Ci0JCXJldHVybiByZWFkX2dpY3JlZyhJQ0hfTFIzX0VMMik7Ci0JY2FzZSA0OgotCQlyZXR1cm4gcmVhZF9naWNyZWcoSUNIX0xSNF9FTDIpOwotCWNhc2UgNToKLQkJcmV0dXJuIHJlYWRfZ2ljcmVnKElDSF9MUjVfRUwyKTsKLQljYXNlIDY6Ci0JCXJldHVybiByZWFkX2dpY3JlZyhJQ0hfTFI2X0VMMik7Ci0JY2FzZSA3OgotCQlyZXR1cm4gcmVhZF9naWNyZWcoSUNIX0xSN19FTDIpOwotCWNhc2UgODoKLQkJcmV0dXJuIHJlYWRfZ2ljcmVnKElDSF9MUjhfRUwyKTsKLQljYXNlIDk6Ci0JCXJldHVybiByZWFkX2dpY3JlZyhJQ0hfTFI5X0VMMik7Ci0JY2FzZSAxMDoKLQkJcmV0dXJuIHJlYWRfZ2ljcmVnKElDSF9MUjEwX0VMMik7Ci0JY2FzZSAxMToKLQkJcmV0dXJuIHJlYWRfZ2ljcmVnKElDSF9MUjExX0VMMik7Ci0JY2FzZSAxMjoKLQkJcmV0dXJuIHJlYWRfZ2ljcmVnKElDSF9MUjEyX0VMMik7Ci0JY2FzZSAxMzoKLQkJcmV0dXJuIHJlYWRfZ2ljcmVnKElDSF9MUjEzX0VMMik7Ci0JY2FzZSAxNDoKLQkJcmV0dXJuIHJlYWRfZ2ljcmVnKElDSF9MUjE0X0VMMik7Ci0JY2FzZSAxNToKLQkJcmV0dXJuIHJlYWRfZ2ljcmVnKElDSF9MUjE1X0VMMik7Ci0JfQotCi0JdW5yZWFjaGFibGUoKTsKLX0KLQotc3RhdGljIHZvaWQgX19oeXBfdGV4dCBfX2dpY192M19zZXRfbHIodTY0IHZhbCwgaW50IGxyKQotewotCXN3aXRjaCAobHIgJiAweGYpIHsKLQljYXNlIDA6Ci0JCXdyaXRlX2dpY3JlZyh2YWwsIElDSF9MUjBfRUwyKTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQl3cml0ZV9naWNyZWcodmFsLCBJQ0hfTFIxX0VMMik7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJd3JpdGVfZ2ljcmVnKHZhbCwgSUNIX0xSMl9FTDIpOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCXdyaXRlX2dpY3JlZyh2YWwsIElDSF9MUjNfRUwyKTsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQl3cml0ZV9naWNyZWcodmFsLCBJQ0hfTFI0X0VMMik7Ci0JCWJyZWFrOwotCWNhc2UgNToKLQkJd3JpdGVfZ2ljcmVnKHZhbCwgSUNIX0xSNV9FTDIpOwotCQlicmVhazsKLQljYXNlIDY6Ci0JCXdyaXRlX2dpY3JlZyh2YWwsIElDSF9MUjZfRUwyKTsKLQkJYnJlYWs7Ci0JY2FzZSA3OgotCQl3cml0ZV9naWNyZWcodmFsLCBJQ0hfTFI3X0VMMik7Ci0JCWJyZWFrOwotCWNhc2UgODoKLQkJd3JpdGVfZ2ljcmVnKHZhbCwgSUNIX0xSOF9FTDIpOwotCQlicmVhazsKLQljYXNlIDk6Ci0JCXdyaXRlX2dpY3JlZyh2YWwsIElDSF9MUjlfRUwyKTsKLQkJYnJlYWs7Ci0JY2FzZSAxMDoKLQkJd3JpdGVfZ2ljcmVnKHZhbCwgSUNIX0xSMTBfRUwyKTsKLQkJYnJlYWs7Ci0JY2FzZSAxMToKLQkJd3JpdGVfZ2ljcmVnKHZhbCwgSUNIX0xSMTFfRUwyKTsKLQkJYnJlYWs7Ci0JY2FzZSAxMjoKLQkJd3JpdGVfZ2ljcmVnKHZhbCwgSUNIX0xSMTJfRUwyKTsKLQkJYnJlYWs7Ci0JY2FzZSAxMzoKLQkJd3JpdGVfZ2ljcmVnKHZhbCwgSUNIX0xSMTNfRUwyKTsKLQkJYnJlYWs7Ci0JY2FzZSAxNDoKLQkJd3JpdGVfZ2ljcmVnKHZhbCwgSUNIX0xSMTRfRUwyKTsKLQkJYnJlYWs7Ci0JY2FzZSAxNToKLQkJd3JpdGVfZ2ljcmVnKHZhbCwgSUNIX0xSMTVfRUwyKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfX2h5cF90ZXh0IHNhdmVfbWFpbnRfaW50X3N0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IG5yX2xyKQotewotCXN0cnVjdCB2Z2ljX3YzX2NwdV9pZiAqY3B1X2lmID0gJnZjcHUtPmFyY2gudmdpY19jcHUudmdpY192MzsKLQlpbnQgaTsKLQlib29sIGV4cGVjdF9taTsKLQotCWV4cGVjdF9taSA9ICEhKGNwdV9pZi0+dmdpY19oY3IgJiBJQ0hfSENSX1VJRSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnJfbHI7IGkrKykgewotCQlpZiAoISh2Y3B1LT5hcmNoLnZnaWNfY3B1LmxpdmVfbHJzICYgKDFVTCA8PCBpKSkpCi0JCQkJY29udGludWU7Ci0KLQkJZXhwZWN0X21pIHw9ICghKGNwdV9pZi0+dmdpY19scltpXSAmIElDSF9MUl9IVykgJiYKLQkJCSAgICAgIChjcHVfaWYtPnZnaWNfbHJbaV0gJiBJQ0hfTFJfRU9JKSk7Ci0JfQotCi0JaWYgKGV4cGVjdF9taSkgewotCQljcHVfaWYtPnZnaWNfbWlzciAgPSByZWFkX2dpY3JlZyhJQ0hfTUlTUl9FTDIpOwotCi0JCWlmIChjcHVfaWYtPnZnaWNfbWlzciAmIElDSF9NSVNSX0VPSSkKLQkJCWNwdV9pZi0+dmdpY19laXNyID0gcmVhZF9naWNyZWcoSUNIX0VJU1JfRUwyKTsKLQkJZWxzZQotCQkJY3B1X2lmLT52Z2ljX2Vpc3IgPSAwOwotCX0gZWxzZSB7Ci0JCWNwdV9pZi0+dmdpY19taXNyID0gMDsKLQkJY3B1X2lmLT52Z2ljX2Vpc3IgPSAwOwotCX0KLX0KLQotdm9pZCBfX2h5cF90ZXh0IF9fdmdpY192M19zYXZlX3N0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQlzdHJ1Y3QgdmdpY192M19jcHVfaWYgKmNwdV9pZiA9ICZ2Y3B1LT5hcmNoLnZnaWNfY3B1LnZnaWNfdjM7Ci0JdTY0IHZhbDsKLQotCS8qCi0JICogTWFrZSBzdXJlIHN0b3JlcyB0byB0aGUgR0lDIHZpYSB0aGUgbWVtb3J5IG1hcHBlZCBpbnRlcmZhY2UKLQkgKiBhcmUgbm93IHZpc2libGUgdG8gdGhlIHN5c3RlbSByZWdpc3RlciBpbnRlcmZhY2UuCi0JICovCi0JaWYgKCFjcHVfaWYtPnZnaWNfc3JlKQotCQlkc2Ioc3QpOwotCi0JY3B1X2lmLT52Z2ljX3ZtY3IgID0gcmVhZF9naWNyZWcoSUNIX1ZNQ1JfRUwyKTsKLQotCWlmICh2Y3B1LT5hcmNoLnZnaWNfY3B1LmxpdmVfbHJzKSB7Ci0JCWludCBpOwotCQl1MzIgbWF4X2xyX2lkeCwgbnJfcHJpX2JpdHM7Ci0KLQkJY3B1X2lmLT52Z2ljX2VscnNyID0gcmVhZF9naWNyZWcoSUNIX0VMU1JfRUwyKTsKLQotCQl3cml0ZV9naWNyZWcoMCwgSUNIX0hDUl9FTDIpOwotCQl2YWwgPSByZWFkX2dpY3JlZyhJQ0hfVlRSX0VMMik7Ci0JCW1heF9scl9pZHggPSB2dHJfdG9fbWF4X2xyX2lkeCh2YWwpOwotCQlucl9wcmlfYml0cyA9IHZ0cl90b19ucl9wcmlfYml0cyh2YWwpOwotCi0JCXNhdmVfbWFpbnRfaW50X3N0YXRlKHZjcHUsIG1heF9scl9pZHggKyAxKTsKLQotCQlmb3IgKGkgPSAwOyBpIDw9IG1heF9scl9pZHg7IGkrKykgewotCQkJaWYgKCEodmNwdS0+YXJjaC52Z2ljX2NwdS5saXZlX2xycyAmICgxVUwgPDwgaSkpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoY3B1X2lmLT52Z2ljX2VscnNyICYgKDEgPDwgaSkpCi0JCQkJY3B1X2lmLT52Z2ljX2xyW2ldICY9IH5JQ0hfTFJfU1RBVEU7Ci0JCQllbHNlCi0JCQkJY3B1X2lmLT52Z2ljX2xyW2ldID0gX19naWNfdjNfZ2V0X2xyKGkpOwotCi0JCQlfX2dpY192M19zZXRfbHIoMCwgaSk7Ci0JCX0KLQotCQlzd2l0Y2ggKG5yX3ByaV9iaXRzKSB7Ci0JCWNhc2UgNzoKLQkJCWNwdV9pZi0+dmdpY19hcDByWzNdID0gcmVhZF9naWNyZWcoSUNIX0FQMFIzX0VMMik7Ci0JCQljcHVfaWYtPnZnaWNfYXAwclsyXSA9IHJlYWRfZ2ljcmVnKElDSF9BUDBSMl9FTDIpOwotCQljYXNlIDY6Ci0JCQljcHVfaWYtPnZnaWNfYXAwclsxXSA9IHJlYWRfZ2ljcmVnKElDSF9BUDBSMV9FTDIpOwotCQlkZWZhdWx0OgotCQkJY3B1X2lmLT52Z2ljX2FwMHJbMF0gPSByZWFkX2dpY3JlZyhJQ0hfQVAwUjBfRUwyKTsKLQkJfQotCi0JCXN3aXRjaCAobnJfcHJpX2JpdHMpIHsKLQkJY2FzZSA3OgotCQkJY3B1X2lmLT52Z2ljX2FwMXJbM10gPSByZWFkX2dpY3JlZyhJQ0hfQVAxUjNfRUwyKTsKLQkJCWNwdV9pZi0+dmdpY19hcDFyWzJdID0gcmVhZF9naWNyZWcoSUNIX0FQMVIyX0VMMik7Ci0JCWNhc2UgNjoKLQkJCWNwdV9pZi0+dmdpY19hcDFyWzFdID0gcmVhZF9naWNyZWcoSUNIX0FQMVIxX0VMMik7Ci0JCWRlZmF1bHQ6Ci0JCQljcHVfaWYtPnZnaWNfYXAxclswXSA9IHJlYWRfZ2ljcmVnKElDSF9BUDFSMF9FTDIpOwotCQl9Ci0KLQkJdmNwdS0+YXJjaC52Z2ljX2NwdS5saXZlX2xycyA9IDA7Ci0JfSBlbHNlIHsKLQkJY3B1X2lmLT52Z2ljX21pc3IgID0gMDsKLQkJY3B1X2lmLT52Z2ljX2Vpc3IgID0gMDsKLQkJY3B1X2lmLT52Z2ljX2VscnNyID0gMHhmZmZmOwotCQljcHVfaWYtPnZnaWNfYXAwclswXSA9IDA7Ci0JCWNwdV9pZi0+dmdpY19hcDByWzFdID0gMDsKLQkJY3B1X2lmLT52Z2ljX2FwMHJbMl0gPSAwOwotCQljcHVfaWYtPnZnaWNfYXAwclszXSA9IDA7Ci0JCWNwdV9pZi0+dmdpY19hcDFyWzBdID0gMDsKLQkJY3B1X2lmLT52Z2ljX2FwMXJbMV0gPSAwOwotCQljcHVfaWYtPnZnaWNfYXAxclsyXSA9IDA7Ci0JCWNwdV9pZi0+dmdpY19hcDFyWzNdID0gMDsKLQl9Ci0KLQl2YWwgPSByZWFkX2dpY3JlZyhJQ0NfU1JFX0VMMik7Ci0Jd3JpdGVfZ2ljcmVnKHZhbCB8IElDQ19TUkVfRUwyX0VOQUJMRSwgSUNDX1NSRV9FTDIpOwotCi0JaWYgKCFjcHVfaWYtPnZnaWNfc3JlKSB7Ci0JCS8qIE1ha2Ugc3VyZSBFTkFCTEUgaXMgc2V0IGF0IEVMMiBiZWZvcmUgc2V0dGluZyBTUkUgYXQgRUwxICovCi0JCWlzYigpOwotCQl3cml0ZV9naWNyZWcoMSwgSUNDX1NSRV9FTDEpOwotCX0KLX0KLQotdm9pZCBfX2h5cF90ZXh0IF9fdmdpY192M19yZXN0b3JlX3N0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQlzdHJ1Y3QgdmdpY192M19jcHVfaWYgKmNwdV9pZiA9ICZ2Y3B1LT5hcmNoLnZnaWNfY3B1LnZnaWNfdjM7Ci0JdTY0IHZhbDsKLQl1MzIgbWF4X2xyX2lkeCwgbnJfcHJpX2JpdHM7Ci0JdTE2IGxpdmVfbHJzID0gMDsKLQlpbnQgaTsKLQotCS8qCi0JICogVkZJUUVuIGlzIFJFUzEgaWYgSUNDX1NSRV9FTDEuU1JFIGlzIDEuIFRoaXMgY2F1c2VzIGEKLQkgKiBHcm91cDAgaW50ZXJydXB0IChhcyBnZW5lcmF0ZWQgaW4gR0lDdjIgbW9kZSkgdG8gYmUKLQkgKiBkZWxpdmVyZWQgYXMgYSBGSVEgdG8gdGhlIGd1ZXN0LCB3aXRoIHBvdGVudGlhbGx5IGZhdGFsCi0JICogY29uc2VxdWVuY2VzLiBTbyB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IElDQ19TUkVfRUwxIGhhcwotCSAqIGJlZW4gYWN0dWFsbHkgcHJvZ3JhbW1lZCB3aXRoIHRoZSB2YWx1ZSB3ZSB3YW50IGJlZm9yZQotCSAqIHN0YXJ0aW5nIHRvIG1lc3Mgd2l0aCB0aGUgcmVzdCBvZiB0aGUgR0lDLgotCSAqLwotCWlmICghY3B1X2lmLT52Z2ljX3NyZSkgewotCQl3cml0ZV9naWNyZWcoMCwgSUNDX1NSRV9FTDEpOwotCQlpc2IoKTsKLQl9Ci0KLQl2YWwgPSByZWFkX2dpY3JlZyhJQ0hfVlRSX0VMMik7Ci0JbWF4X2xyX2lkeCA9IHZ0cl90b19tYXhfbHJfaWR4KHZhbCk7Ci0JbnJfcHJpX2JpdHMgPSB2dHJfdG9fbnJfcHJpX2JpdHModmFsKTsKLQotCWZvciAoaSA9IDA7IGkgPD0gbWF4X2xyX2lkeDsgaSsrKSB7Ci0JCWlmIChjcHVfaWYtPnZnaWNfbHJbaV0gJiBJQ0hfTFJfU1RBVEUpCi0JCQlsaXZlX2xycyB8PSAoMSA8PCBpKTsKLQl9Ci0KLQl3cml0ZV9naWNyZWcoY3B1X2lmLT52Z2ljX3ZtY3IsIElDSF9WTUNSX0VMMik7Ci0KLQlpZiAobGl2ZV9scnMpIHsKLQkJd3JpdGVfZ2ljcmVnKGNwdV9pZi0+dmdpY19oY3IsIElDSF9IQ1JfRUwyKTsKLQotCQlzd2l0Y2ggKG5yX3ByaV9iaXRzKSB7Ci0JCWNhc2UgNzoKLQkJCXdyaXRlX2dpY3JlZyhjcHVfaWYtPnZnaWNfYXAwclszXSwgSUNIX0FQMFIzX0VMMik7Ci0JCQl3cml0ZV9naWNyZWcoY3B1X2lmLT52Z2ljX2FwMHJbMl0sIElDSF9BUDBSMl9FTDIpOwotCQljYXNlIDY6Ci0JCQl3cml0ZV9naWNyZWcoY3B1X2lmLT52Z2ljX2FwMHJbMV0sIElDSF9BUDBSMV9FTDIpOwotCQlkZWZhdWx0OgotCQkJd3JpdGVfZ2ljcmVnKGNwdV9pZi0+dmdpY19hcDByWzBdLCBJQ0hfQVAwUjBfRUwyKTsKLQkJfQotCi0JCXN3aXRjaCAobnJfcHJpX2JpdHMpIHsKLQkJY2FzZSA3OgotCQkJd3JpdGVfZ2ljcmVnKGNwdV9pZi0+dmdpY19hcDFyWzNdLCBJQ0hfQVAxUjNfRUwyKTsKLQkJCXdyaXRlX2dpY3JlZyhjcHVfaWYtPnZnaWNfYXAxclsyXSwgSUNIX0FQMVIyX0VMMik7Ci0JCWNhc2UgNjoKLQkJCXdyaXRlX2dpY3JlZyhjcHVfaWYtPnZnaWNfYXAxclsxXSwgSUNIX0FQMVIxX0VMMik7Ci0JCWRlZmF1bHQ6Ci0JCQl3cml0ZV9naWNyZWcoY3B1X2lmLT52Z2ljX2FwMXJbMF0sIElDSF9BUDFSMF9FTDIpOwotCQl9Ci0KLQkJZm9yIChpID0gMDsgaSA8PSBtYXhfbHJfaWR4OyBpKyspIHsKLQkJCWlmICghKGxpdmVfbHJzICYgKDEgPDwgaSkpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlfX2dpY192M19zZXRfbHIoY3B1X2lmLT52Z2ljX2xyW2ldLCBpKTsKLQkJfQotCX0KLQotCS8qCi0JICogRW5zdXJlcyB0aGF0IHRoZSBhYm92ZSB3aWxsIGhhdmUgcmVhY2hlZCB0aGUKLQkgKiAocmUpZGlzdHJpYnV0b3JzLiBUaGlzIGVuc3VyZSB0aGUgZ3Vlc3Qgd2lsbCByZWFkIHRoZQotCSAqIGNvcnJlY3QgdmFsdWVzIGZyb20gdGhlIG1lbW9yeS1tYXBwZWQgaW50ZXJmYWNlLgotCSAqLwotCWlmICghY3B1X2lmLT52Z2ljX3NyZSkgewotCQlpc2IoKTsKLQkJZHNiKHN5KTsKLQl9Ci0JdmNwdS0+YXJjaC52Z2ljX2NwdS5saXZlX2xycyA9IGxpdmVfbHJzOwotCi0JLyoKLQkgKiBQcmV2ZW50IHRoZSBndWVzdCBmcm9tIHRvdWNoaW5nIHRoZSBHSUMgc3lzdGVtIHJlZ2lzdGVycyBpZgotCSAqIFNSRSBpc24ndCBlbmFibGVkIGZvciBHSUN2MyBlbXVsYXRpb24uCi0JICovCi0Jd3JpdGVfZ2ljcmVnKHJlYWRfZ2ljcmVnKElDQ19TUkVfRUwyKSAmIH5JQ0NfU1JFX0VMMl9FTkFCTEUsCi0JCSAgICAgSUNDX1NSRV9FTDIpOwotfQotCi12b2lkIF9faHlwX3RleHQgX192Z2ljX3YzX2luaXRfbHJzKHZvaWQpCi17Ci0JaW50IG1heF9scl9pZHggPSB2dHJfdG9fbWF4X2xyX2lkeChyZWFkX2dpY3JlZyhJQ0hfVlRSX0VMMikpOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8PSBtYXhfbHJfaWR4OyBpKyspCi0JCV9fZ2ljX3YzX3NldF9scigwLCBpKTsKLX0KLQotc3RhdGljIHU2NCBfX2h5cF90ZXh0IF9fdmdpY192M19yZWFkX2ljaF92dHJfZWwyKHZvaWQpCi17Ci0JcmV0dXJuIHJlYWRfZ2ljcmVnKElDSF9WVFJfRUwyKTsKLX0KLQotX19hbGlhcyhfX3ZnaWNfdjNfcmVhZF9pY2hfdnRyX2VsMikgdTY0IF9fdmdpY192M19nZXRfaWNoX3Z0cl9lbDIodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9pbmplY3RfZmF1bHQuYyBiL2FyY2gvYXJtNjQva3ZtL2luamVjdF9mYXVsdC5jCmluZGV4IDg5OGMwZTYuLmRhNmE4Y2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva3ZtL2luamVjdF9mYXVsdC5jCisrKyBiL2FyY2gvYXJtNjQva3ZtL2luamVjdF9mYXVsdC5jCkBAIC0yMzEsMyArMjMxLDE1IEBACiAJZWxzZQogCQlpbmplY3RfdW5kZWY2NCh2Y3B1KTsKIH0KKworLyoqCisgKiBrdm1faW5qZWN0X3ZhYnQgLSBpbmplY3QgYW4gYXN5bmMgYWJvcnQgLyBTRXJyb3IgaW50byB0aGUgZ3Vlc3QKKyAqIEB2Y3B1OiBUaGUgVkNQVSB0byByZWNlaXZlIHRoZSBleGNlcHRpb24KKyAqCisgKiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhpcyBjb2RlIGlzIGNhbGxlZCBmcm9tIHRoZSBWQ1BVIHRocmVhZCBhbmQgdGhhdCB0aGUKKyAqIFZDUFUgdGhlcmVmb3JlIGlzIG5vdCBjdXJyZW50bHkgZXhlY3V0aW5nIGd1ZXN0IGNvZGUuCisgKi8KK3ZvaWQga3ZtX2luamVjdF92YWJ0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl2Y3B1X3NldF9oY3IodmNwdSwgdmNwdV9nZXRfaGNyKHZjcHUpIHwgSENSX1ZTRSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9zeXNfcmVncy5jIGIvYXJjaC9hcm02NC9rdm0vc3lzX3JlZ3MuYwppbmRleCBiMGIyMjVjLi5mMzAyZmRiIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2t2bS9zeXNfcmVncy5jCisrKyBiL2FyY2gvYXJtNjQva3ZtL3N5c19yZWdzLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxhc20va3ZtX2hvc3QuaD4KICNpbmNsdWRlIDxhc20va3ZtX21tdS5oPgogI2luY2x1ZGUgPGFzbS9wZXJmX2V2ZW50Lmg+CisjaW5jbHVkZSA8YXNtL3N5c3JlZy5oPgogCiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2t2bS5oPgogCkBAIC02NywxMSArNjgsOSBAQAogCiAJLyogTWFrZSBzdXJlIG5vb25lIGVsc2UgY2hhbmdlcyBDU1NFTFIgZHVyaW5nIHRoaXMhICovCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQkvKiBQdXQgdmFsdWUgaW50byBDU1NFTFIgKi8KLQlhc20gdm9sYXRpbGUoIm1zciBjc3NlbHJfZWwxLCAleDAiIDogOiAiciIgKGNzc2VscikpOworCXdyaXRlX3N5c3JlZyhjc3NlbHIsIGNzc2Vscl9lbDEpOwogCWlzYigpOwotCS8qIFJlYWQgcmVzdWx0IG91dCBvZiBDQ1NJRFIgKi8KLQlhc20gdm9sYXRpbGUoIm1ycyAlMCwgY2NzaWRyX2VsMSIgOiAiPXIiIChjY3NpZHIpKTsKKwljY3NpZHIgPSByZWFkX3N5c3JlZyhjY3NpZHJfZWwxKTsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKIAlyZXR1cm4gY2NzaWRyOwpAQCAtMTc0LDkgKzE3Myw3IEBACiAJaWYgKHAtPmlzX3dyaXRlKSB7CiAJCXJldHVybiBpZ25vcmVfd3JpdGUodmNwdSwgcCk7CiAJfSBlbHNlIHsKLQkJdTMyIHZhbDsKLQkJYXNtIHZvbGF0aWxlKCJtcnMgJTAsIGRiZ2F1dGhzdGF0dXNfZWwxIiA6ICI9ciIgKHZhbCkpOwotCQlwLT5yZWd2YWwgPSB2YWw7CisJCXAtPnJlZ3ZhbCA9IHJlYWRfc3lzcmVnKGRiZ2F1dGhzdGF0dXNfZWwxKTsKIAkJcmV0dXJuIHRydWU7CiAJfQogfQpAQCAtNDI5LDEwICs0MjYsNyBAQAogCiBzdGF0aWMgdm9pZCByZXNldF9hbWFpcl9lbDEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBjb25zdCBzdHJ1Y3Qgc3lzX3JlZ19kZXNjICpyKQogewotCXU2NCBhbWFpcjsKLQotCWFzbSB2b2xhdGlsZSgibXJzICUwLCBhbWFpcl9lbDFcbiIgOiAiPXIiIChhbWFpcikpOwotCXZjcHVfc3lzX3JlZyh2Y3B1LCBBTUFJUl9FTDEpID0gYW1haXI7CisJdmNwdV9zeXNfcmVnKHZjcHUsIEFNQUlSX0VMMSkgPSByZWFkX3N5c3JlZyhhbWFpcl9lbDEpOwogfQogCiBzdGF0aWMgdm9pZCByZXNldF9tcGlkcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGNvbnN0IHN0cnVjdCBzeXNfcmVnX2Rlc2MgKnIpCkBAIC00NTYsOCArNDUwLDkgQEAKIHsKIAl1NjQgcG1jciwgdmFsOwogCi0JYXNtIHZvbGF0aWxlKCJtcnMgJTAsIHBtY3JfZWwwXG4iIDogIj1yIiAocG1jcikpOwotCS8qIFdyaXRhYmxlIGJpdHMgb2YgUE1DUl9FTDAgKEFSTVY4X1BNVV9QTUNSX01BU0spIGlzIHJlc2V0IHRvIFVOS05PV04KKwlwbWNyID0gcmVhZF9zeXNyZWcocG1jcl9lbDApOworCS8qCisJICogV3JpdGFibGUgYml0cyBvZiBQTUNSX0VMMCAoQVJNVjhfUE1VX1BNQ1JfTUFTSykgYXJlIHJlc2V0IHRvIFVOS05PV04KIAkgKiBleGNlcHQgUE1DUi5FIHJlc2V0dGluZyB0byB6ZXJvLgogCSAqLwogCXZhbCA9ICgocG1jciAmIH5BUk1WOF9QTVVfUE1DUl9NQVNLKQpAQCAtNTU3LDkgKzU1Miw5IEBACiAJCXJldHVybiBmYWxzZTsKIAogCWlmICghKHAtPk9wMiAmIDEpKQotCQlhc20gdm9sYXRpbGUoIm1ycyAlMCwgcG1jZWlkMF9lbDBcbiIgOiAiPXIiIChwbWNlaWQpKTsKKwkJcG1jZWlkID0gcmVhZF9zeXNyZWcocG1jZWlkMF9lbDApOwogCWVsc2UKLQkJYXNtIHZvbGF0aWxlKCJtcnMgJTAsIHBtY2VpZDFfZWwwXG4iIDogIj1yIiAocG1jZWlkKSk7CisJCXBtY2VpZCA9IHJlYWRfc3lzcmVnKHBtY2VpZDFfZWwwKTsKIAogCXAtPnJlZ3ZhbCA9IHBtY2VpZDsKIApAQCAtODIzLDE0ICs4MTgsNiBAQAogICogQXJjaGl0ZWN0ZWQgc3lzdGVtIHJlZ2lzdGVycy4KICAqIEltcG9ydGFudDogTXVzdCBiZSBzb3J0ZWQgYXNjZW5kaW5nIGJ5IE9wMCwgT3AxLCBDUm4sIENSbSwgT3AyCiAgKgotICogV2UgY291bGQgdHJhcCBJRF9ERlIwIGFuZCB0ZWxsIHRoZSBndWVzdCB3ZSBkb24ndCBzdXBwb3J0IHBlcmZvcm1hbmNlCi0gKiBtb25pdG9yaW5nLiAgVW5mb3J0dW5hdGVseSB0aGUgcGF0Y2ggdG8gbWFrZSB0aGUga2VybmVsIGNoZWNrIElEX0RGUjAgd2FzCi0gKiBOQUtlZCwgc28gaXQgd2lsbCByZWFkIHRoZSBQTUNSIGFueXdheS4KLSAqCi0gKiBUaGVyZWZvcmUgd2UgdGVsbCB0aGUgZ3Vlc3Qgd2UgaGF2ZSAwIGNvdW50ZXJzLiAgVW5mb3J0dW5hdGVseSwgd2UKLSAqIG11c3QgYWx3YXlzIHN1cHBvcnQgUE1DQ05UUiAodGhlIGN5Y2xlIGNvdW50ZXIpOiB3ZSBqdXN0IFJBWi9XSSBmb3IKLSAqIGFsbCBQTSByZWdpc3RlcnMsIHdoaWNoIGRvZXNuJ3QgY3Jhc2ggdGhlIGd1ZXN0IGtlcm5lbCBhdCBsZWFzdC4KLSAqCiAgKiBEZWJ1ZyBoYW5kbGluZzogV2UgZG8gdHJhcCBtb3N0LCBpZiBub3QgYWxsIGRlYnVnIHJlbGF0ZWQgc3lzdGVtCiAgKiByZWdpc3RlcnMuIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBnb29kIGVub3VnaCB0byBlbnN1cmUgdGhhdCBhIGd1ZXN0CiAgKiBjYW4gdXNlIHRoZXNlIHdpdGggbWluaW1hbCBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvbi4gVGhlIGRyYXdiYWNrIGlzCkBAIC0xMzYwLDcgKzEzNDcsNyBAQAogCXsgT3AxKCAwKSwgQ1JuKDEwKSwgQ1JtKCAzKSwgT3AyKCAxKSwgYWNjZXNzX3ZtX3JlZywgTlVMTCwgYzEwX0FNQUlSMSB9LAogCiAJLyogSUNDX1NSRSAqLwotCXsgT3AxKCAwKSwgQ1JuKDEyKSwgQ1JtKDEyKSwgT3AyKCA1KSwgdHJhcF9yYXpfd2kgfSwKKwl7IE9wMSggMCksIENSbigxMiksIENSbSgxMiksIE9wMiggNSksIGFjY2Vzc19naWNfc3JlIH0sCiAKIAl7IE9wMSggMCksIENSbigxMyksIENSbSggMCksIE9wMiggMSksIGFjY2Vzc192bV9yZWcsIE5VTEwsIGMxM19DSUQgfSwKIApAQCAtMTg0MSwxMSArMTgyOCw3IEBACiAJc3RhdGljIHZvaWQgZ2V0XyMjcmVnKHN0cnVjdCBrdm1fdmNwdSAqdiwJCQlcCiAJCQkgICAgICBjb25zdCBzdHJ1Y3Qgc3lzX3JlZ19kZXNjICpyKQkJXAogCXsJCQkJCQkJCVwKLQkJdTY0IHZhbDsJCQkJCQlcCi0JCQkJCQkJCQlcCi0JCWFzbSB2b2xhdGlsZSgibXJzICUwLCAiIF9fc3RyaW5naWZ5KHJlZykgIlxuIgkJXAotCQkJICAgICA6ICI9ciIgKHZhbCkpOwkJCQlcCi0JCSgoc3RydWN0IHN5c19yZWdfZGVzYyAqKXIpLT52YWwgPSB2YWw7CQkJXAorCQkoKHN0cnVjdCBzeXNfcmVnX2Rlc2MgKilyKS0+dmFsID0gcmVhZF9zeXNyZWcocmVnKTsJXAogCX0KIAogRlVOQ1RJT05fSU5WQVJJQU5UKG1pZHJfZWwxKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vc3lzX3JlZ3NfZ2VuZXJpY192OC5jIGIvYXJjaC9hcm02NC9rdm0vc3lzX3JlZ3NfZ2VuZXJpY192OC5jCmluZGV4IGVkOTA1NzguLjQ2YWY3MTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva3ZtL3N5c19yZWdzX2dlbmVyaWNfdjguYworKysgYi9hcmNoL2FybTY0L2t2bS9zeXNfcmVnc19nZW5lcmljX3Y4LmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxhc20va3ZtX2hvc3QuaD4KICNpbmNsdWRlIDxhc20va3ZtX2VtdWxhdGUuaD4KICNpbmNsdWRlIDxhc20va3ZtX2NvcHJvYy5oPgorI2luY2x1ZGUgPGFzbS9zeXNyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKICNpbmNsdWRlICJzeXNfcmVncy5oIgpAQCAtNDMsMTAgKzQ0LDcgQEAKIAogc3RhdGljIHZvaWQgcmVzZXRfYWN0bHIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBjb25zdCBzdHJ1Y3Qgc3lzX3JlZ19kZXNjICpyKQogewotCXU2NCBhY3RscjsKLQotCWFzbSB2b2xhdGlsZSgibXJzICUwLCBhY3Rscl9lbDFcbiIgOiAiPXIiIChhY3RscikpOwotCXZjcHVfc3lzX3JlZyh2Y3B1LCBBQ1RMUl9FTDEpID0gYWN0bHI7CisJdmNwdV9zeXNfcmVnKHZjcHUsIEFDVExSX0VMMSkgPSByZWFkX3N5c3JlZyhhY3Rscl9lbDEpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9saWIvY29weV9wYWdlLlMgYi9hcmNoL2FybTY0L2xpYi9jb3B5X3BhZ2UuUwppbmRleCA0YzFlNzAwLi5jM2NkNjVlIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2xpYi9jb3B5X3BhZ2UuUworKysgYi9hcmNoL2FybTY0L2xpYi9jb3B5X3BhZ2UuUwpAQCAtMjksMTQgKzI5LDExIEBACiAgKgl4MSAtIHNyYwogICovCiBFTlRSWShjb3B5X3BhZ2UpCi1hbHRlcm5hdGl2ZV9pZl9ub3QgQVJNNjRfSEFTX05PX0hXX1BSRUZFVENICi0Jbm9wCi0Jbm9wCi1hbHRlcm5hdGl2ZV9lbHNlCithbHRlcm5hdGl2ZV9pZiBBUk02NF9IQVNfTk9fSFdfUFJFRkVUQ0gKIAkjIFByZWZldGNoIHR3byBjYWNoZSBsaW5lcyBhaGVhZC4KIAlwcmZtICAgIHBsZGwxc3RybSwgW3gxLCAjMTI4XQogCXByZm0gICAgcGxkbDFzdHJtLCBbeDEsICMyNTZdCi1hbHRlcm5hdGl2ZV9lbmRpZgorYWx0ZXJuYXRpdmVfZWxzZV9ub3BfZW5kaWYKIAogCWxkcAl4MiwgeDMsIFt4MV0KIAlsZHAJeDQsIHg1LCBbeDEsICMxNl0KQEAgLTUyLDExICs0OSw5IEBACiAxOgogCXN1YnMJeDE4LCB4MTgsICMxMjgKIAotYWx0ZXJuYXRpdmVfaWZfbm90IEFSTTY0X0hBU19OT19IV19QUkVGRVRDSAotCW5vcAotYWx0ZXJuYXRpdmVfZWxzZQorYWx0ZXJuYXRpdmVfaWYgQVJNNjRfSEFTX05PX0hXX1BSRUZFVENICiAJcHJmbSAgICBwbGRsMXN0cm0sIFt4MSwgIzM4NF0KLWFsdGVybmF0aXZlX2VuZGlmCithbHRlcm5hdGl2ZV9lbHNlX25vcF9lbmRpZgogCiAJc3RucAl4MiwgeDMsIFt4MF0KIAlsZHAJeDIsIHgzLCBbeDFdCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L21tL2NhY2hlLlMgYi9hcmNoL2FybTY0L21tL2NhY2hlLlMKaW5kZXggMDdkNzM1Mi4uNThiNWE5MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9tbS9jYWNoZS5TCisrKyBiL2FyY2gvYXJtNjQvbW0vY2FjaGUuUwpAQCAtMTA1LDE5ICsxMDUsMjAgQEAKIEVORFBST0MoX19jbGVhbl9kY2FjaGVfYXJlYV9wb3UpCiAKIC8qCisgKglfX2RtYV9pbnZfYXJlYShzdGFydCwgc2l6ZSkKKyAqCS0gc3RhcnQgICAtIHZpcnR1YWwgc3RhcnQgYWRkcmVzcyBvZiByZWdpb24KKyAqCS0gc2l6ZSAgICAtIHNpemUgaW4gcXVlc3Rpb24KKyAqLworX19kbWFfaW52X2FyZWE6CisJYWRkCXgxLCB4MSwgeDAKKwkvKiBGQUxMVEhST1VHSCAqLworCisvKgogICoJX19pbnZhbF9jYWNoZV9yYW5nZShzdGFydCwgZW5kKQogICoJLSBzdGFydCAgIC0gc3RhcnQgYWRkcmVzcyBvZiByZWdpb24KICAqCS0gZW5kICAgICAtIGVuZCBhZGRyZXNzIG9mIHJlZ2lvbgogICovCiBFTlRSWShfX2ludmFsX2NhY2hlX3JhbmdlKQotCS8qIEZBTExUSFJPVUdIICovCi0KLS8qCi0gKglfX2RtYV9pbnZfcmFuZ2Uoc3RhcnQsIGVuZCkKLSAqCS0gc3RhcnQgICAtIHZpcnR1YWwgc3RhcnQgYWRkcmVzcyBvZiByZWdpb24KLSAqCS0gZW5kICAgICAtIHZpcnR1YWwgZW5kIGFkZHJlc3Mgb2YgcmVnaW9uCi0gKi8KLV9fZG1hX2ludl9yYW5nZToKIAlkY2FjaGVfbGluZV9zaXplIHgyLCB4MwogCXN1Ygl4MywgeDIsICMxCiAJdHN0CXgxLCB4MwkJCQkvLyBlbmQgY2FjaGUgbGluZSBhbGlnbmVkPwpAQCAtMTM2LDQ2ICsxMzcsNDMgQEAKIAlkc2IJc3kKIAlyZXQKIEVORFBJUFJPQyhfX2ludmFsX2NhY2hlX3JhbmdlKQotRU5EUFJPQyhfX2RtYV9pbnZfcmFuZ2UpCitFTkRQUk9DKF9fZG1hX2ludl9hcmVhKQogCiAvKgotICoJX19kbWFfY2xlYW5fcmFuZ2Uoc3RhcnQsIGVuZCkKLSAqCS0gc3RhcnQgICAtIHZpcnR1YWwgc3RhcnQgYWRkcmVzcyBvZiByZWdpb24KLSAqCS0gZW5kICAgICAtIHZpcnR1YWwgZW5kIGFkZHJlc3Mgb2YgcmVnaW9uCisgKglfX2NsZWFuX2RjYWNoZV9hcmVhX3BvYyhrYWRkciwgc2l6ZSkKKyAqCisgKiAJRW5zdXJlIHRoYXQgYW55IEQtY2FjaGUgbGluZXMgZm9yIHRoZSBpbnRlcnZhbCBba2FkZHIsIGthZGRyK3NpemUpCisgKiAJYXJlIGNsZWFuZWQgdG8gdGhlIFBvQy4KKyAqCisgKgktIGthZGRyICAgLSBrZXJuZWwgYWRkcmVzcworICoJLSBzaXplICAgIC0gc2l6ZSBpbiBxdWVzdGlvbgogICovCi1fX2RtYV9jbGVhbl9yYW5nZToKLQlkY2FjaGVfbGluZV9zaXplIHgyLCB4MwotCXN1Ygl4MywgeDIsICMxCi0JYmljCXgwLCB4MCwgeDMKLTE6Ci1hbHRlcm5hdGl2ZV9pZl9ub3QgQVJNNjRfV09SS0FST1VORF9DTEVBTl9DQUNIRQotCWRjCWN2YWMsIHgwCi1hbHRlcm5hdGl2ZV9lbHNlCi0JZGMJY2l2YWMsIHgwCi1hbHRlcm5hdGl2ZV9lbmRpZgotCWFkZAl4MCwgeDAsIHgyCi0JY21wCXgwLCB4MQotCWIubG8JMWIKLQlkc2IJc3kKLQlyZXQKLUVORFBST0MoX19kbWFfY2xlYW5fcmFuZ2UpCitFTlRSWShfX2NsZWFuX2RjYWNoZV9hcmVhX3BvYykKKwkvKiBGQUxMVEhST1VHSCAqLwogCiAvKgotICoJX19kbWFfZmx1c2hfcmFuZ2Uoc3RhcnQsIGVuZCkKKyAqCV9fZG1hX2NsZWFuX2FyZWEoc3RhcnQsIHNpemUpCiAgKgktIHN0YXJ0ICAgLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3Mgb2YgcmVnaW9uCi0gKgktIGVuZCAgICAgLSB2aXJ0dWFsIGVuZCBhZGRyZXNzIG9mIHJlZ2lvbgorICoJLSBzaXplICAgIC0gc2l6ZSBpbiBxdWVzdGlvbgogICovCi1FTlRSWShfX2RtYV9mbHVzaF9yYW5nZSkKLQlkY2FjaGVfbGluZV9zaXplIHgyLCB4MwotCXN1Ygl4MywgeDIsICMxCi0JYmljCXgwLCB4MCwgeDMKLTE6CWRjCWNpdmFjLCB4MAkJCS8vIGNsZWFuICYgaW52YWxpZGF0ZSBEIC8gVSBsaW5lCi0JYWRkCXgwLCB4MCwgeDIKLQljbXAJeDAsIHgxCi0JYi5sbwkxYgotCWRzYglzeQorX19kbWFfY2xlYW5fYXJlYToKKwlkY2FjaGVfYnlfbGluZV9vcCBjdmFjLCBzeSwgeDAsIHgxLCB4MiwgeDMKIAlyZXQKLUVORFBJUFJPQyhfX2RtYV9mbHVzaF9yYW5nZSkKK0VORFBJUFJPQyhfX2NsZWFuX2RjYWNoZV9hcmVhX3BvYykKK0VORFBST0MoX19kbWFfY2xlYW5fYXJlYSkKKworLyoKKyAqCV9fZG1hX2ZsdXNoX2FyZWEoc3RhcnQsIHNpemUpCisgKgorICoJY2xlYW4gJiBpbnZhbGlkYXRlIEQgLyBVIGxpbmUKKyAqCisgKgktIHN0YXJ0ICAgLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3Mgb2YgcmVnaW9uCisgKgktIHNpemUgICAgLSBzaXplIGluIHF1ZXN0aW9uCisgKi8KK0VOVFJZKF9fZG1hX2ZsdXNoX2FyZWEpCisJZGNhY2hlX2J5X2xpbmVfb3AgY2l2YWMsIHN5LCB4MCwgeDEsIHgyLCB4MworCXJldAorRU5EUElQUk9DKF9fZG1hX2ZsdXNoX2FyZWEpCiAKIC8qCiAgKglfX2RtYV9tYXBfYXJlYShzdGFydCwgc2l6ZSwgZGlyKQpAQCAtMTg0LDEwICsxODIsOSBAQAogICoJLSBkaXIJLSBETUEgZGlyZWN0aW9uCiAgKi8KIEVOVFJZKF9fZG1hX21hcF9hcmVhKQotCWFkZAl4MSwgeDEsIHgwCiAJY21wCXcyLCAjRE1BX0ZST01fREVWSUNFCi0JYi5lcQlfX2RtYV9pbnZfcmFuZ2UKLQliCV9fZG1hX2NsZWFuX3JhbmdlCisJYi5lcQlfX2RtYV9pbnZfYXJlYQorCWIJX19kbWFfY2xlYW5fYXJlYQogRU5EUElQUk9DKF9fZG1hX21hcF9hcmVhKQogCiAvKgpAQCAtMTk3LDggKzE5NCw3IEBACiAgKgktIGRpcgktIERNQSBkaXJlY3Rpb24KICAqLwogRU5UUlkoX19kbWFfdW5tYXBfYXJlYSkKLQlhZGQJeDEsIHgxLCB4MAogCWNtcAl3MiwgI0RNQV9UT19ERVZJQ0UKLQliLm5lCV9fZG1hX2ludl9yYW5nZQorCWIubmUJX19kbWFfaW52X2FyZWEKIAlyZXQKIEVORFBJUFJPQyhfX2RtYV91bm1hcF9hcmVhKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9tbS9kbWEtbWFwcGluZy5jIGIvYXJjaC9hcm02NC9tbS9kbWEtbWFwcGluZy5jCmluZGV4IGM0Mjg0YzQuLmJkYWNlYWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvbW0vZG1hLW1hcHBpbmcuYworKysgYi9hcmNoL2FybTY0L21tL2RtYS1tYXBwaW5nLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2dlbmFsbG9jLmg+CkBAIC0zMCw3ICszMSw3IEBACiAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogCi1zdGF0aWMgaW50IHN3aW90bGIgX19yZWFkX21vc3RseTsKK3N0YXRpYyBpbnQgc3dpb3RsYiBfX3JvX2FmdGVyX2luaXQ7CiAKIHN0YXRpYyBwZ3Byb3RfdCBfX2dldF9kbWFfcGdwcm90KHVuc2lnbmVkIGxvbmcgYXR0cnMsIHBncHJvdF90IHByb3QsCiAJCQkJIGJvb2wgY29oZXJlbnQpCkBAIC0xNjgsNyArMTY5LDcgQEAKIAkJcmV0dXJuIHB0cjsKIAogCS8qIHJlbW92ZSBhbnkgZGlydHkgY2FjaGUgbGluZXMgb24gdGhlIGtlcm5lbCBhbGlhcyAqLwotCV9fZG1hX2ZsdXNoX3JhbmdlKHB0ciwgcHRyICsgc2l6ZSk7CisJX19kbWFfZmx1c2hfYXJlYShwdHIsIHNpemUpOwogCiAJLyogY3JlYXRlIGEgY29oZXJlbnQgbWFwcGluZyAqLwogCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UocHRyKTsKQEAgLTM4Nyw3ICszODgsNyBAQAogCQl2b2lkICpwYWdlX2FkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CiAKIAkJbWVtc2V0KHBhZ2VfYWRkciwgMCwgYXRvbWljX3Bvb2xfc2l6ZSk7Ci0JCV9fZG1hX2ZsdXNoX3JhbmdlKHBhZ2VfYWRkciwgcGFnZV9hZGRyICsgYXRvbWljX3Bvb2xfc2l6ZSk7CisJCV9fZG1hX2ZsdXNoX2FyZWEocGFnZV9hZGRyLCBhdG9taWNfcG9vbF9zaXplKTsKIAogCQlhdG9taWNfcG9vbCA9IGdlbl9wb29sX2NyZWF0ZShQQUdFX1NISUZULCAtMSk7CiAJCWlmICghYXRvbWljX3Bvb2wpCkBAIC01NDgsNyArNTQ5LDcgQEAKIC8qIFRoYW5rZnVsbHksIGFsbCBjYWNoZSBvcHMgYXJlIGJ5IFZBIHNvIHdlIGNhbiBpZ25vcmUgcGh5cyBoZXJlICovCiBzdGF0aWMgdm9pZCBmbHVzaF9wYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3Qgdm9pZCAqdmlydCwgcGh5c19hZGRyX3QgcGh5cykKIHsKLQlfX2RtYV9mbHVzaF9yYW5nZSh2aXJ0LCB2aXJ0ICsgUEFHRV9TSVpFKTsKKwlfX2RtYV9mbHVzaF9hcmVhKHZpcnQsIFBBR0VfU0laRSk7CiB9CiAKIHN0YXRpYyB2b2lkICpfX2lvbW11X2FsbG9jX2F0dHJzKHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L21tL2R1bXAuYyBiL2FyY2gvYXJtNjQvbW0vZHVtcC5jCmluZGV4IGY5NGI4MGUuLjljM2U3NWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvbW0vZHVtcC5jCisrKyBiL2FyY2gvYXJtNjQvbW0vZHVtcC5jCkBAIC0yNDIsNyArMjQyLDcgQEAKIAogc3RhdGljIHZvaWQgd2Fsa19wdGUoc3RydWN0IHBnX3N0YXRlICpzdCwgcG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBzdGFydCkKIHsKLQlwdGVfdCAqcHRlID0gcHRlX29mZnNldF9rZXJuZWwocG1kLCAwKTsKKwlwdGVfdCAqcHRlID0gcHRlX29mZnNldF9rZXJuZWwocG1kLCAwVUwpOwogCXVuc2lnbmVkIGxvbmcgYWRkcjsKIAl1bnNpZ25lZCBpOwogCkBAIC0yNTQsNyArMjU0LDcgQEAKIAogc3RhdGljIHZvaWQgd2Fsa19wbWQoc3RydWN0IHBnX3N0YXRlICpzdCwgcHVkX3QgKnB1ZCwgdW5zaWduZWQgbG9uZyBzdGFydCkKIHsKLQlwbWRfdCAqcG1kID0gcG1kX29mZnNldChwdWQsIDApOworCXBtZF90ICpwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgMFVMKTsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CiAJdW5zaWduZWQgaTsKIApAQCAtMjcxLDcgKzI3MSw3IEBACiAKIHN0YXRpYyB2b2lkIHdhbGtfcHVkKHN0cnVjdCBwZ19zdGF0ZSAqc3QsIHBnZF90ICpwZ2QsIHVuc2lnbmVkIGxvbmcgc3RhcnQpCiB7Ci0JcHVkX3QgKnB1ZCA9IHB1ZF9vZmZzZXQocGdkLCAwKTsKKwlwdWRfdCAqcHVkID0gcHVkX29mZnNldChwZ2QsIDBVTCk7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwogCXVuc2lnbmVkIGk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbW0vZXh0YWJsZS5jIGIvYXJjaC9hcm02NC9tbS9leHRhYmxlLmMKaW5kZXggODFhY2Q0Ny4uYzlmMTE4YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9tbS9leHRhYmxlLmMKKysrIGIvYXJjaC9hcm02NC9tbS9leHRhYmxlLmMKQEAgLTIsNyArMiw3IEBACiAgKiBCYXNlZCBvbiBhcmNoL2FybS9tbS9leHRhYmxlLmMKICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXh0YWJsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAogaW50IGZpeHVwX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbW0vZmF1bHQuYyBiL2FyY2gvYXJtNjQvbW0vZmF1bHQuYwppbmRleCAwNWQyYmQ3Li41M2Q5MTU5IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L21tL2ZhdWx0LmMKKysrIGIvYXJjaC9hcm02NC9tbS9mYXVsdC5jCkBAIC0xOCw3ICsxOCw3IEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXh0YWJsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgpAQCAtMjUxLDggKzI1MSw3IEBACiBnb29kX2FyZWE6CiAJLyoKIAkgKiBDaGVjayB0aGF0IHRoZSBwZXJtaXNzaW9ucyBvbiB0aGUgVk1BIGFsbG93IGZvciB0aGUgZmF1bHQgd2hpY2gKLQkgKiBvY2N1cnJlZC4gSWYgd2UgZW5jb3VudGVyZWQgYSB3cml0ZSBvciBleGVjIGZhdWx0LCB3ZSBtdXN0IGhhdmUKLQkgKiBhcHByb3ByaWF0ZSBwZXJtaXNzaW9ucywgb3RoZXJ3aXNlIHdlIGFsbG93IGFueSBwZXJtaXNzaW9uLgorCSAqIG9jY3VycmVkLgogCSAqLwogCWlmICghKHZtYS0+dm1fZmxhZ3MgJiB2bV9mbGFncykpIHsKIAkJZmF1bHQgPSBWTV9GQVVMVF9CQURBQ0NFU1M7CkBAIC0yODgsNyArMjg3LDcgQEAKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKIAlpbnQgZmF1bHQsIHNpZywgY29kZTsKLQl1bnNpZ25lZCBsb25nIHZtX2ZsYWdzID0gVk1fUkVBRCB8IFZNX1dSSVRFIHwgVk1fRVhFQzsKKwl1bnNpZ25lZCBsb25nIHZtX2ZsYWdzID0gVk1fUkVBRCB8IFZNX1dSSVRFOwogCXVuc2lnbmVkIGludCBtbV9mbGFncyA9IEZBVUxUX0ZMQUdfQUxMT1dfUkVUUlkgfCBGQVVMVF9GTEFHX0tJTExBQkxFOwogCiAJaWYgKG5vdGlmeV9wYWdlX2ZhdWx0KHJlZ3MsIGVzcikpCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L21tL2ZsdXNoLmMgYi9hcmNoL2FybTY0L21tL2ZsdXNoLmMKaW5kZXggNDNhNzZiMC4uODM3NzMyOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9tbS9mbHVzaC5jCisrKyBiL2FyY2gvYXJtNjQvbW0vZmx1c2guYwpAQCAtMjUsOCArMjUsNiBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZXR5cGUuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KIAotI2luY2x1ZGUgIm1tLmgiCi0KIHZvaWQgZmx1c2hfY2FjaGVfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsCiAJCSAgICAgICB1bnNpZ25lZCBsb25nIGVuZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbW0vaW5pdC5jIGIvYXJjaC9hcm02NC9tbS9pbml0LmMKaW5kZXggYmJiN2VlNy4uMjFjNDg5YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9tbS9pbml0LmMKKysrIGIvYXJjaC9hcm02NC9tbS9pbml0LmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KICNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgpAQCAtMzQsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1jb250aWd1b3VzLmg+CiAjaW5jbHVkZSA8bGludXgvZWZpLmg+CiAjaW5jbHVkZSA8bGludXgvc3dpb3RsYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KIAogI2luY2x1ZGUgPGFzbS9ib290Lmg+CiAjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgpAQCAtNDcsMTYgKzQ5LDE0IEBACiAjaW5jbHVkZSA8YXNtL3RsYi5oPgogI2luY2x1ZGUgPGFzbS9hbHRlcm5hdGl2ZS5oPgogCi0jaW5jbHVkZSAibW0uaCIKLQogLyoKICAqIFdlIG5lZWQgdG8gYmUgYWJsZSB0byBjYXRjaCBpbmFkdmVydGVudCByZWZlcmVuY2VzIHRvIG1lbXN0YXJ0X2FkZHIKICAqIHRoYXQgb2NjdXIgKHBvdGVudGlhbGx5IGluIGdlbmVyaWMgY29kZSkgYmVmb3JlIGFybTY0X21lbWJsb2NrX2luaXQoKQogICogZXhlY3V0ZXMsIHdoaWNoIGFzc2lnbnMgaXQgaXRzIGFjdHVhbCB2YWx1ZS4gU28gdXNlIGEgZGVmYXVsdCB2YWx1ZQogICogdGhhdCBjYW5ub3QgYmUgbWlzdGFrZW4gZm9yIGEgcmVhbCBwaHlzaWNhbCBhZGRyZXNzLgogICovCi1zNjQgbWVtc3RhcnRfYWRkciBfX3JlYWRfbW9zdGx5ID0gLTE7Ci1waHlzX2FkZHJfdCBhcm02NF9kbWFfcGh5c19saW1pdCBfX3JlYWRfbW9zdGx5OworczY0IG1lbXN0YXJ0X2FkZHIgX19yb19hZnRlcl9pbml0ID0gLTE7CitwaHlzX2FkZHJfdCBhcm02NF9kbWFfcGh5c19saW1pdCBfX3JvX2FmdGVyX2luaXQ7CiAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKIHN0YXRpYyBpbnQgX19pbml0IGVhcmx5X2luaXRyZChjaGFyICpwKQpAQCAtNDg1LDcgKzQ4NSwxMiBAQAogewogCWZyZWVfcmVzZXJ2ZWRfYXJlYShfX3ZhKF9fcGEoX19pbml0X2JlZ2luKSksIF9fdmEoX19wYShfX2luaXRfZW5kKSksCiAJCQkgICAwLCAidW51c2VkIGtlcm5lbCIpOwotCWZpeHVwX2luaXQoKTsKKwkvKgorCSAqIFVubWFwIHRoZSBfX2luaXQgcmVnaW9uIGJ1dCBsZWF2ZSB0aGUgVk0gYXJlYSBpbiBwbGFjZS4gVGhpcworCSAqIHByZXZlbnRzIHRoZSByZWdpb24gZnJvbSBiZWluZyByZXVzZWQgZm9yIGtlcm5lbCBtb2R1bGVzLCB3aGljaAorCSAqIGlzIG5vdCBzdXBwb3J0ZWQgYnkga2FsbHN5bXMuCisJICovCisJdW5tYXBfa2VybmVsX3JhbmdlKCh1NjQpX19pbml0X2JlZ2luLCAodTY0KShfX2luaXRfZW5kIC0gX19pbml0X2JlZ2luKSk7CiB9CiAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbW0vbW0uaCBiL2FyY2gvYXJtNjQvbW0vbW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFmZTk4OS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybTY0L21tL21tLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLQotdm9pZCBmaXh1cF9pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9tbS9tbXUuYyBiL2FyY2gvYXJtNjQvbW0vbW11LmMKaW5kZXggNDk4OTk0OC4uMDU2MTVhMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9tbS9tbXUuYworKysgYi9hcmNoL2FybTY0L21tL21tdS5jCkBAIC0xNyw2ICsxNyw3IEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgpAQCAtNDIsMTEgKzQzLDkgQEAKICNpbmNsdWRlIDxhc20vbWVtYmxvY2suaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KIAotI2luY2x1ZGUgIm1tLmgiCi0KIHU2NCBpZG1hcF90MHN6ID0gVENSX1QwU1ooVkFfQklUUyk7CiAKLXU2NCBraW1hZ2Vfdm9mZnNldCBfX3JlYWRfbW9zdGx5OwordTY0IGtpbWFnZV92b2Zmc2V0IF9fcm9fYWZ0ZXJfaW5pdDsKIEVYUE9SVF9TWU1CT0woa2ltYWdlX3ZvZmZzZXQpOwogCiAvKgpAQCAtMzk5LDE2ICszOTgsNiBAQAogCQkJICAgIHNlY3Rpb25fc2l6ZSwgUEFHRV9LRVJORUxfUk8pOwogfQogCi12b2lkIGZpeHVwX2luaXQodm9pZCkKLXsKLQkvKgotCSAqIFVubWFwIHRoZSBfX2luaXQgcmVnaW9uIGJ1dCBsZWF2ZSB0aGUgVk0gYXJlYSBpbiBwbGFjZS4gVGhpcwotCSAqIHByZXZlbnRzIHRoZSByZWdpb24gZnJvbSBiZWluZyByZXVzZWQgZm9yIGtlcm5lbCBtb2R1bGVzLCB3aGljaAotCSAqIGlzIG5vdCBzdXBwb3J0ZWQgYnkga2FsbHN5bXMuCi0JICovCi0JdW5tYXBfa2VybmVsX3JhbmdlKCh1NjQpX19pbml0X2JlZ2luLCAodTY0KShfX2luaXRfZW5kIC0gX19pbml0X2JlZ2luKSk7Ci19Ci0KIHN0YXRpYyB2b2lkIF9faW5pdCBtYXBfa2VybmVsX3NlZ21lbnQocGdkX3QgKnBnZCwgdm9pZCAqdmFfc3RhcnQsIHZvaWQgKnZhX2VuZCwKIAkJCQkgICAgICBwZ3Byb3RfdCBwcm90LCBzdHJ1Y3Qgdm1fc3RydWN0ICp2bWEpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L21tL251bWEuYyBiL2FyY2gvYXJtNjQvbW0vbnVtYS5jCmluZGV4IGM3ZmUzZWMuLjc3OGE5ODUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvbW0vbnVtYS5jCisrKyBiL2FyY2gvYXJtNjQvbW0vbnVtYS5jCkBAIC0xNywxMiArMTcsMTcgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgIk5VTUE6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KIAorI2luY2x1ZGUgPGFzbS9hY3BpLmg+CisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CisKIHN0cnVjdCBwZ2xpc3RfZGF0YSAqbm9kZV9kYXRhW01BWF9OVU1OT0RFU10gX19yZWFkX21vc3RseTsKIEVYUE9SVF9TWU1CT0wobm9kZV9kYXRhKTsKIG5vZGVtYXNrX3QgbnVtYV9ub2Rlc19wYXJzZWQgX19pbml0ZGF0YTsKQEAgLTM2LDEwICs0MSw5IEBACiB7CiAJaWYgKCFvcHQpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmICghc3RybmNtcChvcHQsICJvZmYiLCAzKSkgewotCQlwcl9pbmZvKCIlc1xuIiwgIk5VTUEgdHVybmVkIG9mZiIpOworCWlmICghc3RybmNtcChvcHQsICJvZmYiLCAzKSkKIAkJbnVtYV9vZmYgPSB0cnVlOwotCX0KKwogCXJldHVybiAwOwogfQogZWFybHlfcGFyYW0oIm51bWEiLCBudW1hX3BhcnNlX2Vhcmx5X3BhcmFtKTsKQEAgLTkxLDcgKzk1LDYgQEAKICAqLwogc3RhdGljIHZvaWQgX19pbml0IHNldHVwX25vZGVfdG9fY3B1bWFza19tYXAodm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgY3B1OwogCWludCBub2RlOwogCiAJLyogc2V0dXAgbnJfbm9kZV9pZHMgaWYgbm90IGRvbmUgeWV0ICovCkBAIC0xMDQsMTEgKzEwNyw4IEBACiAJCWNwdW1hc2tfY2xlYXIobm9kZV90b19jcHVtYXNrX21hcFtub2RlXSk7CiAJfQogCi0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkKLQkJc2V0X2NwdV9udW1hX25vZGUoY3B1LCBOVU1BX05PX05PREUpOwotCiAJLyogY3B1bWFza19vZl9ub2RlKCkgd2lsbCBub3cgd29yayAqLwotCXByX2RlYnVnKCJOVU1BOiBOb2RlIHRvIGNwdW1hc2sgbWFwIGZvciAlZCBub2Rlc1xuIiwgbnJfbm9kZV9pZHMpOworCXByX2RlYnVnKCJOb2RlIHRvIGNwdW1hc2sgbWFwIGZvciAlZCBub2Rlc1xuIiwgbnJfbm9kZV9pZHMpOwogfQogCiAvKgpAQCAtMTE2LDE4ICsxMTYsNzcgQEAKICAqLwogdm9pZCBudW1hX3N0b3JlX2NwdV9pbmZvKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0JbWFwX2NwdV90b19ub2RlKGNwdSwgbnVtYV9vZmYgPyAwIDogY3B1X3RvX25vZGVfbWFwW2NwdV0pOworCW1hcF9jcHVfdG9fbm9kZShjcHUsIGNwdV90b19ub2RlX21hcFtjcHVdKTsKIH0KIAogdm9pZCBfX2luaXQgZWFybHlfbWFwX2NwdV90b19ub2RlKHVuc2lnbmVkIGludCBjcHUsIGludCBuaWQpCiB7CiAJLyogZmFsbGJhY2sgdG8gbm9kZSAwICovCi0JaWYgKG5pZCA8IDAgfHwgbmlkID49IE1BWF9OVU1OT0RFUykKKwlpZiAobmlkIDwgMCB8fCBuaWQgPj0gTUFYX05VTU5PREVTIHx8IG51bWFfb2ZmKQogCQluaWQgPSAwOwogCiAJY3B1X3RvX25vZGVfbWFwW2NwdV0gPSBuaWQ7CisKKwkvKgorCSAqIFdlIHNob3VsZCBzZXQgdGhlIG51bWEgbm9kZSBvZiBjcHUwIGFzIHNvb24gYXMgcG9zc2libGUsIGJlY2F1c2UgaXQKKwkgKiBoYXMgYWxyZWFkeSBiZWVuIHNldCB1cCBvbmxpbmUgYmVmb3JlLiBjcHVfdG9fbm9kZSgwKSB3aWxsIHNvb24gYmUKKwkgKiBjYWxsZWQuCisJICovCisJaWYgKCFjcHUpCisJCXNldF9jcHVfbnVtYV9ub2RlKGNwdSwgbmlkKTsKIH0KIAorI2lmZGVmIENPTkZJR19IQVZFX1NFVFVQX1BFUl9DUFVfQVJFQQordW5zaWduZWQgbG9uZyBfX3Blcl9jcHVfb2Zmc2V0W05SX0NQVVNdIF9fcmVhZF9tb3N0bHk7CitFWFBPUlRfU1lNQk9MKF9fcGVyX2NwdV9vZmZzZXQpOworCitzdGF0aWMgaW50IF9faW5pdCBlYXJseV9jcHVfdG9fbm9kZShpbnQgY3B1KQoreworCXJldHVybiBjcHVfdG9fbm9kZV9tYXBbY3B1XTsKK30KKworc3RhdGljIGludCBfX2luaXQgcGNwdV9jcHVfZGlzdGFuY2UodW5zaWduZWQgaW50IGZyb20sIHVuc2lnbmVkIGludCB0bykKK3sKKwlyZXR1cm4gbm9kZV9kaXN0YW5jZShmcm9tLCB0byk7Cit9CisKK3N0YXRpYyB2b2lkICogX19pbml0IHBjcHVfZmNfYWxsb2ModW5zaWduZWQgaW50IGNwdSwgc2l6ZV90IHNpemUsCisJCQkJICAgICAgIHNpemVfdCBhbGlnbikKK3sKKwlpbnQgbmlkID0gZWFybHlfY3B1X3RvX25vZGUoY3B1KTsKKworCXJldHVybiAgbWVtYmxvY2tfdmlydF9hbGxvY190cnlfbmlkKHNpemUsIGFsaWduLAorCQkJX19wYShNQVhfRE1BX0FERFJFU1MpLCBNRU1CTE9DS19BTExPQ19BQ0NFU1NJQkxFLCBuaWQpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgcGNwdV9mY19mcmVlKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpCit7CisJbWVtYmxvY2tfZnJlZV9lYXJseShfX3BhKHB0ciksIHNpemUpOworfQorCit2b2lkIF9faW5pdCBzZXR1cF9wZXJfY3B1X2FyZWFzKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBkZWx0YTsKKwl1bnNpZ25lZCBpbnQgY3B1OworCWludCByYzsKKworCS8qCisJICogQWx3YXlzIHJlc2VydmUgYXJlYSBmb3IgbW9kdWxlIHBlcmNwdSB2YXJpYWJsZXMuICBUaGF0J3MKKwkgKiB3aGF0IHRoZSBsZWdhY3kgYWxsb2NhdG9yIGRpZC4KKwkgKi8KKwlyYyA9IHBjcHVfZW1iZWRfZmlyc3RfY2h1bmsoUEVSQ1BVX01PRFVMRV9SRVNFUlZFLAorCQkJCSAgICBQRVJDUFVfRFlOQU1JQ19SRVNFUlZFLCBQQUdFX1NJWkUsCisJCQkJICAgIHBjcHVfY3B1X2Rpc3RhbmNlLAorCQkJCSAgICBwY3B1X2ZjX2FsbG9jLCBwY3B1X2ZjX2ZyZWUpOworCWlmIChyYyA8IDApCisJCXBhbmljKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwZXJjcHUgYXJlYXMuIik7CisKKwlkZWx0YSA9ICh1bnNpZ25lZCBsb25nKXBjcHVfYmFzZV9hZGRyIC0gKHVuc2lnbmVkIGxvbmcpX19wZXJfY3B1X3N0YXJ0OworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpCisJCV9fcGVyX2NwdV9vZmZzZXRbY3B1XSA9IGRlbHRhICsgcGNwdV91bml0X29mZnNldHNbY3B1XTsKK30KKyNlbmRpZgorCiAvKioKICAqIG51bWFfYWRkX21lbWJsayAtIFNldCBub2RlIGlkIHRvIG1lbWJsawogICogQG5pZDogTlVNQSBub2RlIElEIG9mIHRoZSBuZXcgbWVtYmxrCkBAIC0xNDMsMTMgKzIwMiwxMyBAQAogCiAJcmV0ID0gbWVtYmxvY2tfc2V0X25vZGUoc3RhcnQsIChlbmQgLSBzdGFydCksICZtZW1ibG9jay5tZW1vcnksIG5pZCk7CiAJaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCJOVU1BOiBtZW1ibG9jayBbMHglbGx4IC0gMHglbGx4XSBmYWlsZWQgdG8gYWRkIG9uIG5vZGUgJWRcbiIsCisJCXByX2VycigibWVtYmxvY2sgWzB4JWxseCAtIDB4JWxseF0gZmFpbGVkIHRvIGFkZCBvbiBub2RlICVkXG4iLAogCQkJc3RhcnQsIChlbmQgLSAxKSwgbmlkKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlub2RlX3NldChuaWQsIG51bWFfbm9kZXNfcGFyc2VkKTsKLQlwcl9pbmZvKCJOVU1BOiBBZGRpbmcgbWVtYmxvY2sgWzB4JWxseCAtIDB4JWxseF0gb24gbm9kZSAlZFxuIiwKKwlwcl9pbmZvKCJBZGRpbmcgbWVtYmxvY2sgWzB4JWxseCAtIDB4JWxseF0gb24gbm9kZSAlZFxuIiwKIAkJCXN0YXJ0LCAoZW5kIC0gMSksIG5pZCk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE2NCwxOSArMjIzLDE4IEBACiAJdm9pZCAqbmQ7CiAJaW50IHRuaWQ7CiAKLQlwcl9pbmZvKCJOVU1BOiBJbml0bWVtIHNldHVwIG5vZGUgJWQgW21lbSAlIzAxMEx4LSUjMDEwTHhdXG4iLAotCQkJbmlkLCBzdGFydF9wZm4gPDwgUEFHRV9TSElGVCwKLQkJCShlbmRfcGZuIDw8IFBBR0VfU0hJRlQpIC0gMSk7CisJcHJfaW5mbygiSW5pdG1lbSBzZXR1cCBub2RlICVkIFttZW0gJSMwMTBMeC0lIzAxMEx4XVxuIiwKKwkJbmlkLCBzdGFydF9wZm4gPDwgUEFHRV9TSElGVCwgKGVuZF9wZm4gPDwgUEFHRV9TSElGVCkgLSAxKTsKIAogCW5kX3BhID0gbWVtYmxvY2tfYWxsb2NfdHJ5X25pZChuZF9zaXplLCBTTVBfQ0FDSEVfQllURVMsIG5pZCk7CiAJbmQgPSBfX3ZhKG5kX3BhKTsKIAogCS8qIHJlcG9ydCBhbmQgaW5pdGlhbGl6ZSAqLwotCXByX2luZm8oIk5VTUE6IE5PREVfREFUQSBbbWVtICUjMDEwTHgtJSMwMTBMeF1cbiIsCisJcHJfaW5mbygiTk9ERV9EQVRBIFttZW0gJSMwMTBMeC0lIzAxMEx4XVxuIiwKIAkJbmRfcGEsIG5kX3BhICsgbmRfc2l6ZSAtIDEpOwogCXRuaWQgPSBlYXJseV9wZm5fdG9fbmlkKG5kX3BhID4+IFBBR0VfU0hJRlQpOwogCWlmICh0bmlkICE9IG5pZCkKLQkJcHJfaW5mbygiTlVNQTogTk9ERV9EQVRBKCVkKSBvbiBub2RlICVkXG4iLCBuaWQsIHRuaWQpOworCQlwcl9pbmZvKCJOT0RFX0RBVEEoJWQpIG9uIG5vZGUgJWRcbiIsIG5pZCwgdG5pZCk7CiAKIAlub2RlX2RhdGFbbmlkXSA9IG5kOwogCW1lbXNldChOT0RFX0RBVEEobmlkKSwgMCwgc2l6ZW9mKHBnX2RhdGFfdCkpOwpAQCAtMjMzLDggKzI5MSw3IEBACiAJCQludW1hX2Rpc3RhbmNlW2kgKiBudW1hX2Rpc3RhbmNlX2NudCArIGpdID0gaSA9PSBqID8KIAkJCQlMT0NBTF9ESVNUQU5DRSA6IFJFTU9URV9ESVNUQU5DRTsKIAotCXByX2RlYnVnKCJOVU1BOiBJbml0aWFsaXplZCBkaXN0YW5jZSB0YWJsZSwgY250PSVkXG4iLAotCQkJbnVtYV9kaXN0YW5jZV9jbnQpOworCXByX2RlYnVnKCJJbml0aWFsaXplZCBkaXN0YW5jZSB0YWJsZSwgY250PSVkXG4iLCBudW1hX2Rpc3RhbmNlX2NudCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI1NSwyMCArMzEyLDIwIEBACiB2b2lkIF9faW5pdCBudW1hX3NldF9kaXN0YW5jZShpbnQgZnJvbSwgaW50IHRvLCBpbnQgZGlzdGFuY2UpCiB7CiAJaWYgKCFudW1hX2Rpc3RhbmNlKSB7Ci0JCXByX3dhcm5fb25jZSgiTlVNQTogV2FybmluZzogZGlzdGFuY2UgdGFibGUgbm90IGFsbG9jYXRlZCB5ZXRcbiIpOworCQlwcl93YXJuX29uY2UoIldhcm5pbmc6IGRpc3RhbmNlIHRhYmxlIG5vdCBhbGxvY2F0ZWQgeWV0XG4iKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmIChmcm9tID49IG51bWFfZGlzdGFuY2VfY250IHx8IHRvID49IG51bWFfZGlzdGFuY2VfY250IHx8CiAJCQlmcm9tIDwgMCB8fCB0byA8IDApIHsKLQkJcHJfd2Fybl9vbmNlKCJOVU1BOiBXYXJuaW5nOiBub2RlIGlkcyBhcmUgb3V0IG9mIGJvdW5kLCBmcm9tPSVkIHRvPSVkIGRpc3RhbmNlPSVkXG4iLAorCQlwcl93YXJuX29uY2UoIldhcm5pbmc6IG5vZGUgaWRzIGFyZSBvdXQgb2YgYm91bmQsIGZyb209JWQgdG89JWQgZGlzdGFuY2U9JWRcbiIsCiAJCQkgICAgZnJvbSwgdG8sIGRpc3RhbmNlKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmICgodTgpZGlzdGFuY2UgIT0gZGlzdGFuY2UgfHwKIAkgICAgKGZyb20gPT0gdG8gJiYgZGlzdGFuY2UgIT0gTE9DQUxfRElTVEFOQ0UpKSB7Ci0JCXByX3dhcm5fb25jZSgiTlVNQTogV2FybmluZzogaW52YWxpZCBkaXN0YW5jZSBwYXJhbWV0ZXIsIGZyb209JWQgdG89JWQgZGlzdGFuY2U9JWRcbiIsCisJCXByX3dhcm5fb25jZSgiV2FybmluZzogaW52YWxpZCBkaXN0YW5jZSBwYXJhbWV0ZXIsIGZyb209JWQgdG89JWQgZGlzdGFuY2U9JWRcbiIsCiAJCQkgICAgIGZyb20sIHRvLCBkaXN0YW5jZSk7CiAJCXJldHVybjsKIAl9CkBAIC0yOTUsNyArMzUyLDcgQEAKIAkvKiBDaGVjayB0aGF0IHZhbGlkIG5pZCBpcyBzZXQgdG8gbWVtYmxrcyAqLwogCWZvcl9lYWNoX21lbWJsb2NrKG1lbW9yeSwgbWJsaykKIAkJaWYgKG1ibGstPm5pZCA9PSBOVU1BX05PX05PREUgfHwgbWJsay0+bmlkID49IE1BWF9OVU1OT0RFUykgewotCQkJcHJfd2FybigiTlVNQTogV2FybmluZzogaW52YWxpZCBtZW1ibGsgbm9kZSAlZCBbbWVtICUjMDEwTHgtJSMwMTBMeF1cbiIsCisJCQlwcl93YXJuKCJXYXJuaW5nOiBpbnZhbGlkIG1lbWJsayBub2RlICVkIFttZW0gJSMwMTBMeC0lIzAxMEx4XVxuIiwKIAkJCQltYmxrLT5uaWQsIG1ibGstPmJhc2UsCiAJCQkJbWJsay0+YmFzZSArIG1ibGstPnNpemUgLSAxKTsKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtMzMzLDggKzM5MCwxMCBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKG5vZGVzX2VtcHR5KG51bWFfbm9kZXNfcGFyc2VkKSkKKwlpZiAobm9kZXNfZW1wdHkobnVtYV9ub2Rlc19wYXJzZWQpKSB7CisJCXByX2luZm8oIk5vIE5VTUEgY29uZmlndXJhdGlvbiBmb3VuZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOworCX0KIAogCXJldCA9IG51bWFfcmVnaXN0ZXJfbm9kZXMoKTsKIAlpZiAocmV0IDwgMCkKQEAgLTM0MiwxMCArNDAxLDYgQEAKIAogCXNldHVwX25vZGVfdG9fY3B1bWFza19tYXAoKTsKIAotCS8qIGluaXQgYm9vdCBwcm9jZXNzb3IgKi8KLQljcHVfdG9fbm9kZV9tYXBbMF0gPSAwOwotCW1hcF9jcHVfdG9fbm9kZSgwLCAwKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0zNjUsMTAgKzQyMCw4IEBACiAKIAlpZiAobnVtYV9vZmYpCiAJCXByX2luZm8oIk5VTUEgZGlzYWJsZWRcbiIpOyAvKiBGb3JjZWQgb2ZmIG9uIGNvbW1hbmQgbGluZS4gKi8KLQllbHNlCi0JCXByX2luZm8oIk5vIE5VTUEgY29uZmlndXJhdGlvbiBmb3VuZFxuIik7Ci0JcHJfaW5mbygiTlVNQTogRmFraW5nIGEgbm9kZSBhdCBbbWVtICUjMDE4THgtJSMwMThMeF1cbiIsCi0JICAgICAgIDBMTFUsIFBGTl9QSFlTKG1heF9wZm4pIC0gMSk7CisJcHJfaW5mbygiRmFraW5nIGEgbm9kZSBhdCBbbWVtICUjMDE4THgtJSMwMThMeF1cbiIsCisJCTBMTFUsIFBGTl9QSFlTKG1heF9wZm4pIC0gMSk7CiAKIAlmb3JfZWFjaF9tZW1ibG9jayhtZW1vcnksIG1ibGspIHsKIAkJcmV0ID0gbnVtYV9hZGRfbWVtYmxrKDAsIG1ibGstPmJhc2UsIG1ibGstPmJhc2UgKyBtYmxrLT5zaXplKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbW0vcGFnZWF0dHIuYyBiL2FyY2gvYXJtNjQvbW0vcGFnZWF0dHIuYwppbmRleCBjYTZkMjY4Li44ZGVmNTVlIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L21tL3BhZ2VhdHRyLmMKKysrIGIvYXJjaC9hcm02NC9tbS9wYWdlYXR0ci5jCkBAIC0xMzksNCArMTM5LDQzIEBACiAJCQkJCV9fcGdwcm90KDApLAogCQkJCQlfX3BncHJvdChQVEVfVkFMSUQpKTsKIH0KLSNlbmRpZgorI2lmZGVmIENPTkZJR19ISUJFUk5BVElPTgorLyoKKyAqIFdoZW4gYnVpbHQgd2l0aCBDT05GSUdfREVCVUdfUEFHRUFMTE9DIGFuZCBDT05GSUdfSElCRVJOQVRJT04sIHRoaXMgZnVuY3Rpb24KKyAqIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgbGluZWFyIG1hcCBwYWdlIGhhcyBiZWVuIG1hcmtlZCBhcyBub3QtdmFsaWQgYnkKKyAqIENPTkZJR19ERUJVR19QQUdFQUxMT0MuIFdhbGsgdGhlIHBhZ2UgdGFibGUgYW5kIGNoZWNrIHRoZSBQVEVfVkFMSUQgYml0LgorICogVGhpcyBpcyBiYXNlZCBvbiBrZXJuX2FkZHJfdmFsaWQoKSwgd2hpY2ggYWxtb3N0IGRvZXMgd2hhdCB3ZSBuZWVkLgorICoKKyAqIEJlY2F1c2UgdGhpcyBpcyBvbmx5IGNhbGxlZCBvbiB0aGUga2VybmVsIGxpbmVhciBtYXAsICBwP2Rfc2VjdCgpIGltcGxpZXMKKyAqIHA/ZF9wcmVzZW50KCkuIFdoZW4gZGVidWdfcGFnZWFsbG9jIGlzIGVuYWJsZWQsIHNlY3Rpb25zIG1hcHBpbmdzIGFyZQorICogZGlzYWJsZWQuCisgKi8KK2Jvb2wga2VybmVsX3BhZ2VfcHJlc2VudChzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlwZ2RfdCAqcGdkOworCXB1ZF90ICpwdWQ7CisJcG1kX3QgKnBtZDsKKwlwdGVfdCAqcHRlOworCXVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhwYWdlKTsKKworCXBnZCA9IHBnZF9vZmZzZXRfayhhZGRyKTsKKwlpZiAocGdkX25vbmUoKnBnZCkpCisJCXJldHVybiBmYWxzZTsKKworCXB1ZCA9IHB1ZF9vZmZzZXQocGdkLCBhZGRyKTsKKwlpZiAocHVkX25vbmUoKnB1ZCkpCisJCXJldHVybiBmYWxzZTsKKwlpZiAocHVkX3NlY3QoKnB1ZCkpCisJCXJldHVybiB0cnVlOworCisJcG1kID0gcG1kX29mZnNldChwdWQsIGFkZHIpOworCWlmIChwbWRfbm9uZSgqcG1kKSkKKwkJcmV0dXJuIGZhbHNlOworCWlmIChwbWRfc2VjdCgqcG1kKSkKKwkJcmV0dXJuIHRydWU7CisKKwlwdGUgPSBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIGFkZHIpOworCXJldHVybiBwdGVfdmFsaWQoKnB0ZSk7Cit9CisjZW5kaWYgLyogQ09ORklHX0hJQkVSTkFUSU9OICovCisjZW5kaWYgLyogQ09ORklHX0RFQlVHX1BBR0VBTExPQyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9tbS9wZ2QuYyBiL2FyY2gvYXJtNjQvbW0vcGdkLmMKaW5kZXggYWUxMWQ0ZS4uMzcxYzVmMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9tbS9wZ2QuYworKysgYi9hcmNoL2FybTY0L21tL3BnZC5jCkBAIC0yNiw4ICsyNiw2IEBACiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KIAotI2luY2x1ZGUgIm1tLmgiCi0KIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqcGdkX2NhY2hlOwogCiBwZ2RfdCAqcGdkX2FsbG9jKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9tbS9wcm9jLlMgYi9hcmNoL2FybTY0L21tL3Byb2MuUwppbmRleCA1YmI2MWRlLi4zNTJjNzNiIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L21tL3Byb2MuUworKysgYi9hcmNoL2FybTY0L21tL3Byb2MuUwpAQCAtODMsNiArODMsNyBAQAogICoKICAqIHgwOiBBZGRyZXNzIG9mIGNvbnRleHQgcG9pbnRlcgogICovCisJLnB1c2hzZWN0aW9uICIuaWRtYXAudGV4dCIsICJheCIKIEVOVFJZKGNwdV9kb19yZXN1bWUpCiAJbGRwCXgyLCB4MywgW3gwXQogCWxkcAl4NCwgeDUsIFt4MCwgIzE2XQpAQCAtMTAwLDcgKzEwMSwxNiBAQAogCiAJbXNyCXRjcl9lbDEsIHg4CiAJbXNyCXZiYXJfZWwxLCB4OQorCisJLyoKKwkgKiBfX2NwdV9zZXR1cCgpIGNsZWFyZWQgTURTQ1JfRUwxLk1ERSBhbmQgZnJpZW5kcywgYmVmb3JlIHVubWFza2luZworCSAqIGRlYnVnIGV4Y2VwdGlvbnMuIEJ5IHJlc3RvcmluZyBNRFNDUl9FTDEgaGVyZSwgd2UgbWF5IHRha2UgYSBkZWJ1ZworCSAqIGV4Y2VwdGlvbi4gTWFzayB0aGVtIHVudGlsIGxvY2FsX2RiZ19yZXN0b3JlKCkgaW4gY3B1X3N1c3BlbmQoKQorCSAqIHJlc2V0cyB0aGVtLgorCSAqLworCWRpc2FibGVfZGJnCiAJbXNyCW1kc2NyX2VsMSwgeDEwCisKIAltc3IJc2N0bHJfZWwxLCB4MTIKIAkvKgogCSAqIFJlc3RvcmUgb3Nsc3JfZWwxIGJ5IHdyaXRpbmcgb3NsYXJfZWwxCkBAIC0xMTEsNiArMTIxLDcgQEAKIAlpc2IKIAlyZXQKIEVORFBST0MoY3B1X2RvX3Jlc3VtZSkKKwkucG9wc2VjdGlvbgogI2VuZGlmCiAKIC8qCkBAIC0xMjUsMTcgKzEzNiwxMiBAQAogCWJmaQl4MCwgeDEsICM0OCwgIzE2CQkvLyBzZXQgdGhlIEFTSUQKIAltc3IJdHRicjBfZWwxLCB4MAkJCS8vIHNldCBUVEJSMAogCWlzYgotYWx0ZXJuYXRpdmVfaWZfbm90IEFSTTY0X1dPUktBUk9VTkRfQ0FWSVVNXzI3NDU2Ci0JcmV0Ci0Jbm9wCi0Jbm9wCi0Jbm9wCi1hbHRlcm5hdGl2ZV9lbHNlCithbHRlcm5hdGl2ZV9pZiBBUk02NF9XT1JLQVJPVU5EX0NBVklVTV8yNzQ1NgogCWljCWlhbGx1CiAJZHNiCW5zaAogCWlzYgorYWx0ZXJuYXRpdmVfZWxzZV9ub3BfZW5kaWYKIAlyZXQKLWFsdGVybmF0aXZlX2VuZGlmCiBFTkRQUk9DKGNwdV9kb19zd2l0Y2hfbW0pCiAKIAkucHVzaHNlY3Rpb24gIi5pZG1hcC50ZXh0IiwgImF4IgpAQCAtMTcyLDYgKzE3OCw3IEBACiAgKglJbml0aWFsaXNlIHRoZSBwcm9jZXNzb3IgZm9yIHR1cm5pbmcgdGhlIE1NVSBvbi4gIFJldHVybiBpbiB4MCB0aGUKICAqCXZhbHVlIG9mIHRoZSBTQ1RMUl9FTDEgcmVnaXN0ZXIuCiAgKi8KKwkucHVzaHNlY3Rpb24gIi5pZG1hcC50ZXh0IiwgImF4IgogRU5UUlkoX19jcHVfc2V0dXApCiAJdGxiaQl2bWFsbGUxCQkJCS8vIEludmFsaWRhdGUgbG9jYWwgVExCCiAJZHNiCW5zaApAQCAtMjU3LDMgKzI2NCw0IEBACiBjcnZhbDoKIAkud29yZAkweGZjZmZmZmZmCQkJLy8gY2xlYXIKIAkud29yZAkweDM0ZDVkOTFkCQkJLy8gc2V0CisJLnBvcHNlY3Rpb24KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggNjhjZjYzOC4uYjFlYzFmYSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTc0LDcgKzc0LDcgQEAKIAogZXh0ZXJuIF9fa2VybmVsX3NpemVfdCBjb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLAogCQkJCSAgICBfX2tlcm5lbF9zaXplX3Qgbik7Ci1leHRlcm4gX19rZXJuZWxfc2l6ZV90IGNvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwKK2V4dGVybiBfX2tlcm5lbF9zaXplX3QgX19fY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLAogCQkJCSAgICAgIF9fa2VybmVsX3NpemVfdCBuKTsKIAogc3RhdGljIGlubGluZSBfX2tlcm5lbF9zaXplX3QgX19jb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLApAQCAtODgsNiArODgsMTUgQEAKIHsKIAlyZXR1cm4gX19jb3B5X3VzZXIodG8sIChjb25zdCB2b2lkIF9fZm9yY2UgKilmcm9tLCBuKTsKIH0KK3N0YXRpYyBpbmxpbmUgX19rZXJuZWxfc2l6ZV90IGNvcHlfZnJvbV91c2VyKHZvaWQgKnRvLAorCQkJCQkgICAgICAgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sCisJCQkJCSAgICAgICBfX2tlcm5lbF9zaXplX3QgbikKK3sKKwlzaXplX3QgcmVzID0gX19fY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pOworCWlmICh1bmxpa2VseShyZXMpKQorCQltZW1zZXQodG8gKyAobiAtIHJlcyksIDAsIHJlcyk7CisJcmV0dXJuIHJlczsKK30KIAogI2RlZmluZSBfX2NvcHlfdG9fdXNlcl9pbmF0b21pYyBfX2NvcHlfdG9fdXNlcgogI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljIF9fY29weV9mcm9tX3VzZXIKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL2F2cjMyX2tzeW1zLmMgYi9hcmNoL2F2cjMyL2tlcm5lbC9hdnIzMl9rc3ltcy5jCmluZGV4IGQ5M2VhZDAuLjdjNmNmMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL2F2cjMyX2tzeW1zLmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvYXZyMzJfa3N5bXMuYwpAQCAtMzYsNyArMzYsNyBAQAogLyoKICAqIFVzZXJzcGFjZSBhY2Nlc3Mgc3R1ZmYuCiAgKi8KLUVYUE9SVF9TWU1CT0woY29weV9mcm9tX3VzZXIpOworRVhQT1JUX1NZTUJPTChfX19jb3B5X2Zyb21fdXNlcik7CiBFWFBPUlRfU1lNQk9MKGNvcHlfdG9fdXNlcik7CiBFWFBPUlRfU1lNQk9MKF9fY29weV91c2VyKTsKIEVYUE9SVF9TWU1CT0woc3RybmNweV9mcm9tX3VzZXIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9saWIvY29weV91c2VyLlMgYi9hcmNoL2F2cjMyL2xpYi9jb3B5X3VzZXIuUwppbmRleCBlYTU5YzA0Li4wNzUzNzM0IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2xpYi9jb3B5X3VzZXIuUworKysgYi9hcmNoL2F2cjMyL2xpYi9jb3B5X3VzZXIuUwpAQCAtMjMsMTMgKzIzLDEzIEBACiAJICovCiAJLnRleHQKIAkuYWxpZ24JMQotCS5nbG9iYWwJY29weV9mcm9tX3VzZXIKLQkudHlwZQljb3B5X2Zyb21fdXNlciwgQGZ1bmN0aW9uCi1jb3B5X2Zyb21fdXNlcjoKKwkuZ2xvYmFsCV9fX2NvcHlfZnJvbV91c2VyCisJLnR5cGUJX19fY29weV9mcm9tX3VzZXIsIEBmdW5jdGlvbgorX19fY29weV9mcm9tX3VzZXI6CiAJYnJhbmNoX2lmX2tlcm5lbCByOCwgX19jb3B5X3VzZXIKIAlyZXRfaWZfcHJpdmlsZWdlZCByOCwgcjExLCByMTAsIHIxMAogCXJqbXAJX19jb3B5X3VzZXIKLQkuc2l6ZQljb3B5X2Zyb21fdXNlciwgLiAtIGNvcHlfZnJvbV91c2VyCisJLnNpemUJX19fY29weV9mcm9tX3VzZXIsIC4gLSBfX19jb3B5X2Zyb21fdXNlcgogCiAJLmdsb2JhbAljb3B5X3RvX3VzZXIKIAkudHlwZQljb3B5X3RvX3VzZXIsIEBmdW5jdGlvbgpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9LY29uZmlnIGIvYXJjaC9ibGFja2Zpbi9LY29uZmlnCmluZGV4IDI4YzYzZmUuLjNjMWJkNjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vS2NvbmZpZworKysgYi9hcmNoL2JsYWNrZmluL0tjb25maWcKQEAgLTI2LDcgKzI2LDcgQEAKIAlzZWxlY3QgSEFWRV9PUFJPRklMRQogCXNlbGVjdCBIQVZFX1BFUkZfRVZFTlRTCiAJc2VsZWN0IEFSQ0hfSEFWRV9DVVNUT01fR1BJT19ICi0Jc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCisJc2VsZWN0IEdQSU9MSUIKIAlzZWxlY3QgSEFWRV9VSUQxNgogCXNlbGVjdCBIQVZFX1VOREVSU0NPUkVfU1lNQk9MX1BSRUZJWAogCXNlbGVjdCBWSVJUX1RPX0JVUwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCAxMmY1ZDY4Li4wYTJhNzAwIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtMTcxLDExICsxNzEsMTIgQEAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sKIGNvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewotCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIG4pKQorCWlmIChsaWtlbHkoYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcm9tLCBuKSkpIHsKIAkJbWVtY3B5KHRvLCAoY29uc3Qgdm9pZCBfX2ZvcmNlICopZnJvbSwgbik7Ci0JZWxzZQotCQlyZXR1cm4gbjsKLQlyZXR1cm4gMDsKKwkJcmV0dXJuIDA7CisJfQorCW1lbXNldCh0bywgMCwgbik7CisJcmV0dXJuIG47CiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2Z0cmFjZS1lbnRyeS5TIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZnRyYWNlLWVudHJ5LlMKaW5kZXggMjhkMDU5NS4uM2I4YmRjYiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZnRyYWNlLWVudHJ5LlMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZnRyYWNlLWVudHJ5LlMKQEAgLTE2OSw3ICsxNjksNyBAQAogCXIwID0gc3A7CS8qIHVuc2lnbmVkIGxvbmcgKnBhcmVudCAqLwogCXIxID0gW3NwXTsJLyogdW5zaWduZWQgbG9uZyBzZWxmX2FkZHIgKi8KICMgZW5kaWYKLSMgaWZkZWYgQ09ORklHX0hBVkVfRlVOQ1RJT05fR1JBUEhfRlBfVEVTVAorIyBpZmRlZiBIQVZFX0ZVTkNUSU9OX0dSQVBIX0ZQX1RFU1QKIAlyMiA9IGZwOwkvKiB1bnNpZ25lZCBsb25nIGZyYW1lX3BvaW50ZXIgKi8KICMgZW5kaWYKIAlyMCArPSAxNjsJLyogc2tpcCB0aGUgNCBsb2NhbCByZWdzIG9uIHN0YWNrICovCkBAIC0xOTAsNyArMTkwLDcgQEAKIAlbLS1zcF0gPSByMTsKIAogCS8qIGdldCBvcmlnaW5hbCByZXR1cm4gYWRkcmVzcyAqLwotIyBpZmRlZiBDT05GSUdfSEFWRV9GVU5DVElPTl9HUkFQSF9GUF9URVNUCisjIGlmZGVmIEhBVkVfRlVOQ1RJT05fR1JBUEhfRlBfVEVTVAogCXIwID0gZnA7CS8qIEJsYWNrZmluIGlzIHNhbmUsIHNvIG9taXQgdGhpcyAqLwogIyBlbmRpZgogCWNhbGwgX2Z0cmFjZV9yZXR1cm5fdG9faGFuZGxlcjsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL2Z0cmFjZS5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZnRyYWNlLmMKaW5kZXggMDk1ZGUwZi4uOGRhZDc1OCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZnRyYWNlLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZnRyYWNlLmMKQEAgLTEwNyw3ICsxMDcsNyBAQAogCQlyZXR1cm47CiAKIAlpZiAoZnRyYWNlX3B1c2hfcmV0dXJuX3RyYWNlKCpwYXJlbnQsIHNlbGZfYWRkciwgJnRyYWNlLmRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfcG9pbnRlcikgPT0gLUVCVVNZKQorCQkJCSAgICAgZnJhbWVfcG9pbnRlciwgTlVMTCkgPT0gLUVCVVNZKQogCQlyZXR1cm47CiAKIAl0cmFjZS5mdW5jID0gc2VsZl9hZGRyOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9jbV9iZjU2MS5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9jbV9iZjU2MS5jCmluZGV4IGM2ZGI1MmIuLjEwYzU3NzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvY21fYmY1NjEuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2NtX2JmNTYxLmMKQEAgLTE0Niw3ICsxNDYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NtYzkxeC5oPgogCiBzdGF0aWMgc3RydWN0IHNtYzkxeF9wbGF0ZGF0YSBzbWM5MXhfaW5mbyA9IHsKLQkuZmxhZ3MgPSBTTUM5MVhfVVNFXzMyQklUIHwgU01DOTFYX05PV0FJVCwKKwkuZmxhZ3MgPSBTTUM5MVhfVVNFXzhCSVQgfCBTTUM5MVhfVVNFXzE2QklUIHwgU01DOTFYX1VTRV8zMkJJVCB8CisJCSBTTUM5MVhfTk9XQUlULAogCS5sZWRhID0gUlBDX0xFRF8xMDBfMTAsCiAJLmxlZGIgPSBSUENfTEVEX1RYX1JYLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvZXpraXQuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvZXpraXQuYwppbmRleCBmMzU1MjViLi41N2QxYzQzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2V6a2l0LmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9lemtpdC5jCkBAIC0xMzQsNyArMTM0LDggQEAKICNpbmNsdWRlIDxsaW51eC9zbWM5MXguaD4KIAogc3RhdGljIHN0cnVjdCBzbWM5MXhfcGxhdGRhdGEgc21jOTF4X2luZm8gPSB7Ci0JLmZsYWdzID0gU01DOTFYX1VTRV8zMkJJVCB8IFNNQzkxWF9OT1dBSVQsCisJLmZsYWdzID0gU01DOTFYX1VTRV84QklUIHwgU01DOTFYX1VTRV8xNkJJVCB8IFNNQzkxWF9VU0VfMzJCSVQgfAorCQkgU01DOTFYX05PV0FJVCwKIAkubGVkYSA9IFJQQ19MRURfMTAwXzEwLAogCS5sZWRiID0gUlBDX0xFRF9UWF9SWCwKIH07CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvY29yZWIuYyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9jb3JlYi5jCmluZGV4IDc4ZWNiNTAuLjhhMjU0M2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9jb3JlYi5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9jb3JlYi5jCkBAIC01OSwxOCArNTksNyBAQAogCS5uYW1lICA9ICJjb3JlYiIsCiAJLmZvcHMgID0gJmNvcmViX2ZvcHMsCiB9OwotCi1zdGF0aWMgaW50IF9faW5pdCBiZjU2MV9jb3JlYl9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJmNvcmViX2Rldik7Ci19Ci1tb2R1bGVfaW5pdChiZjU2MV9jb3JlYl9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IGJmNTYxX2NvcmViX2V4aXQodm9pZCkKLXsKLQltaXNjX2RlcmVnaXN0ZXIoJmNvcmViX2Rldik7Ci19Ci1tb2R1bGVfZXhpdChiZjU2MV9jb3JlYl9leGl0KTsKK21vZHVsZV9taXNjX2RldmljZShjb3JlYl9kZXYpOwogCiBNT0RVTEVfQVVUSE9SKCJCYXMgVmVybWV1bGVuIDxidmVybWV1bEBibGFja3N0YXIueHM0YWxsLm5sPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJCRjU2MSBDb3JlIEIgU3VwcG9ydCIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggZTM1MzBkMC4uNTZjN2Q1NyAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL2NyaXMvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC0xOTQsMzAgKzE5NCw2IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBfX2NvcHlfdXNlcl96ZXJvaW5nKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIF9fZG9fY2xlYXJfdXNlcih2b2lkIF9fdXNlciAqdG8sIHVuc2lnbmVkIGxvbmcgbik7CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotX19nZW5lcmljX2NvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKLXsKLQlpZiAoYWNjZXNzX29rKFZFUklGWV9XUklURSwgdG8sIG4pKQotCQlyZXR1cm4gX19jb3B5X3VzZXIodG8sIGZyb20sIG4pOwotCXJldHVybiBuOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLV9fZ2VuZXJpY19jb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKLXsKLQlpZiAoYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcm9tLCBuKSkKLQkJcmV0dXJuIF9fY29weV91c2VyX3plcm9pbmcodG8sIGZyb20sIG4pOwotCXJldHVybiBuOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLV9fZ2VuZXJpY19jbGVhcl91c2VyKHZvaWQgX191c2VyICp0bywgdW5zaWduZWQgbG9uZyBuKQotewotCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB0bywgbikpCi0JCXJldHVybiBfX2RvX2NsZWFyX3VzZXIodG8sIG4pOwotCXJldHVybiBuOwotfQotCiBzdGF0aWMgaW5saW5lIGxvbmcKIF9fc3RybmNweV9mcm9tX3VzZXIoY2hhciAqZHN0LCBjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBsb25nIGNvdW50KQogewpAQCAtMjgyLDcgKzI1OCw3IEBACiAJZWxzZSBpZiAobiA9PSAyNCkKIAkJX19hc21fY29weV9mcm9tX3VzZXJfMjQodG8sIGZyb20sIHJldCk7CiAJZWxzZQotCQlyZXQgPSBfX2dlbmVyaWNfY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pOworCQlyZXQgPSBfX2NvcHlfdXNlcl96ZXJvaW5nKHRvLCBmcm9tLCBuKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0zMzMsNyArMzA5LDcgQEAKIAllbHNlIGlmIChuID09IDI0KQogCQlfX2FzbV9jb3B5X3RvX3VzZXJfMjQodG8sIGZyb20sIHJldCk7CiAJZWxzZQotCQlyZXQgPSBfX2dlbmVyaWNfY29weV90b191c2VyKHRvLCBmcm9tLCBuKTsKKwkJcmV0ID0gX19jb3B5X3VzZXIodG8sIGZyb20sIG4pOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTM2NiwyNiArMzQyLDQzIEBACiAJZWxzZSBpZiAobiA9PSAyNCkKIAkJX19hc21fY2xlYXJfMjQodG8sIHJldCk7CiAJZWxzZQotCQlyZXQgPSBfX2dlbmVyaWNfY2xlYXJfdXNlcih0bywgbik7CisJCXJldCA9IF9fZG9fY2xlYXJfdXNlcih0bywgbik7CiAKIAlyZXR1cm4gcmV0OwogfQogCiAKLSNkZWZpbmUgY2xlYXJfdXNlcih0bywgbikJCQkJXAotCShfX2J1aWx0aW5fY29uc3RhbnRfcChuKSA/CQkJXAotCSBfX2NvbnN0YW50X2NsZWFyX3VzZXIodG8sIG4pIDoJCQlcCi0JIF9fZ2VuZXJpY19jbGVhcl91c2VyKHRvLCBuKSkKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGNsZWFyX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBzaXplX3QgbikKK3sKKwlpZiAodW5saWtlbHkoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHRvLCBuKSkpCisJCXJldHVybiBuOworCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChuKSkKKwkJcmV0dXJuIF9fY29uc3RhbnRfY2xlYXJfdXNlcih0bywgbik7CisJZWxzZQorCQlyZXR1cm4gX19kb19jbGVhcl91c2VyKHRvLCBuKTsKK30KIAotI2RlZmluZSBjb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbikJCQlcCi0JKF9fYnVpbHRpbl9jb25zdGFudF9wKG4pID8JCQlcCi0JIF9fY29uc3RhbnRfY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pIDoJXAotCSBfX2dlbmVyaWNfY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pKQorc3RhdGljIGlubGluZSBzaXplX3QgY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCBzaXplX3QgbikKK3sKKwlpZiAodW5saWtlbHkoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJvbSwgbikpKSB7CisJCW1lbXNldCh0bywgMCwgbik7CisJCXJldHVybiBuOworCX0KKwlpZiAoX19idWlsdGluX2NvbnN0YW50X3AobikpCisJCXJldHVybiBfX2NvbnN0YW50X2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKTsKKwllbHNlCisJCXJldHVybiBfX2NvcHlfdXNlcl96ZXJvaW5nKHRvLCBmcm9tLCBuKTsKK30KIAotI2RlZmluZSBjb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pCQkJXAotCShfX2J1aWx0aW5fY29uc3RhbnRfcChuKSA/CQkJXAotCSBfX2NvbnN0YW50X2NvcHlfdG9fdXNlcih0bywgZnJvbSwgbikgOgkJXAotCSBfX2dlbmVyaWNfY29weV90b191c2VyKHRvLCBmcm9tLCBuKSkKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGNvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHNpemVfdCBuKQoreworCWlmICh1bmxpa2VseSghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdG8sIG4pKSkKKwkJcmV0dXJuIG47CisJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKG4pKQorCQlyZXR1cm4gX19jb25zdGFudF9jb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pOworCWVsc2UKKwkJcmV0dXJuIF9fY29weV91c2VyKHRvLCBmcm9tLCBuKTsKK30KIAogLyogV2UgbGV0IHRoZSBfXyB2ZXJzaW9ucyBvZiBjb3B5X2Zyb20vdG9fdXNlciBpbmxpbmUsIGJlY2F1c2UgdGhleSdyZSBvZnRlbgogICogdXNlZCBpbiBmYXN0IHBhdGhzIGFuZCBoYXZlIG9ubHkgYSBzbWFsbCBzcGFjZSBvdmVyaGVhZC4KZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gvZnJ2L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCAzYWM5YTU5Li44N2Q5ZTM0IDEwMDY0NAotLS0gYS9hcmNoL2Zydi9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC9mcnYvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC0yNjMsMTkgKzI2MywyNSBAQAogZXh0ZXJuIGxvbmcgX19tZW1zZXRfdXNlcih2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpOwogZXh0ZXJuIGxvbmcgX19tZW1jcHlfdXNlcih2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgbG9uZyBjb3VudCk7CiAKLSNkZWZpbmUgY2xlYXJfdXNlcihkc3QsY291bnQpCQkJX19tZW1zZXRfdXNlcihfX19fZm9yY2UoZHN0KSwgKGNvdW50KSkKKyNkZWZpbmUgX19jbGVhcl91c2VyKGRzdCxjb3VudCkJCQlfX21lbXNldF91c2VyKF9fX19mb3JjZShkc3QpLCAoY291bnQpKQogI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKHRvLCBmcm9tLCBuKQlfX21lbWNweV91c2VyKCh0byksIF9fX19mb3JjZShmcm9tKSwgKG4pKQogI2RlZmluZSBfX2NvcHlfdG9fdXNlcl9pbmF0b21pYyh0bywgZnJvbSwgbikJX19tZW1jcHlfdXNlcihfX19fZm9yY2UodG8pLCAoZnJvbSksIChuKSkKIAogI2Vsc2UKIAotI2RlZmluZSBjbGVhcl91c2VyKGRzdCxjb3VudCkJCQkobWVtc2V0KF9fX19mb3JjZShkc3QpLCAwLCAoY291bnQpKSwgMCkKKyNkZWZpbmUgX19jbGVhcl91c2VyKGRzdCxjb3VudCkJCQkobWVtc2V0KF9fX19mb3JjZShkc3QpLCAwLCAoY291bnQpKSwgMCkKICNkZWZpbmUgX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyh0bywgZnJvbSwgbikJKG1lbWNweSgodG8pLCBfX19fZm9yY2UoZnJvbSksIChuKSksIDApCiAjZGVmaW5lIF9fY29weV90b191c2VyX2luYXRvbWljKHRvLCBmcm9tLCBuKQkobWVtY3B5KF9fX19mb3JjZSh0byksIChmcm9tKSwgKG4pKSwgMCkKIAogI2VuZGlmCiAKLSNkZWZpbmUgX19jbGVhcl91c2VyIGNsZWFyX3VzZXIKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sKK2NsZWFyX3VzZXIodm9pZCBfX3VzZXIgKnRvLCB1bnNpZ25lZCBsb25nIG4pCit7CisJaWYgKGxpa2VseShfX2FjY2Vzc19vayh0bywgbikpKQorCQluID0gX19jbGVhcl91c2VyKHRvLCBuKTsKKwlyZXR1cm4gbjsKK30KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjawogX19jb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCBmMDAwYTM4Li5mNjFjZmIyIDEwMDY0NAotLS0gYS9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTEwMyw3ICsxMDMsOCBAQAogewogCWxvbmcgcmVzID0gX19zdHJubGVuX3VzZXIoc3JjLCBuKTsKIAotCS8qIHJldHVybiBmcm9tIHN0cm5sZW4gY2FuJ3QgYmUgemVybyAtLSB0aGF0IHdvdWxkIGJlIHJ1YmJpc2guICovCisJaWYgKHVubGlrZWx5KCFyZXMpKQorCQlyZXR1cm4gLUVGQVVMVDsKIAogCWlmIChyZXMgPiBuKSB7CiAJCWNvcHlfZnJvbV91c2VyKGRzdCwgc3JjLCBuKTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggMjliZDU5Ny4uYzcwMjY0MiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKQEAgLTU2LDcgKzU2LDcgQEAKICNkZWZpbmUgYWxsb2NfdGhyZWFkX3N0YWNrX25vZGUodHNrLCBub2RlKQkoKHVuc2lnbmVkIGxvbmcgKikgMCkKICNkZWZpbmUgdGFza190aHJlYWRfaW5mbyh0c2spCSgoc3RydWN0IHRocmVhZF9pbmZvICopIDApCiAjZW5kaWYKLSNkZWZpbmUgZnJlZV90aHJlYWRfc3RhY2sodGkpCS8qIG5vdGhpbmcgKi8KKyNkZWZpbmUgZnJlZV90aHJlYWRfc3RhY2sodHNrKQkvKiBub3RoaW5nICovCiAjZGVmaW5lIHRhc2tfc3RhY2tfcGFnZSh0c2spCSgodm9pZCAqKSh0c2spKQogCiAjZGVmaW5lIF9fSEFWRV9USFJFQURfRlVOQ1RJT05TCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCA0NjVjNzA5Li5iZmUxMzE5IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTI0MSw4ICsyNDEsNyBAQAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCiBfX2NvcHlfdG9fdXNlciAodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIGNvdW50KQogewotCWlmICghX19idWlsdGluX2NvbnN0YW50X3AoY291bnQpKQotCQljaGVja19vYmplY3Rfc2l6ZShmcm9tLCBjb3VudCwgdHJ1ZSk7CisJY2hlY2tfb2JqZWN0X3NpemUoZnJvbSwgY291bnQsIHRydWUpOwogCiAJcmV0dXJuIF9fY29weV91c2VyKHRvLCAoX19mb3JjZSB2b2lkIF9fdXNlciAqKSBmcm9tLCBjb3VudCk7CiB9CkBAIC0yNTAsOCArMjQ5LDcgQEAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwogX19jb3B5X2Zyb21fdXNlciAodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIGNvdW50KQogewotCWlmICghX19idWlsdGluX2NvbnN0YW50X3AoY291bnQpKQotCQljaGVja19vYmplY3Rfc2l6ZSh0bywgY291bnQsIGZhbHNlKTsKKwljaGVja19vYmplY3Rfc2l6ZSh0bywgY291bnQsIGZhbHNlKTsKIAogCXJldHVybiBfX2NvcHlfdXNlcigoX19mb3JjZSB2b2lkIF9fdXNlciAqKSB0bywgZnJvbSwgY291bnQpOwogfQpAQCAtMjY1LDI3ICsyNjMsMjIgQEAKIAlsb25nIF9fY3VfbGVuID0gKG4pOwkJCQkJCQkJXAogCQkJCQkJCQkJCQlcCiAJaWYgKF9fYWNjZXNzX29rKF9fY3VfdG8sIF9fY3VfbGVuLCBnZXRfZnMoKSkpIHsJCQkJCVwKLQkJaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcChuKSkJCQkJCQlcCi0JCQljaGVja19vYmplY3Rfc2l6ZShfX2N1X2Zyb20sIF9fY3VfbGVuLCB0cnVlKTsJCQlcCisJCWNoZWNrX29iamVjdF9zaXplKF9fY3VfZnJvbSwgX19jdV9sZW4sIHRydWUpOwkJCVwKIAkJX19jdV9sZW4gPSBfX2NvcHlfdXNlcihfX2N1X3RvLCAoX19mb3JjZSB2b2lkIF9fdXNlciAqKSAgX19jdV9mcm9tLCBfX2N1X2xlbik7CVwKIAl9CQkJCQkJCQkJCVwKIAlfX2N1X2xlbjsJCQkJCQkJCQlcCiB9KQogCi0jZGVmaW5lIGNvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKQkJCQkJCQlcCi0oewkJCQkJCQkJCQkJXAotCXZvaWQgKl9fY3VfdG8gPSAodG8pOwkJCQkJCQkJXAotCWNvbnN0IHZvaWQgX191c2VyICpfX2N1X2Zyb20gPSAoZnJvbSk7CQkJCQkJXAotCWxvbmcgX19jdV9sZW4gPSAobik7CQkJCQkJCQlcCi0JCQkJCQkJCQkJCVwKLQlfX2Noa191c2VyX3B0cihfX2N1X2Zyb20pOwkJCQkJCQlcCi0JaWYgKF9fYWNjZXNzX29rKF9fY3VfZnJvbSwgX19jdV9sZW4sIGdldF9mcygpKSkgewkJCQlcCi0JCWlmICghX19idWlsdGluX2NvbnN0YW50X3AobikpCQkJCQkJXAotCQkJY2hlY2tfb2JqZWN0X3NpemUoX19jdV90bywgX19jdV9sZW4sIGZhbHNlKTsJCQlcCi0JCV9fY3VfbGVuID0gX19jb3B5X3VzZXIoKF9fZm9yY2Ugdm9pZCBfX3VzZXIgKikgX19jdV90bywgX19jdV9mcm9tLCBfX2N1X2xlbik7CVwKLQl9CQkJCQkJCQkJCVwKLQlfX2N1X2xlbjsJCQkJCQkJCQlcCi19KQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitjb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKK3sKKwljaGVja19vYmplY3Rfc2l6ZSh0bywgbiwgZmFsc2UpOworCWlmIChsaWtlbHkoX19hY2Nlc3Nfb2soZnJvbSwgbiwgZ2V0X2ZzKCkpKSkKKwkJbiA9IF9fY29weV91c2VyKChfX2ZvcmNlIHZvaWQgX191c2VyICopIHRvLCBmcm9tLCBuKTsKKwllbHNlCisJCW1lbXNldCh0bywgMCwgbik7CisJcmV0dXJuIG47Cit9CiAKICNkZWZpbmUgX19jb3B5X2luX3VzZXIodG8sIGZyb20sIHNpemUpCV9fY29weV91c2VyKCh0byksIChmcm9tKSwgKHNpemUpKQogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2FjcGkuYyBiL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCmluZGV4IDkyYjdiYzkuLjkyNzNlMDMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCkBAIC03OTYsNyArNzk2LDcgQEAKICAqICBBQ1BJIGJhc2VkIGhvdHBsdWcgQ1BVIHN1cHBvcnQKICAqLwogI2lmZGVmIENPTkZJR19BQ1BJX0hPVFBMVUdfQ1BVCi1zdGF0aWMgaW50IGFjcGlfbWFwX2NwdTJub2RlKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IGNwdSwgaW50IHBoeXNpZCkKK2ludCBhY3BpX21hcF9jcHUybm9kZShhY3BpX2hhbmRsZSBoYW5kbGUsIGludCBjcHUsIGludCBwaHlzaWQpCiB7CiAjaWZkZWYgQ09ORklHX0FDUElfTlVNQQogCS8qCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL21jYS5jIGIvYXJjaC9pYTY0L2tlcm5lbC9tY2EuYwppbmRleCBlYjkyMjBjLi45NTA5Y2M3IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL21jYS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMKQEAgLTk4Niw3ICs5ODYsNyBAQAogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKIAlwcmV2aW91c19jdXJyZW50ID0gY3Vycl90YXNrKGNwdSk7Ci0Jc2V0X2N1cnJfdGFzayhjcHUsIGN1cnJlbnQpOworCWlhNjRfc2V0X2N1cnJfdGFzayhjcHUsIGN1cnJlbnQpOwogCWlmICgocCA9IHN0cmNocihjdXJyZW50LT5jb21tLCAnICcpKSkKIAkJKnAgPSAnXDAnOwogCkBAIC0xMzYwLDE0ICsxMzYwLDE0IEBACiAJCQkJY3B1bWFza19jbGVhcl9jcHUoaSwgJm1jYV9jcHUpOwkvKiB3YWtlIG5leHQgY3B1ICovCiAJCQkJd2hpbGUgKG1vbmFyY2hfY3B1ICE9IC0xKQogCQkJCQljcHVfcmVsYXgoKTsJLyogc3BpbiB1bnRpbCBsYXN0IGNwdSBsZWF2ZXMgKi8KLQkJCQlzZXRfY3Vycl90YXNrKGNwdSwgcHJldmlvdXNfY3VycmVudCk7CisJCQkJaWE2NF9zZXRfY3Vycl90YXNrKGNwdSwgcHJldmlvdXNfY3VycmVudCk7CiAJCQkJaWE2NF9tY19pbmZvLmltaV9yZW5kZXpfY2hlY2tpbltjcHVdCiAJCQkJCQk9IElBNjRfTUNBX1JFTkRFWl9DSEVDS0lOX05PVERPTkU7CiAJCQkJcmV0dXJuOwogCQkJfQogCQl9CiAJfQotCXNldF9jdXJyX3Rhc2soY3B1LCBwcmV2aW91c19jdXJyZW50KTsKKwlpYTY0X3NldF9jdXJyX3Rhc2soY3B1LCBwcmV2aW91c19jdXJyZW50KTsKIAlpYTY0X21jX2luZm8uaW1pX3JlbmRlel9jaGVja2luW2NwdV0gPSBJQTY0X01DQV9SRU5ERVpfQ0hFQ0tJTl9OT1RET05FOwogCW1vbmFyY2hfY3B1ID0gLTE7CS8qIFRoaXMgZnJlZXMgdGhlIHNsYXZlcyBhbmQgcHJldmlvdXMgbW9uYXJjaHMgKi8KIH0KQEAgLTE3MjksNyArMTcyOSw3IEBACiAJCU5PVElGWV9JTklUKERJRV9JTklUX1NMQVZFX0xFQVZFLCByZWdzLCAobG9uZykmbmQsIDEpOwogCiAJCW1wcmludGsoIlNsYXZlIG9uIGNwdSAlZCByZXR1cm5pbmcgdG8gbm9ybWFsIHNlcnZpY2UuXG4iLCBjcHUpOwotCQlzZXRfY3Vycl90YXNrKGNwdSwgcHJldmlvdXNfY3VycmVudCk7CisJCWlhNjRfc2V0X2N1cnJfdGFzayhjcHUsIHByZXZpb3VzX2N1cnJlbnQpOwogCQlpYTY0X21jX2luZm8uaW1pX3JlbmRlel9jaGVja2luW2NwdV0gPSBJQTY0X01DQV9SRU5ERVpfQ0hFQ0tJTl9OT1RET05FOwogCQlhdG9taWNfZGVjKCZzbGF2ZXMpOwogCQlyZXR1cm47CkBAIC0xNzU2LDcgKzE3NTYsNyBAQAogCiAJbXByaW50aygiXG5JTklUIGR1bXAgY29tcGxldGUuICBNb25hcmNoIG9uIGNwdSAlZCByZXR1cm5pbmcgdG8gbm9ybWFsIHNlcnZpY2UuXG4iLCBjcHUpOwogCWF0b21pY19kZWMoJm1vbmFyY2hzKTsKLQlzZXRfY3Vycl90YXNrKGNwdSwgcHJldmlvdXNfY3VycmVudCk7CisJaWE2NF9zZXRfY3Vycl90YXNrKGNwdSwgcHJldmlvdXNfY3VycmVudCk7CiAJbW9uYXJjaF9jcHUgPSAtMTsKIAlyZXR1cm47CiB9CkBAIC0xODkwLDcgKzE4OTAsNyBAQAogCQkJCQkJCSAgICAgIFBBR0VfS0VSTkVMKSkpOwogfQogCi1zdGF0aWMgdm9pZCBpYTY0X21jYV9jbWNfdmVjdG9yX2FkanVzdCh2b2lkICpkdW1teSkKK3N0YXRpYyBpbnQgaWE2NF9tY2FfY3B1X29ubGluZSh1bnNpZ25lZCBpbnQgY3B1KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTE4OTgsMjUgKzE4OTgsOSBAQAogCWlmICghY21jX3BvbGxpbmdfZW5hYmxlZCkKIAkJaWE2NF9tY2FfY21jX3ZlY3Rvcl9lbmFibGUoTlVMTCk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1jYV9jcHVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sCi0JCQkJICAgICAgdm9pZCAqaGNwdSkKLXsKLQlzd2l0Y2ggKGFjdGlvbikgewotCWNhc2UgQ1BVX09OTElORToKLQljYXNlIENQVV9PTkxJTkVfRlJPWkVOOgotCQlpYTY0X21jYV9jbWNfdmVjdG9yX2FkanVzdChOVUxMKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBOT1RJRllfT0s7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbWNhX2NwdV9ub3RpZmllciA9IHsKLQkubm90aWZpZXJfY2FsbCA9IG1jYV9jcHVfY2FsbGJhY2sKLX07Ci0KIC8qCiAgKiBpYTY0X21jYV9pbml0CiAgKgpAQCAtMjExMSwxNSArMjA5NSwxMyBAQAogCWlmICghbWNhX2luaXQpCiAJCXJldHVybiAwOwogCi0JcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZtY2FfY3B1X25vdGlmaWVyKTsKLQogCS8qIFNldHVwIHRoZSBDTUNJL1AgdmVjdG9yIGFuZCBoYW5kbGVyICovCiAJc2V0dXBfdGltZXIoJmNtY19wb2xsX3RpbWVyLCBpYTY0X21jYV9jbWNfcG9sbCwgMFVMKTsKIAogCS8qIFVubWFzay9lbmFibGUgdGhlIHZlY3RvciAqLwogCWNtY19wb2xsaW5nX2VuYWJsZWQgPSAwOwotCXNjaGVkdWxlX3dvcmsoJmNtY19lbmFibGVfd29yayk7Ci0KKwljcHVocF9zZXR1cF9zdGF0ZShDUFVIUF9BUF9PTkxJTkVfRFlOLCAiaWE2NC9tY2E6b25saW5lIiwKKwkJCSAgaWE2NF9tY2FfY3B1X29ubGluZSwgTlVMTCk7CiAJSUE2NF9NQ0FfREVCVUcoIiVzOiBDTUNJL1Agc2V0dXAgYW5kIGVuYWJsZWQuXG4iLCBfX2Z1bmNfXyk7CiAKICNpZmRlZiBDT05GSUdfQUNQSQpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gvbTMyci9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggY2FjNzAxNC4uNmY4OTgyMSAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL20zMnIvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC0yMTksNyArMjE5LDcgQEAKICNkZWZpbmUgX19nZXRfdXNlcl9ub2NoZWNrKHgsIHB0ciwgc2l6ZSkJCQkJXAogKHsJCQkJCQkJCQlcCiAJbG9uZyBfX2d1X2VyciA9IDA7CQkJCQkJXAotCXVuc2lnbmVkIGxvbmcgX19ndV92YWw7CQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgX19ndV92YWwgPSAwOwkJCQkJXAogCW1pZ2h0X2ZhdWx0KCk7CQkJCQkJCVwKIAlfX2dldF91c2VyX3NpemUoX19ndV92YWwsIChwdHIpLCAoc2l6ZSksIF9fZ3VfZXJyKTsJCVwKIAkoeCkgPSAoX19mb3JjZSBfX3R5cGVvZl9fKCoocHRyKSkpX19ndV92YWw7CQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL0tjb25maWcgYi9hcmNoL202OGsvS2NvbmZpZwppbmRleCA0OThiNTY3Li5kMTQwMjA2IDEwMDY0NAotLS0gYS9hcmNoL202OGsvS2NvbmZpZworKysgYi9hcmNoL202OGsvS2NvbmZpZwpAQCAtMTQsNyArMTQsNiBAQAogCXNlbGVjdCBHRU5FUklDX0lPTUFQCiAJc2VsZWN0IEdFTkVSSUNfU1RSTkNQWV9GUk9NX1VTRVIgaWYgTU1VCiAJc2VsZWN0IEdFTkVSSUNfU1RSTkxFTl9VU0VSIGlmIE1NVQotCXNlbGVjdCBGUFUgaWYgTU1VCiAJc2VsZWN0IEFSQ0hfV0FOVF9JUENfUEFSU0VfVkVSU0lPTgogCXNlbGVjdCBBUkNIX1VTRVNfR0VUVElNRU9GRlNFVCBpZiBNTVUgJiYgIUNPTERGSVJFCiAJc2VsZWN0IEhBVkVfRlVURVhfQ01QWENIRyBpZiBNTVUgJiYgRlVURVgKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9LY29uZmlnLmNwdSBiL2FyY2gvbTY4ay9LY29uZmlnLmNwdQppbmRleCA5NjcyNjBmLi5kMjIxOWYzMCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL0tjb25maWcuY3B1CisrKyBiL2FyY2gvbTY4ay9LY29uZmlnLmNwdQpAQCAtNjIsNiArNjIsNyBAQAogY29uZmlnIE02ODAyMAogCWJvb2wgIjY4MDIwIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBNTVUKKwlzZWxlY3QgRlBVCiAJc2VsZWN0IENQVV9IQVNfQUREUkVTU19TUEFDRVMKIAloZWxwCiAJICBJZiB5b3UgYW50aWNpcGF0ZSBydW5uaW5nIHRoaXMga2VybmVsIG9uIGEgY29tcHV0ZXIgd2l0aCBhIE1DNjgwMjAKQEAgLTcyLDYgKzczLDcgQEAKIGNvbmZpZyBNNjgwMzAKIAlib29sICI2ODAzMCBzdXBwb3J0IgogCWRlcGVuZHMgb24gTU1VICYmICFNTVVfU1VOMworCXNlbGVjdCBGUFUKIAlzZWxlY3QgQ1BVX0hBU19BRERSRVNTX1NQQUNFUwogCWhlbHAKIAkgIElmIHlvdSBhbnRpY2lwYXRlIHJ1bm5pbmcgdGhpcyBrZXJuZWwgb24gYSBjb21wdXRlciB3aXRoIGEgTUM2ODAzMApAQCAtODEsNiArODMsNyBAQAogY29uZmlnIE02ODA0MAogCWJvb2wgIjY4MDQwIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBNTVUgJiYgIU1NVV9TVU4zCisJc2VsZWN0IEZQVQogCXNlbGVjdCBDUFVfSEFTX0FERFJFU1NfU1BBQ0VTCiAJaGVscAogCSAgSWYgeW91IGFudGljaXBhdGUgcnVubmluZyB0aGlzIGtlcm5lbCBvbiBhIGNvbXB1dGVyIHdpdGggYSBNQzY4TEMwNDAKQEAgLTkxLDYgKzk0LDcgQEAKIGNvbmZpZyBNNjgwNjAKIAlib29sICI2ODA2MCBzdXBwb3J0IgogCWRlcGVuZHMgb24gTU1VICYmICFNTVVfU1VOMworCXNlbGVjdCBGUFUKIAlzZWxlY3QgQ1BVX0hBU19BRERSRVNTX1NQQUNFUwogCWhlbHAKIAkgIElmIHlvdSBhbnRpY2lwYXRlIHJ1bm5pbmcgdGhpcyBrZXJuZWwgb24gYSBjb21wdXRlciB3aXRoIGEgTUM2ODA2MApAQCAtMjU5LDYgKzI2Myw3IEBACiAJYm9vbCAiTUNGNTQ3eCIKIAlzZWxlY3QgTTU0eHgKIAlzZWxlY3QgTU1VX0NPTERGSVJFIGlmIE1NVQorCXNlbGVjdCBGUFUgaWYgTU1VCiAJc2VsZWN0IEhBVkVfQ0FDSEVfQ0IKIAlzZWxlY3QgSEFWRV9NQkFSCiAJc2VsZWN0IENQVV9OT19FRkZJQ0lFTlRfRkZTCkBAIC0yNjgsNiArMjczLDcgQEAKIGNvbmZpZyBNNTQ4eAogCWJvb2wgIk1DRjU0OHgiCiAJc2VsZWN0IE1NVV9DT0xERklSRSBpZiBNTVUKKwlzZWxlY3QgRlBVIGlmIE1NVQogCXNlbGVjdCBNNTR4eAogCXNlbGVjdCBIQVZFX0NBQ0hFX0NCCiAJc2VsZWN0IEhBVkVfTUJBUgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2FtaWdhL2NvbmZpZy5jIGIvYXJjaC9tNjhrL2FtaWdhL2NvbmZpZy5jCmluZGV4IGVjOWNjMWYuLmRkYjgxOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hbWlnYS9jb25maWcuYworKysgYi9hcmNoL202OGsvYW1pZ2EvY29uZmlnLmMKQEAgLTM5Niw3ICszOTYsNyBAQAogCW1hY2hfbWF4X2RtYV9hZGRyZXNzID0gMHhmZmZmZmZmZjsKIAogCW1hY2hfcmVzZXQgICAgICAgICAgID0gYW1pZ2FfcmVzZXQ7Ci0jaWYgZGVmaW5lZChDT05GSUdfSU5QVVRfTTY4S19CRUVQKSB8fCBkZWZpbmVkKENPTkZJR19JTlBVVF9NNjhLX0JFRVBfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lOUFVUX002OEtfQkVFUCkKIAltYWNoX2JlZXAgICAgICAgICAgICA9IGFtaWdhX21rc291bmQ7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2F0YXJpL2NvbmZpZy5jIGIvYXJjaC9tNjhrL2F0YXJpL2NvbmZpZy5jCmluZGV4IGNiZDU5OTEuLjk3YTNjMzggMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hdGFyaS9jb25maWcuYworKysgYi9hcmNoL202OGsvYXRhcmkvY29uZmlnLmMKQEAgLTIxMSw3ICsyMTEsNyBAQAogCWFyY2hfZ2V0dGltZW9mZnNldCAgID0gYXRhcmlfZ2V0dGltZW9mZnNldDsKIAltYWNoX3Jlc2V0ICAgICAgICAgICA9IGF0YXJpX3Jlc2V0OwogCW1hY2hfbWF4X2RtYV9hZGRyZXNzID0gMHhmZmZmZmY7Ci0jaWYgZGVmaW5lZChDT05GSUdfSU5QVVRfTTY4S19CRUVQKSB8fCBkZWZpbmVkKENPTkZJR19JTlBVVF9NNjhLX0JFRVBfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lOUFVUX002OEtfQkVFUCkKIAltYWNoX2JlZXAgICAgICAgICAgPSBhdGFyaV9ta3NvdW5kOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0hFQVJUQkVBVApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbGRmaXJlL2Nsay5jIGIvYXJjaC9tNjhrL2NvbGRmaXJlL2Nsay5jCmluZGV4IGZkZGZkY2MuLjFlM2M3ZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb2xkZmlyZS9jbGsuYworKysgYi9hcmNoL202OGsvY29sZGZpcmUvY2xrLmMKQEAgLTEwMSw2ICsxMDEsMTAgQEAKIHZvaWQgY2xrX2Rpc2FibGUoc3RydWN0IGNsayAqY2xrKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWNsaykKKwkJcmV0dXJuOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNsa19sb2NrLCBmbGFncyk7CiAJaWYgKCgtLWNsay0+ZW5hYmxlZCA9PSAwKSAmJiBjbGstPmNsa19vcHMpCiAJCWNsay0+Y2xrX29wcy0+ZGlzYWJsZShjbGspOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbGRmaXJlL2hlYWQuUyBiL2FyY2gvbTY4ay9jb2xkZmlyZS9oZWFkLlMKaW5kZXggNzNkOTJlYS4uYmRiNDcyYyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbGRmaXJlL2hlYWQuUworKysgYi9hcmNoL202OGsvY29sZGZpcmUvaGVhZC5TCkBAIC0yODAsMTAgKzI4MCwxMCBAQAogCW1vdmVsCSVkMCxtNjhrX2NwdXR5cGUJCS8qIE1hcmsgdXMgYXMgYSBDb2xkRmlyZSAqLwogCW1vdmVsCSNNTVVfQ09MREZJUkUsJWQwCiAJbW92ZWwJJWQwLG02OGtfbW11dHlwZQotCW1vdmVsCSNGUFVfQ09MREZJUkUsJWQwCi0JbW92ZWwJJWQwLG02OGtfZnB1dHlwZQotCW1vdmVsCSNNQUNIX001NFhYLCVkMAotCW1vdmVsCSVkMCxtNjhrX21hY2h0eXBlCQkvKiBNYXJrIHVzIGFzIGEgNTR4eCBtYWNoaW5lICovCisJbW92ZWwJI0ZQVVRZUEUsJWQwCisJbW92ZWwJJWQwLG02OGtfZnB1dHlwZQkJLyogTWFyayBGUFUgdHlwZSAqLworCW1vdmVsCSNNQUNISU5FLCVkMAorCW1vdmVsCSVkMCxtNjhrX21hY2h0eXBlCQkvKiBNYXJrIG1hY2hpbmUgdHlwZSAqLwogCWxlYQlpbml0X3Rhc2ssJWEyCQkJLyogU2V0ICJjdXJyZW50IiBpbml0IHRhc2sgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29sZGZpcmUvbTUyOHguYyBiL2FyY2gvbTY4ay9jb2xkZmlyZS9tNTI4eC5jCmluZGV4IDQ1ZTk0N2EuLjEyZjllMzcgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb2xkZmlyZS9tNTI4eC5jCisrKyBiL2FyY2gvbTY4ay9jb2xkZmlyZS9tNTI4eC5jCkBAIC0xMDIsMTQgKzEwMiwxNCBAQAogCXByaW50ayhLRVJOX0lORk8gIldpbGRGaXJlTW9kIGhpYmVybmF0aW5nLi4uXG4iKTsKIAogCS8qIFNldCBwb3J0RS41IHRvIERpZ2l0YWwgSU8gKi8KLQlNQ0Y1MjgyX0dQSU9fUEVQQVIgJj0gfigxIDw8ICg1ICogMikpOworCXdyaXRldyhyZWFkdyhNQ0ZHUElPX1BFUEFSKSAmIH4oMSA8PCAoNSAqIDIpKSwgTUNGR1BJT19QRVBBUik7CiAKIAkvKiBNYWtlIHBvcnRFLjUgYW4gb3V0cHV0ICovCi0JTUNGNTI4Ml9HUElPX0REUkUgfD0gKDEgPDwgNSk7CisJd3JpdGViKHJlYWRiKE1DRkdQSU9fUEREUl9FKSB8ICgxIDw8IDUpLCBNQ0ZHUElPX1BERFJfRSk7CiAKIAkvKiBOb3cgdG9nZ2xlIHBvcnRFLjUgZnJvbSBsb3cgdG8gaGlnaCAqLwotCU1DRjUyODJfR1BJT19QT1JURSAmPSB+KDEgPDwgNSk7Ci0JTUNGNTI4Ml9HUElPX1BPUlRFIHw9ICgxIDw8IDUpOworCXdyaXRlYihyZWFkYihNQ0ZHUElPX1BPRFJfRSkgJiB+KDEgPDwgNSksIE1DRkdQSU9fUE9EUl9FKTsKKwl3cml0ZWIocmVhZGIoTUNGR1BJT19QT0RSX0UpIHwgKDEgPDwgNSksIE1DRkdQSU9fUE9EUl9FKTsKIAogCXByaW50ayhLRVJOX0VNRVJHICJGYWlsZWQgdG8gaGliZXJuYXRlLiBIYWx0aW5nIVxuIik7CiB9CmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29sZGZpcmUvbTUzeHguYyBiL2FyY2gvbTY4ay9jb2xkZmlyZS9tNTN4eC5jCmluZGV4IDgwODc5YTcuLjI1MDJmNjMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb2xkZmlyZS9tNTN4eC5jCisrKyBiL2FyY2gvbTY4ay9jb2xkZmlyZS9tNTN4eC5jCkBAIC0yNzEsOSArMjcxLDYgQEAKIAogI2RlZmluZSBOQU5EX0ZMQVNIX0FERFJFU1MJKDB4RDAwMDAwMDApCiAKLWludCBzeXNfY2xrX2toeiA9IDA7Ci1pbnQgc3lzX2Nsa19taHogPSAwOwotCiB2b2lkIHd0bV9pbml0KHZvaWQpOwogdm9pZCBzY21faW5pdCh2b2lkKTsKIHZvaWQgZ3Bpb19pbml0KHZvaWQpOwpAQCAtMjg2LDkgKzI4Myw4IEBACiAKIGFzbWxpbmthZ2Ugdm9pZCBfX2luaXQgc3lzaW5pdCh2b2lkKQogewotCXN5c19jbGtfa2h6ID0gY2xvY2tfcGxsKDAsIDApOwotCXN5c19jbGtfbWh6ID0gc3lzX2Nsa19raHovMTAwMDsKLQkKKwljbG9ja19wbGwoMCwgMCk7CisKIAl3dG1faW5pdCgpOwogCXNjbV9pbml0KCk7CiAJZ3Bpb19pbml0KCk7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29sZGZpcmUvbTU0eHguYyBiL2FyY2gvbTY4ay9jb2xkZmlyZS9tNTR4eC5jCmluZGV4IGMzMmY3NjcuLjM4NmRmM2IgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb2xkZmlyZS9tNTR4eC5jCisrKyBiL2FyY2gvbTY4ay9jb2xkZmlyZS9tNTR4eC5jCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8YXNtL201NHh4Z3B0Lmg+CiAjaWZkZWYgQ09ORklHX01NVQogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgotI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgogI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC03OCw0NyArNzcsMTAgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmZGVmIENPTkZJR19NTVUKLQotdW5zaWduZWQgbG9uZyBudW1fcGFnZXM7Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBtY2Y1NHh4X2Jvb3RtZW1fYWxsb2Modm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbjsKLQl1bnNpZ25lZCBsb25nIG1lbXN0YXJ0OwotCi0JLyogX3JhbWJhc2UgYW5kIF9yYW1lbmQgd2lsbCBiZSBuYXR1cmFsbHkgcGFnZSBhbGlnbmVkICovCi0JbTY4a19tZW1vcnlbMF0uYWRkciA9IF9yYW1iYXNlOwotCW02OGtfbWVtb3J5WzBdLnNpemUgPSBfcmFtZW5kIC0gX3JhbWJhc2U7Ci0KLQkvKiBjb21wdXRlIHRvdGFsIHBhZ2VzIGluIHN5c3RlbSAqLwotCW51bV9wYWdlcyA9IFBGTl9ET1dOKF9yYW1lbmQgLSBfcmFtYmFzZSk7Ci0KLQkvKiBwYWdlIG51bWJlcnMgKi8KLQltZW1zdGFydCA9IFBBR0VfQUxJR04oX3JhbXN0YXJ0KTsKLQltaW5fbG93X3BmbiA9IFBGTl9ET1dOKF9yYW1iYXNlKTsKLQlzdGFydF9wZm4gPSBQRk5fRE9XTihtZW1zdGFydCk7Ci0JbWF4X3BmbiA9IG1heF9sb3dfcGZuID0gUEZOX0RPV04oX3JhbWVuZCk7Ci0JaGlnaF9tZW1vcnkgPSAodm9pZCAqKV9yYW1lbmQ7Ci0KLQltNjhrX3ZpcnRfdG9fbm9kZV9zaGlmdCA9IGZscyhfcmFtZW5kIC0gX3JhbWJhc2UgLSAxKSAtIDY7Ci0JbW9kdWxlX2ZpeHVwKE5VTEwsIF9fc3RhcnRfZml4dXAsIF9fc3RvcF9maXh1cCk7Ci0KLQkvKiBzZXR1cCBib290bWVtIGRhdGEgKi8KLQltNjhrX3NldHVwX25vZGUoMCk7Ci0JbWVtc3RhcnQgKz0gaW5pdF9ib290bWVtX25vZGUoTk9ERV9EQVRBKDApLCBzdGFydF9wZm4sCi0JCW1pbl9sb3dfcGZuLCBtYXhfbG93X3Bmbik7Ci0JZnJlZV9ib290bWVtX25vZGUoTk9ERV9EQVRBKDApLCBtZW1zdGFydCwgX3JhbWVuZCAtIG1lbXN0YXJ0KTsKLX0KLQotI2VuZGlmIC8qIENPTkZJR19NTVUgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogdm9pZCBfX2luaXQgY29uZmlnX0JTUChjaGFyICpjb21tYW5kcCwgaW50IHNpemUpCiB7CiAjaWZkZWYgQ09ORklHX01NVQotCW1jZjU0eHhfYm9vdG1lbV9hbGxvYygpOworCWNmX2Jvb3RtZW1fYWxsb2MoKTsKIAltbXVfY29udGV4dF9pbml0KCk7CiAjZW5kaWYKIAltYWNoX3Jlc2V0ID0gbWNmNTR4eF9yZXNldDsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL2FtaWdhX2RlZmNvbmZpZyBiL2FyY2gvbTY4ay9jb25maWdzL2FtaWdhX2RlZmNvbmZpZwppbmRleCA4ZjViNmY3Li41NWJlN2UzIDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9hbWlnYV9kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3MvYW1pZ2FfZGVmY29uZmlnCkBAIC01NjYsNiArNTY2LDggQEAKIENPTkZJR19URVNUX1NUQVRJQ19LRVlTPW0KIENPTkZJR19FQVJMWV9QUklOVEs9eQogQ09ORklHX0NSWVBUT19SU0E9bQorQ09ORklHX0NSWVBUT19ESD1tCitDT05GSUdfQ1JZUFRPX0VDREg9bQogQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKIENPTkZJR19DUllQVE9fVVNFUj1tCiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tCkBAIC01ODQsNiArNTg2LDcgQEAKIENPTkZJR19DUllQVE9fUk1EMjU2PW0KIENPTkZJR19DUllQVE9fUk1EMzIwPW0KIENPTkZJR19DUllQVE9fU0hBNTEyPW0KK0NPTkZJR19DUllQVE9fU0hBMz1tCiBDT05GSUdfQ1JZUFRPX1RHUjE5Mj1tCiBDT05GSUdfQ1JZUFRPX1dQNTEyPW0KIENPTkZJR19DUllQVE9fQU5VQklTPW0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL2Fwb2xsb19kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9hcG9sbG9fZGVmY29uZmlnCmluZGV4IDMxYmRlZDkuLjM2NWRkYTY2IDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9hcG9sbG9fZGVmY29uZmlnCisrKyBiL2FyY2gvbTY4ay9jb25maWdzL2Fwb2xsb19kZWZjb25maWcKQEAgLTUyNSw2ICs1MjUsOCBAQAogQ09ORklHX1RFU1RfU1RBVElDX0tFWVM9bQogQ09ORklHX0VBUkxZX1BSSU5USz15CiBDT05GSUdfQ1JZUFRPX1JTQT1tCitDT05GSUdfQ1JZUFRPX0RIPW0KK0NPTkZJR19DUllQVE9fRUNESD1tCiBDT05GSUdfQ1JZUFRPX01BTkFHRVI9eQogQ09ORklHX0NSWVBUT19VU0VSPW0KIENPTkZJR19DUllQVE9fQ1JZUFREPW0KQEAgLTU0Myw2ICs1NDUsNyBAQAogQ09ORklHX0NSWVBUT19STUQyNTY9bQogQ09ORklHX0NSWVBUT19STUQzMjA9bQogQ09ORklHX0NSWVBUT19TSEE1MTI9bQorQ09ORklHX0NSWVBUT19TSEEzPW0KIENPTkZJR19DUllQVE9fVEdSMTkyPW0KIENPTkZJR19DUllQVE9fV1A1MTI9bQogQ09ORklHX0NSWVBUT19BTlVCSVM9bQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3MvYXRhcmlfZGVmY29uZmlnIGIvYXJjaC9tNjhrL2NvbmZpZ3MvYXRhcmlfZGVmY29uZmlnCmluZGV4IDBkNzczOWUuLmNlM2NiZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb25maWdzL2F0YXJpX2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9hdGFyaV9kZWZjb25maWcKQEAgLTU0Niw2ICs1NDYsOCBAQAogQ09ORklHX1RFU1RfU1RBVElDX0tFWVM9bQogQ09ORklHX0VBUkxZX1BSSU5USz15CiBDT05GSUdfQ1JZUFRPX1JTQT1tCitDT05GSUdfQ1JZUFRPX0RIPW0KK0NPTkZJR19DUllQVE9fRUNESD1tCiBDT05GSUdfQ1JZUFRPX01BTkFHRVI9eQogQ09ORklHX0NSWVBUT19VU0VSPW0KIENPTkZJR19DUllQVE9fQ1JZUFREPW0KQEAgLTU2NCw2ICs1NjYsNyBAQAogQ09ORklHX0NSWVBUT19STUQyNTY9bQogQ09ORklHX0NSWVBUT19STUQzMjA9bQogQ09ORklHX0NSWVBUT19TSEE1MTI9bQorQ09ORklHX0NSWVBUT19TSEEzPW0KIENPTkZJR19DUllQVE9fVEdSMTkyPW0KIENPTkZJR19DUllQVE9fV1A1MTI9bQogQ09ORklHX0NSWVBUT19BTlVCSVM9bQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3MvYnZtZTYwMDBfZGVmY29uZmlnIGIvYXJjaC9tNjhrL2NvbmZpZ3MvYnZtZTYwMDBfZGVmY29uZmlnCmluZGV4IDJjYmI1YzQuLjhkYjQ5NmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb25maWdzL2J2bWU2MDAwX2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9idm1lNjAwMF9kZWZjb25maWcKQEAgLTUxNyw2ICs1MTcsOCBAQAogQ09ORklHX1RFU1RfU1RBVElDX0tFWVM9bQogQ09ORklHX0VBUkxZX1BSSU5USz15CiBDT05GSUdfQ1JZUFRPX1JTQT1tCitDT05GSUdfQ1JZUFRPX0RIPW0KK0NPTkZJR19DUllQVE9fRUNESD1tCiBDT05GSUdfQ1JZUFRPX01BTkFHRVI9eQogQ09ORklHX0NSWVBUT19VU0VSPW0KIENPTkZJR19DUllQVE9fQ1JZUFREPW0KQEAgLTUzNSw2ICs1MzcsNyBAQAogQ09ORklHX0NSWVBUT19STUQyNTY9bQogQ09ORklHX0NSWVBUT19STUQzMjA9bQogQ09ORklHX0NSWVBUT19TSEE1MTI9bQorQ09ORklHX0NSWVBUT19TSEEzPW0KIENPTkZJR19DUllQVE9fVEdSMTkyPW0KIENPTkZJR19DUllQVE9fV1A1MTI9bQogQ09ORklHX0NSWVBUT19BTlVCSVM9bQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3MvaHAzMDBfZGVmY29uZmlnIGIvYXJjaC9tNjhrL2NvbmZpZ3MvaHAzMDBfZGVmY29uZmlnCmluZGV4IDk2MTAyYTQuLjgzMTQxNTYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb25maWdzL2hwMzAwX2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9ocDMwMF9kZWZjb25maWcKQEAgLTUyNyw2ICs1MjcsOCBAQAogQ09ORklHX1RFU1RfU1RBVElDX0tFWVM9bQogQ09ORklHX0VBUkxZX1BSSU5USz15CiBDT05GSUdfQ1JZUFRPX1JTQT1tCitDT05GSUdfQ1JZUFRPX0RIPW0KK0NPTkZJR19DUllQVE9fRUNESD1tCiBDT05GSUdfQ1JZUFRPX01BTkFHRVI9eQogQ09ORklHX0NSWVBUT19VU0VSPW0KIENPTkZJR19DUllQVE9fQ1JZUFREPW0KQEAgLTU0NSw2ICs1NDcsNyBAQAogQ09ORklHX0NSWVBUT19STUQyNTY9bQogQ09ORklHX0NSWVBUT19STUQzMjA9bQogQ09ORklHX0NSWVBUT19TSEE1MTI9bQorQ09ORklHX0NSWVBUT19TSEEzPW0KIENPTkZJR19DUllQVE9fVEdSMTkyPW0KIENPTkZJR19DUllQVE9fV1A1MTI9bQogQ09ORklHX0NSWVBUT19BTlVCSVM9bQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3MvbWFjX2RlZmNvbmZpZyBiL2FyY2gvbTY4ay9jb25maWdzL21hY19kZWZjb25maWcKaW5kZXggOTdkODhmNy4uNjYwMDI3MCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3MvbWFjX2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9tYWNfZGVmY29uZmlnCkBAIC01NDksNiArNTQ5LDggQEAKIENPTkZJR19URVNUX1NUQVRJQ19LRVlTPW0KIENPTkZJR19FQVJMWV9QUklOVEs9eQogQ09ORklHX0NSWVBUT19SU0E9bQorQ09ORklHX0NSWVBUT19ESD1tCitDT05GSUdfQ1JZUFRPX0VDREg9bQogQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKIENPTkZJR19DUllQVE9fVVNFUj1tCiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tCkBAIC01NjcsNiArNTY5LDcgQEAKIENPTkZJR19DUllQVE9fUk1EMjU2PW0KIENPTkZJR19DUllQVE9fUk1EMzIwPW0KIENPTkZJR19DUllQVE9fU0hBNTEyPW0KK0NPTkZJR19DUllQVE9fU0hBMz1tCiBDT05GSUdfQ1JZUFRPX1RHUjE5Mj1tCiBDT05GSUdfQ1JZUFRPX1dQNTEyPW0KIENPTkZJR19DUllQVE9fQU5VQklTPW0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL211bHRpX2RlZmNvbmZpZyBiL2FyY2gvbTY4ay9jb25maWdzL211bHRpX2RlZmNvbmZpZwppbmRleCBiZTI1ZWYyLi45MGFiZmU5IDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9tdWx0aV9kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3MvbXVsdGlfZGVmY29uZmlnCkBAIC02MjksNiArNjI5LDggQEAKIENPTkZJR19URVNUX1NUQVRJQ19LRVlTPW0KIENPTkZJR19FQVJMWV9QUklOVEs9eQogQ09ORklHX0NSWVBUT19SU0E9bQorQ09ORklHX0NSWVBUT19ESD1tCitDT05GSUdfQ1JZUFRPX0VDREg9bQogQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKIENPTkZJR19DUllQVE9fVVNFUj1tCiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tCkBAIC02NDcsNiArNjQ5LDcgQEAKIENPTkZJR19DUllQVE9fUk1EMjU2PW0KIENPTkZJR19DUllQVE9fUk1EMzIwPW0KIENPTkZJR19DUllQVE9fU0hBNTEyPW0KK0NPTkZJR19DUllQVE9fU0hBMz1tCiBDT05GSUdfQ1JZUFRPX1RHUjE5Mj1tCiBDT05GSUdfQ1JZUFRPX1dQNTEyPW0KIENPTkZJR19DUllQVE9fQU5VQklTPW0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL212bWUxNDdfZGVmY29uZmlnIGIvYXJjaC9tNjhrL2NvbmZpZ3MvbXZtZTE0N19kZWZjb25maWcKaW5kZXggYTAwODM0NC4uMGQ1MDJjMiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3MvbXZtZTE0N19kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3MvbXZtZTE0N19kZWZjb25maWcKQEAgLTUxNyw2ICs1MTcsOCBAQAogQ09ORklHX1RFU1RfU1RBVElDX0tFWVM9bQogQ09ORklHX0VBUkxZX1BSSU5USz15CiBDT05GSUdfQ1JZUFRPX1JTQT1tCitDT05GSUdfQ1JZUFRPX0RIPW0KK0NPTkZJR19DUllQVE9fRUNESD1tCiBDT05GSUdfQ1JZUFRPX01BTkFHRVI9eQogQ09ORklHX0NSWVBUT19VU0VSPW0KIENPTkZJR19DUllQVE9fQ1JZUFREPW0KQEAgLTUzNSw2ICs1MzcsNyBAQAogQ09ORklHX0NSWVBUT19STUQyNTY9bQogQ09ORklHX0NSWVBUT19STUQzMjA9bQogQ09ORklHX0NSWVBUT19TSEE1MTI9bQorQ09ORklHX0NSWVBUT19TSEEzPW0KIENPTkZJR19DUllQVE9fVEdSMTkyPW0KIENPTkZJR19DUllQVE9fV1A1MTI9bQogQ09ORklHX0NSWVBUT19BTlVCSVM9bQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3MvbXZtZTE2eF9kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9tdm1lMTZ4X2RlZmNvbmZpZwppbmRleCA2NzM1YTI1Li41OTMwZTkxIDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9tdm1lMTZ4X2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9tdm1lMTZ4X2RlZmNvbmZpZwpAQCAtNTE3LDYgKzUxNyw4IEBACiBDT05GSUdfVEVTVF9TVEFUSUNfS0VZUz1tCiBDT05GSUdfRUFSTFlfUFJJTlRLPXkKIENPTkZJR19DUllQVE9fUlNBPW0KK0NPTkZJR19DUllQVE9fREg9bQorQ09ORklHX0NSWVBUT19FQ0RIPW0KIENPTkZJR19DUllQVE9fTUFOQUdFUj15CiBDT05GSUdfQ1JZUFRPX1VTRVI9bQogQ09ORklHX0NSWVBUT19DUllQVEQ9bQpAQCAtNTM1LDYgKzUzNyw3IEBACiBDT05GSUdfQ1JZUFRPX1JNRDI1Nj1tCiBDT05GSUdfQ1JZUFRPX1JNRDMyMD1tCiBDT05GSUdfQ1JZUFRPX1NIQTUxMj1tCitDT05GSUdfQ1JZUFRPX1NIQTM9bQogQ09ORklHX0NSWVBUT19UR1IxOTI9bQogQ09ORklHX0NSWVBUT19XUDUxMj1tCiBDT05GSUdfQ1JZUFRPX0FOVUJJUz1tCmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29uZmlncy9xNDBfZGVmY29uZmlnIGIvYXJjaC9tNjhrL2NvbmZpZ3MvcTQwX2RlZmNvbmZpZwppbmRleCA3ODBjNmU5Li43NGUzYWQ4IDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9xNDBfZGVmY29uZmlnCisrKyBiL2FyY2gvbTY4ay9jb25maWdzL3E0MF9kZWZjb25maWcKQEAgLTU0MCw2ICs1NDAsOCBAQAogQ09ORklHX1RFU1RfU1RBVElDX0tFWVM9bQogQ09ORklHX0VBUkxZX1BSSU5USz15CiBDT05GSUdfQ1JZUFRPX1JTQT1tCitDT05GSUdfQ1JZUFRPX0RIPW0KK0NPTkZJR19DUllQVE9fRUNESD1tCiBDT05GSUdfQ1JZUFRPX01BTkFHRVI9eQogQ09ORklHX0NSWVBUT19VU0VSPW0KIENPTkZJR19DUllQVE9fQ1JZUFREPW0KQEAgLTU1OCw2ICs1NjAsNyBAQAogQ09ORklHX0NSWVBUT19STUQyNTY9bQogQ09ORklHX0NSWVBUT19STUQzMjA9bQogQ09ORklHX0NSWVBUT19TSEE1MTI9bQorQ09ORklHX0NSWVBUT19TSEEzPW0KIENPTkZJR19DUllQVE9fVEdSMTkyPW0KIENPTkZJR19DUllQVE9fV1A1MTI9bQogQ09ORklHX0NSWVBUT19BTlVCSVM9bQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3Mvc3VuM19kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9zdW4zX2RlZmNvbmZpZwppbmRleCA0NDY5M2NmLi40YmE4NjA2IDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9zdW4zX2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9zdW4zX2RlZmNvbmZpZwpAQCAtNTE4LDYgKzUxOCw4IEBACiBDT05GSUdfVEVTVF9VREVMQVk9bQogQ09ORklHX1RFU1RfU1RBVElDX0tFWVM9bQogQ09ORklHX0NSWVBUT19SU0E9bQorQ09ORklHX0NSWVBUT19ESD1tCitDT05GSUdfQ1JZUFRPX0VDREg9bQogQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKIENPTkZJR19DUllQVE9fVVNFUj1tCiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tCkBAIC01MzYsNiArNTM4LDcgQEAKIENPTkZJR19DUllQVE9fUk1EMjU2PW0KIENPTkZJR19DUllQVE9fUk1EMzIwPW0KIENPTkZJR19DUllQVE9fU0hBNTEyPW0KK0NPTkZJR19DUllQVE9fU0hBMz1tCiBDT05GSUdfQ1JZUFRPX1RHUjE5Mj1tCiBDT05GSUdfQ1JZUFRPX1dQNTEyPW0KIENPTkZJR19DUllQVE9fQU5VQklTPW0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL3N1bjN4X2RlZmNvbmZpZyBiL2FyY2gvbTY4ay9jb25maWdzL3N1bjN4X2RlZmNvbmZpZwppbmRleCBlZjAwNzFkLi5jNmY0OTcyIDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9zdW4zeF9kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3Mvc3VuM3hfZGVmY29uZmlnCkBAIC01MTksNiArNTE5LDggQEAKIENPTkZJR19URVNUX1NUQVRJQ19LRVlTPW0KIENPTkZJR19FQVJMWV9QUklOVEs9eQogQ09ORklHX0NSWVBUT19SU0E9bQorQ09ORklHX0NSWVBUT19ESD1tCitDT05GSUdfQ1JZUFRPX0VDREg9bQogQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKIENPTkZJR19DUllQVE9fVVNFUj1tCiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tCkBAIC01MzcsNiArNTM5LDcgQEAKIENPTkZJR19DUllQVE9fUk1EMjU2PW0KIENPTkZJR19DUllQVE9fUk1EMzIwPW0KIENPTkZJR19DUllQVE9fU0hBNTEyPW0KK0NPTkZJR19DUllQVE9fU0hBMz1tCiBDT05GSUdfQ1JZUFRPX1RHUjE5Mj1tCiBDT05GSUdfQ1JZUFRPX1dQNTEyPW0KIENPTkZJR19DUllQVE9fQU5VQklTPW0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9ib290aW5mby5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2Jvb3RpbmZvLmgKaW5kZXggOGUyMTMyNi4uODFjOTFhZiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2Jvb3RpbmZvLmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2Jvb3RpbmZvLmgKQEAgLTIyLDYgKzIyLDEyIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9ib290aW5mbyhjb25zdCBzdHJ1Y3QgYmlfcmVjb3JkICpiaSkge30KICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1VCT09UCit2b2lkIHByb2Nlc3NfdWJvb3RfY29tbWFuZGxpbmUoY2hhciAqY29tbWFuZHAsIGludCBzaXplKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcHJvY2Vzc191Ym9vdF9jb21tYW5kbGluZShjaGFyICpjb21tYW5kcCwgaW50IHNpemUpIHt9CisjZW5kaWYKKwogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tNTQ0MXhzaW0uaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tNTQ0MXhzaW0uaAppbmRleCBjYzc5OGFiLi42NGY2MGJlIDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vbTU0NDF4c2ltLmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL201NDQxeHNpbS5oCkBAIC0xMCw2ICsxMCwxMCBAQAogI2RlZmluZSBDUFVfTkFNRQkJIkNPTERGSVJFKG01NDQxeCkiCiAjZGVmaW5lIENQVV9JTlNUUl9QRVJfSklGRlkJMgogI2RlZmluZSBNQ0ZfQlVTQ0xLCQkoTUNGX0NMSyAvIDIpCisjZGVmaW5lIE1BQ0hJTkUJCQlNQUNIX001NDQxWAorI2RlZmluZSBGUFVUWVBFCQkJMAorI2RlZmluZSBJT01FTUJBU0UJCTB4ZTAwMDAwMDAKKyNkZWZpbmUgSU9NRU1TSVpFCQkweDIwMDAwMDAwCiAKICNpbmNsdWRlIDxhc20vbTU0eHhhY3IuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL201NHh4YWNyLmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vbTU0eHhhY3IuaAppbmRleCA1OWUxNzEwLi5jNmFjMDVjIDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vbTU0eHhhY3IuaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vbTU0eHhhY3IuaApAQCAtOTQsNyArOTQsNyBAQAogICoJcmVnaXN0ZXIgcmVnaW9uIGFzIG5vbi1jYWNoZWFibGUuIEFuZCB0aGVuIHdlIG1hcCBhbGwgb3VyIFJBTSBhcwogICoJY2FjaGVhYmxlIGFuZCBzdXBlcnZpc29yIGFjY2VzcyBvbmx5LgogICovCi0jZGVmaW5lIEFDUjBfTU9ERQkoQUNSX0JBKENPTkZJR19NQkFSKStBQ1JfQURNU0soMHgxMDAwMDAwKSsgXAorI2RlZmluZSBBQ1IwX01PREUJKEFDUl9CQShJT01FTUJBU0UpK0FDUl9BRE1TSyhJT01FTVNJWkUpKyBcCiAJCQkgQUNSX0VOQUJMRStBQ1JfU1VQRVIrQUNSX0NNX09GRl9QUkUrQUNSX1NQKQogI2lmIGRlZmluZWQoQ09ORklHX0NBQ0hFX0NPUFlCQUNLKQogI2RlZmluZSBBQ1IxX01PREUJKEFDUl9CQShDT05GSUdfUkFNQkFTRSkrQUNSX0FETVNLKENPTkZJR19SQU1TSVpFKSsgXApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL201NHh4c2ltLmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vbTU0eHhzaW0uaAppbmRleCBhNWZiZDE3Li43M2Q5MzdmIDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vbTU0eHhzaW0uaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vbTU0eHhzaW0uaApAQCAtOCw2ICs4LDEwIEBACiAjZGVmaW5lCUNQVV9OQU1FCQkiQ09MREZJUkUobTU0eHgpIgogI2RlZmluZQlDUFVfSU5TVFJfUEVSX0pJRkZZCTIKICNkZWZpbmUJTUNGX0JVU0NMSwkJKE1DRl9DTEsgLyAyKQorI2RlZmluZQlNQUNISU5FCQkJTUFDSF9NNTRYWAorI2RlZmluZQlGUFVUWVBFCQkJRlBVX0NPTERGSVJFCisjZGVmaW5lCUlPTUVNQkFTRQkJTUNGX01CQVIKKyNkZWZpbmUJSU9NRU1TSVpFCQkweDAxMDAwMDAwCiAKICNpbmNsdWRlIDxhc20vbTU0eHhhY3IuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL21jZm1tdS5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL21jZm1tdS5oCmluZGV4IDg4MjQyMzYuLjEwZjk5MzAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tY2ZtbXUuaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vbWNmbW11LmgKQEAgLTEwNSw2ICsxMDUsNyBAQAogCV9fYXNtX18gX192b2xhdGlsZV9fICgibm9wIik7CiB9CiAKK3ZvaWQgY2ZfYm9vdG1lbV9hbGxvYyh2b2lkKTsKIGludCBjZl90bGJfbWlzcyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHdyaXRlLCBpbnQgZHRsYiwgaW50IGV4dGVuc2lvbl93b3JkKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vbmV0dGVsLmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vbmV0dGVsLmgKaW5kZXggMmE3YTc2Ni4uOTI2Mzc1ZCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL25ldHRlbC5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9uZXR0ZWwuaApAQCAtOTIsNyArOTIsNyBAQAogCiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIG1jZl9zZXRwcGRhdGEodW5zaWduZWQgaW50IG1hc2ssIHVuc2lnbmVkIGludCBiaXRzKQogewotCXdyaXRlKChyZWFkdyhNQ0ZTSU1fUEJEQVQpICYgfm1hc2spIHwgYml0cywgTUNGU0lNX1BCREFUKTsKKwl3cml0ZXcoKHJlYWR3KE1DRlNJTV9QQkRBVCkgJiB+bWFzaykgfCBiaXRzLCBNQ0ZTSU1fUEJEQVQpOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL3VhcGkvYXNtL2Jvb3RpbmZvLmggYi9hcmNoL202OGsvaW5jbHVkZS91YXBpL2FzbS9ib290aW5mby5oCmluZGV4IGNkZWIyNmEwLi5hNDhjZjU0IDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS91YXBpL2FzbS9ib290aW5mby5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL3VhcGkvYXNtL2Jvb3RpbmZvLmgKQEAgLTgxLDYgKzgxLDcgQEAKICNkZWZpbmUgTUFDSF9RNDAJCTEwCiAjZGVmaW5lIE1BQ0hfU1VOM1gJCTExCiAjZGVmaW5lIE1BQ0hfTTU0WFgJCTEyCisjZGVmaW5lIE1BQ0hfTTU0NDFYCQkxMwogCiAKICAgICAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvbTY4ay9rZXJuZWwvTWFrZWZpbGUKaW5kZXggZTQ3Nzc4Zi4uOGExYzRkMyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL202OGsva2VybmVsL01ha2VmaWxlCkBAIC0yNCw2ICsyNCw3IEBACiAKIG9iai0kKENPTkZJR19LRVhFQykJCSs9IG1hY2hpbmVfa2V4ZWMubyByZWxvY2F0ZV9rZXJuZWwubwogb2JqLSQoQ09ORklHX0JPT1RJTkZPX1BST0MpCSs9IGJvb3RpbmZvX3Byb2Mubworb2JqLSQoQ09ORklHX1VCT09UKQkJKz0gdWJvb3QubwogCiBvYmotJChDT05GSUdfRUFSTFlfUFJJTlRLKQkrPSBlYXJseV9wcmludGsubwogCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvbTY4ay9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGM1NWZmNzEuLjRiYTFhZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0yMDMsMTEgKzIwMyw4IEBACiB9CiAKIC8qIEZpbGwgaW4gdGhlIGZwdSBzdHJ1Y3R1cmUgZm9yIGEgY29yZSBkdW1wLiAgKi8KLSNpZmRlZiBDT05GSUdfRlBVCiBpbnQgZHVtcF9mcHUgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3QgdXNlcl9tNjhrZnBfc3RydWN0ICpmcHUpCiB7Ci0JY2hhciBmcHVzdGF0ZVsyMTZdOwotCiAJaWYgKEZQVV9JU19FTVUpIHsKIAkJaW50IGk7CiAKQEAgLTIyMiwzNyArMjE5LDQwIEBACiAJCXJldHVybiAxOwogCX0KIAotCS8qIEZpcnN0IGR1bXAgdGhlIGZwdSBjb250ZXh0IHRvIGF2b2lkIHByb3RvY29sIHZpb2xhdGlvbi4gICovCi0JYXNtIHZvbGF0aWxlICgiZnNhdmUgJTAiIDo6ICJtIiAoZnB1c3RhdGVbMF0pIDogIm1lbW9yeSIpOwotCWlmICghQ1BVX0lTXzA2MCA/ICFmcHVzdGF0ZVswXSA6ICFmcHVzdGF0ZVsyXSkKLQkJcmV0dXJuIDA7CisJaWYgKElTX0VOQUJMRUQoQ09ORklHX0ZQVSkpIHsKKwkJY2hhciBmcHVzdGF0ZVsyMTZdOwogCi0JaWYgKENQVV9JU19DT0xERklSRSkgewotCQlhc20gdm9sYXRpbGUgKCJmbW92ZWwgJS9mcGlhciwlMFxuXHQiCi0JCQkgICAgICAiZm1vdmVsICUvZnBjciwlMVxuXHQiCi0JCQkgICAgICAiZm1vdmVsICUvZnBzciwlMlxuXHQiCi0JCQkgICAgICAiZm1vdmVtZCAlL2ZwMC0lL2ZwNywlMyIKLQkJCSAgICAgIDoKLQkJCSAgICAgIDogIm0iIChmcHUtPmZwY250bFswXSksCi0JCQkJIm0iIChmcHUtPmZwY250bFsxXSksCi0JCQkJIm0iIChmcHUtPmZwY250bFsyXSksCi0JCQkJIm0iIChmcHUtPmZwcmVnc1swXSkKLQkJCSAgICAgIDogIm1lbW9yeSIpOwotCX0gZWxzZSB7Ci0JCWFzbSB2b2xhdGlsZSAoImZtb3ZlbSAlL2ZwaWFyLyUvZnBjci8lL2Zwc3IsJTAiCi0JCQkgICAgICA6Ci0JCQkgICAgICA6ICJtIiAoZnB1LT5mcGNudGxbMF0pCi0JCQkgICAgICA6ICJtZW1vcnkiKTsKLQkJYXNtIHZvbGF0aWxlICgiZm1vdmVteCAlL2ZwMC0lL2ZwNywlMCIKLQkJCSAgICAgIDoKLQkJCSAgICAgIDogIm0iIChmcHUtPmZwcmVnc1swXSkKLQkJCSAgICAgIDogIm1lbW9yeSIpOworCQkvKiBGaXJzdCBkdW1wIHRoZSBmcHUgY29udGV4dCB0byBhdm9pZCBwcm90b2NvbCB2aW9sYXRpb24uICAqLworCQlhc20gdm9sYXRpbGUgKCJmc2F2ZSAlMCIgOjogIm0iIChmcHVzdGF0ZVswXSkgOiAibWVtb3J5Iik7CisJCWlmICghQ1BVX0lTXzA2MCA/ICFmcHVzdGF0ZVswXSA6ICFmcHVzdGF0ZVsyXSkKKwkJCXJldHVybiAwOworCisJCWlmIChDUFVfSVNfQ09MREZJUkUpIHsKKwkJCWFzbSB2b2xhdGlsZSAoImZtb3ZlbCAlL2ZwaWFyLCUwXG5cdCIKKwkJCQkgICAgICAiZm1vdmVsICUvZnBjciwlMVxuXHQiCisJCQkJICAgICAgImZtb3ZlbCAlL2Zwc3IsJTJcblx0IgorCQkJCSAgICAgICJmbW92ZW1kICUvZnAwLSUvZnA3LCUzIgorCQkJCSAgICAgIDoKKwkJCQkgICAgICA6ICJtIiAoZnB1LT5mcGNudGxbMF0pLAorCQkJCQkibSIgKGZwdS0+ZnBjbnRsWzFdKSwKKwkJCQkJIm0iIChmcHUtPmZwY250bFsyXSksCisJCQkJCSJtIiAoZnB1LT5mcHJlZ3NbMF0pCisJCQkJICAgICAgOiAibWVtb3J5Iik7CisJCX0gZWxzZSB7CisJCQlhc20gdm9sYXRpbGUgKCJmbW92ZW0gJS9mcGlhci8lL2ZwY3IvJS9mcHNyLCUwIgorCQkJCSAgICAgIDoKKwkJCQkgICAgICA6ICJtIiAoZnB1LT5mcGNudGxbMF0pCisJCQkJICAgICAgOiAibWVtb3J5Iik7CisJCQlhc20gdm9sYXRpbGUgKCJmbW92ZW14ICUvZnAwLSUvZnA3LCUwIgorCQkJCSAgICAgIDoKKwkJCQkgICAgICA6ICJtIiAoZnB1LT5mcHJlZ3NbMF0pCisJCQkJICAgICAgOiAibWVtb3J5Iik7CisJCX0KIAl9CiAKIAlyZXR1cm4gMTsKIH0KIEVYUE9SVF9TWU1CT0woZHVtcF9mcHUpOwotI2VuZGlmIC8qIENPTkZJR19GUFUgKi8KIAogdW5zaWduZWQgbG9uZyBnZXRfd2NoYW4oc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9zZXR1cF9tbS5jIGIvYXJjaC9tNjhrL2tlcm5lbC9zZXR1cF9tbS5jCmluZGV4IDViOGVjNGQuLjdhMmMyMTIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvc2V0dXBfbW0uYworKysgYi9hcmNoL202OGsva2VybmVsL3NldHVwX21tLmMKQEAgLTEwNSw3ICsxMDUsNyBAQAogI2lmZGVmIENPTkZJR19NNjhLX0wyX0NBQ0hFCiB2b2lkICgqbWFjaF9sMl9mbHVzaCkgKGludCk7CiAjZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19JTlBVVF9NNjhLX0JFRVApIHx8IGRlZmluZWQoQ09ORklHX0lOUFVUX002OEtfQkVFUF9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSU5QVVRfTTY4S19CRUVQKQogdm9pZCAoKm1hY2hfYmVlcCkodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwogRVhQT1JUX1NZTUJPTChtYWNoX2JlZXApOwogI2VuZGlmCkBAIC0yNDUsNyArMjQ1LDcgQEAKIAkgKiBXZSBzaG91bGQgcmVhbGx5IGRvIG91ciBvd24gRlBVIGNoZWNrIGF0IHN0YXJ0dXAuCiAJICogW3doYXQgZG8gd2UgZG8gd2l0aCBidWdneSA2OExDMDQwcz8gaWYgd2UgaGF2ZSBwcm9ibGVtcwogCSAqICB3aXRoIHRoZW0sIHdlIHNob3VsZCBhZGQgYSB0ZXN0IHRvIGNoZWNrX2J1Z3MoKSBiZWxvd10gKi8KLSNpZm5kZWYgQ09ORklHX002OEtGUFVfRU1VX09OTFkKKyNpZiBkZWZpbmVkKENPTkZJR19GUFUpICYmICFkZWZpbmVkKENPTkZJR19NNjhLRlBVX0VNVV9PTkxZKQogCS8qIGNsZWFyIHRoZSBmcHUgaWYgd2UgaGF2ZSBvbmUgKi8KIAlpZiAobTY4a19mcHV0eXBlICYgKEZQVV82ODg4MXxGUFVfNjg4ODJ8RlBVXzY4MDQwfEZQVV82ODA2MHxGUFVfQ09MREZJUkUpKSB7CiAJCXZvbGF0aWxlIGludCB6ZXJvID0gMDsKQEAgLTI3NCw2ICsyNzQsNyBAQAogCXN0cm5jcHkobTY4a19jb21tYW5kX2xpbmUsIENPTkZJR19CT09UUEFSQU1fU1RSSU5HLCBDTF9TSVpFKTsKIAltNjhrX2NvbW1hbmRfbGluZVtDTF9TSVpFIC0gMV0gPSAwOwogI2VuZGlmIC8qIENPTkZJR19CT09UUEFSQU0gKi8KKwlwcm9jZXNzX3Vib290X2NvbW1hbmRsaW5lKCZtNjhrX2NvbW1hbmRfbGluZVswXSwgQ0xfU0laRSk7CiAJKmNtZGxpbmVfcCA9IG02OGtfY29tbWFuZF9saW5lOwogCW1lbWNweShib290X2NvbW1hbmRfbGluZSwgKmNtZGxpbmVfcCwgQ0xfU0laRSk7CiAKQEAgLTM0MSw2ICszNDIsNyBAQAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0NPTERGSVJFCiAJY2FzZSBNQUNIX001NFhYOgorCWNhc2UgTUFDSF9NNTQ0MVg6CiAJCWNvbmZpZ19CU1AoTlVMTCwgMCk7CiAJCWJyZWFrOwogI2VuZGlmCkBAIC01NDgsNyArNTUwLDcgQEAKIAogdm9pZCBjaGVja19idWdzKHZvaWQpCiB7Ci0jaWZuZGVmIENPTkZJR19NNjhLRlBVX0VNVQorI2lmIGRlZmluZWQoQ09ORklHX0ZQVSkgJiYgIWRlZmluZWQoQ09ORklHX002OEtGUFVfRU1VKQogCWlmIChtNjhrX2ZwdXR5cGUgPT0gMCkgewogCQlwcl9lbWVyZygiKioqIFlPVSBETyBOT1QgSEFWRSBBIEZMT0FUSU5HIFBPSU5UIFVOSVQsICIKIAkJCSJXSElDSCBJUyBSRVFVSVJFRCBCWSBMSU5VWC9NNjhLICoqKlxuIik7CmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3NldHVwX25vLmMgYi9hcmNoL202OGsva2VybmVsL3NldHVwX25vLmMKaW5kZXggOTMwOTc4OS4uOGFmZTZmNiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9zZXR1cF9uby5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvc2V0dXBfbm8uYwpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogCiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTgyLDY5ICs4Myw2IEBACiAjZGVmaW5lCUNQVV9JTlNUUl9QRVJfSklGRlkJMTYKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfVUJPT1QpCi0vKgotICogcGFyc2VfdWJvb3RfY29tbWFuZGxpbmUKLSAqCi0gKiBDb3BpZXMgdS1ib290IGNvbW1hbmRsaW5lIGFyZ3VtZW50cyBhbmQgc3RvcmUgdGhlbSBpbiB0aGUgcHJvcGVyIGxpbnV4Ci0gKiB2YXJpYWJsZXMuCi0gKgotICogQXNzdW1lczoKLSAqCV9pbml0X3NwIGdsb2JhbCBjb250YWlucyB0aGUgYWRkcmVzcyBpbiB0aGUgc3RhY2sgcG9pbnRlciB3aGVuIHRoZQotICoJa2VybmVsIHN0YXJ0cyAoc2VlIGhlYWQuUzo6X3N0YXJ0KQotICoKLSAqCVUtQm9vdCBjYWxsaW5nIGNvbnZlbnRpb246Ci0gKgkoKmtlcm5lbCkgKGtiZCwgaW5pdHJkX3N0YXJ0LCBpbml0cmRfZW5kLCBjbWRfc3RhcnQsIGNtZF9lbmQpOwotICoKLSAqCV9pbml0X3NwIGNhbiBiZSBwYXJzZWQgYXMgc3VjaAotICoKLSAqCV9pbml0X3NwKzAwID0gdS1ib290IGNtZCBhZnRlciBqc3IgaW50byBrZXJuZWwgKHNraXApCi0gKglfaW5pdF9zcCswNCA9ICZrZXJuZWwgYm9hcmRfaW5mbyAocmVzaWR1YWwgZGF0YSkKLSAqCV9pbml0X3NwKzA4ID0gJmluaXRyZF9zdGFydAotICoJX2luaXRfc3ArMTIgPSAmaW5pdHJkX2VuZAotICoJX2luaXRfc3ArMTYgPSAmY21kX3N0YXJ0Ci0gKglfaW5pdF9zcCsyMCA9ICZjbWRfZW5kCi0gKgotICoJVGhpcyBhbHNvIGFzc3VtZXMgdGhhdCB0aGUgbWVtb3J5IGxvY2F0aW9ucyBwb2ludGVkIHRvIGFyZSBzdGlsbAotICoJdW5tb2RpZmllZC4gVS1ib290IHBsYWNlcyB0aGVtIG5lYXIgdGhlIGVuZCBvZiBleHRlcm5hbCBTRFJBTS4KLSAqCi0gKiBBcmd1bWVudChzKToKLSAqCWNvbW1hbmRwID0gdGhlIGxpbnV4IGNvbW1hbmRsaW5lIGFyZyBjb250YWluZXIgdG8gZmlsbC4KLSAqCXNpemUgICAgID0gdGhlIHNpemVvZiBjb21tYW5kcC4KLSAqCi0gKiBSZXR1cm5zOgotICovCi1zdGF0aWMgdm9pZCBfX2luaXQgcGFyc2VfdWJvb3RfY29tbWFuZGxpbmUoY2hhciAqY29tbWFuZHAsIGludCBzaXplKQotewotCWV4dGVybiB1bnNpZ25lZCBsb25nIF9pbml0X3NwOwotCXVuc2lnbmVkIGxvbmcgKnNwOwotCXVuc2lnbmVkIGxvbmcgdWJvb3Rfa2JkOwotCXVuc2lnbmVkIGxvbmcgdWJvb3RfaW5pdHJkX3N0YXJ0LCB1Ym9vdF9pbml0cmRfZW5kOwotCXVuc2lnbmVkIGxvbmcgdWJvb3RfY21kX3N0YXJ0LCB1Ym9vdF9jbWRfZW5kOwotCi0KLQlzcCA9ICh1bnNpZ25lZCBsb25nICopX2luaXRfc3A7Ci0JdWJvb3Rfa2JkID0gc3BbMV07Ci0JdWJvb3RfaW5pdHJkX3N0YXJ0ID0gc3BbMl07Ci0JdWJvb3RfaW5pdHJkX2VuZCA9IHNwWzNdOwotCXVib290X2NtZF9zdGFydCA9IHNwWzRdOwotCXVib290X2NtZF9lbmQgPSBzcFs1XTsKLQotCWlmICh1Ym9vdF9jbWRfc3RhcnQgJiYgdWJvb3RfY21kX2VuZCkKLQkJc3RybmNweShjb21tYW5kcCwgKGNvbnN0IGNoYXIgKil1Ym9vdF9jbWRfc3RhcnQsIHNpemUpOwotI2lmIGRlZmluZWQoQ09ORklHX0JMS19ERVZfSU5JVFJEKQotCWlmICh1Ym9vdF9pbml0cmRfc3RhcnQgJiYgdWJvb3RfaW5pdHJkX2VuZCAmJgotCQkodWJvb3RfaW5pdHJkX2VuZCA+IHVib290X2luaXRyZF9zdGFydCkpIHsKLQkJaW5pdHJkX3N0YXJ0ID0gdWJvb3RfaW5pdHJkX3N0YXJ0OwotCQlpbml0cmRfZW5kID0gdWJvb3RfaW5pdHJkX2VuZDsKLQkJUk9PVF9ERVYgPSBSb290X1JBTTA7Ci0JCXByaW50ayhLRVJOX0lORk8gImluaXRyZCBhdCAweCVseDoweCVseFxuIiwKLQkJCWluaXRyZF9zdGFydCwgaW5pdHJkX2VuZCk7Ci0JfQotI2VuZGlmIC8qIGlmIGRlZmluZWQoQ09ORklHX0JMS19ERVZfSU5JVFJEKSAqLwotfQotI2VuZGlmIC8qICNpZiBkZWZpbmVkKENPTkZJR19VQk9PVCkgKi8KLQogdm9pZCBfX2luaXQgc2V0dXBfYXJjaChjaGFyICoqY21kbGluZV9wKQogewogCWludCBib290bWFwX3NpemU7CkBAIC0xNjQsNTMgKzEwMiwzOCBAQAogCWNvbW1hbmRfbGluZVtzaXplb2YoY29tbWFuZF9saW5lKSAtIDFdID0gMDsKICNlbmRpZiAvKiBDT05GSUdfQk9PVFBBUkFNICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19VQk9PVCkKLQkvKiBDT05GSUdfVUJPT1QgYW5kIENPTkZJR19CT09UUEFSQU0gZGVmaW5lZCwgY29uY2F0ZW5hdGUgY21kbGluZSAqLwotCSNpZiBkZWZpbmVkKENPTkZJR19CT09UUEFSQU0pCi0JCS8qIEFkZCB0aGUgd2hpdGVzcGFjZSBzZXBhcmF0b3IgKi8KLQkJY29tbWFuZF9saW5lW3N0cmxlbihDT05GSUdfQk9PVFBBUkFNX1NUUklORyldID0gJyAnOwotCQkvKiBQYXJzZSB1Ym9vdCBjb21tYW5kIGxpbmUgaW50byB0aGUgcmVzdCBvZiB0aGUgYnVmZmVyICovCi0JCXBhcnNlX3Vib290X2NvbW1hbmRsaW5lKAotCQkJJmNvbW1hbmRfbGluZVsoc3RybGVuKENPTkZJR19CT09UUEFSQU1fU1RSSU5HKSsxKV0sCi0JCQkoc2l6ZW9mKGNvbW1hbmRfbGluZSkgLQotCQkJKHN0cmxlbihDT05GSUdfQk9PVFBBUkFNX1NUUklORykrMSkpKTsKLQkvKiBPbmx5IENPTkZJR19VQk9PVCBkZWZpbmVkLCBjcmVhdGUgY21kbGluZSAqLwotCSNlbHNlCi0JCXBhcnNlX3Vib290X2NvbW1hbmRsaW5lKCZjb21tYW5kX2xpbmVbMF0sIHNpemVvZihjb21tYW5kX2xpbmUpKTsKLQkjZW5kaWYgLyogQ09ORklHX0JPT1RQQVJBTSAqLwotCWNvbW1hbmRfbGluZVtzaXplb2YoY29tbWFuZF9saW5lKSAtIDFdID0gMDsKLSNlbmRpZiAvKiBDT05GSUdfVUJPT1QgKi8KKwlwcm9jZXNzX3Vib290X2NvbW1hbmRsaW5lKCZjb21tYW5kX2xpbmVbMF0sIHNpemVvZihjb21tYW5kX2xpbmUpKTsKIAotCXByaW50ayhLRVJOX0lORk8gIlx4MEZcclxuXG51Q2xpbnV4LyIgQ1BVX05BTUUgIlxuIik7CisJcHJfaW5mbygidUNsaW51eCB3aXRoIENQVSAiIENQVV9OQU1FICJcbiIpOwogCiAjaWZkZWYgQ09ORklHX1VDRElNTQotCXByaW50ayhLRVJOX0lORk8gInVDZGltbSBieSBMaW5lbywgSW5jLiA8d3d3LmxpbmVvLmNvbT5cbiIpOworCXByX2luZm8oInVDZGltbSBieSBMaW5lbywgSW5jLiA8d3d3LmxpbmVvLmNvbT5cbiIpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX002OFZaMzI4Ci0JcHJpbnRrKEtFUk5fSU5GTyAiTTY4VlozMjggc3VwcG9ydCBieSBFdmFuIFN0YXdueWN6eSA8ZUBsaW5lby5jYT5cbiIpOworCXByX2luZm8oIk02OFZaMzI4IHN1cHBvcnQgYnkgRXZhbiBTdGF3bnljenkgPGVAbGluZW8uY2E+XG4iKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19DT0xERklSRQotCXByaW50ayhLRVJOX0lORk8gIkNPTERGSVJFIHBvcnQgZG9uZSBieSBHcmVnIFVuZ2VyZXIsIGdlcmdAc25hcGdlYXIuY29tXG4iKTsKKwlwcl9pbmZvKCJDT0xERklSRSBwb3J0IGRvbmUgYnkgR3JlZyBVbmdlcmVyLCBnZXJnQHNuYXBnZWFyLmNvbVxuIik7CiAjaWZkZWYgQ09ORklHX001MzA3Ci0JcHJpbnRrKEtFUk5fSU5GTyAiTW9kaWZpZWQgZm9yIE01MzA3IGJ5IERhdmUgTWlsbGVyLCBkbWlsbGVyQGludGVsbGlzdG9yLmNvbVxuIik7CisJcHJfaW5mbygiTW9kaWZpZWQgZm9yIE01MzA3IGJ5IERhdmUgTWlsbGVyLCBkbWlsbGVyQGludGVsbGlzdG9yLmNvbVxuIik7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfRUxJVEUKLQlwcmludGsoS0VSTl9JTkZPICJNb2RpZmllZCBmb3IgTTUyMDZlTElURSBieSBSb2IgU2NvdHQsIHJzY290dEBtdHJvYi5mZG5zLm5ldFxuIik7CisJcHJfaW5mbygiTW9kaWZpZWQgZm9yIE01MjA2ZUxJVEUgYnkgUm9iIFNjb3R0LCByc2NvdHRAbXRyb2IuZmRucy5uZXRcbiIpOwogI2VuZGlmCiAjZW5kaWYKLQlwcmludGsoS0VSTl9JTkZPICJGbGF0IG1vZGVsIHN1cHBvcnQgKEMpIDE5OTgsMTk5OSBLZW5uZXRoIEFsYmFub3dza2ksIEQuIEplZmYgRGlvbm5lXG4iKTsKKwlwcl9pbmZvKCJGbGF0IG1vZGVsIHN1cHBvcnQgKEMpIDE5OTgsMTk5OSBLZW5uZXRoIEFsYmFub3dza2ksIEQuIEplZmYgRGlvbm5lXG4iKTsKIAogI2lmIGRlZmluZWQoIENPTkZJR19QSUxPVCApICYmIGRlZmluZWQoIENPTkZJR19NNjgzMjggKQotCXByaW50ayhLRVJOX0lORk8gIlRSRyBTdXBlclBpbG90IEZMQVNIIGNhcmQgc3VwcG9ydCA8aW5mb0B0cmduZXQuY29tPlxuIik7CisJcHJfaW5mbygiVFJHIFN1cGVyUGlsb3QgRkxBU0ggY2FyZCBzdXBwb3J0IDxpbmZvQHRyZ25ldC5jb20+XG4iKTsKICNlbmRpZgogI2lmIGRlZmluZWQoIENPTkZJR19QSUxPVCApICYmIGRlZmluZWQoIENPTkZJR19NNjhFWjMyOCApCi0JcHJpbnRrKEtFUk5fSU5GTyAiUGFsbVYgc3VwcG9ydCBieSBMaW5lbyBJbmMuIDxqZWZmQHVjbGludXguY29tPlxuIik7CisJcHJfaW5mbygiUGFsbVYgc3VwcG9ydCBieSBMaW5lbyBJbmMuIDxqZWZmQHVjbGludXguY29tPlxuIik7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfRFJBR0VOMgotCXByaW50ayhLRVJOX0lORk8gIkRyYWdvbkVuZ2luZSBJSSBib2FyZCBzdXBwb3J0IGJ5IEdlb3JnZXMgTWVuaWVcbiIpOworCXByX2luZm8oIkRyYWdvbkVuZ2luZSBJSSBib2FyZCBzdXBwb3J0IGJ5IEdlb3JnZXMgTWVuaWVcbiIpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX001MjM1RVZCCi0JcHJpbnRrKEtFUk5fSU5GTyAiTW90b3JvbGEgTTUyMzVFVkIgc3VwcG9ydCAoQykyMDA1IFN5bi10ZWNoIFN5c3RlbXMsIEluYy4gKEphdGUgU3VqamF2YW5pY2gpXG4iKTsKKwlwcl9pbmZvKCJNb3Rvcm9sYSBNNTIzNUVWQiBzdXBwb3J0IChDKTIwMDUgU3luLXRlY2ggU3lzdGVtcywgSW5jLiAoSmF0ZSBTdWpqYXZhbmljaClcbiIpOwogI2VuZGlmCiAKIAlwcl9kZWJ1ZygiS0VSTkVMIC0+IFRFWFQ9MHglcC0weCVwIERBVEE9MHglcC0weCVwIEJTUz0weCVwLTB4JXBcbiIsCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9tNjhrL2tlcm5lbC9zaWduYWwuYwppbmRleCA5MjAyZjgyLi41ODUwN2VkIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvc2lnbmFsLmMKQEAgLTQyLDcgKzQyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpbmZtdHMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHRhYmxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHJhY2Vob29rLmg+CiAKICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvdWJvb3QuYyBiL2FyY2gvbTY4ay9rZXJuZWwvdWJvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzUzNmE4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC91Ym9vdC5jCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogdWJvb3QuYyAtLSB1Ym9vdCBhcmd1bWVudHMgc3VwcG9ydAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CisjaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKworI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CisKKy8qCisgKiBwYXJzZV91Ym9vdF9jb21tYW5kbGluZQorICoKKyAqIENvcGllcyB1LWJvb3QgY29tbWFuZGxpbmUgYXJndW1lbnRzIGFuZCBzdG9yZSB0aGVtIGluIHRoZSBwcm9wZXIgbGludXgKKyAqIHZhcmlhYmxlcy4KKyAqCisgKiBBc3N1bWVzOgorICoJX2luaXRfc3AgZ2xvYmFsIGNvbnRhaW5zIHRoZSBhZGRyZXNzIGluIHRoZSBzdGFjayBwb2ludGVyIHdoZW4gdGhlCisgKglrZXJuZWwgc3RhcnRzIChzZWUgaGVhZC5TOjpfc3RhcnQpCisgKgorICoJVS1Cb290IGNhbGxpbmcgY29udmVudGlvbjoKKyAqCSgqa2VybmVsKSAoa2JkLCBpbml0cmRfc3RhcnQsIGluaXRyZF9lbmQsIGNtZF9zdGFydCwgY21kX2VuZCk7CisgKgorICoJX2luaXRfc3AgY2FuIGJlIHBhcnNlZCBhcyBzdWNoCisgKgorICoJX2luaXRfc3ArMDAgPSB1LWJvb3QgY21kIGFmdGVyIGpzciBpbnRvIGtlcm5lbCAoc2tpcCkKKyAqCV9pbml0X3NwKzA0ID0gJmtlcm5lbCBib2FyZF9pbmZvIChyZXNpZHVhbCBkYXRhKQorICoJX2luaXRfc3ArMDggPSAmaW5pdHJkX3N0YXJ0CisgKglfaW5pdF9zcCsxMiA9ICZpbml0cmRfZW5kCisgKglfaW5pdF9zcCsxNiA9ICZjbWRfc3RhcnQKKyAqCV9pbml0X3NwKzIwID0gJmNtZF9lbmQKKyAqCisgKglUaGlzIGFsc28gYXNzdW1lcyB0aGF0IHRoZSBtZW1vcnkgbG9jYXRpb25zIHBvaW50ZWQgdG8gYXJlIHN0aWxsCisgKgl1bm1vZGlmaWVkLiBVLWJvb3QgcGxhY2VzIHRoZW0gbmVhciB0aGUgZW5kIG9mIGV4dGVybmFsIFNEUkFNLgorICoKKyAqIEFyZ3VtZW50KHMpOgorICoJY29tbWFuZHAgPSB0aGUgbGludXggY29tbWFuZGxpbmUgYXJnIGNvbnRhaW5lciB0byBmaWxsLgorICoJc2l6ZSAgICAgPSB0aGUgc2l6ZW9mIGNvbW1hbmRwLgorICoKKyAqIFJldHVybnM6CisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBwYXJzZV91Ym9vdF9jb21tYW5kbGluZShjaGFyICpjb21tYW5kcCwgaW50IHNpemUpCit7CisJZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX2luaXRfc3A7CisJdW5zaWduZWQgbG9uZyAqc3A7CisJdW5zaWduZWQgbG9uZyB1Ym9vdF9rYmQ7CisJdW5zaWduZWQgbG9uZyB1Ym9vdF9pbml0cmRfc3RhcnQsIHVib290X2luaXRyZF9lbmQ7CisJdW5zaWduZWQgbG9uZyB1Ym9vdF9jbWRfc3RhcnQsIHVib290X2NtZF9lbmQ7CisKKwlzcCA9ICh1bnNpZ25lZCBsb25nICopX2luaXRfc3A7CisJdWJvb3Rfa2JkID0gc3BbMV07CisJdWJvb3RfaW5pdHJkX3N0YXJ0ID0gc3BbMl07CisJdWJvb3RfaW5pdHJkX2VuZCA9IHNwWzNdOworCXVib290X2NtZF9zdGFydCA9IHNwWzRdOworCXVib290X2NtZF9lbmQgPSBzcFs1XTsKKworCWlmICh1Ym9vdF9jbWRfc3RhcnQgJiYgdWJvb3RfY21kX2VuZCkKKwkJc3RybmNweShjb21tYW5kcCwgKGNvbnN0IGNoYXIgKil1Ym9vdF9jbWRfc3RhcnQsIHNpemUpOworI2lmIGRlZmluZWQoQ09ORklHX0JMS19ERVZfSU5JVFJEKQorCWlmICh1Ym9vdF9pbml0cmRfc3RhcnQgJiYgdWJvb3RfaW5pdHJkX2VuZCAmJgorCSAgICAodWJvb3RfaW5pdHJkX2VuZCA+IHVib290X2luaXRyZF9zdGFydCkpIHsKKwkJaW5pdHJkX3N0YXJ0ID0gdWJvb3RfaW5pdHJkX3N0YXJ0OworCQlpbml0cmRfZW5kID0gdWJvb3RfaW5pdHJkX2VuZDsKKwkJUk9PVF9ERVYgPSBSb290X1JBTTA7CisJCXByaW50ayhLRVJOX0lORk8gImluaXRyZCBhdCAweCVseDoweCVseFxuIiwKKwkJCWluaXRyZF9zdGFydCwgaW5pdHJkX2VuZCk7CisJfQorI2VuZGlmIC8qIGlmIGRlZmluZWQoQ09ORklHX0JMS19ERVZfSU5JVFJEKSAqLworfQorCitfX2luaXQgdm9pZCBwcm9jZXNzX3Vib290X2NvbW1hbmRsaW5lKGNoYXIgKmNvbW1hbmRwLCBpbnQgc2l6ZSkKK3sKKwlpbnQgbGVuLCBuOworCisJbiA9IHN0cm5sZW4oY29tbWFuZHAsIHNpemUpOworCWNvbW1hbmRwICs9IG47CisJbGVuID0gc2l6ZSAtIG47CisJaWYgKGxlbikgeworCQkvKiBBZGQgdGhlIHdoaXRlc3BhY2Ugc2VwYXJhdG9yICovCisJCSpjb21tYW5kcCsrID0gJyAnOworCQlsZW4tLTsKKwl9CisKKwlwYXJzZV91Ym9vdF9jb21tYW5kbGluZShjb21tYW5kcCwgbGVuKTsKKwljb21tYW5kcFtzaXplIC0gMV0gPSAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21hYy9jb25maWcuYyBiL2FyY2gvbTY4ay9tYWMvY29uZmlnLmMKaW5kZXggMmYzM2EzMy4uZTQ2ODk1MyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21hYy9jb25maWcuYworKysgYi9hcmNoL202OGsvbWFjL2NvbmZpZy5jCkBAIC0xNjIsNyArMTYyLDcgQEAKIAltYWNoX2hhbHQgPSBtYWNfcG93ZXJvZmY7CiAJbWFjaF9wb3dlcl9vZmYgPSBtYWNfcG93ZXJvZmY7CiAJbWFjaF9tYXhfZG1hX2FkZHJlc3MgPSAweGZmZmZmZmZmOwotI2lmIGRlZmluZWQoQ09ORklHX0lOUFVUX002OEtfQkVFUCkgfHwgZGVmaW5lZChDT05GSUdfSU5QVVRfTTY4S19CRUVQX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JTlBVVF9NNjhLX0JFRVApCiAJbWFjaF9iZWVwID0gbWFjX21rc291bmQ7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21tL21jZm1tdS5jIGIvYXJjaC9tNjhrL21tL21jZm1tdS5jCmluZGV4IGY1OGZhZmUuLjg3MTMxY2QgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tbS9tY2ZtbXUuYworKysgYi9hcmNoL202OGsvbW0vbWNmbW11LmMKQEAgLTI3LDcgKzI3LDcgQEAKIHVuc2lnbmVkIGxvbmcgY29udGV4dF9tYXBbTEFTVF9DT05URVhUIC8gQklUU19QRVJfTE9ORyArIDFdOwogYXRvbWljX3QgbnJfZnJlZV9jb250ZXh0czsKIHN0cnVjdCBtbV9zdHJ1Y3QgKmNvbnRleHRfbW1bTEFTVF9DT05URVhUKzFdOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbnVtX3BhZ2VzOwordW5zaWduZWQgbG9uZyBudW1fcGFnZXM7CiAKIC8qCiAgKiBDb2xkRmlyZSBwYWdpbmdfaW5pdCBkZXJpdmVkIGZyb20gc3VuMy4KQEAgLTE1MCw2ICsxNTAsMzUgQEAKIAlyZXR1cm4gMDsKIH0KIAordm9pZCBfX2luaXQgY2ZfYm9vdG1lbV9hbGxvYyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuOworCXVuc2lnbmVkIGxvbmcgbWVtc3RhcnQ7CisKKwkvKiBfcmFtYmFzZSBhbmQgX3JhbWVuZCB3aWxsIGJlIG5hdHVyYWxseSBwYWdlIGFsaWduZWQgKi8KKwltNjhrX21lbW9yeVswXS5hZGRyID0gX3JhbWJhc2U7CisJbTY4a19tZW1vcnlbMF0uc2l6ZSA9IF9yYW1lbmQgLSBfcmFtYmFzZTsKKworCS8qIGNvbXB1dGUgdG90YWwgcGFnZXMgaW4gc3lzdGVtICovCisJbnVtX3BhZ2VzID0gUEZOX0RPV04oX3JhbWVuZCAtIF9yYW1iYXNlKTsKKworCS8qIHBhZ2UgbnVtYmVycyAqLworCW1lbXN0YXJ0ID0gUEFHRV9BTElHTihfcmFtc3RhcnQpOworCW1pbl9sb3dfcGZuID0gUEZOX0RPV04oX3JhbWJhc2UpOworCXN0YXJ0X3BmbiA9IFBGTl9ET1dOKG1lbXN0YXJ0KTsKKwltYXhfcGZuID0gbWF4X2xvd19wZm4gPSBQRk5fRE9XTihfcmFtZW5kKTsKKwloaWdoX21lbW9yeSA9ICh2b2lkICopX3JhbWVuZDsKKworCW02OGtfdmlydF90b19ub2RlX3NoaWZ0ID0gZmxzKF9yYW1lbmQgLSBfcmFtYmFzZSAtIDEpIC0gNjsKKwltb2R1bGVfZml4dXAoTlVMTCwgX19zdGFydF9maXh1cCwgX19zdG9wX2ZpeHVwKTsKKworCS8qIHNldHVwIGJvb3RtZW0gZGF0YSAqLworCW02OGtfc2V0dXBfbm9kZSgwKTsKKwltZW1zdGFydCArPSBpbml0X2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEoMCksIHN0YXJ0X3BmbiwKKwkJbWluX2xvd19wZm4sIG1heF9sb3dfcGZuKTsKKwlmcmVlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEoMCksIG1lbXN0YXJ0LCBfcmFtZW5kIC0gbWVtc3RhcnQpOworfQorCiAvKgogICogSW5pdGlhbGl6ZSB0aGUgY29udGV4dCBtYW5hZ2VtZW50IHN0dWZmLgogICogVGhlIGZvbGxvd2luZyB3YXMgdGFrZW4gZnJvbSBhcmNoL3BwYy9tbXVfY29udGV4dC5jCmRpZmYgLS1naXQgYS9hcmNoL202OGsvcTQwL2NvbmZpZy5jIGIvYXJjaC9tNjhrL3E0MC9jb25maWcuYwppbmRleCBmY2I3ZjA1Li5lYTg5YTI0IDEwMDY0NAotLS0gYS9hcmNoL202OGsvcTQwL2NvbmZpZy5jCisrKyBiL2FyY2gvbTY4ay9xNDAvY29uZmlnLmMKQEAgLTE4MCw3ICsxODAsNyBAQAogCW1hY2hfcmVzZXQgPSBxNDBfcmVzZXQ7CiAJbWFjaF9nZXRfbW9kZWwgPSBxNDBfZ2V0X21vZGVsOwogCi0jaWYgZGVmaW5lZChDT05GSUdfSU5QVVRfTTY4S19CRUVQKSB8fCBkZWZpbmVkKENPTkZJR19JTlBVVF9NNjhLX0JFRVBfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lOUFVUX002OEtfQkVFUCkKIAltYWNoX2JlZXAgPSBxNDBfbWtzb3VuZDsKICNlbmRpZgogI2lmZGVmIENPTkZJR19IRUFSVEJFQVQKZGlmZiAtLWdpdCBhL2FyY2gvbWV0YWcvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9tZXRhZy9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggODI4MmNiYy4uMjczZTYxMiAxMDA2NDQKLS0tIGEvYXJjaC9tZXRhZy9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC9tZXRhZy9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTIwNCw4ICsyMDQsOSBAQAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCiBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKLQlpZiAoYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcm9tLCBuKSkKKwlpZiAobGlrZWx5KGFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJvbSwgbikpKQogCQlyZXR1cm4gX19jb3B5X3VzZXJfemVyb2luZyh0bywgZnJvbSwgbik7CisJbWVtc2V0KHRvLCAwLCBuKTsKIAlyZXR1cm4gbjsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggMzMxYjBkMy4uODI2Njc2NyAxMDA2NDQKLS0tIGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC0yMjcsNyArMjI3LDcgQEAKIAogI2RlZmluZSBfX2dldF91c2VyKHgsIHB0cikJCQkJCQlcCiAoewkJCQkJCQkJCVwKLQl1bnNpZ25lZCBsb25nIF9fZ3VfdmFsOwkJCQkJCVwKKwl1bnNpZ25lZCBsb25nIF9fZ3VfdmFsID0gMDsJCQkJCVwKIAkvKnVuc2lnbmVkIGxvbmcgX19ndV9wdHIgPSAodW5zaWduZWQgbG9uZykocHRyKTsqLwkJXAogCWxvbmcgX19ndV9lcnI7CQkJCQkJCVwKIAlzd2l0Y2ggKHNpemVvZigqKHB0cikpKSB7CQkJCQlcCkBAIC0zNzMsMTAgKzM3MywxMyBAQAogc3RhdGljIGlubGluZSBsb25nIGNvcHlfZnJvbV91c2VyKHZvaWQgKnRvLAogCQljb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogeworCXVuc2lnbmVkIGxvbmcgcmVzID0gbjsKIAltaWdodF9mYXVsdCgpOwotCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIG4pKQotCQlyZXR1cm4gX19jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbik7Ci0JcmV0dXJuIG47CisJaWYgKGxpa2VseShhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIG4pKSkKKwkJcmVzID0gX19jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbik7CisJaWYgKHVubGlrZWx5KHJlcykpCisJCW1lbXNldCh0byArIChuIC0gcmVzKSwgMCwgcmVzKTsKKwlyZXR1cm4gcmVzOwogfQogCiAjZGVmaW5lIF9fY29weV90b191c2VyKHRvLCBmcm9tLCBuKQlcCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUva2VybmVsL2Z0cmFjZS5jIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9mdHJhY2UuYwppbmRleCBmYzdiNDhhLi5kNTc1NjNjIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL2Z0cmFjZS5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZnRyYWNlLmMKQEAgLTYzLDcgKzYzLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWVyciA9IGZ0cmFjZV9wdXNoX3JldHVybl90cmFjZShvbGQsIHNlbGZfYWRkciwgJnRyYWNlLmRlcHRoLCAwKTsKKwllcnIgPSBmdHJhY2VfcHVzaF9yZXR1cm5fdHJhY2Uob2xkLCBzZWxmX2FkZHIsICZ0cmFjZS5kZXB0aCwgMCwgTlVMTCk7CiAJaWYgKGVyciA9PSAtRUJVU1kpIHsKIAkJKnBhcmVudCA9IG9sZDsKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL0tjb25maWcgYi9hcmNoL21pcHMvS2NvbmZpZwppbmRleCAyNjM4ODU2Li4yMTJmZjkyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvS2NvbmZpZworKysgYi9hcmNoL21pcHMvS2NvbmZpZwpAQCAtNjUsNiArNjUsNyBAQAogCXNlbGVjdCBBUkNIX0NMT0NLU09VUkNFX0RBVEEKIAlzZWxlY3QgSEFORExFX0RPTUFJTl9JUlEKIAlzZWxlY3QgSEFWRV9FWElUX1RIUkVBRAorCXNlbGVjdCBIQVZFX1JFR1NfQU5EX1NUQUNLX0FDQ0VTU19BUEkKIAogbWVudSAiTWFjaGluZSBzZWxlY3Rpb24iCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9LY29uZmlnLmRlYnVnIGIvYXJjaC9taXBzL0tjb25maWcuZGVidWcKaW5kZXggZjBlMzE0Yy4uN2Y5NzViMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL0tjb25maWcuZGVidWcKKysrIGIvYXJjaC9taXBzL0tjb25maWcuZGVidWcKQEAgLTExMyw0MiArMTEzLDYgQEAKIAloZWxwCiAJICBBZGQgc2V2ZXJhbCBmaWxlcyB0byB0aGUgZGVidWdmcyB0byB0ZXN0IHNwaW5sb2NrIHNwZWVkLgogCi1pZiBDUFVfTUlQU1I2Ci0KLWNob2ljZQotCXByb21wdCAiQ29tcGFjdCBicmFuY2ggcG9saWN5IgotCWRlZmF1bHQgTUlQU19DT01QQUNUX0JSQU5DSEVTX09QVElNQUwKLQotY29uZmlnIE1JUFNfQ09NUEFDVF9CUkFOQ0hFU19ORVZFUgotCWJvb2wgIk5ldmVyIChmb3JjZSBkZWxheSBzbG90IGJyYW5jaGVzKSIKLQloZWxwCi0JICBQYXNzIHRoZSAtbWNvbXBhY3QtYnJhbmNoZXM9bmV2ZXIgZmxhZyB0byB0aGUgY29tcGlsZXIgaW4gb3JkZXIgdG8KLQkgIGZvcmNlIGl0IHRvIGFsd2F5cyBlbWl0IGJyYW5jaGVzIHdpdGggZGVsYXkgc2xvdHMsIGFuZCBtYWtlIG5vIHVzZQotCSAgb2YgdGhlIGNvbXBhY3QgYnJhbmNoIGluc3RydWN0aW9ucyBpbnRyb2R1Y2VkIGJ5IE1JUFNyNi4gVGhpcyBpcwotCSAgdXNlZnVsIGlmIHlvdSBzdXNwZWN0IHRoZXJlIG1heSBiZSBhbiBpc3N1ZSB3aXRoIGNvbXBhY3QgYnJhbmNoZXMgaW4KLQkgIGVpdGhlciB0aGUgY29tcGlsZXIgb3IgdGhlIENQVS4KLQotY29uZmlnIE1JUFNfQ09NUEFDVF9CUkFOQ0hFU19PUFRJTUFMCi0JYm9vbCAiT3B0aW1hbCAodXNlIHdoZXJlIGJlbmVmaWNpYWwpIgotCWhlbHAKLQkgIFBhc3MgdGhlIC1tY29tcGFjdC1icmFuY2hlcz1vcHRpbWFsIGZsYWcgdG8gdGhlIGNvbXBpbGVyIGluIG9yZGVyIGZvcgotCSAgaXQgdG8gbWFrZSB1c2Ugb2YgY29tcGFjdCBicmFuY2ggaW5zdHJ1Y3Rpb25zIHdoZXJlIGl0IGRlZW1zIHRoZW0KLQkgIGJlbmVmaWNpYWwsIGFuZCB1c2UgYnJhbmNoZXMgd2l0aCBkZWxheSBzbG90cyBlbHNld2hlcmUuIFRoaXMgaXMgdGhlCi0JICBkZWZhdWx0IGNvbXBpbGVyIGJlaGF2aW91ciwgYW5kIHNob3VsZCBiZSB1c2VkIHVubGVzcyB5b3UgaGF2ZSBhCi0JICByZWFzb24gdG8gY2hvb3NlIG90aGVyd2lzZS4KLQotY29uZmlnIE1JUFNfQ09NUEFDVF9CUkFOQ0hFU19BTFdBWVMKLQlib29sICJBbHdheXMgKGZvcmNlIGNvbXBhY3QgYnJhbmNoZXMpIgotCWhlbHAKLQkgIFBhc3MgdGhlIC1tY29tcGFjdC1icmFuY2hlcz1hbHdheXMgZmxhZyB0byB0aGUgY29tcGlsZXIgaW4gb3JkZXIgdG8KLQkgIGZvcmNlIGl0IHRvIGFsd2F5cyBlbWl0IGNvbXBhY3QgYnJhbmNoZXMsIG1ha2luZyBubyB1c2Ugb2YgYnJhbmNoCi0JICBpbnN0cnVjdGlvbnMgd2l0aCBkZWxheSBzbG90cy4gVGhpcyBjYW4gcmVzdWx0IGluIG1vcmUgY29tcGFjdCBjb2RlCi0JICB3aGljaCBtYXkgYmUgYmVuZWZpY2lhbCBpbiBzb21lIHNjZW5hcmlvcy4KLQotZW5kY2hvaWNlCi0KLWVuZGlmICMgQ1BVX01JUFNSNgotCiBjb25maWcgU0NBQ0hFX0RFQlVHRlMKIAlib29sICJMMiBjYWNoZSBkZWJ1Z2ZzIGVudHJpZXMiCiAJZGVwZW5kcyBvbiBERUJVR19GUwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL01ha2VmaWxlIGIvYXJjaC9taXBzL01ha2VmaWxlCmluZGV4IGVmZDdhOWQuLjU5OGFiMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvTWFrZWZpbGUKQEAgLTIwMywxMCArMjAzLDYgQEAKIHRvb2xjaGFpbi12aXJ0CQkJCTo9ICQoY2FsbCBjYy1vcHRpb24teW4sJChtaXBzLWNmbGFncykgLW12aXJ0KQogY2ZsYWdzLSQodG9vbGNoYWluLXZpcnQpCQkrPSAtRFRPT0xDSEFJTl9TVVBQT1JUU19WSVJUCiAKLWNmbGFncy0kKENPTkZJR19NSVBTX0NPTVBBQ1RfQlJBTkNIRVNfTkVWRVIpCSs9IC1tY29tcGFjdC1icmFuY2hlcz1uZXZlcgotY2ZsYWdzLSQoQ09ORklHX01JUFNfQ09NUEFDVF9CUkFOQ0hFU19PUFRJTUFMKQkrPSAtbWNvbXBhY3QtYnJhbmNoZXM9b3B0aW1hbAotY2ZsYWdzLSQoQ09ORklHX01JUFNfQ09NUEFDVF9CUkFOQ0hFU19BTFdBWVMpCSs9IC1tY29tcGFjdC1icmFuY2hlcz1hbHdheXMKLQogIwogIyBGaXJtd2FyZSBzdXBwb3J0CiAjCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXRoNzkvY2xvY2suYyBiL2FyY2gvbWlwcy9hdGg3OS9jbG9jay5jCmluZGV4IDJlNzM3ODQuLmNjM2ExZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hdGg3OS9jbG9jay5jCisrKyBiL2FyY2gvbWlwcy9hdGg3OS9jbG9jay5jCkBAIC05Niw3ICs5Niw3IEBACiAJc3RydWN0IGNsayAqY2xrOwogCiAJY2xrID0gY2xrX3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLCBuYW1lLCBwYXJlbnRfbmFtZSwgMCwgbXVsdCwgZGl2KTsKLQlpZiAoIWNsaykKKwlpZiAoSVNfRVJSKGNsaykpCiAJCXBhbmljKCJmYWlsZWQgdG8gYWxsb2NhdGUgJXMgY2xvY2sgc3RydWN0dXJlIiwgbmFtZSk7CiAKIAlyZXR1cm4gY2xrOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vb2N0ZW9uLWlycS5jIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vb2N0ZW9uLWlycS5jCmluZGV4IDVhOWI4N2IuLmMxZWIxZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL29jdGVvbi1pcnEuYworKysgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9vY3Rlb24taXJxLmMKQEAgLTE2MTksNiArMTYxOSwxMiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKKwkvKgorCSAqIENsZWFyIHRoZSBPRl9QT1BVTEFURUQgZmxhZyB0aGF0IHdhcyBzZXQgYnkgb2ZfaXJxX2luaXQoKQorCSAqIHNvIHRoYXQgYWxsIEdQSU8gZGV2aWNlcyB3aWxsIGJlIHByb2JlZC4KKwkgKi8KKwlvZl9ub2RlX2NsZWFyX2ZsYWcoZ3Bpb19ub2RlLCBPRl9QT1BVTEFURUQpOworCiAJcmV0dXJuIDA7CiB9CiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vb2N0ZW9uLXBsYXRmb3JtLmMgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9vY3Rlb24tcGxhdGZvcm0uYwppbmRleCBiMzFmYmM5Li4zN2E5MzJkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9vY3Rlb24tcGxhdGZvcm0uYworKysgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9vY3Rlb24tcGxhdGZvcm0uYwpAQCAtMTA1OSw3ICsxMDU5LDcgQEAKIHsKIAlyZXR1cm4gb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIG9jdGVvbl9pZHMsIE5VTEwpOwogfQotZGV2aWNlX2luaXRjYWxsKG9jdGVvbl9wdWJsaXNoX2RldmljZXMpOworYXJjaF9pbml0Y2FsbChvY3Rlb25fcHVibGlzaF9kZXZpY2VzKTsKIAogTU9EVUxFX0FVVEhPUigiRGF2aWQgRGFuZXkgPGRkYW5leUBjYXZpdW1uZXR3b3Jrcy5jb20+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9zbXAuYyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL3NtcC5jCmluZGV4IDRkNDU3ZDYwLi4yNTZmZTZmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9zbXAuYworKysgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9zbXAuYwpAQCAtMzgwLDI5ICszODAsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBvY3Rlb25fY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAotCXVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQotewotCXVuc2lnbmVkIGludCBjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OwotCi0Jc3dpdGNoIChhY3Rpb24gJiB+Q1BVX1RBU0tTX0ZST1pFTikgewotCWNhc2UgQ1BVX1VQX1BSRVBBUkU6Ci0JCW9jdGVvbl91cGRhdGVfYm9vdF92ZWN0b3IoY3B1KTsKLQkJYnJlYWs7Ci0JY2FzZSBDUFVfT05MSU5FOgotCQlwcl9pbmZvKCJDcHUgJWQgb25saW5lXG4iLCBjcHUpOwotCQlicmVhazsKLQljYXNlIENQVV9ERUFEOgotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gTk9USUZZX09LOwotfQotCiBzdGF0aWMgaW50IHJlZ2lzdGVyX2Nhdml1bV9ub3RpZmllcih2b2lkKQogewotCWhvdGNwdV9ub3RpZmllcihvY3Rlb25fY3B1X2NhbGxiYWNrLCAwKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9NSVBTX1NPQ19QUkVQQVJFLAorCQkJCQkgIm1pcHMvY2F2aXVtOnByZXBhcmUiLAorCQkJCQkgb2N0ZW9uX3VwZGF0ZV9ib290X3ZlY3RvciwgTlVMTCk7CiB9CiBsYXRlX2luaXRjYWxsKHJlZ2lzdGVyX2Nhdml1bV9ub3RpZmllcik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9kZWMvaW50LWhhbmRsZXIuUyBiL2FyY2gvbWlwcy9kZWMvaW50LWhhbmRsZXIuUwppbmRleCBkN2I5OTE4Li4xOTEwMjIzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvZGVjL2ludC1oYW5kbGVyLlMKKysrIGIvYXJjaC9taXBzL2RlYy9pbnQtaGFuZGxlci5TCkBAIC0xNDYsNyArMTQ2LDI1IEBACiAJCS8qCiAJCSAqIEZpbmQgaXJxIHdpdGggaGlnaGVzdCBwcmlvcml0eQogCQkgKi8KLQkJIFBUUl9MQQl0MSxjcHVfbWFza19ucl90YmwKKwkJIyBvcGVuIGNvZGVkIFBUUl9MQSB0MSwgY3B1X21hc2tfbnJfdGJsCisjaWYgKF9NSVBTX1NaUFRSID09IDMyKQorCQkjIG9wZW4gY29kZWQgbGEgdDEsIGNwdV9tYXNrX25yX3RibAorCQlsdWkJdDEsICVoaShjcHVfbWFza19ucl90YmwpCisJCWFkZGl1CXQxLCAlbG8oY3B1X21hc2tfbnJfdGJsKQorCisjZW5kaWYKKyNpZiAoX01JUFNfU1pQVFIgPT0gNjQpCisJCSMgb3BlbiBjb2RlZCBkbGEgdDEsIGNwdV9tYXNrX25yX3RibAorCQkuc2V0CXB1c2gKKwkJLnNldAlub2F0CisJCWx1aQl0MSwgJWhpZ2hlc3QoY3B1X21hc2tfbnJfdGJsKQorCQlsdWkJQVQsICVoaShjcHVfbWFza19ucl90YmwpCisJCWRhZGRpdQl0MSwgdDEsICVoaWdoZXIoY3B1X21hc2tfbnJfdGJsKQorCQlkYWRkaXUJQVQsIEFULCAlbG8oY3B1X21hc2tfbnJfdGJsKQorCQlkc2xsCXQxLCAzMgorCQlkYWRkdQl0MSwgdDEsIEFUCisJCS5zZXQJcG9wCisjZW5kaWYKIDE6CQlsdwl0MiwodDEpCiAJCW5vcAogCQlhbmQJdDIsdDAKQEAgLTE5NSw3ICsyMTMsMjUgQEAKIAkJLyoKIAkJICogRmluZCBpcnEgd2l0aCBoaWdoZXN0IHByaW9yaXR5CiAJCSAqLwotCQkgUFRSX0xBCXQxLGFzaWNfbWFza19ucl90YmwKKwkJIyBvcGVuIGNvZGVkIFBUUl9MQSB0MSxhc2ljX21hc2tfbnJfdGJsCisjaWYgKF9NSVBTX1NaUFRSID09IDMyKQorCQkjIG9wZW4gY29kZWQgbGEgdDEsIGFzaWNfbWFza19ucl90YmwKKwkJbHVpCXQxLCAlaGkoYXNpY19tYXNrX25yX3RibCkKKwkJYWRkaXUJdDEsICVsbyhhc2ljX21hc2tfbnJfdGJsKQorCisjZW5kaWYKKyNpZiAoX01JUFNfU1pQVFIgPT0gNjQpCisJCSMgb3BlbiBjb2RlZCBkbGEgdDEsIGFzaWNfbWFza19ucl90YmwKKwkJLnNldAlwdXNoCisJCS5zZXQJbm9hdAorCQlsdWkJdDEsICVoaWdoZXN0KGFzaWNfbWFza19ucl90YmwpCisJCWx1aQlBVCwgJWhpKGFzaWNfbWFza19ucl90YmwpCisJCWRhZGRpdQl0MSwgdDEsICVoaWdoZXIoYXNpY19tYXNrX25yX3RibCkKKwkJZGFkZGl1CUFULCBBVCwgJWxvKGFzaWNfbWFza19ucl90YmwpCisJCWRzbGwJdDEsIDMyCisJCWRhZGR1CXQxLCB0MSwgQVQKKwkJLnNldAlwb3AKKyNlbmRpZgogMjoJCWx3CXQyLCh0MSkKIAkJbm9wCiAJCWFuZAl0Mix0MApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2FzbW1hY3JvLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXNtbWFjcm8uaAppbmRleCA1NjU4NGE2Li44MzA1NGY3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXNtbWFjcm8uaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXNtbWFjcm8uaApAQCAtMTU3LDYgKzE1Nyw3IEBACiAJbGRjMQkkZjI4LCBUSFJFQURfRlBSMjgoXHRocmVhZCkKIAlsZGMxCSRmMzAsIFRIUkVBRF9GUFIzMChcdGhyZWFkKQogCWN0YzEJXHRtcCwgZmNyMzEKKwkuc2V0CXBvcAogCS5lbmRtCiAKIAkubWFjcm8JZnB1X3Jlc3RvcmVfMTZvZGQgdGhyZWFkCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20va3ZtX2hvc3QuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCmluZGV4IGI1NGJjYWQuLjA3ZjU4Y2YgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCkBAIC0xMDcsMzUgKzEwNyw0OSBAQAogI2RlZmluZSBLVk1fSU5WQUxJRF9JTlNUCQkweGRlYWRiZWVmCiAjZGVmaW5lIEtWTV9JTlZBTElEX0FERFIJCTB4ZGVhZGJlZWYKIAorLyoKKyAqIEVWQSBoYXMgb3ZlcmxhcHBpbmcgdXNlciAmIGtlcm5lbCBhZGRyZXNzIHNwYWNlcywgc28gdXNlciBWQXMgbWF5IGJlID4KKyAqIFBBR0VfT0ZGU0VULiBGb3IgdGhpcyByZWFzb24gd2UgY2FuJ3QgdXNlIHRoZSBkZWZhdWx0IEtWTV9IVkFfRVJSX0JBRCBvZgorICogUEFHRV9PRkZTRVQuCisgKi8KKworI2RlZmluZSBLVk1fSFZBX0VSUl9CQUQJCQkoLTFVTCkKKyNkZWZpbmUgS1ZNX0hWQV9FUlJfUk9fQkFECQkoLTJVTCkKKworc3RhdGljIGlubGluZSBib29sIGt2bV9pc19lcnJvcl9odmEodW5zaWduZWQgbG9uZyBhZGRyKQoreworCXJldHVybiBJU19FUlJfVkFMVUUoYWRkcik7Cit9CisKIGV4dGVybiBhdG9taWNfdCBrdm1fbWlwc19pbnN0YW5jZTsKIAogc3RydWN0IGt2bV92bV9zdGF0IHsKLQl1MzIgcmVtb3RlX3RsYl9mbHVzaDsKKwl1bG9uZyByZW1vdGVfdGxiX2ZsdXNoOwogfTsKIAogc3RydWN0IGt2bV92Y3B1X3N0YXQgewotCXUzMiB3YWl0X2V4aXRzOwotCXUzMiBjYWNoZV9leGl0czsKLQl1MzIgc2lnbmFsX2V4aXRzOwotCXUzMiBpbnRfZXhpdHM7Ci0JdTMyIGNvcF91bnVzYWJsZV9leGl0czsKLQl1MzIgdGxibW9kX2V4aXRzOwotCXUzMiB0bGJtaXNzX2xkX2V4aXRzOwotCXUzMiB0bGJtaXNzX3N0X2V4aXRzOwotCXUzMiBhZGRyZXJyX3N0X2V4aXRzOwotCXUzMiBhZGRyZXJyX2xkX2V4aXRzOwotCXUzMiBzeXNjYWxsX2V4aXRzOwotCXUzMiByZXN2ZF9pbnN0X2V4aXRzOwotCXUzMiBicmVha19pbnN0X2V4aXRzOwotCXUzMiB0cmFwX2luc3RfZXhpdHM7Ci0JdTMyIG1zYV9mcGVfZXhpdHM7Ci0JdTMyIGZwZV9leGl0czsKLQl1MzIgbXNhX2Rpc2FibGVkX2V4aXRzOwotCXUzMiBmbHVzaF9kY2FjaGVfZXhpdHM7Ci0JdTMyIGhhbHRfc3VjY2Vzc2Z1bF9wb2xsOwotCXUzMiBoYWx0X2F0dGVtcHRlZF9wb2xsOwotCXUzMiBoYWx0X3BvbGxfaW52YWxpZDsKLQl1MzIgaGFsdF93YWtldXA7CisJdTY0IHdhaXRfZXhpdHM7CisJdTY0IGNhY2hlX2V4aXRzOworCXU2NCBzaWduYWxfZXhpdHM7CisJdTY0IGludF9leGl0czsKKwl1NjQgY29wX3VudXNhYmxlX2V4aXRzOworCXU2NCB0bGJtb2RfZXhpdHM7CisJdTY0IHRsYm1pc3NfbGRfZXhpdHM7CisJdTY0IHRsYm1pc3Nfc3RfZXhpdHM7CisJdTY0IGFkZHJlcnJfc3RfZXhpdHM7CisJdTY0IGFkZHJlcnJfbGRfZXhpdHM7CisJdTY0IHN5c2NhbGxfZXhpdHM7CisJdTY0IHJlc3ZkX2luc3RfZXhpdHM7CisJdTY0IGJyZWFrX2luc3RfZXhpdHM7CisJdTY0IHRyYXBfaW5zdF9leGl0czsKKwl1NjQgbXNhX2ZwZV9leGl0czsKKwl1NjQgZnBlX2V4aXRzOworCXU2NCBtc2FfZGlzYWJsZWRfZXhpdHM7CisJdTY0IGZsdXNoX2RjYWNoZV9leGl0czsKKwl1NjQgaGFsdF9zdWNjZXNzZnVsX3BvbGw7CisJdTY0IGhhbHRfYXR0ZW1wdGVkX3BvbGw7CisJdTY0IGhhbHRfcG9sbF9pbnZhbGlkOworCXU2NCBoYWx0X3dha2V1cDsKIH07CiAKIHN0cnVjdCBrdm1fYXJjaF9tZW1vcnlfc2xvdCB7CkBAIC0zMTQsNiArMzI4LDkgQEAKIAl1MzIgZ3Vlc3Rfa2VybmVsX2FzaWRbTlJfQ1BVU107CiAJc3RydWN0IG1tX3N0cnVjdCBndWVzdF9rZXJuZWxfbW0sIGd1ZXN0X3VzZXJfbW07CiAKKwkvKiBHdWVzdCBBU0lEIG9mIGxhc3QgdXNlciBtb2RlIGV4ZWN1dGlvbiAqLworCXVuc2lnbmVkIGludCBsYXN0X3VzZXJfZ2FzaWQ7CisKIAlpbnQgbGFzdF9zY2hlZF9jcHU7CiAKIAkvKiBXQUlUIGV4ZWN1dGVkICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1jYXZpdW0tb2N0ZW9uL21hbmdsZS1wb3J0LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1jYXZpdW0tb2N0ZW9uL21hbmdsZS1wb3J0LmgKaW5kZXggMGNmNWFjMS4uOGZmMmNiZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWNhdml1bS1vY3Rlb24vbWFuZ2xlLXBvcnQuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1jYXZpdW0tb2N0ZW9uL21hbmdsZS1wb3J0LmgKQEAgLTE1LDggKzE1LDggQEAKIHN0YXRpYyBpbmxpbmUgYm9vbCBfX3Nob3VsZF9zd2l6emxlX2JpdHModm9sYXRpbGUgdm9pZCAqYSkKIHsKIAlleHRlcm4gY29uc3QgYm9vbCBvY3Rlb25fc2hvdWxkX3N3aXp6bGVfdGFibGVbXTsKKwl1NjQgZGlkID0gKCh1NjQpKHVpbnRwdHJfdClhID4+IDQwKSAmIDB4ZmY7CiAKLQl1bnNpZ25lZCBsb25nIGRpZCA9ICgodW5zaWduZWQgbG9uZylhID4+IDQwKSAmIDB4ZmY7CiAJcmV0dXJuIG9jdGVvbl9zaG91bGRfc3dpenpsZV90YWJsZVtkaWRdOwogfQogCkBAIC0yOSw3ICsyOSw3IEBACiAKICNkZWZpbmUgX19zaG91bGRfc3dpenpsZV9iaXRzKGEpCWZhbHNlCiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBfX3Nob3VsZF9zd2l6emxlX2FkZHIodW5zaWduZWQgbG9uZyBwKQorc3RhdGljIGlubGluZSBib29sIF9fc2hvdWxkX3N3aXp6bGVfYWRkcih1NjQgcCkKIHsKIAkvKiBib290IGJ1cz8gKi8KIAlyZXR1cm4gKChwID4+IDQwKSAmIDB4ZmYpID09IDA7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYXJhdmlydC9rZXJuZWwtZW50cnktaW5pdC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcGFyYXZpcnQva2VybmVsLWVudHJ5LWluaXQuaAppbmRleCAyZjgyYmZhLi5jOWY1NzY5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYXJhdmlydC9rZXJuZWwtZW50cnktaW5pdC5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBhcmF2aXJ0L2tlcm5lbC1lbnRyeS1pbml0LmgKQEAgLTExLDExICsxMSwxMyBAQAogI2RlZmluZSBDUDBfRUJBU0UgJDE1LCAxCiAKIAkubWFjcm8gIGtlcm5lbF9lbnRyeV9zZXR1cAorI2lmZGVmIENPTkZJR19TTVAKIAltZmMwCXQwLCBDUDBfRUJBU0UKIAlhbmRpCXQwLCB0MCwgMHgzZmYJCSMgQ1BVTnVtCiAJYmVxegl0MCwgMWYKIAkjIENQVXMgb3RoZXIgdGhhbiB6ZXJvIGdvdG8gc21wX2Jvb3RzdHJhcAogCWoJc21wX2Jvb3RzdHJhcAorI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogMToKIAkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHMtY20uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzLWNtLmgKaW5kZXggNThlNzg3NC4uNGZhZmVlZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHMtY20uaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwcy1jbS5oCkBAIC00NTgsMTAgKzQ1OCwyMSBAQAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbWlwc19jbV9tYXhfdnBfd2lkdGgodm9pZCkKIHsKIAlleHRlcm4gaW50IHNtcF9udW1fc2libGluZ3M7CisJdWludDMyX3QgY2ZnOwogCiAJaWYgKG1pcHNfY21fcmV2aXNpb24oKSA+PSBDTV9SRVZfQ00zKQogCQlyZXR1cm4gcmVhZF9nY3Jfc3lzX2NvbmZpZzIoKSAmIENNX0dDUl9TWVNfQ09ORklHMl9NQVhWUFdfTVNLOwogCisJaWYgKG1pcHNfY21fcHJlc2VudCgpKSB7CisJCS8qCisJCSAqIFdlIHByZXN1bWUgdGhhdCBhbGwgY29yZXMgaW4gdGhlIHN5c3RlbSB3aWxsIGhhdmUgdGhlIHNhbWUKKwkJICogbnVtYmVyIG9mIFZQKEUpcywgYW5kIGlmIHRoYXQgZXZlciBjaGFuZ2VzIHRoZW4gdGhpcyB3aWxsCisJCSAqIG5lZWQgcmV2aXNpdGluZy4KKwkJICovCisJCWNmZyA9IHJlYWRfZ2NyX2NsX2NvbmZpZygpICYgQ01fR0NSX0N4X0NPTkZJR19QVlBFX01TSzsKKwkJcmV0dXJuIChjZmcgPj4gQ01fR0NSX0N4X0NPTkZJR19QVlBFX1NIRikgKyAxOworCX0KKwogCWlmIChJU19FTkFCTEVEKENPTkZJR19TTVApKQogCQlyZXR1cm4gc21wX251bV9zaWJsaW5nczsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHNyZWdzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwc3JlZ3MuaAppbmRleCBkZWY5ZDhkLi43ZGQyZGQ0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwc3JlZ3MuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwc3JlZ3MuaApAQCAtNjYwLDggKzY2MCw2IEBACiAKICNkZWZpbmUgTUlQU19DT05GN19JQVIJCShfVUxDQVNUXygxKSA8PCAxMCkKICNkZWZpbmUgTUlQU19DT05GN19BUgkJKF9VTENBU1RfKDEpIDw8IDE2KQotLyogRlRMQiBwcm9iYWJpbGl0eSBiaXRzIGZvciBSNiAqLwotI2RlZmluZSBNSVBTX0NPTkY3X0ZUTEJQX1NISUZUCSgxOCkKIAogLyogV2F0Y2hMbyogcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgTUlQU19XQVRDSExPX0lSVwkoX1VMQ0FTVF8oMHg3KSA8PCAwKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BhZ2UuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wYWdlLmgKaW5kZXggZWEwY2Q5Ny4uNWY5ODc1OSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3BhZ2UuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcGFnZS5oCkBAIC0xNjQsNyArMTY0LDcgQEAKICAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fX3BhKHVuc2lnbmVkIGxvbmcgeCkKIHsKLQlpZiAoY29uZmlnX2VuYWJsZWQoQ09ORklHXzY0QklUKSkgeworCWlmIChJU19FTkFCTEVEKENPTkZJR182NEJJVCkpIHsKIAkJLyoKIAkJICogRm9yIE1JUFM2NCB0aGUgdmlydHVhbCBhZGRyZXNzIG1heSBlaXRoZXIgYmUgaW4gb25lIG9mCiAJCSAqIHRoZSBjb21wYXRpYmlsaXR5IHNlZ2VtZW50cyBja3NlZzAgb3IgY2tzZWcxLCBvciBpdCBtYXkKQEAgLTE3Myw3ICsxNzMsNyBAQAogCQlyZXR1cm4geCA8IENLU0VHMCA/IFhQSFlTQUREUih4KSA6IENQSFlTQUREUih4KTsKIAl9CiAKLQlpZiAoIWNvbmZpZ19lbmFibGVkKENPTkZJR19FVkEpKSB7CisJaWYgKCFJU19FTkFCTEVEKENPTkZJR19FVkEpKSB7CiAJCS8qCiAJCSAqIFdlJ3JlIHVzaW5nIHRoZSBzdGFuZGFyZCBNSVBTMzIgbGVnYWN5IG1lbW9yeSBtYXAsIGllLgogCQkgKiB0aGUgYWRkcmVzcyB4IGlzIGdvaW5nIHRvIGJlIGluIGtzZWcwIG9yIGtzZWcxLiBXZSBjYW4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IDExYjk2NWYuLjIxYTJhYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvdGhyZWFkX2luZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxhc20vYXNtLWV2YS5oPgogCiAvKgpAQCAtMTE3MCw2ICsxMTcxLDggQEAKIAkJCV9fY3VfbGVuID0gX19pbnZva2VfY29weV9mcm9tX3VzZXIoX19jdV90bywJXAogCQkJCQkJCSAgIF9fY3VfZnJvbSwJXAogCQkJCQkJCSAgIF9fY3VfbGVuKTsgICBcCisJCX0gZWxzZSB7CQkJCQkJXAorCQkJbWVtc2V0KF9fY3VfdG8sIDAsIF9fY3VfbGVuKTsJCQlcCiAJCX0JCQkJCQkJXAogCX0JCQkJCQkJCVwKIAlfX2N1X2xlbjsJCQkJCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3Vwcm9iZXMuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS91cHJvYmVzLmgKaW5kZXggMzRjMzI1Yy4uNzBhNGEyZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3Vwcm9iZXMuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdXByb2Jlcy5oCkBAIC0zNiw3ICszNiw2IEBACiAJdW5zaWduZWQgbG9uZwlyZXN1bWVfZXBjOwogCXUzMglpbnNuWzJdOwogCXUzMglpeG9sWzJdOwotCXVuaW9uCW1pcHNfaW5zdHJ1Y3Rpb24gb3JpZ19pbnN0W01BWF9VSU5TTl9CWVRFUyAvIDRdOwogfTsKIAogc3RydWN0IGFyY2hfdXByb2JlX3Rhc2sgewpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9jcHUtcHJvYmUuYyBiL2FyY2gvbWlwcy9rZXJuZWwvY3B1LXByb2JlLmMKaW5kZXggYTg4ZDQ0Mi4uZGQzMTc1NCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9jcHUtcHJvYmUuYworKysgYi9hcmNoL21pcHMva2VybmVsL2NwdS1wcm9iZS5jCkBAIC0zNTIsNyArMzUyLDEyIEBACiBzdGF0aWMgaW50IG1pcHNfZnRsYl9kaXNhYmxlZDsKIHN0YXRpYyBpbnQgbWlwc19oYXNfZnRsYl9jb25maWd1cmVkOwogCi1zdGF0aWMgaW50IHNldF9mdGxiX2VuYWJsZShzdHJ1Y3QgY3B1aW5mb19taXBzICpjLCBpbnQgZW5hYmxlKTsKK2VudW0gZnRsYl9mbGFncyB7CisJRlRMQl9FTgkJPSAxIDw8IDAsCisJRlRMQl9TRVRfUFJPQgk9IDEgPDwgMSwKK307CisKK3N0YXRpYyBpbnQgc2V0X2Z0bGJfZW5hYmxlKHN0cnVjdCBjcHVpbmZvX21pcHMgKmMsIGVudW0gZnRsYl9mbGFncyBmbGFncyk7CiAKIHN0YXRpYyBpbnQgX19pbml0IGZ0bGJfZGlzYWJsZShjaGFyICpzKQogewpAQCAtMzcxLDggKzM3Niw2IEBACiAJCXJldHVybiAxOwogCX0KIAotCWJhY2tfdG9fYmFja19jMF9oYXphcmQoKTsKLQogCWNvbmZpZzQgPSByZWFkX2MwX2NvbmZpZzQoKTsKIAogCS8qIENoZWNrIHRoYXQgRlRMQiBoYXMgYmVlbiBkaXNhYmxlZCAqLwpAQCAtNTMxLDcgKzUzNCw3IEBACiAJCXJldHVybiAzOwogfQogCi1zdGF0aWMgaW50IHNldF9mdGxiX2VuYWJsZShzdHJ1Y3QgY3B1aW5mb19taXBzICpjLCBpbnQgZW5hYmxlKQorc3RhdGljIGludCBzZXRfZnRsYl9lbmFibGUoc3RydWN0IGNwdWluZm9fbWlwcyAqYywgZW51bSBmdGxiX2ZsYWdzIGZsYWdzKQogewogCXVuc2lnbmVkIGludCBjb25maWc7CiAKQEAgLTU0MiwzMyArNTQ1LDMzIEBACiAJY2FzZSBDUFVfUDY2MDA6CiAJCS8qIHByb0FwdGl2ICYgcmVsYXRlZCBjb3JlcyB1c2UgQ29uZmlnNiB0byBlbmFibGUgdGhlIEZUTEIgKi8KIAkJY29uZmlnID0gcmVhZF9jMF9jb25maWc2KCk7Ci0JCS8qIENsZWFyIHRoZSBvbGQgcHJvYmFiaWxpdHkgdmFsdWUgKi8KLQkJY29uZmlnICY9IH4oMyA8PCBNSVBTX0NPTkY2X0ZUTEJQX1NISUZUKTsKLQkJaWYgKGVuYWJsZSkKLQkJCS8qIEVuYWJsZSBGVExCICovCi0JCQl3cml0ZV9jMF9jb25maWc2KGNvbmZpZyB8Ci0JCQkJCSAoY2FsY3VsYXRlX2Z0bGJfcHJvYmFiaWxpdHkoYykKLQkJCQkJICA8PCBNSVBTX0NPTkY2X0ZUTEJQX1NISUZUKQotCQkJCQkgfCBNSVBTX0NPTkY2X0ZUTEJFTik7CisKKwkJaWYgKGZsYWdzICYgRlRMQl9FTikKKwkJCWNvbmZpZyB8PSBNSVBTX0NPTkY2X0ZUTEJFTjsKIAkJZWxzZQotCQkJLyogRGlzYWJsZSBGVExCICovCi0JCQl3cml0ZV9jMF9jb25maWc2KGNvbmZpZyAmICB+TUlQU19DT05GNl9GVExCRU4pOworCQkJY29uZmlnICY9IH5NSVBTX0NPTkY2X0ZUTEJFTjsKKworCQlpZiAoZmxhZ3MgJiBGVExCX1NFVF9QUk9CKSB7CisJCQljb25maWcgJj0gfigzIDw8IE1JUFNfQ09ORjZfRlRMQlBfU0hJRlQpOworCQkJY29uZmlnIHw9IGNhbGN1bGF0ZV9mdGxiX3Byb2JhYmlsaXR5KGMpCisJCQkJICA8PCBNSVBTX0NPTkY2X0ZUTEJQX1NISUZUOworCQl9CisKKwkJd3JpdGVfYzBfY29uZmlnNihjb25maWcpOworCQliYWNrX3RvX2JhY2tfYzBfaGF6YXJkKCk7CiAJCWJyZWFrOwogCWNhc2UgQ1BVX0k2NDAwOgotCQkvKiBJNjQwMCAmIHJlbGF0ZWQgY29yZXMgdXNlIENvbmZpZzcgdG8gY29uZmlndXJlIEZUTEIgKi8KLQkJY29uZmlnID0gcmVhZF9jMF9jb25maWc3KCk7Ci0JCS8qIENsZWFyIHRoZSBvbGQgcHJvYmFiaWxpdHkgdmFsdWUgKi8KLQkJY29uZmlnICY9IH4oMyA8PCBNSVBTX0NPTkY3X0ZUTEJQX1NISUZUKTsKLQkJd3JpdGVfYzBfY29uZmlnNyhjb25maWcgfCAoY2FsY3VsYXRlX2Z0bGJfcHJvYmFiaWxpdHkoYykKLQkJCQkJICAgPDwgTUlQU19DT05GN19GVExCUF9TSElGVCkpOwotCQlicmVhazsKKwkJLyogVGhlcmUncyBubyB3YXkgdG8gZGlzYWJsZSB0aGUgRlRMQiAqLworCQlpZiAoIShmbGFncyAmIEZUTEJfRU4pKQorCQkJcmV0dXJuIDE7CisJCXJldHVybiAwOwogCWNhc2UgQ1BVX0xPT05HU09OMzoKIAkJLyogRmx1c2ggSVRMQiwgRFRMQiwgVlRMQiBhbmQgRlRMQiAqLwogCQl3cml0ZV9jMF9kaWFnKExPT05HU09OX0RJQUdfSVRMQiB8IExPT05HU09OX0RJQUdfRFRMQiB8CiAJCQkgICAgICBMT09OR1NPTl9ESUFHX1ZUTEIgfCBMT09OR1NPTl9ESUFHX0ZUTEIpOwogCQkvKiBMb29uZ3Nvbi0zIGNvcmVzIHVzZSBDb25maWc2IHRvIGVuYWJsZSB0aGUgRlRMQiAqLwogCQljb25maWcgPSByZWFkX2MwX2NvbmZpZzYoKTsKLQkJaWYgKGVuYWJsZSkKKwkJaWYgKGZsYWdzICYgRlRMQl9FTikKIAkJCS8qIEVuYWJsZSBGVExCICovCiAJCQl3cml0ZV9jMF9jb25maWc2KGNvbmZpZyAmIH5NSVBTX0NPTkY2X0ZUTEJESVMpOwogCQllbHNlCkBAIC03ODgsNiArNzkxLDcgQEAKIAkJCQkgICAgICAgUEFHRV9TSVpFLCBjb25maWc0KTsKIAkJCQkvKiBTd2l0Y2ggRlRMQiBvZmYgKi8KIAkJCQlzZXRfZnRsYl9lbmFibGUoYywgMCk7CisJCQkJbWlwc19mdGxiX2Rpc2FibGVkID0gMTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWMtPnRsYnNpemVmdGxic2V0cyA9IDEgPDwKQEAgLTg1Miw3ICs4NTYsNyBAQAogCWMtPnNjYWNoZS5mbGFncyA9IE1JUFNfQ0FDSEVfTk9UX1BSRVNFTlQ7CiAKIAkvKiBFbmFibGUgRlRMQiBpZiBwcmVzZW50IGFuZCBub3QgZGlzYWJsZWQgKi8KLQlzZXRfZnRsYl9lbmFibGUoYywgIW1pcHNfZnRsYl9kaXNhYmxlZCk7CisJc2V0X2Z0bGJfZW5hYmxlKGMsIG1pcHNfZnRsYl9kaXNhYmxlZCA/IDAgOiBGVExCX0VOKTsKIAogCW9rID0gZGVjb2RlX2NvbmZpZzAoYyk7CQkJLyogUmVhZCBDb25maWcgcmVnaXN0ZXJzLiAgKi8KIAlCVUdfT04oIW9rKTsJCQkJLyogQXJjaCBzcGVjIHZpb2xhdGlvbiEJICovCkBAIC05MDIsNiArOTA2LDkgQEAKIAkJfQogCX0KIAorCS8qIGNvbmZpZ3VyZSB0aGUgRlRMQiB3cml0ZSBwcm9iYWJpbGl0eSAqLworCXNldF9mdGxiX2VuYWJsZShjLCAobWlwc19mdGxiX2Rpc2FibGVkID8gMCA6IEZUTEJfRU4pIHwgRlRMQl9TRVRfUFJPQik7CisKIAltaXBzX3Byb2JlX3dhdGNoX3JlZ2lzdGVycyhjKTsKIAogI2lmbmRlZiBDT05GSUdfTUlQU19DUFMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvZnRyYWNlLmMgYi9hcmNoL21pcHMva2VybmVsL2Z0cmFjZS5jCmluZGV4IDkzN2M1NGIuLjMwYTNiNzUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvZnRyYWNlLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9mdHJhY2UuYwpAQCAtMzgyLDggKzM4Miw4IEBACiAJaWYgKHVubGlrZWx5KGZhdWx0ZWQpKQogCQlnb3RvIG91dDsKIAotCWlmIChmdHJhY2VfcHVzaF9yZXR1cm5fdHJhY2Uob2xkX3BhcmVudF9yYSwgc2VsZl9yYSwgJnRyYWNlLmRlcHRoLCBmcCkKLQkgICAgPT0gLUVCVVNZKSB7CisJaWYgKGZ0cmFjZV9wdXNoX3JldHVybl90cmFjZShvbGRfcGFyZW50X3JhLCBzZWxmX3JhLCAmdHJhY2UuZGVwdGgsIGZwLAorCQkJCSAgICAgTlVMTCkgPT0gLUVCVVNZKSB7CiAJCSpwYXJlbnRfcmFfYWRkciA9IG9sZF9wYXJlbnRfcmE7CiAJCXJldHVybjsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2dlbmV4LlMgYi9hcmNoL21pcHMva2VybmVsL2dlbmV4LlMKaW5kZXggMTczMjZhOS4uZGMwYjI5NiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9nZW5leC5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvZ2VuZXguUwpAQCAtMTQyLDkgKzE0Miw4IEBACiAJUFRSX0xBCWsxLCBfX3I0a193YWl0CiAJb3JpCWswLCAweDFmCS8qIDMyIGJ5dGUgcm9sbGJhY2sgcmVnaW9uICovCiAJeG9yaQlrMCwgMHgxZgotCWJuZQlrMCwgazEsIDlmCisJYm5lCWswLCBrMSwgXGhhbmRsZXIKIAlNVEMwCWswLCBDUDBfRVBDCi05OgogCS5zZXQgcG9wCiAJLmVuZG0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9taXBzLXIyLXRvLXI2LWVtdWwuYyBiL2FyY2gvbWlwcy9rZXJuZWwvbWlwcy1yMi10by1yNi1lbXVsLmMKaW5kZXggYzMzNzJjYS4uMGE3ZTEwYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9taXBzLXIyLXRvLXI2LWVtdWwuYworKysgYi9hcmNoL21pcHMva2VybmVsL21pcHMtcjItdG8tcjYtZW11bC5jCkBAIC0xMTY0LDcgKzExNjQsOSBAQAogCQlyZWdzLT5yZWdzWzMxXSA9IHIzMTsKIAkJcmVncy0+Y3AwX2VwYyA9IGVwYzsKIAkJaWYgKCF1c2VkX21hdGgoKSkgeyAgICAgLyogRmlyc3QgdGltZSBGUFUgdXNlci4gICovCisJCQlwcmVlbXB0X2Rpc2FibGUoKTsKIAkJCWVyciA9IGluaXRfZnB1KCk7CisJCQlwcmVlbXB0X2VuYWJsZSgpOwogCQkJc2V0X3VzZWRfbWF0aCgpOwogCQl9CiAJCWxvc2VfZnB1KDEpOyAgICAvKiBTYXZlIEZQVSBzdGF0ZSBmb3IgdGhlIGVtdWxhdG9yLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL21pcHMva2VybmVsL3Byb2Nlc3MuYwppbmRleCA3NDI5YWQwLi5kMmQwNjE1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL21pcHMva2VybmVsL3Byb2Nlc3MuYwpAQCAtNjA1LDE0ICs2MDUsMTQgQEAKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJLyogQXZvaWQgaW5hZHZlcnRlbnRseSB0cmlnZ2VyaW5nIGVtdWxhdGlvbiAqLwotCWlmICgodmFsdWUgJiBQUl9GUF9NT0RFX0ZSKSAmJiBjcHVfaGFzX2ZwdSAmJgotCSAgICAhKGN1cnJlbnRfY3B1X2RhdGEuZnB1X2lkICYgTUlQU19GUElSX0Y2NCkpCisJaWYgKCh2YWx1ZSAmIFBSX0ZQX01PREVfRlIpICYmIHJhd19jcHVfaGFzX2ZwdSAmJgorCSAgICAhKHJhd19jdXJyZW50X2NwdV9kYXRhLmZwdV9pZCAmIE1JUFNfRlBJUl9GNjQpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JaWYgKCh2YWx1ZSAmIFBSX0ZQX01PREVfRlJFKSAmJiBjcHVfaGFzX2ZwdSAmJiAhY3B1X2hhc19mcmUpCisJaWYgKCh2YWx1ZSAmIFBSX0ZQX01PREVfRlJFKSAmJiByYXdfY3B1X2hhc19mcHUgJiYgIWNwdV9oYXNfZnJlKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAkvKiBGUiA9IDAgbm90IHN1cHBvcnRlZCBpbiBNSVBTIFI2ICovCi0JaWYgKCEodmFsdWUgJiBQUl9GUF9NT0RFX0ZSKSAmJiBjcHVfaGFzX2ZwdSAmJiBjcHVfaGFzX21pcHNfcjYpCisJaWYgKCEodmFsdWUgJiBQUl9GUF9NT0RFX0ZSKSAmJiByYXdfY3B1X2hhc19mcHUgJiYgY3B1X2hhc19taXBzX3I2KQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAkvKiBQcm9jZWVkIHdpdGggdGhlIG1vZGUgc3dpdGNoICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NldHVwLmMgYi9hcmNoL21pcHMva2VybmVsL3NldHVwLmMKaW5kZXggMzZjZjhkNi4uMGQ1NzkwOSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc2V0dXAuYwpAQCAtODcsNiArODcsMTMgQEAKIAlpbnQgeCA9IGJvb3RfbWVtX21hcC5ucl9tYXA7CiAJaW50IGk7CiAKKwkvKgorCSAqIElmIHRoZSByZWdpb24gcmVhY2hlcyB0aGUgdG9wIG9mIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlLCBhZGp1c3QKKwkgKiB0aGUgc2l6ZSBzbGlnaHRseSBzbyB0aGF0IChzdGFydCArIHNpemUpIGRvZXNuJ3Qgb3ZlcmZsb3cKKwkgKi8KKwlpZiAoc3RhcnQgKyBzaXplIC0gMSA9PSAocGh5c19hZGRyX3QpVUxMT05HX01BWCkKKwkJLS1zaXplOworCiAJLyogU2FuaXR5IGNoZWNrICovCiAJaWYgKHN0YXJ0ICsgc2l6ZSA8IHN0YXJ0KSB7CiAJCXByX3dhcm4oIlRyeWluZyB0byBhZGQgYW4gaW52YWxpZCBtZW1vcnkgcmVnaW9uLCBza2lwcGVkXG4iKTsKQEAgLTc1Nyw3ICs3NjQsNiBAQAogCWRldmljZV90cmVlX2luaXQoKTsKIAlzcGFyc2VfaW5pdCgpOwogCXBsYXRfc3dpb3RsYl9zZXR1cCgpOwotCXBhZ2luZ19pbml0KCk7CiAKIAlkbWFfY29udGlndW91c19yZXNlcnZlKFBGTl9QSFlTKG1heF9sb3dfcGZuKSk7CiAJLyogVGVsbCBib290bWVtIGFib3V0IGNtYSByZXNlcnZlZCBtZW1ibG9jayBzZWN0aW9uICovCkBAIC04NzAsNiArODc2LDcgQEAKIAlwcmVmaWxsX3Bvc3NpYmxlX21hcCgpOwogCiAJY3B1X2NhY2hlX2luaXQoKTsKKwlwYWdpbmdfaW5pdCgpOwogfQogCiB1bnNpZ25lZCBsb25nIGtlcm5lbHNwW05SX0NQVVNdOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zbXAtY3BzLmMgYi9hcmNoL21pcHMva2VybmVsL3NtcC1jcHMuYwppbmRleCBlOWQ5ZmM2Li42MTgzYWQ4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NtcC1jcHMuYworKysgYi9hcmNoL21pcHMva2VybmVsL3NtcC1jcHMuYwpAQCAtNTEzLDcgKzUxMyw3IEBACiAJCSAqIGluIHdoaWNoIGNhc2UgdGhlIENQQyB3aWxsIHJlZnVzZSB0byBwb3dlciBkb3duIHRoZSBjb3JlLgogCQkgKi8KIAkJZG8gewotCQkJbWlwc19jbV9sb2NrX290aGVyKGNvcmUsIHZwZV9pZCk7CisJCQltaXBzX2NtX2xvY2tfb3RoZXIoY29yZSwgMCk7CiAJCQltaXBzX2NwY19sb2NrX290aGVyKGNvcmUpOwogCQkJc3RhdCA9IHJlYWRfY3BjX2NvX3N0YXRfY29uZigpOwogCQkJc3RhdCAmPSBDUENfQ3hfU1RBVF9DT05GX1NFUVNUQVRFX01TSzsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc21wLmMgYi9hcmNoL21pcHMva2VybmVsL3NtcC5jCmluZGV4IGY5NWYwOTQuLmIwYmFmNDggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zbXAuYwpAQCAtMzIyLDYgKzMyMiw5IEBACiAJY3B1bWFza19zZXRfY3B1KGNwdSwgJmNwdV9jb2hlcmVudF9tYXNrKTsKIAlub3RpZnlfY3B1X3N0YXJ0aW5nKGNwdSk7CiAKKwljcHVtYXNrX3NldF9jcHUoY3B1LCAmY3B1X2NhbGxpbl9tYXApOworCXN5bmNocm9uaXNlX2NvdW50X3NsYXZlKGNwdSk7CisKIAlzZXRfY3B1X29ubGluZShjcHUsIHRydWUpOwogCiAJc2V0X2NwdV9zaWJsaW5nX21hcChjcHUpOwpAQCAtMzI5LDEwICszMzIsNiBAQAogCiAJY2FsY3VsYXRlX2NwdV9mb3JlaWduX21hcCgpOwogCi0JY3B1bWFza19zZXRfY3B1KGNwdSwgJmNwdV9jYWxsaW5fbWFwKTsKLQotCXN5bmNocm9uaXNlX2NvdW50X3NsYXZlKGNwdSk7Ci0KIAkvKgogCSAqIGlycSB3aWxsIGJlIGVuYWJsZWQgaW4gLT5zbXBfZmluaXNoKCksIGVuYWJsaW5nIGl0IHRvbyBlYXJseQogCSAqIGlzIGRhbmdlcm91cy4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvdXByb2Jlcy5jIGIvYXJjaC9taXBzL2tlcm5lbC91cHJvYmVzLmMKaW5kZXggODQ1MmQ5My4uNGM3YzE1NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC91cHJvYmVzLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC91cHJvYmVzLmMKQEAgLTE1Nyw3ICsxNTcsNiBAQAogaW50IGFyY2hfdXByb2JlX3ByZV94b2woc3RydWN0IGFyY2hfdXByb2JlICphdXAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCB1cHJvYmVfdGFzayAqdXRhc2sgPSBjdXJyZW50LT51dGFzazsKLQl1bmlvbiBtaXBzX2luc3RydWN0aW9uIGluc247CiAKIAkvKgogCSAqIE5vdyBmaW5kIHRoZSBFUEMgd2hlcmUgdG8gcmVzdW1lIGFmdGVyIHRoZSBicmVha3BvaW50IGhhcyBiZWVuCkBAIC0xNjgsMTAgKzE2NywxMCBAQAogCQl1bnNpZ25lZCBsb25nIGVwYzsKIAogCQllcGMgPSByZWdzLT5jcDBfZXBjOwotCQlfX2NvbXB1dGVfcmV0dXJuX2VwY19mb3JfaW5zbihyZWdzLCBpbnNuKTsKKwkJX19jb21wdXRlX3JldHVybl9lcGNfZm9yX2luc24ocmVncywKKwkJCSh1bmlvbiBtaXBzX2luc3RydWN0aW9uKSBhdXAtPmluc25bMF0pOwogCQlhdXAtPnJlc3VtZV9lcGMgPSByZWdzLT5jcDBfZXBjOwogCX0KLQogCXV0YXNrLT5hdXRhc2suc2F2ZWRfdHJhcF9uciA9IGN1cnJlbnQtPnRocmVhZC50cmFwX25yOwogCWN1cnJlbnQtPnRocmVhZC50cmFwX25yID0gVVBST0JFX1RSQVBfTlI7CiAJcmVncy0+Y3AwX2VwYyA9IGN1cnJlbnQtPnV0YXNrLT54b2xfdmFkZHI7CkBAIC0yMjIsNyArMjIxLDcgQEAKIAkJcmV0dXJuIE5PVElGWV9ET05FOwogCiAJc3dpdGNoICh2YWwpIHsKLQljYXNlIERJRV9CUkVBSzoKKwljYXNlIERJRV9VUFJPQkU6CiAJCWlmICh1cHJvYmVfcHJlX3NzdGVwX25vdGlmaWVyKHJlZ3MpKQogCQkJcmV0dXJuIE5PVElGWV9TVE9QOwogCQlicmVhazsKQEAgLTI1Nyw3ICsyNTYsNyBAQAogCXJhID0gcmVncy0+cmVnc1szMV07CiAKIAkvKiBSZXBsYWNlIHRoZSByZXR1cm4gYWRkcmVzcyB3aXRoIHRoZSB0cmFtcG9saW5lIGFkZHJlc3MgKi8KLQlyZWdzLT5yZWdzWzMxXSA9IHJhOworCXJlZ3MtPnJlZ3NbMzFdID0gdHJhbXBvbGluZV92YWRkcjsKIAogCXJldHVybiByYTsKIH0KQEAgLTI4MCwyNCArMjc5LDYgQEAKIAlyZXR1cm4gdXByb2JlX3dyaXRlX29wY29kZShtbSwgdmFkZHIsIFVQUk9CRV9TV0JQX0lOU04pOwogfQogCi0vKioKLSAqIHNldF9vcmlnX2luc24gLSBSZXN0b3JlIHRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbi4KLSAqIEBtbTogdGhlIHByb2JlZCBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UuCi0gKiBAYXVwcm9iZTogYXJjaCBzcGVjaWZpYyBwcm9iZXBvaW50IGluZm9ybWF0aW9uLgotICogQHZhZGRyOiB0aGUgdmlydHVhbCBhZGRyZXNzIHRvIGluc2VydCB0aGUgb3Bjb2RlLgotICoKLSAqIEZvciBtbSBAbW0sIHJlc3RvcmUgdGhlIG9yaWdpbmFsIG9wY29kZSAob3Bjb2RlKSBhdCBAdmFkZHIuCi0gKiBSZXR1cm4gMCAoc3VjY2Vzcykgb3IgYSBuZWdhdGl2ZSBlcnJuby4KLSAqCi0gKiBUaGlzIG92ZXJyaWRlcyB0aGUgd2VhayB2ZXJzaW9uIGluIGtlcm5lbC9ldmVudHMvdXByb2Jlcy5jLgotICovCi1pbnQgc2V0X29yaWdfaW5zbihzdHJ1Y3QgYXJjaF91cHJvYmUgKmF1cHJvYmUsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAotCQkgdW5zaWduZWQgbG9uZyB2YWRkcikKLXsKLQlyZXR1cm4gdXByb2JlX3dyaXRlX29wY29kZShtbSwgdmFkZHIsCi0JCQkqKHVwcm9iZV9vcGNvZGVfdCAqKSZhdXByb2JlLT5vcmlnX2luc3RbMF0ud29yZCk7Ci19Ci0KIHZvaWQgX193ZWFrIGFyY2hfdXByb2JlX2NvcHlfaXhvbChzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyB2YWRkciwKIAkJCQkgIHZvaWQgKnNyYywgdW5zaWduZWQgbG9uZyBsZW4pCiB7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3Zkc28uYyBiL2FyY2gvbWlwcy9rZXJuZWwvdmRzby5jCmluZGV4IDlhYmU0NDcuLmY5ZGJmYjEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvdmRzby5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvdmRzby5jCkBAIC0zOSwxNiArMzksMTYgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBpbml0X3Zkc29faW1hZ2Uoc3RydWN0IG1pcHNfdmRzb19pbWFnZSAqaW1hZ2UpCiB7CiAJdW5zaWduZWQgbG9uZyBudW1fcGFnZXMsIGk7CisJdW5zaWduZWQgbG9uZyBkYXRhX3BmbjsKIAogCUJVR19PTighUEFHRV9BTElHTkVEKGltYWdlLT5kYXRhKSk7CiAJQlVHX09OKCFQQUdFX0FMSUdORUQoaW1hZ2UtPnNpemUpKTsKIAogCW51bV9wYWdlcyA9IGltYWdlLT5zaXplIC8gUEFHRV9TSVpFOwogCi0JZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgaSsrKSB7Ci0JCWltYWdlLT5tYXBwaW5nLnBhZ2VzW2ldID0KLQkJCXZpcnRfdG9fcGFnZShpbWFnZS0+ZGF0YSArIChpICogUEFHRV9TSVpFKSk7Ci0JfQorCWRhdGFfcGZuID0gX19waHlzX3RvX3BmbihfX3BhX3N5bWJvbChpbWFnZS0+ZGF0YSkpOworCWZvciAoaSA9IDA7IGkgPCBudW1fcGFnZXM7IGkrKykKKwkJaW1hZ2UtPm1hcHBpbmcucGFnZXNbaV0gPSBwZm5fdG9fcGFnZShkYXRhX3BmbiArIGkpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3Zkc28odm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rdm0vZW11bGF0ZS5jIGIvYXJjaC9taXBzL2t2bS9lbXVsYXRlLmMKaW5kZXggZTc4ODUxNS4uNGRiNGMwMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2t2bS9lbXVsYXRlLmMKKysrIGIvYXJjaC9taXBzL2t2bS9lbXVsYXRlLmMKQEAgLTg0Niw2ICs4NDYsNDcgQEAKIAlyZXR1cm4gRU1VTEFURV9GQUlMOwogfQogCisvKioKKyAqIGt2bV9taXBzX2ludmFsaWRhdGVfZ3Vlc3RfdGxiKCkgLSBJbmRpY2F0ZXMgYSBjaGFuZ2UgaW4gZ3Vlc3QgTU1VIG1hcC4KKyAqIEB2Y3B1OglWQ1BVIHdpdGggY2hhbmdlZCBtYXBwaW5ncy4KKyAqIEB0bGI6CVRMQiBlbnRyeSBiZWluZyByZW1vdmVkLgorICoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIGluZGljYXRlIGEgc2luZ2xlIGNoYW5nZSBpbiBndWVzdCBNTVUgbWFwcGluZ3MsIHNvIHRoYXQgd2UKKyAqIGNhbiBhcnJhbmdlIFRMQiBmbHVzaGVzIG9uIHRoaXMgYW5kIG90aGVyIENQVXMuCisgKi8KK3N0YXRpYyB2b2lkIGt2bV9taXBzX2ludmFsaWRhdGVfZ3Vlc3RfdGxiKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCQkJICBzdHJ1Y3Qga3ZtX21pcHNfdGxiICp0bGIpCit7CisJaW50IGNwdSwgaTsKKwlib29sIHVzZXI7CisKKwkvKiBObyBuZWVkIHRvIGZsdXNoIGZvciBlbnRyaWVzIHdoaWNoIGFyZSBhbHJlYWR5IGludmFsaWQgKi8KKwlpZiAoISgodGxiLT50bGJfbG9bMF0gfCB0bGItPnRsYl9sb1sxXSkgJiBFTlRSWUxPX1YpKQorCQlyZXR1cm47CisJLyogVXNlciBhZGRyZXNzIHNwYWNlIGRvZXNuJ3QgbmVlZCBmbHVzaGluZyBmb3IgS1NlZzIvMyBjaGFuZ2VzICovCisJdXNlciA9IHRsYi0+dGxiX2hpIDwgS1ZNX0dVRVNUX0tTRUcwOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisKKwkvKgorCSAqIFByb2JlIHRoZSBzaGFkb3cgaG9zdCBUTEIgZm9yIHRoZSBlbnRyeSBiZWluZyBvdmVyd3JpdHRlbiwgaWYgb25lCisJICogbWF0Y2hlcywgaW52YWxpZGF0ZSBpdAorCSAqLworCWt2bV9taXBzX2hvc3RfdGxiX2ludih2Y3B1LCB0bGItPnRsYl9oaSk7CisKKwkvKiBJbnZhbGlkYXRlIHRoZSB3aG9sZSBBU0lEIG9uIG90aGVyIENQVXMgKi8KKwljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKKwkJaWYgKGkgPT0gY3B1KQorCQkJY29udGludWU7CisJCWlmICh1c2VyKQorCQkJdmNwdS0+YXJjaC5ndWVzdF91c2VyX2FzaWRbaV0gPSAwOworCQl2Y3B1LT5hcmNoLmd1ZXN0X2tlcm5lbF9hc2lkW2ldID0gMDsKKwl9CisKKwlwcmVlbXB0X2VuYWJsZSgpOworfQorCiAvKiBXcml0ZSBHdWVzdCBUTEIgRW50cnkgQCBJbmRleCAqLwogZW51bSBlbXVsYXRpb25fcmVzdWx0IGt2bV9taXBzX2VtdWxfdGxid2koc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewpAQCAtODY1LDExICs5MDYsOCBAQAogCX0KIAogCXRsYiA9ICZ2Y3B1LT5hcmNoLmd1ZXN0X3RsYltpbmRleF07Ci0JLyoKLQkgKiBQcm9iZSB0aGUgc2hhZG93IGhvc3QgVExCIGZvciB0aGUgZW50cnkgYmVpbmcgb3ZlcndyaXR0ZW4sIGlmIG9uZQotCSAqIG1hdGNoZXMsIGludmFsaWRhdGUgaXQKLQkgKi8KLQlrdm1fbWlwc19ob3N0X3RsYl9pbnYodmNwdSwgdGxiLT50bGJfaGkpOworCisJa3ZtX21pcHNfaW52YWxpZGF0ZV9ndWVzdF90bGIodmNwdSwgdGxiKTsKIAogCXRsYi0+dGxiX21hc2sgPSBrdm1fcmVhZF9jMF9ndWVzdF9wYWdlbWFzayhjb3AwKTsKIAl0bGItPnRsYl9oaSA9IGt2bV9yZWFkX2MwX2d1ZXN0X2VudHJ5aGkoY29wMCk7CkBAIC04OTgsMTEgKzkzNiw3IEBACiAKIAl0bGIgPSAmdmNwdS0+YXJjaC5ndWVzdF90bGJbaW5kZXhdOwogCi0JLyoKLQkgKiBQcm9iZSB0aGUgc2hhZG93IGhvc3QgVExCIGZvciB0aGUgZW50cnkgYmVpbmcgb3ZlcndyaXR0ZW4sIGlmIG9uZQotCSAqIG1hdGNoZXMsIGludmFsaWRhdGUgaXQKLQkgKi8KLQlrdm1fbWlwc19ob3N0X3RsYl9pbnYodmNwdSwgdGxiLT50bGJfaGkpOworCWt2bV9taXBzX2ludmFsaWRhdGVfZ3Vlc3RfdGxiKHZjcHUsIHRsYik7CiAKIAl0bGItPnRsYl9tYXNrID0ga3ZtX3JlYWRfYzBfZ3Vlc3RfcGFnZW1hc2soY29wMCk7CiAJdGxiLT50bGJfaGkgPSBrdm1fcmVhZF9jMF9ndWVzdF9lbnRyeWhpKGNvcDApOwpAQCAtMTAyNiw2ICsxMDYwLDcgQEAKIAllbnVtIGVtdWxhdGlvbl9yZXN1bHQgZXIgPSBFTVVMQVRFX0RPTkU7CiAJdTMyIHJ0LCByZCwgc2VsOwogCXVuc2lnbmVkIGxvbmcgY3Vycl9wYzsKKwlpbnQgY3B1LCBpOwogCiAJLyoKIAkgKiBVcGRhdGUgUEMgYW5kIGhvbGQgb250byBjdXJyZW50IFBDIGluIGNhc2UgdGhlcmUgaXMKQEAgLTExMjcsMTYgKzExNjIsMzEgQEAKIAkJCX0gZWxzZSBpZiAocmQgPT0gTUlQU19DUDBfVExCX0hJICYmIHNlbCA9PSAwKSB7CiAJCQkJdTMyIG5hc2lkID0KIAkJCQkJdmNwdS0+YXJjaC5ncHJzW3J0XSAmIEtWTV9FTlRSWUhJX0FTSUQ7Ci0JCQkJaWYgKChLU0VHWCh2Y3B1LT5hcmNoLmdwcnNbcnRdKSAhPSBDS1NFRzApICYmCi0JCQkJICAgICgoa3ZtX3JlYWRfYzBfZ3Vlc3RfZW50cnloaShjb3AwKSAmCisJCQkJaWYgKCgoa3ZtX3JlYWRfYzBfZ3Vlc3RfZW50cnloaShjb3AwKSAmCiAJCQkJICAgICAgS1ZNX0VOVFJZSElfQVNJRCkgIT0gbmFzaWQpKSB7CiAJCQkJCXRyYWNlX2t2bV9hc2lkX2NoYW5nZSh2Y3B1LAogCQkJCQkJa3ZtX3JlYWRfYzBfZ3Vlc3RfZW50cnloaShjb3AwKQogCQkJCQkJCSYgS1ZNX0VOVFJZSElfQVNJRCwKIAkJCQkJCW5hc2lkKTsKIAotCQkJCQkvKiBCbG93IGF3YXkgdGhlIHNoYWRvdyBob3N0IFRMQnMgKi8KLQkJCQkJa3ZtX21pcHNfZmx1c2hfaG9zdF90bGIoMSk7CisJCQkJCS8qCisJCQkJCSAqIFJlZ2VuZXJhdGUvaW52YWxpZGF0ZSBrZXJuZWwgTU1VCisJCQkJCSAqIGNvbnRleHQuCisJCQkJCSAqIFRoZSB1c2VyIE1NVSBjb250ZXh0IHdpbGwgYmUKKwkJCQkJICogcmVnZW5lcmF0ZWQgbGF6aWx5IG9uIHJlLWVudHJ5IHRvCisJCQkJCSAqIGd1ZXN0IHVzZXIgaWYgdGhlIGd1ZXN0IEFTSUQgYWN0dWFsbHkKKwkJCQkJICogY2hhbmdlcy4KKwkJCQkJICovCisJCQkJCXByZWVtcHRfZGlzYWJsZSgpOworCQkJCQljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJCQkJCWt2bV9nZXRfbmV3X21tdV9jb250ZXh0KCZ2Y3B1LT5hcmNoLmd1ZXN0X2tlcm5lbF9tbSwKKwkJCQkJCQkJY3B1LCB2Y3B1KTsKKwkJCQkJdmNwdS0+YXJjaC5ndWVzdF9rZXJuZWxfYXNpZFtjcHVdID0KKwkJCQkJCXZjcHUtPmFyY2guZ3Vlc3Rfa2VybmVsX21tLmNvbnRleHQuYXNpZFtjcHVdOworCQkJCQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkKKwkJCQkJCWlmIChpICE9IGNwdSkKKwkJCQkJCQl2Y3B1LT5hcmNoLmd1ZXN0X2tlcm5lbF9hc2lkW2ldID0gMDsKKwkJCQkJcHJlZW1wdF9lbmFibGUoKTsKIAkJCQl9CiAJCQkJa3ZtX3dyaXRlX2MwX2d1ZXN0X2VudHJ5aGkoY29wMCwKIAkJCQkJCQkgICB2Y3B1LT5hcmNoLmdwcnNbcnRdKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rdm0vbWlwcy5jIGIvYXJjaC9taXBzL2t2bS9taXBzLmMKaW5kZXggYTZlYTA4NC4uY2U5NjE0OSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2t2bS9taXBzLmMKKysrIGIvYXJjaC9taXBzL2t2bS9taXBzLmMKQEAgLTE0MCw2ICsxNDAsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAorYm9vbCBrdm1fYXJjaF9oYXNfdmNwdV9kZWJ1Z2ZzKHZvaWQpCit7CisJcmV0dXJuIGZhbHNlOworfQorCitpbnQga3ZtX2FyY2hfY3JlYXRlX3ZjcHVfZGVidWdmcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJcmV0dXJuIDA7Cit9CisKIHZvaWQga3ZtX21pcHNfZnJlZV92Y3B1cyhzdHJ1Y3Qga3ZtICprdm0pCiB7CiAJdW5zaWduZWQgaW50IGk7CkBAIC00MTEsNiArNDIxLDMxIEBACiAJcmV0dXJuIC1FTk9JT0NUTENNRDsKIH0KIAorLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBwcmVlbXB0aW9uIGRpc2FibGVkLCBqdXN0IGJlZm9yZSBlbnRlcmluZyBndWVzdCAqLworc3RhdGljIHZvaWQga3ZtX21pcHNfY2hlY2tfYXNpZHMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCBtaXBzX2NvcHJvYyAqY29wMCA9IHZjcHUtPmFyY2guY29wMDsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXVuc2lnbmVkIGludCBnYXNpZDsKKworCS8qCisJICogTGF6eSBob3N0IEFTSUQgcmVnZW5lcmF0aW9uIGZvciBndWVzdCB1c2VyIG1vZGUuCisJICogSWYgdGhlIGd1ZXN0IEFTSUQgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgZ3Vlc3QgdXNlcm1vZGUKKwkgKiBleGVjdXRpb24sIHJlZ2VuZXJhdGUgdGhlIGhvc3QgQVNJRCBzbyBhcyB0byBpbnZhbGlkYXRlIHN0YWxlIFRMQgorCSAqIGVudHJpZXMuCisJICovCisJaWYgKCFLVk1fR1VFU1RfS0VSTkVMX01PREUodmNwdSkpIHsKKwkJZ2FzaWQgPSBrdm1fcmVhZF9jMF9ndWVzdF9lbnRyeWhpKGNvcDApICYgS1ZNX0VOVFJZSElfQVNJRDsKKwkJaWYgKGdhc2lkICE9IHZjcHUtPmFyY2gubGFzdF91c2VyX2dhc2lkKSB7CisJCQlrdm1fZ2V0X25ld19tbXVfY29udGV4dCgmdmNwdS0+YXJjaC5ndWVzdF91c2VyX21tLCBjcHUsCisJCQkJCQl2Y3B1KTsKKwkJCXZjcHUtPmFyY2guZ3Vlc3RfdXNlcl9hc2lkW2NwdV0gPQorCQkJCXZjcHUtPmFyY2guZ3Vlc3RfdXNlcl9tbS5jb250ZXh0LmFzaWRbY3B1XTsKKwkJCXZjcHUtPmFyY2gubGFzdF91c2VyX2dhc2lkID0gZ2FzaWQ7CisJCX0KKwl9Cit9CisKIGludCBrdm1fYXJjaF92Y3B1X2lvY3RsX3J1bihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW4pCiB7CiAJaW50IHIgPSAwOwpAQCAtNDM4LDYgKzQ3Myw5IEBACiAJaHR3X3N0b3AoKTsKIAogCXRyYWNlX2t2bV9lbnRlcih2Y3B1KTsKKworCWt2bV9taXBzX2NoZWNrX2FzaWRzKHZjcHUpOworCiAJciA9IHZjcHUtPmFyY2gudmNwdV9ydW4ocnVuLCB2Y3B1KTsKIAl0cmFjZV9rdm1fb3V0KHZjcHUpOwogCkBAIC0xNTUxLDYgKzE1ODksOCBAQAogCWlmIChyZXQgPT0gUkVTVU1FX0dVRVNUKSB7CiAJCXRyYWNlX2t2bV9yZWVudGVyKHZjcHUpOwogCisJCWt2bV9taXBzX2NoZWNrX2FzaWRzKHZjcHUpOworCiAJCS8qCiAJCSAqIElmIEZQVSAvIE1TQSBhcmUgZW5hYmxlZCAoaS5lLiB0aGUgZ3Vlc3QncyBGUFUgLyBNU0EgY29udGV4dAogCQkgKiBpcyBsaXZlKSwgcmVzdG9yZSBGQ1IzMSAvIE1TQUNTUi4KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rdm0vbW11LmMgYi9hcmNoL21pcHMva3ZtL21tdS5jCmluZGV4IDZjZmRjZjUuLjAzODgzYmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rdm0vbW11LmMKKysrIGIvYXJjaC9taXBzL2t2bS9tbXUuYwpAQCAtNDAsNyArNDAsNyBAQAogCXNyY3VfaWR4ID0gc3JjdV9yZWFkX2xvY2soJmt2bS0+c3JjdSk7CiAJcGZuID0gZ2ZuX3RvX3Bmbihrdm0sIGdmbik7CiAKLQlpZiAoaXNfZXJyb3JfcGZuKHBmbikpIHsKKwlpZiAoaXNfZXJyb3Jfbm9zbG90X3BmbihwZm4pKSB7CiAJCWt2bV9lcnIoIkNvdWxkbid0IGdldCBwZm4gZm9yIGdmbiAlI2xseCFcbiIsIGdmbik7CiAJCWVyciA9IC1FRkFVTFQ7CiAJCWdvdG8gb3V0OwpAQCAtMjUwLDE1ICsyNTAsMjcgQEAKIAkJa3ZtX2dldF9uZXdfbW11X2NvbnRleHQoJnZjcHUtPmFyY2guZ3Vlc3Rfa2VybmVsX21tLCBjcHUsIHZjcHUpOwogCQl2Y3B1LT5hcmNoLmd1ZXN0X2tlcm5lbF9hc2lkW2NwdV0gPQogCQkgICAgdmNwdS0+YXJjaC5ndWVzdF9rZXJuZWxfbW0uY29udGV4dC5hc2lkW2NwdV07Ci0JCWt2bV9nZXRfbmV3X21tdV9jb250ZXh0KCZ2Y3B1LT5hcmNoLmd1ZXN0X3VzZXJfbW0sIGNwdSwgdmNwdSk7Ci0JCXZjcHUtPmFyY2guZ3Vlc3RfdXNlcl9hc2lkW2NwdV0gPQotCQkgICAgdmNwdS0+YXJjaC5ndWVzdF91c2VyX21tLmNvbnRleHQuYXNpZFtjcHVdOwogCQluZXdhc2lkKys7CiAKIAkJa3ZtX2RlYnVnKCJbJWRdOiBjcHVfY29udGV4dDogJSNseFxuIiwgY3B1LAogCQkJICBjcHVfY29udGV4dChjcHUsIGN1cnJlbnQtPm1tKSk7CiAJCWt2bV9kZWJ1ZygiWyVkXTogQWxsb2NhdGVkIG5ldyBBU0lEIGZvciBHdWVzdCBLZXJuZWw6ICUjeFxuIiwKIAkJCSAgY3B1LCB2Y3B1LT5hcmNoLmd1ZXN0X2tlcm5lbF9hc2lkW2NwdV0pOworCX0KKworCWlmICgodmNwdS0+YXJjaC5ndWVzdF91c2VyX2FzaWRbY3B1XSBeIGFzaWRfY2FjaGUoY3B1KSkgJgorCQkJCQkJYXNpZF92ZXJzaW9uX21hc2soY3B1KSkgeworCQl1MzIgZ2FzaWQgPSBrdm1fcmVhZF9jMF9ndWVzdF9lbnRyeWhpKHZjcHUtPmFyY2guY29wMCkgJgorCQkJCUtWTV9FTlRSWUhJX0FTSUQ7CisKKwkJa3ZtX2dldF9uZXdfbW11X2NvbnRleHQoJnZjcHUtPmFyY2guZ3Vlc3RfdXNlcl9tbSwgY3B1LCB2Y3B1KTsKKwkJdmNwdS0+YXJjaC5ndWVzdF91c2VyX2FzaWRbY3B1XSA9CisJCSAgICB2Y3B1LT5hcmNoLmd1ZXN0X3VzZXJfbW0uY29udGV4dC5hc2lkW2NwdV07CisJCXZjcHUtPmFyY2gubGFzdF91c2VyX2dhc2lkID0gZ2FzaWQ7CisJCW5ld2FzaWQrKzsKKworCQlrdm1fZGVidWcoIlslZF06IGNwdV9jb250ZXh0OiAlI2x4XG4iLCBjcHUsCisJCQkgIGNwdV9jb250ZXh0KGNwdSwgY3VycmVudC0+bW0pKTsKIAkJa3ZtX2RlYnVnKCJbJWRdOiBBbGxvY2F0ZWQgbmV3IEFTSUQgZm9yIEd1ZXN0IFVzZXI6ICUjeFxuIiwgY3B1LAogCQkJICB2Y3B1LT5hcmNoLmd1ZXN0X3VzZXJfYXNpZFtjcHVdKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva3ZtL3RyYXBfZW11bC5jIGIvYXJjaC9taXBzL2t2bS90cmFwX2VtdWwuYwppbmRleCAwOTE1NTM5Li4zYTU0ODRmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva3ZtL3RyYXBfZW11bC5jCisrKyBiL2FyY2gvbWlwcy9rdm0vdHJhcF9lbXVsLmMKQEAgLTE3NSw2ICsxNzUsMjQgQEAKIAkJCXJ1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JTlRFUk5BTF9FUlJPUjsKIAkJCXJldCA9IFJFU1VNRV9IT1NUOwogCQl9CisJfSBlbHNlIGlmIChLVk1fR1VFU1RfS0VSTkVMX01PREUodmNwdSkKKwkJICAgJiYgKEtTRUdYKGJhZHZhZGRyKSA9PSBDS1NFRzAgfHwgS1NFR1goYmFkdmFkZHIpID09IENLU0VHMSkpIHsKKwkJLyoKKwkJICogV2l0aCBFVkEgd2UgbWF5IGdldCBhIFRMQiBleGNlcHRpb24gaW5zdGVhZCBvZiBhbiBhZGRyZXNzCisJCSAqIGVycm9yIHdoZW4gdGhlIGd1ZXN0IHBlcmZvcm1zIE1NSU8gdG8gS1NlZzEgYWRkcmVzc2VzLgorCQkgKi8KKwkJa3ZtX2RlYnVnKCJFbXVsYXRlICVzIE1NSU8gc3BhY2VcbiIsCisJCQkgIHN0b3JlID8gIlN0b3JlIHRvIiA6ICJMb2FkIGZyb20iKTsKKwkJZXIgPSBrdm1fbWlwc19lbXVsYXRlX2luc3QoY2F1c2UsIG9wYywgcnVuLCB2Y3B1KTsKKwkJaWYgKGVyID09IEVNVUxBVEVfRkFJTCkgeworCQkJa3ZtX2VycigiRW11bGF0ZSAlcyBNTUlPIHNwYWNlIGZhaWxlZFxuIiwKKwkJCQlzdG9yZSA/ICJTdG9yZSB0byIgOiAiTG9hZCBmcm9tIik7CisJCQlydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfSU5URVJOQUxfRVJST1I7CisJCQlyZXQgPSBSRVNVTUVfSE9TVDsKKwkJfSBlbHNlIHsKKwkJCXJ1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9NTUlPOworCQkJcmV0ID0gUkVTVU1FX0hPU1Q7CisJCX0KIAl9IGVsc2UgewogCQlrdm1fZXJyKCJJbGxlZ2FsIFRMQiAlcyBmYXVsdCBhZGRyZXNzICwgY2F1c2UgJSN4LCBQQzogJXAsIEJhZFZhZGRyOiAlI2x4XG4iLAogCQkJc3RvcmUgPyAiU1QiIDogIkxEIiwgY2F1c2UsIG9wYywgYmFkdmFkZHIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xvb25nc29uNjQvbG9vbmdzb24tMy9zbXAuYyBiL2FyY2gvbWlwcy9sb29uZ3NvbjY0L2xvb25nc29uLTMvc21wLmMKaW5kZXggMmZlYzZmNy4uOTlhYWI5ZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xvb25nc29uNjQvbG9vbmdzb24tMy9zbXAuYworKysgYi9hcmNoL21pcHMvbG9vbmdzb242NC9sb29uZ3Nvbi0zL3NtcC5jCkBAIC02NzcsNyArNjc3LDcgQEAKIAlwbGF5X2RlYWRfYXRfY2tzZWcxKHN0YXRlX2FkZHIpOwogfQogCi12b2lkIGxvb25nc29uM19kaXNhYmxlX2Nsb2NrKGludCBjcHUpCitzdGF0aWMgaW50IGxvb25nc29uM19kaXNhYmxlX2Nsb2NrKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJdWludDY0X3QgY29yZV9pZCA9IGNwdV9kYXRhW2NwdV0uY29yZTsKIAl1aW50NjRfdCBwYWNrYWdlX2lkID0gY3B1X2RhdGFbY3B1XS5wYWNrYWdlOwpAQCAtNjg4LDkgKzY4OCwxMCBAQAogCQlpZiAoIShsb29uZ3Nvbl9zeXNjb25mLndvcmthcm91bmRzICYgV09SS0FST1VORF9DUFVIT1RQTFVHKSkKIAkJCUxPT05HU09OX0ZSRVFDVFJMKHBhY2thZ2VfaWQpICY9IH4oMSA8PCAoY29yZV9pZCAqIDQgKyAzKSk7CiAJfQorCXJldHVybiAwOwogfQogCi12b2lkIGxvb25nc29uM19lbmFibGVfY2xvY2soaW50IGNwdSkKK3N0YXRpYyBpbnQgbG9vbmdzb24zX2VuYWJsZV9jbG9jayh1bnNpZ25lZCBpbnQgY3B1KQogewogCXVpbnQ2NF90IGNvcmVfaWQgPSBjcHVfZGF0YVtjcHVdLmNvcmU7CiAJdWludDY0X3QgcGFja2FnZV9pZCA9IGNwdV9kYXRhW2NwdV0ucGFja2FnZTsKQEAgLTcwMSwzNCArNzAyLDE1IEBACiAJCWlmICghKGxvb25nc29uX3N5c2NvbmYud29ya2Fyb3VuZHMgJiBXT1JLQVJPVU5EX0NQVUhPVFBMVUcpKQogCQkJTE9PTkdTT05fRlJFUUNUUkwocGFja2FnZV9pZCkgfD0gMSA8PCAoY29yZV9pZCAqIDQgKyAzKTsKIAl9Ci19Ci0KLSNkZWZpbmUgQ1BVX1BPU1RfREVBRF9GUk9aRU4JKENQVV9QT1NUX0RFQUQgfCBDUFVfVEFTS1NfRlJPWkVOKQotc3RhdGljIGludCBsb29uZ3NvbjNfY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAotCXVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQotewotCXVuc2lnbmVkIGludCBjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OwotCi0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIENQVV9QT1NUX0RFQUQ6Ci0JY2FzZSBDUFVfUE9TVF9ERUFEX0ZST1pFTjoKLQkJcHJfaW5mbygiRGlzYWJsZSBjbG9jayBmb3IgQ1BVIyVkXG4iLCBjcHUpOwotCQlsb29uZ3NvbjNfZGlzYWJsZV9jbG9jayhjcHUpOwotCQlicmVhazsKLQljYXNlIENQVV9VUF9QUkVQQVJFOgotCWNhc2UgQ1BVX1VQX1BSRVBBUkVfRlJPWkVOOgotCQlwcl9pbmZvKCJFbmFibGUgY2xvY2sgZm9yIENQVSMlZFxuIiwgY3B1KTsKLQkJbG9vbmdzb24zX2VuYWJsZV9jbG9jayhjcHUpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gTk9USUZZX09LOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHJlZ2lzdGVyX2xvb25nc29uM19ub3RpZmllcih2b2lkKQogewotCWhvdGNwdV9ub3RpZmllcihsb29uZ3NvbjNfY3B1X2NhbGxiYWNrLCAwKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9NSVBTX1NPQ19QUkVQQVJFLAorCQkJCQkgIm1pcHMvbG9vbmdzb246cHJlcGFyZSIsCisJCQkJCSBsb29uZ3NvbjNfZW5hYmxlX2Nsb2NrLAorCQkJCQkgbG9vbmdzb24zX2Rpc2FibGVfY2xvY2spOwogfQogZWFybHlfaW5pdGNhbGwocmVnaXN0ZXJfbG9vbmdzb24zX25vdGlmaWVyKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21hdGgtZW11L2RzZW11bC5jIGIvYXJjaC9taXBzL21hdGgtZW11L2RzZW11bC5jCmluZGV4IDcyYTQ2NDIuLjRhMDk0ZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tYXRoLWVtdS9kc2VtdWwuYworKysgYi9hcmNoL21pcHMvbWF0aC1lbXUvZHNlbXVsLmMKQEAgLTI5OCw1ICsyOTgsNiBAQAogCS8qIFNldCBFUEMgdG8gcmV0dXJuIHRvIHBvc3QtYnJhbmNoIGluc3RydWN0aW9uICovCiAJeGNwLT5jcDBfZXBjID0gY3VycmVudC0+dGhyZWFkLmJkX2VtdV9jb250X3BjOwogCXByX2RlYnVnKCJkc2VtdWxyZXQgdG8gMHglMDhseFxuIiwgeGNwLT5jcDBfZXBjKTsKKwlNSVBTX0ZQVV9FTVVfSU5DX1NUQVRTKGRzX2VtdWwpOwogCXJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2MtcjRrLmMgYi9hcmNoL21pcHMvbW0vYy1yNGsuYwppbmRleCBjZDcyODA1Li5mYTdkOGQzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vYy1yNGsuYworKysgYi9hcmNoL21pcHMvbW0vYy1yNGsuYwpAQCAtODAwLDcgKzgwMCw3IEBACiAJCSAqIElmIGFkZHJlc3MtYmFzZWQgY2FjaGUgb3BzIGRvbid0IHJlcXVpcmUgYW4gU01QIGNhbGwsIHRoZW4KIAkJICogdXNlIHRoZW0gZXhjbHVzaXZlbHkgZm9yIHNtYWxsIGZsdXNoZXMuCiAJCSAqLwotCQlzaXplID0gc3RhcnQgLSBlbmQ7CisJCXNpemUgPSBlbmQgLSBzdGFydDsKIAkJY2FjaGVfc2l6ZSA9IGljYWNoZV9zaXplOwogCQlpZiAoIWNwdV9oYXNfaWNfZmlsbHNfZl9kYykgewogCQkJc2l6ZSAqPSAyOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2luaXQuYyBiL2FyY2gvbWlwcy9tbS9pbml0LmMKaW5kZXggYTU1MDllNy4uNzJmNzQ3OCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2luaXQuYworKysgYi9hcmNoL21pcHMvbW0vaW5pdC5jCkBAIC0yNjEsNyArMjYxLDYgQEAKIHsKIAlzdHJ1Y3QgbWFhcl9jb25maWcgY2ZnW0JPT1RfTUVNX01BUF9NQVhdOwogCXVuc2lnbmVkIGksIG51bV9jb25maWd1cmVkLCBudW1fY2ZnID0gMDsKLQlwaHlzX2FkZHJfdCBza2lwOwogCiAJZm9yIChpID0gMDsgaSA8IGJvb3RfbWVtX21hcC5ucl9tYXA7IGkrKykgewogCQlzd2l0Y2ggKGJvb3RfbWVtX21hcC5tYXBbaV0udHlwZSkgewpAQCAtMjcyLDE0ICsyNzEsMTQgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJc2tpcCA9IDB4MTAwMDAgLSAoYm9vdF9tZW1fbWFwLm1hcFtpXS5hZGRyICYgMHhmZmZmKTsKLQorCQkvKiBSb3VuZCBsb3dlciB1cCAqLwogCQljZmdbbnVtX2NmZ10ubG93ZXIgPSBib290X21lbV9tYXAubWFwW2ldLmFkZHI7Ci0JCWNmZ1tudW1fY2ZnXS5sb3dlciArPSBza2lwOworCQljZmdbbnVtX2NmZ10ubG93ZXIgPSAoY2ZnW251bV9jZmddLmxvd2VyICsgMHhmZmZmKSAmIH4weGZmZmY7CiAKLQkJY2ZnW251bV9jZmddLnVwcGVyID0gY2ZnW251bV9jZmddLmxvd2VyOwotCQljZmdbbnVtX2NmZ10udXBwZXIgKz0gYm9vdF9tZW1fbWFwLm1hcFtpXS5zaXplIC0gMTsKLQkJY2ZnW251bV9jZmddLnVwcGVyIC09IHNraXA7CisJCS8qIFJvdW5kIHVwcGVyIGRvd24gKi8KKwkJY2ZnW251bV9jZmddLnVwcGVyID0gYm9vdF9tZW1fbWFwLm1hcFtpXS5hZGRyICsKKwkJCQkJYm9vdF9tZW1fbWFwLm1hcFtpXS5zaXplOworCQljZmdbbnVtX2NmZ10udXBwZXIgPSAoY2ZnW251bV9jZmddLnVwcGVyICYgfjB4ZmZmZikgLSAxOwogCiAJCWNmZ1tudW1fY2ZnXS5hdHRycyA9IE1JUFNfTUFBUl9TOwogCQludW1fY2ZnKys7CkBAIC00NDEsNiArNDQwLDkgQEAKICNpZmRlZiBDT05GSUdfSElHSE1FTQogCXVuc2lnbmVkIGxvbmcgdG1wOwogCisJaWYgKGNwdV9oYXNfZGNfYWxpYXNlcykKKwkJcmV0dXJuOworCiAJZm9yICh0bXAgPSBoaWdoc3RhcnRfcGZuOyB0bXAgPCBoaWdoZW5kX3BmbjsgdG1wKyspIHsKIAkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwZm5fdG9fcGFnZSh0bXApOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLXNldHVwLmMgYi9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLXNldHVwLmMKaW5kZXggZWM1YjIxNi4uN2U3MzY0YiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtc2V0dXAuYwpAQCAtMzksNiArMzksOSBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KICNlbmRpZgogCisjZGVmaW5lIFJPQ0lUX0NPTkZJR19HRU4wCQkweDFmNDAzMDAwCisjZGVmaW5lICBST0NJVF9DT05GSUdfR0VOMF9QQ0lfSU9DVQlCSVQoNykKKwogZXh0ZXJuIHZvaWQgbWFsdGFfYmVfaW5pdCh2b2lkKTsKIGV4dGVybiBpbnQgbWFsdGFfYmVfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGlzX2ZpeHVwKTsKIApAQCAtMTA3LDYgKzExMCw4IEBACiBzdGF0aWMgaW50IF9faW5pdCBwbGF0X2VuYWJsZV9pb2NvaGVyZW5jeSh2b2lkKQogewogCWludCBzdXBwb3J0ZWQgPSAwOworCXUzMiBjZmc7CisKIAlpZiAobWlwc19yZXZpc2lvbl9zY29uaWQgPT0gTUlQU19SRVZJU0lPTl9TQ09OX0JPTklUTykgewogCQlpZiAoQk9OSVRPX1BDSUNBQ0hFQ1RSTCAmIEJPTklUT19QQ0lDQUNIRUNUUkxfQ1BVQ09IX1BSRVMpIHsKIAkJCUJPTklUT19QQ0lDQUNIRUNUUkwgfD0gQk9OSVRPX1BDSUNBQ0hFQ1RSTF9DUFVDT0hfRU47CkBAIC0xMjksNyArMTM0LDggQEAKIAl9IGVsc2UgaWYgKG1pcHNfY21fbnVtaW9jdSgpICE9IDApIHsKIAkJLyogTm90aGluZyBzcGVjaWFsIG5lZWRzIHRvIGJlIGRvbmUgdG8gZW5hYmxlIGNvaGVyZW5jeSAqLwogCQlwcl9pbmZvKCJDTVAgSU9DVSBkZXRlY3RlZFxuIik7Ci0JCWlmICgoKih1bnNpZ25lZCBpbnQgKikweGJmNDAzMDAwICYgMHg4MSkgIT0gMHg4MSkgeworCQljZmcgPSBfX3Jhd19yZWFkbCgodTMyICopQ0tTRUcxQUREUihST0NJVF9DT05GSUdfR0VOMCkpOworCQlpZiAoIShjZmcgJiBST0NJVF9DT05GSUdfR0VOMF9QQ0lfSU9DVSkpIHsKIAkJCXByX2NyaXQoIklPQ1UgT1BFUkFUSU9OIERJU0FCTEVEIEJZIFNXSVRDSCAtIERFRkFVTFRJTkcgVE8gU1cgSU8gQ09IRVJFTkNZXG4iKTsKIAkJCXJldHVybiAwOwogCQl9CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCAyMGY3YmY2Li5kMDEyZTg3IDEwMDY0NAotLS0gYS9hcmNoL21uMTAzMDAvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTE2Niw2ICsxNjYsNyBAQAogCQkiMjpcbiIJCQkJCQlcCiAJCSIJLnNlY3Rpb24JLmZpeHVwLFwiYXhcIlxuIglcCiAJCSIzOlxuXHQiCQkJCQlcCisJCSIJbW92CQkwLCUxXG4iCQkJXAogCQkiCW1vdgkJJTMsJTBcbiIJCVwKIAkJIglqbXAJCTJiXG4iCQkJXAogCQkiCS5wcmV2aW91c1xuIgkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAvbGliL3VzZXJjb3B5LmMgYi9hcmNoL21uMTAzMDAvbGliL3VzZXJjb3B5LmMKaW5kZXggNzgyNmU2Yy4uY2U4ODk5ZSAxMDA2NDQKLS0tIGEvYXJjaC9tbjEwMzAwL2xpYi91c2VyY29weS5jCisrKyBiL2FyY2gvbW4xMDMwMC9saWIvdXNlcmNvcHkuYwpAQCAtOSw3ICs5LDcgQEAKICAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCiB1bnNpZ25lZCBsb25nCiBfX2dlbmVyaWNfY29weV90b191c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCkBAIC0yNCw2ICsyNCw4IEBACiB7CiAJaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJvbSwgbikpCiAJCV9fY29weV91c2VyX3plcm9pbmcodG8sIGZyb20sIG4pOworCWVsc2UKKwkJbWVtc2V0KHRvLCAwLCBuKTsKIAlyZXR1cm4gbjsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9uaW9zMi9ib290L2R0cy8xMG01MF9kZXZib2FyZC5kdHMgYi9hcmNoL25pb3MyL2Jvb3QvZHRzLzEwbTUwX2RldmJvYXJkLmR0cwppbmRleCAzZTQxMWM2Li5mMzYyYjIyIDEwMDc1NQotLS0gYS9hcmNoL25pb3MyL2Jvb3QvZHRzLzEwbTUwX2RldmJvYXJkLmR0cworKysgYi9hcmNoL25pb3MyL2Jvb3QvZHRzLzEwbTUwX2RldmJvYXJkLmR0cwpAQCAtODMsNiArODMsNyBAQAogCQkJZmlmby1zaXplID0gPDMyPjsKIAkJCXJlZy1pby13aWR0aCA9IDw0PjsKIAkJCXJlZy1zaGlmdCA9IDwyPjsKKwkJCXR4LXRocmVzaG9sZCA9IDwxNj47CiAJCX07CiAKIAkJc3lzaWQ6IHN5c2lkQDE4MDAxNTI4IHsKZGlmZiAtLWdpdCBhL2FyY2gvbmlvczIvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9uaW9zMi9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggY2FhNTFmZi4uMGFiODIzMiAxMDA2NDQKLS0tIGEvYXJjaC9uaW9zMi9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC9uaW9zMi9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTEwMiw5ICsxMDIsMTIgQEAKIHN0YXRpYyBpbmxpbmUgbG9uZyBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sCiAJCQkJdW5zaWduZWQgbG9uZyBuKQogewotCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcm9tLCBuKSkKLQkJcmV0dXJuIG47Ci0JcmV0dXJuIF9fY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pOworCXVuc2lnbmVkIGxvbmcgcmVzID0gbjsKKwlpZiAoYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcm9tLCBuKSkKKwkJcmVzID0gX19jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbik7CisJaWYgKHVubGlrZWx5KHJlcykpCisJCW1lbXNldCh0byArIChuIC0gcmVzKSwgMCwgcmVzKTsKKwlyZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgaW5saW5lIGxvbmcgY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwKQEAgLTEzOSw3ICsxNDIsNyBAQAogCiAjZGVmaW5lIF9fZ2V0X3VzZXJfdW5rbm93bih2YWwsIHNpemUsIHB0ciwgZXJyKSBkbyB7CQkJXAogCWVyciA9IDA7CQkJCQkJCVwKLQlpZiAoY29weV9mcm9tX3VzZXIoJih2YWwpLCBwdHIsIHNpemUpKSB7CQkJXAorCWlmIChfX2NvcHlfZnJvbV91c2VyKCYodmFsKSwgcHRyLCBzaXplKSkgewkJCVwKIAkJZXJyID0gLUVGQVVMVDsJCQkJCQlcCiAJfQkJCQkJCQkJXAogCX0gd2hpbGUgKDApCkBAIC0xNjYsNyArMTY5LDcgQEAKIAkoewkJCQkJCQkJXAogCWxvbmcgX19ndV9lcnIgPSAtRUZBVUxUOwkJCQkJXAogCWNvbnN0IF9fdHlwZW9mX18oKihwdHIpKSBfX3VzZXIgKl9fZ3VfcHRyID0gKHB0cik7CQlcCi0JdW5zaWduZWQgbG9uZyBfX2d1X3ZhbDsJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBfX2d1X3ZhbCA9IDA7CQkJCQlcCiAJX19nZXRfdXNlcl9jb21tb24oX19ndV92YWwsIHNpemVvZigqKHB0cikpLCBfX2d1X3B0ciwgX19ndV9lcnIpO1wKIAkoeCkgPSAoX19mb3JjZSBfX3R5cGVvZl9fKHgpKV9fZ3VfdmFsOwkJCQlcCiAJX19ndV9lcnI7CQkJCQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggYTZiZDA3Yy4uNWNjNmI0ZiAxMDA2NDQKLS0tIGEvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTI3MywyOCArMjczLDIwIEBACiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKIGNvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7Ci0JdW5zaWduZWQgbG9uZyBvdmVyOworCXVuc2lnbmVkIGxvbmcgcmVzID0gbjsKIAotCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIG4pKQotCQlyZXR1cm4gX19jb3B5X3RvZnJvbV91c2VyKHRvLCBmcm9tLCBuKTsKLQlpZiAoKHVuc2lnbmVkIGxvbmcpZnJvbSA8IFRBU0tfU0laRSkgewotCQlvdmVyID0gKHVuc2lnbmVkIGxvbmcpZnJvbSArIG4gLSBUQVNLX1NJWkU7Ci0JCXJldHVybiBfX2NvcHlfdG9mcm9tX3VzZXIodG8sIGZyb20sIG4gLSBvdmVyKSArIG92ZXI7Ci0JfQotCXJldHVybiBuOworCWlmIChsaWtlbHkoYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcm9tLCBuKSkpCisJCXJlcyA9IF9fY29weV90b2Zyb21fdXNlcih0bywgZnJvbSwgbik7CisJaWYgKHVubGlrZWx5KHJlcykpCisJCW1lbXNldCh0byArIChuIC0gcmVzKSwgMCwgcmVzKTsKKwlyZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKIGNvcHlfdG9fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewotCXVuc2lnbmVkIGxvbmcgb3ZlcjsKLQotCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB0bywgbikpCi0JCXJldHVybiBfX2NvcHlfdG9mcm9tX3VzZXIodG8sIGZyb20sIG4pOwotCWlmICgodW5zaWduZWQgbG9uZyl0byA8IFRBU0tfU0laRSkgewotCQlvdmVyID0gKHVuc2lnbmVkIGxvbmcpdG8gKyBuIC0gVEFTS19TSVpFOwotCQlyZXR1cm4gX19jb3B5X3RvZnJvbV91c2VyKHRvLCBmcm9tLCBuIC0gb3ZlcikgKyBvdmVyOwotCX0KKwlpZiAobGlrZWx5KGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHRvLCBuKSkpCisJCW4gPSBfX2NvcHlfdG9mcm9tX3VzZXIodG8sIGZyb20sIG4pOwogCXJldHVybiBuOwogfQogCkBAIC0zMDMsMTMgKzI5NSw4IEBACiBzdGF0aWMgaW5saW5lIF9fbXVzdF9jaGVjayB1bnNpZ25lZCBsb25nCiBjbGVhcl91c2VyKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKLQotCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBhZGRyLCBzaXplKSkKLQkJcmV0dXJuIF9fY2xlYXJfdXNlcihhZGRyLCBzaXplKTsKLQlpZiAoKHVuc2lnbmVkIGxvbmcpYWRkciA8IFRBU0tfU0laRSkgewotCQl1bnNpZ25lZCBsb25nIG92ZXIgPSAodW5zaWduZWQgbG9uZylhZGRyICsgc2l6ZSAtIFRBU0tfU0laRTsKLQkJcmV0dXJuIF9fY2xlYXJfdXNlcihhZGRyLCBzaXplIC0gb3ZlcikgKyBvdmVyOwotCX0KKwlpZiAobGlrZWx5KGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGFkZHIsIHNpemUpKSkKKwkJc2l6ZSA9IF9fY2xlYXJfdXNlcihhZGRyLCBzaXplKTsKIAlyZXR1cm4gc2l6ZTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvS2NvbmZpZyBiL2FyY2gvcGFyaXNjL0tjb25maWcKaW5kZXggY2Q4Nzc4MS4uYWYxMmMyZCAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvS2NvbmZpZworKysgYi9hcmNoL3BhcmlzYy9LY29uZmlnCkBAIC0xLDYgKzEsNSBAQAogY29uZmlnIFBBUklTQwogCWRlZl9ib29sIHkKLQlzZWxlY3QgQVJDSF9IQVNfREVCVUdfU1RSSUNUX1VTRVJfQ09QWV9DSEVDS1MKIAlzZWxlY3QgQVJDSF9NSUdIVF9IQVZFX1BDX1BBUlBPUlQKIAlzZWxlY3QgSEFWRV9JREUKIAlzZWxlY3QgSEFWRV9PUFJPRklMRQpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvY29uZmlncy9jODAwMF9kZWZjb25maWcgYi9hcmNoL3BhcmlzYy9jb25maWdzL2M4MDAwX2RlZmNvbmZpZwppbmRleCAxYThmNmY5NS4uZjZhNGMwMSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvY29uZmlncy9jODAwMF9kZWZjb25maWcKKysrIGIvYXJjaC9wYXJpc2MvY29uZmlncy9jODAwMF9kZWZjb25maWcKQEAgLTI0NSw3ICsyNDUsNiBAQAogQ09ORklHX1BST1ZFX1JDVV9ERUxBWT15CiBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQ9eQogQ09ORklHX0xBVEVOQ1lUT1A9eQotQ09ORklHX0RFQlVHX1NUUklDVF9VU0VSX0NPUFlfQ0hFQ0tTPXkKIENPTkZJR19LRVlTPXkKICMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0CiBDT05GSUdfRk9OVFM9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvY29uZmlncy9nZW5lcmljLTY0Yml0X2RlZmNvbmZpZyBiL2FyY2gvcGFyaXNjL2NvbmZpZ3MvZ2VuZXJpYy02NGJpdF9kZWZjb25maWcKaW5kZXggN2UwNzkyNi4uYzU2NGU2ZSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvY29uZmlncy9nZW5lcmljLTY0Yml0X2RlZmNvbmZpZworKysgYi9hcmNoL3BhcmlzYy9jb25maWdzL2dlbmVyaWMtNjRiaXRfZGVmY29uZmlnCkBAIC0yOTEsNyArMjkxLDYgQEAKIENPTkZJR19CT09UUEFSQU1fSFVOR19UQVNLX1BBTklDPXkKICMgQ09ORklHX1NDSEVEX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19USU1FUl9TVEFUUz15Ci1DT05GSUdfREVCVUdfU1RSSUNUX1VTRVJfQ09QWV9DSEVDS1M9eQogQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKIENPTkZJR19DUllQVE9fRUNCPW0KIENPTkZJR19DUllQVE9fUENCQz1tCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggMGY1OWZkOS4uNDgyODQ3OCAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3VhY2Nlc3MtdW5hbGlnbmVkLmg+CiAKICNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KIAogI2RlZmluZSBWRVJJRllfUkVBRCAwCiAjZGVmaW5lIFZFUklGWV9XUklURSAxCkBAIC0yMDgsMjYgKzIwOSwzMCBAQAogI2RlZmluZSBfX2NvcHlfdG9fdXNlcl9pbmF0b21pYyBfX2NvcHlfdG9fdXNlcgogI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljIF9fY29weV9mcm9tX3VzZXIKIAotZXh0ZXJuIHZvaWQgY29weV9mcm9tX3VzZXJfb3ZlcmZsb3codm9pZCkKLSNpZmRlZiBDT05GSUdfREVCVUdfU1RSSUNUX1VTRVJfQ09QWV9DSEVDS1MKLSAgICAgICAgX19jb21waWxldGltZV9lcnJvcigiY29weV9mcm9tX3VzZXIoKSBidWZmZXIgc2l6ZSBpcyBub3QgcHJvdmFibHkgY29ycmVjdCIpCi0jZWxzZQotICAgICAgICBfX2NvbXBpbGV0aW1lX3dhcm5pbmcoImNvcHlfZnJvbV91c2VyKCkgYnVmZmVyIHNpemUgaXMgbm90IHByb3ZhYmx5IGNvcnJlY3QiKQotI2VuZGlmCi07CitleHRlcm4gdm9pZCBfX2NvbXBpbGV0aW1lX2Vycm9yKCJ1c2VyY29weSBidWZmZXIgc2l6ZSBpcyB0b28gc21hbGwiKQorX19iYWRfY29weV91c2VyKHZvaWQpOworCitzdGF0aWMgaW5saW5lIHZvaWQgY29weV91c2VyX292ZXJmbG93KGludCBzaXplLCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCVdBUk4oMSwgIkJ1ZmZlciBvdmVyZmxvdyBkZXRlY3RlZCAoJWQgPCAlbHUpIVxuIiwgc2l6ZSwgY291bnQpOworfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrIGNvcHlfZnJvbV91c2VyKHZvaWQgKnRvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG4pCiB7CiAgICAgICAgIGludCBzeiA9IF9fY29tcGlsZXRpbWVfb2JqZWN0X3NpemUodG8pOwotICAgICAgICBpbnQgcmV0ID0gLUVGQVVMVDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyByZXQgPSBuOwogCi0gICAgICAgIGlmIChsaWtlbHkoc3ogPT0gLTEgfHwgIV9fYnVpbHRpbl9jb25zdGFudF9wKG4pIHx8IHN6ID49IG4pKQorICAgICAgICBpZiAobGlrZWx5KHN6ID09IC0xIHx8IHN6ID49IG4pKQogICAgICAgICAgICAgICAgIHJldCA9IF9fY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgY29weV9mcm9tX3VzZXJfb3ZlcmZsb3coKTsKKyAgICAgICAgZWxzZSBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKG4pKQorCQljb3B5X3VzZXJfb3ZlcmZsb3coc3osIG4pOworCWVsc2UKKyAgICAgICAgICAgICAgICBfX2JhZF9jb3B5X3VzZXIoKTsKIAorCWlmICh1bmxpa2VseShyZXQpKQorCQltZW1zZXQodG8gKyAobiAtIHJldCksIDAsIHJldCk7CiAgICAgICAgIHJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvdWFwaS9hc20vZXJybm8uaCBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvdWFwaS9hc20vZXJybm8uaAppbmRleCBjMGFlNjI1Li4yNzRkNWJjIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9pbmNsdWRlL3VhcGkvYXNtL2Vycm5vLmgKKysrIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS91YXBpL2FzbS9lcnJuby5oCkBAIC05NywxMCArOTcsMTAgQEAKICNkZWZpbmUJRU5PVENPTk4JMjM1CS8qIFRyYW5zcG9ydCBlbmRwb2ludCBpcyBub3QgY29ubmVjdGVkICovCiAjZGVmaW5lCUVTSFVURE9XTgkyMzYJLyogQ2Fubm90IHNlbmQgYWZ0ZXIgdHJhbnNwb3J0IGVuZHBvaW50IHNodXRkb3duICovCiAjZGVmaW5lCUVUT09NQU5ZUkVGUwkyMzcJLyogVG9vIG1hbnkgcmVmZXJlbmNlczogY2Fubm90IHNwbGljZSAqLwotI2RlZmluZSBFUkVGVVNFRAlFQ09OTlJFRlVTRUQJLyogZm9yIEhQJ3MgTkZTIGFwcGFyZW50bHkgKi8KICNkZWZpbmUJRVRJTUVET1VUCTIzOAkvKiBDb25uZWN0aW9uIHRpbWVkIG91dCAqLwogI2RlZmluZQlFQ09OTlJFRlVTRUQJMjM5CS8qIENvbm5lY3Rpb24gcmVmdXNlZCAqLwotI2RlZmluZSBFUkVNT1RFUkVMRUFTRQkyNDAJLyogUmVtb3RlIHBlZXIgcmVsZWFzZWQgY29ubmVjdGlvbiAqLworI2RlZmluZQlFUkVGVVNFRAlFQ09OTlJFRlVTRUQJLyogZm9yIEhQJ3MgTkZTIGFwcGFyZW50bHkgKi8KKyNkZWZpbmUJRVJFTU9URVJFTEVBU0UJMjQwCS8qIFJlbW90ZSBwZWVyIHJlbGVhc2VkIGNvbm5lY3Rpb24gKi8KICNkZWZpbmUJRUhPU1RET1dOCTI0MQkvKiBIb3N0IGlzIGRvd24gKi8KICNkZWZpbmUJRUhPU1RVTlJFQUNICTI0MgkvKiBObyByb3V0ZSB0byBob3N0ICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9mdHJhY2UuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9mdHJhY2UuYwppbmRleCBhODI4YTBhLi41YTU1MDZhIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvZnRyYWNlLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL2Z0cmFjZS5jCkBAIC00OCw3ICs0OCw3IEBACiAJCXJldHVybjsKIAogICAgICAgICBpZiAoZnRyYWNlX3B1c2hfcmV0dXJuX3RyYWNlKG9sZCwgc2VsZl9hZGRyLCAmdHJhY2UuZGVwdGgsCi0JCQkwICkgPT0gLUVCVVNZKQorCQkJCSAgICAgMCwgTlVMTCkgPT0gLUVCVVNZKQogICAgICAgICAgICAgICAgIHJldHVybjsKIAogCS8qIGFjdGl2YXRlIHBhcmlzY19yZXR1cm5fdG9faGFuZGxlcigpIGFzIHJldHVybiBwb2ludCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3Byb2Nlc3Nvci5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3Byb2Nlc3Nvci5jCmluZGV4IDVhZGMzMzkuLjBjMmE5NGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9wcm9jZXNzb3IuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvcHJvY2Vzc29yLmMKQEAgLTUxLDggKzUxLDYgQEAKIAogREVGSU5FX1BFUl9DUFUoc3RydWN0IGNwdWluZm9fcGFyaXNjLCBjcHVfZGF0YSk7CiAKLWV4dGVybiBpbnQgdXBkYXRlX2NyMTZfY2xvY2tzb3VyY2Uodm9pZCk7CS8qIGZyb20gdGltZS5jICovCi0KIC8qCiAqKiAgCVBBUklTQyBDUFUgZHJpdmVyIC0gY2xhaW0gImRldmljZSIgYW5kIGluaXRpYWxpemUgQ1BVIGRhdGEgc3RydWN0dXJlcy4KICoqCkBAIC0yMjgsMTIgKzIyNiw2IEBACiAJfQogI2VuZGlmCiAKLQkvKiBJZiB3ZSd2ZSByZWdpc3RlcmVkIG1vcmUgdGhhbiBvbmUgY3B1LAotCSAqIHdlJ2xsIHVzZSB0aGUgamlmZmllcyBjbG9ja3NvdXJjZSBzaW5jZSBjcjE2Ci0JICogaXMgbm90IHN5bmNocm9uaXplZCBiZXR3ZWVuIENQVXMuCi0JICovCi0JdXBkYXRlX2NyMTZfY2xvY2tzb3VyY2UoKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvdGltZS5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3RpbWUuYwppbmRleCA1MDVjZjFhLi40YjBiOTYzIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC90aW1lLmMKQEAgLTIyMSwxOCArMjIxLDYgQEAKIAkuZmxhZ3MJCQk9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAogfTsKIAotaW50IHVwZGF0ZV9jcjE2X2Nsb2Nrc291cmNlKHZvaWQpCi17Ci0JLyogc2luY2UgdGhlIGNyMTYgY3ljbGUgY291bnRlcnMgYXJlIG5vdCBzeW5jaHJvbml6ZWQgYWNyb3NzIENQVXMsCi0JICAgd2UnbGwgY2hlY2sgaWYgd2Ugc2hvdWxkIHN3aXRjaCB0byBhIHNhZmUgY2xvY2tzb3VyY2U6ICovCi0JaWYgKGNsb2Nrc291cmNlX2NyMTYucmF0aW5nICE9IDAgJiYgbnVtX29ubGluZV9jcHVzKCkgPiAxKSB7Ci0JCWNsb2Nrc291cmNlX2NoYW5nZV9yYXRpbmcoJmNsb2Nrc291cmNlX2NyMTYsIDApOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogdm9pZCBfX2luaXQgc3RhcnRfY3B1X2l0aW1lcih2b2lkKQogewogCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYm9vazNzLzY0L21tdS1oYXNoLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYm9vazNzLzY0L21tdS1oYXNoLmgKaW5kZXggMjg3YTY1Ni4uZTQwN2FmMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2Jvb2szcy82NC9tbXUtaGFzaC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9ib29rM3MvNjQvbW11LWhhc2guaApAQCAtMjQ1LDYgKzI0NSw0MyBAQAogfQogCiAvKgorICogVGhpcyBhcnJheSBpcyBpbmRleGVkIGJ5IHRoZSBMUCBmaWVsZCBvZiB0aGUgSFBURSBzZWNvbmQgZHdvcmQuCisgKiBTaW5jZSB0aGlzIGZpZWxkIG1heSBjb250YWluIHNvbWUgUlBOIGJpdHMsIHNvbWUgZW50cmllcyBhcmUKKyAqIHJlcGxpY2F0ZWQgc28gdGhhdCB3ZSBnZXQgdGhlIHNhbWUgdmFsdWUgaXJyZXNwZWN0aXZlIG9mIFJQTi4KKyAqIFRoZSB0b3AgNCBiaXRzIGFyZSB0aGUgcGFnZSBzaXplIGluZGV4IChNTVVfUEFHRV8qKSBmb3IgdGhlCisgKiBhY3R1YWwgcGFnZSBzaXplLCB0aGUgYm90dG9tIDQgYml0cyBhcmUgdGhlIGJhc2UgcGFnZSBzaXplLgorICovCitleHRlcm4gdTggaHB0ZV9wYWdlX3NpemVzWzEgPDwgTFBfQklUU107CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2hwdGVfcGFnZV9zaXplKHVuc2lnbmVkIGxvbmcgaCwgdW5zaWduZWQgbG9uZyBsLAorCQkJCQkgICAgIGJvb2wgaXNfYmFzZV9zaXplKQoreworCXVuc2lnbmVkIGludCBpLCBscDsKKworCWlmICghKGggJiBIUFRFX1ZfTEFSR0UpKQorCQlyZXR1cm4gMXVsIDw8IDEyOworCisJLyogTG9vayBhdCB0aGUgOCBiaXQgTFAgdmFsdWUgKi8KKwlscCA9IChsID4+IExQX1NISUZUKSAmICgoMSA8PCBMUF9CSVRTKSAtIDEpOworCWkgPSBocHRlX3BhZ2Vfc2l6ZXNbbHBdOworCWlmICghaSkKKwkJcmV0dXJuIDA7CisJaWYgKCFpc19iYXNlX3NpemUpCisJCWkgPj49IDQ7CisJcmV0dXJuIDF1bCA8PCBtbXVfcHNpemVfZGVmc1tpICYgMHhmXS5zaGlmdDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGhwdGVfcGFnZV9zaXplKHVuc2lnbmVkIGxvbmcgaCwgdW5zaWduZWQgbG9uZyBsKQoreworCXJldHVybiBfX2hwdGVfcGFnZV9zaXplKGgsIGwsIDApOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaHB0ZV9iYXNlX3BhZ2Vfc2l6ZSh1bnNpZ25lZCBsb25nIGgsIHVuc2lnbmVkIGxvbmcgbCkKK3sKKwlyZXR1cm4gX19ocHRlX3BhZ2Vfc2l6ZShoLCBsLCAxKTsKK30KKworLyoKICAqIFRoZSBjdXJyZW50IHN5c3RlbSBwYWdlIGFuZCBzZWdtZW50IHNpemVzCiAgKi8KIGV4dGVybiBpbnQgbW11X2tlcm5lbF9zc2l6ZTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHVfaGFzX2ZlYXR1cmUuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHVfaGFzX2ZlYXR1cmUuaAppbmRleCAyZWY1NWY4Li5iMzEyYjE1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3B1X2hhc19mZWF0dXJlLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdV9oYXNfZmVhdHVyZS5oCkBAIC0xNSw3ICsxNSw3IEBACiAjaWZkZWYgQ09ORklHX0pVTVBfTEFCRUxfRkVBVFVSRV9DSEVDS1MKICNpbmNsdWRlIDxsaW51eC9qdW1wX2xhYmVsLmg+CiAKLSNkZWZpbmUgTlVNX0NQVV9GVFJfS0VZUwk2NAorI2RlZmluZSBOVU1fQ1BVX0ZUUl9LRVlTCUJJVFNfUEVSX0xPTkcKIAogZXh0ZXJuIHN0cnVjdCBzdGF0aWNfa2V5X3RydWUgY3B1X2ZlYXR1cmVfa2V5c1tOVU1fQ1BVX0ZUUl9LRVlTXTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdXRocmVhZHMuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHV0aHJlYWRzLmgKaW5kZXggNjY2YmVmNGUuLjkzNzdiZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHV0aHJlYWRzLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdXRocmVhZHMuaApAQCAtMyw2ICszLDcgQEAKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8YXNtL2NwdV9oYXNfZmVhdHVyZS5oPgogCiAvKgogICogTWFwcGluZyBvZiB0aHJlYWRzIHRvIGNvcmVzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaG1pLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaG1pLmgKaW5kZXggODhiNDkwMS4uODViN2ExYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2htaS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9obWkuaApAQCAtMjEsNyArMjEsNyBAQAogI2lmbmRlZiBfX0FTTV9QUEM2NF9ITUlfSF9fCiAjZGVmaW5lIF9fQVNNX1BQQzY0X0hNSV9IX18KIAotI2lmZGVmIENPTkZJR19QUENfQk9PSzNTXzY0CisjaWZkZWYgQ09ORklHX0tWTV9CT09LM1NfSFZfUE9TU0lCTEUKIAogI2RlZmluZQlDT1JFX1RCX1JFU1lOQ19SRVFfQklUCQk2MwogI2RlZmluZSBNQVhfU1VCQ09SRV9QRVJfQ09SRQkJNApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2lvLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaW8uaAppbmRleCAyZmQxNjkwLi5mNmZkYTg0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaW8uaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaW8uaApAQCAtMjQxLDYgKzI0MSwzNSBAQAogI2VuZGlmCiAjZW5kaWYgLyogX19wb3dlcnBjNjRfXyAqLwogCisKKy8qCisgKiBTaW1wbGUgQ2FjaGUgaW5oaWJpdGVkIGFjY2Vzc29ycworICogVW5saWtlIHRoZSBERUZfTU1JT18qIG1hY3JvcywgdGhlc2UgZG9uJ3QgaW5jbHVkZSBhbnkgaC93IG1lbW9yeQorICogYmFycmllcnMsIGNhbGxlcnMgbmVlZCB0byBtYW5hZ2UgbWVtb3J5IGJhcnJpZXJzIG9uIHRoZWlyIG93bi4KKyAqIFRoZXNlIGNhbiBvbmx5IGJlIHVzZWQgaW4gaHlwZXJ2aXNvciByZWFsIG1vZGUuCisgKi8KKworc3RhdGljIGlubGluZSB1MzIgX2x3emNpeCh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJdTMyIHJldDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCJsd3pjaXggJTAsMCwgJTEiCisJCQkgICAgIDogIj1yIiAocmV0KSA6ICJyIiAoYWRkcikgOiAibWVtb3J5Iik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9zdGJjaXgodTY0IGFkZHIsIHU4IHZhbCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3RiY2l4ICUwLDAsJTEiCisJCTogOiAiciIgKHZhbCksICJyIiAoYWRkcikgOiAibWVtb3J5Iik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfc3R3Y2l4KHU2NCBhZGRyLCB1MzIgdmFsKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKCJzdHdjaXggJTAsMCwlMSIKKwkJOiA6ICJyIiAodmFsKSwgInIiIChhZGRyKSA6ICJtZW1vcnkiKTsKK30KKwogLyoKICAqIExvdyBsZXZlbCBJTyBzdHJlYW0gaW5zdHJ1Y3Rpb25zIGFyZSBkZWZpbmVkIG91dCBvZiBsaW5lIGZvciBub3cKICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9hc20uaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYXNtLmgKaW5kZXggNWJjYTIyMC4uMDVjYWJlZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9hc20uaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2FzbS5oCkBAIC0xMDUsNiArMTA1LDE1IEBACiAjZGVmaW5lIEJPT0szU19JTlRFUlJVUFRfRkFDX1VOQVZBSUwJMHhmNjAKICNkZWZpbmUgQk9PSzNTX0lOVEVSUlVQVF9IX0ZBQ19VTkFWQUlMCTB4ZjgwCiAKKy8qIGJvb2szc19odiAqLworCisvKgorICogU3BlY2lhbCB0cmFwIHVzZWQgdG8gaW5kaWNhdGUgdG8gaG9zdCB0aGF0IHRoaXMgaXMgYQorICogcGFzc3Rocm91Z2ggaW50ZXJydXB0IHRoYXQgY291bGQgbm90IGJlIGhhbmRsZWQKKyAqIGNvbXBsZXRlbHkgaW4gdGhlIGd1ZXN0LgorICovCisjZGVmaW5lIEJPT0szU19JTlRFUlJVUFRfSFZfUk1fSEFSRAkweDU1NTUKKwogI2RlZmluZSBCT09LM1NfSVJRUFJJT19TWVNURU1fUkVTRVQJCTAKICNkZWZpbmUgQk9PSzNTX0lSUVBSSU9fREFUQV9TRUdNRU5UCQkxCiAjZGVmaW5lIEJPT0szU19JUlFQUklPX0lOU1RfU0VHTUVOVAkJMgpAQCAtMTM2LDYgKzE0NSw3IEBACiAjZGVmaW5lIFJFU1VNRV9GTEFHX05WICAgICAgICAgICgxPDwwKSAgLyogUmVsb2FkIGd1ZXN0IG5vbnZvbGF0aWxlIHN0YXRlPyAqLwogI2RlZmluZSBSRVNVTUVfRkxBR19IT1NUICAgICAgICAoMTw8MSkgIC8qIFJlc3VtZSBob3N0PyAqLwogI2RlZmluZSBSRVNVTUVfRkxBR19BUkNIMQkoMTw8MikKKyNkZWZpbmUgUkVTVU1FX0ZMQUdfQVJDSDIJKDE8PDMpCiAKICNkZWZpbmUgUkVTVU1FX0dVRVNUICAgICAgICAgICAgMAogI2RlZmluZSBSRVNVTUVfR1VFU1RfTlYgICAgICAgICBSRVNVTUVfRkxBR19OVgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rM3MuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9vazNzLmgKaW5kZXggOGYzOTc5Ni4uNWNmMzA2YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rM3MuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2szcy5oCkBAIC02OSw2ICs2OSw0MyBAQAogCWludCBwYWdlc2l6ZTsKIH07CiAKKy8qCisgKiBTdHJ1Y3QgZm9yIGEgdmlydHVhbCBjb3JlLgorICogTm90ZTogZW50cnlfZXhpdF9tYXAgY29tYmluZXMgYSBiaXRtYXAgb2YgdGhyZWFkcyB0aGF0IGhhdmUgZW50ZXJlZAorICogaW4gdGhlIGJvdHRvbSA4IGJpdHMgYW5kIGEgYml0bWFwIG9mIHRocmVhZHMgdGhhdCBoYXZlIGV4aXRlZCBpbiB0aGUKKyAqIG5leHQgOCBiaXRzLiAgVGhpcyBpcyBzbyB0aGF0IHdlIGNhbiBhdG9taWNhbGx5IHNldCB0aGUgZW50cnkgYml0CisgKiBpZmYgdGhlIGV4aXQgbWFwIGlzIDAgd2l0aG91dCB0YWtpbmcgYSBsb2NrLgorICovCitzdHJ1Y3Qga3ZtcHBjX3Zjb3JlIHsKKwlpbnQgbl9ydW5uYWJsZTsKKwlpbnQgbnVtX3RocmVhZHM7CisJaW50IGVudHJ5X2V4aXRfbWFwOworCWludCBuYXBwaW5nX3RocmVhZHM7CisJaW50IGZpcnN0X3ZjcHVpZDsKKwl1MTYgcGNwdTsKKwl1MTYgbGFzdF9jcHU7CisJdTggdmNvcmVfc3RhdGU7CisJdTggaW5fZ3Vlc3Q7CisJc3RydWN0IGt2bXBwY192Y29yZSAqbWFzdGVyX3Zjb3JlOworCXN0cnVjdCBrdm1fdmNwdSAqcnVubmFibGVfdGhyZWFkc1tNQVhfU01UX1RIUkVBRFNdOworCXN0cnVjdCBsaXN0X2hlYWQgcHJlZW1wdF9saXN0OworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3Qgc3dhaXRfcXVldWVfaGVhZCB3cTsKKwlzcGlubG9ja190IHN0b2x0Yl9sb2NrOwkvKiBwcm90ZWN0cyBzdG9sZW5fdGIgYW5kIHByZWVtcHRfdGIgKi8KKwl1NjQgc3RvbGVuX3RiOworCXU2NCBwcmVlbXB0X3RiOworCXN0cnVjdCBrdm1fdmNwdSAqcnVubmVyOworCXN0cnVjdCBrdm0gKmt2bTsKKwl1NjQgdGJfb2Zmc2V0OwkJLyogZ3Vlc3QgdGltZWJhc2UgLSBob3N0IHRpbWViYXNlICovCisJdWxvbmcgbHBjcjsKKwl1MzIgYXJjaF9jb21wYXQ7CisJdWxvbmcgcGNyOworCXVsb25nIGRwZGVzOwkJLyogZG9vcmJlbGwgc3RhdGUgKFBPV0VSOCkgKi8KKwl1bG9uZyB2dGI7CQkvKiB2aXJ0dWFsIHRpbWViYXNlICovCisJdWxvbmcgY29uZmVycmluZ190aHJlYWRzOworCXVuc2lnbmVkIGludCBoYWx0X3BvbGxfbnM7Cit9OworCiBzdHJ1Y3Qga3ZtcHBjX3ZjcHVfYm9vazNzIHsKIAlzdHJ1Y3Qga3ZtcHBjX3NpZF9tYXAgc2lkX21hcFtTSURfTUFQX05VTV07CiAJc3RydWN0IHsKQEAgLTgzLDYgKzEyMCw3IEBACiAJdTY0IHNkcjE7CiAJdTY0IGhpb3I7CiAJdTY0IG1zcl9tYXNrOworCXU2NCB2dGI7CiAjaWZkZWYgQ09ORklHX1BQQ19CT09LM1NfMzIKIAl1MzIgdnNpZF9wb29sW1ZTSURfUE9PTF9TSVpFXTsKIAl1MzIgdnNpZF9uZXh0OwpAQCAtMTkxLDYgKzIyOSw3IEBACiAJCQkJIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiBleHRlcm4gdm9pZCBrdm1wcGNfY29weV9mcm9tX3N2Y3B1KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKIAkJCQkgICBzdHJ1Y3Qga3ZtcHBjX2Jvb2szc19zaGFkb3dfdmNwdSAqc3ZjcHUpOworZXh0ZXJuIGludCBrdm1faXJxX2J5cGFzczsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qga3ZtcHBjX3ZjcHVfYm9vazNzICp0b19ib29rM3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rM3NfNjQuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9vazNzXzY0LmgKaW5kZXggODhkMTdiNC4uODQ4MjkyMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rM3NfNjQuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2szc182NC5oCkBAIC0yMCw2ICsyMCw4IEBACiAjaWZuZGVmIF9fQVNNX0tWTV9CT09LM1NfNjRfSF9fCiAjZGVmaW5lIF9fQVNNX0tWTV9CT09LM1NfNjRfSF9fCiAKKyNpbmNsdWRlIDxhc20vYm9vazNzLzY0L21tdS1oYXNoLmg+CisKICNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU19QUl9QT1NTSUJMRQogc3RhdGljIGlubGluZSBzdHJ1Y3Qga3ZtcHBjX2Jvb2szc19zaGFkb3dfdmNwdSAqc3ZjcHVfZ2V0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKQEAgLTk3LDU2ICs5OSwyMCBAQAogCWhwdGVbMF0gPSBjcHVfdG9fYmU2NChocHRlX3YpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBfX2hwdGVfYWN0dWFsX3BzaXplKHVuc2lnbmVkIGludCBscCwgaW50IHBzaXplKQotewotCWludCBpLCBzaGlmdDsKLQl1bnNpZ25lZCBpbnQgbWFzazsKLQotCS8qIHN0YXJ0IGZyb20gMSBpZ25vcmluZyBNTVVfUEFHRV80SyAqLwotCWZvciAoaSA9IDE7IGkgPCBNTVVfUEFHRV9DT1VOVDsgaSsrKSB7Ci0KLQkJLyogaW52YWxpZCBwZW5jICovCi0JCWlmIChtbXVfcHNpemVfZGVmc1twc2l6ZV0ucGVuY1tpXSA9PSAtMSkKLQkJCWNvbnRpbnVlOwotCQkvKgotCQkgKiBlbmNvZGluZyBiaXRzIHBlciBhY3R1YWwgcGFnZSBzaXplCi0JCSAqICAgICAgICBQVEUgTFAgICAgIGFjdHVhbCBwYWdlIHNpemUKLQkJICogICAgcnJyciBycnJ6CQk+PThLQgotCQkgKiAgICBycnJyIHJyenoJCT49MTZLQgotCQkgKiAgICBycnJyIHJ6enoJCT49MzJLQgotCQkgKiAgICBycnJyIHp6enoJCT49NjRLQgotCQkgKiAuLi4uLi4uCi0JCSAqLwotCQlzaGlmdCA9IG1tdV9wc2l6ZV9kZWZzW2ldLnNoaWZ0IC0gTFBfU0hJRlQ7Ci0JCWlmIChzaGlmdCA+IExQX0JJVFMpCi0JCQlzaGlmdCA9IExQX0JJVFM7Ci0JCW1hc2sgPSAoMSA8PCBzaGlmdCkgLSAxOwotCQlpZiAoKGxwICYgbWFzaykgPT0gbW11X3BzaXplX2RlZnNbcHNpemVdLnBlbmNbaV0pCi0JCQlyZXR1cm4gaTsKLQl9Ci0JcmV0dXJuIC0xOwotfQotCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY29tcHV0ZV90bGJpZV9yYih1bnNpZ25lZCBsb25nIHYsIHVuc2lnbmVkIGxvbmcgciwKIAkJCQkJICAgICB1bnNpZ25lZCBsb25nIHB0ZV9pbmRleCkKIHsKLQlpbnQgYl9wc2l6ZSA9IE1NVV9QQUdFXzRLLCBhX3BzaXplID0gTU1VX1BBR0VfNEs7CisJaW50IGksIGJfcHNpemUgPSBNTVVfUEFHRV80SywgYV9wc2l6ZSA9IE1NVV9QQUdFXzRLOwogCXVuc2lnbmVkIGludCBwZW5jOwogCXVuc2lnbmVkIGxvbmcgcmIgPSAwLCB2YV9sb3csIHNsbHA7CiAJdW5zaWduZWQgaW50IGxwID0gKHIgPj4gTFBfU0hJRlQpICYgKCgxIDw8IExQX0JJVFMpIC0gMSk7CiAKIAlpZiAodiAmIEhQVEVfVl9MQVJHRSkgewotCQlmb3IgKGJfcHNpemUgPSAwOyBiX3BzaXplIDwgTU1VX1BBR0VfQ09VTlQ7IGJfcHNpemUrKykgewotCi0JCQkvKiB2YWxpZCBlbnRyaWVzIGhhdmUgYSBzaGlmdCB2YWx1ZSAqLwotCQkJaWYgKCFtbXVfcHNpemVfZGVmc1tiX3BzaXplXS5zaGlmdCkKLQkJCQljb250aW51ZTsKLQotCQkJYV9wc2l6ZSA9IF9faHB0ZV9hY3R1YWxfcHNpemUobHAsIGJfcHNpemUpOwotCQkJaWYgKGFfcHNpemUgIT0gLTEpCi0JCQkJYnJlYWs7Ci0JCX0KKwkJaSA9IGhwdGVfcGFnZV9zaXplc1tscF07CisJCWJfcHNpemUgPSBpICYgMHhmOworCQlhX3BzaXplID0gaSA+PiA0OwogCX0KKwogCS8qCiAJICogSWdub3JlIHRoZSB0b3AgMTQgYml0cyBvZiB2YQogCSAqIHYgaGF2ZSB0b3AgdHdvIGJpdHMgY292ZXJpbmcgc2VnbWVudCBzaXplLCBoZW5jZSBtb3ZlCkBAIC0xNTksNyArMTI1LDYgQEAKIAkvKiBUaGlzIGNvdmVycyAxNC4uNTQgYml0cyBvZiB2YSovCiAJcmIgPSAodiAmIH4weDdmVUwpIDw8IDE2OwkJLyogQVZBIGZpZWxkICovCiAKLQlyYiB8PSAodiA+PiBIUFRFX1ZfU1NJWkVfU0hJRlQpIDw8IDg7CS8qICBCIGZpZWxkICovCiAJLyoKIAkgKiBBVkEgaW4gdiBoYWQgY2xlYXJlZCBsb3dlciAyMyBiaXRzLiBXZSBuZWVkIHRvIGRlcml2ZQogCSAqIHRoYXQgZnJvbSBwdGVnIGluZGV4CkBAIC0yMTEsNDkgKzE3NiwxMCBAQAogCQlicmVhazsKIAl9CiAJfQotCXJiIHw9ICh2ID4+IDU0KSAmIDB4MzAwOwkJLyogQiBmaWVsZCAqLworCXJiIHw9ICh2ID4+IEhQVEVfVl9TU0laRV9TSElGVCkgPDwgODsJLyogQiBmaWVsZCAqLwogCXJldHVybiByYjsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9faHB0ZV9wYWdlX3NpemUodW5zaWduZWQgbG9uZyBoLCB1bnNpZ25lZCBsb25nIGwsCi0JCQkJCSAgICAgYm9vbCBpc19iYXNlX3NpemUpCi17Ci0KLQlpbnQgc2l6ZSwgYV9wc2l6ZTsKLQkvKiBMb29rIGF0IHRoZSA4IGJpdCBMUCB2YWx1ZSAqLwotCXVuc2lnbmVkIGludCBscCA9IChsID4+IExQX1NISUZUKSAmICgoMSA8PCBMUF9CSVRTKSAtIDEpOwotCi0JLyogb25seSBoYW5kbGUgNGssIDY0ayBhbmQgMTZNIHBhZ2VzIGZvciBub3cgKi8KLQlpZiAoIShoICYgSFBURV9WX0xBUkdFKSkKLQkJcmV0dXJuIDF1bCA8PCAxMjsKLQllbHNlIHsKLQkJZm9yIChzaXplID0gMDsgc2l6ZSA8IE1NVV9QQUdFX0NPVU5UOyBzaXplKyspIHsKLQkJCS8qIHZhbGlkIGVudHJpZXMgaGF2ZSBhIHNoaWZ0IHZhbHVlICovCi0JCQlpZiAoIW1tdV9wc2l6ZV9kZWZzW3NpemVdLnNoaWZ0KQotCQkJCWNvbnRpbnVlOwotCi0JCQlhX3BzaXplID0gX19ocHRlX2FjdHVhbF9wc2l6ZShscCwgc2l6ZSk7Ci0JCQlpZiAoYV9wc2l6ZSAhPSAtMSkgewotCQkJCWlmIChpc19iYXNlX3NpemUpCi0JCQkJCXJldHVybiAxdWwgPDwgbW11X3BzaXplX2RlZnNbc2l6ZV0uc2hpZnQ7Ci0JCQkJcmV0dXJuIDF1bCA8PCBtbXVfcHNpemVfZGVmc1thX3BzaXplXS5zaGlmdDsKLQkJCX0KLQkJfQotCi0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaHB0ZV9wYWdlX3NpemUodW5zaWduZWQgbG9uZyBoLCB1bnNpZ25lZCBsb25nIGwpCi17Ci0JcmV0dXJuIF9faHB0ZV9wYWdlX3NpemUoaCwgbCwgMCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBocHRlX2Jhc2VfcGFnZV9zaXplKHVuc2lnbmVkIGxvbmcgaCwgdW5zaWduZWQgbG9uZyBsKQotewotCXJldHVybiBfX2hwdGVfcGFnZV9zaXplKGgsIGwsIDEpOwotfQotCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaHB0ZV9ycG4odW5zaWduZWQgbG9uZyBwdGVsLCB1bnNpZ25lZCBsb25nIHBzaXplKQogewogCXJldHVybiAoKHB0ZWwgJiBIUFRFX1JfUlBOKSAmIH4ocHNpemUgLSAxKSkgPj4gUEFHRV9TSElGVDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1faG9zdC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKaW5kZXggZWMzNWFmMy4uMjgzNTBhMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKQEAgLTQzLDYgKzQzLDggQEAKICNpbmNsdWRlIDxhc20vY3B1dGhyZWFkcy5oPgogI2RlZmluZSBLVk1fTUFYX1ZDUFVfSUQgICAgICAgICAgICAgICAgKHRocmVhZHNfcGVyX3N1YmNvcmUgKiBLVk1fTUFYX1ZDT1JFUykKIAorI2RlZmluZSBfX0tWTV9IQVZFX0FSQ0hfSU5UQ19JTklUSUFMSVpFRAorCiAjaWZkZWYgQ09ORklHX0tWTV9NTUlPCiAjZGVmaW5lIEtWTV9DT0FMRVNDRURfTU1JT19QQUdFX09GRlNFVCAxCiAjZW5kaWYKQEAgLTk1LDQyICs5Nyw0OSBAQAogc3RydWN0IGt2bXBwY19ib29rM3Nfc2hhZG93X3ZjcHU7CiAKIHN0cnVjdCBrdm1fdm1fc3RhdCB7Ci0JdTMyIHJlbW90ZV90bGJfZmx1c2g7CisJdWxvbmcgcmVtb3RlX3RsYl9mbHVzaDsKIH07CiAKIHN0cnVjdCBrdm1fdmNwdV9zdGF0IHsKLQl1MzIgc3VtX2V4aXRzOwotCXUzMiBtbWlvX2V4aXRzOwotCXUzMiBzaWduYWxfZXhpdHM7Ci0JdTMyIGxpZ2h0X2V4aXRzOworCXU2NCBzdW1fZXhpdHM7CisJdTY0IG1taW9fZXhpdHM7CisJdTY0IHNpZ25hbF9leGl0czsKKwl1NjQgbGlnaHRfZXhpdHM7CiAJLyogQWNjb3VudCBmb3Igc3BlY2lhbCB0eXBlcyBvZiBsaWdodCBleGl0czogKi8KLQl1MzIgaXRsYl9yZWFsX21pc3NfZXhpdHM7Ci0JdTMyIGl0bGJfdmlydF9taXNzX2V4aXRzOwotCXUzMiBkdGxiX3JlYWxfbWlzc19leGl0czsKLQl1MzIgZHRsYl92aXJ0X21pc3NfZXhpdHM7Ci0JdTMyIHN5c2NhbGxfZXhpdHM7Ci0JdTMyIGlzaV9leGl0czsKLQl1MzIgZHNpX2V4aXRzOwotCXUzMiBlbXVsYXRlZF9pbnN0X2V4aXRzOwotCXUzMiBkZWNfZXhpdHM7Ci0JdTMyIGV4dF9pbnRyX2V4aXRzOwotCXUzMiBoYWx0X3N1Y2Nlc3NmdWxfcG9sbDsKLQl1MzIgaGFsdF9hdHRlbXB0ZWRfcG9sbDsKLQl1MzIgaGFsdF9wb2xsX2ludmFsaWQ7Ci0JdTMyIGhhbHRfd2FrZXVwOwotCXUzMiBkYmVsbF9leGl0czsKLQl1MzIgZ2RiZWxsX2V4aXRzOwotCXUzMiBsZDsKLQl1MzIgc3Q7CisJdTY0IGl0bGJfcmVhbF9taXNzX2V4aXRzOworCXU2NCBpdGxiX3ZpcnRfbWlzc19leGl0czsKKwl1NjQgZHRsYl9yZWFsX21pc3NfZXhpdHM7CisJdTY0IGR0bGJfdmlydF9taXNzX2V4aXRzOworCXU2NCBzeXNjYWxsX2V4aXRzOworCXU2NCBpc2lfZXhpdHM7CisJdTY0IGRzaV9leGl0czsKKwl1NjQgZW11bGF0ZWRfaW5zdF9leGl0czsKKwl1NjQgZGVjX2V4aXRzOworCXU2NCBleHRfaW50cl9leGl0czsKKwl1NjQgaGFsdF9wb2xsX3N1Y2Nlc3NfbnM7CisJdTY0IGhhbHRfcG9sbF9mYWlsX25zOworCXU2NCBoYWx0X3dhaXRfbnM7CisJdTY0IGhhbHRfc3VjY2Vzc2Z1bF9wb2xsOworCXU2NCBoYWx0X2F0dGVtcHRlZF9wb2xsOworCXU2NCBoYWx0X3N1Y2Nlc3NmdWxfd2FpdDsKKwl1NjQgaGFsdF9wb2xsX2ludmFsaWQ7CisJdTY0IGhhbHRfd2FrZXVwOworCXU2NCBkYmVsbF9leGl0czsKKwl1NjQgZ2RiZWxsX2V4aXRzOworCXU2NCBsZDsKKwl1NjQgc3Q7CiAjaWZkZWYgQ09ORklHX1BQQ19CT09LM1MKLQl1MzIgcGZfc3RvcmFnZTsKLQl1MzIgcGZfaW5zdHJ1YzsKLQl1MzIgc3Bfc3RvcmFnZTsKLQl1MzIgc3BfaW5zdHJ1YzsKLQl1MzIgcXVldWVfaW50cjsKLQl1MzIgbGRfc2xvdzsKLQl1MzIgc3Rfc2xvdzsKKwl1NjQgcGZfc3RvcmFnZTsKKwl1NjQgcGZfaW5zdHJ1YzsKKwl1NjQgc3Bfc3RvcmFnZTsKKwl1NjQgc3BfaW5zdHJ1YzsKKwl1NjQgcXVldWVfaW50cjsKKwl1NjQgbGRfc2xvdzsKKwl1NjQgc3Rfc2xvdzsKICNlbmRpZgorCXU2NCBwdGhydV9hbGw7CisJdTY0IHB0aHJ1X2hvc3Q7CisJdTY0IHB0aHJ1X2JhZF9hZmY7CiB9OwogCiBlbnVtIGt2bV9leGl0X3R5cGVzIHsKQEAgLTE5Nyw2ICsyMDYsOCBAQAogc3RydWN0IGt2bXBwY194aWNzOwogc3RydWN0IGt2bXBwY19pY3A7CiAKK3N0cnVjdCBrdm1wcGNfcGFzc3RocnVfaXJxbWFwOworCiAvKgogICogVGhlIHJldmVyc2UgbWFwcGluZyBhcnJheSBoYXMgb25lIGVudHJ5IGZvciBlYWNoIEhQVEUsCiAgKiB3aGljaCBzdG9yZXMgdGhlIGd1ZXN0J3MgdmlldyBvZiB0aGUgc2Vjb25kIHdvcmQgb2YgdGhlIEhQVEUKQEAgLTI2Nyw2ICsyNzgsNyBAQAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0tWTV9YSUNTCiAJc3RydWN0IGt2bXBwY194aWNzICp4aWNzOworCXN0cnVjdCBrdm1wcGNfcGFzc3RocnVfaXJxbWFwICpwaW1hcDsKICNlbmRpZgogCXN0cnVjdCBrdm1wcGNfb3BzICprdm1fb3BzOwogI2lmZGVmIENPTkZJR19LVk1fQk9PSzNTX0hWX1BPU1NJQkxFCkBAIC0yNzUsNDEgKzI4Nyw2IEBACiAjZW5kaWYKIH07CiAKLS8qCi0gKiBTdHJ1Y3QgZm9yIGEgdmlydHVhbCBjb3JlLgotICogTm90ZTogZW50cnlfZXhpdF9tYXAgY29tYmluZXMgYSBiaXRtYXAgb2YgdGhyZWFkcyB0aGF0IGhhdmUgZW50ZXJlZAotICogaW4gdGhlIGJvdHRvbSA4IGJpdHMgYW5kIGEgYml0bWFwIG9mIHRocmVhZHMgdGhhdCBoYXZlIGV4aXRlZCBpbiB0aGUKLSAqIG5leHQgOCBiaXRzLiAgVGhpcyBpcyBzbyB0aGF0IHdlIGNhbiBhdG9taWNhbGx5IHNldCB0aGUgZW50cnkgYml0Ci0gKiBpZmYgdGhlIGV4aXQgbWFwIGlzIDAgd2l0aG91dCB0YWtpbmcgYSBsb2NrLgotICovCi1zdHJ1Y3Qga3ZtcHBjX3Zjb3JlIHsKLQlpbnQgbl9ydW5uYWJsZTsKLQlpbnQgbnVtX3RocmVhZHM7Ci0JaW50IGVudHJ5X2V4aXRfbWFwOwotCWludCBuYXBwaW5nX3RocmVhZHM7Ci0JaW50IGZpcnN0X3ZjcHVpZDsKLQl1MTYgcGNwdTsKLQl1MTYgbGFzdF9jcHU7Ci0JdTggdmNvcmVfc3RhdGU7Ci0JdTggaW5fZ3Vlc3Q7Ci0Jc3RydWN0IGt2bXBwY192Y29yZSAqbWFzdGVyX3Zjb3JlOwotCXN0cnVjdCBsaXN0X2hlYWQgcnVubmFibGVfdGhyZWFkczsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHByZWVtcHRfbGlzdDsKLQlzcGlubG9ja190IGxvY2s7Ci0Jc3RydWN0IHN3YWl0X3F1ZXVlX2hlYWQgd3E7Ci0Jc3BpbmxvY2tfdCBzdG9sdGJfbG9jazsJLyogcHJvdGVjdHMgc3RvbGVuX3RiIGFuZCBwcmVlbXB0X3RiICovCi0JdTY0IHN0b2xlbl90YjsKLQl1NjQgcHJlZW1wdF90YjsKLQlzdHJ1Y3Qga3ZtX3ZjcHUgKnJ1bm5lcjsKLQlzdHJ1Y3Qga3ZtICprdm07Ci0JdTY0IHRiX29mZnNldDsJCS8qIGd1ZXN0IHRpbWViYXNlIC0gaG9zdCB0aW1lYmFzZSAqLwotCXVsb25nIGxwY3I7Ci0JdTMyIGFyY2hfY29tcGF0OwotCXVsb25nIHBjcjsKLQl1bG9uZyBkcGRlczsJCS8qIGRvb3JiZWxsIHN0YXRlIChQT1dFUjgpICovCi0JdWxvbmcgY29uZmVycmluZ190aHJlYWRzOwotfTsKLQogI2RlZmluZSBWQ09SRV9FTlRSWV9NQVAodmMpCSgodmMpLT5lbnRyeV9leGl0X21hcCAmIDB4ZmYpCiAjZGVmaW5lIFZDT1JFX0VYSVRfTUFQKHZjKQkoKHZjKS0+ZW50cnlfZXhpdF9tYXAgPj4gOCkKICNkZWZpbmUgVkNPUkVfSVNfRVhJVElORyh2YykJKFZDT1JFX0VYSVRfTUFQKHZjKSAhPSAwKQpAQCAtMzI5LDYgKzMwNiw3IEBACiAjZGVmaW5lIFZDT1JFX1NMRUVQSU5HCTMKICNkZWZpbmUgVkNPUkVfUlVOTklORwk0CiAjZGVmaW5lIFZDT1JFX0VYSVRJTkcJNQorI2RlZmluZSBWQ09SRV9QT0xMSU5HCTYKIAogLyoKICAqIFN0cnVjdCB1c2VkIHRvIG1hbmFnZSBtZW1vcnkgZm9yIGEgdmlydHVhbCBwcm9jZXNzb3IgYXJlYQpAQCAtMzk3LDYgKzM3NSwyMCBAQAogCXU2NAl0Yl9tYXg7CQkvKiBtYXggdGltZSAqLwogfTsKIAorI2lmZGVmIENPTkZJR19QUENfQk9PSzNTXzY0CitzdHJ1Y3Qga3ZtcHBjX2lycV9tYXAgeworCXUzMglyX2h3aXJxOworCXUzMgl2X2h3aXJxOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKK307CisKKyNkZWZpbmUJS1ZNUFBDX1BJUlFfTUFQUEVECTEwMjQKK3N0cnVjdCBrdm1wcGNfcGFzc3RocnVfaXJxbWFwIHsKKwlpbnQgbl9tYXBwZWQ7CisJc3RydWN0IGt2bXBwY19pcnFfbWFwIG1hcHBlZFtLVk1QUENfUElSUV9NQVBQRURdOworfTsKKyNlbmRpZgorCiAjIGlmZGVmIENPTkZJR19QUENfRlNMX0JPT0szRQogI2RlZmluZSBLVk1QUENfQk9PS0VfSUFDX05VTQkyCiAjZGVmaW5lIEtWTVBQQ19CT09LRV9EQUNfTlVNCTIKQEAgLTQ4Myw3ICs0NzUsNiBAQAogCXVsb25nIHB1cnI7CiAJdWxvbmcgc3B1cnI7CiAJdWxvbmcgaWM7Ci0JdWxvbmcgdnRiOwogCXVsb25nIGRzY3I7CiAJdWxvbmcgYW1yOwogCXVsb25nIHVhbW9yOwpAQCAtNjY4LDcgKzY1OSw2IEBACiAJbG9uZyBwZ2ZhdWx0X2luZGV4OwogCXVuc2lnbmVkIGxvbmcgcGdmYXVsdF9ocHRlWzJdOwogCi0Jc3RydWN0IGxpc3RfaGVhZCBydW5fbGlzdDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnJ1bl90YXNrOwogCXN0cnVjdCBrdm1fcnVuICprdm1fcnVuOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX3BwYy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9wcGMuaAppbmRleCAyNTQ0ZWRhLi5mNmU0OTY0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX3BwYy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fcHBjLmgKQEAgLTI4Nyw2ICsyODcsMTAgQEAKIAlsb25nICgqYXJjaF92bV9pb2N0bCkoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBpb2N0bCwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKIAlpbnQgKCpoY2FsbF9pbXBsZW1lbnRlZCkodW5zaWduZWQgbG9uZyBoY2FsbCk7CisJaW50ICgqaXJxX2J5cGFzc19hZGRfcHJvZHVjZXIpKHN0cnVjdCBpcnFfYnlwYXNzX2NvbnN1bWVyICosCisJCQkJICAgICAgIHN0cnVjdCBpcnFfYnlwYXNzX3Byb2R1Y2VyICopOworCXZvaWQgKCppcnFfYnlwYXNzX2RlbF9wcm9kdWNlcikoc3RydWN0IGlycV9ieXBhc3NfY29uc3VtZXIgKiwKKwkJCQkJc3RydWN0IGlycV9ieXBhc3NfcHJvZHVjZXIgKik7CiB9OwogCiBleHRlcm4gc3RydWN0IGt2bXBwY19vcHMgKmt2bXBwY19odl9vcHM7CkBAIC00NTMsOCArNDU3LDE5IEBACiB7CiAJcmV0dXJuIHZjcHUtPmFyY2guaXJxX3R5cGUgPT0gS1ZNUFBDX0lSUV9YSUNTOwogfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBrdm1wcGNfcGFzc3RocnVfaXJxbWFwICprdm1wcGNfZ2V0X3Bhc3N0aHJ1X2lycW1hcCgKKwkJCQlzdHJ1Y3Qga3ZtICprdm0pCit7CisJaWYgKGt2bSAmJiBrdm1faXJxX2J5cGFzcykKKwkJcmV0dXJuIGt2bS0+YXJjaC5waW1hcDsKKwlyZXR1cm4gTlVMTDsKK30KKwogZXh0ZXJuIHZvaWQga3ZtcHBjX2FsbG9jX2hvc3Rfcm1fb3BzKHZvaWQpOwogZXh0ZXJuIHZvaWQga3ZtcHBjX2ZyZWVfaG9zdF9ybV9vcHModm9pZCk7CitleHRlcm4gdm9pZCBrdm1wcGNfZnJlZV9waW1hcChzdHJ1Y3Qga3ZtICprdm0pOworZXh0ZXJuIGludCBrdm1wcGNfeGljc19ybV9jb21wbGV0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUzMiBoY2FsbCk7CiBleHRlcm4gdm9pZCBrdm1wcGNfeGljc19mcmVlX2ljcChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogZXh0ZXJuIGludCBrdm1wcGNfeGljc19jcmVhdGVfaWNwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBzZXJ2ZXIpOwogZXh0ZXJuIGludCBrdm1fdm1faW9jdGxfeGljc19pcnEoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2lycV9sZXZlbCAqYXJncyk7CkBAIC00NjQsMTAgKzQ3OSwyMyBAQAogZXh0ZXJuIGludCBrdm1wcGNfeGljc19jb25uZWN0X3ZjcHUoc3RydWN0IGt2bV9kZXZpY2UgKmRldiwKIAkJCXN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTMyIGNwdSk7CiBleHRlcm4gdm9pZCBrdm1wcGNfeGljc19pcGlfYWN0aW9uKHZvaWQpOworZXh0ZXJuIHZvaWQga3ZtcHBjX3hpY3Nfc2V0X21hcHBlZChzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGxvbmcgZ3Vlc3RfaXJxLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgaG9zdF9pcnEpOworZXh0ZXJuIHZvaWQga3ZtcHBjX3hpY3NfY2xyX21hcHBlZChzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGxvbmcgZ3Vlc3RfaXJxLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgaG9zdF9pcnEpOworZXh0ZXJuIGxvbmcga3ZtcHBjX2RlbGl2ZXJfaXJxX3Bhc3N0aHJ1KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTMyIHhpcnIsCisJCQkJIHN0cnVjdCBrdm1wcGNfaXJxX21hcCAqaXJxX21hcCwKKwkJCQkgc3RydWN0IGt2bXBwY19wYXNzdGhydV9pcnFtYXAgKnBpbWFwKTsKIGV4dGVybiBpbnQgaF9pcGlfcmVkaXJlY3Q7CiAjZWxzZQorc3RhdGljIGlubGluZSBzdHJ1Y3Qga3ZtcHBjX3Bhc3N0aHJ1X2lycW1hcCAqa3ZtcHBjX2dldF9wYXNzdGhydV9pcnFtYXAoCisJCQkJc3RydWN0IGt2bSAqa3ZtKQorCXsgcmV0dXJuIE5VTEw7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBrdm1wcGNfYWxsb2NfaG9zdF9ybV9vcHModm9pZCkge307CiBzdGF0aWMgaW5saW5lIHZvaWQga3ZtcHBjX2ZyZWVfaG9zdF9ybV9vcHModm9pZCkge307CitzdGF0aWMgaW5saW5lIHZvaWQga3ZtcHBjX2ZyZWVfcGltYXAoc3RydWN0IGt2bSAqa3ZtKSB7fTsKK3N0YXRpYyBpbmxpbmUgaW50IGt2bXBwY194aWNzX3JtX2NvbXBsZXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTMyIGhjYWxsKQorCXsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgaW50IGt2bXBwY194aWNzX2VuYWJsZWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogCXsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBrdm1wcGNfeGljc19mcmVlX2ljcChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpIHsgfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdS5oCmluZGV4IGUyZmI0MDguLmI3OGU4ZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW11LmgKQEAgLTI3MSw2ICsyNzEsNyBAQAogI2RlZmluZSBNTVVfUEFHRV8xNkcJMTMKICNkZWZpbmUgTU1VX1BBR0VfNjRHCTE0CiAKKy8qIE4uQi4gd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHR5cGUgb2YgaHB0ZV9wYWdlX3NpemVzIGlmIHRoaXMgZ2V0cyB0byBiZSA+IDE2ICovCiAjZGVmaW5lIE1NVV9QQUdFX0NPVU5UCTE1CiAKICNpZmRlZiBDT05GSUdfUFBDX0JPT0szU182NApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL29wYWwuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9vcGFsLmgKaW5kZXggZWUwNWJkMi4uZTk1OGI3MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL29wYWwuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vb3BhbC5oCkBAIC02Nyw2ICs2Nyw3IEBACiBpbnQ2NF90IG9wYWxfcGNpX2NvbmZpZ193cml0ZV93b3JkKHVpbnQ2NF90IHBoYl9pZCwgdWludDY0X3QgYnVzX2Rldl9mdW5jLAogCQkJCSAgIHVpbnQ2NF90IG9mZnNldCwgdWludDMyX3QgZGF0YSk7CiBpbnQ2NF90IG9wYWxfc2V0X3hpdmUodWludDMyX3QgaXNuLCB1aW50MTZfdCBzZXJ2ZXIsIHVpbnQ4X3QgcHJpb3JpdHkpOworaW50NjRfdCBvcGFsX3JtX3NldF94aXZlKHVpbnQzMl90IGlzbiwgdWludDE2X3Qgc2VydmVyLCB1aW50OF90IHByaW9yaXR5KTsKIGludDY0X3Qgb3BhbF9nZXRfeGl2ZSh1aW50MzJfdCBpc24sIF9fYmUxNiAqc2VydmVyLCB1aW50OF90ICpwcmlvcml0eSk7CiBpbnQ2NF90IG9wYWxfcmVnaXN0ZXJfZXhjZXB0aW9uX2hhbmRsZXIodWludDY0X3Qgb3BhbF9leGNlcHRpb24sCiAJCQkJCXVpbnQ2NF90IGhhbmRsZXJfYWRkcmVzcywKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWNhLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFjYS5oCmluZGV4IDE0ODMwM2U3Li42YTY3OTJiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFjYS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWNhLmgKQEAgLTE4MywxMSArMTgzLDYgQEAKIAkgKi8KIAl1MTYgaW5fbWNlOwogCXU4IGhtaV9ldmVudF9hdmFpbGFibGU7CQkgLyogSE1JIGV2ZW50IGlzIGF2YWlsYWJsZSAqLwotCS8qCi0JICogQml0bWFwIGZvciBzaWJsaW5nIHN1YmNvcmUgc3RhdHVzLiBTZWUga3ZtL2Jvb2szc19odl9yYXMuYyBmb3IKLQkgKiBtb3JlIGRldGFpbHMKLQkgKi8KLQlzdHJ1Y3Qgc2libGluZ19zdWJjb3JlX3N0YXRlICpzaWJsaW5nX3N1YmNvcmVfc3RhdGU7CiAjZW5kaWYKIAogCS8qIFN0dWZmIGZvciBhY2N1cmF0ZSB0aW1lIGFjY291bnRpbmcgKi8KQEAgLTIwMiw2ICsxOTcsMTMgQEAKIAlzdHJ1Y3Qga3ZtcHBjX2Jvb2szc19zaGFkb3dfdmNwdSBzaGFkb3dfdmNwdTsKICNlbmRpZgogCXN0cnVjdCBrdm1wcGNfaG9zdF9zdGF0ZSBrdm1faHN0YXRlOworI2lmZGVmIENPTkZJR19LVk1fQk9PSzNTX0hWX1BPU1NJQkxFCisJLyoKKwkgKiBCaXRtYXAgZm9yIHNpYmxpbmcgc3ViY29yZSBzdGF0dXMuIFNlZSBrdm0vYm9vazNzX2h2X3Jhcy5jIGZvcgorCSAqIG1vcmUgZGV0YWlscworCSAqLworCXN0cnVjdCBzaWJsaW5nX3N1YmNvcmVfc3RhdGUgKnNpYmxpbmdfc3ViY29yZV9zdGF0ZTsKKyNlbmRpZgogI2VuZGlmCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGNpLWJyaWRnZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BjaS1icmlkZ2UuaAppbmRleCBiNWU4OGU0Li5jMDMwOWM1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGNpLWJyaWRnZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wY2ktYnJpZGdlLmgKQEAgLTMwMSw2ICszMDEsNyBAQAogLyogQWxsb2NhdGUgJiBmcmVlIGEgUENJIGhvc3QgYnJpZGdlIHN0cnVjdHVyZSAqLwogZXh0ZXJuIHN0cnVjdCBwY2lfY29udHJvbGxlciAqcGNpYmlvc19hbGxvY19jb250cm9sbGVyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KTsKIGV4dGVybiB2b2lkIHBjaWJpb3NfZnJlZV9jb250cm9sbGVyKHN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiKTsKK2V4dGVybiB2b2lkIHBjaWJpb3NfZnJlZV9jb250cm9sbGVyX2RlZmVycmVkKHN0cnVjdCBwY2lfaG9zdF9icmlkZ2UgKmJyaWRnZSk7CiAKICNpZmRlZiBDT05GSUdfUENJCiBleHRlcm4gaW50IHBjaWJpb3NfdmFkZHJfaXNfaW9wb3J0KHZvaWQgX19pb21lbSAqYWRkcmVzcyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcG52LXBjaS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Budi1wY2kuaAppbmRleCAwY2JkODEzLi4xYjQ2YjUyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcG52LXBjaS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wbnYtcGNpLmgKQEAgLTEyLDYgKzEyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaV9ob3RwbHVnLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bWlzYy9jeGwtYmFzZS5oPgogI2luY2x1ZGUgPGFzbS9vcGFsLWFwaS5oPgogCkBAIC0zMyw2ICszNCw4IEBACiB2b2lkIHBudl9jeGxfcmVsZWFzZV9od2lycXMoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGh3aXJxLCBpbnQgbnVtKTsKIGludCBwbnZfY3hsX2dldF9pcnFfY291bnQoc3RydWN0IHBjaV9kZXYgKmRldik7CiBzdHJ1Y3QgZGV2aWNlX25vZGUgKnBudl9wY2lfZ2V0X3BoYl9ub2RlKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworaW50NjRfdCBwbnZfb3BhbF9wY2lfbXNpX2VvaShzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBod19pcnEpOworYm9vbCBpc19wbnZfb3BhbF9tc2koc3RydWN0IGlycV9jaGlwICpjaGlwKTsKIAogI2lmZGVmIENPTkZJR19DWExfQkFTRQogaW50IHBudl9jeGxfYWxsb2NfaHdpcnFfcmFuZ2VzKHN0cnVjdCBjeGxfaXJxX3JhbmdlcyAqaXJxcywKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yZWcuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yZWcuaAppbmRleCBmNjlmNDBmLi45NzhkYWRhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3JlZy5oCkBAIC03MzcsNiArNzM3LDcgQEAKICNkZWZpbmUgICBNTUNSMF9GQ0hWCTB4MDAwMDAwMDFVTCAvKiBmcmVlemUgY29uZGl0aW9ucyBpbiBoeXBlcnZpc29yIG1vZGUgKi8KICNkZWZpbmUgU1BSTl9NTUNSMQk3OTgKICNkZWZpbmUgU1BSTl9NTUNSMgk3ODUKKyNkZWZpbmUgU1BSTl9VTU1DUjIJNzY5CiAjZGVmaW5lIFNQUk5fTU1DUkEJMHgzMTIKICNkZWZpbmUgICBNTUNSQV9TRFNZTkMJMHg4MDAwMDAwMFVMIC8qIFNEQVIgc3luY2VkIHdpdGggU0lBUiAqLwogI2RlZmluZSAgIE1NQ1JBX1NEQVJfRENBQ0hFX01JU1MgMHg0MDAwMDAwMFVMCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCBjMWRjNmMxLi5jMjY2MjI3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTMwOCw0MCArMzA4LDIxIEBACiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY29weV9mcm9tX3VzZXIodm9pZCAqdG8sCiAJCWNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7Ci0JdW5zaWduZWQgbG9uZyBvdmVyOwotCi0JaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJvbSwgbikpIHsKLQkJaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcChuKSkKLQkJCWNoZWNrX29iamVjdF9zaXplKHRvLCBuLCBmYWxzZSk7CisJaWYgKGxpa2VseShhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIG4pKSkgeworCQljaGVja19vYmplY3Rfc2l6ZSh0bywgbiwgZmFsc2UpOwogCQlyZXR1cm4gX19jb3B5X3RvZnJvbV91c2VyKChfX2ZvcmNlIHZvaWQgX191c2VyICopdG8sIGZyb20sIG4pOwogCX0KLQlpZiAoKHVuc2lnbmVkIGxvbmcpZnJvbSA8IFRBU0tfU0laRSkgewotCQlvdmVyID0gKHVuc2lnbmVkIGxvbmcpZnJvbSArIG4gLSBUQVNLX1NJWkU7Ci0JCWlmICghX19idWlsdGluX2NvbnN0YW50X3AobiAtIG92ZXIpKQotCQkJY2hlY2tfb2JqZWN0X3NpemUodG8sIG4gLSBvdmVyLCBmYWxzZSk7Ci0JCXJldHVybiBfX2NvcHlfdG9mcm9tX3VzZXIoKF9fZm9yY2Ugdm9pZCBfX3VzZXIgKil0bywgZnJvbSwKLQkJCQluIC0gb3ZlcikgKyBvdmVyOwotCX0KKwltZW1zZXQodG8sIDAsIG4pOwogCXJldHVybiBuOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywKIAkJY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewotCXVuc2lnbmVkIGxvbmcgb3ZlcjsKLQogCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB0bywgbikpIHsKLQkJaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcChuKSkKLQkJCWNoZWNrX29iamVjdF9zaXplKGZyb20sIG4sIHRydWUpOworCQljaGVja19vYmplY3Rfc2l6ZShmcm9tLCBuLCB0cnVlKTsKIAkJcmV0dXJuIF9fY29weV90b2Zyb21fdXNlcih0bywgKF9fZm9yY2Ugdm9pZCBfX3VzZXIgKilmcm9tLCBuKTsKIAl9Ci0JaWYgKCh1bnNpZ25lZCBsb25nKXRvIDwgVEFTS19TSVpFKSB7Ci0JCW92ZXIgPSAodW5zaWduZWQgbG9uZyl0byArIG4gLSBUQVNLX1NJWkU7Ci0JCWlmICghX19idWlsdGluX2NvbnN0YW50X3AobikpCi0JCQljaGVja19vYmplY3Rfc2l6ZShmcm9tLCBuIC0gb3ZlciwgdHJ1ZSk7Ci0JCXJldHVybiBfX2NvcHlfdG9mcm9tX3VzZXIodG8sIChfX2ZvcmNlIHZvaWQgX191c2VyICopZnJvbSwKLQkJCQluIC0gb3ZlcikgKyBvdmVyOwotCX0KIAlyZXR1cm4gbjsKIH0KIApAQCAtMzgzLDggKzM2NCw3IEBACiAJCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKG4pKQotCQljaGVja19vYmplY3Rfc2l6ZSh0bywgbiwgZmFsc2UpOworCWNoZWNrX29iamVjdF9zaXplKHRvLCBuLCBmYWxzZSk7CiAKIAlyZXR1cm4gX19jb3B5X3RvZnJvbV91c2VyKChfX2ZvcmNlIHZvaWQgX191c2VyICopdG8sIGZyb20sIG4pOwogfQpAQCAtNDEyLDggKzM5Miw4IEBACiAJCWlmIChyZXQgPT0gMCkKIAkJCXJldHVybiAwOwogCX0KLQlpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKG4pKQotCQljaGVja19vYmplY3Rfc2l6ZShmcm9tLCBuLCB0cnVlKTsKKworCWNoZWNrX29iamVjdF9zaXplKGZyb20sIG4sIHRydWUpOwogCiAJcmV0dXJuIF9fY29weV90b2Zyb21fdXNlcih0bywgKF9fZm9yY2UgY29uc3Qgdm9pZCBfX3VzZXIgKilmcm9tLCBuKTsKIH0KQEAgLTQzOSwxMCArNDE5LDYgQEAKIAltaWdodF9mYXVsdCgpOwogCWlmIChsaWtlbHkoYWNjZXNzX29rKFZFUklGWV9XUklURSwgYWRkciwgc2l6ZSkpKQogCQlyZXR1cm4gX19jbGVhcl91c2VyKGFkZHIsIHNpemUpOwotCWlmICgodW5zaWduZWQgbG9uZylhZGRyIDwgVEFTS19TSVpFKSB7Ci0JCXVuc2lnbmVkIGxvbmcgb3ZlciA9ICh1bnNpZ25lZCBsb25nKWFkZHIgKyBzaXplIC0gVEFTS19TSVpFOwotCQlyZXR1cm4gX19jbGVhcl91c2VyKGFkZHIsIHNpemUgLSBvdmVyKSArIG92ZXI7Ci0JfQogCXJldHVybiBzaXplOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQppbmRleCBiMjAyN2E1Li5mZTRjMDc1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKQEAgLTQxLDcgKzQxLDcgQEAKIG9iai0kKENPTkZJR19IQVZFX0hXX0JSRUFLUE9JTlQpCSs9IGh3X2JyZWFrcG9pbnQubwogb2JqLSQoQ09ORklHX1BQQ19CT09LM1NfNjQpCSs9IGNwdV9zZXR1cF9wcGM5NzAubyBjcHVfc2V0dXBfcGE2dC5vCiBvYmotJChDT05GSUdfUFBDX0JPT0szU182NCkJKz0gY3B1X3NldHVwX3Bvd2VyLm8KLW9iai0kKENPTkZJR19QUENfQk9PSzNTXzY0KQkrPSBtY2UubyBtY2VfcG93ZXIubyBobWkubworb2JqLSQoQ09ORklHX1BQQ19CT09LM1NfNjQpCSs9IG1jZS5vIG1jZV9wb3dlci5vCiBvYmotJChDT05GSUdfUFBDX0JPT0szRV82NCkJKz0gZXhjZXB0aW9ucy02NGUubyBpZGxlX2Jvb2szZS5vCiBvYmotJChDT05GSUdfUFBDNjQpCQkrPSB2ZHNvNjQvCiBvYmotJChDT05GSUdfQUxUSVZFQykJCSs9IHZlY2VtdS5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggYjg5ZDE0Yy4uYTUxYWU5YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtNTA2LDcgKzUwNiw2IEBACiAJREVGSU5FKFZDUFVfUFVSUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnB1cnIpKTsKIAlERUZJTkUoVkNQVV9TUFVSUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnNwdXJyKSk7CiAJREVGSU5FKFZDUFVfSUMsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5pYykpOwotCURFRklORShWQ1BVX1ZUQiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnZ0YikpOwogCURFRklORShWQ1BVX0RTQ1IsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5kc2NyKSk7CiAJREVGSU5FKFZDUFVfQU1SLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guYW1yKSk7CiAJREVGSU5FKFZDUFVfVUFNT1IsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC51YW1vcikpOwpAQCAtNTU3LDYgKzU1Niw3IEBACiAJREVGSU5FKFZDT1JFX0xQQ1IsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfdmNvcmUsIGxwY3IpKTsKIAlERUZJTkUoVkNPUkVfUENSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX3Zjb3JlLCBwY3IpKTsKIAlERUZJTkUoVkNPUkVfRFBERVMsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfdmNvcmUsIGRwZGVzKSk7CisJREVGSU5FKFZDT1JFX1ZUQiwgb2Zmc2V0b2Yoc3RydWN0IGt2bXBwY192Y29yZSwgdnRiKSk7CiAJREVGSU5FKFZDUFVfU0xCX0UsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfc2xiLCBvcmlnZSkpOwogCURFRklORShWQ1BVX1NMQl9WLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX3NsYiwgb3JpZ3YpKTsKIAlERUZJTkUoVkNQVV9TTEJfU0laRSwgc2l6ZW9mKHN0cnVjdCBrdm1wcGNfc2xiKSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzY0LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzY0LlMKaW5kZXggNmI4YmMwZC4uNWFmZDAzZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV82NC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZW50cnlfNjQuUwpAQCAtMzY4LDEzICszNjgsMTMgQEAKIHRhYm9ydF9zeXNjYWxsOgogCS8qIEZpcnN0bHkgd2UgbmVlZCB0byBlbmFibGUgVE0gaW4gdGhlIGtlcm5lbCAqLwogCW1mbXNyCXIxMAotCWxpCXIxMywgMQotCXJsZGltaQlyMTAsIHIxMywgTVNSX1RNX0xHLCA2My1NU1JfVE1fTEcKKwlsaQlyOSwgMQorCXJsZGltaQlyMTAsIHI5LCBNU1JfVE1fTEcsIDYzLU1TUl9UTV9MRwogCW10bXNyZAlyMTAsIDAKIAogCS8qIHRhYm9ydCwgdGhpcyBkb29tcyB0aGUgdHJhbnNhY3Rpb24sIG5vdGhpbmcgZWxzZSAqLwotCWxpCXIxMywgKFRNX0NBVVNFX1NZU0NBTEx8VE1fQ0FVU0VfUEVSU0lTVEVOVCkKLQlUQUJPUlQoUjEzKQorCWxpCXI5LCAoVE1fQ0FVU0VfU1lTQ0FMTHxUTV9DQVVTRV9QRVJTSVNURU5UKQorCVRBQk9SVChSOSkKIAogCS8qCiAJICogUmV0dXJuIGRpcmVjdGx5IHRvIHVzZXJzcGFjZS4gV2UgaGF2ZSBjb3JydXB0ZWQgdXNlciByZWdpc3RlciBzdGF0ZSwKQEAgLTM4Miw4ICszODIsOCBAQAogCSAqIHJlc3VtZSBhZnRlciB0aGUgdGJlZ2luIG9mIHRoZSBhYm9ydGVkIHRyYW5zYWN0aW9uIHdpdGggdGhlCiAJICogY2hlY2twb2ludGVkIHJlZ2lzdGVyIHN0YXRlLgogCSAqLwotCWxpCXIxMywgTVNSX1JJCi0JYW5kYwlyMTAsIHIxMCwgcjEzCisJbGkJcjksIE1TUl9SSQorCWFuZGMJcjEwLCByMTAsIHI5CiAJbXRtc3JkCXIxMCwgMQogCW10c3ByCVNQUk5fU1JSMCwgcjExCiAJbXRzcHIJU1BSTl9TUlIxLCByMTIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZXhjZXB0aW9ucy02NHMuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZXhjZXB0aW9ucy02NHMuUwppbmRleCBkZjZkNDVlLi5iZmZlYzczIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRzLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0cy5TCkBAIC00ODUsNyArNDg1LDIzIEBACiAJRVhDRVBUSU9OX1BST0xPR18wKFBBQ0FfRVhNQykKIG1hY2hpbmVfY2hlY2tfcFNlcmllc18wOgogCUVYQ0VQVElPTl9QUk9MT0dfMShQQUNBX0VYTUMsIEtWTVRFU1QsIDB4MjAwKQotCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFU18xKG1hY2hpbmVfY2hlY2tfY29tbW9uLCBFWENfU1REKQorCS8qCisJICogVGhlIGZvbGxvd2luZyBpcyBlc3NlbnRpYWxseSBFWENFUFRJT05fUFJPTE9HX1BTRVJJRVNfMSB3aXRoIHRoZQorCSAqIGRpZmZlcmVuY2UgdGhhdCBNU1JfUkkgaXMgbm90IGVuYWJsZWQsIGJlY2F1c2UgUEFDQV9FWE1DIGlzIGJlaW5nCisJICogdXNlZCwgc28gbmVzdGVkIG1hY2hpbmUgY2hlY2sgY29ycnVwdHMgaXQuIG1hY2hpbmVfY2hlY2tfY29tbW9uCisJICogZW5hYmxlcyBNU1JfUkkuCisJICovCisJbGQJcjEyLFBBQ0FLQkFTRShyMTMpCisJbGQJcjEwLFBBQ0FLTVNSKHIxMykKKwl4b3JpCXIxMCxyMTAsTVNSX1JJCisJbWZzcHIJcjExLFNQUk5fU1JSMAorCUxPQURfSEFORExFUihyMTIsIG1hY2hpbmVfY2hlY2tfY29tbW9uKQorCW10c3ByCVNQUk5fU1JSMCxyMTIKKwltZnNwcglyMTIsU1BSTl9TUlIxCisJbXRzcHIJU1BSTl9TUlIxLHIxMAorCXJmaWQKKwliCS4JLyogcHJldmVudCBzcGVjdWxhdGl2ZSBleGVjdXRpb24gKi8KKwogCUtWTV9IQU5ETEVSX1NLSVAoUEFDQV9FWE1DLCBFWENfU1RELCAweDIwMCkKIAlLVk1fSEFORExFUl9TS0lQKFBBQ0FfRVhHRU4sIEVYQ19TVEQsIDB4MzAwKQogCUtWTV9IQU5ETEVSX1NLSVAoUEFDQV9FWFNMQiwgRVhDX1NURCwgMHgzODApCkBAIC05NjksMTQgKzk4NSwxNyBAQAogbWFjaGluZV9jaGVja19jb21tb246CiAKIAltZnNwcglyMTAsU1BSTl9EQVIKLQlzdGQJcjEwLFBBQ0FfRVhHRU4rRVhfREFSKHIxMykKKwlzdGQJcjEwLFBBQ0FfRVhNQytFWF9EQVIocjEzKQogCW1mc3ByCXIxMCxTUFJOX0RTSVNSCi0Jc3R3CXIxMCxQQUNBX0VYR0VOK0VYX0RTSVNSKHIxMykKKwlzdHcJcjEwLFBBQ0FfRVhNQytFWF9EU0lTUihyMTMpCiAJRVhDRVBUSU9OX1BST0xPR19DT01NT04oMHgyMDAsIFBBQ0FfRVhNQykKIAlGSU5JU0hfTkFQCiAJUkVDT05DSUxFX0lSUV9TVEFURShyMTAsIHIxMSkKLQlsZAlyMyxQQUNBX0VYR0VOK0VYX0RBUihyMTMpCi0JbHd6CXI0LFBBQ0FfRVhHRU4rRVhfRFNJU1IocjEzKQorCWxkCXIzLFBBQ0FfRVhNQytFWF9EQVIocjEzKQorCWx3eglyNCxQQUNBX0VYTUMrRVhfRFNJU1IocjEzKQorCS8qIEVuYWJsZSBNU1JfUkkgd2hlbiBmaW5pc2hlZCB3aXRoIFBBQ0FfRVhNQyAqLworCWxpCXIxMCxNU1JfUkkKKwltdG1zcmQgCXIxMCwxCiAJc3RkCXIzLF9EQVIocjEpCiAJc3RkCXI0LF9EU0lTUihyMSkKIAlibAlzYXZlX252Z3BycwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9mdHJhY2UuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZnRyYWNlLmMKaW5kZXggY2M1MmQ5Ny4uYTk1NjM5YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9mdHJhY2UuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2Z0cmFjZS5jCkBAIC01OTMsNyArNTkzLDggQEAKIAlpZiAoIWZ0cmFjZV9ncmFwaF9lbnRyeSgmdHJhY2UpKQogCQlnb3RvIG91dDsKIAotCWlmIChmdHJhY2VfcHVzaF9yZXR1cm5fdHJhY2UocGFyZW50LCBpcCwgJnRyYWNlLmRlcHRoLCAwKSA9PSAtRUJVU1kpCisJaWYgKGZ0cmFjZV9wdXNoX3JldHVybl90cmFjZShwYXJlbnQsIGlwLCAmdHJhY2UuZGVwdGgsIDAsCisJCQkJICAgICBOVUxMKSA9PSAtRUJVU1kpCiAJCWdvdG8gb3V0OwogCiAJcGFyZW50ID0gcmV0dXJuX2hvb2tlcjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWRsZV9ib29rM3MuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWRsZV9ib29rM3MuUwppbmRleCAyMjY1YzYzLi5iZDczOWZlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGVfYm9vazNzLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pZGxlX2Jvb2szcy5TCkBAIC00MTEsNyArNDExLDcgQEAKICAqCiAgKiByMTMgLSBQQUNBCiAgKiBjcjMgLSBndCBpZiB3YWtpbmcgdXAgd2l0aCBwYXJ0aWFsL2NvbXBsZXRlIGh5cGVydmlzb3Igc3RhdGUgbG9zcwotICogY3I0IC0gZXEgaWYgd2FraW5nIHVwIGZyb20gY29tcGxldGUgaHlwZXJ2aXNvciBzdGF0ZSBsb3NzLgorICogY3I0IC0gZ3Qgb3IgZXEgaWYgd2FraW5nIHVwIGZyb20gY29tcGxldGUgaHlwZXJ2aXNvciBzdGF0ZSBsb3NzLgogICovCiBfR0xPQkFMKHBudl93YWtldXBfdGJfbG9zcykKIAlsZAlyMSxQQUNBUjEocjEzKQpAQCAtNDUzLDcgKzQ1Myw3IEBACiAJICogQXQgdGhpcyBzdGFnZQogCSAqIGNyMiAtIGVxIGlmIGZpcnN0IHRocmVhZCB0byB3YWtldXAgaW4gY29yZQogCSAqIGNyMy0gIGd0IGlmIHdha2luZyB1cCB3aXRoIHBhcnRpYWwvY29tcGxldGUgaHlwZXJ2aXNvciBzdGF0ZSBsb3NzCi0JICogY3I0IC0gZXEgaWYgd2FraW5nIHVwIGZyb20gY29tcGxldGUgaHlwZXJ2aXNvciBzdGF0ZSBsb3NzLgorCSAqIGNyNCAtIGd0IG9yIGVxIGlmIHdha2luZyB1cCBmcm9tIGNvbXBsZXRlIGh5cGVydmlzb3Igc3RhdGUgbG9zcy4KIAkgKi8KIAogCW9yaQlyMTUscjE1LFBOVl9DT1JFX0lETEVfTE9DS19CSVQKQEAgLTQ4MSw3ICs0ODEsNyBAQAogCSAqIElmIHdha2luZyB1cCBmcm9tIHNsZWVwLCBzdWJjb3JlIHN0YXRlIGlzIG5vdCBsb3N0LiBIZW5jZQogCSAqIHNraXAgc3ViY29yZSBzdGF0ZSByZXN0b3JlCiAJICovCi0JYm5lCWNyNCxzdWJjb3JlX3N0YXRlX3Jlc3RvcmVkCisJYmx0CWNyNCxzdWJjb3JlX3N0YXRlX3Jlc3RvcmVkCiAKIAkvKiBSZXN0b3JlIHBlci1zdWJjb3JlIHN0YXRlICovCiAJbGQgICAgICByNCxfU0RSMShyMSkKQEAgLTUyNiw3ICs1MjYsNyBAQAogCSAqIElmIHdha2luZyB1cCBmcm9tIHNsZWVwLCBwZXIgY29yZSBzdGF0ZSBpcyBub3QgbG9zdCwgc2tpcCB0bwogCSAqIGNsZWFyX2xvY2suCiAJICovCi0JYm5lCWNyNCxjbGVhcl9sb2NrCisJYmx0CWNyNCxjbGVhcl9sb2NrCiAKIAkvKgogCSAqIEZpcnN0IHRocmVhZCBpbiB0aGUgY29yZSB0byB3YWtlIHVwIGFuZCBpdHMgd2FraW5nIHVwIHdpdGgKQEAgLTU1Nyw3ICs1NTcsNyBAQAogCSAqIElmIHdha2luZyB1cCBmcm9tIHNsZWVwLCBoeXBlcnZpc29yIHN0YXRlIGlzIG5vdCBsb3N0LiBIZW5jZQogCSAqIHNraXAgaHlwZXJ2aXNvciBzdGF0ZSByZXN0b3JlLgogCSAqLwotCWJuZQljcjQsaHlwZXJ2aXNvcl9zdGF0ZV9yZXN0b3JlZAorCWJsdAljcjQsaHlwZXJ2aXNvcl9zdGF0ZV9yZXN0b3JlZAogCiAJLyogV2FraW5nIHVwIGZyb20gd2lua2xlICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggM2VkOGVjMDkuLmU3ODVjYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwva3Byb2Jlcy5jCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ByZWVtcHQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHRhYmxlLmg+CiAjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGFzbS9jb2RlLXBhdGNoaW5nLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaS1jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jCmluZGV4IDdmZGYzMjQuLmU1ODkwODAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jCkBAIC0xNTQsNiArMTU0LDQyIEBACiBFWFBPUlRfU1lNQk9MX0dQTChwY2liaW9zX2ZyZWVfY29udHJvbGxlcik7CiAKIC8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2FsbCBwY2liaW9zX2ZyZWVfY29udHJvbGxlcigpCisgKiBpbiBhIGRlZmVycmVkIG1hbm5lcjogYSBjYWxsYmFjayBmcm9tIHRoZSBQQ0kgc3Vic3lzdGVtLgorICoKKyAqIF8qRE8gTk9UKl8gY2FsbCBwY2liaW9zX2ZyZWVfY29udHJvbGxlcigpIGV4cGxpY2l0bHkgaWYKKyAqIHRoaXMgaXMgdXNlZCAob3IgaXQgbWF5IGFjY2VzcyBhbiBpbnZhbGlkICpwaGIgcG9pbnRlcikuCisgKgorICogVGhlIGNhbGxiYWNrIG9jY3VycyB3aGVuIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByb290IGJ1cworICogYXJlIGRyb3BwZWQgKGUuZy4sIGNoaWxkIGJ1c2VzL2RldmljZXMgYW5kIHRoZWlyIHVzZXJzKS4KKyAqCisgKiBJdCdzIGNhbGxlZCBhcyAucmVsZWFzZV9mbigpIG9mICdzdHJ1Y3QgcGNpX2hvc3RfYnJpZGdlJworICogd2hpY2ggaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSAnc3RydWN0IHBjaV9jb250cm9sbGVyLmJ1cycKKyAqIChyb290IGJ1cykgLSBpdCBleHBlY3RzIC5yZWxlYXNlX2RhdGEgdG8gaG9sZCBhIHBvaW50ZXIKKyAqIHRvICdzdHJ1Y3QgcGNpX2NvbnRyb2xsZXInLgorICoKKyAqIEluIG9yZGVyIHRvIHVzZSBpdCwgcmVnaXN0ZXIgLnJlbGVhc2VfZm4oKS9yZWxlYXNlX2RhdGEKKyAqIGxpa2UgdGhpczoKKyAqCisgKiBwY2lfc2V0X2hvc3RfYnJpZGdlX3JlbGVhc2UoYnJpZGdlLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaWJpb3NfZnJlZV9jb250cm9sbGVyX2RlZmVycmVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgcGhiKTsKKyAqCisgKiBlLmcuIGluIHRoZSBwY2liaW9zX3Jvb3RfYnJpZGdlX3ByZXBhcmUoKSBjYWxsYmFjayBmcm9tCisgKiBwY2lfY3JlYXRlX3Jvb3RfYnVzKCkuCisgKi8KK3ZvaWQgcGNpYmlvc19mcmVlX2NvbnRyb2xsZXJfZGVmZXJyZWQoc3RydWN0IHBjaV9ob3N0X2JyaWRnZSAqYnJpZGdlKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiID0gKHN0cnVjdCBwY2lfY29udHJvbGxlciAqKQorCQkJCQkgYnJpZGdlLT5yZWxlYXNlX2RhdGE7CisKKwlwcl9kZWJ1ZygiZG9tYWluICVkLCBkeW5hbWljICVkXG4iLCBwaGItPmdsb2JhbF9udW1iZXIsIHBoYi0+aXNfZHluYW1pYyk7CisKKwlwY2liaW9zX2ZyZWVfY29udHJvbGxlcihwaGIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpYmlvc19mcmVlX2NvbnRyb2xsZXJfZGVmZXJyZWQpOworCisvKgogICogVGhlIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBtaW5pbWFsIGFsaWdubWVudAogICogZm9yIG1lbW9yeSBvciBJL08gd2luZG93cyBvZiB0aGUgYXNzb2NpYXRlZCBQMlAgYnJpZGdlLgogICogQnkgZGVmYXVsdCwgNEtpQiBhbGlnbm1lbnQgZm9yIEkvTyB3aW5kb3dzIGFuZCAxTWlCIGZvcgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMKaW5kZXggNGU3NGZjNS4uZDNlZmY5OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jCkBAIC02OTUsNyArNjk1LDcgQEAKIAlPVjRfTUlOX0VOVF9DQVAsCQkvKiBtaW5pbXVtIFZQIGVudGl0bGVkIGNhcGFjaXR5ICovCiAKIAkvKiBvcHRpb24gdmVjdG9yIDU6IFBBUFIvT0Ygb3B0aW9ucyAqLwotCVZFQ1RPUl9MRU5HVEgoMTgpLAkJLyogbGVuZ3RoICovCisJVkVDVE9SX0xFTkdUSCgyMSksCQkvKiBsZW5ndGggKi8KIAkwLAkJCQkvKiBkb24ndCBpZ25vcmUsIGRvbid0IGhhbHQgKi8KIAlPVjVfRkVBVChPVjVfTFBBUikgfCBPVjVfRkVBVChPVjVfU1BMUEFSKSB8IE9WNV9GRUFUKE9WNV9MQVJHRV9QQUdFUykgfAogCU9WNV9GRUFUKE9WNV9EUkNPTkZfTUVNT1JZKSB8IE9WNV9GRUFUKE9WNV9ET05BVEVfREVESUNBVEVfQ1BVKSB8CkBAIC03MjYsOCArNzI2LDExIEBACiAJMCwKIAkwLAogCU9WNV9GRUFUKE9WNV9QRk9fSFdfUk5HKSB8IE9WNV9GRUFUKE9WNV9QRk9fSFdfRU5DUikgfAotCU9WNV9GRUFUKE9WNV9QRk9fSFdfODQyKSwKLQlPVjVfRkVBVChPVjVfU1VCX1BST0NFU1NPUlMpLAorCU9WNV9GRUFUKE9WNV9QRk9fSFdfODQyKSwJCQkJLyogQnl0ZSAxNyAqLworCTAsCQkJCQkJCS8qIEJ5dGUgMTggKi8KKwkwLAkJCQkJCQkvKiBCeXRlIDE5ICovCisJMCwJCQkJCQkJLyogQnl0ZSAyMCAqLworCU9WNV9GRUFUKE9WNV9TVUJfUFJPQ0VTU09SUyksCQkJCS8qIEJ5dGUgMjEgKi8KIAogCS8qIG9wdGlvbiB2ZWN0b3IgNjogSUJNIFBBUFIgaGludHMgKi8KIAlWRUNUT1JfTEVOR1RIKDMpLAkJLyogbGVuZ3RoICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF8zMi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfMzIuYwppbmRleCBiNmFhMzc4Li5hN2RhZjc0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzMyLmMKQEAgLTEyMjYsNyArMTIyNiwyMSBAQAogCQkocmVncy0+Z3ByWzFdICsgX19TSUdOQUxfRlJBTUVTSVpFICsgMTYpOwogCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBydF9zZiwgc2l6ZW9mKCpydF9zZikpKQogCQlnb3RvIGJhZDsKKwogI2lmZGVmIENPTkZJR19QUENfVFJBTlNBQ1RJT05BTF9NRU0KKwkvKgorCSAqIElmIHRoZXJlIGlzIGEgdHJhbnNhY3Rpb25hbCBzdGF0ZSB0aGVuIHRocm93IGl0IGF3YXkuCisJICogVGhlIHB1cnBvc2Ugb2YgYSBzaWdyZXR1cm4gaXMgdG8gZGVzdHJveSBhbGwgdHJhY2VzIG9mIHRoZQorCSAqIHNpZ25hbCBmcmFtZSwgdGhpcyBpbmNsdWRlcyBhbnkgdHJhbnNhY3Rpb25hbCBzdGF0ZSBjcmVhdGVkCisJICogd2l0aGluIGluLiBXZSBvbmx5IGNoZWNrIGZvciBzdXNwZW5kZWQgYXMgd2UgY2FuIG5ldmVyIGJlCisJICogYWN0aXZlIGluIHRoZSBrZXJuZWwsIHdlIGFyZSBhY3RpdmUsIHRoZXJlIGlzIG5vdGhpbmcgYmV0dGVyIHRvCisJICogZG8gdGhhbiBnbyBhaGVhZCBhbmQgQmFkIFRoaW5nIGxhdGVyLgorCSAqIFRoZSBjYXVzZSBpcyBub3QgaW1wb3J0YW50IGFzIHRoZXJlIHdpbGwgbmV2ZXIgYmUgYQorCSAqIHJlY2hlY2twb2ludCBzbyBpdCdzIG5vdCB1c2VyIHZpc2libGUuCisJICovCisJaWYgKE1TUl9UTV9TVVNQRU5ERUQobWZtc3IoKSkpCisJCXRtX3JlY2xhaW1fY3VycmVudCgwKTsKKwogCWlmIChfX2dldF91c2VyKHRtcCwgJnJ0X3NmLT51Yy51Y19saW5rKSkKIAkJZ290byBiYWQ7CiAJdWNfdHJhbnNhY3QgPSAoc3RydWN0IHVjb250ZXh0IF9fdXNlciAqKSh1aW50cHRyX3QpdG1wOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzY0LmMKaW5kZXggN2U0OTk4NC4uNzA0MDliYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF82NC5jCkBAIC02NzYsNyArNjc2LDIxIEBACiAJaWYgKF9fY29weV9mcm9tX3VzZXIoJnNldCwgJnVjLT51Y19zaWdtYXNrLCBzaXplb2Yoc2V0KSkpCiAJCWdvdG8gYmFkZnJhbWU7CiAJc2V0X2N1cnJlbnRfYmxvY2tlZCgmc2V0KTsKKwogI2lmZGVmIENPTkZJR19QUENfVFJBTlNBQ1RJT05BTF9NRU0KKwkvKgorCSAqIElmIHRoZXJlIGlzIGEgdHJhbnNhY3Rpb25hbCBzdGF0ZSB0aGVuIHRocm93IGl0IGF3YXkuCisJICogVGhlIHB1cnBvc2Ugb2YgYSBzaWdyZXR1cm4gaXMgdG8gZGVzdHJveSBhbGwgdHJhY2VzIG9mIHRoZQorCSAqIHNpZ25hbCBmcmFtZSwgdGhpcyBpbmNsdWRlcyBhbnkgdHJhbnNhY3Rpb25hbCBzdGF0ZSBjcmVhdGVkCisJICogd2l0aGluIGluLiBXZSBvbmx5IGNoZWNrIGZvciBzdXNwZW5kZWQgYXMgd2UgY2FuIG5ldmVyIGJlCisJICogYWN0aXZlIGluIHRoZSBrZXJuZWwsIHdlIGFyZSBhY3RpdmUsIHRoZXJlIGlzIG5vdGhpbmcgYmV0dGVyIHRvCisJICogZG8gdGhhbiBnbyBhaGVhZCBhbmQgQmFkIFRoaW5nIGxhdGVyLgorCSAqIFRoZSBjYXVzZSBpcyBub3QgaW1wb3J0YW50IGFzIHRoZXJlIHdpbGwgbmV2ZXIgYmUgYQorCSAqIHJlY2hlY2twb2ludCBzbyBpdCdzIG5vdCB1c2VyIHZpc2libGUuCisJICovCisJaWYgKE1TUl9UTV9TVVNQRU5ERUQobWZtc3IoKSkpCisJCXRtX3JlY2xhaW1fY3VycmVudCgwKTsKKwogCWlmIChfX2dldF91c2VyKG1zciwgJnVjLT51Y19tY29udGV4dC5ncF9yZWdzW1BUX01TUl0pKQogCQlnb3RvIGJhZGZyYW1lOwogCWlmIChNU1JfVE1fQUNUSVZFKG1zcikpIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jCmluZGV4IDI1YTM5MDUuLjljNmYzZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYwpAQCAtODMwLDcgKzgzMCw3IEBACiAKIAkvKiBVcGRhdGUgc2libGluZyBtYXBzICovCiAJYmFzZSA9IGNwdV9maXJzdF90aHJlYWRfc2libGluZyhjcHUpOwotCWZvciAoaSA9IDA7IGkgPCB0aHJlYWRzX3Blcl9jb3JlOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgdGhyZWFkc19wZXJfY29yZSAmJiBiYXNlICsgaSA8IG5yX2NwdV9pZHM7IGkrKykgewogCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsIGNwdV9zaWJsaW5nX21hc2soYmFzZSArIGkpKTsKIAkJY3B1bWFza19jbGVhcl9jcHUoYmFzZSArIGksIGNwdV9zaWJsaW5nX21hc2soY3B1KSk7CiAJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgY3B1X2NvcmVfbWFzayhiYXNlICsgaSkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCmluZGV4IDJjYjU4OTIuLjYyODU5ZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKQEAgLTI1LDcgKzI1LDggQEAKICNpbmNsdWRlIDxsaW51eC91c2VyLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGFibGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JLyogcHJpbnRfbW9kdWxlcyAqLwogI2luY2x1ZGUgPGxpbnV4L3ByY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL0tjb25maWcgYi9hcmNoL3Bvd2VycGMva3ZtL0tjb25maWcKaW5kZXggYzIwMjRhYy4uMDI5YmUyNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vS2NvbmZpZwpAQCAtMjIsNiArMjIsOSBAQAogCXNlbGVjdCBBTk9OX0lOT0RFUwogCXNlbGVjdCBIQVZFX0tWTV9FVkVOVEZECiAJc2VsZWN0IFNSQ1UKKwlzZWxlY3QgS1ZNX1ZGSU8KKwlzZWxlY3QgSVJRX0JZUEFTU19NQU5BR0VSCisJc2VsZWN0IEhBVkVfS1ZNX0lSUV9CWVBBU1MKIAogY29uZmlnIEtWTV9CT09LM1NfSEFORExFUgogCWJvb2wKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMva3ZtL01ha2VmaWxlCmluZGV4IDFmOWU1NTIuLjdkZDg5YjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9NYWtlZmlsZQpAQCAtNywxNiArNywxNiBAQAogY2NmbGFncy15IDo9IC1JdmlydC9rdm0gLUlhcmNoL3Bvd2VycGMva3ZtCiBLVk0gOj0gLi4vLi4vLi4vdmlydC9rdm0KIAotY29tbW9uLW9ianMteSA9ICQoS1ZNKS9rdm1fbWFpbi5vICQoS1ZNKS9jb2FsZXNjZWRfbW1pby5vIFwKLQkJJChLVk0pL2V2ZW50ZmQubworY29tbW9uLW9ianMteSA9ICQoS1ZNKS9rdm1fbWFpbi5vICQoS1ZNKS9ldmVudGZkLm8KIGNvbW1vbi1vYmpzLSQoQ09ORklHX0tWTV9WRklPKSArPSAkKEtWTSkvdmZpby5vCitjb21tb24tb2Jqcy0kKENPTkZJR19LVk1fTU1JTykgKz0gJChLVk0pL2NvYWxlc2NlZF9tbWlvLm8KIAogQ0ZMQUdTX2U1MDBfbW11Lm8gOj0gLUkuCiBDRkxBR1NfZTUwMF9tbXVfaG9zdC5vIDo9IC1JLgogQ0ZMQUdTX2VtdWxhdGUubyAgOj0gLUkuCiBDRkxBR1NfZW11bGF0ZV9sb2Fkc3RvcmUubyAgOj0gLUkuCiAKLWNvbW1vbi1vYmpzLXkgKz0gcG93ZXJwYy5vIGVtdWxhdGUubyBlbXVsYXRlX2xvYWRzdG9yZS5vCitjb21tb24tb2Jqcy15ICs9IHBvd2VycGMubyBlbXVsYXRlX2xvYWRzdG9yZS5vCiBvYmotJChDT05GSUdfS1ZNX0VYSVRfVElNSU5HKSArPSB0aW1pbmcubwogb2JqLSQoQ09ORklHX0tWTV9CT09LM1NfSEFORExFUikgKz0gYm9vazNzX2V4cG9ydHMubwogCkBAIC0yNCw2ICsyNCw3IEBACiAKIGt2bS1lNTAwLW9ianMgOj0gXAogCSQoY29tbW9uLW9ianMteSkgXAorCWVtdWxhdGUubyBcCiAJYm9va2UubyBcCiAJYm9va2VfZW11bGF0ZS5vIFwKIAlib29rZV9pbnRlcnJ1cHRzLm8gXApAQCAtMzUsNiArMzYsNyBAQAogCiBrdm0tZTUwMG1jLW9ianMgOj0gXAogCSQoY29tbW9uLW9ianMteSkgXAorCWVtdWxhdGUubyBcCiAJYm9va2UubyBcCiAJYm9va2VfZW11bGF0ZS5vIFwKIAlib29rZWh2X2ludGVycnVwdHMubyBcCkBAIC02MSw5ICs2Myw2IEBACiAJYm9vazNzXzMyX21tdS5vCiAKIGlmZGVmIENPTkZJR19LVk1fQk9PSzNTX1BSX1BPU1NJQkxFCi1rdm0tYm9vazNzXzY0LW1vZHVsZS1vYmpzIDo9IFwKLQkkKEtWTSkvY29hbGVzY2VkX21taW8ubwotCiBrdm0tYm9vazNzXzY0LWJ1aWx0aW4tb2Jqcy0kKENPTkZJR19LVk1fQk9PSzNTXzY0X0hBTkRMRVIpICs9IFwKIAlib29rM3Nfcm1oYW5kbGVycy5vCiBlbmRpZgpAQCAtNzgsNiArNzcsNyBAQAogCiBpZmRlZiBDT05GSUdfS1ZNX0JPT0szU19IVl9QT1NTSUJMRQoga3ZtLWJvb2szc182NC1idWlsdGluLW9ianMtJChDT05GSUdfS1ZNX0JPT0szU182NF9IQU5ETEVSKSArPSBcCisJYm9vazNzX2h2X2htaS5vIFwKIAlib29rM3NfaHZfcm1oYW5kbGVycy5vIFwKIAlib29rM3NfaHZfcm1fbW11Lm8gXAogCWJvb2szc19odl9yYXMubyBcCkBAIC04OCwxMSArODgsOCBAQAoga3ZtLWJvb2szc182NC1vYmpzLSQoQ09ORklHX0tWTV9YSUNTKSArPSBcCiAJYm9vazNzX3hpY3MubwogCi1rdm0tYm9vazNzXzY0LW1vZHVsZS1vYmpzICs9IFwKLQkkKEtWTSkva3ZtX21haW4ubyBcCi0JJChLVk0pL2V2ZW50ZmQubyBcCi0JcG93ZXJwYy5vIFwKLQllbXVsYXRlX2xvYWRzdG9yZS5vIFwKK2t2bS1ib29rM3NfNjQtbW9kdWxlLW9ianMgOj0gXAorCSQoY29tbW9uLW9ianMteSkgXAogCWJvb2szcy5vIFwKIAlib29rM3NfNjRfdmlvLm8gXAogCWJvb2szc19ydGFzLm8gXApAQCAtMTAyLDYgKzk5LDcgQEAKIAoga3ZtLWJvb2szc18zMi1vYmpzIDo9IFwKIAkkKGNvbW1vbi1vYmpzLXkpIFwKKwllbXVsYXRlLm8gXAogCWZwdS5vIFwKIAlib29rM3NfcGFpcmVkX3NpbmdsZXMubyBcCiAJYm9vazNzLm8gXApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3MuYyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzLmMKaW5kZXggNDcwMThmYy4uYjY5NTJkZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3MuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szcy5jCkBAIC01Miw4ICs1MiwxMiBAQAogCXsgImRlYyIsICAgICAgICAgVkNQVV9TVEFUKGRlY19leGl0cykgfSwKIAl7ICJleHRfaW50ciIsICAgIFZDUFVfU1RBVChleHRfaW50cl9leGl0cykgfSwKIAl7ICJxdWV1ZV9pbnRyIiwgIFZDUFVfU1RBVChxdWV1ZV9pbnRyKSB9LAorCXsgImhhbHRfcG9sbF9zdWNjZXNzX25zIiwJVkNQVV9TVEFUKGhhbHRfcG9sbF9zdWNjZXNzX25zKSB9LAorCXsgImhhbHRfcG9sbF9mYWlsX25zIiwJCVZDUFVfU1RBVChoYWx0X3BvbGxfZmFpbF9ucykgfSwKKwl7ICJoYWx0X3dhaXRfbnMiLAkJVkNQVV9TVEFUKGhhbHRfd2FpdF9ucykgfSwKIAl7ICJoYWx0X3N1Y2Nlc3NmdWxfcG9sbCIsIFZDUFVfU1RBVChoYWx0X3N1Y2Nlc3NmdWxfcG9sbCksIH0sCiAJeyAiaGFsdF9hdHRlbXB0ZWRfcG9sbCIsIFZDUFVfU1RBVChoYWx0X2F0dGVtcHRlZF9wb2xsKSwgfSwKKwl7ICJoYWx0X3N1Y2Nlc3NmdWxfd2FpdCIsCVZDUFVfU1RBVChoYWx0X3N1Y2Nlc3NmdWxfd2FpdCkgfSwKIAl7ICJoYWx0X3BvbGxfaW52YWxpZCIsIFZDUFVfU1RBVChoYWx0X3BvbGxfaW52YWxpZCkgfSwKIAl7ICJoYWx0X3dha2V1cCIsIFZDUFVfU1RBVChoYWx0X3dha2V1cCkgfSwKIAl7ICJwZl9zdG9yYWdlIiwgIFZDUFVfU1RBVChwZl9zdG9yYWdlKSB9LApAQCAtNjQsNiArNjgsOSBAQAogCXsgImxkX3Nsb3ciLCAgICAgVkNQVV9TVEFUKGxkX3Nsb3cpIH0sCiAJeyAic3QiLCAgICAgICAgICBWQ1BVX1NUQVQoc3QpIH0sCiAJeyAic3Rfc2xvdyIsICAgICBWQ1BVX1NUQVQoc3Rfc2xvdykgfSwKKwl7ICJwdGhydV9hbGwiLCAgICAgICBWQ1BVX1NUQVQocHRocnVfYWxsKSB9LAorCXsgInB0aHJ1X2hvc3QiLCAgICAgIFZDUFVfU1RBVChwdGhydV9ob3N0KSB9LAorCXsgInB0aHJ1X2JhZF9hZmYiLCAgIFZDUFVfU1RBVChwdGhydV9iYWRfYWZmKSB9LAogCXsgTlVMTCB9CiB9OwogCkBAIC01OTIsOSArNTk5LDYgQEAKIAkJY2FzZSBLVk1fUkVHX1BQQ19CRVNDUjoKIAkJCSp2YWwgPSBnZXRfcmVnX3ZhbChpZCwgdmNwdS0+YXJjaC5iZXNjcik7CiAJCQlicmVhazsKLQkJY2FzZSBLVk1fUkVHX1BQQ19WVEI6Ci0JCQkqdmFsID0gZ2V0X3JlZ192YWwoaWQsIHZjcHUtPmFyY2gudnRiKTsKLQkJCWJyZWFrOwogCQljYXNlIEtWTV9SRUdfUFBDX0lDOgogCQkJKnZhbCA9IGdldF9yZWdfdmFsKGlkLCB2Y3B1LT5hcmNoLmljKTsKIAkJCWJyZWFrOwpAQCAtNjY2LDkgKzY3MCw2IEBACiAJCWNhc2UgS1ZNX1JFR19QUENfQkVTQ1I6CiAJCQl2Y3B1LT5hcmNoLmJlc2NyID0gc2V0X3JlZ192YWwoaWQsICp2YWwpOwogCQkJYnJlYWs7Ci0JCWNhc2UgS1ZNX1JFR19QUENfVlRCOgotCQkJdmNwdS0+YXJjaC52dGIgPSBzZXRfcmVnX3ZhbChpZCwgKnZhbCk7Ci0JCQlicmVhazsKIAkJY2FzZSBLVk1fUkVHX1BQQ19JQzoKIAkJCXZjcHUtPmFyY2guaWMgPSBzZXRfcmVnX3ZhbChpZCwgKnZhbCk7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2VtdWxhdGUuYyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2VtdWxhdGUuYwppbmRleCAyYWZkYjljLi44MzU5NzUyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19lbXVsYXRlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfZW11bGF0ZS5jCkBAIC00OTgsNiArNDk4LDcgQEAKIAljYXNlIFNQUk5fTU1DUjA6CiAJY2FzZSBTUFJOX01NQ1IxOgogCWNhc2UgU1BSTl9NTUNSMjoKKwljYXNlIFNQUk5fVU1NQ1IyOgogI2VuZGlmCiAJCWJyZWFrOwogdW5wcml2aWxlZ2VkOgpAQCAtNTc5LDcgKzU4MCw3IEBACiAJCSpzcHJfdmFsID0gdmNwdS0+YXJjaC5zcHVycjsKIAkJYnJlYWs7CiAJY2FzZSBTUFJOX1ZUQjoKLQkJKnNwcl92YWwgPSB2Y3B1LT5hcmNoLnZ0YjsKKwkJKnNwcl92YWwgPSB0b19ib29rM3ModmNwdSktPnZ0YjsKIAkJYnJlYWs7CiAJY2FzZSBTUFJOX0lDOgogCQkqc3ByX3ZhbCA9IHZjcHUtPmFyY2guaWM7CkBAIC02NDAsNiArNjQxLDcgQEAKIAljYXNlIFNQUk5fTU1DUjA6CiAJY2FzZSBTUFJOX01NQ1IxOgogCWNhc2UgU1BSTl9NTUNSMjoKKwljYXNlIFNQUk5fVU1NQ1IyOgogCWNhc2UgU1BSTl9USVI6CiAjZW5kaWYKIAkJKnNwcl92YWwgPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHYuYyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2LmMKaW5kZXggMmZkNTU4MC4uMzY4NjQ3MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHYuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odi5jCkBAIC01MywxMSArNTMsMTUgQEAKICNpbmNsdWRlIDxhc20vc21wLmg+CiAjaW5jbHVkZSA8YXNtL2RiZWxsLmg+CiAjaW5jbHVkZSA8YXNtL2htaS5oPgorI2luY2x1ZGUgPGFzbS9wbnYtcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CisjaW5jbHVkZSA8bGludXgva3ZtX2lycWZkLmg+CisjaW5jbHVkZSA8bGludXgvaXJxYnlwYXNzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KIAogI2luY2x1ZGUgImJvb2szcy5oIgogCkBAIC03MCw2ICs3NCw4IEBACiAKIC8qIFVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIGd1ZXN0IHBhZ2UgZmF1bHQgbmVlZHMgdG8gYmUgaGFuZGxlZCAqLwogI2RlZmluZSBSRVNVTUVfUEFHRV9GQVVMVAkoUkVTVU1FX0dVRVNUIHwgUkVTVU1FX0ZMQUdfQVJDSDEpCisvKiBVc2VkIHRvIGluZGljYXRlIHRoYXQgYSBndWVzdCBwYXNzdGhyb3VnaCBpbnRlcnJ1cHQgbmVlZHMgdG8gYmUgaGFuZGxlZCAqLworI2RlZmluZSBSRVNVTUVfUEFTU1RIUk9VR0gJKFJFU1VNRV9HVUVTVCB8IFJFU1VNRV9GTEFHX0FSQ0gyKQogCiAvKiBVc2VkIGFzIGEgIm51bGwiIHZhbHVlIGZvciB0aW1lYmFzZSB2YWx1ZXMgKi8KICNkZWZpbmUgVEJfTklMCSh+KHU2NCkwKQpAQCAtODksMTQgKzk1LDU1IEBACiAJLmdldCA9IHBhcmFtX2dldF9pbnQsCiB9OwogCittb2R1bGVfcGFyYW1fY2Ioa3ZtX2lycV9ieXBhc3MsICZtb2R1bGVfcGFyYW1fb3BzLCAma3ZtX2lycV9ieXBhc3MsCisJCQkJCQkJU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhrdm1faXJxX2J5cGFzcywgIkJ5cGFzcyBwYXNzdGhyb3VnaCBpbnRlcnJ1cHQgb3B0aW1pemF0aW9uIik7CisKIG1vZHVsZV9wYXJhbV9jYihoX2lwaV9yZWRpcmVjdCwgJm1vZHVsZV9wYXJhbV9vcHMsICZoX2lwaV9yZWRpcmVjdCwKIAkJCQkJCQlTX0lSVUdPIHwgU19JV1VTUik7CiBNT0RVTEVfUEFSTV9ERVNDKGhfaXBpX3JlZGlyZWN0LCAiUmVkaXJlY3QgSF9JUEkgd2FrZXVwIHRvIGEgZnJlZSBob3N0IGNvcmUiKTsKICNlbmRpZgogCisvKiBNYXhpbXVtIGhhbHQgcG9sbCBpbnRlcnZhbCBkZWZhdWx0cyB0byBLVk1fSEFMVF9QT0xMX05TX0RFRkFVTFQgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaGFsdF9wb2xsX21heF9ucyA9IEtWTV9IQUxUX1BPTExfTlNfREVGQVVMVDsKK21vZHVsZV9wYXJhbShoYWx0X3BvbGxfbWF4X25zLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGhhbHRfcG9sbF9tYXhfbnMsICJNYXhpbXVtIGhhbHQgcG9sbCB0aW1lIGluIG5zIik7CisKKy8qIEZhY3RvciBieSB3aGljaCB0aGUgdmNvcmUgaGFsdCBwb2xsIGludGVydmFsIGlzIGdyb3duLCBkZWZhdWx0IGlzIHRvIGRvdWJsZQorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGhhbHRfcG9sbF9uc19ncm93ID0gMjsKK21vZHVsZV9wYXJhbShoYWx0X3BvbGxfbnNfZ3JvdywgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoaGFsdF9wb2xsX25zX2dyb3csICJGYWN0b3IgaGFsdCBwb2xsIHRpbWUgaXMgZ3Jvd24gYnkiKTsKKworLyogRmFjdG9yIGJ5IHdoaWNoIHRoZSB2Y29yZSBoYWx0IHBvbGwgaW50ZXJ2YWwgaXMgc2hydW5rLCBkZWZhdWx0IGlzIHRvIHJlc2V0CisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaGFsdF9wb2xsX25zX3NocmluazsKK21vZHVsZV9wYXJhbShoYWx0X3BvbGxfbnNfc2hyaW5rLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhoYWx0X3BvbGxfbnNfc2hyaW5rLCAiRmFjdG9yIGhhbHQgcG9sbCB0aW1lIGlzIHNocnVuayBieSIpOworCiBzdGF0aWMgdm9pZCBrdm1wcGNfZW5kX2NlZGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIHN0YXRpYyBpbnQga3ZtcHBjX2h2X3NldHVwX2h0YWJfcm1hKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGt2bV92Y3B1ICpuZXh0X3J1bm5hYmxlX3RocmVhZChzdHJ1Y3Qga3ZtcHBjX3Zjb3JlICp2YywKKwkJaW50ICppcCkKK3sKKwlpbnQgaSA9ICppcDsKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHU7CisKKwl3aGlsZSAoKytpIDwgTUFYX1NNVF9USFJFQURTKSB7CisJCXZjcHUgPSBSRUFEX09OQ0UodmMtPnJ1bm5hYmxlX3RocmVhZHNbaV0pOworCQlpZiAodmNwdSkgeworCQkJKmlwID0gaTsKKwkJCXJldHVybiB2Y3B1OworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBVc2VkIHRvIHRyYXZlcnNlIHRoZSBsaXN0IG9mIHJ1bm5hYmxlIHRocmVhZHMgZm9yIGEgZ2l2ZW4gdmNvcmUgKi8KKyNkZWZpbmUgZm9yX2VhY2hfcnVubmFibGVfdGhyZWFkKGksIHZjcHUsIHZjKSBcCisJZm9yIChpID0gLTE7ICh2Y3B1ID0gbmV4dF9ydW5uYWJsZV90aHJlYWQodmMsICZpKSk7ICkKKwogc3RhdGljIGJvb2wga3ZtcHBjX2lwaV90aHJlYWQoaW50IGNwdSkKIHsKIAkvKiBPbiBQT1dFUjggZm9yIElQSXMgdG8gdGhyZWFkcyBpbiB0aGUgc2FtZSBjb3JlLCB1c2UgbXNnc25kICovCkBAIC05OTEsNiArMTAzOCw5IEBACiAJCWt2bXBwY19jb3JlX3F1ZXVlX3Byb2dyYW0odmNwdSwgU1JSMV9QUk9HSUxMKTsKIAkJciA9IFJFU1VNRV9HVUVTVDsKIAkJYnJlYWs7CisJY2FzZSBCT09LM1NfSU5URVJSVVBUX0hWX1JNX0hBUkQ6CisJCXIgPSBSRVNVTUVfUEFTU1RIUk9VR0g7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWt2bXBwY19kdW1wX3JlZ3ModmNwdSk7CiAJCXByaW50ayhLRVJOX0VNRVJHICJ0cmFwPTB4JXggfCBwYz0weCVseCB8IG1zcj0weCVsbHhcbiIsCkBAIC0xMTQ5LDYgKzExOTksOSBAQAogCWNhc2UgS1ZNX1JFR19QUENfRFBERVM6CiAJCSp2YWwgPSBnZXRfcmVnX3ZhbChpZCwgdmNwdS0+YXJjaC52Y29yZS0+ZHBkZXMpOwogCQlicmVhazsKKwljYXNlIEtWTV9SRUdfUFBDX1ZUQjoKKwkJKnZhbCA9IGdldF9yZWdfdmFsKGlkLCB2Y3B1LT5hcmNoLnZjb3JlLT52dGIpOworCQlicmVhazsKIAljYXNlIEtWTV9SRUdfUFBDX0RBV1I6CiAJCSp2YWwgPSBnZXRfcmVnX3ZhbChpZCwgdmNwdS0+YXJjaC5kYXdyKTsKIAkJYnJlYWs7CkBAIC0xMzQxLDYgKzEzOTQsOSBAQAogCWNhc2UgS1ZNX1JFR19QUENfRFBERVM6CiAJCXZjcHUtPmFyY2gudmNvcmUtPmRwZGVzID0gc2V0X3JlZ192YWwoaWQsICp2YWwpOwogCQlicmVhazsKKwljYXNlIEtWTV9SRUdfUFBDX1ZUQjoKKwkJdmNwdS0+YXJjaC52Y29yZS0+dnRiID0gc2V0X3JlZ192YWwoaWQsICp2YWwpOworCQlicmVhazsKIAljYXNlIEtWTV9SRUdfUFBDX0RBV1I6CiAJCXZjcHUtPmFyY2guZGF3ciA9IHNldF9yZWdfdmFsKGlkLCAqdmFsKTsKIAkJYnJlYWs7CkBAIC0xNDkzLDcgKzE1NDksNiBAQAogCWlmICh2Y29yZSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCUlOSVRfTElTVF9IRUFEKCZ2Y29yZS0+cnVubmFibGVfdGhyZWFkcyk7CiAJc3Bpbl9sb2NrX2luaXQoJnZjb3JlLT5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmdmNvcmUtPnN0b2x0Yl9sb2NrKTsKIAlpbml0X3N3YWl0X3F1ZXVlX2hlYWQoJnZjb3JlLT53cSk7CkBAIC0xODAyLDcgKzE4NTcsNyBAQAogCXZjcHUtPmFyY2guc3RhdGUgPSBLVk1QUENfVkNQVV9CVVNZX0lOX0hPU1Q7CiAJc3Bpbl91bmxvY2tfaXJxKCZ2Y3B1LT5hcmNoLnRiYWNjdF9sb2NrKTsKIAktLXZjLT5uX3J1bm5hYmxlOwotCWxpc3RfZGVsKCZ2Y3B1LT5hcmNoLnJ1bl9saXN0KTsKKwlXUklURV9PTkNFKHZjLT5ydW5uYWJsZV90aHJlYWRzW3ZjcHUtPmFyY2gucHRpZF0sIE5VTEwpOwogfQogCiBzdGF0aWMgaW50IGt2bXBwY19ncmFiX2h3dGhyZWFkKGludCBjcHUpCkBAIC0yMDQ4LDY2ICsyMTAzLDYgQEAKIAl2Yy0+Y29uZmVycmluZ190aHJlYWRzID0gMDsKIH0KIAotLyoKLSAqIFNlZSBpZiB0aGUgZXhpc3Rpbmcgc3ViY29yZXMgY2FuIGJlIHNwbGl0IGludG8gMyAob3IgZmV3ZXIpIHN1YmNvcmVzCi0gKiBvZiBhdCBtb3N0IHR3byB0aHJlYWRzIGVhY2gsIHNvIHdlIGNhbiBmaXQgaW4gYW5vdGhlciB2Y29yZS4gIFRoaXMKLSAqIGFzc3VtZXMgdGhlcmUgYXJlIGF0IG1vc3QgdHdvIHN1YmNvcmVzIGFuZCBhdCBtb3N0IDYgdGhyZWFkcyBpbiB0b3RhbC4KLSAqLwotc3RhdGljIGJvb2wgY2FuX3NwbGl0X3BpZ2d5YmFja2VkX3N1YmNvcmVzKHN0cnVjdCBjb3JlX2luZm8gKmNpcCkKLXsKLQlpbnQgc3ViLCBuZXdfc3ViOwotCWludCBsYXJnZV9zdWIgPSAtMTsKLQlpbnQgdGhyOwotCWludCBuX3N1YmNvcmVzID0gY2lwLT5uX3N1YmNvcmVzOwotCXN0cnVjdCBrdm1wcGNfdmNvcmUgKnZjLCAqdmNuZXh0OwotCXN0cnVjdCBrdm1wcGNfdmNvcmUgKm1hc3Rlcl92YyA9IE5VTEw7Ci0KLQlmb3IgKHN1YiA9IDA7IHN1YiA8IGNpcC0+bl9zdWJjb3JlczsgKytzdWIpIHsKLQkJaWYgKGNpcC0+c3ViY29yZV90aHJlYWRzW3N1Yl0gPD0gMikKLQkJCWNvbnRpbnVlOwotCQlpZiAobGFyZ2Vfc3ViID49IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWxhcmdlX3N1YiA9IHN1YjsKLQkJdmMgPSBsaXN0X2ZpcnN0X2VudHJ5KCZjaXAtPnZjc1tzdWJdLCBzdHJ1Y3Qga3ZtcHBjX3Zjb3JlLAotCQkJCSAgICAgIHByZWVtcHRfbGlzdCk7Ci0JCWlmICh2Yy0+bnVtX3RocmVhZHMgPiAyKQotCQkJcmV0dXJuIGZhbHNlOwotCQluX3N1YmNvcmVzICs9IChjaXAtPnN1YmNvcmVfdGhyZWFkc1tzdWJdIC0gMSkgPj4gMTsKLQl9Ci0JaWYgKGxhcmdlX3N1YiA8IDAgfHwgIXN1YmNvcmVfY29uZmlnX29rKG5fc3ViY29yZXMgKyAxLCAyKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JLyoKLQkgKiBTZWVtcyBmZWFzaWJsZSwgc28gZ28gdGhyb3VnaCBhbmQgbW92ZSB2Y29yZXMgdG8gbmV3IHN1YmNvcmVzLgotCSAqIE5vdGUgdGhhdCB3aGVuIHdlIGhhdmUgdHdvIG9yIG1vcmUgdmNvcmVzIGluIG9uZSBzdWJjb3JlLAotCSAqIGFsbCB0aG9zZSB2Y29yZXMgbXVzdCBoYXZlIG9ubHkgb25lIHRocmVhZCBlYWNoLgotCSAqLwotCW5ld19zdWIgPSBjaXAtPm5fc3ViY29yZXM7Ci0JdGhyID0gMDsKLQlzdWIgPSBsYXJnZV9zdWI7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZjLCB2Y25leHQsICZjaXAtPnZjc1tzdWJdLCBwcmVlbXB0X2xpc3QpIHsKLQkJaWYgKHRociA+PSAyKSB7Ci0JCQlsaXN0X2RlbCgmdmMtPnByZWVtcHRfbGlzdCk7Ci0JCQlsaXN0X2FkZF90YWlsKCZ2Yy0+cHJlZW1wdF9saXN0LCAmY2lwLT52Y3NbbmV3X3N1Yl0pOwotCQkJLyogdmMtPm51bV90aHJlYWRzIG11c3QgYmUgMSAqLwotCQkJaWYgKCsrY2lwLT5zdWJjb3JlX3RocmVhZHNbbmV3X3N1Yl0gPT0gMSkgewotCQkJCWNpcC0+c3ViY29yZV92bVtuZXdfc3ViXSA9IHZjLT5rdm07Ci0JCQkJaW5pdF9tYXN0ZXJfdmNvcmUodmMpOwotCQkJCW1hc3Rlcl92YyA9IHZjOwotCQkJCSsrY2lwLT5uX3N1YmNvcmVzOwotCQkJfSBlbHNlIHsKLQkJCQl2Yy0+bWFzdGVyX3Zjb3JlID0gbWFzdGVyX3ZjOwotCQkJCSsrbmV3X3N1YjsKLQkJCX0KLQkJfQotCQl0aHIgKz0gdmMtPm51bV90aHJlYWRzOwotCX0KLQljaXAtPnN1YmNvcmVfdGhyZWFkc1tsYXJnZV9zdWJdID0gMjsKLQljaXAtPm1heF9zdWJjb3JlX3RocmVhZHMgPSAyOwotCi0JcmV0dXJuIHRydWU7Ci19Ci0KIHN0YXRpYyBib29sIGNhbl9keW5hbWljX3NwbGl0KHN0cnVjdCBrdm1wcGNfdmNvcmUgKnZjLCBzdHJ1Y3QgY29yZV9pbmZvICpjaXApCiB7CiAJaW50IG5fdGhyZWFkcyA9IHZjLT5udW1fdGhyZWFkczsKQEAgLTIxMTgsMjMgKzIxMTMsOSBAQAogCiAJaWYgKG5fdGhyZWFkcyA8IGNpcC0+bWF4X3N1YmNvcmVfdGhyZWFkcykKIAkJbl90aHJlYWRzID0gY2lwLT5tYXhfc3ViY29yZV90aHJlYWRzOwotCWlmIChzdWJjb3JlX2NvbmZpZ19vayhjaXAtPm5fc3ViY29yZXMgKyAxLCBuX3RocmVhZHMpKSB7Ci0JCWNpcC0+bWF4X3N1YmNvcmVfdGhyZWFkcyA9IG5fdGhyZWFkczsKLQl9IGVsc2UgaWYgKGNpcC0+bl9zdWJjb3JlcyA8PSAyICYmIGNpcC0+dG90YWxfdGhyZWFkcyA8PSA2ICYmCi0JCSAgIHZjLT5udW1fdGhyZWFkcyA8PSAyKSB7Ci0JCS8qCi0JCSAqIFdlIG1heSBiZSBhYmxlIHRvIGZpdCBhbm90aGVyIHN1YmNvcmUgaW4gYnkKLQkJICogc3BsaXR0aW5nIGFuIGV4aXN0aW5nIHN1YmNvcmUgd2l0aCAzIG9yIDQKLQkJICogdGhyZWFkcyBpbnRvIHR3byAyLXRocmVhZCBzdWJjb3Jlcywgb3Igb25lCi0JCSAqIHdpdGggNSBvciA2IHRocmVhZHMgaW50byB0aHJlZSBzdWJjb3Jlcy4KLQkJICogV2UgY2FuIG9ubHkgZG8gdGhpcyBpZiB0aG9zZSBzdWJjb3JlcyBoYXZlCi0JCSAqIHBpZ2d5YmFja2VkIHZpcnR1YWwgY29yZXMuCi0JCSAqLwotCQlpZiAoIWNhbl9zcGxpdF9waWdneWJhY2tlZF9zdWJjb3JlcyhjaXApKQotCQkJcmV0dXJuIGZhbHNlOwotCX0gZWxzZSB7CisJaWYgKCFzdWJjb3JlX2NvbmZpZ19vayhjaXAtPm5fc3ViY29yZXMgKyAxLCBuX3RocmVhZHMpKQogCQlyZXR1cm4gZmFsc2U7Ci0JfQorCWNpcC0+bWF4X3N1YmNvcmVfdGhyZWFkcyA9IG5fdGhyZWFkczsKIAogCXN1YiA9IGNpcC0+bl9zdWJjb3JlczsKIAkrK2NpcC0+bl9zdWJjb3JlczsKQEAgLTIxNDgsNDMgKzIxMjksNiBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgYm9vbCBjYW5fcGlnZ3liYWNrX3N1YmNvcmUoc3RydWN0IGt2bXBwY192Y29yZSAqcHZjLAotCQkJCSAgc3RydWN0IGNvcmVfaW5mbyAqY2lwLCBpbnQgc3ViKQotewotCXN0cnVjdCBrdm1wcGNfdmNvcmUgKnZjOwotCWludCBuX3RocjsKLQotCXZjID0gbGlzdF9maXJzdF9lbnRyeSgmY2lwLT52Y3Nbc3ViXSwgc3RydWN0IGt2bXBwY192Y29yZSwKLQkJCSAgICAgIHByZWVtcHRfbGlzdCk7Ci0KLQkvKiByZXF1aXJlIHNhbWUgVk0gYW5kIHNhbWUgcGVyLWNvcmUgcmVnIHZhbHVlcyAqLwotCWlmIChwdmMtPmt2bSAhPSB2Yy0+a3ZtIHx8Ci0JICAgIHB2Yy0+dGJfb2Zmc2V0ICE9IHZjLT50Yl9vZmZzZXQgfHwKLQkgICAgcHZjLT5wY3IgIT0gdmMtPnBjciB8fAotCSAgICBwdmMtPmxwY3IgIT0gdmMtPmxwY3IpCi0JCXJldHVybiBmYWxzZTsKLQotCS8qIFA4IGd1ZXN0IHdpdGggPiAxIHRocmVhZCBwZXIgY29yZSB3b3VsZCBzZWUgd3JvbmcgVElSIHZhbHVlICovCi0JaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0FSQ0hfMjA3UykgJiYKLQkgICAgKHZjLT5udW1fdGhyZWFkcyA+IDEgfHwgcHZjLT5udW1fdGhyZWFkcyA+IDEpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQluX3RociA9IGNpcC0+c3ViY29yZV90aHJlYWRzW3N1Yl0gKyBwdmMtPm51bV90aHJlYWRzOwotCWlmIChuX3RociA+IGNpcC0+bWF4X3N1YmNvcmVfdGhyZWFkcykgewotCQlpZiAoIXN1YmNvcmVfY29uZmlnX29rKGNpcC0+bl9zdWJjb3Jlcywgbl90aHIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQljaXAtPm1heF9zdWJjb3JlX3RocmVhZHMgPSBuX3RocjsKLQl9Ci0KLQljaXAtPnRvdGFsX3RocmVhZHMgKz0gcHZjLT5udW1fdGhyZWFkczsKLQljaXAtPnN1YmNvcmVfdGhyZWFkc1tzdWJdID0gbl90aHI7Ci0JcHZjLT5tYXN0ZXJfdmNvcmUgPSB2YzsKLQlsaXN0X2RlbCgmcHZjLT5wcmVlbXB0X2xpc3QpOwotCWxpc3RfYWRkX3RhaWwoJnB2Yy0+cHJlZW1wdF9saXN0LCAmY2lwLT52Y3Nbc3ViXSk7Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQogLyoKICAqIFdvcmsgb3V0IHdoZXRoZXIgaXQgaXMgcG9zc2libGUgdG8gcGlnZ3liYWNrIHRoZSBleGVjdXRpb24gb2YKICAqIHZjb3JlICpwdmMgb250byB0aGUgZXhlY3V0aW9uIG9mIHRoZSBvdGhlciB2Y29yZXMgZGVzY3JpYmVkIGluICpjaXAuCkBAIC0yMTkyLDI3ICsyMTM2LDE4IEBACiBzdGF0aWMgYm9vbCBjYW5fcGlnZ3liYWNrKHN0cnVjdCBrdm1wcGNfdmNvcmUgKnB2Yywgc3RydWN0IGNvcmVfaW5mbyAqY2lwLAogCQkJICBpbnQgdGFyZ2V0X3RocmVhZHMpCiB7Ci0JaW50IHN1YjsKLQogCWlmIChjaXAtPnRvdGFsX3RocmVhZHMgKyBwdmMtPm51bV90aHJlYWRzID4gdGFyZ2V0X3RocmVhZHMpCiAJCXJldHVybiBmYWxzZTsKLQlmb3IgKHN1YiA9IDA7IHN1YiA8IGNpcC0+bl9zdWJjb3JlczsgKytzdWIpCi0JCWlmIChjaXAtPnN1YmNvcmVfdGhyZWFkc1tzdWJdICYmCi0JCSAgICBjYW5fcGlnZ3liYWNrX3N1YmNvcmUocHZjLCBjaXAsIHN1YikpCi0JCQlyZXR1cm4gdHJ1ZTsKIAotCWlmIChjYW5fZHluYW1pY19zcGxpdChwdmMsIGNpcCkpCi0JCXJldHVybiB0cnVlOwotCi0JcmV0dXJuIGZhbHNlOworCXJldHVybiBjYW5fZHluYW1pY19zcGxpdChwdmMsIGNpcCk7CiB9CiAKIHN0YXRpYyB2b2lkIHByZXBhcmVfdGhyZWFkcyhzdHJ1Y3Qga3ZtcHBjX3Zjb3JlICp2YykKIHsKLQlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsICp2bmV4dDsKKwlpbnQgaTsKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHU7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodmNwdSwgdm5leHQsICZ2Yy0+cnVubmFibGVfdGhyZWFkcywKLQkJCQkgYXJjaC5ydW5fbGlzdCkgeworCWZvcl9lYWNoX3J1bm5hYmxlX3RocmVhZChpLCB2Y3B1LCB2YykgewogCQlpZiAoc2lnbmFsX3BlbmRpbmcodmNwdS0+YXJjaC5ydW5fdGFzaykpCiAJCQl2Y3B1LT5hcmNoLnJldCA9IC1FSU5UUjsKIAkJZWxzZSBpZiAodmNwdS0+YXJjaC52cGEudXBkYXRlX3BlbmRpbmcgfHwKQEAgLTIyNTksMTUgKzIxOTQsMTQgQEAKIAogc3RhdGljIHZvaWQgcG9zdF9ndWVzdF9wcm9jZXNzKHN0cnVjdCBrdm1wcGNfdmNvcmUgKnZjLCBib29sIGlzX21hc3RlcikKIHsKLQlpbnQgc3RpbGxfcnVubmluZyA9IDA7CisJaW50IHN0aWxsX3J1bm5pbmcgPSAwLCBpOwogCXU2NCBub3c7CiAJbG9uZyByZXQ7Ci0Jc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCAqdm5leHQ7CisJc3RydWN0IGt2bV92Y3B1ICp2Y3B1OwogCiAJc3Bpbl9sb2NrKCZ2Yy0+bG9jayk7CiAJbm93ID0gZ2V0X3RiKCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZjcHUsIHZuZXh0LCAmdmMtPnJ1bm5hYmxlX3RocmVhZHMsCi0JCQkJIGFyY2gucnVuX2xpc3QpIHsKKwlmb3JfZWFjaF9ydW5uYWJsZV90aHJlYWQoaSwgdmNwdSwgdmMpIHsKIAkJLyogY2FuY2VsIHBlbmRpbmcgZGVjIGV4Y2VwdGlvbiBpZiBkZWMgaXMgcG9zaXRpdmUgKi8KIAkJaWYgKG5vdyA8IHZjcHUtPmFyY2guZGVjX2V4cGlyZXMgJiYKIAkJICAgIGt2bXBwY19jb3JlX3BlbmRpbmdfZGVjKHZjcHUpKQpAQCAtMjMwNyw4ICsyMjQxLDggQEAKIAkJfQogCQlpZiAodmMtPm5fcnVubmFibGUgPiAwICYmIHZjLT5ydW5uZXIgPT0gTlVMTCkgewogCQkJLyogbWFrZSBzdXJlIHRoZXJlJ3MgYSBjYW5kaWRhdGUgcnVubmVyIGF3YWtlICovCi0JCQl2Y3B1ID0gbGlzdF9maXJzdF9lbnRyeSgmdmMtPnJ1bm5hYmxlX3RocmVhZHMsCi0JCQkJCQlzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gucnVuX2xpc3QpOworCQkJaSA9IC0xOworCQkJdmNwdSA9IG5leHRfcnVubmFibGVfdGhyZWFkKHZjLCAmaSk7CiAJCQl3YWtlX3VwKCZ2Y3B1LT5hcmNoLmNwdV9ydW4pOwogCQl9CiAJfQpAQCAtMjM2MSw3ICsyMjk1LDcgQEAKICAqLwogc3RhdGljIG5vaW5saW5lIHZvaWQga3ZtcHBjX3J1bl9jb3JlKHN0cnVjdCBrdm1wcGNfdmNvcmUgKnZjKQogewotCXN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgKnZuZXh0OworCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTsKIAlpbnQgaTsKIAlpbnQgc3JjdV9pZHg7CiAJc3RydWN0IGNvcmVfaW5mbyBjb3JlX2luZm87CkBAIC0yMzk3LDggKzIzMzEsNyBAQAogCSAqLwogCWlmICgodGhyZWFkc19wZXJfY29yZSA+IDEpICYmCiAJICAgICgodmMtPm51bV90aHJlYWRzID4gdGhyZWFkc19wZXJfc3ViY29yZSkgfHwgIW9uX3ByaW1hcnlfdGhyZWFkKCkpKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2Y3B1LCB2bmV4dCwgJnZjLT5ydW5uYWJsZV90aHJlYWRzLAotCQkJCQkgYXJjaC5ydW5fbGlzdCkgeworCQlmb3JfZWFjaF9ydW5uYWJsZV90aHJlYWQoaSwgdmNwdSwgdmMpIHsKIAkJCXZjcHUtPmFyY2gucmV0ID0gLUVCVVNZOwogCQkJa3ZtcHBjX3JlbW92ZV9ydW5uYWJsZSh2YywgdmNwdSk7CiAJCQl3YWtlX3VwKCZ2Y3B1LT5hcmNoLmNwdV9ydW4pOwpAQCAtMjQ3Nyw4ICsyNDEwLDcgQEAKIAkJYWN0aXZlIHw9IDEgPDwgdGhyOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHB2YywgJmNvcmVfaW5mby52Y3Nbc3ViXSwgcHJlZW1wdF9saXN0KSB7CiAJCQlwdmMtPnBjcHUgPSBwY3B1ICsgdGhyOwotCQkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2Y3B1LCAmcHZjLT5ydW5uYWJsZV90aHJlYWRzLAotCQkJCQkgICAgYXJjaC5ydW5fbGlzdCkgeworCQkJZm9yX2VhY2hfcnVubmFibGVfdGhyZWFkKGksIHZjcHUsIHB2YykgewogCQkJCWt2bXBwY19zdGFydF90aHJlYWQodmNwdSwgcHZjKTsKIAkJCQlrdm1wcGNfY3JlYXRlX2R0bF9lbnRyeSh2Y3B1LCBwdmMpOwogCQkJCXRyYWNlX2t2bV9ndWVzdF9lbnRlcih2Y3B1KTsKQEAgLTI2MDQsMzQgKzI1MzYsOTIgQEAKIAlmaW5pc2hfd2FpdCgmdmNwdS0+YXJjaC5jcHVfcnVuLCAmd2FpdCk7CiB9CiAKK3N0YXRpYyB2b2lkIGdyb3dfaGFsdF9wb2xsX25zKHN0cnVjdCBrdm1wcGNfdmNvcmUgKnZjKQoreworCS8qIDEwdXMgYmFzZSAqLworCWlmICh2Yy0+aGFsdF9wb2xsX25zID09IDAgJiYgaGFsdF9wb2xsX25zX2dyb3cpCisJCXZjLT5oYWx0X3BvbGxfbnMgPSAxMDAwMDsKKwllbHNlCisJCXZjLT5oYWx0X3BvbGxfbnMgKj0gaGFsdF9wb2xsX25zX2dyb3c7CisKKwlpZiAodmMtPmhhbHRfcG9sbF9ucyA+IGhhbHRfcG9sbF9tYXhfbnMpCisJCXZjLT5oYWx0X3BvbGxfbnMgPSBoYWx0X3BvbGxfbWF4X25zOworfQorCitzdGF0aWMgdm9pZCBzaHJpbmtfaGFsdF9wb2xsX25zKHN0cnVjdCBrdm1wcGNfdmNvcmUgKnZjKQoreworCWlmIChoYWx0X3BvbGxfbnNfc2hyaW5rID09IDApCisJCXZjLT5oYWx0X3BvbGxfbnMgPSAwOworCWVsc2UKKwkJdmMtPmhhbHRfcG9sbF9ucyAvPSBoYWx0X3BvbGxfbnNfc2hyaW5rOworfQorCisvKiBDaGVjayB0byBzZWUgaWYgYW55IG9mIHRoZSBydW5uYWJsZSB2Y3B1cyBvbiB0aGUgdmNvcmUgaGF2ZSBwZW5kaW5nCisgKiBleGNlcHRpb25zIG9yIGFyZSBubyBsb25nZXIgY2VkZWQKKyAqLworc3RhdGljIGludCBrdm1wcGNfdmNvcmVfY2hlY2tfYmxvY2soc3RydWN0IGt2bXBwY192Y29yZSAqdmMpCit7CisJc3RydWN0IGt2bV92Y3B1ICp2Y3B1OworCWludCBpOworCisJZm9yX2VhY2hfcnVubmFibGVfdGhyZWFkKGksIHZjcHUsIHZjKSB7CisJCWlmICh2Y3B1LT5hcmNoLnBlbmRpbmdfZXhjZXB0aW9ucyB8fCAhdmNwdS0+YXJjaC5jZWRlZCkKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCiAvKgogICogQWxsIHRoZSB2Y3B1cyBpbiB0aGlzIHZjb3JlIGFyZSBpZGxlLCBzbyB3YWl0IGZvciBhIGRlY3JlbWVudGVyCiAgKiBvciBleHRlcm5hbCBpbnRlcnJ1cHQgdG8gb25lIG9mIHRoZSB2Y3B1cy4gIHZjLT5sb2NrIGlzIGhlbGQuCiAgKi8KIHN0YXRpYyB2b2lkIGt2bXBwY192Y29yZV9ibG9ja2VkKHN0cnVjdCBrdm1wcGNfdmNvcmUgKnZjKQogewotCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTsKKwlrdGltZV90IGN1ciwgc3RhcnRfcG9sbCwgc3RhcnRfd2FpdDsKIAlpbnQgZG9fc2xlZXAgPSAxOworCXU2NCBibG9ja19uczsKIAlERUNMQVJFX1NXQUlUUVVFVUUod2FpdCk7CiAKLQlwcmVwYXJlX3RvX3N3YWl0KCZ2Yy0+d3EsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCS8qIFBvbGwgZm9yIHBlbmRpbmcgZXhjZXB0aW9ucyBhbmQgY2VkZWQgc3RhdGUgKi8KKwljdXIgPSBzdGFydF9wb2xsID0ga3RpbWVfZ2V0KCk7CisJaWYgKHZjLT5oYWx0X3BvbGxfbnMpIHsKKwkJa3RpbWVfdCBzdG9wID0ga3RpbWVfYWRkX25zKHN0YXJ0X3BvbGwsIHZjLT5oYWx0X3BvbGxfbnMpOworCQkrK3ZjLT5ydW5uZXItPnN0YXQuaGFsdF9hdHRlbXB0ZWRfcG9sbDsKIAotCS8qCi0JICogQ2hlY2sgb25lIGxhc3QgdGltZSBmb3IgcGVuZGluZyBleGNlcHRpb25zIGFuZCBjZWRlZCBzdGF0ZSBhZnRlcgotCSAqIHdlIHB1dCBvdXJzZWx2ZXMgb24gdGhlIHdhaXQgcXVldWUKLQkgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZjcHUsICZ2Yy0+cnVubmFibGVfdGhyZWFkcywgYXJjaC5ydW5fbGlzdCkgewotCQlpZiAodmNwdS0+YXJjaC5wZW5kaW5nX2V4Y2VwdGlvbnMgfHwgIXZjcHUtPmFyY2guY2VkZWQpIHsKLQkJCWRvX3NsZWVwID0gMDsKLQkJCWJyZWFrOworCQl2Yy0+dmNvcmVfc3RhdGUgPSBWQ09SRV9QT0xMSU5HOworCQlzcGluX3VubG9jaygmdmMtPmxvY2spOworCisJCWRvIHsKKwkJCWlmIChrdm1wcGNfdmNvcmVfY2hlY2tfYmxvY2sodmMpKSB7CisJCQkJZG9fc2xlZXAgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJY3VyID0ga3RpbWVfZ2V0KCk7CisJCX0gd2hpbGUgKHNpbmdsZV90YXNrX3J1bm5pbmcoKSAmJiBrdGltZV9iZWZvcmUoY3VyLCBzdG9wKSk7CisKKwkJc3Bpbl9sb2NrKCZ2Yy0+bG9jayk7CisJCXZjLT52Y29yZV9zdGF0ZSA9IFZDT1JFX0lOQUNUSVZFOworCisJCWlmICghZG9fc2xlZXApIHsKKwkJCSsrdmMtPnJ1bm5lci0+c3RhdC5oYWx0X3N1Y2Nlc3NmdWxfcG9sbDsKKwkJCWdvdG8gb3V0OwogCQl9CiAJfQogCi0JaWYgKCFkb19zbGVlcCkgeworCXByZXBhcmVfdG9fc3dhaXQoJnZjLT53cSwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwlpZiAoa3ZtcHBjX3Zjb3JlX2NoZWNrX2Jsb2NrKHZjKSkgewogCQlmaW5pc2hfc3dhaXQoJnZjLT53cSwgJndhaXQpOwotCQlyZXR1cm47CisJCWRvX3NsZWVwID0gMDsKKwkJLyogSWYgd2UgcG9sbGVkLCBjb3VudCB0aGlzIGFzIGEgc3VjY2Vzc2Z1bCBwb2xsICovCisJCWlmICh2Yy0+aGFsdF9wb2xsX25zKQorCQkJKyt2Yy0+cnVubmVyLT5zdGF0LmhhbHRfc3VjY2Vzc2Z1bF9wb2xsOworCQlnb3RvIG91dDsKIAl9CiAKKwlzdGFydF93YWl0ID0ga3RpbWVfZ2V0KCk7CisKIAl2Yy0+dmNvcmVfc3RhdGUgPSBWQ09SRV9TTEVFUElORzsKIAl0cmFjZV9rdm1wcGNfdmNvcmVfYmxvY2tlZCh2YywgMCk7CiAJc3Bpbl91bmxvY2soJnZjLT5sb2NrKTsKQEAgLTI2NDAsMTMgKzI2MzAsNTIgQEAKIAlzcGluX2xvY2soJnZjLT5sb2NrKTsKIAl2Yy0+dmNvcmVfc3RhdGUgPSBWQ09SRV9JTkFDVElWRTsKIAl0cmFjZV9rdm1wcGNfdmNvcmVfYmxvY2tlZCh2YywgMSk7CisJKyt2Yy0+cnVubmVyLT5zdGF0LmhhbHRfc3VjY2Vzc2Z1bF93YWl0OworCisJY3VyID0ga3RpbWVfZ2V0KCk7CisKK291dDoKKwlibG9ja19ucyA9IGt0aW1lX3RvX25zKGN1cikgLSBrdGltZV90b19ucyhzdGFydF9wb2xsKTsKKworCS8qIEF0dHJpYnV0ZSB3YWl0IHRpbWUgKi8KKwlpZiAoZG9fc2xlZXApIHsKKwkJdmMtPnJ1bm5lci0+c3RhdC5oYWx0X3dhaXRfbnMgKz0KKwkJCWt0aW1lX3RvX25zKGN1cikgLSBrdGltZV90b19ucyhzdGFydF93YWl0KTsKKwkJLyogQXR0cmlidXRlIGZhaWxlZCBwb2xsIHRpbWUgKi8KKwkJaWYgKHZjLT5oYWx0X3BvbGxfbnMpCisJCQl2Yy0+cnVubmVyLT5zdGF0LmhhbHRfcG9sbF9mYWlsX25zICs9CisJCQkJa3RpbWVfdG9fbnMoc3RhcnRfd2FpdCkgLQorCQkJCWt0aW1lX3RvX25zKHN0YXJ0X3BvbGwpOworCX0gZWxzZSB7CisJCS8qIEF0dHJpYnV0ZSBzdWNjZXNzZnVsIHBvbGwgdGltZSAqLworCQlpZiAodmMtPmhhbHRfcG9sbF9ucykKKwkJCXZjLT5ydW5uZXItPnN0YXQuaGFsdF9wb2xsX3N1Y2Nlc3NfbnMgKz0KKwkJCQlrdGltZV90b19ucyhjdXIpIC0KKwkJCQlrdGltZV90b19ucyhzdGFydF9wb2xsKTsKKwl9CisKKwkvKiBBZGp1c3QgcG9sbCB0aW1lICovCisJaWYgKGhhbHRfcG9sbF9tYXhfbnMpIHsKKwkJaWYgKGJsb2NrX25zIDw9IHZjLT5oYWx0X3BvbGxfbnMpCisJCQk7CisJCS8qIFdlIHNsZXB0IGFuZCBibG9ja2VkIGZvciBsb25nZXIgdGhhbiB0aGUgbWF4IGhhbHQgdGltZSAqLworCQllbHNlIGlmICh2Yy0+aGFsdF9wb2xsX25zICYmIGJsb2NrX25zID4gaGFsdF9wb2xsX21heF9ucykKKwkJCXNocmlua19oYWx0X3BvbGxfbnModmMpOworCQkvKiBXZSBzbGVwdCBhbmQgb3VyIHBvbGwgdGltZSBpcyB0b28gc21hbGwgKi8KKwkJZWxzZSBpZiAodmMtPmhhbHRfcG9sbF9ucyA8IGhhbHRfcG9sbF9tYXhfbnMgJiYKKwkJCQlibG9ja19ucyA8IGhhbHRfcG9sbF9tYXhfbnMpCisJCQlncm93X2hhbHRfcG9sbF9ucyh2Yyk7CisJfSBlbHNlCisJCXZjLT5oYWx0X3BvbGxfbnMgPSAwOworCisJdHJhY2Vfa3ZtcHBjX3Zjb3JlX3dha2V1cChkb19zbGVlcCwgYmxvY2tfbnMpOwogfQogCiBzdGF0aWMgaW50IGt2bXBwY19ydW5fdmNwdShzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1biwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCWludCBuX2NlZGVkOworCWludCBuX2NlZGVkLCBpOwogCXN0cnVjdCBrdm1wcGNfdmNvcmUgKnZjOwotCXN0cnVjdCBrdm1fdmNwdSAqdiwgKnZuOworCXN0cnVjdCBrdm1fdmNwdSAqdjsKIAogCXRyYWNlX2t2bXBwY19ydW5fdmNwdV9lbnRlcih2Y3B1KTsKIApAQCAtMjY2Niw3ICsyNjk1LDcgQEAKIAl2Y3B1LT5hcmNoLnN0b2xlbl9sb2dnZWQgPSB2Y29yZV9zdG9sZW5fdGltZSh2YywgbWZ0YigpKTsKIAl2Y3B1LT5hcmNoLnN0YXRlID0gS1ZNUFBDX1ZDUFVfUlVOTkFCTEU7CiAJdmNwdS0+YXJjaC5idXN5X3ByZWVtcHQgPSBUQl9OSUw7Ci0JbGlzdF9hZGRfdGFpbCgmdmNwdS0+YXJjaC5ydW5fbGlzdCwgJnZjLT5ydW5uYWJsZV90aHJlYWRzKTsKKwlXUklURV9PTkNFKHZjLT5ydW5uYWJsZV90aHJlYWRzW3ZjcHUtPmFyY2gucHRpZF0sIHZjcHUpOwogCSsrdmMtPm5fcnVubmFibGU7CiAKIAkvKgpAQCAtMjcwNiw4ICsyNzM1LDcgQEAKIAkJCWt2bXBwY193YWl0X2Zvcl9leGVjKHZjLCB2Y3B1LCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCQkJY29udGludWU7CiAJCX0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHYsIHZuLCAmdmMtPnJ1bm5hYmxlX3RocmVhZHMsCi0JCQkJCSBhcmNoLnJ1bl9saXN0KSB7CisJCWZvcl9lYWNoX3J1bm5hYmxlX3RocmVhZChpLCB2LCB2YykgewogCQkJa3ZtcHBjX2NvcmVfcHJlcGFyZV90b19lbnRlcih2KTsKIAkJCWlmIChzaWduYWxfcGVuZGluZyh2LT5hcmNoLnJ1bl90YXNrKSkgewogCQkJCWt2bXBwY19yZW1vdmVfcnVubmFibGUodmMsIHYpOwpAQCAtMjcyMCw3ICsyNzQ4LDcgQEAKIAkJaWYgKCF2Yy0+bl9ydW5uYWJsZSB8fCB2Y3B1LT5hcmNoLnN0YXRlICE9IEtWTVBQQ19WQ1BVX1JVTk5BQkxFKQogCQkJYnJlYWs7CiAJCW5fY2VkZWQgPSAwOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHYsICZ2Yy0+cnVubmFibGVfdGhyZWFkcywgYXJjaC5ydW5fbGlzdCkgeworCQlmb3JfZWFjaF9ydW5uYWJsZV90aHJlYWQoaSwgdiwgdmMpIHsKIAkJCWlmICghdi0+YXJjaC5wZW5kaW5nX2V4Y2VwdGlvbnMpCiAJCQkJbl9jZWRlZCArPSB2LT5hcmNoLmNlZGVkOwogCQkJZWxzZQpAQCAtMjc1OSw4ICsyNzg3LDggQEAKIAogCWlmICh2Yy0+bl9ydW5uYWJsZSAmJiB2Yy0+dmNvcmVfc3RhdGUgPT0gVkNPUkVfSU5BQ1RJVkUpIHsKIAkJLyogV2FrZSB1cCBzb21lIHZjcHUgdG8gcnVuIHRoZSBjb3JlICovCi0JCXYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ2Yy0+cnVubmFibGVfdGhyZWFkcywKLQkJCQkgICAgIHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5ydW5fbGlzdCk7CisJCWkgPSAtMTsKKwkJdiA9IG5leHRfcnVubmFibGVfdGhyZWFkKHZjLCAmaSk7CiAJCXdha2VfdXAoJnYtPmFyY2guY3B1X3J1bik7CiAJfQogCkBAIC0yODE4LDcgKzI4NDYsOCBAQAogCQkJciA9IGt2bXBwY19ib29rM3NfaHZfcGFnZV9mYXVsdChydW4sIHZjcHUsCiAJCQkJdmNwdS0+YXJjaC5mYXVsdF9kYXIsIHZjcHUtPmFyY2guZmF1bHRfZHNpc3IpOwogCQkJc3JjdV9yZWFkX3VubG9jaygmdmNwdS0+a3ZtLT5zcmN1LCBzcmN1X2lkeCk7Ci0JCX0KKwkJfSBlbHNlIGlmIChyID09IFJFU1VNRV9QQVNTVEhST1VHSCkKKwkJCXIgPSBrdm1wcGNfeGljc19ybV9jb21wbGV0ZSh2Y3B1LCAwKTsKIAl9IHdoaWxlIChpc19rdm1wcGNfcmVzdW1lX2d1ZXN0KHIpKTsKIAogIG91dDoKQEAgLTMyNDcsNiArMzI3Niw4IEBACiAJa3ZtcHBjX2ZyZWVfdmNvcmVzKGt2bSk7CiAKIAlrdm1wcGNfZnJlZV9ocHQoa3ZtKTsKKworCWt2bXBwY19mcmVlX3BpbWFwKGt2bSk7CiB9CiAKIC8qIFdlIGRvbid0IG5lZWQgdG8gZW11bGF0ZSBhbnkgcHJpdmlsZWdlZCBpbnN0cnVjdGlvbnMgb3IgZGNieiAqLwpAQCAtMzI4Miw2ICszMzEzLDE4NCBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX0tWTV9YSUNTCisKK3ZvaWQga3ZtcHBjX2ZyZWVfcGltYXAoc3RydWN0IGt2bSAqa3ZtKQoreworCWtmcmVlKGt2bS0+YXJjaC5waW1hcCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga3ZtcHBjX3Bhc3N0aHJ1X2lycW1hcCAqa3ZtcHBjX2FsbG9jX3BpbWFwKHZvaWQpCit7CisJcmV0dXJuIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrdm1wcGNfcGFzc3RocnVfaXJxbWFwKSwgR0ZQX0tFUk5FTCk7Cit9CisKK3N0YXRpYyBpbnQga3ZtcHBjX3NldF9wYXNzdGhydV9pcnEoc3RydWN0IGt2bSAqa3ZtLCBpbnQgaG9zdF9pcnEsIGludCBndWVzdF9nc2kpCit7CisJc3RydWN0IGlycV9kZXNjICpkZXNjOworCXN0cnVjdCBrdm1wcGNfaXJxX21hcCAqaXJxX21hcDsKKwlzdHJ1Y3Qga3ZtcHBjX3Bhc3N0aHJ1X2lycW1hcCAqcGltYXA7CisJc3RydWN0IGlycV9jaGlwICpjaGlwOworCWludCBpOworCisJaWYgKCFrdm1faXJxX2J5cGFzcykKKwkJcmV0dXJuIDE7CisKKwlkZXNjID0gaXJxX3RvX2Rlc2MoaG9zdF9pcnEpOworCWlmICghZGVzYykKKwkJcmV0dXJuIC1FSU87CisKKwltdXRleF9sb2NrKCZrdm0tPmxvY2spOworCisJcGltYXAgPSBrdm0tPmFyY2gucGltYXA7CisJaWYgKHBpbWFwID09IE5VTEwpIHsKKwkJLyogRmlyc3QgY2FsbCwgYWxsb2NhdGUgc3RydWN0dXJlIHRvIGhvbGQgSVJRIG1hcCAqLworCQlwaW1hcCA9IGt2bXBwY19hbGxvY19waW1hcCgpOworCQlpZiAocGltYXAgPT0gTlVMTCkgeworCQkJbXV0ZXhfdW5sb2NrKCZrdm0tPmxvY2spOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJa3ZtLT5hcmNoLnBpbWFwID0gcGltYXA7CisJfQorCisJLyoKKwkgKiBGb3Igbm93LCB3ZSBvbmx5IHN1cHBvcnQgaW50ZXJydXB0cyBmb3Igd2hpY2ggdGhlIEVPSSBvcGVyYXRpb24KKwkgKiBpcyBhbiBPUEFMIGNhbGwgZm9sbG93ZWQgYnkgYSB3cml0ZSB0byBYSVJSLCBzaW5jZSB0aGF0J3MKKwkgKiB3aGF0IG91ciByZWFsLW1vZGUgRU9JIGNvZGUgZG9lcy4KKwkgKi8KKwljaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwKCZkZXNjLT5pcnFfZGF0YSk7CisJaWYgKCFjaGlwIHx8ICFpc19wbnZfb3BhbF9tc2koY2hpcCkpIHsKKwkJcHJfd2Fybigia3ZtcHBjX3NldF9wYXNzdGhydV9pcnFfaHY6IENvdWxkIG5vdCBhc3NpZ24gSVJRIG1hcCBmb3IgKCVkLCVkKVxuIiwKKwkJCWhvc3RfaXJxLCBndWVzdF9nc2kpOworCQltdXRleF91bmxvY2soJmt2bS0+bG9jayk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCS8qCisJICogU2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBhbiBlbnRyeSBmb3IgdGhpcyBndWVzdCBJUlEgbnVtYmVyLgorCSAqIElmIGl0J3MgbWFwcGVkIHRvIGEgaGFyZHdhcmUgSVJRIG51bWJlciwgdGhhdCdzIGFuIGVycm9yLAorCSAqIG90aGVyd2lzZSByZS11c2UgdGhpcyBlbnRyeS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGltYXAtPm5fbWFwcGVkOyBpKyspIHsKKwkJaWYgKGd1ZXN0X2dzaSA9PSBwaW1hcC0+bWFwcGVkW2ldLnZfaHdpcnEpIHsKKwkJCWlmIChwaW1hcC0+bWFwcGVkW2ldLnJfaHdpcnEpIHsKKwkJCQltdXRleF91bmxvY2soJmt2bS0+bG9jayk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpID09IEtWTVBQQ19QSVJRX01BUFBFRCkgeworCQltdXRleF91bmxvY2soJmt2bS0+bG9jayk7CisJCXJldHVybiAtRUFHQUlOOwkJLyogdGFibGUgaXMgZnVsbCAqLworCX0KKworCWlycV9tYXAgPSAmcGltYXAtPm1hcHBlZFtpXTsKKworCWlycV9tYXAtPnZfaHdpcnEgPSBndWVzdF9nc2k7CisJaXJxX21hcC0+ZGVzYyA9IGRlc2M7CisKKwkvKgorCSAqIE9yZGVyIHRoZSBhYm92ZSB0d28gc3RvcmVzIGJlZm9yZSB0aGUgbmV4dCB0byBzZXJpYWxpemUgd2l0aAorCSAqIHRoZSBLVk0gcmVhbCBtb2RlIGhhbmRsZXIuCisJICovCisJc21wX3dtYigpOworCWlycV9tYXAtPnJfaHdpcnEgPSBkZXNjLT5pcnFfZGF0YS5od2lycTsKKworCWlmIChpID09IHBpbWFwLT5uX21hcHBlZCkKKwkJcGltYXAtPm5fbWFwcGVkKys7CisKKwlrdm1wcGNfeGljc19zZXRfbWFwcGVkKGt2bSwgZ3Vlc3RfZ3NpLCBkZXNjLT5pcnFfZGF0YS5od2lycSk7CisKKwltdXRleF91bmxvY2soJmt2bS0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBrdm1wcGNfY2xyX3Bhc3N0aHJ1X2lycShzdHJ1Y3Qga3ZtICprdm0sIGludCBob3N0X2lycSwgaW50IGd1ZXN0X2dzaSkKK3sKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CisJc3RydWN0IGt2bXBwY19wYXNzdGhydV9pcnFtYXAgKnBpbWFwOworCWludCBpOworCisJaWYgKCFrdm1faXJxX2J5cGFzcykKKwkJcmV0dXJuIDA7CisKKwlkZXNjID0gaXJxX3RvX2Rlc2MoaG9zdF9pcnEpOworCWlmICghZGVzYykKKwkJcmV0dXJuIC1FSU87CisKKwltdXRleF9sb2NrKCZrdm0tPmxvY2spOworCisJaWYgKGt2bS0+YXJjaC5waW1hcCA9PSBOVUxMKSB7CisJCW11dGV4X3VubG9jaygma3ZtLT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCXBpbWFwID0ga3ZtLT5hcmNoLnBpbWFwOworCisJZm9yIChpID0gMDsgaSA8IHBpbWFwLT5uX21hcHBlZDsgaSsrKSB7CisJCWlmIChndWVzdF9nc2kgPT0gcGltYXAtPm1hcHBlZFtpXS52X2h3aXJxKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gcGltYXAtPm5fbWFwcGVkKSB7CisJCW11dGV4X3VubG9jaygma3ZtLT5sb2NrKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJa3ZtcHBjX3hpY3NfY2xyX21hcHBlZChrdm0sIGd1ZXN0X2dzaSwgcGltYXAtPm1hcHBlZFtpXS5yX2h3aXJxKTsKKworCS8qIGludmFsaWRhdGUgdGhlIGVudHJ5ICovCisJcGltYXAtPm1hcHBlZFtpXS5yX2h3aXJxID0gMDsKKworCS8qCisJICogV2UgZG9uJ3QgZnJlZSB0aGlzIHN0cnVjdHVyZSBldmVuIHdoZW4gdGhlIGNvdW50IGdvZXMgdG8KKwkgKiB6ZXJvLiBUaGUgc3RydWN0dXJlIGlzIGZyZWVkIHdoZW4gd2UgZGVzdHJveSB0aGUgVk0uCisJICovCisKKwltdXRleF91bmxvY2soJmt2bS0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQga3ZtcHBjX2lycV9ieXBhc3NfYWRkX3Byb2R1Y2VyX2h2KHN0cnVjdCBpcnFfYnlwYXNzX2NvbnN1bWVyICpjb25zLAorCQkJCQkgICAgIHN0cnVjdCBpcnFfYnlwYXNzX3Byb2R1Y2VyICpwcm9kKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBrdm1fa2VybmVsX2lycWZkICppcnFmZCA9CisJCWNvbnRhaW5lcl9vZihjb25zLCBzdHJ1Y3Qga3ZtX2tlcm5lbF9pcnFmZCwgY29uc3VtZXIpOworCisJaXJxZmQtPnByb2R1Y2VyID0gcHJvZDsKKworCXJldCA9IGt2bXBwY19zZXRfcGFzc3RocnVfaXJxKGlycWZkLT5rdm0sIHByb2QtPmlycSwgaXJxZmQtPmdzaSk7CisJaWYgKHJldCkKKwkJcHJfaW5mbygia3ZtcHBjX3NldF9wYXNzdGhydV9pcnEgKGlycSAlZCwgZ3NpICVkKSBmYWlsczogJWRcbiIsCisJCQlwcm9kLT5pcnEsIGlycWZkLT5nc2ksIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBrdm1wcGNfaXJxX2J5cGFzc19kZWxfcHJvZHVjZXJfaHYoc3RydWN0IGlycV9ieXBhc3NfY29uc3VtZXIgKmNvbnMsCisJCQkJCSAgICAgIHN0cnVjdCBpcnFfYnlwYXNzX3Byb2R1Y2VyICpwcm9kKQoreworCWludCByZXQ7CisJc3RydWN0IGt2bV9rZXJuZWxfaXJxZmQgKmlycWZkID0KKwkJY29udGFpbmVyX29mKGNvbnMsIHN0cnVjdCBrdm1fa2VybmVsX2lycWZkLCBjb25zdW1lcik7CisKKwlpcnFmZC0+cHJvZHVjZXIgPSBOVUxMOworCisJLyoKKwkgKiBXaGVuIHByb2R1Y2VyIG9mIGNvbnN1bWVyIGlzIHVucmVnaXN0ZXJlZCwgd2UgY2hhbmdlIGJhY2sgdG8KKwkgKiBkZWZhdWx0IGV4dGVybmFsIGludGVycnVwdCBoYW5kbGluZyBtb2RlIC0gS1ZNIHJlYWwgbW9kZQorCSAqIHdpbGwgc3dpdGNoIGJhY2sgdG8gaG9zdC4KKwkgKi8KKwlyZXQgPSBrdm1wcGNfY2xyX3Bhc3N0aHJ1X2lycShpcnFmZC0+a3ZtLCBwcm9kLT5pcnEsIGlycWZkLT5nc2kpOworCWlmIChyZXQpCisJCXByX3dhcm4oImt2bXBwY19jbHJfcGFzc3RocnVfaXJxIChpcnEgJWQsIGdzaSAlZCkgZmFpbHM6ICVkXG4iLAorCQkJcHJvZC0+aXJxLCBpcnFmZC0+Z3NpLCByZXQpOworfQorI2VuZGlmCisKIHN0YXRpYyBsb25nIGt2bV9hcmNoX3ZtX2lvY3RsX2h2KHN0cnVjdCBmaWxlICpmaWxwLAogCQkJCSB1bnNpZ25lZCBpbnQgaW9jdGwsIHVuc2lnbmVkIGxvbmcgYXJnKQogewpAQCAtMzQwMCw2ICszNjA5LDEwIEBACiAJLmZhc3RfdmNwdV9raWNrID0ga3ZtcHBjX2Zhc3RfdmNwdV9raWNrX2h2LAogCS5hcmNoX3ZtX2lvY3RsICA9IGt2bV9hcmNoX3ZtX2lvY3RsX2h2LAogCS5oY2FsbF9pbXBsZW1lbnRlZCA9IGt2bXBwY19oY2FsbF9pbXBsX2h2LAorI2lmZGVmIENPTkZJR19LVk1fWElDUworCS5pcnFfYnlwYXNzX2FkZF9wcm9kdWNlciA9IGt2bXBwY19pcnFfYnlwYXNzX2FkZF9wcm9kdWNlcl9odiwKKwkuaXJxX2J5cGFzc19kZWxfcHJvZHVjZXIgPSBrdm1wcGNfaXJxX2J5cGFzc19kZWxfcHJvZHVjZXJfaHYsCisjZW5kaWYKIH07CiAKIHN0YXRpYyBpbnQga3ZtX2luaXRfc3ViY29yZV9iaXRtYXAodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X2J1aWx0aW4uYyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X2J1aWx0aW4uYwppbmRleCA1ZjAzODBkLi4wYzg0ZDZiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9idWlsdGluLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHZfYnVpbHRpbi5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8YXNtL3hpY3MuaD4KICNpbmNsdWRlIDxhc20vZGJlbGwuaD4KICNpbmNsdWRlIDxhc20vY3B1dGhyZWFkcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjZGVmaW5lIEtWTV9DTUFfQ0hVTktfT1JERVIJMTgKIApAQCAtMjg2LDMgKzI4NywxNTggQEAKIAogc3RydWN0IGt2bXBwY19ob3N0X3JtX29wcyAqa3ZtcHBjX2hvc3Rfcm1fb3BzX2h2OwogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtcHBjX2hvc3Rfcm1fb3BzX2h2KTsKKworI2lmZGVmIENPTkZJR19LVk1fWElDUworc3RhdGljIHN0cnVjdCBrdm1wcGNfaXJxX21hcCAqZ2V0X2lycW1hcChzdHJ1Y3Qga3ZtcHBjX3Bhc3N0aHJ1X2lycW1hcCAqcGltYXAsCisJCQkJCSB1MzIgeGlzcikKK3sKKwlpbnQgaTsKKworCS8qCisJICogV2UgYWNjZXNzIHRoZSBtYXBwZWQgYXJyYXkgaGVyZSB3aXRob3V0IGEgbG9jay4gIFRoYXQKKwkgKiBpcyBzYWZlIGJlY2F1c2Ugd2UgbmV2ZXIgcmVkdWNlIHRoZSBudW1iZXIgb2YgZW50cmllcworCSAqIGluIHRoZSBhcnJheSBhbmQgd2UgbmV2ZXIgY2hhbmdlIHRoZSB2X2h3aXJxIGZpZWxkIG9mCisJICogYW4gZW50cnkgb25jZSBpdCBpcyBzZXQuCisJICoKKwkgKiBXZSBoYXZlIGFsc28gY2FyZWZ1bGx5IG9yZGVyZWQgdGhlIHN0b3JlcyBpbiB0aGUgd3JpdGVyCisJICogYW5kIHRoZSBsb2FkcyBoZXJlIGluIHRoZSByZWFkZXIsIHNvIHRoYXQgaWYgd2UgZmluZCBhIG1hdGNoaW5nCisJICogaHdpcnEgaGVyZSwgdGhlIGFzc29jaWF0ZWQgR1NJIGFuZCBpcnFfZGVzYyBmaWVsZHMgYXJlIHZhbGlkLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBwaW1hcC0+bl9tYXBwZWQ7IGkrKykgIHsKKwkJaWYgKHhpc3IgPT0gcGltYXAtPm1hcHBlZFtpXS5yX2h3aXJxKSB7CisJCQkvKgorCQkJICogT3JkZXIgc3Vic2VxdWVudCByZWFkcyBpbiB0aGUgY2FsbGVyIHRvIHNlcmlhbGl6ZQorCQkJICogd2l0aCB0aGUgd3JpdGVyLgorCQkJICovCisJCQlzbXBfcm1iKCk7CisJCQlyZXR1cm4gJnBpbWFwLT5tYXBwZWRbaV07CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBJZiB3ZSBoYXZlIGFuIGludGVycnVwdCB0aGF0J3Mgbm90IGFuIElQSSwgY2hlY2sgaWYgd2UgaGF2ZSBhCisgKiBwYXNzdGhyb3VnaCBhZGFwdGVyIGFuZCBpZiBzbywgY2hlY2sgaWYgdGhpcyBleHRlcm5hbCBpbnRlcnJ1cHQKKyAqIGlzIGZvciB0aGUgYWRhcHRlci4KKyAqIFdlIHdpbGwgYXR0ZW1wdCB0byBkZWxpdmVyIHRoZSBJUlEgZGlyZWN0bHkgdG8gdGhlIHRhcmdldCBWQ1BVJ3MKKyAqIElDUCwgdGhlIHZpcnR1YWwgSUNQIChiYXNlZCBvbiBhZmZpbml0eSAtIHRoZSB4aXZlIHZhbHVlIGluIElDUykuCisgKgorICogSWYgdGhlIGRlbGl2ZXJ5IGZhaWxzIG9yIGlmIHRoaXMgaXMgbm90IGZvciBhIHBhc3N0aHJvdWdoIGFkYXB0ZXIsCisgKiByZXR1cm4gdG8gdGhlIGhvc3QgdG8gaGFuZGxlIHRoaXMgaW50ZXJydXB0LiBXZSBlYXJsaWVyCisgKiBzYXZlZCBhIGNvcHkgb2YgdGhlIFhJUlIgaW4gdGhlIFBBQ0EsIGl0IHdpbGwgYmUgcGlja2VkIHVwIGJ5CisgKiB0aGUgaG9zdCBJQ1AgZHJpdmVyLgorICovCitzdGF0aWMgaW50IGt2bXBwY19jaGVja19wYXNzdGhydSh1MzIgeGlzciwgX19iZTMyIHhpcnIpCit7CisJc3RydWN0IGt2bXBwY19wYXNzdGhydV9pcnFtYXAgKnBpbWFwOworCXN0cnVjdCBrdm1wcGNfaXJxX21hcCAqaXJxX21hcDsKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHU7CisKKwl2Y3B1ID0gbG9jYWxfcGFjYS0+a3ZtX2hzdGF0ZS5rdm1fdmNwdTsKKwlpZiAoIXZjcHUpCisJCXJldHVybiAxOworCXBpbWFwID0ga3ZtcHBjX2dldF9wYXNzdGhydV9pcnFtYXAodmNwdS0+a3ZtKTsKKwlpZiAoIXBpbWFwKQorCQlyZXR1cm4gMTsKKwlpcnFfbWFwID0gZ2V0X2lycW1hcChwaW1hcCwgeGlzcik7CisJaWYgKCFpcnFfbWFwKQorCQlyZXR1cm4gMTsKKworCS8qIFdlJ3JlIGhhbmRsaW5nIHRoaXMgaW50ZXJydXB0LCBnZW5lcmljIGNvZGUgZG9lc24ndCBuZWVkIHRvICovCisJbG9jYWxfcGFjYS0+a3ZtX2hzdGF0ZS5zYXZlZF94aXJyID0gMDsKKworCXJldHVybiBrdm1wcGNfZGVsaXZlcl9pcnFfcGFzc3RocnUodmNwdSwgeGlyciwgaXJxX21hcCwgcGltYXApOworfQorCisjZWxzZQorc3RhdGljIGlubGluZSBpbnQga3ZtcHBjX2NoZWNrX3Bhc3N0aHJ1KHUzMiB4aXNyLCBfX2JlMzIgeGlycikKK3sKKwlyZXR1cm4gMTsKK30KKyNlbmRpZgorCisvKgorICogRGV0ZXJtaW5lIHdoYXQgc29ydCBvZiBleHRlcm5hbCBpbnRlcnJ1cHQgaXMgcGVuZGluZyAoaWYgYW55KS4KKyAqIFJldHVybnM6CisgKgkwIGlmIG5vIGludGVycnVwdCBpcyBwZW5kaW5nCisgKgkxIGlmIGFuIGludGVycnVwdCBpcyBwZW5kaW5nIHRoYXQgbmVlZHMgdG8gYmUgaGFuZGxlZCBieSB0aGUgaG9zdAorICoJMiBQYXNzdGhyb3VnaCB0aGF0IG5lZWRzIGNvbXBsZXRpb24gaW4gdGhlIGhvc3QKKyAqCS0xIGlmIHRoZXJlIHdhcyBhIGd1ZXN0IHdha2V1cCBJUEkgKHdoaWNoIGhhcyBub3cgYmVlbiBjbGVhcmVkKQorICoJLTIgaWYgdGhlcmUgaXMgUENJIHBhc3N0aHJvdWdoIGV4dGVybmFsIGludGVycnVwdCB0aGF0IHdhcyBoYW5kbGVkCisgKi8KKworbG9uZyBrdm1wcGNfcmVhZF9pbnRyKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB4aWNzX3BoeXM7CisJdTMyIGhfeGlycjsKKwlfX2JlMzIgeGlycjsKKwl1MzIgeGlzcjsKKwl1OCBob3N0X2lwaTsKKworCS8qIHNlZSBpZiBhIGhvc3QgSVBJIGlzIHBlbmRpbmcgKi8KKwlob3N0X2lwaSA9IGxvY2FsX3BhY2EtPmt2bV9oc3RhdGUuaG9zdF9pcGk7CisJaWYgKGhvc3RfaXBpKQorCQlyZXR1cm4gMTsKKworCS8qIE5vdyByZWFkIHRoZSBpbnRlcnJ1cHQgZnJvbSB0aGUgSUNQICovCisJeGljc19waHlzID0gbG9jYWxfcGFjYS0+a3ZtX2hzdGF0ZS54aWNzX3BoeXM7CisJaWYgKHVubGlrZWx5KCF4aWNzX3BoeXMpKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogU2F2ZSBYSVJSIGZvciBsYXRlci4gU2luY2Ugd2UgZ2V0IGNvbnRyb2wgaW4gcmV2ZXJzZSBlbmRpYW4KKwkgKiBvbiBMRSBzeXN0ZW1zLCBzYXZlIGl0IGJ5dGUgcmV2ZXJzZWQgYW5kIGZldGNoIGl0IGJhY2sgaW4KKwkgKiBob3N0IGVuZGlhbi4gTm90ZSB0aGF0IHhpcnIgaXMgdGhlIHZhbHVlIHJlYWQgZnJvbSB0aGUKKwkgKiBYSVJSIHJlZ2lzdGVyLCB3aGlsZSBoX3hpcnIgaXMgdGhlIGhvc3QgZW5kaWFuIHZlcnNpb24uCisJICovCisJeGlyciA9IF9sd3pjaXgoeGljc19waHlzICsgWElDU19YSVJSKTsKKwloX3hpcnIgPSBiZTMyX3RvX2NwdSh4aXJyKTsKKwlsb2NhbF9wYWNhLT5rdm1faHN0YXRlLnNhdmVkX3hpcnIgPSBoX3hpcnI7CisJeGlzciA9IGhfeGlyciAmIDB4ZmZmZmZmOworCS8qCisJICogRW5zdXJlIHRoYXQgdGhlIHN0b3JlL2xvYWQgY29tcGxldGUgdG8gZ3VhcmFudGVlIGFsbCBzaWRlCisJICogZWZmZWN0cyBvZiBsb2FkaW5nIGZyb20gWElSUiBoYXMgY29tcGxldGVkCisJICovCisJc21wX21iKCk7CisKKwkvKiBpZiBub3RoaW5nIHBlbmRpbmcgaW4gdGhlIElDUCAqLworCWlmICgheGlzcikKKwkJcmV0dXJuIDA7CisKKwkvKiBXZSBmb3VuZCBzb21ldGhpbmcgaW4gdGhlIElDUC4uLgorCSAqCisJICogSWYgaXQgaXMgYW4gSVBJLCBjbGVhciB0aGUgTUZSUiBhbmQgRU9JIGl0LgorCSAqLworCWlmICh4aXNyID09IFhJQ1NfSVBJKSB7CisJCV9zdGJjaXgoeGljc19waHlzICsgWElDU19NRlJSLCAweGZmKTsKKwkJX3N0d2NpeCh4aWNzX3BoeXMgKyBYSUNTX1hJUlIsIHhpcnIpOworCQkvKgorCQkgKiBOZWVkIHRvIGVuc3VyZSBzaWRlIGVmZmVjdHMgb2YgYWJvdmUgc3RvcmVzCisJCSAqIGNvbXBsZXRlIGJlZm9yZSBwcm9jZWVkaW5nLgorCQkgKi8KKwkJc21wX21iKCk7CisKKwkJLyoKKwkJICogV2UgbmVlZCB0byByZS1jaGVjayBob3N0IElQSSBub3cgaW4gY2FzZSBpdCBnb3Qgc2V0IGluIHRoZQorCQkgKiBtZWFudGltZS4gSWYgaXQncyBjbGVhciwgd2UgYm91bmNlIHRoZSBpbnRlcnJ1cHQgdG8gdGhlCisJCSAqIGd1ZXN0CisJCSAqLworCQlob3N0X2lwaSA9IGxvY2FsX3BhY2EtPmt2bV9oc3RhdGUuaG9zdF9pcGk7CisJCWlmICh1bmxpa2VseShob3N0X2lwaSAhPSAwKSkgeworCQkJLyogV2UgcmFjZWQgd2l0aCB0aGUgaG9zdCwKKwkJCSAqIHdlIG5lZWQgdG8gcmVzZW5kIHRoYXQgSVBJLCBidW1tZXIKKwkJCSAqLworCQkJX3N0YmNpeCh4aWNzX3BoeXMgKyBYSUNTX01GUlIsIElQSV9QUklPUklUWSk7CisJCQkvKiBMZXQgc2lkZSBlZmZlY3RzIGNvbXBsZXRlICovCisJCQlzbXBfbWIoKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJLyogT0ssIGl0J3MgYW4gSVBJIGZvciB1cyAqLworCQlsb2NhbF9wYWNhLT5rdm1faHN0YXRlLnNhdmVkX3hpcnIgPSAwOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIGt2bXBwY19jaGVja19wYXNzdGhydSh4aXNyLCB4aXJyKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaG1pLmMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9obWkuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9wb3dlcnBjL2tlcm5lbC9obWkuYwpyZW5hbWUgdG8gYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHZfaG1pLmMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X3JtX3hpY3MuYyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X3JtX3hpY3MuYwppbmRleCA5ODBkOGE2Li44MmZmNWRlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9ybV94aWNzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHZfcm1feGljcy5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogCiAjaW5jbHVkZSA8YXNtL2t2bV9ib29rM3MuaD4KICNpbmNsdWRlIDxhc20va3ZtX3BwYy5oPgpAQCAtMTgsNyArMTksMTAgQEAKICNpbmNsdWRlIDxhc20vZGVidWcuaD4KICNpbmNsdWRlIDxhc20vc3luY2guaD4KICNpbmNsdWRlIDxhc20vY3B1dGhyZWFkcy5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3BwYy1vcGNvZGUuaD4KKyNpbmNsdWRlIDxhc20vcG52LXBjaS5oPgorI2luY2x1ZGUgPGFzbS9vcGFsLmg+CiAKICNpbmNsdWRlICJib29rM3NfeGljcy5oIgogCkBAIC0yNiw5ICszMCwxMiBAQAogCiBpbnQgaF9pcGlfcmVkaXJlY3QgPSAxOwogRVhQT1JUX1NZTUJPTChoX2lwaV9yZWRpcmVjdCk7CitpbnQga3ZtX2lycV9ieXBhc3MgPSAxOworRVhQT1JUX1NZTUJPTChrdm1faXJxX2J5cGFzcyk7CiAKIHN0YXRpYyB2b2lkIGljcF9ybV9kZWxpdmVyX2lycShzdHJ1Y3Qga3ZtcHBjX3hpY3MgKnhpY3MsIHN0cnVjdCBrdm1wcGNfaWNwICppY3AsCiAJCQkgICAgdTMyIG5ld19pcnEpOworc3RhdGljIGludCB4aWNzX29wYWxfcm1fc2V0X3NlcnZlcih1bnNpZ25lZCBpbnQgaHdfaXJxLCBpbnQgc2VydmVyX2NwdSk7CiAKIC8qIC0tIElDUyByb3V0aW5lcyAtLSAqLwogc3RhdGljIHZvaWQgaWNzX3JtX2NoZWNrX3Jlc2VuZChzdHJ1Y3Qga3ZtcHBjX3hpY3MgKnhpY3MsCkBAIC03MDgsMTAgKzcxNSwxMjMgQEAKIAkJaWNwLT5ybV9hY3Rpb24gfD0gWElDU19STV9OT1RJRllfRU9JOwogCQlpY3AtPnJtX2VvaWVkX2lycSA9IGlycTsKIAl9CisKKwlpZiAoc3RhdGUtPmhvc3RfaXJxKSB7CisJCSsrdmNwdS0+c3RhdC5wdGhydV9hbGw7CisJCWlmIChzdGF0ZS0+aW50cl9jcHUgIT0gLTEpIHsKKwkJCWludCBwY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKKworCQkJcGNwdSA9IGNwdV9maXJzdF90aHJlYWRfc2libGluZyhwY3B1KTsKKwkJCSsrdmNwdS0+c3RhdC5wdGhydV9ob3N0OworCQkJaWYgKHN0YXRlLT5pbnRyX2NwdSAhPSBwY3B1KSB7CisJCQkJKyt2Y3B1LT5zdGF0LnB0aHJ1X2JhZF9hZmY7CisJCQkJeGljc19vcGFsX3JtX3NldF9zZXJ2ZXIoc3RhdGUtPmhvc3RfaXJxLCBwY3B1KTsKKwkJCX0KKwkJCXN0YXRlLT5pbnRyX2NwdSA9IC0xOworCQl9CisJfQogIGJhaWw6CiAJcmV0dXJuIGNoZWNrX3Rvb19oYXJkKHhpY3MsIGljcCk7CiB9CiAKK3Vuc2lnbmVkIGxvbmcgZW9pX3JjOworCitzdGF0aWMgdm9pZCBpY3BfZW9pKHN0cnVjdCBpcnFfY2hpcCAqYywgdTMyIGh3aXJxLCB1MzIgeGlycikKK3sKKwl1bnNpZ25lZCBsb25nIHhpY3NfcGh5czsKKwlpbnQ2NF90IHJjOworCisJcmMgPSBwbnZfb3BhbF9wY2lfbXNpX2VvaShjLCBod2lycSk7CisKKwlpZiAocmMpCisJCWVvaV9yYyA9IHJjOworCisJaW9zeW5jKCk7CisKKwkvKiBFT0kgaXQgKi8KKwl4aWNzX3BoeXMgPSBsb2NhbF9wYWNhLT5rdm1faHN0YXRlLnhpY3NfcGh5czsKKwlfc3R3Y2l4KHhpY3NfcGh5cyArIFhJQ1NfWElSUiwgeGlycik7Cit9CisKK3N0YXRpYyBpbnQgeGljc19vcGFsX3JtX3NldF9zZXJ2ZXIodW5zaWduZWQgaW50IGh3X2lycSwgaW50IHNlcnZlcl9jcHUpCit7CisJdW5zaWduZWQgaW50IG1hbmdsZV9jcHUgPSBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKHNlcnZlcl9jcHUpIDw8IDI7CisKKwlyZXR1cm4gb3BhbF9ybV9zZXRfeGl2ZShod19pcnEsIG1hbmdsZV9jcHUsIERFRkFVTFRfUFJJT1JJVFkpOworfQorCisvKgorICogSW5jcmVtZW50IGEgcGVyLUNQVSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciB2YXJpYWJsZS4KKyAqIFNhZmUgdG8gY2FsbCBpbiByZWFsLW1vZGUuIEhhbmRsZXMgdm1hbGxvYydlZCBhZGRyZXNzZXMKKyAqCisgKiBUb0RvOiBNYWtlIHRoaXMgd29yayBmb3IgYW55IGludGVncmFsIHR5cGUKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgdGhpc19jcHVfaW5jX3JtKHVuc2lnbmVkIGludCBfX3BlcmNwdSAqYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGw7CisJdW5zaWduZWQgaW50ICpyYWRkcjsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJcmFkZHIgPSBwZXJfY3B1X3B0cihhZGRyLCBjcHUpOworCWwgPSAodW5zaWduZWQgbG9uZylyYWRkcjsKKworCWlmIChSRUdJT05fSUQobCkgPT0gVk1BTExPQ19SRUdJT05fSUQpIHsKKwkJbCA9IHZtYWxsb2NfdG9fcGh5cyhyYWRkcik7CisJCXJhZGRyID0gKHVuc2lnbmVkIGludCAqKWw7CisJfQorCSsrKnJhZGRyOworfQorCisvKgorICogV2UgZG9uJ3QgdHJ5IHRvIHVwZGF0ZSB0aGUgZmxhZ3MgaW4gdGhlIGlycV9kZXNjICdpc3RhdGUnIGZpZWxkIGluCisgKiBoZXJlIGFzIHdvdWxkIGhhcHBlbiBpbiB0aGUgbm9ybWFsIElSUSBoYW5kbGluZyBwYXRoIGZvciBzZXZlcmFsIHJlYXNvbnM6CisgKiAgLSBzdGF0ZSBmbGFncyByZXByZXNlbnQgaW50ZXJuYWwgSVJRIHN0YXRlIGFuZCBhcmUgbm90IGV4cGVjdGVkIHRvIGJlCisgKiAgICB1cGRhdGVkIG91dHNpZGUgdGhlIElSUSBzdWJzeXN0ZW0KKyAqICAtIG1vcmUgaW1wb3J0YW50bHksIHRoZXNlIGFyZSB1c2VmdWwgZm9yIGVkZ2UgdHJpZ2dlcmVkIGludGVycnVwdHMsCisgKiAgICBJUlEgcHJvYmluZywgZXRjLiwgYnV0IHdlIGFyZSBvbmx5IGhhbmRsaW5nIE1TSS9NU0l4IGludGVycnVwdHMgaGVyZQorICogICAgYW5kIHRoZXNlIHN0YXRlcyBzaG91bGRuJ3QgYXBwbHkgdG8gdXMuCisgKgorICogSG93ZXZlciwgd2UgZG8gdXBkYXRlIGlycV9zdGF0cyAtIHdlIHNvbWV3aGF0IGR1cGxpY2F0ZSB0aGUgY29kZSBpbgorICoga3N0YXRfaW5jcl9pcnFzX3RoaXNfY3B1KCkgZm9yIHRoaXMgc2luY2UgdGhpcyBmdW5jdGlvbiBpcyBkZWZpbmVkCisgKiBpbiBpcnEvaW50ZXJuYWwuaCB3aGljaCB3ZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgaGVyZS4KKyAqIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhhdCBkZXNjLT5rc3RhdF9pcnFzIGlzIGFuIGFsbG9jYXRlZCBwZXIgQ1BVCisgKiB2YXJpYWJsZSBhbmQgY291bGQgaGF2ZSBiZWVuIHZtYWxsb2MnZWQsIHNvIHdlIGNhbid0IGRpcmVjdGx5CisgKiBjYWxsIF9fdGhpc19jcHVfaW5jKCkgb24gaXQuIFRoZSBrc3RhdCBzdHJ1Y3R1cmUgaXMgYSBzdGF0aWMKKyAqIHBlciBDUFUgdmFyaWFibGUgYW5kIGl0IHNob3VsZCBiZSBhY2Nlc3NpYmxlIGJ5IHJlYWwtbW9kZSBLVk0uCisgKgorICovCitzdGF0aWMgdm9pZCBrdm1wcGNfcm1faGFuZGxlX2lycV9kZXNjKHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwl0aGlzX2NwdV9pbmNfcm0oZGVzYy0+a3N0YXRfaXJxcyk7CisJX190aGlzX2NwdV9pbmMoa3N0YXQuaXJxc19zdW0pOworfQorCitsb25nIGt2bXBwY19kZWxpdmVyX2lycV9wYXNzdGhydShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQkJIHUzMiB4aXJyLAorCQkJCSBzdHJ1Y3Qga3ZtcHBjX2lycV9tYXAgKmlycV9tYXAsCisJCQkJIHN0cnVjdCBrdm1wcGNfcGFzc3RocnVfaXJxbWFwICpwaW1hcCkKK3sKKwlzdHJ1Y3Qga3ZtcHBjX3hpY3MgKnhpY3M7CisJc3RydWN0IGt2bXBwY19pY3AgKmljcDsKKwl1MzIgaXJxOworCisJaXJxID0gaXJxX21hcC0+dl9od2lycTsKKwl4aWNzID0gdmNwdS0+a3ZtLT5hcmNoLnhpY3M7CisJaWNwID0gdmNwdS0+YXJjaC5pY3A7CisKKwlrdm1wcGNfcm1faGFuZGxlX2lycV9kZXNjKGlycV9tYXAtPmRlc2MpOworCWljcF9ybV9kZWxpdmVyX2lycSh4aWNzLCBpY3AsIGlycSk7CisKKwkvKiBFT0kgdGhlIGludGVycnVwdCAqLworCWljcF9lb2koaXJxX2Rlc2NfZ2V0X2NoaXAoaXJxX21hcC0+ZGVzYyksIGlycV9tYXAtPnJfaHdpcnEsIHhpcnIpOworCisJaWYgKGNoZWNrX3Rvb19oYXJkKHhpY3MsIGljcCkgPT0gSF9UT09fSEFSRCkKKwkJcmV0dXJuIDI7CisJZWxzZQorCQlyZXR1cm4gLTI7Cit9CisKIC8qICAtLS0gTm9uLXJlYWwgbW9kZSBYSUNTLXJlbGF0ZWQgYnVpbHQtaW4gcm91dGluZXMgLS0tICAqLwogCiAvKioKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X3JtaGFuZGxlcnMuUyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X3JtaGFuZGxlcnMuUwppbmRleCA5NzU2NTU1Li5jM2MxZDFiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9ybWhhbmRsZXJzLlMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHZfcm1oYW5kbGVycy5TCkBAIC0yMjEsNiArMjIxLDEzIEBACiAJbGkJcjMsIDAJCS8qIERvbid0IHdha2Ugb24gcHJpdmlsZWdlZCAoT1MpIGRvb3JiZWxsICovCiAJYglrdm1fZG9fbmFwCiAKKy8qCisgKiBrdm1fbm92Y3B1X3dha2V1cAorICoJRW50ZXJlZCBmcm9tIGt2bV9zdGFydF9ndWVzdCBpZiBrdm1faHN0YXRlLm5hcHBpbmcgaXMgc2V0CisgKgl0byBOQVBQSU5HX05PVkNQVQorICoJCXIyID0ga2VybmVsIFRPQworICoJCXIxMyA9IHBhY2EKKyAqLwoga3ZtX25vdmNwdV93YWtldXA6CiAJbGQJcjEsIEhTVEFURV9IT1NUX1IxKHIxMykKIAlsZAlyNSwgSFNUQVRFX0tWTV9WQ09SRShyMTMpCkBAIC0yMzAsNiArMjM3LDEzIEBACiAJLyogY2hlY2sgdGhlIHdha2UgcmVhc29uICovCiAJYmwJa3ZtcHBjX2NoZWNrX3dha2VfcmVhc29uCiAKKwkvKgorCSAqIFJlc3RvcmUgdm9sYXRpbGUgcmVnaXN0ZXJzIHNpbmNlIHdlIGNvdWxkIGhhdmUgY2FsbGVkCisJICogYSBDIHJvdXRpbmUgaW4ga3ZtcHBjX2NoZWNrX3dha2VfcmVhc29uLgorCSAqCXI1ID0gVkNPUkUKKwkgKi8KKwlsZAlyNSwgSFNUQVRFX0tWTV9WQ09SRShyMTMpCisKIAkvKiBzZWUgaWYgYW55IG90aGVyIHRocmVhZCBpcyBhbHJlYWR5IGV4aXRpbmcgKi8KIAlsd3oJcjAsIFZDT1JFX0VOVFJZX0VYSVQocjUpCiAJY21wd2kJcjAsIDB4MTAwCkBAIC0zMjIsNiArMzM2LDExIEBACiAKIAkvKiBDaGVjayB0aGUgd2FrZSByZWFzb24gaW4gU1JSMSB0byBzZWUgd2h5IHdlIGdvdCBoZXJlICovCiAJYmwJa3ZtcHBjX2NoZWNrX3dha2VfcmVhc29uCisJLyoKKwkgKiBrdm1wcGNfY2hlY2tfd2FrZV9yZWFzb24gY291bGQgaW52b2tlIGEgQyByb3V0aW5lLCBidXQgd2UKKwkgKiBoYXZlIG5vIHZvbGF0aWxlIHJlZ2lzdGVycyB0byByZXN0b3JlIHdoZW4gd2UgcmV0dXJuLgorCSAqLworCiAJY21wZGkJcjMsIDAKIAliZ2UJa3ZtX25vX2d1ZXN0CiAKQEAgLTYyNSw5ICs2NDQsMTEgQEAKIDM4OgogCiBCRUdJTl9GVFJfU0VDVElPTgotCS8qIERQREVTIGlzIHNoYXJlZCBiZXR3ZWVuIHRocmVhZHMgKi8KKwkvKiBEUERFUyBhbmQgVlRCIGFyZSBzaGFyZWQgYmV0d2VlbiB0aHJlYWRzICovCiAJbGQJcjgsIFZDT1JFX0RQREVTKHI1KQorCWxkCXI3LCBWQ09SRV9WVEIocjUpCiAJbXRzcHIJU1BSTl9EUERFUywgcjgKKwltdHNwcglTUFJOX1ZUQiwgcjcKIEVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0FSQ0hfMjA3UykKIAogCS8qIE1hcmsgdGhlIHN1YmNvcmUgc3RhdGUgYXMgaW5zaWRlIGd1ZXN0ICovCkBAIC03ODcsMTAgKzgwOCw4IEBACiAJbXRzcHIJU1BSTl9DSUFCUiwgcjcKIAltdHNwcglTUFJOX1RBUiwgcjgKIAlsZAlyNSwgVkNQVV9JQyhyNCkKLQlsZAlyNiwgVkNQVV9WVEIocjQpCi0JbXRzcHIJU1BSTl9JQywgcjUKLQltdHNwcglTUFJOX1ZUQiwgcjYKIAlsZAlyOCwgVkNQVV9FQkJIUihyNCkKKwltdHNwcglTUFJOX0lDLCByNQogCW10c3ByCVNQUk5fRUJCSFIsIHI4CiAJbGQJcjUsIFZDUFVfRUJCUlIocjQpCiAJbGQJcjYsIFZDUFVfQkVTQ1IocjQpCkBAIC04ODEsNiArOTAwLDcgQEAKIAljbXB3aQlyMywgNTEyCQkvKiAxIG1pY3Jvc2Vjb25kICovCiAJYmx0CWhkZWNfc29vbgogCitkZWxpdmVyX2d1ZXN0X2ludGVycnVwdDoKIAlsZAlyNiwgVkNQVV9DVFIocjQpCiAJbGQJcjcsIFZDUFVfWEVSKHI0KQogCkBAIC04OTUsNyArOTE1LDYgQEAKIAltdHNwcglTUFJOX1NSUjAsIHI2CiAJbXRzcHIJU1BSTl9TUlIxLCByNwogCi1kZWxpdmVyX2d1ZXN0X2ludGVycnVwdDoKIAkvKiByMTEgPSB2Y3B1LT5hcmNoLm1zciAmIH5NU1JfSFYgKi8KIAlybGRpY2wJcjExLCByMTEsIDYzIC0gTVNSX0hWX0xHLCAxCiAJcm90bGRpCXIxMSwgcjExLCAxICsgTVNSX0hWX0xHCkBAIC0xMTU1LDEwICsxMTc0LDU0IEBACiAJICogc2V0LCB3ZSBrbm93IHRoZSBob3N0IHdhbnRzIHVzIG91dCBzbyBsZXQncyBkbyBpdCBub3cKIAkgKi8KIAlibAlrdm1wcGNfcmVhZF9pbnRyCisKKwkvKgorCSAqIFJlc3RvcmUgdGhlIGFjdGl2ZSB2b2xhdGlsZSByZWdpc3RlcnMgYWZ0ZXIgcmV0dXJuaW5nIGZyb20KKwkgKiBhIEMgZnVuY3Rpb24uCisJICovCisJbGQJcjksIEhTVEFURV9LVk1fVkNQVShyMTMpCisJbGkJcjEyLCBCT09LM1NfSU5URVJSVVBUX0VYVEVSTkFMCisKKwkvKgorCSAqIGt2bXBwY19yZWFkX2ludHIgcmV0dXJuIGNvZGVzOgorCSAqCisJICogRXhpdCB0byBob3N0IChyMyA+IDApCisJICogICAxIEFuIGludGVycnVwdCBpcyBwZW5kaW5nIHRoYXQgbmVlZHMgdG8gYmUgaGFuZGxlZCBieSB0aGUgaG9zdAorCSAqICAgICBFeGl0IGd1ZXN0IGFuZCByZXR1cm4gdG8gaG9zdCBieSBicmFuY2hpbmcgdG8gZ3Vlc3RfZXhpdF9jb250CisJICoKKwkgKiAgIDIgUGFzc3Rocm91Z2ggdGhhdCBuZWVkcyBjb21wbGV0aW9uIGluIHRoZSBob3N0CisJICogICAgIEV4aXQgZ3Vlc3QgYW5kIHJldHVybiB0byBob3N0IGJ5IGJyYW5jaGluZyB0byBndWVzdF9leGl0X2NvbnQKKwkgKiAgICAgSG93ZXZlciwgd2UgYWxzbyBzZXQgcjEyIHRvIEJPT0szU19JTlRFUlJVUFRfSFZfUk1fSEFSRAorCSAqICAgICB0byBpbmRpY2F0ZSB0byB0aGUgaG9zdCB0byBjb21wbGV0ZSBoYW5kbGluZyB0aGUgaW50ZXJydXB0CisJICoKKwkgKiBCZWZvcmUgcmV0dXJuaW5nIHRvIGd1ZXN0LCB3ZSBjaGVjayBpZiBhbnkgQ1BVIGlzIGhlYWRpbmcgb3V0CisJICogdG8gdGhlIGhvc3QgYW5kIGlmIHNvLCB3ZSBoZWFkIG91dCBhbHNvLiBJZiBubyBDUFVzIGFyZSBoZWFkaW5nCisJICogY2hlY2sgcmV0dXJuIHZhbHVlcyA8PSAwLgorCSAqCisJICogUmV0dXJuIHRvIGd1ZXN0IChyMyA8PSAwKQorCSAqICAwIE5vIGV4dGVybmFsIGludGVycnVwdCBpcyBwZW5kaW5nCisJICogLTEgQSBndWVzdCB3YWtldXAgSVBJICh3aGljaCBoYXMgbm93IGJlZW4gY2xlYXJlZCkKKwkgKiAgICBJbiBlaXRoZXIgY2FzZSwgd2UgcmV0dXJuIHRvIGd1ZXN0IHRvIGRlbGl2ZXIgYW55IHBlbmRpbmcKKwkgKiAgICBndWVzdCBpbnRlcnJ1cHRzLgorCSAqCisJICogLTIgQSBQQ0kgcGFzc3Rocm91Z2ggZXh0ZXJuYWwgaW50ZXJydXB0IHdhcyBoYW5kbGVkCisJICogICAgKGludGVycnVwdCB3YXMgZGVsaXZlcmVkIGRpcmVjdGx5IHRvIGd1ZXN0KQorCSAqICAgIFJldHVybiB0byBndWVzdCB0byBkZWxpdmVyIGFueSBwZW5kaW5nIGd1ZXN0IGludGVycnVwdHMuCisJICovCisKKwljbXBkaQlyMywgMQorCWJsZQkxZgorCisJLyogUmV0dXJuIGNvZGUgPSAyICovCisJbGkJcjEyLCBCT09LM1NfSU5URVJSVVBUX0hWX1JNX0hBUkQKKwlzdHcJcjEyLCBWQ1BVX1RSQVAocjkpCisJYglndWVzdF9leGl0X2NvbnQKKworMToJLyogUmV0dXJuIGNvZGUgPD0gMSAqLwogCWNtcGRpCXIzLCAwCiAJYmd0CWd1ZXN0X2V4aXRfY29udAogCi0JLyogQ2hlY2sgaWYgYW55IENQVSBpcyBoZWFkaW5nIG91dCB0byB0aGUgaG9zdCwgaWYgc28gaGVhZCBvdXQgdG9vICovCisJLyogUmV0dXJuIGNvZGUgPD0gMCAqLwogNDoJbGQJcjUsIEhTVEFURV9LVk1fVkNPUkUocjEzKQogCWx3eglyMCwgVkNPUkVfRU5UUllfRVhJVChyNSkKIAljbXB3aQlyMCwgMHgxMDAKQEAgLTEyNzEsMTAgKzEzMzQsOCBAQAogCXN0dwlyNiwgVkNQVV9QU1BCKHI5KQogCXN0ZAlyNywgVkNQVV9GU0NSKHI5KQogCW1mc3ByCXI1LCBTUFJOX0lDCi0JbWZzcHIJcjYsIFNQUk5fVlRCCiAJbWZzcHIJcjcsIFNQUk5fVEFSCiAJc3RkCXI1LCBWQ1BVX0lDKHI5KQotCXN0ZAlyNiwgVkNQVV9WVEIocjkpCiAJc3RkCXI3LCBWQ1BVX1RBUihyOSkKIAltZnNwcglyOCwgU1BSTl9FQkJIUgogCXN0ZAlyOCwgVkNQVV9FQkJIUihyOSkKQEAgLTE1MDEsOSArMTU2MiwxMSBAQAogCWlzeW5jCiAKIEJFR0lOX0ZUUl9TRUNUSU9OCi0JLyogRFBERVMgaXMgc2hhcmVkIGJldHdlZW4gdGhyZWFkcyAqLworCS8qIERQREVTIGFuZCBWVEIgYXJlIHNoYXJlZCBiZXR3ZWVuIHRocmVhZHMgKi8KIAltZnNwcglyNywgU1BSTl9EUERFUworCW1mc3ByCXI4LCBTUFJOX1ZUQgogCXN0ZAlyNywgVkNPUkVfRFBERVMocjUpCisJc3RkCXI4LCBWQ09SRV9WVEIocjUpCiAJLyogY2xlYXIgRFBERVMgc28gd2UgZG9uJ3QgZ2V0IGd1ZXN0IGRvb3JiZWxscyBpbiB0aGUgaG9zdCAqLwogCWxpCXI4LCAwCiAJbXRzcHIJU1BSTl9EUERFUywgcjgKQEAgLTIyMTMsMTAgKzIyNzYsMjAgQEAKIAlsZAlyMjksIFZDUFVfR1BSKFIyOSkocjQpCiAJbGQJcjMwLCBWQ1BVX0dQUihSMzApKHI0KQogCWxkCXIzMSwgVkNQVV9HUFIoUjMxKShyNCkKLSAKKwogCS8qIENoZWNrIHRoZSB3YWtlIHJlYXNvbiBpbiBTUlIxIHRvIHNlZSB3aHkgd2UgZ290IGhlcmUgKi8KIAlibAlrdm1wcGNfY2hlY2tfd2FrZV9yZWFzb24KIAorCS8qCisJICogUmVzdG9yZSB2b2xhdGlsZSByZWdpc3RlcnMgc2luY2Ugd2UgY291bGQgaGF2ZSBjYWxsZWQgYQorCSAqIEMgcm91dGluZSBpbiBrdm1wcGNfY2hlY2tfd2FrZV9yZWFzb24KKwkgKglyNCA9IFZDUFUKKwkgKiByMyB0ZWxscyB1cyB3aGV0aGVyIHdlIG5lZWQgdG8gcmV0dXJuIHRvIGhvc3Qgb3Igbm90CisJICogV0FSTklORzogaXQgZ2V0cyBjaGVja2VkIGZ1cnRoZXIgZG93bjoKKwkgKiBzaG91bGQgbm90IG1vZGlmeSByMyB1bnRpbCB0aGlzIGNoZWNrIGlzIGRvbmUuCisJICovCisJbGQJcjQsIEhTVEFURV9LVk1fVkNQVShyMTMpCisKIAkvKiBjbGVhciBvdXIgYml0IGluIHZjb3JlLT5uYXBwaW5nX3RocmVhZHMgKi8KIDM0OglsZAlyNSxIU1RBVEVfS1ZNX1ZDT1JFKHIxMykKIAlsYnoJcjcsSFNUQVRFX1BUSUQocjEzKQpAQCAtMjIzMCw3ICsyMzAzLDcgQEAKIAlsaQlyMCwwCiAJc3RiCXIwLEhTVEFURV9OQVBQSU5HKHIxMykKIAotCS8qIFNlZSBpZiB0aGUgd2FrZSByZWFzb24gbWVhbnMgd2UgbmVlZCB0byBleGl0ICovCisJLyogU2VlIGlmIHRoZSB3YWtlIHJlYXNvbiBzYXZlZCBpbiByMyBtZWFucyB3ZSBuZWVkIHRvIGV4aXQgKi8KIAlzdHcJcjEyLCBWQ1BVX1RSQVAocjQpCiAJbXIJcjksIHI0CiAJY21wZGkJcjMsIDAKQEAgLTIyOTcsMTAgKzIzNzAsMTQgQEAKICAqCTAgaWYgbm90aGluZyBuZWVkcyB0byBiZSBkb25lCiAgKgkxIGlmIHNvbWV0aGluZyBoYXBwZW5lZCB0aGF0IG5lZWRzIHRvIGJlIGhhbmRsZWQgYnkgdGhlIGhvc3QKICAqCS0xIGlmIHRoZXJlIHdhcyBhIGd1ZXN0IHdha2V1cCAoSVBJIG9yIG1zZ3NuZCkKKyAqCS0yIGlmIHdlIGhhbmRsZWQgYSBQQ0kgcGFzc3Rocm91Z2ggaW50ZXJydXB0IChyZXR1cm5lZCBieQorICoJCWt2bXBwY19yZWFkX2ludHIgb25seSkKICAqCiAgKiBBbHNvIHNldHMgcjEyIHRvIHRoZSBpbnRlcnJ1cHQgdmVjdG9yIGZvciBhbnkgaW50ZXJydXB0IHRoYXQgbmVlZHMKICAqIHRvIGJlIGhhbmRsZWQgbm93IGJ5IHRoZSBob3N0ICgweDUwMCBmb3IgZXh0ZXJuYWwgaW50ZXJydXB0KSwgb3IgemVyby4KLSAqIE1vZGlmaWVzIHIwLCByNiwgcjcsIHI4LgorICogTW9kaWZpZXMgYWxsIHZvbGF0aWxlIHJlZ2lzdGVycyAoc2luY2UgaXQgbWF5IGNhbGwgYSBDIGZ1bmN0aW9uKS4KKyAqIFRoaXMgcm91dGluZSBjYWxscyBrdm1wcGNfcmVhZF9pbnRyLCBhIEMgZnVuY3Rpb24sIGlmIGFuIGV4dGVybmFsCisgKiBpbnRlcnJ1cHQgaXMgcGVuZGluZy4KICAqLwoga3ZtcHBjX2NoZWNrX3dha2VfcmVhc29uOgogCW1mc3ByCXI2LCBTUFJOX1NSUjEKQEAgLTIzMTAsOCArMjM4Nyw3IEBACiAJcmx3aW5tCXI2LCByNiwgNDUtMzEsIDB4ZQkvKiBQNyB3YWtlIHJlYXNvbiBmaWVsZCBpcyAzIGJpdHMgKi8KIEFMVF9GVFJfU0VDVElPTl9FTkRfSUZTRVQoQ1BVX0ZUUl9BUkNIXzIwN1MpCiAJY21wd2kJcjYsIDgJCQkvKiB3YXMgaXQgYW4gZXh0ZXJuYWwgaW50ZXJydXB0PyAqLwotCWxpCXIxMiwgQk9PSzNTX0lOVEVSUlVQVF9FWFRFUk5BTAotCWJlcQlrdm1wcGNfcmVhZF9pbnRyCS8qIGlmIHNvLCBzZWUgd2hhdCBpdCB3YXMgKi8KKwliZXEJN2YJCQkvKiBpZiBzbywgc2VlIHdoYXQgaXQgd2FzICovCiAJbGkJcjMsIDAKIAlsaQlyMTIsIDAKIAljbXB3aQlyNiwgNgkJCS8qIHdhcyBpdCB0aGUgZGVjcmVtZW50ZXI/ICovCkBAIC0yMzUwLDgzICsyNDI2LDI4IEBACiAJbGkJcjMsIDEKIAlibHIKIAotLyoKLSAqIERldGVybWluZSB3aGF0IHNvcnQgb2YgZXh0ZXJuYWwgaW50ZXJydXB0IGlzIHBlbmRpbmcgKGlmIGFueSkuCi0gKiBSZXR1cm5zOgotICoJMCBpZiBubyBpbnRlcnJ1cHQgaXMgcGVuZGluZwotICoJMSBpZiBhbiBpbnRlcnJ1cHQgaXMgcGVuZGluZyB0aGF0IG5lZWRzIHRvIGJlIGhhbmRsZWQgYnkgdGhlIGhvc3QKLSAqCS0xIGlmIHRoZXJlIHdhcyBhIGd1ZXN0IHdha2V1cCBJUEkgKHdoaWNoIGhhcyBub3cgYmVlbiBjbGVhcmVkKQotICogTW9kaWZpZXMgcjAsIHI2LCByNywgcjgsIHJldHVybnMgdmFsdWUgaW4gcjMuCi0gKi8KLWt2bXBwY19yZWFkX2ludHI6Ci0JLyogc2VlIGlmIGEgaG9zdCBJUEkgaXMgcGVuZGluZyAqLwotCWxpCXIzLCAxCi0JbGJ6CXIwLCBIU1RBVEVfSE9TVF9JUEkocjEzKQotCWNtcHdpCXIwLCAwCi0JYm5lCTFmCisJLyogZXh0ZXJuYWwgaW50ZXJydXB0IC0gY3JlYXRlIGEgc3RhY2sgZnJhbWUgc28gd2UgY2FuIGNhbGwgQyAqLworNzoJbWZscglyMAorCXN0ZAlyMCwgUFBDX0xSX1NUS09GRihyMSkKKwlzdGR1CXIxLCAtUFBDX01JTl9TVEtGUk0ocjEpCisJYmwJa3ZtcHBjX3JlYWRfaW50cgorCW5vcAorCWxpCXIxMiwgQk9PSzNTX0lOVEVSUlVQVF9FWFRFUk5BTAorCWNtcGRpCXIzLCAxCisJYmxlCTFmCiAKLQkvKiBOb3cgcmVhZCB0aGUgaW50ZXJydXB0IGZyb20gdGhlIElDUCAqLwotCWxkCXI2LCBIU1RBVEVfWElDU19QSFlTKHIxMykKLQlsaQlyNywgWElDU19YSVJSCi0JY21wZGkJcjYsIDAKLQliZXEtCTFmCi0JbHd6Y2l4CXIwLCByNiwgcjcKIAkvKgotCSAqIFNhdmUgWElSUiBmb3IgbGF0ZXIuIFNpbmNlIHdlIGdldCBpbiBpbiByZXZlcnNlIGVuZGlhbiBvbiBMRQotCSAqIHN5c3RlbXMsIHNhdmUgaXQgYnl0ZSByZXZlcnNlZCBhbmQgZmV0Y2ggaXQgYmFjayBpbiBob3N0IGVuZGlhbi4KKwkgKiBSZXR1cm4gY29kZSBvZiAyIG1lYW5zIFBDSSBwYXNzdGhyb3VnaCBpbnRlcnJ1cHQsIGJ1dAorCSAqIHdlIG5lZWQgdG8gcmV0dXJuIGJhY2sgdG8gaG9zdCB0byBjb21wbGV0ZSBoYW5kbGluZyB0aGUKKwkgKiBpbnRlcnJ1cHQuIFRyYXAgcmVhc29uIGlzIGV4cGVjdGVkIGluIHIxMiBieSBndWVzdAorCSAqIGV4aXQgY29kZS4KIAkgKi8KLQlsaQlyMywgSFNUQVRFX1NBVkVEX1hJUlIKLQlTVFdYX0JFCXIwLCByMywgcjEzCi0jaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KLQlsd3oJcjMsIEhTVEFURV9TQVZFRF9YSVJSKHIxMykKLSNlbHNlCi0JbXIJcjMsIHIwCi0jZW5kaWYKLQlybHdpbm0uCXIzLCByMywgMCwgMHhmZmZmZmYKLQlzeW5jCi0JYmVxCTFmCQkJLyogaWYgbm90aGluZyBwZW5kaW5nIGluIHRoZSBJQ1AgKi8KLQotCS8qIFdlIGZvdW5kIHNvbWV0aGluZyBpbiB0aGUgSUNQLi4uCi0JICoKLQkgKiBJZiBpdCdzIG5vdCBhbiBJUEksIHN0YXNoIGl0IGluIHRoZSBQQUNBIGFuZCByZXR1cm4gdG8KLQkgKiB0aGUgaG9zdCwgd2UgZG9uJ3QgKHlldCkgaGFuZGxlIGRpcmVjdGluZyByZWFsIGV4dGVybmFsCi0JICogaW50ZXJydXB0cyBkaXJlY3RseSB0byB0aGUgZ3Vlc3QKLQkgKi8KLQljbXB3aQlyMywgWElDU19JUEkJCS8qIGlmIHRoZXJlIGlzLCBpcyBpdCBhbiBJUEk/ICovCi0JYm5lCTQyZgotCi0JLyogSXQncyBhbiBJUEksIGNsZWFyIHRoZSBNRlJSIGFuZCBFT0kgaXQgKi8KLQlsaQlyMywgMHhmZgotCWxpCXI4LCBYSUNTX01GUlIKLQlzdGJjaXgJcjMsIHI2LCByOAkJLyogY2xlYXIgdGhlIElQSSAqLwotCXN0d2NpeAlyMCwgcjYsIHI3CQkvKiBFT0kgaXQgKi8KLQlzeW5jCi0KLQkvKiBXZSBuZWVkIHRvIHJlLWNoZWNrIGhvc3QgSVBJIG5vdyBpbiBjYXNlIGl0IGdvdCBzZXQgaW4gdGhlCi0JICogbWVhbnRpbWUuIElmIGl0J3MgY2xlYXIsIHdlIGJvdW5jZSB0aGUgaW50ZXJydXB0IHRvIHRoZQotCSAqIGd1ZXN0Ci0JICovCi0JbGJ6CXIwLCBIU1RBVEVfSE9TVF9JUEkocjEzKQotCWNtcHdpCXIwLCAwCi0JYm5lLQk0M2YKLQotCS8qIE9LLCBpdCdzIGFuIElQSSBmb3IgdXMgKi8KLQlsaQlyMTIsIDAKLQlsaQlyMywgLTEKLTE6CWJscgotCi00MjoJLyogSXQncyBub3QgYW4gSVBJIGFuZCBpdCdzIGZvciB0aGUgaG9zdC4gV2Ugc2F2ZWQgYSBjb3B5IG9mIFhJUlIgaW4KLQkgKiB0aGUgUEFDQSBlYXJsaWVyLCBpdCB3aWxsIGJlIHBpY2tlZCB1cCBieSB0aGUgaG9zdCBJQ1AgZHJpdmVyCi0JICovCi0JbGkJcjMsIDEKLQliCTFiCi0KLTQzOgkvKiBXZSByYWNlZCB3aXRoIHRoZSBob3N0LCB3ZSBuZWVkIHRvIHJlc2VuZCB0aGF0IElQSSwgYnVtbWVyICovCi0JbGkJcjAsIElQSV9QUklPUklUWQotCXN0YmNpeAlyMCwgcjYsIHI4CQkvKiBzZXQgdGhlIElQSSAqLwotCXN5bmMKLQlsaQlyMywgMQotCWIJMWIKKwlsaQlyMTIsIEJPT0szU19JTlRFUlJVUFRfSFZfUk1fSEFSRAorMToKKwlsZAlyMCwgUFBDX01JTl9TVEtGUk0rUFBDX0xSX1NUS09GRihyMSkKKwlhZGRpCXIxLCByMSwgUFBDX01JTl9TVEtGUk0KKwltdGxyCXIwCisJYmxyCiAKIC8qCiAgKiBTYXZlIGF3YXkgRlAsIFZNWCBhbmQgVlNYIHJlZ2lzdGVycy4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3ByLmMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19wci5jCmluZGV4IGU3NmY3OWEuLjgyNmM1NDEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3ByLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfcHIuYwpAQCAtMjI2LDcgKzIyNiw3IEBACiAJICovCiAJdmNwdS0+YXJjaC5wdXJyICs9IGdldF90YigpIC0gdmNwdS0+YXJjaC5lbnRyeV90YjsKIAl2Y3B1LT5hcmNoLnNwdXJyICs9IGdldF90YigpIC0gdmNwdS0+YXJjaC5lbnRyeV90YjsKLQl2Y3B1LT5hcmNoLnZ0YiArPSBnZXRfdnRiKCkgLSB2Y3B1LT5hcmNoLmVudHJ5X3Z0YjsKKwl0b19ib29rM3ModmNwdSktPnZ0YiArPSBnZXRfdnRiKCkgLSB2Y3B1LT5hcmNoLmVudHJ5X3Z0YjsKIAlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfQVJDSF8yMDdTKSkKIAkJdmNwdS0+YXJjaC5pYyArPSBtZnNwcihTUFJOX0lDKSAtIHZjcHUtPmFyY2guZW50cnlfaWM7CiAJc3ZjcHUtPmluX3VzZSA9IGZhbHNlOwpAQCAtNDQ4LDYgKzQ0OCw4IEBACiAJY2FzZSBQVlJfUE9XRVI3OgogCWNhc2UgUFZSX1BPV0VSN3A6CiAJY2FzZSBQVlJfUE9XRVI4OgorCWNhc2UgUFZSX1BPV0VSOEU6CisJY2FzZSBQVlJfUE9XRVI4TlZMOgogCQl2Y3B1LT5hcmNoLmhmbGFncyB8PSBCT09LM1NfSEZMQUdfTVVMVElfUEdTSVpFIHwKIAkJCUJPT0szU19IRkxBR19ORVdfVExCSUU7CiAJCWJyZWFrOwpAQCAtMTM2MSw2ICsxMzYzLDkgQEAKIAljYXNlIEtWTV9SRUdfUFBDX0hJT1I6CiAJCSp2YWwgPSBnZXRfcmVnX3ZhbChpZCwgdG9fYm9vazNzKHZjcHUpLT5oaW9yKTsKIAkJYnJlYWs7CisJY2FzZSBLVk1fUkVHX1BQQ19WVEI6CisJCSp2YWwgPSBnZXRfcmVnX3ZhbChpZCwgdG9fYm9vazNzKHZjcHUpLT52dGIpOworCQlicmVhazsKIAljYXNlIEtWTV9SRUdfUFBDX0xQQ1I6CiAJY2FzZSBLVk1fUkVHX1BQQ19MUENSXzY0OgogCQkvKgpAQCAtMTM5Nyw2ICsxNDAyLDkgQEAKIAkJdG9fYm9vazNzKHZjcHUpLT5oaW9yID0gc2V0X3JlZ192YWwoaWQsICp2YWwpOwogCQl0b19ib29rM3ModmNwdSktPmhpb3JfZXhwbGljaXQgPSB0cnVlOwogCQlicmVhazsKKwljYXNlIEtWTV9SRUdfUFBDX1ZUQjoKKwkJdG9fYm9vazNzKHZjcHUpLT52dGIgPSBzZXRfcmVnX3ZhbChpZCwgKnZhbCk7CisJCWJyZWFrOwogCWNhc2UgS1ZNX1JFR19QUENfTFBDUjoKIAljYXNlIEtWTV9SRUdfUFBDX0xQQ1JfNjQ6CiAJCWt2bXBwY19zZXRfbHBjcl9wcih2Y3B1LCBzZXRfcmVnX3ZhbChpZCwgKnZhbCkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfeGljcy5jIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfeGljcy5jCmluZGV4IDA1YWExMTMuLjNiZGM2MzkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3hpY3MuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc194aWNzLmMKQEAgLTk5LDYgKzk5LDEwIEBACiAJCXJldHVybiAwOwogCX0KIAorCS8qIFJlY29yZCB3aGljaCBDUFUgdGhpcyBhcnJpdmVkIG9uIGZvciBwYXNzZWQtdGhyb3VnaCBpbnRlcnJ1cHRzICovCisJaWYgKHN0YXRlLT5ob3N0X2lycSkKKwkJc3RhdGUtPmludHJfY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKKwogCS8qIEF0dGVtcHQgZGVsaXZlcnkgKi8KIAlpY3BfZGVsaXZlcl9pcnEoeGljcywgTlVMTCwgaXJxKTsKIApAQCAtODEyLDcgKzgxNiw3IEBACiAJcmV0dXJuIEhfU1VDQ0VTUzsKIH0KIAotc3RhdGljIG5vaW5saW5lIGludCBrdm1wcGNfeGljc19ybV9jb21wbGV0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUzMiBoY2FsbCkKK2ludCBrdm1wcGNfeGljc19ybV9jb21wbGV0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUzMiBoY2FsbCkKIHsKIAlzdHJ1Y3Qga3ZtcHBjX3hpY3MgKnhpY3MgPSB2Y3B1LT5rdm0tPmFyY2gueGljczsKIAlzdHJ1Y3Qga3ZtcHBjX2ljcCAqaWNwID0gdmNwdS0+YXJjaC5pY3A7CkBAIC04NDEsNiArODQ1LDcgQEAKIAogCXJldHVybiBIX1NVQ0NFU1M7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChrdm1wcGNfeGljc19ybV9jb21wbGV0ZSk7CiAKIGludCBrdm1wcGNfeGljc19oY2FsbChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUzMiByZXEpCiB7CkBAIC04OTIsNiArODk3LDIxIEBACiAKIC8qIC0tIEluaXRpYWxpc2F0aW9uIGNvZGUgZXRjLiAtLSAqLwogCitzdGF0aWMgdm9pZCB4aWNzX2RlYnVnZnNfaXJxbWFwKHN0cnVjdCBzZXFfZmlsZSAqbSwKKwkJCQlzdHJ1Y3Qga3ZtcHBjX3Bhc3N0aHJ1X2lycW1hcCAqcGltYXApCit7CisJaW50IGk7CisKKwlpZiAoIXBpbWFwKQorCQlyZXR1cm47CisJc2VxX3ByaW50ZihtLCAiPT09PT09PT1cblBJUlEgbWFwcGluZ3M6ICVkIG1hcHNcbj09PT09PT09PT09XG4iLAorCQkJCXBpbWFwLT5uX21hcHBlZCk7CisJZm9yIChpID0gMDsgaSA8IHBpbWFwLT5uX21hcHBlZDsgaSsrKSAgeworCQlzZXFfcHJpbnRmKG0sICJyX2h3aXJxPSV4LCB2X2h3aXJxPSV4XG4iLAorCQkJcGltYXAtPm1hcHBlZFtpXS5yX2h3aXJxLCBwaW1hcC0+bWFwcGVkW2ldLnZfaHdpcnEpOworCX0KK30KKwogc3RhdGljIGludCB4aWNzX2RlYnVnX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwcml2YXRlKQogewogCXN0cnVjdCBrdm1wcGNfeGljcyAqeGljcyA9IG0tPnByaXZhdGU7CkBAIC05MTMsNiArOTMzLDggQEAKIAl0X2NoZWNrX3Jlc2VuZCA9IDA7CiAJdF9yZWplY3QgPSAwOwogCisJeGljc19kZWJ1Z2ZzX2lycW1hcChtLCBrdm0tPmFyY2gucGltYXApOworCiAJc2VxX3ByaW50ZihtLCAiPT09PT09PT09XG5JQ1Agc3RhdGVcbj09PT09PT09PVxuIik7CiAKIAlrdm1fZm9yX2VhY2hfdmNwdShpLCB2Y3B1LCBrdm0pIHsKQEAgLTEyNTIsNiArMTI3NCw4IEBACiB7CiAJc3RydWN0IGt2bXBwY194aWNzICp4aWNzID0ga3ZtLT5hcmNoLnhpY3M7CiAKKwlpZiAoIXhpY3MpCisJCXJldHVybiAtRU5PREVWOwogCXJldHVybiBpY3NfZGVsaXZlcl9pcnEoeGljcywgaXJxLCBsZXZlbCk7CiB9CiAKQEAgLTE0MTgsMyArMTQ0MiwzNCBAQAogewogCXJldHVybiBwaW47CiB9CisKK3ZvaWQga3ZtcHBjX3hpY3Nfc2V0X21hcHBlZChzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGxvbmcgaXJxLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgaG9zdF9pcnEpCit7CisJc3RydWN0IGt2bXBwY194aWNzICp4aWNzID0ga3ZtLT5hcmNoLnhpY3M7CisJc3RydWN0IGt2bXBwY19pY3MgKmljczsKKwl1MTYgaWR4OworCisJaWNzID0ga3ZtcHBjX3hpY3NfZmluZF9pY3MoeGljcywgaXJxLCAmaWR4KTsKKwlpZiAoIWljcykKKwkJcmV0dXJuOworCisJaWNzLT5pcnFfc3RhdGVbaWR4XS5ob3N0X2lycSA9IGhvc3RfaXJxOworCWljcy0+aXJxX3N0YXRlW2lkeF0uaW50cl9jcHUgPSAtMTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGt2bXBwY194aWNzX3NldF9tYXBwZWQpOworCit2b2lkIGt2bXBwY194aWNzX2Nscl9tYXBwZWQoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nIGlycSwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGhvc3RfaXJxKQoreworCXN0cnVjdCBrdm1wcGNfeGljcyAqeGljcyA9IGt2bS0+YXJjaC54aWNzOworCXN0cnVjdCBrdm1wcGNfaWNzICppY3M7CisJdTE2IGlkeDsKKworCWljcyA9IGt2bXBwY194aWNzX2ZpbmRfaWNzKHhpY3MsIGlycSwgJmlkeCk7CisJaWYgKCFpY3MpCisJCXJldHVybjsKKworCWljcy0+aXJxX3N0YXRlW2lkeF0uaG9zdF9pcnEgPSAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoa3ZtcHBjX3hpY3NfY2xyX21hcHBlZCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc194aWNzLmggYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc194aWNzLmgKaW5kZXggYTQ2Yjk1NC4uMmE1MDMyMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfeGljcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3hpY3MuaApAQCAtNDIsNiArNDIsOCBAQAogCXU4ICBsc2k7CQkvKiBsZXZlbC1zZW5zaXRpdmUgaW50ZXJydXB0ICovCiAJdTggIGFzc2VydGVkOyAvKiBPbmx5IGZvciBMU0kgKi8KIAl1OCAgZXhpc3RzOworCWludCBpbnRyX2NwdTsKKwl1MzIgaG9zdF9pcnE7CiB9OwogCiAvKiBBdG9taWMgSUNQIHN0YXRlLCB1cGRhdGVkIHdpdGggYSBzaW5nbGUgY29tcGFyZSAmIHN3YXAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9va2UuYyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9va2UuYwppbmRleCAwMmI0NjcyLi5kZjNmMjcwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2tlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rZS5jCkBAIC0yMDM4LDcgKzIwMzgsNyBAQAogCQlpZiAodHlwZSA9PSBLVk1QUENfREVCVUdfTk9ORSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmICh0eXBlICYgIShLVk1QUENfREVCVUdfV0FUQ0hfUkVBRCB8CisJCWlmICh0eXBlICYgfihLVk1QUENfREVCVUdfV0FUQ0hfUkVBRCB8CiAJCQkgICAgIEtWTVBQQ19ERUJVR19XQVRDSF9XUklURSB8CiAJCQkgICAgIEtWTVBQQ19ERUJVR19CUkVBS1BPSU5UKSkKIAkJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9lNTAwX21tdS5jIGIvYXJjaC9wb3dlcnBjL2t2bS9lNTAwX21tdS5jCmluZGV4IDI5OTExYTAuLmRkYmY4ZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vZTUwMF9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2U1MDBfbW11LmMKQEAgLTc0Myw3ICs3NDMsNyBAQAogCWNoYXIgKnZpcnQ7CiAJc3RydWN0IHBhZ2UgKipwYWdlczsKIAlzdHJ1Y3QgdGxiZV9wcml2ICpwcml2c1syXSA9IHt9OwotCXU2NCAqZzJoX2JpdG1hcCA9IE5VTEw7CisJdTY0ICpnMmhfYml0bWFwOwogCXNpemVfdCBhcnJheV9sZW47CiAJdTMyIHNldHM7CiAJaW50IG51bV9wYWdlcywgcmV0LCBpOwpAQCAtNzc5LDQxICs3NzksNDQgQEAKIAogCW51bV9wYWdlcyA9IERJVl9ST1VORF9VUChjZmctPmFycmF5ICsgYXJyYXlfbGVuIC0gMSwgUEFHRV9TSVpFKSAtCiAJCSAgICBjZmctPmFycmF5IC8gUEFHRV9TSVpFOwotCXBhZ2VzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiBudW1fcGFnZXMsIEdGUF9LRVJORUwpOworCXBhZ2VzID0ga21hbGxvY19hcnJheShudW1fcGFnZXMsIHNpemVvZigqcGFnZXMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBhZ2VzKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXJldCA9IGdldF91c2VyX3BhZ2VzX2Zhc3QoY2ZnLT5hcnJheSwgbnVtX3BhZ2VzLCAxLCBwYWdlcyk7CiAJaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyX3BhZ2VzOworCQlnb3RvIGZyZWVfcGFnZXM7CiAKIAlpZiAocmV0ICE9IG51bV9wYWdlcykgewogCQludW1fcGFnZXMgPSByZXQ7CiAJCXJldCA9IC1FRkFVTFQ7Ci0JCWdvdG8gZXJyX3B1dF9wYWdlOworCQlnb3RvIHB1dF9wYWdlczsKIAl9CiAKIAl2aXJ0ID0gdm1hcChwYWdlcywgbnVtX3BhZ2VzLCBWTV9NQVAsIFBBR0VfS0VSTkVMKTsKIAlpZiAoIXZpcnQpIHsKIAkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfcHV0X3BhZ2U7CisJCWdvdG8gcHV0X3BhZ2VzOwogCX0KIAotCXByaXZzWzBdID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRsYmVfcHJpdikgKiBwYXJhbXMudGxiX3NpemVzWzBdLAotCQkJICAgR0ZQX0tFUk5FTCk7Ci0JcHJpdnNbMV0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGxiZV9wcml2KSAqIHBhcmFtcy50bGJfc2l6ZXNbMV0sCi0JCQkgICBHRlBfS0VSTkVMKTsKLQotCWlmICghcHJpdnNbMF0gfHwgIXByaXZzWzFdKSB7CisJcHJpdnNbMF0gPSBrY2FsbG9jKHBhcmFtcy50bGJfc2l6ZXNbMF0sIHNpemVvZigqcHJpdnNbMF0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXZzWzBdKSB7CiAJCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX3ByaXZzOworCQlnb3RvIHB1dF9wYWdlczsKIAl9CiAKLQlnMmhfYml0bWFwID0ga3phbGxvYyhzaXplb2YodTY0KSAqIHBhcmFtcy50bGJfc2l6ZXNbMV0sCi0JICAgICAgICAgICAgICAgICAgICAgR0ZQX0tFUk5FTCk7CisJcHJpdnNbMV0gPSBrY2FsbG9jKHBhcmFtcy50bGJfc2l6ZXNbMV0sIHNpemVvZigqcHJpdnNbMV0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXZzWzFdKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZnJlZV9wcml2c19maXJzdDsKKwl9CisKKwlnMmhfYml0bWFwID0ga2NhbGxvYyhwYXJhbXMudGxiX3NpemVzWzFdLAorCQkJICAgICBzaXplb2YoKmcyaF9iaXRtYXApLAorCQkJICAgICBHRlBfS0VSTkVMKTsKIAlpZiAoIWcyaF9iaXRtYXApIHsKIAkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfcHJpdnM7CisJCWdvdG8gZnJlZV9wcml2c19zZWNvbmQ7CiAJfQogCiAJZnJlZV9ndGxiKHZjcHVfZTUwMCk7CkBAIC04NDUsMTYgKzg0OCwxNCBAQAogCiAJa3ZtcHBjX3JlY2FsY190bGIxbWFwX3JhbmdlKHZjcHVfZTUwMCk7CiAJcmV0dXJuIDA7Ci0KLWVycl9wcml2czoKLQlrZnJlZShwcml2c1swXSk7CisgZnJlZV9wcml2c19zZWNvbmQ6CiAJa2ZyZWUocHJpdnNbMV0pOwotCi1lcnJfcHV0X3BhZ2U6CisgZnJlZV9wcml2c19maXJzdDoKKwlrZnJlZShwcml2c1swXSk7CisgcHV0X3BhZ2VzOgogCWZvciAoaSA9IDA7IGkgPCBudW1fcGFnZXM7IGkrKykKIAkJcHV0X3BhZ2UocGFnZXNbaV0pOwotCi1lcnJfcGFnZXM6CisgZnJlZV9wYWdlczoKIAlrZnJlZShwYWdlcyk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTkwNCwxMSArOTA1LDkgQEAKIGludCBrdm1wcGNfZTUwMF90bGJfaW5pdChzdHJ1Y3Qga3ZtcHBjX3ZjcHVfZTUwMCAqdmNwdV9lNTAwKQogewogCXN0cnVjdCBrdm1fdmNwdSAqdmNwdSA9ICZ2Y3B1X2U1MDAtPnZjcHU7Ci0JaW50IGVudHJ5X3NpemUgPSBzaXplb2Yoc3RydWN0IGt2bV9ib29rM2VfMjA2X3RsYl9lbnRyeSk7Ci0JaW50IGVudHJpZXMgPSBLVk1fRTUwMF9UTEIwX1NJWkUgKyBLVk1fRTUwMF9UTEIxX1NJWkU7CiAKIAlpZiAoZTUwMF9tbXVfaG9zdF9pbml0KHZjcHVfZTUwMCkpCi0JCWdvdG8gZXJyOworCQlnb3RvIGZyZWVfdmNwdTsKIAogCXZjcHVfZTUwMC0+Z3RsYl9wYXJhbXNbMF0uZW50cmllcyA9IEtWTV9FNTAwX1RMQjBfU0laRTsKIAl2Y3B1X2U1MDAtPmd0bGJfcGFyYW1zWzFdLmVudHJpZXMgPSBLVk1fRTUwMF9UTEIxX1NJWkU7CkBAIC05MjAsMzcgKzkxOSwzOSBAQAogCXZjcHVfZTUwMC0+Z3RsYl9wYXJhbXNbMV0ud2F5cyA9IEtWTV9FNTAwX1RMQjFfU0laRTsKIAl2Y3B1X2U1MDAtPmd0bGJfcGFyYW1zWzFdLnNldHMgPSAxOwogCi0JdmNwdV9lNTAwLT5ndGxiX2FyY2ggPSBrbWFsbG9jKGVudHJpZXMgKiBlbnRyeV9zaXplLCBHRlBfS0VSTkVMKTsKKwl2Y3B1X2U1MDAtPmd0bGJfYXJjaCA9IGttYWxsb2NfYXJyYXkoS1ZNX0U1MDBfVExCMF9TSVpFICsKKwkJCQkJICAgICBLVk1fRTUwMF9UTEIxX1NJWkUsCisJCQkJCSAgICAgc2l6ZW9mKCp2Y3B1X2U1MDAtPmd0bGJfYXJjaCksCisJCQkJCSAgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCF2Y3B1X2U1MDAtPmd0bGJfYXJjaCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAl2Y3B1X2U1MDAtPmd0bGJfb2Zmc2V0WzBdID0gMDsKIAl2Y3B1X2U1MDAtPmd0bGJfb2Zmc2V0WzFdID0gS1ZNX0U1MDBfVExCMF9TSVpFOwogCi0JdmNwdV9lNTAwLT5ndGxiX3ByaXZbMF0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGxiZV9yZWYpICoKLQkJCQkJICB2Y3B1X2U1MDAtPmd0bGJfcGFyYW1zWzBdLmVudHJpZXMsCisJdmNwdV9lNTAwLT5ndGxiX3ByaXZbMF0gPSBrY2FsbG9jKHZjcHVfZTUwMC0+Z3RsYl9wYXJhbXNbMF0uZW50cmllcywKKwkJCQkJICBzaXplb2Yoc3RydWN0IHRsYmVfcmVmKSwKIAkJCQkJICBHRlBfS0VSTkVMKTsKIAlpZiAoIXZjcHVfZTUwMC0+Z3RsYl9wcml2WzBdKQotCQlnb3RvIGVycjsKKwkJZ290byBmcmVlX3ZjcHU7CiAKLQl2Y3B1X2U1MDAtPmd0bGJfcHJpdlsxXSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0bGJlX3JlZikgKgotCQkJCQkgIHZjcHVfZTUwMC0+Z3RsYl9wYXJhbXNbMV0uZW50cmllcywKKwl2Y3B1X2U1MDAtPmd0bGJfcHJpdlsxXSA9IGtjYWxsb2ModmNwdV9lNTAwLT5ndGxiX3BhcmFtc1sxXS5lbnRyaWVzLAorCQkJCQkgIHNpemVvZihzdHJ1Y3QgdGxiZV9yZWYpLAogCQkJCQkgIEdGUF9LRVJORUwpOwogCWlmICghdmNwdV9lNTAwLT5ndGxiX3ByaXZbMV0pCi0JCWdvdG8gZXJyOworCQlnb3RvIGZyZWVfdmNwdTsKIAotCXZjcHVfZTUwMC0+ZzJoX3RsYjFfbWFwID0ga3phbGxvYyhzaXplb2YodTY0KSAqCi0JCQkJCSAgdmNwdV9lNTAwLT5ndGxiX3BhcmFtc1sxXS5lbnRyaWVzLAorCXZjcHVfZTUwMC0+ZzJoX3RsYjFfbWFwID0ga2NhbGxvYyh2Y3B1X2U1MDAtPmd0bGJfcGFyYW1zWzFdLmVudHJpZXMsCisJCQkJCSAgc2l6ZW9mKCp2Y3B1X2U1MDAtPmcyaF90bGIxX21hcCksCiAJCQkJCSAgR0ZQX0tFUk5FTCk7CiAJaWYgKCF2Y3B1X2U1MDAtPmcyaF90bGIxX21hcCkKLQkJZ290byBlcnI7CisJCWdvdG8gZnJlZV92Y3B1OwogCiAJdmNwdV9tbXVfaW5pdCh2Y3B1LCB2Y3B1X2U1MDAtPmd0bGJfcGFyYW1zKTsKIAogCWt2bXBwY19yZWNhbGNfdGxiMW1hcF9yYW5nZSh2Y3B1X2U1MDApOwogCXJldHVybiAwOwotCi1lcnI6CisgZnJlZV92Y3B1OgogCWZyZWVfZ3RsYih2Y3B1X2U1MDApOwogCXJldHVybiAtMTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vcG93ZXJwYy5jIGIvYXJjaC9wb3dlcnBjL2t2bS9wb3dlcnBjLmMKaW5kZXggNmNlNDBkZC4uNzA5NjNjOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9wb3dlcnBjLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9wb3dlcnBjLmMKQEAgLTI3LDYgKzI3LDggQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWJ5cGFzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2t2bV9pcnFmZC5oPgogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2t2bV9wcGMuaD4KQEAgLTQzNiw2ICs0MzgsMTYgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAorYm9vbCBrdm1fYXJjaF9oYXNfdmNwdV9kZWJ1Z2ZzKHZvaWQpCit7CisJcmV0dXJuIGZhbHNlOworfQorCitpbnQga3ZtX2FyY2hfY3JlYXRlX3ZjcHVfZGVidWdmcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJcmV0dXJuIDA7Cit9CisKIHZvaWQga3ZtX2FyY2hfZGVzdHJveV92bShzdHJ1Y3Qga3ZtICprdm0pCiB7CiAJdW5zaWduZWQgaW50IGk7CkBAIC03MzksNiArNzUxLDQyIEBACiAjZW5kaWYKIH0KIAorLyoKKyAqIGlycV9ieXBhc3NfYWRkX3Byb2R1Y2VyIGFuZCBpcnFfYnlwYXNzX2RlbF9wcm9kdWNlciBhcmUgb25seQorICogdXNlZnVsIGlmIHRoZSBhcmNoaXRlY3R1cmUgc3VwcG9ydHMgUENJIHBhc3N0aHJvdWdoLgorICogaXJxX2J5cGFzc19zdG9wIGFuZCBpcnFfYnlwYXNzX3N0YXJ0IGFyZSBub3QgbmVlZGVkIGFuZCBzbworICoga3ZtX29wcyBhcmUgbm90IGRlZmluZWQgZm9yIHRoZW0uCisgKi8KK2Jvb2wga3ZtX2FyY2hfaGFzX2lycV9ieXBhc3Modm9pZCkKK3sKKwlyZXR1cm4gKChrdm1wcGNfaHZfb3BzICYmIGt2bXBwY19odl9vcHMtPmlycV9ieXBhc3NfYWRkX3Byb2R1Y2VyKSB8fAorCQkoa3ZtcHBjX3ByX29wcyAmJiBrdm1wcGNfcHJfb3BzLT5pcnFfYnlwYXNzX2FkZF9wcm9kdWNlcikpOworfQorCitpbnQga3ZtX2FyY2hfaXJxX2J5cGFzc19hZGRfcHJvZHVjZXIoc3RydWN0IGlycV9ieXBhc3NfY29uc3VtZXIgKmNvbnMsCisJCQkJICAgICBzdHJ1Y3QgaXJxX2J5cGFzc19wcm9kdWNlciAqcHJvZCkKK3sKKwlzdHJ1Y3Qga3ZtX2tlcm5lbF9pcnFmZCAqaXJxZmQgPQorCQljb250YWluZXJfb2YoY29ucywgc3RydWN0IGt2bV9rZXJuZWxfaXJxZmQsIGNvbnN1bWVyKTsKKwlzdHJ1Y3Qga3ZtICprdm0gPSBpcnFmZC0+a3ZtOworCisJaWYgKGt2bS0+YXJjaC5rdm1fb3BzLT5pcnFfYnlwYXNzX2FkZF9wcm9kdWNlcikKKwkJcmV0dXJuIGt2bS0+YXJjaC5rdm1fb3BzLT5pcnFfYnlwYXNzX2FkZF9wcm9kdWNlcihjb25zLCBwcm9kKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGt2bV9hcmNoX2lycV9ieXBhc3NfZGVsX3Byb2R1Y2VyKHN0cnVjdCBpcnFfYnlwYXNzX2NvbnN1bWVyICpjb25zLAorCQkJCSAgICAgIHN0cnVjdCBpcnFfYnlwYXNzX3Byb2R1Y2VyICpwcm9kKQoreworCXN0cnVjdCBrdm1fa2VybmVsX2lycWZkICppcnFmZCA9CisJCWNvbnRhaW5lcl9vZihjb25zLCBzdHJ1Y3Qga3ZtX2tlcm5lbF9pcnFmZCwgY29uc3VtZXIpOworCXN0cnVjdCBrdm0gKmt2bSA9IGlycWZkLT5rdm07CisKKwlpZiAoa3ZtLT5hcmNoLmt2bV9vcHMtPmlycV9ieXBhc3NfZGVsX3Byb2R1Y2VyKQorCQlrdm0tPmFyY2gua3ZtX29wcy0+aXJxX2J5cGFzc19kZWxfcHJvZHVjZXIoY29ucywgcHJvZCk7Cit9CisKIHN0YXRpYyB2b2lkIGt2bXBwY19jb21wbGV0ZV9tbWlvX2xvYWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qga3ZtX3J1biAqcnVuKQogewpAQCAtMTE2Nyw2ICsxMjE1LDE5IEBACiAJcmV0dXJuIHI7CiB9CiAKK2Jvb2wga3ZtX2FyY2hfaW50Y19pbml0aWFsaXplZChzdHJ1Y3Qga3ZtICprdm0pCit7CisjaWZkZWYgQ09ORklHX0tWTV9NUElDCisJaWYgKGt2bS0+YXJjaC5tcGljKQorCQlyZXR1cm4gdHJ1ZTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19LVk1fWElDUworCWlmIChrdm0tPmFyY2gueGljcykKKwkJcmV0dXJuIHRydWU7CisjZW5kaWYKKwlyZXR1cm4gZmFsc2U7Cit9CisKIGludCBrdm1fYXJjaF92Y3B1X2lvY3RsX2dldF9tcHN0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBrdm1fbXBfc3RhdGUgKm1wX3N0YXRlKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS90cmFjZV9odi5oIGIvYXJjaC9wb3dlcnBjL2t2bS90cmFjZV9odi5oCmluZGV4IDMzZDlkYWYuLmZiMjE5OTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vdHJhY2VfaHYuaAorKysgYi9hcmNoL3Bvd2VycGMva3ZtL3RyYWNlX2h2LmgKQEAgLTQzMiw2ICs0MzIsMjggQEAKIAkJICAgX19lbnRyeS0+cnVubmVyX3ZjcHUsIF9fZW50cnktPm5fcnVubmFibGUsIF9fZW50cnktPnRnaWQpCiApOwogCitUUkFDRV9FVkVOVChrdm1wcGNfdmNvcmVfd2FrZXVwLAorCVRQX1BST1RPKGludCBkb19zbGVlcCwgX191NjQgbnMpLAorCisJVFBfQVJHUyhkb19zbGVlcCwgbnMpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZChfX3U2NCwgIG5zKQorCQlfX2ZpZWxkKGludCwgICAgd2FpdGVkKQorCQlfX2ZpZWxkKHBpZF90LCAgdGdpZCkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPm5zICAgICA9IG5zOworCQlfX2VudHJ5LT53YWl0ZWQgPSBkb19zbGVlcDsKKwkJX19lbnRyeS0+dGdpZCAgID0gY3VycmVudC0+dGdpZDsKKwkpLAorCisJVFBfcHJpbnRrKCIlcyB0aW1lICVsbGQgbnMsIHRnaWQ9JWQiLAorCQlfX2VudHJ5LT53YWl0ZWQgPyAid2FpdCIgOiAicG9sbCIsCisJCV9fZW50cnktPm5zLCBfX2VudHJ5LT50Z2lkKQorKTsKKwogVFJBQ0VfRVZFTlQoa3ZtcHBjX3J1bl92Y3B1X2VudGVyLAogCVRQX1BST1RPKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSksCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9saWIvY2hlY2tzdW1fMzIuUyBiL2FyY2gvcG93ZXJwYy9saWIvY2hlY2tzdW1fMzIuUwppbmRleCAwYTU3ZmU2Li5hYTgyMTRmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbGliL2NoZWNrc3VtXzMyLlMKKysrIGIvYXJjaC9wb3dlcnBjL2xpYi9jaGVja3N1bV8zMi5TCkBAIC0xMjcsMTggKzEyNywxOSBAQAogCXN0dwlyNywxMihyMSkKIAlzdHcJcjgsOChyMSkKIAotCXJsd2lubQlyMCxyNCwzLDB4OAotCXJsd25tCXI2LHI2LHIwLDAsMzEJLyogb2RkIGRlc3RpbmF0aW9uIGFkZHJlc3M6IHJvdGF0ZSBvbmUgYnl0ZSAqLwotCWNtcGx3aQljcjcscjAsMAkvKiBpcyBkZXN0aW5hdGlvbiBhZGRyZXNzIGV2ZW4gPyAqLwogCWFkZGljCXIxMixyNiwwCiAJYWRkaQlyNixyNCwtNAogCW5lZwlyMCxyNAogCWFkZGkJcjQscjMsLTQKIAlhbmRpLglyMCxyMCxDQUNIRUxJTkVfTUFTSwkvKiAjIGJ5dGVzIHRvIHN0YXJ0IG9mIGNhY2hlIGxpbmUgKi8KKwljcnNldAk0KmNyNytlcQogCWJlcQk1OGYKIAogCWNtcGx3CTAscjUscjAJCQkvKiBpcyB0aGlzIG1vcmUgdGhhbiB0b3RhbCB0byBkbz8gKi8KIAlibHQJNjNmCQkJLyogaWYgbm90IG11Y2ggdG8gZG8gKi8KKwlybHdpbm0JcjcscjYsMywweDgKKwlybHdubQlyMTIscjEyLHI3LDAsMzEJLyogb2RkIGRlc3RpbmF0aW9uIGFkZHJlc3M6IHJvdGF0ZSBvbmUgYnl0ZSAqLworCWNtcGx3aQljcjcscjcsMAkvKiBpcyBkZXN0aW5hdGlvbiBhZGRyZXNzIGV2ZW4gPyAqLwogCWFuZGkuCXI4LHIwLDMJCQkvKiBnZXQgaXQgd29yZC1hbGlnbmVkIGZpcnN0ICovCiAJbXRjdHIJcjgKIAliZXErCTYxZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2ZhdWx0LmMgYi9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYwppbmRleCBhNGRiMjJmLi5iYjFmZmM1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYwpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfbmF0aXZlXzY0LmMgYi9hcmNoL3Bvd2VycGMvbW0vaGFzaF9uYXRpdmVfNjQuYwppbmRleCAwZTRlOTY1Li44M2RkYzBlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaGFzaF9uYXRpdmVfNjQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vaGFzaF9uYXRpdmVfNjQuYwpAQCAtNDkzLDM2ICs0OTMsNiBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbmxpbmUgaW50IF9faHB0ZV9hY3R1YWxfcHNpemUodW5zaWduZWQgaW50IGxwLCBpbnQgcHNpemUpCi17Ci0JaW50IGksIHNoaWZ0OwotCXVuc2lnbmVkIGludCBtYXNrOwotCi0JLyogc3RhcnQgZnJvbSAxIGlnbm9yaW5nIE1NVV9QQUdFXzRLICovCi0JZm9yIChpID0gMTsgaSA8IE1NVV9QQUdFX0NPVU5UOyBpKyspIHsKLQotCQkvKiBpbnZhbGlkIHBlbmMgKi8KLQkJaWYgKG1tdV9wc2l6ZV9kZWZzW3BzaXplXS5wZW5jW2ldID09IC0xKQotCQkJY29udGludWU7Ci0JCS8qCi0JCSAqIGVuY29kaW5nIGJpdHMgcGVyIGFjdHVhbCBwYWdlIHNpemUKLQkJICogICAgICAgIFBURSBMUCAgICAgYWN0dWFsIHBhZ2Ugc2l6ZQotCQkgKiAgICBycnJyIHJycnoJCT49OEtCCi0JCSAqICAgIHJycnIgcnJ6egkJPj0xNktCCi0JCSAqICAgIHJycnIgcnp6egkJPj0zMktCCi0JCSAqICAgIHJycnIgenp6egkJPj02NEtCCi0JCSAqIC4uLi4uLi4KLQkJICovCi0JCXNoaWZ0ID0gbW11X3BzaXplX2RlZnNbaV0uc2hpZnQgLSBMUF9TSElGVDsKLQkJaWYgKHNoaWZ0ID4gTFBfQklUUykKLQkJCXNoaWZ0ID0gTFBfQklUUzsKLQkJbWFzayA9ICgxIDw8IHNoaWZ0KSAtIDE7Ci0JCWlmICgobHAgJiBtYXNrKSA9PSBtbXVfcHNpemVfZGVmc1twc2l6ZV0ucGVuY1tpXSkKLQkJCXJldHVybiBpOwotCX0KLQlyZXR1cm4gLTE7Ci19Ci0KIHN0YXRpYyB2b2lkIGhwdGVfZGVjb2RlKHN0cnVjdCBoYXNoX3B0ZSAqaHB0ZSwgdW5zaWduZWQgbG9uZyBzbG90LAogCQkJaW50ICpwc2l6ZSwgaW50ICphcHNpemUsIGludCAqc3NpemUsIHVuc2lnbmVkIGxvbmcgKnZwbikKIHsKQEAgLTUzOCwxNiArNTA4LDggQEAKIAkJc2l6ZSAgID0gTU1VX1BBR0VfNEs7CiAJCWFfc2l6ZSA9IE1NVV9QQUdFXzRLOwogCX0gZWxzZSB7Ci0JCWZvciAoc2l6ZSA9IDA7IHNpemUgPCBNTVVfUEFHRV9DT1VOVDsgc2l6ZSsrKSB7Ci0KLQkJCS8qIHZhbGlkIGVudHJpZXMgaGF2ZSBhIHNoaWZ0IHZhbHVlICovCi0JCQlpZiAoIW1tdV9wc2l6ZV9kZWZzW3NpemVdLnNoaWZ0KQotCQkJCWNvbnRpbnVlOwotCi0JCQlhX3NpemUgPSBfX2hwdGVfYWN0dWFsX3BzaXplKGxwLCBzaXplKTsKLQkJCWlmIChhX3NpemUgIT0gLTEpCi0JCQkJYnJlYWs7Ci0JCX0KKwkJc2l6ZSA9IGhwdGVfcGFnZV9zaXplc1tscF0gJiAweGY7CisJCWFfc2l6ZSA9IGhwdGVfcGFnZV9zaXplc1tscF0gPj4gNDsKIAl9CiAJLyogVGhpcyB3b3JrcyBmb3IgYWxsIHBhZ2Ugc2l6ZXMsIGFuZCBmb3IgMjU2TSBhbmQgMVQgc2VnbWVudHMgKi8KIAlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfQVJDSF8zMDApKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfdXRpbHNfNjQuYyBiL2FyY2gvcG93ZXJwYy9tbS9oYXNoX3V0aWxzXzY0LmMKaW5kZXggMDgyMTU1Ni4uZWYzYWU4OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfdXRpbHNfNjQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vaGFzaF91dGlsc182NC5jCkBAIC05Myw2ICs5Myw5IEBACiBzdHJ1Y3QgbW11X3BzaXplX2RlZiBtbXVfcHNpemVfZGVmc1tNTVVfUEFHRV9DT1VOVF07CiBFWFBPUlRfU1lNQk9MX0dQTChtbXVfcHNpemVfZGVmcyk7CiAKK3U4IGhwdGVfcGFnZV9zaXplc1sxIDw8IExQX0JJVFNdOworRVhQT1JUX1NZTUJPTF9HUEwoaHB0ZV9wYWdlX3NpemVzKTsKKwogc3RydWN0IGhhc2hfcHRlICpodGFiX2FkZHJlc3M7CiB1bnNpZ25lZCBsb25nIGh0YWJfc2l6ZV9ieXRlczsKIHVuc2lnbmVkIGxvbmcgaHRhYl9oYXNoX21hc2s7CkBAIC01NjQsOCArNTY3LDYwIEBACiAjZW5kaWYgLyogQ09ORklHX0hVR0VUTEJfUEFHRSAqLwogfQogCisvKgorICogRmlsbCBpbiB0aGUgaHB0ZV9wYWdlX3NpemVzW10gYXJyYXkuCisgKiBXZSBnbyB0aHJvdWdoIHRoZSBtbXVfcHNpemVfZGVmc1tdIGFycmF5IGxvb2tpbmcgZm9yIGFsbCB0aGUKKyAqIHN1cHBvcnRlZCBiYXNlL2FjdHVhbCBwYWdlIHNpemUgY29tYmluYXRpb25zLiAgRWFjaCBjb21iaW5hdGlvbgorICogaGFzIGEgdW5pcXVlIHBhZ2VzaXplIGVuY29kaW5nIChwZW5jKSB2YWx1ZSBpbiB0aGUgbG93IGJpdHMgb2YKKyAqIHRoZSBMUCBmaWVsZCBvZiB0aGUgSFBURS4gIEZvciBhY3R1YWwgcGFnZSBzaXplcyBsZXNzIHRoYW4gMU1CLAorICogc29tZSBvZiB0aGUgdXBwZXIgTFAgYml0cyBhcmUgdXNlZCBmb3IgUlBOIGJpdHMsIG1lYW5pbmcgdGhhdAorICogd2UgbmVlZCB0byBmaWxsIGluIHNldmVyYWwgZW50cmllcyBpbiBocHRlX3BhZ2Vfc2l6ZXNbXS4KKyAqCisgKiBJbiBkaWFncmFtbWF0aWMgZm9ybSwgd2l0aCByID0gUlBOIGJpdHMgYW5kIHogPSBwYWdlIHNpemUgYml0czoKKyAqICAgICAgICBQVEUgTFAgICAgIGFjdHVhbCBwYWdlIHNpemUKKyAqICAgIHJycnIgcnJyegkJPj04S0IKKyAqICAgIHJycnIgcnJ6egkJPj0xNktCCisgKiAgICBycnJyIHJ6enoJCT49MzJLQgorICogICAgcnJyciB6enp6CQk+PTY0S0IKKyAqICAgIC4uLgorICoKKyAqIFRoZSB6enp6IGJpdHMgYXJlIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIGJ1dCBhcmUgY2hvc2VuIHNvIHRoYXQKKyAqIG5vIGVuY29kaW5nIGZvciBhIGxhcmdlciBwYWdlIHNpemUgdXNlcyB0aGUgc2FtZSB2YWx1ZSBpbiBpdHMKKyAqIGxvdy1vcmRlciBOIGJpdHMgYXMgdGhlIGVuY29kaW5nIGZvciB0aGUgMl4oMTIrTikgYnl0ZSBwYWdlIHNpemUKKyAqIChpZiBpdCBleGlzdHMpLgorICovCitzdGF0aWMgdm9pZCBpbml0X2hwdGVfcGFnZV9zaXplcyh2b2lkKQoreworCWxvbmcgaW50IGFwLCBicDsKKwlsb25nIGludCBzaGlmdCwgcGVuYzsKKworCWZvciAoYnAgPSAwOyBicCA8IE1NVV9QQUdFX0NPVU5UOyArK2JwKSB7CisJCWlmICghbW11X3BzaXplX2RlZnNbYnBdLnNoaWZ0KQorCQkJY29udGludWU7CS8qIG5vdCBhIHN1cHBvcnRlZCBwYWdlIHNpemUgKi8KKwkJZm9yIChhcCA9IGJwOyBhcCA8IE1NVV9QQUdFX0NPVU5UOyArK2FwKSB7CisJCQlwZW5jID0gbW11X3BzaXplX2RlZnNbYnBdLnBlbmNbYXBdOworCQkJaWYgKHBlbmMgPT0gLTEpCisJCQkJY29udGludWU7CisJCQlzaGlmdCA9IG1tdV9wc2l6ZV9kZWZzW2FwXS5zaGlmdCAtIExQX1NISUZUOworCQkJaWYgKHNoaWZ0IDw9IDApCisJCQkJY29udGludWU7CS8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJCS8qCisJCQkgKiBGb3IgcGFnZSBzaXplcyBsZXNzIHRoYW4gMU1CLCB0aGlzIGxvb3AKKwkJCSAqIHJlcGxpY2F0ZXMgdGhlIGVudHJ5IGZvciBhbGwgcG9zc2libGUgdmFsdWVzCisJCQkgKiBvZiB0aGUgcnJyciBiaXRzLgorCQkJICovCisJCQl3aGlsZSAocGVuYyA8ICgxIDw8IExQX0JJVFMpKSB7CisJCQkJaHB0ZV9wYWdlX3NpemVzW3BlbmNdID0gKGFwIDw8IDQpIHwgYnA7CisJCQkJcGVuYyArPSAxIDw8IHNoaWZ0OworCQkJfQorCQl9CisJfQorfQorCiBzdGF0aWMgdm9pZCBfX2luaXQgaHRhYl9pbml0X3BhZ2Vfc2l6ZXModm9pZCkKIHsKKwlpbml0X2hwdGVfcGFnZV9zaXplcygpOworCiAJaWYgKCFkZWJ1Z19wYWdlYWxsb2NfZW5hYmxlZCgpKSB7CiAJCS8qCiAJCSAqIFBpY2sgYSBzaXplIGZvciB0aGUgbGluZWFyIG1hcHBpbmcuIEN1cnJlbnRseSwgd2Ugb25seQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0X25vaGFzaC5jIGIvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0X25vaGFzaC5jCmluZGV4IDdkOTViYzQuLmM0OTFmMmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9tbXVfY29udGV4dF9ub2hhc2guYworKysgYi9hcmNoL3Bvd2VycGMvbW0vbW11X2NvbnRleHRfbm9oYXNoLmMKQEAgLTM2OSw0NCArMzY5LDM0IEBACiB9CiAKICNpZmRlZiBDT05GSUdfU01QCi0KLXN0YXRpYyBpbnQgbW11X2NvbnRleHRfY3B1X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCi0JCQkJICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQgbW11X2N0eF9jcHVfcHJlcGFyZSh1bnNpZ25lZCBpbnQgY3B1KQogewotCXVuc2lnbmVkIGludCBjcHUgPSAodW5zaWduZWQgaW50KShsb25nKWhjcHU7Ci0KIAkvKiBXZSBkb24ndCB0b3VjaCBDUFUgMCBtYXAsIGl0J3MgYWxsb2NhdGVkIGF0IGFib290IGFuZCBrZXB0CiAJICogYXJvdW5kIGZvcmV2ZXIKIAkgKi8KIAlpZiAoY3B1ID09IGJvb3RfY3B1aWQpCi0JCXJldHVybiBOT1RJRllfT0s7CisJCXJldHVybiAwOwogCi0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIENQVV9VUF9QUkVQQVJFOgotCWNhc2UgQ1BVX1VQX1BSRVBBUkVfRlJPWkVOOgotCQlwcl9kZXZlbCgiTU1VOiBBbGxvY2F0aW5nIHN0YWxlIGNvbnRleHQgbWFwIGZvciBDUFUgJWRcbiIsIGNwdSk7Ci0JCXN0YWxlX21hcFtjcHVdID0ga3phbGxvYyhDVFhfTUFQX1NJWkUsIEdGUF9LRVJORUwpOwotCQlicmVhazsKLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLQljYXNlIENQVV9VUF9DQU5DRUxFRDoKLQljYXNlIENQVV9VUF9DQU5DRUxFRF9GUk9aRU46Ci0JY2FzZSBDUFVfREVBRDoKLQljYXNlIENQVV9ERUFEX0ZST1pFTjoKLQkJcHJfZGV2ZWwoIk1NVTogRnJlZWluZyBzdGFsZSBjb250ZXh0IG1hcCBmb3IgQ1BVICVkXG4iLCBjcHUpOwotCQlrZnJlZShzdGFsZV9tYXBbY3B1XSk7Ci0JCXN0YWxlX21hcFtjcHVdID0gTlVMTDsKLQotCQkvKiBXZSBhbHNvIGNsZWFyIHRoZSBjcHVfdm1fbWFzayBiaXRzIG9mIENQVXMgZ29pbmcgYXdheSAqLwotCQljbGVhcl90YXNrc19tbV9jcHVtYXNrKGNwdSk7Ci0JYnJlYWs7Ci0jZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCi0JfQotCXJldHVybiBOT1RJRllfT0s7CisJcHJfZGV2ZWwoIk1NVTogQWxsb2NhdGluZyBzdGFsZSBjb250ZXh0IG1hcCBmb3IgQ1BVICVkXG4iLCBjcHUpOworCXN0YWxlX21hcFtjcHVdID0ga3phbGxvYyhDVFhfTUFQX1NJWkUsIEdGUF9LRVJORUwpOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG1tdV9jb250ZXh0X2NwdV9uYiA9IHsKLQkubm90aWZpZXJfY2FsbAk9IG1tdV9jb250ZXh0X2NwdV9ub3RpZnksCi19Oworc3RhdGljIGludCBtbXVfY3R4X2NwdV9kZWFkKHVuc2lnbmVkIGludCBjcHUpCit7CisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJaWYgKGNwdSA9PSBib290X2NwdWlkKQorCQlyZXR1cm4gMDsKKworCXByX2RldmVsKCJNTVU6IEZyZWVpbmcgc3RhbGUgY29udGV4dCBtYXAgZm9yIENQVSAlZFxuIiwgY3B1KTsKKwlrZnJlZShzdGFsZV9tYXBbY3B1XSk7CisJc3RhbGVfbWFwW2NwdV0gPSBOVUxMOworCisJLyogV2UgYWxzbyBjbGVhciB0aGUgY3B1X3ZtX21hc2sgYml0cyBvZiBDUFVzIGdvaW5nIGF3YXkgKi8KKwljbGVhcl90YXNrc19tbV9jcHVtYXNrKGNwdSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KIAogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIApAQCAtNDY5LDcgKzQ1OSw5IEBACiAjZWxzZQogCXN0YWxlX21hcFtib290X2NwdWlkXSA9IG1lbWJsb2NrX3ZpcnRfYWxsb2MoQ1RYX01BUF9TSVpFLCAwKTsKIAotCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmbW11X2NvbnRleHRfY3B1X25iKTsKKwljcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX1BPV0VSUENfTU1VX0NUWF9QUkVQQVJFLAorCQkJCSAgInBvd2VycGMvbW11L2N0eDpwcmVwYXJlIiwKKwkJCQkgIG1tdV9jdHhfY3B1X3ByZXBhcmUsIG1tdV9jdHhfY3B1X2RlYWQpOwogI2VuZGlmCiAKIAlwcmludGsoS0VSTl9JTkZPCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vc2xiX2xvdy5TIGIvYXJjaC9wb3dlcnBjL21tL3NsYl9sb3cuUwppbmRleCBkZmRiOTBjLi45ZjE5ODM0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vc2xiX2xvdy5TCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9zbGJfbG93LlMKQEAgLTExMyw3ICsxMTMsMTIgQEAKIEVORF9NTVVfRlRSX1NFQ1RJT05fSUZDTFIoTU1VX0ZUUl8xVF9TRUdNRU5UKQogCWIJc2xiX2ZpbmlzaF9sb2FkXzFUCiAKLTA6CiswOgkvKgorCSAqIEZvciB1c2Vyc3BhY2UgYWRkcmVzc2VzLCBtYWtlIHN1cmUgdGhpcyBpcyByZWdpb24gMC4KKwkgKi8KKwljbXBkaQlyOSwgMAorCWJuZQk4ZgorCiAJLyogd2hlbiB1c2luZyBzbGljZXMsIHdlIGV4dHJhY3QgdGhlIHBzaXplIG9mZiB0aGUgc2xpY2UgYml0bWFwcwogCSAqIGFuZCB0aGVuIHdlIG5lZWQgdG8gZ2V0IHRoZSBzbGxwIGVuY29kaW5nIG9mZiB0aGUgbW11X3BzaXplX2RlZnMKIAkgKiBhcnJheS4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9tcGM1MTJ4X2xwYmZpZm8uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9tcGM1MTJ4X2xwYmZpZm8uYwppbmRleCA4ZWI4MmIwLi5kOTNkZDRhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvbXBjNTEyeF9scGJmaWZvLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L21wYzUxMnhfbHBiZmlmby5jCkBAIC01MjgsNyArNTI4LDYgQEAKIAkucmVtb3ZlID0gbXBjNTEyeF9scGJmaWZvX3JlbW92ZSwKIAkuZHJpdmVyID0gewogCQkubmFtZSA9IERSVl9OQU1FLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKIAkJLm9mX21hdGNoX3RhYmxlID0gbXBjNTEyeF9scGJmaWZvX21hdGNoLAogCX0sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21jdV9tcGM4MzQ5ZW1pdHguYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tY3VfbXBjODM0OWVtaXR4LmMKaW5kZXggZGJjZDAzMC4uNjNjNWFiNjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tY3VfbXBjODM0OWVtaXR4LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21jdV9tcGM4MzQ5ZW1pdHguYwpAQCAtMjIyLDcgKzIyMiw2IEBACiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbWN1X2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJtY3UtbXBjODM0OWVtaXR4IiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJCS5vZl9tYXRjaF90YWJsZSA9IG1jdV9vZl9tYXRjaF90YWJsZSwKIAl9LAogCS5wcm9iZSA9IG1jdV9wcm9iZSwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvaG9sbHkuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvaG9sbHkuYwppbmRleCBkYWZiYTEwLi5kZmQzMTAwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2hvbGx5LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9ob2xseS5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGFibGUuaD4KIAogI2luY2x1ZGUgPGFzbS90aW1lLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXBjNzQ0OF9ocGMyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L21wYzc0NDhfaHBjMi5jCmluZGV4IDgwODA0ZjkuLmY5N2JhYjggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXBjNzQ0OF9ocGMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuYwpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHRhYmxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zbXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc21wLmMKaW5kZXggODM0ODY4Yi4uMzY2ZTRmNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zbXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NtcC5jCkBAIC04NTIsMzcgKzg1MiwzMyBAQAogCiAjaWZkZWYgQ09ORklHX1BQQzY0CiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi1zdGF0aWMgaW50IHNtcF9jb3JlOTlfY3B1X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCi0JCQkJIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQorc3RhdGljIHVuc2lnbmVkIGludCBzbXBfY29yZTk5X2hvc3Rfb3BlbjsKKworc3RhdGljIGludCBzbXBfY29yZTk5X2NwdV9wcmVwYXJlKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJaW50IHJjOwogCi0Jc3dpdGNoKGFjdGlvbiAmIH5DUFVfVEFTS1NfRlJPWkVOKSB7Ci0JY2FzZSBDUFVfVVBfUFJFUEFSRToKLQkJLyogT3BlbiBpMmMgYnVzIGlmIGl0IHdhcyB1c2VkIGZvciB0YiBzeW5jICovCi0JCWlmIChwbWFjX3RiX2Nsb2NrX2NoaXBfaG9zdCkgewotCQkJcmMgPSBwbWFjX2kyY19vcGVuKHBtYWNfdGJfY2xvY2tfY2hpcF9ob3N0LCAxKTsKLQkJCWlmIChyYykgewotCQkJCXByX2VycigiRmFpbGVkIHRvIG9wZW4gaTJjIGJ1cyBmb3IgdGltZSBzeW5jXG4iKTsKLQkJCQlyZXR1cm4gbm90aWZpZXJfZnJvbV9lcnJubyhyYyk7Ci0JCQl9CisJLyogT3BlbiBpMmMgYnVzIGlmIGl0IHdhcyB1c2VkIGZvciB0YiBzeW5jICovCisJaWYgKHBtYWNfdGJfY2xvY2tfY2hpcF9ob3N0ICYmICFzbXBfY29yZTk5X2hvc3Rfb3BlbikgeworCQlyYyA9IHBtYWNfaTJjX29wZW4ocG1hY190Yl9jbG9ja19jaGlwX2hvc3QsIDEpOworCQlpZiAocmMpIHsKKwkJCXByX2VycigiRmFpbGVkIHRvIG9wZW4gaTJjIGJ1cyBmb3IgdGltZSBzeW5jXG4iKTsKKwkJCXJldHVybiBub3RpZmllcl9mcm9tX2Vycm5vKHJjKTsKIAkJfQotCQlicmVhazsKLQljYXNlIENQVV9PTkxJTkU6Ci0JY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6Ci0JCS8qIENsb3NlIGkyYyBidXMgaWYgaXQgd2FzIHVzZWQgZm9yIHRiIHN5bmMgKi8KLQkJaWYgKHBtYWNfdGJfY2xvY2tfY2hpcF9ob3N0KQotCQkJcG1hY19pMmNfY2xvc2UocG1hY190Yl9jbG9ja19jaGlwX2hvc3QpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKKwkJc21wX2NvcmU5OV9ob3N0X29wZW4gPSAxOwogCX0KLQlyZXR1cm4gTk9USUZZX09LOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHNtcF9jb3JlOTlfY3B1X25iID0gewotCS5ub3RpZmllcl9jYWxsCT0gc21wX2NvcmU5OV9jcHVfbm90aWZ5LAotfTsKK3N0YXRpYyBpbnQgc21wX2NvcmU5OV9jcHVfb25saW5lKHVuc2lnbmVkIGludCBjcHUpCit7CisJLyogQ2xvc2UgaTJjIGJ1cyBpZiBpdCB3YXMgdXNlZCBmb3IgdGIgc3luYyAqLworCWlmIChwbWFjX3RiX2Nsb2NrX2NoaXBfaG9zdCAmJiBzbXBfY29yZTk5X2hvc3Rfb3BlbikgeworCQlwbWFjX2kyY19jbG9zZShwbWFjX3RiX2Nsb2NrX2NoaXBfaG9zdCk7CisJCXNtcF9jb3JlOTlfaG9zdF9vcGVuID0gMDsKKwl9CisJcmV0dXJuIDA7Cit9CiAjZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCiAKIHN0YXRpYyB2b2lkIF9faW5pdCBzbXBfY29yZTk5X2JyaW5ndXBfZG9uZSh2b2lkKQpAQCAtOTAyLDcgKzg5OCwxMSBAQAogCQlnNV9waHlfZGlzYWJsZV9jcHUxKCk7CiAJfQogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmc21wX2NvcmU5OV9jcHVfbmIpOworCWNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfUE9XRVJQQ19QTUFDX1BSRVBBUkUsCisJCQkJICAicG93ZXJwYy9wbWFjOnByZXBhcmUiLCBzbXBfY29yZTk5X2NwdV9wcmVwYXJlLAorCQkJCSAgTlVMTCk7CisJY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9BUF9PTkxJTkVfRFlOLCAicG93ZXJwYy9wbWFjOm9ubGluZSIsCisJCQkJICBzbXBfY29yZTk5X2NwdV9vbmxpbmUsIE5VTEwpOwogI2VuZGlmCiAKIAlpZiAocHBjX21kLnByb2dyZXNzKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtZHVtcC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtZHVtcC5jCmluZGV4IDJlZTk2NDMuLjRjODI3ODIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLWR1bXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1kdW1wLmMKQEAgLTM3MCw2ICszNzAsNyBAQAogCXVpbnQzMl90IGR1bXBfaWQsIGR1bXBfc2l6ZSwgZHVtcF90eXBlOwogCXN0cnVjdCBkdW1wX29iaiAqZHVtcDsKIAljaGFyIG5hbWVbMjJdOworCXN0cnVjdCBrb2JqZWN0ICprb2JqOwogCiAJcmMgPSBkdW1wX3JlYWRfaW5mbygmZHVtcF9pZCwgJmR1bXBfc2l6ZSwgJmR1bXBfdHlwZSk7CiAJaWYgKHJjICE9IE9QQUxfU1VDQ0VTUykKQEAgLTM4MSw4ICszODIsMTIgQEAKIAkgKiB0aGF0IGdyYWNlZnVsbHkgYW5kIG5vdCBjcmVhdGUgdHdvIGNvbmZsaWN0aW5nCiAJICogZW50cmllcy4KIAkgKi8KLQlpZiAoa3NldF9maW5kX29iaihkdW1wX2tzZXQsIG5hbWUpKQorCWtvYmogPSBrc2V0X2ZpbmRfb2JqKGR1bXBfa3NldCwgbmFtZSk7CisJaWYgKGtvYmopIHsKKwkJLyogRHJvcCByZWZlcmVuY2UgYWRkZWQgYnkga3NldF9maW5kX29iaigpICovCisJCWtvYmplY3RfcHV0KGtvYmopOwogCQlyZXR1cm4gMDsKKwl9CiAKIAlkdW1wID0gY3JlYXRlX2R1bXBfb2JqKGR1bXBfaWQsIGR1bXBfc2l6ZSwgZHVtcF90eXBlKTsKIAlpZiAoIWR1bXApCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1lbG9nLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1lbG9nLmMKaW5kZXggMzdmOTU5Yi4uZjIzNDRjYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtZWxvZy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLWVsb2cuYwpAQCAtMjQ3LDYgKzI0Nyw3IEBACiAJdWludDY0X3QgZWxvZ190eXBlOwogCWludCByYzsKIAljaGFyIG5hbWVbMisxNisxXTsKKwlzdHJ1Y3Qga29iamVjdCAqa29iajsKIAogCXJjID0gb3BhbF9nZXRfZWxvZ19zaXplKCZpZCwgJnNpemUsICZ0eXBlKTsKIAlpZiAocmMgIT0gT1BBTF9TVUNDRVNTKSB7CkBAIC0yNjksOCArMjcwLDEyIEBACiAJICogdGhhdCBncmFjZWZ1bGx5IGFuZCBub3QgY3JlYXRlIHR3byBjb25mbGljdGluZwogCSAqIGVudHJpZXMuCiAJICovCi0JaWYgKGtzZXRfZmluZF9vYmooZWxvZ19rc2V0LCBuYW1lKSkKKwlrb2JqID0ga3NldF9maW5kX29iaihlbG9nX2tzZXQsIG5hbWUpOworCWlmIChrb2JqKSB7CisJCS8qIERyb3AgcmVmZXJlbmNlIGFkZGVkIGJ5IGtzZXRfZmluZF9vYmooKSAqLworCQlrb2JqZWN0X3B1dChrb2JqKTsKIAkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KIAogCWNyZWF0ZV9lbG9nX29iaihsb2dfaWQsIGVsb2dfc2l6ZSwgZWxvZ190eXBlKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtd3JhcHBlcnMuUyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLXdyYXBwZXJzLlMKaW5kZXggM2QyOWQ0MC4uNDRkMmQ4NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtd3JhcHBlcnMuUworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC13cmFwcGVycy5TCkBAIC0yMDgsNiArMjA4LDcgQEAKIE9QQUxfQ0FMTChvcGFsX3BjaV9jb25maWdfd3JpdGVfaGFsZl93b3JkLAlPUEFMX1BDSV9DT05GSUdfV1JJVEVfSEFMRl9XT1JEKTsKIE9QQUxfQ0FMTChvcGFsX3BjaV9jb25maWdfd3JpdGVfd29yZCwJCU9QQUxfUENJX0NPTkZJR19XUklURV9XT1JEKTsKIE9QQUxfQ0FMTChvcGFsX3NldF94aXZlLAkJCU9QQUxfU0VUX1hJVkUpOworT1BBTF9DQUxMX1JFQUwob3BhbF9ybV9zZXRfeGl2ZSwJCU9QQUxfU0VUX1hJVkUpOwogT1BBTF9DQUxMKG9wYWxfZ2V0X3hpdmUsCQkJT1BBTF9HRVRfWElWRSk7CiBPUEFMX0NBTEwob3BhbF9yZWdpc3Rlcl9leGNlcHRpb25faGFuZGxlciwJT1BBTF9SRUdJU1RFUl9PUEFMX0VYQ0VQVElPTl9IQU5ETEVSKTsKIE9QQUxfQ0FMTChvcGFsX3BjaV9lZWhfZnJlZXplX3N0YXR1cywJCU9QQUxfUENJX0VFSF9GUkVFWkVfU1RBVFVTKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9wY2ktaW9kYS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3BjaS1pb2RhLmMKaW5kZXggZmQ5NDQ0Zi4uZDMxNGVjYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3BjaS1pb2RhLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3BjaS1pb2RhLmMKQEAgLTEyNCw2ICsxMjQsMTMgQEAKIAkJci0+c3RhcnQgPCAocGhiLT5pb2RhLm02NF9iYXNlICsgcGhiLT5pb2RhLm02NF9zaXplKSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBwbnZfcGNpX2lzX202NF9mbGFncyh1bnNpZ25lZCBsb25nIHJlc291cmNlX2ZsYWdzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAoSU9SRVNPVVJDRV9NRU1fNjQgfCBJT1JFU09VUkNFX1BSRUZFVENIKTsKKworCXJldHVybiAocmVzb3VyY2VfZmxhZ3MgJiBmbGFncykgPT0gZmxhZ3M7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgcG52X2lvZGFfcGUgKnBudl9pb2RhX2luaXRfcGUoc3RydWN0IHBudl9waGIgKnBoYiwgaW50IHBlX25vKQogewogCXBoYi0+aW9kYS5wZV9hcnJheVtwZV9ub10ucGhiID0gcGhiOwpAQCAtMTQ5LDcgKzE1Niw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcG52X2lvZGFfcGUgKnBudl9pb2RhX2FsbG9jX3BlKHN0cnVjdCBwbnZfcGhiICpwaGIpCiB7Ci0JdW5zaWduZWQgbG9uZyBwZSA9IHBoYi0+aW9kYS50b3RhbF9wZV9udW0gLSAxOworCWxvbmcgcGU7CiAKIAlmb3IgKHBlID0gcGhiLT5pb2RhLnRvdGFsX3BlX251bSAtIDE7IHBlID49IDA7IHBlLS0pIHsKIAkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KHBlLCBwaGItPmlvZGEucGVfYWxsb2MpKQpAQCAtMTYyLDExICsxNjksMTIgQEAKIHN0YXRpYyB2b2lkIHBudl9pb2RhX2ZyZWVfcGUoc3RydWN0IHBudl9pb2RhX3BlICpwZSkKIHsKIAlzdHJ1Y3QgcG52X3BoYiAqcGhiID0gcGUtPnBoYjsKKwl1bnNpZ25lZCBpbnQgcGVfbnVtID0gcGUtPnBlX251bWJlcjsKIAogCVdBUk5fT04ocGUtPnBkZXYpOwogCiAJbWVtc2V0KHBlLCAwLCBzaXplb2Yoc3RydWN0IHBudl9pb2RhX3BlKSk7Ci0JY2xlYXJfYml0KHBlLT5wZV9udW1iZXIsIHBoYi0+aW9kYS5wZV9hbGxvYyk7CisJY2xlYXJfYml0KHBlX251bSwgcGhiLT5pb2RhLnBlX2FsbG9jKTsKIH0KIAogLyogVGhlIGRlZmF1bHQgTTY0IEJBUiBpcyBzaGFyZWQgYnkgYWxsIFBFcyAqLwpAQCAtMjIxNiw3ICsyMjI0LDcgQEAKIAogCXBudl9wY2lfbGlua190YWJsZV9hbmRfZ3JvdXAocGhiLT5ob3NlLT5ub2RlLCBudW0sCiAJCQl0YmwsICZwZS0+dGFibGVfZ3JvdXApOwotCXBudl9wY2lfcGhiM190Y2VfaW52YWxpZGF0ZV9wZShwZSk7CisJcG52X3BjaV9pb2RhMl90Y2VfaW52YWxpZGF0ZV9wZShwZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIzNTQsNyArMjM2Miw3IEBACiAJaWYgKHJldCkKIAkJcGVfd2FybihwZSwgIlVubWFwcGluZyBmYWlsZWQsIHJldCA9ICVsZFxuIiwgcmV0KTsKIAllbHNlCi0JCXBudl9wY2lfcGhiM190Y2VfaW52YWxpZGF0ZV9wZShwZSk7CisJCXBudl9wY2lfaW9kYTJfdGNlX2ludmFsaWRhdGVfcGUocGUpOwogCiAJcG52X3BjaV91bmxpbmtfdGFibGVfYW5kX2dyb3VwKHRhYmxlX2dyb3VwLT50YWJsZXNbbnVtXSwgdGFibGVfZ3JvdXApOwogCkBAIC0yNzEwLDE1ICsyNzE4LDIxIEBACiB9CiAKICNpZmRlZiBDT05GSUdfUENJX01TSQotc3RhdGljIHZvaWQgcG52X2lvZGEyX21zaV9lb2koc3RydWN0IGlycV9kYXRhICpkKQoraW50NjRfdCBwbnZfb3BhbF9wY2lfbXNpX2VvaShzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBod19pcnEpCiB7Ci0JdW5zaWduZWQgaW50IGh3X2lycSA9ICh1bnNpZ25lZCBpbnQpaXJxZF90b19od2lycShkKTsKLQlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXAoZCk7CiAJc3RydWN0IHBudl9waGIgKnBoYiA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgcG52X3BoYiwKIAkJCQkJICAgaW9kYS5pcnFfY2hpcCk7Ci0JaW50NjRfdCByYzsKIAotCXJjID0gb3BhbF9wY2lfbXNpX2VvaShwaGItPm9wYWxfaWQsIGh3X2lycSk7CisJcmV0dXJuIG9wYWxfcGNpX21zaV9lb2kocGhiLT5vcGFsX2lkLCBod19pcnEpOworfQorCitzdGF0aWMgdm9pZCBwbnZfaW9kYTJfbXNpX2VvaShzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJaW50NjRfdCByYzsKKwl1bnNpZ25lZCBpbnQgaHdfaXJxID0gKHVuc2lnbmVkIGludClpcnFkX3RvX2h3aXJxKGQpOworCXN0cnVjdCBpcnFfY2hpcCAqY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcChkKTsKKworCXJjID0gcG52X29wYWxfcGNpX21zaV9lb2koY2hpcCwgaHdfaXJxKTsKIAlXQVJOX09OX09OQ0UocmMpOwogCiAJaWNwX25hdGl2ZV9lb2koZCk7CkBAIC0yNzQ4LDYgKzI3NjIsMTYgQEAKIAlpcnFfc2V0X2NoaXAodmlycSwgJnBoYi0+aW9kYS5pcnFfY2hpcCk7CiB9CiAKKy8qCisgKiBSZXR1cm5zIHRydWUgaWZmIGNoaXAgaXMgc29tZXRoaW5nIHRoYXQgd2UgY291bGQgY2FsbAorICogcG52X29wYWxfcGNpX21zaV9lb2kgZm9yLgorICovCitib29sIGlzX3Budl9vcGFsX21zaShzdHJ1Y3QgaXJxX2NoaXAgKmNoaXApCit7CisJcmV0dXJuIGNoaXAtPmlycV9lb2kgPT0gcG52X2lvZGEyX21zaV9lb2k7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpc19wbnZfb3BhbF9tc2kpOworCiBzdGF0aWMgaW50IHBudl9wY2lfaW9kYV9tc2lfc2V0dXAoc3RydWN0IHBudl9waGIgKnBoYiwgc3RydWN0IHBjaV9kZXYgKmRldiwKIAkJCQkgIHVuc2lnbmVkIGludCBod2lycSwgdW5zaWduZWQgaW50IHZpcnEsCiAJCQkJICB1bnNpZ25lZCBpbnQgaXNfNjQsIHN0cnVjdCBtc2lfbXNnICptc2cpCkBAIC0yODcwLDcgKzI4OTQsNyBAQAogCQlyZXMgPSAmcGRldi0+cmVzb3VyY2VbaSArIFBDSV9JT1ZfUkVTT1VSQ0VTXTsKIAkJaWYgKCFyZXMtPmZsYWdzIHx8IHJlcy0+cGFyZW50KQogCQkJY29udGludWU7Ci0JCWlmICghcG52X3BjaV9pc19tNjQocGhiLCByZXMpKSB7CisJCWlmICghcG52X3BjaV9pc19tNjRfZmxhZ3MocmVzLT5mbGFncykpIHsKIAkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJEb24ndCBzdXBwb3J0IFNSLUlPViB3aXRoIgogCQkJCQkiIG5vbiBNNjQgVkYgQkFSJWQ6ICVwUi4gXG4iLAogCQkJCSBpLCByZXMpOwpAQCAtMzA5NSw3ICszMTE5LDcgQEAKIAkgKiBhbGlnbm1lbnQgZm9yIGFueSA2NC1iaXQgcmVzb3VyY2UsIFBDSWUgZG9lc24ndCBjYXJlIGFuZAogCSAqIGJyaWRnZXMgb25seSBkbyA2NC1iaXQgcHJlZmV0Y2hhYmxlIGFueXdheS4KIAkgKi8KLQlpZiAocGhiLT5pb2RhLm02NF9zZWdzaXplICYmICh0eXBlICYgSU9SRVNPVVJDRV9NRU1fNjQpKQorCWlmIChwaGItPmlvZGEubTY0X3NlZ3NpemUgJiYgcG52X3BjaV9pc19tNjRfZmxhZ3ModHlwZSkpCiAJCXJldHVybiBwaGItPmlvZGEubTY0X3NlZ3NpemU7CiAJaWYgKHR5cGUgJiBJT1JFU09VUkNFX01FTSkKIAkJcmV0dXJuIHBoYi0+aW9kYS5tMzJfc2Vnc2l6ZTsKQEAgLTM0MDIsMTIgKzM0MjYsNiBAQAogCXN0cnVjdCBwbnZfcGhiICpwaGIgPSBwZS0+cGhiOwogCXN0cnVjdCBwbnZfaW9kYV9wZSAqc2xhdmUsICp0bXA7CiAKLQkvKiBSZWxlYXNlIHNsYXZlIFBFcyBpbiBjb21wb3VuZCBQRSAqLwotCWlmIChwZS0+ZmxhZ3MgJiBQTlZfSU9EQV9QRV9NQVNURVIpIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNsYXZlLCB0bXAsICZwZS0+c2xhdmVzLCBsaXN0KQotCQkJcG52X2lvZGFfcmVsZWFzZV9wZShzbGF2ZSk7Ci0JfQotCiAJbGlzdF9kZWwoJnBlLT5saXN0KTsKIAlzd2l0Y2ggKHBoYi0+dHlwZSkgewogCWNhc2UgUE5WX1BIQl9JT0RBMToKQEAgLTM0MjIsNyArMzQ0MCwyNiBAQAogCiAJcG52X2lvZGFfcmVsZWFzZV9wZV9zZWcocGUpOwogCXBudl9pb2RhX2RlY29uZmlndXJlX3BlKHBlLT5waGIsIHBlKTsKLQlwbnZfaW9kYV9mcmVlX3BlKHBlKTsKKworCS8qIFJlbGVhc2Ugc2xhdmUgUEVzIGluIHRoZSBjb21wb3VuZCBQRSAqLworCWlmIChwZS0+ZmxhZ3MgJiBQTlZfSU9EQV9QRV9NQVNURVIpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNsYXZlLCB0bXAsICZwZS0+c2xhdmVzLCBsaXN0KSB7CisJCQlsaXN0X2RlbCgmc2xhdmUtPmxpc3QpOworCQkJcG52X2lvZGFfZnJlZV9wZShzbGF2ZSk7CisJCX0KKwl9CisKKwkvKgorCSAqIFRoZSBQRSBmb3Igcm9vdCBidXMgY2FuIGJlIHJlbW92ZWQgYmVjYXVzZSBvZiBob3RwbHVnIGluIEVFSAorCSAqIHJlY292ZXJ5IGZvciBmZW5jZWQgUEhCIGVycm9yLiBXZSBuZWVkIHRvIG1hcmsgdGhlIFBFIGRlYWQgc28KKwkgKiB0aGF0IGl0IGNhbiBiZSBwb3B1bGF0ZWQgYWdhaW4gaW4gUENJIGhvdCBhZGQgcGF0aC4gVGhlIFBFCisJICogc2hvdWxkbid0IGJlIGRlc3Ryb3llZCBhcyBpdCdzIHRoZSBnbG9iYWwgcmVzZXJ2ZWQgcmVzb3VyY2UuCisJICovCisJaWYgKHBoYi0+aW9kYS5yb290X3BlX3BvcHVsYXRlZCAmJgorCSAgICBwaGItPmlvZGEucm9vdF9wZV9pZHggPT0gcGUtPnBlX251bWJlcikKKwkJcGhiLT5pb2RhLnJvb3RfcGVfcG9wdWxhdGVkID0gZmFsc2U7CisJZWxzZQorCQlwbnZfaW9kYV9mcmVlX3BlKHBlKTsKIH0KIAogc3RhdGljIHZvaWQgcG52X3BjaV9yZWxlYXNlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKQEAgLTM0MzgsNyArMzQ3NSwxNyBAQAogCWlmICghcGRuIHx8IHBkbi0+cGVfbnVtYmVyID09IElPREFfSU5WQUxJRF9QRSkKIAkJcmV0dXJuOwogCisJLyoKKwkgKiBQQ0kgaG90cGx1ZyBjYW4gaGFwcGVuIGFzIHBhcnQgb2YgRUVIIGVycm9yIHJlY292ZXJ5LiBUaGUgQHBkbgorCSAqIGlzbid0IHJlbW92ZWQgYW5kIGFkZGVkIGFmdGVyd2FyZHMgaW4gdGhpcyBzY2VuYXJpby4gV2Ugc2hvdWxkCisJICogc2V0IHRoZSBQRSBudW1iZXIgaW4gQHBkbiB0byBhbiBpbnZhbGlkIG9uZS4gT3RoZXJ3aXNlLCB0aGUgUEUncworCSAqIGRldmljZSBjb3VudCBpcyBkZWNyZWFzZWQgb24gcmVtb3ZpbmcgZGV2aWNlcyB3aGlsZSBmYWlsaW5nIHRvCisJICogYmUgaW5jcmVhc2VkIG9uIGFkZGluZyBkZXZpY2VzLiBJdCBsZWFkcyB0byB1bmJhbGFuY2VkIFBFJ3MgZGV2aWNlCisJICogY291bnQgYW5kIGV2ZW50dWFsbHkgbWFrZSBub3JtYWwgUENJIGhvdHBsdWcgcGF0aCBicm9rZW4uCisJICovCiAJcGUgPSAmcGhiLT5pb2RhLnBlX2FycmF5W3Bkbi0+cGVfbnVtYmVyXTsKKwlwZG4tPnBlX251bWJlciA9IElPREFfSU5WQUxJRF9QRTsKKwogCVdBUk5fT04oLS1wZS0+ZGV2aWNlX2NvdW50IDwgMCk7CiAJaWYgKHBlLT5kZXZpY2VfY291bnQgPT0gMCkKIAkJcG52X2lvZGFfcmVsZWFzZV9wZShwZSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpLmMKaW5kZXggZmUxNmE1MC4uMDllYmE1YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2kuYwpAQCAtMTE5LDYgKzExOSwxMCBAQAogCiAJYnVzID0gYnJpZGdlLT5idXM7CiAKKwkvKiBSZWx5IG9uIHRoZSBwY2liaW9zX2ZyZWVfY29udHJvbGxlcl9kZWZlcnJlZCgpIGNhbGxiYWNrLiAqLworCXBjaV9zZXRfaG9zdF9icmlkZ2VfcmVsZWFzZShicmlkZ2UsIHBjaWJpb3NfZnJlZV9jb250cm9sbGVyX2RlZmVycmVkLAorCQkJCQkodm9pZCAqKSBwY2lfYnVzX3RvX2hvc3QoYnVzKSk7CisKIAlkbiA9IHBjaWJpb3NfZ2V0X3BoYl9vZl9ub2RlKGJ1cyk7CiAJaWYgKCFkbikKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpX2RscGFyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpX2RscGFyLmMKaW5kZXggOTA2ZGJhYS4uNTQ3ZmQxMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaV9kbHBhci5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2lfZGxwYXIuYwpAQCAtMTA2LDggKzEwNiwxMSBAQAogCQlyZWxlYXNlX3Jlc291cmNlKHJlcyk7CiAJfQogCi0JLyogRnJlZSBwY2lfY29udHJvbGxlciBkYXRhIHN0cnVjdHVyZSAqLwotCXBjaWJpb3NfZnJlZV9jb250cm9sbGVyKHBoYik7CisJLyoKKwkgKiBUaGUgcGNpX2NvbnRyb2xsZXIgZGF0YSBzdHJ1Y3R1cmUgaXMgZnJlZWQgYnkKKwkgKiB0aGUgcGNpYmlvc19mcmVlX2NvbnRyb2xsZXJfZGVmZXJyZWQoKSBjYWxsYmFjazsKKwkgKiBzZWUgcHNlcmllc19yb290X2JyaWRnZV9wcmVwYXJlKCkuCisJICovCiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NldHVwLmMKaW5kZXggNGZmY2FhNi4uYTM5ZDIwZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NldHVwLmMKQEAgLTQxLDcgKzQxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9yb290X2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KIAogI2luY2x1ZGUgPGFzbS9tbXUuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CkBAIC02Niw2ICs2NSw3IEBACiAjaW5jbHVkZSA8YXNtL2VlaC5oPgogI2luY2x1ZGUgPGFzbS9yZWcuaD4KICNpbmNsdWRlIDxhc20vcGxwYXJfd3JhcHBlcnMuaD4KKyNpbmNsdWRlIDxhc20va2V4ZWMuaD4KIAogI2luY2x1ZGUgInBzZXJpZXMuaCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9jcG0xLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2NwbTEuYwppbmRleCA2YzExMDk5Li44MWQ0OTQ3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2NwbTEuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2NwbTEuYwpAQCAtNTM0LDcgKzUzNCw4IEBACiAKIHN0YXRpYyB2b2lkIGNwbTFfZ3BpbzE2X3NhdmVfcmVncyhzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbV9nYykKIHsKLQlzdHJ1Y3QgY3BtMV9ncGlvMTZfY2hpcCAqY3BtMV9nYyA9IGdwaW9jaGlwX2dldF9kYXRhKCZtbV9nYy0+Z2MpOworCXN0cnVjdCBjcG0xX2dwaW8xNl9jaGlwICpjcG0xX2djID0KKwkJY29udGFpbmVyX29mKG1tX2djLCBzdHJ1Y3QgY3BtMV9ncGlvMTZfY2hpcCwgbW1fZ2MpOwogCXN0cnVjdCBjcG1faW9wb3J0MTYgX19pb21lbSAqaW9wID0gbW1fZ2MtPnJlZ3M7CiAKIAljcG0xX2djLT5jcGRhdGEgPSBpbl9iZTE2KCZpb3AtPmRhdCk7CkBAIC02NDksNyArNjUwLDggQEAKIAogc3RhdGljIHZvaWQgY3BtMV9ncGlvMzJfc2F2ZV9yZWdzKHN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tX2djKQogewotCXN0cnVjdCBjcG0xX2dwaW8zMl9jaGlwICpjcG0xX2djID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoJm1tX2djLT5nYyk7CisJc3RydWN0IGNwbTFfZ3BpbzMyX2NoaXAgKmNwbTFfZ2MgPQorCQljb250YWluZXJfb2YobW1fZ2MsIHN0cnVjdCBjcG0xX2dwaW8zMl9jaGlwLCBtbV9nYyk7CiAJc3RydWN0IGNwbV9pb3BvcnQzMmIgX19pb21lbSAqaW9wID0gbW1fZ2MtPnJlZ3M7CiAKIAljcG0xX2djLT5jcGRhdGEgPSBpbl9iZTMyKCZpb3AtPmRhdCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2NwbV9jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvY3BtX2NvbW1vbi5jCmluZGV4IDkxMTQ1NmQuLjk0N2Y0MjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvY3BtX2NvbW1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvY3BtX2NvbW1vbi5jCkBAIC05NCw3ICs5NCw4IEBACiAKIHN0YXRpYyB2b2lkIGNwbTJfZ3BpbzMyX3NhdmVfcmVncyhzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbV9nYykKIHsKLQlzdHJ1Y3QgY3BtMl9ncGlvMzJfY2hpcCAqY3BtMl9nYyA9IGdwaW9jaGlwX2dldF9kYXRhKCZtbV9nYy0+Z2MpOworCXN0cnVjdCBjcG0yX2dwaW8zMl9jaGlwICpjcG0yX2djID0KKwkJY29udGFpbmVyX29mKG1tX2djLCBzdHJ1Y3QgY3BtMl9ncGlvMzJfY2hpcCwgbW1fZ2MpOwogCXN0cnVjdCBjcG0yX2lvcG9ydHMgX19pb21lbSAqaW9wID0gbW1fZ2MtPnJlZ3M7CiAKIAljcG0yX2djLT5jcGRhdGEgPSBpbl9iZTMyKCZpb3AtPmRhdCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9yaW8uYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3Jpby5jCmluZGV4IDY4ZTdjMGQuLjNjYzdjYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3Jpby5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3Jpby5jCkBAIC0yMyw3ICsyMyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHRhYmxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi94aWNzL2ljcC1vcGFsLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3hpY3MvaWNwLW9wYWwuYwppbmRleCA1N2Q3MmYxLi45MTE0MjQzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3hpY3MvaWNwLW9wYWwuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3hpY3MvaWNwLW9wYWwuYwpAQCAtMjMsMTAgKzIzLDEwIEBACiAKIHN0YXRpYyB2b2lkIGljcF9vcGFsX3RlYXJkb3duX2NwdSh2b2lkKQogewotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJaW50IGh3X2NwdSA9IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpOwogCiAJLyogQ2xlYXIgYW55IHBlbmRpbmcgSVBJICovCi0Jb3BhbF9pbnRfc2V0X21mcnIoY3B1LCAweGZmKTsKKwlvcGFsX2ludF9zZXRfbWZycihod19jcHUsIDB4ZmYpOwogfQogCiBzdGF0aWMgdm9pZCBpY3Bfb3BhbF9mbHVzaF9pcGkodm9pZCkKQEAgLTEwMSwxNCArMTAxLDE2IEBACiAKIHN0YXRpYyB2b2lkIGljcF9vcGFsX2NhdXNlX2lwaShpbnQgY3B1LCB1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jb3BhbF9pbnRfc2V0X21mcnIoY3B1LCBJUElfUFJJT1JJVFkpOworCWludCBod19jcHUgPSBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGNwdSk7CisKKwlvcGFsX2ludF9zZXRfbWZycihod19jcHUsIElQSV9QUklPUklUWSk7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBpY3Bfb3BhbF9pcGlfYWN0aW9uKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCWludCBod19jcHUgPSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKTsKIAotCW9wYWxfaW50X3NldF9tZnJyKGNwdSwgMHhmZik7CisJb3BhbF9pbnRfc2V0X21mcnIoaHdfY3B1LCAweGZmKTsKIAogCXJldHVybiBzbXBfaXBpX2RlbXV4KCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvS2NvbmZpZyBiL2FyY2gvczM5MC9LY29uZmlnCmluZGV4IGU3NTFmZTIuLmRlZWFkZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9LY29uZmlnCisrKyBiL2FyY2gvczM5MC9LY29uZmlnCkBAIC02OCwxMiArNjgsMTIgQEAKIGNvbmZpZyBTMzkwCiAJZGVmX2Jvb2wgeQogCXNlbGVjdCBBUkNIX0hBU19BVE9NSUM2NF9ERUNfSUZfUE9TSVRJVkUKLQlzZWxlY3QgQVJDSF9IQVNfREVCVUdfU1RSSUNUX1VTRVJfQ09QWV9DSEVDS1MKIAlzZWxlY3QgQVJDSF9IQVNfREVWTUVNX0lTX0FMTE9XRUQKIAlzZWxlY3QgQVJDSF9IQVNfRUxGX1JBTkRPTUlaRQogCXNlbGVjdCBBUkNIX0hBU19HQ09WX1BST0ZJTEVfQUxMCiAJc2VsZWN0IEFSQ0hfSEFTX0tDT1YKIAlzZWxlY3QgQVJDSF9IQVNfU0dfQ0hBSU4KKwlzZWxlY3QgQVJDSF9IQVNfVUJTQU5fU0FOSVRJWkVfQUxMCiAJc2VsZWN0IEFSQ0hfSEFWRV9OTUlfU0FGRV9DTVBYQ0hHCiAJc2VsZWN0IEFSQ0hfSU5MSU5FX1JFQURfTE9DSwogCXNlbGVjdCBBUkNIX0lOTElORV9SRUFEX0xPQ0tfQkgKQEAgLTExMCw2ICsxMTAsNyBAQAogCXNlbGVjdCBBUkNIX1VTRV9DTVBYQ0hHX0xPQ0tSRUYKIAlzZWxlY3QgQVJDSF9XQU5UU19EWU5BTUlDX1RBU0tfU1RSVUNUCiAJc2VsZWN0IEFSQ0hfV0FOVFNfUFJPVF9OVU1BX1BST1RfTk9ORQorCXNlbGVjdCBBUkNIX1dBTlRTX1VCU0FOX05PX05VTEwKIAlzZWxlY3QgQVJDSF9XQU5UX0lQQ19QQVJTRV9WRVJTSU9OCiAJc2VsZWN0IEJVSUxEVElNRV9FWFRBQkxFX1NPUlQKIAlzZWxlY3QgQ0xPTkVfQkFDS1dBUkRTMgpAQCAtMTM3LDYgKzEzOCw3IEBACiAJc2VsZWN0IEhBVkVfRE1BX0FQSV9ERUJVRwogCXNlbGVjdCBIQVZFX0RZTkFNSUNfRlRSQUNFCiAJc2VsZWN0IEhBVkVfRFlOQU1JQ19GVFJBQ0VfV0lUSF9SRUdTCisJc2VsZWN0IEhBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1MKIAlzZWxlY3QgSEFWRV9FWElUX1RIUkVBRAogCXNlbGVjdCBIQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JECiAJc2VsZWN0IEhBVkVfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvTWFrZWZpbGUgYi9hcmNoL3MzOTAvTWFrZWZpbGUKaW5kZXggMjI0YjQyNy4uNTRlMDA1MiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL01ha2VmaWxlCisrKyBiL2FyY2gvczM5MC9NYWtlZmlsZQpAQCAtNDYsNiArNDYsOCBAQAogY2ZsYWdzLSQoQ09ORklHX01BUkNIX1pFQzEyX1RVTkUpCSs9IC1tdHVuZT16RUMxMgogY2ZsYWdzLSQoQ09ORklHX01BUkNIX1oxM19UVU5FKQkrPSAtbXR1bmU9ejEzCiAKK2NmbGFncy15ICs9IC1XYSwtSSQoc3JjdHJlZSkvYXJjaC8kKEFSQ0gpL2luY2x1ZGUKKwogI0tCVUlMRF9JTUFHRSBpcyBuZWNlc3NhcnkgZm9yIG1ha2UgcnBtCiBLQlVJTERfSU1BR0UJOj1hcmNoL3MzOTAvYm9vdC9pbWFnZQogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvYXBwbGRhdGEvYXBwbGRhdGFfYmFzZS5jIGIvYXJjaC9zMzkwL2FwcGxkYXRhL2FwcGxkYXRhX2Jhc2UuYwppbmRleCAxNWM5NDI0Li5mNTg3YzQ4IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvYXBwbGRhdGEvYXBwbGRhdGFfYmFzZS5jCisrKyBiL2FyY2gvczM5MC9hcHBsZGF0YS9hcHBsZGF0YV9iYXNlLmMKQEAgLTU0Miw3ICs1NDIsNyBAQAogCQlyYyA9IFBUUl9FUlIoYXBwbGRhdGFfcGRldik7CiAJCWdvdG8gb3V0X2RyaXZlcjsKIAl9Ci0JYXBwbGRhdGFfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiYXBwbGRhdGEiKTsKKwlhcHBsZGF0YV93cSA9IGFsbG9jX29yZGVyZWRfd29ya3F1ZXVlKCJhcHBsZGF0YSIsIDApOwogCWlmICghYXBwbGRhdGFfd3EpIHsKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIG91dF9kZXZpY2U7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlIGIvYXJjaC9zMzkwL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQppbmRleCAzM2JhNjk3Yy4uMGRhYTA3MCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQorKysgYi9hcmNoL3MzOTAvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCkBAIC0xNyw2ICsxNyw3IEBACiBLQlVJTERfQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLWZmcmVlc3RhbmRpbmcpCiAKIEdDT1ZfUFJPRklMRSA6PSBuCitVQlNBTl9TQU5JVElaRSA6PSBuCiAKIE9CSkVDVFMgOj0gJChhZGRwcmVmaXggJChvYmp0cmVlKS9hcmNoL3MzOTAva2VybmVsLywgaGVhZC5vIHNjbHAubyBlYmNkaWMubyBhbHMubykKIE9CSkVDVFMgKz0gJChvYmopL2hlYWQubyAkKG9iaikvbWlzYy5vICQob2JqKS9waWdneS5vCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvYm9vdC9jb21wcmVzc2VkL2hlYWQuUyBiL2FyY2gvczM5MC9ib290L2NvbXByZXNzZWQvaGVhZC5TCmluZGV4IGY4NmE0ZWUuLjI4YzRmOTYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9ib290L2NvbXByZXNzZWQvaGVhZC5TCisrKyBiL2FyY2gvczM5MC9ib290L2NvbXByZXNzZWQvaGVhZC5TCkBAIC0yMSwxNiArMjEsMjEgQEAKIAlsZwklcjE1LC5Mc3RhY2stLkxQRzEoJXIxMykKIAlhZ2hpCSVyMTUsLTE2MAogCWJyYXNsCSVyMTQsZGVjb21wcmVzc19rZXJuZWwKLQkjIHNldHVwIHJlZ2lzdGVycyBmb3IgbWVtb3J5IG1vdmVyICYgYnJhbmNoIHRvIHRhcmdldAorCSMgU2V0IHVwIHJlZ2lzdGVycyBmb3IgbWVtb3J5IG1vdmVyLiBXZSBtb3ZlIHRoZSBkZWNvbXByZXNzZWQgaW1hZ2UgdG8KKwkjIDB4MTEwMDAsIHN0YXJ0aW5nIGF0IG9mZnNldCAweDExMDAwIGluIHRoZSBkZWNvbXByZXNzZWQgaW1hZ2Ugc28KKwkjIHRoYXQgY29kZSBsaXZpbmcgYXQgMHgxMTAwMCBpbiB0aGUgaW1hZ2Ugd2lsbCBlbmQgdXAgYXQgMHgxMTAwMCBpbgorCSMgbWVtb3J5LgogCWxncgklcjQsJXIyCiAJbGcJJXIyLC5Mb2Zmc2V0LS5MUEcxKCVyMTMpCiAJbGEJJXI0LDAoJXIyLCVyNCkKIAlsZwklcjMsLkxtdnNpemUtLkxQRzEoJXIxMykKIAlsZ3IJJXI1LCVyMwotCSMgbW92ZSB0aGUgbWVtb3J5IG1vdmVyIHNvbWVwbGFjZSBzYWZlCisJIyBNb3ZlIHRoZSBtZW1vcnkgbW92ZXIgc29tZXBsYWNlIHNhZmUgc28gaXQgZG9lc24ndCBvdmVyd3JpdGUgaXRzZWxmLgogCWxhCSVyMSwweDIwMAogCW12YwkwKG1vdmVyX2VuZC1tb3ZlciwlcjEpLG1vdmVyLS5MUEcxKCVyMTMpCi0JIyBkZWNvbXByZXNzIGltYWdlIGlzIHN0YXJ0ZWQgYXQgMHgxMTAwMAorCSMgV2hlbiB0aGUgbWVtb3J5IG1vdmVyIGlzIGRvbmUgd2UgcGFzcyBjb250cm9sIHRvCisJIyBhcmNoL3MzOTAva2VybmVsL2hlYWQ2NC5TOnN0YXJ0dXBfY29udGludWUgd2hpY2ggbGl2ZXMgYXQgMHgxMTAwMCBpbgorCSMgdGhlIGRlY29tcHJlc3NlZCBpbWFnZS4KIAlsZ3IJJXI2LCVyMgogCWJyCSVyMQogbW92ZXI6CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvY29uZmlncy9kZWZhdWx0X2RlZmNvbmZpZyBiL2FyY2gvczM5MC9jb25maWdzL2RlZmF1bHRfZGVmY29uZmlnCmluZGV4IDg4OWVhMzQuLjQ1OTY4NjggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jb25maWdzL2RlZmF1bHRfZGVmY29uZmlnCisrKyBiL2FyY2gvczM5MC9jb25maWdzL2RlZmF1bHRfZGVmY29uZmlnCkBAIC0yNjAsNyArMjYwLDYgQEAKIENPTkZJR19ORl9UQUJMRVNfSVBWND1tCiBDT05GSUdfTkZUX0NIQUlOX1JPVVRFX0lQVjQ9bQogQ09ORklHX05GX1RBQkxFU19BUlA9bQotQ09ORklHX05GX05BVF9JUFY0PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjQ9bQogQ09ORklHX0lQX05GX0lQVEFCTEVTPW0KIENPTkZJR19JUF9ORl9NQVRDSF9BSD1tCkBAIC0yNjksNiArMjY4LDggQEAKIENPTkZJR19JUF9ORl9NQVRDSF9UVEw9bQogQ09ORklHX0lQX05GX0ZJTFRFUj1tCiBDT05GSUdfSVBfTkZfVEFSR0VUX1JFSkVDVD1tCitDT05GSUdfSVBfTkZfTkFUPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfTUFTUVVFUkFERT1tCiBDT05GSUdfSVBfTkZfTUFOR0xFPW0KIENPTkZJR19JUF9ORl9UQVJHRVRfQ0xVU1RFUklQPW0KIENPTkZJR19JUF9ORl9UQVJHRVRfRUNOPW0KQEAgLTI4MSw3ICsyODIsNiBAQAogQ09ORklHX05GX0NPTk5UUkFDS19JUFY2PW0KIENPTkZJR19ORl9UQUJMRVNfSVBWNj1tCiBDT05GSUdfTkZUX0NIQUlOX1JPVVRFX0lQVjY9bQotQ09ORklHX05GX05BVF9JUFY2PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjY9bQogQ09ORklHX0lQNl9ORl9JUFRBQkxFUz1tCiBDT05GSUdfSVA2X05GX01BVENIX0FIPW0KQEAgLTI5OSw2ICsyOTksOCBAQAogQ09ORklHX0lQNl9ORl9NQU5HTEU9bQogQ09ORklHX0lQNl9ORl9SQVc9bQogQ09ORklHX0lQNl9ORl9TRUNVUklUWT1tCitDT05GSUdfSVA2X05GX05BVD1tCitDT05GSUdfSVA2X05GX1RBUkdFVF9NQVNRVUVSQURFPW0KIENPTkZJR19ORl9UQUJMRVNfQlJJREdFPW0KIENPTkZJR19ORVRfU0NUUFBST0JFPW0KIENPTkZJR19SRFM9bQpAQCAtMzU5LDYgKzM2MSw3IEBACiBDT05GSUdfTkVUX0FDVF9TS0JFRElUPW0KIENPTkZJR19ORVRfQUNUX0NTVU09bQogQ09ORklHX0ROU19SRVNPTFZFUj15CitDT05GSUdfQ0dST1VQX05FVF9QUklPPXkKIENPTkZJR19CUEZfSklUPXkKIENPTkZJR19ORVRfUEtUR0VOPW0KIENPTkZJR19ORVRfVENQUFJPQkU9bQpAQCAtNDA5LDYgKzQxMiw3IEBACiBDT05GSUdfQkxLX0RFVl9ETT1tCiBDT05GSUdfRE1fQ1JZUFQ9bQogQ09ORklHX0RNX1NOQVBTSE9UPW0KK0NPTkZJR19ETV9USElOX1BST1ZJU0lPTklORz1tCiBDT05GSUdfRE1fTUlSUk9SPW0KIENPTkZJR19ETV9MT0dfVVNFUlNQQUNFPW0KIENPTkZJR19ETV9SQUlEPW0KQEAgLTQyOCw2ICs0MzIsNyBAQAogQ09ORklHX0lGQj1tCiBDT05GSUdfTUFDVkxBTj1tCiBDT05GSUdfTUFDVlRBUD1tCitDT05GSUdfSVBWTEFOPW0KIENPTkZJR19WWExBTj1tCiBDT05GSUdfVFVOPW0KIENPTkZJR19WRVRIPW0KQEAgLTQ1Myw3ICs0NTgsNiBAQAogIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAogIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAotQ09ORklHX0RFVlBUU19NVUxUSVBMRV9JTlNUQU5DRVM9eQogQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MAogQ09ORklHX0hXX1JBTkRPTV9WSVJUSU89bQogQ09ORklHX1JBV19EUklWRVI9bQpAQCAtNDk1LDYgKzQ5OSw3IEBACiBDT05GSUdfQVVUT0ZTNF9GUz1tCiBDT05GSUdfRlVTRV9GUz15CiBDT05GSUdfQ1VTRT1tCitDT05GSUdfT1ZFUkxBWV9GUz1tCiBDT05GSUdfRlNDQUNIRT1tCiBDT05GSUdfQ0FDSEVGSUxFUz1tCiBDT05GSUdfSVNPOTY2MF9GUz15CkBAIC02MDIsNyArNjA3LDYgQEAKIENPTkZJR19GQVVMVF9JTkpFQ1RJT05fREVCVUdfRlM9eQogQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9TVEFDS1RSQUNFX0ZJTFRFUj15CiBDT05GSUdfTEFURU5DWVRPUD15Ci1DT05GSUdfREVCVUdfU1RSSUNUX1VTRVJfQ09QWV9DSEVDS1M9eQogQ09ORklHX0lSUVNPRkZfVFJBQ0VSPXkKIENPTkZJR19QUkVFTVBUX1RSQUNFUj15CiBDT05GSUdfU0NIRURfVFJBQ0VSPXkKQEAgLTY3OCw3ICs2ODIsNyBAQAogQ09ORklHX0NSWVBUT19ERVNfUzM5MD1tCiBDT05GSUdfQ1JZUFRPX0FFU19TMzkwPW0KIENPTkZJR19DUllQVE9fR0hBU0hfUzM5MD1tCi1DT05GSUdfQ1JZUFRPX0NSQzMyX1MzOTA9bQorQ09ORklHX0NSWVBUT19DUkMzMl9TMzkwPXkKIENPTkZJR19BU1lNTUVUUklDX0tFWV9UWVBFPXkKIENPTkZJR19BU1lNTUVUUklDX1BVQkxJQ19LRVlfU1VCVFlQRT1tCiBDT05GSUdfWDUwOV9DRVJUSUZJQ0FURV9QQVJTRVI9bQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NvbmZpZ3MvZ2Nvdl9kZWZjb25maWcgYi9hcmNoL3MzOTAvY29uZmlncy9nY292X2RlZmNvbmZpZwppbmRleCAxYmNmZDc2Li4xZGQwNWUzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvY29uZmlncy9nY292X2RlZmNvbmZpZworKysgYi9hcmNoL3MzOTAvY29uZmlncy9nY292X2RlZmNvbmZpZwpAQCAtMTUsNiArMTUsOCBAQAogQ09ORklHX01FTUNHPXkKIENPTkZJR19NRU1DR19TV0FQPXkKIENPTkZJR19CTEtfQ0dST1VQPXkKK0NPTkZJR19DRlNfQkFORFdJRFRIPXkKK0NPTkZJR19SVF9HUk9VUF9TQ0hFRD15CiBDT05GSUdfQ0dST1VQX1BJRFM9eQogQ09ORklHX0NHUk9VUF9GUkVFWkVSPXkKIENPTkZJR19DR1JPVVBfSFVHRVRMQj15CkBAIC0yNTUsNyArMjU3LDYgQEAKIENPTkZJR19ORl9UQUJMRVNfSVBWND1tCiBDT05GSUdfTkZUX0NIQUlOX1JPVVRFX0lQVjQ9bQogQ09ORklHX05GX1RBQkxFU19BUlA9bQotQ09ORklHX05GX05BVF9JUFY0PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjQ9bQogQ09ORklHX0lQX05GX0lQVEFCTEVTPW0KIENPTkZJR19JUF9ORl9NQVRDSF9BSD1tCkBAIC0yNjQsNiArMjY1LDggQEAKIENPTkZJR19JUF9ORl9NQVRDSF9UVEw9bQogQ09ORklHX0lQX05GX0ZJTFRFUj1tCiBDT05GSUdfSVBfTkZfVEFSR0VUX1JFSkVDVD1tCitDT05GSUdfSVBfTkZfTkFUPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfTUFTUVVFUkFERT1tCiBDT05GSUdfSVBfTkZfTUFOR0xFPW0KIENPTkZJR19JUF9ORl9UQVJHRVRfQ0xVU1RFUklQPW0KIENPTkZJR19JUF9ORl9UQVJHRVRfRUNOPW0KQEAgLTI3Niw3ICsyNzksNiBAQAogQ09ORklHX05GX0NPTk5UUkFDS19JUFY2PW0KIENPTkZJR19ORl9UQUJMRVNfSVBWNj1tCiBDT05GSUdfTkZUX0NIQUlOX1JPVVRFX0lQVjY9bQotQ09ORklHX05GX05BVF9JUFY2PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjY9bQogQ09ORklHX0lQNl9ORl9JUFRBQkxFUz1tCiBDT05GSUdfSVA2X05GX01BVENIX0FIPW0KQEAgLTI5NCw2ICsyOTYsOCBAQAogQ09ORklHX0lQNl9ORl9NQU5HTEU9bQogQ09ORklHX0lQNl9ORl9SQVc9bQogQ09ORklHX0lQNl9ORl9TRUNVUklUWT1tCitDT05GSUdfSVA2X05GX05BVD1tCitDT05GSUdfSVA2X05GX1RBUkdFVF9NQVNRVUVSQURFPW0KIENPTkZJR19ORl9UQUJMRVNfQlJJREdFPW0KIENPTkZJR19ORVRfU0NUUFBST0JFPW0KIENPTkZJR19SRFM9bQpAQCAtMzUzLDYgKzM1Nyw3IEBACiBDT05GSUdfTkVUX0FDVF9TS0JFRElUPW0KIENPTkZJR19ORVRfQUNUX0NTVU09bQogQ09ORklHX0ROU19SRVNPTFZFUj15CitDT05GSUdfQ0dST1VQX05FVF9QUklPPXkKIENPTkZJR19CUEZfSklUPXkKIENPTkZJR19ORVRfUEtUR0VOPW0KIENPTkZJR19ORVRfVENQUFJPQkU9bQpAQCAtNDAzLDYgKzQwOCw3IEBACiBDT05GSUdfQkxLX0RFVl9ETT1tCiBDT05GSUdfRE1fQ1JZUFQ9bQogQ09ORklHX0RNX1NOQVBTSE9UPW0KK0NPTkZJR19ETV9USElOX1BST1ZJU0lPTklORz1tCiBDT05GSUdfRE1fTUlSUk9SPW0KIENPTkZJR19ETV9MT0dfVVNFUlNQQUNFPW0KIENPTkZJR19ETV9SQUlEPW0KQEAgLTQyMiw2ICs0MjgsNyBAQAogQ09ORklHX0lGQj1tCiBDT05GSUdfTUFDVkxBTj1tCiBDT05GSUdfTUFDVlRBUD1tCitDT05GSUdfSVBWTEFOPW0KIENPTkZJR19WWExBTj1tCiBDT05GSUdfVFVOPW0KIENPTkZJR19WRVRIPW0KQEAgLTQ0Nyw3ICs0NTQsNiBAQAogIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAogIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAotQ09ORklHX0RFVlBUU19NVUxUSVBMRV9JTlNUQU5DRVM9eQogQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MAogQ09ORklHX0hXX1JBTkRPTV9WSVJUSU89bQogQ09ORklHX1JBV19EUklWRVI9bQpAQCAtNDg3LDYgKzQ5Myw3IEBACiBDT05GSUdfQVVUT0ZTNF9GUz1tCiBDT05GSUdfRlVTRV9GUz15CiBDT05GSUdfQ1VTRT1tCitDT05GSUdfT1ZFUkxBWV9GUz1tCiBDT05GSUdfRlNDQUNIRT1tCiBDT05GSUdfQ0FDSEVGSUxFUz1tCiBDT05GSUdfSVNPOTY2MF9GUz15CkBAIC01NTIsNyArNTU5LDYgQEAKIENPTkZJR19DUFVfTk9USUZJRVJfRVJST1JfSU5KRUNUPW0KIENPTkZJR19QTV9OT1RJRklFUl9FUlJPUl9JTkpFQ1Q9bQogQ09ORklHX0xBVEVOQ1lUT1A9eQotQ09ORklHX0RFQlVHX1NUUklDVF9VU0VSX0NPUFlfQ0hFQ0tTPXkKIENPTkZJR19CTEtfREVWX0lPX1RSQUNFPXkKICMgQ09ORklHX0tQUk9CRV9FVkVOVCBpcyBub3Qgc2V0CiBDT05GSUdfVFJBQ0VfRU5VTV9NQVBfRklMRT15CkBAIC02MTYsNyArNjIyLDcgQEAKIENPTkZJR19DUllQVE9fREVTX1MzOTA9bQogQ09ORklHX0NSWVBUT19BRVNfUzM5MD1tCiBDT05GSUdfQ1JZUFRPX0dIQVNIX1MzOTA9bQotQ09ORklHX0NSWVBUT19DUkMzMl9TMzkwPW0KK0NPTkZJR19DUllQVE9fQ1JDMzJfUzM5MD15CiBDT05GSUdfQVNZTU1FVFJJQ19LRVlfVFlQRT15CiBDT05GSUdfQVNZTU1FVFJJQ19QVUJMSUNfS0VZX1NVQlRZUEU9bQogQ09ORklHX1g1MDlfQ0VSVElGSUNBVEVfUEFSU0VSPW0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jb25maWdzL3BlcmZvcm1hbmNlX2RlZmNvbmZpZyBiL2FyY2gvczM5MC9jb25maWdzL3BlcmZvcm1hbmNlX2RlZmNvbmZpZwppbmRleCAxM2ZmMDkwLi4yOWQxMTc4IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvY29uZmlncy9wZXJmb3JtYW5jZV9kZWZjb25maWcKKysrIGIvYXJjaC9zMzkwL2NvbmZpZ3MvcGVyZm9ybWFuY2VfZGVmY29uZmlnCkBAIC0xNiw2ICsxNiw4IEBACiBDT05GSUdfTUVNQ0c9eQogQ09ORklHX01FTUNHX1NXQVA9eQogQ09ORklHX0JMS19DR1JPVVA9eQorQ09ORklHX0NGU19CQU5EV0lEVEg9eQorQ09ORklHX1JUX0dST1VQX1NDSEVEPXkKIENPTkZJR19DR1JPVVBfUElEUz15CiBDT05GSUdfQ0dST1VQX0ZSRUVaRVI9eQogQ09ORklHX0NHUk9VUF9IVUdFVExCPXkKQEAgLTI1NSw3ICsyNTcsNiBAQAogQ09ORklHX05GX1RBQkxFU19JUFY0PW0KIENPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWND1tCiBDT05GSUdfTkZfVEFCTEVTX0FSUD1tCi1DT05GSUdfTkZfTkFUX0lQVjQ9bQogQ09ORklHX05GVF9DSEFJTl9OQVRfSVBWND1tCiBDT05GSUdfSVBfTkZfSVBUQUJMRVM9bQogQ09ORklHX0lQX05GX01BVENIX0FIPW0KQEAgLTI2NCw2ICsyNjUsOCBAQAogQ09ORklHX0lQX05GX01BVENIX1RUTD1tCiBDT05GSUdfSVBfTkZfRklMVEVSPW0KIENPTkZJR19JUF9ORl9UQVJHRVRfUkVKRUNUPW0KK0NPTkZJR19JUF9ORl9OQVQ9bQorQ09ORklHX0lQX05GX1RBUkdFVF9NQVNRVUVSQURFPW0KIENPTkZJR19JUF9ORl9NQU5HTEU9bQogQ09ORklHX0lQX05GX1RBUkdFVF9DTFVTVEVSSVA9bQogQ09ORklHX0lQX05GX1RBUkdFVF9FQ049bQpAQCAtMjc2LDcgKzI3OSw2IEBACiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjY9bQogQ09ORklHX05GX1RBQkxFU19JUFY2PW0KIENPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWNj1tCi1DT05GSUdfTkZfTkFUX0lQVjY9bQogQ09ORklHX05GVF9DSEFJTl9OQVRfSVBWNj1tCiBDT05GSUdfSVA2X05GX0lQVEFCTEVTPW0KIENPTkZJR19JUDZfTkZfTUFUQ0hfQUg9bQpAQCAtMjk0LDYgKzI5Niw4IEBACiBDT05GSUdfSVA2X05GX01BTkdMRT1tCiBDT05GSUdfSVA2X05GX1JBVz1tCiBDT05GSUdfSVA2X05GX1NFQ1VSSVRZPW0KK0NPTkZJR19JUDZfTkZfTkFUPW0KK0NPTkZJR19JUDZfTkZfVEFSR0VUX01BU1FVRVJBREU9bQogQ09ORklHX05GX1RBQkxFU19CUklER0U9bQogQ09ORklHX05FVF9TQ1RQUFJPQkU9bQogQ09ORklHX1JEUz1tCkBAIC0zNTMsNiArMzU3LDcgQEAKIENPTkZJR19ORVRfQUNUX1NLQkVESVQ9bQogQ09ORklHX05FVF9BQ1RfQ1NVTT1tCiBDT05GSUdfRE5TX1JFU09MVkVSPXkKK0NPTkZJR19DR1JPVVBfTkVUX1BSSU89eQogQ09ORklHX0JQRl9KSVQ9eQogQ09ORklHX05FVF9QS1RHRU49bQogQ09ORklHX05FVF9UQ1BQUk9CRT1tCkBAIC00MDMsNiArNDA4LDcgQEAKIENPTkZJR19CTEtfREVWX0RNPW0KIENPTkZJR19ETV9DUllQVD1tCiBDT05GSUdfRE1fU05BUFNIT1Q9bQorQ09ORklHX0RNX1RISU5fUFJPVklTSU9OSU5HPW0KIENPTkZJR19ETV9NSVJST1I9bQogQ09ORklHX0RNX0xPR19VU0VSU1BBQ0U9bQogQ09ORklHX0RNX1JBSUQ9bQpAQCAtNDIyLDYgKzQyOCw3IEBACiBDT05GSUdfSUZCPW0KIENPTkZJR19NQUNWTEFOPW0KIENPTkZJR19NQUNWVEFQPW0KK0NPTkZJR19JUFZMQU49bQogQ09ORklHX1ZYTEFOPW0KIENPTkZJR19UVU49bQogQ09ORklHX1ZFVEg9bQpAQCAtNDQ3LDcgKzQ1NCw2IEBACiAjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0Ci1DT05GSUdfREVWUFRTX01VTFRJUExFX0lOU1RBTkNFUz15CiBDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0wCiBDT05GSUdfSFdfUkFORE9NX1ZJUlRJTz1tCiBDT05GSUdfUkFXX0RSSVZFUj1tCkBAIC00ODgsNiArNDk0LDcgQEAKIENPTkZJR19BVVRPRlM0X0ZTPW0KIENPTkZJR19GVVNFX0ZTPXkKIENPTkZJR19DVVNFPW0KK0NPTkZJR19PVkVSTEFZX0ZTPW0KIENPTkZJR19GU0NBQ0hFPW0KIENPTkZJR19DQUNIRUZJTEVTPW0KIENPTkZJR19JU085NjYwX0ZTPXkKQEAgLTU0OSw3ICs1NTYsNiBAQAogQ09ORklHX1JDVV9UT1JUVVJFX1RFU1Q9bQogQ09ORklHX1JDVV9DUFVfU1RBTExfVElNRU9VVD02MAogQ09ORklHX0xBVEVOQ1lUT1A9eQotQ09ORklHX0RFQlVHX1NUUklDVF9VU0VSX0NPUFlfQ0hFQ0tTPXkKIENPTkZJR19TQ0hFRF9UUkFDRVI9eQogQ09ORklHX0ZUUkFDRV9TWVNDQUxMUz15CiBDT05GSUdfU1RBQ0tfVFJBQ0VSPXkKQEAgLTYxNSw3ICs2MjEsNyBAQAogQ09ORklHX0NSWVBUT19ERVNfUzM5MD1tCiBDT05GSUdfQ1JZUFRPX0FFU19TMzkwPW0KIENPTkZJR19DUllQVE9fR0hBU0hfUzM5MD1tCi1DT05GSUdfQ1JZUFRPX0NSQzMyX1MzOTA9bQorQ09ORklHX0NSWVBUT19DUkMzMl9TMzkwPXkKIENPTkZJR19BU1lNTUVUUklDX0tFWV9UWVBFPXkKIENPTkZJR19BU1lNTUVUUklDX1BVQkxJQ19LRVlfU1VCVFlQRT1tCiBDT05GSUdfWDUwOV9DRVJUSUZJQ0FURV9QQVJTRVI9bQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NyeXB0by9hZXNfczM5MC5jIGIvYXJjaC9zMzkwL2NyeXB0by9hZXNfczM5MC5jCmluZGV4IDJlYTE4YjAuLjMwM2QyOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jcnlwdG8vYWVzX3MzOTAuYworKysgYi9hcmNoL3MzOTAvY3J5cHRvL2Flc19zMzkwLmMKQEAgLTMxLDY5ICszMSwyOSBAQAogI2luY2x1ZGUgPGNyeXB0by94dHMuaD4KICNpbmNsdWRlIDxhc20vY3BhY2YuaD4KIAotI2RlZmluZSBBRVNfS0VZTEVOXzEyOAkJMQotI2RlZmluZSBBRVNfS0VZTEVOXzE5MgkJMgotI2RlZmluZSBBRVNfS0VZTEVOXzI1NgkJNAotCiBzdGF0aWMgdTggKmN0cmJsazsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY3RyYmxrX2xvY2spOwotc3RhdGljIGNoYXIga2V5bGVuX2ZsYWc7CisKK3N0YXRpYyBjcGFjZl9tYXNrX3Qga21fZnVuY3Rpb25zLCBrbWNfZnVuY3Rpb25zLCBrbWN0cl9mdW5jdGlvbnM7CiAKIHN0cnVjdCBzMzkwX2Flc19jdHggewogCXU4IGtleVtBRVNfTUFYX0tFWV9TSVpFXTsKLQlsb25nIGVuYzsKLQlsb25nIGRlYzsKIAlpbnQga2V5X2xlbjsKKwl1bnNpZ25lZCBsb25nIGZjOwogCXVuaW9uIHsKIAkJc3RydWN0IGNyeXB0b19za2NpcGhlciAqYmxrOwogCQlzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqY2lwOwogCX0gZmFsbGJhY2s7CiB9OwogCi1zdHJ1Y3QgcGNjX3BhcmFtIHsKLQl1OCBrZXlbMzJdOwotCXU4IHR3ZWFrWzE2XTsKLQl1OCBibG9ja1sxNl07Ci0JdTggYml0WzE2XTsKLQl1OCB4dHNbMTZdOwotfTsKLQogc3RydWN0IHMzOTBfeHRzX2N0eCB7CiAJdTgga2V5WzMyXTsKIAl1OCBwY2Nfa2V5WzMyXTsKLQlsb25nIGVuYzsKLQlsb25nIGRlYzsKIAlpbnQga2V5X2xlbjsKKwl1bnNpZ25lZCBsb25nIGZjOwogCXN0cnVjdCBjcnlwdG9fc2tjaXBoZXIgKmZhbGxiYWNrOwogfTsKIAotLyoKLSAqIENoZWNrIGlmIHRoZSBrZXlfbGVuIGlzIHN1cHBvcnRlZCBieSB0aGUgSFcuCi0gKiBSZXR1cm5zIDAgaWYgaXQgaXMsIGEgcG9zaXRpdmUgbnVtYmVyIGlmIGl0IGlzIG5vdCBhbmQgc29mdHdhcmUgZmFsbGJhY2sgaXMKLSAqIHJlcXVpcmVkIG9yIGEgbmVnYXRpdmUgbnVtYmVyIGluIGNhc2UgdGhlIGtleSBzaXplIGlzIG5vdCB2YWxpZAotICovCi1zdGF0aWMgaW50IG5lZWRfZmFsbGJhY2sodW5zaWduZWQgaW50IGtleV9sZW4pCi17Ci0Jc3dpdGNoIChrZXlfbGVuKSB7Ci0JY2FzZSAxNjoKLQkJaWYgKCEoa2V5bGVuX2ZsYWcgJiBBRVNfS0VZTEVOXzEyOCkpCi0JCQlyZXR1cm4gMTsKLQkJYnJlYWs7Ci0JY2FzZSAyNDoKLQkJaWYgKCEoa2V5bGVuX2ZsYWcgJiBBRVNfS0VZTEVOXzE5MikpCi0JCQlyZXR1cm4gMTsKLQkJYnJlYWs7Ci0JY2FzZSAzMjoKLQkJaWYgKCEoa2V5bGVuX2ZsYWcgJiBBRVNfS0VZTEVOXzI1NikpCi0JCQlyZXR1cm4gMTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC0xOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgc2V0a2V5X2ZhbGxiYWNrX2NpcChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqaW5fa2V5LAogCQl1bnNpZ25lZCBpbnQga2V5X2xlbikKIHsKQEAgLTExNyw3MiArNzcsNDQgQEAKIAkJICAgICAgIHVuc2lnbmVkIGludCBrZXlfbGVuKQogewogCXN0cnVjdCBzMzkwX2Flc19jdHggKnNjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwotCXUzMiAqZmxhZ3MgPSAmdGZtLT5jcnRfZmxhZ3M7Ci0JaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZjOwogCi0JcmV0ID0gbmVlZF9mYWxsYmFjayhrZXlfbGVuKTsKLQlpZiAocmV0IDwgMCkgewotCQkqZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9MRU47Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KKwkvKiBQaWNrIHRoZSBjb3JyZWN0IGZ1bmN0aW9uIGNvZGUgYmFzZWQgb24gdGhlIGtleSBsZW5ndGggKi8KKwlmYyA9IChrZXlfbGVuID09IDE2KSA/IENQQUNGX0tNX0FFU18xMjggOgorCSAgICAgKGtleV9sZW4gPT0gMjQpID8gQ1BBQ0ZfS01fQUVTXzE5MiA6CisJICAgICAoa2V5X2xlbiA9PSAzMikgPyBDUEFDRl9LTV9BRVNfMjU2IDogMDsKKworCS8qIENoZWNrIGlmIHRoZSBmdW5jdGlvbiBjb2RlIGlzIGF2YWlsYWJsZSAqLworCXNjdHgtPmZjID0gKGZjICYmIGNwYWNmX3Rlc3RfZnVuYygma21fZnVuY3Rpb25zLCBmYykpID8gZmMgOiAwOworCWlmICghc2N0eC0+ZmMpCisJCXJldHVybiBzZXRrZXlfZmFsbGJhY2tfY2lwKHRmbSwgaW5fa2V5LCBrZXlfbGVuKTsKIAogCXNjdHgtPmtleV9sZW4gPSBrZXlfbGVuOwotCWlmICghcmV0KSB7Ci0JCW1lbWNweShzY3R4LT5rZXksIGluX2tleSwga2V5X2xlbik7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiBzZXRrZXlfZmFsbGJhY2tfY2lwKHRmbSwgaW5fa2V5LCBrZXlfbGVuKTsKKwltZW1jcHkoc2N0eC0+a2V5LCBpbl9rZXksIGtleV9sZW4pOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBhZXNfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0LCBjb25zdCB1OCAqaW4pCiB7CiAJc3RydWN0IHMzOTBfYWVzX2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAKLQlpZiAodW5saWtlbHkobmVlZF9mYWxsYmFjayhzY3R4LT5rZXlfbGVuKSkpIHsKKwlpZiAodW5saWtlbHkoIXNjdHgtPmZjKSkgewogCQljcnlwdG9fY2lwaGVyX2VuY3J5cHRfb25lKHNjdHgtPmZhbGxiYWNrLmNpcCwgb3V0LCBpbik7CiAJCXJldHVybjsKIAl9Ci0KLQlzd2l0Y2ggKHNjdHgtPmtleV9sZW4pIHsKLQljYXNlIDE2OgotCQljcGFjZl9rbShDUEFDRl9LTV9BRVNfMTI4X0VOQywgJnNjdHgtPmtleSwgb3V0LCBpbiwKLQkJCSBBRVNfQkxPQ0tfU0laRSk7Ci0JCWJyZWFrOwotCWNhc2UgMjQ6Ci0JCWNwYWNmX2ttKENQQUNGX0tNX0FFU18xOTJfRU5DLCAmc2N0eC0+a2V5LCBvdXQsIGluLAotCQkJIEFFU19CTE9DS19TSVpFKTsKLQkJYnJlYWs7Ci0JY2FzZSAzMjoKLQkJY3BhY2Zfa20oQ1BBQ0ZfS01fQUVTXzI1Nl9FTkMsICZzY3R4LT5rZXksIG91dCwgaW4sCi0JCQkgQUVTX0JMT0NLX1NJWkUpOwotCQlicmVhazsKLQl9CisJY3BhY2Zfa20oc2N0eC0+ZmMsICZzY3R4LT5rZXksIG91dCwgaW4sIEFFU19CTE9DS19TSVpFKTsKIH0KIAogc3RhdGljIHZvaWQgYWVzX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCwgY29uc3QgdTggKmluKQogewogCXN0cnVjdCBzMzkwX2Flc19jdHggKnNjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCi0JaWYgKHVubGlrZWx5KG5lZWRfZmFsbGJhY2soc2N0eC0+a2V5X2xlbikpKSB7CisJaWYgKHVubGlrZWx5KCFzY3R4LT5mYykpIHsKIAkJY3J5cHRvX2NpcGhlcl9kZWNyeXB0X29uZShzY3R4LT5mYWxsYmFjay5jaXAsIG91dCwgaW4pOwogCQlyZXR1cm47CiAJfQotCi0Jc3dpdGNoIChzY3R4LT5rZXlfbGVuKSB7Ci0JY2FzZSAxNjoKLQkJY3BhY2Zfa20oQ1BBQ0ZfS01fQUVTXzEyOF9ERUMsICZzY3R4LT5rZXksIG91dCwgaW4sCi0JCQkgQUVTX0JMT0NLX1NJWkUpOwotCQlicmVhazsKLQljYXNlIDI0OgotCQljcGFjZl9rbShDUEFDRl9LTV9BRVNfMTkyX0RFQywgJnNjdHgtPmtleSwgb3V0LCBpbiwKLQkJCSBBRVNfQkxPQ0tfU0laRSk7Ci0JCWJyZWFrOwotCWNhc2UgMzI6Ci0JCWNwYWNmX2ttKENQQUNGX0tNX0FFU18yNTZfREVDLCAmc2N0eC0+a2V5LCBvdXQsIGluLAotCQkJIEFFU19CTE9DS19TSVpFKTsKLQkJYnJlYWs7Ci0JfQorCWNwYWNmX2ttKHNjdHgtPmZjIHwgQ1BBQ0ZfREVDUllQVCwKKwkJICZzY3R4LT5rZXksIG91dCwgaW4sIEFFU19CTE9DS19TSVpFKTsKIH0KIAogc3RhdGljIGludCBmYWxsYmFja19pbml0X2NpcChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQpAQCAtMjkxLDUwICsyMjMsMzcgQEAKIAkJCSAgIHVuc2lnbmVkIGludCBrZXlfbGVuKQogewogCXN0cnVjdCBzMzkwX2Flc19jdHggKnNjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwotCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBmYzsKIAotCXJldCA9IG5lZWRfZmFsbGJhY2soa2V5X2xlbik7Ci0JaWYgKHJldCA+IDApIHsKLQkJc2N0eC0+a2V5X2xlbiA9IGtleV9sZW47CisJLyogUGljayB0aGUgY29ycmVjdCBmdW5jdGlvbiBjb2RlIGJhc2VkIG9uIHRoZSBrZXkgbGVuZ3RoICovCisJZmMgPSAoa2V5X2xlbiA9PSAxNikgPyBDUEFDRl9LTV9BRVNfMTI4IDoKKwkgICAgIChrZXlfbGVuID09IDI0KSA/IENQQUNGX0tNX0FFU18xOTIgOgorCSAgICAgKGtleV9sZW4gPT0gMzIpID8gQ1BBQ0ZfS01fQUVTXzI1NiA6IDA7CisKKwkvKiBDaGVjayBpZiB0aGUgZnVuY3Rpb24gY29kZSBpcyBhdmFpbGFibGUgKi8KKwlzY3R4LT5mYyA9IChmYyAmJiBjcGFjZl90ZXN0X2Z1bmMoJmttX2Z1bmN0aW9ucywgZmMpKSA/IGZjIDogMDsKKwlpZiAoIXNjdHgtPmZjKQogCQlyZXR1cm4gc2V0a2V5X2ZhbGxiYWNrX2Jsayh0Zm0sIGluX2tleSwga2V5X2xlbik7Ci0JfQogCi0Jc3dpdGNoIChrZXlfbGVuKSB7Ci0JY2FzZSAxNjoKLQkJc2N0eC0+ZW5jID0gQ1BBQ0ZfS01fQUVTXzEyOF9FTkM7Ci0JCXNjdHgtPmRlYyA9IENQQUNGX0tNX0FFU18xMjhfREVDOwotCQlicmVhazsKLQljYXNlIDI0OgotCQlzY3R4LT5lbmMgPSBDUEFDRl9LTV9BRVNfMTkyX0VOQzsKLQkJc2N0eC0+ZGVjID0gQ1BBQ0ZfS01fQUVTXzE5Ml9ERUM7Ci0JCWJyZWFrOwotCWNhc2UgMzI6Ci0JCXNjdHgtPmVuYyA9IENQQUNGX0tNX0FFU18yNTZfRU5DOwotCQlzY3R4LT5kZWMgPSBDUEFDRl9LTV9BRVNfMjU2X0RFQzsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGFlc19zZXRfa2V5KHRmbSwgaW5fa2V5LCBrZXlfbGVuKTsKKwlzY3R4LT5rZXlfbGVuID0ga2V5X2xlbjsKKwltZW1jcHkoc2N0eC0+a2V5LCBpbl9rZXksIGtleV9sZW4pOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGVjYl9hZXNfY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCBsb25nIGZ1bmMsIHZvaWQgKnBhcmFtLAorc3RhdGljIGludCBlY2JfYWVzX2NyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgdW5zaWduZWQgbG9uZyBtb2RpZmllciwKIAkJCSBzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgKndhbGspCiB7Ci0JaW50IHJldCA9IGJsa2NpcGhlcl93YWxrX3ZpcnQoZGVzYywgd2Fsayk7Ci0JdW5zaWduZWQgaW50IG5ieXRlczsKKwlzdHJ1Y3QgczM5MF9hZXNfY3R4ICpzY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKKwl1bnNpZ25lZCBpbnQgbmJ5dGVzLCBuOworCWludCByZXQ7CiAKLQl3aGlsZSAoKG5ieXRlcyA9IHdhbGstPm5ieXRlcykpIHsKKwlyZXQgPSBibGtjaXBoZXJfd2Fsa192aXJ0KGRlc2MsIHdhbGspOworCXdoaWxlICgobmJ5dGVzID0gd2Fsay0+bmJ5dGVzKSA+PSBBRVNfQkxPQ0tfU0laRSkgewogCQkvKiBvbmx5IHVzZSBjb21wbGV0ZSBibG9ja3MgKi8KLQkJdW5zaWduZWQgaW50IG4gPSBuYnl0ZXMgJiB+KEFFU19CTE9DS19TSVpFIC0gMSk7Ci0JCXU4ICpvdXQgPSB3YWxrLT5kc3QudmlydC5hZGRyOwotCQl1OCAqaW4gPSB3YWxrLT5zcmMudmlydC5hZGRyOwotCi0JCXJldCA9IGNwYWNmX2ttKGZ1bmMsIHBhcmFtLCBvdXQsIGluLCBuKTsKLQkJaWYgKHJldCA8IDAgfHwgcmV0ICE9IG4pCi0JCQlyZXR1cm4gLUVJTzsKLQotCQluYnl0ZXMgJj0gQUVTX0JMT0NLX1NJWkUgLSAxOwotCQlyZXQgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsIHdhbGssIG5ieXRlcyk7CisJCW4gPSBuYnl0ZXMgJiB+KEFFU19CTE9DS19TSVpFIC0gMSk7CisJCWNwYWNmX2ttKHNjdHgtPmZjIHwgbW9kaWZpZXIsIHNjdHgtPmtleSwKKwkJCSB3YWxrLT5kc3QudmlydC5hZGRyLCB3YWxrLT5zcmMudmlydC5hZGRyLCBuKTsKKwkJcmV0ID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCB3YWxrLCBuYnl0ZXMgLSBuKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtMzQ3LDExICsyNjYsMTEgQEAKIAlzdHJ1Y3QgczM5MF9hZXNfY3R4ICpzY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKIAlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKIAotCWlmICh1bmxpa2VseShuZWVkX2ZhbGxiYWNrKHNjdHgtPmtleV9sZW4pKSkKKwlpZiAodW5saWtlbHkoIXNjdHgtPmZjKSkKIAkJcmV0dXJuIGZhbGxiYWNrX2Jsa19lbmMoZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7CiAKIAlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKLQlyZXR1cm4gZWNiX2Flc19jcnlwdChkZXNjLCBzY3R4LT5lbmMsIHNjdHgtPmtleSwgJndhbGspOworCXJldHVybiBlY2JfYWVzX2NyeXB0KGRlc2MsIDAsICZ3YWxrKTsKIH0KIAogc3RhdGljIGludCBlY2JfYWVzX2RlY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLApAQCAtMzYxLDExICsyODAsMTEgQEAKIAlzdHJ1Y3QgczM5MF9hZXNfY3R4ICpzY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKIAlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKIAotCWlmICh1bmxpa2VseShuZWVkX2ZhbGxiYWNrKHNjdHgtPmtleV9sZW4pKSkKKwlpZiAodW5saWtlbHkoIXNjdHgtPmZjKSkKIAkJcmV0dXJuIGZhbGxiYWNrX2Jsa19kZWMoZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7CiAKIAlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKLQlyZXR1cm4gZWNiX2Flc19jcnlwdChkZXNjLCBzY3R4LT5kZWMsIHNjdHgtPmtleSwgJndhbGspOworCXJldHVybiBlY2JfYWVzX2NyeXB0KGRlc2MsIENQQUNGX0RFQ1JZUFQsICZ3YWxrKTsKIH0KIAogc3RhdGljIGludCBmYWxsYmFja19pbml0X2JsayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQpAQCAtNDIwLDY0ICszMzksNDUgQEAKIAkJCSAgIHVuc2lnbmVkIGludCBrZXlfbGVuKQogewogCXN0cnVjdCBzMzkwX2Flc19jdHggKnNjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwotCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBmYzsKIAotCXJldCA9IG5lZWRfZmFsbGJhY2soa2V5X2xlbik7Ci0JaWYgKHJldCA+IDApIHsKLQkJc2N0eC0+a2V5X2xlbiA9IGtleV9sZW47CisJLyogUGljayB0aGUgY29ycmVjdCBmdW5jdGlvbiBjb2RlIGJhc2VkIG9uIHRoZSBrZXkgbGVuZ3RoICovCisJZmMgPSAoa2V5X2xlbiA9PSAxNikgPyBDUEFDRl9LTUNfQUVTXzEyOCA6CisJICAgICAoa2V5X2xlbiA9PSAyNCkgPyBDUEFDRl9LTUNfQUVTXzE5MiA6CisJICAgICAoa2V5X2xlbiA9PSAzMikgPyBDUEFDRl9LTUNfQUVTXzI1NiA6IDA7CisKKwkvKiBDaGVjayBpZiB0aGUgZnVuY3Rpb24gY29kZSBpcyBhdmFpbGFibGUgKi8KKwlzY3R4LT5mYyA9IChmYyAmJiBjcGFjZl90ZXN0X2Z1bmMoJmttY19mdW5jdGlvbnMsIGZjKSkgPyBmYyA6IDA7CisJaWYgKCFzY3R4LT5mYykKIAkJcmV0dXJuIHNldGtleV9mYWxsYmFja19ibGsodGZtLCBpbl9rZXksIGtleV9sZW4pOwotCX0KIAotCXN3aXRjaCAoa2V5X2xlbikgewotCWNhc2UgMTY6Ci0JCXNjdHgtPmVuYyA9IENQQUNGX0tNQ19BRVNfMTI4X0VOQzsKLQkJc2N0eC0+ZGVjID0gQ1BBQ0ZfS01DX0FFU18xMjhfREVDOwotCQlicmVhazsKLQljYXNlIDI0OgotCQlzY3R4LT5lbmMgPSBDUEFDRl9LTUNfQUVTXzE5Ml9FTkM7Ci0JCXNjdHgtPmRlYyA9IENQQUNGX0tNQ19BRVNfMTkyX0RFQzsKLQkJYnJlYWs7Ci0JY2FzZSAzMjoKLQkJc2N0eC0+ZW5jID0gQ1BBQ0ZfS01DX0FFU18yNTZfRU5DOwotCQlzY3R4LT5kZWMgPSBDUEFDRl9LTUNfQUVTXzI1Nl9ERUM7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBhZXNfc2V0X2tleSh0Zm0sIGluX2tleSwga2V5X2xlbik7CisJc2N0eC0+a2V5X2xlbiA9IGtleV9sZW47CisJbWVtY3B5KHNjdHgtPmtleSwgaW5fa2V5LCBrZXlfbGVuKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjYmNfYWVzX2NyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgbG9uZyBmdW5jLAorc3RhdGljIGludCBjYmNfYWVzX2NyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgdW5zaWduZWQgbG9uZyBtb2RpZmllciwKIAkJCSBzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgKndhbGspCiB7CiAJc3RydWN0IHMzOTBfYWVzX2N0eCAqc2N0eCA9IGNyeXB0b19ibGtjaXBoZXJfY3R4KGRlc2MtPnRmbSk7Ci0JaW50IHJldCA9IGJsa2NpcGhlcl93YWxrX3ZpcnQoZGVzYywgd2Fsayk7Ci0JdW5zaWduZWQgaW50IG5ieXRlcyA9IHdhbGstPm5ieXRlczsKKwl1bnNpZ25lZCBpbnQgbmJ5dGVzLCBuOworCWludCByZXQ7CiAJc3RydWN0IHsKIAkJdTggaXZbQUVTX0JMT0NLX1NJWkVdOwogCQl1OCBrZXlbQUVTX01BWF9LRVlfU0laRV07CiAJfSBwYXJhbTsKIAotCWlmICghbmJ5dGVzKQotCQlnb3RvIG91dDsKLQorCXJldCA9IGJsa2NpcGhlcl93YWxrX3ZpcnQoZGVzYywgd2Fsayk7CiAJbWVtY3B5KHBhcmFtLml2LCB3YWxrLT5pdiwgQUVTX0JMT0NLX1NJWkUpOwogCW1lbWNweShwYXJhbS5rZXksIHNjdHgtPmtleSwgc2N0eC0+a2V5X2xlbik7Ci0JZG8geworCXdoaWxlICgobmJ5dGVzID0gd2Fsay0+bmJ5dGVzKSA+PSBBRVNfQkxPQ0tfU0laRSkgewogCQkvKiBvbmx5IHVzZSBjb21wbGV0ZSBibG9ja3MgKi8KLQkJdW5zaWduZWQgaW50IG4gPSBuYnl0ZXMgJiB+KEFFU19CTE9DS19TSVpFIC0gMSk7Ci0JCXU4ICpvdXQgPSB3YWxrLT5kc3QudmlydC5hZGRyOwotCQl1OCAqaW4gPSB3YWxrLT5zcmMudmlydC5hZGRyOwotCi0JCXJldCA9IGNwYWNmX2ttYyhmdW5jLCAmcGFyYW0sIG91dCwgaW4sIG4pOwotCQlpZiAocmV0IDwgMCB8fCByZXQgIT0gbikKLQkJCXJldHVybiAtRUlPOwotCi0JCW5ieXRlcyAmPSBBRVNfQkxPQ0tfU0laRSAtIDE7Ci0JCXJldCA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgd2FsaywgbmJ5dGVzKTsKLQl9IHdoaWxlICgobmJ5dGVzID0gd2Fsay0+bmJ5dGVzKSk7CisJCW4gPSBuYnl0ZXMgJiB+KEFFU19CTE9DS19TSVpFIC0gMSk7CisJCWNwYWNmX2ttYyhzY3R4LT5mYyB8IG1vZGlmaWVyLCAmcGFyYW0sCisJCQkgIHdhbGstPmRzdC52aXJ0LmFkZHIsIHdhbGstPnNyYy52aXJ0LmFkZHIsIG4pOworCQlyZXQgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsIHdhbGssIG5ieXRlcyAtIG4pOworCX0KIAltZW1jcHkod2Fsay0+aXYsIHBhcmFtLml2LCBBRVNfQkxPQ0tfU0laRSk7Ci0KLW91dDoKIAlyZXR1cm4gcmV0OwogfQogCkBAIC00ODgsMTEgKzM4OCwxMSBAQAogCXN0cnVjdCBzMzkwX2Flc19jdHggKnNjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOwogCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwogCi0JaWYgKHVubGlrZWx5KG5lZWRfZmFsbGJhY2soc2N0eC0+a2V5X2xlbikpKQorCWlmICh1bmxpa2VseSghc2N0eC0+ZmMpKQogCQlyZXR1cm4gZmFsbGJhY2tfYmxrX2VuYyhkZXNjLCBkc3QsIHNyYywgbmJ5dGVzKTsKIAogCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOwotCXJldHVybiBjYmNfYWVzX2NyeXB0KGRlc2MsIHNjdHgtPmVuYywgJndhbGspOworCXJldHVybiBjYmNfYWVzX2NyeXB0KGRlc2MsIDAsICZ3YWxrKTsKIH0KIAogc3RhdGljIGludCBjYmNfYWVzX2RlY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLApAQCAtNTAyLDExICs0MDIsMTEgQEAKIAlzdHJ1Y3QgczM5MF9hZXNfY3R4ICpzY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKIAlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKIAotCWlmICh1bmxpa2VseShuZWVkX2ZhbGxiYWNrKHNjdHgtPmtleV9sZW4pKSkKKwlpZiAodW5saWtlbHkoIXNjdHgtPmZjKSkKIAkJcmV0dXJuIGZhbGxiYWNrX2Jsa19kZWMoZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7CiAKIAlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKLQlyZXR1cm4gY2JjX2Flc19jcnlwdChkZXNjLCBzY3R4LT5kZWMsICZ3YWxrKTsKKwlyZXR1cm4gY2JjX2Flc19jcnlwdChkZXNjLCBDUEFDRl9ERUNSWVBULCAmd2Fsayk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBjYmNfYWVzX2FsZyA9IHsKQEAgLTU5NCw4MyArNDk0LDY3IEBACiAJCQkgICB1bnNpZ25lZCBpbnQga2V5X2xlbikKIHsKIAlzdHJ1Y3QgczM5MF94dHNfY3R4ICp4dHNfY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKLQl1MzIgKmZsYWdzID0gJnRmbS0+Y3J0X2ZsYWdzOworCXVuc2lnbmVkIGxvbmcgZmM7CiAJaW50IGVycjsKIAogCWVyciA9IHh0c19jaGVja19rZXkodGZtLCBpbl9rZXksIGtleV9sZW4pOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlzd2l0Y2ggKGtleV9sZW4pIHsKLQljYXNlIDMyOgotCQl4dHNfY3R4LT5lbmMgPSBDUEFDRl9LTV9YVFNfMTI4X0VOQzsKLQkJeHRzX2N0eC0+ZGVjID0gQ1BBQ0ZfS01fWFRTXzEyOF9ERUM7Ci0JCW1lbWNweSh4dHNfY3R4LT5rZXkgKyAxNiwgaW5fa2V5LCAxNik7Ci0JCW1lbWNweSh4dHNfY3R4LT5wY2Nfa2V5ICsgMTYsIGluX2tleSArIDE2LCAxNik7Ci0JCWJyZWFrOwotCWNhc2UgNDg6Ci0JCXh0c19jdHgtPmVuYyA9IDA7Ci0JCXh0c19jdHgtPmRlYyA9IDA7Ci0JCXh0c19mYWxsYmFja19zZXRrZXkodGZtLCBpbl9rZXksIGtleV9sZW4pOwotCQlicmVhazsKLQljYXNlIDY0OgotCQl4dHNfY3R4LT5lbmMgPSBDUEFDRl9LTV9YVFNfMjU2X0VOQzsKLQkJeHRzX2N0eC0+ZGVjID0gQ1BBQ0ZfS01fWFRTXzI1Nl9ERUM7Ci0JCW1lbWNweSh4dHNfY3R4LT5rZXksIGluX2tleSwgMzIpOwotCQltZW1jcHkoeHRzX2N0eC0+cGNjX2tleSwgaW5fa2V5ICsgMzIsIDMyKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJKmZsYWdzIHw9IENSWVBUT19URk1fUkVTX0JBRF9LRVlfTEVOOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJLyogUGljayB0aGUgY29ycmVjdCBmdW5jdGlvbiBjb2RlIGJhc2VkIG9uIHRoZSBrZXkgbGVuZ3RoICovCisJZmMgPSAoa2V5X2xlbiA9PSAzMikgPyBDUEFDRl9LTV9YVFNfMTI4IDoKKwkgICAgIChrZXlfbGVuID09IDY0KSA/IENQQUNGX0tNX1hUU18yNTYgOiAwOworCisJLyogQ2hlY2sgaWYgdGhlIGZ1bmN0aW9uIGNvZGUgaXMgYXZhaWxhYmxlICovCisJeHRzX2N0eC0+ZmMgPSAoZmMgJiYgY3BhY2ZfdGVzdF9mdW5jKCZrbV9mdW5jdGlvbnMsIGZjKSkgPyBmYyA6IDA7CisJaWYgKCF4dHNfY3R4LT5mYykKKwkJcmV0dXJuIHh0c19mYWxsYmFja19zZXRrZXkodGZtLCBpbl9rZXksIGtleV9sZW4pOworCisJLyogU3BsaXQgdGhlIFhUUyBrZXkgaW50byB0aGUgdHdvIHN1YmtleXMgKi8KKwlrZXlfbGVuID0ga2V5X2xlbiAvIDI7CiAJeHRzX2N0eC0+a2V5X2xlbiA9IGtleV9sZW47CisJbWVtY3B5KHh0c19jdHgtPmtleSwgaW5fa2V5LCBrZXlfbGVuKTsKKwltZW1jcHkoeHRzX2N0eC0+cGNjX2tleSwgaW5fa2V5ICsga2V5X2xlbiwga2V5X2xlbik7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgeHRzX2Flc19jcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsIGxvbmcgZnVuYywKLQkJCSBzdHJ1Y3QgczM5MF94dHNfY3R4ICp4dHNfY3R4LAorc3RhdGljIGludCB4dHNfYWVzX2NyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgdW5zaWduZWQgbG9uZyBtb2RpZmllciwKIAkJCSBzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgKndhbGspCiB7Ci0JdW5zaWduZWQgaW50IG9mZnNldCA9ICh4dHNfY3R4LT5rZXlfbGVuID4+IDEpICYgMHgxMDsKLQlpbnQgcmV0ID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCB3YWxrKTsKLQl1bnNpZ25lZCBpbnQgbmJ5dGVzID0gd2Fsay0+bmJ5dGVzOwotCXVuc2lnbmVkIGludCBuOwotCXU4ICppbiwgKm91dDsKLQlzdHJ1Y3QgcGNjX3BhcmFtIHBjY19wYXJhbTsKKwlzdHJ1Y3QgczM5MF94dHNfY3R4ICp4dHNfY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBuYnl0ZXMsIG47CisJaW50IHJldDsKKwlzdHJ1Y3QgeworCQl1OCBrZXlbMzJdOworCQl1OCB0d2Vha1sxNl07CisJCXU4IGJsb2NrWzE2XTsKKwkJdTggYml0WzE2XTsKKwkJdTggeHRzWzE2XTsKKwl9IHBjY19wYXJhbTsKIAlzdHJ1Y3QgewogCQl1OCBrZXlbMzJdOwogCQl1OCBpbml0WzE2XTsKIAl9IHh0c19wYXJhbTsKIAotCWlmICghbmJ5dGVzKQotCQlnb3RvIG91dDsKLQorCXJldCA9IGJsa2NpcGhlcl93YWxrX3ZpcnQoZGVzYywgd2Fsayk7CisJb2Zmc2V0ID0geHRzX2N0eC0+a2V5X2xlbiAmIDB4MTA7CiAJbWVtc2V0KHBjY19wYXJhbS5ibG9jaywgMCwgc2l6ZW9mKHBjY19wYXJhbS5ibG9jaykpOwogCW1lbXNldChwY2NfcGFyYW0uYml0LCAwLCBzaXplb2YocGNjX3BhcmFtLmJpdCkpOwogCW1lbXNldChwY2NfcGFyYW0ueHRzLCAwLCBzaXplb2YocGNjX3BhcmFtLnh0cykpOwogCW1lbWNweShwY2NfcGFyYW0udHdlYWssIHdhbGstPml2LCBzaXplb2YocGNjX3BhcmFtLnR3ZWFrKSk7Ci0JbWVtY3B5KHBjY19wYXJhbS5rZXksIHh0c19jdHgtPnBjY19rZXksIDMyKTsKLQkvKiByZW1vdmUgZGVjaXBoZXIgbW9kaWZpZXIgYml0IGZyb20gJ2Z1bmMnIGFuZCBjYWxsIFBDQyAqLwotCXJldCA9IGNwYWNmX3BjYyhmdW5jICYgMHg3ZiwgJnBjY19wYXJhbS5rZXlbb2Zmc2V0XSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiAtRUlPOworCW1lbWNweShwY2NfcGFyYW0ua2V5ICsgb2Zmc2V0LCB4dHNfY3R4LT5wY2Nfa2V5LCB4dHNfY3R4LT5rZXlfbGVuKTsKKwljcGFjZl9wY2MoeHRzX2N0eC0+ZmMsIHBjY19wYXJhbS5rZXkgKyBvZmZzZXQpOwogCi0JbWVtY3B5KHh0c19wYXJhbS5rZXksIHh0c19jdHgtPmtleSwgMzIpOworCW1lbWNweSh4dHNfcGFyYW0ua2V5ICsgb2Zmc2V0LCB4dHNfY3R4LT5rZXksIHh0c19jdHgtPmtleV9sZW4pOwogCW1lbWNweSh4dHNfcGFyYW0uaW5pdCwgcGNjX3BhcmFtLnh0cywgMTYpOwotCWRvIHsKKworCXdoaWxlICgobmJ5dGVzID0gd2Fsay0+bmJ5dGVzKSA+PSBBRVNfQkxPQ0tfU0laRSkgewogCQkvKiBvbmx5IHVzZSBjb21wbGV0ZSBibG9ja3MgKi8KIAkJbiA9IG5ieXRlcyAmIH4oQUVTX0JMT0NLX1NJWkUgLSAxKTsKLQkJb3V0ID0gd2Fsay0+ZHN0LnZpcnQuYWRkcjsKLQkJaW4gPSB3YWxrLT5zcmMudmlydC5hZGRyOwotCi0JCXJldCA9IGNwYWNmX2ttKGZ1bmMsICZ4dHNfcGFyYW0ua2V5W29mZnNldF0sIG91dCwgaW4sIG4pOwotCQlpZiAocmV0IDwgMCB8fCByZXQgIT0gbikKLQkJCXJldHVybiAtRUlPOwotCi0JCW5ieXRlcyAmPSBBRVNfQkxPQ0tfU0laRSAtIDE7Ci0JCXJldCA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgd2FsaywgbmJ5dGVzKTsKLQl9IHdoaWxlICgobmJ5dGVzID0gd2Fsay0+bmJ5dGVzKSk7Ci1vdXQ6CisJCWNwYWNmX2ttKHh0c19jdHgtPmZjIHwgbW9kaWZpZXIsIHh0c19wYXJhbS5rZXkgKyBvZmZzZXQsCisJCQkgd2Fsay0+ZHN0LnZpcnQuYWRkciwgd2Fsay0+c3JjLnZpcnQuYWRkciwgbik7CisJCXJldCA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgd2FsaywgbmJ5dGVzIC0gbik7CisJfQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTY4MSwxMSArNTY1LDExIEBACiAJc3RydWN0IHMzOTBfeHRzX2N0eCAqeHRzX2N0eCA9IGNyeXB0b19ibGtjaXBoZXJfY3R4KGRlc2MtPnRmbSk7CiAJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CiAKLQlpZiAodW5saWtlbHkoeHRzX2N0eC0+a2V5X2xlbiA9PSA0OCkpCisJaWYgKHVubGlrZWx5KCF4dHNfY3R4LT5mYykpCiAJCXJldHVybiB4dHNfZmFsbGJhY2tfZW5jcnlwdChkZXNjLCBkc3QsIHNyYywgbmJ5dGVzKTsKIAogCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOwotCXJldHVybiB4dHNfYWVzX2NyeXB0KGRlc2MsIHh0c19jdHgtPmVuYywgeHRzX2N0eCwgJndhbGspOworCXJldHVybiB4dHNfYWVzX2NyeXB0KGRlc2MsIDAsICZ3YWxrKTsKIH0KIAogc3RhdGljIGludCB4dHNfYWVzX2RlY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLApAQCAtNjk1LDExICs1NzksMTEgQEAKIAlzdHJ1Y3QgczM5MF94dHNfY3R4ICp4dHNfY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKIAlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKIAotCWlmICh1bmxpa2VseSh4dHNfY3R4LT5rZXlfbGVuID09IDQ4KSkKKwlpZiAodW5saWtlbHkoIXh0c19jdHgtPmZjKSkKIAkJcmV0dXJuIHh0c19mYWxsYmFja19kZWNyeXB0KGRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwogCiAJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7Ci0JcmV0dXJuIHh0c19hZXNfY3J5cHQoZGVzYywgeHRzX2N0eC0+ZGVjLCB4dHNfY3R4LCAmd2Fsayk7CisJcmV0dXJuIHh0c19hZXNfY3J5cHQoZGVzYywgQ1BBQ0ZfREVDUllQVCwgJndhbGspOwogfQogCiBzdGF0aWMgaW50IHh0c19mYWxsYmFja19pbml0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCkBAIC03NTAsMTA4ICs2MzQsNzkgQEAKIAl9CiB9OwogCi1zdGF0aWMgaW50IHh0c19hZXNfYWxnX3JlZzsKLQogc3RhdGljIGludCBjdHJfYWVzX3NldF9rZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmluX2tleSwKIAkJCSAgIHVuc2lnbmVkIGludCBrZXlfbGVuKQogewogCXN0cnVjdCBzMzkwX2Flc19jdHggKnNjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCXVuc2lnbmVkIGxvbmcgZmM7CiAKLQlzd2l0Y2ggKGtleV9sZW4pIHsKLQljYXNlIDE2OgotCQlzY3R4LT5lbmMgPSBDUEFDRl9LTUNUUl9BRVNfMTI4X0VOQzsKLQkJc2N0eC0+ZGVjID0gQ1BBQ0ZfS01DVFJfQUVTXzEyOF9ERUM7Ci0JCWJyZWFrOwotCWNhc2UgMjQ6Ci0JCXNjdHgtPmVuYyA9IENQQUNGX0tNQ1RSX0FFU18xOTJfRU5DOwotCQlzY3R4LT5kZWMgPSBDUEFDRl9LTUNUUl9BRVNfMTkyX0RFQzsKLQkJYnJlYWs7Ci0JY2FzZSAzMjoKLQkJc2N0eC0+ZW5jID0gQ1BBQ0ZfS01DVFJfQUVTXzI1Nl9FTkM7Ci0JCXNjdHgtPmRlYyA9IENQQUNGX0tNQ1RSX0FFU18yNTZfREVDOwotCQlicmVhazsKLQl9CisJLyogUGljayB0aGUgY29ycmVjdCBmdW5jdGlvbiBjb2RlIGJhc2VkIG9uIHRoZSBrZXkgbGVuZ3RoICovCisJZmMgPSAoa2V5X2xlbiA9PSAxNikgPyBDUEFDRl9LTUNUUl9BRVNfMTI4IDoKKwkgICAgIChrZXlfbGVuID09IDI0KSA/IENQQUNGX0tNQ1RSX0FFU18xOTIgOgorCSAgICAgKGtleV9sZW4gPT0gMzIpID8gQ1BBQ0ZfS01DVFJfQUVTXzI1NiA6IDA7CiAKLQlyZXR1cm4gYWVzX3NldF9rZXkodGZtLCBpbl9rZXksIGtleV9sZW4pOworCS8qIENoZWNrIGlmIHRoZSBmdW5jdGlvbiBjb2RlIGlzIGF2YWlsYWJsZSAqLworCXNjdHgtPmZjID0gKGZjICYmIGNwYWNmX3Rlc3RfZnVuYygma21jdHJfZnVuY3Rpb25zLCBmYykpID8gZmMgOiAwOworCWlmICghc2N0eC0+ZmMpCisJCXJldHVybiBzZXRrZXlfZmFsbGJhY2tfYmxrKHRmbSwgaW5fa2V5LCBrZXlfbGVuKTsKKworCXNjdHgtPmtleV9sZW4gPSBrZXlfbGVuOworCW1lbWNweShzY3R4LT5rZXksIGluX2tleSwga2V5X2xlbik7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19jdHJibGtfaW5pdCh1OCAqY3RycHRyLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQorc3RhdGljIHVuc2lnbmVkIGludCBfX2N0cmJsa19pbml0KHU4ICpjdHJwdHIsIHU4ICppdiwgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKIAl1bnNpZ25lZCBpbnQgaSwgbjsKIAogCS8qIG9ubHkgdXNlIGNvbXBsZXRlIGJsb2NrcywgbWF4LiBQQUdFX1NJWkUgKi8KKwltZW1jcHkoY3RycHRyLCBpdiwgQUVTX0JMT0NLX1NJWkUpOwogCW4gPSAobmJ5dGVzID4gUEFHRV9TSVpFKSA/IFBBR0VfU0laRSA6IG5ieXRlcyAmIH4oQUVTX0JMT0NLX1NJWkUgLSAxKTsKLQlmb3IgKGkgPSBBRVNfQkxPQ0tfU0laRTsgaSA8IG47IGkgKz0gQUVTX0JMT0NLX1NJWkUpIHsKLQkJbWVtY3B5KGN0cnB0ciArIGksIGN0cnB0ciArIGkgLSBBRVNfQkxPQ0tfU0laRSwKLQkJICAgICAgIEFFU19CTE9DS19TSVpFKTsKLQkJY3J5cHRvX2luYyhjdHJwdHIgKyBpLCBBRVNfQkxPQ0tfU0laRSk7CisJZm9yIChpID0gKG4gLyBBRVNfQkxPQ0tfU0laRSkgLSAxOyBpID4gMDsgaS0tKSB7CisJCW1lbWNweShjdHJwdHIgKyBBRVNfQkxPQ0tfU0laRSwgY3RycHRyLCBBRVNfQkxPQ0tfU0laRSk7CisJCWNyeXB0b19pbmMoY3RycHRyICsgQUVTX0JMT0NLX1NJWkUsIEFFU19CTE9DS19TSVpFKTsKKwkJY3RycHRyICs9IEFFU19CTE9DS19TSVpFOwogCX0KIAlyZXR1cm4gbjsKIH0KIAotc3RhdGljIGludCBjdHJfYWVzX2NyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgbG9uZyBmdW5jLAotCQkJIHN0cnVjdCBzMzkwX2Flc19jdHggKnNjdHgsIHN0cnVjdCBibGtjaXBoZXJfd2FsayAqd2FsaykKK3N0YXRpYyBpbnQgY3RyX2Flc19jcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsIHVuc2lnbmVkIGxvbmcgbW9kaWZpZXIsCisJCQkgc3RydWN0IGJsa2NpcGhlcl93YWxrICp3YWxrKQogewotCWludCByZXQgPSBibGtjaXBoZXJfd2Fsa192aXJ0X2Jsb2NrKGRlc2MsIHdhbGssIEFFU19CTE9DS19TSVpFKTsKKwlzdHJ1Y3QgczM5MF9hZXNfY3R4ICpzY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKKwl1OCBidWZbQUVTX0JMT0NLX1NJWkVdLCAqY3RycHRyOwogCXVuc2lnbmVkIGludCBuLCBuYnl0ZXM7Ci0JdTggYnVmW0FFU19CTE9DS19TSVpFXSwgY3RyYnVmW0FFU19CTE9DS19TSVpFXTsKLQl1OCAqb3V0LCAqaW4sICpjdHJwdHIgPSBjdHJidWY7CisJaW50IHJldCwgbG9ja2VkOwogCi0JaWYgKCF3YWxrLT5uYnl0ZXMpCi0JCXJldHVybiByZXQ7CisJbG9ja2VkID0gc3Bpbl90cnlsb2NrKCZjdHJibGtfbG9jayk7CiAKLQlpZiAoc3Bpbl90cnlsb2NrKCZjdHJibGtfbG9jaykpCi0JCWN0cnB0ciA9IGN0cmJsazsKLQotCW1lbWNweShjdHJwdHIsIHdhbGstPml2LCBBRVNfQkxPQ0tfU0laRSk7CisJcmV0ID0gYmxrY2lwaGVyX3dhbGtfdmlydF9ibG9jayhkZXNjLCB3YWxrLCBBRVNfQkxPQ0tfU0laRSk7CiAJd2hpbGUgKChuYnl0ZXMgPSB3YWxrLT5uYnl0ZXMpID49IEFFU19CTE9DS19TSVpFKSB7Ci0JCW91dCA9IHdhbGstPmRzdC52aXJ0LmFkZHI7Ci0JCWluID0gd2Fsay0+c3JjLnZpcnQuYWRkcjsKLQkJd2hpbGUgKG5ieXRlcyA+PSBBRVNfQkxPQ0tfU0laRSkgewotCQkJaWYgKGN0cnB0ciA9PSBjdHJibGspCi0JCQkJbiA9IF9fY3RyYmxrX2luaXQoY3RycHRyLCBuYnl0ZXMpOwotCQkJZWxzZQotCQkJCW4gPSBBRVNfQkxPQ0tfU0laRTsKLQkJCXJldCA9IGNwYWNmX2ttY3RyKGZ1bmMsIHNjdHgtPmtleSwgb3V0LCBpbiwgbiwgY3RycHRyKTsKLQkJCWlmIChyZXQgPCAwIHx8IHJldCAhPSBuKSB7Ci0JCQkJaWYgKGN0cnB0ciA9PSBjdHJibGspCi0JCQkJCXNwaW5fdW5sb2NrKCZjdHJibGtfbG9jayk7Ci0JCQkJcmV0dXJuIC1FSU87Ci0JCQl9Ci0JCQlpZiAobiA+IEFFU19CTE9DS19TSVpFKQotCQkJCW1lbWNweShjdHJwdHIsIGN0cnB0ciArIG4gLSBBRVNfQkxPQ0tfU0laRSwKLQkJCQkgICAgICAgQUVTX0JMT0NLX1NJWkUpOwotCQkJY3J5cHRvX2luYyhjdHJwdHIsIEFFU19CTE9DS19TSVpFKTsKLQkJCW91dCArPSBuOwotCQkJaW4gKz0gbjsKLQkJCW5ieXRlcyAtPSBuOwotCQl9Ci0JCXJldCA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgd2FsaywgbmJ5dGVzKTsKKwkJbiA9IEFFU19CTE9DS19TSVpFOworCQlpZiAobmJ5dGVzID49IDIqQUVTX0JMT0NLX1NJWkUgJiYgbG9ja2VkKQorCQkJbiA9IF9fY3RyYmxrX2luaXQoY3RyYmxrLCB3YWxrLT5pdiwgbmJ5dGVzKTsKKwkJY3RycHRyID0gKG4gPiBBRVNfQkxPQ0tfU0laRSkgPyBjdHJibGsgOiB3YWxrLT5pdjsKKwkJY3BhY2Zfa21jdHIoc2N0eC0+ZmMgfCBtb2RpZmllciwgc2N0eC0+a2V5LAorCQkJICAgIHdhbGstPmRzdC52aXJ0LmFkZHIsIHdhbGstPnNyYy52aXJ0LmFkZHIsCisJCQkgICAgbiwgY3RycHRyKTsKKwkJaWYgKGN0cnB0ciA9PSBjdHJibGspCisJCQltZW1jcHkod2Fsay0+aXYsIGN0cnB0ciArIG4gLSBBRVNfQkxPQ0tfU0laRSwKKwkJCSAgICAgICBBRVNfQkxPQ0tfU0laRSk7CisJCWNyeXB0b19pbmMod2Fsay0+aXYsIEFFU19CTE9DS19TSVpFKTsKKwkJcmV0ID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCB3YWxrLCBuYnl0ZXMgLSBuKTsKIAl9Ci0JaWYgKGN0cnB0ciA9PSBjdHJibGspIHsKLQkJaWYgKG5ieXRlcykKLQkJCW1lbWNweShjdHJidWYsIGN0cnB0ciwgQUVTX0JMT0NLX1NJWkUpOwotCQllbHNlCi0JCQltZW1jcHkod2Fsay0+aXYsIGN0cnB0ciwgQUVTX0JMT0NLX1NJWkUpOworCWlmIChsb2NrZWQpCiAJCXNwaW5fdW5sb2NrKCZjdHJibGtfbG9jayk7Ci0JfSBlbHNlIHsKLQkJaWYgKCFuYnl0ZXMpCi0JCQltZW1jcHkod2Fsay0+aXYsIGN0cnB0ciwgQUVTX0JMT0NLX1NJWkUpOwotCX0KIAkvKgogCSAqIGZpbmFsIGJsb2NrIG1heSBiZSA8IEFFU19CTE9DS19TSVpFLCBjb3B5IG9ubHkgbmJ5dGVzCiAJICovCiAJaWYgKG5ieXRlcykgewotCQlvdXQgPSB3YWxrLT5kc3QudmlydC5hZGRyOwotCQlpbiA9IHdhbGstPnNyYy52aXJ0LmFkZHI7Ci0JCXJldCA9IGNwYWNmX2ttY3RyKGZ1bmMsIHNjdHgtPmtleSwgYnVmLCBpbiwKLQkJCQkgIEFFU19CTE9DS19TSVpFLCBjdHJidWYpOwotCQlpZiAocmV0IDwgMCB8fCByZXQgIT0gQUVTX0JMT0NLX1NJWkUpCi0JCQlyZXR1cm4gLUVJTzsKLQkJbWVtY3B5KG91dCwgYnVmLCBuYnl0ZXMpOwotCQljcnlwdG9faW5jKGN0cmJ1ZiwgQUVTX0JMT0NLX1NJWkUpOworCQljcGFjZl9rbWN0cihzY3R4LT5mYyB8IG1vZGlmaWVyLCBzY3R4LT5rZXksCisJCQkgICAgYnVmLCB3YWxrLT5zcmMudmlydC5hZGRyLAorCQkJICAgIEFFU19CTE9DS19TSVpFLCB3YWxrLT5pdik7CisJCW1lbWNweSh3YWxrLT5kc3QudmlydC5hZGRyLCBidWYsIG5ieXRlcyk7CisJCWNyeXB0b19pbmMod2Fsay0+aXYsIEFFU19CTE9DS19TSVpFKTsKIAkJcmV0ID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCB3YWxrLCAwKTsKLQkJbWVtY3B5KHdhbGstPml2LCBjdHJidWYsIEFFU19CTE9DS19TSVpFKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtODY0LDggKzcxOSwxMSBAQAogCXN0cnVjdCBzMzkwX2Flc19jdHggKnNjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOwogCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwogCisJaWYgKHVubGlrZWx5KCFzY3R4LT5mYykpCisJCXJldHVybiBmYWxsYmFja19ibGtfZW5jKGRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOworCiAJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7Ci0JcmV0dXJuIGN0cl9hZXNfY3J5cHQoZGVzYywgc2N0eC0+ZW5jLCBzY3R4LCAmd2Fsayk7CisJcmV0dXJuIGN0cl9hZXNfY3J5cHQoZGVzYywgMCwgJndhbGspOwogfQogCiBzdGF0aWMgaW50IGN0cl9hZXNfZGVjcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCkBAIC04NzUsMTkgKzczMywyNSBAQAogCXN0cnVjdCBzMzkwX2Flc19jdHggKnNjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOwogCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwogCisJaWYgKHVubGlrZWx5KCFzY3R4LT5mYykpCisJCXJldHVybiBmYWxsYmFja19ibGtfZGVjKGRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOworCiAJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7Ci0JcmV0dXJuIGN0cl9hZXNfY3J5cHQoZGVzYywgc2N0eC0+ZGVjLCBzY3R4LCAmd2Fsayk7CisJcmV0dXJuIGN0cl9hZXNfY3J5cHQoZGVzYywgQ1BBQ0ZfREVDUllQVCwgJndhbGspOwogfQogCiBzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgY3RyX2Flc19hbGcgPSB7CiAJLmNyYV9uYW1lCQk9CSJjdHIoYWVzKSIsCiAJLmNyYV9kcml2ZXJfbmFtZQk9CSJjdHItYWVzLXMzOTAiLAogCS5jcmFfcHJpb3JpdHkJCT0JNDAwLAkvKiBjb21ibzogYWVzICsgY3RyICovCi0JLmNyYV9mbGFncwkJPQlDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfZmxhZ3MJCT0JQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiB8CisJCQkJCUNSWVBUT19BTEdfTkVFRF9GQUxMQkFDSywKIAkuY3JhX2Jsb2Nrc2l6ZQkJPQkxLAogCS5jcmFfY3R4c2l6ZQkJPQlzaXplb2Yoc3RydWN0IHMzOTBfYWVzX2N0eCksCiAJLmNyYV90eXBlCQk9CSZjcnlwdG9fYmxrY2lwaGVyX3R5cGUsCiAJLmNyYV9tb2R1bGUJCT0JVEhJU19NT0RVTEUsCisJLmNyYV9pbml0CQk9CWZhbGxiYWNrX2luaXRfYmxrLAorCS5jcmFfZXhpdAkJPQlmYWxsYmFja19leGl0X2JsaywKIAkuY3JhX3UJCQk9CXsKIAkJLmJsa2NpcGhlciA9IHsKIAkJCS5taW5fa2V5c2l6ZQkJPQlBRVNfTUlOX0tFWV9TSVpFLApAQCAtOTAwLDg5ICs3NjQsNzkgQEAKIAl9CiB9OwogCi1zdGF0aWMgaW50IGN0cl9hZXNfYWxnX3JlZzsKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyAqYWVzX3MzOTBfYWxnc19wdHJbNV07CitzdGF0aWMgaW50IGFlc19zMzkwX2FsZ3NfbnVtOworCitzdGF0aWMgaW50IGFlc19zMzkwX3JlZ2lzdGVyX2FsZyhzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKQoreworCWludCByZXQ7CisKKwlyZXQgPSBjcnlwdG9fcmVnaXN0ZXJfYWxnKGFsZyk7CisJaWYgKCFyZXQpCisJCWFlc19zMzkwX2FsZ3NfcHRyW2Flc19zMzkwX2FsZ3NfbnVtKytdID0gYWxnOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGFlc19zMzkwX2Zpbmkodm9pZCkKK3sKKwl3aGlsZSAoYWVzX3MzOTBfYWxnc19udW0tLSkKKwkJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKGFlc19zMzkwX2FsZ3NfcHRyW2Flc19zMzkwX2FsZ3NfbnVtXSk7CisJaWYgKGN0cmJsaykKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBjdHJibGspOworfQogCiBzdGF0aWMgaW50IF9faW5pdCBhZXNfczM5MF9pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKIAotCWlmIChjcGFjZl9xdWVyeShDUEFDRl9LTSwgQ1BBQ0ZfS01fQUVTXzEyOF9FTkMpKQotCQlrZXlsZW5fZmxhZyB8PSBBRVNfS0VZTEVOXzEyODsKLQlpZiAoY3BhY2ZfcXVlcnkoQ1BBQ0ZfS00sIENQQUNGX0tNX0FFU18xOTJfRU5DKSkKLQkJa2V5bGVuX2ZsYWcgfD0gQUVTX0tFWUxFTl8xOTI7Ci0JaWYgKGNwYWNmX3F1ZXJ5KENQQUNGX0tNLCBDUEFDRl9LTV9BRVNfMjU2X0VOQykpCi0JCWtleWxlbl9mbGFnIHw9IEFFU19LRVlMRU5fMjU2OworCS8qIFF1ZXJ5IGF2YWlsYWJsZSBmdW5jdGlvbnMgZm9yIEtNLCBLTUMgYW5kIEtNQ1RSICovCisJY3BhY2ZfcXVlcnkoQ1BBQ0ZfS00sICZrbV9mdW5jdGlvbnMpOworCWNwYWNmX3F1ZXJ5KENQQUNGX0tNQywgJmttY19mdW5jdGlvbnMpOworCWNwYWNmX3F1ZXJ5KENQQUNGX0tNQ1RSLCAma21jdHJfZnVuY3Rpb25zKTsKIAotCWlmICgha2V5bGVuX2ZsYWcpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQotCS8qIHo5IDEwOSBhbmQgejkgQkMvRUMgb25seSBzdXBwb3J0IDEyOCBiaXQga2V5IGxlbmd0aCAqLwotCWlmIChrZXlsZW5fZmxhZyA9PSBBRVNfS0VZTEVOXzEyOCkKLQkJcHJfaW5mbygiQUVTIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBmb3IiCi0JCQkiIDEyOC1iaXQga2V5c1xuIik7Ci0KLQlyZXQgPSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZhZXNfYWxnKTsKLQlpZiAocmV0KQotCQlnb3RvIGFlc19lcnI7Ci0KLQlyZXQgPSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZlY2JfYWVzX2FsZyk7Ci0JaWYgKHJldCkKLQkJZ290byBlY2JfYWVzX2VycjsKLQotCXJldCA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJmNiY19hZXNfYWxnKTsKLQlpZiAocmV0KQotCQlnb3RvIGNiY19hZXNfZXJyOwotCi0JaWYgKGNwYWNmX3F1ZXJ5KENQQUNGX0tNLCBDUEFDRl9LTV9YVFNfMTI4X0VOQykgJiYKLQkgICAgY3BhY2ZfcXVlcnkoQ1BBQ0ZfS00sIENQQUNGX0tNX1hUU18yNTZfRU5DKSkgewotCQlyZXQgPSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZ4dHNfYWVzX2FsZyk7CisJaWYgKGNwYWNmX3Rlc3RfZnVuYygma21fZnVuY3Rpb25zLCBDUEFDRl9LTV9BRVNfMTI4KSB8fAorCSAgICBjcGFjZl90ZXN0X2Z1bmMoJmttX2Z1bmN0aW9ucywgQ1BBQ0ZfS01fQUVTXzE5MikgfHwKKwkgICAgY3BhY2ZfdGVzdF9mdW5jKCZrbV9mdW5jdGlvbnMsIENQQUNGX0tNX0FFU18yNTYpKSB7CisJCXJldCA9IGFlc19zMzkwX3JlZ2lzdGVyX2FsZygmYWVzX2FsZyk7CiAJCWlmIChyZXQpCi0JCQlnb3RvIHh0c19hZXNfZXJyOwotCQl4dHNfYWVzX2FsZ19yZWcgPSAxOworCQkJZ290byBvdXRfZXJyOworCQlyZXQgPSBhZXNfczM5MF9yZWdpc3Rlcl9hbGcoJmVjYl9hZXNfYWxnKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X2VycjsKIAl9CiAKLQlpZiAoY3BhY2ZfcXVlcnkoQ1BBQ0ZfS01DVFIsIENQQUNGX0tNQ1RSX0FFU18xMjhfRU5DKSAmJgotCSAgICBjcGFjZl9xdWVyeShDUEFDRl9LTUNUUiwgQ1BBQ0ZfS01DVFJfQUVTXzE5Ml9FTkMpICYmCi0JICAgIGNwYWNmX3F1ZXJ5KENQQUNGX0tNQ1RSLCBDUEFDRl9LTUNUUl9BRVNfMjU2X0VOQykpIHsKKwlpZiAoY3BhY2ZfdGVzdF9mdW5jKCZrbWNfZnVuY3Rpb25zLCBDUEFDRl9LTUNfQUVTXzEyOCkgfHwKKwkgICAgY3BhY2ZfdGVzdF9mdW5jKCZrbWNfZnVuY3Rpb25zLCBDUEFDRl9LTUNfQUVTXzE5MikgfHwKKwkgICAgY3BhY2ZfdGVzdF9mdW5jKCZrbWNfZnVuY3Rpb25zLCBDUEFDRl9LTUNfQUVTXzI1NikpIHsKKwkJcmV0ID0gYWVzX3MzOTBfcmVnaXN0ZXJfYWxnKCZjYmNfYWVzX2FsZyk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dF9lcnI7CisJfQorCisJaWYgKGNwYWNmX3Rlc3RfZnVuYygma21fZnVuY3Rpb25zLCBDUEFDRl9LTV9YVFNfMTI4KSB8fAorCSAgICBjcGFjZl90ZXN0X2Z1bmMoJmttX2Z1bmN0aW9ucywgQ1BBQ0ZfS01fWFRTXzI1NikpIHsKKwkJcmV0ID0gYWVzX3MzOTBfcmVnaXN0ZXJfYWxnKCZ4dHNfYWVzX2FsZyk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dF9lcnI7CisJfQorCisJaWYgKGNwYWNmX3Rlc3RfZnVuYygma21jdHJfZnVuY3Rpb25zLCBDUEFDRl9LTUNUUl9BRVNfMTI4KSB8fAorCSAgICBjcGFjZl90ZXN0X2Z1bmMoJmttY3RyX2Z1bmN0aW9ucywgQ1BBQ0ZfS01DVFJfQUVTXzE5MikgfHwKKwkgICAgY3BhY2ZfdGVzdF9mdW5jKCZrbWN0cl9mdW5jdGlvbnMsIENQQUNGX0tNQ1RSX0FFU18yNTYpKSB7CiAJCWN0cmJsayA9ICh1OCAqKSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CiAJCWlmICghY3RyYmxrKSB7CiAJCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBjdHJfYWVzX2VycjsKKwkJCWdvdG8gb3V0X2VycjsKIAkJfQotCQlyZXQgPSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZjdHJfYWVzX2FsZyk7Ci0JCWlmIChyZXQpIHsKLQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgY3RyYmxrKTsKLQkJCWdvdG8gY3RyX2Flc19lcnI7Ci0JCX0KLQkJY3RyX2Flc19hbGdfcmVnID0gMTsKKwkJcmV0ID0gYWVzX3MzOTBfcmVnaXN0ZXJfYWxnKCZjdHJfYWVzX2FsZyk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dF9lcnI7CiAJfQogCi1vdXQ6CisJcmV0dXJuIDA7CitvdXRfZXJyOgorCWFlc19zMzkwX2ZpbmkoKTsKIAlyZXR1cm4gcmV0OwotCi1jdHJfYWVzX2VycjoKLQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJnh0c19hZXNfYWxnKTsKLXh0c19hZXNfZXJyOgotCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmY2JjX2Flc19hbGcpOwotY2JjX2Flc19lcnI6Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZlY2JfYWVzX2FsZyk7Ci1lY2JfYWVzX2VycjoKLQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmFlc19hbGcpOwotYWVzX2VycjoKLQlnb3RvIG91dDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGFlc19zMzkwX2Zpbmkodm9pZCkKLXsKLQlpZiAoY3RyX2Flc19hbGdfcmVnKSB7Ci0JCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmY3RyX2Flc19hbGcpOwotCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGN0cmJsayk7Ci0JfQotCWlmICh4dHNfYWVzX2FsZ19yZWcpCi0JCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmeHRzX2Flc19hbGcpOwotCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmY2JjX2Flc19hbGcpOwotCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmZWNiX2Flc19hbGcpOwotCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmYWVzX2FsZyk7CiB9CiAKIG1vZHVsZV9jcHVfZmVhdHVyZV9tYXRjaChNU0EsIGFlc19zMzkwX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NyeXB0by9jcmMzMi12eC5jIGIvYXJjaC9zMzkwL2NyeXB0by9jcmMzMi12eC5jCmluZGV4IDU3N2FlMWQuLjk5MmU2MzAgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jcnlwdG8vY3JjMzItdnguYworKysgYi9hcmNoL3MzOTAvY3J5cHRvL2NyYzMyLXZ4LmMKQEAgLTUxLDYgKzUxLDkgQEAKIAkJc3RydWN0IGtlcm5lbF9mcHUgdnhzdGF0ZTsJCQkJICAgIFwKIAkJdW5zaWduZWQgbG9uZyBwcmVhbGlnbiwgYWxpZ25lZCwgcmVtYWluaW5nOwkJICAgIFwKIAkJCQkJCQkJCSAgICBcCisJCWlmIChkYXRhbGVuIDwgVlhfTUlOX0xFTiArIFZYX0FMSUdOX01BU0spCQkgICAgXAorCQkJcmV0dXJuIF9fX2NyYzMyX3N3KGNyYywgZGF0YSwgZGF0YWxlbik7CQkgICAgXAorCQkJCQkJCQkJICAgIFwKIAkJaWYgKCh1bnNpZ25lZCBsb25nKWRhdGEgJiBWWF9BTElHTl9NQVNLKSB7CQkgICAgXAogCQkJcHJlYWxpZ24gPSBWWF9BTElHTk1FTlQgLQkJCSAgICBcCiAJCQkJICAoKHVuc2lnbmVkIGxvbmcpZGF0YSAmIFZYX0FMSUdOX01BU0spOyAgICBcCkBAIC01OSwxNSArNjIsMTIgQEAKIAkJCWRhdGEgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZylkYXRhICsgcHJlYWxpZ24pOyAgICBcCiAJCX0JCQkJCQkJICAgIFwKIAkJCQkJCQkJCSAgICBcCi0JCWlmIChkYXRhbGVuIDwgVlhfTUlOX0xFTikJCQkJICAgIFwKLQkJCXJldHVybiBfX19jcmMzMl9zdyhjcmMsIGRhdGEsIGRhdGFsZW4pOwkJICAgIFwKLQkJCQkJCQkJCSAgICBcCiAJCWFsaWduZWQgPSBkYXRhbGVuICYgflZYX0FMSUdOX01BU0s7CQkJICAgIFwKIAkJcmVtYWluaW5nID0gZGF0YWxlbiAmIFZYX0FMSUdOX01BU0s7CQkJICAgIFwKIAkJCQkJCQkJCSAgICBcCiAJCWtlcm5lbF9mcHVfYmVnaW4oJnZ4c3RhdGUsIEtFUk5FTF9WWFJfTE9XKTsJCSAgICBcCiAJCWNyYyA9IF9fX2NyYzMyX3Z4KGNyYywgZGF0YSwgYWxpZ25lZCk7CQkJICAgIFwKLQkJa2VybmVsX2ZwdV9lbmQoJnZ4c3RhdGUpOwkJCQkgICAgXAorCQlrZXJuZWxfZnB1X2VuZCgmdnhzdGF0ZSwgS0VSTkVMX1ZYUl9MT1cpOwkJICAgIFwKIAkJCQkJCQkJCSAgICBcCiAJCWlmIChyZW1haW5pbmcpCQkJCQkJICAgIFwKIAkJCWNyYyA9IF9fX2NyYzMyX3N3KGNyYywgZGF0YSArIGFsaWduZWQsIHJlbWFpbmluZyk7ICBcCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvY3J5cHRvL2Rlc19zMzkwLmMgYi9hcmNoL3MzOTAvY3J5cHRvL2Rlc19zMzkwLmMKaW5kZXggNjk3ZTcxYS4uOGI4MzE0NCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2NyeXB0by9kZXNfczM5MC5jCisrKyBiL2FyY2gvczM5MC9jcnlwdG8vZGVzX3MzOTAuYwpAQCAtMjcsNiArMjcsOCBAQAogc3RhdGljIHU4ICpjdHJibGs7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGN0cmJsa19sb2NrKTsKIAorc3RhdGljIGNwYWNmX21hc2tfdCBrbV9mdW5jdGlvbnMsIGttY19mdW5jdGlvbnMsIGttY3RyX2Z1bmN0aW9uczsKKwogc3RydWN0IHMzOTBfZGVzX2N0eCB7CiAJdTggaXZbREVTX0JMT0NLX1NJWkVdOwogCXU4IGtleVtERVMzX0tFWV9TSVpFXTsKQEAgLTM2LDEyICszOCwxMiBAQAogCQkgICAgICB1bnNpZ25lZCBpbnQga2V5X2xlbikKIHsKIAlzdHJ1Y3QgczM5MF9kZXNfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwotCXUzMiAqZmxhZ3MgPSAmdGZtLT5jcnRfZmxhZ3M7CiAJdTMyIHRtcFtERVNfRVhQS0VZX1dPUkRTXTsKIAogCS8qIGNoZWNrIGZvciB3ZWFrIGtleXMgKi8KLQlpZiAoIWRlc19la2V5KHRtcCwga2V5KSAmJiAoKmZsYWdzICYgQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVkpKSB7Ci0JCSpmbGFncyB8PSBDUllQVE9fVEZNX1JFU19XRUFLX0tFWTsKKwlpZiAoIWRlc19la2V5KHRtcCwga2V5KSAmJgorCSAgICAodGZtLT5jcnRfZmxhZ3MgJiBDUllQVE9fVEZNX1JFUV9XRUFLX0tFWSkpIHsKKwkJdGZtLT5jcnRfZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfV0VBS19LRVk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNTMsMTQgKzU1LDE1IEBACiB7CiAJc3RydWN0IHMzOTBfZGVzX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAotCWNwYWNmX2ttKENQQUNGX0tNX0RFQV9FTkMsIGN0eC0+a2V5LCBvdXQsIGluLCBERVNfQkxPQ0tfU0laRSk7CisJY3BhY2Zfa20oQ1BBQ0ZfS01fREVBLCBjdHgtPmtleSwgb3V0LCBpbiwgREVTX0JMT0NLX1NJWkUpOwogfQogCiBzdGF0aWMgdm9pZCBkZXNfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0LCBjb25zdCB1OCAqaW4pCiB7CiAJc3RydWN0IHMzOTBfZGVzX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAotCWNwYWNmX2ttKENQQUNGX0tNX0RFQV9ERUMsIGN0eC0+a2V5LCBvdXQsIGluLCBERVNfQkxPQ0tfU0laRSk7CisJY3BhY2Zfa20oQ1BBQ0ZfS01fREVBIHwgQ1BBQ0ZfREVDUllQVCwKKwkJIGN0eC0+a2V5LCBvdXQsIGluLCBERVNfQkxPQ0tfU0laRSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBkZXNfYWxnID0gewpAQCAtODIsNjEgKzg1LDQ2IEBACiAJfQogfTsKIAotc3RhdGljIGludCBlY2JfZGVzYWxsX2NyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgbG9uZyBmdW5jLAotCQkJICAgIHU4ICprZXksIHN0cnVjdCBibGtjaXBoZXJfd2FsayAqd2FsaykKLXsKLQlpbnQgcmV0ID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCB3YWxrKTsKLQl1bnNpZ25lZCBpbnQgbmJ5dGVzOwotCi0Jd2hpbGUgKChuYnl0ZXMgPSB3YWxrLT5uYnl0ZXMpKSB7Ci0JCS8qIG9ubHkgdXNlIGNvbXBsZXRlIGJsb2NrcyAqLwotCQl1bnNpZ25lZCBpbnQgbiA9IG5ieXRlcyAmIH4oREVTX0JMT0NLX1NJWkUgLSAxKTsKLQkJdTggKm91dCA9IHdhbGstPmRzdC52aXJ0LmFkZHI7Ci0JCXU4ICppbiA9IHdhbGstPnNyYy52aXJ0LmFkZHI7Ci0KLQkJcmV0ID0gY3BhY2Zfa20oZnVuYywga2V5LCBvdXQsIGluLCBuKTsKLQkJaWYgKHJldCA8IDAgfHwgcmV0ICE9IG4pCi0JCQlyZXR1cm4gLUVJTzsKLQotCQluYnl0ZXMgJj0gREVTX0JMT0NLX1NJWkUgLSAxOwotCQlyZXQgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsIHdhbGssIG5ieXRlcyk7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBjYmNfZGVzYWxsX2NyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgbG9uZyBmdW5jLAorc3RhdGljIGludCBlY2JfZGVzYWxsX2NyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgdW5zaWduZWQgbG9uZyBmYywKIAkJCSAgICBzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgKndhbGspCiB7CiAJc3RydWN0IHMzOTBfZGVzX2N0eCAqY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKLQlpbnQgcmV0ID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCB3YWxrKTsKLQl1bnNpZ25lZCBpbnQgbmJ5dGVzID0gd2Fsay0+bmJ5dGVzOworCXVuc2lnbmVkIGludCBuYnl0ZXMsIG47CisJaW50IHJldDsKKworCXJldCA9IGJsa2NpcGhlcl93YWxrX3ZpcnQoZGVzYywgd2Fsayk7CisJd2hpbGUgKChuYnl0ZXMgPSB3YWxrLT5uYnl0ZXMpID49IERFU19CTE9DS19TSVpFKSB7CisJCS8qIG9ubHkgdXNlIGNvbXBsZXRlIGJsb2NrcyAqLworCQluID0gbmJ5dGVzICYgfihERVNfQkxPQ0tfU0laRSAtIDEpOworCQljcGFjZl9rbShmYywgY3R4LT5rZXksIHdhbGstPmRzdC52aXJ0LmFkZHIsCisJCQkgd2Fsay0+c3JjLnZpcnQuYWRkciwgbik7CisJCXJldCA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgd2FsaywgbmJ5dGVzIC0gbik7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY2JjX2Rlc2FsbF9jcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsIHVuc2lnbmVkIGxvbmcgZmMsCisJCQkgICAgc3RydWN0IGJsa2NpcGhlcl93YWxrICp3YWxrKQoreworCXN0cnVjdCBzMzkwX2Rlc19jdHggKmN0eCA9IGNyeXB0b19ibGtjaXBoZXJfY3R4KGRlc2MtPnRmbSk7CisJdW5zaWduZWQgaW50IG5ieXRlcywgbjsKKwlpbnQgcmV0OwogCXN0cnVjdCB7CiAJCXU4IGl2W0RFU19CTE9DS19TSVpFXTsKIAkJdTgga2V5W0RFUzNfS0VZX1NJWkVdOwogCX0gcGFyYW07CiAKLQlpZiAoIW5ieXRlcykKLQkJZ290byBvdXQ7Ci0KKwlyZXQgPSBibGtjaXBoZXJfd2Fsa192aXJ0KGRlc2MsIHdhbGspOwogCW1lbWNweShwYXJhbS5pdiwgd2Fsay0+aXYsIERFU19CTE9DS19TSVpFKTsKIAltZW1jcHkocGFyYW0ua2V5LCBjdHgtPmtleSwgREVTM19LRVlfU0laRSk7Ci0JZG8geworCXdoaWxlICgobmJ5dGVzID0gd2Fsay0+bmJ5dGVzKSA+PSBERVNfQkxPQ0tfU0laRSkgewogCQkvKiBvbmx5IHVzZSBjb21wbGV0ZSBibG9ja3MgKi8KLQkJdW5zaWduZWQgaW50IG4gPSBuYnl0ZXMgJiB+KERFU19CTE9DS19TSVpFIC0gMSk7Ci0JCXU4ICpvdXQgPSB3YWxrLT5kc3QudmlydC5hZGRyOwotCQl1OCAqaW4gPSB3YWxrLT5zcmMudmlydC5hZGRyOwotCi0JCXJldCA9IGNwYWNmX2ttYyhmdW5jLCAmcGFyYW0sIG91dCwgaW4sIG4pOwotCQlpZiAocmV0IDwgMCB8fCByZXQgIT0gbikKLQkJCXJldHVybiAtRUlPOwotCi0JCW5ieXRlcyAmPSBERVNfQkxPQ0tfU0laRSAtIDE7Ci0JCXJldCA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgd2FsaywgbmJ5dGVzKTsKLQl9IHdoaWxlICgobmJ5dGVzID0gd2Fsay0+bmJ5dGVzKSk7CisJCW4gPSBuYnl0ZXMgJiB+KERFU19CTE9DS19TSVpFIC0gMSk7CisJCWNwYWNmX2ttYyhmYywgJnBhcmFtLCB3YWxrLT5kc3QudmlydC5hZGRyLAorCQkJICB3YWxrLT5zcmMudmlydC5hZGRyLCBuKTsKKwkJcmV0ID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCB3YWxrLCBuYnl0ZXMgLSBuKTsKKwl9CiAJbWVtY3B5KHdhbGstPml2LCBwYXJhbS5pdiwgREVTX0JMT0NLX1NJWkUpOwotCi1vdXQ6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTQ0LDIyICsxMzIsMjAgQEAKIAkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKIAkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCiB7Ci0Jc3RydWN0IHMzOTBfZGVzX2N0eCAqY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKIAlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKIAogCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOwotCXJldHVybiBlY2JfZGVzYWxsX2NyeXB0KGRlc2MsIENQQUNGX0tNX0RFQV9FTkMsIGN0eC0+a2V5LCAmd2Fsayk7CisJcmV0dXJuIGVjYl9kZXNhbGxfY3J5cHQoZGVzYywgQ1BBQ0ZfS01fREVBLCAmd2Fsayk7CiB9CiAKIHN0YXRpYyBpbnQgZWNiX2Rlc19kZWNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKIAkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKIAkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCiB7Ci0Jc3RydWN0IHMzOTBfZGVzX2N0eCAqY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKIAlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKIAogCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOwotCXJldHVybiBlY2JfZGVzYWxsX2NyeXB0KGRlc2MsIENQQUNGX0tNX0RFQV9ERUMsIGN0eC0+a2V5LCAmd2Fsayk7CisJcmV0dXJuIGVjYl9kZXNhbGxfY3J5cHQoZGVzYywgQ1BBQ0ZfS01fREVBIHwgQ1BBQ0ZfREVDUllQVCwgJndhbGspOwogfQogCiBzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgZWNiX2Rlc19hbGcgPSB7CkBAIC0xODksNyArMTc1LDcgQEAKIAlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKIAogCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOwotCXJldHVybiBjYmNfZGVzYWxsX2NyeXB0KGRlc2MsIENQQUNGX0tNQ19ERUFfRU5DLCAmd2Fsayk7CisJcmV0dXJuIGNiY19kZXNhbGxfY3J5cHQoZGVzYywgQ1BBQ0ZfS01DX0RFQSwgJndhbGspOwogfQogCiBzdGF0aWMgaW50IGNiY19kZXNfZGVjcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCkBAIC0xOTksNyArMTg1LDcgQEAKIAlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKIAogCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOwotCXJldHVybiBjYmNfZGVzYWxsX2NyeXB0KGRlc2MsIENQQUNGX0tNQ19ERUFfREVDLCAmd2Fsayk7CisJcmV0dXJuIGNiY19kZXNhbGxfY3J5cHQoZGVzYywgQ1BBQ0ZfS01DX0RFQSB8IENQQUNGX0RFQ1JZUFQsICZ3YWxrKTsKIH0KIAogc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGNiY19kZXNfYWxnID0gewpAQCAtMjQwLDEzICsyMjYsMTIgQEAKIAkJICAgICAgIHVuc2lnbmVkIGludCBrZXlfbGVuKQogewogCXN0cnVjdCBzMzkwX2Rlc19jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7Ci0JdTMyICpmbGFncyA9ICZ0Zm0tPmNydF9mbGFnczsKIAogCWlmICghKGNyeXB0b19tZW1uZXEoa2V5LCAma2V5W0RFU19LRVlfU0laRV0sIERFU19LRVlfU0laRSkgJiYKIAkgICAgY3J5cHRvX21lbW5lcSgma2V5W0RFU19LRVlfU0laRV0sICZrZXlbREVTX0tFWV9TSVpFICogMl0sCiAJCQkgIERFU19LRVlfU0laRSkpICYmCi0JICAgICgqZmxhZ3MgJiBDUllQVE9fVEZNX1JFUV9XRUFLX0tFWSkpIHsKLQkJKmZsYWdzIHw9IENSWVBUT19URk1fUkVTX1dFQUtfS0VZOworCSAgICAodGZtLT5jcnRfZmxhZ3MgJiBDUllQVE9fVEZNX1JFUV9XRUFLX0tFWSkpIHsKKwkJdGZtLT5jcnRfZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfV0VBS19LRVk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAltZW1jcHkoY3R4LT5rZXksIGtleSwga2V5X2xlbik7CkBAIC0yNTcsMTQgKzI0MiwxNSBAQAogewogCXN0cnVjdCBzMzkwX2Rlc19jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAKLQljcGFjZl9rbShDUEFDRl9LTV9UREVBXzE5Ml9FTkMsIGN0eC0+a2V5LCBkc3QsIHNyYywgREVTX0JMT0NLX1NJWkUpOworCWNwYWNmX2ttKENQQUNGX0tNX1RERUFfMTkyLCBjdHgtPmtleSwgZHN0LCBzcmMsIERFU19CTE9DS19TSVpFKTsKIH0KIAogc3RhdGljIHZvaWQgZGVzM19kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCiB7CiAJc3RydWN0IHMzOTBfZGVzX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAotCWNwYWNmX2ttKENQQUNGX0tNX1RERUFfMTkyX0RFQywgY3R4LT5rZXksIGRzdCwgc3JjLCBERVNfQkxPQ0tfU0laRSk7CisJY3BhY2Zfa20oQ1BBQ0ZfS01fVERFQV8xOTIgfCBDUEFDRl9ERUNSWVBULAorCQkgY3R4LT5rZXksIGRzdCwgc3JjLCBERVNfQkxPQ0tfU0laRSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBkZXMzX2FsZyA9IHsKQEAgLTI5MCwyMiArMjc2LDIxIEBACiAJCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAogCQkJICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCiB7Ci0Jc3RydWN0IHMzOTBfZGVzX2N0eCAqY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKIAlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKIAogCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOwotCXJldHVybiBlY2JfZGVzYWxsX2NyeXB0KGRlc2MsIENQQUNGX0tNX1RERUFfMTkyX0VOQywgY3R4LT5rZXksICZ3YWxrKTsKKwlyZXR1cm4gZWNiX2Rlc2FsbF9jcnlwdChkZXNjLCBDUEFDRl9LTV9UREVBXzE5MiwgJndhbGspOwogfQogCiBzdGF0aWMgaW50IGVjYl9kZXMzX2RlY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLAogCQkJICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKIAkJCSAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQogewotCXN0cnVjdCBzMzkwX2Rlc19jdHggKmN0eCA9IGNyeXB0b19ibGtjaXBoZXJfY3R4KGRlc2MtPnRmbSk7CiAJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CiAKIAlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKLQlyZXR1cm4gZWNiX2Rlc2FsbF9jcnlwdChkZXNjLCBDUEFDRl9LTV9UREVBXzE5Ml9ERUMsIGN0eC0+a2V5LCAmd2Fsayk7CisJcmV0dXJuIGVjYl9kZXNhbGxfY3J5cHQoZGVzYywgQ1BBQ0ZfS01fVERFQV8xOTIgfCBDUEFDRl9ERUNSWVBULAorCQkJCSZ3YWxrKTsKIH0KIAogc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGVjYl9kZXMzX2FsZyA9IHsKQEAgLTMzNSw3ICszMjAsNyBAQAogCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwogCiAJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7Ci0JcmV0dXJuIGNiY19kZXNhbGxfY3J5cHQoZGVzYywgQ1BBQ0ZfS01DX1RERUFfMTkyX0VOQywgJndhbGspOworCXJldHVybiBjYmNfZGVzYWxsX2NyeXB0KGRlc2MsIENQQUNGX0tNQ19UREVBXzE5MiwgJndhbGspOwogfQogCiBzdGF0aWMgaW50IGNiY19kZXMzX2RlY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLApAQCAtMzQ1LDcgKzMzMCw4IEBACiAJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CiAKIAlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKLQlyZXR1cm4gY2JjX2Rlc2FsbF9jcnlwdChkZXNjLCBDUEFDRl9LTUNfVERFQV8xOTJfREVDLCAmd2Fsayk7CisJcmV0dXJuIGNiY19kZXNhbGxfY3J5cHQoZGVzYywgQ1BBQ0ZfS01DX1RERUFfMTkyIHwgQ1BBQ0ZfREVDUllQVCwKKwkJCQkmd2Fsayk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBjYmNfZGVzM19hbGcgPSB7CkBAIC0zNjksODEgKzM1NSw1NCBAQAogCX0KIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19jdHJibGtfaW5pdCh1OCAqY3RycHRyLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQorc3RhdGljIHVuc2lnbmVkIGludCBfX2N0cmJsa19pbml0KHU4ICpjdHJwdHIsIHU4ICppdiwgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKIAl1bnNpZ25lZCBpbnQgaSwgbjsKIAogCS8qIGFsaWduIHRvIGJsb2NrIHNpemUsIG1heC4gUEFHRV9TSVpFICovCiAJbiA9IChuYnl0ZXMgPiBQQUdFX1NJWkUpID8gUEFHRV9TSVpFIDogbmJ5dGVzICYgfihERVNfQkxPQ0tfU0laRSAtIDEpOwotCWZvciAoaSA9IERFU19CTE9DS19TSVpFOyBpIDwgbjsgaSArPSBERVNfQkxPQ0tfU0laRSkgewotCQltZW1jcHkoY3RycHRyICsgaSwgY3RycHRyICsgaSAtIERFU19CTE9DS19TSVpFLCBERVNfQkxPQ0tfU0laRSk7Ci0JCWNyeXB0b19pbmMoY3RycHRyICsgaSwgREVTX0JMT0NLX1NJWkUpOworCW1lbWNweShjdHJwdHIsIGl2LCBERVNfQkxPQ0tfU0laRSk7CisJZm9yIChpID0gKG4gLyBERVNfQkxPQ0tfU0laRSkgLSAxOyBpID4gMDsgaS0tKSB7CisJCW1lbWNweShjdHJwdHIgKyBERVNfQkxPQ0tfU0laRSwgY3RycHRyLCBERVNfQkxPQ0tfU0laRSk7CisJCWNyeXB0b19pbmMoY3RycHRyICsgREVTX0JMT0NLX1NJWkUsIERFU19CTE9DS19TSVpFKTsKKwkJY3RycHRyICs9IERFU19CTE9DS19TSVpFOwogCX0KIAlyZXR1cm4gbjsKIH0KIAotc3RhdGljIGludCBjdHJfZGVzYWxsX2NyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgbG9uZyBmdW5jLAotCQkJICAgIHN0cnVjdCBzMzkwX2Rlc19jdHggKmN0eCwKK3N0YXRpYyBpbnQgY3RyX2Rlc2FsbF9jcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsIHVuc2lnbmVkIGxvbmcgZmMsCiAJCQkgICAgc3RydWN0IGJsa2NpcGhlcl93YWxrICp3YWxrKQogewotCWludCByZXQgPSBibGtjaXBoZXJfd2Fsa192aXJ0X2Jsb2NrKGRlc2MsIHdhbGssIERFU19CTE9DS19TSVpFKTsKKwlzdHJ1Y3QgczM5MF9kZXNfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOworCXU4IGJ1ZltERVNfQkxPQ0tfU0laRV0sICpjdHJwdHI7CiAJdW5zaWduZWQgaW50IG4sIG5ieXRlczsKLQl1OCBidWZbREVTX0JMT0NLX1NJWkVdLCBjdHJidWZbREVTX0JMT0NLX1NJWkVdOwotCXU4ICpvdXQsICppbiwgKmN0cnB0ciA9IGN0cmJ1ZjsKKwlpbnQgcmV0LCBsb2NrZWQ7CiAKLQlpZiAoIXdhbGstPm5ieXRlcykKLQkJcmV0dXJuIHJldDsKKwlsb2NrZWQgPSBzcGluX3RyeWxvY2soJmN0cmJsa19sb2NrKTsKIAotCWlmIChzcGluX3RyeWxvY2soJmN0cmJsa19sb2NrKSkKLQkJY3RycHRyID0gY3RyYmxrOwotCi0JbWVtY3B5KGN0cnB0ciwgd2Fsay0+aXYsIERFU19CTE9DS19TSVpFKTsKKwlyZXQgPSBibGtjaXBoZXJfd2Fsa192aXJ0X2Jsb2NrKGRlc2MsIHdhbGssIERFU19CTE9DS19TSVpFKTsKIAl3aGlsZSAoKG5ieXRlcyA9IHdhbGstPm5ieXRlcykgPj0gREVTX0JMT0NLX1NJWkUpIHsKLQkJb3V0ID0gd2Fsay0+ZHN0LnZpcnQuYWRkcjsKLQkJaW4gPSB3YWxrLT5zcmMudmlydC5hZGRyOwotCQl3aGlsZSAobmJ5dGVzID49IERFU19CTE9DS19TSVpFKSB7Ci0JCQlpZiAoY3RycHRyID09IGN0cmJsaykKLQkJCQluID0gX19jdHJibGtfaW5pdChjdHJwdHIsIG5ieXRlcyk7Ci0JCQllbHNlCi0JCQkJbiA9IERFU19CTE9DS19TSVpFOwotCQkJcmV0ID0gY3BhY2Zfa21jdHIoZnVuYywgY3R4LT5rZXksIG91dCwgaW4sIG4sIGN0cnB0cik7Ci0JCQlpZiAocmV0IDwgMCB8fCByZXQgIT0gbikgewotCQkJCWlmIChjdHJwdHIgPT0gY3RyYmxrKQotCQkJCQlzcGluX3VubG9jaygmY3RyYmxrX2xvY2spOwotCQkJCXJldHVybiAtRUlPOwotCQkJfQotCQkJaWYgKG4gPiBERVNfQkxPQ0tfU0laRSkKLQkJCQltZW1jcHkoY3RycHRyLCBjdHJwdHIgKyBuIC0gREVTX0JMT0NLX1NJWkUsCi0JCQkJICAgICAgIERFU19CTE9DS19TSVpFKTsKLQkJCWNyeXB0b19pbmMoY3RycHRyLCBERVNfQkxPQ0tfU0laRSk7Ci0JCQlvdXQgKz0gbjsKLQkJCWluICs9IG47Ci0JCQluYnl0ZXMgLT0gbjsKLQkJfQotCQlyZXQgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsIHdhbGssIG5ieXRlcyk7CisJCW4gPSBERVNfQkxPQ0tfU0laRTsKKwkJaWYgKG5ieXRlcyA+PSAyKkRFU19CTE9DS19TSVpFICYmIGxvY2tlZCkKKwkJCW4gPSBfX2N0cmJsa19pbml0KGN0cmJsaywgd2Fsay0+aXYsIG5ieXRlcyk7CisJCWN0cnB0ciA9IChuID4gREVTX0JMT0NLX1NJWkUpID8gY3RyYmxrIDogd2Fsay0+aXY7CisJCWNwYWNmX2ttY3RyKGZjLCBjdHgtPmtleSwgd2Fsay0+ZHN0LnZpcnQuYWRkciwKKwkJCSAgICB3YWxrLT5zcmMudmlydC5hZGRyLCBuLCBjdHJwdHIpOworCQlpZiAoY3RycHRyID09IGN0cmJsaykKKwkJCW1lbWNweSh3YWxrLT5pdiwgY3RycHRyICsgbiAtIERFU19CTE9DS19TSVpFLAorCQkJCURFU19CTE9DS19TSVpFKTsKKwkJY3J5cHRvX2luYyh3YWxrLT5pdiwgREVTX0JMT0NLX1NJWkUpOworCQlyZXQgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsIHdhbGssIG5ieXRlcyAtIG4pOwogCX0KLQlpZiAoY3RycHRyID09IGN0cmJsaykgewotCQlpZiAobmJ5dGVzKQotCQkJbWVtY3B5KGN0cmJ1ZiwgY3RycHRyLCBERVNfQkxPQ0tfU0laRSk7Ci0JCWVsc2UKLQkJCW1lbWNweSh3YWxrLT5pdiwgY3RycHRyLCBERVNfQkxPQ0tfU0laRSk7CisJaWYgKGxvY2tlZCkKIAkJc3Bpbl91bmxvY2soJmN0cmJsa19sb2NrKTsKLQl9IGVsc2UgewotCQlpZiAoIW5ieXRlcykKLQkJCW1lbWNweSh3YWxrLT5pdiwgY3RycHRyLCBERVNfQkxPQ0tfU0laRSk7Ci0JfQogCS8qIGZpbmFsIGJsb2NrIG1heSBiZSA8IERFU19CTE9DS19TSVpFLCBjb3B5IG9ubHkgbmJ5dGVzICovCiAJaWYgKG5ieXRlcykgewotCQlvdXQgPSB3YWxrLT5kc3QudmlydC5hZGRyOwotCQlpbiA9IHdhbGstPnNyYy52aXJ0LmFkZHI7Ci0JCXJldCA9IGNwYWNmX2ttY3RyKGZ1bmMsIGN0eC0+a2V5LCBidWYsIGluLAotCQkJCSAgREVTX0JMT0NLX1NJWkUsIGN0cmJ1Zik7Ci0JCWlmIChyZXQgPCAwIHx8IHJldCAhPSBERVNfQkxPQ0tfU0laRSkKLQkJCXJldHVybiAtRUlPOwotCQltZW1jcHkob3V0LCBidWYsIG5ieXRlcyk7Ci0JCWNyeXB0b19pbmMoY3RyYnVmLCBERVNfQkxPQ0tfU0laRSk7CisJCWNwYWNmX2ttY3RyKGZjLCBjdHgtPmtleSwgYnVmLCB3YWxrLT5zcmMudmlydC5hZGRyLAorCQkJICAgIERFU19CTE9DS19TSVpFLCB3YWxrLT5pdik7CisJCW1lbWNweSh3YWxrLT5kc3QudmlydC5hZGRyLCBidWYsIG5ieXRlcyk7CisJCWNyeXB0b19pbmMod2Fsay0+aXYsIERFU19CTE9DS19TSVpFKTsKIAkJcmV0ID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCB3YWxrLCAwKTsKLQkJbWVtY3B5KHdhbGstPml2LCBjdHJidWYsIERFU19CTE9DS19TSVpFKTsKIAl9CiAJcmV0dXJuIHJldDsKIH0KQEAgLTQ1MiwyMiArNDExLDIwIEBACiAJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCiAJCQkgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQogewotCXN0cnVjdCBzMzkwX2Rlc19jdHggKmN0eCA9IGNyeXB0b19ibGtjaXBoZXJfY3R4KGRlc2MtPnRmbSk7CiAJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CiAKIAlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKLQlyZXR1cm4gY3RyX2Rlc2FsbF9jcnlwdChkZXNjLCBDUEFDRl9LTUNUUl9ERUFfRU5DLCBjdHgsICZ3YWxrKTsKKwlyZXR1cm4gY3RyX2Rlc2FsbF9jcnlwdChkZXNjLCBDUEFDRl9LTUNUUl9ERUEsICZ3YWxrKTsKIH0KIAogc3RhdGljIGludCBjdHJfZGVzX2RlY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLAogCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAogCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKLQlzdHJ1Y3QgczM5MF9kZXNfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOwogCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwogCiAJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7Ci0JcmV0dXJuIGN0cl9kZXNhbGxfY3J5cHQoZGVzYywgQ1BBQ0ZfS01DVFJfREVBX0RFQywgY3R4LCAmd2Fsayk7CisJcmV0dXJuIGN0cl9kZXNhbGxfY3J5cHQoZGVzYywgQ1BBQ0ZfS01DVFJfREVBIHwgQ1BBQ0ZfREVDUllQVCwgJndhbGspOwogfQogCiBzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgY3RyX2Rlc19hbGcgPSB7CkBAIC00OTUsMjIgKzQ1MiwyMSBAQAogCQkJICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKIAkJCSAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQogewotCXN0cnVjdCBzMzkwX2Rlc19jdHggKmN0eCA9IGNyeXB0b19ibGtjaXBoZXJfY3R4KGRlc2MtPnRmbSk7CiAJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CiAKIAlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKLQlyZXR1cm4gY3RyX2Rlc2FsbF9jcnlwdChkZXNjLCBDUEFDRl9LTUNUUl9UREVBXzE5Ml9FTkMsIGN0eCwgJndhbGspOworCXJldHVybiBjdHJfZGVzYWxsX2NyeXB0KGRlc2MsIENQQUNGX0tNQ1RSX1RERUFfMTkyLCAmd2Fsayk7CiB9CiAKIHN0YXRpYyBpbnQgY3RyX2RlczNfZGVjcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCiAJCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAogCQkJICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCiB7Ci0Jc3RydWN0IHMzOTBfZGVzX2N0eCAqY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKIAlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKIAogCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOwotCXJldHVybiBjdHJfZGVzYWxsX2NyeXB0KGRlc2MsIENQQUNGX0tNQ1RSX1RERUFfMTkyX0RFQywgY3R4LCAmd2Fsayk7CisJcmV0dXJuIGN0cl9kZXNhbGxfY3J5cHQoZGVzYywgQ1BBQ0ZfS01DVFJfVERFQV8xOTIgfCBDUEFDRl9ERUNSWVBULAorCQkJCSZ3YWxrKTsKIH0KIAogc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGN0cl9kZXMzX2FsZyA9IHsKQEAgLTUzNCw4MyArNDkwLDg3IEBACiAJfQogfTsKIAorc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnICpkZXNfczM5MF9hbGdzX3B0cls4XTsKK3N0YXRpYyBpbnQgZGVzX3MzOTBfYWxnc19udW07CisKK3N0YXRpYyBpbnQgZGVzX3MzOTBfcmVnaXN0ZXJfYWxnKHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCit7CisJaW50IHJldDsKKworCXJldCA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoYWxnKTsKKwlpZiAoIXJldCkKKwkJZGVzX3MzOTBfYWxnc19wdHJbZGVzX3MzOTBfYWxnc19udW0rK10gPSBhbGc7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZGVzX3MzOTBfZXhpdCh2b2lkKQoreworCXdoaWxlIChkZXNfczM5MF9hbGdzX251bS0tKQorCQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoZGVzX3MzOTBfYWxnc19wdHJbZGVzX3MzOTBfYWxnc19udW1dKTsKKwlpZiAoY3RyYmxrKQorCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGN0cmJsayk7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IGRlc19zMzkwX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0OwogCi0JaWYgKCFjcGFjZl9xdWVyeShDUEFDRl9LTSwgQ1BBQ0ZfS01fREVBX0VOQykgfHwKLQkgICAgIWNwYWNmX3F1ZXJ5KENQQUNGX0tNLCBDUEFDRl9LTV9UREVBXzE5Ml9FTkMpKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJLyogUXVlcnkgYXZhaWxhYmxlIGZ1bmN0aW9ucyBmb3IgS00sIEtNQyBhbmQgS01DVFIgKi8KKwljcGFjZl9xdWVyeShDUEFDRl9LTSwgJmttX2Z1bmN0aW9ucyk7CisJY3BhY2ZfcXVlcnkoQ1BBQ0ZfS01DLCAma21jX2Z1bmN0aW9ucyk7CisJY3BhY2ZfcXVlcnkoQ1BBQ0ZfS01DVFIsICZrbWN0cl9mdW5jdGlvbnMpOwogCi0JcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmZGVzX2FsZyk7Ci0JaWYgKHJldCkKLQkJZ290byBkZXNfZXJyOwotCXJldCA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJmVjYl9kZXNfYWxnKTsKLQlpZiAocmV0KQotCQlnb3RvIGVjYl9kZXNfZXJyOwotCXJldCA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJmNiY19kZXNfYWxnKTsKLQlpZiAocmV0KQotCQlnb3RvIGNiY19kZXNfZXJyOwotCXJldCA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJmRlczNfYWxnKTsKLQlpZiAocmV0KQotCQlnb3RvIGRlczNfZXJyOwotCXJldCA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJmVjYl9kZXMzX2FsZyk7Ci0JaWYgKHJldCkKLQkJZ290byBlY2JfZGVzM19lcnI7Ci0JcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmY2JjX2RlczNfYWxnKTsKLQlpZiAocmV0KQotCQlnb3RvIGNiY19kZXMzX2VycjsKKwlpZiAoY3BhY2ZfdGVzdF9mdW5jKCZrbV9mdW5jdGlvbnMsIENQQUNGX0tNX0RFQSkpIHsKKwkJcmV0ID0gZGVzX3MzOTBfcmVnaXN0ZXJfYWxnKCZkZXNfYWxnKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X2VycjsKKwkJcmV0ID0gZGVzX3MzOTBfcmVnaXN0ZXJfYWxnKCZlY2JfZGVzX2FsZyk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dF9lcnI7CisJfQorCWlmIChjcGFjZl90ZXN0X2Z1bmMoJmttY19mdW5jdGlvbnMsIENQQUNGX0tNQ19ERUEpKSB7CisJCXJldCA9IGRlc19zMzkwX3JlZ2lzdGVyX2FsZygmY2JjX2Rlc19hbGcpOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfZXJyOworCX0KKwlpZiAoY3BhY2ZfdGVzdF9mdW5jKCZrbV9mdW5jdGlvbnMsIENQQUNGX0tNX1RERUFfMTkyKSkgeworCQlyZXQgPSBkZXNfczM5MF9yZWdpc3Rlcl9hbGcoJmRlczNfYWxnKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X2VycjsKKwkJcmV0ID0gZGVzX3MzOTBfcmVnaXN0ZXJfYWxnKCZlY2JfZGVzM19hbGcpOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfZXJyOworCX0KKwlpZiAoY3BhY2ZfdGVzdF9mdW5jKCZrbWNfZnVuY3Rpb25zLCBDUEFDRl9LTUNfVERFQV8xOTIpKSB7CisJCXJldCA9IGRlc19zMzkwX3JlZ2lzdGVyX2FsZygmY2JjX2RlczNfYWxnKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X2VycjsKKwl9CiAKLQlpZiAoY3BhY2ZfcXVlcnkoQ1BBQ0ZfS01DVFIsIENQQUNGX0tNQ1RSX0RFQV9FTkMpICYmCi0JICAgIGNwYWNmX3F1ZXJ5KENQQUNGX0tNQ1RSLCBDUEFDRl9LTUNUUl9UREVBXzE5Ml9FTkMpKSB7Ci0JCXJldCA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJmN0cl9kZXNfYWxnKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gY3RyX2Rlc19lcnI7Ci0JCXJldCA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJmN0cl9kZXMzX2FsZyk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGN0cl9kZXMzX2VycjsKKwlpZiAoY3BhY2ZfdGVzdF9mdW5jKCZrbWN0cl9mdW5jdGlvbnMsIENQQUNGX0tNQ1RSX0RFQSkgfHwKKwkgICAgY3BhY2ZfdGVzdF9mdW5jKCZrbWN0cl9mdW5jdGlvbnMsIENQQUNGX0tNQ1RSX1RERUFfMTkyKSkgewogCQljdHJibGsgPSAodTggKikgX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwogCQlpZiAoIWN0cmJsaykgewogCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gY3RyX21lbV9lcnI7CisJCQlnb3RvIG91dF9lcnI7CiAJCX0KIAl9Ci1vdXQ6Ci0JcmV0dXJuIHJldDsKIAotY3RyX21lbV9lcnI6Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZjdHJfZGVzM19hbGcpOwotY3RyX2RlczNfZXJyOgotCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmY3RyX2Rlc19hbGcpOwotY3RyX2Rlc19lcnI6Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZjYmNfZGVzM19hbGcpOwotY2JjX2RlczNfZXJyOgotCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmZWNiX2RlczNfYWxnKTsKLWVjYl9kZXMzX2VycjoKLQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmRlczNfYWxnKTsKLWRlczNfZXJyOgotCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmY2JjX2Rlc19hbGcpOwotY2JjX2Rlc19lcnI6Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZlY2JfZGVzX2FsZyk7Ci1lY2JfZGVzX2VycjoKLQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmRlc19hbGcpOwotZGVzX2VycjoKLQlnb3RvIG91dDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGRlc19zMzkwX2V4aXQodm9pZCkKLXsKLQlpZiAoY3RyYmxrKSB7Ci0JCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmY3RyX2Rlc19hbGcpOwotCQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmN0cl9kZXMzX2FsZyk7Ci0JCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgY3RyYmxrKTsKKwlpZiAoY3BhY2ZfdGVzdF9mdW5jKCZrbWN0cl9mdW5jdGlvbnMsIENQQUNGX0tNQ1RSX0RFQSkpIHsKKwkJcmV0ID0gZGVzX3MzOTBfcmVnaXN0ZXJfYWxnKCZjdHJfZGVzX2FsZyk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dF9lcnI7CiAJfQotCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmY2JjX2RlczNfYWxnKTsKLQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmVjYl9kZXMzX2FsZyk7Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZkZXMzX2FsZyk7Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZjYmNfZGVzX2FsZyk7Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZlY2JfZGVzX2FsZyk7Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZkZXNfYWxnKTsKKwlpZiAoY3BhY2ZfdGVzdF9mdW5jKCZrbWN0cl9mdW5jdGlvbnMsIENQQUNGX0tNQ1RSX1RERUFfMTkyKSkgeworCQlyZXQgPSBkZXNfczM5MF9yZWdpc3Rlcl9hbGcoJmN0cl9kZXMzX2FsZyk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dF9lcnI7CisJfQorCisJcmV0dXJuIDA7CitvdXRfZXJyOgorCWRlc19zMzkwX2V4aXQoKTsKKwlyZXR1cm4gcmV0OwogfQogCiBtb2R1bGVfY3B1X2ZlYXR1cmVfbWF0Y2goTVNBLCBkZXNfczM5MF9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jcnlwdG8vZ2hhc2hfczM5MC5jIGIvYXJjaC9zMzkwL2NyeXB0by9naGFzaF9zMzkwLmMKaW5kZXggYWI2OGRlNy4uNTY0NjE2ZCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2NyeXB0by9naGFzaF9zMzkwLmMKKysrIGIvYXJjaC9zMzkwL2NyeXB0by9naGFzaF9zMzkwLmMKQEAgLTU4LDcgKzU4LDYgQEAKIAlzdHJ1Y3QgZ2hhc2hfZGVzY19jdHggKmRjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKIAl1bnNpZ25lZCBpbnQgbjsKIAl1OCAqYnVmID0gZGN0eC0+YnVmZmVyOwotCWludCByZXQ7CiAKIAlpZiAoZGN0eC0+Ynl0ZXMpIHsKIAkJdTggKnBvcyA9IGJ1ZiArIChHSEFTSF9CTE9DS19TSVpFIC0gZGN0eC0+Ynl0ZXMpOwpAQCAtNzEsMTggKzcwLDE0IEBACiAJCXNyYyArPSBuOwogCiAJCWlmICghZGN0eC0+Ynl0ZXMpIHsKLQkJCXJldCA9IGNwYWNmX2tpbWQoQ1BBQ0ZfS0lNRF9HSEFTSCwgZGN0eCwgYnVmLAotCQkJCQkgR0hBU0hfQkxPQ0tfU0laRSk7Ci0JCQlpZiAocmV0ICE9IEdIQVNIX0JMT0NLX1NJWkUpCi0JCQkJcmV0dXJuIC1FSU87CisJCQljcGFjZl9raW1kKENQQUNGX0tJTURfR0hBU0gsIGRjdHgsIGJ1ZiwKKwkJCQkgICBHSEFTSF9CTE9DS19TSVpFKTsKIAkJfQogCX0KIAogCW4gPSBzcmNsZW4gJiB+KEdIQVNIX0JMT0NLX1NJWkUgLSAxKTsKIAlpZiAobikgewotCQlyZXQgPSBjcGFjZl9raW1kKENQQUNGX0tJTURfR0hBU0gsIGRjdHgsIHNyYywgbik7Ci0JCWlmIChyZXQgIT0gbikKLQkJCXJldHVybiAtRUlPOworCQljcGFjZl9raW1kKENQQUNGX0tJTURfR0hBU0gsIGRjdHgsIHNyYywgbik7CiAJCXNyYyArPSBuOwogCQlzcmNsZW4gLT0gbjsKIAl9CkBAIC05OCwxNyArOTMsMTIgQEAKIHN0YXRpYyBpbnQgZ2hhc2hfZmx1c2goc3RydWN0IGdoYXNoX2Rlc2NfY3R4ICpkY3R4KQogewogCXU4ICpidWYgPSBkY3R4LT5idWZmZXI7Ci0JaW50IHJldDsKIAogCWlmIChkY3R4LT5ieXRlcykgewogCQl1OCAqcG9zID0gYnVmICsgKEdIQVNIX0JMT0NLX1NJWkUgLSBkY3R4LT5ieXRlcyk7CiAKIAkJbWVtc2V0KHBvcywgMCwgZGN0eC0+Ynl0ZXMpOwotCi0JCXJldCA9IGNwYWNmX2tpbWQoQ1BBQ0ZfS0lNRF9HSEFTSCwgZGN0eCwgYnVmLCBHSEFTSF9CTE9DS19TSVpFKTsKLQkJaWYgKHJldCAhPSBHSEFTSF9CTE9DS19TSVpFKQotCQkJcmV0dXJuIC1FSU87Ci0KKwkJY3BhY2Zfa2ltZChDUEFDRl9LSU1EX0dIQVNILCBkY3R4LCBidWYsIEdIQVNIX0JMT0NLX1NJWkUpOwogCQlkY3R4LT5ieXRlcyA9IDA7CiAJfQogCkBAIC0xNDYsNyArMTM2LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgZ2hhc2hfbW9kX2luaXQodm9pZCkKIHsKLQlpZiAoIWNwYWNmX3F1ZXJ5KENQQUNGX0tJTUQsIENQQUNGX0tJTURfR0hBU0gpKQorCWlmICghY3BhY2ZfcXVlcnlfZnVuYyhDUEFDRl9LSU1ELCBDUEFDRl9LSU1EX0dIQVNIKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJcmV0dXJuIGNyeXB0b19yZWdpc3Rlcl9zaGFzaCgmZ2hhc2hfYWxnKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jcnlwdG8vcHJuZy5jIGIvYXJjaC9zMzkwL2NyeXB0by9wcm5nLmMKaW5kZXggNDE1MjdiMS4uOWNjMDUwZiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2NyeXB0by9wcm5nLmMKKysrIGIvYXJjaC9zMzkwL2NyeXB0by9wcm5nLmMKQEAgLTEzNSwxMiArMTM1LDcgQEAKIAkJZWxzZQogCQkJaCA9IGVidWY7CiAJCS8qIGdlbmVyYXRlIHNoYTI1NiBmcm9tIHRoaXMgcGFnZSAqLwotCQlpZiAoY3BhY2Zfa2ltZChDUEFDRl9LSU1EX1NIQV8yNTYsIGgsCi0JCQkgICAgICAgcGcsIFBBR0VfU0laRSkgIT0gUEFHRV9TSVpFKSB7Ci0JCQlwcm5nX2Vycm9yZmxhZyA9IFBSTkdfR0VOX0VOVFJPUFlfRkFJTEVEOwotCQkJcmV0ID0gLUVJTzsKLQkJCWdvdG8gb3V0OwotCQl9CisJCWNwYWNmX2tpbWQoQ1BBQ0ZfS0lNRF9TSEFfMjU2LCBoLCBwZywgUEFHRV9TSVpFKTsKIAkJaWYgKG4gPCBzaXplb2YoaGFzaCkpCiAJCQltZW1jcHkoZWJ1ZiwgaGFzaCwgbik7CiAJCXJldCArPSBuOwpAQCAtMTQ4LDcgKzE0Myw2IEBACiAJCW5ieXRlcyAtPSBuOwogCX0KIAotb3V0OgogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwZyk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE2MCwxMyArMTU0LDExIEBACiB7CiAJX191NjQgZW50cm9weVs0XTsKIAl1bnNpZ25lZCBpbnQgaTsKLQlpbnQgcmV0OwogCiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJcmV0ID0gY3BhY2Zfa21jKENQQUNGX0tNQ19QUk5HLCBwcm5nX2RhdGEtPnBybmd3cy5wYXJtX2Jsb2NrLAotCQkJCShjaGFyICopZW50cm9weSwgKGNoYXIgKillbnRyb3B5LAotCQkJCXNpemVvZihlbnRyb3B5KSk7Ci0JCUJVR19PTihyZXQgPCAwIHx8IHJldCAhPSBzaXplb2YoZW50cm9weSkpOworCQljcGFjZl9rbWMoQ1BBQ0ZfS01DX1BSTkcsIHBybmdfZGF0YS0+cHJuZ3dzLnBhcm1fYmxvY2ssCisJCQkgIChjaGFyICopIGVudHJvcHksIChjaGFyICopIGVudHJvcHksCisJCQkgIHNpemVvZihlbnRyb3B5KSk7CiAJCW1lbWNweShwcm5nX2RhdGEtPnBybmd3cy5wYXJtX2Jsb2NrLCBlbnRyb3B5LCBzaXplb2YoZW50cm9weSkpOwogCX0KIH0KQEAgLTMwMywyMSArMjk1LDE0IEBACiAJCTB4MjEsIDB4ZTQsIDB4YjAsIDB4ODYsIDB4NDQsIDB4ZjYsIDB4NzIsIDB4N2MsCiAJCTB4MzYsIDB4OGMsIDB4NWEsIDB4OWYsIDB4N2EsIDB4NGIsIDB4M2UsIDB4ZTIgfTsKIAotCWludCByZXQgPSAwOwogCXU4IGJ1ZltzaXplb2YocmFuZG9tKV07CiAJc3RydWN0IHBwbm9fd3NfcyB3czsKIAogCW1lbXNldCgmd3MsIDAsIHNpemVvZih3cykpOwogCiAJLyogaW5pdGlhbCBzZWVkICovCi0JcmV0ID0gY3BhY2ZfcHBubyhDUEFDRl9QUE5PX1NIQTUxMl9EUk5HX1NFRUQsICZ3cywgTlVMTCwgMCwKLQkJCSBzZWVkLCBzaXplb2Yoc2VlZCkpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiVGhlIHBybmcgc2VsZiB0ZXN0IHNlZWQgb3BlcmF0aW9uIGZvciB0aGUgIgotCQkgICAgICAgIlNIQS01MTIgbW9kZSBmYWlsZWQgd2l0aCByYz0lZFxuIiwgcmV0KTsKLQkJcHJuZ19lcnJvcmZsYWcgPSBQUk5HX1NFTEZURVNUX0ZBSUxFRDsKLQkJcmV0dXJuIC1FSU87Ci0JfQorCWNwYWNmX3Bwbm8oQ1BBQ0ZfUFBOT19TSEE1MTJfRFJOR19TRUVELAorCQkgICAmd3MsIE5VTEwsIDAsIHNlZWQsIHNpemVvZihzZWVkKSk7CiAKIAkvKiBjaGVjayB3b3JraW5nIHN0YXRlcyBWIGFuZCBDICovCiAJaWYgKG1lbWNtcCh3cy5WLCBWMCwgc2l6ZW9mKFYwKSkgIT0gMApAQCAtMzI5LDIyICszMTQsMTAgQEAKIAl9CiAKIAkvKiBnZW5lcmF0ZSByYW5kb20gYnl0ZXMgKi8KLQlyZXQgPSBjcGFjZl9wcG5vKENQQUNGX1BQTk9fU0hBNTEyX0RSTkdfR0VOLAotCQkJICZ3cywgYnVmLCBzaXplb2YoYnVmKSwgTlVMTCwgMCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCJUaGUgcHJuZyBzZWxmIHRlc3QgZ2VuZXJhdGUgb3BlcmF0aW9uIGZvciAiCi0JCSAgICAgICAidGhlIFNIQS01MTIgbW9kZSBmYWlsZWQgd2l0aCByYz0lZFxuIiwgcmV0KTsKLQkJcHJuZ19lcnJvcmZsYWcgPSBQUk5HX1NFTEZURVNUX0ZBSUxFRDsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCXJldCA9IGNwYWNmX3Bwbm8oQ1BBQ0ZfUFBOT19TSEE1MTJfRFJOR19HRU4sCi0JCQkgJndzLCBidWYsIHNpemVvZihidWYpLCBOVUxMLCAwKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIlRoZSBwcm5nIHNlbGYgdGVzdCBnZW5lcmF0ZSBvcGVyYXRpb24gZm9yICIKLQkJICAgICAgICJ0aGUgU0hBLTUxMiBtb2RlIGZhaWxlZCB3aXRoIHJjPSVkXG4iLCByZXQpOwotCQlwcm5nX2Vycm9yZmxhZyA9IFBSTkdfU0VMRlRFU1RfRkFJTEVEOwotCQlyZXR1cm4gLUVJTzsKLQl9CisJY3BhY2ZfcHBubyhDUEFDRl9QUE5PX1NIQTUxMl9EUk5HX0dFTiwKKwkJICAgJndzLCBidWYsIHNpemVvZihidWYpLCBOVUxMLCAwKTsKKwljcGFjZl9wcG5vKENQQUNGX1BQTk9fU0hBNTEyX0RSTkdfR0VOLAorCQkgICAmd3MsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIE5VTEwsIDApOwogCiAJLyogY2hlY2sgYWdhaW5zdCBleHBlY3RlZCBkYXRhICovCiAJaWYgKG1lbWNtcChidWYsIHJhbmRvbSwgc2l6ZW9mKHJhbmRvbSkpICE9IDApIHsKQEAgLTM5MiwyNiArMzY1LDE2IEBACiAJZ2V0X3RvZF9jbG9ja19leHQoc2VlZCArIDQ4KTsKIAogCS8qIGluaXRpYWwgc2VlZCBvZiB0aGUgcHBubyBkcm5nICovCi0JcmV0ID0gY3BhY2ZfcHBubyhDUEFDRl9QUE5PX1NIQTUxMl9EUk5HX1NFRUQsCi0JCQkgJnBybmdfZGF0YS0+cHBub3dzLCBOVUxMLCAwLCBzZWVkLCBzaXplb2Yoc2VlZCkpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXBybmdfZXJyb3JmbGFnID0gUFJOR19TRUVEX0ZBSUxFRDsKLQkJcmV0ID0gLUVJTzsKLQkJZ290byBvdXRmcmVlOwotCX0KKwljcGFjZl9wcG5vKENQQUNGX1BQTk9fU0hBNTEyX0RSTkdfU0VFRCwKKwkJICAgJnBybmdfZGF0YS0+cHBub3dzLCBOVUxMLCAwLCBzZWVkLCBzaXplb2Yoc2VlZCkpOwogCiAJLyogaWYgZmlwcyBtb2RlIGlzIGVuYWJsZWQsIGdlbmVyYXRlIGEgZmlyc3QgYmxvY2sgb2YgcmFuZG9tCiAJICAgYnl0ZXMgZm9yIHRoZSBGSVBTIDE0MC0yIENvbmRpdGlvbmFsIFNlbGYgVGVzdCAqLwogCWlmIChmaXBzX2VuYWJsZWQpIHsKIAkJcHJuZ19kYXRhLT5wcmV2ID0gcHJuZ19kYXRhLT5idWYgKyBwcm5nX2NodW5rX3NpemU7Ci0JCXJldCA9IGNwYWNmX3Bwbm8oQ1BBQ0ZfUFBOT19TSEE1MTJfRFJOR19HRU4sCi0JCQkJICZwcm5nX2RhdGEtPnBwbm93cywKLQkJCQkgcHJuZ19kYXRhLT5wcmV2LCBwcm5nX2NodW5rX3NpemUsIE5VTEwsIDApOwotCQlpZiAocmV0IDwgMCB8fCByZXQgIT0gcHJuZ19jaHVua19zaXplKSB7Ci0JCQlwcm5nX2Vycm9yZmxhZyA9IFBSTkdfR0VOX0ZBSUxFRDsKLQkJCXJldCA9IC1FSU87Ci0JCQlnb3RvIG91dGZyZWU7Ci0JCX0KKwkJY3BhY2ZfcHBubyhDUEFDRl9QUE5PX1NIQTUxMl9EUk5HX0dFTiwKKwkJCSAgICZwcm5nX2RhdGEtPnBwbm93cywKKwkJCSAgIHBybmdfZGF0YS0+cHJldiwgcHJuZ19jaHVua19zaXplLCBOVUxMLCAwKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTQ0MCwxMiArNDAzLDggQEAKIAkJcmV0dXJuIHJldDsKIAogCS8qIGRvIGEgcmVzZWVkIG9mIHRoZSBwcG5vIGRybmcgd2l0aCB0aGlzIGJ5dGVzdHJpbmcgKi8KLQlyZXQgPSBjcGFjZl9wcG5vKENQQUNGX1BQTk9fU0hBNTEyX0RSTkdfU0VFRCwKLQkJCSAmcHJuZ19kYXRhLT5wcG5vd3MsIE5VTEwsIDAsIHNlZWQsIHNpemVvZihzZWVkKSk7Ci0JaWYgKHJldCkgewotCQlwcm5nX2Vycm9yZmxhZyA9IFBSTkdfUkVTRUVEX0ZBSUxFRDsKLQkJcmV0dXJuIC1FSU87Ci0JfQorCWNwYWNmX3Bwbm8oQ1BBQ0ZfUFBOT19TSEE1MTJfRFJOR19TRUVELAorCQkgICAmcHJuZ19kYXRhLT5wcG5vd3MsIE5VTEwsIDAsIHNlZWQsIHNpemVvZihzZWVkKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ2MywxMiArNDIyLDggQEAKIAl9CiAKIAkvKiBQUE5PIGdlbmVyYXRlICovCi0JcmV0ID0gY3BhY2ZfcHBubyhDUEFDRl9QUE5PX1NIQTUxMl9EUk5HX0dFTiwKLQkJCSAmcHJuZ19kYXRhLT5wcG5vd3MsIGJ1ZiwgbmJ5dGVzLCBOVUxMLCAwKTsKLQlpZiAocmV0IDwgMCB8fCByZXQgIT0gbmJ5dGVzKSB7Ci0JCXBybmdfZXJyb3JmbGFnID0gUFJOR19HRU5fRkFJTEVEOwotCQlyZXR1cm4gLUVJTzsKLQl9CisJY3BhY2ZfcHBubyhDUEFDRl9QUE5PX1NIQTUxMl9EUk5HX0dFTiwKKwkJICAgJnBybmdfZGF0YS0+cHBub3dzLCBidWYsIG5ieXRlcywgTlVMTCwgMCk7CiAKIAkvKiBGSVBTIDE0MC0yIENvbmRpdGlvbmFsIFNlbGYgVGVzdCAqLwogCWlmIChmaXBzX2VuYWJsZWQpIHsKQEAgLTQ3OSw3ICs0MzQsNyBAQAogCQltZW1jcHkocHJuZ19kYXRhLT5wcmV2LCBidWYsIG5ieXRlcyk7CiAJfQogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gbmJ5dGVzOwogfQogCiAKQEAgLTQ5NCw3ICs0NDksNyBAQAogc3RhdGljIHNzaXplX3QgcHJuZ190ZGVzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1YnVmLAogCQkJICAgICAgc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKQogewotCWludCBjaHVuaywgbiwgdG1wLCByZXQgPSAwOworCWludCBjaHVuaywgbiwgcmV0ID0gMDsKIAogCS8qIGxvY2sgcHJuZ19kYXRhIHN0cnVjdCAqLwogCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnBybmdfZGF0YS0+bXV0ZXgpKQpAQCAtNTQ1LDEzICs1MDAsOSBAQAogCQkgKgogCQkgKiBOb3RlOiB5b3UgY2FuIHN0aWxsIGdldCBzdHJpY3QgWDkuMTcgY29uZm9ybWl0eSBieSBzZXR0aW5nCiAJCSAqIHBybmdfY2h1bmtfc2l6ZSB0byA4IGJ5dGVzLgotCQkqLwotCQl0bXAgPSBjcGFjZl9rbWMoQ1BBQ0ZfS01DX1BSTkcsIHBybmdfZGF0YS0+cHJuZ3dzLnBhcm1fYmxvY2ssCi0JCQkJcHJuZ19kYXRhLT5idWYsIHBybmdfZGF0YS0+YnVmLCBuKTsKLQkJaWYgKHRtcCA8IDAgfHwgdG1wICE9IG4pIHsKLQkJCXJldCA9IC1FSU87Ci0JCQlicmVhazsKLQkJfQorCQkgKi8KKwkJY3BhY2Zfa21jKENQQUNGX0tNQ19QUk5HLCBwcm5nX2RhdGEtPnBybmd3cy5wYXJtX2Jsb2NrLAorCQkJICBwcm5nX2RhdGEtPmJ1ZiwgcHJuZ19kYXRhLT5idWYsIG4pOwogCiAJCXBybmdfZGF0YS0+cHJuZ3dzLmJ5dGVfY291bnRlciArPSBuOwogCQlwcm5nX2RhdGEtPnBybmd3cy5yZXNlZWRfY291bnRlciArPSBuOwpAQCAtODA2LDEzICs3NTcsMTMgQEAKIAlpbnQgcmV0OwogCiAJLyogY2hlY2sgaWYgdGhlIENQVSBoYXMgYSBQUk5HICovCi0JaWYgKCFjcGFjZl9xdWVyeShDUEFDRl9LTUMsIENQQUNGX0tNQ19QUk5HKSkKKwlpZiAoIWNwYWNmX3F1ZXJ5X2Z1bmMoQ1BBQ0ZfS01DLCBDUEFDRl9LTUNfUFJORykpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCS8qIGNob29zZSBwcm5nIG1vZGUgKi8KIAlpZiAocHJuZ19tb2RlICE9IFBSTkdfTU9ERV9UREVTKSB7CiAJCS8qIGNoZWNrIGZvciBNU0E1IHN1cHBvcnQgZm9yIFBQTk8gb3BlcmF0aW9ucyAqLwotCQlpZiAoIWNwYWNmX3F1ZXJ5KENQQUNGX1BQTk8sIENQQUNGX1BQTk9fU0hBNTEyX0RSTkdfR0VOKSkgeworCQlpZiAoIWNwYWNmX3F1ZXJ5X2Z1bmMoQ1BBQ0ZfUFBOTywgQ1BBQ0ZfUFBOT19TSEE1MTJfRFJOR19HRU4pKSB7CiAJCQlpZiAocHJuZ19tb2RlID09IFBSTkdfTU9ERV9TSEE1MTIpIHsKIAkJCQlwcl9lcnIoIlRoZSBwcm5nIG1vZHVsZSBjYW5ub3QgIgogCQkJCSAgICAgICAic3RhcnQgaW4gU0hBLTUxMiBtb2RlXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jcnlwdG8vc2hhMV9zMzkwLmMgYi9hcmNoL3MzOTAvY3J5cHRvL3NoYTFfczM5MC5jCmluZGV4IDVmYmY5MWIuLmM3ZGU1M2QgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jcnlwdG8vc2hhMV9zMzkwLmMKKysrIGIvYXJjaC9zMzkwL2NyeXB0by9zaGExX3MzOTAuYwpAQCAtOTEsNyArOTEsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBzaGExX3MzOTBfaW5pdCh2b2lkKQogewotCWlmICghY3BhY2ZfcXVlcnkoQ1BBQ0ZfS0lNRCwgQ1BBQ0ZfS0lNRF9TSEFfMSkpCisJaWYgKCFjcGFjZl9xdWVyeV9mdW5jKENQQUNGX0tJTUQsIENQQUNGX0tJTURfU0hBXzEpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJcmV0dXJuIGNyeXB0b19yZWdpc3Rlcl9zaGFzaCgmYWxnKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jcnlwdG8vc2hhMjU2X3MzOTAuYyBiL2FyY2gvczM5MC9jcnlwdG8vc2hhMjU2X3MzOTAuYwppbmRleCAxMGFhYzBiLi41M2MyNzc5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvY3J5cHRvL3NoYTI1Nl9zMzkwLmMKKysrIGIvYXJjaC9zMzkwL2NyeXB0by9zaGEyNTZfczM5MC5jCkBAIC0xMjMsNyArMTIzLDcgQEAKIHsKIAlpbnQgcmV0OwogCi0JaWYgKCFjcGFjZl9xdWVyeShDUEFDRl9LSU1ELCBDUEFDRl9LSU1EX1NIQV8yNTYpKQorCWlmICghY3BhY2ZfcXVlcnlfZnVuYyhDUEFDRl9LSU1ELCBDUEFDRl9LSU1EX1NIQV8yNTYpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX3NoYXNoKCZzaGEyNTZfYWxnKTsKIAlpZiAocmV0IDwgMCkKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jcnlwdG8vc2hhNTEyX3MzOTAuYyBiL2FyY2gvczM5MC9jcnlwdG8vc2hhNTEyX3MzOTAuYwppbmRleCBlYTg1NzU3Li4yZjRjYWExIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvY3J5cHRvL3NoYTUxMl9zMzkwLmMKKysrIGIvYXJjaC9zMzkwL2NyeXB0by9zaGE1MTJfczM5MC5jCkBAIC0xMzMsNyArMTMzLDcgQEAKIHsKIAlpbnQgcmV0OwogCi0JaWYgKCFjcGFjZl9xdWVyeShDUEFDRl9LSU1ELCBDUEFDRl9LSU1EX1NIQV81MTIpKQorCWlmICghY3BhY2ZfcXVlcnlfZnVuYyhDUEFDRl9LSU1ELCBDUEFDRl9LSU1EX1NIQV81MTIpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJaWYgKChyZXQgPSBjcnlwdG9fcmVnaXN0ZXJfc2hhc2goJnNoYTUxMl9hbGcpKSA8IDApCiAJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NyeXB0by9zaGFfY29tbW9uLmMgYi9hcmNoL3MzOTAvY3J5cHRvL3NoYV9jb21tb24uYwppbmRleCA4ZTkwODE2Li5jNzQwZjc3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvY3J5cHRvL3NoYV9jb21tb24uYworKysgYi9hcmNoL3MzOTAvY3J5cHRvL3NoYV9jb21tb24uYwpAQCAtMjIsOCArMjIsNyBAQAogewogCXN0cnVjdCBzMzkwX3NoYV9jdHggKmN0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOwogCXVuc2lnbmVkIGludCBic2l6ZSA9IGNyeXB0b19zaGFzaF9ibG9ja3NpemUoZGVzYy0+dGZtKTsKLQl1bnNpZ25lZCBpbnQgaW5kZXg7Ci0JaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgaW5kZXgsIG47CiAKIAkvKiBob3cgbXVjaCBpcyBhbHJlYWR5IGluIHRoZSBidWZmZXI/ICovCiAJaW5kZXggPSBjdHgtPmNvdW50ICYgKGJzaXplIC0gMSk7CkBAIC0zNSw5ICszNCw3IEBACiAJLyogcHJvY2VzcyBvbmUgc3RvcmVkIGJsb2NrICovCiAJaWYgKGluZGV4KSB7CiAJCW1lbWNweShjdHgtPmJ1ZiArIGluZGV4LCBkYXRhLCBic2l6ZSAtIGluZGV4KTsKLQkJcmV0ID0gY3BhY2Zfa2ltZChjdHgtPmZ1bmMsIGN0eC0+c3RhdGUsIGN0eC0+YnVmLCBic2l6ZSk7Ci0JCWlmIChyZXQgIT0gYnNpemUpCi0JCQlyZXR1cm4gLUVJTzsKKwkJY3BhY2Zfa2ltZChjdHgtPmZ1bmMsIGN0eC0+c3RhdGUsIGN0eC0+YnVmLCBic2l6ZSk7CiAJCWRhdGEgKz0gYnNpemUgLSBpbmRleDsKIAkJbGVuIC09IGJzaXplIC0gaW5kZXg7CiAJCWluZGV4ID0gMDsKQEAgLTQ1LDEyICs0MiwxMCBAQAogCiAJLyogcHJvY2VzcyBhcyBtYW55IGJsb2NrcyBhcyBwb3NzaWJsZSAqLwogCWlmIChsZW4gPj0gYnNpemUpIHsKLQkJcmV0ID0gY3BhY2Zfa2ltZChjdHgtPmZ1bmMsIGN0eC0+c3RhdGUsIGRhdGEsCi0JCQkJIGxlbiAmIH4oYnNpemUgLSAxKSk7Ci0JCWlmIChyZXQgIT0gKGxlbiAmIH4oYnNpemUgLSAxKSkpCi0JCQlyZXR1cm4gLUVJTzsKLQkJZGF0YSArPSByZXQ7Ci0JCWxlbiAtPSByZXQ7CisJCW4gPSBsZW4gJiB+KGJzaXplIC0gMSk7CisJCWNwYWNmX2tpbWQoY3R4LT5mdW5jLCBjdHgtPnN0YXRlLCBkYXRhLCBuKTsKKwkJZGF0YSArPSBuOworCQlsZW4gLT0gbjsKIAl9CiBzdG9yZToKIAlpZiAobGVuKQpAQCAtNjYsNyArNjEsNiBAQAogCXVuc2lnbmVkIGludCBic2l6ZSA9IGNyeXB0b19zaGFzaF9ibG9ja3NpemUoZGVzYy0+dGZtKTsKIAl1NjQgYml0czsKIAl1bnNpZ25lZCBpbnQgaW5kZXgsIGVuZCwgcGxlbjsKLQlpbnQgcmV0OwogCiAJLyogU0hBLTUxMiB1c2VzIDEyOCBiaXQgcGFkZGluZyBsZW5ndGggKi8KIAlwbGVuID0gKGJzaXplID4gU0hBMjU2X0JMT0NLX1NJWkUpID8gMTYgOiA4OwpAQCAtODgsMTAgKzgyLDcgQEAKIAkgKi8KIAliaXRzID0gY3R4LT5jb3VudCAqIDg7CiAJbWVtY3B5KGN0eC0+YnVmICsgZW5kIC0gOCwgJmJpdHMsIHNpemVvZihiaXRzKSk7Ci0KLQlyZXQgPSBjcGFjZl9raW1kKGN0eC0+ZnVuYywgY3R4LT5zdGF0ZSwgY3R4LT5idWYsIGVuZCk7Ci0JaWYgKHJldCAhPSBlbmQpCi0JCXJldHVybiAtRUlPOworCWNwYWNmX2tpbWQoY3R4LT5mdW5jLCBjdHgtPnN0YXRlLCBjdHgtPmJ1ZiwgZW5kKTsKIAogCS8qIGNvcHkgZGlnZXN0IHRvIG91dCAqLwogCW1lbWNweShvdXQsIGN0eC0+c3RhdGUsIGNyeXB0b19zaGFzaF9kaWdlc3RzaXplKGRlc2MtPnRmbSkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2RlZmNvbmZpZyBiL2FyY2gvczM5MC9kZWZjb25maWcKaW5kZXggY2NjY2ViZS4uMmQ0MGVmMCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2RlZmNvbmZpZworKysgYi9hcmNoL3MzOTAvZGVmY29uZmlnCkBAIC0xNzIsNyArMTcyLDYgQEAKIENPTkZJR19SQ1VfQ1BVX1NUQUxMX1RJTUVPVVQ9NjAKIENPTkZJR19SQ1VfVFJBQ0U9eQogQ09ORklHX0xBVEVOQ1lUT1A9eQotQ09ORklHX0RFQlVHX1NUUklDVF9VU0VSX0NPUFlfQ0hFQ0tTPXkKIENPTkZJR19TQ0hFRF9UUkFDRVI9eQogQ09ORklHX0ZUUkFDRV9TWVNDQUxMUz15CiBDT05GSUdfVFJBQ0VSX1NOQVBTSE9UX1BFUl9DUFVfU1dBUD15CkBAIC0yMzQsNyArMjMzLDcgQEAKIENPTkZJR19DUllQVE9fU0hBNTEyX1MzOTA9bQogQ09ORklHX0NSWVBUT19ERVNfUzM5MD1tCiBDT05GSUdfQ1JZUFRPX0FFU19TMzkwPW0KLUNPTkZJR19DUllQVE9fQ1JDMzJfUzM5MD1tCitDT05GSUdfQ1JZUFRPX0NSQzMyX1MzOTA9eQogQ09ORklHX0NSQzc9bQogIyBDT05GSUdfWFpfREVDX1g4NiBpcyBub3Qgc2V0CiAjIENPTkZJR19YWl9ERUNfUE9XRVJQQyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY3BhY2YuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jcGFjZi5oCmluZGV4IGQyODYyMWQuLjJjNjgwZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jcGFjZi5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jcGFjZi5oCkBAIC0yOCw2NyArMjgsNTEgQEAKICNkZWZpbmUgQ1BBQ0ZfUFBOTwkJMHhiOTNjCQkvKiBNU0E1ICovCiAKIC8qCi0gKiBGdW5jdGlvbiBjb2RlcyBmb3IgdGhlIEtNIChDSVBIRVIgTUVTU0FHRSkKLSAqIGluc3RydWN0aW9uICgweDgwIGlzIHRoZSBkZWNpcGhlciBtb2RpZmllciBiaXQpCisgKiBEZWNyeXB0aW9uIG1vZGlmaWVyIGJpdAorICovCisjZGVmaW5lIENQQUNGX0RFQ1JZUFQJCTB4ODAKKworLyoKKyAqIEZ1bmN0aW9uIGNvZGVzIGZvciB0aGUgS00gKENJUEhFUiBNRVNTQUdFKSBpbnN0cnVjdGlvbgogICovCiAjZGVmaW5lIENQQUNGX0tNX1FVRVJZCQkweDAwCi0jZGVmaW5lIENQQUNGX0tNX0RFQV9FTkMJMHgwMQotI2RlZmluZSBDUEFDRl9LTV9ERUFfREVDCTB4ODEKLSNkZWZpbmUgQ1BBQ0ZfS01fVERFQV8xMjhfRU5DCTB4MDIKLSNkZWZpbmUgQ1BBQ0ZfS01fVERFQV8xMjhfREVDCTB4ODIKLSNkZWZpbmUgQ1BBQ0ZfS01fVERFQV8xOTJfRU5DCTB4MDMKLSNkZWZpbmUgQ1BBQ0ZfS01fVERFQV8xOTJfREVDCTB4ODMKLSNkZWZpbmUgQ1BBQ0ZfS01fQUVTXzEyOF9FTkMJMHgxMgotI2RlZmluZSBDUEFDRl9LTV9BRVNfMTI4X0RFQwkweDkyCi0jZGVmaW5lIENQQUNGX0tNX0FFU18xOTJfRU5DCTB4MTMKLSNkZWZpbmUgQ1BBQ0ZfS01fQUVTXzE5Ml9ERUMJMHg5MwotI2RlZmluZSBDUEFDRl9LTV9BRVNfMjU2X0VOQwkweDE0Ci0jZGVmaW5lIENQQUNGX0tNX0FFU18yNTZfREVDCTB4OTQKLSNkZWZpbmUgQ1BBQ0ZfS01fWFRTXzEyOF9FTkMJMHgzMgotI2RlZmluZSBDUEFDRl9LTV9YVFNfMTI4X0RFQwkweGIyCi0jZGVmaW5lIENQQUNGX0tNX1hUU18yNTZfRU5DCTB4MzQKLSNkZWZpbmUgQ1BBQ0ZfS01fWFRTXzI1Nl9ERUMJMHhiNAorI2RlZmluZSBDUEFDRl9LTV9ERUEJCTB4MDEKKyNkZWZpbmUgQ1BBQ0ZfS01fVERFQV8xMjgJMHgwMgorI2RlZmluZSBDUEFDRl9LTV9UREVBXzE5MgkweDAzCisjZGVmaW5lIENQQUNGX0tNX0FFU18xMjgJMHgxMgorI2RlZmluZSBDUEFDRl9LTV9BRVNfMTkyCTB4MTMKKyNkZWZpbmUgQ1BBQ0ZfS01fQUVTXzI1NgkweDE0CisjZGVmaW5lIENQQUNGX0tNX1hUU18xMjgJMHgzMgorI2RlZmluZSBDUEFDRl9LTV9YVFNfMjU2CTB4MzQKIAogLyoKICAqIEZ1bmN0aW9uIGNvZGVzIGZvciB0aGUgS01DIChDSVBIRVIgTUVTU0FHRSBXSVRIIENIQUlOSU5HKQotICogaW5zdHJ1Y3Rpb24gKDB4ODAgaXMgdGhlIGRlY2lwaGVyIG1vZGlmaWVyIGJpdCkKKyAqIGluc3RydWN0aW9uCiAgKi8KICNkZWZpbmUgQ1BBQ0ZfS01DX1FVRVJZCQkweDAwCi0jZGVmaW5lIENQQUNGX0tNQ19ERUFfRU5DCTB4MDEKLSNkZWZpbmUgQ1BBQ0ZfS01DX0RFQV9ERUMJMHg4MQotI2RlZmluZSBDUEFDRl9LTUNfVERFQV8xMjhfRU5DCTB4MDIKLSNkZWZpbmUgQ1BBQ0ZfS01DX1RERUFfMTI4X0RFQwkweDgyCi0jZGVmaW5lIENQQUNGX0tNQ19UREVBXzE5Ml9FTkMJMHgwMwotI2RlZmluZSBDUEFDRl9LTUNfVERFQV8xOTJfREVDCTB4ODMKLSNkZWZpbmUgQ1BBQ0ZfS01DX0FFU18xMjhfRU5DCTB4MTIKLSNkZWZpbmUgQ1BBQ0ZfS01DX0FFU18xMjhfREVDCTB4OTIKLSNkZWZpbmUgQ1BBQ0ZfS01DX0FFU18xOTJfRU5DCTB4MTMKLSNkZWZpbmUgQ1BBQ0ZfS01DX0FFU18xOTJfREVDCTB4OTMKLSNkZWZpbmUgQ1BBQ0ZfS01DX0FFU18yNTZfRU5DCTB4MTQKLSNkZWZpbmUgQ1BBQ0ZfS01DX0FFU18yNTZfREVDCTB4OTQKKyNkZWZpbmUgQ1BBQ0ZfS01DX0RFQQkJMHgwMQorI2RlZmluZSBDUEFDRl9LTUNfVERFQV8xMjgJMHgwMgorI2RlZmluZSBDUEFDRl9LTUNfVERFQV8xOTIJMHgwMworI2RlZmluZSBDUEFDRl9LTUNfQUVTXzEyOAkweDEyCisjZGVmaW5lIENQQUNGX0tNQ19BRVNfMTkyCTB4MTMKKyNkZWZpbmUgQ1BBQ0ZfS01DX0FFU18yNTYJMHgxNAogI2RlZmluZSBDUEFDRl9LTUNfUFJORwkJMHg0MwogCiAvKgogICogRnVuY3Rpb24gY29kZXMgZm9yIHRoZSBLTUNUUiAoQ0lQSEVSIE1FU1NBR0UgV0lUSCBDT1VOVEVSKQotICogaW5zdHJ1Y3Rpb24gKDB4ODAgaXMgdGhlIGRlY2lwaGVyIG1vZGlmaWVyIGJpdCkKKyAqIGluc3RydWN0aW9uCiAgKi8KLSNkZWZpbmUgQ1BBQ0ZfS01DVFJfUVVFUlkJIDB4MDAKLSNkZWZpbmUgQ1BBQ0ZfS01DVFJfREVBX0VOQwkgMHgwMQotI2RlZmluZSBDUEFDRl9LTUNUUl9ERUFfREVDCSAweDgxCi0jZGVmaW5lIENQQUNGX0tNQ1RSX1RERUFfMTI4X0VOQyAweDAyCi0jZGVmaW5lIENQQUNGX0tNQ1RSX1RERUFfMTI4X0RFQyAweDgyCi0jZGVmaW5lIENQQUNGX0tNQ1RSX1RERUFfMTkyX0VOQyAweDAzCi0jZGVmaW5lIENQQUNGX0tNQ1RSX1RERUFfMTkyX0RFQyAweDgzCi0jZGVmaW5lIENQQUNGX0tNQ1RSX0FFU18xMjhfRU5DCSAweDEyCi0jZGVmaW5lIENQQUNGX0tNQ1RSX0FFU18xMjhfREVDCSAweDkyCi0jZGVmaW5lIENQQUNGX0tNQ1RSX0FFU18xOTJfRU5DCSAweDEzCi0jZGVmaW5lIENQQUNGX0tNQ1RSX0FFU18xOTJfREVDCSAweDkzCi0jZGVmaW5lIENQQUNGX0tNQ1RSX0FFU18yNTZfRU5DCSAweDE0Ci0jZGVmaW5lIENQQUNGX0tNQ1RSX0FFU18yNTZfREVDCSAweDk0CisjZGVmaW5lIENQQUNGX0tNQ1RSX1FVRVJZCTB4MDAKKyNkZWZpbmUgQ1BBQ0ZfS01DVFJfREVBCQkweDAxCisjZGVmaW5lIENQQUNGX0tNQ1RSX1RERUFfMTI4CTB4MDIKKyNkZWZpbmUgQ1BBQ0ZfS01DVFJfVERFQV8xOTIJMHgwMworI2RlZmluZSBDUEFDRl9LTUNUUl9BRVNfMTI4CTB4MTIKKyNkZWZpbmUgQ1BBQ0ZfS01DVFJfQUVTXzE5MgkweDEzCisjZGVmaW5lIENQQUNGX0tNQ1RSX0FFU18yNTYJMHgxNAogCiAvKgogICogRnVuY3Rpb24gY29kZXMgZm9yIHRoZSBLSU1EIChDT01QVVRFIElOVEVSTUVESUFURSBNRVNTQUdFIERJR0VTVCkKLSAqIGluc3RydWN0aW9uICgweDgwIGlzIHRoZSBkZWNpcGhlciBtb2RpZmllciBiaXQpCisgKiBpbnN0cnVjdGlvbgogICovCiAjZGVmaW5lIENQQUNGX0tJTURfUVVFUlkJMHgwMAogI2RlZmluZSBDUEFDRl9LSU1EX1NIQV8xCTB4MDEKQEAgLTk4LDcgKzgyLDcgQEAKIAogLyoKICAqIEZ1bmN0aW9uIGNvZGVzIGZvciB0aGUgS0xNRCAoQ09NUFVURSBMQVNUIE1FU1NBR0UgRElHRVNUKQotICogaW5zdHJ1Y3Rpb24gKDB4ODAgaXMgdGhlIGRlY2lwaGVyIG1vZGlmaWVyIGJpdCkKKyAqIGluc3RydWN0aW9uCiAgKi8KICNkZWZpbmUgQ1BBQ0ZfS0xNRF9RVUVSWQkweDAwCiAjZGVmaW5lIENQQUNGX0tMTURfU0hBXzEJMHgwMQpAQCAtMTA3LDcgKzkxLDcgQEAKIAogLyoKICAqIGZ1bmN0aW9uIGNvZGVzIGZvciB0aGUgS01BQyAoQ09NUFVURSBNRVNTQUdFIEFVVEhFTlRJQ0FUSU9OIENPREUpCi0gKiBpbnN0cnVjdGlvbiAoMHg4MCBpcyB0aGUgZGVjaXBoZXIgbW9kaWZpZXIgYml0KQorICogaW5zdHJ1Y3Rpb24KICAqLwogI2RlZmluZSBDUEFDRl9LTUFDX1FVRVJZCTB4MDAKICNkZWZpbmUgQ1BBQ0ZfS01BQ19ERUEJCTB4MDEKQEAgLTExNiwxMiArMTAwLDE0IEBACiAKIC8qCiAgKiBGdW5jdGlvbiBjb2RlcyBmb3IgdGhlIFBQTk8gKFBFUkZPUk0gUFNFVURPUkFORE9NIE5VTUJFUiBPUEVSQVRJT04pCi0gKiBpbnN0cnVjdGlvbiAoMHg4MCBpcyB0aGUgZGVjaXBoZXIgbW9kaWZpZXIgYml0KQorICogaW5zdHJ1Y3Rpb24KICAqLwogI2RlZmluZSBDUEFDRl9QUE5PX1FVRVJZCQkweDAwCiAjZGVmaW5lIENQQUNGX1BQTk9fU0hBNTEyX0RSTkdfR0VOCTB4MDMKICNkZWZpbmUgQ1BBQ0ZfUFBOT19TSEE1MTJfRFJOR19TRUVECTB4ODMKIAordHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZCBjaGFyIGJ5dGVzWzE2XTsgfSBjcGFjZl9tYXNrX3Q7CisKIC8qKgogICogY3BhY2ZfcXVlcnkoKSAtIGNoZWNrIGlmIGEgc3BlY2lmaWMgQ1BBQ0YgZnVuY3Rpb24gaXMgYXZhaWxhYmxlCiAgKiBAb3Bjb2RlOiB0aGUgb3Bjb2RlIG9mIHRoZSBjcnlwdG8gaW5zdHJ1Y3Rpb24KQEAgLTEzMiw1NSArMTE4LDY2IEBACiAgKgogICogUmV0dXJucyAxIGlmIEBmdW5jIGlzIGF2YWlsYWJsZSBmb3IgQG9wY29kZSwgMCBvdGhlcndpc2UKICAqLwotc3RhdGljIGlubGluZSB2b2lkIF9fY3BhY2ZfcXVlcnkodW5zaWduZWQgaW50IG9wY29kZSwgdW5zaWduZWQgY2hhciAqc3RhdHVzKQorc3RhdGljIGlubGluZSB2b2lkIF9fY3BhY2ZfcXVlcnkodW5zaWduZWQgaW50IG9wY29kZSwgY3BhY2ZfbWFza190ICptYXNrKQogewotCXR5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgY2hhciBfWzE2XTsgfSBzdGF0dXNfdHlwZTsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHIwIGFzbSgiMCIpID0gMDsJLyogcXVlcnkgZnVuY3Rpb24gKi8KLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHIxIGFzbSgiMSIpID0gKHVuc2lnbmVkIGxvbmcpIHN0YXR1czsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHIxIGFzbSgiMSIpID0gKHVuc2lnbmVkIGxvbmcpIG1hc2s7CiAKIAlhc20gdm9sYXRpbGUoCiAJCSIJc3BtIDBcbiIgLyogcGNrbW8gZG9lc24ndCBjaGFuZ2UgdGhlIGNjICovCiAJCS8qIFBhcmFtZXRlciByZWdpc3RlcnMgYXJlIGlnbm9yZWQsIGJ1dCBtYXkgbm90IGJlIDAgKi8KIAkJIjA6CS5pbnNuCXJyZiwlW29wY10gPDwgMTYsMiwyLDIsMFxuIgogCQkiCWJyYwkxLDBiXG4iCS8qIGhhbmRsZSBwYXJ0aWFsIGNvbXBsZXRpb24gKi8KLQkJOiAiPW0iICgqKHN0YXR1c190eXBlICopIHN0YXR1cykKKwkJOiAiPW0iICgqbWFzaykKIAkJOiBbZmNdICJkIiAocjApLCBbcGJhXSAiYSIgKHIxKSwgW29wY10gImkiIChvcGNvZGUpCiAJCTogImNjIik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGNwYWNmX3F1ZXJ5KHVuc2lnbmVkIGludCBvcGNvZGUsIHVuc2lnbmVkIGludCBmdW5jKQorc3RhdGljIGlubGluZSBpbnQgX19jcGFjZl9jaGVja19vcGNvZGUodW5zaWduZWQgaW50IG9wY29kZSkKIHsKLQl1bnNpZ25lZCBjaGFyIHN0YXR1c1sxNl07Ci0KIAlzd2l0Y2ggKG9wY29kZSkgewogCWNhc2UgQ1BBQ0ZfS01BQzoKIAljYXNlIENQQUNGX0tNOgogCWNhc2UgQ1BBQ0ZfS01DOgogCWNhc2UgQ1BBQ0ZfS0lNRDoKIAljYXNlIENQQUNGX0tMTUQ6Ci0JCWlmICghdGVzdF9mYWNpbGl0eSgxNykpCS8qIGNoZWNrIGZvciBNU0EgKi8KLQkJCXJldHVybiAwOwotCQlicmVhazsKKwkJcmV0dXJuIHRlc3RfZmFjaWxpdHkoMTcpOwkvKiBjaGVjayBmb3IgTVNBICovCiAJY2FzZSBDUEFDRl9QQ0tNTzoKLQkJaWYgKCF0ZXN0X2ZhY2lsaXR5KDc2KSkJLyogY2hlY2sgZm9yIE1TQTMgKi8KLQkJCXJldHVybiAwOwotCQlicmVhazsKKwkJcmV0dXJuIHRlc3RfZmFjaWxpdHkoNzYpOwkvKiBjaGVjayBmb3IgTVNBMyAqLwogCWNhc2UgQ1BBQ0ZfS01GOgogCWNhc2UgQ1BBQ0ZfS01POgogCWNhc2UgQ1BBQ0ZfUENDOgogCWNhc2UgQ1BBQ0ZfS01DVFI6Ci0JCWlmICghdGVzdF9mYWNpbGl0eSg3NykpCS8qIGNoZWNrIGZvciBNU0E0ICovCi0JCQlyZXR1cm4gMDsKLQkJYnJlYWs7CisJCXJldHVybiB0ZXN0X2ZhY2lsaXR5KDc3KTsJLyogY2hlY2sgZm9yIE1TQTQgKi8KIAljYXNlIENQQUNGX1BQTk86Ci0JCWlmICghdGVzdF9mYWNpbGl0eSg1NykpCS8qIGNoZWNrIGZvciBNU0E1ICovCi0JCQlyZXR1cm4gMDsKLQkJYnJlYWs7CisJCXJldHVybiB0ZXN0X2ZhY2lsaXR5KDU3KTsJLyogY2hlY2sgZm9yIE1TQTUgKi8KIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9Ci0JX19jcGFjZl9xdWVyeShvcGNvZGUsIHN0YXR1cyk7Ci0JcmV0dXJuIChzdGF0dXNbZnVuYyA+PiAzXSAmICgweDgwID4+IChmdW5jICYgNykpKSAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcGFjZl9xdWVyeSh1bnNpZ25lZCBpbnQgb3Bjb2RlLCBjcGFjZl9tYXNrX3QgKm1hc2spCit7CisJaWYgKF9fY3BhY2ZfY2hlY2tfb3Bjb2RlKG9wY29kZSkpIHsKKwkJX19jcGFjZl9xdWVyeShvcGNvZGUsIG1hc2spOworCQlyZXR1cm4gMTsKKwl9CisJbWVtc2V0KG1hc2ssIDAsIHNpemVvZigqbWFzaykpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcGFjZl90ZXN0X2Z1bmMoY3BhY2ZfbWFza190ICptYXNrLCB1bnNpZ25lZCBpbnQgZnVuYykKK3sKKwlyZXR1cm4gKG1hc2stPmJ5dGVzW2Z1bmMgPj4gM10gJiAoMHg4MCA+PiAoZnVuYyAmIDcpKSkgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3BhY2ZfcXVlcnlfZnVuYyh1bnNpZ25lZCBpbnQgb3Bjb2RlLCB1bnNpZ25lZCBpbnQgZnVuYykKK3sKKwljcGFjZl9tYXNrX3QgbWFzazsKKworCWlmIChjcGFjZl9xdWVyeShvcGNvZGUsICZtYXNrKSkKKwkJcmV0dXJuIGNwYWNmX3Rlc3RfZnVuYygmbWFzaywgZnVuYyk7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtMTk0LDcgKzE5MSw3IEBACiAgKiBSZXR1cm5zIDAgZm9yIHRoZSBxdWVyeSBmdW5jLCBudW1iZXIgb2YgcHJvY2Vzc2VkIGJ5dGVzIGZvcgogICogZW5jcnlwdGlvbi9kZWNyeXB0aW9uIGZ1bmNzCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGNwYWNmX2ttKGxvbmcgZnVuYywgdm9pZCAqcGFyYW0sCitzdGF0aWMgaW5saW5lIGludCBjcGFjZl9rbSh1bnNpZ25lZCBsb25nIGZ1bmMsIHZvaWQgKnBhcmFtLAogCQkJICAgdTggKmRlc3QsIGNvbnN0IHU4ICpzcmMsIGxvbmcgc3JjX2xlbikKIHsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHIwIGFzbSgiMCIpID0gKHVuc2lnbmVkIGxvbmcpIGZ1bmM7CkBAIC0yMjQsNyArMjIxLDcgQEAKICAqIFJldHVybnMgMCBmb3IgdGhlIHF1ZXJ5IGZ1bmMsIG51bWJlciBvZiBwcm9jZXNzZWQgYnl0ZXMgZm9yCiAgKiBlbmNyeXB0aW9uL2RlY3J5cHRpb24gZnVuY3MKICAqLwotc3RhdGljIGlubGluZSBpbnQgY3BhY2Zfa21jKGxvbmcgZnVuYywgdm9pZCAqcGFyYW0sCitzdGF0aWMgaW5saW5lIGludCBjcGFjZl9rbWModW5zaWduZWQgbG9uZyBmdW5jLCB2b2lkICpwYXJhbSwKIAkJCSAgICB1OCAqZGVzdCwgY29uc3QgdTggKnNyYywgbG9uZyBzcmNfbGVuKQogewogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcjAgYXNtKCIwIikgPSAodW5zaWduZWQgbG9uZykgZnVuYzsKQEAgLTI1MCwxMSArMjQ3LDkgQEAKICAqIEBwYXJhbTogYWRkcmVzcyBvZiBwYXJhbWV0ZXIgYmxvY2s7IHNlZSBQT1AgZm9yIGRldGFpbHMgb24gZWFjaCBmdW5jCiAgKiBAc3JjOiBhZGRyZXNzIG9mIHNvdXJjZSBtZW1vcnkgYXJlYQogICogQHNyY19sZW46IGxlbmd0aCBvZiBzcmMgb3BlcmFuZCBpbiBieXRlcwotICoKLSAqIFJldHVybnMgMCBmb3IgdGhlIHF1ZXJ5IGZ1bmMsIG51bWJlciBvZiBwcm9jZXNzZWQgYnl0ZXMgZm9yIGRpZ2VzdCBmdW5jcwogICovCi1zdGF0aWMgaW5saW5lIGludCBjcGFjZl9raW1kKGxvbmcgZnVuYywgdm9pZCAqcGFyYW0sCi0JCQkgICAgIGNvbnN0IHU4ICpzcmMsIGxvbmcgc3JjX2xlbikKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcGFjZl9raW1kKHVuc2lnbmVkIGxvbmcgZnVuYywgdm9pZCAqcGFyYW0sCisJCQkgICAgICBjb25zdCB1OCAqc3JjLCBsb25nIHNyY19sZW4pCiB7CiAJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByMCBhc20oIjAiKSA9ICh1bnNpZ25lZCBsb25nKSBmdW5jOwogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcjEgYXNtKCIxIikgPSAodW5zaWduZWQgbG9uZykgcGFyYW07CkBAIC0yNjcsOCArMjYyLDYgQEAKIAkJOiBbc3JjXSAiK2EiIChyMiksIFtsZW5dICIrZCIgKHIzKQogCQk6IFtmY10gImQiIChyMCksIFtwYmFdICJhIiAocjEpLCBbb3BjXSAiaSIgKENQQUNGX0tJTUQpCiAJCTogImNjIiwgIm1lbW9yeSIpOwotCi0JcmV0dXJuIHNyY19sZW4gLSByMzsKIH0KIAogLyoqCkBAIC0yNzcsMTEgKzI3MCw5IEBACiAgKiBAcGFyYW06IGFkZHJlc3Mgb2YgcGFyYW1ldGVyIGJsb2NrOyBzZWUgUE9QIGZvciBkZXRhaWxzIG9uIGVhY2ggZnVuYwogICogQHNyYzogYWRkcmVzcyBvZiBzb3VyY2UgbWVtb3J5IGFyZWEKICAqIEBzcmNfbGVuOiBsZW5ndGggb2Ygc3JjIG9wZXJhbmQgaW4gYnl0ZXMKLSAqCi0gKiBSZXR1cm5zIDAgZm9yIHRoZSBxdWVyeSBmdW5jLCBudW1iZXIgb2YgcHJvY2Vzc2VkIGJ5dGVzIGZvciBkaWdlc3QgZnVuY3MKICAqLwotc3RhdGljIGlubGluZSBpbnQgY3BhY2Zfa2xtZChsb25nIGZ1bmMsIHZvaWQgKnBhcmFtLAotCQkJICAgICBjb25zdCB1OCAqc3JjLCBsb25nIHNyY19sZW4pCitzdGF0aWMgaW5saW5lIHZvaWQgY3BhY2Zfa2xtZCh1bnNpZ25lZCBsb25nIGZ1bmMsIHZvaWQgKnBhcmFtLAorCQkJICAgICAgY29uc3QgdTggKnNyYywgbG9uZyBzcmNfbGVuKQogewogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcjAgYXNtKCIwIikgPSAodW5zaWduZWQgbG9uZykgZnVuYzsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHIxIGFzbSgiMSIpID0gKHVuc2lnbmVkIGxvbmcpIHBhcmFtOwpAQCAtMjk0LDggKzI4NSw2IEBACiAJCTogW3NyY10gIithIiAocjIpLCBbbGVuXSAiK2QiIChyMykKIAkJOiBbZmNdICJkIiAocjApLCBbcGJhXSAiYSIgKHIxKSwgW29wY10gImkiIChDUEFDRl9LTE1EKQogCQk6ICJjYyIsICJtZW1vcnkiKTsKLQotCXJldHVybiBzcmNfbGVuIC0gcjM7CiB9CiAKIC8qKgpAQCAtMzA4LDcgKzI5Nyw3IEBACiAgKgogICogUmV0dXJucyAwIGZvciB0aGUgcXVlcnkgZnVuYywgbnVtYmVyIG9mIHByb2Nlc3NlZCBieXRlcyBmb3IgZGlnZXN0IGZ1bmNzCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGNwYWNmX2ttYWMobG9uZyBmdW5jLCB2b2lkICpwYXJhbSwKK3N0YXRpYyBpbmxpbmUgaW50IGNwYWNmX2ttYWModW5zaWduZWQgbG9uZyBmdW5jLCB2b2lkICpwYXJhbSwKIAkJCSAgICAgY29uc3QgdTggKnNyYywgbG9uZyBzcmNfbGVuKQogewogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcjAgYXNtKCIwIikgPSAodW5zaWduZWQgbG9uZykgZnVuYzsKQEAgLTMzOCw3ICszMjcsNyBAQAogICogUmV0dXJucyAwIGZvciB0aGUgcXVlcnkgZnVuYywgbnVtYmVyIG9mIHByb2Nlc3NlZCBieXRlcyBmb3IKICAqIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBmdW5jcwogICovCi1zdGF0aWMgaW5saW5lIGludCBjcGFjZl9rbWN0cihsb25nIGZ1bmMsIHZvaWQgKnBhcmFtLCB1OCAqZGVzdCwKK3N0YXRpYyBpbmxpbmUgaW50IGNwYWNmX2ttY3RyKHVuc2lnbmVkIGxvbmcgZnVuYywgdm9pZCAqcGFyYW0sIHU4ICpkZXN0LAogCQkJICAgICAgY29uc3QgdTggKnNyYywgbG9uZyBzcmNfbGVuLCB1OCAqY291bnRlcikKIHsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHIwIGFzbSgiMCIpID0gKHVuc2lnbmVkIGxvbmcpIGZ1bmM7CkBAIC0zNjgsMTMgKzM1NywxMCBAQAogICogQGRlc3RfbGVuOiBzaXplIG9mIGRlc3RpbmF0aW9uIG1lbW9yeSBhcmVhIGluIGJ5dGVzCiAgKiBAc2VlZDogYWRkcmVzcyBvZiBzZWVkIGRhdGEKICAqIEBzZWVkX2xlbjogc2l6ZSBvZiBzZWVkIGRhdGEgaW4gYnl0ZXMKLSAqCi0gKiBSZXR1cm5zIDAgZm9yIHRoZSBxdWVyeSBmdW5jLCBudW1iZXIgb2YgcmFuZG9tIGJ5dGVzIHN0b3JlZCBpbgotICogZGVzdCBidWZmZXIgZm9yIGdlbmVyYXRlIGZ1bmN0aW9uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGNwYWNmX3Bwbm8obG9uZyBmdW5jLCB2b2lkICpwYXJhbSwKLQkJCSAgICAgdTggKmRlc3QsIGxvbmcgZGVzdF9sZW4sCi0JCQkgICAgIGNvbnN0IHU4ICpzZWVkLCBsb25nIHNlZWRfbGVuKQorc3RhdGljIGlubGluZSB2b2lkIGNwYWNmX3Bwbm8odW5zaWduZWQgbG9uZyBmdW5jLCB2b2lkICpwYXJhbSwKKwkJCSAgICAgIHU4ICpkZXN0LCBsb25nIGRlc3RfbGVuLAorCQkJICAgICAgY29uc3QgdTggKnNlZWQsIGxvbmcgc2VlZF9sZW4pCiB7CiAJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByMCBhc20oIjAiKSA9ICh1bnNpZ25lZCBsb25nKSBmdW5jOwogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcjEgYXNtKCIxIikgPSAodW5zaWduZWQgbG9uZykgcGFyYW07CkBAIC0zOTAsOCArMzc2LDYgQEAKIAkJOiBbZmNdICJkIiAocjApLCBbcGJhXSAiYSIgKHIxKSwKIAkJICBbc2VlZF0gImEiIChyNCksIFtzbGVuXSAiZCIgKHI1KSwgW29wY10gImkiIChDUEFDRl9QUE5PKQogCQk6ICJjYyIsICJtZW1vcnkiKTsKLQotCXJldHVybiBkZXN0X2xlbiAtIHIzOwogfQogCiAvKioKQEAgLTM5OSwxMCArMzgzLDggQEAKICAqCQkgaW5zdHJ1Y3Rpb24KICAqIEBmdW5jOiB0aGUgZnVuY3Rpb24gY29kZSBwYXNzZWQgdG8gUENDOyBzZWUgQ1BBQ0ZfS01feHh4IGRlZmluZXMKICAqIEBwYXJhbTogYWRkcmVzcyBvZiBwYXJhbWV0ZXIgYmxvY2s7IHNlZSBQT1AgZm9yIGRldGFpbHMgb24gZWFjaCBmdW5jCi0gKgotICogUmV0dXJucyAwLgogICovCi1zdGF0aWMgaW5saW5lIGludCBjcGFjZl9wY2MobG9uZyBmdW5jLCB2b2lkICpwYXJhbSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcGFjZl9wY2ModW5zaWduZWQgbG9uZyBmdW5jLCB2b2lkICpwYXJhbSkKIHsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHIwIGFzbSgiMCIpID0gKHVuc2lnbmVkIGxvbmcpIGZ1bmM7CiAJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByMSBhc20oIjEiKSA9ICh1bnNpZ25lZCBsb25nKSBwYXJhbTsKQEAgLTQxMyw4ICszOTUsNiBAQAogCQk6CiAJCTogW2ZjXSAiZCIgKHIwKSwgW3BiYV0gImEiIChyMSksIFtvcGNdICJpIiAoQ1BBQ0ZfUENDKQogCQk6ICJjYyIsICJtZW1vcnkiKTsKLQotCXJldHVybiAwOwogfQogCiAjZW5kaWYJLyogX0FTTV9TMzkwX0NQQUNGX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9mYWNpbGl0aWVzX3NyYy5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2ZhY2lsaXRpZXNfc3JjLmgKaW5kZXggNDkxNzcyOC4uM2I3NThmNiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2ZhY2lsaXRpZXNfc3JjLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2ZhY2lsaXRpZXNfc3JjLmgKQEAgLTU1LDQgKzU1LDI4IEBACiAJCQktMSAvKiBFTkQgKi8KIAkJfQogCX0sCisJeworCQkubmFtZSA9ICJGQUNJTElUSUVTX0tWTSIsCisJCS5iaXRzID0gKGludFtdKXsKKwkJCTAsICAvKiBOMyBpbnN0cnVjdGlvbnMgKi8KKwkJCTEsICAvKiB6L0FyY2ggbW9kZSBpbnN0YWxsZWQgKi8KKwkJCTIsICAvKiB6L0FyY2ggbW9kZSBhY3RpdmUgKi8KKwkJCTMsICAvKiBEQVQtZW5oYW5jZW1lbnQgKi8KKwkJCTQsICAvKiBpZHRlIHNlZ21lbnQgdGFibGUgKi8KKwkJCTUsICAvKiBpZHRlIHJlZ2lvbiB0YWJsZSAqLworCQkJNiwgIC8qIEFTTi1hbmQtTFggcmV1c2UgKi8KKwkJCTcsICAvKiBzdGZsZSAqLworCQkJOCwgIC8qIGVuaGFuY2VkLURBVCAxICovCisJCQk5LCAgLyogc2Vuc2UtcnVubmluZy1zdGF0dXMgKi8KKwkJCTEwLCAvKiBjb25kaXRpb25hbCBzc2tlICovCisJCQkxMywgLyogaXB0ZS1yYW5nZSAqLworCQkJMTQsIC8qIG5vbnF1aWVzY2luZyBrZXktc2V0dGluZyAqLworCQkJNzMsIC8qIHRyYW5zYWN0aW9uYWwgZXhlY3V0aW9uICovCisJCQk3NSwgLyogYWNjZXNzLWV4Y2VwdGlvbi1mZXRjaC9zdG9yZSBpbmRpY2F0aW9uICovCisJCQk3NiwgLyogbXNhIGV4dGVuc2lvbiAzICovCisJCQk3NywgLyogbXNhIGV4dGVuc2lvbiA0ICovCisJCQk3OCwgLyogZW5oYW5jZWQtREFUIDIgKi8KKwkJCS0xICAvKiBFTkQgKi8KKwkJfQorCX0sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2ZwdS9hcGkuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9mcHUvYXBpLmgKaW5kZXggNmFiYTZmYy4uMDIxMjRkNiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2ZwdS9hcGkuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vZnB1L2FwaS5oCkBAIC02NCwxOCArNjQsMTggQEAKIAlyZXR1cm4gcmM7CiB9CiAKLSNkZWZpbmUgS0VSTkVMX1ZYUl9WMFY3CQkxCi0jZGVmaW5lIEtFUk5FTF9WWFJfVjhWMTUJMgotI2RlZmluZSBLRVJORUxfVlhSX1YxNlYyMwk0Ci0jZGVmaW5lIEtFUk5FTF9WWFJfVjI0VjMxCTgKLSNkZWZpbmUgS0VSTkVMX0ZQUgkJMTYKLSNkZWZpbmUgS0VSTkVMX0ZQQwkJMjU2CisjZGVmaW5lIEtFUk5FTF9GUEMJCTEKKyNkZWZpbmUgS0VSTkVMX1ZYUl9WMFY3CQkyCisjZGVmaW5lIEtFUk5FTF9WWFJfVjhWMTUJNAorI2RlZmluZSBLRVJORUxfVlhSX1YxNlYyMwk4CisjZGVmaW5lIEtFUk5FTF9WWFJfVjI0VjMxCTE2CiAKICNkZWZpbmUgS0VSTkVMX1ZYUl9MT1cJCShLRVJORUxfVlhSX1YwVjd8S0VSTkVMX1ZYUl9WOFYxNSkKICNkZWZpbmUgS0VSTkVMX1ZYUl9NSUQJCShLRVJORUxfVlhSX1Y4VjE1fEtFUk5FTF9WWFJfVjE2VjIzKQogI2RlZmluZSBLRVJORUxfVlhSX0hJR0gJCShLRVJORUxfVlhSX1YxNlYyM3xLRVJORUxfVlhSX1YyNFYzMSkKIAotI2RlZmluZSBLRVJORUxfRlBVX01BU0sJCShLRVJORUxfVlhSX0xPV3xLRVJORUxfVlhSX0hJR0h8S0VSTkVMX0ZQUikKKyNkZWZpbmUgS0VSTkVMX1ZYUgkJKEtFUk5FTF9WWFJfTE9XfEtFUk5FTF9WWFJfSElHSCkKKyNkZWZpbmUgS0VSTkVMX0ZQUgkJKEtFUk5FTF9GUEN8S0VSTkVMX1ZYUl9WMFY3KQogCiBzdHJ1Y3Qga2VybmVsX2ZwdTsKIApAQCAtODcsMTggKzg3LDI4IEBACiAgKiBQcmVmZXIgdXNpbmcgdGhlIGtlcm5lbF9mcHVfYmVnaW4oKS9rZXJuZWxfZnB1X2VuZCgpIHBhaXIgb2YgZnVuY3Rpb25zLgogICovCiB2b2lkIF9fa2VybmVsX2ZwdV9iZWdpbihzdHJ1Y3Qga2VybmVsX2ZwdSAqc3RhdGUsIHUzMiBmbGFncyk7Ci12b2lkIF9fa2VybmVsX2ZwdV9lbmQoc3RydWN0IGtlcm5lbF9mcHUgKnN0YXRlKTsKK3ZvaWQgX19rZXJuZWxfZnB1X2VuZChzdHJ1Y3Qga2VybmVsX2ZwdSAqc3RhdGUsIHUzMiBmbGFncyk7CiAKIAogc3RhdGljIGlubGluZSB2b2lkIGtlcm5lbF9mcHVfYmVnaW4oc3RydWN0IGtlcm5lbF9mcHUgKnN0YXRlLCB1MzIgZmxhZ3MpCiB7CiAJcHJlZW1wdF9kaXNhYmxlKCk7Ci0JX19rZXJuZWxfZnB1X2JlZ2luKHN0YXRlLCBmbGFncyk7CisJc3RhdGUtPm1hc2sgPSBTMzkwX2xvd2NvcmUuZnB1X2ZsYWdzOworCWlmICghdGVzdF9jcHVfZmxhZyhDSUZfRlBVKSkKKwkJLyogU2F2ZSB1c2VyIHNwYWNlIEZQVSBzdGF0ZSBhbmQgcmVnaXN0ZXIgY29udGVudHMgKi8KKwkJc2F2ZV9mcHVfcmVncygpOworCWVsc2UgaWYgKHN0YXRlLT5tYXNrICYgZmxhZ3MpCisJCS8qIFNhdmUgRlBVL3ZlY3RvciByZWdpc3RlciBpbi11c2UgYnkgdGhlIGtlcm5lbCAqLworCQlfX2tlcm5lbF9mcHVfYmVnaW4oc3RhdGUsIGZsYWdzKTsKKwlTMzkwX2xvd2NvcmUuZnB1X2ZsYWdzIHw9IGZsYWdzOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQga2VybmVsX2ZwdV9lbmQoc3RydWN0IGtlcm5lbF9mcHUgKnN0YXRlKQorc3RhdGljIGlubGluZSB2b2lkIGtlcm5lbF9mcHVfZW5kKHN0cnVjdCBrZXJuZWxfZnB1ICpzdGF0ZSwgdTMyIGZsYWdzKQogewotCV9fa2VybmVsX2ZwdV9lbmQoc3RhdGUpOworCVMzOTBfbG93Y29yZS5mcHVfZmxhZ3MgPSBzdGF0ZS0+bWFzazsKKwlpZiAoc3RhdGUtPm1hc2sgJiBmbGFncykKKwkJLyogUmVzdG9yZSBGUFUvdmVjdG9yIHJlZ2lzdGVyIGluLXVzZSBieSB0aGUga2VybmVsICovCisJCV9fa2VybmVsX2ZwdV9lbmQoc3RhdGUsIGZsYWdzKTsKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20va3ZtX2hvc3QuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCmluZGV4IDhlNWRhZjcuLmE0MWZhZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCkBAIC0yOCw3ICsyOCw3IEBACiAKICNkZWZpbmUgS1ZNX1MzOTBfQlNDQV9DUFVfU0xPVFMgNjQKICNkZWZpbmUgS1ZNX1MzOTBfRVNDQV9DUFVfU0xPVFMgMjQ4Ci0jZGVmaW5lIEtWTV9NQVhfVkNQVVMgS1ZNX1MzOTBfRVNDQV9DUFVfU0xPVFMKKyNkZWZpbmUgS1ZNX01BWF9WQ1BVUyAyNTUKICNkZWZpbmUgS1ZNX1VTRVJfTUVNX1NMT1RTIDMyCiAKIC8qCkBAIC0yNDUsNzIgKzI0NSw3MiBAQAogfSBfX3BhY2tlZDsKIAogc3RydWN0IGt2bV92Y3B1X3N0YXQgewotCXUzMiBleGl0X3VzZXJzcGFjZTsKLQl1MzIgZXhpdF9udWxsOwotCXUzMiBleGl0X2V4dGVybmFsX3JlcXVlc3Q7Ci0JdTMyIGV4aXRfZXh0ZXJuYWxfaW50ZXJydXB0OwotCXUzMiBleGl0X3N0b3BfcmVxdWVzdDsKLQl1MzIgZXhpdF92YWxpZGl0eTsKLQl1MzIgZXhpdF9pbnN0cnVjdGlvbjsKLQl1MzIgZXhpdF9wZWk7Ci0JdTMyIGhhbHRfc3VjY2Vzc2Z1bF9wb2xsOwotCXUzMiBoYWx0X2F0dGVtcHRlZF9wb2xsOwotCXUzMiBoYWx0X3BvbGxfaW52YWxpZDsKLQl1MzIgaGFsdF93YWtldXA7Ci0JdTMyIGluc3RydWN0aW9uX2xjdGw7Ci0JdTMyIGluc3RydWN0aW9uX2xjdGxnOwotCXUzMiBpbnN0cnVjdGlvbl9zdGN0bDsKLQl1MzIgaW5zdHJ1Y3Rpb25fc3RjdGc7Ci0JdTMyIGV4aXRfcHJvZ3JhbV9pbnRlcnJ1cHRpb247Ci0JdTMyIGV4aXRfaW5zdHJfYW5kX3Byb2dyYW07Ci0JdTMyIGV4aXRfb3BlcmF0aW9uX2V4Y2VwdGlvbjsKLQl1MzIgZGVsaXZlcl9leHRlcm5hbF9jYWxsOwotCXUzMiBkZWxpdmVyX2VtZXJnZW5jeV9zaWduYWw7Ci0JdTMyIGRlbGl2ZXJfc2VydmljZV9zaWduYWw7Ci0JdTMyIGRlbGl2ZXJfdmlydGlvX2ludGVycnVwdDsKLQl1MzIgZGVsaXZlcl9zdG9wX3NpZ25hbDsKLQl1MzIgZGVsaXZlcl9wcmVmaXhfc2lnbmFsOwotCXUzMiBkZWxpdmVyX3Jlc3RhcnRfc2lnbmFsOwotCXUzMiBkZWxpdmVyX3Byb2dyYW1faW50OwotCXUzMiBkZWxpdmVyX2lvX2ludDsKLQl1MzIgZXhpdF93YWl0X3N0YXRlOwotCXUzMiBpbnN0cnVjdGlvbl9wZm1mOwotCXUzMiBpbnN0cnVjdGlvbl9zdGlkcDsKLQl1MzIgaW5zdHJ1Y3Rpb25fc3B4OwotCXUzMiBpbnN0cnVjdGlvbl9zdHB4OwotCXUzMiBpbnN0cnVjdGlvbl9zdGFwOwotCXUzMiBpbnN0cnVjdGlvbl9zdG9yYWdlX2tleTsKLQl1MzIgaW5zdHJ1Y3Rpb25faXB0ZV9pbnRlcmxvY2s7Ci0JdTMyIGluc3RydWN0aW9uX3N0c2NoOwotCXUzMiBpbnN0cnVjdGlvbl9jaHNjOwotCXUzMiBpbnN0cnVjdGlvbl9zdHNpOwotCXUzMiBpbnN0cnVjdGlvbl9zdGZsOwotCXUzMiBpbnN0cnVjdGlvbl90cHJvdDsKLQl1MzIgaW5zdHJ1Y3Rpb25fc2llOwotCXUzMiBpbnN0cnVjdGlvbl9lc3NhOwotCXUzMiBpbnN0cnVjdGlvbl9zdGh5aTsKLQl1MzIgaW5zdHJ1Y3Rpb25fc2lncF9zZW5zZTsKLQl1MzIgaW5zdHJ1Y3Rpb25fc2lncF9zZW5zZV9ydW5uaW5nOwotCXUzMiBpbnN0cnVjdGlvbl9zaWdwX2V4dGVybmFsX2NhbGw7Ci0JdTMyIGluc3RydWN0aW9uX3NpZ3BfZW1lcmdlbmN5OwotCXUzMiBpbnN0cnVjdGlvbl9zaWdwX2NvbmRfZW1lcmdlbmN5OwotCXUzMiBpbnN0cnVjdGlvbl9zaWdwX3N0YXJ0OwotCXUzMiBpbnN0cnVjdGlvbl9zaWdwX3N0b3A7Ci0JdTMyIGluc3RydWN0aW9uX3NpZ3Bfc3RvcF9zdG9yZV9zdGF0dXM7Ci0JdTMyIGluc3RydWN0aW9uX3NpZ3Bfc3RvcmVfc3RhdHVzOwotCXUzMiBpbnN0cnVjdGlvbl9zaWdwX3N0b3JlX2FkdGxfc3RhdHVzOwotCXUzMiBpbnN0cnVjdGlvbl9zaWdwX2FyY2g7Ci0JdTMyIGluc3RydWN0aW9uX3NpZ3BfcHJlZml4OwotCXUzMiBpbnN0cnVjdGlvbl9zaWdwX3Jlc3RhcnQ7Ci0JdTMyIGluc3RydWN0aW9uX3NpZ3BfaW5pdF9jcHVfcmVzZXQ7Ci0JdTMyIGluc3RydWN0aW9uX3NpZ3BfY3B1X3Jlc2V0OwotCXUzMiBpbnN0cnVjdGlvbl9zaWdwX3Vua25vd247Ci0JdTMyIGRpYWdub3NlXzEwOwotCXUzMiBkaWFnbm9zZV80NDsKLQl1MzIgZGlhZ25vc2VfOWM7Ci0JdTMyIGRpYWdub3NlXzI1ODsKLQl1MzIgZGlhZ25vc2VfMzA4OwotCXUzMiBkaWFnbm9zZV81MDA7CisJdTY0IGV4aXRfdXNlcnNwYWNlOworCXU2NCBleGl0X251bGw7CisJdTY0IGV4aXRfZXh0ZXJuYWxfcmVxdWVzdDsKKwl1NjQgZXhpdF9leHRlcm5hbF9pbnRlcnJ1cHQ7CisJdTY0IGV4aXRfc3RvcF9yZXF1ZXN0OworCXU2NCBleGl0X3ZhbGlkaXR5OworCXU2NCBleGl0X2luc3RydWN0aW9uOworCXU2NCBleGl0X3BlaTsKKwl1NjQgaGFsdF9zdWNjZXNzZnVsX3BvbGw7CisJdTY0IGhhbHRfYXR0ZW1wdGVkX3BvbGw7CisJdTY0IGhhbHRfcG9sbF9pbnZhbGlkOworCXU2NCBoYWx0X3dha2V1cDsKKwl1NjQgaW5zdHJ1Y3Rpb25fbGN0bDsKKwl1NjQgaW5zdHJ1Y3Rpb25fbGN0bGc7CisJdTY0IGluc3RydWN0aW9uX3N0Y3RsOworCXU2NCBpbnN0cnVjdGlvbl9zdGN0ZzsKKwl1NjQgZXhpdF9wcm9ncmFtX2ludGVycnVwdGlvbjsKKwl1NjQgZXhpdF9pbnN0cl9hbmRfcHJvZ3JhbTsKKwl1NjQgZXhpdF9vcGVyYXRpb25fZXhjZXB0aW9uOworCXU2NCBkZWxpdmVyX2V4dGVybmFsX2NhbGw7CisJdTY0IGRlbGl2ZXJfZW1lcmdlbmN5X3NpZ25hbDsKKwl1NjQgZGVsaXZlcl9zZXJ2aWNlX3NpZ25hbDsKKwl1NjQgZGVsaXZlcl92aXJ0aW9faW50ZXJydXB0OworCXU2NCBkZWxpdmVyX3N0b3Bfc2lnbmFsOworCXU2NCBkZWxpdmVyX3ByZWZpeF9zaWduYWw7CisJdTY0IGRlbGl2ZXJfcmVzdGFydF9zaWduYWw7CisJdTY0IGRlbGl2ZXJfcHJvZ3JhbV9pbnQ7CisJdTY0IGRlbGl2ZXJfaW9faW50OworCXU2NCBleGl0X3dhaXRfc3RhdGU7CisJdTY0IGluc3RydWN0aW9uX3BmbWY7CisJdTY0IGluc3RydWN0aW9uX3N0aWRwOworCXU2NCBpbnN0cnVjdGlvbl9zcHg7CisJdTY0IGluc3RydWN0aW9uX3N0cHg7CisJdTY0IGluc3RydWN0aW9uX3N0YXA7CisJdTY0IGluc3RydWN0aW9uX3N0b3JhZ2Vfa2V5OworCXU2NCBpbnN0cnVjdGlvbl9pcHRlX2ludGVybG9jazsKKwl1NjQgaW5zdHJ1Y3Rpb25fc3RzY2g7CisJdTY0IGluc3RydWN0aW9uX2Noc2M7CisJdTY0IGluc3RydWN0aW9uX3N0c2k7CisJdTY0IGluc3RydWN0aW9uX3N0Zmw7CisJdTY0IGluc3RydWN0aW9uX3Rwcm90OworCXU2NCBpbnN0cnVjdGlvbl9zaWU7CisJdTY0IGluc3RydWN0aW9uX2Vzc2E7CisJdTY0IGluc3RydWN0aW9uX3N0aHlpOworCXU2NCBpbnN0cnVjdGlvbl9zaWdwX3NlbnNlOworCXU2NCBpbnN0cnVjdGlvbl9zaWdwX3NlbnNlX3J1bm5pbmc7CisJdTY0IGluc3RydWN0aW9uX3NpZ3BfZXh0ZXJuYWxfY2FsbDsKKwl1NjQgaW5zdHJ1Y3Rpb25fc2lncF9lbWVyZ2VuY3k7CisJdTY0IGluc3RydWN0aW9uX3NpZ3BfY29uZF9lbWVyZ2VuY3k7CisJdTY0IGluc3RydWN0aW9uX3NpZ3Bfc3RhcnQ7CisJdTY0IGluc3RydWN0aW9uX3NpZ3Bfc3RvcDsKKwl1NjQgaW5zdHJ1Y3Rpb25fc2lncF9zdG9wX3N0b3JlX3N0YXR1czsKKwl1NjQgaW5zdHJ1Y3Rpb25fc2lncF9zdG9yZV9zdGF0dXM7CisJdTY0IGluc3RydWN0aW9uX3NpZ3Bfc3RvcmVfYWR0bF9zdGF0dXM7CisJdTY0IGluc3RydWN0aW9uX3NpZ3BfYXJjaDsKKwl1NjQgaW5zdHJ1Y3Rpb25fc2lncF9wcmVmaXg7CisJdTY0IGluc3RydWN0aW9uX3NpZ3BfcmVzdGFydDsKKwl1NjQgaW5zdHJ1Y3Rpb25fc2lncF9pbml0X2NwdV9yZXNldDsKKwl1NjQgaW5zdHJ1Y3Rpb25fc2lncF9jcHVfcmVzZXQ7CisJdTY0IGluc3RydWN0aW9uX3NpZ3BfdW5rbm93bjsKKwl1NjQgZGlhZ25vc2VfMTA7CisJdTY0IGRpYWdub3NlXzQ0OworCXU2NCBkaWFnbm9zZV85YzsKKwl1NjQgZGlhZ25vc2VfMjU4OworCXU2NCBkaWFnbm9zZV8zMDg7CisJdTY0IGRpYWdub3NlXzUwMDsKIH07CiAKICNkZWZpbmUgUEdNX09QRVJBVElPTgkJCTB4MDEKQEAgLTU3Nyw3ICs1NzcsNyBAQAogfTsKIAogc3RydWN0IGt2bV92bV9zdGF0IHsKLQl1MzIgcmVtb3RlX3RsYl9mbHVzaDsKKwl1bG9uZyByZW1vdGVfdGxiX2ZsdXNoOwogfTsKIAogc3RydWN0IGt2bV9hcmNoX21lbW9yeV9zbG90IHsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9sb3djb3JlLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbG93Y29yZS5oCmluZGV4IGQ3OWJhN2MuLjdiOTNiNzggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9sb3djb3JlLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2xvd2NvcmUuaApAQCAtMTI5LDcgKzEyOSw4IEBACiAJX191OAlwYWRfMHgwMzkwWzB4MDM5OC0weDAzOTBdOwkvKiAweDAzOTAgKi8KIAlfX3U2NAlnbWFwOwkJCQkvKiAweDAzOTggKi8KIAlfX3UzMglzcGlubG9ja19sb2NrdmFsOwkJLyogMHgwM2EwICovCi0JX191OAlwYWRfMHgwM2EwWzB4MDQwMC0weDAzYTRdOwkvKiAweDAzYTQgKi8KKwlfX3UzMglmcHVfZmxhZ3M7CQkJLyogMHgwM2E0ICovCisJX191OAlwYWRfMHgwM2E4WzB4MDQwMC0weDAzYThdOwkvKiAweDAzYTggKi8KIAogCS8qIFBlciBjcHUgcHJpbWFyeSBzcGFjZSBhY2Nlc3MgbGlzdCAqLwogCV9fdTMyCXBhc3RlWzE2XTsJCQkvKiAweDA0MDAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9tbXUuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9tbXUuaAppbmRleCA2ZDM5MzI5Li5iZWE3ODVkIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbW11LmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL21tdS5oCkBAIC0xMiw2ICsxMiw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCBwZ3RhYmxlX2xpc3Q7CiAJc3BpbmxvY2tfdCBnbWFwX2xvY2s7CiAJc3RydWN0IGxpc3RfaGVhZCBnbWFwX2xpc3Q7CisJdW5zaWduZWQgbG9uZyBnbWFwX2FzY2U7CiAJdW5zaWduZWQgbG9uZyBhc2NlOwogCXVuc2lnbmVkIGxvbmcgYXNjZV9saW1pdDsKIAl1bnNpZ25lZCBsb25nIHZkc29fYmFzZTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKaW5kZXggYzZhMDg4Yy4uNTE1ZmVhNSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKQEAgLTIxLDYgKzIxLDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmbW0tPmNvbnRleHQuZ21hcF9saXN0KTsKIAljcHVtYXNrX2NsZWFyKCZtbS0+Y29udGV4dC5jcHVfYXR0YWNoX21hc2spOwogCWF0b21pY19zZXQoJm1tLT5jb250ZXh0LmZsdXNoX2NvdW50LCAwKTsKKwltbS0+Y29udGV4dC5nbWFwX2FzY2UgPSAwOwogCW1tLT5jb250ZXh0LmZsdXNoX21tID0gMDsKICNpZmRlZiBDT05GSUdfUEdTVEUKIAltbS0+Y29udGV4dC5hbGxvY19wZ3N0ZSA9IHBhZ2VfdGFibGVfYWxsb2NhdGVfcGdzdGU7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGNpLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGNpLmgKaW5kZXggMGRhOTFjNC4uNjYxMWY3OSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BjaS5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wY2kuaApAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BjaS5oPgogI2luY2x1ZGUgPGFzbS9wY2lfY2xwLmg+CiAjaW5jbHVkZSA8YXNtL3BjaV9kZWJ1Zy5oPgorI2luY2x1ZGUgPGFzbS9zY2xwLmg+CiAKICNkZWZpbmUgUENJQklPU19NSU5fSU8JCTB4MTAwMAogI2RlZmluZSBQQ0lCSU9TX01JTl9NRU0JCTB4MTAwMDAwMDAKQEAgLTExNyw2ICsxMTgsNyBAQAogCiAJc3BpbmxvY2tfdAlpb21tdV9iaXRtYXBfbG9jazsKIAl1bnNpZ25lZCBsb25nCSppb21tdV9iaXRtYXA7CisJdW5zaWduZWQgbG9uZwkqbGF6eV9iaXRtYXA7CiAJdW5zaWduZWQgbG9uZwlpb21tdV9zaXplOwogCXVuc2lnbmVkIGxvbmcJaW9tbXVfcGFnZXM7CiAJdW5zaWduZWQgaW50CW5leHRfYml0OwpAQCAtMjE2LDYgKzIxOCw5IEBACiB2b2lkIHpwY2lfZGVidWdfZXhpdF9kZXZpY2Uoc3RydWN0IHpwY2lfZGV2ICopOwogdm9pZCB6cGNpX2RlYnVnX2luZm8oc3RydWN0IHpwY2lfZGV2ICosIHN0cnVjdCBzZXFfZmlsZSAqKTsKIAorLyogRXJyb3IgcmVwb3J0aW5nICovCitpbnQgenBjaV9yZXBvcnRfZXJyb3Ioc3RydWN0IHBjaV9kZXYgKiwgc3RydWN0IHpwY2lfcmVwb3J0X2Vycm9yX2hlYWRlciAqKTsKKwogI2lmZGVmIENPTkZJR19OVU1BCiAKIC8qIFJldHVybnMgdGhlIG5vZGUgYmFzZWQgb24gUENJIGJ1cyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKaW5kZXggNzJjN2Y2MC4uMDM2MmNkNSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BndGFibGUuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGd0YWJsZS5oCkBAIC04NzQsMzUgKzg3NCwzMSBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3B0ZXBfaXB0ZSh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90ICpwdGVwKQorI2RlZmluZSBJUFRFX0dMT0JBTAkwCisjZGVmaW5lCUlQVEVfTE9DQUwJMQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19wdGVwX2lwdGUodW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCAqcHRlcCwgaW50IGxvY2FsKQogewogCXVuc2lnbmVkIGxvbmcgcHRvID0gKHVuc2lnbmVkIGxvbmcpIHB0ZXA7CiAKLQkvKiBJbnZhbGlkYXRpb24gKyBnbG9iYWwgVExCIGZsdXNoIGZvciB0aGUgcHRlICovCisJLyogSW52YWxpZGF0aW9uICsgVExCIGZsdXNoIGZvciB0aGUgcHRlICovCiAJYXNtIHZvbGF0aWxlKAotCQkiCWlwdGUJJTIsJTMiCi0JCTogIj1tIiAoKnB0ZXApIDogIm0iICgqcHRlcCksICJhIiAocHRvKSwgImEiIChhZGRyZXNzKSk7CisJCSIgICAgICAgLmluc24gcnJmLDB4YjIyMTAwMDAsJVtyMV0sJVtyMl0sMCwlW200XSIKKwkJOiAiK20iICgqcHRlcCkgOiBbcjFdICJhIiAocHRvKSwgW3IyXSAiYSIgKGFkZHJlc3MpLAorCQkgIFttNF0gImkiIChsb2NhbCkpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19wdGVwX2lwdGVfbG9jYWwodW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCAqcHRlcCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3B0ZXBfaXB0ZV9yYW5nZSh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGludCBuciwKKwkJCQkgICAgIHB0ZV90ICpwdGVwLCBpbnQgbG9jYWwpCiB7CiAJdW5zaWduZWQgbG9uZyBwdG8gPSAodW5zaWduZWQgbG9uZykgcHRlcDsKIAotCS8qIEludmFsaWRhdGlvbiArIGxvY2FsIFRMQiBmbHVzaCBmb3IgdGhlIHB0ZSAqLwotCWFzbSB2b2xhdGlsZSgKLQkJIgkuaW5zbiBycmYsMHhiMjIxMDAwMCwlMiwlMywwLDEiCi0JCTogIj1tIiAoKnB0ZXApIDogIm0iICgqcHRlcCksICJhIiAocHRvKSwgImEiIChhZGRyZXNzKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3B0ZXBfaXB0ZV9yYW5nZSh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGludCBuciwgcHRlX3QgKnB0ZXApCi17Ci0JdW5zaWduZWQgbG9uZyBwdG8gPSAodW5zaWduZWQgbG9uZykgcHRlcDsKLQotCS8qIEludmFsaWRhdGUgYSByYW5nZSBvZiBwdGVzICsgZ2xvYmFsIFRMQiBmbHVzaCBvZiB0aGUgcHRlcyAqLworCS8qIEludmFsaWRhdGUgYSByYW5nZSBvZiBwdGVzICsgVExCIGZsdXNoIG9mIHRoZSBwdGVzICovCiAJZG8gewogCQlhc20gdm9sYXRpbGUoCi0JCQkiCS5pbnNuIHJyZiwweGIyMjEwMDAwLCUyLCUwLCUxLDAiCi0JCQk6ICIrYSIgKGFkZHJlc3MpLCAiK2EiIChucikgOiAiYSIgKHB0bykgOiAibWVtb3J5Iik7CisJCQkiICAgICAgIC5pbnNuIHJyZiwweGIyMjEwMDAwLCVbcjFdLCVbcjJdLCVbcjNdLCVbbTRdIgorCQkJOiBbcjJdICIrYSIgKGFkZHJlc3MpLCBbcjNdICIrYSIgKG5yKQorCQkJOiBbcjFdICJhIiAocHRvKSwgW200XSAiaSIgKGxvY2FsKSA6ICJtZW1vcnkiKTsKIAl9IHdoaWxlIChuciAhPSAyNTUpOwogfQogCkBAIC0xMjM5LDUzICsxMjM1LDMzIEBACiAJICAgIHBtZF92YWwoKnBtZHApIHwgX1NFR01FTlRfRU5UUllfSU5WQUxJRCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3BtZHBfaWR0ZSh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHBtZF90ICpwbWRwKQorI2RlZmluZSBJRFRFX0dMT0JBTAkwCisjZGVmaW5lIElEVEVfTE9DQUwJMQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19wbWRwX2lkdGUodW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwbWRfdCAqcG1kcCwgaW50IGxvY2FsKQogewogCXVuc2lnbmVkIGxvbmcgc3RvOwogCiAJc3RvID0gKHVuc2lnbmVkIGxvbmcpIHBtZHAgLSBwbWRfaW5kZXgoYWRkcmVzcykgKiBzaXplb2YocG1kX3QpOwogCWFzbSB2b2xhdGlsZSgKLQkJIgkuaW5zbglycmYsMHhiOThlMDAwMCwlMiwlMywwLDAiCi0JCTogIj1tIiAoKnBtZHApCi0JCTogIm0iICgqcG1kcCksICJhIiAoc3RvKSwgImEiICgoYWRkcmVzcyAmIEhQQUdFX01BU0spKQorCQkiCS5pbnNuCXJyZiwweGI5OGUwMDAwLCVbcjFdLCVbcjJdLDAsJVttNF0iCisJCTogIittIiAoKnBtZHApCisJCTogW3IxXSAiYSIgKHN0byksIFtyMl0gImEiICgoYWRkcmVzcyAmIEhQQUdFX01BU0spKSwKKwkJICBbbTRdICJpIiAobG9jYWwpCiAJCTogImNjIiApOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19wdWRwX2lkdGUodW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdWRfdCAqcHVkcCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3B1ZHBfaWR0ZSh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB1ZF90ICpwdWRwLCBpbnQgbG9jYWwpCiB7CiAJdW5zaWduZWQgbG9uZyByM287CiAKIAlyM28gPSAodW5zaWduZWQgbG9uZykgcHVkcCAtIHB1ZF9pbmRleChhZGRyZXNzKSAqIHNpemVvZihwdWRfdCk7CiAJcjNvIHw9IF9BU0NFX1RZUEVfUkVHSU9OMzsKIAlhc20gdm9sYXRpbGUoCi0JCSIJLmluc24JcnJmLDB4Yjk4ZTAwMDAsJTIsJTMsMCwwIgotCQk6ICI9bSIgKCpwdWRwKQotCQk6ICJtIiAoKnB1ZHApLCAiYSIgKHIzbyksICJhIiAoKGFkZHJlc3MgJiBQVURfTUFTSykpCi0JCTogImNjIik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3BtZHBfaWR0ZV9sb2NhbCh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHBtZF90ICpwbWRwKQotewotCXVuc2lnbmVkIGxvbmcgc3RvOwotCi0Jc3RvID0gKHVuc2lnbmVkIGxvbmcpIHBtZHAgLSBwbWRfaW5kZXgoYWRkcmVzcykgKiBzaXplb2YocG1kX3QpOwotCWFzbSB2b2xhdGlsZSgKLQkJIgkuaW5zbglycmYsMHhiOThlMDAwMCwlMiwlMywwLDEiCi0JCTogIj1tIiAoKnBtZHApCi0JCTogIm0iICgqcG1kcCksICJhIiAoc3RvKSwgImEiICgoYWRkcmVzcyAmIEhQQUdFX01BU0spKQotCQk6ICJjYyIgKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fcHVkcF9pZHRlX2xvY2FsKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHVkX3QgKnB1ZHApCi17Ci0JdW5zaWduZWQgbG9uZyByM287Ci0KLQlyM28gPSAodW5zaWduZWQgbG9uZykgcHVkcCAtIHB1ZF9pbmRleChhZGRyZXNzKSAqIHNpemVvZihwdWRfdCk7Ci0JcjNvIHw9IF9BU0NFX1RZUEVfUkVHSU9OMzsKLQlhc20gdm9sYXRpbGUoCi0JCSIJLmluc24JcnJmLDB4Yjk4ZTAwMDAsJTIsJTMsMCwxIgotCQk6ICI9bSIgKCpwdWRwKQotCQk6ICJtIiAoKnB1ZHApLCAiYSIgKHIzbyksICJhIiAoKGFkZHJlc3MgJiBQVURfTUFTSykpCisJCSIJLmluc24JcnJmLDB4Yjk4ZTAwMDAsJVtyMV0sJVtyMl0sMCwlW200XSIKKwkJOiAiK20iICgqcHVkcCkKKwkJOiBbcjFdICJhIiAocjNvKSwgW3IyXSAiYSIgKChhZGRyZXNzICYgUFVEX01BU0spKSwKKwkJICBbbTRdICJpIiAobG9jYWwpCiAJCTogImNjIik7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS90bGJmbHVzaC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKaW5kZXggMWE2OTFlZi4uMzk4NDYxMCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKQEAgLTI2LDE3ICsyNiw2IEBACiAJCTogOiAiYSIgKDIwNDgpLCAiYSIgKGFzY2UpIDogImNjIik7CiB9CiAKLS8qCi0gKiBGbHVzaCBUTEIgZW50cmllcyBmb3IgYSBzcGVjaWZpYyBBU0NFIG9uIHRoZSBsb2NhbCBDUFUKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIF9fdGxiX2ZsdXNoX2lkdGVfbG9jYWwodW5zaWduZWQgbG9uZyBhc2NlKQotewotCS8qIExvY2FsIFRMQiBmbHVzaCBmb3IgdGhlIG1tICovCi0JYXNtIHZvbGF0aWxlKAotCQkiCS5pbnNuCXJyZiwweGI5OGUwMDAwLDAsJTAsJTEsMSIKLQkJOiA6ICJhIiAoMjA0OCksICJhIiAoYXNjZSkgOiAiY2MiKTsKLX0KLQogI2lmZGVmIENPTkZJR19TTVAKIHZvaWQgc21wX3B0bGJfYWxsKHZvaWQpOwogCkBAIC02NSwzNSArNTQsMzMgQEAKIAkJLyogR2xvYmFsIFRMQiBmbHVzaCAqLwogCQlfX3RsYl9mbHVzaF9nbG9iYWwoKTsKIAkJLyogUmVzZXQgVExCIGZsdXNoIG1hc2sgKi8KLQkJaWYgKE1BQ0hJTkVfSEFTX1RMQl9MQykKLQkJCWNwdW1hc2tfY29weShtbV9jcHVtYXNrKG1tKSwKLQkJCQkgICAgICZtbS0+Y29udGV4dC5jcHVfYXR0YWNoX21hc2spOworCQljcHVtYXNrX2NvcHkobW1fY3B1bWFzayhtbSksICZtbS0+Y29udGV4dC5jcHVfYXR0YWNoX21hc2spOwogCX0KIAlhdG9taWNfZGVjKCZtbS0+Y29udGV4dC5mbHVzaF9jb3VudCk7CiAJcHJlZW1wdF9lbmFibGUoKTsKIH0KIAotLyoKLSAqIEZsdXNoIFRMQiBlbnRyaWVzIGZvciBhIHNwZWNpZmljIEFTQ0Ugb24gYWxsIENQVXMuIFNob3VsZCBuZXZlciBiZSB1c2VkCi0gKiB3aGVuIG1vcmUgdGhhbiBvbmUgYXNjZSAoZS5nLiBnbWFwKSByYW4gb24gdGhpcyBtbS4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIF9fdGxiX2ZsdXNoX2FzY2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYXNjZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3RsYl9mbHVzaF9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKKwl1bnNpZ25lZCBsb25nIGdtYXBfYXNjZTsKKworCS8qCisJICogSWYgdGhlIG1hY2hpbmUgaGFzIElEVEUgd2UgcHJlZmVyIHRvIGRvIGEgcGVyIG1tIGZsdXNoCisJICogb24gYWxsIGNwdXMgaW5zdGVhZCBvZiBkb2luZyBhIGxvY2FsIGZsdXNoIGlmIHRoZSBtbQorCSAqIG9ubHkgcmFuIG9uIHRoZSBsb2NhbCBjcHUuCisJICovCiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAJYXRvbWljX2luYygmbW0tPmNvbnRleHQuZmx1c2hfY291bnQpOwotCWlmIChNQUNISU5FX0hBU19UTEJfTEMgJiYKLQkgICAgY3B1bWFza19lcXVhbChtbV9jcHVtYXNrKG1tKSwgY3B1bWFza19vZihzbXBfcHJvY2Vzc29yX2lkKCkpKSkgewotCQlfX3RsYl9mbHVzaF9pZHRlX2xvY2FsKGFzY2UpOworCWdtYXBfYXNjZSA9IFJFQURfT05DRShtbS0+Y29udGV4dC5nbWFwX2FzY2UpOworCWlmIChNQUNISU5FX0hBU19JRFRFICYmIGdtYXBfYXNjZSAhPSAtMVVMKSB7CisJCWlmIChnbWFwX2FzY2UpCisJCQlfX3RsYl9mbHVzaF9pZHRlKGdtYXBfYXNjZSk7CisJCV9fdGxiX2ZsdXNoX2lkdGUobW0tPmNvbnRleHQuYXNjZSk7CiAJfSBlbHNlIHsKLQkJaWYgKE1BQ0hJTkVfSEFTX0lEVEUpCi0JCQlfX3RsYl9mbHVzaF9pZHRlKGFzY2UpOwotCQllbHNlCi0JCQlfX3RsYl9mbHVzaF9nbG9iYWwoKTsKLQkJLyogUmVzZXQgVExCIGZsdXNoIG1hc2sgKi8KLQkJaWYgKE1BQ0hJTkVfSEFTX1RMQl9MQykKLQkJCWNwdW1hc2tfY29weShtbV9jcHVtYXNrKG1tKSwKLQkJCQkgICAgICZtbS0+Y29udGV4dC5jcHVfYXR0YWNoX21hc2spOworCQlfX3RsYl9mbHVzaF9mdWxsKG1tKTsKIAl9CisJLyogUmVzZXQgVExCIGZsdXNoIG1hc2sgKi8KKwljcHVtYXNrX2NvcHkobW1fY3B1bWFzayhtbSksICZtbS0+Y29udGV4dC5jcHVfYXR0YWNoX21hc2spOwogCWF0b21pY19kZWMoJm1tLT5jb250ZXh0LmZsdXNoX2NvdW50KTsKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQpAQCAtMTEyLDM2ICs5OSwxNyBAQAogLyoKICAqIEZsdXNoIFRMQiBlbnRyaWVzIGZvciBhIHNwZWNpZmljIEFTQ0Ugb24gYWxsIENQVXMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3RsYl9mbHVzaF9hc2NlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFzY2UpCitzdGF0aWMgaW5saW5lIHZvaWQgX190bGJfZmx1c2hfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7Ci0JaWYgKE1BQ0hJTkVfSEFTX1RMQl9MQykKLQkJX190bGJfZmx1c2hfaWR0ZV9sb2NhbChhc2NlKTsKLQllbHNlCi0JCV9fdGxiX2ZsdXNoX2xvY2FsKCk7CisJX190bGJfZmx1c2hfbG9jYWwoKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIF9fdGxiX2ZsdXNoX2tlcm5lbCh2b2lkKQogewotCWlmIChNQUNISU5FX0hBU19UTEJfTEMpCi0JCV9fdGxiX2ZsdXNoX2lkdGVfbG9jYWwoaW5pdF9tbS5jb250ZXh0LmFzY2UpOwotCWVsc2UKLQkJX190bGJfZmx1c2hfbG9jYWwoKTsKKwlfX3RsYl9mbHVzaF9sb2NhbCgpOwogfQogI2VuZGlmCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3RsYl9mbHVzaF9tbShzdHJ1Y3QgbW1fc3RydWN0ICogbW0pCi17Ci0JLyoKLQkgKiBJZiB0aGUgbWFjaGluZSBoYXMgSURURSB3ZSBwcmVmZXIgdG8gZG8gYSBwZXIgbW0gZmx1c2gKLQkgKiBvbiBhbGwgY3B1cyBpbnN0ZWFkIG9mIGRvaW5nIGEgbG9jYWwgZmx1c2ggaWYgdGhlIG1tCi0JICogb25seSByYW4gb24gdGhlIGxvY2FsIGNwdS4KLQkgKi8KLQlpZiAoTUFDSElORV9IQVNfSURURSAmJiBsaXN0X2VtcHR5KCZtbS0+Y29udGV4dC5nbWFwX2xpc3QpKQotCQlfX3RsYl9mbHVzaF9hc2NlKG1tLCBtbS0+Y29udGV4dC5hc2NlKTsKLQllbHNlCi0JCV9fdGxiX2ZsdXNoX2Z1bGwobW0pOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgX190bGJfZmx1c2hfbW1fbGF6eShzdHJ1Y3QgbW1fc3RydWN0ICogbW0pCiB7CiAJaWYgKG1tLT5jb250ZXh0LmZsdXNoX21tKSB7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCA5YjQ5Y2YxLi41MmQ3Yzg3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTI2NiwyOCArMjY2LDI4IEBACiAJX19jaGtfdXNlcl9wdHIocHRyKTsJCQkJCVwKIAlzd2l0Y2ggKHNpemVvZigqKHB0cikpKSB7CQkJCVwKIAljYXNlIDE6IHsJCQkJCQlcCi0JCXVuc2lnbmVkIGNoYXIgX194OwkJCQlcCisJCXVuc2lnbmVkIGNoYXIgX194ID0gMDsJCQkJXAogCQlfX2d1X2VyciA9IF9fZ2V0X3VzZXJfZm4oJl9feCwgcHRyLAkJXAogCQkJCQkgc2l6ZW9mKCoocHRyKSkpOwlcCiAJCSh4KSA9ICooX19mb3JjZSBfX3R5cGVvZl9fKCoocHRyKSkgKikgJl9feDsJXAogCQlicmVhazsJCQkJCQlcCiAJfTsJCQkJCQkJXAogCWNhc2UgMjogewkJCQkJCVwKLQkJdW5zaWduZWQgc2hvcnQgX194OwkJCQlcCisJCXVuc2lnbmVkIHNob3J0IF9feCA9IDA7CQkJCVwKIAkJX19ndV9lcnIgPSBfX2dldF91c2VyX2ZuKCZfX3gsIHB0ciwJCVwKIAkJCQkJIHNpemVvZigqKHB0cikpKTsJXAogCQkoeCkgPSAqKF9fZm9yY2UgX190eXBlb2ZfXygqKHB0cikpICopICZfX3g7CVwKIAkJYnJlYWs7CQkJCQkJXAogCX07CQkJCQkJCVwKIAljYXNlIDQ6IHsJCQkJCQlcCi0JCXVuc2lnbmVkIGludCBfX3g7CQkJCVwKKwkJdW5zaWduZWQgaW50IF9feCA9IDA7CQkJCVwKIAkJX19ndV9lcnIgPSBfX2dldF91c2VyX2ZuKCZfX3gsIHB0ciwJCVwKIAkJCQkJIHNpemVvZigqKHB0cikpKTsJXAogCQkoeCkgPSAqKF9fZm9yY2UgX190eXBlb2ZfXygqKHB0cikpICopICZfX3g7CVwKIAkJYnJlYWs7CQkJCQkJXAogCX07CQkJCQkJCVwKIAljYXNlIDg6IHsJCQkJCQlcCi0JCXVuc2lnbmVkIGxvbmcgbG9uZyBfX3g7CQkJCVwKKwkJdW5zaWduZWQgbG9uZyBsb25nIF9feCA9IDA7CQkJXAogCQlfX2d1X2VyciA9IF9fZ2V0X3VzZXJfZm4oJl9feCwgcHRyLAkJXAogCQkJCQkgc2l6ZW9mKCoocHRyKSkpOwlcCiAJCSh4KSA9ICooX19mb3JjZSBfX3R5cGVvZl9fKCoocHRyKSkgKikgJl9feDsJXApAQCAtMzExLDYgKzMxMSwxNCBAQAogI2RlZmluZSBfX3B1dF91c2VyX3VuYWxpZ25lZCBfX3B1dF91c2VyCiAjZGVmaW5lIF9fZ2V0X3VzZXJfdW5hbGlnbmVkIF9fZ2V0X3VzZXIKIAorZXh0ZXJuIHZvaWQgX19jb21waWxldGltZV9lcnJvcigidXNlcmNvcHkgYnVmZmVyIHNpemUgaXMgdG9vIHNtYWxsIikKK19fYmFkX2NvcHlfdXNlcih2b2lkKTsKKworc3RhdGljIGlubGluZSB2b2lkIGNvcHlfdXNlcl9vdmVyZmxvdyhpbnQgc2l6ZSwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwlXQVJOKDEsICJCdWZmZXIgb3ZlcmZsb3cgZGV0ZWN0ZWQgKCVkIDwgJWx1KSFcbiIsIHNpemUsIGNvdW50KTsKK30KKwogLyoqCiAgKiBjb3B5X3RvX3VzZXI6IC0gQ29weSBhIGJsb2NrIG9mIGRhdGEgaW50byB1c2VyIHNwYWNlLgogICogQHRvOiAgIERlc3RpbmF0aW9uIGFkZHJlc3MsIGluIHVzZXIgc3BhY2UuCkBAIC0zMzIsMTIgKzM0MCw2IEBACiAJcmV0dXJuIF9fY29weV90b191c2VyKHRvLCBmcm9tLCBuKTsKIH0KIAotdm9pZCBjb3B5X2Zyb21fdXNlcl9vdmVyZmxvdyh2b2lkKQotI2lmZGVmIENPTkZJR19ERUJVR19TVFJJQ1RfVVNFUl9DT1BZX0NIRUNLUwotX19jb21waWxldGltZV93YXJuaW5nKCJjb3B5X2Zyb21fdXNlcigpIGJ1ZmZlciBzaXplIGlzIG5vdCBwcm92YWJseSBjb3JyZWN0IikKLSNlbmRpZgotOwotCiAvKioKICAqIGNvcHlfZnJvbV91c2VyOiAtIENvcHkgYSBibG9jayBvZiBkYXRhIGZyb20gdXNlciBzcGFjZS4KICAqIEB0bzogICBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiBrZXJuZWwgc3BhY2UuCkBAIC0zNjIsNyArMzY0LDEwIEBACiAKIAltaWdodF9mYXVsdCgpOwogCWlmICh1bmxpa2VseShzeiAhPSAtMSAmJiBzeiA8IG4pKSB7Ci0JCWNvcHlfZnJvbV91c2VyX292ZXJmbG93KCk7CisJCWlmICghX19idWlsdGluX2NvbnN0YW50X3AobikpCisJCQljb3B5X3VzZXJfb3ZlcmZsb3coc3osIG4pOworCQllbHNlCisJCQlfX2JhZF9jb3B5X3VzZXIoKTsKIAkJcmV0dXJuIG47CiAJfQogCXJldHVybiBfX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS92eC1pbnNuLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdngtaW5zbi5oCmluZGV4IDRhMzEzNTYuLjQ5YzI0YTIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS92eC1pbnNuLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3Z4LWluc24uaApAQCAtMTYsMTUgKzE2LDEzIEBACiAKIC8qIE1hY3JvcyB0byBnZW5lcmF0ZSB2ZWN0b3IgaW5zdHJ1Y3Rpb24gYnl0ZSBjb2RlICovCiAKLSNkZWZpbmUgUkVHX05VTV9JTlZBTElECSAgICAgICAyNTUKLQogLyogR1JfTlVNIC0gUmV0cmlldmUgZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVyIG51bWJlcgogICoKICAqIEBvcGQ6CU9wZXJhbmQgdG8gc3RvcmUgcmVnaXN0ZXIgbnVtYmVyCiAgKiBAcjY0OglTdHJpbmcgZGVzaWduYXRpb24gcmVnaXN0ZXIgaW4gdGhlIGZvcm1hdCAiJXJOIgogICovCiAubWFjcm8JR1JfTlVNCW9wZCBncgotCVxvcGQgPSBSRUdfTlVNX0lOVkFMSUQKKwlcb3BkID0gMjU1CiAJLmlmYyBcZ3IsJXIwCiAJCVxvcGQgPSAwCiAJLmVuZGlmCkBAIC03MywxNCArNzEsMTEgQEAKIAkuaWZjIFxnciwlcjE1CiAJCVxvcGQgPSAxNQogCS5lbmRpZgotCS5pZiBcb3BkID09IFJFR19OVU1fSU5WQUxJRAotCQkuZXJyb3IgIkludmFsaWQgZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVyIGRlc2lnbmF0aW9uOiBcZ3IiCisJLmlmIFxvcGQgPT0gMjU1CisJCVxvcGQgPSBcZ3IKIAkuZW5kaWYKIC5lbmRtCiAKLS8qIFZYX1IoKSAtIE1hY3JvIHRvIGVuY29kZSB0aGUgVlhfTlVNIGludG8gdGhlIGluc3RydWN0aW9uICovCi0jZGVmaW5lIFZYX1IodikJCSh2ICYgMHgwRikKLQogLyogVlhfTlVNIC0gUmV0cmlldmUgdmVjdG9yIHJlZ2lzdGVyIG51bWJlcgogICoKICAqIEBvcGQ6CU9wZXJhbmQgdG8gc3RvcmUgcmVnaXN0ZXIgbnVtYmVyCkBAIC04OCwxMSArODMsMTAgQEAKICAqCiAgKiBUaGUgdmVjdG9yIHJlZ2lzdGVyIG51bWJlciBpcyB1c2VkIGZvciBhcyBpbnB1dCBudW1iZXIgdG8gdGhlCiAgKiBpbnN0cnVjdGlvbiBhbmQsIGFzIHdlbGwgYXMsIHRvIGNvbXB1dGUgdGhlIFJYQiBmaWVsZCBvZiB0aGUKLSAqIGluc3RydWN0aW9uLiAgVG8gZW5jb2RlIHRoZSBwYXJ0aWN1bGFyIHZlY3RvciByZWdpc3RlciBudW1iZXIsCi0gKiB1c2UgdGhlIFZYX1IodikgbWFjcm8gdG8gZXh0cmFjdCB0aGUgaW5zdHJ1Y3Rpb24gb3Bjb2RlLgorICogaW5zdHJ1Y3Rpb24uCiAgKi8KIC5tYWNybwlWWF9OVU0Jb3BkIHZ4cgotCVxvcGQgPSBSRUdfTlVNX0lOVkFMSUQKKwlcb3BkID0gMjU1CiAJLmlmYyBcdnhyLCV2MAogCQlcb3BkID0gMAogCS5lbmRpZgpAQCAtMTg5LDggKzE4Myw4IEBACiAJLmlmYyBcdnhyLCV2MzEKIAkJXG9wZCA9IDMxCiAJLmVuZGlmCi0JLmlmIFxvcGQgPT0gUkVHX05VTV9JTlZBTElECi0JCS5lcnJvciAiSW52YWxpZCB2ZWN0b3IgcmVnaXN0ZXIgZGVzaWduYXRpb246IFx2eHIiCisJLmlmIFxvcGQgPT0gMjU1CisJCVxvcGQgPSBcdnhyCiAJLmVuZGlmCiAuZW5kbQogCkBAIC0yNTEsNyArMjQ1LDcgQEAKIC8qIFZFQ1RPUiBHRU5FUkFURSBCWVRFIE1BU0sgKi8KIC5tYWNybwlWR0JNCXZyIGltbTIKIAlWWF9OVU0JdjEsIFx2cgotCS53b3JkCSgweEU3MDAgfCAoVlhfUih2MSkgPDwgNCkpCisJLndvcmQJKDB4RTcwMCB8ICgodjEmMTUpIDw8IDQpKQogCS53b3JkCVxpbW0yCiAJTVJYQk9QQwkwLCAweDQ0LCB2MQogLmVuZG0KQEAgLTI2Nyw3ICsyNjEsNyBAQAogCVZYX05VTQl2MSwgXHYKIAlHUl9OVU0JYjIsICIlcjAiCiAJR1JfTlVNCXIzLCBcZ3IKLQkud29yZAkweEU3MDAgfCAoVlhfUih2MSkgPDwgNCkgfCByMworCS53b3JkCTB4RTcwMCB8ICgodjEmMTUpIDw8IDQpIHwgcjMKIAkud29yZAkoYjIgPDwgMTIpIHwgKFxkaXNwKQogCU1SWEJPUEMJXG0sIDB4MjIsIHYxCiAuZW5kbQpAQCAtMjg0LDEyICsyNzgsMjEgQEAKIAlWTFZHCVx2LCBcZ3IsIFxpbmRleCwgMwogLmVuZG0KIAorLyogVkVDVE9SIExPQUQgUkVHSVNURVIgKi8KKy5tYWNybwlWTFIJdjEsIHYyCisJVlhfTlVNCXYxLCBcdjEKKwlWWF9OVU0JdjIsIFx2MgorCS53b3JkCTB4RTcwMCB8ICgodjEmMTUpIDw8IDQpIHwgKHYyJjE1KQorCS53b3JkCTAKKwlNUlhCT1BDCTAsIDB4NTYsIHYxLCB2MgorLmVuZG0KKwogLyogVkVDVE9SIExPQUQgKi8KIC5tYWNybwlWTAl2LCBkaXNwLCBpbmRleD0iJXIwIiwgYmFzZQogCVZYX05VTQl2MSwgXHYKIAlHUl9OVU0JeDIsIFxpbmRleAogCUdSX05VTQliMiwgXGJhc2UKLQkud29yZAkweEU3MDAgfCAoVlhfUih2MSkgPDwgNCkgfCB4MgorCS53b3JkCTB4RTcwMCB8ICgodjEmMTUpIDw8IDQpIHwgeDIKIAkud29yZAkoYjIgPDwgMTIpIHwgKFxkaXNwKQogCU1SWEJPUEMgMCwgMHgwNiwgdjEKIC5lbmRtCkBAIC0yOTksNyArMzAyLDcgQEAKIAlWWF9OVU0JdjEsIFx2cjEKIAlHUl9OVU0JeDIsIFxpbmRleAogCUdSX05VTQliMiwgXGJhc2UKLQkud29yZAkweEU3MDAgfCAoVlhfUih2MSkgPDwgNCkgfCB4MgorCS53b3JkCTB4RTcwMCB8ICgodjEmMTUpIDw8IDQpIHwgeDIKIAkud29yZAkoYjIgPDwgMTIpIHwgKFxkaXNwKQogCU1SWEJPUEMJXG0zLCBcb3BjLCB2MQogLmVuZG0KQEAgLTMxOSw3ICszMjIsNyBAQAogLyogVkVDVE9SIExPQUQgRUxFTUVOVCBJTU1FRElBVEUgKi8KIC5tYWNybwlWTEVJeAl2cjEsIGltbTIsIG0zLCBvcGMKIAlWWF9OVU0JdjEsIFx2cjEKLQkud29yZAkweEU3MDAgfCAoVlhfUih2MSkgPDwgNCkKKwkud29yZAkweEU3MDAgfCAoKHYxJjE1KSA8PCA0KQogCS53b3JkCVxpbW0yCiAJTVJYQk9QQwlcbTMsIFxvcGMsIHYxCiAuZW5kbQpAQCAtMzQxLDcgKzM0NCw3IEBACiAJR1JfTlVNCXIxLCBcZ3IKIAlHUl9OVU0JYjIsIFxiYXNlCiAJVlhfTlVNCXYzLCBcdnIKLQkud29yZAkweEU3MDAgfCAocjEgPDwgNCkgfCBWWF9SKHYzKQorCS53b3JkCTB4RTcwMCB8IChyMSA8PCA0KSB8ICh2MyYxNSkKIAkud29yZAkoYjIgPDwgMTIpIHwgKFxkaXNwKQogCU1SWEJPUEMJXG0sIDB4MjEsIHYzCiAuZW5kbQpAQCAtMzYzLDcgKzM2Niw3IEBACiAJVlhfTlVNCXYxLCBcdmZyb20KIAlWWF9OVU0JdjMsIFx2dG8KIAlHUl9OVU0JYjIsIFxiYXNlCSAgICAvKiBCYXNlIHJlZ2lzdGVyICovCi0JLndvcmQJMHhFNzAwIHwgKFZYX1IodjEpIDw8IDQpIHwgVlhfUih2MykKKwkud29yZAkweEU3MDAgfCAoKHYxJjE1KSA8PCA0KSB8ICh2MyYxNSkKIAkud29yZAkoYjIgPDwgMTIpIHwgKFxkaXNwKQogCU1SWEJPUEMJMCwgMHgzNiwgdjEsIHYzCiAuZW5kbQpAQCAtMzczLDcgKzM3Niw3IEBACiAJVlhfTlVNCXYxLCBcdmZyb20KIAlWWF9OVU0JdjMsIFx2dG8KIAlHUl9OVU0JYjIsIFxiYXNlCSAgICAvKiBCYXNlIHJlZ2lzdGVyICovCi0JLndvcmQJMHhFNzAwIHwgKFZYX1IodjEpIDw8IDQpIHwgVlhfUih2MykKKwkud29yZAkweEU3MDAgfCAoKHYxJjE1KSA8PCA0KSB8ICh2MyYxNSkKIAkud29yZAkoYjIgPDwgMTIpIHwgKFxkaXNwKQogCU1SWEJPUEMJMCwgMHgzRSwgdjEsIHYzCiAuZW5kbQpAQCAtMzg0LDE2ICszODcsMTYgQEAKIAlWWF9OVU0JdjIsIFx2cjIKIAlWWF9OVU0JdjMsIFx2cjMKIAlWWF9OVU0JdjQsIFx2cjQKLQkud29yZAkweEU3MDAgfCAoVlhfUih2MSkgPDwgNCkgfCBWWF9SKHYyKQotCS53b3JkCShWWF9SKHYzKSA8PCAxMikKLQlNUlhCT1BDCVZYX1IodjQpLCAweDhDLCB2MSwgdjIsIHYzLCB2NAorCS53b3JkCTB4RTcwMCB8ICgodjEmMTUpIDw8IDQpIHwgKHYyJjE1KQorCS53b3JkCSgodjMmMTUpIDw8IDEyKQorCU1SWEJPUEMJKHY0JjE1KSwgMHg4QywgdjEsIHYyLCB2MywgdjQKIC5lbmRtCiAKIC8qIFZFQ1RPUiBVTlBBQ0sgTE9HSUNBTCBMT1cgKi8KIC5tYWNybwlWVVBMTAl2cjEsIHZyMiwgbTMKIAlWWF9OVU0JdjEsIFx2cjEKIAlWWF9OVU0JdjIsIFx2cjIKLQkud29yZAkweEU3MDAgfCAoVlhfUih2MSkgPDwgNCkgfCBWWF9SKHYyKQorCS53b3JkCTB4RTcwMCB8ICgodjEmMTUpIDw8IDQpIHwgKHYyJjE1KQogCS53b3JkCTB4MDAwMAogCU1SWEJPUEMJXG0zLCAweEQ0LCB2MSwgdjIKIC5lbmRtCkBAIC00MTAsMTMgKzQxMywyMyBAQAogCiAvKiBWZWN0b3IgaW50ZWdlciBpbnN0cnVjdGlvbnMgKi8KIAorLyogVkVDVE9SIEFORCAqLworLm1hY3JvCVZOCXZyMSwgdnIyLCB2cjMKKwlWWF9OVU0JdjEsIFx2cjEKKwlWWF9OVU0JdjIsIFx2cjIKKwlWWF9OVU0JdjMsIFx2cjMKKwkud29yZAkweEU3MDAgfCAoKHYxJjE1KSA8PCA0KSB8ICh2MiYxNSkKKwkud29yZAkoKHYzJjE1KSA8PCAxMikKKwlNUlhCT1BDCTAsIDB4NjgsIHYxLCB2MiwgdjMKKy5lbmRtCisKIC8qIFZFQ1RPUiBFWENMVVNJVkUgT1IgKi8KIC5tYWNybwlWWAl2cjEsIHZyMiwgdnIzCiAJVlhfTlVNCXYxLCBcdnIxCiAJVlhfTlVNCXYyLCBcdnIyCiAJVlhfTlVNCXYzLCBcdnIzCi0JLndvcmQJMHhFNzAwIHwgKFZYX1IodjEpIDw8IDQpIHwgVlhfUih2MikKLQkud29yZAkoVlhfUih2MykgPDwgMTIpCisJLndvcmQJMHhFNzAwIHwgKCh2MSYxNSkgPDwgNCkgfCAodjImMTUpCisJLndvcmQJKCh2MyYxNSkgPDwgMTIpCiAJTVJYQk9QQwkwLCAweDZELCB2MSwgdjIsIHYzCiAuZW5kbQogCkBAIC00MjUsOCArNDM4LDggQEAKIAlWWF9OVU0JdjEsIFx2cjEKIAlWWF9OVU0JdjIsIFx2cjIKIAlWWF9OVU0JdjMsIFx2cjMKLQkud29yZAkweEU3MDAgfCAoVlhfUih2MSkgPDwgNCkgfCBWWF9SKHYyKQotCS53b3JkCShWWF9SKHYzKSA8PCAxMikKKwkud29yZAkweEU3MDAgfCAoKHYxJjE1KSA8PCA0KSB8ICh2MiYxNSkKKwkud29yZAkoKHYzJjE1KSA8PCAxMikKIAlNUlhCT1BDCVxtNCwgMHhCNCwgdjEsIHYyLCB2MwogLmVuZG0KIC5tYWNybwlWR0ZNQgl2cjEsIHZyMiwgdnIzCkBAIC00NDgsOSArNDYxLDkgQEAKIAlWWF9OVU0JdjIsIFx2cjIKIAlWWF9OVU0JdjMsIFx2cjMKIAlWWF9OVU0JdjQsIFx2cjQKLQkud29yZAkweEU3MDAgfCAoVlhfUih2MSkgPDwgNCkgfCBWWF9SKHYyKQotCS53b3JkCShWWF9SKHYzKSA8PCAxMikgfCAoXG01IDw8IDgpCi0JTVJYQk9QQwlWWF9SKHY0KSwgMHhCQywgdjEsIHYyLCB2MywgdjQKKwkud29yZAkweEU3MDAgfCAoKHYxJjE1KSA8PCA0KSB8ICh2MiYxNSkKKwkud29yZAkoKHYzJjE1KSA8PCAxMikgfCAoXG01IDw8IDgpCisJTVJYQk9QQwkodjQmMTUpLCAweEJDLCB2MSwgdjIsIHYzLCB2NAogLmVuZG0KIC5tYWNybwlWR0ZNQUIJdnIxLCB2cjIsIHZyMywgdnI0CiAJVkdGTUEJXHZyMSwgXHZyMiwgXHZyMywgXHZyNCwgMApAQCAtNDcwLDExICs0ODMsNzggQEAKIAlWWF9OVU0JdjEsIFx2cjEKIAlWWF9OVU0JdjIsIFx2cjIKIAlWWF9OVU0JdjMsIFx2cjMKLQkud29yZAkweEU3MDAgfCAoVlhfUih2MSkgPDwgNCkgfCBWWF9SKHYyKQotCS53b3JkCShWWF9SKHYzKSA8PCAxMikKKwkud29yZAkweEU3MDAgfCAoKHYxJjE1KSA8PCA0KSB8ICh2MiYxNSkKKwkud29yZAkoKHYzJjE1KSA8PCAxMikKIAlNUlhCT1BDCTAsIDB4N0QsIHYxLCB2MiwgdjMKIC5lbmRtCiAKKy8qIFZFQ1RPUiBSRVBMSUNBVEUgSU1NRURJQVRFICovCisubWFjcm8JVlJFUEkJdnIxLCBpbW0yLCBtMworCVZYX05VTQl2MSwgXHZyMQorCS53b3JkCTB4RTcwMCB8ICgodjEmMTUpIDw8IDQpCisJLndvcmQJXGltbTIKKwlNUlhCT1BDCVxtMywgMHg0NSwgdjEKKy5lbmRtCisubWFjcm8JVlJFUElCCXZyMSwgaW1tMgorCVZSRVBJCVx2cjEsIFxpbW0yLCAwCisuZW5kbQorLm1hY3JvCVZSRVBJSAl2cjEsIGltbTIKKwlWUkVQSQlcdnIxLCBcaW1tMiwgMQorLmVuZG0KKy5tYWNybwlWUkVQSUYJdnIxLCBpbW0yCisJVlJFUEkJXHZyMSwgXGltbTIsIDIKKy5lbmRtCisubWFjcm8JVlJFUElHCXZyMSwgaW1tMgorCVZSRVAJXHZyMSwgXGltbTIsIDMKKy5lbmRtCisKKy8qIFZFQ1RPUiBBREQgKi8KKy5tYWNybwlWQQl2cjEsIHZyMiwgdnIzLCBtNAorCVZYX05VTQl2MSwgXHZyMQorCVZYX05VTQl2MiwgXHZyMgorCVZYX05VTQl2MywgXHZyMworCS53b3JkCTB4RTcwMCB8ICgodjEmMTUpIDw8IDQpIHwgKHYyJjE1KQorCS53b3JkCSgodjMmMTUpIDw8IDEyKQorCU1SWEJPUEMJXG00LCAweEYzLCB2MSwgdjIsIHYzCisuZW5kbQorLm1hY3JvCVZBQgl2cjEsIHZyMiwgdnIzCisJVkEJXHZyMSwgXHZyMiwgXHZyMywgMAorLmVuZG0KKy5tYWNybwlWQUgJdnIxLCB2cjIsIHZyMworCVZBCVx2cjEsIFx2cjIsIFx2cjMsIDEKKy5lbmRtCisubWFjcm8JVkFGCXZyMSwgdnIyLCB2cjMKKwlWQQlcdnIxLCBcdnIyLCBcdnIzLCAyCisuZW5kbQorLm1hY3JvCVZBRwl2cjEsIHZyMiwgdnIzCisJVkEJXHZyMSwgXHZyMiwgXHZyMywgMworLmVuZG0KKy5tYWNybwlWQVEJdnIxLCB2cjIsIHZyMworCVZBCVx2cjEsIFx2cjIsIFx2cjMsIDQKKy5lbmRtCisKKy8qIFZFQ1RPUiBFTEVNRU5UIFNISUZUIFJJR0hUIEFSSVRITUVUSUMgKi8KKy5tYWNybwlWRVNSQVYJdnIxLCB2cjIsIHZyMywgbTQKKwlWWF9OVU0JdjEsIFx2cjEKKwlWWF9OVU0JdjIsIFx2cjIKKwlWWF9OVU0JdjMsIFx2cjMKKwkud29yZAkweEU3MDAgfCAoKHYxJjE1KSA8PCA0KSB8ICh2MiYxNSkKKwkud29yZAkoKHYzJjE1KSA8PCAxMikKKwlNUlhCT1BDIFxtNCwgMHg3QSwgdjEsIHYyLCB2MworLmVuZG0KKworLm1hY3JvCVZFU1JBVkIJdnIxLCB2cjIsIHZyMworCVZFU1JBVglcdnIxLCBcdnIyLCBcdnIzLCAwCisuZW5kbQorLm1hY3JvCVZFU1JBVkgJdnIxLCB2cjIsIHZyMworCVZFU1JBVglcdnIxLCBcdnIyLCBcdnIzLCAxCisuZW5kbQorLm1hY3JvCVZFU1JBVkYJdnIxLCB2cjIsIHZyMworCVZFU1JBVglcdnIxLCBcdnIyLCBcdnIzLCAyCisuZW5kbQorLm1hY3JvCVZFU1JBVkcJdnIxLCB2cjIsIHZyMworCVZFU1JBVglcdnIxLCBcdnIyLCBcdnIzLCAzCisuZW5kbQogCiAjZW5kaWYJLyogX19BU1NFTUJMWV9fICovCiAjZW5kaWYJLyogX19BU01fUzM5MF9WWF9JTlNOX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL3VhcGkvYXNtL0tidWlsZCBiL2FyY2gvczM5MC9pbmNsdWRlL3VhcGkvYXNtL0tidWlsZAppbmRleCAwOGZlNmRhLi5jYzQ0YjA5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS91YXBpL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvdWFwaS9hc20vS2J1aWxkCkBAIC02LDYgKzYsNyBAQAogaGVhZGVyLXkgKz0gYnl0ZW9yZGVyLmgKIGhlYWRlci15ICs9IGNocGlkLmgKIGhlYWRlci15ICs9IGNoc2MuaAoraGVhZGVyLXkgKz0gY2xwLmgKIGhlYWRlci15ICs9IGNtYi5oCiBoZWFkZXIteSArPSBkYXNkLmgKIGhlYWRlci15ICs9IGRlYnVnLmgKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3MzOTAva2VybmVsL01ha2VmaWxlCmluZGV4IDMyMzQ4MTcuLjcyY2NjNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9NYWtlZmlsZQpAQCAtNDgsNiArNDgsOSBAQAogZW5kaWYKIEdDT1ZfUFJPRklMRV9zY2xwLm8gOj0gbgogR0NPVl9QUk9GSUxFX2Fscy5vIDo9IG4KK1VCU0FOX1NBTklUSVpFX2Fscy5vIDo9IG4KK1VCU0FOX1NBTklUSVpFX2Vhcmx5Lm8gOj0gbgorVUJTQU5fU0FOSVRJWkVfc2NscC5vIDo9IG4KIAogb2JqLXkJOj0gdHJhcHMubyB0aW1lLm8gcHJvY2Vzcy5vIGJhc2UubyBlYXJseS5vIHNldHVwLm8gaWRsZS5vIHZ0aW1lLm8KIG9iai15CSs9IHByb2Nlc3Nvci5vIHN5c19zMzkwLm8gcHRyYWNlLm8gc2lnbmFsLm8gY3BjbWQubyBlYmNkaWMubyBubWkubwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9zMzkwL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IDFmOTVjYzEuLmYzZGY5ZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTEyNSw2ICsxMjUsNyBAQAogCU9GRlNFVChfX0xDX1NURkxfRkFDX0xJU1QsIGxvd2NvcmUsIHN0ZmxfZmFjX2xpc3QpOwogCU9GRlNFVChfX0xDX1NURkxFX0ZBQ19MSVNULCBsb3djb3JlLCBzdGZsZV9mYWNfbGlzdCk7CiAJT0ZGU0VUKF9fTENfTUNDS19DT0RFLCBsb3djb3JlLCBtY2NrX2ludGVycnVwdGlvbl9jb2RlKTsKKwlPRkZTRVQoX19MQ19FWFRfREFNQUdFX0NPREUsIGxvd2NvcmUsIGV4dGVybmFsX2RhbWFnZV9jb2RlKTsKIAlPRkZTRVQoX19MQ19NQ0NLX0ZBSUxfU1RPUl9BRERSLCBsb3djb3JlLCBmYWlsaW5nX3N0b3JhZ2VfYWRkcmVzcyk7CiAJT0ZGU0VUKF9fTENfTEFTVF9CUkVBSywgbG93Y29yZSwgYnJlYWtpbmdfZXZlbnRfYWRkcik7CiAJT0ZGU0VUKF9fTENfUlNUX09MRF9QU1csIGxvd2NvcmUsIHJlc3RhcnRfb2xkX3Bzdyk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NyYXNoX2R1bXAuYyBiL2FyY2gvczM5MC9rZXJuZWwvY3Jhc2hfZHVtcC5jCmluZGV4IDI5ZGY4NDg0Li5mOTI5M2JmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2NyYXNoX2R1bXAuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2NyYXNoX2R1bXAuYwpAQCAtNzEsOSArNzEsNyBAQAogICovCiBzdHJ1Y3Qgc2F2ZV9hcmVhICogX19pbml0IHNhdmVfYXJlYV9ib290X2NwdSh2b2lkKQogewotCWlmIChsaXN0X2VtcHR5KCZkdW1wX3NhdmVfYXJlYXMpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gbGlzdF9maXJzdF9lbnRyeSgmZHVtcF9zYXZlX2FyZWFzLCBzdHJ1Y3Qgc2F2ZV9hcmVhLCBsaXN0KTsKKwlyZXR1cm4gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZkdW1wX3NhdmVfYXJlYXMsIHN0cnVjdCBzYXZlX2FyZWEsIGxpc3QpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9lYXJseS5jIGIvYXJjaC9zMzkwL2tlcm5lbC9lYXJseS5jCmluZGV4IDcxN2IwM2EuLjIzNzRjNWIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvZWFybHkuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2Vhcmx5LmMKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkZXAuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHRhYmxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGZuLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9mcHUuYyBiL2FyY2gvczM5MC9rZXJuZWwvZnB1LmMKaW5kZXggODFkMWQxOC4uMTIzNWI5NCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9mcHUuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2ZwdS5jCkBAIC0xMCwyNDAgKzEwLDE2NyBAQAogI2luY2x1ZGUgPGFzbS9mcHUvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vZnB1L2FwaS5oPgogCi0vKgotICogUGVyLUNQVSB2YXJpYWJsZSB0byBtYWludGFpbiBGUFUgcmVnaXN0ZXIgcmFuZ2VzIHRoYXQgYXJlIGluIHVzZQotICogYnkgdGhlIGtlcm5lbC4KLSAqLwotc3RhdGljIERFRklORV9QRVJfQ1BVKHUzMiwga2VybmVsX2ZwdV9zdGF0ZSk7Ci0KLSNkZWZpbmUgS0VSTkVMX0ZQVV9TVEFURV9NQVNLCShLRVJORUxfRlBVX01BU0t8S0VSTkVMX0ZQQykKLQorYXNtKCIuaW5jbHVkZSBcImFzbS92eC1pbnNuLmhcIlxuIik7CiAKIHZvaWQgX19rZXJuZWxfZnB1X2JlZ2luKHN0cnVjdCBrZXJuZWxfZnB1ICpzdGF0ZSwgdTMyIGZsYWdzKQogewotCWlmICghX190aGlzX2NwdV9yZWFkKGtlcm5lbF9mcHVfc3RhdGUpKSB7Ci0JCS8qCi0JCSAqIFNhdmUgdXNlciBzcGFjZSBGUFUgc3RhdGUgYW5kIHJlZ2lzdGVyIGNvbnRlbnRzLiAgTXVsdGlwbGUKLQkJICogY2FsbHMgYmVjYXVzZSBvZiBpbnRlcnJ1cHRpb25zIGRvIG5vdCBtYXR0ZXIgYW5kIHJldHVybgotCQkgKiBpbW1lZGlhdGVseS4gIFRoaXMgYWxzbyBzZXRzIENJRl9GUFUgdG8gbGF6eSByZXN0b3JlIEZQL1ZYCi0JCSAqIHJlZ2lzdGVyIGNvbnRlbnRzIHdoZW4gcmV0dXJuaW5nIHRvIHVzZXIgc3BhY2UuCi0JCSAqLwotCQlzYXZlX2ZwdV9yZWdzKCk7Ci0JfQotCi0JLyogVXBkYXRlIGZsYWdzIHRvIHVzZSB0aGUgdmVjdG9yIGZhY2lsaXR5IGZvciBLRVJORUxfRlBSICovCi0JaWYgKE1BQ0hJTkVfSEFTX1ZYICYmIChzdGF0ZS0+bWFzayAmIEtFUk5FTF9GUFIpKSB7Ci0JCWZsYWdzIHw9IEtFUk5FTF9WWFJfTE9XIHwgS0VSTkVMX0ZQQzsKLQkJZmxhZ3MgJj0gfktFUk5FTF9GUFI7Ci0JfQotCi0JLyogU2F2ZSBhbmQgdXBkYXRlIGN1cnJlbnQga2VybmVsIFZYIHN0YXRlICovCi0Jc3RhdGUtPm1hc2sgPSBfX3RoaXNfY3B1X3JlYWQoa2VybmVsX2ZwdV9zdGF0ZSk7Ci0JX190aGlzX2NwdV9vcihrZXJuZWxfZnB1X3N0YXRlLCBmbGFncyAmIEtFUk5FTF9GUFVfU1RBVEVfTUFTSyk7Ci0KIAkvKgotCSAqIElmIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwgdG8gX19rZXJuZWxfZnB1X2JlZ2luKCksIG5vIGFkZGl0aW9uYWwKLQkgKiB3b3JrIGlzIHJlcXVpcmVkLgorCSAqIExpbWl0IHRoZSBzYXZlIHRvIHRoZSBGUFUvdmVjdG9yIHJlZ2lzdGVycyBhbHJlYWR5CisJICogaW4gdXNlIGJ5IHRoZSBwcmV2aW91cyBjb250ZXh0CiAJICovCi0JaWYgKCEoc3RhdGUtPm1hc2sgJiBLRVJORUxfRlBVX1NUQVRFX01BU0spKQotCQlyZXR1cm47CisJZmxhZ3MgJj0gc3RhdGUtPm1hc2s7CiAKLQkvKgotCSAqIElmIEtFUk5FTF9GUFIgaXMgc3RpbGwgc2V0LCB0aGUgdmVjdG9yIGZhY2lsaXR5IGlzIG5vdCBhdmFpbGFibGUKLQkgKiBhbmQsIHRodXMsIHNhdmUgZmxvYXRpbmctcG9pbnQgY29udHJvbCBhbmQgcmVnaXN0ZXJzIG9ubHkuCi0JICovCi0JaWYgKHN0YXRlLT5tYXNrICYgS0VSTkVMX0ZQUikgewotCQlhc20gdm9sYXRpbGUoInN0ZnBjICUwIiA6ICI9USIgKHN0YXRlLT5mcGMpKTsKLQkJYXNtIHZvbGF0aWxlKCJzdGQgMCwlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1swXSkpOwotCQlhc20gdm9sYXRpbGUoInN0ZCAxLCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzFdKSk7Ci0JCWFzbSB2b2xhdGlsZSgic3RkIDIsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbMl0pKTsKLQkJYXNtIHZvbGF0aWxlKCJzdGQgMywlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1szXSkpOwotCQlhc20gdm9sYXRpbGUoInN0ZCA0LCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzRdKSk7Ci0JCWFzbSB2b2xhdGlsZSgic3RkIDUsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbNV0pKTsKLQkJYXNtIHZvbGF0aWxlKCJzdGQgNiwlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1s2XSkpOwotCQlhc20gdm9sYXRpbGUoInN0ZCA3LCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzddKSk7Ci0JCWFzbSB2b2xhdGlsZSgic3RkIDgsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbOF0pKTsKLQkJYXNtIHZvbGF0aWxlKCJzdGQgOSwlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1s5XSkpOwotCQlhc20gdm9sYXRpbGUoInN0ZCAxMCwlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1sxMF0pKTsKLQkJYXNtIHZvbGF0aWxlKCJzdGQgMTEsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbMTFdKSk7Ci0JCWFzbSB2b2xhdGlsZSgic3RkIDEyLCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzEyXSkpOwotCQlhc20gdm9sYXRpbGUoInN0ZCAxMywlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1sxM10pKTsKLQkJYXNtIHZvbGF0aWxlKCJzdGQgMTQsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbMTRdKSk7Ci0JCWFzbSB2b2xhdGlsZSgic3RkIDE1LCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzE1XSkpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBJZiB0aGlzIGlzIGEgbmVzdGVkIGNhbGwgdG8gX19rZXJuZWxfZnB1X2JlZ2luKCksIGNoZWNrIHRoZSBzYXZlZAotCSAqIHN0YXRlIG1hc2sgdG8gc2F2ZSBhbmQgbGF0ZXIgcmVzdG9yZSB0aGUgdmVjdG9yIHJlZ2lzdGVycyB0aGF0Ci0JICogYXJlIGFscmVhZHkgaW4gdXNlLglMZXQncyBzdGFydCB3aXRoIGNoZWNraW5nIGZsb2F0aW5nLXBvaW50Ci0JICogY29udHJvbHMuCi0JICovCi0JaWYgKHN0YXRlLT5tYXNrICYgS0VSTkVMX0ZQQykKKwlpZiAoZmxhZ3MgJiBLRVJORUxfRlBDKQorCQkvKiBTYXZlIGZsb2F0aW5nIHBvaW50IGNvbnRyb2wgKi8KIAkJYXNtIHZvbGF0aWxlKCJzdGZwYyAlMCIgOiAiPW0iIChzdGF0ZS0+ZnBjKSk7CiAKKwlpZiAoIU1BQ0hJTkVfSEFTX1ZYKSB7CisJCWlmIChmbGFncyAmIEtFUk5FTF9WWFJfVjBWNykgeworCQkJLyogU2F2ZSBmbG9hdGluZy1wb2ludCByZWdpc3RlcnMgKi8KKwkJCWFzbSB2b2xhdGlsZSgic3RkIDAsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbMF0pKTsKKwkJCWFzbSB2b2xhdGlsZSgic3RkIDEsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbMV0pKTsKKwkJCWFzbSB2b2xhdGlsZSgic3RkIDIsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbMl0pKTsKKwkJCWFzbSB2b2xhdGlsZSgic3RkIDMsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbM10pKTsKKwkJCWFzbSB2b2xhdGlsZSgic3RkIDQsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbNF0pKTsKKwkJCWFzbSB2b2xhdGlsZSgic3RkIDUsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbNV0pKTsKKwkJCWFzbSB2b2xhdGlsZSgic3RkIDYsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbNl0pKTsKKwkJCWFzbSB2b2xhdGlsZSgic3RkIDcsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbN10pKTsKKwkJCWFzbSB2b2xhdGlsZSgic3RkIDgsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbOF0pKTsKKwkJCWFzbSB2b2xhdGlsZSgic3RkIDksJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbOV0pKTsKKwkJCWFzbSB2b2xhdGlsZSgic3RkIDEwLCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzEwXSkpOworCQkJYXNtIHZvbGF0aWxlKCJzdGQgMTEsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbMTFdKSk7CisJCQlhc20gdm9sYXRpbGUoInN0ZCAxMiwlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1sxMl0pKTsKKwkJCWFzbSB2b2xhdGlsZSgic3RkIDEzLCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzEzXSkpOworCQkJYXNtIHZvbGF0aWxlKCJzdGQgMTQsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbMTRdKSk7CisJCQlhc20gdm9sYXRpbGUoInN0ZCAxNSwlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1sxNV0pKTsKKwkJfQorCQlyZXR1cm47CisJfQorCiAJLyogVGVzdCBhbmQgc2F2ZSB2ZWN0b3IgcmVnaXN0ZXJzICovCiAJYXNtIHZvbGF0aWxlICgKIAkJLyoKIAkJICogVGVzdCBpZiBhbnkgdmVjdG9yIHJlZ2lzdGVyIG11c3QgYmUgc2F2ZWQgYW5kLCBpZiBzbywKIAkJICogdGVzdCBpZiBhbGwgcmVnaXN0ZXIgY2FuIGJlIHNhdmVkLgogCQkgKi8KLQkJIgl0bWxsCSVbbV0sMTVcbiIJLyogS0VSTkVMX1ZYUl9NQVNLICovCi0JCSIJanoJMjBmXG4iCQkvKiBubyB3b3JrIC0+IGRvbmUgKi8KIAkJIglsYQkxLCVbdnhyc11cbiIJLyogbG9hZCBzYXZlIGFyZWEgKi8KLQkJIglqbwkxOGZcbiIJCS8qIC0+IHNhdmUgVjAuLlYzMSAqLwotCisJCSIJdG1sbAklW21dLDMwXG4iCS8qIEtFUk5FTF9WWFIgKi8KKwkJIglqegk3ZlxuIgkJLyogbm8gd29yayAtPiBkb25lICovCisJCSIJam8JNWZcbiIJCS8qIC0+IHNhdmUgVjAuLlYzMSAqLwogCQkvKgotCQkgKiBUZXN0IGlmIFY4Li5WMjMgY2FuIGJlIHNhdmVkIGF0IG9uY2UuLi4gdGhpcyBzcGVlZHMgdXAKLQkJICogZm9yIEtFUk5FTF9mcHVfTUlEIG9ubHkuIE90aGVyd2lzZSBjb250aW51ZSB0byBzcGxpdCB0aGUKLQkJICogcmFuZ2Ugb2YgdmVjdG9yIHJlZ2lzdGVycyBpbnRvIHR3byBoYWx2ZXMgYW5kIHRlc3QgdGhlbQotCQkgKiBzZXBhcmF0ZWx5LgorCQkgKiBUZXN0IGZvciBzcGVjaWFsIGNhc2UgS0VSTkVMX0ZQVV9NSUQgb25seS4gSW4gdGhpcworCQkgKiBjYXNlIGEgdnN0bSBWOC4uVjIzIGlzIHRoZSBiZXN0IGluc3RydWN0aW9uCiAJCSAqLwotCQkiCXRtbGwJJVttXSw2XG4iCS8qIEtFUk5FTF9WWFJfTUlEICovCi0JCSIJam8JMTdmXG4iCQkvKiAtPiBzYXZlIFY4Li5WMjMgKi8KLQorCQkiCWNoaQklW21dLDEyXG4iCS8qIEtFUk5FTF9WWFJfTUlEICovCisJCSIJam5lCTBmXG4iCQkvKiAtPiBzYXZlIFY4Li5WMjMgKi8KKwkJIglWU1RNCTgsMjMsMTI4LDFcbiIJLyogdnN0bSAldjgsJXYyMywxMjgoJXIxKSAqLworCQkiCWoJN2ZcbiIKIAkJLyogVGVzdCBhbmQgc2F2ZSB0aGUgZmlyc3QgaGFsZiBvZiAxNiB2ZWN0b3IgcmVnaXN0ZXJzICovCi0JCSIxOgl0bWxsCSVbbV0sM1xuIgkvKiBLRVJORUxfVlhSX0xPVyAqLwotCQkiCWp6CTEwZlxuIgkJLyogLT4gS0VSTkVMX1ZYUl9ISUdIICovCisJCSIwOgl0bWxsCSVbbV0sNlxuIgkvKiBLRVJORUxfVlhSX0xPVyAqLworCQkiCWp6CTNmXG4iCQkvKiAtPiBLRVJORUxfVlhSX0hJR0ggKi8KIAkJIglqbwkyZlxuIgkJLyogMTEgLT4gc2F2ZSBWMC4uVjE1ICovCi0JCSIJYnJjCTQsM2ZcbiIJCS8qIDAxIC0+IHNhdmUgVjAuLlY3ICAqLwotCQkiCWJyYwkyLDRmXG4iCQkvKiAxMCAtPiBzYXZlIFY4Li5WMTUgKi8KLQorCQkiCWJyYwkyLDFmXG4iCQkvKiAxMCAtPiBzYXZlIFY4Li5WMTUgKi8KKwkJIglWU1RNCTAsNywwLDFcbiIJLyogdnN0bSAldjAsJXY3LDAoJXIxKSAqLworCQkiCWoJM2ZcbiIKKwkJIjE6CVZTVE0JOCwxNSwxMjgsMVxuIgkvKiB2c3RtICV2OCwldjE1LDEyOCglcjEpICovCisJCSIJagkzZlxuIgorCQkiMjoJVlNUTQkwLDE1LDAsMVxuIgkvKiB2c3RtICV2MCwldjE1LDAoJXIxKSAqLwogCQkvKiBUZXN0IGFuZCBzYXZlIHRoZSBzZWNvbmQgaGFsZiBvZiAxNiB2ZWN0b3IgcmVnaXN0ZXJzICovCi0JCSIxMDoJdG1sbAklW21dLDEyXG4iCS8qIEtFUk5FTF9WWFJfSElHSCAqLwotCQkiCWpvCTE5ZlxuIgkJLyogMTEgLT4gc2F2ZSBWMTYuLlYzMSAqLwotCQkiCWJyYwk0LDExZlxuIgkvKiAwMSAtPiBzYXZlIFYxNi4uVjIzCSovCi0JCSIJYnJjCTIsMTJmXG4iCS8qIDEwIC0+IHNhdmUgVjI0Li5WMzEgKi8KLQkJIglqCTIwZlxuIgkJLyogMDAgLT4gZG9uZSAqLwotCi0JCS8qCi0JCSAqIEJlbG93IGFyZSB0aGUgdnN0bSBjb21iaW5hdGlvbnMgdG8gc2F2ZSBtdWx0aXBsZSB2ZWN0b3IKLQkJICogcmVnaXN0ZXJzIGF0IG9uY2UuCi0JCSAqLwotCQkiMjoJLndvcmQJMHhlNzBmLDB4MTAwMCwweDAwM2VcbiIJLyogdnN0bSAwLDE1LDAoMSkgKi8KLQkJIglqCTEwYlxuIgkJCS8qIC0+IFZYUl9ISUdIICovCi0JCSIzOgkud29yZAkweGU3MDcsMHgxMDAwLDB4MDAzZVxuIiAvKiB2c3RtIDAsNywwKDEpICovCi0JCSIJagkxMGJcbiIJCQkvKiAtPiBWWFJfSElHSCAqLwotCQkiNDoJLndvcmQJMHhlNzhmLDB4MTA4MCwweDAwM2VcbiIgLyogdnN0bSA4LDE1LDEyOCgxKSAqLwotCQkiCWoJMTBiXG4iCQkJLyogLT4gVlhSX0hJR0ggKi8KLQkJIlxuIgotCQkiMTE6CS53b3JkCTB4ZTcwNywweDExMDAsMHgwYzNlXG4iCS8qIHZzdG0gMTYsMjMsMjU2KDEpICovCi0JCSIJagkyMGZcbiIJCQkvKiAtPiBkb25lICovCi0JCSIxMjoJLndvcmQJMHhlNzhmLDB4MTE4MCwweDBjM2VcbiIgLyogdnN0bSAyNCwzMSwzODQoMSkgKi8KLQkJIglqCTIwZlxuIgkJCS8qIC0+IGRvbmUgKi8KLQkJIlxuIgotCQkiMTc6CS53b3JkCTB4ZTc4NywweDEwODAsMHgwNDNlXG4iCS8qIHZzdG0gOCwyMywxMjgoMSkgKi8KLQkJIgluaWxsCSVbbV0sMjQ5XG4iCQkvKiBtICY9IH5WWFJfTUlEICAgICovCi0JCSIJagkxYlxuIgkJCS8qIC0+IFZYUl9MT1cgKi8KLQkJIlxuIgotCQkiMTg6CS53b3JkCTB4ZTcwZiwweDEwMDAsMHgwMDNlXG4iCS8qIHZzdG0gMCwxNSwwKDEpICovCi0JCSIxOToJLndvcmQJMHhlNzBmLDB4MTEwMCwweDBjM2VcbiIJLyogdnN0bSAxNiwzMSwyNTYoMSkgKi8KLQkJIjIwOiIKKwkJIjM6CXRtbGwJJVttXSwyNFxuIgkvKiBLRVJORUxfVlhSX0hJR0ggKi8KKwkJIglqegk3ZlxuIgorCQkiCWpvCTZmXG4iCQkvKiAxMSAtPiBzYXZlIFYxNi4uVjMxICovCisJCSIJYnJjCTIsNGZcbiIJCS8qIDEwIC0+IHNhdmUgVjI0Li5WMzEgKi8KKwkJIglWU1RNCTE2LDIzLDI1NiwxXG4iCS8qIHZzdG0gJXYxNiwldjIzLDI1NiglcjEpICovCisJCSIJagk3ZlxuIgorCQkiNDoJVlNUTQkyNCwzMSwzODQsMVxuIgkvKiB2c3RtICV2MjQsJXYzMSwzODQoJXIxKSAqLworCQkiCWoJN2ZcbiIKKwkJIjU6CVZTVE0JMCwxNSwwLDFcbiIJLyogdnN0bSAldjAsJXYxNSwwKCVyMSkgKi8KKwkJIjY6CVZTVE0JMTYsMzEsMjU2LDFcbiIJLyogdnN0bSAldjE2LCV2MzEsMjU2KCVyMSkgKi8KKwkJIjc6IgogCQk6IFt2eHJzXSAiPVEiICgqKHN0cnVjdCB2eF9hcnJheSAqKSAmc3RhdGUtPnZ4cnMpCi0JCTogW21dICJkIiAoc3RhdGUtPm1hc2spCisJCTogW21dICJkIiAoZmxhZ3MpCiAJCTogIjEiLCAiY2MiKTsKIH0KIEVYUE9SVF9TWU1CT0woX19rZXJuZWxfZnB1X2JlZ2luKTsKIAotdm9pZCBfX2tlcm5lbF9mcHVfZW5kKHN0cnVjdCBrZXJuZWxfZnB1ICpzdGF0ZSkKK3ZvaWQgX19rZXJuZWxfZnB1X2VuZChzdHJ1Y3Qga2VybmVsX2ZwdSAqc3RhdGUsIHUzMiBmbGFncykKIHsKLQkvKiBKdXN0IHVwZGF0ZSB0aGUgcGVyLUNQVSBzdGF0ZSBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIHJlc3RvcmUgKi8KLQlpZiAoIShzdGF0ZS0+bWFzayAmIEtFUk5FTF9GUFVfU1RBVEVfTUFTSykpCi0JCWdvdG8gdXBkYXRlX2ZwdV9zdGF0ZTsKLQogCS8qCi0JICogSWYgS0VSTkVMX0ZQUiBpcyBzcGVjaWZpZWQsIHRoZSB2ZWN0b3IgZmFjaWxpdHkgaXMgbm90IGF2YWlsYWJsZQotCSAqIGFuZCwgdGh1cywgcmVzdG9yZSBmbG9hdGluZy1wb2ludCBjb250cm9sIGFuZCByZWdpc3RlcnMgb25seS4KKwkgKiBMaW1pdCB0aGUgcmVzdG9yZSB0byB0aGUgRlBVL3ZlY3RvciByZWdpc3RlcnMgb2YgdGhlCisJICogcHJldmlvdXMgY29udGV4dCB0aGF0IGhhdmUgYmVlbiBvdmVyd3JpdHRlIGJ5IHRoZQorCSAqIGN1cnJlbnQgY29udGV4dAogCSAqLwotCWlmIChzdGF0ZS0+bWFzayAmIEtFUk5FTF9GUFIpIHsKLQkJYXNtIHZvbGF0aWxlKCJsZnBjICUwIiA6IDogIlEiIChzdGF0ZS0+ZnBjKSk7Ci0JCWFzbSB2b2xhdGlsZSgibGQgMCwlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbMF0pKTsKLQkJYXNtIHZvbGF0aWxlKCJsZCAxLCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1sxXSkpOwotCQlhc20gdm9sYXRpbGUoImxkIDIsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzJdKSk7Ci0JCWFzbSB2b2xhdGlsZSgibGQgMywlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbM10pKTsKLQkJYXNtIHZvbGF0aWxlKCJsZCA0LCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1s0XSkpOwotCQlhc20gdm9sYXRpbGUoImxkIDUsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzVdKSk7Ci0JCWFzbSB2b2xhdGlsZSgibGQgNiwlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbNl0pKTsKLQkJYXNtIHZvbGF0aWxlKCJsZCA3LCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1s3XSkpOwotCQlhc20gdm9sYXRpbGUoImxkIDgsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzhdKSk7Ci0JCWFzbSB2b2xhdGlsZSgibGQgOSwlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbOV0pKTsKLQkJYXNtIHZvbGF0aWxlKCJsZCAxMCwlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbMTBdKSk7Ci0JCWFzbSB2b2xhdGlsZSgibGQgMTEsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzExXSkpOwotCQlhc20gdm9sYXRpbGUoImxkIDEyLCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1sxMl0pKTsKLQkJYXNtIHZvbGF0aWxlKCJsZCAxMywlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbMTNdKSk7Ci0JCWFzbSB2b2xhdGlsZSgibGQgMTQsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzE0XSkpOwotCQlhc20gdm9sYXRpbGUoImxkIDE1LCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1sxNV0pKTsKLQkJZ290byB1cGRhdGVfZnB1X3N0YXRlOwotCX0KKwlmbGFncyAmPSBzdGF0ZS0+bWFzazsKIAotCS8qIFRlc3QgYW5kIHJlc3RvcmUgZmxvYXRpbmctcG9pbnQgY29udHJvbHMgKi8KLQlpZiAoc3RhdGUtPm1hc2sgJiBLRVJORUxfRlBDKQorCWlmIChmbGFncyAmIEtFUk5FTF9GUEMpCisJCS8qIFJlc3RvcmUgZmxvYXRpbmctcG9pbnQgY29udHJvbHMgKi8KIAkJYXNtIHZvbGF0aWxlKCJsZnBjICUwIiA6IDogIlEiIChzdGF0ZS0+ZnBjKSk7CiAKKwlpZiAoIU1BQ0hJTkVfSEFTX1ZYKSB7CisJCWlmIChmbGFncyAmIEtFUk5FTF9WWFJfVjBWNykgeworCQkJLyogUmVzdG9yZSBmbG9hdGluZy1wb2ludCByZWdpc3RlcnMgKi8KKwkJCWFzbSB2b2xhdGlsZSgibGQgMCwlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbMF0pKTsKKwkJCWFzbSB2b2xhdGlsZSgibGQgMSwlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbMV0pKTsKKwkJCWFzbSB2b2xhdGlsZSgibGQgMiwlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbMl0pKTsKKwkJCWFzbSB2b2xhdGlsZSgibGQgMywlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbM10pKTsKKwkJCWFzbSB2b2xhdGlsZSgibGQgNCwlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbNF0pKTsKKwkJCWFzbSB2b2xhdGlsZSgibGQgNSwlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbNV0pKTsKKwkJCWFzbSB2b2xhdGlsZSgibGQgNiwlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbNl0pKTsKKwkJCWFzbSB2b2xhdGlsZSgibGQgNywlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbN10pKTsKKwkJCWFzbSB2b2xhdGlsZSgibGQgOCwlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbOF0pKTsKKwkJCWFzbSB2b2xhdGlsZSgibGQgOSwlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbOV0pKTsKKwkJCWFzbSB2b2xhdGlsZSgibGQgMTAsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzEwXSkpOworCQkJYXNtIHZvbGF0aWxlKCJsZCAxMSwlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbMTFdKSk7CisJCQlhc20gdm9sYXRpbGUoImxkIDEyLCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1sxMl0pKTsKKwkJCWFzbSB2b2xhdGlsZSgibGQgMTMsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzEzXSkpOworCQkJYXNtIHZvbGF0aWxlKCJsZCAxNCwlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbMTRdKSk7CisJCQlhc20gdm9sYXRpbGUoImxkIDE1LCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1sxNV0pKTsKKwkJfQorCQlyZXR1cm47CisJfQorCiAJLyogVGVzdCBhbmQgcmVzdG9yZSAobG9hZCkgdmVjdG9yIHJlZ2lzdGVycyAqLwogCWFzbSB2b2xhdGlsZSAoCiAJCS8qCi0JCSAqIFRlc3QgaWYgYW55IHZlY3RvciByZWdpc3RlcnMgbXVzdCBiZSBsb2FkZWQgYW5kLCBpZiBzbywKKwkJICogVGVzdCBpZiBhbnkgdmVjdG9yIHJlZ2lzdGVyIG11c3QgYmUgbG9hZGVkIGFuZCwgaWYgc28sCiAJCSAqIHRlc3QgaWYgYWxsIHJlZ2lzdGVycyBjYW4gYmUgbG9hZGVkIGF0IG9uY2UuCiAJCSAqLwotCQkiCXRtbGwJJVttXSwxNVxuIgkvKiBLRVJORUxfVlhSX01BU0sgKi8KLQkJIglqegkyMGZcbiIJCS8qIG5vIHdvcmsgLT4gZG9uZSAqLwotCQkiCWxhCTEsJVt2eHJzXVxuIgkvKiBsb2FkIGxvYWQgYXJlYSAqLwotCQkiCWpvCTE4ZlxuIgkJLyogLT4gbG9hZCBWMC4uVjMxICovCi0KKwkJIglsYQkxLCVbdnhyc11cbiIJLyogbG9hZCByZXN0b3JlIGFyZWEgKi8KKwkJIgl0bWxsCSVbbV0sMzBcbiIJLyogS0VSTkVMX1ZYUiAqLworCQkiCWp6CTdmXG4iCQkvKiBubyB3b3JrIC0+IGRvbmUgKi8KKwkJIglqbwk1ZlxuIgkJLyogLT4gcmVzdG9yZSBWMC4uVjMxICovCiAJCS8qCi0JCSAqIFRlc3QgaWYgVjguLlYyMyBjYW4gYmUgcmVzdG9yZWQgYXQgb25jZS4uLiB0aGlzIHNwZWVkcyB1cAotCQkgKiBmb3IgS0VSTkVMX1ZYUl9NSUQgb25seS4gT3RoZXJ3aXNlIGNvbnRpbnVlIHRvIHNwbGl0IHRoZQotCQkgKiByYW5nZSBvZiB2ZWN0b3IgcmVnaXN0ZXJzIGludG8gdHdvIGhhbHZlcyBhbmQgdGVzdCB0aGVtCi0JCSAqIHNlcGFyYXRlbHkuCisJCSAqIFRlc3QgZm9yIHNwZWNpYWwgY2FzZSBLRVJORUxfRlBVX01JRCBvbmx5LiBJbiB0aGlzCisJCSAqIGNhc2UgYSB2bG0gVjguLlYyMyBpcyB0aGUgYmVzdCBpbnN0cnVjdGlvbgogCQkgKi8KLQkJIgl0bWxsCSVbbV0sNlxuIgkvKiBLRVJORUxfVlhSX01JRCAqLwotCQkiCWpvCTE3ZlxuIgkJLyogLT4gbG9hZCBWOC4uVjIzICovCi0KLQkJLyogVGVzdCBhbmQgbG9hZCB0aGUgZmlyc3QgaGFsZiBvZiAxNiB2ZWN0b3IgcmVnaXN0ZXJzICovCi0JCSIxOgl0bWxsCSVbbV0sM1xuIgkvKiBLRVJORUxfVlhSX0xPVyAqLwotCQkiCWp6CTEwZlxuIgkJLyogLT4gS0VSTkVMX1ZYUl9ISUdIICovCi0JCSIJam8JMmZcbiIJCS8qIDExIC0+IGxvYWQgVjAuLlYxNSAqLwotCQkiCWJyYwk0LDNmXG4iCQkvKiAwMSAtPiBsb2FkIFYwLi5WNyAgKi8KLQkJIglicmMJMiw0ZlxuIgkJLyogMTAgLT4gbG9hZCBWOC4uVjE1ICovCi0KLQkJLyogVGVzdCBhbmQgbG9hZCB0aGUgc2Vjb25kIGhhbGYgb2YgMTYgdmVjdG9yIHJlZ2lzdGVycyAqLwotCQkiMTA6CXRtbGwJJVttXSwxMlxuIgkvKiBLRVJORUxfVlhSX0hJR0ggKi8KLQkJIglqbwkxOWZcbiIJCS8qIDExIC0+IGxvYWQgVjE2Li5WMzEgKi8KLQkJIglicmMJNCwxMWZcbiIJLyogMDEgLT4gbG9hZCBWMTYuLlYyMwkqLwotCQkiCWJyYwkyLDEyZlxuIgkvKiAxMCAtPiBsb2FkIFYyNC4uVjMxICovCi0JCSIJagkyMGZcbiIJCS8qIDAwIC0+IGRvbmUgKi8KLQotCQkvKgotCQkgKiBCZWxvdyBhcmUgdGhlIHZzdG0gY29tYmluYXRpb25zIHRvIGxvYWQgbXVsdGlwbGUgdmVjdG9yCi0JCSAqIHJlZ2lzdGVycyBhdCBvbmNlLgotCQkgKi8KLQkJIjI6CS53b3JkCTB4ZTcwZiwweDEwMDAsMHgwMDM2XG4iCS8qIHZsbSAwLDE1LDAoMSkgKi8KLQkJIglqCTEwYlxuIgkJCS8qIC0+IFZYUl9ISUdIICovCi0JCSIzOgkud29yZAkweGU3MDcsMHgxMDAwLDB4MDAzNlxuIiAvKiB2bG0gMCw3LDAoMSkgKi8KLQkJIglqCTEwYlxuIgkJCS8qIC0+IFZYUl9ISUdIICovCi0JCSI0Ogkud29yZAkweGU3OGYsMHgxMDgwLDB4MDAzNlxuIiAvKiB2bG0gOCwxNSwxMjgoMSkgKi8KLQkJIglqCTEwYlxuIgkJCS8qIC0+IFZYUl9ISUdIICovCi0JCSJcbiIKLQkJIjExOgkud29yZAkweGU3MDcsMHgxMTAwLDB4MGMzNlxuIgkvKiB2bG0gMTYsMjMsMjU2KDEpICovCi0JCSIJagkyMGZcbiIJCQkvKiAtPiBkb25lICovCi0JCSIxMjoJLndvcmQJMHhlNzhmLDB4MTE4MCwweDBjMzZcbiIgLyogdmxtIDI0LDMxLDM4NCgxKSAqLwotCQkiCWoJMjBmXG4iCQkJLyogLT4gZG9uZSAqLwotCQkiXG4iCi0JCSIxNzoJLndvcmQJMHhlNzg3LDB4MTA4MCwweDA0MzZcbiIJLyogdmxtIDgsMjMsMTI4KDEpICovCi0JCSIJbmlsbAklW21dLDI0OVxuIgkJLyogbSAmPSB+VlhSX01JRCAgICAqLwotCQkiCWoJMWJcbiIJCQkvKiAtPiBWWFJfTE9XICovCi0JCSJcbiIKLQkJIjE4Ogkud29yZAkweGU3MGYsMHgxMDAwLDB4MDAzNlxuIgkvKiB2bG0gMCwxNSwwKDEpICovCi0JCSIxOToJLndvcmQJMHhlNzBmLDB4MTEwMCwweDBjMzZcbiIJLyogdmxtIDE2LDMxLDI1NigxKSAqLwotCQkiMjA6IgotCQk6Ci0JCTogW3Z4cnNdICJRIiAoKihzdHJ1Y3QgdnhfYXJyYXkgKikgJnN0YXRlLT52eHJzKSwKLQkJICBbbV0gImQiIChzdGF0ZS0+bWFzaykKKwkJIgljaGkJJVttXSwxMlxuIgkvKiBLRVJORUxfVlhSX01JRCAqLworCQkiCWpuZQkwZlxuIgkJLyogLT4gcmVzdG9yZSBWOC4uVjIzICovCisJCSIJVkxNCTgsMjMsMTI4LDFcbiIJLyogdmxtICV2OCwldjIzLDEyOCglcjEpICovCisJCSIJagk3ZlxuIgorCQkvKiBUZXN0IGFuZCByZXN0b3JlIHRoZSBmaXJzdCBoYWxmIG9mIDE2IHZlY3RvciByZWdpc3RlcnMgKi8KKwkJIjA6CXRtbGwJJVttXSw2XG4iCS8qIEtFUk5FTF9WWFJfTE9XICovCisJCSIJanoJM2ZcbiIJCS8qIC0+IEtFUk5FTF9WWFJfSElHSCAqLworCQkiCWpvCTJmXG4iCQkvKiAxMSAtPiByZXN0b3JlIFYwLi5WMTUgKi8KKwkJIglicmMJMiwxZlxuIgkJLyogMTAgLT4gcmVzdG9yZSBWOC4uVjE1ICovCisJCSIJVkxNCTAsNywwLDFcbiIJLyogdmxtICV2MCwldjcsMCglcjEpICovCisJCSIJagkzZlxuIgorCQkiMToJVkxNCTgsMTUsMTI4LDFcbiIJLyogdmxtICV2OCwldjE1LDEyOCglcjEpICovCisJCSIJagkzZlxuIgorCQkiMjoJVkxNCTAsMTUsMCwxXG4iCS8qIHZsbSAldjAsJXYxNSwwKCVyMSkgKi8KKwkJLyogVGVzdCBhbmQgcmVzdG9yZSB0aGUgc2Vjb25kIGhhbGYgb2YgMTYgdmVjdG9yIHJlZ2lzdGVycyAqLworCQkiMzoJdG1sbAklW21dLDI0XG4iCS8qIEtFUk5FTF9WWFJfSElHSCAqLworCQkiCWp6CTdmXG4iCisJCSIJam8JNmZcbiIJCS8qIDExIC0+IHJlc3RvcmUgVjE2Li5WMzEgKi8KKwkJIglicmMJMiw0ZlxuIgkJLyogMTAgLT4gcmVzdG9yZSBWMjQuLlYzMSAqLworCQkiCVZMTQkxNiwyMywyNTYsMVxuIgkvKiB2bG0gJXYxNiwldjIzLDI1NiglcjEpICovCisJCSIJagk3ZlxuIgorCQkiNDoJVkxNCTI0LDMxLDM4NCwxXG4iCS8qIHZsbSAldjI0LCV2MzEsMzg0KCVyMSkgKi8KKwkJIglqCTdmXG4iCisJCSI1OglWTE0JMCwxNSwwLDFcbiIJLyogdmxtICV2MCwldjE1LDAoJXIxKSAqLworCQkiNjoJVkxNCTE2LDMxLDI1NiwxXG4iCS8qIHZsbSAldjE2LCV2MzEsMjU2KCVyMSkgKi8KKwkJIjc6IgorCQk6IFt2eHJzXSAiPVEiICgqKHN0cnVjdCB2eF9hcnJheSAqKSAmc3RhdGUtPnZ4cnMpCisJCTogW21dICJkIiAoZmxhZ3MpCiAJCTogIjEiLCAiY2MiKTsKLQotdXBkYXRlX2ZwdV9zdGF0ZToKLQkvKiBVcGRhdGUgY3VycmVudCBrZXJuZWwgVlggc3RhdGUgKi8KLQlfX3RoaXNfY3B1X3dyaXRlKGtlcm5lbF9mcHVfc3RhdGUsIHN0YXRlLT5tYXNrKTsKIH0KIEVYUE9SVF9TWU1CT0woX19rZXJuZWxfZnB1X2VuZCk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2Z0cmFjZS5jIGIvYXJjaC9zMzkwL2tlcm5lbC9mdHJhY2UuYwppbmRleCAwZjdiZmViLi42MGE4YTRlIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2Z0cmFjZS5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvZnRyYWNlLmMKQEAgLTIwOSw3ICsyMDksOCBAQAogCS8qIE9ubHkgdHJhY2UgaWYgdGhlIGNhbGxpbmcgZnVuY3Rpb24gZXhwZWN0cyB0by4gKi8KIAlpZiAoIWZ0cmFjZV9ncmFwaF9lbnRyeSgmdHJhY2UpKQogCQlnb3RvIG91dDsKLQlpZiAoZnRyYWNlX3B1c2hfcmV0dXJuX3RyYWNlKHBhcmVudCwgaXAsICZ0cmFjZS5kZXB0aCwgMCkgPT0gLUVCVVNZKQorCWlmIChmdHJhY2VfcHVzaF9yZXR1cm5fdHJhY2UocGFyZW50LCBpcCwgJnRyYWNlLmRlcHRoLCAwLAorCQkJCSAgICAgTlVMTCkgPT0gLUVCVVNZKQogCQlnb3RvIG91dDsKIAlwYXJlbnQgPSAodW5zaWduZWQgbG9uZykgcmV0dXJuX3RvX2hhbmRsZXI7CiBvdXQ6CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2hlYWQuUyBiL2FyY2gvczM5MC9rZXJuZWwvaGVhZC5TCmluZGV4IDU2ZTRkODIuLjQ0MzE5MDUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvaGVhZC5TCkBAIC0zMDksNyArMzA5LDkgQEAKIAlsCSVyMTUsLkxzdGFjay0uTFBHMCglcjEzKQogCWFoaQklcjE1LC1TVEFDS19GUkFNRV9PVkVSSEVBRAogCWJyYXNsCSVyMTQsdmVyaWZ5X2ZhY2lsaXRpZXMKLQkvKiBDb250aW51ZSB3aXRoIHN0YXJ0dXAgY29kZSBpbiBoZWFkNjQuUyAqLworIyBGb3IgdW5jb21wcmVzc2VkIGltYWdlcywgY29udGludWUgaW4KKyMgYXJjaC9zMzkwL2tlcm5lbC9oZWFkNjQuUy4gRm9yIGNvbXByZXNzZWQgaW1hZ2VzLCBjb250aW51ZSBpbgorIyBhcmNoL3MzOTAvYm9vdC9jb21wcmVzc2VkL2hlYWQuUy4KIAlqZwlzdGFydHVwX2NvbnRpbnVlCiAKIC5Mc3RhY2s6CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2twcm9iZXMuYyBiL2FyY2gvczM5MC9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IGRkNjMwNmMuLmZkYjQwNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwva3Byb2Jlcy5jCkBAIC0yNiwxMiArMjYsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9zdG9wX21hY2hpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvZXh0YWJsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9kaXMuaD4KIAogREVGSU5FX1BFUl9DUFUoc3RydWN0IGtwcm9iZSAqLCBjdXJyZW50X2twcm9iZSk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL25taS5jIGIvYXJjaC9zMzkwL2tlcm5lbC9ubWkuYwppbmRleCAyOTM3NmYwLi45YTMyZjc0IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL25taS5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvbm1pLmMKQEAgLTk4LDcgKzk4LDcgQEAKICAqIHJldHVybnMgMCBpZiBhbGwgcmVnaXN0ZXJzIGNvdWxkIGJlIHZhbGlkYXRlZAogICogcmV0dXJucyAxIG90aGVyd2lzZQogICovCi1zdGF0aWMgaW50IG5vdHJhY2UgczM5MF92YWxpZGF0ZV9yZWdpc3RlcnModW5pb24gbWNpIG1jaSkKK3N0YXRpYyBpbnQgbm90cmFjZSBzMzkwX3ZhbGlkYXRlX3JlZ2lzdGVycyh1bmlvbiBtY2kgbWNpLCBpbnQgdW1vZGUpCiB7CiAJaW50IGtpbGxfdGFzazsKIAl1NjQgemVybzsKQEAgLTExMCwyNiArMTEwLDQxIEBACiAJaWYgKCFtY2kuZ3IpIHsKIAkJLyoKIAkJICogR2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyBjb3VsZG4ndCBiZSByZXN0b3JlZCBhbmQgaGF2ZQotCQkgKiB1bmtub3duIGNvbnRlbnRzLiBQcm9jZXNzIG5lZWRzIHRvIGJlIHRlcm1pbmF0ZWQuCisJCSAqIHVua25vd24gY29udGVudHMuIFN0b3Agc3lzdGVtIG9yIHRlcm1pbmF0ZSBwcm9jZXNzLgogCQkgKi8KKwkJaWYgKCF1bW9kZSkKKwkJCXMzOTBfaGFuZGxlX2RhbWFnZSgpOwogCQlraWxsX3Rhc2sgPSAxOwogCX0KIAlpZiAoIW1jaS5mcCkgewogCQkvKgotCQkgKiBGbG9hdGluZyBwb2ludCByZWdpc3RlcnMgY2FuJ3QgYmUgcmVzdG9yZWQgYW5kCi0JCSAqIHRoZXJlZm9yZSB0aGUgcHJvY2VzcyBuZWVkcyB0byBiZSB0ZXJtaW5hdGVkLgorCQkgKiBGbG9hdGluZyBwb2ludCByZWdpc3RlcnMgY2FuJ3QgYmUgcmVzdG9yZWQuIElmIHRoZQorCQkgKiBrZXJuZWwgY3VycmVudGx5IHVzZXMgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIHRoZQorCQkgKiBzeXN0ZW0gaXMgc3RvcHBlZC4gSWYgdGhlIHByb2Nlc3MgaGFzIGl0cyBmbG9hdGluZworCQkgKiBwb2ludGVyIHJlZ2lzdGVycyBsb2FkZWQgaXQgaXMgdGVybWluYXRlZC4KKwkJICogT3RoZXJ3aXNlIGp1c3QgcmV2YWxpZGF0ZSB0aGUgcmVnaXN0ZXJzLgogCQkgKi8KLQkJa2lsbF90YXNrID0gMTsKKwkJaWYgKFMzOTBfbG93Y29yZS5mcHVfZmxhZ3MgJiBLRVJORUxfVlhSX1YwVjcpCisJCQlzMzkwX2hhbmRsZV9kYW1hZ2UoKTsKKwkJaWYgKCF0ZXN0X2NwdV9mbGFnKENJRl9GUFUpKQorCQkJa2lsbF90YXNrID0gMTsKIAl9CiAJZnB0X3NhdmVfYXJlYSA9ICZTMzkwX2xvd2NvcmUuZmxvYXRpbmdfcHRfc2F2ZV9hcmVhOwogCWZwdF9jcmVnX3NhdmVfYXJlYSA9ICZTMzkwX2xvd2NvcmUuZnB0X2NyZWdfc2F2ZV9hcmVhOwogCWlmICghbWNpLmZjKSB7CiAJCS8qCiAJCSAqIEZsb2F0aW5nIHBvaW50IGNvbnRyb2wgcmVnaXN0ZXIgY2FuJ3QgYmUgcmVzdG9yZWQuCi0JCSAqIFRhc2sgd2lsbCBiZSB0ZXJtaW5hdGVkLgorCQkgKiBJZiB0aGUga2VybmVsIGN1cnJlbnRseSB1c2VzIHRoZSBmbG9hdGluZyBwb2ludGVyCisJCSAqIHJlZ2lzdGVycyBhbmQgbmVlZHMgdGhlIEZQQyByZWdpc3RlciB0aGUgc3lzdGVtIGlzCisJCSAqIHN0b3BwZWQuIElmIHRoZSBwcm9jZXNzIGhhcyBpdHMgZmxvYXRpbmcgcG9pbnRlcgorCQkgKiByZWdpc3RlcnMgbG9hZGVkIGl0IGlzIHRlcm1pbmF0ZWQuIE90aGVyd2llc2UgdGhlCisJCSAqIEZQQyBpcyBqdXN0IHJldmFsaWRhdGVkLgogCQkgKi8KKwkJaWYgKFMzOTBfbG93Y29yZS5mcHVfZmxhZ3MgJiBLRVJORUxfRlBDKQorCQkJczM5MF9oYW5kbGVfZGFtYWdlKCk7CiAJCWFzbSB2b2xhdGlsZSgibGZwYyAwKCUwKSIgOiA6ICJhIiAoJnplcm8pLCAibSIgKHplcm8pKTsKLQkJa2lsbF90YXNrID0gMTsKKwkJaWYgKCF0ZXN0X2NwdV9mbGFnKENJRl9GUFUpKQorCQkJa2lsbF90YXNrID0gMTsKIAl9IGVsc2UKIAkJYXNtIHZvbGF0aWxlKCJsZnBjIDAoJTApIiA6IDogImEiIChmcHRfY3JlZ19zYXZlX2FyZWEpKTsKIApAQCAtMTU5LDEwICsxNzQsMTYgQEAKIAogCQlpZiAoIW1jaS52cikgewogCQkJLyoKLQkJCSAqIFZlY3RvciByZWdpc3RlcnMgY2FuJ3QgYmUgcmVzdG9yZWQgYW5kIHRoZXJlZm9yZQotCQkJICogdGhlIHByb2Nlc3MgbmVlZHMgdG8gYmUgdGVybWluYXRlZC4KKwkJCSAqIFZlY3RvciByZWdpc3RlcnMgY2FuJ3QgYmUgcmVzdG9yZWQuIElmIHRoZSBrZXJuZWwKKwkJCSAqIGN1cnJlbnRseSB1c2VzIHZlY3RvciByZWdpc3RlcnMgdGhlIHN5c3RlbSBpcworCQkJICogc3RvcHBlZC4gSWYgdGhlIHByb2Nlc3MgaGFzIGl0cyB2ZWN0b3IgcmVnaXN0ZXJzCisJCQkgKiBsb2FkZWQgaXQgaXMgdGVybWluYXRlZC4gT3RoZXJ3aXNlIGp1c3QgcmV2YWxpZGF0ZQorCQkJICogdGhlIHJlZ2lzdGVycy4KIAkJCSAqLwotCQkJa2lsbF90YXNrID0gMTsKKwkJCWlmIChTMzkwX2xvd2NvcmUuZnB1X2ZsYWdzICYgS0VSTkVMX1ZYUikKKwkJCQlzMzkwX2hhbmRsZV9kYW1hZ2UoKTsKKwkJCWlmICghdGVzdF9jcHVfZmxhZyhDSUZfRlBVKSkKKwkJCQlraWxsX3Rhc2sgPSAxOwogCQl9CiAJCWNyMC52YWwgPSBTMzkwX2xvd2NvcmUuY3JlZ3Nfc2F2ZV9hcmVhWzBdOwogCQljcjAuYWZwID0gY3IwLnZ4ID0gMTsKQEAgLTI1MCwxMyArMjcxLDExIEBACiAJc3RydWN0IG1jY2tfc3RydWN0ICptY2NrOwogCXVuc2lnbmVkIGxvbmcgbG9uZyB0bXA7CiAJdW5pb24gbWNpIG1jaTsKLQlpbnQgdW1vZGU7CiAKIAlubWlfZW50ZXIoKTsKIAlpbmNfaXJxX3N0YXQoTk1JX05NSSk7CiAJbWNpLnZhbCA9IFMzOTBfbG93Y29yZS5tY2NrX2ludGVycnVwdGlvbl9jb2RlOwogCW1jY2sgPSB0aGlzX2NwdV9wdHIoJmNwdV9tY2NrKTsKLQl1bW9kZSA9IHVzZXJfbW9kZShyZWdzKTsKIAogCWlmIChtY2kuc2QpIHsKIAkJLyogU3lzdGVtIGRhbWFnZSAtPiBzdG9wcGluZyBtYWNoaW5lICovCkBAIC0yOTcsMjIgKzMxNiwxNCBAQAogCQkJczM5MF9oYW5kbGVfZGFtYWdlKCk7CiAJCX0KIAl9Ci0JaWYgKHMzOTBfdmFsaWRhdGVfcmVnaXN0ZXJzKG1jaSkpIHsKLQkJaWYgKHVtb2RlKSB7Ci0JCQkvKgotCQkJICogQ291bGRuJ3QgcmVzdG9yZSBhbGwgcmVnaXN0ZXIgY29udGVudHMgd2hpbGUgaW4KLQkJCSAqIHVzZXIgbW9kZSAtPiBtYXJrIHRhc2sgZm9yIHRlcm1pbmF0aW9uLgotCQkJICovCi0JCQltY2NrLT5raWxsX3Rhc2sgPSAxOwotCQkJbWNjay0+bWNja19jb2RlID0gbWNpLnZhbDsKLQkJCXNldF9jcHVfZmxhZyhDSUZfTUNDS19QRU5ESU5HKTsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBDb3VsZG4ndCByZXN0b3JlIGFsbCByZWdpc3RlciBjb250ZW50cyB3aGlsZSBpbgotCQkJICoga2VybmVsIG1vZGUgLT4gc3RvcHBpbmcgbWFjaGluZS4KLQkJCSAqLwotCQkJczM5MF9oYW5kbGVfZGFtYWdlKCk7Ci0JCX0KKwlpZiAoczM5MF92YWxpZGF0ZV9yZWdpc3RlcnMobWNpLCB1c2VyX21vZGUocmVncykpKSB7CisJCS8qCisJCSAqIENvdWxkbid0IHJlc3RvcmUgYWxsIHJlZ2lzdGVyIGNvbnRlbnRzIGZvciB0aGUKKwkJICogdXNlciBzcGFjZSBwcm9jZXNzIC0+IG1hcmsgdGFzayBmb3IgdGVybWluYXRpb24uCisJCSAqLworCQltY2NrLT5raWxsX3Rhc2sgPSAxOworCQltY2NrLT5tY2NrX2NvZGUgPSBtY2kudmFsOworCQlzZXRfY3B1X2ZsYWcoQ0lGX01DQ0tfUEVORElORyk7CiAJfQogCWlmIChtY2kuY2QpIHsKIAkJLyogVGltaW5nIGZhY2lsaXR5IGRhbWFnZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jCmluZGV4IGJhNWY0NTYuLjdmN2JhNWYyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jCkBAIC0yMDQsMTEgKzIwNCw5IEBACiAjZW5kaWYKIAkJfQogCX0gZWxzZSBpZiAoTUFDSElORV9JU19LVk0pIHsKLQkJaWYgKHNjbHAuaGFzX3Z0MjIwICYmCi0JCSAgICBjb25maWdfZW5hYmxlZChDT05GSUdfU0NMUF9WVDIyMF9DT05TT0xFKSkKKwkJaWYgKHNjbHAuaGFzX3Z0MjIwICYmIElTX0VOQUJMRUQoQ09ORklHX1NDTFBfVlQyMjBfQ09OU09MRSkpCiAJCQlTRVRfQ09OU09MRV9WVDIyMDsKLQkJZWxzZSBpZiAoc2NscC5oYXNfbGluZW1vZGUgJiYKLQkJCSBjb25maWdfZW5hYmxlZChDT05GSUdfU0NMUF9DT05TT0xFKSkKKwkJZWxzZSBpZiAoc2NscC5oYXNfbGluZW1vZGUgJiYgSVNfRU5BQkxFRChDT05GSUdfU0NMUF9DT05TT0xFKSkKIAkJCVNFVF9DT05TT0xFX1NDTFA7CiAJCWVsc2UKIAkJCVNFVF9DT05TT0xFX0hWQzsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc3lzaW5mby5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zeXNpbmZvLmMKaW5kZXggMDUwYjhkMC4uYmZkYTZhYSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zeXNpbmZvLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zeXNpbmZvLmMKQEAgLTQ1NCw3ICs0NTQsNyBAQAogCQkJOiAiUSIgKGluZm8tPmNhcGFiaWxpdHkpLCAiZCIgKDEwMDAwMDAwKSwgImQiICgwKQogCQkJOiAiY2MiCiAJCQkpOwotCQlrZXJuZWxfZnB1X2VuZCgmZnB1KTsKKwkJa2VybmVsX2ZwdV9lbmQoJmZwdSwgS0VSTkVMX0ZQUik7CiAJfSBlbHNlCiAJCS8qCiAJCSAqIFJlYWxseSBvbGQgbWFjaGluZSB3aXRob3V0IHN0c2kgYmxvY2sgZm9yIGJhc2ljCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3RpbWUuYyBiL2FyY2gvczM5MC9rZXJuZWwvdGltZS5jCmluZGV4IDRlOTk0OTguLjBiZmNjNDkgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdGltZS5jCkBAIC01MCwxMCArNTAsNiBAQAogI2luY2x1ZGUgPGFzbS9jaW8uaD4KICNpbmNsdWRlICJlbnRyeS5oIgogCi0vKiBjaGFuZ2UgdGhpcyBpZiB5b3UgaGF2ZSBzb21lIGNvbnN0YW50IHRpbWUgZHJpZnQgKi8KLSNkZWZpbmUgVVNFQ1NfUEVSX0pJRkZZICAgICAoKHVuc2lnbmVkIGxvbmcpIDEwMDAwMDAvSFopCi0jZGVmaW5lIENMS19USUNLU19QRVJfSklGRlkgKCh1bnNpZ25lZCBsb25nKSBVU0VDU19QRVJfSklGRlkgPDwgMTIpCi0KIHU2NCBzY2hlZF9jbG9ja19iYXNlX2NjID0gLTE7CS8qIEZvcmNlIHRvIGRhdGEgc2VjdGlvbi4gKi8KIEVYUE9SVF9TWU1CT0xfR1BMKHNjaGVkX2Nsb2NrX2Jhc2VfY2MpOwogCkBAIC0yODIsMTMgKzI3OCw4IEBACiAKIHZvaWQgdXBkYXRlX3ZzeXNjYWxsX3R6KHZvaWQpCiB7Ci0JLyogTWFrZSB1c2Vyc3BhY2UgZ2V0dGltZW9mZGF5IHNwaW4gdW50aWwgd2UncmUgZG9uZS4gKi8KLQkrK3Zkc29fZGF0YS0+dGJfdXBkYXRlX2NvdW50OwotCXNtcF93bWIoKTsKIAl2ZHNvX2RhdGEtPnR6X21pbnV0ZXN3ZXN0ID0gc3lzX3R6LnR6X21pbnV0ZXN3ZXN0OwogCXZkc29fZGF0YS0+dHpfZHN0dGltZSA9IHN5c190ei50el9kc3R0aW1lOwotCXNtcF93bWIoKTsKLQkrK3Zkc29fZGF0YS0+dGJfdXBkYXRlX2NvdW50OwogfQogCiAvKgpAQCAtMzE4LDUxICszMDksMTIgQEAKIAl2dGltZV9pbml0KCk7CiB9CiAKLS8qCi0gKiBUaGUgdGltZSBpcyAiY2xvY2siLiBvbGQgaXMgd2hhdCB3ZSB0aGluayB0aGUgdGltZSBpcy4KLSAqIEFkanVzdCB0aGUgdmFsdWUgYnkgYSBtdWx0aXBsZSBvZiBqaWZmaWVzIGFuZCBhZGQgdGhlIGRlbHRhIHRvIG50cC4KLSAqICJkZWxheSIgaXMgYW4gYXBwcm94aW1hdGlvbiBob3cgbG9uZyB0aGUgc3luY2hyb25pemF0aW9uIHRvb2suIElmCi0gKiB0aGUgdGltZSBjb3JyZWN0aW9uIGlzIHBvc2l0aXZlLCB0aGVuICJkZWxheSIgaXMgc3VidHJhY3RlZCBmcm9tCi0gKiB0aGUgdGltZSBkaWZmZXJlbmNlIGFuZCBvbmx5IHRoZSByZW1haW5pbmcgcGFydCBpcyBwYXNzZWQgdG8gbnRwLgotICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGFkanVzdF90aW1lKHVuc2lnbmVkIGxvbmcgbG9uZyBvbGQsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGNsb2NrLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBkZWxheSkKLXsKLQl1bnNpZ25lZCBsb25nIGxvbmcgZGVsdGEsIHRpY2tzOwotCXN0cnVjdCB0aW1leCBhZGp1c3Q7Ci0KLQlpZiAoY2xvY2sgPiBvbGQpIHsKLQkJLyogSXQgaXMgbGF0ZXIgdGhhbiB3ZSB0aG91Z2h0LiAqLwotCQlkZWx0YSA9IHRpY2tzID0gY2xvY2sgLSBvbGQ7Ci0JCWRlbHRhID0gdGlja3MgPSAoZGVsdGEgPCBkZWxheSkgPyAwIDogZGVsdGEgLSBkZWxheTsKLQkJZGVsdGEgLT0gZG9fZGl2KHRpY2tzLCBDTEtfVElDS1NfUEVSX0pJRkZZKTsKLQkJYWRqdXN0Lm9mZnNldCA9IHRpY2tzICogKDEwMDAwMDAgLyBIWik7Ci0JfSBlbHNlIHsKLQkJLyogSXQgaXMgZWFybGllciB0aGFuIHdlIHRob3VnaHQuICovCi0JCWRlbHRhID0gdGlja3MgPSBvbGQgLSBjbG9jazsKLQkJZGVsdGEgLT0gZG9fZGl2KHRpY2tzLCBDTEtfVElDS1NfUEVSX0pJRkZZKTsKLQkJZGVsdGEgPSAtZGVsdGE7Ci0JCWFkanVzdC5vZmZzZXQgPSAtdGlja3MgKiAoMTAwMDAwMCAvIEhaKTsKLQl9Ci0Jc2NoZWRfY2xvY2tfYmFzZV9jYyArPSBkZWx0YTsKLQlpZiAoYWRqdXN0Lm9mZnNldCAhPSAwKSB7Ci0JCXByX25vdGljZSgiVGhlIEVUUiBpbnRlcmZhY2UgaGFzIGFkanVzdGVkIHRoZSBjbG9jayAiCi0JCQkgICJieSAlbGkgbWljcm9zZWNvbmRzXG4iLCBhZGp1c3Qub2Zmc2V0KTsKLQkJYWRqdXN0Lm1vZGVzID0gQURKX09GRlNFVF9TSU5HTEVTSE9UOwotCQlkb19hZGp0aW1leCgmYWRqdXN0KTsKLQl9Ci0JcmV0dXJuIGRlbHRhOwotfQotCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoYXRvbWljX3QsIGNsb2NrX3N5bmNfd29yZCk7CiBzdGF0aWMgREVGSU5FX01VVEVYKGNsb2NrX3N5bmNfbXV0ZXgpOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xvY2tfc3luY19mbGFnczsKIAotI2RlZmluZSBDTE9DS19TWU5DX0hBU19FVFIJMAotI2RlZmluZSBDTE9DS19TWU5DX0hBU19TVFAJMQotI2RlZmluZSBDTE9DS19TWU5DX0VUUgkJMgotI2RlZmluZSBDTE9DS19TWU5DX1NUUAkJMworI2RlZmluZSBDTE9DS19TWU5DX0hBU19TVFAJMAorI2RlZmluZSBDTE9DS19TWU5DX1NUUAkJMQogCiAvKgogICogVGhlIGdldF9jbG9jayBmdW5jdGlvbiBmb3IgdGhlIHBoeXNpY2FsIGNsb2NrLiBJdCB3aWxsIGdldCB0aGUgY3VycmVudApAQCAtMzg0LDM0ICszMzYsMzIgQEAKIAlpZiAoc3cwID09IHN3MSAmJiAoc3cwICYgMHg4MDAwMDAwMFUpKQogCQkvKiBTdWNjZXNzOiB0aW1lIGlzIGluIHN5bmMuICovCiAJCXJldHVybiAwOwotCWlmICghdGVzdF9iaXQoQ0xPQ0tfU1lOQ19IQVNfRVRSLCAmY2xvY2tfc3luY19mbGFncykgJiYKLQkgICAgIXRlc3RfYml0KENMT0NLX1NZTkNfSEFTX1NUUCwgJmNsb2NrX3N5bmNfZmxhZ3MpKQorCWlmICghdGVzdF9iaXQoQ0xPQ0tfU1lOQ19IQVNfU1RQLCAmY2xvY2tfc3luY19mbGFncykpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKLQlpZiAoIXRlc3RfYml0KENMT0NLX1NZTkNfRVRSLCAmY2xvY2tfc3luY19mbGFncykgJiYKLQkgICAgIXRlc3RfYml0KENMT0NLX1NZTkNfU1RQLCAmY2xvY2tfc3luY19mbGFncykpCisJaWYgKCF0ZXN0X2JpdChDTE9DS19TWU5DX1NUUCwgJmNsb2NrX3N5bmNfZmxhZ3MpKQogCQlyZXR1cm4gLUVBQ0NFUzsKIAlyZXR1cm4gLUVBR0FJTjsKIH0KIEVYUE9SVF9TWU1CT0woZ2V0X3BoeXNfY2xvY2spOwogCiAvKgotICogTWFrZSBnZXRfc3luY19jbG9jayByZXR1cm4gLUVBR0FJTi4KKyAqIE1ha2UgZ2V0X3BoeXNfY2xvY2soKSByZXR1cm4gLUVBR0FJTi4KICAqLwogc3RhdGljIHZvaWQgZGlzYWJsZV9zeW5jX2Nsb2NrKHZvaWQgKmR1bW15KQogewogCWF0b21pY190ICpzd19wdHIgPSB0aGlzX2NwdV9wdHIoJmNsb2NrX3N5bmNfd29yZCk7CiAJLyoKLQkgKiBDbGVhciB0aGUgaW4tc3luYyBiaXQgMl4zMS4gQWxsIGdldF9zeW5jX2Nsb2NrIGNhbGxzIHdpbGwKKwkgKiBDbGVhciB0aGUgaW4tc3luYyBiaXQgMl4zMS4gQWxsIGdldF9waHlzX2Nsb2NrIGNhbGxzIHdpbGwKIAkgKiBmYWlsIHVudGlsIHRoZSBzeW5jIGJpdCBpcyB0dXJuZWQgYmFjayBvbi4gSW4gYWRkaXRpb24KIAkgKiBpbmNyZWFzZSB0aGUgInNlcXVlbmNlIiBjb3VudGVyIHRvIGF2b2lkIHRoZSByYWNlIG9mIGFuCi0JICogZXRyIGV2ZW50IGFuZCB0aGUgY29tcGxldGUgcmVjb3ZlcnkgYWdhaW5zdCBnZXRfc3luY19jbG9jay4KKwkgKiBzdHAgZXZlbnQgYW5kIHRoZSBjb21wbGV0ZSByZWNvdmVyeSBhZ2FpbnN0IGdldF9waHlzX2Nsb2NrLgogCSAqLwogCWF0b21pY19hbmRub3QoMHg4MDAwMDAwMCwgc3dfcHRyKTsKIAlhdG9taWNfaW5jKHN3X3B0cik7CiB9CiAKIC8qCi0gKiBNYWtlIGdldF9zeW5jX2Nsb2NrIHJldHVybiAwIGFnYWluLgorICogTWFrZSBnZXRfcGh5c19jbG9jaygpIHJldHVybiAwIGFnYWluLgogICogTmVlZHMgdG8gYmUgY2FsbGVkIGZyb20gYSBjb250ZXh0IGRpc2FibGVkIGZvciBwcmVlbXB0aW9uLgogICovCiBzdGF0aWMgdm9pZCBlbmFibGVfc3luY19jbG9jayh2b2lkKQpAQCAtNDM0LDcgKzM4NCw3IEBACiAJcmV0dXJuIHJjOwogfQogCi0vKiBTaW5nbGUgdGhyZWFkZWQgd29ya3F1ZXVlIHVzZWQgZm9yIGV0ciBhbmQgc3RwIHN5bmMgZXZlbnRzICovCisvKiBTaW5nbGUgdGhyZWFkZWQgd29ya3F1ZXVlIHVzZWQgZm9yIHN0cCBzeW5jIGV2ZW50cyAqLwogc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp0aW1lX3N5bmNfd3E7CiAKIHN0YXRpYyB2b2lkIF9faW5pdCB0aW1lX2luaXRfd3Eodm9pZCkKQEAgLTQ0OCwyMCArMzk4LDEyIEBACiAJYXRvbWljX3QgY3B1czsKIAlpbnQgaW5fc3luYzsKIAl1bnNpZ25lZCBsb25nIGxvbmcgZml4dXBfY2M7Ci0JaW50IGV0cl9wb3J0OwotCXN0cnVjdCBldHJfYWliICpldHJfYWliOwogfTsKIAogc3RhdGljIHZvaWQgY2xvY2tfc3luY19jcHUoc3RydWN0IGNsb2NrX3N5bmNfZGF0YSAqc3luYykKIHsKIAlhdG9taWNfZGVjKCZzeW5jLT5jcHVzKTsKIAllbmFibGVfc3luY19jbG9jaygpOwotCS8qCi0JICogVGhpcyBsb29rcyBsaWtlIGEgYnVzeSB3YWl0IGxvb3AgYnV0IGl0IGlzbid0LiBldHJfc3luY19jcHVzCi0JICogaXMgY2FsbGVkIG9uIGFsbCBvdGhlciBjcHVzIHdoaWxlIHRoZSBUT0QgY2xvY2tzIGlzIHN0b3BwZWQuCi0JICogX191ZGVsYXkgd2lsbCBzdG9wIHRoZSBjcHUgb24gYW4gZW5hYmxlZCB3YWl0IHBzdyB1bnRpbCB0aGUKLQkgKiBUT0QgaXMgcnVubmluZyBhZ2Fpbi4KLQkgKi8KIAl3aGlsZSAoc3luYy0+aW5fc3luYyA9PSAwKSB7CiAJCV9fdWRlbGF5KDEpOwogCQkvKgpAQCAtNTgyLDcgKzUyNCw3IEBACiBzdGF0aWMgaW50IHN0cF9zeW5jX2Nsb2NrKHZvaWQgKmRhdGEpCiB7CiAJc3RhdGljIGludCBmaXJzdDsKLQl1bnNpZ25lZCBsb25nIGxvbmcgb2xkX2Nsb2NrLCBkZWx0YSwgbmV3X2Nsb2NrLCBjbG9ja19kZWx0YTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgY2xvY2tfZGVsdGE7CiAJc3RydWN0IGNsb2NrX3N5bmNfZGF0YSAqc3RwX3N5bmM7CiAJc3RydWN0IHB0ZmZfcXRvIHF0bzsKIAlpbnQgcmM7CkBAIC02MDUsMTggKzU0NywxOCBAQAogCWlmIChzdHBfaW5mby50b2RvZmZbMF0gfHwgc3RwX2luZm8udG9kb2ZmWzFdIHx8CiAJICAgIHN0cF9pbmZvLnRvZG9mZlsyXSB8fCBzdHBfaW5mby50b2RvZmZbM10gfHwKIAkgICAgc3RwX2luZm8udG1kICE9IDIpIHsKLQkJb2xkX2Nsb2NrID0gZ2V0X3RvZF9jbG9jaygpOwogCQlyYyA9IGNoc2Nfc3N0cGMoc3RwX3BhZ2UsIFNUUF9PUF9TWU5DLCAwLCAmY2xvY2tfZGVsdGEpOwogCQlpZiAocmMgPT0gMCkgewotCQkJbmV3X2Nsb2NrID0gb2xkX2Nsb2NrICsgY2xvY2tfZGVsdGE7Ci0JCQlkZWx0YSA9IGFkanVzdF90aW1lKG9sZF9jbG9jaywgbmV3X2Nsb2NrLCAwKTsKKwkJCS8qIGZpeHVwIHRoZSBtb25vdG9uaWMgc2NoZWQgY2xvY2sgKi8KKwkJCXNjaGVkX2Nsb2NrX2Jhc2VfY2MgKz0gY2xvY2tfZGVsdGE7CiAJCQlpZiAocHRmZl9xdWVyeShQVEZGX1FUTykgJiYKIAkJCSAgICBwdGZmKCZxdG8sIHNpemVvZihxdG8pLCBQVEZGX1FUTykgPT0gMCkKIAkJCQkvKiBVcGRhdGUgTFBBUiBvZmZzZXQgKi8KIAkJCQlscGFyX29mZnNldCA9IHF0by50b2RfZXBvY2hfZGlmZmVyZW5jZTsKIAkJCWF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZzMzkwX2Vwb2NoX2RlbHRhX25vdGlmaWVyLAogCQkJCQkJICAgMCwgJmNsb2NrX2RlbHRhKTsKLQkJCWZpeHVwX2Nsb2NrX2NvbXBhcmF0b3IoZGVsdGEpOworCQkJc3RwX3N5bmMtPmZpeHVwX2NjID0gY2xvY2tfZGVsdGE7CisJCQlmaXh1cF9jbG9ja19jb21wYXJhdG9yKGNsb2NrX2RlbHRhKTsKIAkJCXJjID0gY2hzY19zc3RwaShzdHBfcGFnZSwgJnN0cF9pbmZvLAogCQkJCQlzaXplb2Yoc3RydWN0IHN0cF9zc3RwaSkpOwogCQkJaWYgKHJjID09IDAgJiYgc3RwX2luZm8udG1kICE9IDIpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3RyYXBzLmMgYi9hcmNoL3MzOTAva2VybmVsL3RyYXBzLmMKaW5kZXggZGQ5N2EzZS4uZDA1MzlmNyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYwpAQCAtMTQsMTEgKzE0LDEyIEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXh0YWJsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vZnB1L2FwaS5oPgogI2luY2x1ZGUgImVudHJ5LmgiCiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdmRzbzMyL01ha2VmaWxlIGIvYXJjaC9zMzkwL2tlcm5lbC92ZHNvMzIvTWFrZWZpbGUKaW5kZXggNjgxNDU0NS4uNmNjOTQ3OCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC92ZHNvMzIvTWFrZWZpbGUKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC92ZHNvMzIvTWFrZWZpbGUKQEAgLTI0LDggKzI0LDkgQEAKIGV4dHJhLXkgKz0gdmRzbzMyLmxkcwogQ1BQRkxBR1NfdmRzbzMyLmxkcyArPSAtUCAtQyAtVSQoQVJDSCkKIAotIyBEaXNhYmxlIGdjb3YgcHJvZmlsaW5nIGZvciBWRFNPIGNvZGUKKyMgRGlzYWJsZSBnY292IHByb2ZpbGluZyBhbmQgdWJzYW4gZm9yIFZEU08gY29kZQogR0NPVl9QUk9GSUxFIDo9IG4KK1VCU0FOX1NBTklUSVpFIDo9IG4KIAogIyBGb3JjZSBkZXBlbmRlbmN5IChpbmNiaW4gaXMgYmFkKQogJChvYmopL3Zkc28zMl93cmFwcGVyLm8gOiAkKG9iaikvdmRzbzMyLnNvCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3Zkc282NC9NYWtlZmlsZSBiL2FyY2gvczM5MC9rZXJuZWwvdmRzbzY0L01ha2VmaWxlCmluZGV4IDBiMGZkMjIuLjJkNTRjMTggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvdmRzbzY0L01ha2VmaWxlCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdmRzbzY0L01ha2VmaWxlCkBAIC0yNCw4ICsyNCw5IEBACiBleHRyYS15ICs9IHZkc282NC5sZHMKIENQUEZMQUdTX3Zkc282NC5sZHMgKz0gLVAgLUMgLVUkKEFSQ0gpCiAKLSMgRGlzYWJsZSBnY292IHByb2ZpbGluZyBmb3IgVkRTTyBjb2RlCisjIERpc2FibGUgZ2NvdiBwcm9maWxpbmcgYW5kIHVic2FuIGZvciBWRFNPIGNvZGUKIEdDT1ZfUFJPRklMRSA6PSBuCitVQlNBTl9TQU5JVElaRSA6PSBuCiAKICMgRm9yY2UgZGVwZW5kZW5jeSAoaW5jYmluIGlzIGJhZCkKICQob2JqKS92ZHNvNjRfd3JhcHBlci5vIDogJChvYmopL3Zkc282NC5zbwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9nYWNjZXNzLmMgYi9hcmNoL3MzOTAva3ZtL2dhY2Nlc3MuYwppbmRleCA1NDIwMDIwLi40YWE4YTdlIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva3ZtL2dhY2Nlc3MuYworKysgYi9hcmNoL3MzOTAva3ZtL2dhY2Nlc3MuYwpAQCAtNDk1LDYgKzQ5NSwxOCBAQAogCXRlYyA9IChzdHJ1Y3QgdHJhbnNfZXhjX2NvZGVfYml0cyAqKSZwZ20tPnRyYW5zX2V4Y19jb2RlOwogCiAJc3dpdGNoIChjb2RlKSB7CisJY2FzZSBQR01fUFJPVEVDVElPTjoKKwkJc3dpdGNoIChwcm90KSB7CisJCWNhc2UgUFJPVF9UWVBFX0FMQzoKKwkJCXRlYy0+YjYwID0gMTsKKwkJCS8qIEZBTEwgVEhST1VHSCAqLworCQljYXNlIFBST1RfVFlQRV9EQVQ6CisJCQl0ZWMtPmI2MSA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDogLyogTEEgYW5kIEtFWUMgc2V0IGI2MSB0byAwLCBvdGhlciBwYXJhbXMgdW5kZWZpbmVkICovCisJCQlyZXR1cm4gY29kZTsKKwkJfQorCQkvKiBGQUxMIFRIUk9VR0ggKi8KIAljYXNlIFBHTV9BU0NFX1RZUEU6CiAJY2FzZSBQR01fUEFHRV9UUkFOU0xBVElPTjoKIAljYXNlIFBHTV9SRUdJT05fRklSU1RfVFJBTlM6CkBAIC01MDQsOCArNTE2LDcgQEAKIAkJLyoKIAkJICogb3BfYWNjZXNzX2lkIG9ubHkgYXBwbGllcyB0byBNT1ZFX1BBR0UgLT4gc2V0IGJpdCA2MQogCQkgKiBleGNfYWNjZXNzX2lkIGhhcyB0byBiZSBzZXQgdG8gMCBmb3Igc29tZSBpbnN0cnVjdGlvbnMuIEJvdGgKLQkJICogY2FzZXMgaGF2ZSB0byBiZSBoYW5kbGVkIGJ5IHRoZSBjYWxsZXIuIFdlIGNhbiBhbHdheXMgc3RvcmUKLQkJICogZXhjX2FjY2Vzc19pZCwgYXMgaXQgaXMgdW5kZWZpbmVkIGZvciBub24tYXIgY2FzZXMuCisJCSAqIGNhc2VzIGhhdmUgdG8gYmUgaGFuZGxlZCBieSB0aGUgY2FsbGVyLgogCQkgKi8KIAkJdGVjLT5hZGRyID0gZ3ZhID4+IFBBR0VfU0hJRlQ7CiAJCXRlYy0+ZnNpID0gbW9kZSA9PSBHQUNDX1NUT1JFID8gRlNJX1NUT1JFIDogRlNJX0ZFVENIOwpAQCAtNTE2LDI1ICs1MjcsMTMgQEAKIAljYXNlIFBHTV9BU1RFX1ZBTElESVRZOgogCWNhc2UgUEdNX0FTVEVfU0VRVUVOQ0U6CiAJY2FzZSBQR01fRVhURU5ERURfQVVUSE9SSVRZOgorCQkvKgorCQkgKiBXZSBjYW4gYWx3YXlzIHN0b3JlIGV4Y19hY2Nlc3NfaWQsIGFzIGl0IGlzCisJCSAqIHVuZGVmaW5lZCBmb3Igbm9uLWFyIGNhc2VzLiBJdCBpcyB1bmRlZmluZWQgZm9yCisJCSAqIG1vc3QgREFUIHByb3RlY3Rpb24gZXhjZXB0aW9ucy4KKwkJICovCiAJCXBnbS0+ZXhjX2FjY2Vzc19pZCA9IGFyOwogCQlicmVhazsKLQljYXNlIFBHTV9QUk9URUNUSU9OOgotCQlzd2l0Y2ggKHByb3QpIHsKLQkJY2FzZSBQUk9UX1RZUEVfQUxDOgotCQkJdGVjLT5iNjAgPSAxOwotCQkJLyogRkFMTCBUSFJPVUdIICovCi0JCWNhc2UgUFJPVF9UWVBFX0RBVDoKLQkJCXRlYy0+YjYxID0gMTsKLQkJCXRlYy0+YWRkciA9IGd2YSA+PiBQQUdFX1NISUZUOwotCQkJdGVjLT5mc2kgPSBtb2RlID09IEdBQ0NfU1RPUkUgPyBGU0lfU1RPUkUgOiBGU0lfRkVUQ0g7Ci0JCQl0ZWMtPmFzID0gcHN3X2JpdHModmNwdS0+YXJjaC5zaWVfYmxvY2stPmdwc3cpLmFzOwotCQkJLyogZXhjX2FjY2Vzc19pZCBpcyB1bmRlZmluZWQgZm9yIG1vc3QgY2FzZXMgKi8KLQkJCXBnbS0+ZXhjX2FjY2Vzc19pZCA9IGFyOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6IC8qIExBIGFuZCBLRVlDIHNldCBiNjEgdG8gMCwgb3RoZXIgcGFyYW1zIHVuZGVmaW5lZCAqLwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7CiAJfQogCXJldHVybiBjb2RlOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9ndWVzdGRiZy5jIGIvYXJjaC9zMzkwL2t2bS9ndWVzdGRiZy5jCmluZGV4IDMxYTA1MzMuLmQ3YzZhN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rdm0vZ3Vlc3RkYmcuYworKysgYi9hcmNoL3MzOTAva3ZtL2d1ZXN0ZGJnLmMKQEAgLTIwNiw3ICsyMDYsNyBAQAogaW50IGt2bV9zMzkwX2ltcG9ydF9icF9kYXRhKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKIAkJCSAgICBzdHJ1Y3Qga3ZtX2d1ZXN0X2RlYnVnICpkYmcpCiB7Ci0JaW50IHJldCA9IDAsIG5yX3dwID0gMCwgbnJfYnAgPSAwLCBpLCBzaXplOworCWludCByZXQgPSAwLCBucl93cCA9IDAsIG5yX2JwID0gMCwgaTsKIAlzdHJ1Y3Qga3ZtX2h3X2JyZWFrcG9pbnQgKmJwX2RhdGEgPSBOVUxMOwogCXN0cnVjdCBrdm1faHdfd3BfaW5mb19hcmNoICp3cF9pbmZvID0gTlVMTDsKIAlzdHJ1Y3Qga3ZtX2h3X2JwX2luZm9fYXJjaCAqYnBfaW5mbyA9IE5VTEw7CkBAIC0yMTYsMTcgKzIxNiwxMCBAQAogCWVsc2UgaWYgKGRiZy0+YXJjaC5ucl9od19icCA+IE1BWF9CUF9DT1VOVCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzaXplID0gZGJnLT5hcmNoLm5yX2h3X2JwICogc2l6ZW9mKHN0cnVjdCBrdm1faHdfYnJlYWtwb2ludCk7Ci0JYnBfZGF0YSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFicF9kYXRhKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JaWYgKGNvcHlfZnJvbV91c2VyKGJwX2RhdGEsIGRiZy0+YXJjaC5od19icCwgc2l6ZSkpIHsKLQkJcmV0ID0gLUVGQVVMVDsKLQkJZ290byBlcnJvcjsKLQl9CisJYnBfZGF0YSA9IG1lbWR1cF91c2VyKGRiZy0+YXJjaC5od19icCwKKwkJCSAgICAgIHNpemVvZigqYnBfZGF0YSkgKiBkYmctPmFyY2gubnJfaHdfYnApOworCWlmIChJU19FUlIoYnBfZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKGJwX2RhdGEpOwogCiAJZm9yIChpID0gMDsgaSA8IGRiZy0+YXJjaC5ucl9od19icDsgaSsrKSB7CiAJCXN3aXRjaCAoYnBfZGF0YVtpXS50eXBlKSB7CkBAIC0yNDEsMTcgKzIzNCwxOSBAQAogCQl9CiAJfQogCi0Jc2l6ZSA9IG5yX3dwICogc2l6ZW9mKHN0cnVjdCBrdm1faHdfd3BfaW5mb19hcmNoKTsKLQlpZiAoc2l6ZSA+IDApIHsKLQkJd3BfaW5mbyA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKG5yX3dwID4gMCkgeworCQl3cF9pbmZvID0ga21hbGxvY19hcnJheShucl93cCwKKwkJCQkJc2l6ZW9mKCp3cF9pbmZvKSwKKwkJCQkJR0ZQX0tFUk5FTCk7CiAJCWlmICghd3BfaW5mbykgewogCQkJcmV0ID0gLUVOT01FTTsKIAkJCWdvdG8gZXJyb3I7CiAJCX0KIAl9Ci0Jc2l6ZSA9IG5yX2JwICogc2l6ZW9mKHN0cnVjdCBrdm1faHdfYnBfaW5mb19hcmNoKTsKLQlpZiAoc2l6ZSA+IDApIHsKLQkJYnBfaW5mbyA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKG5yX2JwID4gMCkgeworCQlicF9pbmZvID0ga21hbGxvY19hcnJheShucl9icCwKKwkJCQkJc2l6ZW9mKCpicF9pbmZvKSwKKwkJCQkJR0ZQX0tFUk5FTCk7CiAJCWlmICghYnBfaW5mbykgewogCQkJcmV0ID0gLUVOT01FTTsKIAkJCWdvdG8gZXJyb3I7CkBAIC0zODIsMTQgKzM3NywyMCBAQAogCXZjcHUtPmd1ZXN0X2RlYnVnICY9IH5LVk1fR1VFU1REQkdfRVhJVF9QRU5ESU5HOwogfQogCisjZGVmaW5lIFBFUl9DT0RFX01BU0sJCShQRVJfRVZFTlRfTUFTSyA+PiAyNCkKKyNkZWZpbmUgUEVSX0NPREVfQlJBTkNICQkoUEVSX0VWRU5UX0JSQU5DSCA+PiAyNCkKKyNkZWZpbmUgUEVSX0NPREVfSUZFVENICQkoUEVSX0VWRU5UX0lGRVRDSCA+PiAyNCkKKyNkZWZpbmUgUEVSX0NPREVfU1RPUkUJCShQRVJfRVZFTlRfU1RPUkUgPj4gMjQpCisjZGVmaW5lIFBFUl9DT0RFX1NUT1JFX1JFQUwJKFBFUl9FVkVOVF9TVE9SRV9SRUFMID4+IDI0KQorCiAjZGVmaW5lIHBlcl9icF9ldmVudChjb2RlKSBcCi0JCQkoY29kZSAmIChQRVJfRVZFTlRfSUZFVENIIHwgUEVSX0VWRU5UX0JSQU5DSCkpCisJCQkoY29kZSAmIChQRVJfQ09ERV9JRkVUQ0ggfCBQRVJfQ09ERV9CUkFOQ0gpKQogI2RlZmluZSBwZXJfd3JpdGVfd3BfZXZlbnQoY29kZSkgXAotCQkJKGNvZGUgJiAoUEVSX0VWRU5UX1NUT1JFIHwgUEVSX0VWRU5UX1NUT1JFX1JFQUwpKQorCQkJKGNvZGUgJiAoUEVSX0NPREVfU1RPUkUgfCBQRVJfQ09ERV9TVE9SRV9SRUFMKSkKIAogc3RhdGljIGludCBkZWJ1Z19leGl0X3JlcXVpcmVkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQl1MzIgcGVyYyA9ICh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+cGVyYyA8PCAyNCk7CisJdTggcGVyYyA9IHZjcHUtPmFyY2guc2llX2Jsb2NrLT5wZXJjOwogCXN0cnVjdCBrdm1fZGVidWdfZXhpdF9hcmNoICpkZWJ1Z19leGl0ID0gJnZjcHUtPnJ1bi0+ZGVidWcuYXJjaDsKIAlzdHJ1Y3Qga3ZtX2h3X3dwX2luZm9fYXJjaCAqd3BfaW5mbyA9IE5VTEw7CiAJc3RydWN0IGt2bV9od19icF9pbmZvX2FyY2ggKmJwX2luZm8gPSBOVUxMOwpAQCAtNDQ0LDcgKzQ0NSw3IEBACiAJY29uc3QgdTggaWxlbiA9IGt2bV9zMzkwX2dldF9pbGVuKHZjcHUpOwogCXN0cnVjdCBrdm1fczM5MF9wZ21faW5mbyBwZ21faW5mbyA9IHsKIAkJLmNvZGUgPSBQR01fUEVSLAotCQkucGVyX2NvZGUgPSBQRVJfRVZFTlRfSUZFVENIID4+IDI0LAorCQkucGVyX2NvZGUgPSBQRVJfQ09ERV9JRkVUQ0gsCiAJCS5wZXJfYWRkcmVzcyA9IF9fcmV3aW5kX3Bzdyh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z3BzdywgaWxlbiksCiAJfTsKIApAQCAtNDU4LDMzICs0NTksMzMgQEAKIAogc3RhdGljIHZvaWQgZmlsdGVyX2d1ZXN0X3Blcl9ldmVudChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0JdTMyIHBlcmMgPSB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+cGVyYyA8PCAyNDsKKwljb25zdCB1OCBwZXJjID0gdmNwdS0+YXJjaC5zaWVfYmxvY2stPnBlcmM7CiAJdTY0IHBlcmFkZHIgPSB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+cGVyYWRkcjsKIAl1NjQgYWRkciA9IHZjcHUtPmFyY2guc2llX2Jsb2NrLT5ncHN3LmFkZHI7CiAJdTY0IGNyOSA9IHZjcHUtPmFyY2guc2llX2Jsb2NrLT5nY3JbOV07CiAJdTY0IGNyMTAgPSB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z2NyWzEwXTsKIAl1NjQgY3IxMSA9IHZjcHUtPmFyY2guc2llX2Jsb2NrLT5nY3JbMTFdOwogCS8qIGZpbHRlciBhbGwgZXZlbnRzLCBkZW1hbmRlZCBieSB0aGUgZ3Vlc3QgKi8KLQl1MzIgZ3Vlc3RfcGVyYyA9IHBlcmMgJiBjcjkgJiBQRVJfRVZFTlRfTUFTSzsKKwl1OCBndWVzdF9wZXJjID0gcGVyYyAmIChjcjkgPj4gMjQpICYgUEVSX0NPREVfTUFTSzsKIAogCWlmICghZ3Vlc3RfcGVyX2VuYWJsZWQodmNwdSkpCiAJCWd1ZXN0X3BlcmMgPSAwOwogCiAJLyogZmlsdGVyICJzdWNjZXNzZnVsLWJyYW5jaGluZyIgZXZlbnRzICovCi0JaWYgKGd1ZXN0X3BlcmMgJiBQRVJfRVZFTlRfQlJBTkNIICYmCisJaWYgKGd1ZXN0X3BlcmMgJiBQRVJfQ09ERV9CUkFOQ0ggJiYKIAkgICAgY3I5ICYgUEVSX0NPTlRST0xfQlJBTkNIX0FERFJFU1MgJiYKIAkgICAgIWluX2FkZHJfcmFuZ2UoYWRkciwgY3IxMCwgY3IxMSkpCi0JCWd1ZXN0X3BlcmMgJj0gflBFUl9FVkVOVF9CUkFOQ0g7CisJCWd1ZXN0X3BlcmMgJj0gflBFUl9DT0RFX0JSQU5DSDsKIAogCS8qIGZpbHRlciAiaW5zdHJ1Y3Rpb24tZmV0Y2hpbmciIGV2ZW50cyAqLwotCWlmIChndWVzdF9wZXJjICYgUEVSX0VWRU5UX0lGRVRDSCAmJgorCWlmIChndWVzdF9wZXJjICYgUEVSX0NPREVfSUZFVENIICYmCiAJICAgICFpbl9hZGRyX3JhbmdlKHBlcmFkZHIsIGNyMTAsIGNyMTEpKQotCQlndWVzdF9wZXJjICY9IH5QRVJfRVZFTlRfSUZFVENIOworCQlndWVzdF9wZXJjICY9IH5QRVJfQ09ERV9JRkVUQ0g7CiAKIAkvKiBBbGwgb3RoZXIgUEVSIGV2ZW50cyB3aWxsIGJlIGdpdmVuIHRvIHRoZSBndWVzdCAqLwogCS8qIFRPRE86IENoZWNrIGFsdGVyZWQgYWRkcmVzcy9hZGRyZXNzIHNwYWNlICovCiAKLQl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+cGVyYyA9IGd1ZXN0X3BlcmMgPj4gMjQ7CisJdmNwdS0+YXJjaC5zaWVfYmxvY2stPnBlcmMgPSBndWVzdF9wZXJjOwogCiAJaWYgKCFndWVzdF9wZXJjKQogCQl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+aXByY2MgJj0gflBHTV9QRVI7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva3ZtL2ludGVyY2VwdC5jIGIvYXJjaC9zMzkwL2t2bS9pbnRlcmNlcHQuYwppbmRleCBkZmQwY2EyLi4xY2FiOGExIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva3ZtL2ludGVyY2VwdC5jCisrKyBiL2FyY2gvczM5MC9rdm0vaW50ZXJjZXB0LmMKQEAgLTI5LDYgKzI5LDcgQEAKIAlbMHgwMV0gPSBrdm1fczM5MF9oYW5kbGVfMDEsCiAJWzB4ODJdID0ga3ZtX3MzOTBfaGFuZGxlX2xwc3csCiAJWzB4ODNdID0ga3ZtX3MzOTBfaGFuZGxlX2RpYWcsCisJWzB4YWFdID0ga3ZtX3MzOTBfaGFuZGxlX2FhLAogCVsweGFlXSA9IGt2bV9zMzkwX2hhbmRsZV9zaWdwLAogCVsweGIyXSA9IGt2bV9zMzkwX2hhbmRsZV9iMiwKIAlbMHhiNl0gPSBrdm1fczM5MF9oYW5kbGVfc3RjdGwsCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva3ZtL2ludGVycnVwdC5jIGIvYXJjaC9zMzkwL2t2bS9pbnRlcnJ1cHQuYwppbmRleCAyNDUyNGMwLi5iZTRkYjA3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva3ZtL2ludGVycnVwdC5jCisrKyBiL2FyY2gvczM5MC9rdm0vaW50ZXJydXB0LmMKQEAgLTI0LDYgKzI0LDggQEAKICNpbmNsdWRlIDxhc20vc2NscC5oPgogI2luY2x1ZGUgPGFzbS9pc2MuaD4KICNpbmNsdWRlIDxhc20vZ21hcC5oPgorI2luY2x1ZGUgPGFzbS9zd2l0Y2hfdG8uaD4KKyNpbmNsdWRlIDxhc20vbm1pLmg+CiAjaW5jbHVkZSAia3ZtLXMzOTAuaCIKICNpbmNsdWRlICJnYWNjZXNzLmgiCiAjaW5jbHVkZSAidHJhY2UtczM5MC5oIgpAQCAtNDAsNiArNDIsNyBAQAogCWlmICghKGF0b21pY19yZWFkKCZ2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Y3B1ZmxhZ3MpICYgQ1BVU1RBVF9FQ0FMTF9QRU5EKSkKIAkJcmV0dXJuIDA7CiAKKwlCVUdfT04oIWt2bV9zMzkwX3VzZV9zY2FfZW50cmllcygpKTsKIAlyZWFkX2xvY2soJnZjcHUtPmt2bS0+YXJjaC5zY2FfbG9jayk7CiAJaWYgKHZjcHUtPmt2bS0+YXJjaC51c2VfZXNjYSkgewogCQlzdHJ1Y3QgZXNjYV9ibG9jayAqc2NhID0gdmNwdS0+a3ZtLT5hcmNoLnNjYTsKQEAgLTY4LDYgKzcxLDcgQEAKIHsKIAlpbnQgZXhwZWN0LCByYzsKIAorCUJVR19PTigha3ZtX3MzOTBfdXNlX3NjYV9lbnRyaWVzKCkpOwogCXJlYWRfbG9jaygmdmNwdS0+a3ZtLT5hcmNoLnNjYV9sb2NrKTsKIAlpZiAodmNwdS0+a3ZtLT5hcmNoLnVzZV9lc2NhKSB7CiAJCXN0cnVjdCBlc2NhX2Jsb2NrICpzY2EgPSB2Y3B1LT5rdm0tPmFyY2guc2NhOwpAQCAtMTA5LDYgKzExMyw4IEBACiAJc3RydWN0IGt2bV9zMzkwX2xvY2FsX2ludGVycnVwdCAqbGkgPSAmdmNwdS0+YXJjaC5sb2NhbF9pbnQ7CiAJaW50IHJjLCBleHBlY3Q7CiAKKwlpZiAoIWt2bV9zMzkwX3VzZV9zY2FfZW50cmllcygpKQorCQlyZXR1cm47CiAJYXRvbWljX2FuZG5vdChDUFVTVEFUX0VDQUxMX1BFTkQsIGxpLT5jcHVmbGFncyk7CiAJcmVhZF9sb2NrKCZ2Y3B1LT5rdm0tPmFyY2guc2NhX2xvY2spOwogCWlmICh2Y3B1LT5rdm0tPmFyY2gudXNlX2VzY2EpIHsKQEAgLTQwMCwxMiArNDA2LDc4IEBACiAJcmV0dXJuIHJjID8gLUVGQVVMVCA6IDA7CiB9CiAKK3N0YXRpYyBpbnQgX193cml0ZV9tYWNoaW5lX2NoZWNrKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCQkgc3RydWN0IGt2bV9zMzkwX21jaGtfaW5mbyAqbWNoaykKK3sKKwl1bnNpZ25lZCBsb25nIGV4dF9zYV9hZGRyOworCWZyZWdfdCBmcHJzW05VTV9GUFJTXTsKKwl1bmlvbiBtY2kgbWNpOworCWludCByYzsKKworCW1jaS52YWwgPSBtY2hrLT5tY2ljOworCS8qIHRha2UgY2FyZSBvZiBsYXp5IHJlZ2lzdGVyIGxvYWRpbmcgdmlhIHZjcHUgbG9hZC9wdXQgKi8KKwlzYXZlX2ZwdV9yZWdzKCk7CisJc2F2ZV9hY2Nlc3NfcmVncyh2Y3B1LT5ydW4tPnMucmVncy5hY3JzKTsKKworCS8qIEV4dGVuZGVkIHNhdmUgYXJlYSAqLworCXJjID0gcmVhZF9ndWVzdF9sYyh2Y3B1LCBfX0xDX1ZYX1NBVkVfQVJFQV9BRERSLCAmZXh0X3NhX2FkZHIsCisJCQkgICAgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwkvKiBPbmx5IGJpdHMgMC01MyBhcmUgdXNlZCBmb3IgYWRkcmVzcyBmb3JtYXRpb24gKi8KKwlleHRfc2FfYWRkciAmPSB+MHgzZmZVTDsKKwlpZiAoIXJjICYmIG1jaS52ciAmJiBleHRfc2FfYWRkciAmJiB0ZXN0X2t2bV9mYWNpbGl0eSh2Y3B1LT5rdm0sIDEyOSkpIHsKKwkJaWYgKHdyaXRlX2d1ZXN0X2Ficyh2Y3B1LCBleHRfc2FfYWRkciwgdmNwdS0+cnVuLT5zLnJlZ3MudnJzLAorCQkJCSAgICA1MTIpKQorCQkJbWNpLnZyID0gMDsKKwl9IGVsc2UgeworCQltY2kudnIgPSAwOworCX0KKworCS8qIEdlbmVyYWwgaW50ZXJydXB0aW9uIGluZm9ybWF0aW9uICovCisJcmMgfD0gcHV0X2d1ZXN0X2xjKHZjcHUsIDEsICh1OCBfX3VzZXIgKikgX19MQ19BUl9NT0RFX0lEKTsKKwlyYyB8PSB3cml0ZV9ndWVzdF9sYyh2Y3B1LCBfX0xDX01DS19PTERfUFNXLAorCQkJICAgICAmdmNwdS0+YXJjaC5zaWVfYmxvY2stPmdwc3csIHNpemVvZihwc3dfdCkpOworCXJjIHw9IHJlYWRfZ3Vlc3RfbGModmNwdSwgX19MQ19NQ0tfTkVXX1BTVywKKwkJCSAgICAmdmNwdS0+YXJjaC5zaWVfYmxvY2stPmdwc3csIHNpemVvZihwc3dfdCkpOworCXJjIHw9IHB1dF9ndWVzdF9sYyh2Y3B1LCBtY2kudmFsLCAodTY0IF9fdXNlciAqKSBfX0xDX01DQ0tfQ09ERSk7CisKKwkvKiBSZWdpc3Rlci1zYXZlIGFyZWFzICovCisJaWYgKE1BQ0hJTkVfSEFTX1ZYKSB7CisJCWNvbnZlcnRfdnhfdG9fZnAoZnBycywgKF9fdmVjdG9yMTI4ICopIHZjcHUtPnJ1bi0+cy5yZWdzLnZycyk7CisJCXJjIHw9IHdyaXRlX2d1ZXN0X2xjKHZjcHUsIF9fTENfRlBSRUdTX1NBVkVfQVJFQSwgZnBycywgMTI4KTsKKwl9IGVsc2UgeworCQlyYyB8PSB3cml0ZV9ndWVzdF9sYyh2Y3B1LCBfX0xDX0ZQUkVHU19TQVZFX0FSRUEsCisJCQkJICAgICB2Y3B1LT5ydW4tPnMucmVncy5mcHJzLCAxMjgpOworCX0KKwlyYyB8PSB3cml0ZV9ndWVzdF9sYyh2Y3B1LCBfX0xDX0dQUkVHU19TQVZFX0FSRUEsCisJCQkgICAgIHZjcHUtPnJ1bi0+cy5yZWdzLmdwcnMsIDEyOCk7CisJcmMgfD0gcHV0X2d1ZXN0X2xjKHZjcHUsIGN1cnJlbnQtPnRocmVhZC5mcHUuZnBjLAorCQkJICAgKHUzMiBfX3VzZXIgKikgX19MQ19GUF9DUkVHX1NBVkVfQVJFQSk7CisJcmMgfD0gcHV0X2d1ZXN0X2xjKHZjcHUsIHZjcHUtPmFyY2guc2llX2Jsb2NrLT50b2RwciwKKwkJCSAgICh1MzIgX191c2VyICopIF9fTENfVE9EX1BST0dSRUdfU0FWRV9BUkVBKTsKKwlyYyB8PSBwdXRfZ3Vlc3RfbGModmNwdSwga3ZtX3MzOTBfZ2V0X2NwdV90aW1lcih2Y3B1KSwKKwkJCSAgICh1NjQgX191c2VyICopIF9fTENfQ1BVX1RJTUVSX1NBVkVfQVJFQSk7CisJcmMgfD0gcHV0X2d1ZXN0X2xjKHZjcHUsIHZjcHUtPmFyY2guc2llX2Jsb2NrLT5ja2MgPj4gOCwKKwkJCSAgICh1NjQgX191c2VyICopIF9fTENfQ0xPQ0tfQ09NUF9TQVZFX0FSRUEpOworCXJjIHw9IHdyaXRlX2d1ZXN0X2xjKHZjcHUsIF9fTENfQVJFR1NfU0FWRV9BUkVBLAorCQkJICAgICAmdmNwdS0+cnVuLT5zLnJlZ3MuYWNycywgNjQpOworCXJjIHw9IHdyaXRlX2d1ZXN0X2xjKHZjcHUsIF9fTENfQ1JFR1NfU0FWRV9BUkVBLAorCQkJICAgICAmdmNwdS0+YXJjaC5zaWVfYmxvY2stPmdjciwgMTI4KTsKKworCS8qIEV4dGVuZGVkIGludGVycnVwdGlvbiBpbmZvcm1hdGlvbiAqLworCXJjIHw9IHB1dF9ndWVzdF9sYyh2Y3B1LCBtY2hrLT5leHRfZGFtYWdlX2NvZGUsCisJCQkgICAodTMyIF9fdXNlciAqKSBfX0xDX0VYVF9EQU1BR0VfQ09ERSk7CisJcmMgfD0gcHV0X2d1ZXN0X2xjKHZjcHUsIG1jaGstPmZhaWxpbmdfc3RvcmFnZV9hZGRyZXNzLAorCQkJICAgKHU2NCBfX3VzZXIgKikgX19MQ19NQ0NLX0ZBSUxfU1RPUl9BRERSKTsKKwlyYyB8PSB3cml0ZV9ndWVzdF9sYyh2Y3B1LCBfX0xDX1BTV19TQVZFX0FSRUEsICZtY2hrLT5maXhlZF9sb2dvdXQsCisJCQkgICAgIHNpemVvZihtY2hrLT5maXhlZF9sb2dvdXQpKTsKKwlyZXR1cm4gcmMgPyAtRUZBVUxUIDogMDsKK30KKwogc3RhdGljIGludCBfX211c3RfY2hlY2sgX19kZWxpdmVyX21hY2hpbmVfY2hlY2soc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXN0cnVjdCBrdm1fczM5MF9mbG9hdF9pbnRlcnJ1cHQgKmZpID0gJnZjcHUtPmt2bS0+YXJjaC5mbG9hdF9pbnQ7CiAJc3RydWN0IGt2bV9zMzkwX2xvY2FsX2ludGVycnVwdCAqbGkgPSAmdmNwdS0+YXJjaC5sb2NhbF9pbnQ7CiAJc3RydWN0IGt2bV9zMzkwX21jaGtfaW5mbyBtY2hrID0ge307Ci0JdW5zaWduZWQgbG9uZyBhZHRsX3N0YXR1c19hZGRyOwogCWludCBkZWxpdmVyID0gMDsKIAlpbnQgcmMgPSAwOwogCkBAIC00NDYsMjkgKzUxOCw5IEBACiAJCXRyYWNlX2t2bV9zMzkwX2RlbGl2ZXJfaW50ZXJydXB0KHZjcHUtPnZjcHVfaWQsCiAJCQkJCQkgS1ZNX1MzOTBfTUNISywKIAkJCQkJCSBtY2hrLmNyMTQsIG1jaGsubWNpYyk7Ci0KLQkJcmMgID0ga3ZtX3MzOTBfdmNwdV9zdG9yZV9zdGF0dXModmNwdSwKLQkJCQkJCSBLVk1fUzM5MF9TVE9SRV9TVEFUVVNfUFJFRklYRUQpOwotCQlyYyB8PSByZWFkX2d1ZXN0X2xjKHZjcHUsIF9fTENfVlhfU0FWRV9BUkVBX0FERFIsCi0JCQkJICAgICZhZHRsX3N0YXR1c19hZGRyLAotCQkJCSAgICBzaXplb2YodW5zaWduZWQgbG9uZykpOwotCQlyYyB8PSBrdm1fczM5MF92Y3B1X3N0b3JlX2FkdGxfc3RhdHVzKHZjcHUsCi0JCQkJCQkgICAgICBhZHRsX3N0YXR1c19hZGRyKTsKLQkJcmMgfD0gcHV0X2d1ZXN0X2xjKHZjcHUsIG1jaGsubWNpYywKLQkJCQkgICAodTY0IF9fdXNlciAqKSBfX0xDX01DQ0tfQ09ERSk7Ci0JCXJjIHw9IHB1dF9ndWVzdF9sYyh2Y3B1LCBtY2hrLmZhaWxpbmdfc3RvcmFnZV9hZGRyZXNzLAotCQkJCSAgICh1NjQgX191c2VyICopIF9fTENfTUNDS19GQUlMX1NUT1JfQUREUik7Ci0JCXJjIHw9IHdyaXRlX2d1ZXN0X2xjKHZjcHUsIF9fTENfUFNXX1NBVkVfQVJFQSwKLQkJCQkgICAgICZtY2hrLmZpeGVkX2xvZ291dCwKLQkJCQkgICAgIHNpemVvZihtY2hrLmZpeGVkX2xvZ291dCkpOwotCQlyYyB8PSB3cml0ZV9ndWVzdF9sYyh2Y3B1LCBfX0xDX01DS19PTERfUFNXLAotCQkJCSAgICAgJnZjcHUtPmFyY2guc2llX2Jsb2NrLT5ncHN3LAotCQkJCSAgICAgc2l6ZW9mKHBzd190KSk7Ci0JCXJjIHw9IHJlYWRfZ3Vlc3RfbGModmNwdSwgX19MQ19NQ0tfTkVXX1BTVywKLQkJCQkgICAgJnZjcHUtPmFyY2guc2llX2Jsb2NrLT5ncHN3LAotCQkJCSAgICBzaXplb2YocHN3X3QpKTsKKwkJcmMgPSBfX3dyaXRlX21hY2hpbmVfY2hlY2sodmNwdSwgJm1jaGspOwogCX0KLQlyZXR1cm4gcmMgPyAtRUZBVUxUIDogMDsKKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQgX19tdXN0X2NoZWNrIF9fZGVsaXZlcl9yZXN0YXJ0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuYyBiL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuYwppbmRleCBmMTQyMjE1Li45YzdhMWVjIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmMKKysrIGIvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5jCkBAIC0xMzIsMTAgKzEzMiw3IEBACiBNT0RVTEVfUEFSTV9ERVNDKG5lc3RlZCwgIk5lc3RlZCB2aXJ0dWFsaXphdGlvbiBzdXBwb3J0Iik7CiAKIC8qIHVwcGVyIGZhY2lsaXRpZXMgbGltaXQgZm9yIGt2bSAqLwotdW5zaWduZWQgbG9uZyBrdm1fczM5MF9mYWNfbGlzdF9tYXNrWzE2XSA9IHsKLQkweGZmZTYwMDAwMDAwMDAwMDBVTCwKLQkweDAwNWUwMDAwMDAwMDAwMDBVTCwKLX07Cit1bnNpZ25lZCBsb25nIGt2bV9zMzkwX2ZhY19saXN0X21hc2tbMTZdID0geyBGQUNJTElUSUVTX0tWTSB9OwogCiB1bnNpZ25lZCBsb25nIGt2bV9zMzkwX2ZhY19saXN0X21hc2tfc2l6ZSh2b2lkKQogewpAQCAtMjQ4LDIyICsyNDUsMzMgQEAKIAkJICAgICBQVEZGX1FBRik7CiAKIAlpZiAodGVzdF9mYWNpbGl0eSgxNykpIHsgLyogTVNBICovCi0JCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfS01BQywga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMua21hYyk7Ci0JCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfS01DLCBrdm1fczM5MF9hdmFpbGFibGVfc3ViZnVuYy5rbWMpOwotCQlfX2NwYWNmX3F1ZXJ5KENQQUNGX0tNLCBrdm1fczM5MF9hdmFpbGFibGVfc3ViZnVuYy5rbSk7Ci0JCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfS0lNRCwga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMua2ltZCk7Ci0JCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfS0xNRCwga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMua2xtZCk7CisJCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfS01BQywgKGNwYWNmX21hc2tfdCAqKQorCQkJICAgICAga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMua21hYyk7CisJCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfS01DLCAoY3BhY2ZfbWFza190ICopCisJCQkgICAgICBrdm1fczM5MF9hdmFpbGFibGVfc3ViZnVuYy5rbWMpOworCQlfX2NwYWNmX3F1ZXJ5KENQQUNGX0tNLCAoY3BhY2ZfbWFza190ICopCisJCQkgICAgICBrdm1fczM5MF9hdmFpbGFibGVfc3ViZnVuYy5rbSk7CisJCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfS0lNRCwgKGNwYWNmX21hc2tfdCAqKQorCQkJICAgICAga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMua2ltZCk7CisJCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfS0xNRCwgKGNwYWNmX21hc2tfdCAqKQorCQkJICAgICAga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMua2xtZCk7CiAJfQogCWlmICh0ZXN0X2ZhY2lsaXR5KDc2KSkgLyogTVNBMyAqLwotCQlfX2NwYWNmX3F1ZXJ5KENQQUNGX1BDS01PLCBrdm1fczM5MF9hdmFpbGFibGVfc3ViZnVuYy5wY2ttbyk7CisJCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfUENLTU8sIChjcGFjZl9tYXNrX3QgKikKKwkJCSAgICAgIGt2bV9zMzkwX2F2YWlsYWJsZV9zdWJmdW5jLnBja21vKTsKIAlpZiAodGVzdF9mYWNpbGl0eSg3NykpIHsgLyogTVNBNCAqLwotCQlfX2NwYWNmX3F1ZXJ5KENQQUNGX0tNQ1RSLCBrdm1fczM5MF9hdmFpbGFibGVfc3ViZnVuYy5rbWN0cik7Ci0JCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfS01GLCBrdm1fczM5MF9hdmFpbGFibGVfc3ViZnVuYy5rbWYpOwotCQlfX2NwYWNmX3F1ZXJ5KENQQUNGX0tNTywga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMua21vKTsKLQkJX19jcGFjZl9xdWVyeShDUEFDRl9QQ0MsIGt2bV9zMzkwX2F2YWlsYWJsZV9zdWJmdW5jLnBjYyk7CisJCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfS01DVFIsIChjcGFjZl9tYXNrX3QgKikKKwkJCSAgICAgIGt2bV9zMzkwX2F2YWlsYWJsZV9zdWJmdW5jLmttY3RyKTsKKwkJX19jcGFjZl9xdWVyeShDUEFDRl9LTUYsIChjcGFjZl9tYXNrX3QgKikKKwkJCSAgICAgIGt2bV9zMzkwX2F2YWlsYWJsZV9zdWJmdW5jLmttZik7CisJCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfS01PLCAoY3BhY2ZfbWFza190ICopCisJCQkgICAgICBrdm1fczM5MF9hdmFpbGFibGVfc3ViZnVuYy5rbW8pOworCQlfX2NwYWNmX3F1ZXJ5KENQQUNGX1BDQywgKGNwYWNmX21hc2tfdCAqKQorCQkJICAgICAga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMucGNjKTsKIAl9CiAJaWYgKHRlc3RfZmFjaWxpdHkoNTcpKSAvKiBNU0E1ICovCi0JCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfUFBOTywga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMucHBubyk7CisJCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfUFBOTywgKGNwYWNmX21hc2tfdCAqKQorCQkJICAgICAga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMucHBubyk7CiAKIAlpZiAoTUFDSElORV9IQVNfRVNPUCkKIAkJYWxsb3dfY3B1X2ZlYXQoS1ZNX1MzOTBfVk1fQ1BVX0ZFQVRfRVNPUCk7CkBAIC0zNzYsNyArMzg0LDkgQEAKIAljYXNlIEtWTV9DQVBfTlJfVkNQVVM6CiAJY2FzZSBLVk1fQ0FQX01BWF9WQ1BVUzoKIAkJciA9IEtWTV9TMzkwX0JTQ0FfQ1BVX1NMT1RTOwotCQlpZiAoc2NscC5oYXNfZXNjYSAmJiBzY2xwLmhhc182NGJzY2FvKQorCQlpZiAoIWt2bV9zMzkwX3VzZV9zY2FfZW50cmllcygpKQorCQkJciA9IEtWTV9NQVhfVkNQVVM7CisJCWVsc2UgaWYgKHNjbHAuaGFzX2VzY2EgJiYgc2NscC5oYXNfNjRic2NhbykKIAkJCXIgPSBLVk1fUzM5MF9FU0NBX0NQVV9TTE9UUzsKIAkJYnJlYWs7CiAJY2FzZSBLVk1fQ0FQX05SX01FTVNMT1RTOgpAQCAtMTQ5MCw2ICsxNTAwLDE2IEBACiAJcmV0dXJuIHJjOwogfQogCitib29sIGt2bV9hcmNoX2hhc192Y3B1X2RlYnVnZnModm9pZCkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisKK2ludCBrdm1fYXJjaF9jcmVhdGVfdmNwdV9kZWJ1Z2ZzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlyZXR1cm4gMDsKK30KKwogdm9pZCBrdm1fYXJjaF92Y3B1X2Rlc3Ryb3koc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCVZDUFVfRVZFTlQodmNwdSwgMywgIiVzIiwgImZyZWUgY3B1Iik7CkBAIC0xNTUzLDYgKzE1NzMsOCBAQAogCiBzdGF0aWMgdm9pZCBzY2FfZGVsX3ZjcHUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogeworCWlmICgha3ZtX3MzOTBfdXNlX3NjYV9lbnRyaWVzKCkpCisJCXJldHVybjsKIAlyZWFkX2xvY2soJnZjcHUtPmt2bS0+YXJjaC5zY2FfbG9jayk7CiAJaWYgKHZjcHUtPmt2bS0+YXJjaC51c2VfZXNjYSkgewogCQlzdHJ1Y3QgZXNjYV9ibG9jayAqc2NhID0gdmNwdS0+a3ZtLT5hcmNoLnNjYTsKQEAgLTE1NzAsNiArMTU5MiwxMyBAQAogCiBzdGF0aWMgdm9pZCBzY2FfYWRkX3ZjcHUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogeworCWlmICgha3ZtX3MzOTBfdXNlX3NjYV9lbnRyaWVzKCkpIHsKKwkJc3RydWN0IGJzY2FfYmxvY2sgKnNjYSA9IHZjcHUtPmt2bS0+YXJjaC5zY2E7CisKKwkJLyogd2Ugc3RpbGwgbmVlZCB0aGUgYmFzaWMgc2NhIGZvciB0aGUgaXB0ZSBjb250cm9sICovCisJCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5zY2FvaCA9IChfX3UzMikoKChfX3U2NClzY2EpID4+IDMyKTsKKwkJdmNwdS0+YXJjaC5zaWVfYmxvY2stPnNjYW9sID0gKF9fdTMyKShfX3U2NClzY2E7CisJfQogCXJlYWRfbG9jaygmdmNwdS0+a3ZtLT5hcmNoLnNjYV9sb2NrKTsKIAlpZiAodmNwdS0+a3ZtLT5hcmNoLnVzZV9lc2NhKSB7CiAJCXN0cnVjdCBlc2NhX2Jsb2NrICpzY2EgPSB2Y3B1LT5rdm0tPmFyY2guc2NhOwpAQCAtMTY1MCw2ICsxNjc5LDExIEBACiB7CiAJaW50IHJjOwogCisJaWYgKCFrdm1fczM5MF91c2Vfc2NhX2VudHJpZXMoKSkgeworCQlpZiAoaWQgPCBLVk1fTUFYX1ZDUFVTKQorCQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBmYWxzZTsKKwl9CiAJaWYgKGlkIDwgS1ZNX1MzOTBfQlNDQV9DUFVfU0xPVFMpCiAJCXJldHVybiB0cnVlOwogCWlmICghc2NscC5oYXNfZXNjYSB8fCAhc2NscC5oYXNfNjRic2NhbykKQEAgLTE5MzgsOCArMTk3Miw2IEBACiAJCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5lY2EgfD0gMTsKIAlpZiAoc2NscC5oYXNfc2lncGlmKQogCQl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+ZWNhIHw9IDB4MTAwMDAwMDBVOwotCWlmICh0ZXN0X2t2bV9mYWNpbGl0eSh2Y3B1LT5rdm0sIDY0KSkKLQkJdmNwdS0+YXJjaC5zaWVfYmxvY2stPmVjYjMgfD0gMHgwMTsKIAlpZiAodGVzdF9rdm1fZmFjaWxpdHkodmNwdS0+a3ZtLCAxMjkpKSB7CiAJCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5lY2EgfD0gMHgwMDAyMDAwMDsKIAkJdmNwdS0+YXJjaC5zaWVfYmxvY2stPmVjZCB8PSAweDIwMDAwMDAwOwpAQCAtMjIzMSw5ICsyMjYzLDEwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCWN1cnJlbnQtPnRocmVhZC5mcHUuZnBjID0gZnB1LT5mcGM7CiAJaWYgKE1BQ0hJTkVfSEFTX1ZYKQotCQljb252ZXJ0X2ZwX3RvX3Z4KGN1cnJlbnQtPnRocmVhZC5mcHUudnhycywgKGZyZWdfdCAqKWZwdS0+ZnBycyk7CisJCWNvbnZlcnRfZnBfdG9fdngoKF9fdmVjdG9yMTI4ICopIHZjcHUtPnJ1bi0+cy5yZWdzLnZycywKKwkJCQkgKGZyZWdfdCAqKSBmcHUtPmZwcnMpOwogCWVsc2UKLQkJbWVtY3B5KGN1cnJlbnQtPnRocmVhZC5mcHUuZnBycywgJmZwdS0+ZnBycywgc2l6ZW9mKGZwdS0+ZnBycykpOworCQltZW1jcHkodmNwdS0+cnVuLT5zLnJlZ3MuZnBycywgJmZwdS0+ZnBycywgc2l6ZW9mKGZwdS0+ZnBycykpOwogCXJldHVybiAwOwogfQogCkBAIC0yMjQyLDkgKzIyNzUsMTAgQEAKIAkvKiBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgbGF0ZXN0IHZhbHVlcyAqLwogCXNhdmVfZnB1X3JlZ3MoKTsKIAlpZiAoTUFDSElORV9IQVNfVlgpCi0JCWNvbnZlcnRfdnhfdG9fZnAoKGZyZWdfdCAqKWZwdS0+ZnBycywgY3VycmVudC0+dGhyZWFkLmZwdS52eHJzKTsKKwkJY29udmVydF92eF90b19mcCgoZnJlZ190ICopIGZwdS0+ZnBycywKKwkJCQkgKF9fdmVjdG9yMTI4ICopIHZjcHUtPnJ1bi0+cy5yZWdzLnZycyk7CiAJZWxzZQotCQltZW1jcHkoZnB1LT5mcHJzLCBjdXJyZW50LT50aHJlYWQuZnB1LmZwcnMsIHNpemVvZihmcHUtPmZwcnMpKTsKKwkJbWVtY3B5KGZwdS0+ZnBycywgdmNwdS0+cnVuLT5zLnJlZ3MuZnBycywgc2l6ZW9mKGZwdS0+ZnBycykpOwogCWZwdS0+ZnBjID0gY3VycmVudC0+dGhyZWFkLmZwdS5mcGM7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNjk0LDYgKzI3MjgsMTkgQEAKIAkJaWYgKHZjcHUtPmFyY2gucGZhdWx0X3Rva2VuID09IEtWTV9TMzkwX1BGQVVMVF9UT0tFTl9JTlZBTElEKQogCQkJa3ZtX2NsZWFyX2FzeW5jX3BmX2NvbXBsZXRpb25fcXVldWUodmNwdSk7CiAJfQorCS8qCisJICogSWYgdXNlcnNwYWNlIHNldHMgdGhlIHJpY2NiIChlLmcuIGFmdGVyIG1pZ3JhdGlvbikgdG8gYSB2YWxpZCBzdGF0ZSwKKwkgKiB3ZSBzaG91bGQgZW5hYmxlIFJJIGhlcmUgaW5zdGVhZCBvZiBkb2luZyB0aGUgbGF6eSBlbmFibGVtZW50LgorCSAqLworCWlmICgoa3ZtX3J1bi0+a3ZtX2RpcnR5X3JlZ3MgJiBLVk1fU1lOQ19SSUNDQikgJiYKKwkgICAgdGVzdF9rdm1fZmFjaWxpdHkodmNwdS0+a3ZtLCA2NCkpIHsKKwkJc3RydWN0IHJ1bnRpbWVfaW5zdHJfY2IgKnJpY2NiID0KKwkJCShzdHJ1Y3QgcnVudGltZV9pbnN0cl9jYiAqKSAma3ZtX3J1bi0+cy5yZWdzLnJpY2NiOworCisJCWlmIChyaWNjYi0+dmFsaWQpCisJCQl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+ZWNiMyB8PSAweDAxOworCX0KKwogCWt2bV9ydW4tPmt2bV9kaXJ0eV9yZWdzID0gMDsKIH0KIApAQCAtMjgzNywzOCArMjg4NCw2IEBACiAJcmV0dXJuIGt2bV9zMzkwX3N0b3JlX3N0YXR1c191bmxvYWRlZCh2Y3B1LCBhZGRyKTsKIH0KIAotLyoKLSAqIHN0b3JlIGFkZGl0aW9uYWwgc3RhdHVzIGF0IGFkZHJlc3MKLSAqLwotaW50IGt2bV9zMzkwX3N0b3JlX2FkdGxfc3RhdHVzX3VubG9hZGVkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKLQkJCQkJdW5zaWduZWQgbG9uZyBncGEpCi17Ci0JLyogT25seSBiaXRzIDAtNTMgYXJlIHVzZWQgZm9yIGFkZHJlc3MgZm9ybWF0aW9uICovCi0JaWYgKCEoZ3BhICYgfjB4M2ZmKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gd3JpdGVfZ3Vlc3RfYWJzKHZjcHUsIGdwYSAmIH4weDNmZiwKLQkJCSAgICAgICAodm9pZCAqKSZ2Y3B1LT5ydW4tPnMucmVncy52cnMsIDUxMik7Ci19Ci0KLWludCBrdm1fczM5MF92Y3B1X3N0b3JlX2FkdGxfc3RhdHVzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBhZGRyKQotewotCWlmICghdGVzdF9rdm1fZmFjaWxpdHkodmNwdS0+a3ZtLCAxMjkpKQotCQlyZXR1cm4gMDsKLQotCS8qCi0JICogVGhlIGd1ZXN0IFZYUlMgYXJlIGluIHRoZSBob3N0IFZYUnMgZHVlIHRvIHRoZSBsYXp5Ci0JICogY29weWluZyBpbiB2Y3B1IGxvYWQvcHV0LiBXZSBjYW4gc2ltcGx5IGNhbGwgc2F2ZV9mcHVfcmVncygpCi0JICogdG8gc2F2ZSB0aGUgY3VycmVudCByZWdpc3RlciBzdGF0ZSBiZWNhdXNlIHdlIGFyZSBpbiB0aGUKLQkgKiBtaWRkbGUgb2YgYSBsb2FkL3B1dCBjeWNsZS4KLQkgKgotCSAqIExldCdzIHVwZGF0ZSBvdXIgY29waWVzIGJlZm9yZSB3ZSBzYXZlIGl0IGludG8gdGhlIHNhdmUgYXJlYS4KLQkgKi8KLQlzYXZlX2ZwdV9yZWdzKCk7Ci0KLQlyZXR1cm4ga3ZtX3MzOTBfc3RvcmVfYWR0bF9zdGF0dXNfdW5sb2FkZWQodmNwdSwgYWRkcik7Ci19Ci0KIHN0YXRpYyB2b2lkIF9fZGlzYWJsZV9pYnNfb25fdmNwdShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJa3ZtX2NoZWNrX3JlcXVlc3QoS1ZNX1JFUV9FTkFCTEVfSUJTLCB2Y3B1KTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuaCBiL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuaAppbmRleCBiODQzMjg2Li4zYTRlOTdmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmgKKysrIGIvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KICNpbmNsdWRlIDxhc20vZmFjaWxpdHkuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3NjbHAuaD4KIAogdHlwZWRlZiBpbnQgKCppbnRlcmNlcHRfaGFuZGxlcl90KShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCkBAIC0yNDUsNiArMjQ2LDcgQEAKIAogLyogaW1wbGVtZW50ZWQgaW4gcHJpdi5jICovCiBpbnQgaXNfdmFsaWRfcHN3KHBzd190ICpwc3cpOworaW50IGt2bV9zMzkwX2hhbmRsZV9hYShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogaW50IGt2bV9zMzkwX2hhbmRsZV9iMihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogaW50IGt2bV9zMzkwX2hhbmRsZV9lNShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogaW50IGt2bV9zMzkwX2hhbmRsZV8wMShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwpAQCAtMjczLDEwICsyNzUsNyBAQAogdm9pZCBrdm1fczM5MF9zZXRfdG9kX2Nsb2NrKHN0cnVjdCBrdm0gKmt2bSwgdTY0IHRvZCk7CiBsb25nIGt2bV9hcmNoX2ZhdWx0X2luX3BhZ2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBncGFfdCBncGEsIGludCB3cml0YWJsZSk7CiBpbnQga3ZtX3MzOTBfc3RvcmVfc3RhdHVzX3VubG9hZGVkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBhZGRyKTsKLWludCBrdm1fczM5MF9zdG9yZV9hZHRsX3N0YXR1c191bmxvYWRlZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCi0JCQkJCXVuc2lnbmVkIGxvbmcgYWRkcik7CiBpbnQga3ZtX3MzOTBfdmNwdV9zdG9yZV9zdGF0dXMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGFkZHIpOwotaW50IGt2bV9zMzkwX3ZjcHVfc3RvcmVfYWR0bF9zdGF0dXMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGFkZHIpOwogdm9pZCBrdm1fczM5MF92Y3B1X3N0YXJ0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiB2b2lkIGt2bV9zMzkwX3ZjcHVfc3RvcChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogdm9pZCBrdm1fczM5MF92Y3B1X2Jsb2NrKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CkBAIC0zODksNCArMzg4LDEzIEBACiAKIAlyZXR1cm4gJnNjYS0+aXB0ZV9jb250cm9sOwogfQorc3RhdGljIGlubGluZSBpbnQga3ZtX3MzOTBfdXNlX3NjYV9lbnRyaWVzKHZvaWQpCit7CisJLyoKKwkgKiBXaXRob3V0IFNJR1AgaW50ZXJwcmV0YXRpb24sIG9ubHkgU1JTIGludGVycHJldGF0aW9uIChpZiBhdmFpbGFibGUpCisJICogbWlnaHQgdXNlIHRoZSBlbnRyaWVzLiBCeSBub3Qgc2V0dGluZyB0aGUgZW50cmllcyBhbmQga2VlcGluZyB0aGVtCisJICogaW52YWxpZCwgaGFyZHdhcmUgd2lsbCBub3QgYWNjZXNzIHRoZW0gYnV0IGludGVyY2VwdC4KKwkgKi8KKwlyZXR1cm4gc2NscC5oYXNfc2lncGlmOworfQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva3ZtL3ByaXYuYyBiL2FyY2gvczM5MC9rdm0vcHJpdi5jCmluZGV4IDQ2MTYwMzguLmUxODQzNTMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rdm0vcHJpdi5jCisrKyBiL2FyY2gvczM5MC9rdm0vcHJpdi5jCkBAIC0zMiw2ICszMiwyNCBAQAogI2luY2x1ZGUgImt2bS1zMzkwLmgiCiAjaW5jbHVkZSAidHJhY2UuaCIKIAorc3RhdGljIGludCBoYW5kbGVfcmkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCWlmICh0ZXN0X2t2bV9mYWNpbGl0eSh2Y3B1LT5rdm0sIDY0KSkgeworCQl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+ZWNiMyB8PSAweDAxOworCQlrdm1fczM5MF9yZXRyeV9pbnN0cih2Y3B1KTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlCisJCXJldHVybiBrdm1fczM5MF9pbmplY3RfcHJvZ3JhbV9pbnQodmNwdSwgUEdNX09QRVJBVElPTik7Cit9CisKK2ludCBrdm1fczM5MF9oYW5kbGVfYWEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCWlmICgodmNwdS0+YXJjaC5zaWVfYmxvY2stPmlwYSAmIDB4ZikgPD0gNCkKKwkJcmV0dXJuIGhhbmRsZV9yaSh2Y3B1KTsKKwllbHNlCisJCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKwogLyogSGFuZGxlIFNDSyAoU0VUIENMT0NLKSBpbnRlcmNlcHRpb24gKi8KIHN0YXRpYyBpbnQgaGFuZGxlX3NldF9jbG9jayhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CkBAIC0xMDkzLDYgKzExMTEsOSBAQAogc3RhdGljIGNvbnN0IGludGVyY2VwdF9oYW5kbGVyX3QgZWJfaGFuZGxlcnNbMjU2XSA9IHsKIAlbMHgyZl0gPSBoYW5kbGVfbGN0bGcsCiAJWzB4MjVdID0gaGFuZGxlX3N0Y3RnLAorCVsweDYwXSA9IGhhbmRsZV9yaSwKKwlbMHg2MV0gPSBoYW5kbGVfcmksCisJWzB4NjJdID0gaGFuZGxlX3JpLAogfTsKIAogaW50IGt2bV9zMzkwX2hhbmRsZV9lYihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva3ZtL3ZzaWUuYyBiL2FyY2gvczM5MC9rdm0vdnNpZS5jCmluZGV4IGMxMDY0ODhiLi5kODY3M2UyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva3ZtL3ZzaWUuYworKysgYi9hcmNoL3MzOTAva3ZtL3ZzaWUuYwpAQCAtNTg0LDcgKzU4NCw3IEBACiAJCS8qIFZhbGlkaXR5IDB4MDA0NCB3aWxsIGJlIGNoZWNrZWQgYnkgU0lFICovCiAJCWlmIChyYykKIAkJCWdvdG8gdW5waW47Ci0JCXNjYl9zLT5ndnJkID0gaHBhOworCQlzY2Jfcy0+cmljY2JkID0gaHBhOwogCX0KIAlyZXR1cm4gMDsKIHVucGluOgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2xpYi9zdHJpbmcuYyBiL2FyY2gvczM5MC9saWIvc3RyaW5nLmMKaW5kZXggZTM5MGJiYi4uNDgzNTJiZiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2xpYi9zdHJpbmcuYworKysgYi9hcmNoL3MzOTAvbGliL3N0cmluZy5jCkBAIC0yMzcsMTEgKzIzNywxMCBAQAogRVhQT1JUX1NZTUJPTChzdHJyY2hyKTsKIAogc3RhdGljIGlubGluZSBpbnQgY2xjbGUoY29uc3QgY2hhciAqczEsIHVuc2lnbmVkIGxvbmcgbDEsCi0JCQljb25zdCBjaGFyICpzMiwgdW5zaWduZWQgbG9uZyBsMiwKLQkJCWludCAqZGlmZikKKwkJCWNvbnN0IGNoYXIgKnMyLCB1bnNpZ25lZCBsb25nIGwyKQogewogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcjIgYXNtKCIyIikgPSAodW5zaWduZWQgbG9uZykgczE7Ci0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByMyBhc20oIjMiKSA9ICh1bnNpZ25lZCBsb25nKSBsMjsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHIzIGFzbSgiMyIpID0gKHVuc2lnbmVkIGxvbmcpIGwxOwogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcjQgYXNtKCI0IikgPSAodW5zaWduZWQgbG9uZykgczI7CiAJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByNSBhc20oIjUiKSA9ICh1bnNpZ25lZCBsb25nKSBsMjsKIAlpbnQgY2M7CkBAIC0yNTIsNyArMjUxLDYgQEAKIAkJICAgICAgIiAgIHNybCAgICUwLDI4IgogCQkgICAgICA6ICI9JmQiIChjYyksICIrYSIgKHIyKSwgIithIiAocjMpLAogCQkJIithIiAocjQpLCAiK2EiIChyNSkgOiA6ICJjYyIpOwotCSpkaWZmID0gKihjaGFyICopcjIgLSAqKGNoYXIgKilyNDsKIAlyZXR1cm4gY2M7CiB9CiAKQEAgLTI3MCw5ICsyNjgsOSBAQAogCQlyZXR1cm4gKGNoYXIgKikgczE7CiAJbDEgPSBfX3N0cmVuZChzMSkgLSBzMTsKIAl3aGlsZSAobDEtLSA+PSBsMikgewotCQlpbnQgY2MsIGR1bW15OworCQlpbnQgY2M7CiAKLQkJY2MgPSBjbGNsZShzMSwgbDEsIHMyLCBsMiwgJmR1bW15KTsKKwkJY2MgPSBjbGNsZShzMSwgbDIsIHMyLCBsMik7CiAJCWlmICghY2MpCiAJCQlyZXR1cm4gKGNoYXIgKikgczE7CiAJCXMxKys7CkBAIC0zMTMsMTEgKzMxMSwxMSBAQAogICovCiBpbnQgbWVtY21wKGNvbnN0IHZvaWQgKmNzLCBjb25zdCB2b2lkICpjdCwgc2l6ZV90IG4pCiB7Ci0JaW50IHJldCwgZGlmZjsKKwlpbnQgcmV0OwogCi0JcmV0ID0gY2xjbGUoY3MsIG4sIGN0LCBuLCAmZGlmZik7CisJcmV0ID0gY2xjbGUoY3MsIG4sIGN0LCBuKTsKIAlpZiAocmV0KQotCQlyZXQgPSBkaWZmOworCQlyZXQgPSByZXQgPT0gMSA/IC0xIDogMTsKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChtZW1jbXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21tL2ZhdWx0LmMgYi9hcmNoL3MzOTAvbW0vZmF1bHQuYwppbmRleCBhNThiY2E2Li42NjFkOWZlIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbW0vZmF1bHQuYworKysgYi9hcmNoL3MzOTAvbW0vZmF1bHQuYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXh0YWJsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgpAQCAtNzQwLDI4ICs3NDAsMjEgQEAKIAlwdXRfdGFza19zdHJ1Y3QodHNrKTsKIH0KIAotc3RhdGljIGludCBwZmF1bHRfY3B1X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLAotCQkJICAgICB2b2lkICpoY3B1KQorc3RhdGljIGludCBwZmF1bHRfY3B1X2RlYWQodW5zaWduZWQgaW50IGNwdSkKIHsKIAlzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdGhyZWFkLCAqbmV4dDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKIAotCXN3aXRjaCAoYWN0aW9uICYgfkNQVV9UQVNLU19GUk9aRU4pIHsKLQljYXNlIENQVV9ERUFEOgotCQlzcGluX2xvY2tfaXJxKCZwZmF1bHRfbG9jayk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0aHJlYWQsIG5leHQsICZwZmF1bHRfbGlzdCwgbGlzdCkgewotCQkJdGhyZWFkLT5wZmF1bHRfd2FpdCA9IDA7Ci0JCQlsaXN0X2RlbCgmdGhyZWFkLT5saXN0KTsKLQkJCXRzayA9IGNvbnRhaW5lcl9vZih0aHJlYWQsIHN0cnVjdCB0YXNrX3N0cnVjdCwgdGhyZWFkKTsKLQkJCXdha2VfdXBfcHJvY2Vzcyh0c2spOwotCQkJcHV0X3Rhc2tfc3RydWN0KHRzayk7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxKCZwZmF1bHRfbG9jayk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOworCXNwaW5fbG9ja19pcnEoJnBmYXVsdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodGhyZWFkLCBuZXh0LCAmcGZhdWx0X2xpc3QsIGxpc3QpIHsKKwkJdGhyZWFkLT5wZmF1bHRfd2FpdCA9IDA7CisJCWxpc3RfZGVsKCZ0aHJlYWQtPmxpc3QpOworCQl0c2sgPSBjb250YWluZXJfb2YodGhyZWFkLCBzdHJ1Y3QgdGFza19zdHJ1Y3QsIHRocmVhZCk7CisJCXdha2VfdXBfcHJvY2Vzcyh0c2spOworCQlwdXRfdGFza19zdHJ1Y3QodHNrKTsKIAl9Ci0JcmV0dXJuIE5PVElGWV9PSzsKKwlzcGluX3VubG9ja19pcnEoJnBmYXVsdF9sb2NrKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBfX2luaXQgcGZhdWx0X2lycV9pbml0KHZvaWQpCkBAIC03NzUsNyArNzY4LDggQEAKIAlpZiAocmMpCiAJCWdvdG8gb3V0X3BmYXVsdDsKIAlpcnFfc3ViY2xhc3NfcmVnaXN0ZXIoSVJRX1NVQkNMQVNTX1NFUlZJQ0VfU0lHTkFMKTsKLQlob3RjcHVfbm90aWZpZXIocGZhdWx0X2NwdV9ub3RpZnksIDApOworCWNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfUzM5MF9QRkFVTFRfREVBRCwgInMzOTAvcGZhdWx0OmRlYWQiLAorCQkJCSAgTlVMTCwgcGZhdWx0X2NwdV9kZWFkKTsKIAlyZXR1cm4gMDsKIAogb3V0X3BmYXVsdDoKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS9nbWFwLmMgYi9hcmNoL3MzOTAvbW0vZ21hcC5jCmluZGV4IDJjZTZiYjMuLjNiYTYyMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9nbWFwLmMKKysrIGIvYXJjaC9zMzkwL21tL2dtYXAuYwpAQCAtOTQsNiArOTQsNyBAQAogc3RydWN0IGdtYXAgKmdtYXBfY3JlYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGxpbWl0KQogewogCXN0cnVjdCBnbWFwICpnbWFwOworCXVuc2lnbmVkIGxvbmcgZ21hcF9hc2NlOwogCiAJZ21hcCA9IGdtYXBfYWxsb2MobGltaXQpOwogCWlmICghZ21hcCkKQEAgLTEwMSw2ICsxMDIsMTEgQEAKIAlnbWFwLT5tbSA9IG1tOwogCXNwaW5fbG9jaygmbW0tPmNvbnRleHQuZ21hcF9sb2NrKTsKIAlsaXN0X2FkZF9yY3UoJmdtYXAtPmxpc3QsICZtbS0+Y29udGV4dC5nbWFwX2xpc3QpOworCWlmIChsaXN0X2lzX3Npbmd1bGFyKCZtbS0+Y29udGV4dC5nbWFwX2xpc3QpKQorCQlnbWFwX2FzY2UgPSBnbWFwLT5hc2NlOworCWVsc2UKKwkJZ21hcF9hc2NlID0gLTFVTDsKKwlXUklURV9PTkNFKG1tLT5jb250ZXh0LmdtYXBfYXNjZSwgZ21hcF9hc2NlKTsKIAlzcGluX3VubG9jaygmbW0tPmNvbnRleHQuZ21hcF9sb2NrKTsKIAlyZXR1cm4gZ21hcDsKIH0KQEAgLTIzMCw2ICsyMzYsNyBAQAogdm9pZCBnbWFwX3JlbW92ZShzdHJ1Y3QgZ21hcCAqZ21hcCkKIHsKIAlzdHJ1Y3QgZ21hcCAqc2csICpuZXh0OworCXVuc2lnbmVkIGxvbmcgZ21hcF9hc2NlOwogCiAJLyogUmVtb3ZlIGFsbCBzaGFkb3cgZ21hcHMgbGlua2VkIHRvIHRoaXMgZ21hcCAqLwogCWlmICghbGlzdF9lbXB0eSgmZ21hcC0+Y2hpbGRyZW4pKSB7CkBAIC0yNDMsNiArMjUwLDE0IEBACiAJLyogUmVtb3ZlIGdtYXAgZnJvbSB0aGUgcHJlLW1tIGxpc3QgKi8KIAlzcGluX2xvY2soJmdtYXAtPm1tLT5jb250ZXh0LmdtYXBfbG9jayk7CiAJbGlzdF9kZWxfcmN1KCZnbWFwLT5saXN0KTsKKwlpZiAobGlzdF9lbXB0eSgmZ21hcC0+bW0tPmNvbnRleHQuZ21hcF9saXN0KSkKKwkJZ21hcF9hc2NlID0gMDsKKwllbHNlIGlmIChsaXN0X2lzX3Npbmd1bGFyKCZnbWFwLT5tbS0+Y29udGV4dC5nbWFwX2xpc3QpKQorCQlnbWFwX2FzY2UgPSBsaXN0X2ZpcnN0X2VudHJ5KCZnbWFwLT5tbS0+Y29udGV4dC5nbWFwX2xpc3QsCisJCQkJCSAgICAgc3RydWN0IGdtYXAsIGxpc3QpLT5hc2NlOworCWVsc2UKKwkJZ21hcF9hc2NlID0gLTFVTDsKKwlXUklURV9PTkNFKGdtYXAtPm1tLT5jb250ZXh0LmdtYXBfYXNjZSwgZ21hcF9hc2NlKTsKIAlzcGluX3VubG9jaygmZ21hcC0+bW0tPmNvbnRleHQuZ21hcF9sb2NrKTsKIAlzeW5jaHJvbml6ZV9yY3UoKTsKIAkvKiBQdXQgcmVmZXJlbmNlICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vcGFnZWF0dHIuYyBiL2FyY2gvczM5MC9tbS9wYWdlYXR0ci5jCmluZGV4IDcxMDRmZmIuLjQ0ZjE1MDMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9wYWdlYXR0ci5jCisrKyBiL2FyY2gvczM5MC9tbS9wYWdlYXR0ci5jCkBAIC0yNTIsNiArMjUyLDggQEAKIAlpbnQgcmMgPSAtRUlOVkFMOwogCXBnZF90ICpwZ2RwOwogCisJaWYgKGFkZHIgPT0gZW5kKQorCQlyZXR1cm4gMDsKIAlpZiAoZW5kID49IE1PRFVMRVNfRU5EKQogCQlyZXR1cm4gLUVJTlZBTDsKIAltdXRleF9sb2NrKCZjcGFfbXV0ZXgpOwpAQCAtMzA3LDExICszMDksMTEgQEAKIAlpbnQgaTsKIAogCWlmICh0ZXN0X2ZhY2lsaXR5KDEzKSkgewotCQlfX3B0ZXBfaXB0ZV9yYW5nZShhZGRyZXNzLCBuciAtIDEsIHB0ZSk7CisJCV9fcHRlcF9pcHRlX3JhbmdlKGFkZHJlc3MsIG5yIC0gMSwgcHRlLCBJUFRFX0dMT0JBTCk7CiAJCXJldHVybjsKIAl9CiAJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspIHsKLQkJX19wdGVwX2lwdGUoYWRkcmVzcywgcHRlKTsKKwkJX19wdGVwX2lwdGUoYWRkcmVzcywgcHRlLCBJUFRFX0dMT0JBTCk7CiAJCWFkZHJlc3MgKz0gUEFHRV9TSVpFOwogCQlwdGUrKzsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vcGd0YWJsZS5jIGIvYXJjaC9zMzkwL21tL3BndGFibGUuYwppbmRleCA1ZjA5MjAxLi43YTE4OTdjIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbW0vcGd0YWJsZS5jCisrKyBiL2FyY2gvczM5MC9tbS9wZ3RhYmxlLmMKQEAgLTM1LDkgKzM1LDkgQEAKIAlhdG9taWNfaW5jKCZtbS0+Y29udGV4dC5mbHVzaF9jb3VudCk7CiAJaWYgKE1BQ0hJTkVfSEFTX1RMQl9MQyAmJgogCSAgICBjcHVtYXNrX2VxdWFsKG1tX2NwdW1hc2sobW0pLCBjcHVtYXNrX29mKHNtcF9wcm9jZXNzb3JfaWQoKSkpKQotCQlfX3B0ZXBfaXB0ZV9sb2NhbChhZGRyLCBwdGVwKTsKKwkJX19wdGVwX2lwdGUoYWRkciwgcHRlcCwgSVBURV9MT0NBTCk7CiAJZWxzZQotCQlfX3B0ZXBfaXB0ZShhZGRyLCBwdGVwKTsKKwkJX19wdGVwX2lwdGUoYWRkciwgcHRlcCwgSVBURV9HTE9CQUwpOwogCWF0b21pY19kZWMoJm1tLT5jb250ZXh0LmZsdXNoX2NvdW50KTsKIAlyZXR1cm4gb2xkOwogfQpAQCAtNTYsNyArNTYsNyBAQAogCQlwdGVfdmFsKCpwdGVwKSB8PSBfUEFHRV9JTlZBTElEOwogCQltbS0+Y29udGV4dC5mbHVzaF9tbSA9IDE7CiAJfSBlbHNlCi0JCV9fcHRlcF9pcHRlKGFkZHIsIHB0ZXApOworCQlfX3B0ZXBfaXB0ZShhZGRyLCBwdGVwLCBJUFRFX0dMT0JBTCk7CiAJYXRvbWljX2RlYygmbW0tPmNvbnRleHQuZmx1c2hfY291bnQpOwogCXJldHVybiBvbGQ7CiB9CkBAIC0zMDEsOSArMzAxLDkgQEAKIAlhdG9taWNfaW5jKCZtbS0+Y29udGV4dC5mbHVzaF9jb3VudCk7CiAJaWYgKE1BQ0hJTkVfSEFTX1RMQl9MQyAmJgogCSAgICBjcHVtYXNrX2VxdWFsKG1tX2NwdW1hc2sobW0pLCBjcHVtYXNrX29mKHNtcF9wcm9jZXNzb3JfaWQoKSkpKQotCQlfX3BtZHBfaWR0ZV9sb2NhbChhZGRyLCBwbWRwKTsKKwkJX19wbWRwX2lkdGUoYWRkciwgcG1kcCwgSURURV9MT0NBTCk7CiAJZWxzZQotCQlfX3BtZHBfaWR0ZShhZGRyLCBwbWRwKTsKKwkJX19wbWRwX2lkdGUoYWRkciwgcG1kcCwgSURURV9HTE9CQUwpOwogCWF0b21pY19kZWMoJm1tLT5jb250ZXh0LmZsdXNoX2NvdW50KTsKIAlyZXR1cm4gb2xkOwogfQpAQCAtMzIyLDcgKzMyMiw3IEBACiAJCXBtZF92YWwoKnBtZHApIHw9IF9TRUdNRU5UX0VOVFJZX0lOVkFMSUQ7CiAJCW1tLT5jb250ZXh0LmZsdXNoX21tID0gMTsKIAl9IGVsc2UgaWYgKE1BQ0hJTkVfSEFTX0lEVEUpCi0JCV9fcG1kcF9pZHRlKGFkZHIsIHBtZHApOworCQlfX3BtZHBfaWR0ZShhZGRyLCBwbWRwLCBJRFRFX0dMT0JBTCk7CiAJZWxzZQogCQlfX3BtZHBfY3NwKHBtZHApOwogCWF0b21pY19kZWMoJm1tLT5jb250ZXh0LmZsdXNoX2NvdW50KTsKQEAgLTM3NCw5ICszNzQsOSBAQAogCWF0b21pY19pbmMoJm1tLT5jb250ZXh0LmZsdXNoX2NvdW50KTsKIAlpZiAoTUFDSElORV9IQVNfVExCX0xDICYmCiAJICAgIGNwdW1hc2tfZXF1YWwobW1fY3B1bWFzayhtbSksIGNwdW1hc2tfb2Yoc21wX3Byb2Nlc3Nvcl9pZCgpKSkpCi0JCV9fcHVkcF9pZHRlX2xvY2FsKGFkZHIsIHB1ZHApOworCQlfX3B1ZHBfaWR0ZShhZGRyLCBwdWRwLCBJRFRFX0xPQ0FMKTsKIAllbHNlCi0JCV9fcHVkcF9pZHRlKGFkZHIsIHB1ZHApOworCQlfX3B1ZHBfaWR0ZShhZGRyLCBwdWRwLCBJRFRFX0dMT0JBTCk7CiAJYXRvbWljX2RlYygmbW0tPmNvbnRleHQuZmx1c2hfY291bnQpOwogCXJldHVybiBvbGQ7CiB9CkBAIC02MjAsNyArNjIwLDcgQEAKIAlwdGUgPSAqcHRlcDsKIAlpZiAoZGlydHkgJiYgKHB0ZV92YWwocHRlKSAmIF9QQUdFX1BSRVNFTlQpKSB7CiAJCXBnc3RlID0gcGdzdGVfcHRlX25vdGlmeShtbSwgYWRkciwgcHRlcCwgcGdzdGUpOwotCQlfX3B0ZXBfaXB0ZShhZGRyLCBwdGVwKTsKKwkJX19wdGVwX2lwdGUoYWRkciwgcHRlcCwgSVBURV9HTE9CQUwpOwogCQlpZiAoTUFDSElORV9IQVNfRVNPUCB8fCAhKHB0ZV92YWwocHRlKSAmIF9QQUdFX1dSSVRFKSkKIAkJCXB0ZV92YWwocHRlKSB8PSBfUEFHRV9QUk9URUNUOwogCQllbHNlCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvcGNpL3BjaS5jIGIvYXJjaC9zMzkwL3BjaS9wY2kuYwppbmRleCA4NzFhZjc1Li4xNWZmYzE5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvcGNpL3BjaS5jCisrKyBiL2FyY2gvczM5MC9wY2kvcGNpLmMKQEAgLTg1NCw2ICs4NTQsMTUgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHpwY2lfc3RvcF9kZXZpY2UpOwogCitpbnQgenBjaV9yZXBvcnRfZXJyb3Ioc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCSAgICAgIHN0cnVjdCB6cGNpX3JlcG9ydF9lcnJvcl9oZWFkZXIgKnJlcG9ydCkKK3sKKwlzdHJ1Y3QgenBjaV9kZXYgKnpkZXYgPSB0b196cGNpKHBkZXYpOworCisJcmV0dXJuIHNjbHBfcGNpX3JlcG9ydChyZXBvcnQsIHpkZXYtPmZoLCB6ZGV2LT5maWQpOworfQorRVhQT1JUX1NZTUJPTCh6cGNpX3JlcG9ydF9lcnJvcik7CisKIHN0YXRpYyBpbmxpbmUgaW50IGJhcnNpemUodTggc2l6ZSkKIHsKIAlyZXR1cm4gKHNpemUpID8gKDEgPDwgc2l6ZSkgPj4gMTAgOiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL3BjaS9wY2lfZG1hLmMgYi9hcmNoL3MzOTAvcGNpL3BjaV9kbWEuYwppbmRleCA3Mjk3ZmNlLi43MzUwYzhiIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvcGNpL3BjaV9kbWEuYworKysgYi9hcmNoL3MzOTAvcGNpL3BjaV9kbWEuYwpAQCAtMTI5LDEyICsxMjksMTEgQEAKIAkJZW50cnlfY2xyX3Byb3RlY3RlZChlbnRyeSk7CiB9CiAKLXN0YXRpYyBpbnQgZG1hX3VwZGF0ZV90cmFucyhzdHJ1Y3QgenBjaV9kZXYgKnpkZXYsIHVuc2lnbmVkIGxvbmcgcGEsCi0JCQkgICAgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3N0YXRpYyBpbnQgX19kbWFfdXBkYXRlX3RyYW5zKHN0cnVjdCB6cGNpX2RldiAqemRldiwgdW5zaWduZWQgbG9uZyBwYSwKKwkJCSAgICAgIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCiB7CiAJdW5zaWduZWQgaW50IG5yX3BhZ2VzID0gUEFHRV9BTElHTihzaXplKSA+PiBQQUdFX1NISUZUOwogCXU4ICpwYWdlX2FkZHIgPSAodTggKikgKHBhICYgUEFHRV9NQVNLKTsKLQlkbWFfYWRkcl90IHN0YXJ0X2RtYV9hZGRyID0gZG1hX2FkZHI7CiAJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyAqZW50cnk7CiAJaW50IGksIHJjID0gMDsKQEAgLTE0NSw3ICsxNDQsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZ6ZGV2LT5kbWFfdGFibGVfbG9jaywgaXJxX2ZsYWdzKTsKIAlpZiAoIXpkZXYtPmRtYV90YWJsZSkgewogCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gbm9fcmVmcmVzaDsKKwkJZ290byBvdXRfdW5sb2NrOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBucl9wYWdlczsgaSsrKSB7CkBAIC0xNTksMjAgKzE1OCw2IEBACiAJCWRtYV9hZGRyICs9IFBBR0VfU0laRTsKIAl9CiAKLQkvKgotCSAqIFdpdGggemRldi0+dGxiX3JlZnJlc2ggPT0gMCwgcnBjaXQgaXMgbm90IHJlcXVpcmVkIHRvIGVzdGFibGlzaCBuZXcKLQkgKiB0cmFuc2xhdGlvbnMgd2hlbiBwcmV2aW91c2x5IGludmFsaWQgdHJhbnNsYXRpb24tdGFibGUgZW50cmllcyBhcmUKLQkgKiB2YWxpZGF0ZWQuIFdpdGggbGF6eSB1bm1hcCwgaXQgYWxzbyBpcyBza2lwcGVkIGZvciBwcmV2aW91c2x5IHZhbGlkCi0JICogZW50cmllcywgYnV0IGEgZ2xvYmFsIHJwY2l0IGlzIHRoZW4gcmVxdWlyZWQgYmVmb3JlIGFueSBhZGRyZXNzIGNhbgotCSAqIGJlIHJlLXVzZWQsIGkuZS4gYWZ0ZXIgZWFjaCBpb21tdSBiaXRtYXAgd3JhcC1hcm91bmQuCi0JICovCi0JaWYgKCF6ZGV2LT50bGJfcmVmcmVzaCAmJgotCQkJKCFzMzkwX2lvbW11X3N0cmljdCB8fAotCQkJKChmbGFncyAmIFpQQ0lfUFRFX1ZBTElEX01BU0spID09IFpQQ0lfUFRFX1ZBTElEKSkpCi0JCWdvdG8gbm9fcmVmcmVzaDsKLQotCXJjID0genBjaV9yZWZyZXNoX3RyYW5zKCh1NjQpIHpkZXYtPmZoIDw8IDMyLCBzdGFydF9kbWFfYWRkciwKLQkJCQlucl9wYWdlcyAqIFBBR0VfU0laRSk7CiB1bmRvX2NwdV90cmFuczoKIAlpZiAocmMgJiYgKChmbGFncyAmIFpQQ0lfUFRFX1ZBTElEX01BU0spID09IFpQQ0lfUFRFX1ZBTElEKSkgewogCQlmbGFncyA9IFpQQ0lfUFRFX0lOVkFMSUQ7CkBAIC0xODUsMTIgKzE3MCw0NiBAQAogCQkJZG1hX3VwZGF0ZV9jcHVfdHJhbnMoZW50cnksIHBhZ2VfYWRkciwgZmxhZ3MpOwogCQl9CiAJfQotCi1ub19yZWZyZXNoOgorb3V0X3VubG9jazoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6ZGV2LT5kbWFfdGFibGVfbG9jaywgaXJxX2ZsYWdzKTsKIAlyZXR1cm4gcmM7CiB9CiAKK3N0YXRpYyBpbnQgX19kbWFfcHVyZ2VfdGxiKHN0cnVjdCB6cGNpX2RldiAqemRldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwKKwkJCSAgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJLyoKKwkgKiBXaXRoIHpkZXYtPnRsYl9yZWZyZXNoID09IDAsIHJwY2l0IGlzIG5vdCByZXF1aXJlZCB0byBlc3RhYmxpc2ggbmV3CisJICogdHJhbnNsYXRpb25zIHdoZW4gcHJldmlvdXNseSBpbnZhbGlkIHRyYW5zbGF0aW9uLXRhYmxlIGVudHJpZXMgYXJlCisJICogdmFsaWRhdGVkLiBXaXRoIGxhenkgdW5tYXAsIGl0IGFsc28gaXMgc2tpcHBlZCBmb3IgcHJldmlvdXNseSB2YWxpZAorCSAqIGVudHJpZXMsIGJ1dCBhIGdsb2JhbCBycGNpdCBpcyB0aGVuIHJlcXVpcmVkIGJlZm9yZSBhbnkgYWRkcmVzcyBjYW4KKwkgKiBiZSByZS11c2VkLCBpLmUuIGFmdGVyIGVhY2ggaW9tbXUgYml0bWFwIHdyYXAtYXJvdW5kLgorCSAqLworCWlmICghemRldi0+dGxiX3JlZnJlc2ggJiYKKwkJCSghczM5MF9pb21tdV9zdHJpY3QgfHwKKwkJCSgoZmxhZ3MgJiBaUENJX1BURV9WQUxJRF9NQVNLKSA9PSBaUENJX1BURV9WQUxJRCkpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiB6cGNpX3JlZnJlc2hfdHJhbnMoKHU2NCkgemRldi0+ZmggPDwgMzIsIGRtYV9hZGRyLAorCQkJCSAgUEFHRV9BTElHTihzaXplKSk7Cit9CisKK3N0YXRpYyBpbnQgZG1hX3VwZGF0ZV90cmFucyhzdHJ1Y3QgenBjaV9kZXYgKnpkZXYsIHVuc2lnbmVkIGxvbmcgcGEsCisJCQkgICAgZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlpbnQgcmM7CisKKwlyYyA9IF9fZG1hX3VwZGF0ZV90cmFucyh6ZGV2LCBwYSwgZG1hX2FkZHIsIHNpemUsIGZsYWdzKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gX19kbWFfcHVyZ2VfdGxiKHpkZXYsIGRtYV9hZGRyLCBzaXplLCBmbGFncyk7CisJaWYgKHJjICYmICgoZmxhZ3MgJiBaUENJX1BURV9WQUxJRF9NQVNLKSA9PSBaUENJX1BURV9WQUxJRCkpCisJCV9fZG1hX3VwZGF0ZV90cmFucyh6ZGV2LCBwYSwgZG1hX2FkZHIsIHNpemUsIFpQQ0lfUFRFX0lOVkFMSUQpOworCisJcmV0dXJuIHJjOworfQorCiB2b2lkIGRtYV9mcmVlX3NlZ190YWJsZSh1bnNpZ25lZCBsb25nIGVudHJ5KQogewogCXVuc2lnbmVkIGxvbmcgKnN0byA9IGdldF9ydF9zdG8oZW50cnkpOwpAQCAtMjMwLDQ1ICsyNDksNTQgQEAKIAkJCQlib3VuZGFyeV9zaXplLCAwKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgZG1hX2FsbG9jX2lvbW11KHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHNpemUpCitzdGF0aWMgZG1hX2FkZHJfdCBkbWFfYWxsb2NfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBzaXplKQogewogCXN0cnVjdCB6cGNpX2RldiAqemRldiA9IHRvX3pwY2kodG9fcGNpX2RldihkZXYpKTsKIAl1bnNpZ25lZCBsb25nIG9mZnNldCwgZmxhZ3M7Ci0JaW50IHdyYXAgPSAwOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnpkZXYtPmlvbW11X2JpdG1hcF9sb2NrLCBmbGFncyk7CiAJb2Zmc2V0ID0gX19kbWFfYWxsb2NfaW9tbXUoZGV2LCB6ZGV2LT5uZXh0X2JpdCwgc2l6ZSk7CiAJaWYgKG9mZnNldCA9PSAtMSkgeworCQlpZiAoIXpkZXYtPnRsYl9yZWZyZXNoICYmICFzMzkwX2lvbW11X3N0cmljdCkgeworCQkJLyogZ2xvYmFsIGZsdXNoIGJlZm9yZSBETUEgYWRkcmVzc2VzIGFyZSByZXVzZWQgKi8KKwkJCWlmICh6cGNpX3JlZnJlc2hfZ2xvYmFsKHpkZXYpKQorCQkJCWdvdG8gb3V0X2Vycm9yOworCisJCQliaXRtYXBfYW5kbm90KHpkZXYtPmlvbW11X2JpdG1hcCwgemRldi0+aW9tbXVfYml0bWFwLAorCQkJCSAgICAgIHpkZXYtPmxhenlfYml0bWFwLCB6ZGV2LT5pb21tdV9wYWdlcyk7CisJCQliaXRtYXBfemVybyh6ZGV2LT5sYXp5X2JpdG1hcCwgemRldi0+aW9tbXVfcGFnZXMpOworCQl9CiAJCS8qIHdyYXAtYXJvdW5kICovCiAJCW9mZnNldCA9IF9fZG1hX2FsbG9jX2lvbW11KGRldiwgMCwgc2l6ZSk7Ci0JCXdyYXAgPSAxOworCQlpZiAob2Zmc2V0ID09IC0xKQorCQkJZ290byBvdXRfZXJyb3I7CiAJfQotCi0JaWYgKG9mZnNldCAhPSAtMSkgewotCQl6ZGV2LT5uZXh0X2JpdCA9IG9mZnNldCArIHNpemU7Ci0JCWlmICghemRldi0+dGxiX3JlZnJlc2ggJiYgIXMzOTBfaW9tbXVfc3RyaWN0ICYmIHdyYXApCi0JCQkvKiBnbG9iYWwgZmx1c2ggYWZ0ZXIgd3JhcC1hcm91bmQgd2l0aCBsYXp5IHVubWFwICovCi0JCQl6cGNpX3JlZnJlc2hfZ2xvYmFsKHpkZXYpOwotCX0KKwl6ZGV2LT5uZXh0X2JpdCA9IG9mZnNldCArIHNpemU7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmemRldi0+aW9tbXVfYml0bWFwX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gb2Zmc2V0OworCisJcmV0dXJuIHpkZXYtPnN0YXJ0X2RtYSArIG9mZnNldCAqIFBBR0VfU0laRTsKKworb3V0X2Vycm9yOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpkZXYtPmlvbW11X2JpdG1hcF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIERNQV9FUlJPUl9DT0RFOwogfQogCi1zdGF0aWMgdm9pZCBkbWFfZnJlZV9pb21tdShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgc2l6ZSkKK3N0YXRpYyB2b2lkIGRtYV9mcmVlX2FkZHJlc3Moc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLCBpbnQgc2l6ZSkKIHsKIAlzdHJ1Y3QgenBjaV9kZXYgKnpkZXYgPSB0b196cGNpKHRvX3BjaV9kZXYoZGV2KSk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBvZmZzZXQ7CisKKwlvZmZzZXQgPSAoZG1hX2FkZHIgLSB6ZGV2LT5zdGFydF9kbWEpID4+IFBBR0VfU0hJRlQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmemRldi0+aW9tbXVfYml0bWFwX2xvY2ssIGZsYWdzKTsKIAlpZiAoIXpkZXYtPmlvbW11X2JpdG1hcCkKIAkJZ290byBvdXQ7Ci0JYml0bWFwX2NsZWFyKHpkZXYtPmlvbW11X2JpdG1hcCwgb2Zmc2V0LCBzaXplKTsKLQkvKgotCSAqIExhenkgZmx1c2ggZm9yIHVubWFwOiBuZWVkIHRvIG1vdmUgbmV4dF9iaXQgdG8gYXZvaWQgYWRkcmVzcyByZS11c2UKLQkgKiB1bnRpbCB3cmFwLWFyb3VuZC4KLQkgKi8KLQlpZiAoIXMzOTBfaW9tbXVfc3RyaWN0ICYmIG9mZnNldCA+PSB6ZGV2LT5uZXh0X2JpdCkKLQkJemRldi0+bmV4dF9iaXQgPSBvZmZzZXQgKyBzaXplOworCisJaWYgKHpkZXYtPnRsYl9yZWZyZXNoIHx8IHMzOTBfaW9tbXVfc3RyaWN0KQorCQliaXRtYXBfY2xlYXIoemRldi0+aW9tbXVfYml0bWFwLCBvZmZzZXQsIHNpemUpOworCWVsc2UKKwkJYml0bWFwX3NldCh6ZGV2LT5sYXp5X2JpdG1hcCwgb2Zmc2V0LCBzaXplKTsKKwogb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpkZXYtPmlvbW11X2JpdG1hcF9sb2NrLCBmbGFncyk7CiB9CkBAIC0yODksMTYgKzMxNywxNiBAQAogCQkJCSAgICAgdW5zaWduZWQgbG9uZyBhdHRycykKIHsKIAlzdHJ1Y3QgenBjaV9kZXYgKnpkZXYgPSB0b196cGNpKHRvX3BjaV9kZXYoZGV2KSk7Ci0JdW5zaWduZWQgbG9uZyBucl9wYWdlcywgaW9tbXVfcGFnZV9pbmRleDsKIAl1bnNpZ25lZCBsb25nIHBhID0gcGFnZV90b19waHlzKHBhZ2UpICsgb2Zmc2V0OwogCWludCBmbGFncyA9IFpQQ0lfUFRFX1ZBTElEOworCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXM7CiAJZG1hX2FkZHJfdCBkbWFfYWRkcjsKIAlpbnQgcmV0OwogCiAJLyogVGhpcyByb3VuZHMgdXAgbnVtYmVyIG9mIHBhZ2VzIGJhc2VkIG9uIHNpemUgYW5kIG9mZnNldCAqLwogCW5yX3BhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKHBhLCBzaXplLCBQQUdFX1NJWkUpOwotCWlvbW11X3BhZ2VfaW5kZXggPSBkbWFfYWxsb2NfaW9tbXUoZGV2LCBucl9wYWdlcyk7Ci0JaWYgKGlvbW11X3BhZ2VfaW5kZXggPT0gLTEpIHsKKwlkbWFfYWRkciA9IGRtYV9hbGxvY19hZGRyZXNzKGRldiwgbnJfcGFnZXMpOworCWlmIChkbWFfYWRkciA9PSBETUFfRVJST1JfQ09ERSkgewogCQlyZXQgPSAtRU5PU1BDOwogCQlnb3RvIG91dF9lcnI7CiAJfQpAQCAtMzA2LDEyICszMzQsNiBAQAogCS8qIFVzZSByb3VuZGVkIHVwIHNpemUgKi8KIAlzaXplID0gbnJfcGFnZXMgKiBQQUdFX1NJWkU7CiAKLQlkbWFfYWRkciA9IHpkZXYtPnN0YXJ0X2RtYSArIGlvbW11X3BhZ2VfaW5kZXggKiBQQUdFX1NJWkU7Ci0JaWYgKGRtYV9hZGRyICsgc2l6ZSA+IHpkZXYtPmVuZF9kbWEpIHsKLQkJcmV0ID0gLUVSQU5HRTsKLQkJZ290byBvdXRfZnJlZTsKLQl9Ci0KIAlpZiAoZGlyZWN0aW9uID09IERNQV9OT05FIHx8IGRpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKQogCQlmbGFncyB8PSBaUENJX1RBQkxFX1BST1RFQ1RFRDsKIApAQCAtMzIzLDcgKzM0NSw3IEBACiAJcmV0dXJuIGRtYV9hZGRyICsgKG9mZnNldCAmIH5QQUdFX01BU0spOwogCiBvdXRfZnJlZToKLQlkbWFfZnJlZV9pb21tdShkZXYsIGlvbW11X3BhZ2VfaW5kZXgsIG5yX3BhZ2VzKTsKKwlkbWFfZnJlZV9hZGRyZXNzKGRldiwgZG1hX2FkZHIsIG5yX3BhZ2VzKTsKIG91dF9lcnI6CiAJenBjaV9lcnIoIm1hcCBlcnJvcjpcbiIpOwogCXpwY2lfZXJyX2RtYShyZXQsIHBhKTsKQEAgLTMzNSw3ICszNTcsNiBAQAogCQkJCSB1bnNpZ25lZCBsb25nIGF0dHJzKQogewogCXN0cnVjdCB6cGNpX2RldiAqemRldiA9IHRvX3pwY2kodG9fcGNpX2RldihkZXYpKTsKLQl1bnNpZ25lZCBsb25nIGlvbW11X3BhZ2VfaW5kZXg7CiAJaW50IG5wYWdlcywgcmV0OwogCiAJbnBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKGRtYV9hZGRyLCBzaXplLCBQQUdFX1NJWkUpOwpAQCAtMzQ5LDggKzM3MCw3IEBACiAJfQogCiAJYXRvbWljNjRfYWRkKG5wYWdlcywgJnpkZXYtPnVubWFwcGVkX3BhZ2VzKTsKLQlpb21tdV9wYWdlX2luZGV4ID0gKGRtYV9hZGRyIC0gemRldi0+c3RhcnRfZG1hKSA+PiBQQUdFX1NISUZUOwotCWRtYV9mcmVlX2lvbW11KGRldiwgaW9tbXVfcGFnZV9pbmRleCwgbnBhZ2VzKTsKKwlkbWFfZnJlZV9hZGRyZXNzKGRldiwgZG1hX2FkZHIsIG5wYWdlcyk7CiB9CiAKIHN0YXRpYyB2b2lkICpzMzkwX2RtYV9hbGxvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLApAQCAtMzk0LDM3ICs0MTQsOTggQEAKIAlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSBwYSwgZ2V0X29yZGVyKHNpemUpKTsKIH0KIAorLyogTWFwIGEgc2VnbWVudCBpbnRvIGEgY29udGlndW91cyBkbWEgYWRkcmVzcyBhcmVhICovCitzdGF0aWMgaW50IF9fczM5MF9kbWFfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCSAgICAgc2l6ZV90IHNpemUsIGRtYV9hZGRyX3QgKmhhbmRsZSwKKwkJCSAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCXN0cnVjdCB6cGNpX2RldiAqemRldiA9IHRvX3pwY2kodG9fcGNpX2RldihkZXYpKTsKKwlkbWFfYWRkcl90IGRtYV9hZGRyX2Jhc2UsIGRtYV9hZGRyOworCWludCBmbGFncyA9IFpQQ0lfUFRFX1ZBTElEOworCXN0cnVjdCBzY2F0dGVybGlzdCAqczsKKwl1bnNpZ25lZCBsb25nIHBhOworCWludCByZXQ7CisKKwlzaXplID0gUEFHRV9BTElHTihzaXplKTsKKwlkbWFfYWRkcl9iYXNlID0gZG1hX2FsbG9jX2FkZHJlc3MoZGV2LCBzaXplID4+IFBBR0VfU0hJRlQpOworCWlmIChkbWFfYWRkcl9iYXNlID09IERNQV9FUlJPUl9DT0RFKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRtYV9hZGRyID0gZG1hX2FkZHJfYmFzZTsKKwlpZiAoZGlyID09IERNQV9OT05FIHx8IGRpciA9PSBETUFfVE9fREVWSUNFKQorCQlmbGFncyB8PSBaUENJX1RBQkxFX1BST1RFQ1RFRDsKKworCWZvciAocyA9IHNnOyBkbWFfYWRkciA8IGRtYV9hZGRyX2Jhc2UgKyBzaXplOyBzID0gc2dfbmV4dChzKSkgeworCQlwYSA9IHBhZ2VfdG9fcGh5cyhzZ19wYWdlKHMpKSArIHMtPm9mZnNldDsKKwkJcmV0ID0gX19kbWFfdXBkYXRlX3RyYW5zKHpkZXYsIHBhLCBkbWFfYWRkciwgcy0+bGVuZ3RoLCBmbGFncyk7CisJCWlmIChyZXQpCisJCQlnb3RvIHVubWFwOworCisJCWRtYV9hZGRyICs9IHMtPmxlbmd0aDsKKwl9CisJcmV0ID0gX19kbWFfcHVyZ2VfdGxiKHpkZXYsIGRtYV9hZGRyX2Jhc2UsIHNpemUsIGZsYWdzKTsKKwlpZiAocmV0KQorCQlnb3RvIHVubWFwOworCisJKmhhbmRsZSA9IGRtYV9hZGRyX2Jhc2U7CisJYXRvbWljNjRfYWRkKHNpemUgPj4gUEFHRV9TSElGVCwgJnpkZXYtPm1hcHBlZF9wYWdlcyk7CisKKwlyZXR1cm4gcmV0OworCit1bm1hcDoKKwlkbWFfdXBkYXRlX3RyYW5zKHpkZXYsIDAsIGRtYV9hZGRyX2Jhc2UsIGRtYV9hZGRyIC0gZG1hX2FkZHJfYmFzZSwKKwkJCSBaUENJX1BURV9JTlZBTElEKTsKKwlkbWFfZnJlZV9hZGRyZXNzKGRldiwgZG1hX2FkZHJfYmFzZSwgc2l6ZSA+PiBQQUdFX1NISUZUKTsKKwl6cGNpX2VycigibWFwIGVycm9yOlxuIik7CisJenBjaV9lcnJfZG1hKHJldCwgcGEpOworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgczM5MF9kbWFfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKIAkJCSAgIGludCBucl9lbGVtZW50cywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLAogCQkJICAgdW5zaWduZWQgbG9uZyBhdHRycykKIHsKLQlpbnQgbWFwcGVkX2VsZW1lbnRzID0gMDsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnM7Ci0JaW50IGk7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzID0gc2csICpzdGFydCA9IHNnLCAqZG1hID0gc2c7CisJdW5zaWduZWQgaW50IG1heCA9IGRtYV9nZXRfbWF4X3NlZ19zaXplKGRldik7CisJdW5zaWduZWQgaW50IHNpemUgPSBzLT5vZmZzZXQgKyBzLT5sZW5ndGg7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IHMtPm9mZnNldDsKKwlpbnQgY291bnQgPSAwLCBpOwogCi0JZm9yX2VhY2hfc2coc2csIHMsIG5yX2VsZW1lbnRzLCBpKSB7Ci0JCXN0cnVjdCBwYWdlICpwYWdlID0gc2dfcGFnZShzKTsKLQkJcy0+ZG1hX2FkZHJlc3MgPSBzMzkwX2RtYV9tYXBfcGFnZXMoZGV2LCBwYWdlLCBzLT5vZmZzZXQsCi0JCQkJCQkgICAgcy0+bGVuZ3RoLCBkaXIsIDApOwotCQlpZiAoIWRtYV9tYXBwaW5nX2Vycm9yKGRldiwgcy0+ZG1hX2FkZHJlc3MpKSB7Ci0JCQlzLT5kbWFfbGVuZ3RoID0gcy0+bGVuZ3RoOwotCQkJbWFwcGVkX2VsZW1lbnRzKys7Ci0JCX0gZWxzZQotCQkJZ290byB1bm1hcDsKLQl9Ci1vdXQ6Ci0JcmV0dXJuIG1hcHBlZF9lbGVtZW50czsKKwlmb3IgKGkgPSAxOyBpIDwgbnJfZWxlbWVudHM7IGkrKykgeworCQlzID0gc2dfbmV4dChzKTsKIAotdW5tYXA6Ci0JZm9yX2VhY2hfc2coc2csIHMsIG1hcHBlZF9lbGVtZW50cywgaSkgewotCQlpZiAocy0+ZG1hX2FkZHJlc3MpCi0JCQlzMzkwX2RtYV91bm1hcF9wYWdlcyhkZXYsIHMtPmRtYV9hZGRyZXNzLCBzLT5kbWFfbGVuZ3RoLAotCQkJCQkgICAgIGRpciwgMCk7Ci0JCXMtPmRtYV9hZGRyZXNzID0gMDsKKwkJcy0+ZG1hX2FkZHJlc3MgPSBETUFfRVJST1JfQ09ERTsKIAkJcy0+ZG1hX2xlbmd0aCA9IDA7CisKKwkJaWYgKHMtPm9mZnNldCB8fCAoc2l6ZSAmIH5QQUdFX01BU0spIHx8CisJCSAgICBzaXplICsgcy0+bGVuZ3RoID4gbWF4KSB7CisJCQlpZiAoX19zMzkwX2RtYV9tYXBfc2coZGV2LCBzdGFydCwgc2l6ZSwKKwkJCQkJICAgICAgJmRtYS0+ZG1hX2FkZHJlc3MsIGRpcikpCisJCQkJZ290byB1bm1hcDsKKworCQkJZG1hLT5kbWFfYWRkcmVzcyArPSBvZmZzZXQ7CisJCQlkbWEtPmRtYV9sZW5ndGggPSBzaXplIC0gb2Zmc2V0OworCisJCQlzaXplID0gb2Zmc2V0ID0gcy0+b2Zmc2V0OworCQkJc3RhcnQgPSBzOworCQkJZG1hID0gc2dfbmV4dChkbWEpOworCQkJY291bnQrKzsKKwkJfQorCQlzaXplICs9IHMtPmxlbmd0aDsKIAl9Ci0JbWFwcGVkX2VsZW1lbnRzID0gMDsKLQlnb3RvIG91dDsKKwlpZiAoX19zMzkwX2RtYV9tYXBfc2coZGV2LCBzdGFydCwgc2l6ZSwgJmRtYS0+ZG1hX2FkZHJlc3MsIGRpcikpCisJCWdvdG8gdW5tYXA7CisKKwlkbWEtPmRtYV9hZGRyZXNzICs9IG9mZnNldDsKKwlkbWEtPmRtYV9sZW5ndGggPSBzaXplIC0gb2Zmc2V0OworCisJcmV0dXJuIGNvdW50ICsgMTsKK3VubWFwOgorCWZvcl9lYWNoX3NnKHNnLCBzLCBjb3VudCwgaSkKKwkJczM5MF9kbWFfdW5tYXBfcGFnZXMoZGV2LCBzZ19kbWFfYWRkcmVzcyhzKSwgc2dfZG1hX2xlbihzKSwKKwkJCQkgICAgIGRpciwgYXR0cnMpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHMzOTBfZG1hX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKQEAgLTQzNSw4ICs1MTYsOSBAQAogCWludCBpOwogCiAJZm9yX2VhY2hfc2coc2csIHMsIG5yX2VsZW1lbnRzLCBpKSB7Ci0JCXMzOTBfZG1hX3VubWFwX3BhZ2VzKGRldiwgcy0+ZG1hX2FkZHJlc3MsIHMtPmRtYV9sZW5ndGgsIGRpciwKLQkJCQkgICAgIDApOworCQlpZiAocy0+ZG1hX2xlbmd0aCkKKwkJCXMzOTBfZG1hX3VubWFwX3BhZ2VzKGRldiwgcy0+ZG1hX2FkZHJlc3MsIHMtPmRtYV9sZW5ndGgsCisJCQkJCSAgICAgZGlyLCBhdHRycyk7CiAJCXMtPmRtYV9hZGRyZXNzID0gMDsKIAkJcy0+ZG1hX2xlbmd0aCA9IDA7CiAJfQpAQCAtNDgyLDcgKzU2NCwxNCBAQAogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gZnJlZV9kbWFfdGFibGU7CiAJfQorCWlmICghemRldi0+dGxiX3JlZnJlc2ggJiYgIXMzOTBfaW9tbXVfc3RyaWN0KSB7CisJCXpkZXYtPmxhenlfYml0bWFwID0gdnphbGxvYyh6ZGV2LT5pb21tdV9wYWdlcyAvIDgpOworCQlpZiAoIXpkZXYtPmxhenlfYml0bWFwKSB7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIGZyZWVfYml0bWFwOworCQl9CiAKKwl9CiAJcmMgPSB6cGNpX3JlZ2lzdGVyX2lvYXQoemRldiwgMCwgemRldi0+c3RhcnRfZG1hLCB6ZGV2LT5lbmRfZG1hLAogCQkJCSh1NjQpIHpkZXYtPmRtYV90YWJsZSk7CiAJaWYgKHJjKQpAQCAtNDkyLDYgKzU4MSw4IEBACiBmcmVlX2JpdG1hcDoKIAl2ZnJlZSh6ZGV2LT5pb21tdV9iaXRtYXApOwogCXpkZXYtPmlvbW11X2JpdG1hcCA9IE5VTEw7CisJdmZyZWUoemRldi0+bGF6eV9iaXRtYXApOworCXpkZXYtPmxhenlfYml0bWFwID0gTlVMTDsKIGZyZWVfZG1hX3RhYmxlOgogCWRtYV9mcmVlX2NwdV90YWJsZSh6ZGV2LT5kbWFfdGFibGUpOwogCXpkZXYtPmRtYV90YWJsZSA9IE5VTEw7CkBAIC01MTMsNiArNjA0LDkgQEAKIAl6ZGV2LT5kbWFfdGFibGUgPSBOVUxMOwogCXZmcmVlKHpkZXYtPmlvbW11X2JpdG1hcCk7CiAJemRldi0+aW9tbXVfYml0bWFwID0gTlVMTDsKKwl2ZnJlZSh6ZGV2LT5sYXp5X2JpdG1hcCk7CisJemRldi0+bGF6eV9iaXRtYXAgPSBOVUxMOworCiAJemRldi0+bmV4dF9iaXQgPSAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Njb3JlL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gvc2NvcmUvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IDIwYTM1OTEuLjAxYWVjOGMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2NvcmUvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvc2NvcmUvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC0xNjMsNyArMTYzLDcgQEAKIAkJX19nZXRfdXNlcl9hc20odmFsLCAibHciLCBwdHIpOwkJCQlcCiAJCSBicmVhazsJCQkJCQkJXAogCWNhc2UgODogCQkJCQkJCVwKLQkJaWYgKChjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZ2YWwsIHB0ciwgOCkpID09IDApCVwKKwkJaWYgKF9fY29weV9mcm9tX3VzZXIoKHZvaWQgKikmdmFsLCBwdHIsIDgpID09IDApCVwKIAkJCV9fZ3VfZXJyID0gMDsJCQkJCVwKIAkJZWxzZQkJCQkJCQlcCiAJCQlfX2d1X2VyciA9IC1FRkFVTFQ7CQkJCVwKQEAgLTE4OCw2ICsxODgsOCBAQAogCQkJCQkJCQkJXAogCWlmIChsaWtlbHkoYWNjZXNzX29rKFZFUklGWV9SRUFELCBfX2d1X3B0ciwgc2l6ZSkpKQkJXAogCQlfX2dldF91c2VyX2NvbW1vbigoeCksIHNpemUsIF9fZ3VfcHRyKTsJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoeCkgPSAwOwkJCQkJCVwKIAkJCQkJCQkJCVwKIAlfX2d1X2VycjsJCQkJCQkJXAogfSkKQEAgLTIwMSw2ICsyMDMsNyBAQAogCQkiMjpcbiIJCQkJCQkJXAogCQkiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgkJCQlcCiAJCSIzOmxpCSUwLCAlNFxuIgkJCQkJXAorCQkibGkJJTEsIDBcbiIJCQkJCVwKIAkJImoJMmJcbiIJCQkJCQlcCiAJCSIucHJldmlvdXNcbiIJCQkJCQlcCiAJCSIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCQkJCVwKQEAgLTI5OCwzNSArMzAxLDM0IEBACiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKIGNvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIGxlbikKIHsKLQl1bnNpZ25lZCBsb25nIG92ZXI7CisJdW5zaWduZWQgbG9uZyByZXMgPSBsZW47CiAKLQlpZiAoYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcm9tLCBsZW4pKQotCQlyZXR1cm4gX19jb3B5X3RvZnJvbV91c2VyKHRvLCBmcm9tLCBsZW4pOworCWlmIChsaWtlbHkoYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcm9tLCBsZW4pKSkKKwkJcmVzID0gX19jb3B5X3RvZnJvbV91c2VyKHRvLCBmcm9tLCBsZW4pOwogCi0JaWYgKCh1bnNpZ25lZCBsb25nKWZyb20gPCBUQVNLX1NJWkUpIHsKLQkJb3ZlciA9ICh1bnNpZ25lZCBsb25nKWZyb20gKyBsZW4gLSBUQVNLX1NJWkU7Ci0JCXJldHVybiBfX2NvcHlfdG9mcm9tX3VzZXIodG8sIGZyb20sIGxlbiAtIG92ZXIpICsgb3ZlcjsKLQl9Ci0JcmV0dXJuIGxlbjsKKwlpZiAodW5saWtlbHkocmVzKSkKKwkJbWVtc2V0KHRvICsgKGxlbiAtIHJlcyksIDAsIHJlcyk7CisKKwlyZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKIGNvcHlfdG9fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBsZW4pCiB7Ci0JdW5zaWduZWQgbG9uZyBvdmVyOworCWlmIChsaWtlbHkoYWNjZXNzX29rKFZFUklGWV9XUklURSwgdG8sIGxlbikpKQorCQlsZW4gPSBfX2NvcHlfdG9mcm9tX3VzZXIodG8sIGZyb20sIGxlbik7CiAKLQlpZiAoYWNjZXNzX29rKFZFUklGWV9XUklURSwgdG8sIGxlbikpCi0JCXJldHVybiBfX2NvcHlfdG9mcm9tX3VzZXIodG8sIGZyb20sIGxlbik7Ci0KLQlpZiAoKHVuc2lnbmVkIGxvbmcpdG8gPCBUQVNLX1NJWkUpIHsKLQkJb3ZlciA9ICh1bnNpZ25lZCBsb25nKXRvICsgbGVuIC0gVEFTS19TSVpFOwotCQlyZXR1cm4gX19jb3B5X3RvZnJvbV91c2VyKHRvLCBmcm9tLCBsZW4gLSBvdmVyKSArIG92ZXI7Ci0JfQogCXJldHVybiBsZW47CiB9CiAKLSNkZWZpbmUgX19jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbGVuKQlcCi0JCV9fY29weV90b2Zyb21fdXNlcigodG8pLCAoZnJvbSksIChsZW4pKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitfX2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGxlZnQgPSBfX2NvcHlfdG9mcm9tX3VzZXIodG8sIGZyb20sIGxlbik7CisJaWYgKHVubGlrZWx5KGxlZnQpKQorCQltZW1zZXQodG8gKyAobGVuIC0gbGVmdCksIDAsIGxlZnQpOworCXJldHVybiBsZWZ0OworfQogCiAjZGVmaW5lIF9fY29weV90b191c2VyKHRvLCBmcm9tLCBsZW4pCQlcCiAJCV9fY29weV90b2Zyb21fdXNlcigodG8pLCAoZnJvbSksIChsZW4pKQpAQCAtMzQwLDE3ICszNDIsMTcgQEAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwogX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyh2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBsZW4pCiB7Ci0JcmV0dXJuIF9fY29weV9mcm9tX3VzZXIodG8sIGZyb20sIGxlbik7CisJcmV0dXJuIF9fY29weV90b2Zyb21fdXNlcih0bywgZnJvbSwgbGVuKTsKIH0KIAotI2RlZmluZSBfX2NvcHlfaW5fdXNlcih0bywgZnJvbSwgbGVuKQlfX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBsZW4pCisjZGVmaW5lIF9fY29weV9pbl91c2VyKHRvLCBmcm9tLCBsZW4pCV9fY29weV90b2Zyb21fdXNlcih0bywgZnJvbSwgbGVuKQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKIGNvcHlfaW5fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBsZW4pCiB7CiAJaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJvbSwgbGVuKSAmJgogCQkgICAgICBhY2Nlc3Nfb2soVkVSRklUWV9XUklURSwgdG8sIGxlbikpCi0JCXJldHVybiBjb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbGVuKTsKKwkJcmV0dXJuIF9fY29weV90b2Zyb21fdXNlcih0bywgZnJvbSwgbGVuKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vYXRvbWljLWxsc2MuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vYXRvbWljLWxsc2MuaAppbmRleCBjYWVhMmM0Li4xZDE1OWNlIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2F0b21pYy1sbHNjLmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9hdG9taWMtbGxzYy5oCkBAIC02MCw3ICs2MCw3IEBACiAiCW1vdmNvLmwJJTAsIEAlMwkJCQkJXG4iCQlcCiAiCWJmCTFiCQkJCQlcbiIJCVwKICIJc3luY28JCQkJCQlcbiIJCVwKLQk6ICI9JnoiICh0ZW1wKSwgIj0meiIgKHJlcykJCQkJCVwKKwk6ICI9JnoiICh0ZW1wKSwgIj0mciIgKHJlcykJCQkJCVwKIAk6ICJyIiAoaSksICJyIiAoJnYtPmNvdW50ZXIpCQkJCQlcCiAJOiAidCIpOwkJCQkJCQkJXAogCQkJCQkJCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCBhNDk2MzVjLi45MmFkZTc5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtMTUxLDcgKzE1MSwxMCBAQAogCV9fa2VybmVsX3NpemVfdCBfX2NvcHlfc2l6ZSA9IChfX2tlcm5lbF9zaXplX3QpIG47CiAKIAlpZiAoX19jb3B5X3NpemUgJiYgX19hY2Nlc3Nfb2soX19jb3B5X2Zyb20sIF9fY29weV9zaXplKSkKLQkJcmV0dXJuIF9fY29weV91c2VyKHRvLCBmcm9tLCBfX2NvcHlfc2l6ZSk7CisJCV9fY29weV9zaXplID0gX19jb3B5X3VzZXIodG8sIGZyb20sIF9fY29weV9zaXplKTsKKworCWlmICh1bmxpa2VseShfX2NvcHlfc2l6ZSkpCisJCW1lbXNldCh0byArIChuIC0gX19jb3B5X3NpemUpLCAwLCBfX2NvcHlfc2l6ZSk7CiAKIAlyZXR1cm4gX19jb3B5X3NpemU7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3VhY2Nlc3NfNjQuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vdWFjY2Vzc182NC5oCmluZGV4IGMwMTM3NmMuLmNhNTA3M2QgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vdWFjY2Vzc182NC5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vdWFjY2Vzc182NC5oCkBAIC0yNCw2ICsyNCw3IEBACiAjZGVmaW5lIF9fZ2V0X3VzZXJfc2l6ZSh4LHB0cixzaXplLHJldHZhbCkJCQlcCiBkbyB7CQkJCQkJCQlcCiAJcmV0dmFsID0gMDsJCQkJCQlcCisJeCA9IDA7CQkJCQkJCVwKIAlzd2l0Y2ggKHNpemUpIHsJCQkJCQlcCiAJY2FzZSAxOgkJCQkJCQlcCiAJCXJldHZhbCA9IF9fZ2V0X3VzZXJfYXNtX2IoKHZvaWQgKikmeCwJCVwKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NtcC1zaHgzLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zbXAtc2h4My5jCmluZGV4IDgzOTYxMmMuLjBkMzYzN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NtcC1zaHgzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc21wLXNoeDMuYwpAQCAtMTIyLDMyICsxMjIsMTYgQEAKIAlfX3Jhd193cml0ZWwoU1RCQ1JfUkVTRVQsIFNUQkNSX1JFRyhjcHUpKTsKIH0KIAotc3RhdGljIGludAotc2h4M19jcHVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQorc3RhdGljIGludCBzaHgzX2NwdV9wcmVwYXJlKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0JdW5zaWduZWQgaW50IGNwdSA9ICh1bnNpZ25lZCBpbnQpaGNwdTsKLQotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBDUFVfVVBfUFJFUEFSRToKLQkJc2h4M191cGRhdGVfYm9vdF92ZWN0b3IoY3B1KTsKLQkJYnJlYWs7Ci0JY2FzZSBDUFVfT05MSU5FOgotCQlwcl9pbmZvKCJDUFUgJXUgaXMgbm93IG9ubGluZVxuIiwgY3B1KTsKLQkJYnJlYWs7Ci0JY2FzZSBDUFVfREVBRDoKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIE5PVElGWV9PSzsKKwlzaHgzX3VwZGF0ZV9ib290X3ZlY3RvcihjcHUpOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHNoeDNfY3B1X25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsCQk9IHNoeDNfY3B1X2NhbGxiYWNrLAotfTsKLQogc3RhdGljIGludCByZWdpc3Rlcl9zaHgzX2NwdV9ub3RpZmllcih2b2lkKQogewotCXJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmc2h4M19jcHVfbm90aWZpZXIpOworCWNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfU0hfU0gzWF9QUkVQQVJFLCAic2gvc2h4MzpwcmVwYXJlIiwKKwkJCQkgIHNoeDNfY3B1X3ByZXBhcmUsIE5VTEwpOwogCXJldHVybiAwOwogfQogbGF0ZV9pbml0Y2FsbChyZWdpc3Rlcl9zaHgzX2NwdV9ub3RpZmllcik7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9mdHJhY2UuYyBiL2FyY2gvc2gva2VybmVsL2Z0cmFjZS5jCmluZGV4IDM4OTkzZTAuLjUzNzgzOTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2Z0cmFjZS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2Z0cmFjZS5jCkBAIC0xMzksNyArMTM5LDcgQEAKIAkJY2xlYXJfbW9kX2ZsYWcoKTsKIH0KIAotdm9pZCBmdHJhY2Vfbm1pX2VudGVyKHZvaWQpCit2b2lkIGFyY2hfZnRyYWNlX25taV9lbnRlcih2b2lkKQogewogCWlmIChhdG9taWNfaW5jX3JldHVybigmbm1pX3J1bm5pbmcpICYgTU9EX0NPREVfV1JJVEVfRkxBRykgewogCQlzbXBfcm1iKCk7CkBAIC0xNTAsNyArMTUwLDcgQEAKIAlzbXBfbWIoKTsKIH0KIAotdm9pZCBmdHJhY2Vfbm1pX2V4aXQodm9pZCkKK3ZvaWQgYXJjaF9mdHJhY2Vfbm1pX2V4aXQodm9pZCkKIHsKIAkvKiBGaW5pc2ggYWxsIGV4ZWN1dGlvbnMgYmVmb3JlIGNsZWFyaW5nIG5taV9ydW5uaW5nICovCiAJc21wX21iKCk7CkBAIC0zODIsNyArMzgyLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWVyciA9IGZ0cmFjZV9wdXNoX3JldHVybl90cmFjZShvbGQsIHNlbGZfYWRkciwgJnRyYWNlLmRlcHRoLCAwKTsKKwllcnIgPSBmdHJhY2VfcHVzaF9yZXR1cm5fdHJhY2Uob2xkLCBzZWxmX2FkZHIsICZ0cmFjZS5kZXB0aCwgMCwgTlVMTCk7CiAJaWYgKGVyciA9PSAtRUJVU1kpIHsKIAkJX19yYXdfd3JpdGVsKG9sZCwgcGFyZW50KTsKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9LY29uZmlnIGIvYXJjaC9zcGFyYy9LY29uZmlnCmluZGV4IDU5YjA5NjAuLmY1ZDYwZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvS2NvbmZpZworKysgYi9hcmNoL3NwYXJjL0tjb25maWcKQEAgLTU2LDcgKzU2LDYgQEAKIAlkZWZfYm9vbCA2NEJJVAogCXNlbGVjdCBIQVZFX0ZVTkNUSU9OX1RSQUNFUgogCXNlbGVjdCBIQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUgotCXNlbGVjdCBIQVZFX0ZVTkNUSU9OX0dSQVBIX0ZQX1RFU1QKIAlzZWxlY3QgSEFWRV9LUkVUUFJPQkVTCiAJc2VsZWN0IEhBVkVfS1BST0JFUwogCXNlbGVjdCBIQVZFX1JDVV9UQUJMRV9GUkVFIGlmIFNNUApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9mdHJhY2UuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZnRyYWNlLmgKaW5kZXggMzE5MmE4ZS4uNjI3NTVhMyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9mdHJhY2UuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2Z0cmFjZS5oCkBAIC05LDYgKzksMTAgQEAKIHZvaWQgX21jb3VudCh2b2lkKTsKICNlbmRpZgogCisjZW5kaWYgLyogQ09ORklHX01DT1VOVCAqLworCisjaWYgZGVmaW5lZChDT05GSUdfU1BBUkM2NCkgJiYgIWRlZmluZWQoQ0NfVVNFX0ZFTlRSWSkKKyNkZWZpbmUgSEFWRV9GVU5DVElPTl9HUkFQSF9GUF9URVNUCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19EWU5BTUlDX0ZUUkFDRQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9oeXBlcnZpc29yLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2h5cGVydmlzb3IuaAppbmRleCBmNWI2NTM3Li42NjZkNWJhIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2h5cGVydmlzb3IuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2h5cGVydmlzb3IuaApAQCAtMTc0NCw2ICsxNzQ0LDcgQEAKIAogI2RlZmluZSBIVl9QQ0lfTUFQX0FUVFJfUkVBRAkJMHgwMQogI2RlZmluZSBIVl9QQ0lfTUFQX0FUVFJfV1JJVEUJCTB4MDIKKyNkZWZpbmUgSFZfUENJX01BUF9BVFRSX1JFTEFYRURfT1JERVIJMHgwNAogCiAjZGVmaW5lIEhWX1BDSV9ERVZJQ0VfQlVJTEQoYixkLGYpCVwKIAkoKCgoYikgJiAweGZmKSA8PCAxNikgfCBcCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BhZ2VfNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGFnZV82NC5oCmluZGV4IDhjMmE4YzkuLmMxMjYzZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGFnZV82NC5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vcGFnZV82NC5oCkBAIC0yNSw2ICsyNSw3IEBACiAjZGVmaW5lIEhQQUdFX01BU0sJCSh+KEhQQUdFX1NJWkUgLSAxVUwpKQogI2RlZmluZSBIVUdFVExCX1BBR0VfT1JERVIJKEhQQUdFX1NISUZUIC0gUEFHRV9TSElGVCkKICNkZWZpbmUgSEFWRV9BUkNIX0hVR0VUTEJfVU5NQVBQRURfQVJFQQorI2RlZmluZSBSRUFMX0hQQUdFX1BFUl9IUEFHRQkoX0FDKDEsVUwpIDw8IChIUEFHRV9TSElGVCAtIFJFQUxfSFBBR0VfU0hJRlQpKQogI2VuZGlmCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NtcF82NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zbXBfNjQuaAppbmRleCAyNmQ5ZTc3Li5jZTIyMzNmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NtcF82NC5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc21wXzY0LmgKQEAgLTQzLDYgKzQzLDcgQEAKIGludCBoYXJkX3NtcF9wcm9jZXNzb3JfaWQodm9pZCk7CiAjZGVmaW5lIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkgKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+Y3B1KQogCit2b2lkIHNtcF9maWxsX2luX2NwdV9wb3NzaWJsZV9tYXAodm9pZCk7CiB2b2lkIHNtcF9maWxsX2luX3NpYl9jb3JlX21hcHModm9pZCk7CiB2b2lkIGNwdV9wbGF5X2RlYWQodm9pZCk7CiAKQEAgLTcyLDYgKzczLDcgQEAKICNkZWZpbmUgc21wX2ZpbGxfaW5fc2liX2NvcmVfbWFwcygpIGRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgc21wX2ZldGNoX2dsb2JhbF9yZWdzKCkgZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBzbXBfZmV0Y2hfZ2xvYmFsX3BtdSgpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgc21wX2ZpbGxfaW5fY3B1X3Bvc3NpYmxlX21hcCgpIGRvIHsgfSB3aGlsZSAoMCkKIAogI2VuZGlmIC8qICEoQ09ORklHX1NNUCkgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS91YWNjZXNzXzMyLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3VhY2Nlc3NfMzIuaAppbmRleCAzNDFhNWExLi5lYTU1Zjg2IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3VhY2Nlc3NfMzIuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3VhY2Nlc3NfMzIuaApAQCAtMjQ5LDggKzI0OSw3IEBACiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewogCWlmIChuICYmIF9fYWNjZXNzX29rKCh1bnNpZ25lZCBsb25nKSB0bywgbikpIHsKLQkJaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcChuKSkKLQkJCWNoZWNrX29iamVjdF9zaXplKGZyb20sIG4sIHRydWUpOworCQljaGVja19vYmplY3Rfc2l6ZShmcm9tLCBuLCB0cnVlKTsKIAkJcmV0dXJuIF9fY29weV91c2VyKHRvLCAoX19mb3JjZSB2b2lkIF9fdXNlciAqKSBmcm9tLCBuKTsKIAl9IGVsc2UKIAkJcmV0dXJuIG47CkBAIC0yNTgsMTkgKzI1NywxOSBAQAogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19jb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7Ci0JaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcChuKSkKLQkJY2hlY2tfb2JqZWN0X3NpemUoZnJvbSwgbiwgdHJ1ZSk7CisJY2hlY2tfb2JqZWN0X3NpemUoZnJvbSwgbiwgdHJ1ZSk7CiAJcmV0dXJuIF9fY29weV91c2VyKHRvLCAoX19mb3JjZSB2b2lkIF9fdXNlciAqKSBmcm9tLCBuKTsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewogCWlmIChuICYmIF9fYWNjZXNzX29rKCh1bnNpZ25lZCBsb25nKSBmcm9tLCBuKSkgewotCQlpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKG4pKQotCQkJY2hlY2tfb2JqZWN0X3NpemUodG8sIG4sIGZhbHNlKTsKKwkJY2hlY2tfb2JqZWN0X3NpemUodG8sIG4sIGZhbHNlKTsKIAkJcmV0dXJuIF9fY29weV91c2VyKChfX2ZvcmNlIHZvaWQgX191c2VyICopIHRvLCBmcm9tLCBuKTsKLQl9IGVsc2UKKwl9IGVsc2UgeworCQltZW1zZXQodG8sIDAsIG4pOwogCQlyZXR1cm4gbjsKKwl9CiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS91YWNjZXNzXzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3VhY2Nlc3NfNjQuaAppbmRleCA4YmRhOTRmLi4zN2EzMTVkIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3VhY2Nlc3NfNjQuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3VhY2Nlc3NfNjQuaApAQCAtMjEyLDggKzIxMiw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyByZXQ7CiAKLQlpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKHNpemUpKQotCQljaGVja19vYmplY3Rfc2l6ZSh0bywgc2l6ZSwgZmFsc2UpOworCWNoZWNrX29iamVjdF9zaXplKHRvLCBzaXplLCBmYWxzZSk7CiAKIAlyZXQgPSBfX19jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgc2l6ZSk7CiAJaWYgKHVubGlrZWx5KHJldCkpCkBAIC0yMzMsOCArMjMyLDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIHJldDsKIAotCWlmICghX19idWlsdGluX2NvbnN0YW50X3Aoc2l6ZSkpCi0JCWNoZWNrX29iamVjdF9zaXplKGZyb20sIHNpemUsIHRydWUpOworCWNoZWNrX29iamVjdF9zaXplKGZyb20sIHNpemUsIHRydWUpOworCiAJcmV0ID0gX19fY29weV90b191c2VyKHRvLCBmcm9tLCBzaXplKTsKIAlpZiAodW5saWtlbHkocmV0KSkKIAkJcmV0ID0gY29weV90b191c2VyX2ZpeHVwKHRvLCBmcm9tLCBzaXplKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2Z0cmFjZS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvZnRyYWNlLmMKaW5kZXggMGEyZDJkZC4uNmJjZmY2OSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvZnRyYWNlLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvZnRyYWNlLmMKQEAgLTEzMSw3ICsxMzEsNyBAQAogCQlyZXR1cm4gcGFyZW50ICsgOFVMOwogCiAJaWYgKGZ0cmFjZV9wdXNoX3JldHVybl90cmFjZShwYXJlbnQsIHNlbGZfYWRkciwgJnRyYWNlLmRlcHRoLAotCQkJCSAgICAgZnJhbWVfcG9pbnRlcikgPT0gLUVCVVNZKQorCQkJCSAgICAgZnJhbWVfcG9pbnRlciwgTlVMTCkgPT0gLUVCVVNZKQogCQlyZXR1cm4gcGFyZW50ICsgOFVMOwogCiAJdHJhY2UuZnVuYyA9IHNlbGZfYWRkcjsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2twcm9iZXMuYyBiL2FyY2gvc3BhcmMva2VybmVsL2twcm9iZXMuYwppbmRleCBjZDgzYmU1Li5iMDM3N2RiIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwva3Byb2Jlcy5jCkBAIC01LDcgKzUsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvY29udGV4dF90cmFja2luZy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3N1bjR2LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfc3VuNHYuYwppbmRleCA2MWM2ZjkzLi5kYjU3ZDhhIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfc3VuNHYuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2lfc3VuNHYuYwpAQCAtMzAsOCArMzAsMTkgQEAKICNkZWZpbmUgRFJJVkVSX05BTUUJInBjaV9zdW40diIKICNkZWZpbmUgUEZYCQlEUklWRVJfTkFNRSAiOiAiCiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHZwY2lfbWFqb3IgPSAxOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgdnBjaV9taW5vciA9IDE7CitzdGF0aWMgdW5zaWduZWQgbG9uZyB2cGNpX21ham9yOworc3RhdGljIHVuc2lnbmVkIGxvbmcgdnBjaV9taW5vcjsKKworc3RydWN0IHZwY2lfdmVyc2lvbiB7CisJdW5zaWduZWQgbG9uZyBtYWpvcjsKKwl1bnNpZ25lZCBsb25nIG1pbm9yOworfTsKKworLyogT3JkZXJlZCBmcm9tIGxhcmdlc3QgbWFqb3IgdG8gbG93ZXN0ICovCitzdGF0aWMgc3RydWN0IHZwY2lfdmVyc2lvbiB2cGNpX3ZlcnNpb25zW10gPSB7CisJeyAubWFqb3IgPSAyLCAubWlub3IgPSAwIH0sCisJeyAubWFqb3IgPSAxLCAubWlub3IgPSAxIH0sCit9OwogCiAjZGVmaW5lIFBHTElTVF9ORU5UUwkoUEFHRV9TSVpFIC8gc2l6ZW9mKHU2NCkpCiAKQEAgLTY3LDYgKzc4LDEwIEBACiAJdTY0ICpwZ2xpc3QgPSBwLT5wZ2xpc3Q7CiAJdW5zaWduZWQgbG9uZyBucGFnZXMgPSBwLT5ucGFnZXM7CiAKKwkvKiBWUENJIG1haj0xLCBtaW49WzAsMV0gb25seSBzdXBwb3J0cyByZWFkIGFuZCB3cml0ZSAqLworCWlmICh2cGNpX21ham9yIDwgMikKKwkJcHJvdCAmPSAoSFZfUENJX01BUF9BVFRSX1JFQUQgfCBIVl9QQ0lfTUFQX0FUVFJfV1JJVEUpOworCiAJd2hpbGUgKG5wYWdlcyAhPSAwKSB7CiAJCWxvbmcgbnVtOwogCkBAIC0xMzMsNiArMTQ4LDcgQEAKIAkJCQkgICB1bnNpZ25lZCBsb25nIGF0dHJzKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIG9yZGVyLCBmaXJzdF9wYWdlLCBucGFnZXMsIG47CisJdW5zaWduZWQgbG9uZyBwcm90ID0gMDsKIAlzdHJ1Y3QgaW9tbXUgKmlvbW11OwogCXN0cnVjdCBwYWdlICpwYWdlOwogCXZvaWQgKnJldDsKQEAgLTE0Niw2ICsxNjIsOSBAQAogCiAJbnBhZ2VzID0gc2l6ZSA+PiBJT19QQUdFX1NISUZUOwogCisJaWYgKGF0dHJzICYgRE1BX0FUVFJfV0VBS19PUkRFUklORykKKwkJcHJvdCA9IEhWX1BDSV9NQVBfQVRUUl9SRUxBWEVEX09SREVSOworCiAJbmlkID0gZGV2LT5hcmNoZGF0YS5udW1hX25vZGU7CiAJcGFnZSA9IGFsbG9jX3BhZ2VzX25vZGUobmlkLCBnZnAsIG9yZGVyKTsKIAlpZiAodW5saWtlbHkoIXBhZ2UpKQpAQCAtMTY5LDcgKzE4OCw3IEBACiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCiAJaW9tbXVfYmF0Y2hfc3RhcnQoZGV2LAotCQkJICAoSFZfUENJX01BUF9BVFRSX1JFQUQgfAorCQkJICAoSFZfUENJX01BUF9BVFRSX1JFQUQgfCBwcm90IHwKIAkJCSAgIEhWX1BDSV9NQVBfQVRUUl9XUklURSksCiAJCQkgIGVudHJ5KTsKIApAQCAtMjY2LDYgKzI4NSw5IEBACiAJaWYgKGRpcmVjdGlvbiAhPSBETUFfVE9fREVWSUNFKQogCQlwcm90IHw9IEhWX1BDSV9NQVBfQVRUUl9XUklURTsKIAorCWlmIChhdHRycyAmIERNQV9BVFRSX1dFQUtfT1JERVJJTkcpCisJCXByb3QgfD0gSFZfUENJX01BUF9BVFRSX1JFTEFYRURfT1JERVI7CisKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAKIAlpb21tdV9iYXRjaF9zdGFydChkZXYsIHByb3QsIGVudHJ5KTsKQEAgLTM0NCw2ICszNjYsOSBAQAogCWlmIChkaXJlY3Rpb24gIT0gRE1BX1RPX0RFVklDRSkKIAkJcHJvdCB8PSBIVl9QQ0lfTUFQX0FUVFJfV1JJVEU7CiAKKwlpZiAoYXR0cnMgJiBETUFfQVRUUl9XRUFLX09SREVSSU5HKQorCQlwcm90IHw9IEhWX1BDSV9NQVBfQVRUUl9SRUxBWEVEX09SREVSOworCiAJb3V0cyA9IHMgPSBzZWdzdGFydCA9ICZzZ2xpc3RbMF07CiAJb3V0Y291bnQgPSAxOwogCWluY291bnQgPSBuZWxlbXM7CkBAIC05MDcsMjIgKzkzMiwyNyBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CiAJc3RydWN0IGlvbW11ICppb21tdTsKIAl1MzIgZGV2aGFuZGxlOwotCWludCBpLCBlcnI7CisJaW50IGksIGVyciA9IC1FTk9ERVY7CiAKIAlkcCA9IG9wLT5kZXYub2Zfbm9kZTsKIAogCWlmICghaHZhcGlfbmVnb3RpYXRlZCsrKSB7Ci0JCWVyciA9IHN1bjR2X2h2YXBpX3JlZ2lzdGVyKEhWX0dSUF9QQ0ksCi0JCQkJCSAgIHZwY2lfbWFqb3IsCi0JCQkJCSAgICZ2cGNpX21pbm9yKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodnBjaV92ZXJzaW9ucyk7IGkrKykgeworCQkJdnBjaV9tYWpvciA9IHZwY2lfdmVyc2lvbnNbaV0ubWFqb3I7CisJCQl2cGNpX21pbm9yID0gdnBjaV92ZXJzaW9uc1tpXS5taW5vcjsKKworCQkJZXJyID0gc3VuNHZfaHZhcGlfcmVnaXN0ZXIoSFZfR1JQX1BDSSwgdnBjaV9tYWpvciwKKwkJCQkJCSAgICZ2cGNpX21pbm9yKTsKKwkJCWlmICghZXJyKQorCQkJCWJyZWFrOworCQl9CiAKIAkJaWYgKGVycikgewotCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ291bGQgbm90IHJlZ2lzdGVyIGh2YXBpLCAiCi0JCQkgICAgICAgImVycj0lZFxuIiwgZXJyKTsKKwkJCXByX2VycihQRlggIkNvdWxkIG5vdCByZWdpc3RlciBodmFwaSwgZXJyPSVkXG4iLCBlcnIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQotCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiUmVnaXN0ZXJlZCBodmFwaSBtYWpvclslbHVdIG1pbm9yWyVsdV1cbiIsCi0JCSAgICAgICB2cGNpX21ham9yLCB2cGNpX21pbm9yKTsKKwkJcHJfaW5mbyhQRlggIlJlZ2lzdGVyZWQgaHZhcGkgbWFqb3JbJWx1XSBtaW5vclslbHVdXG4iLAorCQkJdnBjaV9tYWpvciwgdnBjaV9taW5vcik7CiAKIAkJZG1hX29wcyA9ICZzdW40dl9kbWFfb3BzOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3NldHVwXzY0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zZXR1cF82NC5jCmluZGV4IDU5OWYxMjAuLjZiNzMzMWQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3NldHVwXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXBfNjQuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXJ0X2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KQEAgLTUwLDYgKzUxLDggQEAKICNpbmNsdWRlIDxhc20vZWxmLmg+CiAjaW5jbHVkZSA8YXNtL21kZXNjLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgogCiAjaWZkZWYgQ09ORklHX0lQX1BOUAogI2luY2x1ZGUgPG5ldC9pcGNvbmZpZy5oPgpAQCAtNTkwLDYgKzU5MywyMiBAQAogCQlwYXVzZV9wYXRjaCgpOwogfQogCit2b2lkIF9faW5pdCBhbGxvY19pcnFzdGFja19ib290bWVtKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGksIG5vZGU7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCQlub2RlID0gY3B1X3RvX25vZGUoaSk7CisKKwkJc29mdGlycV9zdGFja1tpXSA9IF9fYWxsb2NfYm9vdG1lbV9ub2RlKE5PREVfREFUQShub2RlKSwKKwkJCQkJCQlUSFJFQURfU0laRSwKKwkJCQkJCQlUSFJFQURfU0laRSwgMCk7CisJCWhhcmRpcnFfc3RhY2tbaV0gPSBfX2FsbG9jX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobm9kZSksCisJCQkJCQkJVEhSRUFEX1NJWkUsCisJCQkJCQkJVEhSRUFEX1NJWkUsIDApOworCX0KK30KKwogdm9pZCBfX2luaXQgc2V0dXBfYXJjaChjaGFyICoqY21kbGluZV9wKQogewogCS8qIEluaXRpYWxpemUgUFJPTSBjb25zb2xlIGFuZCBjb21tYW5kIGxpbmUuICovCkBAIC02NTAsNiArNjY5LDEzIEBACiAKIAlwYWdpbmdfaW5pdCgpOwogCWluaXRfc3BhcmM2NF9lbGZfaHdjYXAoKTsKKwlzbXBfZmlsbF9pbl9jcHVfcG9zc2libGVfbWFwKCk7CisJLyoKKwkgKiBPbmNlIHRoZSBPRiBkZXZpY2UgdHJlZSBhbmQgTURFU0MgaGF2ZSBiZWVuIHNldHVwIGFuZCBucl9jcHVzIGhhcworCSAqIGJlZW4gcGFyc2VkLCB3ZSBrbm93IHRoZSBsaXN0IG9mIHBvc3NpYmxlIGNwdXMuICBUaGVyZWZvcmUgd2UgY2FuCisJICogYWxsb2NhdGUgdGhlIElSUSBzdGFja3MuCisJICovCisJYWxsb2NfaXJxc3RhY2tfYm9vdG1lbSgpOwogfQogCiBleHRlcm4gaW50IHN0b3BfYV9lbmFibGVkOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc21wXzMyLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfMzIuYwppbmRleCBmYjMwZTdjLi5lODBlNmJhIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfMzIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfMzIuYwpAQCAtMzUyLDkgKzM1Miw3IEBACiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCi0JLyogSW52b2tlIHRoZSBDUFVfU1RBUlRJTkcgbm90aWZpZXIgY2FsbGJhY2tzICovCiAJbm90aWZ5X2NwdV9zdGFydGluZyhjcHUpOwotCiAJYXJjaF9jcHVfcHJlX29ubGluZShhcmcpOwogCiAJLyogU2V0IHRoZSBDUFUgaW4gdGhlIGNwdV9vbmxpbmVfbWFzayAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc21wXzY0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfNjQuYwppbmRleCA4YTYxNTFhLi5kMzAzNWJhIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfNjQuYwpAQCAtMTIyNyw2ICsxMjI3LDIwIEBACiAJCXhjYWxsX2RlbGl2ZXJfaW1wbCA9IGh5cGVydmlzb3JfeGNhbGxfZGVsaXZlcjsKIH0KIAordm9pZCBfX2luaXQgc21wX2ZpbGxfaW5fY3B1X3Bvc3NpYmxlX21hcCh2b2lkKQoreworCWludCBwb3NzaWJsZV9jcHVzID0gbnVtX3Bvc3NpYmxlX2NwdXMoKTsKKwlpbnQgaTsKKworCWlmIChwb3NzaWJsZV9jcHVzID4gbnJfY3B1X2lkcykKKwkJcG9zc2libGVfY3B1cyA9IG5yX2NwdV9pZHM7CisKKwlmb3IgKGkgPSAwOyBpIDwgcG9zc2libGVfY3B1czsgaSsrKQorCQlzZXRfY3B1X3Bvc3NpYmxlKGksIHRydWUpOworCWZvciAoOyBpIDwgTlJfQ1BVUzsgaSsrKQorCQlzZXRfY3B1X3Bvc3NpYmxlKGksIGZhbHNlKTsKK30KKwogdm9pZCBzbXBfZmlsbF9pbl9zaWJfY29yZV9tYXBzKHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IGk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwc182NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHNfNjQuYwppbmRleCBkMjFjZDYyLi40MDk0YTUxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwc182NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzXzY0LmMKQEAgLTgsNyArOCw3IEBACiAgKiBJIGxpa2UgdHJhcHMgb24gdjksIDopKSkpCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3VuYWxpZ25lZF82NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdW5hbGlnbmVkXzY0LmMKaW5kZXggOWFhY2I5MS4uNTJjMDBkOSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdW5hbGlnbmVkXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdW5hbGlnbmVkXzY0LmMKQEAgLTExLDcgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXh0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9hc2kuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3BzdGF0ZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9mYXVsdF82NC5jIGIvYXJjaC9zcGFyYy9tbS9mYXVsdF82NC5jCmluZGV4IGUxNmZkZDIuLjY0M2MxNDkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vZmF1bHRfNjQuYworKysgYi9hcmNoL3NwYXJjL21tL2ZhdWx0XzY0LmMKQEAgLTE0LDcgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHRhYmxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTQ4NCw2ICs0ODQsNyBAQAogCQl0c2JfZ3JvdyhtbSwgTU1fVFNCX0JBU0UsIG1tX3Jzcyk7CiAjaWYgZGVmaW5lZChDT05GSUdfSFVHRVRMQl9QQUdFKSB8fCBkZWZpbmVkKENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSkKIAltbV9yc3MgPSBtbS0+Y29udGV4dC5odWdldGxiX3B0ZV9jb3VudCArIG1tLT5jb250ZXh0LnRocF9wdGVfY291bnQ7CisJbW1fcnNzICo9IFJFQUxfSFBBR0VfUEVSX0hQQUdFOwogCWlmICh1bmxpa2VseShtbV9yc3MgPgogCQkgICAgIG1tLT5jb250ZXh0LnRzYl9ibG9ja1tNTV9UU0JfSFVHRV0udHNiX3Jzc19saW1pdCkpIHsKIAkJaWYgKG1tLT5jb250ZXh0LnRzYl9ibG9ja1tNTV9UU0JfSFVHRV0udHNiKQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9pbml0XzY0LmMgYi9hcmNoL3NwYXJjL21tL2luaXRfNjQuYwppbmRleCA2NTQ1N2M5Li40Mzk3ODRiIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL2luaXRfNjQuYworKysgYi9hcmNoL3NwYXJjL21tL2luaXRfNjQuYwpAQCAtNSw3ICs1LDcgQEAKICAqICBDb3B5cmlnaHQgKEMpIDE5OTctMTk5OSBKYWt1YiBKZWxpbmVrIChqakBzdW5zaXRlLm1mZi5jdW5pLmN6KQogICovCiAgCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXh0YWJsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CkBAIC0xMTYwLDcgKzExNjAsNyBAQAogCXJldHVybiBudW1hX2xhdGVuY3lbZnJvbV1bdG9dOwogfQogCi1zdGF0aWMgaW50IGZpbmRfYmVzdF9udW1hX25vZGVfZm9yX21sZ3JvdXAoc3RydWN0IG1kZXNjX21sZ3JvdXAgKmdycCkKK3N0YXRpYyBpbnQgX19pbml0IGZpbmRfYmVzdF9udW1hX25vZGVfZm9yX21sZ3JvdXAoc3RydWN0IG1kZXNjX21sZ3JvdXAgKmdycCkKIHsKIAlpbnQgaTsKIApAQCAtMTE3Myw4ICsxMTczLDggQEAKIAlyZXR1cm4gaTsKIH0KIAotc3RhdGljIHZvaWQgZmluZF9udW1hX2xhdGVuY2llc19mb3JfZ3JvdXAoc3RydWN0IG1kZXNjX2hhbmRsZSAqbWQsIHU2NCBncnAsCi0JCQkJCSAgaW50IGluZGV4KQorc3RhdGljIHZvaWQgX19pbml0IGZpbmRfbnVtYV9sYXRlbmNpZXNfZm9yX2dyb3VwKHN0cnVjdCBtZGVzY19oYW5kbGUgKm1kLAorCQkJCQkJIHU2NCBncnAsIGludCBpbmRleCkKIHsKIAl1NjQgYXJjOwogCkBAIC0yMDgxLDcgKzIwODEsNiBAQAogewogCXVuc2lnbmVkIGxvbmcgZW5kX3Bmbiwgc2hpZnQsIHBoeXNfYmFzZTsKIAl1bnNpZ25lZCBsb25nIHJlYWxfZW5kLCBpOwotCWludCBub2RlOwogCiAJc2V0dXBfcGFnZV9vZmZzZXQoKTsKIApAQCAtMjI1MCwyMSArMjI0OSw2IEBACiAJLyogU2V0dXAgYm9vdG1lbS4uLiAqLwogCWxhc3RfdmFsaWRfcGZuID0gZW5kX3BmbiA9IGJvb3RtZW1faW5pdChwaHlzX2Jhc2UpOwogCi0JLyogT25jZSB0aGUgT0YgZGV2aWNlIHRyZWUgYW5kIE1ERVNDIGhhdmUgYmVlbiBzZXR1cCwgd2Uga25vdwotCSAqIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGNwdXMuICBUaGVyZWZvcmUgd2UgY2FuIGFsbG9jYXRlIHRoZQotCSAqIElSUSBzdGFja3MuCi0JICovCi0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKLQkJbm9kZSA9IGNwdV90b19ub2RlKGkpOwotCi0JCXNvZnRpcnFfc3RhY2tbaV0gPSBfX2FsbG9jX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobm9kZSksCi0JCQkJCQkJVEhSRUFEX1NJWkUsCi0JCQkJCQkJVEhSRUFEX1NJWkUsIDApOwotCQloYXJkaXJxX3N0YWNrW2ldID0gX19hbGxvY19ib290bWVtX25vZGUoTk9ERV9EQVRBKG5vZGUpLAotCQkJCQkJCVRIUkVBRF9TSVpFLAotCQkJCQkJCVRIUkVBRF9TSVpFLCAwKTsKLQl9Ci0KIAlrZXJuZWxfcGh5c2ljYWxfbWFwcGluZ19pbml0KCk7CiAKIAl7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL3RsYi5jIGIvYXJjaC9zcGFyYy9tbS90bGIuYwppbmRleCAzNjU5ZDM3Li5jNTZhMTk1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL3RsYi5jCisrKyBiL2FyY2gvc3BhcmMvbW0vdGxiLmMKQEAgLTE3NCwxMCArMTc0LDI1IEBACiAJCXJldHVybjsKIAogCWlmICgocG1kX3ZhbChwbWQpIF4gcG1kX3ZhbChvcmlnKSkgJiBfUEFHRV9QTURfSFVHRSkgewotCQlpZiAocG1kX3ZhbChwbWQpICYgX1BBR0VfUE1EX0hVR0UpCi0JCQltbS0+Y29udGV4dC50aHBfcHRlX2NvdW50Kys7Ci0JCWVsc2UKLQkJCW1tLT5jb250ZXh0LnRocF9wdGVfY291bnQtLTsKKwkJLyoKKwkJICogTm90ZSB0aGF0IHRoaXMgcm91dGluZSBvbmx5IHNldHMgcG1kcyBmb3IgVEhQIHBhZ2VzLgorCQkgKiBIdWdldGxiIHBhZ2VzIGFyZSBoYW5kbGVkIGVsc2V3aGVyZS4gIFdlIG5lZWQgdG8gY2hlY2sKKwkJICogZm9yIGh1Z2UgemVybyBwYWdlLiAgSHVnZSB6ZXJvIHBhZ2VzIGFyZSBsaWtlIGh1Z2V0bGIKKwkJICogcGFnZXMgaW4gdGhhdCB0aGVyZSBpcyBubyBSU1MsIGJ1dCB0aGVyZSBpcyB0aGUgbmVlZAorCQkgKiBmb3IgVFNCIGVudHJpZXMuICBTbywgaHVnZSB6ZXJvIHBhZ2UgY291bnRzIGdvIGludG8KKwkJICogaHVnZXRsYl9wdGVfY291bnQuCisJCSAqLworCQlpZiAocG1kX3ZhbChwbWQpICYgX1BBR0VfUE1EX0hVR0UpIHsKKwkJCWlmIChpc19odWdlX3plcm9fcGFnZShwbWRfcGFnZShwbWQpKSkKKwkJCQltbS0+Y29udGV4dC5odWdldGxiX3B0ZV9jb3VudCsrOworCQkJZWxzZQorCQkJCW1tLT5jb250ZXh0LnRocF9wdGVfY291bnQrKzsKKwkJfSBlbHNlIHsKKwkJCWlmIChpc19odWdlX3plcm9fcGFnZShwbWRfcGFnZShvcmlnKSkpCisJCQkJbW0tPmNvbnRleHQuaHVnZXRsYl9wdGVfY291bnQtLTsKKwkJCWVsc2UKKwkJCQltbS0+Y29udGV4dC50aHBfcHRlX2NvdW50LS07CisJCX0KIAogCQkvKiBEbyBub3QgdHJ5IHRvIGFsbG9jYXRlIHRoZSBUU0IgaGFzaCB0YWJsZSBpZiB3ZQogCQkgKiBkb24ndCBoYXZlIG9uZSBhbHJlYWR5LiAgV2UgaGF2ZSB2YXJpb3VzIGxvY2tzIGhlbGQKQEAgLTIwNCw2ICsyMTksOSBAQAogCX0KIH0KIAorLyoKKyAqIFRoaXMgcm91dGluZSBpcyBvbmx5IGNhbGxlZCB3aGVuIHNwbGl0dGluZyBhIFRIUAorICovCiB2b2lkIHBtZHBfaW52YWxpZGF0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAogCQkgICAgIHBtZF90ICpwbWRwKQogewpAQCAtMjEzLDYgKzIzMSwxNSBAQAogCiAJc2V0X3BtZF9hdCh2bWEtPnZtX21tLCBhZGRyZXNzLCBwbWRwLCBlbnRyeSk7CiAJZmx1c2hfdGxiX3JhbmdlKHZtYSwgYWRkcmVzcywgYWRkcmVzcyArIEhQQUdFX1BNRF9TSVpFKTsKKworCS8qCisJICogc2V0X3BtZF9hdCgpIHdpbGwgbm90IGJlIGNhbGxlZCBpbiBhIHdheSB0byBkZWNyZW1lbnQKKwkgKiB0aHBfcHRlX2NvdW50IHdoZW4gc3BsaXR0aW5nIGEgVEhQLCBzbyBkbyBpdCBub3cuCisJICogU2FuaXR5IGNoZWNrIHBtZCBiZWZvcmUgZG9pbmcgdGhlIGFjdHVhbCBkZWNyZW1lbnQuCisJICovCisJaWYgKChwbWRfdmFsKGVudHJ5KSAmIF9QQUdFX1BNRF9IVUdFKSAmJgorCSAgICAhaXNfaHVnZV96ZXJvX3BhZ2UocG1kX3BhZ2UoZW50cnkpKSkKKwkJKHZtYS0+dm1fbW0pLT5jb250ZXh0LnRocF9wdGVfY291bnQtLTsKIH0KIAogdm9pZCBwZ3RhYmxlX3RyYW5zX2h1Z2VfZGVwb3NpdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcG1kX3QgKnBtZHAsCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL3RzYi5jIGIvYXJjaC9zcGFyYy9tbS90c2IuYwppbmRleCA2NzI1ZWQ0Li5mMmI3NzExIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL3RzYi5jCisrKyBiL2FyY2gvc3BhcmMvbW0vdHNiLmMKQEAgLTQ2OSw4ICs0NjksMTAgQEAKIAogaW50IGluaXRfbmV3X2NvbnRleHQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogeworCXVuc2lnbmVkIGxvbmcgbW1fcnNzID0gZ2V0X21tX3JzcyhtbSk7CiAjaWYgZGVmaW5lZChDT05GSUdfSFVHRVRMQl9QQUdFKSB8fCBkZWZpbmVkKENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSkKLQl1bnNpZ25lZCBsb25nIHRvdGFsX2h1Z2VfcHRlX2NvdW50OworCXVuc2lnbmVkIGxvbmcgc2F2ZWRfaHVnZXRsYl9wdGVfY291bnQ7CisJdW5zaWduZWQgbG9uZyBzYXZlZF90aHBfcHRlX2NvdW50OwogI2VuZGlmCiAJdW5zaWduZWQgaW50IGk7CiAKQEAgLTQ4MywxMCArNDg1LDEyIEBACiAJICogd2lsbCByZS1pbmNyZW1lbnQgdGhlIGNvdW50ZXJzIGFzIHRoZSBwYXJlbnQgUFRFcyBhcmUKIAkgKiBjb3BpZWQgaW50byB0aGUgY2hpbGQgYWRkcmVzcyBzcGFjZS4KIAkgKi8KLQl0b3RhbF9odWdlX3B0ZV9jb3VudCA9IG1tLT5jb250ZXh0Lmh1Z2V0bGJfcHRlX2NvdW50ICsKLQkJCSBtbS0+Y29udGV4dC50aHBfcHRlX2NvdW50OworCXNhdmVkX2h1Z2V0bGJfcHRlX2NvdW50ID0gbW0tPmNvbnRleHQuaHVnZXRsYl9wdGVfY291bnQ7CisJc2F2ZWRfdGhwX3B0ZV9jb3VudCA9IG1tLT5jb250ZXh0LnRocF9wdGVfY291bnQ7CiAJbW0tPmNvbnRleHQuaHVnZXRsYl9wdGVfY291bnQgPSAwOwogCW1tLT5jb250ZXh0LnRocF9wdGVfY291bnQgPSAwOworCisJbW1fcnNzIC09IHNhdmVkX3RocF9wdGVfY291bnQgKiAoSFBBR0VfU0laRSAvIFBBR0VfU0laRSk7CiAjZW5kaWYKIAogCS8qIGNvcHlfbW0oKSBjb3BpZXMgb3ZlciB0aGUgcGFyZW50J3MgbW1fc3RydWN0IGJlZm9yZSBjYWxsaW5nCkBAIC00OTksMTEgKzUwMywxMyBAQAogCS8qIElmIHRoaXMgaXMgZm9yaywgaW5oZXJpdCB0aGUgcGFyZW50J3MgVFNCIHNpemUuICBXZSB3b3VsZAogCSAqIGdyb3cgaXQgdG8gdGhhdCBzaXplIG9uIHRoZSBmaXJzdCBwYWdlIGZhdWx0IGFueXdheXMuCiAJICovCi0JdHNiX2dyb3cobW0sIE1NX1RTQl9CQVNFLCBnZXRfbW1fcnNzKG1tKSk7CisJdHNiX2dyb3cobW0sIE1NX1RTQl9CQVNFLCBtbV9yc3MpOwogCiAjaWYgZGVmaW5lZChDT05GSUdfSFVHRVRMQl9QQUdFKSB8fCBkZWZpbmVkKENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSkKLQlpZiAodW5saWtlbHkodG90YWxfaHVnZV9wdGVfY291bnQpKQotCQl0c2JfZ3JvdyhtbSwgTU1fVFNCX0hVR0UsIHRvdGFsX2h1Z2VfcHRlX2NvdW50KTsKKwlpZiAodW5saWtlbHkoc2F2ZWRfaHVnZXRsYl9wdGVfY291bnQgKyBzYXZlZF90aHBfcHRlX2NvdW50KSkKKwkJdHNiX2dyb3cobW0sIE1NX1RTQl9IVUdFLAorCQkJIChzYXZlZF9odWdldGxiX3B0ZV9jb3VudCArIHNhdmVkX3RocF9wdGVfY291bnQpICoKKwkJCSBSRUFMX0hQQUdFX1BFUl9IUEFHRSk7CiAjZW5kaWYKIAogCWlmICh1bmxpa2VseSghbW0tPmNvbnRleHQudHNiX2Jsb2NrW01NX1RTQl9CQVNFXS50c2IpKQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9wcm9tL3Jhbmdlcy5jIGIvYXJjaC9zcGFyYy9wcm9tL3Jhbmdlcy5jCmluZGV4IGFkMTQzYzEuLjZkOGRjMmEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvcHJvbS9yYW5nZXMuYworKysgYi9hcmNoL3NwYXJjL3Byb20vcmFuZ2VzLmMKQEAgLTE2LDkgKzE2LDggQEAKIHN0YXRpYyBpbnQgbnVtX29iaW9fcmFuZ2VzOwogCiAvKiBBZGp1c3QgcmVnaXN0ZXIgdmFsdWVzIGJhc2VkIHVwb24gdGhlIHJhbmdlcyBwYXJhbWV0ZXJzLiAqLwotc3RhdGljIHZvaWQKLXByb21fYWRqdXN0X3JlZ3Moc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzICpyZWdwLCBpbnQgbnJlZ3MsCi0JCSBzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMgKnJhbmdlcCwgaW50IG5yYW5nZXMpCitzdGF0aWMgdm9pZCBwcm9tX2FkanVzdF9yZWdzKHN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqcmVncCwgaW50IG5yZWdzLAorCQkJICAgICBzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMgKnJhbmdlcCwgaW50IG5yYW5nZXMpCiB7CiAJaW50IHJlZ2MsIHJuZ2M7CiAKQEAgLTM0LDMzICszMywzMCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQKLXByb21fYWRqdXN0X3JhbmdlcyhzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMgKnJhbmdlczEsIGludCBucmFuZ2VzMSwKLQkJICAgc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzICpyYW5nZXMyLCBpbnQgbnJhbmdlczIpCitzdGF0aWMgdm9pZCBwcm9tX2FkanVzdF9yYW5nZXMoc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzICpyYW5nZXMxLCBpbnQgbnJhbmdlczEsCisJCQkgICAgICAgc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzICpyYW5nZXMyLCBpbnQgbnJhbmdlczIpCiB7CiAJaW50IHJuZzFjLCBybmcyYzsKIAotCWZvcihybmcxYz0wOyBybmcxYyA8IG5yYW5nZXMxOyBybmcxYysrKSB7Ci0JCWZvcihybmcyYz0wOyBybmcyYyA8IG5yYW5nZXMyOyBybmcyYysrKQotCQkJaWYocmFuZ2VzMVtybmcxY10ub3RfcGFyZW50X3NwYWNlID09IHJhbmdlczJbcm5nMmNdLm90X2NoaWxkX3NwYWNlICYmCisJZm9yIChybmcxYyA9IDA7IHJuZzFjIDwgbnJhbmdlczE7IHJuZzFjKyspIHsKKwkJZm9yIChybmcyYyA9IDA7IHJuZzJjIDwgbnJhbmdlczI7IHJuZzJjKyspCisJCQlpZiAocmFuZ2VzMVtybmcxY10ub3RfcGFyZW50X3NwYWNlID09IHJhbmdlczJbcm5nMmNdLm90X2NoaWxkX3NwYWNlICYmCiAJCQkgICByYW5nZXMxW3JuZzFjXS5vdF9wYXJlbnRfYmFzZSA+PSByYW5nZXMyW3JuZzJjXS5vdF9jaGlsZF9iYXNlICYmCiAJCQkgICByYW5nZXMyW3JuZzJjXS5vdF9jaGlsZF9iYXNlICsgcmFuZ2VzMltybmcyY10ub3Jfc2l6ZSAtIHJhbmdlczFbcm5nMWNdLm90X3BhcmVudF9iYXNlID4gMFUpCiAJCQlicmVhazsKLQkJaWYocm5nMmMgPT0gbnJhbmdlczIpIC8qIG9vcHMgKi8KKwkJaWYgKHJuZzJjID09IG5yYW5nZXMyKSAvKiBvb3BzICovCiAJCQlwcm9tX3ByaW50ZigiYWRqdXN0X3JhbmdlczogQ291bGQgbm90IGZpbmQgbWF0Y2hpbmcgYnVzIHR5cGUuLi5cbiIpOwogCQllbHNlIGlmIChyYW5nZXMxW3JuZzFjXS5vdF9wYXJlbnRfYmFzZSArIHJhbmdlczFbcm5nMWNdLm9yX3NpemUgPiByYW5nZXMyW3JuZzJjXS5vdF9jaGlsZF9iYXNlICsgcmFuZ2VzMltybmcyY10ub3Jfc2l6ZSkKLQkJCXJhbmdlczFbcm5nMWNdLm9yX3NpemUgPQotCQkJCXJhbmdlczJbcm5nMmNdLm90X2NoaWxkX2Jhc2UgKyByYW5nZXMyW3JuZzJjXS5vcl9zaXplIC0gcmFuZ2VzMVtybmcxY10ub3RfcGFyZW50X2Jhc2U7CisJCQlyYW5nZXMxW3JuZzFjXS5vcl9zaXplID0gcmFuZ2VzMltybmcyY10ub3RfY2hpbGRfYmFzZSArIHJhbmdlczJbcm5nMmNdLm9yX3NpemUgLSByYW5nZXMxW3JuZzFjXS5vdF9wYXJlbnRfYmFzZTsKIAkJcmFuZ2VzMVtybmcxY10ub3RfcGFyZW50X3NwYWNlID0gcmFuZ2VzMltybmcyY10ub3RfcGFyZW50X3NwYWNlOwogCQlyYW5nZXMxW3JuZzFjXS5vdF9wYXJlbnRfYmFzZSArPSByYW5nZXMyW3JuZzJjXS5vdF9wYXJlbnRfYmFzZTsKIAl9CiB9CiAKIC8qIEFwcGx5IHByb2JlZCBvYmlvIHJhbmdlcyB0byByZWdpc3RlcnMgcGFzc2VkLCBpZiBubyByYW5nZXMgcmV0dXJuLiAqLwotdm9pZAotcHJvbV9hcHBseV9vYmlvX3JhbmdlcyhzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZ3MsIGludCBucmVncykKK3ZvaWQgcHJvbV9hcHBseV9vYmlvX3JhbmdlcyhzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZ3MsIGludCBucmVncykKIHsKLQlpZihudW1fb2Jpb19yYW5nZXMpCisJaWYgKG51bV9vYmlvX3JhbmdlcykKIAkJcHJvbV9hZGp1c3RfcmVncyhyZWdzLCBucmVncywgcHJvbWxpYl9vYmlvX3JhbmdlcywgbnVtX29iaW9fcmFuZ2VzKTsKIH0KIEVYUE9SVF9TWU1CT0wocHJvbV9hcHBseV9vYmlvX3Jhbmdlcyk7CkBAIC03Niw0MCArNzIsNDAgQEAKIAlub2RlID0gcHJvbV9nZXRjaGlsZChwcm9tX3Jvb3Rfbm9kZSk7CiAJb2Jpb19ub2RlID0gcHJvbV9zZWFyY2hzaWJsaW5ncyhub2RlLCAib2JpbyIpOwogCi0JaWYob2Jpb19ub2RlKSB7CisJaWYgKG9iaW9fbm9kZSkgewogCQlzdWNjZXNzID0gcHJvbV9nZXRwcm9wZXJ0eShvYmlvX25vZGUsICJyYW5nZXMiLAogCQkJCQkgICAoY2hhciAqKSBwcm9tbGliX29iaW9fcmFuZ2VzLAogCQkJCQkgICBzaXplb2YocHJvbWxpYl9vYmlvX3JhbmdlcykpOwotCQlpZihzdWNjZXNzICE9IC0xKQotCQkJbnVtX29iaW9fcmFuZ2VzID0gKHN1Y2Nlc3Mvc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcykpOworCQlpZiAoc3VjY2VzcyAhPSAtMSkKKwkJCW51bV9vYmlvX3JhbmdlcyA9IChzdWNjZXNzIC8gc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcykpOwogCX0KIAotCWlmKG51bV9vYmlvX3JhbmdlcykKKwlpZiAobnVtX29iaW9fcmFuZ2VzKQogCQlwcm9tX3ByaW50ZigiUFJPTUxJQjogb2Jpb19yYW5nZXMgJWRcbiIsIG51bV9vYmlvX3Jhbmdlcyk7CiB9CiAKIHZvaWQgcHJvbV9hcHBseV9nZW5lcmljX3JhbmdlcyhwaGFuZGxlIG5vZGUsIHBoYW5kbGUgcGFyZW50LAotCQlzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZ3MsIGludCBucmVncykKKwkJCSAgICAgICBzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZ3MsIGludCBucmVncykKIHsKIAlpbnQgc3VjY2VzczsKIAlpbnQgbnVtX3JhbmdlczsKIAlzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMgcmFuZ2VzW1BST01SRUdfTUFYXTsKLQkKKwogCXN1Y2Nlc3MgPSBwcm9tX2dldHByb3BlcnR5KG5vZGUsICJyYW5nZXMiLAogCQkJCSAgIChjaGFyICopIHJhbmdlcywKLQkJCQkgICBzaXplb2YgKHJhbmdlcykpOworCQkJCSAgIHNpemVvZihyYW5nZXMpKTsKIAlpZiAoc3VjY2VzcyAhPSAtMSkgewotCQludW1fcmFuZ2VzID0gKHN1Y2Nlc3Mvc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcykpOworCQludW1fcmFuZ2VzID0gKHN1Y2Nlc3MgLyBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzKSk7CiAJCWlmIChwYXJlbnQpIHsKIAkJCXN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcyBwYXJlbnRfcmFuZ2VzW1BST01SRUdfTUFYXTsKIAkJCWludCBudW1fcGFyZW50X3JhbmdlczsKLQkJCisKIAkJCXN1Y2Nlc3MgPSBwcm9tX2dldHByb3BlcnR5KHBhcmVudCwgInJhbmdlcyIsCi0JCQkJICAgCQkgICAoY2hhciAqKSBwYXJlbnRfcmFuZ2VzLAotCQkJCSAgIAkJICAgc2l6ZW9mIChwYXJlbnRfcmFuZ2VzKSk7CisJCQkJCQkgICAoY2hhciAqKSBwYXJlbnRfcmFuZ2VzLAorCQkJCQkJICAgc2l6ZW9mKHBhcmVudF9yYW5nZXMpKTsKIAkJCWlmIChzdWNjZXNzICE9IC0xKSB7Ci0JCQkJbnVtX3BhcmVudF9yYW5nZXMgPSAoc3VjY2Vzcy9zaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzKSk7Ci0JCQkJcHJvbV9hZGp1c3RfcmFuZ2VzIChyYW5nZXMsIG51bV9yYW5nZXMsIHBhcmVudF9yYW5nZXMsIG51bV9wYXJlbnRfcmFuZ2VzKTsKKwkJCQludW1fcGFyZW50X3JhbmdlcyA9IChzdWNjZXNzIC8gc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcykpOworCQkJCXByb21fYWRqdXN0X3JhbmdlcyhyYW5nZXMsIG51bV9yYW5nZXMsIHBhcmVudF9yYW5nZXMsIG51bV9wYXJlbnRfcmFuZ2VzKTsKIAkJCX0KIAkJfQogCQlwcm9tX2FkanVzdF9yZWdzKHJlZ3MsIG5yZWdzLCByYW5nZXMsIG51bV9yYW5nZXMpOwpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL0tjb25maWcgYi9hcmNoL3RpbGUvS2NvbmZpZwppbmRleCA0ODIwYTAyLi43OGRhNzViIDEwMDY0NAotLS0gYS9hcmNoL3RpbGUvS2NvbmZpZworKysgYi9hcmNoL3RpbGUvS2NvbmZpZwpAQCAtNCw3ICs0LDYgQEAKIGNvbmZpZyBUSUxFCiAJZGVmX2Jvb2wgeQogCXNlbGVjdCBBUkNIX0hBU19BVE9NSUM2NF9ERUNfSUZfUE9TSVRJVkUKLQlzZWxlY3QgQVJDSF9IQVNfREVCVUdfU1RSSUNUX1VTRVJfQ09QWV9DSEVDS1MKIAlzZWxlY3QgQVJDSF9IQVNfREVWTUVNX0lTX0FMTE9XRUQKIAlzZWxlY3QgQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcKIAlzZWxlY3QgQVJDSF9XQU5UX0ZSQU1FX1BPSU5URVJTCmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCAwYTljNDI2NS4uYTc3MzY5ZSAxMDA2NDQKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC00MTYsMTQgKzQxNiwxMyBAQAogCXJldHVybiBuOwogfQogCi0jaWZkZWYgQ09ORklHX0RFQlVHX1NUUklDVF9VU0VSX0NPUFlfQ0hFQ0tTCi0vKgotICogVGhlcmUgYXJlIHN0aWxsIHVucHJvdmFibGUgcGxhY2VzIGluIHRoZSBnZW5lcmljIGNvZGUgYXMgb2YgMi42LjM0LCBzbyB0aGlzCi0gKiBvcHRpb24gaXMgbm90IHJlYWxseSBjb21wYXRpYmxlIHdpdGggLVdlcnJvciwgd2hpY2ggaXMgbW9yZSB1c2VmdWwgaW4KLSAqIGdlbmVyYWwuCi0gKi8KLWV4dGVybiB2b2lkIGNvcHlfZnJvbV91c2VyX292ZXJmbG93KHZvaWQpCi0JX19jb21waWxldGltZV93YXJuaW5nKCJjb3B5X2Zyb21fdXNlcigpIHNpemUgaXMgbm90IHByb3ZhYmx5IGNvcnJlY3QiKTsKK2V4dGVybiB2b2lkIF9fY29tcGlsZXRpbWVfZXJyb3IoInVzZXJjb3B5IGJ1ZmZlciBzaXplIGlzIHRvbyBzbWFsbCIpCitfX2JhZF9jb3B5X3VzZXIodm9pZCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X3VzZXJfb3ZlcmZsb3coaW50IHNpemUsIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJV0FSTigxLCAiQnVmZmVyIG92ZXJmbG93IGRldGVjdGVkICglZCA8ICVsdSkhXG4iLCBzaXplLCBjb3VudCk7Cit9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sgY29weV9mcm9tX3VzZXIodm9pZCAqdG8sCiAJCQkJCSAgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sCkBAIC00MzMsMTQgKzQzMiwxMyBAQAogCiAJaWYgKGxpa2VseShzeiA9PSAtMSB8fCBzeiA+PSBuKSkKIAkJbiA9IF9jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbik7CisJZWxzZSBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKG4pKQorCQljb3B5X3VzZXJfb3ZlcmZsb3coc3osIG4pOwogCWVsc2UKLQkJY29weV9mcm9tX3VzZXJfb3ZlcmZsb3coKTsKKwkJX19iYWRfY29weV91c2VyKCk7CiAKIAlyZXR1cm4gbjsKIH0KLSNlbHNlCi0jZGVmaW5lIGNvcHlfZnJvbV91c2VyIF9jb3B5X2Zyb21fdXNlcgotI2VuZGlmCiAKICNpZmRlZiBfX3RpbGVneF9fCiAvKioKZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9rZXJuZWwvZnRyYWNlLmMgYi9hcmNoL3RpbGUva2VybmVsL2Z0cmFjZS5jCmluZGV4IDRhNTcyMDguLmI4MjdhNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvdGlsZS9rZXJuZWwvZnRyYWNlLmMKKysrIGIvYXJjaC90aWxlL2tlcm5lbC9mdHJhY2UuYwpAQCAtMTg0LDcgKzE4NCw3IEBACiAJKnBhcmVudCA9IHJldHVybl9ob29rZXI7CiAKIAllcnIgPSBmdHJhY2VfcHVzaF9yZXR1cm5fdHJhY2Uob2xkLCBzZWxmX2FkZHIsICZ0cmFjZS5kZXB0aCwKLQkJCQkgICAgICAgZnJhbWVfcG9pbnRlcik7CisJCQkJICAgICAgIGZyYW1lX3BvaW50ZXIsIE5VTEwpOwogCWlmIChlcnIgPT0gLUVCVVNZKSB7CiAJCSpwYXJlbnQgPSBvbGQ7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9oYXJkZG9nX2tlcm4uYyBiL2FyY2gvdW0vZHJpdmVycy9oYXJkZG9nX2tlcm4uYwppbmRleCAyZDAyNjZkLi4zMjgyNzg3IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvaGFyZGRvZ19rZXJuLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL2hhcmRkb2dfa2Vybi5jCkBAIC0xNzUsMjcgKzE3NSw0IEBACiAJLm5hbWUJCT0gIndhdGNoZG9nIiwKIAkuZm9wcwkJPSAmaGFyZGRvZ19mb3BzLAogfTsKLQotc3RhdGljIGNoYXIgYmFubmVyW10gX19pbml0ZGF0YSA9IEtFUk5fSU5GTyAiVU1MIFdhdGNoZG9nIFRpbWVyXG4iOwotCi1zdGF0aWMgaW50IF9faW5pdCBoYXJkZG9nX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gbWlzY19yZWdpc3RlcigmaGFyZGRvZ19taXNjZGV2KTsKLQotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlwcmludGsoYmFubmVyKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaGFyZGRvZ19leGl0KHZvaWQpCi17Ci0JbWlzY19kZXJlZ2lzdGVyKCZoYXJkZG9nX21pc2NkZXYpOwotfQotCi1tb2R1bGVfaW5pdChoYXJkZG9nX2luaXQpOwotbW9kdWxlX2V4aXQoaGFyZGRvZ19leGl0KTsKK21vZHVsZV9taXNjX2RldmljZShoYXJkZG9nX21pc2NkZXYpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9jb21tb24ubGRzLlMgYi9hcmNoL3VtL2luY2x1ZGUvYXNtL2NvbW1vbi5sZHMuUwppbmRleCAxZGQ1YmQ4Li4xMzMwNTUzIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvYXNtL2NvbW1vbi5sZHMuUworKysgYi9hcmNoL3VtL2luY2x1ZGUvYXNtL2NvbW1vbi5sZHMuUwpAQCAtODEsNyArODEsNyBAQAogICAuYWx0aW5zdHJfcmVwbGFjZW1lbnQgOiB7ICooLmFsdGluc3RyX3JlcGxhY2VtZW50KSB9CiAgIC8qIC5leGl0LnRleHQgaXMgZGlzY2FyZCBhdCBydW50aW1lLCBub3QgbGluayB0aW1lLCB0byBkZWFsIHdpdGggcmVmZXJlbmNlcwogICAgICBmcm9tIC5hbHRpbnN0cnVjdGlvbnMgYW5kIC5laF9mcmFtZSAqLwotICAuZXhpdC50ZXh0IDogeyAqKC5leGl0LnRleHQpIH0KKyAgLmV4aXQudGV4dCA6IHsgRVhJVF9URVhUIH0KICAgLmV4aXQuZGF0YSA6IHsgKiguZXhpdC5kYXRhKSB9CiAKICAgLnByZWluaXRfYXJyYXkgOiB7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9za2FzL3N5c2NhbGwuYyBiL2FyY2gvdW0va2VybmVsL3NrYXMvc3lzY2FsbC5jCmluZGV4IGVmNGI4ZjkuLmI3ODNhYzggMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3NrYXMvc3lzY2FsbC5jCisrKyBiL2FyY2gvdW0va2VybmVsL3NrYXMvc3lzY2FsbC5jCkBAIC0yMSwyMSArMjEsMTcgQEAKIAlQVF9SRUdTX1NFVF9TWVNDQUxMX1JFVFVSTihyZWdzLCAtRU5PU1lTKTsKIAogCWlmIChzeXNjYWxsX3RyYWNlX2VudGVyKHJlZ3MpKQotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCiAJLyogRG8gdGhlIHNlY2NvbXAgY2hlY2sgYWZ0ZXIgcHRyYWNlOyBmYWlsdXJlcyBzaG91bGQgYmUgZmFzdC4gKi8KIAlpZiAoc2VjdXJlX2NvbXB1dGluZyhOVUxMKSA9PSAtMSkKLQkJcmV0dXJuOworCQlnb3RvIG91dDsKIAotCS8qIFVwZGF0ZSB0aGUgc3lzY2FsbCBudW1iZXIgYWZ0ZXIgb3JpZ19heCBoYXMgcG90ZW50aWFsbHkgYmVlbiB1cGRhdGVkCi0JICogd2l0aCBwdHJhY2UuCi0JICovCi0JVVBUX1NZU0NBTExfTlIocikgPSBQVF9TWVNDQUxMX05SKHItPmdwKTsKIAlzeXNjYWxsID0gVVBUX1NZU0NBTExfTlIocik7Ci0KIAlpZiAoc3lzY2FsbCA+PSAwICYmIHN5c2NhbGwgPD0gX19OUl9zeXNjYWxsX21heCkKIAkJUFRfUkVHU19TRVRfU1lTQ0FMTF9SRVRVUk4ocmVncywKIAkJCQlFWEVDVVRFX1NZU0NBTEwoc3lzY2FsbCwgcmVncykpOwogCitvdXQ6CiAJc3lzY2FsbF90cmFjZV9sZWF2ZShyZWdzKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L0tjb25maWcgYi9hcmNoL3g4Ni9LY29uZmlnCmluZGV4IGM1ODBkOGMuLjliMmQ1MGEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L0tjb25maWcKKysrIGIvYXJjaC94ODYvS2NvbmZpZwpAQCAtMjQsNyArMjQsNiBAQAogCXNlbGVjdCBBUkNIX0RJU0NBUkRfTUVNQkxPQ0sKIAlzZWxlY3QgQVJDSF9IQVNfQUNQSV9UQUJMRV9VUEdSQURFIGlmIEFDUEkKIAlzZWxlY3QgQVJDSF9IQVNfQVRPTUlDNjRfREVDX0lGX1BPU0lUSVZFCi0Jc2VsZWN0IEFSQ0hfSEFTX0RFQlVHX1NUUklDVF9VU0VSX0NPUFlfQ0hFQ0tTCiAJc2VsZWN0IEFSQ0hfSEFTX0RFVk1FTV9JU19BTExPV0VECiAJc2VsZWN0IEFSQ0hfSEFTX0VMRl9SQU5ET01JWkUKIAlzZWxlY3QgQVJDSF9IQVNfRkFTVF9NVUxUSVBMSUVSCkBAIC05NCw2ICs5Myw3IEBACiAJc2VsZWN0IEhBVkVfQVJDSF9UUkFOU1BBUkVOVF9IVUdFUEFHRQogCXNlbGVjdCBIQVZFX0FSQ0hfV0lUSElOX1NUQUNLX0ZSQU1FUwogCXNlbGVjdCBIQVZFX0VCUEZfSklUCQkJaWYgWDg2XzY0CisJc2VsZWN0IEhBVkVfQVJDSF9WTUFQX1NUQUNLCQlpZiBYODZfNjQKIAlzZWxlY3QgSEFWRV9DQ19TVEFDS1BST1RFQ1RPUgogCXNlbGVjdCBIQVZFX0NNUFhDSEdfRE9VQkxFCiAJc2VsZWN0IEhBVkVfQ01QWENIR19MT0NBTApAQCAtMTEwLDcgKzExMCw2IEBACiAJc2VsZWN0IEhBVkVfRVhJVF9USFJFQUQKIAlzZWxlY3QgSEFWRV9GRU5UUlkJCQlpZiBYODZfNjQKIAlzZWxlY3QgSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRAotCXNlbGVjdCBIQVZFX0ZVTkNUSU9OX0dSQVBIX0ZQX1RFU1QKIAlzZWxlY3QgSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVIKIAlzZWxlY3QgSEFWRV9GVU5DVElPTl9UUkFDRVIKIAlzZWxlY3QgSEFWRV9HQ0NfUExVR0lOUwpAQCAtMTU4LDYgKzE1Nyw3IEBACiAJc2VsZWN0IFNQQVJTRV9JUlEKIAlzZWxlY3QgU1JDVQogCXNlbGVjdCBTWVNDVExfRVhDRVBUSU9OX1RSQUNFCisJc2VsZWN0IFRIUkVBRF9JTkZPX0lOX1RBU0sKIAlzZWxlY3QgVVNFUl9TVEFDS1RSQUNFX1NVUFBPUlQKIAlzZWxlY3QgVklSVF9UT19CVVMKIAlzZWxlY3QgWDg2X0RFVl9ETUFfT1BTCQkJaWYgWDg2XzY0CkBAIC01NTAsNiArNTUwLDE4IEBACiAJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgUXVhcmsgYmFzZWQgc3lzdGVtIHN1Y2ggYXMgdGhlIEFyZHVpbm8KIAkgIGNvbXBhdGlibGUgSW50ZWwgR2FsaWxlby4KIAorY29uZmlnIE1MWF9QTEFURk9STQorCXRyaXN0YXRlICJNZWxsYW5veCBUZWNobm9sb2dpZXMgcGxhdGZvcm0gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFg4Nl82NAorCWRlcGVuZHMgb24gWDg2X0VYVEVOREVEX1BMQVRGT1JNCisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzeXN0ZW0gc3VwcG9ydCBmb3IgdGhlIE1lbGxhbm94IFRlY2hub2xvZ2llcworCSAgcGxhdGZvcm0uCisKKwkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSBidWlsZGluZyBhIGtlcm5lbCBmb3IgTWVsbGFub3ggc3lzdGVtLgorCisJICBPdGhlcndpc2UsIHNheSBOLgorCiBjb25maWcgWDg2X0lOVEVMX0xQU1MKIAlib29sICJJbnRlbCBMb3cgUG93ZXIgU3Vic3lzdGVtIFN1cHBvcnQiCiAJZGVwZW5kcyBvbiBYODYgJiYgQUNQSQpAQCAtNzA2LDcgKzcxOCw2IEBACiBjb25maWcgUEFSQVZJUlRfU1BJTkxPQ0tTCiAJYm9vbCAiUGFyYXZpcnR1YWxpemF0aW9uIGxheWVyIGZvciBzcGlubG9ja3MiCiAJZGVwZW5kcyBvbiBQQVJBVklSVCAmJiBTTVAKLQlzZWxlY3QgVU5JTkxJTkVfU1BJTl9VTkxPQ0sgaWYgIVFVRVVFRF9TUElOTE9DS1MKIAktLS1oZWxwLS0tCiAJICBQYXJhdmlydHVhbGl6ZWQgc3BpbmxvY2tzIGFsbG93IGEgcHZvcHMgYmFja2VuZCB0byByZXBsYWNlIHRoZQogCSAgc3BpbmxvY2sgaW1wbGVtZW50YXRpb24gd2l0aCBzb21ldGhpbmcgdmlydHVhbGl6YXRpb24tZnJpZW5kbHkKQEAgLTcxOSw3ICs3MzAsNyBAQAogCiBjb25maWcgUVVFVUVEX0xPQ0tfU1RBVAogCWJvb2wgIlBhcmF2aXJ0IHF1ZXVlZCBzcGlubG9jayBzdGF0aXN0aWNzIgotCWRlcGVuZHMgb24gUEFSQVZJUlRfU1BJTkxPQ0tTICYmIERFQlVHX0ZTICYmIFFVRVVFRF9TUElOTE9DS1MKKwlkZXBlbmRzIG9uIFBBUkFWSVJUX1NQSU5MT0NLUyAmJiBERUJVR19GUwogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSB0aGUgY29sbGVjdGlvbiBvZiBzdGF0aXN0aWNhbCBkYXRhIG9uIHRoZSBzbG93cGF0aAogCSAgYmVoYXZpb3Igb2YgcGFyYXZpcnR1YWxpemVkIHF1ZXVlZCBzcGlubG9ja3MgYW5kIHJlcG9ydApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2Vib290LmMgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvZWJvb3QuYwppbmRleCBmZjU3NGRhLi5jYzY5ZTM3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvZWJvb3QuYworKysgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvZWJvb3QuYwpAQCAtMjksMjIgKzI5LDExIEBACiBzdGF0aWMgdm9pZCBzZXR1cF9ib290X3NlcnZpY2VzIyNiaXRzKHN0cnVjdCBlZmlfY29uZmlnICpjKQkJXAogewkJCQkJCQkJCVwKIAllZmlfc3lzdGVtX3RhYmxlXyMjYml0cyMjX3QgKnRhYmxlOwkJCQlcCi0JZWZpX2Jvb3Rfc2VydmljZXNfIyNiaXRzIyNfdCAqYnQ7CQkJCVwKIAkJCQkJCQkJCVwKIAl0YWJsZSA9ICh0eXBlb2YodGFibGUpKXN5c190YWJsZTsJCQkJXAogCQkJCQkJCQkJXAorCWMtPmJvb3Rfc2VydmljZXMgPSB0YWJsZS0+Ym9vdHRpbWU7CQkJCVwKIAljLT50ZXh0X291dHB1dCA9IHRhYmxlLT5jb25fb3V0OwkJCQlcCi0JCQkJCQkJCQlcCi0JYnQgPSAodHlwZW9mKGJ0KSkodW5zaWduZWQgbG9uZykodGFibGUtPmJvb3R0aW1lKTsJCVwKLQkJCQkJCQkJCVwKLQljLT5hbGxvY2F0ZV9wb29sID0gYnQtPmFsbG9jYXRlX3Bvb2w7CQkJCVwKLQljLT5hbGxvY2F0ZV9wYWdlcyA9IGJ0LT5hbGxvY2F0ZV9wYWdlczsJCQkJXAotCWMtPmdldF9tZW1vcnlfbWFwID0gYnQtPmdldF9tZW1vcnlfbWFwOwkJCQlcCi0JYy0+ZnJlZV9wb29sID0gYnQtPmZyZWVfcG9vbDsJCQkJCVwKLQljLT5mcmVlX3BhZ2VzID0gYnQtPmZyZWVfcGFnZXM7CQkJCQlcCi0JYy0+bG9jYXRlX2hhbmRsZSA9IGJ0LT5sb2NhdGVfaGFuZGxlOwkJCQlcCi0JYy0+aGFuZGxlX3Byb3RvY29sID0gYnQtPmhhbmRsZV9wcm90b2NvbDsJCQlcCi0JYy0+ZXhpdF9ib290X3NlcnZpY2VzID0gYnQtPmV4aXRfYm9vdF9zZXJ2aWNlczsJCQlcCiB9CiBCT09UX1NFUlZJQ0VTKDMyKTsKIEJPT1RfU0VSVklDRVMoNjQpOwpAQCAtMjg2LDI5ICsyNzUsNiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgZmluZF9iaXRzKHVuc2lnbmVkIGxvbmcgbWFzaywgdTggKnBvcywgdTggKnNpemUpCi17Ci0JdTggZmlyc3QsIGxlbjsKLQotCWZpcnN0ID0gMDsKLQlsZW4gPSAwOwotCi0JaWYgKG1hc2spIHsKLQkJd2hpbGUgKCEobWFzayAmIDB4MSkpIHsKLQkJCW1hc2sgPSBtYXNrID4+IDE7Ci0JCQlmaXJzdCsrOwotCQl9Ci0KLQkJd2hpbGUgKG1hc2sgJiAweDEpIHsKLQkJCW1hc2sgPSBtYXNrID4+IDE7Ci0JCQlsZW4rKzsKLQkJfQotCX0KLQotCSpwb3MgPSBmaXJzdDsKLQkqc2l6ZSA9IGxlbjsKLX0KLQogc3RhdGljIGVmaV9zdGF0dXNfdAogX19zZXR1cF9lZmlfcGNpMzIoZWZpX3BjaV9pb19wcm90b2NvbF8zMiAqcGNpLCBzdHJ1Y3QgcGNpX3NldHVwX3JvbSAqKl9fcm9tKQogewpAQCAtNTc4LDcgKzU0NCw3IEBACiAJZWZpX2d1aWRfdCB1Z2FfcHJvdG8gPSBFRklfVUdBX1BST1RPQ09MX0dVSUQ7CiAJdW5zaWduZWQgbG9uZyBucl91Z2FzOwogCXUzMiAqaGFuZGxlcyA9ICh1MzIgKil1Z2FfaGFuZGxlOzsKLQllZmlfc3RhdHVzX3Qgc3RhdHVzOworCWVmaV9zdGF0dXNfdCBzdGF0dXMgPSBFRklfSU5WQUxJRF9QQVJBTUVURVI7CiAJaW50IGk7CiAKIAlmaXJzdF91Z2EgPSBOVUxMOwpAQCAtNjIzLDcgKzU4OSw3IEBACiAJZWZpX2d1aWRfdCB1Z2FfcHJvdG8gPSBFRklfVUdBX1BST1RPQ09MX0dVSUQ7CiAJdW5zaWduZWQgbG9uZyBucl91Z2FzOwogCXU2NCAqaGFuZGxlcyA9ICh1NjQgKil1Z2FfaGFuZGxlOzsKLQllZmlfc3RhdHVzX3Qgc3RhdHVzOworCWVmaV9zdGF0dXNfdCBzdGF0dXMgPSBFRklfSU5WQUxJRF9QQVJBTUVURVI7CiAJaW50IGk7CiAKIAlmaXJzdF91Z2EgPSBOVUxMOwpAQCAtMTAwNCw3OSArOTcwLDg3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAorc3RydWN0IGV4aXRfYm9vdF9zdHJ1Y3QgeworCXN0cnVjdCBib290X3BhcmFtcyAqYm9vdF9wYXJhbXM7CisJc3RydWN0IGVmaV9pbmZvICplZmk7CisJc3RydWN0IHNldHVwX2RhdGEgKmU4MjBleHQ7CisJX191MzIgZTgyMGV4dF9zaXplOworCWJvb2wgaXM2NDsKK307CisKK3N0YXRpYyBlZmlfc3RhdHVzX3QgZXhpdF9ib290X2Z1bmMoZWZpX3N5c3RlbV90YWJsZV90ICpzeXNfdGFibGVfYXJnLAorCQkJCSAgIHN0cnVjdCBlZmlfYm9vdF9tZW1tYXAgKm1hcCwKKwkJCQkgICB2b2lkICpwcml2KQoreworCXN0YXRpYyBib29sIGZpcnN0ID0gdHJ1ZTsKKwljb25zdCBjaGFyICpzaWduYXR1cmU7CisJX191MzIgbnJfZGVzYzsKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCXN0cnVjdCBleGl0X2Jvb3Rfc3RydWN0ICpwID0gcHJpdjsKKworCWlmIChmaXJzdCkgeworCQlucl9kZXNjID0gKm1hcC0+YnVmZl9zaXplIC8gKm1hcC0+ZGVzY19zaXplOworCQlpZiAobnJfZGVzYyA+IEFSUkFZX1NJWkUocC0+Ym9vdF9wYXJhbXMtPmU4MjBfbWFwKSkgeworCQkJdTMyIG5yX2U4MjBleHQgPSBucl9kZXNjIC0KKwkJCQkJQVJSQVlfU0laRShwLT5ib290X3BhcmFtcy0+ZTgyMF9tYXApOworCisJCQlzdGF0dXMgPSBhbGxvY19lODIwZXh0KG5yX2U4MjBleHQsICZwLT5lODIwZXh0LAorCQkJCQkgICAgICAgJnAtPmU4MjBleHRfc2l6ZSk7CisJCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCQkJCXJldHVybiBzdGF0dXM7CisJCX0KKwkJZmlyc3QgPSBmYWxzZTsKKwl9CisKKwlzaWduYXR1cmUgPSBwLT5pczY0ID8gRUZJNjRfTE9BREVSX1NJR05BVFVSRSA6IEVGSTMyX0xPQURFUl9TSUdOQVRVUkU7CisJbWVtY3B5KCZwLT5lZmktPmVmaV9sb2FkZXJfc2lnbmF0dXJlLCBzaWduYXR1cmUsIHNpemVvZihfX3UzMikpOworCisJcC0+ZWZpLT5lZmlfc3lzdGFiID0gKHVuc2lnbmVkIGxvbmcpc3lzX3RhYmxlX2FyZzsKKwlwLT5lZmktPmVmaV9tZW1kZXNjX3NpemUgPSAqbWFwLT5kZXNjX3NpemU7CisJcC0+ZWZpLT5lZmlfbWVtZGVzY192ZXJzaW9uID0gKm1hcC0+ZGVzY192ZXI7CisJcC0+ZWZpLT5lZmlfbWVtbWFwID0gKHVuc2lnbmVkIGxvbmcpKm1hcC0+bWFwOworCXAtPmVmaS0+ZWZpX21lbW1hcF9zaXplID0gKm1hcC0+bWFwX3NpemU7CisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJcC0+ZWZpLT5lZmlfc3lzdGFiX2hpID0gKHVuc2lnbmVkIGxvbmcpc3lzX3RhYmxlX2FyZyA+PiAzMjsKKwlwLT5lZmktPmVmaV9tZW1tYXBfaGkgPSAodW5zaWduZWQgbG9uZykqbWFwLT5tYXAgPj4gMzI7CisjZW5kaWYKKworCXJldHVybiBFRklfU1VDQ0VTUzsKK30KKwogc3RhdGljIGVmaV9zdGF0dXNfdCBleGl0X2Jvb3Qoc3RydWN0IGJvb3RfcGFyYW1zICpib290X3BhcmFtcywKIAkJCSAgICAgIHZvaWQgKmhhbmRsZSwgYm9vbCBpczY0KQogewotCXN0cnVjdCBlZmlfaW5mbyAqZWZpID0gJmJvb3RfcGFyYW1zLT5lZmlfaW5mbzsKLQl1bnNpZ25lZCBsb25nIG1hcF9zeiwga2V5LCBkZXNjX3NpemU7CisJdW5zaWduZWQgbG9uZyBtYXBfc3osIGtleSwgZGVzY19zaXplLCBidWZmX3NpemU7CiAJZWZpX21lbW9yeV9kZXNjX3QgKm1lbV9tYXA7CiAJc3RydWN0IHNldHVwX2RhdGEgKmU4MjBleHQ7Ci0JY29uc3QgY2hhciAqc2lnbmF0dXJlOwogCV9fdTMyIGU4MjBleHRfc2l6ZTsKLQlfX3UzMiBucl9kZXNjLCBwcmV2X25yX2Rlc2M7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKIAlfX3UzMiBkZXNjX3ZlcnNpb247Ci0JYm9vbCBjYWxsZWRfZXhpdCA9IGZhbHNlOwotCXU4IG5yX2VudHJpZXM7Ci0JaW50IGk7CisJc3RydWN0IGVmaV9ib290X21lbW1hcCBtYXA7CisJc3RydWN0IGV4aXRfYm9vdF9zdHJ1Y3QgcHJpdjsKIAotCW5yX2Rlc2MgPSAwOwotCWU4MjBleHQgPSBOVUxMOwotCWU4MjBleHRfc2l6ZSA9IDA7CisJbWFwLm1hcCA9CQkmbWVtX21hcDsKKwltYXAubWFwX3NpemUgPQkJJm1hcF9zejsKKwltYXAuZGVzY19zaXplID0JCSZkZXNjX3NpemU7CisJbWFwLmRlc2NfdmVyID0JCSZkZXNjX3ZlcnNpb247CisJbWFwLmtleV9wdHIgPQkJJmtleTsKKwltYXAuYnVmZl9zaXplID0JCSZidWZmX3NpemU7CisJcHJpdi5ib290X3BhcmFtcyA9CWJvb3RfcGFyYW1zOworCXByaXYuZWZpID0JCSZib290X3BhcmFtcy0+ZWZpX2luZm87CisJcHJpdi5lODIwZXh0ID0JCU5VTEw7CisJcHJpdi5lODIwZXh0X3NpemUgPQkwOworCXByaXYuaXM2NCA9CQlpczY0OwogCi1nZXRfbWFwOgotCXN0YXR1cyA9IGVmaV9nZXRfbWVtb3J5X21hcChzeXNfdGFibGUsICZtZW1fbWFwLCAmbWFwX3N6LCAmZGVzY19zaXplLAotCQkJCSAgICAmZGVzY192ZXJzaW9uLCAma2V5KTsKLQorCS8qIE1pZ2h0IGFzIHdlbGwgZXhpdCBib290IHNlcnZpY2VzIG5vdyAqLworCXN0YXR1cyA9IGVmaV9leGl0X2Jvb3Rfc2VydmljZXMoc3lzX3RhYmxlLCBoYW5kbGUsICZtYXAsICZwcml2LAorCQkJCQlleGl0X2Jvb3RfZnVuYyk7CiAJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKIAkJcmV0dXJuIHN0YXR1czsKIAotCXByZXZfbnJfZGVzYyA9IG5yX2Rlc2M7Ci0JbnJfZGVzYyA9IG1hcF9zeiAvIGRlc2Nfc2l6ZTsKLQlpZiAobnJfZGVzYyA+IHByZXZfbnJfZGVzYyAmJgotCSAgICBucl9kZXNjID4gQVJSQVlfU0laRShib290X3BhcmFtcy0+ZTgyMF9tYXApKSB7Ci0JCXUzMiBucl9lODIwZXh0ID0gbnJfZGVzYyAtIEFSUkFZX1NJWkUoYm9vdF9wYXJhbXMtPmU4MjBfbWFwKTsKLQotCQlzdGF0dXMgPSBhbGxvY19lODIwZXh0KG5yX2U4MjBleHQsICZlODIwZXh0LCAmZTgyMGV4dF9zaXplKTsKLQkJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKLQkJCWdvdG8gZnJlZV9tZW1fbWFwOwotCi0JCWVmaV9jYWxsX2Vhcmx5KGZyZWVfcG9vbCwgbWVtX21hcCk7Ci0JCWdvdG8gZ2V0X21hcDsgLyogQWxsb2NhdGVkIG1lbW9yeSwgZ2V0IG1hcCBhZ2FpbiAqLwotCX0KLQotCXNpZ25hdHVyZSA9IGlzNjQgPyBFRkk2NF9MT0FERVJfU0lHTkFUVVJFIDogRUZJMzJfTE9BREVSX1NJR05BVFVSRTsKLQltZW1jcHkoJmVmaS0+ZWZpX2xvYWRlcl9zaWduYXR1cmUsIHNpZ25hdHVyZSwgc2l6ZW9mKF9fdTMyKSk7Ci0KLQllZmktPmVmaV9zeXN0YWIgPSAodW5zaWduZWQgbG9uZylzeXNfdGFibGU7Ci0JZWZpLT5lZmlfbWVtZGVzY19zaXplID0gZGVzY19zaXplOwotCWVmaS0+ZWZpX21lbWRlc2NfdmVyc2lvbiA9IGRlc2NfdmVyc2lvbjsKLQllZmktPmVmaV9tZW1tYXAgPSAodW5zaWduZWQgbG9uZyltZW1fbWFwOwotCWVmaS0+ZWZpX21lbW1hcF9zaXplID0gbWFwX3N6OwotCi0jaWZkZWYgQ09ORklHX1g4Nl82NAotCWVmaS0+ZWZpX3N5c3RhYl9oaSA9ICh1bnNpZ25lZCBsb25nKXN5c190YWJsZSA+PiAzMjsKLQllZmktPmVmaV9tZW1tYXBfaGkgPSAodW5zaWduZWQgbG9uZyltZW1fbWFwID4+IDMyOwotI2VuZGlmCi0KLQkvKiBNaWdodCBhcyB3ZWxsIGV4aXQgYm9vdCBzZXJ2aWNlcyBub3cgKi8KLQlzdGF0dXMgPSBlZmlfY2FsbF9lYXJseShleGl0X2Jvb3Rfc2VydmljZXMsIGhhbmRsZSwga2V5KTsKLQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7Ci0JCS8qCi0JCSAqIEV4aXRCb290U2VydmljZXMoKSB3aWxsIGZhaWwgaWYgYW55IG9mIHRoZSBldmVudAotCQkgKiBoYW5kbGVycyBjaGFuZ2UgdGhlIG1lbW9yeSBtYXAuIEluIHdoaWNoIGNhc2UsIHdlCi0JCSAqIG11c3QgYmUgcHJlcGFyZWQgdG8gcmV0cnksIGJ1dCBvbmx5IG9uY2Ugc28gdGhhdAotCQkgKiB3ZSdyZSBndWFyYW50ZWVkIHRvIGV4aXQgb24gcmVwZWF0ZWQgZmFpbHVyZXMgaW5zdGVhZAotCQkgKiBvZiBzcGlubmluZyBmb3JldmVyLgotCQkgKi8KLQkJaWYgKGNhbGxlZF9leGl0KQotCQkJZ290byBmcmVlX21lbV9tYXA7Ci0KLQkJY2FsbGVkX2V4aXQgPSB0cnVlOwotCQllZmlfY2FsbF9lYXJseShmcmVlX3Bvb2wsIG1lbV9tYXApOwotCQlnb3RvIGdldF9tYXA7Ci0JfQotCisJZTgyMGV4dCA9IHByaXYuZTgyMGV4dDsKKwllODIwZXh0X3NpemUgPSBwcml2LmU4MjBleHRfc2l6ZTsKIAkvKiBIaXN0b3JpYz8gKi8KIAlib290X3BhcmFtcy0+YWx0X21lbV9rID0gMzIgKiAxMDI0OwogCkBAIC0xMDg1LDEwICsxMDU5LDYgQEAKIAkJcmV0dXJuIHN0YXR1czsKIAogCXJldHVybiBFRklfU1VDQ0VTUzsKLQotZnJlZV9tZW1fbWFwOgotCWVmaV9jYWxsX2Vhcmx5KGZyZWVfcG9vbCwgbWVtX21hcCk7Ci0JcmV0dXJuIHN0YXR1czsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzMyLlMgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvaGVhZF8zMi5TCmluZGV4IDEwMzg1MjQuLmZkMGI2YTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzMyLlMKKysrIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2hlYWRfMzIuUwpAQCAtODIsNyArODIsNyBAQAogCiAJLyogUmVsb2NhdGUgZWZpX2NvbmZpZy0+Y2FsbCgpICovCiAJbGVhbAllZmkzMl9jb25maWcoJWVzaSksICVlYXgKLQlhZGQJJWVzaSwgODgoJWVheCkKKwlhZGQJJWVzaSwgMzIoJWVheCkKIAlwdXNobAklZWF4CiAKIAljYWxsCW1ha2VfYm9vdF9wYXJhbXMKQEAgLTEwOCw3ICsxMDgsNyBAQAogCiAJLyogUmVsb2NhdGUgZWZpX2NvbmZpZy0+Y2FsbCgpICovCiAJbGVhbAllZmkzMl9jb25maWcoJWVzaSksICVlYXgKLQlhZGQJJWVzaSwgODgoJWVheCkKKwlhZGQJJWVzaSwgMzIoJWVheCkKIAlwdXNobAklZWF4CiAyOgogCWNhbGwJZWZpX21haW4KQEAgLTI2NCw3ICsyNjQsNyBAQAogI2lmZGVmIENPTkZJR19FRklfU1RVQgogCS5kYXRhCiBlZmkzMl9jb25maWc6Ci0JLmZpbGwgMTEsOCwwCisJLmZpbGwgNCw4LDAKIAkubG9uZyBlZmlfY2FsbF9waHlzCiAJLmxvbmcgMAogCS5ieXRlIDAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzY0LlMgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvaGVhZF82NC5TCmluZGV4IDBkODBhN2EuLmVmZGZiYTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzY0LlMKKysrIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2hlYWRfNjQuUwpAQCAtMjY1LDcgKzI2NSw3IEBACiAJLyoKIAkgKiBSZWxvY2F0ZSBlZmlfY29uZmlnLT5jYWxsKCkuCiAJICovCi0JYWRkcQklcmJwLCBlZmk2NF9jb25maWcrODgoJXJpcCkKKwlhZGRxCSVyYnAsIGVmaTY0X2NvbmZpZyszMiglcmlwKQogCiAJbW92cQklcmF4LCAlcmRpCiAJY2FsbAltYWtlX2Jvb3RfcGFyYW1zCkBAIC0yODUsNyArMjg1LDcgQEAKIAkgKiBSZWxvY2F0ZSBlZmlfY29uZmlnLT5jYWxsKCkuCiAJICovCiAJbW92cQllZmlfY29uZmlnKCVyaXApLCAlcmF4Ci0JYWRkcQklcmJwLCA4OCglcmF4KQorCWFkZHEJJXJicCwgMzIoJXJheCkKIDI6CiAJbW92cQllZmlfY29uZmlnKCVyaXApLCAlcmRpCiAJY2FsbAllZmlfbWFpbgpAQCAtNDU3LDE0ICs0NTcsMTQgQEAKICNpZmRlZiBDT05GSUdfRUZJX01JWEVECiAJLmdsb2JhbCBlZmkzMl9jb25maWcKIGVmaTMyX2NvbmZpZzoKLQkuZmlsbAkxMSw4LDAKKwkuZmlsbAk0LDgsMAogCS5xdWFkCWVmaTY0X3RodW5rCiAJLmJ5dGUJMAogI2VuZGlmCiAKIAkuZ2xvYmFsIGVmaTY0X2NvbmZpZwogZWZpNjRfY29uZmlnOgotCS5maWxsCTExLDgsMAorCS5maWxsCTQsOCwwCiAJLnF1YWQJZWZpX2NhbGwKIAkuYnl0ZQkxCiAjZW5kaWYgLyogQ09ORklHX0VGSV9TVFVCICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jb25maWdzL2t2bV9ndWVzdC5jb25maWcgYi9hcmNoL3g4Ni9jb25maWdzL2t2bV9ndWVzdC5jb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MDY1MDUuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvY29uZmlncy9rdm1fZ3Vlc3QuY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotQ09ORklHX05FVD15Ci1DT05GSUdfTkVUX0NPUkU9eQotQ09ORklHX05FVERFVklDRVM9eQotQ09ORklHX0JMT0NLPXkKLUNPTkZJR19CTEtfREVWPXkKLUNPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKLUNPTkZJR19JTkVUPXkKLUNPTkZJR19UVFk9eQotQ09ORklHX1NFUklBTF84MjUwPXkKLUNPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKLUNPTkZJR19JUF9QTlA9eQotQ09ORklHX0lQX1BOUF9ESENQPXkKLUNPTkZJR19CSU5GTVRfRUxGPXkKLUNPTkZJR19QQ0k9eQotQ09ORklHX1BDSV9NU0k9eQotQ09ORklHX0RFQlVHX0tFUk5FTD15Ci1DT05GSUdfVklSVFVBTElaQVRJT049eQotQ09ORklHX0hZUEVSVklTT1JfR1VFU1Q9eQotQ09ORklHX1BBUkFWSVJUPXkKLUNPTkZJR19LVk1fR1VFU1Q9eQotQ09ORklHX1ZJUlRJTz15Ci1DT05GSUdfVklSVElPX1BDST15Ci1DT05GSUdfVklSVElPX0JMSz15Ci1DT05GSUdfVklSVElPX0NPTlNPTEU9eQotQ09ORklHX1ZJUlRJT19ORVQ9eQotQ09ORklHXzlQX0ZTPXkKLUNPTkZJR19ORVRfOVA9eQotQ09ORklHX05FVF85UF9WSVJUSU89eQotQ09ORklHX1NDU0lfTE9XTEVWRUw9eQotQ09ORklHX1NDU0lfVklSVElPPXkKLUNPTkZJR19WSVJUSU9fSU5QVVQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvY29uZmlncy90aW55LmNvbmZpZyBiL2FyY2gveDg2L2NvbmZpZ3MvdGlueS5jb25maWcKaW5kZXggNGUyZWNmYS4uNGI0MjlkZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY29uZmlncy90aW55LmNvbmZpZworKysgYi9hcmNoL3g4Ni9jb25maWdzL3RpbnkuY29uZmlnCkBAIC0xICsxLDMgQEAKIENPTkZJR19OT0hJR0hNRU09eQorIyBDT05GSUdfSElHSE1FTTRHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJR0hNRU02NEcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvY3J5cHRvL3NoYTI1Ni1tYi9zaGEyNTZfbWIuYyBiL2FyY2gveDg2L2NyeXB0by9zaGEyNTYtbWIvc2hhMjU2X21iLmMKaW5kZXggODlmYTg1ZS4uNmY5N2ZiMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY3J5cHRvL3NoYTI1Ni1tYi9zaGEyNTZfbWIuYworKysgYi9hcmNoL3g4Ni9jcnlwdG8vc2hhMjU2LW1iL3NoYTI1Nl9tYi5jCkBAIC00ODUsMTAgKzQ4NSwxMCBAQAogCiAJCQlyZXEgPSBjYXN0X21jcnlwdGRfY3R4X3RvX3JlcShyZXFfY3R4KTsKIAkJCWlmIChpcnFzX2Rpc2FibGVkKCkpCi0JCQkJcmN0eC0+Y29tcGxldGUoJnJlcS0+YmFzZSwgcmV0KTsKKwkJCQlyZXFfY3R4LT5jb21wbGV0ZSgmcmVxLT5iYXNlLCByZXQpOwogCQkJZWxzZSB7CiAJCQkJbG9jYWxfYmhfZGlzYWJsZSgpOwotCQkJCXJjdHgtPmNvbXBsZXRlKCZyZXEtPmJhc2UsIHJldCk7CisJCQkJcmVxX2N0eC0+Y29tcGxldGUoJnJlcS0+YmFzZSwgcmV0KTsKIAkJCQlsb2NhbF9iaF9lbmFibGUoKTsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvY3J5cHRvL3NoYTI1Ni1tYi9zaGEyNTZfbWJfbWdyX2ZsdXNoX2F2eDIuUyBiL2FyY2gveDg2L2NyeXB0by9zaGEyNTYtbWIvc2hhMjU2X21iX21ncl9mbHVzaF9hdngyLlMKaW5kZXggYjY5MWRhOS4uYTc4YTA2OSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY3J5cHRvL3NoYTI1Ni1tYi9zaGEyNTZfbWJfbWdyX2ZsdXNoX2F2eDIuUworKysgYi9hcmNoL3g4Ni9jcnlwdG8vc2hhMjU2LW1iL3NoYTI1Nl9tYl9tZ3JfZmx1c2hfYXZ4Mi5TCkBAIC0yNjUsMTMgKzI2NSwxNCBAQAogCXZwaW5zcmQJJDEsIF9hcmdzX2RpZ2VzdCsxKjMyKHN0YXRlLCBpZHgsIDQpLCAleG1tMCwgJXhtbTAKIAl2cGluc3JkCSQyLCBfYXJnc19kaWdlc3QrMiozMihzdGF0ZSwgaWR4LCA0KSwgJXhtbTAsICV4bW0wCiAJdnBpbnNyZAkkMywgX2FyZ3NfZGlnZXN0KzMqMzIoc3RhdGUsIGlkeCwgNCksICV4bW0wLCAleG1tMAotCW1vdmwJX2FyZ3NfZGlnZXN0KzQqMzIoc3RhdGUsIGlkeCwgNCksIHRtcDJfdworCXZtb3ZkICAgX2FyZ3NfZGlnZXN0KHN0YXRlICwgaWR4LCA0KSAsICV4bW0wCiAJdnBpbnNyZAkkMSwgX2FyZ3NfZGlnZXN0KzUqMzIoc3RhdGUsIGlkeCwgNCksICV4bW0xLCAleG1tMQogCXZwaW5zcmQJJDIsIF9hcmdzX2RpZ2VzdCs2KjMyKHN0YXRlLCBpZHgsIDQpLCAleG1tMSwgJXhtbTEKIAl2cGluc3JkCSQzLCBfYXJnc19kaWdlc3QrNyozMihzdGF0ZSwgaWR4LCA0KSwgJXhtbTEsICV4bW0xCiAKLQl2bW92ZHF1CSV4bW0wLCBfcmVzdWx0X2RpZ2VzdChqb2JfcmF4KQotCW1vdmwJdG1wMl93LCBfcmVzdWx0X2RpZ2VzdCsxKjE2KGpvYl9yYXgpCisgICAgICAgIHZtb3ZkcXUgJXhtbTAsIF9yZXN1bHRfZGlnZXN0KGpvYl9yYXgpCisgICAgICAgIG9mZnNldCA9ICAoX3Jlc3VsdF9kaWdlc3QgKyAxKjE2KQorICAgICAgICB2bW92ZHF1ICV4bW0xLCBvZmZzZXQoam9iX3JheCkKIAogCXBvcAklcmJ4CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2NyeXB0by9zaGE1MTItbWIvc2hhNTEyX21iLmMgYi9hcmNoL3g4Ni9jcnlwdG8vc2hhNTEyLW1iL3NoYTUxMl9tYi5jCmluZGV4IGY0Y2Y1YjcuLmQyMTAxNzQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2NyeXB0by9zaGE1MTItbWIvc2hhNTEyX21iLmMKKysrIGIvYXJjaC94ODYvY3J5cHRvL3NoYTUxMi1tYi9zaGE1MTJfbWIuYwpAQCAtNDk3LDEwICs0OTcsMTAgQEAKIAogCQkJcmVxID0gY2FzdF9tY3J5cHRkX2N0eF90b19yZXEocmVxX2N0eCk7CiAJCQlpZiAoaXJxc19kaXNhYmxlZCgpKQotCQkJCXJjdHgtPmNvbXBsZXRlKCZyZXEtPmJhc2UsIHJldCk7CisJCQkJcmVxX2N0eC0+Y29tcGxldGUoJnJlcS0+YmFzZSwgcmV0KTsKIAkJCWVsc2UgewogCQkJCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQkJCQlyY3R4LT5jb21wbGV0ZSgmcmVxLT5iYXNlLCByZXQpOworCQkJCXJlcV9jdHgtPmNvbXBsZXRlKCZyZXEtPmJhc2UsIHJldCk7CiAJCQkJbG9jYWxfYmhfZW5hYmxlKCk7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2VudHJ5L2NvbW1vbi5jIGIvYXJjaC94ODYvZW50cnkvY29tbW9uLmMKaW5kZXggMTQzM2Y2Yi4uYmRkOWNjNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvZW50cnkvY29tbW9uLmMKKysrIGIvYXJjaC94ODYvZW50cnkvY29tbW9uLmMKQEAgLTMxLDEzICszMSw2IEBACiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvc3lzY2FsbHMuaD4KIAotc3RhdGljIHN0cnVjdCB0aHJlYWRfaW5mbyAqcHRfcmVnc190b190aHJlYWRfaW5mbyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQl1bnNpZ25lZCBsb25nIHRvcF9vZl9zdGFjayA9Ci0JCSh1bnNpZ25lZCBsb25nKShyZWdzICsgMSkgKyBUT1BfT0ZfS0VSTkVMX1NUQUNLX1BBRERJTkc7Ci0JcmV0dXJuIChzdHJ1Y3QgdGhyZWFkX2luZm8gKikodG9wX29mX3N0YWNrIC0gVEhSRUFEX1NJWkUpOwotfQotCiAjaWZkZWYgQ09ORklHX0NPTlRFWFRfVFJBQ0tJTkcKIC8qIENhbGxlZCBvbiBlbnRyeSBmcm9tIHVzZXIgbW9kZSB3aXRoIElSUXMgb2ZmLiAqLwogX192aXNpYmxlIGlubGluZSB2b2lkIGVudGVyX2Zyb21fdXNlcl9tb2RlKHZvaWQpCkBAIC03MSw3ICs2NCw3IEBACiB7CiAJdTMyIGFyY2ggPSBpbl9pYTMyX3N5c2NhbGwoKSA/IEFVRElUX0FSQ0hfSTM4NiA6IEFVRElUX0FSQ0hfWDg2XzY0OwogCi0Jc3RydWN0IHRocmVhZF9pbmZvICp0aSA9IHB0X3JlZ3NfdG9fdGhyZWFkX2luZm8ocmVncyk7CisJc3RydWN0IHRocmVhZF9pbmZvICp0aSA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKTsKIAl1bnNpZ25lZCBsb25nIHJldCA9IDA7CiAJYm9vbCBlbXVsYXRlZCA9IGZhbHNlOwogCXUzMiB3b3JrOwpAQCAtMTczLDE4ICsxNjYsMTcgQEAKIAkJLyogRGlzYWJsZSBJUlFzIGFuZCByZXRyeSAqLwogCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCi0JCWNhY2hlZF9mbGFncyA9IFJFQURfT05DRShwdF9yZWdzX3RvX3RocmVhZF9pbmZvKHJlZ3MpLT5mbGFncyk7CisJCWNhY2hlZF9mbGFncyA9IFJFQURfT05DRShjdXJyZW50X3RocmVhZF9pbmZvKCktPmZsYWdzKTsKIAogCQlpZiAoIShjYWNoZWRfZmxhZ3MgJiBFWElUX1RPX1VTRVJNT0RFX0xPT1BfRkxBR1MpKQogCQkJYnJlYWs7Ci0KIAl9CiB9CiAKIC8qIENhbGxlZCB3aXRoIElSUXMgZGlzYWJsZWQuICovCiBfX3Zpc2libGUgaW5saW5lIHZvaWQgcHJlcGFyZV9leGl0X3RvX3VzZXJtb2RlKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSBwdF9yZWdzX3RvX3RocmVhZF9pbmZvKHJlZ3MpOworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSBjdXJyZW50X3RocmVhZF9pbmZvKCk7CiAJdTMyIGNhY2hlZF9mbGFnczsKIAogCWlmIChJU19FTkFCTEVEKENPTkZJR19QUk9WRV9MT0NLSU5HKSAmJiBXQVJOX09OKCFpcnFzX2Rpc2FibGVkKCkpKQpAQCAtMjA5LDcgKzIwMSw3IEBACiAJICogc3BlY2lhbCBjYXNlIG9ubHkgYXBwbGllcyBhZnRlciBwb2tpbmcgcmVncyBhbmQgYmVmb3JlIHRoZQogCSAqIHZlcnkgbmV4dCByZXR1cm4gdG8gdXNlciBtb2RlLgogCSAqLwotCXRpLT5zdGF0dXMgJj0gfihUU19DT01QQVR8VFNfSTM4Nl9SRUdTX1BPS0VEKTsKKwljdXJyZW50LT50aHJlYWQuc3RhdHVzICY9IH4oVFNfQ09NUEFUfFRTX0kzODZfUkVHU19QT0tFRCk7CiAjZW5kaWYKIAogCXVzZXJfZW50ZXJfaXJxb2ZmKCk7CkBAIC0yNDcsNyArMjM5LDcgQEAKICAqLwogX192aXNpYmxlIGlubGluZSB2b2lkIHN5c2NhbGxfcmV0dXJuX3Nsb3dwYXRoKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSBwdF9yZWdzX3RvX3RocmVhZF9pbmZvKHJlZ3MpOworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSBjdXJyZW50X3RocmVhZF9pbmZvKCk7CiAJdTMyIGNhY2hlZF9mbGFncyA9IFJFQURfT05DRSh0aS0+ZmxhZ3MpOwogCiAJQ1RfV0FSTl9PTihjdF9zdGF0ZSgpICE9IENPTlRFWFRfS0VSTkVMKTsKQEAgLTI3MCw3ICsyNjIsNyBAQAogI2lmZGVmIENPTkZJR19YODZfNjQKIF9fdmlzaWJsZSB2b2lkIGRvX3N5c2NhbGxfNjQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jc3RydWN0IHRocmVhZF9pbmZvICp0aSA9IHB0X3JlZ3NfdG9fdGhyZWFkX2luZm8ocmVncyk7CisJc3RydWN0IHRocmVhZF9pbmZvICp0aSA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKTsKIAl1bnNpZ25lZCBsb25nIG5yID0gcmVncy0+b3JpZ19heDsKIAogCWVudGVyX2Zyb21fdXNlcl9tb2RlKCk7CkBAIC0zMDMsMTEgKzI5NSwxMSBAQAogICovCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgZG9fc3lzY2FsbF8zMl9pcnFzX29uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSBwdF9yZWdzX3RvX3RocmVhZF9pbmZvKHJlZ3MpOworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSBjdXJyZW50X3RocmVhZF9pbmZvKCk7CiAJdW5zaWduZWQgaW50IG5yID0gKHVuc2lnbmVkIGludClyZWdzLT5vcmlnX2F4OwogCiAjaWZkZWYgQ09ORklHX0lBMzJfRU1VTEFUSU9OCi0JdGktPnN0YXR1cyB8PSBUU19DT01QQVQ7CisJY3VycmVudC0+dGhyZWFkLnN0YXR1cyB8PSBUU19DT01QQVQ7CiAjZW5kaWYKIAogCWlmIChSRUFEX09OQ0UodGktPmZsYWdzKSAmIF9USUZfV09SS19TWVNDQUxMX0VOVFJZKSB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9lbnRyeS9lbnRyeV8zMi5TIGIvYXJjaC94ODYvZW50cnkvZW50cnlfMzIuUwppbmRleCAwYjU2NjY2Li5iNzVhOGJjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9lbnRyeS9lbnRyeV8zMi5TCisrKyBiL2FyY2gveDg2L2VudHJ5L2VudHJ5XzMyLlMKQEAgLTIwNCwzNCArMjA0LDcwIEBACiAJUE9QX0dTX0VYCiAuZW5kbQogCisvKgorICogJWVheDogcHJldiB0YXNrCisgKiAlZWR4OiBuZXh0IHRhc2sKKyAqLworRU5UUlkoX19zd2l0Y2hfdG9fYXNtKQorCS8qCisJICogU2F2ZSBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzCisJICogVGhpcyBtdXN0IG1hdGNoIHRoZSBvcmRlciBpbiBzdHJ1Y3QgaW5hY3RpdmVfdGFza19mcmFtZQorCSAqLworCXB1c2hsCSVlYnAKKwlwdXNobAklZWJ4CisJcHVzaGwJJWVkaQorCXB1c2hsCSVlc2kKKworCS8qIHN3aXRjaCBzdGFjayAqLworCW1vdmwJJWVzcCwgVEFTS190aHJlYWRzcCglZWF4KQorCW1vdmwJVEFTS190aHJlYWRzcCglZWR4KSwgJWVzcAorCisjaWZkZWYgQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SCisJbW92bAlUQVNLX3N0YWNrX2NhbmFyeSglZWR4KSwgJWVieAorCW1vdmwJJWVieCwgUEVSX0NQVV9WQVIoc3RhY2tfY2FuYXJ5KStzdGFja19jYW5hcnlfb2Zmc2V0CisjZW5kaWYKKworCS8qIHJlc3RvcmUgY2FsbGVlLXNhdmVkIHJlZ2lzdGVycyAqLworCXBvcGwJJWVzaQorCXBvcGwJJWVkaQorCXBvcGwJJWVieAorCXBvcGwJJWVicAorCisJam1wCV9fc3dpdGNoX3RvCitFTkQoX19zd2l0Y2hfdG9fYXNtKQorCisvKgorICogQSBuZXdseSBmb3JrZWQgcHJvY2VzcyBkaXJlY3RseSBjb250ZXh0IHN3aXRjaGVzIGludG8gdGhpcyBhZGRyZXNzLgorICoKKyAqIGVheDogcHJldiB0YXNrIHdlIHN3aXRjaGVkIGZyb20KKyAqIGVieDoga2VybmVsIHRocmVhZCBmdW5jIChOVUxMIGZvciB1c2VyIHRocmVhZCkKKyAqIGVkaToga2VybmVsIHRocmVhZCBhcmcKKyAqLwogRU5UUlkocmV0X2Zyb21fZm9yaykKIAlwdXNobAklZWF4CiAJY2FsbAlzY2hlZHVsZV90YWlsCiAJcG9wbAklZWF4CiAKKwl0ZXN0bAklZWJ4LCAlZWJ4CisJam56CTFmCQkvKiBrZXJuZWwgdGhyZWFkcyBhcmUgdW5jb21tb24gKi8KKworMjoKIAkvKiBXaGVuIHdlIGZvcmssIHdlIHRyYWNlIHRoZSBzeXNjYWxsIHJldHVybiBpbiB0aGUgY2hpbGQsIHRvby4gKi8KIAltb3ZsICAgICVlc3AsICVlYXgKIAljYWxsICAgIHN5c2NhbGxfcmV0dXJuX3Nsb3dwYXRoCiAJam1wICAgICByZXN0b3JlX2FsbAotRU5EKHJldF9mcm9tX2ZvcmspCiAKLUVOVFJZKHJldF9mcm9tX2tlcm5lbF90aHJlYWQpCi0JcHVzaGwJJWVheAotCWNhbGwJc2NoZWR1bGVfdGFpbAotCXBvcGwJJWVheAotCW1vdmwJUFRfRUJQKCVlc3ApLCAlZWF4Ci0JY2FsbAkqUFRfRUJYKCVlc3ApCi0JbW92bAkkMCwgUFRfRUFYKCVlc3ApCi0KKwkvKiBrZXJuZWwgdGhyZWFkICovCisxOgltb3ZsCSVlZGksICVlYXgKKwljYWxsCSolZWJ4CiAJLyoKLQkgKiBLZXJuZWwgdGhyZWFkcyByZXR1cm4gdG8gdXNlcnNwYWNlIGFzIGlmIHJldHVybmluZyBmcm9tIGEgc3lzY2FsbC4KLQkgKiBXZSBzaG91bGQgY2hlY2sgd2hldGhlciBhbnl0aGluZyBhY3R1YWxseSB1c2VzIHRoaXMgcGF0aCBhbmQsIGlmIHNvLAotCSAqIGNvbnNpZGVyIHN3aXRjaGluZyBpdCBvdmVyIHRvIHJldF9mcm9tX2ZvcmsuCisJICogQSBrZXJuZWwgdGhyZWFkIGlzIGFsbG93ZWQgdG8gcmV0dXJuIGhlcmUgYWZ0ZXIgc3VjY2Vzc2Z1bGx5CisJICogY2FsbGluZyBkb19leGVjdmUoKS4gIEV4aXQgdG8gdXNlcnNwYWNlIHRvIGNvbXBsZXRlIHRoZSBleGVjdmUoKQorCSAqIHN5c2NhbGwuCiAJICovCi0JbW92bCAgICAlZXNwLCAlZWF4Ci0JY2FsbCAgICBzeXNjYWxsX3JldHVybl9zbG93cGF0aAotCWptcCAgICAgcmVzdG9yZV9hbGwKLUVORFBST0MocmV0X2Zyb21fa2VybmVsX3RocmVhZCkKKwltb3ZsCSQwLCBQVF9FQVgoJWVzcCkKKwlqbXAJMmIKK0VORChyZXRfZnJvbV9mb3JrKQogCiAvKgogICogUmV0dXJuIHRvIHVzZXIgbW9kZSBpcyBub3QgYXMgY29tcGxleCBhcyBhbGwgdGhpcyBsb29rcywKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2VudHJ5L2VudHJ5XzY0LlMgYi9hcmNoL3g4Ni9lbnRyeS9lbnRyeV82NC5TCmluZGV4IGQxNzJjNjEuLmZlZTFkOTUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2VudHJ5L2VudHJ5XzY0LlMKKysrIGIvYXJjaC94ODYvZW50cnkvZW50cnlfNjQuUwpAQCAtMTc5LDcgKzE3OSw4IEBACiAJICogSWYgd2UgbmVlZCB0byBkbyBlbnRyeSB3b3JrIG9yIGlmIHdlIGd1ZXNzIHdlJ2xsIG5lZWQgdG8gZG8KIAkgKiBleGl0IHdvcmssIGdvIHN0cmFpZ2h0IHRvIHRoZSBzbG93IHBhdGguCiAJICovCi0JdGVzdGwJJF9USUZfV09SS19TWVNDQUxMX0VOVFJZfF9USUZfQUxMV09SS19NQVNLLCBBU01fVEhSRUFEX0lORk8oVElfZmxhZ3MsICVyc3AsIFNJWkVPRl9QVFJFR1MpCisJbW92cQlQRVJfQ1BVX1ZBUihjdXJyZW50X3Rhc2spLCAlcjExCisJdGVzdGwJJF9USUZfV09SS19TWVNDQUxMX0VOVFJZfF9USUZfQUxMV09SS19NQVNLLCBUQVNLX1RJX2ZsYWdzKCVyMTEpCiAJam56CWVudHJ5X1NZU0NBTEw2NF9zbG93X3BhdGgKIAogZW50cnlfU1lTQ0FMTF82NF9mYXN0cGF0aDoKQEAgLTIxNyw3ICsyMTgsOCBAQAogCSAqLwogCURJU0FCTEVfSU5URVJSVVBUUyhDTEJSX05PTkUpCiAJVFJBQ0VfSVJRU19PRkYKLQl0ZXN0bAkkX1RJRl9BTExXT1JLX01BU0ssIEFTTV9USFJFQURfSU5GTyhUSV9mbGFncywgJXJzcCwgU0laRU9GX1BUUkVHUykKKwltb3ZxCVBFUl9DUFVfVkFSKGN1cnJlbnRfdGFzayksICVyMTEKKwl0ZXN0bAkkX1RJRl9BTExXT1JLX01BU0ssIFRBU0tfVElfZmxhZ3MoJXIxMSkKIAlqbnoJMWYKIAogCUxPQ0tERVBfU1lTX0VYSVQKQEAgLTM1MSw4ICszNTMsNyBAQAogCWptcAllbnRyeV9TWVNDQUxMNjRfc2xvd19wYXRoCiAKIDE6Ci0JLyogQ2FsbGVkIGZyb20gQyAqLwotCWptcAkqJXJheAkJCQkvKiBjYWxsZWQgZnJvbSBDICovCisJam1wCSolcmF4CQkJCS8qIENhbGxlZCBmcm9tIEMgKi8KIEVORChzdHViX3B0cmVnc182NCkKIAogLm1hY3JvIHB0cmVnc19zdHViIGZ1bmMKQEAgLTM2OSw0MSArMzcwLDczIEBACiAjaW5jbHVkZSA8YXNtL3N5c2NhbGxzXzY0Lmg+CiAKIC8qCisgKiAlcmRpOiBwcmV2IHRhc2sKKyAqICVyc2k6IG5leHQgdGFzaworICovCitFTlRSWShfX3N3aXRjaF90b19hc20pCisJLyoKKwkgKiBTYXZlIGNhbGxlZS1zYXZlZCByZWdpc3RlcnMKKwkgKiBUaGlzIG11c3QgbWF0Y2ggdGhlIG9yZGVyIGluIGluYWN0aXZlX3Rhc2tfZnJhbWUKKwkgKi8KKwlwdXNocQklcmJwCisJcHVzaHEJJXJieAorCXB1c2hxCSVyMTIKKwlwdXNocQklcjEzCisJcHVzaHEJJXIxNAorCXB1c2hxCSVyMTUKKworCS8qIHN3aXRjaCBzdGFjayAqLworCW1vdnEJJXJzcCwgVEFTS190aHJlYWRzcCglcmRpKQorCW1vdnEJVEFTS190aHJlYWRzcCglcnNpKSwgJXJzcAorCisjaWZkZWYgQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SCisJbW92cQlUQVNLX3N0YWNrX2NhbmFyeSglcnNpKSwgJXJieAorCW1vdnEJJXJieCwgUEVSX0NQVV9WQVIoaXJxX3N0YWNrX3VuaW9uKStzdGFja19jYW5hcnlfb2Zmc2V0CisjZW5kaWYKKworCS8qIHJlc3RvcmUgY2FsbGVlLXNhdmVkIHJlZ2lzdGVycyAqLworCXBvcHEJJXIxNQorCXBvcHEJJXIxNAorCXBvcHEJJXIxMworCXBvcHEJJXIxMgorCXBvcHEJJXJieAorCXBvcHEJJXJicAorCisJam1wCV9fc3dpdGNoX3RvCitFTkQoX19zd2l0Y2hfdG9fYXNtKQorCisvKgogICogQSBuZXdseSBmb3JrZWQgcHJvY2VzcyBkaXJlY3RseSBjb250ZXh0IHN3aXRjaGVzIGludG8gdGhpcyBhZGRyZXNzLgogICoKLSAqIHJkaTogcHJldiB0YXNrIHdlIHN3aXRjaGVkIGZyb20KKyAqIHJheDogcHJldiB0YXNrIHdlIHN3aXRjaGVkIGZyb20KKyAqIHJieDoga2VybmVsIHRocmVhZCBmdW5jIChOVUxMIGZvciB1c2VyIHRocmVhZCkKKyAqIHIxMjoga2VybmVsIHRocmVhZCBhcmcKICAqLwogRU5UUlkocmV0X2Zyb21fZm9yaykKLQlMT0NLIDsgYnRyICRUSUZfRk9SSywgVElfZmxhZ3MoJXI4KQotCisJbW92cQklcmF4LCAlcmRpCiAJY2FsbAlzY2hlZHVsZV90YWlsCQkJLyogcmRpOiAncHJldicgdGFzayBwYXJhbWV0ZXIgKi8KIAotCXRlc3RiCSQzLCBDUyglcnNwKQkJCS8qIGZyb20ga2VybmVsX3RocmVhZD8gKi8KLQlqbnoJMWYKKwl0ZXN0cQklcmJ4LCAlcmJ4CQkJLyogZnJvbSBrZXJuZWxfdGhyZWFkPyAqLworCWpuegkxZgkJCQkvKiBrZXJuZWwgdGhyZWFkcyBhcmUgdW5jb21tb24gKi8KIAotCS8qCi0JICogV2UgY2FtZSBmcm9tIGtlcm5lbF90aHJlYWQuICBUaGlzIGNvZGUgcGF0aCBpcyBxdWl0ZSB0d2lzdGVkLCBhbmQKLQkgKiBzb21lb25lIHNob3VsZCBjbGVhbiBpdCB1cC4KLQkgKgotCSAqIGNvcHlfdGhyZWFkX3RscyBzdGFzaGVzIHRoZSBmdW5jdGlvbiBwb2ludGVyIGluIFJCWCBhbmQgdGhlCi0JICogcGFyYW1ldGVyIHRvIGJlIHBhc3NlZCBpbiBSQlAuICBUaGUgY2FsbGVkIGZ1bmN0aW9uIGlzIHBlcm1pdHRlZAotCSAqIHRvIGNhbGwgZG9fZXhlY3ZlIGFuZCB0aGVyZWJ5IGp1bXAgdG8gdXNlciBtb2RlLgotCSAqLwotCW1vdnEJUkJQKCVyc3ApLCAlcmRpCi0JY2FsbAkqUkJYKCVyc3ApCi0JbW92bAkkMCwgUkFYKCVyc3ApCi0KLQkvKgotCSAqIEZhbGwgdGhyb3VnaCBhcyB0aG91Z2ggd2UncmUgZXhpdGluZyBhIHN5c2NhbGwuICBUaGlzIG1ha2VzIGEKLQkgKiB0d2lzdGVkIHNvcnQgb2Ygc2Vuc2UgaWYgd2UganVzdCBjYWxsZWQgZG9fZXhlY3ZlLgotCSAqLwotCi0xOgorMjoKIAltb3ZxCSVyc3AsICVyZGkKIAljYWxsCXN5c2NhbGxfcmV0dXJuX3Nsb3dwYXRoCS8qIHJldHVybnMgd2l0aCBJUlFzIGRpc2FibGVkICovCiAJVFJBQ0VfSVJRU19PTgkJCS8qIHVzZXIgbW9kZSBpcyB0cmFjZWQgYXMgSVJRUyBvbiAqLwogCVNXQVBHUwogCWptcAlyZXN0b3JlX3JlZ3NfYW5kX2lyZXQKKworMToKKwkvKiBrZXJuZWwgdGhyZWFkICovCisJbW92cQklcjEyLCAlcmRpCisJY2FsbAkqJXJieAorCS8qCisJICogQSBrZXJuZWwgdGhyZWFkIGlzIGFsbG93ZWQgdG8gcmV0dXJuIGhlcmUgYWZ0ZXIgc3VjY2Vzc2Z1bGx5CisJICogY2FsbGluZyBkb19leGVjdmUoKS4gIEV4aXQgdG8gdXNlcnNwYWNlIHRvIGNvbXBsZXRlIHRoZSBleGVjdmUoKQorCSAqIHN5c2NhbGwuCisJICovCisJbW92cQkkMCwgUkFYKCVyc3ApCisJam1wCTJiCiBFTkQocmV0X2Zyb21fZm9yaykKIAogLyoKQEAgLTU1NSwyNyArNTg4LDY5IEBACiAKICNpZmRlZiBDT05GSUdfWDg2X0VTUEZJWDY0CiBuYXRpdmVfaXJxX3JldHVybl9sZHQ6Ci0JcHVzaHEJJXJheAotCXB1c2hxCSVyZGkKKwkvKgorCSAqIFdlIGFyZSBydW5uaW5nIHdpdGggdXNlciBHU0JBU0UuICBBbGwgR1BScyBjb250YWluIHRoZWlyIHVzZXIKKwkgKiB2YWx1ZXMuICBXZSBoYXZlIGEgcGVyY3B1IEVTUEZJWCBzdGFjayB0aGF0IGlzIGVpZ2h0IHNsb3RzCisJICogbG9uZyAoc2VlIEVTUEZJWF9TVEFDS19TSVpFKS4gIGVzcGZpeF93YWRkciBwb2ludHMgdG8gdGhlIGJvdHRvbQorCSAqIG9mIHRoZSBFU1BGSVggc3RhY2suCisJICoKKwkgKiBXZSBjbG9iYmVyIFJBWCBhbmQgUkRJIGluIHRoaXMgY29kZS4gIFdlIHN0YXNoIFJESSBvbiB0aGUKKwkgKiBub3JtYWwgc3RhY2sgYW5kIFJBWCBvbiB0aGUgRVNQRklYIHN0YWNrLgorCSAqCisJICogVGhlIEVTUEZJWCBzdGFjayBsYXlvdXQgd2Ugc2V0IHVwIGxvb2tzIGxpa2UgdGhpczoKKwkgKgorCSAqIC0tLSB0b3Agb2YgRVNQRklYIHN0YWNrIC0tLQorCSAqIFNTCisJICogUlNQCisJICogUkZMQUdTCisJICogQ1MKKwkgKiBSSVAgIDwtLSBSU1AgcG9pbnRzIGhlcmUgd2hlbiB3ZSdyZSBkb25lCisJICogUkFYICA8LS0gZXNwZml4X3dhZGRyIHBvaW50cyBoZXJlCisJICogLS0tIGJvdHRvbSBvZiBFU1BGSVggc3RhY2sgLS0tCisJICovCisKKwlwdXNocQklcmRpCQkJCS8qIFN0YXNoIHVzZXIgUkRJICovCiAJU1dBUEdTCiAJbW92cQlQRVJfQ1BVX1ZBUihlc3BmaXhfd2FkZHIpLCAlcmRpCi0JbW92cQklcmF4LCAoMCo4KSglcmRpKQkJLyogUkFYICovCi0JbW92cQkoMio4KSglcnNwKSwgJXJheAkJLyogUklQICovCisJbW92cQklcmF4LCAoMCo4KSglcmRpKQkJLyogdXNlciBSQVggKi8KKwltb3ZxCSgxKjgpKCVyc3ApLCAlcmF4CQkvKiB1c2VyIFJJUCAqLwogCW1vdnEJJXJheCwgKDEqOCkoJXJkaSkKLQltb3ZxCSgzKjgpKCVyc3ApLCAlcmF4CQkvKiBDUyAqLworCW1vdnEJKDIqOCkoJXJzcCksICVyYXgJCS8qIHVzZXIgQ1MgKi8KIAltb3ZxCSVyYXgsICgyKjgpKCVyZGkpCi0JbW92cQkoNCo4KSglcnNwKSwgJXJheAkJLyogUkZMQUdTICovCisJbW92cQkoMyo4KSglcnNwKSwgJXJheAkJLyogdXNlciBSRkxBR1MgKi8KIAltb3ZxCSVyYXgsICgzKjgpKCVyZGkpCi0JbW92cQkoNio4KSglcnNwKSwgJXJheAkJLyogU1MgKi8KKwltb3ZxCSg1KjgpKCVyc3ApLCAlcmF4CQkvKiB1c2VyIFNTICovCiAJbW92cQklcmF4LCAoNSo4KSglcmRpKQotCW1vdnEJKDUqOCkoJXJzcCksICVyYXgJCS8qIFJTUCAqLworCW1vdnEJKDQqOCkoJXJzcCksICVyYXgJCS8qIHVzZXIgUlNQICovCiAJbW92cQklcmF4LCAoNCo4KSglcmRpKQotCWFuZGwJJDB4ZmZmZjAwMDAsICVlYXgKLQlwb3BxCSVyZGkKKwkvKiBOb3cgUkFYID09IFJTUC4gKi8KKworCWFuZGwJJDB4ZmZmZjAwMDAsICVlYXgJCS8qIFJBWCA9IChSU1AgJiAweGZmZmYwMDAwKSAqLworCXBvcHEJJXJkaQkJCQkvKiBSZXN0b3JlIHVzZXIgUkRJICovCisKKwkvKgorCSAqIGVzcGZpeF9zdGFja1szMToxNl0gPT0gMC4gIFRoZSBwYWdlIHRhYmxlcyBhcmUgc2V0IHVwIHN1Y2ggdGhhdAorCSAqIChlc3BmaXhfc3RhY2sgfCAoWCAmIDB4ZmZmZjAwMDApKSBwb2ludHMgdG8gYSByZWFkLW9ubHkgYWxpYXMgb2YKKwkgKiBlc3BmaXhfd2FkZHIgZm9yIGFueSBYLiAgVGhhdCBpcywgdGhlcmUgYXJlIDY1NTM2IFJPIGFsaWFzZXMgb2YKKwkgKiB0aGUgc2FtZSBwYWdlLiAgU2V0IHVwIFJTUCBzbyB0aGF0IFJTUFszMToxNl0gY29udGFpbnMgdGhlCisJICogcmVzcGVjdGl2ZSAxNiBiaXRzIG9mIHRoZSAvdXNlcnNwYWNlLyBSU1AgYW5kIFJTUCBub25ldGhlbGVzcworCSAqIHN0aWxsIHBvaW50cyB0byBhbiBSTyBhbGlhcyBvZiB0aGUgRVNQRklYIHN0YWNrLgorCSAqLwogCW9ycQlQRVJfQ1BVX1ZBUihlc3BmaXhfc3RhY2spLCAlcmF4CiAJU1dBUEdTCiAJbW92cQklcmF4LCAlcnNwCi0JcG9wcQklcmF4CisKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQsIHdlIGNhbm5vdCB3cml0ZSB0byB0aGUgc3RhY2sgYW55IG1vcmUsIGJ1dCB3ZSBjYW4KKwkgKiBzdGlsbCByZWFkLgorCSAqLworCXBvcHEJJXJheAkJCQkvKiBSZXN0b3JlIHVzZXIgUkFYICovCisKKwkvKgorCSAqIFJTUCBub3cgcG9pbnRzIHRvIGFuIG9yZGluYXJ5IElSRVQgZnJhbWUsIGV4Y2VwdCB0aGF0IHRoZSBwYWdlCisJICogaXMgcmVhZC1vbmx5IGFuZCBSU1BbMzE6MTZdIGFyZSBwcmVsb2FkZWQgd2l0aCB0aGUgdXNlcnNwYWNlCisJICogdmFsdWVzLiAgV2UgY2FuIG5vdyBJUkVUIGJhY2sgdG8gdXNlcnNwYWNlLgorCSAqLwogCWptcAluYXRpdmVfaXJxX3JldHVybl9pcmV0CiAjZW5kaWYKIEVORChjb21tb25faW50ZXJydXB0KQpAQCAtMTAwMiw3ICsxMDc3LDYgQEAKIAl0ZXN0YgkkMywgQ1MrOCglcnNwKQogCWp6CS5MZXJyb3Jfa2VybmVsc3BhY2UKIAotLkxlcnJvcl9lbnRyeV9mcm9tX3VzZXJtb2RlX3N3YXBnczoKIAkvKgogCSAqIFdlIGVudGVyZWQgZnJvbSB1c2VyIG1vZGUgb3Igd2UncmUgcHJldGVuZGluZyB0byBoYXZlIGVudGVyZWQKIAkgKiBmcm9tIHVzZXIgbW9kZSBkdWUgdG8gYW4gSVJFVCBmYXVsdC4KQEAgLTEwNDUsNyArMTExOSw4IEBACiAJICogZ3NiYXNlIGFuZCBwcm9jZWVkLiAgV2UnbGwgZml4IHVwIHRoZSBleGNlcHRpb24gYW5kIGxhbmQgaW4KIAkgKiAuTGdzX2NoYW5nZSdzIGVycm9yIGhhbmRsZXIgd2l0aCBrZXJuZWwgZ3NiYXNlLgogCSAqLwotCWptcAkuTGVycm9yX2VudHJ5X2Zyb21fdXNlcm1vZGVfc3dhcGdzCisJU1dBUEdTCisJam1wIC5MZXJyb3JfZW50cnlfZG9uZQogCiAuTGJzdGVwX2lyZXQ6CiAJLyogRml4IHRydW5jYXRlZCBSSVAgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2VudHJ5L3Zkc28vdmNsb2NrX2dldHRpbWUuYyBiL2FyY2gveDg2L2VudHJ5L3Zkc28vdmNsb2NrX2dldHRpbWUuYwppbmRleCA5NGQ1NGQwLi4wMjIyM2NiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9lbnRyeS92ZHNvL3ZjbG9ja19nZXR0aW1lLmMKKysrIGIvYXJjaC94ODYvZW50cnkvdmRzby92Y2xvY2tfZ2V0dGltZS5jCkBAIC0xMjksNyArMTI5LDcgQEAKIAkJCXJldHVybiAwOwogCQl9CiAKLQkJcmV0ID0gX19wdmNsb2NrX3JlYWRfY3ljbGVzKHB2dGkpOworCQlyZXQgPSBfX3B2Y2xvY2tfcmVhZF9jeWNsZXMocHZ0aSwgcmR0c2Nfb3JkZXJlZCgpKTsKIAl9IHdoaWxlIChwdmNsb2NrX3JlYWRfcmV0cnkocHZ0aSwgdmVyc2lvbikpOwogCiAJLyogcmVmZXIgdG8gdnJlYWRfdHNjKCkgY29tbWVudCBmb3IgcmF0aW9uYWxlICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9lbnRyeS92ZHNvL3Zkc28yYy5oIGIvYXJjaC94ODYvZW50cnkvdmRzby92ZHNvMmMuaAppbmRleCA0Zjc0MTE5Li4zZGFiNzVmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9lbnRyeS92ZHNvL3Zkc28yYy5oCisrKyBiL2FyY2gveDg2L2VudHJ5L3Zkc28vdmRzbzJjLmgKQEAgLTIyLDcgKzIyLDcgQEAKIAogCUVMRihQaGRyKSAqcHQgPSAoRUxGKFBoZHIpICopKHJhd19hZGRyICsgR0VUX0xFKCZoZHItPmVfcGhvZmYpKTsKIAotCWlmIChoZHItPmVfdHlwZSAhPSBFVF9EWU4pCisJaWYgKEdFVF9MRSgmaGRyLT5lX3R5cGUpICE9IEVUX0RZTikKIAkJZmFpbCgiaW5wdXQgaXMgbm90IGEgc2hhcmVkIG9iamVjdFxuIik7CiAKIAkvKiBXYWxrIHRoZSBzZWdtZW50IHRhYmxlLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvZW50cnkvdmRzby92bWEuYyBiL2FyY2gveDg2L2VudHJ5L3Zkc28vdm1hLmMKaW5kZXggZjg0MDc2Ni4uMjNjODgxYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvZW50cnkvdmRzby92bWEuYworKysgYi9hcmNoL3g4Ni9lbnRyeS92ZHNvL3ZtYS5jCkBAIC0zNyw1NCArMzcsNiBAQAogCiBzdHJ1Y3QgbGludXhfYmlucHJtOwogCi0vKgotICogUHV0IHRoZSB2ZHNvIGFib3ZlIHRoZSAocmFuZG9taXplZCkgc3RhY2sgd2l0aCBhbm90aGVyIHJhbmRvbWl6ZWQKLSAqIG9mZnNldC4gIFRoaXMgd2F5IHRoZXJlIGlzIG5vIGhvbGUgaW4gdGhlIG1pZGRsZSBvZiBhZGRyZXNzIHNwYWNlLgotICogVG8gc2F2ZSBtZW1vcnkgbWFrZSBzdXJlIGl0IGlzIHN0aWxsIGluIHRoZSBzYW1lIFBURSBhcyB0aGUgc3RhY2sKLSAqIHRvcC4gIFRoaXMgZG9lc24ndCBnaXZlIHRoYXQgbWFueSByYW5kb20gYml0cy4KLSAqCi0gKiBOb3RlIHRoYXQgdGhpcyBhbGdvcml0aG0gaXMgaW1wZXJmZWN0OiB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB2ZHNvCi0gKiBzdGFydCBhZGRyZXNzIHdpdGhpbiBhIFBNRCBpcyBiaWFzZWQgdG93YXJkIHRoZSBlbmQuCi0gKgotICogT25seSB1c2VkIGZvciB0aGUgNjQtYml0IGFuZCB4MzIgdmRzb3MuCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHZkc29fYWRkcih1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsZW4pCi17Ci0jaWZkZWYgQ09ORklHX1g4Nl8zMgotCXJldHVybiAwOwotI2Vsc2UKLQl1bnNpZ25lZCBsb25nIGFkZHIsIGVuZDsKLQl1bnNpZ25lZCBvZmZzZXQ7Ci0KLQkvKgotCSAqIFJvdW5kIHVwIHRoZSBzdGFydCBhZGRyZXNzLiAgSXQgY2FuIHN0YXJ0IG91dCB1bmFsaWduZWQgYXMgYSByZXN1bHQKLQkgKiBvZiBzdGFjayBzdGFydCByYW5kb21pemF0aW9uLgotCSAqLwotCXN0YXJ0ID0gUEFHRV9BTElHTihzdGFydCk7Ci0KLQkvKiBSb3VuZCB0aGUgbG93ZXN0IHBvc3NpYmxlIGVuZCBhZGRyZXNzIHVwIHRvIGEgUE1EIGJvdW5kYXJ5LiAqLwotCWVuZCA9IChzdGFydCArIGxlbiArIFBNRF9TSVpFIC0gMSkgJiBQTURfTUFTSzsKLQlpZiAoZW5kID49IFRBU0tfU0laRV9NQVgpCi0JCWVuZCA9IFRBU0tfU0laRV9NQVg7Ci0JZW5kIC09IGxlbjsKLQotCWlmIChlbmQgPiBzdGFydCkgewotCQlvZmZzZXQgPSBnZXRfcmFuZG9tX2ludCgpICUgKCgoZW5kIC0gc3RhcnQpID4+IFBBR0VfU0hJRlQpICsgMSk7Ci0JCWFkZHIgPSBzdGFydCArIChvZmZzZXQgPDwgUEFHRV9TSElGVCk7Ci0JfSBlbHNlIHsKLQkJYWRkciA9IHN0YXJ0OwotCX0KLQotCS8qCi0JICogRm9yY2libHkgYWxpZ24gdGhlIGZpbmFsIGFkZHJlc3MgaW4gY2FzZSB3ZSBoYXZlIGEgaGFyZHdhcmUKLQkgKiBpc3N1ZSB0aGF0IHJlcXVpcmVzIGFsaWdubWVudCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KLQkgKi8KLQlhZGRyID0gYWxpZ25fdmRzb19hZGRyKGFkZHIpOwotCi0JcmV0dXJuIGFkZHI7Ci0jZW5kaWYKLX0KLQogc3RhdGljIGludCB2ZHNvX2ZhdWx0KGNvbnN0IHN0cnVjdCB2bV9zcGVjaWFsX21hcHBpbmcgKnNtLAogCQkgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHZtX2ZhdWx0ICp2bWYpCiB7CkBAIC0xNzYsMzAgKzEyOCwyOCBAQAogCXJldHVybiBWTV9GQVVMVF9TSUdCVVM7CiB9CiAKLXN0YXRpYyBpbnQgbWFwX3Zkc28oY29uc3Qgc3RydWN0IHZkc29faW1hZ2UgKmltYWdlLCBib29sIGNhbGN1bGF0ZV9hZGRyKQorc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9zcGVjaWFsX21hcHBpbmcgdmRzb19tYXBwaW5nID0geworCS5uYW1lID0gIlt2ZHNvXSIsCisJLmZhdWx0ID0gdmRzb19mYXVsdCwKKwkubXJlbWFwID0gdmRzb19tcmVtYXAsCit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9zcGVjaWFsX21hcHBpbmcgdnZhcl9tYXBwaW5nID0geworCS5uYW1lID0gIlt2dmFyXSIsCisJLmZhdWx0ID0gdnZhcl9mYXVsdCwKK307CisKKy8qCisgKiBBZGQgdmRzbyBhbmQgdnZhciBtYXBwaW5ncyB0byBjdXJyZW50IHByb2Nlc3MuCisgKiBAaW1hZ2UgICAgICAgICAgLSBibG9iIHRvIG1hcAorICogQGFkZHIgICAgICAgICAgIC0gcmVxdWVzdCBhIHNwZWNpZmljIGFkZHJlc3MgKHplcm8gdG8gbWFwIGF0IGZyZWUgYWRkcikKKyAqLworc3RhdGljIGludCBtYXBfdmRzbyhjb25zdCBzdHJ1Y3QgdmRzb19pbWFnZSAqaW1hZ2UsIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOwogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwotCXVuc2lnbmVkIGxvbmcgYWRkciwgdGV4dF9zdGFydDsKKwl1bnNpZ25lZCBsb25nIHRleHRfc3RhcnQ7CiAJaW50IHJldCA9IDA7CiAKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHZtX3NwZWNpYWxfbWFwcGluZyB2ZHNvX21hcHBpbmcgPSB7Ci0JCS5uYW1lID0gIlt2ZHNvXSIsCi0JCS5mYXVsdCA9IHZkc29fZmF1bHQsCi0JCS5tcmVtYXAgPSB2ZHNvX21yZW1hcCwKLQl9OwotCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fc3BlY2lhbF9tYXBwaW5nIHZ2YXJfbWFwcGluZyA9IHsKLQkJLm5hbWUgPSAiW3Z2YXJdIiwKLQkJLmZhdWx0ID0gdnZhcl9mYXVsdCwKLQl9OwotCi0JaWYgKGNhbGN1bGF0ZV9hZGRyKSB7Ci0JCWFkZHIgPSB2ZHNvX2FkZHIoY3VycmVudC0+bW0tPnN0YXJ0X3N0YWNrLAotCQkJCSBpbWFnZS0+c2l6ZSAtIGltYWdlLT5zeW1fdnZhcl9zdGFydCk7Ci0JfSBlbHNlIHsKLQkJYWRkciA9IDA7Ci0JfQotCiAJaWYgKGRvd25fd3JpdGVfa2lsbGFibGUoJm1tLT5tbWFwX3NlbSkpCiAJCXJldHVybiAtRUlOVFI7CiAKQEAgLTIzOCwyNCArMTg4LDEwNCBAQAogCiAJaWYgKElTX0VSUih2bWEpKSB7CiAJCXJldCA9IFBUUl9FUlIodm1hKTsKLQkJZ290byB1cF9mYWlsOworCQlkb19tdW5tYXAobW0sIHRleHRfc3RhcnQsIGltYWdlLT5zaXplKTsKIAl9CiAKIHVwX2ZhaWw6Ci0JaWYgKHJldCkKKwlpZiAocmV0KSB7CiAJCWN1cnJlbnQtPm1tLT5jb250ZXh0LnZkc28gPSBOVUxMOworCQljdXJyZW50LT5tbS0+Y29udGV4dC52ZHNvX2ltYWdlID0gTlVMTDsKKwl9CiAKIAl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKIAlyZXR1cm4gcmV0OwogfQogCisjaWZkZWYgQ09ORklHX1g4Nl82NAorLyoKKyAqIFB1dCB0aGUgdmRzbyBhYm92ZSB0aGUgKHJhbmRvbWl6ZWQpIHN0YWNrIHdpdGggYW5vdGhlciByYW5kb21pemVkCisgKiBvZmZzZXQuICBUaGlzIHdheSB0aGVyZSBpcyBubyBob2xlIGluIHRoZSBtaWRkbGUgb2YgYWRkcmVzcyBzcGFjZS4KKyAqIFRvIHNhdmUgbWVtb3J5IG1ha2Ugc3VyZSBpdCBpcyBzdGlsbCBpbiB0aGUgc2FtZSBQVEUgYXMgdGhlIHN0YWNrCisgKiB0b3AuICBUaGlzIGRvZXNuJ3QgZ2l2ZSB0aGF0IG1hbnkgcmFuZG9tIGJpdHMuCisgKgorICogTm90ZSB0aGF0IHRoaXMgYWxnb3JpdGhtIGlzIGltcGVyZmVjdDogdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgdmRzbworICogc3RhcnQgYWRkcmVzcyB3aXRoaW4gYSBQTUQgaXMgYmlhc2VkIHRvd2FyZCB0aGUgZW5kLgorICoKKyAqIE9ubHkgdXNlZCBmb3IgdGhlIDY0LWJpdCBhbmQgeDMyIHZkc29zLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyB2ZHNvX2FkZHIodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgYWRkciwgZW5kOworCXVuc2lnbmVkIG9mZnNldDsKKworCS8qCisJICogUm91bmQgdXAgdGhlIHN0YXJ0IGFkZHJlc3MuICBJdCBjYW4gc3RhcnQgb3V0IHVuYWxpZ25lZCBhcyBhIHJlc3VsdAorCSAqIG9mIHN0YWNrIHN0YXJ0IHJhbmRvbWl6YXRpb24uCisJICovCisJc3RhcnQgPSBQQUdFX0FMSUdOKHN0YXJ0KTsKKworCS8qIFJvdW5kIHRoZSBsb3dlc3QgcG9zc2libGUgZW5kIGFkZHJlc3MgdXAgdG8gYSBQTUQgYm91bmRhcnkuICovCisJZW5kID0gKHN0YXJ0ICsgbGVuICsgUE1EX1NJWkUgLSAxKSAmIFBNRF9NQVNLOworCWlmIChlbmQgPj0gVEFTS19TSVpFX01BWCkKKwkJZW5kID0gVEFTS19TSVpFX01BWDsKKwllbmQgLT0gbGVuOworCisJaWYgKGVuZCA+IHN0YXJ0KSB7CisJCW9mZnNldCA9IGdldF9yYW5kb21faW50KCkgJSAoKChlbmQgLSBzdGFydCkgPj4gUEFHRV9TSElGVCkgKyAxKTsKKwkJYWRkciA9IHN0YXJ0ICsgKG9mZnNldCA8PCBQQUdFX1NISUZUKTsKKwl9IGVsc2UgeworCQlhZGRyID0gc3RhcnQ7CisJfQorCisJLyoKKwkgKiBGb3JjaWJseSBhbGlnbiB0aGUgZmluYWwgYWRkcmVzcyBpbiBjYXNlIHdlIGhhdmUgYSBoYXJkd2FyZQorCSAqIGlzc3VlIHRoYXQgcmVxdWlyZXMgYWxpZ25tZW50IGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgorCSAqLworCWFkZHIgPSBhbGlnbl92ZHNvX2FkZHIoYWRkcik7CisKKwlyZXR1cm4gYWRkcjsKK30KKworc3RhdGljIGludCBtYXBfdmRzb19yYW5kb21pemVkKGNvbnN0IHN0cnVjdCB2ZHNvX2ltYWdlICppbWFnZSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSB2ZHNvX2FkZHIoY3VycmVudC0+bW0tPnN0YXJ0X3N0YWNrLCBpbWFnZS0+c2l6ZS1pbWFnZS0+c3ltX3Z2YXJfc3RhcnQpOworCisJcmV0dXJuIG1hcF92ZHNvKGltYWdlLCBhZGRyKTsKK30KKyNlbmRpZgorCitpbnQgbWFwX3Zkc29fb25jZShjb25zdCBzdHJ1Y3QgdmRzb19pbWFnZSAqaW1hZ2UsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCisJZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwkvKgorCSAqIENoZWNrIGlmIHdlIGhhdmUgYWxyZWFkeSBtYXBwZWQgdmRzbyBibG9iIC0gZmFpbCB0byBwcmV2ZW50CisJICogYWJ1c2luZyBmcm9tIHVzZXJzcGFjZSBpbnN0YWxsX3NwZWNpYWxsX21hcHBpbmcsIHdoaWNoIG1heQorCSAqIG5vdCBkbyBhY2NvdW50aW5nIGFuZCBybGltaXQgcmlnaHQuCisJICogV2UgY291bGQgc2VhcmNoIHZtYSBuZWFyIGNvbnRleHQudmRzbywgYnV0IGl0J3MgYSBzbG93cGF0aCwKKwkgKiBzbyBsZXQncyBleHBsaWNpdGVseSBjaGVjayBhbGwgVk1BcyB0byBiZSBjb21wbGV0ZWx5IHN1cmUuCisJICovCisJZm9yICh2bWEgPSBtbS0+bW1hcDsgdm1hOyB2bWEgPSB2bWEtPnZtX25leHQpIHsKKwkJaWYgKHZtYV9pc19zcGVjaWFsX21hcHBpbmcodm1hLCAmdmRzb19tYXBwaW5nKSB8fAorCQkJCXZtYV9pc19zcGVjaWFsX21hcHBpbmcodm1hLCAmdnZhcl9tYXBwaW5nKSkgeworCQkJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJCQlyZXR1cm4gLUVFWElTVDsKKwkJfQorCX0KKwl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKworCXJldHVybiBtYXBfdmRzbyhpbWFnZSwgYWRkcik7Cit9CisKICNpZiBkZWZpbmVkKENPTkZJR19YODZfMzIpIHx8IGRlZmluZWQoQ09ORklHX0lBMzJfRU1VTEFUSU9OKQogc3RhdGljIGludCBsb2FkX3Zkc28zMih2b2lkKQogewogCWlmICh2ZHNvMzJfZW5hYmxlZCAhPSAxKSAgLyogT3RoZXIgdmFsdWVzIGFsbCBtZWFuICJkaXNhYmxlZCIgKi8KIAkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gbWFwX3Zkc28oJnZkc29faW1hZ2VfMzIsIGZhbHNlKTsKKwlyZXR1cm4gbWFwX3Zkc28oJnZkc29faW1hZ2VfMzIsIDApOwogfQogI2VuZGlmCiAKQEAgLTI2NSw3ICsyOTUsNyBAQAogCWlmICghdmRzbzY0X2VuYWJsZWQpCiAJCXJldHVybiAwOwogCi0JcmV0dXJuIG1hcF92ZHNvKCZ2ZHNvX2ltYWdlXzY0LCB0cnVlKTsKKwlyZXR1cm4gbWFwX3Zkc29fcmFuZG9taXplZCgmdmRzb19pbWFnZV82NCk7CiB9CiAKICNpZmRlZiBDT05GSUdfQ09NUEFUCkBAIC0yNzYsOCArMzA2LDcgQEAKIAlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfWDMyKSkgewogCQlpZiAoIXZkc282NF9lbmFibGVkKQogCQkJcmV0dXJuIDA7Ci0KLQkJcmV0dXJuIG1hcF92ZHNvKCZ2ZHNvX2ltYWdlX3gzMiwgdHJ1ZSk7CisJCXJldHVybiBtYXBfdmRzb19yYW5kb21pemVkKCZ2ZHNvX2ltYWdlX3gzMik7CiAJfQogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0lBMzJfRU1VTEFUSU9OCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ldmVudHMvYW1kL2NvcmUuYyBiL2FyY2gveDg2L2V2ZW50cy9hbWQvY29yZS5jCmluZGV4IGUwN2EyMmIuLmY1ZjRiM2YgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2V2ZW50cy9hbWQvY29yZS5jCisrKyBiL2FyY2gveDg2L2V2ZW50cy9hbWQvY29yZS5jCkBAIC0xMTksOCArMTE5LDggQEAKIHsKICAgW1BFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFU10JCQk9IDB4MDA3NiwKICAgW1BFUkZfQ09VTlRfSFdfSU5TVFJVQ1RJT05TXQkJCT0gMHgwMGMwLAotICBbUEVSRl9DT1VOVF9IV19DQUNIRV9SRUZFUkVOQ0VTXQkJPSAweDAwODAsCi0gIFtQRVJGX0NPVU5UX0hXX0NBQ0hFX01JU1NFU10JCQk9IDB4MDA4MSwKKyAgW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVGRVJFTkNFU10JCT0gMHgwNzdkLAorICBbUEVSRl9DT1VOVF9IV19DQUNIRV9NSVNTRVNdCQkJPSAweDA3N2UsCiAgIFtQRVJGX0NPVU5UX0hXX0JSQU5DSF9JTlNUUlVDVElPTlNdCQk9IDB4MDBjMiwKICAgW1BFUkZfQ09VTlRfSFdfQlJBTkNIX01JU1NFU10JCQk9IDB4MDBjMywKICAgW1BFUkZfQ09VTlRfSFdfU1RBTExFRF9DWUNMRVNfRlJPTlRFTkRdCT0gMHgwMGQwLCAvKiAiRGVjb2RlciBlbXB0eSIgZXZlbnQgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2V2ZW50cy9hbWQvdW5jb3JlLmMgYi9hcmNoL3g4Ni9ldmVudHMvYW1kL3VuY29yZS5jCmluZGV4IGU2MTMxZDQuLjY1NTc3ZjAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2V2ZW50cy9hbWQvdW5jb3JlLmMKKysrIGIvYXJjaC94ODYvZXZlbnRzL2FtZC91bmNvcmUuYwpAQCAtMjksNiArMjksOCBAQAogCiAjZGVmaW5lIENPVU5URVJfU0hJRlQJCTE2CiAKK3N0YXRpYyBITElTVF9IRUFEKHVuY29yZV91bnVzZWRfbGlzdCk7CisKIHN0cnVjdCBhbWRfdW5jb3JlIHsKIAlpbnQgaWQ7CiAJaW50IHJlZmNudDsKQEAgLTM5LDcgKzQxLDcgQEAKIAljcHVtYXNrX3QgKmFjdGl2ZV9tYXNrOwogCXN0cnVjdCBwbXUgKnBtdTsKIAlzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnRzW01BWF9DT1VOVEVSU107Ci0Jc3RydWN0IGFtZF91bmNvcmUgKmZyZWVfd2hlbl9jcHVfb25saW5lOworCXN0cnVjdCBobGlzdF9ub2RlIG5vZGU7CiB9OwogCiBzdGF0aWMgc3RydWN0IGFtZF91bmNvcmUgKiBfX3BlcmNwdSAqYW1kX3VuY29yZV9uYjsKQEAgLTMwNiw2ICszMDgsNyBAQAogCQl1bmNvcmVfbmItPm1zcl9iYXNlID0gTVNSX0YxNUhfTkJfUEVSRl9DVEw7CiAJCXVuY29yZV9uYi0+YWN0aXZlX21hc2sgPSAmYW1kX25iX2FjdGl2ZV9tYXNrOwogCQl1bmNvcmVfbmItPnBtdSA9ICZhbWRfbmJfcG11OworCQl1bmNvcmVfbmItPmlkID0gLTE7CiAJCSpwZXJfY3B1X3B0cihhbWRfdW5jb3JlX25iLCBjcHUpID0gdW5jb3JlX25iOwogCX0KIApAQCAtMzE5LDYgKzMyMiw3IEBACiAJCXVuY29yZV9sMi0+bXNyX2Jhc2UgPSBNU1JfRjE2SF9MMklfUEVSRl9DVEw7CiAJCXVuY29yZV9sMi0+YWN0aXZlX21hc2sgPSAmYW1kX2wyX2FjdGl2ZV9tYXNrOwogCQl1bmNvcmVfbDItPnBtdSA9ICZhbWRfbDJfcG11OworCQl1bmNvcmVfbDItPmlkID0gLTE7CiAJCSpwZXJfY3B1X3B0cihhbWRfdW5jb3JlX2wyLCBjcHUpID0gdW5jb3JlX2wyOwogCX0KIApAQCAtMzQ4LDcgKzM1Miw3IEBACiAJCQljb250aW51ZTsKIAogCQlpZiAodGhpcy0+aWQgPT0gdGhhdC0+aWQpIHsKLQkJCXRoYXQtPmZyZWVfd2hlbl9jcHVfb25saW5lID0gdGhpczsKKwkJCWhsaXN0X2FkZF9oZWFkKCZ0aGlzLT5ub2RlLCAmdW5jb3JlX3VudXNlZF9saXN0KTsKIAkJCXRoaXMgPSB0aGF0OwogCQkJYnJlYWs7CiAJCX0KQEAgLTM4OCwxMyArMzkyLDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHVuY29yZV9jbGVhbl9vbmxpbmUodm9pZCkKK3sKKwlzdHJ1Y3QgYW1kX3VuY29yZSAqdW5jb3JlOworCXN0cnVjdCBobGlzdF9ub2RlICpuOworCisJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh1bmNvcmUsIG4sICZ1bmNvcmVfdW51c2VkX2xpc3QsIG5vZGUpIHsKKwkJaGxpc3RfZGVsKCZ1bmNvcmUtPm5vZGUpOworCQlrZnJlZSh1bmNvcmUpOworCX0KK30KKwogc3RhdGljIHZvaWQgdW5jb3JlX29ubGluZSh1bnNpZ25lZCBpbnQgY3B1LAogCQkJICBzdHJ1Y3QgYW1kX3VuY29yZSAqIF9fcGVyY3B1ICp1bmNvcmVzKQogewogCXN0cnVjdCBhbWRfdW5jb3JlICp1bmNvcmUgPSAqcGVyX2NwdV9wdHIodW5jb3JlcywgY3B1KTsKIAotCWtmcmVlKHVuY29yZS0+ZnJlZV93aGVuX2NwdV9vbmxpbmUpOwotCXVuY29yZS0+ZnJlZV93aGVuX2NwdV9vbmxpbmUgPSBOVUxMOworCXVuY29yZV9jbGVhbl9vbmxpbmUoKTsKIAogCWlmIChjcHUgPT0gdW5jb3JlLT5jcHUpCiAJCWNwdW1hc2tfc2V0X2NwdShjcHUsIHVuY29yZS0+YWN0aXZlX21hc2spOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvZXZlbnRzL2NvcmUuYyBiL2FyY2gveDg2L2V2ZW50cy9jb3JlLmMKaW5kZXggZDBlZmI1Yy4uZDMxNzM1ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvZXZlbnRzL2NvcmUuYworKysgYi9hcmNoL3g4Ni9ldmVudHMvY29yZS5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CiAjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KICNpbmNsdWRlIDxhc20vbGR0Lmg+CisjaW5jbHVkZSA8YXNtL3Vud2luZC5oPgogCiAjaW5jbHVkZSAicGVyZl9ldmVudC5oIgogCkBAIC0xMjAxLDYgKzEyMDIsOSBAQAogCSAqIElmIGdyb3VwIGV2ZW50cyBzY2hlZHVsaW5nIHRyYW5zYWN0aW9uIHdhcyBzdGFydGVkLAogCSAqIHNraXAgdGhlIHNjaGVkdWxhYmlsaXR5IHRlc3QgaGVyZSwgaXQgd2lsbCBiZSBwZXJmb3JtZWQKIAkgKiBhdCBjb21taXQgdGltZSAoLT5jb21taXRfdHhuKSBhcyBhIHdob2xlLgorCSAqCisJICogSWYgY29tbWl0IGZhaWxzLCB3ZSdsbCBjYWxsIC0+ZGVsKCkgb24gYWxsIGV2ZW50cworCSAqIGZvciB3aGljaCAtPmFkZCgpIHdhcyBjYWxsZWQuCiAJICovCiAJaWYgKGNwdWMtPnR4bl9mbGFncyAmIFBFUkZfUE1VX1RYTl9BREQpCiAJCWdvdG8gZG9uZV9jb2xsZWN0OwpAQCAtMTIyMyw2ICsxMjI3LDE0IEBACiAJY3B1Yy0+bl9hZGRlZCArPSBuIC0gbjA7CiAJY3B1Yy0+bl90eG4gKz0gbiAtIG4wOwogCisJaWYgKHg4Nl9wbXUuYWRkKSB7CisJCS8qCisJCSAqIFRoaXMgaXMgYmVmb3JlIHg4Nl9wbXVfZW5hYmxlKCkgd2lsbCBjYWxsIHg4Nl9wbXVfc3RhcnQoKSwKKwkJICogc28gd2UgZW5hYmxlIExCUnMgYmVmb3JlIGFuIGV2ZW50IG5lZWRzIHRoZW0gZXRjLi4KKwkJICovCisJCXg4Nl9wbXUuYWRkKGV2ZW50KTsKKwl9CisKIAlyZXQgPSAwOwogb3V0OgogCXJldHVybiByZXQ7CkBAIC0xMzQ2LDcgKzEzNTgsNyBAQAogCWV2ZW50LT5ody5mbGFncyAmPSB+UEVSRl9YODZfRVZFTlRfQ09NTUlUVEVEOwogCiAJLyoKLQkgKiBJZiB3ZSdyZSBjYWxsZWQgZHVyaW5nIGEgdHhuLCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLgorCSAqIElmIHdlJ3JlIGNhbGxlZCBkdXJpbmcgYSB0eG4sIHdlIG9ubHkgbmVlZCB0byB1bmRvIHg4Nl9wbXUuYWRkLgogCSAqIFRoZSBldmVudHMgbmV2ZXIgZ290IHNjaGVkdWxlZCBhbmQgLT5jYW5jZWxfdHhuIHdpbGwgdHJ1bmNhdGUKIAkgKiB0aGUgZXZlbnRfbGlzdC4KIAkgKgpAQCAtMTM1NCw3ICsxMzY2LDcgQEAKIAkgKiBhbiBldmVudCBhZGRlZCBkdXJpbmcgdGhhdCBzYW1lIFRYTi4KIAkgKi8KIAlpZiAoY3B1Yy0+dHhuX2ZsYWdzICYgUEVSRl9QTVVfVFhOX0FERCkKLQkJcmV0dXJuOworCQlnb3RvIGRvX2RlbDsKIAogCS8qCiAJICogTm90IGEgVFhOLCB0aGVyZWZvcmUgY2xlYW51cCBwcm9wZXJseS4KQEAgLTEzODQsNiArMTM5NiwxNSBAQAogCS0tY3B1Yy0+bl9ldmVudHM7CiAKIAlwZXJmX2V2ZW50X3VwZGF0ZV91c2VycGFnZShldmVudCk7CisKK2RvX2RlbDoKKwlpZiAoeDg2X3BtdS5kZWwpIHsKKwkJLyoKKwkJICogVGhpcyBpcyBhZnRlciB4ODZfcG11X3N0b3AoKTsgc28gd2UgZGlzYWJsZSBMQlJzIGFmdGVyIGFueQorCQkgKiBldmVudCBjYW4gbmVlZCB0aGVtIGV0Yy4uCisJCSAqLworCQl4ODZfcG11LmRlbChldmVudCk7CisJfQogfQogCiBpbnQgeDg2X3BtdV9oYW5kbGVfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQpAQCAtMjI0NywzOSArMjI2OCwyNiBAQAogCWN5YzJuc19yZWFkX2VuZChkYXRhKTsKIH0KIAotLyoKLSAqIGNhbGxjaGFpbiBzdXBwb3J0Ci0gKi8KLQotc3RhdGljIGludCBiYWNrdHJhY2Vfc3RhY2sodm9pZCAqZGF0YSwgY2hhciAqbmFtZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBiYWNrdHJhY2VfYWRkcmVzcyh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGFkZHIsIGludCByZWxpYWJsZSkKLXsKLQlzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnlfY3R4ICplbnRyeSA9IGRhdGE7Ci0KLQlyZXR1cm4gcGVyZl9jYWxsY2hhaW5fc3RvcmUoZW50cnksIGFkZHIpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzIGJhY2t0cmFjZV9vcHMgPSB7Ci0JLnN0YWNrCQkJPSBiYWNrdHJhY2Vfc3RhY2ssCi0JLmFkZHJlc3MJCT0gYmFja3RyYWNlX2FkZHJlc3MsCi0JLndhbGtfc3RhY2sJCT0gcHJpbnRfY29udGV4dF9zdGFja19icCwKLX07Ci0KIHZvaWQKIHBlcmZfY2FsbGNoYWluX2tlcm5lbChzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnlfY3R4ICplbnRyeSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CisJc3RydWN0IHVud2luZF9zdGF0ZSBzdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisKIAlpZiAocGVyZl9ndWVzdF9jYnMgJiYgcGVyZl9ndWVzdF9jYnMtPmlzX2luX2d1ZXN0KCkpIHsKIAkJLyogVE9ETzogV2UgZG9uJ3Qgc3VwcG9ydCBndWVzdCBvcyBjYWxsY2hhaW4gbm93ICovCiAJCXJldHVybjsKIAl9CiAKLQlwZXJmX2NhbGxjaGFpbl9zdG9yZShlbnRyeSwgcmVncy0+aXApOworCWlmIChwZXJmX2NhbGxjaGFpbl9zdG9yZShlbnRyeSwgcmVncy0+aXApKQorCQlyZXR1cm47CiAKLQlkdW1wX3RyYWNlKE5VTEwsIHJlZ3MsIE5VTEwsIDAsICZiYWNrdHJhY2Vfb3BzLCBlbnRyeSk7CisJZm9yICh1bndpbmRfc3RhcnQoJnN0YXRlLCBjdXJyZW50LCByZWdzLCBOVUxMKTsgIXVud2luZF9kb25lKCZzdGF0ZSk7CisJICAgICB1bndpbmRfbmV4dF9mcmFtZSgmc3RhdGUpKSB7CisJCWFkZHIgPSB1bndpbmRfZ2V0X3JldHVybl9hZGRyZXNzKCZzdGF0ZSk7CisJCWlmICghYWRkciB8fCBwZXJmX2NhbGxjaGFpbl9zdG9yZShlbnRyeSwgYWRkcikpCisJCQlyZXR1cm47CisJfQogfQogCiBzdGF0aWMgaW5saW5lIGludApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL2J0cy5jIGIvYXJjaC94ODYvZXZlbnRzL2ludGVsL2J0cy5jCmluZGV4IDBhNmUzOTMuLjk4MmM5ZTMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9idHMuYworKysgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvYnRzLmMKQEAgLTMxLDcgKzMxLDE3IEBACiBzdHJ1Y3QgYnRzX2N0eCB7CiAJc3RydWN0IHBlcmZfb3V0cHV0X2hhbmRsZQloYW5kbGU7CiAJc3RydWN0IGRlYnVnX3N0b3JlCQlkc19iYWNrOwotCWludAkJCQlzdGFydGVkOworCWludAkJCQlzdGF0ZTsKK307CisKKy8qIEJUUyBjb250ZXh0IHN0YXRlczogKi8KK2VudW0geworCS8qIG5vIG9uZ29pbmcgQVVYIHRyYW5zYWN0aW9ucyAqLworCUJUU19TVEFURV9TVE9QUEVEID0gMCwKKwkvKiBBVVggdHJhbnNhY3Rpb24gaXMgb24sIEJUUyB0cmFjaW5nIGlzIGRpc2FibGVkICovCisJQlRTX1NUQVRFX0lOQUNUSVZFLAorCS8qIEFVWCB0cmFuc2FjdGlvbiBpcyBvbiwgQlRTIHRyYWNpbmcgaXMgcnVubmluZyAqLworCUJUU19TVEFURV9BQ1RJVkUsCiB9OwogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGJ0c19jdHgsIGJ0c19jdHgpOwpAQCAtMjA0LDYgKzIxNCwxNSBAQAogc3RhdGljIGludAogYnRzX2J1ZmZlcl9yZXNldChzdHJ1Y3QgYnRzX2J1ZmZlciAqYnVmLCBzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlICpoYW5kbGUpOwogCisvKgorICogT3JkZXJpbmcgUE1VIGNhbGxiYWNrcyB3cnQgdGhlbXNlbHZlcyBhbmQgdGhlIFBNSSBpcyBkb25lIGJ5IG1lYW5zCisgKiBvZiBidHM6OnN0YXRlLCB3aGljaDoKKyAqICAtIGlzIHNldCB3aGVuIGJ0czo6aGFuZGxlOjpldmVudCBpcyB2YWxpZCwgdGhhdCBpcywgYmV0d2VlbgorICogICAgcGVyZl9hdXhfb3V0cHV0X2JlZ2luKCkgYW5kIHBlcmZfYXV4X291dHB1dF9lbmQoKTsKKyAqICAtIGlzIHplcm8gb3RoZXJ3aXNlOworICogIC0gaXMgb3JkZXJlZCBhZ2FpbnN0IGJ0czo6aGFuZGxlOjpldmVudCB3aXRoIGEgY29tcGlsZXIgYmFycmllci4KKyAqLworCiBzdGF0aWMgdm9pZCBfX2J0c19ldmVudF9zdGFydChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CiAJc3RydWN0IGJ0c19jdHggKmJ0cyA9IHRoaXNfY3B1X3B0cigmYnRzX2N0eCk7CkBAIC0yMjEsMTAgKzI0MCwxMyBAQAogCiAJLyoKIAkgKiBsb2NhbCBiYXJyaWVyIHRvIG1ha2Ugc3VyZSB0aGF0IGRzIGNvbmZpZ3VyYXRpb24gbWFkZSBpdAotCSAqIGJlZm9yZSB3ZSBlbmFibGUgQlRTCisJICogYmVmb3JlIHdlIGVuYWJsZSBCVFMgYW5kIGJ0czo6c3RhdGUgZ29lcyBBQ1RJVkUKIAkgKi8KIAl3bWIoKTsKIAorCS8qIElOQUNUSVZFL1NUT1BQRUQgLT4gQUNUSVZFICovCisJV1JJVEVfT05DRShidHMtPnN0YXRlLCBCVFNfU1RBVEVfQUNUSVZFKTsKKwogCWludGVsX3BtdV9lbmFibGVfYnRzKGNvbmZpZyk7CiAKIH0KQEAgLTI1MSw5ICsyNzMsNiBAQAogCiAJX19idHNfZXZlbnRfc3RhcnQoZXZlbnQpOwogCi0JLyogUE1JIGhhbmRsZXI6IHRoaXMgY291bnRlciBpcyBydW5uaW5nIGFuZCBsaWtlbHkgZ2VuZXJhdGluZyBQTUlzICovCi0JQUNDRVNTX09OQ0UoYnRzLT5zdGFydGVkKSA9IDE7Ci0KIAlyZXR1cm47CiAKIGZhaWxfZW5kX3N0b3A6CkBAIC0yNjMsMzAgKzI4MiwzNCBAQAogCWV2ZW50LT5ody5zdGF0ZSA9IFBFUkZfSEVTX1NUT1BQRUQ7CiB9CiAKLXN0YXRpYyB2b2lkIF9fYnRzX2V2ZW50X3N0b3Aoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQorc3RhdGljIHZvaWQgX19idHNfZXZlbnRfc3RvcChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBzdGF0ZSkKIHsKKwlzdHJ1Y3QgYnRzX2N0eCAqYnRzID0gdGhpc19jcHVfcHRyKCZidHNfY3R4KTsKKworCS8qIEFDVElWRSAtPiBJTkFDVElWRShQTUkpL1NUT1BQRUQoLT5zdG9wKCkpICovCisJV1JJVEVfT05DRShidHMtPnN0YXRlLCBzdGF0ZSk7CisKIAkvKgogCSAqIE5vIGV4dHJhIHN5bmNocm9uaXphdGlvbiBpcyBtYW5kYXRlZCBieSB0aGUgZG9jdW1lbnRhdGlvbiB0byBoYXZlCiAJICogQlRTIGRhdGEgc3RvcmVzIGdsb2JhbGx5IHZpc2libGUuCiAJICovCiAJaW50ZWxfcG11X2Rpc2FibGVfYnRzKCk7Ci0KLQlpZiAoZXZlbnQtPmh3LnN0YXRlICYgUEVSRl9IRVNfU1RPUFBFRCkKLQkJcmV0dXJuOwotCi0JQUNDRVNTX09OQ0UoZXZlbnQtPmh3LnN0YXRlKSB8PSBQRVJGX0hFU19TVE9QUEVEOwogfQogCiBzdGF0aWMgdm9pZCBidHNfZXZlbnRfc3RvcChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBmbGFncykKIHsKIAlzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YyA9IHRoaXNfY3B1X3B0cigmY3B1X2h3X2V2ZW50cyk7CiAJc3RydWN0IGJ0c19jdHggKmJ0cyA9IHRoaXNfY3B1X3B0cigmYnRzX2N0eCk7Ci0Jc3RydWN0IGJ0c19idWZmZXIgKmJ1ZiA9IHBlcmZfZ2V0X2F1eCgmYnRzLT5oYW5kbGUpOworCXN0cnVjdCBidHNfYnVmZmVyICpidWYgPSBOVUxMOworCWludCBzdGF0ZSA9IFJFQURfT05DRShidHMtPnN0YXRlKTsKIAotCS8qIFBNSSBoYW5kbGVyOiBkb24ndCByZXN0YXJ0IHRoaXMgY291bnRlciAqLwotCUFDQ0VTU19PTkNFKGJ0cy0+c3RhcnRlZCkgPSAwOworCWlmIChzdGF0ZSA9PSBCVFNfU1RBVEVfQUNUSVZFKQorCQlfX2J0c19ldmVudF9zdG9wKGV2ZW50LCBCVFNfU1RBVEVfU1RPUFBFRCk7CiAKLQlfX2J0c19ldmVudF9zdG9wKGV2ZW50KTsKKwlpZiAoc3RhdGUgIT0gQlRTX1NUQVRFX1NUT1BQRUQpCisJCWJ1ZiA9IHBlcmZfZ2V0X2F1eCgmYnRzLT5oYW5kbGUpOworCisJZXZlbnQtPmh3LnN0YXRlIHw9IFBFUkZfSEVTX1NUT1BQRUQ7CiAKIAlpZiAoZmxhZ3MgJiBQRVJGX0VGX1VQREFURSkgewogCQlidHNfdXBkYXRlKGJ0cyk7CkBAIC0yOTYsNiArMzE5LDcgQEAKIAkJCQlidHMtPmhhbmRsZS5oZWFkID0KIAkJCQkJbG9jYWxfeGNoZygmYnVmLT5kYXRhX3NpemUsCiAJCQkJCQkgICBidWYtPm5yX3BhZ2VzIDw8IFBBR0VfU0hJRlQpOworCiAJCQlwZXJmX2F1eF9vdXRwdXRfZW5kKCZidHMtPmhhbmRsZSwgbG9jYWxfeGNoZygmYnVmLT5kYXRhX3NpemUsIDApLAogCQkJCQkgICAgISFsb2NhbF94Y2hnKCZidWYtPmxvc3QsIDApKTsKIAkJfQpAQCAtMzEwLDggKzMzNCwyMCBAQAogdm9pZCBpbnRlbF9idHNfZW5hYmxlX2xvY2FsKHZvaWQpCiB7CiAJc3RydWN0IGJ0c19jdHggKmJ0cyA9IHRoaXNfY3B1X3B0cigmYnRzX2N0eCk7CisJaW50IHN0YXRlID0gUkVBRF9PTkNFKGJ0cy0+c3RhdGUpOwogCi0JaWYgKGJ0cy0+aGFuZGxlLmV2ZW50ICYmIGJ0cy0+c3RhcnRlZCkKKwkvKgorCSAqIEhlcmUgd2UgdHJhbnNpdGlvbiBmcm9tIElOQUNUSVZFIHRvIEFDVElWRTsKKwkgKiBpZiB3ZSBpbnN0ZWFkIGFyZSBTVE9QUEVEIGZyb20gdGhlIGludGVycnVwdCBoYW5kbGVyLAorCSAqIHN0YXkgdGhhdCB3YXkuIENhbid0IGJlIEFDVElWRSBoZXJlIHRob3VnaC4KKwkgKi8KKwlpZiAoV0FSTl9PTl9PTkNFKHN0YXRlID09IEJUU19TVEFURV9BQ1RJVkUpKQorCQlyZXR1cm47CisKKwlpZiAoc3RhdGUgPT0gQlRTX1NUQVRFX1NUT1BQRUQpCisJCXJldHVybjsKKworCWlmIChidHMtPmhhbmRsZS5ldmVudCkKIAkJX19idHNfZXZlbnRfc3RhcnQoYnRzLT5oYW5kbGUuZXZlbnQpOwogfQogCkBAIC0zMTksOCArMzU1LDE1IEBACiB7CiAJc3RydWN0IGJ0c19jdHggKmJ0cyA9IHRoaXNfY3B1X3B0cigmYnRzX2N0eCk7CiAKKwkvKgorCSAqIEhlcmUgd2UgdHJhbnNpdGlvbiBmcm9tIEFDVElWRSB0byBJTkFDVElWRTsKKwkgKiBkbyBub3RoaW5nIGZvciBTVE9QUEVEIG9yIElOQUNUSVZFLgorCSAqLworCWlmIChSRUFEX09OQ0UoYnRzLT5zdGF0ZSkgIT0gQlRTX1NUQVRFX0FDVElWRSkKKwkJcmV0dXJuOworCiAJaWYgKGJ0cy0+aGFuZGxlLmV2ZW50KQotCQlfX2J0c19ldmVudF9zdG9wKGJ0cy0+aGFuZGxlLmV2ZW50KTsKKwkJX19idHNfZXZlbnRfc3RvcChidHMtPmhhbmRsZS5ldmVudCwgQlRTX1NUQVRFX0lOQUNUSVZFKTsKIH0KIAogc3RhdGljIGludApAQCAtMzM1LDggKzM3OCw2IEBACiAJCXJldHVybiAwOwogCiAJaGVhZCA9IGhhbmRsZS0+aGVhZCAmICgoYnVmLT5ucl9wYWdlcyA8PCBQQUdFX1NISUZUKSAtIDEpOwotCWlmIChXQVJOX09OX09OQ0UoaGVhZCAhPSBsb2NhbF9yZWFkKCZidWYtPmhlYWQpKSkKLQkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwaHlzID0gJmJ1Zi0+YnVmW2J1Zi0+Y3VyX2J1Zl07CiAJc3BhY2UgPSBwaHlzLT5vZmZzZXQgKyBwaHlzLT5kaXNwbGFjZW1lbnQgKyBwaHlzLT5zaXplIC0gaGVhZDsKQEAgLTQwMywyMiArNDQ0LDM3IEBACiAKIGludCBpbnRlbF9idHNfaW50ZXJydXB0KHZvaWQpCiB7CisJc3RydWN0IGRlYnVnX3N0b3JlICpkcyA9IHRoaXNfY3B1X3B0cigmY3B1X2h3X2V2ZW50cyktPmRzOwogCXN0cnVjdCBidHNfY3R4ICpidHMgPSB0aGlzX2NwdV9wdHIoJmJ0c19jdHgpOwogCXN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCA9IGJ0cy0+aGFuZGxlLmV2ZW50OwogCXN0cnVjdCBidHNfYnVmZmVyICpidWY7CiAJczY0IG9sZF9oZWFkOwotCWludCBlcnI7CisJaW50IGVyciA9IC1FTk9TUEMsIGhhbmRsZWQgPSAwOwogCi0JaWYgKCFldmVudCB8fCAhYnRzLT5zdGFydGVkKQotCQlyZXR1cm4gMDsKKwkvKgorCSAqIFRoZSBvbmx5IHN1cmVmaXJlIHdheSBvZiBrbm93aW5nIGlmIHRoaXMgTk1JIGlzIG91cnMgaXMgYnkgY2hlY2tpbmcKKwkgKiB0aGUgd3JpdGUgcHRyIGFnYWluc3QgdGhlIFBNSSB0aHJlc2hvbGQuCisJICovCisJaWYgKGRzICYmIChkcy0+YnRzX2luZGV4ID49IGRzLT5idHNfaW50ZXJydXB0X3RocmVzaG9sZCkpCisJCWhhbmRsZWQgPSAxOworCisJLyoKKwkgKiB0aGlzIGlzIHdyYXBwZWQgaW4gaW50ZWxfYnRzX2VuYWJsZV9sb2NhbC9pbnRlbF9idHNfZGlzYWJsZV9sb2NhbCwKKwkgKiBzbyB3ZSBjYW4gb25seSBiZSBJTkFDVElWRSBvciBTVE9QUEVECisJICovCisJaWYgKFJFQURfT05DRShidHMtPnN0YXRlKSA9PSBCVFNfU1RBVEVfU1RPUFBFRCkKKwkJcmV0dXJuIGhhbmRsZWQ7CiAKIAlidWYgPSBwZXJmX2dldF9hdXgoJmJ0cy0+aGFuZGxlKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIGhhbmRsZWQ7CisKIAkvKgogCSAqIFNraXAgc25hcHNob3QgY291bnRlcnM6IHRoZXkgZG9uJ3QgdXNlIHRoZSBpbnRlcnJ1cHQsIGJ1dAogCSAqIHRoZXJlJ3Mgbm8gb3RoZXIgd2F5IG9mIHRlbGxpbmcsIGJlY2F1c2UgdGhlIHBvaW50ZXIgd2lsbAogCSAqIGtlZXAgbW92aW5nCiAJICovCi0JaWYgKCFidWYgfHwgYnVmLT5zbmFwc2hvdCkKKwlpZiAoYnVmLT5zbmFwc2hvdCkKIAkJcmV0dXJuIDA7CiAKIAlvbGRfaGVhZCA9IGxvY2FsX3JlYWQoJmJ1Zi0+aGVhZCk7CkBAIC00MjYsMTggKzQ4MiwyNyBAQAogCiAJLyogbm8gbmV3IGRhdGEgKi8KIAlpZiAob2xkX2hlYWQgPT0gbG9jYWxfcmVhZCgmYnVmLT5oZWFkKSkKLQkJcmV0dXJuIDA7CisJCXJldHVybiBoYW5kbGVkOwogCiAJcGVyZl9hdXhfb3V0cHV0X2VuZCgmYnRzLT5oYW5kbGUsIGxvY2FsX3hjaGcoJmJ1Zi0+ZGF0YV9zaXplLCAwKSwKIAkJCSAgICAhIWxvY2FsX3hjaGcoJmJ1Zi0+bG9zdCwgMCkpOwogCiAJYnVmID0gcGVyZl9hdXhfb3V0cHV0X2JlZ2luKCZidHMtPmhhbmRsZSwgZXZlbnQpOwotCWlmICghYnVmKQotCQlyZXR1cm4gMTsKKwlpZiAoYnVmKQorCQllcnIgPSBidHNfYnVmZmVyX3Jlc2V0KGJ1ZiwgJmJ0cy0+aGFuZGxlKTsKIAotCWVyciA9IGJ0c19idWZmZXJfcmVzZXQoYnVmLCAmYnRzLT5oYW5kbGUpOwotCWlmIChlcnIpCi0JCXBlcmZfYXV4X291dHB1dF9lbmQoJmJ0cy0+aGFuZGxlLCAwLCBmYWxzZSk7CisJaWYgKGVycikgeworCQlXUklURV9PTkNFKGJ0cy0+c3RhdGUsIEJUU19TVEFURV9TVE9QUEVEKTsKKworCQlpZiAoYnVmKSB7CisJCQkvKgorCQkJICogQlRTX1NUQVRFX1NUT1BQRUQgc2hvdWxkIGJlIHZpc2libGUgYmVmb3JlCisJCQkgKiBjbGVhcmVkIGhhbmRsZTo6ZXZlbnQKKwkJCSAqLworCQkJYmFycmllcigpOworCQkJcGVyZl9hdXhfb3V0cHV0X2VuZCgmYnRzLT5oYW5kbGUsIDAsIGZhbHNlKTsKKwkJfQorCX0KIAogCXJldHVybiAxOwogfQpAQCAtNTE5LDcgKzU4NCw4IEBACiAJaWYgKCFib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfRFRFUzY0KSB8fCAheDg2X3BtdS5idHMpCiAJCXJldHVybiAtRU5PREVWOwogCi0JYnRzX3BtdS5jYXBhYmlsaXRpZXMJPSBQRVJGX1BNVV9DQVBfQVVYX05PX1NHIHwgUEVSRl9QTVVfQ0FQX0lUUkFDRTsKKwlidHNfcG11LmNhcGFiaWxpdGllcwk9IFBFUkZfUE1VX0NBUF9BVVhfTk9fU0cgfCBQRVJGX1BNVV9DQVBfSVRSQUNFIHwKKwkJCQkgIFBFUkZfUE1VX0NBUF9FWENMVVNJVkU7CiAJYnRzX3BtdS50YXNrX2N0eF9ucgk9IHBlcmZfc3dfY29udGV4dDsKIAlidHNfcG11LmV2ZW50X2luaXQJPSBidHNfZXZlbnRfaW5pdDsKIAlidHNfcG11LmFkZAkJPSBidHNfZXZlbnRfYWRkOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL2NvcmUuYyBiL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9jb3JlLmMKaW5kZXggMmNiZGUyZi4uYTNhOWViOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL2NvcmUuYworKysgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvY29yZS5jCkBAIC0xNzMwLDkgKzE3MzAsMTEgQEAKICAqIGRpc2FibGVkIHN0YXRlIGlmIGNhbGxlZCBjb25zZWN1dGl2ZWx5LgogICoKICAqIER1cmluZyBjb25zZWN1dGl2ZSBjYWxscywgdGhlIHNhbWUgZGlzYWJsZSB2YWx1ZSB3aWxsIGJlIHdyaXR0ZW4gdG8gcmVsYXRlZAotICogcmVnaXN0ZXJzLCBzbyB0aGUgUE1VIHN0YXRlIHJlbWFpbnMgdW5jaGFuZ2VkLiBody5zdGF0ZSBpbgotICogaW50ZWxfYnRzX2Rpc2FibGVfbG9jYWwgd2lsbCByZW1haW4gUEVSRl9IRVNfU1RPUFBFRCB0b28gaW4gY29uc2VjdXRpdmUKLSAqIGNhbGxzLgorICogcmVnaXN0ZXJzLCBzbyB0aGUgUE1VIHN0YXRlIHJlbWFpbnMgdW5jaGFuZ2VkLgorICoKKyAqIGludGVsX2J0cyBldmVudHMgZG9uJ3QgY29leGlzdCB3aXRoIGludGVsIFBNVSdzIEJUUyBldmVudHMgYmVjYXVzZSBvZgorICogeDg2X2FkZF9leGNsdXNpdmUoeDg2X2xicl9leGNsdXNpdmVfbGJyKTsgdGhlcmUncyBubyBuZWVkIHRvIGtlZXAgdGhlbQorICogZGlzYWJsZWQgYXJvdW5kIGludGVsIFBNVSdzIGV2ZW50IGJhdGNoaW5nIGV0Yywgb25seSBpbnNpZGUgdGhlIFBNSSBoYW5kbGVyLgogICovCiBzdGF0aWMgdm9pZCBfX2ludGVsX3BtdV9kaXNhYmxlX2FsbCh2b2lkKQogewpAQCAtMTc0Miw4ICsxNzQ0LDYgQEAKIAogCWlmICh0ZXN0X2JpdChJTlRFTF9QTUNfSURYX0ZJWEVEX0JUUywgY3B1Yy0+YWN0aXZlX21hc2spKQogCQlpbnRlbF9wbXVfZGlzYWJsZV9idHMoKTsKLQllbHNlCi0JCWludGVsX2J0c19kaXNhYmxlX2xvY2FsKCk7CiAKIAlpbnRlbF9wbXVfcGVic19kaXNhYmxlX2FsbCgpOwogfQpAQCAtMTc3MSw4ICsxNzcxLDcgQEAKIAkJCXJldHVybjsKIAogCQlpbnRlbF9wbXVfZW5hYmxlX2J0cyhldmVudC0+aHcuY29uZmlnKTsKLQl9IGVsc2UKLQkJaW50ZWxfYnRzX2VuYWJsZV9sb2NhbCgpOworCX0KIH0KIAogc3RhdGljIHZvaWQgaW50ZWxfcG11X2VuYWJsZV9hbGwoaW50IGFkZGVkKQpAQCAtMTkwNywxMyArMTkwNiw2IEBACiAJY3B1Yy0+aW50ZWxfY3RybF9ob3N0X21hc2sgJj0gfigxdWxsIDw8IGh3Yy0+aWR4KTsKIAljcHVjLT5pbnRlbF9jcF9zdGF0dXMgJj0gfigxdWxsIDw8IGh3Yy0+aWR4KTsKIAotCS8qCi0JICogbXVzdCBkaXNhYmxlIGJlZm9yZSBhbnkgYWN0dWFsIGV2ZW50Ci0JICogYmVjYXVzZSBhbnkgZXZlbnQgbWF5IGJlIGNvbWJpbmVkIHdpdGggTEJSCi0JICovCi0JaWYgKG5lZWRzX2JyYW5jaF9zdGFjayhldmVudCkpCi0JCWludGVsX3BtdV9sYnJfZGlzYWJsZShldmVudCk7Ci0KIAlpZiAodW5saWtlbHkoaHdjLT5jb25maWdfYmFzZSA9PSBNU1JfQVJDSF9QRVJGTU9OX0ZJWEVEX0NUUl9DVFJMKSkgewogCQlpbnRlbF9wbXVfZGlzYWJsZV9maXhlZChod2MpOwogCQlyZXR1cm47CkBAIC0xOTI1LDYgKzE5MTcsMTQgQEAKIAkJaW50ZWxfcG11X3BlYnNfZGlzYWJsZShldmVudCk7CiB9CiAKK3N0YXRpYyB2b2lkIGludGVsX3BtdV9kZWxfZXZlbnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCWlmIChuZWVkc19icmFuY2hfc3RhY2soZXZlbnQpKQorCQlpbnRlbF9wbXVfbGJyX2RlbChldmVudCk7CisJaWYgKGV2ZW50LT5hdHRyLnByZWNpc2VfaXApCisJCWludGVsX3BtdV9wZWJzX2RlbChldmVudCk7Cit9CisKIHN0YXRpYyB2b2lkIGludGVsX3BtdV9lbmFibGVfZml4ZWQoc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YykKIHsKIAlpbnQgaWR4ID0gaHdjLT5pZHggLSBJTlRFTF9QTUNfSURYX0ZJWEVEOwpAQCAtMTk2OCwxMiArMTk2OCw2IEBACiAJCWludGVsX3BtdV9lbmFibGVfYnRzKGh3Yy0+Y29uZmlnKTsKIAkJcmV0dXJuOwogCX0KLQkvKgotCSAqIG11c3QgZW5hYmxlZCBiZWZvcmUgYW55IGFjdHVhbCBldmVudAotCSAqIGJlY2F1c2UgYW55IGV2ZW50IG1heSBiZSBjb21iaW5lZCB3aXRoIExCUgotCSAqLwotCWlmIChuZWVkc19icmFuY2hfc3RhY2soZXZlbnQpKQotCQlpbnRlbF9wbXVfbGJyX2VuYWJsZShldmVudCk7CiAKIAlpZiAoZXZlbnQtPmF0dHIuZXhjbHVkZV9ob3N0KQogCQljcHVjLT5pbnRlbF9jdHJsX2d1ZXN0X21hc2sgfD0gKDF1bGwgPDwgaHdjLT5pZHgpOwpAQCAtMTk5NCw2ICsxOTg4LDE0IEBACiAJX194ODZfcG11X2VuYWJsZV9ldmVudChod2MsIEFSQ0hfUEVSRk1PTl9FVkVOVFNFTF9FTkFCTEUpOwogfQogCitzdGF0aWMgdm9pZCBpbnRlbF9wbXVfYWRkX2V2ZW50KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlpZiAoZXZlbnQtPmF0dHIucHJlY2lzZV9pcCkKKwkJaW50ZWxfcG11X3BlYnNfYWRkKGV2ZW50KTsKKwlpZiAobmVlZHNfYnJhbmNoX3N0YWNrKGV2ZW50KSkKKwkJaW50ZWxfcG11X2xicl9hZGQoZXZlbnQpOworfQorCiAvKgogICogU2F2ZSBhbmQgcmVzdGFydCBhbiBleHBpcmVkIGV2ZW50LiBDYWxsZWQgYnkgTk1JIGNvbnRleHRzLAogICogc28gaXQgaGFzIHRvIGJlIGNhcmVmdWwgYWJvdXQgcHJlZW1wdGluZyBub3JtYWwgZXZlbnQgb3BzOgpAQCAtMjA3Myw2ICsyMDc1LDcgQEAKIAkgKi8KIAlpZiAoIXg4Nl9wbXUubGF0ZV9hY2spCiAJCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgQVBJQ19ETV9OTUkpOworCWludGVsX2J0c19kaXNhYmxlX2xvY2FsKCk7CiAJX19pbnRlbF9wbXVfZGlzYWJsZV9hbGwoKTsKIAloYW5kbGVkID0gaW50ZWxfcG11X2RyYWluX2J0c19idWZmZXIoKTsKIAloYW5kbGVkICs9IGludGVsX2J0c19pbnRlcnJ1cHQoKTsKQEAgLTIxNzIsNiArMjE3NSw3IEBACiAJLyogT25seSByZXN0b3JlIFBNVSBzdGF0ZSB3aGVuIGl0J3MgYWN0aXZlLiBTZWUgeDg2X3BtdV9kaXNhYmxlKCkuICovCiAJaWYgKGNwdWMtPmVuYWJsZWQpCiAJCV9faW50ZWxfcG11X2VuYWJsZV9hbGwoMCwgdHJ1ZSk7CisJaW50ZWxfYnRzX2VuYWJsZV9sb2NhbCgpOwogCiAJLyoKIAkgKiBPbmx5IHVubWFzayB0aGUgTk1JIGFmdGVyIHRoZSBvdmVyZmxvdyBjb3VudGVycwpAQCAtMzI5MCw2ICszMjk0LDggQEAKIAkuZW5hYmxlX2FsbAkJPSBpbnRlbF9wbXVfZW5hYmxlX2FsbCwKIAkuZW5hYmxlCQkJPSBpbnRlbF9wbXVfZW5hYmxlX2V2ZW50LAogCS5kaXNhYmxlCQk9IGludGVsX3BtdV9kaXNhYmxlX2V2ZW50LAorCS5hZGQJCQk9IGludGVsX3BtdV9hZGRfZXZlbnQsCisJLmRlbAkJCT0gaW50ZWxfcG11X2RlbF9ldmVudCwKIAkuaHdfY29uZmlnCQk9IGludGVsX3BtdV9od19jb25maWcsCiAJLnNjaGVkdWxlX2V2ZW50cwk9IHg4Nl9zY2hlZHVsZV9ldmVudHMsCiAJLmV2ZW50c2VsCQk9IE1TUl9BUkNIX1BFUkZNT05fRVZFTlRTRUwwLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL2NxbS5jIGIvYXJjaC94ODYvZXZlbnRzL2ludGVsL2NxbS5jCmluZGV4IDc4M2M0OWQuLjhmODJiMDIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9jcW0uYworKysgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvY3FtLmMKQEAgLTQ1OCw2ICs0NTgsMTEgQEAKIHN0YXRpYyB2b2lkIGluaXRfbWJtX3NhbXBsZSh1MzIgcm1pZCwgdTMyIGV2dF90eXBlKTsKIHN0YXRpYyB2b2lkIF9faW50ZWxfbWJtX2V2ZW50X2NvdW50KHZvaWQgKmluZm8pOwogCitzdGF0aWMgYm9vbCBpc19jcW1fZXZlbnQoaW50IGUpCit7CisJcmV0dXJuIChlID09IFFPU19MM19PQ0NVUF9FVkVOVF9JRCk7Cit9CisKIHN0YXRpYyBib29sIGlzX21ibV9ldmVudChpbnQgZSkKIHsKIAlyZXR1cm4gKGUgPj0gUU9TX01CTV9UT1RBTF9FVkVOVF9JRCAmJiBlIDw9IFFPU19NQk1fTE9DQUxfRVZFTlRfSUQpOwpAQCAtMTM2Niw2ICsxMzcxLDEwIEBACiAJICAgICAoZXZlbnQtPmF0dHIuY29uZmlnID4gUU9TX01CTV9MT0NBTF9FVkVOVF9JRCkpCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKChpc19jcW1fZXZlbnQoZXZlbnQtPmF0dHIuY29uZmlnKSAmJiAhY3FtX2VuYWJsZWQpIHx8CisJICAgIChpc19tYm1fZXZlbnQoZXZlbnQtPmF0dHIuY29uZmlnKSAmJiAhbWJtX2VuYWJsZWQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCS8qIHVuc3VwcG9ydGVkIG1vZGVzIGFuZCBmaWx0ZXJzICovCiAJaWYgKGV2ZW50LT5hdHRyLmV4Y2x1ZGVfdXNlciAgIHx8CiAJICAgIGV2ZW50LT5hdHRyLmV4Y2x1ZGVfa2VybmVsIHx8CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvZHMuYyBiL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9kcy5jCmluZGV4IDdjZTlmM2YuLjAzMTkzMTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9kcy5jCisrKyBiL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9kcy5jCkBAIC04MDYsOSArODA2LDY1IEBACiAJcmV0dXJuICZlbXB0eWNvbnN0cmFpbnQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBwZWJzX2lzX2VuYWJsZWQoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMpCisvKgorICogV2UgbmVlZCB0aGUgc2NoZWRfdGFzayBjYWxsYmFjayBldmVuIGZvciBwZXItY3B1IGV2ZW50cyB3aGVuIHdlIHVzZQorICogdGhlIGxhcmdlIGludGVycnVwdCB0aHJlc2hvbGQsIHN1Y2ggdGhhdCB3ZSBjYW4gcHJvdmlkZSBQSUQgYW5kIFRJRAorICogdG8gUEVCUyBzYW1wbGVzLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgcGVic19uZWVkc19zY2hlZF9jYihzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YykKIHsKLQlyZXR1cm4gKGNwdWMtPnBlYnNfZW5hYmxlZCAmICgoMVVMTCA8PCBNQVhfUEVCU19FVkVOVFMpIC0gMSkpOworCXJldHVybiBjcHVjLT5uX3BlYnMgJiYgKGNwdWMtPm5fcGVicyA9PSBjcHVjLT5uX2xhcmdlX3BlYnMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGVic191cGRhdGVfdGhyZXNob2xkKHN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjKQoreworCXN0cnVjdCBkZWJ1Z19zdG9yZSAqZHMgPSBjcHVjLT5kczsKKwl1NjQgdGhyZXNob2xkOworCisJaWYgKGNwdWMtPm5fcGVicyA9PSBjcHVjLT5uX2xhcmdlX3BlYnMpIHsKKwkJdGhyZXNob2xkID0gZHMtPnBlYnNfYWJzb2x1dGVfbWF4aW11bSAtCisJCQl4ODZfcG11Lm1heF9wZWJzX2V2ZW50cyAqIHg4Nl9wbXUucGVic19yZWNvcmRfc2l6ZTsKKwl9IGVsc2UgeworCQl0aHJlc2hvbGQgPSBkcy0+cGVic19idWZmZXJfYmFzZSArIHg4Nl9wbXUucGVic19yZWNvcmRfc2l6ZTsKKwl9CisKKwlkcy0+cGVic19pbnRlcnJ1cHRfdGhyZXNob2xkID0gdGhyZXNob2xkOworfQorCitzdGF0aWMgdm9pZAorcGVic191cGRhdGVfc3RhdGUoYm9vbCBuZWVkZWRfY2IsIHN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjLCBzdHJ1Y3QgcG11ICpwbXUpCit7CisJLyoKKwkgKiBNYWtlIHN1cmUgd2UgZ2V0IHVwZGF0ZWQgd2l0aCB0aGUgZmlyc3QgUEVCUworCSAqIGV2ZW50LiBJdCB3aWxsIHRyaWdnZXIgYWxzbyBkdXJpbmcgcmVtb3ZhbCwgYnV0CisJICogdGhhdCBkb2VzIG5vdCBodXJ0OgorCSAqLworCWJvb2wgdXBkYXRlID0gY3B1Yy0+bl9wZWJzID09IDE7CisKKwlpZiAobmVlZGVkX2NiICE9IHBlYnNfbmVlZHNfc2NoZWRfY2IoY3B1YykpIHsKKwkJaWYgKCFuZWVkZWRfY2IpCisJCQlwZXJmX3NjaGVkX2NiX2luYyhwbXUpOworCQllbHNlCisJCQlwZXJmX3NjaGVkX2NiX2RlYyhwbXUpOworCisJCXVwZGF0ZSA9IHRydWU7CisJfQorCisJaWYgKHVwZGF0ZSkKKwkJcGVic191cGRhdGVfdGhyZXNob2xkKGNwdWMpOworfQorCit2b2lkIGludGVsX3BtdV9wZWJzX2FkZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSB0aGlzX2NwdV9wdHIoJmNwdV9od19ldmVudHMpOworCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OworCWJvb2wgbmVlZGVkX2NiID0gcGVic19uZWVkc19zY2hlZF9jYihjcHVjKTsKKworCWNwdWMtPm5fcGVicysrOworCWlmIChod2MtPmZsYWdzICYgUEVSRl9YODZfRVZFTlRfRlJFRVJVTk5JTkcpCisJCWNwdWMtPm5fbGFyZ2VfcGVicysrOworCisJcGVic191cGRhdGVfc3RhdGUobmVlZGVkX2NiLCBjcHVjLCBldmVudC0+Y3R4LT5wbXUpOwogfQogCiB2b2lkIGludGVsX3BtdV9wZWJzX2VuYWJsZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCkBAIC04MTYsMTIgKzg3Miw5IEBACiAJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSB0aGlzX2NwdV9wdHIoJmNwdV9od19ldmVudHMpOwogCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OwogCXN0cnVjdCBkZWJ1Z19zdG9yZSAqZHMgPSBjcHVjLT5kczsKLQlib29sIGZpcnN0X3BlYnM7Ci0JdTY0IHRocmVzaG9sZDsKIAogCWh3Yy0+Y29uZmlnICY9IH5BUkNIX1BFUkZNT05fRVZFTlRTRUxfSU5UOwogCi0JZmlyc3RfcGVicyA9ICFwZWJzX2lzX2VuYWJsZWQoY3B1Yyk7CiAJY3B1Yy0+cGVic19lbmFibGVkIHw9IDFVTEwgPDwgaHdjLT5pZHg7CiAKIAlpZiAoZXZlbnQtPmh3LmZsYWdzICYgUEVSRl9YODZfRVZFTlRfUEVCU19MRExBVCkKQEAgLTgzMCw0NiArODgzLDM0IEBACiAJCWNwdWMtPnBlYnNfZW5hYmxlZCB8PSAxVUxMIDw8IDYzOwogCiAJLyoKLQkgKiBXaGVuIHRoZSBldmVudCBpcyBjb25zdHJhaW5lZCBlbm91Z2ggd2UgY2FuIHVzZSBhIGxhcmdlcgotCSAqIHRocmVzaG9sZCBhbmQgcnVuIHRoZSBldmVudCB3aXRoIGxlc3MgZnJlcXVlbnQgUE1JLgorCSAqIFVzZSBhdXRvLXJlbG9hZCBpZiBwb3NzaWJsZSB0byBzYXZlIGEgTVNSIHdyaXRlIGluIHRoZSBQTUkuCisJICogVGhpcyBtdXN0IGJlIGRvbmUgaW4gcG11OjpzdGFydCgpLCBiZWNhdXNlIFBFUkZfRVZFTlRfSU9DX1BFUklPRC4KIAkgKi8KLQlpZiAoaHdjLT5mbGFncyAmIFBFUkZfWDg2X0VWRU5UX0ZSRUVSVU5OSU5HKSB7Ci0JCXRocmVzaG9sZCA9IGRzLT5wZWJzX2Fic29sdXRlX21heGltdW0gLQotCQkJeDg2X3BtdS5tYXhfcGVic19ldmVudHMgKiB4ODZfcG11LnBlYnNfcmVjb3JkX3NpemU7Ci0KLQkJaWYgKGZpcnN0X3BlYnMpCi0JCQlwZXJmX3NjaGVkX2NiX2luYyhldmVudC0+Y3R4LT5wbXUpOwotCX0gZWxzZSB7Ci0JCXRocmVzaG9sZCA9IGRzLT5wZWJzX2J1ZmZlcl9iYXNlICsgeDg2X3BtdS5wZWJzX3JlY29yZF9zaXplOwotCi0JCS8qCi0JCSAqIElmIG5vdCBhbGwgZXZlbnRzIGNhbiB1c2UgbGFyZ2VyIGJ1ZmZlciwKLQkJICogcm9sbCBiYWNrIHRvIHRocmVzaG9sZCA9IDEKLQkJICovCi0JCWlmICghZmlyc3RfcGVicyAmJgotCQkgICAgKGRzLT5wZWJzX2ludGVycnVwdF90aHJlc2hvbGQgPiB0aHJlc2hvbGQpKQotCQkJcGVyZl9zY2hlZF9jYl9kZWMoZXZlbnQtPmN0eC0+cG11KTsKLQl9Ci0KLQkvKiBVc2UgYXV0by1yZWxvYWQgaWYgcG9zc2libGUgdG8gc2F2ZSBhIE1TUiB3cml0ZSBpbiB0aGUgUE1JICovCiAJaWYgKGh3Yy0+ZmxhZ3MgJiBQRVJGX1g4Nl9FVkVOVF9BVVRPX1JFTE9BRCkgewogCQlkcy0+cGVic19ldmVudF9yZXNldFtod2MtPmlkeF0gPQogCQkJKHU2NCkoLWh3Yy0+c2FtcGxlX3BlcmlvZCkgJiB4ODZfcG11LmNudHZhbF9tYXNrOwogCX0KK30KIAotCWlmIChmaXJzdF9wZWJzIHx8IGRzLT5wZWJzX2ludGVycnVwdF90aHJlc2hvbGQgPiB0aHJlc2hvbGQpCi0JCWRzLT5wZWJzX2ludGVycnVwdF90aHJlc2hvbGQgPSB0aHJlc2hvbGQ7Cit2b2lkIGludGVsX3BtdV9wZWJzX2RlbChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSB0aGlzX2NwdV9wdHIoJmNwdV9od19ldmVudHMpOworCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OworCWJvb2wgbmVlZGVkX2NiID0gcGVic19uZWVkc19zY2hlZF9jYihjcHVjKTsKKworCWNwdWMtPm5fcGVicy0tOworCWlmIChod2MtPmZsYWdzICYgUEVSRl9YODZfRVZFTlRfRlJFRVJVTk5JTkcpCisJCWNwdWMtPm5fbGFyZ2VfcGVicy0tOworCisJcGVic191cGRhdGVfc3RhdGUobmVlZGVkX2NiLCBjcHVjLCBldmVudC0+Y3R4LT5wbXUpOwogfQogCiB2b2lkIGludGVsX3BtdV9wZWJzX2Rpc2FibGUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewogCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gdGhpc19jcHVfcHRyKCZjcHVfaHdfZXZlbnRzKTsKIAlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKLQlzdHJ1Y3QgZGVidWdfc3RvcmUgKmRzID0gY3B1Yy0+ZHM7Ci0JYm9vbCBsYXJnZV9wZWJzID0gZHMtPnBlYnNfaW50ZXJydXB0X3RocmVzaG9sZCA+Ci0JCWRzLT5wZWJzX2J1ZmZlcl9iYXNlICsgeDg2X3BtdS5wZWJzX3JlY29yZF9zaXplOwogCi0JaWYgKGxhcmdlX3BlYnMpCisJaWYgKGNwdWMtPm5fcGVicyA9PSBjcHVjLT5uX2xhcmdlX3BlYnMpCiAJCWludGVsX3BtdV9kcmFpbl9wZWJzX2J1ZmZlcigpOwogCiAJY3B1Yy0+cGVic19lbmFibGVkICY9IH4oMVVMTCA8PCBod2MtPmlkeCk7CkBAIC04NzksOSArOTIwLDYgQEAKIAllbHNlIGlmIChldmVudC0+aHcuZmxhZ3MgJiBQRVJGX1g4Nl9FVkVOVF9QRUJTX1NUKQogCQljcHVjLT5wZWJzX2VuYWJsZWQgJj0gfigxVUxMIDw8IDYzKTsKIAotCWlmIChsYXJnZV9wZWJzICYmICFwZWJzX2lzX2VuYWJsZWQoY3B1YykpCi0JCXBlcmZfc2NoZWRfY2JfZGVjKGV2ZW50LT5jdHgtPnBtdSk7Ci0KIAlpZiAoY3B1Yy0+ZW5hYmxlZCkKIAkJd3Jtc3JsKE1TUl9JQTMyX1BFQlNfRU5BQkxFLCBjcHVjLT5wZWJzX2VuYWJsZWQpOwogCkBAIC0xMjc0LDE4ICsxMzEyLDE4IEBACiAJCXN0cnVjdCBwZWJzX3JlY29yZF9uaG0gKnAgPSBhdDsKIAkJdTY0IHBlYnNfc3RhdHVzOwogCi0JCS8qIFBFQlMgdjMgaGFzIGFjY3VyYXRlIHN0YXR1cyBiaXRzICovCisJCXBlYnNfc3RhdHVzID0gcC0+c3RhdHVzICYgY3B1Yy0+cGVic19lbmFibGVkOworCQlwZWJzX3N0YXR1cyAmPSAoMVVMTCA8PCB4ODZfcG11Lm1heF9wZWJzX2V2ZW50cykgLSAxOworCisJCS8qIFBFQlMgdjMgaGFzIG1vcmUgYWNjdXJhdGUgc3RhdHVzIGJpdHMgKi8KIAkJaWYgKHg4Nl9wbXUuaW50ZWxfY2FwLnBlYnNfZm9ybWF0ID49IDMpIHsKLQkJCWZvcl9lYWNoX3NldF9iaXQoYml0LCAodW5zaWduZWQgbG9uZyAqKSZwLT5zdGF0dXMsCi0JCQkJCSBNQVhfUEVCU19FVkVOVFMpCisJCQlmb3JfZWFjaF9zZXRfYml0KGJpdCwgKHVuc2lnbmVkIGxvbmcgKikmcGVic19zdGF0dXMsCisJCQkJCSB4ODZfcG11Lm1heF9wZWJzX2V2ZW50cykKIAkJCQljb3VudHNbYml0XSsrOwogCiAJCQljb250aW51ZTsKIAkJfQogCi0JCXBlYnNfc3RhdHVzID0gcC0+c3RhdHVzICYgY3B1Yy0+cGVic19lbmFibGVkOwotCQlwZWJzX3N0YXR1cyAmPSAoMVVMTCA8PCB4ODZfcG11Lm1heF9wZWJzX2V2ZW50cykgLSAxOwotCiAJCS8qCiAJCSAqIE9uIHNvbWUgQ1BVcyB0aGUgUEVCUyBzdGF0dXMgY2FuIGJlIHplcm8gd2hlbiBQRUJTIGlzCiAJCSAqIHJhY2luZyB3aXRoIGNsZWFyaW5nIG9mIEdMT0JBTF9TVEFUVVMuCkBAIC0xMzMzLDggKzEzNzEsMTEgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWV2ZW50ID0gY3B1Yy0+ZXZlbnRzW2JpdF07Ci0JCVdBUk5fT05fT05DRSghZXZlbnQpOwotCQlXQVJOX09OX09OQ0UoIWV2ZW50LT5hdHRyLnByZWNpc2VfaXApOworCQlpZiAoV0FSTl9PTl9PTkNFKCFldmVudCkpCisJCQljb250aW51ZTsKKworCQlpZiAoV0FSTl9PTl9PTkNFKCFldmVudC0+YXR0ci5wcmVjaXNlX2lwKSkKKwkJCWNvbnRpbnVlOwogCiAJCS8qIGxvZyBkcm9wcGVkIHNhbXBsZXMgbnVtYmVyICovCiAJCWlmIChlcnJvcltiaXRdKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL2xici5jIGIvYXJjaC94ODYvZXZlbnRzL2ludGVsL2xici5jCmluZGV4IDcwN2QzNTguLmZjNmNmMjEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9sYnIuYworKysgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvbGJyLmMKQEAgLTM4MCw3ICszODAsNiBAQAogCiB2b2lkIGludGVsX3BtdV9sYnJfc2NoZWRfdGFzayhzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHgsIGJvb2wgc2NoZWRfaW4pCiB7Ci0Jc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSB0aGlzX2NwdV9wdHIoJmNwdV9od19ldmVudHMpOwogCXN0cnVjdCB4ODZfcGVyZl90YXNrX2NvbnRleHQgKnRhc2tfY3R4OwogCiAJLyoKQEAgLTM5MCwzMSArMzg5LDIxIEBACiAJICovCiAJdGFza19jdHggPSBjdHggPyBjdHgtPnRhc2tfY3R4X2RhdGEgOiBOVUxMOwogCWlmICh0YXNrX2N0eCkgewotCQlpZiAoc2NoZWRfaW4pIHsKKwkJaWYgKHNjaGVkX2luKQogCQkJX19pbnRlbF9wbXVfbGJyX3Jlc3RvcmUodGFza19jdHgpOwotCQkJY3B1Yy0+bGJyX2NvbnRleHQgPSBjdHg7Ci0JCX0gZWxzZSB7CisJCWVsc2UKIAkJCV9faW50ZWxfcG11X2xicl9zYXZlKHRhc2tfY3R4KTsKLQkJfQogCQlyZXR1cm47CiAJfQogCiAJLyoKLQkgKiBXaGVuIHNhbXBsaW5nIHRoZSBicmFuY2sgc3RhY2sgaW4gc3lzdGVtLXdpZGUsIGl0IG1heSBiZQotCSAqIG5lY2Vzc2FyeSB0byBmbHVzaCB0aGUgc3RhY2sgb24gY29udGV4dCBzd2l0Y2guIFRoaXMgaGFwcGVucwotCSAqIHdoZW4gdGhlIGJyYW5jaCBzdGFjayBkb2VzIG5vdCB0YWcgaXRzIGVudHJpZXMgd2l0aCB0aGUgcGlkCi0JICogb2YgdGhlIGN1cnJlbnQgdGFzay4gT3RoZXJ3aXNlIGl0IGJlY29tZXMgaW1wb3NzaWJsZSB0bwotCSAqIGFzc29jaWF0ZSBhIGJyYW5jaCBlbnRyeSB3aXRoIGEgdGFzay4gVGhpcyBhbWJpZ3VpdHkgaXMgbW9yZQotCSAqIGxpa2VseSB0byBhcHBlYXIgd2hlbiB0aGUgYnJhbmNoIHN0YWNrIHN1cHBvcnRzIHByaXYgbGV2ZWwKLQkgKiBmaWx0ZXJpbmcgYW5kIHRoZSB1c2VyIHNldHMgaXQgdG8gbW9uaXRvciBvbmx5IGF0IHRoZSB1c2VyCi0JICogbGV2ZWwgKHdoaWNoIGNvdWxkIGJlIGEgdXNlZnVsIG1lYXN1cmVtZW50IGluIHN5c3RlbS13aWRlCi0JICogbW9kZSkuIEluIHRoYXQgY2FzZSwgdGhlIHJpc2sgaXMgaGlnaCBvZiBoYXZpbmcgYSBicmFuY2gKLQkgKiBzdGFjayB3aXRoIGJyYW5jaCBmcm9tIG11bHRpcGxlIHRhc2tzLgotIAkgKi8KLQlpZiAoc2NoZWRfaW4pIHsKKwkgKiBTaW5jZSBhIGNvbnRleHQgc3dpdGNoIGNhbiBmbGlwIHRoZSBhZGRyZXNzIHNwYWNlIGFuZCBMQlIgZW50cmllcworCSAqIGFyZSBub3QgdGFnZ2VkIHdpdGggYW4gaWRlbnRpZmllciwgd2UgbmVlZCB0byB3aXBlIHRoZSBMQlIsIGV2ZW4gZm9yCisJICogcGVyLWNwdSBldmVudHMuIFlvdSBzaW1wbHkgY2Fubm90IHJlc29sdmUgdGhlIGJyYW5jaGVzIGZyb20gdGhlIG9sZAorCSAqIGFkZHJlc3Mgc3BhY2UuCisJICovCisJaWYgKHNjaGVkX2luKQogCQlpbnRlbF9wbXVfbGJyX3Jlc2V0KCk7Ci0JCWNwdWMtPmxicl9jb250ZXh0ID0gY3R4OwotCX0KIH0KIAogc3RhdGljIGlubGluZSBib29sIGJyYW5jaF91c2VyX2NhbGxzdGFjayh1bnNpZ25lZCBicl9zZWwpCkBAIC00MjIsNyArNDExLDcgQEAKIAlyZXR1cm4gKGJyX3NlbCAmIFg4Nl9CUl9VU0VSKSAmJiAoYnJfc2VsICYgWDg2X0JSX0NBTExfU1RBQ0spOwogfQogCi12b2lkIGludGVsX3BtdV9sYnJfZW5hYmxlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3ZvaWQgaW50ZWxfcG11X2xicl9hZGQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewogCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gdGhpc19jcHVfcHRyKCZjcHVfaHdfZXZlbnRzKTsKIAlzdHJ1Y3QgeDg2X3BlcmZfdGFza19jb250ZXh0ICp0YXNrX2N0eDsKQEAgLTQzMCwyNyArNDE5LDM4IEBACiAJaWYgKCF4ODZfcG11Lmxicl9ucikKIAkJcmV0dXJuOwogCi0JLyoKLQkgKiBSZXNldCB0aGUgTEJSIHN0YWNrIGlmIHdlIGNoYW5nZWQgdGFzayBjb250ZXh0IHRvCi0JICogYXZvaWQgZGF0YSBsZWFrcy4KLQkgKi8KLQlpZiAoZXZlbnQtPmN0eC0+dGFzayAmJiBjcHVjLT5sYnJfY29udGV4dCAhPSBldmVudC0+Y3R4KSB7Ci0JCWludGVsX3BtdV9sYnJfcmVzZXQoKTsKLQkJY3B1Yy0+bGJyX2NvbnRleHQgPSBldmVudC0+Y3R4OwotCX0KIAljcHVjLT5icl9zZWwgPSBldmVudC0+aHcuYnJhbmNoX3JlZy5yZWc7CiAKLQlpZiAoYnJhbmNoX3VzZXJfY2FsbHN0YWNrKGNwdWMtPmJyX3NlbCkgJiYgZXZlbnQtPmN0eCAmJgotCQkJCQlldmVudC0+Y3R4LT50YXNrX2N0eF9kYXRhKSB7CisJaWYgKGJyYW5jaF91c2VyX2NhbGxzdGFjayhjcHVjLT5icl9zZWwpICYmIGV2ZW50LT5jdHgtPnRhc2tfY3R4X2RhdGEpIHsKIAkJdGFza19jdHggPSBldmVudC0+Y3R4LT50YXNrX2N0eF9kYXRhOwogCQl0YXNrX2N0eC0+bGJyX2NhbGxzdGFja191c2VycysrOwogCX0KIAotCWNwdWMtPmxicl91c2VycysrOworCS8qCisJICogUmVxdWVzdCBwbXU6OnNjaGVkX3Rhc2soKSBjYWxsYmFjaywgd2hpY2ggd2lsbCBmaXJlIGluc2lkZSB0aGUKKwkgKiByZWd1bGFyIHBlcmYgZXZlbnQgc2NoZWR1bGluZywgc28gdGhhdCBjYWxsIHdpbGw6CisJICoKKwkgKiAgLSByZXN0b3JlIG9yIHdpcGU7IHdoZW4gTEJSLWNhbGxzdGFjaywKKwkgKiAgLSB3aXBlOyBvdGhlcndpc2UsCisJICoKKwkgKiB3aGVuIHRoaXMgaXMgZnJvbSBfX3BlcmZfZXZlbnRfdGFza19zY2hlZF9pbigpLgorCSAqCisJICogSG93ZXZlciwgaWYgdGhpcyBpcyBmcm9tIHBlcmZfaW5zdGFsbF9pbl9jb250ZXh0KCksIG5vIHN1Y2ggY2FsbGJhY2sKKwkgKiB3aWxsIGZvbGxvdyBhbmQgd2UnbGwgbmVlZCB0byByZXNldCB0aGUgTEJSIGhlcmUgaWYgdGhpcyBpcyB0aGUKKwkgKiBmaXJzdCBMQlIgZXZlbnQuCisJICoKKwkgKiBUaGUgcHJvYmxlbSBpcywgd2UgY2Fubm90IHRlbGwgdGhlc2UgY2FzZXMgYXBhcnQuLi4gYnV0IHdlIGNhbgorCSAqIGV4Y2x1ZGUgdGhlIGJpZ2dlc3QgY2h1bmsgb2YgY2FzZXMgYnkgbG9va2luZyBhdAorCSAqIGV2ZW50LT50b3RhbF90aW1lX3J1bm5pbmcuIEFuIGV2ZW50IHRoYXQgaGFzIGFjY3J1ZWQgcnVudGltZSBjYW5ub3QKKwkgKiBiZSAnbmV3Jy4gQ29udmVyc2VseSwgYSBuZXcgZXZlbnQgY2FuIGdldCBpbnN0YWxsZWQgdGhyb3VnaCB0aGUKKwkgKiBjb250ZXh0IHN3aXRjaCBwYXRoIGZvciB0aGUgZmlyc3QgdGltZS4KKwkgKi8KIAlwZXJmX3NjaGVkX2NiX2luYyhldmVudC0+Y3R4LT5wbXUpOworCWlmICghY3B1Yy0+bGJyX3VzZXJzKysgJiYgIWV2ZW50LT50b3RhbF90aW1lX3J1bm5pbmcpCisJCWludGVsX3BtdV9sYnJfcmVzZXQoKTsKIH0KIAotdm9pZCBpbnRlbF9wbXVfbGJyX2Rpc2FibGUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQordm9pZCBpbnRlbF9wbXVfbGJyX2RlbChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CiAJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSB0aGlzX2NwdV9wdHIoJmNwdV9od19ldmVudHMpOwogCXN0cnVjdCB4ODZfcGVyZl90YXNrX2NvbnRleHQgKnRhc2tfY3R4OwpAQCAtNDY3LDEyICs0NjcsNiBAQAogCWNwdWMtPmxicl91c2Vycy0tOwogCVdBUk5fT05fT05DRShjcHVjLT5sYnJfdXNlcnMgPCAwKTsKIAlwZXJmX3NjaGVkX2NiX2RlYyhldmVudC0+Y3R4LT5wbXUpOwotCi0JaWYgKGNwdWMtPmVuYWJsZWQgJiYgIWNwdWMtPmxicl91c2VycykgewotCQlfX2ludGVsX3BtdV9sYnJfZGlzYWJsZSgpOwotCQkvKiBhdm9pZCBzdGFsZSBwb2ludGVyICovCi0JCWNwdWMtPmxicl9jb250ZXh0ID0gTlVMTDsKLQl9CiB9CiAKIHZvaWQgaW50ZWxfcG11X2xicl9lbmFibGVfYWxsKGJvb2wgcG1pKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL3B0LmMgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvcHQuYwppbmRleCAwNGJiNWZiLi5jNTA0N2I4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvcHQuYworKysgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvcHQuYwpAQCAtNjksNiArNjksOCBAQAogCVBUX0NBUChwc2JfY3ljLAkJCTAsIENSX0VCWCwgQklUKDEpKSwKIAlQVF9DQVAoaXBfZmlsdGVyaW5nLAkJMCwgQ1JfRUJYLCBCSVQoMikpLAogCVBUX0NBUChtdGMsCQkJMCwgQ1JfRUJYLCBCSVQoMykpLAorCVBUX0NBUChwdHdyaXRlLAkJCTAsIENSX0VCWCwgQklUKDQpKSwKKwlQVF9DQVAocG93ZXJfZXZlbnRfdHJhY2UsCTAsIENSX0VCWCwgQklUKDUpKSwKIAlQVF9DQVAodG9wYV9vdXRwdXQsCQkwLCBDUl9FQ1gsIEJJVCgwKSksCiAJUFRfQ0FQKHRvcGFfbXVsdGlwbGVfZW50cmllcywJMCwgQ1JfRUNYLCBCSVQoMSkpLAogCVBUX0NBUChzaW5nbGVfcmFuZ2Vfb3V0cHV0LAkwLCBDUl9FQ1gsIEJJVCgyKSksCkBAIC0yNTksMTAgKzI2MSwxNiBAQAogI2RlZmluZSBSVElUX0NUTF9NVEMJKFJUSVRfQ1RMX01UQ19FTgl8IFwKIAkJCSBSVElUX0NUTF9NVENfUkFOR0UpCiAKKyNkZWZpbmUgUlRJVF9DVExfUFRXCShSVElUX0NUTF9QVFdfRU4JfCBcCisJCQkgUlRJVF9DVExfRlVQX09OX1BUVykKKwogI2RlZmluZSBQVF9DT05GSUdfTUFTSyAoUlRJVF9DVExfVFNDX0VOCQl8IFwKIAkJCVJUSVRfQ1RMX0RJU1JFVEMJfCBcCiAJCQlSVElUX0NUTF9DWUNfUFNCCXwgXAotCQkJUlRJVF9DVExfTVRDKQorCQkJUlRJVF9DVExfTVRDCQl8IFwKKwkJCVJUSVRfQ1RMX1BXUl9FVlRfRU4JfCBcCisJCQlSVElUX0NUTF9GVVBfT05fUFRXCXwgXAorCQkJUlRJVF9DVExfUFRXX0VOKQogCiBzdGF0aWMgYm9vbCBwdF9ldmVudF92YWxpZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CkBAIC0zMTEsNiArMzE5LDIwIEBACiAJCQlyZXR1cm4gZmFsc2U7CiAJfQogCisJaWYgKGNvbmZpZyAmIFJUSVRfQ1RMX1BXUl9FVlRfRU4gJiYKKwkgICAgIXB0X2NhcF9nZXQoUFRfQ0FQX3Bvd2VyX2V2ZW50X3RyYWNlKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKGNvbmZpZyAmIFJUSVRfQ1RMX1BUVykgeworCQlpZiAoIXB0X2NhcF9nZXQoUFRfQ0FQX3B0d3JpdGUpKQorCQkJcmV0dXJuIGZhbHNlOworCisJCS8qIEZVUG9uUFRXIHdpdGhvdXQgUFRXIGRvZXNuJ3QgbWFrZSBzZW5zZSAqLworCQlpZiAoKGNvbmZpZyAmIFJUSVRfQ1RMX0ZVUF9PTl9QVFcpICYmCisJCSAgICAhKGNvbmZpZyAmIFJUSVRfQ1RMX1BUV19FTikpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCiAJcmV0dXJuIHRydWU7CiB9CiAKQEAgLTEwNzQsNiArMTA5NiwxMSBAQAogCWV2ZW50LT5ody5hZGRyX2ZpbHRlcnMgPSBOVUxMOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgdmFsaWRfa2VybmVsX2lwKHVuc2lnbmVkIGxvbmcgaXApCit7CisJcmV0dXJuIHZpcnRfYWRkcl92YWxpZChpcCkgJiYga2VybmVsX2lwKGlwKTsKK30KKwogc3RhdGljIGludCBwdF9ldmVudF9hZGRyX2ZpbHRlcnNfdmFsaWRhdGUoc3RydWN0IGxpc3RfaGVhZCAqZmlsdGVycykKIHsKIAlzdHJ1Y3QgcGVyZl9hZGRyX2ZpbHRlciAqZmlsdGVyOwpAQCAtMTA4MSwxMSArMTEwOCwxNiBAQAogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShmaWx0ZXIsIGZpbHRlcnMsIGVudHJ5KSB7CiAJCS8qIFBUIGRvZXNuJ3Qgc3VwcG9ydCBzaW5nbGUgYWRkcmVzcyB0cmlnZ2VycyAqLwotCQlpZiAoIWZpbHRlci0+cmFuZ2UpCisJCWlmICghZmlsdGVyLT5yYW5nZSB8fCAhZmlsdGVyLT5zaXplKQogCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JCWlmICghZmlsdGVyLT5pbm9kZSAmJiAha2VybmVsX2lwKGZpbHRlci0+b2Zmc2V0KSkKLQkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIWZpbHRlci0+aW5vZGUpIHsKKwkJCWlmICghdmFsaWRfa2VybmVsX2lwKGZpbHRlci0+b2Zmc2V0KSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJaWYgKCF2YWxpZF9rZXJuZWxfaXAoZmlsdGVyLT5vZmZzZXQgKyBmaWx0ZXItPnNpemUpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CiAKIAkJaWYgKCsrcmFuZ2UgPiBwdF9jYXBfZ2V0KFBUX0NBUF9udW1fYWRkcmVzc19yYW5nZXMpKQogCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwpAQCAtMTExMSw3ICsxMTQzLDcgQEAKIAkJfSBlbHNlIHsKIAkJCS8qIGFwcGx5IHRoZSBvZmZzZXQgKi8KIAkJCW1zcl9hID0gZmlsdGVyLT5vZmZzZXQgKyBvZmZzW3JhbmdlXTsKLQkJCW1zcl9iID0gZmlsdGVyLT5zaXplICsgbXNyX2E7CisJCQltc3JfYiA9IGZpbHRlci0+c2l6ZSArIG1zcl9hIC0gMTsKIAkJfQogCiAJCWZpbHRlcnMtPmZpbHRlcltyYW5nZV0ubXNyX2EgID0gbXNyX2E7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvcHQuaCBiL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9wdC5oCmluZGV4IGVmZmZhNGEuLjUzNDczYzIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9wdC5oCisrKyBiL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9wdC5oCkBAIC0yNiwxMSArMjYsMTQgQEAKICNkZWZpbmUgUlRJVF9DVExfQ1lDTEVBQ0MJCUJJVCgxKQogI2RlZmluZSBSVElUX0NUTF9PUwkJCUJJVCgyKQogI2RlZmluZSBSVElUX0NUTF9VU1IJCQlCSVQoMykKKyNkZWZpbmUgUlRJVF9DVExfUFdSX0VWVF9FTgkJQklUKDQpCisjZGVmaW5lIFJUSVRfQ1RMX0ZVUF9PTl9QVFcJCUJJVCg1KQogI2RlZmluZSBSVElUX0NUTF9DUjNFTgkJCUJJVCg3KQogI2RlZmluZSBSVElUX0NUTF9UT1BBCQkJQklUKDgpCiAjZGVmaW5lIFJUSVRfQ1RMX01UQ19FTgkJCUJJVCg5KQogI2RlZmluZSBSVElUX0NUTF9UU0NfRU4JCQlCSVQoMTApCiAjZGVmaW5lIFJUSVRfQ1RMX0RJU1JFVEMJCUJJVCgxMSkKKyNkZWZpbmUgUlRJVF9DVExfUFRXX0VOCQkJQklUKDEyKQogI2RlZmluZSBSVElUX0NUTF9CUkFOQ0hfRU4JCUJJVCgxMykKICNkZWZpbmUgUlRJVF9DVExfTVRDX1JBTkdFX09GRlNFVAkxNAogI2RlZmluZSBSVElUX0NUTF9NVENfUkFOR0UJCSgweDBmdWxsIDw8IFJUSVRfQ1RMX01UQ19SQU5HRV9PRkZTRVQpCkBAIC05MSw2ICs5NCw4IEBACiAJUFRfQ0FQX3BzYl9jeWMsCiAJUFRfQ0FQX2lwX2ZpbHRlcmluZywKIAlQVF9DQVBfbXRjLAorCVBUX0NBUF9wdHdyaXRlLAorCVBUX0NBUF9wb3dlcl9ldmVudF90cmFjZSwKIAlQVF9DQVBfdG9wYV9vdXRwdXQsCiAJUFRfQ0FQX3RvcGFfbXVsdGlwbGVfZW50cmllcywKIAlQVF9DQVBfc2luZ2xlX3JhbmdlX291dHB1dCwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9yYXBsLmMgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvcmFwbC5jCmluZGV4IDI4ODY1OTMuLmIwZjBlODMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9yYXBsLmMKKysrIGIvYXJjaC94ODYvZXZlbnRzL2ludGVsL3JhcGwuYwpAQCAtMzU3LDYgKzM1Nyw4IEBACiAJaWYgKGV2ZW50LT5jcHUgPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWV2ZW50LT5ldmVudF9jYXBzIHw9IFBFUkZfRVZfQ0FQX1JFQURfQUNUSVZFX1BLRzsKKwogCS8qCiAJICogY2hlY2sgZXZlbnQgaXMga25vd24gKGRldGVybWluZXMgY291bnRlcikKIAkgKi8KQEAgLTc2NSw2ICs3NjcsOCBAQAogCVg4Nl9SQVBMX01PREVMX01BVENIKElOVEVMX0ZBTTZfU0tZTEFLRV9NT0JJTEUsICBza2xfcmFwbF9pbml0KSwKIAlYODZfUkFQTF9NT0RFTF9NQVRDSChJTlRFTF9GQU02X1NLWUxBS0VfREVTS1RPUCwgc2tsX3JhcGxfaW5pdCksCiAJWDg2X1JBUExfTU9ERUxfTUFUQ0goSU5URUxfRkFNNl9TS1lMQUtFX1gsCSBoc3hfcmFwbF9pbml0KSwKKworCVg4Nl9SQVBMX01PREVMX01BVENIKElOVEVMX0ZBTTZfQVRPTV9HT0xETU9OVCwgaHN3X3JhcGxfaW5pdCksCiAJe30sCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvdW5jb3JlLmMgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvdW5jb3JlLmMKaW5kZXggNDYzZGM3YS4uZDk4NDRjYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL3VuY29yZS5jCisrKyBiL2FyY2gveDg2L2V2ZW50cy9pbnRlbC91bmNvcmUuYwpAQCAtNjY0LDYgKzY2NCw4IEBACiAJZXZlbnQtPmNwdSA9IGJveC0+Y3B1OwogCWV2ZW50LT5wbXVfcHJpdmF0ZSA9IGJveDsKIAorCWV2ZW50LT5ldmVudF9jYXBzIHw9IFBFUkZfRVZfQ0FQX1JFQURfQUNUSVZFX1BLRzsKKwogCWV2ZW50LT5ody5pZHggPSAtMTsKIAlldmVudC0+aHcubGFzdF90YWcgPSB+MFVMTDsKIAlldmVudC0+aHcuZXh0cmFfcmVnLmlkeCA9IEVYVFJBX1JFR19OT05FOwpAQCAtNjgzLDcgKzY4NSw4IEBACiAJCS8qIGZpeGVkIGNvdW50ZXJzIGhhdmUgZXZlbnQgZmllbGQgaGFyZGNvZGVkIHRvIHplcm8gKi8KIAkJaHdjLT5jb25maWcgPSAwVUxMOwogCX0gZWxzZSB7Ci0JCWh3Yy0+Y29uZmlnID0gZXZlbnQtPmF0dHIuY29uZmlnICYgcG11LT50eXBlLT5ldmVudF9tYXNrOworCQlod2MtPmNvbmZpZyA9IGV2ZW50LT5hdHRyLmNvbmZpZyAmCisJCQkgICAgICAocG11LT50eXBlLT5ldmVudF9tYXNrIHwgKCh1NjQpcG11LT50eXBlLT5ldmVudF9tYXNrX2V4dCA8PCAzMikpOwogCQlpZiAocG11LT50eXBlLT5vcHMtPmh3X2NvbmZpZykgewogCQkJcmV0ID0gcG11LT50eXBlLT5vcHMtPmh3X2NvbmZpZyhib3gsIGV2ZW50KTsKIAkJCWlmIChyZXQpCkBAIC0xMzIxLDYgKzEzMjQsMTEgQEAKIAkucGNpX2luaXQgPSBza2xfdW5jb3JlX3BjaV9pbml0LAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF91bmNvcmVfaW5pdF9mdW4gc2t4X3VuY29yZV9pbml0IF9faW5pdGNvbnN0ID0geworCS5jcHVfaW5pdCA9IHNreF91bmNvcmVfY3B1X2luaXQsCisJLnBjaV9pbml0ID0gc2t4X3VuY29yZV9wY2lfaW5pdCwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeDg2X2NwdV9pZCBpbnRlbF91bmNvcmVfbWF0Y2hbXSBfX2luaXRjb25zdCA9IHsKIAlYODZfVU5DT1JFX01PREVMX01BVENIKElOVEVMX0ZBTTZfTkVIQUxFTV9FUCwJICBuaG1fdW5jb3JlX2luaXQpLAogCVg4Nl9VTkNPUkVfTU9ERUxfTUFUQ0goSU5URUxfRkFNNl9ORUhBTEVNLAkgIG5obV91bmNvcmVfaW5pdCksCkBAIC0xMzQzLDYgKzEzNTEsNyBAQAogCVg4Nl9VTkNPUkVfTU9ERUxfTUFUQ0goSU5URUxfRkFNNl9YRU9OX1BISV9LTkwsCSAga25sX3VuY29yZV9pbml0KSwKIAlYODZfVU5DT1JFX01PREVMX01BVENIKElOVEVMX0ZBTTZfU0tZTEFLRV9ERVNLVE9QLHNrbF91bmNvcmVfaW5pdCksCiAJWDg2X1VOQ09SRV9NT0RFTF9NQVRDSChJTlRFTF9GQU02X1NLWUxBS0VfTU9CSUxFLCBza2xfdW5jb3JlX2luaXQpLAorCVg4Nl9VTkNPUkVfTU9ERUxfTUFUQ0goSU5URUxfRkFNNl9TS1lMQUtFX1gsICAgICAgc2t4X3VuY29yZV9pbml0KSwKIAl7fSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2V2ZW50cy9pbnRlbC91bmNvcmUuaCBiL2FyY2gveDg2L2V2ZW50cy9pbnRlbC91bmNvcmUuaAppbmRleCA3OGI5YzIzLi5hZDk4NmMxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvdW5jb3JlLmgKKysrIGIvYXJjaC94ODYvZXZlbnRzL2ludGVsL3VuY29yZS5oCkBAIC00NCw2ICs0NCw3IEBACiAJdW5zaWduZWQgcGVyZl9jdHI7CiAJdW5zaWduZWQgZXZlbnRfY3RsOwogCXVuc2lnbmVkIGV2ZW50X21hc2s7CisJdW5zaWduZWQgZXZlbnRfbWFza19leHQ7CiAJdW5zaWduZWQgZml4ZWRfY3RyOwogCXVuc2lnbmVkIGZpeGVkX2N0bDsKIAl1bnNpZ25lZCBib3hfY3RsOwpAQCAtMTIwLDYgKzEyMSw3IEBACiB9OwogCiAjZGVmaW5lIFVOQ09SRV9CT1hfRkxBR19JTklUSUFURUQJMAorI2RlZmluZSBVTkNPUkVfQk9YX0ZMQUdfQ1RMX09GRlM4CTEgLyogZXZlbnQgY29uZmlnIHJlZ2lzdGVycyBhcmUgOC1ieXRlIGFwYXJ0ICovCiAKIHN0cnVjdCB1bmNvcmVfZXZlbnRfZGVzYyB7CiAJc3RydWN0IGtvYmpfYXR0cmlidXRlIGF0dHI7CkBAIC0xNzIsNiArMTc0LDkgQEAKIHN0YXRpYyBpbmxpbmUKIHVuc2lnbmVkIHVuY29yZV9wY2lfZXZlbnRfY3RsKHN0cnVjdCBpbnRlbF91bmNvcmVfYm94ICpib3gsIGludCBpZHgpCiB7CisJaWYgKHRlc3RfYml0KFVOQ09SRV9CT1hfRkxBR19DVExfT0ZGUzgsICZib3gtPmZsYWdzKSkKKwkJcmV0dXJuIGlkeCAqIDggKyBib3gtPnBtdS0+dHlwZS0+ZXZlbnRfY3RsOworCiAJcmV0dXJuIGlkeCAqIDQgKyBib3gtPnBtdS0+dHlwZS0+ZXZlbnRfY3RsOwogfQogCkBAIC0zNzcsNiArMzgyLDggQEAKIHZvaWQgYmR4X3VuY29yZV9jcHVfaW5pdCh2b2lkKTsKIGludCBrbmxfdW5jb3JlX3BjaV9pbml0KHZvaWQpOwogdm9pZCBrbmxfdW5jb3JlX2NwdV9pbml0KHZvaWQpOworaW50IHNreF91bmNvcmVfcGNpX2luaXQodm9pZCk7Cit2b2lkIHNreF91bmNvcmVfY3B1X2luaXQodm9pZCk7CiAKIC8qIHBlcmZfZXZlbnRfaW50ZWxfdW5jb3JlX25obWV4LmMgKi8KIHZvaWQgbmhtZXhfdW5jb3JlX2NwdV9pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL3VuY29yZV9zbmIuYyBiL2FyY2gveDg2L2V2ZW50cy9pbnRlbC91bmNvcmVfc25iLmMKaW5kZXggOWQzNWVjMC4uNWY4NDVlZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL3VuY29yZV9zbmIuYworKysgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvdW5jb3JlX3NuYi5jCkBAIC0zODgsNiArMzg4LDggQEAKIAlldmVudC0+Y3B1ID0gYm94LT5jcHU7CiAJZXZlbnQtPnBtdV9wcml2YXRlID0gYm94OwogCisJZXZlbnQtPmV2ZW50X2NhcHMgfD0gUEVSRl9FVl9DQVBfUkVBRF9BQ1RJVkVfUEtHOworCiAJZXZlbnQtPmh3LmlkeCA9IC0xOwogCWV2ZW50LT5ody5sYXN0X3RhZyA9IH4wVUxMOwogCWV2ZW50LT5ody5leHRyYV9yZWcuaWR4ID0gRVhUUkFfUkVHX05PTkU7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvdW5jb3JlX3NuYmVwLmMgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvdW5jb3JlX3NuYmVwLmMKaW5kZXggOGFlZTgzYi4uMjcyNDI3NyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL3VuY29yZV9zbmJlcC5jCisrKyBiL2FyY2gveDg2L2V2ZW50cy9pbnRlbC91bmNvcmVfc25iZXAuYwpAQCAtMSw2ICsxLDEwIEBACiAvKiBTYW5keUJyaWRnZS1FUC9JdnlUb3duIHVuY29yZSBzdXBwb3J0ICovCiAjaW5jbHVkZSAidW5jb3JlLmgiCiAKKy8qIFNOQi1FUCBwY2kgYnVzIHRvIHNvY2tldCBtYXBwaW5nICovCisjZGVmaW5lIFNOQkVQX0NQVU5PREVJRAkJCTB4NDAKKyNkZWZpbmUgU05CRVBfR0lETklETUFQCQkJMHg1NAorCiAvKiBTTkItRVAgQm94IGxldmVsIGNvbnRyb2wgKi8KICNkZWZpbmUgU05CRVBfUE1PTl9CT1hfQ1RMX1JTVF9DVFJMCSgxIDw8IDApCiAjZGVmaW5lIFNOQkVQX1BNT05fQk9YX0NUTF9SU1RfQ1RSUwkoMSA8PCAxKQpAQCAtMjY0LDE1ICsyNjgsNzIgQEAKIAkJCQkgU05CRVBfUENVX01TUl9QTU9OX0NUTF9PQ0NfSU5WRVJUIHwgXAogCQkJCSBTTkJFUF9QQ1VfTVNSX1BNT05fQ1RMX09DQ19FREdFX0RFVCkKIAorLyogU0tYIHBjaSBidXMgdG8gc29ja2V0IG1hcHBpbmcgKi8KKyNkZWZpbmUgU0tYX0NQVU5PREVJRAkJCTB4YzAKKyNkZWZpbmUgU0tYX0dJRE5JRE1BUAkJCTB4ZDQKKworLyogU0tYIENIQSAqLworI2RlZmluZSBTS1hfQ0hBX01TUl9QTU9OX0JPWF9GSUxURVJfVElECQkoMHgxZmZVTEwgPDwgMCkKKyNkZWZpbmUgU0tYX0NIQV9NU1JfUE1PTl9CT1hfRklMVEVSX0xJTksJKDB4ZlVMTCA8PCA5KQorI2RlZmluZSBTS1hfQ0hBX01TUl9QTU9OX0JPWF9GSUxURVJfU1RBVEUJKDB4M2ZmVUxMIDw8IDE3KQorI2RlZmluZSBTS1hfQ0hBX01TUl9QTU9OX0JPWF9GSUxURVJfUkVNCQkoMHgxVUxMIDw8IDMyKQorI2RlZmluZSBTS1hfQ0hBX01TUl9QTU9OX0JPWF9GSUxURVJfTE9DCQkoMHgxVUxMIDw8IDMzKQorI2RlZmluZSBTS1hfQ0hBX01TUl9QTU9OX0JPWF9GSUxURVJfQUxMX09QQwkoMHgxVUxMIDw8IDM1KQorI2RlZmluZSBTS1hfQ0hBX01TUl9QTU9OX0JPWF9GSUxURVJfTk0JCSgweDFVTEwgPDwgMzYpCisjZGVmaW5lIFNLWF9DSEFfTVNSX1BNT05fQk9YX0ZJTFRFUl9OT1RfTk0JKDB4MVVMTCA8PCAzNykKKyNkZWZpbmUgU0tYX0NIQV9NU1JfUE1PTl9CT1hfRklMVEVSX09QQzAJKDB4M2ZmVUxMIDw8IDQxKQorI2RlZmluZSBTS1hfQ0hBX01TUl9QTU9OX0JPWF9GSUxURVJfT1BDMQkoMHgzZmZVTEwgPDwgNTEpCisjZGVmaW5lIFNLWF9DSEFfTVNSX1BNT05fQk9YX0ZJTFRFUl9DNgkJKDB4MVVMTCA8PCA2MSkKKyNkZWZpbmUgU0tYX0NIQV9NU1JfUE1PTl9CT1hfRklMVEVSX05DCQkoMHgxVUxMIDw8IDYyKQorI2RlZmluZSBTS1hfQ0hBX01TUl9QTU9OX0JPWF9GSUxURVJfSVNPQwkoMHgxVUxMIDw8IDYzKQorCisvKiBTS1ggSUlPICovCisjZGVmaW5lIFNLWF9JSU8wX01TUl9QTU9OX0NUTDAJCTB4YTQ4CisjZGVmaW5lIFNLWF9JSU8wX01TUl9QTU9OX0NUUjAJCTB4YTQxCisjZGVmaW5lIFNLWF9JSU8wX01TUl9QTU9OX0JPWF9DVEwJMHhhNDAKKyNkZWZpbmUgU0tYX0lJT19NU1JfT0ZGU0VUCQkweDIwCisKKyNkZWZpbmUgU0tYX1BNT05fQ1RMX1RSRVNIX01BU0sJCSgweGZmIDw8IDI0KQorI2RlZmluZSBTS1hfUE1PTl9DVExfVFJFU0hfTUFTS19FWFQJKDB4ZikKKyNkZWZpbmUgU0tYX1BNT05fQ1RMX0NIX01BU0sJCSgweGZmIDw8IDQpCisjZGVmaW5lIFNLWF9QTU9OX0NUTF9GQ19NQVNLCQkoMHg3IDw8IDEyKQorI2RlZmluZSBTS1hfSUlPX1BNT05fUkFXX0VWRU5UX01BU0sJKFNOQkVQX1BNT05fQ1RMX0VWX1NFTF9NQVNLIHwgXAorCQkJCQkgU05CRVBfUE1PTl9DVExfVU1BU0tfTUFTSyB8IFwKKwkJCQkJIFNOQkVQX1BNT05fQ1RMX0VER0VfREVUIHwgXAorCQkJCQkgU05CRVBfUE1PTl9DVExfSU5WRVJUIHwgXAorCQkJCQkgU0tYX1BNT05fQ1RMX1RSRVNIX01BU0spCisjZGVmaW5lIFNLWF9JSU9fUE1PTl9SQVdfRVZFTlRfTUFTS19FWFQJKFNLWF9QTU9OX0NUTF9UUkVTSF9NQVNLX0VYVCB8IFwKKwkJCQkJIFNLWF9QTU9OX0NUTF9DSF9NQVNLIHwgXAorCQkJCQkgU0tYX1BNT05fQ1RMX0ZDX01BU0spCisKKy8qIFNLWCBJUlAgKi8KKyNkZWZpbmUgU0tYX0lSUDBfTVNSX1BNT05fQ1RMMAkJMHhhNWIKKyNkZWZpbmUgU0tYX0lSUDBfTVNSX1BNT05fQ1RSMAkJMHhhNTkKKyNkZWZpbmUgU0tYX0lSUDBfTVNSX1BNT05fQk9YX0NUTAkweGE1OAorI2RlZmluZSBTS1hfSVJQX01TUl9PRkZTRVQJCTB4MjAKKworLyogU0tYIFVQSSAqLworI2RlZmluZSBTS1hfVVBJX1BDSV9QTU9OX0NUTDAJCTB4MzUwCisjZGVmaW5lIFNLWF9VUElfUENJX1BNT05fQ1RSMAkJMHgzMTgKKyNkZWZpbmUgU0tYX1VQSV9QQ0lfUE1PTl9CT1hfQ1RMCTB4Mzc4CisjZGVmaW5lIFNLWF9QTU9OX0NUTF9VTUFTS19FWFQJCTB4ZmYKKworLyogU0tYIE0yTSAqLworI2RlZmluZSBTS1hfTTJNX1BDSV9QTU9OX0NUTDAJCTB4MjI4CisjZGVmaW5lIFNLWF9NMk1fUENJX1BNT05fQ1RSMAkJMHgyMDAKKyNkZWZpbmUgU0tYX00yTV9QQ0lfUE1PTl9CT1hfQ1RMCTB4MjU4CisKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZXZlbnQsIGV2ZW50LCAiY29uZmlnOjAtNyIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihldmVudDIsIGV2ZW50LCAiY29uZmlnOjAtNiIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihldmVudF9leHQsIGV2ZW50LCAiY29uZmlnOjAtNywyMSIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUih1c2Vfb2NjX2N0ciwgdXNlX29jY19jdHIsICJjb25maWc6NyIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUih1bWFzaywgdW1hc2ssICJjb25maWc6OC0xNSIpOworREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUih1bWFza19leHQsIHVtYXNrLCAiY29uZmlnOjgtMTUsMzItMzkiKTsKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIocW9yLCBxb3IsICJjb25maWc6MTYiKTsKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZWRnZSwgZWRnZSwgImNvbmZpZzoxOCIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUih0aWRfZW4sIHRpZF9lbiwgImNvbmZpZzoxOSIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihpbnYsIGludiwgImNvbmZpZzoyMyIpOworREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUih0aHJlc2g5LCB0aHJlc2gsICJjb25maWc6MjQtMzUiKTsKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIodGhyZXNoOCwgdGhyZXNoLCAiY29uZmlnOjI0LTMxIik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKHRocmVzaDYsIHRocmVzaCwgImNvbmZpZzoyNC0yOSIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUih0aHJlc2g1LCB0aHJlc2gsICJjb25maWc6MjQtMjgiKTsKQEAgLTI4MCw2ICszNDEsOCBAQAogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihvY2NfaW52ZXJ0LCBvY2NfaW52ZXJ0LCAiY29uZmlnOjMwIik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKG9jY19lZGdlLCBvY2NfZWRnZSwgImNvbmZpZzoxNC01MSIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihvY2NfZWRnZV9kZXQsIG9jY19lZGdlX2RldCwgImNvbmZpZzozMSIpOworREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihjaF9tYXNrLCBjaF9tYXNrLCAiY29uZmlnOjM2LTQzIik7CitERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZjX21hc2ssIGZjX21hc2ssICJjb25maWc6NDQtNDYiKTsKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZmlsdGVyX3RpZCwgZmlsdGVyX3RpZCwgImNvbmZpZzE6MC00Iik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl90aWQyLCBmaWx0ZXJfdGlkLCAiY29uZmlnMTowIik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl90aWQzLCBmaWx0ZXJfdGlkLCAiY29uZmlnMTowLTUiKTsKQEAgLTI4OCwxOCArMzUxLDI2IEBACiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl9saW5rLCBmaWx0ZXJfbGluaywgImNvbmZpZzE6NS04Iik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl9saW5rMiwgZmlsdGVyX2xpbmssICJjb25maWcxOjYtOCIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfbGluazMsIGZpbHRlcl9saW5rLCAiY29uZmlnMToxMiIpOworREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfbGluazQsIGZpbHRlcl9saW5rLCAiY29uZmlnMTo5LTEyIik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl9uaWQsIGZpbHRlcl9uaWQsICJjb25maWcxOjEwLTE3Iik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl9uaWQyLCBmaWx0ZXJfbmlkLCAiY29uZmlnMTozMi00NyIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfc3RhdGUsIGZpbHRlcl9zdGF0ZSwgImNvbmZpZzE6MTgtMjIiKTsKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZmlsdGVyX3N0YXRlMiwgZmlsdGVyX3N0YXRlLCAiY29uZmlnMToxNy0yMiIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfc3RhdGUzLCBmaWx0ZXJfc3RhdGUsICJjb25maWcxOjE3LTIzIik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl9zdGF0ZTQsIGZpbHRlcl9zdGF0ZSwgImNvbmZpZzE6MTgtMjAiKTsKK0RFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZmlsdGVyX3N0YXRlNSwgZmlsdGVyX3N0YXRlLCAiY29uZmlnMToxNy0yNiIpOworREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfcmVtLCBmaWx0ZXJfcmVtLCAiY29uZmlnMTozMiIpOworREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfbG9jLCBmaWx0ZXJfbG9jLCAiY29uZmlnMTozMyIpOworREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfbm0sIGZpbHRlcl9ubSwgImNvbmZpZzE6MzYiKTsKK0RFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZmlsdGVyX25vdF9ubSwgZmlsdGVyX25vdF9ubSwgImNvbmZpZzE6MzciKTsKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZmlsdGVyX2xvY2FsLCBmaWx0ZXJfbG9jYWwsICJjb25maWcxOjMzIik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl9hbGxfb3AsIGZpbHRlcl9hbGxfb3AsICJjb25maWcxOjM1Iik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl9ubm0sIGZpbHRlcl9ubm0sICJjb25maWcxOjM3Iik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl9vcGMsIGZpbHRlcl9vcGMsICJjb25maWcxOjIzLTMxIik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl9vcGMyLCBmaWx0ZXJfb3BjLCAiY29uZmlnMTo1Mi02MCIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfb3BjMywgZmlsdGVyX29wYywgImNvbmZpZzE6NDEtNjAiKTsKK0RFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZmlsdGVyX29wY18wLCBmaWx0ZXJfb3BjMCwgImNvbmZpZzE6NDEtNTAiKTsKK0RFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZmlsdGVyX29wY18xLCBmaWx0ZXJfb3BjMSwgImNvbmZpZzE6NTEtNjAiKTsKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZmlsdGVyX25jLCBmaWx0ZXJfbmMsICJjb25maWcxOjYyIik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl9jNiwgZmlsdGVyX2M2LCAiY29uZmlnMTo2MSIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfaXNvYywgZmlsdGVyX2lzb2MsICJjb25maWcxOjYzIik7CkBAIC0xMTUzLDcgKzEyMjQsNyBAQAogLyoKICAqIGJ1aWxkIHBjaSBidXMgdG8gc29ja2V0IG1hcHBpbmcKICAqLwotc3RhdGljIGludCBzbmJlcF9wY2kycGh5X21hcF9pbml0KGludCBkZXZpZCkKK3N0YXRpYyBpbnQgc25iZXBfcGNpMnBoeV9tYXBfaW5pdChpbnQgZGV2aWQsIGludCBub2RlaWRfbG9jLCBpbnQgaWRtYXBfbG9jLCBib29sIHJldmVyc2UpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnVib3hfZGV2ID0gTlVMTDsKIAlpbnQgaSwgYnVzLCBub2RlaWQsIHNlZ21lbnQ7CkBAIC0xMTY4LDEyICsxMjM5LDEyIEBACiAJCQlicmVhazsKIAkJYnVzID0gdWJveF9kZXYtPmJ1cy0+bnVtYmVyOwogCQkvKiBnZXQgdGhlIE5vZGUgSUQgb2YgdGhlIGxvY2FsIHJlZ2lzdGVyICovCi0JCWVyciA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZCh1Ym94X2RldiwgMHg0MCwgJmNvbmZpZyk7CisJCWVyciA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZCh1Ym94X2Rldiwgbm9kZWlkX2xvYywgJmNvbmZpZyk7CiAJCWlmIChlcnIpCiAJCQlicmVhazsKIAkJbm9kZWlkID0gY29uZmlnOwogCQkvKiBnZXQgdGhlIE5vZGUgSUQgbWFwcGluZyAqLwotCQllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQodWJveF9kZXYsIDB4NTQsICZjb25maWcpOworCQllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQodWJveF9kZXYsIGlkbWFwX2xvYywgJmNvbmZpZyk7CiAJCWlmIChlcnIpCiAJCQlicmVhazsKIApAQCAtMTIwNywxMSArMTI3OCwyMCBAQAogCQlyYXdfc3Bpbl9sb2NrKCZwY2kycGh5X21hcF9sb2NrKTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShtYXAsICZwY2kycGh5X21hcF9oZWFkLCBsaXN0KSB7CiAJCQlpID0gLTE7Ci0JCQlmb3IgKGJ1cyA9IDI1NTsgYnVzID49IDA7IGJ1cy0tKSB7Ci0JCQkJaWYgKG1hcC0+cGJ1c190b19waHlzaWRbYnVzXSA+PSAwKQotCQkJCQlpID0gbWFwLT5wYnVzX3RvX3BoeXNpZFtidXNdOwotCQkJCWVsc2UKLQkJCQkJbWFwLT5wYnVzX3RvX3BoeXNpZFtidXNdID0gaTsKKwkJCWlmIChyZXZlcnNlKSB7CisJCQkJZm9yIChidXMgPSAyNTU7IGJ1cyA+PSAwOyBidXMtLSkgeworCQkJCQlpZiAobWFwLT5wYnVzX3RvX3BoeXNpZFtidXNdID49IDApCisJCQkJCQlpID0gbWFwLT5wYnVzX3RvX3BoeXNpZFtidXNdOworCQkJCQllbHNlCisJCQkJCQltYXAtPnBidXNfdG9fcGh5c2lkW2J1c10gPSBpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZm9yIChidXMgPSAwOyBidXMgPD0gMjU1OyBidXMrKykgeworCQkJCQlpZiAobWFwLT5wYnVzX3RvX3BoeXNpZFtidXNdID49IDApCisJCQkJCQlpID0gbWFwLT5wYnVzX3RvX3BoeXNpZFtidXNdOworCQkJCQllbHNlCisJCQkJCQltYXAtPnBidXNfdG9fcGh5c2lkW2J1c10gPSBpOworCQkJCX0KIAkJCX0KIAkJfQogCQlyYXdfc3Bpbl91bmxvY2soJnBjaTJwaHlfbWFwX2xvY2spOwpAQCAtMTIyNCw3ICsxMzA0LDcgQEAKIAogaW50IHNuYmVwX3VuY29yZV9wY2lfaW5pdCh2b2lkKQogewotCWludCByZXQgPSBzbmJlcF9wY2kycGh5X21hcF9pbml0KDB4M2NlMCk7CisJaW50IHJldCA9IHNuYmVwX3BjaTJwaHlfbWFwX2luaXQoMHgzY2UwLCBTTkJFUF9DUFVOT0RFSUQsIFNOQkVQX0dJRE5JRE1BUCwgdHJ1ZSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAl1bmNvcmVfcGNpX3VuY29yZXMgPSBzbmJlcF9wY2lfdW5jb3JlczsKQEAgLTE3ODgsNyArMTg2OCw3IEBACiAKIGludCBpdmJlcF91bmNvcmVfcGNpX2luaXQodm9pZCkKIHsKLQlpbnQgcmV0ID0gc25iZXBfcGNpMnBoeV9tYXBfaW5pdCgweDBlMWUpOworCWludCByZXQgPSBzbmJlcF9wY2kycGh5X21hcF9pbml0KDB4MGUxZSwgU05CRVBfQ1BVTk9ERUlELCBTTkJFUF9HSUROSURNQVAsIHRydWUpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJdW5jb3JlX3BjaV91bmNvcmVzID0gaXZiZXBfcGNpX3VuY29yZXM7CkBAIC0yODk3LDcgKzI5NzcsNyBAQAogCiBpbnQgaHN3ZXBfdW5jb3JlX3BjaV9pbml0KHZvaWQpCiB7Ci0JaW50IHJldCA9IHNuYmVwX3BjaTJwaHlfbWFwX2luaXQoMHgyZjFlKTsKKwlpbnQgcmV0ID0gc25iZXBfcGNpMnBoeV9tYXBfaW5pdCgweDJmMWUsIFNOQkVQX0NQVU5PREVJRCwgU05CRVBfR0lETklETUFQLCB0cnVlKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCXVuY29yZV9wY2lfdW5jb3JlcyA9IGhzd2VwX3BjaV91bmNvcmVzOwpAQCAtMzE4Niw3ICszMjY2LDcgQEAKIAogaW50IGJkeF91bmNvcmVfcGNpX2luaXQodm9pZCkKIHsKLQlpbnQgcmV0ID0gc25iZXBfcGNpMnBoeV9tYXBfaW5pdCgweDZmMWUpOworCWludCByZXQgPSBzbmJlcF9wY2kycGh5X21hcF9pbml0KDB4NmYxZSwgU05CRVBfQ1BVTk9ERUlELCBTTkJFUF9HSUROSURNQVAsIHRydWUpOwogCiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTMxOTYsMyArMzI3Niw1MjUgQEAKIH0KIAogLyogZW5kIG9mIEJEWCB1bmNvcmUgc3VwcG9ydCAqLworCisvKiBTS1ggdW5jb3JlIHN1cHBvcnQgKi8KKworc3RhdGljIHN0cnVjdCBpbnRlbF91bmNvcmVfdHlwZSBza3hfdW5jb3JlX3Vib3ggPSB7CisJLm5hbWUJCQk9ICJ1Ym94IiwKKwkubnVtX2NvdW50ZXJzCQk9IDIsCisJLm51bV9ib3hlcwkJPSAxLAorCS5wZXJmX2N0cl9iaXRzCQk9IDQ4LAorCS5maXhlZF9jdHJfYml0cwkJPSA0OCwKKwkucGVyZl9jdHIJCT0gSFNXRVBfVV9NU1JfUE1PTl9DVFIwLAorCS5ldmVudF9jdGwJCT0gSFNXRVBfVV9NU1JfUE1PTl9DVEwwLAorCS5ldmVudF9tYXNrCQk9IFNOQkVQX1VfTVNSX1BNT05fUkFXX0VWRU5UX01BU0ssCisJLmZpeGVkX2N0cgkJPSBIU1dFUF9VX01TUl9QTU9OX1VDTEtfRklYRURfQ1RSLAorCS5maXhlZF9jdGwJCT0gSFNXRVBfVV9NU1JfUE1PTl9VQ0xLX0ZJWEVEX0NUTCwKKwkub3BzCQkJPSAmaXZiZXBfdW5jb3JlX21zcl9vcHMsCisJLmZvcm1hdF9ncm91cAkJPSAmaXZiZXBfdW5jb3JlX3Vib3hfZm9ybWF0X2dyb3VwLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnNreF91bmNvcmVfY2hhX2Zvcm1hdHNfYXR0cltdID0geworCSZmb3JtYXRfYXR0cl9ldmVudC5hdHRyLAorCSZmb3JtYXRfYXR0cl91bWFzay5hdHRyLAorCSZmb3JtYXRfYXR0cl9lZGdlLmF0dHIsCisJJmZvcm1hdF9hdHRyX3RpZF9lbi5hdHRyLAorCSZmb3JtYXRfYXR0cl9pbnYuYXR0ciwKKwkmZm9ybWF0X2F0dHJfdGhyZXNoOC5hdHRyLAorCSZmb3JtYXRfYXR0cl9maWx0ZXJfdGlkNC5hdHRyLAorCSZmb3JtYXRfYXR0cl9maWx0ZXJfbGluazQuYXR0ciwKKwkmZm9ybWF0X2F0dHJfZmlsdGVyX3N0YXRlNS5hdHRyLAorCSZmb3JtYXRfYXR0cl9maWx0ZXJfcmVtLmF0dHIsCisJJmZvcm1hdF9hdHRyX2ZpbHRlcl9sb2MuYXR0ciwKKwkmZm9ybWF0X2F0dHJfZmlsdGVyX25tLmF0dHIsCisJJmZvcm1hdF9hdHRyX2ZpbHRlcl9hbGxfb3AuYXR0ciwKKwkmZm9ybWF0X2F0dHJfZmlsdGVyX25vdF9ubS5hdHRyLAorCSZmb3JtYXRfYXR0cl9maWx0ZXJfb3BjXzAuYXR0ciwKKwkmZm9ybWF0X2F0dHJfZmlsdGVyX29wY18xLmF0dHIsCisJJmZvcm1hdF9hdHRyX2ZpbHRlcl9uYy5hdHRyLAorCSZmb3JtYXRfYXR0cl9maWx0ZXJfYzYuYXR0ciwKKwkmZm9ybWF0X2F0dHJfZmlsdGVyX2lzb2MuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgc2t4X3VuY29yZV9jaGFib3hfZm9ybWF0X2dyb3VwID0geworCS5uYW1lID0gImZvcm1hdCIsCisJLmF0dHJzID0gc2t4X3VuY29yZV9jaGFfZm9ybWF0c19hdHRyLAorfTsKKworc3RhdGljIHN0cnVjdCBldmVudF9jb25zdHJhaW50IHNreF91bmNvcmVfY2hhYm94X2NvbnN0cmFpbnRzW10gPSB7CisJVU5DT1JFX0VWRU5UX0NPTlNUUkFJTlQoMHgxMSwgMHgxKSwKKwlVTkNPUkVfRVZFTlRfQ09OU1RSQUlOVCgweDM2LCAweDEpLAorCUVWRU5UX0NPTlNUUkFJTlRfRU5ECit9OworCitzdGF0aWMgc3RydWN0IGV4dHJhX3JlZyBza3hfdW5jb3JlX2NoYV9leHRyYV9yZWdzW10gPSB7CisJU05CRVBfQ0JPX0VWRU5UX0VYVFJBX1JFRygweDAzMzQsIDB4ZmZmZiwgMHg0KSwKKwlTTkJFUF9DQk9fRVZFTlRfRVhUUkFfUkVHKDB4MDUzNCwgMHhmZmZmLCAweDQpLAorCVNOQkVQX0NCT19FVkVOVF9FWFRSQV9SRUcoMHgwOTM0LCAweGZmZmYsIDB4NCksCisJU05CRVBfQ0JPX0VWRU5UX0VYVFJBX1JFRygweDExMzQsIDB4ZmZmZiwgMHg0KSwKKwlTTkJFUF9DQk9fRVZFTlRfRVhUUkFfUkVHKDB4MjEzNCwgMHhmZmZmLCAweDQpLAorCVNOQkVQX0NCT19FVkVOVF9FWFRSQV9SRUcoMHg4MTM0LCAweGZmZmYsIDB4NCksCit9OworCitzdGF0aWMgdTY0IHNreF9jaGFfZmlsdGVyX21hc2soaW50IGZpZWxkcykKK3sKKwl1NjQgbWFzayA9IDA7CisKKwlpZiAoZmllbGRzICYgMHgxKQorCQltYXNrIHw9IFNLWF9DSEFfTVNSX1BNT05fQk9YX0ZJTFRFUl9USUQ7CisJaWYgKGZpZWxkcyAmIDB4MikKKwkJbWFzayB8PSBTS1hfQ0hBX01TUl9QTU9OX0JPWF9GSUxURVJfTElOSzsKKwlpZiAoZmllbGRzICYgMHg0KQorCQltYXNrIHw9IFNLWF9DSEFfTVNSX1BNT05fQk9YX0ZJTFRFUl9TVEFURTsKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIHN0cnVjdCBldmVudF9jb25zdHJhaW50ICoKK3NreF9jaGFfZ2V0X2NvbnN0cmFpbnQoc3RydWN0IGludGVsX3VuY29yZV9ib3ggKmJveCwgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXJldHVybiBfX3NuYmVwX2Nib3hfZ2V0X2NvbnN0cmFpbnQoYm94LCBldmVudCwgc2t4X2NoYV9maWx0ZXJfbWFzayk7Cit9CisKK3N0YXRpYyBpbnQgc2t4X2NoYV9od19jb25maWcoc3RydWN0IGludGVsX3VuY29yZV9ib3ggKmJveCwgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCBod19wZXJmX2V2ZW50X2V4dHJhICpyZWcxID0gJmV2ZW50LT5ody5leHRyYV9yZWc7CisJc3RydWN0IGV4dHJhX3JlZyAqZXI7CisJaW50IGlkeCA9IDA7CisKKwlmb3IgKGVyID0gc2t4X3VuY29yZV9jaGFfZXh0cmFfcmVnczsgZXItPm1zcjsgZXIrKykgeworCQlpZiAoZXItPmV2ZW50ICE9IChldmVudC0+aHcuY29uZmlnICYgZXItPmNvbmZpZ19tYXNrKSkKKwkJCWNvbnRpbnVlOworCQlpZHggfD0gZXItPmlkeDsKKwl9CisKKwlpZiAoaWR4KSB7CisJCXJlZzEtPnJlZyA9IEhTV0VQX0MwX01TUl9QTU9OX0JPWF9GSUxURVIwICsKKwkJCSAgICBIU1dFUF9DQk9fTVNSX09GRlNFVCAqIGJveC0+cG11LT5wbXVfaWR4OworCQlyZWcxLT5jb25maWcgPSBldmVudC0+YXR0ci5jb25maWcxICYgc2t4X2NoYV9maWx0ZXJfbWFzayhpZHgpOworCQlyZWcxLT5pZHggPSBpZHg7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGludGVsX3VuY29yZV9vcHMgc2t4X3VuY29yZV9jaGFib3hfb3BzID0geworCS8qIFRoZXJlIGlzIG5vIGZyel9lbiBmb3IgY2hhYm94IGN0bCAqLworCS5pbml0X2JveAkJPSBpdmJlcF91bmNvcmVfbXNyX2luaXRfYm94LAorCS5kaXNhYmxlX2JveAkJPSBzbmJlcF91bmNvcmVfbXNyX2Rpc2FibGVfYm94LAorCS5lbmFibGVfYm94CQk9IHNuYmVwX3VuY29yZV9tc3JfZW5hYmxlX2JveCwKKwkuZGlzYWJsZV9ldmVudAkJPSBzbmJlcF91bmNvcmVfbXNyX2Rpc2FibGVfZXZlbnQsCisJLmVuYWJsZV9ldmVudAkJPSBoc3dlcF9jYm94X2VuYWJsZV9ldmVudCwKKwkucmVhZF9jb3VudGVyCQk9IHVuY29yZV9tc3JfcmVhZF9jb3VudGVyLAorCS5od19jb25maWcJCT0gc2t4X2NoYV9od19jb25maWcsCisJLmdldF9jb25zdHJhaW50CQk9IHNreF9jaGFfZ2V0X2NvbnN0cmFpbnQsCisJLnB1dF9jb25zdHJhaW50CQk9IHNuYmVwX2Nib3hfcHV0X2NvbnN0cmFpbnQsCit9OworCitzdGF0aWMgc3RydWN0IGludGVsX3VuY29yZV90eXBlIHNreF91bmNvcmVfY2hhYm94ID0geworCS5uYW1lCQkJPSAiY2hhIiwKKwkubnVtX2NvdW50ZXJzCQk9IDQsCisJLnBlcmZfY3RyX2JpdHMJCT0gNDgsCisJLmV2ZW50X2N0bAkJPSBIU1dFUF9DMF9NU1JfUE1PTl9DVEwwLAorCS5wZXJmX2N0cgkJPSBIU1dFUF9DMF9NU1JfUE1PTl9DVFIwLAorCS5ldmVudF9tYXNrCQk9IEhTV0VQX1NfTVNSX1BNT05fUkFXX0VWRU5UX01BU0ssCisJLmJveF9jdGwJCT0gSFNXRVBfQzBfTVNSX1BNT05fQk9YX0NUTCwKKwkubXNyX29mZnNldAkJPSBIU1dFUF9DQk9fTVNSX09GRlNFVCwKKwkubnVtX3NoYXJlZF9yZWdzCT0gMSwKKwkuY29uc3RyYWludHMJCT0gc2t4X3VuY29yZV9jaGFib3hfY29uc3RyYWludHMsCisJLm9wcwkJCT0gJnNreF91bmNvcmVfY2hhYm94X29wcywKKwkuZm9ybWF0X2dyb3VwCQk9ICZza3hfdW5jb3JlX2NoYWJveF9mb3JtYXRfZ3JvdXAsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqc2t4X3VuY29yZV9paW9fZm9ybWF0c19hdHRyW10gPSB7CisJJmZvcm1hdF9hdHRyX2V2ZW50LmF0dHIsCisJJmZvcm1hdF9hdHRyX3VtYXNrLmF0dHIsCisJJmZvcm1hdF9hdHRyX2VkZ2UuYXR0ciwKKwkmZm9ybWF0X2F0dHJfaW52LmF0dHIsCisJJmZvcm1hdF9hdHRyX3RocmVzaDkuYXR0ciwKKwkmZm9ybWF0X2F0dHJfY2hfbWFzay5hdHRyLAorCSZmb3JtYXRfYXR0cl9mY19tYXNrLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHNreF91bmNvcmVfaWlvX2Zvcm1hdF9ncm91cCA9IHsKKwkubmFtZSA9ICJmb3JtYXQiLAorCS5hdHRycyA9IHNreF91bmNvcmVfaWlvX2Zvcm1hdHNfYXR0ciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCBza3hfdW5jb3JlX2lpb19jb25zdHJhaW50c1tdID0geworCVVOQ09SRV9FVkVOVF9DT05TVFJBSU5UKDB4ODMsIDB4MyksCisJVU5DT1JFX0VWRU5UX0NPTlNUUkFJTlQoMHg4OCwgMHhjKSwKKwlVTkNPUkVfRVZFTlRfQ09OU1RSQUlOVCgweDk1LCAweGMpLAorCVVOQ09SRV9FVkVOVF9DT05TVFJBSU5UKDB4YzAsIDB4YyksCisJVU5DT1JFX0VWRU5UX0NPTlNUUkFJTlQoMHhjNSwgMHhjKSwKKwlVTkNPUkVfRVZFTlRfQ09OU1RSQUlOVCgweGQ0LCAweGMpLAorCUVWRU5UX0NPTlNUUkFJTlRfRU5ECit9OworCitzdGF0aWMgdm9pZCBza3hfaWlvX2VuYWJsZV9ldmVudChzdHJ1Y3QgaW50ZWxfdW5jb3JlX2JveCAqYm94LAorCQkJCSBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7CisKKwl3cm1zcmwoaHdjLT5jb25maWdfYmFzZSwgaHdjLT5jb25maWcgfCBTTkJFUF9QTU9OX0NUTF9FTik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfdW5jb3JlX29wcyBza3hfdW5jb3JlX2lpb19vcHMgPSB7CisJLmluaXRfYm94CQk9IGl2YmVwX3VuY29yZV9tc3JfaW5pdF9ib3gsCisJLmRpc2FibGVfYm94CQk9IHNuYmVwX3VuY29yZV9tc3JfZGlzYWJsZV9ib3gsCisJLmVuYWJsZV9ib3gJCT0gc25iZXBfdW5jb3JlX21zcl9lbmFibGVfYm94LAorCS5kaXNhYmxlX2V2ZW50CQk9IHNuYmVwX3VuY29yZV9tc3JfZGlzYWJsZV9ldmVudCwKKwkuZW5hYmxlX2V2ZW50CQk9IHNreF9paW9fZW5hYmxlX2V2ZW50LAorCS5yZWFkX2NvdW50ZXIJCT0gdW5jb3JlX21zcl9yZWFkX2NvdW50ZXIsCit9OworCitzdGF0aWMgc3RydWN0IGludGVsX3VuY29yZV90eXBlIHNreF91bmNvcmVfaWlvID0geworCS5uYW1lCQkJPSAiaWlvIiwKKwkubnVtX2NvdW50ZXJzCQk9IDQsCisJLm51bV9ib3hlcwkJPSA1LAorCS5wZXJmX2N0cl9iaXRzCQk9IDQ4LAorCS5ldmVudF9jdGwJCT0gU0tYX0lJTzBfTVNSX1BNT05fQ1RMMCwKKwkucGVyZl9jdHIJCT0gU0tYX0lJTzBfTVNSX1BNT05fQ1RSMCwKKwkuZXZlbnRfbWFzawkJPSBTS1hfSUlPX1BNT05fUkFXX0VWRU5UX01BU0ssCisJLmV2ZW50X21hc2tfZXh0CQk9IFNLWF9JSU9fUE1PTl9SQVdfRVZFTlRfTUFTS19FWFQsCisJLmJveF9jdGwJCT0gU0tYX0lJTzBfTVNSX1BNT05fQk9YX0NUTCwKKwkubXNyX29mZnNldAkJPSBTS1hfSUlPX01TUl9PRkZTRVQsCisJLmNvbnN0cmFpbnRzCQk9IHNreF91bmNvcmVfaWlvX2NvbnN0cmFpbnRzLAorCS5vcHMJCQk9ICZza3hfdW5jb3JlX2lpb19vcHMsCisJLmZvcm1hdF9ncm91cAkJPSAmc2t4X3VuY29yZV9paW9fZm9ybWF0X2dyb3VwLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnNreF91bmNvcmVfZm9ybWF0c19hdHRyW10gPSB7CisJJmZvcm1hdF9hdHRyX2V2ZW50LmF0dHIsCisJJmZvcm1hdF9hdHRyX3VtYXNrLmF0dHIsCisJJmZvcm1hdF9hdHRyX2VkZ2UuYXR0ciwKKwkmZm9ybWF0X2F0dHJfaW52LmF0dHIsCisJJmZvcm1hdF9hdHRyX3RocmVzaDguYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgc2t4X3VuY29yZV9mb3JtYXRfZ3JvdXAgPSB7CisJLm5hbWUgPSAiZm9ybWF0IiwKKwkuYXR0cnMgPSBza3hfdW5jb3JlX2Zvcm1hdHNfYXR0ciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfdW5jb3JlX3R5cGUgc2t4X3VuY29yZV9pcnAgPSB7CisJLm5hbWUJCQk9ICJpcnAiLAorCS5udW1fY291bnRlcnMJCT0gMiwKKwkubnVtX2JveGVzCQk9IDUsCisJLnBlcmZfY3RyX2JpdHMJCT0gNDgsCisJLmV2ZW50X2N0bAkJPSBTS1hfSVJQMF9NU1JfUE1PTl9DVEwwLAorCS5wZXJmX2N0cgkJPSBTS1hfSVJQMF9NU1JfUE1PTl9DVFIwLAorCS5ldmVudF9tYXNrCQk9IFNOQkVQX1BNT05fUkFXX0VWRU5UX01BU0ssCisJLmJveF9jdGwJCT0gU0tYX0lSUDBfTVNSX1BNT05fQk9YX0NUTCwKKwkubXNyX29mZnNldAkJPSBTS1hfSVJQX01TUl9PRkZTRVQsCisJLm9wcwkJCT0gJnNreF91bmNvcmVfaWlvX29wcywKKwkuZm9ybWF0X2dyb3VwCQk9ICZza3hfdW5jb3JlX2Zvcm1hdF9ncm91cCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfdW5jb3JlX29wcyBza3hfdW5jb3JlX3BjdV9vcHMgPSB7CisJSVZCRVBfVU5DT1JFX01TUl9PUFNfQ09NTU9OX0lOSVQoKSwKKwkuaHdfY29uZmlnCQk9IGhzd2VwX3BjdV9od19jb25maWcsCisJLmdldF9jb25zdHJhaW50CQk9IHNuYmVwX3BjdV9nZXRfY29uc3RyYWludCwKKwkucHV0X2NvbnN0cmFpbnQJCT0gc25iZXBfcGN1X3B1dF9jb25zdHJhaW50LAorfTsKKworc3RhdGljIHN0cnVjdCBpbnRlbF91bmNvcmVfdHlwZSBza3hfdW5jb3JlX3BjdSA9IHsKKwkubmFtZQkJCT0gInBjdSIsCisJLm51bV9jb3VudGVycwkJPSA0LAorCS5udW1fYm94ZXMJCT0gMSwKKwkucGVyZl9jdHJfYml0cwkJPSA0OCwKKwkucGVyZl9jdHIJCT0gSFNXRVBfUENVX01TUl9QTU9OX0NUUjAsCisJLmV2ZW50X2N0bAkJPSBIU1dFUF9QQ1VfTVNSX1BNT05fQ1RMMCwKKwkuZXZlbnRfbWFzawkJPSBTTkJFUF9QQ1VfTVNSX1BNT05fUkFXX0VWRU5UX01BU0ssCisJLmJveF9jdGwJCT0gSFNXRVBfUENVX01TUl9QTU9OX0JPWF9DVEwsCisJLm51bV9zaGFyZWRfcmVncwk9IDEsCisJLm9wcwkJCT0gJnNreF91bmNvcmVfcGN1X29wcywKKwkuZm9ybWF0X2dyb3VwCQk9ICZzbmJlcF91bmNvcmVfcGN1X2Zvcm1hdF9ncm91cCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfdW5jb3JlX3R5cGUgKnNreF9tc3JfdW5jb3Jlc1tdID0geworCSZza3hfdW5jb3JlX3Vib3gsCisJJnNreF91bmNvcmVfY2hhYm94LAorCSZza3hfdW5jb3JlX2lpbywKKwkmc2t4X3VuY29yZV9pcnAsCisJJnNreF91bmNvcmVfcGN1LAorCU5VTEwsCit9OworCitzdGF0aWMgaW50IHNreF9jb3VudF9jaGFib3godm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqY2hhYm94X2RldiA9IE5VTEw7CisJaW50IGJ1cywgY291bnQgPSAwOworCisJd2hpbGUgKDEpIHsKKwkJY2hhYm94X2RldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjA4ZCwgY2hhYm94X2Rldik7CisJCWlmICghY2hhYm94X2RldikKKwkJCWJyZWFrOworCQlpZiAoY291bnQgPT0gMCkKKwkJCWJ1cyA9IGNoYWJveF9kZXYtPmJ1cy0+bnVtYmVyOworCQlpZiAoYnVzICE9IGNoYWJveF9kZXYtPmJ1cy0+bnVtYmVyKQorCQkJYnJlYWs7CisJCWNvdW50Kys7CisJfQorCisJcGNpX2Rldl9wdXQoY2hhYm94X2Rldik7CisJcmV0dXJuIGNvdW50OworfQorCit2b2lkIHNreF91bmNvcmVfY3B1X2luaXQodm9pZCkKK3sKKwlza3hfdW5jb3JlX2NoYWJveC5udW1fYm94ZXMgPSBza3hfY291bnRfY2hhYm94KCk7CisJdW5jb3JlX21zcl91bmNvcmVzID0gc2t4X21zcl91bmNvcmVzOworfQorCitzdGF0aWMgc3RydWN0IGludGVsX3VuY29yZV90eXBlIHNreF91bmNvcmVfaW1jID0geworCS5uYW1lCQk9ICJpbWMiLAorCS5udW1fY291bnRlcnMgICA9IDQsCisJLm51bV9ib3hlcwk9IDYsCisJLnBlcmZfY3RyX2JpdHMJPSA0OCwKKwkuZml4ZWRfY3RyX2JpdHMJPSA0OCwKKwkuZml4ZWRfY3RyCT0gU05CRVBfTUNfQ0h5X1BDSV9QTU9OX0ZJWEVEX0NUUiwKKwkuZml4ZWRfY3RsCT0gU05CRVBfTUNfQ0h5X1BDSV9QTU9OX0ZJWEVEX0NUTCwKKwkuZXZlbnRfZGVzY3MJPSBoc3dlcF91bmNvcmVfaW1jX2V2ZW50cywKKwkucGVyZl9jdHIJPSBTTkJFUF9QQ0lfUE1PTl9DVFIwLAorCS5ldmVudF9jdGwJPSBTTkJFUF9QQ0lfUE1PTl9DVEwwLAorCS5ldmVudF9tYXNrCT0gU05CRVBfUE1PTl9SQVdfRVZFTlRfTUFTSywKKwkuYm94X2N0bAk9IFNOQkVQX1BDSV9QTU9OX0JPWF9DVEwsCisJLm9wcwkJPSAmaXZiZXBfdW5jb3JlX3BjaV9vcHMsCisJLmZvcm1hdF9ncm91cAk9ICZza3hfdW5jb3JlX2Zvcm1hdF9ncm91cCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpza3hfdXBpX3VuY29yZV9mb3JtYXRzX2F0dHJbXSA9IHsKKwkmZm9ybWF0X2F0dHJfZXZlbnRfZXh0LmF0dHIsCisJJmZvcm1hdF9hdHRyX3VtYXNrX2V4dC5hdHRyLAorCSZmb3JtYXRfYXR0cl9lZGdlLmF0dHIsCisJJmZvcm1hdF9hdHRyX2ludi5hdHRyLAorCSZmb3JtYXRfYXR0cl90aHJlc2g4LmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHNreF91cGlfdW5jb3JlX2Zvcm1hdF9ncm91cCA9IHsKKwkubmFtZSA9ICJmb3JtYXQiLAorCS5hdHRycyA9IHNreF91cGlfdW5jb3JlX2Zvcm1hdHNfYXR0ciwKK307CisKK3N0YXRpYyB2b2lkIHNreF91cGlfdW5jb3JlX3BjaV9pbml0X2JveChzdHJ1Y3QgaW50ZWxfdW5jb3JlX2JveCAqYm94KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYm94LT5wY2lfZGV2OworCisJX19zZXRfYml0KFVOQ09SRV9CT1hfRkxBR19DVExfT0ZGUzgsICZib3gtPmZsYWdzKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIFNLWF9VUElfUENJX1BNT05fQk9YX0NUTCwgSVZCRVBfUE1PTl9CT1hfQ1RMX0lOVCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfdW5jb3JlX29wcyBza3hfdXBpX3VuY29yZV9wY2lfb3BzID0geworCS5pbml0X2JveAk9IHNreF91cGlfdW5jb3JlX3BjaV9pbml0X2JveCwKKwkuZGlzYWJsZV9ib3gJPSBzbmJlcF91bmNvcmVfcGNpX2Rpc2FibGVfYm94LAorCS5lbmFibGVfYm94CT0gc25iZXBfdW5jb3JlX3BjaV9lbmFibGVfYm94LAorCS5kaXNhYmxlX2V2ZW50CT0gc25iZXBfdW5jb3JlX3BjaV9kaXNhYmxlX2V2ZW50LAorCS5lbmFibGVfZXZlbnQJPSBzbmJlcF91bmNvcmVfcGNpX2VuYWJsZV9ldmVudCwKKwkucmVhZF9jb3VudGVyCT0gc25iZXBfdW5jb3JlX3BjaV9yZWFkX2NvdW50ZXIsCit9OworCitzdGF0aWMgc3RydWN0IGludGVsX3VuY29yZV90eXBlIHNreF91bmNvcmVfdXBpID0geworCS5uYW1lCQk9ICJ1cGkiLAorCS5udW1fY291bnRlcnMgICA9IDQsCisJLm51bV9ib3hlcwk9IDMsCisJLnBlcmZfY3RyX2JpdHMJPSA0OCwKKwkucGVyZl9jdHIJPSBTS1hfVVBJX1BDSV9QTU9OX0NUUjAsCisJLmV2ZW50X2N0bAk9IFNLWF9VUElfUENJX1BNT05fQ1RMMCwKKwkuZXZlbnRfbWFzawk9IFNOQkVQX1FQSV9QQ0lfUE1PTl9SQVdfRVZFTlRfTUFTSywKKwkuZXZlbnRfbWFza19leHQgPSBTS1hfUE1PTl9DVExfVU1BU0tfRVhULAorCS5ib3hfY3RsCT0gU0tYX1VQSV9QQ0lfUE1PTl9CT1hfQ1RMLAorCS5vcHMJCT0gJnNreF91cGlfdW5jb3JlX3BjaV9vcHMsCisJLmZvcm1hdF9ncm91cAk9ICZza3hfdXBpX3VuY29yZV9mb3JtYXRfZ3JvdXAsCit9OworCitzdGF0aWMgdm9pZCBza3hfbTJtX3VuY29yZV9wY2lfaW5pdF9ib3goc3RydWN0IGludGVsX3VuY29yZV9ib3ggKmJveCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGJveC0+cGNpX2RldjsKKworCV9fc2V0X2JpdChVTkNPUkVfQk9YX0ZMQUdfQ1RMX09GRlM4LCAmYm94LT5mbGFncyk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBTS1hfTTJNX1BDSV9QTU9OX0JPWF9DVEwsIElWQkVQX1BNT05fQk9YX0NUTF9JTlQpOworfQorCitzdGF0aWMgc3RydWN0IGludGVsX3VuY29yZV9vcHMgc2t4X20ybV91bmNvcmVfcGNpX29wcyA9IHsKKwkuaW5pdF9ib3gJPSBza3hfbTJtX3VuY29yZV9wY2lfaW5pdF9ib3gsCisJLmRpc2FibGVfYm94CT0gc25iZXBfdW5jb3JlX3BjaV9kaXNhYmxlX2JveCwKKwkuZW5hYmxlX2JveAk9IHNuYmVwX3VuY29yZV9wY2lfZW5hYmxlX2JveCwKKwkuZGlzYWJsZV9ldmVudAk9IHNuYmVwX3VuY29yZV9wY2lfZGlzYWJsZV9ldmVudCwKKwkuZW5hYmxlX2V2ZW50CT0gc25iZXBfdW5jb3JlX3BjaV9lbmFibGVfZXZlbnQsCisJLnJlYWRfY291bnRlcgk9IHNuYmVwX3VuY29yZV9wY2lfcmVhZF9jb3VudGVyLAorfTsKKworc3RhdGljIHN0cnVjdCBpbnRlbF91bmNvcmVfdHlwZSBza3hfdW5jb3JlX20ybSA9IHsKKwkubmFtZQkJPSAibTJtIiwKKwkubnVtX2NvdW50ZXJzICAgPSA0LAorCS5udW1fYm94ZXMJPSAyLAorCS5wZXJmX2N0cl9iaXRzCT0gNDgsCisJLnBlcmZfY3RyCT0gU0tYX00yTV9QQ0lfUE1PTl9DVFIwLAorCS5ldmVudF9jdGwJPSBTS1hfTTJNX1BDSV9QTU9OX0NUTDAsCisJLmV2ZW50X21hc2sJPSBTTkJFUF9QTU9OX1JBV19FVkVOVF9NQVNLLAorCS5ib3hfY3RsCT0gU0tYX00yTV9QQ0lfUE1PTl9CT1hfQ1RMLAorCS5vcHMJCT0gJnNreF9tMm1fdW5jb3JlX3BjaV9vcHMsCisJLmZvcm1hdF9ncm91cAk9ICZza3hfdW5jb3JlX2Zvcm1hdF9ncm91cCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCBza3hfdW5jb3JlX20ycGNpZV9jb25zdHJhaW50c1tdID0geworCVVOQ09SRV9FVkVOVF9DT05TVFJBSU5UKDB4MjMsIDB4MyksCisJRVZFTlRfQ09OU1RSQUlOVF9FTkQKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfdW5jb3JlX3R5cGUgc2t4X3VuY29yZV9tMnBjaWUgPSB7CisJLm5hbWUJCT0gIm0ycGNpZSIsCisJLm51bV9jb3VudGVycyAgID0gNCwKKwkubnVtX2JveGVzCT0gNCwKKwkucGVyZl9jdHJfYml0cwk9IDQ4LAorCS5jb25zdHJhaW50cwk9IHNreF91bmNvcmVfbTJwY2llX2NvbnN0cmFpbnRzLAorCS5wZXJmX2N0cgk9IFNOQkVQX1BDSV9QTU9OX0NUUjAsCisJLmV2ZW50X2N0bAk9IFNOQkVQX1BDSV9QTU9OX0NUTDAsCisJLmV2ZW50X21hc2sJPSBTTkJFUF9QTU9OX1JBV19FVkVOVF9NQVNLLAorCS5ib3hfY3RsCT0gU05CRVBfUENJX1BNT05fQk9YX0NUTCwKKwkub3BzCQk9ICZpdmJlcF91bmNvcmVfcGNpX29wcywKKwkuZm9ybWF0X2dyb3VwCT0gJnNreF91bmNvcmVfZm9ybWF0X2dyb3VwLAorfTsKKworc3RhdGljIHN0cnVjdCBldmVudF9jb25zdHJhaW50IHNreF91bmNvcmVfbTN1cGlfY29uc3RyYWludHNbXSA9IHsKKwlVTkNPUkVfRVZFTlRfQ09OU1RSQUlOVCgweDFkLCAweDEpLAorCVVOQ09SRV9FVkVOVF9DT05TVFJBSU5UKDB4MWUsIDB4MSksCisJVU5DT1JFX0VWRU5UX0NPTlNUUkFJTlQoMHg0MCwgMHg3KSwKKwlVTkNPUkVfRVZFTlRfQ09OU1RSQUlOVCgweDRlLCAweDcpLAorCVVOQ09SRV9FVkVOVF9DT05TVFJBSU5UKDB4NGYsIDB4NyksCisJVU5DT1JFX0VWRU5UX0NPTlNUUkFJTlQoMHg1MCwgMHg3KSwKKwlVTkNPUkVfRVZFTlRfQ09OU1RSQUlOVCgweDUxLCAweDcpLAorCVVOQ09SRV9FVkVOVF9DT05TVFJBSU5UKDB4NTIsIDB4NyksCisJRVZFTlRfQ09OU1RSQUlOVF9FTkQKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfdW5jb3JlX3R5cGUgc2t4X3VuY29yZV9tM3VwaSA9IHsKKwkubmFtZQkJPSAibTN1cGkiLAorCS5udW1fY291bnRlcnMgICA9IDMsCisJLm51bV9ib3hlcwk9IDMsCisJLnBlcmZfY3RyX2JpdHMJPSA0OCwKKwkuY29uc3RyYWludHMJPSBza3hfdW5jb3JlX20zdXBpX2NvbnN0cmFpbnRzLAorCS5wZXJmX2N0cgk9IFNOQkVQX1BDSV9QTU9OX0NUUjAsCisJLmV2ZW50X2N0bAk9IFNOQkVQX1BDSV9QTU9OX0NUTDAsCisJLmV2ZW50X21hc2sJPSBTTkJFUF9QTU9OX1JBV19FVkVOVF9NQVNLLAorCS5ib3hfY3RsCT0gU05CRVBfUENJX1BNT05fQk9YX0NUTCwKKwkub3BzCQk9ICZpdmJlcF91bmNvcmVfcGNpX29wcywKKwkuZm9ybWF0X2dyb3VwCT0gJnNreF91bmNvcmVfZm9ybWF0X2dyb3VwLAorfTsKKworZW51bSB7CisJU0tYX1BDSV9VTkNPUkVfSU1DLAorCVNLWF9QQ0lfVU5DT1JFX00yTSwKKwlTS1hfUENJX1VOQ09SRV9VUEksCisJU0tYX1BDSV9VTkNPUkVfTTJQQ0lFLAorCVNLWF9QQ0lfVU5DT1JFX00zVVBJLAorfTsKKworc3RhdGljIHN0cnVjdCBpbnRlbF91bmNvcmVfdHlwZSAqc2t4X3BjaV91bmNvcmVzW10gPSB7CisJW1NLWF9QQ0lfVU5DT1JFX0lNQ10JPSAmc2t4X3VuY29yZV9pbWMsCisJW1NLWF9QQ0lfVU5DT1JFX00yTV0JPSAmc2t4X3VuY29yZV9tMm0sCisJW1NLWF9QQ0lfVU5DT1JFX1VQSV0JPSAmc2t4X3VuY29yZV91cGksCisJW1NLWF9QQ0lfVU5DT1JFX00yUENJRV0JPSAmc2t4X3VuY29yZV9tMnBjaWUsCisJW1NLWF9QQ0lfVU5DT1JFX00zVVBJXQk9ICZza3hfdW5jb3JlX20zdXBpLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgc2t4X3VuY29yZV9wY2lfaWRzW10gPSB7CisJeyAvKiBNQzAgQ2hhbm5lbCAwICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDQyKSwKKwkJLmRyaXZlcl9kYXRhID0gVU5DT1JFX1BDSV9ERVZfRlVMTF9EQVRBKDEwLCAyLCBTS1hfUENJX1VOQ09SRV9JTUMsIDApLAorCX0sCisJeyAvKiBNQzAgQ2hhbm5lbCAxICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDQ2KSwKKwkJLmRyaXZlcl9kYXRhID0gVU5DT1JFX1BDSV9ERVZfRlVMTF9EQVRBKDEwLCA2LCBTS1hfUENJX1VOQ09SRV9JTUMsIDEpLAorCX0sCisJeyAvKiBNQzAgQ2hhbm5lbCAyICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDRhKSwKKwkJLmRyaXZlcl9kYXRhID0gVU5DT1JFX1BDSV9ERVZfRlVMTF9EQVRBKDExLCAyLCBTS1hfUENJX1VOQ09SRV9JTUMsIDIpLAorCX0sCisJeyAvKiBNQzEgQ2hhbm5lbCAwICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDQyKSwKKwkJLmRyaXZlcl9kYXRhID0gVU5DT1JFX1BDSV9ERVZfRlVMTF9EQVRBKDEyLCAyLCBTS1hfUENJX1VOQ09SRV9JTUMsIDMpLAorCX0sCisJeyAvKiBNQzEgQ2hhbm5lbCAxICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDQ2KSwKKwkJLmRyaXZlcl9kYXRhID0gVU5DT1JFX1BDSV9ERVZfRlVMTF9EQVRBKDEyLCA2LCBTS1hfUENJX1VOQ09SRV9JTUMsIDQpLAorCX0sCisJeyAvKiBNQzEgQ2hhbm5lbCAyICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDRhKSwKKwkJLmRyaXZlcl9kYXRhID0gVU5DT1JFX1BDSV9ERVZfRlVMTF9EQVRBKDEzLCAyLCBTS1hfUENJX1VOQ09SRV9JTUMsIDUpLAorCX0sCisJeyAvKiBNMk0wICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDY2KSwKKwkJLmRyaXZlcl9kYXRhID0gVU5DT1JFX1BDSV9ERVZfRlVMTF9EQVRBKDgsIDAsIFNLWF9QQ0lfVU5DT1JFX00yTSwgMCksCisJfSwKKwl7IC8qIE0yTTEgKi8KKwkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwNjYpLAorCQkuZHJpdmVyX2RhdGEgPSBVTkNPUkVfUENJX0RFVl9GVUxMX0RBVEEoOSwgMCwgU0tYX1BDSV9VTkNPUkVfTTJNLCAxKSwKKwl9LAorCXsgLyogVVBJMCBMaW5rIDAgKi8KKwkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwNTgpLAorCQkuZHJpdmVyX2RhdGEgPSBVTkNPUkVfUENJX0RFVl9GVUxMX0RBVEEoMTQsIDAsIFNLWF9QQ0lfVU5DT1JFX1VQSSwgMCksCisJfSwKKwl7IC8qIFVQSTAgTGluayAxICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDU4KSwKKwkJLmRyaXZlcl9kYXRhID0gVU5DT1JFX1BDSV9ERVZfRlVMTF9EQVRBKDE1LCAwLCBTS1hfUENJX1VOQ09SRV9VUEksIDEpLAorCX0sCisJeyAvKiBVUEkxIExpbmsgMiAqLworCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjA1OCksCisJCS5kcml2ZXJfZGF0YSA9IFVOQ09SRV9QQ0lfREVWX0ZVTExfREFUQSgxNiwgMCwgU0tYX1BDSV9VTkNPUkVfVVBJLCAyKSwKKwl9LAorCXsgLyogTTJQQ0llIDAgKi8KKwkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwODgpLAorCQkuZHJpdmVyX2RhdGEgPSBVTkNPUkVfUENJX0RFVl9GVUxMX0RBVEEoMjEsIDEsIFNLWF9QQ0lfVU5DT1JFX00yUENJRSwgMCksCisJfSwKKwl7IC8qIE0yUENJZSAxICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDg4KSwKKwkJLmRyaXZlcl9kYXRhID0gVU5DT1JFX1BDSV9ERVZfRlVMTF9EQVRBKDIyLCAxLCBTS1hfUENJX1VOQ09SRV9NMlBDSUUsIDEpLAorCX0sCisJeyAvKiBNMlBDSWUgMiAqLworCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjA4OCksCisJCS5kcml2ZXJfZGF0YSA9IFVOQ09SRV9QQ0lfREVWX0ZVTExfREFUQSgyMywgMSwgU0tYX1BDSV9VTkNPUkVfTTJQQ0lFLCAyKSwKKwl9LAorCXsgLyogTTJQQ0llIDMgKi8KKwkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwODgpLAorCQkuZHJpdmVyX2RhdGEgPSBVTkNPUkVfUENJX0RFVl9GVUxMX0RBVEEoMjEsIDUsIFNLWF9QQ0lfVU5DT1JFX00yUENJRSwgMyksCisJfSwKKwl7IC8qIE0zVVBJMCBMaW5rIDAgKi8KKwkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwNEMpLAorCQkuZHJpdmVyX2RhdGEgPSBVTkNPUkVfUENJX0RFVl9GVUxMX0RBVEEoMTgsIDAsIFNLWF9QQ0lfVU5DT1JFX00zVVBJLCAwKSwKKwl9LAorCXsgLyogTTNVUEkwIExpbmsgMSAqLworCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjA0RCksCisJCS5kcml2ZXJfZGF0YSA9IFVOQ09SRV9QQ0lfREVWX0ZVTExfREFUQSgxOCwgMSwgU0tYX1BDSV9VTkNPUkVfTTNVUEksIDEpLAorCX0sCisJeyAvKiBNM1VQSTEgTGluayAyICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDRDKSwKKwkJLmRyaXZlcl9kYXRhID0gVU5DT1JFX1BDSV9ERVZfRlVMTF9EQVRBKDE4LCA0LCBTS1hfUENJX1VOQ09SRV9NM1VQSSwgMiksCisJfSwKKwl7IC8qIGVuZDogYWxsIHplcm9lcyAqLyB9Cit9OworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBza3hfdW5jb3JlX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInNreF91bmNvcmUiLAorCS5pZF90YWJsZQk9IHNreF91bmNvcmVfcGNpX2lkcywKK307CisKK2ludCBza3hfdW5jb3JlX3BjaV9pbml0KHZvaWQpCit7CisJLyogbmVlZCB0byBkb3VibGUgY2hlY2sgcGNpIGFkZHJlc3MgKi8KKwlpbnQgcmV0ID0gc25iZXBfcGNpMnBoeV9tYXBfaW5pdCgweDIwMTQsIFNLWF9DUFVOT0RFSUQsIFNLWF9HSUROSURNQVAsIGZhbHNlKTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl1bmNvcmVfcGNpX3VuY29yZXMgPSBza3hfcGNpX3VuY29yZXM7CisJdW5jb3JlX3BjaV9kcml2ZXIgPSAmc2t4X3VuY29yZV9wY2lfZHJpdmVyOworCXJldHVybiAwOworfQorCisvKiBlbmQgb2YgU0tYIHVuY29yZSBzdXBwb3J0ICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ldmVudHMvcGVyZl9ldmVudC5oIGIvYXJjaC94ODYvZXZlbnRzL3BlcmZfZXZlbnQuaAppbmRleCA4YzRhNDc3Li41ODc0ZDhkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ldmVudHMvcGVyZl9ldmVudC5oCisrKyBiL2FyY2gveDg2L2V2ZW50cy9wZXJmX2V2ZW50LmgKQEAgLTE5NCwxMiArMTk0LDEzIEBACiAJICovCiAJc3RydWN0IGRlYnVnX3N0b3JlCSpkczsKIAl1NjQJCQlwZWJzX2VuYWJsZWQ7CisJaW50CQkJbl9wZWJzOworCWludAkJCW5fbGFyZ2VfcGViczsKIAogCS8qCiAJICogSW50ZWwgTEJSIGJpdHMKIAkgKi8KIAlpbnQJCQkJbGJyX3VzZXJzOwotCXZvaWQJCQkJKmxicl9jb250ZXh0OwogCXN0cnVjdCBwZXJmX2JyYW5jaF9zdGFjawlsYnJfc3RhY2s7CiAJc3RydWN0IHBlcmZfYnJhbmNoX2VudHJ5CWxicl9lbnRyaWVzW01BWF9MQlJfRU5UUklFU107CiAJc3RydWN0IGVyX2FjY291bnQJCSpsYnJfc2VsOwpAQCAtNTA4LDYgKzUwOSw4IEBACiAJdm9pZAkJKCplbmFibGVfYWxsKShpbnQgYWRkZWQpOwogCXZvaWQJCSgqZW5hYmxlKShzdHJ1Y3QgcGVyZl9ldmVudCAqKTsKIAl2b2lkCQkoKmRpc2FibGUpKHN0cnVjdCBwZXJmX2V2ZW50ICopOworCXZvaWQJCSgqYWRkKShzdHJ1Y3QgcGVyZl9ldmVudCAqKTsKKwl2b2lkCQkoKmRlbCkoc3RydWN0IHBlcmZfZXZlbnQgKik7CiAJaW50CQkoKmh3X2NvbmZpZykoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KTsKIAlpbnQJCSgqc2NoZWR1bGVfZXZlbnRzKShzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YywgaW50IG4sIGludCAqYXNzaWduKTsKIAl1bnNpZ25lZAlldmVudHNlbDsKQEAgLTg4OCw2ICs4OTEsMTAgQEAKIAogc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgKmludGVsX3BlYnNfY29uc3RyYWludHMoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KTsKIAordm9pZCBpbnRlbF9wbXVfcGVic19hZGQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KTsKKwordm9pZCBpbnRlbF9wbXVfcGVic19kZWwoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KTsKKwogdm9pZCBpbnRlbF9wbXVfcGVic19lbmFibGUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KTsKIAogdm9pZCBpbnRlbF9wbXVfcGVic19kaXNhYmxlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7CkBAIC05MDYsOSArOTEzLDkgQEAKIAogdm9pZCBpbnRlbF9wbXVfbGJyX3Jlc2V0KHZvaWQpOwogCi12b2lkIGludGVsX3BtdV9sYnJfZW5hYmxlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7Cit2b2lkIGludGVsX3BtdV9sYnJfYWRkKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7CiAKLXZvaWQgaW50ZWxfcG11X2xicl9kaXNhYmxlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7Cit2b2lkIGludGVsX3BtdV9sYnJfZGVsKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7CiAKIHZvaWQgaW50ZWxfcG11X2xicl9lbmFibGVfYWxsKGJvb2wgcG1pKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaWEzMi9pYTMyX3NpZ25hbC5jIGIvYXJjaC94ODYvaWEzMi9pYTMyX3NpZ25hbC5jCmluZGV4IDJmMjlmNGUuLmNiMTNjMDUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2lhMzIvaWEzMl9zaWduYWwuYworKysgYi9hcmNoL3g4Ni9pYTMyL2lhMzJfc2lnbmFsLmMKQEAgLTM3OCw3ICszNzgsNyBAQAogCQlwdXRfdXNlcl9leCgqKCh1NjQgKikmY29kZSksICh1NjQgX191c2VyICopZnJhbWUtPnJldGNvZGUpOwogCX0gcHV0X3VzZXJfY2F0Y2goZXJyKTsKIAotCWVyciB8PSBjb3B5X3NpZ2luZm9fdG9fdXNlcjMyKCZmcmFtZS0+aW5mbywgJmtzaWctPmluZm8pOworCWVyciB8PSBfX2NvcHlfc2lnaW5mb190b191c2VyMzIoJmZyYW1lLT5pbmZvLCAma3NpZy0+aW5mbywgZmFsc2UpOwogCWVyciB8PSBpYTMyX3NldHVwX3NpZ2NvbnRleHQoJmZyYW1lLT51Yy51Y19tY29udGV4dCwgZnBzdGF0ZSwKIAkJCQkgICAgIHJlZ3MsIHNldC0+c2lnWzBdKTsKIAllcnIgfD0gX19jb3B5X3RvX3VzZXIoJmZyYW1lLT51Yy51Y19zaWdtYXNrLCBzZXQsIHNpemVvZigqc2V0KSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYWx0ZXJuYXRpdmUuaAppbmRleCBlNzdhNjQ0Li4xYjAyMDM4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FsdGVybmF0aXZlLmgKQEAgLTIxNywxMCArMjE3LDE0IEBACiAgKi8KICNkZWZpbmUgYWx0ZXJuYXRpdmVfY2FsbF8yKG9sZGZ1bmMsIG5ld2Z1bmMxLCBmZWF0dXJlMSwgbmV3ZnVuYzIsIGZlYXR1cmUyLCAgIFwKIAkJCSAgIG91dHB1dCwgaW5wdXQuLi4pCQkJCSAgICAgIFwKK3sJCQkJCQkJCQkgICAgICBcCisJcmVnaXN0ZXIgdm9pZCAqX19zcCBhc20oX0FTTV9TUCk7CQkJCSAgICAgIFwKIAlhc20gdm9sYXRpbGUgKEFMVEVSTkFUSVZFXzIoImNhbGwgJVBbb2xkXSIsICJjYWxsICVQW25ldzFdIiwgZmVhdHVyZTEsXAogCQkiY2FsbCAlUFtuZXcyXSIsIGZlYXR1cmUyKQkJCQkgICAgICBcCi0JCTogb3V0cHV0IDogW29sZF0gImkiIChvbGRmdW5jKSwgW25ldzFdICJpIiAobmV3ZnVuYzEpLAkgICAgICBcCi0JCVtuZXcyXSAiaSIgKG5ld2Z1bmMyKSwgIyMgaW5wdXQpCisJCTogb3V0cHV0LCAiK3IiIChfX3NwKQkJCQkJICAgICAgXAorCQk6IFtvbGRdICJpIiAob2xkZnVuYyksIFtuZXcxXSAiaSIgKG5ld2Z1bmMxKSwJCSAgICAgIFwKKwkJICBbbmV3Ml0gImkiIChuZXdmdW5jMiksICMjIGlucHV0KTsJCQkgICAgICBcCit9CiAKIC8qCiAgKiB1c2UgdGhpcyBtYWNybyhzKSBpZiB5b3UgbmVlZCBtb3JlIHRoYW4gb25lIG91dHB1dCBwYXJhbWV0ZXIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwaWMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwaWMuaAppbmRleCAxMjQzNTc3Li5mNWFhZjZjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGljLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYXBpYy5oCkBAIC02NTAsOCArNjUwLDggQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGlwaV9lbnRlcmluZ19hY2tfaXJxKHZvaWQpCiB7Ci0JYWNrX0FQSUNfaXJxKCk7CiAJaXJxX2VudGVyKCk7CisJYWNrX0FQSUNfaXJxKCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBleGl0aW5nX2lycSh2b2lkKQpAQCAtNjYxLDkgKzY2MSw4IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBleGl0aW5nX2Fja19pcnEodm9pZCkKIHsKLQlpcnFfZXhpdCgpOwotCS8qIEFjayBvbmx5IGF0IHRoZSBlbmQgdG8gYXZvaWQgcG90ZW50aWFsIHJlZW50cnkgKi8KIAlhY2tfQVBJQ19pcnEoKTsKKwlpcnFfZXhpdCgpOwogfQogCiBleHRlcm4gdm9pZCBpb2FwaWNfemFwX2xvY2tzKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY21weGNoZy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY21weGNoZy5oCmluZGV4IDk3MzMzNjEuLjk3ODQ4Y2QgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NtcHhjaGcuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbXB4Y2hnLmgKQEAgLTE1OCw1MyArMTU4LDkgQEAKICAqIHZhbHVlIG9mICIqcHRyIi4KICAqCiAgKiB4YWRkKCkgaXMgbG9ja2VkIHdoZW4gbXVsdGlwbGUgQ1BVcyBhcmUgb25saW5lCi0gKiB4YWRkX3N5bmMoKSBpcyBhbHdheXMgbG9ja2VkCi0gKiB4YWRkX2xvY2FsKCkgaXMgbmV2ZXIgbG9ja2VkCiAgKi8KICNkZWZpbmUgX194YWRkKHB0ciwgaW5jLCBsb2NrKQlfX3hjaGdfb3AoKHB0ciksIChpbmMpLCB4YWRkLCBsb2NrKQogI2RlZmluZSB4YWRkKHB0ciwgaW5jKQkJX194YWRkKChwdHIpLCAoaW5jKSwgTE9DS19QUkVGSVgpCi0jZGVmaW5lIHhhZGRfc3luYyhwdHIsIGluYykJX194YWRkKChwdHIpLCAoaW5jKSwgImxvY2s7ICIpCi0jZGVmaW5lIHhhZGRfbG9jYWwocHRyLCBpbmMpCV9feGFkZCgocHRyKSwgKGluYyksICIiKQotCi0jZGVmaW5lIF9fYWRkKHB0ciwgaW5jLCBsb2NrKQkJCQkJCVwKLQkoewkJCQkJCQkJXAotCSAgICAgICAgX190eXBlb2ZfXyAoKihwdHIpKSBfX3JldCA9IChpbmMpOwkJCVwKLQkJc3dpdGNoIChzaXplb2YoKihwdHIpKSkgewkJCQlcCi0JCWNhc2UgX19YODZfQ0FTRV9COgkJCQkJXAotCQkJYXNtIHZvbGF0aWxlIChsb2NrICJhZGRiICViMSwgJTBcbiIJCVwKLQkJCQkgICAgICA6ICIrbSIgKCoocHRyKSkgOiAicWkiIChpbmMpCVwKLQkJCQkgICAgICA6ICJtZW1vcnkiLCAiY2MiKTsJCVwKLQkJCWJyZWFrOwkJCQkJCVwKLQkJY2FzZSBfX1g4Nl9DQVNFX1c6CQkJCQlcCi0JCQlhc20gdm9sYXRpbGUgKGxvY2sgImFkZHcgJXcxLCAlMFxuIgkJXAotCQkJCSAgICAgIDogIittIiAoKihwdHIpKSA6ICJyaSIgKGluYykJXAotCQkJCSAgICAgIDogIm1lbW9yeSIsICJjYyIpOwkJXAotCQkJYnJlYWs7CQkJCQkJXAotCQljYXNlIF9fWDg2X0NBU0VfTDoJCQkJCVwKLQkJCWFzbSB2b2xhdGlsZSAobG9jayAiYWRkbCAlMSwgJTBcbiIJCVwKLQkJCQkgICAgICA6ICIrbSIgKCoocHRyKSkgOiAicmkiIChpbmMpCVwKLQkJCQkgICAgICA6ICJtZW1vcnkiLCAiY2MiKTsJCVwKLQkJCWJyZWFrOwkJCQkJCVwKLQkJY2FzZSBfX1g4Nl9DQVNFX1E6CQkJCQlcCi0JCQlhc20gdm9sYXRpbGUgKGxvY2sgImFkZHEgJTEsICUwXG4iCQlcCi0JCQkJICAgICAgOiAiK20iICgqKHB0cikpIDogInJpIiAoaW5jKQlcCi0JCQkJICAgICAgOiAibWVtb3J5IiwgImNjIik7CQlcCi0JCQlicmVhazsJCQkJCQlcCi0JCWRlZmF1bHQ6CQkJCQkJXAotCQkJX19hZGRfd3Jvbmdfc2l6ZSgpOwkJCQlcCi0JCX0JCQkJCQkJXAotCQlfX3JldDsJCQkJCQkJXAotCX0pCi0KLS8qCi0gKiBhZGRfKigpIGFkZHMgImluYyIgdG8gIipwdHIiCi0gKgotICogX19hZGQoKSB0YWtlcyBhIGxvY2sgcHJlZml4Ci0gKiBhZGRfc21wKCkgaXMgbG9ja2VkIHdoZW4gbXVsdGlwbGUgQ1BVcyBhcmUgb25saW5lCi0gKiBhZGRfc3luYygpIGlzIGFsd2F5cyBsb2NrZWQKLSAqLwotI2RlZmluZSBhZGRfc21wKHB0ciwgaW5jKQlfX2FkZCgocHRyKSwgKGluYyksIExPQ0tfUFJFRklYKQotI2RlZmluZSBhZGRfc3luYyhwdHIsIGluYykJX19hZGQoKHB0ciksIChpbmMpLCAibG9jazsgIikKIAogI2RlZmluZSBfX2NtcHhjaGdfZG91YmxlKHBmeCwgcDEsIHAyLCBvMSwgbzIsIG4xLCBuMikJCQlcCiAoewkJCQkJCQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NvbXBhdC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY29tcGF0LmgKaW5kZXggYTE4ODA2MS4uMDNkMjY5YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY29tcGF0LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY29tcGF0LmgKQEAgLTI3NSwxMCArMjc1LDEwIEBACiAjaWZkZWYgQ09ORklHX1g4Nl9YMzJfQUJJCiB0eXBlZGVmIHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0IGNvbXBhdF9lbGZfZ3JlZ3NldF90OwogCi0jZGVmaW5lIFBSX1JFR19TSVpFKFMpICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9JQTMyKSA/IDY4IDogMjE2KQotI2RlZmluZSBQUlNUQVRVU19TSVpFKFMpICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9JQTMyKSA/IDE0NCA6IDI5NikKLSNkZWZpbmUgU0VUX1BSX0ZQVkFMSUQoUyxWKSBcCi0gIGRvIHsgKihpbnQgKikgKCgodm9pZCAqKSAmKChTKS0+cHJfcmVnKSkgKyBQUl9SRUdfU0laRSgwKSkgPSAoVik7IH0gXAorLyogRnVsbCByZWdzZXQgLS0gcHJzdGF0dXMgb24geDMyLCBvdGhlcndpc2Ugb24gaWEzMiAqLworI2RlZmluZSBQUlNUQVRVU19TSVpFKFMsIFIpIChSICE9IHNpemVvZihTLnByX3JlZykgPyAxNDQgOiAyOTYpCisjZGVmaW5lIFNFVF9QUl9GUFZBTElEKFMsIFYsIFIpIFwKKyAgZG8geyAqKGludCAqKSAoKCh2b2lkICopICYoKFMpLT5wcl9yZWcpKSArIFIpID0gKFYpOyB9IFwKICAgd2hpbGUgKDApCiAKICNkZWZpbmUgQ09NUEFUX1VTRV82NEJJVF9USU1FIFwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmVzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlcy5oCmluZGV4IDkyYTgzMDguLjExODhiYzggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmVzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZXMuaApAQCAtMTA2LDcgKzEwNiw2IEBACiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0FQRVJGTVBFUkYJKCAzKjMyKzI4KSAvKiBBUEVSRk1QRVJGICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0VBR0VSX0ZQVQkoIDMqMzIrMjkpIC8qICJlYWdlcmZwdSIgTm9uIGxhenkgRlBVIHJlc3RvcmUgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfTk9OU1RPUF9UU0NfUzMgKCAzKjMyKzMwKSAvKiBUU0MgZG9lc24ndCBzdG9wIGluIFMzIHN0YXRlICovCi0jZGVmaW5lIFg4Nl9GRUFUVVJFX01DRV9SRUNPVkVSWSAoIDMqMzIrMzEpIC8qIGNwdSBoYXMgcmVjb3ZlcmFibGUgbWFjaGluZSBjaGVja3MgKi8KIAogLyogSW50ZWwtZGVmaW5lZCBDUFUgZmVhdHVyZXMsIENQVUlEIGxldmVsIDB4MDAwMDAwMDEgKGVjeCksIHdvcmQgNCAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9YTU0zCSggNCozMisgMCkgLyogInBuaSIgU1NFLTMgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2Rlc2MuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2Rlc2MuaAppbmRleCA0ZTEwZDczLi4xMjA4MGQ4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9kZXNjLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZGVzYy5oCkBAIC0zNiw3ICszNiw3IEBACiAKIGV4dGVybiBzdHJ1Y3QgZGVzY19wdHIgaWR0X2Rlc2NyOwogZXh0ZXJuIGdhdGVfZGVzYyBpZHRfdGFibGVbXTsKLWV4dGVybiBzdHJ1Y3QgZGVzY19wdHIgZGVidWdfaWR0X2Rlc2NyOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBkZXNjX3B0ciBkZWJ1Z19pZHRfZGVzY3I7CiBleHRlcm4gZ2F0ZV9kZXNjIGRlYnVnX2lkdF90YWJsZVtdOwogCiBzdHJ1Y3QgZ2R0X3BhZ2UgewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZTgyMC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZTgyMC5oCmluZGV4IDNhYjA1MzcuLjQ3NmI1NzQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2U4MjAuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lODIwLmgKQEAgLTEwLDggKzEwLDggQEAKICNpbmNsdWRlIDx1YXBpL2FzbS9lODIwLmg+CiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogLyogc2VlIGNvbW1lbnQgaW4gYXJjaC94ODYva2VybmVsL2U4MjAuYyAqLwotZXh0ZXJuIHN0cnVjdCBlODIwbWFwIGU4MjA7Ci1leHRlcm4gc3RydWN0IGU4MjBtYXAgZTgyMF9zYXZlZDsKK2V4dGVybiBzdHJ1Y3QgZTgyMG1hcCAqZTgyMDsKK2V4dGVybiBzdHJ1Y3QgZTgyMG1hcCAqZTgyMF9zYXZlZDsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGNpX21lbV9zdGFydDsKIGV4dGVybiBpbnQgZTgyMF9hbnlfbWFwcGVkKHU2NCBzdGFydCwgdTY0IGVuZCwgdW5zaWduZWQgdHlwZSk7CkBAIC01Myw2ICs1Myw4IEBACiBleHRlcm4gdm9pZCBzZXR1cF9tZW1vcnlfbWFwKHZvaWQpOwogZXh0ZXJuIGNoYXIgKmRlZmF1bHRfbWFjaGluZV9zcGVjaWZpY19tZW1vcnlfc2V0dXAodm9pZCk7CiAKK2V4dGVybiB2b2lkIGU4MjBfcmVhbGxvY2F0ZV90YWJsZXModm9pZCk7CisKIC8qCiAgKiBSZXR1cm5zIHRydWUgaWZmIHRoZSBzcGVjaWZpZWQgcmFuZ2UgW3MsZSkgaXMgY29tcGxldGVseSBjb250YWluZWQgaW5zaWRlCiAgKiB0aGUgSVNBIHJlZ2lvbi4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2VmaS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZWZpLmgKaW5kZXggZDBiYjc2ZC4uMzg5ZDcwMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZWZpLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZWZpLmgKQEAgLTExNyw3ICsxMTcsNiBAQAogZXh0ZXJuIHBnZF90ICogX19pbml0IGVmaV9jYWxsX3BoeXNfcHJvbG9nKHZvaWQpOwogZXh0ZXJuIHZvaWQgX19pbml0IGVmaV9jYWxsX3BoeXNfZXBpbG9nKHBnZF90ICpzYXZlX3BnZCk7CiBleHRlcm4gdm9pZCBfX2luaXQgZWZpX3ByaW50X21lbW1hcCh2b2lkKTsKLWV4dGVybiB2b2lkIF9faW5pdCBlZmlfdW5tYXBfbWVtbWFwKHZvaWQpOwogZXh0ZXJuIHZvaWQgX19pbml0IGVmaV9tZW1vcnlfdWModTY0IGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiBleHRlcm4gdm9pZCBfX2luaXQgZWZpX21hcF9yZWdpb24oZWZpX21lbW9yeV9kZXNjX3QgKm1kKTsKIGV4dGVybiB2b2lkIF9faW5pdCBlZmlfbWFwX3JlZ2lvbl9maXhlZChlZmlfbWVtb3J5X2Rlc2NfdCAqbWQpOwpAQCAtMTkyLDE0ICsxOTEsNyBAQAogc3RydWN0IGVmaV9jb25maWcgewogCXU2NCBpbWFnZV9oYW5kbGU7CiAJdTY0IHRhYmxlOwotCXU2NCBhbGxvY2F0ZV9wb29sOwotCXU2NCBhbGxvY2F0ZV9wYWdlczsKLQl1NjQgZ2V0X21lbW9yeV9tYXA7Ci0JdTY0IGZyZWVfcG9vbDsKLQl1NjQgZnJlZV9wYWdlczsKLQl1NjQgbG9jYXRlX2hhbmRsZTsKLQl1NjQgaGFuZGxlX3Byb3RvY29sOwotCXU2NCBleGl0X2Jvb3Rfc2VydmljZXM7CisJdTY0IGJvb3Rfc2VydmljZXM7CiAJdTY0IHRleHRfb3V0cHV0OwogCWVmaV9zdGF0dXNfdCAoKmNhbGwpKHVuc2lnbmVkIGxvbmcsIC4uLik7CiAJYm9vbCBpczY0OwpAQCAtMjA3LDE0ICsxOTksMjcgQEAKIAogX19wdXJlIGNvbnN0IHN0cnVjdCBlZmlfY29uZmlnICpfX2VmaV9lYXJseSh2b2lkKTsKIAorc3RhdGljIGlubGluZSBib29sIGVmaV9pc182NGJpdCh2b2lkKQoreworCWlmICghSVNfRU5BQkxFRChDT05GSUdfWDg2XzY0KSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKCFJU19FTkFCTEVEKENPTkZJR19FRklfTUlYRUQpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBfX2VmaV9lYXJseSgpLT5pczY0OworfQorCiAjZGVmaW5lIGVmaV9jYWxsX2Vhcmx5KGYsIC4uLikJCQkJCQlcCi0JX19lZmlfZWFybHkoKS0+Y2FsbChfX2VmaV9lYXJseSgpLT5mLCBfX1ZBX0FSR1NfXyk7CisJX19lZmlfZWFybHkoKS0+Y2FsbChlZmlfaXNfNjRiaXQoKSA/CQkJCVwKKwkJKChlZmlfYm9vdF9zZXJ2aWNlc182NF90ICopKHVuc2lnbmVkIGxvbmcpCQlcCisJCQlfX2VmaV9lYXJseSgpLT5ib290X3NlcnZpY2VzKS0+ZiA6CQlcCisJCSgoZWZpX2Jvb3Rfc2VydmljZXNfMzJfdCAqKSh1bnNpZ25lZCBsb25nKQkJXAorCQkJX19lZmlfZWFybHkoKS0+Ym9vdF9zZXJ2aWNlcyktPmYsIF9fVkFfQVJHU19fKQogCiAjZGVmaW5lIF9fZWZpX2NhbGxfZWFybHkoZiwgLi4uKQkJCQkJXAogCV9fZWZpX2Vhcmx5KCktPmNhbGwoKHVuc2lnbmVkIGxvbmcpZiwgX19WQV9BUkdTX18pOwogCi0jZGVmaW5lIGVmaV9pc182NGJpdCgpCQlfX2VmaV9lYXJseSgpLT5pczY0Ci0KIGV4dGVybiBib29sIGVmaV9yZWJvb3RfcmVxdWlyZWQodm9pZCk7CiAKICNlbHNlCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9mcHUvc2lnbmFsLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9mcHUvc2lnbmFsLmgKaW5kZXggMGU5NzBkMC4uMjBhMWZiZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZnB1L3NpZ25hbC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ZwdS9zaWduYWwuaApAQCAtMTksNiArMTksMTIgQEAKICMgZGVmaW5lIGlhMzJfc2V0dXBfcnRfZnJhbWUJX19zZXR1cF9ydF9mcmFtZQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitpbnQgX19jb3B5X3NpZ2luZm9fdG9fdXNlcjMyKGNvbXBhdF9zaWdpbmZvX3QgX191c2VyICp0bywKKwkJY29uc3Qgc2lnaW5mb190ICpmcm9tLCBib29sIHgzMl9BQkkpOworI2VuZGlmCisKKwogZXh0ZXJuIHZvaWQgY29udmVydF9mcm9tX2Z4c3Ioc3RydWN0IHVzZXJfaTM4N19pYTMyX3N0cnVjdCAqZW52LAogCQkJICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOwogZXh0ZXJuIHZvaWQgY29udmVydF90b19meHNyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZnB1L3hzdGF0ZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZnB1L3hzdGF0ZS5oCmluZGV4IGFlNTVhNDMuLmQ0OTU3YWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ZwdS94c3RhdGUuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9mcHUveHN0YXRlLmgKQEAgLTQ1LDcgKzQ1LDggQEAKIGV4dGVybiB1NjQgeGZlYXR1cmVzX21hc2s7CiBleHRlcm4gdTY0IHhzdGF0ZV9meF9zd19ieXRlc1tVU0VSX1hTVEFURV9GWF9TV19XT1JEU107CiAKLWV4dGVybiB2b2lkIHVwZGF0ZV9yZWdzZXRfeHN0YXRlX2luZm8odW5zaWduZWQgaW50IHNpemUsIHU2NCB4c3RhdGVfbWFzayk7CitleHRlcm4gdm9pZCBfX2luaXQgdXBkYXRlX3JlZ3NldF94c3RhdGVfaW5mbyh1bnNpZ25lZCBpbnQgc2l6ZSwKKwkJCQkJICAgICB1NjQgeHN0YXRlX21hc2spOwogCiB2b2lkIGZwdV9feHN0YXRlX2NsZWFyX2FsbF9jcHVfY2Fwcyh2b2lkKTsKIHZvaWQgKmdldF94c2F2ZV9hZGRyKHN0cnVjdCB4cmVnc19zdGF0ZSAqeHNhdmUsIGludCB4c3RhdGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZnRyYWNlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9mdHJhY2UuaAppbmRleCBhNDgyMGQ0Li5lY2NkMGFjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9mdHJhY2UuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9mdHJhY2UuaApAQCAtNiw2ICs2LDcgQEAKICMgZGVmaW5lIE1DT1VOVF9BRERSCQkoKHVuc2lnbmVkIGxvbmcpKF9fZmVudHJ5X18pKQogI2Vsc2UKICMgZGVmaW5lIE1DT1VOVF9BRERSCQkoKHVuc2lnbmVkIGxvbmcpKG1jb3VudCkpCisjIGRlZmluZSBIQVZFX0ZVTkNUSU9OX0dSQVBIX0ZQX1RFU1QKICNlbmRpZgogI2RlZmluZSBNQ09VTlRfSU5TTl9TSVpFCTUgLyogc2l6ZW9mIG1jb3VudCBjYWxsICovCiAKQEAgLTEzLDYgKzE0LDggQEAKICNkZWZpbmUgQVJDSF9TVVBQT1JUU19GVFJBQ0VfT1BTIDEKICNlbmRpZgogCisjZGVmaW5lIEhBVkVfRlVOQ1RJT05fR1JBUEhfUkVUX0FERFJfUFRSCisKICNpZm5kZWYgX19BU1NFTUJMWV9fCiBleHRlcm4gdm9pZCBtY291bnQodm9pZCk7CiBleHRlcm4gYXRvbWljX3QgbW9kaWZ5aW5nX2Z0cmFjZV9jb2RlOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaHlwZXJ2aXNvci5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaHlwZXJ2aXNvci5oCmluZGV4IDA1NWVhOTkuLjY3OTQyYjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2h5cGVydmlzb3IuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9oeXBlcnZpc29yLmgKQEAgLTQzLDYgKzQzLDkgQEAKIAogCS8qIFgyQVBJQyBkZXRlY3Rpb24gKHJ1biBvbmNlIHBlciBib290KSAqLwogCWJvb2wJCSgqeDJhcGljX2F2YWlsYWJsZSkodm9pZCk7CisKKwkvKiBwaW4gY3VycmVudCB2Y3B1IHRvIHNwZWNpZmllZCBwaHlzaWNhbCBjcHUgKHJ1biByYXJlbHkpICovCisJdm9pZAkJKCpwaW5fdmNwdSkoaW50KTsKIH07CiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaHlwZXJ2aXNvcl94ODYgKng4Nl9oeXBlcjsKQEAgLTU2LDYgKzU5LDcgQEAKIGV4dGVybiB2b2lkIGluaXRfaHlwZXJ2aXNvcihzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOwogZXh0ZXJuIHZvaWQgaW5pdF9oeXBlcnZpc29yX3BsYXRmb3JtKHZvaWQpOwogZXh0ZXJuIGJvb2wgaHlwZXJ2aXNvcl94MmFwaWNfYXZhaWxhYmxlKHZvaWQpOworZXh0ZXJuIHZvaWQgaHlwZXJ2aXNvcl9waW5fdmNwdShpbnQgY3B1KTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9oeXBlcnZpc29yKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9oeXBlcnZpc29yX3BsYXRmb3JtKHZvaWQpIHsgfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaW50ZWwtZmFtaWx5LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbnRlbC1mYW1pbHkuaAppbmRleCA2Mjc3MTk0Li45YWU1YWI4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbnRlbC1mYW1pbHkuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbnRlbC1mYW1pbHkuaApAQCAtNTYsOCArNTYsOCBAQAogI2RlZmluZSBJTlRFTF9GQU02X0FUT01fU0lMVkVSTU9OVDEJMHgzNyAvKiBCYXlUcmFpbC9CWVQgLyBWYWxsZXl2aWV3ICovCiAjZGVmaW5lIElOVEVMX0ZBTTZfQVRPTV9TSUxWRVJNT05UMgkweDREIC8qIEF2YXRvbi9SYW5nZWx5ICovCiAjZGVmaW5lIElOVEVMX0ZBTTZfQVRPTV9BSVJNT05UCQkweDRDIC8qIENoZXJyeVRyYWlsIC8gQnJhc3dlbGwgKi8KLSNkZWZpbmUgSU5URUxfRkFNNl9BVE9NX01FUlJJRklFTEQxCTB4NEEgLyogVGFuZ2llciAqLwotI2RlZmluZSBJTlRFTF9GQU02X0FUT01fTUVSUklGSUVMRDIJMHg1QSAvKiBBbm5pZGFsZSAqLworI2RlZmluZSBJTlRFTF9GQU02X0FUT01fTUVSUklGSUVMRAkweDRBIC8qIFRhbmdpZXIgKi8KKyNkZWZpbmUgSU5URUxfRkFNNl9BVE9NX01PT1JFRklFTEQJMHg1QSAvKiBBbm5pZGFsZSAqLwogI2RlZmluZSBJTlRFTF9GQU02X0FUT01fR09MRE1PTlQJMHg1QwogI2RlZmluZSBJTlRFTF9GQU02X0FUT01fREVOVkVSVE9OCTB4NUYgLyogR29sZG1vbnQgTWljcm9zZXJ2ZXIgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaW50ZWwtbWlkLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbnRlbC1taWQuaAppbmRleCA5ZDZiMDk3Li41YjY3NTNkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbnRlbC1taWQuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbnRlbC1taWQuaApAQCAtMTgsNiArMTgsOCBAQAogZXh0ZXJuIGludCBpbnRlbF9taWRfcGNpX2luaXQodm9pZCk7CiBleHRlcm4gaW50IGludGVsX21pZF9wY2lfc2V0X3Bvd2VyX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwY2lfcG93ZXJfdCBzdGF0ZSk7CiAKK2V4dGVybiB2b2lkIGludGVsX21pZF9wd3JfcG93ZXJfb2ZmKHZvaWQpOworCiAjZGVmaW5lIElOVEVMX01JRF9QV1JfTFNTX09GRlNFVAk0CiAjZGVmaW5lIElOVEVMX01JRF9QV1JfTFNTX1RZUEUJCSgxIDw8IDcpCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ludGVsX3NjdV9pcGMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ludGVsX3NjdV9pcGMuaAppbmRleCA5MjViNjA1Li40ZmIxZDBhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbnRlbF9zY3VfaXBjLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaW50ZWxfc2N1X2lwYy5oCkBAIC0zLDYgKzMsOCBAQAogCiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KIAorI2RlZmluZSBJUENNU0dfQ09MRF9PRkYJCTB4ODAJLyogT25seSBmb3IgVGFuZ2llciAqLworCiAjZGVmaW5lIElQQ01TR19XQVJNX1JFU0VUCTB4RjAKICNkZWZpbmUgSVBDTVNHX0NPTERfUkVTRVQJMHhGMQogI2RlZmluZSBJUENNU0dfU09GVF9SRVNFVAkweEYyCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rYXNsci5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20va2FzbHIuaAppbmRleCAyNjc0ZWUzLi4xMDUyYTc5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rYXNsci5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2thc2xyLmgKQEAgLTYsNiArNiw3IEBACiAjaWZkZWYgQ09ORklHX1JBTkRPTUlaRV9NRU1PUlkKIGV4dGVybiB1bnNpZ25lZCBsb25nIHBhZ2Vfb2Zmc2V0X2Jhc2U7CiBleHRlcm4gdW5zaWduZWQgbG9uZyB2bWFsbG9jX2Jhc2U7CitleHRlcm4gdW5zaWduZWQgbG9uZyB2bWVtbWFwX2Jhc2U7CiAKIHZvaWQga2VybmVsX3JhbmRvbWl6ZV9tZW1vcnkodm9pZCk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20va2RlYnVnLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rZGVidWcuaAppbmRleCAxZWY5ZDU4Li5kMzE4ODExIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rZGVidWcuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rZGVidWcuaApAQCAtMjQsOCArMjQsNiBAQAogZXh0ZXJuIHZvaWQgcHJpbnRrX2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyZXNzKTsKIGV4dGVybiB2b2lkIGRpZShjb25zdCBjaGFyICosIHN0cnVjdCBwdF9yZWdzICosbG9uZyk7CiBleHRlcm4gaW50IF9fbXVzdF9jaGVjayBfX2RpZShjb25zdCBjaGFyICosIHN0cnVjdCBwdF9yZWdzICosIGxvbmcpOwotZXh0ZXJuIHZvaWQgc2hvd190cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyAqc3AsIHVuc2lnbmVkIGxvbmcgYnApOwogZXh0ZXJuIHZvaWQgc2hvd19zdGFja19yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIGV4dGVybiB2b2lkIF9fc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgYWxsKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIG9vcHNfYmVnaW4odm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1faG9zdC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtX2hvc3QuaAppbmRleCAzM2FlM2E0Li40YjIwZjczIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKQEAgLTU2OCw2ICs1NjgsNyBAQAogCQlzdHJ1Y3Qga3ZtX3N0ZWFsX3RpbWUgc3RlYWw7CiAJfSBzdDsKIAorCXU2NCB0c2Nfb2Zmc2V0OwogCXU2NCBsYXN0X2d1ZXN0X3RzYzsKIAl1NjQgbGFzdF9ob3N0X3RzYzsKIAl1NjQgdHNjX29mZnNldF9hZGp1c3RtZW50OwpAQCAtNzAxLDYgKzcwMiw4IEBACiAJLyogSHlwZXItdiBiYXNlZCBndWVzdCBjcmFzaCAoTlQga2VybmVsIGJ1Z2NoZWNrKSBwYXJhbWV0ZXJzICovCiAJdTY0IGh2X2NyYXNoX3BhcmFtW0hWX1g2NF9NU1JfQ1JBU0hfUEFSQU1TXTsKIAl1NjQgaHZfY3Jhc2hfY3RsOworCisJSFZfUkVGRVJFTkNFX1RTQ19QQUdFIHRzY19yZWY7CiB9OwogCiBzdHJ1Y3Qga3ZtX2FyY2ggewpAQCAtNzgxLDU0ICs3ODQsNTYgQEAKIAlib29sIGRpc2FibGVkX2xhcGljX2ZvdW5kOwogCiAJLyogU3RydWN0IG1lbWJlcnMgZm9yIEFWSUMgKi8KKwl1MzIgYXZpY192bV9pZDsKIAl1MzIgbGRyX21vZGU7CiAJc3RydWN0IHBhZ2UgKmF2aWNfbG9naWNhbF9pZF90YWJsZV9wYWdlOwogCXN0cnVjdCBwYWdlICphdmljX3BoeXNpY2FsX2lkX3RhYmxlX3BhZ2U7CisJc3RydWN0IGhsaXN0X25vZGUgaG5vZGU7CiAKIAlib29sIHgyYXBpY19mb3JtYXQ7CiAJYm9vbCB4MmFwaWNfYnJvYWRjYXN0X3F1aXJrX2Rpc2FibGVkOwogfTsKIAogc3RydWN0IGt2bV92bV9zdGF0IHsKLQl1MzIgbW11X3NoYWRvd196YXBwZWQ7Ci0JdTMyIG1tdV9wdGVfd3JpdGU7Ci0JdTMyIG1tdV9wdGVfdXBkYXRlZDsKLQl1MzIgbW11X3BkZV96YXBwZWQ7Ci0JdTMyIG1tdV9mbG9vZGVkOwotCXUzMiBtbXVfcmVjeWNsZWQ7Ci0JdTMyIG1tdV9jYWNoZV9taXNzOwotCXUzMiBtbXVfdW5zeW5jOwotCXUzMiByZW1vdGVfdGxiX2ZsdXNoOwotCXUzMiBscGFnZXM7CisJdWxvbmcgbW11X3NoYWRvd196YXBwZWQ7CisJdWxvbmcgbW11X3B0ZV93cml0ZTsKKwl1bG9uZyBtbXVfcHRlX3VwZGF0ZWQ7CisJdWxvbmcgbW11X3BkZV96YXBwZWQ7CisJdWxvbmcgbW11X2Zsb29kZWQ7CisJdWxvbmcgbW11X3JlY3ljbGVkOworCXVsb25nIG1tdV9jYWNoZV9taXNzOworCXVsb25nIG1tdV91bnN5bmM7CisJdWxvbmcgcmVtb3RlX3RsYl9mbHVzaDsKKwl1bG9uZyBscGFnZXM7CiB9OwogCiBzdHJ1Y3Qga3ZtX3ZjcHVfc3RhdCB7Ci0JdTMyIHBmX2ZpeGVkOwotCXUzMiBwZl9ndWVzdDsKLQl1MzIgdGxiX2ZsdXNoOwotCXUzMiBpbnZscGc7CisJdTY0IHBmX2ZpeGVkOworCXU2NCBwZl9ndWVzdDsKKwl1NjQgdGxiX2ZsdXNoOworCXU2NCBpbnZscGc7CiAKLQl1MzIgZXhpdHM7Ci0JdTMyIGlvX2V4aXRzOwotCXUzMiBtbWlvX2V4aXRzOwotCXUzMiBzaWduYWxfZXhpdHM7Ci0JdTMyIGlycV93aW5kb3dfZXhpdHM7Ci0JdTMyIG5taV93aW5kb3dfZXhpdHM7Ci0JdTMyIGhhbHRfZXhpdHM7Ci0JdTMyIGhhbHRfc3VjY2Vzc2Z1bF9wb2xsOwotCXUzMiBoYWx0X2F0dGVtcHRlZF9wb2xsOwotCXUzMiBoYWx0X3BvbGxfaW52YWxpZDsKLQl1MzIgaGFsdF93YWtldXA7Ci0JdTMyIHJlcXVlc3RfaXJxX2V4aXRzOwotCXUzMiBpcnFfZXhpdHM7Ci0JdTMyIGhvc3Rfc3RhdGVfcmVsb2FkOwotCXUzMiBlZmVyX3JlbG9hZDsKLQl1MzIgZnB1X3JlbG9hZDsKLQl1MzIgaW5zbl9lbXVsYXRpb247Ci0JdTMyIGluc25fZW11bGF0aW9uX2ZhaWw7Ci0JdTMyIGh5cGVyY2FsbHM7Ci0JdTMyIGlycV9pbmplY3Rpb25zOwotCXUzMiBubWlfaW5qZWN0aW9uczsKKwl1NjQgZXhpdHM7CisJdTY0IGlvX2V4aXRzOworCXU2NCBtbWlvX2V4aXRzOworCXU2NCBzaWduYWxfZXhpdHM7CisJdTY0IGlycV93aW5kb3dfZXhpdHM7CisJdTY0IG5taV93aW5kb3dfZXhpdHM7CisJdTY0IGhhbHRfZXhpdHM7CisJdTY0IGhhbHRfc3VjY2Vzc2Z1bF9wb2xsOworCXU2NCBoYWx0X2F0dGVtcHRlZF9wb2xsOworCXU2NCBoYWx0X3BvbGxfaW52YWxpZDsKKwl1NjQgaGFsdF93YWtldXA7CisJdTY0IHJlcXVlc3RfaXJxX2V4aXRzOworCXU2NCBpcnFfZXhpdHM7CisJdTY0IGhvc3Rfc3RhdGVfcmVsb2FkOworCXU2NCBlZmVyX3JlbG9hZDsKKwl1NjQgZnB1X3JlbG9hZDsKKwl1NjQgaW5zbl9lbXVsYXRpb247CisJdTY0IGluc25fZW11bGF0aW9uX2ZhaWw7CisJdTY0IGh5cGVyY2FsbHM7CisJdTY0IGlycV9pbmplY3Rpb25zOworCXU2NCBubWlfaW5qZWN0aW9uczsKIH07CiAKIHN0cnVjdCB4ODZfaW5zdHJ1Y3Rpb25faW5mbzsKQEAgLTk1MSw3ICs5NTYsNiBAQAogCiAJYm9vbCAoKmhhc193YmludmRfZXhpdCkodm9pZCk7CiAKLQl1NjQgKCpyZWFkX3RzY19vZmZzZXQpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAJdm9pZCAoKndyaXRlX3RzY19vZmZzZXQpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IG9mZnNldCk7CiAKIAl1NjQgKCpyZWFkX2wxX3RzYykoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgaG9zdF90c2MpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbWNlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tY2UuaAppbmRleCA4YmY3NjZlLi45YmQ3ZmY1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tY2UuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tY2UuaApAQCAtNDAsOSArNDAsMTAgQEAKICNkZWZpbmUgTUNJX1NUQVRVU19BUgkgKDFVTEw8PDU1KSAgLyogQWN0aW9uIHJlcXVpcmVkICovCiAKIC8qIEFNRC1zcGVjaWZpYyBiaXRzICovCisjZGVmaW5lIE1DSV9TVEFUVVNfVENDCQkoMVVMTDw8NTUpICAvKiBUYXNrIGNvbnRleHQgY29ycnVwdCAqLworI2RlZmluZSBNQ0lfU1RBVFVTX1NZTkRWCSgxVUxMPDw1MykgIC8qIHN5bmQgcmVnLiB2YWxpZCAqLwogI2RlZmluZSBNQ0lfU1RBVFVTX0RFRkVSUkVECSgxVUxMPDw0NCkgIC8qIHVuY29ycmVjdGVkIGVycm9yLCBkZWZlcnJlZCBleGNlcHRpb24gKi8KICNkZWZpbmUgTUNJX1NUQVRVU19QT0lTT04JKDFVTEw8PDQzKSAgLyogYWNjZXNzIHBvaXNvbm91cyBkYXRhICovCi0jZGVmaW5lIE1DSV9TVEFUVVNfVENDCQkoMVVMTDw8NTUpICAvKiBUYXNrIGNvbnRleHQgY29ycnVwdCAqLwogCiAvKgogICogTWNhWCBmaWVsZCBpZiBzZXQgaW5kaWNhdGVzIGEgZ2l2ZW4gYmFuayBzdXBwb3J0cyBNQ0EgZXh0ZW5zaW9uczoKQEAgLTExMCw2ICsxMTEsNyBAQAogI2RlZmluZSBNU1JfQU1ENjRfU01DQV9NQzBfTUlTQzAJMHhjMDAwMjAwMwogI2RlZmluZSBNU1JfQU1ENjRfU01DQV9NQzBfQ09ORklHCTB4YzAwMDIwMDQKICNkZWZpbmUgTVNSX0FNRDY0X1NNQ0FfTUMwX0lQSUQJCTB4YzAwMDIwMDUKKyNkZWZpbmUgTVNSX0FNRDY0X1NNQ0FfTUMwX1NZTkQJCTB4YzAwMDIwMDYKICNkZWZpbmUgTVNSX0FNRDY0X1NNQ0FfTUMwX0RFU1RBVAkweGMwMDAyMDA4CiAjZGVmaW5lIE1TUl9BTUQ2NF9TTUNBX01DMF9ERUFERFIJMHhjMDAwMjAwOQogI2RlZmluZSBNU1JfQU1ENjRfU01DQV9NQzBfTUlTQzEJMHhjMDAwMjAwYQpAQCAtMTE5LDYgKzEyMSw3IEBACiAjZGVmaW5lIE1TUl9BTUQ2NF9TTUNBX01DeF9NSVNDKHgpCShNU1JfQU1ENjRfU01DQV9NQzBfTUlTQzAgKyAweDEwKih4KSkKICNkZWZpbmUgTVNSX0FNRDY0X1NNQ0FfTUN4X0NPTkZJRyh4KQkoTVNSX0FNRDY0X1NNQ0FfTUMwX0NPTkZJRyArIDB4MTAqKHgpKQogI2RlZmluZSBNU1JfQU1ENjRfU01DQV9NQ3hfSVBJRCh4KQkoTVNSX0FNRDY0X1NNQ0FfTUMwX0lQSUQgKyAweDEwKih4KSkKKyNkZWZpbmUgTVNSX0FNRDY0X1NNQ0FfTUN4X1NZTkQoeCkJKE1TUl9BTUQ2NF9TTUNBX01DMF9TWU5EICsgMHgxMCooeCkpCiAjZGVmaW5lIE1TUl9BTUQ2NF9TTUNBX01DeF9ERVNUQVQoeCkJKE1TUl9BTUQ2NF9TTUNBX01DMF9ERVNUQVQgKyAweDEwKih4KSkKICNkZWZpbmUgTVNSX0FNRDY0X1NNQ0FfTUN4X0RFQUREUih4KQkoTVNSX0FNRDY0X1NNQ0FfTUMwX0RFQUREUiArIDB4MTAqKHgpKQogI2RlZmluZSBNU1JfQU1ENjRfU01DQV9NQ3hfTUlTQ3koeCwgeSkJKChNU1JfQU1ENjRfU01DQV9NQzBfTUlTQzEgKyB5KSArICgweDEwKih4KSkpCkBAIC0zMzQsNDQgKzMzNyw0NyBAQAogICogU2NhbGFibGUgTUNBLgogICovCiAjaWZkZWYgQ09ORklHX1g4Nl9NQ0VfQU1ECi1lbnVtIGFtZF9pcF90eXBlcyB7Ci0JU01DQV9GMTdIX0NPUkUgPSAwLAkvKiBDb3JlIGVycm9ycyAqLwotCVNNQ0FfREYsCQkvKiBEYXRhIEZhYnJpYyAqLwotCVNNQ0FfVU1DLAkJLyogVW5pZmllZCBNZW1vcnkgQ29udHJvbGxlciAqLwotCVNNQ0FfUEIsCQkvKiBQYXJhbWV0ZXIgQmxvY2sgKi8KLQlTTUNBX1BTUCwJCS8qIFBsYXRmb3JtIFNlY3VyaXR5IFByb2Nlc3NvciAqLwotCVNNQ0FfU01VLAkJLyogU3lzdGVtIE1hbmFnZW1lbnQgVW5pdCAqLwotCU5fQU1EX0lQX1RZUEVTCi19OwogCi1zdHJ1Y3QgYW1kX2h3aWQgewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JdW5zaWduZWQgaW50IGh3aWQ7Ci19OwotCi1leHRlcm4gc3RydWN0IGFtZF9od2lkIGFtZF9od2lkc1tOX0FNRF9JUF9UWVBFU107Ci0KLWVudW0gYW1kX2NvcmVfbWNhX2Jsb2NrcyB7CisvKiBUaGVzZSBtYXkgYmUgdXNlZCBieSBtdWx0aXBsZSBzbWNhX2h3aWRfbWNhdHlwZXMgKi8KK2VudW0gc21jYV9iYW5rX3R5cGVzIHsKIAlTTUNBX0xTID0gMCwJLyogTG9hZCBTdG9yZSAqLwogCVNNQ0FfSUYsCS8qIEluc3RydWN0aW9uIEZldGNoICovCi0JU01DQV9MMl9DQUNIRSwJLyogTDIgY2FjaGUgKi8KLQlTTUNBX0RFLAkvKiBEZWNvZGVyIHVuaXQgKi8KLQlSRVMsCQkvKiBSZXNlcnZlZCAqLwotCVNNQ0FfRVgsCS8qIEV4ZWN1dGlvbiB1bml0ICovCisJU01DQV9MMl9DQUNIRSwJLyogTDIgQ2FjaGUgKi8KKwlTTUNBX0RFLAkvKiBEZWNvZGVyIFVuaXQgKi8KKwlTTUNBX0VYLAkvKiBFeGVjdXRpb24gVW5pdCAqLwogCVNNQ0FfRlAsCS8qIEZsb2F0aW5nIFBvaW50ICovCi0JU01DQV9MM19DQUNIRSwJLyogTDMgY2FjaGUgKi8KLQlOX0NPUkVfTUNBX0JMT0NLUworCVNNQ0FfTDNfQ0FDSEUsCS8qIEwzIENhY2hlICovCisJU01DQV9DUywJLyogQ29oZXJlbnQgU2xhdmUgKi8KKwlTTUNBX1BJRSwJLyogUG93ZXIsIEludGVycnVwdHMsIGV0Yy4gKi8KKwlTTUNBX1VNQywJLyogVW5pZmllZCBNZW1vcnkgQ29udHJvbGxlciAqLworCVNNQ0FfUEIsCS8qIFBhcmFtZXRlciBCbG9jayAqLworCVNNQ0FfUFNQLAkvKiBQbGF0Zm9ybSBTZWN1cml0eSBQcm9jZXNzb3IgKi8KKwlTTUNBX1NNVSwJLyogU3lzdGVtIE1hbmFnZW1lbnQgVW5pdCAqLworCU5fU01DQV9CQU5LX1RZUEVTCiB9OwogCi1leHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IGFtZF9jb3JlX21jYWJsb2NrX25hbWVzW05fQ09SRV9NQ0FfQkxPQ0tTXTsKLQotZW51bSBhbWRfZGZfbWNhX2Jsb2NrcyB7Ci0JU01DQV9DUyA9IDAsCS8qIENvaGVyZW50IFNsYXZlICovCi0JU01DQV9QSUUsCS8qIFBvd2VyIG1hbmFnZW1lbnQsIEludGVycnVwdHMsIGV0YyAqLwotCU5fREZfQkxPQ0tTCitzdHJ1Y3Qgc21jYV9iYW5rX25hbWUgeworCWNvbnN0IGNoYXIgKm5hbWU7CS8qIFNob3J0IG5hbWUgZm9yIHN5c2ZzICovCisJY29uc3QgY2hhciAqbG9uZ19uYW1lOwkvKiBMb25nIG5hbWUgZm9yIHByZXR0eS1wcmludGluZyAqLwogfTsKIAotZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBhbWRfZGZfbWNhYmxvY2tfbmFtZXNbTl9ERl9CTE9DS1NdOworZXh0ZXJuIHN0cnVjdCBzbWNhX2JhbmtfbmFtZSBzbWNhX2JhbmtfbmFtZXNbTl9TTUNBX0JBTktfVFlQRVNdOworCisjZGVmaW5lIEhXSURfTUNBVFlQRShod2lkLCBtY2F0eXBlKSAoKGh3aWQgPDwgMTYpIHwgbWNhdHlwZSkKKworc3RydWN0IHNtY2FfaHdpZF9tY2F0eXBlIHsKKwl1bnNpZ25lZCBpbnQgYmFua190eXBlOwkvKiBVc2Ugd2l0aCBzbWNhX2JhbmtfdHlwZXMgZm9yIGVhc3kgaW5kZXhpbmcuICovCisJdTMyIGh3aWRfbWNhdHlwZTsJLyogKGh3aWQsbWNhdHlwZSkgdHVwbGUgKi8KKwl1MzIgeGVjX2JpdG1hcDsJCS8qIEJpdG1hcCBvZiB2YWxpZCBFeHRFcnJvckNvZGVzOyBjdXJyZW50IG1heCBpcyAyMS4gKi8KK307CisKK3N0cnVjdCBzbWNhX2JhbmtfaW5mbyB7CisJc3RydWN0IHNtY2FfaHdpZF9tY2F0eXBlICp0eXBlOworCXUzMiB0eXBlX2luc3RhbmNlOworfTsKKworZXh0ZXJuIHN0cnVjdCBzbWNhX2JhbmtfaW5mbyBzbWNhX2JhbmtzW01BWF9OUl9CQU5LU107CisKICNlbmRpZgogCiAjZW5kaWYgLyogX0FTTV9YODZfTUNFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21wc3BlYy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbXBzcGVjLmgKaW5kZXggYjA3MjMzYi4uMzIwMDcwNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbXBzcGVjLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbXBzcGVjLmgKQEAgLTYsNyArNiw2IEBACiAjaW5jbHVkZSA8YXNtL3g4Nl9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2FwaWNkZWYuaD4KIAotZXh0ZXJuIGludCBhcGljX3ZlcnNpb25bXTsKIGV4dGVybiBpbnQgcGljX21vZGU7CiAKICNpZmRlZiBDT05GSUdfWDg2XzMyCkBAIC00MCw2ICszOSw3IEBACiBleHRlcm4gREVDTEFSRV9CSVRNQVAobXBfYnVzX25vdF9wY2ksIE1BWF9NUF9CVVNTRVMpOwogCiBleHRlcm4gdW5zaWduZWQgaW50IGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZDsKK2V4dGVybiB1OCBib290X2NwdV9hcGljX3ZlcnNpb247CiBleHRlcm4gdW5zaWduZWQgbG9uZyBtcF9sYXBpY19hZGRyOwogCiAjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCkBAIC04Niw2ICs4Niw3IEBACiAjZW5kaWYKIAogaW50IGdlbmVyaWNfcHJvY2Vzc29yX2luZm8oaW50IGFwaWNpZCwgaW50IHZlcnNpb24pOworaW50IF9fZ2VuZXJpY19wcm9jZXNzb3JfaW5mbyhpbnQgYXBpY2lkLCBpbnQgdmVyc2lvbiwgYm9vbCBlbmFibGVkKTsKIAogI2RlZmluZSBQSFlTSURfQVJSQVlfU0laRQlCSVRTX1RPX0xPTkdTKE1BWF9MT0NBTF9BUElDKQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFyYXZpcnQuaAppbmRleCAyOTcwZDIyLi5jZTkzMjgxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhcmF2aXJ0LmgKQEAgLTgwLDEwICs4MCw2IEBACiB7CiAJcmV0dXJuIFBWT1BfQ0FMTDAodW5zaWduZWQgbG9uZywgcHZfY3B1X29wcy5yZWFkX2NyNCk7CiB9Ci1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19yZWFkX2NyNF9zYWZlKHZvaWQpCi17Ci0JcmV0dXJuIFBWT1BfQ0FMTDAodW5zaWduZWQgbG9uZywgcHZfY3B1X29wcy5yZWFkX2NyNF9zYWZlKTsKLX0KIAogc3RhdGljIGlubGluZSB2b2lkIF9fd3JpdGVfY3I0KHVuc2lnbmVkIGxvbmcgeCkKIHsKQEAgLTY2MSw4ICs2NTcsNiBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfU01QKSAmJiBkZWZpbmVkKENPTkZJR19QQVJBVklSVF9TUElOTE9DS1MpCiAKLSNpZmRlZiBDT05GSUdfUVVFVUVEX1NQSU5MT0NLUwotCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgcHZfcXVldWVkX3NwaW5fbG9ja19zbG93cGF0aChzdHJ1Y3QgcXNwaW5sb2NrICpsb2NrLAogCQkJCQkJCXUzMiB2YWwpCiB7CkBAIC02ODQsMjIgKzY3OCw2IEBACiAJUFZPUF9WQ0FMTDEocHZfbG9ja19vcHMua2ljaywgY3B1KTsKIH0KIAotI2Vsc2UgLyogIUNPTkZJR19RVUVVRURfU1BJTkxPQ0tTICovCi0KLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBfX3RpY2tldF9sb2NrX3NwaW5uaW5nKHN0cnVjdCBhcmNoX3NwaW5sb2NrICpsb2NrLAotCQkJCQkJCV9fdGlja2V0X3QgdGlja2V0KQotewotCVBWT1BfVkNBTExFRTIocHZfbG9ja19vcHMubG9ja19zcGlubmluZywgbG9jaywgdGlja2V0KTsKLX0KLQotc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIF9fdGlja2V0X3VubG9ja19raWNrKHN0cnVjdCBhcmNoX3NwaW5sb2NrICpsb2NrLAotCQkJCQkJCV9fdGlja2V0X3QgdGlja2V0KQotewotCVBWT1BfVkNBTEwyKHB2X2xvY2tfb3BzLnVubG9ja19raWNrLCBsb2NrLCB0aWNrZXQpOwotfQotCi0jZW5kaWYgLyogQ09ORklHX1FVRVVFRF9TUElOTE9DS1MgKi8KLQogI2VuZGlmIC8qIFNNUCAmJiBQQVJBVklSVF9TUElOTE9DS1MgKi8KIAogI2lmZGVmIENPTkZJR19YODZfMzIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhcmF2aXJ0X3R5cGVzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydF90eXBlcy5oCmluZGV4IDdmYTllNzcuLjBmNDAwYzAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhcmF2aXJ0X3R5cGVzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFyYXZpcnRfdHlwZXMuaApAQCAtMTA4LDcgKzEwOCw2IEBACiAJdW5zaWduZWQgbG9uZyAoKnJlYWRfY3IwKSh2b2lkKTsKIAl2b2lkICgqd3JpdGVfY3IwKSh1bnNpZ25lZCBsb25nKTsKIAotCXVuc2lnbmVkIGxvbmcgKCpyZWFkX2NyNF9zYWZlKSh2b2lkKTsKIAl1bnNpZ25lZCBsb25nICgqcmVhZF9jcjQpKHZvaWQpOwogCXZvaWQgKCp3cml0ZV9jcjQpKHVuc2lnbmVkIGxvbmcpOwogCkBAIC0zMDEsMjMgKzMwMCwxNiBAQAogc3RydWN0IGFyY2hfc3BpbmxvY2s7CiAjaWZkZWYgQ09ORklHX1NNUAogI2luY2x1ZGUgPGFzbS9zcGlubG9ja190eXBlcy5oPgotI2Vsc2UKLXR5cGVkZWYgdTE2IF9fdGlja2V0X3Q7CiAjZW5kaWYKIAogc3RydWN0IHFzcGlubG9jazsKIAogc3RydWN0IHB2X2xvY2tfb3BzIHsKLSNpZmRlZiBDT05GSUdfUVVFVUVEX1NQSU5MT0NLUwogCXZvaWQgKCpxdWV1ZWRfc3Bpbl9sb2NrX3Nsb3dwYXRoKShzdHJ1Y3QgcXNwaW5sb2NrICpsb2NrLCB1MzIgdmFsKTsKIAlzdHJ1Y3QgcGFyYXZpcnRfY2FsbGVlX3NhdmUgcXVldWVkX3NwaW5fdW5sb2NrOwogCiAJdm9pZCAoKndhaXQpKHU4ICpwdHIsIHU4IHZhbCk7CiAJdm9pZCAoKmtpY2spKGludCBjcHUpOwotI2Vsc2UgLyogIUNPTkZJR19RVUVVRURfU1BJTkxPQ0tTICovCi0Jc3RydWN0IHBhcmF2aXJ0X2NhbGxlZV9zYXZlIGxvY2tfc3Bpbm5pbmc7Ci0Jdm9pZCAoKnVubG9ja19raWNrKShzdHJ1Y3QgYXJjaF9zcGlubG9jayAqbG9jaywgX190aWNrZXRfdCB0aWNrZXQpOwotI2VuZGlmIC8qICFDT05GSUdfUVVFVUVEX1NQSU5MT0NLUyAqLwogfTsKIAogLyogVGhpcyBjb250YWlucyBhbGwgdGhlIHBhcmF2aXJ0IHN0cnVjdHVyZXM6IHdlIGdldCBhIGNvbnZlbmllbnQKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGVfNjRfdHlwZXMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGVfNjRfdHlwZXMuaAppbmRleCA2ZmRlZjllLi4zYTI2NDIwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlXzY0X3R5cGVzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZV82NF90eXBlcy5oCkBAIC01NywxMSArNTcsMTMgQEAKICNkZWZpbmUgTUFYTUVNCQlfQUMoX19BQygxLCBVTCkgPDwgTUFYX1BIWVNNRU1fQklUUywgVUwpCiAjZGVmaW5lIFZNQUxMT0NfU0laRV9UQglfQUMoMzIsIFVMKQogI2RlZmluZSBfX1ZNQUxMT0NfQkFTRQlfQUMoMHhmZmZmYzkwMDAwMDAwMDAwLCBVTCkKLSNkZWZpbmUgVk1FTU1BUF9TVEFSVAlfQUMoMHhmZmZmZWEwMDAwMDAwMDAwLCBVTCkKKyNkZWZpbmUgX19WTUVNTUFQX0JBU0UJX0FDKDB4ZmZmZmVhMDAwMDAwMDAwMCwgVUwpCiAjaWZkZWYgQ09ORklHX1JBTkRPTUlaRV9NRU1PUlkKICNkZWZpbmUgVk1BTExPQ19TVEFSVAl2bWFsbG9jX2Jhc2UKKyNkZWZpbmUgVk1FTU1BUF9TVEFSVAl2bWVtbWFwX2Jhc2UKICNlbHNlCiAjZGVmaW5lIFZNQUxMT0NfU1RBUlQJX19WTUFMTE9DX0JBU0UKKyNkZWZpbmUgVk1FTU1BUF9TVEFSVAlfX1ZNRU1NQVBfQkFTRQogI2VuZGlmIC8qIENPTkZJR19SQU5ET01JWkVfTUVNT1JZICovCiAjZGVmaW5lIFZNQUxMT0NfRU5ECShWTUFMTE9DX1NUQVJUICsgX0FDKChWTUFMTE9DX1NJWkVfVEIgPDwgNDApIC0gMSwgVUwpKQogI2RlZmluZSBNT0RVTEVTX1ZBRERSICAgIChfX1NUQVJUX0tFUk5FTF9tYXAgKyBLRVJORUxfSU1BR0VfU0laRSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BtZW0uaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BtZW0uaAppbmRleCA2NDNlYmE0Li4yYzFlYmViIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wbWVtLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcG1lbS5oCkBAIC00NiwxMCArNDYsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCBhcmNoX21lbWNweV9mcm9tX3BtZW0odm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKQogewotCWlmIChzdGF0aWNfY3B1X2hhcyhYODZfRkVBVFVSRV9NQ0VfUkVDT1ZFUlkpKQotCQlyZXR1cm4gbWVtY3B5X21jc2FmZShkc3QsIHNyYywgbik7Ci0JbWVtY3B5KGRzdCwgc3JjLCBuKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gbWVtY3B5X21jc2FmZShkc3QsIHNyYywgbik7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCA2M2RlZjk1Li45ODRhN2JmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtMzg5LDkgKzM4OSw5IEBACiAJdW5zaWduZWQgc2hvcnQJCWZzaW5kZXg7CiAJdW5zaWduZWQgc2hvcnQJCWdzaW5kZXg7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfWDg2XzMyCi0JdW5zaWduZWQgbG9uZwkJaXA7Ci0jZW5kaWYKKworCXUzMgkJCXN0YXR1czsJCS8qIHRocmVhZCBzeW5jaHJvbm91cyBmbGFncyAqLworCiAjaWZkZWYgQ09ORklHX1g4Nl82NAogCXVuc2lnbmVkIGxvbmcJCWZzYmFzZTsKIAl1bnNpZ25lZCBsb25nCQlnc2Jhc2U7CkBAIC00MzgsNiArNDM4LDE1IEBACiB9OwogCiAvKgorICogVGhyZWFkLXN5bmNocm9ub3VzIHN0YXR1cy4KKyAqCisgKiBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBmbGFncyBpbiB0aGF0IG5vYm9keSBlbHNlCisgKiBldmVyIHRvdWNoZXMgb3VyIHRocmVhZC1zeW5jaHJvbm91cyBzdGF0dXMsIHNvIHdlIGRvbid0CisgKiBoYXZlIHRvIHdvcnJ5IGFib3V0IGF0b21pYyBhY2Nlc3Nlcy4KKyAqLworI2RlZmluZSBUU19DT01QQVQJCTB4MDAwMgkvKiAzMmJpdCBzeXNjYWxsIGFjdGl2ZSAoNjRCSVQpKi8KKworLyoKICAqIFNldCBJT1BMIGJpdHMgaW4gRUZMQUdTIGZyb20gZ2l2ZW4gbWFzawogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgbmF0aXZlX3NldF9pb3BsX21hc2sodW5zaWduZWQgbWFzaykKQEAgLTcyNCw4ICs3MzMsNiBAQAogCS5hZGRyX2xpbWl0CQk9IEtFUk5FTF9EUywJCQkJICBcCiB9CiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIHRocmVhZF9zYXZlZF9wYyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7Ci0KIC8qCiAgKiBUT1BfT0ZfS0VSTkVMX1NUQUNLX1BBRERJTkcgcmVzZXJ2ZXMgOCBieXRlcyBvbiB0b3Agb2YgdGhlIHJpbmcwIHN0YWNrLgogICogVGhpcyBpcyBuZWNlc3NhcnkgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIGVudGlyZSAic3RydWN0IHB0X3JlZ3MiCkBAIC03NzYsMTcgKzc4MywxMyBAQAogCS5hZGRyX2xpbWl0CQk9IEtFUk5FTF9EUywJCQlcCiB9CiAKLS8qCi0gKiBSZXR1cm4gc2F2ZWQgUEMgb2YgYSBibG9ja2VkIHRocmVhZC4KLSAqIFdoYXQgaXMgdGhpcyBnb29kIGZvcj8gaXQgd2lsbCBiZSBhbHdheXMgdGhlIHNjaGVkdWxlciBvciByZXRfZnJvbV9mb3JrLgotICovCi0jZGVmaW5lIHRocmVhZF9zYXZlZF9wYyh0KQlSRUFEX09OQ0VfTk9DSEVDSygqKHVuc2lnbmVkIGxvbmcgKikoKHQpLT50aHJlYWQuc3AgLSA4KSkKLQogI2RlZmluZSB0YXNrX3B0X3JlZ3ModHNrKQkoKHN0cnVjdCBwdF9yZWdzICopKHRzayktPnRocmVhZC5zcDAgLSAxKQogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgS1NUS19FU1Aoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKIAogI2VuZGlmIC8qIENPTkZJR19YODZfNjQgKi8KIAorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdGhyZWFkX3NhdmVkX3BjKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKKwogZXh0ZXJuIHZvaWQgc3RhcnRfdGhyZWFkKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIG5ld19pcCwKIAkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbmV3X3NwKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcHZjbG9jay5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcHZjbG9jay5oCmluZGV4IGQwMTlmMGMuLjNhZDc0MWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3B2Y2xvY2suaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wdmNsb2NrLmgKQEAgLTg3LDkgKzg3LDEwIEBACiB9CiAKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUKLWN5Y2xlX3QgX19wdmNsb2NrX3JlYWRfY3ljbGVzKGNvbnN0IHN0cnVjdCBwdmNsb2NrX3ZjcHVfdGltZV9pbmZvICpzcmMpCitjeWNsZV90IF9fcHZjbG9ja19yZWFkX2N5Y2xlcyhjb25zdCBzdHJ1Y3QgcHZjbG9ja192Y3B1X3RpbWVfaW5mbyAqc3JjLAorCQkJICAgICAgdTY0IHRzYykKIHsKLQl1NjQgZGVsdGEgPSByZHRzY19vcmRlcmVkKCkgLSBzcmMtPnRzY190aW1lc3RhbXA7CisJdTY0IGRlbHRhID0gdHNjIC0gc3JjLT50c2NfdGltZXN0YW1wOwogCWN5Y2xlX3Qgb2Zmc2V0ID0gcHZjbG9ja19zY2FsZV9kZWx0YShkZWx0YSwgc3JjLT50c2NfdG9fc3lzdGVtX211bCwKIAkJCQkJICAgICBzcmMtPnRzY19zaGlmdCk7CiAJcmV0dXJuIHNyYy0+c3lzdGVtX3RpbWUgKyBvZmZzZXQ7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9yZWFsbW9kZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcmVhbG1vZGUuaAppbmRleCBiMjk4OGMwLi4yMzBlMTkwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9yZWFsbW9kZS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3JlYWxtb2RlLmgKQEAgLTQ0LDkgKzQ0LDkgQEAKIGV4dGVybiBzdHJ1Y3QgcmVhbF9tb2RlX2hlYWRlciAqcmVhbF9tb2RlX2hlYWRlcjsKIGV4dGVybiB1bnNpZ25lZCBjaGFyIHJlYWxfbW9kZV9ibG9iX2VuZFtdOwogCi1leHRlcm4gdW5zaWduZWQgbG9uZyBpbml0X3JzcDsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGluaXRpYWxfY29kZTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGluaXRpYWxfZ3M7CitleHRlcm4gdW5zaWduZWQgbG9uZyBpbml0aWFsX3N0YWNrOwogCiBleHRlcm4gdW5zaWduZWQgY2hhciByZWFsX21vZGVfYmxvYltdOwogZXh0ZXJuIHVuc2lnbmVkIGNoYXIgcmVhbF9tb2RlX3JlbG9jc1tdOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcndzZW0uaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3J3c2VtLmgKaW5kZXggOGRiYzc2Mi4uM2QzM2E3MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcndzZW0uaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9yd3NlbS5oCkBAIC0xNTQsNyArMTU0LDcgQEAKIAkJICAgICA6ICIrbSIgKHNlbS0+Y291bnQpLCAiPSZhIiAodG1wMCksICI9JnIiICh0bXAxKSwKIAkJICAgICAgIENDX09VVChlKSAocmVzdWx0KQogCQkgICAgIDogImVyIiAoUldTRU1fQUNUSVZFX1dSSVRFX0JJQVMpCi0JCSAgICAgOiAibWVtb3J5IiwgImNjIik7CisJCSAgICAgOiAibWVtb3J5Iik7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc2lnbmFsLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zaWduYWwuaAppbmRleCBkZDFlN2Q2Li44YWYyMmJlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zaWduYWwuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zaWduYWwuaApAQCAtMjMsNiArMjMsMTAgQEAKIAl1bnNpZ25lZCBsb25nIHNpZ1tfTlNJR19XT1JEU107CiB9IHNpZ3NldF90OwogCisvKiBub24tdWFwaSBpbi1rZXJuZWwgU0FfRkxBR1MgZm9yIHRob3NlIGluZGljYXRlcyBBQkkgZm9yIGEgc2lnbmFsIGZyYW1lICovCisjZGVmaW5lIFNBX0lBMzJfQUJJCTB4MDIwMDAwMDB1CisjZGVmaW5lIFNBX1gzMl9BQkkJMHgwMTAwMDAwMHUKKwogI2lmbmRlZiBDT05GSUdfQ09NUEFUCiB0eXBlZGVmIHNpZ3NldF90IGNvbXBhdF9zaWdzZXRfdDsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc21wLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zbXAuaAppbmRleCBlYmQwYzE2Li4xOTk4MGIzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zbXAuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zbXAuaApAQCAtMzksOSArMzksNiBAQAogREVDTEFSRV9FQVJMWV9QRVJfQ1BVX1JFQURfTU9TVExZKGludCwgeDg2X2NwdV90b19sb2dpY2FsX2FwaWNpZCk7CiAjZW5kaWYKIAotLyogU3RhdGljIHN0YXRlIGluIGhlYWQuUyB1c2VkIHRvIHNldCB1cCBhIENQVSAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc3RhY2tfc3RhcnQ7IC8qIEluaXRpYWwgc3RhY2sgcG9pbnRlciBhZGRyZXNzICovCi0KIHN0cnVjdCB0YXNrX3N0cnVjdDsKIAogc3RydWN0IHNtcF9vcHMgewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BlY2lhbF9pbnNucy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BlY2lhbF9pbnNucy5oCmluZGV4IDU4N2Q3OTEuLjE5YTIyMjQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwZWNpYWxfaW5zbnMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGVjaWFsX2luc25zLmgKQEAgLTU5LDIyICs1OSwxOSBAQAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG5hdGl2ZV9yZWFkX2NyNCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgdmFsOwotCWFzbSB2b2xhdGlsZSgibW92ICUlY3I0LCUwXG5cdCIgOiAiPXIiICh2YWwpLCAiPW0iIChfX2ZvcmNlX29yZGVyKSk7Ci0JcmV0dXJuIHZhbDsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG5hdGl2ZV9yZWFkX2NyNF9zYWZlKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JLyogVGhpcyBjb3VsZCBmYXVsdCBpZiAlY3I0IGRvZXMgbm90IGV4aXN0LiBJbiB4ODZfNjQsIGEgY3I0IGFsd2F5cwotCSAqIGV4aXN0cywgc28gaXQgd2lsbCBuZXZlciBmYWlsLiAqLwogI2lmZGVmIENPTkZJR19YODZfMzIKKwkvKgorCSAqIFRoaXMgY291bGQgZmF1bHQgaWYgQ1I0IGRvZXMgbm90IGV4aXN0LiAgTm9uLWV4aXN0ZW50IENSNAorCSAqIGlzIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIENSNCA9PSAwLiAgS2VlcCBpdCBzaW1wbGUgYW5kIHByZXRlbmQKKwkgKiB0aGF0IENSNCA9PSAwIG9uIENQVXMgdGhhdCBkb24ndCBoYXZlIENSNC4KKwkgKi8KIAlhc20gdm9sYXRpbGUoIjE6IG1vdiAlJWNyNCwgJTBcbiIKIAkJICAgICAiMjpcbiIKIAkJICAgICBfQVNNX0VYVEFCTEUoMWIsIDJiKQogCQkgICAgIDogIj1yIiAodmFsKSwgIj1tIiAoX19mb3JjZV9vcmRlcikgOiAiMCIgKDApKTsKICNlbHNlCi0JdmFsID0gbmF0aXZlX3JlYWRfY3I0KCk7CisJLyogQ1I0IGFsd2F5cyBleGlzdHMgb24geDg2XzY0LiAqLworCWFzbSB2b2xhdGlsZSgibW92ICUlY3I0LCUwXG5cdCIgOiAiPXIiICh2YWwpLCAiPW0iIChfX2ZvcmNlX29yZGVyKSk7CiAjZW5kaWYKIAlyZXR1cm4gdmFsOwogfQpAQCAtMTgyLDExICsxNzksNiBAQAogCXJldHVybiBuYXRpdmVfcmVhZF9jcjQoKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fcmVhZF9jcjRfc2FmZSh2b2lkKQotewotCXJldHVybiBuYXRpdmVfcmVhZF9jcjRfc2FmZSgpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgX193cml0ZV9jcjQodW5zaWduZWQgbG9uZyB4KQogewogCW5hdGl2ZV93cml0ZV9jcjQoeCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGlubG9jay5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BpbmxvY2suaAppbmRleCBiZTBhMDU5Li45MjFiZWE3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGlubG9jay5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKQEAgLTIwLDE4NyArMjAsMTMgQEAKICAqICh0aGUgdHlwZSBkZWZpbml0aW9ucyBhcmUgaW4gYXNtL3NwaW5sb2NrX3R5cGVzLmgpCiAgKi8KIAotI2lmZGVmIENPTkZJR19YODZfMzIKLSMgZGVmaW5lIExPQ0tfUFRSX1JFRyAiYSIKLSNlbHNlCi0jIGRlZmluZSBMT0NLX1BUUl9SRUcgIkQiCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX1g4Nl8zMikgJiYgKGRlZmluZWQoQ09ORklHX1g4Nl9QUFJPX0ZFTkNFKSkKLS8qCi0gKiBPbiBQUHJvIFNNUCwgd2UgdXNlIGEgbG9ja2VkIG9wZXJhdGlvbiB0byB1bmxvY2sKLSAqIChQUHJvIGVycmF0YSA2NiwgOTIpCi0gKi8KLSMgZGVmaW5lIFVOTE9DS19MT0NLX1BSRUZJWCBMT0NLX1BSRUZJWAotI2Vsc2UKLSMgZGVmaW5lIFVOTE9DS19MT0NLX1BSRUZJWAotI2VuZGlmCi0KIC8qIEhvdyBsb25nIGEgbG9jayBzaG91bGQgc3BpbiBiZWZvcmUgd2UgY29uc2lkZXIgYmxvY2tpbmcgKi8KICNkZWZpbmUgU1BJTl9USFJFU0hPTEQJKDEgPDwgMTUpCiAKIGV4dGVybiBzdHJ1Y3Qgc3RhdGljX2tleSBwYXJhdmlydF90aWNrZXRsb2Nrc19lbmFibGVkOwogc3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIHN0YXRpY19rZXlfZmFsc2Uoc3RydWN0IHN0YXRpY19rZXkgKmtleSk7CiAKLSNpZmRlZiBDT05GSUdfUVVFVUVEX1NQSU5MT0NLUwogI2luY2x1ZGUgPGFzbS9xc3BpbmxvY2suaD4KLSNlbHNlCi0KLSNpZmRlZiBDT05GSUdfUEFSQVZJUlRfU1BJTkxPQ0tTCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3RpY2tldF9lbnRlcl9zbG93cGF0aChhcmNoX3NwaW5sb2NrX3QgKmxvY2spCi17Ci0Jc2V0X2JpdCgwLCAodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSZsb2NrLT50aWNrZXRzLmhlYWQpOwotfQotCi0jZWxzZSAgLyogIUNPTkZJR19QQVJBVklSVF9TUElOTE9DS1MgKi8KLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBfX3RpY2tldF9sb2NrX3NwaW5uaW5nKGFyY2hfc3BpbmxvY2tfdCAqbG9jaywKLQkJCQkJCQlfX3RpY2tldF90IHRpY2tldCkKLXsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3RpY2tldF91bmxvY2tfa2ljayhhcmNoX3NwaW5sb2NrX3QgKmxvY2ssCi0JCQkJCQkJX190aWNrZXRfdCB0aWNrZXQpCi17Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfUEFSQVZJUlRfU1BJTkxPQ0tTICovCi1zdGF0aWMgaW5saW5lIGludCAgX190aWNrZXRzX2VxdWFsKF9fdGlja2V0X3Qgb25lLCBfX3RpY2tldF90IHR3bykKLXsKLQlyZXR1cm4gISgob25lIF4gdHdvKSAmIH5USUNLRVRfU0xPV1BBVEhfRkxBRyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3RpY2tldF9jaGVja19hbmRfY2xlYXJfc2xvd3BhdGgoYXJjaF9zcGlubG9ja190ICpsb2NrLAotCQkJCQkJCV9fdGlja2V0X3QgaGVhZCkKLXsKLQlpZiAoaGVhZCAmIFRJQ0tFVF9TTE9XUEFUSF9GTEFHKSB7Ci0JCWFyY2hfc3BpbmxvY2tfdCBvbGQsIG5ldzsKLQotCQlvbGQudGlja2V0cy5oZWFkID0gaGVhZDsKLQkJbmV3LnRpY2tldHMuaGVhZCA9IGhlYWQgJiB+VElDS0VUX1NMT1dQQVRIX0ZMQUc7Ci0JCW9sZC50aWNrZXRzLnRhaWwgPSBuZXcudGlja2V0cy5oZWFkICsgVElDS0VUX0xPQ0tfSU5DOwotCQluZXcudGlja2V0cy50YWlsID0gb2xkLnRpY2tldHMudGFpbDsKLQotCQkvKiB0cnkgdG8gY2xlYXIgc2xvd3BhdGggZmxhZyB3aGVuIHRoZXJlIGFyZSBubyBjb250ZW5kZXJzICovCi0JCWNtcHhjaGcoJmxvY2stPmhlYWRfdGFpbCwgb2xkLmhlYWRfdGFpbCwgbmV3LmhlYWRfdGFpbCk7Ci0JfQotfQotCi1zdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBhcmNoX3NwaW5fdmFsdWVfdW5sb2NrZWQoYXJjaF9zcGlubG9ja190IGxvY2spCi17Ci0JcmV0dXJuIF9fdGlja2V0c19lcXVhbChsb2NrLnRpY2tldHMuaGVhZCwgbG9jay50aWNrZXRzLnRhaWwpOwotfQotCi0vKgotICogVGlja2V0IGxvY2tzIGFyZSBjb25jZXB0dWFsbHkgdHdvIHBhcnRzLCBvbmUgaW5kaWNhdGluZyB0aGUgY3VycmVudCBoZWFkIG9mCi0gKiB0aGUgcXVldWUsIGFuZCB0aGUgb3RoZXIgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0YWlsLiBUaGUgbG9jayBpcyBhY3F1aXJlZAotICogYnkgYXRvbWljYWxseSBub3RpbmcgdGhlIHRhaWwgYW5kIGluY3JlbWVudGluZyBpdCBieSBvbmUgKHRodXMgYWRkaW5nCi0gKiBvdXJzZWxmIHRvIHRoZSBxdWV1ZSBhbmQgbm90aW5nIG91ciBwb3NpdGlvbiksIHRoZW4gd2FpdGluZyB1bnRpbCB0aGUgaGVhZAotICogYmVjb21lcyBlcXVhbCB0byB0aGUgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHRhaWwuCi0gKgotICogV2UgdXNlIGFuIHhhZGQgY292ZXJpbmcgKmJvdGgqIHBhcnRzIG9mIHRoZSBsb2NrLCB0byBpbmNyZW1lbnQgdGhlIHRhaWwgYW5kCi0gKiBhbHNvIGxvYWQgdGhlIHBvc2l0aW9uIG9mIHRoZSBoZWFkLCB3aGljaCB0YWtlcyBjYXJlIG9mIG1lbW9yeSBvcmRlcmluZwotICogaXNzdWVzIGFuZCBzaG91bGQgYmUgb3B0aW1hbCBmb3IgdGhlIHVuY29udGVuZGVkIGNhc2UuIE5vdGUgdGhlIHRhaWwgbXVzdCBiZQotICogaW4gdGhlIGhpZ2ggcGFydCwgYmVjYXVzZSBhIHdpZGUgeGFkZCBpbmNyZW1lbnQgb2YgdGhlIGxvdyBwYXJ0IHdvdWxkIGNhcnJ5Ci0gKiB1cCBhbmQgY29udGFtaW5hdGUgdGhlIGhpZ2ggcGFydC4KLSAqLwotc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIGFyY2hfc3Bpbl9sb2NrKGFyY2hfc3BpbmxvY2tfdCAqbG9jaykKLXsKLQlyZWdpc3RlciBzdHJ1Y3QgX19yYXdfdGlja2V0cyBpbmMgPSB7IC50YWlsID0gVElDS0VUX0xPQ0tfSU5DIH07Ci0KLQlpbmMgPSB4YWRkKCZsb2NrLT50aWNrZXRzLCBpbmMpOwotCWlmIChsaWtlbHkoaW5jLmhlYWQgPT0gaW5jLnRhaWwpKQotCQlnb3RvIG91dDsKLQotCWZvciAoOzspIHsKLQkJdW5zaWduZWQgY291bnQgPSBTUElOX1RIUkVTSE9MRDsKLQotCQlkbyB7Ci0JCQlpbmMuaGVhZCA9IFJFQURfT05DRShsb2NrLT50aWNrZXRzLmhlYWQpOwotCQkJaWYgKF9fdGlja2V0c19lcXVhbChpbmMuaGVhZCwgaW5jLnRhaWwpKQotCQkJCWdvdG8gY2xlYXJfc2xvd3BhdGg7Ci0JCQljcHVfcmVsYXgoKTsKLQkJfSB3aGlsZSAoLS1jb3VudCk7Ci0JCV9fdGlja2V0X2xvY2tfc3Bpbm5pbmcobG9jaywgaW5jLnRhaWwpOwotCX0KLWNsZWFyX3Nsb3dwYXRoOgotCV9fdGlja2V0X2NoZWNrX2FuZF9jbGVhcl9zbG93cGF0aChsb2NrLCBpbmMuaGVhZCk7Ci1vdXQ6Ci0JYmFycmllcigpOwkvKiBtYWtlIHN1cmUgbm90aGluZyBjcmVlcHMgYmVmb3JlIHRoZSBsb2NrIGlzIHRha2VuICovCi19Ci0KLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IGFyY2hfc3Bpbl90cnlsb2NrKGFyY2hfc3BpbmxvY2tfdCAqbG9jaykKLXsKLQlhcmNoX3NwaW5sb2NrX3Qgb2xkLCBuZXc7Ci0KLQlvbGQudGlja2V0cyA9IFJFQURfT05DRShsb2NrLT50aWNrZXRzKTsKLQlpZiAoIV9fdGlja2V0c19lcXVhbChvbGQudGlja2V0cy5oZWFkLCBvbGQudGlja2V0cy50YWlsKSkKLQkJcmV0dXJuIDA7Ci0KLQluZXcuaGVhZF90YWlsID0gb2xkLmhlYWRfdGFpbCArIChUSUNLRVRfTE9DS19JTkMgPDwgVElDS0VUX1NISUZUKTsKLQluZXcuaGVhZF90YWlsICY9IH5USUNLRVRfU0xPV1BBVEhfRkxBRzsKLQotCS8qIGNtcHhjaGcgaXMgYSBmdWxsIGJhcnJpZXIsIHNvIG5vdGhpbmcgY2FuIG1vdmUgYmVmb3JlIGl0ICovCi0JcmV0dXJuIGNtcHhjaGcoJmxvY2stPmhlYWRfdGFpbCwgb2xkLmhlYWRfdGFpbCwgbmV3LmhlYWRfdGFpbCkgPT0gb2xkLmhlYWRfdGFpbDsKLX0KLQotc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIGFyY2hfc3Bpbl91bmxvY2soYXJjaF9zcGlubG9ja190ICpsb2NrKQotewotCWlmIChUSUNLRVRfU0xPV1BBVEhfRkxBRyAmJgotCQlzdGF0aWNfa2V5X2ZhbHNlKCZwYXJhdmlydF90aWNrZXRsb2Nrc19lbmFibGVkKSkgewotCQlfX3RpY2tldF90IGhlYWQ7Ci0KLQkJQlVJTERfQlVHX09OKCgoX190aWNrZXRfdClOUl9DUFVTKSAhPSBOUl9DUFVTKTsKLQotCQloZWFkID0geGFkZCgmbG9jay0+dGlja2V0cy5oZWFkLCBUSUNLRVRfTE9DS19JTkMpOwotCi0JCWlmICh1bmxpa2VseShoZWFkICYgVElDS0VUX1NMT1dQQVRIX0ZMQUcpKSB7Ci0JCQloZWFkICY9IH5USUNLRVRfU0xPV1BBVEhfRkxBRzsKLQkJCV9fdGlja2V0X3VubG9ja19raWNrKGxvY2ssIChoZWFkICsgVElDS0VUX0xPQ0tfSU5DKSk7Ci0JCX0KLQl9IGVsc2UKLQkJX19hZGQoJmxvY2stPnRpY2tldHMuaGVhZCwgVElDS0VUX0xPQ0tfSU5DLCBVTkxPQ0tfTE9DS19QUkVGSVgpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBhcmNoX3NwaW5faXNfbG9ja2VkKGFyY2hfc3BpbmxvY2tfdCAqbG9jaykKLXsKLQlzdHJ1Y3QgX19yYXdfdGlja2V0cyB0bXAgPSBSRUFEX09OQ0UobG9jay0+dGlja2V0cyk7Ci0KLQlyZXR1cm4gIV9fdGlja2V0c19lcXVhbCh0bXAudGFpbCwgdG1wLmhlYWQpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBhcmNoX3NwaW5faXNfY29udGVuZGVkKGFyY2hfc3BpbmxvY2tfdCAqbG9jaykKLXsKLQlzdHJ1Y3QgX19yYXdfdGlja2V0cyB0bXAgPSBSRUFEX09OQ0UobG9jay0+dGlja2V0cyk7Ci0KLQl0bXAuaGVhZCAmPSB+VElDS0VUX1NMT1dQQVRIX0ZMQUc7Ci0JcmV0dXJuIChfX3RpY2tldF90KSh0bXAudGFpbCAtIHRtcC5oZWFkKSA+IFRJQ0tFVF9MT0NLX0lOQzsKLX0KLSNkZWZpbmUgYXJjaF9zcGluX2lzX2NvbnRlbmRlZAlhcmNoX3NwaW5faXNfY29udGVuZGVkCi0KLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBhcmNoX3NwaW5fbG9ja19mbGFncyhhcmNoX3NwaW5sb2NrX3QgKmxvY2ssCi0JCQkJCQkgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0JYXJjaF9zcGluX2xvY2sobG9jayk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX3NwaW5fdW5sb2NrX3dhaXQoYXJjaF9zcGlubG9ja190ICpsb2NrKQotewotCV9fdGlja2V0X3QgaGVhZCA9IFJFQURfT05DRShsb2NrLT50aWNrZXRzLmhlYWQpOwotCi0JZm9yICg7OykgewotCQlzdHJ1Y3QgX19yYXdfdGlja2V0cyB0bXAgPSBSRUFEX09OQ0UobG9jay0+dGlja2V0cyk7Ci0JCS8qCi0JCSAqIFdlIG5lZWQgdG8gY2hlY2sgInVubG9ja2VkIiBpbiBhIGxvb3AsIHRtcC5oZWFkID09IGhlYWQKLQkJICogY2FuIGJlIGZhbHNlIHBvc2l0aXZlIGJlY2F1c2Ugb2Ygb3ZlcmZsb3cuCi0JCSAqLwotCQlpZiAoX190aWNrZXRzX2VxdWFsKHRtcC5oZWFkLCB0bXAudGFpbCkgfHwKLQkJCQkhX190aWNrZXRzX2VxdWFsKHRtcC5oZWFkLCBoZWFkKSkKLQkJCWJyZWFrOwotCi0JCWNwdV9yZWxheCgpOwotCX0KLX0KLSNlbmRpZiAvKiBDT05GSUdfUVVFVUVEX1NQSU5MT0NLUyAqLwogCiAvKgogICogUmVhZC13cml0ZSBzcGlubG9ja3MsIGFsbG93aW5nIG11bHRpcGxlIHJlYWRlcnMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwaW5sb2NrX3R5cGVzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGlubG9ja190eXBlcy5oCmluZGV4IDY1YzNlMzcuLjI1MzExZWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwaW5sb2NrX3R5cGVzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BpbmxvY2tfdHlwZXMuaApAQCAtMjMsMjAgKzIzLDcgQEAKIAogI2RlZmluZSBUSUNLRVRfU0hJRlQJKHNpemVvZihfX3RpY2tldF90KSAqIDgpCiAKLSNpZmRlZiBDT05GSUdfUVVFVUVEX1NQSU5MT0NLUwogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3FzcGlubG9ja190eXBlcy5oPgotI2Vsc2UKLXR5cGVkZWYgc3RydWN0IGFyY2hfc3BpbmxvY2sgewotCXVuaW9uIHsKLQkJX190aWNrZXRwYWlyX3QgaGVhZF90YWlsOwotCQlzdHJ1Y3QgX19yYXdfdGlja2V0cyB7Ci0JCQlfX3RpY2tldF90IGhlYWQsIHRhaWw7Ci0JCX0gdGlja2V0czsKLQl9OwotfSBhcmNoX3NwaW5sb2NrX3Q7Ci0KLSNkZWZpbmUgX19BUkNIX1NQSU5fTE9DS19VTkxPQ0tFRAl7IHsgMCB9IH0KLSNlbmRpZiAvKiBDT05GSUdfUVVFVUVEX1NQSU5MT0NLUyAqLwogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcXJ3bG9ja190eXBlcy5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zdGFja3RyYWNlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zdGFja3RyYWNlLmgKaW5kZXggMDk0NDIxOC4uMzdmMmUwYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3RhY2t0cmFjZS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N0YWNrdHJhY2UuaApAQCAtOCw4NiArOCw4NiBAQAogCiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS9zd2l0Y2hfdG8uaD4KKworZW51bSBzdGFja190eXBlIHsKKwlTVEFDS19UWVBFX1VOS05PV04sCisJU1RBQ0tfVFlQRV9UQVNLLAorCVNUQUNLX1RZUEVfSVJRLAorCVNUQUNLX1RZUEVfU09GVElSUSwKKwlTVEFDS19UWVBFX0VYQ0VQVElPTiwKKwlTVEFDS19UWVBFX0VYQ0VQVElPTl9MQVNUID0gU1RBQ0tfVFlQRV9FWENFUFRJT04gKyBOX0VYQ0VQVElPTl9TVEFDS1MtMSwKK307CisKK3N0cnVjdCBzdGFja19pbmZvIHsKKwllbnVtIHN0YWNrX3R5cGUgdHlwZTsKKwl1bnNpZ25lZCBsb25nICpiZWdpbiwgKmVuZCwgKm5leHRfc3A7Cit9OworCitib29sIGluX3Rhc2tfc3RhY2sodW5zaWduZWQgbG9uZyAqc3RhY2ssIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJICAgc3RydWN0IHN0YWNrX2luZm8gKmluZm8pOworCitpbnQgZ2V0X3N0YWNrX2luZm8odW5zaWduZWQgbG9uZyAqc3RhY2ssIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJICAgc3RydWN0IHN0YWNrX2luZm8gKmluZm8sIHVuc2lnbmVkIGxvbmcgKnZpc2l0X21hc2spOworCit2b2lkIHN0YWNrX3R5cGVfc3RyKGVudW0gc3RhY2tfdHlwZSB0eXBlLCBjb25zdCBjaGFyICoqYmVnaW4sCisJCSAgICBjb25zdCBjaGFyICoqZW5kKTsKKworc3RhdGljIGlubGluZSBib29sIG9uX3N0YWNrKHN0cnVjdCBzdGFja19pbmZvICppbmZvLCB2b2lkICphZGRyLCBzaXplX3QgbGVuKQoreworCXZvaWQgKmJlZ2luID0gaW5mby0+YmVnaW47CisJdm9pZCAqZW5kICAgPSBpbmZvLT5lbmQ7CisKKwlyZXR1cm4gKGluZm8tPnR5cGUgIT0gU1RBQ0tfVFlQRV9VTktOT1dOICYmCisJCWFkZHIgPj0gYmVnaW4gJiYgYWRkciA8IGVuZCAmJgorCQlhZGRyICsgbGVuID4gYmVnaW4gJiYgYWRkciArIGxlbiA8PSBlbmQpOworfQogCiBleHRlcm4gaW50IGtzdGFja19kZXB0aF90b19wcmludDsKIAotc3RydWN0IHRocmVhZF9pbmZvOwotc3RydWN0IHN0YWNrdHJhY2Vfb3BzOwotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgKCp3YWxrX3N0YWNrX3QpKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nICpzdGFjaywKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGJwLAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBzdGFja3RyYWNlX29wcyAqb3BzLAotCQkJCSAgICAgIHZvaWQgKmRhdGEsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyAqZW5kLAotCQkJCSAgICAgIGludCAqZ3JhcGgpOwotCi1leHRlcm4gdW5zaWduZWQgbG9uZwotcHJpbnRfY29udGV4dF9zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCi0JCSAgICB1bnNpZ25lZCBsb25nICpzdGFjaywgdW5zaWduZWQgbG9uZyBicCwKLQkJICAgIGNvbnN0IHN0cnVjdCBzdGFja3RyYWNlX29wcyAqb3BzLCB2b2lkICpkYXRhLAotCQkgICAgdW5zaWduZWQgbG9uZyAqZW5kLCBpbnQgKmdyYXBoKTsKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcKLXByaW50X2NvbnRleHRfc3RhY2tfYnAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyAqc3RhY2ssIHVuc2lnbmVkIGxvbmcgYnAsCi0JCSAgICAgICBjb25zdCBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgKm9wcywgdm9pZCAqZGF0YSwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmVuZCwgaW50ICpncmFwaCk7Ci0KLS8qIEdlbmVyaWMgc3RhY2sgdHJhY2VyIHdpdGggY2FsbGJhY2tzICovCi0KLXN0cnVjdCBzdGFja3RyYWNlX29wcyB7Ci0JaW50ICgqYWRkcmVzcykodm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgcmVsaWFibGUpOwotCS8qIE9uIG5lZ2F0aXZlIHJldHVybiBzdG9wIGR1bXBpbmcgKi8KLQlpbnQgKCpzdGFjaykodm9pZCAqZGF0YSwgY2hhciAqbmFtZSk7Ci0Jd2Fsa19zdGFja190CXdhbGtfc3RhY2s7Ci19OwotCi12b2lkIGR1bXBfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQl1bnNpZ25lZCBsb25nICpzdGFjaywgdW5zaWduZWQgbG9uZyBicCwKLQkJY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzICpvcHMsIHZvaWQgKmRhdGEpOwotCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgogI2RlZmluZSBTVEFDS1NMT1RTX1BFUl9MSU5FIDgKLSNkZWZpbmUgZ2V0X2JwKGJwKSBhc20oIm1vdmwgJSVlYnAsICUwIiA6ICI9ciIgKGJwKSA6KQogI2Vsc2UKICNkZWZpbmUgU1RBQ0tTTE9UU19QRVJfTElORSA0Ci0jZGVmaW5lIGdldF9icChicCkgYXNtKCJtb3ZxICUlcmJwLCAlMCIgOiAiPXIiIChicCkgOikKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0ZSQU1FX1BPSU5URVIKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotc3RhY2tfZnJhbWUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyAqCitnZXRfZnJhbWVfcG9pbnRlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXVuc2lnbmVkIGxvbmcgYnA7Ci0KIAlpZiAocmVncykKLQkJcmV0dXJuIHJlZ3MtPmJwOworCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5icDsKIAotCWlmICh0YXNrID09IGN1cnJlbnQpIHsKLQkJLyogR3JhYiBicCByaWdodCBmcm9tIG91ciByZWdzICovCi0JCWdldF9icChicCk7Ci0JCXJldHVybiBicDsKLQl9CisJaWYgKHRhc2sgPT0gY3VycmVudCkKKwkJcmV0dXJuIF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOwogCi0JLyogYnAgaXMgdGhlIGxhc3QgcmVnIHB1c2hlZCBieSBzd2l0Y2hfdG8gKi8KLQlyZXR1cm4gKih1bnNpZ25lZCBsb25nICopdGFzay0+dGhyZWFkLnNwOworCXJldHVybiAodW5zaWduZWQgbG9uZyAqKSgoc3RydWN0IGluYWN0aXZlX3Rhc2tfZnJhbWUgKil0YXNrLT50aHJlYWQuc3ApLT5icDsKIH0KICNlbHNlCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLXN0YWNrX2ZyYW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgKgorZ2V0X2ZyYW1lX3BvaW50ZXIoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gTlVMTDsKIH0KLSNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19GUkFNRV9QT0lOVEVSICovCiAKLWV4dGVybiB2b2lkCi1zaG93X3RyYWNlX2xvZ19sdmwoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJICAgdW5zaWduZWQgbG9uZyAqc3RhY2ssIHVuc2lnbmVkIGxvbmcgYnAsIGNoYXIgKmxvZ19sdmwpOworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nICoKK2dldF9zdGFja19wb2ludGVyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaWYgKHJlZ3MpCisJCXJldHVybiAodW5zaWduZWQgbG9uZyAqKWtlcm5lbF9zdGFja19wb2ludGVyKHJlZ3MpOwogCi1leHRlcm4gdm9pZAotc2hvd19zdGFja19sb2dfbHZsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCSAgIHVuc2lnbmVkIGxvbmcgKnNwLCB1bnNpZ25lZCBsb25nIGJwLCBjaGFyICpsb2dfbHZsKTsKKwlpZiAodGFzayA9PSBjdXJyZW50KQorCQlyZXR1cm4gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk7CisKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcgKil0YXNrLT50aHJlYWQuc3A7Cit9CisKK3ZvaWQgc2hvd190cmFjZV9sb2dfbHZsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQl1bnNpZ25lZCBsb25nICpzdGFjaywgY2hhciAqbG9nX2x2bCk7CisKK3ZvaWQgc2hvd19zdGFja19sb2dfbHZsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQl1bnNpZ25lZCBsb25nICpzcCwgY2hhciAqbG9nX2x2bCk7CiAKIGV4dGVybiB1bnNpZ25lZCBpbnQgY29kZV9ieXRlczsKIApAQCAtMTA2LDcgKzEwNiw3IEBACiB7CiAJc3RydWN0IHN0YWNrX2ZyYW1lICpmcmFtZTsKIAotCWdldF9icChmcmFtZSk7CisJZnJhbWUgPSBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsKIAogI2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCiAJZnJhbWUgPSBmcmFtZS0+bmV4dF9mcmFtZTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N0cmluZ182NC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3RyaW5nXzY0LmgKaW5kZXggOTBkYmJkOS4uYTE2NDg2MiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3RyaW5nXzY0LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3RyaW5nXzY0LmgKQEAgLTIsNiArMiw3IEBACiAjZGVmaW5lIF9BU01fWDg2X1NUUklOR182NF9ICiAKICNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvanVtcF9sYWJlbC5oPgogCiAvKiBXcml0dGVuIDIwMDIgYnkgQW5kaSBLbGVlbiAqLwogCkBAIC03OCw2ICs3OSw5IEBACiAjZGVmaW5lIG1lbXNldChzLCBjLCBuKSBfX21lbXNldChzLCBjLCBuKQogI2VuZGlmCiAKK19fbXVzdF9jaGVjayBpbnQgbWVtY3B5X21jc2FmZV91bnJvbGxlZCh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGNudCk7CitERUNMQVJFX1NUQVRJQ19LRVlfRkFMU0UobWNzYWZlX2tleSk7CisKIC8qKgogICogbWVtY3B5X21jc2FmZSAtIGNvcHkgbWVtb3J5IHdpdGggaW5kaWNhdGlvbiBpZiBhIG1hY2hpbmUgY2hlY2sgaGFwcGVuZWQKICAqCkBAIC04NiwxMCArOTAsMjMgQEAKICAqIEBjbnQ6CW51bWJlciBvZiBieXRlcyB0byBjb3B5CiAgKgogICogTG93IGxldmVsIG1lbW9yeSBjb3B5IGZ1bmN0aW9uIHRoYXQgY2F0Y2hlcyBtYWNoaW5lIGNoZWNrcworICogV2Ugb25seSBjYWxsIGludG8gdGhlICJzYWZlIiBmdW5jdGlvbiBvbiBzeXN0ZW1zIHRoYXQgY2FuCisgKiBhY3R1YWxseSBkbyBtYWNoaW5lIGNoZWNrIHJlY292ZXJ5LiBFdmVyeW9uZSBlbHNlIGNhbiBqdXN0CisgKiB1c2UgbWVtY3B5KCkuCiAgKgogICogUmV0dXJuIDAgZm9yIHN1Y2Nlc3MsIC1FRkFVTFQgZm9yIGZhaWwKICAqLwotaW50IG1lbWNweV9tY3NhZmUodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBjbnQpOworc3RhdGljIF9fYWx3YXlzX2lubGluZSBfX211c3RfY2hlY2sgaW50CittZW1jcHlfbWNzYWZlKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgY250KQoreworI2lmZGVmIENPTkZJR19YODZfTUNFCisJaWYgKHN0YXRpY19icmFuY2hfdW5saWtlbHkoJm1jc2FmZV9rZXkpKQorCQlyZXR1cm4gbWVtY3B5X21jc2FmZV91bnJvbGxlZChkc3QsIHNyYywgY250KTsKKwllbHNlCisjZW5kaWYKKwkJbWVtY3B5KGRzdCwgc3JjLCBjbnQpOworCXJldHVybiAwOworfQogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zd2l0Y2hfdG8uaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N3aXRjaF90by5oCmluZGV4IDhmMzIxYTEuLjVjYjQzNmEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N3aXRjaF90by5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N3aXRjaF90by5oCkBAIC0yLDEzMCArMiw2NiBAQAogI2RlZmluZSBfQVNNX1g4Nl9TV0lUQ0hfVE9fSAogCiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7IC8qIG9uZSBvZiB0aGUgc3RyYW5nZXIgYXNwZWN0cyBvZiBDIGZvcndhcmQgZGVjbGFyYXRpb25zICovCisKK3N0cnVjdCB0YXNrX3N0cnVjdCAqX19zd2l0Y2hfdG9fYXNtKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwKKwkJCQkgICAgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0KTsKKwogX192aXNpYmxlIHN0cnVjdCB0YXNrX3N0cnVjdCAqX19zd2l0Y2hfdG8oc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2LAotCQkJCQkgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQpOworCQkJCQkgIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCk7CiBzdHJ1Y3QgdHNzX3N0cnVjdDsKIHZvaWQgX19zd2l0Y2hfdG9feHRyYShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXZfcCwgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0X3AsCiAJCSAgICAgIHN0cnVjdCB0c3Nfc3RydWN0ICp0c3MpOwogCi0jaWZkZWYgQ09ORklHX1g4Nl8zMgorLyogVGhpcyBydW5zIHJ1bnMgb24gdGhlIHByZXZpb3VzIHRocmVhZCdzIHN0YWNrLiAqLworc3RhdGljIGlubGluZSB2b2lkIHByZXBhcmVfc3dpdGNoX3RvKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwKKwkJCQkgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKK3sKKyNpZmRlZiBDT05GSUdfVk1BUF9TVEFDSworCS8qCisJICogSWYgd2Ugc3dpdGNoIHRvIGEgc3RhY2sgdGhhdCBoYXMgYSB0b3AtbGV2ZWwgcGFnaW5nIGVudHJ5CisJICogdGhhdCBpcyBub3QgcHJlc2VudCBpbiB0aGUgY3VycmVudCBtbSwgdGhlIHJlc3VsdGluZyAjUEYgd2lsbAorCSAqIHdpbGwgYmUgcHJvbW90ZWQgdG8gYSBkb3VibGUtZmF1bHQgYW5kIHdlJ2xsIHBhbmljLiAgUHJvYmUKKwkgKiB0aGUgbmV3IHN0YWNrIG5vdyBzbyB0aGF0IHZtYWxsb2NfZmF1bHQgY2FuIGZpeCB1cCB0aGUgcGFnZQorCSAqIHRhYmxlcyBpZiBuZWVkZWQuICBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZiB3ZSB1c2UgYSBzdGFjaworCSAqIGluIHZtYXAgc3BhY2UuCisJICoKKwkgKiBXZSBhc3N1bWUgdGhhdCB0aGUgc3RhY2sgaXMgYWxpZ25lZCBzbyB0aGF0IGl0IG5ldmVyIHNwYW5zCisJICogbW9yZSB0aGFuIG9uZSB0b3AtbGV2ZWwgcGFnaW5nIGVudHJ5LgorCSAqCisJICogVG8gbWluaW1pemUgY2FjaGUgcG9sbHV0aW9uLCBqdXN0IGZvbGxvdyB0aGUgc3RhY2sgcG9pbnRlci4KKwkgKi8KKwlSRUFEX09OQ0UoKih1bnNpZ25lZCBjaGFyICopbmV4dC0+dGhyZWFkLnNwKTsKKyNlbmRpZgorfQogCi0jaWZkZWYgQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SCi0jZGVmaW5lIF9fc3dpdGNoX2NhbmFyeQkJCQkJCQlcCi0JIm1vdmwgJVBbdGFza19jYW5hcnldKCVbbmV4dF0pLCAlJWVieFxuXHQiCQkJXAotCSJtb3ZsICUlZWJ4LCAiX19wZXJjcHVfYXJnKFtzdGFja19jYW5hcnldKSJcblx0IgotI2RlZmluZSBfX3N3aXRjaF9jYW5hcnlfb3BhcmFtCQkJCQkJXAotCSwgW3N0YWNrX2NhbmFyeV0gIj1tIiAoc3RhY2tfY2FuYXJ5LmNhbmFyeSkKLSNkZWZpbmUgX19zd2l0Y2hfY2FuYXJ5X2lwYXJhbQkJCQkJCVwKLQksIFt0YXNrX2NhbmFyeV0gImkiIChvZmZzZXRvZihzdHJ1Y3QgdGFza19zdHJ1Y3QsIHN0YWNrX2NhbmFyeSkpCi0jZWxzZQkvKiBDQ19TVEFDS1BST1RFQ1RPUiAqLwotI2RlZmluZSBfX3N3aXRjaF9jYW5hcnkKLSNkZWZpbmUgX19zd2l0Y2hfY2FuYXJ5X29wYXJhbQotI2RlZmluZSBfX3N3aXRjaF9jYW5hcnlfaXBhcmFtCi0jZW5kaWYJLyogQ0NfU1RBQ0tQUk9URUNUT1IgKi8KK2FzbWxpbmthZ2Ugdm9pZCByZXRfZnJvbV9mb3JrKHZvaWQpOwogCi0vKgotICogU2F2aW5nIGVmbGFncyBpcyBpbXBvcnRhbnQuIEl0IHN3aXRjaGVzIG5vdCBvbmx5IElPUEwgYmV0d2VlbiB0YXNrcywKLSAqIGl0IGFsc28gcHJvdGVjdHMgb3RoZXIgdGFza3MgZnJvbSBOVCBsZWFraW5nIHRocm91Z2ggc3lzZW50ZXIgZXRjLgotICovCisvKiBkYXRhIHRoYXQgaXMgcG9pbnRlZCB0byBieSB0aHJlYWQuc3AgKi8KK3N0cnVjdCBpbmFjdGl2ZV90YXNrX2ZyYW1lIHsKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJdW5zaWduZWQgbG9uZyByMTU7CisJdW5zaWduZWQgbG9uZyByMTQ7CisJdW5zaWduZWQgbG9uZyByMTM7CisJdW5zaWduZWQgbG9uZyByMTI7CisjZWxzZQorCXVuc2lnbmVkIGxvbmcgc2k7CisJdW5zaWduZWQgbG9uZyBkaTsKKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcgYng7CisJdW5zaWduZWQgbG9uZyBicDsKKwl1bnNpZ25lZCBsb25nIHJldF9hZGRyOworfTsKKworc3RydWN0IGZvcmtfZnJhbWUgeworCXN0cnVjdCBpbmFjdGl2ZV90YXNrX2ZyYW1lIGZyYW1lOworCXN0cnVjdCBwdF9yZWdzIHJlZ3M7Cit9OworCiAjZGVmaW5lIHN3aXRjaF90byhwcmV2LCBuZXh0LCBsYXN0KQkJCQkJXAogZG8gewkJCQkJCQkJCVwKLQkvKgkJCQkJCQkJXAotCSAqIENvbnRleHQtc3dpdGNoaW5nIGNsb2JiZXJzIGFsbCByZWdpc3RlcnMsIHNvIHdlIGNsb2JiZXIJXAotCSAqIHRoZW0gZXhwbGljaXRseSwgdmlhIHVudXNlZCBvdXRwdXQgdmFyaWFibGVzLgkJXAotCSAqIChFQVggYW5kIEVCUCBpcyBub3QgbGlzdGVkIGJlY2F1c2UgRUJQIGlzIHNhdmVkL3Jlc3RvcmVkCVwKLQkgKiBleHBsaWNpdGx5IGZvciB3Y2hhbiBhY2Nlc3MgYW5kIEVBWCBpcyB0aGUgcmV0dXJuIHZhbHVlIG9mCVwKLQkgKiBfX3N3aXRjaF90bygpKQkJCQkJCVwKLQkgKi8JCQkJCQkJCVwKLQl1bnNpZ25lZCBsb25nIGVieCwgZWN4LCBlZHgsIGVzaSwgZWRpOwkJCQlcCisJcHJlcGFyZV9zd2l0Y2hfdG8ocHJldiwgbmV4dCk7CQkJCQlcCiAJCQkJCQkJCQlcCi0JYXNtIHZvbGF0aWxlKCJwdXNobCAlJWVicFxuXHQiCQkvKiBzYXZlICAgIEVCUCAgICovCVwKLQkJICAgICAibW92bCAlJWVzcCwlW3ByZXZfc3BdXG5cdCIJLyogc2F2ZSAgICBFU1AgICAqLyBcCi0JCSAgICAgIm1vdmwgJVtuZXh0X3NwXSwlJWVzcFxuXHQiCS8qIHJlc3RvcmUgRVNQICAgKi8gXAotCQkgICAgICJtb3ZsICQxZiwlW3ByZXZfaXBdXG5cdCIJLyogc2F2ZSAgICBFSVAgICAqLwlcCi0JCSAgICAgInB1c2hsICVbbmV4dF9pcF1cblx0IgkvKiByZXN0b3JlIEVJUCAgICovCVwKLQkJICAgICBfX3N3aXRjaF9jYW5hcnkJCQkJCVwKLQkJICAgICAiam1wIF9fc3dpdGNoX3RvXG4iCS8qIHJlZ3Bhcm0gY2FsbCAgKi8JXAotCQkgICAgICIxOlx0IgkJCQkJCVwKLQkJICAgICAicG9wbCAlJWVicFxuXHQiCQkvKiByZXN0b3JlIEVCUCAgICovCVwKLQkJCQkJCQkJCVwKLQkJICAgICAvKiBvdXRwdXQgcGFyYW1ldGVycyAqLwkJCQlcCi0JCSAgICAgOiBbcHJldl9zcF0gIj1tIiAocHJldi0+dGhyZWFkLnNwKSwJCVwKLQkJICAgICAgIFtwcmV2X2lwXSAiPW0iIChwcmV2LT50aHJlYWQuaXApLAkJXAotCQkgICAgICAgIj1hIiAobGFzdCksCQkJCQlcCi0JCQkJCQkJCQlcCi0JCSAgICAgICAvKiBjbG9iYmVyZWQgb3V0cHV0IHJlZ2lzdGVyczogKi8JCVwKLQkJICAgICAgICI9YiIgKGVieCksICI9YyIgKGVjeCksICI9ZCIgKGVkeCksCQlcCi0JCSAgICAgICAiPVMiIChlc2kpLCAiPUQiIChlZGkpCQkJCVwKLQkJICAgICAgIAkJCQkJCQlcCi0JCSAgICAgICBfX3N3aXRjaF9jYW5hcnlfb3BhcmFtCQkJCVwKLQkJCQkJCQkJCVwKLQkJICAgICAgIC8qIGlucHV0IHBhcmFtZXRlcnM6ICovCQkJCVwKLQkJICAgICA6IFtuZXh0X3NwXSAgIm0iIChuZXh0LT50aHJlYWQuc3ApLAkJXAotCQkgICAgICAgW25leHRfaXBdICAibSIgKG5leHQtPnRocmVhZC5pcCksCQlcCi0JCSAgICAgICAJCQkJCQkJXAotCQkgICAgICAgLyogcmVncGFybSBwYXJhbWV0ZXJzIGZvciBfX3N3aXRjaF90bygpOiAqLwlcCi0JCSAgICAgICBbcHJldl0gICAgICJhIiAocHJldiksCQkJCVwKLQkJICAgICAgIFtuZXh0XSAgICAgImQiIChuZXh0KQkJCQlcCi0JCQkJCQkJCQlcCi0JCSAgICAgICBfX3N3aXRjaF9jYW5hcnlfaXBhcmFtCQkJCVwKLQkJCQkJCQkJCVwKLQkJICAgICA6IC8qIHJlbG9hZGVkIHNlZ21lbnQgcmVnaXN0ZXJzICovCQkJXAotCQkJIm1lbW9yeSIpOwkJCQkJXAorCSgobGFzdCkgPSBfX3N3aXRjaF90b19hc20oKHByZXYpLCAobmV4dCkpKTsJCQlcCiB9IHdoaWxlICgwKQogCi0jZWxzZSAvKiBDT05GSUdfWDg2XzMyICovCi0KLS8qIGZyYW1lIHBvaW50ZXIgbXVzdCBiZSBsYXN0IGZvciBnZXRfd2NoYW4gKi8KLSNkZWZpbmUgU0FWRV9DT05URVhUICAgICJwdXNocSAlJXJicCA7IG1vdnEgJSVyc2ksJSVyYnBcblx0IgotI2RlZmluZSBSRVNUT1JFX0NPTlRFWFQgIm1vdnEgJSVyYnAsJSVyc2kgOyBwb3BxICUlcmJwXHQiCi0KLSNkZWZpbmUgX19FWFRSQV9DTE9CQkVSICBcCi0JLCAicmN4IiwgInJieCIsICJyZHgiLCAicjgiLCAicjkiLCAicjEwIiwgInIxMSIsIFwKLQkgICJyMTIiLCAicjEzIiwgInIxNCIsICJyMTUiLCAiZmxhZ3MiCi0KLSNpZmRlZiBDT05GSUdfQ0NfU1RBQ0tQUk9URUNUT1IKLSNkZWZpbmUgX19zd2l0Y2hfY2FuYXJ5CQkJCQkJCSAgXAotCSJtb3ZxICVQW3Rhc2tfY2FuYXJ5XSglJXJzaSksJSVyOFxuXHQiCQkJCSAgXAotCSJtb3ZxICUlcjgsIl9fcGVyY3B1X2FyZyhbZ3NfY2FuYXJ5XSkiXG5cdCIKLSNkZWZpbmUgX19zd2l0Y2hfY2FuYXJ5X29wYXJhbQkJCQkJCSAgXAotCSwgW2dzX2NhbmFyeV0gIj1tIiAoaXJxX3N0YWNrX3VuaW9uLnN0YWNrX2NhbmFyeSkKLSNkZWZpbmUgX19zd2l0Y2hfY2FuYXJ5X2lwYXJhbQkJCQkJCSAgXAotCSwgW3Rhc2tfY2FuYXJ5XSAiaSIgKG9mZnNldG9mKHN0cnVjdCB0YXNrX3N0cnVjdCwgc3RhY2tfY2FuYXJ5KSkKLSNlbHNlCS8qIENDX1NUQUNLUFJPVEVDVE9SICovCi0jZGVmaW5lIF9fc3dpdGNoX2NhbmFyeQotI2RlZmluZSBfX3N3aXRjaF9jYW5hcnlfb3BhcmFtCi0jZGVmaW5lIF9fc3dpdGNoX2NhbmFyeV9pcGFyYW0KLSNlbmRpZgkvKiBDQ19TVEFDS1BST1RFQ1RPUiAqLwotCi0vKgotICogVGhlcmUgaXMgbm8gbmVlZCB0byBzYXZlIG9yIHJlc3RvcmUgZmxhZ3MsIGJlY2F1c2UgZmxhZ3MgYXJlIGFsd2F5cwotICogY2xlYW4gaW4ga2VybmVsIG1vZGUsIHdpdGggdGhlIHBvc3NpYmxlIGV4Y2VwdGlvbiBvZiBJT1BMLiAgS2VybmVsIElPUEwKLSAqIGhhcyBubyBlZmZlY3QuCi0gKi8KLSNkZWZpbmUgc3dpdGNoX3RvKHByZXYsIG5leHQsIGxhc3QpIFwKLQlhc20gdm9sYXRpbGUoU0FWRV9DT05URVhUCQkJCQkgIFwKLQkgICAgICJtb3ZxICUlcnNwLCVQW3RocmVhZHJzcF0oJVtwcmV2XSlcblx0IiAvKiBzYXZlIFJTUCAqLwkgIFwKLQkgICAgICJtb3ZxICVQW3RocmVhZHJzcF0oJVtuZXh0XSksJSVyc3Bcblx0IiAvKiByZXN0b3JlIFJTUCAqLwkgIFwKLQkgICAgICJjYWxsIF9fc3dpdGNoX3RvXG5cdCIJCQkJCSAgXAotCSAgICAgIm1vdnEgIl9fcGVyY3B1X2FyZyhbY3VycmVudF90YXNrXSkiLCUlcnNpXG5cdCIJCSAgXAotCSAgICAgX19zd2l0Y2hfY2FuYXJ5CQkJCQkJICBcCi0JICAgICAibW92cSAlUFt0aHJlYWRfaW5mb10oJSVyc2kpLCUlcjhcblx0IgkJCSAgXAotCSAgICAgIm1vdnEgJSVyYXgsJSVyZGlcblx0IiAJCQkJCSAgXAotCSAgICAgInRlc3RsICAlW190aWZfZm9ya10sJVBbdGlfZmxhZ3NdKCUlcjgpXG5cdCIJCSAgXAotCSAgICAgImpueiAgIHJldF9mcm9tX2Zvcmtcblx0IgkJCQkJICBcCi0JICAgICBSRVNUT1JFX0NPTlRFWFQJCQkJCQkgIFwKLQkgICAgIDogIj1hIiAobGFzdCkJCQkJCSAgCSAgXAotCSAgICAgICBfX3N3aXRjaF9jYW5hcnlfb3BhcmFtCQkJCQkgIFwKLQkgICAgIDogW25leHRdICJTIiAobmV4dCksIFtwcmV2XSAiRCIgKHByZXYpLAkJCSAgXAotCSAgICAgICBbdGhyZWFkcnNwXSAiaSIgKG9mZnNldG9mKHN0cnVjdCB0YXNrX3N0cnVjdCwgdGhyZWFkLnNwKSksIFwKLQkgICAgICAgW3RpX2ZsYWdzXSAiaSIgKG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgZmxhZ3MpKSwJICBcCi0JICAgICAgIFtfdGlmX2ZvcmtdICJpIiAoX1RJRl9GT1JLKSwJCQkgIAkgIFwKLQkgICAgICAgW3RocmVhZF9pbmZvXSAiaSIgKG9mZnNldG9mKHN0cnVjdCB0YXNrX3N0cnVjdCwgc3RhY2spKSwgICBcCi0JICAgICAgIFtjdXJyZW50X3Rhc2tdICJtIiAoY3VycmVudF90YXNrKQkJCSAgXAotCSAgICAgICBfX3N3aXRjaF9jYW5hcnlfaXBhcmFtCQkJCQkgIFwKLQkgICAgIDogIm1lbW9yeSIsICJjYyIgX19FWFRSQV9DTE9CQkVSKQotCi0jZW5kaWYgLyogQ09ORklHX1g4Nl8zMiAqLwotCiAjZW5kaWYgLyogX0FTTV9YODZfU1dJVENIX1RPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N5c2NhbGwuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N5c2NhbGwuaAppbmRleCA0ZTIzZGQxLi5lM2M5NWU4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zeXNjYWxsLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3lzY2FsbC5oCkBAIC02MCw3ICs2MCw3IEBACiAJICogVFNfQ09NUEFUIGlzIHNldCBmb3IgMzItYml0IHN5c2NhbGwgZW50cmllcyBhbmQgdGhlbgogCSAqIHJlbWFpbnMgc2V0IHVudGlsIHdlIHJldHVybiB0byB1c2VyIG1vZGUuCiAJICovCi0JaWYgKHRhc2tfdGhyZWFkX2luZm8odGFzayktPnN0YXR1cyAmIChUU19DT01QQVR8VFNfSTM4Nl9SRUdTX1BPS0VEKSkKKwlpZiAodGFzay0+dGhyZWFkLnN0YXR1cyAmIChUU19DT01QQVR8VFNfSTM4Nl9SRUdTX1BPS0VEKSkKIAkJLyoKIAkJICogU2lnbi1leHRlbmQgdGhlIHZhbHVlIHNvIChpbnQpLUVGT08gYmVjb21lcyAobG9uZyktRUZPTwogCQkgKiBhbmQgd2lsbCBtYXRjaCBjb3JyZWN0bHkgaW4gY29tcGFyaXNvbnMuCkBAIC0xMTYsNyArMTE2LDcgQEAKIAkJCQkJIHVuc2lnbmVkIGxvbmcgKmFyZ3MpCiB7CiAjIGlmZGVmIENPTkZJR19JQTMyX0VNVUxBVElPTgotCWlmICh0YXNrX3RocmVhZF9pbmZvKHRhc2spLT5zdGF0dXMgJiBUU19DT01QQVQpCisJaWYgKHRhc2stPnRocmVhZC5zdGF0dXMgJiBUU19DT01QQVQpCiAJCXN3aXRjaCAoaSkgewogCQljYXNlIDA6CiAJCQlpZiAoIW4tLSkgYnJlYWs7CkBAIC0xNzcsNyArMTc3LDcgQEAKIAkJCQkJIGNvbnN0IHVuc2lnbmVkIGxvbmcgKmFyZ3MpCiB7CiAjIGlmZGVmIENPTkZJR19JQTMyX0VNVUxBVElPTgotCWlmICh0YXNrX3RocmVhZF9pbmZvKHRhc2spLT5zdGF0dXMgJiBUU19DT01QQVQpCisJaWYgKHRhc2stPnRocmVhZC5zdGF0dXMgJiBUU19DT01QQVQpCiAJCXN3aXRjaCAoaSkgewogCQljYXNlIDA6CiAJCQlpZiAoIW4tLSkgYnJlYWs7CkBAIC0yMzQsMTggKzIzNCw4IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IHN5c2NhbGxfZ2V0X2FyY2godm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfSUEzMl9FTVVMQVRJT04KLQkvKgotCSAqIFRTX0NPTVBBVCBpcyBzZXQgZm9yIDMyLWJpdCBzeXNjYWxsIGVudHJ5IGFuZCB0aGVuCi0JICogcmVtYWlucyBzZXQgdW50aWwgd2UgcmV0dXJuIHRvIHVzZXIgbW9kZS4KLQkgKgotCSAqIHgzMiB0YXNrcyBzaG91bGQgYmUgY29uc2lkZXJlZCBBVURJVF9BUkNIX1g4Nl82NC4KLQkgKi8KLQlpZiAodGFza190aHJlYWRfaW5mbyhjdXJyZW50KS0+c3RhdHVzICYgVFNfQ09NUEFUKQotCQlyZXR1cm4gQVVESVRfQVJDSF9JMzg2OwotI2VuZGlmCi0JLyogQm90aCB4MzIgYW5kIHg4Nl82NCBhcmUgY29uc2lkZXJlZCAiNjQtYml0Ii4gKi8KLQlyZXR1cm4gQVVESVRfQVJDSF9YODZfNjQ7CisJLyogeDMyIHRhc2tzIHNob3VsZCBiZSBjb25zaWRlcmVkIEFVRElUX0FSQ0hfWDg2XzY0LiAqLworCXJldHVybiBpbl9pYTMyX3N5c2NhbGwoKSA/IEFVRElUX0FSQ0hfSTM4NiA6IEFVRElUX0FSQ0hfWDg2XzY0OwogfQogI2VuZGlmCS8qIENPTkZJR19YODZfMzIgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggOGI3YzhkOC4uMmFhY2E1MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC01MiwyMSArNTIsNiBAQAogI2luY2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+CiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAKLXN0cnVjdCB0aHJlYWRfaW5mbyB7Ci0Jc3RydWN0IHRhc2tfc3RydWN0CSp0YXNrOwkJLyogbWFpbiB0YXNrIHN0cnVjdHVyZSAqLwotCV9fdTMyCQkJZmxhZ3M7CQkvKiBsb3cgbGV2ZWwgZmxhZ3MgKi8KLQlfX3UzMgkJCXN0YXR1czsJCS8qIHRocmVhZCBzeW5jaHJvbm91cyBmbGFncyAqLwotCV9fdTMyCQkJY3B1OwkJLyogY3VycmVudCBDUFUgKi8KLX07Ci0KLSNkZWZpbmUgSU5JVF9USFJFQURfSU5GTyh0c2spCQkJXAotewkJCQkJCVwKLQkudGFzawkJPSAmdHNrLAkJCVwKLQkuZmxhZ3MJCT0gMCwJCQlcCi0JLmNwdQkJPSAwLAkJCVwKLX0KLQotI2RlZmluZSBpbml0X3RocmVhZF9pbmZvCShpbml0X3RocmVhZF91bmlvbi50aHJlYWRfaW5mbykKICNkZWZpbmUgaW5pdF9zdGFjawkJKGluaXRfdGhyZWFkX3VuaW9uLnN0YWNrKQogCiAjZWxzZSAvKiAhX19BU1NFTUJMWV9fICovCkBAIC05NSw3ICs4MCw2IEBACiAjZGVmaW5lIFRJRl9VUFJPQkUJCTEyCS8qIGJyZWFrcG9pbnRlZCBvciBzaW5nbGVzdGVwcGluZyAqLwogI2RlZmluZSBUSUZfTk9UU0MJCTE2CS8qIFRTQyBpcyBub3QgYWNjZXNzaWJsZSBpbiB1c2VybGFuZCAqLwogI2RlZmluZSBUSUZfSUEzMgkJMTcJLyogSUEzMiBjb21wYXRpYmlsaXR5IHByb2Nlc3MgKi8KLSNkZWZpbmUgVElGX0ZPUksJCTE4CS8qIHJldF9mcm9tX2ZvcmsgKi8KICNkZWZpbmUgVElGX05PSFoJCTE5CS8qIGluIGFkYXB0aXZlIG5vaHogbW9kZSAqLwogI2RlZmluZSBUSUZfTUVNRElFCQkyMAkvKiBpcyB0ZXJtaW5hdGluZyBkdWUgdG8gT09NIGtpbGxlciAqLwogI2RlZmluZSBUSUZfUE9MTElOR19OUkZMQUcJMjEJLyogaWRsZSBpcyBwb2xsaW5nIGZvciBUSUZfTkVFRF9SRVNDSEVEICovCkBAIC0xMTksNyArMTAzLDYgQEAKICNkZWZpbmUgX1RJRl9VUFJPQkUJCSgxIDw8IFRJRl9VUFJPQkUpCiAjZGVmaW5lIF9USUZfTk9UU0MJCSgxIDw8IFRJRl9OT1RTQykKICNkZWZpbmUgX1RJRl9JQTMyCQkoMSA8PCBUSUZfSUEzMikKLSNkZWZpbmUgX1RJRl9GT1JLCQkoMSA8PCBUSUZfRk9SSykKICNkZWZpbmUgX1RJRl9OT0haCQkoMSA8PCBUSUZfTk9IWikKICNkZWZpbmUgX1RJRl9QT0xMSU5HX05SRkxBRwkoMSA8PCBUSUZfUE9MTElOR19OUkZMQUcpCiAjZGVmaW5lIF9USUZfSU9fQklUTUFQCQkoMSA8PCBUSUZfSU9fQklUTUFQKQpAQCAtMTYwLDExICsxNDMsNiBAQAogICovCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB0aHJlYWRfaW5mbyAqY3VycmVudF90aHJlYWRfaW5mbyh2b2lkKQotewotCXJldHVybiAoc3RydWN0IHRocmVhZF9pbmZvICopKGN1cnJlbnRfdG9wX29mX3N0YWNrKCkgLSBUSFJFQURfU0laRSk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjdXJyZW50X3N0YWNrX3BvaW50ZXIodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHNwOwpAQCAtMjI2LDYwICsyMDQsMTkgQEAKICMgZGVmaW5lIGNwdV9jdXJyZW50X3RvcF9vZl9zdGFjayAoY3B1X3RzcyArIFRTU19zcDApCiAjZW5kaWYKIAotLyoKLSAqIEFTTSBvcGVyYW5kIHdoaWNoIGV2YWx1YXRlcyB0byBhICd0aHJlYWRfaW5mbycgYWRkcmVzcyBvZgotICogdGhlIGN1cnJlbnQgdGFzaywgaWYgaXQgaXMga25vd24gdGhhdCAicmVnIiBpcyBleGFjdGx5ICJvZmYiCi0gKiBieXRlcyBiZWxvdyB0aGUgdG9wIG9mIHRoZSBzdGFjayBjdXJyZW50bHkuCi0gKgotICogKCBUaGUga2VybmVsIHN0YWNrJ3Mgc2l6ZSBpcyBrbm93biBhdCBidWlsZCB0aW1lLCBpdCBpcyB1c3VhbGx5Ci0gKiAgIDIgb3IgNCBwYWdlcywgYW5kIHRoZSBib3R0b20gIG9mIHRoZSBrZXJuZWwgc3RhY2sgY29udGFpbnMKLSAqICAgdGhlIHRocmVhZF9pbmZvIHN0cnVjdHVyZS4gU28gdG8gYWNjZXNzIHRoZSB0aHJlYWRfaW5mbyB2ZXJ5Ci0gKiAgIHF1aWNrbHkgZnJvbSBhc3NlbWJseSBjb2RlIHdlIGNhbiBjYWxjdWxhdGUgZG93biBmcm9tIHRoZQotICogICB0b3Agb2YgdGhlIGtlcm5lbCBzdGFjayB0byB0aGUgYm90dG9tLCB1c2luZyBjb25zdGFudCwKLSAqICAgYnVpbGQtdGltZSBjYWxjdWxhdGlvbnMgb25seS4gKQotICoKLSAqIEZvciBleGFtcGxlLCB0byBmZXRjaCB0aGUgY3VycmVudCB0aHJlYWRfaW5mby0+ZmxhZ3MgdmFsdWUgaW50byAlZWF4Ci0gKiBvbiB4ODYtNjQgZGVmY29uZmlnIGtlcm5lbHMsIGluIHN5c2NhbGwgZW50cnkgY29kZSB3aGVyZSBSU1AgaXMKLSAqIGN1cnJlbnRseSBhdCBleGFjdGx5IFNJWkVPRl9QVFJFR1MgYnl0ZXMgYXdheSBmcm9tIHRoZSB0b3Agb2YgdGhlCi0gKiBzdGFjazoKLSAqCi0gKiAgICAgIG1vdiBBU01fVEhSRUFEX0lORk8oVElfZmxhZ3MsICVyc3AsIFNJWkVPRl9QVFJFR1MpLCAlZWF4Ci0gKgotICogd2lsbCB0cmFuc2xhdGUgdG86Ci0gKgotICogICAgICA4YiA4NCAyNCBiOCBjMCBmZiBmZiAgICAgIG1vdiAgICAtMHgzZjQ4KCVyc3ApLCAlZWF4Ci0gKgotICogd2hpY2ggaXMgYmVsb3cgdGhlIGN1cnJlbnQgUlNQIGJ5IGFsbW9zdCAxNksuCi0gKi8KLSNkZWZpbmUgQVNNX1RIUkVBRF9JTkZPKGZpZWxkLCByZWcsIG9mZikgKChmaWVsZCkrKG9mZiktVEhSRUFEX1NJWkUpKHJlZykKLQogI2VuZGlmCiAKLS8qCi0gKiBUaHJlYWQtc3luY2hyb25vdXMgc3RhdHVzLgotICoKLSAqIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIGZsYWdzIGluIHRoYXQgbm9ib2R5IGVsc2UKLSAqIGV2ZXIgdG91Y2hlcyBvdXIgdGhyZWFkLXN5bmNocm9ub3VzIHN0YXR1cywgc28gd2UgZG9uJ3QKLSAqIGhhdmUgdG8gd29ycnkgYWJvdXQgYXRvbWljIGFjY2Vzc2VzLgotICovCi0jZGVmaW5lIFRTX0NPTVBBVAkJMHgwMDAyCS8qIDMyYml0IHN5c2NhbGwgYWN0aXZlICg2NEJJVCkqLwogI2lmZGVmIENPTkZJR19DT01QQVQKICNkZWZpbmUgVFNfSTM4Nl9SRUdTX1BPS0VECTB4MDAwNAkvKiByZWdzIHBva2VkIGJ5IDMyLWJpdCBwdHJhY2VyICovCiAjZW5kaWYKLQogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAotc3RhdGljIGlubGluZSBib29sIGluX2lhMzJfc3lzY2FsbCh2b2lkKQotewogI2lmZGVmIENPTkZJR19YODZfMzIKLQlyZXR1cm4gdHJ1ZTsKKyNkZWZpbmUgaW5faWEzMl9zeXNjYWxsKCkgdHJ1ZQorI2Vsc2UKKyNkZWZpbmUgaW5faWEzMl9zeXNjYWxsKCkgKElTX0VOQUJMRUQoQ09ORklHX0lBMzJfRU1VTEFUSU9OKSAmJiBcCisJCQkgICBjdXJyZW50LT50aHJlYWQuc3RhdHVzICYgVFNfQ09NUEFUKQogI2VuZGlmCi0jaWZkZWYgQ09ORklHX0lBMzJfRU1VTEFUSU9OCi0JaWYgKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3RhdHVzICYgVFNfQ09NUEFUKQotCQlyZXR1cm4gdHJ1ZTsKLSNlbmRpZgotCXJldHVybiBmYWxzZTsKLX0KIAogLyoKICAqIEZvcmNlIHN5c2NhbGwgcmV0dXJuIHZpYSBJUkVUIGJ5IG1ha2luZyBpdCBsb29rIGFzIGlmIHRoZXJlIHdhcwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdHJhcHMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RyYXBzLmgKaW5kZXggYzM0OTY2MTkuLjAxZmQwYTcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RyYXBzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdHJhcHMuaApAQCAtMTE3LDYgKzExNywxMiBAQAogZXh0ZXJuIHZvaWQgaXN0X2JlZ2luX25vbl9hdG9taWMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogZXh0ZXJuIHZvaWQgaXN0X2VuZF9ub25fYXRvbWljKHZvaWQpOwogCisjaWZkZWYgQ09ORklHX1ZNQVBfU1RBQ0sKK3ZvaWQgX19ub3JldHVybiBoYW5kbGVfc3RhY2tfb3ZlcmZsb3coY29uc3QgY2hhciAqbWVzc2FnZSwKKwkJCQkgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGZhdWx0X2FkZHJlc3MpOworI2VuZGlmCisKIC8qIEludGVycnVwdHMvRXhjZXB0aW9ucyAqLwogZW51bSB7CiAJWDg2X1RSQVBfREUgPSAwLAkvKiAgMCwgRGl2aWRlLWJ5LXplcm8gKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCBhMGFlNjEwLi4yMTMxYzRjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC00MzMsNyArNDMzLDExIEBACiAjZGVmaW5lIF9fZ2V0X3VzZXJfYXNtX2V4KHgsIGFkZHIsIGl0eXBlLCBydHlwZSwgbHR5cGUpCQkJXAogCWFzbSB2b2xhdGlsZSgiMToJbW92Iml0eXBlIiAlMSwlInJ0eXBlIjBcbiIJCVwKIAkJICAgICAiMjpcbiIJCQkJCQlcCi0JCSAgICAgX0FTTV9FWFRBQkxFX0VYKDFiLCAyYikJCQkJXAorCQkgICAgICIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQkJCVwKKyAgICAgICAgICAgICAgICAgICAgICIzOnhvciJpdHlwZSIgJSJydHlwZSIwLCUicnR5cGUiMFxuIgkJXAorCQkgICAgICIgIGptcCAyYlxuIgkJCQkJXAorCQkgICAgICIucHJldmlvdXNcbiIJCQkJCVwKKwkJICAgICBfQVNNX0VYVEFCTEVfRVgoMWIsIDNiKQkJCQlcCiAJCSAgICAgOiBsdHlwZSh4KSA6ICJtIiAoX19tKGFkZHIpKSkKIAogI2RlZmluZSBfX3B1dF91c2VyX25vY2hlY2soeCwgcHRyLCBzaXplKQkJCVwKQEAgLTY5Nyw0NCArNzAxLDE1IEBACiB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjayBfY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwKIAkJCQkJIHVuc2lnbmVkIG4pOwogCi0jaWZkZWYgQ09ORklHX0RFQlVHX1NUUklDVF9VU0VSX0NPUFlfQ0hFQ0tTCi0jIGRlZmluZSBjb3B5X3VzZXJfZGlhZyBfX2NvbXBpbGV0aW1lX2Vycm9yCi0jZWxzZQotIyBkZWZpbmUgY29weV91c2VyX2RpYWcgX19jb21waWxldGltZV93YXJuaW5nCi0jZW5kaWYKK2V4dGVybiB2b2lkIF9fY29tcGlsZXRpbWVfZXJyb3IoInVzZXJjb3B5IGJ1ZmZlciBzaXplIGlzIHRvbyBzbWFsbCIpCitfX2JhZF9jb3B5X3VzZXIodm9pZCk7CiAKLWV4dGVybiB2b2lkIGNvcHlfdXNlcl9kaWFnKCJjb3B5X2Zyb21fdXNlcigpIGJ1ZmZlciBzaXplIGlzIHRvbyBzbWFsbCIpCi1jb3B5X2Zyb21fdXNlcl9vdmVyZmxvdyh2b2lkKTsKLWV4dGVybiB2b2lkIGNvcHlfdXNlcl9kaWFnKCJjb3B5X3RvX3VzZXIoKSBidWZmZXIgc2l6ZSBpcyB0b28gc21hbGwiKQotY29weV90b191c2VyX292ZXJmbG93KHZvaWQpIF9fYXNtX18oImNvcHlfZnJvbV91c2VyX292ZXJmbG93Iik7Ci0KLSN1bmRlZiBjb3B5X3VzZXJfZGlhZwotCi0jaWZkZWYgQ09ORklHX0RFQlVHX1NUUklDVF9VU0VSX0NPUFlfQ0hFQ0tTCi0KLWV4dGVybiB2b2lkCi1fX2NvbXBpbGV0aW1lX3dhcm5pbmcoImNvcHlfZnJvbV91c2VyKCkgYnVmZmVyIHNpemUgaXMgbm90IHByb3ZhYmx5IGNvcnJlY3QiKQotX19jb3B5X2Zyb21fdXNlcl9vdmVyZmxvdyh2b2lkKSBfX2FzbV9fKCJjb3B5X2Zyb21fdXNlcl9vdmVyZmxvdyIpOwotI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyX292ZXJmbG93KHNpemUsIGNvdW50KSBfX2NvcHlfZnJvbV91c2VyX292ZXJmbG93KCkKLQotZXh0ZXJuIHZvaWQKLV9fY29tcGlsZXRpbWVfd2FybmluZygiY29weV90b191c2VyKCkgYnVmZmVyIHNpemUgaXMgbm90IHByb3ZhYmx5IGNvcnJlY3QiKQotX19jb3B5X3RvX3VzZXJfb3ZlcmZsb3codm9pZCkgX19hc21fXygiY29weV9mcm9tX3VzZXJfb3ZlcmZsb3ciKTsKLSNkZWZpbmUgX19jb3B5X3RvX3VzZXJfb3ZlcmZsb3coc2l6ZSwgY291bnQpIF9fY29weV90b191c2VyX292ZXJmbG93KCkKLQotI2Vsc2UKLQotc3RhdGljIGlubGluZSB2b2lkCi1fX2NvcHlfZnJvbV91c2VyX292ZXJmbG93KGludCBzaXplLCB1bnNpZ25lZCBsb25nIGNvdW50KQorc3RhdGljIGlubGluZSB2b2lkIGNvcHlfdXNlcl9vdmVyZmxvdyhpbnQgc2l6ZSwgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKIAlXQVJOKDEsICJCdWZmZXIgb3ZlcmZsb3cgZGV0ZWN0ZWQgKCVkIDwgJWx1KSFcbiIsIHNpemUsIGNvdW50KTsKIH0KIAotI2RlZmluZSBfX2NvcHlfdG9fdXNlcl9vdmVyZmxvdyBfX2NvcHlfZnJvbV91c2VyX292ZXJmbG93Ci0KLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCiBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKIAlpbnQgc3ogPSBfX2NvbXBpbGV0aW1lX29iamVjdF9zaXplKHRvKTsKQEAgLTc0MywzNiArNzE4LDE4IEBACiAKIAlrYXNhbl9jaGVja193cml0ZSh0bywgbik7CiAKLQkvKgotCSAqIFdoaWxlIHdlIHdvdWxkIGxpa2UgdG8gaGF2ZSB0aGUgY29tcGlsZXIgZG8gdGhlIGNoZWNraW5nIGZvciB1cwotCSAqIGV2ZW4gaW4gdGhlIG5vbi1jb25zdGFudCBzaXplIGNhc2UsIGFueSBmYWxzZSBwb3NpdGl2ZXMgdGhlcmUgYXJlCi0JICogYSBwcm9ibGVtIChlc3BlY2lhbGx5IHdoZW4gREVCVUdfU1RSSUNUX1VTRVJfQ09QWV9DSEVDS1MsIGJ1dCBldmVuCi0JICogd2l0aG91dCAtIHRoZSBbaG9wZWZ1bGx5XSBkYW5nZXJvdXMgbG9va2luZyBuYXR1cmUgb2YgdGhlIHdhcm5pbmcKLQkgKiB3b3VsZCBtYWtlIHBlb3BsZSBnbyBsb29rIGF0IHRoZSByZXNwZWNpdGl2ZSBjYWxsIHNpdGVzIG92ZXIgYW5kCi0JICogb3ZlciBhZ2FpbiBqdXN0IHRvIGZpbmQgdGhhdCB0aGVyZSdzIG5vIHByb2JsZW0pLgotCSAqCi0JICogQW5kIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSBpdCdzIGp1c3Qgbm90IHJlYWxpc3RpYyBmb3IgdGhlIGNvbXBpbGVyCi0JICogdG8gcHJvdmUgdGhlIGNvdW50IHRvIGJlIGluIHJhbmdlLiBGb3IgZXhhbXBsZSB3aGVuIG11bHRpcGxlIGNhbGwKLQkgKiBzaXRlcyBvZiBhIGhlbHBlciBmdW5jdGlvbiAtIHBlcmhhcHMgaW4gZGlmZmVyZW50IHNvdXJjZSBmaWxlcyAtCi0JICogYWxsIGRvaW5nIHByb3BlciByYW5nZSBjaGVja2luZywgeWV0IHRoZSBoZWxwZXIgZnVuY3Rpb24gbm90IGRvaW5nCi0JICogc28gYWdhaW4uCi0JICoKLQkgKiBUaGVyZWZvcmUgbGltaXQgdGhlIGNvbXBpbGUgdGltZSBjaGVja2luZyB0byB0aGUgY29uc3RhbnQgc2l6ZQotCSAqIGNhc2UsIGFuZCBkbyBvbmx5IHJ1bnRpbWUgY2hlY2tpbmcgZm9yIG5vbi1jb25zdGFudCBzaXplcy4KLQkgKi8KLQogCWlmIChsaWtlbHkoc3ogPCAwIHx8IHN6ID49IG4pKSB7CiAJCWNoZWNrX29iamVjdF9zaXplKHRvLCBuLCBmYWxzZSk7CiAJCW4gPSBfY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pOwotCX0gZWxzZSBpZiAoX19idWlsdGluX2NvbnN0YW50X3AobikpCi0JCWNvcHlfZnJvbV91c2VyX292ZXJmbG93KCk7CisJfSBlbHNlIGlmICghX19idWlsdGluX2NvbnN0YW50X3AobikpCisJCWNvcHlfdXNlcl9vdmVyZmxvdyhzeiwgbik7CiAJZWxzZQotCQlfX2NvcHlfZnJvbV91c2VyX292ZXJmbG93KHN6LCBuKTsKKwkJX19iYWRfY29weV91c2VyKCk7CiAKIAlyZXR1cm4gbjsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjaworc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjawogY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewogCWludCBzeiA9IF9fY29tcGlsZXRpbWVfb2JqZWN0X3NpemUoZnJvbSk7CkBAIC03ODEsMjEgKzczOCwxNyBAQAogCiAJbWlnaHRfZmF1bHQoKTsKIAotCS8qIFNlZSB0aGUgY29tbWVudCBpbiBjb3B5X2Zyb21fdXNlcigpIGFib3ZlLiAqLwogCWlmIChsaWtlbHkoc3ogPCAwIHx8IHN6ID49IG4pKSB7CiAJCWNoZWNrX29iamVjdF9zaXplKGZyb20sIG4sIHRydWUpOwogCQluID0gX2NvcHlfdG9fdXNlcih0bywgZnJvbSwgbik7Ci0JfSBlbHNlIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChuKSkKLQkJY29weV90b191c2VyX292ZXJmbG93KCk7CisJfSBlbHNlIGlmICghX19idWlsdGluX2NvbnN0YW50X3AobikpCisJCWNvcHlfdXNlcl9vdmVyZmxvdyhzeiwgbik7CiAJZWxzZQotCQlfX2NvcHlfdG9fdXNlcl9vdmVyZmxvdyhzeiwgbik7CisJCV9fYmFkX2NvcHlfdXNlcigpOwogCiAJcmV0dXJuIG47CiB9CiAKLSN1bmRlZiBfX2NvcHlfZnJvbV91c2VyX292ZXJmbG93Ci0jdW5kZWYgX19jb3B5X3RvX3VzZXJfb3ZlcmZsb3cKLQogLyoKICAqIFdlIHJlbHkgb24gdGhlIG5lc3RlZCBOTUkgd29yayB0byBhbGxvdyBhdG9taWMgZmF1bHRzIGZyb20gdGhlIE5NSSBwYXRoOyB0aGUKICAqIG5lc3RlZCBOTUkgcGF0aHMgYXJlIGNhcmVmdWwgdG8gcHJlc2VydmUgQ1IyLgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdW53aW5kLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91bndpbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGI2ZDFjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdW53aW5kLmgKQEAgLTAsMCArMSw3MyBAQAorI2lmbmRlZiBfQVNNX1g4Nl9VTldJTkRfSAorI2RlZmluZSBfQVNNX1g4Nl9VTldJTkRfSAorCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3N0YWNrdHJhY2UuaD4KKworc3RydWN0IHVud2luZF9zdGF0ZSB7CisJc3RydWN0IHN0YWNrX2luZm8gc3RhY2tfaW5mbzsKKwl1bnNpZ25lZCBsb25nIHN0YWNrX21hc2s7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCWludCBncmFwaF9pZHg7CisjaWZkZWYgQ09ORklHX0ZSQU1FX1BPSU5URVIKKwl1bnNpZ25lZCBsb25nICpicDsKKyNlbHNlCisJdW5zaWduZWQgbG9uZyAqc3A7CisjZW5kaWYKK307CisKK3ZvaWQgX191bndpbmRfc3RhcnQoc3RydWN0IHVud2luZF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nICpmaXJzdF9mcmFtZSk7CisKK2Jvb2wgdW53aW5kX25leHRfZnJhbWUoc3RydWN0IHVud2luZF9zdGF0ZSAqc3RhdGUpOworCitzdGF0aWMgaW5saW5lIGJvb2wgdW53aW5kX2RvbmUoc3RydWN0IHVud2luZF9zdGF0ZSAqc3RhdGUpCit7CisJcmV0dXJuIHN0YXRlLT5zdGFja19pbmZvLnR5cGUgPT0gU1RBQ0tfVFlQRV9VTktOT1dOOworfQorCitzdGF0aWMgaW5saW5lCit2b2lkIHVud2luZF9zdGFydChzdHJ1Y3QgdW53aW5kX3N0YXRlICpzdGF0ZSwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkgIHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nICpmaXJzdF9mcmFtZSkKK3sKKwlmaXJzdF9mcmFtZSA9IGZpcnN0X2ZyYW1lID8gOiBnZXRfc3RhY2tfcG9pbnRlcih0YXNrLCByZWdzKTsKKworCV9fdW53aW5kX3N0YXJ0KHN0YXRlLCB0YXNrLCByZWdzLCBmaXJzdF9mcmFtZSk7Cit9CisKKyNpZmRlZiBDT05GSUdfRlJBTUVfUE9JTlRFUgorCitzdGF0aWMgaW5saW5lCit1bnNpZ25lZCBsb25nICp1bndpbmRfZ2V0X3JldHVybl9hZGRyZXNzX3B0cihzdHJ1Y3QgdW53aW5kX3N0YXRlICpzdGF0ZSkKK3sKKwlpZiAodW53aW5kX2RvbmUoc3RhdGUpKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBzdGF0ZS0+YnAgKyAxOworfQorCit1bnNpZ25lZCBsb25nIHVud2luZF9nZXRfcmV0dXJuX2FkZHJlc3Moc3RydWN0IHVud2luZF9zdGF0ZSAqc3RhdGUpOworCisjZWxzZSAvKiAhQ09ORklHX0ZSQU1FX1BPSU5URVIgKi8KKworc3RhdGljIGlubGluZQordW5zaWduZWQgbG9uZyAqdW53aW5kX2dldF9yZXR1cm5fYWRkcmVzc19wdHIoc3RydWN0IHVud2luZF9zdGF0ZSAqc3RhdGUpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3Vuc2lnbmVkIGxvbmcgdW53aW5kX2dldF9yZXR1cm5fYWRkcmVzcyhzdHJ1Y3QgdW53aW5kX3N0YXRlICpzdGF0ZSkKK3sKKwlpZiAodW53aW5kX2RvbmUoc3RhdGUpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBmdHJhY2VfZ3JhcGhfcmV0X2FkZHIoc3RhdGUtPnRhc2ssICZzdGF0ZS0+Z3JhcGhfaWR4LAorCQkJCSAgICAgKnN0YXRlLT5zcCwgc3RhdGUtPnNwKTsKK30KKworI2VuZGlmIC8qIENPTkZJR19GUkFNRV9QT0lOVEVSICovCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9VTldJTkRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfYmF1LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91di91dl9iYXUuaAppbmRleCBjYzQ0ZDkyLi41N2FiODZkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91di91dl9iYXUuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91di91dl9iYXUuaApAQCAtNDksMTQgKzQ5LDEyIEBACiAjZGVmaW5lIFVWX05FVF9FTkRQT0lOVF9JTlRECQkoaXNfdXYxX2h1YigpID8JCQlcCiAJCQlVVjFfTkVUX0VORFBPSU5UX0lOVEQgOiBVVjJfTkVUX0VORFBPSU5UX0lOVEQpCiAjZGVmaW5lIFVWX0RFU0NfUFNISUZUCQkJNDkKLSNkZWZpbmUgVVZfUEFZTE9BRFFfUE5PREVfU0hJRlQJCTQ5CisjZGVmaW5lIFVWX1BBWUxPQURRX0dOT0RFX1NISUZUCQk0OQogI2RlZmluZSBVVl9QVENfQkFTRU5BTUUJCQkic2dpX3V2L3B0Y19zdGF0aXN0aWNzIgogI2RlZmluZSBVVl9CQVVfQkFTRU5BTUUJCQkic2dpX3V2L2JhdV90dW5hYmxlcyIKICNkZWZpbmUgVVZfQkFVX1RVTkFCTEVTX0RJUgkJInNnaV91diIKICNkZWZpbmUgVVZfQkFVX1RVTkFCTEVTX0ZJTEUJCSJiYXVfdHVuYWJsZXMiCiAjZGVmaW5lIFdISVRFU1BBQ0UJCQkiIFx0XG4iCi0jZGVmaW5lIHV2X21tYXNrCQkJKCgxVUwgPDwgdXZfaHViX2luZm8tPm1fdmFsKSAtIDEpCi0jZGVmaW5lIHV2X3BoeXNub2RlYWRkcih4KQkJKChfX3BhKCh1bnNpZ25lZCBsb25nKSh4KSkgJiB1dl9tbWFzaykpCiAjZGVmaW5lIGNwdWJpdF9pc3NldChjcHUsIGJhdV9sb2NhbF9jcHVtYXNrKSBcCiAJdGVzdF9iaXQoKGNwdSksIChiYXVfbG9jYWxfY3B1bWFzaykuYml0cykKIApAQCAtMzg3LDYgKzM4NSwxNyBAQAogCS8qIGJpdHMgMTI3OjEyMCAqLwogfTsKIAorLyogQWJzdHJhY3RlZCBCQVUgZnVuY3Rpb25zICovCitzdHJ1Y3QgYmF1X29wZXJhdGlvbnMgeworCXVuc2lnbmVkIGxvbmcgKCpyZWFkX2xfc3dfYWNrKSh2b2lkKTsKKwl1bnNpZ25lZCBsb25nICgqcmVhZF9nX3N3X2FjaykoaW50IHBub2RlKTsKKwl1bnNpZ25lZCBsb25nICgqYmF1X2dwYV90b19vZmZzZXQpKHVuc2lnbmVkIGxvbmcgdmFkZHIpOworCXZvaWQgKCp3cml0ZV9sX3N3X2FjaykodW5zaWduZWQgbG9uZyBtbXIpOworCXZvaWQgKCp3cml0ZV9nX3N3X2FjaykoaW50IHBub2RlLCB1bnNpZ25lZCBsb25nIG1tcik7CisJdm9pZCAoKndyaXRlX3BheWxvYWRfZmlyc3QpKGludCBwbm9kZSwgdW5zaWduZWQgbG9uZyBtbXIpOworCXZvaWQgKCp3cml0ZV9wYXlsb2FkX2xhc3QpKGludCBwbm9kZSwgdW5zaWduZWQgbG9uZyBtbXIpOworfTsKKwogLyoKICAqIFRoZSBhY3RpdmF0aW9uIGRlc2NyaXB0b3I6CiAgKiBUaGUgZm9ybWF0IG9mIHRoZSBtZXNzYWdlIHRvIHNlbmQsIHBsdXMgYWxsIGFjY29tcGFueWluZyBjb250cm9sCkBAIC02NTUsNiArNjY0LDE2IEBACiAJd3JpdGVfZ21tcihwbm9kZSwgVVZIX0xCX0JBVV9TQl9BQ1RJVkFUSU9OX0NPTlRST0wsIG1tcl9pbWFnZSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9tbXJfcHJvY19wYXlsb2FkX2ZpcnN0KGludCBwbm9kZSwgdW5zaWduZWQgbG9uZyBtbXJfaW1hZ2UpCit7CisJd3JpdGVfZ21tcihwbm9kZSwgVVY0SF9MQl9QUk9DX0lOVERfUVVFVUVfRklSU1QsIG1tcl9pbWFnZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9tbXJfcHJvY19wYXlsb2FkX2xhc3QoaW50IHBub2RlLCB1bnNpZ25lZCBsb25nIG1tcl9pbWFnZSkKK3sKKwl3cml0ZV9nbW1yKHBub2RlLCBVVjRIX0xCX1BST0NfSU5URF9RVUVVRV9MQVNULCBtbXJfaW1hZ2UpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfbW1yX3BheWxvYWRfZmlyc3QoaW50IHBub2RlLCB1bnNpZ25lZCBsb25nIG1tcl9pbWFnZSkKIHsKIAl3cml0ZV9nbW1yKHBub2RlLCBVVkhfTEJfQkFVX0lOVERfUEFZTE9BRF9RVUVVRV9GSVJTVCwgbW1yX2ltYWdlKTsKQEAgLTcwMCw2ICs3MTksMjYgQEAKIAlyZXR1cm4gcmVhZF9nbW1yKHBub2RlLCBVVkhfTEJfQkFVX0lOVERfU09GVFdBUkVfQUNLTk9XTEVER0UpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfbW1yX3Byb2Nfc3dfYWNrKHVuc2lnbmVkIGxvbmcgbXIpCit7CisJdXZfd3JpdGVfbG9jYWxfbW1yKFVWNEhfTEJfUFJPQ19JTlREX1NPRlRfQUNLX0NMRUFSLCBtcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9nbW1yX3Byb2Nfc3dfYWNrKGludCBwbm9kZSwgdW5zaWduZWQgbG9uZyBtcikKK3sKKwl3cml0ZV9nbW1yKHBub2RlLCBVVjRIX0xCX1BST0NfSU5URF9TT0ZUX0FDS19DTEVBUiwgbXIpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcmVhZF9tbXJfcHJvY19zd19hY2sodm9pZCkKK3sKKwlyZXR1cm4gcmVhZF9sbW1yKFVWNEhfTEJfUFJPQ19JTlREX1NPRlRfQUNLX1BFTkRJTkcpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcmVhZF9nbW1yX3Byb2Nfc3dfYWNrKGludCBwbm9kZSkKK3sKKwlyZXR1cm4gcmVhZF9nbW1yKHBub2RlLCBVVjRIX0xCX1BST0NfSU5URF9TT0ZUX0FDS19QRU5ESU5HKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX21tcl9kYXRhX2NvbmZpZyhpbnQgcG5vZGUsIHVuc2lnbmVkIGxvbmcgbXIpCiB7CiAJdXZfd3JpdGVfZ2xvYmFsX21tcjY0KHBub2RlLCBVVkhfQkFVX0RBVEFfQ09ORklHLCBtcik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92ZHNvLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92ZHNvLmgKaW5kZXggNDNkYzU1Yi4uMjQ0NDE4OSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdmRzby5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Zkc28uaApAQCAtNDEsNiArNDEsOCBAQAogCiBleHRlcm4gdm9pZCBfX2luaXQgaW5pdF92ZHNvX2ltYWdlKGNvbnN0IHN0cnVjdCB2ZHNvX2ltYWdlICppbWFnZSk7CiAKK2V4dGVybiBpbnQgbWFwX3Zkc29fb25jZShjb25zdCBzdHJ1Y3QgdmRzb19pbWFnZSAqaW1hZ2UsIHVuc2lnbmVkIGxvbmcgYWRkcik7CisKICNlbmRpZiAvKiBfX0FTU0VNQkxFUl9fICovCiAKICNlbmRpZiAvKiBfQVNNX1g4Nl9WRFNPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hlbi9ldmVudHMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hlbi9ldmVudHMuaAppbmRleCBlNjkxMWNhLi42MDhhNzlkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94ZW4vZXZlbnRzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL2V2ZW50cy5oCkBAIC0yMCwxNSArMjAsNCBAQAogLyogTm8gbmVlZCBmb3IgYSBiYXJyaWVyIC0tIFhDSEcgaXMgYSBiYXJyaWVyIG9uIHg4Ni4gKi8KICNkZWZpbmUgeGNoZ194ZW5fdWxvbmcocHRyLCB2YWwpIHhjaGcoKHB0ciksICh2YWwpKQogCi1leHRlcm4gaW50IHhlbl9oYXZlX3ZlY3Rvcl9jYWxsYmFjazsKLQotLyoKLSAqIEV2ZW50cyBkZWxpdmVyZWQgdmlhIHBsYXRmb3JtIFBDSSBpbnRlcnJ1cHRzIGFyZSBhbHdheXMKLSAqIHJvdXRlZCB0byB2Y3B1IDAgYW5kIGhlbmNlIGNhbm5vdCBiZSByZWJvdW5kLgotICovCi1zdGF0aWMgaW5saW5lIGJvb2wgeGVuX3N1cHBvcnRfZXZ0Y2huX3JlYmluZCh2b2lkKQotewotCXJldHVybiAoIXhlbl9odm1fZG9tYWluKCkgfHwgeGVuX2hhdmVfdmVjdG9yX2NhbGxiYWNrKTsKLX0KLQogI2VuZGlmIC8qIF9BU01fWDg2X1hFTl9FVkVOVFNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9tY2UuaCBiL2FyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vbWNlLmgKaW5kZXggMjE4NDk0My4uNjlhNmUwNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9tY2UuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL3VhcGkvYXNtL21jZS5oCkBAIC0yNiw2ICsyNiw4IEBACiAJX191MzIgc29ja2V0aWQ7CS8qIENQVSBzb2NrZXQgSUQgKi8KIAlfX3UzMiBhcGljaWQ7CS8qIENQVSBpbml0aWFsIGFwaWMgSUQgKi8KIAlfX3U2NCBtY2djYXA7CS8qIE1DR0NBUCBNU1I6IG1hY2hpbmUgY2hlY2sgY2FwYWJpbGl0aWVzIG9mIENQVSAqLworCV9fdTY0IHN5bmQ7CS8qIE1DQV9TWU5EIE1TUjogb25seSB2YWxpZCBvbiBTTUNBIHN5c3RlbXMgKi8KKwlfX3U2NCBpcGlkOwkvKiBNQ0FfSVBJRCBNU1I6IG9ubHkgdmFsaWQgb24gU01DQSBzeXN0ZW1zICovCiB9OwogCiAjZGVmaW5lIE1DRV9HRVRfUkVDT1JEX0xFTiAgIF9JT1IoJ00nLCAxLCBpbnQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL3VhcGkvYXNtL3ByY3RsLmggYi9hcmNoL3g4Ni9pbmNsdWRlL3VhcGkvYXNtL3ByY3RsLmgKaW5kZXggM2FjNTAzMi4uYWUxMzVkZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9wcmN0bC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vcHJjdGwuaApAQCAtNiw0ICs2LDEwIEBACiAjZGVmaW5lIEFSQ0hfR0VUX0ZTIDB4MTAwMwogI2RlZmluZSBBUkNIX0dFVF9HUyAweDEwMDQKIAorI2lmZGVmIENPTkZJR19DSEVDS1BPSU5UX1JFU1RPUkUKKyMgZGVmaW5lIEFSQ0hfTUFQX1ZEU09fWDMyCTB4MjAwMQorIyBkZWZpbmUgQVJDSF9NQVBfVkRTT18zMgkweDIwMDIKKyMgZGVmaW5lIEFSQ0hfTUFQX1ZEU09fNjQJMHgyMDAzCisjZW5kaWYKKwogI2VuZGlmIC8qIF9BU01fWDg2X1BSQ1RMX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gveDg2L2tlcm5lbC9NYWtlZmlsZQppbmRleCAwNTAzZjViLi40NTI1N2NmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYva2VybmVsL01ha2VmaWxlCkBAIC0xMjUsNiArMTI1LDEyIEBACiBvYmotJChDT05GSUdfUEVSRl9FVkVOVFMpCQkrPSBwZXJmX3JlZ3Mubwogb2JqLSQoQ09ORklHX1RSQUNJTkcpCQkJKz0gdHJhY2Vwb2ludC5vCiAKK2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCitvYmoteQkJCQkJKz0gdW53aW5kX2ZyYW1lLm8KK2Vsc2UKK29iai15CQkJCQkrPSB1bndpbmRfZ3Vlc3MubworZW5kaWYKKwogIyMjCiAjIDY0IGJpdCBzcGVjaWZpYyBmaWxlcwogaWZlcSAoJChDT05GSUdfWDg2XzY0KSx5KQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FjcGkvTWFrZWZpbGUgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9NYWtlZmlsZQppbmRleCAzMjQyZTU5Li4yNmI3OGQ4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9NYWtlZmlsZQpAQCAtMSw2ICsxLDcgQEAKIG9iai0kKENPTkZJR19BQ1BJKQkJKz0gYm9vdC5vCiBvYmotJChDT05GSUdfQUNQSV9TTEVFUCkJKz0gc2xlZXAubyB3YWtldXBfJChCSVRTKS5vCiBvYmotJChDT05GSUdfQUNQSV9BUEVJKQkJKz0gYXBlaS5vCitvYmotJChDT05GSUdfQUNQSV9DUFBDX0xJQikJKz0gY3BwY19tc3IubwogCiBpZm5lcSAoJChDT05GSUdfQUNQSV9QUk9DRVNTT1IpLCkKIG9iai15CQkJCSs9IGNzdGF0ZS5vCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9ib290LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9ib290LmMKaW5kZXggOTBkODRjMy4uMzJhN2Q3MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FjcGkvYm9vdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hY3BpL2Jvb3QuYwpAQCAtMTc2LDE1ICsxNzYsMTAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKCFlbmFibGVkKSB7Ci0JCSsrZGlzYWJsZWRfY3B1czsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJaWYgKGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCAhPSAtMVUpCi0JCXZlciA9IGFwaWNfdmVyc2lvbltib290X2NwdV9waHlzaWNhbF9hcGljaWRdOworCQl2ZXIgPSBib290X2NwdV9hcGljX3ZlcnNpb247CiAKLQljcHUgPSBnZW5lcmljX3Byb2Nlc3Nvcl9pbmZvKGlkLCB2ZXIpOworCWNwdSA9IF9fZ2VuZXJpY19wcm9jZXNzb3JfaW5mbyhpZCwgdmVyLCBlbmFibGVkKTsKIAlpZiAoY3B1ID49IDApCiAJCWVhcmx5X3Blcl9jcHUoeDg2X2NwdV90b19hY3BpaWQsIGNwdSkgPSBhY3BpaWQ7CiAKQEAgLTI4Miw2ICsyNzcsOCBAQAogCWlmIChCQURfTUFEVF9FTlRSWShsYXBpY19hZGRyX292ciwgZW5kKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlhY3BpX3RhYmxlX3ByaW50X21hZHRfZW50cnkoaGVhZGVyKTsKKwogCWFjcGlfbGFwaWNfYWRkciA9IGxhcGljX2FkZHJfb3ZyLT5hZGRyZXNzOwogCiAJcmV0dXJuIDA7CkBAIC03MDUsNyArNzAyLDcgQEAKICNpZmRlZiBDT05GSUdfQUNQSV9IT1RQTFVHX0NQVQogI2luY2x1ZGUgPGFjcGkvcHJvY2Vzc29yLmg+CiAKLXN0YXRpYyB2b2lkIGFjcGlfbWFwX2NwdTJub2RlKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IGNwdSwgaW50IHBoeXNpZCkKK2ludCBhY3BpX21hcF9jcHUybm9kZShhY3BpX2hhbmRsZSBoYW5kbGUsIGludCBjcHUsIGludCBwaHlzaWQpCiB7CiAjaWZkZWYgQ09ORklHX0FDUElfTlVNQQogCWludCBuaWQ7CkBAIC03MTYsNiArNzEzLDcgQEAKIAkJbnVtYV9zZXRfbm9kZShjcHUsIG5pZCk7CiAJfQogI2VuZGlmCisJcmV0dXJuIDA7CiB9CiAKIGludCBhY3BpX21hcF9jcHUoYWNwaV9oYW5kbGUgaGFuZGxlLCBwaHlzX2NwdWlkX3QgcGh5c2lkLCBpbnQgKnBjcHUpCkBAIC05OTgsMjEgKzk5Niw2IEBACiAJaWYgKCFib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQVBJQykpCiAJCXJldHVybiAtRU5PREVWOwogCi0JLyoKLQkgKiBOb3RlIHRoYXQgdGhlIExBUElDIGFkZHJlc3MgaXMgb2J0YWluZWQgZnJvbSB0aGUgTUFEVCAoMzItYml0IHZhbHVlKQotCSAqIGFuZCAob3B0aW9uYWxseSkgb3ZlcnJpZGRlbiBieSBhIExBUElDX0FERFJfT1ZSIGVudHJ5ICg2NC1iaXQgdmFsdWUpLgotCSAqLwotCi0JY291bnQgPSBhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX1RZUEVfTE9DQUxfQVBJQ19PVkVSUklERSwKLQkJCQkgICAgICBhY3BpX3BhcnNlX2xhcGljX2FkZHJfb3ZyLCAwKTsKLQlpZiAoY291bnQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQUkVGSVgKLQkJICAgICAgICJFcnJvciBwYXJzaW5nIExBUElDIGFkZHJlc3Mgb3ZlcnJpZGUgZW50cnlcbiIpOwotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JcmVnaXN0ZXJfbGFwaWNfYWRkcmVzcyhhY3BpX2xhcGljX2FkZHIpOwotCiAJY291bnQgPSBhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX1RZUEVfTE9DQUxfU0FQSUMsCiAJCQkJICAgICAgYWNwaV9wYXJzZV9zYXBpYywgTUFYX0xPQ0FMX0FQSUMpOwogCkBAIC0xMDMxLDggKzEwMTQsOCBAQAogCQkJcmV0dXJuIHJldDsKIAkJfQogCi0JCXgyY291bnQgPSBtYWR0X3Byb2NbMF0uY291bnQ7Ci0JCWNvdW50ID0gbWFkdF9wcm9jWzFdLmNvdW50OworCQljb3VudCA9IG1hZHRfcHJvY1swXS5jb3VudDsKKwkJeDJjb3VudCA9IG1hZHRfcHJvY1sxXS5jb3VudDsKIAl9CiAJaWYgKCFjb3VudCAmJiAheDJjb3VudCkgewogCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJObyBMQVBJQyBlbnRyaWVzIHByZXNlbnRcbiIpOwpAQCAtMTUxMyw3ICsxNDk2LDcgQEAKIAkgKiBJZiBhY3BpX2Rpc2FibGVkLCBiYWlsIG91dAogCSAqLwogCWlmIChhY3BpX2Rpc2FibGVkKQotCQlyZXR1cm47IAorCQlyZXR1cm47CiAKIAkvKgogCSAqIEluaXRpYWxpemUgdGhlIEFDUEkgYm9vdC10aW1lIHRhYmxlIHBhcnNlci4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL2NwcGNfbXNyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9jcHBjX21zci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYjQ3OGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9jcHBjX21zci5jCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBjcHBjX21zci5jOiAgTVNSIEludGVyZmFjZSBmb3IgQ1BQQworICogQ29weXJpZ2h0IChjKSAyMDE2LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxhY3BpL2NwcGNfYWNwaS5oPgorI2luY2x1ZGUgPGFzbS9tc3IuaD4KKworLyogUmVmZXIgdG8gZHJpdmVycy9hY3BpL2NwcGNfYWNwaS5jIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgZnVuY3Rpb25zICovCisKK2Jvb2wgY3BjX2ZmaF9zdXBwb3J0ZWQodm9pZCkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKworaW50IGNwY19yZWFkX2ZmaChpbnQgY3B1bnVtLCBzdHJ1Y3QgY3BjX3JlZyAqcmVnLCB1NjQgKnZhbCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcmRtc3JsX3NhZmVfb25fY3B1KGNwdW51bSwgcmVnLT5hZGRyZXNzLCB2YWwpOworCWlmICghZXJyKSB7CisJCXU2NCBtYXNrID0gR0VOTUFTS19VTEwocmVnLT5iaXRfb2Zmc2V0ICsgcmVnLT5iaXRfd2lkdGggLSAxLAorCQkJCSAgICAgICByZWctPmJpdF9vZmZzZXQpOworCisJCSp2YWwgJj0gbWFzazsKKwkJKnZhbCA+Pj0gcmVnLT5iaXRfb2Zmc2V0OworCX0KKwlyZXR1cm4gZXJyOworfQorCitpbnQgY3BjX3dyaXRlX2ZmaChpbnQgY3B1bnVtLCBzdHJ1Y3QgY3BjX3JlZyAqcmVnLCB1NjQgdmFsKQoreworCXU2NCByZF92YWw7CisJaW50IGVycjsKKworCWVyciA9IHJkbXNybF9zYWZlX29uX2NwdShjcHVudW0sIHJlZy0+YWRkcmVzcywgJnJkX3ZhbCk7CisJaWYgKCFlcnIpIHsKKwkJdTY0IG1hc2sgPSBHRU5NQVNLX1VMTChyZWctPmJpdF9vZmZzZXQgKyByZWctPmJpdF93aWR0aCAtIDEsCisJCQkJICAgICAgIHJlZy0+Yml0X29mZnNldCk7CisKKwkJdmFsIDw8PSByZWctPmJpdF9vZmZzZXQ7CisJCXZhbCAmPSBtYXNrOworCQlyZF92YWwgJj0gfm1hc2s7CisJCXJkX3ZhbCB8PSB2YWw7CisJCWVyciA9IHdybXNybF9zYWZlX29uX2NwdShjcHVudW0sIHJlZy0+YWRkcmVzcywgcmRfdmFsKTsKKwl9CisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL3NsZWVwLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9zbGVlcC5jCmluZGV4IGFkYjNlYWYuLjQ4NTg3MzMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL3NsZWVwLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FjcGkvc2xlZXAuYwpAQCAtOTksNyArOTksNyBAQAogCXNhdmVkX21hZ2ljID0gMHgxMjM0NTY3ODsKICNlbHNlIC8qIENPTkZJR182NEJJVCAqLwogI2lmZGVmIENPTkZJR19TTVAKLQlzdGFja19zdGFydCA9ICh1bnNpZ25lZCBsb25nKXRlbXBfc3RhY2sgKyBzaXplb2YodGVtcF9zdGFjayk7CisJaW5pdGlhbF9zdGFjayA9ICh1bnNpZ25lZCBsb25nKXRlbXBfc3RhY2sgKyBzaXplb2YodGVtcF9zdGFjayk7CiAJZWFybHlfZ2R0X2Rlc2NyLmFkZHJlc3MgPQogCQkJKHVuc2lnbmVkIGxvbmcpZ2V0X2NwdV9nZHRfdGFibGUoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAlpbml0aWFsX2dzID0gcGVyX2NwdV9vZmZzZXQoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWMuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWMuYwppbmRleCBjZWE0ZmMxLi5mMjY2YjhhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpYy5jCkBAIC02NCw2ICs2NCw4IEBACiB1bnNpZ25lZCBpbnQgYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID0gLTFVOwogRVhQT1JUX1NZTUJPTF9HUEwoYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkKTsKIAordTggYm9vdF9jcHVfYXBpY192ZXJzaW9uOworCiAvKgogICogVGhlIGhpZ2hlc3QgQVBJQyBJRCBzZWVuIGR1cmluZyBlbnVtZXJhdGlvbi4KICAqLwpAQCAtMTM3NCw3ICsxMzc2LDYgQEAKIAkgKiBBY3R1YWxseSBkaXNhYmxpbmcgdGhlIGZvY3VzIENQVSBjaGVjayBqdXN0IG1ha2VzIHRoZSBoYW5nIGxlc3MKIAkgKiBmcmVxdWVudCBhcyBpdCBtYWtlcyB0aGUgaW50ZXJydXB0IGRpc3RyaWJ1dG9uIG1vZGVsIGJlIG1vcmUKIAkgKiBsaWtlIExSVSB0aGFuIE1SVSAodGhlIHNob3J0LXRlcm0gbG9hZCBpcyBtb3JlIGV2ZW4gYWNyb3NzIENQVXMpLgotCSAqIFNlZSBhbHNvIHRoZSBjb21tZW50IGluIGVuZF9sZXZlbF9pb2FwaWNfaXJxKCkuICAtLW1hY3JvCiAJICovCiAKIAkvKgpAQCAtMTYyMyw2ICsxNjI0LDkgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQsIGlyX3N0YXQ7CiAKKwlpZiAoc2tpcF9pb2FwaWNfc2V0dXApCisJCXJldHVybjsKKwogCWlyX3N0YXQgPSBpcnFfcmVtYXBwaW5nX3ByZXBhcmUoKTsKIAlpZiAoaXJfc3RhdCA8IDAgJiYgIXgyYXBpY19zdXBwb3J0ZWQoKSkKIAkJcmV0dXJuOwpAQCAtMTgxMyw4ICsxODE3LDcgQEAKIAkJICogc2luY2Ugc21wX3Nhbml0eV9jaGVjayBpcyBwcmVwYXJlZCBmb3Igc3VjaCBhIGNhc2UKIAkJICogYW5kIGRpc2FibGUgc21wIG1vZGUKIAkJICovCi0JCWFwaWNfdmVyc2lvbltuZXdfYXBpY2lkXSA9Ci0JCQkgR0VUX0FQSUNfVkVSU0lPTihhcGljX3JlYWQoQVBJQ19MVlIpKTsKKwkJYm9vdF9jcHVfYXBpY192ZXJzaW9uID0gR0VUX0FQSUNfVkVSU0lPTihhcGljX3JlYWQoQVBJQ19MVlIpKTsKIAl9CiB9CiAKQEAgLTE4MjUsMTcgKzE4MjgsMTQgQEAKIAlpZiAoIXgyYXBpY19tb2RlKSB7CiAJCXNldF9maXhtYXBfbm9jYWNoZShGSVhfQVBJQ19CQVNFLCBhZGRyZXNzKTsKIAkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAibWFwcGVkIEFQSUMgdG8gJTE2bHggKCUxNmx4KVxuIiwKLQkJCSAgICBBUElDX0JBU0UsIG1wX2xhcGljX2FkZHIpOworCQkJICAgIEFQSUNfQkFTRSwgYWRkcmVzcyk7CiAJfQogCWlmIChib290X2NwdV9waHlzaWNhbF9hcGljaWQgPT0gLTFVKSB7CiAJCWJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCAgPSByZWFkX2FwaWNfaWQoKTsKLQkJYXBpY192ZXJzaW9uW2Jvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZF0gPQotCQkJIEdFVF9BUElDX1ZFUlNJT04oYXBpY19yZWFkKEFQSUNfTFZSKSk7CisJCWJvb3RfY3B1X2FwaWNfdmVyc2lvbiA9IEdFVF9BUElDX1ZFUlNJT04oYXBpY19yZWFkKEFQSUNfTFZSKSk7CiAJfQogfQogCi1pbnQgYXBpY192ZXJzaW9uW01BWF9MT0NBTF9BUElDXTsKLQogLyoKICAqIExvY2FsIEFQSUMgaW50ZXJydXB0cwogICovCkBAIC0yMDI0LDcgKzIwMjQsNTMgQEAKIAlhcGljX3dyaXRlKEFQSUNfTFZUMSwgdmFsdWUpOwogfQogCi1pbnQgZ2VuZXJpY19wcm9jZXNzb3JfaW5mbyhpbnQgYXBpY2lkLCBpbnQgdmVyc2lvbikKKy8qCisgKiBUaGUgbnVtYmVyIG9mIGFsbG9jYXRlZCBsb2dpY2FsIENQVSBJRHMuIFNpbmNlIGxvZ2ljYWwgQ1BVIElEcyBhcmUgYWxsb2NhdGVkCisgKiBjb250aWd1b3VzbHksIGl0IGVxdWFscyB0byBjdXJyZW50IGFsbG9jYXRlZCBtYXggbG9naWNhbCBDUFUgSUQgcGx1cyAxLgorICogQWxsIGFsbG9jYXRlZCBDUFUgSUQgc2hvdWxkIGJlIGluIFswLCBucl9sb2dpY2FsX2NwdWlkaSksIHNvIHRoZSBtYXhpbXVtIG9mCisgKiBucl9sb2dpY2FsX2NwdWlkcyBpcyBucl9jcHVfaWRzLgorICoKKyAqIE5PVEU6IFJlc2VydmUgMCBmb3IgQlNQLgorICovCitzdGF0aWMgaW50IG5yX2xvZ2ljYWxfY3B1aWRzID0gMTsKKworLyoKKyAqIFVzZWQgdG8gc3RvcmUgbWFwcGluZyBiZXR3ZWVuIGxvZ2ljYWwgQ1BVIElEcyBhbmQgQVBJQyBJRHMuCisgKi8KK3N0YXRpYyBpbnQgY3B1aWRfdG9fYXBpY2lkW10gPSB7CisJWzAgLi4uIE5SX0NQVVMgLSAxXSA9IC0xLAorfTsKKworLyoKKyAqIFNob3VsZCB1c2UgdGhpcyBBUEkgdG8gYWxsb2NhdGUgbG9naWNhbCBDUFUgSURzIHRvIGtlZXAgbnJfbG9naWNhbF9jcHVpZHMKKyAqIGFuZCBjcHVpZF90b19hcGljaWRbXSBzeW5jaHJvbml6ZWQuCisgKi8KK3N0YXRpYyBpbnQgYWxsb2NhdGVfbG9naWNhbF9jcHVpZChpbnQgYXBpY2lkKQoreworCWludCBpOworCisJLyoKKwkgKiBjcHVpZCA8LT4gYXBpY2lkIG1hcHBpbmcgaXMgcGVyc2lzdGVudCwgc28gd2hlbiBhIGNwdSBpcyB1cCwKKwkgKiBjaGVjayBpZiB0aGUga2VybmVsIGhhcyBhbGxvY2F0ZWQgYSBjcHVpZCBmb3IgaXQuCisJICovCisJZm9yIChpID0gMDsgaSA8IG5yX2xvZ2ljYWxfY3B1aWRzOyBpKyspIHsKKwkJaWYgKGNwdWlkX3RvX2FwaWNpZFtpXSA9PSBhcGljaWQpCisJCQlyZXR1cm4gaTsKKwl9CisKKwkvKiBBbGxvY2F0ZSBhIG5ldyBjcHVpZC4gKi8KKwlpZiAobnJfbG9naWNhbF9jcHVpZHMgPj0gbnJfY3B1X2lkcykgeworCQlXQVJOX09OQ0UoMSwgIk9ubHkgJWQgcHJvY2Vzc29ycyBzdXBwb3J0ZWQuIgorCQkJICAgICAiUHJvY2Vzc29yICVkLzB4JXggYW5kIHRoZSByZXN0IGFyZSBpZ25vcmVkLlxuIiwKKwkJCSAgICAgbnJfY3B1X2lkcyAtIDEsIG5yX2xvZ2ljYWxfY3B1aWRzLCBhcGljaWQpOworCQlyZXR1cm4gLTE7CisJfQorCisJY3B1aWRfdG9fYXBpY2lkW25yX2xvZ2ljYWxfY3B1aWRzXSA9IGFwaWNpZDsKKwlyZXR1cm4gbnJfbG9naWNhbF9jcHVpZHMrKzsKK30KKworaW50IF9fZ2VuZXJpY19wcm9jZXNzb3JfaW5mbyhpbnQgYXBpY2lkLCBpbnQgdmVyc2lvbiwgYm9vbCBlbmFibGVkKQogewogCWludCBjcHUsIG1heCA9IG5yX2NwdV9pZHM7CiAJYm9vbCBib290X2NwdV9kZXRlY3RlZCA9IHBoeXNpZF9pc3NldChib290X2NwdV9waHlzaWNhbF9hcGljaWQsCkBAIC0yMDkwLDcgKzIxMzYsNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQludW1fcHJvY2Vzc29ycysrOwogCWlmIChhcGljaWQgPT0gYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkKSB7CiAJCS8qCiAJCSAqIHg4Nl9iaW9zX2NwdV9hcGljaWQgaXMgcmVxdWlyZWQgdG8gaGF2ZSBwcm9jZXNzb3JzIGxpc3RlZApAQCAtMjEwMCw4ICsyMTQ1LDE2IEBACiAJCSAqIGZvciBCU1AuCiAJCSAqLwogCQljcHUgPSAwOwotCX0gZWxzZQotCQljcHUgPSBjcHVtYXNrX25leHRfemVybygtMSwgY3B1X3ByZXNlbnRfbWFzayk7CisKKwkJLyogTG9naWNhbCBjcHVpZCAwIGlzIHJlc2VydmVkIGZvciBCU1AuICovCisJCWNwdWlkX3RvX2FwaWNpZFswXSA9IGFwaWNpZDsKKwl9IGVsc2UgeworCQljcHUgPSBhbGxvY2F0ZV9sb2dpY2FsX2NwdWlkKGFwaWNpZCk7CisJCWlmIChjcHUgPCAwKSB7CisJCQlkaXNhYmxlZF9jcHVzKys7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KIAogCS8qCiAJICogVGhpcyBjYW4gaGFwcGVuIG9uIHBoeXNpY2FsIGhvdHBsdWcuIFRoZSBzYW5pdHkgY2hlY2sgYXQgYm9vdCB0aW1lCkBAIC0yMTEzLDYgKzIxNjYsNyBAQAogCiAJCXByX3dhcm5pbmcoIkFQSUM6IFBhY2thZ2UgbGltaXQgcmVhY2hlZC4gUHJvY2Vzc29yICVkLzB4JXggaWdub3JlZC5cbiIsCiAJCQkgICB0aGlzY3B1LCBhcGljaWQpOworCiAJCWRpc2FibGVkX2NwdXMrKzsKIAkJcmV0dXJuIC1FTk9TUEM7CiAJfQpAQCAtMjEyNSwxNCArMjE3OSwxMiBAQAogCQkJICAgY3B1LCBhcGljaWQpOwogCQl2ZXJzaW9uID0gMHgxMDsKIAl9Ci0JYXBpY192ZXJzaW9uW2FwaWNpZF0gPSB2ZXJzaW9uOwogCi0JaWYgKHZlcnNpb24gIT0gYXBpY192ZXJzaW9uW2Jvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZF0pIHsKKwlpZiAodmVyc2lvbiAhPSBib290X2NwdV9hcGljX3ZlcnNpb24pIHsKIAkJcHJfd2FybmluZygiQklPUyBidWc6IEFQSUMgdmVyc2lvbiBtaXNtYXRjaCwgYm9vdCBDUFU6ICV4LCBDUFUgJWQ6IHZlcnNpb24gJXhcbiIsCi0JCQlhcGljX3ZlcnNpb25bYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkXSwgY3B1LCB2ZXJzaW9uKTsKKwkJCWJvb3RfY3B1X2FwaWNfdmVyc2lvbiwgY3B1LCB2ZXJzaW9uKTsKIAl9CiAKLQlwaHlzaWRfc2V0KGFwaWNpZCwgcGh5c19jcHVfcHJlc2VudF9tYXApOwogCWlmIChhcGljaWQgPiBtYXhfcGh5c2ljYWxfYXBpY2lkKQogCQltYXhfcGh5c2ljYWxfYXBpY2lkID0gYXBpY2lkOwogCkBAIC0yMTQ1LDExICsyMTk3LDIzIEBACiAJCWFwaWMtPng4Nl8zMl9lYXJseV9sb2dpY2FsX2FwaWNpZChjcHUpOwogI2VuZGlmCiAJc2V0X2NwdV9wb3NzaWJsZShjcHUsIHRydWUpOwotCXNldF9jcHVfcHJlc2VudChjcHUsIHRydWUpOworCisJaWYgKGVuYWJsZWQpIHsKKwkJbnVtX3Byb2Nlc3NvcnMrKzsKKwkJcGh5c2lkX3NldChhcGljaWQsIHBoeXNfY3B1X3ByZXNlbnRfbWFwKTsKKwkJc2V0X2NwdV9wcmVzZW50KGNwdSwgdHJ1ZSk7CisJfSBlbHNlIHsKKwkJZGlzYWJsZWRfY3B1cysrOworCX0KIAogCXJldHVybiBjcHU7CiB9CiAKK2ludCBnZW5lcmljX3Byb2Nlc3Nvcl9pbmZvKGludCBhcGljaWQsIGludCB2ZXJzaW9uKQoreworCXJldHVybiBfX2dlbmVyaWNfcHJvY2Vzc29yX2luZm8oYXBpY2lkLCB2ZXJzaW9uLCB0cnVlKTsKK30KKwogaW50IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCh2b2lkKQogewogCXJldHVybiByZWFkX2FwaWNfaWQoKTsKQEAgLTIyNzIsNyArMjMzNiw3IEBACiAJICogQ29tcGxhaW4gaWYgdGhlIEJJT1MgcHJldGVuZHMgdGhlcmUgaXMgb25lLgogCSAqLwogCWlmICghYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0FQSUMpICYmCi0JICAgIEFQSUNfSU5URUdSQVRFRChhcGljX3ZlcnNpb25bYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkXSkpIHsKKwkgICAgQVBJQ19JTlRFR1JBVEVEKGJvb3RfY3B1X2FwaWNfdmVyc2lvbikpIHsKIAkJcHJfZXJyKCJCSU9TIGJ1ZywgbG9jYWwgQVBJQyAweCV4IG5vdCBkZXRlY3RlZCEuLi5cbiIsCiAJCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQpOwogCQlyZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX2ZsYXRfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfZmxhdF82NC5jCmluZGV4IDViMmFlMTAuLmE0ZDdmZjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfZmxhdF82NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfZmxhdF82NC5jCkBAIC0yNSw3ICsyNSw3IEBACiBzdGF0aWMgc3RydWN0IGFwaWMgYXBpY19waHlzZmxhdDsKIHN0YXRpYyBzdHJ1Y3QgYXBpYyBhcGljX2ZsYXQ7CiAKLXN0cnVjdCBhcGljIF9fcmVhZF9tb3N0bHkgKmFwaWMgPSAmYXBpY19mbGF0Oworc3RydWN0IGFwaWMgKmFwaWMgX19yb19hZnRlcl9pbml0ID0gJmFwaWNfZmxhdDsKIEVYUE9SVF9TWU1CT0xfR1BMKGFwaWMpOwogCiBzdGF0aWMgaW50IGZsYXRfYWNwaV9tYWR0X29lbV9jaGVjayhjaGFyICpvZW1faWQsIGNoYXIgKm9lbV90YWJsZV9pZCkKQEAgLTExNiwyNyArMTE2LDE3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZmxhdF9nZXRfYXBpY19pZCh1bnNpZ25lZCBsb25nIHgpCiB7Ci0JdW5zaWduZWQgaW50IGlkOwotCi0JaWQgPSAoKCh4KT4+MjQpICYgMHhGRnUpOwotCi0JcmV0dXJuIGlkOworCXJldHVybiAoeCA+PiAyNCkgJiAweEZGOwogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzZXRfYXBpY19pZCh1bnNpZ25lZCBpbnQgaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyB4OwotCi0JeCA9ICgoaWQgJiAweEZGdSk8PDI0KTsKLQlyZXR1cm4geDsKKwlyZXR1cm4gKGlkICYgMHhGRikgPDwgMjQ7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcmVhZF94YXBpY19pZCh2b2lkKQogewotCXVuc2lnbmVkIGludCBpZDsKLQotCWlkID0gZmxhdF9nZXRfYXBpY19pZChhcGljX3JlYWQoQVBJQ19JRCkpOwotCXJldHVybiBpZDsKKwlyZXR1cm4gZmxhdF9nZXRfYXBpY19pZChhcGljX3JlYWQoQVBJQ19JRCkpOwogfQogCiBzdGF0aWMgaW50IGZsYXRfYXBpY19pZF9yZWdpc3RlcmVkKHZvaWQpCkBAIC0xNTQsNyArMTQ0LDcgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBhcGljIGFwaWNfZmxhdCA9ICB7CitzdGF0aWMgc3RydWN0IGFwaWMgYXBpY19mbGF0IF9fcm9fYWZ0ZXJfaW5pdCA9IHsKIAkubmFtZQkJCQk9ICJmbGF0IiwKIAkucHJvYmUJCQkJPSBmbGF0X3Byb2JlLAogCS5hY3BpX21hZHRfb2VtX2NoZWNrCQk9IGZsYXRfYWNwaV9tYWR0X29lbV9jaGVjaywKQEAgLTI0OCw3ICsyMzgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGFwaWMgYXBpY19waHlzZmxhdCA9ICB7CitzdGF0aWMgc3RydWN0IGFwaWMgYXBpY19waHlzZmxhdCBfX3JvX2FmdGVyX2luaXQgPSB7CiAKIAkubmFtZQkJCQk9ICJwaHlzaWNhbCBmbGF0IiwKIAkucHJvYmUJCQkJPSBwaHlzZmxhdF9wcm9iZSwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfbm9vcC5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpY19ub29wLmMKaW5kZXggYzA1Njg4Yi4uYjEwOWU0MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpY19ub29wLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpY19ub29wLmMKQEAgLTEwOCw3ICsxMDgsNyBAQAogCVdBUk5fT05fT05DRShib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQVBJQykgJiYgIWRpc2FibGVfYXBpYyk7CiB9CiAKLXN0cnVjdCBhcGljIGFwaWNfbm9vcCA9IHsKK3N0cnVjdCBhcGljIGFwaWNfbm9vcCBfX3JvX2FmdGVyX2luaXQgPSB7CiAJLm5hbWUJCQkJPSAibm9vcCIsCiAJLnByb2JlCQkJCT0gbm9vcF9wcm9iZSwKIAkuYWNwaV9tYWR0X29lbV9jaGVjawkJPSBOVUxMLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpY19udW1hY2hpcC5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpY19udW1hY2hpcC5jCmluZGV4IDcxNGQ0ZmQuLmUwOGZlMmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfbnVtYWNoaXAuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX251bWFjaGlwLmMKQEAgLTQwLDEwICs0MCw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIG51bWFjaGlwMV9zZXRfYXBpY19pZCh1bnNpZ25lZCBpbnQgaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyB4OwotCi0JeCA9ICgoaWQgJiAweGZmVSkgPDwgMjQpOwotCXJldHVybiB4OworCXJldHVybiAoaWQgJiAweGZmKSA8PCAyNDsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBudW1hY2hpcDJfZ2V0X2FwaWNfaWQodW5zaWduZWQgbG9uZyB4KQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvYmlnc21wXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9iaWdzbXBfMzIuYwppbmRleCAwNmRiYWE0Li41NjAxMjAxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9iaWdzbXBfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9iaWdzbXBfMzIuYwpAQCAtMTQyLDcgKzE0Miw3IEBACiAJcmV0dXJuIGRtaV9iaWdzbXA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYXBpYyBhcGljX2JpZ3NtcCA9IHsKK3N0YXRpYyBzdHJ1Y3QgYXBpYyBhcGljX2JpZ3NtcCBfX3JvX2FmdGVyX2luaXQgPSB7CiAKIAkubmFtZQkJCQk9ICJiaWdzbXAiLAogCS5wcm9iZQkJCQk9IHByb2JlX2JpZ3NtcCwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2lvX2FwaWMuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2lvX2FwaWMuYwppbmRleCA3NDkxZjQxLi40OGU2ZDg0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9pb19hcGljLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvaW9fYXBpYy5jCkBAIC0xNTkzLDcgKzE1OTMsNyBAQAogCSAqIG5vIG1lYW5pbmcgd2l0aG91dCB0aGUgc2VyaWFsIEFQSUMgYnVzLgogCSAqLwogCWlmICghKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0lOVEVMKQotCQl8fCBBUElDX1hBUElDKGFwaWNfdmVyc2lvbltib290X2NwdV9waHlzaWNhbF9hcGljaWRdKSkKKwkJfHwgQVBJQ19YQVBJQyhib290X2NwdV9hcGljX3ZlcnNpb24pKQogCQlyZXR1cm47CiAJc2V0dXBfaW9hcGljX2lkc19mcm9tX21wY19ub2NoZWNrKCk7CiB9CkBAIC0yNDIzLDcgKzI0MjMsNyBAQAogc3RhdGljIHU4IGlvX2FwaWNfdW5pcXVlX2lkKGludCBpZHgsIHU4IGlkKQogewogCWlmICgoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfSU5URUwpICYmCi0JICAgICFBUElDX1hBUElDKGFwaWNfdmVyc2lvbltib290X2NwdV9waHlzaWNhbF9hcGljaWRdKSkKKwkgICAgIUFQSUNfWEFQSUMoYm9vdF9jcHVfYXBpY192ZXJzaW9uKSkKIAkJcmV0dXJuIGlvX2FwaWNfZ2V0X3VuaXF1ZV9pZChpZHgsIGlkKTsKIAllbHNlCiAJCXJldHVybiBpZDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL21zaS5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvbXNpLmMKaW5kZXggYWRlMjUzMi4uMDE1YmJmMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvbXNpLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvbXNpLmMKQEAgLTI2OSw3ICsyNjksNyBAQAogCWhwZXRfbXNpX3dyaXRlKGlycV9kYXRhX2dldF9pcnFfaGFuZGxlcl9kYXRhKGRhdGEpLCBtc2cpOwogfQogCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIGhwZXRfbXNpX2NvbnRyb2xsZXIgPSB7CitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGhwZXRfbXNpX2NvbnRyb2xsZXIgX19yb19hZnRlcl9pbml0ID0gewogCS5uYW1lID0gIkhQRVQtTVNJIiwKIAkuaXJxX3VubWFzayA9IGhwZXRfbXNpX3VubWFzaywKIAkuaXJxX21hc2sgPSBocGV0X21zaV9tYXNrLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvcHJvYmVfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL3Byb2JlXzMyLmMKaW5kZXggN2M0M2U3MS4uYzQ4MjY0ZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvcHJvYmVfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9wcm9iZV8zMi5jCkBAIC03Miw3ICs3Miw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYXBpYyBhcGljX2RlZmF1bHQgPSB7CitzdGF0aWMgc3RydWN0IGFwaWMgYXBpY19kZWZhdWx0IF9fcm9fYWZ0ZXJfaW5pdCA9IHsKIAogCS5uYW1lCQkJCT0gImRlZmF1bHQiLAogCS5wcm9iZQkJCQk9IHByb2JlX2RlZmF1bHQsCkBAIC0xMjYsNyArMTI2LDcgQEAKIAogYXBpY19kcml2ZXIoYXBpY19kZWZhdWx0KTsKIAotc3RydWN0IGFwaWMgKmFwaWMgPSAmYXBpY19kZWZhdWx0Oworc3RydWN0IGFwaWMgKmFwaWMgX19yb19hZnRlcl9pbml0ID0gJmFwaWNfZGVmYXVsdDsKIEVYUE9SVF9TWU1CT0xfR1BMKGFwaWMpOwogCiBzdGF0aWMgaW50IGNtZGxpbmVfYXBpYyBfX2luaXRkYXRhOwpAQCAtMTUyLDcgKzE1Miw3IEBACiAKIHZvaWQgX19pbml0IGRlZmF1bHRfc2V0dXBfYXBpY19yb3V0aW5nKHZvaWQpCiB7Ci0JaW50IHZlcnNpb24gPSBhcGljX3ZlcnNpb25bYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkXTsKKwlpbnQgdmVyc2lvbiA9IGJvb3RfY3B1X2FwaWNfdmVyc2lvbjsKIAogCWlmIChudW1fcG9zc2libGVfY3B1cygpID4gOCkgewogCQlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvcikgewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX2NsdXN0ZXIuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY19jbHVzdGVyLmMKaW5kZXggNTRmMzVkOS4uMjAwYWY1YSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX2NsdXN0ZXIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfY2x1c3Rlci5jCkBAIC0yMjcsNyArMjI3LDcgQEAKIAkJY3B1bWFza19hbmQocmV0bWFzaywgbWFzaywgcGVyX2NwdShjcHVzX2luX2NsdXN0ZXIsIGNwdSkpOwogfQogCi1zdGF0aWMgc3RydWN0IGFwaWMgYXBpY194MmFwaWNfY2x1c3RlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgYXBpYyBhcGljX3gyYXBpY19jbHVzdGVyIF9fcm9fYWZ0ZXJfaW5pdCA9IHsKIAogCS5uYW1lCQkJCT0gImNsdXN0ZXIgeDJhcGljIiwKIAkucHJvYmUJCQkJPSB4MmFwaWNfY2x1c3Rlcl9wcm9iZSwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY19waHlzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfcGh5cy5jCmluZGV4IDRmMTNmNTRmLi5mZjExMWYwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfcGh5cy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY19waHlzLmMKQEAgLTk4LDcgKzk4LDcgQEAKIAlyZXR1cm4gYXBpYyA9PSAmYXBpY194MmFwaWNfcGh5czsKIH0KIAotc3RhdGljIHN0cnVjdCBhcGljIGFwaWNfeDJhcGljX3BoeXMgPSB7CitzdGF0aWMgc3RydWN0IGFwaWMgYXBpY194MmFwaWNfcGh5cyBfX3JvX2FmdGVyX2luaXQgPSB7CiAKIAkubmFtZQkJCQk9ICJwaHlzaWNhbCB4MmFwaWMiLAogCS5wcm9iZQkJCQk9IHgyYXBpY19waHlzX3Byb2JlLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3V2X3guYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMKaW5kZXggY2IwNjczYy4uYWVlZjUzYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3V2X3guYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfdXZfeC5jCkBAIC01MzMsMTEgKzUzMyw4IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHNldF9hcGljX2lkKHVuc2lnbmVkIGludCBpZCkKIHsKLQl1bnNpZ25lZCBsb25nIHg7Ci0KLQkvKiBtYXNrb3V0IHgyYXBpY19leHRyYV9iaXRzID8gKi8KLQl4ID0gaWQ7Ci0JcmV0dXJuIHg7CisJLyogQ0hFQ0tNRTogRG8gd2UgbmVlZCB0byBtYXNrIG91dCB0aGUgeGFwaWMgZXh0cmEgYml0cz8gKi8KKwlyZXR1cm4gaWQ7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgdXZfcmVhZF9hcGljX2lkKHZvaWQpCkBAIC01NjAsNyArNTU3LDcgQEAKIAlyZXR1cm4gYXBpYyA9PSAmYXBpY194MmFwaWNfdXZfeDsKIH0KIAotc3RhdGljIHN0cnVjdCBhcGljIF9fcmVmZGF0YSBhcGljX3gyYXBpY191dl94ID0geworc3RhdGljIHN0cnVjdCBhcGljIGFwaWNfeDJhcGljX3V2X3ggX19yb19hZnRlcl9pbml0ID0gewogCiAJLm5hbWUJCQkJPSAiVVYgbGFyZ2Ugc3lzdGVtIiwKIAkucHJvYmUJCQkJPSB1dl9wcm9iZSwKQEAgLTkyNyw3ICs5MjQsNyBAQAogCW1vZF90aW1lcih0aW1lciwgamlmZmllcyArIFNDSVJfQ1BVX0hCX0lOVEVSVkFMKTsKIH0KIAotc3RhdGljIHZvaWQgdXZfaGVhcnRiZWF0X2VuYWJsZShpbnQgY3B1KQorc3RhdGljIGludCB1dl9oZWFydGJlYXRfZW5hYmxlKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJd2hpbGUgKCF1dl9jcHVfc2Npcl9pbmZvKGNwdSktPmVuYWJsZWQpIHsKIAkJc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyID0gJnV2X2NwdV9zY2lyX2luZm8oY3B1KS0+dGltZXI7CkBAIC05NDEsNDMgKzkzOCwyNCBAQAogCQkvKiBhbHNvIGVuc3VyZSB0aGF0IGJvb3QgY3B1IGlzIGVuYWJsZWQgKi8KIAkJY3B1ID0gMDsKIAl9CisJcmV0dXJuIDA7CiB9CiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLXN0YXRpYyB2b2lkIHV2X2hlYXJ0YmVhdF9kaXNhYmxlKGludCBjcHUpCitzdGF0aWMgaW50IHV2X2hlYXJ0YmVhdF9kaXNhYmxlKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJaWYgKHV2X2NwdV9zY2lyX2luZm8oY3B1KS0+ZW5hYmxlZCkgewogCQl1dl9jcHVfc2Npcl9pbmZvKGNwdSktPmVuYWJsZWQgPSAwOwogCQlkZWxfdGltZXIoJnV2X2NwdV9zY2lyX2luZm8oY3B1KS0+dGltZXIpOwogCX0KIAl1dl9zZXRfY3B1X3NjaXJfYml0cyhjcHUsIDB4ZmYpOwotfQotCi0vKgotICogY3B1IGhvdHBsdWcgbm90aWZpZXIKLSAqLwotc3RhdGljIGludCB1dl9zY2lyX2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwKLQkJCSAgICAgIHZvaWQgKmhjcHUpCi17Ci0JbG9uZyBjcHUgPSAobG9uZyloY3B1OwotCi0Jc3dpdGNoIChhY3Rpb24gJiB+Q1BVX1RBU0tTX0ZST1pFTikgewotCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgotCWNhc2UgQ1BVX09OTElORToKLQkJdXZfaGVhcnRiZWF0X2VuYWJsZShjcHUpOwotCQlicmVhazsKLQljYXNlIENQVV9ET1dOX1BSRVBBUkU6Ci0JCXV2X2hlYXJ0YmVhdF9kaXNhYmxlKGNwdSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gTk9USUZZX09LOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgX19pbml0IHZvaWQgdXZfc2Npcl9yZWdpc3Rlcl9jcHVfbm90aWZpZXIodm9pZCkKIHsKLQlob3RjcHVfbm90aWZpZXIodXZfc2Npcl9jcHVfbm90aWZ5LCAwKTsKKwljcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX0FQX09OTElORV9EWU4sICJ4ODYveDJhcGljLXV2eDpvbmxpbmUiLAorCQkJCSAgdXZfaGVhcnRiZWF0X2VuYWJsZSwgdXZfaGVhcnRiZWF0X2Rpc2FibGUpOwogfQogCiAjZWxzZSAvKiAhQ09ORklHX0hPVFBMVUdfQ1BVICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gveDg2L2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IDJiZDVjNmYuLmM2MmUwMTUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC0yOSwxMCArMjksMTMgQEAKIAogdm9pZCBjb21tb24odm9pZCkgewogCUJMQU5LKCk7Ci0JT0ZGU0VUKFRJX2ZsYWdzLCB0aHJlYWRfaW5mbywgZmxhZ3MpOwotCU9GRlNFVChUSV9zdGF0dXMsIHRocmVhZF9pbmZvLCBzdGF0dXMpOworCU9GRlNFVChUQVNLX3RocmVhZHNwLCB0YXNrX3N0cnVjdCwgdGhyZWFkLnNwKTsKKyNpZmRlZiBDT05GSUdfQ0NfU1RBQ0tQUk9URUNUT1IKKwlPRkZTRVQoVEFTS19zdGFja19jYW5hcnksIHRhc2tfc3RydWN0LCBzdGFja19jYW5hcnkpOworI2VuZGlmCiAKIAlCTEFOSygpOworCU9GRlNFVChUQVNLX1RJX2ZsYWdzLCB0YXNrX3N0cnVjdCwgdGhyZWFkX2luZm8uZmxhZ3MpOwogCU9GRlNFVChUQVNLX2FkZHJfbGltaXQsIHRhc2tfc3RydWN0LCB0aHJlYWQuYWRkcl9saW1pdCk7CiAKIAlCTEFOSygpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FzbS1vZmZzZXRzXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHNfMzIuYwppbmRleCBlY2RjMWQyLi44ODBhYTA5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHNfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHNfMzIuYwpAQCAtNTcsNiArNTcsMTEgQEAKIAkvKiBTaXplIG9mIFNZU0VOVEVSX3N0YWNrICovCiAJREVGSU5FKFNJWkVPRl9TWVNFTlRFUl9zdGFjaywgc2l6ZW9mKCgoc3RydWN0IHRzc19zdHJ1Y3QgKikwKS0+U1lTRU5URVJfc3RhY2spKTsKIAorI2lmZGVmIENPTkZJR19DQ19TVEFDS1BST1RFQ1RPUgorCUJMQU5LKCk7CisJT0ZGU0VUKHN0YWNrX2NhbmFyeV9vZmZzZXQsIHN0YWNrX2NhbmFyeSwgY2FuYXJ5KTsKKyNlbmRpZgorCiAjaWYgZGVmaW5lZChDT05GSUdfTEdVRVNUKSB8fCBkZWZpbmVkKENPTkZJR19MR1VFU1RfR1VFU1QpIHx8IGRlZmluZWQoQ09ORklHX0xHVUVTVF9NT0RVTEUpCiAJQkxBTksoKTsKIAlPRkZTRVQoTEdVRVNUX0RBVEFfaXJxX2VuYWJsZWQsIGxndWVzdF9kYXRhLCBpcnFfZW5hYmxlZCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHNfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9hc20tb2Zmc2V0c182NC5jCmluZGV4IGQ4NzVmOTcuLjIxMDkyN2UgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hc20tb2Zmc2V0c182NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hc20tb2Zmc2V0c182NC5jCkBAIC01Niw2ICs1NiwxMSBAQAogCU9GRlNFVChUU1Nfc3AwLCB0c3Nfc3RydWN0LCB4ODZfdHNzLnNwMCk7CiAJQkxBTksoKTsKIAorI2lmZGVmIENPTkZJR19DQ19TVEFDS1BST1RFQ1RPUgorCURFRklORShzdGFja19jYW5hcnlfb2Zmc2V0LCBvZmZzZXRvZih1bmlvbiBpcnFfc3RhY2tfdW5pb24sIHN0YWNrX2NhbmFyeSkpOworCUJMQU5LKCk7CisjZW5kaWYKKwogCURFRklORShfX05SX3N5c2NhbGxfbWF4LCBzaXplb2Yoc3lzY2FsbHNfNjQpIC0gMSk7CiAJREVGSU5FKE5SX3N5c2NhbGxzLCBzaXplb2Yoc3lzY2FsbHNfNjQpKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9hbWQuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvYW1kLmMKaW5kZXggZjVjNjlkOC4uYjgxZmUyZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9hbWQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2FtZC5jCkBAIC02NjksNiArNjY5LDE3IEBACiAJCXNldF9jcHVfYnVnKGMsIFg4Nl9CVUdfQU1EX1RMQl9NTUFUQ0gpOwogfQogCisjZGVmaW5lIE1TUl9BTUQ2NF9ERV9DRkcJMHhDMDAxMTAyOQorCitzdGF0aWMgdm9pZCBpbml0X2FtZF9sbihzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJLyoKKwkgKiBBcHBseSBlcnJhdHVtIDY2NSBmaXggdW5jb25kaXRpb25hbGx5IHNvIG1hY2hpbmVzIHdpdGhvdXQgYSBCSU9TCisJICogZml4IHdvcmsuCisJICovCisJbXNyX3NldF9iaXQoTVNSX0FNRDY0X0RFX0NGRywgMzEpOworfQorCiBzdGF0aWMgdm9pZCBpbml0X2FtZF9iZChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CiAJdTY0IHZhbHVlOwpAQCAtNzI2LDYgKzczNyw3IEBACiAJY2FzZSA2OgkgICBpbml0X2FtZF9rNyhjKTsgYnJlYWs7CiAJY2FzZSAweGY6ICBpbml0X2FtZF9rOChjKTsgYnJlYWs7CiAJY2FzZSAweDEwOiBpbml0X2FtZF9naChjKTsgYnJlYWs7CisJY2FzZSAweDEyOiBpbml0X2FtZF9sbihjKTsgYnJlYWs7CiAJY2FzZSAweDE1OiBpbml0X2FtZF9iZChjKTsgYnJlYWs7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb24uYwppbmRleCA4MDllZGEwLi45YmQ5MTBhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY29tbW9uLmMKQEAgLTgwNCwyMSArODA0LDIwIEBACiAJCWlkZW50aWZ5X2NwdV93aXRob3V0X2NwdWlkKGMpOwogCiAJLyogY3lyaXggY291bGQgaGF2ZSBjcHVpZCBlbmFibGVkIHZpYSBjX2lkZW50aWZ5KCkqLwotCWlmICghaGF2ZV9jcHVpZF9wKCkpCi0JCXJldHVybjsKKwlpZiAoaGF2ZV9jcHVpZF9wKCkpIHsKKwkJY3B1X2RldGVjdChjKTsKKwkJZ2V0X2NwdV92ZW5kb3IoYyk7CisJCWdldF9jcHVfY2FwKGMpOwogCi0JY3B1X2RldGVjdChjKTsKLQlnZXRfY3B1X3ZlbmRvcihjKTsKLQlnZXRfY3B1X2NhcChjKTsKKwkJaWYgKHRoaXNfY3B1LT5jX2Vhcmx5X2luaXQpCisJCQl0aGlzX2NwdS0+Y19lYXJseV9pbml0KGMpOwogCi0JaWYgKHRoaXNfY3B1LT5jX2Vhcmx5X2luaXQpCi0JCXRoaXNfY3B1LT5jX2Vhcmx5X2luaXQoYyk7CisJCWMtPmNwdV9pbmRleCA9IDA7CisJCWZpbHRlcl9jcHVpZF9mZWF0dXJlcyhjLCBmYWxzZSk7CiAKLQljLT5jcHVfaW5kZXggPSAwOwotCWZpbHRlcl9jcHVpZF9mZWF0dXJlcyhjLCBmYWxzZSk7Ci0KLQlpZiAodGhpc19jcHUtPmNfYnNwX2luaXQpCi0JCXRoaXNfY3B1LT5jX2JzcF9pbml0KGMpOworCQlpZiAodGhpc19jcHUtPmNfYnNwX2luaXQpCisJCQl0aGlzX2NwdS0+Y19ic3BfaW5pdChjKTsKKwl9CiAKIAlzZXR1cF9mb3JjZV9jcHVfY2FwKFg4Nl9GRUFUVVJFX0FMV0FZUyk7CiAJZnB1X19pbml0X3N5c3RlbShjKTsKQEAgLTEyNjUsOSArMTI2NCwxNCBAQAogX19zZXR1cCgiY2xlYXJjcHVpZD0iLCBzZXR1cF9kaXNhYmxlY3B1aWQpOwogCiAjaWZkZWYgQ09ORklHX1g4Nl82NAotc3RydWN0IGRlc2NfcHRyIGlkdF9kZXNjciA9IHsgTlJfVkVDVE9SUyAqIDE2IC0gMSwgKHVuc2lnbmVkIGxvbmcpIGlkdF90YWJsZSB9Owotc3RydWN0IGRlc2NfcHRyIGRlYnVnX2lkdF9kZXNjciA9IHsgTlJfVkVDVE9SUyAqIDE2IC0gMSwKLQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpIGRlYnVnX2lkdF90YWJsZSB9Oworc3RydWN0IGRlc2NfcHRyIGlkdF9kZXNjciBfX3JvX2FmdGVyX2luaXQgPSB7CisJLnNpemUgPSBOUl9WRUNUT1JTICogMTYgLSAxLAorCS5hZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpIGlkdF90YWJsZSwKK307Citjb25zdCBzdHJ1Y3QgZGVzY19wdHIgZGVidWdfaWR0X2Rlc2NyID0geworCS5zaXplID0gTlJfVkVDVE9SUyAqIDE2IC0gMSwKKwkuYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKSBkZWJ1Z19pZHRfdGFibGUsCit9OwogCiBERUZJTkVfUEVSX0NQVV9GSVJTVCh1bmlvbiBpcnFfc3RhY2tfdW5pb24sCiAJCSAgICAgaXJxX3N0YWNrX3VuaW9uKSBfX2FsaWduZWQoUEFHRV9TSVpFKSBfX3Zpc2libGU7CkBAIC0xMjgxLDcgKzEyODUsNyBAQAogRVhQT1JUX1BFUl9DUFVfU1lNQk9MKGN1cnJlbnRfdGFzayk7CiAKIERFRklORV9QRVJfQ1BVKGNoYXIgKiwgaXJxX3N0YWNrX3B0cikgPQotCWluaXRfcGVyX2NwdV92YXIoaXJxX3N0YWNrX3VuaW9uLmlycV9zdGFjaykgKyBJUlFfU1RBQ0tfU0laRSAtIDY0OworCWluaXRfcGVyX2NwdV92YXIoaXJxX3N0YWNrX3VuaW9uLmlycV9zdGFjaykgKyBJUlFfU1RBQ0tfU0laRTsKIAogREVGSU5FX1BFUl9DUFUodW5zaWduZWQgaW50LCBpcnFfY291bnQpIF9fdmlzaWJsZSA9IC0xOwogCkBAIC0xMzA1LDExICsxMzA5LDYgQEAKIC8qIE1heSBub3QgYmUgbWFya2VkIF9faW5pdDogdXNlZCBieSBzb2Z0d2FyZSBzdXNwZW5kICovCiB2b2lkIHN5c2NhbGxfaW5pdCh2b2lkKQogewotCS8qCi0JICogTFNUQVIgYW5kIFNUQVIgbGl2ZSBpbiBhIGJpdCBzdHJhbmdlIHN5bWJpb3Npcy4KLQkgKiBUaGV5IGJvdGggd3JpdGUgdG8gdGhlIHNhbWUgaW50ZXJuYWwgcmVnaXN0ZXIuIFNUQVIgYWxsb3dzIHRvCi0JICogc2V0IENTL0RTIGJ1dCBvbmx5IGEgMzJiaXQgdGFyZ2V0LiBMU1RBUiBzZXRzIHRoZSA2NGJpdCByaXAuCi0JICovCiAJd3Jtc3IoTVNSX1NUQVIsIDAsIChfX1VTRVIzMl9DUyA8PCAxNikgfCBfX0tFUk5FTF9DUyk7CiAJd3Jtc3JsKE1TUl9MU1RBUiwgKHVuc2lnbmVkIGxvbmcpZW50cnlfU1lTQ0FMTF82NCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvaHlwZXJ2aXNvci5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9oeXBlcnZpc29yLmMKaW5kZXggMjdlNDY2NS4uMzU2OTFhNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9oeXBlcnZpc29yLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9oeXBlcnZpc29yLmMKQEAgLTg2LDMgKzg2LDE0IEBACiAJICAgICAgIHg4Nl9oeXBlci0+eDJhcGljX2F2YWlsYWJsZSAmJgogCSAgICAgICB4ODZfaHlwZXItPngyYXBpY19hdmFpbGFibGUoKTsKIH0KKwordm9pZCBoeXBlcnZpc29yX3Bpbl92Y3B1KGludCBjcHUpCit7CisJaWYgKCF4ODZfaHlwZXIpCisJCXJldHVybjsKKworCWlmICh4ODZfaHlwZXItPnBpbl92Y3B1KQorCQl4ODZfaHlwZXItPnBpbl92Y3B1KGNwdSk7CisJZWxzZQorCQlXQVJOX09OQ0UoMSwgInZjcHUgcGlubmluZyByZXF1ZXN0ZWQgYnV0IG5vdCBzdXBwb3J0ZWQhXG4iKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLmMKaW5kZXggNzlkOGVjOC4uYTdmZGY0NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxX3dvcmsuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9qdW1wX2xhYmVsLmg+CiAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CkBAIC0yOTIsNiArMjkzLDEzIEBACiAJaWYgKG0tPm1pc2MpCiAJCXByX2NvbnQoIk1JU0MgJWxseCAiLCBtLT5taXNjKTsKIAorCWlmIChtY2VfZmxhZ3Muc21jYSkgeworCQlpZiAobS0+c3luZCkKKwkJCXByX2NvbnQoIlNZTkQgJWxseCAiLCBtLT5zeW5kKTsKKwkJaWYgKG0tPmlwaWQpCisJCQlwcl9jb250KCJJUElEICVsbHggIiwgbS0+aXBpZCk7CisJfQorCiAJcHJfY29udCgiXG4iKTsKIAkvKgogCSAqIE5vdGUgdGhpcyBvdXRwdXQgaXMgcGFyc2VkIGJ5IGV4dGVybmFsIHRvb2xzIGFuZCBvbGQgZmllbGRzCkBAIC01NjgsNiArNTc2LDcgQEAKIHsKIAlpZiAobS0+c3RhdHVzICYgTUNJX1NUQVRVU19NSVNDVikKIAkJbS0+bWlzYyA9IG1jZV9yZG1zcmwobXNyX29wcy5taXNjKGkpKTsKKwogCWlmIChtLT5zdGF0dXMgJiBNQ0lfU1RBVFVTX0FERFJWKSB7CiAJCW0tPmFkZHIgPSBtY2VfcmRtc3JsKG1zcl9vcHMuYWRkcihpKSk7CiAKQEAgLTU3OSw2ICs1ODgsMjMgQEAKIAkJCW0tPmFkZHIgPj49IHNoaWZ0OwogCQkJbS0+YWRkciA8PD0gc2hpZnQ7CiAJCX0KKworCQkvKgorCQkgKiBFeHRyYWN0IFs1NTo8bHNiPl0gd2hlcmUgbHNiIGlzIHRoZSBsZWFzdCBzaWduaWZpY2FudAorCQkgKiAqdmFsaWQqIGJpdCBvZiB0aGUgYWRkcmVzcyBiaXRzLgorCQkgKi8KKwkJaWYgKG1jZV9mbGFncy5zbWNhKSB7CisJCQl1OCBsc2IgPSAobS0+YWRkciA+PiA1NikgJiAweDNmOworCisJCQltLT5hZGRyICY9IEdFTk1BU0tfVUxMKDU1LCBsc2IpOworCQl9CisJfQorCisJaWYgKG1jZV9mbGFncy5zbWNhKSB7CisJCW0tPmlwaWQgPSBtY2VfcmRtc3JsKE1TUl9BTUQ2NF9TTUNBX01DeF9JUElEKGkpKTsKKworCQlpZiAobS0+c3RhdHVzICYgTUNJX1NUQVRVU19TWU5EVikKKwkJCW0tPnN5bmQgPSBtY2VfcmRtc3JsKE1TUl9BTUQ2NF9TTUNBX01DeF9TWU5EKGkpKTsKIAl9CiB9CiAKQEAgLTE2MzMsMTcgKzE2NTksNiBAQAogCiAJCWlmIChjLT54ODYgPT0gNiAmJiBjLT54ODZfbW9kZWwgPT0gNDUpCiAJCQlxdWlya19ub193YXlfb3V0ID0gcXVpcmtfc2FuZHlicmlkZ2VfaWZ1OwotCQkvKgotCQkgKiBNQ0dfQ0FQLk1DR19TRVJfUCBpcyBuZWNlc3NhcnkgYnV0IG5vdCBzdWZmaWNpZW50IHRvIGtub3cKLQkJICogd2hldGhlciB0aGlzIHByb2Nlc3NvciB3aWxsIGFjdHVhbGx5IGdlbmVyYXRlIHJlY292ZXJhYmxlCi0JCSAqIG1hY2hpbmUgY2hlY2tzLiBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhbiBFNyBtb2RlbCBYZW9uLgotCQkgKiBXZSBjYW4ndCBkbyBhIG1vZGVsIG51bWJlciBjaGVjayBiZWNhdXNlIEU1IGFuZCBFNyB1c2UgdGhlCi0JCSAqIHNhbWUgbW9kZWwgbnVtYmVyLiBFNSBkb2Vzbid0IHN1cHBvcnQgcmVjb3ZlcnksIEU3IGRvZXMuCi0JCSAqLwotCQlpZiAobWNhX2NmZy5yZWNvdmVyeSB8fCAobWNhX2NmZy5zZXIgJiYKLQkJCSFzdHJuY21wKGMtPng4Nl9tb2RlbF9pZCwKLQkJCQkgIkludGVsKFIpIFhlb24oUikgQ1BVIEU3LSIsIDI0KSkpCi0JCQlzZXRfY3B1X2NhcChjLCBYODZfRkVBVFVSRV9NQ0VfUkVDT1ZFUlkpOwogCX0KIAlpZiAoY2ZnLT5tb25hcmNoX3RpbWVvdXQgPCAwKQogCQljZmctPm1vbmFyY2hfdGltZW91dCA9IDA7CkBAIC0yMDgwLDYgKzIwOTUsNyBAQAogICogbWNlPWJvb3Rsb2cgTG9nIE1DRXMgZnJvbSBiZWZvcmUgYm9vdGluZy4gRGlzYWJsZWQgYnkgZGVmYXVsdCBvbiBBTUQuCiAgKiBtY2U9bm9ib290bG9nIERvbid0IGxvZyBNQ0VzIGZyb20gYmVmb3JlIGJvb3RpbmcuCiAgKiBtY2U9Ymlvc19jbWNpX3RocmVzaG9sZCBEb24ndCBwcm9ncmFtIHRoZSBDTUNJIHRocmVzaG9sZAorICogbWNlPXJlY292ZXJ5IGZvcmNlIGVuYWJsZSBtZW1jcHlfbWNzYWZlKCkKICAqLwogc3RhdGljIGludCBfX2luaXQgbWNoZWNrX2VuYWJsZShjaGFyICpzdHIpCiB7CkBAIC0yNjc2LDggKzI2OTIsMTQgQEAKIHN0YXRpYyBpbnQgX19pbml0IG1jaGVja19kZWJ1Z2ZzX2luaXQodm9pZCkgeyByZXR1cm4gLUVJTlZBTDsgfQogI2VuZGlmCiAKK0RFRklORV9TVEFUSUNfS0VZX0ZBTFNFKG1jc2FmZV9rZXkpOworRVhQT1JUX1NZTUJPTF9HUEwobWNzYWZlX2tleSk7CisKIHN0YXRpYyBpbnQgX19pbml0IG1jaGVja19sYXRlX2luaXQodm9pZCkKIHsKKwlpZiAobWNhX2NmZy5yZWNvdmVyeSkKKwkJc3RhdGljX2JyYW5jaF9pbmMoJm1jc2FmZV9rZXkpOworCiAJbWNoZWNrX2RlYnVnZnNfaW5pdCgpOwogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZV9hbWQuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZV9hbWQuYwppbmRleCA3YjdmM2JlLi45YjU0MDM0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2VfYW1kLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlX2FtZC5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogCiAjaW5jbHVkZSA8YXNtL2FtZF9uYi5oPgogI2luY2x1ZGUgPGFzbS9hcGljLmg+CkBAIC02MywzNCArNjQsNzEgQEAKIAkiZXhlY3V0aW9uX3VuaXQiLAogfTsKIAotLyogRGVmaW5lIEhXSUQgdG8gSVAgdHlwZSBtYXBwaW5ncyBmb3IgU2NhbGFibGUgTUNBICovCi1zdHJ1Y3QgYW1kX2h3aWQgYW1kX2h3aWRzW10gPSB7Ci0JW1NNQ0FfRjE3SF9DT1JFXQk9IHsgImYxN2hfY29yZSIsCTB4QjAgfSwKLQlbU01DQV9ERl0JCT0geyAiZGF0YV9mYWJyaWMiLAkweDJFIH0sCi0JW1NNQ0FfVU1DXQkJPSB7ICJ1bWMiLAkJMHg5NiB9LAotCVtTTUNBX1BCXQkJPSB7ICJwYXJhbV9ibG9jayIsCTB4NSB9LAotCVtTTUNBX1BTUF0JCT0geyAicHNwIiwJCTB4RkYgfSwKLQlbU01DQV9TTVVdCQk9IHsgInNtdSIsCQkweDEgfSwKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc21jYV91bWNfYmxvY2tfbmFtZXNbXSA9IHsKKwkiZHJhbV9lY2MiLAorCSJtaXNjX3VtYyIKIH07Ci1FWFBPUlRfU1lNQk9MX0dQTChhbWRfaHdpZHMpOwogCi1jb25zdCBjaGFyICogY29uc3QgYW1kX2NvcmVfbWNhYmxvY2tfbmFtZXNbXSA9IHsKLQlbU01DQV9MU10JCT0gImxvYWRfc3RvcmUiLAotCVtTTUNBX0lGXQkJPSAiaW5zbl9mZXRjaCIsCi0JW1NNQ0FfTDJfQ0FDSEVdCQk9ICJsMl9jYWNoZSIsCi0JW1NNQ0FfREVdCQk9ICJkZWNvZGVfdW5pdCIsCi0JW1JFU10JCQk9ICIiLAotCVtTTUNBX0VYXQkJPSAiZXhlY3V0aW9uX3VuaXQiLAotCVtTTUNBX0ZQXQkJPSAiZmxvYXRpbmdfcG9pbnQiLAotCVtTTUNBX0wzX0NBQ0hFXQkJPSAibDNfY2FjaGUiLAorc3RydWN0IHNtY2FfYmFua19uYW1lIHNtY2FfYmFua19uYW1lc1tdID0geworCVtTTUNBX0xTXQk9IHsgImxvYWRfc3RvcmUiLAkiTG9hZCBTdG9yZSBVbml0IiB9LAorCVtTTUNBX0lGXQk9IHsgImluc25fZmV0Y2giLAkiSW5zdHJ1Y3Rpb24gRmV0Y2ggVW5pdCIgfSwKKwlbU01DQV9MMl9DQUNIRV0JPSB7ICJsMl9jYWNoZSIsCQkiTDIgQ2FjaGUiIH0sCisJW1NNQ0FfREVdCT0geyAiZGVjb2RlX3VuaXQiLAkiRGVjb2RlIFVuaXQiIH0sCisJW1NNQ0FfRVhdCT0geyAiZXhlY3V0aW9uX3VuaXQiLAkiRXhlY3V0aW9uIFVuaXQiIH0sCisJW1NNQ0FfRlBdCT0geyAiZmxvYXRpbmdfcG9pbnQiLAkiRmxvYXRpbmcgUG9pbnQgVW5pdCIgfSwKKwlbU01DQV9MM19DQUNIRV0JPSB7ICJsM19jYWNoZSIsCQkiTDMgQ2FjaGUiIH0sCisJW1NNQ0FfQ1NdCT0geyAiY29oZXJlbnRfc2xhdmUiLAkiQ29oZXJlbnQgU2xhdmUiIH0sCisJW1NNQ0FfUElFXQk9IHsgInBpZSIsCQkiUG93ZXIsIEludGVycnVwdHMsIGV0Yy4iIH0sCisJW1NNQ0FfVU1DXQk9IHsgInVtYyIsCQkiVW5pZmllZCBNZW1vcnkgQ29udHJvbGxlciIgfSwKKwlbU01DQV9QQl0JPSB7ICJwYXJhbV9ibG9jayIsCSJQYXJhbWV0ZXIgQmxvY2siIH0sCisJW1NNQ0FfUFNQXQk9IHsgInBzcCIsCQkiUGxhdGZvcm0gU2VjdXJpdHkgUHJvY2Vzc29yIiB9LAorCVtTTUNBX1NNVV0JPSB7ICJzbXUiLAkJIlN5c3RlbSBNYW5hZ2VtZW50IFVuaXQiIH0sCiB9OwotRVhQT1JUX1NZTUJPTF9HUEwoYW1kX2NvcmVfbWNhYmxvY2tfbmFtZXMpOworRVhQT1JUX1NZTUJPTF9HUEwoc21jYV9iYW5rX25hbWVzKTsKIAotY29uc3QgY2hhciAqIGNvbnN0IGFtZF9kZl9tY2FibG9ja19uYW1lc1tdID0gewotCVtTTUNBX0NTXQkJPSAiY29oZXJlbnRfc2xhdmUiLAotCVtTTUNBX1BJRV0JCT0gInBpZSIsCitzdGF0aWMgc3RydWN0IHNtY2FfaHdpZF9tY2F0eXBlIHNtY2FfaHdpZF9tY2F0eXBlc1tdID0geworCS8qIHsgYmFua190eXBlLCBod2lkX21jYXR5cGUsIHhlY19iaXRtYXAgfSAqLworCisJLyogWk4gQ29yZSAoSFdJRD0weEIwKSBNQ0EgdHlwZXMgKi8KKwl7IFNNQ0FfTFMsCSBIV0lEX01DQVRZUEUoMHhCMCwgMHgwKSwgMHgxRkZGRUYgfSwKKwl7IFNNQ0FfSUYsCSBIV0lEX01DQVRZUEUoMHhCMCwgMHgxKSwgMHgzRkZGIH0sCisJeyBTTUNBX0wyX0NBQ0hFLCBIV0lEX01DQVRZUEUoMHhCMCwgMHgyKSwgMHhGIH0sCisJeyBTTUNBX0RFLAkgSFdJRF9NQ0FUWVBFKDB4QjAsIDB4MyksIDB4MUZGIH0sCisJLyogSFdJRCAweEIwIE1DQVRZUEUgMHg0IGlzIFJlc2VydmVkICovCisJeyBTTUNBX0VYLAkgSFdJRF9NQ0FUWVBFKDB4QjAsIDB4NSksIDB4N0ZGIH0sCisJeyBTTUNBX0ZQLAkgSFdJRF9NQ0FUWVBFKDB4QjAsIDB4NiksIDB4N0YgfSwKKwl7IFNNQ0FfTDNfQ0FDSEUsIEhXSURfTUNBVFlQRSgweEIwLCAweDcpLCAweEZGIH0sCisKKwkvKiBEYXRhIEZhYnJpYyBNQ0EgdHlwZXMgKi8KKwl7IFNNQ0FfQ1MsCSBIV0lEX01DQVRZUEUoMHgyRSwgMHgwKSwgMHgxRkYgfSwKKwl7IFNNQ0FfUElFLAkgSFdJRF9NQ0FUWVBFKDB4MkUsIDB4MSksIDB4RiB9LAorCisJLyogVW5pZmllZCBNZW1vcnkgQ29udHJvbGxlciBNQ0EgdHlwZSAqLworCXsgU01DQV9VTUMsCSBIV0lEX01DQVRZUEUoMHg5NiwgMHgwKSwgMHgzRiB9LAorCisJLyogUGFyYW1ldGVyIEJsb2NrIE1DQSB0eXBlICovCisJeyBTTUNBX1BCLAkgSFdJRF9NQ0FUWVBFKDB4MDUsIDB4MCksIDB4MSB9LAorCisJLyogUGxhdGZvcm0gU2VjdXJpdHkgUHJvY2Vzc29yIE1DQSB0eXBlICovCisJeyBTTUNBX1BTUCwJIEhXSURfTUNBVFlQRSgweEZGLCAweDApLCAweDEgfSwKKworCS8qIFN5c3RlbSBNYW5hZ2VtZW50IFVuaXQgTUNBIHR5cGUgKi8KKwl7IFNNQ0FfU01VLAkgSFdJRF9NQ0FUWVBFKDB4MDEsIDB4MCksIDB4MSB9LAogfTsKLUVYUE9SVF9TWU1CT0xfR1BMKGFtZF9kZl9tY2FibG9ja19uYW1lcyk7CisKK3N0cnVjdCBzbWNhX2JhbmtfaW5mbyBzbWNhX2JhbmtzW01BWF9OUl9CQU5LU107CitFWFBPUlRfU1lNQk9MX0dQTChzbWNhX2JhbmtzKTsKKworLyoKKyAqIEluIFNNQ0EgZW5hYmxlZCBwcm9jZXNzb3JzLCB3ZSBjYW4gaGF2ZSBtdWx0aXBsZSBiYW5rcyBmb3IgYSBnaXZlbiBJUCB0eXBlLgorICogU28gdG8gZGVmaW5lIGEgdW5pcXVlIG5hbWUgZm9yIGVhY2ggYmFuaywgd2UgdXNlIGEgdGVtcCBjLXN0cmluZyB0byBhcHBlbmQKKyAqIHRoZSBNQ0FfSVBJRFtJbnN0YW5jZUlkXSB0byB0eXBlJ3MgbmFtZSBpbiBnZXRfbmFtZSgpLgorICoKKyAqIEluc3RhbmNlSWQgaXMgMzIgYml0cyB3aGljaCBpcyA4IGNoYXJhY3RlcnMuIE1ha2Ugc3VyZSBNQVhfTUNBVFlQRV9OQU1FX0xFTgorICogaXMgZ3JlYXRlciB0aGFuIDggcGx1cyAxIChmb3IgdW5kZXJzY29yZSkgcGx1cyBsZW5ndGggb2YgbG9uZ2VzdCB0eXBlIG5hbWUuCisgKi8KKyNkZWZpbmUgTUFYX01DQVRZUEVfTkFNRV9MRU4JMzAKK3N0YXRpYyBjaGFyIGJ1Zl9tY2F0eXBlW01BWF9NQ0FUWVBFX05BTUVfTEVOXTsKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCB0aHJlc2hvbGRfYmFuayAqKiwgdGhyZXNob2xkX2JhbmtzKTsKIHN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBpbnQsIGJhbmtfbWFwKTsJLyogc2VlIHdoaWNoIGJhbmtzIGFyZSBvbiAqLwpAQCAtMTA4LDYgKzE0NiwzNiBAQAogICogQ1BVIEluaXRpYWxpemF0aW9uCiAgKi8KIAorc3RhdGljIHZvaWQgZ2V0X3NtY2FfYmFua19pbmZvKHVuc2lnbmVkIGludCBiYW5rKQoreworCXVuc2lnbmVkIGludCBpLCBod2lkX21jYXR5cGUsIGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdHJ1Y3Qgc21jYV9od2lkX21jYXR5cGUgKnR5cGU7CisJdTMyIGhpZ2gsIGluc3RhbmNlSWQ7CisJdTE2IGh3aWQsIG1jYXR5cGU7CisKKwkvKiBDb2xsZWN0IGJhbmtfaW5mbyB1c2luZyBDUFUgMCBmb3Igbm93LiAqLworCWlmIChjcHUpCisJCXJldHVybjsKKworCWlmIChyZG1zcl9zYWZlX29uX2NwdShjcHUsIE1TUl9BTUQ2NF9TTUNBX01DeF9JUElEKGJhbmspLCAmaW5zdGFuY2VJZCwgJmhpZ2gpKSB7CisJCXByX3dhcm4oIkZhaWxlZCB0byByZWFkIE1DQV9JUElEIGZvciBiYW5rICVkXG4iLCBiYW5rKTsKKwkJcmV0dXJuOworCX0KKworCWh3aWQgPSBoaWdoICYgTUNJX0lQSURfSFdJRDsKKwltY2F0eXBlID0gKGhpZ2ggJiBNQ0lfSVBJRF9NQ0FUWVBFKSA+PiAxNjsKKwlod2lkX21jYXR5cGUgPSBIV0lEX01DQVRZUEUoaHdpZCwgbWNhdHlwZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzbWNhX2h3aWRfbWNhdHlwZXMpOyBpKyspIHsKKwkJdHlwZSA9ICZzbWNhX2h3aWRfbWNhdHlwZXNbaV07CisJCWlmIChod2lkX21jYXR5cGUgPT0gdHlwZS0+aHdpZF9tY2F0eXBlKSB7CisJCQlzbWNhX2JhbmtzW2JhbmtdLnR5cGUgPSB0eXBlOworCQkJc21jYV9iYW5rc1tiYW5rXS50eXBlX2luc3RhbmNlID0gaW5zdGFuY2VJZDsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCiBzdHJ1Y3QgdGhyZXNoX3Jlc3RhcnQgewogCXN0cnVjdCB0aHJlc2hvbGRfYmxvY2sJKmI7CiAJaW50CQkJcmVzZXQ7CkBAIC0yOTMsNyArMzYxLDcgQEAKIAl3cm1zcihNU1JfQ1VfREVGX0VSUiwgbG93LCBoaWdoKTsKIH0KIAotc3RhdGljIHUzMiBnZXRfYmxvY2tfYWRkcmVzcyh1MzIgY3VycmVudF9hZGRyLCB1MzIgbG93LCB1MzIgaGlnaCwKK3N0YXRpYyB1MzIgZ2V0X2Jsb2NrX2FkZHJlc3ModW5zaWduZWQgaW50IGNwdSwgdTMyIGN1cnJlbnRfYWRkciwgdTMyIGxvdywgdTMyIGhpZ2gsCiAJCQkgICAgIHVuc2lnbmVkIGludCBiYW5rLCB1bnNpZ25lZCBpbnQgYmxvY2spCiB7CiAJdTMyIGFkZHIgPSAwLCBvZmZzZXQgPSAwOwpAQCAtMzA5LDEzICszNzcsMTMgQEAKIAkJCSAqLwogCQkJdTMyIGxvdywgaGlnaDsKIAotCQkJaWYgKHJkbXNyX3NhZmUoTVNSX0FNRDY0X1NNQ0FfTUN4X0NPTkZJRyhiYW5rKSwgJmxvdywgJmhpZ2gpKQorCQkJaWYgKHJkbXNyX3NhZmVfb25fY3B1KGNwdSwgTVNSX0FNRDY0X1NNQ0FfTUN4X0NPTkZJRyhiYW5rKSwgJmxvdywgJmhpZ2gpKQogCQkJCXJldHVybiBhZGRyOwogCiAJCQlpZiAoIShsb3cgJiBNQ0lfQ09ORklHX01DQVgpKQogCQkJCXJldHVybiBhZGRyOwogCi0JCQlpZiAoIXJkbXNyX3NhZmUoTVNSX0FNRDY0X1NNQ0FfTUN4X01JU0MoYmFuayksICZsb3csICZoaWdoKSAmJgorCQkJaWYgKCFyZG1zcl9zYWZlX29uX2NwdShjcHUsIE1TUl9BTUQ2NF9TTUNBX01DeF9NSVNDKGJhbmspLCAmbG93LCAmaGlnaCkgJiYKIAkJCSAgICAobG93ICYgTUFTS19CTEtQVFJfTE8pKQogCQkJCWFkZHIgPSBNU1JfQU1ENjRfU01DQV9NQ3hfTUlTQ3koYmFuaywgYmxvY2sgLSAxKTsKIAkJfQpAQCAtMzk1LDYgKzQ2MywyMCBAQAogCQkgKi8KIAkJc21jYV9oaWdoICY9IH5CSVQoMik7CiAKKwkJLyoKKwkJICogU01DQSBzZXRzIHRoZSBEZWZlcnJlZCBFcnJvciBJbnRlcnJ1cHQgdHlwZSBwZXIgYmFuay4KKwkJICoKKwkJICogTUNBX0NPTkZJR1tEZWZlcnJlZEludFR5cGVTdXBwb3J0ZWRdIGlzIGJpdCA1LCBhbmQgdGVsbHMgdXMKKwkJICogaWYgdGhlIERlZmVycmVkSW50VHlwZSBiaXQgZmllbGQgaXMgYXZhaWxhYmxlLgorCQkgKgorCQkgKiBNQ0FfQ09ORklHW0RlZmVycmVkSW50VHlwZV0gaXMgYml0cyBbMzg6MzddIChbNjo1XSBpbiB0aGUKKwkJICogaGlnaCBwb3J0aW9uIG9mIHRoZSBNU1IpLiBPUyBzaG91bGQgc2V0IHRoaXMgdG8gMHgxIHRvIGVuYWJsZQorCQkgKiBBUElDIGJhc2VkIGludGVycnVwdC4gRmlyc3QsIGNoZWNrIHRoYXQgbm8gaW50ZXJydXB0IGhhcyBiZWVuCisJCSAqIHNldC4KKwkJICovCisJCWlmICgoc21jYV9sb3cgJiBCSVQoNSkpICYmICEoKHNtY2FfaGlnaCA+PiA1KSAmIDB4MykpCisJCQlzbWNhX2hpZ2ggfD0gQklUKDUpOworCiAJCXdybXNyKHNtY2FfYWRkciwgc21jYV9sb3csIHNtY2FfaGlnaCk7CiAJfQogCkBAIC00MjEsMTIgKzUwMywxNSBAQAogdm9pZCBtY2VfYW1kX2ZlYXR1cmVfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CiAJdTMyIGxvdyA9IDAsIGhpZ2ggPSAwLCBhZGRyZXNzID0gMDsKLQl1bnNpZ25lZCBpbnQgYmFuaywgYmxvY2s7CisJdW5zaWduZWQgaW50IGJhbmssIGJsb2NrLCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJaW50IG9mZnNldCA9IC0xOwogCiAJZm9yIChiYW5rID0gMDsgYmFuayA8IG1jYV9jZmcuYmFua3M7ICsrYmFuaykgeworCQlpZiAobWNlX2ZsYWdzLnNtY2EpCisJCQlnZXRfc21jYV9iYW5rX2luZm8oYmFuayk7CisKIAkJZm9yIChibG9jayA9IDA7IGJsb2NrIDwgTlJfQkxPQ0tTOyArK2Jsb2NrKSB7Ci0JCQlhZGRyZXNzID0gZ2V0X2Jsb2NrX2FkZHJlc3MoYWRkcmVzcywgbG93LCBoaWdoLCBiYW5rLCBibG9jayk7CisJCQlhZGRyZXNzID0gZ2V0X2Jsb2NrX2FkZHJlc3MoY3B1LCBhZGRyZXNzLCBsb3csIGhpZ2gsIGJhbmssIGJsb2NrKTsKIAkJCWlmICghYWRkcmVzcykKIAkJCQlicmVhazsKIApAQCAtNDc2LDkgKzU2MSwyNyBAQAogCWlmICh0aHJlc2hvbGRfZXJyKQogCQltLm1pc2MgPSBtaXNjOwogCi0JaWYgKG0uc3RhdHVzICYgTUNJX1NUQVRVU19BRERSVikKKwlpZiAobS5zdGF0dXMgJiBNQ0lfU1RBVFVTX0FERFJWKSB7CiAJCXJkbXNybChtc3JfYWRkciwgbS5hZGRyKTsKIAorCQkvKgorCQkgKiBFeHRyYWN0IFs1NTo8bHNiPl0gd2hlcmUgbHNiIGlzIHRoZSBsZWFzdCBzaWduaWZpY2FudAorCQkgKiAqdmFsaWQqIGJpdCBvZiB0aGUgYWRkcmVzcyBiaXRzLgorCQkgKi8KKwkJaWYgKG1jZV9mbGFncy5zbWNhKSB7CisJCQl1OCBsc2IgPSAobS5hZGRyID4+IDU2KSAmIDB4M2Y7CisKKwkJCW0uYWRkciAmPSBHRU5NQVNLX1VMTCg1NSwgbHNiKTsKKwkJfQorCX0KKworCWlmIChtY2VfZmxhZ3Muc21jYSkgeworCQlyZG1zcmwoTVNSX0FNRDY0X1NNQ0FfTUN4X0lQSUQoYmFuayksIG0uaXBpZCk7CisKKwkJaWYgKG0uc3RhdHVzICYgTUNJX1NUQVRVU19TWU5EVikKKwkJCXJkbXNybChNU1JfQU1ENjRfU01DQV9NQ3hfU1lORChiYW5rKSwgbS5zeW5kKTsKKwl9CisKIAltY2VfbG9nKCZtKTsKIAogCXdybXNybChtc3Jfc3RhdHVzLCAwKTsKQEAgLTU0MSwxNSArNjQ0LDE0IEBACiBzdGF0aWMgdm9pZCBhbWRfdGhyZXNob2xkX2ludGVycnVwdCh2b2lkKQogewogCXUzMiBsb3cgPSAwLCBoaWdoID0gMCwgYWRkcmVzcyA9IDA7Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQl1bnNpZ25lZCBpbnQgYmFuaywgYmxvY2s7CisJdW5zaWduZWQgaW50IGJhbmssIGJsb2NrLCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKIAkvKiBhc3N1bWUgZmlyc3QgYmFuayBjYXVzZWQgaXQgKi8KIAlmb3IgKGJhbmsgPSAwOyBiYW5rIDwgbWNhX2NmZy5iYW5rczsgKytiYW5rKSB7CiAJCWlmICghKHBlcl9jcHUoYmFua19tYXAsIGNwdSkgJiAoMSA8PCBiYW5rKSkpCiAJCQljb250aW51ZTsKIAkJZm9yIChibG9jayA9IDA7IGJsb2NrIDwgTlJfQkxPQ0tTOyArK2Jsb2NrKSB7Ci0JCQlhZGRyZXNzID0gZ2V0X2Jsb2NrX2FkZHJlc3MoYWRkcmVzcywgbG93LCBoaWdoLCBiYW5rLCBibG9jayk7CisJCQlhZGRyZXNzID0gZ2V0X2Jsb2NrX2FkZHJlc3MoY3B1LCBhZGRyZXNzLCBsb3csIGhpZ2gsIGJhbmssIGJsb2NrKTsKIAkJCWlmICghYWRkcmVzcykKIAkJCQlicmVhazsKIApAQCAtNzEzLDYgKzgxNSwzNCBAQAogCS5kZWZhdWx0X2F0dHJzCQk9IGRlZmF1bHRfYXR0cnMsCiB9OwogCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X25hbWUodW5zaWduZWQgaW50IGJhbmssIHN0cnVjdCB0aHJlc2hvbGRfYmxvY2sgKmIpCit7CisJdW5zaWduZWQgaW50IGJhbmtfdHlwZTsKKworCWlmICghbWNlX2ZsYWdzLnNtY2EpIHsKKwkJaWYgKGIgJiYgYmFuayA9PSA0KQorCQkJcmV0dXJuIGJhbms0X25hbWVzKGIpOworCisJCXJldHVybiB0aF9uYW1lc1tiYW5rXTsKKwl9CisKKwlpZiAoIXNtY2FfYmFua3NbYmFua10udHlwZSkKKwkJcmV0dXJuIE5VTEw7CisKKwliYW5rX3R5cGUgPSBzbWNhX2JhbmtzW2JhbmtdLnR5cGUtPmJhbmtfdHlwZTsKKworCWlmIChiICYmIGJhbmtfdHlwZSA9PSBTTUNBX1VNQykgeworCQlpZiAoYi0+YmxvY2sgPCBBUlJBWV9TSVpFKHNtY2FfdW1jX2Jsb2NrX25hbWVzKSkKKwkJCXJldHVybiBzbWNhX3VtY19ibG9ja19uYW1lc1tiLT5ibG9ja107CisJCXJldHVybiBOVUxMOworCX0KKworCXNucHJpbnRmKGJ1Zl9tY2F0eXBlLCBNQVhfTUNBVFlQRV9OQU1FX0xFTiwKKwkJICIlc18leCIsIHNtY2FfYmFua19uYW1lc1tiYW5rX3R5cGVdLm5hbWUsCisJCQkgIHNtY2FfYmFua3NbYmFua10udHlwZV9pbnN0YW5jZSk7CisJcmV0dXJuIGJ1Zl9tY2F0eXBlOworfQorCiBzdGF0aWMgaW50IGFsbG9jYXRlX3RocmVzaG9sZF9ibG9ja3ModW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IGJhbmssCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgYmxvY2ssIHUzMiBhZGRyZXNzKQogewpAQCAtNzY3LDExICs4OTcsMTEgQEAKIAogCWVyciA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZiLT5rb2JqLCAmdGhyZXNob2xkX2t0eXBlLAogCQkJCSAgIHBlcl9jcHUodGhyZXNob2xkX2JhbmtzLCBjcHUpW2JhbmtdLT5rb2JqLAotCQkJCSAgIChiYW5rID09IDQgPyBiYW5rNF9uYW1lcyhiKSA6IHRoX25hbWVzW2JhbmtdKSk7CisJCQkJICAgZ2V0X25hbWUoYmFuaywgYikpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0X2ZyZWU7CiByZWN1cnNlOgotCWFkZHJlc3MgPSBnZXRfYmxvY2tfYWRkcmVzcyhhZGRyZXNzLCBsb3csIGhpZ2gsIGJhbmssICsrYmxvY2spOworCWFkZHJlc3MgPSBnZXRfYmxvY2tfYWRkcmVzcyhjcHUsIGFkZHJlc3MsIGxvdywgaGlnaCwgYmFuaywgKytibG9jayk7CiAJaWYgKCFhZGRyZXNzKQogCQlyZXR1cm4gMDsKIApAQCAtODIyLDcgKzk1Miw3IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gcGVyX2NwdShtY2VfZGV2aWNlLCBjcHUpOwogCXN0cnVjdCBhbWRfbm9ydGhicmlkZ2UgKm5iID0gTlVMTDsKIAlzdHJ1Y3QgdGhyZXNob2xkX2JhbmsgKmIgPSBOVUxMOwotCWNvbnN0IGNoYXIgKm5hbWUgPSB0aF9uYW1lc1tiYW5rXTsKKwljb25zdCBjaGFyICpuYW1lID0gZ2V0X25hbWUoYmFuaywgTlVMTCk7CiAJaW50IGVyciA9IDA7CiAKIAlpZiAoaXNfc2hhcmVkX2JhbmsoYmFuaykpIHsKQEAgLTg2OSw3ICs5OTksNyBAQAogCQl9CiAJfQogCi0JZXJyID0gYWxsb2NhdGVfdGhyZXNob2xkX2Jsb2NrcyhjcHUsIGJhbmssIDAsIE1TUl9JQTMyX01DeF9NSVNDKGJhbmspKTsKKwllcnIgPSBhbGxvY2F0ZV90aHJlc2hvbGRfYmxvY2tzKGNwdSwgYmFuaywgMCwgbXNyX29wcy5taXNjKGJhbmspKTsKIAlpZiAoIWVycikKIAkJZ290byBvdXQ7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWljcm9jb2RlL2FtZC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9taWNyb2NvZGUvYW1kLmMKaW5kZXggMjdhMDIyOC4uNjIwYWIwNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9taWNyb2NvZGUvYW1kLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9taWNyb2NvZGUvYW1kLmMKQEAgLTU0LDYgKzU0LDcgQEAKICAqLwogc3RhdGljIHU4ICpjb250YWluZXI7CiBzdGF0aWMgc2l6ZV90IGNvbnRhaW5lcl9zaXplOworc3RhdGljIGJvb2wgdWNvZGVfYnVpbHRpbjsKIAogc3RhdGljIHUzMiB1Y29kZV9uZXdfcmV2Owogc3RhdGljIHU4IGFtZF91Y29kZV9wYXRjaFtQQVRDSF9NQVhfU0laRV07CkBAIC0yODEsMTggKzI4MiwyMiBAQAogdm9pZCBfX2luaXQgbG9hZF91Y29kZV9hbWRfYnNwKHVuc2lnbmVkIGludCBmYW1pbHkpCiB7CiAJc3RydWN0IGNwaW9fZGF0YSBjcDsKKwlib29sICpidWlsdGluOwogCXZvaWQgKipkYXRhOwogCXNpemVfdCAqc2l6ZTsKIAogI2lmZGVmIENPTkZJR19YODZfMzIKIAlkYXRhID0gICh2b2lkICoqKV9fcGFfbm9kZWJ1ZygmdWNvZGVfY3Bpby5kYXRhKTsKIAlzaXplID0gKHNpemVfdCAqKV9fcGFfbm9kZWJ1ZygmdWNvZGVfY3Bpby5zaXplKTsKKwlidWlsdGluID0gKGJvb2wgKilfX3BhX25vZGVidWcoJnVjb2RlX2J1aWx0aW4pOwogI2Vsc2UKIAlkYXRhID0gJnVjb2RlX2NwaW8uZGF0YTsKIAlzaXplID0gJnVjb2RlX2NwaW8uc2l6ZTsKKwlidWlsdGluID0gJnVjb2RlX2J1aWx0aW47CiAjZW5kaWYKIAotCWlmICghbG9hZF9idWlsdGluX2FtZF9taWNyb2NvZGUoJmNwLCBmYW1pbHkpKQorCSpidWlsdGluID0gbG9hZF9idWlsdGluX2FtZF9taWNyb2NvZGUoJmNwLCBmYW1pbHkpOworCWlmICghKmJ1aWx0aW4pCiAJCWNwID0gZmluZF91Y29kZV9pbl9pbml0cmQoKTsKIAogCWlmICghKGNwLmRhdGEgJiYgY3Auc2l6ZSkpCkBAIC0zNTUsNiArMzYwLDcgQEAKIAl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCXN0cnVjdCBlcXVpdl9jcHVfZW50cnkgKmVxOwogCXN0cnVjdCBtaWNyb2NvZGVfYW1kICptYzsKKwl1OCAqY29udCA9IGNvbnRhaW5lcjsKIAl1MzIgcmV2LCBlYXg7CiAJdTE2IGVxX2lkOwogCkBAIC0zNzEsOCArMzc3LDEyIEBACiAJaWYgKGNoZWNrX2N1cnJlbnRfcGF0Y2hfbGV2ZWwoJnJldiwgZmFsc2UpKQogCQlyZXR1cm47CiAKKwkvKiBBZGQgQ09ORklHX1JBTkRPTUlaRV9NRU1PUlkgb2Zmc2V0LiAqLworCWlmICghdWNvZGVfYnVpbHRpbikKKwkJY29udCArPSBQQUdFX09GRlNFVCAtIF9fUEFHRV9PRkZTRVRfQkFTRTsKKwogCWVheCA9IGNwdWlkX2VheCgweDAwMDAwMDAxKTsKLQllcSAgPSAoc3RydWN0IGVxdWl2X2NwdV9lbnRyeSAqKShjb250YWluZXIgKyBDT05UQUlORVJfSERSX1NaKTsKKwllcSAgPSAoc3RydWN0IGVxdWl2X2NwdV9lbnRyeSAqKShjb250ICsgQ09OVEFJTkVSX0hEUl9TWik7CiAKIAllcV9pZCA9IGZpbmRfZXF1aXZfaWQoZXEsIGVheCk7CiAJaWYgKCFlcV9pZCkKQEAgLTQzNCw2ICs0NDQsMTAgQEAKIAllbHNlCiAJCWNvbnRhaW5lciA9IGNvbnRfdmE7CiAKKwkvKiBBZGQgQ09ORklHX1JBTkRPTUlaRV9NRU1PUlkgb2Zmc2V0LiAqLworCWlmICghdWNvZGVfYnVpbHRpbikKKwkJY29udGFpbmVyICs9IFBBR0VfT0ZGU0VUIC0gX19QQUdFX09GRlNFVF9CQVNFOworCiAJZWF4ICAgPSBjcHVpZF9lYXgoMHgwMDAwMDAwMSk7CiAJZWF4ICAgPSAoKGVheCA+PiA4KSAmIDB4ZikgKyAoKGVheCA+PiAyMCkgJiAweGZmKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9taWNyb2NvZGUvY29yZS5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9taWNyb2NvZGUvY29yZS5jCmluZGV4IGRmMDRiMmQuLjVjZTUxNTUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWljcm9jb2RlL2NvcmUuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21pY3JvY29kZS9jb3JlLmMKQEAgLTU1OCw1NSArNTU4LDM2IEBACiAJLnJlc3VtZQkJCT0gbWNfYnBfcmVzdW1lLAogfTsKIAotc3RhdGljIGludAotbWNfY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQorc3RhdGljIGludCBtY19jcHVfb25saW5lKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0JdW5zaWduZWQgaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCiAJZGV2ID0gZ2V0X2NwdV9kZXZpY2UoY3B1KTsKKwltaWNyb2NvZGVfdXBkYXRlX2NwdShjcHUpOworCXByX2RlYnVnKCJDUFUlZCBhZGRlZFxuIiwgY3B1KTsKIAotCXN3aXRjaCAoYWN0aW9uICYgfkNQVV9UQVNLU19GUk9aRU4pIHsKLQljYXNlIENQVV9PTkxJTkU6Ci0JCW1pY3JvY29kZV91cGRhdGVfY3B1KGNwdSk7Ci0JCXByX2RlYnVnKCJDUFUlZCBhZGRlZFxuIiwgY3B1KTsKLQkJLyoKLQkJICogImJyZWFrIiBpcyBtaXNzaW5nIG9uIHB1cnBvc2UgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdG8gZmFsbAotCQkgKiB0aHJvdWdoIGluIG9yZGVyIHRvIGNyZWF0ZSB0aGUgc3lzZnMgZ3JvdXAuCi0JCSAqLworCWlmIChzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJm1jX2F0dHJfZ3JvdXApKQorCQlwcl9lcnIoIkZhaWxlZCB0byBjcmVhdGUgZ3JvdXAgZm9yIENQVSVkXG4iLCBjcHUpOworCXJldHVybiAwOworfQogCi0JY2FzZSBDUFVfRE9XTl9GQUlMRUQ6Ci0JCWlmIChzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJm1jX2F0dHJfZ3JvdXApKQotCQkJcHJfZXJyKCJGYWlsZWQgdG8gY3JlYXRlIGdyb3VwIGZvciBDUFUlZFxuIiwgY3B1KTsKLQkJYnJlYWs7CitzdGF0aWMgaW50IG1jX2NwdV9kb3duX3ByZXAodW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAKLQljYXNlIENQVV9ET1dOX1BSRVBBUkU6Ci0JCS8qIFN1c3BlbmQgaXMgaW4gcHJvZ3Jlc3MsIG9ubHkgcmVtb3ZlIHRoZSBpbnRlcmZhY2UgKi8KLQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXYtPmtvYmosICZtY19hdHRyX2dyb3VwKTsKLQkJcHJfZGVidWcoIkNQVSVkIHJlbW92ZWRcbiIsIGNwdSk7Ci0JCWJyZWFrOwotCisJZGV2ID0gZ2V0X2NwdV9kZXZpY2UoY3B1KTsKKwkvKiBTdXNwZW5kIGlzIGluIHByb2dyZXNzLCBvbmx5IHJlbW92ZSB0aGUgaW50ZXJmYWNlICovCisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXYtPmtvYmosICZtY19hdHRyX2dyb3VwKTsKKwlwcl9kZWJ1ZygiQ1BVJWQgcmVtb3ZlZFxuIiwgY3B1KTsKIAkvKgotCSAqIGNhc2UgQ1BVX0RFQUQ6Ci0JICoKIAkgKiBXaGVuIGEgQ1BVIGdvZXMgb2ZmbGluZSwgZG9uJ3QgZnJlZSB1cCBvciBpbnZhbGlkYXRlIHRoZSBjb3B5IG9mCiAJICogdGhlIG1pY3JvY29kZSBpbiBrZXJuZWwgbWVtb3J5LCBzbyB0aGF0IHdlIGNhbiByZXVzZSBpdCB3aGVuIHRoZQogCSAqIENQVSBjb21lcyBiYWNrIG9ubGluZSB3aXRob3V0IHVubmVjZXNzYXJpbHkgcmVxdWVzdGluZyB0aGUgdXNlcnNwYWNlCiAJICogZm9yIGl0IGFnYWluLgogCSAqLwotCX0KLQotCS8qIFRoZSBDUFUgcmVmdXNlZCB0byBjb21lIHVwIGR1cmluZyBhIHN5c3RlbSByZXN1bWUgKi8KLQlpZiAoYWN0aW9uID09IENQVV9VUF9DQU5DRUxFRF9GUk9aRU4pCi0JCW1pY3JvY29kZV9maW5pX2NwdShjcHUpOwotCi0JcmV0dXJuIE5PVElGWV9PSzsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBtY19jcHVfbm90aWZpZXIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwJPSBtY19jcHVfY2FsbGJhY2ssCi19OwotCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY3B1X3Jvb3RfbWljcm9jb2RlX2F0dHJzW10gPSB7CiAJJmRldl9hdHRyX3JlbG9hZC5hdHRyLAogCU5VTEwKQEAgLTY2NSw3ICs2NDYsOCBAQAogCQlnb3RvIG91dF91Y29kZV9ncm91cDsKIAogCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZtY19zeXNjb3JlX29wcyk7Ci0JcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZtY19jcHVfbm90aWZpZXIpOworCWNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVBfT05MSU5FX0RZTiwgIng4Ni9taWNyb2NvZGU6b25saW5lIiwKKwkJCQkgIG1jX2NwdV9vbmxpbmUsIG1jX2NwdV9kb3duX3ByZXApOwogCiAJcHJfaW5mbygiTWljcm9jb2RlIFVwZGF0ZSBEcml2ZXI6IHYiIE1JQ1JPQ09ERV9WRVJTSU9OCiAJCSIgPHRpZ3JhbkBhaXZhemlhbi5mc25ldC5jby51az4sIFBldGVyIE9ydWJhXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9tYWluLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvbWFpbi5jCmluZGV4IDI4ZjFiNTQuLjI0ZTg3ZTcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9tYWluLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL21haW4uYwpAQCAtNzIsMTQgKzcyLDE0IEBACiB1NjQgc2l6ZV9vcl9tYXNrLCBzaXplX2FuZF9tYXNrOwogc3RhdGljIGJvb2wgbXRycl9hcHNfZGVsYXllZF9pbml0OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG10cnJfb3BzICptdHJyX29wc1tYODZfVkVORE9SX05VTV07CitzdGF0aWMgY29uc3Qgc3RydWN0IG10cnJfb3BzICptdHJyX29wc1tYODZfVkVORE9SX05VTV0gX19yb19hZnRlcl9pbml0OwogCiBjb25zdCBzdHJ1Y3QgbXRycl9vcHMgKm10cnJfaWY7CiAKIHN0YXRpYyB2b2lkIHNldF9tdHJyKHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGxvbmcgYmFzZSwKIAkJICAgICB1bnNpZ25lZCBsb25nIHNpemUsIG10cnJfdHlwZSB0eXBlKTsKIAotdm9pZCBzZXRfbXRycl9vcHMoY29uc3Qgc3RydWN0IG10cnJfb3BzICpvcHMpCit2b2lkIF9faW5pdCBzZXRfbXRycl9vcHMoY29uc3Qgc3RydWN0IG10cnJfb3BzICpvcHMpCiB7CiAJaWYgKG9wcy0+dmVuZG9yICYmIG9wcy0+dmVuZG9yIDwgWDg2X1ZFTkRPUl9OVU0pCiAJCW10cnJfb3BzW29wcy0+dmVuZG9yXSA9IG9wczsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9tdHJyLmggYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvbXRyci5oCmluZGV4IDZjN2NlZDAuLmFkOGJkNzYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9tdHJyLmgKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL210cnIuaApAQCAtNTQsNyArNTQsNyBAQAogYm9vbCBnZXRfbXRycl9zdGF0ZSh2b2lkKTsKIHZvaWQgbXRycl9icF9wYXRfaW5pdCh2b2lkKTsKIAotZXh0ZXJuIHZvaWQgc2V0X210cnJfb3BzKGNvbnN0IHN0cnVjdCBtdHJyX29wcyAqb3BzKTsKK2V4dGVybiB2b2lkIF9faW5pdCBzZXRfbXRycl9vcHMoY29uc3Qgc3RydWN0IG10cnJfb3BzICpvcHMpOwogCiBleHRlcm4gdTY0IHNpemVfb3JfbWFzaywgc2l6ZV9hbmRfbWFzazsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgbXRycl9vcHMgKm10cnJfaWY7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrLmMgYi9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrLmMKaW5kZXggOTJlOGYwYS4uOWI3Y2Y1YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2R1bXBzdGFjay5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2suYwpAQCAtMTcsNyArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAKICNpbmNsdWRlIDxhc20vc3RhY2t0cmFjZS5oPgotCisjaW5jbHVkZSA8YXNtL3Vud2luZC5oPgogCiBpbnQgcGFuaWNfb25fdW5yZWNvdmVyZWRfbm1pOwogaW50IHBhbmljX29uX2lvX25taTsKQEAgLTI1LDExICsyNSwyOSBAQAogaW50IGtzdGFja19kZXB0aF90b19wcmludCA9IDMgKiBTVEFDS1NMT1RTX1BFUl9MSU5FOwogc3RhdGljIGludCBkaWVfY291bnRlcjsKIAotc3RhdGljIHZvaWQgcHJpbnRrX3N0YWNrX2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgcmVsaWFibGUsCi0JCXZvaWQgKmRhdGEpCitib29sIGluX3Rhc2tfc3RhY2sodW5zaWduZWQgbG9uZyAqc3RhY2ssIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJICAgc3RydWN0IHN0YWNrX2luZm8gKmluZm8pCiB7CisJdW5zaWduZWQgbG9uZyAqYmVnaW4gPSB0YXNrX3N0YWNrX3BhZ2UodGFzayk7CisJdW5zaWduZWQgbG9uZyAqZW5kICAgPSB0YXNrX3N0YWNrX3BhZ2UodGFzaykgKyBUSFJFQURfU0laRTsKKworCWlmIChzdGFjayA8IGJlZ2luIHx8IHN0YWNrID49IGVuZCkKKwkJcmV0dXJuIGZhbHNlOworCisJaW5mby0+dHlwZQk9IFNUQUNLX1RZUEVfVEFTSzsKKwlpbmZvLT5iZWdpbgk9IGJlZ2luOworCWluZm8tPmVuZAk9IGVuZDsKKwlpbmZvLT5uZXh0X3NwCT0gTlVMTDsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBwcmludGtfc3RhY2tfYWRkcmVzcyh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGludCByZWxpYWJsZSwKKwkJCQkgY2hhciAqbG9nX2x2bCkKK3sKKwl0b3VjaF9ubWlfd2F0Y2hkb2coKTsKIAlwcmludGsoIiVzIFs8JXA+XSAlcyVwQlxuIiwKLQkJKGNoYXIgKilkYXRhLCAodm9pZCAqKWFkZHJlc3MsIHJlbGlhYmxlID8gIiIgOiAiPyAiLAorCQlsb2dfbHZsLCAodm9pZCAqKWFkZHJlc3MsIHJlbGlhYmxlID8gIiIgOiAiPyAiLAogCQkodm9pZCAqKWFkZHJlc3MpOwogfQogCkBAIC0zOCwxNzYgKzU2LDEyMCBAQAogCXByX2NvbnQoIiBbPCVwPl0gJXBTXG4iLCAodm9pZCAqKWFkZHJlc3MsICh2b2lkICopYWRkcmVzcyk7CiB9CiAKLSNpZmRlZiBDT05GSUdfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSCi1zdGF0aWMgdm9pZAotcHJpbnRfZnRyYWNlX2dyYXBoX2FkZHIodW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpkYXRhLAotCQkJY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzICpvcHMsCi0JCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCAqZ3JhcGgpCit2b2lkIHNob3dfdHJhY2VfbG9nX2x2bChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJdW5zaWduZWQgbG9uZyAqc3RhY2ssIGNoYXIgKmxvZ19sdmwpCiB7Ci0JdW5zaWduZWQgbG9uZyByZXRfYWRkcjsKLQlpbnQgaW5kZXg7CisJc3RydWN0IHVud2luZF9zdGF0ZSBzdGF0ZTsKKwlzdHJ1Y3Qgc3RhY2tfaW5mbyBzdGFja19pbmZvID0gezB9OworCXVuc2lnbmVkIGxvbmcgdmlzaXRfbWFzayA9IDA7CisJaW50IGdyYXBoX2lkeCA9IDA7CiAKLQlpZiAoYWRkciAhPSAodW5zaWduZWQgbG9uZylyZXR1cm5fdG9faGFuZGxlcikKLQkJcmV0dXJuOworCXByaW50aygiJXNDYWxsIFRyYWNlOlxuIiwgbG9nX2x2bCk7CiAKLQlpbmRleCA9IHRhc2stPmN1cnJfcmV0X3N0YWNrOwotCi0JaWYgKCF0YXNrLT5yZXRfc3RhY2sgfHwgaW5kZXggPCAqZ3JhcGgpCi0JCXJldHVybjsKLQotCWluZGV4IC09ICpncmFwaDsKLQlyZXRfYWRkciA9IHRhc2stPnJldF9zdGFja1tpbmRleF0ucmV0OwotCi0Jb3BzLT5hZGRyZXNzKGRhdGEsIHJldF9hZGRyLCAxKTsKLQotCSgqZ3JhcGgpKys7Ci19Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkCi1wcmludF9mdHJhY2VfZ3JhcGhfYWRkcih1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmRhdGEsCi0JCQljb25zdCBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgKm9wcywKLQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50ICpncmFwaCkKLXsgfQotI2VuZGlmCi0KLS8qCi0gKiB4ODYtNjQgY2FuIGhhdmUgdXAgdG8gdGhyZWUga2VybmVsIHN0YWNrczoKLSAqIHByb2Nlc3Mgc3RhY2sKLSAqIGludGVycnVwdCBzdGFjawotICogc2V2ZXJlIGV4Y2VwdGlvbiAoZG91YmxlIGZhdWx0LCBubWksIHN0YWNrIGZhdWx0LCBkZWJ1ZywgbWNlKSBoYXJkd2FyZSBzdGFjawotICovCi0KLXN0YXRpYyBpbmxpbmUgaW50IHZhbGlkX3N0YWNrX3B0cihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCi0JCQl2b2lkICpwLCB1bnNpZ25lZCBpbnQgc2l6ZSwgdm9pZCAqZW5kKQotewotCXZvaWQgKnQgPSB0YXNrX3N0YWNrX3BhZ2UodGFzayk7Ci0JaWYgKGVuZCkgewotCQlpZiAocCA8IGVuZCAmJiBwID49IChlbmQtVEhSRUFEX1NJWkUpKQotCQkJcmV0dXJuIDE7Ci0JCWVsc2UKLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gcCA+PSB0ICYmIHAgPCB0ICsgVEhSRUFEX1NJWkUgLSBzaXplOwotfQotCi11bnNpZ25lZCBsb25nCi1wcmludF9jb250ZXh0X3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKLQkJdW5zaWduZWQgbG9uZyAqc3RhY2ssIHVuc2lnbmVkIGxvbmcgYnAsCi0JCWNvbnN0IHN0cnVjdCBzdGFja3RyYWNlX29wcyAqb3BzLCB2b2lkICpkYXRhLAotCQl1bnNpZ25lZCBsb25nICplbmQsIGludCAqZ3JhcGgpCi17Ci0Jc3RydWN0IHN0YWNrX2ZyYW1lICpmcmFtZSA9IChzdHJ1Y3Qgc3RhY2tfZnJhbWUgKilicDsKKwl1bndpbmRfc3RhcnQoJnN0YXRlLCB0YXNrLCByZWdzLCBzdGFjayk7CiAKIAkvKgotCSAqIElmIHdlIG92ZXJmbG93ZWQgdGhlIHN0YWNrIGludG8gYSBndWFyZCBwYWdlLCBqdW1wIGJhY2sgdG8gdGhlCi0JICogYm90dG9tIG9mIHRoZSB1c2FibGUgc3RhY2suCisJICogSXRlcmF0ZSB0aHJvdWdoIHRoZSBzdGFja3MsIHN0YXJ0aW5nIHdpdGggdGhlIGN1cnJlbnQgc3RhY2sgcG9pbnRlci4KKwkgKiBFYWNoIHN0YWNrIGhhcyBhIHBvaW50ZXIgdG8gdGhlIG5leHQgb25lLgorCSAqCisJICogeDg2LTY0IGNhbiBoYXZlIHNldmVyYWwgc3RhY2tzOgorCSAqIC0gdGFzayBzdGFjaworCSAqIC0gaW50ZXJydXB0IHN0YWNrCisJICogLSBIVyBleGNlcHRpb24gc3RhY2tzIChkb3VibGUgZmF1bHQsIG5taSwgZGVidWcsIG1jZSkKKwkgKgorCSAqIHg4Ni0zMiBjYW4gaGF2ZSB1cCB0byB0aHJlZSBzdGFja3M6CisJICogLSB0YXNrIHN0YWNrCisJICogLSBzb2Z0aXJxIHN0YWNrCisJICogLSBoYXJkaXJxIHN0YWNrCiAJICovCi0JaWYgKCh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZSh0YXNrKSAtICh1bnNpZ25lZCBsb25nKXN0YWNrIDwKLQkgICAgUEFHRV9TSVpFKQotCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopdGFza19zdGFja19wYWdlKHRhc2spOworCWZvciAoOyBzdGFjazsgc3RhY2sgPSBzdGFja19pbmZvLm5leHRfc3ApIHsKKwkJY29uc3QgY2hhciAqc3RyX2JlZ2luLCAqc3RyX2VuZDsKIAotCXdoaWxlICh2YWxpZF9zdGFja19wdHIodGFzaywgc3RhY2ssIHNpemVvZigqc3RhY2spLCBlbmQpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwkJLyoKKwkJICogSWYgd2Ugb3ZlcmZsb3dlZCB0aGUgdGFzayBzdGFjayBpbnRvIGEgZ3VhcmQgcGFnZSwganVtcCBiYWNrCisJCSAqIHRvIHRoZSBib3R0b20gb2YgdGhlIHVzYWJsZSBzdGFjay4KKwkJICovCisJCWlmICh0YXNrX3N0YWNrX3BhZ2UodGFzaykgLSAodm9pZCAqKXN0YWNrIDwgUEFHRV9TSVpFKQorCQkJc3RhY2sgPSB0YXNrX3N0YWNrX3BhZ2UodGFzayk7CiAKLQkJYWRkciA9ICpzdGFjazsKLQkJaWYgKF9fa2VybmVsX3RleHRfYWRkcmVzcyhhZGRyKSkgewotCQkJaWYgKCh1bnNpZ25lZCBsb25nKSBzdGFjayA9PSBicCArIHNpemVvZihsb25nKSkgewotCQkJCW9wcy0+YWRkcmVzcyhkYXRhLCBhZGRyLCAxKTsKLQkJCQlmcmFtZSA9IGZyYW1lLT5uZXh0X2ZyYW1lOwotCQkJCWJwID0gKHVuc2lnbmVkIGxvbmcpIGZyYW1lOwotCQkJfSBlbHNlIHsKLQkJCQlvcHMtPmFkZHJlc3MoZGF0YSwgYWRkciwgMCk7Ci0JCQl9Ci0JCQlwcmludF9mdHJhY2VfZ3JhcGhfYWRkcihhZGRyLCBkYXRhLCBvcHMsIHRhc2ssIGdyYXBoKTsKKwkJaWYgKGdldF9zdGFja19pbmZvKHN0YWNrLCB0YXNrLCAmc3RhY2tfaW5mbywgJnZpc2l0X21hc2spKQorCQkJYnJlYWs7CisKKwkJc3RhY2tfdHlwZV9zdHIoc3RhY2tfaW5mby50eXBlLCAmc3RyX2JlZ2luLCAmc3RyX2VuZCk7CisJCWlmIChzdHJfYmVnaW4pCisJCQlwcmludGsoIiVzIDwlcz4gIiwgbG9nX2x2bCwgc3RyX2JlZ2luKTsKKworCQkvKgorCQkgKiBTY2FuIHRoZSBzdGFjaywgcHJpbnRpbmcgYW55IHRleHQgYWRkcmVzc2VzIHdlIGZpbmQuICBBdCB0aGUKKwkJICogc2FtZSB0aW1lLCBmb2xsb3cgcHJvcGVyIHN0YWNrIGZyYW1lcyB3aXRoIHRoZSB1bndpbmRlci4KKwkJICoKKwkJICogQWRkcmVzc2VzIGZvdW5kIGR1cmluZyB0aGUgc2NhbiB3aGljaCBhcmUgbm90IHJlcG9ydGVkIGJ5CisJCSAqIHRoZSB1bndpbmRlciBhcmUgY29uc2lkZXJlZCB0byBiZSBhZGRpdGlvbmFsIGNsdWVzIHdoaWNoIGFyZQorCQkgKiBzb21ldGltZXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kIGFyZSBwcmVmaXhlZCB3aXRoICc/Jy4KKwkJICogVGhpcyBhbHNvIHNlcnZlcyBhcyBhIGZhaWxzYWZlIG9wdGlvbiBpbiBjYXNlIHRoZSB1bndpbmRlcgorCQkgKiBnb2VzIG9mZiBpbiB0aGUgd2VlZHMuCisJCSAqLworCQlmb3IgKDsgc3RhY2sgPCBzdGFja19pbmZvLmVuZDsgc3RhY2srKykgeworCQkJdW5zaWduZWQgbG9uZyByZWFsX2FkZHI7CisJCQlpbnQgcmVsaWFibGUgPSAwOworCQkJdW5zaWduZWQgbG9uZyBhZGRyID0gKnN0YWNrOworCQkJdW5zaWduZWQgbG9uZyAqcmV0X2FkZHJfcCA9CisJCQkJdW53aW5kX2dldF9yZXR1cm5fYWRkcmVzc19wdHIoJnN0YXRlKTsKKworCQkJaWYgKCFfX2tlcm5lbF90ZXh0X2FkZHJlc3MoYWRkcikpCisJCQkJY29udGludWU7CisKKwkJCWlmIChzdGFjayA9PSByZXRfYWRkcl9wKQorCQkJCXJlbGlhYmxlID0gMTsKKworCQkJLyoKKwkJCSAqIFdoZW4gZnVuY3Rpb24gZ3JhcGggdHJhY2luZyBpcyBlbmFibGVkIGZvciBhCisJCQkgKiBmdW5jdGlvbiwgaXRzIHJldHVybiBhZGRyZXNzIG9uIHRoZSBzdGFjayBpcworCQkJICogcmVwbGFjZWQgd2l0aCB0aGUgYWRkcmVzcyBvZiBhbiBmdHJhY2UgaGFuZGxlcgorCQkJICogKHJldHVybl90b19oYW5kbGVyKS4gIEluIHRoYXQgY2FzZSwgYmVmb3JlIHByaW50aW5nCisJCQkgKiB0aGUgInJlYWwiIGFkZHJlc3MsIHdlIHdhbnQgdG8gcHJpbnQgdGhlIGhhbmRsZXIKKwkJCSAqIGFkZHJlc3MgYXMgYW4gInVucmVsaWFibGUiIGhpbnQgdGhhdCBmdW5jdGlvbiBncmFwaAorCQkJICogdHJhY2luZyB3YXMgaW52b2x2ZWQuCisJCQkgKi8KKwkJCXJlYWxfYWRkciA9IGZ0cmFjZV9ncmFwaF9yZXRfYWRkcih0YXNrLCAmZ3JhcGhfaWR4LAorCQkJCQkJCSAgYWRkciwgc3RhY2spOworCQkJaWYgKHJlYWxfYWRkciAhPSBhZGRyKQorCQkJCXByaW50a19zdGFja19hZGRyZXNzKGFkZHIsIDAsIGxvZ19sdmwpOworCQkJcHJpbnRrX3N0YWNrX2FkZHJlc3MocmVhbF9hZGRyLCByZWxpYWJsZSwgbG9nX2x2bCk7CisKKwkJCWlmICghcmVsaWFibGUpCisJCQkJY29udGludWU7CisKKwkJCS8qCisJCQkgKiBHZXQgdGhlIG5leHQgZnJhbWUgZnJvbSB0aGUgdW53aW5kZXIuICBObyBuZWVkIHRvCisJCQkgKiBjaGVjayBmb3IgYW4gZXJyb3I6IGlmIGFueXRoaW5nIGdvZXMgd3JvbmcsIHRoZSByZXN0CisJCQkgKiBvZiB0aGUgYWRkcmVzc2VzIHdpbGwganVzdCBiZSBwcmludGVkIGFzIHVucmVsaWFibGUuCisJCQkgKi8KKwkJCXVud2luZF9uZXh0X2ZyYW1lKCZzdGF0ZSk7CiAJCX0KLQkJc3RhY2srKzsKKworCQlpZiAoc3RyX2VuZCkKKwkJCXByaW50aygiJXMgPCVzPiAiLCBsb2dfbHZsLCBzdHJfZW5kKTsKIAl9Ci0JcmV0dXJuIGJwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwocHJpbnRfY29udGV4dF9zdGFjayk7Ci0KLXVuc2lnbmVkIGxvbmcKLXByaW50X2NvbnRleHRfc3RhY2tfYnAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyAqc3RhY2ssIHVuc2lnbmVkIGxvbmcgYnAsCi0JCSAgICAgICBjb25zdCBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgKm9wcywgdm9pZCAqZGF0YSwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmVuZCwgaW50ICpncmFwaCkKLXsKLQlzdHJ1Y3Qgc3RhY2tfZnJhbWUgKmZyYW1lID0gKHN0cnVjdCBzdGFja19mcmFtZSAqKWJwOwotCXVuc2lnbmVkIGxvbmcgKnJldF9hZGRyID0gJmZyYW1lLT5yZXR1cm5fYWRkcmVzczsKLQotCXdoaWxlICh2YWxpZF9zdGFja19wdHIodGFzaywgcmV0X2FkZHIsIHNpemVvZigqcmV0X2FkZHIpLCBlbmQpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgYWRkciA9ICpyZXRfYWRkcjsKLQotCQlpZiAoIV9fa2VybmVsX3RleHRfYWRkcmVzcyhhZGRyKSkKLQkJCWJyZWFrOwotCi0JCWlmIChvcHMtPmFkZHJlc3MoZGF0YSwgYWRkciwgMSkpCi0JCQlicmVhazsKLQkJZnJhbWUgPSBmcmFtZS0+bmV4dF9mcmFtZTsKLQkJcmV0X2FkZHIgPSAmZnJhbWUtPnJldHVybl9hZGRyZXNzOwotCQlwcmludF9mdHJhY2VfZ3JhcGhfYWRkcihhZGRyLCBkYXRhLCBvcHMsIHRhc2ssIGdyYXBoKTsKLQl9Ci0KLQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpZnJhbWU7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChwcmludF9jb250ZXh0X3N0YWNrX2JwKTsKLQotc3RhdGljIGludCBwcmludF90cmFjZV9zdGFjayh2b2lkICpkYXRhLCBjaGFyICpuYW1lKQotewotCXByaW50aygiJXMgPCVzPiAiLCAoY2hhciAqKWRhdGEsIG5hbWUpOwotCXJldHVybiAwOwotfQotCi0vKgotICogUHJpbnQgb25lIGFkZHJlc3Mvc3ltYm9sIGVudHJpZXMgcGVyIGxpbmUuCi0gKi8KLXN0YXRpYyBpbnQgcHJpbnRfdHJhY2VfYWRkcmVzcyh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGFkZHIsIGludCByZWxpYWJsZSkKLXsKLQl0b3VjaF9ubWlfd2F0Y2hkb2coKTsKLQlwcmludGtfc3RhY2tfYWRkcmVzcyhhZGRyLCByZWxpYWJsZSwgZGF0YSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgcHJpbnRfdHJhY2Vfb3BzID0gewotCS5zdGFjawkJCT0gcHJpbnRfdHJhY2Vfc3RhY2ssCi0JLmFkZHJlc3MJCT0gcHJpbnRfdHJhY2VfYWRkcmVzcywKLQkud2Fsa19zdGFjawkJPSBwcmludF9jb250ZXh0X3N0YWNrLAotfTsKLQotdm9pZAotc2hvd190cmFjZV9sb2dfbHZsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCXVuc2lnbmVkIGxvbmcgKnN0YWNrLCB1bnNpZ25lZCBsb25nIGJwLCBjaGFyICpsb2dfbHZsKQotewotCXByaW50aygiJXNDYWxsIFRyYWNlOlxuIiwgbG9nX2x2bCk7Ci0JZHVtcF90cmFjZSh0YXNrLCByZWdzLCBzdGFjaywgYnAsICZwcmludF90cmFjZV9vcHMsIGxvZ19sdmwpOwotfQotCi12b2lkIHNob3dfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJdW5zaWduZWQgbG9uZyAqc3RhY2ssIHVuc2lnbmVkIGxvbmcgYnApCi17Ci0Jc2hvd190cmFjZV9sb2dfbHZsKHRhc2ssIHJlZ3MsIHN0YWNrLCBicCwgIiIpOwogfQogCiB2b2lkIHNob3dfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nICpzcCkKIHsKLQl1bnNpZ25lZCBsb25nIGJwID0gMDsKLQl1bnNpZ25lZCBsb25nIHN0YWNrOworCXRhc2sgPSB0YXNrID8gOiBjdXJyZW50OwogCiAJLyoKIAkgKiBTdGFjayBmcmFtZXMgYmVsb3cgdGhpcyBvbmUgYXJlbid0IGludGVyZXN0aW5nLiAgRG9uJ3Qgc2hvdyB0aGVtCiAJICogaWYgd2UncmUgcHJpbnRpbmcgZm9yICVjdXJyZW50LgogCSAqLwotCWlmICghc3AgJiYgKCF0YXNrIHx8IHRhc2sgPT0gY3VycmVudCkpIHsKLQkJc3AgPSAmc3RhY2s7Ci0JCWJwID0gc3RhY2tfZnJhbWUoY3VycmVudCwgTlVMTCk7Ci0JfQorCWlmICghc3AgJiYgdGFzayA9PSBjdXJyZW50KQorCQlzcCA9IGdldF9zdGFja19wb2ludGVyKGN1cnJlbnQsIE5VTEwpOwogCi0Jc2hvd19zdGFja19sb2dfbHZsKHRhc2ssIE5VTEwsIHNwLCBicCwgIiIpOworCXNob3dfc3RhY2tfbG9nX2x2bCh0YXNrLCBOVUxMLCBzcCwgIiIpOwogfQogCiB2b2lkIHNob3dfc3RhY2tfcmVncyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzaG93X3N0YWNrX2xvZ19sdmwoY3VycmVudCwgcmVncywgKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5zcCwgcmVncy0+YnAsICIiKTsKKwlzaG93X3N0YWNrX2xvZ19sdmwoY3VycmVudCwgcmVncywgTlVMTCwgIiIpOwogfQogCiBzdGF0aWMgYXJjaF9zcGlubG9ja190IGRpZV9sb2NrID0gX19BUkNIX1NQSU5fTE9DS19VTkxPQ0tFRDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfMzIuYwppbmRleCAwOTY3NTcxLi4wNmViMzIyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja18zMi5jCkBAIC0xNiw5MyArMTYsMTIxIEBACiAKICNpbmNsdWRlIDxhc20vc3RhY2t0cmFjZS5oPgogCi1zdGF0aWMgdm9pZCAqaXNfaXJxX3N0YWNrKHZvaWQgKnAsIHZvaWQgKmlycSkKK3ZvaWQgc3RhY2tfdHlwZV9zdHIoZW51bSBzdGFja190eXBlIHR5cGUsIGNvbnN0IGNoYXIgKipiZWdpbiwgY29uc3QgY2hhciAqKmVuZCkKIHsKLQlpZiAocCA8IGlycSB8fCBwID49IChpcnEgKyBUSFJFQURfU0laRSkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBpcnEgKyBUSFJFQURfU0laRTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNUQUNLX1RZUEVfSVJROgorCWNhc2UgU1RBQ0tfVFlQRV9TT0ZUSVJROgorCQkqYmVnaW4gPSAiSVJRIjsKKwkJKmVuZCAgID0gIkVPSSI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCSpiZWdpbiA9IE5VTEw7CisJCSplbmQgICA9IE5VTEw7CisJfQogfQogCi0KLXN0YXRpYyB2b2lkICppc19oYXJkaXJxX3N0YWNrKHVuc2lnbmVkIGxvbmcgKnN0YWNrLCBpbnQgY3B1KQorc3RhdGljIGJvb2wgaW5faGFyZGlycV9zdGFjayh1bnNpZ25lZCBsb25nICpzdGFjaywgc3RydWN0IHN0YWNrX2luZm8gKmluZm8pCiB7Ci0Jdm9pZCAqaXJxID0gcGVyX2NwdShoYXJkaXJxX3N0YWNrLCBjcHUpOworCXVuc2lnbmVkIGxvbmcgKmJlZ2luID0gKHVuc2lnbmVkIGxvbmcgKil0aGlzX2NwdV9yZWFkKGhhcmRpcnFfc3RhY2spOworCXVuc2lnbmVkIGxvbmcgKmVuZCAgID0gYmVnaW4gKyAoVEhSRUFEX1NJWkUgLyBzaXplb2YobG9uZykpOwogCi0JcmV0dXJuIGlzX2lycV9zdGFjayhzdGFjaywgaXJxKTsKKwkvKgorCSAqIFRoaXMgaXMgYSBzb2Z0d2FyZSBzdGFjaywgc28gJ2VuZCcgY2FuIGJlIGEgdmFsaWQgc3RhY2sgcG9pbnRlci4KKwkgKiBJdCBqdXN0IG1lYW5zIHRoZSBzdGFjayBpcyBlbXB0eS4KKwkgKi8KKwlpZiAoc3RhY2sgPCBiZWdpbiB8fCBzdGFjayA+IGVuZCkKKwkJcmV0dXJuIGZhbHNlOworCisJaW5mby0+dHlwZQk9IFNUQUNLX1RZUEVfSVJROworCWluZm8tPmJlZ2luCT0gYmVnaW47CisJaW5mby0+ZW5kCT0gZW5kOworCisJLyoKKwkgKiBTZWUgaXJxXzMyLmMgLS0gdGhlIG5leHQgc3RhY2sgcG9pbnRlciBpcyBzdG9yZWQgYXQgdGhlIGJlZ2lubmluZyBvZgorCSAqIHRoZSBzdGFjay4KKwkgKi8KKwlpbmZvLT5uZXh0X3NwCT0gKHVuc2lnbmVkIGxvbmcgKikqYmVnaW47CisKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHZvaWQgKmlzX3NvZnRpcnFfc3RhY2sodW5zaWduZWQgbG9uZyAqc3RhY2ssIGludCBjcHUpCitzdGF0aWMgYm9vbCBpbl9zb2Z0aXJxX3N0YWNrKHVuc2lnbmVkIGxvbmcgKnN0YWNrLCBzdHJ1Y3Qgc3RhY2tfaW5mbyAqaW5mbykKIHsKLQl2b2lkICppcnEgPSBwZXJfY3B1KHNvZnRpcnFfc3RhY2ssIGNwdSk7CisJdW5zaWduZWQgbG9uZyAqYmVnaW4gPSAodW5zaWduZWQgbG9uZyAqKXRoaXNfY3B1X3JlYWQoc29mdGlycV9zdGFjayk7CisJdW5zaWduZWQgbG9uZyAqZW5kICAgPSBiZWdpbiArIChUSFJFQURfU0laRSAvIHNpemVvZihsb25nKSk7CiAKLQlyZXR1cm4gaXNfaXJxX3N0YWNrKHN0YWNrLCBpcnEpOworCS8qCisJICogVGhpcyBpcyBhIHNvZnR3YXJlIHN0YWNrLCBzbyAnZW5kJyBjYW4gYmUgYSB2YWxpZCBzdGFjayBwb2ludGVyLgorCSAqIEl0IGp1c3QgbWVhbnMgdGhlIHN0YWNrIGlzIGVtcHR5LgorCSAqLworCWlmIChzdGFjayA8IGJlZ2luIHx8IHN0YWNrID4gZW5kKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpbmZvLT50eXBlCT0gU1RBQ0tfVFlQRV9TT0ZUSVJROworCWluZm8tPmJlZ2luCT0gYmVnaW47CisJaW5mby0+ZW5kCT0gZW5kOworCisJLyoKKwkgKiBUaGUgbmV4dCBzdGFjayBwb2ludGVyIGlzIHN0b3JlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdGFjay4KKwkgKiBTZWUgaXJxXzMyLmMuCisJICovCisJaW5mby0+bmV4dF9zcAk9ICh1bnNpZ25lZCBsb25nICopKmJlZ2luOworCisJcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgZHVtcF90cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQl1bnNpZ25lZCBsb25nICpzdGFjaywgdW5zaWduZWQgbG9uZyBicCwKLQkJY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzICpvcHMsIHZvaWQgKmRhdGEpCitpbnQgZ2V0X3N0YWNrX2luZm8odW5zaWduZWQgbG9uZyAqc3RhY2ssIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJICAgc3RydWN0IHN0YWNrX2luZm8gKmluZm8sIHVuc2lnbmVkIGxvbmcgKnZpc2l0X21hc2spCiB7Ci0JY29uc3QgdW5zaWduZWQgY3B1ID0gZ2V0X2NwdSgpOwotCWludCBncmFwaCA9IDA7Ci0JdTMyICpwcmV2X2VzcDsKKwlpZiAoIXN0YWNrKQorCQlnb3RvIHVua25vd247CiAKLQlpZiAoIXRhc2spCi0JCXRhc2sgPSBjdXJyZW50OworCXRhc2sgPSB0YXNrID8gOiBjdXJyZW50OwogCi0JaWYgKCFzdGFjaykgewotCQl1bnNpZ25lZCBsb25nIGR1bW15OworCWlmIChpbl90YXNrX3N0YWNrKHN0YWNrLCB0YXNrLCBpbmZvKSkKKwkJZ290byByZWN1cnNpb25fY2hlY2s7CiAKLQkJc3RhY2sgPSAmZHVtbXk7Ci0JCWlmICh0YXNrICE9IGN1cnJlbnQpCi0JCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopdGFzay0+dGhyZWFkLnNwOworCWlmICh0YXNrICE9IGN1cnJlbnQpCisJCWdvdG8gdW5rbm93bjsKKworCWlmIChpbl9oYXJkaXJxX3N0YWNrKHN0YWNrLCBpbmZvKSkKKwkJZ290byByZWN1cnNpb25fY2hlY2s7CisKKwlpZiAoaW5fc29mdGlycV9zdGFjayhzdGFjaywgaW5mbykpCisJCWdvdG8gcmVjdXJzaW9uX2NoZWNrOworCisJZ290byB1bmtub3duOworCityZWN1cnNpb25fY2hlY2s6CisJLyoKKwkgKiBNYWtlIHN1cmUgd2UgZG9uJ3QgaXRlcmF0ZSB0aHJvdWdoIGFueSBnaXZlbiBzdGFjayBtb3JlIHRoYW4gb25jZS4KKwkgKiBJZiBpdCBjb21lcyB1cCBhIHNlY29uZCB0aW1lIHRoZW4gdGhlcmUncyBzb21ldGhpbmcgd3JvbmcgZ29pbmcgb246CisJICoganVzdCBicmVhayBvdXQgYW5kIHJlcG9ydCBhbiB1bmtub3duIHN0YWNrIHR5cGUuCisJICovCisJaWYgKHZpc2l0X21hc2spIHsKKwkJaWYgKCp2aXNpdF9tYXNrICYgKDFVTCA8PCBpbmZvLT50eXBlKSkKKwkJCWdvdG8gdW5rbm93bjsKKwkJKnZpc2l0X21hc2sgfD0gMVVMIDw8IGluZm8tPnR5cGU7CiAJfQogCi0JaWYgKCFicCkKLQkJYnAgPSBzdGFja19mcmFtZSh0YXNrLCByZWdzKTsKKwlyZXR1cm4gMDsKIAotCWZvciAoOzspIHsKLQkJdm9pZCAqZW5kX3N0YWNrOwotCi0JCWVuZF9zdGFjayA9IGlzX2hhcmRpcnFfc3RhY2soc3RhY2ssIGNwdSk7Ci0JCWlmICghZW5kX3N0YWNrKQotCQkJZW5kX3N0YWNrID0gaXNfc29mdGlycV9zdGFjayhzdGFjaywgY3B1KTsKLQotCQlicCA9IG9wcy0+d2Fsa19zdGFjayh0YXNrLCBzdGFjaywgYnAsIG9wcywgZGF0YSwKLQkJCQkgICAgIGVuZF9zdGFjaywgJmdyYXBoKTsKLQotCQkvKiBTdG9wIGlmIG5vdCBvbiBpcnEgc3RhY2sgKi8KLQkJaWYgKCFlbmRfc3RhY2spCi0JCQlicmVhazsKLQotCQkvKiBUaGUgcHJldmlvdXMgZXNwIGlzIHNhdmVkIG9uIHRoZSBib3R0b20gb2YgdGhlIHN0YWNrICovCi0JCXByZXZfZXNwID0gKHUzMiAqKShlbmRfc3RhY2sgLSBUSFJFQURfU0laRSk7Ci0JCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKikqcHJldl9lc3A7Ci0JCWlmICghc3RhY2spCi0JCQlicmVhazsKLQotCQlpZiAob3BzLT5zdGFjayhkYXRhLCAiSVJRIikgPCAwKQotCQkJYnJlYWs7Ci0JCXRvdWNoX25taV93YXRjaGRvZygpOwotCX0KLQlwdXRfY3B1KCk7Cit1bmtub3duOgorCWluZm8tPnR5cGUgPSBTVEFDS19UWVBFX1VOS05PV047CisJcmV0dXJuIC1FSU5WQUw7CiB9Ci1FWFBPUlRfU1lNQk9MKGR1bXBfdHJhY2UpOwogCi12b2lkCi1zaG93X3N0YWNrX2xvZ19sdmwoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJICAgdW5zaWduZWQgbG9uZyAqc3AsIHVuc2lnbmVkIGxvbmcgYnAsIGNoYXIgKmxvZ19sdmwpCit2b2lkIHNob3dfc3RhY2tfbG9nX2x2bChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJdW5zaWduZWQgbG9uZyAqc3AsIGNoYXIgKmxvZ19sdmwpCiB7CiAJdW5zaWduZWQgbG9uZyAqc3RhY2s7CiAJaW50IGk7CiAKLQlpZiAoc3AgPT0gTlVMTCkgewotCQlpZiAocmVncykKLQkJCXNwID0gKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5zcDsKLQkJZWxzZSBpZiAodGFzaykKLQkJCXNwID0gKHVuc2lnbmVkIGxvbmcgKil0YXNrLT50aHJlYWQuc3A7Ci0JCWVsc2UKLQkJCXNwID0gKHVuc2lnbmVkIGxvbmcgKikmc3A7Ci0JfQorCWlmICghdHJ5X2dldF90YXNrX3N0YWNrKHRhc2spKQorCQlyZXR1cm47CisKKwlzcCA9IHNwID8gOiBnZXRfc3RhY2tfcG9pbnRlcih0YXNrLCByZWdzKTsKIAogCXN0YWNrID0gc3A7CiAJZm9yIChpID0gMDsgaSA8IGtzdGFja19kZXB0aF90b19wcmludDsgaSsrKSB7CkBAIC0xMTcsNyArMTQ1LDkgQEAKIAkJdG91Y2hfbm1pX3dhdGNoZG9nKCk7CiAJfQogCXByX2NvbnQoIlxuIik7Ci0Jc2hvd190cmFjZV9sb2dfbHZsKHRhc2ssIHJlZ3MsIHNwLCBicCwgbG9nX2x2bCk7CisJc2hvd190cmFjZV9sb2dfbHZsKHRhc2ssIHJlZ3MsIHNwLCBsb2dfbHZsKTsKKworCXB1dF90YXNrX3N0YWNrKHRhc2spOwogfQogCiAKQEAgLTEzOSw3ICsxNjksNyBAQAogCQl1OCAqaXA7CiAKIAkJcHJfZW1lcmcoIlN0YWNrOlxuIik7Ci0JCXNob3dfc3RhY2tfbG9nX2x2bChOVUxMLCByZWdzLCAmcmVncy0+c3AsIDAsIEtFUk5fRU1FUkcpOworCQlzaG93X3N0YWNrX2xvZ19sdmwoY3VycmVudCwgcmVncywgTlVMTCwgS0VSTl9FTUVSRyk7CiAKIAkJcHJfZW1lcmcoIkNvZGU6Iik7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfNjQuYwppbmRleCA5ZWU0NTIwLi4zNmNmMWE0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja182NC5jCkBAIC0xNiwyNjEgKzE2LDE0NSBAQAogCiAjaW5jbHVkZSA8YXNtL3N0YWNrdHJhY2UuaD4KIAotCi0jZGVmaW5lIE5fRVhDRVBUSU9OX1NUQUNLU19FTkQgXAotCQkoTl9FWENFUFRJT05fU1RBQ0tTICsgREVCVUdfU1RLU1ovRVhDRVBUSU9OX1NUS1NaIC0gMikKLQotc3RhdGljIGNoYXIgeDg2X3N0YWNrX2lkc1tdWzhdID0gewotCQlbIERFQlVHX1NUQUNLLTEJCQldCT0gIiNEQiIsCi0JCVsgTk1JX1NUQUNLLTEJCQldCT0gIk5NSSIsCi0JCVsgRE9VQkxFRkFVTFRfU1RBQ0stMQkJXQk9ICIjREYiLAotCQlbIE1DRV9TVEFDSy0xCQkJXQk9ICIjTUMiLAotI2lmIERFQlVHX1NUS1NaID4gRVhDRVBUSU9OX1NUS1NaCi0JCVsgTl9FWENFUFRJT05fU1RBQ0tTIC4uLgotCQkgIE5fRVhDRVBUSU9OX1NUQUNLU19FTkQJXQk9ICIjREJbP10iCi0jZW5kaWYKK3N0YXRpYyBjaGFyICpleGNlcHRpb25fc3RhY2tfbmFtZXNbTl9FWENFUFRJT05fU1RBQ0tTXSA9IHsKKwkJWyBET1VCTEVGQVVMVF9TVEFDSy0xCV0JPSAiI0RGIiwKKwkJWyBOTUlfU1RBQ0stMQkJXQk9ICJOTUkiLAorCQlbIERFQlVHX1NUQUNLLTEJCV0JPSAiI0RCIiwKKwkJWyBNQ0VfU1RBQ0stMQkJXQk9ICIjTUMiLAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgKmluX2V4Y2VwdGlvbl9zdGFjayh1bnNpZ25lZCBjcHUsIHVuc2lnbmVkIGxvbmcgc3RhY2ssCi0JCQkJCSB1bnNpZ25lZCAqdXNlZHAsIGNoYXIgKippZHApCitzdGF0aWMgdW5zaWduZWQgbG9uZyBleGNlcHRpb25fc3RhY2tfc2l6ZXNbTl9FWENFUFRJT05fU1RBQ0tTXSA9IHsKKwlbMCAuLi4gTl9FWENFUFRJT05fU1RBQ0tTIC0gMV0JCT0gRVhDRVBUSU9OX1NUS1NaLAorCVtERUJVR19TVEFDSyAtIDFdCQkJPSBERUJVR19TVEtTWgorfTsKKwordm9pZCBzdGFja190eXBlX3N0cihlbnVtIHN0YWNrX3R5cGUgdHlwZSwgY29uc3QgY2hhciAqKmJlZ2luLCBjb25zdCBjaGFyICoqZW5kKQogeworCUJVSUxEX0JVR19PTihOX0VYQ0VQVElPTl9TVEFDS1MgIT0gNCk7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNUQUNLX1RZUEVfSVJROgorCQkqYmVnaW4gPSAiSVJRIjsKKwkJKmVuZCAgID0gIkVPSSI7CisJCWJyZWFrOworCWNhc2UgU1RBQ0tfVFlQRV9FWENFUFRJT04gLi4uIFNUQUNLX1RZUEVfRVhDRVBUSU9OX0xBU1Q6CisJCSpiZWdpbiA9IGV4Y2VwdGlvbl9zdGFja19uYW1lc1t0eXBlIC0gU1RBQ0tfVFlQRV9FWENFUFRJT05dOworCQkqZW5kICAgPSAiRU9FIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJKmJlZ2luID0gTlVMTDsKKwkJKmVuZCAgID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBib29sIGluX2V4Y2VwdGlvbl9zdGFjayh1bnNpZ25lZCBsb25nICpzdGFjaywgc3RydWN0IHN0YWNrX2luZm8gKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyAqYmVnaW4sICplbmQ7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3M7CiAJdW5zaWduZWQgazsKIAotCS8qCi0JICogSXRlcmF0ZSBvdmVyIGFsbCBleGNlcHRpb24gc3RhY2tzLCBhbmQgZmlndXJlIG91dCB3aGV0aGVyCi0JICogJ3N0YWNrJyBpcyBpbiBvbmUgb2YgdGhlbToKLQkgKi8KKwlCVUlMRF9CVUdfT04oTl9FWENFUFRJT05fU1RBQ0tTICE9IDQpOworCiAJZm9yIChrID0gMDsgayA8IE5fRVhDRVBUSU9OX1NUQUNLUzsgaysrKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZW5kID0gcGVyX2NwdShvcmlnX2lzdCwgY3B1KS5pc3Rba107Ci0JCS8qCi0JCSAqIElzICdzdGFjaycgYWJvdmUgdGhpcyBleGNlcHRpb24gZnJhbWUncyBlbmQ/Ci0JCSAqIElmIHllcyB0aGVuIHNraXAgdG8gdGhlIG5leHQgZnJhbWUuCi0JCSAqLwotCQlpZiAoc3RhY2sgPj0gZW5kKQorCQllbmQgICA9ICh1bnNpZ25lZCBsb25nICopcmF3X2NwdV9wdHIoJm9yaWdfaXN0KS0+aXN0W2tdOworCQliZWdpbiA9IGVuZCAtIChleGNlcHRpb25fc3RhY2tfc2l6ZXNba10gLyBzaXplb2YobG9uZykpOworCQlyZWdzICA9IChzdHJ1Y3QgcHRfcmVncyAqKWVuZCAtIDE7CisKKwkJaWYgKHN0YWNrIDwgYmVnaW4gfHwgc3RhY2sgPj0gZW5kKQogCQkJY29udGludWU7Ci0JCS8qCi0JCSAqIElzICdzdGFjaycgYWJvdmUgdGhpcyBleGNlcHRpb24gZnJhbWUncyBzdGFydCBhZGRyZXNzPwotCQkgKiBJZiB5ZXMgdGhlbiB3ZSBmb3VuZCB0aGUgcmlnaHQgZnJhbWUuCi0JCSAqLwotCQlpZiAoc3RhY2sgPj0gZW5kIC0gRVhDRVBUSU9OX1NUS1NaKSB7Ci0JCQkvKgotCQkJICogTWFrZSBzdXJlIHdlIG9ubHkgaXRlcmF0ZSB0aHJvdWdoIGFuIGV4Y2VwdGlvbgotCQkJICogc3RhY2sgb25jZS4gSWYgaXQgY29tZXMgdXAgZm9yIHRoZSBzZWNvbmQgdGltZQotCQkJICogdGhlbiB0aGVyZSdzIHNvbWV0aGluZyB3cm9uZyBnb2luZyBvbiAtIGp1c3QKLQkJCSAqIGJyZWFrIG91dCBhbmQgcmV0dXJuIE5VTEw6Ci0JCQkgKi8KLQkJCWlmICgqdXNlZHAgJiAoMVUgPDwgaykpCi0JCQkJYnJlYWs7Ci0JCQkqdXNlZHAgfD0gMVUgPDwgazsKLQkJCSppZHAgPSB4ODZfc3RhY2tfaWRzW2tdOwotCQkJcmV0dXJuICh1bnNpZ25lZCBsb25nICopZW5kOwotCQl9Ci0JCS8qCi0JCSAqIElmIHRoaXMgaXMgYSBkZWJ1ZyBzdGFjaywgYW5kIGlmIGl0IGhhcyBhIGxhcmdlciBzaXplIHRoYW4KLQkJICogdGhlIHVzdWFsIGV4Y2VwdGlvbiBzdGFja3MsIHRoZW4gJ3N0YWNrJyBtaWdodCBzdGlsbAotCQkgKiBiZSB3aXRoaW4gdGhlIGxvd2VyIHBvcnRpb24gb2YgdGhlIGRlYnVnIHN0YWNrOgotCQkgKi8KLSNpZiBERUJVR19TVEtTWiA+IEVYQ0VQVElPTl9TVEtTWgotCQlpZiAoayA9PSBERUJVR19TVEFDSyAtIDEgJiYgc3RhY2sgPj0gZW5kIC0gREVCVUdfU1RLU1opIHsKLQkJCXVuc2lnbmVkIGogPSBOX0VYQ0VQVElPTl9TVEFDS1MgLSAxOwogCi0JCQkvKgotCQkJICogQmxhY2sgbWFnaWMuIEEgbGFyZ2UgZGVidWcgc3RhY2sgaXMgY29tcG9zZWQgb2YKLQkJCSAqIG11bHRpcGxlIGV4Y2VwdGlvbiBzdGFjayBlbnRyaWVzLCB3aGljaCB3ZQotCQkJICogaXRlcmF0ZSB0aHJvdWdoIG5vdy4gRG9udCBsb29rOgotCQkJICovCi0JCQlkbyB7Ci0JCQkJKytqOwotCQkJCWVuZCAtPSBFWENFUFRJT05fU1RLU1o7Ci0JCQkJeDg2X3N0YWNrX2lkc1tqXVs0XSA9ICcxJyArCi0JCQkJCQkoaiAtIE5fRVhDRVBUSU9OX1NUQUNLUyk7Ci0JCQl9IHdoaWxlIChzdGFjayA8IGVuZCAtIEVYQ0VQVElPTl9TVEtTWik7Ci0JCQlpZiAoKnVzZWRwICYgKDFVIDw8IGopKQotCQkJCWJyZWFrOwotCQkJKnVzZWRwIHw9IDFVIDw8IGo7Ci0JCQkqaWRwID0geDg2X3N0YWNrX2lkc1tqXTsKLQkJCXJldHVybiAodW5zaWduZWQgbG9uZyAqKWVuZDsKLQkJfQotI2VuZGlmCi0JfQotCXJldHVybiBOVUxMOwotfQorCQlpbmZvLT50eXBlCT0gU1RBQ0tfVFlQRV9FWENFUFRJT04gKyBrOworCQlpbmZvLT5iZWdpbgk9IGJlZ2luOworCQlpbmZvLT5lbmQJPSBlbmQ7CisJCWluZm8tPm5leHRfc3AJPSAodW5zaWduZWQgbG9uZyAqKXJlZ3MtPnNwOwogCi1zdGF0aWMgaW5saW5lIGludAotaW5faXJxX3N0YWNrKHVuc2lnbmVkIGxvbmcgKnN0YWNrLCB1bnNpZ25lZCBsb25nICppcnFfc3RhY2ssCi0JICAgICB1bnNpZ25lZCBsb25nICppcnFfc3RhY2tfZW5kKQotewotCXJldHVybiAoc3RhY2sgPj0gaXJxX3N0YWNrICYmIHN0YWNrIDwgaXJxX3N0YWNrX2VuZCk7Ci19Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGlycV9zdGFja19zaXplID0KLQkoSVJRX1NUQUNLX1NJWkUgLSA2NCkgLyBzaXplb2YodW5zaWduZWQgbG9uZyk7Ci0KLWVudW0gc3RhY2tfdHlwZSB7Ci0JU1RBQ0tfSVNfVU5LTk9XTiwKLQlTVEFDS19JU19OT1JNQUwsCi0JU1RBQ0tfSVNfRVhDRVBUSU9OLAotCVNUQUNLX0lTX0lSUSwKLX07Ci0KLXN0YXRpYyBlbnVtIHN0YWNrX3R5cGUKLWFuYWx5emVfc3RhY2soaW50IGNwdSwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nICpzdGFjaywKLQkgICAgICB1bnNpZ25lZCBsb25nICoqc3RhY2tfZW5kLCB1bnNpZ25lZCBsb25nICppcnFfc3RhY2ssCi0JICAgICAgdW5zaWduZWQgKnVzZWQsIGNoYXIgKippZCkKLXsKLQl1bnNpZ25lZCBsb25nIGFkZHI7Ci0KLQlhZGRyID0gKCh1bnNpZ25lZCBsb25nKXN0YWNrICYgKH4oVEhSRUFEX1NJWkUgLSAxKSkpOwotCWlmICgodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UodGFzaykgPT0gYWRkcikKLQkJcmV0dXJuIFNUQUNLX0lTX05PUk1BTDsKLQotCSpzdGFja19lbmQgPSBpbl9leGNlcHRpb25fc3RhY2soY3B1LCAodW5zaWduZWQgbG9uZylzdGFjaywKLQkJCQkJdXNlZCwgaWQpOwotCWlmICgqc3RhY2tfZW5kKQotCQlyZXR1cm4gU1RBQ0tfSVNfRVhDRVBUSU9OOwotCi0JaWYgKCFpcnFfc3RhY2spCi0JCXJldHVybiBTVEFDS19JU19OT1JNQUw7Ci0KLQkqc3RhY2tfZW5kID0gaXJxX3N0YWNrOwotCWlycV9zdGFjayA9IGlycV9zdGFjayAtIGlycV9zdGFja19zaXplOwotCi0JaWYgKGluX2lycV9zdGFjayhzdGFjaywgaXJxX3N0YWNrLCAqc3RhY2tfZW5kKSkKLQkJcmV0dXJuIFNUQUNLX0lTX0lSUTsKLQotCXJldHVybiBTVEFDS19JU19VTktOT1dOOwotfQotCi0vKgotICogeDg2LTY0IGNhbiBoYXZlIHVwIHRvIHRocmVlIGtlcm5lbCBzdGFja3M6Ci0gKiBwcm9jZXNzIHN0YWNrCi0gKiBpbnRlcnJ1cHQgc3RhY2sKLSAqIHNldmVyZSBleGNlcHRpb24gKGRvdWJsZSBmYXVsdCwgbm1pLCBzdGFjayBmYXVsdCwgZGVidWcsIG1jZSkgaGFyZHdhcmUgc3RhY2sKLSAqLwotCi12b2lkIGR1bXBfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJdW5zaWduZWQgbG9uZyAqc3RhY2ssIHVuc2lnbmVkIGxvbmcgYnAsCi0JCWNvbnN0IHN0cnVjdCBzdGFja3RyYWNlX29wcyAqb3BzLCB2b2lkICpkYXRhKQotewotCWNvbnN0IHVuc2lnbmVkIGNwdSA9IGdldF9jcHUoKTsKLQl1bnNpZ25lZCBsb25nICppcnFfc3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKXBlcl9jcHUoaXJxX3N0YWNrX3B0ciwgY3B1KTsKLQl1bnNpZ25lZCBsb25nIGR1bW15OwotCXVuc2lnbmVkIHVzZWQgPSAwOwotCWludCBncmFwaCA9IDA7Ci0JaW50IGRvbmUgPSAwOwotCi0JaWYgKCF0YXNrKQotCQl0YXNrID0gY3VycmVudDsKLQotCWlmICghc3RhY2spIHsKLQkJaWYgKHJlZ3MpCi0JCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopcmVncy0+c3A7Ci0JCWVsc2UgaWYgKHRhc2sgIT0gY3VycmVudCkKLQkJCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKil0YXNrLT50aHJlYWQuc3A7Ci0JCWVsc2UKLQkJCXN0YWNrID0gJmR1bW15OworCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlpZiAoIWJwKQotCQlicCA9IHN0YWNrX2ZyYW1lKHRhc2ssIHJlZ3MpOwotCS8qCi0JICogUHJpbnQgZnVuY3Rpb24gY2FsbCBlbnRyaWVzIGluIGFsbCBzdGFja3MsIHN0YXJ0aW5nIGF0IHRoZQotCSAqIGN1cnJlbnQgc3RhY2sgYWRkcmVzcy4gSWYgdGhlIHN0YWNrcyBjb25zaXN0IG9mIG5lc3RlZAotCSAqIGV4Y2VwdGlvbnMKLQkgKi8KLQl3aGlsZSAoIWRvbmUpIHsKLQkJdW5zaWduZWQgbG9uZyAqc3RhY2tfZW5kOwotCQllbnVtIHN0YWNrX3R5cGUgc3R5cGU7Ci0JCWNoYXIgKmlkOworCXJldHVybiBmYWxzZTsKK30KIAotCQlzdHlwZSA9IGFuYWx5emVfc3RhY2soY3B1LCB0YXNrLCBzdGFjaywgJnN0YWNrX2VuZCwKLQkJCQkgICAgICBpcnFfc3RhY2ssICZ1c2VkLCAmaWQpOwotCi0JCS8qIERlZmF1bHQgZmluaXNoIHVubGVzcyBzcGVjaWZpZWQgdG8gY29udGludWUgKi8KLQkJZG9uZSA9IDE7Ci0KLQkJc3dpdGNoIChzdHlwZSkgewotCi0JCS8qIEJyZWFrIG91dCBlYXJseSBpZiB3ZSBhcmUgb24gdGhlIHRocmVhZCBzdGFjayAqLwotCQljYXNlIFNUQUNLX0lTX05PUk1BTDoKLQkJCWJyZWFrOwotCi0JCWNhc2UgU1RBQ0tfSVNfRVhDRVBUSU9OOgotCi0JCQlpZiAob3BzLT5zdGFjayhkYXRhLCBpZCkgPCAwKQotCQkJCWJyZWFrOwotCi0JCQlicCA9IG9wcy0+d2Fsa19zdGFjayh0YXNrLCBzdGFjaywgYnAsIG9wcywKLQkJCQkJICAgICBkYXRhLCBzdGFja19lbmQsICZncmFwaCk7Ci0JCQlvcHMtPnN0YWNrKGRhdGEsICI8RU9FPiIpOwotCQkJLyoKLQkJCSAqIFdlIGxpbmsgdG8gdGhlIG5leHQgc3RhY2sgdmlhIHRoZQotCQkJICogc2Vjb25kLXRvLWxhc3QgcG9pbnRlciAoaW5kZXggLTIgdG8gZW5kKSBpbiB0aGUKLQkJCSAqIGV4Y2VwdGlvbiBzdGFjazoKLQkJCSAqLwotCQkJc3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKSBzdGFja19lbmRbLTJdOwotCQkJZG9uZSA9IDA7Ci0JCQlicmVhazsKLQotCQljYXNlIFNUQUNLX0lTX0lSUToKLQotCQkJaWYgKG9wcy0+c3RhY2soZGF0YSwgIklSUSIpIDwgMCkKLQkJCQlicmVhazsKLQkJCWJwID0gb3BzLT53YWxrX3N0YWNrKHRhc2ssIHN0YWNrLCBicCwKLQkJCQkgICAgIG9wcywgZGF0YSwgc3RhY2tfZW5kLCAmZ3JhcGgpOwotCQkJLyoKLQkJCSAqIFdlIGxpbmsgdG8gdGhlIG5leHQgc3RhY2sgKHdoaWNoIHdvdWxkIGJlCi0JCQkgKiB0aGUgcHJvY2VzcyBzdGFjayBub3JtYWxseSkgdGhlIGxhc3QKLQkJCSAqIHBvaW50ZXIgKGluZGV4IC0xIHRvIGVuZCkgaW4gdGhlIElSUSBzdGFjazoKLQkJCSAqLwotCQkJc3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKSAoc3RhY2tfZW5kWy0xXSk7Ci0JCQlpcnFfc3RhY2sgPSBOVUxMOwotCQkJb3BzLT5zdGFjayhkYXRhLCAiRU9JIik7Ci0JCQlkb25lID0gMDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU1RBQ0tfSVNfVU5LTk9XTjoKLQkJCW9wcy0+c3RhY2soZGF0YSwgIlVOSyIpOwotCQkJYnJlYWs7Ci0JCX0KLQl9CitzdGF0aWMgYm9vbCBpbl9pcnFfc3RhY2sodW5zaWduZWQgbG9uZyAqc3RhY2ssIHN0cnVjdCBzdGFja19pbmZvICppbmZvKQoreworCXVuc2lnbmVkIGxvbmcgKmVuZCAgID0gKHVuc2lnbmVkIGxvbmcgKil0aGlzX2NwdV9yZWFkKGlycV9zdGFja19wdHIpOworCXVuc2lnbmVkIGxvbmcgKmJlZ2luID0gZW5kIC0gKElSUV9TVEFDS19TSVpFIC8gc2l6ZW9mKGxvbmcpKTsKIAogCS8qCi0JICogVGhpcyBoYW5kbGVzIHRoZSBwcm9jZXNzIHN0YWNrOgorCSAqIFRoaXMgaXMgYSBzb2Z0d2FyZSBzdGFjaywgc28gJ2VuZCcgY2FuIGJlIGEgdmFsaWQgc3RhY2sgcG9pbnRlci4KKwkgKiBJdCBqdXN0IG1lYW5zIHRoZSBzdGFjayBpcyBlbXB0eS4KIAkgKi8KLQlicCA9IG9wcy0+d2Fsa19zdGFjayh0YXNrLCBzdGFjaywgYnAsIG9wcywgZGF0YSwgTlVMTCwgJmdyYXBoKTsKLQlwdXRfY3B1KCk7Ci19Ci1FWFBPUlRfU1lNQk9MKGR1bXBfdHJhY2UpOworCWlmIChzdGFjayA8IGJlZ2luIHx8IHN0YWNrID4gZW5kKQorCQlyZXR1cm4gZmFsc2U7CiAKLXZvaWQKLXNob3dfc3RhY2tfbG9nX2x2bChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQkgICB1bnNpZ25lZCBsb25nICpzcCwgdW5zaWduZWQgbG9uZyBicCwgY2hhciAqbG9nX2x2bCkKKwlpbmZvLT50eXBlCT0gU1RBQ0tfVFlQRV9JUlE7CisJaW5mby0+YmVnaW4JPSBiZWdpbjsKKwlpbmZvLT5lbmQJPSBlbmQ7CisKKwkvKgorCSAqIFRoZSBuZXh0IHN0YWNrIHBvaW50ZXIgaXMgdGhlIGZpcnN0IHRoaW5nIHB1c2hlZCBieSB0aGUgZW50cnkgY29kZQorCSAqIGFmdGVyIHN3aXRjaGluZyB0byB0aGUgaXJxIHN0YWNrLgorCSAqLworCWluZm8tPm5leHRfc3AgPSAodW5zaWduZWQgbG9uZyAqKSooZW5kIC0gMSk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworaW50IGdldF9zdGFja19pbmZvKHVuc2lnbmVkIGxvbmcgKnN0YWNrLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCSAgIHN0cnVjdCBzdGFja19pbmZvICppbmZvLCB1bnNpZ25lZCBsb25nICp2aXNpdF9tYXNrKQoreworCWlmICghc3RhY2spCisJCWdvdG8gdW5rbm93bjsKKworCXRhc2sgPSB0YXNrID8gOiBjdXJyZW50OworCisJaWYgKGluX3Rhc2tfc3RhY2soc3RhY2ssIHRhc2ssIGluZm8pKQorCQlnb3RvIHJlY3Vyc2lvbl9jaGVjazsKKworCWlmICh0YXNrICE9IGN1cnJlbnQpCisJCWdvdG8gdW5rbm93bjsKKworCWlmIChpbl9leGNlcHRpb25fc3RhY2soc3RhY2ssIGluZm8pKQorCQlnb3RvIHJlY3Vyc2lvbl9jaGVjazsKKworCWlmIChpbl9pcnFfc3RhY2soc3RhY2ssIGluZm8pKQorCQlnb3RvIHJlY3Vyc2lvbl9jaGVjazsKKworCWdvdG8gdW5rbm93bjsKKworcmVjdXJzaW9uX2NoZWNrOgorCS8qCisJICogTWFrZSBzdXJlIHdlIGRvbid0IGl0ZXJhdGUgdGhyb3VnaCBhbnkgZ2l2ZW4gc3RhY2sgbW9yZSB0aGFuIG9uY2UuCisJICogSWYgaXQgY29tZXMgdXAgYSBzZWNvbmQgdGltZSB0aGVuIHRoZXJlJ3Mgc29tZXRoaW5nIHdyb25nIGdvaW5nIG9uOgorCSAqIGp1c3QgYnJlYWsgb3V0IGFuZCByZXBvcnQgYW4gdW5rbm93biBzdGFjayB0eXBlLgorCSAqLworCWlmICh2aXNpdF9tYXNrKSB7CisJCWlmICgqdmlzaXRfbWFzayAmICgxVUwgPDwgaW5mby0+dHlwZSkpCisJCQlnb3RvIHVua25vd247CisJCSp2aXNpdF9tYXNrIHw9IDFVTCA8PCBpbmZvLT50eXBlOworCX0KKworCXJldHVybiAwOworCit1bmtub3duOgorCWluZm8tPnR5cGUgPSBTVEFDS19UWVBFX1VOS05PV047CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3ZvaWQgc2hvd19zdGFja19sb2dfbHZsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQl1bnNpZ25lZCBsb25nICpzcCwgY2hhciAqbG9nX2x2bCkKIHsKIAl1bnNpZ25lZCBsb25nICppcnFfc3RhY2tfZW5kOwogCXVuc2lnbmVkIGxvbmcgKmlycV9zdGFjazsKIAl1bnNpZ25lZCBsb25nICpzdGFjazsKLQlpbnQgY3B1OwogCWludCBpOwogCi0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0JY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCWlmICghdHJ5X2dldF90YXNrX3N0YWNrKHRhc2spKQorCQlyZXR1cm47CiAKLQlpcnFfc3RhY2tfZW5kCT0gKHVuc2lnbmVkIGxvbmcgKikocGVyX2NwdShpcnFfc3RhY2tfcHRyLCBjcHUpKTsKLQlpcnFfc3RhY2sJPSAodW5zaWduZWQgbG9uZyAqKShwZXJfY3B1KGlycV9zdGFja19wdHIsIGNwdSkgLSBJUlFfU1RBQ0tfU0laRSk7CisJaXJxX3N0YWNrX2VuZCA9ICh1bnNpZ25lZCBsb25nICopdGhpc19jcHVfcmVhZChpcnFfc3RhY2tfcHRyKTsKKwlpcnFfc3RhY2sgICAgID0gaXJxX3N0YWNrX2VuZCAtIChJUlFfU1RBQ0tfU0laRSAvIHNpemVvZihsb25nKSk7CiAKLQkvKgotCSAqIERlYnVnZ2luZyBhaWQ6ICJzaG93X3N0YWNrKE5VTEwsIE5VTEwpOyIgcHJpbnRzIHRoZQotCSAqIGJhY2sgdHJhY2UgZm9yIHRoaXMgY3B1OgotCSAqLwotCWlmIChzcCA9PSBOVUxMKSB7Ci0JCWlmIChyZWdzKQotCQkJc3AgPSAodW5zaWduZWQgbG9uZyAqKXJlZ3MtPnNwOwotCQllbHNlIGlmICh0YXNrKQotCQkJc3AgPSAodW5zaWduZWQgbG9uZyAqKXRhc2stPnRocmVhZC5zcDsKLQkJZWxzZQotCQkJc3AgPSAodW5zaWduZWQgbG9uZyAqKSZzcDsKLQl9CisJc3AgPSBzcCA/IDogZ2V0X3N0YWNrX3BvaW50ZXIodGFzaywgcmVncyk7CiAKIAlzdGFjayA9IHNwOwogCWZvciAoaSA9IDA7IGkgPCBrc3RhY2tfZGVwdGhfdG9fcHJpbnQ7IGkrKykgewpAQCAtMjk5LDE4ICsxODMsMTcgQEAKIAkJc3RhY2srKzsKIAkJdG91Y2hfbm1pX3dhdGNoZG9nKCk7CiAJfQotCXByZWVtcHRfZW5hYmxlKCk7CiAKIAlwcl9jb250KCJcbiIpOwotCXNob3dfdHJhY2VfbG9nX2x2bCh0YXNrLCByZWdzLCBzcCwgYnAsIGxvZ19sdmwpOworCXNob3dfdHJhY2VfbG9nX2x2bCh0YXNrLCByZWdzLCBzcCwgbG9nX2x2bCk7CisKKwlwdXRfdGFza19zdGFjayh0YXNrKTsKIH0KIAogdm9pZCBzaG93X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaW50IGk7Ci0JdW5zaWduZWQgbG9uZyBzcDsKIAotCXNwID0gcmVncy0+c3A7CiAJc2hvd19yZWdzX3ByaW50X2luZm8oS0VSTl9ERUZBVUxUKTsKIAlfX3Nob3dfcmVncyhyZWdzLCAxKTsKIApAQCAtMzI1LDggKzIwOCw3IEBACiAJCXU4ICppcDsKIAogCQlwcmludGsoS0VSTl9ERUZBVUxUICJTdGFjazpcbiIpOwotCQlzaG93X3N0YWNrX2xvZ19sdmwoTlVMTCwgcmVncywgKHVuc2lnbmVkIGxvbmcgKilzcCwKLQkJCQkgICAwLCBLRVJOX0RFRkFVTFQpOworCQlzaG93X3N0YWNrX2xvZ19sdmwoY3VycmVudCwgcmVncywgTlVMTCwgS0VSTl9ERUZBVUxUKTsKIAogCQlwcmludGsoS0VSTl9ERUZBVUxUICJDb2RlOiAiKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2U4MjAuYyBiL2FyY2gveDg2L2tlcm5lbC9lODIwLmMKaW5kZXggNjIxYjUwMS4uYjg1ZmU1ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2U4MjAuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZTgyMC5jCkBAIC00MCw4ICs0MCwxMCBAQAogICogdXNlciBjYW4gZS5nLiBib290IHRoZSBvcmlnaW5hbCBrZXJuZWwgd2l0aCBtZW09MUcgd2hpbGUgc3RpbGwgYm9vdGluZyB0aGUKICAqIG5leHQga2VybmVsIHdpdGggZnVsbCBtZW1vcnkuCiAgKi8KLXN0cnVjdCBlODIwbWFwIGU4MjA7Ci1zdHJ1Y3QgZTgyMG1hcCBlODIwX3NhdmVkOworc3RhdGljIHN0cnVjdCBlODIwbWFwIGluaXRpYWxfZTgyMCAgX19pbml0ZGF0YTsKK3N0YXRpYyBzdHJ1Y3QgZTgyMG1hcCBpbml0aWFsX2U4MjBfc2F2ZWQgIF9faW5pdGRhdGE7CitzdHJ1Y3QgZTgyMG1hcCAqZTgyMCBfX3JlZmRhdGEgPSAmaW5pdGlhbF9lODIwOworc3RydWN0IGU4MjBtYXAgKmU4MjBfc2F2ZWQgX19yZWZkYXRhID0gJmluaXRpYWxfZTgyMF9zYXZlZDsKIAogLyogRm9yIFBDSSBvciBvdGhlciBtZW1vcnktbWFwcGVkIHJlc291cmNlcyAqLwogdW5zaWduZWQgbG9uZyBwY2lfbWVtX3N0YXJ0ID0gMHhhZWVkYmFiZTsKQEAgLTU4LDggKzYwLDggQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7Ci0JCXN0cnVjdCBlODIwZW50cnkgKmVpID0gJmU4MjAubWFwW2ldOworCWZvciAoaSA9IDA7IGkgPCBlODIwLT5ucl9tYXA7IGkrKykgeworCQlzdHJ1Y3QgZTgyMGVudHJ5ICplaSA9ICZlODIwLT5tYXBbaV07CiAKIAkJaWYgKHR5cGUgJiYgZWktPnR5cGUgIT0gdHlwZSkKIAkJCWNvbnRpbnVlOwpAQCAtODEsOCArODMsOCBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IGU4MjAubnJfbWFwOyBpKyspIHsKLQkJc3RydWN0IGU4MjBlbnRyeSAqZWkgPSAmZTgyMC5tYXBbaV07CisJZm9yIChpID0gMDsgaSA8IGU4MjAtPm5yX21hcDsgaSsrKSB7CisJCXN0cnVjdCBlODIwZW50cnkgKmVpID0gJmU4MjAtPm1hcFtpXTsKIAogCQlpZiAodHlwZSAmJiBlaS0+dHlwZSAhPSB0eXBlKQogCQkJY29udGludWU7CkBAIC0xMjgsNyArMTMwLDcgQEAKIAogdm9pZCBfX2luaXQgZTgyMF9hZGRfcmVnaW9uKHU2NCBzdGFydCwgdTY0IHNpemUsIGludCB0eXBlKQogewotCV9fZTgyMF9hZGRfcmVnaW9uKCZlODIwLCBzdGFydCwgc2l6ZSwgdHlwZSk7CisJX19lODIwX2FkZF9yZWdpb24oZTgyMCwgc3RhcnQsIHNpemUsIHR5cGUpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgZTgyMF9wcmludF90eXBlKHUzMiB0eXBlKQpAQCAtMTY0LDEyICsxNjYsMTIgQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGU4MjAtPm5yX21hcDsgaSsrKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIiVzOiBbbWVtICUjMDE4THgtJSMwMThMeF0gIiwgd2hvLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgZTgyMC5tYXBbaV0uYWRkciwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGU4MjAtPm1hcFtpXS5hZGRyLAogCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykKLQkJICAgICAgIChlODIwLm1hcFtpXS5hZGRyICsgZTgyMC5tYXBbaV0uc2l6ZSAtIDEpKTsKLQkJZTgyMF9wcmludF90eXBlKGU4MjAubWFwW2ldLnR5cGUpOworCQkgICAgICAgKGU4MjAtPm1hcFtpXS5hZGRyICsgZTgyMC0+bWFwW2ldLnNpemUgLSAxKSk7CisJCWU4MjBfcHJpbnRfdHlwZShlODIwLT5tYXBbaV0udHlwZSk7CiAJCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CiAJfQogfQpAQCAtMzQ4LDcgKzM1MCw3IEBACiAJCSAqIGNvbnRpbnVlIGJ1aWxkaW5nIHVwIG5ldyBiaW9zIG1hcCBiYXNlZCBvbiB0aGlzCiAJCSAqIGluZm9ybWF0aW9uCiAJCSAqLwotCQlpZiAoY3VycmVudF90eXBlICE9IGxhc3RfdHlwZSB8fCBjdXJyZW50X3R5cGUgPT0gRTgyMF9QUkFNKSB7CisJCWlmIChjdXJyZW50X3R5cGUgIT0gbGFzdF90eXBlKSB7CiAJCQlpZiAobGFzdF90eXBlICE9IDApCSB7CiAJCQkJbmV3X2Jpb3NbbmV3X2Jpb3NfZW50cnldLnNpemUgPQogCQkJCQljaGFuZ2VfcG9pbnRbY2hnaWR4XS0+YWRkciAtIGxhc3RfYWRkcjsKQEAgLTM4OCwxMSArMzkwLDExIEBACiAJd2hpbGUgKG5yX21hcCkgewogCQl1NjQgc3RhcnQgPSBiaW9zbWFwLT5hZGRyOwogCQl1NjQgc2l6ZSA9IGJpb3NtYXAtPnNpemU7Ci0JCXU2NCBlbmQgPSBzdGFydCArIHNpemU7CisJCXU2NCBlbmQgPSBzdGFydCArIHNpemUgLSAxOwogCQl1MzIgdHlwZSA9IGJpb3NtYXAtPnR5cGU7CiAKIAkJLyogT3ZlcmZsb3cgaW4gNjQgYml0cz8gSWdub3JlIHRoZSBtZW1vcnkgbWFwLiAqLwotCQlpZiAoc3RhcnQgPiBlbmQpCisJCWlmIChzdGFydCA+IGVuZCAmJiBsaWtlbHkoc2l6ZSkpCiAJCQlyZXR1cm4gLTE7CiAKIAkJZTgyMF9hZGRfcmVnaW9uKHN0YXJ0LCBzaXplLCB0eXBlKTsKQEAgLTQ5MywxMyArNDk1LDEzIEBACiB1NjQgX19pbml0IGU4MjBfdXBkYXRlX3JhbmdlKHU2NCBzdGFydCwgdTY0IHNpemUsIHVuc2lnbmVkIG9sZF90eXBlLAogCQkJICAgICB1bnNpZ25lZCBuZXdfdHlwZSkKIHsKLQlyZXR1cm4gX19lODIwX3VwZGF0ZV9yYW5nZSgmZTgyMCwgc3RhcnQsIHNpemUsIG9sZF90eXBlLCBuZXdfdHlwZSk7CisJcmV0dXJuIF9fZTgyMF91cGRhdGVfcmFuZ2UoZTgyMCwgc3RhcnQsIHNpemUsIG9sZF90eXBlLCBuZXdfdHlwZSk7CiB9CiAKIHN0YXRpYyB1NjQgX19pbml0IGU4MjBfdXBkYXRlX3JhbmdlX3NhdmVkKHU2NCBzdGFydCwgdTY0IHNpemUsCiAJCQkJCSAgdW5zaWduZWQgb2xkX3R5cGUsIHVuc2lnbmVkIG5ld190eXBlKQogewotCXJldHVybiBfX2U4MjBfdXBkYXRlX3JhbmdlKCZlODIwX3NhdmVkLCBzdGFydCwgc2l6ZSwgb2xkX3R5cGUsCisJcmV0dXJuIF9fZTgyMF91cGRhdGVfcmFuZ2UoZTgyMF9zYXZlZCwgc3RhcnQsIHNpemUsIG9sZF90eXBlLAogCQkJCSAgICAgbmV3X3R5cGUpOwogfQogCkBAIC01MjEsOCArNTIzLDggQEAKIAkJZTgyMF9wcmludF90eXBlKG9sZF90eXBlKTsKIAlwcmludGsoS0VSTl9DT05UICJcbiIpOwogCi0JZm9yIChpID0gMDsgaSA8IGU4MjAubnJfbWFwOyBpKyspIHsKLQkJc3RydWN0IGU4MjBlbnRyeSAqZWkgPSAmZTgyMC5tYXBbaV07CisJZm9yIChpID0gMDsgaSA8IGU4MjAtPm5yX21hcDsgaSsrKSB7CisJCXN0cnVjdCBlODIwZW50cnkgKmVpID0gJmU4MjAtPm1hcFtpXTsKIAkJdTY0IGZpbmFsX3N0YXJ0LCBmaW5hbF9lbmQ7CiAJCXU2NCBlaV9lbmQ7CiAKQEAgLTU2NiwxNSArNTY4LDE1IEBACiAKIHZvaWQgX19pbml0IHVwZGF0ZV9lODIwKHZvaWQpCiB7Ci0JaWYgKHNhbml0aXplX2U4MjBfbWFwKGU4MjAubWFwLCBBUlJBWV9TSVpFKGU4MjAubWFwKSwgJmU4MjAubnJfbWFwKSkKKwlpZiAoc2FuaXRpemVfZTgyMF9tYXAoZTgyMC0+bWFwLCBBUlJBWV9TSVpFKGU4MjAtPm1hcCksICZlODIwLT5ucl9tYXApKQogCQlyZXR1cm47CiAJcHJpbnRrKEtFUk5fSU5GTyAiZTgyMDogbW9kaWZpZWQgcGh5c2ljYWwgUkFNIG1hcDpcbiIpOwogCWU4MjBfcHJpbnRfbWFwKCJtb2RpZmllZCIpOwogfQogc3RhdGljIHZvaWQgX19pbml0IHVwZGF0ZV9lODIwX3NhdmVkKHZvaWQpCiB7Ci0Jc2FuaXRpemVfZTgyMF9tYXAoZTgyMF9zYXZlZC5tYXAsIEFSUkFZX1NJWkUoZTgyMF9zYXZlZC5tYXApLAotCQkJCSZlODIwX3NhdmVkLm5yX21hcCk7CisJc2FuaXRpemVfZTgyMF9tYXAoZTgyMF9zYXZlZC0+bWFwLCBBUlJBWV9TSVpFKGU4MjBfc2F2ZWQtPm1hcCksCisJCQkJJmU4MjBfc2F2ZWQtPm5yX21hcCk7CiB9CiAjZGVmaW5lIE1BWF9HQVBfRU5EIDB4MTAwMDAwMDAwdWxsCiAvKgpAQCAtNTg0LDE0ICs1ODYsMTQgQEAKIAkJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLCB1bnNpZ25lZCBsb25nIGxvbmcgZW5kX2FkZHIpCiB7CiAJdW5zaWduZWQgbG9uZyBsb25nIGxhc3Q7Ci0JaW50IGkgPSBlODIwLm5yX21hcDsKKwlpbnQgaSA9IGU4MjAtPm5yX21hcDsKIAlpbnQgZm91bmQgPSAwOwogCiAJbGFzdCA9IChlbmRfYWRkciAmJiBlbmRfYWRkciA8IE1BWF9HQVBfRU5EKSA/IGVuZF9hZGRyIDogTUFYX0dBUF9FTkQ7CiAKIAl3aGlsZSAoLS1pID49IDApIHsKLQkJdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0ID0gZTgyMC5tYXBbaV0uYWRkcjsKLQkJdW5zaWduZWQgbG9uZyBsb25nIGVuZCA9IHN0YXJ0ICsgZTgyMC5tYXBbaV0uc2l6ZTsKKwkJdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0ID0gZTgyMC0+bWFwW2ldLmFkZHI7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBlbmQgPSBzdGFydCArIGU4MjAtPm1hcFtpXS5zaXplOwogCiAJCWlmIChlbmQgPCBzdGFydF9hZGRyKQogCQkJY29udGludWU7CkBAIC02NDksNiArNjUxLDMzIEBACiAJICAgICAgIGdhcHN0YXJ0LCBnYXBzdGFydCArIGdhcHNpemUgLSAxKTsKIH0KIAorLyoKKyAqIENhbGxlZCBsYXRlIGR1cmluZyBpbml0LCBpbiBmcmVlX2luaXRtZW0oKS4KKyAqCisgKiBJbml0aWFsIGU4MjAgYW5kIGU4MjBfc2F2ZWQgYXJlIGxhcmdpc2ggX19pbml0ZGF0YSBhcnJheXMuCisgKiBDb3B5IHRoZW0gdG8gKHVzdWFsbHkgbXVjaCBzbWFsbGVyKSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgYXJlYS4KKyAqIFRoaXMgaXMgZG9uZSBhZnRlciBhbGwgdHdlYWtzIHdlIGV2ZXIgZG8gdG8gdGhlbToKKyAqIGFsbCBmdW5jdGlvbnMgd2hpY2ggbW9kaWZ5IHRoZW0gYXJlIF9faW5pdCBmdW5jdGlvbnMsCisgKiB0aGV5IHdvbid0IGV4aXN0IGFmdGVyIHRoaXMgcG9pbnQuCisgKi8KK19faW5pdCB2b2lkIGU4MjBfcmVhbGxvY2F0ZV90YWJsZXModm9pZCkKK3sKKwlzdHJ1Y3QgZTgyMG1hcCAqbjsKKwlpbnQgc2l6ZTsKKworCXNpemUgPSBvZmZzZXRvZihzdHJ1Y3QgZTgyMG1hcCwgbWFwKSArIHNpemVvZihzdHJ1Y3QgZTgyMGVudHJ5KSAqIGU4MjAtPm5yX21hcDsKKwluID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlCVUdfT04oIW4pOworCW1lbWNweShuLCBlODIwLCBzaXplKTsKKwllODIwID0gbjsKKworCXNpemUgPSBvZmZzZXRvZihzdHJ1Y3QgZTgyMG1hcCwgbWFwKSArIHNpemVvZihzdHJ1Y3QgZTgyMGVudHJ5KSAqIGU4MjBfc2F2ZWQtPm5yX21hcDsKKwluID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlCVUdfT04oIW4pOworCW1lbWNweShuLCBlODIwX3NhdmVkLCBzaXplKTsKKwllODIwX3NhdmVkID0gbjsKK30KKwogLyoqCiAgKiBCZWNhdXNlIG9mIHRoZSBzaXplIGxpbWl0YXRpb24gb2Ygc3RydWN0IGJvb3RfcGFyYW1zLCBvbmx5IGZpcnN0CiAgKiAxMjggRTgyMCBtZW1vcnkgZW50cmllcyBhcmUgcGFzc2VkIHRvIGtlcm5lbCB2aWEKQEAgLTY2NSw3ICs2OTQsNyBAQAogCWVudHJpZXMgPSBzZGF0YS0+bGVuIC8gc2l6ZW9mKHN0cnVjdCBlODIwZW50cnkpOwogCWV4dG1hcCA9IChzdHJ1Y3QgZTgyMGVudHJ5ICopKHNkYXRhLT5kYXRhKTsKIAlfX2FwcGVuZF9lODIwX21hcChleHRtYXAsIGVudHJpZXMpOwotCXNhbml0aXplX2U4MjBfbWFwKGU4MjAubWFwLCBBUlJBWV9TSVpFKGU4MjAubWFwKSwgJmU4MjAubnJfbWFwKTsKKwlzYW5pdGl6ZV9lODIwX21hcChlODIwLT5tYXAsIEFSUkFZX1NJWkUoZTgyMC0+bWFwKSwgJmU4MjAtPm5yX21hcCk7CiAJZWFybHlfbWVtdW5tYXAoc2RhdGEsIGRhdGFfbGVuKTsKIAlwcmludGsoS0VSTl9JTkZPICJlODIwOiBleHRlbmRlZCBwaHlzaWNhbCBSQU0gbWFwOlxuIik7CiAJZTgyMF9wcmludF9tYXAoImV4dGVuZGVkIik7CkBAIC02ODYsOCArNzE1LDggQEAKIAlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIHBmbiA9IDA7CiAKLQlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgewotCQlzdHJ1Y3QgZTgyMGVudHJ5ICplaSA9ICZlODIwLm1hcFtpXTsKKwlmb3IgKGkgPSAwOyBpIDwgZTgyMC0+bnJfbWFwOyBpKyspIHsKKwkJc3RydWN0IGU4MjBlbnRyeSAqZWkgPSAmZTgyMC0+bWFwW2ldOwogCiAJCWlmIChwZm4gPCBQRk5fVVAoZWktPmFkZHIpKQogCQkJcmVnaXN0ZXJfbm9zYXZlX3JlZ2lvbihwZm4sIFBGTl9VUChlaS0+YWRkcikpOwpAQCAtNzEyLDggKzc0MSw4IEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgewotCQlzdHJ1Y3QgZTgyMGVudHJ5ICplaSA9ICZlODIwLm1hcFtpXTsKKwlmb3IgKGkgPSAwOyBpIDwgZTgyMC0+bnJfbWFwOyBpKyspIHsKKwkJc3RydWN0IGU4MjBlbnRyeSAqZWkgPSAmZTgyMC0+bWFwW2ldOwogCiAJCWlmIChlaS0+dHlwZSA9PSBFODIwX05WUykKIAkJCWFjcGlfbnZzX3JlZ2lzdGVyKGVpLT5hZGRyLCBlaS0+c2l6ZSk7CkBAIC03NTQsMjIgKzc4MywxOCBAQAogLyoKICAqIEZpbmQgdGhlIGhpZ2hlc3QgcGFnZSBmcmFtZSBudW1iZXIgd2UgaGF2ZSBhdmFpbGFibGUKICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IGU4MjBfZW5kX3Bmbih1bnNpZ25lZCBsb25nIGxpbWl0X3BmbikKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBlODIwX2VuZF9wZm4odW5zaWduZWQgbG9uZyBsaW1pdF9wZm4sIHVuc2lnbmVkIHR5cGUpCiB7CiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyBsYXN0X3BmbiA9IDA7CiAJdW5zaWduZWQgbG9uZyBtYXhfYXJjaF9wZm4gPSBNQVhfQVJDSF9QRk47CiAKLQlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgewotCQlzdHJ1Y3QgZTgyMGVudHJ5ICplaSA9ICZlODIwLm1hcFtpXTsKKwlmb3IgKGkgPSAwOyBpIDwgZTgyMC0+bnJfbWFwOyBpKyspIHsKKwkJc3RydWN0IGU4MjBlbnRyeSAqZWkgPSAmZTgyMC0+bWFwW2ldOwogCQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbjsKIAkJdW5zaWduZWQgbG9uZyBlbmRfcGZuOwogCi0JCS8qCi0JCSAqIFBlcnNpc3RlbnQgbWVtb3J5IGlzIGFjY291bnRlZCBhcyByYW0gZm9yIHB1cnBvc2VzIG9mCi0JCSAqIGVzdGFibGlzaGluZyBtYXhfcGZuIGFuZCBtZW1fbWFwLgotCQkgKi8KLQkJaWYgKGVpLT50eXBlICE9IEU4MjBfUkFNICYmIGVpLT50eXBlICE9IEU4MjBfUFJBTSkKKwkJaWYgKGVpLT50eXBlICE9IHR5cGUpCiAJCQljb250aW51ZTsKIAogCQlzdGFydF9wZm4gPSBlaS0+YWRkciA+PiBQQUdFX1NISUZUOwpAQCAtNzk0LDE1ICs4MTksMTUgQEAKIH0KIHVuc2lnbmVkIGxvbmcgX19pbml0IGU4MjBfZW5kX29mX3JhbV9wZm4odm9pZCkKIHsKLQlyZXR1cm4gZTgyMF9lbmRfcGZuKE1BWF9BUkNIX1BGTik7CisJcmV0dXJuIGU4MjBfZW5kX3BmbihNQVhfQVJDSF9QRk4sIEU4MjBfUkFNKTsKIH0KIAogdW5zaWduZWQgbG9uZyBfX2luaXQgZTgyMF9lbmRfb2ZfbG93X3JhbV9wZm4odm9pZCkKIHsKLQlyZXR1cm4gZTgyMF9lbmRfcGZuKDFVTCA8PCAoMzItUEFHRV9TSElGVCkpOworCXJldHVybiBlODIwX2VuZF9wZm4oMVVMIDw8ICgzMiAtIFBBR0VfU0hJRlQpLCBFODIwX1JBTSk7CiB9CiAKLXN0YXRpYyB2b2lkIGVhcmx5X3BhbmljKGNoYXIgKm1zZykKK3N0YXRpYyB2b2lkIF9faW5pdCBlYXJseV9wYW5pYyhjaGFyICptc2cpCiB7CiAJZWFybHlfcHJpbnRrKG1zZyk7CiAJcGFuaWMobXNnKTsKQEAgLTg1Niw3ICs4ODEsNyBAQAogCQkgKi8KIAkJc2F2ZWRfbWF4X3BmbiA9IGU4MjBfZW5kX29mX3JhbV9wZm4oKTsKICNlbmRpZgotCQllODIwLm5yX21hcCA9IDA7CisJCWU4MjAtPm5yX21hcCA9IDA7CiAJCXVzZXJkZWYgPSAxOwogCQlyZXR1cm4gMDsKIAl9CkBAIC05MDMsOCArOTI4LDggQEAKIHZvaWQgX19pbml0IGZpbmlzaF9lODIwX3BhcnNpbmcodm9pZCkKIHsKIAlpZiAodXNlcmRlZikgewotCQlpZiAoc2FuaXRpemVfZTgyMF9tYXAoZTgyMC5tYXAsIEFSUkFZX1NJWkUoZTgyMC5tYXApLAotCQkJCQkmZTgyMC5ucl9tYXApIDwgMCkKKwkJaWYgKHNhbml0aXplX2U4MjBfbWFwKGU4MjAtPm1hcCwgQVJSQVlfU0laRShlODIwLT5tYXApLAorCQkJCQkmZTgyMC0+bnJfbWFwKSA8IDApCiAJCQllYXJseV9wYW5pYygiSW52YWxpZCB1c2VyIHN1cHBsaWVkIG1lbW9yeSBtYXAiKTsKIAogCQlwcmludGsoS0VSTl9JTkZPICJlODIwOiB1c2VyLWRlZmluZWQgcGh5c2ljYWwgUkFNIG1hcDpcbiIpOwpAQCAtOTEyLDcgKzkzNyw3IEBACiAJfQogfQogCi1zdGF0aWMgY29uc3QgY2hhciAqZTgyMF90eXBlX3RvX3N0cmluZyhpbnQgZTgyMF90eXBlKQorc3RhdGljIGNvbnN0IGNoYXIgKl9faW5pdCBlODIwX3R5cGVfdG9fc3RyaW5nKGludCBlODIwX3R5cGUpCiB7CiAJc3dpdGNoIChlODIwX3R5cGUpIHsKIAljYXNlIEU4MjBfUkVTRVJWRURfS0VSTjoKQEAgLTkyNiw3ICs5NTEsNyBAQAogCX0KIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgZTgyMF90eXBlX3RvX2lvbWVtX3R5cGUoaW50IGU4MjBfdHlwZSkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBlODIwX3R5cGVfdG9faW9tZW1fdHlwZShpbnQgZTgyMF90eXBlKQogewogCXN3aXRjaCAoZTgyMF90eXBlKSB7CiAJY2FzZSBFODIwX1JFU0VSVkVEX0tFUk46CkBAIC05NDIsNyArOTY3LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGU4MjBfdHlwZV90b19pb3Jlc19kZXNjKGludCBlODIwX3R5cGUpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQgZTgyMF90eXBlX3RvX2lvcmVzX2Rlc2MoaW50IGU4MjBfdHlwZSkKIHsKIAlzd2l0Y2ggKGU4MjBfdHlwZSkgewogCWNhc2UgRTgyMF9BQ1BJOgpAQCAtOTYxLDcgKzk4Niw3IEBACiAJfQogfQogCi1zdGF0aWMgYm9vbCBkb19tYXJrX2J1c3kodTMyIHR5cGUsIHN0cnVjdCByZXNvdXJjZSAqcmVzKQorc3RhdGljIGJvb2wgX19pbml0IGRvX21hcmtfYnVzeSh1MzIgdHlwZSwgc3RydWN0IHJlc291cmNlICpyZXMpCiB7CiAJLyogdGhpcyBpcyB0aGUgbGVnYWN5IGJpb3MvZG9zIHJvbS1zaGFkb3cgKyBtbWlvIHJlZ2lvbiAqLwogCWlmIChyZXMtPnN0YXJ0IDwgKDFVTEw8PDIwKSkKQEAgLTk5MSwzNSArMTAxNiwzNSBAQAogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCXU2NCBlbmQ7CiAKLQlyZXMgPSBhbGxvY19ib290bWVtKHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpICogZTgyMC5ucl9tYXApOworCXJlcyA9IGFsbG9jX2Jvb3RtZW0oc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkgKiBlODIwLT5ucl9tYXApOwogCWU4MjBfcmVzID0gcmVzOwotCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7Ci0JCWVuZCA9IGU4MjAubWFwW2ldLmFkZHIgKyBlODIwLm1hcFtpXS5zaXplIC0gMTsKKwlmb3IgKGkgPSAwOyBpIDwgZTgyMC0+bnJfbWFwOyBpKyspIHsKKwkJZW5kID0gZTgyMC0+bWFwW2ldLmFkZHIgKyBlODIwLT5tYXBbaV0uc2l6ZSAtIDE7CiAJCWlmIChlbmQgIT0gKHJlc291cmNlX3NpemVfdCllbmQpIHsKIAkJCXJlcysrOwogCQkJY29udGludWU7CiAJCX0KLQkJcmVzLT5uYW1lID0gZTgyMF90eXBlX3RvX3N0cmluZyhlODIwLm1hcFtpXS50eXBlKTsKLQkJcmVzLT5zdGFydCA9IGU4MjAubWFwW2ldLmFkZHI7CisJCXJlcy0+bmFtZSA9IGU4MjBfdHlwZV90b19zdHJpbmcoZTgyMC0+bWFwW2ldLnR5cGUpOworCQlyZXMtPnN0YXJ0ID0gZTgyMC0+bWFwW2ldLmFkZHI7CiAJCXJlcy0+ZW5kID0gZW5kOwogCi0JCXJlcy0+ZmxhZ3MgPSBlODIwX3R5cGVfdG9faW9tZW1fdHlwZShlODIwLm1hcFtpXS50eXBlKTsKLQkJcmVzLT5kZXNjID0gZTgyMF90eXBlX3RvX2lvcmVzX2Rlc2MoZTgyMC5tYXBbaV0udHlwZSk7CisJCXJlcy0+ZmxhZ3MgPSBlODIwX3R5cGVfdG9faW9tZW1fdHlwZShlODIwLT5tYXBbaV0udHlwZSk7CisJCXJlcy0+ZGVzYyA9IGU4MjBfdHlwZV90b19pb3Jlc19kZXNjKGU4MjAtPm1hcFtpXS50eXBlKTsKIAogCQkvKgogCQkgKiBkb24ndCByZWdpc3RlciB0aGUgcmVnaW9uIHRoYXQgY291bGQgYmUgY29uZmxpY3RlZCB3aXRoCiAJCSAqIHBjaSBkZXZpY2UgQkFSIHJlc291cmNlIGFuZCBpbnNlcnQgdGhlbSBsYXRlciBpbgogCQkgKiBwY2liaW9zX3Jlc291cmNlX3N1cnZleSgpCiAJCSAqLwotCQlpZiAoZG9fbWFya19idXN5KGU4MjAubWFwW2ldLnR5cGUsIHJlcykpIHsKKwkJaWYgKGRvX21hcmtfYnVzeShlODIwLT5tYXBbaV0udHlwZSwgcmVzKSkgewogCQkJcmVzLT5mbGFncyB8PSBJT1JFU09VUkNFX0JVU1k7CiAJCQlpbnNlcnRfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCByZXMpOwogCQl9CiAJCXJlcysrOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBlODIwX3NhdmVkLm5yX21hcDsgaSsrKSB7Ci0JCXN0cnVjdCBlODIwZW50cnkgKmVudHJ5ID0gJmU4MjBfc2F2ZWQubWFwW2ldOworCWZvciAoaSA9IDA7IGkgPCBlODIwX3NhdmVkLT5ucl9tYXA7IGkrKykgeworCQlzdHJ1Y3QgZTgyMGVudHJ5ICplbnRyeSA9ICZlODIwX3NhdmVkLT5tYXBbaV07CiAJCWZpcm13YXJlX21hcF9hZGRfZWFybHkoZW50cnktPmFkZHIsCiAJCQllbnRyeS0+YWRkciArIGVudHJ5LT5zaXplLAogCQkJZTgyMF90eXBlX3RvX3N0cmluZyhlbnRyeS0+dHlwZSkpOwpAQCAtMTAyNyw3ICsxMDUyLDcgQEAKIH0KIAogLyogSG93IG11Y2ggc2hvdWxkIHdlIHBhZCBSQU0gZW5kaW5nIGRlcGVuZGluZyBvbiB3aGVyZSBpdCBpcz8gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHJhbV9hbGlnbm1lbnQocmVzb3VyY2Vfc2l6ZV90IHBvcykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCByYW1fYWxpZ25tZW50KHJlc291cmNlX3NpemVfdCBwb3MpCiB7CiAJdW5zaWduZWQgbG9uZyBtYiA9IHBvcyA+PiAyMDsKIApAQCAtMTA1MSw3ICsxMDc2LDcgQEAKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAogCXJlcyA9IGU4MjBfcmVzOwotCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGU4MjAtPm5yX21hcDsgaSsrKSB7CiAJCWlmICghcmVzLT5wYXJlbnQgJiYgcmVzLT5lbmQpCiAJCQlpbnNlcnRfcmVzb3VyY2VfZXhwYW5kX3RvX2ZpdCgmaW9tZW1fcmVzb3VyY2UsIHJlcyk7CiAJCXJlcysrOwpAQCAtMTA2MSw4ICsxMDg2LDggQEAKIAkgKiBUcnkgdG8gYnVtcCB1cCBSQU0gcmVnaW9ucyB0byByZWFzb25hYmxlIGJvdW5kYXJpZXMgdG8KIAkgKiBhdm9pZCBzdG9sZW4gUkFNOgogCSAqLwotCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7Ci0JCXN0cnVjdCBlODIwZW50cnkgKmVudHJ5ID0gJmU4MjAubWFwW2ldOworCWZvciAoaSA9IDA7IGkgPCBlODIwLT5ucl9tYXA7IGkrKykgeworCQlzdHJ1Y3QgZTgyMGVudHJ5ICplbnRyeSA9ICZlODIwLT5tYXBbaV07CiAJCXU2NCBzdGFydCwgZW5kOwogCiAJCWlmIChlbnRyeS0+dHlwZSAhPSBFODIwX1JBTSkKQEAgLTExMTAsNyArMTEzNSw3IEBACiAJCQl3aG8gPSAiQklPUy1lODAxIjsKIAkJfQogCi0JCWU4MjAubnJfbWFwID0gMDsKKwkJZTgyMC0+bnJfbWFwID0gMDsKIAkJZTgyMF9hZGRfcmVnaW9uKDAsIExPV01FTVNJWkUoKSwgRTgyMF9SQU0pOwogCQllODIwX2FkZF9yZWdpb24oSElHSF9NRU1PUlksIG1lbV9zaXplIDw8IDEwLCBFODIwX1JBTSk7CiAJfQpAQCAtMTEyNCw3ICsxMTQ5LDcgQEAKIAljaGFyICp3aG87CiAKIAl3aG8gPSB4ODZfaW5pdC5yZXNvdXJjZXMubWVtb3J5X3NldHVwKCk7Ci0JbWVtY3B5KCZlODIwX3NhdmVkLCAmZTgyMCwgc2l6ZW9mKHN0cnVjdCBlODIwbWFwKSk7CisJbWVtY3B5KGU4MjBfc2F2ZWQsIGU4MjAsIHNpemVvZihzdHJ1Y3QgZTgyMG1hcCkpOwogCXByaW50ayhLRVJOX0lORk8gImU4MjA6IEJJT1MtcHJvdmlkZWQgcGh5c2ljYWwgUkFNIG1hcDpcbiIpOwogCWU4MjBfcHJpbnRfbWFwKHdobyk7CiB9CkBAIC0xMTQxLDggKzExNjYsOCBAQAogCSAqLwogCW1lbWJsb2NrX2FsbG93X3Jlc2l6ZSgpOwogCi0JZm9yIChpID0gMDsgaSA8IGU4MjAubnJfbWFwOyBpKyspIHsKLQkJc3RydWN0IGU4MjBlbnRyeSAqZWkgPSAmZTgyMC5tYXBbaV07CisJZm9yIChpID0gMDsgaSA8IGU4MjAtPm5yX21hcDsgaSsrKSB7CisJCXN0cnVjdCBlODIwZW50cnkgKmVpID0gJmU4MjAtPm1hcFtpXTsKIAogCQllbmQgPSBlaS0+YWRkciArIGVpLT5zaXplOwogCQlpZiAoZW5kICE9IChyZXNvdXJjZV9zaXplX3QpZW5kKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2Vhcmx5LXF1aXJrcy5jIGIvYXJjaC94ODYva2VybmVsL2Vhcmx5LXF1aXJrcy5jCmluZGV4IGRlNzUwMWUuLjE4YmIzYTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9lYXJseS1xdWlya3MuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZWFybHktcXVpcmtzLmMKQEAgLTU1NSw3ICs1NTUsNyBAQAogCiAJLyogTWFyayB0aGlzIHNwYWNlIGFzIHJlc2VydmVkICovCiAJZTgyMF9hZGRfcmVnaW9uKGJhc2UsIHNpemUsIEU4MjBfUkVTRVJWRUQpOwotCXNhbml0aXplX2U4MjBfbWFwKGU4MjAubWFwLCBBUlJBWV9TSVpFKGU4MjAubWFwKSwgJmU4MjAubnJfbWFwKTsKKwlzYW5pdGl6ZV9lODIwX21hcChlODIwLT5tYXAsIEFSUkFZX1NJWkUoZTgyMC0+bWFwKSwgJmU4MjAtPm5yX21hcCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBpbnRlbF9ncmFwaGljc19xdWlya3MoaW50IG51bSwgaW50IHNsb3QsIGludCBmdW5jKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2ZwdS9pbml0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvZnB1L2luaXQuYwppbmRleCA5Mzk4MmFlLi4yZjJiOGM3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZnB1L2luaXQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZnB1L2luaXQuYwpAQCAtMzE3LDcgKzMxNyw2IEBACiAJb25fYm9vdF9jcHUgPSAwOwogCiAJV0FSTl9PTl9GUFUoY3VycmVudC0+dGhyZWFkLmZwdS5mcHN0YXRlX2FjdGl2ZSk7Ci0JY3VycmVudF90aHJlYWRfaW5mbygpLT5zdGF0dXMgPSAwOwogCiAJaWYgKGJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9YU0FWRU9QVCkgJiYgZWFnZXJmcHUgIT0gRElTQUJMRSkKIAkJZWFnZXJmcHUgPSBFTkFCTEU7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZnRyYWNlLmMgYi9hcmNoL3g4Ni9rZXJuZWwvZnRyYWNlLmMKaW5kZXggZDAzNmNmYi4uODYzOWJiMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2Z0cmFjZS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9mdHJhY2UuYwpAQCAtMTAyOSw3ICsxMDI5LDcgQEAKIAl9CiAKIAlpZiAoZnRyYWNlX3B1c2hfcmV0dXJuX3RyYWNlKG9sZCwgc2VsZl9hZGRyLCAmdHJhY2UuZGVwdGgsCi0JCSAgICBmcmFtZV9wb2ludGVyKSA9PSAtRUJVU1kpIHsKKwkJCQkgICAgIGZyYW1lX3BvaW50ZXIsIHBhcmVudCkgPT0gLUVCVVNZKSB7CiAJCSpwYXJlbnQgPSBvbGQ7CiAJCXJldHVybjsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaGVhZF8zMi5TIGIvYXJjaC94ODYva2VybmVsL2hlYWRfMzIuUwppbmRleCA2Zjg5MDJiLi41ZjQwMTI2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaGVhZF8zMi5TCisrKyBiL2FyY2gveDg2L2tlcm5lbC9oZWFkXzMyLlMKQEAgLTk0LDcgKzk0LDcgQEAKICAqLwogX19IRUFECiBFTlRSWShzdGFydHVwXzMyKQotCW1vdmwgcGEoc3RhY2tfc3RhcnQpLCVlY3gKKwltb3ZsIHBhKGluaXRpYWxfc3RhY2spLCVlY3gKIAkKIAkvKiB0ZXN0IEtFRVBfU0VHTUVOVFMgZmxhZyB0byBzZWUgaWYgdGhlIGJvb3Rsb2FkZXIgaXMgYXNraW5nCiAJCXVzIHRvIG5vdCByZWxvYWQgc2VnbWVudHMgKi8KQEAgLTI4Niw3ICsyODYsNyBAQAogICogc3RhcnRfc2Vjb25kYXJ5KCkuCiAgKi8KIEVOVFJZKHN0YXJ0X2NwdTApCi0JbW92bCBzdGFja19zdGFydCwgJWVjeAorCW1vdmwgaW5pdGlhbF9zdGFjaywgJWVjeAogCW1vdmwgJWVjeCwgJWVzcAogCWptcCAgKihpbml0aWFsX2NvZGUpCiBFTkRQUk9DKHN0YXJ0X2NwdTApCkBAIC0zMDcsNyArMzA3LDcgQEAKIAltb3ZsICVlYXgsJWVzCiAJbW92bCAlZWF4LCVmcwogCW1vdmwgJWVheCwlZ3MKLQltb3ZsIHBhKHN0YWNrX3N0YXJ0KSwlZWN4CisJbW92bCBwYShpbml0aWFsX3N0YWNrKSwlZWN4CiAJbW92bCAlZWF4LCVzcwogCWxlYWwgLV9fUEFHRV9PRkZTRVQoJWVjeCksJWVzcAogCkBAIC03MDMsNyArNzAzLDcgQEAKIAogLmRhdGEKIC5iYWxpZ24gNAotRU5UUlkoc3RhY2tfc3RhcnQpCitFTlRSWShpbml0aWFsX3N0YWNrKQogCS5sb25nIGluaXRfdGhyZWFkX3VuaW9uK1RIUkVBRF9TSVpFCiAKIF9fSU5JVFJPREFUQQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2hlYWRfNjQuUyBiL2FyY2gveDg2L2tlcm5lbC9oZWFkXzY0LlMKaW5kZXggOWY4ZWZjOS4uYzk4YTU1OSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2hlYWRfNjQuUworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaGVhZF82NC5TCkBAIC02Niw3ICs2Niw3IEBACiAJICovCiAKIAkvKgotCSAqIFNldHVwIHN0YWNrIGZvciB2ZXJpZnlfY3B1KCkuICItOCIgYmVjYXVzZSBzdGFja19zdGFydCBpcyBkZWZpbmVkCisJICogU2V0dXAgc3RhY2sgZm9yIHZlcmlmeV9jcHUoKS4gIi04IiBiZWNhdXNlIGluaXRpYWxfc3RhY2sgaXMgZGVmaW5lZAogCSAqIHRoaXMgd2F5LCBzZWUgYmVsb3cuIE91ciBiZXN0IGd1ZXNzIGlzIGEgTlVMTCBwdHIgZm9yIHN0YWNrCiAJICogdGVybWluYXRpb24gaGV1cmlzdGljcyBhbmQgd2UgZG9uJ3Qgd2FudCB0byBicmVhayBhbnl0aGluZyB3aGljaAogCSAqIG1pZ2h0IGRlcGVuZCBvbiBpdCAoa2dkYiwgLi4uKS4KQEAgLTIyNiw3ICsyMjYsNyBAQAogCW1vdnEJJXJheCwgJWNyMAogCiAJLyogU2V0dXAgYSBib290IHRpbWUgc3RhY2sgKi8KLQltb3ZxIHN0YWNrX3N0YXJ0KCVyaXApLCAlcnNwCisJbW92cSBpbml0aWFsX3N0YWNrKCVyaXApLCAlcnNwCiAKIAkvKiB6ZXJvIEVGTEFHUyBhZnRlciBzZXR0aW5nIHJzcCAqLwogCXB1c2hxICQwCkBAIC0zMTAsNyArMzEwLDcgQEAKICAqIHN0YXJ0X3NlY29uZGFyeSgpLgogICovCiBFTlRSWShzdGFydF9jcHUwKQotCW1vdnEgc3RhY2tfc3RhcnQoJXJpcCksJXJzcAorCW1vdnEgaW5pdGlhbF9zdGFjayglcmlwKSwlcnNwCiAJbW92cQlpbml0aWFsX2NvZGUoJXJpcCksJXJheAogCXB1c2hxCSQwCQkjIGZha2UgcmV0dXJuIGFkZHJlc3MgdG8gc3RvcCB1bndpbmRlcgogCXB1c2hxCSRfX0tFUk5FTF9DUwkjIHNldCBjb3JyZWN0IGNzCkBAIC0zMTksMTcgKzMxOSwxNSBAQAogRU5EUFJPQyhzdGFydF9jcHUwKQogI2VuZGlmCiAKLQkvKiBTTVAgYm9vdHVwIGNoYW5nZXMgdGhlc2UgdHdvICovCisJLyogQm90aCBTTVAgYm9vdHVwIGFuZCBBQ1BJIHN1c3BlbmQgY2hhbmdlIHRoZXNlIHZhcmlhYmxlcyAqLwogCV9fUkVGREFUQQogCS5iYWxpZ24JOAogCUdMT0JBTChpbml0aWFsX2NvZGUpCiAJLnF1YWQJeDg2XzY0X3N0YXJ0X2tlcm5lbAogCUdMT0JBTChpbml0aWFsX2dzKQogCS5xdWFkCUlOSVRfUEVSX0NQVV9WQVIoaXJxX3N0YWNrX3VuaW9uKQotCi0JR0xPQkFMKHN0YWNrX3N0YXJ0KQorCUdMT0JBTChpbml0aWFsX3N0YWNrKQogCS5xdWFkICBpbml0X3RocmVhZF91bmlvbitUSFJFQURfU0laRS04Ci0JLndvcmQgIDAKIAlfX0ZJTklUREFUQQogCiBiYWRfYWRkcmVzczoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9ocGV0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvaHBldC5jCmluZGV4IGM2ZGZkODAuLjI3NGZhYjkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9ocGV0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2hwZXQuYwpAQCAtNzU2LDEwICs3NTYsMTA0IEBACiAvKgogICogQ2xvY2sgc291cmNlIHJlbGF0ZWQgY29kZQogICovCisjaWYgZGVmaW5lZChDT05GSUdfU01QKSAmJiBkZWZpbmVkKENPTkZJR182NEJJVCkKKy8qCisgKiBSZWFkaW5nIHRoZSBIUEVUIGNvdW50ZXIgaXMgYSB2ZXJ5IHNsb3cgb3BlcmF0aW9uLiBJZiBhIGxhcmdlIG51bWJlciBvZgorICogQ1BVcyBhcmUgdHJ5aW5nIHRvIGFjY2VzcyB0aGUgSFBFVCBjb3VudGVyIHNpbXVsdGFuZW91c2x5LCBpdCBjYW4gY2F1c2UKKyAqIG1hc3NpdmUgZGVsYXkgYW5kIHNsb3cgZG93biBzeXN0ZW0gcGVyZm9ybWFuY2UgZHJhbWF0aWNhbGx5LiBUaGlzIG1heQorICogaGFwcGVuIHdoZW4gSFBFVCBpcyB0aGUgZGVmYXVsdCBjbG9jayBzb3VyY2UgaW5zdGVhZCBvZiBUU0MuIEZvciBhCisgKiByZWFsbHkgbGFyZ2Ugc3lzdGVtIHdpdGggaHVuZHJlZHMgb2YgQ1BVcywgdGhlIHNsb3dkb3duIG1heSBiZSBzbworICogc2V2ZXJlIHRoYXQgaXQgbWF5IGFjdHVhbGx5IGNyYXNoIHRoZSBzeXN0ZW0gYmVjYXVzZSBvZiBhIE5NSSB3YXRjaGRvZworICogc29mdCBsb2NrdXAsIGZvciBleGFtcGxlLgorICoKKyAqIElmIG11bHRpcGxlIENQVXMgYXJlIHRyeWluZyB0byBhY2Nlc3MgdGhlIEhQRVQgY291bnRlciBhdCB0aGUgc2FtZSB0aW1lLAorICogd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0byByZWFkIHRoZSBjb3VudGVyIG11bHRpcGxlIHRpbWVzLiBJbnN0ZWFkLCB0aGUKKyAqIG90aGVyIENQVXMgY2FuIHVzZSB0aGUgY291bnRlciB2YWx1ZSByZWFkIGJ5IHRoZSBmaXJzdCBDUFUgaW4gdGhlIGdyb3VwLgorICoKKyAqIFRoaXMgc3BlY2lhbCBmZWF0dXJlIGlzIG9ubHkgZW5hYmxlZCBvbiB4ODYtNjQgc3lzdGVtcy4gSXQgaXMgdW5saWtlbHkKKyAqIHRoYXQgMzItYml0IHg4NiBzeXN0ZW1zIHdpbGwgaGF2ZSBlbm91Z2ggQ1BVcyB0byByZXF1aXJlIHRoaXMgZmVhdHVyZQorICogd2l0aCBpdHMgYXNzb2NpYXRlZCBsb2NraW5nIG92ZXJoZWFkLiBBbmQgd2UgYWxzbyBuZWVkIDY0LWJpdCBhdG9taWMKKyAqIHJlYWQuCisgKgorICogVGhlIGxvY2sgYW5kIHRoZSBocGV0IHZhbHVlIGFyZSBzdG9yZWQgdG9nZXRoZXIgYW5kIGNhbiBiZSByZWFkIGluIGEKKyAqIHNpbmdsZSBhdG9taWMgNjQtYml0IHJlYWQuIEl0IGlzIGV4cGxpY2l0bHkgYXNzdW1lZCB0aGF0IGFyY2hfc3BpbmxvY2tfdAorICogaXMgMzIgYml0cyBpbiBzaXplLgorICovCit1bmlvbiBocGV0X2xvY2sgeworCXN0cnVjdCB7CisJCWFyY2hfc3BpbmxvY2tfdCBsb2NrOworCQl1MzIgdmFsdWU7CisJfTsKKwl1NjQgbG9ja3ZhbDsKK307CisKK3N0YXRpYyB1bmlvbiBocGV0X2xvY2sgaHBldCBfX2NhY2hlbGluZV9hbGlnbmVkID0geworCXsgLmxvY2sgPSBfX0FSQ0hfU1BJTl9MT0NLX1VOTE9DS0VELCB9LAorfTsKKworc3RhdGljIGN5Y2xlX3QgcmVhZF9ocGV0KHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bmlvbiBocGV0X2xvY2sgb2xkLCBuZXc7CisKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHVuaW9uIGhwZXRfbG9jaykgIT0gOCk7CisKKwkvKgorCSAqIFJlYWQgSFBFVCBkaXJlY3RseSBpZiBpbiBOTUkuCisJICovCisJaWYgKGluX25taSgpKQorCQlyZXR1cm4gKGN5Y2xlX3QpaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOworCisJLyoKKwkgKiBSZWFkIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBsb2NrIGFuZCBIUEVUIHZhbHVlIGF0b21pY2FsbHkuCisJICovCisJb2xkLmxvY2t2YWwgPSBSRUFEX09OQ0UoaHBldC5sb2NrdmFsKTsKKworCWlmIChhcmNoX3NwaW5faXNfbG9ja2VkKCZvbGQubG9jaykpCisJCWdvdG8gY29udGVuZGVkOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWlmIChhcmNoX3NwaW5fdHJ5bG9jaygmaHBldC5sb2NrKSkgeworCQluZXcudmFsdWUgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7CisJCS8qCisJCSAqIFVzZSBXUklURV9PTkNFKCkgdG8gcHJldmVudCBzdG9yZSB0ZWFyaW5nLgorCQkgKi8KKwkJV1JJVEVfT05DRShocGV0LnZhbHVlLCBuZXcudmFsdWUpOworCQlhcmNoX3NwaW5fdW5sb2NrKCZocGV0LmxvY2spOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXJldHVybiAoY3ljbGVfdCluZXcudmFsdWU7CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworY29udGVuZGVkOgorCS8qCisJICogQ29udGVuZGVkIGNhc2UKKwkgKiAtLS0tLS0tLS0tLS0tLQorCSAqIFdhaXQgdW50aWwgdGhlIEhQRVQgdmFsdWUgY2hhbmdlIG9yIHRoZSBsb2NrIGlzIGZyZWUgdG8gaW5kaWNhdGUKKwkgKiBpdHMgdmFsdWUgaXMgdXAtdG8tZGF0ZS4KKwkgKgorCSAqIEl0IGlzIHBvc3NpYmxlIHRoYXQgb2xkLnZhbHVlIGhhcyBhbHJlYWR5IGNvbnRhaW5lZCB0aGUgbGF0ZXN0CisJICogSFBFVCB2YWx1ZSB3aGlsZSB0aGUgbG9jayBob2xkZXIgd2FzIGluIHRoZSBwcm9jZXNzIG9mIHJlbGVhc2luZworCSAqIHRoZSBsb2NrLiBDaGVja2luZyBmb3IgbG9jayBzdGF0ZSBjaGFuZ2Ugd2lsbCBlbmFibGUgdXMgdG8gcmV0dXJuCisJICogdGhlIHZhbHVlIGltbWVkaWF0ZWx5IGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgdGhlIG5leHQgSFBFVCByZWFkZXIKKwkgKiB0byBjb21lIGFsb25nLgorCSAqLworCWRvIHsKKwkJY3B1X3JlbGF4KCk7CisJCW5ldy5sb2NrdmFsID0gUkVBRF9PTkNFKGhwZXQubG9ja3ZhbCk7CisJfSB3aGlsZSAoKG5ldy52YWx1ZSA9PSBvbGQudmFsdWUpICYmIGFyY2hfc3Bpbl9pc19sb2NrZWQoJm5ldy5sb2NrKSk7CisKKwlyZXR1cm4gKGN5Y2xlX3QpbmV3LnZhbHVlOworfQorI2Vsc2UKKy8qCisgKiBGb3IgVVAgb3IgMzItYml0LgorICovCiBzdGF0aWMgY3ljbGVfdCByZWFkX2hwZXQoc3RydWN0IGNsb2Nrc291cmNlICpjcykKIHsKIAlyZXR1cm4gKGN5Y2xlX3QpaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOwogfQorI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgY2xvY2tzb3VyY2UgY2xvY2tzb3VyY2VfaHBldCA9IHsKIAkubmFtZQkJPSAiaHBldCIsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaXJxXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxXzY0LmMKaW5kZXggNGE3OTAzNy4uOWViZDBiMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2lycV82NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9pcnFfNjQuYwpAQCAtNDAsOCArNDAsNyBAQAogCWlmICh1c2VyX21vZGUocmVncykpCiAJCXJldHVybjsKIAotCWlmIChyZWdzLT5zcCA+PSBjdXJiYXNlICsgc2l6ZW9mKHN0cnVjdCB0aHJlYWRfaW5mbykgKwotCQkJCSAgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSArIFNUQUNLX1RPUF9NQVJHSU4gJiYKKwlpZiAocmVncy0+c3AgPj0gY3VyYmFzZSArIHNpemVvZihzdHJ1Y3QgcHRfcmVncykgKyBTVEFDS19UT1BfTUFSR0lOICYmCiAJICAgIHJlZ3MtPnNwIDw9IGN1cmJhc2UgKyBUSFJFQURfU0laRSkKIAkJcmV0dXJuOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwva2V4ZWMtYnppbWFnZTY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwva2V4ZWMtYnppbWFnZTY0LmMKaW5kZXggZjIzNTZiZC4uMzQwN2IxNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2tleGVjLWJ6aW1hZ2U2NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9rZXhlYy1iemltYWdlNjQuYwpAQCAtOTksMTQgKzk5LDE0IEBACiB7CiAJdW5zaWduZWQgaW50IG5yX2U4MjBfZW50cmllczsKIAotCW5yX2U4MjBfZW50cmllcyA9IGU4MjBfc2F2ZWQubnJfbWFwOworCW5yX2U4MjBfZW50cmllcyA9IGU4MjBfc2F2ZWQtPm5yX21hcDsKIAogCS8qIFRPRE86IFBhc3MgZW50cmllcyBtb3JlIHRoYW4gRTgyME1BWCBpbiBib290cGFyYW1zIHNldHVwIGRhdGEgKi8KIAlpZiAobnJfZTgyMF9lbnRyaWVzID4gRTgyME1BWCkKIAkJbnJfZTgyMF9lbnRyaWVzID0gRTgyME1BWDsKIAogCXBhcmFtcy0+ZTgyMF9lbnRyaWVzID0gbnJfZTgyMF9lbnRyaWVzOwotCW1lbWNweSgmcGFyYW1zLT5lODIwX21hcCwgJmU4MjBfc2F2ZWQubWFwLAorCW1lbWNweSgmcGFyYW1zLT5lODIwX21hcCwgJmU4MjBfc2F2ZWQtPm1hcCwKIAkgICAgICAgbnJfZTgyMF9lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBlODIwZW50cnkpKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2tnZGIuYyBiL2FyY2gveDg2L2tlcm5lbC9rZ2RiLmMKaW5kZXggMDRjZGU1Mi4uOGUzNmYyNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2tnZGIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwva2dkYi5jCkBAIC01MCw2ICs1MCw3IEBACiAjaW5jbHVkZSA8YXNtL2FwaWNkZWYuaD4KICNpbmNsdWRlIDxhc20vYXBpYy5oPgogI2luY2x1ZGUgPGFzbS9ubWkuaD4KKyNpbmNsdWRlIDxhc20vc3dpdGNoX3RvLmg+CiAKIHN0cnVjdCBkYmdfcmVnX2RlZl90IGRiZ19yZWdfZGVmW0RCR19NQVhfUkVHX05VTV0gPQogewpAQCAtMTY2LDIxICsxNjcsMTkgQEAKIAlnZGJfcmVnc1tHREJfRFhdCT0gMDsKIAlnZGJfcmVnc1tHREJfU0ldCT0gMDsKIAlnZGJfcmVnc1tHREJfREldCT0gMDsKLQlnZGJfcmVnc1tHREJfQlBdCT0gKih1bnNpZ25lZCBsb25nICopcC0+dGhyZWFkLnNwOworCWdkYl9yZWdzW0dEQl9CUF0JPSAoKHN0cnVjdCBpbmFjdGl2ZV90YXNrX2ZyYW1lICopcC0+dGhyZWFkLnNwKS0+YnA7CiAjaWZkZWYgQ09ORklHX1g4Nl8zMgogCWdkYl9yZWdzW0dEQl9EU10JPSBfX0tFUk5FTF9EUzsKIAlnZGJfcmVnc1tHREJfRVNdCT0gX19LRVJORUxfRFM7CiAJZ2RiX3JlZ3NbR0RCX1BTXQk9IDA7CiAJZ2RiX3JlZ3NbR0RCX0NTXQk9IF9fS0VSTkVMX0NTOwotCWdkYl9yZWdzW0dEQl9QQ10JPSBwLT50aHJlYWQuaXA7CiAJZ2RiX3JlZ3NbR0RCX1NTXQk9IF9fS0VSTkVMX0RTOwogCWdkYl9yZWdzW0dEQl9GU10JPSAweEZGRkY7CiAJZ2RiX3JlZ3NbR0RCX0dTXQk9IDB4RkZGRjsKICNlbHNlCi0JZ2RiX3JlZ3MzMltHREJfUFNdCT0gKih1bnNpZ25lZCBsb25nICopKHAtPnRocmVhZC5zcCArIDgpOworCWdkYl9yZWdzMzJbR0RCX1BTXQk9IDA7CiAJZ2RiX3JlZ3MzMltHREJfQ1NdCT0gX19LRVJORUxfQ1M7CiAJZ2RiX3JlZ3MzMltHREJfU1NdCT0gX19LRVJORUxfRFM7Ci0JZ2RiX3JlZ3NbR0RCX1BDXQk9IDA7CiAJZ2RiX3JlZ3NbR0RCX1I4XQk9IDA7CiAJZ2RiX3JlZ3NbR0RCX1I5XQk9IDA7CiAJZ2RiX3JlZ3NbR0RCX1IxMF0JPSAwOwpAQCAtMTkwLDYgKzE4OSw3IEBACiAJZ2RiX3JlZ3NbR0RCX1IxNF0JPSAwOwogCWdkYl9yZWdzW0dEQl9SMTVdCT0gMDsKICNlbmRpZgorCWdkYl9yZWdzW0dEQl9QQ10JPSAwOwogCWdkYl9yZWdzW0dEQl9TUF0JPSBwLT50aHJlYWQuc3A7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9rcHJvYmVzL2NvcmUuYyBiL2FyY2gveDg2L2tlcm5lbC9rcHJvYmVzL2NvcmUuYwppbmRleCA3ODQ3ZTVjLi4yOGNlZTAxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwva3Byb2Jlcy9jb3JlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2twcm9iZXMvY29yZS5jCkBAIC00NSw3ICs0NSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9wcmVlbXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXh0YWJsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwva3Byb2Jlcy9vcHQuYyBiL2FyY2gveDg2L2tlcm5lbC9rcHJvYmVzL29wdC5jCmluZGV4IDQ0MjVmNTkuLjNiYjRjNWYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9rcHJvYmVzL29wdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9rcHJvYmVzL29wdC5jCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9wcmVlbXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXh0YWJsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwva3N5c2ZzLmMgYi9hcmNoL3g4Ni9rZXJuZWwva3N5c2ZzLmMKaW5kZXggYzJiZWRhZS4uNGFmYzY3ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2tzeXNmcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9rc3lzZnMuYwpAQCAtMTg0LDcgKzE4NCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgdHlwZV9hdHRyID0gX19BVFRSX1JPKHR5cGUpOwogCi1zdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgZGF0YV9hdHRyID0geworc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIGRhdGFfYXR0ciBfX3JvX2FmdGVyX2luaXQgPSB7CiAJLmF0dHIgPSB7CiAJCS5uYW1lID0gImRhdGEiLAogCQkubW9kZSA9IFNfSVJVR08sCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwva3ZtLmMgYi9hcmNoL3g4Ni9rZXJuZWwva3ZtLmMKaW5kZXggMTcyNmM0Yy4uZWRiYmZjOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2t2bS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9rdm0uYwpAQCAtNDIzLDEyICs0MjMsNyBAQAogCWt2bV9zcGlubG9ja19pbml0KCk7CiB9CiAKLXN0YXRpYyB2b2lkIGt2bV9ndWVzdF9jcHVfb25saW5lKHZvaWQgKmR1bW15KQotewotCWt2bV9ndWVzdF9jcHVfaW5pdCgpOwotfQotCi1zdGF0aWMgdm9pZCBrdm1fZ3Vlc3RfY3B1X29mZmxpbmUodm9pZCAqZHVtbXkpCitzdGF0aWMgdm9pZCBrdm1fZ3Vlc3RfY3B1X29mZmxpbmUodm9pZCkKIHsKIAlrdm1fZGlzYWJsZV9zdGVhbF90aW1lKCk7CiAJaWYgKGt2bV9wYXJhX2hhc19mZWF0dXJlKEtWTV9GRUFUVVJFX1BWX0VPSSkpCkBAIC00MzcsMjkgKzQzMiwyMSBAQAogCWFwZl90YXNrX3dha2VfYWxsKCk7CiB9CiAKLXN0YXRpYyBpbnQga3ZtX2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwKLQkJCSAgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQga3ZtX2NwdV9vbmxpbmUodW5zaWduZWQgaW50IGNwdSkKIHsKLQlpbnQgY3B1ID0gKHVuc2lnbmVkIGxvbmcpaGNwdTsKLQlzd2l0Y2ggKGFjdGlvbikgewotCWNhc2UgQ1BVX09OTElORToKLQljYXNlIENQVV9ET1dOX0ZBSUxFRDoKLQljYXNlIENQVV9PTkxJTkVfRlJPWkVOOgotCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBrdm1fZ3Vlc3RfY3B1X29ubGluZSwgTlVMTCwgMCk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BVX0RPV05fUFJFUEFSRToKLQljYXNlIENQVV9ET1dOX1BSRVBBUkVfRlJPWkVOOgotCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBrdm1fZ3Vlc3RfY3B1X29mZmxpbmUsIE5VTEwsIDEpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIE5PVElGWV9PSzsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWt2bV9ndWVzdF9jcHVfaW5pdCgpOworCWxvY2FsX2lycV9lbmFibGUoKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBrdm1fY3B1X25vdGlmaWVyID0gewotICAgICAgICAubm90aWZpZXJfY2FsbCAgPSBrdm1fY3B1X25vdGlmeSwKLX07CitzdGF0aWMgaW50IGt2bV9jcHVfZG93bl9wcmVwYXJlKHVuc2lnbmVkIGludCBjcHUpCit7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlrdm1fZ3Vlc3RfY3B1X29mZmxpbmUoKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJcmV0dXJuIDA7Cit9CiAjZW5kaWYKIAogc3RhdGljIHZvaWQgX19pbml0IGt2bV9hcGZfdHJhcF9pbml0KHZvaWQpCkBAIC00OTQsNyArNDgxLDkgQEAKIAogI2lmZGVmIENPTkZJR19TTVAKIAlzbXBfb3BzLnNtcF9wcmVwYXJlX2Jvb3RfY3B1ID0ga3ZtX3NtcF9wcmVwYXJlX2Jvb3RfY3B1OwotCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigma3ZtX2NwdV9ub3RpZmllcik7CisJaWYgKGNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVBfT05MSU5FX0RZTiwgIng4Ni9rdm06b25saW5lIiwKKwkJCQkgICAgICBrdm1fY3B1X29ubGluZSwga3ZtX2NwdV9kb3duX3ByZXBhcmUpIDwgMCkKKwkJcHJfZXJyKCJrdm1fZ3Vlc3Q6IEZhaWxlZCB0byBpbnN0YWxsIGNwdSBob3RwbHVnIGNhbGxiYWNrc1xuIik7CiAjZWxzZQogCWt2bV9ndWVzdF9jcHVfaW5pdCgpOwogI2VuZGlmCkBAIC01NzUsOSArNTY0LDYgQEAKIAlrdm1faHlwZXJjYWxsMihLVk1fSENfS0lDS19DUFUsIGZsYWdzLCBhcGljaWQpOwogfQogCi0KLSNpZmRlZiBDT05GSUdfUVVFVUVEX1NQSU5MT0NLUwotCiAjaW5jbHVkZSA8YXNtL3FzcGlubG9jay5oPgogCiBzdGF0aWMgdm9pZCBrdm1fd2FpdCh1OCAqcHRyLCB1OCB2YWwpCkBAIC02MDYsMjQzICs1OTIsNiBAQAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAotI2Vsc2UgLyogIUNPTkZJR19RVUVVRURfU1BJTkxPQ0tTICovCi0KLWVudW0ga3ZtX2NvbnRlbnRpb25fc3RhdCB7Ci0JVEFLRU5fU0xPVywKLQlUQUtFTl9TTE9XX1BJQ0tVUCwKLQlSRUxFQVNFRF9TTE9XLAotCVJFTEVBU0VEX1NMT1dfS0lDS0VELAotCU5SX0NPTlRFTlRJT05fU1RBVFMKLX07Ci0KLSNpZmRlZiBDT05GSUdfS1ZNX0RFQlVHX0ZTCi0jZGVmaW5lIEhJU1RPX0JVQ0tFVFMJMzAKLQotc3RhdGljIHN0cnVjdCBrdm1fc3BpbmxvY2tfc3RhdHMKLXsKLQl1MzIgY29udGVudGlvbl9zdGF0c1tOUl9DT05URU5USU9OX1NUQVRTXTsKLQl1MzIgaGlzdG9fc3Bpbl9ibG9ja2VkW0hJU1RPX0JVQ0tFVFMrMV07Ci0JdTY0IHRpbWVfYmxvY2tlZDsKLX0gc3BpbmxvY2tfc3RhdHM7Ci0KLXN0YXRpYyB1OCB6ZXJvX3N0YXRzOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfemVybyh2b2lkKQotewotCXU4IHJldDsKLQl1OCBvbGQ7Ci0KLQlvbGQgPSBSRUFEX09OQ0UoemVyb19zdGF0cyk7Ci0JaWYgKHVubGlrZWx5KG9sZCkpIHsKLQkJcmV0ID0gY21weGNoZygmemVyb19zdGF0cywgb2xkLCAwKTsKLQkJLyogVGhpcyBlbnN1cmVzIG9ubHkgb25lIGZlbGxvdyByZXNldHMgdGhlIHN0YXQgKi8KLQkJaWYgKHJldCA9PSBvbGQpCi0JCQltZW1zZXQoJnNwaW5sb2NrX3N0YXRzLCAwLCBzaXplb2Yoc3BpbmxvY2tfc3RhdHMpKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhZGRfc3RhdHMoZW51bSBrdm1fY29udGVudGlvbl9zdGF0IHZhciwgdTMyIHZhbCkKLXsKLQljaGVja196ZXJvKCk7Ci0Jc3BpbmxvY2tfc3RhdHMuY29udGVudGlvbl9zdGF0c1t2YXJdICs9IHZhbDsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHU2NCBzcGluX3RpbWVfc3RhcnQodm9pZCkKLXsKLQlyZXR1cm4gc2NoZWRfY2xvY2soKTsKLX0KLQotc3RhdGljIHZvaWQgX19zcGluX3RpbWVfYWNjdW0odTY0IGRlbHRhLCB1MzIgKmFycmF5KQotewotCXVuc2lnbmVkIGluZGV4OwotCi0JaW5kZXggPSBpbG9nMihkZWx0YSk7Ci0JY2hlY2tfemVybygpOwotCi0JaWYgKGluZGV4IDwgSElTVE9fQlVDS0VUUykKLQkJYXJyYXlbaW5kZXhdKys7Ci0JZWxzZQotCQlhcnJheVtISVNUT19CVUNLRVRTXSsrOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3Bpbl90aW1lX2FjY3VtX2Jsb2NrZWQodTY0IHN0YXJ0KQotewotCXUzMiBkZWx0YTsKLQotCWRlbHRhID0gc2NoZWRfY2xvY2soKSAtIHN0YXJ0OwotCV9fc3Bpbl90aW1lX2FjY3VtKGRlbHRhLCBzcGlubG9ja19zdGF0cy5oaXN0b19zcGluX2Jsb2NrZWQpOwotCXNwaW5sb2NrX3N0YXRzLnRpbWVfYmxvY2tlZCArPSBkZWx0YTsKLX0KLQotc3RhdGljIHN0cnVjdCBkZW50cnkgKmRfc3Bpbl9kZWJ1ZzsKLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkX2t2bV9kZWJ1ZzsKLQotc3RhdGljIHN0cnVjdCBkZW50cnkgKmt2bV9pbml0X2RlYnVnZnModm9pZCkKLXsKLQlkX2t2bV9kZWJ1ZyA9IGRlYnVnZnNfY3JlYXRlX2Rpcigia3ZtLWd1ZXN0IiwgTlVMTCk7Ci0JaWYgKCFkX2t2bV9kZWJ1ZykKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ291bGQgbm90IGNyZWF0ZSAna3ZtJyBkZWJ1Z2ZzIGRpcmVjdG9yeVxuIik7Ci0KLQlyZXR1cm4gZF9rdm1fZGVidWc7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGt2bV9zcGlubG9ja19kZWJ1Z2ZzKHZvaWQpCi17Ci0Jc3RydWN0IGRlbnRyeSAqZF9rdm07Ci0KLQlkX2t2bSA9IGt2bV9pbml0X2RlYnVnZnMoKTsKLQlpZiAoZF9rdm0gPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlkX3NwaW5fZGVidWcgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoInNwaW5sb2NrcyIsIGRfa3ZtKTsKLQotCWRlYnVnZnNfY3JlYXRlX3U4KCJ6ZXJvX3N0YXRzIiwgMDY0NCwgZF9zcGluX2RlYnVnLCAmemVyb19zdGF0cyk7Ci0KLQlkZWJ1Z2ZzX2NyZWF0ZV91MzIoInRha2VuX3Nsb3ciLCAwNDQ0LCBkX3NwaW5fZGVidWcsCi0JCSAgICZzcGlubG9ja19zdGF0cy5jb250ZW50aW9uX3N0YXRzW1RBS0VOX1NMT1ddKTsKLQlkZWJ1Z2ZzX2NyZWF0ZV91MzIoInRha2VuX3Nsb3dfcGlja3VwIiwgMDQ0NCwgZF9zcGluX2RlYnVnLAotCQkgICAmc3BpbmxvY2tfc3RhdHMuY29udGVudGlvbl9zdGF0c1tUQUtFTl9TTE9XX1BJQ0tVUF0pOwotCi0JZGVidWdmc19jcmVhdGVfdTMyKCJyZWxlYXNlZF9zbG93IiwgMDQ0NCwgZF9zcGluX2RlYnVnLAotCQkgICAmc3BpbmxvY2tfc3RhdHMuY29udGVudGlvbl9zdGF0c1tSRUxFQVNFRF9TTE9XXSk7Ci0JZGVidWdmc19jcmVhdGVfdTMyKCJyZWxlYXNlZF9zbG93X2tpY2tlZCIsIDA0NDQsIGRfc3Bpbl9kZWJ1ZywKLQkJICAgJnNwaW5sb2NrX3N0YXRzLmNvbnRlbnRpb25fc3RhdHNbUkVMRUFTRURfU0xPV19LSUNLRURdKTsKLQotCWRlYnVnZnNfY3JlYXRlX3U2NCgidGltZV9ibG9ja2VkIiwgMDQ0NCwgZF9zcGluX2RlYnVnLAotCQkJICAgJnNwaW5sb2NrX3N0YXRzLnRpbWVfYmxvY2tlZCk7Ci0KLQlkZWJ1Z2ZzX2NyZWF0ZV91MzJfYXJyYXkoImhpc3RvX2Jsb2NrZWQiLCAwNDQ0LCBkX3NwaW5fZGVidWcsCi0JCSAgICAgc3BpbmxvY2tfc3RhdHMuaGlzdG9fc3Bpbl9ibG9ja2VkLCBISVNUT19CVUNLRVRTICsgMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLWZzX2luaXRjYWxsKGt2bV9zcGlubG9ja19kZWJ1Z2ZzKTsKLSNlbHNlICAvKiAhQ09ORklHX0tWTV9ERUJVR19GUyAqLwotc3RhdGljIGlubGluZSB2b2lkIGFkZF9zdGF0cyhlbnVtIGt2bV9jb250ZW50aW9uX3N0YXQgdmFyLCB1MzIgdmFsKQotewotfQotCi1zdGF0aWMgaW5saW5lIHU2NCBzcGluX3RpbWVfc3RhcnQodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNwaW5fdGltZV9hY2N1bV9ibG9ja2VkKHU2NCBzdGFydCkKLXsKLX0KLSNlbmRpZiAgLyogQ09ORklHX0tWTV9ERUJVR19GUyAqLwotCi1zdHJ1Y3Qga3ZtX2xvY2tfd2FpdGluZyB7Ci0Jc3RydWN0IGFyY2hfc3BpbmxvY2sgKmxvY2s7Ci0JX190aWNrZXRfdCB3YW50OwotfTsKLQotLyogY3B1cyAnd2FpdGluZycgb24gYSBzcGlubG9jayB0byBiZWNvbWUgYXZhaWxhYmxlICovCi1zdGF0aWMgY3B1bWFza190IHdhaXRpbmdfY3B1czsKLQotLyogVHJhY2sgc3BpbmxvY2sgb24gd2hpY2ggYSBjcHUgaXMgd2FpdGluZyAqLwotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBrdm1fbG9ja193YWl0aW5nLCBrbG9ja193YWl0aW5nKTsKLQotX192aXNpYmxlIHZvaWQga3ZtX2xvY2tfc3Bpbm5pbmcoc3RydWN0IGFyY2hfc3BpbmxvY2sgKmxvY2ssIF9fdGlja2V0X3Qgd2FudCkKLXsKLQlzdHJ1Y3Qga3ZtX2xvY2tfd2FpdGluZyAqdzsKLQlpbnQgY3B1OwotCXU2NCBzdGFydDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCV9fdGlja2V0X3QgaGVhZDsKLQotCWlmIChpbl9ubWkoKSkKLQkJcmV0dXJuOwotCi0JdyA9IHRoaXNfY3B1X3B0cigma2xvY2tfd2FpdGluZyk7Ci0JY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXN0YXJ0ID0gc3Bpbl90aW1lX3N0YXJ0KCk7Ci0KLQkvKgotCSAqIE1ha2Ugc3VyZSBhbiBpbnRlcnJ1cHQgaGFuZGxlciBjYW4ndCB1cHNldCB0aGluZ3MgaW4gYQotCSAqIHBhcnRpYWxseSBzZXR1cCBzdGF0ZS4KLQkgKi8KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQkvKgotCSAqIFRoZSBvcmRlcmluZyBwcm90b2NvbCBvbiB0aGlzIGlzIHRoYXQgdGhlICJsb2NrIiBwb2ludGVyCi0JICogbWF5IG9ubHkgYmUgc2V0IG5vbi1OVUxMIGlmIHRoZSAid2FudCIgdGlja2V0IGlzIGNvcnJlY3QuCi0JICogSWYgd2UncmUgdXBkYXRpbmcgIndhbnQiLCB3ZSBtdXN0IGZpcnN0IGNsZWFyICJsb2NrIi4KLQkgKi8KLQl3LT5sb2NrID0gTlVMTDsKLQlzbXBfd21iKCk7Ci0Jdy0+d2FudCA9IHdhbnQ7Ci0Jc21wX3dtYigpOwotCXctPmxvY2sgPSBsb2NrOwotCi0JYWRkX3N0YXRzKFRBS0VOX1NMT1csIDEpOwotCi0JLyoKLQkgKiBUaGlzIHVzZXMgc2V0X2JpdCwgd2hpY2ggaXMgYXRvbWljIGJ1dCB3ZSBzaG91bGQgbm90IHJlbHkgb24gaXRzCi0JICogcmVvcmRlcmluZyBndXJhbnRlZXMuIFNvIGJhcnJpZXIgaXMgbmVlZGVkIGFmdGVyIHRoaXMgY2FsbC4KLQkgKi8KLQljcHVtYXNrX3NldF9jcHUoY3B1LCAmd2FpdGluZ19jcHVzKTsKLQotCWJhcnJpZXIoKTsKLQotCS8qCi0JICogTWFyayBlbnRyeSB0byBzbG93cGF0aCBiZWZvcmUgZG9pbmcgdGhlIHBpY2t1cCB0ZXN0IHRvIG1ha2UKLQkgKiBzdXJlIHdlIGRvbid0IGRlYWRsb2NrIHdpdGggYW4gdW5sb2NrZXIuCi0JICovCi0JX190aWNrZXRfZW50ZXJfc2xvd3BhdGgobG9jayk7Ci0KLQkvKiBtYWtlIHN1cmUgZW50ZXJfc2xvd3BhdGgsIHdoaWNoIGlzIGF0b21pYyBkb2VzIG5vdCBjcm9zcyB0aGUgcmVhZCAqLwotCXNtcF9tYl9fYWZ0ZXJfYXRvbWljKCk7Ci0KLQkvKgotCSAqIGNoZWNrIGFnYWluIG1ha2Ugc3VyZSBpdCBkaWRuJ3QgYmVjb21lIGZyZWUgd2hpbGUKLQkgKiB3ZSB3ZXJlbid0IGxvb2tpbmcuCi0JICovCi0JaGVhZCA9IFJFQURfT05DRShsb2NrLT50aWNrZXRzLmhlYWQpOwotCWlmIChfX3RpY2tldHNfZXF1YWwoaGVhZCwgd2FudCkpIHsKLQkJYWRkX3N0YXRzKFRBS0VOX1NMT1dfUElDS1VQLCAxKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyoKLQkgKiBoYWx0IHVudGlsIGl0J3Mgb3VyIHR1cm4gYW5kIGtpY2tlZC4gTm90ZSB0aGF0IHdlIGRvIHNhZmUgaGFsdAotCSAqIGZvciBpcnEgZW5hYmxlZCBjYXNlIHRvIGF2b2lkIGhhbmcgd2hlbiBsb2NrIGluZm8gaXMgb3ZlcndyaXR0ZW4KLQkgKiBpbiBpcnEgc3BpbmxvY2sgc2xvd3BhdGggYW5kIG5vIHNwdXJpb3VzIGludGVycnVwdCBvY2N1ciB0byBzYXZlIHVzLgotCSAqLwotCWlmIChhcmNoX2lycXNfZGlzYWJsZWRfZmxhZ3MoZmxhZ3MpKQotCQloYWx0KCk7Ci0JZWxzZQotCQlzYWZlX2hhbHQoKTsKLQotb3V0OgotCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgJndhaXRpbmdfY3B1cyk7Ci0Jdy0+bG9jayA9IE5VTEw7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXNwaW5fdGltZV9hY2N1bV9ibG9ja2VkKHN0YXJ0KTsKLX0KLVBWX0NBTExFRV9TQVZFX1JFR1NfVEhVTksoa3ZtX2xvY2tfc3Bpbm5pbmcpOwotCi0vKiBLaWNrIHZjcHUgd2FpdGluZyBvbiBAbG9jay0+aGVhZCB0byByZWFjaCB2YWx1ZSBAdGlja2V0ICovCi1zdGF0aWMgdm9pZCBrdm1fdW5sb2NrX2tpY2soc3RydWN0IGFyY2hfc3BpbmxvY2sgKmxvY2ssIF9fdGlja2V0X3QgdGlja2V0KQotewotCWludCBjcHU7Ci0KLQlhZGRfc3RhdHMoUkVMRUFTRURfU0xPVywgMSk7Ci0JZm9yX2VhY2hfY3B1KGNwdSwgJndhaXRpbmdfY3B1cykgewotCQljb25zdCBzdHJ1Y3Qga3ZtX2xvY2tfd2FpdGluZyAqdyA9ICZwZXJfY3B1KGtsb2NrX3dhaXRpbmcsIGNwdSk7Ci0JCWlmIChSRUFEX09OQ0Uody0+bG9jaykgPT0gbG9jayAmJgotCQkgICAgUkVBRF9PTkNFKHctPndhbnQpID09IHRpY2tldCkgewotCQkJYWRkX3N0YXRzKFJFTEVBU0VEX1NMT1dfS0lDS0VELCAxKTsKLQkJCWt2bV9raWNrX2NwdShjcHUpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLSNlbmRpZiAvKiAhQ09ORklHX1FVRVVFRF9TUElOTE9DS1MgKi8KLQogLyoKICAqIFNldHVwIHB2X2xvY2tfb3BzIHRvIGV4cGxvaXQgS1ZNX0ZFQVRVUkVfUFZfVU5IQUxUIGlmIHByZXNlbnQuCiAgKi8KQEAgLTg1NCwxNiArNjAzLDExIEBACiAJaWYgKCFrdm1fcGFyYV9oYXNfZmVhdHVyZShLVk1fRkVBVFVSRV9QVl9VTkhBTFQpKQogCQlyZXR1cm47CiAKLSNpZmRlZiBDT05GSUdfUVVFVUVEX1NQSU5MT0NLUwogCV9fcHZfaW5pdF9sb2NrX2hhc2goKTsKIAlwdl9sb2NrX29wcy5xdWV1ZWRfc3Bpbl9sb2NrX3Nsb3dwYXRoID0gX19wdl9xdWV1ZWRfc3Bpbl9sb2NrX3Nsb3dwYXRoOwogCXB2X2xvY2tfb3BzLnF1ZXVlZF9zcGluX3VubG9jayA9IFBWX0NBTExFRV9TQVZFKF9fcHZfcXVldWVkX3NwaW5fdW5sb2NrKTsKIAlwdl9sb2NrX29wcy53YWl0ID0ga3ZtX3dhaXQ7CiAJcHZfbG9ja19vcHMua2ljayA9IGt2bV9raWNrX2NwdTsKLSNlbHNlIC8qICFDT05GSUdfUVVFVUVEX1NQSU5MT0NLUyAqLwotCXB2X2xvY2tfb3BzLmxvY2tfc3Bpbm5pbmcgPSBQVl9DQUxMRUVfU0FWRShrdm1fbG9ja19zcGlubmluZyk7Ci0JcHZfbG9ja19vcHMudW5sb2NrX2tpY2sgPSBrdm1fdW5sb2NrX2tpY2s7Ci0jZW5kaWYKIH0KIAogc3RhdGljIF9faW5pdCBpbnQga3ZtX3NwaW5sb2NrX2luaXRfanVtcCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2t2bWNsb2NrLmMgYi9hcmNoL3g4Ni9rZXJuZWwva3ZtY2xvY2suYwppbmRleCAxZDM5YmZiLi42MGI5OTQ5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwva3ZtY2xvY2suYworKysgYi9hcmNoL3g4Ni9rZXJuZWwva3ZtY2xvY2suYwpAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgPGFzbS94ODZfaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9yZWJvb3QuaD4KIAotc3RhdGljIGludCBrdm1jbG9jayA9IDE7CitzdGF0aWMgaW50IGt2bWNsb2NrIF9fcm9fYWZ0ZXJfaW5pdCA9IDE7CiBzdGF0aWMgaW50IG1zcl9rdm1fc3lzdGVtX3RpbWUgPSBNU1JfS1ZNX1NZU1RFTV9USU1FOwogc3RhdGljIGludCBtc3Jfa3ZtX3dhbGxfY2xvY2sgPSBNU1JfS1ZNX1dBTExfQ0xPQ0s7CiBzdGF0aWMgY3ljbGVfdCBrdm1fc2NoZWRfY2xvY2tfb2Zmc2V0OwpAQCAtMjg5LDYgKzI4OSw3IEBACiAJcHV0X2NwdSgpOwogCiAJeDg2X3BsYXRmb3JtLmNhbGlicmF0ZV90c2MgPSBrdm1fZ2V0X3RzY19raHo7CisJeDg2X3BsYXRmb3JtLmNhbGlicmF0ZV9jcHUgPSBrdm1fZ2V0X3RzY19raHo7CiAJeDg2X3BsYXRmb3JtLmdldF93YWxsY2xvY2sgPSBrdm1fZ2V0X3dhbGxjbG9jazsKIAl4ODZfcGxhdGZvcm0uc2V0X3dhbGxjbG9jayA9IGt2bV9zZXRfd2FsbGNsb2NrOwogI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL21wcGFyc2UuYyBiL2FyY2gveDg2L2tlcm5lbC9tcHBhcnNlLmMKaW5kZXggMDY4YzRhOS4uMGY4ZDIwNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL21wcGFyc2UuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvbXBwYXJzZS5jCkBAIC00OTksNiArNDk5LDkgQEAKIHsKIAlzdHJ1Y3QgbXBmX2ludGVsICptcGYgPSBtcGZfZm91bmQ7CiAKKwlpZiAoIXNtcF9mb3VuZF9jb25maWcpCisJCXJldHVybjsKKwogCWlmICghbXBmKQogCQlyZXR1cm47CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wYXJhdmlydC1zcGlubG9ja3MuYyBiL2FyY2gveDg2L2tlcm5lbC9wYXJhdmlydC1zcGlubG9ja3MuYwppbmRleCAxOTM5YTAyLi4yYzU1YTAwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnQtc3BpbmxvY2tzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3BhcmF2aXJ0LXNwaW5sb2Nrcy5jCkBAIC04LDcgKzgsNiBAQAogCiAjaW5jbHVkZSA8YXNtL3BhcmF2aXJ0Lmg+CiAKLSNpZmRlZiBDT05GSUdfUVVFVUVEX1NQSU5MT0NLUwogX192aXNpYmxlIHZvaWQgX19uYXRpdmVfcXVldWVkX3NwaW5fdW5sb2NrKHN0cnVjdCBxc3BpbmxvY2sgKmxvY2spCiB7CiAJbmF0aXZlX3F1ZXVlZF9zcGluX3VubG9jayhsb2NrKTsKQEAgLTIxLDE5ICsyMCwxMyBAQAogCXJldHVybiBwdl9sb2NrX29wcy5xdWV1ZWRfc3Bpbl91bmxvY2suZnVuYyA9PQogCQlfX3Jhd19jYWxsZWVfc2F2ZV9fX25hdGl2ZV9xdWV1ZWRfc3Bpbl91bmxvY2s7CiB9Ci0jZW5kaWYKIAogc3RydWN0IHB2X2xvY2tfb3BzIHB2X2xvY2tfb3BzID0gewogI2lmZGVmIENPTkZJR19TTVAKLSNpZmRlZiBDT05GSUdfUVVFVUVEX1NQSU5MT0NLUwogCS5xdWV1ZWRfc3Bpbl9sb2NrX3Nsb3dwYXRoID0gbmF0aXZlX3F1ZXVlZF9zcGluX2xvY2tfc2xvd3BhdGgsCiAJLnF1ZXVlZF9zcGluX3VubG9jayA9IFBWX0NBTExFRV9TQVZFKF9fbmF0aXZlX3F1ZXVlZF9zcGluX3VubG9jayksCiAJLndhaXQgPSBwYXJhdmlydF9ub3AsCiAJLmtpY2sgPSBwYXJhdmlydF9ub3AsCi0jZWxzZSAvKiAhQ09ORklHX1FVRVVFRF9TUElOTE9DS1MgKi8KLQkubG9ja19zcGlubmluZyA9IF9fUFZfSVNfQ0FMTEVFX1NBVkUocGFyYXZpcnRfbm9wKSwKLQkudW5sb2NrX2tpY2sgPSBwYXJhdmlydF9ub3AsCi0jZW5kaWYgLyogIUNPTkZJR19RVUVVRURfU1BJTkxPQ0tTICovCiAjZW5kaWYgLyogU01QICovCiB9OwogRVhQT1JUX1NZTUJPTChwdl9sb2NrX29wcyk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnQuYyBiL2FyY2gveDg2L2tlcm5lbC9wYXJhdmlydC5jCmluZGV4IGFkNWJjOTUuLmJiZjNkNTkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wYXJhdmlydC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wYXJhdmlydC5jCkBAIC01NiwxMiArNTYsMTIgQEAKICAgICAgIi5wb3BzZWN0aW9uIik7CiAKIC8qIGlkZW50aXR5IGZ1bmN0aW9uLCB3aGljaCBjYW4gYmUgaW5saW5lZCAqLwotdTMyIF9wYXJhdmlydF9pZGVudF8zMih1MzIgeCkKK3UzMiBub3RyYWNlIF9wYXJhdmlydF9pZGVudF8zMih1MzIgeCkKIHsKIAlyZXR1cm4geDsKIH0KIAotdTY0IF9wYXJhdmlydF9pZGVudF82NCh1NjQgeCkKK3U2NCBub3RyYWNlIF9wYXJhdmlydF9pZGVudF82NCh1NjQgeCkKIHsKIAlyZXR1cm4geDsKIH0KQEAgLTMzMiw3ICszMzIsNiBAQAogCS5yZWFkX2NyMCA9IG5hdGl2ZV9yZWFkX2NyMCwKIAkud3JpdGVfY3IwID0gbmF0aXZlX3dyaXRlX2NyMCwKIAkucmVhZF9jcjQgPSBuYXRpdmVfcmVhZF9jcjQsCi0JLnJlYWRfY3I0X3NhZmUgPSBuYXRpdmVfcmVhZF9jcjRfc2FmZSwKIAkud3JpdGVfY3I0ID0gbmF0aXZlX3dyaXRlX2NyNCwKICNpZmRlZiBDT05GSUdfWDg2XzY0CiAJLnJlYWRfY3I4ID0gbmF0aXZlX3JlYWRfY3I4LApAQCAtMzg5LDcgKzM4OCw3IEBACiAjZGVmaW5lIFBURV9JREVOVAlfX1BWX0lTX0NBTExFRV9TQVZFKF9wYXJhdmlydF9pZGVudF82NCkKICNlbmRpZgogCi1zdHJ1Y3QgcHZfbW11X29wcyBwdl9tbXVfb3BzID0geworc3RydWN0IHB2X21tdV9vcHMgcHZfbW11X29wcyBfX3JvX2FmdGVyX2luaXQgPSB7CiAKIAkucmVhZF9jcjIgPSBuYXRpdmVfcmVhZF9jcjIsCiAJLndyaXRlX2NyMiA9IG5hdGl2ZV93cml0ZV9jcjIsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnRfcGF0Y2hfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9wYXJhdmlydF9wYXRjaF8zMi5jCmluZGV4IDE1OGRjMDYuLjkyMGM2YWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wYXJhdmlydF9wYXRjaF8zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wYXJhdmlydF9wYXRjaF8zMi5jCkBAIC0xMCw3ICsxMCw3IEBACiBERUZfTkFUSVZFKHB2X21tdV9vcHMsIHJlYWRfY3IzLCAibW92ICVjcjMsICVlYXgiKTsKIERFRl9OQVRJVkUocHZfY3B1X29wcywgY2x0cywgImNsdHMiKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX1BBUkFWSVJUX1NQSU5MT0NLUykgJiYgZGVmaW5lZChDT05GSUdfUVVFVUVEX1NQSU5MT0NLUykKKyNpZiBkZWZpbmVkKENPTkZJR19QQVJBVklSVF9TUElOTE9DS1MpCiBERUZfTkFUSVZFKHB2X2xvY2tfb3BzLCBxdWV1ZWRfc3Bpbl91bmxvY2ssICJtb3ZiICQwLCAoJWVheCkiKTsKICNlbmRpZgogCkBAIC00OSw3ICs0OSw3IEBACiAJCVBBVENIX1NJVEUocHZfbW11X29wcywgcmVhZF9jcjMpOwogCQlQQVRDSF9TSVRFKHB2X21tdV9vcHMsIHdyaXRlX2NyMyk7CiAJCVBBVENIX1NJVEUocHZfY3B1X29wcywgY2x0cyk7Ci0jaWYgZGVmaW5lZChDT05GSUdfUEFSQVZJUlRfU1BJTkxPQ0tTKSAmJiBkZWZpbmVkKENPTkZJR19RVUVVRURfU1BJTkxPQ0tTKQorI2lmIGRlZmluZWQoQ09ORklHX1BBUkFWSVJUX1NQSU5MT0NLUykKIAkJY2FzZSBQQVJBVklSVF9QQVRDSChwdl9sb2NrX29wcy5xdWV1ZWRfc3Bpbl91bmxvY2spOgogCQkJaWYgKHB2X2lzX25hdGl2ZV9zcGluX3VubG9jaygpKSB7CiAJCQkJc3RhcnQgPSBzdGFydF9wdl9sb2NrX29wc19xdWV1ZWRfc3Bpbl91bmxvY2s7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnRfcGF0Y2hfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9wYXJhdmlydF9wYXRjaF82NC5jCmluZGV4IGU3MDA4N2EuLmJiMzg0MGMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wYXJhdmlydF9wYXRjaF82NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wYXJhdmlydF9wYXRjaF82NC5jCkBAIC0xOSw3ICsxOSw3IEBACiBERUZfTkFUSVZFKCwgbW92MzIsICJtb3YgJWVkaSwgJWVheCIpOwogREVGX05BVElWRSgsIG1vdjY0LCAibW92ICVyZGksICVyYXgiKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX1BBUkFWSVJUX1NQSU5MT0NLUykgJiYgZGVmaW5lZChDT05GSUdfUVVFVUVEX1NQSU5MT0NLUykKKyNpZiBkZWZpbmVkKENPTkZJR19QQVJBVklSVF9TUElOTE9DS1MpCiBERUZfTkFUSVZFKHB2X2xvY2tfb3BzLCBxdWV1ZWRfc3Bpbl91bmxvY2ssICJtb3ZiICQwLCAoJXJkaSkiKTsKICNlbmRpZgogCkBAIC02MSw3ICs2MSw3IEBACiAJCVBBVENIX1NJVEUocHZfY3B1X29wcywgY2x0cyk7CiAJCVBBVENIX1NJVEUocHZfbW11X29wcywgZmx1c2hfdGxiX3NpbmdsZSk7CiAJCVBBVENIX1NJVEUocHZfY3B1X29wcywgd2JpbnZkKTsKLSNpZiBkZWZpbmVkKENPTkZJR19QQVJBVklSVF9TUElOTE9DS1MpICYmIGRlZmluZWQoQ09ORklHX1FVRVVFRF9TUElOTE9DS1MpCisjaWYgZGVmaW5lZChDT05GSUdfUEFSQVZJUlRfU1BJTkxPQ0tTKQogCQljYXNlIFBBUkFWSVJUX1BBVENIKHB2X2xvY2tfb3BzLnF1ZXVlZF9zcGluX3VubG9jayk6CiAJCQlpZiAocHZfaXNfbmF0aXZlX3NwaW5fdW5sb2NrKCkpIHsKIAkJCQlzdGFydCA9IHN0YXJ0X3B2X2xvY2tfb3BzX3F1ZXVlZF9zcGluX3VubG9jazsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDYyYzBiMGUuLjQwMDJiNDcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3MuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9tY2UuaD4KICNpbmNsdWRlIDxhc20vdm04Ni5oPgorI2luY2x1ZGUgPGFzbS9zd2l0Y2hfdG8uaD4KIAogLyoKICAqIHBlci1DUFUgVFNTIHNlZ21lbnRzLiBUaHJlYWRzIGFyZSBjb21wbGV0ZWx5ICdzb2Z0JyBvbiBMaW51eCwKQEAgLTUxMyw2ICs1MTQsMTcgQEAKIH0KIAogLyoKKyAqIFJldHVybiBzYXZlZCBQQyBvZiBhIGJsb2NrZWQgdGhyZWFkLgorICogV2hhdCBpcyB0aGlzIGdvb2QgZm9yPyBpdCB3aWxsIGJlIGFsd2F5cyB0aGUgc2NoZWR1bGVyIG9yIHJldF9mcm9tX2ZvcmsuCisgKi8KK3Vuc2lnbmVkIGxvbmcgdGhyZWFkX3NhdmVkX3BjKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCXN0cnVjdCBpbmFjdGl2ZV90YXNrX2ZyYW1lICpmcmFtZSA9CisJCShzdHJ1Y3QgaW5hY3RpdmVfdGFza19mcmFtZSAqKSBSRUFEX09OQ0UodHNrLT50aHJlYWQuc3ApOworCXJldHVybiBSRUFEX09OQ0VfTk9DSEVDSyhmcmFtZS0+cmV0X2FkZHIpOworfQorCisvKgogICogQ2FsbGVkIGZyb20gZnMvcHJvYyB3aXRoIGEgcmVmZXJlbmNlIG9uIEBwIHRvIGZpbmQgdGhlIGZ1bmN0aW9uCiAgKiB3aGljaCBjYWxsZWQgaW50byBzY2hlZHVsZSgpLiBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgY2FyZWZ1bGx5CiAgKiBiZWNhdXNlIHRoZSB0YXNrIG1pZ2h0IHdha2UgdXAgYW5kIHdlIG1pZ2h0IGxvb2sgYXQgYSBzdGFjawpAQCAtNTIwLDE1ICs1MzIsMTggQEAKICAqLwogdW5zaWduZWQgbG9uZyBnZXRfd2NoYW4oc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewotCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGJvdHRvbSwgdG9wLCBzcCwgZnAsIGlwOworCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGJvdHRvbSwgdG9wLCBzcCwgZnAsIGlwLCByZXQgPSAwOwogCWludCBjb3VudCA9IDA7CiAKIAlpZiAoIXAgfHwgcCA9PSBjdXJyZW50IHx8IHAtPnN0YXRlID09IFRBU0tfUlVOTklORykKIAkJcmV0dXJuIDA7CiAKKwlpZiAoIXRyeV9nZXRfdGFza19zdGFjayhwKSkKKwkJcmV0dXJuIDA7CisKIAlzdGFydCA9ICh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShwKTsKIAlpZiAoIXN0YXJ0KQotCQlyZXR1cm4gMDsKKwkJZ290byBvdXQ7CiAKIAkvKgogCSAqIExheW91dCBvZiB0aGUgc3RhY2sgcGFnZToKQEAgLTUzNyw5ICs1NTIsNyBAQAogCSAqIFBBRERJTkcKIAkgKiAtLS0tLS0tLS0tLSB0b3AgPSB0b3BtYXggLSBUT1BfT0ZfS0VSTkVMX1NUQUNLX1BBRERJTkcKIAkgKiBzdGFjawotCSAqIC0tLS0tLS0tLS0tIGJvdHRvbSA9IHN0YXJ0ICsgc2l6ZW9mKHRocmVhZF9pbmZvKQotCSAqIHRocmVhZF9pbmZvCi0JICogLS0tLS0tLS0tLS0gc3RhcnQKKwkgKiAtLS0tLS0tLS0tLSBib3R0b20gPSBzdGFydAogCSAqCiAJICogVGhlIHRhc2tzIHN0YWNrIHBvaW50ZXIgcG9pbnRzIGF0IHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUKIAkgKiBmcmFtZXBvaW50ZXIgaXMgc3RvcmVkLiBUaGUgZGF0YSBvbiB0aGUgc3RhY2sgaXM6CkBAIC01NTAsMjAgKzU2MywyNSBAQAogCSAqLwogCXRvcCA9IHN0YXJ0ICsgVEhSRUFEX1NJWkUgLSBUT1BfT0ZfS0VSTkVMX1NUQUNLX1BBRERJTkc7CiAJdG9wIC09IDIgKiBzaXplb2YodW5zaWduZWQgbG9uZyk7Ci0JYm90dG9tID0gc3RhcnQgKyBzaXplb2Yoc3RydWN0IHRocmVhZF9pbmZvKTsKKwlib3R0b20gPSBzdGFydDsKIAogCXNwID0gUkVBRF9PTkNFKHAtPnRocmVhZC5zcCk7CiAJaWYgKHNwIDwgYm90dG9tIHx8IHNwID4gdG9wKQotCQlyZXR1cm4gMDsKKwkJZ290byBvdXQ7CiAKLQlmcCA9IFJFQURfT05DRV9OT0NIRUNLKCoodW5zaWduZWQgbG9uZyAqKXNwKTsKKwlmcCA9IFJFQURfT05DRV9OT0NIRUNLKCgoc3RydWN0IGluYWN0aXZlX3Rhc2tfZnJhbWUgKilzcCktPmJwKTsKIAlkbyB7CiAJCWlmIChmcCA8IGJvdHRvbSB8fCBmcCA+IHRvcCkKLQkJCXJldHVybiAwOworCQkJZ290byBvdXQ7CiAJCWlwID0gUkVBRF9PTkNFX05PQ0hFQ0soKih1bnNpZ25lZCBsb25nICopKGZwICsgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSk7Ci0JCWlmICghaW5fc2NoZWRfZnVuY3Rpb25zKGlwKSkKLQkJCXJldHVybiBpcDsKKwkJaWYgKCFpbl9zY2hlZF9mdW5jdGlvbnMoaXApKSB7CisJCQlyZXQgPSBpcDsKKwkJCWdvdG8gb3V0OworCQl9CiAJCWZwID0gUkVBRF9PTkNFX05PQ0hFQ0soKih1bnNpZ25lZCBsb25nICopZnApOwogCX0gd2hpbGUgKGNvdW50KysgPCAxNiAmJiBwLT5zdGF0ZSAhPSBUQVNLX1JVTk5JTkcpOwotCXJldHVybiAwOworCitvdXQ6CisJcHV0X3Rhc2tfc3RhY2socCk7CisJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jCmluZGV4IGQ4NmJlMjkuLmJkN2JlOGUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYwpAQCAtNTUsMTcgKzU1LDYgQEAKICNpbmNsdWRlIDxhc20vc3dpdGNoX3RvLmg+CiAjaW5jbHVkZSA8YXNtL3ZtODYuaD4KIAotYXNtbGlua2FnZSB2b2lkIHJldF9mcm9tX2Zvcmsodm9pZCkgX19hc21fXygicmV0X2Zyb21fZm9yayIpOwotYXNtbGlua2FnZSB2b2lkIHJldF9mcm9tX2tlcm5lbF90aHJlYWQodm9pZCkgX19hc21fXygicmV0X2Zyb21fa2VybmVsX3RocmVhZCIpOwotCi0vKgotICogUmV0dXJuIHNhdmVkIFBDIG9mIGEgYmxvY2tlZCB0aHJlYWQuCi0gKi8KLXVuc2lnbmVkIGxvbmcgdGhyZWFkX3NhdmVkX3BjKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQotewotCXJldHVybiAoKHVuc2lnbmVkIGxvbmcgKil0c2stPnRocmVhZC5zcClbM107Ci19Ci0KIHZvaWQgX19zaG93X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBhbGwpCiB7CiAJdW5zaWduZWQgbG9uZyBjcjAgPSAwTCwgY3IyID0gMEwsIGNyMyA9IDBMLCBjcjQgPSAwTDsKQEAgLTEwMSw3ICs5MCw3IEBACiAJY3IwID0gcmVhZF9jcjAoKTsKIAljcjIgPSByZWFkX2NyMigpOwogCWNyMyA9IHJlYWRfY3IzKCk7Ci0JY3I0ID0gX19yZWFkX2NyNF9zYWZlKCk7CisJY3I0ID0gX19yZWFkX2NyNCgpOwogCXByaW50ayhLRVJOX0RFRkFVTFQgIkNSMDogJTA4bHggQ1IyOiAlMDhseCBDUjM6ICUwOGx4IENSNDogJTA4bHhcbiIsCiAJCQljcjAsIGNyMiwgY3IzLCBjcjQpOwogCkBAIC0xMzMsMzUgKzEyMiwzMSBAQAogCXVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHVuc2lnbmVkIGxvbmcgdGxzKQogewogCXN0cnVjdCBwdF9yZWdzICpjaGlsZHJlZ3MgPSB0YXNrX3B0X3JlZ3MocCk7CisJc3RydWN0IGZvcmtfZnJhbWUgKmZvcmtfZnJhbWUgPSBjb250YWluZXJfb2YoY2hpbGRyZWdzLCBzdHJ1Y3QgZm9ya19mcmFtZSwgcmVncyk7CisJc3RydWN0IGluYWN0aXZlX3Rhc2tfZnJhbWUgKmZyYW1lID0gJmZvcmtfZnJhbWUtPmZyYW1lOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwogCWludCBlcnI7CiAKLQlwLT50aHJlYWQuc3AgPSAodW5zaWduZWQgbG9uZykgY2hpbGRyZWdzOworCWZyYW1lLT5icCA9IDA7CisJZnJhbWUtPnJldF9hZGRyID0gKHVuc2lnbmVkIGxvbmcpIHJldF9mcm9tX2Zvcms7CisJcC0+dGhyZWFkLnNwID0gKHVuc2lnbmVkIGxvbmcpIGZvcmtfZnJhbWU7CiAJcC0+dGhyZWFkLnNwMCA9ICh1bnNpZ25lZCBsb25nKSAoY2hpbGRyZWdzKzEpOwogCW1lbXNldChwLT50aHJlYWQucHRyYWNlX2JwcywgMCwgc2l6ZW9mKHAtPnRocmVhZC5wdHJhY2VfYnBzKSk7CiAKIAlpZiAodW5saWtlbHkocC0+ZmxhZ3MgJiBQRl9LVEhSRUFEKSkgewogCQkvKiBrZXJuZWwgdGhyZWFkICovCiAJCW1lbXNldChjaGlsZHJlZ3MsIDAsIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOwotCQlwLT50aHJlYWQuaXAgPSAodW5zaWduZWQgbG9uZykgcmV0X2Zyb21fa2VybmVsX3RocmVhZDsKLQkJdGFza191c2VyX2dzKHApID0gX19LRVJORUxfU1RBQ0tfQ0FOQVJZOwotCQljaGlsZHJlZ3MtPmRzID0gX19VU0VSX0RTOwotCQljaGlsZHJlZ3MtPmVzID0gX19VU0VSX0RTOwotCQljaGlsZHJlZ3MtPmZzID0gX19LRVJORUxfUEVSQ1BVOwotCQljaGlsZHJlZ3MtPmJ4ID0gc3A7CS8qIGZ1bmN0aW9uICovCi0JCWNoaWxkcmVncy0+YnAgPSBhcmc7Ci0JCWNoaWxkcmVncy0+b3JpZ19heCA9IC0xOwotCQljaGlsZHJlZ3MtPmNzID0gX19LRVJORUxfQ1MgfCBnZXRfa2VybmVsX3JwbCgpOwotCQljaGlsZHJlZ3MtPmZsYWdzID0gWDg2X0VGTEFHU19JRiB8IFg4Nl9FRkxBR1NfRklYRUQ7CisJCWZyYW1lLT5ieCA9IHNwOwkJLyogZnVuY3Rpb24gKi8KKwkJZnJhbWUtPmRpID0gYXJnOwogCQlwLT50aHJlYWQuaW9fYml0bWFwX3B0ciA9IE5VTEw7CiAJCXJldHVybiAwOwogCX0KKwlmcmFtZS0+YnggPSAwOwogCSpjaGlsZHJlZ3MgPSAqY3VycmVudF9wdF9yZWdzKCk7CiAJY2hpbGRyZWdzLT5heCA9IDA7CiAJaWYgKHNwKQogCQljaGlsZHJlZ3MtPnNwID0gc3A7CiAKLQlwLT50aHJlYWQuaXAgPSAodW5zaWduZWQgbG9uZykgcmV0X2Zyb21fZm9yazsKIAl0YXNrX3VzZXJfZ3MocCkgPSBnZXRfdXNlcl9ncyhjdXJyZW50X3B0X3JlZ3MoKSk7CiAKIAlwLT50aHJlYWQuaW9fYml0bWFwX3B0ciA9IE5VTEw7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYwppbmRleCA2MzIzNmQ4Li5lZTk0NGJkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMKQEAgLTQ5LDggKzQ5LDcgQEAKICNpbmNsdWRlIDxhc20vZGVidWdyZWcuaD4KICNpbmNsdWRlIDxhc20vc3dpdGNoX3RvLmg+CiAjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcnZpc29yLmg+Ci0KLWFzbWxpbmthZ2UgZXh0ZXJuIHZvaWQgcmV0X2Zyb21fZm9yayh2b2lkKTsKKyNpbmNsdWRlIDxhc20vdmRzby5oPgogCiBfX3Zpc2libGUgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgcnNwX3NjcmF0Y2gpOwogCkBAIC0xNDEsMTIgKzE0MCwxNyBAQAogewogCWludCBlcnI7CiAJc3RydWN0IHB0X3JlZ3MgKmNoaWxkcmVnczsKKwlzdHJ1Y3QgZm9ya19mcmFtZSAqZm9ya19mcmFtZTsKKwlzdHJ1Y3QgaW5hY3RpdmVfdGFza19mcmFtZSAqZnJhbWU7CiAJc3RydWN0IHRhc2tfc3RydWN0ICptZSA9IGN1cnJlbnQ7CiAKIAlwLT50aHJlYWQuc3AwID0gKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKHApICsgVEhSRUFEX1NJWkU7CiAJY2hpbGRyZWdzID0gdGFza19wdF9yZWdzKHApOwotCXAtPnRocmVhZC5zcCA9ICh1bnNpZ25lZCBsb25nKSBjaGlsZHJlZ3M7Ci0Jc2V0X3Rza190aHJlYWRfZmxhZyhwLCBUSUZfRk9SSyk7CisJZm9ya19mcmFtZSA9IGNvbnRhaW5lcl9vZihjaGlsZHJlZ3MsIHN0cnVjdCBmb3JrX2ZyYW1lLCByZWdzKTsKKwlmcmFtZSA9ICZmb3JrX2ZyYW1lLT5mcmFtZTsKKwlmcmFtZS0+YnAgPSAwOworCWZyYW1lLT5yZXRfYWRkciA9ICh1bnNpZ25lZCBsb25nKSByZXRfZnJvbV9mb3JrOworCXAtPnRocmVhZC5zcCA9ICh1bnNpZ25lZCBsb25nKSBmb3JrX2ZyYW1lOwogCXAtPnRocmVhZC5pb19iaXRtYXBfcHRyID0gTlVMTDsKIAogCXNhdmVzZWdtZW50KGdzLCBwLT50aHJlYWQuZ3NpbmRleCk7CkBAIC0xNjAsMTUgKzE2NCwxMSBAQAogCWlmICh1bmxpa2VseShwLT5mbGFncyAmIFBGX0tUSFJFQUQpKSB7CiAJCS8qIGtlcm5lbCB0aHJlYWQgKi8KIAkJbWVtc2V0KGNoaWxkcmVncywgMCwgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7Ci0JCWNoaWxkcmVncy0+c3AgPSAodW5zaWduZWQgbG9uZyljaGlsZHJlZ3M7Ci0JCWNoaWxkcmVncy0+c3MgPSBfX0tFUk5FTF9EUzsKLQkJY2hpbGRyZWdzLT5ieCA9IHNwOyAvKiBmdW5jdGlvbiAqLwotCQljaGlsZHJlZ3MtPmJwID0gYXJnOwotCQljaGlsZHJlZ3MtPm9yaWdfYXggPSAtMTsKLQkJY2hpbGRyZWdzLT5jcyA9IF9fS0VSTkVMX0NTIHwgZ2V0X2tlcm5lbF9ycGwoKTsKLQkJY2hpbGRyZWdzLT5mbGFncyA9IFg4Nl9FRkxBR1NfSUYgfCBYODZfRUZMQUdTX0ZJWEVEOworCQlmcmFtZS0+YnggPSBzcDsJCS8qIGZ1bmN0aW9uICovCisJCWZyYW1lLT5yMTIgPSBhcmc7CiAJCXJldHVybiAwOwogCX0KKwlmcmFtZS0+YnggPSAwOwogCSpjaGlsZHJlZ3MgPSAqY3VycmVudF9wdF9yZWdzKCk7CiAKIAljaGlsZHJlZ3MtPmF4ID0gMDsKQEAgLTUxMSw3ICs1MTEsNyBAQAogCQljdXJyZW50LT5wZXJzb25hbGl0eSAmPSB+UkVBRF9JTVBMSUVTX0VYRUM7CiAJCS8qIGluX2NvbXBhdF9zeXNjYWxsKCkgdXNlcyB0aGUgcHJlc2VuY2Ugb2YgdGhlIHgzMgogCQkgICBzeXNjYWxsIGJpdCBmbGFnIHRvIGRldGVybWluZSBjb21wYXQgc3RhdHVzICovCi0JCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3RhdHVzICY9IH5UU19DT01QQVQ7CisJCWN1cnJlbnQtPnRocmVhZC5zdGF0dXMgJj0gflRTX0NPTVBBVDsKIAl9IGVsc2UgewogCQlzZXRfdGhyZWFkX2ZsYWcoVElGX0lBMzIpOwogCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfWDMyKTsKQEAgLTUxOSwxMSArNTE5LDI0IEBACiAJCQljdXJyZW50LT5tbS0+Y29udGV4dC5pYTMyX2NvbXBhdCA9IFRJRl9JQTMyOwogCQljdXJyZW50LT5wZXJzb25hbGl0eSB8PSBmb3JjZV9wZXJzb25hbGl0eTMyOwogCQkvKiBQcmVwYXJlIHRoZSBmaXJzdCAicmV0dXJuIiB0byB1c2VyIHNwYWNlICovCi0JCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3RhdHVzIHw9IFRTX0NPTVBBVDsKKwkJY3VycmVudC0+dGhyZWFkLnN0YXR1cyB8PSBUU19DT01QQVQ7CiAJfQogfQogRVhQT1JUX1NZTUJPTF9HUEwoc2V0X3BlcnNvbmFsaXR5X2lhMzIpOwogCisjaWZkZWYgQ09ORklHX0NIRUNLUE9JTlRfUkVTVE9SRQorc3RhdGljIGxvbmcgcHJjdGxfbWFwX3Zkc28oY29uc3Qgc3RydWN0IHZkc29faW1hZ2UgKmltYWdlLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJaW50IHJldDsKKworCXJldCA9IG1hcF92ZHNvX29uY2UoaW1hZ2UsIGFkZHIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gKGxvbmcpaW1hZ2UtPnNpemU7Cit9CisjZW5kaWYKKwogbG9uZyBkb19hcmNoX3ByY3RsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IGNvZGUsIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlpbnQgcmV0ID0gMDsKQEAgLTU3Nyw2ICs1OTAsMTkgQEAKIAkJYnJlYWs7CiAJfQogCisjaWZkZWYgQ09ORklHX0NIRUNLUE9JTlRfUkVTVE9SRQorIyBpZmRlZiBDT05GSUdfWDg2X1gzMl9BQkkKKwljYXNlIEFSQ0hfTUFQX1ZEU09fWDMyOgorCQlyZXR1cm4gcHJjdGxfbWFwX3Zkc28oJnZkc29faW1hZ2VfeDMyLCBhZGRyKTsKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZCBDT05GSUdfWDg2XzMyIHx8IGRlZmluZWQgQ09ORklHX0lBMzJfRU1VTEFUSU9OCisJY2FzZSBBUkNIX01BUF9WRFNPXzMyOgorCQlyZXR1cm4gcHJjdGxfbWFwX3Zkc28oJnZkc29faW1hZ2VfMzIsIGFkZHIpOworIyBlbmRpZgorCWNhc2UgQVJDSF9NQVBfVkRTT182NDoKKwkJcmV0dXJuIHByY3RsX21hcF92ZHNvKCZ2ZHNvX2ltYWdlXzY0LCBhZGRyKTsKKyNlbmRpZgorCiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVJTlZBTDsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHRyYWNlLmMKaW5kZXggZjc5NTc2YS4uMGU2M2MwMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wdHJhY2UuYwpAQCAtMTczLDggKzE3Myw4IEBACiAJCXJldHVybiBzcDsKIAogCXByZXZfZXNwID0gKHUzMiAqKShjb250ZXh0KTsKLQlpZiAocHJldl9lc3ApCi0JCXJldHVybiAodW5zaWduZWQgbG9uZylwcmV2X2VzcDsKKwlpZiAoKnByZXZfZXNwKQorCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpKnByZXZfZXNwOwogCiAJcmV0dXJuICh1bnNpZ25lZCBsb25nKXJlZ3M7CiB9CkBAIC05MzQsNyArOTM0LDcgQEAKIAkJICovCiAJCXJlZ3MtPm9yaWdfYXggPSB2YWx1ZTsKIAkJaWYgKHN5c2NhbGxfZ2V0X25yKGNoaWxkLCByZWdzKSA+PSAwKQotCQkJdGFza190aHJlYWRfaW5mbyhjaGlsZCktPnN0YXR1cyB8PSBUU19JMzg2X1JFR1NfUE9LRUQ7CisJCQljaGlsZC0+dGhyZWFkLnN0YXR1cyB8PSBUU19JMzg2X1JFR1NfUE9LRUQ7CiAJCWJyZWFrOwogCiAJY2FzZSBvZmZzZXRvZihzdHJ1Y3QgdXNlcjMyLCByZWdzLmVmbGFncyk6CkBAIC0xMjUwLDcgKzEyNTAsNyBAQAogCiAjaWZkZWYgQ09ORklHX1g4Nl82NAogCi1zdGF0aWMgc3RydWN0IHVzZXJfcmVnc2V0IHg4Nl82NF9yZWdzZXRzW10gX19yZWFkX21vc3RseSA9IHsKK3N0YXRpYyBzdHJ1Y3QgdXNlcl9yZWdzZXQgeDg2XzY0X3JlZ3NldHNbXSBfX3JvX2FmdGVyX2luaXQgPSB7CiAJW1JFR1NFVF9HRU5FUkFMXSA9IHsKIAkJLmNvcmVfbm90ZV90eXBlID0gTlRfUFJTVEFUVVMsCiAJCS5uID0gc2l6ZW9mKHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0KSAvIHNpemVvZihsb25nKSwKQEAgLTEyOTEsNyArMTI5MSw3IEBACiAjZW5kaWYJLyogQ09ORklHX1g4Nl82NCAqLwogCiAjaWYgZGVmaW5lZCBDT05GSUdfWDg2XzMyIHx8IGRlZmluZWQgQ09ORklHX0lBMzJfRU1VTEFUSU9OCi1zdGF0aWMgc3RydWN0IHVzZXJfcmVnc2V0IHg4Nl8zMl9yZWdzZXRzW10gX19yZWFkX21vc3RseSA9IHsKK3N0YXRpYyBzdHJ1Y3QgdXNlcl9yZWdzZXQgeDg2XzMyX3JlZ3NldHNbXSBfX3JvX2FmdGVyX2luaXQgPSB7CiAJW1JFR1NFVF9HRU5FUkFMXSA9IHsKIAkJLmNvcmVfbm90ZV90eXBlID0gTlRfUFJTVEFUVVMsCiAJCS5uID0gc2l6ZW9mKHN0cnVjdCB1c2VyX3JlZ3Nfc3RydWN0MzIpIC8gc2l6ZW9mKHUzMiksCkBAIC0xMzQ0LDcgKzEzNDQsNyBAQAogICovCiB1NjQgeHN0YXRlX2Z4X3N3X2J5dGVzW1VTRVJfWFNUQVRFX0ZYX1NXX1dPUkRTXTsKIAotdm9pZCB1cGRhdGVfcmVnc2V0X3hzdGF0ZV9pbmZvKHVuc2lnbmVkIGludCBzaXplLCB1NjQgeHN0YXRlX21hc2spCit2b2lkIF9faW5pdCB1cGRhdGVfcmVnc2V0X3hzdGF0ZV9pbmZvKHVuc2lnbmVkIGludCBzaXplLCB1NjQgeHN0YXRlX21hc2spCiB7CiAjaWZkZWYgQ09ORklHX1g4Nl82NAogCXg4Nl82NF9yZWdzZXRzW1JFR1NFVF9YU1RBVEVdLm4gPSBzaXplIC8gc2l6ZW9mKHU2NCk7CkBAIC0xMzU4LDcgKzEzNTgsNyBAQAogY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0X3ZpZXcgKnRhc2tfdXNlcl9yZWdzZXRfdmlldyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7CiAjaWZkZWYgQ09ORklHX0lBMzJfRU1VTEFUSU9OCi0JaWYgKHRlc3RfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl9JQTMyKSkKKwlpZiAoIXVzZXJfNjRiaXRfbW9kZSh0YXNrX3B0X3JlZ3ModGFzaykpKQogI2VuZGlmCiAjaWYgZGVmaW5lZCBDT05GSUdfWDg2XzMyIHx8IGRlZmluZWQgQ09ORklHX0lBMzJfRU1VTEFUSU9OCiAJCXJldHVybiAmdXNlcl94ODZfMzJfdmlldzsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wdmNsb2NrLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHZjbG9jay5jCmluZGV4IDM1OTk0MDQuLjViMmNjODggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wdmNsb2NrLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3B2Y2xvY2suYwpAQCAtODAsNyArODAsNyBAQAogCiAJZG8gewogCQl2ZXJzaW9uID0gcHZjbG9ja19yZWFkX2JlZ2luKHNyYyk7Ci0JCXJldCA9IF9fcHZjbG9ja19yZWFkX2N5Y2xlcyhzcmMpOworCQlyZXQgPSBfX3B2Y2xvY2tfcmVhZF9jeWNsZXMoc3JjLCByZHRzY19vcmRlcmVkKCkpOwogCQlmbGFncyA9IHNyYy0+ZmxhZ3M7CiAJfSB3aGlsZSAocHZjbG9ja19yZWFkX3JldHJ5KHNyYywgdmVyc2lvbikpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcXVpcmtzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcXVpcmtzLmMKaW5kZXggY2M0NTdmZi4uNTE0MDJhNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3F1aXJrcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9xdWlya3MuYwpAQCAtNjI2LDMgKzYyNiwzNCBAQAogCQkJYW1kX2Rpc2FibGVfc2VxX2FuZF9yZWRpcmVjdF9zY3J1Yik7CiAKICNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KSAmJiBkZWZpbmVkKENPTkZJR19YODZfTUNFKQorI2luY2x1ZGUgPGxpbnV4L2p1bXBfbGFiZWwuaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nXzY0Lmg+CisKKy8qIEl2eSBCcmlkZ2UsIEhhc3dlbGwsIEJyb2Fkd2VsbCAqLworc3RhdGljIHZvaWQgcXVpcmtfaW50ZWxfYnJpY2tsYW5kX3hlb25fcmFzX2NhcChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1MzIgY2FwaWQwOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4ODQsICZjYXBpZDApOworCisJaWYgKGNhcGlkMCAmIDB4MTApCisJCXN0YXRpY19icmFuY2hfaW5jKCZtY3NhZmVfa2V5KTsKK30KKworLyogU2t5bGFrZSAqLworc3RhdGljIHZvaWQgcXVpcmtfaW50ZWxfcHVybGV5X3hlb25fcmFzX2NhcChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwl1MzIgY2FwaWQwOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4ODQsICZjYXBpZDApOworCisJaWYgKChjYXBpZDAgJiAweGMwKSA9PSAweGMwKQorCQlzdGF0aWNfYnJhbmNoX2luYygmbWNzYWZlX2tleSk7Cit9CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDBlYzMsIHF1aXJrX2ludGVsX2JyaWNrbGFuZF94ZW9uX3Jhc19jYXApOworREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyZmMwLCBxdWlya19pbnRlbF9icmlja2xhbmRfeGVvbl9yYXNfY2FwKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4NmZjMCwgcXVpcmtfaW50ZWxfYnJpY2tsYW5kX3hlb25fcmFzX2NhcCk7CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwODMsIHF1aXJrX2ludGVsX3B1cmxleV94ZW9uX3Jhc19jYXApOworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMKaW5kZXggNjNiZjI3ZC4uZTI0NGMxOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3JlYm9vdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYwpAQCAtNzA1LDcgKzcwNSw3IEBACiAJdGJvb3Rfc2h1dGRvd24oVEJfU0hVVERPV05fSEFMVCk7CiB9CiAKLXN0cnVjdCBtYWNoaW5lX29wcyBtYWNoaW5lX29wcyA9IHsKK3N0cnVjdCBtYWNoaW5lX29wcyBtYWNoaW5lX29wcyBfX3JvX2FmdGVyX2luaXQgPSB7CiAJLnBvd2VyX29mZiA9IG5hdGl2ZV9tYWNoaW5lX3Bvd2VyX29mZiwKIAkuc2h1dGRvd24gPSBuYXRpdmVfbWFjaGluZV9zaHV0ZG93biwKIAkuZW1lcmdlbmN5X3Jlc3RhcnQgPSBuYXRpdmVfbWFjaGluZV9lbWVyZ2VuY3lfcmVzdGFydCwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9yZXNvdXJjZS5jIGIvYXJjaC94ODYva2VybmVsL3Jlc291cmNlLmMKaW5kZXggODBlYWIwMS4uMjQwOGMxNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3Jlc291cmNlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Jlc291cmNlLmMKQEAgLTI3LDggKzI3LDggQEAKIAlpbnQgaTsKIAlzdHJ1Y3QgZTgyMGVudHJ5ICplbnRyeTsKIAotCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7Ci0JCWVudHJ5ID0gJmU4MjAubWFwW2ldOworCWZvciAoaSA9IDA7IGkgPCBlODIwLT5ucl9tYXA7IGkrKykgeworCQllbnRyeSA9ICZlODIwLT5tYXBbaV07CiAKIAkJcmVzb3VyY2VfY2xpcChhdmFpbCwgZW50cnktPmFkZHIsCiAJCQkgICAgICBlbnRyeS0+YWRkciArIGVudHJ5LT5zaXplIC0gMSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc2V0dXAuYyBiL2FyY2gveDg2L2tlcm5lbC9zZXR1cC5jCmluZGV4IDBmYTYwZjUuLmJiZmJjYTUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zZXR1cC5jCkBAIC0yMTAsOSArMjEwLDkgQEAKIAogCiAjaWYgIWRlZmluZWQoQ09ORklHX1g4Nl9QQUUpIHx8IGRlZmluZWQoQ09ORklHX1g4Nl82NCkKLV9fdmlzaWJsZSB1bnNpZ25lZCBsb25nIG1tdV9jcjRfZmVhdHVyZXM7CitfX3Zpc2libGUgdW5zaWduZWQgbG9uZyBtbXVfY3I0X2ZlYXR1cmVzIF9fcm9fYWZ0ZXJfaW5pdDsKICNlbHNlCi1fX3Zpc2libGUgdW5zaWduZWQgbG9uZyBtbXVfY3I0X2ZlYXR1cmVzID0gWDg2X0NSNF9QQUU7CitfX3Zpc2libGUgdW5zaWduZWQgbG9uZyBtbXVfY3I0X2ZlYXR1cmVzIF9fcm9fYWZ0ZXJfaW5pdCA9IFg4Nl9DUjRfUEFFOwogI2VuZGlmCiAKIC8qIEJvb3QgbG9hZGVyIElEIGFuZCB2ZXJzaW9uIGFzIGludGVnZXJzLCBmb3IgdGhlIGJlbmVmaXQgb2YgcHJvY19kb2ludHZlYyAqLwpAQCAtNDU4LDggKzQ1OCw4IEBACiAJCWVhcmx5X21lbXVubWFwKGRhdGEsIHNpemVvZigqZGF0YSkpOwogCX0KIAotCXNhbml0aXplX2U4MjBfbWFwKGU4MjAubWFwLCBBUlJBWV9TSVpFKGU4MjAubWFwKSwgJmU4MjAubnJfbWFwKTsKLQltZW1jcHkoJmU4MjBfc2F2ZWQsICZlODIwLCBzaXplb2Yoc3RydWN0IGU4MjBtYXApKTsKKwlzYW5pdGl6ZV9lODIwX21hcChlODIwLT5tYXAsIEFSUkFZX1NJWkUoZTgyMC0+bWFwKSwgJmU4MjAtPm5yX21hcCk7CisJbWVtY3B5KGU4MjBfc2F2ZWQsIGU4MjAsIHNpemVvZihzdHJ1Y3QgZTgyMG1hcCkpOwogCXByaW50ayhLRVJOX0lORk8gImV4dGVuZGVkIHBoeXNpY2FsIFJBTSBtYXA6XG4iKTsKIAllODIwX3ByaW50X21hcCgicmVzZXJ2ZSBzZXR1cF9kYXRhIik7CiB9CkBAIC03NjMsNyArNzYzLDcgQEAKIAkgKi8KIAllODIwX3JlbW92ZV9yYW5nZShCSU9TX0JFR0lOLCBCSU9TX0VORCAtIEJJT1NfQkVHSU4sIEU4MjBfUkFNLCAxKTsKIAotCXNhbml0aXplX2U4MjBfbWFwKGU4MjAubWFwLCBBUlJBWV9TSVpFKGU4MjAubWFwKSwgJmU4MjAubnJfbWFwKTsKKwlzYW5pdGl6ZV9lODIwX21hcChlODIwLT5tYXAsIEFSUkFZX1NJWkUoZTgyMC0+bWFwKSwgJmU4MjAtPm5yX21hcCk7CiB9CiAKIC8qIGNhbGxlZCBiZWZvcmUgdHJpbV9iaW9zX3JhbmdlKCkgdG8gc3BhcmUgZXh0cmEgc2FuaXRpemUgKi8KQEAgLTEwMzIsNyArMTAzMiw3IEBACiAJaWYgKHBwcm9fd2l0aF9yYW1fYnVnKCkpIHsKIAkJZTgyMF91cGRhdGVfcmFuZ2UoMHg3MDAwMDAwMFVMTCwgMHg0MDAwMFVMTCwgRTgyMF9SQU0sCiAJCQkJICBFODIwX1JFU0VSVkVEKTsKLQkJc2FuaXRpemVfZTgyMF9tYXAoZTgyMC5tYXAsIEFSUkFZX1NJWkUoZTgyMC5tYXApLCAmZTgyMC5ucl9tYXApOworCQlzYW5pdGl6ZV9lODIwX21hcChlODIwLT5tYXAsIEFSUkFZX1NJWkUoZTgyMC0+bWFwKSwgJmU4MjAtPm5yX21hcCk7CiAJCXByaW50ayhLRVJOX0lORk8gImZpeGVkIHBoeXNpY2FsIFJBTSBtYXA6XG4iKTsKIAkJZTgyMF9wcmludF9tYXAoImJhZF9wcHJvIik7CiAJfQpAQCAtMTA5NiwxOSArMTA5NiwxOSBAQAogCW1lbWJsb2NrX3NldF9jdXJyZW50X2xpbWl0KElTQV9FTkRfQUREUkVTUyk7CiAJbWVtYmxvY2tfeDg2X2ZpbGwoKTsKIAotCWlmIChlZmlfZW5hYmxlZChFRklfQk9PVCkpIHsKLQkJZWZpX2Zha2VfbWVtbWFwKCk7Ci0JCWVmaV9maW5kX21pcnJvcigpOwotCX0KLQogCXJlc2VydmVfYmlvc19yZWdpb25zKCk7CiAKLQkvKgotCSAqIFRoZSBFRkkgc3BlY2lmaWNhdGlvbiBzYXlzIHRoYXQgYm9vdCBzZXJ2aWNlIGNvZGUgd29uJ3QgYmUgY2FsbGVkCi0JICogYWZ0ZXIgRXhpdEJvb3RTZXJ2aWNlcygpLiBUaGlzIGlzLCBpbiBmYWN0LCBhIGxpZS4KLQkgKi8KLQlpZiAoZWZpX2VuYWJsZWQoRUZJX01FTU1BUCkpCisJaWYgKGVmaV9lbmFibGVkKEVGSV9NRU1NQVApKSB7CisJCWVmaV9mYWtlX21lbW1hcCgpOworCQllZmlfZmluZF9taXJyb3IoKTsKKwkJZWZpX2VzcnRfaW5pdCgpOworCisJCS8qCisJCSAqIFRoZSBFRkkgc3BlY2lmaWNhdGlvbiBzYXlzIHRoYXQgYm9vdCBzZXJ2aWNlIGNvZGUgd29uJ3QgYmUKKwkJICogY2FsbGVkIGFmdGVyIEV4aXRCb290U2VydmljZXMoKS4gVGhpcyBpcywgaW4gZmFjdCwgYSBsaWUuCisJCSAqLwogCQllZmlfcmVzZXJ2ZV9ib290X3NlcnZpY2VzKCk7CisJfQogCiAJLyogcHJlYWxsb2NhdGUgNGsgZm9yIG1wdGFibGUgbXBjICovCiAJZWFybHlfcmVzZXJ2ZV9lODIwX21wY19uZXcoKTsKQEAgLTExMzcsOSArMTEzNyw3IEBACiAJICogYXVkaXRpbmcgYWxsIHRoZSBlYXJseS1ib290IENSNCBtYW5pcHVsYXRpb24gd291bGQgYmUgbmVlZGVkIHRvCiAJICogcnVsZSBpdCBvdXQuCiAJICovCi0JaWYgKGJvb3RfY3B1X2RhdGEuY3B1aWRfbGV2ZWwgPj0gMCkKLQkJLyogQSBDUFUgaGFzICVjcjQgaWYgYW5kIG9ubHkgaWYgaXQgaGFzIENQVUlELiAqLwotCQltbXVfY3I0X2ZlYXR1cmVzID0gX19yZWFkX2NyNCgpOworCW1tdV9jcjRfZmVhdHVyZXMgPSBfX3JlYWRfY3I0KCk7CiAKIAltZW1ibG9ja19zZXRfY3VycmVudF9saW1pdChnZXRfbWF4X21hcHBlZCgpKTsKIApAQCAtMTIyMSw4ICsxMjE5LDcgQEAKIAkvKgogCSAqIGdldCBib290LXRpbWUgU01QIGNvbmZpZ3VyYXRpb246CiAJICovCi0JaWYgKHNtcF9mb3VuZF9jb25maWcpCi0JCWdldF9zbXBfY29uZmlnKCk7CisJZ2V0X3NtcF9jb25maWcoKTsKIAogCXByZWZpbGxfcG9zc2libGVfbWFwKCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9zZXR1cF9wZXJjcHUuYyBiL2FyY2gveDg2L2tlcm5lbC9zZXR1cF9wZXJjcHUuYwppbmRleCA3YTQwZTA2Li4yYmJkMjdmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc2V0dXBfcGVyY3B1LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3NldHVwX3BlcmNwdS5jCkBAIC0zMyw3ICszMyw3IEBACiBERUZJTkVfUEVSX0NQVV9SRUFEX01PU1RMWSh1bnNpZ25lZCBsb25nLCB0aGlzX2NwdV9vZmYpID0gQk9PVF9QRVJDUFVfT0ZGU0VUOwogRVhQT1JUX1BFUl9DUFVfU1lNQk9MKHRoaXNfY3B1X29mZik7CiAKLXVuc2lnbmVkIGxvbmcgX19wZXJfY3B1X29mZnNldFtOUl9DUFVTXSBfX3JlYWRfbW9zdGx5ID0gewordW5zaWduZWQgbG9uZyBfX3Blcl9jcHVfb2Zmc2V0W05SX0NQVVNdIF9fcm9fYWZ0ZXJfaW5pdCA9IHsKIAlbMCAuLi4gTlJfQ1BVUy0xXSA9IEJPT1RfUEVSQ1BVX09GRlNFVCwKIH07CiBFWFBPUlRfU1lNQk9MKF9fcGVyX2NwdV9vZmZzZXQpOwpAQCAtMjQ2LDcgKzI0Niw3IEBACiAjaWZkZWYgQ09ORklHX1g4Nl82NAogCQlwZXJfY3B1KGlycV9zdGFja19wdHIsIGNwdSkgPQogCQkJcGVyX2NwdShpcnFfc3RhY2tfdW5pb24uaXJxX3N0YWNrLCBjcHUpICsKLQkJCUlSUV9TVEFDS19TSVpFIC0gNjQ7CisJCQlJUlFfU1RBQ0tfU0laRTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19OVU1BCiAJCXBlcl9jcHUoeDg2X2NwdV90b19ub2RlX21hcCwgY3B1KSA9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL3g4Ni9rZXJuZWwvc2lnbmFsLmMKaW5kZXggMDRjYjMyMS4uNzYzYWYxZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zaWduYWwuYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgPGFzbS9zeXNjYWxscy5oPgogCiAjaW5jbHVkZSA8YXNtL3NpZ2ZyYW1lLmg+CisjaW5jbHVkZSA8YXNtL3NpZ25hbC5oPgogCiAjZGVmaW5lIENPUFkoeCkJCQlkbyB7CQkJXAogCWdldF91c2VyX2V4KHJlZ3MtPngsICZzYy0+eCk7CQkJXApAQCAtNTQ3LDcgKzU0OCw3IEBACiAJCXJldHVybiAtRUZBVUxUOwogCiAJaWYgKGtzaWctPmthLnNhLnNhX2ZsYWdzICYgU0FfU0lHSU5GTykgewotCQlpZiAoY29weV9zaWdpbmZvX3RvX3VzZXIzMigmZnJhbWUtPmluZm8sICZrc2lnLT5pbmZvKSkKKwkJaWYgKF9fY29weV9zaWdpbmZvX3RvX3VzZXIzMigmZnJhbWUtPmluZm8sICZrc2lnLT5pbmZvLCB0cnVlKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCX0KIApAQCAtNjYwLDIwICs2NjEsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgaXNfaWEzMl9jb21wYXRfZnJhbWUodm9pZCkKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2lhMzJfY29tcGF0X2ZyYW1lKHN0cnVjdCBrc2lnbmFsICprc2lnKQogewogCXJldHVybiBJU19FTkFCTEVEKENPTkZJR19JQTMyX0VNVUxBVElPTikgJiYKLQkgICAgICAgdGVzdF90aHJlYWRfZmxhZyhUSUZfSUEzMik7CisJCWtzaWctPmthLnNhLnNhX2ZsYWdzICYgU0FfSUEzMl9BQkk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGlzX2lhMzJfZnJhbWUodm9pZCkKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2lhMzJfZnJhbWUoc3RydWN0IGtzaWduYWwgKmtzaWcpCiB7Ci0JcmV0dXJuIElTX0VOQUJMRUQoQ09ORklHX1g4Nl8zMikgfHwgaXNfaWEzMl9jb21wYXRfZnJhbWUoKTsKKwlyZXR1cm4gSVNfRU5BQkxFRChDT05GSUdfWDg2XzMyKSB8fCBpc19pYTMyX2NvbXBhdF9mcmFtZShrc2lnKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgaXNfeDMyX2ZyYW1lKHZvaWQpCitzdGF0aWMgaW5saW5lIGludCBpc194MzJfZnJhbWUoc3RydWN0IGtzaWduYWwgKmtzaWcpCiB7Ci0JcmV0dXJuIElTX0VOQUJMRUQoQ09ORklHX1g4Nl9YMzJfQUJJKSAmJiB0ZXN0X3RocmVhZF9mbGFnKFRJRl9YMzIpOworCXJldHVybiBJU19FTkFCTEVEKENPTkZJR19YODZfWDMyX0FCSSkgJiYKKwkJa3NpZy0+a2Euc2Euc2FfZmxhZ3MgJiBTQV9YMzJfQUJJOwogfQogCiBzdGF0aWMgaW50CkBAIC02ODQsMTIgKzY4NiwxMiBAQAogCWNvbXBhdF9zaWdzZXRfdCAqY3NldCA9IChjb21wYXRfc2lnc2V0X3QgKikgc2V0OwogCiAJLyogU2V0IHVwIHRoZSBzdGFjayBmcmFtZSAqLwotCWlmIChpc19pYTMyX2ZyYW1lKCkpIHsKKwlpZiAoaXNfaWEzMl9mcmFtZShrc2lnKSkgewogCQlpZiAoa3NpZy0+a2Euc2Euc2FfZmxhZ3MgJiBTQV9TSUdJTkZPKQogCQkJcmV0dXJuIGlhMzJfc2V0dXBfcnRfZnJhbWUodXNpZywga3NpZywgY3NldCwgcmVncyk7CiAJCWVsc2UKIAkJCXJldHVybiBpYTMyX3NldHVwX2ZyYW1lKHVzaWcsIGtzaWcsIGNzZXQsIHJlZ3MpOwotCX0gZWxzZSBpZiAoaXNfeDMyX2ZyYW1lKCkpIHsKKwl9IGVsc2UgaWYgKGlzX3gzMl9mcmFtZShrc2lnKSkgewogCQlyZXR1cm4geDMyX3NldHVwX3J0X2ZyYW1lKGtzaWcsIGNzZXQsIHJlZ3MpOwogCX0gZWxzZSB7CiAJCXJldHVybiBfX3NldHVwX3J0X2ZyYW1lKGtzaWctPnNpZywga3NpZywgc2V0LCByZWdzKTsKQEAgLTc4Myw3ICs3ODUsNyBAQAogCSAqIHRoYW4gdGhlIHRyYWNlZS4KIAkgKi8KICNpZmRlZiBDT05GSUdfSUEzMl9FTVVMQVRJT04KLQlpZiAoY3VycmVudF90aHJlYWRfaW5mbygpLT5zdGF0dXMgJiAoVFNfQ09NUEFUfFRTX0kzODZfUkVHU19QT0tFRCkpCisJaWYgKGN1cnJlbnQtPnRocmVhZC5zdGF0dXMgJiAoVFNfQ09NUEFUfFRTX0kzODZfUkVHU19QT0tFRCkpCiAJCXJldHVybiBfX05SX2lhMzJfcmVzdGFydF9zeXNjYWxsOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1g4Nl9YMzJfQUJJCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc2lnbmFsX2NvbXBhdC5jIGIvYXJjaC94ODYva2VybmVsL3NpZ25hbF9jb21wYXQuYwppbmRleCBiNDQ1NjRiLi40MGRmMzM3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc2lnbmFsX2NvbXBhdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zaWduYWxfY29tcGF0LmMKQEAgLTEsNSArMSw2IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogCiAvKgogICogVGhlIGNvbXBhdF9zaWdpbmZvX3Qgc3RydWN0dXJlIGFuZCBoYW5kaW5nIGNvZGUgaXMgdmVyeSBlYXN5CkBAIC05MiwxMCArOTMsMzEgQEAKIAkvKiBhbnkgbmV3IHNpX2ZpZWxkcyBzaG91bGQgYmUgYWRkZWQgaGVyZSAqLwogfQogCi1pbnQgY29weV9zaWdpbmZvX3RvX3VzZXIzMihjb21wYXRfc2lnaW5mb190IF9fdXNlciAqdG8sIGNvbnN0IHNpZ2luZm9fdCAqZnJvbSkKK3ZvaWQgc2lnYWN0aW9uX2NvbXBhdF9hYmkoc3RydWN0IGtfc2lnYWN0aW9uICphY3QsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqb2FjdCkKK3sKKwkvKiBEb24ndCBsZWFrIGluLWtlcm5lbCBub24tdWFwaSBmbGFncyB0byB1c2VyLXNwYWNlICovCisJaWYgKG9hY3QpCisJCW9hY3QtPnNhLnNhX2ZsYWdzICY9IH4oU0FfSUEzMl9BQkkgfCBTQV9YMzJfQUJJKTsKKworCWlmICghYWN0KQorCQlyZXR1cm47CisKKwkvKiBEb24ndCBsZXQgZmxhZ3MgdG8gYmUgc2V0IGZyb20gdXNlcnNwYWNlICovCisJYWN0LT5zYS5zYV9mbGFncyAmPSB+KFNBX0lBMzJfQUJJIHwgU0FfWDMyX0FCSSk7CisKKwlpZiAodXNlcl82NGJpdF9tb2RlKGN1cnJlbnRfcHRfcmVncygpKSkKKwkJcmV0dXJuOworCisJaWYgKGluX2lhMzJfc3lzY2FsbCgpKQorCQlhY3QtPnNhLnNhX2ZsYWdzIHw9IFNBX0lBMzJfQUJJOworCWlmIChpbl94MzJfc3lzY2FsbCgpKQorCQlhY3QtPnNhLnNhX2ZsYWdzIHw9IFNBX1gzMl9BQkk7Cit9CisKK2ludCBfX2NvcHlfc2lnaW5mb190b191c2VyMzIoY29tcGF0X3NpZ2luZm9fdCBfX3VzZXIgKnRvLCBjb25zdCBzaWdpbmZvX3QgKmZyb20sCisJCWJvb2wgeDMyX0FCSSkKIHsKIAlpbnQgZXJyID0gMDsKLQlib29sIGlhMzIgPSB0ZXN0X3RocmVhZF9mbGFnKFRJRl9JQTMyKTsKIAogCXNpZ25hbF9jb21wYXRfYnVpbGRfdGVzdHMoKTsKIApAQCAtMTQ2LDcgKzE2OCw3IEBACiAJCQkJcHV0X3VzZXJfZXgoZnJvbS0+c2lfYXJjaCwgJnRvLT5zaV9hcmNoKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgX19TSV9DSExEID4+IDE2OgotCQkJCWlmIChpYTMyKSB7CisJCQkJaWYgKCF4MzJfQUJJKSB7CiAJCQkJCXB1dF91c2VyX2V4KGZyb20tPnNpX3V0aW1lLCAmdG8tPnNpX3V0aW1lKTsKIAkJCQkJcHV0X3VzZXJfZXgoZnJvbS0+c2lfc3RpbWUsICZ0by0+c2lfc3RpbWUpOwogCQkJCX0gZWxzZSB7CkBAIC0xODAsNiArMjAyLDEyIEBACiAJcmV0dXJuIGVycjsKIH0KIAorLyogZnJvbSBzeXNjYWxsJ3MgcGF0aCwgd2hlcmUgd2Uga25vdyB0aGUgQUJJICovCitpbnQgY29weV9zaWdpbmZvX3RvX3VzZXIzMihjb21wYXRfc2lnaW5mb190IF9fdXNlciAqdG8sIGNvbnN0IHNpZ2luZm9fdCAqZnJvbSkKK3sKKwlyZXR1cm4gX19jb3B5X3NpZ2luZm9fdG9fdXNlcjMyKHRvLCBmcm9tLCBpbl94MzJfc3lzY2FsbCgpKTsKK30KKwogaW50IGNvcHlfc2lnaW5mb19mcm9tX3VzZXIzMihzaWdpbmZvX3QgKnRvLCBjb21wYXRfc2lnaW5mb190IF9fdXNlciAqZnJvbSkKIHsKIAlpbnQgZXJyID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMgYi9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jCmluZGV4IDJhNmU4NGEuLjQyYTkzNjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3NtcGJvb3QuYwpAQCAtMTAwLDEwICsxMDAsMTEgQEAKIC8qIExvZ2ljYWwgcGFja2FnZSBtYW5hZ2VtZW50LiBXZSBtaWdodCB3YW50IHRvIGFsbG9jYXRlIHRoYXQgZHluYW1pY2FsbHkgKi8KIHN0YXRpYyBpbnQgKnBoeXNpY2FsX3RvX2xvZ2ljYWxfcGtnIF9fcmVhZF9tb3N0bHk7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyAqcGh5c2ljYWxfcGFja2FnZV9tYXAgX19yZWFkX21vc3RseTs7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyAqbG9naWNhbF9wYWNrYWdlX21hcCAgX19yZWFkX21vc3RseTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X3BoeXNpY2FsX3BrZ19pZCBfX3JlYWRfbW9zdGx5OwogdW5zaWduZWQgaW50IF9fbWF4X2xvZ2ljYWxfcGFja2FnZXMgX19yZWFkX21vc3RseTsKIEVYUE9SVF9TWU1CT0woX19tYXhfbG9naWNhbF9wYWNrYWdlcyk7CitzdGF0aWMgdW5zaWduZWQgaW50IGxvZ2ljYWxfcGFja2FnZXMgX19yZWFkX21vc3RseTsKK3N0YXRpYyBib29sIGxvZ2ljYWxfcGFja2FnZXNfZnJvemVuIF9fcmVhZF9tb3N0bHk7CiAKIC8qIE1heGltdW0gbnVtYmVyIG9mIFNNVCB0aHJlYWRzIG9uIGFueSBvbmxpbmUgY29yZSAqLwogaW50IF9fbWF4X3NtdF90aHJlYWRzIF9fcmVhZF9tb3N0bHk7CkBAIC0yNzcsMTQgKzI3OCwxNCBAQAogCWlmICh0ZXN0X2FuZF9zZXRfYml0KHBrZywgcGh5c2ljYWxfcGFja2FnZV9tYXApKQogCQlnb3RvIGZvdW5kOwogCi0JbmV3ID0gZmluZF9maXJzdF96ZXJvX2JpdChsb2dpY2FsX3BhY2thZ2VfbWFwLCBfX21heF9sb2dpY2FsX3BhY2thZ2VzKTsKLQlpZiAobmV3ID49IF9fbWF4X2xvZ2ljYWxfcGFja2FnZXMpIHsKKwlpZiAobG9naWNhbF9wYWNrYWdlc19mcm96ZW4pIHsKIAkJcGh5c2ljYWxfdG9fbG9naWNhbF9wa2dbcGtnXSA9IC0xOwotCQlwcl93YXJuKCJBUElDKCV4KSBQYWNrYWdlICV1IGV4Y2VlZHMgbG9naWNhbCBwYWNrYWdlIG1hcFxuIiwKKwkJcHJfd2FybigiQVBJQygleCkgUGFja2FnZSAldSBleGNlZWRzIGxvZ2ljYWwgcGFja2FnZSBtYXhcbiIsCiAJCQlhcGljaWQsIHBrZyk7CiAJCXJldHVybiAtRU5PU1BDOwogCX0KLQlzZXRfYml0KG5ldywgbG9naWNhbF9wYWNrYWdlX21hcCk7CisKKwluZXcgPSBsb2dpY2FsX3BhY2thZ2VzKys7CiAJcHJfaW5mbygiQVBJQygleCkgQ29udmVydGluZyBwaHlzaWNhbCAldSB0byBsb2dpY2FsIHBhY2thZ2UgJXVcbiIsCiAJCWFwaWNpZCwgcGtnLCBuZXcpOwogCXBoeXNpY2FsX3RvX2xvZ2ljYWxfcGtnW3BrZ10gPSBuZXc7CkBAIC0zNDEsNiArMzQyLDcgQEAKIAl9CiAKIAlfX21heF9sb2dpY2FsX3BhY2thZ2VzID0gRElWX1JPVU5EX1VQKHRvdGFsX2NwdXMsIG5jcHVzKTsKKwlsb2dpY2FsX3BhY2thZ2VzID0gMDsKIAogCS8qCiAJICogUG9zc2libHkgbGFyZ2VyIHRoYW4gd2hhdCB3ZSBuZWVkIGFzIHRoZSBudW1iZXIgb2YgYXBpYyBpZHMgcGVyCkBAIC0zNTIsMTAgKzM1NCw2IEBACiAJbWVtc2V0KHBoeXNpY2FsX3RvX2xvZ2ljYWxfcGtnLCAweGZmLCBzaXplKTsKIAlzaXplID0gQklUU19UT19MT05HUyhtYXhfcGh5c2ljYWxfcGtnX2lkKSAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsKIAlwaHlzaWNhbF9wYWNrYWdlX21hcCA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0Jc2l6ZSA9IEJJVFNfVE9fTE9OR1MoX19tYXhfbG9naWNhbF9wYWNrYWdlcykgKiBzaXplb2YodW5zaWduZWQgbG9uZyk7Ci0JbG9naWNhbF9wYWNrYWdlX21hcCA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0KLQlwcl9pbmZvKCJNYXggbG9naWNhbCBwYWNrYWdlczogJXVcbiIsIF9fbWF4X2xvZ2ljYWxfcGFja2FnZXMpOwogCiAJZm9yX2VhY2hfcHJlc2VudF9jcHUoY3B1KSB7CiAJCXVuc2lnbmVkIGludCBhcGljaWQgPSBhcGljLT5jcHVfcHJlc2VudF90b19hcGljaWQoY3B1KTsKQEAgLTM2OSw2ICszNjcsMTUgQEAKIAkJc2V0X2NwdV9wb3NzaWJsZShjcHUsIGZhbHNlKTsKIAkJc2V0X2NwdV9wcmVzZW50KGNwdSwgZmFsc2UpOwogCX0KKworCWlmIChsb2dpY2FsX3BhY2thZ2VzID4gX19tYXhfbG9naWNhbF9wYWNrYWdlcykgeworCQlwcl93YXJuKCJEZXRlY3RlZCBtb3JlIHBhY2thZ2VzICgldSksIHRoZW4gY29tcHV0ZWQgYnkgQklPUyBkYXRhICgldSkuXG4iLAorCQkJbG9naWNhbF9wYWNrYWdlcywgX19tYXhfbG9naWNhbF9wYWNrYWdlcyk7CisJCWxvZ2ljYWxfcGFja2FnZXNfZnJvemVuID0gdHJ1ZTsKKwkJX19tYXhfbG9naWNhbF9wYWNrYWdlcyAgPSBsb2dpY2FsX3BhY2thZ2VzOworCX0KKworCXByX2luZm8oIk1heCBsb2dpY2FsIHBhY2thZ2VzOiAldVxuIiwgX19tYXhfbG9naWNhbF9wYWNrYWdlcyk7CiB9CiAKIHZvaWQgX19pbml0IHNtcF9zdG9yZV9ib290X2NwdV9pbmZvKHZvaWQpCkBAIC00NjQsNyArNDcxLDcgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2NoZWRfZG9tYWluX3RvcG9sb2d5X2xldmVsIG51bWFfaW5zaWRlX3BhY2thZ2VfdG9wb2xvZ3lbXSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2NoZWRfZG9tYWluX3RvcG9sb2d5X2xldmVsIHg4Nl9udW1hX2luX3BhY2thZ2VfdG9wb2xvZ3lbXSA9IHsKICNpZmRlZiBDT05GSUdfU0NIRURfU01UCiAJeyBjcHVfc210X21hc2ssIGNwdV9zbXRfZmxhZ3MsIFNEX0lOSVRfTkFNRShTTVQpIH0sCiAjZW5kaWYKQEAgLTQ3MywyMiArNDgwLDIzIEBACiAjZW5kaWYKIAl7IE5VTEwsIH0sCiB9OworCitzdGF0aWMgc3RydWN0IHNjaGVkX2RvbWFpbl90b3BvbG9neV9sZXZlbCB4ODZfdG9wb2xvZ3lbXSA9IHsKKyNpZmRlZiBDT05GSUdfU0NIRURfU01UCisJeyBjcHVfc210X21hc2ssIGNwdV9zbXRfZmxhZ3MsIFNEX0lOSVRfTkFNRShTTVQpIH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0NIRURfTUMKKwl7IGNwdV9jb3JlZ3JvdXBfbWFzaywgY3B1X2NvcmVfZmxhZ3MsIFNEX0lOSVRfTkFNRShNQykgfSwKKyNlbmRpZgorCXsgY3B1X2NwdV9tYXNrLCBTRF9JTklUX05BTUUoRElFKSB9LAorCXsgTlVMTCwgfSwKK307CisKIC8qCi0gKiBzZXRfc2NoZWRfdG9wb2xvZ3koKSBzZXRzIHRoZSB0b3BvbG9neSBpbnRlcm5hbCB0byBhIENQVS4gIFRoZQotICogTlVNQSB0b3BvbG9naWVzIGFyZSBsYXllcmVkIG9uIHRvcCBvZiBpdCB0byBidWlsZCB0aGUgZnVsbAotICogc3lzdGVtIHRvcG9sb2d5LgotICoKLSAqIElmIE5VTUEgbm9kZXMgYXJlIG9ic2VydmVkIHRvIG9jY3VyIHdpdGhpbiBhIENQVSBwYWNrYWdlLCB0aGlzCi0gKiBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkLiAgSXQgZm9yY2VzIHRoZSBzY2hlZCBkb21haW4gY29kZSB0bwotICogb25seSB1c2UgdGhlIFNNVCBsZXZlbCBmb3IgdGhlIENQVSBwb3J0aW9uIG9mIHRoZSB0b3BvbG9neS4KLSAqIFRoaXMgZXNzZW50aWFsbHkgZmFsbHMgYmFjayB0byByZWx5aW5nIG9uIE5VTUEgaW5mb3JtYXRpb24KLSAqIGZyb20gdGhlIFNSQVQgdGFibGUgdG8gZGVzY3JpYmUgdGhlIGVudGlyZSBzeXN0ZW0gdG9wb2xvZ3kKLSAqIChleGNlcHQgZm9yIGh5cGVydGhyZWFkcykuCisgKiBTZXQgaWYgYSBwYWNrYWdlL2RpZSBoYXMgbXVsdGlwbGUgTlVNQSBub2RlcyBpbnNpZGUuCisgKiBBTUQgTWFnbnktQ291cnMgYW5kIEludGVsIENsdXN0ZXItb24tRGllIGhhdmUgdGhpcy4KICAqLwotc3RhdGljIHZvaWQgcHJpbWFyaWx5X3VzZV9udW1hX2Zvcl90b3BvbG9neSh2b2lkKQotewotCXNldF9zY2hlZF90b3BvbG9neShudW1hX2luc2lkZV9wYWNrYWdlX3RvcG9sb2d5KTsKLX0KK3N0YXRpYyBib29sIHg4Nl9oYXNfbnVtYV9pbl9wYWNrYWdlOwogCiB2b2lkIHNldF9jcHVfc2libGluZ19tYXAoaW50IGNwdSkKIHsKQEAgLTU1MSw3ICs1NTksNyBAQAogCQkJCWMtPmJvb3RlZF9jb3JlcyA9IGNwdV9kYXRhKGkpLmJvb3RlZF9jb3JlczsKIAkJfQogCQlpZiAobWF0Y2hfZGllKGMsIG8pICYmICF0b3BvbG9neV9zYW1lX25vZGUoYywgbykpCi0JCQlwcmltYXJpbHlfdXNlX251bWFfZm9yX3RvcG9sb2d5KCk7CisJCQl4ODZfaGFzX251bWFfaW5fcGFja2FnZSA9IHRydWU7CiAJfQogCiAJdGhyZWFkcyA9IGNwdW1hc2tfd2VpZ2h0KHRvcG9sb2d5X3NpYmxpbmdfY3B1bWFzayhjcHUpKTsKQEAgLTY4Myw3ICs2OTEsNyBAQAogCSAqIEdpdmUgdGhlIG90aGVyIENQVSBzb21lIHRpbWUgdG8gYWNjZXB0IHRoZSBJUEkuCiAJICovCiAJdWRlbGF5KDIwMCk7Ci0JaWYgKEFQSUNfSU5URUdSQVRFRChhcGljX3ZlcnNpb25bYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkXSkpIHsKKwlpZiAoQVBJQ19JTlRFR1JBVEVEKGJvb3RfY3B1X2FwaWNfdmVyc2lvbikpIHsKIAkJbWF4bHZ0ID0gbGFwaWNfZ2V0X21heGx2dCgpOwogCQlpZiAobWF4bHZ0ID4gMykJCQkvKiBEdWUgdG8gdGhlIFBlbnRpdW0gZXJyYXR1bSAzQVAuICAqLwogCQkJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CkBAIC03MTAsNyArNzE4LDcgQEAKIAkvKgogCSAqIEJlIHBhcmFub2lkIGFib3V0IGNsZWFyaW5nIEFQSUMgZXJyb3JzLgogCSAqLwotCWlmIChBUElDX0lOVEVHUkFURUQoYXBpY192ZXJzaW9uW3BoeXNfYXBpY2lkXSkpIHsKKwlpZiAoQVBJQ19JTlRFR1JBVEVEKGJvb3RfY3B1X2FwaWNfdmVyc2lvbikpIHsKIAkJaWYgKG1heGx2dCA+IDMpCQkvKiBEdWUgdG8gdGhlIFBlbnRpdW0gZXJyYXR1bSAzQVAuICAqLwogCQkJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CiAJCWFwaWNfcmVhZChBUElDX0VTUik7CkBAIC03NDksNyArNzU3LDcgQEAKIAkgKiBEZXRlcm1pbmUgdGhpcyBiYXNlZCBvbiB0aGUgQVBJQyB2ZXJzaW9uLgogCSAqIElmIHdlIGRvbid0IGhhdmUgYW4gaW50ZWdyYXRlZCBBUElDLCBkb24ndCBzZW5kIHRoZSBTVEFSVFVQIElQSXMuCiAJICovCi0JaWYgKEFQSUNfSU5URUdSQVRFRChhcGljX3ZlcnNpb25bcGh5c19hcGljaWRdKSkKKwlpZiAoQVBJQ19JTlRFR1JBVEVEKGJvb3RfY3B1X2FwaWNfdmVyc2lvbikpCiAJCW51bV9zdGFydHMgPSAyOwogCWVsc2UKIAkJbnVtX3N0YXJ0cyA9IDA7CkBAIC05MzUsNyArOTQzLDYgQEAKIAlwZXJfY3B1KGNwdV9jdXJyZW50X3RvcF9vZl9zdGFjaywgY3B1KSA9CiAJCSh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShpZGxlKSArIFRIUkVBRF9TSVpFOwogI2Vsc2UKLQljbGVhcl90c2tfdGhyZWFkX2ZsYWcoaWRsZSwgVElGX0ZPUkspOwogCWluaXRpYWxfZ3MgPSBwZXJfY3B1X29mZnNldChjcHUpOwogI2VuZGlmCiB9CkBAIC05NjIsNyArOTY5LDcgQEAKIAogCWVhcmx5X2dkdF9kZXNjci5hZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpZ2V0X2NwdV9nZHRfdGFibGUoY3B1KTsKIAlpbml0aWFsX2NvZGUgPSAodW5zaWduZWQgbG9uZylzdGFydF9zZWNvbmRhcnk7Ci0Jc3RhY2tfc3RhcnQgID0gaWRsZS0+dGhyZWFkLnNwOworCWluaXRpYWxfc3RhY2sgID0gaWRsZS0+dGhyZWFkLnNwOwogCiAJLyoKIAkgKiBFbmFibGUgdGhlIGVzcGZpeCBoYWNrIGZvciB0aGlzIENQVQpAQCAtOTg3LDcgKzk5NCw3IEBACiAJCS8qCiAJCSAqIEJlIHBhcmFub2lkIGFib3V0IGNsZWFyaW5nIEFQSUMgZXJyb3JzLgogCQkqLwotCQlpZiAoQVBJQ19JTlRFR1JBVEVEKGFwaWNfdmVyc2lvbltib290X2NwdV9waHlzaWNhbF9hcGljaWRdKSkgeworCQlpZiAoQVBJQ19JTlRFR1JBVEVEKGJvb3RfY3B1X2FwaWNfdmVyc2lvbikpIHsKIAkJCWFwaWNfd3JpdGUoQVBJQ19FU1IsIDApOwogCQkJYXBpY19yZWFkKEFQSUNfRVNSKTsKIAkJfQpAQCAtMTEwOCwxNyArMTExNSw4IEBACiAKIAljb21tb25fY3B1X3VwKGNwdSwgdGlkbGUpOwogCi0JLyoKLQkgKiBXZSBoYXZlIHRvIHdhbGsgdGhlIGlycSBkZXNjcmlwdG9ycyB0byBzZXR1cCB0aGUgdmVjdG9yCi0JICogc3BhY2UgZm9yIHRoZSBjcHUgd2hpY2ggY29tZXMgb25saW5lLiAgUHJldmVudCBpcnEKLQkgKiBhbGxvYy9mcmVlIGFjcm9zcyB0aGUgYnJpbmd1cC4KLQkgKi8KLQlpcnFfbG9ja19zcGFyc2UoKTsKLQogCWVyciA9IGRvX2Jvb3RfY3B1KGFwaWNpZCwgY3B1LCB0aWRsZSk7Ci0KIAlpZiAoZXJyKSB7Ci0JCWlycV91bmxvY2tfc3BhcnNlKCk7CiAJCXByX2VycigiZG9fYm9vdF9jcHUgZmFpbGVkKCVkKSB0byB3YWtldXAgQ1BVIyV1XG4iLCBlcnIsIGNwdSk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTExMzYsOCArMTEzNCw2IEBACiAJCXRvdWNoX25taV93YXRjaGRvZygpOwogCX0KIAotCWlycV91bmxvY2tfc3BhcnNlKCk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTI0Miw3ICsxMjM4LDcgQEAKIAkvKgogCSAqIElmIHdlIGNvdWxkbid0IGZpbmQgYSBsb2NhbCBBUElDLCB0aGVuIGdldCBvdXQgb2YgaGVyZSBub3chCiAJICovCi0JaWYgKEFQSUNfSU5URUdSQVRFRChhcGljX3ZlcnNpb25bYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkXSkgJiYKKwlpZiAoQVBJQ19JTlRFR1JBVEVEKGJvb3RfY3B1X2FwaWNfdmVyc2lvbikgJiYKIAkgICAgIWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9BUElDKSkgewogCQlpZiAoIWRpc2FibGVfYXBpYykgewogCQkJcHJfZXJyKCJCSU9TIGJ1ZywgbG9jYWwgQVBJQyAjJWQgbm90IGRldGVjdGVkIS4uLlxuIiwKQEAgLTEyOTcsNiArMTI5MywxNiBAQAogCQl6YWxsb2NfY3B1bWFza192YXIoJnBlcl9jcHUoY3B1X2NvcmVfbWFwLCBpKSwgR0ZQX0tFUk5FTCk7CiAJCXphbGxvY19jcHVtYXNrX3ZhcigmcGVyX2NwdShjcHVfbGxjX3NoYXJlZF9tYXAsIGkpLCBHRlBfS0VSTkVMKTsKIAl9CisKKwkvKgorCSAqIFNldCAnZGVmYXVsdCcgeDg2IHRvcG9sb2d5LCB0aGlzIG1hdGNoZXMgZGVmYXVsdF90b3BvbG9neSgpIGluIHRoYXQKKwkgKiBpdCBoYXMgTlVNQSBub2RlcyBhcyBhIHRvcG9sb2d5IGxldmVsLiBTZWUgYWxzbworCSAqIG5hdGl2ZV9zbXBfY3B1c19kb25lKCkuCisJICoKKwkgKiBNdXN0IGJlIGRvbmUgYmVmb3JlIHNldF9jcHVzX3NpYmxpbmdfbWFwKCkgaXMgcmFuLgorCSAqLworCXNldF9zY2hlZF90b3BvbG9neSh4ODZfdG9wb2xvZ3kpOworCiAJc2V0X2NwdV9zaWJsaW5nX21hcCgwKTsKIAogCXN3aXRjaCAoc21wX3Nhbml0eV9jaGVjayhtYXhfY3B1cykpIHsKQEAgLTEzMTYsMTQgKzEzMjIsMTMgQEAKIAkJYnJlYWs7CiAJfQogCi0JZGVmYXVsdF9zZXR1cF9hcGljX3JvdXRpbmcoKTsKLQogCWlmIChyZWFkX2FwaWNfaWQoKSAhPSBib290X2NwdV9waHlzaWNhbF9hcGljaWQpIHsKIAkJcGFuaWMoIkJvb3QgQVBJQyBJRCBpbiBsb2NhbCBBUElDIHVuZXhwZWN0ZWQgKCVkIHZzICVkKSIsCiAJCSAgICAgcmVhZF9hcGljX2lkKCksIGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCk7CiAJCS8qIE9yIGNhbiB3ZSBzd2l0Y2ggYmFjayB0byBQSUMgaGVyZT8gKi8KIAl9CiAKKwlkZWZhdWx0X3NldHVwX2FwaWNfcm91dGluZygpOwogCWNwdTBfbG9naWNhbF9hcGljaWQgPSBhcGljX2JzcF9zZXR1cChmYWxzZSk7CiAKIAlwcl9pbmZvKCJDUFUlZDogIiwgMCk7CkBAIC0xMzYzLDYgKzEzNjgsOSBAQAogewogCXByX2RlYnVnKCJCb290IGRvbmVcbiIpOwogCisJaWYgKHg4Nl9oYXNfbnVtYV9pbl9wYWNrYWdlKQorCQlzZXRfc2NoZWRfdG9wb2xvZ3koeDg2X251bWFfaW5fcGFja2FnZV90b3BvbG9neSk7CisKIAlubWlfc2VsZnRlc3QoKTsKIAlpbXByZXNzX2ZyaWVuZHMoKTsKIAlzZXR1cF9pb2FwaWNfZGVzdCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3N0YWNrdHJhY2UuYyBiL2FyY2gveDg2L2tlcm5lbC9zdGFja3RyYWNlLmMKaW5kZXggNDczOGY1ZS4uMDY1Mzc4OCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3N0YWNrdHJhY2UuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc3RhY2t0cmFjZS5jCkBAIC04LDgwICs4LDY5IEBACiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3Vud2luZC5oPgogCi1zdGF0aWMgaW50IHNhdmVfc3RhY2tfc3RhY2sodm9pZCAqZGF0YSwgY2hhciAqbmFtZSkKK3N0YXRpYyBpbnQgc2F2ZV9zdGFja19hZGRyZXNzKHN0cnVjdCBzdGFja190cmFjZSAqdHJhY2UsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCSAgICAgIGJvb2wgbm9zY2hlZCkKIHsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotX19zYXZlX3N0YWNrX2FkZHJlc3Modm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBhZGRyLCBib29sIHJlbGlhYmxlLCBib29sIG5vc2NoZWQpCi17Ci0Jc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSA9IGRhdGE7Ci0jaWZkZWYgQ09ORklHX0ZSQU1FX1BPSU5URVIKLQlpZiAoIXJlbGlhYmxlKQotCQlyZXR1cm4gMDsKLSNlbmRpZgogCWlmIChub3NjaGVkICYmIGluX3NjaGVkX2Z1bmN0aW9ucyhhZGRyKSkKIAkJcmV0dXJuIDA7CisKIAlpZiAodHJhY2UtPnNraXAgPiAwKSB7CiAJCXRyYWNlLT5za2lwLS07CiAJCXJldHVybiAwOwogCX0KLQlpZiAodHJhY2UtPm5yX2VudHJpZXMgPCB0cmFjZS0+bWF4X2VudHJpZXMpIHsKLQkJdHJhY2UtPmVudHJpZXNbdHJhY2UtPm5yX2VudHJpZXMrK10gPSBhZGRyOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQlyZXR1cm4gLTE7IC8qIG5vIG1vcmUgcm9vbSwgc3RvcCB3YWxraW5nIHRoZSBzdGFjayAqLworCisJaWYgKHRyYWNlLT5ucl9lbnRyaWVzID49IHRyYWNlLT5tYXhfZW50cmllcykKKwkJcmV0dXJuIC0xOworCisJdHJhY2UtPmVudHJpZXNbdHJhY2UtPm5yX2VudHJpZXMrK10gPSBhZGRyOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX3NhdmVfc3RhY2tfdHJhY2Uoc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSwKKwkJCSAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJICAgICAgIGJvb2wgbm9zY2hlZCkKK3sKKwlzdHJ1Y3QgdW53aW5kX3N0YXRlIHN0YXRlOworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworCWlmIChyZWdzKQorCQlzYXZlX3N0YWNrX2FkZHJlc3ModHJhY2UsIHJlZ3MtPmlwLCBub3NjaGVkKTsKKworCWZvciAodW53aW5kX3N0YXJ0KCZzdGF0ZSwgdGFzaywgcmVncywgTlVMTCk7ICF1bndpbmRfZG9uZSgmc3RhdGUpOworCSAgICAgdW53aW5kX25leHRfZnJhbWUoJnN0YXRlKSkgeworCQlhZGRyID0gdW53aW5kX2dldF9yZXR1cm5fYWRkcmVzcygmc3RhdGUpOworCQlpZiAoIWFkZHIgfHwgc2F2ZV9zdGFja19hZGRyZXNzKHRyYWNlLCBhZGRyLCBub3NjaGVkKSkKKwkJCWJyZWFrOwogCX0KKworCWlmICh0cmFjZS0+bnJfZW50cmllcyA8IHRyYWNlLT5tYXhfZW50cmllcykKKwkJdHJhY2UtPmVudHJpZXNbdHJhY2UtPm5yX2VudHJpZXMrK10gPSBVTE9OR19NQVg7CiB9CiAKLXN0YXRpYyBpbnQgc2F2ZV9zdGFja19hZGRyZXNzKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IHJlbGlhYmxlKQotewotCXJldHVybiBfX3NhdmVfc3RhY2tfYWRkcmVzcyhkYXRhLCBhZGRyLCByZWxpYWJsZSwgZmFsc2UpOwotfQotCi1zdGF0aWMgaW50Ci1zYXZlX3N0YWNrX2FkZHJlc3Nfbm9zY2hlZCh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGFkZHIsIGludCByZWxpYWJsZSkKLXsKLQlyZXR1cm4gX19zYXZlX3N0YWNrX2FkZHJlc3MoZGF0YSwgYWRkciwgcmVsaWFibGUsIHRydWUpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzIHNhdmVfc3RhY2tfb3BzID0gewotCS5zdGFjawkJPSBzYXZlX3N0YWNrX3N0YWNrLAotCS5hZGRyZXNzCT0gc2F2ZV9zdGFja19hZGRyZXNzLAotCS53YWxrX3N0YWNrCT0gcHJpbnRfY29udGV4dF9zdGFjaywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgc2F2ZV9zdGFja19vcHNfbm9zY2hlZCA9IHsKLQkuc3RhY2sJCT0gc2F2ZV9zdGFja19zdGFjaywKLQkuYWRkcmVzcwk9IHNhdmVfc3RhY2tfYWRkcmVzc19ub3NjaGVkLAotCS53YWxrX3N0YWNrCT0gcHJpbnRfY29udGV4dF9zdGFjaywKLX07Ci0KIC8qCiAgKiBTYXZlIHN0YWNrLWJhY2t0cmFjZSBhZGRyZXNzZXMgaW50byBhIHN0YWNrX3RyYWNlIGJ1ZmZlci4KICAqLwogdm9pZCBzYXZlX3N0YWNrX3RyYWNlKHN0cnVjdCBzdGFja190cmFjZSAqdHJhY2UpCiB7Ci0JZHVtcF90cmFjZShjdXJyZW50LCBOVUxMLCBOVUxMLCAwLCAmc2F2ZV9zdGFja19vcHMsIHRyYWNlKTsKLQlpZiAodHJhY2UtPm5yX2VudHJpZXMgPCB0cmFjZS0+bWF4X2VudHJpZXMpCi0JCXRyYWNlLT5lbnRyaWVzW3RyYWNlLT5ucl9lbnRyaWVzKytdID0gVUxPTkdfTUFYOworCV9fc2F2ZV9zdGFja190cmFjZSh0cmFjZSwgY3VycmVudCwgTlVMTCwgZmFsc2UpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc2F2ZV9zdGFja190cmFjZSk7CiAKIHZvaWQgc2F2ZV9zdGFja190cmFjZV9yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3Qgc3RhY2tfdHJhY2UgKnRyYWNlKQogewotCWR1bXBfdHJhY2UoY3VycmVudCwgcmVncywgTlVMTCwgMCwgJnNhdmVfc3RhY2tfb3BzLCB0cmFjZSk7Ci0JaWYgKHRyYWNlLT5ucl9lbnRyaWVzIDwgdHJhY2UtPm1heF9lbnRyaWVzKQotCQl0cmFjZS0+ZW50cmllc1t0cmFjZS0+bnJfZW50cmllcysrXSA9IFVMT05HX01BWDsKKwlfX3NhdmVfc3RhY2tfdHJhY2UodHJhY2UsIGN1cnJlbnQsIHJlZ3MsIGZhbHNlKTsKIH0KIAogdm9pZCBzYXZlX3N0YWNrX3RyYWNlX3RzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSkKIHsKLQlkdW1wX3RyYWNlKHRzaywgTlVMTCwgTlVMTCwgMCwgJnNhdmVfc3RhY2tfb3BzX25vc2NoZWQsIHRyYWNlKTsKLQlpZiAodHJhY2UtPm5yX2VudHJpZXMgPCB0cmFjZS0+bWF4X2VudHJpZXMpCi0JCXRyYWNlLT5lbnRyaWVzW3RyYWNlLT5ucl9lbnRyaWVzKytdID0gVUxPTkdfTUFYOworCWlmICghdHJ5X2dldF90YXNrX3N0YWNrKHRzaykpCisJCXJldHVybjsKKworCV9fc2F2ZV9zdGFja190cmFjZSh0cmFjZSwgdHNrLCBOVUxMLCB0cnVlKTsKKworCXB1dF90YXNrX3N0YWNrKHRzayk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzYXZlX3N0YWNrX3RyYWNlX3Rzayk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90Ym9vdC5jIGIvYXJjaC94ODYva2VybmVsL3Rib290LmMKaW5kZXggNjU0ZjZjNi4uODQwMjkwNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3Rib290LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Rib290LmMKQEAgLTE4OCwxMiArMTg4LDEyIEBACiAKIAl0Ym9vdC0+bnVtX21hY19yZWdpb25zID0gMDsKIAotCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7Ci0JCWlmICgoZTgyMC5tYXBbaV0udHlwZSAhPSBFODIwX1JBTSkKLQkJICYmIChlODIwLm1hcFtpXS50eXBlICE9IEU4MjBfUkVTRVJWRURfS0VSTikpCisJZm9yIChpID0gMDsgaSA8IGU4MjAtPm5yX21hcDsgaSsrKSB7CisJCWlmICgoZTgyMC0+bWFwW2ldLnR5cGUgIT0gRTgyMF9SQU0pCisJCSAmJiAoZTgyMC0+bWFwW2ldLnR5cGUgIT0gRTgyMF9SRVNFUlZFRF9LRVJOKSkKIAkJCWNvbnRpbnVlOwogCi0JCWFkZF9tYWNfcmVnaW9uKGU4MjAubWFwW2ldLmFkZHIsIGU4MjAubWFwW2ldLnNpemUpOworCQlhZGRfbWFjX3JlZ2lvbihlODIwLT5tYXBbaV0uYWRkciwgZTgyMC0+bWFwW2ldLnNpemUpOwogCX0KIAogCXRib290LT5hY3BpX3NpbmZvLmtlcm5lbF9zM19yZXN1bWVfdmVjdG9yID0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90cmFwcy5jIGIvYXJjaC94ODYva2VybmVsL3RyYXBzLmMKaW5kZXggYjcwY2ExMi4uYmQ0ZTNkNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RyYXBzLmMKQEAgLTI5MiwxMiArMjkyLDMwIEBACiBET19FUlJPUihYODZfVFJBUF9TUywgICAgIFNJR0JVUywgICJzdGFjayBzZWdtZW50IiwJCXN0YWNrX3NlZ21lbnQpCiBET19FUlJPUihYODZfVFJBUF9BQywgICAgIFNJR0JVUywgICJhbGlnbm1lbnQgY2hlY2siLAkJYWxpZ25tZW50X2NoZWNrKQogCisjaWZkZWYgQ09ORklHX1ZNQVBfU1RBQ0sKK19fdmlzaWJsZSB2b2lkIF9fbm9yZXR1cm4gaGFuZGxlX3N0YWNrX292ZXJmbG93KGNvbnN0IGNoYXIgKm1lc3NhZ2UsCisJCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkJCXVuc2lnbmVkIGxvbmcgZmF1bHRfYWRkcmVzcykKK3sKKwlwcmludGsoS0VSTl9FTUVSRyAiQlVHOiBzdGFjayBndWFyZCBwYWdlIHdhcyBoaXQgYXQgJXAgKHN0YWNrIGlzICVwLi4lcClcbiIsCisJCSAodm9pZCAqKWZhdWx0X2FkZHJlc3MsIGN1cnJlbnQtPnN0YWNrLAorCQkgKGNoYXIgKiljdXJyZW50LT5zdGFjayArIFRIUkVBRF9TSVpFIC0gMSk7CisJZGllKG1lc3NhZ2UsIHJlZ3MsIDApOworCisJLyogQmUgYWJzb2x1dGVseSBjZXJ0YWluIHdlIGRvbid0IHJldHVybi4gKi8KKwlwYW5pYyhtZXNzYWdlKTsKK30KKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX1g4Nl82NAogLyogUnVucyBvbiBJU1Qgc3RhY2sgKi8KIGRvdHJhcGxpbmthZ2Ugdm9pZCBkb19kb3VibGVfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKIHsKIAlzdGF0aWMgY29uc3QgY2hhciBzdHJbXSA9ICJkb3VibGUgZmF1bHQiOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKyNpZmRlZiBDT05GSUdfVk1BUF9TVEFDSworCXVuc2lnbmVkIGxvbmcgY3IyOworI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfWDg2X0VTUEZJWDY0CiAJZXh0ZXJuIHVuc2lnbmVkIGNoYXIgbmF0aXZlX2lycV9yZXR1cm5faXJldFtdOwpAQCAtMzMyLDYgKzM1MCw0OSBAQAogCXRzay0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOwogCXRzay0+dGhyZWFkLnRyYXBfbnIgPSBYODZfVFJBUF9ERjsKIAorI2lmZGVmIENPTkZJR19WTUFQX1NUQUNLCisJLyoKKwkgKiBJZiB3ZSBvdmVyZmxvdyB0aGUgc3RhY2sgaW50byBhIGd1YXJkIHBhZ2UsIHRoZSBDUFUgd2lsbCBmYWlsCisJICogdG8gZGVsaXZlciAjUEYgYW5kIHdpbGwgc2VuZCAjREYgaW5zdGVhZC4gIFNpbWlsYXJseSwgaWYgd2UKKwkgKiB0YWtlIGFueSBub24tSVNUIGV4Y2VwdGlvbiB3aGlsZSB0b28gY2xvc2UgdG8gdGhlIGJvdHRvbSBvZgorCSAqIHRoZSBzdGFjaywgdGhlIHByb2Nlc3NvciB3aWxsIGdldCBhIHBhZ2UgZmF1bHQgd2hpbGUKKwkgKiBkZWxpdmVyaW5nIHRoZSBleGNlcHRpb24gYW5kIHdpbGwgZ2VuZXJhdGUgYSBkb3VibGUgZmF1bHQuCisJICoKKwkgKiBBY2NvcmRpbmcgdG8gdGhlIFNETSAoZm9vdG5vdGUgaW4gNi4xNSB1bmRlciAiSW50ZXJydXB0IDE0IC0KKwkgKiBQYWdlLUZhdWx0IEV4Y2VwdGlvbiAoI1BGKToKKwkgKgorCSAqICAgUHJvY2Vzc29ycyB1cGRhdGUgQ1IyIHdoZW5ldmVyIGEgcGFnZSBmYXVsdCBpcyBkZXRlY3RlZC4gSWYgYQorCSAqICAgc2Vjb25kIHBhZ2UgZmF1bHQgb2NjdXJzIHdoaWxlIGFuIGVhcmxpZXIgcGFnZSBmYXVsdCBpcyBiZWluZworCSAqICAgZGVsaXYtIGVyZWQsIHRoZSBmYXVsdGluZyBsaW5lYXIgYWRkcmVzcyBvZiB0aGUgc2Vjb25kIGZhdWx0IHdpbGwKKwkgKiAgIG92ZXJ3cml0ZSB0aGUgY29udGVudHMgb2YgQ1IyIChyZXBsYWNpbmcgdGhlIHByZXZpb3VzCisJICogICBhZGRyZXNzKS4gVGhlc2UgdXBkYXRlcyB0byBDUjIgb2NjdXIgZXZlbiBpZiB0aGUgcGFnZSBmYXVsdAorCSAqICAgcmVzdWx0cyBpbiBhIGRvdWJsZSBmYXVsdCBvciBvY2N1cnMgZHVyaW5nIHRoZSBkZWxpdmVyeSBvZiBhCisJICogICBkb3VibGUgZmF1bHQuCisJICoKKwkgKiBUaGUgbG9naWMgYmVsb3cgaGFzIGEgc21hbGwgcG9zc2liaWxpdHkgb2YgaW5jb3JyZWN0bHkgZGlhZ25vc2luZworCSAqIHNvbWUgZXJyb3JzIGFzIHN0YWNrIG92ZXJmbG93cy4gIEZvciBleGFtcGxlLCBpZiB0aGUgSURUIG9yIEdEVAorCSAqIGdldHMgY29ycnVwdGVkIHN1Y2ggdGhhdCAjR1AgZGVsaXZlcnkgZmFpbHMgZHVlIHRvIGEgYmFkIGRlc2NyaXB0b3IKKwkgKiBjYXVzaW5nICNHUCBhbmQgd2UgaGl0IHRoaXMgY29uZGl0aW9uIHdoaWxlIENSMiBjb2luY2lkZW50YWxseQorCSAqIHBvaW50cyB0byB0aGUgc3RhY2sgZ3VhcmQgcGFnZSwgd2UnbGwgdGhpbmsgd2Ugb3ZlcmZsb3dlZCB0aGUKKwkgKiBzdGFjay4gIEdpdmVuIHRoYXQgd2UncmUgZ29pbmcgdG8gcGFuaWMgb25lIHdheSBvciBhbm90aGVyCisJICogaWYgdGhpcyBoYXBwZW5zLCB0aGlzIGlzbid0IG5lY2Vzc2FyaWx5IHdvcnRoIGZpeGluZy4KKwkgKgorCSAqIElmIG5lY2Vzc2FyeSwgd2UgY291bGQgaW1wcm92ZSB0aGUgdGVzdCBieSBvbmx5IGRpYWdub3NpbmcKKwkgKiBhIHN0YWNrIG92ZXJmbG93IGlmIHRoZSBzYXZlZCBSU1AgcG9pbnRzIHdpdGhpbiA0NyBieXRlcyBvZgorCSAqIHRoZSBib3R0b20gb2YgdGhlIHN0YWNrOiBpZiBSU1AgPT0gdHNrX3N0YWNrICsgNDggYW5kIHdlCisJICogdGFrZSBhbiBleGNlcHRpb24sIHRoZSBzdGFjayBpcyBhbHJlYWR5IGFsaWduZWQgYW5kIHRoZXJlCisJICogd2lsbCBiZSBlbm91Z2ggcm9vbSBTUywgUlNQLCBSRkxBR1MsIENTLCBSSVAsIGFuZCBhCisJICogcG9zc2libGUgZXJyb3IgY29kZSwgc28gYSBzdGFjayBvdmVyZmxvdyB3b3VsZCAqbm90KiBkb3VibGUKKwkgKiBmYXVsdC4gIFdpdGggYW55IGxlc3Mgc3BhY2UgbGVmdCwgZXhjZXB0aW9uIGRlbGl2ZXJ5IGNvdWxkCisJICogZmFpbCwgYW5kLCBhcyBhIHByYWN0aWNhbCBtYXR0ZXIsIHdlJ3ZlIG92ZXJmbG93ZWQgdGhlCisJICogc3RhY2sgZXZlbiBpZiB0aGUgYWN0dWFsIHRyaWdnZXIgZm9yIHRoZSBkb3VibGUgZmF1bHQgd2FzCisJICogc29tZXRoaW5nIGVsc2UuCisJICovCisJY3IyID0gcmVhZF9jcjIoKTsKKwlpZiAoKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKHRzaykgLSAxIC0gY3IyIDwgUEFHRV9TSVpFKQorCQloYW5kbGVfc3RhY2tfb3ZlcmZsb3coImtlcm5lbCBzdGFjayBvdmVyZmxvdyAoZG91YmxlLWZhdWx0KSIsIHJlZ3MsIGNyMik7CisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19ET1VCTEVGQVVMVAogCWRmX2RlYnVnKHJlZ3MsIGVycm9yX2NvZGUpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdHNjLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdHNjLmMKaW5kZXggNzhiOWNiNS4uNDZiMmY0MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3RzYy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC90c2MuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGFzbS94ODZfaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9nZW9kZS5oPgogI2luY2x1ZGUgPGFzbS9hcGljLmg+CisjaW5jbHVkZSA8YXNtL2ludGVsLWZhbWlseS5oPgogCiB1bnNpZ25lZCBpbnQgX19yZWFkX21vc3RseSBjcHVfa2h6OwkvKiBUU0MgY2xvY2tzIC8gdXNlYywgbm90IHVzZWQgaGVyZSAqLwogRVhQT1JUX1NZTUJPTChjcHVfa2h6KTsKQEAgLTY4NiwxMSArNjg3LDE2IEBACiAKIAlpZiAoY3J5c3RhbF9raHogPT0gMCkgewogCQlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2X21vZGVsKSB7Ci0JCWNhc2UgMHg0RToJLyogU0tMICovCi0JCWNhc2UgMHg1RToJLyogU0tMICovCisJCWNhc2UgSU5URUxfRkFNNl9TS1lMQUtFX01PQklMRToKKwkJY2FzZSBJTlRFTF9GQU02X1NLWUxBS0VfREVTS1RPUDoKKwkJY2FzZSBJTlRFTF9GQU02X0tBQllMQUtFX01PQklMRToKKwkJY2FzZSBJTlRFTF9GQU02X0tBQllMQUtFX0RFU0tUT1A6CiAJCQljcnlzdGFsX2toeiA9IDI0MDAwOwkvKiAyNC4wIE1IeiAqLwogCQkJYnJlYWs7Ci0JCWNhc2UgMHg1QzoJLyogQlhUICovCisJCWNhc2UgSU5URUxfRkFNNl9TS1lMQUtFX1g6CisJCQljcnlzdGFsX2toeiA9IDI1MDAwOwkvKiAyNS4wIE1IeiAqLworCQkJYnJlYWs7CisJCWNhc2UgSU5URUxfRkFNNl9BVE9NX0dPTERNT05UOgogCQkJY3J5c3RhbF9raHogPSAxOTIwMDsJLyogMTkuMiBNSHogKi8KIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdW53aW5kX2ZyYW1lLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdW53aW5kX2ZyYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI0NTZkNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2tlcm5lbC91bndpbmRfZnJhbWUuYwpAQCAtMCwwICsxLDkzIEBACisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3Vud2luZC5oPgorCisjZGVmaW5lIEZSQU1FX0hFQURFUl9TSVpFIChzaXplb2YobG9uZykgKiAyKQorCit1bnNpZ25lZCBsb25nIHVud2luZF9nZXRfcmV0dXJuX2FkZHJlc3Moc3RydWN0IHVud2luZF9zdGF0ZSAqc3RhdGUpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCXVuc2lnbmVkIGxvbmcgKmFkZHJfcCA9IHVud2luZF9nZXRfcmV0dXJuX2FkZHJlc3NfcHRyKHN0YXRlKTsKKworCWlmICh1bndpbmRfZG9uZShzdGF0ZSkpCisJCXJldHVybiAwOworCisJYWRkciA9IGZ0cmFjZV9ncmFwaF9yZXRfYWRkcihzdGF0ZS0+dGFzaywgJnN0YXRlLT5ncmFwaF9pZHgsICphZGRyX3AsCisJCQkJICAgICBhZGRyX3ApOworCisJcmV0dXJuIF9fa2VybmVsX3RleHRfYWRkcmVzcyhhZGRyKSA/IGFkZHIgOiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwodW53aW5kX2dldF9yZXR1cm5fYWRkcmVzcyk7CisKK3N0YXRpYyBib29sIHVwZGF0ZV9zdGFja19zdGF0ZShzdHJ1Y3QgdW53aW5kX3N0YXRlICpzdGF0ZSwgdm9pZCAqYWRkciwKKwkJCSAgICAgICBzaXplX3QgbGVuKQoreworCXN0cnVjdCBzdGFja19pbmZvICppbmZvID0gJnN0YXRlLT5zdGFja19pbmZvOworCisJLyoKKwkgKiBJZiBhZGRyIGlzbid0IG9uIHRoZSBjdXJyZW50IHN0YWNrLCBzd2l0Y2ggdG8gdGhlIG5leHQgb25lLgorCSAqCisJICogV2UgbWF5IGhhdmUgdG8gdHJhdmVyc2UgbXVsdGlwbGUgc3RhY2tzIHRvIGRlYWwgd2l0aCB0aGUgcG9zc2liaWxpdHkKKwkgKiB0aGF0ICdpbmZvLT5uZXh0X3NwJyBjb3VsZCBwb2ludCB0byBhbiBlbXB0eSBzdGFjayBhbmQgJ2FkZHInIGNvdWxkCisJICogYmUgb24gYSBzdWJzZXF1ZW50IHN0YWNrLgorCSAqLworCXdoaWxlICghb25fc3RhY2soaW5mbywgYWRkciwgbGVuKSkKKwkJaWYgKGdldF9zdGFja19pbmZvKGluZm8tPm5leHRfc3AsIHN0YXRlLT50YXNrLCBpbmZvLAorCQkJCSAgICZzdGF0ZS0+c3RhY2tfbWFzaykpCisJCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworYm9vbCB1bndpbmRfbmV4dF9mcmFtZShzdHJ1Y3QgdW53aW5kX3N0YXRlICpzdGF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nICpuZXh0X2JwOworCisJaWYgKHVud2luZF9kb25lKHN0YXRlKSkKKwkJcmV0dXJuIGZhbHNlOworCisJbmV4dF9icCA9ICh1bnNpZ25lZCBsb25nICopKnN0YXRlLT5icDsKKworCS8qIG1ha2Ugc3VyZSB0aGUgbmV4dCBmcmFtZSdzIGRhdGEgaXMgYWNjZXNzaWJsZSAqLworCWlmICghdXBkYXRlX3N0YWNrX3N0YXRlKHN0YXRlLCBuZXh0X2JwLCBGUkFNRV9IRUFERVJfU0laRSkpCisJCXJldHVybiBmYWxzZTsKKworCS8qIG1vdmUgdG8gdGhlIG5leHQgZnJhbWUgKi8KKwlzdGF0ZS0+YnAgPSBuZXh0X2JwOworCXJldHVybiB0cnVlOworfQorRVhQT1JUX1NZTUJPTF9HUEwodW53aW5kX25leHRfZnJhbWUpOworCit2b2lkIF9fdW53aW5kX3N0YXJ0KHN0cnVjdCB1bndpbmRfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyAqZmlyc3RfZnJhbWUpCit7CisJbWVtc2V0KHN0YXRlLCAwLCBzaXplb2YoKnN0YXRlKSk7CisJc3RhdGUtPnRhc2sgPSB0YXNrOworCisJLyogZG9uJ3QgZXZlbiBhdHRlbXB0IHRvIHN0YXJ0IGZyb20gdXNlciBtb2RlIHJlZ3MgKi8KKwlpZiAocmVncyAmJiB1c2VyX21vZGUocmVncykpIHsKKwkJc3RhdGUtPnN0YWNrX2luZm8udHlwZSA9IFNUQUNLX1RZUEVfVU5LTk9XTjsKKwkJcmV0dXJuOworCX0KKworCS8qIHNldCB1cCB0aGUgc3RhcnRpbmcgc3RhY2sgZnJhbWUgKi8KKwlzdGF0ZS0+YnAgPSBnZXRfZnJhbWVfcG9pbnRlcih0YXNrLCByZWdzKTsKKworCS8qIGluaXRpYWxpemUgc3RhY2sgaW5mbyBhbmQgbWFrZSBzdXJlIHRoZSBmcmFtZSBkYXRhIGlzIGFjY2Vzc2libGUgKi8KKwlnZXRfc3RhY2tfaW5mbyhzdGF0ZS0+YnAsIHN0YXRlLT50YXNrLCAmc3RhdGUtPnN0YWNrX2luZm8sCisJCSAgICAgICAmc3RhdGUtPnN0YWNrX21hc2spOworCXVwZGF0ZV9zdGFja19zdGF0ZShzdGF0ZSwgc3RhdGUtPmJwLCBGUkFNRV9IRUFERVJfU0laRSk7CisKKwkvKgorCSAqIFRoZSBjYWxsZXIgY2FuIHByb3ZpZGUgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGZyYW1lIGRpcmVjdGx5CisJICogKGZpcnN0X2ZyYW1lKSBvciBpbmRpcmVjdGx5IChyZWdzLT5zcCkgdG8gaW5kaWNhdGUgd2hpY2ggc3RhY2sgZnJhbWUKKwkgKiB0byBzdGFydCB1bndpbmRpbmcgYXQuICBTa2lwIGFoZWFkIHVudGlsIHdlIHJlYWNoIGl0LgorCSAqLworCXdoaWxlICghdW53aW5kX2RvbmUoc3RhdGUpICYmCisJICAgICAgICghb25fc3RhY2soJnN0YXRlLT5zdGFja19pbmZvLCBmaXJzdF9mcmFtZSwgc2l6ZW9mKGxvbmcpKSB8fAorCQkJc3RhdGUtPmJwIDwgZmlyc3RfZnJhbWUpKQorCQl1bndpbmRfbmV4dF9mcmFtZShzdGF0ZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChfX3Vud2luZF9zdGFydCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdW53aW5kX2d1ZXNzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdW53aW5kX2d1ZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhODM0YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2tlcm5lbC91bndpbmRfZ3Vlc3MuYwpAQCAtMCwwICsxLDQzIEBACisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3Vud2luZC5oPgorCitib29sIHVud2luZF9uZXh0X2ZyYW1lKHN0cnVjdCB1bndpbmRfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBzdGFja19pbmZvICppbmZvID0gJnN0YXRlLT5zdGFja19pbmZvOworCisJaWYgKHVud2luZF9kb25lKHN0YXRlKSkKKwkJcmV0dXJuIGZhbHNlOworCisJZG8geworCQlmb3IgKHN0YXRlLT5zcCsrOyBzdGF0ZS0+c3AgPCBpbmZvLT5lbmQ7IHN0YXRlLT5zcCsrKQorCQkJaWYgKF9fa2VybmVsX3RleHRfYWRkcmVzcygqc3RhdGUtPnNwKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKworCQlzdGF0ZS0+c3AgPSBpbmZvLT5uZXh0X3NwOworCisJfSB3aGlsZSAoIWdldF9zdGFja19pbmZvKHN0YXRlLT5zcCwgc3RhdGUtPnRhc2ssIGluZm8sCisJCQkJICZzdGF0ZS0+c3RhY2tfbWFzaykpOworCisJcmV0dXJuIGZhbHNlOworfQorRVhQT1JUX1NZTUJPTF9HUEwodW53aW5kX25leHRfZnJhbWUpOworCit2b2lkIF9fdW53aW5kX3N0YXJ0KHN0cnVjdCB1bndpbmRfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyAqZmlyc3RfZnJhbWUpCit7CisJbWVtc2V0KHN0YXRlLCAwLCBzaXplb2YoKnN0YXRlKSk7CisKKwlzdGF0ZS0+dGFzayA9IHRhc2s7CisJc3RhdGUtPnNwICAgPSBmaXJzdF9mcmFtZTsKKworCWdldF9zdGFja19pbmZvKGZpcnN0X2ZyYW1lLCBzdGF0ZS0+dGFzaywgJnN0YXRlLT5zdGFja19pbmZvLAorCQkgICAgICAgJnN0YXRlLT5zdGFja19tYXNrKTsKKworCWlmICghX19rZXJuZWxfdGV4dF9hZGRyZXNzKCpmaXJzdF9mcmFtZSkpCisJCXVud2luZF9uZXh0X2ZyYW1lKHN0YXRlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fdW53aW5kX3N0YXJ0KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC94ODY2NF9rc3ltc182NC5jIGIvYXJjaC94ODYva2VybmVsL3g4NjY0X2tzeW1zXzY0LmMKaW5kZXggOTVlNDlmNi4uYjJjZWUzZDEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC94ODY2NF9rc3ltc182NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC94ODY2NF9rc3ltc182NC5jCkBAIC0zOCw3ICszOCw3IEBACiBFWFBPUlRfU1lNQk9MKF9jb3B5X2Zyb21fdXNlcik7CiBFWFBPUlRfU1lNQk9MKF9jb3B5X3RvX3VzZXIpOwogCi1FWFBPUlRfU1lNQk9MX0dQTChtZW1jcHlfbWNzYWZlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKG1lbWNweV9tY3NhZmVfdW5yb2xsZWQpOwogCiBFWFBPUlRfU1lNQk9MKGNvcHlfcGFnZSk7CiBFWFBPUlRfU1lNQk9MKGNsZWFyX3BhZ2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3g4Nl9pbml0LmMgYi9hcmNoL3g4Ni9rZXJuZWwveDg2X2luaXQuYwppbmRleCA3NmM1ZTUyLi4wYmQ5ZjEyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwveDg2X2luaXQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwveDg2X2luaXQuYwpAQCAtOTEsNyArOTEsNyBAQAogc3RhdGljIHZvaWQgZGVmYXVsdF9ubWlfaW5pdCh2b2lkKSB7IH07CiBzdGF0aWMgaW50IGRlZmF1bHRfaTgwNDJfZGV0ZWN0KHZvaWQpIHsgcmV0dXJuIDE7IH07CiAKLXN0cnVjdCB4ODZfcGxhdGZvcm1fb3BzIHg4Nl9wbGF0Zm9ybSA9IHsKK3N0cnVjdCB4ODZfcGxhdGZvcm1fb3BzIHg4Nl9wbGF0Zm9ybSBfX3JvX2FmdGVyX2luaXQgPSB7CiAJLmNhbGlicmF0ZV9jcHUJCQk9IG5hdGl2ZV9jYWxpYnJhdGVfY3B1LAogCS5jYWxpYnJhdGVfdHNjCQkJPSBuYXRpdmVfY2FsaWJyYXRlX3RzYywKIAkuZ2V0X3dhbGxjbG9jawkJCT0gbWFjaF9nZXRfY21vc190aW1lLApAQCAtMTA4LDcgKzEwOCw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTCh4ODZfcGxhdGZvcm0pOwogCiAjaWYgZGVmaW5lZChDT05GSUdfUENJX01TSSkKLXN0cnVjdCB4ODZfbXNpX29wcyB4ODZfbXNpID0geworc3RydWN0IHg4Nl9tc2lfb3BzIHg4Nl9tc2kgX19yb19hZnRlcl9pbml0ID0gewogCS5zZXR1cF9tc2lfaXJxcwkJPSBuYXRpdmVfc2V0dXBfbXNpX2lycXMsCiAJLnRlYXJkb3duX21zaV9pcnEJPSBuYXRpdmVfdGVhcmRvd25fbXNpX2lycSwKIAkudGVhcmRvd25fbXNpX2lycXMJPSBkZWZhdWx0X3RlYXJkb3duX21zaV9pcnFzLApAQCAtMTM3LDcgKzEzNyw3IEBACiB9CiAjZW5kaWYKIAotc3RydWN0IHg4Nl9pb19hcGljX29wcyB4ODZfaW9fYXBpY19vcHMgPSB7CitzdHJ1Y3QgeDg2X2lvX2FwaWNfb3BzIHg4Nl9pb19hcGljX29wcyBfX3JvX2FmdGVyX2luaXQgPSB7CiAJLnJlYWQJCQk9IG5hdGl2ZV9pb19hcGljX3JlYWQsCiAJLmRpc2FibGUJCT0gbmF0aXZlX2Rpc2FibGVfaW9fYXBpYywKIH07CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vTWFrZWZpbGUgYi9hcmNoL3g4Ni9rdm0vTWFrZWZpbGUKaW5kZXggNDY0ZmE0Ny4uM2JmZjIwNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L2t2bS9NYWtlZmlsZQpAQCAtMTMsNyArMTMsNyBAQAogCiBrdm0teQkJCSs9IHg4Ni5vIG1tdS5vIGVtdWxhdGUubyBpODI1OS5vIGlycS5vIGxhcGljLm8gXAogCQkJICAgaTgyNTQubyBpb2FwaWMubyBpcnFfY29tbS5vIGNwdWlkLm8gcG11Lm8gbXRyci5vIFwKLQkJCSAgIGh5cGVydi5vIHBhZ2VfdHJhY2subworCQkJICAgaHlwZXJ2Lm8gcGFnZV90cmFjay5vIGRlYnVnZnMubwogCiBrdm0tJChDT05GSUdfS1ZNX0RFVklDRV9BU1NJR05NRU5UKQkrPSBhc3NpZ25lZC1kZXYubyBpb21tdS5vCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9jcHVpZC5jIGIvYXJjaC94ODYva3ZtL2NwdWlkLmMKaW5kZXggMzIzNWUwZi4uYWZhN2JiYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2NwdWlkLmMKKysrIGIvYXJjaC94ODYva3ZtL2NwdWlkLmMKQEAgLTM2Niw3ICszNjYsOCBAQAogCQlGKEZTR1NCQVNFKSB8IEYoQk1JMSkgfCBGKEhMRSkgfCBGKEFWWDIpIHwgRihTTUVQKSB8CiAJCUYoQk1JMikgfCBGKEVSTVMpIHwgZl9pbnZwY2lkIHwgRihSVE0pIHwgZl9tcHggfCBGKFJEU0VFRCkgfAogCQlGKEFEWCkgfCBGKFNNQVApIHwgRihBVlg1MTJGKSB8IEYoQVZYNTEyUEYpIHwgRihBVlg1MTJFUikgfAotCQlGKEFWWDUxMkNEKSB8IEYoQ0xGTFVTSE9QVCkgfCBGKENMV0IpOworCQlGKEFWWDUxMkNEKSB8IEYoQ0xGTFVTSE9QVCkgfCBGKENMV0IpIHwgRihBVlg1MTJEUSkgfAorCQlGKEFWWDUxMkJXKSB8IEYoQVZYNTEyVkwpOwogCiAJLyogY3B1aWQgMHhELjEuZWF4ICovCiAJY29uc3QgdTMyIGt2bV9jcHVpZF9EXzFfZWF4X3g4Nl9mZWF0dXJlcyA9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vZGVidWdmcy5jIGIvYXJjaC94ODYva3ZtL2RlYnVnZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTljN2VkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYva3ZtL2RlYnVnZnMuYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogS2VybmVsLWJhc2VkIFZpcnR1YWwgTWFjaGluZSBkcml2ZXIgZm9yIExpbnV4CisgKgorICogQ29weXJpZ2h0IDIwMTYgUmVkIEhhdCwgSW5jLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuCisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVyc2lvbiAyLiAgU2VlCisgKiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorCitib29sIGt2bV9hcmNoX2hhc192Y3B1X2RlYnVnZnModm9pZCkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludCB2Y3B1X2dldF90c2Nfb2Zmc2V0KHZvaWQgKmRhdGEsIHU2NCAqdmFsKQoreworCXN0cnVjdCBrdm1fdmNwdSAqdmNwdSA9IChzdHJ1Y3Qga3ZtX3ZjcHUgKikgZGF0YTsKKwkqdmFsID0gdmNwdS0+YXJjaC50c2Nfb2Zmc2V0OworCXJldHVybiAwOworfQorCitERUZJTkVfU0lNUExFX0FUVFJJQlVURSh2Y3B1X3RzY19vZmZzZXRfZm9wcywgdmNwdV9nZXRfdHNjX29mZnNldCwgTlVMTCwgIiVsbGRcbiIpOworCitzdGF0aWMgaW50IHZjcHVfZ2V0X3RzY19zY2FsaW5nX3JhdGlvKHZvaWQgKmRhdGEsIHU2NCAqdmFsKQoreworCXN0cnVjdCBrdm1fdmNwdSAqdmNwdSA9IChzdHJ1Y3Qga3ZtX3ZjcHUgKikgZGF0YTsKKwkqdmFsID0gdmNwdS0+YXJjaC50c2Nfc2NhbGluZ19yYXRpbzsKKwlyZXR1cm4gMDsKK30KKworREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUodmNwdV90c2Nfc2NhbGluZ19mb3BzLCB2Y3B1X2dldF90c2Nfc2NhbGluZ19yYXRpbywgTlVMTCwgIiVsbHVcbiIpOworCitzdGF0aWMgaW50IHZjcHVfZ2V0X3RzY19zY2FsaW5nX2ZyYWNfYml0cyh2b2lkICpkYXRhLCB1NjQgKnZhbCkKK3sKKwkqdmFsID0ga3ZtX3RzY19zY2FsaW5nX3JhdGlvX2ZyYWNfYml0czsKKwlyZXR1cm4gMDsKK30KKworREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUodmNwdV90c2Nfc2NhbGluZ19mcmFjX2ZvcHMsIHZjcHVfZ2V0X3RzY19zY2FsaW5nX2ZyYWNfYml0cywgTlVMTCwgIiVsbHVcbiIpOworCitpbnQga3ZtX2FyY2hfY3JlYXRlX3ZjcHVfZGVidWdmcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJc3RydWN0IGRlbnRyeSAqcmV0OworCisJcmV0ID0gZGVidWdmc19jcmVhdGVfZmlsZSgidHNjLW9mZnNldCIsIDA0NDQsCisJCQkJCQkJdmNwdS0+ZGVidWdmc19kZW50cnksCisJCQkJCQkJdmNwdSwgJnZjcHVfdHNjX29mZnNldF9mb3BzKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoa3ZtX2hhc190c2NfY29udHJvbCkgeworCQlyZXQgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJ0c2Mtc2NhbGluZy1yYXRpbyIsIDA0NDQsCisJCQkJCQkJdmNwdS0+ZGVidWdmc19kZW50cnksCisJCQkJCQkJdmNwdSwgJnZjcHVfdHNjX3NjYWxpbmdfZm9wcyk7CisJCWlmICghcmV0KQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXJldCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInRzYy1zY2FsaW5nLXJhdGlvLWZyYWMtYml0cyIsIDA0NDQsCisJCQkJCQkJdmNwdS0+ZGVidWdmc19kZW50cnksCisJCQkJCQkJdmNwdSwgJnZjcHVfdHNjX3NjYWxpbmdfZnJhY19mb3BzKTsKKwkJaWYgKCFyZXQpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL2h5cGVydi5jIGIvYXJjaC94ODYva3ZtL2h5cGVydi5jCmluZGV4IDAxYmQ3YjcuLjQyYjFjODMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9oeXBlcnYuYworKysgYi9hcmNoL3g4Ni9rdm0vaHlwZXJ2LmMKQEAgLTM4Niw3ICszODYsMjEgQEAKIAogc3RhdGljIHU2NCBnZXRfdGltZV9yZWZfY291bnRlcihzdHJ1Y3Qga3ZtICprdm0pCiB7Ci0JcmV0dXJuIGRpdl91NjQoZ2V0X2tlcm5lbF9ucygpICsga3ZtLT5hcmNoLmt2bWNsb2NrX29mZnNldCwgMTAwKTsKKwlzdHJ1Y3Qga3ZtX2h2ICpodiA9ICZrdm0tPmFyY2guaHlwZXJ2OworCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTsKKwl1NjQgdHNjOworCisJLyoKKwkgKiBUaGUgZ3Vlc3QgaGFzIG5vdCBzZXQgdXAgdGhlIFRTQyBwYWdlIG9yIHRoZSBjbG9jayBpc24ndAorCSAqIHN0YWJsZSwgZmFsbCBiYWNrIHRvIGdldF9rdm1jbG9ja19ucy4KKwkgKi8KKwlpZiAoIWh2LT50c2NfcmVmLnRzY19zZXF1ZW5jZSkKKwkJcmV0dXJuIGRpdl91NjQoZ2V0X2t2bWNsb2NrX25zKGt2bSksIDEwMCk7CisKKwl2Y3B1ID0ga3ZtX2dldF92Y3B1KGt2bSwgMCk7CisJdHNjID0ga3ZtX3JlYWRfbDFfdHNjKHZjcHUsIHJkdHNjKCkpOworCXJldHVybiBtdWxfdTY0X3U2NF9zaHIodHNjLCBodi0+dHNjX3JlZi50c2Nfc2NhbGUsIDY0KQorCQkrIGh2LT50c2NfcmVmLnRzY19vZmZzZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIHN0aW1lcl9tYXJrX3BlbmRpbmcoc3RydWN0IGt2bV92Y3B1X2h2X3N0aW1lciAqc3RpbWVyLApAQCAtNzU2LDYgKzc3MCwxMjkgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIFRoZSBrdm1jbG9jayBhbmQgSHlwZXItViBUU0MgcGFnZSB1c2Ugc2ltaWxhciBmb3JtdWxhcywgYW5kIGNvbnZlcnRpbmcKKyAqIGJldHdlZW4gdGhlbSBpcyBwb3NzaWJsZToKKyAqCisgKiBrdm1jbG9jayBmb3JtdWxhOgorICogICAgbnNlYyA9ICh0aWNrcyAtIHRzY190aW1lc3RhbXApICogdHNjX3RvX3N5c3RlbV9tdWwgKiAyXih0c2Nfc2hpZnQtMzIpCisgKiAgICAgICAgICAgKyBzeXN0ZW1fdGltZQorICoKKyAqIEh5cGVyLVYgZm9ybXVsYToKKyAqICAgIG5zZWMvMTAwID0gdGlja3MgKiBzY2FsZSAvIDJeNjQgKyBvZmZzZXQKKyAqCisgKiBXaGVuIHRzY190aW1lc3RhbXAgPSBzeXN0ZW1fdGltZSA9IDAsIG9mZnNldCBpcyB6ZXJvIGluIHRoZSBIeXBlci1WIGZvcm11bGEuCisgKiBCeSBkaXZpZGluZyB0aGUga3ZtY2xvY2sgZm9ybXVsYSBieSAxMDAgYW5kIGVxdWF0aW5nIHdoYXQncyBsZWZ0IHdlIGdldDoKKyAqICAgIHRpY2tzICogc2NhbGUgLyAyXjY0ID0gdGlja3MgKiB0c2NfdG9fc3lzdGVtX211bCAqIDJeKHRzY19zaGlmdC0zMikgLyAxMDAKKyAqICAgICAgICAgICAgc2NhbGUgLyAyXjY0ID0gICAgICAgICB0c2NfdG9fc3lzdGVtX211bCAqIDJeKHRzY19zaGlmdC0zMikgLyAxMDAKKyAqICAgICAgICAgICAgc2NhbGUgICAgICAgID0gICAgICAgICB0c2NfdG9fc3lzdGVtX211bCAqIDJeKDMyK3RzY19zaGlmdCkgLyAxMDAKKyAqCisgKiBOb3cgZXhwYW5kIHRoZSBrdm1jbG9jayBmb3JtdWxhIGFuZCBkaXZpZGUgYnkgMTAwOgorICogICAgbnNlYyA9IHRpY2tzICogdHNjX3RvX3N5c3RlbV9tdWwgKiAyXih0c2Nfc2hpZnQtMzIpCisgKiAgICAgICAgICAgLSB0c2NfdGltZXN0YW1wICogdHNjX3RvX3N5c3RlbV9tdWwgKiAyXih0c2Nfc2hpZnQtMzIpCisgKiAgICAgICAgICAgKyBzeXN0ZW1fdGltZQorICogICAgbnNlYy8xMDAgPSB0aWNrcyAqIHRzY190b19zeXN0ZW1fbXVsICogMl4odHNjX3NoaWZ0LTMyKSAvIDEwMAorICogICAgICAgICAgICAgICAtIHRzY190aW1lc3RhbXAgKiB0c2NfdG9fc3lzdGVtX211bCAqIDJeKHRzY19zaGlmdC0zMikgLyAxMDAKKyAqICAgICAgICAgICAgICAgKyBzeXN0ZW1fdGltZSAvIDEwMAorICoKKyAqIFJlcGxhY2UgdHNjX3RvX3N5c3RlbV9tdWwgKiAyXih0c2Nfc2hpZnQtMzIpIC8gMTAwIGJ5IHNjYWxlIC8gMl42NDoKKyAqICAgIG5zZWMvMTAwID0gdGlja3MgKiBzY2FsZSAvIDJeNjQKKyAqICAgICAgICAgICAgICAgLSB0c2NfdGltZXN0YW1wICogc2NhbGUgLyAyXjY0CisgKiAgICAgICAgICAgICAgICsgc3lzdGVtX3RpbWUgLyAxMDAKKyAqCisgKiBFcXVhdGUgd2l0aCB0aGUgSHlwZXItViBmb3JtdWxhIHNvIHRoYXQgdGlja3MgKiBzY2FsZSAvIDJeNjQgY2FuY2VscyBvdXQ6CisgKiAgICBvZmZzZXQgPSBzeXN0ZW1fdGltZSAvIDEwMCAtIHRzY190aW1lc3RhbXAgKiBzY2FsZSAvIDJeNjQKKyAqCisgKiBUaGVzZSB0d28gZXF1aXZhbGVuY2llcyBhcmUgaW1wbGVtZW50ZWQgaW4gdGhpcyBmdW5jdGlvbi4KKyAqLworc3RhdGljIGJvb2wgY29tcHV0ZV90c2NfcGFnZV9wYXJhbWV0ZXJzKHN0cnVjdCBwdmNsb2NrX3ZjcHVfdGltZV9pbmZvICpodl9jbG9jaywKKwkJCQkJSFZfUkVGRVJFTkNFX1RTQ19QQUdFICp0c2NfcmVmKQoreworCXU2NCBtYXhfbXVsOworCisJaWYgKCEoaHZfY2xvY2stPmZsYWdzICYgUFZDTE9DS19UU0NfU1RBQkxFX0JJVCkpCisJCXJldHVybiBmYWxzZTsKKworCS8qCisJICogY2hlY2sgaWYgc2NhbGUgd291bGQgb3ZlcmZsb3csIGlmIHNvIHdlIHVzZSB0aGUgdGltZSByZWYgY291bnRlcgorCSAqICAgIHRzY190b19zeXN0ZW1fbXVsICogMl4odHNjX3NoaWZ0KzMyKSAvIDEwMCA+PSAyXjY0CisJICogICAgdHNjX3RvX3N5c3RlbV9tdWwgLyAxMDAgPj0gMl4oMzItdHNjX3NoaWZ0KQorCSAqICAgIHRzY190b19zeXN0ZW1fbXVsID49IDEwMCAqIDJeKDMyLXRzY19zaGlmdCkKKwkgKi8KKwltYXhfbXVsID0gMTAwdWxsIDw8ICgzMiAtIGh2X2Nsb2NrLT50c2Nfc2hpZnQpOworCWlmIChodl9jbG9jay0+dHNjX3RvX3N5c3RlbV9tdWwgPj0gbWF4X211bCkKKwkJcmV0dXJuIGZhbHNlOworCisJLyoKKwkgKiBPdGhlcndpc2UgY29tcHV0ZSB0aGUgc2NhbGUgYW5kIG9mZnNldCBhY2NvcmRpbmcgdG8gdGhlIGZvcm11bGFzCisJICogZGVyaXZlZCBhYm92ZS4KKwkgKi8KKwl0c2NfcmVmLT50c2Nfc2NhbGUgPQorCQltdWxfdTY0X3UzMl9kaXYoMVVMTCA8PCAoMzIgKyBodl9jbG9jay0+dHNjX3NoaWZ0KSwKKwkJCQlodl9jbG9jay0+dHNjX3RvX3N5c3RlbV9tdWwsCisJCQkJMTAwKTsKKworCXRzY19yZWYtPnRzY19vZmZzZXQgPSBodl9jbG9jay0+c3lzdGVtX3RpbWU7CisJZG9fZGl2KHRzY19yZWYtPnRzY19vZmZzZXQsIDEwMCk7CisJdHNjX3JlZi0+dHNjX29mZnNldCAtPQorCQltdWxfdTY0X3U2NF9zaHIoaHZfY2xvY2stPnRzY190aW1lc3RhbXAsIHRzY19yZWYtPnRzY19zY2FsZSwgNjQpOworCXJldHVybiB0cnVlOworfQorCit2b2lkIGt2bV9odl9zZXR1cF90c2NfcGFnZShzdHJ1Y3Qga3ZtICprdm0sCisJCQkgICBzdHJ1Y3QgcHZjbG9ja192Y3B1X3RpbWVfaW5mbyAqaHZfY2xvY2spCit7CisJc3RydWN0IGt2bV9odiAqaHYgPSAma3ZtLT5hcmNoLmh5cGVydjsKKwl1MzIgdHNjX3NlcTsKKwl1NjQgZ2ZuOworCisJQlVJTERfQlVHX09OKHNpemVvZih0c2Nfc2VxKSAhPSBzaXplb2YoaHYtPnRzY19yZWYudHNjX3NlcXVlbmNlKSk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKEhWX1JFRkVSRU5DRV9UU0NfUEFHRSwgdHNjX3NlcXVlbmNlKSAhPSAwKTsKKworCWlmICghKGh2LT5odl90c2NfcGFnZSAmIEhWX1g2NF9NU1JfVFNDX1JFRkVSRU5DRV9FTkFCTEUpKQorCQlyZXR1cm47CisKKwlnZm4gPSBodi0+aHZfdHNjX3BhZ2UgPj4gSFZfWDY0X01TUl9UU0NfUkVGRVJFTkNFX0FERFJFU1NfU0hJRlQ7CisJLyoKKwkgKiBCZWNhdXNlIHRoZSBUU0MgcGFyYW1ldGVycyBvbmx5IHZhcnkgd2hlbiB0aGVyZSBpcyBhCisJICogY2hhbmdlIGluIHRoZSBtYXN0ZXIgY2xvY2ssIGRvIG5vdCBib3RoZXIgd2l0aCBjYWNoaW5nLgorCSAqLworCWlmICh1bmxpa2VseShrdm1fcmVhZF9ndWVzdChrdm0sIGdmbl90b19ncGEoZ2ZuKSwKKwkJCQkgICAgJnRzY19zZXEsIHNpemVvZih0c2Nfc2VxKSkpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFdoaWxlIHdlJ3JlIGNvbXB1dGluZyBhbmQgd3JpdGluZyB0aGUgcGFyYW1ldGVycywgZm9yY2UgdGhlCisJICogZ3Vlc3QgdG8gdXNlIHRoZSB0aW1lIHJlZmVyZW5jZSBjb3VudCBNU1IuCisJICovCisJaHYtPnRzY19yZWYudHNjX3NlcXVlbmNlID0gMDsKKwlpZiAoa3ZtX3dyaXRlX2d1ZXN0KGt2bSwgZ2ZuX3RvX2dwYShnZm4pLAorCQkJICAgICZodi0+dHNjX3JlZiwgc2l6ZW9mKGh2LT50c2NfcmVmLnRzY19zZXF1ZW5jZSkpKQorCQlyZXR1cm47CisKKwlpZiAoIWNvbXB1dGVfdHNjX3BhZ2VfcGFyYW1ldGVycyhodl9jbG9jaywgJmh2LT50c2NfcmVmKSkKKwkJcmV0dXJuOworCisJLyogRW5zdXJlIHNlcXVlbmNlIGlzIHplcm8gYmVmb3JlIHdyaXRpbmcgdGhlIHJlc3Qgb2YgdGhlIHN0cnVjdC4gICovCisJc21wX3dtYigpOworCWlmIChrdm1fd3JpdGVfZ3Vlc3Qoa3ZtLCBnZm5fdG9fZ3BhKGdmbiksICZodi0+dHNjX3JlZiwgc2l6ZW9mKGh2LT50c2NfcmVmKSkpCisJCXJldHVybjsKKworCS8qCisJICogTm93IHN3aXRjaCB0byB0aGUgVFNDIHBhZ2UgbWVjaGFuaXNtIGJ5IHdyaXRpbmcgdGhlIHNlcXVlbmNlLgorCSAqLworCXRzY19zZXErKzsKKwlpZiAodHNjX3NlcSA9PSAweEZGRkZGRkZGIHx8IHRzY19zZXEgPT0gMCkKKwkJdHNjX3NlcSA9IDE7CisKKwkvKiBXcml0ZSB0aGUgc3RydWN0IGVudGlyZWx5IGJlZm9yZSB0aGUgbm9uLXplcm8gc2VxdWVuY2UuICAqLworCXNtcF93bWIoKTsKKworCWh2LT50c2NfcmVmLnRzY19zZXF1ZW5jZSA9IHRzY19zZXE7CisJa3ZtX3dyaXRlX2d1ZXN0KGt2bSwgZ2ZuX3RvX2dwYShnZm4pLAorCQkJJmh2LT50c2NfcmVmLCBzaXplb2YoaHYtPnRzY19yZWYudHNjX3NlcXVlbmNlKSk7Cit9CisKIHN0YXRpYyBpbnQga3ZtX2h2X3NldF9tc3JfcHcoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1MzIgbXNyLCB1NjQgZGF0YSwKIAkJCSAgICAgYm9vbCBob3N0KQogewpAQCAtNzkzLDIzICs5MzAsMTEgQEAKIAkJbWFya19wYWdlX2RpcnR5KGt2bSwgZ2ZuKTsKIAkJYnJlYWs7CiAJfQotCWNhc2UgSFZfWDY0X01TUl9SRUZFUkVOQ0VfVFNDOiB7Ci0JCXU2NCBnZm47Ci0JCUhWX1JFRkVSRU5DRV9UU0NfUEFHRSB0c2NfcmVmOwotCi0JCW1lbXNldCgmdHNjX3JlZiwgMCwgc2l6ZW9mKHRzY19yZWYpKTsKKwljYXNlIEhWX1g2NF9NU1JfUkVGRVJFTkNFX1RTQzoKIAkJaHYtPmh2X3RzY19wYWdlID0gZGF0YTsKLQkJaWYgKCEoZGF0YSAmIEhWX1g2NF9NU1JfVFNDX1JFRkVSRU5DRV9FTkFCTEUpKQotCQkJYnJlYWs7Ci0JCWdmbiA9IGRhdGEgPj4gSFZfWDY0X01TUl9UU0NfUkVGRVJFTkNFX0FERFJFU1NfU0hJRlQ7Ci0JCWlmIChrdm1fd3JpdGVfZ3Vlc3QoCi0JCQkJa3ZtLAotCQkJCWdmbiA8PCBIVl9YNjRfTVNSX1RTQ19SRUZFUkVOQ0VfQUREUkVTU19TSElGVCwKLQkJCQkmdHNjX3JlZiwgc2l6ZW9mKHRzY19yZWYpKSkKLQkJCXJldHVybiAxOwotCQltYXJrX3BhZ2VfZGlydHkoa3ZtLCBnZm4pOworCQlpZiAoaHYtPmh2X3RzY19wYWdlICYgSFZfWDY0X01TUl9UU0NfUkVGRVJFTkNFX0VOQUJMRSkKKwkJCWt2bV9tYWtlX3JlcXVlc3QoS1ZNX1JFUV9NQVNURVJDTE9DS19VUERBVEUsIHZjcHUpOwogCQlicmVhazsKLQl9CiAJY2FzZSBIVl9YNjRfTVNSX0NSQVNIX1AwIC4uLiBIVl9YNjRfTVNSX0NSQVNIX1A0OgogCQlyZXR1cm4ga3ZtX2h2X21zcl9zZXRfY3Jhc2hfZGF0YSh2Y3B1LAogCQkJCQkJIG1zciAtIEhWX1g2NF9NU1JfQ1JBU0hfUDAsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vaHlwZXJ2LmggYi9hcmNoL3g4Ni9rdm0vaHlwZXJ2LmgKaW5kZXggNjBlY2NkNC4uY2QxMTE5NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2h5cGVydi5oCisrKyBiL2FyY2gveDg2L2t2bS9oeXBlcnYuaApAQCAtODQsNCArODQsNyBAQAogCiB2b2lkIGt2bV9odl9wcm9jZXNzX3N0aW1lcnMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIAordm9pZCBrdm1faHZfc2V0dXBfdHNjX3BhZ2Uoc3RydWN0IGt2bSAqa3ZtLAorCQkJICAgc3RydWN0IHB2Y2xvY2tfdmNwdV90aW1lX2luZm8gKmh2X2Nsb2NrKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vaW9hcGljLmMgYi9hcmNoL3g4Ni9rdm0vaW9hcGljLmMKaW5kZXggNWY0MmQwMy4uYzcyMjBiYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2lvYXBpYy5jCisrKyBiL2FyY2gveDg2L2t2bS9pb2FwaWMuYwpAQCAtMTA5LDYgKzEwOSw3IEBACiB7CiAJYm9vbCBuZXdfdmFsLCBvbGRfdmFsOwogCXN0cnVjdCBrdm1faW9hcGljICppb2FwaWMgPSB2Y3B1LT5rdm0tPmFyY2gudmlvYXBpYzsKKwlzdHJ1Y3QgZGVzdF9tYXAgKmRlc3RfbWFwID0gJmlvYXBpYy0+cnRjX3N0YXR1cy5kZXN0X21hcDsKIAl1bmlvbiBrdm1faW9hcGljX3JlZGlyZWN0X2VudHJ5ICplOwogCiAJZSA9ICZpb2FwaWMtPnJlZGlydGJsW1JUQ19HU0ldOwpAQCAtMTE3LDE2ICsxMTgsMTcgQEAKIAkJcmV0dXJuOwogCiAJbmV3X3ZhbCA9IGt2bV9hcGljX3BlbmRpbmdfZW9pKHZjcHUsIGUtPmZpZWxkcy52ZWN0b3IpOwotCW9sZF92YWwgPSB0ZXN0X2JpdCh2Y3B1LT52Y3B1X2lkLCBpb2FwaWMtPnJ0Y19zdGF0dXMuZGVzdF9tYXAubWFwKTsKKwlvbGRfdmFsID0gdGVzdF9iaXQodmNwdS0+dmNwdV9pZCwgZGVzdF9tYXAtPm1hcCk7CiAKIAlpZiAobmV3X3ZhbCA9PSBvbGRfdmFsKQogCQlyZXR1cm47CiAKIAlpZiAobmV3X3ZhbCkgewotCQlfX3NldF9iaXQodmNwdS0+dmNwdV9pZCwgaW9hcGljLT5ydGNfc3RhdHVzLmRlc3RfbWFwLm1hcCk7CisJCV9fc2V0X2JpdCh2Y3B1LT52Y3B1X2lkLCBkZXN0X21hcC0+bWFwKTsKKwkJZGVzdF9tYXAtPnZlY3RvcnNbdmNwdS0+dmNwdV9pZF0gPSBlLT5maWVsZHMudmVjdG9yOwogCQlpb2FwaWMtPnJ0Y19zdGF0dXMucGVuZGluZ19lb2krKzsKIAl9IGVsc2UgewotCQlfX2NsZWFyX2JpdCh2Y3B1LT52Y3B1X2lkLCBpb2FwaWMtPnJ0Y19zdGF0dXMuZGVzdF9tYXAubWFwKTsKKwkJX19jbGVhcl9iaXQodmNwdS0+dmNwdV9pZCwgZGVzdF9tYXAtPm1hcCk7CiAJCWlvYXBpYy0+cnRjX3N0YXR1cy5wZW5kaW5nX2VvaS0tOwogCQlydGNfc3RhdHVzX3BlbmRpbmdfZW9pX2NoZWNrX3ZhbGlkKGlvYXBpYyk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL2xhcGljLmMgYi9hcmNoL3g4Ni9rdm0vbGFwaWMuYwppbmRleCBiNjJjODUyLi4yM2I5OWYzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vbGFwaWMuYworKysgYi9hcmNoL3g4Ni9rdm0vbGFwaWMuYwpAQCAtMTc2MSw5ICsxNzYxLDEwIEBACiAJCWlmICh2YWx1ZSAmIE1TUl9JQTMyX0FQSUNCQVNFX0VOQUJMRSkgewogCQkJa3ZtX2FwaWNfc2V0X3hhcGljX2lkKGFwaWMsIHZjcHUtPnZjcHVfaWQpOwogCQkJc3RhdGljX2tleV9zbG93X2RlY19kZWZlcnJlZCgmYXBpY19od19kaXNhYmxlZCk7Ci0JCX0gZWxzZQorCQl9IGVsc2UgewogCQkJc3RhdGljX2tleV9zbG93X2luYygmYXBpY19od19kaXNhYmxlZC5rZXkpOwotCQlyZWNhbGN1bGF0ZV9hcGljX21hcCh2Y3B1LT5rdm0pOworCQkJcmVjYWxjdWxhdGVfYXBpY19tYXAodmNwdS0+a3ZtKTsKKwkJfQogCX0KIAogCWlmICgob2xkX3ZhbHVlIF4gdmFsdWUpICYgWDJBUElDX0VOQUJMRSkgewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL21tdS5jIGIvYXJjaC94ODYva3ZtL21tdS5jCmluZGV4IDNkNGNjOGNjLi5kOWM3ZTk4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vbW11LmMKKysrIGIvYXJjaC94ODYva3ZtL21tdS5jCkBAIC0xMjA3LDcgKzEyMDcsNyBAQAogICoKICAqIFJldHVybiB0cnVlIGlmIHRsYiBuZWVkIGJlIGZsdXNoZWQuCiAgKi8KLXN0YXRpYyBib29sIHNwdGVfd3JpdGVfcHJvdGVjdChzdHJ1Y3Qga3ZtICprdm0sIHU2NCAqc3B0ZXAsIGJvb2wgcHRfcHJvdGVjdCkKK3N0YXRpYyBib29sIHNwdGVfd3JpdGVfcHJvdGVjdCh1NjQgKnNwdGVwLCBib29sIHB0X3Byb3RlY3QpCiB7CiAJdTY0IHNwdGUgPSAqc3B0ZXA7CiAKQEAgLTEyMzMsMTIgKzEyMzMsMTIgQEAKIAlib29sIGZsdXNoID0gZmFsc2U7CiAKIAlmb3JfZWFjaF9ybWFwX3NwdGUocm1hcF9oZWFkLCAmaXRlciwgc3B0ZXApCi0JCWZsdXNoIHw9IHNwdGVfd3JpdGVfcHJvdGVjdChrdm0sIHNwdGVwLCBwdF9wcm90ZWN0KTsKKwkJZmx1c2ggfD0gc3B0ZV93cml0ZV9wcm90ZWN0KHNwdGVwLCBwdF9wcm90ZWN0KTsKIAogCXJldHVybiBmbHVzaDsKIH0KIAotc3RhdGljIGJvb2wgc3B0ZV9jbGVhcl9kaXJ0eShzdHJ1Y3Qga3ZtICprdm0sIHU2NCAqc3B0ZXApCitzdGF0aWMgYm9vbCBzcHRlX2NsZWFyX2RpcnR5KHU2NCAqc3B0ZXApCiB7CiAJdTY0IHNwdGUgPSAqc3B0ZXA7CiAKQEAgLTEyNTYsMTIgKzEyNTYsMTIgQEAKIAlib29sIGZsdXNoID0gZmFsc2U7CiAKIAlmb3JfZWFjaF9ybWFwX3NwdGUocm1hcF9oZWFkLCAmaXRlciwgc3B0ZXApCi0JCWZsdXNoIHw9IHNwdGVfY2xlYXJfZGlydHkoa3ZtLCBzcHRlcCk7CisJCWZsdXNoIHw9IHNwdGVfY2xlYXJfZGlydHkoc3B0ZXApOwogCiAJcmV0dXJuIGZsdXNoOwogfQogCi1zdGF0aWMgYm9vbCBzcHRlX3NldF9kaXJ0eShzdHJ1Y3Qga3ZtICprdm0sIHU2NCAqc3B0ZXApCitzdGF0aWMgYm9vbCBzcHRlX3NldF9kaXJ0eSh1NjQgKnNwdGVwKQogewogCXU2NCBzcHRlID0gKnNwdGVwOwogCkBAIC0xMjc5LDcgKzEyNzksNyBAQAogCWJvb2wgZmx1c2ggPSBmYWxzZTsKIAogCWZvcl9lYWNoX3JtYXBfc3B0ZShybWFwX2hlYWQsICZpdGVyLCBzcHRlcCkKLQkJZmx1c2ggfD0gc3B0ZV9zZXRfZGlydHkoa3ZtLCBzcHRlcCk7CisJCWZsdXNoIHw9IHNwdGVfc2V0X2RpcnR5KHNwdGVwKTsKIAogCXJldHVybiBmbHVzaDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9wbXVfYW1kLmMgYi9hcmNoL3g4Ni9rdm0vcG11X2FtZC5jCmluZGV4IDM5YjkxMTIuLmNkOTQ0NDMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9wbXVfYW1kLmMKKysrIGIvYXJjaC94ODYva3ZtL3BtdV9hbWQuYwpAQCAtMjMsOCArMjMsOCBAQAogc3RhdGljIHN0cnVjdCBrdm1fZXZlbnRfaHdfdHlwZV9tYXBwaW5nIGFtZF9ldmVudF9tYXBwaW5nW10gPSB7CiAJWzBdID0geyAweDc2LCAweDAwLCBQRVJGX0NPVU5UX0hXX0NQVV9DWUNMRVMgfSwKIAlbMV0gPSB7IDB4YzAsIDB4MDAsIFBFUkZfQ09VTlRfSFdfSU5TVFJVQ1RJT05TIH0sCi0JWzJdID0geyAweDgwLCAweDAwLCBQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFRkVSRU5DRVMgfSwKLQlbM10gPSB7IDB4ODEsIDB4MDAsIFBFUkZfQ09VTlRfSFdfQ0FDSEVfTUlTU0VTIH0sCisJWzJdID0geyAweDdkLCAweDA3LCBQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFRkVSRU5DRVMgfSwKKwlbM10gPSB7IDB4N2UsIDB4MDcsIFBFUkZfQ09VTlRfSFdfQ0FDSEVfTUlTU0VTIH0sCiAJWzRdID0geyAweGMyLCAweDAwLCBQRVJGX0NPVU5UX0hXX0JSQU5DSF9JTlNUUlVDVElPTlMgfSwKIAlbNV0gPSB7IDB4YzMsIDB4MDAsIFBFUkZfQ09VTlRfSFdfQlJBTkNIX01JU1NFUyB9LAogCVs2XSA9IHsgMHhkMCwgMHgwMCwgUEVSRl9DT1VOVF9IV19TVEFMTEVEX0NZQ0xFU19GUk9OVEVORCB9LApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL3N2bS5jIGIvYXJjaC94ODYva3ZtL3N2bS5jCmluZGV4IGFmNTIzZDguLmY4MTU3YTMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9zdm0uYworKysgYi9hcmNoL3g4Ni9rdm0vc3ZtLmMKQEAgLTM0LDYgKzM0LDggQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3RyYWNlX2V2ZW50cy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWQtaW9tbXUuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXNodGFibGUuaD4KIAogI2luY2x1ZGUgPGFzbS9hcGljLmg+CiAjaW5jbHVkZSA8YXNtL3BlcmZfZXZlbnQuaD4KQEAgLTQxLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxhc20vZGVzYy5oPgogI2luY2x1ZGUgPGFzbS9kZWJ1Z3JlZy5oPgogI2luY2x1ZGUgPGFzbS9rdm1fcGFyYS5oPgorI2luY2x1ZGUgPGFzbS9pcnFfcmVtYXBwaW5nLmg+CiAKICNpbmNsdWRlIDxhc20vdmlydGV4dC5oPgogI2luY2x1ZGUgInRyYWNlLmgiCkBAIC05Niw2ICs5OSwxOSBAQAogI2RlZmluZSBBVklDX1VOQUNDRUxfQUNDRVNTX09GRlNFVF9NQVNLCQkweEZGMAogI2RlZmluZSBBVklDX1VOQUNDRUxfQUNDRVNTX1ZFQ1RPUl9NQVNLCQkweEZGRkZGRkZGCiAKKy8qIEFWSUMgR0FUQUcgaXMgZW5jb2RlZCB1c2luZyBWTSBhbmQgVkNQVSBJRHMgKi8KKyNkZWZpbmUgQVZJQ19WQ1BVX0lEX0JJVFMJCTgKKyNkZWZpbmUgQVZJQ19WQ1BVX0lEX01BU0sJCSgoMSA8PCBBVklDX1ZDUFVfSURfQklUUykgLSAxKQorCisjZGVmaW5lIEFWSUNfVk1fSURfQklUUwkJCTI0CisjZGVmaW5lIEFWSUNfVk1fSURfTlIJCQkoMSA8PCBBVklDX1ZNX0lEX0JJVFMpCisjZGVmaW5lIEFWSUNfVk1fSURfTUFTSwkJCSgoMSA8PCBBVklDX1ZNX0lEX0JJVFMpIC0gMSkKKworI2RlZmluZSBBVklDX0dBVEFHKHgsIHkpCQkoKCh4ICYgQVZJQ19WTV9JRF9NQVNLKSA8PCBBVklDX1ZDUFVfSURfQklUUykgfCBcCisJCQkJCQkoeSAmIEFWSUNfVkNQVV9JRF9NQVNLKSkKKyNkZWZpbmUgQVZJQ19HQVRBR19UT19WTUlEKHgpCQkoKHggPj4gQVZJQ19WQ1BVX0lEX0JJVFMpICYgQVZJQ19WTV9JRF9NQVNLKQorI2RlZmluZSBBVklDX0dBVEFHX1RPX1ZDUFVJRCh4KQkJKHggJiBBVklDX1ZDUFVfSURfTUFTSykKKwogc3RhdGljIGJvb2wgZXJyYXR1bV8zODNfZm91bmQgX19yZWFkX21vc3RseTsKIAogc3RhdGljIGNvbnN0IHUzMiBob3N0X3NhdmVfdXNlcl9tc3JzW10gPSB7CkBAIC0xODUsNiArMjAxLDIzIEBACiAJc3RydWN0IHBhZ2UgKmF2aWNfYmFja2luZ19wYWdlOwogCXU2NCAqYXZpY19waHlzaWNhbF9pZF9jYWNoZTsKIAlib29sIGF2aWNfaXNfcnVubmluZzsKKworCS8qCisJICogUGVyLXZjcHUgbGlzdCBvZiBzdHJ1Y3QgYW1kX3N2bV9pb21tdV9pcjoKKwkgKiBUaGlzIGlzIHVzZWQgbWFpbmx5IHRvIHN0b3JlIGludGVycnVwdCByZW1hcHBpbmcgaW5mb3JtYXRpb24gdXNlZAorCSAqIHdoZW4gdXBkYXRlIHRoZSB2Y3B1IGFmZmluaXR5LiBUaGlzIGF2b2lkcyB0aGUgbmVlZCB0byBzY2FuIGZvcgorCSAqIElSVEUgYW5kIHRyeSB0byBtYXRjaCBnYV90YWcgaW4gdGhlIElPTU1VIGRyaXZlci4KKwkgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGlyX2xpc3Q7CisJc3BpbmxvY2tfdCBpcl9saXN0X2xvY2s7Cit9OworCisvKgorICogVGhpcyBpcyBhIHdyYXBwZXIgb2Ygc3RydWN0IGFtZF9pb21tdV9pcl9kYXRhLgorICovCitzdHJ1Y3QgYW1kX3N2bV9pb21tdV9pciB7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOwkvKiBVc2VkIGJ5IFNWTSBmb3IgcGVyLXZjcHUgaXJfbGlzdCAqLworCXZvaWQgKmRhdGE7CQkvKiBTdG9yaW5nIHBvaW50ZXIgdG8gc3RydWN0IGFtZF9pcl9kYXRhICovCiB9OwogCiAjZGVmaW5lIEFWSUNfTE9HSUNBTF9JRF9FTlRSWV9HVUVTVF9QSFlTSUNBTF9JRF9NQVNLCSgweEZGKQpAQCAtMjQyLDYgKzI3NSwxMCBAQAogbW9kdWxlX3BhcmFtKGF2aWMsIGludCwgU19JUlVHTyk7CiAjZW5kaWYKIAorLyogQVZJQyBWTSBJRCBiaXQgbWFza3MgYW5kIGxvY2sgKi8KK3N0YXRpYyBERUNMQVJFX0JJVE1BUChhdmljX3ZtX2lkX2JpdG1hcCwgQVZJQ19WTV9JRF9OUik7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGF2aWNfdm1faWRfbG9jayk7CisKIHN0YXRpYyB2b2lkIHN2bV9zZXRfY3IwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBjcjApOwogc3RhdGljIHZvaWQgc3ZtX2ZsdXNoX3RsYihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogc3RhdGljIHZvaWQgc3ZtX2NvbXBsZXRlX2ludGVycnVwdHMoc3RydWN0IHZjcHVfc3ZtICpzdm0pOwpAQCAtOTI4LDYgKzk2NSw1NSBAQAogCXNldF9tc3JfaW50ZXJjZXB0aW9uKG1zcnBtLCBNU1JfSUEzMl9MQVNUSU5UVE9JUCwgMCwgMCk7CiB9CiAKKy8qIE5vdGU6CisgKiBUaGlzIGhhc2ggdGFibGUgaXMgdXNlZCB0byBtYXAgVk1fSUQgdG8gYSBzdHJ1Y3Qga3ZtX2FyY2gsCisgKiB3aGVuIGhhbmRsaW5nIEFNRCBJT01NVSBHQUxPRyBub3RpZmljYXRpb24gdG8gc2NoZWR1bGUgaW4KKyAqIGEgcGFydGljdWxhciB2Q1BVLgorICovCisjZGVmaW5lIFNWTV9WTV9EQVRBX0hBU0hfQklUUwk4CitERUNMQVJFX0hBU0hUQUJMRShzdm1fdm1fZGF0YV9oYXNoLCBTVk1fVk1fREFUQV9IQVNIX0JJVFMpOworc3RhdGljIHNwaW5sb2NrX3Qgc3ZtX3ZtX2RhdGFfaGFzaF9sb2NrOworCisvKiBOb3RlOgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBJT01NVSBkcml2ZXIgdG8gbm90aWZ5CisgKiBTVk0gdG8gc2NoZWR1bGUgaW4gYSBwYXJ0aWN1bGFyIHZDUFUgb2YgYSBwYXJ0aWN1bGFyIFZNLgorICovCitzdGF0aWMgaW50IGF2aWNfZ2FfbG9nX25vdGlmaWVyKHUzMiBnYV90YWcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qga3ZtX2FyY2ggKmthID0gTlVMTDsKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUgPSBOVUxMOworCXUzMiB2bV9pZCA9IEFWSUNfR0FUQUdfVE9fVk1JRChnYV90YWcpOworCXUzMiB2Y3B1X2lkID0gQVZJQ19HQVRBR19UT19WQ1BVSUQoZ2FfdGFnKTsKKworCXByX2RlYnVnKCJTVk06ICVzOiB2bV9pZD0lI3gsIHZjcHVfaWQ9JSN4XG4iLCBfX2Z1bmNfXywgdm1faWQsIHZjcHVfaWQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN2bV92bV9kYXRhX2hhc2hfbG9jaywgZmxhZ3MpOworCWhhc2hfZm9yX2VhY2hfcG9zc2libGUoc3ZtX3ZtX2RhdGFfaGFzaCwga2EsIGhub2RlLCB2bV9pZCkgeworCQlzdHJ1Y3Qga3ZtICprdm0gPSBjb250YWluZXJfb2Yoa2EsIHN0cnVjdCBrdm0sIGFyY2gpOworCQlzdHJ1Y3Qga3ZtX2FyY2ggKnZtX2RhdGEgPSAma3ZtLT5hcmNoOworCisJCWlmICh2bV9kYXRhLT5hdmljX3ZtX2lkICE9IHZtX2lkKQorCQkJY29udGludWU7CisJCXZjcHUgPSBrdm1fZ2V0X3ZjcHVfYnlfaWQoa3ZtLCB2Y3B1X2lkKTsKKwkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN2bV92bV9kYXRhX2hhc2hfbG9jaywgZmxhZ3MpOworCisJaWYgKCF2Y3B1KQorCQlyZXR1cm4gMDsKKworCS8qIE5vdGU6CisJICogQXQgdGhpcyBwb2ludCwgdGhlIElPTU1VIHNob3VsZCBoYXZlIGFscmVhZHkgc2V0IHRoZSBwZW5kaW5nCisJICogYml0IGluIHRoZSB2QVBJQyBiYWNraW5nIHBhZ2UuIFNvLCB3ZSBqdXN0IG5lZWQgdG8gc2NoZWR1bGUKKwkgKiBpbiB0aGUgdmNwdS4KKwkgKi8KKwlpZiAodmNwdS0+bW9kZSA9PSBPVVRTSURFX0dVRVNUX01PREUpCisJCWt2bV92Y3B1X3dha2VfdXAodmNwdSk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIF9faW5pdCBpbnQgc3ZtX2hhcmR3YXJlX3NldHVwKHZvaWQpCiB7CiAJaW50IGNwdTsKQEAgLTk4NiwxMCArMTA3MiwxNSBAQAogCWlmIChhdmljKSB7CiAJCWlmICghbnB0X2VuYWJsZWQgfHwKIAkJICAgICFib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQVZJQykgfHwKLQkJICAgICFJU19FTkFCTEVEKENPTkZJR19YODZfTE9DQUxfQVBJQykpCisJCSAgICAhSVNfRU5BQkxFRChDT05GSUdfWDg2X0xPQ0FMX0FQSUMpKSB7CiAJCQlhdmljID0gZmFsc2U7Ci0JCWVsc2UKKwkJfSBlbHNlIHsKIAkJCXByX2luZm8oIkFWSUMgZW5hYmxlZFxuIik7CisKKwkJCWhhc2hfaW5pdChzdm1fdm1fZGF0YV9oYXNoKTsKKwkJCXNwaW5fbG9ja19pbml0KCZzdm1fdm1fZGF0YV9oYXNoX2xvY2spOworCQkJYW1kX2lvbW11X3JlZ2lzdGVyX2dhX2xvZ19ub3RpZmllcigmYXZpY19nYV9sb2dfbm90aWZpZXIpOworCQl9CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xMDI4LDEzICsxMTE5LDYgQEAKIAlzZWctPmJhc2UgPSAwOwogfQogCi1zdGF0aWMgdTY0IHN2bV9yZWFkX3RzY19vZmZzZXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQotewotCXN0cnVjdCB2Y3B1X3N2bSAqc3ZtID0gdG9fc3ZtKHZjcHUpOwotCi0JcmV0dXJuIHN2bS0+dm1jYi0+Y29udHJvbC50c2Nfb2Zmc2V0OwotfQotCiBzdGF0aWMgdm9pZCBzdm1fd3JpdGVfdHNjX29mZnNldChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBvZmZzZXQpCiB7CiAJc3RydWN0IHZjcHVfc3ZtICpzdm0gPSB0b19zdm0odmNwdSk7CkBAIC0xMjgwLDE5ICsxMzY0LDU1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGF2aWNfZ2V0X25leHRfdm1faWQodm9pZCkKK3sKKwlpbnQgaWQ7CisKKwlzcGluX2xvY2soJmF2aWNfdm1faWRfbG9jayk7CisKKwkvKiBBVklDIFZNIElEIGlzIG9uZS1iYXNlZC4gKi8KKwlpZCA9IGZpbmRfbmV4dF96ZXJvX2JpdChhdmljX3ZtX2lkX2JpdG1hcCwgQVZJQ19WTV9JRF9OUiwgMSk7CisJaWYgKGlkIDw9IEFWSUNfVk1fSURfTUFTSykKKwkJX19zZXRfYml0KGlkLCBhdmljX3ZtX2lkX2JpdG1hcCk7CisJZWxzZQorCQlpZCA9IC1FQUdBSU47CisKKwlzcGluX3VubG9jaygmYXZpY192bV9pZF9sb2NrKTsKKwlyZXR1cm4gaWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF2aWNfZnJlZV92bV9pZChpbnQgaWQpCit7CisJaWYgKGlkIDw9IDAgfHwgaWQgPiBBVklDX1ZNX0lEX01BU0spCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrKCZhdmljX3ZtX2lkX2xvY2spOworCV9fY2xlYXJfYml0KGlkLCBhdmljX3ZtX2lkX2JpdG1hcCk7CisJc3Bpbl91bmxvY2soJmF2aWNfdm1faWRfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIGF2aWNfdm1fZGVzdHJveShzdHJ1Y3Qga3ZtICprdm0pCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qga3ZtX2FyY2ggKnZtX2RhdGEgPSAma3ZtLT5hcmNoOwogCisJYXZpY19mcmVlX3ZtX2lkKHZtX2RhdGEtPmF2aWNfdm1faWQpOworCiAJaWYgKHZtX2RhdGEtPmF2aWNfbG9naWNhbF9pZF90YWJsZV9wYWdlKQogCQlfX2ZyZWVfcGFnZSh2bV9kYXRhLT5hdmljX2xvZ2ljYWxfaWRfdGFibGVfcGFnZSk7CiAJaWYgKHZtX2RhdGEtPmF2aWNfcGh5c2ljYWxfaWRfdGFibGVfcGFnZSkKIAkJX19mcmVlX3BhZ2Uodm1fZGF0YS0+YXZpY19waHlzaWNhbF9pZF90YWJsZV9wYWdlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzdm1fdm1fZGF0YV9oYXNoX2xvY2ssIGZsYWdzKTsKKwloYXNoX2RlbCgmdm1fZGF0YS0+aG5vZGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN2bV92bV9kYXRhX2hhc2hfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50IGF2aWNfdm1faW5pdChzdHJ1Y3Qga3ZtICprdm0pCiB7Ci0JaW50IGVyciA9IC1FTk9NRU07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgdm1faWQsIGVyciA9IC1FTk9NRU07CiAJc3RydWN0IGt2bV9hcmNoICp2bV9kYXRhID0gJmt2bS0+YXJjaDsKIAlzdHJ1Y3QgcGFnZSAqcF9wYWdlOwogCXN0cnVjdCBwYWdlICpsX3BhZ2U7CkBAIC0xMzAwLDYgKzE0MjAsMTEgQEAKIAlpZiAoIWF2aWMpCiAJCXJldHVybiAwOwogCisJdm1faWQgPSBhdmljX2dldF9uZXh0X3ZtX2lkKCk7CisJaWYgKHZtX2lkIDwgMCkKKwkJcmV0dXJuIHZtX2lkOworCXZtX2RhdGEtPmF2aWNfdm1faWQgPSAodTMyKXZtX2lkOworCiAJLyogQWxsb2NhdGluZyBwaHlzaWNhbCBBUElDIElEIHRhYmxlICg0S0IpICovCiAJcF9wYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKIAlpZiAoIXBfcGFnZSkKQEAgLTEzMTYsNiArMTQ0MSwxMCBAQAogCXZtX2RhdGEtPmF2aWNfbG9naWNhbF9pZF90YWJsZV9wYWdlID0gbF9wYWdlOwogCWNsZWFyX3BhZ2UocGFnZV9hZGRyZXNzKGxfcGFnZSkpOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN2bV92bV9kYXRhX2hhc2hfbG9jaywgZmxhZ3MpOworCWhhc2hfYWRkKHN2bV92bV9kYXRhX2hhc2gsICZ2bV9kYXRhLT5obm9kZSwgdm1fZGF0YS0+YXZpY192bV9pZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3ZtX3ZtX2RhdGFfaGFzaF9sb2NrLCBmbGFncyk7CisKIAlyZXR1cm4gMDsKIAogZnJlZV9hdmljOgpAQCAtMTMyMywzMSArMTQ1MiwzNCBAQAogCXJldHVybiBlcnI7CiB9CiAKLS8qKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIFZDUFUgaGFsdC91bmhhbHQuCi0gKi8KLXN0YXRpYyB2b2lkIGF2aWNfc2V0X3J1bm5pbmcoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBib29sIGlzX3J1bikKK3N0YXRpYyBpbmxpbmUgaW50CithdmljX3VwZGF0ZV9pb21tdV92Y3B1X2FmZmluaXR5KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IGNwdSwgYm9vbCByKQogewotCXU2NCBlbnRyeTsKLQlpbnQgaF9waHlzaWNhbF9pZCA9IGt2bV9jcHVfZ2V0X2FwaWNpZCh2Y3B1LT5jcHUpOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGFtZF9zdm1faW9tbXVfaXIgKmlyOwogCXN0cnVjdCB2Y3B1X3N2bSAqc3ZtID0gdG9fc3ZtKHZjcHUpOwogCi0JaWYgKCFrdm1fdmNwdV9hcGljdl9hY3RpdmUodmNwdSkpCi0JCXJldHVybjsKKwlpZiAoIWt2bV9hcmNoX2hhc19hc3NpZ25lZF9kZXZpY2UodmNwdS0+a3ZtKSkKKwkJcmV0dXJuIDA7CiAKLQlzdm0tPmF2aWNfaXNfcnVubmluZyA9IGlzX3J1bjsKKwkvKgorCSAqIEhlcmUsIHdlIGdvIHRocm91Z2ggdGhlIHBlci12Y3B1IGlyX2xpc3QgdG8gdXBkYXRlIGFsbCBleGlzdGluZworCSAqIGludGVycnVwdCByZW1hcHBpbmcgdGFibGUgZW50cnkgdGFyZ2V0aW5nIHRoaXMgdmNwdS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3ZtLT5pcl9saXN0X2xvY2ssIGZsYWdzKTsKIAotCS8qIElEID0gMHhmZiAoYnJvYWRjYXN0KSwgSUQgPiAweGZmIChyZXNlcnZlZCkgKi8KLQlpZiAoV0FSTl9PTihoX3BoeXNpY2FsX2lkID49IEFWSUNfTUFYX1BIWVNJQ0FMX0lEX0NPVU5UKSkKLQkJcmV0dXJuOworCWlmIChsaXN0X2VtcHR5KCZzdm0tPmlyX2xpc3QpKQorCQlnb3RvIG91dDsKIAotCWVudHJ5ID0gUkVBRF9PTkNFKCooc3ZtLT5hdmljX3BoeXNpY2FsX2lkX2NhY2hlKSk7Ci0JV0FSTl9PTihpc19ydW4gPT0gISEoZW50cnkgJiBBVklDX1BIWVNJQ0FMX0lEX0VOVFJZX0lTX1JVTk5JTkdfTUFTSykpOwotCi0JZW50cnkgJj0gfkFWSUNfUEhZU0lDQUxfSURfRU5UUllfSVNfUlVOTklOR19NQVNLOwotCWlmIChpc19ydW4pCi0JCWVudHJ5IHw9IEFWSUNfUEhZU0lDQUxfSURfRU5UUllfSVNfUlVOTklOR19NQVNLOwotCVdSSVRFX09OQ0UoKihzdm0tPmF2aWNfcGh5c2ljYWxfaWRfY2FjaGUpLCBlbnRyeSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpciwgJnN2bS0+aXJfbGlzdCwgbm9kZSkgeworCQlyZXQgPSBhbWRfaW9tbXVfdXBkYXRlX2dhKGNwdSwgciwgaXItPmRhdGEpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJfQorb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN2bS0+aXJfbGlzdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgYXZpY192Y3B1X2xvYWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgY3B1KQpAQCAtMTM3NCw2ICsxNTA2LDggQEAKIAkJZW50cnkgfD0gQVZJQ19QSFlTSUNBTF9JRF9FTlRSWV9JU19SVU5OSU5HX01BU0s7CiAKIAlXUklURV9PTkNFKCooc3ZtLT5hdmljX3BoeXNpY2FsX2lkX2NhY2hlKSwgZW50cnkpOworCWF2aWNfdXBkYXRlX2lvbW11X3ZjcHVfYWZmaW5pdHkodmNwdSwgaF9waHlzaWNhbF9pZCwKKwkJCQkJc3ZtLT5hdmljX2lzX3J1bm5pbmcpOwogfQogCiBzdGF0aWMgdm9pZCBhdmljX3ZjcHVfcHV0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKQEAgLTEzODUsMTAgKzE1MTksMjcgQEAKIAkJcmV0dXJuOwogCiAJZW50cnkgPSBSRUFEX09OQ0UoKihzdm0tPmF2aWNfcGh5c2ljYWxfaWRfY2FjaGUpKTsKKwlpZiAoZW50cnkgJiBBVklDX1BIWVNJQ0FMX0lEX0VOVFJZX0lTX1JVTk5JTkdfTUFTSykKKwkJYXZpY191cGRhdGVfaW9tbXVfdmNwdV9hZmZpbml0eSh2Y3B1LCAtMSwgMCk7CisKIAllbnRyeSAmPSB+QVZJQ19QSFlTSUNBTF9JRF9FTlRSWV9JU19SVU5OSU5HX01BU0s7CiAJV1JJVEVfT05DRSgqKHN2bS0+YXZpY19waHlzaWNhbF9pZF9jYWNoZSksIGVudHJ5KTsKIH0KIAorLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcgVkNQVSBoYWx0L3VuaGFsdC4KKyAqLworc3RhdGljIHZvaWQgYXZpY19zZXRfcnVubmluZyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGJvb2wgaXNfcnVuKQoreworCXN0cnVjdCB2Y3B1X3N2bSAqc3ZtID0gdG9fc3ZtKHZjcHUpOworCisJc3ZtLT5hdmljX2lzX3J1bm5pbmcgPSBpc19ydW47CisJaWYgKGlzX3J1bikKKwkJYXZpY192Y3B1X2xvYWQodmNwdSwgdmNwdS0+Y3B1KTsKKwllbHNlCisJCWF2aWNfdmNwdV9wdXQodmNwdSk7Cit9CisKIHN0YXRpYyB2b2lkIHN2bV92Y3B1X3Jlc2V0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgYm9vbCBpbml0X2V2ZW50KQogewogCXN0cnVjdCB2Y3B1X3N2bSAqc3ZtID0gdG9fc3ZtKHZjcHUpOwpAQCAtMTQ1MCw2ICsxNjAxLDkgQEAKIAkJZXJyID0gYXZpY19pbml0X2JhY2tpbmdfcGFnZSgmc3ZtLT52Y3B1KTsKIAkJaWYgKGVycikKIAkJCWdvdG8gZnJlZV9wYWdlNDsKKworCQlJTklUX0xJU1RfSEVBRCgmc3ZtLT5pcl9saXN0KTsKKwkJc3Bpbl9sb2NrX2luaXQoJnN2bS0+aXJfbGlzdF9sb2NrKTsKIAl9CiAKIAkvKiBXZSBpbml0aWFsaXplIHRoaXMgZmxhZyB0byB0cnVlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBpc19ydW5uaW5nCkBAIC00MjQ2LDYgKzQ0MDAsMjA5IEBACiAJCWt2bV92Y3B1X3dha2VfdXAodmNwdSk7CiB9CiAKK3N0YXRpYyB2b2lkIHN2bV9pcl9saXN0X2RlbChzdHJ1Y3QgdmNwdV9zdm0gKnN2bSwgc3RydWN0IGFtZF9pb21tdV9waV9kYXRhICpwaSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBhbWRfc3ZtX2lvbW11X2lyICpjdXI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3ZtLT5pcl9saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN1ciwgJnN2bS0+aXJfbGlzdCwgbm9kZSkgeworCQlpZiAoY3VyLT5kYXRhICE9IHBpLT5pcl9kYXRhKQorCQkJY29udGludWU7CisJCWxpc3RfZGVsKCZjdXItPm5vZGUpOworCQlrZnJlZShjdXIpOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3ZtLT5pcl9saXN0X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBzdm1faXJfbGlzdF9hZGQoc3RydWN0IHZjcHVfc3ZtICpzdm0sIHN0cnVjdCBhbWRfaW9tbXVfcGlfZGF0YSAqcGkpCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYW1kX3N2bV9pb21tdV9pciAqaXI7CisKKwkvKioKKwkgKiBJbiBzb21lIGNhc2VzLCB0aGUgZXhpc3RpbmcgaXJ0ZSBpcyB1cGRhZWQgYW5kIHJlLXNldCwKKwkgKiBzbyB3ZSBuZWVkIHRvIGNoZWNrIGhlcmUgaWYgaXQncyBhbHJlYWR5IGJlZW4gKiBhZGRlZAorCSAqIHRvIHRoZSBpcl9saXN0LgorCSAqLworCWlmIChwaS0+aXJfZGF0YSAmJiAocGktPnByZXZfZ2FfdGFnICE9IDApKSB7CisJCXN0cnVjdCBrdm0gKmt2bSA9IHN2bS0+dmNwdS5rdm07CisJCXUzMiB2Y3B1X2lkID0gQVZJQ19HQVRBR19UT19WQ1BVSUQocGktPnByZXZfZ2FfdGFnKTsKKwkJc3RydWN0IGt2bV92Y3B1ICpwcmV2X3ZjcHUgPSBrdm1fZ2V0X3ZjcHVfYnlfaWQoa3ZtLCB2Y3B1X2lkKTsKKwkJc3RydWN0IHZjcHVfc3ZtICpwcmV2X3N2bTsKKworCQlpZiAoIXByZXZfdmNwdSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJcHJldl9zdm0gPSB0b19zdm0ocHJldl92Y3B1KTsKKwkJc3ZtX2lyX2xpc3RfZGVsKHByZXZfc3ZtLCBwaSk7CisJfQorCisJLyoqCisJICogQWxsb2NhdGluZyBuZXcgYW1kX2lvbW11X3BpX2RhdGEsIHdoaWNoIHdpbGwgZ2V0CisJICogYWRkIHRvIHRoZSBwZXItdmNwdSBpcl9saXN0LgorCSAqLworCWlyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFtZF9zdm1faW9tbXVfaXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlyKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwlpci0+ZGF0YSA9IHBpLT5pcl9kYXRhOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN2bS0+aXJfbGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9hZGQoJmlyLT5ub2RlLCAmc3ZtLT5pcl9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdm0tPmlyX2xpc3RfbG9jaywgZmxhZ3MpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogTm90ZToKKyAqIFRoZSBIVyBjYW5ub3Qgc3VwcG9ydCBwb3N0aW5nIG11bHRpY2FzdC9icm9hZGNhc3QKKyAqIGludGVycnVwdHMgdG8gYSB2Q1BVLiBTbywgd2Ugc3RpbGwgdXNlIGxlZ2FjeSBpbnRlcnJ1cHQKKyAqIHJlbWFwcGluZyBmb3IgdGhlc2Uga2luZCBvZiBpbnRlcnJ1cHRzLgorICoKKyAqIEZvciBsb3dlc3QtcHJpb3JpdHkgaW50ZXJydXB0cywgd2Ugb25seSBzdXBwb3J0CisgKiB0aG9zZSB3aXRoIHNpbmdsZSBDUFUgYXMgdGhlIGRlc3RpbmF0aW9uLCBlLmcuIHVzZXIKKyAqIGNvbmZpZ3VyZXMgdGhlIGludGVycnVwdHMgdmlhIC9wcm9jL2lycSBvciB1c2VzCisgKiBpcnFiYWxhbmNlIHRvIG1ha2UgdGhlIGludGVycnVwdHMgc2luZ2xlLUNQVS4KKyAqLworc3RhdGljIGludAorZ2V0X3BpX3ZjcHVfaW5mbyhzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fa2VybmVsX2lycV9yb3V0aW5nX2VudHJ5ICplLAorCQkgc3RydWN0IHZjcHVfZGF0YSAqdmNwdV9pbmZvLCBzdHJ1Y3QgdmNwdV9zdm0gKipzdm0pCit7CisJc3RydWN0IGt2bV9sYXBpY19pcnEgaXJxOworCXN0cnVjdCBrdm1fdmNwdSAqdmNwdSA9IE5VTEw7CisKKwlrdm1fc2V0X21zaV9pcnEoa3ZtLCBlLCAmaXJxKTsKKworCWlmICgha3ZtX2ludHJfaXNfc2luZ2xlX3ZjcHUoa3ZtLCAmaXJxLCAmdmNwdSkpIHsKKwkJcHJfZGVidWcoIlNWTTogJXM6IHVzZSBsZWdhY3kgaW50ciByZW1hcCBtb2RlIGZvciBpcnEgJXVcbiIsCisJCQkgX19mdW5jX18sIGlycS52ZWN0b3IpOworCQlyZXR1cm4gLTE7CisJfQorCisJcHJfZGVidWcoIlNWTTogJXM6IHVzZSBHQSBtb2RlIGZvciBpcnEgJXVcbiIsIF9fZnVuY19fLAorCQkgaXJxLnZlY3Rvcik7CisJKnN2bSA9IHRvX3N2bSh2Y3B1KTsKKwl2Y3B1X2luZm8tPnBpX2Rlc2NfYWRkciA9IHBhZ2VfdG9fcGh5cygoKnN2bSktPmF2aWNfYmFja2luZ19wYWdlKTsKKwl2Y3B1X2luZm8tPnZlY3RvciA9IGlycS52ZWN0b3I7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHN2bV91cGRhdGVfcGlfaXJ0ZSAtIHNldCBJUlRFIGZvciBQb3N0ZWQtSW50ZXJydXB0cworICoKKyAqIEBrdm06IGt2bQorICogQGhvc3RfaXJxOiBob3N0IGlycSBvZiB0aGUgaW50ZXJydXB0CisgKiBAZ3Vlc3RfaXJxOiBnc2kgb2YgdGhlIGludGVycnVwdAorICogQHNldDogc2V0IG9yIHVuc2V0IFBJCisgKiByZXR1cm5zIDAgb24gc3VjY2VzcywgPCAwIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBzdm1fdXBkYXRlX3BpX2lydGUoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBpbnQgaG9zdF9pcnEsCisJCQkgICAgICB1aW50MzJfdCBndWVzdF9pcnEsIGJvb2wgc2V0KQoreworCXN0cnVjdCBrdm1fa2VybmVsX2lycV9yb3V0aW5nX2VudHJ5ICplOworCXN0cnVjdCBrdm1faXJxX3JvdXRpbmdfdGFibGUgKmlycV9ydDsKKwlpbnQgaWR4LCByZXQgPSAtRUlOVkFMOworCisJaWYgKCFrdm1fYXJjaF9oYXNfYXNzaWduZWRfZGV2aWNlKGt2bSkgfHwKKwkgICAgIWlycV9yZW1hcHBpbmdfY2FwKElSUV9QT1NUSU5HX0NBUCkpCisJCXJldHVybiAwOworCisJcHJfZGVidWcoIlNWTTogJXM6IGhvc3RfaXJxPSUjeCwgZ3Vlc3RfaXJxPSUjeCwgc2V0PSUjeFxuIiwKKwkJIF9fZnVuY19fLCBob3N0X2lycSwgZ3Vlc3RfaXJxLCBzZXQpOworCisJaWR4ID0gc3JjdV9yZWFkX2xvY2soJmt2bS0+aXJxX3NyY3UpOworCWlycV9ydCA9IHNyY3VfZGVyZWZlcmVuY2Uoa3ZtLT5pcnFfcm91dGluZywgJmt2bS0+aXJxX3NyY3UpOworCVdBUk5fT04oZ3Vlc3RfaXJxID49IGlycV9ydC0+bnJfcnRfZW50cmllcyk7CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShlLCAmaXJxX3J0LT5tYXBbZ3Vlc3RfaXJxXSwgbGluaykgeworCQlzdHJ1Y3QgdmNwdV9kYXRhIHZjcHVfaW5mbzsKKwkJc3RydWN0IHZjcHVfc3ZtICpzdm0gPSBOVUxMOworCisJCWlmIChlLT50eXBlICE9IEtWTV9JUlFfUk9VVElOR19NU0kpCisJCQljb250aW51ZTsKKworCQkvKioKKwkJICogSGVyZSwgd2Ugc2V0dXAgd2l0aCBsZWdhY3kgbW9kZSBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOgorCQkgKiAxLiBXaGVuIGNhbm5vdCB0YXJnZXQgaW50ZXJydXB0IHRvIGEgc3BlY2lmaWMgdmNwdS4KKwkJICogMi4gVW5zZXR0aW5nIHBvc3RlZCBpbnRlcnJ1cHQuCisJCSAqIDMuIEFQSUMgdmlydGlhbGl6YXRpb24gaXMgZGlzYWJsZWQgZm9yIHRoZSB2Y3B1LgorCQkgKi8KKwkJaWYgKCFnZXRfcGlfdmNwdV9pbmZvKGt2bSwgZSwgJnZjcHVfaW5mbywgJnN2bSkgJiYgc2V0ICYmCisJCSAgICBrdm1fdmNwdV9hcGljdl9hY3RpdmUoJnN2bS0+dmNwdSkpIHsKKwkJCXN0cnVjdCBhbWRfaW9tbXVfcGlfZGF0YSBwaTsKKworCQkJLyogVHJ5IHRvIGVuYWJsZSBndWVzdF9tb2RlIGluIElSVEUgKi8KKwkJCXBpLmJhc2UgPSBwYWdlX3RvX3BoeXMoc3ZtLT5hdmljX2JhY2tpbmdfcGFnZSkgJiBBVklDX0hQQV9NQVNLOworCQkJcGkuZ2FfdGFnID0gQVZJQ19HQVRBRyhrdm0tPmFyY2guYXZpY192bV9pZCwKKwkJCQkJCSAgICAgc3ZtLT52Y3B1LnZjcHVfaWQpOworCQkJcGkuaXNfZ3Vlc3RfbW9kZSA9IHRydWU7CisJCQlwaS52Y3B1X2RhdGEgPSAmdmNwdV9pbmZvOworCQkJcmV0ID0gaXJxX3NldF92Y3B1X2FmZmluaXR5KGhvc3RfaXJxLCAmcGkpOworCisJCQkvKioKKwkJCSAqIEhlcmUsIHdlIHN1Y2Nlc3NmdWxseSBzZXR0aW5nIHVwIHZjcHUgYWZmaW5pdHkgaW4KKwkJCSAqIElPTU1VIGd1ZXN0IG1vZGUuIE5vdywgd2UgbmVlZCB0byBzdG9yZSB0aGUgcG9zdGVkCisJCQkgKiBpbnRlcnJ1cHQgaW5mb3JtYXRpb24gaW4gYSBwZXItdmNwdSBpcl9saXN0IHNvIHRoYXQKKwkJCSAqIHdlIGNhbiByZWZlcmVuY2UgdG8gdGhlbSBkaXJlY3RseSB3aGVuIHdlIHVwZGF0ZSB2Y3B1CisJCQkgKiBzY2hlZHVsaW5nIGluZm9ybWF0aW9uIGluIElPTU1VIGlydGUuCisJCQkgKi8KKwkJCWlmICghcmV0ICYmIHBpLmlzX2d1ZXN0X21vZGUpCisJCQkJc3ZtX2lyX2xpc3RfYWRkKHN2bSwgJnBpKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFVzZSBsZWdhY3kgbW9kZSBpbiBJUlRFICovCisJCQlzdHJ1Y3QgYW1kX2lvbW11X3BpX2RhdGEgcGk7CisKKwkJCS8qKgorCQkJICogSGVyZSwgcGkgaXMgdXNlZCB0bzoKKwkJCSAqIC0gVGVsbCBJT01NVSB0byB1c2UgbGVnYWN5IG1vZGUgZm9yIHRoaXMgaW50ZXJydXB0LgorCQkJICogLSBSZXRyaWV2ZSBnYV90YWcgb2YgcHJpb3IgaW50ZXJydXB0IHJlbWFwcGluZyBkYXRhLgorCQkJICovCisJCQlwaS5pc19ndWVzdF9tb2RlID0gZmFsc2U7CisJCQlyZXQgPSBpcnFfc2V0X3ZjcHVfYWZmaW5pdHkoaG9zdF9pcnEsICZwaSk7CisKKwkJCS8qKgorCQkJICogQ2hlY2sgaWYgdGhlIHBvc3RlZCBpbnRlcnJ1cHQgd2FzIHByZXZpb3VzbHkKKwkJCSAqIHNldHVwIHdpdGggdGhlIGd1ZXN0X21vZGUgYnkgY2hlY2tpbmcgaWYgdGhlIGdhX3RhZworCQkJICogd2FzIGNhY2hlZC4gSWYgc28sIHdlIG5lZWQgdG8gY2xlYW4gdXAgdGhlIHBlci12Y3B1CisJCQkgKiBpcl9saXN0LgorCQkJICovCisJCQlpZiAoIXJldCAmJiBwaS5wcmV2X2dhX3RhZykgeworCQkJCWludCBpZCA9IEFWSUNfR0FUQUdfVE9fVkNQVUlEKHBpLnByZXZfZ2FfdGFnKTsKKwkJCQlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHU7CisKKwkJCQl2Y3B1ID0ga3ZtX2dldF92Y3B1X2J5X2lkKGt2bSwgaWQpOworCQkJCWlmICh2Y3B1KQorCQkJCQlzdm1faXJfbGlzdF9kZWwodG9fc3ZtKHZjcHUpLCAmcGkpOworCQkJfQorCQl9CisKKwkJaWYgKCFyZXQgJiYgc3ZtKSB7CisJCQl0cmFjZV9rdm1fcGlfaXJ0ZV91cGRhdGUoc3ZtLT52Y3B1LnZjcHVfaWQsCisJCQkJCQkgaG9zdF9pcnEsIGUtPmdzaSwKKwkJCQkJCSB2Y3B1X2luZm8udmVjdG9yLAorCQkJCQkJIHZjcHVfaW5mby5waV9kZXNjX2FkZHIsIHNldCk7CisJCX0KKworCQlpZiAocmV0IDwgMCkgeworCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHVwZGF0ZSBQSSBJUlRFXG4iLCBfX2Z1bmNfXyk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCXJldCA9IDA7CitvdXQ6CisJc3JjdV9yZWFkX3VubG9jaygma3ZtLT5pcnFfc3JjdSwgaWR4KTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IHN2bV9ubWlfYWxsb3dlZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJc3RydWN0IHZjcHVfc3ZtICpzdm0gPSB0b19zdm0odmNwdSk7CkBAIC00OTYxLDcgKzUzMTgsNyBAQAogCWF2aWNfaGFuZGxlX2xkcl91cGRhdGUodmNwdSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qga3ZtX3g4Nl9vcHMgc3ZtX3g4Nl9vcHMgPSB7CitzdGF0aWMgc3RydWN0IGt2bV94ODZfb3BzIHN2bV94ODZfb3BzIF9fcm9fYWZ0ZXJfaW5pdCA9IHsKIAkuY3B1X2hhc19rdm1fc3VwcG9ydCA9IGhhc19zdm0sCiAJLmRpc2FibGVkX2J5X2Jpb3MgPSBpc19kaXNhYmxlZCwKIAkuaGFyZHdhcmVfc2V0dXAgPSBzdm1faGFyZHdhcmVfc2V0dXAsCkBAIC01MDY0LDcgKzU0MjEsNiBAQAogCiAJLmhhc193YmludmRfZXhpdCA9IHN2bV9oYXNfd2JpbnZkX2V4aXQsCiAKLQkucmVhZF90c2Nfb2Zmc2V0ID0gc3ZtX3JlYWRfdHNjX29mZnNldCwKIAkud3JpdGVfdHNjX29mZnNldCA9IHN2bV93cml0ZV90c2Nfb2Zmc2V0LAogCS5hZGp1c3RfdHNjX29mZnNldF9ndWVzdCA9IHN2bV9hZGp1c3RfdHNjX29mZnNldF9ndWVzdCwKIAkucmVhZF9sMV90c2MgPSBzdm1fcmVhZF9sMV90c2MsCkBAIC01MDc4LDYgKzU0MzQsNyBAQAogCiAJLnBtdV9vcHMgPSAmYW1kX3BtdV9vcHMsCiAJLmRlbGl2ZXJfcG9zdGVkX2ludGVycnVwdCA9IHN2bV9kZWxpdmVyX2F2aWNfaW50ciwKKwkudXBkYXRlX3BpX2lydGUgPSBzdm1fdXBkYXRlX3BpX2lydGUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzdm1faW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL3ZteC5jIGIvYXJjaC94ODYva3ZtL3ZteC5jCmluZGV4IGE0NWQ4NTguLmNmMWIxNmQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS92bXguYworKysgYi9hcmNoL3g4Ni9rdm0vdm14LmMKQEAgLTQyMiw2ICs0MjIsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgdm1jczAyX3Bvb2w7CiAJaW50IHZtY3MwMl9udW07CiAJdTY0IHZtY3MwMV90c2Nfb2Zmc2V0OworCWJvb2wgY2hhbmdlX3ZtY3MwMV92aXJ0dWFsX3gyYXBpY19tb2RlOwogCS8qIEwyIG11c3QgcnVuIG5leHQsIGFuZCBtdXN0bid0IGRlY2lkZSB0byBleGl0IHRvIEwxLiAqLwogCWJvb2wgbmVzdGVkX3J1bl9wZW5kaW5nOwogCS8qCkBAIC00MzUsNiArNDM2LDggQEAKIAlib29sIHBpX3BlbmRpbmc7CiAJdTE2IHBvc3RlZF9pbnRyX252OwogCisJdW5zaWduZWQgbG9uZyAqbXNyX2JpdG1hcDsKKwogCXN0cnVjdCBocnRpbWVyIHByZWVtcHRpb25fdGltZXI7CiAJYm9vbCBwcmVlbXB0aW9uX3RpbWVyX2V4cGlyZWQ7CiAKQEAgLTkyNCw3ICs5MjcsOCBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgKnZteF9tc3JfYml0bWFwX2xvbmdtb2RlOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgKnZteF9tc3JfYml0bWFwX2xlZ2FjeV94MmFwaWM7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyAqdm14X21zcl9iaXRtYXBfbG9uZ21vZGVfeDJhcGljOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgKnZteF9tc3JfYml0bWFwX25lc3RlZDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nICp2bXhfbXNyX2JpdG1hcF9sZWdhY3lfeDJhcGljX2FwaWN2X2luYWN0aXZlOworc3RhdGljIHVuc2lnbmVkIGxvbmcgKnZteF9tc3JfYml0bWFwX2xvbmdtb2RlX3gyYXBpY19hcGljdl9pbmFjdGl2ZTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nICp2bXhfdm1yZWFkX2JpdG1hcDsKIHN0YXRpYyB1bnNpZ25lZCBsb25nICp2bXhfdm13cml0ZV9iaXRtYXA7CiAKQEAgLTkzNyw2ICs5NDEsNyBAQAogc3RhdGljIHN0cnVjdCB2bWNzX2NvbmZpZyB7CiAJaW50IHNpemU7CiAJaW50IG9yZGVyOworCXUzMiBiYXNpY19jYXA7CiAJdTMyIHJldmlzaW9uX2lkOwogCXUzMiBwaW5fYmFzZWRfZXhlY19jdHJsOwogCXUzMiBjcHVfYmFzZWRfZXhlY19jdHJsOwpAQCAtMTIxMyw2ICsxMjE4LDExIEBACiAJCVNFQ09OREFSWV9FWEVDX1BBVVNFX0xPT1BfRVhJVElORzsKIH0KIAorc3RhdGljIGlubGluZSBib29sIGNwdV9oYXNfdm14X2Jhc2ljX2lub3V0KHZvaWQpCit7CisJcmV0dXJuCSgoKHU2NCl2bWNzX2NvbmZpZy5iYXNpY19jYXAgPDwgMzIpICYgVk1YX0JBU0lDX0lOT1VUKTsKK30KKwogc3RhdGljIGlubGluZSBib29sIGNwdV9uZWVkX3ZpcnR1YWxpemVfYXBpY19hY2Nlc3NlcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJcmV0dXJuIGZsZXhwcmlvcml0eV9lbmFibGVkICYmIGxhcGljX2luX2tlcm5lbCh2Y3B1KTsKQEAgLTIxOTgsNiArMjIwOCwxMiBAQAogCQkJbmV3LmNvbnRyb2wpICE9IG9sZC5jb250cm9sKTsKIH0KIAorc3RhdGljIHZvaWQgZGVjYWNoZV90c2NfbXVsdGlwbGllcihzdHJ1Y3QgdmNwdV92bXggKnZteCkKK3sKKwl2bXgtPmN1cnJlbnRfdHNjX3JhdGlvID0gdm14LT52Y3B1LmFyY2gudHNjX3NjYWxpbmdfcmF0aW87CisJdm1jc193cml0ZTY0KFRTQ19NVUxUSVBMSUVSLCB2bXgtPmN1cnJlbnRfdHNjX3JhdGlvKTsKK30KKwogLyoKICAqIFN3aXRjaGVzIHRvIHNwZWNpZmllZCB2Y3B1LCB1bnRpbCBhIG1hdGNoaW5nIHZjcHVfcHV0KCksIGJ1dCBhc3N1bWVzCiAgKiB2Y3B1IG11dGV4IGlzIGFscmVhZHkgdGFrZW4uCkBAIC0yMjU2LDEwICsyMjcyLDggQEAKIAogCS8qIFNldHVwIFRTQyBtdWx0aXBsaWVyICovCiAJaWYgKGt2bV9oYXNfdHNjX2NvbnRyb2wgJiYKLQkgICAgdm14LT5jdXJyZW50X3RzY19yYXRpbyAhPSB2Y3B1LT5hcmNoLnRzY19zY2FsaW5nX3JhdGlvKSB7Ci0JCXZteC0+Y3VycmVudF90c2NfcmF0aW8gPSB2Y3B1LT5hcmNoLnRzY19zY2FsaW5nX3JhdGlvOwotCQl2bWNzX3dyaXRlNjQoVFNDX01VTFRJUExJRVIsIHZteC0+Y3VycmVudF90c2NfcmF0aW8pOwotCX0KKwkgICAgdm14LT5jdXJyZW50X3RzY19yYXRpbyAhPSB2Y3B1LT5hcmNoLnRzY19zY2FsaW5nX3JhdGlvKQorCQlkZWNhY2hlX3RzY19tdWx0aXBsaWVyKHZteCk7CiAKIAl2bXhfdmNwdV9waV9sb2FkKHZjcHUsIGNwdSk7CiAJdm14LT5ob3N0X3BrcnUgPSByZWFkX3BrcnUoKTsKQEAgLTI1MDgsMTQgKzI1MjIsMjEgQEAKIAl1bnNpZ25lZCBsb25nICptc3JfYml0bWFwOwogCiAJaWYgKGlzX2d1ZXN0X21vZGUodmNwdSkpCi0JCW1zcl9iaXRtYXAgPSB2bXhfbXNyX2JpdG1hcF9uZXN0ZWQ7CisJCW1zcl9iaXRtYXAgPSB0b192bXgodmNwdSktPm5lc3RlZC5tc3JfYml0bWFwOwogCWVsc2UgaWYgKGNwdV9oYXNfc2Vjb25kYXJ5X2V4ZWNfY3RybHMoKSAmJgogCQkgKHZtY3NfcmVhZDMyKFNFQ09OREFSWV9WTV9FWEVDX0NPTlRST0wpICYKIAkJICBTRUNPTkRBUllfRVhFQ19WSVJUVUFMSVpFX1gyQVBJQ19NT0RFKSkgewotCQlpZiAoaXNfbG9uZ19tb2RlKHZjcHUpKQotCQkJbXNyX2JpdG1hcCA9IHZteF9tc3JfYml0bWFwX2xvbmdtb2RlX3gyYXBpYzsKLQkJZWxzZQotCQkJbXNyX2JpdG1hcCA9IHZteF9tc3JfYml0bWFwX2xlZ2FjeV94MmFwaWM7CisJCWlmIChlbmFibGVfYXBpY3YgJiYga3ZtX3ZjcHVfYXBpY3ZfYWN0aXZlKHZjcHUpKSB7CisJCQlpZiAoaXNfbG9uZ19tb2RlKHZjcHUpKQorCQkJCW1zcl9iaXRtYXAgPSB2bXhfbXNyX2JpdG1hcF9sb25nbW9kZV94MmFwaWM7CisJCQllbHNlCisJCQkJbXNyX2JpdG1hcCA9IHZteF9tc3JfYml0bWFwX2xlZ2FjeV94MmFwaWM7CisJCX0gZWxzZSB7CisJCQlpZiAoaXNfbG9uZ19tb2RlKHZjcHUpKQorCQkJCW1zcl9iaXRtYXAgPSB2bXhfbXNyX2JpdG1hcF9sb25nbW9kZV94MmFwaWNfYXBpY3ZfaW5hY3RpdmU7CisJCQllbHNlCisJCQkJbXNyX2JpdG1hcCA9IHZteF9tc3JfYml0bWFwX2xlZ2FjeV94MmFwaWNfYXBpY3ZfaW5hY3RpdmU7CisJCX0KIAl9IGVsc2UgewogCQlpZiAoaXNfbG9uZ19tb2RlKHZjcHUpKQogCQkJbXNyX2JpdG1hcCA9IHZteF9tc3JfYml0bWFwX2xvbmdtb2RlOwpAQCAtMjU5NywxMSArMjYxOCw2IEBACiAJcmV0dXJuIGhvc3RfdHNjICsgdHNjX29mZnNldDsKIH0KIAotc3RhdGljIHU2NCB2bXhfcmVhZF90c2Nfb2Zmc2V0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQlyZXR1cm4gdm1jc19yZWFkNjQoVFNDX09GRlNFVCk7Ci19Ci0KIC8qCiAgKiB3cml0ZXMgJ29mZnNldCcgaW50byBndWVzdCdzIHRpbWVzdGFtcCBjb3VudGVyIG9mZnNldCByZWdpc3RlcgogICovCkBAIC0yODcxLDYgKzI4ODcsOCBAQAogCQkqcGRhdGEgPSBWTUNTMTJfUkVWSVNJT04gfCBWTVhfQkFTSUNfVFJVRV9DVExTIHwKIAkJCSAgICgodTY0KVZNQ1MxMl9TSVpFIDw8IFZNWF9CQVNJQ19WTUNTX1NJWkVfU0hJRlQpIHwKIAkJCSAgIChWTVhfQkFTSUNfTUVNX1RZUEVfV0IgPDwgVk1YX0JBU0lDX01FTV9UWVBFX1NISUZUKTsKKwkJaWYgKGNwdV9oYXNfdm14X2Jhc2ljX2lub3V0KCkpCisJCQkqcGRhdGEgfD0gVk1YX0JBU0lDX0lOT1VUOwogCQlicmVhazsKIAljYXNlIE1TUl9JQTMyX1ZNWF9UUlVFX1BJTkJBU0VEX0NUTFM6CiAJY2FzZSBNU1JfSUEzMl9WTVhfUElOQkFTRURfQ1RMUzoKQEAgLTM0NTEsNyArMzQ2OSw4IEBACiAJCXJldHVybiAtRUlPOwogCiAJdm1jc19jb25mLT5zaXplID0gdm14X21zcl9oaWdoICYgMHgxZmZmOwotCXZtY3NfY29uZi0+b3JkZXIgPSBnZXRfb3JkZXIodm1jc19jb25maWcuc2l6ZSk7CisJdm1jc19jb25mLT5vcmRlciA9IGdldF9vcmRlcih2bWNzX2NvbmYtPnNpemUpOworCXZtY3NfY29uZi0+YmFzaWNfY2FwID0gdm14X21zcl9oaWdoICYgfjB4MWZmZjsKIAl2bWNzX2NvbmYtPnJldmlzaW9uX2lkID0gdm14X21zcl9sb3c7CiAKIAl2bWNzX2NvbmYtPnBpbl9iYXNlZF9leGVjX2N0cmwgPSBfcGluX2Jhc2VkX2V4ZWNfY29udHJvbDsKQEAgLTQ2NzIsMjggKzQ2OTEsNDkgQEAKIAkJCQkJCW1zciwgTVNSX1RZUEVfUiB8IE1TUl9UWVBFX1cpOwogfQogCi1zdGF0aWMgdm9pZCB2bXhfZW5hYmxlX2ludGVyY2VwdF9tc3JfcmVhZF94MmFwaWModTMyIG1zcikKK3N0YXRpYyB2b2lkIHZteF9lbmFibGVfaW50ZXJjZXB0X21zcl9yZWFkX3gyYXBpYyh1MzIgbXNyLCBib29sIGFwaWN2X2FjdGl2ZSkKIHsKLQlfX3ZteF9lbmFibGVfaW50ZXJjZXB0X2Zvcl9tc3Iodm14X21zcl9iaXRtYXBfbGVnYWN5X3gyYXBpYywKLQkJCW1zciwgTVNSX1RZUEVfUik7Ci0JX192bXhfZW5hYmxlX2ludGVyY2VwdF9mb3JfbXNyKHZteF9tc3JfYml0bWFwX2xvbmdtb2RlX3gyYXBpYywKLQkJCW1zciwgTVNSX1RZUEVfUik7CisJaWYgKGFwaWN2X2FjdGl2ZSkgeworCQlfX3ZteF9lbmFibGVfaW50ZXJjZXB0X2Zvcl9tc3Iodm14X21zcl9iaXRtYXBfbGVnYWN5X3gyYXBpYywKKwkJCQltc3IsIE1TUl9UWVBFX1IpOworCQlfX3ZteF9lbmFibGVfaW50ZXJjZXB0X2Zvcl9tc3Iodm14X21zcl9iaXRtYXBfbG9uZ21vZGVfeDJhcGljLAorCQkJCW1zciwgTVNSX1RZUEVfUik7CisJfSBlbHNlIHsKKwkJX192bXhfZW5hYmxlX2ludGVyY2VwdF9mb3JfbXNyKHZteF9tc3JfYml0bWFwX2xlZ2FjeV94MmFwaWNfYXBpY3ZfaW5hY3RpdmUsCisJCQkJbXNyLCBNU1JfVFlQRV9SKTsKKwkJX192bXhfZW5hYmxlX2ludGVyY2VwdF9mb3JfbXNyKHZteF9tc3JfYml0bWFwX2xvbmdtb2RlX3gyYXBpY19hcGljdl9pbmFjdGl2ZSwKKwkJCQltc3IsIE1TUl9UWVBFX1IpOworCX0KIH0KIAotc3RhdGljIHZvaWQgdm14X2Rpc2FibGVfaW50ZXJjZXB0X21zcl9yZWFkX3gyYXBpYyh1MzIgbXNyKQorc3RhdGljIHZvaWQgdm14X2Rpc2FibGVfaW50ZXJjZXB0X21zcl9yZWFkX3gyYXBpYyh1MzIgbXNyLCBib29sIGFwaWN2X2FjdGl2ZSkKIHsKLQlfX3ZteF9kaXNhYmxlX2ludGVyY2VwdF9mb3JfbXNyKHZteF9tc3JfYml0bWFwX2xlZ2FjeV94MmFwaWMsCi0JCQltc3IsIE1TUl9UWVBFX1IpOwotCV9fdm14X2Rpc2FibGVfaW50ZXJjZXB0X2Zvcl9tc3Iodm14X21zcl9iaXRtYXBfbG9uZ21vZGVfeDJhcGljLAotCQkJbXNyLCBNU1JfVFlQRV9SKTsKKwlpZiAoYXBpY3ZfYWN0aXZlKSB7CisJCV9fdm14X2Rpc2FibGVfaW50ZXJjZXB0X2Zvcl9tc3Iodm14X21zcl9iaXRtYXBfbGVnYWN5X3gyYXBpYywKKwkJCQltc3IsIE1TUl9UWVBFX1IpOworCQlfX3ZteF9kaXNhYmxlX2ludGVyY2VwdF9mb3JfbXNyKHZteF9tc3JfYml0bWFwX2xvbmdtb2RlX3gyYXBpYywKKwkJCQltc3IsIE1TUl9UWVBFX1IpOworCX0gZWxzZSB7CisJCV9fdm14X2Rpc2FibGVfaW50ZXJjZXB0X2Zvcl9tc3Iodm14X21zcl9iaXRtYXBfbGVnYWN5X3gyYXBpY19hcGljdl9pbmFjdGl2ZSwKKwkJCQltc3IsIE1TUl9UWVBFX1IpOworCQlfX3ZteF9kaXNhYmxlX2ludGVyY2VwdF9mb3JfbXNyKHZteF9tc3JfYml0bWFwX2xvbmdtb2RlX3gyYXBpY19hcGljdl9pbmFjdGl2ZSwKKwkJCQltc3IsIE1TUl9UWVBFX1IpOworCX0KIH0KIAotc3RhdGljIHZvaWQgdm14X2Rpc2FibGVfaW50ZXJjZXB0X21zcl93cml0ZV94MmFwaWModTMyIG1zcikKK3N0YXRpYyB2b2lkIHZteF9kaXNhYmxlX2ludGVyY2VwdF9tc3Jfd3JpdGVfeDJhcGljKHUzMiBtc3IsIGJvb2wgYXBpY3ZfYWN0aXZlKQogewotCV9fdm14X2Rpc2FibGVfaW50ZXJjZXB0X2Zvcl9tc3Iodm14X21zcl9iaXRtYXBfbGVnYWN5X3gyYXBpYywKLQkJCW1zciwgTVNSX1RZUEVfVyk7Ci0JX192bXhfZGlzYWJsZV9pbnRlcmNlcHRfZm9yX21zcih2bXhfbXNyX2JpdG1hcF9sb25nbW9kZV94MmFwaWMsCi0JCQltc3IsIE1TUl9UWVBFX1cpOworCWlmIChhcGljdl9hY3RpdmUpIHsKKwkJX192bXhfZGlzYWJsZV9pbnRlcmNlcHRfZm9yX21zcih2bXhfbXNyX2JpdG1hcF9sZWdhY3lfeDJhcGljLAorCQkJCW1zciwgTVNSX1RZUEVfVyk7CisJCV9fdm14X2Rpc2FibGVfaW50ZXJjZXB0X2Zvcl9tc3Iodm14X21zcl9iaXRtYXBfbG9uZ21vZGVfeDJhcGljLAorCQkJCW1zciwgTVNSX1RZUEVfVyk7CisJfSBlbHNlIHsKKwkJX192bXhfZGlzYWJsZV9pbnRlcmNlcHRfZm9yX21zcih2bXhfbXNyX2JpdG1hcF9sZWdhY3lfeDJhcGljX2FwaWN2X2luYWN0aXZlLAorCQkJCW1zciwgTVNSX1RZUEVfVyk7CisJCV9fdm14X2Rpc2FibGVfaW50ZXJjZXB0X2Zvcl9tc3Iodm14X21zcl9iaXRtYXBfbG9uZ21vZGVfeDJhcGljX2FwaWN2X2luYWN0aXZlLAorCQkJCW1zciwgTVNSX1RZUEVfVyk7CisJfQogfQogCiBzdGF0aWMgYm9vbCB2bXhfZ2V0X2VuYWJsZV9hcGljdih2b2lkKQpAQCAtNTI3MywyOSArNTMxMywzMCBAQAogewogCXN0cnVjdCB2Y3B1X3ZteCAqdm14ID0gdG9fdm14KHZjcHUpOwogCi0JaWYgKGlzX2d1ZXN0X21vZGUodmNwdSkpCi0JCXJldHVybjsKKwlpZiAoIWlzX2d1ZXN0X21vZGUodmNwdSkpIHsKKwkJaWYgKCFjcHVfaGFzX3ZpcnR1YWxfbm1pcygpKSB7CisJCQkvKgorCQkJICogVHJhY2tpbmcgdGhlIE5NSS1ibG9ja2VkIHN0YXRlIGluIHNvZnR3YXJlIGlzIGJ1aWx0IHVwb24KKwkJCSAqIGZpbmRpbmcgdGhlIG5leHQgb3BlbiBJUlEgd2luZG93LiBUaGlzLCBpbiB0dXJuLCBkZXBlbmRzIG9uCisJCQkgKiB3ZWxsLWJlaGF2aW5nIGd1ZXN0czogVGhleSBoYXZlIHRvIGtlZXAgSVJRcyBkaXNhYmxlZCBhdAorCQkJICogbGVhc3QgYXMgbG9uZyBhcyB0aGUgTk1JIGhhbmRsZXIgcnVucy4gT3RoZXJ3aXNlIHdlIG1heQorCQkJICogY2F1c2UgTk1JIG5lc3RpbmcsIG1heWJlIGJyZWFraW5nIHRoZSBndWVzdC4gQnV0IGFzIHRoaXMgaXMKKwkJCSAqIGhpZ2hseSB1bmxpa2VseSwgd2UgY2FuIGxpdmUgd2l0aCB0aGUgcmVzaWR1YWwgcmlzay4KKwkJCSAqLworCQkJdm14LT5zb2Z0X3ZubWlfYmxvY2tlZCA9IDE7CisJCQl2bXgtPnZubWlfYmxvY2tlZF90aW1lID0gMDsKKwkJfQogCi0JaWYgKCFjcHVfaGFzX3ZpcnR1YWxfbm1pcygpKSB7Ci0JCS8qCi0JCSAqIFRyYWNraW5nIHRoZSBOTUktYmxvY2tlZCBzdGF0ZSBpbiBzb2Z0d2FyZSBpcyBidWlsdCB1cG9uCi0JCSAqIGZpbmRpbmcgdGhlIG5leHQgb3BlbiBJUlEgd2luZG93LiBUaGlzLCBpbiB0dXJuLCBkZXBlbmRzIG9uCi0JCSAqIHdlbGwtYmVoYXZpbmcgZ3Vlc3RzOiBUaGV5IGhhdmUgdG8ga2VlcCBJUlFzIGRpc2FibGVkIGF0Ci0JCSAqIGxlYXN0IGFzIGxvbmcgYXMgdGhlIE5NSSBoYW5kbGVyIHJ1bnMuIE90aGVyd2lzZSB3ZSBtYXkKLQkJICogY2F1c2UgTk1JIG5lc3RpbmcsIG1heWJlIGJyZWFraW5nIHRoZSBndWVzdC4gQnV0IGFzIHRoaXMgaXMKLQkJICogaGlnaGx5IHVubGlrZWx5LCB3ZSBjYW4gbGl2ZSB3aXRoIHRoZSByZXNpZHVhbCByaXNrLgotCQkgKi8KLQkJdm14LT5zb2Z0X3ZubWlfYmxvY2tlZCA9IDE7Ci0JCXZteC0+dm5taV9ibG9ja2VkX3RpbWUgPSAwOworCQkrK3ZjcHUtPnN0YXQubm1pX2luamVjdGlvbnM7CisJCXZteC0+bm1pX2tub3duX3VubWFza2VkID0gZmFsc2U7CiAJfQogCi0JKyt2Y3B1LT5zdGF0Lm5taV9pbmplY3Rpb25zOwotCXZteC0+bm1pX2tub3duX3VubWFza2VkID0gZmFsc2U7CiAJaWYgKHZteC0+cm1vZGUudm04Nl9hY3RpdmUpIHsKIAkJaWYgKGt2bV9pbmplY3RfcmVhbG1vZGVfaW50ZXJydXB0KHZjcHUsIE5NSV9WRUNUT1IsIDApICE9IEVNVUxBVEVfRE9ORSkKIAkJCWt2bV9tYWtlX3JlcXVlc3QoS1ZNX1JFUV9UUklQTEVfRkFVTFQsIHZjcHUpOwogCQlyZXR1cm47CiAJfQorCiAJdm1jc193cml0ZTMyKFZNX0VOVFJZX0lOVFJfSU5GT19GSUVMRCwKIAkJCUlOVFJfVFlQRV9OTUlfSU5UUiB8IElOVFJfSU5GT19WQUxJRF9NQVNLIHwgTk1JX1ZFQ1RPUik7CiB9CkBAIC02MTAzLDcgKzYxNDQsNyBAQAogCWV4aXRfcXVhbGlmaWNhdGlvbiA9IHZtY3NfcmVhZGwoRVhJVF9RVUFMSUZJQ0FUSU9OKTsKIAogCWdsYV92YWxpZGl0eSA9IChleGl0X3F1YWxpZmljYXRpb24gPj4gNykgJiAweDM7Ci0JaWYgKGdsYV92YWxpZGl0eSAhPSAweDMgJiYgZ2xhX3ZhbGlkaXR5ICE9IDB4MSAmJiBnbGFfdmFsaWRpdHkgIT0gMCkgeworCWlmIChnbGFfdmFsaWRpdHkgPT0gMHgyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRVBUOiBIYW5kbGluZyBFUFQgdmlvbGF0aW9uIGZhaWxlZCFcbiIpOwogCQlwcmludGsoS0VSTl9FUlIgIkVQVDogR1BBOiAweCVseCwgR1ZBOiAweCVseFxuIiwKIAkJCShsb25nIHVuc2lnbmVkIGludCl2bWNzX3JlYWQ2NChHVUVTVF9QSFlTSUNBTF9BRERSRVNTKSwKQEAgLTYzNTQsMjkgKzYzOTUsMzIgQEAKIAlpZiAoIXZteF9tc3JfYml0bWFwX2xlZ2FjeV94MmFwaWMpCiAJCWdvdG8gb3V0MjsKIAorCXZteF9tc3JfYml0bWFwX2xlZ2FjeV94MmFwaWNfYXBpY3ZfaW5hY3RpdmUgPQorCQkJCSh1bnNpZ25lZCBsb25nICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWlmICghdm14X21zcl9iaXRtYXBfbGVnYWN5X3gyYXBpY19hcGljdl9pbmFjdGl2ZSkKKwkJZ290byBvdXQzOworCiAJdm14X21zcl9iaXRtYXBfbG9uZ21vZGUgPSAodW5zaWduZWQgbG9uZyAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKIAlpZiAoIXZteF9tc3JfYml0bWFwX2xvbmdtb2RlKQotCQlnb3RvIG91dDM7CisJCWdvdG8gb3V0NDsKIAogCXZteF9tc3JfYml0bWFwX2xvbmdtb2RlX3gyYXBpYyA9CiAJCQkJKHVuc2lnbmVkIGxvbmcgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CiAJaWYgKCF2bXhfbXNyX2JpdG1hcF9sb25nbW9kZV94MmFwaWMpCi0JCWdvdG8gb3V0NDsKKwkJZ290byBvdXQ1OwogCi0JaWYgKG5lc3RlZCkgewotCQl2bXhfbXNyX2JpdG1hcF9uZXN0ZWQgPQotCQkJKHVuc2lnbmVkIGxvbmcgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JCWlmICghdm14X21zcl9iaXRtYXBfbmVzdGVkKQotCQkJZ290byBvdXQ1OwotCX0KKwl2bXhfbXNyX2JpdG1hcF9sb25nbW9kZV94MmFwaWNfYXBpY3ZfaW5hY3RpdmUgPQorCQkJCSh1bnNpZ25lZCBsb25nICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWlmICghdm14X21zcl9iaXRtYXBfbG9uZ21vZGVfeDJhcGljX2FwaWN2X2luYWN0aXZlKQorCQlnb3RvIG91dDY7CiAKIAl2bXhfdm1yZWFkX2JpdG1hcCA9ICh1bnNpZ25lZCBsb25nICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwogCWlmICghdm14X3ZtcmVhZF9iaXRtYXApCi0JCWdvdG8gb3V0NjsKKwkJZ290byBvdXQ3OwogCiAJdm14X3Ztd3JpdGVfYml0bWFwID0gKHVuc2lnbmVkIGxvbmcgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CiAJaWYgKCF2bXhfdm13cml0ZV9iaXRtYXApCi0JCWdvdG8gb3V0NzsKKwkJZ290byBvdXQ4OwogCiAJbWVtc2V0KHZteF92bXJlYWRfYml0bWFwLCAweGZmLCBQQUdFX1NJWkUpOwogCW1lbXNldCh2bXhfdm13cml0ZV9iaXRtYXAsIDB4ZmYsIFBBR0VfU0laRSk7CkBAIC02MzkyLDEyICs2NDM2LDEwIEBACiAKIAltZW1zZXQodm14X21zcl9iaXRtYXBfbGVnYWN5LCAweGZmLCBQQUdFX1NJWkUpOwogCW1lbXNldCh2bXhfbXNyX2JpdG1hcF9sb25nbW9kZSwgMHhmZiwgUEFHRV9TSVpFKTsKLQlpZiAobmVzdGVkKQotCQltZW1zZXQodm14X21zcl9iaXRtYXBfbmVzdGVkLCAweGZmLCBQQUdFX1NJWkUpOwogCiAJaWYgKHNldHVwX3ZtY3NfY29uZmlnKCZ2bWNzX2NvbmZpZykgPCAwKSB7CiAJCXIgPSAtRUlPOwotCQlnb3RvIG91dDg7CisJCWdvdG8gb3V0OTsKIAl9CiAKIAlpZiAoYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX05YKSkKQEAgLTY0NjQsMjAgKzY1MDYsMzUgQEAKIAkJCXZteF9tc3JfYml0bWFwX2xlZ2FjeSwgUEFHRV9TSVpFKTsKIAltZW1jcHkodm14X21zcl9iaXRtYXBfbG9uZ21vZGVfeDJhcGljLAogCQkJdm14X21zcl9iaXRtYXBfbG9uZ21vZGUsIFBBR0VfU0laRSk7CisJbWVtY3B5KHZteF9tc3JfYml0bWFwX2xlZ2FjeV94MmFwaWNfYXBpY3ZfaW5hY3RpdmUsCisJCQl2bXhfbXNyX2JpdG1hcF9sZWdhY3ksIFBBR0VfU0laRSk7CisJbWVtY3B5KHZteF9tc3JfYml0bWFwX2xvbmdtb2RlX3gyYXBpY19hcGljdl9pbmFjdGl2ZSwKKwkJCXZteF9tc3JfYml0bWFwX2xvbmdtb2RlLCBQQUdFX1NJWkUpOwogCiAJc2V0X2JpdCgwLCB2bXhfdnBpZF9iaXRtYXApOyAvKiAwIGlzIHJlc2VydmVkIGZvciBob3N0ICovCiAKKwkvKgorCSAqIGVuYWJsZV9hcGljdiAmJiBrdm1fdmNwdV9hcGljdl9hY3RpdmUoKQorCSAqLwogCWZvciAobXNyID0gMHg4MDA7IG1zciA8PSAweDhmZjsgbXNyKyspCi0JCXZteF9kaXNhYmxlX2ludGVyY2VwdF9tc3JfcmVhZF94MmFwaWMobXNyKTsKKwkJdm14X2Rpc2FibGVfaW50ZXJjZXB0X21zcl9yZWFkX3gyYXBpYyhtc3IsIHRydWUpOwogCiAJLyogVE1DQ1QgKi8KLQl2bXhfZW5hYmxlX2ludGVyY2VwdF9tc3JfcmVhZF94MmFwaWMoMHg4MzkpOworCXZteF9lbmFibGVfaW50ZXJjZXB0X21zcl9yZWFkX3gyYXBpYygweDgzOSwgdHJ1ZSk7CiAJLyogVFBSICovCi0Jdm14X2Rpc2FibGVfaW50ZXJjZXB0X21zcl93cml0ZV94MmFwaWMoMHg4MDgpOworCXZteF9kaXNhYmxlX2ludGVyY2VwdF9tc3Jfd3JpdGVfeDJhcGljKDB4ODA4LCB0cnVlKTsKIAkvKiBFT0kgKi8KLQl2bXhfZGlzYWJsZV9pbnRlcmNlcHRfbXNyX3dyaXRlX3gyYXBpYygweDgwYik7CisJdm14X2Rpc2FibGVfaW50ZXJjZXB0X21zcl93cml0ZV94MmFwaWMoMHg4MGIsIHRydWUpOwogCS8qIFNFTEYtSVBJICovCi0Jdm14X2Rpc2FibGVfaW50ZXJjZXB0X21zcl93cml0ZV94MmFwaWMoMHg4M2YpOworCXZteF9kaXNhYmxlX2ludGVyY2VwdF9tc3Jfd3JpdGVfeDJhcGljKDB4ODNmLCB0cnVlKTsKKworCS8qCisJICogKGVuYWJsZV9hcGljdiAmJiAha3ZtX3ZjcHVfYXBpY3ZfYWN0aXZlKCkpIHx8CisJICogCSFlbmFibGVfYXBpY3YKKwkgKi8KKwkvKiBUUFIgKi8KKwl2bXhfZGlzYWJsZV9pbnRlcmNlcHRfbXNyX3JlYWRfeDJhcGljKDB4ODA4LCBmYWxzZSk7CisJdm14X2Rpc2FibGVfaW50ZXJjZXB0X21zcl93cml0ZV94MmFwaWMoMHg4MDgsIGZhbHNlKTsKIAogCWlmIChlbmFibGVfZXB0KSB7CiAJCWt2bV9tbXVfc2V0X21hc2tfcHRlcyhWTVhfRVBUX1JFQURBQkxFX01BU0ssCkBAIC02NTI0LDE3ICs2NTgxLDE4IEBACiAKIAlyZXR1cm4gYWxsb2Nfa3ZtX2FyZWEoKTsKIAotb3V0ODoKK291dDk6CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXZteF92bXdyaXRlX2JpdG1hcCk7Ci1vdXQ3Ogorb3V0ODoKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdm14X3ZtcmVhZF9iaXRtYXApOworb3V0NzoKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdm14X21zcl9iaXRtYXBfbG9uZ21vZGVfeDJhcGljX2FwaWN2X2luYWN0aXZlKTsKIG91dDY6Ci0JaWYgKG5lc3RlZCkKLQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXZteF9tc3JfYml0bWFwX25lc3RlZCk7Ci1vdXQ1OgogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl2bXhfbXNyX2JpdG1hcF9sb25nbW9kZV94MmFwaWMpOwotb3V0NDoKK291dDU6CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXZteF9tc3JfYml0bWFwX2xvbmdtb2RlKTsKK291dDQ6CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXZteF9tc3JfYml0bWFwX2xlZ2FjeV94MmFwaWNfYXBpY3ZfaW5hY3RpdmUpOwogb3V0MzoKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdm14X21zcl9iaXRtYXBfbGVnYWN5X3gyYXBpYyk7CiBvdXQyOgpAQCAtNjU1MCwxNSArNjYwOCwxNSBAQAogc3RhdGljIF9fZXhpdCB2b2lkIGhhcmR3YXJlX3Vuc2V0dXAodm9pZCkKIHsKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdm14X21zcl9iaXRtYXBfbGVnYWN5X3gyYXBpYyk7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXZteF9tc3JfYml0bWFwX2xlZ2FjeV94MmFwaWNfYXBpY3ZfaW5hY3RpdmUpOwogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl2bXhfbXNyX2JpdG1hcF9sb25nbW9kZV94MmFwaWMpOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl2bXhfbXNyX2JpdG1hcF9sb25nbW9kZV94MmFwaWNfYXBpY3ZfaW5hY3RpdmUpOwogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl2bXhfbXNyX2JpdG1hcF9sZWdhY3kpOwogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl2bXhfbXNyX2JpdG1hcF9sb25nbW9kZSk7CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXZteF9pb19iaXRtYXBfYik7CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXZteF9pb19iaXRtYXBfYSk7CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXZteF92bXdyaXRlX2JpdG1hcCk7CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXZteF92bXJlYWRfYml0bWFwKTsKLQlpZiAobmVzdGVkKQotCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdm14X21zcl9iaXRtYXBfbmVzdGVkKTsKIAogCWZyZWVfa3ZtX2FyZWEoKTsKIH0KQEAgLTY3MzQsNyArNjc5Miw3IEBACiB7CiAJLyogVE9ETzogbm90IHRvIHJlc2V0IGd1ZXN0IHNpbXBseSBoZXJlLiAqLwogCWt2bV9tYWtlX3JlcXVlc3QoS1ZNX1JFUV9UUklQTEVfRkFVTFQsIHZjcHUpOwotCXByX3dhcm4oImt2bTogbmVzdGVkIHZteCBhYm9ydCwgaW5kaWNhdG9yICVkXG4iLCBpbmRpY2F0b3IpOworCXByX2RlYnVnX3JhdGVsaW1pdGVkKCJrdm06IG5lc3RlZCB2bXggYWJvcnQsIGluZGljYXRvciAlZFxuIiwgaW5kaWNhdG9yKTsKIH0KIAogc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IHZteF9wcmVlbXB0aW9uX3RpbWVyX2ZuKHN0cnVjdCBocnRpbWVyICp0aW1lcikKQEAgLTY5OTUsMTYgKzcwNTMsMjEgQEAKIAkJcmV0dXJuIDE7CiAJfQogCisJaWYgKGNwdV9oYXNfdm14X21zcl9iaXRtYXAoKSkgeworCQl2bXgtPm5lc3RlZC5tc3JfYml0bWFwID0KKwkJCQkodW5zaWduZWQgbG9uZyAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwkJaWYgKCF2bXgtPm5lc3RlZC5tc3JfYml0bWFwKQorCQkJZ290byBvdXRfbXNyX2JpdG1hcDsKKwl9CisKIAl2bXgtPm5lc3RlZC5jYWNoZWRfdm1jczEyID0ga21hbGxvYyhWTUNTMTJfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF2bXgtPm5lc3RlZC5jYWNoZWRfdm1jczEyKQotCQlyZXR1cm4gLUVOT01FTTsKKwkJZ290byBvdXRfY2FjaGVkX3ZtY3MxMjsKIAogCWlmIChlbmFibGVfc2hhZG93X3ZtY3MpIHsKIAkJc2hhZG93X3ZtY3MgPSBhbGxvY192bWNzKCk7Ci0JCWlmICghc2hhZG93X3ZtY3MpIHsKLQkJCWtmcmVlKHZteC0+bmVzdGVkLmNhY2hlZF92bWNzMTIpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KKwkJaWYgKCFzaGFkb3dfdm1jcykKKwkJCWdvdG8gb3V0X3NoYWRvd192bWNzOwogCQkvKiBtYXJrIHZtY3MgYXMgc2hhZG93ICovCiAJCXNoYWRvd192bWNzLT5yZXZpc2lvbl9pZCB8PSAoMXUgPDwgMzEpOwogCQkvKiBpbml0IHNoYWRvdyB2bWNzICovCkBAIC03MDE2LDcgKzcwNzksNyBAQAogCXZteC0+bmVzdGVkLnZtY3MwMl9udW0gPSAwOwogCiAJaHJ0aW1lcl9pbml0KCZ2bXgtPm5lc3RlZC5wcmVlbXB0aW9uX3RpbWVyLCBDTE9DS19NT05PVE9OSUMsCi0JCSAgICAgSFJUSU1FUl9NT0RFX1JFTCk7CisJCSAgICAgSFJUSU1FUl9NT0RFX1JFTF9QSU5ORUQpOwogCXZteC0+bmVzdGVkLnByZWVtcHRpb25fdGltZXIuZnVuY3Rpb24gPSB2bXhfcHJlZW1wdGlvbl90aW1lcl9mbjsKIAogCXZteC0+bmVzdGVkLnZteG9uID0gdHJ1ZTsKQEAgLTcwMjQsNiArNzA4NywxNSBAQAogCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CiAJbmVzdGVkX3ZteF9zdWNjZWVkKHZjcHUpOwogCXJldHVybiAxOworCitvdXRfc2hhZG93X3ZtY3M6CisJa2ZyZWUodm14LT5uZXN0ZWQuY2FjaGVkX3ZtY3MxMik7CisKK291dF9jYWNoZWRfdm1jczEyOgorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl2bXgtPm5lc3RlZC5tc3JfYml0bWFwKTsKKworb3V0X21zcl9iaXRtYXA6CisJcmV0dXJuIC1FTk9NRU07CiB9CiAKIC8qCkBAIC03MDk4LDYgKzcxNzAsMTAgQEAKIAl2bXgtPm5lc3RlZC52bXhvbiA9IGZhbHNlOwogCWZyZWVfdnBpZCh2bXgtPm5lc3RlZC52cGlkMDIpOwogCW5lc3RlZF9yZWxlYXNlX3ZtY3MxMih2bXgpOworCWlmICh2bXgtPm5lc3RlZC5tc3JfYml0bWFwKSB7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl2bXgtPm5lc3RlZC5tc3JfYml0bWFwKTsKKwkJdm14LT5uZXN0ZWQubXNyX2JpdG1hcCA9IE5VTEw7CisJfQogCWlmIChlbmFibGVfc2hhZG93X3ZtY3MpCiAJCWZyZWVfdm1jcyh2bXgtPm5lc3RlZC5jdXJyZW50X3NoYWRvd192bWNzKTsKIAlrZnJlZSh2bXgtPm5lc3RlZC5jYWNoZWRfdm1jczEyKTsKQEAgLTg0MTksMTIgKzg0OTUsMTMgQEAKIHsKIAl1MzIgc2VjX2V4ZWNfY29udHJvbDsKIAotCS8qCi0JICogVGhlcmUgaXMgbm90IHBvaW50IHRvIGVuYWJsZSB2aXJ0dWFsaXplIHgyYXBpYyB3aXRob3V0IGVuYWJsZQotCSAqIGFwaWN2Ci0JICovCi0JaWYgKCFjcHVfaGFzX3ZteF92aXJ0dWFsaXplX3gyYXBpY19tb2RlKCkgfHwKLQkJCQkha3ZtX3ZjcHVfYXBpY3ZfYWN0aXZlKHZjcHUpKQorCS8qIFBvc3Rwb25lIGV4ZWN1dGlvbiB1bnRpbCB2bWNzMDEgaXMgdGhlIGN1cnJlbnQgVk1DUy4gKi8KKwlpZiAoaXNfZ3Vlc3RfbW9kZSh2Y3B1KSkgeworCQl0b192bXgodmNwdSktPm5lc3RlZC5jaGFuZ2Vfdm1jczAxX3ZpcnR1YWxfeDJhcGljX21vZGUgPSB0cnVlOworCQlyZXR1cm47CisJfQorCisJaWYgKCFjcHVfaGFzX3ZteF92aXJ0dWFsaXplX3gyYXBpY19tb2RlKCkpCiAJCXJldHVybjsKIAogCWlmICghY3B1X25lZWRfdHByX3NoYWRvdyh2Y3B1KSkKQEAgLTk0NzIsOCArOTU0OSwxMCBAQAogewogCWludCBtc3I7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JdW5zaWduZWQgbG9uZyAqbXNyX2JpdG1hcDsKKwl1bnNpZ25lZCBsb25nICptc3JfYml0bWFwX2wxOworCXVuc2lnbmVkIGxvbmcgKm1zcl9iaXRtYXBfbDAgPSB0b192bXgodmNwdSktPm5lc3RlZC5tc3JfYml0bWFwOwogCisJLyogVGhpcyBzaG9ydGN1dCBpcyBvayBiZWNhdXNlIHdlIHN1cHBvcnQgb25seSB4MkFQSUMgTVNScyBzbyBmYXIuICovCiAJaWYgKCFuZXN0ZWRfY3B1X2hhc192aXJ0X3gyYXBpY19tb2RlKHZtY3MxMikpCiAJCXJldHVybiBmYWxzZTsKIApAQCAtOTQ4Miw2MyArOTU2MSwzNyBAQAogCQlXQVJOX09OKDEpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQotCW1zcl9iaXRtYXAgPSAodW5zaWduZWQgbG9uZyAqKWttYXAocGFnZSk7Ci0JaWYgKCFtc3JfYml0bWFwKSB7CisJbXNyX2JpdG1hcF9sMSA9ICh1bnNpZ25lZCBsb25nICopa21hcChwYWdlKTsKKwlpZiAoIW1zcl9iaXRtYXBfbDEpIHsKIAkJbmVzdGVkX3JlbGVhc2VfcGFnZV9jbGVhbihwYWdlKTsKIAkJV0FSTl9PTigxKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAorCW1lbXNldChtc3JfYml0bWFwX2wwLCAweGZmLCBQQUdFX1NJWkUpOworCiAJaWYgKG5lc3RlZF9jcHVfaGFzX3ZpcnRfeDJhcGljX21vZGUodm1jczEyKSkgewogCQlpZiAobmVzdGVkX2NwdV9oYXNfYXBpY19yZWdfdmlydCh2bWNzMTIpKQogCQkJZm9yIChtc3IgPSAweDgwMDsgbXNyIDw9IDB4OGZmOyBtc3IrKykKIAkJCQluZXN0ZWRfdm14X2Rpc2FibGVfaW50ZXJjZXB0X2Zvcl9tc3IoCi0JCQkJCW1zcl9iaXRtYXAsCi0JCQkJCXZteF9tc3JfYml0bWFwX25lc3RlZCwKKwkJCQkJbXNyX2JpdG1hcF9sMSwgbXNyX2JpdG1hcF9sMCwKIAkJCQkJbXNyLCBNU1JfVFlQRV9SKTsKLQkJLyogVFBSIGlzIGFsbG93ZWQgKi8KLQkJbmVzdGVkX3ZteF9kaXNhYmxlX2ludGVyY2VwdF9mb3JfbXNyKG1zcl9iaXRtYXAsCi0JCQkJdm14X21zcl9iaXRtYXBfbmVzdGVkLAorCisJCW5lc3RlZF92bXhfZGlzYWJsZV9pbnRlcmNlcHRfZm9yX21zcigKKwkJCQltc3JfYml0bWFwX2wxLCBtc3JfYml0bWFwX2wwLAogCQkJCUFQSUNfQkFTRV9NU1IgKyAoQVBJQ19UQVNLUFJJID4+IDQpLAogCQkJCU1TUl9UWVBFX1IgfCBNU1JfVFlQRV9XKTsKKwogCQlpZiAobmVzdGVkX2NwdV9oYXNfdmlkKHZtY3MxMikpIHsKLQkJCS8qIEVPSSBhbmQgc2VsZi1JUEkgYXJlIGFsbG93ZWQgKi8KIAkJCW5lc3RlZF92bXhfZGlzYWJsZV9pbnRlcmNlcHRfZm9yX21zcigKLQkJCQltc3JfYml0bWFwLAotCQkJCXZteF9tc3JfYml0bWFwX25lc3RlZCwKKwkJCQltc3JfYml0bWFwX2wxLCBtc3JfYml0bWFwX2wwLAogCQkJCUFQSUNfQkFTRV9NU1IgKyAoQVBJQ19FT0kgPj4gNCksCiAJCQkJTVNSX1RZUEVfVyk7CiAJCQluZXN0ZWRfdm14X2Rpc2FibGVfaW50ZXJjZXB0X2Zvcl9tc3IoCi0JCQkJbXNyX2JpdG1hcCwKLQkJCQl2bXhfbXNyX2JpdG1hcF9uZXN0ZWQsCisJCQkJbXNyX2JpdG1hcF9sMSwgbXNyX2JpdG1hcF9sMCwKIAkJCQlBUElDX0JBU0VfTVNSICsgKEFQSUNfU0VMRl9JUEkgPj4gNCksCiAJCQkJTVNSX1RZUEVfVyk7CiAJCX0KLQl9IGVsc2UgewotCQkvKgotCQkgKiBFbmFibGUgcmVhZGluZyBpbnRlcmNlcHQgb2YgYWxsIHRoZSB4MmFwaWMKLQkJICogTVNScy4gV2Ugc2hvdWxkIG5vdCByZWx5IG9uIHZtY3MxMiB0byBkbyBhbnkKLQkJICogb3B0aW1pemF0aW9ucyBoZXJlLCBpdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkCi0JCSAqIGJ5IEwxLgotCQkgKi8KLQkJZm9yIChtc3IgPSAweDgwMDsgbXNyIDw9IDB4OGZmOyBtc3IrKykKLQkJCV9fdm14X2VuYWJsZV9pbnRlcmNlcHRfZm9yX21zcigKLQkJCQl2bXhfbXNyX2JpdG1hcF9uZXN0ZWQsCi0JCQkJbXNyLAotCQkJCU1TUl9UWVBFX1IpOwotCi0JCV9fdm14X2VuYWJsZV9pbnRlcmNlcHRfZm9yX21zcigKLQkJCQl2bXhfbXNyX2JpdG1hcF9uZXN0ZWQsCi0JCQkJQVBJQ19CQVNFX01TUiArIChBUElDX1RBU0tQUkkgPj4gNCksCi0JCQkJTVNSX1RZUEVfVyk7Ci0JCV9fdm14X2VuYWJsZV9pbnRlcmNlcHRfZm9yX21zcigKLQkJCQl2bXhfbXNyX2JpdG1hcF9uZXN0ZWQsCi0JCQkJQVBJQ19CQVNFX01TUiArIChBUElDX0VPSSA+PiA0KSwKLQkJCQlNU1JfVFlQRV9XKTsKLQkJX192bXhfZW5hYmxlX2ludGVyY2VwdF9mb3JfbXNyKAotCQkJCXZteF9tc3JfYml0bWFwX25lc3RlZCwKLQkJCQlBUElDX0JBU0VfTVNSICsgKEFQSUNfU0VMRl9JUEkgPj4gNCksCi0JCQkJTVNSX1RZUEVfVyk7CiAJfQogCWt1bm1hcChwYWdlKTsKIAluZXN0ZWRfcmVsZWFzZV9wYWdlX2NsZWFuKHBhZ2UpOwpAQCAtOTYwNiw3ICs5NjU5LDcgQEAKIAltYXhwaHlhZGRyID0gY3B1aWRfbWF4cGh5YWRkcih2Y3B1KTsKIAlpZiAoIUlTX0FMSUdORUQoYWRkciwgMTYpIHx8IGFkZHIgPj4gbWF4cGh5YWRkciB8fAogCSAgICAoYWRkciArIGNvdW50ICogc2l6ZW9mKHN0cnVjdCB2bXhfbXNyX2VudHJ5KSAtIDEpID4+IG1heHBoeWFkZHIpIHsKLQkJcHJfd2Fybl9yYXRlbGltaXRlZCgKKwkJcHJfZGVidWdfcmF0ZWxpbWl0ZWQoCiAJCQkiblZNWDogaW52YWxpZCBNU1Igc3dpdGNoICgweCVseCwgJWQsICVsbHUsIDB4JTA4bGx4KSIsCiAJCQlhZGRyX2ZpZWxkLCBtYXhwaHlhZGRyLCBjb3VudCwgYWRkcik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtOTY3OSwxMyArOTczMiwxMyBAQAogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAJCWlmIChrdm1fdmNwdV9yZWFkX2d1ZXN0KHZjcHUsIGdwYSArIGkgKiBzaXplb2YoZSksCiAJCQkJCSZlLCBzaXplb2YoZSkpKSB7Ci0JCQlwcl93YXJuX3JhdGVsaW1pdGVkKAorCQkJcHJfZGVidWdfcmF0ZWxpbWl0ZWQoCiAJCQkJIiVzIGNhbm5vdCByZWFkIE1TUiBlbnRyeSAoJXUsIDB4JTA4bGx4KVxuIiwKIAkJCQlfX2Z1bmNfXywgaSwgZ3BhICsgaSAqIHNpemVvZihlKSk7CiAJCQlnb3RvIGZhaWw7CiAJCX0KIAkJaWYgKG5lc3RlZF92bXhfbG9hZF9tc3JfY2hlY2sodmNwdSwgJmUpKSB7Ci0JCQlwcl93YXJuX3JhdGVsaW1pdGVkKAorCQkJcHJfZGVidWdfcmF0ZWxpbWl0ZWQoCiAJCQkJIiVzIGNoZWNrIGZhaWxlZCAoJXUsIDB4JXgsIDB4JXgpXG4iLAogCQkJCV9fZnVuY19fLCBpLCBlLmluZGV4LCBlLnJlc2VydmVkKTsKIAkJCWdvdG8gZmFpbDsKQEAgLTk2OTMsNyArOTc0Niw3IEBACiAJCW1zci5pbmRleCA9IGUuaW5kZXg7CiAJCW1zci5kYXRhID0gZS52YWx1ZTsKIAkJaWYgKGt2bV9zZXRfbXNyKHZjcHUsICZtc3IpKSB7Ci0JCQlwcl93YXJuX3JhdGVsaW1pdGVkKAorCQkJcHJfZGVidWdfcmF0ZWxpbWl0ZWQoCiAJCQkJIiVzIGNhbm5vdCB3cml0ZSBNU1IgKCV1LCAweCV4LCAweCVsbHgpXG4iLAogCQkJCV9fZnVuY19fLCBpLCBlLmluZGV4LCBlLnZhbHVlKTsKIAkJCWdvdG8gZmFpbDsKQEAgLTk3MTQsMTMgKzk3NjcsMTMgQEAKIAkJaWYgKGt2bV92Y3B1X3JlYWRfZ3Vlc3QodmNwdSwKIAkJCQkJZ3BhICsgaSAqIHNpemVvZihlKSwKIAkJCQkJJmUsIDIgKiBzaXplb2YodTMyKSkpIHsKLQkJCXByX3dhcm5fcmF0ZWxpbWl0ZWQoCisJCQlwcl9kZWJ1Z19yYXRlbGltaXRlZCgKIAkJCQkiJXMgY2Fubm90IHJlYWQgTVNSIGVudHJ5ICgldSwgMHglMDhsbHgpXG4iLAogCQkJCV9fZnVuY19fLCBpLCBncGEgKyBpICogc2l6ZW9mKGUpKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWlmIChuZXN0ZWRfdm14X3N0b3JlX21zcl9jaGVjayh2Y3B1LCAmZSkpIHsKLQkJCXByX3dhcm5fcmF0ZWxpbWl0ZWQoCisJCQlwcl9kZWJ1Z19yYXRlbGltaXRlZCgKIAkJCQkiJXMgY2hlY2sgZmFpbGVkICgldSwgMHgleCwgMHgleClcbiIsCiAJCQkJX19mdW5jX18sIGksIGUuaW5kZXgsIGUucmVzZXJ2ZWQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC05NzI4LDcgKzk3ODEsNyBAQAogCQltc3JfaW5mby5ob3N0X2luaXRpYXRlZCA9IGZhbHNlOwogCQltc3JfaW5mby5pbmRleCA9IGUuaW5kZXg7CiAJCWlmIChrdm1fZ2V0X21zcih2Y3B1LCAmbXNyX2luZm8pKSB7Ci0JCQlwcl93YXJuX3JhdGVsaW1pdGVkKAorCQkJcHJfZGVidWdfcmF0ZWxpbWl0ZWQoCiAJCQkJIiVzIGNhbm5vdCByZWFkIE1TUiAoJXUsIDB4JXgpXG4iLAogCQkJCV9fZnVuY19fLCBpLCBlLmluZGV4KTsKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtOTczNyw3ICs5NzkwLDcgQEAKIAkJCQkJIGdwYSArIGkgKiBzaXplb2YoZSkgKwogCQkJCQkgICAgIG9mZnNldG9mKHN0cnVjdCB2bXhfbXNyX2VudHJ5LCB2YWx1ZSksCiAJCQkJCSAmbXNyX2luZm8uZGF0YSwgc2l6ZW9mKG1zcl9pbmZvLmRhdGEpKSkgewotCQkJcHJfd2Fybl9yYXRlbGltaXRlZCgKKwkJCXByX2RlYnVnX3JhdGVsaW1pdGVkKAogCQkJCSIlcyBjYW5ub3Qgd3JpdGUgTVNSICgldSwgMHgleCwgMHglbGx4KVxuIiwKIAkJCQlfX2Z1bmNfXywgaSwgZS5pbmRleCwgbXNyX2luZm8uZGF0YSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTk5NTcsMTAgKzEwMDEwLDEwIEBACiAJfQogCiAJaWYgKGNwdV9oYXNfdm14X21zcl9iaXRtYXAoKSAmJgotCSAgICBleGVjX2NvbnRyb2wgJiBDUFVfQkFTRURfVVNFX01TUl9CSVRNQVBTKSB7Ci0JCW5lc3RlZF92bXhfbWVyZ2VfbXNyX2JpdG1hcCh2Y3B1LCB2bWNzMTIpOwotCQkvKiBNU1JfQklUTUFQIHdpbGwgYmUgc2V0IGJ5IGZvbGxvd2luZyB2bXhfc2V0X2VmZXIuICovCi0JfSBlbHNlCisJICAgIGV4ZWNfY29udHJvbCAmIENQVV9CQVNFRF9VU0VfTVNSX0JJVE1BUFMgJiYKKwkgICAgbmVzdGVkX3ZteF9tZXJnZV9tc3JfYml0bWFwKHZjcHUsIHZtY3MxMikpCisJCTsgLyogTVNSX0JJVE1BUCB3aWxsIGJlIHNldCBieSBmb2xsb3dpbmcgdm14X3NldF9lZmVyLiAqLworCWVsc2UKIAkJZXhlY19jb250cm9sICY9IH5DUFVfQkFTRURfVVNFX01TUl9CSVRNQVBTOwogCiAJLyoKQEAgLTEwMDExLDYgKzEwMDY0LDggQEAKIAkJCXZteC0+bmVzdGVkLnZtY3MwMV90c2Nfb2Zmc2V0ICsgdm1jczEyLT50c2Nfb2Zmc2V0KTsKIAllbHNlCiAJCXZtY3Nfd3JpdGU2NChUU0NfT0ZGU0VULCB2bXgtPm5lc3RlZC52bWNzMDFfdHNjX29mZnNldCk7CisJaWYgKGt2bV9oYXNfdHNjX2NvbnRyb2wpCisJCWRlY2FjaGVfdHNjX211bHRpcGxpZXIodm14KTsKIAogCWlmIChlbmFibGVfdnBpZCkgewogCQkvKgpAQCAtMTA1MDYsNiArMTA1NjEsOSBAQAogCQl2bWNzMTItPmd1ZXN0X3BkcHRyMyA9IHZtY3NfcmVhZDY0KEdVRVNUX1BEUFRSMyk7CiAJfQogCisJaWYgKG5lc3RlZF9jcHVfaGFzX2VwdCh2bWNzMTIpKQorCQl2bWNzMTItPmd1ZXN0X2xpbmVhcl9hZGRyZXNzID0gdm1jc19yZWFkbChHVUVTVF9MSU5FQVJfQUREUkVTUyk7CisKIAlpZiAobmVzdGVkX2NwdV9oYXNfdmlkKHZtY3MxMikpCiAJCXZtY3MxMi0+Z3Vlc3RfaW50cl9zdGF0dXMgPSB2bWNzX3JlYWQxNihHVUVTVF9JTlRSX1NUQVRVUyk7CiAKQEAgLTEwNzY3LDYgKzEwODI1LDE0IEBACiAJZWxzZQogCQl2bWNzX3NldF9iaXRzKFBJTl9CQVNFRF9WTV9FWEVDX0NPTlRST0wsCiAJCQkgICAgICBQSU5fQkFTRURfVk1YX1BSRUVNUFRJT05fVElNRVIpOworCWlmIChrdm1faGFzX3RzY19jb250cm9sKQorCQlkZWNhY2hlX3RzY19tdWx0aXBsaWVyKHZteCk7CisKKwlpZiAodm14LT5uZXN0ZWQuY2hhbmdlX3ZtY3MwMV92aXJ0dWFsX3gyYXBpY19tb2RlKSB7CisJCXZteC0+bmVzdGVkLmNoYW5nZV92bWNzMDFfdmlydHVhbF94MmFwaWNfbW9kZSA9IGZhbHNlOworCQl2bXhfc2V0X3ZpcnR1YWxfeDJhcGljX21vZGUodmNwdSwKKwkJCQl2Y3B1LT5hcmNoLmFwaWNfYmFzZSAmIFgyQVBJQ19FTkFCTEUpOworCX0KIAogCS8qIFRoaXMgaXMgbmVlZGVkIGZvciBzYW1lIHJlYXNvbiBhcyBpdCB3YXMgbmVlZGVkIGluIHByZXBhcmVfdm1jczAyICovCiAJdm14LT5ob3N0X3JzcCA9IDA7CkBAIC0xMDc5MSw3ICsxMDg1Nyw3IEBACiAJICogV2UgYXJlIG5vdyBydW5uaW5nIGluIEwyLCBtbXVfbm90aWZpZXIgd2lsbCBmb3JjZSB0byByZWxvYWQgdGhlCiAJICogcGFnZSdzIGhwYSBmb3IgTDIgdm1jcy4gTmVlZCB0byByZWxvYWQgaXQgZm9yIEwxIGJlZm9yZSBlbnRlcmluZyBMMS4KIAkgKi8KLQlrdm1fdmNwdV9yZWxvYWRfYXBpY19hY2Nlc3NfcGFnZSh2Y3B1KTsKKwlrdm1fbWFrZV9yZXF1ZXN0KEtWTV9SRVFfQVBJQ19QQUdFX1JFTE9BRCwgdmNwdSk7CiAKIAkvKgogCSAqIEV4aXRpbmcgZnJvbSBMMiB0byBMMSwgd2UncmUgbm93IGJhY2sgdG8gTDEgd2hpY2ggdGhpbmtzIGl0IGp1c3QKQEAgLTExMTc1LDcgKzExMjQxLDcgQEAKIAkJCX5GRUFUVVJFX0NPTlRST0xfTE1DRTsKIH0KIAotc3RhdGljIHN0cnVjdCBrdm1feDg2X29wcyB2bXhfeDg2X29wcyA9IHsKK3N0YXRpYyBzdHJ1Y3Qga3ZtX3g4Nl9vcHMgdm14X3g4Nl9vcHMgX19yb19hZnRlcl9pbml0ID0gewogCS5jcHVfaGFzX2t2bV9zdXBwb3J0ID0gY3B1X2hhc19rdm1fc3VwcG9ydCwKIAkuZGlzYWJsZWRfYnlfYmlvcyA9IHZteF9kaXNhYmxlZF9ieV9iaW9zLAogCS5oYXJkd2FyZV9zZXR1cCA9IGhhcmR3YXJlX3NldHVwLApAQCAtMTEyNzIsNyArMTEzMzgsNiBAQAogCiAJLmhhc193YmludmRfZXhpdCA9IGNwdV9oYXNfdm14X3diaW52ZF9leGl0LAogCi0JLnJlYWRfdHNjX29mZnNldCA9IHZteF9yZWFkX3RzY19vZmZzZXQsCiAJLndyaXRlX3RzY19vZmZzZXQgPSB2bXhfd3JpdGVfdHNjX29mZnNldCwKIAkuYWRqdXN0X3RzY19vZmZzZXRfZ3Vlc3QgPSB2bXhfYWRqdXN0X3RzY19vZmZzZXRfZ3Vlc3QsCiAJLnJlYWRfbDFfdHNjID0gdm14X3JlYWRfbDFfdHNjLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL3g4Ni5jIGIvYXJjaC94ODYva3ZtL3g4Ni5jCmluZGV4IDE5ZjlmOWUuLjZjNjMzZGUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS94ODYuYworKysgYi9hcmNoL3g4Ni9rdm0veDg2LmMKQEAgLTEzNjcsNyArMTM2Nyw3IEBACiAKIHN0YXRpYyB2b2lkIHVwZGF0ZV9pYTMyX3RzY19hZGp1c3RfbXNyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgczY0IG9mZnNldCkKIHsKLQl1NjQgY3Vycl9vZmZzZXQgPSBrdm1feDg2X29wcy0+cmVhZF90c2Nfb2Zmc2V0KHZjcHUpOworCXU2NCBjdXJyX29mZnNldCA9IHZjcHUtPmFyY2gudHNjX29mZnNldDsKIAl2Y3B1LT5hcmNoLmlhMzJfdHNjX2FkanVzdF9tc3IgKz0gb2Zmc2V0IC0gY3Vycl9vZmZzZXQ7CiB9CiAKQEAgLTE0MTMsNiArMTQxMywxMiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX3JlYWRfbDFfdHNjKTsKIAorc3RhdGljIHZvaWQga3ZtX3ZjcHVfd3JpdGVfdHNjX29mZnNldChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBvZmZzZXQpCit7CisJa3ZtX3g4Nl9vcHMtPndyaXRlX3RzY19vZmZzZXQodmNwdSwgb2Zmc2V0KTsKKwl2Y3B1LT5hcmNoLnRzY19vZmZzZXQgPSBvZmZzZXQ7Cit9CisKIHZvaWQga3ZtX3dyaXRlX3RzYyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBtc3JfZGF0YSAqbXNyKQogewogCXN0cnVjdCBrdm0gKmt2bSA9IHZjcHUtPmt2bTsKQEAgLTE0MjUsNyArMTQzMSw3IEBACiAKIAlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmt2bS0+YXJjaC50c2Nfd3JpdGVfbG9jaywgZmxhZ3MpOwogCW9mZnNldCA9IGt2bV9jb21wdXRlX3RzY19vZmZzZXQodmNwdSwgZGF0YSk7Ci0JbnMgPSBnZXRfa2VybmVsX25zKCk7CisJbnMgPSBrdGltZV9nZXRfYm9vdF9ucygpOwogCWVsYXBzZWQgPSBucyAtIGt2bS0+YXJjaC5sYXN0X3RzY19uc2VjOwogCiAJaWYgKHZjcHUtPmFyY2gudmlydHVhbF90c2Nfa2h6KSB7CkBAIC0xNTIyLDcgKzE1MjgsNyBAQAogCiAJaWYgKGd1ZXN0X2NwdWlkX2hhc190c2NfYWRqdXN0KHZjcHUpICYmICFtc3ItPmhvc3RfaW5pdGlhdGVkKQogCQl1cGRhdGVfaWEzMl90c2NfYWRqdXN0X21zcih2Y3B1LCBvZmZzZXQpOwotCWt2bV94ODZfb3BzLT53cml0ZV90c2Nfb2Zmc2V0KHZjcHUsIG9mZnNldCk7CisJa3ZtX3ZjcHVfd3JpdGVfdHNjX29mZnNldCh2Y3B1LCBvZmZzZXQpOwogCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZrdm0tPmFyY2gudHNjX3dyaXRlX2xvY2ssIGZsYWdzKTsKIAogCXNwaW5fbG9jaygma3ZtLT5hcmNoLnB2Y2xvY2tfZ3RvZF9zeW5jX2xvY2spOwpAQCAtMTcxNiw2ICsxNzIyLDg4IEBACiAjZW5kaWYKIH0KIAorc3RhdGljIHU2NCBfX2dldF9rdm1jbG9ja19ucyhzdHJ1Y3Qga3ZtICprdm0pCit7CisJc3RydWN0IGt2bV92Y3B1ICp2Y3B1ID0ga3ZtX2dldF92Y3B1KGt2bSwgMCk7CisJc3RydWN0IGt2bV9hcmNoICprYSA9ICZrdm0tPmFyY2g7CisJczY0IG5zOworCisJaWYgKHZjcHUtPmFyY2guaHZfY2xvY2suZmxhZ3MgJiBQVkNMT0NLX1RTQ19TVEFCTEVfQklUKSB7CisJCXU2NCB0c2MgPSBrdm1fcmVhZF9sMV90c2ModmNwdSwgcmR0c2MoKSk7CisJCW5zID0gX19wdmNsb2NrX3JlYWRfY3ljbGVzKCZ2Y3B1LT5hcmNoLmh2X2Nsb2NrLCB0c2MpOworCX0gZWxzZSB7CisJCW5zID0ga3RpbWVfZ2V0X2Jvb3RfbnMoKSArIGthLT5rdm1jbG9ja19vZmZzZXQ7CisJfQorCisJcmV0dXJuIG5zOworfQorCit1NjQgZ2V0X2t2bWNsb2NrX25zKHN0cnVjdCBrdm0gKmt2bSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXM2NCBuczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlucyA9IF9fZ2V0X2t2bWNsb2NrX25zKGt2bSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIG5zOworfQorCitzdGF0aWMgdm9pZCBrdm1fc2V0dXBfcHZjbG9ja19wYWdlKHN0cnVjdCBrdm1fdmNwdSAqdikKK3sKKwlzdHJ1Y3Qga3ZtX3ZjcHVfYXJjaCAqdmNwdSA9ICZ2LT5hcmNoOworCXN0cnVjdCBwdmNsb2NrX3ZjcHVfdGltZV9pbmZvIGd1ZXN0X2h2X2Nsb2NrOworCisJaWYgKHVubGlrZWx5KGt2bV9yZWFkX2d1ZXN0X2NhY2hlZCh2LT5rdm0sICZ2Y3B1LT5wdl90aW1lLAorCQkmZ3Vlc3RfaHZfY2xvY2ssIHNpemVvZihndWVzdF9odl9jbG9jaykpKSkKKwkJcmV0dXJuOworCisJLyogVGhpcyBWQ1BVIGlzIHBhdXNlZCwgYnV0IGl0J3MgbGVnYWwgZm9yIGEgZ3Vlc3QgdG8gcmVhZCBhbm90aGVyCisJICogVkNQVSdzIGt2bWNsb2NrLCBzbyB3ZSByZWFsbHkgaGF2ZSB0byBmb2xsb3cgdGhlIHNwZWNpZmljYXRpb24gd2hlcmUKKwkgKiBpdCBzYXlzIHRoYXQgdmVyc2lvbiBpcyBvZGQgaWYgZGF0YSBpcyBiZWluZyBtb2RpZmllZCwgYW5kIGV2ZW4gYWZ0ZXIKKwkgKiBpdCBpcyBjb25zaXN0ZW50LgorCSAqCisJICogVmVyc2lvbiBmaWVsZCB1cGRhdGVzIG11c3QgYmUga2VwdCBzZXBhcmF0ZS4gIFRoaXMgaXMgYmVjYXVzZQorCSAqIGt2bV93cml0ZV9ndWVzdF9jYWNoZWQgbWlnaHQgdXNlIGEgInJlcCBtb3ZzIiBpbnN0cnVjdGlvbiwgYW5kCisJICogd3JpdGVzIHdpdGhpbiBhIHN0cmluZyBpbnN0cnVjdGlvbiBhcmUgd2Vha2x5IG9yZGVyZWQuICBTbyB0aGVyZQorCSAqIGFyZSB0aHJlZSB3cml0ZXMgb3ZlcmFsbC4KKwkgKgorCSAqIEFzIGEgc21hbGwgb3B0aW1pemF0aW9uLCBvbmx5IHdyaXRlIHRoZSB2ZXJzaW9uIGZpZWxkIGluIHRoZSBmaXJzdAorCSAqIGFuZCB0aGlyZCB3cml0ZS4gIFRoZSB2Y3B1LT5wdl90aW1lIGNhY2hlIGlzIHN0aWxsIHZhbGlkLCBiZWNhdXNlIHRoZQorCSAqIHZlcnNpb24gZmllbGQgaXMgdGhlIGZpcnN0IGluIHRoZSBzdHJ1Y3QuCisJICovCisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwdmNsb2NrX3ZjcHVfdGltZV9pbmZvLCB2ZXJzaW9uKSAhPSAwKTsKKworCXZjcHUtPmh2X2Nsb2NrLnZlcnNpb24gPSBndWVzdF9odl9jbG9jay52ZXJzaW9uICsgMTsKKwlrdm1fd3JpdGVfZ3Vlc3RfY2FjaGVkKHYtPmt2bSwgJnZjcHUtPnB2X3RpbWUsCisJCQkJJnZjcHUtPmh2X2Nsb2NrLAorCQkJCXNpemVvZih2Y3B1LT5odl9jbG9jay52ZXJzaW9uKSk7CisKKwlzbXBfd21iKCk7CisKKwkvKiByZXRhaW4gUFZDTE9DS19HVUVTVF9TVE9QUEVEIGlmIHNldCBpbiBndWVzdCBjb3B5ICovCisJdmNwdS0+aHZfY2xvY2suZmxhZ3MgfD0gKGd1ZXN0X2h2X2Nsb2NrLmZsYWdzICYgUFZDTE9DS19HVUVTVF9TVE9QUEVEKTsKKworCWlmICh2Y3B1LT5wdmNsb2NrX3NldF9ndWVzdF9zdG9wcGVkX3JlcXVlc3QpIHsKKwkJdmNwdS0+aHZfY2xvY2suZmxhZ3MgfD0gUFZDTE9DS19HVUVTVF9TVE9QUEVEOworCQl2Y3B1LT5wdmNsb2NrX3NldF9ndWVzdF9zdG9wcGVkX3JlcXVlc3QgPSBmYWxzZTsKKwl9CisKKwl0cmFjZV9rdm1fcHZjbG9ja191cGRhdGUodi0+dmNwdV9pZCwgJnZjcHUtPmh2X2Nsb2NrKTsKKworCWt2bV93cml0ZV9ndWVzdF9jYWNoZWQodi0+a3ZtLCAmdmNwdS0+cHZfdGltZSwKKwkJCQkmdmNwdS0+aHZfY2xvY2ssCisJCQkJc2l6ZW9mKHZjcHUtPmh2X2Nsb2NrKSk7CisKKwlzbXBfd21iKCk7CisKKwl2Y3B1LT5odl9jbG9jay52ZXJzaW9uKys7CisJa3ZtX3dyaXRlX2d1ZXN0X2NhY2hlZCh2LT5rdm0sICZ2Y3B1LT5wdl90aW1lLAorCQkJCSZ2Y3B1LT5odl9jbG9jaywKKwkJCQlzaXplb2YodmNwdS0+aHZfY2xvY2sudmVyc2lvbikpOworfQorCiBzdGF0aWMgaW50IGt2bV9ndWVzdF90aW1lX3VwZGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnYpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgdGd0X3RzY19raHo7CkBAIC0xNzIzLDcgKzE4MTEsNiBAQAogCXN0cnVjdCBrdm1fYXJjaCAqa2EgPSAmdi0+a3ZtLT5hcmNoOwogCXM2NCBrZXJuZWxfbnM7CiAJdTY0IHRzY190aW1lc3RhbXAsIGhvc3RfdHNjOwotCXN0cnVjdCBwdmNsb2NrX3ZjcHVfdGltZV9pbmZvIGd1ZXN0X2h2X2Nsb2NrOwogCXU4IHB2Y2xvY2tfZmxhZ3M7CiAJYm9vbCB1c2VfbWFzdGVyX2Nsb2NrOwogCkBAIC0xNzUyLDcgKzE4MzksNyBAQAogCX0KIAlpZiAoIXVzZV9tYXN0ZXJfY2xvY2spIHsKIAkJaG9zdF90c2MgPSByZHRzYygpOwotCQlrZXJuZWxfbnMgPSBnZXRfa2VybmVsX25zKCk7CisJCWtlcm5lbF9ucyA9IGt0aW1lX2dldF9ib290X25zKCk7CiAJfQogCiAJdHNjX3RpbWVzdGFtcCA9IGt2bV9yZWFkX2wxX3RzYyh2LCBob3N0X3RzYyk7CkBAIC0xNzc3LDggKzE4NjQsNyBAQAogCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCi0JaWYgKCF2Y3B1LT5wdl90aW1lX2VuYWJsZWQpCi0JCXJldHVybiAwOworCS8qIFdpdGggYWxsIHRoZSBpbmZvIHdlIGdvdCwgZmlsbCBpbiB0aGUgdmFsdWVzICovCiAKIAlpZiAoa3ZtX2hhc190c2NfY29udHJvbCkKIAkJdGd0X3RzY19raHogPSBrdm1fc2NhbGVfdHNjKHYsIHRndF90c2Nfa2h6KTsKQEAgLTE3OTAsNjQgKzE4NzYsMjEgQEAKIAkJdmNwdS0+aHdfdHNjX2toeiA9IHRndF90c2Nfa2h6OwogCX0KIAotCS8qIFdpdGggYWxsIHRoZSBpbmZvIHdlIGdvdCwgZmlsbCBpbiB0aGUgdmFsdWVzICovCiAJdmNwdS0+aHZfY2xvY2sudHNjX3RpbWVzdGFtcCA9IHRzY190aW1lc3RhbXA7CiAJdmNwdS0+aHZfY2xvY2suc3lzdGVtX3RpbWUgPSBrZXJuZWxfbnMgKyB2LT5rdm0tPmFyY2gua3ZtY2xvY2tfb2Zmc2V0OwogCXZjcHUtPmxhc3RfZ3Vlc3RfdHNjID0gdHNjX3RpbWVzdGFtcDsKIAotCWlmICh1bmxpa2VseShrdm1fcmVhZF9ndWVzdF9jYWNoZWQodi0+a3ZtLCAmdmNwdS0+cHZfdGltZSwKLQkJJmd1ZXN0X2h2X2Nsb2NrLCBzaXplb2YoZ3Vlc3RfaHZfY2xvY2spKSkpCi0JCXJldHVybiAwOwotCi0JLyogVGhpcyBWQ1BVIGlzIHBhdXNlZCwgYnV0IGl0J3MgbGVnYWwgZm9yIGEgZ3Vlc3QgdG8gcmVhZCBhbm90aGVyCi0JICogVkNQVSdzIGt2bWNsb2NrLCBzbyB3ZSByZWFsbHkgaGF2ZSB0byBmb2xsb3cgdGhlIHNwZWNpZmljYXRpb24gd2hlcmUKLQkgKiBpdCBzYXlzIHRoYXQgdmVyc2lvbiBpcyBvZGQgaWYgZGF0YSBpcyBiZWluZyBtb2RpZmllZCwgYW5kIGV2ZW4gYWZ0ZXIKLQkgKiBpdCBpcyBjb25zaXN0ZW50LgotCSAqCi0JICogVmVyc2lvbiBmaWVsZCB1cGRhdGVzIG11c3QgYmUga2VwdCBzZXBhcmF0ZS4gIFRoaXMgaXMgYmVjYXVzZQotCSAqIGt2bV93cml0ZV9ndWVzdF9jYWNoZWQgbWlnaHQgdXNlIGEgInJlcCBtb3ZzIiBpbnN0cnVjdGlvbiwgYW5kCi0JICogd3JpdGVzIHdpdGhpbiBhIHN0cmluZyBpbnN0cnVjdGlvbiBhcmUgd2Vha2x5IG9yZGVyZWQuICBTbyB0aGVyZQotCSAqIGFyZSB0aHJlZSB3cml0ZXMgb3ZlcmFsbC4KLQkgKgotCSAqIEFzIGEgc21hbGwgb3B0aW1pemF0aW9uLCBvbmx5IHdyaXRlIHRoZSB2ZXJzaW9uIGZpZWxkIGluIHRoZSBmaXJzdAotCSAqIGFuZCB0aGlyZCB3cml0ZS4gIFRoZSB2Y3B1LT5wdl90aW1lIGNhY2hlIGlzIHN0aWxsIHZhbGlkLCBiZWNhdXNlIHRoZQotCSAqIHZlcnNpb24gZmllbGQgaXMgdGhlIGZpcnN0IGluIHRoZSBzdHJ1Y3QuCi0JICovCi0JQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwdmNsb2NrX3ZjcHVfdGltZV9pbmZvLCB2ZXJzaW9uKSAhPSAwKTsKLQotCXZjcHUtPmh2X2Nsb2NrLnZlcnNpb24gPSBndWVzdF9odl9jbG9jay52ZXJzaW9uICsgMTsKLQlrdm1fd3JpdGVfZ3Vlc3RfY2FjaGVkKHYtPmt2bSwgJnZjcHUtPnB2X3RpbWUsCi0JCQkJJnZjcHUtPmh2X2Nsb2NrLAotCQkJCXNpemVvZih2Y3B1LT5odl9jbG9jay52ZXJzaW9uKSk7Ci0KLQlzbXBfd21iKCk7Ci0KLQkvKiByZXRhaW4gUFZDTE9DS19HVUVTVF9TVE9QUEVEIGlmIHNldCBpbiBndWVzdCBjb3B5ICovCi0JcHZjbG9ja19mbGFncyA9IChndWVzdF9odl9jbG9jay5mbGFncyAmIFBWQ0xPQ0tfR1VFU1RfU1RPUFBFRCk7Ci0KLQlpZiAodmNwdS0+cHZjbG9ja19zZXRfZ3Vlc3Rfc3RvcHBlZF9yZXF1ZXN0KSB7Ci0JCXB2Y2xvY2tfZmxhZ3MgfD0gUFZDTE9DS19HVUVTVF9TVE9QUEVEOwotCQl2Y3B1LT5wdmNsb2NrX3NldF9ndWVzdF9zdG9wcGVkX3JlcXVlc3QgPSBmYWxzZTsKLQl9Ci0KIAkvKiBJZiB0aGUgaG9zdCB1c2VzIFRTQyBjbG9ja3NvdXJjZSwgdGhlbiBpdCBpcyBzdGFibGUgKi8KKwlwdmNsb2NrX2ZsYWdzID0gMDsKIAlpZiAodXNlX21hc3Rlcl9jbG9jaykKIAkJcHZjbG9ja19mbGFncyB8PSBQVkNMT0NLX1RTQ19TVEFCTEVfQklUOwogCiAJdmNwdS0+aHZfY2xvY2suZmxhZ3MgPSBwdmNsb2NrX2ZsYWdzOwogCi0JdHJhY2Vfa3ZtX3B2Y2xvY2tfdXBkYXRlKHYtPnZjcHVfaWQsICZ2Y3B1LT5odl9jbG9jayk7Ci0KLQlrdm1fd3JpdGVfZ3Vlc3RfY2FjaGVkKHYtPmt2bSwgJnZjcHUtPnB2X3RpbWUsCi0JCQkJJnZjcHUtPmh2X2Nsb2NrLAotCQkJCXNpemVvZih2Y3B1LT5odl9jbG9jaykpOwotCi0Jc21wX3dtYigpOwotCi0JdmNwdS0+aHZfY2xvY2sudmVyc2lvbisrOwotCWt2bV93cml0ZV9ndWVzdF9jYWNoZWQodi0+a3ZtLCAmdmNwdS0+cHZfdGltZSwKLQkJCQkmdmNwdS0+aHZfY2xvY2ssCi0JCQkJc2l6ZW9mKHZjcHUtPmh2X2Nsb2NrLnZlcnNpb24pKTsKKwlpZiAodmNwdS0+cHZfdGltZV9lbmFibGVkKQorCQlrdm1fc2V0dXBfcHZjbG9ja19wYWdlKHYpOworCWlmICh2ID09IGt2bV9nZXRfdmNwdSh2LT5rdm0sIDApKQorCQlrdm1faHZfc2V0dXBfdHNjX3BhZ2Uodi0+a3ZtLCAmdmNwdS0+aHZfY2xvY2spOwogCXJldHVybiAwOwogfQogCkBAIC0yNzQzLDE2ICsyNzg2LDE2IEBACiAJCWlmICh0c2NfZGVsdGEgPCAwKQogCQkJbWFya190c2NfdW5zdGFibGUoIktWTSBkaXNjb3ZlcmVkIGJhY2t3YXJkcyBUU0MiKTsKIAorCQlpZiAoY2hlY2tfdHNjX3Vuc3RhYmxlKCkpIHsKKwkJCXU2NCBvZmZzZXQgPSBrdm1fY29tcHV0ZV90c2Nfb2Zmc2V0KHZjcHUsCisJCQkJCQl2Y3B1LT5hcmNoLmxhc3RfZ3Vlc3RfdHNjKTsKKwkJCWt2bV92Y3B1X3dyaXRlX3RzY19vZmZzZXQodmNwdSwgb2Zmc2V0KTsKKwkJCXZjcHUtPmFyY2gudHNjX2NhdGNodXAgPSAxOworCQl9CiAJCWlmIChrdm1fbGFwaWNfaHZfdGltZXJfaW5fdXNlKHZjcHUpICYmCiAJCQkJa3ZtX3g4Nl9vcHMtPnNldF9odl90aW1lcih2Y3B1LAogCQkJCQlrdm1fZ2V0X2xhcGljX3RzY2RlYWRsaW5lX21zcih2Y3B1KSkpCiAJCQlrdm1fbGFwaWNfc3dpdGNoX3RvX3N3X3RpbWVyKHZjcHUpOwotCQlpZiAoY2hlY2tfdHNjX3Vuc3RhYmxlKCkpIHsKLQkJCXU2NCBvZmZzZXQgPSBrdm1fY29tcHV0ZV90c2Nfb2Zmc2V0KHZjcHUsCi0JCQkJCQl2Y3B1LT5hcmNoLmxhc3RfZ3Vlc3RfdHNjKTsKLQkJCWt2bV94ODZfb3BzLT53cml0ZV90c2Nfb2Zmc2V0KHZjcHUsIG9mZnNldCk7Ci0JCQl2Y3B1LT5hcmNoLnRzY19jYXRjaHVwID0gMTsKLQkJfQogCQkvKgogCQkgKiBPbiBhIGhvc3Qgd2l0aCBzeW5jaHJvbml6ZWQgVFNDLCB0aGVyZSBpcyBubyBuZWVkIHRvIHVwZGF0ZQogCQkgKiBrdm1jbG9jayBvbiB2Y3B1LT5jcHUgbWlncmF0aW9uCkBAIC00MDM5LDcgKzQwODIsNiBAQAogCWNhc2UgS1ZNX1NFVF9DTE9DSzogewogCQlzdHJ1Y3Qga3ZtX2Nsb2NrX2RhdGEgdXNlcl9uczsKIAkJdTY0IG5vd19uczsKLQkJczY0IGRlbHRhOwogCiAJCXIgPSAtRUZBVUxUOwogCQlpZiAoY29weV9mcm9tX3VzZXIoJnVzZXJfbnMsIGFyZ3AsIHNpemVvZih1c2VyX25zKSkpCkBAIC00MDUxLDEwICs0MDkzLDkgQEAKIAogCQlyID0gMDsKIAkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQkJbm93X25zID0gZ2V0X2tlcm5lbF9ucygpOwotCQlkZWx0YSA9IHVzZXJfbnMuY2xvY2sgLSBub3dfbnM7CisJCW5vd19ucyA9IF9fZ2V0X2t2bWNsb2NrX25zKGt2bSk7CisJCWt2bS0+YXJjaC5rdm1jbG9ja19vZmZzZXQgKz0gdXNlcl9ucy5jbG9jayAtIG5vd19uczsKIAkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCQlrdm0tPmFyY2gua3ZtY2xvY2tfb2Zmc2V0ID0gZGVsdGE7CiAJCWt2bV9nZW5fdXBkYXRlX21hc3RlcmNsb2NrKGt2bSk7CiAJCWJyZWFrOwogCX0KQEAgLTQwNjIsMTAgKzQxMDMsOCBAQAogCQlzdHJ1Y3Qga3ZtX2Nsb2NrX2RhdGEgdXNlcl9uczsKIAkJdTY0IG5vd19uczsKIAotCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCQlub3dfbnMgPSBnZXRfa2VybmVsX25zKCk7Ci0JCXVzZXJfbnMuY2xvY2sgPSBrdm0tPmFyY2gua3ZtY2xvY2tfb2Zmc2V0ICsgbm93X25zOwotCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCW5vd19ucyA9IGdldF9rdm1jbG9ja19ucyhrdm0pOworCQl1c2VyX25zLmNsb2NrID0gbm93X25zOwogCQl1c2VyX25zLmZsYWdzID0gMDsKIAkJbWVtc2V0KCZ1c2VyX25zLnBhZCwgMCwgc2l6ZW9mKHVzZXJfbnMucGFkKSk7CiAKQEAgLTY3MDAsNyArNjczOSw2IEBACiAKIAlrdm1fcHV0X2d1ZXN0X3hjcjAodmNwdSk7CiAKLQkvKiBJbnRlcnJ1cHQgaXMgZW5hYmxlZCBieSBoYW5kbGVfZXh0ZXJuYWxfaW50cigpICovCiAJa3ZtX3g4Nl9vcHMtPmhhbmRsZV9leHRlcm5hbF9pbnRyKHZjcHUpOwogCiAJKyt2Y3B1LT5zdGF0LmV4aXRzOwpAQCAtNzUzMCw3ICs3NTY4LDcgQEAKIAkgKiBiZWZvcmUgYW55IEtWTSB0aHJlYWRzIGNhbiBiZSBydW5uaW5nLiAgVW5mb3J0dW5hdGVseSwgd2UgY2FuJ3QKIAkgKiBicmluZyB0aGUgVFNDcyBmdWxseSB1cCB0byBkYXRlIHdpdGggcmVhbCB0aW1lLCBhcyB3ZSBhcmVuJ3QgeWV0IGZhcgogCSAqIGVub3VnaCBpbnRvIENQVSBicmluZ3VwIHRoYXQgd2Uga25vdyBob3cgbXVjaCByZWFsIHRpbWUgaGFzIGFjdHVhbGx5Ci0JICogZWxhcHNlZDsgb3VyIGhlbHBlciBmdW5jdGlvbiwgZ2V0X2tlcm5lbF9ucygpIHdpbGwgYmUgdXNpbmcgYm9vdAorCSAqIGVsYXBzZWQ7IG91ciBoZWxwZXIgZnVuY3Rpb24sIGt0aW1lX2dldF9ib290X25zKCkgd2lsbCBiZSB1c2luZyBib290CiAJICogdmFyaWFibGVzIHRoYXQgaGF2ZW4ndCBiZWVuIHVwZGF0ZWQgeWV0LgogCSAqCiAJICogU28gd2Ugc2ltcGx5IGZpbmQgdGhlIG1heGltdW0gb2JzZXJ2ZWQgVFNDIGFib3ZlLCB0aGVuIHJlY29yZCB0aGUKQEAgLTc3NjUsNiArNzgwMyw3IEBACiAJbXV0ZXhfaW5pdCgma3ZtLT5hcmNoLmFwaWNfbWFwX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZrdm0tPmFyY2gucHZjbG9ja19ndG9kX3N5bmNfbG9jayk7CiAKKwlrdm0tPmFyY2gua3ZtY2xvY2tfb2Zmc2V0ID0gLWt0aW1lX2dldF9ib290X25zKCk7CiAJcHZjbG9ja191cGRhdGVfdm1fZ3RvZF9jb3B5KGt2bSk7CiAKIAlJTklUX0RFTEFZRURfV09SSygma3ZtLT5hcmNoLmt2bWNsb2NrX3VwZGF0ZV93b3JrLCBrdm1jbG9ja191cGRhdGVfZm4pOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL3g4Ni5oIGIvYXJjaC94ODYva3ZtL3g4Ni5oCmluZGV4IGE4MmNhNDYuLmU4ZmYzZTQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS94ODYuaAorKysgYi9hcmNoL3g4Ni9rdm0veDg2LmgKQEAgLTE0OCwxMSArMTQ4LDYgQEAKIAlyZXR1cm4ga3ZtX3JlZ2lzdGVyX3dyaXRlKHZjcHUsIHJlZywgdmFsKTsKIH0KIAotc3RhdGljIGlubGluZSB1NjQgZ2V0X2tlcm5lbF9ucyh2b2lkKQotewotCXJldHVybiBrdGltZV9nZXRfYm9vdF9ucygpOwotfQotCiBzdGF0aWMgaW5saW5lIGJvb2wga3ZtX2NoZWNrX2hhc19xdWlyayhzdHJ1Y3Qga3ZtICprdm0sIHU2NCBxdWlyaykKIHsKIAlyZXR1cm4gIShrdm0tPmFyY2guZGlzYWJsZWRfcXVpcmtzICYgcXVpcmspOwpAQCAtMTY0LDYgKzE1OSw3IEBACiBpbnQga3ZtX2luamVjdF9yZWFsbW9kZV9pbnRlcnJ1cHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgaXJxLCBpbnQgaW5jX2VpcCk7CiAKIHZvaWQga3ZtX3dyaXRlX3RzYyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBtc3JfZGF0YSAqbXNyKTsKK3U2NCBnZXRfa3ZtY2xvY2tfbnMoc3RydWN0IGt2bSAqa3ZtKTsKIAogaW50IGt2bV9yZWFkX2d1ZXN0X3ZpcnQoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCiAJZ3ZhX3QgYWRkciwgdm9pZCAqdmFsLCB1bnNpZ25lZCBpbnQgYnl0ZXMsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9saWIvbWVtY3B5XzY0LlMgYi9hcmNoL3g4Ni9saWIvbWVtY3B5XzY0LlMKaW5kZXggMmVjMGIwYWJiLi40OWU2ZWJhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9saWIvbWVtY3B5XzY0LlMKKysrIGIvYXJjaC94ODYvbGliL21lbWNweV82NC5TCkBAIC0xODEsMTEgKzE4MSwxMSBAQAogCiAjaWZuZGVmIENPTkZJR19VTUwKIC8qCi0gKiBtZW1jcHlfbWNzYWZlIC0gbWVtb3J5IGNvcHkgd2l0aCBtYWNoaW5lIGNoZWNrIGV4Y2VwdGlvbiBoYW5kbGluZworICogbWVtY3B5X21jc2FmZV91bnJvbGxlZCAtIG1lbW9yeSBjb3B5IHdpdGggbWFjaGluZSBjaGVjayBleGNlcHRpb24gaGFuZGxpbmcKICAqIE5vdGUgdGhhdCB3ZSBvbmx5IGNhdGNoIG1hY2hpbmUgY2hlY2tzIHdoZW4gcmVhZGluZyB0aGUgc291cmNlIGFkZHJlc3Nlcy4KICAqIFdyaXRlcyB0byB0YXJnZXQgYXJlIHBvc3RlZCBhbmQgZG9uJ3QgZ2VuZXJhdGUgbWFjaGluZSBjaGVja3MuCiAgKi8KLUVOVFJZKG1lbWNweV9tY3NhZmUpCitFTlRSWShtZW1jcHlfbWNzYWZlX3Vucm9sbGVkKQogCWNtcGwgJDgsICVlZHgKIAkvKiBMZXNzIHRoYW4gOCBieXRlcz8gR28gdG8gYnl0ZSBjb3B5IGxvb3AgKi8KIAlqYiAuTF9ub193aG9sZV93b3JkcwpAQCAtMjczLDcgKzI3Myw3IEBACiAuTF9kb25lX21lbWNweV90cmFwOgogCXhvcnEgJXJheCwgJXJheAogCXJldAotRU5EUFJPQyhtZW1jcHlfbWNzYWZlKQorRU5EUFJPQyhtZW1jcHlfbWNzYWZlX3Vucm9sbGVkKQogCiAJLnNlY3Rpb24gLmZpeHVwLCAiYXgiCiAJLyogUmV0dXJuIC1FRkFVTFQgZm9yIGFueSBmYWlsdXJlICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9hbWR0b3BvbG9neS5jIGIvYXJjaC94ODYvbW0vYW1kdG9wb2xvZ3kuYwppbmRleCBiYTQ3NTI0Li5kMWM3ZGUwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9hbWR0b3BvbG9neS5jCisrKyBiL2FyY2gveDg2L21tL2FtZHRvcG9sb2d5LmMKQEAgLTUyLDIxICs1Miw2IEBACiAJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKLXN0YXRpYyBfX2luaXQgdm9pZCBlYXJseV9nZXRfYm9vdF9jcHVfaWQodm9pZCkKLXsKLQkvKgotCSAqIG5lZWQgdG8gZ2V0IHRoZSBBUElDIElEIG9mIHRoZSBCU1Agc28gY2FuIHVzZSB0aGF0IHRvCi0JICogY3JlYXRlIGFwaWNpZF90b19ub2RlIGluIGFtZF9zY2FuX25vZGVzKCkKLQkgKi8KLSNpZmRlZiBDT05GSUdfWDg2X01QUEFSU0UKLQkvKgotCSAqIGdldCBib290LXRpbWUgU01QIGNvbmZpZ3VyYXRpb246Ci0JICovCi0JaWYgKHNtcF9mb3VuZF9jb25maWcpCi0JCWVhcmx5X2dldF9zbXBfY29uZmlnKCk7Ci0jZW5kaWYKLX0KLQogaW50IF9faW5pdCBhbWRfbnVtYV9pbml0KHZvaWQpCiB7CiAJdTY0IHN0YXJ0ID0gUEZOX1BIWVMoMCk7CkBAIC0xODAsOCArMTY1LDExIEBACiAJY29yZXMgPSAxIDw8IGJpdHM7CiAJYXBpY2lkX2Jhc2UgPSAwOwogCi0JLyogZ2V0IHRoZSBBUElDIElEIG9mIHRoZSBCU1AgZWFybHkgZm9yIHN5c3RlbXMgd2l0aCBhcGljaWQgbGlmdGluZyAqLwotCWVhcmx5X2dldF9ib290X2NwdV9pZCgpOworCS8qCisJICogZ2V0IGJvb3QtdGltZSBTTVAgY29uZmlndXJhdGlvbjoKKwkgKi8KKwllYXJseV9nZXRfc21wX2NvbmZpZygpOworCiAJaWYgKGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA+IDApIHsKIAkJcHJfaW5mbygiQlNQIEFQSUMgSUQ6ICUwMnhcbiIsIGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCk7CiAJCWFwaWNpZF9iYXNlID0gYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vZXh0YWJsZS5jIGIvYXJjaC94ODYvbW0vZXh0YWJsZS5jCmluZGV4IDgzMmI5OGYuLjc5YWU5MzkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2V4dGFibGUuYworKysgYi9hcmNoL3g4Ni9tbS9leHRhYmxlLmMKQEAgLTEsNCArMSw0IEBACi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXh0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CiAjaW5jbHVkZSA8YXNtL2tkZWJ1Zy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vZmF1bHQuYyBiL2FyY2gveDg2L21tL2ZhdWx0LmMKaW5kZXggZGM4MDIzMC4uMWU1MjUxMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vZmF1bHQuYworKysgYi9hcmNoL3g4Ni9tbS9mYXVsdC5jCkBAIC01LDcgKzUsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4JCS8qIHRlc3RfdGhyZWFkX2ZsYWcoKSwgLi4uCSovCiAjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CQkvKiBvb3BzX2JlZ2luL2VuZCwgLi4uCQkqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgkJLyogc2VhcmNoX2V4Y2VwdGlvbl90YWJsZQkqLworI2luY2x1ZGUgPGxpbnV4L2V4dGFibGUuaD4JCS8qIHNlYXJjaF9leGNlcHRpb25fdGFibGUJKi8KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CQkvKiBtYXhfbG93X3BmbgkJCSovCiAjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgkJLyogTk9LUFJPQkVfU1lNQk9MLCAuLi4JCSovCiAjaW5jbHVkZSA8bGludXgvbW1pb3RyYWNlLmg+CQkvKiBrbW1pb19oYW5kbGVyLCAuLi4JCSovCkBAIC03NTMsNiArNzUzLDM4IEBACiAJCXJldHVybjsKIAl9CiAKKyNpZmRlZiBDT05GSUdfVk1BUF9TVEFDSworCS8qCisJICogU3RhY2sgb3ZlcmZsb3c/ICBEdXJpbmcgYm9vdCwgd2UgY2FuIGZhdWx0IG5lYXIgdGhlIGluaXRpYWwKKwkgKiBzdGFjayBpbiB0aGUgZGlyZWN0IG1hcCwgYnV0IHRoYXQncyBub3QgYW4gb3ZlcmZsb3cgLS0gY2hlY2sKKwkgKiB0aGF0IHdlJ3JlIGluIHZtYWxsb2Mgc3BhY2UgdG8gYXZvaWQgdGhpcy4KKwkgKi8KKwlpZiAoaXNfdm1hbGxvY19hZGRyKCh2b2lkICopYWRkcmVzcykgJiYKKwkgICAgKCgodW5zaWduZWQgbG9uZyl0c2stPnN0YWNrIC0gMSAtIGFkZHJlc3MgPCBQQUdFX1NJWkUpIHx8CisJICAgICBhZGRyZXNzIC0gKCh1bnNpZ25lZCBsb25nKXRzay0+c3RhY2sgKyBUSFJFQURfU0laRSkgPCBQQUdFX1NJWkUpKSB7CisJCXJlZ2lzdGVyIHZvaWQgKl9fc3AgYXNtKCJyc3AiKTsKKwkJdW5zaWduZWQgbG9uZyBzdGFjayA9IHRoaXNfY3B1X3JlYWQob3JpZ19pc3QuaXN0W0RPVUJMRUZBVUxUX1NUQUNLXSkgLSBzaXplb2Yodm9pZCAqKTsKKwkJLyoKKwkJICogV2UncmUgbGlrZWx5IHRvIGJlIHJ1bm5pbmcgd2l0aCB2ZXJ5IGxpdHRsZSBzdGFjayBzcGFjZQorCQkgKiBsZWZ0LiAgSXQncyBwbGF1c2libGUgdGhhdCB3ZSdkIGhpdCB0aGlzIGNvbmRpdGlvbiBidXQKKwkJICogZG91YmxlLWZhdWx0IGV2ZW4gYmVmb3JlIHdlIGdldCB0aGlzIGZhciwgaW4gd2hpY2ggY2FzZQorCQkgKiB3ZSdyZSBmaW5lOiB0aGUgZG91YmxlLWZhdWx0IGhhbmRsZXIgd2lsbCBkZWFsIHdpdGggaXQuCisJCSAqCisJCSAqIFdlIGRvbid0IHdhbnQgdG8gbWFrZSBpdCBhbGwgdGhlIHdheSBpbnRvIHRoZSBvb3BzIGNvZGUKKwkJICogYW5kIHRoZW4gZG91YmxlLWZhdWx0LCB0aG91Z2gsIGJlY2F1c2Ugd2UncmUgbGlrZWx5IHRvCisJCSAqIGJyZWFrIHRoZSBjb25zb2xlIGRyaXZlciBhbmQgbG9zZSBtb3N0IG9mIHRoZSBzdGFjayBkdW1wLgorCQkgKi8KKwkJYXNtIHZvbGF0aWxlICgibW92cSAlW3N0YWNrXSwgJSVyc3Bcblx0IgorCQkJICAgICAgImNhbGwgaGFuZGxlX3N0YWNrX292ZXJmbG93XG5cdCIKKwkJCSAgICAgICIxOiBqbXAgMWIiCisJCQkgICAgICA6ICIrciIgKF9fc3ApCisJCQkgICAgICA6ICJEIiAoImtlcm5lbCBzdGFjayBvdmVyZmxvdyAocGFnZSBmYXVsdCkiKSwKKwkJCQkiUyIgKHJlZ3MpLCAiZCIgKGFkZHJlc3MpLAorCQkJCVtzdGFja10gInJtIiAoc3RhY2spKTsKKwkJdW5yZWFjaGFibGUoKTsKKwl9CisjZW5kaWYKKwogCS8qCiAJICogMzItYml0OgogCSAqCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9pbml0LmMgYi9hcmNoL3g4Ni9tbS9pbml0LmMKaW5kZXggZDI4YTJkNy4uMjJhZjkxMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vaW5pdC5jCisrKyBiL2FyY2gveDg2L21tL2luaXQuYwpAQCAtNjk5LDggKzY5OSwxMCBAQAogCX0KIH0KIAotdm9pZCBmcmVlX2luaXRtZW0odm9pZCkKK3ZvaWQgX19yZWYgZnJlZV9pbml0bWVtKHZvaWQpCiB7CisJZTgyMF9yZWFsbG9jYXRlX3RhYmxlcygpOworCiAJZnJlZV9pbml0X3BhZ2VzKCJ1bnVzZWQga2VybmVsIiwKIAkJCSh1bnNpZ25lZCBsb25nKSgmX19pbml0X2JlZ2luKSwKIAkJCSh1bnNpZ25lZCBsb25nKSgmX19pbml0X2VuZCkpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0va2FzbHIuYyBiL2FyY2gveDg2L21tL2thc2xyLmMKaW5kZXggZWM4NjU0Zi4uZGRkMjY2MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0va2FzbHIuYworKysgYi9hcmNoL3g4Ni9tbS9rYXNsci5jCkBAIC00MCwxNyArNDAsMjYgQEAKICAqIFlvdSBuZWVkIHRvIGFkZCBhbiBpZi9kZWYgZW50cnkgaWYgeW91IGludHJvZHVjZSBhIG5ldyBtZW1vcnkgcmVnaW9uCiAgKiBjb21wYXRpYmxlIHdpdGggS0FTTFIuIFlvdXIgZW50cnkgbXVzdCBiZSBpbiBsb2dpY2FsIG9yZGVyIHdpdGggbWVtb3J5CiAgKiBsYXlvdXQuIEZvciBleGFtcGxlLCBFU1BGSVggaXMgYmVmb3JlIEVGSSBiZWNhdXNlIGl0cyB2aXJ0dWFsIGFkZHJlc3MgaXMKLSAqIGJlZm9yZS4gWW91IGFsc28gbmVlZCB0byBhZGQgYSBCVUlMRF9CVUdfT04gaW4ga2VybmVsX3JhbmRvbWl6ZV9tZW1vcnkgdG8KKyAqIGJlZm9yZS4gWW91IGFsc28gbmVlZCB0byBhZGQgYSBCVUlMRF9CVUdfT04oKSBpbiBrZXJuZWxfcmFuZG9taXplX21lbW9yeSgpIHRvCiAgKiBlbnN1cmUgdGhhdCB0aGlzIG9yZGVyIGlzIGNvcnJlY3QgYW5kIHdvbid0IGJlIGNoYW5nZWQuCiAgKi8KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHZhZGRyX3N0YXJ0ID0gX19QQUdFX09GRlNFVF9CQVNFOwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgdmFkZHJfZW5kID0gVk1FTU1BUF9TVEFSVDsKKworI2lmIGRlZmluZWQoQ09ORklHX1g4Nl9FU1BGSVg2NCkKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHZhZGRyX2VuZCA9IEVTUEZJWF9CQVNFX0FERFI7CisjZWxpZiBkZWZpbmVkKENPTkZJR19FRkkpCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyB2YWRkcl9lbmQgPSBFRklfVkFfU1RBUlQ7CisjZWxzZQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgdmFkZHJfZW5kID0gX19TVEFSVF9LRVJORUxfbWFwOworI2VuZGlmCiAKIC8qIERlZmF1bHQgdmFsdWVzICovCiB1bnNpZ25lZCBsb25nIHBhZ2Vfb2Zmc2V0X2Jhc2UgPSBfX1BBR0VfT0ZGU0VUX0JBU0U7CiBFWFBPUlRfU1lNQk9MKHBhZ2Vfb2Zmc2V0X2Jhc2UpOwogdW5zaWduZWQgbG9uZyB2bWFsbG9jX2Jhc2UgPSBfX1ZNQUxMT0NfQkFTRTsKIEVYUE9SVF9TWU1CT0wodm1hbGxvY19iYXNlKTsKK3Vuc2lnbmVkIGxvbmcgdm1lbW1hcF9iYXNlID0gX19WTUVNTUFQX0JBU0U7CitFWFBPUlRfU1lNQk9MKHZtZW1tYXBfYmFzZSk7CiAKIC8qCiAgKiBNZW1vcnkgcmVnaW9ucyByYW5kb21pemVkIGJ5IEtBU0xSIChleGNlcHQgbW9kdWxlcyB0aGF0IHVzZSBhIHNlcGFyYXRlIGxvZ2ljCkBAIC02Myw2ICs3Miw3IEBACiB9IGthc2xyX3JlZ2lvbnNbXSA9IHsKIAl7ICZwYWdlX29mZnNldF9iYXNlLCA2NC8qIE1heGltdW0gKi8gfSwKIAl7ICZ2bWFsbG9jX2Jhc2UsIFZNQUxMT0NfU0laRV9UQiB9LAorCXsgJnZtZW1tYXBfYmFzZSwgMSB9LAogfTsKIAogLyogR2V0IHNpemUgaW4gYnl0ZXMgdXNlZCBieSB0aGUgbWVtb3J5IHJlZ2lvbiAqLwpAQCAtNzcsNyArODcsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIGJvb2wga2FzbHJfbWVtb3J5X2VuYWJsZWQodm9pZCkKIHsKLQlyZXR1cm4ga2FzbHJfZW5hYmxlZCgpICYmICFjb25maWdfZW5hYmxlZChDT05GSUdfS0FTQU4pOworCXJldHVybiBrYXNscl9lbmFibGVkKCkgJiYgIUlTX0VOQUJMRUQoQ09ORklHX0tBU0FOKTsKIH0KIAogLyogSW5pdGlhbGl6ZSBiYXNlIGFuZCBwYWRkaW5nIGZvciBlYWNoIG1lbW9yeSByZWdpb24gcmFuZG9taXplZCB3aXRoIEtBU0xSICovCkBAIC04OSw2ICs5OSwxOCBAQAogCXN0cnVjdCBybmRfc3RhdGUgcmFuZF9zdGF0ZTsKIAl1bnNpZ25lZCBsb25nIHJlbWFpbl9lbnRyb3B5OwogCisJLyoKKwkgKiBBbGwgdGhlc2UgQlVJTERfQlVHX09OIGNoZWNrcyBlbnN1cmVzIHRoZSBtZW1vcnkgbGF5b3V0IGlzCisJICogY29uc2lzdGVudCB3aXRoIHRoZSB2YWRkcl9zdGFydC92YWRkcl9lbmQgdmFyaWFibGVzLgorCSAqLworCUJVSUxEX0JVR19PTih2YWRkcl9zdGFydCA+PSB2YWRkcl9lbmQpOworCUJVSUxEX0JVR19PTihjb25maWdfZW5hYmxlZChDT05GSUdfWDg2X0VTUEZJWDY0KSAmJgorCQkgICAgIHZhZGRyX2VuZCA+PSBFRklfVkFfU1RBUlQpOworCUJVSUxEX0JVR19PTigoY29uZmlnX2VuYWJsZWQoQ09ORklHX1g4Nl9FU1BGSVg2NCkgfHwKKwkJICAgICAgY29uZmlnX2VuYWJsZWQoQ09ORklHX0VGSSkpICYmCisJCSAgICAgdmFkZHJfZW5kID49IF9fU1RBUlRfS0VSTkVMX21hcCk7CisJQlVJTERfQlVHX09OKHZhZGRyX2VuZCA+IF9fU1RBUlRfS0VSTkVMX21hcCk7CisKIAlpZiAoIWthc2xyX21lbW9yeV9lbmFibGVkKCkpCiAJCXJldHVybjsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vbnVtYS5jIGIvYXJjaC94ODYvbW0vbnVtYS5jCmluZGV4IGZiNjgyMTAuLjNmMzViNDggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL251bWEuYworKysgYi9hcmNoL3g4Ni9tbS9udW1hLmMKQEAgLTcyMiwyMiArNzIyLDE5IEBACiAJbnVtYV9pbml0KGR1bW15X251bWFfaW5pdCk7CiB9CiAKLXN0YXRpYyBfX2luaXQgaW50IGZpbmRfbmVhcl9vbmxpbmVfbm9kZShpbnQgbm9kZSkKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X21lbW9yeV9sZXNzX25vZGUoaW50IG5pZCkKIHsKLQlpbnQgbiwgdmFsOwotCWludCBtaW5fdmFsID0gSU5UX01BWDsKLQlpbnQgYmVzdF9ub2RlID0gLTE7CisJdW5zaWduZWQgbG9uZyB6b25lc19zaXplW01BWF9OUl9aT05FU10gPSB7MH07CisJdW5zaWduZWQgbG9uZyB6aG9sZXNfc2l6ZVtNQVhfTlJfWk9ORVNdID0gezB9OwogCi0JZm9yX2VhY2hfb25saW5lX25vZGUobikgewotCQl2YWwgPSBub2RlX2Rpc3RhbmNlKG5vZGUsIG4pOworCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIG5vZGUgZGF0YS4gTWVtb3J5LWxlc3Mgbm9kZSBpcyBub3cgb25saW5lLiovCisJYWxsb2Nfbm9kZV9kYXRhKG5pZCk7CisJZnJlZV9hcmVhX2luaXRfbm9kZShuaWQsIHpvbmVzX3NpemUsIDAsIHpob2xlc19zaXplKTsKIAotCQlpZiAodmFsIDwgbWluX3ZhbCkgewotCQkJbWluX3ZhbCA9IHZhbDsKLQkJCWJlc3Rfbm9kZSA9IG47Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gYmVzdF9ub2RlOworCS8qCisJICogQWxsIHpvbmVsaXN0cyB3aWxsIGJlIGJ1aWx0IGxhdGVyIGluIHN0YXJ0X2tlcm5lbCgpIGFmdGVyIHBlciBjcHUKKwkgKiBhcmVhcyBhcmUgaW5pdGlhbGl6ZWQuCisJICovCiB9CiAKIC8qCkBAIC03NjYsOCArNzYzLDEwIEBACiAKIAkJaWYgKG5vZGUgPT0gTlVNQV9OT19OT0RFKQogCQkJY29udGludWU7CisKIAkJaWYgKCFub2RlX29ubGluZShub2RlKSkKLQkJCW5vZGUgPSBmaW5kX25lYXJfb25saW5lX25vZGUobm9kZSk7CisJCQlpbml0X21lbW9yeV9sZXNzX25vZGUobm9kZSk7CisKIAkJbnVtYV9zZXRfbm9kZShjcHUsIG5vZGUpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL3BhZ2VhdHRyLmMgYi9hcmNoL3g4Ni9tbS9wYWdlYXR0ci5jCmluZGV4IDg0OWRjMDkuLmUzMzUzYzkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL3BhZ2VhdHRyLmMKKysrIGIvYXJjaC94ODYvbW0vcGFnZWF0dHIuYwpAQCAtOTE3LDExICs5MTcsMTEgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgcG9wdWxhdGVfcG1kKHN0cnVjdCBjcGFfZGF0YSAqY3BhLAotCQkJdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsCi0JCQl1bnNpZ25lZCBudW1fcGFnZXMsIHB1ZF90ICpwdWQsIHBncHJvdF90IHBncHJvdCkKK3N0YXRpYyBsb25nIHBvcHVsYXRlX3BtZChzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwKKwkJCSB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwKKwkJCSB1bnNpZ25lZCBudW1fcGFnZXMsIHB1ZF90ICpwdWQsIHBncHJvdF90IHBncHJvdCkKIHsKLQl1bnNpZ25lZCBpbnQgY3VyX3BhZ2VzID0gMDsKKwlsb25nIGN1cl9wYWdlcyA9IDA7CiAJcG1kX3QgKnBtZDsKIAlwZ3Byb3RfdCBwbWRfcGdwcm90OwogCkBAIC05OTEsMTIgKzk5MSwxMiBAQAogCXJldHVybiBudW1fcGFnZXM7CiB9CiAKLXN0YXRpYyBpbnQgcG9wdWxhdGVfcHVkKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCBwZ2RfdCAqcGdkLAotCQkJcGdwcm90X3QgcGdwcm90KQorc3RhdGljIGxvbmcgcG9wdWxhdGVfcHVkKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCBwZ2RfdCAqcGdkLAorCQkJIHBncHJvdF90IHBncHJvdCkKIHsKIAlwdWRfdCAqcHVkOwogCXVuc2lnbmVkIGxvbmcgZW5kOwotCWludCBjdXJfcGFnZXMgPSAwOworCWxvbmcgY3VyX3BhZ2VzID0gMDsKIAlwZ3Byb3RfdCBwdWRfcGdwcm90OwogCiAJZW5kID0gc3RhcnQgKyAoY3BhLT5udW1wYWdlcyA8PCBQQUdFX1NISUZUKTsKQEAgLTEwNTIsNyArMTA1Miw3IEBACiAKIAkvKiBNYXAgdHJhaWxpbmcgbGVmdG92ZXIgKi8KIAlpZiAoc3RhcnQgPCBlbmQpIHsKLQkJaW50IHRtcDsKKwkJbG9uZyB0bXA7CiAKIAkJcHVkID0gcHVkX29mZnNldChwZ2QsIHN0YXJ0KTsKIAkJaWYgKHB1ZF9ub25lKCpwdWQpKQpAQCAtMTA3OCw3ICsxMDc4LDcgQEAKIAlwZ3Byb3RfdCBwZ3Byb3QgPSBfX3BncHJvdChfS0VSTlBHX1RBQkxFKTsKIAlwdWRfdCAqcHVkID0gTlVMTDsJLyogc2h1dCB1cCBnY2MgKi8KIAlwZ2RfdCAqcGdkX2VudHJ5OwotCWludCByZXQ7CisJbG9uZyByZXQ7CiAKIAlwZ2RfZW50cnkgPSBjcGEtPnBnZCArIHBnZF9pbmRleChhZGRyKTsKIApAQCAtMTMyNyw3ICsxMzI3LDggQEAKIAogc3RhdGljIGludCBfX2NoYW5nZV9wYWdlX2F0dHJfc2V0X2NscihzdHJ1Y3QgY3BhX2RhdGEgKmNwYSwgaW50IGNoZWNrYWxpYXMpCiB7Ci0JaW50IHJldCwgbnVtcGFnZXMgPSBjcGEtPm51bXBhZ2VzOworCXVuc2lnbmVkIGxvbmcgbnVtcGFnZXMgPSBjcGEtPm51bXBhZ2VzOworCWludCByZXQ7CiAKIAl3aGlsZSAobnVtcGFnZXMpIHsKIAkJLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL3BhdC5jIGIvYXJjaC94ODYvbW0vcGF0LmMKaW5kZXggZWNiMWI2OS4uMTcwY2M0ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vcGF0LmMKKysrIGIvYXJjaC94ODYvbW0vcGF0LmMKQEAgLTkyNyw5ICs5MjcsMTAgQEAKIH0KIAogLyoKLSAqIHByb3QgaXMgcGFzc2VkIGluIGFzIGEgcGFyYW1ldGVyIGZvciB0aGUgbmV3IG1hcHBpbmcuIElmIHRoZSB2bWEgaGFzIGEKLSAqIGxpbmVhciBwZm4gbWFwcGluZyBmb3IgdGhlIGVudGlyZSByYW5nZSByZXNlcnZlIHRoZSBlbnRpcmUgdm1hIHJhbmdlIHdpdGgKLSAqIHNpbmdsZSByZXNlcnZlX3Bmbl9yYW5nZSBjYWxsLgorICogcHJvdCBpcyBwYXNzZWQgaW4gYXMgYSBwYXJhbWV0ZXIgZm9yIHRoZSBuZXcgbWFwcGluZy4gSWYgdGhlIHZtYSBoYXMKKyAqIGEgbGluZWFyIHBmbiBtYXBwaW5nIGZvciB0aGUgZW50aXJlIHJhbmdlLCBvciBubyB2bWEgaXMgcHJvdmlkZWQsCisgKiByZXNlcnZlIHRoZSBlbnRpcmUgcGZuICsgc2l6ZSByYW5nZSB3aXRoIHNpbmdsZSByZXNlcnZlX3Bmbl9yYW5nZQorICogY2FsbC4KICAqLwogaW50IHRyYWNrX3Bmbl9yZW1hcChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcGdwcm90X3QgKnByb3QsCiAJCSAgICB1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCkBAIC05MzgsMTEgKzkzOSwxMiBAQAogCWVudW0gcGFnZV9jYWNoZV9tb2RlIHBjbTsKIAogCS8qIHJlc2VydmUgdGhlIHdob2xlIGNodW5rIHN0YXJ0aW5nIGZyb20gcGFkZHIgKi8KLQlpZiAoYWRkciA9PSB2bWEtPnZtX3N0YXJ0ICYmIHNpemUgPT0gKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkpIHsKKwlpZiAoIXZtYSB8fCAoYWRkciA9PSB2bWEtPnZtX3N0YXJ0CisJCQkJJiYgc2l6ZSA9PSAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSkpIHsKIAkJaW50IHJldDsKIAogCQlyZXQgPSByZXNlcnZlX3Bmbl9yYW5nZShwYWRkciwgc2l6ZSwgcHJvdCwgMCk7Ci0JCWlmICghcmV0KQorCQlpZiAocmV0ID09IDAgJiYgdm1hKQogCQkJdm1hLT52bV9mbGFncyB8PSBWTV9QQVQ7CiAJCXJldHVybiByZXQ7CiAJfQpAQCAtOTk3LDcgKzk5OSw3IEBACiAJcmVzb3VyY2Vfc2l6ZV90IHBhZGRyOwogCXVuc2lnbmVkIGxvbmcgcHJvdDsKIAotCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9QQVQpKQorCWlmICh2bWEgJiYgISh2bWEtPnZtX2ZsYWdzICYgVk1fUEFUKSkKIAkJcmV0dXJuOwogCiAJLyogZnJlZSB0aGUgY2h1bmsgc3RhcnRpbmcgZnJvbSBwZm4gb3IgdGhlIHdob2xlIGNodW5rICovCkBAIC0xMDExLDcgKzEwMTMsOCBAQAogCQlzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OwogCX0KIAlmcmVlX3Bmbl9yYW5nZShwYWRkciwgc2l6ZSk7Ci0Jdm1hLT52bV9mbGFncyAmPSB+Vk1fUEFUOworCWlmICh2bWEpCisJCXZtYS0+dm1fZmxhZ3MgJj0gflZNX1BBVDsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL3BhdF9yYnRyZWUuYyBiL2FyY2gveDg2L21tL3BhdF9yYnRyZWUuYwppbmRleCBkZTM5MWI3Li4xNTliNTJjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9wYXRfcmJ0cmVlLmMKKysrIGIvYXJjaC94ODYvbW0vcGF0X3JidHJlZS5jCkBAIC0yNTQsOSArMjU0LDcgQEAKIAogc3RydWN0IG1lbXR5cGUgKnJidF9tZW10eXBlX2xvb2t1cCh1NjQgYWRkcikKIHsKLQlzdHJ1Y3QgbWVtdHlwZSAqZGF0YTsKLQlkYXRhID0gbWVtdHlwZV9yYl9sb3dlc3RfbWF0Y2goJm1lbXR5cGVfcmJyb290LCBhZGRyLCBhZGRyICsgUEFHRV9TSVpFKTsKLQlyZXR1cm4gZGF0YTsKKwlyZXR1cm4gbWVtdHlwZV9yYl9sb3dlc3RfbWF0Y2goJm1lbXR5cGVfcmJyb290LCBhZGRyLCBhZGRyICsgUEFHRV9TSVpFKTsKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX0ZTKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vdGxiLmMgYi9hcmNoL3g4Ni9tbS90bGIuYwppbmRleCA0ZGJlNjU2Li5hNzY1NWY2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS90bGIuYworKysgYi9hcmNoL3g4Ni9tbS90bGIuYwpAQCAtNzcsMTAgKzc3LDI1IEBACiAJdW5zaWduZWQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCiAJaWYgKGxpa2VseShwcmV2ICE9IG5leHQpKSB7CisJCWlmIChJU19FTkFCTEVEKENPTkZJR19WTUFQX1NUQUNLKSkgeworCQkJLyoKKwkJCSAqIElmIG91ciBjdXJyZW50IHN0YWNrIGlzIGluIHZtYWxsb2Mgc3BhY2UgYW5kIGlzbid0CisJCQkgKiBtYXBwZWQgaW4gdGhlIG5ldyBwZ2QsIHdlJ2xsIGRvdWJsZS1mYXVsdC4gIEZvcmNpYmx5CisJCQkgKiBtYXAgaXQuCisJCQkgKi8KKwkJCXVuc2lnbmVkIGludCBzdGFja19wZ2RfaW5kZXggPSBwZ2RfaW5kZXgoY3VycmVudF9zdGFja19wb2ludGVyKCkpOworCisJCQlwZ2RfdCAqcGdkID0gbmV4dC0+cGdkICsgc3RhY2tfcGdkX2luZGV4OworCisJCQlpZiAodW5saWtlbHkocGdkX25vbmUoKnBnZCkpKQorCQkJCXNldF9wZ2QocGdkLCBpbml0X21tLnBnZFtzdGFja19wZ2RfaW5kZXhdKTsKKwkJfQorCiAjaWZkZWYgQ09ORklHX1NNUAogCQl0aGlzX2NwdV93cml0ZShjcHVfdGxic3RhdGUuc3RhdGUsIFRMQlNUQVRFX09LKTsKIAkJdGhpc19jcHVfd3JpdGUoY3B1X3RsYnN0YXRlLmFjdGl2ZV9tbSwgbmV4dCk7CiAjZW5kaWYKKwogCQljcHVtYXNrX3NldF9jcHUoY3B1LCBtbV9jcHVtYXNrKG5leHQpKTsKIAogCQkvKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvb3Byb2ZpbGUvYmFja3RyYWNlLmMgYi9hcmNoL3g4Ni9vcHJvZmlsZS9iYWNrdHJhY2UuYwppbmRleCBjYjMxYTQ0Li5hMjQ4OGI2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9vcHJvZmlsZS9iYWNrdHJhY2UuYworKysgYi9hcmNoL3g4Ni9vcHJvZmlsZS9iYWNrdHJhY2UuYwpAQCAtMTYsMjcgKzE2LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vc3RhY2t0cmFjZS5oPgotCi1zdGF0aWMgaW50IGJhY2t0cmFjZV9zdGFjayh2b2lkICpkYXRhLCBjaGFyICpuYW1lKQotewotCS8qIFllcywgd2Ugd2FudCBhbGwgc3RhY2tzICovCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYmFja3RyYWNlX2FkZHJlc3Modm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgcmVsaWFibGUpCi17Ci0JdW5zaWduZWQgaW50ICpkZXB0aCA9IGRhdGE7Ci0KLQlpZiAoKCpkZXB0aCktLSkKLQkJb3Byb2ZpbGVfYWRkX3RyYWNlKGFkZHIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHN0YWNrdHJhY2Vfb3BzIGJhY2t0cmFjZV9vcHMgPSB7Ci0JLnN0YWNrCQk9IGJhY2t0cmFjZV9zdGFjaywKLQkuYWRkcmVzcwk9IGJhY2t0cmFjZV9hZGRyZXNzLAotCS53YWxrX3N0YWNrCT0gcHJpbnRfY29udGV4dF9zdGFjaywKLX07CisjaW5jbHVkZSA8YXNtL3Vud2luZC5oPgogCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogc3RhdGljIHN0cnVjdCBzdGFja19mcmFtZV9pYTMyICoKQEAgLTExMywxMCArOTMsMjkgQEAKIAlzdHJ1Y3Qgc3RhY2tfZnJhbWUgKmhlYWQgPSAoc3RydWN0IHN0YWNrX2ZyYW1lICopZnJhbWVfcG9pbnRlcihyZWdzKTsKIAogCWlmICghdXNlcl9tb2RlKHJlZ3MpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgc3RhY2sgPSBrZXJuZWxfc3RhY2tfcG9pbnRlcihyZWdzKTsKLQkJaWYgKGRlcHRoKQotCQkJZHVtcF90cmFjZShOVUxMLCByZWdzLCAodW5zaWduZWQgbG9uZyAqKXN0YWNrLCAwLAotCQkJCSAgICZiYWNrdHJhY2Vfb3BzLCAmZGVwdGgpOworCQlzdHJ1Y3QgdW53aW5kX3N0YXRlIHN0YXRlOworCQl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwkJaWYgKCFkZXB0aCkKKwkJCXJldHVybjsKKworCQlvcHJvZmlsZV9hZGRfdHJhY2UocmVncy0+aXApOworCisJCWlmICghLS1kZXB0aCkKKwkJCXJldHVybjsKKworCQlmb3IgKHVud2luZF9zdGFydCgmc3RhdGUsIGN1cnJlbnQsIHJlZ3MsIE5VTEwpOworCQkgICAgICF1bndpbmRfZG9uZSgmc3RhdGUpOyB1bndpbmRfbmV4dF9mcmFtZSgmc3RhdGUpKSB7CisJCQlhZGRyID0gdW53aW5kX2dldF9yZXR1cm5fYWRkcmVzcygmc3RhdGUpOworCQkJaWYgKCFhZGRyKQorCQkJCWJyZWFrOworCisJCQlvcHJvZmlsZV9hZGRfdHJhY2UoYWRkcik7CisKKwkJCWlmICghLS1kZXB0aCkKKwkJCQlicmVhazsKKwkJfQorCiAJCXJldHVybjsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9maXh1cC5jIGIvYXJjaC94ODYvcGNpL2ZpeHVwLmMKaW5kZXggODM3ZWEzNi4uNmQ1MmI5NCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2ZpeHVwLmMKKysrIGIvYXJjaC94ODYvcGNpL2ZpeHVwLmMKQEAgLTU1MywxNSArNTUzLDIxIEBACiBERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyN0I5LCB0d2luaGVhZF9yZXNlcnZlX2tpbGxpbmdfem9uZSk7CiAKIC8qCi0gKiBCcm9hZHdlbGwgRVAgSG9tZSBBZ2VudCBCQVJzIGVycm9uZW91c2x5IHJldHVybiBub24temVybyB2YWx1ZXMgd2hlbiByZWFkLgorICogRGV2aWNlIFs4MDg2OjJmYzBdCisgKiBFcnJhdHVtIEhTRTQzCisgKiBDT05GSUdfVERQX05PTUlOQUwgQ1NSIEltcGxlbWVudGVkIGF0IEluY29ycmVjdCBPZmZzZXQKKyAqIGh0dHA6Ly93d3cuaW50ZWwuY29tL2NvbnRlbnQvd3d3L3VzL2VuL3Byb2Nlc3NvcnMveGVvbi94ZW9uLWU1LXYzLXNwZWMtdXBkYXRlLmh0bWwKICAqCi0gKiBTZWUgaHR0cDovL3d3dy5pbnRlbC5jb20vY29udGVudC93d3cvdXMvZW4vcHJvY2Vzc29ycy94ZW9uL3hlb24tZTUtdjQtc3BlYy11cGRhdGUuaHRtbAotICogZW50cnkgQkRGMi4KKyAqIERldmljZXMgWzgwODY6NmY2MCw2ZmEwLDZmYzBdCisgKiBFcnJhdHVtIEJERjIKKyAqIFBDSSBCQVJzIGluIHRoZSBIb21lIEFnZW50IFdpbGwgUmV0dXJuIE5vbi1aZXJvIFZhbHVlcyBEdXJpbmcgRW51bWVyYXRpb24KKyAqIGh0dHA6Ly93d3cuaW50ZWwuY29tL2NvbnRlbnQvd3d3L3VzL2VuL3Byb2Nlc3NvcnMveGVvbi94ZW9uLWU1LXY0LXNwZWMtdXBkYXRlLmh0bWwKICAqLwotc3RhdGljIHZvaWQgcGNpX2Jkd2VwX2JhcihzdHJ1Y3QgcGNpX2RldiAqZGV2KQorc3RhdGljIHZvaWQgcGNpX2ludmFsaWRfYmFyKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJZGV2LT5ub25fY29tcGxpYW50X2JhcnMgPSAxOwogfQotREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHg2ZjYwLCBwY2lfYmR3ZXBfYmFyKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4NmZhMCwgcGNpX2Jkd2VwX2Jhcik7Ci1ERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDZmYzAsIHBjaV9iZHdlcF9iYXIpOworREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyZmMwLCBwY2lfaW52YWxpZF9iYXIpOworREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHg2ZjYwLCBwY2lfaW52YWxpZF9iYXIpOworREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHg2ZmEwLCBwY2lfaW52YWxpZF9iYXIpOworREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHg2ZmMwLCBwY2lfaW52YWxpZF9iYXIpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL3BjYmlvcy5jIGIvYXJjaC94ODYvcGNpL3BjYmlvcy5jCmluZGV4IDk3NzBlNTUuLjFkOTdjZWEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9wY2Jpb3MuYworKysgYi9hcmNoL3g4Ni9wY2kvcGNiaW9zLmMKQEAgLTEyMCw5ICsxMjAsMTIgQEAKIHN0YXRpYyBzdHJ1Y3QgewogCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKIAl1bnNpZ25lZCBzaG9ydCBzZWdtZW50OwotfSBwY2lfaW5kaXJlY3QgPSB7IDAsIF9fS0VSTkVMX0NTIH07Cit9IHBjaV9pbmRpcmVjdCBfX3JvX2FmdGVyX2luaXQgPSB7CisJLmFkZHJlc3MgPSAwLAorCS5zZWdtZW50ID0gX19LRVJORUxfQ1MsCit9OwogCi1zdGF0aWMgaW50IHBjaV9iaW9zX3ByZXNlbnQ7CitzdGF0aWMgaW50IHBjaV9iaW9zX3ByZXNlbnQgX19yb19hZnRlcl9pbml0OwogCiBzdGF0aWMgaW50IF9faW5pdCBjaGVja19wY2liaW9zKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvdm1kLmMgYi9hcmNoL3g4Ni9wY2kvdm1kLmMKaW5kZXggYjgxNGNhNi4uNzk0OGJlMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL3ZtZC5jCisrKyBiL2FyY2gveDg2L3BjaS92bWQuYwpAQCAtNDEsNiArNDEsNyBAQAogICogQG5vZGU6CWxpc3QgaXRlbSBmb3IgcGFyZW50IHRyYXZlcnNhbC4KICAqIEByY3U6CVJDVSBjYWxsYmFjayBpdGVtIGZvciBmcmVlaW5nLgogICogQGlycToJYmFjayBwb2ludGVyIHRvIHBhcmVudC4KKyAqIEBlbmFibGVkOgl0cnVlIGlmIGRyaXZlciBlbmFibGVkIElSUQogICogQHZpcnE6CXRoZSB2aXJ0dWFsIElSUSB2YWx1ZSBwcm92aWRlZCB0byB0aGUgcmVxdWVzdGluZyBkcml2ZXIuCiAgKgogICogRXZlcnkgTVNJL01TSS1YIElSUSByZXF1ZXN0ZWQgZm9yIGEgZGV2aWNlIGluIGEgVk1EIGRvbWFpbiB3aWxsIGJlIG1hcHBlZCB0bwpAQCAtNTAsNiArNTEsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKIAlzdHJ1Y3QgcmN1X2hlYWQJCXJjdTsKIAlzdHJ1Y3Qgdm1kX2lycV9saXN0CSppcnE7CisJYm9vbAkJCWVuYWJsZWQ7CiAJdW5zaWduZWQgaW50CQl2aXJxOwogfTsKIApAQCAtMTIyLDcgKzEyNCw5IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmbGlzdF9sb2NrLCBmbGFncyk7CisJV0FSTl9PTih2bWRpcnEtPmVuYWJsZWQpOwogCWxpc3RfYWRkX3RhaWxfcmN1KCZ2bWRpcnEtPm5vZGUsICZ2bWRpcnEtPmlycS0+aXJxX2xpc3QpOworCXZtZGlycS0+ZW5hYmxlZCA9IHRydWU7CiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpc3RfbG9jaywgZmxhZ3MpOwogCiAJZGF0YS0+Y2hpcC0+aXJxX3VubWFzayhkYXRhKTsKQEAgLTEzNiw4ICsxNDAsMTAgQEAKIAlkYXRhLT5jaGlwLT5pcnFfbWFzayhkYXRhKTsKIAogCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmbGlzdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9kZWxfcmN1KCZ2bWRpcnEtPm5vZGUpOwotCUlOSVRfTElTVF9IRUFEX1JDVSgmdm1kaXJxLT5ub2RlKTsKKwlpZiAodm1kaXJxLT5lbmFibGVkKSB7CisJCWxpc3RfZGVsX3JjdSgmdm1kaXJxLT5ub2RlKTsKKwkJdm1kaXJxLT5lbmFibGVkID0gZmFsc2U7CisJfQogCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0X2xvY2ssIGZsYWdzKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL3hlbi5jIGIvYXJjaC94ODYvcGNpL3hlbi5jCmluZGV4IDNhNDgzY2IuLmJlZGZhYjkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS94ZW4uYworKysgYi9hcmNoL3g4Ni9wY2kveGVuLmMKQEAgLTQ1Niw3ICs0NTYsNyBAQAogCiBpbnQgX19pbml0IHBjaV94ZW5faHZtX2luaXQodm9pZCkKIHsKLQlpZiAoIXhlbl9oYXZlX3ZlY3Rvcl9jYWxsYmFjayB8fCAheGVuX2ZlYXR1cmUoWEVORkVBVF9odm1fcGlycXMpKQorCWlmICgheGVuX2ZlYXR1cmUoWEVORkVBVF9odm1fcGlycXMpKQogCQlyZXR1cm4gMDsKIAogI2lmZGVmIENPTkZJR19BQ1BJCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9NYWtlZmlsZSBiL2FyY2gveDg2L3BsYXRmb3JtL01ha2VmaWxlCmluZGV4IDE4NDg0MmUuLjNjM2MxOWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL01ha2VmaWxlCkBAIC04LDYgKzgsNyBAQAogb2JqLXkJKz0gaW50ZWwvCiBvYmoteQkrPSBpbnRlbC1taWQvCiBvYmoteQkrPSBpbnRlbC1xdWFyay8KK29iai15CSs9IG1lbGxhbm94Lwogb2JqLXkJKz0gb2xwYy8KIG9iai15CSs9IHNjeDIwMC8KIG9iai15CSs9IHNmaS8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL2F0b20vcHVuaXRfYXRvbV9kZWJ1Zy5jIGIvYXJjaC94ODYvcGxhdGZvcm0vYXRvbS9wdW5pdF9hdG9tX2RlYnVnLmMKaW5kZXggOGZmN2I5My4uZDQ5ZDNiZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vYXRvbS9wdW5pdF9hdG9tX2RlYnVnLmMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vYXRvbS9wdW5pdF9hdG9tX2RlYnVnLmMKQEAgLTE1NSw3ICsxNTUsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHg4Nl9jcHVfaWQgaW50ZWxfcHVuaXRfY3B1X2lkc1tdID0gewogCUlDUFUoSU5URUxfRkFNNl9BVE9NX1NJTFZFUk1PTlQxLCBwdW5pdF9kZXZpY2VfYnl0KSwKLQlJQ1BVKElOVEVMX0ZBTTZfQVRPTV9NRVJSSUZJRUxEMSwgcHVuaXRfZGV2aWNlX3RuZyksCisJSUNQVShJTlRFTF9GQU02X0FUT01fTUVSUklGSUVMRCwgIHB1bml0X2RldmljZV90bmcpLAogCUlDUFUoSU5URUxfRkFNNl9BVE9NX0FJUk1PTlQsCSAgcHVuaXRfZGV2aWNlX2NodCksCiAJe30KIH07CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpLWJncnQuYyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmktYmdydC5jCmluZGV4IDZhMmY1NjkuLjZhYWQ4NzAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmktYmdydC5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmktYmdydC5jCkBAIC04MiwyMSArODIsMTIgQEAKIAl9CiAJYmdydF9pbWFnZV9zaXplID0gYm1wX2hlYWRlci5zaXplOwogCi0JYmdydF9pbWFnZSA9IGttYWxsb2MoYmdydF9pbWFnZV9zaXplLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTsKKwliZ3J0X2ltYWdlID0gbWVtcmVtYXAoYmdydF90YWItPmltYWdlX2FkZHJlc3MsIGJtcF9oZWFkZXIuc2l6ZSwgTUVNUkVNQVBfV0IpOwogCWlmICghYmdydF9pbWFnZSkgewotCQlwcl9ub3RpY2UoIklnbm9yaW5nIEJHUlQ6IGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGltYWdlICh3YW50ZWQgJXp1IGJ5dGVzKVxuIiwKLQkJICAgICAgIGJncnRfaW1hZ2Vfc2l6ZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpbWFnZSA9IG1lbXJlbWFwKGJncnRfdGFiLT5pbWFnZV9hZGRyZXNzLCBibXBfaGVhZGVyLnNpemUsIE1FTVJFTUFQX1dCKTsKLQlpZiAoIWltYWdlKSB7CiAJCXByX25vdGljZSgiSWdub3JpbmcgQkdSVDogZmFpbGVkIHRvIG1hcCBpbWFnZSBtZW1vcnlcbiIpOwotCQlrZnJlZShiZ3J0X2ltYWdlKTsKIAkJYmdydF9pbWFnZSA9IE5VTEw7CiAJCXJldHVybjsKIAl9CiAKLQltZW1jcHkoYmdydF9pbWFnZSwgaW1hZ2UsIGJncnRfaW1hZ2Vfc2l6ZSk7Ci0JbWVtdW5tYXAoaW1hZ2UpOworCWVmaV9tZW1fcmVzZXJ2ZShiZ3J0X3RhYi0+aW1hZ2VfYWRkcmVzcywgYmdydF9pbWFnZV9zaXplKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmkuYyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmkuYwppbmRleCAxZmJiNDA4Li5iZjk5YWE3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpLmMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaS5jCkBAIC0xNjYsMTMgKzE2NiwxNSBAQAogCQl9CiAJCWU4MjBfYWRkX3JlZ2lvbihzdGFydCwgc2l6ZSwgZTgyMF90eXBlKTsKIAl9Ci0Jc2FuaXRpemVfZTgyMF9tYXAoZTgyMC5tYXAsIEFSUkFZX1NJWkUoZTgyMC5tYXApLCAmZTgyMC5ucl9tYXApOworCXNhbml0aXplX2U4MjBfbWFwKGU4MjAtPm1hcCwgQVJSQVlfU0laRShlODIwLT5tYXApLCAmZTgyMC0+bnJfbWFwKTsKIH0KIAogaW50IF9faW5pdCBlZmlfbWVtYmxvY2tfeDg2X3Jlc2VydmVfcmFuZ2Uodm9pZCkKIHsKIAlzdHJ1Y3QgZWZpX2luZm8gKmUgPSAmYm9vdF9wYXJhbXMuZWZpX2luZm87CisJc3RydWN0IGVmaV9tZW1vcnlfbWFwX2RhdGEgZGF0YTsKIAlwaHlzX2FkZHJfdCBwbWFwOworCWludCBydjsKIAogCWlmIChlZmlfZW5hYmxlZChFRklfUEFSQVZJUlQpKQogCQlyZXR1cm4gMDsKQEAgLTE4NywxMSArMTg5LDE3IEBACiAjZWxzZQogCXBtYXAgPSAoZS0+ZWZpX21lbW1hcCB8CSgoX191NjQpZS0+ZWZpX21lbW1hcF9oaSA8PCAzMikpOwogI2VuZGlmCi0JZWZpLm1lbW1hcC5waHlzX21hcAk9IHBtYXA7Ci0JZWZpLm1lbW1hcC5ucl9tYXAJPSBlLT5lZmlfbWVtbWFwX3NpemUgLwotCQkJCSAgZS0+ZWZpX21lbWRlc2Nfc2l6ZTsKLQllZmkubWVtbWFwLmRlc2Nfc2l6ZQk9IGUtPmVmaV9tZW1kZXNjX3NpemU7Ci0JZWZpLm1lbW1hcC5kZXNjX3ZlcnNpb24JPSBlLT5lZmlfbWVtZGVzY192ZXJzaW9uOworCWRhdGEucGh5c19tYXAJCT0gcG1hcDsKKwlkYXRhLnNpemUgCQk9IGUtPmVmaV9tZW1tYXBfc2l6ZTsKKwlkYXRhLmRlc2Nfc2l6ZQkJPSBlLT5lZmlfbWVtZGVzY19zaXplOworCWRhdGEuZGVzY192ZXJzaW9uCT0gZS0+ZWZpX21lbWRlc2NfdmVyc2lvbjsKKworCXJ2ID0gZWZpX21lbW1hcF9pbml0X2Vhcmx5KCZkYXRhKTsKKwlpZiAocnYpCisJCXJldHVybiBydjsKKworCWlmIChhZGRfZWZpX21lbW1hcCkKKwkJZG9fYWRkX2VmaV9tZW1tYXAoKTsKIAogCVdBUk4oZWZpLm1lbW1hcC5kZXNjX3ZlcnNpb24gIT0gMSwKIAkgICAgICJVbmV4cGVjdGVkIEVGSV9NRU1PUllfREVTQ1JJUFRPUiB2ZXJzaW9uICVsZCIsCkBAIC0yMTgsMTkgKzIyNiw2IEBACiAJfQogfQogCi12b2lkIF9faW5pdCBlZmlfdW5tYXBfbWVtbWFwKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCi0JY2xlYXJfYml0KEVGSV9NRU1NQVAsICZlZmkuZmxhZ3MpOwotCi0Jc2l6ZSA9IGVmaS5tZW1tYXAubnJfbWFwICogZWZpLm1lbW1hcC5kZXNjX3NpemU7Ci0JaWYgKGVmaS5tZW1tYXAubWFwKSB7Ci0JCWVhcmx5X21lbXVubWFwKGVmaS5tZW1tYXAubWFwLCBzaXplKTsKLQkJZWZpLm1lbW1hcC5tYXAgPSBOVUxMOwotCX0KLX0KLQogc3RhdGljIGludCBfX2luaXQgZWZpX3N5c3RhYl9pbml0KHZvaWQgKnBoeXMpCiB7CiAJaWYgKGVmaV9lbmFibGVkKEVGSV82NEJJVCkpIHsKQEAgLTQxNCwzMyArNDA5LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgZWZpX21lbW1hcF9pbml0KHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBhZGRyLCBzaXplOwotCi0JaWYgKGVmaV9lbmFibGVkKEVGSV9QQVJBVklSVCkpCi0JCXJldHVybiAwOwotCi0JLyogTWFwIHRoZSBFRkkgbWVtb3J5IG1hcCAqLwotCXNpemUgPSBlZmkubWVtbWFwLm5yX21hcCAqIGVmaS5tZW1tYXAuZGVzY19zaXplOwotCWFkZHIgPSAodW5zaWduZWQgbG9uZyllZmkubWVtbWFwLnBoeXNfbWFwOwotCi0JZWZpLm1lbW1hcC5tYXAgPSBlYXJseV9tZW1yZW1hcChhZGRyLCBzaXplKTsKLQlpZiAoZWZpLm1lbW1hcC5tYXAgPT0gTlVMTCkgewotCQlwcl9lcnIoIkNvdWxkIG5vdCBtYXAgdGhlIG1lbW9yeSBtYXAhXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JZWZpLm1lbW1hcC5tYXBfZW5kID0gZWZpLm1lbW1hcC5tYXAgKyBzaXplOwotCi0JaWYgKGFkZF9lZmlfbWVtbWFwKQotCQlkb19hZGRfZWZpX21lbW1hcCgpOwotCi0Jc2V0X2JpdChFRklfTUVNTUFQLCAmZWZpLmZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCiB2b2lkIF9faW5pdCBlZmlfaW5pdCh2b2lkKQogewogCWVmaV9jaGFyMTZfdCAqYzE2OwpAQCAtNDk4LDE2ICs0NjYsMTQgQEAKIAlpZiAoIWVmaV9ydW50aW1lX3N1cHBvcnRlZCgpKQogCQlwcl9pbmZvKCJObyBFRkkgcnVudGltZSBkdWUgdG8gMzIvNjQtYml0IG1pc21hdGNoIHdpdGgga2VybmVsXG4iKTsKIAllbHNlIHsKLQkJaWYgKGVmaV9ydW50aW1lX2Rpc2FibGVkKCkgfHwgZWZpX3J1bnRpbWVfaW5pdCgpKQorCQlpZiAoZWZpX3J1bnRpbWVfZGlzYWJsZWQoKSB8fCBlZmlfcnVudGltZV9pbml0KCkpIHsKKwkJCWVmaV9tZW1tYXBfdW5tYXAoKTsKIAkJCXJldHVybjsKKwkJfQogCX0KLQlpZiAoZWZpX21lbW1hcF9pbml0KCkpCi0JCXJldHVybjsKIAogCWlmIChlZmlfZW5hYmxlZChFRklfREJHKSkKIAkJZWZpX3ByaW50X21lbW1hcCgpOwotCi0JZWZpX2VzcnRfaW5pdCgpOwogfQogCiB2b2lkIF9faW5pdCBlZmlfbGF0ZV9pbml0KHZvaWQpCkBAIC02MjQsNDIgKzU5MCw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgc2F2ZV9ydW50aW1lX21hcCh2b2lkKQotewotI2lmZGVmIENPTkZJR19LRVhFQ19DT1JFCi0JdW5zaWduZWQgbG9uZyBkZXNjX3NpemU7Ci0JZWZpX21lbW9yeV9kZXNjX3QgKm1kOwotCXZvaWQgKnRtcCwgKnEgPSBOVUxMOwotCWludCBjb3VudCA9IDA7Ci0KLQlpZiAoZWZpX2VuYWJsZWQoRUZJX09MRF9NRU1NQVApKQotCQlyZXR1cm47Ci0KLQlkZXNjX3NpemUgPSBlZmkubWVtbWFwLmRlc2Nfc2l6ZTsKLQotCWZvcl9lYWNoX2VmaV9tZW1vcnlfZGVzYyhtZCkgewotCQlpZiAoIShtZC0+YXR0cmlidXRlICYgRUZJX01FTU9SWV9SVU5USU1FKSB8fAotCQkgICAgKG1kLT50eXBlID09IEVGSV9CT09UX1NFUlZJQ0VTX0NPREUpIHx8Ci0JCSAgICAobWQtPnR5cGUgPT0gRUZJX0JPT1RfU0VSVklDRVNfREFUQSkpCi0JCQljb250aW51ZTsKLQkJdG1wID0ga3JlYWxsb2MocSwgKGNvdW50ICsgMSkgKiBkZXNjX3NpemUsIEdGUF9LRVJORUwpOwotCQlpZiAoIXRtcCkKLQkJCWdvdG8gb3V0OwotCQlxID0gdG1wOwotCi0JCW1lbWNweShxICsgY291bnQgKiBkZXNjX3NpemUsIG1kLCBkZXNjX3NpemUpOwotCQljb3VudCsrOwotCX0KLQotCWVmaV9ydW50aW1lX21hcF9zZXR1cChxLCBjb3VudCwgZGVzY19zaXplKTsKLQlyZXR1cm47Ci0KLW91dDoKLQlrZnJlZShxKTsKLQlwcl9lcnIoIkVycm9yIHNhdmluZyBydW50aW1lIG1hcCwgZWZpIHJ1bnRpbWUgb24ga2V4ZWMgbm9uLWZ1bmN0aW9uYWwhIVxuIik7Ci0jZW5kaWYKLX0KLQogc3RhdGljIHZvaWQgKnJlYWxsb2NfcGFnZXModm9pZCAqb2xkX21lbW1hcCwgaW50IG9sZF9zaGlmdCkKIHsKIAl2b2lkICpyZXQ7CkBAIC03NDUsNiArNjc1LDQ2IEBACiAJcmV0dXJuIGVudHJ5OwogfQogCitzdGF0aWMgYm9vbCBzaG91bGRfbWFwX3JlZ2lvbihlZmlfbWVtb3J5X2Rlc2NfdCAqbWQpCit7CisJLyoKKwkgKiBSdW50aW1lIHJlZ2lvbnMgYWx3YXlzIHJlcXVpcmUgcnVudGltZSBtYXBwaW5ncyAob2J2aW91c2x5KS4KKwkgKi8KKwlpZiAobWQtPmF0dHJpYnV0ZSAmIEVGSV9NRU1PUllfUlVOVElNRSkKKwkJcmV0dXJuIHRydWU7CisKKwkvKgorCSAqIDMyLWJpdCBFRkkgZG9lc24ndCBzdWZmZXIgZnJvbSB0aGUgYnVnIHRoYXQgcmVxdWlyZXMgdXMgdG8KKwkgKiByZXNlcnZlIGJvb3Qgc2VydmljZXMgcmVnaW9ucywgYW5kIG1peGVkIG1vZGUgc3VwcG9ydAorCSAqIGRvZXNuJ3QgZXhpc3QgZm9yIDMyLWJpdCBrZXJuZWxzLgorCSAqLworCWlmIChJU19FTkFCTEVEKENPTkZJR19YODZfMzIpKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKgorCSAqIE1hcCBhbGwgb2YgUkFNIHNvIHRoYXQgd2UgY2FuIGFjY2VzcyBhcmd1bWVudHMgaW4gdGhlIDE6MQorCSAqIG1hcHBpbmcgd2hlbiBtYWtpbmcgRUZJIHJ1bnRpbWUgY2FsbHMuCisJICovCisJaWYgKElTX0VOQUJMRUQoQ09ORklHX0VGSV9NSVhFRCkgJiYgIWVmaV9pc19uYXRpdmUoKSkgeworCQlpZiAobWQtPnR5cGUgPT0gRUZJX0NPTlZFTlRJT05BTF9NRU1PUlkgfHwKKwkJICAgIG1kLT50eXBlID09IEVGSV9MT0FERVJfREFUQSB8fAorCQkgICAgbWQtPnR5cGUgPT0gRUZJX0xPQURFUl9DT0RFKQorCQkJcmV0dXJuIHRydWU7CisJfQorCisJLyoKKwkgKiBNYXAgYm9vdCBzZXJ2aWNlcyByZWdpb25zIGFzIGEgd29ya2Fyb3VuZCBmb3IgYnVnZ3kKKwkgKiBmaXJtd2FyZSB0aGF0IGFjY2Vzc2VzIHRoZW0gZXZlbiB3aGVuIHRoZXkgc2hvdWxkbid0LgorCSAqCisJICogU2VlIGVmaV97cmVzZXJ2ZSxmcmVlfV9ib290X3NlcnZpY2VzKCkuCisJICovCisJaWYgKG1kLT50eXBlID09IEVGSV9CT09UX1NFUlZJQ0VTX0NPREUgfHwKKwkgICAgbWQtPnR5cGUgPT0gRUZJX0JPT1RfU0VSVklDRVNfREFUQSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKIC8qCiAgKiBNYXAgdGhlIGVmaSBtZW1vcnkgcmFuZ2VzIG9mIHRoZSBydW50aW1lIHNlcnZpY2VzIGFuZCB1cGRhdGUgbmV3X21tYXAgd2l0aAogICogdmlydHVhbCBhZGRyZXNzZXMuCkBAIC03NjEsMTMgKzczMSw5IEBACiAJcCA9IE5VTEw7CiAJd2hpbGUgKChwID0gZWZpX21hcF9uZXh0X2VudHJ5KHApKSkgewogCQltZCA9IHA7Ci0JCWlmICghKG1kLT5hdHRyaWJ1dGUgJiBFRklfTUVNT1JZX1JVTlRJTUUpKSB7Ci0jaWZkZWYgQ09ORklHX1g4Nl82NAotCQkJaWYgKG1kLT50eXBlICE9IEVGSV9CT09UX1NFUlZJQ0VTX0NPREUgJiYKLQkJCSAgICBtZC0+dHlwZSAhPSBFRklfQk9PVF9TRVJWSUNFU19EQVRBKQotI2VuZGlmCi0JCQkJY29udGludWU7Ci0JCX0KKworCQlpZiAoIXNob3VsZF9tYXBfcmVnaW9uKG1kKSkKKwkJCWNvbnRpbnVlOwogCiAJCWVmaV9tYXBfcmVnaW9uKG1kKTsKIAkJZ2V0X3N5c3RhYl92aXJ0X2FkZHIobWQpOwpAQCAtODAzLDcgKzc2OSw3IEBACiAJICogbm9uLW5hdGl2ZSBFRkkKIAkgKi8KIAlpZiAoIWVmaV9pc19uYXRpdmUoKSkgewotCQllZmlfdW5tYXBfbWVtbWFwKCk7CisJCWVmaV9tZW1tYXBfdW5tYXAoKTsKIAkJY2xlYXJfYml0KEVGSV9SVU5USU1FX1NFUlZJQ0VTLCAmZWZpLmZsYWdzKTsKIAkJcmV0dXJuOwogCX0KQEAgLTgyMyw3ICs3ODksMTggQEAKIAkJZ2V0X3N5c3RhYl92aXJ0X2FkZHIobWQpOwogCX0KIAotCXNhdmVfcnVudGltZV9tYXAoKTsKKwkvKgorCSAqIFVucmVnaXN0ZXIgdGhlIGVhcmx5IEVGSSBtZW1tYXAgZnJvbSBlZmlfaW5pdCgpIGFuZCBpbnN0YWxsCisJICogdGhlIG5ldyBFRkkgbWVtb3J5IG1hcC4KKwkgKi8KKwllZmlfbWVtbWFwX3VubWFwKCk7CisKKwlpZiAoZWZpX21lbW1hcF9pbml0X2xhdGUoZWZpLm1lbW1hcC5waHlzX21hcCwKKwkJCQkgZWZpLm1lbW1hcC5kZXNjX3NpemUgKiBlZmkubWVtbWFwLm5yX21hcCkpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gcmVtYXAgbGF0ZSBFRkkgbWVtb3J5IG1hcFxuIik7CisJCWNsZWFyX2JpdChFRklfUlVOVElNRV9TRVJWSUNFUywgJmVmaS5mbGFncyk7CisJCXJldHVybjsKKwl9CiAKIAlCVUdfT04oIWVmaS5zeXN0YWIpOwogCkBAIC04ODQsNiArODYxLDcgQEAKIAlpbnQgY291bnQgPSAwLCBwZ19zaGlmdCA9IDA7CiAJdm9pZCAqbmV3X21lbW1hcCA9IE5VTEw7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKKwlwaHlzX2FkZHJfdCBwYTsKIAogCWVmaS5zeXN0YWIgPSBOVUxMOwogCkBAIC05MDEsMTEgKzg3OSwyNCBAQAogCQlyZXR1cm47CiAJfQogCi0Jc2F2ZV9ydW50aW1lX21hcCgpOworCXBhID0gX19wYShuZXdfbWVtbWFwKTsKKworCS8qCisJICogVW5yZWdpc3RlciB0aGUgZWFybHkgRUZJIG1lbW1hcCBmcm9tIGVmaV9pbml0KCkgYW5kIGluc3RhbGwKKwkgKiB0aGUgbmV3IEVGSSBtZW1vcnkgbWFwIHRoYXQgd2UgYXJlIGFib3V0IHRvIHBhc3MgdG8gdGhlCisJICogZmlybXdhcmUgdmlhIFNldFZpcnR1YWxBZGRyZXNzTWFwKCkuCisJICovCisJZWZpX21lbW1hcF91bm1hcCgpOworCisJaWYgKGVmaV9tZW1tYXBfaW5pdF9sYXRlKHBhLCBlZmkubWVtbWFwLmRlc2Nfc2l6ZSAqIGNvdW50KSkgeworCQlwcl9lcnIoIkZhaWxlZCB0byByZW1hcCBsYXRlIEVGSSBtZW1vcnkgbWFwXG4iKTsKKwkJY2xlYXJfYml0KEVGSV9SVU5USU1FX1NFUlZJQ0VTLCAmZWZpLmZsYWdzKTsKKwkJcmV0dXJuOworCX0KIAogCUJVR19PTighZWZpLnN5c3RhYik7CiAKLQlpZiAoZWZpX3NldHVwX3BhZ2VfdGFibGVzKF9fcGEobmV3X21lbW1hcCksIDEgPDwgcGdfc2hpZnQpKSB7CisJaWYgKGVmaV9zZXR1cF9wYWdlX3RhYmxlcyhwYSwgMSA8PCBwZ19zaGlmdCkpIHsKIAkJY2xlYXJfYml0KEVGSV9SVU5USU1FX1NFUlZJQ0VTLCAmZWZpLmZsYWdzKTsKIAkJcmV0dXJuOwogCX0KQEAgLTkxNywxNCArOTA4LDE0IEBACiAJCQkJZWZpLm1lbW1hcC5kZXNjX3NpemUgKiBjb3VudCwKIAkJCQllZmkubWVtbWFwLmRlc2Nfc2l6ZSwKIAkJCQllZmkubWVtbWFwLmRlc2NfdmVyc2lvbiwKLQkJCQkoZWZpX21lbW9yeV9kZXNjX3QgKilfX3BhKG5ld19tZW1tYXApKTsKKwkJCQkoZWZpX21lbW9yeV9kZXNjX3QgKilwYSk7CiAJfSBlbHNlIHsKIAkJc3RhdHVzID0gZWZpX3RodW5rX3NldF92aXJ0dWFsX2FkZHJlc3NfbWFwKAogCQkJCWVmaV9waHlzLnNldF92aXJ0dWFsX2FkZHJlc3NfbWFwLAogCQkJCWVmaS5tZW1tYXAuZGVzY19zaXplICogY291bnQsCiAJCQkJZWZpLm1lbW1hcC5kZXNjX3NpemUsCiAJCQkJZWZpLm1lbW1hcC5kZXNjX3ZlcnNpb24sCi0JCQkJKGVmaV9tZW1vcnlfZGVzY190ICopX19wYShuZXdfbWVtbWFwKSk7CisJCQkJKGVmaV9tZW1vcnlfZGVzY190ICopcGEpOwogCX0KIAogCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKQEAgLTk1NiwxNSArOTQ3LDYgQEAKIAllZmlfcnVudGltZV91cGRhdGVfbWFwcGluZ3MoKTsKIAllZmlfZHVtcF9wYWdldGFibGUoKTsKIAotCS8qCi0JICogV2UgbWFwcGVkIHRoZSBkZXNjcmlwdG9yIGFycmF5IGludG8gdGhlIEVGSSBwYWdldGFibGUgYWJvdmUKLQkgKiBidXQgd2UncmUgbm90IHVubWFwcGluZyBpdCBoZXJlIGJlY2F1c2UgaWYgd2UncmUgcnVubmluZyBpbgotCSAqIEVGSSBtaXhlZCBtb2RlIHdlIG5lZWQgYWxsIG9mIG1lbW9yeSB0byBiZSBhY2Nlc3NpYmxlIHdoZW4KLQkgKiB3ZSBwYXNzIHBhcmFtZXRlcnMgdG8gdGhlIEVGSSBydW50aW1lIHNlcnZpY2VzIGluIHRoZQotCSAqIHRodW5raW5nIGNvZGUuCi0JICovCi0JZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyluZXdfbWVtbWFwLCBwZ19zaGlmdCk7Ci0KIAkvKiBjbGVhbiBEVU1NWSBvYmplY3QgKi8KIAllZmlfZGVsZXRlX2R1bW15X3ZhcmlhYmxlKCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpXzY0LmMgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpXzY0LmMKaW5kZXggNjc3ZTI5ZS4uNThiMGY4MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaV82NC5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmlfNjQuYwpAQCAtODUsNyArODUsNyBAQAogCWVhcmx5X2NvZGVfbWFwcGluZ19zZXRfZXhlYygxKTsKIAogCW5fcGdkcyA9IERJVl9ST1VORF9VUCgobWF4X3BmbiA8PCBQQUdFX1NISUZUKSwgUEdESVJfU0laRSk7Ci0Jc2F2ZV9wZ2QgPSBrbWFsbG9jKG5fcGdkcyAqIHNpemVvZihwZ2RfdCksIEdGUF9LRVJORUwpOworCXNhdmVfcGdkID0ga21hbGxvY19hcnJheShuX3BnZHMsIHNpemVvZigqc2F2ZV9wZ2QpLCBHRlBfS0VSTkVMKTsKIAogCWZvciAocGdkID0gMDsgcGdkIDwgbl9wZ2RzOyBwZ2QrKykgewogCQlzYXZlX3BnZFtwZ2RdID0gKnBnZF9vZmZzZXRfayhwZ2QgKiBQR0RJUl9TSVpFKTsKQEAgLTIxNCw3ICsyMTQsNiBAQAogaW50IF9faW5pdCBlZmlfc2V0dXBfcGFnZV90YWJsZXModW5zaWduZWQgbG9uZyBwYV9tZW1tYXAsIHVuc2lnbmVkIG51bV9wYWdlcykKIHsKIAl1bnNpZ25lZCBsb25nIHBmbiwgdGV4dDsKLQllZmlfbWVtb3J5X2Rlc2NfdCAqbWQ7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJdW5zaWduZWQgbnBhZ2VzOwogCXBnZF90ICpwZ2Q7CkBAIC0yNDUsMjggKzI0NCw5IEBACiAJICogdGV4dCBhbmQgYWxsb2NhdGUgYSBuZXcgc3RhY2sgYmVjYXVzZSB3ZSBjYW4ndCByZWx5IG9uIHRoZQogCSAqIHN0YWNrIHBvaW50ZXIgYmVpbmcgPCA0R0IuCiAJICovCi0JaWYgKCFJU19FTkFCTEVEKENPTkZJR19FRklfTUlYRUQpKQorCWlmICghSVNfRU5BQkxFRChDT05GSUdfRUZJX01JWEVEKSB8fCBlZmlfaXNfbmF0aXZlKCkpCiAJCXJldHVybiAwOwogCi0JLyoKLQkgKiBNYXAgYWxsIG9mIFJBTSBzbyB0aGF0IHdlIGNhbiBhY2Nlc3MgYXJndW1lbnRzIGluIHRoZSAxOjEKLQkgKiBtYXBwaW5nIHdoZW4gbWFraW5nIEVGSSBydW50aW1lIGNhbGxzLgotCSAqLwotCWZvcl9lYWNoX2VmaV9tZW1vcnlfZGVzYyhtZCkgewotCQlpZiAobWQtPnR5cGUgIT0gRUZJX0NPTlZFTlRJT05BTF9NRU1PUlkgJiYKLQkJICAgIG1kLT50eXBlICE9IEVGSV9MT0FERVJfREFUQSAmJgotCQkgICAgbWQtPnR5cGUgIT0gRUZJX0xPQURFUl9DT0RFKQotCQkJY29udGludWU7Ci0KLQkJcGZuID0gbWQtPnBoeXNfYWRkciA+PiBQQUdFX1NISUZUOwotCQlucGFnZXMgPSBtZC0+bnVtX3BhZ2VzOwotCi0JCWlmIChrZXJuZWxfbWFwX3BhZ2VzX2luX3BnZChwZ2QsIHBmbiwgbWQtPnBoeXNfYWRkciwgbnBhZ2VzLCBfUEFHRV9SVykpIHsKLQkJCXByX2VycigiRmFpbGVkIHRvIG1hcCAxOjEgbWVtb3J5XG4iKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JfQotCiAJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTHxfX0dGUF9ETUEzMik7CiAJaWYgKCFwYWdlKQogCQlwYW5pYygiVW5hYmxlIHRvIGFsbG9jYXRlIEVGSSBydW50aW1lIHN0YWNrIDwgNEdCXG4iKTsKQEAgLTM1OSw2ICszMzksNyBAQAogICovCiB2b2lkIF9faW5pdCBlZmlfbWFwX3JlZ2lvbl9maXhlZChlZmlfbWVtb3J5X2Rlc2NfdCAqbWQpCiB7CisJX19tYXBfcmVnaW9uKG1kLCBtZC0+cGh5c19hZGRyKTsKIAlfX21hcF9yZWdpb24obWQsIG1kLT52aXJ0X2FkZHIpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvcXVpcmtzLmMgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvcXVpcmtzLmMKaW5kZXggODlkMTE0Ni4uMTBhY2E2MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vZWZpL3F1aXJrcy5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9xdWlya3MuYwpAQCAtMTY0LDYgKzE2NCw3NSBAQAogRVhQT1JUX1NZTUJPTF9HUEwoZWZpX3F1ZXJ5X3ZhcmlhYmxlX3N0b3JlKTsKIAogLyoKKyAqIFRoZSBVRUZJIHNwZWNpZmljYXRpb24gbWFrZXMgaXQgY2xlYXIgdGhhdCB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpcworICogZnJlZSB0byBkbyB3aGF0ZXZlciBpdCB3YW50cyB3aXRoIGJvb3Qgc2VydmljZXMgY29kZSBhZnRlcgorICogRXhpdEJvb3RTZXJ2aWNlcygpIGhhcyBiZWVuIGNhbGxlZC4gSWdub3JpbmcgdGhpcyByZWNvbW1lbmRhdGlvbiBhCisgKiBzaWduaWZpY2FudCBidW5jaCBvZiBFRkkgaW1wbGVtZW50YXRpb25zIGNvbnRpbnVlIGNhbGxpbmcgaW50byBib290CisgKiBzZXJ2aWNlcyBjb2RlIChTZXRWaXJ0dWFsQWRkcmVzc01hcCkuIEluIG9yZGVyIHRvIHdvcmsgYXJvdW5kIHN1Y2gKKyAqIGJ1Z2d5IGltcGxlbWVudGF0aW9ucyB3ZSByZXNlcnZlIGJvb3Qgc2VydmljZXMgcmVnaW9uIGR1cmluZyBFRkkKKyAqIGluaXQgYW5kIG1ha2Ugc3VyZSBpdCBzdGF5cyBleGVjdXRhYmxlLiBUaGVuLCBhZnRlcgorICogU2V0VmlydHVhbEFkZHJlc3NNYXAoKSwgaXQgaXMgZGlzY2FyZGVkLgorICoKKyAqIEhvd2V2ZXIsIHNvbWUgYm9vdCBzZXJ2aWNlcyByZWdpb25zIGNvbnRhaW4gZGF0YSB0aGF0IGlzIHJlcXVpcmVkCisgKiBieSBkcml2ZXJzLCBzbyB3ZSBuZWVkIHRvIHRyYWNrIHdoaWNoIG1lbW9yeSByYW5nZXMgY2FuIG5ldmVyIGJlCisgKiBmcmVlZC4gVGhpcyBpcyBkb25lIGJ5IHRhZ2dpbmcgdGhvc2UgcmVnaW9ucyB3aXRoIHRoZQorICogRUZJX01FTU9SWV9SVU5USU1FIGF0dHJpYnV0ZS4KKyAqCisgKiBBbnkgZHJpdmVyIHRoYXQgd2FudHMgdG8gbWFyayBhIHJlZ2lvbiBhcyByZXNlcnZlZCBtdXN0IHVzZQorICogZWZpX21lbV9yZXNlcnZlKCkgd2hpY2ggd2lsbCBpbnNlcnQgYSBuZXcgRUZJIG1lbW9yeSBkZXNjcmlwdG9yCisgKiBpbnRvIGVmaS5tZW1tYXAgKHNwbGl0dGluZyBleGlzdGluZyByZWdpb25zIGlmIG5lY2Vzc2FyeSkgYW5kIHRhZworICogaXQgd2l0aCBFRklfTUVNT1JZX1JVTlRJTUUuCisgKi8KK3ZvaWQgX19pbml0IGVmaV9hcmNoX21lbV9yZXNlcnZlKHBoeXNfYWRkcl90IGFkZHIsIHU2NCBzaXplKQoreworCXBoeXNfYWRkcl90IG5ld19waHlzLCBuZXdfc2l6ZTsKKwlzdHJ1Y3QgZWZpX21lbV9yYW5nZSBtcjsKKwllZmlfbWVtb3J5X2Rlc2NfdCBtZDsKKwlpbnQgbnVtX2VudHJpZXM7CisJdm9pZCAqbmV3OworCisJaWYgKGVmaV9tZW1fZGVzY19sb29rdXAoYWRkciwgJm1kKSkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBsb29rdXAgRUZJIG1lbW9yeSBkZXNjcmlwdG9yIGZvciAlcGFcbiIsICZhZGRyKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChhZGRyICsgc2l6ZSA+IG1kLnBoeXNfYWRkciArIChtZC5udW1fcGFnZXMgPDwgRUZJX1BBR0VfU0hJRlQpKSB7CisJCXByX2VycigiUmVnaW9uIHNwYW5zIEVGSSBtZW1vcnkgZGVzY3JpcHRvcnMsICVwYVxuIiwgJmFkZHIpOworCQlyZXR1cm47CisJfQorCisJc2l6ZSArPSBhZGRyICUgRUZJX1BBR0VfU0laRTsKKwlzaXplID0gcm91bmRfdXAoc2l6ZSwgRUZJX1BBR0VfU0laRSk7CisJYWRkciA9IHJvdW5kX2Rvd24oYWRkciwgRUZJX1BBR0VfU0laRSk7CisKKwltci5yYW5nZS5zdGFydCA9IGFkZHI7CisJbXIucmFuZ2UuZW5kID0gYWRkciArIHNpemUgLSAxOworCW1yLmF0dHJpYnV0ZSA9IG1kLmF0dHJpYnV0ZSB8IEVGSV9NRU1PUllfUlVOVElNRTsKKworCW51bV9lbnRyaWVzID0gZWZpX21lbW1hcF9zcGxpdF9jb3VudCgmbWQsICZtci5yYW5nZSk7CisJbnVtX2VudHJpZXMgKz0gZWZpLm1lbW1hcC5ucl9tYXA7CisKKwluZXdfc2l6ZSA9IGVmaS5tZW1tYXAuZGVzY19zaXplICogbnVtX2VudHJpZXM7CisKKwluZXdfcGh5cyA9IG1lbWJsb2NrX2FsbG9jKG5ld19zaXplLCAwKTsKKwlpZiAoIW5ld19waHlzKSB7CisJCXByX2VycigiQ291bGQgbm90IGFsbG9jYXRlIGJvb3Qgc2VydmljZXMgbWVtbWFwXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW5ldyA9IGVhcmx5X21lbXJlbWFwKG5ld19waHlzLCBuZXdfc2l6ZSk7CisJaWYgKCFuZXcpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gbWFwIG5ldyBib290IHNlcnZpY2VzIG1lbW1hcFxuIik7CisJCXJldHVybjsKKwl9CisKKwllZmlfbWVtbWFwX2luc2VydCgmZWZpLm1lbW1hcCwgbmV3LCAmbXIpOworCWVhcmx5X21lbXVubWFwKG5ldywgbmV3X3NpemUpOworCisJZWZpX21lbW1hcF9pbnN0YWxsKG5ld19waHlzLCBudW1fZW50cmllcyk7Cit9CisKKy8qCiAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGVmaV9yZXNlcnZlX2Jvb3Rfc2VydmljZXMoKSB0byBmaWd1cmUgb3V0IGlmIHdlCiAgKiBjYW4gZnJlZSByZWdpb25zIGluIGVmaV9mcmVlX2Jvb3Rfc2VydmljZXMoKS4KICAqCkBAIC0xODQsMTUgKzI1Myw2IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLS8qCi0gKiBUaGUgVUVGSSBzcGVjaWZpY2F0aW9uIG1ha2VzIGl0IGNsZWFyIHRoYXQgdGhlIG9wZXJhdGluZyBzeXN0ZW0gaXMgZnJlZSB0byBkbwotICogd2hhdGV2ZXIgaXQgd2FudHMgd2l0aCBib290IHNlcnZpY2VzIGNvZGUgYWZ0ZXIgRXhpdEJvb3RTZXJ2aWNlcygpIGhhcyBiZWVuCi0gKiBjYWxsZWQuIElnbm9yaW5nIHRoaXMgcmVjb21tZW5kYXRpb24gYSBzaWduaWZpY2FudCBidW5jaCBvZiBFRkkgaW1wbGVtZW50YXRpb25zIAotICogY29udGludWUgY2FsbGluZyBpbnRvIGJvb3Qgc2VydmljZXMgY29kZSAoU2V0VmlydHVhbEFkZHJlc3NNYXApLiBJbiBvcmRlciB0byAKLSAqIHdvcmsgYXJvdW5kIHN1Y2ggYnVnZ3kgaW1wbGVtZW50YXRpb25zIHdlIHJlc2VydmUgYm9vdCBzZXJ2aWNlcyByZWdpb24gZHVyaW5nIAotICogRUZJIGluaXQgYW5kIG1ha2Ugc3VyZSBpdCBzdGF5cyBleGVjdXRhYmxlLiBUaGVuLCBhZnRlciBTZXRWaXJ0dWFsQWRkcmVzc01hcCgpLCBpdAotKiBpcyBkaXNjYXJkZWQuCi0qLwogdm9pZCBfX2luaXQgZWZpX3Jlc2VydmVfYm9vdF9zZXJ2aWNlcyh2b2lkKQogewogCWVmaV9tZW1vcnlfZGVzY190ICptZDsKQEAgLTI0OSw3ICszMDksMTAgQEAKIAogdm9pZCBfX2luaXQgZWZpX2ZyZWVfYm9vdF9zZXJ2aWNlcyh2b2lkKQogeworCXBoeXNfYWRkcl90IG5ld19waHlzLCBuZXdfc2l6ZTsKIAllZmlfbWVtb3J5X2Rlc2NfdCAqbWQ7CisJaW50IG51bV9lbnRyaWVzID0gMDsKKwl2b2lkICpuZXcsICpuZXdfbWQ7CiAKIAlmb3JfZWFjaF9lZmlfbWVtb3J5X2Rlc2MobWQpIHsKIAkJdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0ID0gbWQtPnBoeXNfYWRkcjsKQEAgLTI1NywxMiArMzIwLDE2IEBACiAJCXNpemVfdCBybV9zaXplOwogCiAJCWlmIChtZC0+dHlwZSAhPSBFRklfQk9PVF9TRVJWSUNFU19DT0RFICYmCi0JCSAgICBtZC0+dHlwZSAhPSBFRklfQk9PVF9TRVJWSUNFU19EQVRBKQorCQkgICAgbWQtPnR5cGUgIT0gRUZJX0JPT1RfU0VSVklDRVNfREFUQSkgeworCQkJbnVtX2VudHJpZXMrKzsKIAkJCWNvbnRpbnVlOworCQl9CiAKIAkJLyogRG8gbm90IGZyZWUsIHNvbWVvbmUgZWxzZSBvd25zIGl0OiAqLwotCQlpZiAobWQtPmF0dHJpYnV0ZSAmIEVGSV9NRU1PUllfUlVOVElNRSkKKwkJaWYgKG1kLT5hdHRyaWJ1dGUgJiBFRklfTUVNT1JZX1JVTlRJTUUpIHsKKwkJCW51bV9lbnRyaWVzKys7CiAJCQljb250aW51ZTsKKwkJfQogCiAJCS8qCiAJCSAqIE5hc3R5IHF1aXJrOiBpZiBhbGwgc3ViLTFNQiBtZW1vcnkgaXMgdXNlZCBmb3IgYm9vdApAQCAtMjg3LDcgKzM1NCw0MSBAQAogCQlmcmVlX2Jvb3RtZW1fbGF0ZShzdGFydCwgc2l6ZSk7CiAJfQogCi0JZWZpX3VubWFwX21lbW1hcCgpOworCW5ld19zaXplID0gZWZpLm1lbW1hcC5kZXNjX3NpemUgKiBudW1fZW50cmllczsKKwluZXdfcGh5cyA9IG1lbWJsb2NrX2FsbG9jKG5ld19zaXplLCAwKTsKKwlpZiAoIW5ld19waHlzKSB7CisJCXByX2VycigiRmFpbGVkIHRvIGFsbG9jYXRlIG5ldyBFRkkgbWVtbWFwXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW5ldyA9IG1lbXJlbWFwKG5ld19waHlzLCBuZXdfc2l6ZSwgTUVNUkVNQVBfV0IpOworCWlmICghbmV3KSB7CisJCXByX2VycigiRmFpbGVkIHRvIG1hcCBuZXcgRUZJIG1lbW1hcFxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIEJ1aWxkIGEgbmV3IEVGSSBtZW1tYXAgdGhhdCBleGNsdWRlcyBhbnkgYm9vdCBzZXJ2aWNlcworCSAqIHJlZ2lvbnMgdGhhdCBhcmUgbm90IHRhZ2dlZCBFRklfTUVNT1JZX1JVTlRJTUUsIHNpbmNlIHRob3NlCisJICogcmVnaW9ucyBoYXZlIG5vdyBiZWVuIGZyZWVkLgorCSAqLworCW5ld19tZCA9IG5ldzsKKwlmb3JfZWFjaF9lZmlfbWVtb3J5X2Rlc2MobWQpIHsKKwkJaWYgKCEobWQtPmF0dHJpYnV0ZSAmIEVGSV9NRU1PUllfUlVOVElNRSkgJiYKKwkJICAgIChtZC0+dHlwZSA9PSBFRklfQk9PVF9TRVJWSUNFU19DT0RFIHx8CisJCSAgICAgbWQtPnR5cGUgPT0gRUZJX0JPT1RfU0VSVklDRVNfREFUQSkpCisJCQljb250aW51ZTsKKworCQltZW1jcHkobmV3X21kLCBtZCwgZWZpLm1lbW1hcC5kZXNjX3NpemUpOworCQluZXdfbWQgKz0gZWZpLm1lbW1hcC5kZXNjX3NpemU7CisJfQorCisJbWVtdW5tYXAobmV3KTsKKworCWlmIChlZmlfbWVtbWFwX2luc3RhbGwobmV3X3BoeXMsIG51bV9lbnRyaWVzKSkgeworCQlwcl9lcnIoIkNvdWxkIG5vdCBpbnN0YWxsIG5ldyBFRkkgbWVtbWFwXG4iKTsKKwkJcmV0dXJuOworCX0KIH0KIAogLyoKQEAgLTM2NSw3ICs0NjYsNyBAQAogCSAqLwogCWlmICghZWZpX3J1bnRpbWVfc3VwcG9ydGVkKCkpIHsKIAkJcHJfaW5mbygiU2V0dXAgZG9uZSwgZGlzYWJsaW5nIGR1ZSB0byAzMi82NC1iaXQgbWlzbWF0Y2hcbiIpOwotCQllZmlfdW5tYXBfbWVtbWFwKCk7CisJCWVmaV9tZW1tYXBfdW5tYXAoKTsKIAl9CiAKIAkvKiBVVjIrIEJJT1MgaGFzIGEgZml4IGZvciB0aGlzIGlzc3VlLiAgVVYxIHN0aWxsIG5lZWRzIHRoZSBxdWlyay4gKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9kZXZpY2VfbGlicy9NYWtlZmlsZSBiL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9kZXZpY2VfbGlicy9NYWtlZmlsZQppbmRleCBmYzEzNWJmLi40MjlkMDhiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS9pbnRlbC1taWQvZGV2aWNlX2xpYnMvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vaW50ZWwtbWlkL2RldmljZV9saWJzL01ha2VmaWxlCkBAIC0xLDUgKzEsOSBAQAogIyBGYW1pbHktTGV2ZWwgSW50ZXJmYWNlIFNoaW0gKEZMSVMpCiBvYmotJChzdWJzdCBtLHksJChDT05GSUdfUElOQ1RSTF9NRVJSSUZJRUxEKSkgKz0gcGxhdGZvcm1fbXJmbGRfcGluY3RybC5vCisjIFNESENJIERldmljZXMKK29iai0kKHN1YnN0IG0seSwkKENPTkZJR19NTUNfU0RIQ0lfUENJKSkgKz0gcGxhdGZvcm1fbXJmbGRfc2QubworIyBXaUZpCitvYmotJChzdWJzdCBtLHksJChDT05GSUdfQlJDTUZNQUNfU0RJTykpICs9IHBsYXRmb3JtX2JjbTQzeHgubwogIyBJUEMgRGV2aWNlcwogb2JqLXkgKz0gcGxhdGZvcm1faXBjLm8KIG9iai0kKHN1YnN0IG0seSwkKENPTkZJR19NRkRfSU5URUxfTVNJQykpICs9IHBsYXRmb3JtX21zaWMubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vaW50ZWwtbWlkL2RldmljZV9saWJzL3BsYXRmb3JtX2JjbTQzeHguYyBiL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9kZXZpY2VfbGlicy9wbGF0Zm9ybV9iY200M3h4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM5MmMxNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9kZXZpY2VfbGlicy9wbGF0Zm9ybV9iY200M3h4LmMKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIHBsYXRmb3JtX2JjbTQzeHguYzogYmNtNDN4eCBwbGF0Zm9ybSBkYXRhIGluaXRpbGl6YXRpb24gZmlsZQorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAxNiBJbnRlbCBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBBbmR5IFNoZXZjaGVua28gPGFuZHJpeS5zaGV2Y2hlbmtvQGxpbnV4LmludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9maXhlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NmaS5oPgorCisjaW5jbHVkZSA8YXNtL2ludGVsLW1pZC5oPgorCisjZGVmaW5lIFdMQU5fU0ZJX0dQSU9fSVJRX05BTUUJCSJXTEFOLWludGVycnVwdCIKKyNkZWZpbmUgV0xBTl9TRklfR1BJT19FTkFCTEVfTkFNRQkiV0xBTi1lbmFibGUiCisKKyNkZWZpbmUgV0xBTl9ERVZfTkFNRQkJCSIwMDAwOjAwOjAxLjMiCisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBiY200M3h4X3ZtbWNfc3VwcGx5ID0geworCS5kZXZfbmFtZQkJPSBXTEFOX0RFVl9OQU1FLAorCS5zdXBwbHkJCQk9ICJ2bW1jIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBiY200M3h4X3ZtbWNfZGF0YSA9IHsKKwkuY29uc3RyYWludHMgPSB7CisJCS52YWxpZF9vcHNfbWFzawkJPSBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKKwl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSAxLAorCS5jb25zdW1lcl9zdXBwbGllcwk9ICZiY200M3h4X3ZtbWNfc3VwcGx5LAorfTsKKworc3RhdGljIHN0cnVjdCBmaXhlZF92b2x0YWdlX2NvbmZpZyBiY200M3h4X3ZtbWMgPSB7CisJLnN1cHBseV9uYW1lCQk9ICJiY200M3h4LXZtbWMtcmVndWxhdG9yIiwKKwkvKgorCSAqIEFubm91bmNlIDIuMFYgaGVyZSB0byBiZSBjb21wYXRpYmxlIHdpdGggU0RJTyBzcGVjaWZpY2F0aW9uLiBUaGUKKwkgKiByZWFsIHZvbHRhZ2UgYW5kIHNpZ25hbGluZyBhcmUgc3RpbGwgMS44Vi4KKwkgKi8KKwkubWljcm92b2x0cwkJPSAyMDAwMDAwLAkJLyogMS44ViAqLworCS5ncGlvCQkJPSAtRUlOVkFMLAorCS5zdGFydHVwX2RlbGF5CQk9IDI1MCAqIDEwMDAsCQkvKiAyNTBtcyAqLworCS5lbmFibGVfaGlnaAkJPSAxLAkJCS8qIGFjdGl2ZSBoaWdoICovCisJLmVuYWJsZWRfYXRfYm9vdAk9IDAsCQkJLyogZGlzYWJsZWQgYXQgYm9vdCAqLworCS5pbml0X2RhdGEJCT0gJmJjbTQzeHhfdm1tY19kYXRhLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmNtNDN4eF92bW1jX3JlZ3VsYXRvciA9IHsKKwkubmFtZQkJPSAicmVnLWZpeGVkLXZvbHRhZ2UiLAorCS5pZAkJPSBQTEFURk9STV9ERVZJRF9BVVRPLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmJjbTQzeHhfdm1tYywKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgYmNtNDN4eF9yZWd1bGF0b3JfcmVnaXN0ZXIodm9pZCkKK3sKKwlpbnQgcmV0OworCisJYmNtNDN4eF92bW1jLmdwaW8gPSBnZXRfZ3Bpb19ieV9uYW1lKFdMQU5fU0ZJX0dQSU9fRU5BQkxFX05BTUUpOworCXJldCA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYmNtNDN4eF92bW1jX3JlZ3VsYXRvcik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiB2bW1jIHJlZ3VsYXRvciByZWdpc3RlciBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19pbml0ICpiY200M3h4X3BsYXRmb3JtX2RhdGEodm9pZCAqaW5mbykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gYmNtNDN4eF9yZWd1bGF0b3JfcmVnaXN0ZXIoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gTlVMTDsKKworCXByX2luZm8oIlVzaW5nIGdlbmVyaWMgd2lmaSBwbGF0Zm9ybSBkYXRhXG4iKTsKKworCS8qIEZvciBub3cgaXQncyBlbXB0eSAqLworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldnNfaWQgYmNtNDN4eF9jbGtfdm1tY19kZXZfaWQgX19pbml0Y29uc3QgPSB7CisJLm5hbWUJCQk9ICJiY200M3h4X2Nsa192bW1jIiwKKwkudHlwZQkJCT0gU0ZJX0RFVl9UWVBFX1NELAorCS5nZXRfcGxhdGZvcm1fZGF0YQk9ICZiY200M3h4X3BsYXRmb3JtX2RhdGEsCit9OworCitzZmlfZGV2aWNlKGJjbTQzeHhfY2xrX3ZtbWNfZGV2X2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9kZXZpY2VfbGlicy9wbGF0Zm9ybV9tcmZsZF9zZC5jIGIvYXJjaC94ODYvcGxhdGZvcm0vaW50ZWwtbWlkL2RldmljZV9saWJzL3BsYXRmb3JtX21yZmxkX3NkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBjNGEwMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9kZXZpY2VfbGlicy9wbGF0Zm9ybV9tcmZsZF9zZC5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBTREhDSSBwbGF0Zm9ybSBkYXRhIGluaXRpbGlzYXRpb24gZmlsZQorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAxNiBJbnRlbCBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBBbmR5IFNoZXZjaGVua28gPGFuZHJpeS5zaGV2Y2hlbmtvQGxpbnV4LmludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgPGxpbnV4L21tYy9zZGhjaS1wY2ktZGF0YS5oPgorCisjaW5jbHVkZSA8YXNtL2ludGVsLW1pZC5oPgorCisjZGVmaW5lIElOVEVMX01SRkxEX1NECQkJMgorI2RlZmluZSBJTlRFTF9NUkZMRF9TRF9DRF9HUElPCQk3NworCitzdGF0aWMgc3RydWN0IHNkaGNpX3BjaV9kYXRhIG1yZmxkX3NkaGNpX3BjaV9kYXRhID0geworCS5yc3Rfbl9ncGlvCT0gLUVJTlZBTCwKKwkuY2RfZ3Bpbwk9IElOVEVMX01SRkxEX1NEX0NEX0dQSU8sCit9OworCitzdGF0aWMgc3RydWN0IHNkaGNpX3BjaV9kYXRhICoKK21yZmxkX3NkaGNpX3BjaV9nZXRfZGF0YShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IHNsb3RubykKK3sKKwl1bnNpZ25lZCBpbnQgZnVuYyA9IFBDSV9GVU5DKHBkZXYtPmRldmZuKTsKKworCWlmIChmdW5jID09IElOVEVMX01SRkxEX1NEKQorCQlyZXR1cm4gJm1yZmxkX3NkaGNpX3BjaV9kYXRhOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG1yZmxkX3NkX2luaXQodm9pZCkKK3sKKwlpZiAoaW50ZWxfbWlkX2lkZW50aWZ5X2NwdSgpICE9IElOVEVMX01JRF9DUFVfQ0hJUF9UQU5HSUVSKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXNkaGNpX3BjaV9nZXRfZGF0YSA9IG1yZmxkX3NkaGNpX3BjaV9nZXRfZGF0YTsKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwobXJmbGRfc2RfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9pbnRlbC1taWQvaW50ZWwtbWlkLmMgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9pbnRlbC1taWQvaW50ZWwtbWlkLmMKaW5kZXggY2UxMTlkMi4uNzg1MDEyOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vaW50ZWwtbWlkL2ludGVsLW1pZC5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9pbnRlbC1taWQuYwpAQCAtNzAsNiArNzAsMTEgQEAKIAogc3RhdGljIHZvaWQgaW50ZWxfbWlkX3Bvd2VyX29mZih2b2lkKQogeworCS8qIFNodXQgZG93biBTb3V0aCBDb21wbGV4IHZpYSBQV1JNVSAqLworCWludGVsX21pZF9wd3JfcG93ZXJfb2ZmKCk7CisKKwkvKiBPbmx5IGZvciBUYW5naWVyLCB0aGUgcmVzdCB3aWxsIGlnbm9yZSB0aGlzIGNvbW1hbmQgKi8KKwlpbnRlbF9zY3VfaXBjX3NpbXBsZV9jb21tYW5kKElQQ01TR19DT0xEX09GRiwgMSk7CiB9OwogCiBzdGF0aWMgdm9pZCBpbnRlbF9taWRfcmVib290KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9pbnRlbC1taWQvcHdyLmMgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9pbnRlbC1taWQvcHdyLmMKaW5kZXggYzkwMWEzNC4uNWQzYjQ1YSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vaW50ZWwtbWlkL3B3ci5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9wd3IuYwpAQCAtNDQsNyArNDQsMTkgQEAKIC8qIEJpdHMgaW4gUE1fQ01EICovCiAjZGVmaW5lIFBNX0NNRF9DTUQoeCkJCSgoeCkgPDwgMCkKICNkZWZpbmUgUE1fQ01EX0lPQwkJKDEgPDwgOCkKLSNkZWZpbmUgUE1fQ01EX0QzY29sZAkJKDEgPDwgMjEpCisjZGVmaW5lIFBNX0NNRF9DTV9OT1AJCSgwIDw8IDkpCisjZGVmaW5lIFBNX0NNRF9DTV9JTU1FRElBVEUJKDEgPDwgOSkKKyNkZWZpbmUgUE1fQ01EX0NNX0RFTEFZCQkoMiA8PCA5KQorI2RlZmluZSBQTV9DTURfQ01fVFJJR0dFUgkoMyA8PCA5KQorCisvKiBTeXN0ZW0gc3RhdGVzICovCisjZGVmaW5lIFBNX0NNRF9TWVNfU1RBVEVfUzUJKDUgPDwgMTYpCisKKy8qIFRyaWdnZXIgdmFyaWFudHMgKi8KKyNkZWZpbmUgUE1fQ01EX0NGR19UUklHR0VSX05DCSgzIDw8IDE5KQorCisvKiBNZXNzYWdlIHRvIHdhaXQgZm9yIFRSSUdHRVJfTkMgY2FzZSAqLworI2RlZmluZSBUUklHR0VSX05DX01TR18yCSgyIDw8IDIyKQogCiAvKiBMaXN0IG9mIGNvbW1hbmRzICovCiAjZGVmaW5lIENNRF9TRVRfQ0ZHCQkweDAxCkBAIC0xMzcsNyArMTQ5LDcgQEAKIAogc3RhdGljIGludCBtaWRfcHdyX3dhaXRfZm9yX2NtZChzdHJ1Y3QgbWlkX3B3ciAqcHdyLCB1OCBjbWQpCiB7Ci0Jd3JpdGVsKFBNX0NNRF9DTUQoY21kKSwgcHdyLT5yZWdzICsgUE1fQ01EKTsKKwl3cml0ZWwoUE1fQ01EX0NNRChjbWQpIHwgUE1fQ01EX0NNX0lNTUVESUFURSwgcHdyLT5yZWdzICsgUE1fQ01EKTsKIAlyZXR1cm4gbWlkX3B3cl93YWl0KHB3cik7CiB9CiAKQEAgLTI2MCw2ICsyNzIsMjAgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGludGVsX21pZF9wY2lfc2V0X3Bvd2VyX3N0YXRlKTsKIAordm9pZCBpbnRlbF9taWRfcHdyX3Bvd2VyX29mZih2b2lkKQoreworCXN0cnVjdCBtaWRfcHdyICpwd3IgPSBtaWRwd3I7CisJdTMyIGNtZCA9IFBNX0NNRF9TWVNfU1RBVEVfUzUgfAorCQkgIFBNX0NNRF9DTUQoQ01EX1NFVF9DRkcpIHwKKwkJICBQTV9DTURfQ01fVFJJR0dFUiB8CisJCSAgUE1fQ01EX0NGR19UUklHR0VSX05DIHwKKwkJICBUUklHR0VSX05DX01TR18yOworCisJLyogU2VuZCBjb21tYW5kIHRvIFNDVSAqLworCXdyaXRlbChjbWQsIHB3ci0+cmVncyArIFBNX0NNRCk7CisJbWlkX3B3cl93YWl0KHB3cik7Cit9CisKIGludCBpbnRlbF9taWRfcHdyX2dldF9sc3NfaWQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJaW50IHZuZHI7CkBAIC0zNTQsNyArMzgwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtaWRfc2V0X2luaXRpYWxfc3RhdGUoc3RydWN0IG1pZF9wd3IgKnB3cikKK3N0YXRpYyBpbnQgbWlkX3NldF9pbml0aWFsX3N0YXRlKHN0cnVjdCBtaWRfcHdyICpwd3IsIGNvbnN0IHUzMiAqc3RhdGVzKQogewogCXVuc2lnbmVkIGludCBpLCBqOwogCWludCByZXQ7CkBAIC0zNzksMTAgKzQwNSwxMCBAQAogCSAqIE5PVEU6IFRoZSBhY3R1YWwgZGV2aWNlIG1hcHBpbmcgaXMgcHJvdmlkZWQgYnkgYSBwbGF0Zm9ybSBhdCBydW4KIAkgKiB0aW1lIHVzaW5nIHZlbmRvciBjYXBhYmlsaXR5IG9mIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlLgogCSAqLwotCW1pZF9wd3Jfc2V0X3N0YXRlKHB3ciwgMCwgMHhmZmZmZmZmZik7Ci0JbWlkX3B3cl9zZXRfc3RhdGUocHdyLCAxLCAweGZmZmZmZmZmKTsKLQltaWRfcHdyX3NldF9zdGF0ZShwd3IsIDIsIDB4ZmZmZmZmZmYpOwotCW1pZF9wd3Jfc2V0X3N0YXRlKHB3ciwgMywgMHhmZmZmZmZmZik7CisJbWlkX3B3cl9zZXRfc3RhdGUocHdyLCAwLCBzdGF0ZXNbMF0pOworCW1pZF9wd3Jfc2V0X3N0YXRlKHB3ciwgMSwgc3RhdGVzWzFdKTsKKwltaWRfcHdyX3NldF9zdGF0ZShwd3IsIDIsIHN0YXRlc1syXSk7CisJbWlkX3B3cl9zZXRfc3RhdGUocHdyLCAzLCBzdGF0ZXNbM10pOwogCiAJLyogU2VuZCBjb21tYW5kIHRvIFNDVSAqLwogCXJldCA9IG1pZF9wd3Jfd2FpdF9mb3JfY21kKHB3ciwgQ01EX1NFVF9DRkcpOwpAQCAtMzk3LDEzICs0MjMsNDEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBtaWRfcHdyX2RldmljZV9pbmZvIG1pZF9pbmZvID0gewotCS5zZXRfaW5pdGlhbF9zdGF0ZSA9IG1pZF9zZXRfaW5pdGlhbF9zdGF0ZSwKK3N0YXRpYyBpbnQgcG53X3NldF9pbml0aWFsX3N0YXRlKHN0cnVjdCBtaWRfcHdyICpwd3IpCit7CisJLyogT24gUGVud2VsbCBTUkFNIG11c3Qgc3RheSBwb3dlcmVkIG9uICovCisJY29uc3QgdTMyIHN0YXRlc1tdID0geworCQkweGYwMGZmZmZmLAkJLyogUE1fU1NDKDApICovCisJCTB4ZmZmZmZmZmYsCQkvKiBQTV9TU0MoMSkgKi8KKwkJMHhmZmZmZmZmZiwJCS8qIFBNX1NTQygyKSAqLworCQkweGZmZmZmZmZmLAkJLyogUE1fU1NDKDMpICovCisJfTsKKwlyZXR1cm4gbWlkX3NldF9pbml0aWFsX3N0YXRlKHB3ciwgc3RhdGVzKTsKK30KKworc3RhdGljIGludCB0bmdfc2V0X2luaXRpYWxfc3RhdGUoc3RydWN0IG1pZF9wd3IgKnB3cikKK3sKKwljb25zdCB1MzIgc3RhdGVzW10gPSB7CisJCTB4ZmZmZmZmZmYsCQkvKiBQTV9TU0MoMCkgKi8KKwkJMHhmZmZmZmZmZiwJCS8qIFBNX1NTQygxKSAqLworCQkweGZmZmZmZmZmLAkJLyogUE1fU1NDKDIpICovCisJCTB4ZmZmZmZmZmYsCQkvKiBQTV9TU0MoMykgKi8KKwl9OworCXJldHVybiBtaWRfc2V0X2luaXRpYWxfc3RhdGUocHdyLCBzdGF0ZXMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG1pZF9wd3JfZGV2aWNlX2luZm8gcG53X2luZm8gPSB7CisJLnNldF9pbml0aWFsX3N0YXRlID0gcG53X3NldF9pbml0aWFsX3N0YXRlLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBtaWRfcHdyX2RldmljZV9pbmZvIHRuZ19pbmZvID0geworCS5zZXRfaW5pdGlhbF9zdGF0ZSA9IHRuZ19zZXRfaW5pdGlhbF9zdGF0ZSwKK307CisKKy8qIFRoaXMgdGFibGUgc2hvdWxkIGJlIGluIHN5bmMgd2l0aCB0aGUgb25lIGluIGRyaXZlcnMvcGNpL3BjaS1taWQuYyAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIG1pZF9wd3JfcGNpX2lkc1tdID0gewotCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfUEVOV0VMTCksIChrZXJuZWxfdWxvbmdfdCkmbWlkX2luZm8gfSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCBQQ0lfREVWSUNFX0lEX1RBTkdJRVIpLCAoa2VybmVsX3Vsb25nX3QpJm1pZF9pbmZvIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgUENJX0RFVklDRV9JRF9QRU5XRUxMKSwgKGtlcm5lbF91bG9uZ190KSZwbndfaW5mbyB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfVEFOR0lFUiksIChrZXJuZWxfdWxvbmdfdCkmdG5nX2luZm8gfSwKIAl7fQogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vbWVsbGFub3gvTWFrZWZpbGUgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9tZWxsYW5veC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDNjOTMxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vbWVsbGFub3gvTWFrZWZpbGUKQEAgLTAsMCArMSBAQAorb2JqLSQoQ09ORklHX01MWF9QTEFURk9STSkJKz0gbWx4LXBsYXRmb3JtLm8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL21lbGxhbm94L21seC1wbGF0Zm9ybS5jIGIvYXJjaC94ODYvcGxhdGZvcm0vbWVsbGFub3gvbWx4LXBsYXRmb3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RjZmNjYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL21lbGxhbm94L21seC1wbGF0Zm9ybS5jCkBAIC0wLDAgKzEsMjY2IEBACisvKgorICogYXJjaC94ODYvcGxhdGZvcm0vbWVsbGFub3gvbWx4LXBsYXRmb3JtLmMKKyAqIENvcHlyaWdodCAoYykgMjAxNiBNZWxsYW5veCBUZWNobm9sb2dpZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgVmFkaW0gUGFzdGVybmFrIDx2YWRpbXBAbWVsbGFub3guY29tPgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLW11eC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvaTJjLW11eC1yZWcuaD4KKworI2RlZmluZSBNTFhfUExBVF9ERVZJQ0VfTkFNRQkJIm1seHBsYXQiCisKKy8qIExQQyBidXMgSU8gb2Zmc2V0cyAqLworI2RlZmluZSBNTFhQTEFUX0NQTERfTFBDX0kyQ19CQVNFX0FEUlIJCTB4MjAwMAorI2RlZmluZSBNTFhQTEFUX0NQTERfTFBDX1JFR19CQVNFX0FEUlIJCTB4MjUwMAorI2RlZmluZSBNTFhQTEFUX0NQTERfTFBDX0lPX1JBTkdFCQkweDEwMAorI2RlZmluZSBNTFhQTEFUX0NQTERfTFBDX0kyQ19DSDFfT0ZGCQkweGRiCisjZGVmaW5lIE1MWFBMQVRfQ1BMRF9MUENfSTJDX0NIMl9PRkYJCTB4ZGEKKyNkZWZpbmUgTUxYUExBVF9DUExEX0xQQ19QSU9fT0ZGU0VUCQkweDEwMDAwVUwKKyNkZWZpbmUgTUxYUExBVF9DUExEX0xQQ19SRUcxCSgoTUxYUExBVF9DUExEX0xQQ19SRUdfQkFTRV9BRFJSICsgXAorCQkJCSAgTUxYUExBVF9DUExEX0xQQ19JMkNfQ0gxX09GRikgfCBcCisJCQkJICBNTFhQTEFUX0NQTERfTFBDX1BJT19PRkZTRVQpCisjZGVmaW5lIE1MWFBMQVRfQ1BMRF9MUENfUkVHMgkoKE1MWFBMQVRfQ1BMRF9MUENfUkVHX0JBU0VfQURSUiArIFwKKwkJCQkgIE1MWFBMQVRfQ1BMRF9MUENfSTJDX0NIMl9PRkYpIHwgXAorCQkJCSAgTUxYUExBVF9DUExEX0xQQ19QSU9fT0ZGU0VUKQorCisvKiBTdGFydCBjaGFubmVsIG51bWJlcnMgKi8KKyNkZWZpbmUgTUxYUExBVF9DUExEX0NIMQkJCTIKKyNkZWZpbmUgTUxYUExBVF9DUExEX0NIMgkJCTEwCisKKy8qIE51bWJlciBvZiBMUEMgYXR0YWNoZWQgTVVYIHBsYXRmb3JtIGRldmljZXMgKi8KKyNkZWZpbmUgTUxYUExBVF9DUExEX0xQQ19NVVhfREVWUwkJMgorCisvKiBtbHhwbGF0X3ByaXYgLSBwbGF0Zm9ybSBwcml2YXRlIGRhdGEKKyAqIEBwZGV2X2kyYyAtIGkyYyBjb250cm9sbGVyIHBsYXRmb3JtIGRldmljZQorICogQHBkZXZfbXV4IC0gYXJyYXkgb2YgbXV4IHBsYXRmb3JtIGRldmljZXMKKyAqLworc3RydWN0IG1seHBsYXRfcHJpdiB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldl9pMmM7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldl9tdXhbTUxYUExBVF9DUExEX0xQQ19NVVhfREVWU107Cit9OworCisvKiBSZWdpb25zIGZvciBMUEMgSTJDIGNvbnRyb2xsZXIgYW5kIExQQyBiYXNlIHJlZ2lzdGVyIHNwYWNlICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlc291cmNlIG1seHBsYXRfbHBjX3Jlc291cmNlc1tdID0geworCVswXSA9IERFRklORV9SRVNfTkFNRUQoTUxYUExBVF9DUExEX0xQQ19JMkNfQkFTRV9BRFJSLAorCQkJICAgICAgIE1MWFBMQVRfQ1BMRF9MUENfSU9fUkFOR0UsCisJCQkgICAgICAgIm1seHBsYXRfY3BsZF9scGNfaTJjX2N0cmwiLCBJT1JFU09VUkNFX0lPKSwKKwlbMV0gPSBERUZJTkVfUkVTX05BTUVEKE1MWFBMQVRfQ1BMRF9MUENfUkVHX0JBU0VfQURSUiwKKwkJCSAgICAgICBNTFhQTEFUX0NQTERfTFBDX0lPX1JBTkdFLAorCQkJICAgICAgICJtbHhwbGF0X2NwbGRfbHBjX3JlZ3MiLAorCQkJICAgICAgIElPUkVTT1VSQ0VfSU8pLAorfTsKKworLyogUGxhdGZvcm0gZGVmYXVsdCBjaGFubmVscyAqLworc3RhdGljIGNvbnN0IGludCBtbHhwbGF0X2RlZmF1bHRfY2hhbm5lbHNbXVs4XSA9IHsKKwl7CisJCU1MWFBMQVRfQ1BMRF9DSDEsIE1MWFBMQVRfQ1BMRF9DSDEgKyAxLCBNTFhQTEFUX0NQTERfQ0gxICsgMiwKKwkJTUxYUExBVF9DUExEX0NIMSArIDMsIE1MWFBMQVRfQ1BMRF9DSDEgKyA0LCBNTFhQTEFUX0NQTERfQ0gxICsKKwkJNSwgTUxYUExBVF9DUExEX0NIMSArIDYsIE1MWFBMQVRfQ1BMRF9DSDEgKyA3CisJfSwKKwl7CisJCU1MWFBMQVRfQ1BMRF9DSDIsIE1MWFBMQVRfQ1BMRF9DSDIgKyAxLCBNTFhQTEFUX0NQTERfQ0gyICsgMiwKKwkJTUxYUExBVF9DUExEX0NIMiArIDMsIE1MWFBMQVRfQ1BMRF9DSDIgKyA0LCBNTFhQTEFUX0NQTERfQ0gyICsKKwkJNSwgTUxYUExBVF9DUExEX0NIMiArIDYsIE1MWFBMQVRfQ1BMRF9DSDIgKyA3CisJfSwKK307CisKKy8qIFBsYXRmb3JtIGNoYW5uZWxzIGZvciBNU04yMXh4IHN5c3RlbSBmYW1pbHkgKi8KK3N0YXRpYyBjb25zdCBpbnQgbWx4cGxhdF9tc24yMXh4X2NoYW5uZWxzW10gPSB7IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDggfTsKKworLyogUGxhdGZvcm0gbXV4IGRhdGEgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX211eF9yZWdfcGxhdGZvcm1fZGF0YSBtbHhwbGF0X211eF9kYXRhW10gPSB7CisJeworCQkucGFyZW50ID0gMSwKKwkJLmJhc2VfbnIgPSBNTFhQTEFUX0NQTERfQ0gxLAorCQkud3JpdGVfb25seSA9IDEsCisJCS5yZWcgPSAodm9pZCBfX2lvbWVtICopTUxYUExBVF9DUExEX0xQQ19SRUcxLAorCQkucmVnX3NpemUgPSAxLAorCQkuaWRsZV9pbl91c2UgPSAxLAorCX0sCisJeworCQkucGFyZW50ID0gMSwKKwkJLmJhc2VfbnIgPSBNTFhQTEFUX0NQTERfQ0gyLAorCQkud3JpdGVfb25seSA9IDEsCisJCS5yZWcgPSAodm9pZCBfX2lvbWVtICopTUxYUExBVF9DUExEX0xQQ19SRUcyLAorCQkucmVnX3NpemUgPSAxLAorCQkuaWRsZV9pbl91c2UgPSAxLAorCX0sCisKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICptbHhwbGF0X2RldjsKKworc3RhdGljIGludCBfX2luaXQgbWx4cGxhdF9kbWlfZGVmYXVsdF9tYXRjaGVkKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkbWkpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtbHhwbGF0X211eF9kYXRhKTsgaSsrKSB7CisJCW1seHBsYXRfbXV4X2RhdGFbaV0udmFsdWVzID0gbWx4cGxhdF9kZWZhdWx0X2NoYW5uZWxzW2ldOworCQltbHhwbGF0X211eF9kYXRhW2ldLm5fdmFsdWVzID0KKwkJCQlBUlJBWV9TSVpFKG1seHBsYXRfZGVmYXVsdF9jaGFubmVsc1tpXSk7CisJfQorCisJcmV0dXJuIDE7Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBtbHhwbGF0X2RtaV9tc24yMXh4X21hdGNoZWQoY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmRtaSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1seHBsYXRfbXV4X2RhdGEpOyBpKyspIHsKKwkJbWx4cGxhdF9tdXhfZGF0YVtpXS52YWx1ZXMgPSBtbHhwbGF0X21zbjIxeHhfY2hhbm5lbHM7CisJCW1seHBsYXRfbXV4X2RhdGFbaV0ubl92YWx1ZXMgPQorCQkJCUFSUkFZX1NJWkUobWx4cGxhdF9tc24yMXh4X2NoYW5uZWxzKTsKKwl9CisKKwlyZXR1cm4gMTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBtbHhwbGF0X2RtaV90YWJsZVtdIF9faW5pdGRhdGEgPSB7CisJeworCQkuY2FsbGJhY2sgPSBtbHhwbGF0X2RtaV9kZWZhdWx0X21hdGNoZWQsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJNZWxsYW5veCBUZWNobm9sb2dpZXMiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTVNOMjQiKSwKKwkJfSwKKwl9LAorCXsKKwkJLmNhbGxiYWNrID0gbWx4cGxhdF9kbWlfZGVmYXVsdF9tYXRjaGVkLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiTWVsbGFub3ggVGVjaG5vbG9naWVzIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1TTjI3IiksCisJCX0sCisJfSwKKwl7CisJCS5jYWxsYmFjayA9IG1seHBsYXRfZG1pX2RlZmF1bHRfbWF0Y2hlZCwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIk1lbGxhbm94IFRlY2hub2xvZ2llcyIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNU0IiKSwKKwkJfSwKKwl9LAorCXsKKwkJLmNhbGxiYWNrID0gbWx4cGxhdF9kbWlfZGVmYXVsdF9tYXRjaGVkLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiTWVsbGFub3ggVGVjaG5vbG9naWVzIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1TWCIpLAorCQl9LAorCX0sCisJeworCQkuY2FsbGJhY2sgPSBtbHhwbGF0X2RtaV9tc24yMXh4X21hdGNoZWQsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJNZWxsYW5veCBUZWNobm9sb2dpZXMiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTVNOMjEiKSwKKwkJfSwKKwl9LAorCXsgfQorfTsKKworc3RhdGljIGludCBfX2luaXQgbWx4cGxhdF9pbml0KHZvaWQpCit7CisJc3RydWN0IG1seHBsYXRfcHJpdiAqcHJpdjsKKwlpbnQgaSwgZXJyOworCisJaWYgKCFkbWlfY2hlY2tfc3lzdGVtKG1seHBsYXRfZG1pX3RhYmxlKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltbHhwbGF0X2RldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoTUxYX1BMQVRfREVWSUNFX05BTUUsIC0xLAorCQkJCQltbHhwbGF0X2xwY19yZXNvdXJjZXMsCisJCQkJCUFSUkFZX1NJWkUobWx4cGxhdF9scGNfcmVzb3VyY2VzKSk7CisKKwlpZiAoSVNfRVJSKG1seHBsYXRfZGV2KSkKKwkJcmV0dXJuIFBUUl9FUlIobWx4cGxhdF9kZXYpOworCisJcHJpdiA9IGRldm1fa3phbGxvYygmbWx4cGxhdF9kZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBtbHhwbGF0X3ByaXYpLAorCQkJICAgIEdGUF9LRVJORUwpOworCWlmICghcHJpdikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfYWxsb2M7CisJfQorCXBsYXRmb3JtX3NldF9kcnZkYXRhKG1seHBsYXRfZGV2LCBwcml2KTsKKworCXByaXYtPnBkZXZfaTJjID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiaTJjX21seGNwbGQiLCAtMSwKKwkJCQkJCQkgTlVMTCwgMCk7CisJaWYgKElTX0VSUihwcml2LT5wZGV2X2kyYykpIHsKKwkJZXJyID0gUFRSX0VSUihwcml2LT5wZGV2X2kyYyk7CisJCWdvdG8gZmFpbF9hbGxvYzsKKwl9OworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWx4cGxhdF9tdXhfZGF0YSk7IGkrKykgeworCQlwcml2LT5wZGV2X211eFtpXSA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9yZXNuZGF0YSgKKwkJCQkJCSZtbHhwbGF0X2Rldi0+ZGV2LAorCQkJCQkJImkyYy1tdXgtcmVnIiwgaSwgTlVMTCwKKwkJCQkJCTAsICZtbHhwbGF0X211eF9kYXRhW2ldLAorCQkJCQkJc2l6ZW9mKG1seHBsYXRfbXV4X2RhdGFbaV0pKTsKKwkJaWYgKElTX0VSUihwcml2LT5wZGV2X211eFtpXSkpIHsKKwkJCWVyciA9IFBUUl9FUlIocHJpdi0+cGRldl9tdXhbaV0pOworCQkJZ290byBmYWlsX3BsYXRmb3JtX211eF9yZWdpc3RlcjsKKwkJfQorCX0KKworCXJldHVybiAwOworCitmYWlsX3BsYXRmb3JtX211eF9yZWdpc3RlcjoKKwlmb3IgKGktLTsgaSA+IDAgOyBpLS0pCisJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHByaXYtPnBkZXZfbXV4W2ldKTsKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcihwcml2LT5wZGV2X2kyYyk7CitmYWlsX2FsbG9jOgorCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKG1seHBsYXRfZGV2KTsKKworCXJldHVybiBlcnI7Cit9Cittb2R1bGVfaW5pdChtbHhwbGF0X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbWx4cGxhdF9leGl0KHZvaWQpCit7CisJc3RydWN0IG1seHBsYXRfcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKG1seHBsYXRfZGV2KTsKKwlpbnQgaTsKKworCWZvciAoaSA9IEFSUkFZX1NJWkUobWx4cGxhdF9tdXhfZGF0YSkgLSAxOyBpID49IDAgOyBpLS0pCisJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHByaXYtPnBkZXZfbXV4W2ldKTsKKworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHByaXYtPnBkZXZfaTJjKTsKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihtbHhwbGF0X2Rldik7Cit9Cittb2R1bGVfZXhpdChtbHhwbGF0X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJWYWRpbSBQYXN0ZXJuYWsgKHZhZGltcEBtZWxsYW5veC5jb20pIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1lbGxhbm94IHBsYXRmb3JtIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX0FMSUFTKCJkbWk6KjoqTWVsbGFub3gqOk1TTjI0KjoiKTsKK01PRFVMRV9BTElBUygiZG1pOio6Kk1lbGxhbm94KjpNU04yNyo6Iik7CitNT0RVTEVfQUxJQVMoImRtaToqOipNZWxsYW5veCo6TVNCKjoiKTsKK01PRFVMRV9BTElBUygiZG1pOio6Kk1lbGxhbm94KjpNU1gqOiIpOworTU9EVUxFX0FMSUFTKCJkbWk6KjoqTWVsbGFub3gqOk1TTjIxKjoiKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL3V2L2Jpb3NfdXYuYyBiL2FyY2gveDg2L3BsYXRmb3JtL3V2L2Jpb3NfdXYuYwppbmRleCAyM2YyZjNlLi5iNGQ1ZTk1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS91di9iaW9zX3V2LmMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vdXYvYmlvc191di5jCkBAIC0xNDksMTEgKzE0OSw4IEBACiBzNjQKIHV2X2Jpb3NfcmVzZXJ2ZWRfcGFnZV9wYSh1NjQgYnVmLCB1NjQgKmNvb2tpZSwgdTY0ICphZGRyLCB1NjQgKmxlbikKIHsKLQlzNjQgcmV0OwotCi0JcmV0ID0gdXZfYmlvc19jYWxsX2lycXNhdmUoVVZfQklPU19HRVRfUEFSVElUSU9OX0FERFIsICh1NjQpY29va2llLAotCQkJCQkodTY0KWFkZHIsIGJ1ZiwgKHU2NClsZW4sIDApOwotCXJldHVybiByZXQ7CisJcmV0dXJuIHV2X2Jpb3NfY2FsbF9pcnFzYXZlKFVWX0JJT1NfR0VUX1BBUlRJVElPTl9BRERSLCAodTY0KWNvb2tpZSwKKwkJCQkgICAgKHU2NClhZGRyLCBidWYsICh1NjQpbGVuLCAwKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHV2X2Jpb3NfcmVzZXJ2ZWRfcGFnZV9wYSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL3V2L3RsYl91di5jIGIvYXJjaC94ODYvcGxhdGZvcm0vdXYvdGxiX3V2LmMKaW5kZXggZmRiNGQ0Mi4uOWU0Mjg0MiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vdXYvdGxiX3V2LmMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vdXYvdGxiX3V2LmMKQEAgLTI0LDYgKzI0LDI5IEBACiAjaW5jbHVkZSA8YXNtL2lycV92ZWN0b3JzLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CiAKK3N0YXRpYyBzdHJ1Y3QgYmF1X29wZXJhdGlvbnMgb3BzOworCitzdGF0aWMgc3RydWN0IGJhdV9vcGVyYXRpb25zIHV2MTIzX2JhdV9vcHMgPSB7CisJLmJhdV9ncGFfdG9fb2Zmc2V0ICAgICAgID0gdXZfZ3BhX3RvX29mZnNldCwKKwkucmVhZF9sX3N3X2FjayAgICAgICAgICAgPSByZWFkX21tcl9zd19hY2ssCisJLnJlYWRfZ19zd19hY2sgICAgICAgICAgID0gcmVhZF9nbW1yX3N3X2FjaywKKwkud3JpdGVfbF9zd19hY2sgICAgICAgICAgPSB3cml0ZV9tbXJfc3dfYWNrLAorCS53cml0ZV9nX3N3X2FjayAgICAgICAgICA9IHdyaXRlX2dtbXJfc3dfYWNrLAorCS53cml0ZV9wYXlsb2FkX2ZpcnN0ICAgICA9IHdyaXRlX21tcl9wYXlsb2FkX2ZpcnN0LAorCS53cml0ZV9wYXlsb2FkX2xhc3QgICAgICA9IHdyaXRlX21tcl9wYXlsb2FkX2xhc3QsCit9OworCitzdGF0aWMgc3RydWN0IGJhdV9vcGVyYXRpb25zIHV2NF9iYXVfb3BzID0geworCS5iYXVfZ3BhX3RvX29mZnNldCAgICAgICA9IHV2X2dwYV90b19zb2NfcGh5c19yYW0sCisJLnJlYWRfbF9zd19hY2sgICAgICAgICAgID0gcmVhZF9tbXJfcHJvY19zd19hY2ssCisJLnJlYWRfZ19zd19hY2sgICAgICAgICAgID0gcmVhZF9nbW1yX3Byb2Nfc3dfYWNrLAorCS53cml0ZV9sX3N3X2FjayAgICAgICAgICA9IHdyaXRlX21tcl9wcm9jX3N3X2FjaywKKwkud3JpdGVfZ19zd19hY2sgICAgICAgICAgPSB3cml0ZV9nbW1yX3Byb2Nfc3dfYWNrLAorCS53cml0ZV9wYXlsb2FkX2ZpcnN0ICAgICA9IHdyaXRlX21tcl9wcm9jX3BheWxvYWRfZmlyc3QsCisJLndyaXRlX3BheWxvYWRfbGFzdCAgICAgID0gd3JpdGVfbW1yX3Byb2NfcGF5bG9hZF9sYXN0LAorfTsKKworCiAvKiB0aW1lb3V0cyBpbiBuYW5vc2Vjb25kcyAoaW5kZXhlZCBieSBVVkhfQUdJTkdfUFJFU0NBTEVfU0VMIHVyZ2VuY3k3IDMwOjI4KSAqLwogc3RhdGljIGludCB0aW1lb3V0X2Jhc2VfbnNbXSA9IHsKIAkJMjAsCkBAIC01NSwxNiArNzgsMTYgQEAKIHN0YXRpYyBpbnQgZGlzYWJsZWRfcGVyaW9kCT0gRElTQUJMRURfUEVSSU9EOwogCiBzdGF0aWMgc3RydWN0IHR1bmFibGVzIHR1bmFibGVzW10gPSB7Ci0JeyZtYXhfY29uY3VyciwgTUFYX0JBVV9DT05DVVJSRU5UfSwgLyogbXVzdCBiZSBbMF0gKi8KLQl7JnBsdWdnZWRfZGVsYXksIFBMVUdHRURfREVMQVl9LAotCXsmcGx1Z3NiNHJlc2V0LCBQTFVHU0I0UkVTRVR9LAotCXsmdGltZW91dHNiNHJlc2V0LCBUSU1FT1VUU0I0UkVTRVR9LAotCXsmaXBpX3Jlc2V0X2xpbWl0LCBJUElfUkVTRVRfTElNSVR9LAotCXsmY29tcGxldGVfdGhyZXNob2xkLCBDT01QTEVURV9USFJFU0hPTER9LAotCXsmY29uZ2VzdGVkX3Jlc3Buc191cywgQ09OR0VTVEVEX1JFU1BPTlNFX1VTfSwKLQl7JmNvbmdlc3RlZF9yZXBzLCBDT05HRVNURURfUkVQU30sCi0JeyZkaXNhYmxlZF9wZXJpb2QsIERJU0FCTEVEX1BFUklPRH0sCi0JeyZnaXZldXBfbGltaXQsIEdJVkVVUF9MSU1JVH0KKwl7Jm1heF9jb25jdXJyLCAgICAgICAgICAgTUFYX0JBVV9DT05DVVJSRU5UfSwgLyogbXVzdCBiZSBbMF0gKi8KKwl7JnBsdWdnZWRfZGVsYXksICAgICAgICAgUExVR0dFRF9ERUxBWX0sCisJeyZwbHVnc2I0cmVzZXQsICAgICAgICAgIFBMVUdTQjRSRVNFVH0sCisJeyZ0aW1lb3V0c2I0cmVzZXQsICAgICAgIFRJTUVPVVRTQjRSRVNFVH0sCisJeyZpcGlfcmVzZXRfbGltaXQsICAgICAgIElQSV9SRVNFVF9MSU1JVH0sCisJeyZjb21wbGV0ZV90aHJlc2hvbGQsICAgIENPTVBMRVRFX1RIUkVTSE9MRH0sCisJeyZjb25nZXN0ZWRfcmVzcG5zX3VzLCAgIENPTkdFU1RFRF9SRVNQT05TRV9VU30sCisJeyZjb25nZXN0ZWRfcmVwcywgICAgICAgIENPTkdFU1RFRF9SRVBTfSwKKwl7JmRpc2FibGVkX3BlcmlvZCwgICAgICAgRElTQUJMRURfUEVSSU9EfSwKKwl7JmdpdmV1cF9saW1pdCwgICAgICAgICAgR0lWRVVQX0xJTUlUfQogfTsKIAogc3RhdGljIHN0cnVjdCBkZW50cnkgKnR1bmFibGVzX2RpcjsKQEAgLTIxNiw3ICsyMzksNyBAQAogCW1zZyA9IG1kcC0+bXNnOwogCWlmICghbXNnLT5jYW5jZWxlZCAmJiBkb19hY2tub3dsZWRnZSkgewogCQlkdyA9IChtc2ctPnN3YWNrX3ZlYyA8PCBVVl9TV19BQ0tfTlBFTkRJTkcpIHwgbXNnLT5zd2Fja192ZWM7Ci0JCXdyaXRlX21tcl9zd19hY2soZHcpOworCQlvcHMud3JpdGVfbF9zd19hY2soZHcpOwogCX0KIAltc2ctPnJlcGxpZWRfdG8gPSAxOwogCW1zZy0+c3dhY2tfdmVjID0gMDsKQEAgLTI1Miw3ICsyNzUsNyBAQAogCQkJbXNnLT5zd2Fja192ZWMpID09IDApICYmCiAJCSAgICAobXNnMi0+c2VuZGluZ19jcHUgPT0gbXNnLT5zZW5kaW5nX2NwdSkgJiYKIAkJICAgIChtc2cyLT5tc2dfdHlwZSAhPSBNU0dfTk9PUCkpIHsKLQkJCW1tciA9IHJlYWRfbW1yX3N3X2FjaygpOworCQkJbW1yID0gb3BzLnJlYWRfbF9zd19hY2soKTsKIAkJCW1zZ19yZXMgPSBtc2cyLT5zd2Fja192ZWM7CiAJCQkvKgogCQkJICogVGhpcyBpcyBhIG1lc3NhZ2UgcmV0cnk7IGNsZWFyIHRoZSByZXNvdXJjZXMgaGVsZApAQCAtMjcwLDcgKzI5Myw3IEBACiAJCQkJc3RhdC0+ZF9jYW5jZWxlZCsrOwogCQkJCWNhbmNlbF9jb3VudCsrOwogCQkJCW1yID0gKG1zZ19yZXMgPDwgVVZfU1dfQUNLX05QRU5ESU5HKSB8IG1zZ19yZXM7Ci0JCQkJd3JpdGVfbW1yX3N3X2Fjayhtcik7CisJCQkJb3BzLndyaXRlX2xfc3dfYWNrKG1yKTsKIAkJCX0KIAkJfQogCX0KQEAgLTQwMywxMiArNDI2LDEyIEBACiAJCQkvKgogCQkJICogb25seSByZXNldCB0aGUgcmVzb3VyY2UgaWYgaXQgaXMgc3RpbGwgcGVuZGluZwogCQkJICovCi0JCQltbXIgPSByZWFkX21tcl9zd19hY2soKTsKKwkJCW1tciA9IG9wcy5yZWFkX2xfc3dfYWNrKCk7CiAJCQltc2dfcmVzID0gbXNnLT5zd2Fja192ZWM7CiAJCQltciA9IChtc2dfcmVzIDw8IFVWX1NXX0FDS19OUEVORElORykgfCBtc2dfcmVzOwogCQkJaWYgKG1tciAmIG1zZ19yZXMpIHsKIAkJCQlzdGF0LT5kX3JjYW5jZWxlZCsrOwotCQkJCXdyaXRlX21tcl9zd19hY2sobXIpOworCQkJCW9wcy53cml0ZV9sX3N3X2Fjayhtcik7CiAJCQl9CiAJCX0KIAl9CkBAIC01ODAsMTEgKzYwMyw3IEBACiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIHV2Ml8zX3JlYWRfc3RhdHVzKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgcnNoZnQsIGludCBkZXNjKQogewotCXVuc2lnbmVkIGxvbmcgZGVzY3JpcHRvcl9zdGF0dXM7Ci0KLQlkZXNjcmlwdG9yX3N0YXR1cyA9Ci0JCSgocmVhZF9sbW1yKG9mZnNldCkgPj4gcnNoZnQpICYgVVZfQUNUX1NUQVRVU19NQVNLKSA8PCAxOwotCXJldHVybiBkZXNjcmlwdG9yX3N0YXR1czsKKwlyZXR1cm4gKChyZWFkX2xtbXIob2Zmc2V0KSA+PiByc2hmdCkgJiBVVl9BQ1RfU1RBVFVTX01BU0spIDw8IDE7CiB9CiAKIC8qCkBAIC0xMjAyLDcgKzEyMjEsNyBAQAogCXN0cnVjdCBiYXVfcHFfZW50cnkgKm1zZyA9IG1kcC0+bXNnOwogCXN0cnVjdCBiYXVfcHFfZW50cnkgKm90aGVyX21zZzsKIAotCW1tcl9pbWFnZSA9IHJlYWRfbW1yX3N3X2FjaygpOworCW1tcl9pbWFnZSA9IG9wcy5yZWFkX2xfc3dfYWNrKCk7CiAJc3dhY2tfdmVjID0gbXNnLT5zd2Fja192ZWM7CiAKIAlpZiAoKHN3YWNrX3ZlYyAmIG1tcl9pbWFnZSkgPT0gMCkgewpAQCAtMTQzMSw3ICsxNDUwLDcgQEAKIAkJLyogZGVzdGluYXRpb24gc2lkZSBzdGF0aXN0aWNzICovCiAJCXNlcV9wcmludGYoZmlsZSwKIAkJCSIlbHggJWxkICVsZCAlbGQgJWxkICVsZCAlbGQgJWxkICVsZCAlbGQgJWxkICVsZFxuIiwKLQkJCSAgIHJlYWRfZ21tcl9zd19hY2sodXZfY3B1X3RvX3Bub2RlKGNwdSkpLAorCQkJICAgb3BzLnJlYWRfZ19zd19hY2sodXZfY3B1X3RvX3Bub2RlKGNwdSkpLAogCQkJICAgc3RhdC0+ZF9yZXF1ZXN0ZWUsIGN5Y2xlc18yX3VzKHN0YXQtPmRfdGltZSksCiAJCQkgICBzdGF0LT5kX2FsbHRsYiwgc3RhdC0+ZF9vbmV0bGIsIHN0YXQtPmRfbXVsdG1zZywKIAkJCSAgIHN0YXQtPmRfbm9tc2csIHN0YXQtPmRfcmV0cmllcywgc3RhdC0+ZF9jYW5jZWxlZCwKQEAgLTE0OTcsMTYgKzE1MTYsMTYgQEAKIAl9CiAKIAlpZiAoa3N0cnRvbChvcHRzdHIsIDEwLCAmaW5wdXRfYXJnKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIGlzIGludmFsaWRcbiIsIG9wdHN0cik7CisJCXByX2RlYnVnKCIlcyBpcyBpbnZhbGlkXG4iLCBvcHRzdHIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAoaW5wdXRfYXJnID09IDApIHsKIAkJZWxlbWVudHMgPSBBUlJBWV9TSVpFKHN0YXRfZGVzY3JpcHRpb24pOwotCQlwcmludGsoS0VSTl9ERUJVRyAiIyBjcHU6ICAgICAgY3B1IG51bWJlclxuIik7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJTZW5kZXIgc3RhdGlzdGljczpcbiIpOworCQlwcl9kZWJ1ZygiIyBjcHU6ICAgICAgY3B1IG51bWJlclxuIik7CisJCXByX2RlYnVnKCJTZW5kZXIgc3RhdGlzdGljczpcbiIpOwogCQlmb3IgKGkgPSAwOyBpIDwgZWxlbWVudHM7IGkrKykKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgc3RhdF9kZXNjcmlwdGlvbltpXSk7CisJCQlwcl9kZWJ1ZygiJXNcbiIsIHN0YXRfZGVzY3JpcHRpb25baV0pOwogCX0gZWxzZSBpZiAoaW5wdXRfYXJnID09IC0xKSB7CiAJCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGNwdSkgewogCQkJc3RhdCA9ICZwZXJfY3B1KHB0Y3N0YXRzLCBjcHUpOwpAQCAtMTU1NCw3ICsxNTczLDcgQEAKIAkJCWJyZWFrOwogCX0KIAlpZiAoY250ICE9IGUpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYmF1IHR1bmFibGUgZXJyb3I6IHNob3VsZCBiZSAlZCB2YWx1ZXNcbiIsIGUpOworCQlwcl9pbmZvKCJiYXUgdHVuYWJsZSBlcnJvcjogc2hvdWxkIGJlICVkIHZhbHVlc1xuIiwgZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTU3MSw3ICsxNTkwLDcgQEAKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJCWlmICh2YWwgPCAxIHx8IHZhbCA+IGJjcC0+Y3B1c19pbl91dmh1YikgewotCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJcHJfZGVidWcoCiAJCQkJIkVycm9yOiBCQVUgbWF4IGNvbmN1cnJlbnQgJWQgaXMgaW52YWxpZFxuIiwKIAkJCQl2YWwpOwogCQkJCXJldHVybiAtRUlOVkFMOwpAQCAtMTYxOSwxNyArMTYzOCwxNyBAQAogCiAJZm9yX2VhY2hfcHJlc2VudF9jcHUoY3B1KSB7CiAJCWJjcCA9ICZwZXJfY3B1KGJhdV9jb250cm9sLCBjcHUpOwotCQliY3AtPm1heF9jb25jdXJyID0JCW1heF9jb25jdXJyOwotCQliY3AtPm1heF9jb25jdXJyX2NvbnN0ID0JbWF4X2NvbmN1cnI7Ci0JCWJjcC0+cGx1Z2dlZF9kZWxheSA9CQlwbHVnZ2VkX2RlbGF5OwotCQliY3AtPnBsdWdzYjRyZXNldCA9CQlwbHVnc2I0cmVzZXQ7Ci0JCWJjcC0+dGltZW91dHNiNHJlc2V0ID0JCXRpbWVvdXRzYjRyZXNldDsKLQkJYmNwLT5pcGlfcmVzZXRfbGltaXQgPQkJaXBpX3Jlc2V0X2xpbWl0OwotCQliY3AtPmNvbXBsZXRlX3RocmVzaG9sZCA9CWNvbXBsZXRlX3RocmVzaG9sZDsKLQkJYmNwLT5jb25nX3Jlc3BvbnNlX3VzID0JCWNvbmdlc3RlZF9yZXNwbnNfdXM7Ci0JCWJjcC0+Y29uZ19yZXBzID0JCWNvbmdlc3RlZF9yZXBzOwotCQliY3AtPmRpc2FibGVkX3BlcmlvZCA9CQlzZWNfMl9jeWNsZXMoZGlzYWJsZWRfcGVyaW9kKTsKLQkJYmNwLT5naXZldXBfbGltaXQgPQkJZ2l2ZXVwX2xpbWl0OworCQliY3AtPm1heF9jb25jdXJyICAgICAgICAgPSBtYXhfY29uY3VycjsKKwkJYmNwLT5tYXhfY29uY3Vycl9jb25zdCAgID0gbWF4X2NvbmN1cnI7CisJCWJjcC0+cGx1Z2dlZF9kZWxheSAgICAgICA9IHBsdWdnZWRfZGVsYXk7CisJCWJjcC0+cGx1Z3NiNHJlc2V0ICAgICAgICA9IHBsdWdzYjRyZXNldDsKKwkJYmNwLT50aW1lb3V0c2I0cmVzZXQgICAgID0gdGltZW91dHNiNHJlc2V0OworCQliY3AtPmlwaV9yZXNldF9saW1pdCAgICAgPSBpcGlfcmVzZXRfbGltaXQ7CisJCWJjcC0+Y29tcGxldGVfdGhyZXNob2xkICA9IGNvbXBsZXRlX3RocmVzaG9sZDsKKwkJYmNwLT5jb25nX3Jlc3BvbnNlX3VzICAgID0gY29uZ2VzdGVkX3Jlc3Buc191czsKKwkJYmNwLT5jb25nX3JlcHMgICAgICAgICAgID0gY29uZ2VzdGVkX3JlcHM7CisJCWJjcC0+ZGlzYWJsZWRfcGVyaW9kICAgICA9IHNlY18yX2N5Y2xlcyhkaXNhYmxlZF9wZXJpb2QpOworCQliY3AtPmdpdmV1cF9saW1pdCAgICAgICAgPSBnaXZldXBfbGltaXQ7CiAJfQogCXJldHVybiBjb3VudDsKIH0KQEAgLTE2NzYsMjEgKzE2OTUsMjEgQEAKIAlwcm9jX3V2X3B0YyA9IHByb2NfY3JlYXRlKFVWX1BUQ19CQVNFTkFNRSwgMDQ0NCwgTlVMTCwKIAkJCQkgICZwcm9jX3V2X3B0Y19vcGVyYXRpb25zKTsKIAlpZiAoIXByb2NfdXZfcHRjKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGNyZWF0ZSAlcyBwcm9jIGVudHJ5XG4iLAorCQlwcl9lcnIoInVuYWJsZSB0byBjcmVhdGUgJXMgcHJvYyBlbnRyeVxuIiwKIAkJICAgICAgIFVWX1BUQ19CQVNFTkFNRSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXR1bmFibGVzX2RpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihVVl9CQVVfVFVOQUJMRVNfRElSLCBOVUxMKTsKIAlpZiAoIXR1bmFibGVzX2RpcikgewotCQlwcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBjcmVhdGUgZGVidWdmcyBkaXJlY3RvcnkgJXNcbiIsCisJCXByX2VycigidW5hYmxlIHRvIGNyZWF0ZSBkZWJ1Z2ZzIGRpcmVjdG9yeSAlc1xuIiwKIAkJICAgICAgIFVWX0JBVV9UVU5BQkxFU19ESVIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJdHVuYWJsZXNfZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoVVZfQkFVX1RVTkFCTEVTX0ZJTEUsIDA2MDAsCiAJCQkJCXR1bmFibGVzX2RpciwgTlVMTCwgJnR1bmFibGVzX2ZvcHMpOwogCWlmICghdHVuYWJsZXNfZmlsZSkgewotCQlwcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBjcmVhdGUgZGVidWdmcyBmaWxlICVzXG4iLAorCQlwcl9lcnIoInVuYWJsZSB0byBjcmVhdGUgZGVidWdmcyBmaWxlICVzXG4iLAogCQkgICAgICAgVVZfQkFVX1RVTkFCTEVTX0ZJTEUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xNzI1LDcgKzE3NDQsNyBAQAogCiAJZ3BhID0gdXZfZ3BhKGJhdV9kZXNjKTsKIAluID0gdXZfZ3BhX3RvX2dub2RlKGdwYSk7Ci0JbSA9IHV2X2dwYV90b19vZmZzZXQoZ3BhKTsKKwltID0gb3BzLmJhdV9ncGFfdG9fb2Zmc2V0KGdwYSk7CiAJaWYgKGlzX3V2MV9odWIoKSkKIAkJdXYxID0gMTsKIApAQCAtMTc0MCw3ICsxNzU5LDcgQEAKIAkJbWVtc2V0KGJkMiwgMCwgc2l6ZW9mKHN0cnVjdCBiYXVfZGVzYykpOwogCQlpZiAodXYxKSB7CiAJCQl1djFfaGRyID0gJmJkMi0+aGVhZGVyLnV2MV9oZHI7Ci0JCQl1djFfaGRyLT5zd2Fja19mbGFnID0JMTsKKwkJCXV2MV9oZHItPnN3YWNrX2ZsYWcgPSAxOwogCQkJLyoKIAkJCSAqIFRoZSBiYXNlX2Rlc3RfbmFzaWQgc2V0IGluIHRoZSBtZXNzYWdlIGhlYWRlcgogCQkJICogaXMgdGhlIG5hc2lkIG9mIHRoZSBmaXJzdCB1dmh1YiBpbiB0aGUgcGFydGl0aW9uLgpAQCAtMTc0OSwxMCArMTc2OCwxMCBAQAogCQkJICogaWYgbmFzaWQgc3RyaWRpbmcgaXMgYmVpbmcgdXNlZC4KIAkJCSAqLwogCQkJdXYxX2hkci0+YmFzZV9kZXN0X25hc2lkID0KLQkJCQkJCVVWX1BOT0RFX1RPX05BU0lEKGJhc2VfcG5vZGUpOwotCQkJdXYxX2hkci0+ZGVzdF9zdWJub2RlaWQgPQlVVl9MQl9TVUJOT0RFSUQ7Ci0JCQl1djFfaGRyLT5jb21tYW5kID0JCVVWX05FVF9FTkRQT0lOVF9JTlREOwotCQkJdXYxX2hkci0+aW50X2JvdGggPQkJMTsKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgVVZfUE5PREVfVE9fTkFTSUQoYmFzZV9wbm9kZSk7CisJCQl1djFfaGRyLT5kZXN0X3N1Ym5vZGVpZCAgPSBVVl9MQl9TVUJOT0RFSUQ7CisJCQl1djFfaGRyLT5jb21tYW5kICAgICAgICAgPSBVVl9ORVRfRU5EUE9JTlRfSU5URDsKKwkJCXV2MV9oZHItPmludF9ib3RoICAgICAgICA9IDE7CiAJCQkvKgogCQkJICogYWxsIG90aGVycyBuZWVkIHRvIGJlIHNldCB0byB6ZXJvOgogCQkJICogICBmYWlybmVzcyBjaGFpbmluZyBtdWx0aWxldmVsIGNvdW50IHJlcGxpZWRfdG8KQEAgLTE3NjMsMTEgKzE3ODIsMTEgQEAKIAkJCSAqIHVzZXMgbmF0aXZlIG1vZGUgZm9yIHNlbGVjdGl2ZSBicm9hZGNhc3RzLgogCQkJICovCiAJCQl1djJfM19oZHIgPSAmYmQyLT5oZWFkZXIudXYyXzNfaGRyOwotCQkJdXYyXzNfaGRyLT5zd2Fja19mbGFnID0JMTsKKwkJCXV2Ml8zX2hkci0+c3dhY2tfZmxhZyAgICAgID0gMTsKIAkJCXV2Ml8zX2hkci0+YmFzZV9kZXN0X25hc2lkID0KLQkJCQkJCVVWX1BOT0RFX1RPX05BU0lEKGJhc2VfcG5vZGUpOwotCQkJdXYyXzNfaGRyLT5kZXN0X3N1Ym5vZGVpZCA9CVVWX0xCX1NVQk5PREVJRDsKLQkJCXV2Ml8zX2hkci0+Y29tbWFuZCA9CQlVVl9ORVRfRU5EUE9JTlRfSU5URDsKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgVVZfUE5PREVfVE9fTkFTSUQoYmFzZV9wbm9kZSk7CisJCQl1djJfM19oZHItPmRlc3Rfc3Vibm9kZWlkICA9IFVWX0xCX1NVQk5PREVJRDsKKwkJCXV2Ml8zX2hkci0+Y29tbWFuZCAgICAgICAgID0gVVZfTkVUX0VORFBPSU5UX0lOVEQ7CiAJCX0KIAl9CiAJZm9yX2VhY2hfcHJlc2VudF9jcHUoY3B1KSB7CkBAIC0xNzkwLDEwICsxODA5LDcgQEAKIAlzaXplX3QgcGxzaXplOwogCWNoYXIgKmNwOwogCXZvaWQgKnZwOwotCXVuc2lnbmVkIGxvbmcgcG47Ci0JdW5zaWduZWQgbG9uZyBmaXJzdDsKLQl1bnNpZ25lZCBsb25nIHBuX2ZpcnN0OwotCXVuc2lnbmVkIGxvbmcgbGFzdDsKKwl1bnNpZ25lZCBsb25nIGdub2RlLCBmaXJzdCwgbGFzdCwgdGFpbDsKIAlzdHJ1Y3QgYmF1X3BxX2VudHJ5ICpwcXA7CiAJc3RydWN0IGJhdV9jb250cm9sICpiY3A7CiAKQEAgLTE4MTQsMTcgKzE4MzAsMjUgQEAKIAkJYmNwLT5iYXVfbXNnX2hlYWQJPSBwcXA7CiAJCWJjcC0+cXVldWVfbGFzdAkJPSBwcXAgKyAoREVTVF9RX1NJWkUgLSAxKTsKIAl9CisKKwlmaXJzdCA9IG9wcy5iYXVfZ3BhX3RvX29mZnNldCh1dl9ncGEocHFwKSk7CisJbGFzdCA9IG9wcy5iYXVfZ3BhX3RvX29mZnNldCh1dl9ncGEocHFwICsgKERFU1RfUV9TSVpFIC0gMSkpKTsKKwogCS8qCi0JICogbmVlZCB0aGUgZ25vZGUgb2Ygd2hlcmUgdGhlIG1lbW9yeSB3YXMgcmVhbGx5IGFsbG9jYXRlZAorCSAqIFByZSBVVjQsIHRoZSBnbm9kZSBpcyByZXF1aXJlZCB0byBsb2NhdGUgdGhlIHBheWxvYWQgcXVldWUKKwkgKiBhbmQgdGhlIHBheWxvYWQgcXVldWUgdGFpbCBtdXN0IGJlIG1haW50YWluZWQgYnkgdGhlIGtlcm5lbC4KIAkgKi8KLQlwbiA9IHV2X2dwYV90b19nbm9kZSh1dl9ncGEocHFwKSk7Ci0JZmlyc3QgPSB1dl9waHlzbm9kZWFkZHIocHFwKTsKLQlwbl9maXJzdCA9ICgodW5zaWduZWQgbG9uZylwbiA8PCBVVl9QQVlMT0FEUV9QTk9ERV9TSElGVCkgfCBmaXJzdDsKLQlsYXN0ID0gdXZfcGh5c25vZGVhZGRyKHBxcCArIChERVNUX1FfU0laRSAtIDEpKTsKLQl3cml0ZV9tbXJfcGF5bG9hZF9maXJzdChwbm9kZSwgcG5fZmlyc3QpOwotCXdyaXRlX21tcl9wYXlsb2FkX3RhaWwocG5vZGUsIGZpcnN0KTsKLQl3cml0ZV9tbXJfcGF5bG9hZF9sYXN0KHBub2RlLCBsYXN0KTsKLQl3cml0ZV9nbW1yX3N3X2Fjayhwbm9kZSwgMHhmZmZmVUwpOworCWJjcCA9ICZwZXJfY3B1KGJhdV9jb250cm9sLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCWlmIChiY3AtPnV2aHViX3ZlcnNpb24gPD0gMykgeworCQl0YWlsID0gZmlyc3Q7CisJCWdub2RlID0gdXZfZ3BhX3RvX2dub2RlKHV2X2dwYShwcXApKTsKKwkJZmlyc3QgPSAoZ25vZGUgPDwgVVZfUEFZTE9BRFFfR05PREVfU0hJRlQpIHwgdGFpbDsKKwkJd3JpdGVfbW1yX3BheWxvYWRfdGFpbChwbm9kZSwgdGFpbCk7CisJfQorCisJb3BzLndyaXRlX3BheWxvYWRfZmlyc3QocG5vZGUsIGZpcnN0KTsKKwlvcHMud3JpdGVfcGF5bG9hZF9sYXN0KHBub2RlLCBsYXN0KTsKKwlvcHMud3JpdGVfZ19zd19hY2socG5vZGUsIDB4ZmZmZlVMKTsKIAogCS8qIGluIGVmZmVjdCwgYWxsIG1zZ190eXBlJ3MgYXJlIHNldCB0byBNU0dfTk9PUCAqLwogCW1lbXNldChwcXAsIDAsIHNpemVvZihzdHJ1Y3QgYmF1X3BxX2VudHJ5KSAqIERFU1RfUV9TSVpFKTsKQEAgLTE5MTQsOCArMTkzOCw4IEBACiAJCWJjcC0+Y29tcGxldGVfdGhyZXNob2xkCQk9IGNvbXBsZXRlX3RocmVzaG9sZDsKIAkJYmNwLT5jb25nX3Jlc3BvbnNlX3VzCQk9IGNvbmdlc3RlZF9yZXNwbnNfdXM7CiAJCWJjcC0+Y29uZ19yZXBzCQkJPSBjb25nZXN0ZWRfcmVwczsKLQkJYmNwLT5kaXNhYmxlZF9wZXJpb2QgPQkJc2VjXzJfY3ljbGVzKGRpc2FibGVkX3BlcmlvZCk7Ci0JCWJjcC0+Z2l2ZXVwX2xpbWl0ID0JCWdpdmV1cF9saW1pdDsKKwkJYmNwLT5kaXNhYmxlZF9wZXJpb2QJCT0gc2VjXzJfY3ljbGVzKGRpc2FibGVkX3BlcmlvZCk7CisJCWJjcC0+Z2l2ZXVwX2xpbWl0CQk9IGdpdmV1cF9saW1pdDsKIAkJc3Bpbl9sb2NrX2luaXQoJmJjcC0+cXVldWVfbG9jayk7CiAJCXNwaW5fbG9ja19pbml0KCZiY3AtPnV2aHViX2xvY2spOwogCQlzcGluX2xvY2tfaW5pdCgmYmNwLT5kaXNhYmxlX2xvY2spOwpAQCAtMTk0NCw3ICsxOTY4LDcgQEAKIAogCQlwbm9kZSA9IHV2X2NwdV9odWJfaW5mbyhjcHUpLT5wbm9kZTsKIAkJaWYgKChwbm9kZSAtIGJhc2VfcG5vZGUpID49IFVWX0RJU1RSSUJVVElPTl9TSVpFKSB7Ci0JCQlwcmludGsoS0VSTl9FTUVSRworCQkJcHJfZW1lcmcoCiAJCQkJImNwdSAlZCBwbm9kZSAlZC0lZCBiZXlvbmQgJWQ7IEJBVSBkaXNhYmxlZFxuIiwKIAkJCQljcHUsIHBub2RlLCBiYXNlX3Bub2RlLCBVVl9ESVNUUklCVVRJT05fU0laRSk7CiAJCQlyZXR1cm4gMTsKQEAgLTE5NjksNyArMTk5Myw3IEBACiAJCXNkcC0+Y3B1X251bWJlcltzZHAtPm51bV9jcHVzXSA9IGNwdTsKIAkJc2RwLT5udW1fY3B1cysrOwogCQlpZiAoc2RwLT5udW1fY3B1cyA+IE1BWF9DUFVTX1BFUl9TT0NLRVQpIHsKLQkJCXByaW50ayhLRVJOX0VNRVJHICIlZCBjcHVzIHBlciBzb2NrZXQgaW52YWxpZFxuIiwKKwkJCXByX2VtZXJnKCIlZCBjcHVzIHBlciBzb2NrZXQgaW52YWxpZFxuIiwKIAkJCQlzZHAtPm51bV9jcHVzKTsKIAkJCXJldHVybiAxOwogCQl9CkBAIC0yMDM1LDE1ICsyMDU5LDE3IEBACiAJCQliY3AtPnV2aHViX3ZlcnNpb24gPSAyOwogCQllbHNlIGlmIChpc191djNfaHViKCkpCiAJCQliY3AtPnV2aHViX3ZlcnNpb24gPSAzOworCQllbHNlIGlmIChpc191djRfaHViKCkpCisJCQliY3AtPnV2aHViX3ZlcnNpb24gPSA0OwogCQllbHNlIHsKLQkJCXByaW50ayhLRVJOX0VNRVJHICJ1dmh1YiB2ZXJzaW9uIG5vdCAxLCAyIG9yIDNcbiIpOworCQkJcHJfZW1lcmcoInV2aHViIHZlcnNpb24gbm90IDEsIDIsIDMsIG9yIDRcbiIpOwogCQkJcmV0dXJuIDE7CiAJCX0KIAkJYmNwLT51dmh1Yl9tYXN0ZXIgPSAqaG1hc3RlcnA7CiAJCWJjcC0+dXZodWJfY3B1ID0gdXZfY3B1X2JsYWRlX3Byb2Nlc3Nvcl9pZChjcHUpOwogCiAJCWlmIChiY3AtPnV2aHViX2NwdSA+PSBNQVhfQ1BVU19QRVJfVVZIVUIpIHsKLQkJCXByaW50ayhLRVJOX0VNRVJHICIlZCBjcHVzIHBlciB1dmh1YiBpbnZhbGlkXG4iLAorCQkJcHJfZW1lcmcoIiVkIGNwdXMgcGVyIHV2aHViIGludmFsaWRcbiIsCiAJCQkJYmNwLT51dmh1Yl9jcHUpOwogCQkJcmV0dXJuIDE7CiAJCX0KQEAgLTIwOTgsNyArMjEyNCw4IEBACiAJdm9pZCAqdnA7CiAJc3RydWN0IHV2aHViX2Rlc2MgKnV2aHViX2Rlc2NzOwogCi0JdGltZW91dF91cyA9IGNhbGN1bGF0ZV9kZXN0aW5hdGlvbl90aW1lb3V0KCk7CisJaWYgKGlzX3V2M19odWIoKSB8fCBpc191djJfaHViKCkgfHwgaXNfdXYxX2h1YigpKQorCQl0aW1lb3V0X3VzID0gY2FsY3VsYXRlX2Rlc3RpbmF0aW9uX3RpbWVvdXQoKTsKIAogCXZwID0ga21hbGxvYyhudXZodWJzICogc2l6ZW9mKHN0cnVjdCB1dmh1Yl9kZXNjKSwgR0ZQX0tFUk5FTCk7CiAJdXZodWJfZGVzY3MgPSAoc3RydWN0IHV2aHViX2Rlc2MgKil2cDsKQEAgLTIxMzgsNiArMjE2NSwxNSBAQAogCWlmICghaXNfdXZfc3lzdGVtKCkpCiAJCXJldHVybiAwOwogCisJaWYgKGlzX3V2NF9odWIoKSkKKwkJb3BzID0gdXY0X2JhdV9vcHM7CisJZWxzZSBpZiAoaXNfdXYzX2h1YigpKQorCQlvcHMgPSB1djEyM19iYXVfb3BzOworCWVsc2UgaWYgKGlzX3V2Ml9odWIoKSkKKwkJb3BzID0gdXYxMjNfYmF1X29wczsKKwllbHNlIGlmIChpc191djFfaHViKCkpCisJCW9wcyA9IHV2MTIzX2JhdV9vcHM7CisKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3VyX2NwdSkgewogCQltYXNrID0gJnBlcl9jcHUodXZfZmx1c2hfdGxiX21hc2ssIGN1cl9jcHUpOwogCQl6YWxsb2NfY3B1bWFza192YXJfbm9kZShtYXNrLCBHRlBfS0VSTkVMLCBjcHVfdG9fbm9kZShjdXJfY3B1KSk7CkBAIC0yMTUzLDcgKzIxODksOSBAQAogCQkJdXZfYmFzZV9wbm9kZSA9IHV2X2JsYWRlX3RvX3Bub2RlKHV2aHViKTsKIAl9CiAKLQllbmFibGVfdGltZW91dHMoKTsKKwkvKiBzb2Z0d2FyZSB0aW1lb3V0cyBhcmUgbm90IHN1cHBvcnRlZCBvbiBVVjQgKi8KKwlpZiAoaXNfdXYzX2h1YigpIHx8IGlzX3V2Ml9odWIoKSB8fCBpc191djFfaHViKCkpCisJCWVuYWJsZV90aW1lb3V0cygpOwogCiAJaWYgKGluaXRfcGVyX2NwdShudXZodWJzLCB1dl9iYXNlX3Bub2RlKSkgewogCQlzZXRfYmF1X29mZigpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcG93ZXIvY3B1LmMgYi9hcmNoL3g4Ni9wb3dlci9jcHUuYwppbmRleCBiMTJjMjZlLi41M2NhY2UyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wb3dlci9jcHUuYworKysgYi9hcmNoL3g4Ni9wb3dlci9jcHUuYwpAQCAtMTMwLDcgKzEzMCw3IEBACiAJY3R4dC0+Y3IwID0gcmVhZF9jcjAoKTsKIAljdHh0LT5jcjIgPSByZWFkX2NyMigpOwogCWN0eHQtPmNyMyA9IHJlYWRfY3IzKCk7Ci0JY3R4dC0+Y3I0ID0gX19yZWFkX2NyNF9zYWZlKCk7CisJY3R4dC0+Y3I0ID0gX19yZWFkX2NyNCgpOwogI2lmZGVmIENPTkZJR19YODZfNjQKIAljdHh0LT5jcjggPSByZWFkX2NyOCgpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wb3dlci9oaWJlcm5hdGVfNjQuYyBiL2FyY2gveDg2L3Bvd2VyL2hpYmVybmF0ZV82NC5jCmluZGV4IGEzZTNjY2MuLjk2MzQ1NTcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3Bvd2VyL2hpYmVybmF0ZV82NC5jCisrKyBiL2FyY2gveDg2L3Bvd2VyL2hpYmVybmF0ZV82NC5jCkBAIC0xMTMsNyArMTEzLDcgQEAKIAkJCXJldHVybiByZXN1bHQ7CiAJfQogCi0JdGVtcF9sZXZlbDRfcGd0ID0gKHVuc2lnbmVkIGxvbmcpcGdkIC0gX19QQUdFX09GRlNFVDsKKwl0ZW1wX2xldmVsNF9wZ3QgPSBfX3BhKHBnZCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3Jhcy9tY2VfYW1kX2luai5jIGIvYXJjaC94ODYvcmFzL21jZV9hbWRfaW5qLmMKaW5kZXggMTEwNDUxNS4uMWFjNzY0NyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcmFzL21jZV9hbWRfaW5qLmMKKysrIGIvYXJjaC94ODYvcmFzL21jZV9hbWRfaW5qLmMKQEAgLTY4LDYgKzY4LDcgQEAKIE1DRV9JTkpFQ1RfU0VUKHN0YXR1cyk7CiBNQ0VfSU5KRUNUX1NFVChtaXNjKTsKIE1DRV9JTkpFQ1RfU0VUKGFkZHIpOworTUNFX0lOSkVDVF9TRVQoc3luZCk7CiAKICNkZWZpbmUgTUNFX0lOSkVDVF9HRVQocmVnKQkJCQkJCVwKIHN0YXRpYyBpbnQgaW5qXyMjcmVnIyNfZ2V0KHZvaWQgKmRhdGEsIHU2NCAqdmFsKQkJCVwKQEAgLTgxLDEwICs4MiwxMiBAQAogTUNFX0lOSkVDVF9HRVQoc3RhdHVzKTsKIE1DRV9JTkpFQ1RfR0VUKG1pc2MpOwogTUNFX0lOSkVDVF9HRVQoYWRkcik7CitNQ0VfSU5KRUNUX0dFVChzeW5kKTsKIAogREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoc3RhdHVzX2ZvcHMsIGlual9zdGF0dXNfZ2V0LCBpbmpfc3RhdHVzX3NldCwgIiVsbHhcbiIpOwogREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUobWlzY19mb3BzLCBpbmpfbWlzY19nZXQsIGlual9taXNjX3NldCwgIiVsbHhcbiIpOwogREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoYWRkcl9mb3BzLCBpbmpfYWRkcl9nZXQsIGlual9hZGRyX3NldCwgIiVsbHhcbiIpOworREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoc3luZF9mb3BzLCBpbmpfc3luZF9nZXQsIGlual9zeW5kX3NldCwgIiVsbHhcbiIpOwogCiAvKgogICogQ2FsbGVyIG5lZWRzIHRvIGJlIG1ha2Ugc3VyZSB0aGlzIGNwdSBkb2Vzbid0IGRpc2FwcGVhcgpAQCAtMjQzLDI3ICsyNDYsMjcgQEAKIAogc3RhdGljIHZvaWQgcHJlcGFyZV9tc3JzKHZvaWQgKmluZm8pCiB7Ci0Jc3RydWN0IG1jZSBpX21jZSA9ICooc3RydWN0IG1jZSAqKWluZm87Ci0JdTggYiA9IGlfbWNlLmJhbms7CisJc3RydWN0IG1jZSBtID0gKihzdHJ1Y3QgbWNlICopaW5mbzsKKwl1OCBiID0gbS5iYW5rOwogCi0Jd3Jtc3JsKE1TUl9JQTMyX01DR19TVEFUVVMsIGlfbWNlLm1jZ3N0YXR1cyk7CisJd3Jtc3JsKE1TUl9JQTMyX01DR19TVEFUVVMsIG0ubWNnc3RhdHVzKTsKIAogCWlmIChib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfU01DQSkpIHsKLQkJaWYgKGlfbWNlLmluamVjdF9mbGFncyA9PSBERlJfSU5UX0lOSikgewotCQkJd3Jtc3JsKE1TUl9BTUQ2NF9TTUNBX01DeF9ERVNUQVQoYiksIGlfbWNlLnN0YXR1cyk7Ci0JCQl3cm1zcmwoTVNSX0FNRDY0X1NNQ0FfTUN4X0RFQUREUihiKSwgaV9tY2UuYWRkcik7CisJCWlmIChtLmluamVjdF9mbGFncyA9PSBERlJfSU5UX0lOSikgeworCQkJd3Jtc3JsKE1TUl9BTUQ2NF9TTUNBX01DeF9ERVNUQVQoYiksIG0uc3RhdHVzKTsKKwkJCXdybXNybChNU1JfQU1ENjRfU01DQV9NQ3hfREVBRERSKGIpLCBtLmFkZHIpOwogCQl9IGVsc2UgewotCQkJd3Jtc3JsKE1TUl9BTUQ2NF9TTUNBX01DeF9TVEFUVVMoYiksIGlfbWNlLnN0YXR1cyk7Ci0JCQl3cm1zcmwoTVNSX0FNRDY0X1NNQ0FfTUN4X0FERFIoYiksIGlfbWNlLmFkZHIpOworCQkJd3Jtc3JsKE1TUl9BTUQ2NF9TTUNBX01DeF9TVEFUVVMoYiksIG0uc3RhdHVzKTsKKwkJCXdybXNybChNU1JfQU1ENjRfU01DQV9NQ3hfQUREUihiKSwgbS5hZGRyKTsKIAkJfQogCi0JCXdybXNybChNU1JfQU1ENjRfU01DQV9NQ3hfTUlTQyhiKSwgaV9tY2UubWlzYyk7CisJCXdybXNybChNU1JfQU1ENjRfU01DQV9NQ3hfTUlTQyhiKSwgbS5taXNjKTsKKwkJd3Jtc3JsKE1TUl9BTUQ2NF9TTUNBX01DeF9TWU5EKGIpLCBtLnN5bmQpOwogCX0gZWxzZSB7Ci0JCXdybXNybChNU1JfSUEzMl9NQ3hfU1RBVFVTKGIpLCBpX21jZS5zdGF0dXMpOwotCQl3cm1zcmwoTVNSX0lBMzJfTUN4X0FERFIoYiksIGlfbWNlLmFkZHIpOwotCQl3cm1zcmwoTVNSX0lBMzJfTUN4X01JU0MoYiksIGlfbWNlLm1pc2MpOworCQl3cm1zcmwoTVNSX0lBMzJfTUN4X1NUQVRVUyhiKSwgbS5zdGF0dXMpOworCQl3cm1zcmwoTVNSX0lBMzJfTUN4X0FERFIoYiksIG0uYWRkcik7CisJCXdybXNybChNU1JfSUEzMl9NQ3hfTUlTQyhiKSwgbS5taXNjKTsKIAl9Ci0KIH0KIAogc3RhdGljIHZvaWQgZG9faW5qZWN0KHZvaWQpCkBAIC0yNzUsNiArMjc4LDkgQEAKIAlpZiAoaV9tY2UubWlzYykKIAkJaV9tY2Uuc3RhdHVzIHw9IE1DSV9TVEFUVVNfTUlTQ1Y7CiAKKwlpZiAoaV9tY2Uuc3luZCkKKwkJaV9tY2Uuc3RhdHVzIHw9IE1DSV9TVEFUVVNfU1lORFY7CisKIAlpZiAoaW5qX3R5cGUgPT0gU1dfSU5KKSB7CiAJCW1jZV9pbmplY3RfbG9nKCZpX21jZSk7CiAJCXJldHVybjsKQEAgLTMwMSw3ICszMDcsOSBAQAogCSAqIG9ubHkgb24gdGhlIG5vZGUgYmFzZSBjb3JlLiBSZWZlciB0byBEMThGM3g0NFtOYk1jYVRvTXN0Q3B1RW5dIGZvcgogCSAqIEZhbTEwaCBhbmQgbGF0ZXIgQktER3MuCiAJICovCi0JaWYgKHN0YXRpY19jcHVfaGFzKFg4Nl9GRUFUVVJFX0FNRF9EQ00pICYmIGIgPT0gNCkgeworCWlmIChzdGF0aWNfY3B1X2hhcyhYODZfRkVBVFVSRV9BTURfRENNKSAmJgorCSAgICBiID09IDQgJiYKKwkgICAgYm9vdF9jcHVfZGF0YS54ODYgPCAweDE3KSB7CiAJCXRvZ2dsZV9uYl9tY2FfbXN0X2NwdShhbWRfZ2V0X25iX2lkKGNwdSkpOwogCQljcHUgPSBnZXRfbmJjX2Zvcl9ub2RlKGFtZF9nZXRfbmJfaWQoY3B1KSk7CiAJfQpAQCAtMzcxLDYgKzM3OSw5IEBACiAiXHQgdXNlZCBmb3IgZXJyb3IgdGhyZXNob2xkaW5nIHB1cnBvc2VzIGFuZCBpdHMgdmFsaWRpdHkgaXMgaW5kaWNhdGVkIGJ5XG4iCiAiXHQgTUNpX1NUQVRVU1tNaXNjVl0uXG4iCiAiXG4iCisic3luZDpcdCBTZXQgTUNpX1NZTkQ6IHByb3ZpZGUgc3luZHJvbWUgaW5mbyBhYm91dCB0aGUgZXJyb3IuIE9ubHkgdmFsaWQgb25cbiIKKyJcdCBTY2FsYWJsZSBNQ0Egc3lzdGVtcywgYW5kIGl0cyB2YWxpZGl0eSBpcyBpbmRpY2F0ZWQgYnkgTUNpX1NUQVRVU1tTeW5kVl0uXG4iCisiXG4iCiAiYWRkcjpcdCBFcnJvciBhZGRyZXNzIHZhbHVlIHRvIGJlIHdyaXR0ZW4gdG8gTUNpX0FERFIuIExvZyBhZGRyZXNzIGluZm9ybWF0aW9uXG4iCiAiXHQgYXNzb2NpYXRlZCB3aXRoIHRoZSBlcnJvci5cbiIKICJcbiIKQEAgLTQyMCw2ICs0MzEsNyBAQAogCXsgLm5hbWUgPSAic3RhdHVzIiwJLmZvcHMgPSAmc3RhdHVzX2ZvcHMsIC5wZXJtID0gU19JUlVTUiB8IFNfSVdVU1IgfSwKIAl7IC5uYW1lID0gIm1pc2MiLAkuZm9wcyA9ICZtaXNjX2ZvcHMsICAgLnBlcm0gPSBTX0lSVVNSIHwgU19JV1VTUiB9LAogCXsgLm5hbWUgPSAiYWRkciIsCS5mb3BzID0gJmFkZHJfZm9wcywgICAucGVybSA9IFNfSVJVU1IgfCBTX0lXVVNSIH0sCisJeyAubmFtZSA9ICJzeW5kIiwJLmZvcHMgPSAmc3luZF9mb3BzLCAgIC5wZXJtID0gU19JUlVTUiB8IFNfSVdVU1IgfSwKIAl7IC5uYW1lID0gImJhbmsiLAkuZm9wcyA9ICZiYW5rX2ZvcHMsICAgLnBlcm0gPSBTX0lSVVNSIHwgU19JV1VTUiB9LAogCXsgLm5hbWUgPSAiZmxhZ3MiLAkuZm9wcyA9ICZmbGFnc19mb3BzLCAgLnBlcm0gPSBTX0lSVVNSIHwgU19JV1VTUiB9LAogCXsgLm5hbWUgPSAiY3B1IiwJLmZvcHMgPSAmZXh0Y3B1X2ZvcHMsIC5wZXJtID0gU19JUlVTUiB8IFNfSVdVU1IgfSwKQEAgLTQyOCw3ICs0NDAsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X21jZV9pbmplY3Qodm9pZCkKIHsKLQlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgaTsKIAl1NjQgY2FwOwogCiAJcmRtc3JsKE1TUl9JQTMyX01DR19DQVAsIGNhcCk7CkBAIC00NTIsMjYgKzQ2NCwyMiBAQAogCXJldHVybiAwOwogCiBlcnJfZGZzX2FkZDoKLQl3aGlsZSAoLS1pID49IDApCisJd2hpbGUgKGktLSA+IDApCiAJCWRlYnVnZnNfcmVtb3ZlKGRmc19mbHNbaV0uZCk7CiAKIAlkZWJ1Z2ZzX3JlbW92ZShkZnNfaW5qKTsKIAlkZnNfaW5qID0gTlVMTDsKIAotCXJldHVybiAtRU5PTUVNOworCXJldHVybiAtRU5PREVWOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9tY2VfaW5qZWN0KHZvaWQpCiB7Ci0JaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZnNfZmxzKTsgaSsrKQotCQlkZWJ1Z2ZzX3JlbW92ZShkZnNfZmxzW2ldLmQpOworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShkZnNfaW5qKTsKKwlkZnNfaW5qID0gTlVMTDsKIAogCW1lbXNldCgmZGZzX2ZscywgMCwgc2l6ZW9mKGRmc19mbHMpKTsKLQotCWRlYnVnZnNfcmVtb3ZlKGRmc19pbmopOwotCWRmc19pbmogPSBOVUxMOwogfQogbW9kdWxlX2luaXQoaW5pdF9tY2VfaW5qZWN0KTsKIG1vZHVsZV9leGl0KGV4aXRfbWNlX2luamVjdCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9wdHJhY2VfMzIuYyBiL2FyY2gveDg2L3VtL3B0cmFjZV8zMi5jCmluZGV4IGViZDRkZDYuLjU3NjZlYWQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3VtL3B0cmFjZV8zMi5jCisrKyBiL2FyY2gveDg2L3VtL3B0cmFjZV8zMi5jCkBAIC04NCw3ICs4NCwxMCBAQAogCWNhc2UgRUFYOgogCWNhc2UgRUlQOgogCWNhc2UgVUVTUDoKKwkJYnJlYWs7CiAJY2FzZSBPUklHX0VBWDoKKwkJLyogVXBkYXRlIHRoZSBzeXNjYWxsIG51bWJlci4gKi8KKwkJVVBUX1NZU0NBTExfTlIoJmNoaWxkLT50aHJlYWQucmVncy5yZWdzKSA9IHZhbHVlOwogCQlicmVhazsKIAljYXNlIEZTOgogCQlpZiAodmFsdWUgJiYgKHZhbHVlICYgMykgIT0gMykKQEAgLTE5MSw3ICsxOTQsNyBAQAogCiBzdGF0aWMgaW50IGdldF9mcHJlZ3Moc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgX191c2VyICpidWYsIHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCiB7Ci0JaW50IGVyciwgbiwgY3B1ID0gKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgY2hpbGQtPnN0YWNrKS0+Y3B1OworCWludCBlcnIsIG4sIGNwdSA9IHRhc2tfY3B1KGNoaWxkKTsKIAlzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBmcHJlZ3M7CiAKIAllcnIgPSBzYXZlX2kzODdfcmVnaXN0ZXJzKHVzZXJzcGFjZV9waWRbY3B1XSwKQEAgLTIwOCw3ICsyMTEsNyBAQAogCiBzdGF0aWMgaW50IHNldF9mcHJlZ3Moc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgX191c2VyICpidWYsIHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCiB7Ci0JaW50IG4sIGNwdSA9ICgoc3RydWN0IHRocmVhZF9pbmZvICopIGNoaWxkLT5zdGFjayktPmNwdTsKKwlpbnQgbiwgY3B1ID0gdGFza19jcHUoY2hpbGQpOwogCXN0cnVjdCB1c2VyX2kzODdfc3RydWN0IGZwcmVnczsKIAogCW4gPSBjb3B5X2Zyb21fdXNlcigmZnByZWdzLCBidWYsIHNpemVvZihmcHJlZ3MpKTsKQEAgLTIyMSw3ICsyMjQsNyBAQAogCiBzdGF0aWMgaW50IGdldF9mcHhyZWdzKHN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0IF9fdXNlciAqYnVmLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQogewotCWludCBlcnIsIG4sIGNwdSA9ICgoc3RydWN0IHRocmVhZF9pbmZvICopIGNoaWxkLT5zdGFjayktPmNwdTsKKwlpbnQgZXJyLCBuLCBjcHUgPSB0YXNrX2NwdShjaGlsZCk7CiAJc3RydWN0IHVzZXJfZnhzcl9zdHJ1Y3QgZnByZWdzOwogCiAJZXJyID0gc2F2ZV9mcHhfcmVnaXN0ZXJzKHVzZXJzcGFjZV9waWRbY3B1XSwgKHVuc2lnbmVkIGxvbmcgKikgJmZwcmVncyk7CkBAIC0yMzcsNyArMjQwLDcgQEAKIAogc3RhdGljIGludCBzZXRfZnB4cmVncyhzdHJ1Y3QgdXNlcl9meHNyX3N0cnVjdCBfX3VzZXIgKmJ1Ziwgc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKIHsKLQlpbnQgbiwgY3B1ID0gKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgY2hpbGQtPnN0YWNrKS0+Y3B1OworCWludCBuLCBjcHUgPSB0YXNrX2NwdShjaGlsZCk7CiAJc3RydWN0IHVzZXJfZnhzcl9zdHJ1Y3QgZnByZWdzOwogCiAJbiA9IGNvcHlfZnJvbV91c2VyKCZmcHJlZ3MsIGJ1Ziwgc2l6ZW9mKGZwcmVncykpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vcHRyYWNlXzY0LmMgYi9hcmNoL3g4Ni91bS9wdHJhY2VfNjQuYwppbmRleCBmYWFiNDE4Li4wYjVjMTg0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni91bS9wdHJhY2VfNjQuYworKysgYi9hcmNoL3g4Ni91bS9wdHJhY2VfNjQuYwpAQCAtNzgsNyArNzgsMTEgQEAKIAljYXNlIFJTSToKIAljYXNlIFJESToKIAljYXNlIFJCUDoKKwkJYnJlYWs7CisKIAljYXNlIE9SSUdfUkFYOgorCQkvKiBVcGRhdGUgdGhlIHN5c2NhbGwgbnVtYmVyLiAqLworCQlVUFRfU1lTQ0FMTF9OUigmY2hpbGQtPnRocmVhZC5yZWdzLnJlZ3MpID0gdmFsdWU7CiAJCWJyZWFrOwogCiAJY2FzZSBGUzoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYyBiL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYwppbmRleCA4ZmZiMDg5Li5jMGZkZDU3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMKKysrIGIvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jCkBAIC0xMTgsNyArMTE4LDcgQEAKIERFRklORV9QRVJfQ1BVKHN0cnVjdCB2Y3B1X2luZm8sIHhlbl92Y3B1X2luZm8pOwogCiAvKiBMaW51eCA8LT4gWGVuIHZDUFUgaWQgbWFwcGluZyAqLwotREVGSU5FX1BFUl9DUFUoaW50LCB4ZW5fdmNwdV9pZCkgPSAtMTsKK0RFRklORV9QRVJfQ1BVKHVpbnQzMl90LCB4ZW5fdmNwdV9pZCk7CiBFWFBPUlRfUEVSX0NQVV9TWU1CT0woeGVuX3ZjcHVfaWQpOwogCiBlbnVtIHhlbl9kb21haW5fdHlwZSB4ZW5fZG9tYWluX3R5cGUgPSBYRU5fTkFUSVZFOwpAQCAtMTM3LDggKzEzNywxMCBAQAogdm9pZCAqeGVuX2luaXRpYWxfZ2R0OwogCiBSRVNFUlZFX0JSSyhzaGFyZWRfaW5mb19wYWdlX2JyaywgUEFHRV9TSVpFKTsKLV9fcmVhZF9tb3N0bHkgaW50IHhlbl9oYXZlX3ZlY3Rvcl9jYWxsYmFjazsKLUVYUE9SVF9TWU1CT0xfR1BMKHhlbl9oYXZlX3ZlY3Rvcl9jYWxsYmFjayk7CisKK3N0YXRpYyBpbnQgeGVuX2NwdV91cF9wcmVwYXJlKHVuc2lnbmVkIGludCBjcHUpOworc3RhdGljIGludCB4ZW5fY3B1X3VwX29ubGluZSh1bnNpZ25lZCBpbnQgY3B1KTsKK3N0YXRpYyBpbnQgeGVuX2NwdV9kZWFkKHVuc2lnbmVkIGludCBjcHUpOwogCiAvKgogICogUG9pbnQgYXQgc29tZSBlbXB0eSBtZW1vcnkgdG8gc3RhcnQgd2l0aC4gV2UgbWFwIHRoZSByZWFsIHNoYXJlZF9pbmZvCkBAIC0xMjM3LDcgKzEyMzksNiBAQAogCS53cml0ZV9jcjAgPSB4ZW5fd3JpdGVfY3IwLAogCiAJLnJlYWRfY3I0ID0gbmF0aXZlX3JlYWRfY3I0LAotCS5yZWFkX2NyNF9zYWZlID0gbmF0aXZlX3JlYWRfY3I0X3NhZmUsCiAJLndyaXRlX2NyNCA9IHhlbl93cml0ZV9jcjQsCiAKICNpZmRlZiBDT05GSUdfWDg2XzY0CkBAIC0xNTIwLDEwICsxNTIxLDcgQEAKIAlpZiAoIXhlbl9mZWF0dXJlKFhFTkZFQVRfYXV0b190cmFuc2xhdGVkX3BoeXNtYXApKQogCQlyZXR1cm47CiAKLQlpZiAoIXhlbl9mZWF0dXJlKFhFTkZFQVRfaHZtX2NhbGxiYWNrX3ZlY3RvcikpCi0JCXJldHVybjsKLQotCXhlbl9oYXZlX3ZlY3Rvcl9jYWxsYmFjayA9IDE7CisJQlVHX09OKCF4ZW5fZmVhdHVyZShYRU5GRUFUX2h2bV9jYWxsYmFja192ZWN0b3IpKTsKIAogCXhlbl9wdmhfZWFybHlfY3B1X2luaXQoMCwgZmFsc2UpOwogCXhlbl9wdmhfc2V0X2NyX2ZsYWdzKDApOwpAQCAtMTUzOSw2ICsxNTM3LDI0IEBACiAJeDg2X3BsYXRmb3JtLmxlZ2FjeS5ydGMgPSAxOwogfQogCitzdGF0aWMgaW50IHhlbl9jcHVocF9zZXR1cCh2b2lkKQoreworCWludCByYzsKKworCXJjID0gY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9YRU5fUFJFUEFSRSwKKwkJCQkgICAgICAgIlhFTl9IVk1fR1VFU1RfUFJFUEFSRSIsCisJCQkJICAgICAgIHhlbl9jcHVfdXBfcHJlcGFyZSwgeGVuX2NwdV9kZWFkKTsKKwlpZiAocmMgPj0gMCkgeworCQlyYyA9IGNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVBfT05MSU5FX0RZTiwKKwkJCQkJICAgICAgICJYRU5fSFZNX0dVRVNUX09OTElORSIsCisJCQkJCSAgICAgICB4ZW5fY3B1X3VwX29ubGluZSwgTlVMTCk7CisJCWlmIChyYyA8IDApCisJCQljcHVocF9yZW1vdmVfc3RhdGVfbm9jYWxscyhDUFVIUF9YRU5fUFJFUEFSRSk7CisJfQorCisJcmV0dXJuIHJjID49IDAgPyAwIDogcmM7Cit9CisKIC8qIEZpcnN0IEMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIFhlbiBib290ICovCiBhc21saW5rYWdlIF9fdmlzaWJsZSB2b2lkIF9faW5pdCB4ZW5fc3RhcnRfa2VybmVsKHZvaWQpCiB7CkBAIC0xNjQwLDYgKzE2NTYsOCBAQAogCSAgIHBvc3NpYmxlIG1hcCBhbmQgYSBub24tZHVtbXkgc2hhcmVkX2luZm8uICovCiAJcGVyX2NwdSh4ZW5fdmNwdSwgMCkgPSAmSFlQRVJWSVNPUl9zaGFyZWRfaW5mby0+dmNwdV9pbmZvWzBdOwogCisJV0FSTl9PTih4ZW5fY3B1aHBfc2V0dXAoKSk7CisKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCWVhcmx5X2Jvb3RfaXJxc19kaXNhYmxlZCA9IHRydWU7CiAKQEAgLTE4MjAsMzEgKzE4MzgsNTQgQEAKIAl4ZW5fZG9tYWluX3R5cGUgPSBYRU5fSFZNX0RPTUFJTjsKIH0KIAotc3RhdGljIGludCB4ZW5faHZtX2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwKLQkJCSAgICAgIHZvaWQgKmhjcHUpCitzdGF0aWMgaW50IHhlbl9jcHVfdXBfcHJlcGFyZSh1bnNpZ25lZCBpbnQgY3B1KQogewotCWludCBjcHUgPSAobG9uZyloY3B1OwotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBDUFVfVVBfUFJFUEFSRToKKwlpbnQgcmM7CisKKwlpZiAoeGVuX2h2bV9kb21haW4oKSkgeworCQkvKgorCQkgKiBUaGlzIGNhbiBoYXBwZW4gaWYgQ1BVIHdhcyBvZmZsaW5lZCBlYXJsaWVyIGFuZAorCQkgKiBvZmZsaW5pbmcgdGltZWQgb3V0IGluIGNvbW1vbl9jcHVfZGllKCkuCisJCSAqLworCQlpZiAoY3B1X3JlcG9ydF9zdGF0ZShjcHUpID09IENQVV9ERUFEX0ZST1pFTikgeworCQkJeGVuX3NtcF9pbnRyX2ZyZWUoY3B1KTsKKwkJCXhlbl91bmluaXRfbG9ja19jcHUoY3B1KTsKKwkJfQorCiAJCWlmIChjcHVfYWNwaV9pZChjcHUpICE9IFUzMl9NQVgpCiAJCQlwZXJfY3B1KHhlbl92Y3B1X2lkLCBjcHUpID0gY3B1X2FjcGlfaWQoY3B1KTsKIAkJZWxzZQogCQkJcGVyX2NwdSh4ZW5fdmNwdV9pZCwgY3B1KSA9IGNwdTsKIAkJeGVuX3ZjcHVfc2V0dXAoY3B1KTsKLQkJaWYgKHhlbl9oYXZlX3ZlY3Rvcl9jYWxsYmFjaykgewotCQkJaWYgKHhlbl9mZWF0dXJlKFhFTkZFQVRfaHZtX3NhZmVfcHZjbG9jaykpCi0JCQkJeGVuX3NldHVwX3RpbWVyKGNwdSk7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7CiAJfQotCXJldHVybiBOT1RJRllfT0s7CisKKwlpZiAoeGVuX3B2X2RvbWFpbigpIHx8IHhlbl9mZWF0dXJlKFhFTkZFQVRfaHZtX3NhZmVfcHZjbG9jaykpCisJCXhlbl9zZXR1cF90aW1lcihjcHUpOworCisJcmMgPSB4ZW5fc21wX2ludHJfaW5pdChjcHUpOworCWlmIChyYykgeworCQlXQVJOKDEsICJ4ZW5fc21wX2ludHJfaW5pdCgpIGZvciBDUFUgJWQgZmFpbGVkOiAlZFxuIiwKKwkJICAgICBjcHUsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB4ZW5faHZtX2NwdV9ub3RpZmllciA9IHsKLQkubm90aWZpZXJfY2FsbAk9IHhlbl9odm1fY3B1X25vdGlmeSwKLX07CitzdGF0aWMgaW50IHhlbl9jcHVfZGVhZCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXhlbl9zbXBfaW50cl9mcmVlKGNwdSk7CisKKwlpZiAoeGVuX3B2X2RvbWFpbigpIHx8IHhlbl9mZWF0dXJlKFhFTkZFQVRfaHZtX3NhZmVfcHZjbG9jaykpCisJCXhlbl90ZWFyZG93bl90aW1lcihjcHUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGVuX2NwdV91cF9vbmxpbmUodW5zaWduZWQgaW50IGNwdSkKK3sKKwl4ZW5faW5pdF9sb2NrX2NwdShjcHUpOworCXJldHVybiAwOworfQogCiAjaWZkZWYgQ09ORklHX0tFWEVDX0NPUkUKIHN0YXRpYyB2b2lkIHhlbl9odm1fc2h1dGRvd24odm9pZCkKQEAgLTE4NzIsMTAgKzE5MTMsMTAgQEAKIAogCXhlbl9wYW5pY19oYW5kbGVyX2luaXQoKTsKIAotCWlmICh4ZW5fZmVhdHVyZShYRU5GRUFUX2h2bV9jYWxsYmFja192ZWN0b3IpKQotCQl4ZW5faGF2ZV92ZWN0b3JfY2FsbGJhY2sgPSAxOworCUJVR19PTigheGVuX2ZlYXR1cmUoWEVORkVBVF9odm1fY2FsbGJhY2tfdmVjdG9yKSk7CisKIAl4ZW5faHZtX3NtcF9pbml0KCk7Ci0JcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZ4ZW5faHZtX2NwdV9ub3RpZmllcik7CisJV0FSTl9PTih4ZW5fY3B1aHBfc2V0dXAoKSk7CiAJeGVuX3VucGx1Z19lbXVsYXRlZF9kZXZpY2VzKCk7CiAJeDg2X2luaXQuaXJxcy5pbnRyX2luaXQgPSB4ZW5faW5pdF9JUlE7CiAJeGVuX2h2bV9pbml0X3RpbWVfb3BzKCk7CkBAIC0xOTExLDcgKzE5NTIsNyBAQAogCQlyZXR1cm4gZmFsc2U7CiAJaWYgKCF4ZW5faHZtX2RvbWFpbigpKQogCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKHhlbl9mZWF0dXJlKFhFTkZFQVRfaHZtX3BpcnFzKSAmJiB4ZW5faGF2ZV92ZWN0b3JfY2FsbGJhY2spCisJaWYgKHhlbl9mZWF0dXJlKFhFTkZFQVRfaHZtX3BpcnFzKSkKIAkJcmV0dXJuIGZhbHNlOwogCXJldHVybiB0cnVlOwogfQpAQCAtMTkyNSw2ICsxOTY2LDQ1IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCB4ZW5fcGluX3ZjcHUoaW50IGNwdSkKK3sKKwlzdGF0aWMgYm9vbCBkaXNhYmxlX3Bpbm5pbmc7CisJc3RydWN0IHNjaGVkX3Bpbl9vdmVycmlkZSBwaW5fb3ZlcnJpZGU7CisJaW50IHJldDsKKworCWlmIChkaXNhYmxlX3Bpbm5pbmcpCisJCXJldHVybjsKKworCXBpbl9vdmVycmlkZS5wY3B1ID0gY3B1OworCXJldCA9IEhZUEVSVklTT1Jfc2NoZWRfb3AoU0NIRURPUF9waW5fb3ZlcnJpZGUsICZwaW5fb3ZlcnJpZGUpOworCisJLyogSWdub3JlIGVycm9ycyB3aGVuIHJlbW92aW5nIG92ZXJyaWRlLiAqLworCWlmIChjcHUgPCAwKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgLUVOT1NZUzoKKwkJcHJfd2FybigiVW5hYmxlIHRvIHBpbiBvbiBwaHlzaWNhbCBjcHUgJWQuIEluIGNhc2Ugb2YgcHJvYmxlbXMgY29uc2lkZXIgdmNwdSBwaW5uaW5nLlxuIiwKKwkJCWNwdSk7CisJCWRpc2FibGVfcGlubmluZyA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgLUVQRVJNOgorCQlXQVJOKDEsICJUcnlpbmcgdG8gcGluIHZjcHUgd2l0aG91dCBoYXZpbmcgcHJpdmlsZWdlIHRvIGRvIHNvXG4iKTsKKwkJZGlzYWJsZV9waW5uaW5nID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSAtRUlOVkFMOgorCWNhc2UgLUVCVVNZOgorCQlwcl93YXJuKCJQaHlzaWNhbCBjcHUgJWQgbm90IGF2YWlsYWJsZSBmb3IgcGlubmluZy4gQ2hlY2sgWGVuIGNwdSBjb25maWd1cmF0aW9uLlxuIiwKKwkJCWNwdSk7CisJCWJyZWFrOworCWNhc2UgMDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTigxLCAicmMgJWQgd2hpbGUgdHJ5aW5nIHRvIHBpbiB2Y3B1XG4iLCByZXQpOworCQlkaXNhYmxlX3Bpbm5pbmcgPSB0cnVlOworCX0KK30KKwogY29uc3Qgc3RydWN0IGh5cGVydmlzb3JfeDg2IHg4Nl9oeXBlcl94ZW4gPSB7CiAJLm5hbWUJCQk9ICJYZW4iLAogCS5kZXRlY3QJCQk9IHhlbl9wbGF0Zm9ybSwKQEAgLTE5MzMsNiArMjAxMyw3IEBACiAjZW5kaWYKIAkueDJhcGljX2F2YWlsYWJsZQk9IHhlbl94MmFwaWNfcGFyYV9hdmFpbGFibGUsCiAJLnNldF9jcHVfZmVhdHVyZXMgICAgICAgPSB4ZW5fc2V0X2NwdV9mZWF0dXJlcywKKwkucGluX3ZjcHUgICAgICAgICAgICAgICA9IHhlbl9waW5fdmNwdSwKIH07CiBFWFBPUlRfU1lNQk9MKHg4Nl9oeXBlcl94ZW4pOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vZ3JhbnQtdGFibGUuYyBiL2FyY2gveDg2L3hlbi9ncmFudC10YWJsZS5jCmluZGV4IGRlNDE0NGMuLjgwOWI2YzggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9ncmFudC10YWJsZS5jCisrKyBiL2FyY2gveDg2L3hlbi9ncmFudC10YWJsZS5jCkBAIC04OSw3ICs4OSw3IEBACiAKIHN0YXRpYyBpbnQgYXJjaF9nbnR0YWJfdmFsbG9jKHN0cnVjdCBnbnR0YWJfdm1fYXJlYSAqYXJlYSwgdW5zaWduZWQgbnJfZnJhbWVzKQogewotCWFyZWEtPnB0ZXMgPSBrbWFsbG9jKHNpemVvZihwdGVfdCAqKSAqIG5yX2ZyYW1lcywgR0ZQX0tFUk5FTCk7CisJYXJlYS0+cHRlcyA9IGttYWxsb2NfYXJyYXkobnJfZnJhbWVzLCBzaXplb2YoKmFyZWEtPnB0ZXMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoYXJlYS0+cHRlcyA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3BsYXRmb3JtLXBjaS11bnBsdWcuYyBiL2FyY2gveDg2L3hlbi9wbGF0Zm9ybS1wY2ktdW5wbHVnLmMKaW5kZXggZDM3YTBjNy4uOTBkMWI4MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL3BsYXRmb3JtLXBjaS11bnBsdWcuYworKysgYi9hcmNoL3g4Ni94ZW4vcGxhdGZvcm0tcGNpLXVucGx1Zy5jCkBAIC02MSw3ICs2MSw3IEBACiAJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiWGVuIFBsYXRmb3JtIFBDSTogdW5rbm93biBJL08gcHJvdG9jb2wgdmVyc2lvbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJYZW4gUGxhdGZvcm0gUENJOiB1bmtub3duIEkvTyBwcm90b2NvbCB2ZXJzaW9uXG4iKTsKIAkJcmV0dXJuIFhFTl9QTEFURk9STV9FUlJfUFJPVE9DT0w7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vcG11LmMgYi9hcmNoL3g4Ni94ZW4vcG11LmMKaW5kZXggMzJiZGMyYy4uYjlmYzUyNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL3BtdS5jCisrKyBiL2FyY2gveDg2L3hlbi9wbXUuYwpAQCAtNTQ3LDggKzU0NywxMSBAQAogCXJldHVybjsKIAogZmFpbDoKLQlwcl9pbmZvX29uY2UoIkNvdWxkIG5vdCBpbml0aWFsaXplIFZQTVUgZm9yIGNwdSAlZCwgZXJyb3IgJWRcbiIsCi0JCWNwdSwgZXJyKTsKKwlpZiAoZXJyID09IC1FT1BOT1RTVVBQIHx8IGVyciA9PSAtRU5PU1lTKQorCQlwcl9pbmZvX29uY2UoIlZQTVUgZGlzYWJsZWQgYnkgaHlwZXJ2aXNvci5cbiIpOworCWVsc2UKKwkJcHJfaW5mb19vbmNlKCJDb3VsZCBub3QgaW5pdGlhbGl6ZSBWUE1VIGZvciBjcHUgJWQsIGVycm9yICVkXG4iLAorCQkJY3B1LCBlcnIpOwogCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpeGVucG11X2RhdGEsIDApOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vc2V0dXAuYyBiL2FyY2gveDg2L3hlbi9zZXR1cC5jCmluZGV4IDE3NjQyNTIuLmY4OTYwZmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9zZXR1cC5jCisrKyBiL2FyY2gveDg2L3hlbi9zZXR1cC5jCkBAIC04NjEsNyArODYxLDcgQEAKIAllODIwX2FkZF9yZWdpb24oSVNBX1NUQVJUX0FERFJFU1MsIElTQV9FTkRfQUREUkVTUyAtIElTQV9TVEFSVF9BRERSRVNTLAogCQkJRTgyMF9SRVNFUlZFRCk7CiAKLQlzYW5pdGl6ZV9lODIwX21hcChlODIwLm1hcCwgQVJSQVlfU0laRShlODIwLm1hcCksICZlODIwLm5yX21hcCk7CisJc2FuaXRpemVfZTgyMF9tYXAoZTgyMC0+bWFwLCBBUlJBWV9TSVpFKGU4MjAtPm1hcCksICZlODIwLT5ucl9tYXApOwogCiAJLyoKIAkgKiBDaGVjayB3aGV0aGVyIHRoZSBrZXJuZWwgaXRzZWxmIGNvbmZsaWN0cyB3aXRoIHRoZSB0YXJnZXQgRTgyMCBtYXAuCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vc21wLmMgYi9hcmNoL3g4Ni94ZW4vc21wLmMKaW5kZXggMGI0ZDA0Yy4uOWZhMjdjZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL3NtcC5jCisrKyBiL2FyY2gveDg2L3hlbi9zbXAuYwpAQCAtODcsNiArODcsMTIgQEAKIAljcHVfZGF0YShjcHUpLng4Nl9tYXhfY29yZXMgPSAxOwogCXNldF9jcHVfc2libGluZ19tYXAoY3B1KTsKIAorCS8qCisJICogaWRlbnRpZnlfY3B1KCkgbWF5IGhhdmUgc2V0IGxvZ2ljYWxfcGtnX2lkIHRvIC0xIGR1ZQorCSAqIHRvIGluY29ycmVjdCBwaHlzX3Byb2NfaWQuIExldCdzIHJlLWNvbXVwdGUgaXQuCisJICovCisJdG9wb2xvZ3lfdXBkYXRlX3BhY2thZ2VfbWFwKGFwaWMtPmNwdV9wcmVzZW50X3RvX2FwaWNpZChjcHUpLCBjcHUpOworCiAJeGVuX3NldHVwX2NwdV9jbG9ja2V2ZW50cygpOwogCiAJbm90aWZ5X2NwdV9zdGFydGluZyhjcHUpOwpAQCAtMTE1LDcgKzEyMSw3IEBACiAJY3B1X3N0YXJ0dXBfZW50cnkoQ1BVSFBfQVBfT05MSU5FX0lETEUpOwogfQogCi1zdGF0aWMgdm9pZCB4ZW5fc21wX2ludHJfZnJlZSh1bnNpZ25lZCBpbnQgY3B1KQordm9pZCB4ZW5fc21wX2ludHJfZnJlZSh1bnNpZ25lZCBpbnQgY3B1KQogewogCWlmIChwZXJfY3B1KHhlbl9yZXNjaGVkX2lycSwgY3B1KS5pcnEgPj0gMCkgewogCQl1bmJpbmRfZnJvbV9pcnFoYW5kbGVyKHBlcl9jcHUoeGVuX3Jlc2NoZWRfaXJxLCBjcHUpLmlycSwgTlVMTCk7CkBAIC0xNTksNyArMTY1LDcgQEAKIAkJcGVyX2NwdSh4ZW5fcG11X2lycSwgY3B1KS5uYW1lID0gTlVMTDsKIAl9CiB9Owotc3RhdGljIGludCB4ZW5fc21wX2ludHJfaW5pdCh1bnNpZ25lZCBpbnQgY3B1KQoraW50IHhlbl9zbXBfaW50cl9pbml0KHVuc2lnbmVkIGludCBjcHUpCiB7CiAJaW50IHJjOwogCWNoYXIgKnJlc2NoZWRfbmFtZSwgKmNhbGxmdW5jX25hbWUsICpkZWJ1Z19uYW1lLCAqcG11X25hbWU7CkBAIC00NzUsOCArNDgxLDYgQEAKIAljb21tb25fY3B1X3VwKGNwdSwgaWRsZSk7CiAKIAl4ZW5fc2V0dXBfcnVuc3RhdGVfaW5mbyhjcHUpOwotCXhlbl9zZXR1cF90aW1lcihjcHUpOwotCXhlbl9pbml0X2xvY2tfY3B1KGNwdSk7CiAKIAkvKgogCSAqIFBWIFZDUFVzIGFyZSBhbHdheXMgc3VjY2Vzc2Z1bGx5IHRha2VuIGRvd24gKHNlZSAnd2hpbGUnIGxvb3AKQEAgLTQ5NSwxMCArNDk5LDYgQEAKIAogCXhlbl9wbXVfaW5pdChjcHUpOwogCi0JcmMgPSB4ZW5fc21wX2ludHJfaW5pdChjcHUpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCiAJcmMgPSBIWVBFUlZJU09SX3ZjcHVfb3AoVkNQVU9QX3VwLCB4ZW5fdmNwdV9ucihjcHUpLCBOVUxMKTsKIAlCVUdfT04ocmMpOwogCkBAIC03NjksNDcgKzc2OSwxMCBAQAogCXhlbl9pbml0X2xvY2tfY3B1KDApOwogfQogCi1zdGF0aWMgaW50IHhlbl9odm1fY3B1X3VwKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGlkbGUpCi17Ci0JaW50IHJjOwotCi0JLyoKLQkgKiBUaGlzIGNhbiBoYXBwZW4gaWYgQ1BVIHdhcyBvZmZsaW5lZCBlYXJsaWVyIGFuZAotCSAqIG9mZmxpbmluZyB0aW1lZCBvdXQgaW4gY29tbW9uX2NwdV9kaWUoKS4KLQkgKi8KLQlpZiAoY3B1X3JlcG9ydF9zdGF0ZShjcHUpID09IENQVV9ERUFEX0ZST1pFTikgewotCQl4ZW5fc21wX2ludHJfZnJlZShjcHUpOwotCQl4ZW5fdW5pbml0X2xvY2tfY3B1KGNwdSk7Ci0JfQotCi0JLyoKLQkgKiB4ZW5fc21wX2ludHJfaW5pdCgpIG5lZWRzIHRvIHJ1biBiZWZvcmUgbmF0aXZlX2NwdV91cCgpCi0JICogc28gdGhhdCBJUEkgdmVjdG9ycyBhcmUgc2V0IHVwIG9uIHRoZSBib290aW5nIENQVSBiZWZvcmUKLQkgKiBpdCBpcyBtYXJrZWQgb25saW5lIGluIG5hdGl2ZV9jcHVfdXAoKS4KLQkqLwotCXJjID0geGVuX3NtcF9pbnRyX2luaXQoY3B1KTsKLQlXQVJOX09OKHJjKTsKLQlpZiAoIXJjKQotCQlyYyA9ICBuYXRpdmVfY3B1X3VwKGNwdSwgdGlkbGUpOwotCi0JLyoKLQkgKiBXZSBtdXN0IGluaXRpYWxpemUgdGhlIHNsb3dwYXRoIENQVSBraWNrZXIgX2FmdGVyXyB0aGUgbmF0aXZlCi0JICogcGF0aCBoYXMgZXhlY3V0ZWQuIElmIHdlIGluaXRpYWxpemVkIGl0IGJlZm9yZSBub25lIG9mIHRoZQotCSAqIHVubG9ja2VyIElQSSBraWNrcyB3b3VsZCByZWFjaCB0aGUgYm9vdGluZyBDUFUgYXMgdGhlIGJvb3RpbmcKLQkgKiBDUFUgaGFkIG5vdCBzZXQgaXRzZWxmICdvbmxpbmUnIGluIGNwdV9vbmxpbmVfbWFzay4gVGhhdCBtYXNrCi0JICogaXMgY2hlY2tlZCB3aGVuIElQSXMgYXJlIHNlbnQgKG9uIEhWTSBhdCBsZWFzdCkuCi0JICovCi0JeGVuX2luaXRfbG9ja19jcHUoY3B1KTsKLQlyZXR1cm4gcmM7Ci19Ci0KIHZvaWQgX19pbml0IHhlbl9odm1fc21wX2luaXQodm9pZCkKIHsKLQlpZiAoIXhlbl9oYXZlX3ZlY3Rvcl9jYWxsYmFjaykKLQkJcmV0dXJuOwogCXNtcF9vcHMuc21wX3ByZXBhcmVfY3B1cyA9IHhlbl9odm1fc21wX3ByZXBhcmVfY3B1czsKIAlzbXBfb3BzLnNtcF9zZW5kX3Jlc2NoZWR1bGUgPSB4ZW5fc21wX3NlbmRfcmVzY2hlZHVsZTsKLQlzbXBfb3BzLmNwdV91cCA9IHhlbl9odm1fY3B1X3VwOwogCXNtcF9vcHMuY3B1X2RpZSA9IHhlbl9jcHVfZGllOwogCXNtcF9vcHMuc2VuZF9jYWxsX2Z1bmNfaXBpID0geGVuX3NtcF9zZW5kX2NhbGxfZnVuY3Rpb25faXBpOwogCXNtcF9vcHMuc2VuZF9jYWxsX2Z1bmNfc2luZ2xlX2lwaSA9IHhlbl9zbXBfc2VuZF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9pcGk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vc21wLmggYi9hcmNoL3g4Ni94ZW4vc21wLmgKaW5kZXggOTYzZDYyYS4uYzVjMTZkYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL3NtcC5oCisrKyBiL2FyY2gveDg2L3hlbi9zbXAuaApAQCAtMSw1ICsxLDYgQEAKICNpZm5kZWYgX1hFTl9TTVBfSAogCisjaWZkZWYgQ09ORklHX1NNUAogZXh0ZXJuIHZvaWQgeGVuX3NlbmRfSVBJX21hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssCiAJCQkgICAgICBpbnQgdmVjdG9yKTsKIGV4dGVybiB2b2lkIHhlbl9zZW5kX0lQSV9tYXNrX2FsbGJ1dHNlbGYoY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssCkBAIC04LDYgKzksMTggQEAKIGV4dGVybiB2b2lkIHhlbl9zZW5kX0lQSV9hbGwoaW50IHZlY3Rvcik7CiBleHRlcm4gdm9pZCB4ZW5fc2VuZF9JUElfc2VsZihpbnQgdmVjdG9yKTsKIAorZXh0ZXJuIGludCB4ZW5fc21wX2ludHJfaW5pdCh1bnNpZ25lZCBpbnQgY3B1KTsKK2V4dGVybiB2b2lkIHhlbl9zbXBfaW50cl9mcmVlKHVuc2lnbmVkIGludCBjcHUpOworCisjZWxzZSAvKiBDT05GSUdfU01QICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHhlbl9zbXBfaW50cl9pbml0KHVuc2lnbmVkIGludCBjcHUpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgeGVuX3NtcF9pbnRyX2ZyZWUodW5zaWduZWQgaW50IGNwdSkge30KKyNlbmRpZiAvKiBDT05GSUdfU01QICovCisKICNpZmRlZiBDT05GSUdfWEVOX1BWSAogZXh0ZXJuIHZvaWQgeGVuX3B2aF9lYXJseV9jcHVfaW5pdChpbnQgY3B1LCBib29sIGVudHJ5KTsKICNlbHNlCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vc3BpbmxvY2suYyBiL2FyY2gveDg2L3hlbi9zcGlubG9jay5jCmluZGV4IGY0MmU3OGQuLjNkNmUwMDYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9zcGlubG9jay5jCisrKyBiL2FyY2gveDg2L3hlbi9zcGlubG9jay5jCkBAIC0yMSw4ICsyMSw2IEBACiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoY2hhciAqLCBpcnFfbmFtZSk7CiBzdGF0aWMgYm9vbCB4ZW5fcHZzcGluID0gdHJ1ZTsKIAotI2lmZGVmIENPTkZJR19RVUVVRURfU1BJTkxPQ0tTCi0KICNpbmNsdWRlIDxhc20vcXNwaW5sb2NrLmg+CiAKIHN0YXRpYyB2b2lkIHhlbl9xbG9ja19raWNrKGludCBjcHUpCkBAIC03MSwyMDcgKzY5LDYgQEAKIAl4ZW5fcG9sbF9pcnEoaXJxKTsKIH0KIAotI2Vsc2UgLyogQ09ORklHX1FVRVVFRF9TUElOTE9DS1MgKi8KLQotZW51bSB4ZW5fY29udGVudGlvbl9zdGF0IHsKLQlUQUtFTl9TTE9XLAotCVRBS0VOX1NMT1dfUElDS1VQLAotCVRBS0VOX1NMT1dfU1BVUklPVVMsCi0JUkVMRUFTRURfU0xPVywKLQlSRUxFQVNFRF9TTE9XX0tJQ0tFRCwKLQlOUl9DT05URU5USU9OX1NUQVRTCi19OwotCi0KLSNpZmRlZiBDT05GSUdfWEVOX0RFQlVHX0ZTCi0jZGVmaW5lIEhJU1RPX0JVQ0tFVFMJMzAKLXN0YXRpYyBzdHJ1Y3QgeGVuX3NwaW5sb2NrX3N0YXRzCi17Ci0JdTMyIGNvbnRlbnRpb25fc3RhdHNbTlJfQ09OVEVOVElPTl9TVEFUU107Ci0JdTMyIGhpc3RvX3NwaW5fYmxvY2tlZFtISVNUT19CVUNLRVRTKzFdOwotCXU2NCB0aW1lX2Jsb2NrZWQ7Ci19IHNwaW5sb2NrX3N0YXRzOwotCi1zdGF0aWMgdTggemVyb19zdGF0czsKLQotc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX3plcm8odm9pZCkKLXsKLQl1OCByZXQ7Ci0JdTggb2xkID0gUkVBRF9PTkNFKHplcm9fc3RhdHMpOwotCWlmICh1bmxpa2VseShvbGQpKSB7Ci0JCXJldCA9IGNtcHhjaGcoJnplcm9fc3RhdHMsIG9sZCwgMCk7Ci0JCS8qIFRoaXMgZW5zdXJlcyBvbmx5IG9uZSBmZWxsb3cgcmVzZXRzIHRoZSBzdGF0ICovCi0JCWlmIChyZXQgPT0gb2xkKQotCQkJbWVtc2V0KCZzcGlubG9ja19zdGF0cywgMCwgc2l6ZW9mKHNwaW5sb2NrX3N0YXRzKSk7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYWRkX3N0YXRzKGVudW0geGVuX2NvbnRlbnRpb25fc3RhdCB2YXIsIHUzMiB2YWwpCi17Ci0JY2hlY2tfemVybygpOwotCXNwaW5sb2NrX3N0YXRzLmNvbnRlbnRpb25fc3RhdHNbdmFyXSArPSB2YWw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTY0IHNwaW5fdGltZV9zdGFydCh2b2lkKQotewotCXJldHVybiB4ZW5fY2xvY2tzb3VyY2VfcmVhZCgpOwotfQotCi1zdGF0aWMgdm9pZCBfX3NwaW5fdGltZV9hY2N1bSh1NjQgZGVsdGEsIHUzMiAqYXJyYXkpCi17Ci0JdW5zaWduZWQgaW5kZXggPSBpbG9nMihkZWx0YSk7Ci0KLQljaGVja196ZXJvKCk7Ci0KLQlpZiAoaW5kZXggPCBISVNUT19CVUNLRVRTKQotCQlhcnJheVtpbmRleF0rKzsKLQllbHNlCi0JCWFycmF5W0hJU1RPX0JVQ0tFVFNdKys7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzcGluX3RpbWVfYWNjdW1fYmxvY2tlZCh1NjQgc3RhcnQpCi17Ci0JdTMyIGRlbHRhID0geGVuX2Nsb2Nrc291cmNlX3JlYWQoKSAtIHN0YXJ0OwotCi0JX19zcGluX3RpbWVfYWNjdW0oZGVsdGEsIHNwaW5sb2NrX3N0YXRzLmhpc3RvX3NwaW5fYmxvY2tlZCk7Ci0Jc3BpbmxvY2tfc3RhdHMudGltZV9ibG9ja2VkICs9IGRlbHRhOwotfQotI2Vsc2UgIC8qICFDT05GSUdfWEVOX0RFQlVHX0ZTICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYWRkX3N0YXRzKGVudW0geGVuX2NvbnRlbnRpb25fc3RhdCB2YXIsIHUzMiB2YWwpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTY0IHNwaW5fdGltZV9zdGFydCh2b2lkKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3Bpbl90aW1lX2FjY3VtX2Jsb2NrZWQodTY0IHN0YXJ0KQotewotfQotI2VuZGlmICAvKiBDT05GSUdfWEVOX0RFQlVHX0ZTICovCi0KLXN0cnVjdCB4ZW5fbG9ja193YWl0aW5nIHsKLQlzdHJ1Y3QgYXJjaF9zcGlubG9jayAqbG9jazsKLQlfX3RpY2tldF90IHdhbnQ7Ci19OwotCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHhlbl9sb2NrX3dhaXRpbmcsIGxvY2tfd2FpdGluZyk7Ci1zdGF0aWMgY3B1bWFza190IHdhaXRpbmdfY3B1czsKLQotX192aXNpYmxlIHZvaWQgeGVuX2xvY2tfc3Bpbm5pbmcoc3RydWN0IGFyY2hfc3BpbmxvY2sgKmxvY2ssIF9fdGlja2V0X3Qgd2FudCkKLXsKLQlpbnQgaXJxID0gX190aGlzX2NwdV9yZWFkKGxvY2tfa2lja2VyX2lycSk7Ci0Jc3RydWN0IHhlbl9sb2NrX3dhaXRpbmcgKncgPSB0aGlzX2NwdV9wdHIoJmxvY2tfd2FpdGluZyk7Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQl1NjQgc3RhcnQ7Ci0JX190aWNrZXRfdCBoZWFkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBJZiBraWNrZXIgaW50ZXJydXB0cyBub3QgaW5pdGlhbGl6ZWQgeWV0LCBqdXN0IHNwaW4gKi8KLQlpZiAoaXJxID09IC0xKQotCQlyZXR1cm47Ci0KLQlzdGFydCA9IHNwaW5fdGltZV9zdGFydCgpOwotCi0JLyoKLQkgKiBNYWtlIHN1cmUgYW4gaW50ZXJydXB0IGhhbmRsZXIgY2FuJ3QgdXBzZXQgdGhpbmdzIGluIGEKLQkgKiBwYXJ0aWFsbHkgc2V0dXAgc3RhdGUuCi0JICovCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCS8qCi0JICogV2UgZG9uJ3QgcmVhbGx5IGNhcmUgaWYgd2UncmUgb3ZlcndyaXRpbmcgc29tZSBvdGhlcgotCSAqIChsb2NrLHdhbnQpIHBhaXIsIGFzIHRoYXQgd291bGQgbWVhbiB0aGF0IHdlJ3JlIGN1cnJlbnRseQotCSAqIGluIGFuIGludGVycnVwdCBjb250ZXh0LCBhbmQgdGhlIG91dGVyIGNvbnRleHQgaGFkCi0JICogaW50ZXJydXB0cyBlbmFibGVkLiAgVGhhdCBoYXMgYWxyZWFkeSBraWNrZWQgdGhlIFZDUFUgb3V0Ci0JICogb2YgeGVuX3BvbGxfaXJxKCksIHNvIGl0IHdpbGwganVzdCByZXR1cm4gc3B1cmlvdXNseSBhbmQKLQkgKiByZXRyeSB3aXRoIG5ld2x5IHNldHVwIChsb2NrLHdhbnQpLgotCSAqCi0JICogVGhlIG9yZGVyaW5nIHByb3RvY29sIG9uIHRoaXMgaXMgdGhhdCB0aGUgImxvY2siIHBvaW50ZXIKLQkgKiBtYXkgb25seSBiZSBzZXQgbm9uLU5VTEwgaWYgdGhlICJ3YW50IiB0aWNrZXQgaXMgY29ycmVjdC4KLQkgKiBJZiB3ZSdyZSB1cGRhdGluZyAid2FudCIsIHdlIG11c3QgZmlyc3QgY2xlYXIgImxvY2siLgotCSAqLwotCXctPmxvY2sgPSBOVUxMOwotCXNtcF93bWIoKTsKLQl3LT53YW50ID0gd2FudDsKLQlzbXBfd21iKCk7Ci0Jdy0+bG9jayA9IGxvY2s7Ci0KLQkvKiBUaGlzIHVzZXMgc2V0X2JpdCwgd2hpY2ggYXRvbWljIGFuZCB0aGVyZWZvcmUgYSBiYXJyaWVyICovCi0JY3B1bWFza19zZXRfY3B1KGNwdSwgJndhaXRpbmdfY3B1cyk7Ci0JYWRkX3N0YXRzKFRBS0VOX1NMT1csIDEpOwotCi0JLyogY2xlYXIgcGVuZGluZyAqLwotCXhlbl9jbGVhcl9pcnFfcGVuZGluZyhpcnEpOwotCi0JLyogT25seSBjaGVjayBsb2NrIG9uY2UgcGVuZGluZyBjbGVhcmVkICovCi0JYmFycmllcigpOwotCi0JLyoKLQkgKiBNYXJrIGVudHJ5IHRvIHNsb3dwYXRoIGJlZm9yZSBkb2luZyB0aGUgcGlja3VwIHRlc3QgdG8gbWFrZQotCSAqIHN1cmUgd2UgZG9uJ3QgZGVhZGxvY2sgd2l0aCBhbiB1bmxvY2tlci4KLQkgKi8KLQlfX3RpY2tldF9lbnRlcl9zbG93cGF0aChsb2NrKTsKLQotCS8qIG1ha2Ugc3VyZSBlbnRlcl9zbG93cGF0aCwgd2hpY2ggaXMgYXRvbWljIGRvZXMgbm90IGNyb3NzIHRoZSByZWFkICovCi0Jc21wX21iX19hZnRlcl9hdG9taWMoKTsKLQotCS8qCi0JICogY2hlY2sgYWdhaW4gbWFrZSBzdXJlIGl0IGRpZG4ndCBiZWNvbWUgZnJlZSB3aGlsZQotCSAqIHdlIHdlcmVuJ3QgbG9va2luZwotCSAqLwotCWhlYWQgPSBSRUFEX09OQ0UobG9jay0+dGlja2V0cy5oZWFkKTsKLQlpZiAoX190aWNrZXRzX2VxdWFsKGhlYWQsIHdhbnQpKSB7Ci0JCWFkZF9zdGF0cyhUQUtFTl9TTE9XX1BJQ0tVUCwgMSk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIEFsbG93IGludGVycnVwdHMgd2hpbGUgYmxvY2tlZCAqLwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCS8qCi0JICogSWYgYW4gaW50ZXJydXB0IGhhcHBlbnMgaGVyZSwgaXQgd2lsbCBsZWF2ZSB0aGUgd2FrZXVwIGlycQotCSAqIHBlbmRpbmcsIHdoaWNoIHdpbGwgY2F1c2UgeGVuX3BvbGxfaXJxKCkgdG8gcmV0dXJuCi0JICogaW1tZWRpYXRlbHkuCi0JICovCi0KLQkvKiBCbG9jayB1bnRpbCBpcnEgYmVjb21lcyBwZW5kaW5nIChvciBwZXJoYXBzIGEgc3B1cmlvdXMgd2FrZXVwKSAqLwotCXhlbl9wb2xsX2lycShpcnEpOwotCWFkZF9zdGF0cyhUQUtFTl9TTE9XX1NQVVJJT1VTLCAheGVuX3Rlc3RfaXJxX3BlbmRpbmcoaXJxKSk7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQlrc3RhdF9pbmNyX2lycV90aGlzX2NwdShpcnEpOwotb3V0OgotCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgJndhaXRpbmdfY3B1cyk7Ci0Jdy0+bG9jayA9IE5VTEw7Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQlzcGluX3RpbWVfYWNjdW1fYmxvY2tlZChzdGFydCk7Ci19Ci1QVl9DQUxMRUVfU0FWRV9SRUdTX1RIVU5LKHhlbl9sb2NrX3NwaW5uaW5nKTsKLQotc3RhdGljIHZvaWQgeGVuX3VubG9ja19raWNrKHN0cnVjdCBhcmNoX3NwaW5sb2NrICpsb2NrLCBfX3RpY2tldF90IG5leHQpCi17Ci0JaW50IGNwdTsKLQotCWFkZF9zdGF0cyhSRUxFQVNFRF9TTE9XLCAxKTsKLQotCWZvcl9lYWNoX2NwdShjcHUsICZ3YWl0aW5nX2NwdXMpIHsKLQkJY29uc3Qgc3RydWN0IHhlbl9sb2NrX3dhaXRpbmcgKncgPSAmcGVyX2NwdShsb2NrX3dhaXRpbmcsIGNwdSk7Ci0KLQkJLyogTWFrZSBzdXJlIHdlIHJlYWQgbG9jayBiZWZvcmUgd2FudCAqLwotCQlpZiAoUkVBRF9PTkNFKHctPmxvY2spID09IGxvY2sgJiYKLQkJICAgIFJFQURfT05DRSh3LT53YW50KSA9PSBuZXh0KSB7Ci0JCQlhZGRfc3RhdHMoUkVMRUFTRURfU0xPV19LSUNLRUQsIDEpOwotCQkJeGVuX3NlbmRfSVBJX29uZShjcHUsIFhFTl9TUElOX1VOTE9DS19WRUNUT1IpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0jZW5kaWYgLyogQ09ORklHX1FVRVVFRF9TUElOTE9DS1MgKi8KLQogc3RhdGljIGlycXJldHVybl90IGR1bW15X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCUJVRygpOwpAQCAtMzM0LDE2ICsxMzEsMTIgQEAKIAkJcmV0dXJuOwogCX0KIAlwcmludGsoS0VSTl9ERUJVRyAieGVuOiBQViBzcGlubG9ja3MgZW5hYmxlZFxuIik7Ci0jaWZkZWYgQ09ORklHX1FVRVVFRF9TUElOTE9DS1MKKwogCV9fcHZfaW5pdF9sb2NrX2hhc2goKTsKIAlwdl9sb2NrX29wcy5xdWV1ZWRfc3Bpbl9sb2NrX3Nsb3dwYXRoID0gX19wdl9xdWV1ZWRfc3Bpbl9sb2NrX3Nsb3dwYXRoOwogCXB2X2xvY2tfb3BzLnF1ZXVlZF9zcGluX3VubG9jayA9IFBWX0NBTExFRV9TQVZFKF9fcHZfcXVldWVkX3NwaW5fdW5sb2NrKTsKIAlwdl9sb2NrX29wcy53YWl0ID0geGVuX3Fsb2NrX3dhaXQ7CiAJcHZfbG9ja19vcHMua2ljayA9IHhlbl9xbG9ja19raWNrOwotI2Vsc2UKLQlwdl9sb2NrX29wcy5sb2NrX3NwaW5uaW5nID0gUFZfQ0FMTEVFX1NBVkUoeGVuX2xvY2tfc3Bpbm5pbmcpOwotCXB2X2xvY2tfb3BzLnVubG9ja19raWNrID0geGVuX3VubG9ja19raWNrOwotI2VuZGlmCiB9CiAKIC8qCkBAIC0zNzIsNDQgKzE2NSwzIEBACiB9CiBlYXJseV9wYXJhbSgieGVuX25vcHZzcGluIiwgeGVuX3BhcnNlX25vcHZzcGluKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX1hFTl9ERUJVR19GUykgJiYgIWRlZmluZWQoQ09ORklHX1FVRVVFRF9TUElOTE9DS1MpCi0KLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkX3NwaW5fZGVidWc7Ci0KLXN0YXRpYyBpbnQgX19pbml0IHhlbl9zcGlubG9ja19kZWJ1Z2ZzKHZvaWQpCi17Ci0Jc3RydWN0IGRlbnRyeSAqZF94ZW4gPSB4ZW5faW5pdF9kZWJ1Z2ZzKCk7Ci0KLQlpZiAoZF94ZW4gPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAoIXhlbl9wdnNwaW4pCi0JCXJldHVybiAwOwotCi0JZF9zcGluX2RlYnVnID0gZGVidWdmc19jcmVhdGVfZGlyKCJzcGlubG9ja3MiLCBkX3hlbik7Ci0KLQlkZWJ1Z2ZzX2NyZWF0ZV91OCgiemVyb19zdGF0cyIsIDA2NDQsIGRfc3Bpbl9kZWJ1ZywgJnplcm9fc3RhdHMpOwotCi0JZGVidWdmc19jcmVhdGVfdTMyKCJ0YWtlbl9zbG93IiwgMDQ0NCwgZF9zcGluX2RlYnVnLAotCQkJICAgJnNwaW5sb2NrX3N0YXRzLmNvbnRlbnRpb25fc3RhdHNbVEFLRU5fU0xPV10pOwotCWRlYnVnZnNfY3JlYXRlX3UzMigidGFrZW5fc2xvd19waWNrdXAiLCAwNDQ0LCBkX3NwaW5fZGVidWcsCi0JCQkgICAmc3BpbmxvY2tfc3RhdHMuY29udGVudGlvbl9zdGF0c1tUQUtFTl9TTE9XX1BJQ0tVUF0pOwotCWRlYnVnZnNfY3JlYXRlX3UzMigidGFrZW5fc2xvd19zcHVyaW91cyIsIDA0NDQsIGRfc3Bpbl9kZWJ1ZywKLQkJCSAgICZzcGlubG9ja19zdGF0cy5jb250ZW50aW9uX3N0YXRzW1RBS0VOX1NMT1dfU1BVUklPVVNdKTsKLQotCWRlYnVnZnNfY3JlYXRlX3UzMigicmVsZWFzZWRfc2xvdyIsIDA0NDQsIGRfc3Bpbl9kZWJ1ZywKLQkJCSAgICZzcGlubG9ja19zdGF0cy5jb250ZW50aW9uX3N0YXRzW1JFTEVBU0VEX1NMT1ddKTsKLQlkZWJ1Z2ZzX2NyZWF0ZV91MzIoInJlbGVhc2VkX3Nsb3dfa2lja2VkIiwgMDQ0NCwgZF9zcGluX2RlYnVnLAotCQkJICAgJnNwaW5sb2NrX3N0YXRzLmNvbnRlbnRpb25fc3RhdHNbUkVMRUFTRURfU0xPV19LSUNLRURdKTsKLQotCWRlYnVnZnNfY3JlYXRlX3U2NCgidGltZV9ibG9ja2VkIiwgMDQ0NCwgZF9zcGluX2RlYnVnLAotCQkJICAgJnNwaW5sb2NrX3N0YXRzLnRpbWVfYmxvY2tlZCk7Ci0KLQlkZWJ1Z2ZzX2NyZWF0ZV91MzJfYXJyYXkoImhpc3RvX2Jsb2NrZWQiLCAwNDQ0LCBkX3NwaW5fZGVidWcsCi0JCQkJc3BpbmxvY2tfc3RhdHMuaGlzdG9fc3Bpbl9ibG9ja2VkLCBISVNUT19CVUNLRVRTICsgMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLWZzX2luaXRjYWxsKHhlbl9zcGlubG9ja19kZWJ1Z2ZzKTsKLQotI2VuZGlmCS8qIENPTkZJR19YRU5fREVCVUdfRlMgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi90aW1lLmMgYi9hcmNoL3g4Ni94ZW4vdGltZS5jCmluZGV4IDY3MzU2ZDIuLjMzZDhmNmEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi90aW1lLmMKKysrIGIvYXJjaC94ODYveGVuL3RpbWUuYwpAQCAtNDMyLDExICs0MzIsNiBAQAogCiB2b2lkIF9faW5pdCB4ZW5faHZtX2luaXRfdGltZV9vcHModm9pZCkKIHsKLQkvKiB2ZWN0b3IgY2FsbGJhY2sgaXMgbmVlZGVkIG90aGVyd2lzZSB3ZSBjYW5ub3QgcmVjZWl2ZSBpbnRlcnJ1cHRzCi0JICogb24gY3B1ID4gMCBhbmQgYXQgdGhpcyBwb2ludCB3ZSBkb24ndCBrbm93IGhvdyBtYW55IGNwdXMgYXJlCi0JICogYXZhaWxhYmxlICovCi0JaWYgKCF4ZW5faGF2ZV92ZWN0b3JfY2FsbGJhY2spCi0JCXJldHVybjsKIAlpZiAoIXhlbl9mZWF0dXJlKFhFTkZFQVRfaHZtX3NhZmVfcHZjbG9jaykpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiWGVuIGRvZXNuJ3Qgc3VwcG9ydCBwdmNsb2NrIG9uIEhWTSwiCiAJCQkJImRpc2FibGUgcHYgdGltZXJcbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvS2NvbmZpZyBiL2FyY2gveHRlbnNhL0tjb25maWcKaW5kZXggNjQzMzZmNi4uZjYxMDU4NiAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvS2NvbmZpZworKysgYi9hcmNoL3h0ZW5zYS9LY29uZmlnCkBAIC0xMywxNiArMTMsMTkgQEAKIAlzZWxlY3QgR0VORVJJQ19JUlFfU0hPVwogCXNlbGVjdCBHRU5FUklDX1BDSV9JT01BUAogCXNlbGVjdCBHRU5FUklDX1NDSEVEX0NMT0NLCisJc2VsZWN0IEhBVkVfREVCVUdfS01FTUxFQUsKIAlzZWxlY3QgSEFWRV9ETUFfQVBJX0RFQlVHCiAJc2VsZWN0IEhBVkVfRVhJVF9USFJFQUQKIAlzZWxlY3QgSEFWRV9GVU5DVElPTl9UUkFDRVIKIAlzZWxlY3QgSEFWRV9GVVRFWF9DTVBYQ0hHIGlmICFNTVUKIAlzZWxlY3QgSEFWRV9IV19CUkVBS1BPSU5UIGlmIFBFUkZfRVZFTlRTCiAJc2VsZWN0IEhBVkVfSVJRX1RJTUVfQUNDT1VOVElORworCXNlbGVjdCBIQVZFX01FTUJMT0NLCiAJc2VsZWN0IEhBVkVfT1BST0ZJTEUKIAlzZWxlY3QgSEFWRV9QRVJGX0VWRU5UUwogCXNlbGVjdCBJUlFfRE9NQUlOCiAJc2VsZWN0IE1PRFVMRVNfVVNFX0VMRl9SRUxBCisJc2VsZWN0IE5PX0JPT1RNRU0KIAlzZWxlY3QgUEVSRl9VU0VfVk1BTExPQwogCXNlbGVjdCBWSVJUX1RPX0JVUwogCWhlbHAKQEAgLTIwOSw3ICsyMTIsOCBAQAogCiBjb25maWcgSU5JVElBTElaRV9YVEVOU0FfTU1VX0lOU0lERV9WTUxJTlVYCiAJYm9vbCAiSW5pdGlhbGl6ZSBYdGVuc2EgTU1VIGluc2lkZSB0aGUgTGludXgga2VybmVsIGNvZGUiCi0JZGVmYXVsdCB5CisJZGVwZW5kcyBvbiAhWFRFTlNBX1ZBUklBTlRfRlNGICYmICFYVEVOU0FfVkFSSUFOVF9EQzIzMkIKKwlkZWZhdWx0IHkgaWYgWFRFTlNBX1ZBUklBTlRfREMyMzNDIHx8IFhURU5TQV9WQVJJQU5UX0NVU1RPTQogCWhlbHAKIAkgIEVhcmxpZXIgdmVyc2lvbiBpbml0aWFsaXplZCB0aGUgTU1VIGluIHRoZSBleGNlcHRpb24gdmVjdG9yCiAJICBiZWZvcmUganVtcGluZyB0byBfc3RhcnR1cCBpbiBoZWFkLlMgYW5kIGhhZCBhbiBhZHZhbnRhZ2UgdGhhdApAQCAtMjM2LDYgKzI0MCw3MSBAQAogCiAJICBJZiBpbiBkb3VidCwgc2F5IFkuCiAKK2NvbmZpZyBLU0VHX1BBRERSCisJaGV4ICJQaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBLU0VHIG1hcHBpbmciCisJZGVwZW5kcyBvbiBJTklUSUFMSVpFX1hURU5TQV9NTVVfSU5TSURFX1ZNTElOVVggJiYgTU1VCisJZGVmYXVsdCAweDAwMDAwMDAwCisJaGVscAorCSAgVGhpcyBpcyB0aGUgcGh5c2ljYWwgYWRkcmVzcyB3aGVyZSBLU0VHIGlzIG1hcHBlZC4gUGxlYXNlIHJlZmVyIHRvCisJICB0aGUgY2hvc2VuIEtTRUcgbGF5b3V0IGhlbHAgZm9yIHRoZSByZXF1aXJlZCBhZGRyZXNzIGFsaWdubWVudC4KKwkgIFVucGFja2VkIGtlcm5lbCBpbWFnZSAoaW5jbHVkaW5nIHZlY3RvcnMpIG11c3QgYmUgbG9jYXRlZCBjb21wbGV0ZWx5CisJICB3aXRoaW4gS1NFRy4KKwkgIFBoeXNpY2FsIG1lbW9yeSBiZWxvdyB0aGlzIGFkZHJlc3MgaXMgbm90IGF2YWlsYWJsZSB0byBsaW51eC4KKworCSAgSWYgdW5zdXJlLCBsZWF2ZSB0aGUgZGVmYXVsdCB2YWx1ZSBoZXJlLgorCitjb25maWcgS0VSTkVMX0xPQURfQUREUkVTUworCWhleCAiS2VybmVsIGxvYWQgYWRkcmVzcyIKKwlkZWZhdWx0IDB4NjAwMDMwMDAgaWYgIU1NVQorCWRlZmF1bHQgMHgwMDAwMzAwMCBpZiBNTVUgJiYgSU5JVElBTElaRV9YVEVOU0FfTU1VX0lOU0lERV9WTUxJTlVYCisJZGVmYXVsdCAweGQwMDAzMDAwIGlmIE1NVSAmJiAhSU5JVElBTElaRV9YVEVOU0FfTU1VX0lOU0lERV9WTUxJTlVYCisJaGVscAorCSAgVGhpcyBpcyB0aGUgYWRkcmVzcyB3aGVyZSB0aGUga2VybmVsIGlzIGxvYWRlZC4KKwkgIEl0IGlzIHZpcnR1YWwgYWRkcmVzcyBmb3IgTU1VdjIgY29uZmlndXJhdGlvbnMgYW5kIHBoeXNpY2FsIGFkZHJlc3MKKwkgIGZvciBhbGwgb3RoZXIgY29uZmlndXJhdGlvbnMuCisKKwkgIElmIHVuc3VyZSwgbGVhdmUgdGhlIGRlZmF1bHQgdmFsdWUgaGVyZS4KKworY29uZmlnIFZFQ1RPUlNfT0ZGU0VUCisJaGV4ICJLZXJuZWwgdmVjdG9ycyBvZmZzZXQiCisJZGVmYXVsdCAweDAwMDAzMDAwCisJaGVscAorCSAgVGhpcyBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBrZXJuZWwgaW1hZ2UgZnJvbSB0aGUgcmVsb2NhdGFibGUgdmVjdG9ycworCSAgYmFzZS4KKworCSAgSWYgdW5zdXJlLCBsZWF2ZSB0aGUgZGVmYXVsdCB2YWx1ZSBoZXJlLgorCitjaG9pY2UKKwlwcm9tcHQgIktTRUcgbGF5b3V0IgorCWRlcGVuZHMgb24gTU1VCisJZGVmYXVsdCBYVEVOU0FfS1NFR19NTVVfVjIKKworY29uZmlnIFhURU5TQV9LU0VHX01NVV9WMgorCWJvb2wgIk1NVXYyOiAxMjhNQiBjYWNoZWQgKyAxMjhNQiB1bmNhY2hlZCIKKwloZWxwCisJICBNTVV2MiBjb21wYXRpYmxlIGtlcm5lbCBtZW1vcnkgbWFwOiBUTEIgd2F5IDUgbWFwcyAxMjhNQiBzdGFydGluZworCSAgYXQgS1NFR19QQUREUiB0byAweGQwMDAwMDAwIHdpdGggY2FjaGUgYW5kIHRvIDB4ZDgwMDAwMDAKKwkgIHdpdGhvdXQgY2FjaGUuCisJICBLU0VHX1BBRERSIG11c3QgYmUgYWxpZ25lZCB0byAxMjhNQi4KKworY29uZmlnIFhURU5TQV9LU0VHXzI1Nk0KKwlib29sICIyNTZNQiBjYWNoZWQgKyAyNTZNQiB1bmNhY2hlZCIKKwlkZXBlbmRzIG9uIElOSVRJQUxJWkVfWFRFTlNBX01NVV9JTlNJREVfVk1MSU5VWAorCWhlbHAKKwkgIFRMQiB3YXkgNiBtYXBzIDI1Nk1CIHN0YXJ0aW5nIGF0IEtTRUdfUEFERFIgdG8gMHhiMDAwMDAwMAorCSAgd2l0aCBjYWNoZSBhbmQgdG8gMHhjMDAwMDAwMCB3aXRob3V0IGNhY2hlLgorCSAgS1NFR19QQUREUiBtdXN0IGJlIGFsaWduZWQgdG8gMjU2TUIuCisKK2NvbmZpZyBYVEVOU0FfS1NFR181MTJNCisJYm9vbCAiNTEyTUIgY2FjaGVkICsgNTEyTUIgdW5jYWNoZWQiCisJZGVwZW5kcyBvbiBJTklUSUFMSVpFX1hURU5TQV9NTVVfSU5TSURFX1ZNTElOVVgKKwloZWxwCisJICBUTEIgd2F5IDYgbWFwcyA1MTJNQiBzdGFydGluZyBhdCBLU0VHX1BBRERSIHRvIDB4YTAwMDAwMDAKKwkgIHdpdGggY2FjaGUgYW5kIHRvIDB4YzAwMDAwMDAgd2l0aG91dCBjYWNoZS4KKwkgIEtTRUdfUEFERFIgbXVzdCBiZSBhbGlnbmVkIHRvIDI1Nk1CLgorCitlbmRjaG9pY2UKKwogY29uZmlnIEhJR0hNRU0KIAlib29sICJIaWdoIE1lbW9yeSBTdXBwb3J0IgogCWRlcGVuZHMgb24gTU1VCkBAIC0zMzEsNyArNDAwLDcgQEAKIGNvbmZpZyBYVEVOU0FfUExBVEZPUk1fWFRGUEdBCiAJYm9vbCAiWFRGUEdBIgogCXNlbGVjdCBFVEhPQyBpZiBFVEhFUk5FVAotCXNlbGVjdCBQTEFURk9STV9XQU5UX0RFRkFVTFRfTUVNCisJc2VsZWN0IFBMQVRGT1JNX1dBTlRfREVGQVVMVF9NRU0gaWYgIU1NVQogCXNlbGVjdCBTRVJJQUxfQ09OU09MRQogCXNlbGVjdCBYVEVOU0FfQ0FMSUJSQVRFX0NDT1VOVAogCWhlbHAKQEAgLTM2OSw2ICs0MzgsNyBAQAogCWJvb2wgIkZsYXR0ZW5lZCBEZXZpY2UgVHJlZSBzdXBwb3J0IgogCXNlbGVjdCBPRgogCXNlbGVjdCBPRl9FQVJMWV9GTEFUVFJFRQorCXNlbGVjdCBPRl9SRVNFUlZFRF9NRU0KIAloZWxwCiAJICBJbmNsdWRlIHN1cHBvcnQgZm9yIGZsYXR0ZW5lZCBkZXZpY2UgdHJlZSBtYWNoaW5lIGRlc2NyaXB0aW9ucy4KIApAQCAtNDM5LDE2ICs1MDksOSBAQAogCWRlZmF1bHQgMHgwMDAwMDAwMCBpZiBNTVUKIAlkZWZhdWx0IDB4NjAwMDAwMDAgaWYgIU1NVQogCWhlbHAKLQkgIFRoaXMgaXMgYSBmYWxsYmFjayBzdGFydCBhZGRyZXNzIG9mIHRoZSBkZWZhdWx0IG1lbW9yeSBhcmVhLCBpdCBpcwotCSAgdXNlZCB3aGVuIG5vIHBoeXNpY2FsIG1lbW9yeSBzaXplIGlzIHBhc3NlZCB0aHJvdWdoIERUQiBvciB0aHJvdWdoCi0JICBib290IHBhcmFtZXRlciBmcm9tIGJvb3Rsb2FkZXIuCi0KLQkgIEluIG5vTU1VIGNvbmZpZ3VyYXRpb24gdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSBkZXJpdmVkIGZyb20gaXQ6Ci0JICAtIGtlcm5lbCBsb2FkIGFkZHJlc3M7Ci0JICAtIGtlcm5lbCBlbnRyeSBwb2ludCBhZGRyZXNzOwotCSAgLSByZWxvY2F0YWJsZSB2ZWN0b3JzIGJhc2UgYWRkcmVzczsKLQkgIC0gdUJvb3QgbG9hZCBhZGRyZXNzOwotCSAgLSBUQVNLX1NJWkUuCisJICBUaGlzIGlzIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGRlZmF1bHQgbWVtb3J5IGFyZWEuCisJICBEZWZhdWx0IG1lbW9yeSBhcmVhIGhhcyBwbGF0Zm9ybS1zcGVjaWZpYyBtZWFuaW5nLCBpdCBtYXkgYmUgdXNlZAorCSAgZm9yIGUuZy4gZWFybHkgY2FjaGUgaW5pdGlhbGl6YXRpb24uCiAKIAkgIElmIHVuc3VyZSwgbGVhdmUgdGhlIGRlZmF1bHQgdmFsdWUgaGVyZS4KIApAQCAtNDU3LDExICs1MjAsOSBAQAogCWRlcGVuZHMgb24gUExBVEZPUk1fV0FOVF9ERUZBVUxUX01FTQogCWRlZmF1bHQgMHgwNDAwMDAwMAogCWhlbHAKLQkgIFRoaXMgaXMgYSBmYWxsYmFjayBzaXplIG9mIHRoZSBkZWZhdWx0IG1lbW9yeSBhcmVhLCBpdCBpcyB1c2VkIHdoZW4KLQkgIG5vIHBoeXNpY2FsIG1lbW9yeSBzaXplIGlzIHBhc3NlZCB0aHJvdWdoIERUQiBvciB0aHJvdWdoIGJvb3QKLQkgIHBhcmFtZXRlciBmcm9tIGJvb3Rsb2FkZXIuCi0KLQkgIEl0J3MgYWxzbyB1c2VkIGZvciBUQVNLX1NJWkUgY2FsY3VsYXRpb24gaW4gbm9NTVUgY29uZmlndXJhdGlvbi4KKwkgIFRoaXMgaXMgdGhlIHNpemUgb2YgdGhlIGRlZmF1bHQgbWVtb3J5IGFyZWEuCisJICBEZWZhdWx0IG1lbW9yeSBhcmVhIGhhcyBwbGF0Zm9ybS1zcGVjaWZpYyBtZWFuaW5nLCBpdCBtYXkgYmUgdXNlZAorCSAgZm9yIGUuZy4gZWFybHkgY2FjaGUgaW5pdGlhbGl6YXRpb24uCiAKIAkgIElmIHVuc3VyZSwgbGVhdmUgdGhlIGRlZmF1bHQgdmFsdWUgaGVyZS4KIApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvYm9vdC9ib290LWVsZi9ib290Lmxkcy5TIGIvYXJjaC94dGVuc2EvYm9vdC9ib290LWVsZi9ib290Lmxkcy5TCmluZGV4IGU1NGYyYzkuLmEzMDk5MzAgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2Jvb3QvYm9vdC1lbGYvYm9vdC5sZHMuUworKysgYi9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtZWxmL2Jvb3QubGRzLlMKQEAgLTIzLDcgKzIzLDcgQEAKIAkJKiguUmVzZXRWZWN0b3IudGV4dCkKIAl9CiAKLQkuaW1hZ2UgS0VSTkVMT0ZGU0VUOiBBVCAoTE9BRF9NRU1PUllfQUREUkVTUykKKwkuaW1hZ2UgS0VSTkVMT0ZGU0VUOiBBVCAoQ09ORklHX0tFUk5FTF9MT0FEX0FERFJFU1MpCiAJewogCQlfaW1hZ2Vfc3RhcnQgPSAuOwogCQkqKGltYWdlKQpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvYm9vdC9ib290LWVsZi9ib290c3RyYXAuUyBiL2FyY2gveHRlbnNhL2Jvb3QvYm9vdC1lbGYvYm9vdHN0cmFwLlMKaW5kZXggZTZiZjMxMy4uYjZhYTg1MyAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvYm9vdC9ib290LWVsZi9ib290c3RyYXAuUworKysgYi9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtZWxmL2Jvb3RzdHJhcC5TCkBAIC0zNSw3ICszNSwxMiBAQAogCiAJLmFsaWduIDQKIFJvbUluaXRBZGRyOgotCS53b3JkCUxPQURfTUVNT1JZX0FERFJFU1MKKyNpZiBkZWZpbmVkKENPTkZJR19JTklUSUFMSVpFX1hURU5TQV9NTVVfSU5TSURFX1ZNTElOVVgpICYmIFwKKwlYQ0hBTF9IQVZFX1BUUF9NTVUgJiYgWENIQUxfSEFWRV9TUEFOTklOR19XQVkKKwkud29yZAlDT05GSUdfS0VSTkVMX0xPQURfQUREUkVTUworI2Vsc2UKKwkud29yZAlLRVJORUxPRkZTRVQKKyNlbmRpZgogUm9tQm9vdFBhcmFtOgogCS53b3JkIF9ib290cGFyYW0KIF9ib290cGFyYW06CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtdWJvb3QvTWFrZWZpbGUgYi9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtdWJvb3QvTWFrZWZpbGUKaW5kZXggNDAzZmNmMi4uMGY0YzQxNyAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvYm9vdC9ib290LXVib290L01ha2VmaWxlCisrKyBiL2FyY2gveHRlbnNhL2Jvb3QvYm9vdC11Ym9vdC9NYWtlZmlsZQpAQCAtNCwxNSArNCw3IEBACiAjIGZvciBtb3JlIGRldGFpbHMuCiAjCiAKLWlmZGVmIENPTkZJR19NTVUKLWlmZGVmIENPTkZJR19JTklUSUFMSVpFX1hURU5TQV9NTVVfSU5TSURFX1ZNTElOVVgKLVVJTUFHRV9MT0FEQUREUiA9IDB4MDAwMDMwMDAKLWVsc2UKLVVJTUFHRV9MT0FEQUREUiA9IDB4ZDAwMDMwMDAKLWVuZGlmCi1lbHNlCi1VSU1BR0VfTE9BREFERFIgPSAkKHNoZWxsIHByaW50ZiAiMHgleCIgJCQoKCAke0NPTkZJR19ERUZBVUxUX01FTV9TVEFSVH0gKyAweDMwMDAgKSkgKQotZW5kaWYKK1VJTUFHRV9MT0FEQUREUiA9ICQoQ09ORklHX0tFUk5FTF9MT0FEX0FERFJFU1MpCiBVSU1BR0VfQ09NUFJFU1NJT04gPSBnemlwCiAKICQob2JqKS8uLi91SW1hZ2U6IHZtbGludXguYmluLmd6IEZPUkNFCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9ib290L2R0cy9jc3AuZHRzIGIvYXJjaC94dGVuc2EvYm9vdC9kdHMvY3NwLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDgyZjI2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvYm9vdC9kdHMvY3NwLmR0cwpAQCAtMCwwICsxLDU0IEBACisvZHRzLXYxLzsKKworLyB7CisJY29tcGF0aWJsZSA9ICJjZG5zLHh0ZW5zYS14dGZwZ2EiOworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCWludGVycnVwdC1wYXJlbnQgPSA8JnBpYz47CisKKwljaG9zZW4geworCQlib290YXJncyA9ICJlYXJseWNvbj1jZG5zLDB4ZmQwMDAwMDAsMTE1MjAwIGNvbnNvbGU9dHR5MCBjb25zb2xlPXR0eVBTMCwxMTUyMDAgcm9vdD0vZGV2L3JhbTAgcncgZWFybHlwcmludGsgeGlsaW54X3VhcnRwcy5yeF90cmlnZ2VyX2xldmVsPTMyIGxvZ2xldmVsPTggbm9oej1vZmYgaWdub3JlX2xvZ2xldmVsIjsKKwl9OworCisJbWVtb3J5QDAgeworCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOworCQlyZWcgPSA8MHgwMDAwMDAwMCAweDQwMDAwMDAwPjsKKwl9OworCisJY3B1cyB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJY3B1QDAgeworCQkJY29tcGF0aWJsZSA9ICJjZG5zLHh0ZW5zYS1jcHUiOworCQkJcmVnID0gPDA+OworCQl9OworCX07CisKKwlwaWM6IHBpYyB7CisJCWNvbXBhdGlibGUgPSAiY2Rucyx4dGVuc2EtcGljIjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJfTsKKworCWNsb2NrcyB7CisJCW9zYzogbWFpbi1vc2NpbGxhdG9yIHsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZml4ZWQtY2xvY2siOworCQl9OworCX07CisKKwlzb2MgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisJCXJhbmdlcyA9IDwweDAwMDAwMDAwIDB4ZjAwMDAwMDAgMHgxMDAwMDAwMD47CisKKwkJdWFydDA6IHNlcmlhbEAwZDAwMDAwMCB7CisJCQljb21wYXRpYmxlID0gInhsbngseHVhcnRwcyIsICJjZG5zLHVhcnQtcjFwOCI7CisJCQljbG9ja3MgPSA8Jm9zYz4sIDwmb3NjPjsKKwkJCWNsb2NrLW5hbWVzID0gInVhcnRfY2xrIiwgInBjbGsiOworCQkJcmVnID0gPDB4MGQwMDAwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MCAxPjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2Jvb3QvZHRzL3h0ZnBnYS5kdHNpIGIvYXJjaC94dGVuc2EvYm9vdC9kdHMveHRmcGdhLmR0c2kKaW5kZXggY2Q0NWY5Yy4uOTE2MTZhOSAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvYm9vdC9kdHMveHRmcGdhLmR0c2kKKysrIGIvYXJjaC94dGVuc2EvYm9vdC9kdHMveHRmcGdhLmR0c2kKQEAgLTE5LDkgKzE5LDcgQEAKIAkJY3B1QDAgewogCQkJY29tcGF0aWJsZSA9ICJjZG5zLHh0ZW5zYS1jcHUiOwogCQkJcmVnID0gPDA+OwotCQkJLyogRmlsbGVkIGluIGJ5IHBsYXRmb3JtX3NldHVwIGZyb20gRlBHQSByZWdpc3RlcgotCQkJICogY2xvY2stZnJlcXVlbmN5ID0gPDEwMDAwMDAwMD47Ci0JCQkgKi8KKwkJCWNsb2NrcyA9IDwmb3NjPjsKIAkJfTsKIAl9OwogCkBAIC0zNiwxMSArMzQsNiBAQAogCX07CiAKIAljbG9ja3MgewotCQlvc2M6IG1haW4tb3NjaWxsYXRvciB7Ci0JCQkjY2xvY2stY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZpeGVkLWNsb2NrIjsKLQkJfTsKLQogCQljbGs1NDogY2xrNTQgewogCQkJI2Nsb2NrLWNlbGxzID0gPDA+OwogCQkJY29tcGF0aWJsZSA9ICJmaXhlZC1jbG9jayI7CkBAIC01NCw2ICs0NywxMiBAQAogCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOwogCQlyYW5nZXMgPSA8MHgwMDAwMDAwMCAweGYwMDAwMDAwIDB4MTAwMDAwMDA+OwogCisJCW9zYzogbWFpbi1vc2NpbGxhdG9yIHsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiY2Rucyx4dGZwZ2EtY2xvY2siOworCQkJcmVnID0gPDB4MGQwMjAwMDQgMHg0PjsKKwkJfTsKKwogCQlzZXJpYWwwOiBzZXJpYWxAMGQwNTAwMjAgewogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKIAkJCWNvbXBhdGlibGUgPSAibnMxNjU1MGEiOwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvY29uZmlncy9hdWRpb19rYzcwNV9kZWZjb25maWcgYi9hcmNoL3h0ZW5zYS9jb25maWdzL2F1ZGlvX2tjNzA1X2RlZmNvbmZpZwppbmRleCBjNDkwNGRiLi44ZDE2OTI1IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9jb25maWdzL2F1ZGlvX2tjNzA1X2RlZmNvbmZpZworKysgYi9hcmNoL3h0ZW5zYS9jb25maWdzL2F1ZGlvX2tjNzA1X2RlZmNvbmZpZwpAQCAtMzMsNyArMzMsNyBAQAogIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKIENPTkZJR19YVEVOU0FfUExBVEZPUk1fWFRGUEdBPXkKIENPTkZJR19DTURMSU5FX0JPT0w9eQotQ09ORklHX0NNRExJTkU9ImVhcmx5Y29uPXVhcnQ4MjUwLG1taW8zMiwweGZkMDUwMDIwLDExNTIwMG44IGNvbnNvbGU9dHR5UzAsMTE1MjAwbjggaXA9ZGhjcCByb290PS9kZXYvbmZzIHJ3IGRlYnVnIgorQ09ORklHX0NNRExJTkU9ImVhcmx5Y29uPXVhcnQ4MjUwLG1taW8zMm5hdGl2ZSwweGZkMDUwMDIwLDExNTIwMG44IGNvbnNvbGU9dHR5UzAsMTE1MjAwbjggaXA9ZGhjcCByb290PS9kZXYvbmZzIHJ3IGRlYnVnIG1lbW1hcD0weDM4MDAwMDAwQDAiCiBDT05GSUdfVVNFX09GPXkKIENPTkZJR19CVUlMVElOX0RUQj0ia2M3MDUiCiAjIENPTkZJR19DT01QQUNUSU9OIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2NvbmZpZ3MvY2FkZW5jZV9jc3BfZGVmY29uZmlnIGIvYXJjaC94dGVuc2EvY29uZmlncy9jYWRlbmNlX2NzcF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJkMzA5NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2NvbmZpZ3MvY2FkZW5jZV9jc3BfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTIyIEBACitDT05GSUdfU1lTVklQQz15CitDT05GSUdfUE9TSVhfTVFVRVVFPXkKK0NPTkZJR19VU0VMSUI9eQorQ09ORklHX0lSUV9ET01BSU5fREVCVUc9eQorQ09ORklHX05PX0haX0lETEU9eQorQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CitDT05GSUdfSVJRX1RJTUVfQUNDT1VOVElORz15CitDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CitDT05GSUdfQ0dST1VQX0ZSRUVaRVI9eQorQ09ORklHX0NQVVNFVFM9eQorQ09ORklHX0NHUk9VUF9ERVZJQ0U9eQorQ09ORklHX0NHUk9VUF9DUFVBQ0NUPXkKK0NPTkZJR19DR1JPVVBfREVCVUc9eQorQ09ORklHX05BTUVTUEFDRVM9eQorQ09ORklHX1NDSEVEX0FVVE9HUk9VUD15CitDT05GSUdfUkVMQVk9eQorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIkJEtFUk5FTF9JTklUUkFNRlNfU09VUkNFIgorIyBDT05GSUdfUkRfQlpJUDIgaXMgbm90IHNldAorIyBDT05GSUdfUkRfTFpNQSBpcyBub3Qgc2V0CisjIENPTkZJR19SRF9YWiBpcyBub3Qgc2V0CisjIENPTkZJR19SRF9MWk8gaXMgbm90IHNldAorIyBDT05GSUdfUkRfTFo0IGlzIG5vdCBzZXQKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19QUk9GSUxJTkc9eQorQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKK0NPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorQ09ORklHX1hURU5TQV9WQVJJQU5UX0NVU1RPTT15CitDT05GSUdfWFRFTlNBX1ZBUklBTlRfQ1VTVE9NX05BTUU9ImNzcCIKK0NPTkZJR19YVEVOU0FfVU5BTElHTkVEX1VTRVI9eQorQ09ORklHX1BSRUVNUFQ9eQorQ09ORklHX0hJR0hNRU09eQorIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKK0NPTkZJR19YVEVOU0FfUExBVEZPUk1fWFRGUEdBPXkKK0NPTkZJR19VU0VfT0Y9eQorQ09ORklHX0JVSUxUSU5fRFRCPSJjc3AiCisjIENPTkZJR19DT01QQUNUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19YVEZQR0FfTENEPXkKKyMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKK0NPTkZJR19ORVQ9eQorQ09ORklHX1BBQ0tFVD15CitDT05GSUdfVU5JWD15CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorQ09ORklHX0lQX1BOUF9SQVJQPXkKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0RJQUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19XSVJFTEVTUyBpcyBub3Qgc2V0CitDT05GSUdfREVWVE1QRlM9eQorQ09ORklHX0RFVlRNUEZTX01PVU5UPXkKKyMgQ09ORklHX1NUQU5EQUxPTkUgaXMgbm90IHNldAorIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKK0NPTkZJR19NVEQ9eQorQ09ORklHX01URF9DRkk9eQorQ09ORklHX01URF9KRURFQ1BST0JFPXkKK0NPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKK0NPTkZJR19NVERfQ0ZJX0FNRFNURD15CitDT05GSUdfTVREX0NGSV9TVEFBPXkKK0NPTkZJR19NVERfUEhZU01BUF9PRj15CitDT05GSUdfTVREX1VCST15CitDT05GSUdfQkxLX0RFVl9MT09QPXkKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfU0NTST15CitDT05GSUdfQkxLX0RFVl9TRD15CisjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0xNgorQ09ORklHX1NFUklBTF9YSUxJTlhfUFNfVUFSVD15CitDT05GSUdfU0VSSUFMX1hJTElOWF9QU19VQVJUX0NPTlNPTEU9eQorQ09ORklHX0hXX1JBTkRPTT15CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CitDT05GSUdfV0FUQ0hET0c9eQorQ09ORklHX1dBVENIRE9HX05PV0FZT1VUPXkKK0NPTkZJR19TT0ZUX1dBVENIRE9HPXkKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPTU1VX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0ZBTk9USUZZPXkKK0NPTkZJR19WRkFUX0ZTPXkKK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19UTVBGUz15CitDT05GSUdfVE1QRlNfUE9TSVhfQUNMPXkKKyMgQ09ORklHX01JU0NfRklMRVNZU1RFTVMgaXMgbm90IHNldAorQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1Y0PXkKK0NPTkZJR19ORlNfU1dBUD15CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX1NVTlJQQ19ERUJVRz15CitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz15CitDT05GSUdfTkxTX0lTTzg4NTlfMT15CitDT05GSUdfUFJJTlRLX1RJTUU9eQorQ09ORklHX0RZTkFNSUNfREVCVUc9eQorQ09ORklHX0RFQlVHX0lORk89eQorQ09ORklHX01BR0lDX1NZU1JRPXkKK0NPTkZJR19MT0NLVVBfREVURUNUT1I9eQorIyBDT05GSUdfU0NIRURfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1NDSEVEU1RBVFM9eQorQ09ORklHX1RJTUVSX1NUQVRTPXkKK0NPTkZJR19ERUJVR19SVF9NVVRFWEVTPXkKK0NPTkZJR19QUk9WRV9MT0NLSU5HPXkKK0NPTkZJR19ERUJVR19BVE9NSUNfU0xFRVA9eQorQ09ORklHX1JDVV9UUkFDRT15CitDT05GSUdfRlVOQ1RJT05fVFJBQ0VSPXkKKyMgQ09ORklHX1MzMkMxSV9TRUxGVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fRUNIQUlOSVYgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19ERUZMQVRFPXkKK0NPTkZJR19DUllQVE9fTFpPPXkKKyMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9jb25maWdzL2NvbW1vbl9kZWZjb25maWcgYi9hcmNoL3h0ZW5zYS9jb25maWdzL2NvbW1vbl9kZWZjb25maWcKaW5kZXggNzIxZGYxMi4uNGJjYzc2YiAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvY29uZmlncy9jb21tb25fZGVmY29uZmlnCisrKyBiL2FyY2gveHRlbnNhL2NvbmZpZ3MvY29tbW9uX2RlZmNvbmZpZwpAQCAtMSwyMDQgKzEsMTUgQEAKLSMKLSMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMS1yYzIKLSMgVHVlIE1hciAgMSAxNjozNjo1MyAyMDA1Ci0jCi0jIENPTkZJR19GUkFNRV9QT0lOVEVSIGlzIG5vdCBzZXQKLUNPTkZJR19YVEVOU0E9eQotIyBDT05GSUdfVUlEMTYgaXMgbm90IHNldAotQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKLUNPTkZJR19IQVZFX0RFQ19MT0NLPXkKLQotIwotIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKLSMKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotQ09ORklHX0NMRUFOX0NPTVBJTEU9eQotQ09ORklHX0JST0tFTl9PTl9TTVA9eQotCi0jCi0jIEdlbmVyYWwgc2V0dXAKLSMKLUNPTkZJR19MT0NBTFZFUlNJT049IiIKLUNPTkZJR19TV0FQPXkKIENPTkZJR19TWVNWSVBDPXkKLSMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CiBDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15Ci0jIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNDVEw9eQotIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLSMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAotQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKLSMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYUEVSVCBpcyBub3Qgc2V0Ci1DT05GSUdfS0FMTFNZTVM9eQotIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAotQ09ORklHX0ZVVEVYPXkKLUNPTkZJR19FUE9MTD15Ci0jIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0Ci1DT05GSUdfU0hNRU09eQotQ09ORklHX0NDX0FMSUdOX0ZVTkNUSU9OUz0wCi1DT05GSUdfQ0NfQUxJR05fTEFCRUxTPTAKLUNPTkZJR19DQ19BTElHTl9MT09QUz0wCi1DT05GSUdfQ0NfQUxJR05fSlVNUFM9MAotIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0Ci0KLSMKLSMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKLSMKIENPTkZJR19NT0RVTEVTPXkKLSMgQ09ORklHX01PRFVMRV9VTkxPQUQgaXMgbm90IHNldAotQ09ORklHX09CU09MRVRFX01PRFBBUk09eQogQ09ORklHX01PRFZFUlNJT05TPXkKLSMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0Ci1DT05GSUdfS01PRD15Ci0KLSMKLSMgUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzCi0jCi1DT05GSUdfWFRFTlNBX0FSQ0hfTElOVVhfQkU9eQotIyBDT05GSUdfWFRFTlNBX0FSQ0hfTElOVVhfTEUgaXMgbm90IHNldAotIyBDT05GSUdfWFRFTlNBX0FSQ0hfTElOVVhfVEVTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19YVEVOU0FfQVJDSF9TNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19YVEVOU0FfQ1VTVE9NIGlzIG5vdCBzZXQKLUNPTkZJR19NTVU9eQotIyBDT05GSUdfWFRFTlNBX1VOQUxJR05FRF9VU0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAotIyBDT05GSUdfSElHSE1FTSBpcyBub3Qgc2V0Ci0KLSMKLSMgUGxhdGZvcm0gb3B0aW9ucwotIwotIyBDT05GSUdfWFRFTlNBX1BMQVRGT1JNX0lTUyBpcyBub3Qgc2V0CiBDT05GSUdfWFRFTlNBX1BMQVRGT1JNX1hUMjAwMD15Ci1DT05GSUdfWFRFTlNBX0NBTElCUkFURV9DQ09VTlQ9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKIENPTkZJR19DTURMSU5FX0JPT0w9eQotQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5UzAsMzg0MDAgaXA9Ym9vdHAgcm9vdD1uZnMgbmZzcm9vdD0vb3B0L21vbnRhdmlzdGEvcHJvL2RldmtpdC94dGVuc2EvbGludXhfYmUvdGFyZ2V0IgotCi0jCi0jIEJ1cyBvcHRpb25zCi0jCi1DT05GSUdfUENJPXkKLSMgQ09ORklHX1BDSV9MRUdBQ1lfUFJPQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ0lfTkFNRVMgaXMgbm90IHNldAotCi0jCi0jIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKLSMKLSMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0Ci0KLSMKLSMgUEMtY2FyZCBicmlkZ2VzCi0jCi0KLSMKLSMgUENJIEhvdHBsdWcgU3VwcG9ydAotIwotIyBDT05GSUdfSE9UUExVR19QQ0kgaXMgbm90IHNldAotCi0jCi0jIEV4ZWN0dWFibGUgZmlsZSBmb3JtYXRzCi0jCi1DT05GSUdfS0NPUkVfRUxGPXkKLUNPTkZJR19CSU5GTVRfRUxGPXkKK0NPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVMwLDM4NDAwIGlwPWJvb3RwIHJvb3Q9bmZzIG5mc3Jvb3Q9L29wdC9tb250YXZpc3RhL3Byby9kZXZraXQveHRlbnNhL2xpbnV4X2JlL3RhcmdldCBtZW1tYXA9MTI4TUAwIgogQ09ORklHX0JJTkZNVF9NSVNDPXkKLQotIwotIyBEZXZpY2UgRHJpdmVycwotIwotCi0jCi0jIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKLSMKLUNPTkZJR19TVEFOREFMT05FPXkKLUNPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKLSMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAotCi0jCi0jIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKLSMKLSMgQ09ORklHX01URCBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0Ci0jCi0jIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKLSMKLQotIwotIyBCbG9jayBkZXZpY2VzCi0jCi0jIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgotQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKLSMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAotCi0jCi0jIElPIFNjaGVkdWxlcnMKLSMKLUNPTkZJR19JT1NDSEVEX05PT1A9eQotQ09ORklHX0lPU0NIRURfQVM9eQotQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQotQ09ORklHX0lPU0NIRURfQ0ZRPXkKLSMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0Ci0KLSMKLSMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAotIwotIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKLQotIwotIyBTQ1NJIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQotIwotIyBDT05GSUdfTUQgaXMgbm90IHNldAotCi0jCi0jIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKLSMKLQotIwotIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0Ci0jCi0jIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJPIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19JMk8gaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmtpbmcgc3VwcG9ydAotIwogQ09ORklHX05FVD15Ci0KLSMKLSMgTmV0d29ya2luZyBvcHRpb25zCi0jCi0jIENPTkZJR19QQUNLRVQgaXMgbm90IHNldAotIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAogQ09ORklHX1VOSVg9eQotIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15CiBDT05GSUdfSVBfTVVMVElDQVNUPXkKIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVI9eQpAQCAtMjA5LDQ3ICsyMCwxMCBAQAogQ09ORklHX0lQX1BOUF9ESENQPXkKIENPTkZJR19JUF9QTlBfQk9PVFA9eQogQ09ORklHX0lQX1BOUF9SQVJQPXkKLSMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9NUk9VVEUgaXMgbm90IHNldAotIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX1RDUERJQUcgaXMgbm90IHNldAotIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKLQotIwotIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKLSMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAotIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19YMjUgaXMgbm90IHNldAotIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKLQotIwotIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKLSMKIENPTkZJR19ORVRfU0NIRUQ9eQotQ09ORklHX05FVF9TQ0hfQ0xLX0pJRkZJRVM9eQotIyBDT05GSUdfTkVUX1NDSF9DTEtfR0VUVElNRU9GREFZIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9TQ0hfQ0xLX0NQVSBpcyBub3Qgc2V0CiBDT05GSUdfTkVUX1NDSF9DQlE9bQogQ09ORklHX05FVF9TQ0hfSFRCPW0KLSMgQ09ORklHX05FVF9TQ0hfSEZTQyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUX1NDSF9QUklPPW0KIENPTkZJR19ORVRfU0NIX1JFRD1tCiBDT05GSUdfTkVUX1NDSF9TRlE9bQpAQCAtMjU3LDM5OSArMzEsMjQgQEAKIENPTkZJR19ORVRfU0NIX1RCRj1tCiBDT05GSUdfTkVUX1NDSF9HUkVEPW0KIENPTkZJR19ORVRfU0NIX0RTTUFSSz1tCi0jIENPTkZJR19ORVRfU0NIX05FVEVNIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRfU0NIX0lOR1JFU1M9bQotQ09ORklHX05FVF9RT1M9eQotQ09ORklHX05FVF9FU1RJTUFUT1I9eQotQ09ORklHX05FVF9DTFM9eQogQ09ORklHX05FVF9DTFNfVENJTkRFWD1tCiBDT05GSUdfTkVUX0NMU19ST1VURTQ9bQotQ09ORklHX05FVF9DTFNfUk9VVEU9eQogQ09ORklHX05FVF9DTFNfRlc9bQogQ09ORklHX05FVF9DTFNfVTMyPW0KLSMgQ09ORklHX0NMU19VMzJfUEVSRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfQ0xTX0lORCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUX0NMU19SU1ZQPW0KIENPTkZJR19ORVRfQ0xTX1JTVlA2PW0KLSMgQ09ORklHX05FVF9DTFNfQUNUIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRfQ0xTX1BPTElDRT15Ci0KLSMKLSMgTmV0d29yayB0ZXN0aW5nCi0jCi0jIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JUIGlzIG5vdCBzZXQKIENPTkZJR19ORVRERVZJQ0VTPXkKIENPTkZJR19EVU1NWT15Ci0jIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UVU4gaXMgbm90IHNldAotCi0jCi0jIEFSQ25ldCBkZXZpY2VzCi0jCi0jIENPTkZJR19BUkNORVQgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQotIwotQ09ORklHX05FVF9FVEhFUk5FVD15Ci0jIENPTkZJR19NSUkgaXMgbm90IHNldAotQ09ORklHX1hUMjAwMF9TT05JQz15Ci0jIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAotIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0Ci0KLSMKLSMgVHVsaXAgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX05FVF9UVUxJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfUENJIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAwMCBNYml0KQotIwotIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RMMksgaXMgbm90IHNldAotIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAotIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19SODE2OSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCi0jCi0jIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1MySU8gaXMgbm90IHNldAotCi0jCi0jIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQotIwotQ09ORklHX05FVF9SQURJTz15Ci0KLSMKLSMgT2Jzb2xldGUgV2lyZWxlc3MgY2FyZHMgc3VwcG9ydCAocHJlLTgwMi4xMSkKLSMKLUNPTkZJR19TVFJJUD1tCi0KLSMKLSMgV2lyZWxlc3MgODAyLjExYiBJU0EvUENJIGNhcmRzIHN1cHBvcnQKLSMKLUNPTkZJR19IRVJNRVM9bQotIyBDT05GSUdfUExYX0hFUk1FUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19UTURfSEVSTUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDSV9IRVJNRVMgaXMgbm90IHNldAotIyBDT05GSUdfQVRNRUwgaXMgbm90IHNldAotCi0jCi0jIFByaXNtIEdUL0R1ZXR0ZSA4MDIuMTEoYS9iL2cpIFBDSS9DYXJkYnVzIHN1cHBvcnQKLSMKLSMgQ09ORklHX1BSSVNNNTQgaXMgbm90IHNldAotQ09ORklHX05FVF9XSVJFTEVTUz15Ci0KLSMKLSMgV2FuIGludGVyZmFjZXMKLSMKLSMgQ09ORklHX1dBTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GRERJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hJUFBJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKLQotIwotIyBJU0ROIHN1YnN5c3RlbQotIwotIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0Ci0KLSMKLSMgVGVsZXBob255IFN1cHBvcnQKLSMKLSMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAotIwotQ09ORklHX0lOUFVUPXkKLQotIwotIyBVc2VybGFuZCBpbnRlcmZhY2VzCi0jCi1DT05GSUdfSU5QVVRfTU9VU0VERVY9eQogIyBDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVggaXMgbm90IHNldAotQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKLSMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgSS9PIGRyaXZlcnMKLSMKLSMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19TT1VORF9HQU1FUE9SVD15Ci1DT05GSUdfU0VSSU89eQotIyBDT05GSUdfU0VSSU9fSTgwNDIgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSU9fU0VSUE9SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJT19DVDgyQzcxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJT19QQ0lQUzIgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBEZXZpY2UgRHJpdmVycwotIwogIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0Ci0KLSMKLSMgQ2hhcmFjdGVyIGRldmljZXMKLSMKLUNPTkZJR19WVD15Ci1DT05GSUdfVlRfQ09OU09MRT15Ci1DT05GSUdfSFdfQ09OU09MRT15Ci0jIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAotCi0jCi0jIFNlcmlhbCBkcml2ZXJzCi0jCisjIENPTkZJR19TRVJJT19TRVJQT1JUIGlzIG5vdCBzZXQKIENPTkZJR19TRVJJQUxfODI1MD15CiBDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15Ci1DT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9NAotIyBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQgaXMgbm90IHNldAotCi0jCi0jIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKLSMKLUNPTkZJR19TRVJJQUxfQ09SRT15Ci1DT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15Ci1DT05GSUdfVU5JWDk4X1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlTPXkKLUNPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgotCi0jCi0jIElQTUkKLSMKLSMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2F0Y2hkb2cgQ2FyZHMKLSMKLSMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RUTEsgaXMgbm90IHNldAotIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAotIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAotCi0jCi0jIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgotIwotIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAotCi0jCi0jIEkyQyBzdXBwb3J0Ci0jCi0jIENPTkZJR19JMkMgaXMgbm90IHNldAotCi0jCi0jIERhbGxhcydzIDEtd2lyZSBidXMKLSMKLSMgQ09ORklHX1cxIGlzIG5vdCBzZXQKLQotIwotIyBNaXNjIGRldmljZXMKLSMKLQotIwotIyBNdWx0aW1lZGlhIGRldmljZXMKLSMKLSMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIwotIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKLQotIwotIyBHcmFwaGljcyBzdXBwb3J0Ci0jCi0jIENPTkZJR19GQiBpcyBub3Qgc2V0Ci0KLSMKLSMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0Ci0jCiAjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0Ci1DT05GSUdfRFVNTVlfQ09OU09MRT15Ci0jIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAotCi0jCi0jIFNvdW5kCi0jCi0jIENPTkZJR19TT1VORCBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIHN1cHBvcnQKLSMKLSMgQ09ORklHX1VTQiBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15Ci1DT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQotCi0jCi0jIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcgbWF5IGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgotIwotCi0jCi0jIFVTQiBHYWRnZXQgU3VwcG9ydAotIwotIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0Ci0KLSMKLSMgTU1DL1NEIENhcmQgc3VwcG9ydAotIwotIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKLQotIwotIyBJbmZpbmlCYW5kIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAotCi0jCi0jIEZpbGUgc3lzdGVtcwotIwotIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKLUNPTkZJR19ETk9USUZZPXkKLSMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKLQotIwotIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcwotIwotIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQc2V1ZG8gZmlsZXN5c3RlbXMKLSMKLUNPTkZJR19QUk9DX0ZTPXkKLSMgQ09ORklHX1BST0NfS0NPUkUgaXMgbm90IHNldAotQ09ORklHX1NZU0ZTPXkKLUNPTkZJR19ERVZGU19GUz15Ci0jIENPTkZJR19ERVZGU19NT1VOVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERVZGU19ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAotIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAotIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKLUNPTkZJR19SQU1GUz15Ci0KLSMKLSMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcwotIwotIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAotIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayBGaWxlIFN5c3RlbXMKLSMKIENPTkZJR19ORlNfRlM9eQotQ09ORklHX05GU19WMz15Ci0jIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAotIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU0QgaXMgbm90IHNldAogQ09ORklHX1JPT1RfTkZTPXkKLUNPTkZJR19MT0NLRD15Ci1DT05GSUdfTE9DS0RfVjQ9eQotIyBDT05GSUdfRVhQT1JURlMgaXMgbm90IHNldAotQ09ORklHX1NVTlJQQz15Ci0jIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAotIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIFBhcnRpdGlvbiBUeXBlcwotIwotIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKLUNPTkZJR19NU0RPU19QQVJUSVRJT049eQotCi0jCi0jIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0Ci0jCi0jIENPTkZJR19OTFMgaXMgbm90IHNldAotCi0jCi0jIEtlcm5lbCBoYWNraW5nCi0jCi1DT05GSUdfREVCVUdfS0VSTkVMPXkKLSMgQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1cgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19GUkFNRV9QT0lOVEVSIGlzIG5vdCBzZXQKIENPTkZJR19NQUdJQ19TWVNSUT15Ci0jIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19QQUdFQUxMT0MgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKLQotIwotIyBTZWN1cml0eSBvcHRpb25zCi0jCi0jIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLQotIwotIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKLSMKLSMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKLSMKLQotIwotIyBMaWJyYXJ5IHJvdXRpbmVzCi0jCi0jIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JDMzIgaXMgbm90IHNldAotIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvY29uZmlncy9nZW5lcmljX2tjNzA1X2RlZmNvbmZpZyBiL2FyY2gveHRlbnNhL2NvbmZpZ3MvZ2VuZXJpY19rYzcwNV9kZWZjb25maWcKaW5kZXggZDk0NDRmMC4uNzQ0YWRlYSAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvY29uZmlncy9nZW5lcmljX2tjNzA1X2RlZmNvbmZpZworKysgYi9hcmNoL3h0ZW5zYS9jb25maWdzL2dlbmVyaWNfa2M3MDVfZGVmY29uZmlnCkBAIC0zMiw3ICszMiw3IEBACiAjIENPTkZJR19QQ0kgaXMgbm90IHNldAogQ09ORklHX1hURU5TQV9QTEFURk9STV9YVEZQR0E9eQogQ09ORklHX0NNRExJTkVfQk9PTD15Ci1DT05GSUdfQ01ETElORT0iZWFybHljb249dWFydDgyNTAsbW1pbzMyLDB4ZmQwNTAwMjAsMTE1MjAwbjggY29uc29sZT10dHlTMCwxMTUyMDBuOCBpcD1kaGNwIHJvb3Q9L2Rldi9uZnMgcncgZGVidWciCitDT05GSUdfQ01ETElORT0iZWFybHljb249dWFydDgyNTAsbW1pbzMybmF0aXZlLDB4ZmQwNTAwMjAsMTE1MjAwbjggY29uc29sZT10dHlTMCwxMTUyMDBuOCBpcD1kaGNwIHJvb3Q9L2Rldi9uZnMgcncgZGVidWcgbWVtbWFwPTB4MzgwMDAwMDBAMCIKIENPTkZJR19VU0VfT0Y9eQogQ09ORklHX0JVSUxUSU5fRFRCPSJrYzcwNSIKICMgQ09ORklHX0NPTVBBQ1RJT04gaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvY29uZmlncy9pc3NfZGVmY29uZmlnIGIvYXJjaC94dGVuc2EvY29uZmlncy9pc3NfZGVmY29uZmlnCmluZGV4IDQ0YzY3NjQuLjRiYjViNzYgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2NvbmZpZ3MvaXNzX2RlZmNvbmZpZworKysgYi9hcmNoL3h0ZW5zYS9jb25maWdzL2lzc19kZWZjb25maWcKQEAgLTEsNzU4ICsxLDM0IEBACi0jCi0jIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzQtcmM2Ci0jIFR1ZSBBdWcgIDMgMDA6MTA6NTQgMjAxMAotIwotIyBDT05GSUdfRlJBTUVfUE9JTlRFUiBpcyBub3Qgc2V0Ci1DT05GSUdfWk9ORV9ETUE9eQotQ09ORklHX1hURU5TQT15Ci1DT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE09eQotQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15Ci1DT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKLSMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAotQ09ORklHX05PX0lPUE9SVF9NQVA9eQotQ09ORklHX0haPTEwMAotQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKLUNPTkZJR19DT05TVFJVQ1RPUlM9eQotCi0jCi0jIEdlbmVyYWwgc2V0dXAKLSMKLUNPTkZJR19FWFBFUklNRU5UQUw9eQotQ09ORklHX0JST0tFTl9PTl9TTVA9eQotQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgotQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgotQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKLUNPTkZJR19TV0FQPXkKIENPTkZJR19TWVNWSVBDPXkKLUNPTkZJR19TWVNWSVBDX1NZU0NUTD15Ci0jIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAotIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAotIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAotCi0jCi0jIFJDVSBTdWJzeXN0ZW0KLSMKLUNPTkZJR19UUkVFX1JDVT15Ci0jIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJTllfUkNVIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JDVV9UUkFDRSBpcyBub3Qgc2V0Ci1DT05GSUdfUkNVX0ZBTk9VVD0zMgotIyBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAotIyBDT05GSUdfQ0dST1VQUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKLSMgQ09ORklHX05BTUVTUEFDRVMgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAotIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAotQ09ORklHX1NZU0NUTD15Ci1DT05GSUdfQU5PTl9JTk9ERVM9eQogQ09ORklHX0VYUEVSVD15CiBDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQotQ09ORklHX0tBTExTWU1TPXkKLSMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAotQ09ORklHX1BSSU5USz15Ci1DT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15Ci1DT05GSUdfQkFTRV9GVUxMPXkKLUNPTkZJR19GVVRFWD15Ci1DT05GSUdfRVBPTEw9eQotQ09ORklHX1NJR05BTEZEPXkKLUNPTkZJR19USU1FUkZEPXkKLUNPTkZJR19FVkVOVEZEPXkKLUNPTkZJR19TSE1FTT15Ci1DT05GSUdfQUlPPXkKLQotIwotIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycwotIwotQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKLUNPTkZJR19TTFVCX0RFQlVHPXkKLUNPTkZJR19DT01QQVRfQlJLPXkKLSMgQ09ORklHX1NMQUIgaXMgbm90IHNldAotQ09ORklHX1NMVUI9eQotIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotCi0jCi0jIEdDT1YtYmFzZWQga2VybmVsIHByb2ZpbGluZwotIwotIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaXMgbm90IHNldAotQ09ORklHX1NMQUJJTkZPPXkKLUNPTkZJR19SVF9NVVRFWEVTPXkKLUNPTkZJR19CQVNFX1NNQUxMPTAKLSMgQ09ORklHX01PRFVMRVMgaXMgbm90IHNldAotQ09ORklHX0JMT0NLPXkKLUNPTkZJR19MQkRBRj15Ci1DT05GSUdfQkxLX0RFVl9CU0c9eQotIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAotCi0jCi0jIElPIFNjaGVkdWxlcnMKLSMKLUNPTkZJR19JT1NDSEVEX05PT1A9eQogIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0CiAjIENPTkZJR19JT1NDSEVEX0NGUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKLUNPTkZJR19ERUZBVUxUX05PT1A9eQotQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0ibm9vcCIKLSMgQ09ORklHX0lOTElORV9TUElOX1RSWUxPQ0sgaXMgbm90IHNldAotIyBDT05GSUdfSU5MSU5FX1NQSU5fVFJZTE9DS19CSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkxJTkVfU1BJTl9MT0NLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOTElORV9TUElOX0xPQ0tfQkggaXMgbm90IHNldAotIyBDT05GSUdfSU5MSU5FX1NQSU5fTE9DS19JUlEgaXMgbm90IHNldAotIyBDT05GSUdfSU5MSU5FX1NQSU5fTE9DS19JUlFTQVZFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VOSU5MSU5FX1NQSU5fVU5MT0NLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOTElORV9TUElOX1VOTE9DS19CSCBpcyBub3Qgc2V0Ci1DT05GSUdfSU5MSU5FX1NQSU5fVU5MT0NLX0lSUT15Ci0jIENPTkZJR19JTkxJTkVfU1BJTl9VTkxPQ0tfSVJRUkVTVE9SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkxJTkVfUkVBRF9UUllMT0NLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOTElORV9SRUFEX0xPQ0sgaXMgbm90IHNldAotIyBDT05GSUdfSU5MSU5FX1JFQURfTE9DS19CSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkxJTkVfUkVBRF9MT0NLX0lSUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkxJTkVfUkVBRF9MT0NLX0lSUVNBVkUgaXMgbm90IHNldAotQ09ORklHX0lOTElORV9SRUFEX1VOTE9DSz15Ci0jIENPTkZJR19JTkxJTkVfUkVBRF9VTkxPQ0tfQkggaXMgbm90IHNldAotQ09ORklHX0lOTElORV9SRUFEX1VOTE9DS19JUlE9eQotIyBDT05GSUdfSU5MSU5FX1JFQURfVU5MT0NLX0lSUVJFU1RPUkUgaXMgbm90IHNldAotIyBDT05GSUdfSU5MSU5FX1dSSVRFX1RSWUxPQ0sgaXMgbm90IHNldAotIyBDT05GSUdfSU5MSU5FX1dSSVRFX0xPQ0sgaXMgbm90IHNldAotIyBDT05GSUdfSU5MSU5FX1dSSVRFX0xPQ0tfQkggaXMgbm90IHNldAotIyBDT05GSUdfSU5MSU5FX1dSSVRFX0xPQ0tfSVJRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOTElORV9XUklURV9MT0NLX0lSUVNBVkUgaXMgbm90IHNldAotQ09ORklHX0lOTElORV9XUklURV9VTkxPQ0s9eQotIyBDT05GSUdfSU5MSU5FX1dSSVRFX1VOTE9DS19CSCBpcyBub3Qgc2V0Ci1DT05GSUdfSU5MSU5FX1dSSVRFX1VOTE9DS19JUlE9eQotIyBDT05GSUdfSU5MSU5FX1dSSVRFX1VOTE9DS19JUlFSRVNUT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX01VVEVYX1NQSU5fT05fT1dORVIgaXMgbm90IHNldAotIyBDT05GSUdfRlJFRVpFUiBpcyBub3Qgc2V0Ci1DT05GSUdfTU1VPXkKLSMgQ09ORklHX1ZBUklBTlRfSVJRX1NXSVRDSCBpcyBub3Qgc2V0Ci0KLSMKLSMgUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzCi0jCi1DT05GSUdfWFRFTlNBX1ZBUklBTlRfRlNGPXkKLSMgQ09ORklHX1hURU5TQV9WQVJJQU5UX0RDMjMyQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19YVEVOU0FfVU5BTElHTkVEX1VTRVIgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0Ci1DT05GSUdfWFRFTlNBX0NBTElCUkFURV9DQ09VTlQ9eQotQ09ORklHX1NFUklBTF9DT05TT0xFPXkKLUNPTkZJR19YVEVOU0FfSVNTX05FVFdPUks9eQotCi0jCi0jIEJ1cyBvcHRpb25zCi0jCiAjIENPTkZJR19QQ0kgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAotCi0jCi0jIFBsYXRmb3JtIG9wdGlvbnMKLSMKLUNPTkZJR19YVEVOU0FfUExBVEZPUk1fSVNTPXkKLSMgQ09ORklHX1hURU5TQV9QTEFURk9STV9YVDIwMDAgaXMgbm90IHNldAotIyBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVkgaXMgbm90IHNldAogQ09ORklHX0NNRExJTkVfQk9PTD15Ci1DT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTMCwzODQwMCBldGgwPXR1bnRhcCwsdGFwMCBpcD0xOTIuMTY4LjE2OC41OjE5Mi4xNjguMTY4LjEgcm9vdD1uZnMgbmZzcm9vdD0xOTIuMTY4LjE2OC4xOi9vcHQvbW9udGF2aXN0YS9wcm8vZGV2a2l0L3h0ZW5zYS9saW51eF9iZS90YXJnZXQiCi1DT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15Ci1DT05GSUdfRkxBVE1FTV9NQU5VQUw9eQotIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKLUNPTkZJR19GTEFUTUVNPXkKLUNPTkZJR19GTEFUX05PREVfTUVNX01BUD15Ci1DT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAotIyBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldAotQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQotQ09ORklHX0JPVU5DRT15Ci1DT05GSUdfVklSVF9UT19CVVM9eQotIyBDT05GSUdfS1NNIGlzIG5vdCBzZXQKLUNPTkZJR19ERUZBVUxUX01NQVBfTUlOX0FERFI9NDA5NgotCi0jCi0jIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCi0jCi1DT05GSUdfS0NPUkVfRUxGPXkKLUNPTkZJR19CSU5GTVRfRUxGPXkKK0NPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVMwLDM4NDAwIGV0aDA9dHVudGFwLCx0YXAwIGlwPTE5Mi4xNjguMTY4LjU6MTkyLjE2OC4xNjguMSByb290PW5mcyBuZnNyb290PTE5Mi4xNjguMTY4LjE6L29wdC9tb250YXZpc3RhL3Byby9kZXZraXQveHRlbnNhL2xpbnV4X2JlL3RhcmdldCBtZW1tYXA9MTI4TUAwIgogIyBDT05GSUdfQ09SRV9EVU1QX0RFRkFVTFRfRUxGX0hFQURFUlMgaXMgbm90IHNldAotIyBDT05GSUdfSEFWRV9BT1VUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKIENPTkZJR19ORVQ9eQotCi0jCi0jIE5ldHdvcmtpbmcgb3B0aW9ucwotIwogQ09ORklHX1BBQ0tFVD15CiBDT05GSUdfVU5JWD15Ci1DT05GSUdfWEZSTT15Ci0jIENPTkZJR19YRlJNX1VTRVIgaXMgbm90IHNldAotIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGUk1fTUlHUkFURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlJNX1NUQVRJU1RJQ1MgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15Ci0jIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAotIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9GSUJfSEFTSD15CiBDT05GSUdfSVBfUE5QPXkKIENPTkZJR19JUF9QTlBfREhDUD15CiBDT05GSUdfSVBfUE5QX0JPT1RQPXkKIENPTkZJR19JUF9QTlBfUkFSUD15Ci0jIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAotIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAotQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15Ci1DT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKLUNPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPXkKLUNPTkZJR19JTkVUX0xSTz15Ci1DT05GSUdfSU5FVF9ESUFHPXkKLUNPTkZJR19JTkVUX1RDUF9ESUFHPXkKLSMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKLUNPTkZJR19UQ1BfQ09OR19DVUJJQz15Ci1DT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCi0jIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAotIyBDT05GSUdfUkRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJUEMgaXMgbm90IHNldAotIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRFNBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAotIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xMQzIgaXMgbm90IHNldAotIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1gyNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JRUVFODAyMTU0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19EQ0IgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgdGVzdGluZwotIwotIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DQU4gaXMgbm90IHNldAotIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0Ci1DT05GSUdfV0lSRUxFU1M9eQotIyBDT05GSUdfQ0ZHODAyMTEgaXMgbm90IHNldAotIyBDT05GSUdfTElCODAyMTEgaXMgbm90IHNldAotCi0jCi0jIENGRzgwMjExIG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yIE1BQzgwMjExCi0jCi0jIENPTkZJR19XSU1BWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRktJTEwgaXMgbm90IHNldAotIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKLQotIwotIyBEZXZpY2UgRHJpdmVycwotIwotCi0jCi0jIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKLSMKICMgQ09ORklHX1NUQU5EQUxPTkUgaXMgbm90IHNldAotQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAotIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVY9eQotIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0Ci0KLSMKLSMgRFJCRCBkaXNhYmxlZCBiZWNhdXNlIFBST0NfRlMsIElORVQgb3IgQ09OTkVDVE9SIG5vdCBzZWxlY3RlZAotIwotIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAotIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0Ci1DT05GSUdfTUlTQ19ERVZJQ0VTPXkKLSMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DMlBPUlQgaXMgbm90IHNldAotCi0jCi0jIEVFUFJPTSBzdXBwb3J0Ci0jCi0jIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAotIyBDT05GSUdfSEFWRV9JREUgaXMgbm90IHNldAotIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKLQotIwotIyBTQ1NJIGRldmljZSBzdXBwb3J0Ci0jCi1DT05GSUdfU0NTSV9NT0Q9eQotIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfRE1BIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEEgaXMgbm90IHNldAotIyBDT05GSUdfTUQgaXMgbm90IHNldAotIyBDT05GSUdfTkVUREVWSUNFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAotIwotQ09ORklHX0lOUFVUPXkKLSMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfUE9MTERFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9TUEFSU0VLTUFQIGlzIG5vdCBzZXQKLQotIwotIyBVc2VybGFuZCBpbnRlcmZhY2VzCi0jCiAjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAotCi0jCi0jIElucHV0IERldmljZSBEcml2ZXJzCi0jCiAjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgSS9PIHBvcnRzCi0jCiAjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgQ2hhcmFjdGVyIGRldmljZXMKLSMKLUNPTkZJR19WVD15Ci1DT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQotQ09ORklHX1ZUX0NPTlNPTEU9eQotQ09ORklHX0hXX0NPTlNPTEU9eQotIyBDT05GSUdfVlRfSFdfQ09OU09MRV9CSU5ESU5HIGlzIG5vdCBzZXQKLUNPTkZJR19ERVZLTUVNPXkKLSMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIGRyaXZlcnMKLSMKLSMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKLQotIwotIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0Ci0jCi0jIENPTkZJR19TRVJJQUxfVElNQkVSREFMRSBpcyBub3Qgc2V0Ci1DT05GSUdfVU5JWDk4X1BUWVM9eQotIyBDT05GSUdfREVWUFRTX01VTFRJUExFX0lOU1RBTkNFUyBpcyBub3Qgc2V0Ci1DT05GSUdfTEVHQUNZX1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2Ci0jIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotQ09ORklHX0hXX1JBTkRPTT15Ci0jIENPTkZJR19IV19SQU5ET01fVElNRVJJT01FTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVEMgaXMgbm90IHNldAotIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAotIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQSSBpcyBub3Qgc2V0Ci0KLSMKLSMgUFBTIHN1cHBvcnQKLSMKLSMgQ09ORklHX1BQUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19XMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAotQ09ORklHX0hXTU9OPXkKLSMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKLQotIwotIyBOYXRpdmUgZHJpdmVycwotIwotIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfRjcxODgyRkcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDODc0MjcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19TSFQxNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAogQ09ORklHX1dBVENIRE9HPXkKIENPTkZJR19XQVRDSERPR19OT1dBWU9VVD15Ci0KLSMKLSMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKLSMKIENPTkZJR19TT0ZUX1dBVENIRE9HPXkKLUNPTkZJR19TU0JfUE9TU0lCTEU9eQotCi0jCi0jIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQotIwotIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKLQotIwotIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCi0jCi0jIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAotIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldAotIyBDT05GSUdfTUVESUFfU1VQUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgR3JhcGhpY3Mgc3VwcG9ydAotIwotIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAotIyBDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0wgaXMgbm90IHNldAotIyBDT05GSUdfRkIgaXMgbm90IHNldAotIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBEaXNwbGF5IGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19ESVNQTEFZX1NVUFBPUlQgaXMgbm90IHNldAotCi0jCi0jIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAotIwogIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAotQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQotIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAotQ09ORklHX0hJRF9TVVBQT1JUPXkKLUNPTkZJR19ISUQ9eQotIyBDT05GSUdfSElEUkFXIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hJRF9QSUQgaXMgbm90IHNldAotCi0jCi0jIFNwZWNpYWwgSElEIGRyaXZlcnMKLSMKLUNPTkZJR19VU0JfU1VQUE9SVD15Ci0jIENPTkZJR19VU0JfQVJDSF9IQVNfSENEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BUkNIX0hBU19FSENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9PVEdfV0hJVEVMSVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9PVEdfQkxBQ0tMSVNUX0hVQiBpcyBub3Qgc2V0Ci0KLSMKLSMgRW5hYmxlIEhvc3Qgb3IgR2FkZ2V0IHN1cHBvcnQgdG8gc2VlIEludmVudHJhIG9wdGlvbnMKLSMKLQotIwotIyBOT1RFOiBVU0JfU1RPUkFHRSBkZXBlbmRzIG9uIFNDU0kgYnV0IEJMS19ERVZfU0QgbWF5Ci0jCi0jIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKLQotIwotIyBPVEcgYW5kIHJlbGF0ZWQgaW5mcmFzdHJ1Y3R1cmUKLSMKLSMgQ09ORklHX01NQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FVWERJU1BMQVkgaXMgbm90IHNldAotIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKLQotIwotIyBUSSBWTFlOUQotIwotIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0Ci0KLSMKLSMgRmlsZSBzeXN0ZW1zCi0jCi0jIENPTkZJR19FWFQyX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRVhUNF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JUUkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0Ci1DT05GSUdfRklMRV9MT0NLSU5HPXkKLUNPTkZJR19GU05PVElGWT15CiAjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOT1RJRlkgaXMgbm90IHNldAotQ09ORklHX0lOT1RJRllfVVNFUj15Ci0jIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBDYWNoZXMKLSMKLSMgQ09ORklHX0ZTQ0FDSEUgaXMgbm90IHNldAotCi0jCi0jIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAotCi0jCi0jIFBzZXVkbyBmaWxlc3lzdGVtcwotIwotQ09ORklHX1BST0NfRlM9eQogQ09ORklHX1BST0NfS0NPUkU9eQotQ09ORklHX1BST0NfU1lTQ1RMPXkKLUNPTkZJR19QUk9DX1BBR0VfTU9OSVRPUj15Ci1DT05GSUdfU1lTRlM9eQogQ09ORklHX1RNUEZTPXkKLSMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAotIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAotQ09ORklHX01JU0NfRklMRVNZU1RFTVM9eQotIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19MT0dGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAotIyBDT05GSUdfU1FVQVNIRlMgaXMgbm90IHNldAotIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKLSMgQ09ORklHX05GU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DRVBIX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlMgaXMgbm90IHNldAotIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQYXJ0aXRpb24gVHlwZXMKLSMKLSMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0Ci1DT05GSUdfTVNET1NfUEFSVElUSU9OPXkKLSMgQ09ORklHX05MUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETE0gaXMgbm90IHNldAotCi0jCi0jIEtlcm5lbCBoYWNraW5nCi0jCi0jIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0Ci1DT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRD15Ci1DT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQotQ09ORklHX0ZSQU1FX1dBUk49MTAyNAotIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAotIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAotIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfS0VSTkVMPXkKLSMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKLUNPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15Ci0jIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0Ci1DT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAorIyBDT05GSUdfRlJBTUVfUE9JTlRFUiBpcyBub3Qgc2V0CiBDT05GSUdfREVURUNUX0hVTkdfVEFTSz15Ci0jIENPTkZJR19CT09UUEFSQU1fSFVOR19UQVNLX1BBTklDIGlzIG5vdCBzZXQKLUNPTkZJR19CT09UUEFSQU1fSFVOR19UQVNLX1BBTklDX1ZBTFVFPTAKLUNPTkZJR19TQ0hFRF9ERUJVRz15Ci0jIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAotIyBDT05GSUdfU0xVQl9ERUJVR19PTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTFVCX1NUQVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX01FTU9SWV9JTklUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfTk9USUZJRVJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0NSRURFTlRJQUxTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAotQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1I9eQotIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19GT1JDRV9XRUFLX1BFUl9DUFUgaXMgbm90IHNldAotIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBR0VfUE9JU09OSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAotCi0jCi0jIFNlY3VyaXR5IG9wdGlvbnMKLSMKLSMgQ09ORklHX0tFWVMgaXMgbm90IHNldAotIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAotIyBDT05GSUdfU0VDVVJJVFlGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUZBVUxUX1NFQ1VSSVRZX1NFTElOVVggaXMgbm90IHNldAotIyBDT05GSUdfREVGQVVMVF9TRUNVUklUWV9TTUFDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUZBVUxUX1NFQ1VSSVRZX1RPTU9ZTyBpcyBub3Qgc2V0Ci1DT05GSUdfREVGQVVMVF9TRUNVUklUWV9EQUM9eQotQ09ORklHX0RFRkFVTFRfU0VDVVJJVFk9IiIKLUNPTkZJR19DUllQVE89eQotCi0jCi0jIENyeXB0byBjb3JlIG9yIGhlbHBlcgotIwotIyBDT05GSUdfQ1JZUFRPX0ZJUFMgaXMgbm90IHNldAotQ09ORklHX0NSWVBUT19BTEdBUEk9eQotQ09ORklHX0NSWVBUT19BTEdBUEkyPXkKLUNPTkZJR19DUllQVE9fUk5HPXkKLUNPTkZJR19DUllQVE9fUk5HMj15Ci0jIENPTkZJR19DUllQVE9fTUFOQUdFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTUFOQUdFUjIgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0FVVEhFTkMgaXMgbm90IHNldAotCi0jCi0jIEF1dGhlbnRpY2F0ZWQgRW5jcnlwdGlvbiB3aXRoIEFzc29jaWF0ZWQgRGF0YQotIwotIyBDT05GSUdfQ1JZUFRPX0NDTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fR0NNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TRVFJViBpcyBub3Qgc2V0Ci0KLSMKLSMgQmxvY2sgbW9kZXMKLSMKLSMgQ09ORklHX0NSWVBUT19DQkMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NUUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ1RTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19FQ0IgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0xSVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fUENCQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fWFRTIGlzIG5vdCBzZXQKLQotIwotIyBIYXNoIG1vZGVzCi0jCi0jIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fVk1BQyBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnZXN0Ci0jCi0jIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19HSEFTSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19STUQxMjggaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1JNRDE2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fUk1EMjU2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19STUQzMjAgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKLQotIwotIyBDaXBoZXJzCi0jCi1DT05GSUdfQ1JZUFRPX0FFUz15Ci0jIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19BUkM0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ0FNRUxMSUEgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fREVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19GQ1JZUFQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fU0FMU0EyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKLQotIwotIyBDb21wcmVzc2lvbgotIwotIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1pMSUIgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0Ci0KLSMKLSMgUmFuZG9tIE51bWJlciBHZW5lcmF0aW9uCi0jCiBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkc9eQotQ09ORklHX0NSWVBUT19IVz15Ci0jIENPTkZJR19CSU5BUllfUFJJTlRGIGlzIG5vdCBzZXQKLQotIwotIyBMaWJyYXJ5IHJvdXRpbmVzCi0jCi1DT05GSUdfR0VORVJJQ19GSU5EX0xBU1RfQklUPXkKLSMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUkNfVDEwRElGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUkMzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKLSMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0Ci1DT05GSUdfSEFTX0lPTUVNPXkKLUNPTkZJR19IQVNfRE1BPXkKLUNPTkZJR19OTEFUVFI9eQotQ09ORklHX0xEX05PX1JFTEFYPXkKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2NvbmZpZ3Mvbm9tbXVfa2M3MDVfZGVmY29uZmlnIGIvYXJjaC94dGVuc2EvY29uZmlncy9ub21tdV9rYzcwNV9kZWZjb25maWcKaW5kZXggMzM3ZDViYS4uNzhjMjUyOSAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvY29uZmlncy9ub21tdV9rYzcwNV9kZWZjb25maWcKKysrIGIvYXJjaC94dGVuc2EvY29uZmlncy9ub21tdV9rYzcwNV9kZWZjb25maWcKQEAgLTM3LDcgKzM3LDcgQEAKICMgQ09ORklHX1BDSSBpcyBub3Qgc2V0CiBDT05GSUdfWFRFTlNBX1BMQVRGT1JNX1hURlBHQT15CiBDT05GSUdfQ01ETElORV9CT09MPXkKLUNPTkZJR19DTURMSU5FPSJlYXJseWNvbj11YXJ0ODI1MCxtbWlvMzIsMHg5ZDA1MDAyMCwxMTUyMDBuOCBjb25zb2xlPXR0eVMwLDExNTIwMG44IGlwPWRoY3Agcm9vdD0vZGV2L25mcyBydyBkZWJ1ZyIKK0NPTkZJR19DTURMSU5FPSJlYXJseWNvbj11YXJ0ODI1MCxtbWlvMzJuYXRpdmUsMHg5ZDA1MDAyMCwxMTUyMDBuOCBjb25zb2xlPXR0eVMwLDExNTIwMG44IGlwPWRoY3Agcm9vdD0vZGV2L25mcyBydyBkZWJ1ZyBtZW1tYXA9MjU2TUAweDYwMDAwMDAwIgogQ09ORklHX1VTRV9PRj15CiBDT05GSUdfQlVJTFRJTl9EVEI9ImtjNzA1X25vbW11IgogQ09ORklHX0RFRkFVTFRfTUVNX1NJWkU9MHgxMDAwMDAwMApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvY29uZmlncy9zbXBfbHgyMDBfZGVmY29uZmlnIGIvYXJjaC94dGVuc2EvY29uZmlncy9zbXBfbHgyMDBfZGVmY29uZmlnCmluZGV4IDYxZjk0M2MuLjE0ZTNjYTMgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2NvbmZpZ3Mvc21wX2x4MjAwX2RlZmNvbmZpZworKysgYi9hcmNoL3h0ZW5zYS9jb25maWdzL3NtcF9seDIwMF9kZWZjb25maWcKQEAgLTM2LDcgKzM2LDcgQEAKICMgQ09ORklHX1BDSSBpcyBub3Qgc2V0CiBDT05GSUdfWFRFTlNBX1BMQVRGT1JNX1hURlBHQT15CiBDT05GSUdfQ01ETElORV9CT09MPXkKLUNPTkZJR19DTURMSU5FPSJlYXJseWNvbj11YXJ0ODI1MCxtbWlvMzIsMHhmZDA1MDAyMCwxMTUyMDBuOCBjb25zb2xlPXR0eVMwLDExNTIwMG44IGlwPWRoY3Agcm9vdD0vZGV2L25mcyBydyBkZWJ1ZyIKK0NPTkZJR19DTURMSU5FPSJlYXJseWNvbj11YXJ0ODI1MCxtbWlvMzJuYXRpdmUsMHhmZDA1MDAyMCwxMTUyMDBuOCBjb25zb2xlPXR0eVMwLDExNTIwMG44IGlwPWRoY3Agcm9vdD0vZGV2L25mcyBydyBkZWJ1ZyBtZW1tYXA9OTZNQDAiCiBDT05GSUdfVVNFX09GPXkKIENPTkZJR19CVUlMVElOX0RUQj0ibHgyMDBteCIKICMgQ09ORklHX0NPTVBBQ1RJT04gaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vYml0b3BzLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9iaXRvcHMuaAppbmRleCAzZjQ0ZmEyLi5kMzQ5MDE4IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9iaXRvcHMuaAorKysgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9iaXRvcHMuaApAQCAtNDgsNyArNDgsNyBAQAogICogX19mZnM6IEZpbmQgZmlyc3QgYml0IHNldCBpbiB3b3JkLiBSZXR1cm4gMCBmb3IgYml0IDAKICAqLwogCi1zdGF0aWMgaW5saW5lIGludCBfX2Zmcyh1bnNpZ25lZCBsb25nIHgpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19mZnModW5zaWduZWQgbG9uZyB4KQogewogCXJldHVybiAzMSAtIF9fY250bHooeCAmIC14KTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2NhY2hlYXNtLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9jYWNoZWFzbS5oCmluZGV4IGUwZjllMTEuLjIwNDFhYmIgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2NhY2hlYXNtLmgKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vY2FjaGVhc20uaApAQCAtNjksMjYgKzY5LDIzIEBACiAJLmVuZG0KIAogCi0jaWYgWENIQUxfRENBQ0hFX0xJTkVfTE9DS0FCTEUKLQogCS5tYWNybwlfX191bmxvY2tfZGNhY2hlX2FsbCBhciBhdAogCi0jaWYgWENIQUxfRENBQ0hFX1NJWkUKKyNpZiBYQ0hBTF9EQ0FDSEVfTElORV9MT0NLQUJMRSAmJiBYQ0hBTF9EQ0FDSEVfU0laRQogCV9fbG9vcF9jYWNoZV9hbGwgXGFyIFxhdCBkaXUgWENIQUxfRENBQ0hFX1NJWkUgWENIQUxfRENBQ0hFX0xJTkVXSURUSAogI2VuZGlmCiAKIAkuZW5kbQogCi0jZW5kaWYKLQotI2lmIFhDSEFMX0lDQUNIRV9MSU5FX0xPQ0tBQkxFCiAKIAkubWFjcm8JX19fdW5sb2NrX2ljYWNoZV9hbGwgYXIgYXQKIAorI2lmIFhDSEFMX0lDQUNIRV9MSU5FX0xPQ0tBQkxFICYmIFhDSEFMX0lDQUNIRV9TSVpFCiAJX19sb29wX2NhY2hlX2FsbCBcYXIgXGF0IGlpdSBYQ0hBTF9JQ0FDSEVfU0laRSBYQ0hBTF9JQ0FDSEVfTElORVdJRFRICisjZW5kaWYKIAogCS5lbmRtCi0jZW5kaWYKKwogCiAJLm1hY3JvCV9fX2ZsdXNoX2ludmFsaWRhdGVfZGNhY2hlX2FsbCBhciBhdAogCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9maXhtYXAuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2ZpeG1hcC5oCmluZGV4IDYyYjUwN2QuLjBkMzA0MDMgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2ZpeG1hcC5oCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2ZpeG1hcC5oCkBAIC01OSw2ICs1OSwxMSBAQAogICovCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHVuc2lnbmVkIGxvbmcgZml4X3RvX3ZpcnQoY29uc3QgdW5zaWduZWQgaW50IGlkeCkKIHsKKwkvKiBDaGVjayBpZiB0aGlzIG1lbW9yeSBsYXlvdXQgaXMgYnJva2VuIGJlY2F1c2UgZml4bWFwIG92ZXJsYXBzIHBhZ2UKKwkgKiB0YWJsZS4KKwkgKi8KKwlCVUlMRF9CVUdfT04oRklYQUREUl9TVEFSVCA8CisJCSAgICAgWENIQUxfUEFHRV9UQUJMRV9WQUREUiArIFhDSEFMX1BBR0VfVEFCTEVfU0laRSk7CiAJQlVJTERfQlVHX09OKGlkeCA+PSBfX2VuZF9vZl9maXhlZF9hZGRyZXNzZXMpOwogCXJldHVybiBfX2ZpeF90b192aXJ0KGlkeCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9oaWdobWVtLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9oaWdobWVtLmgKaW5kZXggMDFjZWY2Yi4uNmUwNzBkYiAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vaGlnaG1lbS5oCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2hpZ2htZW0uaApAQCAtNjgsNiArNjgsMTEgQEAKIAogc3RhdGljIGlubGluZSB2b2lkICprbWFwKHN0cnVjdCBwYWdlICpwYWdlKQogeworCS8qIENoZWNrIGlmIHRoaXMgbWVtb3J5IGxheW91dCBpcyBicm9rZW4gYmVjYXVzZSBQS01BUCBvdmVybGFwcworCSAqIHBhZ2UgdGFibGUuCisJICovCisJQlVJTERfQlVHX09OKFBLTUFQX0JBU0UgPAorCQkgICAgIFhDSEFMX1BBR0VfVEFCTEVfVkFERFIgKyBYQ0hBTF9QQUdFX1RBQkxFX1NJWkUpOwogCUJVR19PTihpbl9pbnRlcnJ1cHQoKSk7CiAJaWYgKCFQYWdlSGlnaE1lbShwYWdlKSkKIAkJcmV0dXJuIHBhZ2VfYWRkcmVzcyhwYWdlKTsKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2luaXRpYWxpemVfbW11LmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9pbml0aWFsaXplX21tdS5oCmluZGV4IDdhMWUwNzUuLjQyNDEwZjIgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL2luaXRpYWxpemVfbW11LmgKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vaW5pdGlhbGl6ZV9tbXUuaApAQCAtNzcsMTMgKzc3LDE2IEBACiAKIAkuYWxpZ24JNAogMToJbW92aQlhMiwgMHgxMDAwMDAwMAotCW1vdmkJYTMsIDB4MTgwMDAwMDAKLQlhZGQJYTIsIGEyLCBhMAotOToJYmdldQlhMiwgYTMsIDliCS8qIFBDIGlzIG91dCBvZiB0aGUgZXhwZWN0ZWQgcmFuZ2UgKi8KKworI2lmIENPTkZJR19LRVJORUxfTE9BRF9BRERSRVNTIDwgMHg0MDAwMDAwMHVsCisjZGVmaW5lIFRFTVBfTUFQUElOR19WQUREUiAweDQwMDAwMDAwCisjZWxzZQorI2RlZmluZSBURU1QX01BUFBJTkdfVkFERFIgMHgwMDAwMDAwMAorI2VuZGlmCiAKIAkvKiBTdGVwIDE6IGludmFsaWRhdGUgbWFwcGluZyBhdCAweDQwMDAwMDAwLi4weDVGRkZGRkZGLiAqLwogCi0JbW92aQlhMiwgMHg0MDAwMDAwMCB8IFhDSEFMX1NQQU5OSU5HX1dBWQorCW1vdmkJYTIsIFRFTVBfTUFQUElOR19WQUREUiB8IFhDSEFMX1NQQU5OSU5HX1dBWQogCWlkdGxiCWEyCiAJaWl0bGIJYTIKIAlpc3luYwpAQCAtOTUsMTQgKzk4LDE0IEBACiAJc3JsaQlhMywgYTAsIDI3CiAJc2xsaQlhMywgYTMsIDI3CiAJYWRkaQlhMywgYTMsIENBX0JZUEFTUwotCWFkZGkJYTcsIGEyLCAtMQorCWFkZGkJYTcsIGEyLCA1IC0gWENIQUxfU1BBTk5JTkdfV0FZCiAJd2R0bGIJYTMsIGE3CiAJd2l0bGIJYTMsIGE3CiAJaXN5bmMKIAogCXNsbGkJYTQsIGEwLCA1CiAJc3JsaQlhNCwgYTQsIDUKLQlhZGRpCWE1LCBhMiwgLTYKKwlhZGRpCWE1LCBhMiwgLVhDSEFMX1NQQU5OSU5HX1dBWQogCWFkZAlhNCwgYTQsIGE1CiAJangJYTQKIApAQCAtMTE2LDM1ICsxMTksNDggQEAKIAlhZGQJYTUsIGE1LCBhNAogCWJuZQlhNSwgYTIsIDNiCiAKLQkvKiBTdGVwIDQ6IFNldHVwIE1NVSB3aXRoIHRoZSBvbGQgVjIgbWFwcGluZ3MuICovCisJLyogU3RlcCA0OiBTZXR1cCBNTVUgd2l0aCB0aGUgcmVxdWVzdGVkIHN0YXRpYyBtYXBwaW5ncy4gKi8KKwogCW1vdmkJYTYsIDB4MDEwMDAwMDAKIAl3c3IJYTYsIElUTEJDRkcKIAl3c3IJYTYsIERUTEJDRkcKIAlpc3luYwogCi0JbW92aQlhNSwgMHhkMDAwMDAwNQotCW1vdmkJYTQsIENBX1dSSVRFQkFDSworCW1vdmkJYTUsIFhDSEFMX0tTRUdfQ0FDSEVEX1ZBRERSICsgWENIQUxfS1NFR19UTEJfV0FZCisJbW92aQlhNCwgWENIQUxfS1NFR19QQUREUiArIENBX1dSSVRFQkFDSwogCXdkdGxiCWE0LCBhNQogCXdpdGxiCWE0LCBhNQogCi0JbW92aQlhNSwgMHhkODAwMDAwNQotCW1vdmkJYTQsIENBX0JZUEFTUworCW1vdmkJYTUsIFhDSEFMX0tTRUdfQllQQVNTX1ZBRERSICsgWENIQUxfS1NFR19UTEJfV0FZCisJbW92aQlhNCwgWENIQUxfS1NFR19QQUREUiArIENBX0JZUEFTUwogCXdkdGxiCWE0LCBhNQogCXdpdGxiCWE0LCBhNQogCi0JbW92aQlhNSwgWENIQUxfS0lPX0NBQ0hFRF9WQUREUiArIDYKKyNpZmRlZiBDT05GSUdfWFRFTlNBX0tTRUdfNTEyTQorCW1vdmkJYTUsIFhDSEFMX0tTRUdfQ0FDSEVEX1ZBRERSICsgMHgxMDAwMDAwMCArIFhDSEFMX0tTRUdfVExCX1dBWQorCW1vdmkJYTQsIFhDSEFMX0tTRUdfUEFERFIgKyAweDEwMDAwMDAwICsgQ0FfV1JJVEVCQUNLCisJd2R0bGIJYTQsIGE1CisJd2l0bGIJYTQsIGE1CisKKwltb3ZpCWE1LCBYQ0hBTF9LU0VHX0JZUEFTU19WQUREUiArIDB4MTAwMDAwMDAgKyBYQ0hBTF9LU0VHX1RMQl9XQVkKKwltb3ZpCWE0LCBYQ0hBTF9LU0VHX1BBRERSICsgMHgxMDAwMDAwMCArIENBX0JZUEFTUworCXdkdGxiCWE0LCBhNQorCXdpdGxiCWE0LCBhNQorI2VuZGlmCisKKwltb3ZpCWE1LCBYQ0hBTF9LSU9fQ0FDSEVEX1ZBRERSICsgWENIQUxfS0lPX1RMQl9XQVkKIAltb3ZpCWE0LCBYQ0hBTF9LSU9fREVGQVVMVF9QQUREUiArIENBX1dSSVRFQkFDSwogCXdkdGxiCWE0LCBhNQogCXdpdGxiCWE0LCBhNQogCi0JbW92aQlhNSwgWENIQUxfS0lPX0JZUEFTU19WQUREUiArIDYKKwltb3ZpCWE1LCBYQ0hBTF9LSU9fQllQQVNTX1ZBRERSICsgWENIQUxfS0lPX1RMQl9XQVkKIAltb3ZpCWE0LCBYQ0hBTF9LSU9fREVGQVVMVF9QQUREUiArIENBX0JZUEFTUwogCXdkdGxiCWE0LCBhNQogCXdpdGxiCWE0LCBhNQogCiAJaXN5bmMKIAotCS8qIEp1bXAgdG8gc2VsZiwgdXNpbmcgTU1VIHYyIG1hcHBpbmdzLiAqLworCS8qIEp1bXAgdG8gc2VsZiwgdXNpbmcgZmluYWwgbWFwcGluZ3MuICovCiAJbW92aQlhNCwgMWYKIAlqeAlhNAogCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9rbWVtX2xheW91dC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20va21lbV9sYXlvdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjFmODcyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20va21lbV9sYXlvdXQuaApAQCAtMCwwICsxLDc0IEBACisvKgorICogS2VybmVsIHZpcnR1YWwgbWVtb3J5IGxheW91dCBkZWZpbml0aW9ucy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mCisgKiB0aGlzIGFyY2hpdmUgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcyBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX0tNRU1fTEFZT1VUX0gKKyNkZWZpbmUgX1hURU5TQV9LTUVNX0xBWU9VVF9ICisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworI2lmZGVmIENPTkZJR19NTVUKKworLyoKKyAqIEZpeGVkIFRMQiB0cmFuc2xhdGlvbnMgaW4gdGhlIHByb2Nlc3Nvci4KKyAqLworCisjZGVmaW5lIFhDSEFMX1BBR0VfVEFCTEVfVkFERFIJX19YVEVOU0FfVUxfQ09OU1QoMHg4MDAwMDAwMCkKKyNkZWZpbmUgWENIQUxfUEFHRV9UQUJMRV9TSVpFCV9fWFRFTlNBX1VMX0NPTlNUKDB4MDA0MDAwMDApCisKKyNpZiBkZWZpbmVkKENPTkZJR19YVEVOU0FfS1NFR19NTVVfVjIpCisKKyNkZWZpbmUgWENIQUxfS1NFR19DQUNIRURfVkFERFIJX19YVEVOU0FfVUxfQ09OU1QoMHhkMDAwMDAwMCkKKyNkZWZpbmUgWENIQUxfS1NFR19CWVBBU1NfVkFERFIJX19YVEVOU0FfVUxfQ09OU1QoMHhkODAwMDAwMCkKKyNkZWZpbmUgWENIQUxfS1NFR19TSVpFCQlfX1hURU5TQV9VTF9DT05TVCgweDA4MDAwMDAwKQorI2RlZmluZSBYQ0hBTF9LU0VHX0FMSUdOTUVOVAlfX1hURU5TQV9VTF9DT05TVCgweDA4MDAwMDAwKQorI2RlZmluZSBYQ0hBTF9LU0VHX1RMQl9XQVkJNQorI2RlZmluZSBYQ0hBTF9LSU9fVExCX1dBWQk2CisKKyNlbGlmIGRlZmluZWQoQ09ORklHX1hURU5TQV9LU0VHXzI1Nk0pCisKKyNkZWZpbmUgWENIQUxfS1NFR19DQUNIRURfVkFERFIJX19YVEVOU0FfVUxfQ09OU1QoMHhiMDAwMDAwMCkKKyNkZWZpbmUgWENIQUxfS1NFR19CWVBBU1NfVkFERFIJX19YVEVOU0FfVUxfQ09OU1QoMHhjMDAwMDAwMCkKKyNkZWZpbmUgWENIQUxfS1NFR19TSVpFCQlfX1hURU5TQV9VTF9DT05TVCgweDEwMDAwMDAwKQorI2RlZmluZSBYQ0hBTF9LU0VHX0FMSUdOTUVOVAlfX1hURU5TQV9VTF9DT05TVCgweDEwMDAwMDAwKQorI2RlZmluZSBYQ0hBTF9LU0VHX1RMQl9XQVkJNgorI2RlZmluZSBYQ0hBTF9LSU9fVExCX1dBWQk2CisKKyNlbGlmIGRlZmluZWQoQ09ORklHX1hURU5TQV9LU0VHXzUxMk0pCisKKyNkZWZpbmUgWENIQUxfS1NFR19DQUNIRURfVkFERFIJX19YVEVOU0FfVUxfQ09OU1QoMHhhMDAwMDAwMCkKKyNkZWZpbmUgWENIQUxfS1NFR19CWVBBU1NfVkFERFIJX19YVEVOU0FfVUxfQ09OU1QoMHhjMDAwMDAwMCkKKyNkZWZpbmUgWENIQUxfS1NFR19TSVpFCQlfX1hURU5TQV9VTF9DT05TVCgweDIwMDAwMDAwKQorI2RlZmluZSBYQ0hBTF9LU0VHX0FMSUdOTUVOVAlfX1hURU5TQV9VTF9DT05TVCgweDEwMDAwMDAwKQorI2RlZmluZSBYQ0hBTF9LU0VHX1RMQl9XQVkJNgorI2RlZmluZSBYQ0hBTF9LSU9fVExCX1dBWQk2CisKKyNlbHNlCisjZXJyb3IgVW5zdXBwb3J0ZWQgS1NFRyBjb25maWd1cmF0aW9uCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19LU0VHX1BBRERSCisjZGVmaW5lIFhDSEFMX0tTRUdfUEFERFIgICAgICAgIF9fWFRFTlNBX1VMX0NPTlNUKENPTkZJR19LU0VHX1BBRERSKQorI2Vsc2UKKyNkZWZpbmUgWENIQUxfS1NFR19QQUREUglfX1hURU5TQV9VTF9DT05TVCgweDAwMDAwMDAwKQorI2VuZGlmCisKKyNpZiBYQ0hBTF9LU0VHX1BBRERSICYgKFhDSEFMX0tTRUdfQUxJR05NRU5UIC0gMSkKKyNlcnJvciBYQ0hBTF9LU0VHX1BBRERSIGlzIG5vdCBwcm9wZXJseSBhbGlnbmVkIHRvIFhDSEFMX0tTRUdfQUxJR05NRU5UCisjZW5kaWYKKworI2Vsc2UKKworI2RlZmluZSBYQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUglfX1hURU5TQV9VTF9DT05TVCgweGQwMDAwMDAwKQorI2RlZmluZSBYQ0hBTF9LU0VHX0JZUEFTU19WQUREUglfX1hURU5TQV9VTF9DT05TVCgweGQ4MDAwMDAwKQorI2RlZmluZSBYQ0hBTF9LU0VHX1NJWkUJCV9fWFRFTlNBX1VMX0NPTlNUKDB4MDgwMDAwMDApCisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BhZ2UuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BhZ2UuaAppbmRleCBhZDM4NTAwLi45NzZiMWQ3IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wYWdlLmgKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcGFnZS5oCkBAIC0xNSwxNSArMTUsNyBAQAogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogI2luY2x1ZGUgPHBsYXRmb3JtL2hhcmR3YXJlLmg+Ci0KLS8qCi0gKiBGaXhlZCBUTEIgdHJhbnNsYXRpb25zIGluIHRoZSBwcm9jZXNzb3IuCi0gKi8KLQotI2RlZmluZSBYQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUiBfX1hURU5TQV9VTF9DT05TVCgweGQwMDAwMDAwKQotI2RlZmluZSBYQ0hBTF9LU0VHX0JZUEFTU19WQUREUiBfX1hURU5TQV9VTF9DT05TVCgweGQ4MDAwMDAwKQotI2RlZmluZSBYQ0hBTF9LU0VHX1BBRERSICAgICAgICBfX1hURU5TQV9VTF9DT05TVCgweDAwMDAwMDAwKQotI2RlZmluZSBYQ0hBTF9LU0VHX1NJWkUgICAgICAgICBfX1hURU5TQV9VTF9DT05TVCgweDA4MDAwMDAwKQorI2luY2x1ZGUgPGFzbS9rbWVtX2xheW91dC5oPgogCiAvKgogICogUEFHRV9TSElGVCBkZXRlcm1pbmVzIHRoZSBwYWdlIHNpemUKQEAgLTM1LDEwICsyNywxMyBAQAogCiAjaWZkZWYgQ09ORklHX01NVQogI2RlZmluZSBQQUdFX09GRlNFVAlYQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUgotI2RlZmluZSBNQVhfTUVNX1BGTglYQ0hBTF9LU0VHX1NJWkUKKyNkZWZpbmUgUEhZU19PRkZTRVQJWENIQUxfS1NFR19QQUREUgorI2RlZmluZSBNQVhfTE9XX1BGTgkoUEhZU19QRk4oWENIQUxfS1NFR19QQUREUikgKyBcCisJCQkgUEhZU19QRk4oWENIQUxfS1NFR19TSVpFKSkKICNlbHNlCi0jZGVmaW5lIFBBR0VfT0ZGU0VUCV9fWFRFTlNBX1VMX0NPTlNUKDApCi0jZGVmaW5lIE1BWF9NRU1fUEZOCShQTEFURk9STV9ERUZBVUxUX01FTV9TVEFSVCArIFBMQVRGT1JNX0RFRkFVTFRfTUVNX1NJWkUpCisjZGVmaW5lIFBBR0VfT0ZGU0VUCVBMQVRGT1JNX0RFRkFVTFRfTUVNX1NUQVJUCisjZGVmaW5lIFBIWVNfT0ZGU0VUCVBMQVRGT1JNX0RFRkFVTFRfTUVNX1NUQVJUCisjZGVmaW5lIE1BWF9MT1dfUEZOCVBIWVNfUEZOKDB4ZmZmZmZmZmZ1bCkKICNlbmRpZgogCiAjZGVmaW5lIFBHVEFCTEVfU1RBUlQJMHg4MDAwMDAwMApAQCAtMTY3LDEwICsxNjIsMTIgQEAKICAqIGFkZHJlc3Nlcy4KICAqLwogCi0jZGVmaW5lIEFSQ0hfUEZOX09GRlNFVAkJKFBMQVRGT1JNX0RFRkFVTFRfTUVNX1NUQVJUID4+IFBBR0VfU0hJRlQpCisjZGVmaW5lIEFSQ0hfUEZOX09GRlNFVAkJKFBIWVNfT0ZGU0VUID4+IFBBR0VfU0hJRlQpCiAKLSNkZWZpbmUgX19wYSh4KQkJCSgodW5zaWduZWQgbG9uZykgKHgpIC0gUEFHRV9PRkZTRVQpCi0jZGVmaW5lIF9fdmEoeCkJCQkoKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpICh4KSArIFBBR0VfT0ZGU0VUKSkKKyNkZWZpbmUgX19wYSh4KQlcCisJKCh1bnNpZ25lZCBsb25nKSAoeCkgLSBQQUdFX09GRlNFVCArIFBIWVNfT0ZGU0VUKQorI2RlZmluZSBfX3ZhKHgpCVwKKwkoKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpICh4KSAtIFBIWVNfT0ZGU0VUICsgUEFHRV9PRkZTRVQpKQogI2RlZmluZSBwZm5fdmFsaWQocGZuKSBcCiAJKChwZm4pID49IEFSQ0hfUEZOX09GRlNFVCAmJiAoKHBmbikgLSBBUkNIX1BGTl9PRkZTRVQpIDwgbWF4X21hcG5yKQogCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wZ3RhYmxlLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKaW5kZXggZmIwMmZkYy4uOGFhMGUwZCAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcGd0YWJsZS5oCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BndGFibGUuaApAQCAtMTMsNiArMTMsNyBAQAogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGd0YWJsZS1ub3BtZC5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL2ttZW1fbGF5b3V0Lmg+CiAKIC8qCiAgKiBXZSBvbmx5IHVzZSB0d28gcmluZyBsZXZlbHMsIHVzZXIgYW5kIGtlcm5lbCBzcGFjZS4KQEAgLTY4LDkgKzY5LDkgQEAKICAqIFZpcnR1YWwgbWVtb3J5IGFyZWEuIFdlIGtlZXAgYSBkaXN0YW5jZSB0byBvdGhlciBtZW1vcnkgcmVnaW9ucyB0byBiZQogICogb24gdGhlIHNhZmUgc2lkZS4gV2UgYWxzbyB1c2UgdGhpcyBhcmVhIGZvciBjYWNoZSBhbGlhc2luZy4KICAqLwotI2RlZmluZSBWTUFMTE9DX1NUQVJUCQkweEMwMDAwMDAwCi0jZGVmaW5lIFZNQUxMT0NfRU5ECQkweEM3RkVGRkZGCi0jZGVmaW5lIFRMQlRFTVBfQkFTRV8xCQkweEM3RkYwMDAwCisjZGVmaW5lIFZNQUxMT0NfU1RBUlQJCShYQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUiAtIDB4MTAwMDAwMDApCisjZGVmaW5lIFZNQUxMT0NfRU5ECQkoVk1BTExPQ19TVEFSVCArIDB4MDdGRUZGRkYpCisjZGVmaW5lIFRMQlRFTVBfQkFTRV8xCQkoVk1BTExPQ19FTkQgKyAxKQogI2RlZmluZSBUTEJURU1QX0JBU0VfMgkJKFRMQlRFTVBfQkFTRV8xICsgRENBQ0hFX1dBWV9TSVpFKQogI2lmIDIgKiBEQ0FDSEVfV0FZX1NJWkUgPiBJQ0FDSEVfV0FZX1NJWkUKICNkZWZpbmUgVExCVEVNUF9TSVpFCQkoMiAqIERDQUNIRV9XQVlfU0laRSkKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BsYXRmb3JtLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wbGF0Zm9ybS5oCmluZGV4IDMyZTk4ZjIuLmY4ZmJlZjYgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BsYXRmb3JtLmgKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vcGxhdGZvcm0uaApAQCAtNjksNCArNjksMTAgQEAKICAqLwogZXh0ZXJuIHZvaWQgcGxhdGZvcm1fY2FsaWJyYXRlX2Njb3VudCAodm9pZCk7CiAKKy8qCisgKiBGbHVzaCBhbmQgcmVzZXQgdGhlIG1tdSwgc2ltdWxhdGUgYSBwcm9jZXNzb3IgcmVzZXQsIGFuZAorICoganVtcCB0byB0aGUgcmVzZXQgdmVjdG9yLgorICovCit2b2lkIGNwdV9yZXNldCh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworCiAjZW5kaWYJLyogX1hURU5TQV9QTEFURk9STV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaCBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCmluZGV4IGQyZTQwZDMuLmI0MmQ2OGIgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCkBAIC0zNyw3ICszNyw3IEBACiAjaWZkZWYgQ09ORklHX01NVQogI2RlZmluZSBUQVNLX1NJWkUJX19YVEVOU0FfVUxfQ09OU1QoMHg0MDAwMDAwMCkKICNlbHNlCi0jZGVmaW5lIFRBU0tfU0laRQkoUExBVEZPUk1fREVGQVVMVF9NRU1fU1RBUlQgKyBQTEFURk9STV9ERUZBVUxUX01FTV9TSVpFKQorI2RlZmluZSBUQVNLX1NJWkUJX19YVEVOU0FfVUxfQ09OU1QoMHhmZmZmZmZmZikKICNlbmRpZgogCiAjZGVmaW5lIFNUQUNLX1RPUAlUQVNLX1NJWkUKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3N5c21lbS5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc3lzbWVtLmgKaW5kZXggYzAxNWM1Yy4uNTUyY2RmZCAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc3lzbWVtLmgKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc3lzbWVtLmgKQEAgLTExLDI3ICsxMSw4IEBACiAjaWZuZGVmIF9YVEVOU0FfU1lTTUVNX0gKICNkZWZpbmUgX1hURU5TQV9TWVNNRU1fSAogCi0jZGVmaW5lIFNZU01FTV9CQU5LU19NQVggMzEKKyNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgogCi1zdHJ1Y3QgbWVtaW5mbyB7Ci0JdW5zaWduZWQgbG9uZyBzdGFydDsKLQl1bnNpZ25lZCBsb25nIGVuZDsKLX07Ci0KLS8qCi0gKiBCYW5rIGFycmF5IGlzIHNvcnRlZCBieSAuc3RhcnQuCi0gKiBCYW5rcyBkb24ndCBvdmVybGFwIGFuZCB0aGVyZSdzIGF0IGxlYXN0IG9uZSBwYWdlIGdhcAotICogYmV0d2VlbiBhZGphY2VudCBiYW5rIGVudHJpZXMuCi0gKi8KLXN0cnVjdCBzeXNtZW1faW5mbyB7Ci0JaW50IG5yX2JhbmtzOwotCXN0cnVjdCBtZW1pbmZvIGJhbmtbU1lTTUVNX0JBTktTX01BWF07Ci19OwotCi1leHRlcm4gc3RydWN0IHN5c21lbV9pbmZvIHN5c21lbTsKLQotaW50IGFkZF9zeXNtZW1fYmFuayh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7Ci1pbnQgbWVtX3Jlc2VydmUodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgaW50KTsKIHZvaWQgYm9vdG1lbV9pbml0KHZvaWQpOwogdm9pZCB6b25lc19pbml0KHZvaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS92ZWN0b3JzLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS92ZWN0b3JzLmgKaW5kZXggMjg4Yzc3Ni4uNzdkNDFjYyAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdmVjdG9ycy5oCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3ZlY3RvcnMuaApAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8dmFyaWFudC9jb3JlLmg+CiAjaW5jbHVkZSA8cGxhdGZvcm0vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20va21lbV9sYXlvdXQuaD4KIAogI2lmIFhDSEFMX0hBVkVfUFRQX01NVQogI2RlZmluZSBYQ0hBTF9LSU9fQ0FDSEVEX1ZBRERSCQkweGUwMDAwMDAwCkBAIC00Nyw2MSArNDgsNDIgQEAKIAogI2lmIGRlZmluZWQoQ09ORklHX01NVSkKIAotLyogV2lsbCBCZWNvbWUgVkVDQkFTRSAqLwotI2RlZmluZSBWSVJUVUFMX01FTU9SWV9BRERSRVNTCQkweEQwMDAwMDAwCi0KKyNpZiBYQ0hBTF9IQVZFX1BUUF9NTVUgJiYgWENIQUxfSEFWRV9TUEFOTklOR19XQVkKIC8qIEltYWdlIFZpcnR1YWwgU3RhcnQgQWRkcmVzcyAqLwotI2RlZmluZSBLRVJORUxPRkZTRVQJCQkweEQwMDAzMDAwCi0KLSNpZiBkZWZpbmVkKFhDSEFMX0hBVkVfUFRQX01NVSkgJiYgWENIQUxfSEFWRV9QVFBfTU1VICYmIFhDSEFMX0hBVkVfU1BBTk5JTkdfV0FZCi0gIC8qIE1NVSB2MyAgLSBYQ0hBTF9IQVZFX1BUUF9NTVUgID09IDEgKi8KLSAgI2RlZmluZSBMT0FEX01FTU9SWV9BRERSRVNTCQkweDAwMDAzMDAwCisjZGVmaW5lIEtFUk5FTE9GRlNFVAkJCShYQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUiArIFwKKwkJCQkJIENPTkZJR19LRVJORUxfTE9BRF9BRERSRVNTIC0gXAorCQkJCQkgWENIQUxfS1NFR19QQUREUikKICNlbHNlCi0gIC8qIE1NVSBWMiAtICBYQ0hBTF9IQVZFX1BUUF9NTVUgID09IDAgKi8KLSAgI2RlZmluZSBMT0FEX01FTU9SWV9BRERSRVNTCQkweEQwMDAzMDAwCisjZGVmaW5lIEtFUk5FTE9GRlNFVAkJCUNPTkZJR19LRVJORUxfTE9BRF9BRERSRVNTCiAjZW5kaWYKIAotI2RlZmluZSBSRVNFVF9WRUNUT1IxX1ZBRERSCQkoVklSVFVBTF9NRU1PUllfQUREUkVTUyArIFwKLQkJCQkJIFhDSEFMX1JFU0VUX1ZFQ1RPUjFfUEFERFIpCi0KICNlbHNlIC8qICFkZWZpbmVkKENPTkZJR19NTVUpICovCiAgIC8qIE1NVSBOb3QgYmVpbmcgdXNlZCAtIFZpcnR1YWwgPT0gUGh5c2ljYWwgKi8KIAotICAvKiBWRUNCQVNFICovCi0gICNkZWZpbmUgVklSVFVBTF9NRU1PUllfQUREUkVTUwkoUExBVEZPUk1fREVGQVVMVF9NRU1fU1RBUlQgKyAweDIwMDApCisvKiBMb2NhdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhlIGtlcm5lbCB0ZXh0LCBfc3RhcnQgKi8KKyNkZWZpbmUgS0VSTkVMT0ZGU0VUCQkJQ09ORklHX0tFUk5FTF9MT0FEX0FERFJFU1MKIAotICAvKiBMb2NhdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhlIGtlcm5lbCB0ZXh0LCBfc3RhcnQgKi8KLSAgI2RlZmluZSBLRVJORUxPRkZTRVQJCQkoUExBVEZPUk1fREVGQVVMVF9NRU1fU1RBUlQgKyAweDMwMDApCi0KLSAgLyogTG9hZGVkIGp1c3QgYWJvdmUgcG9zc2libHkgbGl2ZSB2ZWN0b3JzICovCi0gICNkZWZpbmUgTE9BRF9NRU1PUllfQUREUkVTUwkJKFBMQVRGT1JNX0RFRkFVTFRfTUVNX1NUQVJUICsgMHgzMDAwKQotCi0jZGVmaW5lIFJFU0VUX1ZFQ1RPUjFfVkFERFIJCShYQ0hBTF9SRVNFVF9WRUNUT1IxX1ZBRERSKQogCiAjZW5kaWYgLyogQ09ORklHX01NVSAqLwogCi0jZGVmaW5lIFhDX1ZBRERSKG9mZnNldCkJCShWSVJUVUFMX01FTU9SWV9BRERSRVNTICArIG9mZnNldCkKLQotLyogVXNlZCB0byBzZXQgVkVDQkFTRSByZWdpc3RlciAqLwotI2RlZmluZSBWRUNCQVNFX1JFU0VUX1ZBRERSCQlWSVJUVUFMX01FTU9SWV9BRERSRVNTCisjZGVmaW5lIFJFU0VUX1ZFQ1RPUjFfVkFERFIJCShYQ0hBTF9SRVNFVF9WRUNUT1IxX1ZBRERSKQorI2RlZmluZSBWRUNCQVNFX1ZBRERSCQkJKEtFUk5FTE9GRlNFVCAtIENPTkZJR19WRUNUT1JTX09GRlNFVCkKIAogI2lmIGRlZmluZWQoWENIQUxfSEFWRV9WRUNCQVNFKSAmJiBYQ0hBTF9IQVZFX1ZFQ0JBU0UKIAotI2RlZmluZSBVU0VSX1ZFQ1RPUl9WQUREUgkJWENfVkFERFIoWENIQUxfVVNFUl9WRUNPRlMpCi0jZGVmaW5lIEtFUk5FTF9WRUNUT1JfVkFERFIJCVhDX1ZBRERSKFhDSEFMX0tFUk5FTF9WRUNPRlMpCi0jZGVmaW5lIERPVUJMRUVYQ19WRUNUT1JfVkFERFIJCVhDX1ZBRERSKFhDSEFMX0RPVUJMRUVYQ19WRUNPRlMpCi0jZGVmaW5lIFdJTkRPV19WRUNUT1JTX1ZBRERSCQlYQ19WQUREUihYQ0hBTF9XSU5ET1dfT0Y0X1ZFQ09GUykKLSNkZWZpbmUgSU5UTEVWRUwyX1ZFQ1RPUl9WQUREUgkJWENfVkFERFIoWENIQUxfSU5UTEVWRUwyX1ZFQ09GUykKLSNkZWZpbmUgSU5UTEVWRUwzX1ZFQ1RPUl9WQUREUgkJWENfVkFERFIoWENIQUxfSU5UTEVWRUwzX1ZFQ09GUykKLSNkZWZpbmUgSU5UTEVWRUw0X1ZFQ1RPUl9WQUREUgkJWENfVkFERFIoWENIQUxfSU5UTEVWRUw0X1ZFQ09GUykKLSNkZWZpbmUgSU5UTEVWRUw1X1ZFQ1RPUl9WQUREUgkJWENfVkFERFIoWENIQUxfSU5UTEVWRUw1X1ZFQ09GUykKLSNkZWZpbmUgSU5UTEVWRUw2X1ZFQ1RPUl9WQUREUgkJWENfVkFERFIoWENIQUxfSU5UTEVWRUw2X1ZFQ09GUykKKyNkZWZpbmUgVkVDVE9SX1ZBRERSKG9mZnNldCkJCShWRUNCQVNFX1ZBRERSICsgb2Zmc2V0KQogCi0jZGVmaW5lIERFQlVHX1ZFQ1RPUl9WQUREUgkJWENfVkFERFIoWENIQUxfREVCVUdfVkVDT0ZTKQotCi0jZGVmaW5lIE5NSV9WRUNUT1JfVkFERFIJCVhDX1ZBRERSKFhDSEFMX05NSV9WRUNPRlMpCi0KLSNkZWZpbmUgSU5UTEVWRUw3X1ZFQ1RPUl9WQUREUgkJWENfVkFERFIoWENIQUxfSU5UTEVWRUw3X1ZFQ09GUykKKyNkZWZpbmUgVVNFUl9WRUNUT1JfVkFERFIJCVZFQ1RPUl9WQUREUihYQ0hBTF9VU0VSX1ZFQ09GUykKKyNkZWZpbmUgS0VSTkVMX1ZFQ1RPUl9WQUREUgkJVkVDVE9SX1ZBRERSKFhDSEFMX0tFUk5FTF9WRUNPRlMpCisjZGVmaW5lIERPVUJMRUVYQ19WRUNUT1JfVkFERFIJCVZFQ1RPUl9WQUREUihYQ0hBTF9ET1VCTEVFWENfVkVDT0ZTKQorI2RlZmluZSBXSU5ET1dfVkVDVE9SU19WQUREUgkJVkVDVE9SX1ZBRERSKFhDSEFMX1dJTkRPV19PRjRfVkVDT0ZTKQorI2RlZmluZSBJTlRMRVZFTDJfVkVDVE9SX1ZBRERSCQlWRUNUT1JfVkFERFIoWENIQUxfSU5UTEVWRUwyX1ZFQ09GUykKKyNkZWZpbmUgSU5UTEVWRUwzX1ZFQ1RPUl9WQUREUgkJVkVDVE9SX1ZBRERSKFhDSEFMX0lOVExFVkVMM19WRUNPRlMpCisjZGVmaW5lIElOVExFVkVMNF9WRUNUT1JfVkFERFIJCVZFQ1RPUl9WQUREUihYQ0hBTF9JTlRMRVZFTDRfVkVDT0ZTKQorI2RlZmluZSBJTlRMRVZFTDVfVkVDVE9SX1ZBRERSCQlWRUNUT1JfVkFERFIoWENIQUxfSU5UTEVWRUw1X1ZFQ09GUykKKyNkZWZpbmUgSU5UTEVWRUw2X1ZFQ1RPUl9WQUREUgkJVkVDVE9SX1ZBRERSKFhDSEFMX0lOVExFVkVMNl9WRUNPRlMpCisjZGVmaW5lIElOVExFVkVMN19WRUNUT1JfVkFERFIJCVZFQ1RPUl9WQUREUihYQ0hBTF9JTlRMRVZFTDdfVkVDT0ZTKQorI2RlZmluZSBERUJVR19WRUNUT1JfVkFERFIJCVZFQ1RPUl9WQUREUihYQ0hBTF9ERUJVR19WRUNPRlMpCiAKIC8qCiAgKiBUaGVzZSBYQ0hBTF8qICNkZWZpbmVzIGZyb20gdmFyaWFuL2NvcmUuaApAQCAtMTA5LDcgKzkxLDYgQEAKICAqIGNvbnN0YW50cyBhcmUgZGVmaW5lZCBhYm92ZSBhbmQgc2hvdWxkIGJlIHVzZWQuCiAgKi8KICN1bmRlZiAgWENIQUxfVkVDQkFTRV9SRVNFVF9WQUREUgotI3VuZGVmICBYQ0hBTF9SRVNFVF9WRUNUT1IwX1ZBRERSCiAjdW5kZWYgIFhDSEFMX1VTRVJfVkVDVE9SX1ZBRERSCiAjdW5kZWYgIFhDSEFMX0tFUk5FTF9WRUNUT1JfVkFERFIKICN1bmRlZiAgWENIQUxfRE9VQkxFRVhDX1ZFQ1RPUl9WQUREUgpAQCAtMTE5LDkgKzEwMCw4IEBACiAjdW5kZWYgIFhDSEFMX0lOVExFVkVMNF9WRUNUT1JfVkFERFIKICN1bmRlZiAgWENIQUxfSU5UTEVWRUw1X1ZFQ1RPUl9WQUREUgogI3VuZGVmICBYQ0hBTF9JTlRMRVZFTDZfVkVDVE9SX1ZBRERSCi0jdW5kZWYgIFhDSEFMX0RFQlVHX1ZFQ1RPUl9WQUREUgotI3VuZGVmICBYQ0hBTF9OTUlfVkVDVE9SX1ZBRERSCiAjdW5kZWYgIFhDSEFMX0lOVExFVkVMN19WRUNUT1JfVkFERFIKKyN1bmRlZiAgWENIQUxfREVCVUdfVkVDVE9SX1ZBRERSCiAKICNlbHNlCiAKQEAgLTEzNCw2ICsxMTQsNyBAQAogI2RlZmluZSBJTlRMRVZFTDRfVkVDVE9SX1ZBRERSCQlYQ0hBTF9JTlRMRVZFTDRfVkVDVE9SX1ZBRERSCiAjZGVmaW5lIElOVExFVkVMNV9WRUNUT1JfVkFERFIJCVhDSEFMX0lOVExFVkVMNV9WRUNUT1JfVkFERFIKICNkZWZpbmUgSU5UTEVWRUw2X1ZFQ1RPUl9WQUREUgkJWENIQUxfSU5UTEVWRUw2X1ZFQ1RPUl9WQUREUgorI2RlZmluZSBJTlRMRVZFTDdfVkVDVE9SX1ZBRERSCQlYQ0hBTF9JTlRMRVZFTDZfVkVDVE9SX1ZBRERSCiAjZGVmaW5lIERFQlVHX1ZFQ1RPUl9WQUREUgkJWENIQUxfREVCVUdfVkVDVE9SX1ZBRERSCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvaW5jbHVkZS91YXBpL2FzbS90eXBlcy5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS91YXBpL2FzbS90eXBlcy5oCmluZGV4IDg3ZWM3YWUuLjJlZmM5MjEgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2luY2x1ZGUvdWFwaS9hc20vdHlwZXMuaAorKysgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL3VhcGkvYXNtL3R5cGVzLmgKQEAgLTE4LDcgKzE4LDggQEAKICMgZGVmaW5lIF9fWFRFTlNBX1VMX0NPTlNUKHgpCXgKICNlbHNlCiAjIGRlZmluZSBfX1hURU5TQV9VTCh4KQkJKCh1bnNpZ25lZCBsb25nKSh4KSkKLSMgZGVmaW5lIF9fWFRFTlNBX1VMX0NPTlNUKHgpCXgjI1VMCisjIGRlZmluZSBfX19YVEVOU0FfVUxfQ09OU1QoeCkJeCMjVUwKKyMgZGVmaW5lIF9fWFRFTlNBX1VMX0NPTlNUKHgpCV9fX1hURU5TQV9VTF9DT05TVCh4KQogI2VuZGlmCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL3VhcGkvYXNtL3VuaXN0ZC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS91YXBpL2FzbS91bmlzdGQuaAppbmRleCBiOTVjMzA1Li5kZTliMTRiIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL3VhcGkvYXNtL3VuaXN0ZC5oCisrKyBiL2FyY2gveHRlbnNhL2luY2x1ZGUvdWFwaS9hc20vdW5pc3RkLmgKQEAgLTc1NCw3ICs3NTQsMjAgQEAKICNkZWZpbmUgX19OUl9leGVjdmVhdAkJCQkzNDEKIF9fU1lTQ0FMTCgzNDEsIHN5c19leGVjdmVhdCwgNSkKIAotI2RlZmluZSBfX05SX3N5c2NhbGxfY291bnQJCQkzNDIKKyNkZWZpbmUgX19OUl91c2VyZmF1bHRmZAkJCTM0MgorX19TWVNDQUxMKDM0Miwgc3lzX3VzZXJmYXVsdGZkLCAxKQorI2RlZmluZSBfX05SX21lbWJhcnJpZXIJCQkJMzQzCitfX1NZU0NBTEwoMzQzLCBzeXNfbWVtYmFycmllciwgMikKKyNkZWZpbmUgX19OUl9tbG9jazIJCQkJMzQ0CitfX1NZU0NBTEwoMzQ0LCBzeXNfbWxvY2syLCAzKQorI2RlZmluZSBfX05SX2NvcHlfZmlsZV9yYW5nZQkJCTM0NQorX19TWVNDQUxMKDM0NSwgc3lzX2NvcHlfZmlsZV9yYW5nZSwgNikKKyNkZWZpbmUgX19OUl9wcmVhZHYyCQkJCTM0NgorX19TWVNDQUxMKDM0Niwgc3lzX3ByZWFkdjIsIDYpCisjZGVmaW5lIF9fTlJfcHdyaXRldjIJCQkJMzQ3CitfX1NZU0NBTEwoMzQ3LCBzeXNfcHdyaXRldjIsIDYpCisKKyNkZWZpbmUgX19OUl9zeXNjYWxsX2NvdW50CQkJMzQ4CiAKIC8qCiAgKiBzeXN4dGVuc2Egc3lzY2FsbCBoYW5kbGVyCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvZW50cnkuUyBiL2FyY2gveHRlbnNhL2tlcm5lbC9lbnRyeS5TCmluZGV4IGZlOGY3ZTcuLmZhMDRkOWQgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9lbnRyeS5TCkBAIC0xNjMyLDEwICsxNjMyLDExIEBACiAJICogVGhlIG1lc3N5IGNvbXB1dGF0aW9uIGZvciAncHRldmFsJyBhYm92ZSByZWFsbHkgc2ltcGxpZmllcwogCSAqIGludG8gdGhlIGZvbGxvd2luZzoKIAkgKgotCSAqIHB0ZXZhbCA9ICgocG1kdmFsIC0gUEFHRV9PRkZTRVQpICYgUEFHRV9NQVNLKSB8IFBBR0VfRElSRUNUT1JZCisJICogcHRldmFsID0gKChwbWR2YWwgLSBQQUdFX09GRlNFVCArIFBIWVNfT0ZGU0VUKSAmIFBBR0VfTUFTSykKKwkgKiAgICAgICAgICAgICAgICAgfCBQQUdFX0RJUkVDVE9SWQogCSAqLwogCi0JbW92aQlhMSwgKC1QQUdFX09GRlNFVCkgJiAweGZmZmZmZmZmCisJbW92aQlhMSwgKFBIWVNfT0ZGU0VUIC0gUEFHRV9PRkZTRVQpICYgMHhmZmZmZmZmZgogCWFkZAlhMCwgYTAsIGExCQkjIHBtZHZhbCAtIFBBR0VfT0ZGU0VUCiAJZXh0dWkJYTEsIGEwLCAwLCBQQUdFX1NISUZUCSMgLi4uICYgUEFHRV9NQVNLCiAJeG9yCWEwLCBhMCwgYTEKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9oZWFkLlMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvaGVhZC5TCmluZGV4IGJjNGY0YmYuLjIzY2U2MmUgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL2hlYWQuUwpAQCAtMTEzLDcgKzExMyw3IEBACiAJbW92aQlhMCwgMAogCiAjaWYgWENIQUxfSEFWRV9WRUNCQVNFCi0JbW92aSAgICBhMiwgVkVDQkFTRV9SRVNFVF9WQUREUgorCW1vdmkgICAgYTIsIFZFQ0JBU0VfVkFERFIKIAl3c3IJYTIsIHZlY2Jhc2UKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvc2V0dXAuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC9zZXR1cC5jCmluZGV4IDE0MzI1MWUuLjg4YTA0NGEgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9zZXR1cC5jCkBAIC03LDYgKzcsNyBAQAogICoKICAqIENvcHlyaWdodCAoQykgMTk5NSAgTGludXMgVG9ydmFsZHMKICAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgIFRlbnNpbGljYSBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgLSAyMDE2ICBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zIEluYy4KICAqCiAgKiBDaHJpcyBaYW5rZWwJPGNocmlzQHphbmtlbC5uZXQ+CiAgKiBKb2UgVGF5bG9yCTxqb2VAdGVuc2lsaWNhLmNvbSwgam9ldHlsckB5YWhvby5jb20+CkBAIC0yMiw3ICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZmR0Lmg+CkBAIC0xMTQsNyArMTE0LDcgQEAKIAlpZiAobWktPnR5cGUgIT0gTUVNT1JZX1RZUEVfQ09OVkVOVElPTkFMKQogCQlyZXR1cm4gLTE7CiAKLQlyZXR1cm4gYWRkX3N5c21lbV9iYW5rKG1pLT5zdGFydCwgbWktPmVuZCk7CisJcmV0dXJuIG1lbWJsb2NrX2FkZChtaS0+c3RhcnQsIG1pLT5lbmQgLSBtaS0+c3RhcnQpOwogfQogCiBfX3RhZ3RhYmxlKEJQX1RBR19NRU1PUlksIHBhcnNlX3RhZ19tZW0pOwpAQCAtMTg4LDcgKzE4OCw2IEBACiB9CiAKICNpZmRlZiBDT05GSUdfT0YKLWJvb2wgX19pbml0ZGF0YSBkdF9tZW1vcnlfc2NhbiA9IGZhbHNlOwogCiAjaWYgIVhDSEFMX0hBVkVfUFRQX01NVSB8fCBYQ0hBTF9IQVZFX1NQQU5OSU5HX1dBWQogdW5zaWduZWQgbG9uZyB4dGVuc2Ffa2lvX3BhZGRyID0gWENIQUxfS0lPX0RFRkFVTFRfUEFERFI7CkBAIC0yMjgsMTEgKzIyNyw4IEBACiAKIHZvaWQgX19pbml0IGVhcmx5X2luaXRfZHRfYWRkX21lbW9yeV9hcmNoKHU2NCBiYXNlLCB1NjQgc2l6ZSkKIHsKLQlpZiAoIWR0X21lbW9yeV9zY2FuKQotCQlyZXR1cm47Ci0KIAlzaXplICY9IFBBR0VfTUFTSzsKLQlhZGRfc3lzbWVtX2JhbmsoYmFzZSwgYmFzZSArIHNpemUpOworCW1lbWJsb2NrX2FkZChiYXNlLCBzaXplKTsKIH0KIAogdm9pZCAqIF9faW5pdCBlYXJseV9pbml0X2R0X2FsbG9jX21lbW9yeV9hcmNoKHU2NCBzaXplLCB1NjQgYWxpZ24pCkBAIC0yNDIsOSArMjM4LDYgQEAKIAogdm9pZCBfX2luaXQgZWFybHlfaW5pdF9kZXZ0cmVlKHZvaWQgKnBhcmFtcykKIHsKLQlpZiAoc3lzbWVtLm5yX2JhbmtzID09IDApCi0JCWR0X21lbW9yeV9zY2FuID0gdHJ1ZTsKLQogCWVhcmx5X2luaXRfZHRfc2NhbihwYXJhbXMpOwogCW9mX3NjYW5fZmxhdF9kdCh4dGVuc2FfZHRfaW9fYXJlYSwgTlVMTCk7CiAKQEAgLTI1MiwxNCArMjQ1LDYgQEAKIAkJc3RybGNweShjb21tYW5kX2xpbmUsIGJvb3RfY29tbWFuZF9saW5lLCBDT01NQU5EX0xJTkVfU0laRSk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHh0ZW5zYV9kZXZpY2VfcHJvYmUodm9pZCkKLXsKLQlvZl9jbGtfaW5pdChOVUxMKTsKLQlyZXR1cm4gMDsKLX0KLQotZGV2aWNlX2luaXRjYWxsKHh0ZW5zYV9kZXZpY2VfcHJvYmUpOwotCiAjZW5kaWYgLyogQ09ORklHX09GICovCiAKIC8qCkBAIC0yNzcsMTIgKzI2Miw2IEBACiAJZWFybHlfaW5pdF9kZXZ0cmVlKGR0Yl9zdGFydCk7CiAjZW5kaWYKIAotCWlmIChzeXNtZW0ubnJfYmFua3MgPT0gMCkgewotCQlhZGRfc3lzbWVtX2JhbmsoUExBVEZPUk1fREVGQVVMVF9NRU1fU1RBUlQsCi0JCQkJUExBVEZPUk1fREVGQVVMVF9NRU1fU1RBUlQgKwotCQkJCVBMQVRGT1JNX0RFRkFVTFRfTUVNX1NJWkUpOwotCX0KLQogI2lmZGVmIENPTkZJR19DTURMSU5FX0JPT0wKIAlpZiAoIWNvbW1hbmRfbGluZVswXSkKIAkJc3RybGNweShjb21tYW5kX2xpbmUsIGRlZmF1bHRfY29tbWFuZF9saW5lLCBDT01NQU5EX0xJTkVfU0laRSk7CkBAIC00NTIsNiArNDMxLDEwIEBACiBlYXJseV9pbml0Y2FsbChjaGVja19zMzJjMWkpOwogI2VuZGlmIC8qIENPTkZJR19TMzJDMUlfU0VMRlRFU1QgKi8KIAorc3RhdGljIGlubGluZSBpbnQgbWVtX3Jlc2VydmUodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJcmV0dXJuIG1lbWJsb2NrX3Jlc2VydmUoc3RhcnQsIGVuZCAtIHN0YXJ0KTsKK30KIAogdm9pZCBfX2luaXQgc2V0dXBfYXJjaChjaGFyICoqY21kbGluZV9wKQogewpAQCAtNDYzLDU0ICs0NDYsNTQgQEAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKIAlpZiAoaW5pdHJkX3N0YXJ0IDwgaW5pdHJkX2VuZCkgewogCQlpbml0cmRfaXNfbWFwcGVkID0gbWVtX3Jlc2VydmUoX19wYShpbml0cmRfc3RhcnQpLAotCQkJCQkgICAgICAgX19wYShpbml0cmRfZW5kKSwgMCkgPT0gMDsKKwkJCQkJICAgICAgIF9fcGEoaW5pdHJkX2VuZCkpID09IDA7CiAJCWluaXRyZF9iZWxvd19zdGFydF9vayA9IDE7CiAJfSBlbHNlIHsKIAkJaW5pdHJkX3N0YXJ0ID0gMDsKIAl9CiAjZW5kaWYKIAotCW1lbV9yZXNlcnZlKF9fcGEoJl9zdGV4dCksX19wYSgmX2VuZCksIDEpOworCW1lbV9yZXNlcnZlKF9fcGEoJl9zdGV4dCksIF9fcGEoJl9lbmQpKTsKIAogCW1lbV9yZXNlcnZlKF9fcGEoJl9XaW5kb3dWZWN0b3JzX3RleHRfc3RhcnQpLAotCQkgICAgX19wYSgmX1dpbmRvd1ZlY3RvcnNfdGV4dF9lbmQpLCAwKTsKKwkJICAgIF9fcGEoJl9XaW5kb3dWZWN0b3JzX3RleHRfZW5kKSk7CiAKIAltZW1fcmVzZXJ2ZShfX3BhKCZfRGVidWdJbnRlcnJ1cHRWZWN0b3JfbGl0ZXJhbF9zdGFydCksCi0JCSAgICBfX3BhKCZfRGVidWdJbnRlcnJ1cHRWZWN0b3JfdGV4dF9lbmQpLCAwKTsKKwkJICAgIF9fcGEoJl9EZWJ1Z0ludGVycnVwdFZlY3Rvcl90ZXh0X2VuZCkpOwogCiAJbWVtX3Jlc2VydmUoX19wYSgmX0tlcm5lbEV4Y2VwdGlvblZlY3Rvcl9saXRlcmFsX3N0YXJ0KSwKLQkJICAgIF9fcGEoJl9LZXJuZWxFeGNlcHRpb25WZWN0b3JfdGV4dF9lbmQpLCAwKTsKKwkJICAgIF9fcGEoJl9LZXJuZWxFeGNlcHRpb25WZWN0b3JfdGV4dF9lbmQpKTsKIAogCW1lbV9yZXNlcnZlKF9fcGEoJl9Vc2VyRXhjZXB0aW9uVmVjdG9yX2xpdGVyYWxfc3RhcnQpLAotCQkgICAgX19wYSgmX1VzZXJFeGNlcHRpb25WZWN0b3JfdGV4dF9lbmQpLCAwKTsKKwkJICAgIF9fcGEoJl9Vc2VyRXhjZXB0aW9uVmVjdG9yX3RleHRfZW5kKSk7CiAKIAltZW1fcmVzZXJ2ZShfX3BhKCZfRG91YmxlRXhjZXB0aW9uVmVjdG9yX2xpdGVyYWxfc3RhcnQpLAotCQkgICAgX19wYSgmX0RvdWJsZUV4Y2VwdGlvblZlY3Rvcl90ZXh0X2VuZCksIDApOworCQkgICAgX19wYSgmX0RvdWJsZUV4Y2VwdGlvblZlY3Rvcl90ZXh0X2VuZCkpOwogCiAjaWYgWENIQUxfRVhDTV9MRVZFTCA+PSAyCiAJbWVtX3Jlc2VydmUoX19wYSgmX0xldmVsMkludGVycnVwdFZlY3Rvcl90ZXh0X3N0YXJ0KSwKLQkJICAgIF9fcGEoJl9MZXZlbDJJbnRlcnJ1cHRWZWN0b3JfdGV4dF9lbmQpLCAwKTsKKwkJICAgIF9fcGEoJl9MZXZlbDJJbnRlcnJ1cHRWZWN0b3JfdGV4dF9lbmQpKTsKICNlbmRpZgogI2lmIFhDSEFMX0VYQ01fTEVWRUwgPj0gMwogCW1lbV9yZXNlcnZlKF9fcGEoJl9MZXZlbDNJbnRlcnJ1cHRWZWN0b3JfdGV4dF9zdGFydCksCi0JCSAgICBfX3BhKCZfTGV2ZWwzSW50ZXJydXB0VmVjdG9yX3RleHRfZW5kKSwgMCk7CisJCSAgICBfX3BhKCZfTGV2ZWwzSW50ZXJydXB0VmVjdG9yX3RleHRfZW5kKSk7CiAjZW5kaWYKICNpZiBYQ0hBTF9FWENNX0xFVkVMID49IDQKIAltZW1fcmVzZXJ2ZShfX3BhKCZfTGV2ZWw0SW50ZXJydXB0VmVjdG9yX3RleHRfc3RhcnQpLAotCQkgICAgX19wYSgmX0xldmVsNEludGVycnVwdFZlY3Rvcl90ZXh0X2VuZCksIDApOworCQkgICAgX19wYSgmX0xldmVsNEludGVycnVwdFZlY3Rvcl90ZXh0X2VuZCkpOwogI2VuZGlmCiAjaWYgWENIQUxfRVhDTV9MRVZFTCA+PSA1CiAJbWVtX3Jlc2VydmUoX19wYSgmX0xldmVsNUludGVycnVwdFZlY3Rvcl90ZXh0X3N0YXJ0KSwKLQkJICAgIF9fcGEoJl9MZXZlbDVJbnRlcnJ1cHRWZWN0b3JfdGV4dF9lbmQpLCAwKTsKKwkJICAgIF9fcGEoJl9MZXZlbDVJbnRlcnJ1cHRWZWN0b3JfdGV4dF9lbmQpKTsKICNlbmRpZgogI2lmIFhDSEFMX0VYQ01fTEVWRUwgPj0gNgogCW1lbV9yZXNlcnZlKF9fcGEoJl9MZXZlbDZJbnRlcnJ1cHRWZWN0b3JfdGV4dF9zdGFydCksCi0JCSAgICBfX3BhKCZfTGV2ZWw2SW50ZXJydXB0VmVjdG9yX3RleHRfZW5kKSwgMCk7CisJCSAgICBfX3BhKCZfTGV2ZWw2SW50ZXJydXB0VmVjdG9yX3RleHRfZW5kKSk7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TTVAKIAltZW1fcmVzZXJ2ZShfX3BhKCZfU2Vjb25kYXJ5UmVzZXRWZWN0b3JfdGV4dF9zdGFydCksCi0JCSAgICBfX3BhKCZfU2Vjb25kYXJ5UmVzZXRWZWN0b3JfdGV4dF9lbmQpLCAwKTsKKwkJICAgIF9fcGEoJl9TZWNvbmRhcnlSZXNldFZlY3Rvcl90ZXh0X2VuZCkpOwogI2VuZGlmCiAJcGFyc2VfZWFybHlfcGFyYW0oKTsKIAlib290bWVtX2luaXQoKTsKQEAgLTU1NSw2ICs1MzgsMTM3IEBACiB9CiBzdWJzeXNfaW5pdGNhbGwodG9wb2xvZ3lfaW5pdCk7CiAKK3ZvaWQgY3B1X3Jlc2V0KHZvaWQpCit7CisjaWYgWENIQUxfSEFWRV9QVFBfTU1VCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkvKgorCSAqIFdlIGhhdmUgZnVsbCBNTVU6IGFsbCBhdXRvbG9hZCB3YXlzLCB3YXlzIDcsIDggYW5kIDkgb2YgRFRMQiBtdXN0CisJICogYmUgZmx1c2hlZC4KKwkgKiBXYXkgNCBpcyBub3QgY3VycmVudGx5IHVzZWQgYnkgbGludXguCisJICogV2F5cyA1IGFuZCA2IHNoYWxsIG5vdCBiZSB0b3VjaGVkIG9uIE1NVXYyIGFzIHRoZXkgYXJlIGhhcmR3aXJlZC4KKwkgKiBXYXkgNSBzaGFsbCBiZSBmbHVzaGVkIGFuZCB3YXkgNiBzaGFsbCBiZSBzZXQgdG8gaWRlbnRpdHkgbWFwcGluZworCSAqIG9uIE1NVXYzLgorCSAqLworCWxvY2FsX2ZsdXNoX3RsYl9hbGwoKTsKKwlpbnZhbGlkYXRlX3BhZ2VfZGlyZWN0b3J5KCk7CisjaWYgWENIQUxfSEFWRV9TUEFOTklOR19XQVkKKwkvKiBNTVUgdjMgKi8KKwl7CisJCXVuc2lnbmVkIGxvbmcgdmFkZHIgPSAodW5zaWduZWQgbG9uZyljcHVfcmVzZXQ7CisJCXVuc2lnbmVkIGxvbmcgcGFkZHIgPSBfX3BhKHZhZGRyKTsKKwkJdW5zaWduZWQgbG9uZyB0bXBhZGRyID0gdmFkZHIgKyBTWl81MTJNOworCQl1bnNpZ25lZCBsb25nIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CisKKwkJLyoKKwkJICogRmluZCBhIHBsYWNlIGZvciB0aGUgdGVtcG9yYXJ5IG1hcHBpbmcuIEl0IG11c3Qgbm90IGJlCisJCSAqIGluIHRoZSBzYW1lIDUxMk1CIHJlZ2lvbiB3aXRoIHZhZGRyIG9yIHBhZGRyLCBvdGhlcndpc2UKKwkJICogdGhlcmUgbWF5IGJlIG11bHRpaGl0IGV4Y2VwdGlvbiBlaXRoZXIgb24gZW50cnkgdG8gdGhlCisJCSAqIHRlbXBvcmFyeSBtYXBwaW5nLCBvciBvbiBlbnRyeSB0byB0aGUgaWRlbnRpdHkgbWFwcGluZy4KKwkJICogKDUxMk1CIGlzIHRoZSBiaWdnZXN0IHBhZ2Ugc2l6ZSBzdXBwb3J0ZWQgYnkgVExCLikKKwkJICovCisJCXdoaWxlICgoKHRtcGFkZHIgXiBwYWRkcikgJiAtU1pfNTEyTSkgPT0gMCkKKwkJCXRtcGFkZHIgKz0gU1pfNTEyTTsKKworCQkvKiBJbnZhbGlkYXRlIG1hcHBpbmcgaW4gdGhlIHNlbGVjdGVkIHRlbXBvcmFyeSBhcmVhICovCisJCWlmIChpdGxiX3Byb2JlKHRtcGFkZHIpICYgMHg4KQorCQkJaW52YWxpZGF0ZV9pdGxiX2VudHJ5KGl0bGJfcHJvYmUodG1wYWRkcikpOworCQlpZiAoaXRsYl9wcm9iZSh0bXBhZGRyICsgUEFHRV9TSVpFKSAmIDB4OCkKKwkJCWludmFsaWRhdGVfaXRsYl9lbnRyeShpdGxiX3Byb2JlKHRtcGFkZHIgKyBQQUdFX1NJWkUpKTsKKworCQkvKgorCQkgKiBNYXAgdHdvIGNvbnNlY3V0aXZlIHBhZ2VzIHN0YXJ0aW5nIGF0IHRoZSBwaHlzaWNhbCBhZGRyZXNzCisJCSAqIG9mIHRoaXMgZnVuY3Rpb24gdG8gdGhlIHRlbXBvcmFyeSBtYXBwaW5nIGFyZWEuCisJCSAqLworCQl3cml0ZV9pdGxiX2VudHJ5KF9fcHRlKChwYWRkciAmIFBBR0VfTUFTSykgfAorCQkJCSAgICAgICBfUEFHRV9IV19WQUxJRCB8CisJCQkJICAgICAgIF9QQUdFX0hXX0VYRUMgfAorCQkJCSAgICAgICBfUEFHRV9DQV9CWVBBU1MpLAorCQkJCSB0bXBhZGRyICYgUEFHRV9NQVNLKTsKKwkJd3JpdGVfaXRsYl9lbnRyeShfX3B0ZSgoKHBhZGRyICYgUEFHRV9NQVNLKSArIFBBR0VfU0laRSkgfAorCQkJCSAgICAgICBfUEFHRV9IV19WQUxJRCB8CisJCQkJICAgICAgIF9QQUdFX0hXX0VYRUMgfAorCQkJCSAgICAgICBfUEFHRV9DQV9CWVBBU1MpLAorCQkJCSAodG1wYWRkciAmIFBBR0VfTUFTSykgKyBQQUdFX1NJWkUpOworCisJCS8qIFJlaW5pdGlhbGl6ZSBUTEIgKi8KKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZpCSUwLCAxZlxuXHQiCisJCQkJICAgICAgIm1vdmkJJTMsIDJmXG5cdCIKKwkJCQkgICAgICAiYWRkCSUwLCAlMCwgJTRcblx0IgorCQkJCSAgICAgICJhZGQJJTMsICUzLCAlNVxuXHQiCisJCQkJICAgICAgImp4CSUwXG4iCisJCQkJICAgICAgLyoKKwkJCQkgICAgICAgKiBObyBsaXRlcmFsLCBkYXRhIG9yIHN0YWNrIGFjY2VzcworCQkJCSAgICAgICAqIGJlbG93IHRoaXMgcG9pbnQKKwkJCQkgICAgICAgKi8KKwkJCQkgICAgICAiMTpcblx0IgorCQkJCSAgICAgIC8qIEluaXRpYWxpemUgKnRsYmNmZyAqLworCQkJCSAgICAgICJtb3ZpCSUwLCAwXG5cdCIKKwkJCQkgICAgICAid3NyCSUwLCBpdGxiY2ZnXG5cdCIKKwkJCQkgICAgICAid3NyCSUwLCBkdGxiY2ZnXG5cdCIKKwkJCQkgICAgICAvKiBJbnZhbGlkYXRlIFRMQiB3YXkgNSAqLworCQkJCSAgICAgICJtb3ZpCSUwLCA0XG5cdCIKKwkJCQkgICAgICAibW92aQklMSwgNVxuIgorCQkJCSAgICAgICIxOlxuXHQiCisJCQkJICAgICAgImlpdGxiCSUxXG5cdCIKKwkJCQkgICAgICAiaWR0bGIJJTFcblx0IgorCQkJCSAgICAgICJhZGQJJTEsICUxLCAlNlxuXHQiCisJCQkJICAgICAgImFkZGkJJTAsICUwLCAtMVxuXHQiCisJCQkJICAgICAgImJuZXoJJTAsIDFiXG5cdCIKKwkJCQkgICAgICAvKiBJbml0aWFsaXplIFRMQiB3YXkgNiAqLworCQkJCSAgICAgICJtb3ZpCSUwLCA3XG5cdCIKKwkJCQkgICAgICAiYWRkaQklMSwgJTksIDNcblx0IgorCQkJCSAgICAgICJhZGRpCSUyLCAlOSwgNlxuIgorCQkJCSAgICAgICIxOlxuXHQiCisJCQkJICAgICAgIndpdGxiCSUxLCAlMlxuXHQiCisJCQkJICAgICAgIndkdGxiCSUxLCAlMlxuXHQiCisJCQkJICAgICAgImFkZAklMSwgJTEsICU3XG5cdCIKKwkJCQkgICAgICAiYWRkCSUyLCAlMiwgJTdcblx0IgorCQkJCSAgICAgICJhZGRpCSUwLCAlMCwgLTFcblx0IgorCQkJCSAgICAgICJibmV6CSUwLCAxYlxuXHQiCisJCQkJICAgICAgLyogSnVtcCB0byBpZGVudGl0eSBtYXBwaW5nICovCisJCQkJICAgICAgImp4CSUzXG4iCisJCQkJICAgICAgIjI6XG5cdCIKKwkJCQkgICAgICAvKiBDb21wbGV0ZSB3YXkgNiBpbml0aWFsaXphdGlvbiAqLworCQkJCSAgICAgICJ3aXRsYgklMSwgJTJcblx0IgorCQkJCSAgICAgICJ3ZHRsYgklMSwgJTJcblx0IgorCQkJCSAgICAgIC8qIEludmFsaWRhdGUgdGVtcG9yYXJ5IG1hcHBpbmcgKi8KKwkJCQkgICAgICAic3ViCSUwLCAlOSwgJTdcblx0IgorCQkJCSAgICAgICJpaXRsYgklMFxuXHQiCisJCQkJICAgICAgImFkZAklMCwgJTAsICU4XG5cdCIKKwkJCQkgICAgICAiaWl0bGIJJTAiCisJCQkJICAgICAgOiAiPSZhIih0bXAwKSwgIj0mYSIodG1wMSksICI9JmEiKHRtcDIpLAorCQkJCQkiPSZhIih0bXAzKQorCQkJCSAgICAgIDogImEiKHRtcGFkZHIgLSB2YWRkciksCisJCQkJCSJhIihwYWRkciAtIHZhZGRyKSwKKwkJCQkJImEiKFNaXzEyOE0pLCAiYSIoU1pfNTEyTSksCisJCQkJCSJhIihQQUdFX1NJWkUpLAorCQkJCQkiYSIoKHRtcGFkZHIgKyBTWl81MTJNKSAmIFBBR0VfTUFTSykKKwkJCQkgICAgICA6ICJtZW1vcnkiKTsKKwl9CisjZW5kaWYKKyNlbmRpZgorCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92aQlhMiwgMFxuXHQiCisJCQkgICAgICAid3NyCWEyLCBpY291bnRsZXZlbFxuXHQiCisJCQkgICAgICAibW92aQlhMiwgMFxuXHQiCisJCQkgICAgICAid3NyCWEyLCBpY291bnRcblx0IgorI2lmIFhDSEFMX05VTV9JQlJFQUsgPiAwCisJCQkgICAgICAid3NyCWEyLCBpYnJlYWtlbmFibGVcblx0IgorI2VuZGlmCisjaWYgWENIQUxfSEFWRV9MT09QUworCQkJICAgICAgIndzcglhMiwgbGNvdW50XG5cdCIKKyNlbmRpZgorCQkJICAgICAgIm1vdmkJYTIsIDB4MWZcblx0IgorCQkJICAgICAgIndzcglhMiwgcHNcblx0IgorCQkJICAgICAgImlzeW5jXG5cdCIKKwkJCSAgICAgICJqeAklMFxuXHQiCisJCQkgICAgICA6CisJCQkgICAgICA6ICJhIiAoWENIQUxfUkVTRVRfVkVDVE9SX1ZBRERSKQorCQkJICAgICAgOiAiYTIiKTsKKwlmb3IgKDs7KQorCQk7Cit9CisKIHZvaWQgbWFjaGluZV9yZXN0YXJ0KGNoYXIgKiBjbWQpCiB7CiAJcGxhdGZvcm1fcmVzdGFydCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3RpbWUuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC90aW1lLmMKaW5kZXggYjlhZDlmZS4uOWE1YmNkMCAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvdGltZS5jCkBAIC0xMiw2ICsxMiw4IEBACiAgKiBDaHJpcyBaYW5rZWwgPGNocmlzQHphbmtlbC5uZXQ+CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CkBAIC0xMzQsMTYgKzEzNiw1MiBAQAogCQkJCQkweGYsIDB4ZmZmZmZmZmYpOwogfQogCisjaWZkZWYgQ09ORklHX1hURU5TQV9DQUxJQlJBVEVfQ0NPVU5UCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgdm9pZCBfX2luaXQgY2FsaWJyYXRlX2Njb3VudCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1OworCXN0cnVjdCBjbGsgKmNsazsKKworCWNwdSA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJjZG5zLHh0ZW5zYS1jcHUiKTsKKwlpZiAoY3B1KSB7CisJCWNsayA9IG9mX2Nsa19nZXQoY3B1LCAwKTsKKwkJaWYgKCFJU19FUlIoY2xrKSkgeworCQkJY2NvdW50X2ZyZXEgPSBjbGtfZ2V0X3JhdGUoY2xrKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCXByX3dhcm4oIiVzOiBDUFUgaW5wdXQgY2xvY2sgbm90IGZvdW5kXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJfQorCX0gZWxzZSB7CisJCXByX3dhcm4oIiVzOiBDUFUgbm9kZSBub3QgZm91bmQgaW4gdGhlIGRldmljZSB0cmVlXG4iLAorCQkJX19mdW5jX18pOworCX0KKworCXBsYXRmb3JtX2NhbGlicmF0ZV9jY291bnQoKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgY2FsaWJyYXRlX2Njb3VudCh2b2lkKQoreworCXBsYXRmb3JtX2NhbGlicmF0ZV9jY291bnQoKTsKK30KKyNlbmRpZgorI2VuZGlmCisKIHZvaWQgX19pbml0IHRpbWVfaW5pdCh2b2lkKQogeworCW9mX2Nsa19pbml0KE5VTEwpOwogI2lmZGVmIENPTkZJR19YVEVOU0FfQ0FMSUJSQVRFX0NDT1VOVAogCXByaW50aygiQ2FsaWJyYXRpbmcgQ1BVIGZyZXF1ZW5jeSAiKTsKLQlwbGF0Zm9ybV9jYWxpYnJhdGVfY2NvdW50KCk7CisJY2FsaWJyYXRlX2Njb3VudCgpOwogCXByaW50aygiJWQuJTAyZCBNSHpcbiIsIChpbnQpY2NvdW50X2ZyZXEvMTAwMDAwMCwKIAkJCShpbnQpKGNjb3VudF9mcmVxLzEwMDAwKSUxMDApOwogI2Vsc2UKIAljY291bnRfZnJlcSA9IENPTkZJR19YVEVOU0FfQ1BVX0NMT0NLKjEwMDAwMDBVTDsKICNlbmRpZgorCVdBUk4oIWNjb3VudF9mcmVxLAorCSAgICAgIiVzOiBDUFUgY2xvY2sgZnJlcXVlbmN5IGlzIG5vdCBzZXQgdXAgY29ycmVjdGx5XG4iLAorCSAgICAgX19mdW5jX18pOwogCWNsb2Nrc291cmNlX3JlZ2lzdGVyX2h6KCZjY291bnRfY2xvY2tzb3VyY2UsIGNjb3VudF9mcmVxKTsKIAlsb2NhbF90aW1lcl9zZXR1cCgwKTsKIAlzZXR1cF9pcnEodGhpc19jcHVfcHRyKCZjY291bnRfdGltZXIpLT5ldnQuaXJxLCAmdGltZXJfaXJxYWN0aW9uKTsKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC94dGVuc2Eva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggYzQxN2NiZS4uNzJjZmUzNSAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTMwLDEwICszMCw2IEBACiBqaWZmaWVzID0gamlmZmllc182NDsKICNlbmRpZgogCi0jaWZuZGVmIEtFUk5FTE9GRlNFVAotI2RlZmluZSBLRVJORUxPRkZTRVQgMHhkMDAwMzAwMAotI2VuZGlmCi0KIC8qIE5vdGU6IEluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBpdCB3b3VsZCBiZSBuaWNlIHRvIHNwZWNpZnkgb25seSB0aGUKICAgIHZlY3RvciBuYW1lIGFuZCBzZWN0aW9uIGtpbmQgYW5kIGNvbnN0cnVjdCAic3ltIiBhbmQgInNlY3Rpb24iIHVzaW5nCiAgICBDUFAgY29uY2F0ZW5hdGlvbiwgYnV0IHRoYXQgZG9lcyBub3Qgd29yayByZWxpYWJseS4gIENvbmNhdGVuYXRpbmcgYQpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvbW0vaW5pdC5jIGIvYXJjaC94dGVuc2EvbW0vaW5pdC5jCmluZGV4IDlhOWE1OTMuLjgwZTRjZmIgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL21tL2luaXQuYworKysgYi9hcmNoL3h0ZW5zYS9tbS9pbml0LmMKQEAgLTgsNyArOCw3IEBACiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAxNCBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxNCAtIDIwMTYgQ2FkZW5jZSBEZXNpZ24gU3lzdGVtcyBJbmMuCiAgKgogICogQ2hyaXMgWmFua2VsCTxjaHJpc0B6YW5rZWwubmV0PgogICogSm9lIFRheWxvcgk8am9lQHRlbnNpbGljYS5jb20sIGpvZXR5bHJAeWFob28uY29tPgpAQCAtMjUsMjg0ICsyNSw0MyBAQAogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KICNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZmR0Lmg+CiAKICNpbmNsdWRlIDxhc20vYm9vdHBhcmFtLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vc3lzbWVtLmg+CiAKLXN0cnVjdCBzeXNtZW1faW5mbyBzeXNtZW0gX19pbml0ZGF0YTsKLQotc3RhdGljIHZvaWQgX19pbml0IHN5c21lbV9kdW1wKHZvaWQpCi17Ci0JdW5zaWduZWQgaTsKLQotCXByX2RlYnVnKCJTeXNtZW06XG4iKTsKLQlmb3IgKGkgPSAwOyBpIDwgc3lzbWVtLm5yX2JhbmtzOyArK2kpCi0JCXByX2RlYnVnKCIgIDB4JTA4bHggLSAweCUwOGx4ICglbGRLKVxuIiwKLQkJCSBzeXNtZW0uYmFua1tpXS5zdGFydCwgc3lzbWVtLmJhbmtbaV0uZW5kLAotCQkJIChzeXNtZW0uYmFua1tpXS5lbmQgLSBzeXNtZW0uYmFua1tpXS5zdGFydCkgPj4gMTApOwotfQotCi0vKgotICogRmluZCBiYW5rIHdpdGggbWF4aW1hbCAuc3RhcnQgc3VjaCB0aGF0IGJhbmsuc3RhcnQgPD0gc3RhcnQKLSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgbWVtaW5mbyAqIF9faW5pdCBmaW5kX2JhbmsodW5zaWduZWQgbG9uZyBzdGFydCkKLXsKLQl1bnNpZ25lZCBpOwotCXN0cnVjdCBtZW1pbmZvICppdCA9IE5VTEw7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc3lzbWVtLm5yX2JhbmtzOyArK2kpCi0JCWlmIChzeXNtZW0uYmFua1tpXS5zdGFydCA8PSBzdGFydCkKLQkJCWl0ID0gc3lzbWVtLmJhbmsgKyBpOwotCQllbHNlCi0JCQlicmVhazsKLQlyZXR1cm4gaXQ7Ci19Ci0KLS8qCi0gKiBNb3ZlIGFsbCBtZW1vcnkgYmFua3Mgc3RhcnRpbmcgYXQgJ2Zyb20nIHRvIGEgbmV3IHBsYWNlIGF0ICd0bycsCi0gKiBhZGp1c3QgbnJfYmFua3MgYWNjb3JkaW5nbHkuCi0gKiBCb3RoICdmcm9tJyBhbmQgJ3RvJyBtdXN0IGJlIGluc2lkZSB0aGUgc3lzbWVtLmJhbmsuCi0gKgotICogUmV0dXJuczogMCAoc3VjY2VzcyksIC1FTk9NRU0gKG5vdCBlbm91Z2ggc3BhY2UgaW4gdGhlIHN5c21lbS5iYW5rKS4KLSAqLwotc3RhdGljIGludCBfX2luaXQgbW92ZV9iYW5rcyhzdHJ1Y3QgbWVtaW5mbyAqdG8sIHN0cnVjdCBtZW1pbmZvICpmcm9tKQotewotCXVuc2lnbmVkIG4gPSBzeXNtZW0ubnJfYmFua3MgLSAoZnJvbSAtIHN5c21lbS5iYW5rKTsKLQotCWlmICh0byA+IGZyb20gJiYgdG8gLSBmcm9tICsgc3lzbWVtLm5yX2JhbmtzID4gU1lTTUVNX0JBTktTX01BWCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaWYgKHRvICE9IGZyb20pCi0JCW1lbW1vdmUodG8sIGZyb20sIG4gKiBzaXplb2Yoc3RydWN0IG1lbWluZm8pKTsKLQlzeXNtZW0ubnJfYmFua3MgKz0gdG8gLSBmcm9tOwotCXJldHVybiAwOwotfQotCi0vKgotICogQWRkIG5ldyBiYW5rIHRvIHN5c21lbS4gUmVzdWx0aW5nIHN5c21lbSBpcyB0aGUgdW5pb24gb2YgYnl0ZXMgb2YgdGhlCi0gKiBvcmlnaW5hbCBzeXNtZW0gYW5kIHRoZSBuZXcgYmFuay4KLSAqCi0gKiBSZXR1cm5zOiAwIChzdWNjZXNzKSwgPCAwIChlcnJvcikKLSAqLwotaW50IF9faW5pdCBhZGRfc3lzbWVtX2JhbmsodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCi17Ci0JdW5zaWduZWQgaTsKLQlzdHJ1Y3QgbWVtaW5mbyAqaXQgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgc3o7Ci0JdW5zaWduZWQgbG9uZyBiYW5rX3N6ID0gMDsKLQotCWlmIChzdGFydCA9PSBlbmQgfHwKLQkgICAgKHN0YXJ0IDwgZW5kKSAhPSAoUEFHRV9BTElHTihzdGFydCkgPCAoZW5kICYgUEFHRV9NQVNLKSkpIHsKLQkJcHJfd2FybigiSWdub3Jpbmcgc21hbGwgbWVtb3J5IGJhbmsgMHglMDhseCBzaXplOiAlbGQgYnl0ZXNcbiIsCi0JCQlzdGFydCwgZW5kIC0gc3RhcnQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzdGFydCA9IFBBR0VfQUxJR04oc3RhcnQpOwotCWVuZCAmPSBQQUdFX01BU0s7Ci0Jc3ogPSBlbmQgLSBzdGFydDsKLQotCWl0ID0gZmluZF9iYW5rKHN0YXJ0KTsKLQotCWlmIChpdCkKLQkJYmFua19zeiA9IGl0LT5lbmQgLSBpdC0+c3RhcnQ7Ci0KLQlpZiAoaXQgJiYgYmFua19zeiA+PSBzdGFydCAtIGl0LT5zdGFydCkgewotCQlpZiAoZW5kIC0gaXQtPnN0YXJ0ID4gYmFua19zeikKLQkJCWl0LT5lbmQgPSBlbmQ7Ci0JCWVsc2UKLQkJCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCWlmICghaXQpCi0JCQlpdCA9IHN5c21lbS5iYW5rOwotCQllbHNlCi0JCQkrK2l0OwotCi0JCWlmIChpdCAtIHN5c21lbS5iYW5rIDwgc3lzbWVtLm5yX2JhbmtzICYmCi0JCSAgICBpdC0+c3RhcnQgLSBzdGFydCA8PSBzeikgewotCQkJaXQtPnN0YXJ0ID0gc3RhcnQ7Ci0JCQlpZiAoaXQtPmVuZCAtIGl0LT5zdGFydCA8IHN6KQotCQkJCWl0LT5lbmQgPSBlbmQ7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobW92ZV9iYW5rcyhpdCArIDEsIGl0KSA8IDApIHsKLQkJCQlwcl93YXJuKCJJZ25vcmluZyBtZW1vcnkgYmFuayAweCUwOGx4IHNpemUgJWxkIGJ5dGVzXG4iLAotCQkJCQlzdGFydCwgZW5kIC0gc3RhcnQpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQkJaXQtPnN0YXJ0ID0gc3RhcnQ7Ci0JCQlpdC0+ZW5kID0gZW5kOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0Jc3ogPSBpdC0+ZW5kIC0gaXQtPnN0YXJ0OwotCWZvciAoaSA9IGl0ICsgMSAtIHN5c21lbS5iYW5rOyBpIDwgc3lzbWVtLm5yX2JhbmtzOyArK2kpCi0JCWlmIChzeXNtZW0uYmFua1tpXS5zdGFydCAtIGl0LT5zdGFydCA8PSBzeikgewotCQkJaWYgKHN6IDwgc3lzbWVtLmJhbmtbaV0uZW5kIC0gaXQtPnN0YXJ0KQotCQkJCWl0LT5lbmQgPSBzeXNtZW0uYmFua1tpXS5lbmQ7Ci0JCX0gZWxzZSB7Ci0JCQlicmVhazsKLQkJfQotCi0JbW92ZV9iYW5rcyhpdCArIDEsIHN5c21lbS5iYW5rICsgaSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBtZW1fcmVzZXJ2ZShzdGFydCwgZW5kLCBtdXN0X2V4aXN0KQotICoKLSAqIFJlc2VydmUgc29tZSBtZW1vcnkgZnJvbSB0aGUgbWVtb3J5IHBvb2wuCi0gKiBJZiBtdXN0X2V4aXN0IGlzIHNldCBhbmQgYSBwYXJ0IG9mIHRoZSByZWdpb24gYmVpbmcgcmVzZXJ2ZWQgZG9lcyBub3QgZXhpc3QKLSAqIG1lbW9yeSBtYXAgaXMgbm90IGFsdGVyZWQuCi0gKgotICogUGFyYW1ldGVyczoKLSAqICBzdGFydAlTdGFydCBvZiByZWdpb24sCi0gKiAgZW5kCQlFbmQgb2YgcmVnaW9uLAotICogIG11c3RfZXhpc3QJTXVzdCBleGlzdCBpbiBtZW1vcnkgcG9vbC4KLSAqCi0gKiBSZXR1cm5zOgotICogIDAgKHN1Y2Nlc3MpCi0gKiAgPCAwIChlcnJvcikKLSAqLwotCi1pbnQgX19pbml0IG1lbV9yZXNlcnZlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLCBpbnQgbXVzdF9leGlzdCkKLXsKLQlzdHJ1Y3QgbWVtaW5mbyAqaXQ7Ci0Jc3RydWN0IG1lbWluZm8gKnJtID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIHN6OwotCXVuc2lnbmVkIGxvbmcgYmFua19zeiA9IDA7Ci0KLQlzdGFydCA9IHN0YXJ0ICYgUEFHRV9NQVNLOwotCWVuZCA9IFBBR0VfQUxJR04oZW5kKTsKLQlzeiA9IGVuZCAtIHN0YXJ0OwotCWlmICghc3opCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaXQgPSBmaW5kX2Jhbmsoc3RhcnQpOwotCi0JaWYgKGl0KQotCQliYW5rX3N6ID0gaXQtPmVuZCAtIGl0LT5zdGFydDsKLQotCWlmICgoIWl0IHx8IGVuZCAtIGl0LT5zdGFydCA+IGJhbmtfc3opICYmIG11c3RfZXhpc3QpIHsKLQkJcHJfd2FybigibWVtX3Jlc2VydmU6IFsweCUwbHgsIDB4JTBseCkgbm90IGluIGFueSByZWdpb24hXG4iLAotCQkJc3RhcnQsIGVuZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChpdCAmJiBzdGFydCAtIGl0LT5zdGFydCA8PSBiYW5rX3N6KSB7Ci0JCWlmIChzdGFydCA9PSBpdC0+c3RhcnQpIHsKLQkJCWlmIChlbmQgLSBpdC0+c3RhcnQgPCBiYW5rX3N6KSB7Ci0JCQkJaXQtPnN0YXJ0ID0gZW5kOwotCQkJCXJldHVybiAwOwotCQkJfSBlbHNlIHsKLQkJCQlybSA9IGl0OwotCQkJfQotCQl9IGVsc2UgewotCQkJaXQtPmVuZCA9IHN0YXJ0OwotCQkJaWYgKGVuZCAtIGl0LT5zdGFydCA8IGJhbmtfc3opCi0JCQkJcmV0dXJuIGFkZF9zeXNtZW1fYmFuayhlbmQsCi0JCQkJCQkgICAgICAgaXQtPnN0YXJ0ICsgYmFua19zeik7Ci0JCQkrK2l0OwotCQl9Ci0JfQotCi0JaWYgKCFpdCkKLQkJaXQgPSBzeXNtZW0uYmFuazsKLQotCWZvciAoOyBpdCA8IHN5c21lbS5iYW5rICsgc3lzbWVtLm5yX2JhbmtzOyArK2l0KSB7Ci0JCWlmIChpdC0+ZW5kIC0gc3RhcnQgPD0gc3opIHsKLQkJCWlmICghcm0pCi0JCQkJcm0gPSBpdDsKLQkJfSBlbHNlIHsKLQkJCWlmIChpdC0+c3RhcnQgLSBzdGFydCA8IHN6KQotCQkJCWl0LT5zdGFydCA9IGVuZDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKHJtKQotCQltb3ZlX2JhbmtzKHJtLCBpdCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCiAvKgogICogSW5pdGlhbGl6ZSB0aGUgYm9vdG1lbSBzeXN0ZW0gYW5kIGdpdmUgaXQgYWxsIGxvdyBtZW1vcnkgd2UgaGF2ZSBhdmFpbGFibGUuCiAgKi8KIAogdm9pZCBfX2luaXQgYm9vdG1lbV9pbml0KHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBwZm47Ci0JdW5zaWduZWQgbG9uZyBib290bWFwX3N0YXJ0LCBib290bWFwX3NpemU7Ci0JaW50IGk7Ci0KLQkvKiBSZXNlcnZlIGFsbCBtZW1vcnkgYmVsb3cgUExBVEZPUk1fREVGQVVMVF9NRU1fU1RBUlQsIGFzIG1lbW9yeQorCS8qIFJlc2VydmUgYWxsIG1lbW9yeSBiZWxvdyBQSFlTX09GRlNFVCwgYXMgbWVtb3J5CiAJICogYWNjb3VudGluZyBkb2Vzbid0IHdvcmsgZm9yIHBhZ2VzIGJlbG93IHRoYXQgYWRkcmVzcy4KIAkgKgotCSAqIElmIFBMQVRGT1JNX0RFRkFVTFRfTUVNX1NUQVJUIGlzIHplcm8gcmVzZXJ2ZSBwYWdlIGF0IGFkZHJlc3MgMDoKKwkgKiBJZiBQSFlTX09GRlNFVCBpcyB6ZXJvIHJlc2VydmUgcGFnZSBhdCBhZGRyZXNzIDA6CiAJICogc3VjY2Vzc2Z1bGwgYWxsb2NhdGlvbnMgc2hvdWxkIG5ldmVyIHJldHVybiBOVUxMLgogCSAqLwotCWlmIChQTEFURk9STV9ERUZBVUxUX01FTV9TVEFSVCkKLQkJbWVtX3Jlc2VydmUoMCwgUExBVEZPUk1fREVGQVVMVF9NRU1fU1RBUlQsIDApOworCWlmIChQSFlTX09GRlNFVCkKKwkJbWVtYmxvY2tfcmVzZXJ2ZSgwLCBQSFlTX09GRlNFVCk7CiAJZWxzZQotCQltZW1fcmVzZXJ2ZSgwLCAxLCAwKTsKKwkJbWVtYmxvY2tfcmVzZXJ2ZSgwLCAxKTsKIAotCXN5c21lbV9kdW1wKCk7Ci0JbWF4X2xvd19wZm4gPSBtYXhfcGZuID0gMDsKLQltaW5fbG93X3BmbiA9IH4wOworCWVhcmx5X2luaXRfZmR0X3NjYW5fcmVzZXJ2ZWRfbWVtKCk7CiAKLQlmb3IgKGk9MDsgaSA8IHN5c21lbS5ucl9iYW5rczsgaSsrKSB7Ci0JCXBmbiA9IFBBR0VfQUxJR04oc3lzbWVtLmJhbmtbaV0uc3RhcnQpID4+IFBBR0VfU0hJRlQ7Ci0JCWlmIChwZm4gPCBtaW5fbG93X3BmbikKLQkJCW1pbl9sb3dfcGZuID0gcGZuOwotCQlwZm4gPSBQQUdFX0FMSUdOKHN5c21lbS5iYW5rW2ldLmVuZCAtIDEpID4+IFBBR0VfU0hJRlQ7Ci0JCWlmIChwZm4gPiBtYXhfcGZuKQotCQkJbWF4X3BmbiA9IHBmbjsKLQl9Ci0KLQlpZiAobWluX2xvd19wZm4gPiBtYXhfcGZuKQorCWlmICghbWVtYmxvY2tfcGh5c19tZW1fc2l6ZSgpKQogCQlwYW5pYygiTm8gbWVtb3J5IGZvdW5kIVxuIik7CiAKLQltYXhfbG93X3BmbiA9IG1heF9wZm4gPCBNQVhfTUVNX1BGTiA+PiBQQUdFX1NISUZUID8KLQkJbWF4X3BmbiA6IE1BWF9NRU1fUEZOID4+IFBBR0VfU0hJRlQ7CisJbWluX2xvd19wZm4gPSBQRk5fVVAobWVtYmxvY2tfc3RhcnRfb2ZfRFJBTSgpKTsKKwltaW5fbG93X3BmbiA9IG1heChtaW5fbG93X3BmbiwgUEZOX1VQKFBIWVNfT0ZGU0VUKSk7CisJbWF4X3BmbiA9IFBGTl9ET1dOKG1lbWJsb2NrX2VuZF9vZl9EUkFNKCkpOworCW1heF9sb3dfcGZuID0gbWluKG1heF9wZm4sIE1BWF9MT1dfUEZOKTsKIAotCS8qIEZpbmQgYW4gYXJlYSB0byB1c2UgZm9yIHRoZSBib290bWVtIGJpdG1hcC4gKi8KKwltZW1ibG9ja19zZXRfY3VycmVudF9saW1pdChQRk5fUEhZUyhtYXhfbG93X3BmbikpOwogCi0JYm9vdG1hcF9zaXplID0gYm9vdG1lbV9ib290bWFwX3BhZ2VzKG1heF9sb3dfcGZuIC0gbWluX2xvd19wZm4pOwotCWJvb3RtYXBfc2l6ZSA8PD0gUEFHRV9TSElGVDsKLQlib290bWFwX3N0YXJ0ID0gfjA7Ci0KLQlmb3IgKGk9MDsgaTxzeXNtZW0ubnJfYmFua3M7IGkrKykKLQkJaWYgKHN5c21lbS5iYW5rW2ldLmVuZCAtIHN5c21lbS5iYW5rW2ldLnN0YXJ0ID49IGJvb3RtYXBfc2l6ZSkgewotCQkJYm9vdG1hcF9zdGFydCA9IHN5c21lbS5iYW5rW2ldLnN0YXJ0OwotCQkJYnJlYWs7Ci0JCX0KLQotCWlmIChib290bWFwX3N0YXJ0ID09IH4wVUwpCi0JCXBhbmljKCJDYW5ub3QgZmluZCAlbGQgYnl0ZXMgZm9yIGJvb3RtYXBcbiIsIGJvb3RtYXBfc2l6ZSk7Ci0KLQkvKiBSZXNlcnZlIHRoZSBib290bWVtIGJpdG1hcCBhcmVhICovCi0KLQltZW1fcmVzZXJ2ZShib290bWFwX3N0YXJ0LCBib290bWFwX3N0YXJ0ICsgYm9vdG1hcF9zaXplLCAxKTsKLQlib290bWFwX3NpemUgPSBpbml0X2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEoMCksCi0JCQkJCSBib290bWFwX3N0YXJ0ID4+IFBBR0VfU0hJRlQsCi0JCQkJCSBtaW5fbG93X3BmbiwKLQkJCQkJIG1heF9sb3dfcGZuKTsKLQotCS8qIEFkZCBhbGwgcmVtYWluaW5nIG1lbW9yeSBwaWVjZXMgaW50byB0aGUgYm9vdG1lbSBtYXAgKi8KLQotCWZvciAoaSA9IDA7IGkgPCBzeXNtZW0ubnJfYmFua3M7IGkrKykgewotCQlpZiAoc3lzbWVtLmJhbmtbaV0uc3RhcnQgPj4gUEFHRV9TSElGVCA8IG1heF9sb3dfcGZuKSB7Ci0JCQl1bnNpZ25lZCBsb25nIGVuZCA9IG1pbihtYXhfbG93X3BmbiA8PCBQQUdFX1NISUZULAotCQkJCQkJc3lzbWVtLmJhbmtbaV0uZW5kKTsKLQkJCWZyZWVfYm9vdG1lbShzeXNtZW0uYmFua1tpXS5zdGFydCwKLQkJCQkgICAgIGVuZCAtIHN5c21lbS5iYW5rW2ldLnN0YXJ0KTsKLQkJfQotCX0KLQorCW1lbWJsb2NrX2R1bXBfYWxsKCk7CiB9CiAKIApAQCAtMzQ0LDcgKzEwMyw3IEBACiAJCSIgICAgZml4bWFwICA6IDB4JTA4bHggLSAweCUwOGx4ICAoJTVsdSBrQilcbiIKICNlbmRpZgogI2lmZGVmIENPTkZJR19NTVUKLQkJIiAgICB2bWFsbG9jIDogMHglMDh4IC0gMHglMDh4ICAoJTV1IE1CKVxuIgorCQkiICAgIHZtYWxsb2MgOiAweCUwOGx4IC0gMHglMDhseCAgKCU1bHUgTUIpXG4iCiAjZW5kaWYKIAkJIiAgICBsb3dtZW0gIDogMHglMDhseCAtIDB4JTA4bHggICglNWx1IE1CKVxuIiwKICNpZmRlZiBDT05GSUdfSElHSE1FTQpAQCAtMzk1LDE2ICsxNTQsMTYgQEAKIAlzd2l0Y2ggKCpwKSB7CiAJY2FzZSAnQCc6CiAJCXN0YXJ0X2F0ID0gbWVtcGFyc2UocCArIDEsICZwKTsKLQkJYWRkX3N5c21lbV9iYW5rKHN0YXJ0X2F0LCBzdGFydF9hdCArIG1lbV9zaXplKTsKKwkJbWVtYmxvY2tfYWRkKHN0YXJ0X2F0LCBtZW1fc2l6ZSk7CiAJCWJyZWFrOwogCiAJY2FzZSAnJCc6CiAJCXN0YXJ0X2F0ID0gbWVtcGFyc2UocCArIDEsICZwKTsKLQkJbWVtX3Jlc2VydmUoc3RhcnRfYXQsIHN0YXJ0X2F0ICsgbWVtX3NpemUsIDApOworCQltZW1ibG9ja19yZXNlcnZlKHN0YXJ0X2F0LCBtZW1fc2l6ZSk7CiAJCWJyZWFrOwogCiAJY2FzZSAwOgotCQltZW1fcmVzZXJ2ZShtZW1fc2l6ZSwgMCwgMCk7CisJCW1lbWJsb2NrX3Jlc2VydmUobWVtX3NpemUsIC1tZW1fc2l6ZSk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3MvaW5jbHVkZS9wbGF0Zm9ybS9zaW1jYWxsLmggYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL2luY2x1ZGUvcGxhdGZvcm0vc2ltY2FsbC5oCmluZGV4IDEyYjE1YWQuLjI3ZDdhNTIgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3MvaW5jbHVkZS9wbGF0Zm9ybS9zaW1jYWxsLmgKKysrIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9pbmNsdWRlL3BsYXRmb3JtL3NpbWNhbGwuaApAQCAtNzYsNiArNzYsMTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW5saW5lIGludCBzaW1jX2V4aXQoaW50IGV4aXRfY29kZSkKK3sKKwlyZXR1cm4gX19zaW1jKFNZU19leGl0LCBleGl0X2NvZGUsIDAsIDApOworfQorCiBzdGF0aWMgaW5saW5lIGludCBzaW1jX29wZW4oY29uc3QgY2hhciAqZmlsZSwgaW50IGZsYWdzLCBpbnQgbW9kZSkKIHsKIAlyZXR1cm4gX19zaW1jKFNZU19vcGVuLCAoaW50KSBmaWxlLCBmbGFncywgbW9kZSk7CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL3NldHVwLmMgYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMvaXNzL3NldHVwLmMKaW5kZXggMzkxODIwNS4uMzc5YWVkZCAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9zZXR1cC5jCisrKyBiL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3Mvc2V0dXAuYwpAQCAtMzIsNiArMzIsOCBAQAogI2luY2x1ZGUgPGFzbS9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGFzbS9ib290cGFyYW0uaD4KIAorI2luY2x1ZGUgPHBsYXRmb3JtL3NpbWNhbGwuaD4KKwogCiB2b2lkIF9faW5pdCBwbGF0Zm9ybV9pbml0KGJwX3RhZ190KiBib290cGFyYW0pCiB7CkBAIC00MSwzNyArNDMsMTkgQEAKIHZvaWQgcGxhdGZvcm1faGFsdCh2b2lkKQogewogCXByX2luZm8oIiAqKiBDYWxsZWQgcGxhdGZvcm1faGFsdCgpICoqXG4iKTsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92aSBhMiwgMVxuc2ltY2FsbFxuIik7CisJc2ltY19leGl0KDApOwogfQogCiB2b2lkIHBsYXRmb3JtX3Bvd2VyX29mZih2b2lkKQogewogCXByX2luZm8oIiAqKiBDYWxsZWQgcGxhdGZvcm1fcG93ZXJfb2ZmKCkgKipcbiIpOwotCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZpIGEyLCAxXG5zaW1jYWxsXG4iKTsKKwlzaW1jX2V4aXQoMCk7CiB9CiB2b2lkIHBsYXRmb3JtX3Jlc3RhcnQodm9pZCkKIHsKIAkvKiBGbHVzaCBhbmQgcmVzZXQgdGhlIG1tdSwgc2ltdWxhdGUgYSBwcm9jZXNzb3IgcmVzZXQsIGFuZAogCSAqIGp1bXAgdG8gdGhlIHJlc2V0IHZlY3Rvci4gKi8KLQotCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZpCWEyLCAxNVxuXHQiCi0JCQkgICAgICJ3c3IJYTIsIGljb3VudGxldmVsXG5cdCIKLQkJCSAgICAgIm1vdmkJYTIsIDBcblx0IgotCQkJICAgICAid3NyCWEyLCBpY291bnRcblx0IgotI2lmIFhDSEFMX05VTV9JQlJFQUsgPiAwCi0JCQkgICAgICJ3c3IJYTIsIGlicmVha2VuYWJsZVxuXHQiCi0jZW5kaWYKLSNpZiBYQ0hBTF9IQVZFX0xPT1BTCi0JCQkgICAgICJ3c3IJYTIsIGxjb3VudFxuXHQiCi0jZW5kaWYKLQkJCSAgICAgIm1vdmkJYTIsIDB4MWZcblx0IgotCQkJICAgICAid3NyCWEyLCBwc1xuXHQiCi0JCQkgICAgICJpc3luY1xuXHQiCi0JCQkgICAgICJqeAklMFxuXHQiCi0JCQkgICAgIDoKLQkJCSAgICAgOiAiYSIgKFhDSEFMX1JFU0VUX1ZFQ1RPUl9WQUREUikKLQkJCSAgICAgOiAiYTIiKTsKLQorCWNwdV9yZXNldCgpOwogCS8qIGNvbnRyb2wgbmV2ZXIgZ2V0cyBoZXJlICovCiB9CiAKQEAgLTk4LDcgKzgyLDcgQEAKIHN0YXRpYyBpbnQKIGlzc19wYW5pY19ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKIHsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92aSBhMiwgLTE7IHNpbWNhbGxcbiIpOworCXNpbWNfZXhpdCgxKTsKIAlyZXR1cm4gTk9USUZZX0RPTkU7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy9pc3Mvc2ltZGlzay5jIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9zaW1kaXNrLmMKaW5kZXggZjU4YTRlNi4uZWRlMDRjYyAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9zaW1kaXNrLmMKKysrIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL2lzcy9zaW1kaXNrLmMKQEAgLTg2LDYgKzg2LDcgQEAKIAkJdW5zaWduZWQgbG9uZyBpbzsKIAogCQlzaW1jX2xzZWVrKGRldi0+ZmQsIG9mZnNldCwgU0VFS19TRVQpOworCQlSRUFEX09OQ0UoKmJ1ZmZlcik7CiAJCWlmICh3cml0ZSkKIAkJCWlvID0gc2ltY193cml0ZShkZXYtPmZkLCBidWZmZXIsIG5ieXRlcyk7CiAJCWVsc2UKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy94dDIwMDAvc2V0dXAuYyBiL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy94dDIwMDAvc2V0dXAuYwppbmRleCA0OTA0YzVjLi45YzJmMWZiIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMveHQyMDAwL3NldHVwLmMKKysrIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL3h0MjAwMC9zZXR1cC5jCkBAIC02NCwyNiArNjQsNyBAQAogewogCS8qIEZsdXNoIGFuZCByZXNldCB0aGUgbW11LCBzaW11bGF0ZSBhIHByb2Nlc3NvciByZXNldCwgYW5kCiAJICoganVtcCB0byB0aGUgcmVzZXQgdmVjdG9yLiAqLwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZpCWEyLCAxNVxuXHQiCi0JCQkgICAgICAid3NyCWEyLCBpY291bnRsZXZlbFxuXHQiCi0JCQkgICAgICAibW92aQlhMiwgMFxuXHQiCi0JCQkgICAgICAid3NyCWEyLCBpY291bnRcblx0IgotI2lmIFhDSEFMX05VTV9JQlJFQUsgPiAwCi0JCQkgICAgICAid3NyCWEyLCBpYnJlYWtlbmFibGVcblx0IgotI2VuZGlmCi0jaWYgWENIQUxfSEFWRV9MT09QUwotCQkJICAgICAgIndzcglhMiwgbGNvdW50XG5cdCIKLSNlbmRpZgotCQkJICAgICAgIm1vdmkJYTIsIDB4MWZcblx0IgotCQkJICAgICAgIndzcglhMiwgcHNcblx0IgotCQkJICAgICAgImlzeW5jXG5cdCIKLQkJCSAgICAgICJqeAklMFxuXHQiCi0JCQkgICAgICA6Ci0JCQkgICAgICA6ICJhIiAoWENIQUxfUkVTRVRfVkVDVE9SX1ZBRERSKQotCQkJICAgICAgOiAiYTIiCi0JCQkgICAgICApOwotCisJY3B1X3Jlc2V0KCk7CiAJLyogY29udHJvbCBuZXZlciBnZXRzIGhlcmUgKi8KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvcGxhdGZvcm1zL3h0ZnBnYS9zZXR1cC5jIGIvYXJjaC94dGVuc2EvcGxhdGZvcm1zL3h0ZnBnYS9zZXR1cC5jCmluZGV4IGI1MDlkMWYuLjc3OWJlNzIgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL3BsYXRmb3Jtcy94dGZwZ2Evc2V0dXAuYworKysgYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybXMveHRmcGdhL3NldHVwLmMKQEAgLTI2LDYgKzI2LDggQEAKICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KIAogI2luY2x1ZGUgPGFzbS90aW1leC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KQEAgLTU0LDI3ICs1Niw3IEBACiB7CiAJLyogRmx1c2ggYW5kIHJlc2V0IHRoZSBtbXUsIHNpbXVsYXRlIGEgcHJvY2Vzc29yIHJlc2V0LCBhbmQKIAkgKiBqdW1wIHRvIHRoZSByZXNldCB2ZWN0b3IuICovCi0KLQotCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92aQlhMiwgMTVcblx0IgotCQkJICAgICAgIndzcglhMiwgaWNvdW50bGV2ZWxcblx0IgotCQkJICAgICAgIm1vdmkJYTIsIDBcblx0IgotCQkJICAgICAgIndzcglhMiwgaWNvdW50XG5cdCIKLSNpZiBYQ0hBTF9OVU1fSUJSRUFLID4gMAotCQkJICAgICAgIndzcglhMiwgaWJyZWFrZW5hYmxlXG5cdCIKLSNlbmRpZgotI2lmIFhDSEFMX0hBVkVfTE9PUFMKLQkJCSAgICAgICJ3c3IJYTIsIGxjb3VudFxuXHQiCi0jZW5kaWYKLQkJCSAgICAgICJtb3ZpCWEyLCAweDFmXG5cdCIKLQkJCSAgICAgICJ3c3IJYTIsIHBzXG5cdCIKLQkJCSAgICAgICJpc3luY1xuXHQiCi0JCQkgICAgICAiangJJTBcblx0IgotCQkJICAgICAgOgotCQkJICAgICAgOiAiYSIgKFhDSEFMX1JFU0VUX1ZFQ1RPUl9WQUREUikKLQkJCSAgICAgIDogImEyIgotCQkJICAgICAgKTsKLQorCWNwdV9yZXNldCgpOwogCS8qIGNvbnRyb2wgbmV2ZXIgZ2V0cyBoZXJlICovCiB9CiAKQEAgLTgyLDMwICs2NCw1NSBAQAogewogfQogCisvKiBlYXJseSBpbml0aWFsaXphdGlvbiAqLworCit2b2lkIF9faW5pdCBwbGF0Zm9ybV9pbml0KGJwX3RhZ190ICpmaXJzdCkKK3sKK30KKworLyogSGVhcnRiZWF0LiAqLworCit2b2lkIHBsYXRmb3JtX2hlYXJ0YmVhdCh2b2lkKQoreworfQorCisjaWZkZWYgQ09ORklHX1hURU5TQV9DQUxJQlJBVEVfQ0NPVU5UCisKK3ZvaWQgX19pbml0IHBsYXRmb3JtX2NhbGlicmF0ZV9jY291bnQodm9pZCkKK3sKKwljY291bnRfZnJlcSA9ICoobG9uZyAqKVhURlBHQV9DTEtGUlFfVkFERFI7Cit9CisKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX09GCiAKLXN0YXRpYyB2b2lkIF9faW5pdCB1cGRhdGVfY2xvY2tfZnJlcXVlbmN5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3N0YXRpYyB2b2lkIF9faW5pdCB4dGZwZ2FfY2xrX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0Jc3RydWN0IHByb3BlcnR5ICpuZXdmcmVxOworCXZvaWQgX19pb21lbSAqYmFzZSA9IG9mX2lvbWFwKG5wLCAwKTsKKwlzdHJ1Y3QgY2xrICpjbGs7CiAJdTMyIGZyZXE7CiAKLQlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJjbG9jay1mcmVxdWVuY3kiLCAmZnJlcSkgJiYgZnJlcSAhPSAwKQotCQlyZXR1cm47Ci0KLQluZXdmcmVxID0ga3phbGxvYyhzaXplb2YoKm5ld2ZyZXEpICsgc2l6ZW9mKHUzMiksIEdGUF9LRVJORUwpOwotCWlmICghbmV3ZnJlcSkKLQkJcmV0dXJuOwotCW5ld2ZyZXEtPnZhbHVlID0gbmV3ZnJlcSArIDE7Ci0JbmV3ZnJlcS0+bGVuZ3RoID0gc2l6ZW9mKGZyZXEpOwotCW5ld2ZyZXEtPm5hbWUgPSBrc3RyZHVwKCJjbG9jay1mcmVxdWVuY3kiLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW5ld2ZyZXEtPm5hbWUpIHsKLQkJa2ZyZWUobmV3ZnJlcSk7CisJaWYgKCFiYXNlKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgYWRkcmVzc1xuIiwgbnAtPm5hbWUpOwogCQlyZXR1cm47CiAJfQogCi0JKih1MzIgKiluZXdmcmVxLT52YWx1ZSA9IGNwdV90b19iZTMyKCoodTMyICopWFRGUEdBX0NMS0ZSUV9WQUREUik7Ci0Jb2ZfdXBkYXRlX3Byb3BlcnR5KG5vZGUsIG5ld2ZyZXEpOworCWZyZXEgPSBfX3Jhd19yZWFkbChiYXNlKTsKKwlpb3VubWFwKGJhc2UpOworCWNsayA9IGNsa19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsIG5wLT5uYW1lLCBOVUxMLCAwLCBmcmVxKTsKKworCWlmIChJU19FUlIoY2xrKSkgeworCQlwcl9lcnIoIiVzOiBjbGsgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIiwgbnAtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJaWYgKG9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKSkgeworCQlwcl9lcnIoIiVzOiBjbGsgcHJvdmlkZXIgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIiwgbnAtPm5hbWUpOworCQlyZXR1cm47CisJfQogfQorQ0xLX09GX0RFQ0xBUkUoeHRmcGdhX2NsaywgImNkbnMseHRmcGdhLWNsb2NrIiwgeHRmcGdhX2Nsa19zZXR1cCk7CiAKICNkZWZpbmUgTUFDX0xFTiA2CiBzdGF0aWMgdm9pZCBfX2luaXQgdXBkYXRlX2xvY2FsX21hYyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCkBAIC0xMzcsNTYgKzE0NCwxNSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBtYWNoaW5lX3NldHVwKHZvaWQpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpjbG9jazsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmV0aCA9IE5VTEw7CiAKLQlmb3JfZWFjaF9ub2RlX2J5X25hbWUoY2xvY2ssICJtYWluLW9zY2lsbGF0b3IiKQotCQl1cGRhdGVfY2xvY2tfZnJlcXVlbmN5KGNsb2NrKTsKLQogCWlmICgoZXRoID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoZXRoLCBOVUxMLCAib3BlbmNvcmVzLGV0aG9jIikpKQogCQl1cGRhdGVfbG9jYWxfbWFjKGV0aCk7CiAJcmV0dXJuIDA7CiB9CiBhcmNoX2luaXRjYWxsKG1hY2hpbmVfc2V0dXApOwogCi0jZW5kaWYKLQotLyogZWFybHkgaW5pdGlhbGl6YXRpb24gKi8KLQotdm9pZCBfX2luaXQgcGxhdGZvcm1faW5pdChicF90YWdfdCAqZmlyc3QpCi17Ci19Ci0KLS8qIEhlYXJ0YmVhdC4gKi8KLQotdm9pZCBwbGF0Zm9ybV9oZWFydGJlYXQodm9pZCkKLXsKLX0KLQotI2lmZGVmIENPTkZJR19YVEVOU0FfQ0FMSUJSQVRFX0NDT1VOVAotCi12b2lkIF9faW5pdCBwbGF0Zm9ybV9jYWxpYnJhdGVfY2NvdW50KHZvaWQpCi17Ci0JbG9uZyBjbGtfZnJlcSA9IDA7Ci0jaWZkZWYgQ09ORklHX09GCi0Jc3RydWN0IGRldmljZV9ub2RlICpjcHUgPQotCQlvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiY2Rucyx4dGVuc2EtY3B1Iik7Ci0JaWYgKGNwdSkgewotCQl1MzIgZnJlcTsKLQkJdXBkYXRlX2Nsb2NrX2ZyZXF1ZW5jeShjcHUpOwotCQlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKGNwdSwgImNsb2NrLWZyZXF1ZW5jeSIsICZmcmVxKSkKLQkJCWNsa19mcmVxID0gZnJlcTsKLQl9Ci0jZW5kaWYKLQlpZiAoIWNsa19mcmVxKQotCQljbGtfZnJlcSA9ICoobG9uZyAqKVhURlBHQV9DTEtGUlFfVkFERFI7Ci0KLQljY291bnRfZnJlcSA9IGNsa19mcmVxOwotfQotCi0jZW5kaWYKLQotI2lmbmRlZiBDT05GSUdfT0YKKyNlbHNlCiAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogI2luY2x1ZGUgPGxpbnV4L2lmLmg+CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS92YXJpYW50cy9jc3AvaW5jbHVkZS92YXJpYW50L2NvcmUuaCBiL2FyY2gveHRlbnNhL3ZhcmlhbnRzL2NzcC9pbmNsdWRlL3ZhcmlhbnQvY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZDgxZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS92YXJpYW50cy9jc3AvaW5jbHVkZS92YXJpYW50L2NvcmUuaApAQCAtMCwwICsxLDU3NSBAQAorLyogCisgKiB4dGVuc2EvY29uZmlnL2NvcmUtaXNhLmggLS0gSEFMIGRlZmluaXRpb25zIHRoYXQgYXJlIGRlcGVuZGVudCBvbiBYdGVuc2EKKyAqCQkJCXByb2Nlc3NvciBDT1JFIGNvbmZpZ3VyYXRpb24KKyAqCisgKiAgU2VlIDx4dGVuc2EvY29uZmlnL2NvcmUuaD4sIHdoaWNoIGluY2x1ZGVzIHRoaXMgZmlsZSwgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKiBYdGVuc2EgcHJvY2Vzc29yIGNvcmUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKworICAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMTUgVGVuc2lsaWNhIEluYy4KKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAgIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisgICBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICAgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAgIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgKi8KKworI2lmbmRlZiBfWFRFTlNBX0NPUkVfQ09ORklHVVJBVElPTl9ICisjZGVmaW5lIF9YVEVOU0FfQ09SRV9DT05GSUdVUkFUSU9OX0gKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAgICBQYXJhbWV0ZXJzIFVzZWZ1bCBmb3IgQW55IENvZGUsIFVTRVIgb3IgUFJJVklMRUdFRAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiAgTm90ZTogIE1hY3JvcyBvZiB0aGUgZm9ybSBYQ0hBTF9IQVZFXyoqKiBoYXZlIGEgdmFsdWUgb2YgMSBpZiB0aGUgb3B0aW9uIGlzCisgKiAgY29uZmlndXJlZCwgYW5kIGEgdmFsdWUgb2YgMCBvdGhlcndpc2UuICBUaGVzZSBtYWNyb3MgYXJlIGFsd2F5cyBkZWZpbmVkLgorICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJSVNBCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFhDSEFMX0hBVkVfQkUJCQkwCS8qIGJpZy1lbmRpYW4gYnl0ZSBvcmRlcmluZyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1dJTkRPV0VECQkxCS8qIHdpbmRvd2VkIHJlZ2lzdGVycyBvcHRpb24gKi8KKyNkZWZpbmUgWENIQUxfTlVNX0FSRUdTCQkJMzIJLyogbnVtIG9mIHBoeXNpY2FsIGFkZHIgcmVncyAqLworI2RlZmluZSBYQ0hBTF9OVU1fQVJFR1NfTE9HMgkJNQkvKiBsb2cyKFhDSEFMX05VTV9BUkVHUykgKi8KKyNkZWZpbmUgWENIQUxfTUFYX0lOU1RSVUNUSU9OX1NJWkUJOAkvKiBtYXggaW5zdHIgYnl0ZXMgKDMuLjgpICovCisjZGVmaW5lIFhDSEFMX0hBVkVfREVCVUcJCTEJLyogZGVidWcgb3B0aW9uICovCisjZGVmaW5lIFhDSEFMX0hBVkVfREVOU0lUWQkJMQkvKiAxNi1iaXQgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIFhDSEFMX0hBVkVfTE9PUFMJCTEJLyogemVyby1vdmVyaGVhZCBsb29wcyAqLworI2RlZmluZSBYQ0hBTF9MT09QX0JVRkZFUl9TSVpFCQkwCS8qIHplcm8tb3YuIGxvb3AgaW5zdHIgYnVmZmVyIHNpemUgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9OU0EJCQkxCS8qIE5TQS9OU0FVIGluc3RydWN0aW9ucyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX01JTk1BWAkJMQkvKiBNSU4vTUFYIGluc3RydWN0aW9ucyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1NFWFQJCQkxCS8qIFNFWFQgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9ERVBCSVRTCQkwCS8qIERFUEJJVFMgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9DTEFNUFMJCTEJLyogQ0xBTVBTIGluc3RydWN0aW9uICovCisjZGVmaW5lIFhDSEFMX0hBVkVfTVVMMTYJCTEJLyogTVVMMTZTL01VTDE2VSBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9NVUwzMgkJMQkvKiBNVUxMIGluc3RydWN0aW9uICovCisjZGVmaW5lIFhDSEFMX0hBVkVfTVVMMzJfSElHSAkJMQkvKiBNVUxVSC9NVUxTSCBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9ESVYzMgkJMQkvKiBRVU9TL1FVT1UvUkVNUy9SRU1VIGluc3RydWN0aW9ucyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0wzMlIJCQkxCS8qIEwzMlIgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9BQlNPTFVURV9MSVRFUkFMUwkwCS8qIG5vbi1QQy1yZWwgKGV4dGVuZGVkKSBMMzJSICovCisjZGVmaW5lIFhDSEFMX0hBVkVfQ09OU1QxNgkJMAkvKiBDT05TVDE2IGluc3RydWN0aW9uICovCisjZGVmaW5lIFhDSEFMX0hBVkVfQUREWAkJCTEJLyogQUREWCMvU1VCWCMgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIFhDSEFMX0hBVkVfV0lERV9CUkFOQ0hFUwkwCS8qIEIqLlcxOCBvciBCKi5XMTUgaW5zdHIncyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1BSRURJQ1RFRF9CUkFOQ0hFUwkwCS8qIEJbRVEvRVFaL05FL05FWl1UIGluc3RyJ3MgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9DQUxMNEFORDEyCQkxCS8qIChvYnNvbGV0ZSBvcHRpb24pICovCisjZGVmaW5lIFhDSEFMX0hBVkVfQUJTCQkJMQkvKiBBQlMgaW5zdHJ1Y3Rpb24gKi8KKy8qI2RlZmluZSBYQ0hBTF9IQVZFX1BPUEMJCTAqLwkvKiBQT1BDIGluc3RydWN0aW9uICovCisvKiNkZWZpbmUgWENIQUxfSEFWRV9DUkMJCTAqLwkvKiBDUkMgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9SRUxFQVNFX1NZTkMJCTEJLyogTDMyQUkvUzMyUkkgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIFhDSEFMX0hBVkVfUzMyQzFJCQkxCS8qIFMzMkMxSSBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1NQRUNVTEFUSU9OCQkwCS8qIHNwZWN1bGF0aW9uICovCisjZGVmaW5lIFhDSEFMX0hBVkVfRlVMTF9SRVNFVAkJMQkvKiBhbGwgcmVncy9zdGF0ZSByZXNldCAqLworI2RlZmluZSBYQ0hBTF9OVU1fQ09OVEVYVFMJCTEJLyogKi8KKyNkZWZpbmUgWENIQUxfTlVNX01JU0NfUkVHUwkJNAkvKiBudW0gb2Ygc2NyYXRjaCByZWdzICgwLi40KSAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1RBUF9NQVNURVIJCTAJLyogSlRBRyBUQVAgY29udHJvbCBpbnN0cidzICovCisjZGVmaW5lIFhDSEFMX0hBVkVfUFJJRAkJCTEJLyogcHJvY2Vzc29yIElEIHJlZ2lzdGVyICovCisjZGVmaW5lIFhDSEFMX0hBVkVfRVhURVJOX1JFR1MJCTEJLyogV0VSL1JFUiBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9NWAkJCTAJLyogTVggY29yZSAoVGVuc2lsaWNhIGludGVybmFsKSAqLworI2RlZmluZSBYQ0hBTF9IQVZFX01QX0lOVEVSUlVQVFMJMAkvKiBpbnRlcnJ1cHQgZGlzdHJpYnV0b3IgcG9ydCAqLworI2RlZmluZSBYQ0hBTF9IQVZFX01QX1JVTlNUQUxMCQkwCS8qIGNvcmUgUnVuU3RhbGwgY29udHJvbCBwb3J0ICovCisjZGVmaW5lIFhDSEFMX0hBVkVfUFNPCQkJMAkvKiBQb3dlciBTaHV0LU9mZiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1BTT19DRE0JCTAJLyogY29yZS9kZWJ1Zy9tZW0gcHdyIGRvbWFpbnMgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9QU09fRlVMTF9SRVRFTlRJT04JMAkvKiBhbGwgcmVncyBwcmVzZXJ2ZWQgb24gUFNPICovCisjZGVmaW5lIFhDSEFMX0hBVkVfVEhSRUFEUFRSCQkxCS8qIFRIUkVBRFBUUiByZWdpc3RlciAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0JPT0xFQU5TCQkxCS8qIGJvb2xlYW4gcmVnaXN0ZXJzICovCisjZGVmaW5lIFhDSEFMX0hBVkVfQ1AJCQkxCS8qIENQRU5BQkxFIHJlZyAoY29wcm9jZXNzb3IpICovCisjZGVmaW5lIFhDSEFMX0NQX01BWENGRwkJCTgJLyogbWF4IGFsbG93ZWQgY3AgaWQgcGx1cyBvbmUgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9NQUMxNgkJMQkvKiBNQUMxNiBwYWNrYWdlICovCisKKyNkZWZpbmUgWENIQUxfSEFWRV9GVVNJT04JCSAwCS8qIEZ1c2lvbiovCisjZGVmaW5lIFhDSEFMX0hBVkVfRlVTSU9OX0ZQCSAwCSAgICAgICAgLyogRnVzaW9uIEZQIG9wdGlvbiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0ZVU0lPTl9MT1dfUE9XRVIgMAkvKiBGdXNpb24gTG93IFBvd2VyIG9wdGlvbiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0ZVU0lPTl9BRVMJIDAJICAgICAgICAvKiBGdXNpb24gQkxFL1dpZmkgQUVTLTEyOCBDQ00gb3B0aW9uICovCisjZGVmaW5lIFhDSEFMX0hBVkVfRlVTSU9OX0NPTlZFTkMJIDAgICAgICAgLyogRnVzaW9uIENvbnYgRW5jb2RlIG9wdGlvbiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0ZVU0lPTl9MRlNSX0NSQwkgMAkvKiBGdXNpb24gTEZTUi1DUkMgb3B0aW9uICovCisjZGVmaW5lIFhDSEFMX0hBVkVfRlVTSU9OX0JJVE9QUwkgMAkvKiBGdXNpb24gQml0IE9wZXJhdGlvbnMgU3VwcG9ydCBvcHRpb24gKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9GVVNJT05fQVZTCSAwCS8qIEZ1c2lvbiBBVlMgb3B0aW9uICovCisjZGVmaW5lIFhDSEFMX0hBVkVfRlVTSU9OXzE2QklUX0JBU0VCQU5ECSAwCS8qIEZ1c2lvbiAxNi1iaXQgQmFzZWJhbmQgb3B0aW9uICovCisjZGVmaW5lIFhDSEFMX0hBVkVfSElGSVBSTwkJMAkvKiBIaUZpUHJvIEF1ZGlvIEVuZ2luZSBwa2cgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9ISUZJNAkJMAkvKiBIaUZpNCBBdWRpbyBFbmdpbmUgcGtnICovCisjZGVmaW5lIFhDSEFMX0hBVkVfSElGSTRfVkZQVQkJMAkvKiBIaUZpNCBBdWRpbyBFbmdpbmUgVkZQVSBvcHRpb24gKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9ISUZJMwkJMAkvKiBIaUZpMyBBdWRpbyBFbmdpbmUgcGtnICovCisjZGVmaW5lIFhDSEFMX0hBVkVfSElGSTNfVkZQVQkJMAkvKiBIaUZpMyBBdWRpbyBFbmdpbmUgVkZQVSBvcHRpb24gKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9ISUZJMgkJMAkvKiBIaUZpMiBBdWRpbyBFbmdpbmUgcGtnICovCisjZGVmaW5lIFhDSEFMX0hBVkVfSElGSTJFUAkJMAkvKiBIaUZpMkVQICovCisjZGVmaW5lIFhDSEFMX0hBVkVfSElGSV9NSU5JCQkwCQorCisKKyNkZWZpbmUgWENIQUxfSEFWRV9WRUNUT1JGUFUyMDA1CTAJLyogdmVjdG9yIG9yIHVzZXIgZmxvYXRpbmctcG9pbnQgcGtnICovCisjZGVmaW5lIFhDSEFMX0hBVkVfVVNFUl9EUEZQVSAgICAgICAgIDAgICAgICAgLyogdXNlciBEUCBmbG9hdGluZy1wb2ludCBwa2cgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9VU0VSX1NQRlBVICAgICAgICAgMCAgICAgICAvKiB1c2VyIERQIGZsb2F0aW5nLXBvaW50IHBrZyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0ZQICAgICAgICAgICAgICAgICAwICAgICAgLyogc2luZ2xlIHByZWMgZmxvYXRpbmcgcG9pbnQgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9GUF9ESVYgICAgICAgICAgICAgMCAgLyogRlAgd2l0aCBESVYgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIFhDSEFMX0hBVkVfRlBfUkVDSVAgICAgICAgICAgIDAgICAgICAgIC8qIEZQIHdpdGggUkVDSVAgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIFhDSEFMX0hBVkVfRlBfU1FSVCAgICAgICAgICAgIDAgLyogRlAgd2l0aCBTUVJUIGluc3RydWN0aW9ucyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0ZQX1JTUVJUICAgICAgICAgICAwICAgICAgICAvKiBGUCB3aXRoIFJTUVJUIGluc3RydWN0aW9ucyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0RGUCAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgIC8qIGRvdWJsZSBwcmVjaXNpb24gRlAgcGtnICovCisjZGVmaW5lIFhDSEFMX0hBVkVfREZQX0RJViAgICAgICAgICAgIDAgLyogREZQIHdpdGggRElWIGluc3RydWN0aW9ucyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0RGUF9SRUNJUCAgICAgICAgICAwICAgICAgIC8qIERGUCB3aXRoIFJFQ0lQIGluc3RydWN0aW9ucyovCisjZGVmaW5lIFhDSEFMX0hBVkVfREZQX1NRUlQgICAgICAgICAgIDAgICAgICAgIC8qIERGUCB3aXRoIFNRUlQgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIFhDSEFMX0hBVkVfREZQX1JTUVJUICAgICAgICAgIDAgICAgICAgLyogREZQIHdpdGggUlNRUlQgaW5zdHJ1Y3Rpb25zKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9ERlBfQUNDRUwJCTAJLyogZG91YmxlIHByZWNpc2lvbiBGUCBhY2NlbGVyYXRpb24gcGtnICovCisjZGVmaW5lIFhDSEFMX0hBVkVfREZQX2FjY2VsCQlYQ0hBTF9IQVZFX0RGUF9BQ0NFTAkJCQkvKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworCisjZGVmaW5lIFhDSEFMX0hBVkVfREZQVV9TSU5HTEVfT05MWSAgICAwICAgICAgICAgICAgICAgICAJLyogREZQVSBDb3Byb2Nlc3Nvciwgc2luZ2xlIHByZWNpc2lvbiBvbmx5ICovCisjZGVmaW5lIFhDSEFMX0hBVkVfREZQVV9TSU5HTEVfRE9VQkxFICAwICAgICAgICAgICAgICAgCS8qIERGUFUgQ29wcm9jZXNzb3IsIHNpbmdsZSBhbmQgZG91YmxlIHByZWNpc2lvbiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1ZFQ1RSQTEJCTAJLyogVmVjdHJhIEkgIHBrZyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1ZFQ1RSQUxYCQkwCS8qIFZlY3RyYSBMWCBwa2cgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9QRFg0CQkgICAgICAgIDAJLyogUERYNCAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0NPTk5YRDIJCTAJLyogQ29ublggRDIgcGtnICovCisjZGVmaW5lIFhDSEFMX0hBVkVfQ09OTlhEMl9EVUFMTFNGTElYICAgMAkvKiBDb25uWCBEMiAmIER1YWwgTG9hZFN0b3JlIEZsaXggKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9CQkUxNgkJMAkvKiBDb25uWCBCQkUxNiBwa2cgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9CQkUxNl9SU1FSVAkJMAkvKiBCQkUxNiAmIHZlY3RvciByZWNpcCBzcXJ0ICovCisjZGVmaW5lIFhDSEFMX0hBVkVfQkJFMTZfVkVDRElWCQkwCS8qIEJCRTE2ICYgdmVjdG9yIGRpdmlkZSAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0JCRTE2X0RFU1BSRUFECTAJLyogQkJFMTYgJiBkZXNwcmVhZCAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0JCRU5FUAkJMAkvKiBDb25uWCBCQkVORVAgcGtncyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0JTUDMJCQkwCS8qIENvbm5YIEJTUDMgcGtnICovCisjZGVmaW5lIFhDSEFMX0hBVkVfQlNQM19UUkFOU1BPU0UJMAkvKiBCU1AzICYgdHJhbnNwb3NlMzJ4MzIgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9TU1AxNgkJMAkvKiBDb25uWCBTU1AxNiBwa2cgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9TU1AxNl9WSVRFUkJJCTAJLyogU1NQMTYgJiB2aXRlcmJpICovCisjZGVmaW5lIFhDSEFMX0hBVkVfVFVSQk8xNgkJMAkvKiBDb25uWCBUdXJibzE2IHBrZyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0JCUDE2CQkwCS8qIENvbm5YIEJCUDE2IHBrZyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0ZMSVgzCQkwCS8qIGJhc2ljIDMtd2F5IEZMSVggb3B0aW9uICovCisjZGVmaW5lIFhDSEFMX0hBVkVfR1JJVlBFUCAgICAgICAgICAgICAgMCAgIC8qICBHUklWUEVQIGlzIEdlbmVyYWwgUmVsZWFzZSBvZiBJVlBFUCAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0dSSVZQRVBfSElTVE9HUkFNICAgIDAgICAvKiBIaXN0b2dyYW0gb3B0aW9uIG9uIEdSSVZQRVAgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQlNSVNDCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFhDSEFMX05VTV9MT0FEU1RPUkVfVU5JVFMJMQkvKiBsb2FkL3N0b3JlIHVuaXRzICovCisjZGVmaW5lIFhDSEFMX05VTV9XUklURUJVRkZFUl9FTlRSSUVTCTgJLyogc2l6ZSBvZiB3cml0ZSBidWZmZXIgKi8KKyNkZWZpbmUgWENIQUxfSU5TVF9GRVRDSF9XSURUSAkJOAkvKiBpbnN0ci1mZXRjaCB3aWR0aCBpbiBieXRlcyAqLworI2RlZmluZSBYQ0hBTF9EQVRBX1dJRFRICQkxNgkvKiBkYXRhIHdpZHRoIGluIGJ5dGVzICovCisjZGVmaW5lIFhDSEFMX0RBVEFfUElQRV9ERUxBWQkJMQkvKiBkLXNpZGUgcGlwZWxpbmUgZGVsYXkKKwkJCQkJCSAgICgxID0gNS1zdGFnZSwgMiA9IDctc3RhZ2UpICovCisjZGVmaW5lIFhDSEFMX0NMT0NLX0dBVElOR19HTE9CQUwJMAkvKiBnbG9iYWwgY2xvY2sgZ2F0aW5nICovCisjZGVmaW5lIFhDSEFMX0NMT0NLX0dBVElOR19GVU5DVU5JVAkwCS8qIGZ1bmN0LiB1bml0IGNsb2NrIGdhdGluZyAqLworLyogIEluIFQxMDUwLCBhcHBsaWVzIHRvIHNlbGVjdGVkIGNvcmUgbG9hZCBhbmQgc3RvcmUgaW5zdHJ1Y3Rpb25zIChzZWUgSVNBKTogKi8KKyNkZWZpbmUgWENIQUxfVU5BTElHTkVEX0xPQURfRVhDRVBUSU9OCTEJLyogdW5hbGlnbmVkIGxvYWRzIGNhdXNlIGV4Yy4gKi8KKyNkZWZpbmUgWENIQUxfVU5BTElHTkVEX1NUT1JFX0VYQ0VQVElPTgkxCS8qIHVuYWxpZ25lZCBzdG9yZXMgY2F1c2UgZXhjLiovCisjZGVmaW5lIFhDSEFMX1VOQUxJR05FRF9MT0FEX0hXCQkwCS8qIHVuYWxpZ25lZCBsb2FkcyB3b3JrIGluIGh3ICovCisjZGVmaW5lIFhDSEFMX1VOQUxJR05FRF9TVE9SRV9IVwkwCS8qIHVuYWxpZ25lZCBzdG9yZXMgd29yayBpbiBodyovCisKKyNkZWZpbmUgWENIQUxfU1dfVkVSU0lPTgkJMTEwMDAwMgkvKiBzdyB2ZXJzaW9uIG9mIHRoaXMgaGVhZGVyICovCisKKyNkZWZpbmUgWENIQUxfQ09SRV9JRAkJCSJ4dF9sbngiCS8qIGFscGhhbnVtIGNvcmUgbmFtZQorCQkJCQkJICAgKENvcmVJRCkgc2V0IGluIHRoZSBYdGVuc2EKKwkJCQkJCSAgIFByb2Nlc3NvciBHZW5lcmF0b3IgKi8KKworI2RlZmluZSBYQ0hBTF9CVUlMRF9VTklRVUVfSUQJCTB4MDAwNTdENTQJLyogMjItYml0IHN3IGJ1aWxkIElEICovCisKKy8qCisgKiAgVGhlc2UgZGVmaW5pdGlvbnMgZGVzY3JpYmUgdGhlIGhhcmR3YXJlIHRhcmdldGVkIGJ5IHRoaXMgc29mdHdhcmUuCisgKi8KKyNkZWZpbmUgWENIQUxfSFdfQ09ORklHSUQwCQkweEMxQjNGRkZFCS8qIENvbmZpZ0lEIGhpIDMyIGJpdHMqLworI2RlZmluZSBYQ0hBTF9IV19DT05GSUdJRDEJCTB4MUM4NTdENTQJLyogQ29uZmlnSUQgbG8gMzIgYml0cyovCisjZGVmaW5lIFhDSEFMX0hXX1ZFUlNJT05fTkFNRQkJIkxYNi4wLjIiCS8qIGZ1bGwgdmVyc2lvbiBuYW1lICovCisjZGVmaW5lIFhDSEFMX0hXX1ZFUlNJT05fTUFKT1IJCTI2MDAJLyogbWFqb3IgdmVyIyBvZiB0YXJnZXRlZCBodyAqLworI2RlZmluZSBYQ0hBTF9IV19WRVJTSU9OX01JTk9SCQkyCS8qIG1pbm9yIHZlciMgb2YgdGFyZ2V0ZWQgaHcgKi8KKyNkZWZpbmUgWENIQUxfSFdfVkVSU0lPTgkJMjYwMDAyCS8qIG1ham9yKjEwMCttaW5vciAqLworI2RlZmluZSBYQ0hBTF9IV19SRUxfTFg2CQkxCisjZGVmaW5lIFhDSEFMX0hXX1JFTF9MWDZfMAkJMQorI2RlZmluZSBYQ0hBTF9IV19SRUxfTFg2XzBfMgkJMQorI2RlZmluZSBYQ0hBTF9IV19DT05GSUdJRF9SRUxJQUJMRQkxCisvKiAgSWYgc29mdHdhcmUgdGFyZ2V0cyBhICpyYW5nZSogb2YgaGFyZHdhcmUgdmVyc2lvbnMsIHRoZXNlIGFyZSB0aGUgYm91bmRzOiAqLworI2RlZmluZSBYQ0hBTF9IV19NSU5fVkVSU0lPTl9NQUpPUgkyNjAwCS8qIG1ham9yIHYgb2YgZWFybGllc3QgdGd0IGh3ICovCisjZGVmaW5lIFhDSEFMX0hXX01JTl9WRVJTSU9OX01JTk9SCTIJLyogbWlub3IgdiBvZiBlYXJsaWVzdCB0Z3QgaHcgKi8KKyNkZWZpbmUgWENIQUxfSFdfTUlOX1ZFUlNJT04JCTI2MDAwMgkvKiBlYXJsaWVzdCB0YXJnZXRlZCBodyAqLworI2RlZmluZSBYQ0hBTF9IV19NQVhfVkVSU0lPTl9NQUpPUgkyNjAwCS8qIG1ham9yIHYgb2YgbGF0ZXN0IHRndCBodyAqLworI2RlZmluZSBYQ0hBTF9IV19NQVhfVkVSU0lPTl9NSU5PUgkyCS8qIG1pbm9yIHYgb2YgbGF0ZXN0IHRndCBodyAqLworI2RlZmluZSBYQ0hBTF9IV19NQVhfVkVSU0lPTgkJMjYwMDAyCS8qIGxhdGVzdCB0YXJnZXRlZCBodyAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCUNBQ0hFCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFhDSEFMX0lDQUNIRV9MSU5FU0laRQkJNjQJLyogSS1jYWNoZSBsaW5lIHNpemUgaW4gYnl0ZXMgKi8KKyNkZWZpbmUgWENIQUxfRENBQ0hFX0xJTkVTSVpFCQk2NAkvKiBELWNhY2hlIGxpbmUgc2l6ZSBpbiBieXRlcyAqLworI2RlZmluZSBYQ0hBTF9JQ0FDSEVfTElORVdJRFRICQk2CS8qIGxvZzIoSSBsaW5lIHNpemUgaW4gYnl0ZXMpICovCisjZGVmaW5lIFhDSEFMX0RDQUNIRV9MSU5FV0lEVEgJCTYJLyogbG9nMihEIGxpbmUgc2l6ZSBpbiBieXRlcykgKi8KKworI2RlZmluZSBYQ0hBTF9JQ0FDSEVfU0laRQkJNjU1MzYJLyogSS1jYWNoZSBzaXplIGluIGJ5dGVzIG9yIDAgKi8KKyNkZWZpbmUgWENIQUxfRENBQ0hFX1NJWkUJCTE2Mzg0CS8qIEQtY2FjaGUgc2l6ZSBpbiBieXRlcyBvciAwICovCisKKyNkZWZpbmUgWENIQUxfRENBQ0hFX0lTX1dSSVRFQkFDSwkxCS8qIHdyaXRlYmFjayBmZWF0dXJlICovCisjZGVmaW5lIFhDSEFMX0RDQUNIRV9JU19DT0hFUkVOVAkwCS8qIE1QIGNvaGVyZW5jZSBmZWF0dXJlICovCisKKyNkZWZpbmUgWENIQUxfSEFWRV9QUkVGRVRDSAkJMAkvKiBQUkVGQ1RMIHJlZ2lzdGVyICovCisjZGVmaW5lIFhDSEFMX0hBVkVfUFJFRkVUQ0hfTDEJCTAJLyogcHJlZmV0Y2ggdG8gTDEgZGNhY2hlICovCisjZGVmaW5lIFhDSEFMX1BSRUZFVENIX0NBU1RPVVRfTElORVMJMAkvKiBkY2FjaGUgcHJlZi4gY2FzdG91dCBidWZzeiAqLworI2RlZmluZSBYQ0hBTF9QUkVGRVRDSF9FTlRSSUVTCQkwCS8qIGNhY2hlIHByZWZldGNoIGVudHJpZXMgKi8KKyNkZWZpbmUgWENIQUxfUFJFRkVUQ0hfQkxPQ0tfRU5UUklFUwkwCS8qIHByZWZldGNoIGJsb2NrIHN0cmVhbXMgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9DQUNIRV9CTE9DS09QUwkwCS8qIGJsb2NrIHByZWZldGNoIGZvciBjYWNoZXMgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9JQ0FDSEVfVEVTVAkJMQkvKiBJY2FjaGUgdGVzdCBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9EQ0FDSEVfVEVTVAkJMQkvKiBEY2FjaGUgdGVzdCBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9JQ0FDSEVfRFlOX1dBWVMJMAkvKiBJY2FjaGUgZHluYW1pYyB3YXkgc3VwcG9ydCAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0RDQUNIRV9EWU5fV0FZUwkwCS8qIERjYWNoZSBkeW5hbWljIHdheSBzdXBwb3J0ICovCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgUGFyYW1ldGVycyBVc2VmdWwgZm9yIFBSSVZJTEVHRUQgKFN1cGVydmlzb3J5IG9yIE5vbi1WaXJ0dWFsaXplZCkgQ29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBYVEVOU0FfSEFMX05PTl9QUklWSUxFR0VEX09OTFkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJQ0FDSEUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgWENIQUxfSEFWRV9QSUYJCQkxCS8qIGFueSBvdXRib3VuZCBQSUYgcHJlc2VudCAqLworCisvKiAgSWYgcHJlc2VudCwgY2FjaGUgc2l6ZSBpbiBieXRlcyA9PSAod2F5cyAqIDJeKGxpbmV3aWR0aCArIHNldHdpZHRoKSkuICAqLworCisvKiAgTnVtYmVyIG9mIGNhY2hlIHNldHMgaW4gbG9nMihsaW5lcyBwZXIgd2F5KTogICovCisjZGVmaW5lIFhDSEFMX0lDQUNIRV9TRVRXSURUSAkJOAorI2RlZmluZSBYQ0hBTF9EQ0FDSEVfU0VUV0lEVEgJCTYKKworLyogIENhY2hlIHNldCBhc3NvY2lhdGl2aXR5IChudW1iZXIgb2Ygd2F5cyk6ICAqLworI2RlZmluZSBYQ0hBTF9JQ0FDSEVfV0FZUwkJNAorI2RlZmluZSBYQ0hBTF9EQ0FDSEVfV0FZUwkJNAorCisvKiAgQ2FjaGUgZmVhdHVyZXM6ICAqLworI2RlZmluZSBYQ0hBTF9JQ0FDSEVfTElORV9MT0NLQUJMRQkxCisjZGVmaW5lIFhDSEFMX0RDQUNIRV9MSU5FX0xPQ0tBQkxFCTEKKyNkZWZpbmUgWENIQUxfSUNBQ0hFX0VDQ19QQVJJVFkJCTAKKyNkZWZpbmUgWENIQUxfRENBQ0hFX0VDQ19QQVJJVFkJCTAKKworLyogIENhY2hlIGFjY2VzcyBzaXplIGluIGJ5dGVzIChhZmZlY3RzIG9wZXJhdGlvbiBvZiBTSUNXIGluc3RydWN0aW9uKTogICovCisjZGVmaW5lIFhDSEFMX0lDQUNIRV9BQ0NFU1NfU0laRQkxNgorI2RlZmluZSBYQ0hBTF9EQ0FDSEVfQUNDRVNTX1NJWkUJMTYKKworI2RlZmluZSBYQ0hBTF9EQ0FDSEVfQkFOS1MJCTEJLyogbnVtYmVyIG9mIGJhbmtzICovCisKKy8qICBOdW1iZXIgb2YgZW5jb2RlZCBjYWNoZSBhdHRyIGJpdHMgKHNlZSA8eHRlbnNhL2hhbC5oPiBmb3IgZGVjb2RlZCBiaXRzKTogICovCisjZGVmaW5lIFhDSEFMX0NBX0JJVFMJCQk0CisKKy8qICBXaGV0aGVyIE1FTUNUTCByZWdpc3RlciBoYXMgYW55dGhpbmcgdXNlZnVsICAqLworI2RlZmluZSBYQ0hBTF9VU0VfTUVNQ1RMCQkoKChYQ0hBTF9MT09QX0JVRkZFUl9TSVpFID4gMCkJfHwJXAorCQkJCQkgICBYQ0hBTF9EQ0FDSEVfSVNfQ09IRVJFTlQJfHwJXAorCQkJCQkgICBYQ0hBTF9IQVZFX0lDQUNIRV9EWU5fV0FZUwl8fAlcCisJCQkJCSAgIFhDSEFMX0hBVkVfRENBQ0hFX0RZTl9XQVlTKQkmJglcCisJCQkJCSAgIChYQ0hBTF9IV19NSU5fVkVSU0lPTiA+PSBYVEVOU0FfSFdWRVJTSU9OX1JFXzIwMTJfMCkpCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlJTlRFUk5BTCBJL0QgUkFNL1JPTXMgYW5kIFhMTUkKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgWENIQUxfTlVNX0lOU1RST00JCTAJLyogbnVtYmVyIG9mIGNvcmUgaW5zdHIuIFJPTXMgKi8KKyNkZWZpbmUgWENIQUxfTlVNX0lOU1RSQU0JCTAJLyogbnVtYmVyIG9mIGNvcmUgaW5zdHIuIFJBTXMgKi8KKyNkZWZpbmUgWENIQUxfTlVNX0RBVEFST00JCTAJLyogbnVtYmVyIG9mIGNvcmUgZGF0YSBST01zICovCisjZGVmaW5lIFhDSEFMX05VTV9EQVRBUkFNCQkwCS8qIG51bWJlciBvZiBjb3JlIGRhdGEgUkFNcyAqLworI2RlZmluZSBYQ0hBTF9OVU1fVVJBTQkJCTAJLyogbnVtYmVyIG9mIGNvcmUgdW5pZmllZCBSQU1zKi8KKyNkZWZpbmUgWENIQUxfTlVNX1hMTUkJCQkwCS8qIG51bWJlciBvZiBjb3JlIFhMTUkgcG9ydHMgKi8KKworI2RlZmluZSBYQ0hBTF9IQVZFX0lNRU1fTE9BRFNUT1JFCTEJLyogY2FuIGxvYWQvc3RvcmUgdG8gSVJPTS9JUkFNKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCUlOVEVSUlVQVFMgYW5kIFRJTUVSUworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBYQ0hBTF9IQVZFX0lOVEVSUlVQVFMJCTEJLyogaW50ZXJydXB0IG9wdGlvbiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0hJR0hQUklfSU5URVJSVVBUUwkxCS8qIG1lZC9oaWdoLXByaS4gaW50ZXJydXB0cyAqLworI2RlZmluZSBYQ0hBTF9IQVZFX05NSQkJCTEJLyogbm9uLW1hc2thYmxlIGludGVycnVwdCAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0NDT1VOVAkJMQkvKiBDQ09VTlQgcmVnLiAodGltZXIgb3B0aW9uKSAqLworI2RlZmluZSBYQ0hBTF9OVU1fVElNRVJTCQkzCS8qIG51bWJlciBvZiBDQ09NUEFSRW4gcmVncyAqLworI2RlZmluZSBYQ0hBTF9OVU1fSU5URVJSVVBUUwkJMjIJLyogbnVtYmVyIG9mIGludGVycnVwdHMgKi8KKyNkZWZpbmUgWENIQUxfTlVNX0lOVEVSUlVQVFNfTE9HMgk1CS8qIGNlaWwobG9nMihOVU1fSU5URVJSVVBUUykpICovCisjZGVmaW5lIFhDSEFMX05VTV9FWFRJTlRFUlJVUFRTCQkxNgkvKiBudW0gb2YgZXh0ZXJuYWwgaW50ZXJydXB0cyAqLworI2RlZmluZSBYQ0hBTF9OVU1fSU5UTEVWRUxTCQk2CS8qIG51bWJlciBvZiBpbnRlcnJ1cHQgbGV2ZWxzCisJCQkJCQkgICAobm90IGluY2x1ZGluZyBsZXZlbCB6ZXJvKSAqLworI2RlZmluZSBYQ0hBTF9FWENNX0xFVkVMCQkzCS8qIGxldmVsIG1hc2tlZCBieSBQUy5FWENNICovCisJLyogKGFsd2F5cyAxIGluIFhFQTE7IGxldmVscyAyIC4uIEVYQ01fTEVWRUwgYXJlICJtZWRpdW0gcHJpb3JpdHkiKSAqLworCisvKiAgTWFza3Mgb2YgaW50ZXJydXB0cyBhdCBlYWNoIGludGVycnVwdCBsZXZlbDogICovCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMMV9NQVNLCQkweDAwMUYwMEJGCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMMl9NQVNLCQkweDAwMDAxMTQwCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMM19NQVNLCQkweDAwMjAwRTAwCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMNF9NQVNLCQkweDAwMDA4MDAwCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMNV9NQVNLCQkweDAwMDAyMDAwCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMNl9NQVNLCQkweDAwMDAwMDAwCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMN19NQVNLCQkweDAwMDA0MDAwCisKKy8qICBNYXNrcyBvZiBpbnRlcnJ1cHRzIGF0IGVhY2ggcmFuZ2UgMS4ubiBvZiBpbnRlcnJ1cHQgbGV2ZWxzOiAgKi8KKyNkZWZpbmUgWENIQUxfSU5UTEVWRUwxX0FOREJFTE9XX01BU0sJMHgwMDFGMDBCRgorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDJfQU5EQkVMT1dfTUFTSwkweDAwMUYxMUZGCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMM19BTkRCRUxPV19NQVNLCTB4MDAzRjFGRkYKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUw0X0FOREJFTE9XX01BU0sJMHgwMDNGOUZGRgorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDVfQU5EQkVMT1dfTUFTSwkweDAwM0ZCRkZGCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMNl9BTkRCRUxPV19NQVNLCTB4MDAzRkJGRkYKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUw3X0FOREJFTE9XX01BU0sJMHgwMDNGRkZGRgorCisvKiAgTGV2ZWwgb2YgZWFjaCBpbnRlcnJ1cHQ6ICAqLworI2RlZmluZSBYQ0hBTF9JTlQwX0xFVkVMCQkxCisjZGVmaW5lIFhDSEFMX0lOVDFfTEVWRUwJCTEKKyNkZWZpbmUgWENIQUxfSU5UMl9MRVZFTAkJMQorI2RlZmluZSBYQ0hBTF9JTlQzX0xFVkVMCQkxCisjZGVmaW5lIFhDSEFMX0lOVDRfTEVWRUwJCTEKKyNkZWZpbmUgWENIQUxfSU5UNV9MRVZFTAkJMQorI2RlZmluZSBYQ0hBTF9JTlQ2X0xFVkVMCQkyCisjZGVmaW5lIFhDSEFMX0lOVDdfTEVWRUwJCTEKKyNkZWZpbmUgWENIQUxfSU5UOF9MRVZFTAkJMgorI2RlZmluZSBYQ0hBTF9JTlQ5X0xFVkVMCQkzCisjZGVmaW5lIFhDSEFMX0lOVDEwX0xFVkVMCQkzCisjZGVmaW5lIFhDSEFMX0lOVDExX0xFVkVMCQkzCisjZGVmaW5lIFhDSEFMX0lOVDEyX0xFVkVMCQkyCisjZGVmaW5lIFhDSEFMX0lOVDEzX0xFVkVMCQk1CisjZGVmaW5lIFhDSEFMX0lOVDE0X0xFVkVMCQk3CisjZGVmaW5lIFhDSEFMX0lOVDE1X0xFVkVMCQk0CisjZGVmaW5lIFhDSEFMX0lOVDE2X0xFVkVMCQkxCisjZGVmaW5lIFhDSEFMX0lOVDE3X0xFVkVMCQkxCisjZGVmaW5lIFhDSEFMX0lOVDE4X0xFVkVMCQkxCisjZGVmaW5lIFhDSEFMX0lOVDE5X0xFVkVMCQkxCisjZGVmaW5lIFhDSEFMX0lOVDIwX0xFVkVMCQkxCisjZGVmaW5lIFhDSEFMX0lOVDIxX0xFVkVMCQkzCisjZGVmaW5lIFhDSEFMX0RFQlVHTEVWRUwJCTYJLyogZGVidWcgaW50ZXJydXB0IGxldmVsICovCisjZGVmaW5lIFhDSEFMX0hBVkVfREVCVUdfRVhURVJOX0lOVAkxCS8qIE9DRCBleHRlcm5hbCBkYiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgWENIQUxfTk1JTEVWRUwJCQk3CS8qIE5NSSAibGV2ZWwiIChmb3IgdXNlIHdpdGgKKwkJCQkJCSAgIEVYQ1NBVkUvRVBTL0VQQ19uLCBSRkkgbikgKi8KKworLyogIFR5cGUgb2YgZWFjaCBpbnRlcnJ1cHQ6ICAqLworI2RlZmluZSBYQ0hBTF9JTlQwX1RZUEUgCVhUSEFMX0lOVFRZUEVfRVhURVJOX0xFVkVMCisjZGVmaW5lIFhDSEFMX0lOVDFfVFlQRSAJWFRIQUxfSU5UVFlQRV9FWFRFUk5fTEVWRUwKKyNkZWZpbmUgWENIQUxfSU5UMl9UWVBFIAlYVEhBTF9JTlRUWVBFX0VYVEVSTl9MRVZFTAorI2RlZmluZSBYQ0hBTF9JTlQzX1RZUEUgCVhUSEFMX0lOVFRZUEVfRVhURVJOX0xFVkVMCisjZGVmaW5lIFhDSEFMX0lOVDRfVFlQRSAJWFRIQUxfSU5UVFlQRV9FWFRFUk5fTEVWRUwKKyNkZWZpbmUgWENIQUxfSU5UNV9UWVBFIAlYVEhBTF9JTlRUWVBFX0VYVEVSTl9MRVZFTAorI2RlZmluZSBYQ0hBTF9JTlQ2X1RZUEUgCVhUSEFMX0lOVFRZUEVfVElNRVIKKyNkZWZpbmUgWENIQUxfSU5UN19UWVBFIAlYVEhBTF9JTlRUWVBFX1NPRlRXQVJFCisjZGVmaW5lIFhDSEFMX0lOVDhfVFlQRSAJWFRIQUxfSU5UVFlQRV9FWFRFUk5fTEVWRUwKKyNkZWZpbmUgWENIQUxfSU5UOV9UWVBFIAlYVEhBTF9JTlRUWVBFX0VYVEVSTl9MRVZFTAorI2RlZmluZSBYQ0hBTF9JTlQxMF9UWVBFIAlYVEhBTF9JTlRUWVBFX1RJTUVSCisjZGVmaW5lIFhDSEFMX0lOVDExX1RZUEUgCVhUSEFMX0lOVFRZUEVfU09GVFdBUkUKKyNkZWZpbmUgWENIQUxfSU5UMTJfVFlQRSAJWFRIQUxfSU5UVFlQRV9FWFRFUk5fRURHRQorI2RlZmluZSBYQ0hBTF9JTlQxM19UWVBFIAlYVEhBTF9JTlRUWVBFX1RJTUVSCisjZGVmaW5lIFhDSEFMX0lOVDE0X1RZUEUgCVhUSEFMX0lOVFRZUEVfTk1JCisjZGVmaW5lIFhDSEFMX0lOVDE1X1RZUEUgCVhUSEFMX0lOVFRZUEVfUFJPRklMSU5HCisjZGVmaW5lIFhDSEFMX0lOVDE2X1RZUEUgCVhUSEFMX0lOVFRZUEVfRVhURVJOX0VER0UKKyNkZWZpbmUgWENIQUxfSU5UMTdfVFlQRSAJWFRIQUxfSU5UVFlQRV9FWFRFUk5fRURHRQorI2RlZmluZSBYQ0hBTF9JTlQxOF9UWVBFIAlYVEhBTF9JTlRUWVBFX0VYVEVSTl9FREdFCisjZGVmaW5lIFhDSEFMX0lOVDE5X1RZUEUgCVhUSEFMX0lOVFRZUEVfRVhURVJOX0VER0UKKyNkZWZpbmUgWENIQUxfSU5UMjBfVFlQRSAJWFRIQUxfSU5UVFlQRV9FWFRFUk5fRURHRQorI2RlZmluZSBYQ0hBTF9JTlQyMV9UWVBFIAlYVEhBTF9JTlRUWVBFX0VYVEVSTl9FREdFCisKKy8qICBNYXNrcyBvZiBpbnRlcnJ1cHRzIGZvciBlYWNoIHR5cGUgb2YgaW50ZXJydXB0OiAgKi8KKyNkZWZpbmUgWENIQUxfSU5UVFlQRV9NQVNLX1VOQ09ORklHVVJFRAkweEZGQzAwMDAwCisjZGVmaW5lIFhDSEFMX0lOVFRZUEVfTUFTS19TT0ZUV0FSRQkweDAwMDAwODgwCisjZGVmaW5lIFhDSEFMX0lOVFRZUEVfTUFTS19FWFRFUk5fRURHRQkweDAwM0YxMDAwCisjZGVmaW5lIFhDSEFMX0lOVFRZUEVfTUFTS19FWFRFUk5fTEVWRUwJMHgwMDAwMDMzRgorI2RlZmluZSBYQ0hBTF9JTlRUWVBFX01BU0tfVElNRVIJMHgwMDAwMjQ0MAorI2RlZmluZSBYQ0hBTF9JTlRUWVBFX01BU0tfTk1JCQkweDAwMDA0MDAwCisjZGVmaW5lIFhDSEFMX0lOVFRZUEVfTUFTS19XUklURV9FUlJPUgkweDAwMDAwMDAwCisjZGVmaW5lIFhDSEFMX0lOVFRZUEVfTUFTS19QUk9GSUxJTkcJMHgwMDAwODAwMAorCisvKiAgSW50ZXJydXB0IG51bWJlcnMgYXNzaWduZWQgdG8gc3BlY2lmaWMgaW50ZXJydXB0IHNvdXJjZXM6ICAqLworI2RlZmluZSBYQ0hBTF9USU1FUjBfSU5URVJSVVBUCQk2CS8qIENDT01QQVJFMCAqLworI2RlZmluZSBYQ0hBTF9USU1FUjFfSU5URVJSVVBUCQkxMAkvKiBDQ09NUEFSRTEgKi8KKyNkZWZpbmUgWENIQUxfVElNRVIyX0lOVEVSUlVQVAkJMTMJLyogQ0NPTVBBUkUyICovCisjZGVmaW5lIFhDSEFMX1RJTUVSM19JTlRFUlJVUFQJCVhUSEFMX1RJTUVSX1VOQ09ORklHVVJFRAorI2RlZmluZSBYQ0hBTF9OTUlfSU5URVJSVVBUCQkxNAkvKiBub24tbWFza2FibGUgaW50ZXJydXB0ICovCisjZGVmaW5lIFhDSEFMX1BST0ZJTElOR19JTlRFUlJVUFQJMTUJLyogcHJvZmlsaW5nIGludGVycnVwdCAqLworCisvKiAgSW50ZXJydXB0IG51bWJlcnMgZm9yIGxldmVscyBhdCB3aGljaCBvbmx5IG9uZSBpbnRlcnJ1cHQgaXMgY29uZmlndXJlZDogICovCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMNF9OVU0JCTE1CisjZGVmaW5lIFhDSEFMX0lOVExFVkVMNV9OVU0JCTEzCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMN19OVU0JCTE0CisvKiAgKFRoZXJlIGFyZSBtYW55IGludGVycnVwdHMgZWFjaCBhdCBsZXZlbChzKSAxLCAyLCAzLikgICovCisKKworLyoKKyAqICBFeHRlcm5hbCBpbnRlcnJ1cHQgbWFwcGluZy4KKyAqICBUaGVzZSBtYWNyb3MgZGVzY3JpYmUgaG93IFh0ZW5zYSBwcm9jZXNzb3IgaW50ZXJydXB0IG51bWJlcnMKKyAqICAoYXMgbnVtYmVyZWQgaW50ZXJuYWxseSwgZWcuIGluIElOVEVSUlVQVCBhbmQgSU5URU5BQkxFIHJlZ2lzdGVycykKKyAqICBtYXAgdG8gZXh0ZXJuYWwgQkludGVycnVwdDxuPiBwaW5zLCBmb3IgdGhvc2UgaW50ZXJydXB0cworICogIGNvbmZpZ3VyZWQgYXMgZXh0ZXJuYWwgKGxldmVsLXRyaWdnZXJlZCwgZWRnZS10cmlnZ2VyZWQsIG9yIE5NSSkuCisgKiAgU2VlIHRoZSBYdGVuc2EgcHJvY2Vzc29yIGRhdGFib29rIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyogIENvcmUgaW50ZXJydXB0IG51bWJlcnMgbWFwcGVkIHRvIGVhY2ggRVhURVJOQUwgQkludGVycnVwdCBwaW4gbnVtYmVyOiAgKi8KKyNkZWZpbmUgWENIQUxfRVhUSU5UMF9OVU0JCTAJLyogKGludGxldmVsIDEpICovCisjZGVmaW5lIFhDSEFMX0VYVElOVDFfTlVNCQkxCS8qIChpbnRsZXZlbCAxKSAqLworI2RlZmluZSBYQ0hBTF9FWFRJTlQyX05VTQkJMgkvKiAoaW50bGV2ZWwgMSkgKi8KKyNkZWZpbmUgWENIQUxfRVhUSU5UM19OVU0JCTMJLyogKGludGxldmVsIDEpICovCisjZGVmaW5lIFhDSEFMX0VYVElOVDRfTlVNCQk0CS8qIChpbnRsZXZlbCAxKSAqLworI2RlZmluZSBYQ0hBTF9FWFRJTlQ1X05VTQkJNQkvKiAoaW50bGV2ZWwgMSkgKi8KKyNkZWZpbmUgWENIQUxfRVhUSU5UNl9OVU0JCTgJLyogKGludGxldmVsIDIpICovCisjZGVmaW5lIFhDSEFMX0VYVElOVDdfTlVNCQk5CS8qIChpbnRsZXZlbCAzKSAqLworI2RlZmluZSBYQ0hBTF9FWFRJTlQ4X05VTQkJMTIJLyogKGludGxldmVsIDIpICovCisjZGVmaW5lIFhDSEFMX0VYVElOVDlfTlVNCQkxNAkvKiAoaW50bGV2ZWwgNykgKi8KKyNkZWZpbmUgWENIQUxfRVhUSU5UMTBfTlVNCQkxNgkvKiAoaW50bGV2ZWwgMSkgKi8KKyNkZWZpbmUgWENIQUxfRVhUSU5UMTFfTlVNCQkxNwkvKiAoaW50bGV2ZWwgMSkgKi8KKyNkZWZpbmUgWENIQUxfRVhUSU5UMTJfTlVNCQkxOAkvKiAoaW50bGV2ZWwgMSkgKi8KKyNkZWZpbmUgWENIQUxfRVhUSU5UMTNfTlVNCQkxOQkvKiAoaW50bGV2ZWwgMSkgKi8KKyNkZWZpbmUgWENIQUxfRVhUSU5UMTRfTlVNCQkyMAkvKiAoaW50bGV2ZWwgMSkgKi8KKyNkZWZpbmUgWENIQUxfRVhUSU5UMTVfTlVNCQkyMQkvKiAoaW50bGV2ZWwgMykgKi8KKy8qICBFWFRFUk5BTCBCSW50ZXJydXB0IHBpbiBudW1iZXJzIG1hcHBlZCB0byBlYWNoIGNvcmUgaW50ZXJydXB0IG51bWJlcjogICovCisjZGVmaW5lIFhDSEFMX0lOVDBfRVhUTlVNCQkwCS8qIChpbnRsZXZlbCAxKSAqLworI2RlZmluZSBYQ0hBTF9JTlQxX0VYVE5VTQkJMQkvKiAoaW50bGV2ZWwgMSkgKi8KKyNkZWZpbmUgWENIQUxfSU5UMl9FWFROVU0JCTIJLyogKGludGxldmVsIDEpICovCisjZGVmaW5lIFhDSEFMX0lOVDNfRVhUTlVNCQkzCS8qIChpbnRsZXZlbCAxKSAqLworI2RlZmluZSBYQ0hBTF9JTlQ0X0VYVE5VTQkJNAkvKiAoaW50bGV2ZWwgMSkgKi8KKyNkZWZpbmUgWENIQUxfSU5UNV9FWFROVU0JCTUJLyogKGludGxldmVsIDEpICovCisjZGVmaW5lIFhDSEFMX0lOVDhfRVhUTlVNCQk2CS8qIChpbnRsZXZlbCAyKSAqLworI2RlZmluZSBYQ0hBTF9JTlQ5X0VYVE5VTQkJNwkvKiAoaW50bGV2ZWwgMykgKi8KKyNkZWZpbmUgWENIQUxfSU5UMTJfRVhUTlVNCQk4CS8qIChpbnRsZXZlbCAyKSAqLworI2RlZmluZSBYQ0hBTF9JTlQxNF9FWFROVU0JCTkJLyogKGludGxldmVsIDcpICovCisjZGVmaW5lIFhDSEFMX0lOVDE2X0VYVE5VTQkJMTAJLyogKGludGxldmVsIDEpICovCisjZGVmaW5lIFhDSEFMX0lOVDE3X0VYVE5VTQkJMTEJLyogKGludGxldmVsIDEpICovCisjZGVmaW5lIFhDSEFMX0lOVDE4X0VYVE5VTQkJMTIJLyogKGludGxldmVsIDEpICovCisjZGVmaW5lIFhDSEFMX0lOVDE5X0VYVE5VTQkJMTMJLyogKGludGxldmVsIDEpICovCisjZGVmaW5lIFhDSEFMX0lOVDIwX0VYVE5VTQkJMTQJLyogKGludGxldmVsIDEpICovCisjZGVmaW5lIFhDSEFMX0lOVDIxX0VYVE5VTQkJMTUJLyogKGludGxldmVsIDMpICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlFWENFUFRJT05TIGFuZCBWRUNUT1JTCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFhDSEFMX1hFQV9WRVJTSU9OCQkyCS8qIFh0ZW5zYSBFeGNlcHRpb24gQXJjaGl0ZWN0dXJlCisJCQkJCQkgICBudW1iZXI6IDEgPT0gWEVBMSAob2xkKQorCQkJCQkJCSAgIDIgPT0gWEVBMiAobmV3KQorCQkJCQkJCSAgIDAgPT0gWEVBWCAoZXh0ZXJuKSBvciBUWCAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1hFQTEJCQkwCS8qIEV4Y2VwdGlvbiBBcmNoaXRlY3R1cmUgMSAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1hFQTIJCQkxCS8qIEV4Y2VwdGlvbiBBcmNoaXRlY3R1cmUgMiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1hFQVgJCQkwCS8qIEV4dGVybmFsIEV4Y2VwdGlvbiBBcmNoLiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0VYQ0VQVElPTlMJCTEJLyogZXhjZXB0aW9uIG9wdGlvbiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0hBTFQJCQkwCS8qIGhhbHQgYXJjaGl0ZWN0dXJlIG9wdGlvbiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0JPT1RMT0FERVIJCTAJLyogYm9vdCBsb2FkZXIgKGZvciBUWCkgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9NRU1fRUNDX1BBUklUWQkwCS8qIGxvY2FsIG1lbW9yeSBFQ0MvcGFyaXR5ICovCisjZGVmaW5lIFhDSEFMX0hBVkVfVkVDVE9SX1NFTEVDVAkxCS8qIHJlbG9jYXRhYmxlIHZlY3RvcnMgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9WRUNCQVNFCQkxCS8qIHJlbG9jYXRhYmxlIHZlY3RvcnMgKi8KKyNkZWZpbmUgWENIQUxfVkVDQkFTRV9SRVNFVF9WQUREUgkweDAwMDAyMDAwICAvKiBWRUNCQVNFIHJlc2V0IHZhbHVlICovCisjZGVmaW5lIFhDSEFMX1ZFQ0JBU0VfUkVTRVRfUEFERFIJMHgwMDAwMjAwMAorI2RlZmluZSBYQ0hBTF9SRVNFVF9WRUNCQVNFX09WRVJMQVAJMAorCisjZGVmaW5lIFhDSEFMX1JFU0VUX1ZFQ1RPUjBfVkFERFIJMHhGRTAwMDAwMAorI2RlZmluZSBYQ0hBTF9SRVNFVF9WRUNUT1IwX1BBRERSCTB4RkUwMDAwMDAKKyNkZWZpbmUgWENIQUxfUkVTRVRfVkVDVE9SMV9WQUREUgkweDAwMDAxMDAwCisjZGVmaW5lIFhDSEFMX1JFU0VUX1ZFQ1RPUjFfUEFERFIJMHgwMDAwMTAwMAorI2RlZmluZSBYQ0hBTF9SRVNFVF9WRUNUT1JfVkFERFIJMHhGRTAwMDAwMAorI2RlZmluZSBYQ0hBTF9SRVNFVF9WRUNUT1JfUEFERFIJMHhGRTAwMDAwMAorI2RlZmluZSBYQ0hBTF9VU0VSX1ZFQ09GUwkJMHgwMDAwMDM0MAorI2RlZmluZSBYQ0hBTF9VU0VSX1ZFQ1RPUl9WQUREUgkJMHgwMDAwMjM0MAorI2RlZmluZSBYQ0hBTF9VU0VSX1ZFQ1RPUl9QQUREUgkJMHgwMDAwMjM0MAorI2RlZmluZSBYQ0hBTF9LRVJORUxfVkVDT0ZTCQkweDAwMDAwMzAwCisjZGVmaW5lIFhDSEFMX0tFUk5FTF9WRUNUT1JfVkFERFIJMHgwMDAwMjMwMAorI2RlZmluZSBYQ0hBTF9LRVJORUxfVkVDVE9SX1BBRERSCTB4MDAwMDIzMDAKKyNkZWZpbmUgWENIQUxfRE9VQkxFRVhDX1ZFQ09GUwkJMHgwMDAwMDNDMAorI2RlZmluZSBYQ0hBTF9ET1VCTEVFWENfVkVDVE9SX1ZBRERSCTB4MDAwMDIzQzAKKyNkZWZpbmUgWENIQUxfRE9VQkxFRVhDX1ZFQ1RPUl9QQUREUgkweDAwMDAyM0MwCisjZGVmaW5lIFhDSEFMX1dJTkRPV19PRjRfVkVDT0ZTCQkweDAwMDAwMDAwCisjZGVmaW5lIFhDSEFMX1dJTkRPV19VRjRfVkVDT0ZTCQkweDAwMDAwMDQwCisjZGVmaW5lIFhDSEFMX1dJTkRPV19PRjhfVkVDT0ZTCQkweDAwMDAwMDgwCisjZGVmaW5lIFhDSEFMX1dJTkRPV19VRjhfVkVDT0ZTCQkweDAwMDAwMEMwCisjZGVmaW5lIFhDSEFMX1dJTkRPV19PRjEyX1ZFQ09GUwkweDAwMDAwMTAwCisjZGVmaW5lIFhDSEFMX1dJTkRPV19VRjEyX1ZFQ09GUwkweDAwMDAwMTQwCisjZGVmaW5lIFhDSEFMX1dJTkRPV19WRUNUT1JTX1ZBRERSCTB4MDAwMDIwMDAKKyNkZWZpbmUgWENIQUxfV0lORE9XX1ZFQ1RPUlNfUEFERFIJMHgwMDAwMjAwMAorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDJfVkVDT0ZTCQkweDAwMDAwMTgwCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMMl9WRUNUT1JfVkFERFIJMHgwMDAwMjE4MAorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDJfVkVDVE9SX1BBRERSCTB4MDAwMDIxODAKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUwzX1ZFQ09GUwkJMHgwMDAwMDFDMAorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDNfVkVDVE9SX1ZBRERSCTB4MDAwMDIxQzAKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUwzX1ZFQ1RPUl9QQUREUgkweDAwMDAyMUMwCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMNF9WRUNPRlMJCTB4MDAwMDAyMDAKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUw0X1ZFQ1RPUl9WQUREUgkweDAwMDAyMjAwCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMNF9WRUNUT1JfUEFERFIJMHgwMDAwMjIwMAorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDVfVkVDT0ZTCQkweDAwMDAwMjQwCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMNV9WRUNUT1JfVkFERFIJMHgwMDAwMjI0MAorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDVfVkVDVE9SX1BBRERSCTB4MDAwMDIyNDAKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUw2X1ZFQ09GUwkJMHgwMDAwMDI4MAorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDZfVkVDVE9SX1ZBRERSCTB4MDAwMDIyODAKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUw2X1ZFQ1RPUl9QQUREUgkweDAwMDAyMjgwCisjZGVmaW5lIFhDSEFMX0RFQlVHX1ZFQ09GUwkJWENIQUxfSU5UTEVWRUw2X1ZFQ09GUworI2RlZmluZSBYQ0hBTF9ERUJVR19WRUNUT1JfVkFERFIJWENIQUxfSU5UTEVWRUw2X1ZFQ1RPUl9WQUREUgorI2RlZmluZSBYQ0hBTF9ERUJVR19WRUNUT1JfUEFERFIJWENIQUxfSU5UTEVWRUw2X1ZFQ1RPUl9QQUREUgorI2RlZmluZSBYQ0hBTF9OTUlfVkVDT0ZTCQkweDAwMDAwMkMwCisjZGVmaW5lIFhDSEFMX05NSV9WRUNUT1JfVkFERFIJCTB4MDAwMDIyQzAKKyNkZWZpbmUgWENIQUxfTk1JX1ZFQ1RPUl9QQUREUgkJMHgwMDAwMjJDMAorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDdfVkVDT0ZTCQlYQ0hBTF9OTUlfVkVDT0ZTCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMN19WRUNUT1JfVkFERFIJWENIQUxfTk1JX1ZFQ1RPUl9WQUREUgorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDdfVkVDVE9SX1BBRERSCVhDSEFMX05NSV9WRUNUT1JfUEFERFIKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQlERUJVRyBNT0RVTEUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qICBNaXNjICAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0RFQlVHX0VSSQkJMQkvKiBFUkkgdG8gZGVidWcgbW9kdWxlICovCisjZGVmaW5lIFhDSEFMX0hBVkVfREVCVUdfQVBCCQkxCS8qIEFQQiB0byBkZWJ1ZyBtb2R1bGUgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9ERUJVR19KVEFHCQkxCS8qIEpUQUcgdG8gZGVidWcgbW9kdWxlICovCisKKy8qICBPbi1DaGlwIERlYnVnIChPQ0QpICAqLworI2RlZmluZSBYQ0hBTF9IQVZFX09DRAkJCTEJLyogT25DaGlwRGVidWcgb3B0aW9uICovCisjZGVmaW5lIFhDSEFMX05VTV9JQlJFQUsJCTIJLyogbnVtYmVyIG9mIElCUkVBS24gcmVncyAqLworI2RlZmluZSBYQ0hBTF9OVU1fREJSRUFLCQkyCS8qIG51bWJlciBvZiBEQlJFQUtuIHJlZ3MgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9PQ0RfRElSX0FSUkFZCTAJLyogZmFzdGVyIE9DRCBvcHRpb24gKHRvIExYNCkgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9PQ0RfTFMzMkREUgkJMQkvKiBMMzJERFIvUzMyRERSIChmYXN0ZXIgT0NEKSAqLworCisvKiAgVFJBWCAoaW4gY29yZSkgICovCisjZGVmaW5lIFhDSEFMX0hBVkVfVFJBWAkJCTEJLyogVFJBWCBpbiBkZWJ1ZyBtb2R1bGUgKi8KKyNkZWZpbmUgWENIQUxfVFJBWF9NRU1fU0laRQkJMjYyMTQ0CS8qIFRSQVggbWVtb3J5IHNpemUgaW4gYnl0ZXMgKi8KKyNkZWZpbmUgWENIQUxfVFJBWF9NRU1fU0hBUkVBQkxFCTEJLyogc3RhcnQvZW5kIHJlZ3M7IHJlYWR5IHNpZy4gKi8KKyNkZWZpbmUgWENIQUxfVFJBWF9BVEJfV0lEVEgJCTAJLyogQVRCIHdpZHRoIChiaXRzKSwgMD1ubyBBVEIgKi8KKyNkZWZpbmUgWENIQUxfVFJBWF9USU1FX1dJRFRICQkwCS8qIHRpbWVzdGFtcCBiaXR3aWR0aCwgMD1ub25lICovCisKKy8qICBQZXJmIGNvdW50ZXJzICAqLworI2RlZmluZSBYQ0hBTF9OVU1fUEVSRl9DT1VOVEVSUwkJOAkvKiBwZXJmb3JtYW5jZSBjb3VudGVycyAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCU1NVQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogIFNlZSBjb3JlLW1hdG1hcC5oIGhlYWRlciBmaWxlIGZvciBtb3JlIGRldGFpbHMuICAqLworCisjZGVmaW5lIFhDSEFMX0hBVkVfVExCUwkJCTEJLyogaW52ZXJzZSBvZiBIQVZFX0NBQ0hFQVRUUiAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1NQQU5OSU5HX1dBWQkJMQkvKiBvbmUgd2F5IG1hcHMgSStEIDRHQiB2YWRkciAqLworI2RlZmluZSBYQ0hBTF9TUEFOTklOR19XQVkJCTYJLyogVExCIHNwYW5uaW5nIHdheSBudW1iZXIgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9JREVOVElUWV9NQVAJCTAJLyogdmFkZHIgPT0gcGFkZHIgYWx3YXlzICovCisjZGVmaW5lIFhDSEFMX0hBVkVfQ0FDSEVBVFRSCQkwCS8qIENBQ0hFQVRUUiByZWdpc3RlciBwcmVzZW50ICovCisjZGVmaW5lIFhDSEFMX0hBVkVfTUlNSUNfQ0FDSEVBVFRSCTAJLyogcmVnaW9uIHByb3RlY3Rpb24gKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9YTFRfQ0FDSEVBVFRSCTAJLyogcmVnaW9uIHByb3QuIHcvdHJhbnNsYXRpb24gKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9QVFBfTU1VCQkxCS8qIGZ1bGwgTU1VICh3aXRoIHBhZ2UgdGFibGUKKwkJCQkJCSAgIFthdXRvcmVmaWxsXSBhbmQgcHJvdGVjdGlvbikKKwkJCQkJCSAgIHVzYWJsZSBmb3IgYW4gTU1VLWJhc2VkIE9TICovCisvKiAgSWYgbm9uZSBvZiB0aGUgYWJvdmUgbGFzdCA0IGFyZSBzZXQsIGl0J3MgYSBjdXN0b20gVExCIGNvbmZpZ3VyYXRpb24uICAqLworI2RlZmluZSBYQ0hBTF9JVExCX0FSRl9FTlRSSUVTX0xPRzIJMgkvKiBsb2cyKGF1dG9yZWZpbGwgd2F5IHNpemUpICovCisjZGVmaW5lIFhDSEFMX0RUTEJfQVJGX0VOVFJJRVNfTE9HMgkyCS8qIGxvZzIoYXV0b3JlZmlsbCB3YXkgc2l6ZSkgKi8KKworI2RlZmluZSBYQ0hBTF9NTVVfQVNJRF9CSVRTCQk4CS8qIG51bWJlciBvZiBiaXRzIGluIEFTSURzICovCisjZGVmaW5lIFhDSEFMX01NVV9SSU5HUwkJCTQJLyogbnVtYmVyIG9mIHJpbmdzICgxLi40KSAqLworI2RlZmluZSBYQ0hBTF9NTVVfUklOR19CSVRTCQkyCS8qIG51bSBvZiBiaXRzIGluIFJJTkcgZmllbGQgKi8KKworI2VuZGlmIC8qICFYVEVOU0FfSEFMX05PTl9QUklWSUxFR0VEX09OTFkgKi8KKworCisjZW5kaWYgLyogX1hURU5TQV9DT1JFX0NPTkZJR1VSQVRJT05fSCAqLworCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS92YXJpYW50cy9jc3AvaW5jbHVkZS92YXJpYW50L3RpZS1hc20uaCBiL2FyY2gveHRlbnNhL3ZhcmlhbnRzL2NzcC9pbmNsdWRlL3ZhcmlhbnQvdGllLWFzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNzczYzQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS92YXJpYW50cy9jc3AvaW5jbHVkZS92YXJpYW50L3RpZS1hc20uaApAQCAtMCwwICsxLDE5NCBAQAorLyogCisgKiB0aWUtYXNtLmggLS0gY29tcGlsZS10aW1lIEhBTCBhc3NlbWJsZXIgZGVmaW5pdGlvbnMgZGVwZW5kZW50IG9uIENPUkUgJiBUSUUKKyAqCisgKiAgTk9URTogIFRoaXMgaGVhZGVyIGZpbGUgaXMgbm90IG1lYW50IHRvIGJlIGluY2x1ZGVkIGRpcmVjdGx5LgorICovCisKKy8qIFRoaXMgaGVhZGVyIGZpbGUgY29udGFpbnMgYXNzZW1ibHktbGFuZ3VhZ2UgZGVmaW5pdGlvbnMgKGFzc2VtYmx5CisgICBtYWNyb3MsIGV0Yy4pIGZvciB0aGlzIHNwZWNpZmljIFh0ZW5zYSBwcm9jZXNzb3IncyBUSUUgZXh0ZW5zaW9ucworICAgYW5kIG9wdGlvbnMuICBJdCBpcyBjdXN0b21pemVkIHRvIHRoaXMgWHRlbnNhIHByb2Nlc3NvciBjb25maWd1cmF0aW9uLgorCisgICBDb3B5cmlnaHQgKGMpIDE5OTktMjAxNSBDYWRlbmNlIERlc2lnbiBTeXN0ZW1zIEluYy4KKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAgIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisgICBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICAgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAgIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgKi8KKworI2lmbmRlZiBfWFRFTlNBX0NPUkVfVElFX0FTTV9ICisjZGVmaW5lIF9YVEVOU0FfQ09SRV9USUVfQVNNX0gKKworLyogIFNlbGVjdGlvbiBwYXJhbWV0ZXIgdmFsdWVzIGZvciBzYXZlLWFyZWEgc2F2ZS9yZXN0b3JlIG1hY3JvczogICovCisvKiAgT3B0aW9uIHZzLiBUSUU6ICAqLworI2RlZmluZSBYVEhBTF9TQVNfVElFCTB4MDAwMQkvKiBjdXN0b20gZXh0ZW5zaW9uIG9yIGNvcHJvY2Vzc29yICovCisjZGVmaW5lIFhUSEFMX1NBU19PUFQJMHgwMDAyCS8qIG9wdGlvbmFsIChhbmQgbm90IGEgY29wcm9jZXNzb3IpICovCisjZGVmaW5lIFhUSEFMX1NBU19BTllPVAkweDAwMDMJLyogYm90aCBvZiB0aGUgYWJvdmUgKi8KKy8qICBXaGV0aGVyIHVzZWQgYXV0b21hdGljYWxseSBieSBjb21waWxlcjogICovCisjZGVmaW5lIFhUSEFMX1NBU19OT0NDCTB4MDAwNAkvKiBub3QgdXNlZCBieSBjb21waWxlciB3L28gc3BlY2lhbCBvcHRzL2NvZGUgKi8KKyNkZWZpbmUgWFRIQUxfU0FTX0NDCTB4MDAwOAkvKiB1c2VkIGJ5IGNvbXBpbGVyIHdpdGhvdXQgc3BlY2lhbCBvcHRzL2NvZGUgKi8KKyNkZWZpbmUgWFRIQUxfU0FTX0FOWUNDCTB4MDAwQwkvKiBib3RoIG9mIHRoZSBhYm92ZSAqLworLyogIEFCSSBoYW5kbGluZyBhY3Jvc3MgZnVuY3Rpb24gY2FsbHM6ICAqLworI2RlZmluZSBYVEhBTF9TQVNfQ0FMUgkweDAwMTAJLyogY2FsbGVyLXNhdmVkICovCisjZGVmaW5lIFhUSEFMX1NBU19DQUxFCTB4MDAyMAkvKiBjYWxsZWUtc2F2ZWQgKi8KKyNkZWZpbmUgWFRIQUxfU0FTX0dMT0IJMHgwMDQwCS8qIGdsb2JhbCBhY3Jvc3MgZnVuY3Rpb24gY2FsbHMgKGluIHRocmVhZCkgKi8KKyNkZWZpbmUgWFRIQUxfU0FTX0FOWUFCSQkweDAwNzAJLyogYWxsIG9mIHRoZSBhYm92ZSB0aHJlZSAqLworLyogIE1pc2MgICovCisjZGVmaW5lIFhUSEFMX1NBU19BTEwJMHhGRkZGCS8qIGluY2x1ZGUgYWxsIGRlZmF1bHQgTkNQIGNvbnRlbnRzICovCisjZGVmaW5lIFhUSEFMX1NBUzMob3B0aWUsY2N1c2UsYWJpKQkoICgob3B0aWUpICYgWFRIQUxfU0FTX0FOWU9UKSAgXAorCQkJCQl8ICgoY2N1c2UpICYgWFRIQUxfU0FTX0FOWUNDKSAgXAorCQkJCQl8ICgoYWJpKSAgICYgWFRIQUxfU0FTX0FOWUFCSSkgKQorCisKKyAgICAvKgorICAgICAgKiAgTWFjcm8gdG8gc3RvcmUgYWxsIG5vbi1jb3Byb2Nlc3NvciAoZXh0cmEpIGN1c3RvbSBUSUUgYW5kIG9wdGlvbmFsIHN0YXRlCisgICAgICAqICAobm90IGluY2x1ZGluZyB6ZXJvLW92ZXJoZWFkIGxvb3AgcmVnaXN0ZXJzKS4KKyAgICAgICogIFJlcXVpcmVkIHBhcmFtZXRlcnM6CisgICAgICAqICAgICAgcHRyICAgICAgICAgU2F2ZSBhcmVhIHBvaW50ZXIgYWRkcmVzcyByZWdpc3RlciAoY2xvYmJlcmVkKQorICAgICAgKiAgICAgICAgICAgICAgICAgIChyZWdpc3RlciBtdXN0IGNvbnRhaW4gYSA0IGJ5dGUgYWxpZ25lZCBhZGRyZXNzKS4KKyAgICAgICogICAgICBhdDEuLmF0NCAgICBGb3VyIHRlbXBvcmFyeSBhZGRyZXNzIHJlZ2lzdGVycyAoZmlyc3QgWENIQUxfTkNQX05VTV9BVE1QUworICAgICAgKiAgICAgICAgICAgICAgICAgIHJlZ2lzdGVycyBhcmUgY2xvYmJlcmVkLCB0aGUgcmVtYWluaW5nIGFyZSB1bnVzZWQpLgorICAgICAgKiAgT3B0aW9uYWwgcGFyYW1ldGVyczoKKyAgICAgICogICAgICBjb250aW51ZSAgICBJZiBtYWNybyBpbnZva2VkIGFzIHBhcnQgb2YgYSBsYXJnZXIgc3RvcmUgc2VxdWVuY2UsIHNldCB0byAxCisgICAgICAqICAgICAgICAgICAgICAgICAgaWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IGluIHRoZSBzZXF1ZW5jZS4gIERlZmF1bHRzIHRvIDAuCisgICAgICAqICAgICAgb2ZzICAgICAgICAgT2Zmc2V0IGZyb20gc3RhcnQgb2YgbGFyZ2VyIHNlcXVlbmNlIChmcm9tIHZhbHVlIG9mIGZpcnN0IHB0cgorICAgICAgKiAgICAgICAgICAgICAgICAgIGluIHNlcXVlbmNlKSBhdCB3aGljaCB0byBzdG9yZS4gIERlZmF1bHRzIHRvIG5leHQgYXZhaWxhYmxlIHNwYWNlCisgICAgICAqICAgICAgICAgICAgICAgICAgKG9yIDAgaWYgPGNvbnRpbnVlPiBpcyAwKS4KKyAgICAgICogICAgICBzZWxlY3QgICAgICBTZWxlY3Qgd2hhdCBjYXRlZ29yeShpZXMpIG9mIHJlZ2lzdGVycyB0byBzdG9yZSwgYXMgYSBiaXRtYXNrCisgICAgICAqICAgICAgICAgICAgICAgICAgKHNlZSBYVEhBTF9TQVNfeHh4IGNvbnN0YW50cykuICBEZWZhdWx0cyB0byBhbGwgcmVnaXN0ZXJzLgorICAgICAgKiAgICAgIGFsbG9jICAgICAgIFNlbGVjdCB3aGF0IGNhdGVnb3J5KGllcykgb2YgcmVnaXN0ZXJzIHRvIGFsbG9jYXRlOyBpZiBhbnkKKyAgICAgICogICAgICAgICAgICAgICAgICBjYXRlZ29yeSBpcyBzZWxlY3RlZCBoZXJlIHRoYXQgaXMgbm90IGluIDxzZWxlY3Q+LCBzcGFjZSBmb3IKKyAgICAgICogICAgICAgICAgICAgICAgICB0aGUgY29ycmVzcG9uZGluZyByZWdpc3RlcnMgaXMgc2tpcHBlZCB3aXRob3V0IGRvaW5nIGFueSBzdG9yZS4KKyAgICAgICovCisgICAgLm1hY3JvIHhjaGFsX25jcF9zdG9yZSAgcHRyIGF0MSBhdDIgYXQzIGF0NCAgY29udGludWU9MCBvZnM9LTEgc2VsZWN0PVhUSEFMX1NBU19BTEwgYWxsb2M9MAorCXhjaGFsX3NhX3N0YXJ0CVxjb250aW51ZSwgXG9mcworCS8vIE9wdGlvbmFsIGdsb2JhbCByZWdpc3RlcnMgdXNlZCBieSBkZWZhdWx0IGJ5IHRoZSBjb21waWxlcjoKKwkuaWZlcSAoWFRIQUxfU0FTX09QVCB8IFhUSEFMX1NBU19DQyB8IFhUSEFMX1NBU19HTE9CKSAmIH4oXHNlbGVjdCkKKwl4Y2hhbF9zYV9hbGlnbglccHRyLCAwLCAxMDIwLCA0LCA0CisJcnVyLlRIUkVBRFBUUglcYXQxCQkvLyB0aHJlYWRwdHIgb3B0aW9uCisJczMyaQlcYXQxLCBccHRyLCAuTHhjaGFsX29mc18rMAorCS5zZXQJLkx4Y2hhbF9vZnNfLCAuTHhjaGFsX29mc18gKyA0CisJLmVsc2VpZiAoKFhUSEFMX1NBU19PUFQgfCBYVEhBTF9TQVNfQ0MgfCBYVEhBTF9TQVNfR0xPQikgJiB+KFxhbGxvYykpID09IDAKKwl4Y2hhbF9zYV9hbGlnbglccHRyLCAwLCAxMDIwLCA0LCA0CisJLnNldAkuTHhjaGFsX29mc18sIC5MeGNoYWxfb2ZzXyArIDQKKwkuZW5kaWYKKwkvLyBPcHRpb25hbCBjYWxsZXItc2F2ZWQgcmVnaXN0ZXJzIHVzZWQgYnkgZGVmYXVsdCBieSB0aGUgY29tcGlsZXI6CisJLmlmZXEgKFhUSEFMX1NBU19PUFQgfCBYVEhBTF9TQVNfQ0MgfCBYVEhBTF9TQVNfQ0FMUikgJiB+KFxzZWxlY3QpCisJeGNoYWxfc2FfYWxpZ24JXHB0ciwgMCwgMTAxNiwgNCwgNAorCXJzci5BQ0NMTwlcYXQxCQkvLyBNQUMxNiBvcHRpb24KKwlzMzJpCVxhdDEsIFxwdHIsIC5MeGNoYWxfb2ZzXyswCisJcnNyLkFDQ0hJCVxhdDEJCS8vIE1BQzE2IG9wdGlvbgorCXMzMmkJXGF0MSwgXHB0ciwgLkx4Y2hhbF9vZnNfKzQKKwkuc2V0CS5MeGNoYWxfb2ZzXywgLkx4Y2hhbF9vZnNfICsgOAorCS5lbHNlaWYgKChYVEhBTF9TQVNfT1BUIHwgWFRIQUxfU0FTX0NDIHwgWFRIQUxfU0FTX0NBTFIpICYgfihcYWxsb2MpKSA9PSAwCisJeGNoYWxfc2FfYWxpZ24JXHB0ciwgMCwgMTAxNiwgNCwgNAorCS5zZXQJLkx4Y2hhbF9vZnNfLCAuTHhjaGFsX29mc18gKyA4CisJLmVuZGlmCisJLy8gT3B0aW9uYWwgY2FsbGVyLXNhdmVkIHJlZ2lzdGVycyBub3QgdXNlZCBieSBkZWZhdWx0IGJ5IHRoZSBjb21waWxlcjoKKwkuaWZlcSAoWFRIQUxfU0FTX09QVCB8IFhUSEFMX1NBU19OT0NDIHwgWFRIQUxfU0FTX0NBTFIpICYgfihcc2VsZWN0KQorCXhjaGFsX3NhX2FsaWduCVxwdHIsIDAsIDEwMDAsIDQsIDQKKwlyc3IuQlIJXGF0MQkJLy8gYm9vbGVhbiBvcHRpb24KKwlzMzJpCVxhdDEsIFxwdHIsIC5MeGNoYWxfb2ZzXyswCisJcnNyLlNDT01QQVJFMQlcYXQxCQkvLyBjb25kaXRpb25hbCBzdG9yZSBvcHRpb24KKwlzMzJpCVxhdDEsIFxwdHIsIC5MeGNoYWxfb2ZzXys0CisJcnNyLk0wCVxhdDEJCS8vIE1BQzE2IG9wdGlvbgorCXMzMmkJXGF0MSwgXHB0ciwgLkx4Y2hhbF9vZnNfKzgKKwlyc3IuTTEJXGF0MQkJLy8gTUFDMTYgb3B0aW9uCisJczMyaQlcYXQxLCBccHRyLCAuTHhjaGFsX29mc18rMTIKKwlyc3IuTTIJXGF0MQkJLy8gTUFDMTYgb3B0aW9uCisJczMyaQlcYXQxLCBccHRyLCAuTHhjaGFsX29mc18rMTYKKwlyc3IuTTMJXGF0MQkJLy8gTUFDMTYgb3B0aW9uCisJczMyaQlcYXQxLCBccHRyLCAuTHhjaGFsX29mc18rMjAKKwkuc2V0CS5MeGNoYWxfb2ZzXywgLkx4Y2hhbF9vZnNfICsgMjQKKwkuZWxzZWlmICgoWFRIQUxfU0FTX09QVCB8IFhUSEFMX1NBU19OT0NDIHwgWFRIQUxfU0FTX0NBTFIpICYgfihcYWxsb2MpKSA9PSAwCisJeGNoYWxfc2FfYWxpZ24JXHB0ciwgMCwgMTAwMCwgNCwgNAorCS5zZXQJLkx4Y2hhbF9vZnNfLCAuTHhjaGFsX29mc18gKyAyNAorCS5lbmRpZgorICAgIC5lbmRtCS8vIHhjaGFsX25jcF9zdG9yZQorCisgICAgLyoKKyAgICAgICogIE1hY3JvIHRvIGxvYWQgYWxsIG5vbi1jb3Byb2Nlc3NvciAoZXh0cmEpIGN1c3RvbSBUSUUgYW5kIG9wdGlvbmFsIHN0YXRlCisgICAgICAqICAobm90IGluY2x1ZGluZyB6ZXJvLW92ZXJoZWFkIGxvb3AgcmVnaXN0ZXJzKS4KKyAgICAgICogIFJlcXVpcmVkIHBhcmFtZXRlcnM6CisgICAgICAqICAgICAgcHRyICAgICAgICAgU2F2ZSBhcmVhIHBvaW50ZXIgYWRkcmVzcyByZWdpc3RlciAoY2xvYmJlcmVkKQorICAgICAgKiAgICAgICAgICAgICAgICAgIChyZWdpc3RlciBtdXN0IGNvbnRhaW4gYSA0IGJ5dGUgYWxpZ25lZCBhZGRyZXNzKS4KKyAgICAgICogICAgICBhdDEuLmF0NCAgICBGb3VyIHRlbXBvcmFyeSBhZGRyZXNzIHJlZ2lzdGVycyAoZmlyc3QgWENIQUxfTkNQX05VTV9BVE1QUworICAgICAgKiAgICAgICAgICAgICAgICAgIHJlZ2lzdGVycyBhcmUgY2xvYmJlcmVkLCB0aGUgcmVtYWluaW5nIGFyZSB1bnVzZWQpLgorICAgICAgKiAgT3B0aW9uYWwgcGFyYW1ldGVyczoKKyAgICAgICogICAgICBjb250aW51ZSAgICBJZiBtYWNybyBpbnZva2VkIGFzIHBhcnQgb2YgYSBsYXJnZXIgbG9hZCBzZXF1ZW5jZSwgc2V0IHRvIDEKKyAgICAgICogICAgICAgICAgICAgICAgICBpZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgaW4gdGhlIHNlcXVlbmNlLiAgRGVmYXVsdHMgdG8gMC4KKyAgICAgICogICAgICBvZnMgICAgICAgICBPZmZzZXQgZnJvbSBzdGFydCBvZiBsYXJnZXIgc2VxdWVuY2UgKGZyb20gdmFsdWUgb2YgZmlyc3QgcHRyCisgICAgICAqICAgICAgICAgICAgICAgICAgaW4gc2VxdWVuY2UpIGF0IHdoaWNoIHRvIGxvYWQuICBEZWZhdWx0cyB0byBuZXh0IGF2YWlsYWJsZSBzcGFjZQorICAgICAgKiAgICAgICAgICAgICAgICAgIChvciAwIGlmIDxjb250aW51ZT4gaXMgMCkuCisgICAgICAqICAgICAgc2VsZWN0ICAgICAgU2VsZWN0IHdoYXQgY2F0ZWdvcnkoaWVzKSBvZiByZWdpc3RlcnMgdG8gbG9hZCwgYXMgYSBiaXRtYXNrCisgICAgICAqICAgICAgICAgICAgICAgICAgKHNlZSBYVEhBTF9TQVNfeHh4IGNvbnN0YW50cykuICBEZWZhdWx0cyB0byBhbGwgcmVnaXN0ZXJzLgorICAgICAgKiAgICAgIGFsbG9jICAgICAgIFNlbGVjdCB3aGF0IGNhdGVnb3J5KGllcykgb2YgcmVnaXN0ZXJzIHRvIGFsbG9jYXRlOyBpZiBhbnkKKyAgICAgICogICAgICAgICAgICAgICAgICBjYXRlZ29yeSBpcyBzZWxlY3RlZCBoZXJlIHRoYXQgaXMgbm90IGluIDxzZWxlY3Q+LCBzcGFjZSBmb3IKKyAgICAgICogICAgICAgICAgICAgICAgICB0aGUgY29ycmVzcG9uZGluZyByZWdpc3RlcnMgaXMgc2tpcHBlZCB3aXRob3V0IGRvaW5nIGFueSBsb2FkLgorICAgICAgKi8KKyAgICAubWFjcm8geGNoYWxfbmNwX2xvYWQgIHB0ciBhdDEgYXQyIGF0MyBhdDQgIGNvbnRpbnVlPTAgb2ZzPS0xIHNlbGVjdD1YVEhBTF9TQVNfQUxMIGFsbG9jPTAKKwl4Y2hhbF9zYV9zdGFydAlcY29udGludWUsIFxvZnMKKwkvLyBPcHRpb25hbCBnbG9iYWwgcmVnaXN0ZXJzIHVzZWQgYnkgZGVmYXVsdCBieSB0aGUgY29tcGlsZXI6CisJLmlmZXEgKFhUSEFMX1NBU19PUFQgfCBYVEhBTF9TQVNfQ0MgfCBYVEhBTF9TQVNfR0xPQikgJiB+KFxzZWxlY3QpCisJeGNoYWxfc2FfYWxpZ24JXHB0ciwgMCwgMTAyMCwgNCwgNAorCWwzMmkJXGF0MSwgXHB0ciwgLkx4Y2hhbF9vZnNfKzAKKwl3dXIuVEhSRUFEUFRSCVxhdDEJCS8vIHRocmVhZHB0ciBvcHRpb24KKwkuc2V0CS5MeGNoYWxfb2ZzXywgLkx4Y2hhbF9vZnNfICsgNAorCS5lbHNlaWYgKChYVEhBTF9TQVNfT1BUIHwgWFRIQUxfU0FTX0NDIHwgWFRIQUxfU0FTX0dMT0IpICYgfihcYWxsb2MpKSA9PSAwCisJeGNoYWxfc2FfYWxpZ24JXHB0ciwgMCwgMTAyMCwgNCwgNAorCS5zZXQJLkx4Y2hhbF9vZnNfLCAuTHhjaGFsX29mc18gKyA0CisJLmVuZGlmCisJLy8gT3B0aW9uYWwgY2FsbGVyLXNhdmVkIHJlZ2lzdGVycyB1c2VkIGJ5IGRlZmF1bHQgYnkgdGhlIGNvbXBpbGVyOgorCS5pZmVxIChYVEhBTF9TQVNfT1BUIHwgWFRIQUxfU0FTX0NDIHwgWFRIQUxfU0FTX0NBTFIpICYgfihcc2VsZWN0KQorCXhjaGFsX3NhX2FsaWduCVxwdHIsIDAsIDEwMTYsIDQsIDQKKwlsMzJpCVxhdDEsIFxwdHIsIC5MeGNoYWxfb2ZzXyswCisJd3NyLkFDQ0xPCVxhdDEJCS8vIE1BQzE2IG9wdGlvbgorCWwzMmkJXGF0MSwgXHB0ciwgLkx4Y2hhbF9vZnNfKzQKKwl3c3IuQUNDSEkJXGF0MQkJLy8gTUFDMTYgb3B0aW9uCisJLnNldAkuTHhjaGFsX29mc18sIC5MeGNoYWxfb2ZzXyArIDgKKwkuZWxzZWlmICgoWFRIQUxfU0FTX09QVCB8IFhUSEFMX1NBU19DQyB8IFhUSEFMX1NBU19DQUxSKSAmIH4oXGFsbG9jKSkgPT0gMAorCXhjaGFsX3NhX2FsaWduCVxwdHIsIDAsIDEwMTYsIDQsIDQKKwkuc2V0CS5MeGNoYWxfb2ZzXywgLkx4Y2hhbF9vZnNfICsgOAorCS5lbmRpZgorCS8vIE9wdGlvbmFsIGNhbGxlci1zYXZlZCByZWdpc3RlcnMgbm90IHVzZWQgYnkgZGVmYXVsdCBieSB0aGUgY29tcGlsZXI6CisJLmlmZXEgKFhUSEFMX1NBU19PUFQgfCBYVEhBTF9TQVNfTk9DQyB8IFhUSEFMX1NBU19DQUxSKSAmIH4oXHNlbGVjdCkKKwl4Y2hhbF9zYV9hbGlnbglccHRyLCAwLCAxMDAwLCA0LCA0CisJbDMyaQlcYXQxLCBccHRyLCAuTHhjaGFsX29mc18rMAorCXdzci5CUglcYXQxCQkvLyBib29sZWFuIG9wdGlvbgorCWwzMmkJXGF0MSwgXHB0ciwgLkx4Y2hhbF9vZnNfKzQKKwl3c3IuU0NPTVBBUkUxCVxhdDEJCS8vIGNvbmRpdGlvbmFsIHN0b3JlIG9wdGlvbgorCWwzMmkJXGF0MSwgXHB0ciwgLkx4Y2hhbF9vZnNfKzgKKwl3c3IuTTAJXGF0MQkJLy8gTUFDMTYgb3B0aW9uCisJbDMyaQlcYXQxLCBccHRyLCAuTHhjaGFsX29mc18rMTIKKwl3c3IuTTEJXGF0MQkJLy8gTUFDMTYgb3B0aW9uCisJbDMyaQlcYXQxLCBccHRyLCAuTHhjaGFsX29mc18rMTYKKwl3c3IuTTIJXGF0MQkJLy8gTUFDMTYgb3B0aW9uCisJbDMyaQlcYXQxLCBccHRyLCAuTHhjaGFsX29mc18rMjAKKwl3c3IuTTMJXGF0MQkJLy8gTUFDMTYgb3B0aW9uCisJLnNldAkuTHhjaGFsX29mc18sIC5MeGNoYWxfb2ZzXyArIDI0CisJLmVsc2VpZiAoKFhUSEFMX1NBU19PUFQgfCBYVEhBTF9TQVNfTk9DQyB8IFhUSEFMX1NBU19DQUxSKSAmIH4oXGFsbG9jKSkgPT0gMAorCXhjaGFsX3NhX2FsaWduCVxwdHIsIDAsIDEwMDAsIDQsIDQKKwkuc2V0CS5MeGNoYWxfb2ZzXywgLkx4Y2hhbF9vZnNfICsgMjQKKwkuZW5kaWYKKyAgICAuZW5kbQkvLyB4Y2hhbF9uY3BfbG9hZAorCisKKyNkZWZpbmUgWENIQUxfTkNQX05VTV9BVE1QUwkxCisKKyNkZWZpbmUgWENIQUxfU0FfTlVNX0FUTVBTCTEKKworI2VuZGlmIC8qX1hURU5TQV9DT1JFX1RJRV9BU01fSCovCisKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL3ZhcmlhbnRzL2NzcC9pbmNsdWRlL3ZhcmlhbnQvdGllLmggYi9hcmNoL3h0ZW5zYS92YXJpYW50cy9jc3AvaW5jbHVkZS92YXJpYW50L3RpZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZTM5MWNmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvdmFyaWFudHMvY3NwL2luY2x1ZGUvdmFyaWFudC90aWUuaApAQCAtMCwwICsxLDE2MSBAQAorLyogCisgKiB0aWUuaCAtLSBjb21waWxlLXRpbWUgSEFMIGRlZmluaXRpb25zIGRlcGVuZGVudCBvbiBDT1JFICYgVElFIGNvbmZpZ3VyYXRpb24KKyAqCisgKiAgTk9URTogIFRoaXMgaGVhZGVyIGZpbGUgaXMgbm90IG1lYW50IHRvIGJlIGluY2x1ZGVkIGRpcmVjdGx5LgorICovCisKKy8qIFRoaXMgaGVhZGVyIGZpbGUgZGVzY3JpYmVzIHRoaXMgc3BlY2lmaWMgWHRlbnNhIHByb2Nlc3NvcidzIFRJRSBleHRlbnNpb25zCisgICB0aGF0IGV4dGVuZCBiYXNpYyBYdGVuc2EgY29yZSBmdW5jdGlvbmFsaXR5LiAgSXQgaXMgY3VzdG9taXplZCB0byB0aGlzCisgICBYdGVuc2EgcHJvY2Vzc29yIGNvbmZpZ3VyYXRpb24uCisKKyAgIENvcHlyaWdodCAoYykgMTk5OS0yMDE1IENhZGVuY2UgRGVzaWduIFN5c3RlbXMgSW5jLgorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAgIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgICBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICAgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAqLworCisjaWZuZGVmIF9YVEVOU0FfQ09SRV9USUVfSAorI2RlZmluZSBfWFRFTlNBX0NPUkVfVElFX0gKKworI2RlZmluZSBYQ0hBTF9DUF9OVU0JCQkxCS8qIG51bWJlciBvZiBjb3Byb2Nlc3NvcnMgKi8KKyNkZWZpbmUgWENIQUxfQ1BfTUFYCQkJOAkvKiBtYXggQ1AgSUQgKyAxICgwIGlmIG5vbmUpICovCisjZGVmaW5lIFhDSEFMX0NQX01BU0sJCQkweDgwCS8qIGJpdG1hc2sgb2YgYWxsIENQcyBieSBJRCAqLworI2RlZmluZSBYQ0hBTF9DUF9QT1JUX01BU0sJCTB4ODAJLyogYml0bWFzayBvZiBvbmx5IHBvcnQgQ1BzICovCisKKy8qICBCYXNpYyBwYXJhbWV0ZXJzIG9mIGVhY2ggY29wcm9jZXNzb3I6ICAqLworI2RlZmluZSBYQ0hBTF9DUDdfTkFNRQkJCSJYVElPUCIKKyNkZWZpbmUgWENIQUxfQ1A3X0lERU5UCQkJWFRJT1AKKyNkZWZpbmUgWENIQUxfQ1A3X1NBX1NJWkUJCTAJLyogc2l6ZSBvZiBzdGF0ZSBzYXZlIGFyZWEgKi8KKyNkZWZpbmUgWENIQUxfQ1A3X1NBX0FMSUdOCQkxCS8qIG1pbiBhbGlnbm1lbnQgb2Ygc2F2ZSBhcmVhICovCisjZGVmaW5lIFhDSEFMX0NQX0lEX1hUSU9QICAgICAgICAgICAJNwkvKiBjb3Byb2Nlc3NvciBJRCAoMC4uNykgKi8KKworLyogIEZpbGxlciBpbmZvIGZvciB1bmFzc2lnbmVkIGNvcHJvY2Vzc29ycywgdG8gc2ltcGxpZnkgYXJyYXlzIGV0YzogICovCisjZGVmaW5lIFhDSEFMX0NQMF9TQV9TSVpFCQkwCisjZGVmaW5lIFhDSEFMX0NQMF9TQV9BTElHTgkJMQorI2RlZmluZSBYQ0hBTF9DUDFfU0FfU0laRQkJMAorI2RlZmluZSBYQ0hBTF9DUDFfU0FfQUxJR04JCTEKKyNkZWZpbmUgWENIQUxfQ1AyX1NBX1NJWkUJCTAKKyNkZWZpbmUgWENIQUxfQ1AyX1NBX0FMSUdOCQkxCisjZGVmaW5lIFhDSEFMX0NQM19TQV9TSVpFCQkwCisjZGVmaW5lIFhDSEFMX0NQM19TQV9BTElHTgkJMQorI2RlZmluZSBYQ0hBTF9DUDRfU0FfU0laRQkJMAorI2RlZmluZSBYQ0hBTF9DUDRfU0FfQUxJR04JCTEKKyNkZWZpbmUgWENIQUxfQ1A1X1NBX1NJWkUJCTAKKyNkZWZpbmUgWENIQUxfQ1A1X1NBX0FMSUdOCQkxCisjZGVmaW5lIFhDSEFMX0NQNl9TQV9TSVpFCQkwCisjZGVmaW5lIFhDSEFMX0NQNl9TQV9BTElHTgkJMQorCisvKiAgU2F2ZSBhcmVhIGZvciBub24tY29wcm9jZXNzb3Igb3B0aW9uYWwgYW5kIGN1c3RvbSAoVElFKSBzdGF0ZTogICovCisjZGVmaW5lIFhDSEFMX05DUF9TQV9TSVpFCQkzNgorI2RlZmluZSBYQ0hBTF9OQ1BfU0FfQUxJR04JCTQKKworLyogIFRvdGFsIHNhdmUgYXJlYSBmb3Igb3B0aW9uYWwgYW5kIGN1c3RvbSBzdGF0ZSAoTkNQICsgQ1BuKTogICovCisjZGVmaW5lIFhDSEFMX1RPVEFMX1NBX1NJWkUJCTQ4CS8qIHdpdGggMTYtYnl0ZSBhbGlnbiBwYWRkaW5nICovCisjZGVmaW5lIFhDSEFMX1RPVEFMX1NBX0FMSUdOCQk0CS8qIGFjdHVhbCBtaW5pbXVtIGFsaWdubWVudCAqLworCisvKgorICogRGV0YWlsZWQgY29udGVudHMgb2Ygc2F2ZSBhcmVhcy4KKyAqIE5PVEU6ICBjYWxsZXIgbXVzdCBkZWZpbmUgdGhlIFhDSEFMX1NBX1JFRyBtYWNybyAobm90IGRlZmluZWQgaGVyZSkKKyAqIGJlZm9yZSBleHBhbmRpbmcgdGhlIFhDSEFMX3h4eF9TQV9MSVNUKCkgbWFjcm9zLgorICoKKyAqIFhDSEFMX1NBX1JFRyhzLGNjdXNlZCxhYmlraW5kLGtpbmQsb3B0LG5hbWUsZ2FsaWduLGFsaWduLGFzaXplLAorICoJCWRibnVtLGJhc2UscmVnbnVtLGJpdHN6LGdhcHN6LHJlc2V0LHguLi4pCisgKgorICoJcyA9IHBhc3NlZCBmcm9tIFhDSEFMXypfTElTVChzKSwgZWcuIHRvIHNlbGVjdCBob3cgdG8gZXhwYW5kCisgKgljY3VzZWQgPSBzZXQgaWYgdXNlZCBieSBjb21waWxlciB3aXRob3V0IHNwZWNpYWwgb3B0aW9ucyBvciBjb2RlCisgKglhYmlraW5kID0gMCAoY2FsbGVyLXNhdmVkKSwgMSAoY2FsbGVlLXNhdmVkKSwgb3IgMiAodGhyZWFkLWdsb2JhbCkKKyAqCWtpbmQgPSAwIChzcGVjaWFsIHJlZyksIDEgKFRJRSB1c2VyIHJlZyksIG9yIDIgKFRJRSByZWdmaWxlIHJlZykKKyAqCW9wdCA9IDAgKGN1c3RvbSBUSUUgZXh0ZW5zaW9uIG9yIGNvcHJvY2Vzc29yKSwgb3IgMSAob3B0aW9uYWwgcmVnKQorICoJbmFtZSA9IGxvd2VyY2FzZSByZWcgbmFtZSAobm8gcXVvdGVzKQorICoJZ2FsaWduID0gZ3JvdXAgYnl0ZSBhbGlnbm1lbnQgKHBvd2VyIG9mIDIpIChnYWxpZ24gPj0gYWxpZ24pCisgKglhbGlnbiA9IHJlZ2lzdGVyIGJ5dGUgYWxpZ25tZW50IChwb3dlciBvZiAyKQorICoJYXNpemUgPSBhbGxvY2F0ZWQgc2l6ZSBpbiBieXRlcyAoYXNpemUqOCA9PSBiaXRzeiArIGdhcHN6ICsgcGFkc3opCisgKgkgIChub3QgaW5jbHVkaW5nIGFueSBwYWQgYnl0ZXMgcmVxdWlyZWQgdG8gZ2FsaWduIHRoaXMgb3IgbmV4dCByZWcpCisgKglkYm51bSA9IHVuaXF1ZSB0YXJnZXQgbnVtYmVyIGYvZGVidWcgKHNlZSA8eHRlbnNhLWxpYmRiLW1hY3Jvcy5oPikKKyAqCWJhc2UgPSByZWcgc2hvcnRuYW1lIHcvbyBpbmRleCAob3Igc3I9c3BlY2lhbCwgdXI9VElFIHVzZXIgcmVnKQorICoJcmVnbnVtID0gcmVnIGluZGV4IGluIHJlZ2ZpbGUsIG9yIHNwZWNpYWwvVElFLXVzZXIgcmVnIG51bWJlcgorICoJYml0c3ogPSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYml0cyAocmVnZmlsZSB3aWR0aCwgb3IgdXIvc3IgbWFzayBiaXRzKQorICoJZ2Fwc3ogPSBpbnRlcnZlbmluZyBiaXRzLCBpZiBiaXRzeiBiaXRzIG5vdCBzdG9yZWQgY29udGlndW91c2x5CisgKgkocGFkc3ogPSBwYWQgYml0cyBhdCBlbmQgW1RJRSByZWdmaWxlXSBvciBhdCBtc2JpdHMgW3VyLHNyXSBvZiBhc2l6ZSkKKyAqCXJlc2V0ID0gcmVnaXN0ZXIgcmVzZXQgdmFsdWUgKG9yIDAgaWYgdW5kZWZpbmVkIGF0IHJlc2V0KQorICoJeCA9IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICgwIHVudGlsIHRoZW4pCisgKgorICogIFRvIGZpbHRlciBvdXQgY2VydGFpbiByZWdpc3RlcnMsIGUuZy4gdG8gZXhwYW5kIG9ubHkgdGhlIG5vbi1nbG9iYWwKKyAqICByZWdpc3RlcnMgdXNlZCBieSB0aGUgY29tcGlsZXIsIHlvdSBjYW4gZG8gc29tZXRoaW5nIGxpa2UgdGhpczoKKyAqCisgKiAgI2RlZmluZSBYQ0hBTF9TQV9SRUcocyxjY3VzZWQscC4uLikJU0VMQ0MjI2NjdXNlZChwKQorICogICNkZWZpbmUgU0VMQ0MwKHAuLi4pCisgKiAgI2RlZmluZSBTRUxDQzEoYWJpa2luZCxwLi4uKQlTRUxBSyMjYWJpa2luZChwKQorICogICNkZWZpbmUgU0VMQUswKHAuLi4pCQlSRUcocCkKKyAqICAjZGVmaW5lIFNFTEFLMShwLi4uKQkJUkVHKHApCisgKiAgI2RlZmluZSBTRUxBSzIocC4uLikKKyAqICAjZGVmaW5lIFJFRyhraW5kLHRpZSxuYW1lLGdhbG4sYWxuLGFzeixjc3osZGJudW0sYmFzZSxybnVtLGJzeixyc3QseC4uLikgXAorICoJCS4uLndoYXQgeW91IHdhbnQgdG8gZXhwYW5kLi4uCisgKi8KKworI2RlZmluZSBYQ0hBTF9OQ1BfU0FfTlVNCTkKKyNkZWZpbmUgWENIQUxfTkNQX1NBX0xJU1QocykJXAorIFhDSEFMX1NBX1JFRyhzLDEsMiwxLDEsICAgICAgdGhyZWFkcHRyLCA0LCA0LCA0LDB4MDNFNywgIHVyLDIzMSwgMzIsMCwwLDApIFwKKyBYQ0hBTF9TQV9SRUcocywxLDAsMCwxLCAgICAgICAgICBhY2NsbywgNCwgNCwgNCwweDAyMTAsICBzciwxNiAsIDMyLDAsMCwwKSBcCisgWENIQUxfU0FfUkVHKHMsMSwwLDAsMSwgICAgICAgICAgYWNjaGksIDQsIDQsIDQsMHgwMjExLCAgc3IsMTcgLCAgOCwwLDAsMCkgXAorIFhDSEFMX1NBX1JFRyhzLDAsMCwwLDEsICAgICAgICAgICAgIGJyLCA0LCA0LCA0LDB4MDIwNCwgIHNyLDQgICwgMTYsMCwwLDApIFwKKyBYQ0hBTF9TQV9SRUcocywwLDAsMCwxLCAgICAgIHNjb21wYXJlMSwgNCwgNCwgNCwweDAyMEMsICBzciwxMiAsIDMyLDAsMCwwKSBcCisgWENIQUxfU0FfUkVHKHMsMCwwLDAsMSwgICAgICAgICAgICAgbTAsIDQsIDQsIDQsMHgwMjIwLCAgc3IsMzIgLCAzMiwwLDAsMCkgXAorIFhDSEFMX1NBX1JFRyhzLDAsMCwwLDEsICAgICAgICAgICAgIG0xLCA0LCA0LCA0LDB4MDIyMSwgIHNyLDMzICwgMzIsMCwwLDApIFwKKyBYQ0hBTF9TQV9SRUcocywwLDAsMCwxLCAgICAgICAgICAgICBtMiwgNCwgNCwgNCwweDAyMjIsICBzciwzNCAsIDMyLDAsMCwwKSBcCisgWENIQUxfU0FfUkVHKHMsMCwwLDAsMSwgICAgICAgICAgICAgbTMsIDQsIDQsIDQsMHgwMjIzLCAgc3IsMzUgLCAzMiwwLDAsMCkKKworI2RlZmluZSBYQ0hBTF9DUDBfU0FfTlVNCTAKKyNkZWZpbmUgWENIQUxfQ1AwX1NBX0xJU1QocykJLyogZW1wdHkgKi8KKworI2RlZmluZSBYQ0hBTF9DUDFfU0FfTlVNCTAKKyNkZWZpbmUgWENIQUxfQ1AxX1NBX0xJU1QocykJLyogZW1wdHkgKi8KKworI2RlZmluZSBYQ0hBTF9DUDJfU0FfTlVNCTAKKyNkZWZpbmUgWENIQUxfQ1AyX1NBX0xJU1QocykJLyogZW1wdHkgKi8KKworI2RlZmluZSBYQ0hBTF9DUDNfU0FfTlVNCTAKKyNkZWZpbmUgWENIQUxfQ1AzX1NBX0xJU1QocykJLyogZW1wdHkgKi8KKworI2RlZmluZSBYQ0hBTF9DUDRfU0FfTlVNCTAKKyNkZWZpbmUgWENIQUxfQ1A0X1NBX0xJU1QocykJLyogZW1wdHkgKi8KKworI2RlZmluZSBYQ0hBTF9DUDVfU0FfTlVNCTAKKyNkZWZpbmUgWENIQUxfQ1A1X1NBX0xJU1QocykJLyogZW1wdHkgKi8KKworI2RlZmluZSBYQ0hBTF9DUDZfU0FfTlVNCTAKKyNkZWZpbmUgWENIQUxfQ1A2X1NBX0xJU1QocykJLyogZW1wdHkgKi8KKworI2RlZmluZSBYQ0hBTF9DUDdfU0FfTlVNCTAKKyNkZWZpbmUgWENIQUxfQ1A3X1NBX0xJU1QocykJLyogZW1wdHkgKi8KKworLyogQnl0ZSBsZW5ndGggb2YgaW5zdHJ1Y3Rpb24gZnJvbSBpdHMgZmlyc3QgbmliYmxlIChvcDAgZmllbGQpLCBwZXIgRkxJWC4gICovCisjZGVmaW5lIFhDSEFMX09QMF9GT1JNQVRfTEVOR1RIUwkzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzCisvKiBCeXRlIGxlbmd0aCBvZiBpbnN0cnVjdGlvbiBmcm9tIGl0cyBmaXJzdCBieXRlLCBwZXIgRkxJWC4gICovCisjZGVmaW5lIFhDSEFMX0JZVEUwX0ZPUk1BVF9MRU5HVEhTCVwKKwkzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLCAzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLFwKKwkzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLCAzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLFwKKwkzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLCAzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLFwKKwkzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLCAzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLFwKKwkzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLCAzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLFwKKwkzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLCAzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLFwKKwkzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLCAzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLFwKKwkzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLCAzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzCisKKyNlbmRpZiAvKl9YVEVOU0FfQ09SRV9USUVfSCovCisKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jpby5jIGIvYmxvY2svYmlvLmMKaW5kZXggZjM5NDc3NS4uYWE3MzU0MCAxMDA2NDQKLS0tIGEvYmxvY2svYmlvLmMKKysrIGIvYmxvY2svYmlvLmMKQEAgLTY2NywxOCArNjY3LDE5IEBACiAJYmlvLT5iaV9pdGVyLmJpX3NlY3Rvcgk9IGJpb19zcmMtPmJpX2l0ZXIuYmlfc2VjdG9yOwogCWJpby0+YmlfaXRlci5iaV9zaXplCT0gYmlvX3NyYy0+YmlfaXRlci5iaV9zaXplOwogCi0JaWYgKGJpb19vcChiaW8pID09IFJFUV9PUF9ESVNDQVJEKQotCQlnb3RvIGludGVncml0eV9jbG9uZTsKLQotCWlmIChiaW9fb3AoYmlvKSA9PSBSRVFfT1BfV1JJVEVfU0FNRSkgeworCXN3aXRjaCAoYmlvX29wKGJpbykpIHsKKwljYXNlIFJFUV9PUF9ESVNDQVJEOgorCWNhc2UgUkVRX09QX1NFQ1VSRV9FUkFTRToKKwkJYnJlYWs7CisJY2FzZSBSRVFfT1BfV1JJVEVfU0FNRToKIAkJYmlvLT5iaV9pb192ZWNbYmlvLT5iaV92Y250KytdID0gYmlvX3NyYy0+YmlfaW9fdmVjWzBdOwotCQlnb3RvIGludGVncml0eV9jbG9uZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIGJpb19zcmMsIGl0ZXIpCisJCQliaW8tPmJpX2lvX3ZlY1tiaW8tPmJpX3ZjbnQrK10gPSBidjsKKwkJYnJlYWs7CiAJfQogCi0JYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIGJpb19zcmMsIGl0ZXIpCi0JCWJpby0+YmlfaW9fdmVjW2Jpby0+YmlfdmNudCsrXSA9IGJ2OwotCi1pbnRlZ3JpdHlfY2xvbmU6CiAJaWYgKGJpb19pbnRlZ3JpdHkoYmlvX3NyYykpIHsKIAkJaW50IHJldDsKIApAQCAtMTc4OCw3ICsxNzg5LDcgQEAKIAkgKiBEaXNjYXJkcyBuZWVkIGEgbXV0YWJsZSBiaW9fdmVjIHRvIGFjY29tbW9kYXRlIHRoZSBwYXlsb2FkCiAJICogcmVxdWlyZWQgYnkgdGhlIERTTSBUUklNIGFuZCBVTk1BUCBjb21tYW5kcy4KIAkgKi8KLQlpZiAoYmlvX29wKGJpbykgPT0gUkVRX09QX0RJU0NBUkQpCisJaWYgKGJpb19vcChiaW8pID09IFJFUV9PUF9ESVNDQVJEIHx8IGJpb19vcChiaW8pID09IFJFUV9PUF9TRUNVUkVfRVJBU0UpCiAJCXNwbGl0ID0gYmlvX2Nsb25lX2Jpb3NldChiaW8sIGdmcCwgYnMpOwogCWVsc2UKIAkJc3BsaXQgPSBiaW9fY2xvbmVfZmFzdChiaW8sIGdmcCwgYnMpOwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNvcmUuYyBiL2Jsb2NrL2Jsay1jb3JlLmMKaW5kZXggOTk5NDQyZS4uMzZjN2FjMyAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWNvcmUuYworKysgYi9ibG9jay9ibGstY29yZS5jCkBAIC01MTUsNyArNTE1LDkgQEAKIAogdm9pZCBibGtfc2V0X3F1ZXVlX2R5aW5nKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewotCXF1ZXVlX2ZsYWdfc2V0X3VubG9ja2VkKFFVRVVFX0ZMQUdfRFlJTkcsIHEpOworCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CisJcXVldWVfZmxhZ19zZXQoUVVFVUVfRkxBR19EWUlORywgcSk7CisJc3Bpbl91bmxvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwogCiAJaWYgKHEtPm1xX29wcykKIAkJYmxrX21xX3dha2Vfd2FpdGVycyhxKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1tZXJnZS5jIGIvYmxvY2svYmxrLW1lcmdlLmMKaW5kZXggM2VlYzc1YS4uMjY0MmU1ZiAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLW1lcmdlLmMKKysrIGIvYmxvY2svYmxrLW1lcmdlLmMKQEAgLTk0LDkgKzk0LDMxIEBACiAJYm9vbCBkb19zcGxpdCA9IHRydWU7CiAJc3RydWN0IGJpbyAqbmV3ID0gTlVMTDsKIAljb25zdCB1bnNpZ25lZCBtYXhfc2VjdG9ycyA9IGdldF9tYXhfaW9fc2l6ZShxLCBiaW8pOworCXVuc2lnbmVkIGJ2ZWNzID0gMDsKIAogCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2LCBiaW8sIGl0ZXIpIHsKIAkJLyoKKwkJICogV2l0aCBhcmJpdHJhcnkgYmlvIHNpemUsIHRoZSBpbmNvbWluZyBiaW8gbWF5IGJlIHZlcnkKKwkJICogYmlnLiBXZSBoYXZlIHRvIHNwbGl0IHRoZSBiaW8gaW50byBzbWFsbCBiaW9zIHNvIHRoYXQKKwkJICogZWFjaCBob2xkcyBhdCBtb3N0IEJJT19NQVhfUEFHRVMgYnZlY3MgYmVjYXVzZQorCQkgKiBiaW9fY2xvbmUoKSBjYW4gZmFpbCB0byBhbGxvY2F0ZSBiaWcgYnZlY3MuCisJCSAqCisJCSAqIEl0IHNob3VsZCBoYXZlIGJlZW4gYmV0dGVyIHRvIGFwcGx5IHRoZSBsaW1pdCBwZXIKKwkJICogcmVxdWVzdCBxdWV1ZSBpbiB3aGljaCBiaW9fY2xvbmUoKSBpcyBpbnZvbHZlZCwKKwkJICogaW5zdGVhZCBvZiBnbG9iYWxseS4gVGhlIGJpZ2dlc3QgYmxvY2tlciBpcyB0aGUKKwkJICogYmlvX2Nsb25lKCkgaW4gYmlvIGJvdW5jZS4KKwkJICoKKwkJICogSWYgYmlvIGlzIHNwbGl0dGVkIGJ5IHRoaXMgcmVhc29uLCB3ZSBzaG91bGQgaGF2ZQorCQkgKiBhbGxvd2VkIHRvIGNvbnRpbnVlIGJpb3MgbWVyZ2luZywgYnV0IGRvbid0IGRvCisJCSAqIHRoYXQgbm93IGZvciBtYWtpbmcgdGhlIGNoYW5nZSBzaW1wbGUuCisJCSAqCisJCSAqIFRPRE86IGRlYWwgd2l0aCBiaW8gYm91bmNlJ3MgYmlvX2Nsb25lKCkgZ3JhY2VmdWxseQorCQkgKiBhbmQgY29udmVydCB0aGUgZ2xvYmFsIGxpbWl0IGludG8gcGVyLXF1ZXVlIGxpbWl0LgorCQkgKi8KKwkJaWYgKGJ2ZWNzKysgPj0gQklPX01BWF9QQUdFUykKKwkJCWdvdG8gc3BsaXQ7CisKKwkJLyoKIAkJICogSWYgdGhlIHF1ZXVlIGRvZXNuJ3Qgc3VwcG9ydCBTRyBnYXBzIGFuZCBhZGRpbmcgdGhpcwogCQkgKiBvZmZzZXQgd291bGQgY3JlYXRlIGEgZ2FwLCBkaXNhbGxvdyBpdC4KIAkJICovCkBAIC0xNzIsMTIgKzE5NCwxOCBAQAogCXN0cnVjdCBiaW8gKnNwbGl0LCAqcmVzOwogCXVuc2lnbmVkIG5zZWdzOwogCi0JaWYgKGJpb19vcCgqYmlvKSA9PSBSRVFfT1BfRElTQ0FSRCkKKwlzd2l0Y2ggKGJpb19vcCgqYmlvKSkgeworCWNhc2UgUkVRX09QX0RJU0NBUkQ6CisJY2FzZSBSRVFfT1BfU0VDVVJFX0VSQVNFOgogCQlzcGxpdCA9IGJsa19iaW9fZGlzY2FyZF9zcGxpdChxLCAqYmlvLCBicywgJm5zZWdzKTsKLQllbHNlIGlmIChiaW9fb3AoKmJpbykgPT0gUkVRX09QX1dSSVRFX1NBTUUpCisJCWJyZWFrOworCWNhc2UgUkVRX09QX1dSSVRFX1NBTUU6CiAJCXNwbGl0ID0gYmxrX2Jpb193cml0ZV9zYW1lX3NwbGl0KHEsICpiaW8sIGJzLCAmbnNlZ3MpOwotCWVsc2UKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJc3BsaXQgPSBibGtfYmlvX3NlZ21lbnRfc3BsaXQocSwgKmJpbywgcS0+YmlvX3NwbGl0LCAmbnNlZ3MpOworCQlicmVhazsKKwl9CiAKIAkvKiBwaHlzaWNhbCBzZWdtZW50cyBjYW4gYmUgZmlndXJlZCBvdXQgZHVyaW5nIHNwbGl0dGluZyAqLwogCXJlcyA9IHNwbGl0ID8gc3BsaXQgOiAqYmlvOwpAQCAtMjEzLDcgKzI0MSw3IEBACiAJICogVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgcmV0dXJuaW5nIDAsIGJ1dCBibGtfYWRkX3JlcXVlc3RfcGF5bG9hZCgpCiAJICogKENocmlzdG9waCEhISEpCiAJICovCi0JaWYgKGJpb19vcChiaW8pID09IFJFUV9PUF9ESVNDQVJEKQorCWlmIChiaW9fb3AoYmlvKSA9PSBSRVFfT1BfRElTQ0FSRCB8fCBiaW9fb3AoYmlvKSA9PSBSRVFfT1BfU0VDVVJFX0VSQVNFKQogCQlyZXR1cm4gMTsKIAogCWlmIChiaW9fb3AoYmlvKSA9PSBSRVFfT1BfV1JJVEVfU0FNRSkKQEAgLTM4NSw3ICs0MTMsOSBAQAogCW5zZWdzID0gMDsKIAljbHVzdGVyID0gYmxrX3F1ZXVlX2NsdXN0ZXIocSk7CiAKLQlpZiAoYmlvX29wKGJpbykgPT0gUkVRX09QX0RJU0NBUkQpIHsKKwlzd2l0Y2ggKGJpb19vcChiaW8pKSB7CisJY2FzZSBSRVFfT1BfRElTQ0FSRDoKKwljYXNlIFJFUV9PUF9TRUNVUkVfRVJBU0U6CiAJCS8qCiAJCSAqIFRoaXMgaXMgYSBoYWNrIC0gZHJpdmVycyBzaG91bGQgYmUgbmVpdGhlciBtb2RpZnlpbmcgdGhlCiAJCSAqIGJpb3ZlYywgbm9yIHJlbHlpbmcgb24gYmlfdmNudCAtIGJ1dCBiZWNhdXNlIG9mCkBAIC0zOTMsMTkgKzQyMywxNiBAQAogCQkgKiBhIHBheWxvYWQgd2UgbmVlZCB0byBzZXQgdXAgaGVyZSAodGhhbmsgeW91IENocmlzdG9waCkgYW5kCiAJCSAqIGJpX3ZjbnQgaXMgcmVhbGx5IHRoZSBvbmx5IHdheSBvZiB0ZWxsaW5nIGlmIHdlIG5lZWQgdG8uCiAJCSAqLwotCi0JCWlmIChiaW8tPmJpX3ZjbnQpCi0JCQlnb3RvIHNpbmdsZV9zZWdtZW50OwotCi0JCXJldHVybiAwOwotCX0KLQotCWlmIChiaW9fb3AoYmlvKSA9PSBSRVFfT1BfV1JJVEVfU0FNRSkgewotc2luZ2xlX3NlZ21lbnQ6CisJCWlmICghYmlvLT5iaV92Y250KQorCQkJcmV0dXJuIDA7CisJCS8qIEZhbGwgdGhyb3VnaCAqLworCWNhc2UgUkVRX09QX1dSSVRFX1NBTUU6CiAJCSpzZyA9IHNnbGlzdDsKIAkJYnZlYyA9IGJpb19pb3ZlYyhiaW8pOwogCQlzZ19zZXRfcGFnZSgqc2csIGJ2ZWMuYnZfcGFnZSwgYnZlYy5idl9sZW4sIGJ2ZWMuYnZfb2Zmc2V0KTsKIAkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJYnJlYWs7CiAJfQogCiAJZm9yX2VhY2hfYmlvKGJpbykKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1tcS5jIGIvYmxvY2svYmxrLW1xLmMKaW5kZXggZTkzMWEwZS4uYzIwN2ZhOSAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLW1xLmMKKysrIGIvYmxvY2svYmxrLW1xLmMKQEAgLTI5NiwxNyArMjk2LDI5IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIEVSUl9QVFIocmV0KTsKIAorCS8qCisJICogQ2hlY2sgaWYgdGhlIGhhcmR3YXJlIGNvbnRleHQgaXMgYWN0dWFsbHkgbWFwcGVkIHRvIGFueXRoaW5nLgorCSAqIElmIG5vdCB0ZWxsIHRoZSBjYWxsZXIgdGhhdCBpdCBzaG91bGQgc2tpcCB0aGlzIHF1ZXVlLgorCSAqLwogCWhjdHggPSBxLT5xdWV1ZV9od19jdHhbaGN0eF9pZHhdOworCWlmICghYmxrX21xX2h3X3F1ZXVlX21hcHBlZChoY3R4KSkgeworCQlyZXQgPSAtRVhERVY7CisJCWdvdG8gb3V0X3F1ZXVlX2V4aXQ7CisJfQogCWN0eCA9IF9fYmxrX21xX2dldF9jdHgocSwgY3B1bWFza19maXJzdChoY3R4LT5jcHVtYXNrKSk7CiAKIAlibGtfbXFfc2V0X2FsbG9jX2RhdGEoJmFsbG9jX2RhdGEsIHEsIGZsYWdzLCBjdHgsIGhjdHgpOwogCXJxID0gX19ibGtfbXFfYWxsb2NfcmVxdWVzdCgmYWxsb2NfZGF0YSwgcncsIDApOwogCWlmICghcnEpIHsKLQkJYmxrX3F1ZXVlX2V4aXQocSk7Ci0JCXJldHVybiBFUlJfUFRSKC1FV09VTERCTE9DSyk7CisJCXJldCA9IC1FV09VTERCTE9DSzsKKwkJZ290byBvdXRfcXVldWVfZXhpdDsKIAl9CiAKIAlyZXR1cm4gcnE7CisKK291dF9xdWV1ZV9leGl0OgorCWJsa19xdWV1ZV9leGl0KHEpOworCXJldHVybiBFUlJfUFRSKHJldCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChibGtfbXFfYWxsb2NfcmVxdWVzdF9oY3R4KTsKIApAQCAtNzkzLDExICs4MDUsMTIgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpkcHRyOwogCWludCBxdWV1ZWQ7CiAKLQlXQVJOX09OKCFjcHVtYXNrX3Rlc3RfY3B1KHJhd19zbXBfcHJvY2Vzc29yX2lkKCksIGhjdHgtPmNwdW1hc2spKTsKLQogCWlmICh1bmxpa2VseSh0ZXN0X2JpdChCTEtfTVFfU19TVE9QUEVELCAmaGN0eC0+c3RhdGUpKSkKIAkJcmV0dXJuOwogCisJV0FSTl9PTighY3B1bWFza190ZXN0X2NwdShyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpLCBoY3R4LT5jcHVtYXNrKSAmJgorCQljcHVfb25saW5lKGhjdHgtPm5leHRfY3B1KSk7CisKIAloY3R4LT5ydW4rKzsKIAogCS8qCkBAIC0xMDM2LDEwICsxMDQ5LDExIEBACiBFWFBPUlRfU1lNQk9MKGJsa19tcV9kZWxheV9xdWV1ZSk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2Jsa19tcV9pbnNlcnRfcmVxX2xpc3Qoc3RydWN0IGJsa19tcV9od19jdHggKmhjdHgsCi0JCQkJCSAgICBzdHJ1Y3QgYmxrX21xX2N0eCAqY3R4LAogCQkJCQkgICAgc3RydWN0IHJlcXVlc3QgKnJxLAogCQkJCQkgICAgYm9vbCBhdF9oZWFkKQogeworCXN0cnVjdCBibGtfbXFfY3R4ICpjdHggPSBycS0+bXFfY3R4OworCiAJdHJhY2VfYmxvY2tfcnFfaW5zZXJ0KGhjdHgtPnF1ZXVlLCBycSk7CiAKIAlpZiAoYXRfaGVhZCkKQEAgLTEwNTMsMjAgKzEwNjcsMTYgQEAKIHsKIAlzdHJ1Y3QgYmxrX21xX2N0eCAqY3R4ID0gcnEtPm1xX2N0eDsKIAotCV9fYmxrX21xX2luc2VydF9yZXFfbGlzdChoY3R4LCBjdHgsIHJxLCBhdF9oZWFkKTsKKwlfX2Jsa19tcV9pbnNlcnRfcmVxX2xpc3QoaGN0eCwgcnEsIGF0X2hlYWQpOwogCWJsa19tcV9oY3R4X21hcmtfcGVuZGluZyhoY3R4LCBjdHgpOwogfQogCiB2b2lkIGJsa19tcV9pbnNlcnRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdCAqcnEsIGJvb2wgYXRfaGVhZCwgYm9vbCBydW5fcXVldWUsCi0JCWJvb2wgYXN5bmMpCisJCQkgICBib29sIGFzeW5jKQogeworCXN0cnVjdCBibGtfbXFfY3R4ICpjdHggPSBycS0+bXFfY3R4OwogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gcnEtPnE7CiAJc3RydWN0IGJsa19tcV9od19jdHggKmhjdHg7Ci0Jc3RydWN0IGJsa19tcV9jdHggKmN0eCA9IHJxLT5tcV9jdHgsICpjdXJyZW50X2N0eDsKLQotCWN1cnJlbnRfY3R4ID0gYmxrX21xX2dldF9jdHgocSk7Ci0JaWYgKCFjcHVfb25saW5lKGN0eC0+Y3B1KSkKLQkJcnEtPm1xX2N0eCA9IGN0eCA9IGN1cnJlbnRfY3R4OwogCiAJaGN0eCA9IHEtPm1xX29wcy0+bWFwX3F1ZXVlKHEsIGN0eC0+Y3B1KTsKIApAQCAtMTA3Niw4ICsxMDg2LDYgQEAKIAogCWlmIChydW5fcXVldWUpCiAJCWJsa19tcV9ydW5faHdfcXVldWUoaGN0eCwgYXN5bmMpOwotCi0JYmxrX21xX3B1dF9jdHgoY3VycmVudF9jdHgpOwogfQogCiBzdGF0aWMgdm9pZCBibGtfbXFfaW5zZXJ0X3JlcXVlc3RzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLApAQCAtMTA4OCwxNCArMTA5Niw5IEBACiAKIHsKIAlzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqaGN0eDsKLQlzdHJ1Y3QgYmxrX21xX2N0eCAqY3VycmVudF9jdHg7CiAKIAl0cmFjZV9ibG9ja191bnBsdWcocSwgZGVwdGgsICFmcm9tX3NjaGVkdWxlKTsKIAotCWN1cnJlbnRfY3R4ID0gYmxrX21xX2dldF9jdHgocSk7Ci0KLQlpZiAoIWNwdV9vbmxpbmUoY3R4LT5jcHUpKQotCQljdHggPSBjdXJyZW50X2N0eDsKIAloY3R4ID0gcS0+bXFfb3BzLT5tYXBfcXVldWUocSwgY3R4LT5jcHUpOwogCiAJLyoKQEAgLTExMDcsMTUgKzExMTAsMTQgQEAKIAkJc3RydWN0IHJlcXVlc3QgKnJxOwogCiAJCXJxID0gbGlzdF9maXJzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgcmVxdWVzdCwgcXVldWVsaXN0KTsKKwkJQlVHX09OKHJxLT5tcV9jdHggIT0gY3R4KTsKIAkJbGlzdF9kZWxfaW5pdCgmcnEtPnF1ZXVlbGlzdCk7Ci0JCXJxLT5tcV9jdHggPSBjdHg7Ci0JCV9fYmxrX21xX2luc2VydF9yZXFfbGlzdChoY3R4LCBjdHgsIHJxLCBmYWxzZSk7CisJCV9fYmxrX21xX2luc2VydF9yZXFfbGlzdChoY3R4LCBycSwgZmFsc2UpOwogCX0KIAlibGtfbXFfaGN0eF9tYXJrX3BlbmRpbmcoaGN0eCwgY3R4KTsKIAlzcGluX3VubG9jaygmY3R4LT5sb2NrKTsKIAogCWJsa19tcV9ydW5faHdfcXVldWUoaGN0eCwgZnJvbV9zY2hlZHVsZSk7Ci0JYmxrX21xX3B1dF9jdHgoY3VycmVudF9jdHgpOwogfQogCiBzdGF0aWMgaW50IHBsdWdfY3R4X2NtcCh2b2lkICpwcml2LCBzdHJ1Y3QgbGlzdF9oZWFkICphLCBzdHJ1Y3QgbGlzdF9oZWFkICpiKQpAQCAtMTYzMCwxNiArMTYzMiwxNyBAQAogCXJldHVybiAwOwogfQogCisvKgorICogJ2NwdScgaXMgZ29pbmcgYXdheS4gc3BsaWNlIGFueSBleGlzdGluZyBycV9saXN0IGVudHJpZXMgZnJvbSB0aGlzCisgKiBzb2Z0d2FyZSBxdWV1ZSB0byB0aGUgaHcgcXVldWUgZGlzcGF0Y2ggbGlzdCwgYW5kIGVuc3VyZSB0aGF0IGl0CisgKiBnZXRzIHJ1bi4KKyAqLwogc3RhdGljIGludCBibGtfbXFfaGN0eF9jcHVfb2ZmbGluZShzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqaGN0eCwgaW50IGNwdSkKIHsKLQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGhjdHgtPnF1ZXVlOwogCXN0cnVjdCBibGtfbXFfY3R4ICpjdHg7CiAJTElTVF9IRUFEKHRtcCk7CiAKLQkvKgotCSAqIE1vdmUgY3R4IGVudHJpZXMgdG8gbmV3IENQVSwgaWYgdGhpcyBvbmUgaXMgZ29pbmcgYXdheS4KLQkgKi8KLQljdHggPSBfX2Jsa19tcV9nZXRfY3R4KHEsIGNwdSk7CisJY3R4ID0gX19ibGtfbXFfZ2V0X2N0eChoY3R4LT5xdWV1ZSwgY3B1KTsKIAogCXNwaW5fbG9jaygmY3R4LT5sb2NrKTsKIAlpZiAoIWxpc3RfZW1wdHkoJmN0eC0+cnFfbGlzdCkpIHsKQEAgLTE2NTEsMjQgKzE2NTQsMTEgQEAKIAlpZiAobGlzdF9lbXB0eSgmdG1wKSkKIAkJcmV0dXJuIE5PVElGWV9PSzsKIAotCWN0eCA9IGJsa19tcV9nZXRfY3R4KHEpOwotCXNwaW5fbG9jaygmY3R4LT5sb2NrKTsKLQotCXdoaWxlICghbGlzdF9lbXB0eSgmdG1wKSkgewotCQlzdHJ1Y3QgcmVxdWVzdCAqcnE7Ci0KLQkJcnEgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ0bXAsIHN0cnVjdCByZXF1ZXN0LCBxdWV1ZWxpc3QpOwotCQlycS0+bXFfY3R4ID0gY3R4OwotCQlsaXN0X21vdmVfdGFpbCgmcnEtPnF1ZXVlbGlzdCwgJmN0eC0+cnFfbGlzdCk7Ci0JfQotCi0JaGN0eCA9IHEtPm1xX29wcy0+bWFwX3F1ZXVlKHEsIGN0eC0+Y3B1KTsKLQlibGtfbXFfaGN0eF9tYXJrX3BlbmRpbmcoaGN0eCwgY3R4KTsKLQotCXNwaW5fdW5sb2NrKCZjdHgtPmxvY2spOworCXNwaW5fbG9jaygmaGN0eC0+bG9jayk7CisJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZ0bXAsICZoY3R4LT5kaXNwYXRjaCk7CisJc3Bpbl91bmxvY2soJmhjdHgtPmxvY2spOwogCiAJYmxrX21xX3J1bl9od19xdWV1ZShoY3R4LCB0cnVlKTsKLQlibGtfbXFfcHV0X2N0eChjdHgpOwogCXJldHVybiBOT1RJRllfT0s7CiB9CiAKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1zb2Z0aXJxLmMgYi9ibG9jay9ibGstc29mdGlycS5jCmluZGV4IDUzYjE3MzcuLjk2NjMxZTYgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1zb2Z0aXJxLmMKKysrIGIvYmxvY2svYmxrLXNvZnRpcnEuYwpAQCAtNzgsMzAgKzc4LDIxIEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGludCBibGtfY3B1X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLAotCQkJICB2b2lkICpoY3B1KQorc3RhdGljIGludCBibGtfc29mdGlycV9jcHVfZGVhZCh1bnNpZ25lZCBpbnQgY3B1KQogewogCS8qCiAJICogSWYgYSBDUFUgZ29lcyBhd2F5LCBzcGxpY2UgaXRzIGVudHJpZXMgdG8gdGhlIGN1cnJlbnQgQ1BVCiAJICogYW5kIHRyaWdnZXIgYSBydW4gb2YgdGhlIHNvZnRpcnEKIAkgKi8KLQlpZiAoYWN0aW9uID09IENQVV9ERUFEIHx8IGFjdGlvbiA9PSBDUFVfREVBRF9GUk9aRU4pIHsKLQkJaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKSBoY3B1OworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJbGlzdF9zcGxpY2VfaW5pdCgmcGVyX2NwdShibGtfY3B1X2RvbmUsIGNwdSksCisJCQkgdGhpc19jcHVfcHRyKCZibGtfY3B1X2RvbmUpKTsKKwlyYWlzZV9zb2Z0aXJxX2lycW9mZihCTE9DS19TT0ZUSVJRKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKLQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQkJbGlzdF9zcGxpY2VfaW5pdCgmcGVyX2NwdShibGtfY3B1X2RvbmUsIGNwdSksCi0JCQkJIHRoaXNfY3B1X3B0cigmYmxrX2NwdV9kb25lKSk7Ci0JCXJhaXNlX3NvZnRpcnFfaXJxb2ZmKEJMT0NLX1NPRlRJUlEpOwotCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JfQotCi0JcmV0dXJuIE5PVElGWV9PSzsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBibGtfY3B1X25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsCT0gYmxrX2NwdV9ub3RpZnksCi19OwotCiB2b2lkIF9fYmxrX2NvbXBsZXRlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJlcSkKIHsKIAlpbnQgY2NwdSwgY3B1OwpAQCAtMTgwLDcgKzE3MSw5IEBACiAJCUlOSVRfTElTVF9IRUFEKCZwZXJfY3B1KGJsa19jcHVfZG9uZSwgaSkpOwogCiAJb3Blbl9zb2Z0aXJxKEJMT0NLX1NPRlRJUlEsIGJsa19kb25lX3NvZnRpcnEpOwotCXJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmYmxrX2NwdV9ub3RpZmllcik7CisJY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9CTE9DS19TT0ZUSVJRX0RFQUQsCisJCQkJICAiYmxvY2svc29mdGlycTpkZWFkIiwgTlVMTCwKKwkJCQkgIGJsa19zb2Z0aXJxX2NwdV9kZWFkKTsKIAlyZXR1cm4gMDsKIH0KIHN1YnN5c19pbml0Y2FsbChibGtfc29mdGlycV9pbml0KTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay10aHJvdHRsZS5jIGIvYmxvY2svYmxrLXRocm90dGxlLmMKaW5kZXggZjFhYmEyNi4uYTNlYTgyNiAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLXRocm90dGxlLmMKKysrIGIvYmxvY2svYmxrLXRocm90dGxlLmMKQEAgLTc4MCw5ICs3ODAsMTEgQEAKIAkvKgogCSAqIElmIHByZXZpb3VzIHNsaWNlIGV4cGlyZWQsIHN0YXJ0IGEgbmV3IG9uZSBvdGhlcndpc2UgcmVuZXcvZXh0ZW5kCiAJICogZXhpc3Rpbmcgc2xpY2UgdG8gbWFrZSBzdXJlIGl0IGlzIGF0IGxlYXN0IHRocm90bF9zbGljZSBpbnRlcnZhbAotCSAqIGxvbmcgc2luY2Ugbm93LgorCSAqIGxvbmcgc2luY2Ugbm93LiBOZXcgc2xpY2UgaXMgc3RhcnRlZCBvbmx5IGZvciBlbXB0eSB0aHJvdHRsZSBncm91cC4KKwkgKiBJZiB0aGVyZSBpcyBxdWV1ZWQgYmlvLCB0aGF0IG1lYW5zIHRoZXJlIHNob3VsZCBiZSBhbiBhY3RpdmUKKwkgKiBzbGljZSBhbmQgaXQgc2hvdWxkIGJlIGV4dGVuZGVkIGluc3RlYWQuCiAJICovCi0JaWYgKHRocm90bF9zbGljZV91c2VkKHRnLCBydykpCisJaWYgKHRocm90bF9zbGljZV91c2VkKHRnLCBydykgJiYgISh0Zy0+c2VydmljZV9xdWV1ZS5ucl9xdWV1ZWRbcnddKSkKIAkJdGhyb3RsX3N0YXJ0X25ld19zbGljZSh0ZywgcncpOwogCWVsc2UgewogCQlpZiAodGltZV9iZWZvcmUodGctPnNsaWNlX2VuZFtyd10sIGppZmZpZXMgKyB0aHJvdGxfc2xpY2UpKQpkaWZmIC0tZ2l0IGEvYmxvY2svZWxldmF0b3IuYyBiL2Jsb2NrL2VsZXZhdG9yLmMKaW5kZXggNzA5NmMyMi4uZjdkOTczYSAxMDA2NDQKLS0tIGEvYmxvY2svZWxldmF0b3IuYworKysgYi9ibG9jay9lbGV2YXRvci5jCkBAIC0zNjYsNyArMzY2LDcgQEAKIAlsaXN0X2Zvcl9lYWNoX3ByZXYoZW50cnksICZxLT5xdWV1ZV9oZWFkKSB7CiAJCXN0cnVjdCByZXF1ZXN0ICpwb3MgPSBsaXN0X2VudHJ5X3JxKGVudHJ5KTsKIAotCQlpZiAoKHJlcV9vcChycSkgPT0gUkVRX09QX0RJU0NBUkQpICE9IChyZXFfb3AocG9zKSA9PSBSRVFfT1BfRElTQ0FSRCkpCisJCWlmIChyZXFfb3AocnEpICE9IHJlcV9vcChwb3MpKQogCQkJYnJlYWs7CiAJCWlmIChycV9kYXRhX2RpcihycSkgIT0gcnFfZGF0YV9kaXIocG9zKSkKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL0tjb25maWcgYi9jcnlwdG8vS2NvbmZpZwppbmRleCBhOTM3N2JlLi44NGQ3MTQ4IDEwMDY0NAotLS0gYS9jcnlwdG8vS2NvbmZpZworKysgYi9jcnlwdG8vS2NvbmZpZwpAQCAtNDM5LDcgKzQzOSw3IEBACiAKIGNvbmZpZyBDUllQVF9DUkMzMkNfVlBNU1VNCiAJdHJpc3RhdGUgIkNSQzMyYyBDUkMgYWxnb3JpdGhtIChwb3dlcnBjNjQpIgotCWRlcGVuZHMgb24gUFBDNjQKKwlkZXBlbmRzIG9uIFBQQzY0ICYmIEFMVElWRUMKIAlzZWxlY3QgQ1JZUFRPX0hBU0gKIAlzZWxlY3QgQ1JDMzIKIAloZWxwCmRpZmYgLS1naXQgYS9jcnlwdG8vYXN5bmNfdHgvYXN5bmNfcHEuYyBiL2NyeXB0by9hc3luY190eC9hc3luY19wcS5jCmluZGV4IDA4YjNhYzYuLmY4M2RlOTkgMTAwNjQ0Ci0tLSBhL2NyeXB0by9hc3luY190eC9hc3luY19wcS5jCisrKyBiL2NyeXB0by9hc3luY190eC9hc3luY19wcS5jCkBAIC0zNjgsOCArMzY4LDYgQEAKIAogCQlkbWFfc2V0X3VubWFwKHR4LCB1bm1hcCk7CiAJCWFzeW5jX3R4X3N1Ym1pdChjaGFuLCB0eCwgc3VibWl0KTsKLQotCQlyZXR1cm4gdHg7CiAJfSBlbHNlIHsKIAkJc3RydWN0IHBhZ2UgKnBfc3JjID0gUChibG9ja3MsIGRpc2tzKTsKIAkJc3RydWN0IHBhZ2UgKnFfc3JjID0gUShibG9ja3MsIGRpc2tzKTsKQEAgLTQyNCw5ICs0MjIsMTEgQEAKIAkJc3VibWl0LT5jYl9wYXJhbSA9IGNiX3BhcmFtX29yaWc7CiAJCXN1Ym1pdC0+ZmxhZ3MgPSBmbGFnc19vcmlnOwogCQlhc3luY190eF9zeW5jX2VwaWxvZyhzdWJtaXQpOwotCi0JCXJldHVybiBOVUxMOworCQl0eCA9IE5VTEw7CiAJfQorCWRtYWVuZ2luZV91bm1hcF9wdXQodW5tYXApOworCisJcmV0dXJuIHR4OwogfQogRVhQT1JUX1NZTUJPTF9HUEwoYXN5bmNfc3luZHJvbWVfdmFsKTsKIApkaWZmIC0tZ2l0IGEvY3J5cHRvL2Jsa2NpcGhlci5jIGIvY3J5cHRvL2Jsa2NpcGhlci5jCmluZGV4IDM2OTk5OTUuLmE4MzI0MjYgMTAwNjQ0Ci0tLSBhL2NyeXB0by9ibGtjaXBoZXIuYworKysgYi9jcnlwdG8vYmxrY2lwaGVyLmMKQEAgLTIzMyw2ICsyMzMsOCBAQAogCQlyZXR1cm4gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCB3YWxrLCAtRUlOVkFMKTsKIAl9CiAKKwlic2l6ZSA9IG1pbih3YWxrLT53YWxrX2Jsb2Nrc2l6ZSwgbik7CisKIAl3YWxrLT5mbGFncyAmPSB+KEJMS0NJUEhFUl9XQUxLX1NMT1cgfCBCTEtDSVBIRVJfV0FMS19DT1BZIHwKIAkJCSBCTEtDSVBIRVJfV0FMS19ESUZGKTsKIAlpZiAoIXNjYXR0ZXJ3YWxrX2FsaWduZWQoJndhbGstPmluLCB3YWxrLT5hbGlnbm1hc2spIHx8CkBAIC0yNDUsNyArMjQ3LDYgQEAKIAkJfQogCX0KIAotCWJzaXplID0gbWluKHdhbGstPndhbGtfYmxvY2tzaXplLCBuKTsKIAluID0gc2NhdHRlcndhbGtfY2xhbXAoJndhbGstPmluLCBuKTsKIAluID0gc2NhdHRlcndhbGtfY2xhbXAoJndhbGstPm91dCwgbik7CiAKZGlmZiAtLWdpdCBhL2NyeXB0by9jcnlwdGQuYyBiL2NyeXB0by9jcnlwdGQuYwppbmRleCBjZjgwMzdhLi4wYzY1NGU1IDEwMDY0NAotLS0gYS9jcnlwdG8vY3J5cHRkLmMKKysrIGIvY3J5cHRvL2NyeXB0ZC5jCkBAIC02MzEsOSArNjMxLDE0IEBACiAKIHN0YXRpYyBpbnQgY3J5cHRkX2hhc2hfaW1wb3J0KHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICpyZXEsIGNvbnN0IHZvaWQgKmluKQogewotCXN0cnVjdCBjcnlwdGRfaGFzaF9yZXF1ZXN0X2N0eCAqcmN0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KHJlcSk7CisJc3RydWN0IGNyeXB0b19haGFzaCAqdGZtID0gY3J5cHRvX2FoYXNoX3JlcXRmbShyZXEpOworCXN0cnVjdCBjcnlwdGRfaGFzaF9jdHggKmN0eCA9IGNyeXB0b19haGFzaF9jdHgodGZtKTsKKwlzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYyA9IGNyeXB0ZF9zaGFzaF9kZXNjKHJlcSk7CiAKLQlyZXR1cm4gY3J5cHRvX3NoYXNoX2ltcG9ydCgmcmN0eC0+ZGVzYywgaW4pOworCWRlc2MtPnRmbSA9IGN0eC0+Y2hpbGQ7CisJZGVzYy0+ZmxhZ3MgPSByZXEtPmJhc2UuZmxhZ3M7CisKKwlyZXR1cm4gY3J5cHRvX3NoYXNoX2ltcG9ydChkZXNjLCBpbik7CiB9CiAKIHN0YXRpYyBpbnQgY3J5cHRkX2NyZWF0ZV9oYXNoKHN0cnVjdCBjcnlwdG9fdGVtcGxhdGUgKnRtcGwsIHN0cnVjdCBydGF0dHIgKip0YiwKQEAgLTczMywxMyArNzM4LDE0IEBACiAJcmN0eCA9IGFlYWRfcmVxdWVzdF9jdHgocmVxKTsKIAljb21wbCA9IHJjdHgtPmNvbXBsZXRlOwogCisJdGZtID0gY3J5cHRvX2FlYWRfcmVxdGZtKHJlcSk7CisKIAlpZiAodW5saWtlbHkoZXJyID09IC1FSU5QUk9HUkVTUykpCiAJCWdvdG8gb3V0OwogCWFlYWRfcmVxdWVzdF9zZXRfdGZtKHJlcSwgY2hpbGQpOwogCWVyciA9IGNyeXB0KCByZXEgKTsKIAogb3V0OgotCXRmbSA9IGNyeXB0b19hZWFkX3JlcXRmbShyZXEpOwogCWN0eCA9IGNyeXB0b19hZWFkX2N0eCh0Zm0pOwogCXJlZmNudCA9IGF0b21pY19yZWFkKCZjdHgtPnJlZmNudCk7CiAKZGlmZiAtLWdpdCBhL2NyeXB0by9lY2hhaW5pdi5jIGIvY3J5cHRvL2VjaGFpbml2LmMKaW5kZXggMWIwMWZlOS4uZTNkODg5YiAxMDA2NDQKLS0tIGEvY3J5cHRvL2VjaGFpbml2LmMKKysrIGIvY3J5cHRvL2VjaGFpbml2LmMKQEAgLTEsOCArMSw4IEBACiAvKgogICogZWNoYWluaXY6IEVuY3J5cHRlZCBDaGFpbiBJViBHZW5lcmF0b3IKICAqCi0gKiBUaGlzIGdlbmVyYXRvciBnZW5lcmF0ZXMgYW4gSVYgYmFzZWQgb24gYSBzZXF1ZW5jZSBudW1iZXIgYnkgeG9yaW5nIGl0Ci0gKiB3aXRoIGEgc2FsdCBhbmQgdGhlbiBlbmNyeXB0aW5nIGl0IHdpdGggdGhlIHNhbWUga2V5IGFzIHVzZWQgdG8gZW5jcnlwdAorICogVGhpcyBnZW5lcmF0b3IgZ2VuZXJhdGVzIGFuIElWIGJhc2VkIG9uIGEgc2VxdWVuY2UgbnVtYmVyIGJ5IG11bHRpcGx5aW5nCisgKiBpdCB3aXRoIGEgc2FsdCBhbmQgdGhlbiBlbmNyeXB0aW5nIGl0IHdpdGggdGhlIHNhbWUga2V5IGFzIHVzZWQgdG8gZW5jcnlwdAogICogdGhlIHBsYWluIHRleHQuICBUaGlzIGFsZ29yaXRobSByZXF1aXJlcyB0aGF0IHRoZSBibG9jayBzaXplIGJlIGVxdWFsCiAgKiB0byB0aGUgSVYgc2l6ZS4gIEl0IGlzIG1haW5seSB1c2VmdWwgZm9yIENCQy4KICAqCkBAIC0yNCw4MSArMjQsMTcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KIAotI2RlZmluZSBNQVhfSVZfU0laRSAxNgotCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUodTMyIFtNQVhfSVZfU0laRSAvIHNpemVvZih1MzIpXSwgZWNoYWluaXZfaXYpOwotCi0vKiBXZSBkb24ndCBjYXJlIGlmIHdlIGdldCBwcmVlbXB0ZWQgYW5kIHJlYWQvd3JpdGUgSVZzIGZyb20gdGhlIG5leHQgQ1BVLiAqLwotc3RhdGljIHZvaWQgZWNoYWluaXZfcmVhZF9pdih1OCAqZHN0LCB1bnNpZ25lZCBzaXplKQotewotCXUzMiAqYSA9ICh1MzIgKilkc3Q7Ci0JdTMyIF9fcGVyY3B1ICpiID0gZWNoYWluaXZfaXY7Ci0KLQlmb3IgKDsgc2l6ZSA+PSA0OyBzaXplIC09IDQpIHsKLQkJKmErKyA9IHRoaXNfY3B1X3JlYWQoKmIpOwotCQliKys7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBlY2hhaW5pdl93cml0ZV9pdihjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBzaXplKQotewotCWNvbnN0IHUzMiAqYSA9IChjb25zdCB1MzIgKilzcmM7Ci0JdTMyIF9fcGVyY3B1ICpiID0gZWNoYWluaXZfaXY7Ci0KLQlmb3IgKDsgc2l6ZSA+PSA0OyBzaXplIC09IDQpIHsKLQkJdGhpc19jcHVfd3JpdGUoKmIsICphKTsKLQkJYSsrOwotCQliKys7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBlY2hhaW5pdl9lbmNyeXB0X2NvbXBsZXRlMihzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEsIGludCBlcnIpCi17Ci0Jc3RydWN0IGFlYWRfcmVxdWVzdCAqc3VicmVxID0gYWVhZF9yZXF1ZXN0X2N0eChyZXEpOwotCXN0cnVjdCBjcnlwdG9fYWVhZCAqZ2VuaXY7Ci0JdW5zaWduZWQgaW50IGl2c2l6ZTsKLQotCWlmIChlcnIgPT0gLUVJTlBST0dSRVNTKQotCQlyZXR1cm47Ci0KLQlpZiAoZXJyKQotCQlnb3RvIG91dDsKLQotCWdlbml2ID0gY3J5cHRvX2FlYWRfcmVxdGZtKHJlcSk7Ci0JaXZzaXplID0gY3J5cHRvX2FlYWRfaXZzaXplKGdlbml2KTsKLQotCWVjaGFpbml2X3dyaXRlX2l2KHN1YnJlcS0+aXYsIGl2c2l6ZSk7Ci0KLQlpZiAocmVxLT5pdiAhPSBzdWJyZXEtPml2KQotCQltZW1jcHkocmVxLT5pdiwgc3VicmVxLT5pdiwgaXZzaXplKTsKLQotb3V0OgotCWlmIChyZXEtPml2ICE9IHN1YnJlcS0+aXYpCi0JCWt6ZnJlZShzdWJyZXEtPml2KTsKLX0KLQotc3RhdGljIHZvaWQgZWNoYWluaXZfZW5jcnlwdF9jb21wbGV0ZShzdHJ1Y3QgY3J5cHRvX2FzeW5jX3JlcXVlc3QgKmJhc2UsCi0JCQkJCSBpbnQgZXJyKQotewotCXN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSA9IGJhc2UtPmRhdGE7Ci0KLQllY2hhaW5pdl9lbmNyeXB0X2NvbXBsZXRlMihyZXEsIGVycik7Ci0JYWVhZF9yZXF1ZXN0X2NvbXBsZXRlKHJlcSwgZXJyKTsKLX0KLQogc3RhdGljIGludCBlY2hhaW5pdl9lbmNyeXB0KHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSkKIHsKIAlzdHJ1Y3QgY3J5cHRvX2FlYWQgKmdlbml2ID0gY3J5cHRvX2FlYWRfcmVxdGZtKHJlcSk7CiAJc3RydWN0IGFlYWRfZ2VuaXZfY3R4ICpjdHggPSBjcnlwdG9fYWVhZF9jdHgoZ2VuaXYpOwogCXN0cnVjdCBhZWFkX3JlcXVlc3QgKnN1YnJlcSA9IGFlYWRfcmVxdWVzdF9jdHgocmVxKTsKLQljcnlwdG9fY29tcGxldGlvbl90IGNvbXBsOwotCXZvaWQgKmRhdGE7CisJX19iZTY0IG5zZXFubzsKKwl1NjQgc2Vxbm87CiAJdTggKmluZm87CiAJdW5zaWduZWQgaW50IGl2c2l6ZSA9IGNyeXB0b19hZWFkX2l2c2l6ZShnZW5pdik7CiAJaW50IGVycjsKQEAgLTEwOCw4ICs0NCw2IEBACiAKIAlhZWFkX3JlcXVlc3Rfc2V0X3RmbShzdWJyZXEsIGN0eC0+Y2hpbGQpOwogCi0JY29tcGwgPSBlY2hhaW5pdl9lbmNyeXB0X2NvbXBsZXRlOwotCWRhdGEgPSByZXE7CiAJaW5mbyA9IHJlcS0+aXY7CiAKIAlpZiAocmVxLT5zcmMgIT0gcmVxLT5kc3QpIHsKQEAgLTEyNywyOSArNjEsMzAgQEAKIAkJCXJldHVybiBlcnI7CiAJfQogCi0JaWYgKHVubGlrZWx5KCFJU19BTElHTkVEKCh1bnNpZ25lZCBsb25nKWluZm8sCi0JCQkJIGNyeXB0b19hZWFkX2FsaWdubWFzayhnZW5pdikgKyAxKSkpIHsKLQkJaW5mbyA9IGttYWxsb2MoaXZzaXplLCByZXEtPmJhc2UuZmxhZ3MgJgotCQkJCSAgICAgICBDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVAgPyBHRlBfS0VSTkVMOgotCQkJCQkJCQkgIEdGUF9BVE9NSUMpOwotCQlpZiAoIWluZm8pCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQltZW1jcHkoaW5mbywgcmVxLT5pdiwgaXZzaXplKTsKLQl9Ci0KLQlhZWFkX3JlcXVlc3Rfc2V0X2NhbGxiYWNrKHN1YnJlcSwgcmVxLT5iYXNlLmZsYWdzLCBjb21wbCwgZGF0YSk7CisJYWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhzdWJyZXEsIHJlcS0+YmFzZS5mbGFncywKKwkJCQkgIHJlcS0+YmFzZS5jb21wbGV0ZSwgcmVxLT5iYXNlLmRhdGEpOwogCWFlYWRfcmVxdWVzdF9zZXRfY3J5cHQoc3VicmVxLCByZXEtPmRzdCwgcmVxLT5kc3QsCiAJCQkgICAgICAgcmVxLT5jcnlwdGxlbiwgaW5mbyk7CiAJYWVhZF9yZXF1ZXN0X3NldF9hZChzdWJyZXEsIHJlcS0+YXNzb2NsZW4pOwogCi0JY3J5cHRvX3hvcihpbmZvLCBjdHgtPnNhbHQsIGl2c2l6ZSk7Ci0Jc2NhdHRlcndhbGtfbWFwX2FuZF9jb3B5KGluZm8sIHJlcS0+ZHN0LCByZXEtPmFzc29jbGVuLCBpdnNpemUsIDEpOwotCWVjaGFpbml2X3JlYWRfaXYoaW5mbywgaXZzaXplKTsKKwltZW1jcHkoJm5zZXFubywgaW5mbyArIGl2c2l6ZSAtIDgsIDgpOworCXNlcW5vID0gYmU2NF90b19jcHUobnNlcW5vKTsKKwltZW1zZXQoaW5mbywgMCwgaXZzaXplKTsKIAotCWVyciA9IGNyeXB0b19hZWFkX2VuY3J5cHQoc3VicmVxKTsKLQllY2hhaW5pdl9lbmNyeXB0X2NvbXBsZXRlMihyZXEsIGVycik7Ci0JcmV0dXJuIGVycjsKKwlzY2F0dGVyd2Fsa19tYXBfYW5kX2NvcHkoaW5mbywgcmVxLT5kc3QsIHJlcS0+YXNzb2NsZW4sIGl2c2l6ZSwgMSk7CisKKwlkbyB7CisJCXU2NCBhOworCisJCW1lbWNweSgmYSwgY3R4LT5zYWx0ICsgaXZzaXplIC0gOCwgOCk7CisKKwkJYSB8PSAxOworCQlhICo9IHNlcW5vOworCisJCW1lbWNweShpbmZvICsgaXZzaXplIC0gOCwgJmEsIDgpOworCX0gd2hpbGUgKChpdnNpemUgLT0gOCkpOworCisJcmV0dXJuIGNyeXB0b19hZWFkX2VuY3J5cHQoc3VicmVxKTsKIH0KIAogc3RhdGljIGludCBlY2hhaW5pdl9kZWNyeXB0KHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSkKQEAgLTE5Niw4ICsxMzEsNyBAQAogCWFsZyA9IGNyeXB0b19zcGF3bl9hZWFkX2FsZyhzcGF3bik7CiAKIAllcnIgPSAtRUlOVkFMOwotCWlmIChpbnN0LT5hbGcuaXZzaXplICYgKHNpemVvZih1MzIpIC0gMSkgfHwKLQkgICAgaW5zdC0+YWxnLml2c2l6ZSA+IE1BWF9JVl9TSVpFKQorCWlmIChpbnN0LT5hbGcuaXZzaXplICYgKHNpemVvZih1NjQpIC0gMSkgfHwgIWluc3QtPmFsZy5pdnNpemUpCiAJCWdvdG8gZnJlZV9pbnN0OwogCiAJaW5zdC0+YWxnLmVuY3J5cHQgPSBlY2hhaW5pdl9lbmNyeXB0OwpAQCAtMjA2LDcgKzE0MCw2IEBACiAJaW5zdC0+YWxnLmluaXQgPSBhZWFkX2luaXRfZ2VuaXY7CiAJaW5zdC0+YWxnLmV4aXQgPSBhZWFkX2V4aXRfZ2VuaXY7CiAKLQlpbnN0LT5hbGcuYmFzZS5jcmFfYWxpZ25tYXNrIHw9IF9fYWxpZ25vZl9fKHUzMikgLSAxOwogCWluc3QtPmFsZy5iYXNlLmNyYV9jdHhzaXplID0gc2l6ZW9mKHN0cnVjdCBhZWFkX2dlbml2X2N0eCk7CiAJaW5zdC0+YWxnLmJhc2UuY3JhX2N0eHNpemUgKz0gaW5zdC0+YWxnLml2c2l6ZTsKIApkaWZmIC0tZ2l0IGEvY3J5cHRvL3JzYS1wa2NzMXBhZC5jIGIvY3J5cHRvL3JzYS1wa2NzMXBhZC5jCmluZGV4IDg3NzAxOWEuLjhiYWFiNDMgMTAwNjQ0Ci0tLSBhL2NyeXB0by9yc2EtcGtjczFwYWQuYworKysgYi9jcnlwdG8vcnNhLXBrY3MxcGFkLmMKQEAgLTI5OCw0MSArMjk4LDQ4IEBACiAJc3RydWN0IGNyeXB0b19ha2NpcGhlciAqdGZtID0gY3J5cHRvX2FrY2lwaGVyX3JlcXRmbShyZXEpOwogCXN0cnVjdCBwa2NzMXBhZF9jdHggKmN0eCA9IGFrY2lwaGVyX3RmbV9jdHgodGZtKTsKIAlzdHJ1Y3QgcGtjczFwYWRfcmVxdWVzdCAqcmVxX2N0eCA9IGFrY2lwaGVyX3JlcXVlc3RfY3R4KHJlcSk7CisJdW5zaWduZWQgaW50IGRzdF9sZW47CiAJdW5zaWduZWQgaW50IHBvczsKLQotCWlmIChlcnIgPT0gLUVPVkVSRkxPVykKLQkJLyogRGVjcnlwdGVkIHZhbHVlIGhhZCBubyBsZWFkaW5nIDAgYnl0ZSAqLwotCQllcnIgPSAtRUlOVkFMOworCXU4ICpvdXRfYnVmOwogCiAJaWYgKGVycikKIAkJZ290byBkb25lOwogCi0JaWYgKHJlcV9jdHgtPmNoaWxkX3JlcS5kc3RfbGVuICE9IGN0eC0+a2V5X3NpemUgLSAxKSB7Ci0JCWVyciA9IC1FSU5WQUw7CisJZXJyID0gLUVJTlZBTDsKKwlkc3RfbGVuID0gcmVxX2N0eC0+Y2hpbGRfcmVxLmRzdF9sZW47CisJaWYgKGRzdF9sZW4gPCBjdHgtPmtleV9zaXplIC0gMSkKIAkJZ290byBkb25lOworCisJb3V0X2J1ZiA9IHJlcV9jdHgtPm91dF9idWY7CisJaWYgKGRzdF9sZW4gPT0gY3R4LT5rZXlfc2l6ZSkgeworCQlpZiAob3V0X2J1ZlswXSAhPSAweDAwKQorCQkJLyogRGVjcnlwdGVkIHZhbHVlIGhhZCBubyBsZWFkaW5nIDAgYnl0ZSAqLworCQkJZ290byBkb25lOworCisJCWRzdF9sZW4tLTsKKwkJb3V0X2J1ZisrOwogCX0KIAotCWlmIChyZXFfY3R4LT5vdXRfYnVmWzBdICE9IDB4MDIpIHsKLQkJZXJyID0gLUVJTlZBTDsKKwlpZiAob3V0X2J1ZlswXSAhPSAweDAyKQogCQlnb3RvIGRvbmU7Ci0JfQotCWZvciAocG9zID0gMTsgcG9zIDwgcmVxX2N0eC0+Y2hpbGRfcmVxLmRzdF9sZW47IHBvcysrKQotCQlpZiAocmVxX2N0eC0+b3V0X2J1Zltwb3NdID09IDB4MDApCisKKwlmb3IgKHBvcyA9IDE7IHBvcyA8IGRzdF9sZW47IHBvcysrKQorCQlpZiAob3V0X2J1Zltwb3NdID09IDB4MDApCiAJCQlicmVhazsKLQlpZiAocG9zIDwgOSB8fCBwb3MgPT0gcmVxX2N0eC0+Y2hpbGRfcmVxLmRzdF9sZW4pIHsKLQkJZXJyID0gLUVJTlZBTDsKKwlpZiAocG9zIDwgOSB8fCBwb3MgPT0gZHN0X2xlbikKIAkJZ290byBkb25lOwotCX0KIAlwb3MrKzsKIAotCWlmIChyZXEtPmRzdF9sZW4gPCByZXFfY3R4LT5jaGlsZF9yZXEuZHN0X2xlbiAtIHBvcykKKwllcnIgPSAwOworCisJaWYgKHJlcS0+ZHN0X2xlbiA8IGRzdF9sZW4gLSBwb3MpCiAJCWVyciA9IC1FT1ZFUkZMT1c7Ci0JcmVxLT5kc3RfbGVuID0gcmVxX2N0eC0+Y2hpbGRfcmVxLmRzdF9sZW4gLSBwb3M7CisJcmVxLT5kc3RfbGVuID0gZHN0X2xlbiAtIHBvczsKIAogCWlmICghZXJyKQogCQlzZ19jb3B5X2Zyb21fYnVmZmVyKHJlcS0+ZHN0LAogCQkJCXNnX25lbnRzX2Zvcl9sZW4ocmVxLT5kc3QsIHJlcS0+ZHN0X2xlbiksCi0JCQkJcmVxX2N0eC0+b3V0X2J1ZiArIHBvcywgcmVxLT5kc3RfbGVuKTsKKwkJCQlvdXRfYnVmICsgcG9zLCByZXEtPmRzdF9sZW4pOwogCiBkb25lOgogCWt6ZnJlZShyZXFfY3R4LT5vdXRfYnVmKTsKZGlmZiAtLWdpdCBhL2NyeXB0by9zaGEzX2dlbmVyaWMuYyBiL2NyeXB0by9zaGEzX2dlbmVyaWMuYwppbmRleCA2MjI2NDM5Li43ZThlZDk2IDEwMDY0NAotLS0gYS9jcnlwdG8vc2hhM19nZW5lcmljLmMKKysrIGIvY3J5cHRvL3NoYTNfZ2VuZXJpYy5jCkBAIC0yNCwxNCArMjQsMTQgQEAKICNkZWZpbmUgUk9UTDY0KHgsIHkpICgoKHgpIDw8ICh5KSkgfCAoKHgpID4+ICg2NCAtICh5KSkpKQogCiBzdGF0aWMgY29uc3QgdTY0IGtlY2Nha2Zfcm5kY1syNF0gPSB7Ci0JMHgwMDAwMDAwMDAwMDAwMDAxLCAweDAwMDAwMDAwMDAwMDgwODIsIDB4ODAwMDAwMDAwMDAwODA4YSwKLQkweDgwMDAwMDAwODAwMDgwMDAsIDB4MDAwMDAwMDAwMDAwODA4YiwgMHgwMDAwMDAwMDgwMDAwMDAxLAotCTB4ODAwMDAwMDA4MDAwODA4MSwgMHg4MDAwMDAwMDAwMDA4MDA5LCAweDAwMDAwMDAwMDAwMDAwOGEsCi0JMHgwMDAwMDAwMDAwMDAwMDg4LCAweDAwMDAwMDAwODAwMDgwMDksIDB4MDAwMDAwMDA4MDAwMDAwYSwKLQkweDAwMDAwMDAwODAwMDgwOGIsIDB4ODAwMDAwMDAwMDAwMDA4YiwgMHg4MDAwMDAwMDAwMDA4MDg5LAotCTB4ODAwMDAwMDAwMDAwODAwMywgMHg4MDAwMDAwMDAwMDA4MDAyLCAweDgwMDAwMDAwMDAwMDAwODAsCi0JMHgwMDAwMDAwMDAwMDA4MDBhLCAweDgwMDAwMDAwODAwMDAwMGEsIDB4ODAwMDAwMDA4MDAwODA4MSwKLQkweDgwMDAwMDAwMDAwMDgwODAsIDB4MDAwMDAwMDA4MDAwMDAwMSwgMHg4MDAwMDAwMDgwMDA4MDA4CisJMHgwMDAwMDAwMDAwMDAwMDAxVUxMLCAweDAwMDAwMDAwMDAwMDgwODJVTEwsIDB4ODAwMDAwMDAwMDAwODA4YVVMTCwKKwkweDgwMDAwMDAwODAwMDgwMDBVTEwsIDB4MDAwMDAwMDAwMDAwODA4YlVMTCwgMHgwMDAwMDAwMDgwMDAwMDAxVUxMLAorCTB4ODAwMDAwMDA4MDAwODA4MVVMTCwgMHg4MDAwMDAwMDAwMDA4MDA5VUxMLCAweDAwMDAwMDAwMDAwMDAwOGFVTEwsCisJMHgwMDAwMDAwMDAwMDAwMDg4VUxMLCAweDAwMDAwMDAwODAwMDgwMDlVTEwsIDB4MDAwMDAwMDA4MDAwMDAwYVVMTCwKKwkweDAwMDAwMDAwODAwMDgwOGJVTEwsIDB4ODAwMDAwMDAwMDAwMDA4YlVMTCwgMHg4MDAwMDAwMDAwMDA4MDg5VUxMLAorCTB4ODAwMDAwMDAwMDAwODAwM1VMTCwgMHg4MDAwMDAwMDAwMDA4MDAyVUxMLCAweDgwMDAwMDAwMDAwMDAwODBVTEwsCisJMHgwMDAwMDAwMDAwMDA4MDBhVUxMLCAweDgwMDAwMDAwODAwMDAwMGFVTEwsIDB4ODAwMDAwMDA4MDAwODA4MVVMTCwKKwkweDgwMDAwMDAwMDAwMDgwODBVTEwsIDB4MDAwMDAwMDA4MDAwMDAwMVVMTCwgMHg4MDAwMDAwMDgwMDA4MDA4VUxMCiB9OwogCiBzdGF0aWMgY29uc3QgaW50IGtlY2Nha2Zfcm90Y1syNF0gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL01ha2VmaWxlIGIvZHJpdmVycy9NYWtlZmlsZQppbmRleCA1M2FiYjRhLi5mMGFmZGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvTWFrZWZpbGUKQEAgLTI5LDYgKzI5LDggQEAKICMgd2FzIHVzZWQgYW5kIGRvIG5vdGhpbmcgaWYgc28KIG9iai0kKENPTkZJR19QTlApCQkrPSBwbnAvCiBvYmoteQkJCQkrPSBhbWJhLworCitvYmoteQkJCQkrPSBjbGsvCiAjIE1hbnkgZHJpdmVycyB3aWxsIHdhbnQgdG8gdXNlIERNQSBzbyB0aGlzIGhhcyB0byBiZSBtYWRlIGF2YWlsYWJsZQogIyByZWFsbHkgZWFybHkuCiBvYmotJChDT05GSUdfRE1BREVWSUNFUykJKz0gZG1hLwpAQCAtMTQyLDggKzE0NCw2IEBACiBvYmotJChDT05GSUdfVkxZTlEpCQkrPSB2bHlucS8KIG9iai0kKENPTkZJR19TVEFHSU5HKQkJKz0gc3RhZ2luZy8KIG9iai15CQkJCSs9IHBsYXRmb3JtLwotI2NvbW1vbiBjbGsgY29kZQotb2JqLXkJCQkJKz0gY2xrLwogCiBvYmotJChDT05GSUdfTUFJTEJPWCkJCSs9IG1haWxib3gvCiBvYmotJChDT05GSUdfSFdTUElOTE9DSykJKz0gaHdzcGlubG9jay8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9LY29uZmlnIGIvZHJpdmVycy9hY3BpL0tjb25maWcKaW5kZXggNDQ1Y2UyOC4uNTM1ZTc4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL0tjb25maWcKKysrIGIvZHJpdmVycy9hY3BpL0tjb25maWcKQEAgLTc3LDYgKzc3LDkgQEAKIAogZW5kaWYKIAorY29uZmlnIEFDUElfU1BDUl9UQUJMRQorCWJvb2wKKwogY29uZmlnIEFDUElfU0xFRVAKIAlib29sCiAJZGVwZW5kcyBvbiBTVVNQRU5EIHx8IEhJQkVSTkFUSU9OCkBAIC0yMjcsNyArMjMwLDYgQEAKIGNvbmZpZyBBQ1BJX0NQUENfTElCCiAJYm9vbAogCWRlcGVuZHMgb24gQUNQSV9QUk9DRVNTT1IKLQlkZXBlbmRzIG9uICFBQ1BJX0NQVV9GUkVRX1BTUwogCXNlbGVjdCBNQUlMQk9YCiAJc2VsZWN0IFBDQwogCWhlbHAKQEAgLTQ2Miw2ICs0NjQsOSBAQAogc291cmNlICJkcml2ZXJzL2FjcGkvYXBlaS9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL2FjcGkvZHB0Zi9LY29uZmlnIgogCitjb25maWcgQUNQSV9XQVRDSERPRworCWJvb2wKKwogY29uZmlnIEFDUElfRVhUTE9HCiAJdHJpc3RhdGUgIkV4dGVuZGVkIEVycm9yIExvZyBzdXBwb3J0IgogCWRlcGVuZHMgb24gWDg2X01DRSAmJiBYODZfTE9DQUxfQVBJQwpAQCAtNTIxLDQgKzUyNiw4IEBACiAJICB1c2Vyc3BhY2UuIFRoZSBjb25maWd1cmFibGUgQUNQSSBncm91cHMgd2lsbCBiZSB2aXNpYmxlIHVuZGVyCiAJICAvY29uZmlnL2FjcGksIGFzc3VtaW5nIGNvbmZpZ2ZzIGlzIG1vdW50ZWQgdW5kZXIgL2NvbmZpZy4KIAoraWYgQVJNNjQKK3NvdXJjZSAiZHJpdmVycy9hY3BpL2FybTY0L0tjb25maWciCitlbmRpZgorCiBlbmRpZgkjIEFDUEkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9NYWtlZmlsZSBiL2RyaXZlcnMvYWNwaS9NYWtlZmlsZQppbmRleCA1YWU5ZDg1Li45ZWQwODc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9hY3BpL01ha2VmaWxlCkBAIC01Niw2ICs1Niw3IEBACiBhY3BpLSQoQ09ORklHX0FDUElfUFJPQ0ZTX1BPV0VSKSArPSBjbV9zYnMubwogYWNwaS15CQkJCSs9IGFjcGlfbHBhdC5vCiBhY3BpLSQoQ09ORklHX0FDUElfR0VORVJJQ19HU0kpICs9IGdzaS5vCithY3BpLSQoQ09ORklHX0FDUElfV0FUQ0hET0cpCSs9IGFjcGlfd2F0Y2hkb2cubwogCiAjIFRoZXNlIGFyZSAocG90ZW50aWFsbHkpIHNlcGFyYXRlIG1vZHVsZXMKIApAQCAtODEsNiArODIsNyBAQAogb2JqLSQoQ09ORklHX0FDUElfQ1VTVE9NX01FVEhPRCkrPSBjdXN0b21fbWV0aG9kLm8KIG9iai0kKENPTkZJR19BQ1BJX0JHUlQpCQkrPSBiZ3J0Lm8KIG9iai0kKENPTkZJR19BQ1BJX0NQUENfTElCKQkrPSBjcHBjX2FjcGkubworb2JqLSQoQ09ORklHX0FDUElfU1BDUl9UQUJMRSkJKz0gc3Bjci5vCiBvYmotJChDT05GSUdfQUNQSV9ERUJVR0dFUl9VU0VSKSArPSBhY3BpX2RiZy5vCiAKICMgcHJvY2Vzc29yIGhhcyBpdHMgb3duICJwcm9jZXNzb3IuIiBtb2R1bGVfcGFyYW0gbmFtZXNwYWNlCkBAIC0xMDUsMyArMTA3LDUgQEAKIAogdmlkZW8tb2JqcwkJCSs9IGFjcGlfdmlkZW8ubyB2aWRlb19kZXRlY3Qubwogb2JqLXkJCQkJKz0gZHB0Zi8KKworb2JqLSQoQ09ORklHX0FSTTY0KQkJKz0gYXJtNjQvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaV9hcGQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpX2FwZC5jCmluZGV4IDFkYWY5YzQuLmQ1OGZiZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpX2FwZC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpX2FwZC5jCkBAIC00Miw2ICs0Miw3IEBACiBzdHJ1Y3QgYXBkX2RldmljZV9kZXNjIHsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGZpeGVkX2Nsa19yYXRlOworCXN0cnVjdCBwcm9wZXJ0eV9lbnRyeSAqcHJvcGVydGllczsKIAlpbnQgKCpzZXR1cCkoc3RydWN0IGFwZF9wcml2YXRlX2RhdGEgKnBkYXRhKTsKIH07CiAKQEAgLTcxLDIyICs3MiwzNSBAQAogfQogCiAjaWZkZWYgQ09ORklHX1g4Nl9BTURfUExBVEZPUk1fREVWSUNFCi1zdGF0aWMgc3RydWN0IGFwZF9kZXZpY2VfZGVzYyBjel9pMmNfZGVzYyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXBkX2RldmljZV9kZXNjIGN6X2kyY19kZXNjID0gewogCS5zZXR1cCA9IGFjcGlfYXBkX3NldHVwLAogCS5maXhlZF9jbGtfcmF0ZSA9IDEzMzAwMDAwMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXBkX2RldmljZV9kZXNjIGN6X3VhcnRfZGVzYyA9IHsKK3N0YXRpYyBzdHJ1Y3QgcHJvcGVydHlfZW50cnkgdWFydF9wcm9wZXJ0aWVzW10gPSB7CisJUFJPUEVSVFlfRU5UUllfVTMyKCJyZWctaW8td2lkdGgiLCA0KSwKKwlQUk9QRVJUWV9FTlRSWV9VMzIoInJlZy1zaGlmdCIsIDIpLAorCVBST1BFUlRZX0VOVFJZX0JPT0woInNucHMsdWFydC0xNjU1MC1jb21wYXRpYmxlIiksCisJeyB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhcGRfZGV2aWNlX2Rlc2MgY3pfdWFydF9kZXNjID0gewogCS5zZXR1cCA9IGFjcGlfYXBkX3NldHVwLAogCS5maXhlZF9jbGtfcmF0ZSA9IDQ4MDAwMDAwLAorCS5wcm9wZXJ0aWVzID0gdWFydF9wcm9wZXJ0aWVzLAogfTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FSTTY0Ci1zdGF0aWMgc3RydWN0IGFwZF9kZXZpY2VfZGVzYyB4Z2VuZV9pMmNfZGVzYyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXBkX2RldmljZV9kZXNjIHhnZW5lX2kyY19kZXNjID0gewogCS5zZXR1cCA9IGFjcGlfYXBkX3NldHVwLAogCS5maXhlZF9jbGtfcmF0ZSA9IDEwMDAwMDAwMCwKIH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXBkX2RldmljZV9kZXNjIHZ1bGNhbl9zcGlfZGVzYyA9IHsKKwkuc2V0dXAgPSBhY3BpX2FwZF9zZXR1cCwKKwkuZml4ZWRfY2xrX3JhdGUgPSAxMzMwMDAwMDAsCit9OwogI2VuZGlmCiAKICNlbHNlCkBAIC0xMjUsNiArMTM5LDEyIEBACiAJCQlnb3RvIGVycl9vdXQ7CiAJfQogCisJaWYgKGRldl9kZXNjLT5wcm9wZXJ0aWVzKSB7CisJCXJldCA9IGRldmljZV9hZGRfcHJvcGVydGllcygmYWRldi0+ZGV2LCBkZXZfZGVzYy0+cHJvcGVydGllcyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9vdXQ7CisJfQorCiAJYWRldi0+ZHJpdmVyX2RhdGEgPSBwZGF0YTsKIAlwZGV2ID0gYWNwaV9jcmVhdGVfcGxhdGZvcm1fZGV2aWNlKGFkZXYpOwogCWlmICghSVNfRVJSX09SX05VTEwocGRldikpCkBAIC0xNDksNiArMTY5LDcgQEAKICNlbmRpZgogI2lmZGVmIENPTkZJR19BUk02NAogCXsgIkFQTUMwRDBGIiwgQVBEX0FERFIoeGdlbmVfaTJjX2Rlc2MpIH0sCisJeyAiQlJDTTkwMEQiLCBBUERfQUREUih2dWxjYW5fc3BpX2Rlc2MpIH0sCiAjZW5kaWYKIAl7IH0KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaV9scHNzLmMgYi9kcml2ZXJzL2FjcGkvYWNwaV9scHNzLmMKaW5kZXggMzU3YTBiOC4uNTUyMDEwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGlfbHBzcy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpX2xwc3MuYwpAQCAtNzUsNiArNzUsNyBAQAogCWNvbnN0IGNoYXIgKmNsa19jb25faWQ7CiAJdW5zaWduZWQgaW50IHBydl9vZmZzZXQ7CiAJc2l6ZV90IHBydl9zaXplX292ZXJyaWRlOworCXN0cnVjdCBwcm9wZXJ0eV9lbnRyeSAqcHJvcGVydGllczsKIAl2b2lkICgqc2V0dXApKHN0cnVjdCBscHNzX3ByaXZhdGVfZGF0YSAqcGRhdGEpOwogfTsKIApAQCAtMTYzLDExICsxNjQsMTkgQEAKIAkucHJ2X29mZnNldCA9IDB4ODAwLAogfTsKIAorc3RhdGljIHN0cnVjdCBwcm9wZXJ0eV9lbnRyeSB1YXJ0X3Byb3BlcnRpZXNbXSA9IHsKKwlQUk9QRVJUWV9FTlRSWV9VMzIoInJlZy1pby13aWR0aCIsIDQpLAorCVBST1BFUlRZX0VOVFJZX1UzMigicmVnLXNoaWZ0IiwgMiksCisJUFJPUEVSVFlfRU5UUllfQk9PTCgic25wcyx1YXJ0LTE2NTUwLWNvbXBhdGlibGUiKSwKKwl7IH0sCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IGxwc3NfZGV2aWNlX2Rlc2MgbHB0X3VhcnRfZGV2X2Rlc2MgPSB7CiAJLmZsYWdzID0gTFBTU19DTEsgfCBMUFNTX0NMS19HQVRFIHwgTFBTU19DTEtfRElWSURFUiB8IExQU1NfTFRSLAogCS5jbGtfY29uX2lkID0gImJhdWRjbGsiLAogCS5wcnZfb2Zmc2V0ID0gMHg4MDAsCiAJLnNldHVwID0gbHBzc191YXJ0X3NldHVwLAorCS5wcm9wZXJ0aWVzID0gdWFydF9wcm9wZXJ0aWVzLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBscHNzX2RldmljZV9kZXNjIGxwdF9zZGlvX2Rldl9kZXNjID0gewpAQCAtMTg5LDYgKzE5OCw3IEBACiAJLmNsa19jb25faWQgPSAiYmF1ZGNsayIsCiAJLnBydl9vZmZzZXQgPSAweDgwMCwKIAkuc2V0dXAgPSBscHNzX3VhcnRfc2V0dXAsCisJLnByb3BlcnRpZXMgPSB1YXJ0X3Byb3BlcnRpZXMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGxwc3NfZGV2aWNlX2Rlc2MgYnN3X3VhcnRfZGV2X2Rlc2MgPSB7CkBAIC0xOTcsNiArMjA3LDcgQEAKIAkuY2xrX2Nvbl9pZCA9ICJiYXVkY2xrIiwKIAkucHJ2X29mZnNldCA9IDB4ODAwLAogCS5zZXR1cCA9IGxwc3NfdWFydF9zZXR1cCwKKwkucHJvcGVydGllcyA9IHVhcnRfcHJvcGVydGllcywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbHBzc19kZXZpY2VfZGVzYyBieXRfc3BpX2Rldl9kZXNjID0gewpAQCAtNDQwLDYgKzQ1MSwxMiBAQAogCQlnb3RvIGVycl9vdXQ7CiAJfQogCisJaWYgKGRldl9kZXNjLT5wcm9wZXJ0aWVzKSB7CisJCXJldCA9IGRldmljZV9hZGRfcHJvcGVydGllcygmYWRldi0+ZGV2LCBkZXZfZGVzYy0+cHJvcGVydGllcyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9vdXQ7CisJfQorCiAJYWRldi0+ZHJpdmVyX2RhdGEgPSBwZGF0YTsKIAlwZGV2ID0gYWNwaV9jcmVhdGVfcGxhdGZvcm1fZGV2aWNlKGFkZXYpOwogCWlmICghSVNfRVJSX09SX05VTEwocGRldikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpX3BsYXRmb3JtLmMgYi9kcml2ZXJzL2FjcGkvYWNwaV9wbGF0Zm9ybS5jCmluZGV4IDE1OWY3ZjEuLmIyMDBhZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpX3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGlfcGxhdGZvcm0uYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgpAQCAtMzAsNiArMzEsMjIgQEAKIAl7IiIsIDB9LAogfTsKIAorc3RhdGljIHZvaWQgYWNwaV9wbGF0Zm9ybV9maWxsX3Jlc291cmNlKHN0cnVjdCBhY3BpX2RldmljZSAqYWRldiwKKwljb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKnNyYywgc3RydWN0IHJlc291cmNlICpkZXN0KQoreworCXN0cnVjdCBkZXZpY2UgKnBhcmVudDsKKworCSpkZXN0ID0gKnNyYzsKKworCS8qCisJICogSWYgdGhlIGRldmljZSBoYXMgcGFyZW50IHdlIG5lZWQgdG8gdGFrZSBpdHMgcmVzb3VyY2VzIGludG8KKwkgKiBhY2NvdW50IGFzIHdlbGwgYmVjYXVzZSB0aGlzIGRldmljZSBtaWdodCBjb25zdW1lIHBhcnQgb2YgdGhvc2UuCisJICovCisJcGFyZW50ID0gYWNwaV9nZXRfZmlyc3RfcGh5c2ljYWxfbm9kZShhZGV2LT5wYXJlbnQpOworCWlmIChwYXJlbnQgJiYgZGV2X2lzX3BjaShwYXJlbnQpKQorCQlkZXN0LT5wYXJlbnQgPSBwY2lfZmluZF9yZXNvdXJjZSh0b19wY2lfZGV2KHBhcmVudCksIGRlc3QpOworfQorCiAvKioKICAqIGFjcGlfY3JlYXRlX3BsYXRmb3JtX2RldmljZSAtIENyZWF0ZSBwbGF0Zm9ybSBkZXZpY2UgZm9yIEFDUEkgZGV2aWNlIG5vZGUKICAqIEBhZGV2OiBBQ1BJIGRldmljZSBub2RlIHRvIGNyZWF0ZSBhIHBsYXRmb3JtIGRldmljZSBmb3IuCkBAIC03MCw3ICs4Nyw4IEBACiAJCX0KIAkJY291bnQgPSAwOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlbnRyeSwgJnJlc291cmNlX2xpc3QsIG5vZGUpCi0JCQlyZXNvdXJjZXNbY291bnQrK10gPSAqcmVudHJ5LT5yZXM7CisJCQlhY3BpX3BsYXRmb3JtX2ZpbGxfcmVzb3VyY2UoYWRldiwgcmVudHJ5LT5yZXMsCisJCQkJCQkgICAgJnJlc291cmNlc1tjb3VudCsrXSk7CiAKIAkJYWNwaV9kZXZfZnJlZV9yZXNvdXJjZV9saXN0KCZyZXNvdXJjZV9saXN0KTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaV9wcm9jZXNzb3IuYyBiL2RyaXZlcnMvYWNwaS9hY3BpX3Byb2Nlc3Nvci5jCmluZGV4IGM3YmE5NDguLjNkZTNiNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpX3Byb2Nlc3Nvci5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpX3Byb2Nlc3Nvci5jCkBAIC0xODIsNiArMTgyLDExIEBACiAKIHZvaWQgX193ZWFrIGFyY2hfdW5yZWdpc3Rlcl9jcHUoaW50IGNwdSkge30KIAoraW50IF9fd2VhayBhY3BpX21hcF9jcHUybm9kZShhY3BpX2hhbmRsZSBoYW5kbGUsIGludCBjcHUsIGludCBwaHlzaWQpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKIHN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfaG90YWRkX2luaXQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKIHsKIAl1bnNpZ25lZCBsb25nIGxvbmcgc3RhOwpAQCAtMzAwLDggKzMwNSwxMSBAQAogCSAqICBFeHRyYSBQcm9jZXNzb3Igb2JqZWN0cyBtYXkgYmUgZW51bWVyYXRlZCBvbiBNUCBzeXN0ZW1zIHdpdGgKIAkgKiAgbGVzcyB0aGFuIHRoZSBtYXggIyBvZiBDUFVzLiBUaGV5IHNob3VsZCBiZSBpZ25vcmVkIF9pZmYKIAkgKiAgdGhleSBhcmUgcGh5c2ljYWxseSBub3QgcHJlc2VudC4KKwkgKgorCSAqICBOT1RFOiBFdmVuIGlmIHRoZSBwcm9jZXNzb3IgaGFzIGEgY3B1aWQsIGl0IG1heSBub3QgYmUgcHJlc2VudAorCSAqICBiZWNhdXNlIGNwdWlkIDwtPiBhcGljaWQgbWFwcGluZyBpcyBwZXJzaXN0ZW50IG5vdy4KIAkgKi8KLQlpZiAoaW52YWxpZF9sb2dpY2FsX2NwdWlkKHByLT5pZCkpIHsKKwlpZiAoaW52YWxpZF9sb2dpY2FsX2NwdWlkKHByLT5pZCkgfHwgIWNwdV9wcmVzZW50KHByLT5pZCkpIHsKIAkJaW50IHJldCA9IGFjcGlfcHJvY2Vzc29yX2hvdGFkZF9pbml0KHByKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CkBAIC01NzMsOCArNTgxLDEwMiBAQAogCS5hdHRhY2ggPSBhY3BpX3Byb2Nlc3Nvcl9jb250YWluZXJfYXR0YWNoLAogfTsKIAorLyogVGhlIG51bWJlciBvZiB0aGUgdW5pcXVlIHByb2Nlc3NvciBJRHMgKi8KK3N0YXRpYyBpbnQgbnJfdW5pcXVlX2lkcyBfX2luaXRkYXRhOworCisvKiBUaGUgbnVtYmVyIG9mIHRoZSBkdXBsaWNhdGUgcHJvY2Vzc29yIElEcyAqLworc3RhdGljIGludCBucl9kdXBsaWNhdGVfaWRzIF9faW5pdGRhdGE7CisKKy8qIFVzZWQgdG8gc3RvcmUgdGhlIHVuaXF1ZSBwcm9jZXNzb3IgSURzICovCitzdGF0aWMgaW50IHVuaXF1ZV9wcm9jZXNzb3JfaWRzW10gX19pbml0ZGF0YSA9IHsKKwlbMCAuLi4gTlJfQ1BVUyAtIDFdID0gLTEsCit9OworCisvKiBVc2VkIHRvIHN0b3JlIHRoZSBkdXBsaWNhdGUgcHJvY2Vzc29yIElEcyAqLworc3RhdGljIGludCBkdXBsaWNhdGVfcHJvY2Vzc29yX2lkc1tdIF9faW5pdGRhdGEgPSB7CisJWzAgLi4uIE5SX0NQVVMgLSAxXSA9IC0xLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IHByb2Nlc3Nvcl92YWxpZGF0ZWRfaWRzX3VwZGF0ZShpbnQgcHJvY19pZCkKK3sKKwlpbnQgaTsKKworCWlmIChucl91bmlxdWVfaWRzID09IE5SX0NQVVN8fG5yX2R1cGxpY2F0ZV9pZHMgPT0gTlJfQ1BVUykKKwkJcmV0dXJuOworCisJLyoKKwkgKiBGaXJzdGx5LCBjb21wYXJlIHRoZSBwcm9jX2lkIHdpdGggZHVwbGljYXRlIElEcywgaWYgdGhlIHByb2NfaWQgaXMKKwkgKiBhbHJlYWR5IGluIHRoZSBJRHMsIGRvIG5vdGhpbmcuCisJICovCisJZm9yIChpID0gMDsgaSA8IG5yX2R1cGxpY2F0ZV9pZHM7IGkrKykgeworCQlpZiAoZHVwbGljYXRlX3Byb2Nlc3Nvcl9pZHNbaV0gPT0gcHJvY19pZCkKKwkJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFNlY29uZGx5LCBjb21wYXJlIHRoZSBwcm9jX2lkIHdpdGggdW5pcXVlIElEcywgaWYgdGhlIHByb2NfaWQgaXMgaW4KKwkgKiB0aGUgSURzLCBwdXQgaXQgaW4gdGhlIGR1cGxpY2F0ZSBJRHMuCisJICovCisJZm9yIChpID0gMDsgaSA8IG5yX3VuaXF1ZV9pZHM7IGkrKykgeworCQlpZiAodW5pcXVlX3Byb2Nlc3Nvcl9pZHNbaV0gPT0gcHJvY19pZCkgeworCQkJZHVwbGljYXRlX3Byb2Nlc3Nvcl9pZHNbbnJfZHVwbGljYXRlX2lkc10gPSBwcm9jX2lkOworCQkJbnJfZHVwbGljYXRlX2lkcysrOworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyoKKwkgKiBMYXN0bHksIHRoZSBwcm9jX2lkIGlzIGEgdW5pcXVlIElELCBwdXQgaXQgaW4gdGhlIHVuaXF1ZSBJRHMuCisJICovCisJdW5pcXVlX3Byb2Nlc3Nvcl9pZHNbbnJfdW5pcXVlX2lkc10gPSBwcm9jX2lkOworCW5yX3VuaXF1ZV9pZHMrKzsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIF9faW5pdCBhY3BpX3Byb2Nlc3Nvcl9pZHNfd2FsayhhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQkJCQkgIHUzMiBsdmwsCisJCQkJCQkgIHZvaWQgKmNvbnRleHQsCisJCQkJCQkgIHZvaWQgKipydikKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5pb24gYWNwaV9vYmplY3Qgb2JqZWN0ID0geyAwIH07CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgc2l6ZW9mKHVuaW9uIGFjcGlfb2JqZWN0KSwgJm9iamVjdCB9OworCisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCBOVUxMLCBOVUxMLCAmYnVmZmVyKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCWFjcGlfaGFuZGxlX2luZm8oaGFuZGxlLCAiTm90IGdldCB0aGUgcHJvY2Vzc29yIG9iamVjdFxuIik7CisJZWxzZQorCQlwcm9jZXNzb3JfdmFsaWRhdGVkX2lkc191cGRhdGUob2JqZWN0LnByb2Nlc3Nvci5wcm9jX2lkKTsKKworCXJldHVybiBBRV9PSzsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGFjcGlfcHJvY2Vzc29yX2NoZWNrX2R1cGxpY2F0ZXModm9pZCkKK3sKKwkvKiBTZWFyY2ggYWxsIHByb2Nlc3NvciBub2RlcyBpbiBBQ1BJIG5hbWVzcGFjZSAqLworCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX1BST0NFU1NPUiwgQUNQSV9ST09UX09CSkVDVCwKKwkJCQkJCUFDUElfVUlOVDMyX01BWCwKKwkJCQkJCWFjcGlfcHJvY2Vzc29yX2lkc193YWxrLAorCQkJCQkJTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKK2Jvb2wgX19pbml0IGFjcGlfcHJvY2Vzc29yX3ZhbGlkYXRlX3Byb2NfaWQoaW50IHByb2NfaWQpCit7CisJaW50IGk7CisKKwkvKgorCSAqIGNvbXBhcmUgdGhlIHByb2NfaWQgd2l0aCBkdXBsaWNhdGUgSURzLCBpZiB0aGUgcHJvY19pZCBpcyBhbHJlYWR5CisJICogaW4gdGhlIGR1cGxpY2F0ZSBJRHMsIHJldHVybiB0cnVlLCBvdGhlcndpc2UsIHJldHVybiBmYWxzZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnJfZHVwbGljYXRlX2lkczsgaSsrKSB7CisJCWlmIChkdXBsaWNhdGVfcHJvY2Vzc29yX2lkc1tpXSA9PSBwcm9jX2lkKQorCQkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKwogdm9pZCBfX2luaXQgYWNwaV9wcm9jZXNzb3JfaW5pdCh2b2lkKQogeworCWFjcGlfcHJvY2Vzc29yX2NoZWNrX2R1cGxpY2F0ZXMoKTsKIAlhY3BpX3NjYW5fYWRkX2hhbmRsZXJfd2l0aF9ob3RwbHVnKCZwcm9jZXNzb3JfaGFuZGxlciwgInByb2Nlc3NvciIpOwogCWFjcGlfc2Nhbl9hZGRfaGFuZGxlcigmcHJvY2Vzc29yX2NvbnRhaW5lcl9oYW5kbGVyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpX3dhdGNoZG9nLmMgYi9kcml2ZXJzL2FjcGkvYWNwaV93YXRjaGRvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzY2FlYmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaV93YXRjaGRvZy5jCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQUNQSSB3YXRjaGRvZyB0YWJsZSBwYXJzaW5nIHN1cHBvcnQuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2LCBJbnRlbCBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBNaWthIFdlc3RlcmJlcmcgPG1pa2Eud2VzdGVyYmVyZ0BsaW51eC5pbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpICJBQ1BJOiB3YXRjaGRvZzogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc3lzdGVtIHNob3VsZCBwcmVmZXIgQUNQSSBiYXNlZCB3YXRjaGRvZyBpbnN0ZWFkIG9mCisgKiB0aGUgbmF0aXZlIG9uZSAod2hpY2ggYXJlIHR5cGljYWxseSB0aGUgc2FtZSBoYXJkd2FyZSkuCisgKi8KK2Jvb2wgYWNwaV9oYXNfd2F0Y2hkb2codm9pZCkKK3sKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgaGRyOworCisJaWYgKGFjcGlfZGlzYWJsZWQpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiBBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfdGFibGVfaGVhZGVyKEFDUElfU0lHX1dEQVQsIDAsICZoZHIpKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFjcGlfaGFzX3dhdGNoZG9nKTsKKwordm9pZCBfX2luaXQgYWNwaV93YXRjaGRvZ19pbml0KHZvaWQpCit7CisJY29uc3Qgc3RydWN0IGFjcGlfd2RhdF9lbnRyeSAqZW50cmllczsKKwljb25zdCBzdHJ1Y3QgYWNwaV90YWJsZV93ZGF0ICp3ZGF0OworCXN0cnVjdCBsaXN0X2hlYWQgcmVzb3VyY2VfbGlzdDsKKwlzdHJ1Y3QgcmVzb3VyY2VfZW50cnkgKnJlbnRyeTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXN0cnVjdCByZXNvdXJjZSAqcmVzb3VyY2VzOworCXNpemVfdCBucmVzb3VyY2VzID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJaW50IGk7CisKKwlzdGF0dXMgPSBhY3BpX2dldF90YWJsZShBQ1BJX1NJR19XREFULCAwLAorCQkJCShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKiopJndkYXQpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkvKiBJdCBpcyBmaW5lIGlmIHRoZXJlIGlzIG5vIFdEQVQgKi8KKwkJcmV0dXJuOworCX0KKworCS8qIFdhdGNoZG9nIGRpc2FibGVkIGJ5IEJJT1MgKi8KKwlpZiAoISh3ZGF0LT5mbGFncyAmIEFDUElfV0RBVF9FTkFCTEVEKSkKKwkJcmV0dXJuOworCisJLyogU2tpcCBsZWdhY3kgUENJIFdEVCBkZXZpY2VzICovCisJaWYgKHdkYXQtPnBjaV9zZWdtZW50ICE9IDB4ZmYgfHwgd2RhdC0+cGNpX2J1cyAhPSAweGZmIHx8CisJICAgIHdkYXQtPnBjaV9kZXZpY2UgIT0gMHhmZiB8fCB3ZGF0LT5wY2lfZnVuY3Rpb24gIT0gMHhmZikKKwkJcmV0dXJuOworCisJSU5JVF9MSVNUX0hFQUQoJnJlc291cmNlX2xpc3QpOworCisJZW50cmllcyA9IChzdHJ1Y3QgYWNwaV93ZGF0X2VudHJ5ICopKHdkYXQgKyAxKTsKKwlmb3IgKGkgPSAwOyBpIDwgd2RhdC0+ZW50cmllczsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqZ2FzOworCQlzdHJ1Y3QgcmVzb3VyY2VfZW50cnkgKnJlbnRyeTsKKwkJc3RydWN0IHJlc291cmNlIHJlczsKKwkJYm9vbCBmb3VuZDsKKworCQlnYXMgPSAmZW50cmllc1tpXS5yZWdpc3Rlcl9yZWdpb247CisKKwkJcmVzLnN0YXJ0ID0gZ2FzLT5hZGRyZXNzOworCQlpZiAoZ2FzLT5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fTUVNT1JZKSB7CisJCQlyZXMuZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKKwkJCXJlcy5lbmQgPSByZXMuc3RhcnQgKyBBTElHTihnYXMtPmFjY2Vzc193aWR0aCwgNCk7CisJCX0gZWxzZSBpZiAoZ2FzLT5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU8pIHsKKwkJCXJlcy5mbGFncyA9IElPUkVTT1VSQ0VfSU87CisJCQlyZXMuZW5kID0gcmVzLnN0YXJ0ICsgZ2FzLT5hY2Nlc3Nfd2lkdGg7CisJCX0gZWxzZSB7CisJCQlwcl93YXJuKCJVbnN1cHBvcnRlZCBhZGRyZXNzIHNwYWNlOiAldVxuIiwKKwkJCQlnYXMtPnNwYWNlX2lkKTsKKwkJCWdvdG8gZmFpbF9mcmVlX3Jlc291cmNlX2xpc3Q7CisJCX0KKworCQlmb3VuZCA9IGZhbHNlOworCQlyZXNvdXJjZV9saXN0X2Zvcl9lYWNoX2VudHJ5KHJlbnRyeSwgJnJlc291cmNlX2xpc3QpIHsKKwkJCWlmIChyZXNvdXJjZV9jb250YWlucyhyZW50cnktPnJlcywgJnJlcykpIHsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoIWZvdW5kKSB7CisJCQlyZW50cnkgPSByZXNvdXJjZV9saXN0X2NyZWF0ZV9lbnRyeShOVUxMLCAwKTsKKwkJCWlmICghcmVudHJ5KQorCQkJCWdvdG8gZmFpbF9mcmVlX3Jlc291cmNlX2xpc3Q7CisKKwkJCSpyZW50cnktPnJlcyA9IHJlczsKKwkJCXJlc291cmNlX2xpc3RfYWRkX3RhaWwocmVudHJ5LCAmcmVzb3VyY2VfbGlzdCk7CisJCQlucmVzb3VyY2VzKys7CisJCX0KKwl9CisKKwlyZXNvdXJjZXMgPSBrY2FsbG9jKG5yZXNvdXJjZXMsIHNpemVvZigqcmVzb3VyY2VzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXNvdXJjZXMpCisJCWdvdG8gZmFpbF9mcmVlX3Jlc291cmNlX2xpc3Q7CisKKwlpID0gMDsKKwlyZXNvdXJjZV9saXN0X2Zvcl9lYWNoX2VudHJ5KHJlbnRyeSwgJnJlc291cmNlX2xpc3QpCisJCXJlc291cmNlc1tpKytdID0gKnJlbnRyeS0+cmVzOworCisJcGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoIndkYXRfd2R0IiwgUExBVEZPUk1fREVWSURfTk9ORSwKKwkJCQkJICAgICAgIHJlc291cmNlcywgbnJlc291cmNlcyk7CisJaWYgKElTX0VSUihwZGV2KSkKKwkJcHJfZXJyKCJGYWlsZWQgdG8gY3JlYXRlIHBsYXRmb3JtIGRldmljZVxuIik7CisKKwlrZnJlZShyZXNvdXJjZXMpOworCitmYWlsX2ZyZWVfcmVzb3VyY2VfbGlzdDoKKwlyZXNvdXJjZV9saXN0X2ZyZWUoJnJlc291cmNlX2xpc3QpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9NYWtlZmlsZSBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvTWFrZWZpbGUKaW5kZXggMjI3YmI3Yi4uMzJkOTNlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL01ha2VmaWxlCkBAIC0xNzUsNiArMTc1LDcgQEAKIAl1dHJlc3JjLm8JXAogCXV0c3RhdGUubwlcCiAJdXRzdHJpbmcubwlcCisJdXRzdHJ0b3VsNjQubwlcCiAJdXR4ZmFjZS5vCVwKIAl1dHhmaW5pdC5vCVwKIAl1dHhmZXJyb3IubwlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjYXBwcy5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2FwcHMuaAppbmRleCBjYTJjMDYwLi4wYmQ2MzA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjYXBwcy5oCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNhcHBzLmgKQEAgLTQ0LDcgKzQ0LDkgQEAKICNpZm5kZWYgX0FDQVBQUwogI2RlZmluZSBfQUNBUFBTCiAKLSNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIEFDUElfVVNFX1NUQU5EQVJEX0hFQURFUlMKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCQkJCS8qIEFDUElfVVNFX1NUQU5EQVJEX0hFQURFUlMgKi8KIAogLyogQ29tbW9uIGluZm8gZm9yIHRvb2wgc2lnbm9ucyAqLwogCkBAIC04MSwxMyArODMsMTMgQEAKIC8qIE1hY3JvcyBmb3IgdXNhZ2UgbWVzc2FnZXMgKi8KIAogI2RlZmluZSBBQ1BJX1VTQUdFX0hFQURFUih1c2FnZSkgXAotCWFjcGlfb3NfcHJpbnRmICgiVXNhZ2U6ICVzXG5PcHRpb25zOlxuIiwgdXNhZ2UpOworCXByaW50ZiAoIlVzYWdlOiAlc1xuT3B0aW9uczpcbiIsIHVzYWdlKTsKIAogI2RlZmluZSBBQ1BJX1VTQUdFX1RFWFQoZGVzY3JpcHRpb24pIFwKLQlhY3BpX29zX3ByaW50ZiAoZGVzY3JpcHRpb24pOworCXByaW50ZiAoZGVzY3JpcHRpb24pOwogCiAjZGVmaW5lIEFDUElfT1BUSU9OKG5hbWUsIGRlc2NyaXB0aW9uKSBcCi0JYWNwaV9vc19wcmludGYgKCIgJS0yMHMlc1xuIiwgbmFtZSwgZGVzY3JpcHRpb24pOworCXByaW50ZiAoIiAgJS0yMHMlc1xuIiwgbmFtZSwgZGVzY3JpcHRpb24pOwogCiAvKiBDaGVjayBmb3IgdW5leHBlY3RlZCBleGNlcHRpb25zICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNkZWJ1Zy5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2RlYnVnLmgKaW5kZXggZjY0MDRlYS4uOTQ3MzdmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY2RlYnVnLmgKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2RlYnVnLmgKQEAgLTE1NSw3ICsxNTUsNyBAQAogCiB2b2lkIGFjcGlfZGJfZGlzYXNzZW1ibGVfYW1sKGNoYXIgKnN0YXRlbWVudHMsIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CiAKLXZvaWQgYWNwaV9kYl9iYXRjaF9leGVjdXRlKGNoYXIgKmNvdW50X2FyZyk7Cit2b2lkIGFjcGlfZGJfZXZhbHVhdGVfcHJlZGVmaW5lZF9uYW1lcyh2b2lkKTsKIAogLyoKICAqIGRibmFtZXMgLSBuYW1lc3BhY2UgY29tbWFuZHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNldmVudHMuaCBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNldmVudHMuaAppbmRleCA3N2FmOTFjLi45MmZhNDdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjZXZlbnRzLmgKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2V2ZW50cy5oCkBAIC04Niw2ICs4Niw5IEBACiBhY3BpX3N0YXR1cyBhY3BpX2V2X2VuYWJsZV9ncGUoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvKTsKIAogYWNwaV9zdGF0dXMKK2FjcGlfZXZfbWFza19ncGUoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvLCB1OCBpc19tYXNrZWQpOworCithY3BpX3N0YXR1cwogYWNwaV9ldl9hZGRfZ3BlX3JlZmVyZW5jZShzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8pOwogCiBhY3BpX3N0YXR1cwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY2dsb2JhbC5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2dsb2JhbC5oCmluZGV4IGZkZWQ3NzYuLjc1MGZhODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNnbG9iYWwuaAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjZ2xvYmFsLmgKQEAgLTMxNyw2ICszMTcsNyBAQAogQUNQSV9JTklUX0dMT0JBTCh1OCwgYWNwaV9nYmxfY3N0eWxlX2Rpc2Fzc2VtYmx5LCBUUlVFKTsKIEFDUElfSU5JVF9HTE9CQUwodTgsIGFjcGlfZ2JsX2ZvcmNlX2FtbF9kaXNhc3NlbWJseSwgRkFMU0UpOwogQUNQSV9JTklUX0dMT0JBTCh1OCwgYWNwaV9nYmxfZG1fb3B0X3ZlcmJvc2UsIFRSVUUpOworQUNQSV9JTklUX0dMT0JBTCh1OCwgYWNwaV9nYmxfZG1fZW1pdF9leHRlcm5hbF9vcGNvZGVzLCBGQUxTRSk7CiAKIEFDUElfR0xPQkFMKHU4LCBhY3BpX2dibF9kbV9vcHRfZGlzYXNtKTsKIEFDUElfR0xPQkFMKHU4LCBhY3BpX2dibF9kbV9vcHRfbGlzdGluZyk7CkBAIC0zODIsNiArMzgzLDcgQEAKIAogQUNQSV9JTklUX0dMT0JBTChBQ1BJX0ZJTEUsIGFjcGlfZ2JsX2RlYnVnX2ZpbGUsIE5VTEwpOwogQUNQSV9JTklUX0dMT0JBTChBQ1BJX0ZJTEUsIGFjcGlfZ2JsX291dHB1dF9maWxlLCBOVUxMKTsKK0FDUElfSU5JVF9HTE9CQUwodTgsIGFjcGlfZ2JsX2RlYnVnX3RpbWVvdXQsIEZBTFNFKTsKIAogLyogUHJpbnQgYnVmZmVyICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNsb2NhbC5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2xvY2FsLmgKaW5kZXggMTMzMzFkNy4uZGZmMTIwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY2xvY2FsLmgKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2xvY2FsLmgKQEAgLTQ4NCw2ICs0ODQsNyBAQAogCXU4IGZsYWdzOwkJLyogTWlzYyBpbmZvIGFib3V0IHRoaXMgR1BFICovCiAJdTggZ3BlX251bWJlcjsJCS8qIFRoaXMgR1BFICovCiAJdTggcnVudGltZV9jb3VudDsJLyogUmVmZXJlbmNlcyB0byBhIHJ1biBHUEUgKi8KKwl1OCBkaXNhYmxlX2Zvcl9kaXNwYXRjaDsJLyogTWFza2VkIGR1cmluZyBkaXNwYXRjaGluZyAqLwogfTsKIAogLyogSW5mb3JtYXRpb24gYWJvdXQgYSBHUEUgcmVnaXN0ZXIgcGFpciwgb25lIHBlciBlYWNoIHN0YXR1cy9lbmFibGUgcGFpciBpbiBhbiBhcnJheSAqLwpAQCAtNDk0LDYgKzQ5NSw3IEBACiAJdTE2IGJhc2VfZ3BlX251bWJlcjsJLyogQmFzZSBHUEUgbnVtYmVyIGZvciB0aGlzIHJlZ2lzdGVyICovCiAJdTggZW5hYmxlX2Zvcl93YWtlOwkvKiBHUEVzIHRvIGtlZXAgZW5hYmxlZCB3aGVuIHNsZWVwaW5nICovCiAJdTggZW5hYmxlX2Zvcl9ydW47CS8qIEdQRXMgdG8ga2VlcCBlbmFibGVkIHdoZW4gcnVubmluZyAqLworCXU4IG1hc2tfZm9yX3J1bjsJLyogR1BFcyB0byBrZWVwIG1hc2tlZCB3aGVuIHJ1bm5pbmcgKi8KIAl1OCBlbmFibGVfbWFzazsJCS8qIEN1cnJlbnQgbWFzayBvZiBlbmFibGVkIEdQRXMgKi8KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNuYW1lc3AuaCBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNuYW1lc3AuaAppbmRleCBmMzNhNGJhLi5iYjdmY2ExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjbmFtZXNwLmgKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY25hbWVzcC5oCkBAIC0xMzAsNiArMTMwLDkgQEAKIGFjcGlfbnNfcGFyc2VfdGFibGUodTMyIHRhYmxlX2luZGV4LCBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqc3RhcnRfbm9kZSk7CiAKIGFjcGlfc3RhdHVzCithY3BpX25zX2V4ZWN1dGVfdGFibGUodTMyIHRhYmxlX2luZGV4LCBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqc3RhcnRfbm9kZSk7CisKK2FjcGlfc3RhdHVzCiBhY3BpX25zX29uZV9jb21wbGV0ZV9wYXJzZSh1MzIgcGFzc19udW1iZXIsCiAJCQkgICB1MzIgdGFibGVfaW5kZXgsCiAJCQkgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqc3RhcnRfbm9kZSk7CkBAIC0yOTYsNiArMjk5LDExIEBACiBhY3BpX25zX3BhdHRlcm5fbWF0Y2goc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm9ial9ub2RlLCBjaGFyICpzZWFyY2hfZm9yKTsKIAogYWNwaV9zdGF0dXMKK2FjcGlfbnNfZ2V0X25vZGVfdW5sb2NrZWQoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnByZWZpeF9ub2RlLAorCQkJICBjb25zdCBjaGFyICpleHRlcm5hbF9wYXRobmFtZSwKKwkJCSAgdTMyIGZsYWdzLCBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKm91dF9ub2RlKTsKKworYWNwaV9zdGF0dXMKIGFjcGlfbnNfZ2V0X25vZGUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnByZWZpeF9ub2RlLAogCQkgY29uc3QgY2hhciAqZXh0ZXJuYWxfcGF0aG5hbWUsCiAJCSB1MzIgZmxhZ3MsIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqb3V0X25vZGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY3BhcnNlci5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY3BhcnNlci5oCmluZGV4IGZjMzA1NzcuLjkzOWQ0MTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNwYXJzZXIuaAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjcGFyc2VyLmgKQEAgLTc4LDYgKzc4LDggQEAKICAqLwogYWNwaV9zdGF0dXMgYWNwaV9wc19leGVjdXRlX21ldGhvZChzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvICppbmZvKTsKIAorYWNwaV9zdGF0dXMgYWNwaV9wc19leGVjdXRlX3RhYmxlKHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8gKmluZm8pOworCiAvKgogICogcHNhcmdzIC0gUGFyc2UgQU1MIG9wY29kZSBhcmd1bWVudHMKICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY3RhYmxlcy5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY3RhYmxlcy5oCmluZGV4IGNkNWExMzUuLmU4NTk1M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWN0YWJsZXMuaAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjdGFibGVzLmgKQEAgLTEyMyw2ICsxMjMsMTQgQEAKIAogdm9pZCBhY3BpX3RiX3VuaW5zdGFsbF90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjKTsKIAorYWNwaV9zdGF0dXMKK2FjcGlfdGJfbG9hZF90YWJsZSh1MzIgdGFibGVfaW5kZXgsIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwYXJlbnRfbm9kZSk7CisKK2FjcGlfc3RhdHVzCithY3BpX3RiX2luc3RhbGxfYW5kX2xvYWRfdGFibGUoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSwKKwkJCSAgICAgICBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKKwkJCSAgICAgICB1OCBmbGFncywgdTggb3ZlcnJpZGUsIHUzMiAqdGFibGVfaW5kZXgpOworCiB2b2lkIGFjcGlfdGJfdGVybWluYXRlKHZvaWQpOwogCiBhY3BpX3N0YXR1cyBhY3BpX3RiX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIodTMyIHRhYmxlX2luZGV4KTsKQEAgLTE1NSwxMCArMTYzLDYgQEAKIGFjcGlfdGJfaW5zdGFsbF90YWJsZV93aXRoX292ZXJyaWRlKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKm5ld190YWJsZV9kZXNjLAogCQkJCSAgICB1OCBvdmVycmlkZSwgdTMyICp0YWJsZV9pbmRleCk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX3RiX2luc3RhbGxfZml4ZWRfdGFibGUoYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCi0JCQkgICAgY2hhciAqc2lnbmF0dXJlLCB1MzIgKnRhYmxlX2luZGV4KTsKLQogYWNwaV9zdGF0dXMgYWNwaV90Yl9wYXJzZV9yb290X3RhYmxlKGFjcGlfcGh5c2ljYWxfYWRkcmVzcyByc2RwX2FkZHJlc3MpOwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY3V0aWxzLmggYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjdXRpbHMuaAppbmRleCBhN2RiYjJiLi4wYTFiNTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjdXRpbHMuaAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjdXRpbHMuaApAQCAtMTE0LDEzICsxMTQsMjUgQEAKIC8qCiAgKiBDb21tb24gZXJyb3IgbWVzc2FnZSBwcmVmaXhlcwogICovCisjaWZuZGVmIEFDUElfTVNHX0VSUk9SCiAjZGVmaW5lIEFDUElfTVNHX0VSUk9SICAgICAgICAgICJBQ1BJIEVycm9yOiAiCisjZW5kaWYKKyNpZm5kZWYgQUNQSV9NU0dfRVhDRVBUSU9OCiAjZGVmaW5lIEFDUElfTVNHX0VYQ0VQVElPTiAgICAgICJBQ1BJIEV4Y2VwdGlvbjogIgorI2VuZGlmCisjaWZuZGVmIEFDUElfTVNHX1dBUk5JTkcKICNkZWZpbmUgQUNQSV9NU0dfV0FSTklORyAgICAgICAgIkFDUEkgV2FybmluZzogIgorI2VuZGlmCisjaWZuZGVmIEFDUElfTVNHX0lORk8KICNkZWZpbmUgQUNQSV9NU0dfSU5GTyAgICAgICAgICAgIkFDUEk6ICIKKyNlbmRpZgogCisjaWZuZGVmIEFDUElfTVNHX0JJT1NfRVJST1IKICNkZWZpbmUgQUNQSV9NU0dfQklPU19FUlJPUiAgICAgIkFDUEkgQklPUyBFcnJvciAoYnVnKTogIgorI2VuZGlmCisjaWZuZGVmIEFDUElfTVNHX0JJT1NfV0FSTklORwogI2RlZmluZSBBQ1BJX01TR19CSU9TX1dBUk5JTkcgICAiQUNQSSBCSU9TIFdhcm5pbmcgKGJ1Zyk6ICIKKyNlbmRpZgogCiAvKgogICogQ29tbW9uIG1lc3NhZ2Ugc3VmZml4CkBAIC0xODQsMTQgKzE5NiwxNSBAQAogCiBpbnQgYWNwaV91dF9zdHJpY21wKGNoYXIgKnN0cmluZzEsIGNoYXIgKnN0cmluZzIpOwogCi1hY3BpX3N0YXR1cwotYWNwaV91dF9zdHJ0b3VsNjQoY2hhciAqc3RyaW5nLAotCQkgIHUzMiBiYXNlLCB1MzIgbWF4X2ludGVnZXJfYnl0ZV93aWR0aCwgdTY0ICpyZXRfaW50ZWdlcik7CithY3BpX3N0YXR1cyBhY3BpX3V0X3N0cnRvdWw2NChjaGFyICpzdHJpbmcsIHUzMiBmbGFncywgdTY0ICpyZXRfaW50ZWdlcik7CiAKLS8qIFZhbHVlcyBmb3IgbWF4X2ludGVnZXJfYnl0ZV93aWR0aCBhYm92ZSAqLwotCi0jZGVmaW5lIEFDUElfTUFYMzJfQllURV9XSURUSCAgICAgICA0Ci0jZGVmaW5lIEFDUElfTUFYNjRfQllURV9XSURUSCAgICAgICA4CisvKgorICogVmFsdWVzIGZvciBGbGFncyBhYm92ZQorICogTm90ZTogTElNSVQgdmFsdWVzIGNvcnJlc3BvbmQgdG8gYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoIHZhbHVlcyAoNC84KQorICovCisjZGVmaW5lIEFDUElfU1RSVE9VTF8zMkJJVCAgICAgICAgICAweDA0CS8qIDQgYnl0ZXMgKi8KKyNkZWZpbmUgQUNQSV9TVFJUT1VMXzY0QklUICAgICAgICAgIDB4MDgJLyogOCBieXRlcyAqLworI2RlZmluZSBBQ1BJX1NUUlRPVUxfQkFTRTE2ICAgICAgICAgMHgxMAkvKiBEZWZhdWx0OiBCYXNlMTAvMTYgKi8KIAogLyoKICAqIHV0Z2xvYmFsIC0gR2xvYmFsIGRhdGEgc3RydWN0dXJlcyBhbmQgcHJvY2VkdXJlcwpAQCAtMjIxLDYgKzIzNCw4IEBACiAKIGNoYXIgYWNwaV91dF9oZXhfdG9fYXNjaWlfY2hhcih1NjQgaW50ZWdlciwgdTMyIHBvc2l0aW9uKTsKIAorYWNwaV9zdGF0dXMgYWNwaV91dF9hc2NpaV90b19oZXhfYnl0ZShjaGFyICp0d29fYXNjaWlfY2hhcnMsIHU4ICpyZXR1cm5fYnl0ZSk7CisKIHU4IGFjcGlfdXRfYXNjaWlfY2hhcl90b19oZXgoaW50IGhleF9jaGFyKTsKIAogdTggYWNwaV91dF92YWxpZF9vYmplY3RfdHlwZShhY3BpX29iamVjdF90eXBlIHR5cGUpOwpAQCAtMzE4LDYgKzMzMywxMSBAQAogCQkgY29uc3QgY2hhciAqbW9kdWxlX25hbWUsIHUzMiBjb21wb25lbnRfaWQsIHU4ICpwdHIpOwogCiB2b2lkCithY3BpX3V0X3N0cl9leGl0KHUzMiBsaW5lX251bWJlciwKKwkJIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCisJCSBjb25zdCBjaGFyICptb2R1bGVfbmFtZSwgdTMyIGNvbXBvbmVudF9pZCwgY29uc3QgY2hhciAqc3RyaW5nKTsKKwordm9pZAogYWNwaV91dF9kZWJ1Z19kdW1wX2J1ZmZlcih1OCAqYnVmZmVyLCB1MzIgY291bnQsIHUzMiBkaXNwbGF5LCB1MzIgY29tcG9uZW50X2lkKTsKIAogdm9pZCBhY3BpX3V0X2R1bXBfYnVmZmVyKHU4ICpidWZmZXIsIHUzMiBjb3VudCwgdTMyIGRpc3BsYXksIHUzMiBvZmZzZXQpOwpAQCAtNzA3LDI1ICs3MjcsNiBAQAogY29uc3QgY2hhciAqYWNwaV9haF9tYXRjaF91dWlkKHU4ICpkYXRhKTsKIAogLyoKLSAqIHV0cHJpbnQgLSBwcmludGYvdnByaW50ZiBvdXRwdXQgZnVuY3Rpb25zCi0gKi8KLWNvbnN0IGNoYXIgKmFjcGlfdXRfc2Nhbl9udW1iZXIoY29uc3QgY2hhciAqc3RyaW5nLCB1NjQgKm51bWJlcl9wdHIpOwotCi1jb25zdCBjaGFyICphY3BpX3V0X3ByaW50X251bWJlcihjaGFyICpzdHJpbmcsIHU2NCBudW1iZXIpOwotCi1pbnQKLWFjcGlfdXRfdnNucHJpbnRmKGNoYXIgKnN0cmluZywKLQkJICBhY3BpX3NpemUgc2l6ZSwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpOwotCi1pbnQgYWNwaV91dF9zbnByaW50ZihjaGFyICpzdHJpbmcsIGFjcGlfc2l6ZSBzaXplLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7Ci0KLSNpZmRlZiBBQ1BJX0FQUExJQ0FUSU9OCi1pbnQgYWNwaV91dF9maWxlX3ZwcmludGYoQUNQSV9GSUxFIGZpbGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKTsKLQotaW50IGFjcGlfdXRfZmlsZV9wcmludGYoQUNQSV9GSUxFIGZpbGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKLSNlbmRpZgotCi0vKgogICogdXR1dWlkIC0tIFVVSUQgc3VwcG9ydCBmdW5jdGlvbnMKICAqLwogI2lmIChkZWZpbmVkIEFDUElfQVNMX0NPTVBJTEVSIHx8IGRlZmluZWQgQUNQSV9FWEVDX0FQUCB8fCBkZWZpbmVkIEFDUElfSEVMUF9BUFApCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2RiY29udmVydC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9kYmNvbnZlcnQuYwppbmRleCA3Y2QwN2IyLi4xNDdjZTg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2RiY29udmVydC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZGJjb252ZXJ0LmMKQEAgLTI3Nyw5ICsyNzcsMTAgQEAKIAlkZWZhdWx0OgogCiAJCW9iamVjdC0+dHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSOwotCQlzdGF0dXMgPQotCQkgICAgYWNwaV91dF9zdHJ0b3VsNjQoc3RyaW5nLCAxNiwgYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoLAotCQkJCSAgICAgICZvYmplY3QtPmludGVnZXIudmFsdWUpOworCQlzdGF0dXMgPSBhY3BpX3V0X3N0cnRvdWw2NChzdHJpbmcsCisJCQkJCSAgIChhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGggfAorCQkJCQkgICAgQUNQSV9TVFJUT1VMX0JBU0UxNiksCisJCQkJCSAgICZvYmplY3QtPmludGVnZXIudmFsdWUpOwogCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZGJleGVjLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2RiZXhlYy5jCmluZGV4IDEyZGYyOTEuLmZlM2RhN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZGJleGVjLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9kYmV4ZWMuYwpAQCAtMzkyLDQzICszOTIsNDkgQEAKIAkJCQkJICBhY3BpX2RiX2V4ZWN1dGlvbl93YWxrLCBOVUxMLCBOVUxMLAogCQkJCQkgIE5VTEwpOwogCQlyZXR1cm47Ci0JfSBlbHNlIHsKLQkJbmFtZV9zdHJpbmcgPSBBQ1BJX0FMTE9DQVRFKHN0cmxlbihuYW1lKSArIDEpOwotCQlpZiAoIW5hbWVfc3RyaW5nKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQltZW1zZXQoJmFjcGlfZ2JsX2RiX21ldGhvZF9pbmZvLCAwLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX2RiX21ldGhvZF9pbmZvKSk7Ci0KLQkJc3RyY3B5KG5hbWVfc3RyaW5nLCBuYW1lKTsKLQkJYWNwaV91dF9zdHJ1cHIobmFtZV9zdHJpbmcpOwotCQlhY3BpX2dibF9kYl9tZXRob2RfaW5mby5uYW1lID0gbmFtZV9zdHJpbmc7Ci0JCWFjcGlfZ2JsX2RiX21ldGhvZF9pbmZvLmFyZ3MgPSBhcmdzOwotCQlhY3BpX2dibF9kYl9tZXRob2RfaW5mby50eXBlcyA9IHR5cGVzOwotCQlhY3BpX2dibF9kYl9tZXRob2RfaW5mby5mbGFncyA9IGZsYWdzOwotCi0JCXJldHVybl9vYmoucG9pbnRlciA9IE5VTEw7Ci0JCXJldHVybl9vYmoubGVuZ3RoID0gQUNQSV9BTExPQ0FURV9CVUZGRVI7Ci0KLQkJc3RhdHVzID0gYWNwaV9kYl9leGVjdXRlX3NldHVwKCZhY3BpX2dibF9kYl9tZXRob2RfaW5mbyk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJQUNQSV9GUkVFKG5hbWVfc3RyaW5nKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8qIEdldCB0aGUgTlMgbm9kZSwgZGV0ZXJtaW5lcyBleGlzdGVuY2UgYWxzbyAqLwotCi0JCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShOVUxMLCBhY3BpX2dibF9kYl9tZXRob2RfaW5mby5wYXRobmFtZSwKLQkJCQkJICZhY3BpX2dibF9kYl9tZXRob2RfaW5mby5tZXRob2QpOwotCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKLQkJCXN0YXR1cyA9Ci0JCQkgICAgYWNwaV9kYl9leGVjdXRlX21ldGhvZCgmYWNwaV9nYmxfZGJfbWV0aG9kX2luZm8sCi0JCQkJCQkgICAmcmV0dXJuX29iaik7Ci0JCX0KLQkJQUNQSV9GUkVFKG5hbWVfc3RyaW5nKTsKIAl9CiAKKwluYW1lX3N0cmluZyA9IEFDUElfQUxMT0NBVEUoc3RybGVuKG5hbWUpICsgMSk7CisJaWYgKCFuYW1lX3N0cmluZykgeworCQlyZXR1cm47CisJfQorCisJbWVtc2V0KCZhY3BpX2dibF9kYl9tZXRob2RfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBhY3BpX2RiX21ldGhvZF9pbmZvKSk7CisJc3RyY3B5KG5hbWVfc3RyaW5nLCBuYW1lKTsKKwlhY3BpX3V0X3N0cnVwcihuYW1lX3N0cmluZyk7CisKKwkvKiBTdWJjb21tYW5kIHRvIEV4ZWN1dGUgYWxsIHByZWRlZmluZWQgbmFtZXMgaW4gdGhlIG5hbWVzcGFjZSAqLworCisJaWYgKCFzdHJuY21wKG5hbWVfc3RyaW5nLCAiUFJFREVGIiwgNikpIHsKKwkJYWNwaV9kYl9ldmFsdWF0ZV9wcmVkZWZpbmVkX25hbWVzKCk7CisJCUFDUElfRlJFRShuYW1lX3N0cmluZyk7CisJCXJldHVybjsKKwl9CisKKwlhY3BpX2dibF9kYl9tZXRob2RfaW5mby5uYW1lID0gbmFtZV9zdHJpbmc7CisJYWNwaV9nYmxfZGJfbWV0aG9kX2luZm8uYXJncyA9IGFyZ3M7CisJYWNwaV9nYmxfZGJfbWV0aG9kX2luZm8udHlwZXMgPSB0eXBlczsKKwlhY3BpX2dibF9kYl9tZXRob2RfaW5mby5mbGFncyA9IGZsYWdzOworCisJcmV0dXJuX29iai5wb2ludGVyID0gTlVMTDsKKwlyZXR1cm5fb2JqLmxlbmd0aCA9IEFDUElfQUxMT0NBVEVfQlVGRkVSOworCisJc3RhdHVzID0gYWNwaV9kYl9leGVjdXRlX3NldHVwKCZhY3BpX2dibF9kYl9tZXRob2RfaW5mbyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfRlJFRShuYW1lX3N0cmluZyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBHZXQgdGhlIE5TIG5vZGUsIGRldGVybWluZXMgZXhpc3RlbmNlIGFsc28gKi8KKworCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShOVUxMLCBhY3BpX2dibF9kYl9tZXRob2RfaW5mby5wYXRobmFtZSwKKwkJCQkgJmFjcGlfZ2JsX2RiX21ldGhvZF9pbmZvLm1ldGhvZCk7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfZGJfZXhlY3V0ZV9tZXRob2QoJmFjcGlfZ2JsX2RiX21ldGhvZF9pbmZvLAorCQkJCQkJJnJldHVybl9vYmopOworCX0KKwlBQ1BJX0ZSRUUobmFtZV9zdHJpbmcpOworCiAJLyoKIAkgKiBBbGxvdyBhbnkgaGFuZGxlcnMgaW4gc2VwYXJhdGUgdGhyZWFkcyB0byBjb21wbGV0ZS4KIAkgKiAoU3VjaCBhcyBOb3RpZnkgaGFuZGxlcnMgaW52b2tlZCBmcm9tIEFNTCBleGVjdXRlZCBhYm92ZSkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2RiZmlsZWlvLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2RiZmlsZWlvLmMKaW5kZXggNDgzMjg3OS4uNmYwNWI4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9kYmZpbGVpby5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZGJmaWxlaW8uYwpAQCAtNDYsMTQgKzQ2LDEyIEBACiAjaW5jbHVkZSAiYWNjb21tb24uaCIKICNpbmNsdWRlICJhY2RlYnVnLmgiCiAjaW5jbHVkZSAiYWN0YWJsZXMuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEFDUElfQVBQTElDQVRJT04KLSNpbmNsdWRlICJhY2FwcHMuaCIKLSNlbmRpZgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9DQV9ERUJVR0dFUgogQUNQSV9NT0RVTEVfTkFNRSgiZGJmaWxlaW8iKQogCisjaWZkZWYgQUNQSV9BUFBMSUNBVElPTgorI2luY2x1ZGUgImFjYXBwcy5oIgogI2lmZGVmIEFDUElfREVCVUdHRVIKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjksOCArNjcsNiBAQAogdm9pZCBhY3BpX2RiX2Nsb3NlX2RlYnVnX2ZpbGUodm9pZCkKIHsKIAotI2lmZGVmIEFDUElfQVBQTElDQVRJT04KLQogCWlmIChhY3BpX2dibF9kZWJ1Z19maWxlKSB7CiAJCWZjbG9zZShhY3BpX2dibF9kZWJ1Z19maWxlKTsKIAkJYWNwaV9nYmxfZGVidWdfZmlsZSA9IE5VTEw7CkBAIC03OCw3ICs3NCw2IEBACiAJCWFjcGlfb3NfcHJpbnRmKCJEZWJ1ZyBvdXRwdXQgZmlsZSAlcyBjbG9zZWRcbiIsCiAJCQkgICAgICAgYWNwaV9nYmxfZGJfZGVidWdfZmlsZW5hbWUpOwogCX0KLSNlbmRpZgogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtOTYsOCArOTEsNiBAQAogdm9pZCBhY3BpX2RiX29wZW5fZGVidWdfZmlsZShjaGFyICpuYW1lKQogewogCi0jaWZkZWYgQUNQSV9BUFBMSUNBVElPTgotCiAJYWNwaV9kYl9jbG9zZV9kZWJ1Z19maWxlKCk7CiAJYWNwaV9nYmxfZGVidWdfZmlsZSA9IGZvcGVuKG5hbWUsICJ3KyIpOwogCWlmICghYWNwaV9nYmxfZGVidWdfZmlsZSkgewpAQCAtMTA5LDggKzEwMiw2IEBACiAJc3RybmNweShhY3BpX2dibF9kYl9kZWJ1Z19maWxlbmFtZSwgbmFtZSwKIAkJc2l6ZW9mKGFjcGlfZ2JsX2RiX2RlYnVnX2ZpbGVuYW1lKSk7CiAJYWNwaV9nYmxfZGJfb3V0cHV0X3RvX2ZpbGUgPSBUUlVFOwotCi0jZW5kaWYKIH0KICNlbmRpZgogCkBAIC0xNTIsMTIgKzE0MywxMyBAQAogCQkJcmV0dXJuIChzdGF0dXMpOwogCQl9CiAKLQkJZnByaW50ZihzdGRlcnIsCi0JCQkiQWNwaSB0YWJsZSBbJTQuNHNdIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQgYW5kIGxvYWRlZFxuIiwKLQkJCXRhYmxlLT5zaWduYXR1cmUpOworCQlhY3BpX29zX3ByaW50ZgorCQkgICAgKCJBY3BpIHRhYmxlIFslNC40c10gc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZCBhbmQgbG9hZGVkXG4iLAorCQkgICAgIHRhYmxlLT5zaWduYXR1cmUpOwogCiAJCXRhYmxlX2xpc3RfaGVhZCA9IHRhYmxlX2xpc3RfaGVhZC0+bmV4dDsKIAl9CiAKIAlyZXR1cm4gKEFFX09LKTsKIH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9kYmlucHV0LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2RiaW5wdXQuYwppbmRleCA3Y2Q1ZDJlLi4wNjgyMTRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2RiaW5wdXQuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2RiaW5wdXQuYwpAQCAtMjg2LDYgKzI4Niw4IEBACiAJezEsICIgICAgIFwiQXNjaWkgU3RyaW5nXCIiLCAiU3RyaW5nIG1ldGhvZCBhcmd1bWVudFxuIn0sCiAJezEsICIgICAgIChIZXggQnl0ZSBMaXN0KSIsICJCdWZmZXIgbWV0aG9kIGFyZ3VtZW50XG4ifSwKIAl7MSwgIiAgICAgW1BhY2thZ2UgRWxlbWVudCBMaXN0XSIsICJQYWNrYWdlIG1ldGhvZCBhcmd1bWVudFxuIn0sCisJezUsICIgIEV4ZWN1dGUgcHJlZGVmaW5lZCIsCisJICJFeGVjdXRlIGFsbCBwcmVkZWZpbmVkIChwdWJsaWMpIG1ldGhvZHNcbiJ9LAogCXsxLCAiICBHbyIsICJBbGxvdyBtZXRob2QgdG8gcnVuIHRvIGNvbXBsZXRpb25cbiJ9LAogCXsxLCAiICBJbmZvcm1hdGlvbiIsICJEaXNwbGF5IGluZm8gYWJvdXQgdGhlIGN1cnJlbnQgbWV0aG9kXG4ifSwKIAl7MSwgIiAgSW50byIsICJTdGVwIGludG8gKG5vdCBvdmVyKSBhIG1ldGhvZCBjYWxsXG4ifSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZGJtZXRob2QuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZGJtZXRob2QuYwppbmRleCBmMTdhODZmLi4zMTRiOTRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2RibWV0aG9kLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9kYm1ldGhvZC5jCkBAIC01Miw2ICs1MiwxMSBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfQ0FfREVCVUdHRVIKIEFDUElfTU9EVUxFX05BTUUoImRibWV0aG9kIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2RiX3dhbGtfZm9yX2V4ZWN1dGUoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKKwkJCSB1MzIgbmVzdGluZ19sZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSk7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZGJfc2V0X21ldGhvZF9icmVha3BvaW50CkBAIC02Niw2ICs3MSw3IEBACiAgKiAgICAgICAgICAgICAgQU1MIG9mZnNldAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHZvaWQKIGFjcGlfZGJfc2V0X21ldGhvZF9icmVha3BvaW50KGNoYXIgKmxvY2F0aW9uLAogCQkJICAgICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKQEAgLTM2NywzICszNzMsMTI5IEBACiAJYWNwaV91dF9yZWxlYXNlX293bmVyX2lkKCZvYmpfZGVzYy0+bWV0aG9kLm93bmVyX2lkKTsKIAlyZXR1cm4gKEFFX09LKTsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kYl93YWxrX2Zvcl9leGVjdXRlCisgKgorICogUEFSQU1FVEVSUzogIENhbGxiYWNrIGZyb20gd2Fsa19uYW1lc3BhY2UKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEJhdGNoIGV4ZWN1dGlvbiBtb2R1bGUuIEN1cnJlbnRseSBvbmx5IGV4ZWN1dGVzIHByZWRlZmluZWQKKyAqICAgICAgICAgICAgICBBQ1BJIG5hbWVzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9kYl93YWxrX2Zvcl9leGVjdXRlKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCisJCQkgdTMyIG5lc3RpbmdfbGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR1cm5fdmFsdWUpCit7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUgPQorCSAgICAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvYmpfaGFuZGxlOworCXN0cnVjdCBhY3BpX2RiX2V4ZWN1dGVfd2FsayAqaW5mbyA9CisJICAgIChzdHJ1Y3QgYWNwaV9kYl9leGVjdXRlX3dhbGsgKiljb250ZXh0OworCXN0cnVjdCBhY3BpX2J1ZmZlciByZXR1cm5fb2JqOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwljaGFyICpwYXRobmFtZTsKKwl1MzIgaTsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2VfaW5mbyAqb2JqX2luZm87CisJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgcGFyYW1fb2JqZWN0czsKKwl1bmlvbiBhY3BpX29iamVjdCBwYXJhbXNbQUNQSV9NRVRIT0RfTlVNX0FSR1NdOworCWNvbnN0IHVuaW9uIGFjcGlfcHJlZGVmaW5lZF9pbmZvICpwcmVkZWZpbmVkOworCisJcHJlZGVmaW5lZCA9IGFjcGlfdXRfbWF0Y2hfcHJlZGVmaW5lZF9tZXRob2Qobm9kZS0+bmFtZS5hc2NpaSk7CisJaWYgKCFwcmVkZWZpbmVkKSB7CisJCXJldHVybiAoQUVfT0spOworCX0KKworCWlmIChub2RlLT50eXBlID09IEFDUElfVFlQRV9MT0NBTF9TQ09QRSkgeworCQlyZXR1cm4gKEFFX09LKTsKKwl9CisKKwlwYXRobmFtZSA9IGFjcGlfbnNfZ2V0X2V4dGVybmFsX3BhdGhuYW1lKG5vZGUpOworCWlmICghcGF0aG5hbWUpIHsKKwkJcmV0dXJuIChBRV9PSyk7CisJfQorCisJLyogR2V0IHRoZSBvYmplY3QgaW5mbyBmb3IgbnVtYmVyIG9mIG1ldGhvZCBwYXJhbWV0ZXJzICovCisKKwlzdGF0dXMgPSBhY3BpX2dldF9vYmplY3RfaW5mbyhvYmpfaGFuZGxlLCAmb2JqX2luZm8pOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm4gKHN0YXR1cyk7CisJfQorCisJcGFyYW1fb2JqZWN0cy5wb2ludGVyID0gTlVMTDsKKwlwYXJhbV9vYmplY3RzLmNvdW50ID0gMDsKKworCWlmIChvYmpfaW5mby0+dHlwZSA9PSBBQ1BJX1RZUEVfTUVUSE9EKSB7CisKKwkJLyogU2V0dXAgZGVmYXVsdCBwYXJhbWV0ZXJzICovCisKKwkJZm9yIChpID0gMDsgaSA8IG9ial9pbmZvLT5wYXJhbV9jb3VudDsgaSsrKSB7CisJCQlwYXJhbXNbaV0udHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSOworCQkJcGFyYW1zW2ldLmludGVnZXIudmFsdWUgPSAxOworCQl9CisKKwkJcGFyYW1fb2JqZWN0cy5wb2ludGVyID0gcGFyYW1zOworCQlwYXJhbV9vYmplY3RzLmNvdW50ID0gb2JqX2luZm8tPnBhcmFtX2NvdW50OworCX0KKworCUFDUElfRlJFRShvYmpfaW5mbyk7CisJcmV0dXJuX29iai5wb2ludGVyID0gTlVMTDsKKwlyZXR1cm5fb2JqLmxlbmd0aCA9IEFDUElfQUxMT0NBVEVfQlVGRkVSOworCisJLyogRG8gdGhlIGFjdHVhbCBtZXRob2QgZXhlY3V0aW9uICovCisKKwlhY3BpX2dibF9tZXRob2RfZXhlY3V0aW5nID0gVFJVRTsKKworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KG5vZGUsIE5VTEwsICZwYXJhbV9vYmplY3RzLCAmcmV0dXJuX29iaik7CisKKwlhY3BpX29zX3ByaW50ZigiJS0zMnMgcmV0dXJuZWQgJXNcbiIsIHBhdGhuYW1lLAorCQkgICAgICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpOworCWFjcGlfZ2JsX21ldGhvZF9leGVjdXRpbmcgPSBGQUxTRTsKKwlBQ1BJX0ZSRUUocGF0aG5hbWUpOworCisJLyogSWdub3JlIHN0YXR1cyBmcm9tIG1ldGhvZCBleGVjdXRpb24gKi8KKworCXN0YXR1cyA9IEFFX09LOworCisJLyogVXBkYXRlIGNvdW50LCBjaGVjayBpZiB3ZSBoYXZlIGV4ZWN1dGVkIGVub3VnaCBtZXRob2RzICovCisKKwlpbmZvLT5jb3VudCsrOworCWlmIChpbmZvLT5jb3VudCA+PSBpbmZvLT5tYXhfY291bnQpIHsKKwkJc3RhdHVzID0gQUVfQ1RSTF9URVJNSU5BVEU7CisJfQorCisJcmV0dXJuIChzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RiX2V2YWx1YXRlX3ByZWRlZmluZWRfbmFtZXMKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZQorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IE5hbWVzcGFjZSBiYXRjaCBleGVjdXRpb24uIEV4ZWN1dGUgcHJlZGVmaW5lZCBuYW1lcyBpbiB0aGUKKyAqICAgICAgICAgICAgICBuYW1lc3BhY2UsIHVwIHRvIHRoZSBtYXggY291bnQsIGlmIHNwZWNpZmllZC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGFjcGlfZGJfZXZhbHVhdGVfcHJlZGVmaW5lZF9uYW1lcyh2b2lkKQoreworCXN0cnVjdCBhY3BpX2RiX2V4ZWN1dGVfd2FsayBpbmZvOworCisJaW5mby5jb3VudCA9IDA7CisJaW5mby5tYXhfY291bnQgPSBBQ1BJX1VJTlQzMl9NQVg7CisKKwkvKiBTZWFyY2ggYWxsIG5vZGVzIGluIG5hbWVzcGFjZSAqLworCisJKHZvaWQpYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfQU5ZLCBBQ1BJX1JPT1RfT0JKRUNULAorCQkJCSAgQUNQSV9VSU5UMzJfTUFYLCBhY3BpX2RiX3dhbGtfZm9yX2V4ZWN1dGUsCisJCQkJICBOVUxMLCAodm9pZCAqKSZpbmZvLCBOVUxMKTsKKworCWFjcGlfb3NfcHJpbnRmKCJFdmFsdWF0ZWQgJXUgcHJlZGVmaW5lZCBuYW1lcyBpbiB0aGUgbmFtZXNwYWNlXG4iLAorCQkgICAgICAgaW5mby5jb3VudCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rib2JqZWN0LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rib2JqZWN0LmMKaW5kZXggMWQ1OWU4Yi4uMDhlYWFmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9kYm9iamVjdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZGJvYmplY3QuYwpAQCAtMTQyLDExICsxNDIsMTEgQEAKIAogCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKIAotCQlhY3BpX29zX3ByaW50ZigiKCV1KSBcIiUuMjRzIiwKKwkJYWNwaV9vc19wcmludGYoIigldSkgXCIlLjYwcyIsCiAJCQkgICAgICAgb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGgsCiAJCQkgICAgICAgb2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyKTsKIAotCQlpZiAob2JqX2Rlc2MtPnN0cmluZy5sZW5ndGggPiAyNCkgeworCQlpZiAob2JqX2Rlc2MtPnN0cmluZy5sZW5ndGggPiA2MCkgewogCQkJYWNwaV9vc19wcmludGYoIi4uLiIpOwogCQl9IGVsc2UgewogCQkJYWNwaV9vc19wcmludGYoIlwiIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2RzbWV0aG9kLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2RzbWV0aG9kLmMKaW5kZXggNDdjN2I1Mi4uMzJlOWRkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9kc21ldGhvZC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHNtZXRob2QuYwpAQCAtOTksMTEgKzk5LDE0IEBACiAJCQkgICJNZXRob2QgYXV0by1zZXJpYWxpemF0aW9uIHBhcnNlIFslNC40c10gJXBcbiIsCiAJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSwgbm9kZSkpOwogCisJYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcigpOworCiAJLyogQ3JlYXRlL0luaXQgYSByb290IG9wIGZvciB0aGUgbWV0aG9kIHBhcnNlIHRyZWUgKi8KIAogCW9wID0gYWNwaV9wc19hbGxvY19vcChBTUxfTUVUSE9EX09QLCBvYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydCk7CiAJaWYgKCFvcCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQlnb3RvIHVubG9jazsKIAl9CiAKIAlhY3BpX3BzX3NldF9uYW1lKG9wLCBub2RlLT5uYW1lLmludGVnZXIpOwpAQCAtMTE1LDcgKzExOCw4IEBACiAJICAgIGFjcGlfZHNfY3JlYXRlX3dhbGtfc3RhdGUobm9kZS0+b3duZXJfaWQsIE5VTEwsIE5VTEwsIE5VTEwpOwogCWlmICghd2Fsa19zdGF0ZSkgewogCQlhY3BpX3BzX2ZyZWVfb3Aob3ApOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQlnb3RvIHVubG9jazsKIAl9CiAKIAlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYW1sX3dhbGsod2Fsa19zdGF0ZSwgb3AsIG5vZGUsCkBAIC0xMzQsNiArMTM4LDggQEAKIAlzdGF0dXMgPSBhY3BpX3BzX3BhcnNlX2FtbCh3YWxrX3N0YXRlKTsKIAogCWFjcGlfcHNfZGVsZXRlX3BhcnNlX3RyZWUob3ApOwordW5sb2NrOgorCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlcigpOwogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCkBAIC03NTcsOCArNzYzLDEwIEBACiAKIAkJCS8qIERlbGV0ZSBhbnkgZGlyZWN0IGNoaWxkcmVuIG9mIChjcmVhdGVkIGJ5KSB0aGlzIG1ldGhvZCAqLwogCisJCQkodm9pZClhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIoKTsKIAkJCWFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9zdWJ0cmVlKHdhbGtfc3RhdGUtPgogCQkJCQkJCSBtZXRob2Rfbm9kZSk7CisJCQkodm9pZClhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKCk7CiAKIAkJCS8qCiAJCQkgKiBEZWxldGUgYW55IG9iamVjdHMgdGhhdCB3ZXJlIGNyZWF0ZWQgYnkgdGhpcyBtZXRob2QKQEAgLTc2OSw5ICs3NzcsMTEgQEAKIAkJCSAqLwogCQkJaWYgKG1ldGhvZF9kZXNjLT5tZXRob2QuCiAJCQkgICAgaW5mb19mbGFncyAmIEFDUElfTUVUSE9EX01PRElGSUVEX05BTUVTUEFDRSkgeworCQkJCSh2b2lkKWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlcigpOwogCQkJCWFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lcihtZXRob2RfZGVzYy0+CiAJCQkJCQkJCSAgbWV0aG9kLgogCQkJCQkJCQkgIG93bmVyX2lkKTsKKwkJCQkodm9pZClhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKCk7CiAJCQkJbWV0aG9kX2Rlc2MtPm1ldGhvZC5pbmZvX2ZsYWdzICY9CiAJCQkJICAgIH5BQ1BJX01FVEhPRF9NT0RJRklFRF9OQU1FU1BBQ0U7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2RzdXRpbHMuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHN1dGlscy5jCmluZGV4IGYzOTNkZTkuLjdkOGVmNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHN1dGlscy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHN1dGlscy5jCkBAIC01NjUsMTUgKzU2NSwxNCBAQAogCQkJCQlzdGF0dXMgPSBBRV9PSzsKIAkJCQl9IGVsc2UgaWYgKHBhcmVudF9vcC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0KIAkJCQkJICAgQU1MX0VYVEVSTkFMX09QKSB7Ci0KLQkJCQkJLyogVEJEOiBNYXkgb25seSBiZSB0ZW1wb3JhcnkgKi8KLQotCQkJCQlvYmpfZGVzYyA9Ci0JCQkJCSAgICBhY3BpX3V0X2NyZWF0ZV9zdHJpbmdfb2JqZWN0KChhY3BpX3NpemUpbmFtZV9sZW5ndGgpOwotCi0JCQkJCXN0cm5jcHkob2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyLAotCQkJCQkJbmFtZV9zdHJpbmcsIG5hbWVfbGVuZ3RoKTsKLQkJCQkJc3RhdHVzID0gQUVfT0s7CisJCQkJCS8qCisJCQkJCSAqIFRoaXMgb3Bjb2RlIHNob3VsZCBuZXZlciBhcHBlYXIgaGVyZS4gSXQgaXMgdXNlZCBvbmx5CisJCQkJCSAqIGJ5IEFNTCBkaXNhc3NlbWJsZXJzIGFuZCBpcyBzdXJyb3VuZGVkIGJ5IGFuIElmKDApCisJCQkJCSAqIGJ5IHRoZSBBU0wgY29tcGlsZXIuCisJCQkJCSAqCisJCQkJCSAqIFRoZXJlZm9yZSwgaWYgd2Ugc2VlIGl0IGhlcmUsIGl0IGlzIGEgc2VyaW91cyBlcnJvci4KKwkJCQkJICovCisJCQkJCXN0YXR1cyA9IEFFX0FNTF9CQURfT1BDT0RFOwogCQkJCX0gZWxzZSB7CiAJCQkJCS8qCiAJCQkJCSAqIFdlIGp1c3QgcGxhaW4gZGlkbid0IGZpbmQgaXQgLS0gd2hpY2ggaXMgYQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9kc3dleGVjLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rzd2V4ZWMuYwppbmRleCA0MDJlY2M1Li40Mzg1OTdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rzd2V4ZWMuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rzd2V4ZWMuYwpAQCAtMTMzLDcgKzEzMyw4IEBACiAJICogUmVzdWx0IG9mIHByZWRpY2F0ZSBldmFsdWF0aW9uIG11c3QgYmUgYW4gSW50ZWdlcgogCSAqIG9iamVjdC4gSW1wbGljaXRseSBjb252ZXJ0IHRoZSBhcmd1bWVudCBpZiBuZWNlc3NhcnkuCiAJICovCi0Jc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIob2JqX2Rlc2MsICZsb2NhbF9vYmpfZGVzYywgMTYpOworCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19pbnRlZ2VyKG9ial9kZXNjLCAmbG9jYWxfb2JqX2Rlc2MsCisJCQkJCSAgICBBQ1BJX1NUUlRPVUxfQkFTRTE2KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJZ290byBjbGVhbnVwOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHN3bG9hZDIuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZHN3bG9hZDIuYwppbmRleCA3NjJkYjNmLi4wMjhiMjJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2Rzd2xvYWQyLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9kc3dsb2FkMi5jCkBAIC02MDUsMTYgKzYwNSwxMyBAQAogCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJCQl9Ci0KLQkJCQlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIoKTsKIAkJCX0KIAorCQkJYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7CiAJCQlzdGF0dXMgPQogCQkJICAgIGFjcGlfZXZfaW5pdGlhbGl6ZV9yZWdpb24KIAkJCSAgICAoYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpLCBGQUxTRSk7Ci0JCQlpZiAod2Fsa19zdGF0ZS0+bWV0aG9kX25vZGUpIHsKLQkJCQlhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKCk7Ci0JCQl9CisJCQlhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKCk7CiAKIAkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2Z3BlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2Z3BlLmMKaW5kZXggNGI0OTQ5Yy4uYmRiMTBiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9ldmdwZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZncGUuYwpAQCAtMTMwLDYgKzEzMCw2MCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X21hc2tfZ3BlCisgKgorICogUEFSQU1FVEVSUzogIGdwZV9ldmVudF9pbmZvICAgICAgICAgIC0gR1BFIHRvIGJlIGJsb2NrZWQvdW5ibG9ja2VkCisgKiAgICAgICAgICAgICAgaXNfbWFza2VkICAgICAgICAgICAgICAgLSBXaGV0aGVyIHRoZSBHUEUgaXMgbWFza2VkIG9yIG5vdAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogVW5jb25kaXRpb25hbGx5IG1hc2svdW5tYXNrIGEgR1BFIGR1cmluZyBydW50aW1lLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX2V2X21hc2tfZ3BlKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbywgdTggaXNfbWFza2VkKQoreworCXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvICpncGVfcmVnaXN0ZXJfaW5mbzsKKwl1MzIgcmVnaXN0ZXJfYml0OworCisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9tYXNrX2dwZSk7CisKKwlncGVfcmVnaXN0ZXJfaW5mbyA9IGdwZV9ldmVudF9pbmZvLT5yZWdpc3Rlcl9pbmZvOworCWlmICghZ3BlX3JlZ2lzdGVyX2luZm8pIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9FWElTVCk7CisJfQorCisJcmVnaXN0ZXJfYml0ID0gYWNwaV9od19nZXRfZ3BlX3JlZ2lzdGVyX2JpdChncGVfZXZlbnRfaW5mbyk7CisKKwkvKiBQZXJmb3JtIHRoZSBhY3Rpb24gKi8KKworCWlmIChpc19tYXNrZWQpIHsKKwkJaWYgKHJlZ2lzdGVyX2JpdCAmIGdwZV9yZWdpc3Rlcl9pbmZvLT5tYXNrX2Zvcl9ydW4pIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwkJfQorCisJCSh2b2lkKWFjcGlfaHdfbG93X3NldF9ncGUoZ3BlX2V2ZW50X2luZm8sIEFDUElfR1BFX0RJU0FCTEUpOworCQlBQ1BJX1NFVF9CSVQoZ3BlX3JlZ2lzdGVyX2luZm8tPm1hc2tfZm9yX3J1biwgKHU4KXJlZ2lzdGVyX2JpdCk7CisJfSBlbHNlIHsKKwkJaWYgKCEocmVnaXN0ZXJfYml0ICYgZ3BlX3JlZ2lzdGVyX2luZm8tPm1hc2tfZm9yX3J1bikpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwkJfQorCisJCUFDUElfQ0xFQVJfQklUKGdwZV9yZWdpc3Rlcl9pbmZvLT5tYXNrX2Zvcl9ydW4sCisJCQkgICAgICAgKHU4KXJlZ2lzdGVyX2JpdCk7CisJCWlmIChncGVfZXZlbnRfaW5mby0+cnVudGltZV9jb3VudAorCQkgICAgJiYgIWdwZV9ldmVudF9pbmZvLT5kaXNhYmxlX2Zvcl9kaXNwYXRjaCkgeworCQkJKHZvaWQpYWNwaV9od19sb3dfc2V0X2dwZShncGVfZXZlbnRfaW5mbywKKwkJCQkJCSAgQUNQSV9HUEVfRU5BQkxFKTsKKwkJfQorCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfYWRkX2dwZV9yZWZlcmVuY2UKICAqCiAgKiBQQVJBTUVURVJTOiAgZ3BlX2V2ZW50X2luZm8gICAgICAgICAgLSBBZGQgYSByZWZlcmVuY2UgdG8gdGhpcyBHUEUKQEAgLTY3NCw2ICs3MjgsNyBAQAogCSAqIGluIHRoZSBldmVudF9pbmZvLgogCSAqLwogCSh2b2lkKWFjcGlfaHdfbG93X3NldF9ncGUoZ3BlX2V2ZW50X2luZm8sIEFDUElfR1BFX0NPTkRJVElPTkFMX0VOQUJMRSk7CisJZ3BlX2V2ZW50X2luZm8tPmRpc2FibGVfZm9yX2Rpc3BhdGNoID0gRkFMU0U7CiAJcmV0dXJuIChBRV9PSyk7CiB9CiAKQEAgLTczNyw2ICs3OTIsOCBAQAogCQl9CiAJfQogCisJZ3BlX2V2ZW50X2luZm8tPmRpc2FibGVfZm9yX2Rpc3BhdGNoID0gVFJVRTsKKwogCS8qCiAJICogRGlzcGF0Y2ggdGhlIEdQRSB0byBlaXRoZXIgYW4gaW5zdGFsbGVkIGhhbmRsZXIgb3IgdGhlIGNvbnRyb2wKIAkgKiBtZXRob2QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgR1BFIChfTHh4IG9yIF9FeHgpLiBJZiBhIGhhbmRsZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZncGVpbml0LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2Z3BlaW5pdC5jCmluZGV4IDdkYzc1NDcuLjE2Y2U0ODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZncGVpbml0LmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9ldmdwZWluaXQuYwpAQCAtMzIzLDcgKzMyMyw5IEBACiAJc3RydWN0IGFjcGlfZ3BlX3dhbGtfaW5mbyAqd2Fsa19pbmZvID0KIAkgICAgQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9ncGVfd2Fsa19pbmZvLCBjb250ZXh0KTsKIAlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm87CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXUzMiBncGVfbnVtYmVyOworCXU4IHRlbXBfZ3BlX251bWJlcjsKIAljaGFyIG5hbWVbQUNQSV9OQU1FX1NJWkUgKyAxXTsKIAl1OCB0eXBlOwogCkBAIC0zNzcsOCArMzc5LDggQEAKIAogCS8qIDQpIFRoZSBsYXN0IHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBuYW1lIGFyZSB0aGUgaGV4IEdQRSBOdW1iZXIgKi8KIAotCWdwZV9udW1iZXIgPSBzdHJ0b3VsKCZuYW1lWzJdLCBOVUxMLCAxNik7Ci0JaWYgKGdwZV9udW1iZXIgPT0gQUNQSV9VSU5UMzJfTUFYKSB7CisJc3RhdHVzID0gYWNwaV91dF9hc2NpaV90b19oZXhfYnl0ZSgmbmFtZVsyXSwgJnRlbXBfZ3BlX251bWJlcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAKIAkJLyogQ29udmVyc2lvbiBmYWlsZWQ7IGludmFsaWQgbWV0aG9kLCBqdXN0IGlnbm9yZSBpdCAqLwogCkBAIC0zOTAsNiArMzkyLDcgQEAKIAogCS8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSB2YWxpZCBHUEUgbnVtYmVyIGZvciB0aGlzIEdQRSBibG9jayAqLwogCisJZ3BlX251bWJlciA9ICh1MzIpdGVtcF9ncGVfbnVtYmVyOwogCWdwZV9ldmVudF9pbmZvID0KIAkgICAgYWNwaV9ldl9sb3dfZ2V0X2dwZV9pbmZvKGdwZV9udW1iZXIsIHdhbGtfaW5mby0+Z3BlX2Jsb2NrKTsKIAlpZiAoIWdwZV9ldmVudF9pbmZvKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2cmduaW5pLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2cmduaW5pLmMKaW5kZXggYjZlYTljMC4uMzg0M2YxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9ldnJnbmluaS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZyZ25pbmkuYwpAQCAtNTUzLDcgKzU1Myw4IEBACiAJCQkJICoKIAkJCQkgKiBTZWUgYWNwaV9uc19leGVjX21vZHVsZV9jb2RlCiAJCQkJICovCi0JCQkJaWYgKG9ial9kZXNjLT5tZXRob2QuCisJCQkJaWYgKCFhY3BpX2dibF9wYXJzZV90YWJsZV9hc190ZXJtX2xpc3QgJiYKKwkJCQkgICAgb2JqX2Rlc2MtPm1ldGhvZC4KIAkJCQkgICAgaW5mb19mbGFncyAmIEFDUElfTUVUSE9EX01PRFVMRV9MRVZFTCkgewogCQkJCQloYW5kbGVyX29iaiA9CiAJCQkJCSAgICBvYmpfZGVzYy0+bWV0aG9kLmRpc3BhdGNoLmhhbmRsZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V2eGZncGUuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZmdwZS5jCmluZGV4IDE3Y2ZlZjcuLmQ3YTNiMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZmdwZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXZ4ZmdwZS5jCkBAIC0yMzUsMTEgKzIzNSwxMyBAQAogCWNhc2UgQUNQSV9HUEVfRU5BQkxFOgogCiAJCXN0YXR1cyA9IGFjcGlfaHdfbG93X3NldF9ncGUoZ3BlX2V2ZW50X2luZm8sIEFDUElfR1BFX0VOQUJMRSk7CisJCWdwZV9ldmVudF9pbmZvLT5kaXNhYmxlX2Zvcl9kaXNwYXRjaCA9IEZBTFNFOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9HUEVfRElTQUJMRToKIAogCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19zZXRfZ3BlKGdwZV9ldmVudF9pbmZvLCBBQ1BJX0dQRV9ESVNBQkxFKTsKKwkJZ3BlX2V2ZW50X2luZm8tPmRpc2FibGVfZm9yX2Rpc3BhdGNoID0gVFJVRTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMjU3LDYgKzI1OSw0NyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX21hc2tfZ3BlCisgKgorICogUEFSQU1FVEVSUzogIGdwZV9kZXZpY2UgICAgICAgICAgLSBQYXJlbnQgR1BFIERldmljZS4gTlVMTCBmb3IgR1BFMC9HUEUxCisgKiAgICAgICAgICAgICAgZ3BlX251bWJlciAgICAgICAgICAtIEdQRSBsZXZlbCB3aXRoaW4gdGhlIEdQRSBibG9jaworICogICAgICAgICAgICAgIGlzX21hc2tlZCAgICAgICAgICAgLSBXaGV0aGVyIHRoZSBHUEUgaXMgbWFza2VkIG9yIG5vdAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogVW5jb25kaXRpb25hbGx5IG1hc2svdW5tYXNrIHRoZSBhbiBpbmRpdmlkdWFsIEdQRSwgZXguLCB0bworICogICAgICAgICAgICAgIHByZXZlbnQgYSBHUEUgZmxvb2RpbmcuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzIGFjcGlfbWFza19ncGUoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwgdTMyIGdwZV9udW1iZXIsIHU4IGlzX21hc2tlZCkKK3sKKwlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm87CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfY3B1X2ZsYWdzIGZsYWdzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX21hc2tfZ3BlKTsKKworCWZsYWdzID0gYWNwaV9vc19hY3F1aXJlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2spOworCisJLyogRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIEdQRSBudW1iZXIgKi8KKworCWdwZV9ldmVudF9pbmZvID0gYWNwaV9ldl9nZXRfZ3BlX2V2ZW50X2luZm8oZ3BlX2RldmljZSwgZ3BlX251bWJlcik7CisJaWYgKCFncGVfZXZlbnRfaW5mbykgeworCQlzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOworCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKwl9CisKKwlzdGF0dXMgPSBhY3BpX2V2X21hc2tfZ3BlKGdwZV9ldmVudF9pbmZvLCBpc19tYXNrZWQpOworCit1bmxvY2tfYW5kX2V4aXQ6CisJYWNwaV9vc19yZWxlYXNlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfbWFza19ncGUpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbWFya19ncGVfZm9yX3dha2UKICAqCiAgKiBQQVJBTUVURVJTOiAgZ3BlX2RldmljZSAgICAgICAgICAtIFBhcmVudCBHUEUgRGV2aWNlLiBOVUxMIGZvciBHUEUwL0dQRTEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhjb25jYXQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhjb25jYXQuYwppbmRleCAyNDIzZmUwLi41NDI5YzJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4Y29uY2F0LmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leGNvbmNhdC5jCkBAIC0xNTYsNyArMTU2LDcgQEAKIAogCQlzdGF0dXMgPQogCQkgICAgYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIobG9jYWxfb3BlcmFuZDEsICZ0ZW1wX29wZXJhbmQxLAotCQkJCQkgICAgICAgMTYpOworCQkJCQkgICAgICAgQUNQSV9TVFJUT1VMX0JBU0UxNik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9leGNvbmZpZy5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leGNvbmZpZy5jCmluZGV4IGExZDE3N2QuLjcxODQyOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhjb25maWcuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4Y29uZmlnLmMKQEAgLTU1LDkgKzU1LDcgQEAKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2FkZF90YWJsZSh1MzIgdGFibGVfaW5kZXgsCi0JCSAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlLAotCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipkZGJfaGFuZGxlKTsKK2FjcGlfZXhfYWRkX3RhYmxlKHUzMiB0YWJsZV9pbmRleCwgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKmRkYl9oYW5kbGUpOwogCiBzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfZXhfcmVnaW9uX3JlYWQodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCkBAIC03OSwxMyArNzcsOSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2FkZF90YWJsZSh1MzIgdGFibGVfaW5kZXgsCi0JCSAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlLAotCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipkZGJfaGFuZGxlKQorYWNwaV9leF9hZGRfdGFibGUodTMyIHRhYmxlX2luZGV4LCB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqZGRiX2hhbmRsZSkKIHsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JYWNwaV9vd25lcl9pZCBvd25lcl9pZDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfYWRkX3RhYmxlKTsKIApAQCAtMTAwLDM5ICs5NCw4IEBACiAKIAlvYmpfZGVzYy0+Y29tbW9uLmZsYWdzIHw9IEFPUE9CSl9EQVRBX1ZBTElEOwogCW9ial9kZXNjLT5yZWZlcmVuY2UuY2xhc3MgPSBBQ1BJX1JFRkNMQVNTX1RBQkxFOwotCSpkZGJfaGFuZGxlID0gb2JqX2Rlc2M7Ci0KLQkvKiBJbnN0YWxsIHRoZSBuZXcgdGFibGUgaW50byB0aGUgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KIAlvYmpfZGVzYy0+cmVmZXJlbmNlLnZhbHVlID0gdGFibGVfaW5kZXg7Ci0KLQkvKiBBZGQgdGhlIHRhYmxlIHRvIHRoZSBuYW1lc3BhY2UgKi8KLQotCXN0YXR1cyA9IGFjcGlfbnNfbG9hZF90YWJsZSh0YWJsZV9pbmRleCwgcGFyZW50X25vZGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwotCQkqZGRiX2hhbmRsZSA9IE5VTEw7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIEV4ZWN1dGUgYW55IG1vZHVsZS1sZXZlbCBjb2RlIHRoYXQgd2FzIGZvdW5kIGluIHRoZSB0YWJsZSAqLwotCi0JYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7Ci0JaWYgKGFjcGlfZ2JsX2dyb3VwX21vZHVsZV9sZXZlbF9jb2RlKSB7Ci0JCWFjcGlfbnNfZXhlY19tb2R1bGVfY29kZV9saXN0KCk7Ci0JfQotCWFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKLQotCS8qCi0JICogVXBkYXRlIEdQRXMgZm9yIGFueSBuZXcgX0x4eC9fRXh4IG1ldGhvZHMuIElnbm9yZSBlcnJvcnMuIFRoZSBob3N0IGlzCi0JICogcmVzcG9uc2libGUgZm9yIGRpc2NvdmVyaW5nIGFueSBuZXcgd2FrZSBHUEVzIGJ5IHJ1bm5pbmcgX1BSVyBtZXRob2RzCi0JICogdGhhdCBtYXkgaGF2ZSBiZWVuIGxvYWRlZCBieSB0aGlzIHRhYmxlLgotCSAqLwotCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X293bmVyX2lkKHRhYmxlX2luZGV4LCAmb3duZXJfaWQpOwotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQlhY3BpX2V2X3VwZGF0ZV9ncGVzKG93bmVyX2lkKTsKLQl9Ci0KKwkqZGRiX2hhbmRsZSA9IG9ial9kZXNjOwogCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKQEAgLTE1OSwxNiArMTIyLDE3IEBACiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnN0YXJ0X25vZGU7CiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmFtZXRlcl9ub2RlID0gTlVMTDsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpkZGJfaGFuZGxlOwotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGU7CiAJdTMyIHRhYmxlX2luZGV4OwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRShleF9sb2FkX3RhYmxlX29wKTsKIAogCS8qIEZpbmQgdGhlIEFDUEkgdGFibGUgaW4gdGhlIFJTRFQvWFNEVCAqLwogCisJYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7CiAJc3RhdHVzID0gYWNwaV90Yl9maW5kX3RhYmxlKG9wZXJhbmRbMF0tPnN0cmluZy5wb2ludGVyLAogCQkJCSAgICBvcGVyYW5kWzFdLT5zdHJpbmcucG9pbnRlciwKIAkJCQkgICAgb3BlcmFuZFsyXS0+c3RyaW5nLnBvaW50ZXIsICZ0YWJsZV9pbmRleCk7CisJYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcigpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlpZiAoc3RhdHVzICE9IEFFX05PVF9GT1VORCkgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CkBAIC0xOTcsOSArMTYxLDEwIEBACiAJCSAqIEZpbmQgdGhlIG5vZGUgcmVmZXJlbmNlZCBieSB0aGUgcm9vdF9wYXRoX3N0cmluZy4gVGhpcyBpcyB0aGUKIAkJICogbG9jYXRpb24gd2l0aGluIHRoZSBuYW1lc3BhY2Ugd2hlcmUgdGhlIHRhYmxlIHdpbGwgYmUgbG9hZGVkLgogCQkgKi8KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfbnNfZ2V0X25vZGUoc3RhcnRfbm9kZSwgb3BlcmFuZFszXS0+c3RyaW5nLnBvaW50ZXIsCi0JCQkJICAgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsICZwYXJlbnRfbm9kZSk7CisJCXN0YXR1cyA9IGFjcGlfbnNfZ2V0X25vZGVfdW5sb2NrZWQoc3RhcnRfbm9kZSwKKwkJCQkJCSAgIG9wZXJhbmRbM10tPnN0cmluZy5wb2ludGVyLAorCQkJCQkJICAgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAorCQkJCQkJICAgJnBhcmVudF9ub2RlKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQpAQCAtMjE5LDkgKzE4NCwxMCBAQAogCiAJCS8qIEZpbmQgdGhlIG5vZGUgcmVmZXJlbmNlZCBieSB0aGUgcGFyYW1ldGVyX3BhdGhfc3RyaW5nICovCiAKLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfbnNfZ2V0X25vZGUoc3RhcnRfbm9kZSwgb3BlcmFuZFs0XS0+c3RyaW5nLnBvaW50ZXIsCi0JCQkJICAgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsICZwYXJhbWV0ZXJfbm9kZSk7CisJCXN0YXR1cyA9IGFjcGlfbnNfZ2V0X25vZGVfdW5sb2NrZWQoc3RhcnRfbm9kZSwKKwkJCQkJCSAgIG9wZXJhbmRbNF0tPnN0cmluZy5wb2ludGVyLAorCQkJCQkJICAgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAorCQkJCQkJICAgJnBhcmFtZXRlcl9ub2RlKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQpAQCAtMjI5LDcgKzE5NSwxNSBAQAogCiAJLyogTG9hZCB0aGUgdGFibGUgaW50byB0aGUgbmFtZXNwYWNlICovCiAKLQlzdGF0dXMgPSBhY3BpX2V4X2FkZF90YWJsZSh0YWJsZV9pbmRleCwgcGFyZW50X25vZGUsICZkZGJfaGFuZGxlKTsKKwlBQ1BJX0lORk8oKCJEeW5hbWljIE9FTSBUYWJsZSBMb2FkOiIpKTsKKwlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIoKTsKKwlzdGF0dXMgPSBhY3BpX3RiX2xvYWRfdGFibGUodGFibGVfaW5kZXgsIHBhcmVudF9ub2RlKTsKKwlhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCXN0YXR1cyA9IGFjcGlfZXhfYWRkX3RhYmxlKHRhYmxlX2luZGV4LCAmZGRiX2hhbmRsZSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KQEAgLTI1MiwxOSArMjI2LDYgQEAKIAkJfQogCX0KIAotCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlX2J5X2luZGV4KHRhYmxlX2luZGV4LCAmdGFibGUpOwotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQlBQ1BJX0lORk8oKCJEeW5hbWljIE9FTSBUYWJsZSBMb2FkOiIpKTsKLQkJYWNwaV90Yl9wcmludF90YWJsZV9oZWFkZXIoMCwgdGFibGUpOwotCX0KLQotCS8qIEludm9rZSB0YWJsZSBoYW5kbGVyIGlmIHByZXNlbnQgKi8KLQotCWlmIChhY3BpX2dibF90YWJsZV9oYW5kbGVyKSB7Ci0JCSh2b2lkKWFjcGlfZ2JsX3RhYmxlX2hhbmRsZXIoQUNQSV9UQUJMRV9FVkVOVF9MT0FELCB0YWJsZSwKLQkJCQkJICAgICBhY3BpX2dibF90YWJsZV9oYW5kbGVyX2NvbnRleHQpOwotCX0KLQogCSpyZXR1cm5fZGVzYyA9IGRkYl9oYW5kbGU7CiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CkBAIC00NzUsMTMgKzQzNiwxMiBAQAogCS8qIEluc3RhbGwgdGhlIG5ldyB0YWJsZSBpbnRvIHRoZSBsb2NhbCBkYXRhIHN0cnVjdHVyZXMgKi8KIAogCUFDUElfSU5GTygoIkR5bmFtaWMgT0VNIFRhYmxlIExvYWQ6IikpOwotCSh2b2lkKWFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwotCi0Jc3RhdHVzID0gYWNwaV90Yl9pbnN0YWxsX3N0YW5kYXJkX3RhYmxlKEFDUElfUFRSX1RPX1BIWVNBRERSKHRhYmxlKSwKLQkJCQkJCUFDUElfVEFCTEVfT1JJR0lOX0lOVEVSTkFMX1ZJUlRVQUwsCi0JCQkJCQlUUlVFLCBUUlVFLCAmdGFibGVfaW5kZXgpOwotCi0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CisJYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7CisJc3RhdHVzID0KKwkgICAgYWNwaV90Yl9pbnN0YWxsX2FuZF9sb2FkX3RhYmxlKHRhYmxlLCBBQ1BJX1BUUl9UT19QSFlTQUREUih0YWJsZSksCisJCQkJCSAgIEFDUElfVEFCTEVfT1JJR0lOX0lOVEVSTkFMX1ZJUlRVQUwsCisJCQkJCSAgIFRSVUUsICZ0YWJsZV9pbmRleCk7CisJYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcigpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCiAJCS8qIERlbGV0ZSBhbGxvY2F0ZWQgdGFibGUgYnVmZmVyICovCkBAIC00OTEsMjUgKzQ1MSwxMyBAQAogCX0KIAogCS8qCi0JICogTm90ZTogTm93IHRhYmxlIGlzICJJTlNUQUxMRUQiLCBpdCBtdXN0IGJlIHZhbGlkYXRlZCBiZWZvcmUKLQkgKiBsb2FkaW5nLgotCSAqLwotCXN0YXR1cyA9Ci0JICAgIGFjcGlfdGJfdmFsaWRhdGVfdGFibGUoJmFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC4KLQkJCQkgICB0YWJsZXNbdGFibGVfaW5kZXhdKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyoKIAkgKiBBZGQgdGhlIHRhYmxlIHRvIHRoZSBuYW1lc3BhY2UuCiAJICoKIAkgKiBOb3RlOiBMb2FkIHRoZSB0YWJsZSBvYmplY3RzIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBuYW1lc3BhY2UuCiAJICogVGhpcyBhcHBlYXJzIHRvIGdvIGFnYWluc3QgdGhlIEFDUEkgc3BlY2lmaWNhdGlvbiwgYnV0IHdlIGRvIGl0IGZvcgogCSAqIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBBQ1BJIGltcGxlbWVudGF0aW9ucy4KIAkgKi8KLQlzdGF0dXMgPQotCSAgICBhY3BpX2V4X2FkZF90YWJsZSh0YWJsZV9pbmRleCwgYWNwaV9nYmxfcm9vdF9ub2RlLCAmZGRiX2hhbmRsZSk7CisJc3RhdHVzID0gYWNwaV9leF9hZGRfdGFibGUodGFibGVfaW5kZXgsICZkZGJfaGFuZGxlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAogCQkvKiBPbiBlcnJvciwgdGFibGVfcHRyIHdhcyBkZWFsbG9jYXRlZCBhYm92ZSAqLwpAQCAtNTMyLDE0ICs0ODAsNiBAQAogCS8qIFJlbW92ZSB0aGUgcmVmZXJlbmNlIGJ5IGFkZGVkIGJ5IGFjcGlfZXhfc3RvcmUgYWJvdmUgKi8KIAogCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShkZGJfaGFuZGxlKTsKLQotCS8qIEludm9rZSB0YWJsZSBoYW5kbGVyIGlmIHByZXNlbnQgKi8KLQotCWlmIChhY3BpX2dibF90YWJsZV9oYW5kbGVyKSB7Ci0JCSh2b2lkKWFjcGlfZ2JsX3RhYmxlX2hhbmRsZXIoQUNQSV9UQUJMRV9FVkVOVF9MT0FELCB0YWJsZSwKLQkJCQkJICAgICBhY3BpX2dibF90YWJsZV9oYW5kbGVyX2NvbnRleHQpOwotCX0KLQogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCkBAIC01OTIsMTAgKzUzMiwxNyBAQAogCiAJdGFibGVfaW5kZXggPSB0YWJsZV9kZXNjLT5yZWZlcmVuY2UudmFsdWU7CiAKKwkvKgorCSAqIFJlbGVhc2UgdGhlIGludGVycHJldGVyIGxvY2sgc28gdGhhdCB0aGUgdGFibGUgbG9jayB3b24ndCBoYXZlCisJICogc3RyaWN0IG9yZGVyIHJlcXVpcmVtZW50IGFnYWluc3QgaXQuCisJICovCisJYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7CisKIAkvKiBFbnN1cmUgdGhlIHRhYmxlIGlzIHN0aWxsIGxvYWRlZCAqLwogCiAJaWYgKCFhY3BpX3RiX2lzX3RhYmxlX2xvYWRlZCh0YWJsZV9pbmRleCkpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9FWElTVCk7CisJCXN0YXR1cyA9IEFFX05PVF9FWElTVDsKKwkJZ290byBsb2NrX2FuZF9leGl0OwogCX0KIAogCS8qIEludm9rZSB0YWJsZSBoYW5kbGVyIGlmIHByZXNlbnQgKi8KQEAgLTYxMywxNiArNTYwLDI0IEBACiAKIAlzdGF0dXMgPSBhY3BpX3RiX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIodGFibGVfaW5kZXgpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJZ290byBsb2NrX2FuZF9leGl0OwogCX0KIAogCSh2b2lkKWFjcGlfdGJfcmVsZWFzZV9vd25lcl9pZCh0YWJsZV9pbmRleCk7CiAJYWNwaV90Yl9zZXRfdGFibGVfbG9hZGVkX2ZsYWcodGFibGVfaW5kZXgsIEZBTFNFKTsKIAorbG9ja19hbmRfZXhpdDoKKworCS8qIFJlLWFjcXVpcmUgdGhlIGludGVycHJldGVyIGxvY2sgKi8KKworCWFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKKwogCS8qCiAJICogSW52YWxpZGF0ZSB0aGUgaGFuZGxlLiBXZSBkbyB0aGlzIGJlY2F1c2UgdGhlIGhhbmRsZSBtYXkgYmUgc3RvcmVkCiAJICogaW4gYSBuYW1lZCBvYmplY3QgYW5kIG1heSBub3QgYmUgYWN0dWFsbHkgZGVsZXRlZCB1bnRpbCBtdWNoIGxhdGVyLgogCSAqLwotCWRkYl9oYW5kbGUtPmNvbW1vbi5mbGFncyAmPSB+QU9QT0JKX0RBVEFfVkFMSUQ7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJZGRiX2hhbmRsZS0+Y29tbW9uLmZsYWdzICY9IH5BT1BPQkpfREFUQV9WQUxJRDsKKwl9CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4Y29udnJ0LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4Y29udnJ0LmMKaW5kZXggYjdlOWIzZC4uNTg4YWQxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9leGNvbnZydC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhjb252cnQuYwpAQCAtMTI0LDkgKzEyNCw5IEBACiAJCSAqIG9mIEFDUEkgMy4wKSBpcyB0aGF0IHRoZSB0b19pbnRlZ2VyKCkgb3BlcmF0b3IgYWxsb3dzIGJvdGggZGVjaW1hbAogCQkgKiBhbmQgaGV4YWRlY2ltYWwgc3RyaW5ncyAoaGV4IHByZWZpeGVkIHdpdGggIjB4IikuCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX3V0X3N0cnRvdWw2NCgoY2hhciAqKXBvaW50ZXIsIGZsYWdzLAotCQkJCQkgICBhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGgsCi0JCQkJCSAgICZyZXN1bHQpOworCQlzdGF0dXMgPSBhY3BpX3V0X3N0cnRvdWw2NChBQ1BJX0NBU1RfUFRSKGNoYXIsIHBvaW50ZXIpLAorCQkJCQkgICAoYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoIHwKKwkJCQkJICAgIGZsYWdzKSwgJnJlc3VsdCk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCX0KQEAgLTYzMiw3ICs2MzIsNyBAQAogCQkJICovCiAJCQlzdGF0dXMgPQogCQkJICAgIGFjcGlfZXhfY29udmVydF90b19pbnRlZ2VyKHNvdXJjZV9kZXNjLCByZXN1bHRfZGVzYywKLQkJCQkJCSAgICAgICAxNik7CisJCQkJCQkgICAgICAgQUNQSV9TVFJUT1VMX0JBU0UxNik7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfVFlQRV9TVFJJTkc6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4bWlzYy5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leG1pc2MuYwppbmRleCA0ZjdlNjY3Li4zN2M4OGI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4bWlzYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhtaXNjLmMKQEAgLTMyNyw4ICszMjcsOCBAQAogCXN3aXRjaCAob3BlcmFuZDAtPmNvbW1vbi50eXBlKSB7CiAJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKIAotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIob3BlcmFuZDEsICZsb2NhbF9vcGVyYW5kMSwgMTYpOworCQlzdGF0dXMgPSBhY3BpX2V4X2NvbnZlcnRfdG9faW50ZWdlcihvcGVyYW5kMSwgJmxvY2FsX29wZXJhbmQxLAorCQkJCQkJICAgIEFDUElfU1RSVE9VTF9CQVNFMTYpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhvcGFyZzEuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhvcGFyZzEuYwppbmRleCA0ZTE3NTA2Li4wMDczMDA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4b3BhcmcxLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leG9wYXJnMS5jCkBAIC01MjEsOSArNTIxLDEwIEBACiAKIAljYXNlIEFNTF9UT19JTlRFR0VSX09QOgkvKiB0b19pbnRlZ2VyIChEYXRhLCBSZXN1bHQpICovCiAKKwkJLyogUGVyZm9ybSAiZXhwbGljaXQiIGNvbnZlcnNpb24gKi8KKwogCQlzdGF0dXMgPQotCQkgICAgYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIob3BlcmFuZFswXSwgJnJldHVybl9kZXNjLAotCQkJCQkgICAgICAgQUNQSV9BTllfQkFTRSk7CisJCSAgICBhY3BpX2V4X2NvbnZlcnRfdG9faW50ZWdlcihvcGVyYW5kWzBdLCAmcmV0dXJuX2Rlc2MsIDApOwogCQlpZiAocmV0dXJuX2Rlc2MgPT0gb3BlcmFuZFswXSkgewogCiAJCQkvKiBObyBjb252ZXJzaW9uIHBlcmZvcm1lZCwgYWRkIHJlZiB0byBoYW5kbGUgcmV0dXJuIHZhbHVlICovCkBAIC04OTAsMTQgKzg5MSwxNiBAQAogCQkJCSAqICAgIEZpZWxkLCBzbyB3ZSBuZWVkIHRvIHJlc29sdmUgdGhlIG5vZGUgdG8gYSB2YWx1ZS4KIAkJCQkgKi8KIAkJCQlzdGF0dXMgPQotCQkJCSAgICBhY3BpX25zX2dldF9ub2RlKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8tPgotCQkJCQkJICAgICBzY29wZS5ub2RlLAotCQkJCQkJICAgICBvcGVyYW5kWzBdLT5zdHJpbmcucG9pbnRlciwKLQkJCQkJCSAgICAgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAotCQkJCQkJICAgICBBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSCi0JCQkJCQkgICAgIChzdHJ1Y3QKLQkJCQkJCSAgICAgIGFjcGlfbmFtZXNwYWNlX25vZGUsCi0JCQkJCQkgICAgICAmcmV0dXJuX2Rlc2MpKTsKKwkJCQkgICAgYWNwaV9uc19nZXRfbm9kZV91bmxvY2tlZCh3YWxrX3N0YXRlLT4KKwkJCQkJCQkgICAgICBzY29wZV9pbmZvLT5zY29wZS4KKwkJCQkJCQkgICAgICBub2RlLAorCQkJCQkJCSAgICAgIG9wZXJhbmRbMF0tPgorCQkJCQkJCSAgICAgIHN0cmluZy5wb2ludGVyLAorCQkJCQkJCSAgICAgIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwKKwkJCQkJCQkgICAgICBBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSCisJCQkJCQkJICAgICAgKHN0cnVjdAorCQkJCQkJCSAgICAgICBhY3BpX25hbWVzcGFjZV9ub2RlLAorCQkJCQkJCSAgICAgICAmcmV0dXJuX2Rlc2MpKTsKIAkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQkJZ290byBjbGVhbnVwOwogCQkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXhyZXNvcC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leHJlc29wLmMKaW5kZXggMjdiNDFmZC4uZjI5ZWJhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9leHJlc29wLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leHJlc29wLmMKQEAgLTQxMCwxMiArNDEwLDEzIEBACiAJCWNhc2UgQVJHSV9JTlRFR0VSOgogCiAJCQkvKgotCQkJICogTmVlZCBhbiBvcGVyYW5kIG9mIHR5cGUgQUNQSV9UWVBFX0lOVEVHRVIsCi0JCQkgKiBCdXQgd2UgY2FuIGltcGxpY2l0bHkgY29udmVydCBmcm9tIGEgU1RSSU5HIG9yIEJVRkZFUgotCQkJICogYWthIC0gIkltcGxpY2l0IFNvdXJjZSBPcGVyYW5kIENvbnZlcnNpb24iCisJCQkgKiBOZWVkIGFuIG9wZXJhbmQgb2YgdHlwZSBBQ1BJX1RZUEVfSU5URUdFUiwgYnV0IHdlIGNhbgorCQkJICogaW1wbGljaXRseSBjb252ZXJ0IGZyb20gYSBTVFJJTkcgb3IgQlVGRkVSLgorCQkJICoKKwkJCSAqIEtub3duIGFzICJJbXBsaWNpdCBTb3VyY2UgT3BlcmFuZCBDb252ZXJzaW9uIgogCQkJICovCi0JCQlzdGF0dXMgPQotCQkJICAgIGFjcGlfZXhfY29udmVydF90b19pbnRlZ2VyKG9ial9kZXNjLCBzdGFja19wdHIsIDE2KTsKKwkJCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19pbnRlZ2VyKG9ial9kZXNjLCBzdGFja19wdHIsCisJCQkJCQkJICAgIEFDUElfU1RSVE9VTF9CQVNFMTYpOwogCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJaWYgKHN0YXR1cyA9PSBBRV9UWVBFKSB7CiAJCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2V4dHJhY2UuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXh0cmFjZS5jCmluZGV4IGI1MmU4NDguLmM5Y2E4MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXh0cmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXh0cmFjZS5jCkBAIC0yMDEsNyArMjAxLDYgQEAKIAkJCSAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAogCQkJICAgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJY2hhciAqcGF0aG5hbWUgPSBOVUxMOwogCXU4IGVuYWJsZWQgPSBGQUxTRTsKIApAQCAtMjExLDExICsyMTAsNiBAQAogCQlwYXRobmFtZSA9IGFjcGlfbnNfZ2V0X25vcm1hbGl6ZWRfcGF0aG5hbWUobWV0aG9kX25vZGUsIFRSVUUpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIGV4aXQ7Ci0JfQotCiAJZW5hYmxlZCA9IGFjcGlfZXhfaW50ZXJwcmV0ZXJfdHJhY2VfZW5hYmxlZChwYXRobmFtZSk7CiAJaWYgKGVuYWJsZWQgJiYgIWFjcGlfZ2JsX3RyYWNlX21ldGhvZF9vYmplY3QpIHsKIAkJYWNwaV9nYmxfdHJhY2VfbWV0aG9kX29iamVjdCA9IG9ial9kZXNjOwpAQCAtMjMzLDkgKzIyNyw2IEBACiAJCX0KIAl9CiAKLQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQotZXhpdDoKIAlpZiAoZW5hYmxlZCkgewogCQlBQ1BJX1RSQUNFX1BPSU5UKEFDUElfVFJBQ0VfQU1MX01FVEhPRCwgVFJVRSwKIAkJCQkgb2JqX2Rlc2MgPyBvYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydCA6IE5VTEwsCkBAIC0yNjcsNyArMjU4LDYgQEAKIAkJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCiAJCQkgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwogCWNoYXIgKnBhdGhuYW1lID0gTlVMTDsKIAl1OCBlbmFibGVkOwogCkBAIC0yNzcsMjYgKzI2NywxNCBAQAogCQlwYXRobmFtZSA9IGFjcGlfbnNfZ2V0X25vcm1hbGl6ZWRfcGF0aG5hbWUobWV0aG9kX25vZGUsIFRSVUUpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIGV4aXRfcGF0aDsKLQl9Ci0KIAllbmFibGVkID0gYWNwaV9leF9pbnRlcnByZXRlcl90cmFjZV9lbmFibGVkKE5VTEwpOwogCi0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0KIAlpZiAoZW5hYmxlZCkgewogCQlBQ1BJX1RSQUNFX1BPSU5UKEFDUElfVFJBQ0VfQU1MX01FVEhPRCwgRkFMU0UsCiAJCQkJIG9ial9kZXNjID8gb2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQgOiBOVUxMLAogCQkJCSBwYXRobmFtZSk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWdvdG8gZXhpdF9wYXRoOwotCX0KLQogCS8qIENoZWNrIHdoZXRoZXIgdGhlIHRyYWNlciBzaG91bGQgYmUgc3RvcHBlZCAqLwogCiAJaWYgKGFjcGlfZ2JsX3RyYWNlX21ldGhvZF9vYmplY3QgPT0gb2JqX2Rlc2MpIHsKQEAgLTMxMiw5ICsyOTAsNiBAQAogCQlhY3BpX2dibF90cmFjZV9tZXRob2Rfb2JqZWN0ID0gTlVMTDsKIAl9CiAKLQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQotZXhpdF9wYXRoOgogCWlmIChwYXRobmFtZSkgewogCQlBQ1BJX0ZSRUUocGF0aG5hbWUpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvZXh1dGlscy5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leHV0aWxzLmMKaW5kZXggNDI1ZjEzMy4uYThiODU3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9leHV0aWxzLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9leHV0aWxzLmMKQEAgLTk0LDYgKzk0LDEwIEBACiAJCUFDUElfRVJST1IoKEFFX0lORk8sCiAJCQkgICAgIkNvdWxkIG5vdCBhY3F1aXJlIEFNTCBJbnRlcnByZXRlciBtdXRleCIpKTsKIAl9CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sICJDb3VsZCBub3QgYWNxdWlyZSBBTUwgTmFtZXNwYWNlIG11dGV4IikpOworCX0KIAogCXJldHVybl9WT0lEOwogfQpAQCAtMTI3LDYgKzEzMSwxMCBAQAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRShleF9leGl0X2ludGVycHJldGVyKTsKIAorCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiQ291bGQgbm90IHJlbGVhc2UgQU1MIE5hbWVzcGFjZSBtdXRleCIpKTsKKwl9CiAJc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0lOVEVSUFJFVEVSKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJQUNQSV9FUlJPUigoQUVfSU5GTywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHdncGUuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvaHdncGUuYwppbmRleCBiZGVjZDVlLi43NmIwZTM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2h3Z3BlLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9od2dwZS5jCkBAIC05OCw3ICs5OCw3IEBACiBhY3BpX2h3X2xvd19zZXRfZ3BlKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbywgdTMyIGFjdGlvbikKIHsKIAlzdHJ1Y3QgYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbyAqZ3BlX3JlZ2lzdGVyX2luZm87Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCXUzMiBlbmFibGVfbWFzazsKIAl1MzIgcmVnaXN0ZXJfYml0OwogCkBAIC0xNDgsOSArMTQ4LDE0IEBACiAJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0JLyogV3JpdGUgdGhlIHVwZGF0ZWQgZW5hYmxlIG1hc2sgKi8KKwlpZiAoIShyZWdpc3Rlcl9iaXQgJiBncGVfcmVnaXN0ZXJfaW5mby0+bWFza19mb3JfcnVuKSkgewogCi0Jc3RhdHVzID0gYWNwaV9od193cml0ZShlbmFibGVfbWFzaywgJmdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfYWRkcmVzcyk7CisJCS8qIFdyaXRlIHRoZSB1cGRhdGVkIGVuYWJsZSBtYXNrICovCisKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfaHdfd3JpdGUoZW5hYmxlX21hc2ssCisJCQkJICAmZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9hZGRyZXNzKTsKKwl9CiAJcmV0dXJuIChzdGF0dXMpOwogfQogCkBAIC0yNDIsNiArMjQ3LDEyIEBACiAJCWxvY2FsX2V2ZW50X3N0YXR1cyB8PSBBQ1BJX0VWRU5UX0ZMQUdfRU5BQkxFRDsKIAl9CiAKKwkvKiBHUEUgY3VycmVudGx5IG1hc2tlZD8gKG1hc2tlZCBmb3IgcnVudGltZT8pICovCisKKwlpZiAocmVnaXN0ZXJfYml0ICYgZ3BlX3JlZ2lzdGVyX2luZm8tPm1hc2tfZm9yX3J1bikgeworCQlsb2NhbF9ldmVudF9zdGF0dXMgfD0gQUNQSV9FVkVOVF9GTEFHX01BU0tFRDsKKwl9CisKIAkvKiBHUEUgZW5hYmxlZCBmb3Igd2FrZT8gKi8KIAogCWlmIChyZWdpc3Rlcl9iaXQgJiBncGVfcmVnaXN0ZXJfaW5mby0+ZW5hYmxlX2Zvcl93YWtlKSB7CkBAIC0zOTcsNiArNDA4LDcgQEAKIAl1MzIgaTsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IGFjcGlfZ3BlX3JlZ2lzdGVyX2luZm8gKmdwZV9yZWdpc3Rlcl9pbmZvOworCXU4IGVuYWJsZV9tYXNrOwogCiAJLyogTk9URTogYXNzdW1lcyB0aGF0IGFsbCBHUEVzIGFyZSBjdXJyZW50bHkgZGlzYWJsZWQgKi8KIApAQCAtNDEwLDkgKzQyMiwxMCBAQAogCiAJCS8qIEVuYWJsZSBhbGwgInJ1bnRpbWUiIEdQRXMgaW4gdGhpcyByZWdpc3RlciAqLwogCisJCWVuYWJsZV9tYXNrID0gZ3BlX3JlZ2lzdGVyX2luZm8tPmVuYWJsZV9mb3JfcnVuICYKKwkJICAgIH5ncGVfcmVnaXN0ZXJfaW5mby0+bWFza19mb3JfcnVuOwogCQlzdGF0dXMgPQotCQkgICAgYWNwaV9od19ncGVfZW5hYmxlX3dyaXRlKGdwZV9yZWdpc3Rlcl9pbmZvLT5lbmFibGVfZm9yX3J1biwKLQkJCQkJICAgICBncGVfcmVnaXN0ZXJfaW5mbyk7CisJCSAgICBhY3BpX2h3X2dwZV9lbmFibGVfd3JpdGUoZW5hYmxlX21hc2ssIGdwZV9yZWdpc3Rlcl9pbmZvKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlyZXR1cm4gKHN0YXR1cyk7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNhY2Nlc3MuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNhY2Nlc3MuYwppbmRleCA0MjZhNjMwLi43M2Y5OGQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zYWNjZXNzLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc2FjY2Vzcy5jCkBAIC0xMDgsOSArMTA4LDkgQEAKIAkJfQogCiAJCXN0YXR1cyA9Ci0JCSAgICBhY3BpX25zX2xvb2t1cChOVUxMLCAoY2hhciAqKWluaXRfdmFsLT5uYW1lLCBpbml0X3ZhbC0+dHlwZSwKLQkJCQkgICBBQ1BJX0lNT0RFX0xPQURfUEFTUzIsIEFDUElfTlNfTk9fVVBTRUFSQ0gsCi0JCQkJICAgTlVMTCwgJm5ld19ub2RlKTsKKwkJICAgIGFjcGlfbnNfbG9va3VwKE5VTEwsIEFDUElfQ0FTVF9QVFIoY2hhciwgaW5pdF92YWwtPm5hbWUpLAorCQkJCSAgIGluaXRfdmFsLT50eXBlLCBBQ1BJX0lNT0RFX0xPQURfUEFTUzIsCisJCQkJICAgQUNQSV9OU19OT19VUFNFQVJDSCwgTlVMTCwgJm5ld19ub2RlKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAogCQkJCQkiQ291bGQgbm90IGNyZWF0ZSBwcmVkZWZpbmVkIG5hbWUgJXMiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc2NvbnZlcnQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNjb252ZXJ0LmMKaW5kZXggYzgwM2JkYS4uMmI4NWRlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc2NvbnZlcnQuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zY29udmVydC5jCkBAIC03OSw3ICs3OSw2IEBACiAJCS8qIFN0cmluZy10by1JbnRlZ2VyIGNvbnZlcnNpb24gKi8KIAogCQlzdGF0dXMgPSBhY3BpX3V0X3N0cnRvdWw2NChvcmlnaW5hbF9vYmplY3QtPnN0cmluZy5wb2ludGVyLAotCQkJCQkgICBBQ1BJX0FOWV9CQVNFLAogCQkJCQkgICBhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGgsICZ2YWx1ZSk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJcmV0dXJuIChzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc2R1bXAuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNkdW1wLmMKaW5kZXggY2UxZjg2MC4uODRmMzVkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc2R1bXAuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zZHVtcC5jCkBAIC0zMzgsNyArMzM4LDcgQEAKIAkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgogCiAJCQlhY3BpX29zX3ByaW50ZigiTGVuICUuMlggIiwgb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGgpOwotCQkJYWNwaV91dF9wcmludF9zdHJpbmcob2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyLCAzMik7CisJCQlhY3BpX3V0X3ByaW50X3N0cmluZyhvYmpfZGVzYy0+c3RyaW5nLnBvaW50ZXIsIDgwKTsKIAkJCWFjcGlfb3NfcHJpbnRmKCJcbiIpOwogCQkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNsb2FkLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zbG9hZC5jCmluZGV4IGI1ZTJiMGEuLjMzNGQzYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNsb2FkLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc2xvYWQuYwpAQCAtNDYsNiArNDYsNyBAQAogI2luY2x1ZGUgImFjbmFtZXNwLmgiCiAjaW5jbHVkZSAiYWNkaXNwYXQuaCIKICNpbmNsdWRlICJhY3RhYmxlcy5oIgorI2luY2x1ZGUgImFjaW50ZXJwLmgiCiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQogQUNQSV9NT0RVTEVfTkFNRSgibnNsb2FkIikKQEAgLTc4LDIwICs3OSw2IEBACiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX2xvYWRfdGFibGUpOwogCi0JLyoKLQkgKiBQYXJzZSB0aGUgdGFibGUgYW5kIGxvYWQgdGhlIG5hbWVzcGFjZSB3aXRoIGFsbCBuYW1lZAotCSAqIG9iamVjdHMgZm91bmQgd2l0aGluLiBDb250cm9sIG1ldGhvZHMgYXJlIE5PVCBwYXJzZWQKLQkgKiBhdCB0aGlzIHRpbWUuIEluIGZhY3QsIHRoZSBjb250cm9sIG1ldGhvZHMgY2Fubm90IGJlCi0JICogcGFyc2VkIHVudGlsIHRoZSBlbnRpcmUgbmFtZXNwYWNlIGlzIGxvYWRlZCwgYmVjYXVzZQotCSAqIGlmIGEgY29udHJvbCBtZXRob2QgbWFrZXMgYSBmb3J3YXJkIHJlZmVyZW5jZSAoY2FsbCkKLQkgKiB0byBhbm90aGVyIGNvbnRyb2wgbWV0aG9kLCB3ZSBjYW4ndCBjb250aW51ZSBwYXJzaW5nCi0JICogYmVjYXVzZSB3ZSBkb24ndCBrbm93IGhvdyBtYW55IGFyZ3VtZW50cyB0byBwYXJzZSBuZXh0IQotCSAqLwotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KIAkvKiBJZiB0YWJsZSBhbHJlYWR5IGxvYWRlZCBpbnRvIG5hbWVzcGFjZSwganVzdCByZXR1cm4gKi8KIAogCWlmIChhY3BpX3RiX2lzX3RhYmxlX2xvYWRlZCh0YWJsZV9pbmRleCkpIHsKQEAgLTEwNyw2ICs5NCwxNSBAQAogCQlnb3RvIHVubG9jazsKIAl9CiAKKwkvKgorCSAqIFBhcnNlIHRoZSB0YWJsZSBhbmQgbG9hZCB0aGUgbmFtZXNwYWNlIHdpdGggYWxsIG5hbWVkCisJICogb2JqZWN0cyBmb3VuZCB3aXRoaW4uIENvbnRyb2wgbWV0aG9kcyBhcmUgTk9UIHBhcnNlZAorCSAqIGF0IHRoaXMgdGltZS4gSW4gZmFjdCwgdGhlIGNvbnRyb2wgbWV0aG9kcyBjYW5ub3QgYmUKKwkgKiBwYXJzZWQgdW50aWwgdGhlIGVudGlyZSBuYW1lc3BhY2UgaXMgbG9hZGVkLCBiZWNhdXNlCisJICogaWYgYSBjb250cm9sIG1ldGhvZCBtYWtlcyBhIGZvcndhcmQgcmVmZXJlbmNlIChjYWxsKQorCSAqIHRvIGFub3RoZXIgY29udHJvbCBtZXRob2QsIHdlIGNhbid0IGNvbnRpbnVlIHBhcnNpbmcKKwkgKiBiZWNhdXNlIHdlIGRvbid0IGtub3cgaG93IG1hbnkgYXJndW1lbnRzIHRvIHBhcnNlIG5leHQhCisJICovCiAJc3RhdHVzID0gYWNwaV9uc19wYXJzZV90YWJsZSh0YWJsZV9pbmRleCwgbm9kZSk7CiAJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCWFjcGlfdGJfc2V0X3RhYmxlX2xvYWRlZF9mbGFnKHRhYmxlX2luZGV4LCBUUlVFKTsKQEAgLTEyMCw3ICsxMTYsNiBAQAogCQkgKiBleGlzdC4gVGhpcyB0YXJnZXQgb2YgU2NvcGUgbXVzdCBhbHJlYWR5IGV4aXN0IGluIHRoZQogCQkgKiBuYW1lc3BhY2UsIGFzIHBlciB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uLgogCQkgKi8KLQkJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CiAJCWFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lcihhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuCiAJCQkJCQkgIHRhYmxlc1t0YWJsZV9pbmRleF0ub3duZXJfaWQpOwogCkBAIC0xMjksOCArMTI0LDYgQEAKIAl9CiAKIHVubG9jazoKLQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CkBAIC0xNjIsNyArMTU1LDggQEAKIAkgKiBvdGhlciBBQ1BJIGltcGxlbWVudGF0aW9ucy4gT3B0aW9uYWxseSwgdGhlIGV4ZWN1dGlvbiBjYW4gYmUgZGVmZXJyZWQKIAkgKiB1bnRpbCBsYXRlciwgc2VlIGFjcGlfaW5pdGlhbGl6ZV9vYmplY3RzLgogCSAqLwotCWlmICghYWNwaV9nYmxfZ3JvdXBfbW9kdWxlX2xldmVsX2NvZGUpIHsKKwlpZiAoIWFjcGlfZ2JsX3BhcnNlX3RhYmxlX2FzX3Rlcm1fbGlzdAorCSAgICAmJiAhYWNwaV9nYmxfZ3JvdXBfbW9kdWxlX2xldmVsX2NvZGUpIHsKIAkJYWNwaV9uc19leGVjX21vZHVsZV9jb2RlX2xpc3QoKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNwYXJzZS5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3BhcnNlLmMKaW5kZXggZjYzMWE0Ny4uNGYxNGU5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3BhcnNlLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3BhcnNlLmMKQEAgLTQ3LDEyICs0NywxMDMgQEAKICNpbmNsdWRlICJhY3BhcnNlci5oIgogI2luY2x1ZGUgImFjZGlzcGF0LmgiCiAjaW5jbHVkZSAiYWN0YWJsZXMuaCIKKyNpbmNsdWRlICJhY2ludGVycC5oIgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKIEFDUElfTU9EVUxFX05BTUUoIm5zcGFyc2UiKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKKyAqIEZVTkNUSU9OOiAgICBuc19leGVjdXRlX3RhYmxlCisgKgorICogUEFSQU1FVEVSUzogIHRhYmxlX2Rlc2MgICAgICAtIEFuIEFDUEkgdGFibGUgZGVzY3JpcHRvciBmb3IgdGFibGUgdG8gcGFyc2UKKyAqICAgICAgICAgICAgICBzdGFydF9ub2RlICAgICAgLSBXaGVyZSB0byBlbnRlciB0aGUgdGFibGUgaW50byB0aGUgbmFtZXNwYWNlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBMb2FkIEFDUEkvQU1MIHRhYmxlIGJ5IGV4ZWN1dGluZyB0aGUgZW50aXJlIHRhYmxlIGFzIGEKKyAqICAgICAgICAgICAgICB0ZXJtX2xpc3QuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzCithY3BpX25zX2V4ZWN1dGVfdGFibGUodTMyIHRhYmxlX2luZGV4LCBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqc3RhcnRfbm9kZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZTsKKwlhY3BpX293bmVyX2lkIG93bmVyX2lkOworCXN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8gKmluZm8gPSBOVUxMOworCXUzMiBhbWxfbGVuZ3RoOworCXU4ICphbWxfc3RhcnQ7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbWV0aG9kX29iaiA9IE5VTEw7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX2V4ZWN1dGVfdGFibGUpOworCisJc3RhdHVzID0gYWNwaV9nZXRfdGFibGVfYnlfaW5kZXgodGFibGVfaW5kZXgsICZ0YWJsZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qIFRhYmxlIG11c3QgY29uc2lzdCBvZiBhdCBsZWFzdCBhIGNvbXBsZXRlIGhlYWRlciAqLworCisJaWYgKHRhYmxlLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0hFQURFUik7CisJfQorCisJYW1sX3N0YXJ0ID0gKHU4ICopdGFibGUgKyBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKTsKKwlhbWxfbGVuZ3RoID0gdGFibGUtPmxlbmd0aCAtIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpOworCisJc3RhdHVzID0gYWNwaV90Yl9nZXRfb3duZXJfaWQodGFibGVfaW5kZXgsICZvd25lcl9pZCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCS8qIENyZWF0ZSwgaW5pdGlhbGl6ZSwgYW5kIGxpbmsgYSBuZXcgdGVtcG9yYXJ5IG1ldGhvZCBvYmplY3QgKi8KKworCW1ldGhvZF9vYmogPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX01FVEhPRCk7CisJaWYgKCFtZXRob2Rfb2JqKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCX0KKworCS8qIEFsbG9jYXRlIHRoZSBldmFsdWF0aW9uIGluZm9ybWF0aW9uIGJsb2NrICovCisKKwlpbmZvID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoc2l6ZW9mKHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8pKTsKKwlpZiAoIWluZm8pIHsKKwkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwKKwkJCSAgIkNyZWF0ZSB0YWJsZSBjb2RlIGJsb2NrOiAlcFxuIiwgbWV0aG9kX29iaikpOworCisJbWV0aG9kX29iai0+bWV0aG9kLmFtbF9zdGFydCA9IGFtbF9zdGFydDsKKwltZXRob2Rfb2JqLT5tZXRob2QuYW1sX2xlbmd0aCA9IGFtbF9sZW5ndGg7CisJbWV0aG9kX29iai0+bWV0aG9kLm93bmVyX2lkID0gb3duZXJfaWQ7CisJbWV0aG9kX29iai0+bWV0aG9kLmluZm9fZmxhZ3MgfD0gQUNQSV9NRVRIT0RfTU9EVUxFX0xFVkVMOworCisJaW5mby0+cGFzc19udW1iZXIgPSBBQ1BJX0lNT0RFX0VYRUNVVEU7CisJaW5mby0+bm9kZSA9IHN0YXJ0X25vZGU7CisJaW5mby0+b2JqX2Rlc2MgPSBtZXRob2Rfb2JqOworCWluZm8tPm5vZGVfZmxhZ3MgPSBpbmZvLT5ub2RlLT5mbGFnczsKKwlpbmZvLT5mdWxsX3BhdGhuYW1lID0gYWNwaV9uc19nZXRfbm9ybWFsaXplZF9wYXRobmFtZShpbmZvLT5ub2RlLCBUUlVFKTsKKwlpZiAoIWluZm8tPmZ1bGxfcGF0aG5hbWUpIHsKKwkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJc3RhdHVzID0gYWNwaV9wc19leGVjdXRlX3RhYmxlKGluZm8pOworCitjbGVhbnVwOgorCWlmIChpbmZvKSB7CisJCUFDUElfRlJFRShpbmZvLT5mdWxsX3BhdGhuYW1lKTsKKwkJaW5mby0+ZnVsbF9wYXRobmFtZSA9IE5VTEw7CisJfQorCUFDUElfRlJFRShpbmZvKTsKKwlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UobWV0aG9kX29iaik7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgogICogRlVOQ1RJT046ICAgIG5zX29uZV9jb21wbGV0ZV9wYXJzZQogICoKICAqIFBBUkFNRVRFUlM6ICBwYXNzX251bWJlciAgICAgICAgICAgICAtIDEgb3IgMgpAQCAtNjMsNiArMTU0LDcgQEAKICAqIERFU0NSSVBUSU9OOiBQZXJmb3JtIG9uZSBjb21wbGV0ZSBwYXJzZSBvZiBhbiBBQ1BJL0FNTCB0YWJsZS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBhY3BpX3N0YXR1cwogYWNwaV9uc19vbmVfY29tcGxldGVfcGFyc2UodTMyIHBhc3NfbnVtYmVyLAogCQkJICAgdTMyIHRhYmxlX2luZGV4LApAQCAtMTQzLDcgKzIzNSw5IEBACiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAogCQkJICAiKlBBUlNFKiBwYXNzICV1IHBhcnNlXG4iLCBwYXNzX251bWJlcikpOworCWFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKIAlzdGF0dXMgPSBhY3BpX3BzX3BhcnNlX2FtbCh3YWxrX3N0YXRlKTsKKwlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIoKTsKIAogY2xlYW51cDoKIAlhY3BpX3BzX2RlbGV0ZV9wYXJzZV90cmVlKHBhcnNlX3Jvb3QpOwpAQCAtMTcwLDM4ICsyNjQsNDcgQEAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfcGFyc2VfdGFibGUpOwogCi0JLyoKLQkgKiBBTUwgUGFyc2UsIHBhc3MgMQotCSAqCi0JICogSW4gdGhpcyBwYXNzLCB3ZSBsb2FkIG1vc3Qgb2YgdGhlIG5hbWVzcGFjZS4gQ29udHJvbCBtZXRob2RzCi0JICogYXJlIG5vdCBwYXJzZWQgdW50aWwgbGF0ZXIuIEEgcGFyc2UgdHJlZSBpcyBub3QgY3JlYXRlZC4gSW5zdGVhZCwKLQkgKiBlYWNoIFBhcnNlciBPcCBzdWJ0cmVlIGlzIGRlbGV0ZWQgd2hlbiBpdCBpcyBmaW5pc2hlZC4gVGhpcyBzYXZlcwotCSAqIGEgZ3JlYXQgZGVhbCBvZiBtZW1vcnksIGFuZCBhbGxvd3MgYSBzbWFsbCBjYWNoZSBvZiBwYXJzZSBvYmplY3RzCi0JICogdG8gc2VydmljZSB0aGUgZW50aXJlIHBhcnNlLiBUaGUgc2Vjb25kIHBhc3Mgb2YgdGhlIHBhcnNlIHRoZW4KLQkgKiBwZXJmb3JtcyBhbm90aGVyIGNvbXBsZXRlIHBhcnNlIG9mIHRoZSBBTUwuCi0JICovCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwgIioqKiogU3RhcnQgcGFzcyAxXG4iKSk7CisJaWYgKGFjcGlfZ2JsX3BhcnNlX3RhYmxlX2FzX3Rlcm1fbGlzdCkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLCAiKioqKiBTdGFydCBsb2FkIHBhc3NcbiIpKTsKIAotCXN0YXR1cyA9IGFjcGlfbnNfb25lX2NvbXBsZXRlX3BhcnNlKEFDUElfSU1PREVfTE9BRF9QQVNTMSwKLQkJCQkJICAgIHRhYmxlX2luZGV4LCBzdGFydF9ub2RlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQorCQlzdGF0dXMgPSBhY3BpX25zX2V4ZWN1dGVfdGFibGUodGFibGVfaW5kZXgsIHN0YXJ0X25vZGUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQU1MIFBhcnNlLCBwYXNzIDEKKwkJICoKKwkJICogSW4gdGhpcyBwYXNzLCB3ZSBsb2FkIG1vc3Qgb2YgdGhlIG5hbWVzcGFjZS4gQ29udHJvbCBtZXRob2RzCisJCSAqIGFyZSBub3QgcGFyc2VkIHVudGlsIGxhdGVyLiBBIHBhcnNlIHRyZWUgaXMgbm90IGNyZWF0ZWQuCisJCSAqIEluc3RlYWQsIGVhY2ggUGFyc2VyIE9wIHN1YnRyZWUgaXMgZGVsZXRlZCB3aGVuIGl0IGlzIGZpbmlzaGVkLgorCQkgKiBUaGlzIHNhdmVzIGEgZ3JlYXQgZGVhbCBvZiBtZW1vcnksIGFuZCBhbGxvd3MgYSBzbWFsbCBjYWNoZSBvZgorCQkgKiBwYXJzZSBvYmplY3RzIHRvIHNlcnZpY2UgdGhlIGVudGlyZSBwYXJzZS4gVGhlIHNlY29uZCBwYXNzIG9mCisJCSAqIHRoZSBwYXJzZSB0aGVuIHBlcmZvcm1zIGFub3RoZXIgY29tcGxldGUgcGFyc2Ugb2YgdGhlIEFNTC4KKwkJICovCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsICIqKioqIFN0YXJ0IHBhc3MgMVxuIikpOwogCi0JLyoKLQkgKiBBTUwgUGFyc2UsIHBhc3MgMgotCSAqCi0JICogSW4gdGhpcyBwYXNzLCB3ZSByZXNvbHZlIGZvcndhcmQgcmVmZXJlbmNlcyBhbmQgb3RoZXIgdGhpbmdzCi0JICogdGhhdCBjb3VsZCBub3QgYmUgY29tcGxldGVkIGR1cmluZyB0aGUgZmlyc3QgcGFzcy4KLQkgKiBBbm90aGVyIGNvbXBsZXRlIHBhcnNlIG9mIHRoZSBBTUwgaXMgcGVyZm9ybWVkLCBidXQgdGhlCi0JICogb3ZlcmhlYWQgb2YgdGhpcyBpcyBjb21wZW5zYXRlZCBmb3IgYnkgdGhlIGZhY3QgdGhhdCB0aGUKLQkgKiBwYXJzZSBvYmplY3RzIGFyZSBhbGwgY2FjaGVkLgotCSAqLwotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsICIqKioqIFN0YXJ0IHBhc3MgMlxuIikpOwotCXN0YXR1cyA9IGFjcGlfbnNfb25lX2NvbXBsZXRlX3BhcnNlKEFDUElfSU1PREVfTE9BRF9QQVNTMiwKLQkJCQkJICAgIHRhYmxlX2luZGV4LCBzdGFydF9ub2RlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCXN0YXR1cyA9IGFjcGlfbnNfb25lX2NvbXBsZXRlX3BhcnNlKEFDUElfSU1PREVfTE9BRF9QQVNTMSwKKwkJCQkJCSAgICB0YWJsZV9pbmRleCwgc3RhcnRfbm9kZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KKworCQkvKgorCQkgKiBBTUwgUGFyc2UsIHBhc3MgMgorCQkgKgorCQkgKiBJbiB0aGlzIHBhc3MsIHdlIHJlc29sdmUgZm9yd2FyZCByZWZlcmVuY2VzIGFuZCBvdGhlciB0aGluZ3MKKwkJICogdGhhdCBjb3VsZCBub3QgYmUgY29tcGxldGVkIGR1cmluZyB0aGUgZmlyc3QgcGFzcy4KKwkJICogQW5vdGhlciBjb21wbGV0ZSBwYXJzZSBvZiB0aGUgQU1MIGlzIHBlcmZvcm1lZCwgYnV0IHRoZQorCQkgKiBvdmVyaGVhZCBvZiB0aGlzIGlzIGNvbXBlbnNhdGVkIGZvciBieSB0aGUgZmFjdCB0aGF0IHRoZQorCQkgKiBwYXJzZSBvYmplY3RzIGFyZSBhbGwgY2FjaGVkLgorCQkgKi8KKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwgIioqKiogU3RhcnQgcGFzcyAyXG4iKSk7CisJCXN0YXR1cyA9IGFjcGlfbnNfb25lX2NvbXBsZXRlX3BhcnNlKEFDUElfSU1PREVfTE9BRF9QQVNTMiwKKwkJCQkJCSAgICB0YWJsZV9pbmRleCwgc3RhcnRfbm9kZSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCX0KIAl9CiAKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnN1dGlscy5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3V0aWxzLmMKaW5kZXggNzg0YTMwYi4uNjkxODE0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3V0aWxzLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3V0aWxzLmMKQEAgLTY2Miw3ICs2NjIsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2dldF9ub2RlCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfbm9kZV91bmxvY2tlZAogICoKICAqIFBBUkFNRVRFUlM6ICAqcGF0aG5hbWUgICAtIE5hbWUgdG8gYmUgZm91bmQsIGluIGV4dGVybmFsIChBU0wpIGZvcm1hdC4gVGhlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIChiYWNrc2xhc2gpIGFuZCBeIChjYXJhdCkgcHJlZml4ZXMsIGFuZCB0aGUKQEAgLTY3OCwyMCArNjc4LDIxIEBACiAgKiBERVNDUklQVElPTjogTG9vayB1cCBhIG5hbWUgcmVsYXRpdmUgdG8gYSBnaXZlbiBzY29wZSBhbmQgcmV0dXJuIHRoZQogICogICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgTm9kZS4gTk9URTogU2NvcGUgY2FuIGJlIG51bGwuCiAgKgotICogTVVURVg6ICAgICAgIExvY2tzIG5hbWVzcGFjZQorICogTVVURVg6ICAgICAgIERvZXNuJ3QgbG9ja3MgbmFtZXNwYWNlCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfbnNfZ2V0X25vZGUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnByZWZpeF9ub2RlLAotCQkgY29uc3QgY2hhciAqcGF0aG5hbWUsCi0JCSB1MzIgZmxhZ3MsIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqcmV0dXJuX25vZGUpCithY3BpX25zX2dldF9ub2RlX3VubG9ja2VkKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwcmVmaXhfbm9kZSwKKwkJCSAgY29uc3QgY2hhciAqcGF0aG5hbWUsCisJCQkgIHUzMiBmbGFncywgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipyZXR1cm5fbm9kZSkKIHsKIAl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgc2NvcGVfaW5mbzsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJY2hhciAqaW50ZXJuYWxfcGF0aDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKG5zX2dldF9ub2RlLCBBQ1BJX0NBU1RfUFRSKGNoYXIsIHBhdGhuYW1lKSk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIobnNfZ2V0X25vZGVfdW5sb2NrZWQsCisJCQkJQUNQSV9DQVNUX1BUUihjaGFyLCBwYXRobmFtZSkpOwogCiAJLyogU2ltcGxlc3QgY2FzZSBpcyBhIG51bGwgcGF0aG5hbWUgKi8KIApAQCAtNzE4LDEzICs3MTksNiBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQkvKiBNdXN0IGxvY2sgbmFtZXNwYWNlIGR1cmluZyBsb29rdXAgKi8KLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIGNsZWFudXA7Ci0JfQotCiAJLyogU2V0dXAgbG9va3VwIHNjb3BlIChzZWFyY2ggc3RhcnRpbmcgcG9pbnQpICovCiAKIAlzY29wZV9pbmZvLnNjb3BlLm5vZGUgPSBwcmVmaXhfbm9kZTsKQEAgLTc0MCw5ICs3MzQsNDkgQEAKIAkJCQkgIHBhdGhuYW1lLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOwogCX0KIAotCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCi1jbGVhbnVwOgogCUFDUElfRlJFRShpbnRlcm5hbF9wYXRoKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfbm9kZQorICoKKyAqIFBBUkFNRVRFUlM6ICAqcGF0aG5hbWUgICAtIE5hbWUgdG8gYmUgZm91bmQsIGluIGV4dGVybmFsIChBU0wpIGZvcm1hdC4gVGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIChiYWNrc2xhc2gpIGFuZCBeIChjYXJhdCkgcHJlZml4ZXMsIGFuZCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gKHBlcmlvZCkgdG8gc2VwYXJhdGUgc2VnbWVudHMgYXJlIHN1cHBvcnRlZC4KKyAqICAgICAgICAgICAgICBwcmVmaXhfbm9kZSAgLSBSb290IG9mIHN1YnRyZWUgdG8gYmUgc2VhcmNoZWQsIG9yIE5TX0FMTCBmb3IgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290IG9mIHRoZSBuYW1lIHNwYWNlLiBJZiBOYW1lIGlzIGZ1bGx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQgKGZpcnN0IHM4IGlzICdcJyksIHRoZSBwYXNzZWQgdmFsdWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIFNjb3BlIHdpbGwgbm90IGJlIGFjY2Vzc2VkLgorICogICAgICAgICAgICAgIGZsYWdzICAgICAgIC0gVXNlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRvIHBlcmZvcm0gdXBzZWFyY2ggb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdC4KKyAqICAgICAgICAgICAgICByZXR1cm5fbm9kZSAtIFdoZXJlIHRoZSBOb2RlIGlzIHJldHVybmVkCisgKgorICogREVTQ1JJUFRJT046IExvb2sgdXAgYSBuYW1lIHJlbGF0aXZlIHRvIGEgZ2l2ZW4gc2NvcGUgYW5kIHJldHVybiB0aGUKKyAqICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIE5vZGUuIE5PVEU6IFNjb3BlIGNhbiBiZSBudWxsLgorICoKKyAqIE1VVEVYOiAgICAgICBMb2NrcyBuYW1lc3BhY2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9uc19nZXRfbm9kZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcHJlZml4X25vZGUsCisJCSBjb25zdCBjaGFyICpwYXRobmFtZSwKKwkJIHUzMiBmbGFncywgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipyZXR1cm5fbm9kZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihuc19nZXRfbm9kZSwgQUNQSV9DQVNUX1BUUihjaGFyLCBwYXRobmFtZSkpOworCisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCXN0YXR1cyA9IGFjcGlfbnNfZ2V0X25vZGVfdW5sb2NrZWQocHJlZml4X25vZGUsIHBhdGhuYW1lLAorCQkJCQkgICBmbGFncywgcmV0dXJuX25vZGUpOworCisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3BzcGFyc2UuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHNwYXJzZS5jCmluZGV4IDBhMjM4OTcuLjFjZTI2ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHNwYXJzZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHNwYXJzZS5jCkBAIC01MzcsOSArNTM3LDExIEBACiAKIAkJCS8qIEVpdGhlciB0aGUgbWV0aG9kIHBhcnNlIG9yIGFjdHVhbCBleGVjdXRpb24gZmFpbGVkICovCiAKKwkJCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlcigpOwogCQkJQUNQSV9FUlJPUl9NRVRIT0QoIk1ldGhvZCBwYXJzZS9leGVjdXRpb24gZmFpbGVkIiwKIAkJCQkJICB3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZSwgTlVMTCwKIAkJCQkJICBzdGF0dXMpOworCQkJYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcigpOwogCiAJCQkvKiBDaGVjayBmb3IgcG9zc2libGUgbXVsdGktdGhyZWFkIHJlZW50cmFuY3kgcHJvYmxlbSAqLwogCkBAIC01NzEsNyArNTczLDkgQEAKIAkJICogY2xlYW51cCB0byBkbwogCQkgKi8KIAkJaWYgKCgod2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgJiBBQ1BJX1BBUlNFX01PREVfTUFTSykgPT0KLQkJICAgICBBQ1BJX1BBUlNFX0VYRUNVVEUpIHx8IChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkpIHsKKwkJICAgICBBQ1BJX1BBUlNFX0VYRUNVVEUgJiYKKwkJICAgICAhKHdhbGtfc3RhdGUtPnBhcnNlX2ZsYWdzICYgQUNQSV9QQVJTRV9NT0RVTEVfTEVWRUwpKSB8fAorCQkgICAgKEFDUElfRkFJTFVSRShzdGF0dXMpKSkgewogCQkJYWNwaV9kc190ZXJtaW5hdGVfY29udHJvbF9tZXRob2Qod2Fsa19zdGF0ZS0+CiAJCQkJCQkJIG1ldGhvZF9kZXNjLAogCQkJCQkJCSB3YWxrX3N0YXRlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHN4ZmFjZS5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9wc3hmYWNlLmMKaW5kZXggY2YzMGNkODIuLmYzYzg3MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHN4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvcHN4ZmFjZS5jCkBAIC0yNTIsNiArMjUyLDkwIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcHNfZXhlY3V0ZV90YWJsZQorICoKKyAqIFBBUkFNRVRFUlM6ICBpbmZvICAgICAgICAgICAgLSBNZXRob2QgaW5mbyBibG9jaywgY29udGFpbnM6CisgKiAgICAgICAgICAgICAgbm9kZSAgICAgICAgICAgIC0gTm9kZSB0byB3aGVyZSB0aGUgaXMgZW50ZXJlZCBpbnRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZQorICogICAgICAgICAgICAgIG9ial9kZXNjICAgICAgICAtIFBzZXVkbyBtZXRob2Qgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIEFNTAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgb2YgdGhlIGVudGlyZSB0YWJsZQorICogICAgICAgICAgICAgIHBhc3NfbnVtYmVyICAgICAtIFBhcnNlIG9yIGV4ZWN1dGUgcGFzcworICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogRXhlY3V0ZSBhIHRhYmxlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9wc19leGVjdXRlX3RhYmxlKHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8gKmluZm8pCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCA9IE5VTEw7CisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSA9IE5VTEw7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHBzX2V4ZWN1dGVfdGFibGUpOworCisJLyogQ3JlYXRlIGFuZCBpbml0IGEgUm9vdCBOb2RlICovCisKKwlvcCA9IGFjcGlfcHNfY3JlYXRlX3Njb3BlX29wKGluZm8tPm9ial9kZXNjLT5tZXRob2QuYW1sX3N0YXJ0KTsKKwlpZiAoIW9wKSB7CisJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyB3YWxrIHN0YXRlICovCisKKwl3YWxrX3N0YXRlID0KKwkgICAgYWNwaV9kc19jcmVhdGVfd2Fsa19zdGF0ZShpbmZvLT5vYmpfZGVzYy0+bWV0aG9kLm93bmVyX2lkLCBOVUxMLAorCQkJCSAgICAgIE5VTEwsIE5VTEwpOworCWlmICghd2Fsa19zdGF0ZSkgeworCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYW1sX3dhbGsod2Fsa19zdGF0ZSwgb3AsIGluZm8tPm5vZGUsCisJCQkJICAgICAgIGluZm8tPm9ial9kZXNjLT5tZXRob2QuYW1sX3N0YXJ0LAorCQkJCSAgICAgICBpbmZvLT5vYmpfZGVzYy0+bWV0aG9kLmFtbF9sZW5ndGgsIGluZm8sCisJCQkJICAgICAgIGluZm8tPnBhc3NfbnVtYmVyKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJZ290byBjbGVhbnVwOworCX0KKworCWlmIChpbmZvLT5vYmpfZGVzYy0+bWV0aG9kLmluZm9fZmxhZ3MgJiBBQ1BJX01FVEhPRF9NT0RVTEVfTEVWRUwpIHsKKwkJd2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgfD0gQUNQSV9QQVJTRV9NT0RVTEVfTEVWRUw7CisJfQorCisJLyogSW5mby0+Tm9kZSBpcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiB0byBsb2FkIHRoZSB0YWJsZSAgKi8KKworCWlmIChpbmZvLT5ub2RlICYmIGluZm8tPm5vZGUgIT0gYWNwaV9nYmxfcm9vdF9ub2RlKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2RzX3Njb3BlX3N0YWNrX3B1c2goaW5mby0+bm9kZSwgQUNQSV9UWVBFX01FVEhPRCwKKwkJCQkJICAgICB3YWxrX3N0YXRlKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwl9CisKKwkvKgorCSAqIFBhcnNlIHRoZSBBTUwsIHdhbGtfc3RhdGUgd2lsbCBiZSBkZWxldGVkIGJ5IHBhcnNlX2FtbAorCSAqLworCWFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKKwlzdGF0dXMgPSBhY3BpX3BzX3BhcnNlX2FtbCh3YWxrX3N0YXRlKTsKKwlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIoKTsKKwl3YWxrX3N0YXRlID0gTlVMTDsKKworY2xlYW51cDoKKwlpZiAod2Fsa19zdGF0ZSkgeworCQlhY3BpX2RzX2RlbGV0ZV93YWxrX3N0YXRlKHdhbGtfc3RhdGUpOworCX0KKwlpZiAob3ApIHsKKwkJYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZShvcCk7CisJfQorCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX3VwZGF0ZV9wYXJhbWV0ZXJfbGlzdAogICoKICAqIFBBUkFNRVRFUlM6ICBpbmZvICAgICAgICAgICAgLSBTZWUgc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS90YmRhdGEuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJkYXRhLmMKaW5kZXggMTM4OGExOS4uZDljYThjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS90YmRhdGEuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RiZGF0YS5jCkBAIC00NSw2ICs0NSw3IEBACiAjaW5jbHVkZSAiYWNjb21tb24uaCIKICNpbmNsdWRlICJhY25hbWVzcC5oIgogI2luY2x1ZGUgImFjdGFibGVzLmgiCisjaW5jbHVkZSAiYWNldmVudHMuaCIKIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVEFCTEVTCiBBQ1BJX01PRFVMRV9OQU1FKCJ0YmRhdGEiKQpAQCAtNjEzLDE3ICs2MTQsMTIgQEAKIAkgKiBsb2NrIG1heSBibG9jaywgYW5kIGFsc28gc2luY2UgdGhlIGV4ZWN1dGlvbiBvZiBhIG5hbWVzcGFjZSB3YWxrCiAJICogbXVzdCBiZSBhbGxvd2VkIHRvIHVzZSB0aGUgaW50ZXJwcmV0ZXIuCiAJICovCi0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0lOVEVSUFJFVEVSKTsKIAlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfd3JpdGVfbG9jaygmYWNwaV9nYmxfbmFtZXNwYWNlX3J3X2xvY2spOwotCi0JYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyKG93bmVyX2lkKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQotCisJYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyKG93bmVyX2lkKTsKIAlhY3BpX3V0X3JlbGVhc2Vfd3JpdGVfbG9jaygmYWNwaV9nYmxfbmFtZXNwYWNlX3J3X2xvY2spOwotCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0lOVEVSUFJFVEVSKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIApAQCAtNzcxLDMgKzc2NywxNDIgQEAKIAogCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2xvYWRfdGFibGUKKyAqCisgKiBQQVJBTUVURVJTOiAgdGFibGVfaW5kZXggICAgICAgICAgICAgLSBUYWJsZSBpbmRleAorICogICAgICAgICAgICAgIHBhcmVudF9ub2RlICAgICAgICAgICAgIC0gV2hlcmUgdGFibGUgaW5kZXggaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IExvYWQgYW4gQUNQSSB0YWJsZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX3RiX2xvYWRfdGFibGUodTMyIHRhYmxlX2luZGV4LCBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGUpCit7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9vd25lcl9pZCBvd25lcl9pZDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UodGJfbG9hZF90YWJsZSk7CisKKwkvKgorCSAqIE5vdGU6IE5vdyB0YWJsZSBpcyAiSU5TVEFMTEVEIiwgaXQgbXVzdCBiZSB2YWxpZGF0ZWQgYmVmb3JlCisJICogdXNpbmcuCisJICovCisJc3RhdHVzID0gYWNwaV9nZXRfdGFibGVfYnlfaW5kZXgodGFibGVfaW5kZXgsICZ0YWJsZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKworCXN0YXR1cyA9IGFjcGlfbnNfbG9hZF90YWJsZSh0YWJsZV9pbmRleCwgcGFyZW50X25vZGUpOworCisJLyogRXhlY3V0ZSBhbnkgbW9kdWxlLWxldmVsIGNvZGUgdGhhdCB3YXMgZm91bmQgaW4gdGhlIHRhYmxlICovCisKKwlpZiAoIWFjcGlfZ2JsX3BhcnNlX3RhYmxlX2FzX3Rlcm1fbGlzdAorCSAgICAmJiBhY3BpX2dibF9ncm91cF9tb2R1bGVfbGV2ZWxfY29kZSkgeworCQlhY3BpX25zX2V4ZWNfbW9kdWxlX2NvZGVfbGlzdCgpOworCX0KKworCS8qCisJICogVXBkYXRlIEdQRXMgZm9yIGFueSBuZXcgX0x4eC9fRXh4IG1ldGhvZHMuIElnbm9yZSBlcnJvcnMuIFRoZSBob3N0IGlzCisJICogcmVzcG9uc2libGUgZm9yIGRpc2NvdmVyaW5nIGFueSBuZXcgd2FrZSBHUEVzIGJ5IHJ1bm5pbmcgX1BSVyBtZXRob2RzCisJICogdGhhdCBtYXkgaGF2ZSBiZWVuIGxvYWRlZCBieSB0aGlzIHRhYmxlLgorCSAqLworCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X293bmVyX2lkKHRhYmxlX2luZGV4LCAmb3duZXJfaWQpOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlhY3BpX2V2X3VwZGF0ZV9ncGVzKG93bmVyX2lkKTsKKwl9CisKKwkvKiBJbnZva2UgdGFibGUgaGFuZGxlciBpZiBwcmVzZW50ICovCisKKwlpZiAoYWNwaV9nYmxfdGFibGVfaGFuZGxlcikgeworCQkodm9pZClhY3BpX2dibF90YWJsZV9oYW5kbGVyKEFDUElfVEFCTEVfRVZFTlRfTE9BRCwgdGFibGUsCisJCQkJCSAgICAgYWNwaV9nYmxfdGFibGVfaGFuZGxlcl9jb250ZXh0KTsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV90Yl9pbnN0YWxsX2FuZF9sb2FkX3RhYmxlCisgKgorICogUEFSQU1FVEVSUzogIHRhYmxlICAgICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgdGFibGUKKyAqICAgICAgICAgICAgICBhZGRyZXNzICAgICAgICAgICAgICAgICAtIFBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHRhYmxlCisgKiAgICAgICAgICAgICAgZmxhZ3MgICAgICAgICAgICAgICAgICAgLSBBbGxvY2F0aW9uIGZsYWdzIG9mIHRoZSB0YWJsZQorICogICAgICAgICAgICAgIHRhYmxlX2luZGV4ICAgICAgICAgICAgIC0gV2hlcmUgdGFibGUgaW5kZXggaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEluc3RhbGwgYW5kIGxvYWQgYW4gQUNQSSB0YWJsZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX3RiX2luc3RhbGxfYW5kX2xvYWRfdGFibGUoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSwKKwkJCSAgICAgICBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKKwkJCSAgICAgICB1OCBmbGFncywgdTggb3ZlcnJpZGUsIHUzMiAqdGFibGVfaW5kZXgpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXUzMiBpOworCWFjcGlfb3duZXJfaWQgb3duZXJfaWQ7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfbG9hZF90YWJsZSk7CisKKwkodm9pZClhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKKworCS8qIEluc3RhbGwgdGhlIHRhYmxlIGFuZCBsb2FkIGl0IGludG8gdGhlIG5hbWVzcGFjZSAqLworCisJc3RhdHVzID0gYWNwaV90Yl9pbnN0YWxsX3N0YW5kYXJkX3RhYmxlKGFkZHJlc3MsIGZsYWdzLCBUUlVFLAorCQkJCQkJb3ZlcnJpZGUsICZpKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJfQorCisJLyoKKwkgKiBOb3RlOiBOb3cgdGFibGUgaXMgIklOU1RBTExFRCIsIGl0IG11c3QgYmUgdmFsaWRhdGVkIGJlZm9yZQorCSAqIHVzaW5nLgorCSAqLworCXN0YXR1cyA9IGFjcGlfdGJfdmFsaWRhdGVfdGFibGUoJmFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0pOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKKwl9CisKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKKwlzdGF0dXMgPSBhY3BpX25zX2xvYWRfdGFibGUoaSwgYWNwaV9nYmxfcm9vdF9ub2RlKTsKKworCS8qIEV4ZWN1dGUgYW55IG1vZHVsZS1sZXZlbCBjb2RlIHRoYXQgd2FzIGZvdW5kIGluIHRoZSB0YWJsZSAqLworCisJaWYgKCFhY3BpX2dibF9wYXJzZV90YWJsZV9hc190ZXJtX2xpc3QKKwkgICAgJiYgYWNwaV9nYmxfZ3JvdXBfbW9kdWxlX2xldmVsX2NvZGUpIHsKKwkJYWNwaV9uc19leGVjX21vZHVsZV9jb2RlX2xpc3QoKTsKKwl9CisKKwkvKgorCSAqIFVwZGF0ZSBHUEVzIGZvciBhbnkgbmV3IF9MeHgvX0V4eCBtZXRob2RzLiBJZ25vcmUgZXJyb3JzLiBUaGUgaG9zdCBpcworCSAqIHJlc3BvbnNpYmxlIGZvciBkaXNjb3ZlcmluZyBhbnkgbmV3IHdha2UgR1BFcyBieSBydW5uaW5nIF9QUlcgbWV0aG9kcworCSAqIHRoYXQgbWF5IGhhdmUgYmVlbiBsb2FkZWQgYnkgdGhpcyB0YWJsZS4KKwkgKi8KKwlzdGF0dXMgPSBhY3BpX3RiX2dldF9vd25lcl9pZChpLCAmb3duZXJfaWQpOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlhY3BpX2V2X3VwZGF0ZV9ncGVzKG93bmVyX2lkKTsKKwl9CisKKwkvKiBJbnZva2UgdGFibGUgaGFuZGxlciBpZiBwcmVzZW50ICovCisKKwlpZiAoYWNwaV9nYmxfdGFibGVfaGFuZGxlcikgeworCQkodm9pZClhY3BpX2dibF90YWJsZV9oYW5kbGVyKEFDUElfVEFCTEVfRVZFTlRfTE9BRCwgdGFibGUsCisJCQkJCSAgICAgYWNwaV9nYmxfdGFibGVfaGFuZGxlcl9jb250ZXh0KTsKKwl9CisJKHZvaWQpYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CisKK3VubG9ja19hbmRfZXhpdDoKKwkqdGFibGVfaW5kZXggPSBpOworCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS90YmZhZHQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJmYWR0LmMKaW5kZXggNjIwODA2OS4uMDQ2YzRkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS90YmZhZHQuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RiZmFkdC5jCkBAIC0zNDQsMjMgKzM0NCwyNyBAQAogCiAJLyogT2J0YWluIHRoZSBEU0RUIGFuZCBGQUNTIHRhYmxlcyB2aWEgdGhlaXIgYWRkcmVzc2VzIHdpdGhpbiB0aGUgRkFEVCAqLwogCi0JYWNwaV90Yl9pbnN0YWxsX2ZpeGVkX3RhYmxlKChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpYWNwaV9nYmxfRkFEVC5YZHNkdCwKLQkJCQkgICAgQUNQSV9TSUdfRFNEVCwgJmFjcGlfZ2JsX2RzZHRfaW5kZXgpOworCWFjcGlfdGJfaW5zdGFsbF9zdGFuZGFyZF90YWJsZSgoYWNwaV9waHlzaWNhbF9hZGRyZXNzKWFjcGlfZ2JsX0ZBRFQuCisJCQkJICAgICAgIFhkc2R0LAorCQkJCSAgICAgICBBQ1BJX1RBQkxFX09SSUdJTl9JTlRFUk5BTF9QSFlTSUNBTCwKKwkJCQkgICAgICAgRkFMU0UsIFRSVUUsICZhY3BpX2dibF9kc2R0X2luZGV4KTsKIAogCS8qIElmIEhhcmR3YXJlIFJlZHVjZWQgZmxhZyBpcyBzZXQsIHRoZXJlIGlzIG5vIEZBQ1MgKi8KIAogCWlmICghYWNwaV9nYmxfcmVkdWNlZF9oYXJkd2FyZSkgewogCQlpZiAoYWNwaV9nYmxfRkFEVC5mYWNzKSB7Ci0JCQlhY3BpX3RiX2luc3RhbGxfZml4ZWRfdGFibGUoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKLQkJCQkJCSAgICBhY3BpX2dibF9GQURULmZhY3MsCi0JCQkJCQkgICAgQUNQSV9TSUdfRkFDUywKLQkJCQkJCSAgICAmYWNwaV9nYmxfZmFjc19pbmRleCk7CisJCQlhY3BpX3RiX2luc3RhbGxfc3RhbmRhcmRfdGFibGUoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKKwkJCQkJCSAgICAgICBhY3BpX2dibF9GQURULmZhY3MsCisJCQkJCQkgICAgICAgQUNQSV9UQUJMRV9PUklHSU5fSU5URVJOQUxfUEhZU0lDQUwsCisJCQkJCQkgICAgICAgRkFMU0UsIFRSVUUsCisJCQkJCQkgICAgICAgJmFjcGlfZ2JsX2ZhY3NfaW5kZXgpOwogCQl9CiAJCWlmIChhY3BpX2dibF9GQURULlhmYWNzKSB7Ci0JCQlhY3BpX3RiX2luc3RhbGxfZml4ZWRfdGFibGUoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKLQkJCQkJCSAgICBhY3BpX2dibF9GQURULlhmYWNzLAotCQkJCQkJICAgIEFDUElfU0lHX0ZBQ1MsCi0JCQkJCQkgICAgJmFjcGlfZ2JsX3hmYWNzX2luZGV4KTsKKwkJCWFjcGlfdGJfaW5zdGFsbF9zdGFuZGFyZF90YWJsZSgoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQorCQkJCQkJICAgICAgIGFjcGlfZ2JsX0ZBRFQuWGZhY3MsCisJCQkJCQkgICAgICAgQUNQSV9UQUJMRV9PUklHSU5fSU5URVJOQUxfUEhZU0lDQUwsCisJCQkJCQkgICAgICAgRkFMU0UsIFRSVUUsCisJCQkJCQkgICAgICAgJmFjcGlfZ2JsX3hmYWNzX2luZGV4KTsKIAkJfQogCX0KIH0KQEAgLTQ3NiwxNyArNDgwLDE5IEBACiAJdTMyIGk7CiAKIAkvKgotCSAqIEZvciBBQ1BJIDEuMCBGQURUcyAocmV2aXNpb24gMSBvciAyKSwgZW5zdXJlIHRoYXQgcmVzZXJ2ZWQgZmllbGRzIHdoaWNoCisJICogRm9yIEFDUEkgMS4wIEZBRFRzIChyZXZpc2lvbiAxKSwgZW5zdXJlIHRoYXQgcmVzZXJ2ZWQgZmllbGRzIHdoaWNoCiAJICogc2hvdWxkIGJlIHplcm8gYXJlIGluZGVlZCB6ZXJvLiBUaGlzIHdpbGwgd29ya2Fyb3VuZCBCSU9TcyB0aGF0CiAJICogaW5hZHZlcnRlbnRseSBwbGFjZSB2YWx1ZXMgaW4gdGhlc2UgZmllbGRzLgogCSAqCiAJICogVGhlIEFDUEkgMS4wIHJlc2VydmVkIGZpZWxkcyB0aGF0IHdpbGwgYmUgemVyb2VkIGFyZSB0aGUgYnl0ZXMgbG9jYXRlZAogCSAqIGF0IG9mZnNldCA0NSwgNTUsIDk1LCBhbmQgdGhlIHdvcmQgbG9jYXRlZCBhdCBvZmZzZXQgMTA5LCAxMTAuCiAJICoKLQkgKiBOb3RlOiBUaGUgRkFEVCByZXZpc2lvbiB2YWx1ZSBpcyB1bnJlbGlhYmxlLiBPbmx5IHRoZSBsZW5ndGggY2FuIGJlCi0JICogdHJ1c3RlZC4KKwkgKiBOb3RlOiBUaGUgRkFEVCByZXZpc2lvbiB2YWx1ZSBpcyB1bnJlbGlhYmxlIGJlY2F1c2Ugb2YgQklPUyBlcnJvcnMuCisJICogVGhlIHRhYmxlIGxlbmd0aCBpcyBpbnN0ZWFkIHVzZWQgYXMgdGhlIGZpbmFsIHdvcmQgb24gdGhlIHZlcnNpb24uCisJICoKKwkgKiBOb3RlOiBGQURUIHJldmlzaW9uIDMgaXMgdGhlIEFDUEkgMi4wIHZlcnNpb24gb2YgdGhlIEZBRFQuCiAJICovCi0JaWYgKGFjcGlfZ2JsX0ZBRFQuaGVhZGVyLmxlbmd0aCA8PSBBQ1BJX0ZBRFRfVjJfU0laRSkgeworCWlmIChhY3BpX2dibF9GQURULmhlYWRlci5sZW5ndGggPD0gQUNQSV9GQURUX1YzX1NJWkUpIHsKIAkJYWNwaV9nYmxfRkFEVC5wcmVmZXJyZWRfcHJvZmlsZSA9IDA7CiAJCWFjcGlfZ2JsX0ZBRFQucHN0YXRlX2NvbnRyb2wgPSAwOwogCQlhY3BpX2dibF9GQURULmNzdF9jb250cm9sID0gMDsKQEAgLTU1Miw3NiArNTU4LDcyIEBACiAJCSAqCiAJCSAqIEFkZHJlc3MzMiB6ZXJvLCBBZGRyZXNzNjQgW2Rvbid0IGNhcmVdICAgLSBVc2UgQWRkcmVzczY0CiAJCSAqCisJCSAqIE5vIG92ZXJyaWRlOiBpZiBhY3BpX2dibF91c2UzMl9iaXRfZmFkdF9hZGRyZXNzZXMgaXMgRkFMU0UsIGFuZDoKIAkJICogQWRkcmVzczMyIG5vbi16ZXJvLCBBZGRyZXNzNjQgemVybyAgICAgICAtIENvcHkvdXNlIEFkZHJlc3MzMgogCQkgKiBBZGRyZXNzMzIgbm9uLXplcm8gPT0gQWRkcmVzczY0IG5vbi16ZXJvIC0gVXNlIEFkZHJlc3M2NAogCQkgKiBBZGRyZXNzMzIgbm9uLXplcm8gIT0gQWRkcmVzczY0IG5vbi16ZXJvIC0gV2FybmluZywgdXNlIEFkZHJlc3M2NAogCQkgKgogCQkgKiBPdmVycmlkZTogaWYgYWNwaV9nYmxfdXNlMzJfYml0X2ZhZHRfYWRkcmVzc2VzIGlzIFRSVUUsIGFuZDoKKwkJICogQWRkcmVzczMyIG5vbi16ZXJvLCBBZGRyZXNzNjQgemVybyAgICAgICAtIENvcHkvdXNlIEFkZHJlc3MzMgorCQkgKiBBZGRyZXNzMzIgbm9uLXplcm8gPT0gQWRkcmVzczY0IG5vbi16ZXJvIC0gQ29weS91c2UgQWRkcmVzczMyCiAJCSAqIEFkZHJlc3MzMiBub24temVybyAhPSBBZGRyZXNzNjQgbm9uLXplcm8gLSBXYXJuaW5nLCBjb3B5L3VzZSBBZGRyZXNzMzIKIAkJICoKIAkJICogTm90ZTogc3BhY2VfaWQgaXMgYWx3YXlzIEkvTyBmb3IgMzItYml0IGxlZ2FjeSBhZGRyZXNzIGZpZWxkcwogCQkgKi8KIAkJaWYgKGFkZHJlc3MzMikgewotCQkJaWYgKCFhZGRyZXNzNjQtPmFkZHJlc3MpIHsKKwkJCWlmIChhZGRyZXNzNjQtPmFkZHJlc3MpIHsKKwkJCQlpZiAoYWRkcmVzczY0LT5hZGRyZXNzICE9ICh1NjQpYWRkcmVzczMyKSB7CiAKLQkJCQkvKiA2NC1iaXQgYWRkcmVzcyBpcyB6ZXJvLCB1c2UgMzItYml0IGFkZHJlc3MgKi8KKwkJCQkJLyogQWRkcmVzcyBtaXNtYXRjaCAqLwogCi0JCQkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyhhZGRyZXNzNjQsCi0JCQkJCQkJICAgICBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU8sCi0JCQkJCQkJICAgICAqQUNQSV9BRERfUFRSKHU4LAotCQkJCQkJCQkJICAgJmFjcGlfZ2JsX0ZBRFQsCi0JCQkJCQkJCQkgICBmYWR0X2luZm9fdGFibGUKLQkJCQkJCQkJCSAgIFtpXS4KLQkJCQkJCQkJCSAgIGxlbmd0aCksCi0JCQkJCQkJICAgICAodTY0KWFkZHJlc3MzMiwKLQkJCQkJCQkgICAgIG5hbWUsIGZsYWdzKTsKLQkJCX0gZWxzZSBpZiAoYWRkcmVzczY0LT5hZGRyZXNzICE9ICh1NjQpYWRkcmVzczMyKSB7CisJCQkJCUFDUElfQklPU19XQVJOSU5HKChBRV9JTkZPLAorCQkJCQkJCSAgICIzMi82NFggYWRkcmVzcyBtaXNtYXRjaCBpbiBGQURULyVzOiAiCisJCQkJCQkJICAgIjB4JTguOFgvMHglOC44WCU4LjhYLCB1c2luZyAldS1iaXQgYWRkcmVzcyIsCisJCQkJCQkJICAgbmFtZSwgYWRkcmVzczMyLAorCQkJCQkJCSAgIEFDUElfRk9STUFUX1VJTlQ2NAorCQkJCQkJCSAgIChhZGRyZXNzNjQtPmFkZHJlc3MpLAorCQkJCQkJCSAgIGFjcGlfZ2JsX3VzZTMyX2JpdF9mYWR0X2FkZHJlc3NlcworCQkJCQkJCSAgID8gMzIgOiA2NCkpOworCQkJCX0KIAotCQkJCS8qIEFkZHJlc3MgbWlzbWF0Y2ggKi8KLQotCQkJCUFDUElfQklPU19XQVJOSU5HKChBRV9JTkZPLAotCQkJCQkJICAgIjMyLzY0WCBhZGRyZXNzIG1pc21hdGNoIGluIEZBRFQvJXM6ICIKLQkJCQkJCSAgICIweCU4LjhYLzB4JTguOFglOC44WCwgdXNpbmcgJXUtYml0IGFkZHJlc3MiLAotCQkJCQkJICAgbmFtZSwgYWRkcmVzczMyLAotCQkJCQkJICAgQUNQSV9GT1JNQVRfVUlOVDY0Ci0JCQkJCQkgICAoYWRkcmVzczY0LT5hZGRyZXNzKSwKLQkJCQkJCSAgIGFjcGlfZ2JsX3VzZTMyX2JpdF9mYWR0X2FkZHJlc3NlcwotCQkJCQkJICAgPyAzMiA6IDY0KSk7Ci0KLQkJCQlpZiAoYWNwaV9nYmxfdXNlMzJfYml0X2ZhZHRfYWRkcmVzc2VzKSB7Ci0KLQkJCQkJLyogMzItYml0IGFkZHJlc3Mgb3ZlcnJpZGUgKi8KLQotCQkJCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKGFkZHJlc3M2NCwKLQkJCQkJCQkJICAgICBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU8sCi0JCQkJCQkJCSAgICAgKkFDUElfQUREX1BUUgotCQkJCQkJCQkgICAgICh1OCwKLQkJCQkJCQkJICAgICAgJmFjcGlfZ2JsX0ZBRFQsCi0JCQkJCQkJCSAgICAgIGZhZHRfaW5mb190YWJsZQotCQkJCQkJCQkgICAgICBbaV0uCi0JCQkJCQkJCSAgICAgIGxlbmd0aCksCi0JCQkJCQkJCSAgICAgKHU2NCkKLQkJCQkJCQkJICAgICBhZGRyZXNzMzIsCi0JCQkJCQkJCSAgICAgbmFtZSwKLQkJCQkJCQkJICAgICBmbGFncyk7CisJCQkJLyoKKwkJCQkgKiBGb3IgZWFjaCBleHRlbmRlZCBmaWVsZCwgY2hlY2sgZm9yIGxlbmd0aCBtaXNtYXRjaAorCQkJCSAqIGJldHdlZW4gdGhlIGxlZ2FjeSBsZW5ndGggZmllbGQgYW5kIHRoZSBjb3JyZXNwb25kaW5nCisJCQkJICogNjQtYml0IFggbGVuZ3RoIGZpZWxkLgorCQkJCSAqIE5vdGU6IElmIHRoZSBsZWdhY3kgbGVuZ3RoIGZpZWxkIGlzID4gMHhGRiBiaXRzLCBpZ25vcmUKKwkJCQkgKiB0aGlzIGNoZWNrLiAoR1BFIHJlZ2lzdGVycyBjYW4gYmUgbGFyZ2VyIHRoYW4gdGhlCisJCQkJICogNjQtYml0IEdBUyBzdHJ1Y3R1cmUgY2FuIGFjY29tb2RhdGUsIDB4RkYgYml0cykuCisJCQkJICovCisJCQkJaWYgKChBQ1BJX01VTF84KGxlbmd0aCkgPD0gQUNQSV9VSU5UOF9NQVgpICYmCisJCQkJICAgIChhZGRyZXNzNjQtPmJpdF93aWR0aCAhPQorCQkJCSAgICAgQUNQSV9NVUxfOChsZW5ndGgpKSkgeworCQkJCQlBQ1BJX0JJT1NfV0FSTklORygoQUVfSU5GTywKKwkJCQkJCQkgICAiMzIvNjRYIGxlbmd0aCBtaXNtYXRjaCBpbiBGQURULyVzOiAldS8ldSIsCisJCQkJCQkJICAgbmFtZSwKKwkJCQkJCQkgICBBQ1BJX01VTF84KGxlbmd0aCksCisJCQkJCQkJICAgYWRkcmVzczY0LT4KKwkJCQkJCQkgICBiaXRfd2lkdGgpKTsKIAkJCQl9CiAJCQl9Ci0JCX0KIAotCQkvKgotCQkgKiBGb3IgZWFjaCBleHRlbmRlZCBmaWVsZCwgY2hlY2sgZm9yIGxlbmd0aCBtaXNtYXRjaCBiZXR3ZWVuIHRoZQotCQkgKiBsZWdhY3kgbGVuZ3RoIGZpZWxkIGFuZCB0aGUgY29ycmVzcG9uZGluZyA2NC1iaXQgWCBsZW5ndGggZmllbGQuCi0JCSAqIE5vdGU6IElmIHRoZSBsZWdhY3kgbGVuZ3RoIGZpZWxkIGlzID4gMHhGRiBiaXRzLCBpZ25vcmUgdGhpcwotCQkgKiBjaGVjay4gKEdQRSByZWdpc3RlcnMgY2FuIGJlIGxhcmdlciB0aGFuIHRoZSA2NC1iaXQgR0FTIHN0cnVjdHVyZQotCQkgKiBjYW4gYWNjb21vZGF0ZSwgMHhGRiBiaXRzKS4KLQkJICovCi0JCWlmIChhZGRyZXNzNjQtPmFkZHJlc3MgJiYKLQkJICAgIChBQ1BJX01VTF84KGxlbmd0aCkgPD0gQUNQSV9VSU5UOF9NQVgpICYmCi0JCSAgICAoYWRkcmVzczY0LT5iaXRfd2lkdGggIT0gQUNQSV9NVUxfOChsZW5ndGgpKSkgewotCQkJQUNQSV9CSU9TX1dBUk5JTkcoKEFFX0lORk8sCi0JCQkJCSAgICIzMi82NFggbGVuZ3RoIG1pc21hdGNoIGluIEZBRFQvJXM6ICV1LyV1IiwKLQkJCQkJICAgbmFtZSwgQUNQSV9NVUxfOChsZW5ndGgpLAotCQkJCQkgICBhZGRyZXNzNjQtPmJpdF93aWR0aCkpOworCQkJLyoKKwkJCSAqIEhhcmR3YXJlIHJlZ2lzdGVyIGFjY2VzcyBjb2RlIGFsd2F5cyB1c2VzIHRoZSA2NC1iaXQgZmllbGRzLgorCQkJICogU28gaWYgdGhlIDY0LWJpdCBmaWVsZCBpcyB6ZXJvIG9yIGlzIHRvIGJlIG92ZXJyaWRkZW4sCisJCQkgKiBpbml0aWFsaXplIGl0IHdpdGggdGhlIDMyLWJpdCBmaWVsZHMuCisJCQkgKiBOb3RlIHRoYXQgd2hlbiB0aGUgMzItYml0IGFkZHJlc3MgZmF2b3IgaXMgc3BlY2lmaWVkLCB0aGUKKwkJCSAqIDY0LWJpdCBmaWVsZHMgYXJlIGFsd2F5cyByZS1pbml0aWFsaXplZCBzbyB0aGF0CisJCQkgKiBhY2Nlc3Nfc2l6ZS9iaXRfd2lkdGgvYml0X29mZnNldCBmaWVsZHMgY2FuIGJlIGNvcnJlY3RseQorCQkJICogY29uZmlndXJlZCB0byB0aGUgdmFsdWVzIHRvIHRyaWdnZXIgYSAzMi1iaXQgY29tcGF0aWJsZQorCQkJICogYWNjZXNzIG1vZGUgaW4gdGhlIGhhcmR3YXJlIHJlZ2lzdGVyIGFjY2VzcyBjb2RlLgorCQkJICovCisJCQlpZiAoIWFkZHJlc3M2NC0+YWRkcmVzcworCQkJICAgIHx8IGFjcGlfZ2JsX3VzZTMyX2JpdF9mYWR0X2FkZHJlc3NlcykgeworCQkJCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MoYWRkcmVzczY0LAorCQkJCQkJCSAgICAgQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPLAorCQkJCQkJCSAgICAgbGVuZ3RoLAorCQkJCQkJCSAgICAgKHU2NClhZGRyZXNzMzIsCisJCQkJCQkJICAgICBuYW1lLCBmbGFncyk7CisJCQl9CiAJCX0KIAogCQlpZiAoZmFkdF9pbmZvX3RhYmxlW2ldLmZsYWdzICYgQUNQSV9GQURUX1JFUVVJUkVEKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3RiZmluZC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS90YmZpbmQuYwppbmRleCBlMzQ4ZDYxLi5mNmI5YjRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3RiZmluZC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJmaW5kLmMKQEAgLTY4LDcgKzY4LDcgQEAKIGFjcGlfdGJfZmluZF90YWJsZShjaGFyICpzaWduYXR1cmUsCiAJCSAgIGNoYXIgKm9lbV9pZCwgY2hhciAqb2VtX3RhYmxlX2lkLCB1MzIgKnRhYmxlX2luZGV4KQogewotCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgaGVhZGVyOwogCXUzMiBpOwogCkBAIC05Niw2ICs5Niw3IEBACiAKIAkvKiBTZWFyY2ggZm9yIHRoZSB0YWJsZSAqLwogCisJKHZvaWQpYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CiAJZm9yIChpID0gMDsgaSA8IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jdXJyZW50X3RhYmxlX2NvdW50OyArK2kpIHsKIAkJaWYgKG1lbWNtcCgmKGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0uc2lnbmF0dXJlKSwKIAkJCSAgIGhlYWRlci5zaWduYXR1cmUsIEFDUElfTkFNRV9TSVpFKSkgewpAQCAtMTE1LDcgKzExNiw3IEBACiAJCQkgICAgYWNwaV90Yl92YWxpZGF0ZV90YWJsZSgmYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LgogCQkJCQkJICAgdGFibGVzW2ldKTsKIAkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCQkJfQogCiAJCQlpZiAoIWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0ucG9pbnRlcikgewpAQCAtMTQ0LDkgKzE0NSwxMiBAQAogCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9UQUJMRVMsCiAJCQkJCSAgIkZvdW5kIHRhYmxlIFslNC40c11cbiIsCiAJCQkJCSAgaGVhZGVyLnNpZ25hdHVyZSkpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCQl9CiAJfQorCXN0YXR1cyA9IEFFX05PVF9GT1VORDsKIAotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRk9VTkQpOwordW5sb2NrX2FuZF9leGl0OgorCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS90Ymluc3RhbC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS90Ymluc3RhbC5jCmluZGV4IDhiMTMwNTIuLjVmZGYyNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJpbnN0YWwuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RiaW5zdGFsLmMKQEAgLTE1Nyw2OCArMTU3LDYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90Yl9pbnN0YWxsX2ZpeGVkX3RhYmxlCi0gKgotICogUEFSQU1FVEVSUzogIGFkZHJlc3MgICAgICAgICAgICAgICAgIC0gUGh5c2ljYWwgYWRkcmVzcyBvZiBEU0RUIG9yIEZBQ1MKLSAqICAgICAgICAgICAgICBzaWduYXR1cmUgICAgICAgICAgICAgICAtIFRhYmxlIHNpZ25hdHVyZSwgTlVMTCBpZiBubyBuZWVkIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaAotICogICAgICAgICAgICAgIHRhYmxlX2luZGV4ICAgICAgICAgICAgIC0gV2hlcmUgdGhlIHRhYmxlIGluZGV4IGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBJbnN0YWxsIGEgZml4ZWQgQUNQSSB0YWJsZSAoRFNEVC9GQUNTKSBpbnRvIHRoZSBnbG9iYWwgZGF0YQotICogICAgICAgICAgICAgIHN0cnVjdHVyZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV90Yl9pbnN0YWxsX2ZpeGVkX3RhYmxlKGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLAotCQkJICAgIGNoYXIgKnNpZ25hdHVyZSwgdTMyICp0YWJsZV9pbmRleCkKLXsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjIG5ld190YWJsZV9kZXNjOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UodGJfaW5zdGFsbF9maXhlZF90YWJsZSk7Ci0KLQlpZiAoIWFkZHJlc3MpIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCSAgICAiTnVsbCBwaHlzaWNhbCBhZGRyZXNzIGZvciBBQ1BJIHRhYmxlIFslc10iLAotCQkJICAgIHNpZ25hdHVyZSkpOwotCQlyZXR1cm4gKEFFX05PX01FTU9SWSk7Ci0JfQotCi0JLyogRmlsbCBhIHRhYmxlIGRlc2NyaXB0b3IgZm9yIHZhbGlkYXRpb24gKi8KLQotCXN0YXR1cyA9IGFjcGlfdGJfYWNxdWlyZV90ZW1wX3RhYmxlKCZuZXdfdGFibGVfZGVzYywgYWRkcmVzcywKLQkJCQkJICAgIEFDUElfVEFCTEVfT1JJR0lOX0lOVEVSTkFMX1BIWVNJQ0FMKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCSAgICAiQ291bGQgbm90IGFjcXVpcmUgdGFibGUgbGVuZ3RoIGF0ICU4LjhYJTguOFgiLAotCQkJICAgIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzKSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKiBWYWxpZGF0ZSBhbmQgdmVyaWZ5IGEgdGFibGUgYmVmb3JlIGluc3RhbGxhdGlvbiAqLwotCi0Jc3RhdHVzID0gYWNwaV90Yl92ZXJpZnlfdGVtcF90YWJsZSgmbmV3X3RhYmxlX2Rlc2MsIHNpZ25hdHVyZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWdvdG8gcmVsZWFzZV9hbmRfZXhpdDsKLQl9Ci0KLQkvKiBBZGQgdGhlIHRhYmxlIHRvIHRoZSBnbG9iYWwgcm9vdCB0YWJsZSBsaXN0ICovCi0KLQlhY3BpX3RiX2luc3RhbGxfdGFibGVfd2l0aF9vdmVycmlkZSgmbmV3X3RhYmxlX2Rlc2MsIFRSVUUsIHRhYmxlX2luZGV4KTsKLQotcmVsZWFzZV9hbmRfZXhpdDoKLQotCS8qIFJlbGVhc2UgdGhlIHRlbXBvcmFyeSB0YWJsZSBkZXNjcmlwdG9yICovCi0KLQlhY3BpX3RiX3JlbGVhc2VfdGVtcF90YWJsZSgmbmV3X3RhYmxlX2Rlc2MpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2luc3RhbGxfc3RhbmRhcmRfdGFibGUKICAqCiAgKiBQQVJBTUVURVJTOiAgYWRkcmVzcyAgICAgICAgICAgICAtIEFkZHJlc3Mgb2YgdGhlIHRhYmxlIChtaWdodCBiZSBhIHZpcnR1YWwKQEAgLTIzMCw4ICsxNjgsNyBAQAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gaW5zdGFsbCBhbiBBQ1BJIHRhYmxlIHRoYXQgaXMKLSAqICAgICAgICAgICAgICBuZWl0aGVyIERTRFQgbm9yIEZBQ1MgKGEgInN0YW5kYXJkIiB0YWJsZS4pCisgKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gdmVyaWZ5IGFuZCBpbnN0YWxsIGFuIEFDUEkgdGFibGUuCiAgKiAgICAgICAgICAgICAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSAiTG9hZCIgb3IgIkxvYWRUYWJsZSIgb3Bjb2RlcywKICAqICAgICAgICAgICAgICBvciBieSBhY3BpX2xvYWRfdGFibGUoKSBBUEksIHRoZSAiUmVsb2FkIiBwYXJhbWV0ZXIgaXMgc2V0LgogICogICAgICAgICAgICAgIEFmdGVyIHN1Y2Vzc2Z1bGx5IHJldHVybmluZyBmcm9tIHRoaXMgZnVuY3Rpb24sIHRhYmxlIGlzCkBAIC0zNjQsNiArMzAxLDE0IEBACiAJYWNwaV90Yl9pbnN0YWxsX3RhYmxlX3dpdGhfb3ZlcnJpZGUoJm5ld190YWJsZV9kZXNjLCBvdmVycmlkZSwKIAkJCQkJICAgIHRhYmxlX2luZGV4KTsKIAorCS8qIEludm9rZSB0YWJsZSBoYW5kbGVyIGlmIHByZXNlbnQgKi8KKworCWlmIChhY3BpX2dibF90YWJsZV9oYW5kbGVyKSB7CisJCSh2b2lkKWFjcGlfZ2JsX3RhYmxlX2hhbmRsZXIoQUNQSV9UQUJMRV9FVkVOVF9JTlNUQUxMLAorCQkJCQkgICAgIG5ld190YWJsZV9kZXNjLnBvaW50ZXIsCisJCQkJCSAgICAgYWNwaV9nYmxfdGFibGVfaGFuZGxlcl9jb250ZXh0KTsKKwl9CisKIHJlbGVhc2VfYW5kX2V4aXQ6CiAKIAkvKiBSZWxlYXNlIHRoZSB0ZW1wb3JhcnkgdGFibGUgZGVzY3JpcHRvciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS90YnV0aWxzLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RidXRpbHMuYwppbmRleCBlMjg1NTM5Li41MWViMDdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3RidXRpbHMuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RidXRpbHMuYwpAQCAtMjUyLDcgKzI1Miw4IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMgX19pbml0IGFjcGlfdGJfcGFyc2Vfcm9vdF90YWJsZShhY3BpX3BoeXNpY2FsX2FkZHJlc3MgcnNkcF9hZGRyZXNzKQorYWNwaV9zdGF0dXMgQUNQSV9JTklUX0ZVTkNUSU9OCithY3BpX3RiX3BhcnNlX3Jvb3RfdGFibGUoYWNwaV9waHlzaWNhbF9hZGRyZXNzIHJzZHBfYWRkcmVzcykKIHsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwICpyc2RwOwogCXUzMiB0YWJsZV9lbnRyeV9zaXplOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS90YnhmYWNlLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RieGZhY2UuYwppbmRleCAzZWNlYzkzLi40YWI2YjljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3RieGZhY2UuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RieGZhY2UuYwpAQCAtOTgsNyArOTgsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzIF9faW5pdAorYWNwaV9zdGF0dXMgQUNQSV9JTklUX0ZVTkNUSU9OCiBhY3BpX2luaXRpYWxpemVfdGFibGVzKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKmluaXRpYWxfdGFibGVfYXJyYXksCiAJCSAgICAgICB1MzIgaW5pdGlhbF90YWJsZV9jb3VudCwgdTggYWxsb3dfcmVzaXplKQogewpAQCAtMTY0LDcgKzE2NCw3IEBACiAgKiAgICAgICAgICAgICAga2VybmVsLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cyBfX2luaXQgYWNwaV9yZWFsbG9jYXRlX3Jvb3RfdGFibGUodm9pZCkKK2FjcGlfc3RhdHVzIEFDUElfSU5JVF9GVU5DVElPTiBhY3BpX3JlYWxsb2NhdGVfcm9vdF90YWJsZSh2b2lkKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS90YnhmbG9hZC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS90YnhmbG9hZC5jCmluZGV4IGFjNzFhYmMuLjU1NjlmNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJ4ZmxvYWQuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RieGZsb2FkLmMKQEAgLTYzLDcgKzYzLDcgQEAKICAqIERFU0NSSVBUSU9OOiBMb2FkIHRoZSBBQ1BJIHRhYmxlcyBmcm9tIHRoZSBSU0RUL1hTRFQKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgX19pbml0IGFjcGlfbG9hZF90YWJsZXModm9pZCkKK2FjcGlfc3RhdHVzIEFDUElfSU5JVF9GVU5DVElPTiBhY3BpX2xvYWRfdGFibGVzKHZvaWQpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCkBAIC0xMDMsNyArMTAzLDggQEAKIAkJCQkiV2hpbGUgbG9hZGluZyBuYW1lc3BhY2UgZnJvbSBBQ1BJIHRhYmxlcyIpKTsKIAl9CiAKLQlpZiAoIWFjcGlfZ2JsX2dyb3VwX21vZHVsZV9sZXZlbF9jb2RlKSB7CisJaWYgKGFjcGlfZ2JsX3BhcnNlX3RhYmxlX2FzX3Rlcm1fbGlzdAorCSAgICB8fCAhYWNwaV9nYmxfZ3JvdXBfbW9kdWxlX2xldmVsX2NvZGUpIHsKIAkJLyoKIAkJICogSW5pdGlhbGl6ZSB0aGUgb2JqZWN0cyB0aGF0IHJlbWFpbiB1bmluaXRpYWxpemVkLiBUaGlzCiAJCSAqIHJ1bnMgdGhlIGV4ZWN1dGFibGUgQU1MIHRoYXQgbWF5IGJlIHBhcnQgb2YgdGhlCkBAIC0xODgsMTEgKzE4OSwxMSBAQAogCW1lbWNweSgmYWNwaV9nYmxfb3JpZ2luYWxfZHNkdF9oZWFkZXIsIGFjcGlfZ2JsX0RTRFQsCiAJICAgICAgIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKIAotCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwotCiAJLyogTG9hZCBhbmQgcGFyc2UgdGFibGVzICovCiAKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKIAlzdGF0dXMgPSBhY3BpX25zX2xvYWRfdGFibGUoYWNwaV9nYmxfZHNkdF9pbmRleCwgYWNwaV9nYmxfcm9vdF9ub2RlKTsKKwkodm9pZClhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywgIltEU0RUXSB0YWJsZSBsb2FkIGZhaWxlZCIpKTsKIAkJdGFibGVzX2ZhaWxlZCsrOwpAQCAtMjAyLDcgKzIwMyw2IEBACiAKIAkvKiBMb2FkIGFueSBTU0RUIG9yIFBTRFQgdGFibGVzLiBOb3RlOiBMb29wIGxlYXZlcyB0YWJsZXMgbG9ja2VkICovCiAKLQkodm9pZClhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKIAlmb3IgKGkgPSAwOyBpIDwgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmN1cnJlbnRfdGFibGVfY291bnQ7ICsraSkgewogCQl0YWJsZSA9ICZhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldOwogCkBAIC0yMjAsNiArMjIwLDcgQEAKIAogCQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKIAkJc3RhdHVzID0gYWNwaV9uc19sb2FkX3RhYmxlKGksIGFjcGlfZ2JsX3Jvb3Rfbm9kZSk7CisJCSh2b2lkKWFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCiAJCQkJCSIoJTQuNHM6JTguOHMpIHdoaWxlIGxvYWRpbmcgdGFibGUiLApAQCAtMjM1LDggKzIzNiw2IEBACiAJCX0gZWxzZSB7CiAJCQl0YWJsZXNfbG9hZGVkKys7CiAJCX0KLQotCQkodm9pZClhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKIAl9CiAKIAlpZiAoIXRhYmxlc19mYWlsZWQpIHsKQEAgLTI3Miw3ICsyNzEsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzIF9faW5pdAorYWNwaV9zdGF0dXMgQUNQSV9JTklUX0ZVTkNUSU9OCiBhY3BpX2luc3RhbGxfdGFibGUoYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsIHU4IHBoeXNpY2FsKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKQEAgLTMyNCw0OSArMzIzLDEzIEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQkvKiBNdXN0IGFjcXVpcmUgdGhlIGludGVycHJldGVyIGxvY2sgZHVyaW5nIHRoaXMgb3BlcmF0aW9uICovCi0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfSU5URVJQUkVURVIpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KIAkvKiBJbnN0YWxsIHRoZSB0YWJsZSBhbmQgbG9hZCBpdCBpbnRvIHRoZSBuYW1lc3BhY2UgKi8KIAogCUFDUElfSU5GTygoIkhvc3QtZGlyZWN0ZWQgRHluYW1pYyBBQ1BJIFRhYmxlIExvYWQ6IikpOwotCSh2b2lkKWFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwotCi0Jc3RhdHVzID0gYWNwaV90Yl9pbnN0YWxsX3N0YW5kYXJkX3RhYmxlKEFDUElfUFRSX1RPX1BIWVNBRERSKHRhYmxlKSwKLQkJCQkJCUFDUElfVEFCTEVfT1JJR0lOX0VYVEVSTkFMX1ZJUlRVQUwsCi0JCQkJCQlUUlVFLCBGQUxTRSwgJnRhYmxlX2luZGV4KTsKLQotCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQl9Ci0KLQkvKgotCSAqIE5vdGU6IE5vdyB0YWJsZSBpcyAiSU5TVEFMTEVEIiwgaXQgbXVzdCBiZSB2YWxpZGF0ZWQgYmVmb3JlCi0JICogdXNpbmcuCi0JICovCiAJc3RhdHVzID0KLQkgICAgYWNwaV90Yl92YWxpZGF0ZV90YWJsZSgmYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LgotCQkJCSAgIHRhYmxlc1t0YWJsZV9pbmRleF0pOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX25zX2xvYWRfdGFibGUodGFibGVfaW5kZXgsIGFjcGlfZ2JsX3Jvb3Rfbm9kZSk7Ci0KLQkvKiBJbnZva2UgdGFibGUgaGFuZGxlciBpZiBwcmVzZW50ICovCi0KLQlpZiAoYWNwaV9nYmxfdGFibGVfaGFuZGxlcikgewotCQkodm9pZClhY3BpX2dibF90YWJsZV9oYW5kbGVyKEFDUElfVEFCTEVfRVZFTlRfTE9BRCwgdGFibGUsCi0JCQkJCSAgICAgYWNwaV9nYmxfdGFibGVfaGFuZGxlcl9jb250ZXh0KTsKLQl9Ci0KLXVubG9ja19hbmRfZXhpdDoKLQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfSU5URVJQUkVURVIpOworCSAgICBhY3BpX3RiX2luc3RhbGxfYW5kX2xvYWRfdGFibGUodGFibGUsIEFDUElfUFRSX1RPX1BIWVNBRERSKHRhYmxlKSwKKwkJCQkJICAgQUNQSV9UQUJMRV9PUklHSU5fRVhURVJOQUxfVklSVFVBTCwKKwkJCQkJICAgRkFMU0UsICZ0YWJsZV9pbmRleCk7CiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKQEAgLTQxNSw5ICszNzgsOSBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfVFlQRSk7CiAJfQogCi0JLyogTXVzdCBhY3F1aXJlIHRoZSBpbnRlcnByZXRlciBsb2NrIGR1cmluZyB0aGlzIG9wZXJhdGlvbiAqLworCS8qIE11c3QgYWNxdWlyZSB0aGUgdGFibGUgbG9jayBkdXJpbmcgdGhpcyBvcGVyYXRpb24gKi8KIAotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9JTlRFUlBSRVRFUik7CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KQEAgLTQ0NCw4ICs0MDcsMTAgQEAKIAogCQkvKiBFbnN1cmUgdGhlIHRhYmxlIGlzIGFjdHVhbGx5IGxvYWRlZCAqLwogCisJCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwogCQlpZiAoIWFjcGlfdGJfaXNfdGFibGVfbG9hZGVkKGkpKSB7CiAJCQlzdGF0dXMgPSBBRV9OT1RfRVhJU1Q7CisJCQkodm9pZClhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTQ3MSwxMCArNDM2LDExIEBACiAKIAkJc3RhdHVzID0gYWNwaV90Yl9yZWxlYXNlX293bmVyX2lkKGkpOwogCQlhY3BpX3RiX3NldF90YWJsZV9sb2FkZWRfZmxhZyhpLCBGQUxTRSk7CisJCSh2b2lkKWFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwogCQlicmVhazsKIAl9CiAKLQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfSU5URVJQUkVURVIpOworCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3RieGZyb290LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RieGZyb290LmMKaW5kZXggYWRiNmNmYy4uMGFkYjFjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS90Ynhmcm9vdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJ4ZnJvb3QuYwpAQCAtMTQyLDcgKzE0Miw4IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMgX19pbml0IGFjcGlfZmluZF9yb290X3BvaW50ZXIoYWNwaV9waHlzaWNhbF9hZGRyZXNzICp0YWJsZV9hZGRyZXNzKQorYWNwaV9zdGF0dXMgQUNQSV9JTklUX0ZVTkNUSU9OCithY3BpX2ZpbmRfcm9vdF9wb2ludGVyKGFjcGlfcGh5c2ljYWxfYWRkcmVzcyAqdGFibGVfYWRkcmVzcykKIHsKIAl1OCAqdGFibGVfcHRyOwogCXU4ICptZW1fcm92ZXI7CkBAIC0yNDQsNiArMjQ1LDggQEAKIAlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0ZPVU5EKTsKIH0KIAorQUNQSV9FWFBPUlRfU1lNQk9MX0lOSVQoYWNwaV9maW5kX3Jvb3RfcG9pbnRlcikKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV90Yl9zY2FuX21lbW9yeV9mb3JfcnNkcApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS91dGFkZHJlc3MuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRhZGRyZXNzLmMKaW5kZXggYzk4NmVjNi4uNDMzZDgyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS91dGFkZHJlc3MuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0YWRkcmVzcy5jCkBAIC03Nyw3ICs3Nyw2IEBACiAJCQkgIHUzMiBsZW5ndGgsIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpyZWdpb25fbm9kZSkKIHsKIAlzdHJ1Y3QgYWNwaV9hZGRyZXNzX3JhbmdlICpyYW5nZV9pbmZvOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfYWRkX2FkZHJlc3NfcmFuZ2UpOwogCkBAIC05NywxMiArOTYsNiBAQAogCXJhbmdlX2luZm8tPmVuZF9hZGRyZXNzID0gKGFkZHJlc3MgKyBsZW5ndGggLSAxKTsKIAlyYW5nZV9pbmZvLT5yZWdpb25fbm9kZSA9IHJlZ2lvbl9ub2RlOwogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRlJFRShyYW5nZV9pbmZvKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCiAJcmFuZ2VfaW5mby0+bmV4dCA9IGFjcGlfZ2JsX2FkZHJlc3NfcmFuZ2VfbGlzdFtzcGFjZV9pZF07CiAJYWNwaV9nYmxfYWRkcmVzc19yYW5nZV9saXN0W3NwYWNlX2lkXSA9IHJhbmdlX2luZm87CiAKQEAgLTExMiw3ICsxMDUsNiBAQAogCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzcyksCiAJCQkgIEFDUElfRk9STUFUX1VJTlQ2NChyYW5nZV9pbmZvLT5lbmRfYWRkcmVzcykpKTsKIAotCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwogCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRidWZmZXIuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRidWZmZXIuYwppbmRleCBiZDMxZmFmLi5mZjI5ODEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0YnVmZmVyLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dGJ1ZmZlci5jCkBAIC0yMzksOCArMjM5LDcgQEAKIAl1OCBidWZfY2hhcjsKIAogCWlmICghYnVmZmVyKSB7Ci0JCWFjcGlfdXRfZmlsZV9wcmludGYoZmlsZSwKLQkJCQkgICAgIk51bGwgQnVmZmVyIFBvaW50ZXIgaW4gRHVtcEJ1ZmZlciFcbiIpOworCQlmcHJpbnRmKGZpbGUsICJOdWxsIEJ1ZmZlciBQb2ludGVyIGluIER1bXBCdWZmZXIhXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMjU0LDcgKzI1Myw3IEBACiAKIAkJLyogUHJpbnQgY3VycmVudCBvZmZzZXQgKi8KIAotCQlhY3BpX3V0X2ZpbGVfcHJpbnRmKGZpbGUsICIlNi40WDogIiwgKGJhc2Vfb2Zmc2V0ICsgaSkpOworCQlmcHJpbnRmKGZpbGUsICIlNi40WDogIiwgKGJhc2Vfb2Zmc2V0ICsgaSkpOwogCiAJCS8qIFByaW50IDE2IGhleCBjaGFycyAqLwogCkBAIC0yNjMsOCArMjYyLDcgQEAKIAogCQkJCS8qIER1bXAgZmlsbCBzcGFjZXMgKi8KIAotCQkJCWFjcGlfdXRfZmlsZV9wcmludGYoZmlsZSwgIiUqcyIsCi0JCQkJCQkgICAgKChkaXNwbGF5ICogMikgKyAxKSwgIiAiKTsKKwkJCQlmcHJpbnRmKGZpbGUsICIlKnMiLCAoKGRpc3BsYXkgKiAyKSArIDEpLCAiICIpOwogCQkJCWogKz0gZGlzcGxheTsKIAkJCQljb250aW51ZTsKIAkJCX0KQEAgLTI3MywzNCArMjcxLDM0IEBACiAJCQljYXNlIERCX0JZVEVfRElTUExBWToKIAkJCWRlZmF1bHQ6CS8qIERlZmF1bHQgaXMgQllURSBkaXNwbGF5ICovCiAKLQkJCQlhY3BpX3V0X2ZpbGVfcHJpbnRmKGZpbGUsICIlMDJYICIsCi0JCQkJCQkgICAgYnVmZmVyWyhhY3BpX3NpemUpaSArIGpdKTsKKwkJCQlmcHJpbnRmKGZpbGUsICIlMDJYICIsCisJCQkJCWJ1ZmZlclsoYWNwaV9zaXplKWkgKyBqXSk7CiAJCQkJYnJlYWs7CiAKIAkJCWNhc2UgREJfV09SRF9ESVNQTEFZOgogCiAJCQkJQUNQSV9NT1ZFXzE2X1RPXzMyKCZ0ZW1wMzIsCiAJCQkJCQkgICAmYnVmZmVyWyhhY3BpX3NpemUpaSArIGpdKTsKLQkJCQlhY3BpX3V0X2ZpbGVfcHJpbnRmKGZpbGUsICIlMDRYICIsIHRlbXAzMik7CisJCQkJZnByaW50ZihmaWxlLCAiJTA0WCAiLCB0ZW1wMzIpOwogCQkJCWJyZWFrOwogCiAJCQljYXNlIERCX0RXT1JEX0RJU1BMQVk6CiAKIAkJCQlBQ1BJX01PVkVfMzJfVE9fMzIoJnRlbXAzMiwKIAkJCQkJCSAgICZidWZmZXJbKGFjcGlfc2l6ZSlpICsgal0pOwotCQkJCWFjcGlfdXRfZmlsZV9wcmludGYoZmlsZSwgIiUwOFggIiwgdGVtcDMyKTsKKwkJCQlmcHJpbnRmKGZpbGUsICIlMDhYICIsIHRlbXAzMik7CiAJCQkJYnJlYWs7CiAKIAkJCWNhc2UgREJfUVdPUkRfRElTUExBWToKIAogCQkJCUFDUElfTU9WRV8zMl9UT18zMigmdGVtcDMyLAogCQkJCQkJICAgJmJ1ZmZlclsoYWNwaV9zaXplKWkgKyBqXSk7Ci0JCQkJYWNwaV91dF9maWxlX3ByaW50ZihmaWxlLCAiJTA4WCIsIHRlbXAzMik7CisJCQkJZnByaW50ZihmaWxlLCAiJTA4WCIsIHRlbXAzMik7CiAKIAkJCQlBQ1BJX01PVkVfMzJfVE9fMzIoJnRlbXAzMiwKIAkJCQkJCSAgICZidWZmZXJbKGFjcGlfc2l6ZSlpICsgaiArCiAJCQkJCQkJICAgNF0pOwotCQkJCWFjcGlfdXRfZmlsZV9wcmludGYoZmlsZSwgIiUwOFggIiwgdGVtcDMyKTsKKwkJCQlmcHJpbnRmKGZpbGUsICIlMDhYICIsIHRlbXAzMik7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTMxMSwyNCArMzA5LDI0IEBACiAJCSAqIFByaW50IHRoZSBBU0NJSSBlcXVpdmFsZW50IGNoYXJhY3RlcnMgYnV0IHdhdGNoIG91dCBmb3IgdGhlIGJhZAogCQkgKiB1bnByaW50YWJsZSBvbmVzIChwcmludGFibGUgY2hhcnMgYXJlIDB4MjAgdGhyb3VnaCAweDdFKQogCQkgKi8KLQkJYWNwaV91dF9maWxlX3ByaW50ZihmaWxlLCAiICIpOworCQlmcHJpbnRmKGZpbGUsICIgIik7CiAJCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7CiAJCQlpZiAoaSArIGogPj0gY291bnQpIHsKLQkJCQlhY3BpX3V0X2ZpbGVfcHJpbnRmKGZpbGUsICJcbiIpOworCQkJCWZwcmludGYoZmlsZSwgIlxuIik7CiAJCQkJcmV0dXJuOwogCQkJfQogCiAJCQlidWZfY2hhciA9IGJ1ZmZlclsoYWNwaV9zaXplKWkgKyBqXTsKIAkJCWlmIChpc3ByaW50KGJ1Zl9jaGFyKSkgewotCQkJCWFjcGlfdXRfZmlsZV9wcmludGYoZmlsZSwgIiVjIiwgYnVmX2NoYXIpOworCQkJCWZwcmludGYoZmlsZSwgIiVjIiwgYnVmX2NoYXIpOwogCQkJfSBlbHNlIHsKLQkJCQlhY3BpX3V0X2ZpbGVfcHJpbnRmKGZpbGUsICIuIik7CisJCQkJZnByaW50ZihmaWxlLCAiLiIpOwogCQkJfQogCQl9CiAKIAkJLyogRG9uZSB3aXRoIHRoYXQgbGluZS4gKi8KIAotCQlhY3BpX3V0X2ZpbGVfcHJpbnRmKGZpbGUsICJcbiIpOworCQlmcHJpbnRmKGZpbGUsICJcbiIpOwogCQlpICs9IDE2OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS91dGRlYnVnLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0ZGVidWcuYwppbmRleCA1NzQ0MjIyLi4wNDRkZjliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0ZGVidWcuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0ZGVidWcuYwpAQCAtNTYyLDYgKzU2Miw0MyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3N0cl9leGl0CisgKgorICogUEFSQU1FVEVSUzogIGxpbmVfbnVtYmVyICAgICAgICAgLSBDYWxsZXIncyBsaW5lIG51bWJlcgorICogICAgICAgICAgICAgIGZ1bmN0aW9uX25hbWUgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQorICogICAgICAgICAgICAgIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZQorICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKKyAqICAgICAgICAgICAgICBzdHJpbmcgICAgICAgICAgICAgIC0gU3RyaW5nIHRvIGRpc3BsYXkKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBGdW5jdGlvbiBleGl0IHRyYWNlLiBQcmludHMgb25seSBpZiBUUkFDRV9GVU5DVElPTlMgYml0IGlzCisgKiAgICAgICAgICAgICAgc2V0IGluIGRlYnVnX2xldmVsLiBQcmludHMgZXhpdCB2YWx1ZSBhbHNvLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQKK2FjcGlfdXRfc3RyX2V4aXQodTMyIGxpbmVfbnVtYmVyLAorCQkgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKKwkJIGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgY29tcG9uZW50X2lkLCBjb25zdCBjaGFyICpzdHJpbmcpCit7CisKKwkvKiBDaGVjayBpZiBlbmFibGVkIHVwLWZyb250IGZvciBwZXJmb3JtYW5jZSAqLworCisJaWYgKEFDUElfSVNfREVCVUdfRU5BQkxFRChBQ1BJX0xWX0ZVTkNUSU9OUywgY29tcG9uZW50X2lkKSkgeworCQlhY3BpX2RlYnVnX3ByaW50KEFDUElfTFZfRlVOQ1RJT05TLAorCQkJCSBsaW5lX251bWJlciwgZnVuY3Rpb25fbmFtZSwgbW9kdWxlX25hbWUsCisJCQkJIGNvbXBvbmVudF9pZCwgIiVzICVzXG4iLAorCQkJCSBhY3BpX2dibF9mdW5jdGlvbl9leGl0X3ByZWZpeCwgc3RyaW5nKTsKKwl9CisKKwlpZiAoYWNwaV9nYmxfbmVzdGluZ19sZXZlbCkgeworCQlhY3BpX2dibF9uZXN0aW5nX2xldmVsLS07CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RyYWNlX3BvaW50CiAgKgogICogUEFSQU1FVEVSUzogIHR5cGUgICAgICAgICAgICAgICAgLSBUcmFjZSBldmVudCB0eXBlCkBAIC01OTEsMjcgKzYyOCwzIEBACiAKIEFDUElfRVhQT1JUX1NZTUJPTChhY3BpX3RyYWNlX3BvaW50KQogI2VuZGlmCi0jaWZkZWYgQUNQSV9BUFBMSUNBVElPTgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9sb2dfZXJyb3IKLSAqCi0gKiBQQVJBTUVURVJTOiAgZm9ybWF0ICAgICAgICAgICAgICAtIFByaW50ZiBmb3JtYXQgZmllbGQKLSAqICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgIC0gT3B0aW9uYWwgcHJpbnRmIGFyZ3VtZW50cwotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IFByaW50IGVycm9yIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUsIHVzZWQgYnkgYXBwbGljYXRpb25zLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEFDUElfSU5URVJOQUxfVkFSX1hGQUNFIGFjcGlfbG9nX2Vycm9yKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotewotCXZhX2xpc3QgYXJnczsKLQotCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7Ci0JKHZvaWQpYWNwaV91dF9maWxlX3ZwcmludGYoQUNQSV9GSUxFX0VSUiwgZm9ybWF0LCBhcmdzKTsKLQl2YV9lbmQoYXJncyk7Ci19Ci0KLUFDUElfRVhQT1JUX1NZTUJPTChhY3BpX2xvZ19lcnJvcikKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS91dGRlY29kZS5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dGRlY29kZS5jCmluZGV4IGVmZDc5ODguLjE1NzI4YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRkZWNvZGUuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0ZGVjb2RlLmMKQEAgLTI1Myw3ICsyNTMsNyBAQAogCQlyZXR1cm5fUFRSKCJJbnZhbGlkIG9iamVjdCIpOwogCX0KIAotCXJldHVybl9QVFIoYWNwaV91dF9nZXRfdHlwZV9uYW1lKG9ial9kZXNjLT5jb21tb24udHlwZSkpOworCXJldHVybl9TVFIoYWNwaV91dF9nZXRfdHlwZV9uYW1lKG9ial9kZXNjLT5jb21tb24udHlwZSkpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS91dGhleC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dGhleC5jCmluZGV4IDQzNTRmYjguLjM2ZDJmYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRoZXguYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0aGV4LmMKQEAgLTc1LDkgKzc1LDQxIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfYXNjaWlfdG9faGV4X2J5dGUKKyAqCisgKiBQQVJBTUVURVJTOiAgdHdvX2FzY2lpX2NoYXJzICAgICAgICAgICAgIC0gUG9pbnRlciB0byB0d28gQVNDSUkgY2hhcmFjdGVycworICogICAgICAgICAgICAgIHJldHVybl9ieXRlICAgICAgICAgICAgICAgICAtIFdoZXJlIGNvbnZlcnRlZCBieXRlIGlzIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cyBhbmQgY29udmVydGVkIGhleCBieXRlCisgKgorICogREVTQ1JJUFRJT046IFBlcmZvcm0gYXNjaWktdG8taGV4IHRyYW5zbGF0aW9uLCBleGFjdGx5IHR3byBBU0NJSSBjaGFyYWN0ZXJzCisgKiAgICAgICAgICAgICAgdG8gYSBzaW5nbGUgY29udmVydGVkIGJ5dGUgdmFsdWUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV91dF9hc2NpaV90b19oZXhfYnl0ZShjaGFyICp0d29fYXNjaWlfY2hhcnMsIHU4ICpyZXR1cm5fYnl0ZSkKK3sKKworCS8qIEJvdGggQVNDSUkgY2hhcmFjdGVycyBtdXN0IGJlIHZhbGlkIGhleCBkaWdpdHMgKi8KKworCWlmICghaXN4ZGlnaXQoKGludCl0d29fYXNjaWlfY2hhcnNbMF0pIHx8CisJICAgICFpc3hkaWdpdCgoaW50KXR3b19hc2NpaV9jaGFyc1sxXSkpIHsKKwkJcmV0dXJuIChBRV9CQURfSEVYX0NPTlNUQU5UKTsKKwl9CisKKwkqcmV0dXJuX2J5dGUgPQorCSAgICBhY3BpX3V0X2FzY2lpX2NoYXJfdG9faGV4KHR3b19hc2NpaV9jaGFyc1sxXSkgfAorCSAgICAoYWNwaV91dF9hc2NpaV9jaGFyX3RvX2hleCh0d29fYXNjaWlfY2hhcnNbMF0pIDw8IDQpOworCisJcmV0dXJuIChBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfYXNjaWlfY2hhcl90b19oZXgKICAqCi0gKiBQQVJBTUVURVJTOiAgaGV4X2NoYXIgICAgICAgICAgICAgICAgLSBIZXggY2hhcmFjdGVyIGluIEFzY2lpCisgKiBQQVJBTUVURVJTOiAgaGV4X2NoYXIgICAgICAgICAgICAgICAgLSBIZXggY2hhcmFjdGVyIGluIEFzY2lpLiBNdXN0IGJlOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC05IG9yIEEtRiBvciBhLWYKICAqCiAgKiBSRVRVUk46ICAgICAgVGhlIGJpbmFyeSB2YWx1ZSBvZiB0aGUgYXNjaWkvaGV4IGNoYXJhY3RlcgogICoKQEAgLTg4LDEzICsxMjAsMTkgQEAKIHU4IGFjcGlfdXRfYXNjaWlfY2hhcl90b19oZXgoaW50IGhleF9jaGFyKQogewogCi0JaWYgKGhleF9jaGFyIDw9IDB4MzkpIHsKLQkJcmV0dXJuICgodTgpKGhleF9jaGFyIC0gMHgzMCkpOworCS8qIFZhbHVlcyAwLTkgKi8KKworCWlmIChoZXhfY2hhciA8PSAnOScpIHsKKwkJcmV0dXJuICgodTgpKGhleF9jaGFyIC0gJzAnKSk7CiAJfQogCi0JaWYgKGhleF9jaGFyIDw9IDB4NDYpIHsKKwkvKiBVcHBlciBjYXNlIEEtRiAqLworCisJaWYgKGhleF9jaGFyIDw9ICdGJykgewogCQlyZXR1cm4gKCh1OCkoaGV4X2NoYXIgLSAweDM3KSk7CiAJfQogCisJLyogTG93ZXIgY2FzZSBhLWYgKi8KKwogCXJldHVybiAoKHU4KShoZXhfY2hhciAtIDB4NTcpKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRpbml0LmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0aW5pdC5jCmluZGV4IGY5MWY3MjQuLjE3MTFmZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRpbml0LmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dGluaXQuYwpAQCAtMjA2LDcgKzIwNiw3IEBACiAJYWNwaV9nYmxfbmV4dF9vd25lcl9pZF9vZmZzZXQgPSAwOwogCWFjcGlfZ2JsX2RlYnVnZ2VyX2NvbmZpZ3VyYXRpb24gPSBERUJVR0dFUl9USFJFQURJTkc7CiAJYWNwaV9nYmxfb3NpX211dGV4ID0gTlVMTDsKLQlhY3BpX2dibF9tYXhfbG9vcF9pdGVyYXRpb25zID0gMHhGRkZGOworCWFjcGlfZ2JsX21heF9sb29wX2l0ZXJhdGlvbnMgPSBBQ1BJX01BWF9MT09QX0NPVU5UOwogCiAJLyogSGFyZHdhcmUgb3JpZW50ZWQgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS91dG5vbmFuc2kuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRub25hbnNpLmMKaW5kZXggMzQ2NWZlMi4uMjUxNDIzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS91dG5vbmFuc2kuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0bm9uYW5zaS5jCkBAIC00OCw4ICs0OCw4IEBACiBBQ1BJX01PRFVMRV9OQU1FKCJ1dG5vbmFuc2kiKQogCiAvKgotICogTm9uLUFOU0kgQyBsaWJyYXJ5IGZ1bmN0aW9ucyAtIHN0cmx3ciwgc3RydXByLCBzdHJpY21wLCBhbmQgYSA2NC1iaXQKLSAqIHZlcnNpb24gb2Ygc3RydG91bC4KKyAqIE5vbi1BTlNJIEMgbGlicmFyeSBmdW5jdGlvbnMgLSBzdHJsd3IsIHN0cnVwciwgc3RyaWNtcCwgYW5kICJzYWZlIgorICogc3RyaW5nIGZ1bmN0aW9ucy4KICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yMDAsMzU2ICsyMDAsMyBAQAogCXJldHVybiAoRkFMU0UpOwogfQogI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfc3RydG91bDY0Ci0gKgotICogUEFSQU1FVEVSUzogIHN0cmluZyAgICAgICAgICAgICAgICAgIC0gTnVsbCB0ZXJtaW5hdGVkIHN0cmluZwotICogICAgICAgICAgICAgIGJhc2UgICAgICAgICAgICAgICAgICAgIC0gUmFkaXggb2YgdGhlIHN0cmluZzogMTYgb3IgMTAgb3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDUElfQU5ZX0JBU0UKLSAqICAgICAgICAgICAgICBtYXhfaW50ZWdlcl9ieXRlX3dpZHRoICAtIE1heGltdW0gYWxsb3dhYmxlIGludGVnZXIsaW4gYnl0ZXM6Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0IG9yIDggKDMyIG9yIDY0IGJpdHMpCi0gKiAgICAgICAgICAgICAgcmV0X2ludGVnZXIgICAgICAgICAgICAgLSBXaGVyZSB0aGUgY29udmVydGVkIGludGVnZXIgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cyBhbmQgQ29udmVydGVkIHZhbHVlCi0gKgotICogREVTQ1JJUFRJT046IENvbnZlcnQgYSBzdHJpbmcgaW50byBhbiB1bnNpZ25lZCB2YWx1ZS4gUGVyZm9ybXMgZWl0aGVyIGEKLSAqICAgICAgICAgICAgICAzMi1iaXQgb3IgNjQtYml0IGNvbnZlcnNpb24sIGRlcGVuZGluZyBvbiB0aGUgaW5wdXQgaW50ZWdlcgotICogICAgICAgICAgICAgIHNpemUgKG9mdGVuIHRoZSBjdXJyZW50IG1vZGUgb2YgdGhlIGludGVycHJldGVyKS4KLSAqCi0gKiBOT1RFUzogICAgICAgTmVnYXRpdmUgbnVtYmVycyBhcmUgbm90IHN1cHBvcnRlZCwgYXMgdGhleSBhcmUgbm90IHN1cHBvcnRlZAotICogICAgICAgICAgICAgIGJ5IEFDUEkuCi0gKgotICogICAgICAgICAgICAgIGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCBzaG91bGQgYmUgc2V0IHRvIHRoZSBwcm9wZXIgd2lkdGguCi0gKiAgICAgICAgICAgICAgRm9yIHRoZSBjb3JlIEFDUElDQSBjb2RlLCB0aGlzIHdpZHRoIGRlcGVuZHMgb24gdGhlIERTRFQKLSAqICAgICAgICAgICAgICB2ZXJzaW9uLiBGb3IgaUFTTCwgdGhlIGRlZmF1bHQgYnl0ZSB3aWR0aCBpcyBhbHdheXMgOCBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgcGFyc2VyLCBidXQgZXJyb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkIGxhdGVyIHRvIGZsYWcgY2FzZXMKLSAqICAgICAgICAgICAgICB3aGVyZSBhIDY0LWJpdCBjb25zdGFudCBpcyBkZWZpbmVkIGluIGEgMzItYml0IERTRFQvU1NEVC4KLSAqCi0gKiAgICAgICAgICAgICAgRG9lcyBub3Qgc3VwcG9ydCBPY3RhbCBzdHJpbmdzLCBub3QgbmVlZGVkIGF0IHRoaXMgdGltZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF9zdHJ0b3VsNjQoY2hhciAqc3RyaW5nLAotCQkgIHUzMiBiYXNlLCB1MzIgbWF4X2ludGVnZXJfYnl0ZV93aWR0aCwgdTY0ICpyZXRfaW50ZWdlcikKLXsKLQl1MzIgdGhpc19kaWdpdCA9IDA7Ci0JdTY0IHJldHVybl92YWx1ZSA9IDA7Ci0JdTY0IHF1b3RpZW50OwotCXU2NCBkaXZpZGVuZDsKLQl1OCB2YWxpZF9kaWdpdHMgPSAwOwotCXU4IHNpZ25fb2YweCA9IDA7Ci0JdTggdGVybSA9IDA7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUih1dF9zdHJ0b3VsNjQsIHN0cmluZyk7Ci0KLQlzd2l0Y2ggKGJhc2UpIHsKLQljYXNlIEFDUElfQU5ZX0JBU0U6Ci0JY2FzZSAxMDoKLQljYXNlIDE2OgotCi0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQotCQkvKiBJbnZhbGlkIEJhc2UgKi8KLQotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JaWYgKCFzdHJpbmcpIHsKLQkJZ290byBlcnJvcl9leGl0OwotCX0KLQotCS8qIFNraXAgb3ZlciBhbnkgd2hpdGUgc3BhY2UgaW4gdGhlIGJ1ZmZlciAqLwotCi0Jd2hpbGUgKCgqc3RyaW5nKSAmJiAoaXNzcGFjZSgoaW50KSpzdHJpbmcpIHx8ICpzdHJpbmcgPT0gJ1x0JykpIHsKLQkJc3RyaW5nKys7Ci0JfQotCi0JaWYgKGJhc2UgPT0gQUNQSV9BTllfQkFTRSkgewotCQkvKgotCQkgKiBCYXNlIGVxdWFsIHRvIEFDUElfQU5ZX0JBU0UgbWVhbnMgJ0VpdGhlciBkZWNpbWFsIG9yIGhleCcuCi0JCSAqIFdlIG5lZWQgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGRlY2ltYWwgb3IgaGV4YWRlY2ltYWwuCi0JCSAqLwotCQlpZiAoKCpzdHJpbmcgPT0gJzAnKSAmJiAodG9sb3dlcigoaW50KSooc3RyaW5nICsgMSkpID09ICd4JykpIHsKLQkJCXNpZ25fb2YweCA9IDE7Ci0JCQliYXNlID0gMTY7Ci0KLQkJCS8qIFNraXAgb3ZlciB0aGUgbGVhZGluZyAnMHgnICovCi0JCQlzdHJpbmcgKz0gMjsKLQkJfSBlbHNlIHsKLQkJCWJhc2UgPSAxMDsKLQkJfQotCX0KLQotCS8qIEFueSBzdHJpbmcgbGVmdD8gQ2hlY2sgdGhhdCAnMHgnIGlzIG5vdCBmb2xsb3dlZCBieSB3aGl0ZSBzcGFjZS4gKi8KLQotCWlmICghKCpzdHJpbmcpIHx8IGlzc3BhY2UoKGludCkqc3RyaW5nKSB8fCAqc3RyaW5nID09ICdcdCcpIHsKLQkJaWYgKGJhc2UgPT0gQUNQSV9BTllfQkFTRSkgewotCQkJZ290byBlcnJvcl9leGl0OwotCQl9IGVsc2UgewotCQkJZ290byBhbGxfZG9uZTsKLQkJfQotCX0KLQotCS8qCi0JICogUGVyZm9ybSBhIDMyLWJpdCBvciA2NC1iaXQgY29udmVyc2lvbiwgZGVwZW5kaW5nIHVwb24gdGhlIGlucHV0Ci0JICogYnl0ZSB3aWR0aAotCSAqLwotCWRpdmlkZW5kID0gKG1heF9pbnRlZ2VyX2J5dGVfd2lkdGggPD0gQUNQSV9NQVgzMl9CWVRFX1dJRFRIKSA/Ci0JICAgIEFDUElfVUlOVDMyX01BWCA6IEFDUElfVUlOVDY0X01BWDsKLQotCS8qIE1haW4gbG9vcDogY29udmVydCB0aGUgc3RyaW5nIHRvIGEgMzItIG9yIDY0LWJpdCBpbnRlZ2VyICovCi0KLQl3aGlsZSAoKnN0cmluZykgewotCQlpZiAoaXNkaWdpdCgoaW50KSpzdHJpbmcpKSB7Ci0KLQkJCS8qIENvbnZlcnQgQVNDSUkgMC05IHRvIERlY2ltYWwgdmFsdWUgKi8KLQotCQkJdGhpc19kaWdpdCA9ICgodTgpKnN0cmluZykgLSAnMCc7Ci0JCX0gZWxzZSBpZiAoYmFzZSA9PSAxMCkgewotCi0JCQkvKiBEaWdpdCBpcyBvdXQgb2YgcmFuZ2U7IHBvc3NpYmxlIGluIHRvX2ludGVnZXIgY2FzZSBvbmx5ICovCi0KLQkJCXRlcm0gPSAxOwotCQl9IGVsc2UgewotCQkJdGhpc19kaWdpdCA9ICh1OCl0b3VwcGVyKChpbnQpKnN0cmluZyk7Ci0JCQlpZiAoaXN4ZGlnaXQoKGludCl0aGlzX2RpZ2l0KSkgewotCi0JCQkJLyogQ29udmVydCBBU0NJSSBIZXggY2hhciB0byB2YWx1ZSAqLwotCi0JCQkJdGhpc19kaWdpdCA9IHRoaXNfZGlnaXQgLSAnQScgKyAxMDsKLQkJCX0gZWxzZSB7Ci0JCQkJdGVybSA9IDE7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGVybSkgewotCQkJaWYgKGJhc2UgPT0gQUNQSV9BTllfQkFTRSkgewotCQkJCWdvdG8gZXJyb3JfZXhpdDsKLQkJCX0gZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoKHZhbGlkX2RpZ2l0cyA9PSAwKSAmJiAodGhpc19kaWdpdCA9PSAwKQotCQkJICAgJiYgIXNpZ25fb2YweCkgewotCi0JCQkvKiBTa2lwIHplcm9zICovCi0JCQlzdHJpbmcrKzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJdmFsaWRfZGlnaXRzKys7Ci0KLQkJaWYgKHNpZ25fb2YweCAmJiAoKHZhbGlkX2RpZ2l0cyA+IDE2KSB8fAotCQkJCSAgKCh2YWxpZF9kaWdpdHMgPiA4KQotCQkJCSAgICYmIChtYXhfaW50ZWdlcl9ieXRlX3dpZHRoIDw9Ci0JCQkJICAgICAgIEFDUElfTUFYMzJfQllURV9XSURUSCkpKSkgewotCQkJLyoKLQkJCSAqIFRoaXMgaXMgdG9faW50ZWdlciBvcGVyYXRpb24gY2FzZS4KLQkJCSAqIE5vIHJlc3RyaWN0aW9ucyBmb3Igc3RyaW5nLXRvLWludGVnZXIgY29udmVyc2lvbiwKLQkJCSAqIHNlZSBBQ1BJIHNwZWMuCi0JCQkgKi8KLQkJCWdvdG8gZXJyb3JfZXhpdDsKLQkJfQotCi0JCS8qIERpdmlkZSB0aGUgZGlnaXQgaW50byB0aGUgY29ycmVjdCBwb3NpdGlvbiAqLwotCi0JCSh2b2lkKWFjcGlfdXRfc2hvcnRfZGl2aWRlKChkaXZpZGVuZCAtICh1NjQpdGhpc19kaWdpdCksIGJhc2UsCi0JCQkJCSAgICZxdW90aWVudCwgTlVMTCk7Ci0KLQkJaWYgKHJldHVybl92YWx1ZSA+IHF1b3RpZW50KSB7Ci0JCQlpZiAoYmFzZSA9PSBBQ1BJX0FOWV9CQVNFKSB7Ci0JCQkJZ290byBlcnJvcl9leGl0OwotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybl92YWx1ZSAqPSBiYXNlOwotCQlyZXR1cm5fdmFsdWUgKz0gdGhpc19kaWdpdDsKLQkJc3RyaW5nKys7Ci0JfQotCi0JLyogQWxsIGRvbmUsIG5vcm1hbCBleGl0ICovCi0KLWFsbF9kb25lOgotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiQ29udmVydGVkIHZhbHVlOiAlOC44WCU4LjhYXG4iLAotCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQocmV0dXJuX3ZhbHVlKSkpOwotCi0JKnJldF9pbnRlZ2VyID0gcmV0dXJuX3ZhbHVlOwotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0KLWVycm9yX2V4aXQ6Ci0KLQkvKiBCYXNlIHdhcyBzZXQvdmFsaWRhdGVkIGFib3ZlICgxMCBvciAxNikgKi8KLQotCWlmIChiYXNlID09IDEwKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfREVDSU1BTF9DT05TVEFOVCk7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9IRVhfQ09OU1RBTlQpOwotCX0KLX0KLQotI2lmZGVmIF9PQlNPTEVURV9GVU5DVElPTlMKLS8qIFJlbW92ZWQ6IDAxLzIwMTYgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgc3RydG91bDY0Ci0gKgotICogUEFSQU1FVEVSUzogIHN0cmluZyAgICAgICAgICAgICAgLSBOdWxsIHRlcm1pbmF0ZWQgc3RyaW5nCi0gKiAgICAgICAgICAgICAgdGVybWluYXRlciAgICAgICAgICAtIFdoZXJlIGEgcG9pbnRlciB0byB0aGUgdGVybWluYXRpbmcgYnl0ZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyByZXR1cm5lZAotICogICAgICAgICAgICAgIGJhc2UgICAgICAgICAgICAgICAgLSBSYWRpeCBvZiB0aGUgc3RyaW5nCi0gKgotICogUkVUVVJOOiAgICAgIENvbnZlcnRlZCB2YWx1ZQotICoKLSAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IGEgc3RyaW5nIGludG8gYW4gdW5zaWduZWQgdmFsdWUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgc3RydG91bDY0KGNoYXIgKnN0cmluZywgdTMyIGJhc2UsIHU2NCAqcmV0X2ludGVnZXIpCi17Ci0JdTMyIGluZGV4OwotCXUzMiBzaWduOwotCXU2NCByZXR1cm5fdmFsdWUgPSAwOwotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCi0JKnJldF9pbnRlZ2VyID0gMDsKLQotCXN3aXRjaCAoYmFzZSkgewotCWNhc2UgMDoKLQljYXNlIDg6Ci0JY2FzZSAxMDoKLQljYXNlIDE2OgotCi0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJLyoKLQkJICogVGhlIHNwZWNpZmllZCBCYXNlIHBhcmFtZXRlciBpcyBub3QgaW4gdGhlIGRvbWFpbiBvZgotCQkgKiB0aGlzIGZ1bmN0aW9uOgotCQkgKi8KLQkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQkvKiBTa2lwIG92ZXIgYW55IHdoaXRlIHNwYWNlIGluIHRoZSBidWZmZXI6ICovCi0KLQl3aGlsZSAoaXNzcGFjZSgoaW50KSpzdHJpbmcpIHx8ICpzdHJpbmcgPT0gJ1x0JykgewotCQkrK3N0cmluZzsKLQl9Ci0KLQkvKgotCSAqIFRoZSBidWZmZXIgbWF5IGNvbnRhaW4gYW4gb3B0aW9uYWwgcGx1cyBvciBtaW51cyBzaWduLgotCSAqIElmIGl0IGRvZXMsIHRoZW4gc2tpcCBvdmVyIGl0IGJ1dCByZW1lbWJlciB3aGF0IGlzIHdhczoKLQkgKi8KLQlpZiAoKnN0cmluZyA9PSAnLScpIHsKLQkJc2lnbiA9IEFDUElfU0lHTl9ORUdBVElWRTsKLQkJKytzdHJpbmc7Ci0JfSBlbHNlIGlmICgqc3RyaW5nID09ICcrJykgewotCQkrK3N0cmluZzsKLQkJc2lnbiA9IEFDUElfU0lHTl9QT1NJVElWRTsKLQl9IGVsc2UgewotCQlzaWduID0gQUNQSV9TSUdOX1BPU0lUSVZFOwotCX0KLQotCS8qCi0JICogSWYgdGhlIGlucHV0IHBhcmFtZXRlciBCYXNlIGlzIHplcm8sIHRoZW4gd2UgbmVlZCB0bwotCSAqIGRldGVybWluZSBpZiBpdCBpcyBvY3RhbCwgZGVjaW1hbCwgb3IgaGV4YWRlY2ltYWw6Ci0JICovCi0JaWYgKGJhc2UgPT0gMCkgewotCQlpZiAoKnN0cmluZyA9PSAnMCcpIHsKLQkJCWlmICh0b2xvd2VyKChpbnQpKigrK3N0cmluZykpID09ICd4JykgewotCQkJCWJhc2UgPSAxNjsKLQkJCQkrK3N0cmluZzsKLQkJCX0gZWxzZSB7Ci0JCQkJYmFzZSA9IDg7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQliYXNlID0gMTA7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEZvciBvY3RhbCBhbmQgaGV4YWRlY2ltYWwgYmFzZXMsIHNraXAgb3ZlciB0aGUgbGVhZGluZwotCSAqIDAgb3IgMHgsIGlmIHRoZXkgYXJlIHByZXNlbnQuCi0JICovCi0JaWYgKGJhc2UgPT0gOCAmJiAqc3RyaW5nID09ICcwJykgewotCQlzdHJpbmcrKzsKLQl9Ci0KLQlpZiAoYmFzZSA9PSAxNiAmJiAqc3RyaW5nID09ICcwJyAmJiB0b2xvd2VyKChpbnQpKigrK3N0cmluZykpID09ICd4JykgewotCQlzdHJpbmcrKzsKLQl9Ci0KLQkvKiBNYWluIGxvb3A6IGNvbnZlcnQgdGhlIHN0cmluZyB0byBhbiB1bnNpZ25lZCBsb25nICovCi0KLQl3aGlsZSAoKnN0cmluZykgewotCQlpZiAoaXNkaWdpdCgoaW50KSpzdHJpbmcpKSB7Ci0JCQlpbmRleCA9ICgodTgpKnN0cmluZykgLSAnMCc7Ci0JCX0gZWxzZSB7Ci0JCQlpbmRleCA9ICh1OCl0b3VwcGVyKChpbnQpKnN0cmluZyk7Ci0JCQlpZiAoaXN1cHBlcigoaW50KWluZGV4KSkgewotCQkJCWluZGV4ID0gaW5kZXggLSAnQScgKyAxMDsKLQkJCX0gZWxzZSB7Ci0JCQkJZ290byBlcnJvcl9leGl0OwotCQkJfQotCQl9Ci0KLQkJaWYgKGluZGV4ID49IGJhc2UpIHsKLQkJCWdvdG8gZXJyb3JfZXhpdDsKLQkJfQotCi0JCS8qIENoZWNrIHRvIHNlZSBpZiB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2U6ICovCi0KLQkJaWYgKHJldHVybl92YWx1ZSA+ICgoQUNQSV9VSU5UNjRfTUFYIC0gKHU2NClpbmRleCkgLyAodTY0KWJhc2UpKSB7Ci0JCQlnb3RvIGVycm9yX2V4aXQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm5fdmFsdWUgKj0gYmFzZTsKLQkJCXJldHVybl92YWx1ZSArPSBpbmRleDsKLQkJfQotCi0JCSsrc3RyaW5nOwotCX0KLQotCS8qIElmIGEgbWludXMgc2lnbiB3YXMgcHJlc2VudCwgdGhlbiAidGhlIGNvbnZlcnNpb24gaXMgbmVnYXRlZCI6ICovCi0KLQlpZiAoc2lnbiA9PSBBQ1BJX1NJR05fTkVHQVRJVkUpIHsKLQkJcmV0dXJuX3ZhbHVlID0gKEFDUElfVUlOVDMyX01BWCAtIHJldHVybl92YWx1ZSkgKyAxOwotCX0KLQotCSpyZXRfaW50ZWdlciA9IHJldHVybl92YWx1ZTsKLQlyZXR1cm4gKHN0YXR1cyk7Ci0KLWVycm9yX2V4aXQ6Ci0Jc3dpdGNoIChiYXNlKSB7Ci0JY2FzZSA4OgotCi0JCXN0YXR1cyA9IEFFX0JBRF9PQ1RBTF9DT05TVEFOVDsKLQkJYnJlYWs7Ci0KLQljYXNlIDEwOgotCi0JCXN0YXR1cyA9IEFFX0JBRF9ERUNJTUFMX0NPTlNUQU5UOwotCQlicmVhazsKLQotCWNhc2UgMTY6Ci0KLQkJc3RhdHVzID0gQUVfQkFEX0hFWF9DT05TVEFOVDsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCi0JCS8qIEJhc2UgdmFsaWRhdGVkIGFib3ZlICovCi0KLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIChzdGF0dXMpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0b3NpLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0b3NpLmMKaW5kZXggM2Y1ZmVkNi4uZjA0ODRiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS91dG9zaS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRvc2kuYwpAQCAtMzkwLDExICszOTAsMjIgQEAKICAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cworICogICAgICAgICAgICAgIEludGVnZXI6IFRSVUUgKDApIGlmIGlucHV0IHN0cmluZyBpcyBtYXRjaGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgKC0xKSBpZiBzdHJpbmcgaXMgbm90IG1hdGNoZWQKICAqCiAgKiBERVNDUklQVElPTjogSW1wbGVtZW50YXRpb24gb2YgdGhlIF9PU0kgcHJlZGVmaW5lZCBjb250cm9sIG1ldGhvZC4gV2hlbgogICogICAgICAgICAgICAgIGFuIGludm9jYXRpb24gb2YgX09TSSBpcyBlbmNvdW50ZXJlZCBpbiB0aGUgc3lzdGVtIEFNTCwKICAqICAgICAgICAgICAgICBjb250cm9sIGlzIHRyYW5zZmVycmVkIHRvIHRoaXMgZnVuY3Rpb24uCiAgKgorICogKEF1Z3VzdCAyMDE2KQorICogTm90ZTogIF9PU0kgaXMgbm93IGRlZmluZWQgdG8gcmV0dXJuICJPbmVzIiB0byBpbmRpY2F0ZSBhIG1hdGNoLCBmb3IKKyAqIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBBQ1BJIGltcGxlbWVudGF0aW9ucy4gT24gYSAzMi1iaXQgRFNEVCwgT25lcworICogaXMgMHhGRkZGRkZGRi4gT24gYSA2NC1iaXQgRFNEVCwgT25lcyBpcyAweEZGRkZGRkZGRkZGRkZGRkYKKyAqIChBQ1BJX1VJTlQ2NF9NQVgpLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgQUNQSV9VSU5UNjRfTUFYIGZvciBUUlVFLCBhbmQgbGF0ZXIgY29kZQorICogd2lsbCB0cnVuY2F0ZSB0aGlzIHRvIDMyIGJpdHMgaWYgbmVjZXNzYXJ5LgorICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzIGFjcGlfdXRfb3NpX2ltcGxlbWVudGF0aW9uKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCkBAIC00MDQsNyArNDE1LDcgQEAKIAlzdHJ1Y3QgYWNwaV9pbnRlcmZhY2VfaW5mbyAqaW50ZXJmYWNlX2luZm87CiAJYWNwaV9pbnRlcmZhY2VfaGFuZGxlciBpbnRlcmZhY2VfaGFuZGxlcjsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JdTMyIHJldHVybl92YWx1ZTsKKwl1NjQgcmV0dXJuX3ZhbHVlOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9vc2lfaW1wbGVtZW50YXRpb24pOwogCkBAIC00NDQsNyArNDU1LDcgQEAKIAkJCWFjcGlfZ2JsX29zaV9kYXRhID0gaW50ZXJmYWNlX2luZm8tPnZhbHVlOwogCQl9CiAKLQkJcmV0dXJuX3ZhbHVlID0gQUNQSV9VSU5UMzJfTUFYOworCQlyZXR1cm5fdmFsdWUgPSBBQ1BJX1VJTlQ2NF9NQVg7CiAJfQogCiAJYWNwaV9vc19yZWxlYXNlX211dGV4KGFjcGlfZ2JsX29zaV9tdXRleCk7CkBAIC00NTYsOSArNDY3LDEwIEBACiAJICovCiAJaW50ZXJmYWNlX2hhbmRsZXIgPSBhY3BpX2dibF9pbnRlcmZhY2VfaGFuZGxlcjsKIAlpZiAoaW50ZXJmYWNlX2hhbmRsZXIpIHsKLQkJcmV0dXJuX3ZhbHVlID0KLQkJICAgIGludGVyZmFjZV9oYW5kbGVyKHN0cmluZ19kZXNjLT5zdHJpbmcucG9pbnRlciwKLQkJCQkgICAgICByZXR1cm5fdmFsdWUpOworCQlpZiAoaW50ZXJmYWNlX2hhbmRsZXIKKwkJICAgIChzdHJpbmdfZGVzYy0+c3RyaW5nLnBvaW50ZXIsICh1MzIpcmV0dXJuX3ZhbHVlKSkgeworCQkJcmV0dXJuX3ZhbHVlID0gQUNQSV9VSU5UNjRfTUFYOworCQl9CiAJfQogCiAJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfSU5GTywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRwcmVkZWYuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRwcmVkZWYuYwppbmRleCA3NzBhMTc3Li5jZTE4MzQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0cHJlZGVmLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dHByZWRlZi5jCkBAIC0xNzYsOCArMTc2LDYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZiAoZGVmaW5lZCBBQ1BJX0FTTF9DT01QSUxFUiB8fCBkZWZpbmVkIEFDUElfSEVMUF9BUFApCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0cHJpbnQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRwcmludC5jCmluZGV4IGRkMDg0Y2YuLjQwZWJhODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRwcmludC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRwcmludC5jCkBAIC0zMzYsNyArMzM2LDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF92c25wcmludGYKKyAqIEZVTkNUSU9OOiAgICB2c25wcmludGYKICAqCiAgKiBQQVJBTUVURVJTOiAgc3RyaW5nICAgICAgICAgICAgICAtIFN0cmluZyB3aXRoIGJvdW5kYXJ5CiAgKiAgICAgICAgICAgICAgc2l6ZSAgICAgICAgICAgICAgICAtIEJvdW5kYXJ5IG9mIHRoZSBzdHJpbmcKQEAgLTM0OSw5ICszNDksNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWludAotYWNwaV91dF92c25wcmludGYoY2hhciAqc3RyaW5nLAotCQkgIGFjcGlfc2l6ZSBzaXplLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKK2ludCB2c25wcmludGYoY2hhciAqc3RyaW5nLCBhY3BpX3NpemUgc2l6ZSwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCiB7CiAJdTggYmFzZTsKIAl1OCB0eXBlOwpAQCAtNTg2LDcgKzU4NCw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfc25wcmludGYKKyAqIEZVTkNUSU9OOiAgICBzbnByaW50ZgogICoKICAqIFBBUkFNRVRFUlM6ICBzdHJpbmcgICAgICAgICAgICAgIC0gU3RyaW5nIHdpdGggYm91bmRhcnkKICAqICAgICAgICAgICAgICBzaXplICAgICAgICAgICAgICAgIC0gQm91bmRhcnkgb2YgdGhlIHN0cmluZwpAQCAtNTk4LDEzICs1OTYsMzggQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1pbnQgYWNwaV91dF9zbnByaW50ZihjaGFyICpzdHJpbmcsIGFjcGlfc2l6ZSBzaXplLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK2ludCBzbnByaW50ZihjaGFyICpzdHJpbmcsIGFjcGlfc2l6ZSBzaXplLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKIAl2YV9saXN0IGFyZ3M7CiAJaW50IGxlbmd0aDsKIAogCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7Ci0JbGVuZ3RoID0gYWNwaV91dF92c25wcmludGYoc3RyaW5nLCBzaXplLCBmb3JtYXQsIGFyZ3MpOworCWxlbmd0aCA9IHZzbnByaW50ZihzdHJpbmcsIHNpemUsIGZvcm1hdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCisJcmV0dXJuIChsZW5ndGgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBzcHJpbnRmCisgKgorICogUEFSQU1FVEVSUzogIHN0cmluZyAgICAgICAgICAgICAgLSBTdHJpbmcgd2l0aCBib3VuZGFyeQorICogICAgICAgICAgICAgIEZvcm1hdCwgLi4uICAgICAgICAgLSBTdGFuZGFyZCBwcmludGYgZm9ybWF0CisgKgorICogUkVUVVJOOiAgICAgIE51bWJlciBvZiBieXRlcyBhY3R1YWxseSB3cml0dGVuLgorICoKKyAqIERFU0NSSVBUSU9OOiBGb3JtYXR0ZWQgb3V0cHV0IHRvIGEgc3RyaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBzcHJpbnRmKGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWludCBsZW5ndGg7CisKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCWxlbmd0aCA9IHZzbnByaW50ZihzdHJpbmcsIEFDUElfVUlOVDMyX01BWCwgZm9ybWF0LCBhcmdzKTsKIAl2YV9lbmQoYXJncyk7CiAKIAlyZXR1cm4gKGxlbmd0aCk7CkBAIC02MTMsNyArNjM2LDU5IEBACiAjaWZkZWYgQUNQSV9BUFBMSUNBVElPTgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9maWxlX3ZwcmludGYKKyAqIEZVTkNUSU9OOiAgICB2cHJpbnRmCisgKgorICogUEFSQU1FVEVSUzogIGZvcm1hdCAgICAgICAgICAgICAgLSBTdGFuZGFyZCBwcmludGYgZm9ybWF0CisgKiAgICAgICAgICAgICAgYXJncyAgICAgICAgICAgICAgICAtIEFyZ3VtZW50IGxpc3QKKyAqCisgKiBSRVRVUk46ICAgICAgTnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4uCisgKgorICogREVTQ1JJUFRJT046IEZvcm1hdHRlZCBvdXRwdXQgdG8gc3Rkb3V0IHVzaW5nIGFyZ3VtZW50IGxpc3QgcG9pbnRlci4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgdnByaW50Zihjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKK3sKKwlhY3BpX2NwdV9mbGFncyBmbGFnczsKKwlpbnQgbGVuZ3RoOworCisJZmxhZ3MgPSBhY3BpX29zX2FjcXVpcmVfbG9jayhhY3BpX2dibF9wcmludF9sb2NrKTsKKwlsZW5ndGggPSB2c25wcmludGYoYWNwaV9nYmxfcHJpbnRfYnVmZmVyLAorCQkJICAgc2l6ZW9mKGFjcGlfZ2JsX3ByaW50X2J1ZmZlciksIGZvcm1hdCwgYXJncyk7CisKKwkodm9pZClmd3JpdGUoYWNwaV9nYmxfcHJpbnRfYnVmZmVyLCBsZW5ndGgsIDEsIEFDUElfRklMRV9PVVQpOworCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX3ByaW50X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAobGVuZ3RoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgcHJpbnRmCisgKgorICogUEFSQU1FVEVSUzogIEZvcm1hdCwgLi4uICAgICAgICAgLSBTdGFuZGFyZCBwcmludGYgZm9ybWF0CisgKgorICogUkVUVVJOOiAgICAgIE51bWJlciBvZiBieXRlcyBhY3R1YWxseSB3cml0dGVuLgorICoKKyAqIERFU0NSSVBUSU9OOiBGb3JtYXR0ZWQgb3V0cHV0IHRvIHN0ZG91dC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgcHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwlpbnQgbGVuZ3RoOworCisJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKwlsZW5ndGggPSB2cHJpbnRmKGZvcm1hdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCisJcmV0dXJuIChsZW5ndGgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICB2ZnByaW50ZgogICoKICAqIFBBUkFNRVRFUlM6ICBmaWxlICAgICAgICAgICAgICAgIC0gRmlsZSBkZXNjcmlwdG9yCiAgKiAgICAgICAgICAgICAgZm9ybWF0ICAgICAgICAgICAgICAtIFN0YW5kYXJkIHByaW50ZiBmb3JtYXQKQEAgLTYyNSwxNiArNzAwLDE2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotaW50IGFjcGlfdXRfZmlsZV92cHJpbnRmKEFDUElfRklMRSBmaWxlLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKK2ludCB2ZnByaW50ZihGSUxFICogZmlsZSwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCiB7CiAJYWNwaV9jcHVfZmxhZ3MgZmxhZ3M7CiAJaW50IGxlbmd0aDsKIAogCWZsYWdzID0gYWNwaV9vc19hY3F1aXJlX2xvY2soYWNwaV9nYmxfcHJpbnRfbG9jayk7Ci0JbGVuZ3RoID0gYWNwaV91dF92c25wcmludGYoYWNwaV9nYmxfcHJpbnRfYnVmZmVyLAotCQkJCSAgIHNpemVvZihhY3BpX2dibF9wcmludF9idWZmZXIpLCBmb3JtYXQsIGFyZ3MpOworCWxlbmd0aCA9IHZzbnByaW50ZihhY3BpX2dibF9wcmludF9idWZmZXIsCisJCQkgICBzaXplb2YoYWNwaV9nYmxfcHJpbnRfYnVmZmVyKSwgZm9ybWF0LCBhcmdzKTsKIAotCSh2b2lkKWFjcGlfb3Nfd3JpdGVfZmlsZShmaWxlLCBhY3BpX2dibF9wcmludF9idWZmZXIsIGxlbmd0aCwgMSk7CisJKHZvaWQpZndyaXRlKGFjcGlfZ2JsX3ByaW50X2J1ZmZlciwgbGVuZ3RoLCAxLCBmaWxlKTsKIAlhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2dibF9wcmludF9sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gKGxlbmd0aCk7CkBAIC02NDIsNyArNzE3LDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9maWxlX3ByaW50ZgorICogRlVOQ1RJT046ICAgIGZwcmludGYKICAqCiAgKiBQQVJBTUVURVJTOiAgZmlsZSAgICAgICAgICAgICAgICAtIEZpbGUgZGVzY3JpcHRvcgogICogICAgICAgICAgICAgIEZvcm1hdCwgLi4uICAgICAgICAgLSBTdGFuZGFyZCBwcmludGYgZm9ybWF0CkBAIC02NTMsMTMgKzcyOCwxMyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWludCBhY3BpX3V0X2ZpbGVfcHJpbnRmKEFDUElfRklMRSBmaWxlLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK2ludCBmcHJpbnRmKEZJTEUgKiBmaWxlLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKIAl2YV9saXN0IGFyZ3M7CiAJaW50IGxlbmd0aDsKIAogCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7Ci0JbGVuZ3RoID0gYWNwaV91dF9maWxlX3ZwcmludGYoZmlsZSwgZm9ybWF0LCBhcmdzKTsKKwlsZW5ndGggPSB2ZnByaW50ZihmaWxlLCBmb3JtYXQsIGFyZ3MpOwogCXZhX2VuZChhcmdzKTsKIAogCXJldHVybiAobGVuZ3RoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRzdHJ0b3VsNjQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXRzdHJ0b3VsNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGYzNDFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dHN0cnRvdWw2NC5jCkBAIC0wLDAgKzEsMzQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiB1dHN0cnRvdWw2NCAtIHN0cmluZyB0byA2NC1iaXQgaW50ZWdlciBzdXBwb3J0CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTYsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgorI2luY2x1ZGUgImFjY29tbW9uLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSBzYXRpc2Z5IHRoZSBuZWVkIGZvciA2NC1iaXQgc3RyaW5nLXRvLWludGVnZXIKKyAqIGNvbnZlcnNpb25zIG9uIGJvdGggMzItYml0IGFuZCA2NC1iaXQgcGxhdGZvcm1zLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUworQUNQSV9NT0RVTEVfTkFNRSgidXRzdHJ0b3VsNjQiKQorCisvKiBMb2NhbCBwcm90b3R5cGVzICovCitzdGF0aWMgdTY0IGFjcGlfdXRfc3RydG91bF9iYXNlMTAoY2hhciAqc3RyaW5nLCB1MzIgZmxhZ3MpOworCitzdGF0aWMgdTY0IGFjcGlfdXRfc3RydG91bF9iYXNlMTYoY2hhciAqc3RyaW5nLCB1MzIgZmxhZ3MpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFN0cmluZyBjb252ZXJzaW9uIHJ1bGVzIGFzIHdyaXR0ZW4gaW4gdGhlIEFDUEkgc3BlY2lmaWNhdGlvbi4gVGhlIGVycm9yCisgKiBjb25kaXRpb25zIGFuZCBiZWhhdmlvciBhcmUgZGlmZmVyZW50IGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBjb252ZXJzaW9uLgorICoKKyAqCisgKiBJbXBsaWNpdCBkYXRhIHR5cGUgY29udmVyc2lvbjogc3RyaW5nLXRvLWludGVnZXIKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogQmFzZSBpcyBhbHdheXMgMTYuIFRoaXMgaXMgdGhlIEFDUElfU1RSVE9VTF9CQVNFMTYgY2FzZS4KKyAqCisgKiBFeGFtcGxlOgorICogICAgICBBZGQgKCJCQTk4IiwgQXJnMCwgTG9jYWwwKQorICoKKyAqIFRoZSBpbnRlZ2VyIGlzIGluaXRpYWxpemVkIHRvIHRoZSB2YWx1ZSB6ZXJvLgorICogVGhlIEFTQ0lJIHN0cmluZyBpcyBpbnRlcnByZXRlZCBhcyBhIGhleGFkZWNpbWFsIGNvbnN0YW50LgorICoKKyAqICAxKSAgQSAiMHgiIHByZWZpeCBpcyBub3QgYWxsb3dlZC4gSG93ZXZlciwgQUNQSUNBIGFsbG93cyB0aGlzIGZvcgorICogICAgICBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgQUNQSUNBLiAoTk8gRVJST1IpCisgKgorICogIDIpICBUZXJtaW5hdGVzIHdoZW4gdGhlIHNpemUgb2YgYW4gaW50ZWdlciBpcyByZWFjaGVkICgzMiBvciA2NCBiaXRzKS4KKyAqICAgICAgKE5PIEVSUk9SKQorICoKKyAqICAzKSAgVGhlIGZpcnN0IG5vbi1oZXggY2hhcmFjdGVyIHRlcm1pbmF0ZXMgdGhlIGNvbnZlcnNpb24gd2l0aG91dCBlcnJvci4KKyAqICAgICAgKE5PIEVSUk9SKQorICoKKyAqICA0KSAgQ29udmVyc2lvbiBvZiBhIG51bGwgKHplcm8tbGVuZ3RoKSBzdHJpbmcgdG8gYW4gaW50ZWdlciBpcyBub3QKKyAqICAgICAgYWxsb3dlZC4gSG93ZXZlciwgQUNQSUNBIGFsbG93cyB0aGlzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMKKyAqICAgICAgQUNQSUNBLiBUaGlzIGNvbnZlcnNpb24gcmV0dXJucyB0aGUgdmFsdWUgMC4gKE5PIEVSUk9SKQorICoKKyAqCisgKiBFeHBsaWNpdCBkYXRhIHR5cGUgY29udmVyc2lvbjogIHRvX2ludGVnZXIoKSB3aXRoIHN0cmluZyBvcGVyYW5kCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBCYXNlIGlzIGVpdGhlciAxMCAoZGVmYXVsdCkgb3IgMTYgKHdpdGggMHggcHJlZml4KQorICoKKyAqIEV4YW1wbGVzOgorICogICAgICB0b19pbnRlZ2VyICgiMTAwMCIpCisgKiAgICAgIHRvX2ludGVnZXIgKCIweEFCQ0QiKQorICoKKyAqICAxKSAgQ2FuIGJlIChtdXN0IGJlKSBlaXRoZXIgYSBkZWNpbWFsIG9yIGhleGFkZWNpbWFsIG51bWVyaWMgc3RyaW5nLgorICogICAgICBBIGhleCB2YWx1ZSBtdXN0IGJlIHByZWZpeGVkIGJ5ICIweCIgb3IgaXQgaXMgaW50ZXJwcmV0ZWQgYXMgYSBkZWNpbWFsLgorICoKKyAqICAyKSAgVGhlIHZhbHVlIG11c3Qgbm90IGV4Y2VlZCB0aGUgbWF4aW11bSBvZiBhbiBpbnRlZ2VyIHZhbHVlLiBBQ1BJIHNwZWMKKyAqICAgICAgc3RhdGVzIHRoZSBiZWhhdmlvciBpcyAidW5wcmVkaWN0YWJsZSIsIHNvIEFDUElDQSBtYXRjaGVzIHRoZSBiZWhhdmlvcgorICogICAgICBvZiB0aGUgaW1wbGljaXQgY29udmVyc2lvbiBjYXNlLihOTyBFUlJPUikKKyAqCisgKiAgMykgIEJlaGF2aW9yIG9uIHRoZSBmaXJzdCBub24taGV4IGNoYXJhY3RlciBpcyBub3Qgc3BlY2lmaWVkIGJ5IHRoZSBBQ1BJCisgKiAgICAgIHNwZWMsIHNvIEFDUElDQSBtYXRjaGVzIHRoZSBiZWhhdmlvciBvZiB0aGUgaW1wbGljaXQgY29udmVyc2lvbiBjYXNlCisgKiAgICAgIGFuZCB0ZXJtaW5hdGVzLiAoTk8gRVJST1IpCisgKgorICogIDQpICBBIG51bGwgKHplcm8tbGVuZ3RoKSBzdHJpbmcgaXMgaWxsZWdhbC4KKyAqICAgICAgSG93ZXZlciwgQUNQSUNBIGFsbG93cyB0aGlzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgQUNQSUNBLgorICogICAgICBUaGlzIGNvbnZlcnNpb24gcmV0dXJucyB0aGUgdmFsdWUgMC4gKE5PIEVSUk9SKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfc3RydG91bDY0CisgKgorICogUEFSQU1FVEVSUzogIHN0cmluZyAgICAgICAgICAgICAgICAgIC0gTnVsbCB0ZXJtaW5hdGVkIGlucHV0IHN0cmluZworICogICAgICAgICAgICAgIGZsYWdzICAgICAgICAgICAgICAgICAgIC0gQ29udmVyc2lvbiBpbmZvLCBzZWUgYmVsb3cKKyAqICAgICAgICAgICAgICByZXR1cm5fdmFsdWUgICAgICAgICAgICAtIFdoZXJlIHRoZSBjb252ZXJ0ZWQgaW50ZWdlciBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzIGFuZCBDb252ZXJ0ZWQgdmFsdWUKKyAqCisgKiBERVNDUklQVElPTjogQ29udmVydCBhIHN0cmluZyBpbnRvIGFuIHVuc2lnbmVkIHZhbHVlLiBQZXJmb3JtcyBlaXRoZXIgYQorICogICAgICAgICAgICAgIDMyLWJpdCBvciA2NC1iaXQgY29udmVyc2lvbiwgZGVwZW5kaW5nIG9uIHRoZSBpbnB1dCBpbnRlZ2VyCisgKiAgICAgICAgICAgICAgc2l6ZSBpbiBGbGFncyAob2Z0ZW4gdGhlIGN1cnJlbnQgbW9kZSBvZiB0aGUgaW50ZXJwcmV0ZXIpLgorICoKKyAqIFZhbHVlcyBmb3IgRmxhZ3M6CisgKiAgICAgIEFDUElfU1RSVE9VTF8zMkJJVCAgICAgIC0gTWF4IGludGVnZXIgdmFsdWUgaXMgMzIgYml0cworICogICAgICBBQ1BJX1NUUlRPVUxfNjRCSVQgICAgICAtIE1heCBpbnRlZ2VyIHZhbHVlIGlzIDY0IGJpdHMKKyAqICAgICAgQUNQSV9TVFJUT1VMX0JBU0UxNiAgICAgLSBJbnB1dCBzdHJpbmcgaXMgaGV4YWRlY2ltYWwuIERlZmF1bHQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyAxMC8xNiBiYXNlZCBvbiBzdHJpbmcgcHJlZml4ICgweCkuCisgKgorICogTk9URVM6CisgKiAgIE5lZ2F0aXZlIG51bWJlcnMgYXJlIG5vdCBzdXBwb3J0ZWQsIGFzIHRoZXkgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgQUNQSS4KKyAqCisgKiAgIFN1cHBvcnRzIG9ubHkgYmFzZSAxNiBvciBiYXNlIDEwIHN0cmluZ3MvdmFsdWVzLiBEb2VzIG5vdAorICogICBzdXBwb3J0IE9jdGFsIHN0cmluZ3MsIGFzIHRoZXNlIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IEFDUEkuCisgKgorICogQ3VycmVudCB1c2VycyBvZiB0aGlzIHN1cHBvcnQ6CisgKgorICogIGludGVycHJldGVyIC0gSW1wbGljaXQgYW5kIGV4cGxpY2l0IGNvbnZlcnNpb25zLCBHUEUgbWV0aG9kIG5hbWVzCisgKiAgZGVidWdnZXIgICAgLSBDb21tYW5kIGxpbmUgaW5wdXQgc3RyaW5nIGNvbnZlcnNpb24KKyAqICBpQVNMICAgICAgICAtIE1haW4gcGFyc2VyLCBjb252ZXJzaW9uIG9mIGNvbnN0YW50cyB0byBpbnRlZ2VycworICogIGlBU0wgICAgICAgIC0gRGF0YSBUYWJsZSBDb21waWxlciBwYXJzZXIgKGNvbnN0YW50IG1hdGggZXhwcmVzc2lvbnMpCisgKiAgaUFTTCAgICAgICAgLSBQcmVwcm9jZXNzb3IgKGNvbnN0YW50IG1hdGggZXhwcmVzc2lvbnMpCisgKiAgYWNwaV9kdW1wICAgLSBJbnB1dCB0YWJsZSBhZGRyZXNzZXMKKyAqICBhY3BpX2V4ZWMgICAtIFRlc3Rpbmcgb2YgdGhlIGFjcGlfdXRfc3RydG91bDY0IGZ1bmN0aW9uCisgKgorICogTm90ZSBjb25jZXJuaW5nIGNhbGxlcnM6CisgKiAgIGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIDMyLzY0IGxpbWl0LiBJZiB1c2VkLAorICogICB0aGlzIGdsb2JhbCBzaG91bGQgYmUgc2V0IHRvIHRoZSBwcm9wZXIgd2lkdGguIEZvciB0aGUgY29yZSBBQ1BJQ0EgY29kZSwKKyAqICAgdGhpcyB3aWR0aCBkZXBlbmRzIG9uIHRoZSBEU0RUIHZlcnNpb24uIEZvciBpQVNMLCB0aGUgZGVmYXVsdCBieXRlCisgKiAgIHdpZHRoIGlzIGFsd2F5cyA4IGZvciB0aGUgcGFyc2VyLCBidXQgZXJyb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkIGxhdGVyCisgKiAgIHRvIGZsYWcgY2FzZXMgd2hlcmUgYSA2NC1iaXQgY29uc3RhbnQgaXMgZGVmaW5lZCBpbiBhIDMyLWJpdCBEU0RUL1NTRFQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV91dF9zdHJ0b3VsNjQoY2hhciAqc3RyaW5nLCB1MzIgZmxhZ3MsIHU2NCAqcmV0dXJuX3ZhbHVlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXUzMiBiYXNlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIodXRfc3RydG91bDY0LCBzdHJpbmcpOworCisJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KKworCWlmICghc3RyaW5nIHx8ICFyZXR1cm5fdmFsdWUpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCSpyZXR1cm5fdmFsdWUgPSAwOworCisJLyogQ2hlY2sgZm9yIHplcm8tbGVuZ3RoIHN0cmluZywgcmV0dXJucyAwICovCisKKwlpZiAoKnN0cmluZyA9PSAwKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJfQorCisJLyogU2tpcCBvdmVyIGFueSB3aGl0ZSBzcGFjZSBhdCBzdGFydCBvZiBzdHJpbmcgKi8KKworCXdoaWxlIChpc3NwYWNlKChpbnQpKnN0cmluZykpIHsKKwkJc3RyaW5nKys7CisJfQorCisJLyogRW5kIG9mIHN0cmluZz8gcmV0dXJuIDAgKi8KKworCWlmICgqc3RyaW5nID09IDApIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwl9CisKKwkvKgorCSAqIDEpIFRoZSAiMHgiIHByZWZpeCBpbmRpY2F0ZXMgYmFzZSAxNi4gUGVyIHRoZSBBQ1BJIHNwZWNpZmljYXRpb24sCisJICogdGhlICIweCIgcHJlZml4IGlzIG9ubHkgYWxsb3dlZCBmb3IgaW1wbGljaXQgKG5vbi1zdHJpY3QpIGNvbnZlcnNpb25zLgorCSAqIEhvd2V2ZXIsIHdlIGFsd2F5cyBhbGxvdyBpdCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIEFDUElDQS4KKwkgKi8KKwlpZiAoKCpzdHJpbmcgPT0gQUNQSV9BU0NJSV9aRVJPKSAmJgorCSAgICAodG9sb3dlcigoaW50KSooc3RyaW5nICsgMSkpID09ICd4JykpIHsKKwkJc3RyaW5nICs9IDI7CS8qIEdvIHBhc3QgdGhlIDB4ICovCisJCWlmICgqc3RyaW5nID09IDApIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CS8qIFJldHVybiB2YWx1ZSAwICovCisJCX0KKworCQliYXNlID0gMTY7CisJfQorCisJLyogMikgRm9yY2UgdG8gYmFzZSAxNiAoaW1wbGljaXQgY29udmVyc2lvbiBjYXNlKSAqLworCisJZWxzZSBpZiAoZmxhZ3MgJiBBQ1BJX1NUUlRPVUxfQkFTRTE2KSB7CisJCWJhc2UgPSAxNjsKKwl9CisKKwkvKiAzKSBEZWZhdWx0IGZhbGxiYWNrIGlzIHRvIEJhc2UgMTAgKi8KKworCWVsc2UgeworCQliYXNlID0gMTA7CisJfQorCisJLyogU2tpcCBhbGwgbGVhZGluZyB6ZXJvcyAqLworCisJd2hpbGUgKCpzdHJpbmcgPT0gQUNQSV9BU0NJSV9aRVJPKSB7CisJCXN0cmluZysrOworCQlpZiAoKnN0cmluZyA9PSAwKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwkvKiBSZXR1cm4gdmFsdWUgMCAqLworCQl9CisJfQorCisJLyogUGVyZm9ybSB0aGUgYmFzZSAxNiBvciAxMCBjb252ZXJzaW9uICovCisKKwlpZiAoYmFzZSA9PSAxNikgeworCQkqcmV0dXJuX3ZhbHVlID0gYWNwaV91dF9zdHJ0b3VsX2Jhc2UxNihzdHJpbmcsIGZsYWdzKTsKKwl9IGVsc2UgeworCQkqcmV0dXJuX3ZhbHVlID0gYWNwaV91dF9zdHJ0b3VsX2Jhc2UxMChzdHJpbmcsIGZsYWdzKTsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9zdHJ0b3VsX2Jhc2UxMAorICoKKyAqIFBBUkFNRVRFUlM6ICBzdHJpbmcgICAgICAgICAgICAgICAgICAtIE51bGwgdGVybWluYXRlZCBpbnB1dCBzdHJpbmcKKyAqICAgICAgICAgICAgICBmbGFncyAgICAgICAgICAgICAgICAgICAtIENvbnZlcnNpb24gaW5mbworICoKKyAqIFJFVFVSTjogICAgICA2NC1iaXQgY29udmVydGVkIGludGVnZXIKKyAqCisgKiBERVNDUklQVElPTjogUGVyZm9ybXMgYSBiYXNlIDEwIGNvbnZlcnNpb24gb2YgdGhlIGlucHV0IHN0cmluZyB0byBhbgorICogICAgICAgICAgICAgIGludGVnZXIgdmFsdWUsIGVpdGhlciAzMiBvciA2NCBiaXRzLgorICogICAgICAgICAgICAgIE5vdGU6IFN0cmluZyBtdXN0IGJlIHZhbGlkIGFuZCBub24tbnVsbC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdTY0IGFjcGlfdXRfc3RydG91bF9iYXNlMTAoY2hhciAqc3RyaW5nLCB1MzIgZmxhZ3MpCit7CisJaW50IGFzY2lpX2RpZ2l0OworCXU2NCBuZXh0X3ZhbHVlOworCXU2NCByZXR1cm5fdmFsdWUgPSAwOworCisJLyogTWFpbiBsb29wOiBjb252ZXJ0IGVhY2ggQVNDSUkgYnl0ZSBpbiB0aGUgaW5wdXQgc3RyaW5nICovCisKKwl3aGlsZSAoKnN0cmluZykgeworCQlhc2NpaV9kaWdpdCA9ICpzdHJpbmc7CisJCWlmICghaXNkaWdpdChhc2NpaV9kaWdpdCkpIHsKKworCQkJLyogTm90IEFTQ0lJIDAtOSwgdGVybWluYXRlICovCisKKwkJCWdvdG8gZXhpdDsKKwkJfQorCisJCS8qIENvbnZlcnQgYW5kIGluc2VydCAoYWRkKSB0aGUgZGVjaW1hbCBkaWdpdCAqLworCisJCW5leHRfdmFsdWUgPQorCQkgICAgKHJldHVybl92YWx1ZSAqIDEwKSArIChhc2NpaV9kaWdpdCAtIEFDUElfQVNDSUlfWkVSTyk7CisKKwkJLyogQ2hlY2sgZm9yIG92ZXJmbG93ICgzMiBvciA2NCBiaXQpIC0gcmV0dXJuIGN1cnJlbnQgY29udmVydGVkIHZhbHVlICovCisKKwkJaWYgKCgoZmxhZ3MgJiBBQ1BJX1NUUlRPVUxfMzJCSVQpICYmIChuZXh0X3ZhbHVlID4gQUNQSV9VSU5UMzJfTUFYKSkgfHwgKG5leHRfdmFsdWUgPCByZXR1cm5fdmFsdWUpKSB7CS8qIDY0LWJpdCBvdmVyZmxvdyBjYXNlICovCisJCQlnb3RvIGV4aXQ7CisJCX0KKworCQlyZXR1cm5fdmFsdWUgPSBuZXh0X3ZhbHVlOworCQlzdHJpbmcrKzsKKwl9CisKK2V4aXQ6CisJcmV0dXJuIChyZXR1cm5fdmFsdWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3N0cnRvdWxfYmFzZTE2CisgKgorICogUEFSQU1FVEVSUzogIHN0cmluZyAgICAgICAgICAgICAgICAgIC0gTnVsbCB0ZXJtaW5hdGVkIGlucHV0IHN0cmluZworICogICAgICAgICAgICAgIGZsYWdzICAgICAgICAgICAgICAgICAgIC0gY29udmVyc2lvbiBpbmZvCisgKgorICogUkVUVVJOOiAgICAgIDY0LWJpdCBjb252ZXJ0ZWQgaW50ZWdlcgorICoKKyAqIERFU0NSSVBUSU9OOiBQZXJmb3JtcyBhIGJhc2UgMTYgY29udmVyc2lvbiBvZiB0aGUgaW5wdXQgc3RyaW5nIHRvIGFuCisgKiAgICAgICAgICAgICAgaW50ZWdlciB2YWx1ZSwgZWl0aGVyIDMyIG9yIDY0IGJpdHMuCisgKiAgICAgICAgICAgICAgTm90ZTogU3RyaW5nIG11c3QgYmUgdmFsaWQgYW5kIG5vbi1udWxsLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB1NjQgYWNwaV91dF9zdHJ0b3VsX2Jhc2UxNihjaGFyICpzdHJpbmcsIHUzMiBmbGFncykKK3sKKwlpbnQgYXNjaWlfZGlnaXQ7CisJdTMyIHZhbGlkX2RpZ2l0cyA9IDE7CisJdTY0IHJldHVybl92YWx1ZSA9IDA7CisKKwkvKiBNYWluIGxvb3A6IGNvbnZlcnQgZWFjaCBBU0NJSSBieXRlIGluIHRoZSBpbnB1dCBzdHJpbmcgKi8KKworCXdoaWxlICgqc3RyaW5nKSB7CisKKwkJLyogQ2hlY2sgZm9yIG92ZXJmbG93ICgzMiBvciA2NCBiaXQpIC0gcmV0dXJuIGN1cnJlbnQgY29udmVydGVkIHZhbHVlICovCisKKwkJaWYgKCh2YWxpZF9kaWdpdHMgPiAxNikgfHwKKwkJICAgICgodmFsaWRfZGlnaXRzID4gOCkgJiYgKGZsYWdzICYgQUNQSV9TVFJUT1VMXzMyQklUKSkpIHsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCisJCWFzY2lpX2RpZ2l0ID0gKnN0cmluZzsKKwkJaWYgKCFpc3hkaWdpdChhc2NpaV9kaWdpdCkpIHsKKworCQkJLyogTm90IEhleCBBU0NJSSBBLUYsIGEtZiwgb3IgMC05LCB0ZXJtaW5hdGUgKi8KKworCQkJZ290byBleGl0OworCQl9CisKKwkJLyogQ29udmVydCBhbmQgaW5zZXJ0IHRoZSBoZXggZGlnaXQgKi8KKworCQlyZXR1cm5fdmFsdWUgPQorCQkgICAgKHJldHVybl92YWx1ZSA8PCA0KSB8CisJCSAgICBhY3BpX3V0X2FzY2lpX2NoYXJfdG9faGV4KGFzY2lpX2RpZ2l0KTsKKworCQlzdHJpbmcrKzsKKwkJdmFsaWRfZGlnaXRzKys7CisJfQorCitleGl0OgorCXJldHVybiAocmV0dXJuX3ZhbHVlKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR0cmFjay5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dHRyYWNrLmMKaW5kZXggMGRmMDdkZi4uZGYzMWQ3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS91dHRyYWNrLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dHRyYWNrLmMKQEAgLTk1LDEzICs5NSwxMSBAQAogewogCXN0cnVjdCBhY3BpX21lbW9yeV9saXN0ICpjYWNoZTsKIAotCWNhY2hlID0gYWNwaV9vc19hbGxvY2F0ZShzaXplb2Yoc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QpKTsKKwljYWNoZSA9IGFjcGlfb3NfYWxsb2NhdGVfemVyb2VkKHNpemVvZihzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCkpOwogCWlmICghY2FjaGUpIHsKIAkJcmV0dXJuIChBRV9OT19NRU1PUlkpOwogCX0KIAotCW1lbXNldChjYWNoZSwgMCwgc2l6ZW9mKHN0cnVjdCBhY3BpX21lbW9yeV9saXN0KSk7Ci0KIAljYWNoZS0+bGlzdF9uYW1lID0gbGlzdF9uYW1lOwogCWNhY2hlLT5vYmplY3Rfc2l6ZSA9IG9iamVjdF9zaXplOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0eGZhY2UuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR4ZmFjZS5jCmluZGV4IGQ5ZTZhYWMuLmVjNTAzYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR4ZmFjZS5jCkBAIC02MSw3ICs2MSw3IEBACiAgKiBERVNDUklQVElPTjogU2h1dGRvd24gdGhlIEFDUElDQSBzdWJzeXN0ZW0gYW5kIHJlbGVhc2UgYWxsIHJlc291cmNlcy4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgX19pbml0IGFjcGlfdGVybWluYXRlKHZvaWQpCithY3BpX3N0YXR1cyBBQ1BJX0lOSVRfRlVOQ1RJT04gYWNwaV90ZXJtaW5hdGUodm9pZCkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR4ZmluaXQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR4ZmluaXQuYwppbmRleCA3NWI1ZjI3Li5hNWNhMGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0eGZpbml0LmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dHhmaW5pdC5jCkBAIC02OSw3ICs2OSw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMgX19pbml0IGFjcGlfaW5pdGlhbGl6ZV9zdWJzeXN0ZW0odm9pZCkKK2FjcGlfc3RhdHVzIEFDUElfSU5JVF9GVU5DVElPTiBhY3BpX2luaXRpYWxpemVfc3Vic3lzdGVtKHZvaWQpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCkBAIC0xNDEsNyArMTQxLDcgQEAKICAqICAgICAgICAgICAgICBQdXRzIHN5c3RlbSBpbnRvIEFDUEkgbW9kZSBpZiBpdCBpc24ndCBhbHJlYWR5LgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cyBfX2luaXQgYWNwaV9lbmFibGVfc3Vic3lzdGVtKHUzMiBmbGFncykKK2FjcGlfc3RhdHVzIEFDUElfSU5JVF9GVU5DVElPTiBhY3BpX2VuYWJsZV9zdWJzeXN0ZW0odTMyIGZsYWdzKQogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCkBAIC0yMzksNyArMjM5LDcgQEAKICAqICAgICAgICAgICAgICBvYmplY3RzIGFuZCBleGVjdXRpbmcgQU1MIGNvZGUgZm9yIFJlZ2lvbnMsIGJ1ZmZlcnMsIGV0Yy4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgX19pbml0IGFjcGlfaW5pdGlhbGl6ZV9vYmplY3RzKHUzMiBmbGFncykKK2FjcGlfc3RhdHVzIEFDUElfSU5JVF9GVU5DVElPTiBhY3BpX2luaXRpYWxpemVfb2JqZWN0cyh1MzIgZmxhZ3MpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKQEAgLTI2NSw3ICsyNjUsOCBAQAogCSAqIGFsbCBvZiB0aGUgdGFibGVzIGhhdmUgYmVlbiBsb2FkZWQuIEl0IGlzIGEgbGVnYWN5IG9wdGlvbiBhbmQgaXMKIAkgKiBub3QgY29tcGF0aWJsZSB3aXRoIG90aGVyIEFDUEkgaW1wbGVtZW50YXRpb25zLiBTZWUgYWNwaV9uc19sb2FkX3RhYmxlLgogCSAqLwotCWlmIChhY3BpX2dibF9ncm91cF9tb2R1bGVfbGV2ZWxfY29kZSkgeworCWlmICghYWNwaV9nYmxfcGFyc2VfdGFibGVfYXNfdGVybV9saXN0CisJICAgICYmIGFjcGlfZ2JsX2dyb3VwX21vZHVsZV9sZXZlbF9jb2RlKSB7CiAJCWFjcGlfbnNfZXhlY19tb2R1bGVfY29kZV9saXN0KCk7CiAKIAkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hcGVpL2Vyc3QuYyBiL2RyaXZlcnMvYWNwaS9hcGVpL2Vyc3QuYwppbmRleCBmMDk2YWIzLi5lYzRmNTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYXBlaS9lcnN0LmMKKysrIGIvZHJpdmVycy9hY3BpL2FwZWkvZXJzdC5jCkBAIC05MzgsNyArOTM4LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcHN0b3JlX2luZm8gZXJzdF9pbmZvID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkubmFtZQkJPSAiZXJzdCIsCi0JLmZsYWdzCQk9IFBTVE9SRV9GTEFHU19GUkFHSUxFLAorCS5mbGFncwkJPSBQU1RPUkVfRkxBR1NfRE1FU0csCiAJLm9wZW4JCT0gZXJzdF9vcGVuX3BzdG9yZSwKIAkuY2xvc2UJCT0gZXJzdF9jbG9zZV9wc3RvcmUsCiAJLnJlYWQJCT0gZXJzdF9yZWFkZXIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYXJtNjQvS2NvbmZpZyBiL2RyaXZlcnMvYWNwaS9hcm02NC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MTZkYTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYXJtNjQvS2NvbmZpZwpAQCAtMCwwICsxLDYgQEAKKyMKKyMgQUNQSSBDb25maWd1cmF0aW9uIGZvciBBUk02NAorIworCitjb25maWcgQUNQSV9JT1JUCisJYm9vbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FybTY0L01ha2VmaWxlIGIvZHJpdmVycy9hY3BpL2FybTY0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMzMxZjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvYXJtNjQvTWFrZWZpbGUKQEAgLTAsMCArMSBAQAorb2JqLSQoQ09ORklHX0FDUElfSU9SVCkgCSs9IGlvcnQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FybTY0L2lvcnQuYyBiL2RyaXZlcnMvYWNwaS9hcm02NC9pb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI4MTc0NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hcm02NC9pb3J0LmMKQEAgLTAsMCArMSwzNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYsIFNlbWloYWxmCisgKglBdXRob3I6IFRvbWFzeiBOb3dpY2tpIDx0bkBzZW1paGFsZi5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGVhcmx5IGRldGVjdGlvbi9wYXJzaW5nIG9mIEkvTyBtYXBwaW5nCisgKiByZXBvcnRlZCB0byBPUyB0aHJvdWdoIGZpcm13YXJlIHZpYSBJL08gUmVtYXBwaW5nIFRhYmxlIChJT1JUKQorICogSU9SVCBkb2N1bWVudCBudW1iZXI6IEFSTSBERU4gMDA0OUEKKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpCSJBQ1BJOiBJT1JUOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvYWNwaV9pb3J0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKK3N0cnVjdCBpb3J0X2l0c19tc2lfY2hpcCB7CisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OworCXN0cnVjdCBmd25vZGVfaGFuZGxlCSpmd19ub2RlOworCXUzMgkJCXRyYW5zbGF0aW9uX2lkOworfTsKKwordHlwZWRlZiBhY3BpX3N0YXR1cyAoKmlvcnRfZmluZF9ub2RlX2NhbGxiYWNrKQorCShzdHJ1Y3QgYWNwaV9pb3J0X25vZGUgKm5vZGUsIHZvaWQgKmNvbnRleHQpOworCisvKiBSb290IHBvaW50ZXIgdG8gdGhlIG1hcHBlZCBJT1JUIHRhYmxlICovCitzdGF0aWMgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICppb3J0X3RhYmxlOworCitzdGF0aWMgTElTVF9IRUFEKGlvcnRfbXNpX2NoaXBfbGlzdCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlvcnRfbXNpX2NoaXBfbG9jayk7CisKKy8qKgorICogaW9ydF9yZWdpc3Rlcl9kb21haW5fdG9rZW4oKSAtIHJlZ2lzdGVyIGRvbWFpbiB0b2tlbiBhbmQgcmVsYXRlZCBJVFMgSUQKKyAqIHRvIHRoZSBsaXN0IGZyb20gd2hlcmUgd2UgY2FuIGdldCBpdCBiYWNrIGxhdGVyIG9uLgorICogQHRyYW5zX2lkOiBJVFMgSUQuCisgKiBAZndfbm9kZTogRG9tYWluIHRva2VuLgorICoKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLUVOT01FTSBpZiBubyBtZW1vcnkgd2hlbiBhbGxvY2F0aW5nIGxpc3QgZWxlbWVudAorICovCitpbnQgaW9ydF9yZWdpc3Rlcl9kb21haW5fdG9rZW4oaW50IHRyYW5zX2lkLCBzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndfbm9kZSkKK3sKKwlzdHJ1Y3QgaW9ydF9pdHNfbXNpX2NoaXAgKml0c19tc2lfY2hpcDsKKworCWl0c19tc2lfY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKCppdHNfbXNpX2NoaXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWl0c19tc2lfY2hpcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpdHNfbXNpX2NoaXAtPmZ3X25vZGUgPSBmd19ub2RlOworCWl0c19tc2lfY2hpcC0+dHJhbnNsYXRpb25faWQgPSB0cmFuc19pZDsKKworCXNwaW5fbG9jaygmaW9ydF9tc2lfY2hpcF9sb2NrKTsKKwlsaXN0X2FkZCgmaXRzX21zaV9jaGlwLT5saXN0LCAmaW9ydF9tc2lfY2hpcF9saXN0KTsKKwlzcGluX3VubG9jaygmaW9ydF9tc2lfY2hpcF9sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlvcnRfZGVyZWdpc3Rlcl9kb21haW5fdG9rZW4oKSAtIERlcmVnaXN0ZXIgZG9tYWluIHRva2VuIGJhc2VkIG9uIElUUyBJRAorICogQHRyYW5zX2lkOiBJVFMgSUQuCisgKgorICogUmV0dXJuczogbm9uZS4KKyAqLwordm9pZCBpb3J0X2RlcmVnaXN0ZXJfZG9tYWluX3Rva2VuKGludCB0cmFuc19pZCkKK3sKKwlzdHJ1Y3QgaW9ydF9pdHNfbXNpX2NoaXAgKml0c19tc2lfY2hpcCwgKnQ7CisKKwlzcGluX2xvY2soJmlvcnRfbXNpX2NoaXBfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGl0c19tc2lfY2hpcCwgdCwgJmlvcnRfbXNpX2NoaXBfbGlzdCwgbGlzdCkgeworCQlpZiAoaXRzX21zaV9jaGlwLT50cmFuc2xhdGlvbl9pZCA9PSB0cmFuc19pZCkgeworCQkJbGlzdF9kZWwoJml0c19tc2lfY2hpcC0+bGlzdCk7CisJCQlrZnJlZShpdHNfbXNpX2NoaXApOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmlvcnRfbXNpX2NoaXBfbG9jayk7Cit9CisKKy8qKgorICogaW9ydF9maW5kX2RvbWFpbl90b2tlbigpIC0gRmluZCBkb21haW4gdG9rZW4gYmFzZWQgb24gZ2l2ZW4gSVRTIElECisgKiBAdHJhbnNfaWQ6IElUUyBJRC4KKyAqCisgKiBSZXR1cm5zOiBkb21haW4gdG9rZW4gd2hlbiBmaW5kIG9uIHRoZSBsaXN0LCBOVUxMIG90aGVyd2lzZQorICovCitzdHJ1Y3QgZndub2RlX2hhbmRsZSAqaW9ydF9maW5kX2RvbWFpbl90b2tlbihpbnQgdHJhbnNfaWQpCit7CisJc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3X25vZGUgPSBOVUxMOworCXN0cnVjdCBpb3J0X2l0c19tc2lfY2hpcCAqaXRzX21zaV9jaGlwOworCisJc3Bpbl9sb2NrKCZpb3J0X21zaV9jaGlwX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoaXRzX21zaV9jaGlwLCAmaW9ydF9tc2lfY2hpcF9saXN0LCBsaXN0KSB7CisJCWlmIChpdHNfbXNpX2NoaXAtPnRyYW5zbGF0aW9uX2lkID09IHRyYW5zX2lkKSB7CisJCQlmd19ub2RlID0gaXRzX21zaV9jaGlwLT5md19ub2RlOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmlvcnRfbXNpX2NoaXBfbG9jayk7CisKKwlyZXR1cm4gZndfbm9kZTsKK30KKworc3RhdGljIHN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqaW9ydF9zY2FuX25vZGUoZW51bSBhY3BpX2lvcnRfbm9kZV90eXBlIHR5cGUsCisJCQkJCSAgICAgaW9ydF9maW5kX25vZGVfY2FsbGJhY2sgY2FsbGJhY2ssCisJCQkJCSAgICAgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgYWNwaV9pb3J0X25vZGUgKmlvcnRfbm9kZSwgKmlvcnRfZW5kOworCXN0cnVjdCBhY3BpX3RhYmxlX2lvcnQgKmlvcnQ7CisJaW50IGk7CisKKwlpZiAoIWlvcnRfdGFibGUpCisJCXJldHVybiBOVUxMOworCisJLyogR2V0IHRoZSBmaXJzdCBJT1JUIG5vZGUgKi8KKwlpb3J0ID0gKHN0cnVjdCBhY3BpX3RhYmxlX2lvcnQgKilpb3J0X3RhYmxlOworCWlvcnRfbm9kZSA9IEFDUElfQUREX1BUUihzdHJ1Y3QgYWNwaV9pb3J0X25vZGUsIGlvcnQsCisJCQkJIGlvcnQtPm5vZGVfb2Zmc2V0KTsKKwlpb3J0X2VuZCA9IEFDUElfQUREX1BUUihzdHJ1Y3QgYWNwaV9pb3J0X25vZGUsIGlvcnRfdGFibGUsCisJCQkJaW9ydF90YWJsZS0+bGVuZ3RoKTsKKworCWZvciAoaSA9IDA7IGkgPCBpb3J0LT5ub2RlX2NvdW50OyBpKyspIHsKKwkJaWYgKFdBUk5fVEFJTlQoaW9ydF9ub2RlID49IGlvcnRfZW5kLCBUQUlOVF9GSVJNV0FSRV9XT1JLQVJPVU5ELAorCQkJICAgICAgICJJT1JUIG5vZGUgcG9pbnRlciBvdmVyZmxvd3MsIGJhZCB0YWJsZSFcbiIpKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJaWYgKGlvcnRfbm9kZS0+dHlwZSA9PSB0eXBlICYmCisJCSAgICBBQ1BJX1NVQ0NFU1MoY2FsbGJhY2soaW9ydF9ub2RlLCBjb250ZXh0KSkpCisJCQkJcmV0dXJuIGlvcnRfbm9kZTsKKworCQlpb3J0X25vZGUgPSBBQ1BJX0FERF9QVFIoc3RydWN0IGFjcGlfaW9ydF9ub2RlLCBpb3J0X25vZGUsCisJCQkJCSBpb3J0X25vZGUtPmxlbmd0aCk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBhY3BpX3N0YXR1cyBpb3J0X21hdGNoX25vZGVfY2FsbGJhY2soc3RydWN0IGFjcGlfaW9ydF9ub2RlICpub2RlLAorCQkJCQkgICAgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250ZXh0OworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCWlmIChub2RlLT50eXBlID09IEFDUElfSU9SVF9OT0RFX05BTUVEX0NPTVBPTkVOVCkgeworCQlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OworCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYgPSB0b19hY3BpX2RldmljZV9ub2RlKGRldi0+Zndub2RlKTsKKwkJc3RydWN0IGFjcGlfaW9ydF9uYW1lZF9jb21wb25lbnQgKm5jb21wOworCisJCWlmICghYWRldikgeworCQkJc3RhdHVzID0gQUVfTk9UX0ZPVU5EOworCQkJZ290byBvdXQ7CisJCX0KKworCQlzdGF0dXMgPSBhY3BpX2dldF9uYW1lKGFkZXYtPmhhbmRsZSwgQUNQSV9GVUxMX1BBVEhOQU1FLCAmYnVmKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlkZXZfd2FybihkZXYsICJDYW4ndCBnZXQgZGV2aWNlIGZ1bGwgcGF0aCBuYW1lXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJbmNvbXAgPSAoc3RydWN0IGFjcGlfaW9ydF9uYW1lZF9jb21wb25lbnQgKilub2RlLT5ub2RlX2RhdGE7CisJCXN0YXR1cyA9ICFzdHJjbXAobmNvbXAtPmRldmljZV9uYW1lLCBidWYucG9pbnRlcikgPworCQkJCQkJCUFFX09LIDogQUVfTk9UX0ZPVU5EOworCQlhY3BpX29zX2ZyZWUoYnVmLnBvaW50ZXIpOworCX0gZWxzZSBpZiAobm9kZS0+dHlwZSA9PSBBQ1BJX0lPUlRfTk9ERV9QQ0lfUk9PVF9DT01QTEVYKSB7CisJCXN0cnVjdCBhY3BpX2lvcnRfcm9vdF9jb21wbGV4ICpwY2lfcmM7CisJCXN0cnVjdCBwY2lfYnVzICpidXM7CisKKwkJYnVzID0gdG9fcGNpX2J1cyhkZXYpOworCQlwY2lfcmMgPSAoc3RydWN0IGFjcGlfaW9ydF9yb290X2NvbXBsZXggKilub2RlLT5ub2RlX2RhdGE7CisKKwkJLyoKKwkJICogSXQgaXMgYXNzdW1lZCB0aGF0IFBDSSBzZWdtZW50IG51bWJlcnMgbWFwcyBvbmUtdG8tb25lCisJCSAqIHdpdGggcm9vdCBjb21wbGV4ZXMuIEVhY2ggc2VnbWVudCBudW1iZXIgY2FuIHJlcHJlc2VudCBvbmx5CisJCSAqIG9uZSByb290IGNvbXBsZXguCisJCSAqLworCQlzdGF0dXMgPSBwY2lfcmMtPnBjaV9zZWdtZW50X251bWJlciA9PSBwY2lfZG9tYWluX25yKGJ1cykgPworCQkJCQkJCUFFX09LIDogQUVfTk9UX0ZPVU5EOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IEFFX05PVF9GT1VORDsKKwl9CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBpb3J0X2lkX21hcChzdHJ1Y3QgYWNwaV9pb3J0X2lkX21hcHBpbmcgKm1hcCwgdTggdHlwZSwgdTMyIHJpZF9pbiwKKwkJICAgICAgIHUzMiAqcmlkX291dCkKK3sKKwkvKiBTaW5nbGUgbWFwcGluZyBkb2VzIG5vdCBjYXJlIGZvciBpbnB1dCBpZCAqLworCWlmIChtYXAtPmZsYWdzICYgQUNQSV9JT1JUX0lEX1NJTkdMRV9NQVBQSU5HKSB7CisJCWlmICh0eXBlID09IEFDUElfSU9SVF9OT0RFX05BTUVEX0NPTVBPTkVOVCB8fAorCQkgICAgdHlwZSA9PSBBQ1BJX0lPUlRfTk9ERV9QQ0lfUk9PVF9DT01QTEVYKSB7CisJCQkqcmlkX291dCA9IG1hcC0+b3V0cHV0X2Jhc2U7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXByX3dhcm4oRldfQlVHICJbbWFwICVwXSBTSU5HTEUgTUFQUElORyBmbGFnIG5vdCBhbGxvd2VkIGZvciBub2RlIHR5cGUgJWQsIHNraXBwaW5nIElEIG1hcFxuIiwKKwkJCW1hcCwgdHlwZSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJaWYgKHJpZF9pbiA8IG1hcC0+aW5wdXRfYmFzZSB8fAorCSAgICAocmlkX2luID49IG1hcC0+aW5wdXRfYmFzZSArIG1hcC0+aWRfY291bnQpKQorCQlyZXR1cm4gLUVOWElPOworCisJKnJpZF9vdXQgPSBtYXAtPm91dHB1dF9iYXNlICsgKHJpZF9pbiAtIG1hcC0+aW5wdXRfYmFzZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9pb3J0X25vZGUgKmlvcnRfbm9kZV9tYXBfcmlkKHN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqbm9kZSwKKwkJCQkJCXUzMiByaWRfaW4sIHUzMiAqcmlkX291dCwKKwkJCQkJCXU4IHR5cGUpCit7CisJdTMyIHJpZCA9IHJpZF9pbjsKKworCS8qIFBhcnNlIHRoZSBJRCBtYXBwaW5nIHRyZWUgdG8gZmluZCBzcGVjaWZpZWQgbm9kZSB0eXBlICovCisJd2hpbGUgKG5vZGUpIHsKKwkJc3RydWN0IGFjcGlfaW9ydF9pZF9tYXBwaW5nICptYXA7CisJCWludCBpOworCisJCWlmIChub2RlLT50eXBlID09IHR5cGUpIHsKKwkJCWlmIChyaWRfb3V0KQorCQkJCSpyaWRfb3V0ID0gcmlkOworCQkJcmV0dXJuIG5vZGU7CisJCX0KKworCQlpZiAoIW5vZGUtPm1hcHBpbmdfb2Zmc2V0IHx8ICFub2RlLT5tYXBwaW5nX2NvdW50KQorCQkJZ290byBmYWlsX21hcDsKKworCQltYXAgPSBBQ1BJX0FERF9QVFIoc3RydWN0IGFjcGlfaW9ydF9pZF9tYXBwaW5nLCBub2RlLAorCQkJCSAgIG5vZGUtPm1hcHBpbmdfb2Zmc2V0KTsKKworCQkvKiBGaXJtd2FyZSBidWchICovCisJCWlmICghbWFwLT5vdXRwdXRfcmVmZXJlbmNlKSB7CisJCQlwcl9lcnIoRldfQlVHICJbbm9kZSAlcCB0eXBlICVkXSBJRCBtYXAgaGFzIE5VTEwgcGFyZW50IHJlZmVyZW5jZVxuIiwKKwkJCSAgICAgICBub2RlLCBub2RlLT50eXBlKTsKKwkJCWdvdG8gZmFpbF9tYXA7CisJCX0KKworCQkvKiBEbyB0aGUgUklEIHRyYW5zbGF0aW9uICovCisJCWZvciAoaSA9IDA7IGkgPCBub2RlLT5tYXBwaW5nX2NvdW50OyBpKyssIG1hcCsrKSB7CisJCQlpZiAoIWlvcnRfaWRfbWFwKG1hcCwgbm9kZS0+dHlwZSwgcmlkLCAmcmlkKSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChpID09IG5vZGUtPm1hcHBpbmdfY291bnQpCisJCQlnb3RvIGZhaWxfbWFwOworCisJCW5vZGUgPSBBQ1BJX0FERF9QVFIoc3RydWN0IGFjcGlfaW9ydF9ub2RlLCBpb3J0X3RhYmxlLAorCQkJCSAgICBtYXAtPm91dHB1dF9yZWZlcmVuY2UpOworCX0KKworZmFpbF9tYXA6CisJLyogTWFwIGlucHV0IFJJRCB0byBvdXRwdXQgUklEIHVuY2hhbmdlZCBvbiBtYXBwaW5nIGZhaWx1cmUqLworCWlmIChyaWRfb3V0KQorCQkqcmlkX291dCA9IHJpZF9pbjsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGFjcGlfaW9ydF9ub2RlICppb3J0X2ZpbmRfZGV2X25vZGUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwY2lfYnVzICpwYnVzOworCisJaWYgKCFkZXZfaXNfcGNpKGRldikpCisJCXJldHVybiBpb3J0X3NjYW5fbm9kZShBQ1BJX0lPUlRfTk9ERV9OQU1FRF9DT01QT05FTlQsCisJCQkJICAgICAgaW9ydF9tYXRjaF9ub2RlX2NhbGxiYWNrLCBkZXYpOworCisJLyogRmluZCBhIFBDSSByb290IGJ1cyAqLworCXBidXMgPSB0b19wY2lfZGV2KGRldiktPmJ1czsKKwl3aGlsZSAoIXBjaV9pc19yb290X2J1cyhwYnVzKSkKKwkJcGJ1cyA9IHBidXMtPnBhcmVudDsKKworCXJldHVybiBpb3J0X3NjYW5fbm9kZShBQ1BJX0lPUlRfTk9ERV9QQ0lfUk9PVF9DT01QTEVYLAorCQkJICAgICAgaW9ydF9tYXRjaF9ub2RlX2NhbGxiYWNrLCAmcGJ1cy0+ZGV2KTsKK30KKworLyoqCisgKiBpb3J0X21zaV9tYXBfcmlkKCkgLSBNYXAgYSBNU0kgcmVxdWVzdGVyIElEIGZvciBhIGRldmljZQorICogQGRldjogVGhlIGRldmljZSBmb3Igd2hpY2ggdGhlIG1hcHBpbmcgaXMgdG8gYmUgZG9uZS4KKyAqIEByZXFfaWQ6IFRoZSBkZXZpY2UgcmVxdWVzdGVyIElELgorICoKKyAqIFJldHVybnM6IG1hcHBlZCBNU0kgUklEIG9uIHN1Y2Nlc3MsIGlucHV0IHJlcXVlc3RlciBJRCBvdGhlcndpc2UKKyAqLwordTMyIGlvcnRfbXNpX21hcF9yaWQoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgcmVxX2lkKQoreworCXN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqbm9kZTsKKwl1MzIgZGV2X2lkOworCisJbm9kZSA9IGlvcnRfZmluZF9kZXZfbm9kZShkZXYpOworCWlmICghbm9kZSkKKwkJcmV0dXJuIHJlcV9pZDsKKworCWlvcnRfbm9kZV9tYXBfcmlkKG5vZGUsIHJlcV9pZCwgJmRldl9pZCwgQUNQSV9JT1JUX05PREVfSVRTX0dST1VQKTsKKwlyZXR1cm4gZGV2X2lkOworfQorCisvKioKKyAqIGlvcnRfZGV2X2ZpbmRfaXRzX2lkKCkgLSBGaW5kIHRoZSBJVFMgaWRlbnRpZmllciBmb3IgYSBkZXZpY2UKKyAqIEBkZXY6IFRoZSBkZXZpY2UuCisgKiBAaWR4OiBJbmRleCBvZiB0aGUgSVRTIGlkZW50aWZpZXIgbGlzdC4KKyAqIEBpdHNfaWQ6IElUUyBpZGVudGlmaWVyLgorICoKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgYXBwcm9wcmlhdGUgZXJyb3IgdmFsdWUgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgaW9ydF9kZXZfZmluZF9pdHNfaWQoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgcmVxX2lkLAorCQkJCXVuc2lnbmVkIGludCBpZHgsIGludCAqaXRzX2lkKQoreworCXN0cnVjdCBhY3BpX2lvcnRfaXRzX2dyb3VwICppdHM7CisJc3RydWN0IGFjcGlfaW9ydF9ub2RlICpub2RlOworCisJbm9kZSA9IGlvcnRfZmluZF9kZXZfbm9kZShkZXYpOworCWlmICghbm9kZSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCW5vZGUgPSBpb3J0X25vZGVfbWFwX3JpZChub2RlLCByZXFfaWQsIE5VTEwsIEFDUElfSU9SVF9OT0RFX0lUU19HUk9VUCk7CisJaWYgKCFub2RlKQorCQlyZXR1cm4gLUVOWElPOworCisJLyogTW92ZSB0byBJVFMgc3BlY2lmaWMgZGF0YSAqLworCWl0cyA9IChzdHJ1Y3QgYWNwaV9pb3J0X2l0c19ncm91cCAqKW5vZGUtPm5vZGVfZGF0YTsKKwlpZiAoaWR4ID4gaXRzLT5pdHNfY291bnQpIHsKKwkJZGV2X2VycihkZXYsICJyZXF1ZXN0ZWQgSVRTIElEIGluZGV4IFslZF0gaXMgZ3JlYXRlciB0aGFuIGF2YWlsYWJsZSBbJWRdXG4iLAorCQkJaWR4LCBpdHMtPml0c19jb3VudCk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJKml0c19pZCA9IGl0cy0+aWRlbnRpZmllcnNbaWR4XTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpb3J0X2dldF9kZXZpY2VfZG9tYWluKCkgLSBGaW5kIE1TSSBkb21haW4gcmVsYXRlZCB0byBhIGRldmljZQorICogQGRldjogVGhlIGRldmljZS4KKyAqIEByZXFfaWQ6IFJlcXVlc3RlciBJRCBmb3IgdGhlIGRldmljZS4KKyAqCisgKiBSZXR1cm5zOiB0aGUgTVNJIGRvbWFpbiBmb3IgdGhpcyBkZXZpY2UsIE5VTEwgb3RoZXJ3aXNlCisgKi8KK3N0cnVjdCBpcnFfZG9tYWluICppb3J0X2dldF9kZXZpY2VfZG9tYWluKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIHJlcV9pZCkKK3sKKwlzdHJ1Y3QgZndub2RlX2hhbmRsZSAqaGFuZGxlOworCWludCBpdHNfaWQ7CisKKwlpZiAoaW9ydF9kZXZfZmluZF9pdHNfaWQoZGV2LCByZXFfaWQsIDAsICZpdHNfaWQpKQorCQlyZXR1cm4gTlVMTDsKKworCWhhbmRsZSA9IGlvcnRfZmluZF9kb21haW5fdG9rZW4oaXRzX2lkKTsKKwlpZiAoIWhhbmRsZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gaXJxX2ZpbmRfbWF0Y2hpbmdfZndub2RlKGhhbmRsZSwgRE9NQUlOX0JVU19QQ0lfTVNJKTsKK30KKwordm9pZCBfX2luaXQgYWNwaV9pb3J0X2luaXQodm9pZCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlzdGF0dXMgPSBhY3BpX2dldF90YWJsZShBQ1BJX1NJR19JT1JULCAwLCAmaW9ydF90YWJsZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpICYmIHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKKwkJY29uc3QgY2hhciAqbXNnID0gYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cyk7CisJCXByX2VycigiRmFpbGVkIHRvIGdldCB0YWJsZSwgJXNcbiIsIG1zZyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2JhdHRlcnkuYyBiL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMKaW5kZXggYWIyMzQ3OS4uOTNlY2FlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2JhdHRlcnkuYworKysgYi9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jCkBAIC03MzMsMTUgKzczMywxNyBAQAogCQkJcmV0dXJuIHJlc3VsdDsKIAkJYWNwaV9iYXR0ZXJ5X2luaXRfYWxhcm0oYmF0dGVyeSk7CiAJfQorCisJcmVzdWx0ID0gYWNwaV9iYXR0ZXJ5X2dldF9zdGF0ZShiYXR0ZXJ5KTsKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gcmVzdWx0OworCWFjcGlfYmF0dGVyeV9xdWlya3MoYmF0dGVyeSk7CisKIAlpZiAoIWJhdHRlcnktPmJhdCkgewogCQlyZXN1bHQgPSBzeXNmc19hZGRfYmF0dGVyeShiYXR0ZXJ5KTsKIAkJaWYgKHJlc3VsdCkKIAkJCXJldHVybiByZXN1bHQ7CiAJfQotCXJlc3VsdCA9IGFjcGlfYmF0dGVyeV9nZXRfc3RhdGUoYmF0dGVyeSk7Ci0JaWYgKHJlc3VsdCkKLQkJcmV0dXJuIHJlc3VsdDsKLQlhY3BpX2JhdHRlcnlfcXVpcmtzKGJhdHRlcnkpOwogCiAJLyoKIAkgKiBXYWtldXAgdGhlIHN5c3RlbSBpZiBiYXR0ZXJ5IGlzIGNyaXRpY2FsIGxvdwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2J1cy5jIGIvZHJpdmVycy9hY3BpL2J1cy5jCmluZGV4IDg1YjdkMDcuLjU2MTkwZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9idXMuYworKysgYi9kcml2ZXJzL2FjcGkvYnVzLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpZmRlZiBDT05GSUdfWDg2CiAjaW5jbHVkZSA8YXNtL21wc3BlYy5oPgogI2VuZGlmCisjaW5jbHVkZSA8bGludXgvYWNwaV9pb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YWNwaS9hcGVpLmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CkBAIC05ODUsNyArOTg2LDggQEAKIAkJZ290byBlcnJvcjA7CiAJfQogCi0JaWYgKGFjcGlfZ2JsX2dyb3VwX21vZHVsZV9sZXZlbF9jb2RlKSB7CisJaWYgKCFhY3BpX2dibF9wYXJzZV90YWJsZV9hc190ZXJtX2xpc3QgJiYKKwkgICAgYWNwaV9nYmxfZ3JvdXBfbW9kdWxlX2xldmVsX2NvZGUpIHsKIAkJc3RhdHVzID0gYWNwaV9sb2FkX3RhYmxlcygpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCXByaW50ayhLRVJOX0VSUiBQUkVGSVgKQEAgLTEwNzQsNyArMTA3Niw4IEBACiAJc3RhdHVzID0gYWNwaV9lY19lY2R0X3Byb2JlKCk7CiAJLyogSWdub3JlIHJlc3VsdC4gTm90IGhhdmluZyBhbiBFQ0RUIGlzIG5vdCBmYXRhbC4gKi8KIAotCWlmICghYWNwaV9nYmxfZ3JvdXBfbW9kdWxlX2xldmVsX2NvZGUpIHsKKwlpZiAoYWNwaV9nYmxfcGFyc2VfdGFibGVfYXNfdGVybV9saXN0IHx8CisJICAgICFhY3BpX2dibF9ncm91cF9tb2R1bGVfbGV2ZWxfY29kZSkgewogCQlzdGF0dXMgPSBhY3BpX2xvYWRfdGFibGVzKCk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWApAQCAtMTE4Niw2ICsxMTg5LDcgQEAKIAl9CiAKIAlwY2lfbW1jZmdfbGF0ZV9pbml0KCk7CisJYWNwaV9pb3J0X2luaXQoKTsKIAlhY3BpX3NjYW5faW5pdCgpOwogCWFjcGlfZWNfaW5pdCgpOwogCWFjcGlfZGVidWdmc19pbml0KCk7CkBAIC0xMTkzLDYgKzExOTcsNyBAQAogCWFjcGlfd2FrZXVwX2RldmljZV9pbml0KCk7CiAJYWNwaV9kZWJ1Z2dlcl9pbml0KCk7CiAJYWNwaV9zZXR1cF9zYl9ub3RpZnlfaGFuZGxlcigpOworCWFjcGlfc2V0X3Byb2Nlc3Nvcl9tYXBwaW5nKCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9idXR0b24uYyBiL2RyaXZlcnMvYWNwaS9idXR0b24uYwppbmRleCAzMWFiYjBiLi5lMTlmNTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYnV0dG9uLmMKKysrIGIvZHJpdmVycy9hY3BpL2J1dHRvbi5jCkBAIC0xOSw2ICsxOSw4IEBACiAgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgIkFDUEkgOiBidXR0b246ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0xMDQsNiArMTA2LDggQEAKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dDsKIAljaGFyIHBoeXNbMzJdOwkJCS8qIGZvciBpbnB1dCBkZXZpY2UgKi8KIAl1bnNpZ25lZCBsb25nIHB1c2hlZDsKKwlpbnQgbGFzdF9zdGF0ZTsKKwlrdGltZV90IGxhc3RfdGltZTsKIAlib29sIHN1c3BlbmRlZDsKIH07CiAKQEAgLTExMSw2ICsxMTUsMTAgQEAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kZXZpY2UgKmxpZF9kZXZpY2U7CiBzdGF0aWMgdTggbGlkX2luaXRfc3RhdGUgPSBBQ1BJX0JVVFRPTl9MSURfSU5JVF9NRVRIT0Q7CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxpZF9yZXBvcnRfaW50ZXJ2YWwgX19yZWFkX21vc3RseSA9IDUwMDsKK21vZHVsZV9wYXJhbShsaWRfcmVwb3J0X2ludGVydmFsLCB1bG9uZywgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGxpZF9yZXBvcnRfaW50ZXJ2YWwsICJJbnRlcnZhbCAobXMpIGJldHdlZW4gbGlkIGtleSBldmVudHMiKTsKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTIEludGVyZmFjZSAoL3Byb2MpCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTM0LDEwICsxNDIsNzkgQEAKIHsKIAlzdHJ1Y3QgYWNwaV9idXR0b24gKmJ1dHRvbiA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKIAlpbnQgcmV0OworCWt0aW1lX3QgbmV4dF9yZXBvcnQ7CisJYm9vbCBkb191cGRhdGU7CiAKLQkvKiBpbnB1dCBsYXllciBjaGVja3MgaWYgZXZlbnQgaXMgcmVkdW5kYW50ICovCi0JaW5wdXRfcmVwb3J0X3N3aXRjaChidXR0b24tPmlucHV0LCBTV19MSUQsICFzdGF0ZSk7Ci0JaW5wdXRfc3luYyhidXR0b24tPmlucHV0KTsKKwkvKgorCSAqIEluIGxpZF9pbml0X3N0YXRlPWlnbm9yZSBtb2RlLCBpZiB1c2VyIG9wZW5zL2Nsb3NlcyBsaWQKKwkgKiBmcmVxdWVudGx5IHdpdGggIm9wZW4iIG1pc3NpbmcsIGFuZCAibGFzdF90aW1lIiBpcyBhbHNvIHVwZGF0ZWQKKwkgKiBmcmVxdWVudGx5LCAiY2xvc2UiIGNhbm5vdCBiZSBkZWxpdmVyZWQgdG8gdGhlIHVzZXJzcGFjZS4KKwkgKiBTbyAibGFzdF90aW1lIiBpcyBvbmx5IHVwZGF0ZWQgYWZ0ZXIgYSB0aW1lb3V0IG9yIGFuIGFjdHVhbAorCSAqIHN3aXRjaC4KKwkgKi8KKwlpZiAobGlkX2luaXRfc3RhdGUgIT0gQUNQSV9CVVRUT05fTElEX0lOSVRfSUdOT1JFIHx8CisJICAgIGJ1dHRvbi0+bGFzdF9zdGF0ZSAhPSAhIXN0YXRlKQorCQlkb191cGRhdGUgPSB0cnVlOworCWVsc2UKKwkJZG9fdXBkYXRlID0gZmFsc2U7CisKKwluZXh0X3JlcG9ydCA9IGt0aW1lX2FkZChidXR0b24tPmxhc3RfdGltZSwKKwkJCQltc190b19rdGltZShsaWRfcmVwb3J0X2ludGVydmFsKSk7CisJaWYgKGJ1dHRvbi0+bGFzdF9zdGF0ZSA9PSAhIXN0YXRlICYmCisJICAgIGt0aW1lX2FmdGVyKGt0aW1lX2dldCgpLCBuZXh0X3JlcG9ydCkpIHsKKwkJLyogQ29tcGxhaW4gdGhlIGJ1Z2d5IGZpcm13YXJlICovCisJCXByX3dhcm5fb25jZSgiVGhlIGxpZCBkZXZpY2UgaXMgbm90IGNvbXBsaWFudCB0byBTV19MSUQuXG4iKTsKKworCQkvKgorCQkgKiBTZW5kIHRoZSB1bnJlbGlhYmxlIGNvbXBsZW1lbnQgc3dpdGNoIGV2ZW50OgorCQkgKgorCQkgKiBPbiBtb3N0IHBsYXRmb3JtcywgdGhlIGxpZCBkZXZpY2UgaXMgcmVsaWFibGUuIEhvd2V2ZXIKKwkJICogdGhlcmUgYXJlIGV4Y2VwdGlvbnM6CisJCSAqIDEuIFBsYXRmb3JtcyByZXR1cm5pbmcgaW5pdGlhbCBsaWQgc3RhdGUgYXMgImNsb3NlIiBieQorCQkgKiAgICBkZWZhdWx0IGFmdGVyIGJvb3RpbmcvcmVzdW1pbmc6CisJCSAqICAgICBodHRwczovL2J1Z3ppbGxhLmtlcm5lbC5vcmcvc2hvd19idWcuY2dpP2lkPTg5MjExCisJCSAqICAgICBodHRwczovL2J1Z3ppbGxhLmtlcm5lbC5vcmcvc2hvd19idWcuY2dpP2lkPTEwNjE1MQorCQkgKiAyLiBQbGF0Zm9ybXMgbmV2ZXIgcmVwb3J0aW5nICJvcGVuIiBldmVudHM6CisJCSAqICAgICBodHRwczovL2J1Z3ppbGxhLmtlcm5lbC5vcmcvc2hvd19idWcuY2dpP2lkPTEwNjk0MQorCQkgKiBPbiB0aGVzZSBidWdneSBwbGF0Zm9ybXMsIHRoZSB1c2FnZSBtb2RlbCBvZiB0aGUgQUNQSQorCQkgKiBsaWQgZGV2aWNlIGFjdHVhbGx5IGlzOgorCQkgKiAxLiBUaGUgaW5pdGlhbCByZXR1cm5pbmcgdmFsdWUgb2YgX0xJRCBtYXkgbm90IGJlCisJCSAqICAgIHJlbGlhYmxlLgorCQkgKiAyLiBUaGUgb3BlbiBldmVudCBtYXkgbm90IGJlIHJlbGlhYmxlLgorCQkgKiAzLiBUaGUgY2xvc2UgZXZlbnQgaXMgcmVsaWFibGUuCisJCSAqCisJCSAqIEJ1dCBTV19MSUQgaXMgdHlwZWQgYXMgaW5wdXQgc3dpdGNoIGV2ZW50LCB0aGUgaW5wdXQKKwkJICogbGF5ZXIgY2hlY2tzIGlmIHRoZSBldmVudCBpcyByZWR1bmRhbnQuIEhlbmNlIGlmIHRoZQorCQkgKiBzdGF0ZSBpcyBub3Qgc3dpdGNoZWQsIHRoZSB1c2Vyc3BhY2UgY2Fubm90IHNlZSB0aGlzCisJCSAqIHBsYXRmb3JtIHRyaWdnZXJlZCByZWxpYWJsZSBldmVudC4gQnkgaW5zZXJ0aW5nIGEKKwkJICogY29tcGxlbWVudCBzd2l0Y2ggZXZlbnQsIGl0IHRoZW4gaXMgZ3VhcmFudGVlZCB0aGF0IHRoZQorCQkgKiBwbGF0Zm9ybSB0cmlnZ2VyZWQgcmVsaWFibGUgb25lIGNhbiBhbHdheXMgYmUgc2VlbiBieQorCQkgKiB0aGUgdXNlcnNwYWNlLgorCQkgKi8KKwkJaWYgKGxpZF9pbml0X3N0YXRlID09IEFDUElfQlVUVE9OX0xJRF9JTklUX0lHTk9SRSkgeworCQkJZG9fdXBkYXRlID0gdHJ1ZTsKKwkJCS8qCisJCQkgKiBEbyBnZW5lcmF0ZSBjb21wbGVtZW50IHN3aXRjaCBldmVudCBmb3IgImNsb3NlIgorCQkJICogYXMgImNsb3NlIiBpcyByZWxpYWJsZSBhbmQgd3JvbmcgIm9wZW4iIHdvbid0CisJCQkgKiB0cmlnZ2VyIHVuZXhwZWN0ZWQgYmVoYXZpb3JzLgorCQkJICogRG8gbm90IGdlbmVyYXRlIGNvbXBsZW1lbnQgc3dpdGNoIGV2ZW50IGZvcgorCQkJICogIm9wZW4iIGFzICJvcGVuIiBpcyBub3QgcmVsaWFibGUgYW5kIHdyb25nCisJCQkgKiAiY2xvc2UiIHdpbGwgdHJpZ2dlciB1bmV4cGVjdGVkIGJlaGF2aW9ycy4KKwkJCSAqLworCQkJaWYgKCFzdGF0ZSkgeworCQkJCWlucHV0X3JlcG9ydF9zd2l0Y2goYnV0dG9uLT5pbnB1dCwKKwkJCQkJCSAgICBTV19MSUQsIHN0YXRlKTsKKwkJCQlpbnB1dF9zeW5jKGJ1dHRvbi0+aW5wdXQpOworCQkJfQorCQl9CisJfQorCS8qIFNlbmQgdGhlIHBsYXRmb3JtIHRyaWdnZXJlZCByZWxpYWJsZSBldmVudCAqLworCWlmIChkb191cGRhdGUpIHsKKwkJaW5wdXRfcmVwb3J0X3N3aXRjaChidXR0b24tPmlucHV0LCBTV19MSUQsICFzdGF0ZSk7CisJCWlucHV0X3N5bmMoYnV0dG9uLT5pbnB1dCk7CisJCWJ1dHRvbi0+bGFzdF9zdGF0ZSA9ICEhc3RhdGU7CisJCWJ1dHRvbi0+bGFzdF90aW1lID0ga3RpbWVfZ2V0KCk7CisJfQogCiAJaWYgKHN0YXRlKQogCQlwbV93YWtldXBfZXZlbnQoJmRldmljZS0+ZGV2LCAwKTsKQEAgLTQxMSw2ICs0ODgsOCBAQAogCQlzdHJjcHkobmFtZSwgQUNQSV9CVVRUT05fREVWSUNFX05BTUVfTElEKTsKIAkJc3ByaW50ZihjbGFzcywgIiVzLyVzIiwKIAkJCUFDUElfQlVUVE9OX0NMQVNTLCBBQ1BJX0JVVFRPTl9TVUJDTEFTU19MSUQpOworCQlidXR0b24tPmxhc3Rfc3RhdGUgPSAhIWFjcGlfbGlkX2V2YWx1YXRlX3N0YXRlKGRldmljZSk7CisJCWJ1dHRvbi0+bGFzdF90aW1lID0ga3RpbWVfZ2V0KCk7CiAJfSBlbHNlIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiVW5zdXBwb3J0ZWQgaGlkIFslc11cbiIsIGhpZCk7CiAJCWVycm9yID0gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9jcHBjX2FjcGkuYyBiL2RyaXZlcnMvYWNwaS9jcHBjX2FjcGkuYwppbmRleCAyZTk4MTczLi5kMGQwNTA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvY3BwY19hY3BpLmMKKysrIGIvZHJpdmVycy9hY3BpL2NwcGNfYWNwaS5jCkBAIC00MCwxNSArNDAsNDggQEAKICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9rdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogCiAjaW5jbHVkZSA8YWNwaS9jcHBjX2FjcGkuaD4KLS8qCi0gKiBMb2NrIHRvIHByb3ZpZGUgbXV0dWFsbHkgZXhjbHVzaXZlIGFjY2VzcyB0byB0aGUgUENDCi0gKiBjaGFubmVsLiBlLmcuIFdoZW4gdGhlIHJlbW90ZSB1cGRhdGVzIHRoZSBzaGFyZWQgcmVnaW9uCi0gKiB3aXRoIG5ldyBkYXRhLCB0aGUgcmVhZGVyIG5lZWRzIHRvIGJlIHByb3RlY3RlZCBmcm9tCi0gKiBvdGhlciBDUFVzIGFjdGl2aXR5IG9uIHRoZSBzYW1lIGNoYW5uZWwuCi0gKi8KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0socGNjX2xvY2spOworCitzdHJ1Y3QgY3BwY19wY2NfZGF0YSB7CisJc3RydWN0IG1ib3hfY2hhbiAqcGNjX2NoYW5uZWw7CisJdm9pZCBfX2lvbWVtICpwY2NfY29tbV9hZGRyOworCWludCBwY2Nfc3Vic3BhY2VfaWR4OworCWJvb2wgcGNjX2NoYW5uZWxfYWNxdWlyZWQ7CisJa3RpbWVfdCBkZWFkbGluZTsKKwl1bnNpZ25lZCBpbnQgcGNjX21wYXIsIHBjY19tcnR0LCBwY2Nfbm9taW5hbDsKKworCWJvb2wgcGVuZGluZ19wY2Nfd3JpdGVfY21kOwkvKiBBbnkgcGVuZGluZy9iYXRjaGVkIFBDQyB3cml0ZSBjbWRzPyAqLworCWJvb2wgcGxhdGZvcm1fb3duc19wY2M7CQkvKiBPd25lcnNoaXAgb2YgUENDIHN1YnNwYWNlICovCisJdW5zaWduZWQgaW50IHBjY193cml0ZV9jbnQ7CS8qIFJ1bm5pbmcgY291bnQgb2YgUENDIHdyaXRlIGNvbW1hbmRzICovCisKKwkvKgorCSAqIExvY2sgdG8gcHJvdmlkZSBjb250cm9sbGVkIGFjY2VzcyB0byB0aGUgUENDIGNoYW5uZWwuCisJICoKKwkgKiBGb3IgcGVyZm9ybWFuY2UgY3JpdGljYWwgdXNlY2FzZXMoY3VycmVudGx5IGNwcGNfc2V0X3BlcmYpCisJICoJV2UgbmVlZCB0byB0YWtlIHJlYWRfbG9jayBhbmQgY2hlY2sgaWYgY2hhbm5lbCBiZWxvbmdzIHRvIE9TUE0KKwkgKiBiZWZvcmUgcmVhZGluZyBvciB3cml0aW5nIHRvIFBDQyBzdWJzcGFjZQorCSAqCVdlIG5lZWQgdG8gdGFrZSB3cml0ZV9sb2NrIGJlZm9yZSB0cmFuc2ZlcnJpbmcgdGhlIGNoYW5uZWwKKwkgKiBvd25lcnNoaXAgdG8gdGhlIHBsYXRmb3JtIHZpYSBhIERvb3JiZWxsCisJICoJVGhpcyBhbGxvd3MgdXMgdG8gYmF0Y2ggYSBudW1iZXIgb2YgQ1BQQyByZXF1ZXN0cyBpZiB0aGV5IGhhcHBlbgorCSAqIHRvIG9yaWdpbmF0ZSBpbiBhYm91dCB0aGUgc2FtZSB0aW1lCisJICoKKwkgKiBGb3Igbm9uLXBlcmZvcm1hbmNlIGNyaXRpY2FsIHVzZWNhc2VzKGluaXQpCisJICoJVGFrZSB3cml0ZV9sb2NrIGZvciBhbGwgcHVycG9zZXMgd2hpY2ggZ2l2ZXMgZXhjbHVzaXZlIGFjY2VzcworCSAqLworCXN0cnVjdCByd19zZW1hcGhvcmUgcGNjX2xvY2s7CisKKwkvKiBXYWl0IHF1ZXVlIGZvciBDUFVzIHdob3NlIHJlcXVlc3RzIHdlcmUgYmF0Y2hlZCAqLworCXdhaXRfcXVldWVfaGVhZF90IHBjY193cml0ZV93YWl0X3E7Cit9OworCisvKiBTdHJ1Y3R1cmUgdG8gcmVwcmVzZW50IHRoZSBzaW5nbGUgUENDIGNoYW5uZWwgKi8KK3N0YXRpYyBzdHJ1Y3QgY3BwY19wY2NfZGF0YSBwY2NfZGF0YSA9IHsKKwkucGNjX3N1YnNwYWNlX2lkeCA9IC0xLAorCS5wbGF0Zm9ybV9vd25zX3BjYyA9IHRydWUsCit9OwogCiAvKgogICogVGhlIGNwY19kZXNjIHN0cnVjdHVyZSBjb250YWlucyB0aGUgQUNQSSByZWdpc3RlciBkZXRhaWxzCkBAIC01OSwxOCArOTIsMjUgQEAKICAqLwogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcGNfZGVzYyAqLCBjcGNfZGVzY19wdHIpOwogCi0vKiBUaGlzIGxheWVyIGhhbmRsZXMgYWxsIHRoZSBQQ0Mgc3BlY2lmaWNzIGZvciBDUFBDLiAqLwotc3RhdGljIHN0cnVjdCBtYm94X2NoYW4gKnBjY19jaGFubmVsOwotc3RhdGljIHZvaWQgX19pb21lbSAqcGNjX2NvbW1fYWRkcjsKLXN0YXRpYyB1NjQgY29tbV9iYXNlX2FkZHI7Ci1zdGF0aWMgaW50IHBjY19zdWJzcGFjZV9pZHggPSAtMTsKLXN0YXRpYyBib29sIHBjY19jaGFubmVsX2FjcXVpcmVkOwotc3RhdGljIGt0aW1lX3QgZGVhZGxpbmU7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHBjY19tcGFyLCBwY2NfbXJ0dDsKLQogLyogcGNjIG1hcHBlZCBhZGRyZXNzICsgaGVhZGVyIHNpemUgKyBvZmZzZXQgd2l0aGluIFBDQyBzdWJzcGFjZSAqLwotI2RlZmluZSBHRVRfUENDX1ZBRERSKG9mZnMpIChwY2NfY29tbV9hZGRyICsgMHg4ICsgKG9mZnMpKQorI2RlZmluZSBHRVRfUENDX1ZBRERSKG9mZnMpIChwY2NfZGF0YS5wY2NfY29tbV9hZGRyICsgMHg4ICsgKG9mZnMpKQogCisvKiBDaGVjayBpZiBhIENQQyByZWdzaXRlciBpcyBpbiBQQ0MgKi8KKyNkZWZpbmUgQ1BDX0lOX1BDQyhjcGMpICgoY3BjKS0+dHlwZSA9PSBBQ1BJX1RZUEVfQlVGRkVSICYmCQlcCisJCQkJKGNwYyktPmNwY19lbnRyeS5yZWcuc3BhY2VfaWQgPT0JXAorCQkJCUFDUElfQURSX1NQQUNFX1BMQVRGT1JNX0NPTU0pCisKKy8qIEV2YWx1dGVzIHRvIFRydWUgaWYgcmVnIGlzIGEgTlVMTCByZWdpc3RlciBkZXNjcmlwdG9yICovCisjZGVmaW5lIElTX05VTExfUkVHKHJlZykgKChyZWcpLT5zcGFjZV9pZCA9PSAgQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX01FTU9SWSAmJiBcCisJCQkJKHJlZyktPmFkZHJlc3MgPT0gMCAmJgkJCVwKKwkJCQkocmVnKS0+Yml0X3dpZHRoID09IDAgJiYJCVwKKwkJCQkocmVnKS0+Yml0X29mZnNldCA9PSAwICYmCQlcCisJCQkJKHJlZyktPmFjY2Vzc193aWR0aCA9PSAwKQorCisvKiBFdmFsdXRlcyB0byBUcnVlIGlmIGFuIG9wdGlvbmFsIGNwYyBmaWVsZCBpcyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgQ1BDX1NVUFBPUlRFRChjcGMpICgoY3BjKS0+dHlwZSA9PSBBQ1BJX1RZUEVfSU5URUdFUiA/CQlcCisJCQkJISEoY3BjKS0+Y3BjX2VudHJ5LmludF92YWx1ZSA6CQlcCisJCQkJIUlTX05VTExfUkVHKCYoY3BjKS0+Y3BjX2VudHJ5LnJlZykpCiAvKgogICogQXJiaXRyYXJ5IFJldHJpZXMgaW4gY2FzZSB0aGUgcmVtb3RlIHByb2Nlc3NvciBpcyBzbG93IHRvIHJlc3BvbmQKICAqIHRvIFBDQyBjb21tYW5kcy4gS2VlcGluZyBpdCBoaWdoIGVub3VnaCB0byBjb3ZlciBlbXVsYXRvcnMgd2hlcmUKQEAgLTc4LDExICsxMTgsNzkgQEAKICAqLwogI2RlZmluZSBOVU1fUkVUUklFUyA1MDAKIAotc3RhdGljIGludCBjaGVja19wY2NfY2hhbih2b2lkKQorc3RydWN0IGNwcGNfYXR0ciB7CisJc3RydWN0IGF0dHJpYnV0ZSBhdHRyOworCXNzaXplX3QgKCpzaG93KShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zik7CisJc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmMsIHNzaXplX3QgY291bnQpOworfTsKKworI2RlZmluZSBkZWZpbmVfb25lX2NwcGNfcm8oX25hbWUpCQlcCitzdGF0aWMgc3RydWN0IGNwcGNfYXR0ciBfbmFtZSA9CQkJXAorX19BVFRSKF9uYW1lLCAwNDQ0LCBzaG93XyMjX25hbWUsIE5VTEwpCisKKyNkZWZpbmUgdG9fY3BjX2Rlc2MoYSkgY29udGFpbmVyX29mKGEsIHN0cnVjdCBjcGNfZGVzYywga29iaikKKworc3RhdGljIHNzaXplX3Qgc2hvd19mZWVkYmFja19jdHJzKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQlzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0JaW50IHJldCA9IC1FSU87Ci0Jc3RydWN0IGFjcGlfcGNjdF9zaGFyZWRfbWVtb3J5IF9faW9tZW0gKmdlbmVyaWNfY29tbV9iYXNlID0gcGNjX2NvbW1fYWRkcjsKLQlrdGltZV90IG5leHRfZGVhZGxpbmUgPSBrdGltZV9hZGQoa3RpbWVfZ2V0KCksIGRlYWRsaW5lKTsKKwlzdHJ1Y3QgY3BjX2Rlc2MgKmNwY19wdHIgPSB0b19jcGNfZGVzYyhrb2JqKTsKKwlzdHJ1Y3QgY3BwY19wZXJmX2ZiX2N0cnMgZmJfY3RycyA9IHswfTsKKworCWNwcGNfZ2V0X3BlcmZfY3RycyhjcGNfcHRyLT5jcHVfaWQsICZmYl9jdHJzKTsKKworCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJyZWY6JWxsdSBkZWw6JWxsdVxuIiwKKwkJCWZiX2N0cnMucmVmZXJlbmNlLCBmYl9jdHJzLmRlbGl2ZXJlZCk7Cit9CitkZWZpbmVfb25lX2NwcGNfcm8oZmVlZGJhY2tfY3Rycyk7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcmVmZXJlbmNlX3BlcmYoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgY3BjX2Rlc2MgKmNwY19wdHIgPSB0b19jcGNfZGVzYyhrb2JqKTsKKwlzdHJ1Y3QgY3BwY19wZXJmX2ZiX2N0cnMgZmJfY3RycyA9IHswfTsKKworCWNwcGNfZ2V0X3BlcmZfY3RycyhjcGNfcHRyLT5jcHVfaWQsICZmYl9jdHJzKTsKKworCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGx1XG4iLAorCQkJZmJfY3Rycy5yZWZlcmVuY2VfcGVyZik7Cit9CitkZWZpbmVfb25lX2NwcGNfcm8ocmVmZXJlbmNlX3BlcmYpOworCitzdGF0aWMgc3NpemVfdCBzaG93X3dyYXBhcm91bmRfdGltZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQlzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGNwY19kZXNjICpjcGNfcHRyID0gdG9fY3BjX2Rlc2Moa29iaik7CisJc3RydWN0IGNwcGNfcGVyZl9mYl9jdHJzIGZiX2N0cnMgPSB7MH07CisKKwljcHBjX2dldF9wZXJmX2N0cnMoY3BjX3B0ci0+Y3B1X2lkLCAmZmJfY3Rycyk7CisKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWxsdVxuIiwgZmJfY3Rycy5jdHJfd3JhcF90aW1lKTsKKworfQorZGVmaW5lX29uZV9jcHBjX3JvKHdyYXBhcm91bmRfdGltZSk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpjcHBjX2F0dHJzW10gPSB7CisJJmZlZWRiYWNrX2N0cnMuYXR0ciwKKwkmcmVmZXJlbmNlX3BlcmYuYXR0ciwKKwkmd3JhcGFyb3VuZF90aW1lLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgY3BwY19rdHlwZSA9IHsKKwkuc3lzZnNfb3BzID0gJmtvYmpfc3lzZnNfb3BzLAorCS5kZWZhdWx0X2F0dHJzID0gY3BwY19hdHRycywKK307CisKK3N0YXRpYyBpbnQgY2hlY2tfcGNjX2NoYW4oYm9vbCBjaGtfZXJyX2JpdCkKK3sKKwlpbnQgcmV0ID0gLUVJTywgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgYWNwaV9wY2N0X3NoYXJlZF9tZW1vcnkgX19pb21lbSAqZ2VuZXJpY19jb21tX2Jhc2UgPSBwY2NfZGF0YS5wY2NfY29tbV9hZGRyOworCWt0aW1lX3QgbmV4dF9kZWFkbGluZSA9IGt0aW1lX2FkZChrdGltZV9nZXQoKSwgcGNjX2RhdGEuZGVhZGxpbmUpOworCisJaWYgKCFwY2NfZGF0YS5wbGF0Zm9ybV9vd25zX3BjYykKKwkJcmV0dXJuIDA7CiAKIAkvKiBSZXRyeSBpbiBjYXNlIHRoZSByZW1vdGUgcHJvY2Vzc29yIHdhcyB0b28gc2xvdyB0byBjYXRjaCB1cC4gKi8KIAl3aGlsZSAoIWt0aW1lX2FmdGVyKGt0aW1lX2dldCgpLCBuZXh0X2RlYWRsaW5lKSkgewpAQCAtOTEsOCArMTk5LDExIEBACiAJCSAqIHBsYXRmb3JtIGFuZCBzaG91bGQgaGF2ZSBzZXQgdGhlIGNvbW1hbmQgY29tcGxldGlvbiBiaXQgd2hlbgogCQkgKiBQQ0MgY2FuIGJlIHVzZWQgYnkgT1NQTQogCQkgKi8KLQkJaWYgKHJlYWR3X3JlbGF4ZWQoJmdlbmVyaWNfY29tbV9iYXNlLT5zdGF0dXMpICYgUENDX0NNRF9DT01QTEVURSkgeworCQlzdGF0dXMgPSByZWFkd19yZWxheGVkKCZnZW5lcmljX2NvbW1fYmFzZS0+c3RhdHVzKTsKKwkJaWYgKHN0YXR1cyAmIFBDQ19DTURfQ09NUExFVEVfTUFTSykgewogCQkJcmV0ID0gMDsKKwkJCWlmIChjaGtfZXJyX2JpdCAmJiAoc3RhdHVzICYgUENDX0VSUk9SX01BU0spKQorCQkJCXJldCA9IC1FSU87CiAJCQlicmVhazsKIAkJfQogCQkvKgpAQCAtMTAyLDE0ICsyMTMsMjMgQEAKIAkJdWRlbGF5KDMpOwogCX0KIAorCWlmIChsaWtlbHkoIXJldCkpCisJCXBjY19kYXRhLnBsYXRmb3JtX293bnNfcGNjID0gZmFsc2U7CisJZWxzZQorCQlwcl9lcnIoIlBDQyBjaGVjayBjaGFubmVsIGZhaWxlZC4gU3RhdHVzPSV4XG4iLCBzdGF0dXMpOworCiAJcmV0dXJuIHJldDsKIH0KIAorLyoKKyAqIFRoaXMgZnVuY3Rpb24gdHJhbnNmZXJzIHRoZSBvd25lcnNoaXAgb2YgdGhlIFBDQyB0byB0aGUgcGxhdGZvcm0KKyAqIFNvIGl0IG11c3QgYmUgY2FsbGVkIHdoaWxlIGhvbGRpbmcgd3JpdGVfbG9jayhwY2NfbG9jaykKKyAqLwogc3RhdGljIGludCBzZW5kX3BjY19jbWQodTE2IGNtZCkKIHsKLQlpbnQgcmV0ID0gLUVJTzsKKwlpbnQgcmV0ID0gLUVJTywgaTsKIAlzdHJ1Y3QgYWNwaV9wY2N0X3NoYXJlZF9tZW1vcnkgKmdlbmVyaWNfY29tbV9iYXNlID0KLQkJKHN0cnVjdCBhY3BpX3BjY3Rfc2hhcmVkX21lbW9yeSAqKSBwY2NfY29tbV9hZGRyOworCQkoc3RydWN0IGFjcGlfcGNjdF9zaGFyZWRfbWVtb3J5ICopIHBjY19kYXRhLnBjY19jb21tX2FkZHI7CiAJc3RhdGljIGt0aW1lX3QgbGFzdF9jbWRfY21wbF90aW1lLCBsYXN0X21wYXJfcmVzZXQ7CiAJc3RhdGljIGludCBtcGFyX2NvdW50OwogCXVuc2lnbmVkIGludCB0aW1lX2RlbHRhOwpAQCAtMTE5LDIwICsyMzksMjkgQEAKIAkgKiB0aGUgY2hhbm5lbCBiZWZvcmUgd3JpdGluZyB0byBQQ0Mgc3BhY2UKIAkgKi8KIAlpZiAoY21kID09IENNRF9SRUFEKSB7Ci0JCXJldCA9IGNoZWNrX3BjY19jaGFuKCk7CisJCS8qCisJCSAqIElmIHRoZXJlIGFyZSBwZW5kaW5nIGNwY193cml0ZXMsIHRoZW4gd2Ugc3RvbGUgdGhlIGNoYW5uZWwKKwkJICogYmVmb3JlIHdyaXRlIGNvbXBsZXRpb24sIHNvIGZpcnN0IHNlbmQgYSBXUklURSBjb21tYW5kIHRvCisJCSAqIHBsYXRmb3JtCisJCSAqLworCQlpZiAocGNjX2RhdGEucGVuZGluZ19wY2Nfd3JpdGVfY21kKQorCQkJc2VuZF9wY2NfY21kKENNRF9XUklURSk7CisKKwkJcmV0ID0gY2hlY2tfcGNjX2NoYW4oZmFsc2UpOwogCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9CisJCQlnb3RvIGVuZDsKKwl9IGVsc2UgLyogQ01EX1dSSVRFICovCisJCXBjY19kYXRhLnBlbmRpbmdfcGNjX3dyaXRlX2NtZCA9IEZBTFNFOwogCiAJLyoKIAkgKiBIYW5kbGUgdGhlIE1pbmltdW0gUmVxdWVzdCBUdXJuYXJvdW5kIFRpbWUoTVJUVCkKIAkgKiAiVGhlIG1pbmltdW0gYW1vdW50IG9mIHRpbWUgdGhhdCBPU1BNIG11c3Qgd2FpdCBhZnRlciB0aGUgY29tcGxldGlvbgogCSAqIG9mIGEgY29tbWFuZCBiZWZvcmUgaXNzdWluZyB0aGUgbmV4dCBjb21tYW5kLCBpbiBtaWNyb3NlY29uZHMiCiAJICovCi0JaWYgKHBjY19tcnR0KSB7CisJaWYgKHBjY19kYXRhLnBjY19tcnR0KSB7CiAJCXRpbWVfZGVsdGEgPSBrdGltZV91c19kZWx0YShrdGltZV9nZXQoKSwgbGFzdF9jbWRfY21wbF90aW1lKTsKLQkJaWYgKHBjY19tcnR0ID4gdGltZV9kZWx0YSkKLQkJCXVkZWxheShwY2NfbXJ0dCAtIHRpbWVfZGVsdGEpOworCQlpZiAocGNjX2RhdGEucGNjX21ydHQgPiB0aW1lX2RlbHRhKQorCQkJdWRlbGF5KHBjY19kYXRhLnBjY19tcnR0IC0gdGltZV9kZWx0YSk7CiAJfQogCiAJLyoKQEAgLTE0NiwxNSArMjc1LDE2IEBACiAJICogbm90IHNlbmQgdGhlIHJlcXVlc3QgdG8gdGhlIHBsYXRmb3JtIGFmdGVyIGhpdHRpbmcgdGhlIE1QQVIgbGltaXQgaW4KIAkgKiBhbnkgNjBzIHdpbmRvdwogCSAqLwotCWlmIChwY2NfbXBhcikgeworCWlmIChwY2NfZGF0YS5wY2NfbXBhcikgewogCQlpZiAobXBhcl9jb3VudCA9PSAwKSB7CiAJCQl0aW1lX2RlbHRhID0ga3RpbWVfbXNfZGVsdGEoa3RpbWVfZ2V0KCksIGxhc3RfbXBhcl9yZXNldCk7CiAJCQlpZiAodGltZV9kZWx0YSA8IDYwICogTVNFQ19QRVJfU0VDKSB7CiAJCQkJcHJfZGVidWcoIlBDQyBjbWQgbm90IHNlbnQgZHVlIHRvIE1QQVIgbGltaXQiKTsKLQkJCQlyZXR1cm4gLUVJTzsKKwkJCQlyZXQgPSAtRUlPOworCQkJCWdvdG8gZW5kOwogCQkJfQogCQkJbGFzdF9tcGFyX3Jlc2V0ID0ga3RpbWVfZ2V0KCk7Ci0JCQltcGFyX2NvdW50ID0gcGNjX21wYXI7CisJCQltcGFyX2NvdW50ID0gcGNjX2RhdGEucGNjX21wYXI7CiAJCX0KIAkJbXBhcl9jb3VudC0tOwogCX0KQEAgLTE2NSwzMyArMjk1LDQzIEBACiAJLyogRmxpcCBDTUQgQ09NUExFVEUgYml0ICovCiAJd3JpdGV3X3JlbGF4ZWQoMCwgJmdlbmVyaWNfY29tbV9iYXNlLT5zdGF0dXMpOwogCisJcGNjX2RhdGEucGxhdGZvcm1fb3duc19wY2MgPSB0cnVlOworCiAJLyogUmluZyBkb29yYmVsbCAqLwotCXJldCA9IG1ib3hfc2VuZF9tZXNzYWdlKHBjY19jaGFubmVsLCAmY21kKTsKKwlyZXQgPSBtYm94X3NlbmRfbWVzc2FnZShwY2NfZGF0YS5wY2NfY2hhbm5lbCwgJmNtZCk7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJfZXJyKCJFcnIgc2VuZGluZyBQQ0MgbWJveCBtZXNzYWdlLiBjbWQ6JWQsIHJldDolZFxuIiwKIAkJCQljbWQsIHJldCk7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gZW5kOwogCX0KIAotCS8qCi0JICogRm9yIFJFQURzIHdlIG5lZWQgdG8gZW5zdXJlIHRoZSBjbWQgY29tcGxldGVkIHRvIGVuc3VyZQotCSAqIHRoZSBlbnN1aW5nIHJlYWQoKXMgY2FuIHByb2NlZWQuIEZvciBXUklURXMgd2UgZG9udCBjYXJlCi0JICogYmVjYXVzZSB0aGUgYWN0dWFsIHdyaXRlKClzIGFyZSBkb25lIGJlZm9yZSBjb21pbmcgaGVyZQotCSAqIGFuZCB0aGUgbmV4dCBSRUFEIG9yIFdSSVRFIHdpbGwgY2hlY2sgaWYgdGhlIGNoYW5uZWwKLQkgKiBpcyBidXN5L2ZyZWUgYXQgdGhlIGVudHJ5IG9mIHRoaXMgY2FsbC4KLQkgKgotCSAqIElmIE1pbmltdW0gUmVxdWVzdCBUdXJuYXJvdW5kIFRpbWUgaXMgbm9uLXplcm8sIHdlIG5lZWQKLQkgKiB0byByZWNvcmQgdGhlIGNvbXBsZXRpb24gdGltZSBvZiBib3RoIFJFQUQgYW5kIFdSSVRFCi0JICogY29tbWFuZCBmb3IgcHJvcGVyIGhhbmRsaW5nIG9mIE1SVFQsIHNvIHdlIG5lZWQgdG8gY2hlY2sKLQkgKiBmb3IgcGNjX21ydHQgaW4gYWRkaXRpb24gdG8gQ01EX1JFQUQKLQkgKi8KLQlpZiAoY21kID09IENNRF9SRUFEIHx8IHBjY19tcnR0KSB7Ci0JCXJldCA9IGNoZWNrX3BjY19jaGFuKCk7Ci0JCWlmIChwY2NfbXJ0dCkKLQkJCWxhc3RfY21kX2NtcGxfdGltZSA9IGt0aW1lX2dldCgpOworCS8qIHdhaXQgZm9yIGNvbXBsZXRpb24gYW5kIGNoZWNrIGZvciBQQ0MgZXJycm8gYml0ICovCisJcmV0ID0gY2hlY2tfcGNjX2NoYW4odHJ1ZSk7CisKKwlpZiAocGNjX2RhdGEucGNjX21ydHQpCisJCWxhc3RfY21kX2NtcGxfdGltZSA9IGt0aW1lX2dldCgpOworCisJaWYgKHBjY19kYXRhLnBjY19jaGFubmVsLT5tYm94LT50eGRvbmVfaXJxKQorCQltYm94X2NoYW5fdHhkb25lKHBjY19kYXRhLnBjY19jaGFubmVsLCByZXQpOworCWVsc2UKKwkJbWJveF9jbGllbnRfdHhkb25lKHBjY19kYXRhLnBjY19jaGFubmVsLCByZXQpOworCitlbmQ6CisJaWYgKGNtZCA9PSBDTURfV1JJVEUpIHsKKwkJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CisJCQkJc3RydWN0IGNwY19kZXNjICpkZXNjID0gcGVyX2NwdShjcGNfZGVzY19wdHIsIGkpOworCQkJCWlmICghZGVzYykKKwkJCQkJY29udGludWU7CisKKwkJCQlpZiAoZGVzYy0+d3JpdGVfY21kX2lkID09IHBjY19kYXRhLnBjY193cml0ZV9jbnQpCisJCQkJCWRlc2MtPndyaXRlX2NtZF9zdGF0dXMgPSByZXQ7CisJCQl9CisJCX0KKwkJcGNjX2RhdGEucGNjX3dyaXRlX2NudCsrOworCQl3YWtlX3VwX2FsbCgmcGNjX2RhdGEucGNjX3dyaXRlX3dhaXRfcSk7CiAJfQogCi0JbWJveF9jbGllbnRfdHhkb25lKHBjY19jaGFubmVsLCByZXQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTI3MiwxMyArNDEyLDEzIEBACiAgKgogICoJUmV0dXJuOiAwIGZvciBzdWNjZXNzIG9yIG5lZ2F0aXZlIHZhbHVlIGZvciBlcnIuCiAgKi8KLWludCBhY3BpX2dldF9wc2RfbWFwKHN0cnVjdCBjcHVkYXRhICoqYWxsX2NwdV9kYXRhKQoraW50IGFjcGlfZ2V0X3BzZF9tYXAoc3RydWN0IGNwcGNfY3B1ZGF0YSAqKmFsbF9jcHVfZGF0YSkKIHsKIAlpbnQgY291bnRfdGFyZ2V0OwogCWludCByZXR2YWwgPSAwOwogCXVuc2lnbmVkIGludCBpLCBqOwogCWNwdW1hc2tfdmFyX3QgY292ZXJlZF9jcHVzOwotCXN0cnVjdCBjcHVkYXRhICpwciwgKm1hdGNoX3ByOworCXN0cnVjdCBjcHBjX2NwdWRhdGEgKnByLCAqbWF0Y2hfcHI7CiAJc3RydWN0IGFjcGlfcHNkX3BhY2thZ2UgKnBkb21haW47CiAJc3RydWN0IGFjcGlfcHNkX3BhY2thZ2UgKm1hdGNoX3Bkb21haW47CiAJc3RydWN0IGNwY19kZXNjICpjcGNfcHRyLCAqbWF0Y2hfY3BjX3B0cjsKQEAgLTM5NCwxNCArNTM0LDEzIEBACiBzdGF0aWMgaW50IHJlZ2lzdGVyX3BjY19jaGFubmVsKGludCBwY2Nfc3Vic3BhY2VfaWR4KQogewogCXN0cnVjdCBhY3BpX3BjY3RfaHdfcmVkdWNlZCAqY3BwY19zczsKLQl1bnNpZ25lZCBpbnQgbGVuOwogCXU2NCB1c2Vjc19sYXQ7CiAKIAlpZiAocGNjX3N1YnNwYWNlX2lkeCA+PSAwKSB7Ci0JCXBjY19jaGFubmVsID0gcGNjX21ib3hfcmVxdWVzdF9jaGFubmVsKCZjcHBjX21ib3hfY2wsCisJCXBjY19kYXRhLnBjY19jaGFubmVsID0gcGNjX21ib3hfcmVxdWVzdF9jaGFubmVsKCZjcHBjX21ib3hfY2wsCiAJCQkJcGNjX3N1YnNwYWNlX2lkeCk7CiAKLQkJaWYgKElTX0VSUihwY2NfY2hhbm5lbCkpIHsKKwkJaWYgKElTX0VSUihwY2NfZGF0YS5wY2NfY2hhbm5lbCkpIHsKIAkJCXByX2VycigiRmFpbGVkIHRvIGZpbmQgUENDIGNvbW11bmljYXRpb24gY2hhbm5lbFxuIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQpAQCAtNDEyLDcgKzU1MSw3IEBACiAJCSAqIFBDQyBjaGFubmVscykgYW5kIHN0b3JlZCBwb2ludGVycyB0byB0aGUKIAkJICogc3Vic3BhY2UgY29tbXVuaWNhdGlvbiByZWdpb24gaW4gY29uX3ByaXYuCiAJCSAqLwotCQljcHBjX3NzID0gcGNjX2NoYW5uZWwtPmNvbl9wcml2OworCQljcHBjX3NzID0gKHBjY19kYXRhLnBjY19jaGFubmVsKS0+Y29uX3ByaXY7CiAKIAkJaWYgKCFjcHBjX3NzKSB7CiAJCQlwcl9lcnIoIk5vIFBDQyBzdWJzcGFjZSBmb3VuZCBmb3IgQ1BQQ1xuIik7CkBAIC00MjAsMzUgKzU1OSw0MiBAQAogCQl9CiAKIAkJLyoKLQkJICogVGhpcyBpcyB0aGUgc2hhcmVkIGNvbW11bmljYXRpb24gcmVnaW9uCi0JCSAqIGZvciB0aGUgT1MgYW5kIFBsYXRmb3JtIHRvIGNvbW11bmljYXRlIG92ZXIuCi0JCSAqLwotCQljb21tX2Jhc2VfYWRkciA9IGNwcGNfc3MtPmJhc2VfYWRkcmVzczsKLQkJbGVuID0gY3BwY19zcy0+bGVuZ3RoOwotCi0JCS8qCiAJCSAqIGNwcGNfc3MtPmxhdGVuY3kgaXMganVzdCBhIE5vbWluYWwgdmFsdWUuIEluIHJlYWxpdHkKIAkJICogdGhlIHJlbW90ZSBwcm9jZXNzb3IgY291bGQgYmUgbXVjaCBzbG93ZXIgdG8gcmVwbHkuCiAJCSAqIFNvIGFkZCBhbiBhcmJpdHJhcnkgYW1vdW50IG9mIHdhaXQgb24gdG9wIG9mIE5vbWluYWwuCiAJCSAqLwogCQl1c2Vjc19sYXQgPSBOVU1fUkVUUklFUyAqIGNwcGNfc3MtPmxhdGVuY3k7Ci0JCWRlYWRsaW5lID0gbnNfdG9fa3RpbWUodXNlY3NfbGF0ICogTlNFQ19QRVJfVVNFQyk7Ci0JCXBjY19tcnR0ID0gY3BwY19zcy0+bWluX3R1cm5hcm91bmRfdGltZTsKLQkJcGNjX21wYXIgPSBjcHBjX3NzLT5tYXhfYWNjZXNzX3JhdGU7CisJCXBjY19kYXRhLmRlYWRsaW5lID0gbnNfdG9fa3RpbWUodXNlY3NfbGF0ICogTlNFQ19QRVJfVVNFQyk7CisJCXBjY19kYXRhLnBjY19tcnR0ID0gY3BwY19zcy0+bWluX3R1cm5hcm91bmRfdGltZTsKKwkJcGNjX2RhdGEucGNjX21wYXIgPSBjcHBjX3NzLT5tYXhfYWNjZXNzX3JhdGU7CisJCXBjY19kYXRhLnBjY19ub21pbmFsID0gY3BwY19zcy0+bGF0ZW5jeTsKIAotCQlwY2NfY29tbV9hZGRyID0gYWNwaV9vc19pb3JlbWFwKGNvbW1fYmFzZV9hZGRyLCBsZW4pOwotCQlpZiAoIXBjY19jb21tX2FkZHIpIHsKKwkJcGNjX2RhdGEucGNjX2NvbW1fYWRkciA9IGFjcGlfb3NfaW9yZW1hcChjcHBjX3NzLT5iYXNlX2FkZHJlc3MsIGNwcGNfc3MtPmxlbmd0aCk7CisJCWlmICghcGNjX2RhdGEucGNjX2NvbW1fYWRkcikgewogCQkJcHJfZXJyKCJGYWlsZWQgdG8gaW9yZW1hcCBQQ0MgY29tbSByZWdpb24gbWVtXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAKIAkJLyogU2V0IGZsYWcgc28gdGhhdCB3ZSBkb250IGNvbWUgaGVyZSBmb3IgZWFjaCBDUFUuICovCi0JCXBjY19jaGFubmVsX2FjcXVpcmVkID0gdHJ1ZTsKKwkJcGNjX2RhdGEucGNjX2NoYW5uZWxfYWNxdWlyZWQgPSB0cnVlOwogCX0KIAogCXJldHVybiAwOwogfQogCisvKioKKyAqIGNwY19mZmhfc3VwcG9ydGVkKCkgLSBjaGVjayBpZiBGRkggcmVhZGluZyBzdXBwb3J0ZWQKKyAqCisgKiBDaGVjayBpZiB0aGUgYXJjaGl0ZWN0dXJlIGhhcyBzdXBwb3J0IGZvciBmdW5jdGlvbmFsIGZpeGVkIGhhcmR3YXJlCisgKiByZWFkL3dyaXRlIGNhcGFiaWxpdHkuCisgKgorICogUmV0dXJuOiB0cnVlIGZvciBzdXBwb3J0ZWQsIGZhbHNlIGZvciBub3Qgc3VwcG9ydGVkCisgKi8KK2Jvb2wgX193ZWFrIGNwY19mZmhfc3VwcG9ydGVkKHZvaWQpCit7CisJcmV0dXJuIGZhbHNlOworfQorCiAvKgogICogQW4gZXhhbXBsZSBDUEMgdGFibGUgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nLgogICoKQEAgLTUwNyw2ICs2NTMsNyBAQAogCXVuaW9uIGFjcGlfb2JqZWN0ICpvdXRfb2JqLCAqY3BjX29iajsKIAlzdHJ1Y3QgY3BjX2Rlc2MgKmNwY19wdHI7CiAJc3RydWN0IGNwY19yZWcgKmdhc190OworCXN0cnVjdCBkZXZpY2UgKmNwdV9kZXY7CiAJYWNwaV9oYW5kbGUgaGFuZGxlID0gcHItPmhhbmRsZTsKIAl1bnNpZ25lZCBpbnQgbnVtX2VudCwgaSwgY3BjX3JldjsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CkBAIC01NDUsNiArNjkyLDggQEAKIAkJZ290byBvdXRfZnJlZTsKIAl9CiAKKwljcGNfcHRyLT5udW1fZW50cmllcyA9IG51bV9lbnQ7CisKIAkvKiBTZWNvbmQgZW50cnkgc2hvdWxkIGJlIHJldmlzaW9uLiAqLwogCWNwY19vYmogPSAmb3V0X29iai0+cGFja2FnZS5lbGVtZW50c1sxXTsKIAlpZiAoY3BjX29iai0+dHlwZSA9PSBBQ1BJX1RZUEVfSU5URUdFUikJewpAQCAtNTc5LDE2ICs3MjgsMjcgQEAKIAkJCSAqIHNvIGV4dHJhY3QgaXQgb25seSBvbmNlLgogCQkJICovCiAJCQlpZiAoZ2FzX3QtPnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1BMQVRGT1JNX0NPTU0pIHsKLQkJCQlpZiAocGNjX3N1YnNwYWNlX2lkeCA8IDApCi0JCQkJCXBjY19zdWJzcGFjZV9pZHggPSBnYXNfdC0+YWNjZXNzX3dpZHRoOwotCQkJCWVsc2UgaWYgKHBjY19zdWJzcGFjZV9pZHggIT0gZ2FzX3QtPmFjY2Vzc193aWR0aCkgeworCQkJCWlmIChwY2NfZGF0YS5wY2Nfc3Vic3BhY2VfaWR4IDwgMCkKKwkJCQkJcGNjX2RhdGEucGNjX3N1YnNwYWNlX2lkeCA9IGdhc190LT5hY2Nlc3Nfd2lkdGg7CisJCQkJZWxzZSBpZiAocGNjX2RhdGEucGNjX3N1YnNwYWNlX2lkeCAhPSBnYXNfdC0+YWNjZXNzX3dpZHRoKSB7CiAJCQkJCXByX2RlYnVnKCJNaXNtYXRjaGVkIFBDQyBpZHMuXG4iKTsKIAkJCQkJZ290byBvdXRfZnJlZTsKIAkJCQl9Ci0JCQl9IGVsc2UgaWYgKGdhc190LT5zcGFjZV9pZCAhPSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fTUVNT1JZKSB7Ci0JCQkJLyogU3VwcG9ydCBvbmx5IFBDQyBhbmQgU1lTIE1FTSB0eXBlIHJlZ3MgKi8KLQkJCQlwcl9kZWJ1ZygiVW5zdXBwb3J0ZWQgcmVnaXN0ZXIgdHlwZTogJWRcbiIsIGdhc190LT5zcGFjZV9pZCk7Ci0JCQkJZ290byBvdXRfZnJlZTsKKwkJCX0gZWxzZSBpZiAoZ2FzX3QtPnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1NZU1RFTV9NRU1PUlkpIHsKKwkJCQlpZiAoZ2FzX3QtPmFkZHJlc3MpIHsKKwkJCQkJdm9pZCBfX2lvbWVtICphZGRyOworCisJCQkJCWFkZHIgPSBpb3JlbWFwKGdhc190LT5hZGRyZXNzLCBnYXNfdC0+Yml0X3dpZHRoLzgpOworCQkJCQlpZiAoIWFkZHIpCisJCQkJCQlnb3RvIG91dF9mcmVlOworCQkJCQljcGNfcHRyLT5jcGNfcmVnc1tpLTJdLnN5c19tZW1fdmFkZHIgPSBhZGRyOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGdhc190LT5zcGFjZV9pZCAhPSBBQ1BJX0FEUl9TUEFDRV9GSVhFRF9IQVJEV0FSRSB8fCAhY3BjX2ZmaF9zdXBwb3J0ZWQoKSkgeworCQkJCQkvKiBTdXBwb3J0IG9ubHkgUENDICxTWVMgTUVNIGFuZCBGRkggdHlwZSByZWdzICovCisJCQkJCXByX2RlYnVnKCJVbnN1cHBvcnRlZCByZWdpc3RlciB0eXBlOiAlZFxuIiwgZ2FzX3QtPnNwYWNlX2lkKTsKKwkJCQkJZ290byBvdXRfZnJlZTsKKwkJCQl9CiAJCQl9CiAKIAkJCWNwY19wdHItPmNwY19yZWdzW2ktMl0udHlwZSA9IEFDUElfVFlQRV9CVUZGRVI7CkBAIC02MDcsMTAgKzc2NywxMyBAQAogCQlnb3RvIG91dF9mcmVlOwogCiAJLyogUmVnaXN0ZXIgUENDIGNoYW5uZWwgb25jZSBmb3IgYWxsIENQVXMuICovCi0JaWYgKCFwY2NfY2hhbm5lbF9hY3F1aXJlZCkgewotCQlyZXQgPSByZWdpc3Rlcl9wY2NfY2hhbm5lbChwY2Nfc3Vic3BhY2VfaWR4KTsKKwlpZiAoIXBjY19kYXRhLnBjY19jaGFubmVsX2FjcXVpcmVkKSB7CisJCXJldCA9IHJlZ2lzdGVyX3BjY19jaGFubmVsKHBjY19kYXRhLnBjY19zdWJzcGFjZV9pZHgpOwogCQlpZiAocmV0KQogCQkJZ290byBvdXRfZnJlZTsKKworCQlpbml0X3J3c2VtKCZwY2NfZGF0YS5wY2NfbG9jayk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBjY19kYXRhLnBjY193cml0ZV93YWl0X3EpOwogCX0KIAogCS8qIFBsdWcgUFNEIGRhdGEgaW50byB0aGlzIENQVXMgQ1BDIGRlc2NyaXB0b3IuICovCkBAIC02MTksMTAgKzc4MiwyNyBAQAogCS8qIEV2ZXJ5dGhpbmcgbG9va3Mgb2theSAqLwogCXByX2RlYnVnKCJQYXJzZWQgQ1BDIHN0cnVjdCBmb3IgQ1BVOiAlZFxuIiwgcHItPmlkKTsKIAorCS8qIEFkZCBwZXIgbG9naWNhbCBDUFUgbm9kZXMgZm9yIHJlYWRpbmcgaXRzIGZlZWRiYWNrIGNvdW50ZXJzLiAqLworCWNwdV9kZXYgPSBnZXRfY3B1X2RldmljZShwci0+aWQpOworCWlmICghY3B1X2RldikKKwkJZ290byBvdXRfZnJlZTsKKworCXJldCA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZjcGNfcHRyLT5rb2JqLCAmY3BwY19rdHlwZSwgJmNwdV9kZXYtPmtvYmosCisJCQkiYWNwaV9jcHBjIik7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZnJlZTsKKwogCWtmcmVlKG91dHB1dC5wb2ludGVyKTsKIAlyZXR1cm4gMDsKIAogb3V0X2ZyZWU6CisJLyogRnJlZSBhbGwgdGhlIG1hcHBlZCBzeXMgbWVtIGFyZWFzIGZvciB0aGlzIENQVSAqLworCWZvciAoaSA9IDI7IGkgPCBjcGNfcHRyLT5udW1fZW50cmllczsgaSsrKSB7CisJCXZvaWQgX19pb21lbSAqYWRkciA9IGNwY19wdHItPmNwY19yZWdzW2ktMl0uc3lzX21lbV92YWRkcjsKKworCQlpZiAoYWRkcikKKwkJCWlvdW5tYXAoYWRkcik7CisJfQogCWtmcmVlKGNwY19wdHIpOwogCiBvdXRfYnVmX2ZyZWU6CkBAIC02NDAsMjYgKzgyMCw4MiBAQAogdm9pZCBhY3BpX2NwcGNfcHJvY2Vzc29yX2V4aXQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikKIHsKIAlzdHJ1Y3QgY3BjX2Rlc2MgKmNwY19wdHI7CisJdW5zaWduZWQgaW50IGk7CisJdm9pZCBfX2lvbWVtICphZGRyOworCiAJY3BjX3B0ciA9IHBlcl9jcHUoY3BjX2Rlc2NfcHRyLCBwci0+aWQpOworCisJLyogRnJlZSBhbGwgdGhlIG1hcHBlZCBzeXMgbWVtIGFyZWFzIGZvciB0aGlzIENQVSAqLworCWZvciAoaSA9IDI7IGkgPCBjcGNfcHRyLT5udW1fZW50cmllczsgaSsrKSB7CisJCWFkZHIgPSBjcGNfcHRyLT5jcGNfcmVnc1tpLTJdLnN5c19tZW1fdmFkZHI7CisJCWlmIChhZGRyKQorCQkJaW91bm1hcChhZGRyKTsKKwl9CisKKwlrb2JqZWN0X3B1dCgmY3BjX3B0ci0+a29iaik7CiAJa2ZyZWUoY3BjX3B0cik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhY3BpX2NwcGNfcHJvY2Vzc29yX2V4aXQpOwogCisvKioKKyAqIGNwY19yZWFkX2ZmaCgpIC0gUmVhZCBGRkggcmVnaXN0ZXIKKyAqIEBjcHVudW06CWNwdSBudW1iZXIgdG8gcmVhZAorICogQHJlZzoJY3BwYyByZWdpc3RlciBpbmZvcm1hdGlvbgorICogQHZhbDoJcGxhY2UgaG9sZGVyIGZvciByZXR1cm4gdmFsdWUKKyAqCisgKiBSZWFkIGJpdF93aWR0aCBiaXRzIGZyb20gYSBzcGVjaWZpZWQgYWRkcmVzcyBhbmQgYml0X29mZnNldAorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBhbmQgZXJyb3IgY29kZQorICovCitpbnQgX193ZWFrIGNwY19yZWFkX2ZmaChpbnQgY3B1bnVtLCBzdHJ1Y3QgY3BjX3JlZyAqcmVnLCB1NjQgKnZhbCkKK3sKKwlyZXR1cm4gLUVOT1RTVVBQOworfQorCisvKioKKyAqIGNwY193cml0ZV9mZmgoKSAtIFdyaXRlIEZGSCByZWdpc3RlcgorICogQGNwdW51bToJY3B1IG51bWJlciB0byB3cml0ZQorICogQHJlZzoJY3BwYyByZWdpc3RlciBpbmZvcm1hdGlvbgorICogQHZhbDoJdmFsdWUgdG8gd3JpdGUKKyAqCisgKiBXcml0ZSB2YWx1ZSBvZiBiaXRfd2lkdGggYml0cyB0byBhIHNwZWNpZmllZCBhZGRyZXNzIGFuZCBiaXRfb2Zmc2V0CisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIGFuZCBlcnJvciBjb2RlCisgKi8KK2ludCBfX3dlYWsgY3BjX3dyaXRlX2ZmaChpbnQgY3B1bnVtLCBzdHJ1Y3QgY3BjX3JlZyAqcmVnLCB1NjQgdmFsKQoreworCXJldHVybiAtRU5PVFNVUFA7Cit9CisKIC8qCiAgKiBTaW5jZSBjcGNfcmVhZCBhbmQgY3BjX3dyaXRlIGFyZSBjYWxsZWQgd2hpbGUgaG9sZGluZyBwY2NfbG9jaywgaXQgc2hvdWxkIGJlCiAgKiBhcyBmYXN0IGFzIHBvc3NpYmxlLiBXZSBoYXZlIGFscmVhZHkgbWFwcGVkIHRoZSBQQ0Mgc3Vic3BhY2UgZHVyaW5nIGluaXQsIHNvCiAgKiB3ZSBjYW4gZGlyZWN0bHkgd3JpdGUgdG8gaXQuCiAgKi8KIAotc3RhdGljIGludCBjcGNfcmVhZChzdHJ1Y3QgY3BjX3JlZyAqcmVnLCB1NjQgKnZhbCkKK3N0YXRpYyBpbnQgY3BjX3JlYWQoaW50IGNwdSwgc3RydWN0IGNwY19yZWdpc3Rlcl9yZXNvdXJjZSAqcmVnX3JlcywgdTY0ICp2YWwpCiB7CiAJaW50IHJldF92YWwgPSAwOworCXZvaWQgX19pb21lbSAqdmFkZHIgPSAwOworCXN0cnVjdCBjcGNfcmVnICpyZWcgPSAmcmVnX3Jlcy0+Y3BjX2VudHJ5LnJlZzsKKworCWlmIChyZWdfcmVzLT50eXBlID09IEFDUElfVFlQRV9JTlRFR0VSKSB7CisJCSp2YWwgPSByZWdfcmVzLT5jcGNfZW50cnkuaW50X3ZhbHVlOworCQlyZXR1cm4gcmV0X3ZhbDsKKwl9CiAKIAkqdmFsID0gMDsKLQlpZiAocmVnLT5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9QTEFURk9STV9DT01NKSB7Ci0JCXZvaWQgX19pb21lbSAqdmFkZHIgPSBHRVRfUENDX1ZBRERSKHJlZy0+YWRkcmVzcyk7CisJaWYgKHJlZy0+c3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfUExBVEZPUk1fQ09NTSkKKwkJdmFkZHIgPSBHRVRfUENDX1ZBRERSKHJlZy0+YWRkcmVzcyk7CisJZWxzZSBpZiAocmVnLT5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fTUVNT1JZKQorCQl2YWRkciA9IHJlZ19yZXMtPnN5c19tZW1fdmFkZHI7CisJZWxzZSBpZiAocmVnLT5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9GSVhFRF9IQVJEV0FSRSkKKwkJcmV0dXJuIGNwY19yZWFkX2ZmaChjcHUsIHJlZywgdmFsKTsKKwllbHNlCisJCXJldHVybiBhY3BpX29zX3JlYWRfbWVtb3J5KChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpcmVnLT5hZGRyZXNzLAorCQkJCXZhbCwgcmVnLT5iaXRfd2lkdGgpOwogCi0JCXN3aXRjaCAocmVnLT5iaXRfd2lkdGgpIHsKKwlzd2l0Y2ggKHJlZy0+Yml0X3dpZHRoKSB7CiAJCWNhc2UgODoKIAkJCSp2YWwgPSByZWFkYl9yZWxheGVkKHZhZGRyKTsKIAkJCWJyZWFrOwpAQCAtNjc0LDIzICs5MTAsMzAgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcHJfZGVidWcoIkVycm9yOiBDYW5ub3QgcmVhZCAldSBiaXQgd2lkdGggZnJvbSBQQ0NcbiIsCi0JCQkJcmVnLT5iaXRfd2lkdGgpOworCQkJCQlyZWctPmJpdF93aWR0aCk7CiAJCQlyZXRfdmFsID0gLUVGQVVMVDsKLQkJfQotCX0gZWxzZQotCQlyZXRfdmFsID0gYWNwaV9vc19yZWFkX21lbW9yeSgoYWNwaV9waHlzaWNhbF9hZGRyZXNzKXJlZy0+YWRkcmVzcywKLQkJCQkJdmFsLCByZWctPmJpdF93aWR0aCk7CisJfQorCiAJcmV0dXJuIHJldF92YWw7CiB9CiAKLXN0YXRpYyBpbnQgY3BjX3dyaXRlKHN0cnVjdCBjcGNfcmVnICpyZWcsIHU2NCB2YWwpCitzdGF0aWMgaW50IGNwY193cml0ZShpbnQgY3B1LCBzdHJ1Y3QgY3BjX3JlZ2lzdGVyX3Jlc291cmNlICpyZWdfcmVzLCB1NjQgdmFsKQogewogCWludCByZXRfdmFsID0gMDsKKwl2b2lkIF9faW9tZW0gKnZhZGRyID0gMDsKKwlzdHJ1Y3QgY3BjX3JlZyAqcmVnID0gJnJlZ19yZXMtPmNwY19lbnRyeS5yZWc7CiAKLQlpZiAocmVnLT5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9QTEFURk9STV9DT01NKSB7Ci0JCXZvaWQgX19pb21lbSAqdmFkZHIgPSBHRVRfUENDX1ZBRERSKHJlZy0+YWRkcmVzcyk7CisJaWYgKHJlZy0+c3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfUExBVEZPUk1fQ09NTSkKKwkJdmFkZHIgPSBHRVRfUENDX1ZBRERSKHJlZy0+YWRkcmVzcyk7CisJZWxzZSBpZiAocmVnLT5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fTUVNT1JZKQorCQl2YWRkciA9IHJlZ19yZXMtPnN5c19tZW1fdmFkZHI7CisJZWxzZSBpZiAocmVnLT5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9GSVhFRF9IQVJEV0FSRSkKKwkJcmV0dXJuIGNwY193cml0ZV9mZmgoY3B1LCByZWcsIHZhbCk7CisJZWxzZQorCQlyZXR1cm4gYWNwaV9vc193cml0ZV9tZW1vcnkoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcylyZWctPmFkZHJlc3MsCisJCQkJdmFsLCByZWctPmJpdF93aWR0aCk7CiAKLQkJc3dpdGNoIChyZWctPmJpdF93aWR0aCkgeworCXN3aXRjaCAocmVnLT5iaXRfd2lkdGgpIHsKIAkJY2FzZSA4OgogCQkJd3JpdGViX3JlbGF4ZWQodmFsLCB2YWRkcik7CiAJCQlicmVhazsKQEAgLTcwNSwxMyArOTQ4LDExIEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXByX2RlYnVnKCJFcnJvcjogQ2Fubm90IHdyaXRlICV1IGJpdCB3aWR0aCB0byBQQ0NcbiIsCi0JCQkJcmVnLT5iaXRfd2lkdGgpOworCQkJCQlyZWctPmJpdF93aWR0aCk7CiAJCQlyZXRfdmFsID0gLUVGQVVMVDsKIAkJCWJyZWFrOwotCQl9Ci0JfSBlbHNlCi0JCXJldF92YWwgPSBhY3BpX29zX3dyaXRlX21lbW9yeSgoYWNwaV9waHlzaWNhbF9hZGRyZXNzKXJlZy0+YWRkcmVzcywKLQkJCQl2YWwsIHJlZy0+Yml0X3dpZHRoKTsKKwl9CisKIAlyZXR1cm4gcmV0X3ZhbDsKIH0KIApAQCAtNzI3LDggKzk2OCw4IEBACiAJc3RydWN0IGNwY19kZXNjICpjcGNfZGVzYyA9IHBlcl9jcHUoY3BjX2Rlc2NfcHRyLCBjcHVudW0pOwogCXN0cnVjdCBjcGNfcmVnaXN0ZXJfcmVzb3VyY2UgKmhpZ2hlc3RfcmVnLCAqbG93ZXN0X3JlZywgKnJlZl9wZXJmLAogCQkJCQkJCQkgKm5vbV9wZXJmOwotCXU2NCBoaWdoLCBsb3csIHJlZiwgbm9tOwotCWludCByZXQgPSAwOworCXU2NCBoaWdoLCBsb3csIG5vbTsKKwlpbnQgcmV0ID0gMCwgcmVnc19pbl9wY2MgPSAwOwogCiAJaWYgKCFjcGNfZGVzYykgewogCQlwcl9kZWJ1ZygiTm8gQ1BDIGRlc2NyaXB0b3IgZm9yIENQVTolZFxuIiwgY3B1bnVtKTsKQEAgLTc0MCwxMyArOTgxLDExIEBACiAJcmVmX3BlcmYgPSAmY3BjX2Rlc2MtPmNwY19yZWdzW1JFRkVSRU5DRV9QRVJGXTsKIAlub21fcGVyZiA9ICZjcGNfZGVzYy0+Y3BjX3JlZ3NbTk9NSU5BTF9QRVJGXTsKIAotCXNwaW5fbG9jaygmcGNjX2xvY2spOwotCiAJLyogQXJlIGFueSBvZiB0aGUgcmVncyBQQ0MgPyovCi0JaWYgKChoaWdoZXN0X3JlZy0+Y3BjX2VudHJ5LnJlZy5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9QTEFURk9STV9DT01NKSB8fAotCQkJKGxvd2VzdF9yZWctPmNwY19lbnRyeS5yZWcuc3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfUExBVEZPUk1fQ09NTSkgfHwKLQkJCShyZWZfcGVyZi0+Y3BjX2VudHJ5LnJlZy5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9QTEFURk9STV9DT01NKSB8fAotCQkJKG5vbV9wZXJmLT5jcGNfZW50cnkucmVnLnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1BMQVRGT1JNX0NPTU0pKSB7CisJaWYgKENQQ19JTl9QQ0MoaGlnaGVzdF9yZWcpIHx8IENQQ19JTl9QQ0MobG93ZXN0X3JlZykgfHwKKwkJQ1BDX0lOX1BDQyhyZWZfcGVyZikgfHwgQ1BDX0lOX1BDQyhub21fcGVyZikpIHsKKwkJcmVnc19pbl9wY2MgPSAxOworCQlkb3duX3dyaXRlKCZwY2NfZGF0YS5wY2NfbG9jayk7CiAJCS8qIFJpbmcgZG9vcmJlbGwgb25jZSB0byB1cGRhdGUgUENDIHN1YnNwYWNlICovCiAJCWlmIChzZW5kX3BjY19jbWQoQ01EX1JFQUQpIDwgMCkgewogCQkJcmV0ID0gLUVJTzsKQEAgLTc1NCwyNiArOTkzLDIxIEBACiAJCX0KIAl9CiAKLQljcGNfcmVhZCgmaGlnaGVzdF9yZWctPmNwY19lbnRyeS5yZWcsICZoaWdoKTsKKwljcGNfcmVhZChjcHVudW0sIGhpZ2hlc3RfcmVnLCAmaGlnaCk7CiAJcGVyZl9jYXBzLT5oaWdoZXN0X3BlcmYgPSBoaWdoOwogCi0JY3BjX3JlYWQoJmxvd2VzdF9yZWctPmNwY19lbnRyeS5yZWcsICZsb3cpOworCWNwY19yZWFkKGNwdW51bSwgbG93ZXN0X3JlZywgJmxvdyk7CiAJcGVyZl9jYXBzLT5sb3dlc3RfcGVyZiA9IGxvdzsKIAotCWNwY19yZWFkKCZyZWZfcGVyZi0+Y3BjX2VudHJ5LnJlZywgJnJlZik7Ci0JcGVyZl9jYXBzLT5yZWZlcmVuY2VfcGVyZiA9IHJlZjsKLQotCWNwY19yZWFkKCZub21fcGVyZi0+Y3BjX2VudHJ5LnJlZywgJm5vbSk7CisJY3BjX3JlYWQoY3B1bnVtLCBub21fcGVyZiwgJm5vbSk7CiAJcGVyZl9jYXBzLT5ub21pbmFsX3BlcmYgPSBub207CiAKLQlpZiAoIXJlZikKLQkJcGVyZl9jYXBzLT5yZWZlcmVuY2VfcGVyZiA9IHBlcmZfY2Fwcy0+bm9taW5hbF9wZXJmOwotCiAJaWYgKCFoaWdoIHx8ICFsb3cgfHwgIW5vbSkKIAkJcmV0ID0gLUVGQVVMVDsKIAogb3V0X2VycjoKLQlzcGluX3VubG9jaygmcGNjX2xvY2spOworCWlmIChyZWdzX2luX3BjYykKKwkJdXBfd3JpdGUoJnBjY19kYXRhLnBjY19sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY3BwY19nZXRfcGVyZl9jYXBzKTsKQEAgLTc4OCw5ICsxMDIyLDEwIEBACiBpbnQgY3BwY19nZXRfcGVyZl9jdHJzKGludCBjcHVudW0sIHN0cnVjdCBjcHBjX3BlcmZfZmJfY3RycyAqcGVyZl9mYl9jdHJzKQogewogCXN0cnVjdCBjcGNfZGVzYyAqY3BjX2Rlc2MgPSBwZXJfY3B1KGNwY19kZXNjX3B0ciwgY3B1bnVtKTsKLQlzdHJ1Y3QgY3BjX3JlZ2lzdGVyX3Jlc291cmNlICpkZWxpdmVyZWRfcmVnLCAqcmVmZXJlbmNlX3JlZzsKLQl1NjQgZGVsaXZlcmVkLCByZWZlcmVuY2U7Ci0JaW50IHJldCA9IDA7CisJc3RydWN0IGNwY19yZWdpc3Rlcl9yZXNvdXJjZSAqZGVsaXZlcmVkX3JlZywgKnJlZmVyZW5jZV9yZWcsCisJCSpyZWZfcGVyZl9yZWcsICpjdHJfd3JhcF9yZWc7CisJdTY0IGRlbGl2ZXJlZCwgcmVmZXJlbmNlLCByZWZfcGVyZiwgY3RyX3dyYXBfdGltZTsKKwlpbnQgcmV0ID0gMCwgcmVnc19pbl9wY2MgPSAwOwogCiAJaWYgKCFjcGNfZGVzYykgewogCQlwcl9kZWJ1ZygiTm8gQ1BDIGRlc2NyaXB0b3IgZm9yIENQVTolZFxuIiwgY3B1bnVtKTsKQEAgLTc5OSwxMiArMTAzNCwyMSBAQAogCiAJZGVsaXZlcmVkX3JlZyA9ICZjcGNfZGVzYy0+Y3BjX3JlZ3NbREVMSVZFUkVEX0NUUl07CiAJcmVmZXJlbmNlX3JlZyA9ICZjcGNfZGVzYy0+Y3BjX3JlZ3NbUkVGRVJFTkNFX0NUUl07CisJcmVmX3BlcmZfcmVnID0gJmNwY19kZXNjLT5jcGNfcmVnc1tSRUZFUkVOQ0VfUEVSRl07CisJY3RyX3dyYXBfcmVnID0gJmNwY19kZXNjLT5jcGNfcmVnc1tDVFJfV1JBUF9USU1FXTsKIAotCXNwaW5fbG9jaygmcGNjX2xvY2spOworCS8qCisJICogSWYgcmVmZXJuY2UgcGVyZiByZWdpc3RlciBpcyBub3Qgc3VwcG9ydGVkIHRoZW4gd2Ugc2hvdWxkCisJICogdXNlIHRoZSBub21pbmFsIHBlcmYgdmFsdWUKKwkgKi8KKwlpZiAoIUNQQ19TVVBQT1JURUQocmVmX3BlcmZfcmVnKSkKKwkJcmVmX3BlcmZfcmVnID0gJmNwY19kZXNjLT5jcGNfcmVnc1tOT01JTkFMX1BFUkZdOwogCiAJLyogQXJlIGFueSBvZiB0aGUgcmVncyBQQ0MgPyovCi0JaWYgKChkZWxpdmVyZWRfcmVnLT5jcGNfZW50cnkucmVnLnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1BMQVRGT1JNX0NPTU0pIHx8Ci0JCQkocmVmZXJlbmNlX3JlZy0+Y3BjX2VudHJ5LnJlZy5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9QTEFURk9STV9DT01NKSkgeworCWlmIChDUENfSU5fUENDKGRlbGl2ZXJlZF9yZWcpIHx8IENQQ19JTl9QQ0MocmVmZXJlbmNlX3JlZykgfHwKKwkJQ1BDX0lOX1BDQyhjdHJfd3JhcF9yZWcpIHx8IENQQ19JTl9QQ0MocmVmX3BlcmZfcmVnKSkgeworCQlkb3duX3dyaXRlKCZwY2NfZGF0YS5wY2NfbG9jayk7CisJCXJlZ3NfaW5fcGNjID0gMTsKIAkJLyogUmluZyBkb29yYmVsbCBvbmNlIHRvIHVwZGF0ZSBQQ0Mgc3Vic3BhY2UgKi8KIAkJaWYgKHNlbmRfcGNjX2NtZChDTURfUkVBRCkgPCAwKSB7CiAJCQlyZXQgPSAtRUlPOwpAQCAtODEyLDI1ICsxMDU2LDMxIEBACiAJCX0KIAl9CiAKLQljcGNfcmVhZCgmZGVsaXZlcmVkX3JlZy0+Y3BjX2VudHJ5LnJlZywgJmRlbGl2ZXJlZCk7Ci0JY3BjX3JlYWQoJnJlZmVyZW5jZV9yZWctPmNwY19lbnRyeS5yZWcsICZyZWZlcmVuY2UpOworCWNwY19yZWFkKGNwdW51bSwgZGVsaXZlcmVkX3JlZywgJmRlbGl2ZXJlZCk7CisJY3BjX3JlYWQoY3B1bnVtLCByZWZlcmVuY2VfcmVnLCAmcmVmZXJlbmNlKTsKKwljcGNfcmVhZChjcHVudW0sIHJlZl9wZXJmX3JlZywgJnJlZl9wZXJmKTsKIAotCWlmICghZGVsaXZlcmVkIHx8ICFyZWZlcmVuY2UpIHsKKwkvKgorCSAqIFBlciBzcGVjLCBpZiBjdHJfd3JhcF90aW1lIG9wdGlvbmFsIHJlZ2lzdGVyIGlzIHVuc3VwcG9ydGVkLCB0aGVuIHRoZQorCSAqIHBlcmZvcm1hbmNlIGNvdW50ZXJzIGFyZSBhc3N1bWVkIHRvIG5ldmVyIHdyYXAgZHVyaW5nIHRoZSBsaWZldGltZSBvZgorCSAqIHBsYXRmb3JtCisJICovCisJY3RyX3dyYXBfdGltZSA9ICh1NjQpKH4oKHU2NCkwKSk7CisJaWYgKENQQ19TVVBQT1JURUQoY3RyX3dyYXBfcmVnKSkKKwkJY3BjX3JlYWQoY3B1bnVtLCBjdHJfd3JhcF9yZWcsICZjdHJfd3JhcF90aW1lKTsKKworCWlmICghZGVsaXZlcmVkIHx8ICFyZWZlcmVuY2UgfHwJIXJlZl9wZXJmKSB7CiAJCXJldCA9IC1FRkFVTFQ7CiAJCWdvdG8gb3V0X2VycjsKIAl9CiAKIAlwZXJmX2ZiX2N0cnMtPmRlbGl2ZXJlZCA9IGRlbGl2ZXJlZDsKIAlwZXJmX2ZiX2N0cnMtPnJlZmVyZW5jZSA9IHJlZmVyZW5jZTsKLQotCXBlcmZfZmJfY3Rycy0+ZGVsaXZlcmVkIC09IHBlcmZfZmJfY3Rycy0+cHJldl9kZWxpdmVyZWQ7Ci0JcGVyZl9mYl9jdHJzLT5yZWZlcmVuY2UgLT0gcGVyZl9mYl9jdHJzLT5wcmV2X3JlZmVyZW5jZTsKLQotCXBlcmZfZmJfY3Rycy0+cHJldl9kZWxpdmVyZWQgPSBkZWxpdmVyZWQ7Ci0JcGVyZl9mYl9jdHJzLT5wcmV2X3JlZmVyZW5jZSA9IHJlZmVyZW5jZTsKLQorCXBlcmZfZmJfY3Rycy0+cmVmZXJlbmNlX3BlcmYgPSByZWZfcGVyZjsKKwlwZXJmX2ZiX2N0cnMtPmN0cl93cmFwX3RpbWUgPSBjdHJfd3JhcF90aW1lOwogb3V0X2VycjoKLQlzcGluX3VubG9jaygmcGNjX2xvY2spOworCWlmIChyZWdzX2luX3BjYykKKwkJdXBfd3JpdGUoJnBjY19kYXRhLnBjY19sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY3BwY19nZXRfcGVyZl9jdHJzKTsKQEAgLTg1NSwzMCArMTEwNSwxNDIgQEAKIAogCWRlc2lyZWRfcmVnID0gJmNwY19kZXNjLT5jcGNfcmVnc1tERVNJUkVEX1BFUkZdOwogCi0Jc3Bpbl9sb2NrKCZwY2NfbG9jayk7Ci0KLQkvKiBJZiB0aGlzIGlzIFBDQyByZWcsIGNoZWNrIGlmIGNoYW5uZWwgaXMgZnJlZSBiZWZvcmUgd3JpdGluZyAqLwotCWlmIChkZXNpcmVkX3JlZy0+Y3BjX2VudHJ5LnJlZy5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9QTEFURk9STV9DT01NKSB7Ci0JCXJldCA9IGNoZWNrX3BjY19jaGFuKCk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGJ1c3lfY2hhbm5lbDsKKwkvKgorCSAqIFRoaXMgaXMgUGhhc2UtSSB3aGVyZSB3ZSB3YW50IHRvIHdyaXRlIHRvIENQQyByZWdpc3RlcnMKKwkgKiAtPiBXZSB3YW50IGFsbCBDUFVzIHRvIGJlIGFibGUgdG8gZXhlY3V0ZSB0aGlzIHBoYXNlIGluIHBhcmFsbGVsCisJICoKKwkgKiBTaW5jZSByZWFkX2xvY2sgY2FuIGJlIGFjcXVpcmVkIGJ5IG11bHRpcGxlIENQVXMgc2ltdWx0YW5lb3VzbHkgd2UKKwkgKiBhY2hpZXZlIHRoYXQgZ29hbCBoZXJlCisJICovCisJaWYgKENQQ19JTl9QQ0MoZGVzaXJlZF9yZWcpKSB7CisJCWRvd25fcmVhZCgmcGNjX2RhdGEucGNjX2xvY2spOwkvKiBCRUdJTiBQaGFzZS1JICovCisJCWlmIChwY2NfZGF0YS5wbGF0Zm9ybV9vd25zX3BjYykgeworCQkJcmV0ID0gY2hlY2tfcGNjX2NoYW4oZmFsc2UpOworCQkJaWYgKHJldCkgeworCQkJCXVwX3JlYWQoJnBjY19kYXRhLnBjY19sb2NrKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisJCS8qCisJCSAqIFVwZGF0ZSB0aGUgcGVuZGluZ193cml0ZSB0byBtYWtlIHN1cmUgYSBQQ0MgQ01EX1JFQUQgd2lsbCBub3QKKwkJICogYXJyaXZlIGFuZCBzdGVhbCB0aGUgY2hhbm5lbCBkdXJpbmcgdGhlIHN3aXRjaCB0byB3cml0ZSBsb2NrCisJCSAqLworCQlwY2NfZGF0YS5wZW5kaW5nX3BjY193cml0ZV9jbWQgPSB0cnVlOworCQljcGNfZGVzYy0+d3JpdGVfY21kX2lkID0gcGNjX2RhdGEucGNjX3dyaXRlX2NudDsKKwkJY3BjX2Rlc2MtPndyaXRlX2NtZF9zdGF0dXMgPSAwOwogCX0KIAogCS8qCiAJICogU2tpcCB3cml0aW5nIE1JTi9NQVggdW50aWwgTGludXgga25vd3MgaG93IHRvIGNvbWUgdXAgd2l0aAogCSAqIHVzZWZ1bCB2YWx1ZXMuCiAJICovCi0JY3BjX3dyaXRlKCZkZXNpcmVkX3JlZy0+Y3BjX2VudHJ5LnJlZywgcGVyZl9jdHJscy0+ZGVzaXJlZF9wZXJmKTsKKwljcGNfd3JpdGUoY3B1LCBkZXNpcmVkX3JlZywgcGVyZl9jdHJscy0+ZGVzaXJlZF9wZXJmKTsKIAotCS8qIElzIHRoaXMgYSBQQ0MgcmVnID8qLwotCWlmIChkZXNpcmVkX3JlZy0+Y3BjX2VudHJ5LnJlZy5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9QTEFURk9STV9DT01NKSB7Ci0JCS8qIFJpbmcgZG9vcmJlbGwgc28gUmVtb3RlIGNhbiBnZXQgb3VyIHBlcmYgcmVxdWVzdC4gKi8KLQkJaWYgKHNlbmRfcGNjX2NtZChDTURfV1JJVEUpIDwgMCkKLQkJCXJldCA9IC1FSU87CisJaWYgKENQQ19JTl9QQ0MoZGVzaXJlZF9yZWcpKQorCQl1cF9yZWFkKCZwY2NfZGF0YS5wY2NfbG9jayk7CS8qIEVORCBQaGFzZS1JICovCisJLyoKKwkgKiBUaGlzIGlzIFBoYXNlLUlJIHdoZXJlIHdlIHRyYW5zZmVyIHRoZSBvd25lcnNoaXAgb2YgUENDIHRvIFBsYXRmb3JtCisJICoKKwkgKiBTaG9ydCBTdW1tYXJ5OiBCYXNpY2FsbHkgaWYgd2UgdGhpbmsgb2YgYSBncm91cCBvZiBjcHBjX3NldF9wZXJmCisJICogcmVxdWVzdHMgdGhhdCBoYXBwZW5lZCBpbiBzaG9ydCBvdmVybGFwcGluZyBpbnRlcnZhbC4gVGhlIGxhc3QgQ1BVIHRvCisJICogY29tZSBvdXQgb2YgUGhhc2UtSSB3aWxsIGVudGVyIFBoYXNlLUlJIGFuZCByaW5nIHRoZSBkb29yYmVsbC4KKwkgKgorCSAqIFdlIGhhdmUgdGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHMgZm9yIFBoYXNlLUlJOgorCSAqICAgICAxLiBXZSB3YW50IHRvIGV4ZWN1dGUgUGhhc2UtSUkgb25seSB3aGVuIHRoZXJlIGFyZSBubyBDUFVzCisJICogY3VycmVudGx5IGV4ZWN1dGluZyBpbiBQaGFzZS1JCisJICogICAgIDIuIE9uY2Ugd2Ugc3RhcnQgUGhhc2UtSUkgd2Ugd2FudCB0byBhdm9pZCBhbGwgb3RoZXIgQ1BVcyBmcm9tCisJICogZW50ZXJpbmcgUGhhc2UtSS4KKwkgKiAgICAgMy4gV2Ugd2FudCBvbmx5IG9uZSBDUFUgYW1vbmcgYWxsIHRob3NlIHdobyB3ZW50IHRocm91Z2ggUGhhc2UtSQorCSAqIHRvIHJ1biBwaGFzZS1JSQorCSAqCisJICogSWYgd3JpdGVfdHJ5bG9jayBmYWlscyB0byBnZXQgdGhlIGxvY2sgYW5kIGRvZXNuJ3QgdHJhbnNmZXIgdGhlCisJICogUENDIG93bmVyc2hpcCB0byB0aGUgcGxhdGZvcm0sIHRoZW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgd2lsbCBiZSBUUlVFCisJICogICAgIDEuIFRoZXJlIGlzIGF0LWxlYXN0IG9uZSBDUFUgaW4gUGhhc2UtSSB3aGljaCB3aWxsIGxhdGVyIGV4ZWN1dGUKKwkgKiB3cml0ZV90cnlsb2NrLCBzbyB0aGUgQ1BVcyBpbiBQaGFzZS1JIHdpbGwgYmUgcmVzcG9uc2libGUgZm9yCisJICogZXhlY3V0aW5nIHRoZSBQaGFzZS1JSS4KKwkgKiAgICAgMi4gU29tZSBvdGhlciBDUFUgaGFzIGJlYXRlbiB0aGlzIENQVSB0byBzdWNjZXNzZnVsbHkgZXhlY3V0ZSB0aGUKKwkgKiB3cml0ZV90cnlsb2NrIGFuZCBoYXMgYWxyZWFkeSBhY3F1aXJlZCB0aGUgd3JpdGVfbG9jay4gV2Uga25vdyBmb3IgYQorCSAqIGZhY3QgaXQob3RoZXIgQ1BVIGFjcXVpcmluZyB0aGUgd3JpdGVfbG9jaykgY291bGRuJ3QgaGF2ZSBoYXBwZW5lZAorCSAqIGJlZm9yZSB0aGlzIENQVSdzIFBoYXNlLUkgYXMgd2UgaGVsZCB0aGUgcmVhZF9sb2NrLgorCSAqICAgICAzLiBTb21lIG90aGVyIENQVSBleGVjdXRpbmcgcGNjIENNRF9SRUFEIGhhcyBzdG9sZW4gdGhlCisJICogZG93bl93cml0ZSwgaW4gd2hpY2ggY2FzZSwgc2VuZF9wY2NfY21kIHdpbGwgY2hlY2sgZm9yIHBlbmRpbmcKKwkgKiBDTURfV1JJVEUgY29tbWFuZHMgYnkgY2hlY2tpbmcgdGhlIHBlbmRpbmdfcGNjX3dyaXRlX2NtZC4KKwkgKiBTbyB0aGlzIENQVSBjYW4gYmUgY2VydGFpbiB0aGF0IGl0cyByZXF1ZXN0IHdpbGwgYmUgZGVsaXZlcmVkCisJICogICAgU28gaW4gYWxsIGNhc2VzLCB0aGlzIENQVSBrbm93cyB0aGF0IGl0cyByZXF1ZXN0IHdpbGwgYmUgZGVsaXZlcmVkCisJICogYnkgYW5vdGhlciBDUFUgYW5kIGNhbiByZXR1cm4KKwkgKgorCSAqIEFmdGVyIGdldHRpbmcgdGhlIGRvd25fd3JpdGUgd2Ugc3RpbGwgbmVlZCB0byBjaGVjayBmb3IKKwkgKiBwZW5kaW5nX3BjY193cml0ZV9jbWQgdG8gdGFrZSBjYXJlIG9mIHRoZSBmb2xsb3dpbmcgc2NlbmFyaW8KKwkgKiAgICBUaGUgdGhyZWFkIHJ1bm5pbmcgdGhpcyBjb2RlIGNvdWxkIGJlIHNjaGVkdWxlZCBvdXQgYmV0d2VlbgorCSAqIFBoYXNlLUkgYW5kIFBoYXNlLUlJLiBCZWZvcmUgaXQgaXMgc2NoZWR1bGVkIGJhY2sgb24sIGFub3RoZXIgQ1BVCisJICogY291bGQgaGF2ZSBkZWxpdmVyZWQgdGhlIHJlcXVlc3QgdG8gUGxhdGZvcm0gYnkgdHJpZ2dlcmluZyB0aGUKKwkgKiBkb29yYmVsbCBhbmQgdHJhbnNmZXJyZWQgdGhlIG93bmVyc2hpcCBvZiBQQ0MgdG8gcGxhdGZvcm0uIFNvIHRoaXMKKwkgKiBhdm9pZHMgdHJpZ2dlcmluZyBhbiB1bm5lY2Vzc2FyeSBkb29yYmVsbCBhbmQgbW9yZSBpbXBvcnRhbnRseSBiZWZvcmUKKwkgKiB0cmlnZ2VyaW5nIHRoZSBkb29yYmVsbCBpdCBtYWtlcyBzdXJlIHRoYXQgdGhlIFBDQyBjaGFubmVsIG93bmVyc2hpcAorCSAqIGlzIHN0aWxsIHdpdGggT1NQTS4KKwkgKiAgIHBlbmRpbmdfcGNjX3dyaXRlX2NtZCBjYW4gYWxzbyBiZSBjbGVhcmVkIGJ5IGEgZGlmZmVyZW50IENQVSwgaWYKKwkgKiB0aGVyZSB3YXMgYSBwY2MgQ01EX1JFQUQgd2FpdGluZyBvbiBkb3duX3dyaXRlIGFuZCBpdCBzdGVhbHMgdGhlIGxvY2sKKwkgKiBiZWZvcmUgdGhlIHBjYyBDTURfV1JJVEUgaXMgY29tcGxldGVkLiBwY2Nfc2VuZF9jbWQgY2hlY2tzIGZvciB0aGlzCisJICogY2FzZSBkdXJpbmcgYSBDTURfUkVBRCBhbmQgaWYgdGhlcmUgYXJlIHBlbmRpbmcgd3JpdGVzIGl0IGRlbGl2ZXJzCisJICogdGhlIHdyaXRlIGNvbW1hbmQgYmVmb3JlIHNlcnZpY2luZyB0aGUgcmVhZCBjb21tYW5kCisJICovCisJaWYgKENQQ19JTl9QQ0MoZGVzaXJlZF9yZWcpKSB7CisJCWlmIChkb3duX3dyaXRlX3RyeWxvY2soJnBjY19kYXRhLnBjY19sb2NrKSkgewkvKiBCRUdJTiBQaGFzZS1JSSAqLworCQkJLyogVXBkYXRlIG9ubHkgaWYgdGhlcmUgYXJlIHBlbmRpbmcgd3JpdGUgY29tbWFuZHMgKi8KKwkJCWlmIChwY2NfZGF0YS5wZW5kaW5nX3BjY193cml0ZV9jbWQpCisJCQkJc2VuZF9wY2NfY21kKENNRF9XUklURSk7CisJCQl1cF93cml0ZSgmcGNjX2RhdGEucGNjX2xvY2spOwkJLyogRU5EIFBoYXNlLUlJICovCisJCX0gZWxzZQorCQkJLyogV2FpdCB1bnRpbCBwY2Nfd3JpdGVfY250IGlzIHVwZGF0ZWQgYnkgc2VuZF9wY2NfY21kICovCisJCQl3YWl0X2V2ZW50KHBjY19kYXRhLnBjY193cml0ZV93YWl0X3EsCisJCQkJY3BjX2Rlc2MtPndyaXRlX2NtZF9pZCAhPSBwY2NfZGF0YS5wY2Nfd3JpdGVfY250KTsKKworCQkvKiBzZW5kX3BjY19jbWQgdXBkYXRlcyB0aGUgc3RhdHVzIGluIGNhc2Ugb2YgZmFpbHVyZSAqLworCQlyZXQgPSBjcGNfZGVzYy0+d3JpdGVfY21kX3N0YXR1czsKIAl9Ci1idXN5X2NoYW5uZWw6Ci0Jc3Bpbl91bmxvY2soJnBjY19sb2NrKTsKLQogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjcHBjX3NldF9wZXJmKTsKKworLyoqCisgKiBjcHBjX2dldF90cmFuc2l0aW9uX2xhdGVuY3kgLSByZXR1cm5zIGZyZXF1ZW5jeSB0cmFuc2l0aW9uIGxhdGVuY3kgaW4gbnMKKyAqCisgKiBBQ1BJIENQUEMgZG9lcyBub3QgZXhwbGljaXRseSBzcGVjaWZpeSBob3cgYSBwbGF0Zm9ybSBjYW4gc3BlY2lmeSB0aGUKKyAqIHRyYW5zaXRpb24gbGF0ZW5jeSBmb3IgcGVyZnJvbWFuY2UgY2hhbmdlIHJlcXVlc3RzLiBUaGUgY2xvc2VzdCB3ZSBoYXZlCisgKiBpcyB0aGUgdGltaW5nIGluZm9ybWF0aW9uIGZyb20gdGhlIFBDQ1QgdGFibGVzIHdoaWNoIHByb3ZpZGVzIHRoZSBpbmZvCisgKiBvbiB0aGUgbnVtYmVyIGFuZCBmcmVxdWVuY3kgb2YgUENDIGNvbW1hbmRzIHRoZSBwbGF0Zm9ybSBjYW4gaGFuZGxlLgorICovCit1bnNpZ25lZCBpbnQgY3BwY19nZXRfdHJhbnNpdGlvbl9sYXRlbmN5KGludCBjcHVfbnVtKQoreworCS8qCisJICogRXhwZWN0ZWQgdHJhbnNpdGlvbiBsYXRlbmN5IGlzIGJhc2VkIG9uIHRoZSBQQ0NUIHRpbWluZyB2YWx1ZXMKKwkgKiBCZWxvdyBhcmUgZGVmaW5pdGlvbiBmcm9tIEFDUEkgc3BlYzoKKwkgKiBwY2Nfbm9taW5hbC0gRXhwZWN0ZWQgbGF0ZW5jeSB0byBwcm9jZXNzIGEgY29tbWFuZCwgaW4gbWljcm9zZWNvbmRzCisJICogcGNjX21wYXIgICAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwZXJpb2RpYyByZXF1ZXN0cyB0aGF0IHRoZSBzdWJzcGFjZQorCSAqICAgICAgICAgICAgICBjaGFubmVsIGNhbiBzdXBwb3J0LCByZXBvcnRlZCBpbiBjb21tYW5kcyBwZXIgbWludXRlLiAwCisJICogICAgICAgICAgICAgIGluZGljYXRlcyBubyBsaW1pdGF0aW9uLgorCSAqIHBjY19tcnR0ICAgLSBUaGUgbWluaW11bSBhbW91bnQgb2YgdGltZSB0aGF0IE9TUE0gbXVzdCB3YWl0IGFmdGVyIHRoZQorCSAqICAgICAgICAgICAgICBjb21wbGV0aW9uIG9mIGEgY29tbWFuZCBiZWZvcmUgaXNzdWluZyB0aGUgbmV4dCBjb21tYW5kLAorCSAqICAgICAgICAgICAgICBpbiBtaWNyb3NlY29uZHMuCisJICovCisJdW5zaWduZWQgaW50IGxhdGVuY3lfbnMgPSAwOworCXN0cnVjdCBjcGNfZGVzYyAqY3BjX2Rlc2M7CisJc3RydWN0IGNwY19yZWdpc3Rlcl9yZXNvdXJjZSAqZGVzaXJlZF9yZWc7CisKKwljcGNfZGVzYyA9IHBlcl9jcHUoY3BjX2Rlc2NfcHRyLCBjcHVfbnVtKTsKKwlpZiAoIWNwY19kZXNjKQorCQlyZXR1cm4gQ1BVRlJFUV9FVEVSTkFMOworCisJZGVzaXJlZF9yZWcgPSAmY3BjX2Rlc2MtPmNwY19yZWdzW0RFU0lSRURfUEVSRl07CisJaWYgKCFDUENfSU5fUENDKGRlc2lyZWRfcmVnKSkKKwkJcmV0dXJuIENQVUZSRVFfRVRFUk5BTDsKKworCWlmIChwY2NfZGF0YS5wY2NfbXBhcikKKwkJbGF0ZW5jeV9ucyA9IDYwICogKDEwMDAgKiAxMDAwICogMTAwMCAvIHBjY19kYXRhLnBjY19tcGFyKTsKKworCWxhdGVuY3lfbnMgPSBtYXgobGF0ZW5jeV9ucywgcGNjX2RhdGEucGNjX25vbWluYWwgKiAxMDAwKTsKKwlsYXRlbmN5X25zID0gbWF4KGxhdGVuY3lfbnMsIHBjY19kYXRhLnBjY19tcnR0ICogMTAwMCk7CisKKwlyZXR1cm4gbGF0ZW5jeV9uczsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNwcGNfZ2V0X3RyYW5zaXRpb25fbGF0ZW5jeSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZWMuYyBiL2RyaXZlcnMvYWNwaS9lYy5jCmluZGV4IGU3YmQ1N2MuLjY4MDUzMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9lYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9lYy5jCkBAIC0xMDQsMTAgKzEwNCwxMiBAQAogI2RlZmluZSBBQ1BJX0VDX01BWF9RVUVSSUVTCTE2CS8qIE1heGltdW0gbnVtYmVyIG9mIHBhcmFsbGVsIHF1ZXJpZXMgKi8KIAogZW51bSB7CisJRUNfRkxBR1NfUVVFUllfRU5BQkxFRCwJCS8qIFF1ZXJ5IGlzIGVuYWJsZWQgKi8KIAlFQ19GTEFHU19RVUVSWV9QRU5ESU5HLAkJLyogUXVlcnkgaXMgcGVuZGluZyAqLwogCUVDX0ZMQUdTX1FVRVJZX0dVQVJESU5HLAkvKiBHdWFyZCBmb3IgU0NJX0VWVCBjaGVjayAqLwogCUVDX0ZMQUdTX0dQRV9IQU5ETEVSX0lOU1RBTExFRCwJLyogR1BFIGhhbmRsZXIgaW5zdGFsbGVkICovCiAJRUNfRkxBR1NfRUNfSEFORExFUl9JTlNUQUxMRUQsCS8qIE9wUmVnIGhhbmRsZXIgaW5zdGFsbGVkICovCisJRUNfRkxBR1NfRVZUX0hBTkRMRVJfSU5TVEFMTEVELCAvKiBfUXh4IGhhbmRsZXJzIGluc3RhbGxlZCAqLwogCUVDX0ZMQUdTX1NUQVJURUQsCQkvKiBEcml2ZXIgaXMgc3RhcnRlZCAqLwogCUVDX0ZMQUdTX1NUT1BQRUQsCQkvKiBEcml2ZXIgaXMgc3RvcHBlZCAqLwogCUVDX0ZMQUdTX0NPTU1BTkRfU1RPUk0sCQkvKiBHUEUgc3Rvcm1zIG9jY3VycmVkIHRvIHRoZQpAQCAtMTQ1LDYgKzE0NywxMCBAQAogbW9kdWxlX3BhcmFtKGVjX3N0b3JtX3RocmVzaG9sZCwgdWludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGVjX3N0b3JtX3RocmVzaG9sZCwgIk1heGltIGZhbHNlIEdQRSBudW1iZXJzIG5vdCBjb25zaWRlcmVkIGFzIEdQRSBzdG9ybSIpOwogCitzdGF0aWMgYm9vbCBlY19mcmVlemVfZXZlbnRzIF9fcmVhZF9tb3N0bHkgPSB0cnVlOworbW9kdWxlX3BhcmFtKGVjX2ZyZWV6ZV9ldmVudHMsIGJvb2wsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhlY19mcmVlemVfZXZlbnRzLCAiRGlzYWJsaW5nIGV2ZW50IGhhbmRsaW5nIGR1cmluZyBzdXNwZW5kL3Jlc3VtZSIpOworCiBzdHJ1Y3QgYWNwaV9lY19xdWVyeV9oYW5kbGVyIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CiAJYWNwaV9lY19xdWVyeV9mdW5jIGZ1bmM7CkBAIC0xNzksNiArMTg1LDcgQEAKIAogc3RydWN0IGFjcGlfZWMgKmJvb3RfZWMsICpmaXJzdF9lYzsKIEVYUE9SVF9TWU1CT0woZmlyc3RfZWMpOworc3RhdGljIGJvb2wgYm9vdF9lY19pc19lY2R0ID0gZmFsc2U7CiBzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmVjX3F1ZXJ5X3dxOwogCiBzdGF0aWMgaW50IEVDX0ZMQUdTX0NMRUFSX09OX1JFU1VNRTsgLyogTmVlZHMgYWNwaV9lY19jbGVhcigpIG9uIGJvb3QvcmVzdW1lICovCkBAIC0yMzksNiArMjQ2LDMwIEBACiAJICAgICAgICF0ZXN0X2JpdChFQ19GTEFHU19TVE9QUEVELCAmZWMtPmZsYWdzKTsKIH0KIAorc3RhdGljIGJvb2wgYWNwaV9lY19ldmVudF9lbmFibGVkKHN0cnVjdCBhY3BpX2VjICplYykKK3sKKwkvKgorCSAqIFRoZXJlIGlzIGFuIE9TUE0gZWFybHkgc3RhZ2UgbG9naWMuIER1cmluZyB0aGUgZWFybHkgc3RhZ2VzCisJICogKGJvb3QvcmVzdW1lKSwgT1NQTXMgc2hvdWxkbid0IGVuYWJsZSB0aGUgZXZlbnQgaGFuZGxpbmcsIG9ubHkKKwkgKiB0aGUgRUMgdHJhbnNhY3Rpb25zIGFyZSBhbGxvd2VkIHRvIGJlIHBlcmZvcm1lZC4KKwkgKi8KKwlpZiAoIXRlc3RfYml0KEVDX0ZMQUdTX1FVRVJZX0VOQUJMRUQsICZlYy0+ZmxhZ3MpKQorCQlyZXR1cm4gZmFsc2U7CisJLyoKKwkgKiBIb3dldmVyLCBkaXNhYmxpbmcgdGhlIGV2ZW50IGhhbmRsaW5nIGlzIGV4cGVyaW1lbnRhbCBmb3IgbGF0ZQorCSAqIHN0YWdlIChzdXNwZW5kKSwgYW5kIGlzIGNvbnRyb2xsZWQgYnkgdGhlIGJvb3QgcGFyYW1ldGVyIG9mCisJICogImVjX2ZyZWV6ZV9ldmVudHMiOgorCSAqIDEuIHRydWU6ICBUaGUgRUMgZXZlbnQgaGFuZGxpbmcgaXMgZGlzYWJsZWQgYmVmb3JlIGVudGVyaW5nCisJICogICAgICAgICAgIHRoZSBub2lycSBzdGFnZS4KKwkgKiAyLiBmYWxzZTogVGhlIEVDIGV2ZW50IGhhbmRsaW5nIGlzIGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQgYXMKKwkgKiAgICAgICAgICAgc29vbiBhcyB0aGUgRUMgZHJpdmVyIGlzIHN0b3BwZWQuCisJICovCisJaWYgKGVjX2ZyZWV6ZV9ldmVudHMpCisJCXJldHVybiBhY3BpX2VjX3N0YXJ0ZWQoZWMpOworCWVsc2UKKwkJcmV0dXJuIHRlc3RfYml0KEVDX0ZMQUdTX1NUQVJURUQsICZlYy0+ZmxhZ3MpOworfQorCiBzdGF0aWMgYm9vbCBhY3BpX2VjX2ZsdXNoZWQoc3RydWN0IGFjcGlfZWMgKmVjKQogewogCXJldHVybiBlYy0+cmVmZXJlbmNlX2NvdW50ID09IDE7CkBAIC00MjksNyArNDYwLDggQEAKIAogc3RhdGljIHZvaWQgYWNwaV9lY19zdWJtaXRfcXVlcnkoc3RydWN0IGFjcGlfZWMgKmVjKQogewotCWlmICghdGVzdF9hbmRfc2V0X2JpdChFQ19GTEFHU19RVUVSWV9QRU5ESU5HLCAmZWMtPmZsYWdzKSkgeworCWlmIChhY3BpX2VjX2V2ZW50X2VuYWJsZWQoZWMpICYmCisJICAgICF0ZXN0X2FuZF9zZXRfYml0KEVDX0ZMQUdTX1FVRVJZX1BFTkRJTkcsICZlYy0+ZmxhZ3MpKSB7CiAJCWVjX2RiZ19ldnQoIkNvbW1hbmQoJXMpIHN1Ym1pdHRlZC9ibG9ja2VkIiwKIAkJCSAgIGFjcGlfZWNfY21kX3N0cmluZyhBQ1BJX0VDX0NPTU1BTkRfUVVFUlkpKTsKIAkJZWMtPm5yX3BlbmRpbmdfcXVlcmllcysrOwpAQCAtNDQ2LDYgKzQ3OCw4NiBAQAogCX0KIH0KIAorc3RhdGljIGlubGluZSB2b2lkIF9fYWNwaV9lY19lbmFibGVfZXZlbnQoc3RydWN0IGFjcGlfZWMgKmVjKQoreworCWlmICghdGVzdF9hbmRfc2V0X2JpdChFQ19GTEFHU19RVUVSWV9FTkFCTEVELCAmZWMtPmZsYWdzKSkKKwkJZWNfbG9nX2RydigiZXZlbnQgdW5ibG9ja2VkIik7CisJaWYgKCF0ZXN0X2JpdChFQ19GTEFHU19RVUVSWV9QRU5ESU5HLCAmZWMtPmZsYWdzKSkKKwkJYWR2YW5jZV90cmFuc2FjdGlvbihlYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2FjcGlfZWNfZGlzYWJsZV9ldmVudChzdHJ1Y3QgYWNwaV9lYyAqZWMpCit7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChFQ19GTEFHU19RVUVSWV9FTkFCTEVELCAmZWMtPmZsYWdzKSkKKwkJZWNfbG9nX2RydigiZXZlbnQgYmxvY2tlZCIpOworfQorCisvKgorICogUHJvY2VzcyBfUSBldmVudHMgdGhhdCBtaWdodCBoYXZlIGFjY3VtdWxhdGVkIGluIHRoZSBFQy4KKyAqIFJ1biB3aXRoIGxvY2tlZCBlYyBtdXRleC4KKyAqLworc3RhdGljIHZvaWQgYWNwaV9lY19jbGVhcihzdHJ1Y3QgYWNwaV9lYyAqZWMpCit7CisJaW50IGksIHN0YXR1czsKKwl1OCB2YWx1ZSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQUNQSV9FQ19DTEVBUl9NQVg7IGkrKykgeworCQlzdGF0dXMgPSBhY3BpX2VjX3F1ZXJ5KGVjLCAmdmFsdWUpOworCQlpZiAoc3RhdHVzIHx8ICF2YWx1ZSkKKwkJCWJyZWFrOworCX0KKwlpZiAodW5saWtlbHkoaSA9PSBBQ1BJX0VDX0NMRUFSX01BWCkpCisJCXByX3dhcm4oIldhcm5pbmc6IE1heGltdW0gb2YgJWQgc3RhbGUgRUMgZXZlbnRzIGNsZWFyZWRcbiIsIGkpOworCWVsc2UKKwkJcHJfaW5mbygiJWQgc3RhbGUgRUMgZXZlbnRzIGNsZWFyZWRcbiIsIGkpOworfQorCitzdGF0aWMgdm9pZCBhY3BpX2VjX2VuYWJsZV9ldmVudChzdHJ1Y3QgYWNwaV9lYyAqZWMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlYy0+bG9jaywgZmxhZ3MpOworCWlmIChhY3BpX2VjX3N0YXJ0ZWQoZWMpKQorCQlfX2FjcGlfZWNfZW5hYmxlX2V2ZW50KGVjKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlYy0+bG9jaywgZmxhZ3MpOworCisJLyogRHJhaW4gYWRkaXRpb25hbCBldmVudHMgaWYgaGFyZHdhcmUgcmVxdWlyZXMgdGhhdCAqLworCWlmIChFQ19GTEFHU19DTEVBUl9PTl9SRVNVTUUpCisJCWFjcGlfZWNfY2xlYXIoZWMpOworfQorCitzdGF0aWMgYm9vbCBhY3BpX2VjX3F1ZXJ5X2ZsdXNoZWQoc3RydWN0IGFjcGlfZWMgKmVjKQoreworCWJvb2wgZmx1c2hlZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVjLT5sb2NrLCBmbGFncyk7CisJZmx1c2hlZCA9ICFlYy0+bnJfcGVuZGluZ19xdWVyaWVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVjLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIGZsdXNoZWQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fYWNwaV9lY19mbHVzaF9ldmVudChzdHJ1Y3QgYWNwaV9lYyAqZWMpCit7CisJLyoKKwkgKiBXaGVuIGVjX2ZyZWV6ZV9ldmVudHMgaXMgdHJ1ZSwgd2UgbmVlZCB0byBmbHVzaCBldmVudHMgaW4KKwkgKiB0aGUgcHJvcGVyIHBvc2l0aW9uIGJlZm9yZSBlbnRlcmluZyB0aGUgbm9pcnEgc3RhZ2UuCisJICovCisJd2FpdF9ldmVudChlYy0+d2FpdCwgYWNwaV9lY19xdWVyeV9mbHVzaGVkKGVjKSk7CisJaWYgKGVjX3F1ZXJ5X3dxKQorCQlmbHVzaF93b3JrcXVldWUoZWNfcXVlcnlfd3EpOworfQorCitzdGF0aWMgdm9pZCBhY3BpX2VjX2Rpc2FibGVfZXZlbnQoc3RydWN0IGFjcGlfZWMgKmVjKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZWMtPmxvY2ssIGZsYWdzKTsKKwlfX2FjcGlfZWNfZGlzYWJsZV9ldmVudChlYyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWMtPmxvY2ssIGZsYWdzKTsKKwlfX2FjcGlfZWNfZmx1c2hfZXZlbnQoZWMpOworfQorCiBzdGF0aWMgYm9vbCBhY3BpX2VjX2d1YXJkX2V2ZW50KHN0cnVjdCBhY3BpX2VjICplYykKIHsKIAlib29sIGd1YXJkZWQgPSB0cnVlOwpAQCAtODMyLDI3ICs5NDQsNiBAQAogfQogRVhQT1JUX1NZTUJPTChlY19nZXRfaGFuZGxlKTsKIAotLyoKLSAqIFByb2Nlc3MgX1EgZXZlbnRzIHRoYXQgbWlnaHQgaGF2ZSBhY2N1bXVsYXRlZCBpbiB0aGUgRUMuCi0gKiBSdW4gd2l0aCBsb2NrZWQgZWMgbXV0ZXguCi0gKi8KLXN0YXRpYyB2b2lkIGFjcGlfZWNfY2xlYXIoc3RydWN0IGFjcGlfZWMgKmVjKQotewotCWludCBpLCBzdGF0dXM7Ci0JdTggdmFsdWUgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IEFDUElfRUNfQ0xFQVJfTUFYOyBpKyspIHsKLQkJc3RhdHVzID0gYWNwaV9lY19xdWVyeShlYywgJnZhbHVlKTsKLQkJaWYgKHN0YXR1cyB8fCAhdmFsdWUpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAodW5saWtlbHkoaSA9PSBBQ1BJX0VDX0NMRUFSX01BWCkpCi0JCXByX3dhcm4oIldhcm5pbmc6IE1heGltdW0gb2YgJWQgc3RhbGUgRUMgZXZlbnRzIGNsZWFyZWRcbiIsIGkpOwotCWVsc2UKLQkJcHJfaW5mbygiJWQgc3RhbGUgRUMgZXZlbnRzIGNsZWFyZWRcbiIsIGkpOwotfQotCiBzdGF0aWMgdm9pZCBhY3BpX2VjX3N0YXJ0KHN0cnVjdCBhY3BpX2VjICplYywgYm9vbCByZXN1bWluZykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtODk2LDcgKzk4Nyw4IEBACiAJCWlmICghc3VzcGVuZGluZykgewogCQkJYWNwaV9lY19jb21wbGV0ZV9yZXF1ZXN0KGVjKTsKIAkJCWVjX2RiZ19yZWYoZWMsICJEZWNyZWFzZSBkcml2ZXIiKTsKLQkJfQorCQl9IGVsc2UgaWYgKCFlY19mcmVlemVfZXZlbnRzKQorCQkJX19hY3BpX2VjX2Rpc2FibGVfZXZlbnQoZWMpOwogCQljbGVhcl9iaXQoRUNfRkxBR1NfU1RBUlRFRCwgJmVjLT5mbGFncyk7CiAJCWNsZWFyX2JpdChFQ19GTEFHU19TVE9QUEVELCAmZWMtPmZsYWdzKTsKIAkJZWNfbG9nX2RydigiRUMgc3RvcHBlZCIpOwpAQCAtOTE5LDIwICsxMDExLDYgQEAKIAogdm9pZCBhY3BpX2VjX3VuYmxvY2tfdHJhbnNhY3Rpb25zKHZvaWQpCiB7Ci0Jc3RydWN0IGFjcGlfZWMgKmVjID0gZmlyc3RfZWM7Ci0KLQlpZiAoIWVjKQotCQlyZXR1cm47Ci0KLQkvKiBBbGxvdyB0cmFuc2FjdGlvbnMgdG8gYmUgY2FycmllZCBvdXQgYWdhaW4gKi8KLQlhY3BpX2VjX3N0YXJ0KGVjLCB0cnVlKTsKLQotCWlmIChFQ19GTEFHU19DTEVBUl9PTl9SRVNVTUUpCi0JCWFjcGlfZWNfY2xlYXIoZWMpOwotfQotCi12b2lkIGFjcGlfZWNfdW5ibG9ja190cmFuc2FjdGlvbnNfZWFybHkodm9pZCkKLXsKIAkvKgogCSAqIEFsbG93IHRyYW5zYWN0aW9ucyB0byBoYXBwZW4gYWdhaW4gKHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20KIAkgKiBhdG9taWMgY29udGV4dCBkdXJpbmcgd2FrZXVwLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGFjcXVpcmUgdGhlIG11dGV4KS4KQEAgLTEyMjgsMTMgKzEzMDYsMjEgQEAKIHN0YXRpYyBhY3BpX3N0YXR1cwogZWNfcGFyc2VfaW9fcG9ydHMoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLCB2b2lkICpjb250ZXh0KTsKIAotc3RhdGljIHN0cnVjdCBhY3BpX2VjICptYWtlX2FjcGlfZWModm9pZCkKK3N0YXRpYyB2b2lkIGFjcGlfZWNfZnJlZShzdHJ1Y3QgYWNwaV9lYyAqZWMpCit7CisJaWYgKGZpcnN0X2VjID09IGVjKQorCQlmaXJzdF9lYyA9IE5VTEw7CisJaWYgKGJvb3RfZWMgPT0gZWMpCisJCWJvb3RfZWMgPSBOVUxMOworCWtmcmVlKGVjKTsKK30KKworc3RhdGljIHN0cnVjdCBhY3BpX2VjICphY3BpX2VjX2FsbG9jKHZvaWQpCiB7CiAJc3RydWN0IGFjcGlfZWMgKmVjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlfZWMpLCBHRlBfS0VSTkVMKTsKIAogCWlmICghZWMpCiAJCXJldHVybiBOVUxMOwotCWVjLT5mbGFncyA9IDEgPDwgRUNfRkxBR1NfUVVFUllfUEVORElORzsKIAltdXRleF9pbml0KCZlYy0+bXV0ZXgpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmVjLT53YWl0KTsKIAlJTklUX0xJU1RfSEVBRCgmZWMtPmxpc3QpOwpAQCAtMTI5MCw3ICsxMzc2LDEyIEBACiAJcmV0dXJuIEFFX0NUUkxfVEVSTUlOQVRFOwogfQogCi1zdGF0aWMgaW50IGVjX2luc3RhbGxfaGFuZGxlcnMoc3RydWN0IGFjcGlfZWMgKmVjKQorLyoKKyAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlIG9ubHkgd2hlbiB0aGUgYWRkcmVzcyBzcGFjZQorICogICAgICAgaGFuZGxlciBpcyBub3QgaW5zdGFsbGVkLCB3aGljaCBtZWFucyAibm90IGFibGUgdG8gaGFuZGxlCisgKiAgICAgICB0cmFuc2FjdGlvbnMiLgorICovCitzdGF0aWMgaW50IGVjX2luc3RhbGxfaGFuZGxlcnMoc3RydWN0IGFjcGlfZWMgKmVjLCBib29sIGhhbmRsZV9ldmVudHMpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCkBAIC0xMzE5LDYgKzE0MTAsMTYgQEAKIAkJc2V0X2JpdChFQ19GTEFHU19FQ19IQU5ETEVSX0lOU1RBTExFRCwgJmVjLT5mbGFncyk7CiAJfQogCisJaWYgKCFoYW5kbGVfZXZlbnRzKQorCQlyZXR1cm4gMDsKKworCWlmICghdGVzdF9iaXQoRUNfRkxBR1NfRVZUX0hBTkRMRVJfSU5TVEFMTEVELCAmZWMtPmZsYWdzKSkgeworCQkvKiBGaW5kIGFuZCByZWdpc3RlciBhbGwgcXVlcnkgbWV0aG9kcyAqLworCQlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9NRVRIT0QsIGVjLT5oYW5kbGUsIDEsCisJCQkJICAgIGFjcGlfZWNfcmVnaXN0ZXJfcXVlcnlfbWV0aG9kcywKKwkJCQkgICAgTlVMTCwgZWMsIE5VTEwpOworCQlzZXRfYml0KEVDX0ZMQUdTX0VWVF9IQU5ETEVSX0lOU1RBTExFRCwgJmVjLT5mbGFncyk7CisJfQogCWlmICghdGVzdF9iaXQoRUNfRkxBR1NfR1BFX0hBTkRMRVJfSU5TVEFMTEVELCAmZWMtPmZsYWdzKSkgewogCQlzdGF0dXMgPSBhY3BpX2luc3RhbGxfZ3BlX3Jhd19oYW5kbGVyKE5VTEwsIGVjLT5ncGUsCiAJCQkJCSAgQUNQSV9HUEVfRURHRV9UUklHR0VSRUQsCkBAIC0xMzI5LDYgKzE0MzAsOSBAQAogCQkJaWYgKHRlc3RfYml0KEVDX0ZMQUdTX1NUQVJURUQsICZlYy0+ZmxhZ3MpICYmCiAJCQkgICAgZWMtPnJlZmVyZW5jZV9jb3VudCA+PSAxKQogCQkJCWFjcGlfZWNfZW5hYmxlX2dwZShlYywgdHJ1ZSk7CisKKwkJCS8qIEVDIGlzIGZ1bGx5IG9wZXJhdGlvbmFsLCBhbGxvdyBxdWVyaWVzICovCisJCQlhY3BpX2VjX2VuYWJsZV9ldmVudChlYyk7CiAJCX0KIAl9CiAKQEAgLTEzNjMsMjMgKzE0NjcsMTA0IEBACiAJCQlwcl9lcnIoImZhaWxlZCB0byByZW1vdmUgZ3BlIGhhbmRsZXJcbiIpOwogCQljbGVhcl9iaXQoRUNfRkxBR1NfR1BFX0hBTkRMRVJfSU5TVEFMTEVELCAmZWMtPmZsYWdzKTsKIAl9CisJaWYgKHRlc3RfYml0KEVDX0ZMQUdTX0VWVF9IQU5ETEVSX0lOU1RBTExFRCwgJmVjLT5mbGFncykpIHsKKwkJYWNwaV9lY19yZW1vdmVfcXVlcnlfaGFuZGxlcnMoZWMsIHRydWUsIDApOworCQljbGVhcl9iaXQoRUNfRkxBR1NfRVZUX0hBTkRMRVJfSU5TVEFMTEVELCAmZWMtPmZsYWdzKTsKKwl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYWNwaV9lYyAqYWNwaV9lY19hbGxvYyh2b2lkKQorc3RhdGljIGludCBhY3BpX2VjX3NldHVwKHN0cnVjdCBhY3BpX2VjICplYywgYm9vbCBoYW5kbGVfZXZlbnRzKQogewotCXN0cnVjdCBhY3BpX2VjICplYzsKKwlpbnQgcmV0OwogCi0JLyogQ2hlY2sgZm9yIGJvb3QgRUMgKi8KLQlpZiAoYm9vdF9lYykgewotCQllYyA9IGJvb3RfZWM7Ci0JCWJvb3RfZWMgPSBOVUxMOwotCQllY19yZW1vdmVfaGFuZGxlcnMoZWMpOwotCQlpZiAoZmlyc3RfZWMgPT0gZWMpCi0JCQlmaXJzdF9lYyA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJZWMgPSBtYWtlX2FjcGlfZWMoKTsKKwlyZXQgPSBlY19pbnN0YWxsX2hhbmRsZXJzKGVjLCBoYW5kbGVfZXZlbnRzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogRmlyc3QgRUMgY2FwYWJsZSBvZiBoYW5kbGluZyB0cmFuc2FjdGlvbnMgKi8KKwlpZiAoIWZpcnN0X2VjKSB7CisJCWZpcnN0X2VjID0gZWM7CisJCWFjcGlfaGFuZGxlX2luZm8oZmlyc3RfZWMtPmhhbmRsZSwgIlVzZWQgYXMgZmlyc3QgRUNcbiIpOwogCX0KLQlyZXR1cm4gZWM7CisKKwlhY3BpX2hhbmRsZV9pbmZvKGVjLT5oYW5kbGUsCisJCQkgIkdQRT0weCVseCwgRUNfQ01EL0VDX1NDPTB4JWx4LCBFQ19EQVRBPTB4JWx4XG4iLAorCQkJIGVjLT5ncGUsIGVjLT5jb21tYW5kX2FkZHIsIGVjLT5kYXRhX2FkZHIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWNwaV9jb25maWdfYm9vdF9lYyhzdHJ1Y3QgYWNwaV9lYyAqZWMsIGFjcGlfaGFuZGxlIGhhbmRsZSwKKwkJCSAgICAgICBib29sIGhhbmRsZV9ldmVudHMsIGJvb2wgaXNfZWNkdCkKK3sKKwlpbnQgcmV0OworCisJLyoKKwkgKiBDaGFuZ2luZyB0aGUgQUNQSSBoYW5kbGUgcmVzdWx0cyBpbiBhIHJlLWNvbmZpZ3VyYXRpb24gb2YgdGhlCisJICogYm9vdCBFQy4gQW5kIGlmIGl0IGhhcHBlbnMgYWZ0ZXIgdGhlIG5hbWVzcGFjZSBpbml0aWFsaXphdGlvbiwKKwkgKiBpdCBjYXVzZXMgX1JFRyBldmFsdWF0aW9ucy4KKwkgKi8KKwlpZiAoYm9vdF9lYyAmJiBib290X2VjLT5oYW5kbGUgIT0gaGFuZGxlKQorCQllY19yZW1vdmVfaGFuZGxlcnMoYm9vdF9lYyk7CisKKwkvKiBVbnNldCBvbGQgYm9vdCBFQyAqLworCWlmIChib290X2VjICE9IGVjKQorCQlhY3BpX2VjX2ZyZWUoYm9vdF9lYyk7CisKKwkvKgorCSAqIEVDRFQgZGV2aWNlIGNyZWF0aW9uIGlzIHNwbGl0IGludG8gYWNwaV9lY19lY2R0X3Byb2JlKCkgYW5kCisJICogYWNwaV9lY19lY2R0X3N0YXJ0KCkuIFRoaXMgZnVuY3Rpb24gdGFrZXMgY2FyZSBvZiBjb21wbGV0aW5nIHRoZQorCSAqIEVDRFQgcGFyc2luZyBsb2dpYyBhcyB0aGUgaGFuZGxlIHVwZGF0ZSBzaG91bGQgYmUgcGVyZm9ybWVkCisJICogYmV0d2VlbiB0aGUgaW5zdGFsbGF0aW9uL3VuaW5zdGFsbGF0aW9uIG9mIHRoZSBoYW5kbGVycy4KKwkgKi8KKwlpZiAoZWMtPmhhbmRsZSAhPSBoYW5kbGUpCisJCWVjLT5oYW5kbGUgPSBoYW5kbGU7CisKKwlyZXQgPSBhY3BpX2VjX3NldHVwKGVjLCBoYW5kbGVfZXZlbnRzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogU2V0IG5ldyBib290IEVDICovCisJaWYgKCFib290X2VjKSB7CisJCWJvb3RfZWMgPSBlYzsKKwkJYm9vdF9lY19pc19lY2R0ID0gaXNfZWNkdDsKKwl9CisKKwlhY3BpX2hhbmRsZV9pbmZvKGJvb3RfZWMtPmhhbmRsZSwKKwkJCSAiVXNlZCBhcyBib290ICVzIEVDIHRvIGhhbmRsZSB0cmFuc2FjdGlvbnMlc1xuIiwKKwkJCSBpc19lY2R0ID8gIkVDRFQiIDogIkRTRFQiLAorCQkJIGhhbmRsZV9ldmVudHMgPyAiIGFuZCBldmVudHMiIDogIiIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBib29sIGFjcGlfZWNfZWNkdF9nZXRfaGFuZGxlKGFjcGlfaGFuZGxlICpwaGFuZGxlKQoreworCXN0cnVjdCBhY3BpX3RhYmxlX2VjZHQgKmVjZHRfcHRyOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX2hhbmRsZSBoYW5kbGU7CisKKwlzdGF0dXMgPSBhY3BpX2dldF90YWJsZShBQ1BJX1NJR19FQ0RULCAxLAorCQkJCShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKiopJmVjZHRfcHRyKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXJldHVybiBmYWxzZTsKKworCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShOVUxMLCBlY2R0X3B0ci0+aWQsICZoYW5kbGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIGZhbHNlOworCisJKnBoYW5kbGUgPSBoYW5kbGU7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGFjcGlfaXNfYm9vdF9lYyhzdHJ1Y3QgYWNwaV9lYyAqZWMpCit7CisJaWYgKCFib290X2VjKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKGVjLT5oYW5kbGUgPT0gYm9vdF9lYy0+aGFuZGxlICYmCisJICAgIGVjLT5ncGUgPT0gYm9vdF9lYy0+Z3BlICYmCisJICAgIGVjLT5jb21tYW5kX2FkZHIgPT0gYm9vdF9lYy0+Y29tbWFuZF9hZGRyICYmCisJICAgIGVjLT5kYXRhX2FkZHIgPT0gYm9vdF9lYy0+ZGF0YV9hZGRyKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIHN0YXRpYyBpbnQgYWNwaV9lY19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCkBAIC0xMzk1LDE2ICsxNTgwLDIxIEBACiAJCXJldHVybiAtRU5PTUVNOwogCWlmIChlY19wYXJzZV9kZXZpY2UoZGV2aWNlLT5oYW5kbGUsIDAsIGVjLCBOVUxMKSAhPQogCQlBRV9DVFJMX1RFUk1JTkFURSkgewotCQkJa2ZyZWUoZWMpOwotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJfYWxsb2M7CiAJfQogCi0JLyogRmluZCBhbmQgcmVnaXN0ZXIgYWxsIHF1ZXJ5IG1ldGhvZHMgKi8KLQlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9NRVRIT0QsIGVjLT5oYW5kbGUsIDEsCi0JCQkgICAgYWNwaV9lY19yZWdpc3Rlcl9xdWVyeV9tZXRob2RzLCBOVUxMLCBlYywgTlVMTCk7CisJaWYgKGFjcGlfaXNfYm9vdF9lYyhlYykpIHsKKwkJYm9vdF9lY19pc19lY2R0ID0gZmFsc2U7CisJCWFjcGlfaGFuZGxlX2RlYnVnKGVjLT5oYW5kbGUsICJkdXBsaWNhdGVkLlxuIik7CisJCWFjcGlfZWNfZnJlZShlYyk7CisJCWVjID0gYm9vdF9lYzsKKwkJcmV0ID0gYWNwaV9jb25maWdfYm9vdF9lYyhlYywgZWMtPmhhbmRsZSwgdHJ1ZSwgZmFsc2UpOworCX0gZWxzZQorCQlyZXQgPSBhY3BpX2VjX3NldHVwKGVjLCB0cnVlKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9xdWVyeTsKIAotCWlmICghZmlyc3RfZWMpCi0JCWZpcnN0X2VjID0gZWM7CiAJZGV2aWNlLT5kcml2ZXJfZGF0YSA9IGVjOwogCiAJcmV0ID0gISFyZXF1ZXN0X3JlZ2lvbihlYy0+ZGF0YV9hZGRyLCAxLCAiRUMgZGF0YSIpOwpAQCAtMTQxMiwyMCArMTYwMiwxNyBAQAogCXJldCA9ICEhcmVxdWVzdF9yZWdpb24oZWMtPmNvbW1hbmRfYWRkciwgMSwgIkVDIGNtZCIpOwogCVdBUk4oIXJldCwgIkNvdWxkIG5vdCByZXF1ZXN0IEVDIGNtZCBpbyBwb3J0IDB4JWx4IiwgZWMtPmNvbW1hbmRfYWRkcik7CiAKLQlwcl9pbmZvKCJHUEUgPSAweCVseCwgSS9POiBjb21tYW5kL3N0YXR1cyA9IDB4JWx4LCBkYXRhID0gMHglbHhcbiIsCi0JCQkgIGVjLT5ncGUsIGVjLT5jb21tYW5kX2FkZHIsIGVjLT5kYXRhX2FkZHIpOwotCi0JcmV0ID0gZWNfaW5zdGFsbF9oYW5kbGVycyhlYyk7Ci0KIAkvKiBSZXByb2JlIGRldmljZXMgZGVwZW5kaW5nIG9uIHRoZSBFQyAqLwogCWFjcGlfd2Fsa19kZXBfZGV2aWNlX2xpc3QoZWMtPmhhbmRsZSk7CisJYWNwaV9oYW5kbGVfZGVidWcoZWMtPmhhbmRsZSwgImVudW1lcmF0ZWQuXG4iKTsKKwlyZXR1cm4gMDsKIAotCS8qIEVDIGlzIGZ1bGx5IG9wZXJhdGlvbmFsLCBhbGxvdyBxdWVyaWVzICovCi0JY2xlYXJfYml0KEVDX0ZMQUdTX1FVRVJZX1BFTkRJTkcsICZlYy0+ZmxhZ3MpOwotCi0JLyogQ2xlYXIgc3RhbGUgX1EgZXZlbnRzIGlmIGhhcmR3YXJlIG1pZ2h0IHJlcXVpcmUgdGhhdCAqLwotCWlmIChFQ19GTEFHU19DTEVBUl9PTl9SRVNVTUUpCi0JCWFjcGlfZWNfY2xlYXIoZWMpOworZXJyX3F1ZXJ5OgorCWlmIChlYyAhPSBib290X2VjKQorCQlhY3BpX2VjX3JlbW92ZV9xdWVyeV9oYW5kbGVycyhlYywgdHJ1ZSwgMCk7CitlcnJfYWxsb2M6CisJaWYgKGVjICE9IGJvb3RfZWMpCisJCWFjcGlfZWNfZnJlZShlYyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTQzNywxNCArMTYyNCwxMyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWVjID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwotCWVjX3JlbW92ZV9oYW5kbGVycyhlYyk7Ci0JYWNwaV9lY19yZW1vdmVfcXVlcnlfaGFuZGxlcnMoZWMsIHRydWUsIDApOwogCXJlbGVhc2VfcmVnaW9uKGVjLT5kYXRhX2FkZHIsIDEpOwogCXJlbGVhc2VfcmVnaW9uKGVjLT5jb21tYW5kX2FkZHIsIDEpOwogCWRldmljZS0+ZHJpdmVyX2RhdGEgPSBOVUxMOwotCWlmIChlYyA9PSBmaXJzdF9lYykKLQkJZmlyc3RfZWMgPSBOVUxMOwotCWtmcmVlKGVjKTsKKwlpZiAoZWMgIT0gYm9vdF9lYykgeworCQllY19yZW1vdmVfaGFuZGxlcnMoZWMpOworCQlhY3BpX2VjX2ZyZWUoZWMpOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQ4Niw5ICsxNjcyLDggQEAKIAlpZiAoIWVjKQogCQlyZXR1cm4gLUVOT01FTTsKIAkvKgotCSAqIEZpbmRpbmcgRUMgZnJvbSBEU0RUIGlmIHRoZXJlIGlzIG5vIEVDRFQgRUMgYXZhaWxhYmxlLiBXaGVuIHRoaXMKLQkgKiBmdW5jdGlvbiBpcyBpbnZva2VkLCBBQ1BJIHRhYmxlcyBoYXZlIGJlZW4gZnVsbHkgbG9hZGVkLCB3ZSBjYW4KLQkgKiB3YWxrIG5hbWVzcGFjZSBub3cuCisJICogQXQgdGhpcyBwb2ludCwgdGhlIG5hbWVzcGFjZSBpcyBpbml0aWFsaXplZCwgc28gc3RhcnQgdG8gZmluZAorCSAqIHRoZSBuYW1lc3BhY2Ugb2JqZWN0cy4KIAkgKi8KIAlzdGF0dXMgPSBhY3BpX2dldF9kZXZpY2VzKGVjX2RldmljZV9pZHNbMF0uaWQsCiAJCQkJICBlY19wYXJzZV9kZXZpY2UsIGVjLCBOVUxMKTsKQEAgLTE0OTYsMTYgKzE2ODEsNDcgQEAKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBlcnJvcjsKIAl9Ci0JcmV0ID0gZWNfaW5zdGFsbF9oYW5kbGVycyhlYyk7Ci0KKwkvKgorCSAqIFdoZW4gdGhlIERTRFQgRUMgaXMgYXZhaWxhYmxlLCBhbHdheXMgcmUtY29uZmlndXJlIGJvb3QgRUMgdG8KKwkgKiBoYXZlIF9SRUcgZXZhbHVhdGVkLiBfUkVHIGNhbiBvbmx5IGJlIGV2YWx1YXRlZCBhZnRlciB0aGUKKwkgKiBuYW1lc3BhY2UgaW5pdGlhbGl6YXRpb24uCisJICogQXQgdGhpcyBwb2ludCwgdGhlIEdQRSBpcyBub3QgZnVsbHkgaW5pdGlhbGl6ZWQsIHNvIGRvIG5vdCB0bworCSAqIGhhbmRsZSB0aGUgZXZlbnRzLgorCSAqLworCXJldCA9IGFjcGlfY29uZmlnX2Jvb3RfZWMoZWMsIGVjLT5oYW5kbGUsIGZhbHNlLCBmYWxzZSk7CiBlcnJvcjoKIAlpZiAocmV0KQotCQlrZnJlZShlYyk7Ci0JZWxzZQotCQlmaXJzdF9lYyA9IGJvb3RfZWMgPSBlYzsKKwkJYWNwaV9lY19mcmVlKGVjKTsKIAlyZXR1cm4gcmV0OwogfQogCisvKgorICogSWYgdGhlIERTRFQgRUMgaXMgbm90IGZ1bmN0aW9uaW5nLCB3ZSBzdGlsbCBuZWVkIHRvIHByZXBhcmUgYSBmdWxseQorICogZnVuY3Rpb25pbmcgRUNEVCBFQyBmaXJzdCBpbiBvcmRlciB0byBoYW5kbGUgdGhlIGV2ZW50cy4KKyAqIGh0dHBzOi8vYnVnemlsbGEua2VybmVsLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE1MDIxCisgKi8KK2ludCBfX2luaXQgYWNwaV9lY19lY2R0X3N0YXJ0KHZvaWQpCit7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCisJaWYgKCFib290X2VjKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkvKgorCSAqIFRoZSBEU0RUIEVDIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBzdGFydGVkIGluCisJICogYWNwaV9lY19hZGQoKS4KKwkgKi8KKwlpZiAoIWJvb3RfZWNfaXNfZWNkdCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQsIHRoZSBuYW1lc3BhY2UgYW5kIHRoZSBHUEUgaXMgaW5pdGlhbGl6ZWQsIHNvCisJICogc3RhcnQgdG8gZmluZCB0aGUgbmFtZXNwYWNlIG9iamVjdHMgYW5kIGhhbmRsZSB0aGUgZXZlbnRzLgorCSAqLworCWlmICghYWNwaV9lY19lY2R0X2dldF9oYW5kbGUoJmhhbmRsZSkpCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiBhY3BpX2NvbmZpZ19ib290X2VjKGJvb3RfZWMsIGhhbmRsZSwgdHJ1ZSwgdHJ1ZSk7Cit9CisKICNpZiAwCiAvKgogICogU29tZSBFQyBmaXJtd2FyZSB2YXJpYXRpb25zIHJlZnVzZXMgdG8gcmVzcG9uZCBRUl9FQyB3aGVuIFNDSV9FVlQgaXMgbm90CkBAIC0xNjAwLDcgKzE4MTYsNiBAQAogCQlnb3RvIGVycm9yOwogCX0KIAotCXByX2luZm8oIkVDIGRlc2NyaXB0aW9uIHRhYmxlIGlzIGZvdW5kLCBjb25maWd1cmluZyBib290IEVDXG4iKTsKIAlpZiAoRUNfRkxBR1NfQ09SUkVDVF9FQ0RUKSB7CiAJCWVjLT5jb21tYW5kX2FkZHIgPSBlY2R0X3B0ci0+ZGF0YS5hZGRyZXNzOwogCQllYy0+ZGF0YV9hZGRyID0gZWNkdF9wdHItPmNvbnRyb2wuYWRkcmVzczsKQEAgLTE2MDksMTYgKzE4MjQsOTAgQEAKIAkJZWMtPmRhdGFfYWRkciA9IGVjZHRfcHRyLT5kYXRhLmFkZHJlc3M7CiAJfQogCWVjLT5ncGUgPSBlY2R0X3B0ci0+Z3BlOwotCWVjLT5oYW5kbGUgPSBBQ1BJX1JPT1RfT0JKRUNUOwotCXJldCA9IGVjX2luc3RhbGxfaGFuZGxlcnMoZWMpOworCisJLyoKKwkgKiBBdCB0aGlzIHBvaW50LCB0aGUgbmFtZXNwYWNlIGlzIG5vdCBpbml0aWFsaXplZCwgc28gZG8gbm90IGZpbmQKKwkgKiB0aGUgbmFtZXNwYWNlIG9iamVjdHMsIG9yIGhhbmRsZSB0aGUgZXZlbnRzLgorCSAqLworCXJldCA9IGFjcGlfY29uZmlnX2Jvb3RfZWMoZWMsIEFDUElfUk9PVF9PQkpFQ1QsIGZhbHNlLCB0cnVlKTsKIGVycm9yOgogCWlmIChyZXQpCi0JCWtmcmVlKGVjKTsKLQllbHNlCi0JCWZpcnN0X2VjID0gYm9vdF9lYyA9IGVjOworCQlhY3BpX2VjX2ZyZWUoZWMpOwogCXJldHVybiByZXQ7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyB2b2lkIGFjcGlfZWNfZW50ZXJfbm9pcnEoc3RydWN0IGFjcGlfZWMgKmVjKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZWMgPT0gZmlyc3RfZWMpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmVjLT5sb2NrLCBmbGFncyk7CisJCWVjLT5zYXZlZF9idXN5X3BvbGxpbmcgPSBlY19idXN5X3BvbGxpbmc7CisJCWVjLT5zYXZlZF9wb2xsaW5nX2d1YXJkID0gZWNfcG9sbGluZ19ndWFyZDsKKwkJZWNfYnVzeV9wb2xsaW5nID0gdHJ1ZTsKKwkJZWNfcG9sbGluZ19ndWFyZCA9IDA7CisJCWVjX2xvZ19kcnYoImludGVycnVwdCBibG9ja2VkIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVjLT5sb2NrLCBmbGFncyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhY3BpX2VjX2xlYXZlX25vaXJxKHN0cnVjdCBhY3BpX2VjICplYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGVjID09IGZpcnN0X2VjKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZlYy0+bG9jaywgZmxhZ3MpOworCQllY19idXN5X3BvbGxpbmcgPSBlYy0+c2F2ZWRfYnVzeV9wb2xsaW5nOworCQllY19wb2xsaW5nX2d1YXJkID0gZWMtPnNhdmVkX3BvbGxpbmdfZ3VhcmQ7CisJCWVjX2xvZ19kcnYoImludGVycnVwdCB1bmJsb2NrZWQiKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWMtPmxvY2ssIGZsYWdzKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYWNwaV9lY19zdXNwZW5kX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWNwaV9lYyAqZWMgPQorCQlhY3BpX2RyaXZlcl9kYXRhKHRvX2FjcGlfZGV2aWNlKGRldikpOworCisJYWNwaV9lY19lbnRlcl9ub2lycShlYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWNwaV9lY19yZXN1bWVfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhY3BpX2VjICplYyA9CisJCWFjcGlfZHJpdmVyX2RhdGEodG9fYWNwaV9kZXZpY2UoZGV2KSk7CisKKwlhY3BpX2VjX2xlYXZlX25vaXJxKGVjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhY3BpX2VjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhY3BpX2VjICplYyA9CisJCWFjcGlfZHJpdmVyX2RhdGEodG9fYWNwaV9kZXZpY2UoZGV2KSk7CisKKwlpZiAoZWNfZnJlZXplX2V2ZW50cykKKwkJYWNwaV9lY19kaXNhYmxlX2V2ZW50KGVjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhY3BpX2VjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFjcGlfZWMgKmVjID0KKwkJYWNwaV9kcml2ZXJfZGF0YSh0b19hY3BpX2RldmljZShkZXYpKTsKKworCWFjcGlfZWNfZW5hYmxlX2V2ZW50KGVjKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgYWNwaV9lY19wbSA9IHsKKwlTRVRfTk9JUlFfU1lTVEVNX1NMRUVQX1BNX09QUyhhY3BpX2VjX3N1c3BlbmRfbm9pcnEsIGFjcGlfZWNfcmVzdW1lX25vaXJxKQorCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKGFjcGlfZWNfc3VzcGVuZCwgYWNwaV9lY19yZXN1bWUpCit9OworCiBzdGF0aWMgaW50IHBhcmFtX3NldF9ldmVudF9jbGVhcmluZyhjb25zdCBjaGFyICp2YWwsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQogewogCWludCByZXN1bHQgPSAwOwpAQCAtMTY2NCw2ICsxOTUzLDcgQEAKIAkJLmFkZCA9IGFjcGlfZWNfYWRkLAogCQkucmVtb3ZlID0gYWNwaV9lY19yZW1vdmUsCiAJCX0sCisJLmRydi5wbSA9ICZhY3BpX2VjX3BtLAogfTsKIAogc3RhdGljIGlubGluZSBpbnQgYWNwaV9lY19xdWVyeV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaW50ZXJuYWwuaCBiL2RyaXZlcnMvYWNwaS9pbnRlcm5hbC5oCmluZGV4IDk0MDIxOGYuLjFiNDFhMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvYWNwaS9pbnRlcm5hbC5oCkBAIC00MCwxMCArNDAsOCBAQAogdm9pZCBhY3BpX2NvbnRhaW5lcl9pbml0KHZvaWQpOwogdm9pZCBhY3BpX21lbW9yeV9ob3RwbHVnX2luaXQodm9pZCk7CiAjaWZkZWYJQ09ORklHX0FDUElfSE9UUExVR19JT0FQSUMKLWludCBhY3BpX2lvYXBpY19hZGQoc3RydWN0IGFjcGlfcGNpX3Jvb3QgKnJvb3QpOwogaW50IGFjcGlfaW9hcGljX3JlbW92ZShzdHJ1Y3QgYWNwaV9wY2lfcm9vdCAqcm9vdCk7CiAjZWxzZQotc3RhdGljIGlubGluZSBpbnQgYWNwaV9pb2FwaWNfYWRkKHN0cnVjdCBhY3BpX3BjaV9yb290ICpyb290KSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIGludCBhY3BpX2lvYXBpY19yZW1vdmUoc3RydWN0IGFjcGlfcGNpX3Jvb3QgKnJvb3QpIHsgcmV0dXJuIDA7IH0KICNlbmRpZgogI2lmZGVmIENPTkZJR19BQ1BJX0RPQ0sKQEAgLTExNiw3ICsxMTQsNiBAQAogYm9vbCBhY3BpX2RldmljZV9pc19iYXR0ZXJ5KHN0cnVjdCBhY3BpX2RldmljZSAqYWRldik7CiBib29sIGFjcGlfZGV2aWNlX2lzX2ZpcnN0X3BoeXNpY2FsX25vZGUoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2LAogCQkJCQljb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYpOwotc3RydWN0IGRldmljZSAqYWNwaV9nZXRfZmlyc3RfcGh5c2ljYWxfbm9kZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgRGV2aWNlIE1hdGNoaW5nIGFuZCBOb3RpZmljYXRpb24KQEAgLTE3NCw2ICsxNzEsOCBAQAogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogCXVuc2lnbmVkIGxvbmcgdGltZXN0YW1wOwogCXVuc2lnbmVkIGxvbmcgbnJfcGVuZGluZ19xdWVyaWVzOworCWJvb2wgc2F2ZWRfYnVzeV9wb2xsaW5nOworCXVuc2lnbmVkIGludCBzYXZlZF9wb2xsaW5nX2d1YXJkOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBhY3BpX2VjICpmaXJzdF9lYzsKQEAgLTE4NSw5ICsxODQsOSBAQAogaW50IGFjcGlfZWNfaW5pdCh2b2lkKTsKIGludCBhY3BpX2VjX2VjZHRfcHJvYmUodm9pZCk7CiBpbnQgYWNwaV9lY19kc2R0X3Byb2JlKHZvaWQpOworaW50IGFjcGlfZWNfZWNkdF9zdGFydCh2b2lkKTsKIHZvaWQgYWNwaV9lY19ibG9ja190cmFuc2FjdGlvbnModm9pZCk7CiB2b2lkIGFjcGlfZWNfdW5ibG9ja190cmFuc2FjdGlvbnModm9pZCk7Ci12b2lkIGFjcGlfZWNfdW5ibG9ja190cmFuc2FjdGlvbnNfZWFybHkodm9pZCk7CiBpbnQgYWNwaV9lY19hZGRfcXVlcnlfaGFuZGxlcihzdHJ1Y3QgYWNwaV9lYyAqZWMsIHU4IHF1ZXJ5X2JpdCwKIAkJCSAgICAgIGFjcGlfaGFuZGxlIGhhbmRsZSwgYWNwaV9lY19xdWVyeV9mdW5jIGZ1bmMsCiAJCQkgICAgICB2b2lkICpkYXRhKTsKQEAgLTIyNSw0ICsyMjQsMTQgQEAKIHZvaWQgYWNwaV9pbml0X3Byb3BlcnRpZXMoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2KTsKIHZvaWQgYWNwaV9mcmVlX3Byb3BlcnRpZXMoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2KTsKIAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCVdhdGNoZG9nCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBDT05GSUdfQUNQSV9XQVRDSERPRwordm9pZCBhY3BpX3dhdGNoZG9nX2luaXQodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGFjcGlfd2F0Y2hkb2dfaW5pdCh2b2lkKSB7fQorI2VuZGlmCisKICNlbmRpZiAvKiBfQUNQSV9JTlRFUk5BTF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2lvYXBpYy5jIGIvZHJpdmVycy9hY3BpL2lvYXBpYy5jCmluZGV4IGNjZGM4ZGIuLjZkN2NlNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9pb2FwaWMuYworKysgYi9kcml2ZXJzL2FjcGkvaW9hcGljLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAlzdHJ1Y3QgcmVzb3VyY2Vfd2luIHdpbjsKIAogCXJlcy0+ZmxhZ3MgPSAwOwotCWlmIChhY3BpX2Rldl9maWx0ZXJfcmVzb3VyY2VfdHlwZShhY3BpX3JlcywgSU9SRVNPVVJDRV9NRU0pID09IDApCisJaWYgKGFjcGlfZGV2X2ZpbHRlcl9yZXNvdXJjZV90eXBlKGFjcGlfcmVzLCBJT1JFU09VUkNFX01FTSkpCiAJCXJldHVybiBBRV9PSzsKIAogCWlmICghYWNwaV9kZXZfcmVzb3VyY2VfbWVtb3J5KGFjcGlfcmVzLCByZXMpKSB7CkBAIC05Nyw3ICs5Nyw3IEBACiAJdW5zaWduZWQgbG9uZyBsb25nIGdzaV9iYXNlOwogCXN0cnVjdCBhY3BpX3BjaV9pb2FwaWMgKmlvYXBpYzsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IE5VTEw7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSBOVUxMLCAqcGNpX3JlcyA9IE5VTEwsICpjcnNfcmVzOwogCWNoYXIgKnR5cGUgPSBOVUxMOwogCiAJaWYgKCFhY3BpX2lzX2lvYXBpYyhoYW5kbGUsICZ0eXBlKSkKQEAgLTEzNywyMyArMTM3LDMwIEBACiAJCXBjaV9zZXRfbWFzdGVyKGRldik7CiAJCWlmIChwY2lfcmVxdWVzdF9yZWdpb24oZGV2LCAwLCB0eXBlKSkKIAkJCWdvdG8gZXhpdF9kaXNhYmxlOwotCQlyZXMgPSAmZGV2LT5yZXNvdXJjZVswXTsKKwkJcGNpX3JlcyA9ICZkZXYtPnJlc291cmNlWzBdOwogCQlpb2FwaWMtPnBkZXYgPSBkZXY7CiAJfSBlbHNlIHsKIAkJcGNpX2Rldl9wdXQoZGV2KTsKIAkJZGV2ID0gTlVMTDsKLQotCQlyZXMgPSAmaW9hcGljLT5yZXM7Ci0JCWFjcGlfd2Fsa19yZXNvdXJjZXMoaGFuZGxlLCBNRVRIT0RfTkFNRV9fQ1JTLCBzZXR1cF9yZXMsIHJlcyk7Ci0JCWlmIChyZXMtPmZsYWdzID09IDApIHsKLQkJCWFjcGlfaGFuZGxlX3dhcm4oaGFuZGxlLCAiZmFpbGVkIHRvIGdldCByZXNvdXJjZVxuIik7Ci0JCQlnb3RvIGV4aXRfZnJlZTsKLQkJfSBlbHNlIGlmIChyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgcmVzKSkgewotCQkJYWNwaV9oYW5kbGVfd2FybihoYW5kbGUsICJmYWlsZWQgdG8gaW5zZXJ0IHJlc291cmNlXG4iKTsKLQkJCWdvdG8gZXhpdF9mcmVlOwotCQl9CiAJfQogCisJY3JzX3JlcyA9ICZpb2FwaWMtPnJlczsKKwlhY3BpX3dhbGtfcmVzb3VyY2VzKGhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywgc2V0dXBfcmVzLCBjcnNfcmVzKTsKKwljcnNfcmVzLT5uYW1lID0gdHlwZTsKKwljcnNfcmVzLT5mbGFncyB8PSBJT1JFU09VUkNFX0JVU1k7CisJaWYgKGNyc19yZXMtPmZsYWdzID09IDApIHsKKwkJYWNwaV9oYW5kbGVfd2FybihoYW5kbGUsICJmYWlsZWQgdG8gZ2V0IHJlc291cmNlXG4iKTsKKwkJZ290byBleGl0X3JlbGVhc2U7CisJfSBlbHNlIGlmIChpbnNlcnRfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCBjcnNfcmVzKSkgeworCQlhY3BpX2hhbmRsZV93YXJuKGhhbmRsZSwgImZhaWxlZCB0byBpbnNlcnQgcmVzb3VyY2VcbiIpOworCQlnb3RvIGV4aXRfcmVsZWFzZTsKKwl9CisKKwkvKiB0cnkgcGNpIHJlc291cmNlIGZpcnN0LCB0aGVuICJfQ1JTIiByZXNvdXJjZSAqLworCXJlcyA9IHBjaV9yZXM7CisJaWYgKCFyZXMgfHwgIXJlcy0+ZmxhZ3MpCisJCXJlcyA9IGNyc19yZXM7CisKIAlpZiAoYWNwaV9yZWdpc3Rlcl9pb2FwaWMoaGFuZGxlLCByZXMtPnN0YXJ0LCAodTMyKWdzaV9iYXNlKSkgewogCQlhY3BpX2hhbmRsZV93YXJuKGhhbmRsZSwgImZhaWxlZCB0byByZWdpc3RlciBJT0FQSUNcbiIpOwogCQlnb3RvIGV4aXRfcmVsZWFzZTsKQEAgLTE3NCwxNCArMTgxLDEzIEBACiBleGl0X3JlbGVhc2U6CiAJaWYgKGRldikKIAkJcGNpX3JlbGVhc2VfcmVnaW9uKGRldiwgMCk7Ci0JZWxzZQotCQlyZWxlYXNlX3Jlc291cmNlKHJlcyk7CisJaWYgKGlvYXBpYy0+cmVzLmZsYWdzICYmIGlvYXBpYy0+cmVzLnBhcmVudCkKKwkJcmVsZWFzZV9yZXNvdXJjZSgmaW9hcGljLT5yZXMpOwogZXhpdF9kaXNhYmxlOgogCWlmIChkZXYpCiAJCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOwogZXhpdF9wdXQ6CiAJcGNpX2Rldl9wdXQoZGV2KTsKLWV4aXRfZnJlZToKIAlrZnJlZShpb2FwaWMpOwogZXhpdDoKIAltdXRleF91bmxvY2soJmlvYXBpY19saXN0X2xvY2spOwpAQCAtMTg5LDEzICsxOTUsMTMgQEAKIAlyZXR1cm4gQUVfT0s7CiB9CiAKLWludCBhY3BpX2lvYXBpY19hZGQoc3RydWN0IGFjcGlfcGNpX3Jvb3QgKnJvb3QpCitpbnQgYWNwaV9pb2FwaWNfYWRkKGFjcGlfaGFuZGxlIHJvb3RfaGFuZGxlKQogewogCWFjcGlfc3RhdHVzIHN0YXR1cywgcmV0dmFsID0gQUVfT0s7CiAKLQlzdGF0dXMgPSBhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIHJvb3QtPmRldmljZS0+aGFuZGxlLAorCXN0YXR1cyA9IGFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgcm9vdF9oYW5kbGUsCiAJCQkJICAgICBVSU5UX01BWCwgaGFuZGxlX2lvYXBpY19hZGQsIE5VTEwsCi0JCQkJICAgICByb290LT5kZXZpY2UtPmhhbmRsZSwgKHZvaWQgKiopJnJldHZhbCk7CisJCQkJICAgICByb290X2hhbmRsZSwgKHZvaWQgKiopJnJldHZhbCk7CiAKIAlyZXR1cm4gQUNQSV9TVUNDRVNTKHN0YXR1cykgJiYgQUNQSV9TVUNDRVNTKHJldHZhbCkgPyAwIDogLUVOT0RFVjsKIH0KQEAgLTIxNyw5ICsyMjMsOSBAQAogCQkJcGNpX3JlbGVhc2VfcmVnaW9uKGlvYXBpYy0+cGRldiwgMCk7CiAJCQlwY2lfZGlzYWJsZV9kZXZpY2UoaW9hcGljLT5wZGV2KTsKIAkJCXBjaV9kZXZfcHV0KGlvYXBpYy0+cGRldik7Ci0JCX0gZWxzZSBpZiAoaW9hcGljLT5yZXMuZmxhZ3MgJiYgaW9hcGljLT5yZXMucGFyZW50KSB7Ci0JCQlyZWxlYXNlX3Jlc291cmNlKCZpb2FwaWMtPnJlcyk7CiAJCX0KKwkJaWYgKGlvYXBpYy0+cmVzLmZsYWdzICYmIGlvYXBpYy0+cmVzLnBhcmVudCkKKwkJCXJlbGVhc2VfcmVzb3VyY2UoJmlvYXBpYy0+cmVzKTsKIAkJbGlzdF9kZWwoJmlvYXBpYy0+bGlzdCk7CiAJCWtmcmVlKGlvYXBpYyk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25maXQvY29yZS5jIGIvZHJpdmVycy9hY3BpL25maXQvY29yZS5jCmluZGV4IDgwY2M3YzAuLmUxZDVlYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uZml0L2NvcmUuYworKysgYi9kcml2ZXJzL2FjcGkvbmZpdC9jb3JlLmMKQEAgLTk0LDU0ICs5NCw1MCBAQAogCXJldHVybiB0b19hY3BpX2RldmljZShhY3BpX2Rlc2MtPmRldik7CiB9CiAKLXN0YXRpYyBpbnQgeGxhdF9zdGF0dXModm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgY21kKQorc3RhdGljIGludCB4bGF0X3N0YXR1cyh2b2lkICpidWYsIHVuc2lnbmVkIGludCBjbWQsIHUzMiBzdGF0dXMpCiB7CiAJc3RydWN0IG5kX2NtZF9jbGVhcl9lcnJvciAqY2xlYXJfZXJyOwogCXN0cnVjdCBuZF9jbWRfYXJzX3N0YXR1cyAqYXJzX3N0YXR1czsKLQlzdHJ1Y3QgbmRfY21kX2Fyc19zdGFydCAqYXJzX3N0YXJ0OwotCXN0cnVjdCBuZF9jbWRfYXJzX2NhcCAqYXJzX2NhcDsKIAl1MTYgZmxhZ3M7CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgTkRfQ01EX0FSU19DQVA6Ci0JCWFyc19jYXAgPSBidWY7Ci0JCWlmICgoYXJzX2NhcC0+c3RhdHVzICYgMHhmZmZmKSA9PSBORklUX0FSU19DQVBfTk9ORSkKKwkJaWYgKChzdGF0dXMgJiAweGZmZmYpID09IE5GSVRfQVJTX0NBUF9OT05FKQogCQkJcmV0dXJuIC1FTk9UVFk7CiAKIAkJLyogQ29tbWFuZCBmYWlsZWQgKi8KLQkJaWYgKGFyc19jYXAtPnN0YXR1cyAmIDB4ZmZmZikKKwkJaWYgKHN0YXR1cyAmIDB4ZmZmZikKIAkJCXJldHVybiAtRUlPOwogCiAJCS8qIE5vIHN1cHBvcnRlZCBzY2FuIHR5cGVzIGZvciB0aGlzIHJhbmdlICovCiAJCWZsYWdzID0gTkRfQVJTX1BFUlNJU1RFTlQgfCBORF9BUlNfVk9MQVRJTEU7Ci0JCWlmICgoYXJzX2NhcC0+c3RhdHVzID4+IDE2ICYgZmxhZ3MpID09IDApCisJCWlmICgoc3RhdHVzID4+IDE2ICYgZmxhZ3MpID09IDApCiAJCQlyZXR1cm4gLUVOT1RUWTsKIAkJYnJlYWs7CiAJY2FzZSBORF9DTURfQVJTX1NUQVJUOgotCQlhcnNfc3RhcnQgPSBidWY7CiAJCS8qIEFSUyBpcyBpbiBwcm9ncmVzcyAqLwotCQlpZiAoKGFyc19zdGFydC0+c3RhdHVzICYgMHhmZmZmKSA9PSBORklUX0FSU19TVEFSVF9CVVNZKQorCQlpZiAoKHN0YXR1cyAmIDB4ZmZmZikgPT0gTkZJVF9BUlNfU1RBUlRfQlVTWSkKIAkJCXJldHVybiAtRUJVU1k7CiAKIAkJLyogQ29tbWFuZCBmYWlsZWQgKi8KLQkJaWYgKGFyc19zdGFydC0+c3RhdHVzICYgMHhmZmZmKQorCQlpZiAoc3RhdHVzICYgMHhmZmZmKQogCQkJcmV0dXJuIC1FSU87CiAJCWJyZWFrOwogCWNhc2UgTkRfQ01EX0FSU19TVEFUVVM6CiAJCWFyc19zdGF0dXMgPSBidWY7CiAJCS8qIENvbW1hbmQgZmFpbGVkICovCi0JCWlmIChhcnNfc3RhdHVzLT5zdGF0dXMgJiAweGZmZmYpCisJCWlmIChzdGF0dXMgJiAweGZmZmYpCiAJCQlyZXR1cm4gLUVJTzsKIAkJLyogQ2hlY2sgZXh0ZW5kZWQgc3RhdHVzIChVcHBlciB0d28gYnl0ZXMpICovCi0JCWlmIChhcnNfc3RhdHVzLT5zdGF0dXMgPT0gTkZJVF9BUlNfU1RBVFVTX0RPTkUpCisJCWlmIChzdGF0dXMgPT0gTkZJVF9BUlNfU1RBVFVTX0RPTkUpCiAJCQlyZXR1cm4gMDsKIAogCQkvKiBBUlMgaXMgaW4gcHJvZ3Jlc3MgKi8KLQkJaWYgKGFyc19zdGF0dXMtPnN0YXR1cyA9PSBORklUX0FSU19TVEFUVVNfQlVTWSkKKwkJaWYgKHN0YXR1cyA9PSBORklUX0FSU19TVEFUVVNfQlVTWSkKIAkJCXJldHVybiAtRUJVU1k7CiAKIAkJLyogTm8gQVJTIHBlcmZvcm1lZCBmb3IgdGhlIGN1cnJlbnQgYm9vdCAqLwotCQlpZiAoYXJzX3N0YXR1cy0+c3RhdHVzID09IE5GSVRfQVJTX1NUQVRVU19OT05FKQorCQlpZiAoc3RhdHVzID09IE5GSVRfQVJTX1NUQVRVU19OT05FKQogCQkJcmV0dXJuIC1FQUdBSU47CiAKIAkJLyoKQEAgLTE0OSwxOSArMTQ1LDE5IEBACiAJCSAqIGFnZW50IHdhbnRzIHRoZSBzY2FuIHRvIHN0b3AuICBJZiB3ZSBkaWRuJ3Qgb3ZlcmZsb3cKIAkJICogdGhlbiBqdXN0IGNvbnRpbnVlIHdpdGggdGhlIHJldHVybmVkIHJlc3VsdHMuCiAJCSAqLwotCQlpZiAoYXJzX3N0YXR1cy0+c3RhdHVzID09IE5GSVRfQVJTX1NUQVRVU19JTlRSKSB7CisJCWlmIChzdGF0dXMgPT0gTkZJVF9BUlNfU1RBVFVTX0lOVFIpIHsKIAkJCWlmIChhcnNfc3RhdHVzLT5mbGFncyAmIE5GSVRfQVJTX0ZfT1ZFUkZMT1cpCiAJCQkJcmV0dXJuIC1FTk9TUEM7CiAJCQlyZXR1cm4gMDsKIAkJfQogCiAJCS8qIFVua25vd24gc3RhdHVzICovCi0JCWlmIChhcnNfc3RhdHVzLT5zdGF0dXMgPj4gMTYpCisJCWlmIChzdGF0dXMgPj4gMTYpCiAJCQlyZXR1cm4gLUVJTzsKIAkJYnJlYWs7CiAJY2FzZSBORF9DTURfQ0xFQVJfRVJST1I6CiAJCWNsZWFyX2VyciA9IGJ1ZjsKLQkJaWYgKGNsZWFyX2Vyci0+c3RhdHVzICYgMHhmZmZmKQorCQlpZiAoc3RhdHVzICYgMHhmZmZmKQogCQkJcmV0dXJuIC1FSU87CiAJCWlmICghY2xlYXJfZXJyLT5jbGVhcmVkKQogCQkJcmV0dXJuIC1FSU87CkBAIC0xNzIsNiArMTY4LDkgQEAKIAkJYnJlYWs7CiAJfQogCisJLyogYWxsIG90aGVyIG5vbi16ZXJvIHN0YXR1cyByZXN1bHRzIGluIGFuIGVycm9yICovCisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIC1FSU87CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE4NiwxMCArMTg1LDEwIEBACiAJc3RydWN0IG5kX2NtZF9wa2cgKmNhbGxfcGtnID0gTlVMTDsKIAljb25zdCBjaGFyICpjbWRfbmFtZSwgKmRpbW1fbmFtZTsKIAl1bnNpZ25lZCBsb25nIGNtZF9tYXNrLCBkc21fbWFzazsKKwl1MzIgb2Zmc2V0LCBmd19zdGF0dXMgPSAwOwogCWFjcGlfaGFuZGxlIGhhbmRsZTsKIAl1bnNpZ25lZCBpbnQgZnVuYzsKIAljb25zdCB1OCAqdXVpZDsKLQl1MzIgb2Zmc2V0OwogCWludCByYywgaTsKIAogCWZ1bmMgPSBjbWQ7CkBAIC0zMTcsNiArMzE2LDE1IEBACiAJCQkJb3V0X29iai0+YnVmZmVyLnBvaW50ZXIgKyBvZmZzZXQsIG91dF9zaXplKTsKIAkJb2Zmc2V0ICs9IG91dF9zaXplOwogCX0KKworCS8qCisJICogU2V0IGZ3X3N0YXR1cyBmb3IgYWxsIHRoZSBjb21tYW5kcyB3aXRoIGEga25vd24gZm9ybWF0IHRvIGJlCisJICogbGF0ZXIgaW50ZXJwcmV0ZWQgYnkgeGxhdF9zdGF0dXMoKS4KKwkgKi8KKwlpZiAoaSA+PSAxICYmICgoY21kID49IE5EX0NNRF9BUlNfQ0FQICYmIGNtZCA8PSBORF9DTURfQ0xFQVJfRVJST1IpCisJCQl8fCAoY21kID49IE5EX0NNRF9TTUFSVCAmJiBjbWQgPD0gTkRfQ01EX1ZFTkRPUikpKQorCQlmd19zdGF0dXMgPSAqKHUzMiAqKSBvdXRfb2JqLT5idWZmZXIucG9pbnRlcjsKKwogCWlmIChvZmZzZXQgKyBpbl9idWYuYnVmZmVyLmxlbmd0aCA8IGJ1Zl9sZW4pIHsKIAkJaWYgKGkgPj0gMSkgewogCQkJLyoKQEAgLTMyNSw3ICszMzMsNyBAQAogCQkJICovCiAJCQlyYyA9IGJ1Zl9sZW4gLSBvZmZzZXQgLSBpbl9idWYuYnVmZmVyLmxlbmd0aDsKIAkJCWlmIChjbWRfcmMpCi0JCQkJKmNtZF9yYyA9IHhsYXRfc3RhdHVzKGJ1ZiwgY21kKTsKKwkJCQkqY21kX3JjID0geGxhdF9zdGF0dXMoYnVmLCBjbWQsIGZ3X3N0YXR1cyk7CiAJCX0gZWxzZSB7CiAJCQlkZXZfZXJyKGRldiwgIiVzOiVzIHVuZGVycnVuIGNtZDogJXMgYnVmX2xlbjogJWQgb3V0X2xlbjogJWRcbiIsCiAJCQkJCV9fZnVuY19fLCBkaW1tX25hbWUsIGNtZF9uYW1lLCBidWZfbGVuLApAQCAtMzM1LDcgKzM0Myw3IEBACiAJfSBlbHNlIHsKIAkJcmMgPSAwOwogCQlpZiAoY21kX3JjKQotCQkJKmNtZF9yYyA9IHhsYXRfc3RhdHVzKGJ1ZiwgY21kKTsKKwkJCSpjbWRfcmMgPSB4bGF0X3N0YXR1cyhidWYsIGNtZCwgZndfc3RhdHVzKTsKIAl9CiAKICBvdXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmZpdC9tY2UuYyBiL2RyaXZlcnMvYWNwaS9uZml0L21jZS5jCmluZGV4IDRjNzQ1YmYuLjE2MWY5MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uZml0L21jZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9uZml0L21jZS5jCkBAIC00Miw3ICs0Miw3IEBACiAJCWxpc3RfZm9yX2VhY2hfZW50cnkobmZpdF9zcGEsICZhY3BpX2Rlc2MtPnNwYXMsIGxpc3QpIHsKIAkJCXN0cnVjdCBhY3BpX25maXRfc3lzdGVtX2FkZHJlc3MgKnNwYSA9IG5maXRfc3BhLT5zcGE7CiAKLQkJCWlmIChuZml0X3NwYV90eXBlKHNwYSkgPT0gTkZJVF9TUEFfUE0pCisJCQlpZiAobmZpdF9zcGFfdHlwZShzcGEpICE9IE5GSVRfU1BBX1BNKQogCQkJCWNvbnRpbnVlOwogCQkJLyogZmluZCB0aGUgc3BhIHRoYXQgY292ZXJzIHRoZSBtY2UgYWRkciAqLwogCQkJaWYgKHNwYS0+YWRkcmVzcyA+IG1jZS0+YWRkcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wY2lfaXJxLmMgYi9kcml2ZXJzL2FjcGkvcGNpX2lycS5jCmluZGV4IDJjNDVkZDMuLmM1NzZhNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wY2lfaXJxLmMKKysrIGIvZHJpdmVycy9hY3BpL3BjaV9pcnEuYwpAQCAtNDExLDcgKzQxMSwxNSBAQAogCWludCBnc2k7CiAJdTggcGluOwogCWludCB0cmlnZ2VyaW5nID0gQUNQSV9MRVZFTF9TRU5TSVRJVkU7Ci0JaW50IHBvbGFyaXR5ID0gQUNQSV9BQ1RJVkVfTE9XOworCS8qCisJICogT24gQVJNIHN5c3RlbXMgd2l0aCB0aGUgR0lDIGludGVycnVwdCBtb2RlbCwgbGV2ZWwgaW50ZXJydXB0cworCSAqIGFyZSBhbHdheXMgcG9sYXJpdHkgaGlnaCBieSBzcGVjaWZpY2F0aW9uOyBQQ0kgbGVnYWN5CisJICogSVJRcyBsaW5lcyBhcmUgaW52ZXJ0ZWQgYmVmb3JlIHJlYWNoaW5nIHRoZSBpbnRlcnJ1cHQKKwkgKiBjb250cm9sbGVyIGFuZCBtdXN0IHRoZXJlZm9yZSBiZSBjb25zaWRlcmVkIGFjdGl2ZSBoaWdoCisJICogYXMgZGVmYXVsdC4KKwkgKi8KKwlpbnQgcG9sYXJpdHkgPSBhY3BpX2lycV9tb2RlbCA9PSBBQ1BJX0lSUV9NT0RFTF9HSUMgPworCQkJCSAgICAgIEFDUElfQUNUSVZFX0hJR0ggOiBBQ1BJX0FDVElWRV9MT1c7CiAJY2hhciAqbGluayA9IE5VTEw7CiAJY2hhciBsaW5rX2Rlc2NbMTZdOwogCWludCByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wY2lfcm9vdC5jIGIvZHJpdmVycy9hY3BpL3BjaV9yb290LmMKaW5kZXggZDE0NDE2OC4uYmY2MDFkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BjaV9yb290LmMKKysrIGIvZHJpdmVycy9hY3BpL3BjaV9yb290LmMKQEAgLTYxNCw3ICs2MTQsMTcgQEAKIAlpZiAoaG90YWRkKSB7CiAJCXBjaWJpb3NfcmVzb3VyY2Vfc3VydmV5X2J1cyhyb290LT5idXMpOwogCQlwY2lfYXNzaWduX3VuYXNzaWduZWRfcm9vdF9idXNfcmVzb3VyY2VzKHJvb3QtPmJ1cyk7Ci0JCWFjcGlfaW9hcGljX2FkZChyb290KTsKKwkJLyoKKwkJICogVGhpcyBpcyBvbmx5IGNhbGxlZCBmb3IgdGhlIGhvdGFkZCBjYXNlLiBGb3IgdGhlIGJvb3QtdGltZQorCQkgKiBjYXNlLCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgYWZ0ZXIgUENJIGluaXRpYWxpemF0aW9uIGluCisJCSAqIG9yZGVyIHRvIGRlYWwgd2l0aCBJT0FQSUNzIG1hcHBlZCBpbiBvbiBhIFBDSSBCQVIuCisJCSAqCisJCSAqIFRoaXMgaXMgY3VycmVudGx5IHg4Ni1zcGVjaWZpYywgYmVjYXVzZSBhY3BpX2lvYXBpY19hZGQoKQorCQkgKiBpcyBhbiBlbXB0eSBmdW5jdGlvbiB3aXRob3V0IENPTkZJR19BQ1BJX0hPVFBMVUdfSU9BUElDLgorCQkgKiBBbmQgQ09ORklHX0FDUElfSE9UUExVR19JT0FQSUMgZGVwZW5kcyBvbiBDT05GSUdfWDg2X0lPX0FQSUMKKwkJICogKHNlZSBkcml2ZXJzL2FjcGkvS2NvbmZpZykuCisJCSAqLworCQlhY3BpX2lvYXBpY19hZGQocm9vdC0+ZGV2aWNlLT5oYW5kbGUpOwogCX0KIAogCXBjaV9sb2NrX3Jlc2Nhbl9yZW1vdmUoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfY29yZS5jIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9jb3JlLmMKaW5kZXggOTEyNWQ3ZC4uNWM3OGVlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9jb3JlLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9jb3JlLmMKQEAgLTMyLDEyICszMiwxMiBAQAogfQogCiBzdGF0aWMgaW50IG1hcF9sYXBpY19pZChzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKmVudHJ5LAotCQkgdTMyIGFjcGlfaWQsIHBoeXNfY3B1aWRfdCAqYXBpY19pZCkKKwkJIHUzMiBhY3BpX2lkLCBwaHlzX2NwdWlkX3QgKmFwaWNfaWQsIGJvb2wgaWdub3JlX2Rpc2FibGVkKQogewogCXN0cnVjdCBhY3BpX21hZHRfbG9jYWxfYXBpYyAqbGFwaWMgPQogCQljb250YWluZXJfb2YoZW50cnksIHN0cnVjdCBhY3BpX21hZHRfbG9jYWxfYXBpYywgaGVhZGVyKTsKIAotCWlmICghKGxhcGljLT5sYXBpY19mbGFncyAmIEFDUElfTUFEVF9FTkFCTEVEKSkKKwlpZiAoaWdub3JlX2Rpc2FibGVkICYmICEobGFwaWMtPmxhcGljX2ZsYWdzICYgQUNQSV9NQURUX0VOQUJMRUQpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmIChsYXBpYy0+cHJvY2Vzc29yX2lkICE9IGFjcGlfaWQpCkBAIC00OCwxMiArNDgsMTMgQEAKIH0KIAogc3RhdGljIGludCBtYXBfeDJhcGljX2lkKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqZW50cnksCi0JCWludCBkZXZpY2VfZGVjbGFyYXRpb24sIHUzMiBhY3BpX2lkLCBwaHlzX2NwdWlkX3QgKmFwaWNfaWQpCisJCWludCBkZXZpY2VfZGVjbGFyYXRpb24sIHUzMiBhY3BpX2lkLCBwaHlzX2NwdWlkX3QgKmFwaWNfaWQsCisJCWJvb2wgaWdub3JlX2Rpc2FibGVkKQogewogCXN0cnVjdCBhY3BpX21hZHRfbG9jYWxfeDJhcGljICphcGljID0KIAkJY29udGFpbmVyX29mKGVudHJ5LCBzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX3gyYXBpYywgaGVhZGVyKTsKIAotCWlmICghKGFwaWMtPmxhcGljX2ZsYWdzICYgQUNQSV9NQURUX0VOQUJMRUQpKQorCWlmIChpZ25vcmVfZGlzYWJsZWQgJiYgIShhcGljLT5sYXBpY19mbGFncyAmIEFDUElfTUFEVF9FTkFCTEVEKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoZGV2aWNlX2RlY2xhcmF0aW9uICYmIChhcGljLT51aWQgPT0gYWNwaV9pZCkpIHsKQEAgLTY1LDEyICs2NiwxMyBAQAogfQogCiBzdGF0aWMgaW50IG1hcF9sc2FwaWNfaWQoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICplbnRyeSwKLQkJaW50IGRldmljZV9kZWNsYXJhdGlvbiwgdTMyIGFjcGlfaWQsIHBoeXNfY3B1aWRfdCAqYXBpY19pZCkKKwkJaW50IGRldmljZV9kZWNsYXJhdGlvbiwgdTMyIGFjcGlfaWQsIHBoeXNfY3B1aWRfdCAqYXBpY19pZCwKKwkJYm9vbCBpZ25vcmVfZGlzYWJsZWQpCiB7CiAJc3RydWN0IGFjcGlfbWFkdF9sb2NhbF9zYXBpYyAqbHNhcGljID0KIAkJY29udGFpbmVyX29mKGVudHJ5LCBzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX3NhcGljLCBoZWFkZXIpOwogCi0JaWYgKCEobHNhcGljLT5sYXBpY19mbGFncyAmIEFDUElfTUFEVF9FTkFCTEVEKSkKKwlpZiAoaWdub3JlX2Rpc2FibGVkICYmICEobHNhcGljLT5sYXBpY19mbGFncyAmIEFDUElfTUFEVF9FTkFCTEVEKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoZGV2aWNlX2RlY2xhcmF0aW9uKSB7CkBAIC04NywxMiArODksMTMgQEAKICAqIFJldHJpZXZlIHRoZSBBUk0gQ1BVIHBoeXNpY2FsIGlkZW50aWZpZXIgKE1QSURSKQogICovCiBzdGF0aWMgaW50IG1hcF9naWNjX21waWRyKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqZW50cnksCi0JCWludCBkZXZpY2VfZGVjbGFyYXRpb24sIHUzMiBhY3BpX2lkLCBwaHlzX2NwdWlkX3QgKm1waWRyKQorCQlpbnQgZGV2aWNlX2RlY2xhcmF0aW9uLCB1MzIgYWNwaV9pZCwgcGh5c19jcHVpZF90ICptcGlkciwKKwkJYm9vbCBpZ25vcmVfZGlzYWJsZWQpCiB7CiAJc3RydWN0IGFjcGlfbWFkdF9nZW5lcmljX2ludGVycnVwdCAqZ2ljYyA9CiAJICAgIGNvbnRhaW5lcl9vZihlbnRyeSwgc3RydWN0IGFjcGlfbWFkdF9nZW5lcmljX2ludGVycnVwdCwgaGVhZGVyKTsKIAotCWlmICghKGdpY2MtPmZsYWdzICYgQUNQSV9NQURUX0VOQUJMRUQpKQorCWlmIChpZ25vcmVfZGlzYWJsZWQgJiYgIShnaWNjLT5mbGFncyAmIEFDUElfTUFEVF9FTkFCTEVEKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKiBkZXZpY2VfZGVjbGFyYXRpb24gbWVhbnMgRGV2aWNlIG9iamVjdCBpbiBEU0RULCBpbiB0aGUKQEAgLTEwOSw3ICsxMTIsNyBAQAogfQogCiBzdGF0aWMgcGh5c19jcHVpZF90IG1hcF9tYWR0X2VudHJ5KHN0cnVjdCBhY3BpX3RhYmxlX21hZHQgKm1hZHQsCi0JCQkJICAgaW50IHR5cGUsIHUzMiBhY3BpX2lkKQorCQkJCSAgIGludCB0eXBlLCB1MzIgYWNwaV9pZCwgYm9vbCBpZ25vcmVfZGlzYWJsZWQpCiB7CiAJdW5zaWduZWQgbG9uZyBtYWR0X2VuZCwgZW50cnk7CiAJcGh5c19jcHVpZF90IHBoeXNfaWQgPSBQSFlTX0NQVUlEX0lOVkFMSUQ7CS8qIENQVSBoYXJkd2FyZSBJRCAqLwpAQCAtMTI3LDE2ICsxMzAsMjAgQEAKIAkJc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICpoZWFkZXIgPQogCQkJKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqKWVudHJ5OwogCQlpZiAoaGVhZGVyLT50eXBlID09IEFDUElfTUFEVF9UWVBFX0xPQ0FMX0FQSUMpIHsKLQkJCWlmICghbWFwX2xhcGljX2lkKGhlYWRlciwgYWNwaV9pZCwgJnBoeXNfaWQpKQorCQkJaWYgKCFtYXBfbGFwaWNfaWQoaGVhZGVyLCBhY3BpX2lkLCAmcGh5c19pZCwKKwkJCQkJICBpZ25vcmVfZGlzYWJsZWQpKQogCQkJCWJyZWFrOwogCQl9IGVsc2UgaWYgKGhlYWRlci0+dHlwZSA9PSBBQ1BJX01BRFRfVFlQRV9MT0NBTF9YMkFQSUMpIHsKLQkJCWlmICghbWFwX3gyYXBpY19pZChoZWFkZXIsIHR5cGUsIGFjcGlfaWQsICZwaHlzX2lkKSkKKwkJCWlmICghbWFwX3gyYXBpY19pZChoZWFkZXIsIHR5cGUsIGFjcGlfaWQsICZwaHlzX2lkLAorCQkJCQkgICBpZ25vcmVfZGlzYWJsZWQpKQogCQkJCWJyZWFrOwogCQl9IGVsc2UgaWYgKGhlYWRlci0+dHlwZSA9PSBBQ1BJX01BRFRfVFlQRV9MT0NBTF9TQVBJQykgewotCQkJaWYgKCFtYXBfbHNhcGljX2lkKGhlYWRlciwgdHlwZSwgYWNwaV9pZCwgJnBoeXNfaWQpKQorCQkJaWYgKCFtYXBfbHNhcGljX2lkKGhlYWRlciwgdHlwZSwgYWNwaV9pZCwgJnBoeXNfaWQsCisJCQkJCSAgIGlnbm9yZV9kaXNhYmxlZCkpCiAJCQkJYnJlYWs7CiAJCX0gZWxzZSBpZiAoaGVhZGVyLT50eXBlID09IEFDUElfTUFEVF9UWVBFX0dFTkVSSUNfSU5URVJSVVBUKSB7Ci0JCQlpZiAoIW1hcF9naWNjX21waWRyKGhlYWRlciwgdHlwZSwgYWNwaV9pZCwgJnBoeXNfaWQpKQorCQkJaWYgKCFtYXBfZ2ljY19tcGlkcihoZWFkZXIsIHR5cGUsIGFjcGlfaWQsICZwaHlzX2lkLAorCQkJCQkgICAgaWdub3JlX2Rpc2FibGVkKSkKIAkJCQlicmVhazsKIAkJfQogCQllbnRyeSArPSBoZWFkZXItPmxlbmd0aDsKQEAgLTE1NiwxNCArMTYzLDE1IEBACiAJaWYgKCFtYWR0KQogCQlyZXR1cm4gUEhZU19DUFVJRF9JTlZBTElEOwogCi0JcnYgPSBtYXBfbWFkdF9lbnRyeShtYWR0LCAxLCBhY3BpX2lkKTsKKwlydiA9IG1hcF9tYWR0X2VudHJ5KG1hZHQsIDEsIGFjcGlfaWQsIHRydWUpOwogCiAJZWFybHlfYWNwaV9vc191bm1hcF9tZW1vcnkobWFkdCwgdGJsX3NpemUpOwogCiAJcmV0dXJuIHJ2OwogfQogCi1zdGF0aWMgcGh5c19jcHVpZF90IG1hcF9tYXRfZW50cnkoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgdHlwZSwgdTMyIGFjcGlfaWQpCitzdGF0aWMgcGh5c19jcHVpZF90IG1hcF9tYXRfZW50cnkoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgdHlwZSwgdTMyIGFjcGlfaWQsCisJCQkJICBib29sIGlnbm9yZV9kaXNhYmxlZCkKIHsKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OwogCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7CkBAIC0xODQsMzAgKzE5MiwzOCBAQAogCiAJaGVhZGVyID0gKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqKW9iai0+YnVmZmVyLnBvaW50ZXI7CiAJaWYgKGhlYWRlci0+dHlwZSA9PSBBQ1BJX01BRFRfVFlQRV9MT0NBTF9BUElDKQotCQltYXBfbGFwaWNfaWQoaGVhZGVyLCBhY3BpX2lkLCAmcGh5c19pZCk7CisJCW1hcF9sYXBpY19pZChoZWFkZXIsIGFjcGlfaWQsICZwaHlzX2lkLCBpZ25vcmVfZGlzYWJsZWQpOwogCWVsc2UgaWYgKGhlYWRlci0+dHlwZSA9PSBBQ1BJX01BRFRfVFlQRV9MT0NBTF9TQVBJQykKLQkJbWFwX2xzYXBpY19pZChoZWFkZXIsIHR5cGUsIGFjcGlfaWQsICZwaHlzX2lkKTsKKwkJbWFwX2xzYXBpY19pZChoZWFkZXIsIHR5cGUsIGFjcGlfaWQsICZwaHlzX2lkLCBpZ25vcmVfZGlzYWJsZWQpOwogCWVsc2UgaWYgKGhlYWRlci0+dHlwZSA9PSBBQ1BJX01BRFRfVFlQRV9MT0NBTF9YMkFQSUMpCi0JCW1hcF94MmFwaWNfaWQoaGVhZGVyLCB0eXBlLCBhY3BpX2lkLCAmcGh5c19pZCk7CisJCW1hcF94MmFwaWNfaWQoaGVhZGVyLCB0eXBlLCBhY3BpX2lkLCAmcGh5c19pZCwgaWdub3JlX2Rpc2FibGVkKTsKIAllbHNlIGlmIChoZWFkZXItPnR5cGUgPT0gQUNQSV9NQURUX1RZUEVfR0VORVJJQ19JTlRFUlJVUFQpCi0JCW1hcF9naWNjX21waWRyKGhlYWRlciwgdHlwZSwgYWNwaV9pZCwgJnBoeXNfaWQpOworCQltYXBfZ2ljY19tcGlkcihoZWFkZXIsIHR5cGUsIGFjcGlfaWQsICZwaHlzX2lkLAorCQkJICAgICAgIGlnbm9yZV9kaXNhYmxlZCk7CiAKIGV4aXQ6CiAJa2ZyZWUoYnVmZmVyLnBvaW50ZXIpOwogCXJldHVybiBwaHlzX2lkOwogfQogCi1waHlzX2NwdWlkX3QgYWNwaV9nZXRfcGh5c19pZChhY3BpX2hhbmRsZSBoYW5kbGUsIGludCB0eXBlLCB1MzIgYWNwaV9pZCkKK3N0YXRpYyBwaHlzX2NwdWlkX3QgX19hY3BpX2dldF9waHlzX2lkKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IHR5cGUsCisJCQkJICAgICAgIHUzMiBhY3BpX2lkLCBib29sIGlnbm9yZV9kaXNhYmxlZCkKIHsKIAlwaHlzX2NwdWlkX3QgcGh5c19pZDsKIAotCXBoeXNfaWQgPSBtYXBfbWF0X2VudHJ5KGhhbmRsZSwgdHlwZSwgYWNwaV9pZCk7CisJcGh5c19pZCA9IG1hcF9tYXRfZW50cnkoaGFuZGxlLCB0eXBlLCBhY3BpX2lkLCBpZ25vcmVfZGlzYWJsZWQpOwogCWlmIChpbnZhbGlkX3BoeXNfY3B1aWQocGh5c19pZCkpCi0JCXBoeXNfaWQgPSBtYXBfbWFkdF9lbnRyeShnZXRfbWFkdF90YWJsZSgpLCB0eXBlLCBhY3BpX2lkKTsKKwkJcGh5c19pZCA9IG1hcF9tYWR0X2VudHJ5KGdldF9tYWR0X3RhYmxlKCksIHR5cGUsIGFjcGlfaWQsCisJCQkJCSAgIGlnbm9yZV9kaXNhYmxlZCk7CiAKIAlyZXR1cm4gcGh5c19pZDsKIH0KIAorcGh5c19jcHVpZF90IGFjcGlfZ2V0X3BoeXNfaWQoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgdHlwZSwgdTMyIGFjcGlfaWQpCit7CisJcmV0dXJuIF9fYWNwaV9nZXRfcGh5c19pZChoYW5kbGUsIHR5cGUsIGFjcGlfaWQsIHRydWUpOworfQorCiBpbnQgYWNwaV9tYXBfY3B1aWQocGh5c19jcHVpZF90IHBoeXNfaWQsIHUzMiBhY3BpX2lkKQogewogI2lmZGVmIENPTkZJR19TTVAKQEAgLTI2NCw2ICsyODAsNzkgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGFjcGlfZ2V0X2NwdWlkKTsKIAorI2lmZGVmIENPTkZJR19BQ1BJX0hPVFBMVUdfQ1BVCitzdGF0aWMgYm9vbCBfX2luaXQKK21hcF9wcm9jZXNzb3IoYWNwaV9oYW5kbGUgaGFuZGxlLCBwaHlzX2NwdWlkX3QgKnBoeXNfaWQsIGludCAqY3B1aWQpCit7CisJaW50IHR5cGUsIGlkOworCXUzMiBhY3BpX2lkOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX29iamVjdF90eXBlIGFjcGlfdHlwZTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdG1wOworCXVuaW9uIGFjcGlfb2JqZWN0IG9iamVjdCA9IHsgMCB9OworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IHNpemVvZih1bmlvbiBhY3BpX29iamVjdCksICZvYmplY3QgfTsKKworCXN0YXR1cyA9IGFjcGlfZ2V0X3R5cGUoaGFuZGxlLCAmYWNwaV90eXBlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXJldHVybiBmYWxzZTsKKworCXN3aXRjaCAoYWNwaV90eXBlKSB7CisJY2FzZSBBQ1BJX1RZUEVfUFJPQ0VTU09SOgorCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsIE5VTEwsIE5VTEwsICZidWZmZXIpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCQlyZXR1cm4gZmFsc2U7CisJCWFjcGlfaWQgPSBvYmplY3QucHJvY2Vzc29yLnByb2NfaWQ7CisKKwkJLyogdmFsaWRhdGUgdGhlIGFjcGlfaWQgKi8KKwkJaWYoYWNwaV9wcm9jZXNzb3JfdmFsaWRhdGVfcHJvY19pZChhY3BpX2lkKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSBBQ1BJX1RZUEVfREVWSUNFOgorCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiX1VJRCIsIE5VTEwsICZ0bXApOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCQlyZXR1cm4gZmFsc2U7CisJCWFjcGlfaWQgPSB0bXA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwl0eXBlID0gKGFjcGlfdHlwZSA9PSBBQ1BJX1RZUEVfREVWSUNFKSA/IDEgOiAwOworCisJKnBoeXNfaWQgPSBfX2FjcGlfZ2V0X3BoeXNfaWQoaGFuZGxlLCB0eXBlLCBhY3BpX2lkLCBmYWxzZSk7CisJaWQgPSBhY3BpX21hcF9jcHVpZCgqcGh5c19pZCwgYWNwaV9pZCk7CisKKwlpZiAoaWQgPCAwKQorCQlyZXR1cm4gZmFsc2U7CisJKmNwdWlkID0gaWQ7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBhY3BpX3N0YXR1cyBfX2luaXQKK3NldF9wcm9jZXNzb3Jfbm9kZV9tYXBwaW5nKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGx2bCwgdm9pZCAqY29udGV4dCwKKwkJCSAgIHZvaWQgKipydikKK3sKKwlwaHlzX2NwdWlkX3QgcGh5c19pZDsKKwlpbnQgY3B1X2lkOworCisJaWYgKCFtYXBfcHJvY2Vzc29yKGhhbmRsZSwgJnBoeXNfaWQsICZjcHVfaWQpKQorCQlyZXR1cm4gQUVfRVJST1I7CisKKwlhY3BpX21hcF9jcHUybm9kZShoYW5kbGUsIGNwdV9pZCwgcGh5c19pZCk7CisJcmV0dXJuIEFFX09LOworfQorCit2b2lkIF9faW5pdCBhY3BpX3NldF9wcm9jZXNzb3JfbWFwcGluZyh2b2lkKQoreworCS8qIFNldCBwZXJzaXN0ZW50IGNwdSA8LT4gbm9kZSBtYXBwaW5nIGZvciBhbGwgcHJvY2Vzc29ycy4gKi8KKwlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9QUk9DRVNTT1IsIEFDUElfUk9PVF9PQkpFQ1QsCisJCQkgICAgQUNQSV9VSU5UMzJfTUFYLCBzZXRfcHJvY2Vzc29yX25vZGVfbWFwcGluZywKKwkJCSAgICBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKyNlbHNlCit2b2lkIF9faW5pdCBhY3BpX3NldF9wcm9jZXNzb3JfbWFwcGluZyh2b2lkKSB7fQorI2VuZGlmIC8qIENPTkZJR19BQ1BJX0hPVFBMVUdfQ1BVICovCisKICNpZmRlZiBDT05GSUdfQUNQSV9IT1RQTFVHX0lPQVBJQwogc3RhdGljIGludCBnZXRfaW9hcGljX2lkKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqZW50cnksIHUzMiBnc2lfYmFzZSwKIAkJCSB1NjQgKnBoeXNfYWRkciwgaW50ICppb2FwaWNfaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2RyaXZlci5jIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9kcml2ZXIuYwppbmRleCAwNTUzYWVlLi45ZDVmMGM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfZHJpdmVyLmMKQEAgLTExMCw1NSArMTEwLDQ2IEBACiAKIHN0YXRpYyBpbnQgX19hY3BpX3Byb2Nlc3Nvcl9zdGFydChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiAKLXN0YXRpYyBpbnQgYWNwaV9jcHVfc29mdF9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCi0JCQkJCSAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCitzdGF0aWMgaW50IGFjcGlfc29mdF9jcHVfb25saW5lKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0JdW5zaWduZWQgaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7CiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciA9IHBlcl9jcHUocHJvY2Vzc29ycywgY3B1KTsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZTsKLQlhY3Rpb24gJj0gfkNQVV9UQVNLU19GUk9aRU47Ci0KLQlzd2l0Y2ggKGFjdGlvbikgewotCWNhc2UgQ1BVX09OTElORToKLQljYXNlIENQVV9ERUFEOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0JfQogCiAJaWYgKCFwciB8fCBhY3BpX2J1c19nZXRfZGV2aWNlKHByLT5oYW5kbGUsICZkZXZpY2UpKQotCQlyZXR1cm4gTk9USUZZX0RPTkU7CisJCXJldHVybiAwOworCS8qCisJICogQ1BVIGdvdCBwaHlzaWNhbGx5IGhvdHBsdWdnZWQgYW5kIG9ubGluZWQgZm9yIHRoZSBmaXJzdCB0aW1lOgorCSAqIEluaXRpYWxpemUgbWlzc2luZyB0aGluZ3MuCisJICovCisJaWYgKHByLT5mbGFncy5uZWVkX2hvdHBsdWdfaW5pdCkgeworCQlpbnQgcmV0OwogCi0JaWYgKGFjdGlvbiA9PSBDUFVfT05MSU5FKSB7Ci0JCS8qCi0JCSAqIENQVSBnb3QgcGh5c2ljYWxseSBob3RwbHVnZ2VkIGFuZCBvbmxpbmVkIGZvciB0aGUgZmlyc3QgdGltZToKLQkJICogSW5pdGlhbGl6ZSBtaXNzaW5nIHRoaW5ncy4KLQkJICovCi0JCWlmIChwci0+ZmxhZ3MubmVlZF9ob3RwbHVnX2luaXQpIHsKLQkJCWludCByZXQ7Ci0KLQkJCXByX2luZm8oIldpbGwgb25saW5lIGFuZCBpbml0IGhvdHBsdWdnZWQgQ1BVOiAlZFxuIiwKLQkJCQlwci0+aWQpOwotCQkJcHItPmZsYWdzLm5lZWRfaG90cGx1Z19pbml0ID0gMDsKLQkJCXJldCA9IF9fYWNwaV9wcm9jZXNzb3Jfc3RhcnQoZGV2aWNlKTsKLQkJCVdBUk4ocmV0LCAiRmFpbGVkIHRvIHN0YXJ0IENQVTogJWRcbiIsIHByLT5pZCk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBOb3JtYWwgQ1BVIHNvZnQgb25saW5lIGV2ZW50LiAqLwotCQkJYWNwaV9wcm9jZXNzb3JfcHBjX2hhc19jaGFuZ2VkKHByLCAwKTsKLQkJCWFjcGlfcHJvY2Vzc29yX2hvdHBsdWcocHIpOwotCQkJYWNwaV9wcm9jZXNzb3JfcmVldmFsdWF0ZV90c3RhdGUocHIsIGFjdGlvbik7Ci0JCQlhY3BpX3Byb2Nlc3Nvcl90c3RhdGVfaGFzX2NoYW5nZWQocHIpOwotCQl9Ci0JfSBlbHNlIGlmIChhY3Rpb24gPT0gQ1BVX0RFQUQpIHsKLQkJLyogSW52YWxpZGF0ZSBmbGFnLnRocm90dGxpbmcgYWZ0ZXIgdGhlIENQVSBpcyBvZmZsaW5lLiAqLwotCQlhY3BpX3Byb2Nlc3Nvcl9yZWV2YWx1YXRlX3RzdGF0ZShwciwgYWN0aW9uKTsKKwkJcHJfaW5mbygiV2lsbCBvbmxpbmUgYW5kIGluaXQgaG90cGx1Z2dlZCBDUFU6ICVkXG4iLAorCQkJcHItPmlkKTsKKwkJcHItPmZsYWdzLm5lZWRfaG90cGx1Z19pbml0ID0gMDsKKwkJcmV0ID0gX19hY3BpX3Byb2Nlc3Nvcl9zdGFydChkZXZpY2UpOworCQlXQVJOKHJldCwgIkZhaWxlZCB0byBzdGFydCBDUFU6ICVkXG4iLCBwci0+aWQpOworCX0gZWxzZSB7CisJCS8qIE5vcm1hbCBDUFUgc29mdCBvbmxpbmUgZXZlbnQuICovCisJCWFjcGlfcHJvY2Vzc29yX3BwY19oYXNfY2hhbmdlZChwciwgMCk7CisJCWFjcGlfcHJvY2Vzc29yX2hvdHBsdWcocHIpOworCQlhY3BpX3Byb2Nlc3Nvcl9yZWV2YWx1YXRlX3RzdGF0ZShwciwgZmFsc2UpOworCQlhY3BpX3Byb2Nlc3Nvcl90c3RhdGVfaGFzX2NoYW5nZWQocHIpOwogCX0KLQlyZXR1cm4gTk9USUZZX09LOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGFjcGlfY3B1X25vdGlmaWVyID0gewotCSAgICAubm90aWZpZXJfY2FsbCA9IGFjcGlfY3B1X3NvZnRfbm90aWZ5LAotfTsKK3N0YXRpYyBpbnQgYWNwaV9zb2Z0X2NwdV9kZWFkKHVuc2lnbmVkIGludCBjcHUpCit7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciA9IHBlcl9jcHUocHJvY2Vzc29ycywgY3B1KTsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZTsKKworCWlmICghcHIgfHwgYWNwaV9idXNfZ2V0X2RldmljZShwci0+aGFuZGxlLCAmZGV2aWNlKSkKKwkJcmV0dXJuIDA7CisKKwlhY3BpX3Byb2Nlc3Nvcl9yZWV2YWx1YXRlX3RzdGF0ZShwciwgdHJ1ZSk7CisJcmV0dXJuIDA7Cit9CiAKICNpZmRlZiBDT05GSUdfQUNQSV9DUFVfRlJFUV9QU1MKIHN0YXRpYyBpbnQgYWNwaV9wc3NfcGVyZl9pbml0KHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsCkBAIC0yNDUsOCArMjM2LDggQEAKIAkJcmV0dXJuIDA7CiAKIAlyZXN1bHQgPSBhY3BpX2NwcGNfcHJvY2Vzc29yX3Byb2JlKHByKTsKLQlpZiAocmVzdWx0KQotCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAocmVzdWx0ICYmICFJU19FTkFCTEVEKENPTkZJR19BQ1BJX0NQVV9GUkVRX1BTUykpCisJCWRldl93YXJuKCZkZXZpY2UtPmRldiwgIkNQUEMgZGF0YSBpbnZhbGlkIG9yIG5vdCBwcmVzZW50XG4iKTsKIAogCWlmICghY3B1aWRsZV9nZXRfZHJpdmVyKCkgfHwgY3B1aWRsZV9nZXRfZHJpdmVyKCkgPT0gJmFjcGlfaWRsZV9kcml2ZXIpCiAJCWFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXQocHIpOwpAQCAtMzAzLDcgKzI5NCw3IEBACiAgKiBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlIHBvd2Vybm93LWs4IGRyaXZlciwgdGhhdCB3b3JrcyBldmVuIHdpdGhvdXQKICAqIEFDUEksIGJ1dCBuZWVkcyBzeW1ib2xzIGZyb20gdGhpcyBkcml2ZXIKICAqLwotCitzdGF0aWMgZW51bSBjcHVocF9zdGF0ZSBocF9vbmxpbmU7CiBzdGF0aWMgaW50IF9faW5pdCBhY3BpX3Byb2Nlc3Nvcl9kcml2ZXJfaW5pdCh2b2lkKQogewogCWludCByZXN1bHQgPSAwOwpAQCAtMzE1LDExICszMDYsMjIgQEAKIAlpZiAocmVzdWx0IDwgMCkKIAkJcmV0dXJuIHJlc3VsdDsKIAotCXJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmYWNwaV9jcHVfbm90aWZpZXIpOworCXJlc3VsdCA9IGNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVBfT05MSU5FX0RZTiwKKwkJCQkJICAgImFjcGkvY3B1LWRydjpvbmxpbmUiLAorCQkJCQkgICBhY3BpX3NvZnRfY3B1X29ubGluZSwgTlVMTCk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZXJyOworCWhwX29ubGluZSA9IHJlc3VsdDsKKwljcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX0FDUElfQ1BVRFJWX0RFQUQsICJhY3BpL2NwdS1kcnY6ZGVhZCIsCisJCQkJICBOVUxMLCBhY3BpX3NvZnRfY3B1X2RlYWQpOworCiAJYWNwaV90aGVybWFsX2NwdWZyZXFfaW5pdCgpOwogCWFjcGlfcHJvY2Vzc29yX3BwY19pbml0KCk7CiAJYWNwaV9wcm9jZXNzb3JfdGhyb3R0bGluZ19pbml0KCk7CiAJcmV0dXJuIDA7CitlcnI6CisJZHJpdmVyX3VucmVnaXN0ZXIoJmFjcGlfcHJvY2Vzc29yX2RyaXZlcik7CisJcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGFjcGlfcHJvY2Vzc29yX2RyaXZlcl9leGl0KHZvaWQpCkBAIC0zMjksNyArMzMxLDggQEAKIAogCWFjcGlfcHJvY2Vzc29yX3BwY19leGl0KCk7CiAJYWNwaV90aGVybWFsX2NwdWZyZXFfZXhpdCgpOwotCXVucmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZhY3BpX2NwdV9ub3RpZmllcik7CisJY3B1aHBfcmVtb3ZlX3N0YXRlX25vY2FsbHMoaHBfb25saW5lKTsKKwljcHVocF9yZW1vdmVfc3RhdGVfbm9jYWxscyhDUFVIUF9BQ1BJX0NQVURSVl9ERUFEKTsKIAlkcml2ZXJfdW5yZWdpc3RlcigmYWNwaV9wcm9jZXNzb3JfZHJpdmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl90aHJvdHRsaW5nLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3Rocm90dGxpbmcuYwppbmRleCBjNzJlNjQ4Li5kNTFjYTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3Rocm90dGxpbmcuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3Rocm90dGxpbmcuYwpAQCAtMzc1LDExICszNzUsMTEgQEAKICAqCTMuIFRTRCBkb21haW4KICAqLwogdm9pZCBhY3BpX3Byb2Nlc3Nvcl9yZWV2YWx1YXRlX3RzdGF0ZShzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLAotCQkJCQl1bnNpZ25lZCBsb25nIGFjdGlvbikKKwkJCQkJYm9vbCBpc19kZWFkKQogewogCWludCByZXN1bHQgPSAwOwogCi0JaWYgKGFjdGlvbiA9PSBDUFVfREVBRCkgeworCWlmIChpc19kZWFkKSB7CiAJCS8qIFdoZW4gb25lIENQVSBpcyBvZmZsaW5lLCB0aGUgVC1zdGF0ZSB0aHJvdHRsaW5nCiAJCSAqIHdpbGwgYmUgaW52YWxpZGF0ZWQuCiAJCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3NjYW4uYyBiL2RyaXZlcnMvYWNwaS9zY2FuLmMKaW5kZXggYWQ5ZmM4NC4uMDM1YWM2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3NjYW4uYworKysgYi9kcml2ZXJzL2FjcGkvc2Nhbi5jCkBAIC0yMDAyLDYgKzIwMDIsNyBAQAogCWFjcGlfcG5wX2luaXQoKTsKIAlhY3BpX2ludDM0MHhfdGhlcm1hbF9pbml0KCk7CiAJYWNwaV9hbWJhX2luaXQoKTsKKwlhY3BpX3dhdGNoZG9nX2luaXQoKTsKIAogCWFjcGlfc2Nhbl9hZGRfaGFuZGxlcigmZ2VuZXJpY19kZXZpY2VfaGFuZGxlcik7CiAKQEAgLTIwNDQsNiArMjA0NSw3IEBACiAJfQogCiAJYWNwaV91cGRhdGVfYWxsX2dwZXMoKTsKKwlhY3BpX2VjX2VjZHRfc3RhcnQoKTsKIAogCWFjcGlfc2Nhbl9pbml0aWFsaXplZCA9IHRydWU7CiAKQEAgLTIwNTQsNyArMjA1Niw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9wcm9iZV9lbnRyeSAqYXBlOwogc3RhdGljIGludCBhY3BpX3Byb2JlX2NvdW50Owotc3RhdGljIERFRklORV9TUElOTE9DSyhhY3BpX3Byb2JlX2xvY2spOworc3RhdGljIERFRklORV9NVVRFWChhY3BpX3Byb2JlX211dGV4KTsKIAogc3RhdGljIGludCBfX2luaXQgYWNwaV9tYXRjaF9tYWR0KHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqaGVhZGVyLAogCQkJCSAgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCkBAIC0yMDczLDcgKzIwNzUsNyBAQAogCWlmIChhY3BpX2Rpc2FibGVkKQogCQlyZXR1cm4gMDsKIAotCXNwaW5fbG9jaygmYWNwaV9wcm9iZV9sb2NrKTsKKwltdXRleF9sb2NrKCZhY3BpX3Byb2JlX211dGV4KTsKIAlmb3IgKGFwZSA9IGFwX2hlYWQ7IG5yOyBhcGUrKywgbnItLSkgewogCQlpZiAoQUNQSV9DT01QQVJFX05BTUUoQUNQSV9TSUdfTUFEVCwgYXBlLT5pZCkpIHsKIAkJCWFjcGlfcHJvYmVfY291bnQgPSAwOwpAQCAtMjA4Niw3ICsyMDg4LDcgQEAKIAkJCQljb3VudCsrOwogCQl9CiAJfQotCXNwaW5fdW5sb2NrKCZhY3BpX3Byb2JlX2xvY2spOworCW11dGV4X3VubG9jaygmYWNwaV9wcm9iZV9tdXRleCk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2xlZXAuYyBiL2RyaXZlcnMvYWNwaS9zbGVlcC5jCmluZGV4IDJiMzhjMWIuLmRlYjBmZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zbGVlcC5jCisrKyBiL2RyaXZlcnMvYWNwaS9zbGVlcC5jCkBAIC01NzIsNyArNTcyLDcgQEAKIAogCQlhY3BpX2dldF9ldmVudF9zdGF0dXMoQUNQSV9FVkVOVF9QT1dFUl9CVVRUT04sICZwd3JfYnRuX3N0YXR1cyk7CiAKLQkJaWYgKHB3cl9idG5fc3RhdHVzICYgQUNQSV9FVkVOVF9GTEFHX1NFVCkgeworCQlpZiAocHdyX2J0bl9zdGF0dXMgJiBBQ1BJX0VWRU5UX0ZMQUdfU1RBVFVTX1NFVCkgewogCQkJYWNwaV9jbGVhcl9ldmVudChBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTik7CiAJCQkvKiBGbGFnIGZvciBsYXRlciAqLwogCQkJcHdyX2J0bl9ldmVudF9wZW5kaW5nID0gdHJ1ZTsKQEAgLTU4Niw3ICs1ODYsNyBAQAogCSAqLwogCWFjcGlfZGlzYWJsZV9hbGxfZ3BlcygpOwogCS8qIEFsbG93IEVDIHRyYW5zYWN0aW9ucyB0byBoYXBwZW4uICovCi0JYWNwaV9lY191bmJsb2NrX3RyYW5zYWN0aW9uc19lYXJseSgpOworCWFjcGlfZWNfdW5ibG9ja190cmFuc2FjdGlvbnMoKTsKIAogCXN1c3BlbmRfbnZzX3Jlc3RvcmUoKTsKIApAQCAtNzg0LDcgKzc4NCw3IEBACiAJLyogUmVzdG9yZSB0aGUgTlZTIG1lbW9yeSBhcmVhICovCiAJc3VzcGVuZF9udnNfcmVzdG9yZSgpOwogCS8qIEFsbG93IEVDIHRyYW5zYWN0aW9ucyB0byBoYXBwZW4uICovCi0JYWNwaV9lY191bmJsb2NrX3RyYW5zYWN0aW9uc19lYXJseSgpOworCWFjcGlfZWNfdW5ibG9ja190cmFuc2FjdGlvbnMoKTsKIH0KIAogc3RhdGljIHZvaWQgYWNwaV9wbV90aGF3KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc3Bjci5jIGIvZHJpdmVycy9hY3BpL3NwY3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGQ3YmM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL3NwY3IuYwpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgSW50ZWwgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNSwgUmVkIEhhdCwgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE2IExpbmFybyBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSAiQUNQSTogU1BDUjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKworLyoqCisgKiBwYXJzZV9zcGNyKCkgLSBwYXJzZSBBQ1BJIFNQQ1IgdGFibGUgYW5kIGFkZCBwcmVmZXJyZWQgY29uc29sZQorICoKKyAqIEBlYXJseWNvbjogc2V0IHVwIGVhcmx5Y29uIGZvciB0aGUgY29uc29sZSBzcGVjaWZpZWQgYnkgdGhlIHRhYmxlCisgKgorICogRm9yIHRoZSBhcmNoaXRlY3R1cmVzIHdpdGggc3VwcG9ydCBmb3IgQUNQSSwgQ09ORklHX0FDUElfU1BDUl9UQUJMRSBtYXkgYmUKKyAqIGRlZmluZWQgdG8gcGFyc2UgQUNQSSBTUENSIHRhYmxlLiAgQXMgYSByZXN1bHQgb2YgdGhlIHBhcnNpbmcgcHJlZmVycmVkCisgKiBjb25zb2xlIGlzIHJlZ2lzdGVyZWQgYW5kIGlmIEBlYXJseWNvbiBpcyB0cnVlLCBlYXJseWNvbiBpcyBzZXQgdXAuCisgKgorICogV2hlbiBDT05GSUdfQUNQSV9TUENSX1RBQkxFIGlzIGRlZmluZWQsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZAorICogZnJvbSBhcmNoIGluaW50aWFsaXphdGlvbiBjb2RlIGFzIHNvb24gYXMgdGhlIERUL0FDUEkgZGVjaXNpb24gaXMgbWFkZS4KKyAqCisgKi8KK2ludCBfX2luaXQgcGFyc2Vfc3Bjcihib29sIGVhcmx5Y29uKQoreworCXN0YXRpYyBjaGFyIG9wdHNbNjRdOworCXN0cnVjdCBhY3BpX3RhYmxlX3NwY3IgKnRhYmxlOworCWFjcGlfc2l6ZSB0YWJsZV9zaXplOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwljaGFyICp1YXJ0OworCWNoYXIgKmlvdHlwZTsKKwlpbnQgYmF1ZF9yYXRlOworCWludCBlcnI7CisKKwlpZiAoYWNwaV9kaXNhYmxlZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzdGF0dXMgPSBhY3BpX2dldF90YWJsZV93aXRoX3NpemUoQUNQSV9TSUdfU1BDUiwgMCwKKwkJCQkJICAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqKSZ0YWJsZSwKKwkJCQkJICAmdGFibGVfc2l6ZSk7CisKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXJldHVybiAtRU5PRU5UOworCisJaWYgKHRhYmxlLT5oZWFkZXIucmV2aXNpb24gPCAyKSB7CisJCWVyciA9IC1FTk9FTlQ7CisJCXByX2Vycigid3JvbmcgdGFibGUgdmVyc2lvblxuIik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpb3R5cGUgPSB0YWJsZS0+c2VyaWFsX3BvcnQuc3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX01FTU9SWSA/CisJCQkibW1pbyIgOiAiaW8iOworCisJc3dpdGNoICh0YWJsZS0+aW50ZXJmYWNlX3R5cGUpIHsKKwljYXNlIEFDUElfREJHMl9BUk1fU0JTQV8zMkJJVDoKKwkJaW90eXBlID0gIm1taW8zMiI7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgQUNQSV9EQkcyX0FSTV9QTDAxMToKKwljYXNlIEFDUElfREJHMl9BUk1fU0JTQV9HRU5FUklDOgorCWNhc2UgQUNQSV9EQkcyX0JDTTI4MzU6CisJCXVhcnQgPSAicGwwMTEiOworCQlicmVhazsKKwljYXNlIEFDUElfREJHMl8xNjU1MF9DT01QQVRJQkxFOgorCWNhc2UgQUNQSV9EQkcyXzE2NTUwX1NVQlNFVDoKKwkJdWFydCA9ICJ1YXJ0IjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT0VOVDsKKwkJZ290byBkb25lOworCX0KKworCXN3aXRjaCAodGFibGUtPmJhdWRfcmF0ZSkgeworCWNhc2UgMzoKKwkJYmF1ZF9yYXRlID0gOTYwMDsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQliYXVkX3JhdGUgPSAxOTIwMDsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQliYXVkX3JhdGUgPSA1NzYwMDsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQliYXVkX3JhdGUgPSAxMTUyMDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9IC1FTk9FTlQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzbnByaW50ZihvcHRzLCBzaXplb2Yob3B0cyksICIlcywlcywweCVsbHgsJWQiLCB1YXJ0LCBpb3R5cGUsCisJCSB0YWJsZS0+c2VyaWFsX3BvcnQuYWRkcmVzcywgYmF1ZF9yYXRlKTsKKworCXByX2luZm8oImNvbnNvbGU6ICVzXG4iLCBvcHRzKTsKKworCWlmIChlYXJseWNvbikKKwkJc2V0dXBfZWFybHljb24ob3B0cyk7CisKKwllcnIgPSBhZGRfcHJlZmVycmVkX2NvbnNvbGUodWFydCwgMCwgb3B0cyArIHN0cmxlbih1YXJ0KSArIDEpOworCitkb25lOgorCWVhcmx5X2FjcGlfb3NfdW5tYXBfbWVtb3J5KCh2b2lkIF9faW9tZW0gKil0YWJsZSwgdGFibGVfc2l6ZSk7CisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zeXNmcy5jIGIvZHJpdmVycy9hY3BpL3N5c2ZzLmMKaW5kZXggMzU4MTY1ZS4uNzAzYzI2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3N5c2ZzLmMKKysrIGIvZHJpdmVycy9hY3BpL3N5c2ZzLmMKQEAgLTMxNCwxMCArMzE0LDE0IEBACiBzdGF0aWMgc3RydWN0IGtvYmplY3QgKmR5bmFtaWNfdGFibGVzX2tvYmo7CiBzdGF0aWMgc3RydWN0IGtvYmplY3QgKmhvdHBsdWdfa29iajsKIAorI2RlZmluZSBBQ1BJX01BWF9UQUJMRV9JTlNUQU5DRVMJOTk5CisjZGVmaW5lIEFDUElfSU5TVF9TSVpFCQkJNCAvKiBpbmNsdWRpbmcgdHJhaWxpbmcgMCAqLworCiBzdHJ1Y3QgYWNwaV90YWJsZV9hdHRyIHsKIAlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBhdHRyOwotCWNoYXIgbmFtZVs4XTsKKwljaGFyIG5hbWVbQUNQSV9OQU1FX1NJWkVdOwogCWludCBpbnN0YW5jZTsKKwljaGFyIGZpbGVuYW1lW0FDUElfTkFNRV9TSVpFK0FDUElfSU5TVF9TSVpFXTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CiB9OwogCkBAIC0zMjksMTQgKzMzMyw5IEBACiAJICAgIGNvbnRhaW5lcl9vZihiaW5fYXR0ciwgc3RydWN0IGFjcGlfdGFibGVfYXR0ciwgYXR0cik7CiAJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZV9oZWFkZXIgPSBOVUxMOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKLQljaGFyIG5hbWVbQUNQSV9OQU1FX1NJWkVdOwogCi0JaWYgKHN0cm5jbXAodGFibGVfYXR0ci0+bmFtZSwgIk5VTEwiLCA0KSkKLQkJbWVtY3B5KG5hbWUsIHRhYmxlX2F0dHItPm5hbWUsIEFDUElfTkFNRV9TSVpFKTsKLQllbHNlCi0JCW1lbWNweShuYW1lLCAiXDBcMFwwXDAiLCA0KTsKLQotCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlKG5hbWUsIHRhYmxlX2F0dHItPmluc3RhbmNlLCAmdGFibGVfaGVhZGVyKTsKKwlzdGF0dXMgPSBhY3BpX2dldF90YWJsZSh0YWJsZV9hdHRyLT5uYW1lLCB0YWJsZV9hdHRyLT5pbnN0YW5jZSwKKwkJCQkmdGFibGVfaGVhZGVyKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXJldHVybiAtRU5PREVWOwogCkBAIC0zNDQsMzggKzM0Myw0NSBAQAogCQkJCSAgICAgICB0YWJsZV9oZWFkZXIsIHRhYmxlX2hlYWRlci0+bGVuZ3RoKTsKIH0KIAotc3RhdGljIHZvaWQgYWNwaV90YWJsZV9hdHRyX2luaXQoc3RydWN0IGFjcGlfdGFibGVfYXR0ciAqdGFibGVfYXR0ciwKLQkJCQkgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZV9oZWFkZXIpCitzdGF0aWMgaW50IGFjcGlfdGFibGVfYXR0cl9pbml0KHN0cnVjdCBrb2JqZWN0ICp0YWJsZXNfb2JqLAorCQkJCXN0cnVjdCBhY3BpX3RhYmxlX2F0dHIgKnRhYmxlX2F0dHIsCisJCQkJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZV9oZWFkZXIpCiB7CiAJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpoZWFkZXIgPSBOVUxMOwogCXN0cnVjdCBhY3BpX3RhYmxlX2F0dHIgKmF0dHIgPSBOVUxMOworCWNoYXIgaW5zdGFuY2Vfc3RyW0FDUElfSU5TVF9TSVpFXTsKIAogCXN5c2ZzX2F0dHJfaW5pdCgmdGFibGVfYXR0ci0+YXR0ci5hdHRyKTsKLQlpZiAodGFibGVfaGVhZGVyLT5zaWduYXR1cmVbMF0gIT0gJ1wwJykKLQkJbWVtY3B5KHRhYmxlX2F0dHItPm5hbWUsIHRhYmxlX2hlYWRlci0+c2lnbmF0dXJlLAotCQkgICAgICAgQUNQSV9OQU1FX1NJWkUpOwotCWVsc2UKLQkJbWVtY3B5KHRhYmxlX2F0dHItPm5hbWUsICJOVUxMIiwgNCk7CisJQUNQSV9NT1ZFX05BTUUodGFibGVfYXR0ci0+bmFtZSwgdGFibGVfaGVhZGVyLT5zaWduYXR1cmUpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShhdHRyLCAmYWNwaV90YWJsZV9hdHRyX2xpc3QsIG5vZGUpIHsKLQkJaWYgKCFtZW1jbXAodGFibGVfYXR0ci0+bmFtZSwgYXR0ci0+bmFtZSwgQUNQSV9OQU1FX1NJWkUpKQorCQlpZiAoQUNQSV9DT01QQVJFX05BTUUodGFibGVfYXR0ci0+bmFtZSwgYXR0ci0+bmFtZSkpCiAJCQlpZiAodGFibGVfYXR0ci0+aW5zdGFuY2UgPCBhdHRyLT5pbnN0YW5jZSkKIAkJCQl0YWJsZV9hdHRyLT5pbnN0YW5jZSA9IGF0dHItPmluc3RhbmNlOwogCX0KIAl0YWJsZV9hdHRyLT5pbnN0YW5jZSsrOworCWlmICh0YWJsZV9hdHRyLT5pbnN0YW5jZSA+IEFDUElfTUFYX1RBQkxFX0lOU1RBTkNFUykgeworCQlwcl93YXJuKCIlNC40czogdG9vIG1hbnkgdGFibGUgaW5zdGFuY2VzXG4iLAorCQkJdGFibGVfYXR0ci0+bmFtZSk7CisJCXJldHVybiAtRVJBTkdFOworCX0KIAorCUFDUElfTU9WRV9OQU1FKHRhYmxlX2F0dHItPmZpbGVuYW1lLCB0YWJsZV9oZWFkZXItPnNpZ25hdHVyZSk7CisJdGFibGVfYXR0ci0+ZmlsZW5hbWVbQUNQSV9OQU1FX1NJWkVdID0gJ1wwJzsKIAlpZiAodGFibGVfYXR0ci0+aW5zdGFuY2UgPiAxIHx8ICh0YWJsZV9hdHRyLT5pbnN0YW5jZSA9PSAxICYmCiAJCQkJCSAhYWNwaV9nZXRfdGFibGUKLQkJCQkJICh0YWJsZV9oZWFkZXItPnNpZ25hdHVyZSwgMiwgJmhlYWRlcikpKQotCQlzcHJpbnRmKHRhYmxlX2F0dHItPm5hbWUgKyBBQ1BJX05BTUVfU0laRSwgIiVkIiwKLQkJCXRhYmxlX2F0dHItPmluc3RhbmNlKTsKKwkJCQkJICh0YWJsZV9oZWFkZXItPnNpZ25hdHVyZSwgMiwgJmhlYWRlcikpKSB7CisJCXNucHJpbnRmKGluc3RhbmNlX3N0ciwgc2l6ZW9mKGluc3RhbmNlX3N0ciksICIldSIsCisJCQkgdGFibGVfYXR0ci0+aW5zdGFuY2UpOworCQlzdHJjYXQodGFibGVfYXR0ci0+ZmlsZW5hbWUsIGluc3RhbmNlX3N0cik7CisJfQogCiAJdGFibGVfYXR0ci0+YXR0ci5zaXplID0gdGFibGVfaGVhZGVyLT5sZW5ndGg7CiAJdGFibGVfYXR0ci0+YXR0ci5yZWFkID0gYWNwaV90YWJsZV9zaG93OwotCXRhYmxlX2F0dHItPmF0dHIuYXR0ci5uYW1lID0gdGFibGVfYXR0ci0+bmFtZTsKKwl0YWJsZV9hdHRyLT5hdHRyLmF0dHIubmFtZSA9IHRhYmxlX2F0dHItPmZpbGVuYW1lOwogCXRhYmxlX2F0dHItPmF0dHIuYXR0ci5tb2RlID0gMDQwMDsKIAotCXJldHVybjsKKwlyZXR1cm4gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKHRhYmxlc19vYmosICZ0YWJsZV9hdHRyLT5hdHRyKTsKIH0KIAogYWNwaV9zdGF0dXMgYWNwaV9zeXNmc190YWJsZV9oYW5kbGVyKHUzMiBldmVudCwgdm9pZCAqdGFibGUsIHZvaWQgKmNvbnRleHQpCkBAIC0zODMsMjEgKzM4OSwyMiBAQAogCXN0cnVjdCBhY3BpX3RhYmxlX2F0dHIgKnRhYmxlX2F0dHI7CiAKIAlzd2l0Y2ggKGV2ZW50KSB7Ci0JY2FzZSBBQ1BJX1RBQkxFX0VWRU5UX0xPQUQ6CisJY2FzZSBBQ1BJX1RBQkxFX0VWRU5UX0lOU1RBTEw6CiAJCXRhYmxlX2F0dHIgPQogCQkgICAga3phbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfYXR0ciksIEdGUF9LRVJORUwpOwogCQlpZiAoIXRhYmxlX2F0dHIpCiAJCQlyZXR1cm4gQUVfTk9fTUVNT1JZOwogCi0JCWFjcGlfdGFibGVfYXR0cl9pbml0KHRhYmxlX2F0dHIsIHRhYmxlKTsKLQkJaWYgKHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZShkeW5hbWljX3RhYmxlc19rb2JqLAotCQkJCQkgICZ0YWJsZV9hdHRyLT5hdHRyKSkgeworCQlpZiAoYWNwaV90YWJsZV9hdHRyX2luaXQoZHluYW1pY190YWJsZXNfa29iaiwKKwkJCQkJIHRhYmxlX2F0dHIsIHRhYmxlKSkgewogCQkJa2ZyZWUodGFibGVfYXR0cik7CiAJCQlyZXR1cm4gQUVfRVJST1I7Ci0JCX0gZWxzZQotCQkJbGlzdF9hZGRfdGFpbCgmdGFibGVfYXR0ci0+bm9kZSwgJmFjcGlfdGFibGVfYXR0cl9saXN0KTsKKwkJfQorCQlsaXN0X2FkZF90YWlsKCZ0YWJsZV9hdHRyLT5ub2RlLCAmYWNwaV90YWJsZV9hdHRyX2xpc3QpOwogCQlicmVhazsKKwljYXNlIEFDUElfVEFCTEVfRVZFTlRfTE9BRDoKIAljYXNlIEFDUElfVEFCTEVfRVZFTlRfVU5MT0FEOgorCWNhc2UgQUNQSV9UQUJMRV9FVkVOVF9VTklOU1RBTEw6CiAJCS8qCiAJCSAqIHdlIGRvIG5vdCBuZWVkIHRvIGRvIGFueXRoaW5nIHJpZ2h0IG5vdwogCQkgKiBiZWNhdXNlIHRoZSB0YWJsZSBpcyBub3QgZGVsZXRlZCBmcm9tIHRoZQpAQCAtNDM1LDEzICs0NDIsMTIgQEAKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQkJY29udGludWU7CiAKLQkJdGFibGVfYXR0ciA9IE5VTEw7CiAJCXRhYmxlX2F0dHIgPSBremFsbG9jKHNpemVvZigqdGFibGVfYXR0ciksIEdGUF9LRVJORUwpOwogCQlpZiAoIXRhYmxlX2F0dHIpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAotCQlhY3BpX3RhYmxlX2F0dHJfaW5pdCh0YWJsZV9hdHRyLCB0YWJsZV9oZWFkZXIpOwotCQlyZXQgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUodGFibGVzX2tvYmosICZ0YWJsZV9hdHRyLT5hdHRyKTsKKwkJcmV0ID0gYWNwaV90YWJsZV9hdHRyX2luaXQodGFibGVzX2tvYmosCisJCQkJCSAgIHRhYmxlX2F0dHIsIHRhYmxlX2hlYWRlcik7CiAJCWlmIChyZXQpIHsKIAkJCWtmcmVlKHRhYmxlX2F0dHIpOwogCQkJcmV0dXJuIHJldDsKQEAgLTU5NywxNCArNjAzLDI3IEBACiAJaWYgKHJlc3VsdCkKIAkJZ290byBlbmQ7CiAKLQlpZiAoIShzdGF0dXMgJiBBQ1BJX0VWRU5UX0ZMQUdfSEFTX0hBTkRMRVIpKQotCQlzaXplICs9IHNwcmludGYoYnVmICsgc2l6ZSwgIiAgIGludmFsaWQiKTsKLQllbHNlIGlmIChzdGF0dXMgJiBBQ1BJX0VWRU5UX0ZMQUdfRU5BQkxFRCkKLQkJc2l6ZSArPSBzcHJpbnRmKGJ1ZiArIHNpemUsICIgICBlbmFibGVkIik7Ci0JZWxzZSBpZiAoc3RhdHVzICYgQUNQSV9FVkVOVF9GTEFHX1dBS0VfRU5BQkxFRCkKLQkJc2l6ZSArPSBzcHJpbnRmKGJ1ZiArIHNpemUsICIgICB3YWtlX2VuYWJsZWQiKTsKKwlpZiAoc3RhdHVzICYgQUNQSV9FVkVOVF9GTEFHX0VOQUJMRV9TRVQpCisJCXNpemUgKz0gc3ByaW50ZihidWYgKyBzaXplLCAiICBFTiIpOwogCWVsc2UKLQkJc2l6ZSArPSBzcHJpbnRmKGJ1ZiArIHNpemUsICIgICBkaXNhYmxlZCIpOworCQlzaXplICs9IHNwcmludGYoYnVmICsgc2l6ZSwgIiAgICAiKTsKKwlpZiAoc3RhdHVzICYgQUNQSV9FVkVOVF9GTEFHX1NUQVRVU19TRVQpCisJCXNpemUgKz0gc3ByaW50ZihidWYgKyBzaXplLCAiIFNUUyIpOworCWVsc2UKKwkJc2l6ZSArPSBzcHJpbnRmKGJ1ZiArIHNpemUsICIgICAgIik7CisKKwlpZiAoIShzdGF0dXMgJiBBQ1BJX0VWRU5UX0ZMQUdfSEFTX0hBTkRMRVIpKQorCQlzaXplICs9IHNwcmludGYoYnVmICsgc2l6ZSwgIiBpbnZhbGlkICAgICAiKTsKKwllbHNlIGlmIChzdGF0dXMgJiBBQ1BJX0VWRU5UX0ZMQUdfRU5BQkxFRCkKKwkJc2l6ZSArPSBzcHJpbnRmKGJ1ZiArIHNpemUsICIgZW5hYmxlZCAgICAgIik7CisJZWxzZSBpZiAoc3RhdHVzICYgQUNQSV9FVkVOVF9GTEFHX1dBS0VfRU5BQkxFRCkKKwkJc2l6ZSArPSBzcHJpbnRmKGJ1ZiArIHNpemUsICIgd2FrZV9lbmFibGVkIik7CisJZWxzZQorCQlzaXplICs9IHNwcmludGYoYnVmICsgc2l6ZSwgIiBkaXNhYmxlZCAgICAiKTsKKwlpZiAoc3RhdHVzICYgQUNQSV9FVkVOVF9GTEFHX01BU0tFRCkKKwkJc2l6ZSArPSBzcHJpbnRmKGJ1ZiArIHNpemUsICIgbWFza2VkICAiKTsKKwllbHNlCisJCXNpemUgKz0gc3ByaW50ZihidWYgKyBzaXplLCAiIHVubWFza2VkIik7CiAKIGVuZDoKIAlzaXplICs9IHNwcmludGYoYnVmICsgc2l6ZSwgIlxuIik7CkBAIC02NTUsOCArNjc0LDEyIEBACiAJCQkgIShzdGF0dXMgJiBBQ1BJX0VWRU5UX0ZMQUdfRU5BQkxFRCkpCiAJCQlyZXN1bHQgPSBhY3BpX2VuYWJsZV9ncGUoaGFuZGxlLCBpbmRleCk7CiAJCWVsc2UgaWYgKCFzdHJjbXAoYnVmLCAiY2xlYXJcbiIpICYmCi0JCQkgKHN0YXR1cyAmIEFDUElfRVZFTlRfRkxBR19TRVQpKQorCQkJIChzdGF0dXMgJiBBQ1BJX0VWRU5UX0ZMQUdfU1RBVFVTX1NFVCkpCiAJCQlyZXN1bHQgPSBhY3BpX2NsZWFyX2dwZShoYW5kbGUsIGluZGV4KTsKKwkJZWxzZSBpZiAoIXN0cmNtcChidWYsICJtYXNrXG4iKSkKKwkJCXJlc3VsdCA9IGFjcGlfbWFza19ncGUoaGFuZGxlLCBpbmRleCwgVFJVRSk7CisJCWVsc2UgaWYgKCFzdHJjbXAoYnVmLCAidW5tYXNrXG4iKSkKKwkJCXJlc3VsdCA9IGFjcGlfbWFza19ncGUoaGFuZGxlLCBpbmRleCwgRkFMU0UpOwogCQllbHNlIGlmICgha3N0cnRvdWwoYnVmLCAwLCAmdG1wKSkKIAkJCWFsbF9jb3VudGVyc1tpbmRleF0uY291bnQgPSB0bXA7CiAJCWVsc2UKQEAgLTY2NCwxMyArNjg3LDEzIEBACiAJfSBlbHNlIGlmIChpbmRleCA8IG51bV9ncGVzICsgQUNQSV9OVU1fRklYRURfRVZFTlRTKSB7CiAJCWludCBldmVudCA9IGluZGV4IC0gbnVtX2dwZXM7CiAJCWlmICghc3RyY21wKGJ1ZiwgImRpc2FibGVcbiIpICYmCi0JCSAgICAoc3RhdHVzICYgQUNQSV9FVkVOVF9GTEFHX0VOQUJMRUQpKQorCQkgICAgKHN0YXR1cyAmIEFDUElfRVZFTlRfRkxBR19FTkFCTEVfU0VUKSkKIAkJCXJlc3VsdCA9IGFjcGlfZGlzYWJsZV9ldmVudChldmVudCwgQUNQSV9OT1RfSVNSKTsKIAkJZWxzZSBpZiAoIXN0cmNtcChidWYsICJlbmFibGVcbiIpICYmCi0JCQkgIShzdGF0dXMgJiBBQ1BJX0VWRU5UX0ZMQUdfRU5BQkxFRCkpCisJCQkgIShzdGF0dXMgJiBBQ1BJX0VWRU5UX0ZMQUdfRU5BQkxFX1NFVCkpCiAJCQlyZXN1bHQgPSBhY3BpX2VuYWJsZV9ldmVudChldmVudCwgQUNQSV9OT1RfSVNSKTsKIAkJZWxzZSBpZiAoIXN0cmNtcChidWYsICJjbGVhclxuIikgJiYKLQkJCSAoc3RhdHVzICYgQUNQSV9FVkVOVF9GTEFHX1NFVCkpCisJCQkgKHN0YXR1cyAmIEFDUElfRVZFTlRfRkxBR19TVEFUVVNfU0VUKSkKIAkJCXJlc3VsdCA9IGFjcGlfY2xlYXJfZXZlbnQoZXZlbnQpOwogCQllbHNlIGlmICgha3N0cnRvdWwoYnVmLCAwLCAmdG1wKSkKIAkJCWFsbF9jb3VudGVyc1tpbmRleF0uY291bnQgPSB0bXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzLmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzLmMKaW5kZXggOWYwYWQ2ZS4uY2RkNTZjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMuYwpAQCAtMzUsNyArMzUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vhcmx5Y3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+Ci0jaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKICNpZmRlZiBDT05GSUdfQUNQSV9DVVNUT01fRFNEVApAQCAtMjQ2LDYgKzI0NSw3IEBACiAJc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICplbnRyeTsKIAl1bnNpZ25lZCBsb25nIHRhYmxlX2VuZDsKIAlpbnQgY291bnQgPSAwOworCWludCBlcnJzID0gMDsKIAlpbnQgaTsKIAogCWlmIChhY3BpX2Rpc2FibGVkKQpAQCAtMjc4LDEwICsyNzgsMTIgQEAKIAkJCWlmIChlbnRyeS0+dHlwZSAhPSBwcm9jW2ldLmlkKQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKCFwcm9jW2ldLmhhbmRsZXIgfHwKLQkJCSAgICAgcHJvY1tpXS5oYW5kbGVyKGVudHJ5LCB0YWJsZV9lbmQpKQotCQkJCXJldHVybiAtRUlOVkFMOworCQkJICAgICAoIWVycnMgJiYgcHJvY1tpXS5oYW5kbGVyKGVudHJ5LCB0YWJsZV9lbmQpKSkgeworCQkJCWVycnMrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KIAotCQkJcHJvYy0+Y291bnQrKzsKKwkJCXByb2NbaV0uY291bnQrKzsKIAkJCWJyZWFrOwogCQl9CiAJCWlmIChpICE9IHByb2NfbnVtKQpAQCAtMzAxLDExICszMDMsMTEgQEAKIAl9CiAKIAlpZiAobWF4X2VudHJpZXMgJiYgY291bnQgPiBtYXhfZW50cmllcykgewotCQlwcl93YXJuKCJbJTQuNHM6MHglMDJ4XSBpZ25vcmVkICVpIGVudHJpZXMgb2YgJWkgZm91bmRcbiIsCi0JCQlpZCwgcHJvYy0+aWQsIGNvdW50IC0gbWF4X2VudHJpZXMsIGNvdW50KTsKKwkJcHJfd2FybigiWyU0LjRzOjB4JTAyeF0gZm91bmQgdGhlIG1heGltdW0gJWkgZW50cmllc1xuIiwKKwkJCWlkLCBwcm9jLT5pZCwgY291bnQpOwogCX0KIAotCXJldHVybiBjb3VudDsKKwlyZXR1cm4gZXJycyA/IC1FSU5WQUwgOiBjb3VudDsKIH0KIAogaW50IF9faW5pdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbWJhL2J1cy5jIGIvZHJpdmVycy9hbWJhL2J1cy5jCmluZGV4IGE1YjVjODcuLmE1NmZhMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYW1iYS9idXMuYworKysgYi9kcml2ZXJzL2FtYmEvYnVzLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgogI2luY2x1ZGUgPGxpbnV4L3NpemVzLmg+CiAjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CisjaW5jbHVkZSA8bGludXgvY2xrL2Nsay1jb25mLmg+CiAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKQEAgLTIzNyw2ICsyMzgsMTAgQEAKIAlpbnQgcmV0OwogCiAJZG8geworCQlyZXQgPSBvZl9jbGtfc2V0X2RlZmF1bHRzKGRldi0+b2Zfbm9kZSwgZmFsc2UpOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCiAJCXJldCA9IGRldl9wbV9kb21haW5fYXR0YWNoKGRldiwgdHJ1ZSk7CiAJCWlmIChyZXQgPT0gLUVQUk9CRV9ERUZFUikKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hbmRyb2lkL2JpbmRlci5jIGIvZHJpdmVycy9hbmRyb2lkL2JpbmRlci5jCmluZGV4IDE2Mjg4ZTcuLjU2MmFmOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYW5kcm9pZC9iaW5kZXIuYworKysgYi9kcml2ZXJzL2FuZHJvaWQvYmluZGVyLmMKQEAgLTU5LDcgKzU5LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgYmluZGVyX25vZGUgKmJpbmRlcl9jb250ZXh0X21ncl9ub2RlOwogc3RhdGljIGt1aWRfdCBiaW5kZXJfY29udGV4dF9tZ3JfdWlkID0gSU5WQUxJRF9VSUQ7CiBzdGF0aWMgaW50IGJpbmRlcl9sYXN0X2lkOwotc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpiaW5kZXJfZGVmZXJyZWRfd29ya3F1ZXVlOwogCiAjZGVmaW5lIEJJTkRFUl9ERUJVR19FTlRSWShuYW1lKSBcCiBzdGF0aWMgaW50IGJpbmRlcl8jI25hbWUjI19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKSBcCkBAIC0zMjI3LDcgKzMyMjYsNyBAQAogCWlmIChobGlzdF91bmhhc2hlZCgmcHJvYy0+ZGVmZXJyZWRfd29ya19ub2RlKSkgewogCQlobGlzdF9hZGRfaGVhZCgmcHJvYy0+ZGVmZXJyZWRfd29ya19ub2RlLAogCQkJCSZiaW5kZXJfZGVmZXJyZWRfbGlzdCk7Ci0JCXF1ZXVlX3dvcmsoYmluZGVyX2RlZmVycmVkX3dvcmtxdWV1ZSwgJmJpbmRlcl9kZWZlcnJlZF93b3JrKTsKKwkJc2NoZWR1bGVfd29yaygmYmluZGVyX2RlZmVycmVkX3dvcmspOwogCX0KIAltdXRleF91bmxvY2soJmJpbmRlcl9kZWZlcnJlZF9sb2NrKTsKIH0KQEAgLTM2NzksMTAgKzM2NzgsNiBAQAogewogCWludCByZXQ7CiAKLQliaW5kZXJfZGVmZXJyZWRfd29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImJpbmRlciIpOwotCWlmICghYmluZGVyX2RlZmVycmVkX3dvcmtxdWV1ZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAliaW5kZXJfZGVidWdmc19kaXJfZW50cnlfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcigiYmluZGVyIiwgTlVMTCk7CiAJaWYgKGJpbmRlcl9kZWJ1Z2ZzX2Rpcl9lbnRyeV9yb290KQogCQliaW5kZXJfZGVidWdmc19kaXJfZW50cnlfcHJvYyA9IGRlYnVnZnNfY3JlYXRlX2RpcigicHJvYyIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhaGNpLmMgYi9kcml2ZXJzL2F0YS9saWJhaGNpLmMKaW5kZXggNzQ2MWE1OC4uZGNmMmM3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYWhjaS5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmFoY2kuYwpAQCAtMjUyNCw3ICsyNTI0LDcgQEAKIAogCQkvKiBEbyBub3QgcmVjZWl2ZSBpbnRlcnJ1cHRzIHNlbnQgYnkgZHVtbXkgcG9ydHMgKi8KIAkJaWYgKCFwcCkgewotCQkJZGlzYWJsZV9pcnEoaXJxICsgaSk7CisJCQlkaXNhYmxlX2lycShpcnEpOwogCQkJY29udGludWU7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9uaW5qYTMyLmMgYi9kcml2ZXJzL2F0YS9wYXRhX25pbmphMzIuYwppbmRleCA2MzNhYTI5Li40NGY5N2FkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX25pbmphMzIuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX25pbmphMzIuYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJYXAtPmlvYWRkci5hbHRzdGF0dXNfYWRkciA9IGJhc2UgKyAweDFFOwogCWFwLT5pb2FkZHIuYm1kbWFfYWRkciA9IGJhc2U7CiAJYXRhX3NmZl9zdGRfcG9ydHMoJmFwLT5pb2FkZHIpOwotCWFwLT5wZmxhZ3MgPSBBVEFfUEZMQUdfUElPMzIgfCBBVEFfUEZMQUdfUElPMzJDSEFOR0U7CisJYXAtPnBmbGFncyB8PSBBVEFfUEZMQUdfUElPMzIgfCBBVEFfUEZMQUdfUElPMzJDSEFOR0U7CiAKIAluaW5qYTMyX3Byb2dyYW0oYmFzZSk7CiAJLyogRklYTUU6IFNob3VsZCB3ZSBkaXNhYmxlIHRoZW0gYXQgcmVtb3ZlID8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL2VuaS5jIGIvZHJpdmVycy9hdG0vZW5pLmMKaW5kZXggNjMzOWVmZC4uZjJhYWY5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vZW5pLmMKKysrIGIvZHJpdmVycy9hdG0vZW5pLmMKQEAgLTE4NDUsOCArMTg0NSw5IEBACiAJLyogaW5pdGlhbGl6ZSBtZW1vcnkgbWFuYWdlbWVudCAqLwogCWJ1ZmZlcl9tZW0gPSBlbmlfZGV2LT5tZW0gLSAoYnVmIC0gZW5pX2Rldi0+cmFtKTsKIAllbmlfZGV2LT5mcmVlX2xpc3Rfc2l6ZSA9IGJ1ZmZlcl9tZW0vTUlEX01JTl9CVUZfU0laRS8yOwotCWVuaV9kZXYtPmZyZWVfbGlzdCA9IGttYWxsb2MoCi0JICAgIHNpemVvZihzdHJ1Y3QgZW5pX2ZyZWUpKihlbmlfZGV2LT5mcmVlX2xpc3Rfc2l6ZSsxKSxHRlBfS0VSTkVMKTsKKwllbmlfZGV2LT5mcmVlX2xpc3QgPSBrbWFsbG9jX2FycmF5KGVuaV9kZXYtPmZyZWVfbGlzdF9zaXplICsgMSwKKwkJCQkJICAgc2l6ZW9mKCplbmlfZGV2LT5mcmVlX2xpc3QpLAorCQkJCQkgICBHRlBfS0VSTkVMKTsKIAlpZiAoIWVuaV9kZXYtPmZyZWVfbGlzdCkgewogCQlwcmludGsoS0VSTl9FUlIgREVWX0xBQkVMICIoaXRmICVkKTogY291bGRuJ3QgZ2V0IGZyZWUgcGFnZVxuIiwKIAkJICAgIGRldi0+bnVtYmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL2ZvcmUyMDBlLmMgYi9kcml2ZXJzL2F0bS9mb3JlMjAwZS5jCmluZGV4IDc1ZGRlOTAuLjgxYWFhNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2ZvcmUyMDBlLmMKKysrIGIvZHJpdmVycy9hdG0vZm9yZTIwMGUuYwpAQCAtMjQ4OSw3ICsyNDg5LDcgQEAKIHsKICAgICBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZpcm13YXJlOwogICAgIHN0cnVjdCBkZXZpY2UgKmRldmljZTsKLSAgICBzdHJ1Y3QgZndfaGVhZGVyICpmd19oZWFkZXI7CisgICAgY29uc3Qgc3RydWN0IGZ3X2hlYWRlciAqZndfaGVhZGVyOwogICAgIGNvbnN0IF9fbGUzMiAqZndfZGF0YTsKICAgICB1MzIgZndfc2l6ZTsKICAgICB1MzIgX19pb21lbSAqbG9hZF9hZGRyOwpAQCAtMjUxMSw5ICsyNTExLDkgQEAKIAlyZXR1cm4gZXJyOwogICAgIH0KIAotICAgIGZ3X2RhdGEgPSAoX19sZTMyICopIGZpcm13YXJlLT5kYXRhOworICAgIGZ3X2RhdGEgPSAoY29uc3QgX19sZTMyICopZmlybXdhcmUtPmRhdGE7CiAgICAgZndfc2l6ZSA9IGZpcm13YXJlLT5zaXplIC8gc2l6ZW9mKHUzMik7Ci0gICAgZndfaGVhZGVyID0gKHN0cnVjdCBmd19oZWFkZXIgKikgZmlybXdhcmUtPmRhdGE7CisgICAgZndfaGVhZGVyID0gKGNvbnN0IHN0cnVjdCBmd19oZWFkZXIgKilmaXJtd2FyZS0+ZGF0YTsKICAgICBsb2FkX2FkZHIgPSBmb3JlMjAwZS0+dmlydF9iYXNlICsgbGUzMl90b19jcHUoZndfaGVhZGVyLT5sb2FkX29mZnNldCk7CiAKICAgICBEUFJJTlRLKDIsICJkZXZpY2UgJXMgZmlybXdhcmUgYmVpbmcgbG9hZGVkIGF0IDB4JXAgKCVkIHdvcmRzKVxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRtL2hlLmMgYi9kcml2ZXJzL2F0bS9oZS5jCmluZGV4IDBmNWNiMzcuLjMxYjUxM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2hlLmMKKysrIGIvZHJpdmVycy9hdG0vaGUuYwpAQCAtNzc5LDggKzc3OSw5IEBACiAJCSAgRzBfUkJQU19CUyArIChncm91cCAqIDMyKSk7CiAKIAkvKiBiaXRtYXAgdGFibGUgKi8KLQloZV9kZXYtPnJicGxfdGFibGUgPSBrbWFsbG9jKEJJVFNfVE9fTE9OR1MoUkJQTF9UQUJMRV9TSVpFKQotCQkJCSAgICAgKiBzaXplb2YodW5zaWduZWQgbG9uZyksIEdGUF9LRVJORUwpOworCWhlX2Rldi0+cmJwbF90YWJsZSA9IGttYWxsb2NfYXJyYXkoQklUU19UT19MT05HUyhSQlBMX1RBQkxFX1NJWkUpLAorCQkJCQkgICBzaXplb2YoKmhlX2Rldi0+cmJwbF90YWJsZSksCisJCQkJCSAgIEdGUF9LRVJORUwpOwogCWlmICghaGVfZGV2LT5yYnBsX3RhYmxlKSB7CiAJCWhwcmludGsoInVuYWJsZSB0byBhbGxvY2F0ZSByYnBsIGJpdG1hcCB0YWJsZVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNzg4LDggKzc4OSw5IEBACiAJYml0bWFwX3plcm8oaGVfZGV2LT5yYnBsX3RhYmxlLCBSQlBMX1RBQkxFX1NJWkUpOwogCiAJLyogcmJwbF92aXJ0IDY0LWJpdCBwb2ludGVycyAqLwotCWhlX2Rldi0+cmJwbF92aXJ0ID0ga21hbGxvYyhSQlBMX1RBQkxFX1NJWkUKLQkJCQkgICAgKiBzaXplb2Yoc3RydWN0IGhlX2J1ZmYgKiksIEdGUF9LRVJORUwpOworCWhlX2Rldi0+cmJwbF92aXJ0ID0ga21hbGxvY19hcnJheShSQlBMX1RBQkxFX1NJWkUsCisJCQkJCSAgc2l6ZW9mKCpoZV9kZXYtPnJicGxfdmlydCksCisJCQkJCSAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFoZV9kZXYtPnJicGxfdmlydCkgewogCQlocHJpbnRrKCJ1bmFibGUgdG8gYWxsb2NhdGUgcmJwbCB2aXJ0IHRhYmxlXG4iKTsKIAkJZ290byBvdXRfZnJlZV9yYnBsX3RhYmxlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vaXBoYXNlLmMgYi9kcml2ZXJzL2F0bS9pcGhhc2UuYwppbmRleCA4MDlkZDFlLi5iMjc1Njc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9pcGhhc2UuYworKysgYi9kcml2ZXJzL2F0bS9pcGhhc2UuYwpAQCAtMTg4NSw5ICsxODg1LDkgQEAKICAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGlhX2Nicl9zZXR1cCAoaWFkZXYsIHZjYykpIDwgMCkgeyAgICAgCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgIH0gCi0JZWxzZSAgCi0gICAgICAgICAgIHByaW50aygiaWFkZXY6ICBOb24gVUJSLCBBQlIgYW5kIENCUiB0cmFmZmljIG5vdCBzdXBwb3J0ZWRuIik7IAorCX0gZWxzZSB7CisJCXByaW50aygiaWFkZXY6ICBOb24gVUJSLCBBQlIgYW5kIENCUiB0cmFmZmljIG5vdCBzdXBwb3J0ZWRcbiIpOworCX0KICAgICAgICAgCiAgICAgICAgIGlhZGV2LT50ZXN0VGFibGVbdmNjLT52Y2ldLT52Y19zdGF0dXMgfD0gVkNfQUNUSVZFOwogCUlGX0VWRU5UKHByaW50aygiaWEgb3Blbl90eCByZXR1cm5pbmcgXG4iKTspICAKQEAgLTE5NzUsNyArMTk3NSw5IEBACiAJCWJ1Zl9kZXNjX3B0cisrOwkJICAKIAkJdHhfcGt0X3N0YXJ0ICs9IGlhZGV2LT50eF9idWZfc3o7ICAKIAl9ICAKLSAgICAgICAgaWFkZXYtPnR4X2J1ZiA9IGttYWxsb2MoaWFkZXYtPm51bV90eF9kZXNjKnNpemVvZihzdHJ1Y3QgY3Bjc190cmFpbGVyX2Rlc2MpLCBHRlBfS0VSTkVMKTsKKwlpYWRldi0+dHhfYnVmID0ga21hbGxvY19hcnJheShpYWRldi0+bnVtX3R4X2Rlc2MsCisJCQkJICAgICAgc2l6ZW9mKCppYWRldi0+dHhfYnVmKSwKKwkJCQkgICAgICBHRlBfS0VSTkVMKTsKICAgICAgICAgaWYgKCFpYWRldi0+dHhfYnVmKSB7CiAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgREVWX0xBQkVMICIgY291bGRuJ3QgZ2V0IG1lbVxuIik7CiAJICAgIGdvdG8gZXJyX2ZyZWVfZGxlOwpAQCAtMTk5NSw4ICsxOTk3LDkgQEAKIAkJCQkJCSAgICAgICBzaXplb2YoKmNwY3MpLAogCQkJCQkJICAgICAgIERNQV9UT19ERVZJQ0UpOwogICAgICAgICB9Ci0gICAgICAgIGlhZGV2LT5kZXNjX3RibCA9IGttYWxsb2MoaWFkZXYtPm51bV90eF9kZXNjICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBkZXNjX3RibF90KSwgR0ZQX0tFUk5FTCk7CisJaWFkZXYtPmRlc2NfdGJsID0ga21hbGxvY19hcnJheShpYWRldi0+bnVtX3R4X2Rlc2MsCisJCQkJCXNpemVvZigqaWFkZXYtPmRlc2NfdGJsKSwKKwkJCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFpYWRldi0+ZGVzY190YmwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIERFVl9MQUJFTCAiIGNvdWxkbid0IGdldCBtZW1cbiIpOwogCQlnb3RvIGVycl9mcmVlX2FsbF90eF9idWZzOwpAQCAtMjEyNCw3ICsyMTI3LDkgQEAKIAltZW1zZXQoKGNhZGRyX3QpKGlhZGV2LT5zZWdfcmFtK2kpLCAgMCwgaWFkZXYtPm51bV92Yyo0KTsKIAl2YyA9IChzdHJ1Y3QgbWFpbl92YyAqKWlhZGV2LT5NQUlOX1ZDX1RBQkxFX0FERFI7ICAKIAlldmMgPSAoc3RydWN0IGV4dF92YyAqKWlhZGV2LT5FWFRfVkNfVEFCTEVfQUREUjsgIAotICAgICAgICBpYWRldi0+dGVzdFRhYmxlID0ga21hbGxvYyhzaXplb2YobG9uZykqaWFkZXYtPm51bV92YywgR0ZQX0tFUk5FTCk7IAorCWlhZGV2LT50ZXN0VGFibGUgPSBrbWFsbG9jX2FycmF5KGlhZGV2LT5udW1fdmMsCisJCQkJCSBzaXplb2YoKmlhZGV2LT50ZXN0VGFibGUpLAorCQkJCQkgR0ZQX0tFUk5FTCk7CiAgICAgICAgIGlmICghaWFkZXYtPnRlc3RUYWJsZSkgewogICAgICAgICAgICBwcmludGsoIkdldCBmcmVlcGFnZSAgZmFpbGVkXG4iKTsKIAkgICBnb3RvIGVycl9mcmVlX2Rlc2NfdGJsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vbmljc3Rhci5jIGIvZHJpdmVycy9hdG0vbmljc3Rhci5jCmluZGV4IDcwMGVkMTUuLmM3Mjk2YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL25pY3N0YXIuYworKysgYi9kcml2ZXJzL2F0bS9uaWNzdGFyLmMKQEAgLTM3MCw3ICszNzAsOCBAQAogCQlyZXR1cm4gZXJyb3I7CiAgICAgICAgIH0KIAotCWlmICgoY2FyZCA9IGttYWxsb2Moc2l6ZW9mKG5zX2RldiksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJY2FyZCA9IGttYWxsb2Moc2l6ZW9mKCpjYXJkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjYXJkKSB7CiAJCXByaW50awogCQkgICAgKCJuaWNzdGFyJWQ6IGNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgZGV2aWNlIHN0cnVjdHVyZS5cbiIsCiAJCSAgICAgaSk7CkBAIC02MTEsNyArNjEyLDcgQEAKIAlmb3IgKGogPSAwOyBqIDwgY2FyZC0+cmN0X3NpemU7IGorKykKIAkJbnNfd3JpdGVfc3JhbShjYXJkLCBqICogNCwgdTMyZCwgNCk7CiAKLQltZW1zZXQoY2FyZC0+dmNtYXAsIDAsIE5TX01BWF9SQ1RTSVpFICogc2l6ZW9mKHZjX21hcCkpOworCW1lbXNldChjYXJkLT52Y21hcCwgMCwgc2l6ZW9mKGNhcmQtPnZjbWFwKSk7CiAKIAlmb3IgKGogPSAwOyBqIDwgTlNfRlJTQ0RfTlVNOyBqKyspCiAJCWNhcmQtPnNjZDJ2Y1tqXSA9IE5VTEw7CkBAIC04NjIsNyArODYzLDcgQEAKIAlpZiAoc2l6ZSAhPSBWQlJfU0NRU0laRSAmJiBzaXplICE9IENCUl9TQ1FTSVpFKQogCQlyZXR1cm4gTlVMTDsKIAotCXNjcSA9IGttYWxsb2Moc2l6ZW9mKHNjcV9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJc2NxID0ga21hbGxvYyhzaXplb2YoKnNjcSksIEdGUF9LRVJORUwpOwogCWlmICghc2NxKQogCQlyZXR1cm4gTlVMTDsKICAgICAgICAgc2NxLT5vcmcgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmNhcmQtPnBjaWRldi0+ZGV2LApAQCAtODcxLDggKzg3Miw5IEBACiAJCWtmcmVlKHNjcSk7CiAJCXJldHVybiBOVUxMOwogCX0KLQlzY3EtPnNrYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBza19idWZmICopICoKLQkJCSAgIChzaXplIC8gTlNfU0NRRV9TSVpFKSwgR0ZQX0tFUk5FTCk7CisJc2NxLT5za2IgPSBrbWFsbG9jX2FycmF5KHNpemUgLyBOU19TQ1FFX1NJWkUsCisJCQkJIHNpemVvZigqc2NxLT5za2IpLAorCQkJCSBHRlBfS0VSTkVMKTsKIAlpZiAoIXNjcS0+c2tiKSB7CiAJCWRtYV9mcmVlX2NvaGVyZW50KCZjYXJkLT5wY2lkZXYtPmRldiwKIAkJCQkgIDIgKiBzaXplLCBzY3EtPm9yZywgc2NxLT5kbWEpOwpAQCAtMjAyMSw3ICsyMDIzLDggQEAKIAogCQljZWxsID0gc2tiLT5kYXRhOwogCQlmb3IgKGkgPSBuc19yc3FlX2NlbGxjb3VudChyc3FlKTsgaTsgaS0tKSB7Ci0JCQlpZiAoKHNiID0gZGV2X2FsbG9jX3NrYihOU19TTVNLQlNJWkUpKSA9PSBOVUxMKSB7CisJCQlzYiA9IGRldl9hbGxvY19za2IoTlNfU01TS0JTSVpFKTsKKwkJCWlmICghc2IpIHsKIAkJCQlwcmludGsKIAkJCQkgICAgKCJuaWNzdGFyJWQ6IENhbid0IGFsbG9jYXRlIGJ1ZmZlcnMgZm9yIGFhbDAuXG4iLAogCQkJCSAgICAgY2FyZC0+aW5kZXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vemF0bS5jIGIvZHJpdmVycy9hdG0vemF0bS5jCmluZGV4IGNlY2ZiOTQuLmQzZGM5NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL3phdG0uYworKysgYi9kcml2ZXJzL2F0bS96YXRtLmMKQEAgLTU5OCwxMiArNTk4LDEzIEBACiBzdGF0aWMgaW50IHN0YXJ0X3J4KHN0cnVjdCBhdG1fZGV2ICpkZXYpCiB7CiAJc3RydWN0IHphdG1fZGV2ICp6YXRtX2RldjsKLQlpbnQgc2l6ZSxpOworCWludCBpOwogCi1EUFJJTlRLKCJzdGFydF9yeFxuIik7CisJRFBSSU5USygic3RhcnRfcnhcbiIpOwogCXphdG1fZGV2ID0gWkFUTV9ERVYoZGV2KTsKLQlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdG1fdmNjICopKnphdG1fZGV2LT5jaGFuczsKLQl6YXRtX2Rldi0+cnhfbWFwID0gIGt6YWxsb2Moc2l6ZSxHRlBfS0VSTkVMKTsKKwl6YXRtX2Rldi0+cnhfbWFwID0ga2NhbGxvYyh6YXRtX2Rldi0+Y2hhbnMsCisJCQkJICAgc2l6ZW9mKCp6YXRtX2Rldi0+cnhfbWFwKSwKKwkJCQkgICBHRlBfS0VSTkVMKTsKIAlpZiAoIXphdG1fZGV2LT5yeF9tYXApIHJldHVybiAtRU5PTUVNOwogCS8qIHNldCBWUEkvVkNJIHNwbGl0ICh1c2UgYWxsIFZDSXMgYW5kIGdpdmUgd2hhdCdzIGxlZnQgdG8gVlBJcykgKi8KIAl6cG9rZWwoemF0bV9kZXYsKDEgPDwgZGV2LT5jaV9yYW5nZS52Y2lfYml0cyktMSx1UEQ5ODQwMV9WUlIpOwpAQCAtOTk4LDggKzk5OSw5IEBACiAKIAlEUFJJTlRLKCJzdGFydF90eFxuIik7CiAJemF0bV9kZXYgPSBaQVRNX0RFVihkZXYpOwotCXphdG1fZGV2LT50eF9tYXAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXRtX3ZjYyAqKSoKLQkgICAgemF0bV9kZXYtPmNoYW5zLEdGUF9LRVJORUwpOworCXphdG1fZGV2LT50eF9tYXAgPSBrbWFsbG9jX2FycmF5KHphdG1fZGV2LT5jaGFucywKKwkJCQkJIHNpemVvZigqemF0bV9kZXYtPnR4X21hcCksCisJCQkJCSBHRlBfS0VSTkVMKTsKIAlpZiAoIXphdG1fZGV2LT50eF9tYXApIHJldHVybiAtRU5PTUVNOwogCXphdG1fZGV2LT50eF9idyA9IEFUTV9PQzNfUENSOwogCXphdG1fZGV2LT5mcmVlX3NoYXBlcnMgPSAoMSA8PCBOUl9TSEFQRVJTKS0xOwpAQCAtMTM5OCw3ICsxNDAwLDcgQEAKIAlEUFJJTlRLKERFVl9MQUJFTCAiKGl0ZiAlZCk6IG9wZW4gJWQuJWRcbiIsdmNjLT5kZXYtPm51bWJlcix2Y2MtPnZwaSwKIAkgICAgdmNjLT52Y2kpOwogCWlmICghdGVzdF9iaXQoQVRNX1ZGX1BBUlRJQUwsJnZjYy0+ZmxhZ3MpKSB7Ci0JCXphdG1fdmNjID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHphdG1fdmNjKSxHRlBfS0VSTkVMKTsKKwkJemF0bV92Y2MgPSBrbWFsbG9jKHNpemVvZigqemF0bV92Y2MpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF6YXRtX3ZjYykgewogCQkJY2xlYXJfYml0KEFUTV9WRl9BRERSLCZ2Y2MtPmZsYWdzKTsKIAkJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL0tjb25maWcgYi9kcml2ZXJzL2Jhc2UvS2NvbmZpZwppbmRleCA5ODUwNGVjLi5mZGY0NGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvS2NvbmZpZworKysgYi9kcml2ZXJzL2Jhc2UvS2NvbmZpZwpAQCAtMjEyLDYgKzIxMiwxNiBAQAogCiAJICBJZiB5b3UgYXJlIHVuc3VyZSBhYm91dCB0aGlzLCBTYXkgTiBoZXJlLgogCitjb25maWcgREVCVUdfVEVTVF9EUklWRVJfUkVNT1ZFCisJYm9vbCAiVGVzdCBkcml2ZXIgcmVtb3ZlIGNhbGxzIGR1cmluZyBwcm9iZSIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdGhlIERyaXZlciBjb3JlIHRvIHRlc3QgZHJpdmVyIHJlbW92ZSBmdW5jdGlvbnMKKwkgIGJ5IGNhbGxpbmcgcHJvYmUsIHJlbW92ZSwgcHJvYmUuIFRoaXMgdGVzdHMgdGhlIHJlbW92ZSBwYXRoIHdpdGhvdXQKKwkgIGhhdmluZyB0byB1bmJpbmQgdGhlIGRyaXZlciBvciB1bmxvYWQgdGhlIGRyaXZlciBtb2R1bGUuCisKKwkgIElmIHlvdSBhcmUgdW5zdXJlIGFib3V0IHRoaXMsIHNheSBOIGhlcmUuCisKIGNvbmZpZyBTWVNfSFlQRVJWSVNPUgogCWJvb2wKIAlkZWZhdWx0IG4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9hdHRyaWJ1dGVfY29udGFpbmVyLmMgYi9kcml2ZXJzL2Jhc2UvYXR0cmlidXRlX2NvbnRhaW5lci5jCmluZGV4IDJiYTRjYWMuLjk1ZTNlZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9hdHRyaWJ1dGVfY29udGFpbmVyLmMKKysrIGIvZHJpdmVycy9iYXNlL2F0dHJpYnV0ZV9jb250YWluZXIuYwpAQCAtMjQzLDcgKzI0Myw3IEBACiAgKiBAZGV2OiAgVGhlIGdlbmVyaWMgZGV2aWNlIHRvIHJ1biB0aGUgdHJpZ2dlciBmb3IKICAqIEBmbgkgIHRoZSBmdW5jdGlvbiB0byBleGVjdXRlIGZvciBlYWNoIGNsYXNzZGV2LgogICoKLSAqIFRoaXMgZnVuY2lvbiBpcyBmb3IgZXhlY3V0aW5nIGEgdHJpZ2dlciB3aGVuIHlvdSBuZWVkIHRvIGtub3cgYm90aAorICogVGhpcyBmdW5jdGlvbiBpcyBmb3IgZXhlY3V0aW5nIGEgdHJpZ2dlciB3aGVuIHlvdSBuZWVkIHRvIGtub3cgYm90aAogICogdGhlIGNvbnRhaW5lciBhbmQgdGhlIGNsYXNzZGV2LiAgSWYgeW91IG9ubHkgY2FyZSBhYm91dCB0aGUKICAqIGNvbnRhaW5lciwgdGhlbiB1c2UgYXR0cmlidXRlX2NvbnRhaW5lcl90cmlnZ2VyKCkgaW5zdGVhZC4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2NvcmUuYyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKaW5kZXggMGE4YmRhZC4uY2UwNTdhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2NvcmUuYworKysgYi9kcml2ZXJzL2Jhc2UvY29yZS5jCkBAIC04MzYsMTEgKzgzNiwyOSBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgbGl2ZV9pbl9nbHVlX2RpcihzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICAgc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmICgha29iaiB8fCAhZGV2LT5jbGFzcyB8fAorCSAgICBrb2JqLT5rc2V0ICE9ICZkZXYtPmNsYXNzLT5wLT5nbHVlX2RpcnMpCisJCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qga29iamVjdCAqZ2V0X2dsdWVfZGlyKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGV2LT5rb2JqLnBhcmVudDsKK30KKworLyoKKyAqIG1ha2Ugc3VyZSBjbGVhbmluZyB1cCBkaXIgYXMgdGhlIGxhc3Qgc3RlcCwgd2UgbmVlZCB0byBtYWtlCisgKiBzdXJlIC5yZWxlYXNlIGhhbmRsZXIgb2Yga29iamVjdCBpcyBydW4gd2l0aCBob2xkaW5nIHRoZQorICogZ2xvYmFsIGxvY2sKKyAqLwogc3RhdGljIHZvaWQgY2xlYW51cF9nbHVlX2RpcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBrb2JqZWN0ICpnbHVlX2RpcikKIHsKIAkvKiBzZWUgaWYgd2UgbGl2ZSBpbiBhICJnbHVlIiBkaXJlY3RvcnkgKi8KLQlpZiAoIWdsdWVfZGlyIHx8ICFkZXYtPmNsYXNzIHx8Ci0JICAgIGdsdWVfZGlyLT5rc2V0ICE9ICZkZXYtPmNsYXNzLT5wLT5nbHVlX2RpcnMpCisJaWYgKCFsaXZlX2luX2dsdWVfZGlyKGdsdWVfZGlyLCBkZXYpKQogCQlyZXR1cm47CiAKIAltdXRleF9sb2NrKCZnZHBfbXV0ZXgpOwpAQCAtODQ4LDExICs4NjYsNiBAQAogCW11dGV4X3VubG9jaygmZ2RwX211dGV4KTsKIH0KIAotc3RhdGljIHZvaWQgY2xlYW51cF9kZXZpY2VfcGFyZW50KHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQljbGVhbnVwX2dsdWVfZGlyKGRldiwgZGV2LT5rb2JqLnBhcmVudCk7Ci19Ci0KIHN0YXRpYyBpbnQgZGV2aWNlX2FkZF9jbGFzc19zeW1saW5rcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlID0gZGV2X29mX25vZGUoZGV2KTsKQEAgLTEwMjgsNiArMTA0MSw3IEBACiAJc3RydWN0IGtvYmplY3QgKmtvYmo7CiAJc3RydWN0IGNsYXNzX2ludGVyZmFjZSAqY2xhc3NfaW50ZjsKIAlpbnQgZXJyb3IgPSAtRUlOVkFMOworCXN0cnVjdCBrb2JqZWN0ICpnbHVlX2RpciA9IE5VTEw7CiAKIAlkZXYgPSBnZXRfZGV2aWNlKGRldik7CiAJaWYgKCFkZXYpCkBAIC0xMDcyLDggKzEwODYsMTAgQEAKIAkvKiBmaXJzdCwgcmVnaXN0ZXIgd2l0aCBnZW5lcmljIGxheWVyLiAqLwogCS8qIHdlIHJlcXVpcmUgdGhlIG5hbWUgdG8gYmUgc2V0IGJlZm9yZSwgYW5kIHBhc3MgTlVMTCAqLwogCWVycm9yID0ga29iamVjdF9hZGQoJmRldi0+a29iaiwgZGV2LT5rb2JqLnBhcmVudCwgTlVMTCk7Ci0JaWYgKGVycm9yKQorCWlmIChlcnJvcikgeworCQlnbHVlX2RpciA9IGdldF9nbHVlX2RpcihkZXYpOwogCQlnb3RvIEVycm9yOworCX0KIAogCS8qIG5vdGlmeSBwbGF0Zm9ybSBvZiBkZXZpY2UgZW50cnkgKi8KIAlpZiAocGxhdGZvcm1fbm90aWZ5KQpAQCAtMTE1NCw5ICsxMTcwLDEwIEBACiAJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX3VldmVudCk7CiAgYXR0ckVycm9yOgogCWtvYmplY3RfdWV2ZW50KCZkZXYtPmtvYmosIEtPQkpfUkVNT1ZFKTsKKwlnbHVlX2RpciA9IGdldF9nbHVlX2RpcihkZXYpOwogCWtvYmplY3RfZGVsKCZkZXYtPmtvYmopOwogIEVycm9yOgotCWNsZWFudXBfZGV2aWNlX3BhcmVudChkZXYpOworCWNsZWFudXBfZ2x1ZV9kaXIoZGV2LCBnbHVlX2Rpcik7CiAJcHV0X2RldmljZShwYXJlbnQpOwogbmFtZV9lcnJvcjoKIAlrZnJlZShkZXYtPnApOwpAQCAtMTIzMiw2ICsxMjQ5LDcgQEAKIHZvaWQgZGV2aWNlX2RlbChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRldmljZSAqcGFyZW50ID0gZGV2LT5wYXJlbnQ7CisJc3RydWN0IGtvYmplY3QgKmdsdWVfZGlyID0gTlVMTDsKIAlzdHJ1Y3QgY2xhc3NfaW50ZXJmYWNlICpjbGFzc19pbnRmOwogCiAJLyogTm90aWZ5IGNsaWVudHMgb2YgZGV2aWNlIHJlbW92YWwuICBUaGlzIGNhbGwgbXVzdCBjb21lCkBAIC0xMjY2LDYgKzEyODQsNyBAQAogCWJ1c19yZW1vdmVfZGV2aWNlKGRldik7CiAJZGV2aWNlX3BtX3JlbW92ZShkZXYpOwogCWRyaXZlcl9kZWZlcnJlZF9wcm9iZV9kZWwoZGV2KTsKKwlkZXZpY2VfcmVtb3ZlX3Byb3BlcnRpZXMoZGV2KTsKIAogCS8qIE5vdGlmeSB0aGUgcGxhdGZvcm0gb2YgdGhlIHJlbW92YWwsIGluIGNhc2UgdGhleQogCSAqIG5lZWQgdG8gZG8gYW55dGhpbmcuLi4KQEAgLTEyNzYsOCArMTI5NSw5IEBACiAJCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmRldi0+YnVzLT5wLT5idXNfbm90aWZpZXIsCiAJCQkJCSAgICAgQlVTX05PVElGWV9SRU1PVkVEX0RFVklDRSwgZGV2KTsKIAlrb2JqZWN0X3VldmVudCgmZGV2LT5rb2JqLCBLT0JKX1JFTU9WRSk7Ci0JY2xlYW51cF9kZXZpY2VfcGFyZW50KGRldik7CisJZ2x1ZV9kaXIgPSBnZXRfZ2x1ZV9kaXIoZGV2KTsKIAlrb2JqZWN0X2RlbCgmZGV2LT5rb2JqKTsKKwljbGVhbnVwX2dsdWVfZGlyKGRldiwgZ2x1ZV9kaXIpOwogCXB1dF9kZXZpY2UocGFyZW50KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRldmljZV9kZWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2NwdS5jIGIvZHJpdmVycy9iYXNlL2NwdS5jCmluZGV4IDY5MWVlZWEuLjRjMjhlMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9jcHUuYworKysgYi9kcml2ZXJzL2Jhc2UvY3B1LmMKQEAgLTM3MSwxMiArMzcxLDEzIEBACiAJaWYgKGNwdS0+aG90cGx1Z2dhYmxlKQogCQljcHUtPmRldi5ncm91cHMgPSBob3RwbHVnYWJsZV9jcHVfYXR0cl9ncm91cHM7CiAJZXJyb3IgPSBkZXZpY2VfcmVnaXN0ZXIoJmNwdS0+ZGV2KTsKLQlpZiAoIWVycm9yKQotCQlwZXJfY3B1KGNwdV9zeXNfZGV2aWNlcywgbnVtKSA9ICZjcHUtPmRldjsKLQlpZiAoIWVycm9yKQotCQlyZWdpc3Rlcl9jcHVfdW5kZXJfbm9kZShudW0sIGNwdV90b19ub2RlKG51bSkpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOwogCi0JcmV0dXJuIGVycm9yOworCXBlcl9jcHUoY3B1X3N5c19kZXZpY2VzLCBudW0pID0gJmNwdS0+ZGV2OworCXJlZ2lzdGVyX2NwdV91bmRlcl9ub2RlKG51bSwgY3B1X3RvX25vZGUobnVtKSk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RydWN0IGRldmljZSAqZ2V0X2NwdV9kZXZpY2UodW5zaWduZWQgY3B1KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2RkLmMgYi9kcml2ZXJzL2Jhc2UvZGQuYwppbmRleCAxNjY4OGY1Li5kMjJhNzI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZGQuYworKysgYi9kcml2ZXJzL2Jhc2UvZGQuYwpAQCAtNTEsNyArNTEsNiBAQAogc3RhdGljIERFRklORV9NVVRFWChkZWZlcnJlZF9wcm9iZV9tdXRleCk7CiBzdGF0aWMgTElTVF9IRUFEKGRlZmVycmVkX3Byb2JlX3BlbmRpbmdfbGlzdCk7CiBzdGF0aWMgTElTVF9IRUFEKGRlZmVycmVkX3Byb2JlX2FjdGl2ZV9saXN0KTsKLXN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqZGVmZXJyZWRfd3E7CiBzdGF0aWMgYXRvbWljX3QgZGVmZXJyZWRfdHJpZ2dlcl9jb3VudCA9IEFUT01JQ19JTklUKDApOwogCiAvKgpAQCAtMTc1LDcgKzE3NCw3IEBACiAJICogS2ljayB0aGUgcmUtcHJvYmUgdGhyZWFkLiAgSXQgbWF5IGFscmVhZHkgYmUgc2NoZWR1bGVkLCBidXQgaXQgaXMKIAkgKiBzYWZlIHRvIGtpY2sgaXQgYWdhaW4uCiAJICovCi0JcXVldWVfd29yayhkZWZlcnJlZF93cSwgJmRlZmVycmVkX3Byb2JlX3dvcmspOworCXNjaGVkdWxlX3dvcmsoJmRlZmVycmVkX3Byb2JlX3dvcmspOwogfQogCiAvKioKQEAgLTIxMSwxNCArMjEwLDEwIEBACiAgKi8KIHN0YXRpYyBpbnQgZGVmZXJyZWRfcHJvYmVfaW5pdGNhbGwodm9pZCkKIHsKLQlkZWZlcnJlZF93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJkZWZlcndxIik7Ci0JaWYgKFdBUk5fT04oIWRlZmVycmVkX3dxKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAlkcml2ZXJfZGVmZXJyZWRfcHJvYmVfZW5hYmxlID0gdHJ1ZTsKIAlkcml2ZXJfZGVmZXJyZWRfcHJvYmVfdHJpZ2dlcigpOwogCS8qIFNvcnQgYXMgbWFueSBkZXBlbmRlbmNpZXMgYXMgcG9zc2libGUgYmVmb3JlIGV4aXRpbmcgaW5pdGNhbGxzICovCi0JZmx1c2hfd29ya3F1ZXVlKGRlZmVycmVkX3dxKTsKKwlmbHVzaF93b3JrKCZkZWZlcnJlZF9wcm9iZV93b3JrKTsKIAlyZXR1cm4gMDsKIH0KIGxhdGVfaW5pdGNhbGwoZGVmZXJyZWRfcHJvYmVfaW5pdGNhbGwpOwpAQCAtMzI5LDYgKzMyNCw3IEBACiB7CiAJaW50IHJldCA9IC1FUFJPQkVfREVGRVI7CiAJaW50IGxvY2FsX3RyaWdnZXJfY291bnQgPSBhdG9taWNfcmVhZCgmZGVmZXJyZWRfdHJpZ2dlcl9jb3VudCk7CisJYm9vbCB0ZXN0X3JlbW92ZSA9IElTX0VOQUJMRUQoQ09ORklHX0RFQlVHX1RFU1RfRFJJVkVSX1JFTU9WRSk7CiAKIAlpZiAoZGVmZXJfYWxsX3Byb2JlcykgewogCQkvKgpAQCAtMzQ2LDYgKzM0Miw3IEBACiAJCSBkcnYtPmJ1cy0+bmFtZSwgX19mdW5jX18sIGRydi0+bmFtZSwgZGV2X25hbWUoZGV2KSk7CiAJV0FSTl9PTighbGlzdF9lbXB0eSgmZGV2LT5kZXZyZXNfaGVhZCkpOwogCityZV9wcm9iZToKIAlkZXYtPmRyaXZlciA9IGRydjsKIAogCS8qIElmIHVzaW5nIHBpbmN0cmwsIGJpbmQgcGlucyBub3cgYmVmb3JlIHByb2JpbmcgKi8KQEAgLTM4Myw2ICszODAsMjUgQEAKIAkJCWdvdG8gcHJvYmVfZmFpbGVkOwogCX0KIAorCWlmICh0ZXN0X3JlbW92ZSkgeworCQl0ZXN0X3JlbW92ZSA9IGZhbHNlOworCisJCWlmIChkZXYtPmJ1cyAmJiBkZXYtPmJ1cy0+cmVtb3ZlKQorCQkJZGV2LT5idXMtPnJlbW92ZShkZXYpOworCQllbHNlIGlmIChkcnYtPnJlbW92ZSkKKwkJCWRydi0+cmVtb3ZlKGRldik7CisKKwkJZGV2cmVzX3JlbGVhc2VfYWxsKGRldik7CisJCWRyaXZlcl9zeXNmc19yZW1vdmUoZGV2KTsKKwkJZGV2LT5kcml2ZXIgPSBOVUxMOworCQlkZXZfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKKwkJaWYgKGRldi0+cG1fZG9tYWluICYmIGRldi0+cG1fZG9tYWluLT5kaXNtaXNzKQorCQkJZGV2LT5wbV9kb21haW4tPmRpc21pc3MoZGV2KTsKKwkJcG1fcnVudGltZV9yZWluaXQoZGV2KTsKKworCQlnb3RvIHJlX3Byb2JlOworCX0KKwogCXBpbmN0cmxfaW5pdF9kb25lKGRldik7CiAKIAlpZiAoZGV2LT5wbV9kb21haW4gJiYgZGV2LT5wbV9kb21haW4tPnN5bmMpCkBAIC00NjAsOCArNDc2LDcgQEAKIHZvaWQgd2FpdF9mb3JfZGV2aWNlX3Byb2JlKHZvaWQpCiB7CiAJLyogd2FpdCBmb3IgdGhlIGRlZmVycmVkIHByb2JlIHdvcmtxdWV1ZSB0byBmaW5pc2ggKi8KLQlpZiAoZHJpdmVyX2RlZmVycmVkX3Byb2JlX2VuYWJsZSkKLQkJZmx1c2hfd29ya3F1ZXVlKGRlZmVycmVkX3dxKTsKKwlmbHVzaF93b3JrKCZkZWZlcnJlZF9wcm9iZV93b3JrKTsKIAogCS8qIHdhaXQgZm9yIHRoZSBrbm93biBkZXZpY2VzIHRvIGNvbXBsZXRlIHRoZWlyIHByb2JpbmcgKi8KIAl3YWl0X2V2ZW50KHByb2JlX3dhaXRxdWV1ZSwgYXRvbWljX3JlYWQoJnByb2JlX2NvdW50KSA9PSAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kbWEtY29oZXJlbnQuYyBiL2RyaXZlcnMvYmFzZS9kbWEtY29oZXJlbnQuYwppbmRleCBiZGYyOGY3Li42NDBhN2U2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZG1hLWNvaGVyZW50LmMKKysrIGIvZHJpdmVycy9iYXNlL2RtYS1jb2hlcmVudC5jCkBAIC0xNjUsNiArMTY1LDcgQEAKIAlpbnQgb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcGFnZW5vOworCWludCBkbWFfbWVtb3J5X21hcDsKIAogCWlmICghZGV2KQogCQlyZXR1cm4gMDsKQEAgLTE4NywxMSArMTg4LDEyIEBACiAJICovCiAJKmRtYV9oYW5kbGUgPSBtZW0tPmRldmljZV9iYXNlICsgKHBhZ2VubyA8PCBQQUdFX1NISUZUKTsKIAkqcmV0ID0gbWVtLT52aXJ0X2Jhc2UgKyAocGFnZW5vIDw8IFBBR0VfU0hJRlQpOwotCWlmIChtZW0tPmZsYWdzICYgRE1BX01FTU9SWV9NQVApCisJZG1hX21lbW9yeV9tYXAgPSAobWVtLT5mbGFncyAmIERNQV9NRU1PUllfTUFQKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZW0tPnNwaW5sb2NrLCBmbGFncyk7CisJaWYgKGRtYV9tZW1vcnlfbWFwKQogCQltZW1zZXQoKnJldCwgMCwgc2l6ZSk7CiAJZWxzZQogCQltZW1zZXRfaW8oKnJldCwgMCwgc2l6ZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWVtLT5zcGlubG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIDE7CiAKQEAgLTI2MSw4ICsyNjMsOCBAQAogCQkgICAobWVtLT52aXJ0X2Jhc2UgKyAobWVtLT5zaXplIDw8IFBBR0VfU0hJRlQpKSkgewogCQl1bnNpZ25lZCBsb25nIG9mZiA9IHZtYS0+dm1fcGdvZmY7CiAJCWludCBzdGFydCA9ICh2YWRkciAtIG1lbS0+dmlydF9iYXNlKSA+PiBQQUdFX1NISUZUOwotCQlpbnQgdXNlcl9jb3VudCA9ICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpID4+IFBBR0VfU0hJRlQ7Ci0JCWludCBjb3VudCA9IHNpemUgPj4gUEFHRV9TSElGVDsKKwkJaW50IHVzZXJfY291bnQgPSB2bWFfcGFnZXModm1hKTsKKwkJaW50IGNvdW50ID0gUEFHRV9BTElHTihzaXplKSA+PiBQQUdFX1NISUZUOwogCiAJCSpyZXQgPSAtRU5YSU87CiAJCWlmIChvZmYgPCBjb3VudCAmJiB1c2VyX2NvdW50IDw9IGNvdW50IC0gb2ZmKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZG1hLW1hcHBpbmcuYyBiL2RyaXZlcnMvYmFzZS9kbWEtbWFwcGluZy5jCmluZGV4IGQ3OTk2NjIuLjhmOGI2OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kbWEtbWFwcGluZy5jCisrKyBiL2RyaXZlcnMvYmFzZS9kbWEtbWFwcGluZy5jCkBAIC0xOTgsMTAgKzE5OCwxMyBAQAogCiAJcmMgPSBkbWFfZGVjbGFyZV9jb2hlcmVudF9tZW1vcnkoZGV2LCBwaHlzX2FkZHIsIGRldmljZV9hZGRyLCBzaXplLAogCQkJCQkgZmxhZ3MpOwotCWlmIChyYyA9PSAwKQorCWlmIChyYykgewogCQlkZXZyZXNfYWRkKGRldiwgcmVzKTsKLQllbHNlCisJCXJjID0gMDsKKwl9IGVsc2UgewogCQlkZXZyZXNfZnJlZShyZXMpOworCQlyYyA9IC1FTk9NRU07CisJfQogCiAJcmV0dXJuIHJjOwogfQpAQCAtMjQ3LDcgKzI1MCw3IEBACiB7CiAJaW50IHJldCA9IC1FTlhJTzsKICNpZiBkZWZpbmVkKENPTkZJR19NTVUpICYmICFkZWZpbmVkKENPTkZJR19BUkNIX05PX0NPSEVSRU5UX0RNQV9NTUFQKQotCXVuc2lnbmVkIGxvbmcgdXNlcl9jb3VudCA9ICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpID4+IFBBR0VfU0hJRlQ7CisJdW5zaWduZWQgbG9uZyB1c2VyX2NvdW50ID0gdm1hX3BhZ2VzKHZtYSk7CiAJdW5zaWduZWQgbG9uZyBjb3VudCA9IFBBR0VfQUxJR04oc2l6ZSkgPj4gUEFHRV9TSElGVDsKIAl1bnNpZ25lZCBsb25nIHBmbiA9IHBhZ2VfdG9fcGZuKHZpcnRfdG9fcGFnZShjcHVfYWRkcikpOwogCXVuc2lnbmVkIGxvbmcgb2ZmID0gdm1hLT52bV9wZ29mZjsKQEAgLTMzNCw3ICszMzcsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JdW5tYXBfa2VybmVsX3JhbmdlKCh1bnNpZ25lZCBsb25nKWNwdV9hZGRyLCBzaXplKTsKKwl1bm1hcF9rZXJuZWxfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpY3B1X2FkZHIsIFBBR0VfQUxJR04oc2l6ZSkpOwogCXZ1bm1hcChjcHVfYWRkcik7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9waW5jdHJsLmMgYi9kcml2ZXJzL2Jhc2UvcGluY3RybC5jCmluZGV4IDA3NjI5NzUuLjU5MTdiNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9waW5jdHJsLmMKKysrIGIvZHJpdmVycy9iYXNlL3BpbmN0cmwuYwpAQCAtOTEsOSArOTEsMTMgQEAKIAlkZXZtX2tmcmVlKGRldiwgZGV2LT5waW5zKTsKIAlkZXYtPnBpbnMgPSBOVUxMOwogCi0JLyogT25seSByZXR1cm4gZGVmZXJyYWxzICovCi0JaWYgKHJldCAhPSAtRVBST0JFX0RFRkVSKQotCQlyZXQgPSAwOworCS8qIFJldHVybiBkZWZlcnJhbHMgKi8KKwlpZiAocmV0ID09IC1FUFJPQkVfREVGRVIpCisJCXJldHVybiByZXQ7CisJLyogUmV0dXJuIHNlcmlvdXMgZXJyb3JzICovCisJaWYgKHJldCA9PSAtRUlOVkFMKQorCQlyZXR1cm4gcmV0OworCS8qIFdlIGlnbm9yZSBlcnJvcnMgbGlrZSAtRU5PRU5UIG1lYW5pbmcgbm8gcGluY3RybCBzdGF0ZSAqLwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS1tc2kuYyBiL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS1tc2kuYwppbmRleCAyNzllNTM5Li5iZTZhNTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0tbXNpLmMKKysrIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLW1zaS5jCkBAIC0xNDIsMTMgKzE0MiwxMiBAQAogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBudmVjOyBpKyspIHsKLQkJZGVzYyA9IGFsbG9jX21zaV9lbnRyeShkZXYpOworCQlkZXNjID0gYWxsb2NfbXNpX2VudHJ5KGRldiwgMSwgTlVMTCk7CiAJCWlmICghZGVzYykKIAkJCWJyZWFrOwogCiAJCWRlc2MtPnBsYXRmb3JtLm1zaV9wcml2X2RhdGEgPSBkYXRhOwogCQlkZXNjLT5wbGF0Zm9ybS5tc2lfaW5kZXggPSBiYXNlICsgaTsKLQkJZGVzYy0+bnZlY191c2VkID0gMTsKIAkJZGVzYy0+aXJxID0gdmlycSA/IHZpcnEgKyBpIDogMDsKIAogCQlsaXN0X2FkZF90YWlsKCZkZXNjLT5saXN0LCBkZXZfdG9fbXNpX2xpc3QoZGV2KSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYyBiL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCmluZGV4IDY0ODJkNDcuLmM0YWYwMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCkBAIC05Nyw3ICs5Nyw3IEBACiAJCWludCByZXQ7CiAKIAkJcmV0ID0gb2ZfaXJxX2dldChkZXYtPmRldi5vZl9ub2RlLCBudW0pOwotCQlpZiAocmV0ID49IDAgfHwgcmV0ID09IC1FUFJPQkVfREVGRVIpCisJCWlmIChyZXQgPiAwIHx8IHJldCA9PSAtRVBST0JFX0RFRkVSKQogCQkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTEwOCw5ICsxMDgsMTQgQEAKIAkgKiBJT1JFU09VUkNFX0JJVFMgY29ycmVzcG9uZCAxLXRvLTEgdG8gdGhlIElSUUZfVFJJR0dFUioKIAkgKiBzZXR0aW5ncy4KIAkgKi8KLQlpZiAociAmJiByLT5mbGFncyAmIElPUkVTT1VSQ0VfQklUUykKLQkJaXJxZF9zZXRfdHJpZ2dlcl90eXBlKGlycV9nZXRfaXJxX2RhdGEoci0+c3RhcnQpLAotCQkJCSAgICAgIHItPmZsYWdzICYgSU9SRVNPVVJDRV9CSVRTKTsKKwlpZiAociAmJiByLT5mbGFncyAmIElPUkVTT1VSQ0VfQklUUykgeworCQlzdHJ1Y3QgaXJxX2RhdGEgKmlycWQ7CisKKwkJaXJxZCA9IGlycV9nZXRfaXJxX2RhdGEoci0+c3RhcnQpOworCQlpZiAoIWlycWQpCisJCQlyZXR1cm4gLUVOWElPOworCQlpcnFkX3NldF90cmlnZ2VyX3R5cGUoaXJxZCwgci0+ZmxhZ3MgJiBJT1JFU09VUkNFX0JJVFMpOworCX0KIAogCXJldHVybiByID8gci0+c3RhcnQgOiAtRU5YSU87CiAjZW5kaWYKQEAgLTE3NSw3ICsxODAsNyBAQAogCQlpbnQgcmV0OwogCiAJCXJldCA9IG9mX2lycV9nZXRfYnluYW1lKGRldi0+ZGV2Lm9mX25vZGUsIG5hbWUpOwotCQlpZiAocmV0ID49IDAgfHwgcmV0ID09IC1FUFJPQkVfREVGRVIpCisJCWlmIChyZXQgPiAwIHx8IHJldCA9PSAtRVBST0JFX0RFRkVSKQogCQkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTQzNCw2ICs0MzksNyBAQAogCWludCBpOwogCiAJaWYgKHBkZXYpIHsKKwkJZGV2aWNlX3JlbW92ZV9wcm9wZXJ0aWVzKCZwZGV2LT5kZXYpOwogCQlkZXZpY2VfZGVsKCZwZGV2LT5kZXYpOwogCiAJCWlmIChwZGV2LT5pZF9hdXRvKSB7CkBAIC00NDYsOCArNDUyLDYgQEAKIAkJCWlmIChyLT5wYXJlbnQpCiAJCQkJcmVsZWFzZV9yZXNvdXJjZShyKTsKIAkJfQotCi0JCWRldmljZV9yZW1vdmVfcHJvcGVydGllcygmcGRldi0+ZGV2KTsKIAl9CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwbGF0Zm9ybV9kZXZpY2VfZGVsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9kb21haW4uYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9kb21haW4uYwppbmRleCBhMWYyYWZmLi5lMDIzMDY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvZG9tYWluLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL2RvbWFpbi5jCkBAIC00NSw3ICs0NSw3IEBACiAgKiBhbmQgY2hlY2tzIHRoYXQgdGhlIFBNIGRvbWFpbiBwb2ludGVyIGlzIGEgcmVhbCBnZW5lcmljIFBNIGRvbWFpbi4KICAqIEFueSBmYWlsdXJlIHJlc3VsdHMgaW4gTlVMTCBiZWluZyByZXR1cm5lZC4KICAqLwotc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpwbV9nZW5wZF9sb29rdXBfZGV2KHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkX2xvb2t1cF9kZXYoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQgPSBOVUxMLCAqZ3BkOwogCkBAIC01ODYsNyArNTg2LDcgQEAKIH0KIGxhdGVfaW5pdGNhbGwoZ2VucGRfcG93ZXJvZmZfdW51c2VkKTsKIAotI2lmZGVmIENPTkZJR19QTV9TTEVFUAorI2lmIGRlZmluZWQoQ09ORklHX1BNX1NMRUVQKSB8fCBkZWZpbmVkKENPTkZJR19QTV9HRU5FUklDX0RPTUFJTlNfT0YpCiAKIC8qKgogICogcG1fZ2VucGRfcHJlc2VudCAtIENoZWNrIGlmIHRoZSBnaXZlbiBQTSBkb21haW4gaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCkBAIC02MDYsNiArNjA2LDEwIEBACiAJcmV0dXJuIGZhbHNlOwogfQogCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorCiBzdGF0aWMgYm9vbCBnZW5wZF9kZXZfYWN0aXZlX3dha2V1cChzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLAogCQkJCSAgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CkBAIC02MTMsOSArNjE3LDggQEAKIH0KIAogLyoqCi0gKiBwbV9nZW5wZF9zeW5jX3Bvd2Vyb2ZmIC0gU3luY2hyb25vdXNseSBwb3dlciBvZmYgYSBQTSBkb21haW4gYW5kIGl0cyBtYXN0ZXJzLgorICogZ2VucGRfc3luY19wb3dlcm9mZiAtIFN5bmNocm9ub3VzbHkgcG93ZXIgb2ZmIGEgUE0gZG9tYWluIGFuZCBpdHMgbWFzdGVycy4KICAqIEBnZW5wZDogUE0gZG9tYWluIHRvIHBvd2VyIG9mZiwgaWYgcG9zc2libGUuCi0gKiBAdGltZWQ6IFRydWUgaWYgbGF0ZW5jeSBtZWFzdXJlbWVudHMgYXJlIGFsbG93ZWQuCiAgKgogICogQ2hlY2sgaWYgdGhlIGdpdmVuIFBNIGRvbWFpbiBjYW4gYmUgcG93ZXJlZCBvZmYgKGR1cmluZyBzeXN0ZW0gc3VzcGVuZCBvcgogICogaGliZXJuYXRpb24pIGFuZCBkbyB0aGF0IGlmIHNvLiAgQWxzbywgaW4gdGhhdCBjYXNlIHByb3BhZ2F0ZSB0byBpdHMgbWFzdGVycy4KQEAgLTYyNSw4ICs2MjgsNyBAQAogICogZXhlY3V0ZWQgc2VxdWVudGlhbGx5LCBzbyBpdCBpcyBndWFyYW50ZWVkIHRoYXQgaXQgd2lsbCBuZXZlciBydW4gdHdpY2UgaW4KICAqIHBhcmFsbGVsKS4KICAqLwotc3RhdGljIHZvaWQgcG1fZ2VucGRfc3luY19wb3dlcm9mZihzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLAotCQkJCSAgIGJvb2wgdGltZWQpCitzdGF0aWMgdm9pZCBnZW5wZF9zeW5jX3Bvd2Vyb2ZmKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQpCiB7CiAJc3RydWN0IGdwZF9saW5rICpsaW5rOwogCkBAIC02MzksMjggKzY0MSwyNiBAQAogCiAJLyogQ2hvb3NlIHRoZSBkZWVwZXN0IHN0YXRlIHdoZW4gc3VzcGVuZGluZyAqLwogCWdlbnBkLT5zdGF0ZV9pZHggPSBnZW5wZC0+c3RhdGVfY291bnQgLSAxOwotCWdlbnBkX3Bvd2VyX29mZihnZW5wZCwgdGltZWQpOworCWdlbnBkX3Bvd2VyX29mZihnZW5wZCwgZmFsc2UpOwogCiAJZ2VucGQtPnN0YXR1cyA9IEdQRF9TVEFURV9QT1dFUl9PRkY7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpbmssICZnZW5wZC0+c2xhdmVfbGlua3MsIHNsYXZlX25vZGUpIHsKIAkJZ2VucGRfc2RfY291bnRlcl9kZWMobGluay0+bWFzdGVyKTsKLQkJcG1fZ2VucGRfc3luY19wb3dlcm9mZihsaW5rLT5tYXN0ZXIsIHRpbWVkKTsKKwkJZ2VucGRfc3luY19wb3dlcm9mZihsaW5rLT5tYXN0ZXIpOwogCX0KIH0KIAogLyoqCi0gKiBwbV9nZW5wZF9zeW5jX3Bvd2Vyb24gLSBTeW5jaHJvbm91c2x5IHBvd2VyIG9uIGEgUE0gZG9tYWluIGFuZCBpdHMgbWFzdGVycy4KKyAqIGdlbnBkX3N5bmNfcG93ZXJvbiAtIFN5bmNocm9ub3VzbHkgcG93ZXIgb24gYSBQTSBkb21haW4gYW5kIGl0cyBtYXN0ZXJzLgogICogQGdlbnBkOiBQTSBkb21haW4gdG8gcG93ZXIgb24uCi0gKiBAdGltZWQ6IFRydWUgaWYgbGF0ZW5jeSBtZWFzdXJlbWVudHMgYXJlIGFsbG93ZWQuCiAgKgogICogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpbiAibm9pcnEiIGFuZCAic3lzY29yZSIgc3RhZ2VzIG9mIHN5c3RlbSBwb3dlcgogICogdHJhbnNpdGlvbnMsIHNvIGl0IG5lZWQgbm90IGFjcXVpcmUgbG9ja3MgKGFsbCBvZiB0aGUgIm5vaXJxIiBjYWxsYmFja3MgYXJlCiAgKiBleGVjdXRlZCBzZXF1ZW50aWFsbHksIHNvIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCBpdCB3aWxsIG5ldmVyIHJ1biB0d2ljZSBpbgogICogcGFyYWxsZWwpLgogICovCi1zdGF0aWMgdm9pZCBwbV9nZW5wZF9zeW5jX3Bvd2Vyb24oc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCwKLQkJCQkgIGJvb2wgdGltZWQpCitzdGF0aWMgdm9pZCBnZW5wZF9zeW5jX3Bvd2Vyb24oc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCkKIHsKIAlzdHJ1Y3QgZ3BkX2xpbmsgKmxpbms7CiAKQEAgLTY2OCwxMSArNjY4LDExIEBACiAJCXJldHVybjsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkobGluaywgJmdlbnBkLT5zbGF2ZV9saW5rcywgc2xhdmVfbm9kZSkgewotCQlwbV9nZW5wZF9zeW5jX3Bvd2Vyb24obGluay0+bWFzdGVyLCB0aW1lZCk7CisJCWdlbnBkX3N5bmNfcG93ZXJvbihsaW5rLT5tYXN0ZXIpOwogCQlnZW5wZF9zZF9jb3VudGVyX2luYyhsaW5rLT5tYXN0ZXIpOwogCX0KIAotCWdlbnBkX3Bvd2VyX29uKGdlbnBkLCB0aW1lZCk7CisJZ2VucGRfcG93ZXJfb24oZ2VucGQsIGZhbHNlKTsKIAogCWdlbnBkLT5zdGF0dXMgPSBHUERfU1RBVEVfQUNUSVZFOwogfQpAQCAtNzg0LDcgKzc4NCw3IEBACiAJICogdGhlIHNhbWUgUE0gZG9tYWluLCBzbyBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHVzZSBsb2NraW5nIGhlcmUuCiAJICovCiAJZ2VucGQtPnN1c3BlbmRlZF9jb3VudCsrOwotCXBtX2dlbnBkX3N5bmNfcG93ZXJvZmYoZ2VucGQsIHRydWUpOworCWdlbnBkX3N5bmNfcG93ZXJvZmYoZ2VucGQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC04MTQsNyArODE0LDcgQEAKIAkgKiBndWFyYW50ZWVkIHRoYXQgdGhpcyBmdW5jdGlvbiB3aWxsIG5ldmVyIHJ1biB0d2ljZSBpbiBwYXJhbGxlbCBmb3IKIAkgKiB0aGUgc2FtZSBQTSBkb21haW4sIHNvIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gdXNlIGxvY2tpbmcgaGVyZS4KIAkgKi8KLQlwbV9nZW5wZF9zeW5jX3Bvd2Vyb24oZ2VucGQsIHRydWUpOworCWdlbnBkX3N5bmNfcG93ZXJvbihnZW5wZCk7CiAJZ2VucGQtPnN1c3BlbmRlZF9jb3VudC0tOwogCiAJaWYgKGdlbnBkLT5kZXZfb3BzLnN0b3AgJiYgZ2VucGQtPmRldl9vcHMuc3RhcnQpCkBAIC05MDIsMTIgKzkwMiwxMiBAQAogCWlmIChnZW5wZC0+c3VzcGVuZGVkX2NvdW50KysgPT0gMCkKIAkJLyoKIAkJICogVGhlIGJvb3Qga2VybmVsIG1pZ2h0IHB1dCB0aGUgZG9tYWluIGludG8gYXJiaXRyYXJ5IHN0YXRlLAotCQkgKiBzbyBtYWtlIGl0IGFwcGVhciBhcyBwb3dlcmVkIG9mZiB0byBwbV9nZW5wZF9zeW5jX3Bvd2Vyb24oKSwKKwkJICogc28gbWFrZSBpdCBhcHBlYXIgYXMgcG93ZXJlZCBvZmYgdG8gZ2VucGRfc3luY19wb3dlcm9uKCksCiAJCSAqIHNvIHRoYXQgaXQgdHJpZXMgdG8gcG93ZXIgaXQgb24gaW4gY2FzZSBpdCB3YXMgcmVhbGx5IG9mZi4KIAkJICovCiAJCWdlbnBkLT5zdGF0dXMgPSBHUERfU1RBVEVfUE9XRVJfT0ZGOwogCi0JcG1fZ2VucGRfc3luY19wb3dlcm9uKGdlbnBkLCB0cnVlKTsKKwlnZW5wZF9zeW5jX3Bvd2Vyb24oZ2VucGQpOwogCiAJaWYgKGdlbnBkLT5kZXZfb3BzLnN0b3AgJiYgZ2VucGQtPmRldl9vcHMuc3RhcnQpCiAJCXJldCA9IHBtX3J1bnRpbWVfZm9yY2VfcmVzdW1lKGRldik7CkBAIC05NjIsOSArOTYyLDkgQEAKIAogCWlmIChzdXNwZW5kKSB7CiAJCWdlbnBkLT5zdXNwZW5kZWRfY291bnQrKzsKLQkJcG1fZ2VucGRfc3luY19wb3dlcm9mZihnZW5wZCwgZmFsc2UpOworCQlnZW5wZF9zeW5jX3Bvd2Vyb2ZmKGdlbnBkKTsKIAl9IGVsc2UgewotCQlwbV9nZW5wZF9zeW5jX3Bvd2Vyb24oZ2VucGQsIGZhbHNlKTsKKwkJZ2VucGRfc3luY19wb3dlcm9uKGdlbnBkKTsKIAkJZ2VucGQtPnN1c3BlbmRlZF9jb3VudC0tOwogCX0KIH0KQEAgLTEwNTYsMTQgKzEwNTYsOCBAQAogCWRldl9wbV9wdXRfc3Vic3lzX2RhdGEoZGV2KTsKIH0KIAotLyoqCi0gKiBfX3BtX2dlbnBkX2FkZF9kZXZpY2UgLSBBZGQgYSBkZXZpY2UgdG8gYW4gSS9PIFBNIGRvbWFpbi4KLSAqIEBnZW5wZDogUE0gZG9tYWluIHRvIGFkZCB0aGUgZGV2aWNlIHRvLgotICogQGRldjogRGV2aWNlIHRvIGJlIGFkZGVkLgotICogQHRkOiBTZXQgb2YgUE0gUW9TIHRpbWluZyBwYXJhbWV0ZXJzIHRvIGF0dGFjaCB0byB0aGUgZGV2aWNlLgotICovCi1pbnQgX19wbV9nZW5wZF9hZGRfZGV2aWNlKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQsIHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IGdwZF90aW1pbmdfZGF0YSAqdGQpCitzdGF0aWMgaW50IGdlbnBkX2FkZF9kZXZpY2Uoc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCwgc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBncGRfdGltaW5nX2RhdGEgKnRkKQogewogCXN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbl9kYXRhICpncGRfZGF0YTsKIAlpbnQgcmV0ID0gMDsKQEAgLTExMDMsMTUgKzEwOTcsMjggQEAKIAogCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChfX3BtX2dlbnBkX2FkZF9kZXZpY2UpOwogCiAvKioKLSAqIHBtX2dlbnBkX3JlbW92ZV9kZXZpY2UgLSBSZW1vdmUgYSBkZXZpY2UgZnJvbSBhbiBJL08gUE0gZG9tYWluLgotICogQGdlbnBkOiBQTSBkb21haW4gdG8gcmVtb3ZlIHRoZSBkZXZpY2UgZnJvbS4KLSAqIEBkZXY6IERldmljZSB0byBiZSByZW1vdmVkLgorICogX19wbV9nZW5wZF9hZGRfZGV2aWNlIC0gQWRkIGEgZGV2aWNlIHRvIGFuIEkvTyBQTSBkb21haW4uCisgKiBAZ2VucGQ6IFBNIGRvbWFpbiB0byBhZGQgdGhlIGRldmljZSB0by4KKyAqIEBkZXY6IERldmljZSB0byBiZSBhZGRlZC4KKyAqIEB0ZDogU2V0IG9mIFBNIFFvUyB0aW1pbmcgcGFyYW1ldGVycyB0byBhdHRhY2ggdG8gdGhlIGRldmljZS4KICAqLwotaW50IHBtX2dlbnBkX3JlbW92ZV9kZXZpY2Uoc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCwKLQkJCSAgIHN0cnVjdCBkZXZpY2UgKmRldikKK2ludCBfX3BtX2dlbnBkX2FkZF9kZXZpY2Uoc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCwgc3RydWN0IGRldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgZ3BkX3RpbWluZ19kYXRhICp0ZCkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmZ3BkX2xpc3RfbG9jayk7CisJcmV0ID0gZ2VucGRfYWRkX2RldmljZShnZW5wZCwgZGV2LCB0ZCk7CisJbXV0ZXhfdW5sb2NrKCZncGRfbGlzdF9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChfX3BtX2dlbnBkX2FkZF9kZXZpY2UpOworCitzdGF0aWMgaW50IGdlbnBkX3JlbW92ZV9kZXZpY2Uoc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluX2RhdGEgKmdwZF9kYXRhOwogCXN0cnVjdCBwbV9kb21haW5fZGF0YSAqcGRkOwpAQCAtMTExOSwxMCArMTEyNiw2IEBACiAKIAlkZXZfZGJnKGRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKIAotCWlmICghZ2VucGQgfHwgZ2VucGQgIT0gcG1fZ2VucGRfbG9va3VwX2RldihkZXYpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIFRoZSBhYm92ZSB2YWxpZGF0aW9uIGFsc28gbWVhbnMgd2UgaGF2ZSBleGlzdGluZyBkb21haW5fZGF0YS4gKi8KIAlwZGQgPSBkZXYtPnBvd2VyLnN1YnN5c19kYXRhLT5kb21haW5fZGF0YTsKIAlncGRfZGF0YSA9IHRvX2dwZF9kYXRhKHBkZCk7CiAJZGV2X3BtX3Fvc19yZW1vdmVfbm90aWZpZXIoZGV2LCAmZ3BkX2RhdGEtPm5iKTsKQEAgLTExNTQsMTUgKzExNTcsMjQgQEAKIAogCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChwbV9nZW5wZF9yZW1vdmVfZGV2aWNlKTsKIAogLyoqCi0gKiBwbV9nZW5wZF9hZGRfc3ViZG9tYWluIC0gQWRkIGEgc3ViZG9tYWluIHRvIGFuIEkvTyBQTSBkb21haW4uCi0gKiBAZ2VucGQ6IE1hc3RlciBQTSBkb21haW4gdG8gYWRkIHRoZSBzdWJkb21haW4gdG8uCi0gKiBAc3ViZG9tYWluOiBTdWJkb21haW4gdG8gYmUgYWRkZWQuCisgKiBwbV9nZW5wZF9yZW1vdmVfZGV2aWNlIC0gUmVtb3ZlIGEgZGV2aWNlIGZyb20gYW4gSS9PIFBNIGRvbWFpbi4KKyAqIEBnZW5wZDogUE0gZG9tYWluIHRvIHJlbW92ZSB0aGUgZGV2aWNlIGZyb20uCisgKiBAZGV2OiBEZXZpY2UgdG8gYmUgcmVtb3ZlZC4KICAqLwotaW50IHBtX2dlbnBkX2FkZF9zdWJkb21haW4oc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCwKLQkJCSAgIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqc3ViZG9tYWluKQoraW50IHBtX2dlbnBkX3JlbW92ZV9kZXZpY2Uoc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCwKKwkJCSAgIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZiAoIWdlbnBkIHx8IGdlbnBkICE9IGdlbnBkX2xvb2t1cF9kZXYoZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gZ2VucGRfcmVtb3ZlX2RldmljZShnZW5wZCwgZGV2KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBtX2dlbnBkX3JlbW92ZV9kZXZpY2UpOworCitzdGF0aWMgaW50IGdlbnBkX2FkZF9zdWJkb21haW4oc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCwKKwkJCSAgICAgICBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKnN1YmRvbWFpbikKIHsKIAlzdHJ1Y3QgZ3BkX2xpbmsgKmxpbmssICppdHI7CiAJaW50IHJldCA9IDA7CkBAIC0xMjA1LDYgKzEyMTcsMjMgQEAKIAkJa2ZyZWUobGluayk7CiAJcmV0dXJuIHJldDsKIH0KKworLyoqCisgKiBwbV9nZW5wZF9hZGRfc3ViZG9tYWluIC0gQWRkIGEgc3ViZG9tYWluIHRvIGFuIEkvTyBQTSBkb21haW4uCisgKiBAZ2VucGQ6IE1hc3RlciBQTSBkb21haW4gdG8gYWRkIHRoZSBzdWJkb21haW4gdG8uCisgKiBAc3ViZG9tYWluOiBTdWJkb21haW4gdG8gYmUgYWRkZWQuCisgKi8KK2ludCBwbV9nZW5wZF9hZGRfc3ViZG9tYWluKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQsCisJCQkgICBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKnN1YmRvbWFpbikKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmZ3BkX2xpc3RfbG9jayk7CisJcmV0ID0gZ2VucGRfYWRkX3N1YmRvbWFpbihnZW5wZCwgc3ViZG9tYWluKTsKKwltdXRleF91bmxvY2soJmdwZF9saXN0X2xvY2spOworCisJcmV0dXJuIHJldDsKK30KIEVYUE9SVF9TWU1CT0xfR1BMKHBtX2dlbnBkX2FkZF9zdWJkb21haW4pOwogCiAvKioKQEAgLTEyNzgsMjcgKzEzMDcsMTcgQEAKIAlnZW5wZC0+ZGV2aWNlX2NvdW50ID0gMDsKIAlnZW5wZC0+bWF4X29mZl90aW1lX25zID0gLTE7CiAJZ2VucGQtPm1heF9vZmZfdGltZV9jaGFuZ2VkID0gdHJ1ZTsKKwlnZW5wZC0+cHJvdmlkZXIgPSBOVUxMOworCWdlbnBkLT5oYXNfcHJvdmlkZXIgPSBmYWxzZTsKIAlnZW5wZC0+ZG9tYWluLm9wcy5ydW50aW1lX3N1c3BlbmQgPSBnZW5wZF9ydW50aW1lX3N1c3BlbmQ7CiAJZ2VucGQtPmRvbWFpbi5vcHMucnVudGltZV9yZXN1bWUgPSBnZW5wZF9ydW50aW1lX3Jlc3VtZTsKIAlnZW5wZC0+ZG9tYWluLm9wcy5wcmVwYXJlID0gcG1fZ2VucGRfcHJlcGFyZTsKLQlnZW5wZC0+ZG9tYWluLm9wcy5zdXNwZW5kID0gcG1fZ2VuZXJpY19zdXNwZW5kOwotCWdlbnBkLT5kb21haW4ub3BzLnN1c3BlbmRfbGF0ZSA9IHBtX2dlbmVyaWNfc3VzcGVuZF9sYXRlOwogCWdlbnBkLT5kb21haW4ub3BzLnN1c3BlbmRfbm9pcnEgPSBwbV9nZW5wZF9zdXNwZW5kX25vaXJxOwogCWdlbnBkLT5kb21haW4ub3BzLnJlc3VtZV9ub2lycSA9IHBtX2dlbnBkX3Jlc3VtZV9ub2lycTsKLQlnZW5wZC0+ZG9tYWluLm9wcy5yZXN1bWVfZWFybHkgPSBwbV9nZW5lcmljX3Jlc3VtZV9lYXJseTsKLQlnZW5wZC0+ZG9tYWluLm9wcy5yZXN1bWUgPSBwbV9nZW5lcmljX3Jlc3VtZTsKLQlnZW5wZC0+ZG9tYWluLm9wcy5mcmVlemUgPSBwbV9nZW5lcmljX2ZyZWV6ZTsKLQlnZW5wZC0+ZG9tYWluLm9wcy5mcmVlemVfbGF0ZSA9IHBtX2dlbmVyaWNfZnJlZXplX2xhdGU7CiAJZ2VucGQtPmRvbWFpbi5vcHMuZnJlZXplX25vaXJxID0gcG1fZ2VucGRfZnJlZXplX25vaXJxOwogCWdlbnBkLT5kb21haW4ub3BzLnRoYXdfbm9pcnEgPSBwbV9nZW5wZF90aGF3X25vaXJxOwotCWdlbnBkLT5kb21haW4ub3BzLnRoYXdfZWFybHkgPSBwbV9nZW5lcmljX3RoYXdfZWFybHk7Ci0JZ2VucGQtPmRvbWFpbi5vcHMudGhhdyA9IHBtX2dlbmVyaWNfdGhhdzsKLQlnZW5wZC0+ZG9tYWluLm9wcy5wb3dlcm9mZiA9IHBtX2dlbmVyaWNfcG93ZXJvZmY7Ci0JZ2VucGQtPmRvbWFpbi5vcHMucG93ZXJvZmZfbGF0ZSA9IHBtX2dlbmVyaWNfcG93ZXJvZmZfbGF0ZTsKIAlnZW5wZC0+ZG9tYWluLm9wcy5wb3dlcm9mZl9ub2lycSA9IHBtX2dlbnBkX3N1c3BlbmRfbm9pcnE7CiAJZ2VucGQtPmRvbWFpbi5vcHMucmVzdG9yZV9ub2lycSA9IHBtX2dlbnBkX3Jlc3RvcmVfbm9pcnE7Ci0JZ2VucGQtPmRvbWFpbi5vcHMucmVzdG9yZV9lYXJseSA9IHBtX2dlbmVyaWNfcmVzdG9yZV9lYXJseTsKLQlnZW5wZC0+ZG9tYWluLm9wcy5yZXN0b3JlID0gcG1fZ2VuZXJpY19yZXN0b3JlOwogCWdlbnBkLT5kb21haW4ub3BzLmNvbXBsZXRlID0gcG1fZ2VucGRfY29tcGxldGU7CiAKIAlpZiAoZ2VucGQtPmZsYWdzICYgR0VOUERfRkxBR19QTV9DTEspIHsKQEAgLTEzMjgsNyArMTM0Nyw3MSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocG1fZ2VucGRfaW5pdCk7CiAKK3N0YXRpYyBpbnQgZ2VucGRfcmVtb3ZlKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQpCit7CisJc3RydWN0IGdwZF9saW5rICpsLCAqbGluazsKKworCWlmIChJU19FUlJfT1JfTlVMTChnZW5wZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmZ2VucGQtPmxvY2spOworCisJaWYgKGdlbnBkLT5oYXNfcHJvdmlkZXIpIHsKKwkJbXV0ZXhfdW5sb2NrKCZnZW5wZC0+bG9jayk7CisJCXByX2VycigiUHJvdmlkZXIgcHJlc2VudCwgdW5hYmxlIHRvIHJlbW92ZSAlc1xuIiwgZ2VucGQtPm5hbWUpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmICghbGlzdF9lbXB0eSgmZ2VucGQtPm1hc3Rlcl9saW5rcykgfHwgZ2VucGQtPmRldmljZV9jb3VudCkgeworCQltdXRleF91bmxvY2soJmdlbnBkLT5sb2NrKTsKKwkJcHJfZXJyKCIlczogdW5hYmxlIHRvIHJlbW92ZSAlc1xuIiwgX19mdW5jX18sIGdlbnBkLT5uYW1lKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobGluaywgbCwgJmdlbnBkLT5zbGF2ZV9saW5rcywgc2xhdmVfbm9kZSkgeworCQlsaXN0X2RlbCgmbGluay0+bWFzdGVyX25vZGUpOworCQlsaXN0X2RlbCgmbGluay0+c2xhdmVfbm9kZSk7CisJCWtmcmVlKGxpbmspOworCX0KKworCWxpc3RfZGVsKCZnZW5wZC0+Z3BkX2xpc3Rfbm9kZSk7CisJbXV0ZXhfdW5sb2NrKCZnZW5wZC0+bG9jayk7CisJY2FuY2VsX3dvcmtfc3luYygmZ2VucGQtPnBvd2VyX29mZl93b3JrKTsKKwlwcl9kZWJ1ZygiJXM6IHJlbW92ZWQgJXNcbiIsIF9fZnVuY19fLCBnZW5wZC0+bmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwbV9nZW5wZF9yZW1vdmUgLSBSZW1vdmUgYSBnZW5lcmljIEkvTyBQTSBkb21haW4KKyAqIEBnZW5wZDogUG9pbnRlciB0byBQTSBkb21haW4gdGhhdCBpcyB0byBiZSByZW1vdmVkLgorICoKKyAqIFRvIHJlbW92ZSB0aGUgUE0gZG9tYWluLCB0aGlzIGZ1bmN0aW9uOgorICogIC0gUmVtb3ZlcyB0aGUgUE0gZG9tYWluIGFzIGEgc3ViZG9tYWluIHRvIGFueSBwYXJlbnQgZG9tYWlucywKKyAqICAgIGlmIGl0IHdhcyBhZGRlZC4KKyAqICAtIFJlbW92ZXMgdGhlIFBNIGRvbWFpbiBmcm9tIHRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQgUE0gZG9tYWlucy4KKyAqCisgKiBUaGUgUE0gZG9tYWluIHdpbGwgb25seSBiZSByZW1vdmVkLCBpZiB0aGUgYXNzb2NpYXRlZCBwcm92aWRlciBoYXMKKyAqIGJlZW4gcmVtb3ZlZCwgaXQgaXMgbm90IGEgcGFyZW50IHRvIGFueSBvdGhlciBQTSBkb21haW4gYW5kIGhhcyBubworICogZGV2aWNlcyBhc3NvY2lhdGVkIHdpdGggaXQuCisgKi8KK2ludCBwbV9nZW5wZF9yZW1vdmUoc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmZ3BkX2xpc3RfbG9jayk7CisJcmV0ID0gZ2VucGRfcmVtb3ZlKGdlbnBkKTsKKwltdXRleF91bmxvY2soJmdwZF9saXN0X2xvY2spOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBtX2dlbnBkX3JlbW92ZSk7CisKICNpZmRlZiBDT05GSUdfUE1fR0VORVJJQ19ET01BSU5TX09GCisKK3R5cGVkZWYgc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICooKmdlbnBkX3hsYXRlX3QpKHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmFyZ3MsCisJCQkJCQkgICB2b2lkICpkYXRhKTsKKwogLyoKICAqIERldmljZSBUcmVlIGJhc2VkIFBNIGRvbWFpbiBwcm92aWRlcnMuCiAgKgpAQCAtMTM0MCw4ICsxNDIzLDggQEAKICAqIG1hcHMgYSBQTSBkb21haW4gc3BlY2lmaWVyIHJldHJpZXZlZCBmcm9tIHRoZSBkZXZpY2UgdHJlZSB0byBhIFBNIGRvbWFpbi4KICAqCiAgKiBUd28gc2ltcGxlIG1hcHBpbmcgZnVuY3Rpb25zIGhhdmUgYmVlbiBwcm92aWRlZCBmb3IgY29udmVuaWVuY2U6Ci0gKiAgLSBfX29mX2dlbnBkX3hsYXRlX3NpbXBsZSgpIGZvciAxOjEgZGV2aWNlIHRyZWUgbm9kZSB0byBQTSBkb21haW4gbWFwcGluZy4KLSAqICAtIF9fb2ZfZ2VucGRfeGxhdGVfb25lY2VsbCgpIGZvciBtYXBwaW5nIG9mIG11bHRpcGxlIFBNIGRvbWFpbnMgcGVyIG5vZGUgYnkKKyAqICAtIGdlbnBkX3hsYXRlX3NpbXBsZSgpIGZvciAxOjEgZGV2aWNlIHRyZWUgbm9kZSB0byBQTSBkb21haW4gbWFwcGluZy4KKyAqICAtIGdlbnBkX3hsYXRlX29uZWNlbGwoKSBmb3IgbWFwcGluZyBvZiBtdWx0aXBsZSBQTSBkb21haW5zIHBlciBub2RlIGJ5CiAgKiAgICBpbmRleC4KICAqLwogCkBAIC0xMzY2LDcgKzE0NDksNyBAQAogc3RhdGljIERFRklORV9NVVRFWChvZl9nZW5wZF9tdXRleCk7CiAKIC8qKgotICogX19vZl9nZW5wZF94bGF0ZV9zaW1wbGUoKSAtIFhsYXRlIGZ1bmN0aW9uIGZvciBkaXJlY3Qgbm9kZS1kb21haW4gbWFwcGluZworICogZ2VucGRfeGxhdGVfc2ltcGxlKCkgLSBYbGF0ZSBmdW5jdGlvbiBmb3IgZGlyZWN0IG5vZGUtZG9tYWluIG1hcHBpbmcKICAqIEBnZW5wZHNwZWM6IE9GIHBoYW5kbGUgYXJncyB0byBtYXAgaW50byBhIFBNIGRvbWFpbgogICogQGRhdGE6IHhsYXRlIGZ1bmN0aW9uIHByaXZhdGUgZGF0YSAtIHBvaW50ZXIgdG8gc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluCiAgKgpAQCAtMTM3NCw3ICsxNDU3LDcgQEAKICAqIGhhdmUgdGhlaXIgb3duIGRldmljZSB0cmVlIG5vZGVzLiBUaGUgcHJpdmF0ZSBkYXRhIG9mIHhsYXRlIGZ1bmN0aW9uIG5lZWRzCiAgKiB0byBiZSBhIHZhbGlkIHBvaW50ZXIgdG8gc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluLgogICovCi1zdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKl9fb2ZfZ2VucGRfeGxhdGVfc2ltcGxlKAorc3RhdGljIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGRfeGxhdGVfc2ltcGxlKAogCQkJCQlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpnZW5wZHNwZWMsCiAJCQkJCXZvaWQgKmRhdGEpCiB7CkBAIC0xMzgyLDEwICsxNDY1LDkgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJcmV0dXJuIGRhdGE7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChfX29mX2dlbnBkX3hsYXRlX3NpbXBsZSk7CiAKIC8qKgotICogX19vZl9nZW5wZF94bGF0ZV9vbmVjZWxsKCkgLSBYbGF0ZSBmdW5jdGlvbiB1c2luZyBhIHNpbmdsZSBpbmRleC4KKyAqIGdlbnBkX3hsYXRlX29uZWNlbGwoKSAtIFhsYXRlIGZ1bmN0aW9uIHVzaW5nIGEgc2luZ2xlIGluZGV4LgogICogQGdlbnBkc3BlYzogT0YgcGhhbmRsZSBhcmdzIHRvIG1hcCBpbnRvIGEgUE0gZG9tYWluCiAgKiBAZGF0YTogeGxhdGUgZnVuY3Rpb24gcHJpdmF0ZSBkYXRhIC0gcG9pbnRlciB0byBzdHJ1Y3QgZ2VucGRfb25lY2VsbF9kYXRhCiAgKgpAQCAtMTM5NCw3ICsxNDc2LDcgQEAKICAqIEEgc2luZ2xlIGNlbGwgaXMgdXNlZCBhcyBhbiBpbmRleCBpbnRvIGFuIGFycmF5IG9mIFBNIGRvbWFpbnMgc3BlY2lmaWVkIGluCiAgKiB0aGUgZ2VucGRfb25lY2VsbF9kYXRhIHN0cnVjdCB3aGVuIHJlZ2lzdGVyaW5nIHRoZSBwcm92aWRlci4KICAqLwotc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpfX29mX2dlbnBkX3hsYXRlX29uZWNlbGwoCitzdGF0aWMgc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZF94bGF0ZV9vbmVjZWxsKAogCQkJCQlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpnZW5wZHNwZWMsCiAJCQkJCXZvaWQgKmRhdGEpCiB7CkBAIC0xNDE0LDE2ICsxNDk2LDE1IEBACiAKIAlyZXR1cm4gZ2VucGRfZGF0YS0+ZG9tYWluc1tpZHhdOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoX19vZl9nZW5wZF94bGF0ZV9vbmVjZWxsKTsKIAogLyoqCi0gKiBfX29mX2dlbnBkX2FkZF9wcm92aWRlcigpIC0gUmVnaXN0ZXIgYSBQTSBkb21haW4gcHJvdmlkZXIgZm9yIGEgbm9kZQorICogZ2VucGRfYWRkX3Byb3ZpZGVyKCkgLSBSZWdpc3RlciBhIFBNIGRvbWFpbiBwcm92aWRlciBmb3IgYSBub2RlCiAgKiBAbnA6IERldmljZSBub2RlIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBQTSBkb21haW4gcHJvdmlkZXIuCiAgKiBAeGxhdGU6IENhbGxiYWNrIGZvciBkZWNvZGluZyBQTSBkb21haW4gZnJvbSBwaGFuZGxlIGFyZ3VtZW50cy4KICAqIEBkYXRhOiBDb250ZXh0IHBvaW50ZXIgZm9yIEB4bGF0ZSBjYWxsYmFjay4KICAqLwotaW50IF9fb2ZfZ2VucGRfYWRkX3Byb3ZpZGVyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGdlbnBkX3hsYXRlX3QgeGxhdGUsCi0JCQl2b2lkICpkYXRhKQorc3RhdGljIGludCBnZW5wZF9hZGRfcHJvdmlkZXIoc3RydWN0IGRldmljZV9ub2RlICpucCwgZ2VucGRfeGxhdGVfdCB4bGF0ZSwKKwkJCSAgICAgIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IG9mX2dlbnBkX3Byb3ZpZGVyICpjcDsKIApAQCAtMTQ0Miw3ICsxNTIzLDgzIEBACiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKF9fb2ZfZ2VucGRfYWRkX3Byb3ZpZGVyKTsKKworLyoqCisgKiBvZl9nZW5wZF9hZGRfcHJvdmlkZXJfc2ltcGxlKCkgLSBSZWdpc3RlciBhIHNpbXBsZSBQTSBkb21haW4gcHJvdmlkZXIKKyAqIEBucDogRGV2aWNlIG5vZGUgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhlIFBNIGRvbWFpbiBwcm92aWRlci4KKyAqIEBnZW5wZDogUG9pbnRlciB0byBQTSBkb21haW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBQTSBkb21haW4gcHJvdmlkZXIuCisgKi8KK2ludCBvZl9nZW5wZF9hZGRfcHJvdmlkZXJfc2ltcGxlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQpCit7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlpZiAoIW5wIHx8ICFnZW5wZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZncGRfbGlzdF9sb2NrKTsKKworCWlmIChwbV9nZW5wZF9wcmVzZW50KGdlbnBkKSkKKwkJcmV0ID0gZ2VucGRfYWRkX3Byb3ZpZGVyKG5wLCBnZW5wZF94bGF0ZV9zaW1wbGUsIGdlbnBkKTsKKworCWlmICghcmV0KSB7CisJCWdlbnBkLT5wcm92aWRlciA9ICZucC0+Zndub2RlOworCQlnZW5wZC0+aGFzX3Byb3ZpZGVyID0gdHJ1ZTsKKwl9CisKKwltdXRleF91bmxvY2soJmdwZF9saXN0X2xvY2spOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9mX2dlbnBkX2FkZF9wcm92aWRlcl9zaW1wbGUpOworCisvKioKKyAqIG9mX2dlbnBkX2FkZF9wcm92aWRlcl9vbmVjZWxsKCkgLSBSZWdpc3RlciBhIG9uZWNlbGwgUE0gZG9tYWluIHByb3ZpZGVyCisgKiBAbnA6IERldmljZSBub2RlIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBQTSBkb21haW4gcHJvdmlkZXIuCisgKiBAZGF0YTogUG9pbnRlciB0byB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIFBNIGRvbWFpbiBwcm92aWRlci4KKyAqLworaW50IG9mX2dlbnBkX2FkZF9wcm92aWRlcl9vbmVjZWxsKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJICBzdHJ1Y3QgZ2VucGRfb25lY2VsbF9kYXRhICpkYXRhKQoreworCXVuc2lnbmVkIGludCBpOworCWludCByZXQgPSAtRUlOVkFMOworCisJaWYgKCFucCB8fCAhZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZncGRfbGlzdF9sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5udW1fZG9tYWluczsgaSsrKSB7CisJCWlmICghZGF0YS0+ZG9tYWluc1tpXSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXBtX2dlbnBkX3ByZXNlbnQoZGF0YS0+ZG9tYWluc1tpXSkpCisJCQlnb3RvIGVycm9yOworCisJCWRhdGEtPmRvbWFpbnNbaV0tPnByb3ZpZGVyID0gJm5wLT5md25vZGU7CisJCWRhdGEtPmRvbWFpbnNbaV0tPmhhc19wcm92aWRlciA9IHRydWU7CisJfQorCisJcmV0ID0gZ2VucGRfYWRkX3Byb3ZpZGVyKG5wLCBnZW5wZF94bGF0ZV9vbmVjZWxsLCBkYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCW11dGV4X3VubG9jaygmZ3BkX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJd2hpbGUgKGktLSkgeworCQlpZiAoIWRhdGEtPmRvbWFpbnNbaV0pCisJCQljb250aW51ZTsKKwkJZGF0YS0+ZG9tYWluc1tpXS0+cHJvdmlkZXIgPSBOVUxMOworCQlkYXRhLT5kb21haW5zW2ldLT5oYXNfcHJvdmlkZXIgPSBmYWxzZTsKKwl9CisKKwltdXRleF91bmxvY2soJmdwZF9saXN0X2xvY2spOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9mX2dlbnBkX2FkZF9wcm92aWRlcl9vbmVjZWxsKTsKIAogLyoqCiAgKiBvZl9nZW5wZF9kZWxfcHJvdmlkZXIoKSAtIFJlbW92ZSBhIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBQTSBkb21haW4gcHJvdmlkZXIKQEAgLTE0NTEsMTAgKzE2MDgsMjEgQEAKIHZvaWQgb2ZfZ2VucGRfZGVsX3Byb3ZpZGVyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7CiAJc3RydWN0IG9mX2dlbnBkX3Byb3ZpZGVyICpjcDsKKwlzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdwZDsKIAorCW11dGV4X2xvY2soJmdwZF9saXN0X2xvY2spOwogCW11dGV4X2xvY2soJm9mX2dlbnBkX211dGV4KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNwLCAmb2ZfZ2VucGRfcHJvdmlkZXJzLCBsaW5rKSB7CiAJCWlmIChjcC0+bm9kZSA9PSBucCkgeworCQkJLyoKKwkJCSAqIEZvciBlYWNoIFBNIGRvbWFpbiBhc3NvY2lhdGVkIHdpdGggdGhlCisJCQkgKiBwcm92aWRlciwgc2V0IHRoZSAnaGFzX3Byb3ZpZGVyJyB0byBmYWxzZQorCQkJICogc28gdGhhdCB0aGUgUE0gZG9tYWluIGNhbiBiZSBzYWZlbHkgcmVtb3ZlZC4KKwkJCSAqLworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShncGQsICZncGRfbGlzdCwgZ3BkX2xpc3Rfbm9kZSkKKwkJCQlpZiAoZ3BkLT5wcm92aWRlciA9PSAmbnAtPmZ3bm9kZSkKKwkJCQkJZ3BkLT5oYXNfcHJvdmlkZXIgPSBmYWxzZTsKKwogCQkJbGlzdF9kZWwoJmNwLT5saW5rKTsKIAkJCW9mX25vZGVfcHV0KGNwLT5ub2RlKTsKIAkJCWtmcmVlKGNwKTsKQEAgLTE0NjIsMTEgKzE2MzAsMTIgQEAKIAkJfQogCX0KIAltdXRleF91bmxvY2soJm9mX2dlbnBkX211dGV4KTsKKwltdXRleF91bmxvY2soJmdwZF9saXN0X2xvY2spOwogfQogRVhQT1JUX1NZTUJPTF9HUEwob2ZfZ2VucGRfZGVsX3Byb3ZpZGVyKTsKIAogLyoqCi0gKiBvZl9nZW5wZF9nZXRfZnJvbV9wcm92aWRlcigpIC0gTG9vay11cCBQTSBkb21haW4KKyAqIGdlbnBkX2dldF9mcm9tX3Byb3ZpZGVyKCkgLSBMb29rLXVwIFBNIGRvbWFpbgogICogQGdlbnBkc3BlYzogT0YgcGhhbmRsZSBhcmdzIHRvIHVzZSBmb3IgbG9vay11cAogICoKICAqIExvb2tzIGZvciBhIFBNIGRvbWFpbiBwcm92aWRlciB1bmRlciB0aGUgbm9kZSBzcGVjaWZpZWQgYnkgQGdlbnBkc3BlYyBhbmQgaWYKQEAgLTE0NzYsNyArMTY0NSw3IEBACiAgKiBSZXR1cm5zIGEgdmFsaWQgcG9pbnRlciB0byBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gb24gc3VjY2VzcyBvciBFUlJfUFRSKCkKICAqIG9uIGZhaWx1cmUuCiAgKi8KLXN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqb2ZfZ2VucGRfZ2V0X2Zyb21fcHJvdmlkZXIoCitzdGF0aWMgc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZF9nZXRfZnJvbV9wcm92aWRlcigKIAkJCQkJc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqZ2VucGRzcGVjKQogewogCXN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQgPSBFUlJfUFRSKC1FTk9FTlQpOwpAQCAtMTQ5OSw3ICsxNjY4LDEwOSBAQAogCiAJcmV0dXJuIGdlbnBkOwogfQotRVhQT1JUX1NZTUJPTF9HUEwob2ZfZ2VucGRfZ2V0X2Zyb21fcHJvdmlkZXIpOworCisvKioKKyAqIG9mX2dlbnBkX2FkZF9kZXZpY2UoKSAtIEFkZCBhIGRldmljZSB0byBhbiBJL08gUE0gZG9tYWluCisgKiBAZ2VucGRzcGVjOiBPRiBwaGFuZGxlIGFyZ3MgdG8gdXNlIGZvciBsb29rLXVwIFBNIGRvbWFpbgorICogQGRldjogRGV2aWNlIHRvIGJlIGFkZGVkLgorICoKKyAqIExvb2tzLXVwIGFuIEkvTyBQTSBkb21haW4gYmFzZWQgdXBvbiBwaGFuZGxlIGFyZ3MgcHJvdmlkZWQgYW5kIGFkZHMKKyAqIHRoZSBkZXZpY2UgdG8gdGhlIFBNIGRvbWFpbi4gUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IG9mX2dlbnBkX2FkZF9kZXZpY2Uoc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqZ2VucGRzcGVjLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZDsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmZ3BkX2xpc3RfbG9jayk7CisKKwlnZW5wZCA9IGdlbnBkX2dldF9mcm9tX3Byb3ZpZGVyKGdlbnBkc3BlYyk7CisJaWYgKElTX0VSUihnZW5wZCkpIHsKKwkJcmV0ID0gUFRSX0VSUihnZW5wZCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IGdlbnBkX2FkZF9kZXZpY2UoZ2VucGQsIGRldiwgTlVMTCk7CisKK291dDoKKwltdXRleF91bmxvY2soJmdwZF9saXN0X2xvY2spOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9mX2dlbnBkX2FkZF9kZXZpY2UpOworCisvKioKKyAqIG9mX2dlbnBkX2FkZF9zdWJkb21haW4gLSBBZGQgYSBzdWJkb21haW4gdG8gYW4gSS9PIFBNIGRvbWFpbi4KKyAqIEBwYXJlbnRfc3BlYzogT0YgcGhhbmRsZSBhcmdzIHRvIHVzZSBmb3IgcGFyZW50IFBNIGRvbWFpbiBsb29rLXVwCisgKiBAc3ViZG9tYWluX3NwZWM6IE9GIHBoYW5kbGUgYXJncyB0byB1c2UgZm9yIHN1YmRvbWFpbiBsb29rLXVwCisgKgorICogTG9va3MtdXAgYSBwYXJlbnQgUE0gZG9tYWluIGFuZCBzdWJkb21haW4gYmFzZWQgdXBvbiBwaGFuZGxlIGFyZ3MKKyAqIHByb3ZpZGVkIGFuZCBhZGRzIHRoZSBzdWJkb21haW4gdG8gdGhlIHBhcmVudCBQTSBkb21haW4uIFJldHVybnMgYQorICogbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitpbnQgb2ZfZ2VucGRfYWRkX3N1YmRvbWFpbihzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpwYXJlbnRfc3BlYywKKwkJCSAgIHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKnN1YmRvbWFpbl9zcGVjKQoreworCXN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqcGFyZW50LCAqc3ViZG9tYWluOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZncGRfbGlzdF9sb2NrKTsKKworCXBhcmVudCA9IGdlbnBkX2dldF9mcm9tX3Byb3ZpZGVyKHBhcmVudF9zcGVjKTsKKwlpZiAoSVNfRVJSKHBhcmVudCkpIHsKKwkJcmV0ID0gUFRSX0VSUihwYXJlbnQpOworCQlnb3RvIG91dDsKKwl9CisKKwlzdWJkb21haW4gPSBnZW5wZF9nZXRfZnJvbV9wcm92aWRlcihzdWJkb21haW5fc3BlYyk7CisJaWYgKElTX0VSUihzdWJkb21haW4pKSB7CisJCXJldCA9IFBUUl9FUlIoc3ViZG9tYWluKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gZ2VucGRfYWRkX3N1YmRvbWFpbihwYXJlbnQsIHN1YmRvbWFpbik7CisKK291dDoKKwltdXRleF91bmxvY2soJmdwZF9saXN0X2xvY2spOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9mX2dlbnBkX2FkZF9zdWJkb21haW4pOworCisvKioKKyAqIG9mX2dlbnBkX3JlbW92ZV9sYXN0IC0gUmVtb3ZlIHRoZSBsYXN0IFBNIGRvbWFpbiByZWdpc3RlcmVkIGZvciBhIHByb3ZpZGVyCisgKiBAcHJvdmlkZXI6IFBvaW50ZXIgdG8gZGV2aWNlIHN0cnVjdHVyZSBhc3NvY2lhdGVkIHdpdGggcHJvdmlkZXIKKyAqCisgKiBGaW5kIHRoZSBsYXN0IFBNIGRvbWFpbiB0aGF0IHdhcyBhZGRlZCBieSBhIHBhcnRpY3VsYXIgcHJvdmlkZXIgYW5kCisgKiByZW1vdmUgdGhpcyBQTSBkb21haW4gZnJvbSB0aGUgbGlzdCBvZiBQTSBkb21haW5zLiBUaGUgcHJvdmlkZXIgaXMKKyAqIGlkZW50aWZpZWQgYnkgdGhlICdwcm92aWRlcicgZGV2aWNlIHN0cnVjdHVyZSB0aGF0IGlzIHBhc3NlZC4gVGhlIFBNCisgKiBkb21haW4gd2lsbCBvbmx5IGJlIHJlbW92ZWQsIGlmIHRoZSBwcm92aWRlciBhc3NvY2lhdGVkIHdpdGggZG9tYWluCisgKiBoYXMgYmVlbiByZW1vdmVkLgorICoKKyAqIFJldHVybnMgYSB2YWxpZCBwb2ludGVyIHRvIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiBvbiBzdWNjZXNzIG9yCisgKiBFUlJfUFRSKCkgb24gZmFpbHVyZS4KKyAqLworc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpvZl9nZW5wZF9yZW1vdmVfbGFzdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCXN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ3BkLCAqZ2VucGQgPSBFUlJfUFRSKC1FTk9FTlQpOworCWludCByZXQ7CisKKwlpZiAoSVNfRVJSX09SX05VTEwobnApKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCW11dGV4X2xvY2soJmdwZF9saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZ3BkLCAmZ3BkX2xpc3QsIGdwZF9saXN0X25vZGUpIHsKKwkJaWYgKGdwZC0+cHJvdmlkZXIgPT0gJm5wLT5md25vZGUpIHsKKwkJCXJldCA9IGdlbnBkX3JlbW92ZShncGQpOworCQkJZ2VucGQgPSByZXQgPyBFUlJfUFRSKHJldCkgOiBncGQ7CisJCQlicmVhazsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmdwZF9saXN0X2xvY2spOworCisJcmV0dXJuIGdlbnBkOworfQorRVhQT1JUX1NZTUJPTF9HUEwob2ZfZ2VucGRfcmVtb3ZlX2xhc3QpOwogCiAvKioKICAqIGdlbnBkX2Rldl9wbV9kZXRhY2ggLSBEZXRhY2ggYSBkZXZpY2UgZnJvbSBpdHMgUE0gZG9tYWluLgpAQCAtMTUxNSwxNCArMTc4NiwxNCBAQAogCXVuc2lnbmVkIGludCBpOwogCWludCByZXQgPSAwOwogCi0JcGQgPSBwbV9nZW5wZF9sb29rdXBfZGV2KGRldik7Ci0JaWYgKCFwZCkKKwlwZCA9IGRldl90b19nZW5wZChkZXYpOworCWlmIChJU19FUlIocGQpKQogCQlyZXR1cm47CiAKIAlkZXZfZGJnKGRldiwgInJlbW92aW5nIGZyb20gUE0gZG9tYWluICVzXG4iLCBwZC0+bmFtZSk7CiAKIAlmb3IgKGkgPSAxOyBpIDwgR0VOUERfUkVUUllfTUFYX01TOyBpIDw8PSAxKSB7Ci0JCXJldCA9IHBtX2dlbnBkX3JlbW92ZV9kZXZpY2UocGQsIGRldik7CisJCXJldCA9IGdlbnBkX3JlbW92ZV9kZXZpY2UocGQsIGRldik7CiAJCWlmIChyZXQgIT0gLUVBR0FJTikKIAkJCWJyZWFrOwogCkBAIC0xNTk2LDkgKzE4NjcsMTEgQEAKIAkJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCXBkID0gb2ZfZ2VucGRfZ2V0X2Zyb21fcHJvdmlkZXIoJnBkX2FyZ3MpOworCW11dGV4X2xvY2soJmdwZF9saXN0X2xvY2spOworCXBkID0gZ2VucGRfZ2V0X2Zyb21fcHJvdmlkZXIoJnBkX2FyZ3MpOwogCW9mX25vZGVfcHV0KHBkX2FyZ3MubnApOwogCWlmIChJU19FUlIocGQpKSB7CisJCW11dGV4X3VubG9jaygmZ3BkX2xpc3RfbG9jayk7CiAJCWRldl9kYmcoZGV2LCAiJXMoKSBmYWlsZWQgdG8gZmluZCBQTSBkb21haW46ICVsZFxuIiwKIAkJCV9fZnVuY19fLCBQVFJfRVJSKHBkKSk7CiAJCXJldHVybiAtRVBST0JFX0RFRkVSOwpAQCAtMTYwNywxMyArMTg4MCwxNCBAQAogCWRldl9kYmcoZGV2LCAiYWRkaW5nIHRvIFBNIGRvbWFpbiAlc1xuIiwgcGQtPm5hbWUpOwogCiAJZm9yIChpID0gMTsgaSA8IEdFTlBEX1JFVFJZX01BWF9NUzsgaSA8PD0gMSkgewotCQlyZXQgPSBwbV9nZW5wZF9hZGRfZGV2aWNlKHBkLCBkZXYpOworCQlyZXQgPSBnZW5wZF9hZGRfZGV2aWNlKHBkLCBkZXYsIE5VTEwpOwogCQlpZiAocmV0ICE9IC1FQUdBSU4pCiAJCQlicmVhazsKIAogCQltZGVsYXkoaSk7CiAJCWNvbmRfcmVzY2hlZCgpOwogCX0KKwltdXRleF91bmxvY2soJmdwZF9saXN0X2xvY2spOwogCiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gYWRkIHRvIFBNIGRvbWFpbiAlczogJWQiLApAQCAtMTYzNiw3ICsxOTEwLDcgQEAKIAogLyoqKiAgICAgICAgZGVidWdmcyBzdXBwb3J0ICAgICAgICAqKiovCiAKLSNpZmRlZiBDT05GSUdfUE1fQURWQU5DRURfREVCVUcKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KQEAgLTE3ODQsNCArMjA1OCw0IEBACiAJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKHBtX2dlbnBkX2RlYnVnZnNfZGlyKTsKIH0KIF9fZXhpdGNhbGwocG1fZ2VucGRfZGVidWdfZXhpdCk7Ci0jZW5kaWYgLyogQ09ORklHX1BNX0FEVkFOQ0VEX0RFQlVHICovCisjZW5kaWYgLyogQ09ORklHX0RFQlVHX0ZTICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvb3BwL2NvcmUuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9vcHAvY29yZS5jCmluZGV4IGRmMGM3MDkuLjRjN2M2ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9vcHAvY29yZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9vcHAvY29yZS5jCkBAIC01ODQsNyArNTg0LDYgQEAKIAlzdHJ1Y3QgY2xrICpjbGs7CiAJdW5zaWduZWQgbG9uZyBmcmVxLCBvbGRfZnJlcTsKIAl1bnNpZ25lZCBsb25nIHVfdm9sdCwgdV92b2x0X21pbiwgdV92b2x0X21heDsKLQl1bnNpZ25lZCBsb25nIG91X3ZvbHQsIG91X3ZvbHRfbWluLCBvdV92b2x0X21heDsKIAlpbnQgcmV0OwogCiAJaWYgKHVubGlrZWx5KCF0YXJnZXRfZnJlcSkpIHsKQEAgLTYyMCwxMSArNjE5LDcgQEAKIAl9CiAKIAlvbGRfb3BwID0gX2ZpbmRfZnJlcV9jZWlsKG9wcF90YWJsZSwgJm9sZF9mcmVxKTsKLQlpZiAoIUlTX0VSUihvbGRfb3BwKSkgewotCQlvdV92b2x0ID0gb2xkX29wcC0+dV92b2x0OwotCQlvdV92b2x0X21pbiA9IG9sZF9vcHAtPnVfdm9sdF9taW47Ci0JCW91X3ZvbHRfbWF4ID0gb2xkX29wcC0+dV92b2x0X21heDsKLQl9IGVsc2UgeworCWlmIChJU19FUlIob2xkX29wcCkpIHsKIAkJZGV2X2VycihkZXYsICIlczogZmFpbGVkIHRvIGZpbmQgY3VycmVudCBPUFAgZm9yIGZyZXEgJWx1ICglbGQpXG4iLAogCQkJX19mdW5jX18sIG9sZF9mcmVxLCBQVFJfRVJSKG9sZF9vcHApKTsKIAl9CkBAIC02ODMsNyArNjc4LDggQEAKIHJlc3RvcmVfdm9sdGFnZToKIAkvKiBUaGlzIHNob3VsZG4ndCBoYXJtIGV2ZW4gaWYgdGhlIHZvbHRhZ2VzIHdlcmVuJ3QgdXBkYXRlZCBlYXJsaWVyICovCiAJaWYgKCFJU19FUlIob2xkX29wcCkpCi0JCV9zZXRfb3BwX3ZvbHRhZ2UoZGV2LCByZWcsIG91X3ZvbHQsIG91X3ZvbHRfbWluLCBvdV92b2x0X21heCk7CisJCV9zZXRfb3BwX3ZvbHRhZ2UoZGV2LCByZWcsIG9sZF9vcHAtPnVfdm9sdCwKKwkJCQkgb2xkX29wcC0+dV92b2x0X21pbiwgb2xkX29wcC0+dV92b2x0X21heCk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL29wcC9vZi5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL29wcC9vZi5jCmluZGV4IDFkZmQzZGQuLjU1NTIyMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9vcHAvb2YuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvb3BwL29mLmMKQEAgLTcxLDggKzcxLDE4IEBACiAJdTMyIHZlcnNpb247CiAJaW50IHJldDsKIAotCWlmICghb3BwX3RhYmxlLT5zdXBwb3J0ZWRfaHcpCi0JCXJldHVybiB0cnVlOworCWlmICghb3BwX3RhYmxlLT5zdXBwb3J0ZWRfaHcpIHsKKwkJLyoKKwkJICogSW4gdGhlIGNhc2UgdGhhdCBubyBzdXBwb3J0ZWRfaHcgaGFzIGJlZW4gc2V0IGJ5IHRoZQorCQkgKiBwbGF0Zm9ybSBidXQgdGhlcmUgaXMgYW4gb3BwLXN1cHBvcnRlZC1odyB2YWx1ZSBzZXQgZm9yCisJCSAqIGFuIE9QUCB0aGVuIHRoZSBPUFAgc2hvdWxkIG5vdCBiZSBlbmFibGVkIGFzIHRoZXJlIGlzCisJCSAqIG5vIHdheSB0byBzZWUgaWYgdGhlIGhhcmR3YXJlIHN1cHBvcnRzIGl0LgorCQkgKi8KKwkJaWYgKG9mX2ZpbmRfcHJvcGVydHkobnAsICJvcHAtc3VwcG9ydGVkLWh3IiwgTlVMTCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWVsc2UKKwkJCXJldHVybiB0cnVlOworCX0KIAogCXdoaWxlIChjb3VudC0tKSB7CiAJCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2luZGV4KG5wLCAib3BwLXN1cHBvcnRlZC1odyIsIGNvdW50LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL3J1bnRpbWUuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9ydW50aW1lLmMKaW5kZXggZTA5N2QzNS4uODJhMDgxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL3J1bnRpbWUuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvcnVudGltZS5jCkBAIC0zMDEsNyArMzAxLDcgQEAKIAlpbnQgKCpjYWxsYmFjaykoc3RydWN0IGRldmljZSAqKTsKIAlpbnQgcmV0dmFsOwogCi0JdHJhY2VfcnBtX2lkbGUoZGV2LCBycG1mbGFncyk7CisJdHJhY2VfcnBtX2lkbGVfcmN1aWRsZShkZXYsIHJwbWZsYWdzKTsKIAlyZXR2YWwgPSBycG1fY2hlY2tfc3VzcGVuZF9hbGxvd2VkKGRldik7CiAJaWYgKHJldHZhbCA8IDApCiAJCTsJLyogQ29uZGl0aW9ucyBhcmUgd3JvbmcuICovCkBAIC0zMzcsNyArMzM3LDcgQEAKIAkJCWRldi0+cG93ZXIucmVxdWVzdF9wZW5kaW5nID0gdHJ1ZTsKIAkJCXF1ZXVlX3dvcmsocG1fd3EsICZkZXYtPnBvd2VyLndvcmspOwogCQl9Ci0JCXRyYWNlX3JwbV9yZXR1cm5faW50KGRldiwgX1RISVNfSVBfLCAwKTsKKwkJdHJhY2VfcnBtX3JldHVybl9pbnRfcmN1aWRsZShkZXYsIF9USElTX0lQXywgMCk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMzUyLDcgKzM1Miw3IEBACiAJd2FrZV91cF9hbGwoJmRldi0+cG93ZXIud2FpdF9xdWV1ZSk7CiAKICBvdXQ6Ci0JdHJhY2VfcnBtX3JldHVybl9pbnQoZGV2LCBfVEhJU19JUF8sIHJldHZhbCk7CisJdHJhY2VfcnBtX3JldHVybl9pbnRfcmN1aWRsZShkZXYsIF9USElTX0lQXywgcmV0dmFsKTsKIAlyZXR1cm4gcmV0dmFsID8gcmV0dmFsIDogcnBtX3N1c3BlbmQoZGV2LCBycG1mbGFncyB8IFJQTV9BVVRPKTsKIH0KIApAQCAtNDE5LDcgKzQxOSw3IEBACiAJc3RydWN0IGRldmljZSAqcGFyZW50ID0gTlVMTDsKIAlpbnQgcmV0dmFsOwogCi0JdHJhY2VfcnBtX3N1c3BlbmQoZGV2LCBycG1mbGFncyk7CisJdHJhY2VfcnBtX3N1c3BlbmRfcmN1aWRsZShkZXYsIHJwbWZsYWdzKTsKIAogIHJlcGVhdDoKIAlyZXR2YWwgPSBycG1fY2hlY2tfc3VzcGVuZF9hbGxvd2VkKGRldik7CkBAIC01NDksNyArNTQ5LDcgQEAKIAl9CiAKICBvdXQ6Ci0JdHJhY2VfcnBtX3JldHVybl9pbnQoZGV2LCBfVEhJU19JUF8sIHJldHZhbCk7CisJdHJhY2VfcnBtX3JldHVybl9pbnRfcmN1aWRsZShkZXYsIF9USElTX0lQXywgcmV0dmFsKTsKIAogCXJldHVybiByZXR2YWw7CiAKQEAgLTYwMSw3ICs2MDEsNyBAQAogCXN0cnVjdCBkZXZpY2UgKnBhcmVudCA9IE5VTEw7CiAJaW50IHJldHZhbCA9IDA7CiAKLQl0cmFjZV9ycG1fcmVzdW1lKGRldiwgcnBtZmxhZ3MpOworCXRyYWNlX3JwbV9yZXN1bWVfcmN1aWRsZShkZXYsIHJwbWZsYWdzKTsKIAogIHJlcGVhdDoKIAlpZiAoZGV2LT5wb3dlci5ydW50aW1lX2Vycm9yKQpAQCAtNzY0LDcgKzc2NCw3IEBACiAJCXNwaW5fbG9ja19pcnEoJmRldi0+cG93ZXIubG9jayk7CiAJfQogCi0JdHJhY2VfcnBtX3JldHVybl9pbnQoZGV2LCBfVEhJU19JUF8sIHJldHZhbCk7CisJdHJhY2VfcnBtX3JldHVybl9pbnRfcmN1aWRsZShkZXYsIF9USElTX0lQXywgcmV0dmFsKTsKIAogCXJldHVybiByZXR2YWw7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL2ludGVybmFsLmggYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL2ludGVybmFsLmgKaW5kZXggYTAzODAzMy4uMmE0NDM1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3JlZ21hcC9pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvaW50ZXJuYWwuaApAQCAtMTA1LDggKzEwNSw4IEBACiAKIAlib29sIGRlZmVyX2NhY2hpbmc7CiAKLQl1OCByZWFkX2ZsYWdfbWFzazsKLQl1OCB3cml0ZV9mbGFnX21hc2s7CisJdW5zaWduZWQgbG9uZyByZWFkX2ZsYWdfbWFzazsKKwl1bnNpZ25lZCBsb25nIHdyaXRlX2ZsYWdfbWFzazsKIAogCS8qIG51bWJlciBvZiBiaXRzIHRvIChsZWZ0KSBzaGlmdCB0aGUgcmVnIHZhbHVlIHdoZW4gZm9ybWF0dGluZyovCiAJaW50IHJlZ19zaGlmdDsKQEAgLTE3Myw2ICsxNzMsNyBAQAogCWludCAoKmRyb3ApKHN0cnVjdCByZWdtYXAgKm1hcCwgdW5zaWduZWQgaW50IG1pbiwgdW5zaWduZWQgaW50IG1heCk7CiB9OwogCitib29sIHJlZ21hcF9jYWNoZWQoc3RydWN0IHJlZ21hcCAqbWFwLCB1bnNpZ25lZCBpbnQgcmVnKTsKIGJvb2wgcmVnbWFwX3dyaXRlYWJsZShzdHJ1Y3QgcmVnbWFwICptYXAsIHVuc2lnbmVkIGludCByZWcpOwogYm9vbCByZWdtYXBfcmVhZGFibGUoc3RydWN0IHJlZ21hcCAqbWFwLCB1bnNpZ25lZCBpbnQgcmVnKTsKIGJvb2wgcmVnbWFwX3ZvbGF0aWxlKHN0cnVjdCByZWdtYXAgKm1hcCwgdW5zaWduZWQgaW50IHJlZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ2NhY2hlLXJidHJlZS5jIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdjYWNoZS1yYnRyZWUuYwppbmRleCBhYTU2YWY4Li5iMTFhZjNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ2NhY2hlLXJidHJlZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnY2FjaGUtcmJ0cmVlLmMKQEAgLTQwNCw2ICs0MDQsNyBAQAogCQl1bnNpZ25lZCBpbnQgbmV3X2Jhc2VfcmVnLCBuZXdfdG9wX3JlZzsKIAkJdW5zaWduZWQgaW50IG1pbiwgbWF4OwogCQl1bnNpZ25lZCBpbnQgbWF4X2Rpc3Q7CisJCXVuc2lnbmVkIGludCBkaXN0LCBiZXN0X2Rpc3QgPSBVSU5UX01BWDsKIAogCQltYXhfZGlzdCA9IG1hcC0+cmVnX3N0cmlkZSAqIHNpemVvZigqcmJub2RlX3RtcCkgLwogCQkJbWFwLT5jYWNoZV93b3JkX3NpemU7CkBAIC00MjMsMjQgKzQyNCw0MSBAQAogCQkJCSZiYXNlX3JlZywgJnRvcF9yZWcpOwogCiAJCQlpZiAoYmFzZV9yZWcgPD0gbWF4ICYmIHRvcF9yZWcgPj0gbWluKSB7Ci0JCQkJbmV3X2Jhc2VfcmVnID0gbWluKHJlZywgYmFzZV9yZWcpOwotCQkJCW5ld190b3BfcmVnID0gbWF4KHJlZywgdG9wX3JlZyk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChtYXggPCBiYXNlX3JlZykKLQkJCQkJbm9kZSA9IG5vZGUtPnJiX2xlZnQ7CisJCQkJaWYgKHJlZyA8IGJhc2VfcmVnKQorCQkJCQlkaXN0ID0gYmFzZV9yZWcgLSByZWc7CisJCQkJZWxzZSBpZiAocmVnID4gdG9wX3JlZykKKwkJCQkJZGlzdCA9IHJlZyAtIHRvcF9yZWc7CiAJCQkJZWxzZQotCQkJCQlub2RlID0gbm9kZS0+cmJfcmlnaHQ7Ci0KLQkJCQljb250aW51ZTsKKwkJCQkJZGlzdCA9IDA7CisJCQkJaWYgKGRpc3QgPCBiZXN0X2Rpc3QpIHsKKwkJCQkJcmJub2RlID0gcmJub2RlX3RtcDsKKwkJCQkJYmVzdF9kaXN0ID0gZGlzdDsKKwkJCQkJbmV3X2Jhc2VfcmVnID0gbWluKHJlZywgYmFzZV9yZWcpOworCQkJCQluZXdfdG9wX3JlZyA9IG1heChyZWcsIHRvcF9yZWcpOworCQkJCX0KIAkJCX0KIAotCQkJcmV0ID0gcmVnY2FjaGVfcmJ0cmVlX2luc2VydF90b19ibG9jayhtYXAsIHJibm9kZV90bXAsCisJCQkvKgorCQkJICogS2VlcCBsb29raW5nLCB3ZSB3YW50IHRvIGNob29zZSB0aGUgY2xvc2VzdCBibG9jaywKKwkJCSAqIG90aGVyd2lzZSB3ZSBtaWdodCBlbmQgdXAgY3JlYXRpbmcgb3ZlcmxhcHBpbmcKKwkJCSAqIGJsb2Nrcywgd2hpY2ggYnJlYWtzIHRoZSByYnRyZWUuCisJCQkgKi8KKwkJCWlmIChyZWcgPCBiYXNlX3JlZykKKwkJCQlub2RlID0gbm9kZS0+cmJfbGVmdDsKKwkJCWVsc2UgaWYgKHJlZyA+IHRvcF9yZWcpCisJCQkJbm9kZSA9IG5vZGUtPnJiX3JpZ2h0OworCQkJZWxzZQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKHJibm9kZSkgeworCQkJcmV0ID0gcmVnY2FjaGVfcmJ0cmVlX2luc2VydF90b19ibG9jayhtYXAsIHJibm9kZSwKIAkJCQkJCQkgICAgICBuZXdfYmFzZV9yZWcsCiAJCQkJCQkJICAgICAgbmV3X3RvcF9yZWcsIHJlZywKIAkJCQkJCQkgICAgICB2YWx1ZSk7CiAJCQlpZiAocmV0KQogCQkJCXJldHVybiByZXQ7Ci0JCQlyYnRyZWVfY3R4LT5jYWNoZWRfcmJub2RlID0gcmJub2RlX3RtcDsKKwkJCXJidHJlZV9jdHgtPmNhY2hlZF9yYm5vZGUgPSByYm5vZGU7CiAJCQlyZXR1cm4gMDsKIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ2NhY2hlLmMgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ2NhY2hlLmMKaW5kZXggZGY3ZmY3MjkuLjRlNTgyNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnY2FjaGUuYworKysgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ2NhY2hlLmMKQEAgLTM4LDEwICszOCwxMSBAQAogCiAJLyogY2FsY3VsYXRlIHRoZSBzaXplIG9mIHJlZ19kZWZhdWx0cyAqLwogCWZvciAoY291bnQgPSAwLCBpID0gMDsgaSA8IG1hcC0+bnVtX3JlZ19kZWZhdWx0c19yYXc7IGkrKykKLQkJaWYgKCFyZWdtYXBfdm9sYXRpbGUobWFwLCBpICogbWFwLT5yZWdfc3RyaWRlKSkKKwkJaWYgKHJlZ21hcF9yZWFkYWJsZShtYXAsIGkgKiBtYXAtPnJlZ19zdHJpZGUpICYmCisJCSAgICAhcmVnbWFwX3ZvbGF0aWxlKG1hcCwgaSAqIG1hcC0+cmVnX3N0cmlkZSkpCiAJCQljb3VudCsrOwogCi0JLyogYWxsIHJlZ2lzdGVycyBhcmUgdm9sYXRpbGUsIHNvIGp1c3QgYnlwYXNzICovCisJLyogYWxsIHJlZ2lzdGVycyBhcmUgdW5yZWFkYWJsZSBvciB2b2xhdGlsZSwgc28ganVzdCBieXBhc3MgKi8KIAlpZiAoIWNvdW50KSB7CiAJCW1hcC0+Y2FjaGVfYnlwYXNzID0gdHJ1ZTsKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1kZWJ1Z2ZzLmMgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1kZWJ1Z2ZzLmMKaW5kZXggMWVlM2Q0MC4uMzZjZTM1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLWRlYnVnZnMuYwpAQCAtNzcsNiArNzcsMTcgQEAKIAl9CiB9CiAKK3N0YXRpYyBib29sIHJlZ21hcF9wcmludGFibGUoc3RydWN0IHJlZ21hcCAqbWFwLCB1bnNpZ25lZCBpbnQgcmVnKQoreworCWlmIChyZWdtYXBfcHJlY2lvdXMobWFwLCByZWcpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoIXJlZ21hcF9yZWFkYWJsZShtYXAsIHJlZykgJiYgIXJlZ21hcF9jYWNoZWQobWFwLCByZWcpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKwogLyoKICAqIFdvcmsgb3V0IHdoZXJlIHRoZSBzdGFydCBvZmZzZXQgbWFwcyBpbnRvIHJlZ2lzdGVyIG51bWJlcnMsIGJlYXJpbmcKICAqIGluIG1pbmQgdGhhdCB3ZSBzdXBwcmVzcyBoaWRkZW4gcmVnaXN0ZXJzLgpAQCAtMTA1LDggKzExNiw3IEBACiAJaWYgKGxpc3RfZW1wdHkoJm1hcC0+ZGVidWdmc19vZmZfY2FjaGUpKSB7CiAJCWZvciAoOyBpIDw9IG1hcC0+bWF4X3JlZ2lzdGVyOyBpICs9IG1hcC0+cmVnX3N0cmlkZSkgewogCQkJLyogU2tpcCB1bnByaW50ZWQgcmVnaXN0ZXJzLCBjbG9zaW5nIG9mZiBjYWNoZSBlbnRyeSAqLwotCQkJaWYgKCFyZWdtYXBfcmVhZGFibGUobWFwLCBpKSB8fAotCQkJICAgIHJlZ21hcF9wcmVjaW91cyhtYXAsIGkpKSB7CisJCQlpZiAoIXJlZ21hcF9wcmludGFibGUobWFwLCBpKSkgewogCQkJCWlmIChjKSB7CiAJCQkJCWMtPm1heCA9IHAgLSAxOwogCQkJCQljLT5tYXhfcmVnID0gaSAtIG1hcC0+cmVnX3N0cmlkZTsKQEAgLTIwNCw3ICsyMTQsNyBAQAogCXN0YXJ0X3JlZyA9IHJlZ21hcF9kZWJ1Z2ZzX2dldF9kdW1wX3N0YXJ0KG1hcCwgZnJvbSwgKnBwb3MsICZwKTsKIAogCWZvciAoaSA9IHN0YXJ0X3JlZzsgaSA8PSB0bzsgaSArPSBtYXAtPnJlZ19zdHJpZGUpIHsKLQkJaWYgKCFyZWdtYXBfcmVhZGFibGUobWFwLCBpKSkKKwkJaWYgKCFyZWdtYXBfcmVhZGFibGUobWFwLCBpKSAmJiAhcmVnbWFwX2NhY2hlZChtYXAsIGkpKQogCQkJY29udGludWU7CiAKIAkJaWYgKHJlZ21hcF9wcmVjaW91cyhtYXAsIGkpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAuYyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLmMKaW5kZXggNTFmYTdkNi4uYWU2M2JiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAuYworKysgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC5jCkBAIC05Myw2ICs5MywyOSBAQAogCXJldHVybiB0cnVlOwogfQogCitib29sIHJlZ21hcF9jYWNoZWQoc3RydWN0IHJlZ21hcCAqbWFwLCB1bnNpZ25lZCBpbnQgcmVnKQoreworCWludCByZXQ7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWlmIChtYXAtPmNhY2hlID09IFJFR0NBQ0hFX05PTkUpCisJCXJldHVybiBmYWxzZTsKKworCWlmICghbWFwLT5jYWNoZV9vcHMpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChtYXAtPm1heF9yZWdpc3RlciAmJiByZWcgPiBtYXAtPm1heF9yZWdpc3RlcikKKwkJcmV0dXJuIGZhbHNlOworCisJbWFwLT5sb2NrKG1hcC0+bG9ja19hcmcpOworCXJldCA9IHJlZ2NhY2hlX3JlYWQobWFwLCByZWcsICZ2YWwpOworCW1hcC0+dW5sb2NrKG1hcC0+bG9ja19hcmcpOworCWlmIChyZXQpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCiBib29sIHJlZ21hcF9yZWFkYWJsZShzdHJ1Y3QgcmVnbWFwICptYXAsIHVuc2lnbmVkIGludCByZWcpCiB7CiAJaWYgKCFtYXAtPnJlZ19yZWFkKQpAQCAtNzQ5LDYgKzc3Miw5IEBACiAJCWNhc2UgUkVHTUFQX0VORElBTl9CSUc6CiAJCQltYXAtPmZvcm1hdC5mb3JtYXRfcmVnID0gcmVnbWFwX2Zvcm1hdF8xNl9iZTsKIAkJCWJyZWFrOworCQljYXNlIFJFR01BUF9FTkRJQU5fTElUVExFOgorCQkJbWFwLT5mb3JtYXQuZm9ybWF0X3JlZyA9IHJlZ21hcF9mb3JtYXRfMTZfbGU7CisJCQlicmVhazsKIAkJY2FzZSBSRUdNQVBfRU5ESUFOX05BVElWRToKIAkJCW1hcC0+Zm9ybWF0LmZvcm1hdF9yZWcgPSByZWdtYXBfZm9ybWF0XzE2X25hdGl2ZTsKIAkJCWJyZWFrOwpAQCAtNzY4LDYgKzc5NCw5IEBACiAJCWNhc2UgUkVHTUFQX0VORElBTl9CSUc6CiAJCQltYXAtPmZvcm1hdC5mb3JtYXRfcmVnID0gcmVnbWFwX2Zvcm1hdF8zMl9iZTsKIAkJCWJyZWFrOworCQljYXNlIFJFR01BUF9FTkRJQU5fTElUVExFOgorCQkJbWFwLT5mb3JtYXQuZm9ybWF0X3JlZyA9IHJlZ21hcF9mb3JtYXRfMzJfbGU7CisJCQlicmVhazsKIAkJY2FzZSBSRUdNQVBfRU5ESUFOX05BVElWRToKIAkJCW1hcC0+Zm9ybWF0LmZvcm1hdF9yZWcgPSByZWdtYXBfZm9ybWF0XzMyX25hdGl2ZTsKIAkJCWJyZWFrOwpAQCAtNzgyLDYgKzgxMSw5IEBACiAJCWNhc2UgUkVHTUFQX0VORElBTl9CSUc6CiAJCQltYXAtPmZvcm1hdC5mb3JtYXRfcmVnID0gcmVnbWFwX2Zvcm1hdF82NF9iZTsKIAkJCWJyZWFrOworCQljYXNlIFJFR01BUF9FTkRJQU5fTElUVExFOgorCQkJbWFwLT5mb3JtYXQuZm9ybWF0X3JlZyA9IHJlZ21hcF9mb3JtYXRfNjRfbGU7CisJCQlicmVhazsKIAkJY2FzZSBSRUdNQVBfRU5ESUFOX05BVElWRToKIAkJCW1hcC0+Zm9ybWF0LmZvcm1hdF9yZWcgPSByZWdtYXBfZm9ybWF0XzY0X25hdGl2ZTsKIAkJCWJyZWFrOwpAQCAtMTI5NiwxMiArMTMyOCwyNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCByZWdtYXBfc2V0X3dvcmtfYnVmX2ZsYWdfbWFzayhzdHJ1Y3QgcmVnbWFwICptYXAsIGludCBtYXhfYnl0ZXMsCisJCQkJCSAgdW5zaWduZWQgbG9uZyBtYXNrKQoreworCXU4ICpidWY7CisJaW50IGk7CisKKwlpZiAoIW1hc2sgfHwgIW1hcC0+d29ya19idWYpCisJCXJldHVybjsKKworCWJ1ZiA9IG1hcC0+d29ya19idWY7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWF4X2J5dGVzOyBpKyspCisJCWJ1ZltpXSB8PSAobWFzayA+PiAoOCAqIGkpKSAmIDB4ZmY7Cit9CisKIGludCBfcmVnbWFwX3Jhd193cml0ZShzdHJ1Y3QgcmVnbWFwICptYXAsIHVuc2lnbmVkIGludCByZWcsCiAJCSAgICAgIGNvbnN0IHZvaWQgKnZhbCwgc2l6ZV90IHZhbF9sZW4pCiB7CiAJc3RydWN0IHJlZ21hcF9yYW5nZV9ub2RlICpyYW5nZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXU4ICp1OCA9IG1hcC0+d29ya19idWY7CiAJdm9pZCAqd29ya192YWwgPSBtYXAtPndvcmtfYnVmICsgbWFwLT5mb3JtYXQucmVnX2J5dGVzICsKIAkJbWFwLT5mb3JtYXQucGFkX2J5dGVzOwogCXZvaWQgKmJ1ZjsKQEAgLTEzNzAsOCArMTQxNiw4IEBACiAJfQogCiAJbWFwLT5mb3JtYXQuZm9ybWF0X3JlZyhtYXAtPndvcmtfYnVmLCByZWcsIG1hcC0+cmVnX3NoaWZ0KTsKLQotCXU4WzBdIHw9IG1hcC0+d3JpdGVfZmxhZ19tYXNrOworCXJlZ21hcF9zZXRfd29ya19idWZfZmxhZ19tYXNrKG1hcCwgbWFwLT5mb3JtYXQucmVnX2J5dGVzLAorCQkJCSAgICAgIG1hcC0+d3JpdGVfZmxhZ19tYXNrKTsKIAogCS8qCiAJICogRXNzZW50aWFsbHkgYWxsIEkvTyBtZWNoYW5pc21zIHdpbGwgYmUgZmFzdGVyIHdpdGggYSBzaW5nbGUKQEAgLTE0NzQsNiArMTUyMCwxMiBAQAogCQlyZXQgPSBtYXAtPmJ1cy0+d3JpdGUobWFwLT5idXNfY29udGV4dCwgYnVmLCBsZW4pOwogCiAJCWtmcmVlKGJ1Zik7CisJfSBlbHNlIGlmIChyZXQgIT0gMCAmJiAhbWFwLT5jYWNoZV9ieXBhc3MgJiYgbWFwLT5mb3JtYXQucGFyc2VfdmFsKSB7CisJCS8qIHJlZ2NhY2hlX2Ryb3BfcmVnaW9uKCkgdGFrZXMgbG9jayB0aGF0IHdlIGFscmVhZHkgaGF2ZSwKKwkJICogdGh1cyBjYWxsIG1hcC0+Y2FjaGVfb3BzLT5kcm9wKCkgZGlyZWN0bHkKKwkJICovCisJCWlmIChtYXAtPmNhY2hlX29wcyAmJiBtYXAtPmNhY2hlX29wcy0+ZHJvcCkKKwkJCW1hcC0+Y2FjaGVfb3BzLT5kcm9wKG1hcCwgcmVnLCByZWcgKyAxKTsKIAl9CiAKIAl0cmFjZV9yZWdtYXBfaHdfd3JpdGVfZG9uZShtYXAsIHJlZywgdmFsX2xlbiAvIG1hcC0+Zm9ybWF0LnZhbF9ieXRlcyk7CkBAIC0yMjQ1LDcgKzIyOTcsNiBAQAogCQkJICAgIHVuc2lnbmVkIGludCB2YWxfbGVuKQogewogCXN0cnVjdCByZWdtYXBfcmFuZ2Vfbm9kZSAqcmFuZ2U7Ci0JdTggKnU4ID0gbWFwLT53b3JrX2J1ZjsKIAlpbnQgcmV0OwogCiAJV0FSTl9PTighbWFwLT5idXMpOwpAQCAtMjI2MiwxNSArMjMxMyw4IEBACiAJfQogCiAJbWFwLT5mb3JtYXQuZm9ybWF0X3JlZyhtYXAtPndvcmtfYnVmLCByZWcsIG1hcC0+cmVnX3NoaWZ0KTsKLQotCS8qCi0JICogU29tZSBidXNlcyBvciBkZXZpY2VzIGZsYWcgcmVhZHMgYnkgc2V0dGluZyB0aGUgaGlnaCBiaXRzIGluIHRoZQotCSAqIHJlZ2lzdGVyIGFkZHJlc3M7IHNpbmNlIGl0J3MgYWx3YXlzIHRoZSBoaWdoIGJpdHMgZm9yIGFsbAotCSAqIGN1cnJlbnQgZm9ybWF0cyB3ZSBjYW4gZG8gdGhpcyBoZXJlIHJhdGhlciB0aGFuIGluCi0JICogZm9ybWF0dGluZy4gIFRoaXMgbWF5IGJyZWFrIGlmIHdlIGdldCBpbnRlcmVzdGluZyBmb3JtYXRzLgotCSAqLwotCXU4WzBdIHw9IG1hcC0+cmVhZF9mbGFnX21hc2s7Ci0KKwlyZWdtYXBfc2V0X3dvcmtfYnVmX2ZsYWdfbWFzayhtYXAsIG1hcC0+Zm9ybWF0LnJlZ19ieXRlcywKKwkJCQkgICAgICBtYXAtPnJlYWRfZmxhZ19tYXNrKTsKIAl0cmFjZV9yZWdtYXBfaHdfcmVhZF9zdGFydChtYXAsIHJlZywgdmFsX2xlbiAvIG1hcC0+Zm9ybWF0LnZhbF9ieXRlcyk7CiAKIAlyZXQgPSBtYXAtPmJ1cy0+cmVhZChtYXAtPmJ1c19jb250ZXh0LCBtYXAtPndvcmtfYnVmLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3NvYy5jIGIvZHJpdmVycy9iYXNlL3NvYy5jCmluZGV4IDc1Yjk4YWEuLmI2M2YyM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9zb2MuYworKysgYi9kcml2ZXJzL2Jhc2Uvc29jLmMKQEAgLTYsNyArNiw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0xNjAsMTEgKzE1OSwzIEBACiAJcmV0dXJuIGJ1c19yZWdpc3Rlcigmc29jX2J1c190eXBlKTsKIH0KIGNvcmVfaW5pdGNhbGwoc29jX2J1c19yZWdpc3Rlcik7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzb2NfYnVzX3VucmVnaXN0ZXIodm9pZCkKLXsKLQlpZGFfZGVzdHJveSgmc29jX2lkYSk7Ci0KLQlidXNfdW5yZWdpc3Rlcigmc29jX2J1c190eXBlKTsKLX0KLW1vZHVsZV9leGl0KHNvY19idXNfdW5yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JjbWEvZHJpdmVyX2NoaXBjb21tb24uYyBiL2RyaXZlcnMvYmNtYS9kcml2ZXJfY2hpcGNvbW1vbi5jCmluZGV4IDkyMWNlMTguLmI0ZjY1MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmNtYS9kcml2ZXJfY2hpcGNvbW1vbi5jCisrKyBiL2RyaXZlcnMvYmNtYS9kcml2ZXJfY2hpcGNvbW1vbi5jCkBAIC0zNiwxMiArMzYsMzEgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGJjbWFfY2hpcGNvX2dldF9hbHBfY2xvY2spOwogCitzdGF0aWMgYm9vbCBiY21hX2NvcmVfY2NfaGFzX3BtdV93YXRjaGRvZyhzdHJ1Y3QgYmNtYV9kcnZfY2MgKmNjKQoreworCXN0cnVjdCBiY21hX2J1cyAqYnVzID0gY2MtPmNvcmUtPmJ1czsKKworCWlmIChjYy0+Y2FwYWJpbGl0aWVzICYgQkNNQV9DQ19DQVBfUE1VKSB7CisJCWlmIChidXMtPmNoaXBpbmZvLmlkID09IEJDTUFfQ0hJUF9JRF9CQ001MzU3MykgeworCQkJV0FSTihidXMtPmNoaXBpbmZvLnJldiA8PSAxLCAiTm8gd2F0Y2hkb2cgYXZhaWxhYmxlXG4iKTsKKwkJCS8qIDUzNTczQjAgYW5kIDUzNTczQjEgaGF2ZSBidWdnZWQgUE1VIHdhdGNoZG9nLiBJdCBjYW4KKwkJCSAqIGJlIGVuYWJsZWQgYnV0IHRpbWVyIGNhbid0IGJlIGJ1bXBlZC4gVXNlIENDIG9uZQorCQkJICogaW5zdGVhZC4KKwkJCSAqLworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0gZWxzZSB7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKIHN0YXRpYyB1MzIgYmNtYV9jaGlwY29fd2F0Y2hkb2dfZ2V0X21heF90aW1lcihzdHJ1Y3QgYmNtYV9kcnZfY2MgKmNjKQogewogCXN0cnVjdCBiY21hX2J1cyAqYnVzID0gY2MtPmNvcmUtPmJ1czsKIAl1MzIgbmI7CiAKLQlpZiAoY2MtPmNhcGFiaWxpdGllcyAmIEJDTUFfQ0NfQ0FQX1BNVSkgeworCWlmIChiY21hX2NvcmVfY2NfaGFzX3BtdV93YXRjaGRvZyhjYykpIHsKIAkJaWYgKGJ1cy0+Y2hpcGluZm8uaWQgPT0gQkNNQV9DSElQX0lEX0JDTTQ3MDYpCiAJCQluYiA9IDMyOwogCQllbHNlIGlmIChjYy0+Y29yZS0+aWQucmV2IDwgMjYpCkBAIC05NSw5ICsxMTQsMTYgQEAKIAogaW50IGJjbWFfY2hpcGNvX3dhdGNoZG9nX3JlZ2lzdGVyKHN0cnVjdCBiY21hX2Rydl9jYyAqY2MpCiB7CisJc3RydWN0IGJjbWFfYnVzICpidXMgPSBjYy0+Y29yZS0+YnVzOwogCXN0cnVjdCBiY200N3h4X3dkdCB3ZHQgPSB7fTsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCisJaWYgKGJ1cy0+Y2hpcGluZm8uaWQgPT0gQkNNQV9DSElQX0lEX0JDTTUzNTczICYmCisJICAgIGJ1cy0+Y2hpcGluZm8ucmV2IDw9IDEpIHsKKwkJcHJfZGVidWcoIk5vIHdhdGNoZG9nIG9uIDUzNTczQTAgLyA1MzU3M0ExXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJd2R0LmRyaXZlcl9kYXRhID0gY2M7CiAJd2R0LnRpbWVyX3NldCA9IGJjbWFfY2hpcGNvX3dhdGNoZG9nX3RpbWVyX3NldF93ZHQ7CiAJd2R0LnRpbWVyX3NldF9tcyA9IGJjbWFfY2hpcGNvX3dhdGNoZG9nX3RpbWVyX3NldF9tc193ZHQ7CkBAIC0xMDUsNyArMTMxLDcgQEAKIAkJYmNtYV9jaGlwY29fd2F0Y2hkb2dfZ2V0X21heF90aW1lcihjYykgLyBjYy0+dGlja3NfcGVyX21zOwogCiAJcGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9kYXRhKE5VTEwsICJiY200N3h4LXdkdCIsCi0JCQkJCSAgICAgY2MtPmNvcmUtPmJ1cy0+bnVtLCAmd2R0LAorCQkJCQkgICAgIGJ1cy0+bnVtLCAmd2R0LAogCQkJCQkgICAgIHNpemVvZih3ZHQpKTsKIAlpZiAoSVNfRVJSKHBkZXYpKQogCQlyZXR1cm4gUFRSX0VSUihwZGV2KTsKQEAgLTIxNyw3ICsyNDMsNyBAQAogCXUzMiBtYXh0OwogCiAJbWF4dCA9IGJjbWFfY2hpcGNvX3dhdGNoZG9nX2dldF9tYXhfdGltZXIoY2MpOwotCWlmIChjYy0+Y2FwYWJpbGl0aWVzICYgQkNNQV9DQ19DQVBfUE1VKSB7CisJaWYgKGJjbWFfY29yZV9jY19oYXNfcG11X3dhdGNoZG9nKGNjKSkgewogCQlpZiAodGlja3MgPT0gMSkKIAkJCXRpY2tzID0gMjsKIAkJZWxzZSBpZiAodGlja3MgPiBtYXh0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iY21hL21haW4uYyBiL2RyaXZlcnMvYmNtYS9tYWluLmMKaW5kZXggMWY2MzU0Ny4uMmMxNzk4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iY21hL21haW4uYworKysgYi9kcml2ZXJzL2JjbWEvbWFpbi5jCkBAIC0yMDksNiArMjA5LDggQEAKIAkJY29yZS0+ZGV2Lm9mX25vZGUgPSBub2RlOwogCiAJY29yZS0+aXJxID0gYmNtYV9vZl9nZXRfaXJxKHBhcmVudCwgY29yZSwgMCk7CisKKwlvZl9kbWFfY29uZmlndXJlKCZjb3JlLT5kZXYsIG5vZGUpOwogfQogCiB1bnNpZ25lZCBpbnQgYmNtYV9jb3JlX2lycShzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIGludCBudW0pCkBAIC0yNDgsMTIgKzI1MCwxMiBAQAogCQljb3JlLT5pcnEgPSBidXMtPmhvc3RfcGNpLT5pcnE7CiAJCWJyZWFrOwogCWNhc2UgQkNNQV9IT1NUVFlQRV9TT0M6Ci0JCWNvcmUtPmRldi5kbWFfbWFzayA9ICZjb3JlLT5kZXYuY29oZXJlbnRfZG1hX21hc2s7Ci0JCWlmIChidXMtPmhvc3RfcGRldikgeworCQlpZiAoSVNfRU5BQkxFRChDT05GSUdfT0YpICYmIGJ1cy0+aG9zdF9wZGV2KSB7CiAJCQljb3JlLT5kbWFfZGV2ID0gJmJ1cy0+aG9zdF9wZGV2LT5kZXY7CiAJCQljb3JlLT5kZXYucGFyZW50ID0gJmJ1cy0+aG9zdF9wZGV2LT5kZXY7CiAJCQliY21hX29mX2ZpbGxfZGV2aWNlKGJ1cy0+aG9zdF9wZGV2LCBjb3JlKTsKIAkJfSBlbHNlIHsKKwkJCWNvcmUtPmRldi5kbWFfbWFzayA9ICZjb3JlLT5kZXYuY29oZXJlbnRfZG1hX21hc2s7CiAJCQljb3JlLT5kbWFfZGV2ID0gJmNvcmUtPmRldjsKIAkJfQogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZmxvcHB5LmMgYi9kcml2ZXJzL2Jsb2NrL2Zsb3BweS5jCmluZGV4IGI3MWE5YzcuLmUzZDhlNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svZmxvcHB5LmMKKysrIGIvZHJpdmVycy9ibG9jay9mbG9wcHkuYwpAQCAtMzcwNiwyMiArMzcwNiwyMSBAQAogCWlmIChVRkRDUy0+cmF3Y21kID09IDEpCiAJCVVGRENTLT5yYXdjbWQgPSAyOwogCi0JaWYgKG1vZGUgJiAoRk1PREVfUkVBRHxGTU9ERV9XUklURSkpIHsKLQkJVURSUy0+bGFzdF9jaGVja2VkID0gMDsKLQkJY2xlYXJfYml0KEZEX09QRU5fU0hPVUxEX0ZBSUxfQklULCAmVURSUy0+ZmxhZ3MpOwotCQljaGVja19kaXNrX2NoYW5nZShiZGV2KTsKLQkJaWYgKHRlc3RfYml0KEZEX0RJU0tfQ0hBTkdFRF9CSVQsICZVRFJTLT5mbGFncykpCi0JCQlnb3RvIG91dDsKLQkJaWYgKHRlc3RfYml0KEZEX09QRU5fU0hPVUxEX0ZBSUxfQklULCAmVURSUy0+ZmxhZ3MpKQorCWlmICghKG1vZGUgJiBGTU9ERV9OREVMQVkpKSB7CisJCWlmIChtb2RlICYgKEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpKSB7CisJCQlVRFJTLT5sYXN0X2NoZWNrZWQgPSAwOworCQkJY2xlYXJfYml0KEZEX09QRU5fU0hPVUxEX0ZBSUxfQklULCAmVURSUy0+ZmxhZ3MpOworCQkJY2hlY2tfZGlza19jaGFuZ2UoYmRldik7CisJCQlpZiAodGVzdF9iaXQoRkRfRElTS19DSEFOR0VEX0JJVCwgJlVEUlMtPmZsYWdzKSkKKwkJCQlnb3RvIG91dDsKKwkJCWlmICh0ZXN0X2JpdChGRF9PUEVOX1NIT1VMRF9GQUlMX0JJVCwgJlVEUlMtPmZsYWdzKSkKKwkJCQlnb3RvIG91dDsKKwkJfQorCQlyZXMgPSAtRVJPRlM7CisJCWlmICgobW9kZSAmIEZNT0RFX1dSSVRFKSAmJgorCQkgICAgIXRlc3RfYml0KEZEX0RJU0tfV1JJVEFCTEVfQklULCAmVURSUy0+ZmxhZ3MpKQogCQkJZ290byBvdXQ7CiAJfQotCi0JcmVzID0gLUVST0ZTOwotCi0JaWYgKChtb2RlICYgRk1PREVfV1JJVEUpICYmCi0JCQkhdGVzdF9iaXQoRkRfRElTS19XUklUQUJMRV9CSVQsICZVRFJTLT5mbGFncykpCi0JCWdvdG8gb3V0OwotCiAJbXV0ZXhfdW5sb2NrKCZvcGVuX2xvY2spOwogCW11dGV4X3VubG9jaygmZmxvcHB5X211dGV4KTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2Zyb250LmMgYi9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtmcm9udC5jCmluZGV4IGJlNGZlYTYuLjg4ZWY2ZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2Zyb250LmMKKysrIGIvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYwpAQCAtMTg5LDYgKzE4OSw4IEBACiAJc3RydWN0IG11dGV4IG11dGV4OwogCXN0cnVjdCB4ZW5idXNfZGV2aWNlICp4YmRldjsKIAlzdHJ1Y3QgZ2VuZGlzayAqZ2Q7CisJdTE2IHNlY3Rvcl9zaXplOworCXVuc2lnbmVkIGludCBwaHlzaWNhbF9zZWN0b3Jfc2l6ZTsKIAlpbnQgdmRldmljZTsKIAlibGtpZl92ZGV2X3QgaGFuZGxlOwogCWVudW0gYmxraWZfc3RhdGUgY29ubmVjdGVkOwpAQCAtOTEwLDkgKzkxMiw0NSBAQAogCS5tYXBfcXVldWUgPSBibGtfbXFfbWFwX3F1ZXVlLAogfTsKIAorc3RhdGljIHZvaWQgYmxraWZfc2V0X3F1ZXVlX2xpbWl0cyhzdHJ1Y3QgYmxrZnJvbnRfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcnEgPSBpbmZvLT5ycTsKKwlzdHJ1Y3QgZ2VuZGlzayAqZ2QgPSBpbmZvLT5nZDsKKwl1bnNpZ25lZCBpbnQgc2VnbWVudHMgPSBpbmZvLT5tYXhfaW5kaXJlY3Rfc2VnbWVudHMgPyA6CisJCQkJQkxLSUZfTUFYX1NFR01FTlRTX1BFUl9SRVFVRVNUOworCisJcXVldWVfZmxhZ19zZXRfdW5sb2NrZWQoUVVFVUVfRkxBR19WSVJULCBycSk7CisKKwlpZiAoaW5mby0+ZmVhdHVyZV9kaXNjYXJkKSB7CisJCXF1ZXVlX2ZsYWdfc2V0X3VubG9ja2VkKFFVRVVFX0ZMQUdfRElTQ0FSRCwgcnEpOworCQlibGtfcXVldWVfbWF4X2Rpc2NhcmRfc2VjdG9ycyhycSwgZ2V0X2NhcGFjaXR5KGdkKSk7CisJCXJxLT5saW1pdHMuZGlzY2FyZF9ncmFudWxhcml0eSA9IGluZm8tPmRpc2NhcmRfZ3JhbnVsYXJpdHk7CisJCXJxLT5saW1pdHMuZGlzY2FyZF9hbGlnbm1lbnQgPSBpbmZvLT5kaXNjYXJkX2FsaWdubWVudDsKKwkJaWYgKGluZm8tPmZlYXR1cmVfc2VjZGlzY2FyZCkKKwkJCXF1ZXVlX2ZsYWdfc2V0X3VubG9ja2VkKFFVRVVFX0ZMQUdfU0VDRVJBU0UsIHJxKTsKKwl9CisKKwkvKiBIYXJkIHNlY3RvciBzaXplIGFuZCBtYXggc2VjdG9ycyBpbXBlcnNvbmF0ZSB0aGUgZXF1aXYuIGhhcmR3YXJlLiAqLworCWJsa19xdWV1ZV9sb2dpY2FsX2Jsb2NrX3NpemUocnEsIGluZm8tPnNlY3Rvcl9zaXplKTsKKwlibGtfcXVldWVfcGh5c2ljYWxfYmxvY2tfc2l6ZShycSwgaW5mby0+cGh5c2ljYWxfc2VjdG9yX3NpemUpOworCWJsa19xdWV1ZV9tYXhfaHdfc2VjdG9ycyhycSwgKHNlZ21lbnRzICogWEVOX1BBR0VfU0laRSkgLyA1MTIpOworCisJLyogRWFjaCBzZWdtZW50IGluIGEgcmVxdWVzdCBpcyB1cCB0byBhbiBhbGlnbmVkIHBhZ2UgaW4gc2l6ZS4gKi8KKwlibGtfcXVldWVfc2VnbWVudF9ib3VuZGFyeShycSwgUEFHRV9TSVpFIC0gMSk7CisJYmxrX3F1ZXVlX21heF9zZWdtZW50X3NpemUocnEsIFBBR0VfU0laRSk7CisKKwkvKiBFbnN1cmUgYSBtZXJnZWQgcmVxdWVzdCB3aWxsIGZpdCBpbiBhIHNpbmdsZSBJL08gcmluZyBzbG90LiAqLworCWJsa19xdWV1ZV9tYXhfc2VnbWVudHMocnEsIHNlZ21lbnRzIC8gR1JBTlRTX1BFUl9QU0VHKTsKKworCS8qIE1ha2Ugc3VyZSBidWZmZXIgYWRkcmVzc2VzIGFyZSBzZWN0b3ItYWxpZ25lZC4gKi8KKwlibGtfcXVldWVfZG1hX2FsaWdubWVudChycSwgNTExKTsKKworCS8qIE1ha2Ugc3VyZSB3ZSBkb24ndCB1c2UgYm91bmNlIGJ1ZmZlcnMuICovCisJYmxrX3F1ZXVlX2JvdW5jZV9saW1pdChycSwgQkxLX0JPVU5DRV9BTlkpOworfQorCiBzdGF0aWMgaW50IHhsdmJkX2luaXRfYmxrX3F1ZXVlKHN0cnVjdCBnZW5kaXNrICpnZCwgdTE2IHNlY3Rvcl9zaXplLAotCQkJCXVuc2lnbmVkIGludCBwaHlzaWNhbF9zZWN0b3Jfc2l6ZSwKLQkJCQl1bnNpZ25lZCBpbnQgc2VnbWVudHMpCisJCQkJdW5zaWduZWQgaW50IHBoeXNpY2FsX3NlY3Rvcl9zaXplKQogewogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpycTsKIAlzdHJ1Y3QgYmxrZnJvbnRfaW5mbyAqaW5mbyA9IGdkLT5wcml2YXRlX2RhdGE7CkBAIC05NDQsMzYgKzk4MiwxMSBAQAogCX0KIAogCXJxLT5xdWV1ZWRhdGEgPSBpbmZvOwotCXF1ZXVlX2ZsYWdfc2V0X3VubG9ja2VkKFFVRVVFX0ZMQUdfVklSVCwgcnEpOwotCi0JaWYgKGluZm8tPmZlYXR1cmVfZGlzY2FyZCkgewotCQlxdWV1ZV9mbGFnX3NldF91bmxvY2tlZChRVUVVRV9GTEFHX0RJU0NBUkQsIHJxKTsKLQkJYmxrX3F1ZXVlX21heF9kaXNjYXJkX3NlY3RvcnMocnEsIGdldF9jYXBhY2l0eShnZCkpOwotCQlycS0+bGltaXRzLmRpc2NhcmRfZ3JhbnVsYXJpdHkgPSBpbmZvLT5kaXNjYXJkX2dyYW51bGFyaXR5OwotCQlycS0+bGltaXRzLmRpc2NhcmRfYWxpZ25tZW50ID0gaW5mby0+ZGlzY2FyZF9hbGlnbm1lbnQ7Ci0JCWlmIChpbmZvLT5mZWF0dXJlX3NlY2Rpc2NhcmQpCi0JCQlxdWV1ZV9mbGFnX3NldF91bmxvY2tlZChRVUVVRV9GTEFHX1NFQ0VSQVNFLCBycSk7Ci0JfQotCi0JLyogSGFyZCBzZWN0b3Igc2l6ZSBhbmQgbWF4IHNlY3RvcnMgaW1wZXJzb25hdGUgdGhlIGVxdWl2LiBoYXJkd2FyZS4gKi8KLQlibGtfcXVldWVfbG9naWNhbF9ibG9ja19zaXplKHJxLCBzZWN0b3Jfc2l6ZSk7Ci0JYmxrX3F1ZXVlX3BoeXNpY2FsX2Jsb2NrX3NpemUocnEsIHBoeXNpY2FsX3NlY3Rvcl9zaXplKTsKLQlibGtfcXVldWVfbWF4X2h3X3NlY3RvcnMocnEsIChzZWdtZW50cyAqIFhFTl9QQUdFX1NJWkUpIC8gNTEyKTsKLQotCS8qIEVhY2ggc2VnbWVudCBpbiBhIHJlcXVlc3QgaXMgdXAgdG8gYW4gYWxpZ25lZCBwYWdlIGluIHNpemUuICovCi0JYmxrX3F1ZXVlX3NlZ21lbnRfYm91bmRhcnkocnEsIFBBR0VfU0laRSAtIDEpOwotCWJsa19xdWV1ZV9tYXhfc2VnbWVudF9zaXplKHJxLCBQQUdFX1NJWkUpOwotCi0JLyogRW5zdXJlIGEgbWVyZ2VkIHJlcXVlc3Qgd2lsbCBmaXQgaW4gYSBzaW5nbGUgSS9PIHJpbmcgc2xvdC4gKi8KLQlibGtfcXVldWVfbWF4X3NlZ21lbnRzKHJxLCBzZWdtZW50cyAvIEdSQU5UU19QRVJfUFNFRyk7Ci0KLQkvKiBNYWtlIHN1cmUgYnVmZmVyIGFkZHJlc3NlcyBhcmUgc2VjdG9yLWFsaWduZWQuICovCi0JYmxrX3F1ZXVlX2RtYV9hbGlnbm1lbnQocnEsIDUxMSk7Ci0KLQkvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgdXNlIGJvdW5jZSBidWZmZXJzLiAqLwotCWJsa19xdWV1ZV9ib3VuY2VfbGltaXQocnEsIEJMS19CT1VOQ0VfQU5ZKTsKLQotCWdkLT5xdWV1ZSA9IHJxOworCWluZm8tPnJxID0gZ2QtPnF1ZXVlID0gcnE7CisJaW5mby0+Z2QgPSBnZDsKKwlpbmZvLT5zZWN0b3Jfc2l6ZSA9IHNlY3Rvcl9zaXplOworCWluZm8tPnBoeXNpY2FsX3NlY3Rvcl9zaXplID0gcGh5c2ljYWxfc2VjdG9yX3NpemU7CisJYmxraWZfc2V0X3F1ZXVlX2xpbWl0cyhpbmZvKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTEzNiwxNiArMTE0OSwxMSBAQAogCWdkLT5wcml2YXRlX2RhdGEgPSBpbmZvOwogCXNldF9jYXBhY2l0eShnZCwgY2FwYWNpdHkpOwogCi0JaWYgKHhsdmJkX2luaXRfYmxrX3F1ZXVlKGdkLCBzZWN0b3Jfc2l6ZSwgcGh5c2ljYWxfc2VjdG9yX3NpemUsCi0JCQkJIGluZm8tPm1heF9pbmRpcmVjdF9zZWdtZW50cyA/IDoKLQkJCQkgQkxLSUZfTUFYX1NFR01FTlRTX1BFUl9SRVFVRVNUKSkgeworCWlmICh4bHZiZF9pbml0X2Jsa19xdWV1ZShnZCwgc2VjdG9yX3NpemUsIHBoeXNpY2FsX3NlY3Rvcl9zaXplKSkgewogCQlkZWxfZ2VuZGlzayhnZCk7CiAJCWdvdG8gcmVsZWFzZTsKIAl9CiAKLQlpbmZvLT5ycSA9IGdkLT5xdWV1ZTsKLQlpbmZvLT5nZCA9IGdkOwotCiAJeGx2YmRfZmx1c2goaW5mbyk7CiAKIAlpZiAodmRpc2tfaW5mbyAmIFZESVNLX1JFQURPTkxZKQpAQCAtMTMxNSw3ICsxMzIzLDcgQEAKIAkJCXJpbmZvLT5yaW5nX3JlZltpXSA9IEdSQU5UX0lOVkFMSURfUkVGOwogCQl9CiAJfQotCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcmluZm8tPnJpbmcuc3JpbmcsIGdldF9vcmRlcihpbmZvLT5ucl9yaW5nX3BhZ2VzICogUEFHRV9TSVpFKSk7CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylyaW5mby0+cmluZy5zcmluZywgZ2V0X29yZGVyKGluZm8tPm5yX3JpbmdfcGFnZXMgKiBYRU5fUEFHRV9TSVpFKSk7CiAJcmluZm8tPnJpbmcuc3JpbmcgPSBOVUxMOwogCiAJaWYgKHJpbmZvLT5pcnEpCkBAIC0yMDA3LDggKzIwMTUsMTAgQEAKIAlzdHJ1Y3Qgc3BsaXRfYmlvICpzcGxpdF9iaW87CiAKIAlibGtmcm9udF9nYXRoZXJfYmFja2VuZF9mZWF0dXJlcyhpbmZvKTsKKwkvKiBSZXNldCBsaW1pdHMgY2hhbmdlZCBieSBibGtfbXFfdXBkYXRlX25yX2h3X3F1ZXVlcygpLiAqLworCWJsa2lmX3NldF9xdWV1ZV9saW1pdHMoaW5mbyk7CiAJc2VncyA9IGluZm8tPm1heF9pbmRpcmVjdF9zZWdtZW50cyA/IDogQkxLSUZfTUFYX1NFR01FTlRTX1BFUl9SRVFVRVNUOwotCWJsa19xdWV1ZV9tYXhfc2VnbWVudHMoaW5mby0+cnEsIHNlZ3MpOworCWJsa19xdWV1ZV9tYXhfc2VnbWVudHMoaW5mby0+cnEsIHNlZ3MgLyBHUkFOVFNfUEVSX1BTRUcpOwogCiAJZm9yIChyX2luZGV4ID0gMDsgcl9pbmRleCA8IGluZm8tPm5yX3JpbmdzOyByX2luZGV4KyspIHsKIAkJc3RydWN0IGJsa2Zyb250X3JpbmdfaW5mbyAqcmluZm8gPSAmaW5mby0+cmluZm9bcl9pbmRleF07CkBAIC0yNDMyLDcgKzI0NDIsNyBAQAogCWlmIChlcnIpIHsKIAkJeGVuYnVzX2Rldl9mYXRhbChpbmZvLT54YmRldiwgZXJyLCAieGx2YmRfYWRkIGF0ICVzIiwKIAkJCQkgaW5mby0+eGJkZXYtPm90aGVyZW5kKTsKLQkJcmV0dXJuOworCQlnb3RvIGZhaWw7CiAJfQogCiAJeGVuYnVzX3N3aXRjaF9zdGF0ZShpbmZvLT54YmRldiwgWGVuYnVzU3RhdGVDb25uZWN0ZWQpOwpAQCAtMjQ0NSw2ICsyNDU1LDExIEBACiAJZGV2aWNlX2FkZF9kaXNrKCZpbmZvLT54YmRldi0+ZGV2LCBpbmZvLT5nZCk7CiAKIAlpbmZvLT5pc19yZWFkeSA9IDE7CisJcmV0dXJuOworCitmYWlsOgorCWJsa2lmX2ZyZWUoaW5mbywgMCk7CisJcmV0dXJuOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL0tjb25maWcgYi9kcml2ZXJzL2JsdWV0b290aC9LY29uZmlnCmluZGV4IGNmNTBmZDIuLjNjYzliZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL0tjb25maWcKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvS2NvbmZpZwpAQCAtMTgwLDYgKzE4MCwxNyBAQAogCiAJICBTYXkgWSBoZXJlIHRvIGNvbXBpbGUgc3VwcG9ydCBmb3IgSW50ZWwgQUc2WFggcHJvdG9jb2wuCiAKK2NvbmZpZyBCVF9IQ0lVQVJUX01SVkwKKwlib29sICJNYXJ2ZWxsIHByb3RvY29sIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBCVF9IQ0lVQVJUCisJc2VsZWN0IEJUX0hDSVVBUlRfSDQKKwloZWxwCisJICBNYXJ2ZWxsIGlzIHNlcmlhbCBwcm90b2NvbCBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIEJsdWV0b290aAorCSAgZGV2aWNlIGFuZCBob3N0LiBUaGlzIHByb3RvY29sIGlzIHJlcXVpcmVkIGZvciBtb3N0IE1hcnZlbGwgQmx1ZXRvb3RoCisJICBkZXZpY2VzIHdpdGggVUFSVCBpbnRlcmZhY2UuCisKKwkgIFNheSBZIGhlcmUgdG8gY29tcGlsZSBzdXBwb3J0IGZvciBIQ0kgTVJWTCBwcm90b2NvbC4KKwogY29uZmlnIEJUX0hDSUJDTTIwM1gKIAl0cmlzdGF0ZSAiSENJIEJDTTIwM3ggVVNCIGRyaXZlciIKIAlkZXBlbmRzIG9uIFVTQgpAQCAtMzMxLDQgKzM0MiwxNiBAQAogCSAgU2F5IFkgaGVyZSB0byBjb21waWxlIHN1cHBvcnQgZm9yIFRleGFzIEluc3RydW1lbnQncyBXaUxpbms3IGRyaXZlcgogCSAgaW50byB0aGUga2VybmVsIG9yIHNheSBNIHRvIGNvbXBpbGUgaXQgYXMgbW9kdWxlIChidHdpbGluaykuCiAKK2NvbmZpZyBCVF9RQ09NU01ECisJdHJpc3RhdGUgIlF1YWxjb21tIFNNRCBiYXNlZCBIQ0kgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFFDT01fU01EICYmIFFDT01fV0NOU1NfQ1RSTAorCXNlbGVjdCBCVF9RQ0EKKwloZWxwCisJICBRdWFsY29tbSBTTUQgYmFzZWQgSENJIGRyaXZlci4KKwkgIFRoaXMgZHJpdmVyIGlzIHVzZWQgdG8gYnJpZGdlIEhDSSBkYXRhIG9udG8gdGhlIHNoYXJlZCBtZW1vcnkKKwkgIGNoYW5uZWxzIHRvIHRoZSBXQ05TUyBjb3JlLgorCisJICBTYXkgWSBoZXJlIHRvIGNvbXBpbGUgc3VwcG9ydCBmb3IgSENJIG92ZXIgUXVhbGNvbW0gU01EIGludG8gdGhlCisJICBrZXJuZWwgb3Igc2F5IE0gdG8gY29tcGlsZSBhcyBhIG1vZHVsZS4KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvTWFrZWZpbGUgYi9kcml2ZXJzL2JsdWV0b290aC9NYWtlZmlsZQppbmRleCA5YzE4OTM5Li5iMWZjMjlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2JsdWV0b290aC9NYWtlZmlsZQpAQCAtMjAsNiArMjAsNyBAQAogb2JqLSQoQ09ORklHX0JUX01SVkwpCQkrPSBidG1ydmwubwogb2JqLSQoQ09ORklHX0JUX01SVkxfU0RJTykJKz0gYnRtcnZsX3NkaW8ubwogb2JqLSQoQ09ORklHX0JUX1dJTElOSykJCSs9IGJ0d2lsaW5rLm8KK29iai0kKENPTkZJR19CVF9RQ09NU01EKQkrPSBidHFjb21zbWQubwogb2JqLSQoQ09ORklHX0JUX0JDTSkJCSs9IGJ0YmNtLm8KIG9iai0kKENPTkZJR19CVF9SVEwpCQkrPSBidHJ0bC5vCiBvYmotJChDT05GSUdfQlRfUUNBKQkJKz0gYnRxY2EubwpAQCAtMzcsNiArMzgsNyBAQAogaGNpX3VhcnQtJChDT05GSUdfQlRfSENJVUFSVF9CQ00pCSs9IGhjaV9iY20ubwogaGNpX3VhcnQtJChDT05GSUdfQlRfSENJVUFSVF9RQ0EpCSs9IGhjaV9xY2EubwogaGNpX3VhcnQtJChDT05GSUdfQlRfSENJVUFSVF9BRzZYWCkJKz0gaGNpX2FnNnh4Lm8KK2hjaV91YXJ0LSQoQ09ORklHX0JUX0hDSVVBUlRfTVJWTCkJKz0gaGNpX21ydmwubwogaGNpX3VhcnQtb2JqcwkJCQk6PSAkKGhjaV91YXJ0LXkpCiAKIGNjZmxhZ3MteSArPSAtRF9fQ0hFQ0tfRU5ESUFOX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2JjbTIwM3guYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2JjbTIwM3guYwppbmRleCA1YjBlZjdiLi41Y2U2ZDQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9iY20yMDN4LmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYmNtMjAzeC5jCkBAIC0xODUsMTAgKzE4NSw4IEBACiAJZGF0YS0+c3RhdGUgPSBCQ00yMDNYX0xPQURfTUlOSURSVjsKIAogCWRhdGEtPnVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkYXRhLT51cmIpIHsKLQkJQlRfRVJSKCJDYW4ndCBhbGxvY2F0ZSBVUkIiKTsKKwlpZiAoIWRhdGEtPnVyYikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZpcm13YXJlLCAiQkNNMjAzMy1NRC5oZXgiLCAmdWRldi0+ZGV2KSA8IDApIHsKIAkJQlRfRVJSKCJNaW5pIGRyaXZlciByZXF1ZXN0IGZhaWxlZCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnRxY2EuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0cWNhLmMKaW5kZXggNGE2MjA4MS4uMjhhZmQ1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnRxY2EuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9idHFjYS5jCkBAIC01NSw4ICs1NSw4IEBACiAJfQogCiAJZWRsID0gKHN0cnVjdCBlZGxfZXZlbnRfaGRyICopKHNrYi0+ZGF0YSk7Ci0JaWYgKCFlZGwgfHwgIWVkbC0+ZGF0YSkgewotCQlCVF9FUlIoIiVzOiBUTFYgd2l0aCBubyBoZWFkZXIgb3Igbm8gZGF0YSIsIGhkZXYtPm5hbWUpOworCWlmICghZWRsKSB7CisJCUJUX0VSUigiJXM6IFRMViB3aXRoIG5vIGhlYWRlciIsIGhkZXYtPm5hbWUpOwogCQllcnIgPSAtRUlMU0VROwogCQlnb3RvIG91dDsKIAl9CkBAIC0yMjQsOCArMjI0LDggQEAKIAl9CiAKIAllZGwgPSAoc3RydWN0IGVkbF9ldmVudF9oZHIgKikoc2tiLT5kYXRhKTsKLQlpZiAoIWVkbCB8fCAhZWRsLT5kYXRhKSB7Ci0JCUJUX0VSUigiJXM6IFRMViB3aXRoIG5vIGhlYWRlciBvciBubyBkYXRhIiwgaGRldi0+bmFtZSk7CisJaWYgKCFlZGwpIHsKKwkJQlRfRVJSKCIlczogVExWIHdpdGggbm8gaGVhZGVyIiwgaGRldi0+bmFtZSk7CiAJCWVyciA9IC1FSUxTRVE7CiAJCWdvdG8gb3V0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0cWNvbXNtZC5jIGIvZHJpdmVycy9ibHVldG9vdGgvYnRxY29tc21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhjMmM5MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0cWNvbXNtZC5jCkBAIC0wLDAgKzEsMTgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2LCBMaW5hcm8gTHRkLgorICogQ29weXJpZ2h0IChjKSAyMDE1LCBTb255IE1vYmlsZSBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvYy9xY29tL3NtZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvYy9xY29tL3djbnNzX2N0cmwuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgorCisjaW5jbHVkZSAiYnRxY2EuaCIKKworc3RydWN0IGJ0cWNvbXNtZCB7CisJc3RydWN0IGhjaV9kZXYgKmhkZXY7CisKKwlzdHJ1Y3QgcWNvbV9zbWRfY2hhbm5lbCAqYWNsX2NoYW5uZWw7CisJc3RydWN0IHFjb21fc21kX2NoYW5uZWwgKmNtZF9jaGFubmVsOworfTsKKworc3RhdGljIGludCBidHFjb21zbWRfcmVjdihzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdW5zaWduZWQgaW50IHR5cGUsCisJCQkgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCS8qIFVzZSBHRlBfQVRPTUlDIGFzIHdlJ3JlIGluIElSUSBjb250ZXh0ICovCisJc2tiID0gYnRfc2tiX2FsbG9jKGNvdW50LCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikgeworCQloZGV2LT5zdGF0LmVycl9yeCsrOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwloY2lfc2tiX3BrdF90eXBlKHNrYikgPSB0eXBlOworCW1lbWNweShza2JfcHV0KHNrYiwgY291bnQpLCBkYXRhLCBjb3VudCk7CisKKwlyZXR1cm4gaGNpX3JlY3ZfZnJhbWUoaGRldiwgc2tiKTsKK30KKworc3RhdGljIGludCBidHFjb21zbWRfYWNsX2NhbGxiYWNrKHN0cnVjdCBxY29tX3NtZF9jaGFubmVsICpjaGFubmVsLAorCQkJCSAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBidHFjb21zbWQgKmJ0cSA9IHFjb21fc21kX2dldF9kcnZkYXRhKGNoYW5uZWwpOworCisJYnRxLT5oZGV2LT5zdGF0LmJ5dGVfcnggKz0gY291bnQ7CisJcmV0dXJuIGJ0cWNvbXNtZF9yZWN2KGJ0cS0+aGRldiwgSENJX0FDTERBVEFfUEtULCBkYXRhLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgYnRxY29tc21kX2NtZF9jYWxsYmFjayhzdHJ1Y3QgcWNvbV9zbWRfY2hhbm5lbCAqY2hhbm5lbCwKKwkJCQkgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgYnRxY29tc21kICpidHEgPSBxY29tX3NtZF9nZXRfZHJ2ZGF0YShjaGFubmVsKTsKKworCXJldHVybiBidHFjb21zbWRfcmVjdihidHEtPmhkZXYsIEhDSV9FVkVOVF9QS1QsIGRhdGEsIGNvdW50KTsKK30KKworc3RhdGljIGludCBidHFjb21zbWRfc2VuZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgYnRxY29tc21kICpidHEgPSBoY2lfZ2V0X2RydmRhdGEoaGRldik7CisJaW50IHJldDsKKworCXN3aXRjaCAoaGNpX3NrYl9wa3RfdHlwZShza2IpKSB7CisJY2FzZSBIQ0lfQUNMREFUQV9QS1Q6CisJCXJldCA9IHFjb21fc21kX3NlbmQoYnRxLT5hY2xfY2hhbm5lbCwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCWhkZXYtPnN0YXQuYWNsX3R4Kys7CisJCWhkZXYtPnN0YXQuYnl0ZV90eCArPSBza2ItPmxlbjsKKwkJYnJlYWs7CisJY2FzZSBIQ0lfQ09NTUFORF9QS1Q6CisJCXJldCA9IHFjb21fc21kX3NlbmQoYnRxLT5jbWRfY2hhbm5lbCwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCWhkZXYtPnN0YXQuY21kX3R4Kys7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSUxTRVE7CisJCWJyZWFrOworCX0KKworCWtmcmVlX3NrYihza2IpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBidHFjb21zbWRfb3BlbihzdHJ1Y3QgaGNpX2RldiAqaGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBidHFjb21zbWRfY2xvc2Uoc3RydWN0IGhjaV9kZXYgKmhkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnRxY29tc21kX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGJ0cWNvbXNtZCAqYnRxOworCXN0cnVjdCBoY2lfZGV2ICpoZGV2OworCXZvaWQgKndjbnNzOworCWludCByZXQ7CisKKwlidHEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpidHEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ0cSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3Y25zcyA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKworCWJ0cS0+YWNsX2NoYW5uZWwgPSBxY29tX3djbnNzX29wZW5fY2hhbm5lbCh3Y25zcywgIkFQUFNfUklWQV9CVF9BQ0wiLAorCQkJCQkJICAgYnRxY29tc21kX2FjbF9jYWxsYmFjayk7CisJaWYgKElTX0VSUihidHEtPmFjbF9jaGFubmVsKSkKKwkJcmV0dXJuIFBUUl9FUlIoYnRxLT5hY2xfY2hhbm5lbCk7CisKKwlidHEtPmNtZF9jaGFubmVsID0gcWNvbV93Y25zc19vcGVuX2NoYW5uZWwod2Nuc3MsICJBUFBTX1JJVkFfQlRfQ01EIiwKKwkJCQkJCSAgIGJ0cWNvbXNtZF9jbWRfY2FsbGJhY2spOworCWlmIChJU19FUlIoYnRxLT5jbWRfY2hhbm5lbCkpCisJCXJldHVybiBQVFJfRVJSKGJ0cS0+Y21kX2NoYW5uZWwpOworCisJcWNvbV9zbWRfc2V0X2RydmRhdGEoYnRxLT5hY2xfY2hhbm5lbCwgYnRxKTsKKwlxY29tX3NtZF9zZXRfZHJ2ZGF0YShidHEtPmNtZF9jaGFubmVsLCBidHEpOworCisJaGRldiA9IGhjaV9hbGxvY19kZXYoKTsKKwlpZiAoIWhkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJaGNpX3NldF9kcnZkYXRhKGhkZXYsIGJ0cSk7CisJYnRxLT5oZGV2ID0gaGRldjsKKwlTRVRfSENJREVWX0RFVihoZGV2LCAmcGRldi0+ZGV2KTsKKworCWhkZXYtPmJ1cyA9IEhDSV9TTUQ7CisJaGRldi0+b3BlbiA9IGJ0cWNvbXNtZF9vcGVuOworCWhkZXYtPmNsb3NlID0gYnRxY29tc21kX2Nsb3NlOworCWhkZXYtPnNlbmQgPSBidHFjb21zbWRfc2VuZDsKKwloZGV2LT5zZXRfYmRhZGRyID0gcWNhX3NldF9iZGFkZHJfcm9tZTsKKworCXJldCA9IGhjaV9yZWdpc3Rlcl9kZXYoaGRldik7CisJaWYgKHJldCA8IDApIHsKKwkJaGNpX2ZyZWVfZGV2KGhkZXYpOworCQlyZXR1cm4gcmV0OworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGJ0cSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBidHFjb21zbWRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGJ0cWNvbXNtZCAqYnRxID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwloY2lfdW5yZWdpc3Rlcl9kZXYoYnRxLT5oZGV2KTsKKwloY2lfZnJlZV9kZXYoYnRxLT5oZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBidHFjb21zbWRfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInFjb20sd2Nuc3MtYnQiLCB9LAorCXsgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJ0cWNvbXNtZF9kcml2ZXIgPSB7CisJLnByb2JlID0gYnRxY29tc21kX3Byb2JlLAorCS5yZW1vdmUgPSBidHFjb21zbWRfcmVtb3ZlLAorCS5kcml2ZXIgID0geworCQkubmFtZSAgPSAiYnRxY29tc21kIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gYnRxY29tc21kX29mX21hdGNoLAorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGJ0cWNvbXNtZF9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJCam9ybiBBbmRlcnNzb24gPGJqb3JuLmFuZGVyc3NvbkBzb255bW9iaWxlLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUXVhbGNvbW0gU01EIEhDSSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0cnRsLmMgYi9kcml2ZXJzL2JsdWV0b290aC9idHJ0bC5jCmluZGV4IDg0Mjg4OTMuLmZjOWIyNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0cnRsLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYnRydGwuYwpAQCAtMzMsNiArMzMsNyBAQAogI2RlZmluZSBSVExfUk9NX0xNUF84NzIzQgkweDg3MjMKICNkZWZpbmUgUlRMX1JPTV9MTVBfODgyMUEJMHg4ODIxCiAjZGVmaW5lIFJUTF9ST01fTE1QXzg3NjFBCTB4ODc2MQorI2RlZmluZSBSVExfUk9NX0xNUF84ODIyQgkweDg4MjIKIAogc3RhdGljIGludCBydGxfcmVhZF9yb21fdmVyc2lvbihzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggKnZlcnNpb24pCiB7CkBAIC03OCwxMSArNzksMTUgQEAKIAljb25zdCB1bnNpZ25lZCBjaGFyICpwYXRjaF9sZW5ndGhfYmFzZSwgKnBhdGNoX29mZnNldF9iYXNlOwogCXUzMiBwYXRjaF9vZmZzZXQgPSAwOwogCXUxNiBwYXRjaF9sZW5ndGgsIG51bV9wYXRjaGVzOwotCWNvbnN0IHUxNiBwcm9qZWN0X2lkX3RvX2xtcF9zdWJ2ZXJbXSA9IHsKLQkJUlRMX1JPTV9MTVBfODcyM0EsCi0JCVJUTF9ST01fTE1QXzg3MjNCLAotCQlSVExfUk9NX0xNUF84ODIxQSwKLQkJUlRMX1JPTV9MTVBfODc2MUEKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwkJX191MTYgbG1wX3N1YnZlcjsKKwkJX191OCBpZDsKKwl9IHByb2plY3RfaWRfdG9fbG1wX3N1YnZlcltdID0geworCQl7IFJUTF9ST01fTE1QXzg3MjNBLCAwIH0sCisJCXsgUlRMX1JPTV9MTVBfODcyM0IsIDEgfSwKKwkJeyBSVExfUk9NX0xNUF84ODIxQSwgMiB9LAorCQl7IFJUTF9ST01fTE1QXzg3NjFBLCAzIH0sCisJCXsgUlRMX1JPTV9MTVBfODgyMkIsIDggfSwKIAl9OwogCiAJcmV0ID0gcnRsX3JlYWRfcm9tX3ZlcnNpb24oaGRldiwgJnJvbV92ZXJzaW9uKTsKQEAgLTEzNCwxNCArMTM5LDIwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChwcm9qZWN0X2lkID49IEFSUkFZX1NJWkUocHJvamVjdF9pZF90b19sbXBfc3VidmVyKSkgeworCS8qIEZpbmQgcHJvamVjdF9pZCBpbiB0YWJsZSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHByb2plY3RfaWRfdG9fbG1wX3N1YnZlcik7IGkrKykgeworCQlpZiAocHJvamVjdF9pZCA9PSBwcm9qZWN0X2lkX3RvX2xtcF9zdWJ2ZXJbaV0uaWQpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA+PSBBUlJBWV9TSVpFKHByb2plY3RfaWRfdG9fbG1wX3N1YnZlcikpIHsKIAkJQlRfRVJSKCIlczogdW5rbm93biBwcm9qZWN0IGlkICVkIiwgaGRldi0+bmFtZSwgcHJvamVjdF9pZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChsbXBfc3VidmVyICE9IHByb2plY3RfaWRfdG9fbG1wX3N1YnZlcltwcm9qZWN0X2lkXSkgeworCWlmIChsbXBfc3VidmVyICE9IHByb2plY3RfaWRfdG9fbG1wX3N1YnZlcltpXS5sbXBfc3VidmVyKSB7CiAJCUJUX0VSUigiJXM6IGZpcm13YXJlIGlzIGZvciAleCBidXQgdGhpcyBpcyBhICV4IiwgaGRldi0+bmFtZSwKLQkJICAgICAgIHByb2plY3RfaWRfdG9fbG1wX3N1YnZlcltwcm9qZWN0X2lkXSwgbG1wX3N1YnZlcik7CisJCSAgICAgICBwcm9qZWN0X2lkX3RvX2xtcF9zdWJ2ZXJbaV0ubG1wX3N1YnZlciwgbG1wX3N1YnZlcik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjU3LDYgKzI2OCwyNiBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgcnRsX2xvYWRfY29uZmlnKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBjb25zdCBjaGFyICpuYW1lLCB1OCAqKmJ1ZmYpCit7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwlpbnQgcmV0OworCisJQlRfSU5GTygiJXM6IHJ0bDogbG9hZGluZyAlcyIsIGhkZXYtPm5hbWUsIG5hbWUpOworCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBuYW1lLCAmaGRldi0+ZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlCVF9FUlIoIiVzOiBGYWlsZWQgdG8gbG9hZCAlcyIsIGhkZXYtPm5hbWUsIG5hbWUpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGZ3LT5zaXplOworCSpidWZmID0ga21lbWR1cChmdy0+ZGF0YSwgcmV0LCBHRlBfS0VSTkVMKTsKKworCXJlbGVhc2VfZmlybXdhcmUoZncpOworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBidHJ0bF9zZXR1cF9ydGw4NzIzYShzdHJ1Y3QgaGNpX2RldiAqaGRldikKIHsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwpAQCAtMjk2LDI1ICszMjcsNzQgQEAKIAl1bnNpZ25lZCBjaGFyICpmd19kYXRhID0gTlVMTDsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwogCWludCByZXQ7CisJaW50IGNmZ19zejsKKwl1OCAqY2ZnX2J1ZmYgPSBOVUxMOworCXU4ICp0YnVmZjsKKwljaGFyICpjZmdfbmFtZSA9IE5VTEw7CisKKwlzd2l0Y2ggKGxtcF9zdWJ2ZXIpIHsKKwljYXNlIFJUTF9ST01fTE1QXzg3MjNCOgorCQljZmdfbmFtZSA9ICJydGxfYnQvcnRsODcyM2JfY29uZmlnLmJpbiI7CisJCWJyZWFrOworCWNhc2UgUlRMX1JPTV9MTVBfODgyMUE6CisJCWNmZ19uYW1lID0gInJ0bF9idC9ydGw4ODIxYV9jb25maWcuYmluIjsKKwkJYnJlYWs7CisJY2FzZSBSVExfUk9NX0xNUF84NzYxQToKKwkJY2ZnX25hbWUgPSAicnRsX2J0L3J0bDg3NjFhX2NvbmZpZy5iaW4iOworCQlicmVhazsKKwljYXNlIFJUTF9ST01fTE1QXzg4MjJCOgorCQljZmdfbmFtZSA9ICJydGxfYnQvcnRsODgyMmJfY29uZmlnLmJpbiI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJUX0VSUigiJXM6IHJ0bDogbm8gY29uZmlnIGFjY29yZGluZyB0byBsbXBfc3VidmVyICUwNHgiLAorCQkgICAgICAgaGRldi0+bmFtZSwgbG1wX3N1YnZlcik7CisJCWJyZWFrOworCX0KKworCWlmIChjZmdfbmFtZSkgeworCQljZmdfc3ogPSBydGxfbG9hZF9jb25maWcoaGRldiwgY2ZnX25hbWUsICZjZmdfYnVmZik7CisJCWlmIChjZmdfc3ogPCAwKQorCQkJY2ZnX3N6ID0gMDsKKwl9IGVsc2UKKwkJY2ZnX3N6ID0gMDsKIAogCUJUX0lORk8oIiVzOiBydGw6IGxvYWRpbmcgJXMiLCBoZGV2LT5uYW1lLCBmd19uYW1lKTsKIAlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZndfbmFtZSwgJmhkZXYtPmRldik7CiAJaWYgKHJldCA8IDApIHsKIAkJQlRfRVJSKCIlczogRmFpbGVkIHRvIGxvYWQgJXMiLCBoZGV2LT5uYW1lLCBmd19uYW1lKTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnJfcmVxX2Z3OwogCX0KIAogCXJldCA9IHJ0bDg3MjNiX3BhcnNlX2Zpcm13YXJlKGhkZXYsIGxtcF9zdWJ2ZXIsIGZ3LCAmZndfZGF0YSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCisJaWYgKGNmZ19zeikgeworCQl0YnVmZiA9IGt6YWxsb2MocmV0ICsgY2ZnX3N6LCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF0YnVmZikgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJbWVtY3B5KHRidWZmLCBmd19kYXRhLCByZXQpOworCQlrZnJlZShmd19kYXRhKTsKKworCQltZW1jcHkodGJ1ZmYgKyByZXQsIGNmZ19idWZmLCBjZmdfc3opOworCQlyZXQgKz0gY2ZnX3N6OworCisJCWZ3X2RhdGEgPSB0YnVmZjsKKwl9CisKKwlCVF9JTkZPKCJjZmdfc3ogJWQsIHRvdGFsIHNpemUgJWQiLCBjZmdfc3osIHJldCk7CisKIAlyZXQgPSBydGxfZG93bmxvYWRfZmlybXdhcmUoaGRldiwgZndfZGF0YSwgcmV0KTsKLQlrZnJlZShmd19kYXRhKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7CiAKIG91dDoKIAlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwlrZnJlZShmd19kYXRhKTsKK2Vycl9yZXFfZnc6CisJaWYgKGNmZ19zeikKKwkJa2ZyZWUoY2ZnX2J1ZmYpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTM3Nyw2ICs0NTcsOSBAQAogCWNhc2UgUlRMX1JPTV9MTVBfODc2MUE6CiAJCXJldHVybiBidHJ0bF9zZXR1cF9ydGw4NzIzYihoZGV2LCBsbXBfc3VidmVyLAogCQkJCQkgICAgInJ0bF9idC9ydGw4NzYxYV9mdy5iaW4iKTsKKwljYXNlIFJUTF9ST01fTE1QXzg4MjJCOgorCQlyZXR1cm4gYnRydGxfc2V0dXBfcnRsODcyM2IoaGRldiwgbG1wX3N1YnZlciwKKwkJCQkJICAgICJydGxfYnQvcnRsODgyMmJfZncuYmluIik7CiAJZGVmYXVsdDoKIAkJQlRfSU5GTygicnRsOiBhc3N1bWluZyBubyBmaXJtd2FyZSB1cGxvYWQgbmVlZGVkLiIpOwogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dXNiLmMgYi9kcml2ZXJzL2JsdWV0b290aC9idHVzYi5jCmluZGV4IDgxMWY5YjkuLjZiZDYzYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dXNiLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYnR1c2IuYwpAQCAtNjIsNiArNjIsNyBAQAogI2RlZmluZSBCVFVTQl9SRUFMVEVLCQkweDIwMDAwCiAjZGVmaW5lIEJUVVNCX0JDTTIwNDUJCTB4NDAwMDAKICNkZWZpbmUgQlRVU0JfSUZOVU1fMgkJMHg4MDAwMAorI2RlZmluZSBCVFVTQl9DVzY2MjIJCTB4MTAwMDAwCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCBidHVzYl90YWJsZVtdID0gewogCS8qIEdlbmVyaWMgQmx1ZXRvb3RoIFVTQiBkZXZpY2UgKi8KQEAgLTI0OCw5ICsyNDksMTEgQEAKIAogCS8qIFFDQSBST01FIGNoaXBzZXQgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwY2YzLCAweGUwMDcpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9RQ0FfUk9NRSB9LAorCXsgVVNCX0RFVklDRSgweDBjZjMsIDB4ZTAwOSksIC5kcml2ZXJfaW5mbyA9IEJUVVNCX1FDQV9ST01FIH0sCiAJeyBVU0JfREVWSUNFKDB4MGNmMywgMHhlMzAwKSwgLmRyaXZlcl9pbmZvID0gQlRVU0JfUUNBX1JPTUUgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwY2YzLCAweGUzNjApLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9RQ0FfUk9NRSB9LAogCXsgVVNCX0RFVklDRSgweDA0ODksIDB4ZTA5MiksIC5kcml2ZXJfaW5mbyA9IEJUVVNCX1FDQV9ST01FIH0sCisJeyBVU0JfREVWSUNFKDB4MDRjYSwgMHgzMDExKSwgLmRyaXZlcl9pbmZvID0gQlRVU0JfUUNBX1JPTUUgfSwKIAogCS8qIEJyb2FkY29tIEJDTTIwMzUgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwYTVjLCAweDIwMDkpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9CQ005MjAzNSB9LApAQCAtMjkwLDcgKzI5Myw4IEBACiAJeyBVU0JfREVWSUNFKDB4MDQwMCwgMHgwODBhKSwgLmRyaXZlcl9pbmZvID0gQlRVU0JfQlJPS0VOX0lTT0MgfSwKIAogCS8qIENPTldJU0UgVGVjaG5vbG9neSBiYXNlZCBhZGFwdGVycyB3aXRoIGJ1Z2d5IFNDTyBzdXBwb3J0ICovCi0JeyBVU0JfREVWSUNFKDB4MGU1ZSwgMHg2NjIyKSwgLmRyaXZlcl9pbmZvID0gQlRVU0JfQlJPS0VOX0lTT0MgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwZTVlLCAweDY2MjIpLAorCSAgLmRyaXZlcl9pbmZvID0gQlRVU0JfQlJPS0VOX0lTT0MgfCBCVFVTQl9DVzY2MjJ9LAogCiAJLyogUm9wZXIgQ2xhc3MgMSBCbHVldG9vdGggRG9uZ2xlIChTaWxpY29uIFdhdmUgYmFzZWQpICovCiAJeyBVU0JfREVWSUNFKDB4MTMxMCwgMHgwMDAxKSwgLmRyaXZlcl9pbmZvID0gQlRVU0JfU1dBVkUgfSwKQEAgLTIyMjEsOSArMjIyNSw4IEBACiAJZXJyID0gd2FpdF9vbl9iaXRfdGltZW91dCgmZGF0YS0+ZmxhZ3MsIEJUVVNCX0RPV05MT0FESU5HLAogCQkJCSAgVEFTS19JTlRFUlJVUFRJQkxFLAogCQkJCSAgbXNlY3NfdG9famlmZmllcyg1MDAwKSk7Ci0JaWYgKGVyciA9PSAxKSB7CisJaWYgKGVyciA9PSAtRUlOVFIpIHsKIAkJQlRfRVJSKCIlczogRmlybXdhcmUgbG9hZGluZyBpbnRlcnJ1cHRlZCIsIGhkZXYtPm5hbWUpOwotCQllcnIgPSAtRUlOVFI7CiAJCWdvdG8gZG9uZTsKIAl9CiAKQEAgLTIyNzUsNyArMjI3OCw3IEBACiAJCQkJICBUQVNLX0lOVEVSUlVQVElCTEUsCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKDEwMDApKTsKIAotCWlmIChlcnIgPT0gMSkgeworCWlmIChlcnIgPT0gLUVJTlRSKSB7CiAJCUJUX0VSUigiJXM6IERldmljZSBib290IGludGVycnVwdGVkIiwgaGRldi0+bmFtZSk7CiAJCXJldHVybiAtRUlOVFI7CiAJfQpAQCAtMjg0NSw2ICsyODQ4LDkgQEAKIAloZGV2LT5zZW5kICAgPSBidHVzYl9zZW5kX2ZyYW1lOwogCWhkZXYtPm5vdGlmeSA9IGJ0dXNiX25vdGlmeTsKIAorCWlmIChpZC0+ZHJpdmVyX2luZm8gJiBCVFVTQl9DVzY2MjIpCisJCXNldF9iaXQoSENJX1FVSVJLX0JST0tFTl9TVE9SRURfTElOS19LRVksICZoZGV2LT5xdWlya3MpOworCiAJaWYgKGlkLT5kcml2ZXJfaW5mbyAmIEJUVVNCX0JDTTIwNDUpCiAJCXNldF9iaXQoSENJX1FVSVJLX0JST0tFTl9TVE9SRURfTElOS19LRVksICZoZGV2LT5xdWlya3MpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9idHdpbGluay5jIGIvZHJpdmVycy9ibHVldG9vdGgvYnR3aWxpbmsuYwppbmRleCA0ODUyODFiLi5lZjUxYzljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9idHdpbGluay5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0d2lsaW5rLmMKQEAgLTI0NSw2ICsyNDUsNyBAQAogewogCXN0cnVjdCB0aV9zdCAqaHN0OwogCWxvbmcgbGVuOworCWludCBwa3RfdHlwZTsKIAogCWhzdCA9IGhjaV9nZXRfZHJ2ZGF0YShoZGV2KTsKIApAQCAtMjU4LDYgKzI1OSw3IEBACiAJICogRnJlZWluZyBza2IgbWVtb3J5IGlzIHRha2VuIGNhcmUgaW4gc2hhcmVkIHRyYW5zcG9ydCBsYXllciwKIAkgKiBzbyBkb24ndCBmcmVlIHNrYiBtZW1vcnkgaGVyZS4KIAkgKi8KKwlwa3RfdHlwZSA9IGhjaV9za2JfcGt0X3R5cGUoc2tiKTsKIAlsZW4gPSBoc3QtPnN0X3dyaXRlKHNrYik7CiAJaWYgKGxlbiA8IDApIHsKIAkJa2ZyZWVfc2tiKHNrYik7CkBAIC0yNjgsNyArMjcwLDcgQEAKIAogCS8qIFNUIGFjY2VwdGVkIG91ciBza2IuIFNvLCBHbyBhaGVhZCBhbmQgZG8gcmVzdCAqLwogCWhkZXYtPnN0YXQuYnl0ZV90eCArPSBsZW47Ci0JdGlfc3RfdHhfY29tcGxldGUoaHN0LCBoY2lfc2tiX3BrdF90eXBlKHNrYikpOworCXRpX3N0X3R4X2NvbXBsZXRlKGhzdCwgcGt0X3R5cGUpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfYmNtLmMgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfYmNtLmMKaW5kZXggMWM5N2VkYS4uNWNjYjkwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX2JjbS5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9iY20uYwpAQCAtNzk4LDcgKzc5OCw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaGNpX3VhcnRfcHJvdG8gYmNtX3Byb3RvID0gewogCS5pZAkJPSBIQ0lfVUFSVF9CQ00sCi0JLm5hbWUJCT0gIkJDTSIsCisJLm5hbWUJCT0gIkJyb2FkY29tIiwKIAkubWFudWZhY3R1cmVyCT0gMTUsCiAJLmluaXRfc3BlZWQJPSAxMTUyMDAsCiAJLm9wZXJfc3BlZWQJPSA0MDAwMDAwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX2Jjc3AuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9iY3NwLmMKaW5kZXggZDdkMjNjZS4uYTJjOTIxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX2Jjc3AuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfYmNzcC5jCkBAIC05MCw3ICs5MCw4IEBACiAvKiAtLS0tIEJDU1AgQ1JDIGNhbGN1bGF0aW9uIC0tLS0gKi8KIAogLyogVGFibGUgZm9yIGNhbGN1bGF0aW5nIENSQyBmb3IgcG9seW5vbWlhbCAweDEwMjEsIExTQiBwcm9jZXNzZWQgZmlyc3QsCi1pbml0aWFsIHZhbHVlIDB4ZmZmZiwgYml0cyBzaGlmdGVkIGluIHJldmVyc2Ugb3JkZXIuICovCisgKiBpbml0aWFsIHZhbHVlIDB4ZmZmZiwgYml0cyBzaGlmdGVkIGluIHJldmVyc2Ugb3JkZXIuCisgKi8KIAogc3RhdGljIGNvbnN0IHUxNiBjcmNfdGFibGVbXSA9IHsKIAkweDAwMDAsIDB4MTA4MSwgMHgyMTAyLCAweDMxODMsCkBAIC0xNzQsNyArMTc1LDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBza19idWZmICpiY3NwX3ByZXBhcmVfcGt0KHN0cnVjdCBiY3NwX3N0cnVjdCAqYmNzcCwgdTggKmRhdGEsCi0JCWludCBsZW4sIGludCBwa3RfdHlwZSkKKwkJCQkJaW50IGxlbiwgaW50IHBrdF90eXBlKQogewogCXN0cnVjdCBza19idWZmICpuc2tiOwogCXU4IGhkcls0XSwgY2hhbjsKQEAgLTIxMyw2ICsyMTQsNyBAQAogCQkvKiBWZW5kb3Igc3BlY2lmaWMgY29tbWFuZHMgKi8KIAkJaWYgKGhjaV9vcGNvZGVfb2dmKF9fbGUxNl90b19jcHUob3Bjb2RlKSkgPT0gMHgzZikgewogCQkJdTggZGVzYyA9ICooZGF0YSArIEhDSV9DT01NQU5EX0hEUl9TSVpFKTsKKwogCQkJaWYgKChkZXNjICYgMHhmMCkgPT0gMHhjMCkgewogCQkJCWRhdGEgKz0gSENJX0NPTU1BTkRfSERSX1NJWkUgKyAxOwogCQkJCWxlbiAgLT0gSENJX0NPTU1BTkRfSERSX1NJWkUgKyAxOwpAQCAtMjcxLDggKzI3Myw4IEBACiAJLyogUHV0IENSQyAqLwogCWlmIChiY3NwLT51c2VfY3JjKSB7CiAJCWJjc3BfdHhtc2dfY3JjID0gYml0cmV2MTYoYmNzcF90eG1zZ19jcmMpOwotCQliY3NwX3NsaXBfb25lX2J5dGUobnNrYiwgKHU4KSAoKGJjc3BfdHhtc2dfY3JjID4+IDgpICYgMHgwMGZmKSk7Ci0JCWJjc3Bfc2xpcF9vbmVfYnl0ZShuc2tiLCAodTgpIChiY3NwX3R4bXNnX2NyYyAmIDB4MDBmZikpOworCQliY3NwX3NsaXBfb25lX2J5dGUobnNrYiwgKHU4KSgoYmNzcF90eG1zZ19jcmMgPj4gOCkgJiAweDAwZmYpKTsKKwkJYmNzcF9zbGlwX29uZV9ieXRlKG5za2IsICh1OCkoYmNzcF90eG1zZ19jcmMgJiAweDAwZmYpKTsKIAl9CiAKIAliY3NwX3NsaXBfbXNnZGVsaW0obnNrYik7CkBAIC0yODcsNyArMjg5LDggQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJLyogRmlyc3Qgb2YgYWxsLCBjaGVjayBmb3IgdW5yZWxpYWJsZSBtZXNzYWdlcyBpbiB0aGUgcXVldWUsCi0JICAgc2luY2UgdGhleSBoYXZlIHByaW9yaXR5ICovCisJICogc2luY2UgdGhleSBoYXZlIHByaW9yaXR5CisJICovCiAKIAlza2IgPSBza2JfZGVxdWV1ZSgmYmNzcC0+dW5yZWwpOwogCWlmIChza2IgIT0gTlVMTCkgewpAQCAtNDE0LDcgKzQxNyw3IEBACiAKIAkvKiBzcG90ICJjb25mIiBwa3RzIGFuZCByZXBseSB3aXRoIGEgImNvbmYgcnNwIiBwa3QgKi8KIAlpZiAoYmNzcC0+cnhfc2tiLT5kYXRhWzFdID4+IDQgPT0gNCAmJiBiY3NwLT5yeF9za2ItPmRhdGFbMl0gPT0gMCAmJgotCQkJIW1lbWNtcCgmYmNzcC0+cnhfc2tiLT5kYXRhWzRdLCBjb25mX3BrdCwgNCkpIHsKKwkgICAgIW1lbWNtcCgmYmNzcC0+cnhfc2tiLT5kYXRhWzRdLCBjb25mX3BrdCwgNCkpIHsKIAkJc3RydWN0IHNrX2J1ZmYgKm5za2IgPSBhbGxvY19za2IoNCwgR0ZQX0FUT01JQyk7CiAKIAkJQlRfREJHKCJGb3VuZCBhIExFIGNvbmYgcGt0Iik7CkBAIC00MjgsNyArNDMxLDcgQEAKIAl9CiAJLyogU3BvdCAic3luYyIgcGt0cy4gSWYgd2UgZmluZCBvbmUuLi5kaXNhc3RlciEgKi8KIAllbHNlIGlmIChiY3NwLT5yeF9za2ItPmRhdGFbMV0gPj4gNCA9PSA0ICYmIGJjc3AtPnJ4X3NrYi0+ZGF0YVsyXSA9PSAwICYmCi0JCQkhbWVtY21wKCZiY3NwLT5yeF9za2ItPmRhdGFbNF0sIHN5bmNfcGt0LCA0KSkgeworCQkgIW1lbWNtcCgmYmNzcC0+cnhfc2tiLT5kYXRhWzRdLCBzeW5jX3BrdCwgNCkpIHsKIAkJQlRfRVJSKCJGb3VuZCBhIExFIHN5bmMgcGt0LCBjYXJkIGhhcyByZXNldCIpOwogCX0KIH0KQEAgLTQ0Niw3ICs0NDksNyBAQAogCQlkZWZhdWx0OgogCQkJbWVtY3B5KHNrYl9wdXQoYmNzcC0+cnhfc2tiLCAxKSwgJmJ5dGUsIDEpOwogCQkJaWYgKChiY3NwLT5yeF9za2ItPmRhdGFbMF0gJiAweDQwKSAhPSAwICYmCi0JCQkJCWJjc3AtPnJ4X3N0YXRlICE9IEJDU1BfVzRfQ1JDKQorCQkJICAgIGJjc3AtPnJ4X3N0YXRlICE9IEJDU1BfVzRfQ1JDKQogCQkJCWJjc3BfY3JjX3VwZGF0ZSgmYmNzcC0+bWVzc2FnZV9jcmMsIGJ5dGUpOwogCQkJYmNzcC0+cnhfY291bnQtLTsKIAkJfQpAQCAtNDU3LDcgKzQ2MCw3IEBACiAJCWNhc2UgMHhkYzoKIAkJCW1lbWNweShza2JfcHV0KGJjc3AtPnJ4X3NrYiwgMSksICZjMCwgMSk7CiAJCQlpZiAoKGJjc3AtPnJ4X3NrYi0+ZGF0YVswXSAmIDB4NDApICE9IDAgJiYKLQkJCQkJYmNzcC0+cnhfc3RhdGUgIT0gQkNTUF9XNF9DUkMpCisJCQkgICAgYmNzcC0+cnhfc3RhdGUgIT0gQkNTUF9XNF9DUkMpCiAJCQkJYmNzcF9jcmNfdXBkYXRlKCZiY3NwLT5tZXNzYWdlX2NyYywgMHhjMCk7CiAJCQliY3NwLT5yeF9lc2Nfc3RhdGUgPSBCQ1NQX0VTQ1NUQVRFX05PRVNDOwogCQkJYmNzcC0+cnhfY291bnQtLTsKQEAgLTQ2Niw3ICs0NjksNyBAQAogCQljYXNlIDB4ZGQ6CiAJCQltZW1jcHkoc2tiX3B1dChiY3NwLT5yeF9za2IsIDEpLCAmZGIsIDEpOwogCQkJaWYgKChiY3NwLT5yeF9za2ItPmRhdGFbMF0gJiAweDQwKSAhPSAwICYmCi0JCQkJCWJjc3AtPnJ4X3N0YXRlICE9IEJDU1BfVzRfQ1JDKQorCQkJICAgIGJjc3AtPnJ4X3N0YXRlICE9IEJDU1BfVzRfQ1JDKQogCQkJCWJjc3BfY3JjX3VwZGF0ZSgmYmNzcC0+bWVzc2FnZV9jcmMsIDB4ZGIpOwogCQkJYmNzcC0+cnhfZXNjX3N0YXRlID0gQkNTUF9FU0NTVEFURV9OT0VTQzsKIAkJCWJjc3AtPnJ4X2NvdW50LS07CkBAIC00ODUsMTMgKzQ4OCwyOCBAQAogc3RhdGljIHZvaWQgYmNzcF9jb21wbGV0ZV9yeF9wa3Qoc3RydWN0IGhjaV91YXJ0ICpodSkKIHsKIAlzdHJ1Y3QgYmNzcF9zdHJ1Y3QgKmJjc3AgPSBodS0+cHJpdjsKLQlpbnQgcGFzc191cDsKKwlpbnQgcGFzc191cCA9IDA7CiAKIAlpZiAoYmNzcC0+cnhfc2tiLT5kYXRhWzBdICYgMHg4MCkgewkvKiByZWxpYWJsZSBwa3QgKi8KIAkJQlRfREJHKCJSZWNlaXZlZCBzZXFubyAldSBmcm9tIGNhcmQiLCBiY3NwLT5yeHNlcV90eGFjayk7Ci0JCWJjc3AtPnJ4c2VxX3R4YWNrKys7Ci0JCWJjc3AtPnJ4c2VxX3R4YWNrICU9IDB4ODsKLQkJYmNzcC0+dHhhY2tfcmVxICAgID0gMTsKKworCQkvKiBjaGVjayB0aGUgcnggc2VxdWVuY2UgbnVtYmVyIGlzIGFzIGV4cGVjdGVkICovCisJCWlmICgoYmNzcC0+cnhfc2tiLT5kYXRhWzBdICYgMHgwNykgPT0gYmNzcC0+cnhzZXFfdHhhY2spIHsKKwkJCWJjc3AtPnJ4c2VxX3R4YWNrKys7CisJCQliY3NwLT5yeHNlcV90eGFjayAlPSAweDg7CisJCX0gZWxzZSB7CisJCQkvKiBoYW5kbGUgcmUtdHJhbnNtaXR0ZWQgcGFja2V0IG9yCisJCQkgKiB3aGVuIHBhY2tldCB3YXMgbWlzc2VkCisJCQkgKi8KKwkJCUJUX0VSUigiT3V0LW9mLW9yZGVyIHBhY2tldCBhcnJpdmVkLCBnb3QgJXUgZXhwZWN0ZWQgJXUiLAorCQkJICAgICAgIGJjc3AtPnJ4X3NrYi0+ZGF0YVswXSAmIDB4MDcsIGJjc3AtPnJ4c2VxX3R4YWNrKTsKKworCQkJLyogZG8gbm90IHByb2Nlc3Mgb3V0LW9mLW9yZGVyIHBhY2tldCBwYXlsb2FkICovCisJCQlwYXNzX3VwID0gMjsKKwkJfQorCisJCS8qIHNlbmQgY3VycmVudCB0eGFjayB2YWx1ZSB0byBhbGwgcmVjZWl2ZWQgcmVsaWFibGUgcGFja2V0cyAqLworCQliY3NwLT50eGFja19yZXEgPSAxOwogCiAJCS8qIElmIG5lZWRlZCwgdHJhbnNtaXQgYW4gYWNrIHBrdCAqLwogCQloY2lfdWFydF90eF93YWtldXAoaHUpOwpAQCAtNTAwLDI2ICs1MTgsMzMgQEAKIAliY3NwLT5yeGFjayA9IChiY3NwLT5yeF9za2ItPmRhdGFbMF0gPj4gMykgJiAweDA3OwogCUJUX0RCRygiUmVxdWVzdCBmb3IgcGt0ICV1IGZyb20gY2FyZCIsIGJjc3AtPnJ4YWNrKTsKIAorCS8qIGhhbmRsZSByZWNlaXZlZCBBQ0sgaW5kaWNhdGlvbnMsCisJICogaW5jbHVkaW5nIHRob3NlIGZyb20gb3V0LW9mLW9yZGVyIHBhY2tldHMKKwkgKi8KIAliY3NwX3BrdF9jdWxsKGJjc3ApOwotCWlmICgoYmNzcC0+cnhfc2tiLT5kYXRhWzFdICYgMHgwZikgPT0gNiAmJgotCQkJYmNzcC0+cnhfc2tiLT5kYXRhWzBdICYgMHg4MCkgewotCQloY2lfc2tiX3BrdF90eXBlKGJjc3AtPnJ4X3NrYikgPSBIQ0lfQUNMREFUQV9QS1Q7Ci0JCXBhc3NfdXAgPSAxOwotCX0gZWxzZSBpZiAoKGJjc3AtPnJ4X3NrYi0+ZGF0YVsxXSAmIDB4MGYpID09IDUgJiYKLQkJCWJjc3AtPnJ4X3NrYi0+ZGF0YVswXSAmIDB4ODApIHsKLQkJaGNpX3NrYl9wa3RfdHlwZShiY3NwLT5yeF9za2IpID0gSENJX0VWRU5UX1BLVDsKLQkJcGFzc191cCA9IDE7Ci0JfSBlbHNlIGlmICgoYmNzcC0+cnhfc2tiLT5kYXRhWzFdICYgMHgwZikgPT0gNykgewotCQloY2lfc2tiX3BrdF90eXBlKGJjc3AtPnJ4X3NrYikgPSBIQ0lfU0NPREFUQV9QS1Q7Ci0JCXBhc3NfdXAgPSAxOwotCX0gZWxzZSBpZiAoKGJjc3AtPnJ4X3NrYi0+ZGF0YVsxXSAmIDB4MGYpID09IDEgJiYKLQkJCSEoYmNzcC0+cnhfc2tiLT5kYXRhWzBdICYgMHg4MCkpIHsKLQkJYmNzcF9oYW5kbGVfbGVfcGt0KGh1KTsKLQkJcGFzc191cCA9IDA7Ci0JfSBlbHNlCi0JCXBhc3NfdXAgPSAwOwogCi0JaWYgKCFwYXNzX3VwKSB7CisJaWYgKHBhc3NfdXAgIT0gMikgeworCQlpZiAoKGJjc3AtPnJ4X3NrYi0+ZGF0YVsxXSAmIDB4MGYpID09IDYgJiYKKwkJICAgIChiY3NwLT5yeF9za2ItPmRhdGFbMF0gJiAweDgwKSkgeworCQkJaGNpX3NrYl9wa3RfdHlwZShiY3NwLT5yeF9za2IpID0gSENJX0FDTERBVEFfUEtUOworCQkJcGFzc191cCA9IDE7CisJCX0gZWxzZSBpZiAoKGJjc3AtPnJ4X3NrYi0+ZGF0YVsxXSAmIDB4MGYpID09IDUgJiYKKwkJCSAgIChiY3NwLT5yeF9za2ItPmRhdGFbMF0gJiAweDgwKSkgeworCQkJaGNpX3NrYl9wa3RfdHlwZShiY3NwLT5yeF9za2IpID0gSENJX0VWRU5UX1BLVDsKKwkJCXBhc3NfdXAgPSAxOworCQl9IGVsc2UgaWYgKChiY3NwLT5yeF9za2ItPmRhdGFbMV0gJiAweDBmKSA9PSA3KSB7CisJCQloY2lfc2tiX3BrdF90eXBlKGJjc3AtPnJ4X3NrYikgPSBIQ0lfU0NPREFUQV9QS1Q7CisJCQlwYXNzX3VwID0gMTsKKwkJfSBlbHNlIGlmICgoYmNzcC0+cnhfc2tiLT5kYXRhWzFdICYgMHgwZikgPT0gMSAmJgorCQkJICAgIShiY3NwLT5yeF9za2ItPmRhdGFbMF0gJiAweDgwKSkgeworCQkJYmNzcF9oYW5kbGVfbGVfcGt0KGh1KTsKKwkJCXBhc3NfdXAgPSAwOworCQl9IGVsc2UgeworCQkJcGFzc191cCA9IDA7CisJCX0KKwl9CisKKwlpZiAocGFzc191cCA9PSAwKSB7CiAJCXN0cnVjdCBoY2lfZXZlbnRfaGRyIGhkcjsKIAkJdTggZGVzYyA9IChiY3NwLT5yeF9za2ItPmRhdGFbMV0gJiAweDBmKTsKIApAQCAtNTM3LDE4ICs1NjIsMjMgQEAKIAkJCQloY2lfcmVjdl9mcmFtZShodS0+aGRldiwgYmNzcC0+cnhfc2tiKTsKIAkJCX0gZWxzZSB7CiAJCQkJQlRfRVJSKCJQYWNrZXQgZm9yIHVua25vd24gY2hhbm5lbCAoJXUgJXMpIiwKLQkJCQkJYmNzcC0+cnhfc2tiLT5kYXRhWzFdICYgMHgwZiwKLQkJCQkJYmNzcC0+cnhfc2tiLT5kYXRhWzBdICYgMHg4MCA/Ci0JCQkJCSJyZWxpYWJsZSIgOiAidW5yZWxpYWJsZSIpOworCQkJCSAgICAgICBiY3NwLT5yeF9za2ItPmRhdGFbMV0gJiAweDBmLAorCQkJCSAgICAgICBiY3NwLT5yeF9za2ItPmRhdGFbMF0gJiAweDgwID8KKwkJCQkgICAgICAgInJlbGlhYmxlIiA6ICJ1bnJlbGlhYmxlIik7CiAJCQkJa2ZyZWVfc2tiKGJjc3AtPnJ4X3NrYik7CiAJCQl9CiAJCX0gZWxzZQogCQkJa2ZyZWVfc2tiKGJjc3AtPnJ4X3NrYik7Ci0JfSBlbHNlIHsKKwl9IGVsc2UgaWYgKHBhc3NfdXAgPT0gMSkgewogCQkvKiBQdWxsIG91dCBCQ1NQIGhkciAqLwogCQlza2JfcHVsbChiY3NwLT5yeF9za2IsIDQpOwogCiAJCWhjaV9yZWN2X2ZyYW1lKGh1LT5oZGV2LCBiY3NwLT5yeF9za2IpOworCX0gZWxzZSB7CisJCS8qIGlnbm9yZSBwYWNrZXQgcGF5bG9hZCBvZiBhbHJlYWR5IEFDS2VkIHJlLXRyYW5zbWl0dGVkCisJCSAqIHBhY2tldHMgb3Igd2hlbiBhIHBhY2tldCB3YXMgbWlzc2VkIGluIHRoZSBCQ1NQIHdpbmRvdworCQkgKi8KKwkJa2ZyZWVfc2tiKGJjc3AtPnJ4X3NrYik7CiAJfQogCiAJYmNzcC0+cnhfc3RhdGUgPSBCQ1NQX1c0X1BLVF9ERUxJTUlURVI7CkBAIC01NjcsNyArNTk3LDcgQEAKIAljb25zdCB1bnNpZ25lZCBjaGFyICpwdHI7CiAKIAlCVF9EQkcoImh1ICVwIGNvdW50ICVkIHJ4X3N0YXRlICVkIHJ4X2NvdW50ICVsZCIsCi0JCWh1LCBjb3VudCwgYmNzcC0+cnhfc3RhdGUsIGJjc3AtPnJ4X2NvdW50KTsKKwkgICAgICAgaHUsIGNvdW50LCBiY3NwLT5yeF9zdGF0ZSwgYmNzcC0+cnhfY291bnQpOwogCiAJcHRyID0gZGF0YTsKIAl3aGlsZSAoY291bnQpIHsKQEAgLTU4NiwyNCArNjE2LDE0IEBACiAKIAkJc3dpdGNoIChiY3NwLT5yeF9zdGF0ZSkgewogCQljYXNlIEJDU1BfVzRfQkNTUF9IRFI6Ci0JCQlpZiAoKDB4ZmYgJiAodTgpIH4gKGJjc3AtPnJ4X3NrYi0+ZGF0YVswXSArIGJjc3AtPnJ4X3NrYi0+ZGF0YVsxXSArCi0JCQkJCWJjc3AtPnJ4X3NrYi0+ZGF0YVsyXSkpICE9IGJjc3AtPnJ4X3NrYi0+ZGF0YVszXSkgeworCQkJaWYgKCgweGZmICYgKHU4KX4oYmNzcC0+cnhfc2tiLT5kYXRhWzBdICsgYmNzcC0+cnhfc2tiLT5kYXRhWzFdICsKKwkJCSAgICBiY3NwLT5yeF9za2ItPmRhdGFbMl0pKSAhPSBiY3NwLT5yeF9za2ItPmRhdGFbM10pIHsKIAkJCQlCVF9FUlIoIkVycm9yIGluIEJDU1AgaGRyIGNoZWNrc3VtIik7CiAJCQkJa2ZyZWVfc2tiKGJjc3AtPnJ4X3NrYik7CiAJCQkJYmNzcC0+cnhfc3RhdGUgPSBCQ1NQX1c0X1BLVF9ERUxJTUlURVI7CiAJCQkJYmNzcC0+cnhfY291bnQgPSAwOwogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJaWYgKGJjc3AtPnJ4X3NrYi0+ZGF0YVswXSAmIDB4ODAJLyogcmVsaWFibGUgcGt0ICovCi0JCQkJCQkmJiAoYmNzcC0+cnhfc2tiLT5kYXRhWzBdICYgMHgwNykgIT0gYmNzcC0+cnhzZXFfdHhhY2spIHsKLQkJCQlCVF9FUlIoIk91dC1vZi1vcmRlciBwYWNrZXQgYXJyaXZlZCwgZ290ICV1IGV4cGVjdGVkICV1IiwKLQkJCQkJYmNzcC0+cnhfc2tiLT5kYXRhWzBdICYgMHgwNywgYmNzcC0+cnhzZXFfdHhhY2spOwotCi0JCQkJa2ZyZWVfc2tiKGJjc3AtPnJ4X3NrYik7Ci0JCQkJYmNzcC0+cnhfc3RhdGUgPSBCQ1NQX1c0X1BLVF9ERUxJTUlURVI7Ci0JCQkJYmNzcC0+cnhfY291bnQgPSAwOwotCQkJCWNvbnRpbnVlOwotCQkJfQogCQkJYmNzcC0+cnhfc3RhdGUgPSBCQ1NQX1c0X0RBVEE7CiAJCQliY3NwLT5yeF9jb3VudCA9IChiY3NwLT5yeF9za2ItPmRhdGFbMV0gPj4gNCkgKwogCQkJCQkoYmNzcC0+cnhfc2tiLT5kYXRhWzJdIDw8IDQpOwkvKiBNYXkgYmUgMCAqLwpAQCAtNjIwLDggKzY0MCw4IEBACiAJCWNhc2UgQkNTUF9XNF9DUkM6CiAJCQlpZiAoYml0cmV2MTYoYmNzcC0+bWVzc2FnZV9jcmMpICE9IGJzY3BfZ2V0X2NyYyhiY3NwKSkgewogCQkJCUJUX0VSUigiQ2hlY2tzdW0gZmFpbGVkOiBjb21wdXRlZCAlMDR4IHJlY2VpdmVkICUwNHgiLAotCQkJCQliaXRyZXYxNihiY3NwLT5tZXNzYWdlX2NyYyksCi0JCQkJCWJzY3BfZ2V0X2NyYyhiY3NwKSk7CisJCQkJICAgICAgIGJpdHJldjE2KGJjc3AtPm1lc3NhZ2VfY3JjKSwKKwkJCQkgICAgICAgYnNjcF9nZXRfY3JjKGJjc3ApKTsKIAogCQkJCWtmcmVlX3NrYihiY3NwLT5yeF9za2IpOwogCQkJCWJjc3AtPnJ4X3N0YXRlID0gQkNTUF9XNF9QS1RfREVMSU1JVEVSOwpAQCAtNjc5LDcgKzY5OSw3IEBACiAJLyogQXJyYW5nZSB0byByZXRyYW5zbWl0IGFsbCBtZXNzYWdlcyBpbiB0aGUgcmVscS4gKi8KIHN0YXRpYyB2b2lkIGJjc3BfdGltZWRfZXZlbnQodW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0Jc3RydWN0IGhjaV91YXJ0ICpodSA9IChzdHJ1Y3QgaGNpX3VhcnQgKikgYXJnOworCXN0cnVjdCBoY2lfdWFydCAqaHUgPSAoc3RydWN0IGhjaV91YXJ0ICopYXJnOwogCXN0cnVjdCBiY3NwX3N0cnVjdCAqYmNzcCA9IGh1LT5wcml2OwogCXN0cnVjdCBza19idWZmICpza2I7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTcxNSw3ICs3MzUsNyBAQAogCiAJaW5pdF90aW1lcigmYmNzcC0+dGJjc3ApOwogCWJjc3AtPnRiY3NwLmZ1bmN0aW9uID0gYmNzcF90aW1lZF9ldmVudDsKLQliY3NwLT50YmNzcC5kYXRhICAgICA9ICh1X2xvbmcpIGh1OworCWJjc3AtPnRiY3NwLmRhdGEgICAgID0gKHVfbG9uZylodTsKIAogCWJjc3AtPnJ4X3N0YXRlID0gQkNTUF9XNF9QS1RfREVMSU1JVEVSOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfaW50ZWwuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9pbnRlbC5jCmluZGV4IGVkMGE0MjAuLjllMjcxMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9pbnRlbC5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9pbnRlbC5jCkBAIC0xMjgsNyArMTI4LDcgQEAKIAkJCQkgIFRBU0tfSU5URVJSVVBUSUJMRSwKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOwogCi0JaWYgKGVyciA9PSAxKSB7CisJaWYgKGVyciA9PSAtRUlOVFIpIHsKIAkJYnRfZGV2X2VycihodS0+aGRldiwgIkRldmljZSBib290IGludGVycnVwdGVkIik7CiAJCXJldHVybiAtRUlOVFI7CiAJfQpAQCAtMTUxLDcgKzE1MSw3IEBACiAJCQkJICBUQVNLX0lOVEVSUlVQVElCTEUsCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKDEwMDApKTsKIAotCWlmIChlcnIgPT0gMSkgeworCWlmIChlcnIgPT0gLUVJTlRSKSB7CiAJCWJ0X2Rldl9lcnIoaHUtPmhkZXYsICJMUE0gdHJhbnNhY3Rpb24gaW50ZXJydXB0ZWQiKTsKIAkJcmV0dXJuIC1FSU5UUjsKIAl9CkBAIC04MTMsNyArODEzLDcgQEAKIAllcnIgPSB3YWl0X29uX2JpdF90aW1lb3V0KCZpbnRlbC0+ZmxhZ3MsIFNUQVRFX0RPV05MT0FESU5HLAogCQkJCSAgVEFTS19JTlRFUlJVUFRJQkxFLAogCQkJCSAgbXNlY3NfdG9famlmZmllcyg1MDAwKSk7Ci0JaWYgKGVyciA9PSAxKSB7CisJaWYgKGVyciA9PSAtRUlOVFIpIHsKIAkJYnRfZGV2X2VycihoZGV2LCAiRmlybXdhcmUgbG9hZGluZyBpbnRlcnJ1cHRlZCIpOwogCQllcnIgPSAtRUlOVFI7CiAJCWdvdG8gZG9uZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9sZGlzYy5jIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2xkaXNjLmMKaW5kZXggZGRhOTczOS4uOTQ5N2M0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX2xkaXNjLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2xkaXNjLmMKQEAgLTY5NywzNCArNjk3LDM2IEBACiAJY2FzZSBIQ0lVQVJUU0VUUFJPVE86CiAJCWlmICghdGVzdF9hbmRfc2V0X2JpdChIQ0lfVUFSVF9QUk9UT19TRVQsICZodS0+ZmxhZ3MpKSB7CiAJCQllcnIgPSBoY2lfdWFydF9zZXRfcHJvdG8oaHUsIGFyZyk7Ci0JCQlpZiAoZXJyKSB7CisJCQlpZiAoZXJyKQogCQkJCWNsZWFyX2JpdChIQ0lfVUFSVF9QUk9UT19TRVQsICZodS0+ZmxhZ3MpOwotCQkJCXJldHVybiBlcnI7Ci0JCQl9CiAJCX0gZWxzZQotCQkJcmV0dXJuIC1FQlVTWTsKKwkJCWVyciA9IC1FQlVTWTsKIAkJYnJlYWs7CiAKIAljYXNlIEhDSVVBUlRHRVRQUk9UTzoKIAkJaWYgKHRlc3RfYml0KEhDSV9VQVJUX1BST1RPX1NFVCwgJmh1LT5mbGFncykpCi0JCQlyZXR1cm4gaHUtPnByb3RvLT5pZDsKLQkJcmV0dXJuIC1FVU5BVENIOworCQkJZXJyID0gaHUtPnByb3RvLT5pZDsKKwkJZWxzZQorCQkJZXJyID0gLUVVTkFUQ0g7CisJCWJyZWFrOwogCiAJY2FzZSBIQ0lVQVJUR0VUREVWSUNFOgogCQlpZiAodGVzdF9iaXQoSENJX1VBUlRfUkVHSVNURVJFRCwgJmh1LT5mbGFncykpCi0JCQlyZXR1cm4gaHUtPmhkZXYtPmlkOwotCQlyZXR1cm4gLUVVTkFUQ0g7CisJCQllcnIgPSBodS0+aGRldi0+aWQ7CisJCWVsc2UKKwkJCWVyciA9IC1FVU5BVENIOworCQlicmVhazsKIAogCWNhc2UgSENJVUFSVFNFVEZMQUdTOgogCQlpZiAodGVzdF9iaXQoSENJX1VBUlRfUFJPVE9fU0VULCAmaHUtPmZsYWdzKSkKLQkJCXJldHVybiAtRUJVU1k7Ci0JCWVyciA9IGhjaV91YXJ0X3NldF9mbGFncyhodSwgYXJnKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7CisJCQllcnIgPSAtRUJVU1k7CisJCWVsc2UKKwkJCWVyciA9IGhjaV91YXJ0X3NldF9mbGFncyhodSwgYXJnKTsKIAkJYnJlYWs7CiAKIAljYXNlIEhDSVVBUlRHRVRGTEFHUzoKLQkJcmV0dXJuIGh1LT5oZGV2X2ZsYWdzOworCQllcnIgPSBodS0+aGRldl9mbGFnczsKKwkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQllcnIgPSBuX3R0eV9pb2N0bF9oZWxwZXIodHR5LCBmaWxlLCBjbWQsIGFyZyk7CkBAIC04MTAsNiArODEyLDkgQEAKICNpZmRlZiBDT05GSUdfQlRfSENJVUFSVF9BRzZYWAogCWFnNnh4X2luaXQoKTsKICNlbmRpZgorI2lmZGVmIENPTkZJR19CVF9IQ0lVQVJUX01SVkwKKwltcnZsX2luaXQoKTsKKyNlbmRpZgogCiAJcmV0dXJuIDA7CiB9CkBAIC04NDUsNiArODUwLDkgQEAKICNpZmRlZiBDT05GSUdfQlRfSENJVUFSVF9BRzZYWAogCWFnNnh4X2RlaW5pdCgpOwogI2VuZGlmCisjaWZkZWYgQ09ORklHX0JUX0hDSVVBUlRfTVJWTAorCW1ydmxfZGVpbml0KCk7CisjZW5kaWYKIAogCS8qIFJlbGVhc2UgdHR5IHJlZ2lzdHJhdGlvbiBvZiBsaW5lIGRpc2NpcGxpbmUgKi8KIAllcnIgPSB0dHlfdW5yZWdpc3Rlcl9sZGlzYyhOX0hDSSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfbXJ2bC5jIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX21ydmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmM0YjM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX21ydmwuYwpAQCAtMCwwICsxLDM4NyBAQAorLyoKKyAqCisgKiAgQmx1ZXRvb3RoIEhDSSBVQVJUIGRyaXZlciBmb3IgbWFydmVsbCBkZXZpY2VzCisgKgorICogIENvcHlyaWdodCAoQykgMjAxNiAgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMTYgIEludGVsIENvcnBvcmF0aW9uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisKKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KKworI2luY2x1ZGUgImhjaV91YXJ0LmgiCisKKyNkZWZpbmUgSENJX0ZXX1JFUV9QS1QgMHhBNQorI2RlZmluZSBIQ0lfQ0hJUF9WRVJfUEtUIDB4QUEKKworI2RlZmluZSBNUlZMX0FDSyAweDVBCisjZGVmaW5lIE1SVkxfTkFLIDB4QkYKKyNkZWZpbmUgTVJWTF9SQVdfREFUQSAweDFGCisKK2VudW0geworCVNUQVRFX0NISVBfVkVSX1BFTkRJTkcsCisJU1RBVEVfRldfUkVRX1BFTkRJTkcsCit9OworCitzdHJ1Y3QgbXJ2bF9kYXRhIHsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tiOworCXN0cnVjdCBza19idWZmX2hlYWQgdHhxOworCXN0cnVjdCBza19idWZmX2hlYWQgcmF3cTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCB0eF9sZW47CisJdTggaWQsIHJldjsKK307CisKK3N0cnVjdCBoY2lfbXJ2bF9wa3QgeworCV9fbGUxNiBsaHM7CisJX19sZTE2IHJoczsKK30gX19wYWNrZWQ7CisjZGVmaW5lIEhDSV9NUlZMX1BLVF9TSVpFIDQKKworc3RhdGljIGludCBtcnZsX29wZW4oc3RydWN0IGhjaV91YXJ0ICpodSkKK3sKKwlzdHJ1Y3QgbXJ2bF9kYXRhICptcnZsOworCisJQlRfREJHKCJodSAlcCIsIGh1KTsKKworCW1ydmwgPSBremFsbG9jKHNpemVvZigqbXJ2bCksIEdGUF9LRVJORUwpOworCWlmICghbXJ2bCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlza2JfcXVldWVfaGVhZF9pbml0KCZtcnZsLT50eHEpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJm1ydmwtPnJhd3EpOworCisJc2V0X2JpdChTVEFURV9DSElQX1ZFUl9QRU5ESU5HLCAmbXJ2bC0+ZmxhZ3MpOworCisJaHUtPnByaXYgPSBtcnZsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1ydmxfY2xvc2Uoc3RydWN0IGhjaV91YXJ0ICpodSkKK3sKKwlzdHJ1Y3QgbXJ2bF9kYXRhICptcnZsID0gaHUtPnByaXY7CisKKwlCVF9EQkcoImh1ICVwIiwgaHUpOworCisJc2tiX3F1ZXVlX3B1cmdlKCZtcnZsLT50eHEpOworCXNrYl9xdWV1ZV9wdXJnZSgmbXJ2bC0+cmF3cSk7CisJa2ZyZWVfc2tiKG1ydmwtPnJ4X3NrYik7CisJa2ZyZWUobXJ2bCk7CisKKwlodS0+cHJpdiA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXJ2bF9mbHVzaChzdHJ1Y3QgaGNpX3VhcnQgKmh1KQoreworCXN0cnVjdCBtcnZsX2RhdGEgKm1ydmwgPSBodS0+cHJpdjsKKworCUJUX0RCRygiaHUgJXAiLCBodSk7CisKKwlza2JfcXVldWVfcHVyZ2UoJm1ydmwtPnR4cSk7CisJc2tiX3F1ZXVlX3B1cmdlKCZtcnZsLT5yYXdxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKm1ydmxfZGVxdWV1ZShzdHJ1Y3QgaGNpX3VhcnQgKmh1KQoreworCXN0cnVjdCBtcnZsX2RhdGEgKm1ydmwgPSBodS0+cHJpdjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJc2tiID0gc2tiX2RlcXVldWUoJm1ydmwtPnR4cSk7CisJaWYgKCFza2IpIHsKKwkJLyogQW55IHJhdyBkYXRhID8gKi8KKwkJc2tiID0gc2tiX2RlcXVldWUoJm1ydmwtPnJhd3EpOworCX0gZWxzZSB7CisJCS8qIFByZXBlbmQgc2tiIHdpdGggZnJhbWUgdHlwZSAqLworCQltZW1jcHkoc2tiX3B1c2goc2tiLCAxKSwgJmJ0X2NiKHNrYiktPnBrdF90eXBlLCAxKTsKKwl9CisKKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgaW50IG1ydmxfZW5xdWV1ZShzdHJ1Y3QgaGNpX3VhcnQgKmh1LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBtcnZsX2RhdGEgKm1ydmwgPSBodS0+cHJpdjsKKworCXNrYl9xdWV1ZV90YWlsKCZtcnZsLT50eHEsIHNrYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1ydmxfc2VuZF9hY2soc3RydWN0IGhjaV91YXJ0ICpodSwgdW5zaWduZWQgY2hhciB0eXBlKQoreworCXN0cnVjdCBtcnZsX2RhdGEgKm1ydmwgPSBodS0+cHJpdjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJLyogTm8gSDQgcGF5bG9hZCwgb25seSAxIGJ5dGUgaGVhZGVyICovCisJc2tiID0gYnRfc2tiX2FsbG9jKDAsIEdGUF9BVE9NSUMpOworCWlmICghc2tiKSB7CisJCWJ0X2Rldl9lcnIoaHUtPmhkZXYsICJVbmFibGUgdG8gYWxsb2MgYWNrL25hayBwYWNrZXQiKTsKKwkJcmV0dXJuOworCX0KKwloY2lfc2tiX3BrdF90eXBlKHNrYikgPSB0eXBlOworCisJc2tiX3F1ZXVlX3RhaWwoJm1ydmwtPnR4cSwgc2tiKTsKKwloY2lfdWFydF90eF93YWtldXAoaHUpOworfQorCitzdGF0aWMgaW50IG1ydmxfcmVjdl9md19yZXEoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGhjaV9tcnZsX3BrdCAqcGt0ID0gKHZvaWQgKilza2ItPmRhdGE7CisJc3RydWN0IGhjaV91YXJ0ICpodSA9IGhjaV9nZXRfZHJ2ZGF0YShoZGV2KTsKKwlzdHJ1Y3QgbXJ2bF9kYXRhICptcnZsID0gaHUtPnByaXY7CisJaW50IHJldCA9IDA7CisKKwlpZiAoKHBrdC0+bGhzIF4gcGt0LT5yaHMpICE9IDB4ZmZmZikgeworCQlidF9kZXZfZXJyKGhkZXYsICJDb3JydXB0ZWQgbXJ2bCBoZWFkZXIiKTsKKwkJbXJ2bF9zZW5kX2FjayhodSwgTVJWTF9OQUspOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCW1ydmxfc2VuZF9hY2soaHUsIE1SVkxfQUNLKTsKKworCWlmICghdGVzdF9iaXQoU1RBVEVfRldfUkVRX1BFTkRJTkcsICZtcnZsLT5mbGFncykpIHsKKwkJYnRfZGV2X2VycihoZGV2LCAiUmVjZWl2ZWQgdW5leHBlY3RlZCBmaXJtd2FyZSByZXF1ZXN0Iik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwltcnZsLT50eF9sZW4gPSBsZTE2X3RvX2NwdShwa3QtPmxocyk7CisKKwljbGVhcl9iaXQoU1RBVEVfRldfUkVRX1BFTkRJTkcsICZtcnZsLT5mbGFncyk7CisJc21wX21iX19hZnRlcl9hdG9taWMoKTsKKwl3YWtlX3VwX2JpdCgmbXJ2bC0+ZmxhZ3MsIFNUQVRFX0ZXX1JFUV9QRU5ESU5HKTsKKworZG9uZToKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1ydmxfcmVjdl9jaGlwX3ZlcihzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaGNpX21ydmxfcGt0ICpwa3QgPSAodm9pZCAqKXNrYi0+ZGF0YTsKKwlzdHJ1Y3QgaGNpX3VhcnQgKmh1ID0gaGNpX2dldF9kcnZkYXRhKGhkZXYpOworCXN0cnVjdCBtcnZsX2RhdGEgKm1ydmwgPSBodS0+cHJpdjsKKwl1MTYgdmVyc2lvbiA9IGxlMTZfdG9fY3B1KHBrdC0+bGhzKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICgocGt0LT5saHMgXiBwa3QtPnJocykgIT0gMHhmZmZmKSB7CisJCWJ0X2Rldl9lcnIoaGRldiwgIkNvcnJ1cHRlZCBtcnZsIGhlYWRlciIpOworCQltcnZsX3NlbmRfYWNrKGh1LCBNUlZMX05BSyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisJbXJ2bF9zZW5kX2FjayhodSwgTVJWTF9BQ0spOworCisJaWYgKCF0ZXN0X2JpdChTVEFURV9DSElQX1ZFUl9QRU5ESU5HLCAmbXJ2bC0+ZmxhZ3MpKSB7CisJCWJ0X2Rldl9lcnIoaGRldiwgIlJlY2VpdmVkIHVuZXhwZWN0ZWQgY2hpcCB2ZXJzaW9uIik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwltcnZsLT5pZCA9IHZlcnNpb247CisJbXJ2bC0+cmV2ID0gdmVyc2lvbiA+PiA4OworCisJYnRfZGV2X2luZm8oaGRldiwgIkNvbnRyb2xsZXIgaWQgPSAleCwgcmV2ID0gJXgiLCBtcnZsLT5pZCwgbXJ2bC0+cmV2KTsKKworCWNsZWFyX2JpdChTVEFURV9DSElQX1ZFUl9QRU5ESU5HLCAmbXJ2bC0+ZmxhZ3MpOworCXNtcF9tYl9fYWZ0ZXJfYXRvbWljKCk7CisJd2FrZV91cF9iaXQoJm1ydmwtPmZsYWdzLCBTVEFURV9DSElQX1ZFUl9QRU5ESU5HKTsKKworZG9uZToKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIEhDSV9SRUNWX0NISVBfVkVSIFwKKwkudHlwZSA9IEhDSV9DSElQX1ZFUl9QS1QsIFwKKwkuaGxlbiA9IEhDSV9NUlZMX1BLVF9TSVpFLCBcCisJLmxvZmYgPSAwLCBcCisJLmxzaXplID0gMCwgXAorCS5tYXhsZW4gPSBIQ0lfTVJWTF9QS1RfU0laRQorCisjZGVmaW5lIEhDSV9SRUNWX0ZXX1JFUSBcCisJLnR5cGUgPSBIQ0lfRldfUkVRX1BLVCwgXAorCS5obGVuID0gSENJX01SVkxfUEtUX1NJWkUsIFwKKwkubG9mZiA9IDAsIFwKKwkubHNpemUgPSAwLCBcCisJLm1heGxlbiA9IEhDSV9NUlZMX1BLVF9TSVpFCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaDRfcmVjdl9wa3QgbXJ2bF9yZWN2X3BrdHNbXSA9IHsKKwl7IEg0X1JFQ1ZfQUNMLCAgICAgICAucmVjdiA9IGhjaV9yZWN2X2ZyYW1lICAgICB9LAorCXsgSDRfUkVDVl9TQ08sICAgICAgIC5yZWN2ID0gaGNpX3JlY3ZfZnJhbWUgICAgIH0sCisJeyBINF9SRUNWX0VWRU5ULCAgICAgLnJlY3YgPSBoY2lfcmVjdl9mcmFtZSAgICAgfSwKKwl7IEhDSV9SRUNWX0ZXX1JFUSwgICAucmVjdiA9IG1ydmxfcmVjdl9md19yZXEgICB9LAorCXsgSENJX1JFQ1ZfQ0hJUF9WRVIsIC5yZWN2ID0gbXJ2bF9yZWN2X2NoaXBfdmVyIH0sCit9OworCitzdGF0aWMgaW50IG1ydmxfcmVjdihzdHJ1Y3QgaGNpX3VhcnQgKmh1LCBjb25zdCB2b2lkICpkYXRhLCBpbnQgY291bnQpCit7CisJc3RydWN0IG1ydmxfZGF0YSAqbXJ2bCA9IGh1LT5wcml2OworCisJaWYgKCF0ZXN0X2JpdChIQ0lfVUFSVF9SRUdJU1RFUkVELCAmaHUtPmZsYWdzKSkKKwkJcmV0dXJuIC1FVU5BVENIOworCisJbXJ2bC0+cnhfc2tiID0gaDRfcmVjdl9idWYoaHUtPmhkZXYsIG1ydmwtPnJ4X3NrYiwgZGF0YSwgY291bnQsCisJCQkJICAgIG1ydmxfcmVjdl9wa3RzLAorCQkJCSAgICBBUlJBWV9TSVpFKG1ydmxfcmVjdl9wa3RzKSk7CisJaWYgKElTX0VSUihtcnZsLT5yeF9za2IpKSB7CisJCWludCBlcnIgPSBQVFJfRVJSKG1ydmwtPnJ4X3NrYik7CisJCWJ0X2Rldl9lcnIoaHUtPmhkZXYsICJGcmFtZSByZWFzc2VtYmx5IGZhaWxlZCAoJWQpIiwgZXJyKTsKKwkJbXJ2bC0+cnhfc2tiID0gTlVMTDsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgbXJ2bF9sb2FkX2Zpcm13YXJlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBoY2lfdWFydCAqaHUgPSBoY2lfZ2V0X2RydmRhdGEoaGRldik7CisJc3RydWN0IG1ydmxfZGF0YSAqbXJ2bCA9IGh1LT5wcml2OworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncgPSBOVUxMOworCWNvbnN0IHU4ICpmd19wdHIsICpmd19tYXg7CisJaW50IGVycjsKKworCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBuYW1lLCAmaGRldi0+ZGV2KTsKKwlpZiAoZXJyIDwgMCkgeworCQlidF9kZXZfZXJyKGhkZXYsICJGYWlsZWQgdG8gbG9hZCBmaXJtd2FyZSBmaWxlICVzIiwgbmFtZSk7CisJCXJldHVybiBlcnI7CisJfQorCisJZndfcHRyID0gZnctPmRhdGE7CisJZndfbWF4ID0gZnctPmRhdGEgKyBmdy0+c2l6ZTsKKworCWJ0X2Rldl9pbmZvKGhkZXYsICJMb2FkaW5nICVzIiwgbmFtZSk7CisKKwlzZXRfYml0KFNUQVRFX0ZXX1JFUV9QRU5ESU5HLCAmbXJ2bC0+ZmxhZ3MpOworCisJd2hpbGUgKGZ3X3B0ciA8PSBmd19tYXgpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkvKiBDb250cm9sbGVyIGRyaXZlcyB0aGUgZmlybXdhcmUgbG9hZCBieSBzZW5kaW5nIGZpcm13YXJlCisJCSAqIHJlcXVlc3QgcGFja2V0cyBjb250YWluaW5nIHRoZSBleHBlY3RlZCBmcmFnbWVudCBzaXplLgorCQkgKi8KKwkJZXJyID0gd2FpdF9vbl9iaXRfdGltZW91dCgmbXJ2bC0+ZmxhZ3MsIFNUQVRFX0ZXX1JFUV9QRU5ESU5HLAorCQkJCQkgIFRBU0tfSU5URVJSVVBUSUJMRSwKKwkJCQkJICBtc2Vjc190b19qaWZmaWVzKDIwMDApKTsKKwkJaWYgKGVyciA9PSAxKSB7CisJCQlidF9kZXZfZXJyKGhkZXYsICJGaXJtd2FyZSBsb2FkIGludGVycnVwdGVkIik7CisJCQllcnIgPSAtRUlOVFI7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChlcnIpIHsKKwkJCWJ0X2Rldl9lcnIoaGRldiwgIkZpcm13YXJlIHJlcXVlc3QgdGltZW91dCIpOworCQkJZXJyID0gLUVUSU1FRE9VVDsKKwkJCWJyZWFrOworCQl9CisKKwkJYnRfZGV2X2RiZyhoZGV2LCAiRmlybXdhcmUgcmVxdWVzdCwgZXhwZWN0aW5nICVkIGJ5dGVzIiwKKwkJCSAgIG1ydmwtPnR4X2xlbik7CisKKwkJaWYgKGZ3X3B0ciA9PSBmd19tYXgpIHsKKwkJCS8qIENvbnRyb2xsZXIgcmVxdWVzdHMgYSBudWxsIHNpemUgb25jZSBmaXJtd2FyZSBpcworCQkJICogZnVsbHkgbG9hZGVkLiBJZiBjb250cm9sbGVyIGV4cGVjdHMgbW9yZSBkYXRhLCB0aGVyZQorCQkJICogaXMgYW4gaXNzdWUuCisJCQkgKi8KKwkJCWlmICghbXJ2bC0+dHhfbGVuKSB7CisJCQkJYnRfZGV2X2luZm8oaGRldiwgIkZpcm13YXJlIGxvYWRpbmcgY29tcGxldGUiKTsKKwkJCX0gZWxzZSB7CisJCQkJYnRfZGV2X2VycihoZGV2LCAiRmlybXdhcmUgbG9hZGluZyBmYWlsdXJlIik7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGZ3X3B0ciArIG1ydmwtPnR4X2xlbiA+IGZ3X21heCkgeworCQkJbXJ2bC0+dHhfbGVuID0gZndfbWF4IC0gZndfcHRyOworCQkJYnRfZGV2X2RiZyhoZGV2LCAiQWRqdXN0aW5nIHR4X2xlbiB0byAlZCIsCisJCQkJICAgbXJ2bC0+dHhfbGVuKTsKKwkJfQorCisJCXNrYiA9IGJ0X3NrYl9hbGxvYyhtcnZsLT50eF9sZW4sIEdGUF9LRVJORUwpOworCQlpZiAoIXNrYikgeworCQkJYnRfZGV2X2VycihoZGV2LCAiRmFpbGVkIHRvIGFsbG9jIG1lbSBmb3IgRlcgcGFja2V0Iik7CisJCQllcnIgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKwkJYnRfY2Ioc2tiKS0+cGt0X3R5cGUgPSBNUlZMX1JBV19EQVRBOworCisJCW1lbWNweShza2JfcHV0KHNrYiwgbXJ2bC0+dHhfbGVuKSwgZndfcHRyLCBtcnZsLT50eF9sZW4pOworCQlmd19wdHIgKz0gbXJ2bC0+dHhfbGVuOworCisJCXNldF9iaXQoU1RBVEVfRldfUkVRX1BFTkRJTkcsICZtcnZsLT5mbGFncyk7CisKKwkJc2tiX3F1ZXVlX3RhaWwoJm1ydmwtPnJhd3EsIHNrYik7CisJCWhjaV91YXJ0X3R4X3dha2V1cChodSk7CisJfQorCisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtcnZsX3NldHVwKHN0cnVjdCBoY2lfdWFydCAqaHUpCit7CisJaW50IGVycjsKKworCWhjaV91YXJ0X3NldF9mbG93X2NvbnRyb2woaHUsIHRydWUpOworCisJZXJyID0gbXJ2bF9sb2FkX2Zpcm13YXJlKGh1LT5oZGV2LCAibXJ2bC9oZWxwZXJfdWFydF8zMDAwMDAwLmJpbiIpOworCWlmIChlcnIpIHsKKwkJYnRfZGV2X2VycihodS0+aGRldiwgIlVuYWJsZSB0byBkb3dubG9hZCBmaXJtd2FyZSBoZWxwZXIiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaGNpX3VhcnRfc2V0X2JhdWRyYXRlKGh1LCAzMDAwMDAwKTsKKwloY2lfdWFydF9zZXRfZmxvd19jb250cm9sKGh1LCBmYWxzZSk7CisKKwllcnIgPSBtcnZsX2xvYWRfZmlybXdhcmUoaHUtPmhkZXYsICJtcnZsL3VhcnQ4ODk3X2J0LmJpbiIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoY2lfdWFydF9wcm90byBtcnZsX3Byb3RvID0geworCS5pZAkJPSBIQ0lfVUFSVF9NUlZMLAorCS5uYW1lCQk9ICJNYXJ2ZWxsIiwKKwkuaW5pdF9zcGVlZAk9IDExNTIwMCwKKwkub3BlbgkJPSBtcnZsX29wZW4sCisJLmNsb3NlCQk9IG1ydmxfY2xvc2UsCisJLmZsdXNoCQk9IG1ydmxfZmx1c2gsCisJLnNldHVwCQk9IG1ydmxfc2V0dXAsCisJLnJlY3YJCT0gbXJ2bF9yZWN2LAorCS5lbnF1ZXVlCT0gbXJ2bF9lbnF1ZXVlLAorCS5kZXF1ZXVlCT0gbXJ2bF9kZXF1ZXVlLAorfTsKKworaW50IF9faW5pdCBtcnZsX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaGNpX3VhcnRfcmVnaXN0ZXJfcHJvdG8oJm1ydmxfcHJvdG8pOworfQorCitpbnQgX19leGl0IG1ydmxfZGVpbml0KHZvaWQpCit7CisJcmV0dXJuIGhjaV91YXJ0X3VucmVnaXN0ZXJfcHJvdG8oJm1ydmxfcHJvdG8pOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX3FjYS5jIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX3FjYS5jCmluZGV4IDY4M2MyYjYuLjZjODY3ZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9xY2EuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfcWNhLmMKQEAgLTM5Nyw3ICszOTcsNyBAQAogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnFjYS0+dHhxKTsKIAlza2JfcXVldWVfaGVhZF9pbml0KCZxY2EtPnR4X3dhaXRfcSk7CiAJc3Bpbl9sb2NrX2luaXQoJnFjYS0+aGNpX2lic19sb2NrKTsKLQlxY2EtPndvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJxY2Ffd3EiKTsKKwlxY2EtPndvcmtxdWV1ZSA9IGFsbG9jX29yZGVyZWRfd29ya3F1ZXVlKCJxY2Ffd3EiLCAwKTsKIAlpZiAoIXFjYS0+d29ya3F1ZXVlKSB7CiAJCUJUX0VSUigiUUNBIFdvcmtxdWV1ZSBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkiKTsKIAkJa2ZyZWUocWNhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV91YXJ0LmggYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfdWFydC5oCmluZGV4IDgzOWJhZDEuLjA3MDEzOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV91YXJ0LmgKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX3VhcnQuaApAQCAtMzUsNyArMzUsNyBAQAogI2RlZmluZSBIQ0lVQVJUR0VURkxBR1MJCV9JT1IoJ1UnLCAyMDQsIGludCkKIAogLyogVUFSVCBwcm90b2NvbHMgKi8KLSNkZWZpbmUgSENJX1VBUlRfTUFYX1BST1RPCTEwCisjZGVmaW5lIEhDSV9VQVJUX01BWF9QUk9UTwkxMgogCiAjZGVmaW5lIEhDSV9VQVJUX0g0CTAKICNkZWZpbmUgSENJX1VBUlRfQkNTUAkxCkBAIC00Nyw2ICs0Nyw4IEBACiAjZGVmaW5lIEhDSV9VQVJUX0JDTQk3CiAjZGVmaW5lIEhDSV9VQVJUX1FDQQk4CiAjZGVmaW5lIEhDSV9VQVJUX0FHNlhYCTkKKyNkZWZpbmUgSENJX1VBUlRfTk9LSUEJMTAKKyNkZWZpbmUgSENJX1VBUlRfTVJWTAkxMQogCiAjZGVmaW5lIEhDSV9VQVJUX1JBV19ERVZJQ0UJMAogI2RlZmluZSBIQ0lfVUFSVF9SRVNFVF9PTl9JTklUCTEKQEAgLTE4OSwzICsxOTEsOCBAQAogaW50IGFnNnh4X2luaXQodm9pZCk7CiBpbnQgYWc2eHhfZGVpbml0KHZvaWQpOwogI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQlRfSENJVUFSVF9NUlZMCitpbnQgbXJ2bF9pbml0KHZvaWQpOworaW50IG1ydmxfZGVpbml0KHZvaWQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfdmhjaS5jIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX3ZoY2kuYwppbmRleCAzZmYyMjliLi5jNGE3NWExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfdmhjaS5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV92aGNpLmMKQEAgLTM3NywyMSArMzc3LDcgQEAKIAkuZm9wcwk9ICZ2aGNpX2ZvcHMsCiAJLm1pbm9yCT0gVkhDSV9NSU5PUiwKIH07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHZoY2lfaW5pdCh2b2lkKQotewotCUJUX0lORk8oIlZpcnR1YWwgSENJIGRyaXZlciB2ZXIgJXMiLCBWRVJTSU9OKTsKLQotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZ2aGNpX21pc2NkZXYpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdmhjaV9leGl0KHZvaWQpCi17Ci0JbWlzY19kZXJlZ2lzdGVyKCZ2aGNpX21pc2NkZXYpOwotfQotCi1tb2R1bGVfaW5pdCh2aGNpX2luaXQpOwotbW9kdWxlX2V4aXQodmhjaV9leGl0KTsKK21vZHVsZV9taXNjX2RldmljZSh2aGNpX21pc2NkZXYpOwogCiBtb2R1bGVfcGFyYW0oYW1wLCBib29sLCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoYW1wLCAiQ3JlYXRlIEFNUCBjb250cm9sbGVyIGRldmljZSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9idXMvYXJtLWNjaS5jIGIvZHJpdmVycy9idXMvYXJtLWNjaS5jCmluZGV4IDU3NTU5MDdmLi44OTAwODIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2J1cy9hcm0tY2NpLmMKKysrIGIvZHJpdmVycy9idXMvYXJtLWNjaS5jCkBAIC0xNDQsMTUgKzE0NCwxMiBAQAogCWludCBudW1fY250cnM7CiAJYXRvbWljX3QgYWN0aXZlX2V2ZW50czsKIAlzdHJ1Y3QgbXV0ZXggcmVzZXJ2ZV9tdXRleDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJ5OworCXN0cnVjdCBobGlzdF9ub2RlIG5vZGU7CiAJY3B1bWFza190IGNwdXM7CiB9OwogCiAjZGVmaW5lIHRvX2NjaV9wbXUoYykJKGNvbnRhaW5lcl9vZihjLCBzdHJ1Y3QgY2NpX3BtdSwgcG11KSkKIAotc3RhdGljIERFRklORV9NVVRFWChjY2lfcG11X211dGV4KTsKLXN0YXRpYyBMSVNUX0hFQUQoY2NpX3BtdV9saXN0KTsKLQogZW51bSBjY2lfbW9kZWxzIHsKICNpZmRlZiBDT05GSUdfQVJNX0NDSTQwMF9QTVUKIAlDQ0k0MDBfUjAsCkBAIC01NTEsNyArNTQ4LDcgQEAKIAlDQ0k1eHhfR0xPQkFMX0VWRU5UX0VYVF9BVFRSX0VOVFJZKGNjaV93cnEsIDB4QiksCiAJQ0NJNXh4X0dMT0JBTF9FVkVOVF9FWFRfQVRUUl9FTlRSWShjY2lfc25vb3BfY2RfaHMsIDB4QyksCiAJQ0NJNXh4X0dMT0JBTF9FVkVOVF9FWFRfQVRUUl9FTlRSWShjY2lfcnFfc3RhbGxfYWRkcl9oYXphcmQsIDB4RCksCi0JQ0NJNXh4X0dMT0JBTF9FVkVOVF9FWFRfQVRUUl9FTlRSWShjY2lfc25vcHBfcnFfc3RhbGxfdHRfZnVsbCwgMHhFKSwKKwlDQ0k1eHhfR0xPQkFMX0VWRU5UX0VYVF9BVFRSX0VOVFJZKGNjaV9zbm9vcF9ycV9zdGFsbF90dF9mdWxsLCAweEUpLAogCUNDSTV4eF9HTE9CQUxfRVZFTlRfRVhUX0FUVFJfRU5UUlkoY2NpX3Nub29wX3JxX3R6bXAxX3Byb3QsIDB4RiksCiAJTlVMTAogfTsKQEAgLTE1MDYsMjUgKzE1MDMsMjEgQEAKIAlyZXR1cm4gcGVyZl9wbXVfcmVnaXN0ZXIoJmNjaV9wbXUtPnBtdSwgbmFtZSwgLTEpOwogfQogCi1zdGF0aWMgaW50IGNjaV9wbXVfb2ZmbGluZV9jcHUodW5zaWduZWQgaW50IGNwdSkKK3N0YXRpYyBpbnQgY2NpX3BtdV9vZmZsaW5lX2NwdSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSkKIHsKLQlzdHJ1Y3QgY2NpX3BtdSAqY2NpX3BtdTsKKwlzdHJ1Y3QgY2NpX3BtdSAqY2NpX3BtdSA9IGhsaXN0X2VudHJ5X3NhZmUobm9kZSwgc3RydWN0IGNjaV9wbXUsIG5vZGUpOwogCXVuc2lnbmVkIGludCB0YXJnZXQ7CiAKLQltdXRleF9sb2NrKCZjY2lfcG11X211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNjaV9wbXUsICZjY2lfcG11X2xpc3QsIGVudHJ5KSB7Ci0JCWlmICghY3B1bWFza190ZXN0X2FuZF9jbGVhcl9jcHUoY3B1LCAmY2NpX3BtdS0+Y3B1cykpCi0JCQljb250aW51ZTsKLQkJdGFyZ2V0ID0gY3B1bWFza19hbnlfYnV0KGNwdV9vbmxpbmVfbWFzaywgY3B1KTsKLQkJaWYgKHRhcmdldCA+PSBucl9jcHVfaWRzKQotCQkJY29udGludWU7Ci0JCS8qCi0JCSAqIFRPRE86IG1pZ3JhdGUgY29udGV4dCBvbmNlIGNvcmUgcmFjZXMgb24gZXZlbnQtPmN0eCBoYXZlCi0JCSAqIGJlZW4gZml4ZWQuCi0JCSAqLwotCQljcHVtYXNrX3NldF9jcHUodGFyZ2V0LCAmY2NpX3BtdS0+Y3B1cyk7Ci0JfQotCW11dGV4X3VubG9jaygmY2NpX3BtdV9tdXRleCk7CisJaWYgKCFjcHVtYXNrX3Rlc3RfYW5kX2NsZWFyX2NwdShjcHUsICZjY2lfcG11LT5jcHVzKSkKKwkJcmV0dXJuIDA7CisJdGFyZ2V0ID0gY3B1bWFza19hbnlfYnV0KGNwdV9vbmxpbmVfbWFzaywgY3B1KTsKKwlpZiAodGFyZ2V0ID49IG5yX2NwdV9pZHMpCisJCXJldHVybiAwOworCS8qCisJICogVE9ETzogbWlncmF0ZSBjb250ZXh0IG9uY2UgY29yZSByYWNlcyBvbiBldmVudC0+Y3R4IGhhdmUKKwkgKiBiZWVuIGZpeGVkLgorCSAqLworCWNwdW1hc2tfc2V0X2NwdSh0YXJnZXQsICZjY2lfcG11LT5jcHVzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTc2OCwxMCArMTc2MSw4IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCW11dGV4X2xvY2soJmNjaV9wbXVfbXV0ZXgpOwotCWxpc3RfYWRkKCZjY2lfcG11LT5lbnRyeSwgJmNjaV9wbXVfbGlzdCk7Ci0JbXV0ZXhfdW5sb2NrKCZjY2lfcG11X211dGV4KTsKLQorCWNwdWhwX3N0YXRlX2FkZF9pbnN0YW5jZV9ub2NhbGxzKENQVUhQX0FQX1BFUkZfQVJNX0NDSV9PTkxJTkUsCisJCQkJCSAmY2NpX3BtdS0+bm9kZSk7CiAJcHJfaW5mbygiQVJNICVzIFBNVSBkcml2ZXIgcHJvYmVkIiwgY2NpX3BtdS0+bW9kZWwtPm5hbWUpOwogCXJldHVybiAwOwogfQpAQCAtMTgwNCw5ICsxNzk1LDkgQEAKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9BUF9QRVJGX0FSTV9DQ0lfT05MSU5FLAotCQkJCQkiQVBfUEVSRl9BUk1fQ0NJX09OTElORSIsIE5VTEwsCi0JCQkJCWNjaV9wbXVfb2ZmbGluZV9jcHUpOworCXJldCA9IGNwdWhwX3NldHVwX3N0YXRlX211bHRpKENQVUhQX0FQX1BFUkZfQVJNX0NDSV9PTkxJTkUsCisJCQkJICAgICAgIkFQX1BFUkZfQVJNX0NDSV9PTkxJTkUiLCBOVUxMLAorCQkJCSAgICAgIGNjaV9wbXVfb2ZmbGluZV9jcHUpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYnVzL2FybS1jY24uYyBiL2RyaXZlcnMvYnVzL2FybS1jY24uYwppbmRleCA5N2E5MTg1Li5kMTA3NGQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2J1cy9hcm0tY2NuLmMKKysrIGIvZHJpdmVycy9idXMvYXJtLWNjbi5jCkBAIC0xNjcsNyArMTY3LDcgQEAKIAlzdHJ1Y3QgaHJ0aW1lciBocnRpbWVyOwogCiAJY3B1bWFza190IGNwdTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJ5OworCXN0cnVjdCBobGlzdF9ub2RlIG5vZGU7CiAKIAlzdHJ1Y3QgcG11IHBtdTsKIH07CkBAIC0xODcsMTEgKzE4Nyw5IEBACiAJc3RydWN0IGFybV9jY25fY29tcG9uZW50ICp4cDsKIAogCXN0cnVjdCBhcm1fY2NuX2R0IGR0OworCWludCBtbl9pZDsKIH07CiAKLXN0YXRpYyBERUZJTkVfTVVURVgoYXJtX2Njbl9tdXRleCk7Ci1zdGF0aWMgTElTVF9IRUFEKGFybV9jY25fbGlzdCk7Ci0KIHN0YXRpYyBpbnQgYXJtX2Njbl9ub2RlX3RvX3hwKGludCBub2RlKQogewogCXJldHVybiBub2RlIC8gQ0NOX05VTV9YUF9QT1JUUzsKQEAgLTIxMiw2ICsyMTAsNyBAQAogI2RlZmluZSBDQ05fQ09ORklHX1RZUEUoX2NvbmZpZykJKCgoX2NvbmZpZykgPj4gOCkgJiAweGZmKQogI2RlZmluZSBDQ05fQ09ORklHX0VWRU5UKF9jb25maWcpCSgoKF9jb25maWcpID4+IDE2KSAmIDB4ZmYpCiAjZGVmaW5lIENDTl9DT05GSUdfUE9SVChfY29uZmlnKQkoKChfY29uZmlnKSA+PiAyNCkgJiAweDMpCisjZGVmaW5lIENDTl9DT05GSUdfQlVTKF9jb25maWcpCQkoKChfY29uZmlnKSA+PiAyNCkgJiAweDMpCiAjZGVmaW5lIENDTl9DT05GSUdfVkMoX2NvbmZpZykJCSgoKF9jb25maWcpID4+IDI2KSAmIDB4NykKICNkZWZpbmUgQ0NOX0NPTkZJR19ESVIoX2NvbmZpZykJCSgoKF9jb25maWcpID4+IDI5KSAmIDB4MSkKICNkZWZpbmUgQ0NOX0NPTkZJR19NQVNLKF9jb25maWcpCSgoKF9jb25maWcpID4+IDMwKSAmIDB4ZikKQEAgLTI0MSw2ICsyNDAsNyBAQAogc3RhdGljIENDTl9GT1JNQVRfQVRUUih0eXBlLCAiY29uZmlnOjgtMTUiKTsKIHN0YXRpYyBDQ05fRk9STUFUX0FUVFIoZXZlbnQsICJjb25maWc6MTYtMjMiKTsKIHN0YXRpYyBDQ05fRk9STUFUX0FUVFIocG9ydCwgImNvbmZpZzoyNC0yNSIpOworc3RhdGljIENDTl9GT1JNQVRfQVRUUihidXMsICJjb25maWc6MjQtMjUiKTsKIHN0YXRpYyBDQ05fRk9STUFUX0FUVFIodmMsICJjb25maWc6MjYtMjgiKTsKIHN0YXRpYyBDQ05fRk9STUFUX0FUVFIoZGlyLCAiY29uZmlnOjI5LTI5Iik7CiBzdGF0aWMgQ0NOX0ZPUk1BVF9BVFRSKG1hc2ssICJjb25maWc6MzAtMzMiKTsKQEAgLTI1Myw2ICsyNTMsNyBAQAogCSZhcm1fY2NuX3BtdV9mb3JtYXRfYXR0cl90eXBlLmF0dHIuYXR0ciwKIAkmYXJtX2Njbl9wbXVfZm9ybWF0X2F0dHJfZXZlbnQuYXR0ci5hdHRyLAogCSZhcm1fY2NuX3BtdV9mb3JtYXRfYXR0cl9wb3J0LmF0dHIuYXR0ciwKKwkmYXJtX2Njbl9wbXVfZm9ybWF0X2F0dHJfYnVzLmF0dHIuYXR0ciwKIAkmYXJtX2Njbl9wbXVfZm9ybWF0X2F0dHJfdmMuYXR0ci5hdHRyLAogCSZhcm1fY2NuX3BtdV9mb3JtYXRfYXR0cl9kaXIuYXR0ci5hdHRyLAogCSZhcm1fY2NuX3BtdV9mb3JtYXRfYXR0cl9tYXNrLmF0dHIuYXR0ciwKQEAgLTMyOCw2ICszMjksNyBAQAogc3RhdGljIHNzaXplX3QgYXJtX2Njbl9wbXVfZXZlbnRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CisJc3RydWN0IGFybV9jY24gKmNjbiA9IHBtdV90b19hcm1fY2NuKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKIAlzdHJ1Y3QgYXJtX2Njbl9wbXVfZXZlbnQgKmV2ZW50ID0gY29udGFpbmVyX29mKGF0dHIsCiAJCQlzdHJ1Y3QgYXJtX2Njbl9wbXVfZXZlbnQsIGF0dHIpOwogCXNzaXplX3QgcmVzOwpAQCAtMzQ5LDEwICszNTEsMTcgQEAKIAkJYnJlYWs7CiAJY2FzZSBDQ05fVFlQRV9YUDoKIAkJcmVzICs9IHNucHJpbnRmKGJ1ZiArIHJlcywgUEFHRV9TSVpFIC0gcmVzLAotCQkJCSIseHA9Pyxwb3J0PT8sdmM9PyxkaXI9PyIpOworCQkJCSIseHA9Pyx2Yz0/Iik7CiAJCWlmIChldmVudC0+ZXZlbnQgPT0gQ0NOX0VWRU5UX1dBVENIUE9JTlQpCiAJCQlyZXMgKz0gc25wcmludGYoYnVmICsgcmVzLCBQQUdFX1NJWkUgLSByZXMsCi0JCQkJCSIsY21wX2w9PyxjbXBfaD0/LG1hc2s9PyIpOworCQkJCQkiLHBvcnQ9PyxkaXI9PyxjbXBfbD0/LGNtcF9oPT8sbWFzaz0/Iik7CisJCWVsc2UKKwkJCXJlcyArPSBzbnByaW50ZihidWYgKyByZXMsIFBBR0VfU0laRSAtIHJlcywKKwkJCQkJIixidXM9PyIpOworCisJCWJyZWFrOworCWNhc2UgQ0NOX1RZUEVfTU46CisJCXJlcyArPSBzbnByaW50ZihidWYgKyByZXMsIFBBR0VfU0laRSAtIHJlcywgIixub2RlPSVkIiwgY2NuLT5tbl9pZCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJlcyArPSBzbnByaW50ZihidWYgKyByZXMsIFBBR0VfU0laRSAtIHJlcywgIixub2RlPT8iKTsKQEAgLTM4Myw5ICszOTIsOSBAQAogfQogCiBzdGF0aWMgc3RydWN0IGFybV9jY25fcG11X2V2ZW50IGFybV9jY25fcG11X2V2ZW50c1tdID0gewotCUNDTl9FVkVOVF9NTihlb2JhcnJpZXIsICJkaXI9MCx2Yz0wLGNtcF9oPTB4MWMwMCIsIENDTl9JRFhfTUFTS19PUENPREUpLAotCUNDTl9FVkVOVF9NTihlY2JhcnJpZXIsICJkaXI9MCx2Yz0wLGNtcF9oPTB4MWUwMCIsIENDTl9JRFhfTUFTS19PUENPREUpLAotCUNDTl9FVkVOVF9NTihkdm1vcCwgImRpcj0wLHZjPTAsY21wX2g9MHgyODAwIiwgQ0NOX0lEWF9NQVNLX09QQ09ERSksCisJQ0NOX0VWRU5UX01OKGVvYmFycmllciwgImRpcj0xLHZjPTAsY21wX2g9MHgxYzAwIiwgQ0NOX0lEWF9NQVNLX09QQ09ERSksCisJQ0NOX0VWRU5UX01OKGVjYmFycmllciwgImRpcj0xLHZjPTAsY21wX2g9MHgxZTAwIiwgQ0NOX0lEWF9NQVNLX09QQ09ERSksCisJQ0NOX0VWRU5UX01OKGR2bW9wLCAiZGlyPTEsdmM9MCxjbXBfaD0weDI4MDAiLCBDQ05fSURYX01BU0tfT1BDT0RFKSwKIAlDQ05fRVZFTlRfSE5JKHR4ZGF0ZmxpdHMsICJkaXI9MSx2Yz0zIiwgQ0NOX0lEWF9NQVNLX0FOWSksCiAJQ0NOX0VWRU5UX0hOSShyeGRhdGZsaXRzLCAiZGlyPTAsdmM9MyIsIENDTl9JRFhfTUFTS19BTlkpLAogCUNDTl9FVkVOVF9ITkkodHhyZXFmbGl0cywgImRpcj0xLHZjPTAiLCBDQ05fSURYX01BU0tfQU5ZKSwKQEAgLTczMyw5ICs3NDIsMTAgQEAKIAogCWlmIChoYXNfYnJhbmNoX3N0YWNrKGV2ZW50KSB8fCBldmVudC0+YXR0ci5leGNsdWRlX3VzZXIgfHwKIAkJCWV2ZW50LT5hdHRyLmV4Y2x1ZGVfa2VybmVsIHx8IGV2ZW50LT5hdHRyLmV4Y2x1ZGVfaHYgfHwKLQkJCWV2ZW50LT5hdHRyLmV4Y2x1ZGVfaWRsZSkgeworCQkJZXZlbnQtPmF0dHIuZXhjbHVkZV9pZGxlIHx8IGV2ZW50LT5hdHRyLmV4Y2x1ZGVfaG9zdCB8fAorCQkJZXZlbnQtPmF0dHIuZXhjbHVkZV9ndWVzdCkgewogCQlkZXZfd2FybihjY24tPmRldiwgIkNhbid0IGV4Y2x1ZGUgZXhlY3V0aW9uIGxldmVscyFcbiIpOwotCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmIChldmVudC0+Y3B1IDwgMCkgewpAQCAtNzU5LDYgKzc2OSwxMiBAQAogCiAJLyogVmFsaWRhdGUgbm9kZS94cCB2cyB0b3BvbG9neSAqLwogCXN3aXRjaCAodHlwZSkgeworCWNhc2UgQ0NOX1RZUEVfTU46CisJCWlmIChub2RlX3hwICE9IGNjbi0+bW5faWQpIHsKKwkJCWRldl93YXJuKGNjbi0+ZGV2LCAiSW52YWxpZCBNTiBJRCAlZCFcbiIsIG5vZGVfeHApOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CiAJY2FzZSBDQ05fVFlQRV9YUDoKIAkJaWYgKG5vZGVfeHAgPj0gY2NuLT5udW1feHBzKSB7CiAJCQlkZXZfd2FybihjY24tPmRldiwgIkludmFsaWQgWFAgSUQgJWQhXG4iLCBub2RlX3hwKTsKQEAgLTg4Niw2ICs5MDIsMTAgQEAKIAlzdHJ1Y3QgYXJtX2Njbl9jb21wb25lbnQgKnhwOwogCXUzMiB2YWwsIGR0X2NmZzsKIAorCS8qIE5vdGhpbmcgdG8gZG8gZm9yIGN5Y2xlIGNvdW50ZXIgKi8KKwlpZiAoaHctPmlkeCA9PSBDQ05fSURYX1BNVV9DWUNMRV9DT1VOVEVSKQorCQlyZXR1cm47CisKIAlpZiAoQ0NOX0NPTkZJR19UWVBFKGV2ZW50LT5hdHRyLmNvbmZpZykgPT0gQ0NOX1RZUEVfWFApCiAJCXhwID0gJmNjbi0+eHBbQ0NOX0NPTkZJR19YUChldmVudC0+YXR0ci5jb25maWcpXTsKIAllbHNlCkBAIC05MTcsMzggKzkzNywxNyBAQAogCQkJYXJtX2Njbl9wbXVfcmVhZF9jb3VudGVyKGNjbiwgaHctPmlkeCkpOwogCWh3LT5zdGF0ZSA9IDA7CiAKLQkvKgotCSAqIFBpbiB0aGUgdGltZXIsIHNvIHRoYXQgdGhlIG92ZXJmbG93cyBhcmUgaGFuZGxlZCBieSB0aGUgY2hvc2VuCi0JICogZXZlbnQtPmNwdSAodGhpcyBpcyB0aGUgc2FtZSBvbmUgYXMgcHJlc2VudGVkIGluICJjcHVtYXNrIgotCSAqIGF0dHJpYnV0ZSkuCi0JICovCi0JaWYgKCFjY24tPmlycSkKLQkJaHJ0aW1lcl9zdGFydCgmY2NuLT5kdC5ocnRpbWVyLCBhcm1fY2NuX3BtdV90aW1lcl9wZXJpb2QoKSwKLQkJCQlIUlRJTUVSX01PREVfUkVMX1BJTk5FRCk7Ci0KIAkvKiBTZXQgdGhlIERUIGJ1cyBpbnB1dCwgZW5nYWdpbmcgdGhlIGNvdW50ZXIgKi8KIAlhcm1fY2NuX3BtdV94cF9kdF9jb25maWcoZXZlbnQsIDEpOwogfQogCiBzdGF0aWMgdm9pZCBhcm1fY2NuX3BtdV9ldmVudF9zdG9wKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGZsYWdzKQogewotCXN0cnVjdCBhcm1fY2NuICpjY24gPSBwbXVfdG9fYXJtX2NjbihldmVudC0+cG11KTsKIAlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHcgPSAmZXZlbnQtPmh3OwotCXU2NCB0aW1lb3V0OwogCiAJLyogRGlzYWJsZSBjb3VudGluZywgc2V0dGluZyB0aGUgRFQgYnVzIHRvIHBhc3MtdGhyb3VnaCBtb2RlICovCiAJYXJtX2Njbl9wbXVfeHBfZHRfY29uZmlnKGV2ZW50LCAwKTsKIAotCWlmICghY2NuLT5pcnEpCi0JCWhydGltZXJfY2FuY2VsKCZjY24tPmR0LmhydGltZXIpOwotCi0JLyogTGV0IHRoZSBEVCBidXMgZHJhaW4gKi8KLQl0aW1lb3V0ID0gYXJtX2Njbl9wbXVfcmVhZF9jb3VudGVyKGNjbiwgQ0NOX0lEWF9QTVVfQ1lDTEVfQ09VTlRFUikgKwotCQkJY2NuLT5udW1feHBzOwotCXdoaWxlIChhcm1fY2NuX3BtdV9yZWFkX2NvdW50ZXIoY2NuLCBDQ05fSURYX1BNVV9DWUNMRV9DT1VOVEVSKSA8Ci0JCQl0aW1lb3V0KQotCQljcHVfcmVsYXgoKTsKLQogCWlmIChmbGFncyAmIFBFUkZfRUZfVVBEQVRFKQogCQlhcm1fY2NuX3BtdV9ldmVudF91cGRhdGUoZXZlbnQpOwogCkBAIC05ODgsNyArOTg3LDcgQEAKIAogCS8qIENvbXBhcmlzb24gdmFsdWVzICovCiAJd3JpdGVsKGNtcF9sICYgMHhmZmZmZmZmZiwgc291cmNlLT5iYXNlICsgQ0NOX1hQX0RUX0NNUF9WQUxfTCh3cCkpOwotCXdyaXRlbCgoY21wX2wgPj4gMzIpICYgMHhlZmZmZmZmZiwKKwl3cml0ZWwoKGNtcF9sID4+IDMyKSAmIDB4N2ZmZmZmZmYsCiAJCQlzb3VyY2UtPmJhc2UgKyBDQ05fWFBfRFRfQ01QX1ZBTF9MKHdwKSArIDQpOwogCXdyaXRlbChjbXBfaCAmIDB4ZmZmZmZmZmYsIHNvdXJjZS0+YmFzZSArIENDTl9YUF9EVF9DTVBfVkFMX0god3ApKTsKIAl3cml0ZWwoKGNtcF9oID4+IDMyKSAmIDB4MGZmZmZmZmYsCkBAIC05OTYsNyArOTk1LDcgQEAKIAogCS8qIE1hc2sgKi8KIAl3cml0ZWwobWFza19sICYgMHhmZmZmZmZmZiwgc291cmNlLT5iYXNlICsgQ0NOX1hQX0RUX0NNUF9NQVNLX0wod3ApKTsKLQl3cml0ZWwoKG1hc2tfbCA+PiAzMikgJiAweGVmZmZmZmZmLAorCXdyaXRlbCgobWFza19sID4+IDMyKSAmIDB4N2ZmZmZmZmYsCiAJCQlzb3VyY2UtPmJhc2UgKyBDQ05fWFBfRFRfQ01QX01BU0tfTCh3cCkgKyA0KTsKIAl3cml0ZWwobWFza19oICYgMHhmZmZmZmZmZiwgc291cmNlLT5iYXNlICsgQ0NOX1hQX0RUX0NNUF9NQVNLX0god3ApKTsKIAl3cml0ZWwoKG1hc2tfaCA+PiAzMikgJiAweDBmZmZmZmZmLApAQCAtMTAxNCw3ICsxMDEzLDcgQEAKIAlody0+ZXZlbnRfYmFzZSA9IENDTl9YUF9EVF9DT05GSUdfX0RUX0NGR19fWFBfUE1VX0VWRU5UKGh3LT5jb25maWdfYmFzZSk7CiAKIAlpZCA9IChDQ05fQ09ORklHX1ZDKGV2ZW50LT5hdHRyLmNvbmZpZykgPDwgNCkgfAotCQkJKENDTl9DT05GSUdfUE9SVChldmVudC0+YXR0ci5jb25maWcpIDw8IDMpIHwKKwkJCShDQ05fQ09ORklHX0JVUyhldmVudC0+YXR0ci5jb25maWcpIDw8IDMpIHwKIAkJCShDQ05fQ09ORklHX0VWRU5UKGV2ZW50LT5hdHRyLmNvbmZpZykgPDwgMCk7CiAKIAl2YWwgPSByZWFkbChzb3VyY2UtPmJhc2UgKyBDQ05fWFBfUE1VX0VWRU5UX1NFTCk7CkBAIC0xMDk5LDE1ICsxMDk4LDMxIEBACiAJc3Bpbl91bmxvY2soJmNjbi0+ZHQuY29uZmlnX2xvY2spOwogfQogCitzdGF0aWMgaW50IGFybV9jY25fcG11X2FjdGl2ZV9jb3VudGVycyhzdHJ1Y3QgYXJtX2NjbiAqY2NuKQoreworCXJldHVybiBiaXRtYXBfd2VpZ2h0KGNjbi0+ZHQucG11X2NvdW50ZXJzX21hc2ssCisJCQkgICAgIENDTl9OVU1fUE1VX0VWRU5UX0NPVU5URVJTICsgMSk7Cit9CisKIHN0YXRpYyBpbnQgYXJtX2Njbl9wbXVfZXZlbnRfYWRkKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGZsYWdzKQogewogCWludCBlcnI7CiAJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3ID0gJmV2ZW50LT5odzsKKwlzdHJ1Y3QgYXJtX2NjbiAqY2NuID0gcG11X3RvX2FybV9jY24oZXZlbnQtPnBtdSk7CiAKIAllcnIgPSBhcm1fY2NuX3BtdV9ldmVudF9hbGxvYyhldmVudCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAorCS8qCisJICogUGluIHRoZSB0aW1lciwgc28gdGhhdCB0aGUgb3ZlcmZsb3dzIGFyZSBoYW5kbGVkIGJ5IHRoZSBjaG9zZW4KKwkgKiBldmVudC0+Y3B1ICh0aGlzIGlzIHRoZSBzYW1lIG9uZSBhcyBwcmVzZW50ZWQgaW4gImNwdW1hc2siCisJICogYXR0cmlidXRlKS4KKwkgKi8KKwlpZiAoIWNjbi0+aXJxICYmIGFybV9jY25fcG11X2FjdGl2ZV9jb3VudGVycyhjY24pID09IDEpCisJCWhydGltZXJfc3RhcnQoJmNjbi0+ZHQuaHJ0aW1lciwgYXJtX2Njbl9wbXVfdGltZXJfcGVyaW9kKCksCisJCQkgICAgICBIUlRJTUVSX01PREVfUkVMX1BJTk5FRCk7CisKIAlhcm1fY2NuX3BtdV9ldmVudF9jb25maWcoZXZlbnQpOwogCiAJaHctPnN0YXRlID0gUEVSRl9IRVNfU1RPUFBFRDsKQEAgLTExMjAsOSArMTEzNSwxNCBAQAogCiBzdGF0aWMgdm9pZCBhcm1fY2NuX3BtdV9ldmVudF9kZWwoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgZmxhZ3MpCiB7CisJc3RydWN0IGFybV9jY24gKmNjbiA9IHBtdV90b19hcm1fY2NuKGV2ZW50LT5wbXUpOworCiAJYXJtX2Njbl9wbXVfZXZlbnRfc3RvcChldmVudCwgUEVSRl9FRl9VUERBVEUpOwogCiAJYXJtX2Njbl9wbXVfZXZlbnRfcmVsZWFzZShldmVudCk7CisKKwlpZiAoIWNjbi0+aXJxICYmIGFybV9jY25fcG11X2FjdGl2ZV9jb3VudGVycyhjY24pID09IDApCisJCWhydGltZXJfY2FuY2VsKCZjY24tPmR0LmhydGltZXIpOwogfQogCiBzdGF0aWMgdm9pZCBhcm1fY2NuX3BtdV9ldmVudF9yZWFkKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKQEAgLTExMzAsNiArMTE1MCwyNCBAQAogCWFybV9jY25fcG11X2V2ZW50X3VwZGF0ZShldmVudCk7CiB9CiAKK3N0YXRpYyB2b2lkIGFybV9jY25fcG11X2VuYWJsZShzdHJ1Y3QgcG11ICpwbXUpCit7CisJc3RydWN0IGFybV9jY24gKmNjbiA9IHBtdV90b19hcm1fY2NuKHBtdSk7CisKKwl1MzIgdmFsID0gcmVhZGwoY2NuLT5kdC5iYXNlICsgQ0NOX0RUX1BNQ1IpOworCXZhbCB8PSBDQ05fRFRfUE1DUl9fUE1VX0VOOworCXdyaXRlbCh2YWwsIGNjbi0+ZHQuYmFzZSArIENDTl9EVF9QTUNSKTsKK30KKworc3RhdGljIHZvaWQgYXJtX2Njbl9wbXVfZGlzYWJsZShzdHJ1Y3QgcG11ICpwbXUpCit7CisJc3RydWN0IGFybV9jY24gKmNjbiA9IHBtdV90b19hcm1fY2NuKHBtdSk7CisKKwl1MzIgdmFsID0gcmVhZGwoY2NuLT5kdC5iYXNlICsgQ0NOX0RUX1BNQ1IpOworCXZhbCAmPSB+Q0NOX0RUX1BNQ1JfX1BNVV9FTjsKKwl3cml0ZWwodmFsLCBjY24tPmR0LmJhc2UgKyBDQ05fRFRfUE1DUik7Cit9CisKIHN0YXRpYyBpcnFyZXR1cm5fdCBhcm1fY2NuX3BtdV9vdmVyZmxvd19oYW5kbGVyKHN0cnVjdCBhcm1fY2NuX2R0ICpkdCkKIHsKIAl1MzIgcG1vdnNyID0gcmVhZGwoZHQtPmJhc2UgKyBDQ05fRFRfUE1PVlNSKTsKQEAgLTExNzMsMzAgKzEyMTEsMjQgQEAKIH0KIAogCi1zdGF0aWMgaW50IGFybV9jY25fcG11X29mZmxpbmVfY3B1KHVuc2lnbmVkIGludCBjcHUpCitzdGF0aWMgaW50IGFybV9jY25fcG11X29mZmxpbmVfY3B1KHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKQogewotCXN0cnVjdCBhcm1fY2NuX2R0ICpkdDsKKwlzdHJ1Y3QgYXJtX2Njbl9kdCAqZHQgPSBobGlzdF9lbnRyeV9zYWZlKG5vZGUsIHN0cnVjdCBhcm1fY2NuX2R0LCBub2RlKTsKKwlzdHJ1Y3QgYXJtX2NjbiAqY2NuID0gY29udGFpbmVyX29mKGR0LCBzdHJ1Y3QgYXJtX2NjbiwgZHQpOwogCXVuc2lnbmVkIGludCB0YXJnZXQ7CiAKLQltdXRleF9sb2NrKCZhcm1fY2NuX211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGR0LCAmYXJtX2Njbl9saXN0LCBlbnRyeSkgewotCQlzdHJ1Y3QgYXJtX2NjbiAqY2NuID0gY29udGFpbmVyX29mKGR0LCBzdHJ1Y3QgYXJtX2NjbiwgZHQpOwotCi0JCWlmICghY3B1bWFza190ZXN0X2FuZF9jbGVhcl9jcHUoY3B1LCAmZHQtPmNwdSkpCi0JCQljb250aW51ZTsKLQkJdGFyZ2V0ID0gY3B1bWFza19hbnlfYnV0KGNwdV9vbmxpbmVfbWFzaywgY3B1KTsKLQkJaWYgKHRhcmdldCA+PSBucl9jcHVfaWRzKQotCQkJY29udGludWU7Ci0JCXBlcmZfcG11X21pZ3JhdGVfY29udGV4dCgmZHQtPnBtdSwgY3B1LCB0YXJnZXQpOwotCQljcHVtYXNrX3NldF9jcHUodGFyZ2V0LCAmZHQtPmNwdSk7Ci0JCWlmIChjY24tPmlycSkKLQkJCVdBUk5fT04oaXJxX3NldF9hZmZpbml0eV9oaW50KGNjbi0+aXJxLCAmZHQtPmNwdSkgIT0gMCk7Ci0JfQotCW11dGV4X3VubG9jaygmYXJtX2Njbl9tdXRleCk7CisJaWYgKCFjcHVtYXNrX3Rlc3RfYW5kX2NsZWFyX2NwdShjcHUsICZkdC0+Y3B1KSkKKwkJcmV0dXJuIDA7CisJdGFyZ2V0ID0gY3B1bWFza19hbnlfYnV0KGNwdV9vbmxpbmVfbWFzaywgY3B1KTsKKwlpZiAodGFyZ2V0ID49IG5yX2NwdV9pZHMpCisJCXJldHVybiAwOworCXBlcmZfcG11X21pZ3JhdGVfY29udGV4dCgmZHQtPnBtdSwgY3B1LCB0YXJnZXQpOworCWNwdW1hc2tfc2V0X2NwdSh0YXJnZXQsICZkdC0+Y3B1KTsKKwlpZiAoY2NuLT5pcnEpCisJCVdBUk5fT04oaXJxX3NldF9hZmZpbml0eV9oaW50KGNjbi0+aXJxLCAmZHQtPmNwdSkgIT0gMCk7CiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIERFRklORV9JREEoYXJtX2Njbl9wbXVfaWRhKTsKIAogc3RhdGljIGludCBhcm1fY2NuX3BtdV9pbml0KHN0cnVjdCBhcm1fY2NuICpjY24pCkBAIC0xMjUyLDYgKzEyODQsOCBAQAogCQkuc3RhcnQgPSBhcm1fY2NuX3BtdV9ldmVudF9zdGFydCwKIAkJLnN0b3AgPSBhcm1fY2NuX3BtdV9ldmVudF9zdG9wLAogCQkucmVhZCA9IGFybV9jY25fcG11X2V2ZW50X3JlYWQsCisJCS5wbXVfZW5hYmxlID0gYXJtX2Njbl9wbXVfZW5hYmxlLAorCQkucG11X2Rpc2FibGUgPSBhcm1fY2NuX3BtdV9kaXNhYmxlLAogCX07CiAKIAkvKiBObyBvdmVyZmxvdyBpbnRlcnJ1cHQ/IEhhdmUgdG8gdXNlIGEgdGltZXIgaW5zdGVhZC4gKi8KQEAgLTEyNzgsOSArMTMxMiw4IEBACiAJaWYgKGVycikKIAkJZ290byBlcnJvcl9wbXVfcmVnaXN0ZXI7CiAKLQltdXRleF9sb2NrKCZhcm1fY2NuX211dGV4KTsKLQlsaXN0X2FkZCgmY2NuLT5kdC5lbnRyeSwgJmFybV9jY25fbGlzdCk7Ci0JbXV0ZXhfdW5sb2NrKCZhcm1fY2NuX211dGV4KTsKKwljcHVocF9zdGF0ZV9hZGRfaW5zdGFuY2Vfbm9jYWxscyhDUFVIUF9BUF9QRVJGX0FSTV9DQ05fT05MSU5FLAorCQkJCQkgJmNjbi0+ZHQubm9kZSk7CiAJcmV0dXJuIDA7CiAKIGVycm9yX3BtdV9yZWdpc3RlcjoKQEAgLTEyOTYsMTAgKzEzMjksOCBAQAogewogCWludCBpOwogCi0JbXV0ZXhfbG9jaygmYXJtX2Njbl9tdXRleCk7Ci0JbGlzdF9kZWwoJmNjbi0+ZHQuZW50cnkpOwotCW11dGV4X3VubG9jaygmYXJtX2Njbl9tdXRleCk7Ci0KKwljcHVocF9zdGF0ZV9yZW1vdmVfaW5zdGFuY2Vfbm9jYWxscyhDUFVIUF9BUF9QRVJGX0FSTV9DQ05fT05MSU5FLAorCQkJCQkgICAgJmNjbi0+ZHQubm9kZSk7CiAJaWYgKGNjbi0+aXJxKQogCQlpcnFfc2V0X2FmZmluaXR5X2hpbnQoY2NuLT5pcnEsIE5VTEwpOwogCWZvciAoaSA9IDA7IGkgPCBjY24tPm51bV94cHM7IGkrKykKQEAgLTEzNjEsNiArMTM5Miw4IEBACiAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIENDTl9UWVBFX01OOgorCQljY24tPm1uX2lkID0gaWQ7CisJCXJldHVybiAwOwogCWNhc2UgQ0NOX1RZUEVfRFQ6CiAJCXJldHVybiAwOwogCWNhc2UgQ0NOX1RZUEVfWFA6CkBAIC0xNDcxLDggKzE1MDQsOSBAQAogCQkvKiBDYW4gc2V0ICdkaXNhYmxlJyBiaXRzLCBzbyBjYW4gYWNrbm93bGVkZ2UgaW50ZXJydXB0cyAqLwogCQl3cml0ZWwoQ0NOX01OX0VSUklOVF9TVEFUVVNfX1BNVV9FVkVOVFNfX0VOQUJMRSwKIAkJCQljY24tPmJhc2UgKyBDQ05fTU5fRVJSSU5UX1NUQVRVUyk7Ci0JCWVyciA9IGRldm1fcmVxdWVzdF9pcnEoY2NuLT5kZXYsIGlycSwgYXJtX2Njbl9pcnFfaGFuZGxlciwgMCwKLQkJCQlkZXZfbmFtZShjY24tPmRldiksIGNjbik7CisJCWVyciA9IGRldm1fcmVxdWVzdF9pcnEoY2NuLT5kZXYsIGlycSwgYXJtX2Njbl9pcnFfaGFuZGxlciwKKwkJCQkgICAgICAgSVJRRl9OT0JBTEFOQ0lORyB8IElSUUZfTk9fVEhSRUFELAorCQkJCSAgICAgICBkZXZfbmFtZShjY24tPmRldiksIGNjbik7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwogCkBAIC0xNTI3LDkgKzE1NjEsOSBAQAogewogCWludCBpLCByZXQ7CiAKLQlyZXQgPSBjcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX0FQX1BFUkZfQVJNX0NDTl9PTkxJTkUsCi0JCQkJCSJBUF9QRVJGX0FSTV9DQ05fT05MSU5FIiwgTlVMTCwKLQkJCQkJYXJtX2Njbl9wbXVfb2ZmbGluZV9jcHUpOworCXJldCA9IGNwdWhwX3NldHVwX3N0YXRlX211bHRpKENQVUhQX0FQX1BFUkZfQVJNX0NDTl9PTkxJTkUsCisJCQkJICAgICAgIkFQX1BFUkZfQVJNX0NDTl9PTkxJTkUiLCBOVUxMLAorCQkJCSAgICAgIGFybV9jY25fcG11X29mZmxpbmVfY3B1KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC0xNTQxLDcgKzE1NzUsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYXJtX2Njbl9leGl0KHZvaWQpCiB7Ci0JY3B1aHBfcmVtb3ZlX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVBfUEVSRl9BUk1fQ0NOX09OTElORSk7CisJY3B1aHBfcmVtb3ZlX211bHRpX3N0YXRlKENQVUhQX0FQX1BFUkZfQVJNX0NDTl9PTkxJTkUpOwogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhcm1fY2NuX2RyaXZlcik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYnVzL21pcHNfY2RtbS5jIGIvZHJpdmVycy9idXMvbWlwc19jZG1tLmMKaW5kZXggY2FkNDliYy4uMWIxNDI1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9idXMvbWlwc19jZG1tLmMKKysrIGIvZHJpdmVycy9idXMvbWlwc19jZG1tLmMKQEAgLTU5NiwxOSArNTk2LDIwIEBACiBCVUlMRF9QRVJERVZfSEVMUEVSKGNwdV91cCkgICAgICAgICAvKiBpbnQgbWlwc19jZG1tX2NwdV91cF9oZWxwZXIoLi4uKSAqLwogCiAvKioKLSAqIG1pcHNfY2RtbV9idXNfZG93bigpIC0gVGVhciBkb3duIHRoZSBDRE1NIGJ1cy4KLSAqIEBkYXRhOglQb2ludGVyIHRvIHVuc2lnbmVkIGludCBDUFUgbnVtYmVyLgorICogbWlwc19jZG1tX2NwdV9kb3duX3ByZXAoKSAtIENhbGxiYWNrIGZvciBDUFVIUCBET1dOX1BSRVA6CisgKgkJCSAgICAgICBUZWFyIGRvd24gdGhlIENETU0gYnVzLgorICogQGNwdToJdW5zaWduZWQgaW50IENQVSBudW1iZXIuCiAgKgogICogVGhpcyBmdW5jdGlvbiBpcyBleGVjdXRlZCBvbiB0aGUgaG90cGx1Z2dlZCBDUFUgYW5kIGNhbGxzIHRoZSBDRE1NCiAgKiBkcml2ZXIgY3B1X2Rvd24gY2FsbGJhY2sgZm9yIGFsbCBkZXZpY2VzIG9uIHRoYXQgQ1BVLgogICovCi1zdGF0aWMgbG9uZyBtaXBzX2NkbW1fYnVzX2Rvd24odm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgbWlwc19jZG1tX2NwdV9kb3duX3ByZXAodW5zaWduZWQgaW50IGNwdSkKIHsKIAlzdHJ1Y3QgbWlwc19jZG1tX2J1cyAqYnVzOwogCWxvbmcgcmV0OwogCiAJLyogSW5mb3JtIGFsbCB0aGUgZGV2aWNlcyBvbiB0aGUgYnVzICovCi0JcmV0ID0gYnVzX2Zvcl9lYWNoX2RldigmbWlwc19jZG1tX2J1c3R5cGUsIE5VTEwsIGRhdGEsCisJcmV0ID0gYnVzX2Zvcl9lYWNoX2RldigmbWlwc19jZG1tX2J1c3R5cGUsIE5VTEwsICZjcHUsCiAJCQkgICAgICAgbWlwc19jZG1tX2NwdV9kb3duX2hlbHBlcik7CiAKIAkvKgpAQCAtNjIzLDggKzYyNCw4IEBACiB9CiAKIC8qKgotICogbWlwc19jZG1tX2J1c191cCgpIC0gQnJpbmcgdXAgdGhlIENETU0gYnVzLgotICogQGRhdGE6CVBvaW50ZXIgdG8gdW5zaWduZWQgaW50IENQVSBudW1iZXIuCisgKiBtaXBzX2NkbW1fY3B1X29ubGluZSgpIC0gQ2FsbGJhY2sgZm9yIENQVUhQIE9OTElORTogQnJpbmcgdXAgdGhlIENETU0gYnVzLgorICogQGNwdToJdW5zaWduZWQgaW50IENQVSBudW1iZXIuCiAgKgogICogVGhpcyB3b3JrX29uX2NwdSBjYWxsYmFjayBmdW5jdGlvbiBpcyBleGVjdXRlZCBvbiBhIGdpdmVuIENQVSB0byBkaXNjb3ZlcgogICogQ0RNTSBkZXZpY2VzIG9uIHRoYXQgQ1BVLCBvciB0byBjYWxsIHRoZSBDRE1NIGRyaXZlciBjcHVfdXAgY2FsbGJhY2sgZm9yIGFsbApAQCAtNjM0LDcgKzYzNSw3IEBACiAgKiBpbml0aWFsaXNhdGlvbi4gV2hlbiBDUFVzIGFyZSBicm91Z2h0IG9ubGluZSB0aGUgZnVuY3Rpb24gaXMKICAqIGludm9rZWQgZGlyZWN0bHkgb24gdGhlIGhvdHBsdWdnZWQgQ1BVLgogICovCi1zdGF0aWMgbG9uZyBtaXBzX2NkbW1fYnVzX3VwKHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IG1pcHNfY2RtbV9jcHVfb25saW5lKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJc3RydWN0IG1pcHNfY2RtbV9idXMgKmJ1czsKIAlsb25nIHJldDsKQEAgLTY1MSw1MSArNjUyLDEzIEBACiAJCW1pcHNfY2RtbV9idXNfZGlzY292ZXIoYnVzKTsKIAllbHNlCiAJCS8qIEluZm9ybSBhbGwgdGhlIGRldmljZXMgb24gdGhlIGJ1cyAqLwotCQlyZXQgPSBidXNfZm9yX2VhY2hfZGV2KCZtaXBzX2NkbW1fYnVzdHlwZSwgTlVMTCwgZGF0YSwKKwkJcmV0ID0gYnVzX2Zvcl9lYWNoX2RldigmbWlwc19jZG1tX2J1c3R5cGUsIE5VTEwsICZjcHUsCiAJCQkJICAgICAgIG1pcHNfY2RtbV9jcHVfdXBfaGVscGVyKTsKIAogCXJldHVybiByZXQ7CiB9CiAKIC8qKgotICogbWlwc19jZG1tX2NwdV9ub3RpZnkoKSAtIFRha2UgYWN0aW9uIHdoZW4gYSBDUFUgaXMgZ29pbmcgb25saW5lIG9yIG9mZmxpbmUuCi0gKiBAbmI6CQlDUFUgbm90aWZpZXIgYmxvY2sgLgotICogQGFjdGlvbjoJRXZlbnQgdGhhdCBoYXMgdGFrZW4gcGxhY2UgKENQVV8qKS4KLSAqIEBkYXRhOglDUFUgbnVtYmVyLgotICoKLSAqIFRoaXMgbm90aWZpZXIgaXMgdXNlZCB0byBrZWVwIHRoZSBDRE1NIGJ1c2VzIHVwZGF0ZWQgYXMgQ1BVcyBhcmUgb2ZmbGluZWQgYW5kCi0gKiBvbmxpbmVkLiBXaGVuIENQVXMgZ28gb2ZmbGluZSBvciBjb21lIGJhY2sgb25saW5lLCBzbyBkb2VzIHRoZWlyIENETU0gYnVzLCBzbwotICogZGV2aWNlcyBtdXN0IGJlIGluZm9ybWVkLiBBbHNvIHdoZW4gQ1BVcyBjb21lIG9ubGluZSBmb3IgdGhlIGZpcnN0IHRpbWUgdGhlCi0gKiBkZXZpY2VzIG9uIHRoZSBDRE1NIGJ1cyBuZWVkIGRpc2NvdmVyaW5nLgotICoKLSAqIFJldHVybnM6CU5PVElGWV9PSyBpZiBldmVudCB3YXMgdXNlZC4KLSAqCQlOT1RJRllfRE9ORSBpZiB3ZSBkaWRuJ3QgY2FyZS4KLSAqLwotc3RhdGljIGludCBtaXBzX2NkbW1fY3B1X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAotCQkJCXVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpkYXRhKQotewotCXVuc2lnbmVkIGludCBjcHUgPSAodW5zaWduZWQgaW50KWRhdGE7Ci0KLQlzd2l0Y2ggKGFjdGlvbiAmIH5DUFVfVEFTS1NfRlJPWkVOKSB7Ci0JY2FzZSBDUFVfT05MSU5FOgotCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgotCQltaXBzX2NkbW1fYnVzX3VwKCZjcHUpOwotCQlicmVhazsKLQljYXNlIENQVV9ET1dOX1BSRVBBUkU6Ci0JCW1pcHNfY2RtbV9idXNfZG93bigmY3B1KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIE5PVElGWV9ET05FOwotCX0KLQotCXJldHVybiBOT1RJRllfT0s7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbWlwc19jZG1tX2NwdV9uYiA9IHsKLQkubm90aWZpZXJfY2FsbCA9IG1pcHNfY2RtbV9jcHVfbm90aWZ5LAotfTsKLQotLyoqCiAgKiBtaXBzX2NkbW1faW5pdCgpIC0gSW5pdGlhbGlzZSBDRE1NIGJ1cy4KICAqCiAgKiBJbml0aWFsaXNlIENETU0gYnVzLCBkaXNjb3ZlciBDRE1NIGRldmljZXMgZm9yIG9ubGluZSBDUFVzLCBhbmQgYXJyYW5nZSBmb3IKQEAgLTcwMyw3ICs2NjYsNiBAQAogICovCiBzdGF0aWMgaW50IF9faW5pdCBtaXBzX2NkbW1faW5pdCh2b2lkKQogewotCXVuc2lnbmVkIGludCBjcHU7CiAJaW50IHJldDsKIAogCS8qIFJlZ2lzdGVyIHRoZSBidXMgKi8KQEAgLTcxMiwxOSArNjc0LDExIEBACiAJCXJldHVybiByZXQ7CiAKIAkvKiBXZSB3YW50IHRvIGJlIG5vdGlmaWVkIGFib3V0IG5ldyBDUFVzICovCi0JcmV0ID0gcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZtaXBzX2NkbW1fY3B1X25iKTsKLQlpZiAocmV0KSB7CisJcmV0ID0gY3B1aHBfc2V0dXBfc3RhdGUoQ1BVSFBfQVBfT05MSU5FX0RZTiwgImJ1cy9jZG1tOm9ubGluZSIsCisJCQkJbWlwc19jZG1tX2NwdV9vbmxpbmUsIG1pcHNfY2RtbV9jcHVfZG93bl9wcmVwKTsKKwlpZiAocmV0IDwgMCkKIAkJcHJfd2FybigiY2RtbTogRmFpbGVkIHRvIHJlZ2lzdGVyIENQVSBub3RpZmllclxuIik7Ci0JCWdvdG8gb3V0OwotCX0KIAotCS8qIERpc2NvdmVyIGRldmljZXMgb24gQ0RNTSBvZiBvbmxpbmUgQ1BVcyAqLwotCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQotCQl3b3JrX29uX2NwdShjcHUsIG1pcHNfY2RtbV9idXNfdXAsICZjcHUpOwotCi0JcmV0dXJuIDA7Ci1vdXQ6Ci0JYnVzX3VucmVnaXN0ZXIoJm1pcHNfY2RtbV9idXN0eXBlKTsKIAlyZXR1cm4gcmV0OwogfQogc3Vic3lzX2luaXRjYWxsKG1pcHNfY2RtbV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYnVzL3ZleHByZXNzLWNvbmZpZy5jIGIvZHJpdmVycy9idXMvdmV4cHJlc3MtY29uZmlnLmMKaW5kZXggYzNjYjc2Yi4uOWVmZGYxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9idXMvdmV4cHJlc3MtY29uZmlnLmMKKysrIGIvZHJpdmVycy9idXMvdmV4cHJlc3MtY29uZmlnLmMKQEAgLTE3OCw2ICsxNzgsNyBAQAogCiAJcGFyZW50ID0gY2xhc3NfZmluZF9kZXZpY2UodmV4cHJlc3NfY29uZmlnX2NsYXNzLCBOVUxMLCBicmlkZ2UsCiAJCQl2ZXhwcmVzc19jb25maWdfbm9kZV9tYXRjaCk7CisJb2Zfbm9kZV9wdXQoYnJpZGdlKTsKIAlpZiAoV0FSTl9PTighcGFyZW50KSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9iZmluLW90cC5jIGIvZHJpdmVycy9jaGFyL2JmaW4tb3RwLmMKaW5kZXggNDQ2NjBmMS4uMzVkNDZkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2JmaW4tb3RwLmMKKysrIGIvZHJpdmVycy9jaGFyL2JmaW4tb3RwLmMKQEAgLTIzMCw0NSArMjMwLDcgQEAKIAkubmFtZSAgICAgPSBEUklWRVJfTkFNRSwKIAkuZm9wcyAgICAgPSAmYmZpbl9vdHBfZm9wcywKIH07Ci0KLS8qKgotICoJYmZpbl9vdHBfaW5pdCAtIEluaXRpYWxpemUgbW9kdWxlCi0gKgotICoJUmVnaXN0ZXJzIHRoZSBkZXZpY2UgYW5kIG5vdGlmaWVyIGhhbmRsZXIuIEFjdHVhbCBkZXZpY2UKLSAqCWluaXRpYWxpemF0aW9uIGlzIGhhbmRsZWQgYnkgYmZpbl9vdHBfb3BlbigpLgotICovCi1zdGF0aWMgaW50IF9faW5pdCBiZmluX290cF9pbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQotCXN0YW1waXQoKTsKLQotCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmJmaW5fb3RwX21pc2NfZGV2aWNlKTsKLQlpZiAocmV0KSB7Ci0JCXByX2luaXQoS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gcmVnaXN0ZXIgYSBtaXNjIGRldmljZVxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHJfaW5pdChLRVJOX0lORk8gUEZYICJpbml0aWFsaXplZFxuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKgliZmluX290cF9leGl0IC0gRGVpbml0aWFsaXplIG1vZHVsZQotICoKLSAqCVVucmVnaXN0ZXJzIHRoZSBkZXZpY2UgYW5kIG5vdGlmaWVyIGhhbmRsZXIuIEFjdHVhbCBkZXZpY2UKLSAqCWRlaW5pdGlhbGl6YXRpb24gaXMgaGFuZGxlZCBieSBiZmluX290cF9jbG9zZSgpLgotICovCi1zdGF0aWMgdm9pZCBfX2V4aXQgYmZpbl9vdHBfZXhpdCh2b2lkKQotewotCXN0YW1waXQoKTsKLQotCW1pc2NfZGVyZWdpc3RlcigmYmZpbl9vdHBfbWlzY19kZXZpY2UpOwotfQotCi1tb2R1bGVfaW5pdChiZmluX290cF9pbml0KTsKLW1vZHVsZV9leGl0KGJmaW5fb3RwX2V4aXQpOworbW9kdWxlX21pc2NfZGV2aWNlKGJmaW5fb3RwX21pc2NfZGV2aWNlKTsKIAogTU9EVUxFX0FVVEhPUigiTWlrZSBGcnlzaW5nZXIgPHZhcGllckBnZW50b28ub3JnPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJCbGFja2ZpbiBPVFAgTWVtb3J5IEludGVyZmFjZSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9LY29uZmlnIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9LY29uZmlnCmluZGV4IDU2YWQ1YTUuLjhjMDc3MGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vS2NvbmZpZworKysgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL0tjb25maWcKQEAgLTI0NCw3ICsyNDQsNyBAQAogCiBjb25maWcgSFdfUkFORE9NX01YQ19STkdBCiAJdHJpc3RhdGUgIkZyZWVzY2FsZSBpLk1YIFJOR0EgUmFuZG9tIE51bWJlciBHZW5lcmF0b3IiCi0JZGVwZW5kcyBvbiBBUkNIX0hBU19STkdBCisJZGVwZW5kcyBvbiBTT0NfSU1YMzEKIAlkZWZhdWx0IEhXX1JBTkRPTQogCS0tLWhlbHAtLS0KIAkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGtlcm5lbC1zaWRlIHN1cHBvcnQgZm9yIHRoZSBSYW5kb20gTnVtYmVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbWVtLmMgYi9kcml2ZXJzL2NoYXIvbWVtLmMKaW5kZXggYTMzMTYzZC4uNWJiMTk4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL21lbS5jCisrKyBiL2RyaXZlcnMvY2hhci9tZW0uYwpAQCAtMzgxLDYgKzM4MSw5IEBACiAJY2hhciAqa2J1ZjsgLyogay1hZGRyIGJlY2F1c2UgdnJlYWQoKSB0YWtlcyB2bWxpc3RfbG9jayByd2xvY2sgKi8KIAlpbnQgZXJyID0gMDsKIAorCWlmICghcGZuX3ZhbGlkKFBGTl9ET1dOKHApKSkKKwkJcmV0dXJuIC1FSU87CisKIAlyZWFkID0gMDsKIAlpZiAocCA8ICh1bnNpZ25lZCBsb25nKSBoaWdoX21lbW9yeSkgewogCQlsb3dfY291bnQgPSBjb3VudDsKQEAgLTUwOSw2ICs1MTIsOSBAQAogCWNoYXIgKmtidWY7IC8qIGstYWRkciBiZWNhdXNlIHZ3cml0ZSgpIHRha2VzIHZtbGlzdF9sb2NrIHJ3bG9jayAqLwogCWludCBlcnIgPSAwOwogCisJaWYgKCFwZm5fdmFsaWQoUEZOX0RPV04ocCkpKQorCQlyZXR1cm4gLUVJTzsKKwogCWlmIChwIDwgKHVuc2lnbmVkIGxvbmcpIGhpZ2hfbWVtb3J5KSB7CiAJCXVuc2lnbmVkIGxvbmcgdG9fd3JpdGUgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBjb3VudCwKIAkJCQkJICAgICAgICh1bnNpZ25lZCBsb25nKWhpZ2hfbWVtb3J5IC0gcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvMzc4MGkuYyBiL2RyaXZlcnMvY2hhci9td2F2ZS8zNzgwaS5jCmluZGV4IDI4NzQwMDQuLjk3MmM0MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9td2F2ZS8zNzgwaS5jCisrKyBiL2RyaXZlcnMvY2hhci9td2F2ZS8zNzgwaS5jCkBAIC0xMjQsNyArMTI0LDcgQEAKIAkJTUtCWVRFKHJTbGF2ZUNvbnRyb2wpKTsKIAogCXJTbGF2ZUNvbnRyb2xfU2F2ZSA9IHJTbGF2ZUNvbnRyb2w7Ci0JclNsYXZlQ29udHJvbC5Db25maWdNb2RlID0gVFJVRTsKKwlyU2xhdmVDb250cm9sLkNvbmZpZ01vZGUgPSB0cnVlOwogCiAJUFJJTlRLXzIoVFJBQ0VfMzc4MEksCiAJCSIzNzgwaTo6ZHNwMzc4MGlfV3JpdGVHZW5DZmcgZW50cnkgclNsYXZlQ29udHJvbCtDb25maWdNb2RlICV4XG4iLApAQCAtMTU1LDcgKzE1NSw3IEBACiAKIAlNS0JZVEUoclNsYXZlQ29udHJvbCkgPSBJbkJ5dGVEc3AoRFNQX0lzYVNsYXZlQ29udHJvbCk7CiAJclNsYXZlQ29udHJvbF9TYXZlID0gclNsYXZlQ29udHJvbDsKLQlyU2xhdmVDb250cm9sLkNvbmZpZ01vZGUgPSBUUlVFOworCXJTbGF2ZUNvbnRyb2wuQ29uZmlnTW9kZSA9IHRydWU7CiAJT3V0Qnl0ZURzcChEU1BfSXNhU2xhdmVDb250cm9sLCBNS0JZVEUoclNsYXZlQ29udHJvbCkpOwogCU91dEJ5dGVEc3AoRFNQX0NvbmZpZ0FkZHJlc3MsICh1bnNpZ25lZCBjaGFyKSB1SW5kZXgpOwogCXVjVmFsdWUgPSBJbkJ5dGVEc3AoRFNQX0NvbmZpZ0RhdGEpOwpAQCAtMjMwLDcgKzIzMCw3IEBACiAJCQlyVWFydENmZzEuQmFzZUlPID0gMzsKIAkJCWJyZWFrOwogCQl9Ci0JCXJVYXJ0Q2ZnMi5FbmFibGUgPSBUUlVFOworCQlyVWFydENmZzIuRW5hYmxlID0gdHJ1ZTsKIAl9CiAKIAlySEJyaWRnZUNmZzEuUmVzZXJ2ZWQgPSBySEJyaWRnZUNmZzIuUmVzZXJ2ZWQgPSAwOwpAQCAtMjM4LDcgKzIzOCw3IEBACiAJckhCcmlkZ2VDZmcxLklycVB1bHNlID0gcFNldHRpbmdzLT5iRHNwSXJxUHVsc2U7CiAJckhCcmlkZ2VDZmcxLklycSA9ICh1bnNpZ25lZCBjaGFyKSBwSXJxTWFwW3BTZXR0aW5ncy0+dXNEc3BJcnFdOwogCXJIQnJpZGdlQ2ZnMS5BY2Nlc3NNb2RlID0gMTsKLQlySEJyaWRnZUNmZzIuRW5hYmxlID0gVFJVRTsKKwlySEJyaWRnZUNmZzIuRW5hYmxlID0gdHJ1ZTsKIAogCiAJckJ1c21hc3RlckNmZzIuUmVzZXJ2ZWQgPSAwOwpAQCAtMjc4LDggKzI3OCw4IEBACiAJKiBzb2Z0LXJlc2V0IGFjdGl2ZSBmb3IgMTBtcy4KIAkqLwogCXJTbGF2ZUNvbnRyb2wuQ2xvY2tDb250cm9sID0gMDsKLQlyU2xhdmVDb250cm9sLlNvZnRSZXNldCA9IFRSVUU7Ci0JclNsYXZlQ29udHJvbC5Db25maWdNb2RlID0gRkFMU0U7CisJclNsYXZlQ29udHJvbC5Tb2Z0UmVzZXQgPSB0cnVlOworCXJTbGF2ZUNvbnRyb2wuQ29uZmlnTW9kZSA9IGZhbHNlOwogCXJTbGF2ZUNvbnRyb2wuUmVzZXJ2ZWQgPSAwOwogCiAJUFJJTlRLXzQoVFJBQ0VfMzc4MEksCkBAIC0zMDIsNyArMzAyLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgMTE7IGkrKykKIAkJdWRlbGF5KDIwMDApOwogCi0JclNsYXZlQ29udHJvbC5Tb2Z0UmVzZXQgPSBGQUxTRTsKKwlyU2xhdmVDb250cm9sLlNvZnRSZXNldCA9IGZhbHNlOwogCU91dFdvcmREc3AoRFNQX0lzYVNsYXZlQ29udHJvbCwgTUtXT1JEKHJTbGF2ZUNvbnRyb2wpKTsKIAogCU1LV09SRCh0dmFsKSA9IEluV29yZERzcChEU1BfSXNhU2xhdmVDb250cm9sKTsKQEAgLTMyNiwxMCArMzI2LDEwIEBACiAJfQogCiAKLQlySEJyaWRnZUNvbnRyb2wuRW5hYmxlRHNwSW50ID0gRkFMU0U7Ci0JckhCcmlkZ2VDb250cm9sLk1lbUF1dG9JbmMgPSBUUlVFOwotCXJIQnJpZGdlQ29udHJvbC5Jb0F1dG9JbmMgPSBGQUxTRTsKLQlySEJyaWRnZUNvbnRyb2wuRGlhZ25vc3RpY01vZGUgPSBGQUxTRTsKKwlySEJyaWRnZUNvbnRyb2wuRW5hYmxlRHNwSW50ID0gZmFsc2U7CisJckhCcmlkZ2VDb250cm9sLk1lbUF1dG9JbmMgPSB0cnVlOworCXJIQnJpZGdlQ29udHJvbC5Jb0F1dG9JbmMgPSBmYWxzZTsKKwlySEJyaWRnZUNvbnRyb2wuRGlhZ25vc3RpY01vZGUgPSBmYWxzZTsKIAogCVBSSU5US18zKFRSQUNFXzM3ODBJLAogCQkiMzc4MGk6OmRzcDM3ODBpX0VuYWJsZURTUCBEU1BfSEJyaWRnZUNvbnRyb2wgJXggckhCcmlkZ2VDb250cm9sICV4XG4iLApAQCAtMzQ1LDcgKzM0NSw3IEBACiAJQ2hpcElEID0gUmVhZE1zYUNmZyhEU1BfQ2hpcElEKTsKIAogCVBSSU5US18yKFRSQUNFXzM3ODBJLAotCQkiMzc4MGk6OmRzcDM3ODBJX0VuYWJsZURTUCBleGl0aW5nIGJSQz1UUlVFLCBDaGlwSUQgJXhcbiIsCisJCSIzNzgwaTo6ZHNwMzc4MElfRW5hYmxlRFNQIGV4aXRpbmcgYlJDPXRydWUsIENoaXBJRCAleFxuIiwKIAkJQ2hpcElEKTsKIAogCXJldHVybiAwOwpAQCAtMzYxLDggKzM2MSw4IEBACiAJUFJJTlRLXzEoVFJBQ0VfMzc4MEksICIzNzgwaTo6ZHNwMzc4MGlfRGlzYWJsZURTUCBlbnRyeVxuIik7CiAKIAlyU2xhdmVDb250cm9sLkNsb2NrQ29udHJvbCA9IDA7Ci0JclNsYXZlQ29udHJvbC5Tb2Z0UmVzZXQgPSBUUlVFOwotCXJTbGF2ZUNvbnRyb2wuQ29uZmlnTW9kZSA9IEZBTFNFOworCXJTbGF2ZUNvbnRyb2wuU29mdFJlc2V0ID0gdHJ1ZTsKKwlyU2xhdmVDb250cm9sLkNvbmZpZ01vZGUgPSBmYWxzZTsKIAlyU2xhdmVDb250cm9sLlJlc2VydmVkID0gMDsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZHNwX2xvY2ssIGZsYWdzKTsKIAlPdXRXb3JkRHNwKERTUF9Jc2FTbGF2ZUNvbnRyb2wsIE1LV09SRChyU2xhdmVDb250cm9sKSk7CkBAIC0zOTgsMTQgKzM5OCwxNCBAQAogCVBSSU5US18yKFRSQUNFXzM3ODBJLCAiMzc4MGk6OmRzcDM3ODBpX1Jlc2V0IHJIQnJpZGdlQ29udHJvbCAleFxuIiwKIAkJTUtXT1JEKHJIQnJpZGdlQ29udHJvbCkpOwogCi0JckhCcmlkZ2VDb250cm9sLkVuYWJsZURzcEludCA9IEZBTFNFOworCXJIQnJpZGdlQ29udHJvbC5FbmFibGVEc3BJbnQgPSBmYWxzZTsKIAlPdXRXb3JkRHNwKERTUF9IQnJpZGdlQ29udHJvbCwgTUtXT1JEKHJIQnJpZGdlQ29udHJvbCkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzcF9sb2NrLCBmbGFncyk7CiAKIAkvKiBSZXNldCB0aGUgY29yZSB2aWEgdGhlIGJvb3QgZG9tYWluIHJlZ2lzdGVyICovCi0JckJvb3REb21haW4uUmVzZXRDb3JlID0gVFJVRTsKLQlyQm9vdERvbWFpbi5IYWx0ID0gVFJVRTsKLQlyQm9vdERvbWFpbi5OTUkgPSBUUlVFOworCXJCb290RG9tYWluLlJlc2V0Q29yZSA9IHRydWU7CisJckJvb3REb21haW4uSGFsdCA9IHRydWU7CisJckJvb3REb21haW4uTk1JID0gdHJ1ZTsKIAlyQm9vdERvbWFpbi5SZXNlcnZlZCA9IDA7CiAKIAlQUklOVEtfMihUUkFDRV8zNzgwSSwgIjM3ODBpOjpkc3AzNzgwaV9SZXNldCByQm9vdERvbWFpbiAleFxuIiwKQEAgLTQzOCwyNiArNDM4LDI2IEBACiAKIAogCS8qIFRyYW5zaXRpb24gdGhlIGNvcmUgdG8gYSBydW5uaW5nIHN0YXRlICovCi0JckJvb3REb21haW4uUmVzZXRDb3JlID0gVFJVRTsKLQlyQm9vdERvbWFpbi5IYWx0ID0gRkFMU0U7Ci0JckJvb3REb21haW4uTk1JID0gVFJVRTsKKwlyQm9vdERvbWFpbi5SZXNldENvcmUgPSB0cnVlOworCXJCb290RG9tYWluLkhhbHQgPSBmYWxzZTsKKwlyQm9vdERvbWFpbi5OTUkgPSB0cnVlOwogCXJCb290RG9tYWluLlJlc2VydmVkID0gMDsKIAlXcml0ZU1zYUNmZyhEU1BfTXNwQm9vdERvbWFpbiwgTUtXT1JEKHJCb290RG9tYWluKSk7CiAKIAl1ZGVsYXkoNSk7CiAKLQlyQm9vdERvbWFpbi5SZXNldENvcmUgPSBGQUxTRTsKKwlyQm9vdERvbWFpbi5SZXNldENvcmUgPSBmYWxzZTsKIAlXcml0ZU1zYUNmZyhEU1BfTXNwQm9vdERvbWFpbiwgTUtXT1JEKHJCb290RG9tYWluKSk7CiAJdWRlbGF5KDUpOwogCi0JckJvb3REb21haW4uTk1JID0gRkFMU0U7CisJckJvb3REb21haW4uTk1JID0gZmFsc2U7CiAJV3JpdGVNc2FDZmcoRFNQX01zcEJvb3REb21haW4sIE1LV09SRChyQm9vdERvbWFpbikpOwogCXVkZWxheSg1KTsKIAogCS8qIEVuYWJsZSBEU1AgdG8gUEMgaW50ZXJydXB0ICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRzcF9sb2NrLCBmbGFncyk7CiAJTUtXT1JEKHJIQnJpZGdlQ29udHJvbCkgPSBJbldvcmREc3AoRFNQX0hCcmlkZ2VDb250cm9sKTsKLQlySEJyaWRnZUNvbnRyb2wuRW5hYmxlRHNwSW50ID0gVFJVRTsKKwlySEJyaWRnZUNvbnRyb2wuRW5hYmxlRHNwSW50ID0gdHJ1ZTsKIAogCVBSSU5US18yKFRSQUNFXzM3ODBJLCAiMzc4MGk6OmRzcDM3ODBpX1J1biBySEJyaWRnZUNvbnRyb2wgJXhcbiIsCiAJCU1LV09SRChySEJyaWRnZUNvbnRyb2wpKTsKQEAgLTQ2Niw3ICs0NjYsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzcF9sb2NrLCBmbGFncyk7CiAKIAotCVBSSU5US18xKFRSQUNFXzM3ODBJLCAiMzc4MGk6OmRzcDM3ODBpX1J1biBleGl0IGJSQz1UUlVFXG4iKTsKKwlQUklOVEtfMShUUkFDRV8zNzgwSSwgIjM3ODBpOjpkc3AzNzgwaV9SdW4gZXhpdCBiUkM9dHJ1ZVxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTUwOCw3ICs1MDgsNyBAQAogCiAKIAlQUklOVEtfMShUUkFDRV8zNzgwSSwKLQkJIjM3ODBJOjpkc3AzNzgwSV9SZWFkRFN0b3JlIGV4aXQgYlJDPVRSVUVcbiIpOworCQkiMzc4MEk6OmRzcDM3ODBJX1JlYWREU3RvcmUgZXhpdCBiUkM9dHJ1ZVxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTU1MCw3ICs1NTAsNyBAQAogCiAKIAlQUklOVEtfMShUUkFDRV8zNzgwSSwKLQkJIjM3ODBJOjpkc3AzNzgwSV9SZWFkQW5kQ2xlYXJEU3RvcmUgZXhpdCBiUkM9VFJVRVxuIik7CisJCSIzNzgwSTo6ZHNwMzc4MElfUmVhZEFuZENsZWFyRFN0b3JlIGV4aXQgYlJDPXRydWVcbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01OTIsNyArNTkyLDcgQEAKIAogCiAJUFJJTlRLXzEoVFJBQ0VfMzc4MEksCi0JCSIzNzgwSTo6ZHNwMzc4MERfV3JpdGVEU3RvcmUgZXhpdCBiUkM9VFJVRVxuIik7CisJCSIzNzgwSTo6ZHNwMzc4MERfV3JpdGVEU3RvcmUgZXhpdCBiUkM9dHJ1ZVxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTY0MCw3ICs2NDAsNyBAQAogCX0KIAogCVBSSU5US18xKFRSQUNFXzM3ODBJLAotCQkiMzc4MEk6OmRzcDM3ODBJX1JlYWRJU3RvcmUgZXhpdCBiUkM9VFJVRVxuIik7CisJCSIzNzgwSTo6ZHNwMzc4MElfUmVhZElTdG9yZSBleGl0IGJSQz10cnVlXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjg5LDcgKzY4OSw3IEBACiAJfQogCiAJUFJJTlRLXzEoVFJBQ0VfMzc4MEksCi0JCSIzNzgwSTo6ZHNwMzc4MElfV3JpdGVJU3RvcmUgZXhpdCBiUkM9VFJVRVxuIik7CisJCSIzNzgwSTo6ZHNwMzc4MElfV3JpdGVJU3RvcmUgZXhpdCBiUkM9dHJ1ZVxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTcxMyw3ICs3MTMsNyBAQAogCSovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRzcF9sb2NrLCBmbGFncyk7CiAJTUtXT1JEKHJIQnJpZGdlQ29udHJvbCkgPSBJbldvcmREc3AoRFNQX0hCcmlkZ2VDb250cm9sKTsKLQlySEJyaWRnZUNvbnRyb2wuRW5hYmxlRHNwSW50ID0gRkFMU0U7CisJckhCcmlkZ2VDb250cm9sLkVuYWJsZURzcEludCA9IGZhbHNlOwogCU91dFdvcmREc3AoRFNQX0hCcmlkZ2VDb250cm9sLCBNS1dPUkQockhCcmlkZ2VDb250cm9sKSk7CiAKIAkqcHVzSVBDU291cmNlID0gSW5Xb3JkRHNwKERTUF9JbnRlcnJ1cHQpOwpAQCAtNzI1LDcgKzcyNSw3IEBACiAKIAlPdXRXb3JkRHNwKERTUF9JbnRlcnJ1cHQsICh1bnNpZ25lZCBzaG9ydCkgfigqcHVzSVBDU291cmNlKSk7CiAKLQlySEJyaWRnZUNvbnRyb2wuRW5hYmxlRHNwSW50ID0gVFJVRTsKKwlySEJyaWRnZUNvbnRyb2wuRW5hYmxlRHNwSW50ID0gdHJ1ZTsKIAlPdXRXb3JkRHNwKERTUF9IQnJpZGdlQ29udHJvbCwgTUtXT1JEKHJIQnJpZGdlQ29udHJvbCkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzcF9sb2NrLCBmbGFncyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9td2F2ZS8zNzgwaS5oIGIvZHJpdmVycy9jaGFyL213YXZlLzM3ODBpLmgKaW5kZXggZmJhNmFiMS4uOWNjYjZiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL213YXZlLzM3ODBpLmgKKysrIGIvZHJpdmVycy9jaGFyL213YXZlLzM3ODBpLmgKQEAgLTEwMSw3ICsxMDEsNyBAQAogfSBEU1BfVUFSVF9DRkdfMTsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGNoYXIgRW5hYmxlOjE7CS8qIFJXOiBFbmFibGUgSS9PIGFuZCBJUlE6IDA9RkFMU0UsIDE9VFJVRSAqLworCXVuc2lnbmVkIGNoYXIgRW5hYmxlOjE7CS8qIFJXOiBFbmFibGUgSS9PIGFuZCBJUlE6IDA9ZmFsc2UsIDE9dHJ1ZSAqLwogCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWQ6NzsJLyogMDogUmVzZXJ2ZWQgKi8KIH0gRFNQX1VBUlRfQ0ZHXzI7CiAKQEAgLTExNCw3ICsxMTQsNyBAQAogfSBEU1BfSEJSSURHRV9DRkdfMTsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGNoYXIgRW5hYmxlOjE7CS8qIFJXOiBlbmFibGUgSS9PIGFuZCBJUlE6IDA9RkFMU0UsIDE9VFJVRSAqLworCXVuc2lnbmVkIGNoYXIgRW5hYmxlOjE7CS8qIFJXOiBlbmFibGUgSS9PIGFuZCBJUlE6IDA9ZmFsc2UsIDE9dHJ1ZSAqLwogCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWQ6NzsJLyogMDogUmVzZXJ2ZWQgKi8KIH0gRFNQX0hCUklER0VfQ0ZHXzI7CiAKQEAgLTEzMywxMiArMTMzLDEyIEBACiAKIAogdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGNoYXIgR2F0ZUlPQ0hSRFk6MTsJLyogUlc6IEVuYWJsZSBJT0NIUkRZIGdhdGluZzogMD1GQUxTRSwgMT1UUlVFICovCisJdW5zaWduZWQgY2hhciBHYXRlSU9DSFJEWToxOwkvKiBSVzogRW5hYmxlIElPQ0hSRFkgZ2F0aW5nOiAwPWZhbHNlLCAxPXRydWUgKi8KIAl1bnNpZ25lZCBjaGFyIFJlc2VydmVkOjc7CS8qIDA6IFJlc2VydmVkICovCiB9IERTUF9JU0FfUFJPVF9DRkc7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBjaGFyIEVuYWJsZToxOwkvKiBSVzogRW5hYmxlIGxvdyBwb3dlciBzdXNwZW5kL3Jlc3VtZSAwPUZBTFNFLCAxPVRSVUUgKi8KKwl1bnNpZ25lZCBjaGFyIEVuYWJsZToxOwkvKiBSVzogRW5hYmxlIGxvdyBwb3dlciBzdXNwZW5kL3Jlc3VtZSAwPWZhbHNlLCAxPXRydWUgKi8KIAl1bnNpZ25lZCBjaGFyIFJlc2VydmVkOjc7CS8qIDA6IFJlc2VydmVkICovCiB9IERTUF9QT1dFUl9NR01UX0NGRzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL213YXZlL213YXZlZGQuYyBiL2RyaXZlcnMvY2hhci9td2F2ZS9td2F2ZWRkLmMKaW5kZXggMTY0NTQ0YS4uM2EzZmYyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL213YXZlL213YXZlZGQuYworKysgYi9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVkZC5jCkBAIC0yOTYsOCArMjk2LDggQEAKIAkJCQlwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLnVzSW50Q291bnQpOwogCiAJCQltdXRleF9sb2NrKCZtd2F2ZV9tdXRleCk7Ci0JCQlwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLmJJc0hlcmUgPSBGQUxTRTsKLQkJCXBEcnZEYXRhLT5JUENzW2lwY251bV0uYklzRW5hYmxlZCA9IFRSVUU7CisJCQlwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLmJJc0hlcmUgPSBmYWxzZTsKKwkJCXBEcnZEYXRhLT5JUENzW2lwY251bV0uYklzRW5hYmxlZCA9IHRydWU7CiAJCQltdXRleF91bmxvY2soJm13YXZlX211dGV4KTsKIAkKIAkJCVBSSU5US18yKFRSQUNFX01XQVZFLApAQCAtMzI0LDcgKzMyNCw3IEBACiAJCQkJcERydkRhdGEtPklQQ3NbaXBjbnVtXS51c0ludENvdW50KTsKIAkKIAkJCW11dGV4X2xvY2soJm13YXZlX211dGV4KTsKLQkJCWlmIChwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLmJJc0VuYWJsZWQgPT0gVFJVRSkgeworCQkJaWYgKHBEcnZEYXRhLT5JUENzW2lwY251bV0uYklzRW5hYmxlZCA9PSB0cnVlKSB7CiAJCQkJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAKIAkJCQlQUklOVEtfMihUUkFDRV9NV0FWRSwKQEAgLTMzMiw3ICszMzIsNyBAQAogCQkJCQkiIGlwYyAleCBnb2luZyB0byBzbGVlcFxuIiwKIAkJCQkJaXBjbnVtKTsKIAkJCQlhZGRfd2FpdF9xdWV1ZSgmcERydkRhdGEtPklQQ3NbaXBjbnVtXS5pcGNfd2FpdF9xdWV1ZSwgJndhaXQpOwotCQkJCXBEcnZEYXRhLT5JUENzW2lwY251bV0uYklzSGVyZSA9IFRSVUU7CisJCQkJcERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNIZXJlID0gdHJ1ZTsKIAkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQkJCS8qIGNoZWNrIHdoZXRoZXIgYW4gZXZlbnQgd2FzIHNpZ25hbGxlZCBieSAqLwogCQkJCS8qIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3aGlsZSB3ZSB3ZXJlIGdvbmUgKi8KQEAgLTM1NSw3ICszNTUsNyBAQAogCQkJCQkJIiBhcHBsaWNhdGlvblxuIiwKIAkJCQkJCWlwY251bSk7CiAJCQkJfQotCQkJCXBEcnZEYXRhLT5JUENzW2lwY251bV0uYklzSGVyZSA9IEZBTFNFOworCQkJCXBEcnZEYXRhLT5JUENzW2lwY251bV0uYklzSGVyZSA9IGZhbHNlOwogCQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLmlwY193YWl0X3F1ZXVlLCAmd2FpdCk7CiAJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAkJCQlQUklOVEtfMihUUkFDRV9NV0FWRSwKQEAgLTM4NCw5ICszODQsOSBAQAogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQkJbXV0ZXhfbG9jaygmbXdhdmVfbXV0ZXgpOwotCQkJaWYgKHBEcnZEYXRhLT5JUENzW2lwY251bV0uYklzRW5hYmxlZCA9PSBUUlVFKSB7Ci0JCQkJcERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNFbmFibGVkID0gRkFMU0U7Ci0JCQkJaWYgKHBEcnZEYXRhLT5JUENzW2lwY251bV0uYklzSGVyZSA9PSBUUlVFKSB7CisJCQlpZiAocERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNFbmFibGVkID09IHRydWUpIHsKKwkJCQlwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLmJJc0VuYWJsZWQgPSBmYWxzZTsKKwkJCQlpZiAocERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNIZXJlID09IHRydWUpIHsKIAkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLmlwY193YWl0X3F1ZXVlKTsKIAkJCQl9CiAJCQl9CkBAIC01NDEsNyArNTQxLDcgQEAKIAogCWlmIChwRHJ2RGF0YS0+ZGV2aWNlX3JlZ2lzdGVyZWQpIHsKIAkJZGV2aWNlX3VucmVnaXN0ZXIoJm13YXZlX2RldmljZSk7Ci0JCXBEcnZEYXRhLT5kZXZpY2VfcmVnaXN0ZXJlZCA9IEZBTFNFOworCQlwRHJ2RGF0YS0+ZGV2aWNlX3JlZ2lzdGVyZWQgPSBmYWxzZTsKIAl9CiAjZW5kaWYKIApAQCAtNTc2LDE2ICs1NzYsMTYgQEAKIAogCW1lbXNldCgmbXdhdmVfc19tZGQsIDAsIHNpemVvZihNV0FWRV9ERVZJQ0VfREFUQSkpOwogCi0JcERydkRhdGEtPmJCREluaXRpYWxpemVkID0gRkFMU0U7Ci0JcERydkRhdGEtPmJSZXNvdXJjZXNDbGFpbWVkID0gRkFMU0U7Ci0JcERydkRhdGEtPmJEU1BFbmFibGVkID0gRkFMU0U7Ci0JcERydkRhdGEtPmJEU1BSZXNldCA9IEZBTFNFOwotCXBEcnZEYXRhLT5iTXdhdmVEZXZSZWdpc3RlcmVkID0gRkFMU0U7CisJcERydkRhdGEtPmJCREluaXRpYWxpemVkID0gZmFsc2U7CisJcERydkRhdGEtPmJSZXNvdXJjZXNDbGFpbWVkID0gZmFsc2U7CisJcERydkRhdGEtPmJEU1BFbmFibGVkID0gZmFsc2U7CisJcERydkRhdGEtPmJEU1BSZXNldCA9IGZhbHNlOworCXBEcnZEYXRhLT5iTXdhdmVEZXZSZWdpc3RlcmVkID0gZmFsc2U7CiAJcERydkRhdGEtPnNMaW5lID0gLTE7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwRHJ2RGF0YS0+SVBDcyk7IGkrKykgewotCQlwRHJ2RGF0YS0+SVBDc1tpXS5iSXNFbmFibGVkID0gRkFMU0U7Ci0JCXBEcnZEYXRhLT5JUENzW2ldLmJJc0hlcmUgPSBGQUxTRTsKKwkJcERydkRhdGEtPklQQ3NbaV0uYklzRW5hYmxlZCA9IGZhbHNlOworCQlwRHJ2RGF0YS0+SVBDc1tpXS5iSXNIZXJlID0gZmFsc2U7CiAJCXBEcnZEYXRhLT5JUENzW2ldLnVzSW50Q291bnQgPSAwOwkvKiBubyBpbnRzIHJlY2VpdmVkIHlldCAqLwogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwRHJ2RGF0YS0+SVBDc1tpXS5pcGNfd2FpdF9xdWV1ZSk7CiAJfQpAQCAtNjAxLDcgKzYwMSw3IEBACiAJCQkJIiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBib2FyZCBkYXRhXG4iKTsKIAkJZ290byBjbGVhbnVwX2Vycm9yOwogCX0KLQlwRHJ2RGF0YS0+YkJESW5pdGlhbGl6ZWQgPSBUUlVFOworCXBEcnZEYXRhLT5iQkRJbml0aWFsaXplZCA9IHRydWU7CiAKIAlyZXR2YWwgPSB0cDM3ODBJX0NhbGNSZXNvdXJjZXMoJnBEcnZEYXRhLT5yQkREYXRhKTsKIAlQUklOVEtfMihUUkFDRV9NV0FWRSwKQEAgLTYyNiw3ICs2MjYsNyBAQAogCQkJCSIgRmFpbGVkIHRvIGNsYWltIHJlc291cmNlc1xuIik7CiAJCWdvdG8gY2xlYW51cF9lcnJvcjsKIAl9Ci0JcERydkRhdGEtPmJSZXNvdXJjZXNDbGFpbWVkID0gVFJVRTsKKwlwRHJ2RGF0YS0+YlJlc291cmNlc0NsYWltZWQgPSB0cnVlOwogCiAJcmV0dmFsID0gdHAzNzgwSV9FbmFibGVEU1AoJnBEcnZEYXRhLT5yQkREYXRhKTsKIAlQUklOVEtfMihUUkFDRV9NV0FWRSwKQEAgLTYzOSw3ICs2MzksNyBAQAogCQkJCSIgRmFpbGVkIHRvIGVuYWJsZSBEU1BcbiIpOwogCQlnb3RvIGNsZWFudXBfZXJyb3I7CiAJfQotCXBEcnZEYXRhLT5iRFNQRW5hYmxlZCA9IFRSVUU7CisJcERydkRhdGEtPmJEU1BFbmFibGVkID0gdHJ1ZTsKIAogCWlmIChtaXNjX3JlZ2lzdGVyKCZtd2F2ZV9taXNjX2RldikgPCAwKSB7CiAJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRQpAQCAtNjQ3LDcgKzY0Nyw3IEBACiAJCQkJIiBGYWlsZWQgdG8gcmVnaXN0ZXIgbWlzYyBkZXZpY2VcbiIpOwogCQlnb3RvIGNsZWFudXBfZXJyb3I7CiAJfQotCXBEcnZEYXRhLT5iTXdhdmVEZXZSZWdpc3RlcmVkID0gVFJVRTsKKwlwRHJ2RGF0YS0+Yk13YXZlRGV2UmVnaXN0ZXJlZCA9IHRydWU7CiAKIAlwRHJ2RGF0YS0+c0xpbmUgPSByZWdpc3Rlcl9zZXJpYWxfcG9ydGFuZGlycSgKIAkJcERydkRhdGEtPnJCRERhdGEuckRzcFNldHRpbmdzLnVzVWFydEJhc2VJTywKQEAgLTY2OCw3ICs2NjgsNyBAQAogCiAJaWYgKGRldmljZV9yZWdpc3RlcigmbXdhdmVfZGV2aWNlKSkKIAkJZ290byBjbGVhbnVwX2Vycm9yOwotCXBEcnZEYXRhLT5kZXZpY2VfcmVnaXN0ZXJlZCA9IFRSVUU7CisJcERydkRhdGEtPmRldmljZV9yZWdpc3RlcmVkID0gdHJ1ZTsKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtd2F2ZV9kZXZfYXR0cnMpOyBpKyspIHsKIAkJaWYoZGV2aWNlX2NyZWF0ZV9maWxlKCZtd2F2ZV9kZXZpY2UsIG13YXZlX2Rldl9hdHRyc1tpXSkpIHsKIAkJCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL213YXZlL213YXZlZGQuaCBiL2RyaXZlcnMvY2hhci9td2F2ZS9td2F2ZWRkLmgKaW5kZXggN2UwZDUzMC4uMzdlMGE0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL213YXZlL213YXZlZGQuaAorKysgYi9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVkZC5oCkBAIC0xMjUsOCArMTI1LDggQEAKIAogdHlwZWRlZiBzdHJ1Y3QgX01XQVZFX0lQQyB7CiAJdW5zaWduZWQgc2hvcnQgdXNJbnRDb3VudDsJLyogMD1ub25lLCAxPWZpcnN0LCAyPWdyZWF0ZXIgdGhhbiAxc3QgKi8KLQlCT09MRUFOIGJJc0VuYWJsZWQ7Ci0JQk9PTEVBTiBiSXNIZXJlOworCWJvb2wgYklzRW5hYmxlZDsKKwlib29sIGJJc0hlcmU7CiAJLyogZW50cnkgc3BpbiBsb2NrICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QgaXBjX3dhaXRfcXVldWU7CiB9IE1XQVZFX0lQQzsKQEAgLTEzNSwxMiArMTM1LDEyIEBACiAJVEhJTktQQURfQkRfREFUQSByQkREYXRhOwkvKiBib2FyZCBkcml2ZXIncyBkYXRhIGFyZWEgKi8KIAl1bnNpZ25lZCBsb25nIHVsSVBDU291cmNlX0lTUjsJLyogSVBDIHNvdXJjZSBiaXRzIGZvciByZWNlbnRseSBwcm9jZXNzZWQgaW50ciwgc2V0IGR1cmluZyBJU1IgcHJvY2Vzc2luZyAqLwogCXVuc2lnbmVkIGxvbmcgdWxJUENTb3VyY2VfRFBDOwkvKiBJUEMgc291cmNlIGJpdHMgZm9yIHJlY2VudGx5IHByb2Nlc3NlZCBpbnRyLCBzZXQgZHVyaW5nIERQQyBwcm9jZXNzaW5nICovCi0JQk9PTEVBTiBiQkRJbml0aWFsaXplZDsKLQlCT09MRUFOIGJSZXNvdXJjZXNDbGFpbWVkOwotCUJPT0xFQU4gYkRTUEVuYWJsZWQ7Ci0JQk9PTEVBTiBiRFNQUmVzZXQ7CisJYm9vbCBiQkRJbml0aWFsaXplZDsKKwlib29sIGJSZXNvdXJjZXNDbGFpbWVkOworCWJvb2wgYkRTUEVuYWJsZWQ7CisJYm9vbCBiRFNQUmVzZXQ7CiAJTVdBVkVfSVBDIElQQ3NbMTZdOwotCUJPT0xFQU4gYk13YXZlRGV2UmVnaXN0ZXJlZDsKKwlib29sIGJNd2F2ZURldlJlZ2lzdGVyZWQ7CiAJc2hvcnQgc0xpbmU7CiAJaW50IG5yX3JlZ2lzdGVyZWRfYXR0cnM7CiAJaW50IGRldmljZV9yZWdpc3RlcmVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL213YXZlL3NtYXBpLmMgYi9kcml2ZXJzL2NoYXIvbXdhdmUvc21hcGkuYwppbmRleCA2MTg3ZmQxLi44YzU0MTFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbXdhdmUvc21hcGkuYworKysgYi9kcml2ZXJzL2NoYXIvbXdhdmUvc21hcGkuYwpAQCAtNDkzLDcgKzQ5Myw3IEBACiB9CiAKIAotaW50IHNtYXBpX3NldF9EU1BfcG93ZXJfc3RhdGUoQk9PTEVBTiBiT24pCitpbnQgc21hcGlfc2V0X0RTUF9wb3dlcl9zdGF0ZShib29sIGJPbikKIHsKIAlpbnQgYlJDID0gLUVJTzsKIAl1bnNpZ25lZCBzaG9ydCB1c0FYLCB1c0JYLCB1c0NYLCB1c0RYLCB1c0RJLCB1c1NJOwpAQCAtNTU2LDcgKzU1Niw3IEBACiAJCQlQUklOVEtfRVJST1IoInNtYXBpOjpzbWFwaV9pbml0LCBFUlJPUiB1bmFibGUgdG8gcmVhZCBmcm9tIFNNQVBJIHBvcnRcbiIpOwogCQl9IGVsc2UgewogCQkJUFJJTlRLXzIoVFJBQ0VfU01BUEksCi0JCQkJInNtYXBpOjpzbWFwaV9pbml0LCBleGl0IFRSVUUgZ191c1NtYXBpUG9ydCAleFxuIiwKKwkJCQkic21hcGk6OnNtYXBpX2luaXQsIGV4aXQgdHJ1ZSBnX3VzU21hcGlQb3J0ICV4XG4iLAogCQkJCWdfdXNTbWFwaVBvcnQpOwogCQkJcmV0dmFsID0gMDsKIAkJCS8vU21hcGlRdWVyeVN5c3RlbUlEKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvc21hcGkuaCBiL2RyaXZlcnMvY2hhci9td2F2ZS9zbWFwaS5oCmluZGV4IDY0YjJlYzEuLmViYzIwNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9td2F2ZS9zbWFwaS5oCisrKyBiL2RyaXZlcnMvY2hhci9td2F2ZS9zbWFwaS5oCkBAIC00OSwxMCArNDksNiBAQAogI2lmbmRlZiBfTElOVVhfU01BUElfSAogI2RlZmluZSBfTElOVVhfU01BUElfSAogCi0jZGVmaW5lIFRSVUUgMQotI2RlZmluZSBGQUxTRSAwCi0jZGVmaW5lIEJPT0xFQU4gaW50Ci0KIHR5cGVkZWYgc3RydWN0IHsKIAlpbnQgYkRTUFByZXNlbnQ7CiAJaW50IGJEU1BFbmFibGVkOwpAQCAtNzQsNyArNzAsNyBAQAogaW50IHNtYXBpX2luaXQodm9pZCk7CiBpbnQgc21hcGlfcXVlcnlfRFNQX2NmZyhTTUFQSV9EU1BfU0VUVElOR1MgKiBwU2V0dGluZ3MpOwogaW50IHNtYXBpX3NldF9EU1BfY2ZnKHZvaWQpOwotaW50IHNtYXBpX3NldF9EU1BfcG93ZXJfc3RhdGUoQk9PTEVBTiBiT24pOworaW50IHNtYXBpX3NldF9EU1BfcG93ZXJfc3RhdGUoYm9vbCBiT24pOwogCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL213YXZlL3RwMzc4MGkuYyBiL2RyaXZlcnMvY2hhci9td2F2ZS90cDM3ODBpLmMKaW5kZXggMDRlNmQ2YS4uNWUxNjE4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL213YXZlL3RwMzc4MGkuYworKysgYi9kcml2ZXJzL2NoYXIvbXdhdmUvdHAzNzgwaS5jCkBAIC04MCwxMyArODAsMTMgQEAKIAlXcml0ZU1zYUNmZyhEU1BfR3Bpb01vZGVDb250cm9sXzE1XzgsIE1LV09SRChyR3Bpb01vZGUpKTsKIAogCU1LV09SRChyR3Bpb0RyaXZlckVuYWJsZSkgPSAwOwotCXJHcGlvRHJpdmVyRW5hYmxlLkVuYWJsZTEwID0gVFJVRTsKLQlyR3Bpb0RyaXZlckVuYWJsZS5NYXNrMTAgPSBUUlVFOworCXJHcGlvRHJpdmVyRW5hYmxlLkVuYWJsZTEwID0gdHJ1ZTsKKwlyR3Bpb0RyaXZlckVuYWJsZS5NYXNrMTAgPSB0cnVlOwogCVdyaXRlTXNhQ2ZnKERTUF9HcGlvRHJpdmVyRW5hYmxlXzE1XzgsIE1LV09SRChyR3Bpb0RyaXZlckVuYWJsZSkpOwogCiAJTUtXT1JEKHJHcGlvT3V0cHV0RGF0YSkgPSAwOwogCXJHcGlvT3V0cHV0RGF0YS5MYXRjaDEwID0gMDsKLQlyR3Bpb091dHB1dERhdGEuTWFzazEwID0gVFJVRTsKKwlyR3Bpb091dHB1dERhdGEuTWFzazEwID0gdHJ1ZTsKIAlXcml0ZU1zYUNmZyhEU1BfR3Bpb091dHB1dERhdGFfMTVfOCwgTUtXT1JEKHJHcGlvT3V0cHV0RGF0YSkpOwogCiAJUFJJTlRLXzEoVFJBQ0VfVFAzNzgwSSwgInRwMzc4MGk6OkVuYWJsZVNSQU0gZXhpdFxuIik7CkBAIC0xMjcsNyArMTI3LDcgQEAKIAkJCQlQUklOVEtfMihUUkFDRV9UUDM3ODBJLAogCQkJCQkidHAzNzgwaTo6RHNwSW50ZXJydXB0IHVzSW50Q291bnQgJXhcbiIsCiAJCQkJCXBEcnZEYXRhLT5JUENzW3VzUENOdW0gLSAxXS51c0ludENvdW50KTsKLQkJCQlpZiAocERydkRhdGEtPklQQ3NbdXNQQ051bSAtIDFdLmJJc0VuYWJsZWQgPT0gVFJVRSkgeworCQkJCWlmIChwRHJ2RGF0YS0+SVBDc1t1c1BDTnVtIC0gMV0uYklzRW5hYmxlZCA9PSB0cnVlKSB7CiAJCQkJCVBSSU5US18yKFRSQUNFX1RQMzc4MEksCiAJCQkJCQkidHAzNzgwaTo6RHNwSW50ZXJydXB0LCB3YWtpbmcgdXAgdXNQQ051bSAleFxuIiwKIAkJCQkJCXVzUENOdW0gLSAxKTsKQEAgLTE2MCw4ICsxNjAsOCBAQAogCiAJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwgInRwMzc4MGk6OnRwMzc4MElfSW5pdGlhbGl6ZUJvYXJkRGF0YSBlbnRyeSBwQkREYXRhICVwXG4iLCBwQkREYXRhKTsKIAotCXBCRERhdGEtPmJEU1BFbmFibGVkID0gRkFMU0U7Ci0JcFNldHRpbmdzLT5iSW50ZXJydXB0Q2xhaW1lZCA9IEZBTFNFOworCXBCRERhdGEtPmJEU1BFbmFibGVkID0gZmFsc2U7CisJcFNldHRpbmdzLT5iSW50ZXJydXB0Q2xhaW1lZCA9IGZhbHNlOwogCiAJcmV0dmFsID0gc21hcGlfaW5pdCgpOwogCWlmIChyZXR2YWwpIHsKQEAgLTI2OSw3ICsyNjksNyBAQAogCiAJaWYgKHBTZXR0aW5ncy0+YkludGVycnVwdENsYWltZWQpIHsKIAkJZnJlZV9pcnEocFNldHRpbmdzLT51c0RzcElycSwgTlVMTCk7Ci0JCXBTZXR0aW5ncy0+YkludGVycnVwdENsYWltZWQgPSBGQUxTRTsKKwkJcFNldHRpbmdzLT5iSW50ZXJydXB0Q2xhaW1lZCA9IGZhbHNlOwogCX0KIAogCVBSSU5US18yKFRSQUNFX1RQMzc4MEksCkBAIC0yODMsNyArMjgzLDcgQEAKIGludCB0cDM3ODBJX0VuYWJsZURTUChUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSkKIHsKIAlEU1BfMzc4MElfQ09ORklHX1NFVFRJTkdTICpwU2V0dGluZ3MgPSAmcEJERGF0YS0+ckRzcFNldHRpbmdzOwotCUJPT0xFQU4gYkRTUFBvd2VyZWRVcCA9IEZBTFNFLCBiSW50ZXJydXB0QWxsb2NhdGVkID0gRkFMU0U7CisJYm9vbCBiRFNQUG93ZXJlZFVwID0gZmFsc2UsIGJJbnRlcnJ1cHRBbGxvY2F0ZWQgPSBmYWxzZTsKIAogCVBSSU5US18yKFRSQUNFX1RQMzc4MEksICJ0cDM3ODBpOjp0cDM3ODBJX0VuYWJsZURTUCBlbnRyeSBwQkREYXRhICVwXG4iLCBwQkREYXRhKTsKIApAQCAtMzM2LDE0ICszMzYsMTQgQEAKIAkJfQogCX0KIAotCXBTZXR0aW5ncy0+YkRzcElycUFjdGl2ZUxvdyA9IHBTZXR0aW5ncy0+YkRzcElycVB1bHNlID0gVFJVRTsKLQlwU2V0dGluZ3MtPmJVYXJ0SXJxQWN0aXZlTG93ID0gcFNldHRpbmdzLT5iVWFydElycVB1bHNlID0gVFJVRTsKKwlwU2V0dGluZ3MtPmJEc3BJcnFBY3RpdmVMb3cgPSBwU2V0dGluZ3MtPmJEc3BJcnFQdWxzZSA9IHRydWU7CisJcFNldHRpbmdzLT5iVWFydElycUFjdGl2ZUxvdyA9IHBTZXR0aW5ncy0+YlVhcnRJcnFQdWxzZSA9IHRydWU7CiAKIAlpZiAocEJERGF0YS0+YlNoYXJlRHNwSXJxKSB7Ci0JCXBTZXR0aW5ncy0+YkRzcElycUFjdGl2ZUxvdyA9IEZBTFNFOworCQlwU2V0dGluZ3MtPmJEc3BJcnFBY3RpdmVMb3cgPSBmYWxzZTsKIAl9CiAJaWYgKHBCRERhdGEtPmJTaGFyZVVhcnRJcnEpIHsKLQkJcFNldHRpbmdzLT5iVWFydElycUFjdGl2ZUxvdyA9IEZBTFNFOworCQlwU2V0dGluZ3MtPmJVYXJ0SXJxQWN0aXZlTG93ID0gZmFsc2U7CiAJfQogCiAJcFNldHRpbmdzLT51c051bVRyYW5zZmVycyA9IFRQX0NGR19OdW1UcmFuc2ZlcnM7CkBAIC0zNzMsMTYgKzM3MywxNiBAQAogCQlQUklOVEtfMyhUUkFDRV9UUDM3ODBJLAogCQkJInRwMzc4MGk6OnRwMzc4MElfRW5hYmxlRFNQLCBnb3QgaW50ZXJydXB0ICV4IGJTaGFyZURzcElycSAleFxuIiwKIAkJCXBTZXR0aW5ncy0+dXNEc3BJcnEsIHBCRERhdGEtPmJTaGFyZURzcElycSk7Ci0JCWJJbnRlcnJ1cHRBbGxvY2F0ZWQgPSBUUlVFOwotCQlwU2V0dGluZ3MtPmJJbnRlcnJ1cHRDbGFpbWVkID0gVFJVRTsKKwkJYkludGVycnVwdEFsbG9jYXRlZCA9IHRydWU7CisJCXBTZXR0aW5ncy0+YkludGVycnVwdENsYWltZWQgPSB0cnVlOwogCX0KIAotCXNtYXBpX3NldF9EU1BfcG93ZXJfc3RhdGUoRkFMU0UpOwotCWlmIChzbWFwaV9zZXRfRFNQX3Bvd2VyX3N0YXRlKFRSVUUpKSB7Ci0JCVBSSU5US19FUlJPUihLRVJOX0VSUl9NV0FWRSAidHAzNzgwaTo6dHAzNzgwSV9FbmFibGVEU1A6IEVycm9yOiBzbWFwaV9zZXRfRFNQX3Bvd2VyX3N0YXRlKFRSVUUpIGZhaWxlZFxuIik7CisJc21hcGlfc2V0X0RTUF9wb3dlcl9zdGF0ZShmYWxzZSk7CisJaWYgKHNtYXBpX3NldF9EU1BfcG93ZXJfc3RhdGUodHJ1ZSkpIHsKKwkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJ0cDM3ODBpOjp0cDM3ODBJX0VuYWJsZURTUDogRXJyb3I6IHNtYXBpX3NldF9EU1BfcG93ZXJfc3RhdGUodHJ1ZSkgZmFpbGVkXG4iKTsKIAkJZ290byBleGl0X2NsZWFudXA7CiAJfSBlbHNlIHsKLQkJYkRTUFBvd2VyZWRVcCA9IFRSVUU7CisJCWJEU1BQb3dlcmVkVXAgPSB0cnVlOwogCX0KIAogCWlmIChkc3AzNzgwSV9FbmFibGVEU1AocFNldHRpbmdzLCBzX2F1c1RoaW5rcGFkSXJxVG9GaWVsZCwgc19hdXNUaGlua3BhZERtYVRvRmllbGQpKSB7CkBAIC0zOTIsNyArMzkyLDcgQEAKIAogCUVuYWJsZVNSQU0ocEJERGF0YSk7CiAKLQlwQkREYXRhLT5iRFNQRW5hYmxlZCA9IFRSVUU7CisJcEJERGF0YS0+YkRTUEVuYWJsZWQgPSB0cnVlOwogCiAJUFJJTlRLXzEoVFJBQ0VfVFAzNzgwSSwgInRwMzc4MGk6OnRwMzc4MElfRW5hYmxlRFNQIGV4aXRcbiIpOwogCkBAIC00MDEsMTAgKzQwMSwxMCBAQAogZXhpdF9jbGVhbnVwOgogCVBSSU5US19FUlJPUigidHAzNzgwaTo6dHAzNzgwSV9FbmFibGVEU1A6IENsZWFuaW5nIHVwXG4iKTsKIAlpZiAoYkRTUFBvd2VyZWRVcCkKLQkJc21hcGlfc2V0X0RTUF9wb3dlcl9zdGF0ZShGQUxTRSk7CisJCXNtYXBpX3NldF9EU1BfcG93ZXJfc3RhdGUoZmFsc2UpOwogCWlmIChiSW50ZXJydXB0QWxsb2NhdGVkKSB7CiAJCWZyZWVfaXJxKHBTZXR0aW5ncy0+dXNEc3BJcnEsIE5VTEwpOwotCQlwU2V0dGluZ3MtPmJJbnRlcnJ1cHRDbGFpbWVkID0gRkFMU0U7CisJCXBTZXR0aW5ncy0+YkludGVycnVwdENsYWltZWQgPSBmYWxzZTsKIAl9CiAJcmV0dXJuIC1FSU87CiB9CkBAIC00MjEsMTAgKzQyMSwxMCBAQAogCQlkc3AzNzgwSV9EaXNhYmxlRFNQKCZwQkREYXRhLT5yRHNwU2V0dGluZ3MpOwogCQlpZiAocFNldHRpbmdzLT5iSW50ZXJydXB0Q2xhaW1lZCkgewogCQkJZnJlZV9pcnEocFNldHRpbmdzLT51c0RzcElycSwgTlVMTCk7Ci0JCQlwU2V0dGluZ3MtPmJJbnRlcnJ1cHRDbGFpbWVkID0gRkFMU0U7CisJCQlwU2V0dGluZ3MtPmJJbnRlcnJ1cHRDbGFpbWVkID0gZmFsc2U7CiAJCX0KLQkJc21hcGlfc2V0X0RTUF9wb3dlcl9zdGF0ZShGQUxTRSk7Ci0JCXBCRERhdGEtPmJEU1BFbmFibGVkID0gRkFMU0U7CisJCXNtYXBpX3NldF9EU1BfcG93ZXJfc3RhdGUoZmFsc2UpOworCQlwQkREYXRhLT5iRFNQRW5hYmxlZCA9IGZhbHNlOwogCX0KIAogCVBSSU5US18yKFRSQUNFX1RQMzc4MEksICJ0cDM3ODBpOjp0cDM3ODBJX0Rpc2FibGVEU1AgZXhpdCByZXR2YWwgJXhcbiIsIHJldHZhbCk7CkBAIC01MTYsNyArNTE2LDcgQEAKIAlpbnQgcmV0dmFsID0gMDsKIAlEU1BfMzc4MElfQ09ORklHX1NFVFRJTkdTICpwU2V0dGluZ3MgPSAmcEJERGF0YS0+ckRzcFNldHRpbmdzOwogCXVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPID0gcFNldHRpbmdzLT51c0RzcEJhc2VJTzsKLQlCT09MRUFOIGJSQyA9IDA7CisJYm9vbCBiUkMgPSAwOwogCiAJUFJJTlRLXzYoVFJBQ0VfVFAzNzgwSSwKIAkJInRwMzc4MGk6OnRwMzc4MElfUmVhZFdyaXRlRHNwRFN0b3JlIGVudHJ5IHBCRERhdGEgJXAsIHVPcGNvZGUgJXgsIHB2QnVmZmVyICVwLCB1Q291bnQgJXgsIHVsRFNQQWRkciAlbHhcbiIsCkBAIC01NTIsNyArNTUyLDcgQEAKIAlpbnQgcmV0dmFsID0gMDsKIAlEU1BfMzc4MElfQ09ORklHX1NFVFRJTkdTICpwU2V0dGluZ3MgPSAmcEJERGF0YS0+ckRzcFNldHRpbmdzOwogCXVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPID0gcFNldHRpbmdzLT51c0RzcEJhc2VJTzsKLQlCT09MRUFOIGJSQyA9IDA7CisJYm9vbCBiUkMgPSAwOwogCiAJUFJJTlRLXzYoVFJBQ0VfVFAzNzgwSSwKIAkJInRwMzc4MGk6OnRwMzc4MElfUmVhZFdyaXRlRHNwSVN0b3JlIGVudHJ5IHBCRERhdGEgJXAsIHVPcGNvZGUgJXgsIHB2QnVmZmVyICVwLCB1Q291bnQgJXgsIHVsRFNQQWRkciAlbHhcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcHBkZXYuYyBiL2RyaXZlcnMvY2hhci9wcGRldi5jCmluZGV4IGY4YTQ4M2MuLmQyMzM2ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9wcGRldi5jCisrKyBiL2RyaXZlcnMvY2hhci9wcGRldi5jCkBAIC0yODYsNyArMjg2LDcgQEAKIAlzdHJ1Y3QgcGFycG9ydCAqcG9ydDsKIAlzdHJ1Y3QgcGFyZGV2aWNlICpwZGV2ID0gTlVMTDsKIAljaGFyICpuYW1lOwotCWludCBmbDsKKwlzdHJ1Y3QgcGFyZGV2X2NiIHBwZGV2X2NiOwogCiAJbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCBDSFJERVYgIiV4IiwgbWlub3IpOwogCWlmIChuYW1lID09IE5VTEwpCkBAIC0yOTksOSArMjk5LDExIEBACiAJCXJldHVybiAtRU5YSU87CiAJfQogCi0JZmwgPSAocHAtPmZsYWdzICYgUFBfRVhDTCkgPyBQQVJQT1JUX0ZMQUdfRVhDTCA6IDA7Ci0JcGRldiA9IHBhcnBvcnRfcmVnaXN0ZXJfZGV2aWNlKHBvcnQsIG5hbWUsIE5VTEwsCi0JCQkJICAgICAgIE5VTEwsIHBwX2lycSwgZmwsIHBwKTsKKwltZW1zZXQoJnBwZGV2X2NiLCAwLCBzaXplb2YocHBkZXZfY2IpKTsKKwlwcGRldl9jYi5pcnFfZnVuYyA9IHBwX2lycTsKKwlwcGRldl9jYi5mbGFncyA9IChwcC0+ZmxhZ3MgJiBQUF9FWENMKSA/IFBBUlBPUlRfRkxBR19FWENMIDogMDsKKwlwcGRldl9jYi5wcml2YXRlID0gcHA7CisJcGRldiA9IHBhcnBvcnRfcmVnaXN0ZXJfZGV2X21vZGVsKHBvcnQsIG5hbWUsICZwcGRldl9jYiwgbWlub3IpOwogCXBhcnBvcnRfcHV0X3BvcnQocG9ydCk7CiAKIAlpZiAoIXBkZXYpIHsKQEAgLTc5OSwxMCArODAxLDIzIEBACiAJZGV2aWNlX2Rlc3Ryb3kocHBkZXZfY2xhc3MsIE1LREVWKFBQX01BSk9SLCBwb3J0LT5udW1iZXIpKTsKIH0KIAorc3RhdGljIGludCBwcF9wcm9iZShzdHJ1Y3QgcGFyZGV2aWNlICpwYXJfZGV2KQoreworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBwYXJfZGV2LT5kZXYuZHJpdmVyOworCWludCBsZW4gPSBzdHJsZW4oZHJ2LT5uYW1lKTsKKworCWlmIChzdHJuY21wKHBhcl9kZXYtPm5hbWUsIGRydi0+bmFtZSwgbGVuKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBwYXJwb3J0X2RyaXZlciBwcF9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gQ0hSREVWLAotCS5hdHRhY2gJCT0gcHBfYXR0YWNoLAorCS5wcm9iZQkJPSBwcF9wcm9iZSwKKwkubWF0Y2hfcG9ydAk9IHBwX2F0dGFjaCwKIAkuZGV0YWNoCQk9IHBwX2RldGFjaCwKKwkuZGV2bW9kZWwJPSB0cnVlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgcHBkZXZfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Nuc2MuYyBiL2RyaXZlcnMvY2hhci9zbnNjLmMKaW5kZXggOTQwMDZmOS4uMTBlNTYzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Nuc2MuYworKysgYi9kcml2ZXJzL2NoYXIvc25zYy5jCkBAIC0zODUsMTMgKzM4NSwxOCBAQAogCiAJZXZlbnRfbmFzaWQgPSBpYTY0X3NuX2dldF9jb25zb2xlX25hc2lkKCk7CiAKKwlzbnNjX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCBTWVNDVExfQkFTRU5BTUUpOworCWlmIChJU19FUlIoc25zY19jbGFzcykpIHsKKwkJcHJpbnRrKCIlczogZmFpbGVkIHRvIGFsbG9jYXRlIGNsYXNzXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBQVFJfRVJSKHNuc2NfY2xhc3MpOworCX0KKwogCWlmIChhbGxvY19jaHJkZXZfcmVnaW9uKCZmaXJzdF9kZXYsIDAsIG51bV9jbm9kZXMsCiAJCQkJU1lTQ1RMX0JBU0VOQU1FKSA8IDApIHsKIAkJcHJpbnRrKCIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIFNOIHN5c3RlbSBjb250cm9sbGVyIGRldmljZVxuIiwKIAkJICAgICAgIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCXNuc2NfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsIFNZU0NUTF9CQVNFTkFNRSk7CiAKIAlmb3IgKGNub2RlID0gMDsgY25vZGUgPCBudW1fY25vZGVzOyBjbm9kZSsrKSB7CiAJCQlnZW9pZCA9IGNub2RlaWRfZ2V0X2dlb2lkKGNub2RlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90aWxlLXNyb20uYyBiL2RyaXZlcnMvY2hhci90aWxlLXNyb20uYwppbmRleCA2OWY2YjRhLi4zOTg4MDBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdGlsZS1zcm9tLmMKKysrIGIvZHJpdmVycy9jaGFyL3RpbGUtc3JvbS5jCkBAIC0zMzEsMTMgKzMzMSwxMSBAQAogLyoqCiAgKiBzcm9tX3NldHVwX21pbm9yKCkgLSBJbml0aWFsaXplIHBlci1taW5vciBpbmZvcm1hdGlvbi4KICAqIEBzcm9tOiBQZXItZGV2aWNlIFNST00gc3RhdGUuCi0gKiBAaW5kZXg6IERldmljZSB0byBzZXQgdXAuCisgKiBAZGV2aGRsOiBQYXJ0aXRpb24gZGV2aWNlIGhhbmRsZS4KICAqLwotc3RhdGljIGludCBzcm9tX3NldHVwX21pbm9yKHN0cnVjdCBzcm9tX2RldiAqc3JvbSwgaW50IGluZGV4KQorc3RhdGljIGludCBzcm9tX3NldHVwX21pbm9yKHN0cnVjdCBzcm9tX2RldiAqc3JvbSwgaW50IGRldmhkbCkKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0JaW50IGRldmhkbCA9IHNyb20tPmh2X2RldmhkbDsKLQorCXNyb20tPmh2X2RldmhkbCA9IGRldmhkbDsKIAltdXRleF9pbml0KCZzcm9tLT5sb2NrKTsKIAogCWlmIChfc3JvbV9yZWFkKGRldmhkbCwgJnNyb20tPnRvdGFsX3NpemUsCkBAIC0zNTAsOSArMzQ4LDcgQEAKIAkJICAgICAgIFNST01fUEFHRV9TSVpFX09GRiwgc2l6ZW9mKHNyb20tPnBhZ2Vfc2l6ZSkpIDwgMCkKIAkJcmV0dXJuIC1FSU87CiAKLQlkZXYgPSBkZXZpY2VfY3JlYXRlKHNyb21fY2xhc3MsICZzcm9tX3BhcmVudC0+ZGV2LAotCQkJICAgIE1LREVWKHNyb21fbWFqb3IsIGluZGV4KSwgc3JvbSwgIiVkIiwgaW5kZXgpOwotCXJldHVybiBQVFJfRVJSX09SX1pFUk8oZGV2KTsKKwlyZXR1cm4gMDsKIH0KIAogLyoqIHNyb21faW5pdCgpIC0gSW5pdGlhbGl6ZSB0aGUgZHJpdmVyJ3MgbW9kdWxlLiAqLwpAQCAtMzY1LDcgKzM2MSw3IEBACiAJICogU3RhcnQgd2l0aCBhIHBsYXVzaWJsZSBudW1iZXIgb2YgcGFydGl0aW9uczsgdGhlIGtyZWFsbG9jKCkgY2FsbAogCSAqIGJlbG93IHdpbGwgeWllbGQgYWJvdXQgbG9nKHNyb21fZGV2cykgYWRkaXRpb25hbCBhbGxvY2F0aW9ucy4KIAkgKi8KLQlzcm9tX2RldmljZXMgPSBremFsbG9jKDQgKiBzaXplb2Yoc3RydWN0IHNyb21fZGV2KSwgR0ZQX0tFUk5FTCk7CisJc3JvbV9kZXZpY2VzID0ga21hbGxvYyg0ICogc2l6ZW9mKHN0cnVjdCBzcm9tX2RldiksIEdGUF9LRVJORUwpOwogCiAJLyogRGlzY292ZXIgdGhlIG51bWJlciBvZiBzcm9tIHBhcnRpdGlvbnMuICovCiAJZm9yIChpID0gMDsgOyBpKyspIHsKQEAgLTM3Myw3ICszNjksNyBAQAogCQljaGFyIGJ1ZlsyMF07CiAJCXN0cnVjdCBzcm9tX2RldiAqbmV3X3Nyb21fZGV2aWNlcyA9CiAJCQlrcmVhbGxvYyhzcm9tX2RldmljZXMsIChpKzEpICogc2l6ZW9mKHN0cnVjdCBzcm9tX2RldiksCi0JCQkJIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKKwkJCQkgR0ZQX0tFUk5FTCk7CiAJCWlmICghbmV3X3Nyb21fZGV2aWNlcykgewogCQkJcmVzdWx0ID0gLUVOT01FTTsKIAkJCWdvdG8gZmFpbF9tZW07CkBAIC0zODcsNyArMzgzLDkgQEAKIAkJCQkJICBpLCBkZXZoZGwpOwogCQkJYnJlYWs7CiAJCX0KLQkJc3JvbV9kZXZpY2VzW2ldLmh2X2RldmhkbCA9IGRldmhkbDsKKwkJcmVzdWx0ID0gc3JvbV9zZXR1cF9taW5vcigmc3JvbV9kZXZpY2VzW2ldLCBkZXZoZGwpOworCQlpZiAocmVzdWx0ICE9IDApCisJCQlnb3RvIGZhaWxfbWVtOwogCX0KIAlzcm9tX2RldnMgPSBpOwogCkBAIC00MzEsOSArNDI5LDEzIEBACiAJc3JvbV9jbGFzcy0+ZGV2X2dyb3VwcyA9IHNyb21fZGV2X2dyb3VwczsKIAlzcm9tX2NsYXNzLT5kZXZub2RlID0gc3JvbV9kZXZub2RlOwogCi0JLyogRG8gcGVyLXBhcnRpdGlvbiBpbml0aWFsaXphdGlvbiAqLworCS8qIENyZWF0ZSBwZXItcGFydGl0aW9uIGRldmljZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgc3JvbV9kZXZzOyBpKyspIHsKLQkJcmVzdWx0ID0gc3JvbV9zZXR1cF9taW5vcihzcm9tX2RldmljZXMgKyBpLCBpKTsKKwkJc3RydWN0IGRldmljZSAqZGV2ID0KKwkJCWRldmljZV9jcmVhdGUoc3JvbV9jbGFzcywgJnNyb21fcGFyZW50LT5kZXYsCisJCQkJICAgICAgTUtERVYoc3JvbV9tYWpvciwgaSksIHNyb21fZGV2aWNlcyArIGksCisJCQkJICAgICAgIiVkIiwgaSk7CisJCXJlc3VsdCA9IFBUUl9FUlJfT1JfWkVSTyhkZXYpOwogCQlpZiAocmVzdWx0IDwgMCkKIAkJCWdvdG8gZmFpbF9jbGFzczsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3N0MzN6cDI0L3N0MzN6cDI0LmMgYi9kcml2ZXJzL2NoYXIvdHBtL3N0MzN6cDI0L3N0MzN6cDI0LmMKaW5kZXggYzJlZTMwNC4uNmYwNjBjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS9zdDMzenAyNC9zdDMzenAyNC5jCisrKyBiL2RyaXZlcnMvY2hhci90cG0vc3QzM3pwMjQvc3QzM3pwMjQuYwpAQCAtNTg5LDggKzU4OSw2IEBACiAJCWNoaXAtPmZsYWdzIHw9IFRQTV9DSElQX0ZMQUdfSVJROwogCiAJCWRpc2FibGVfaXJxX25vc3luYyh0cG1fZGV2LT5pcnEpOwotCi0JCXRwbV9nZW5faW50ZXJydXB0KGNoaXApOwogCX0KIAogCXJldHVybiB0cG1fY2hpcF9yZWdpc3RlcihjaGlwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vdHBtLWRldi5jIGIvZHJpdmVycy9jaGFyL3RwbS90cG0tZGV2LmMKaW5kZXggZjVkNDUyMS4uOTEyYWQzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS90cG0tZGV2LmMKKysrIGIvZHJpdmVycy9jaGFyL3RwbS90cG0tZGV2LmMKQEAgLTE0NSw3ICsxNDUsNyBAQAogCQlyZXR1cm4gLUVQSVBFOwogCX0KIAlvdXRfc2l6ZSA9IHRwbV90cmFuc21pdChwcml2LT5jaGlwLCBwcml2LT5kYXRhX2J1ZmZlciwKLQkJCQlzaXplb2YocHJpdi0+ZGF0YV9idWZmZXIpKTsKKwkJCQlzaXplb2YocHJpdi0+ZGF0YV9idWZmZXIpLCAwKTsKIAogCXRwbV9wdXRfb3BzKHByaXYtPmNoaXApOwogCWlmIChvdXRfc2l6ZSA8IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vdHBtLWludGVyZmFjZS5jIGIvZHJpdmVycy9jaGFyL3RwbS90cG0taW50ZXJmYWNlLmMKaW5kZXggMWFiZTJkNy4uOGRlNjE4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS90cG0taW50ZXJmYWNlLmMKKysrIGIvZHJpdmVycy9jaGFyL3RwbS90cG0taW50ZXJmYWNlLmMKQEAgLTMzMCwxMyArMzMwLDE2IEBACiAvKgogICogSW50ZXJuYWwga2VybmVsIGludGVyZmFjZSB0byB0cmFuc21pdCBUUE0gY29tbWFuZHMKICAqLwotc3NpemVfdCB0cG1fdHJhbnNtaXQoc3RydWN0IHRwbV9jaGlwICpjaGlwLCBjb25zdCBjaGFyICpidWYsCi0JCSAgICAgc2l6ZV90IGJ1ZnNpeikKK3NzaXplX3QgdHBtX3RyYW5zbWl0KHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGJ1ZnNpeiwKKwkJICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3NpemVfdCByYzsKIAl1MzIgY291bnQsIG9yZGluYWw7CiAJdW5zaWduZWQgbG9uZyBzdG9wOwogCisJaWYgKGJ1ZnNpeiA8IFRQTV9IRUFERVJfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlpZiAoYnVmc2l6ID4gVFBNX0JVRlNJWkUpCiAJCWJ1ZnNpeiA9IFRQTV9CVUZTSVpFOwogCkBAIC0zNTAsNyArMzUzLDggQEAKIAkJcmV0dXJuIC1FMkJJRzsKIAl9CiAKLQltdXRleF9sb2NrKCZjaGlwLT50cG1fbXV0ZXgpOworCWlmICghKGZsYWdzICYgVFBNX1RSQU5TTUlUX1VOTE9DS0VEKSkKKwkJbXV0ZXhfbG9jaygmY2hpcC0+dHBtX211dGV4KTsKIAogCXJjID0gY2hpcC0+b3BzLT5zZW5kKGNoaXAsICh1OCAqKSBidWYsIGNvdW50KTsKIAlpZiAocmMgPCAwKSB7CkBAIC0zOTMsMjAgKzM5NywyMSBAQAogCQlkZXZfZXJyKCZjaGlwLT5kZXYsCiAJCQkidHBtX3RyYW5zbWl0OiB0cG1fcmVjdjogZXJyb3IgJXpkXG4iLCByYyk7CiBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZjaGlwLT50cG1fbXV0ZXgpOworCWlmICghKGZsYWdzICYgVFBNX1RSQU5TTUlUX1VOTE9DS0VEKSkKKwkJbXV0ZXhfdW5sb2NrKCZjaGlwLT50cG1fbXV0ZXgpOwogCXJldHVybiByYzsKIH0KIAogI2RlZmluZSBUUE1fRElHRVNUX1NJWkUgMjAKICNkZWZpbmUgVFBNX1JFVF9DT0RFX0lEWCA2CiAKLXNzaXplX3QgdHBtX3RyYW5zbWl0X2NtZChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsIHZvaWQgKmNtZCwKLQkJCSBpbnQgbGVuLCBjb25zdCBjaGFyICpkZXNjKQorc3NpemVfdCB0cG1fdHJhbnNtaXRfY21kKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgY29uc3Qgdm9pZCAqY21kLAorCQkJIGludCBsZW4sIHVuc2lnbmVkIGludCBmbGFncywgY29uc3QgY2hhciAqZGVzYykKIHsKLQlzdHJ1Y3QgdHBtX291dHB1dF9oZWFkZXIgKmhlYWRlcjsKKwljb25zdCBzdHJ1Y3QgdHBtX291dHB1dF9oZWFkZXIgKmhlYWRlcjsKIAlpbnQgZXJyOwogCi0JbGVuID0gdHBtX3RyYW5zbWl0KGNoaXAsICh1OCAqKSBjbWQsIGxlbik7CisJbGVuID0gdHBtX3RyYW5zbWl0KGNoaXAsIChjb25zdCB1OCAqKWNtZCwgbGVuLCBmbGFncyk7CiAJaWYgKGxlbiA8ICAwKQogCQlyZXR1cm4gbGVuOwogCWVsc2UgaWYgKGxlbiA8IFRQTV9IRUFERVJfU0laRSkKQEAgLTQ1MywyNiArNDU4LDEzIEBACiAJCXRwbV9jbWQucGFyYW1zLmdldGNhcF9pbi5zdWJjYXBfc2l6ZSA9IGNwdV90b19iZTMyKDQpOwogCQl0cG1fY21kLnBhcmFtcy5nZXRjYXBfaW4uc3ViY2FwID0gc3ViY2FwX2lkOwogCX0KLQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJnRwbV9jbWQsIFRQTV9JTlRFUk5BTF9SRVNVTFRfU0laRSwgZGVzYyk7CisJcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZ0cG1fY21kLCBUUE1fSU5URVJOQUxfUkVTVUxUX1NJWkUsIDAsCisJCQkgICAgICBkZXNjKTsKIAlpZiAoIXJjKQogCQkqY2FwID0gdHBtX2NtZC5wYXJhbXMuZ2V0Y2FwX291dC5jYXA7CiAJcmV0dXJuIHJjOwogfQotCi12b2lkIHRwbV9nZW5faW50ZXJydXB0KHN0cnVjdCB0cG1fY2hpcCAqY2hpcCkKLXsKLQlzdHJ1Y3QJdHBtX2NtZF90IHRwbV9jbWQ7Ci0Jc3NpemVfdCByYzsKLQotCXRwbV9jbWQuaGVhZGVyLmluID0gdHBtX2dldGNhcF9oZWFkZXI7Ci0JdHBtX2NtZC5wYXJhbXMuZ2V0Y2FwX2luLmNhcCA9IFRQTV9DQVBfUFJPUDsKLQl0cG1fY21kLnBhcmFtcy5nZXRjYXBfaW4uc3ViY2FwX3NpemUgPSBjcHVfdG9fYmUzMig0KTsKLQl0cG1fY21kLnBhcmFtcy5nZXRjYXBfaW4uc3ViY2FwID0gVFBNX0NBUF9QUk9QX1RJU19USU1FT1VUOwotCi0JcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZ0cG1fY21kLCBUUE1fSU5URVJOQUxfUkVTVUxUX1NJWkUsCi0JCQkgICAgICAiYXR0ZW1wdGluZyB0byBkZXRlcm1pbmUgdGhlIHRpbWVvdXRzIik7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh0cG1fZ2VuX2ludGVycnVwdCk7CitFWFBPUlRfU1lNQk9MX0dQTCh0cG1fZ2V0Y2FwKTsKIAogI2RlZmluZSBUUE1fT1JEX1NUQVJUVVAgY3B1X3RvX2JlMzIoMTUzKQogI2RlZmluZSBUUE1fU1RfQ0xFQVIgY3B1X3RvX2JlMTYoMSkKQEAgLTQ5MCw3ICs0ODIsNyBAQAogCXN0YXJ0X2NtZC5oZWFkZXIuaW4gPSB0cG1fc3RhcnR1cF9oZWFkZXI7CiAKIAlzdGFydF9jbWQucGFyYW1zLnN0YXJ0dXBfaW4uc3RhcnR1cF90eXBlID0gc3RhcnR1cF90eXBlOwotCXJldHVybiB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZzdGFydF9jbWQsIFRQTV9JTlRFUk5BTF9SRVNVTFRfU0laRSwKKwlyZXR1cm4gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmc3RhcnRfY21kLCBUUE1fSU5URVJOQUxfUkVTVUxUX1NJWkUsIDAsCiAJCQkJImF0dGVtcHRpbmcgdG8gc3RhcnQgdGhlIFRQTSIpOwogfQogCkBAIC01MjEsNyArNTEzLDggQEAKIAl0cG1fY21kLnBhcmFtcy5nZXRjYXBfaW4uY2FwID0gVFBNX0NBUF9QUk9QOwogCXRwbV9jbWQucGFyYW1zLmdldGNhcF9pbi5zdWJjYXBfc2l6ZSA9IGNwdV90b19iZTMyKDQpOwogCXRwbV9jbWQucGFyYW1zLmdldGNhcF9pbi5zdWJjYXAgPSBUUE1fQ0FQX1BST1BfVElTX1RJTUVPVVQ7Ci0JcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZ0cG1fY21kLCBUUE1fSU5URVJOQUxfUkVTVUxUX1NJWkUsIE5VTEwpOworCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmdHBtX2NtZCwgVFBNX0lOVEVSTkFMX1JFU1VMVF9TSVpFLCAwLAorCQkJICAgICAgTlVMTCk7CiAKIAlpZiAocmMgPT0gVFBNX0VSUl9JTlZBTElEX1BPU1RJTklUKSB7CiAJCS8qIFRoZSBUUE0gaXMgbm90IHN0YXJ0ZWQsIHdlIGFyZSB0aGUgZmlyc3QgdG8gdGFsayB0byBpdC4KQEAgLTUzNSw3ICs1MjgsNyBAQAogCQl0cG1fY21kLnBhcmFtcy5nZXRjYXBfaW4uc3ViY2FwX3NpemUgPSBjcHVfdG9fYmUzMig0KTsKIAkJdHBtX2NtZC5wYXJhbXMuZ2V0Y2FwX2luLnN1YmNhcCA9IFRQTV9DQVBfUFJPUF9USVNfVElNRU9VVDsKIAkJcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZ0cG1fY21kLCBUUE1fSU5URVJOQUxfUkVTVUxUX1NJWkUsCi0JCQkJICBOVUxMKTsKKwkJCQkgICAgICAwLCBOVUxMKTsKIAl9CiAJaWYgKHJjKSB7CiAJCWRldl9lcnIoJmNoaXAtPmRldiwKQEAgLTU5Niw3ICs1ODksNyBAQAogCXRwbV9jbWQucGFyYW1zLmdldGNhcF9pbi5zdWJjYXBfc2l6ZSA9IGNwdV90b19iZTMyKDQpOwogCXRwbV9jbWQucGFyYW1zLmdldGNhcF9pbi5zdWJjYXAgPSBUUE1fQ0FQX1BST1BfVElTX0RVUkFUSU9OOwogCi0JcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZ0cG1fY21kLCBUUE1fSU5URVJOQUxfUkVTVUxUX1NJWkUsCisJcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZ0cG1fY21kLCBUUE1fSU5URVJOQUxfUkVTVUxUX1NJWkUsIDAsCiAJCQkgICAgICAiYXR0ZW1wdGluZyB0byBkZXRlcm1pbmUgdGhlIGR1cmF0aW9ucyIpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwpAQCAtNjMzLDcgKzYyNiw3IEBACiAjZGVmaW5lIFRQTV9PUkRfQ09OVElOVUVfU0VMRlRFU1QgODMKICNkZWZpbmUgQ09OVElOVUVfU0VMRlRFU1RfUkVTVUxUX1NJWkUgMTAKIAotc3RhdGljIHN0cnVjdCB0cG1faW5wdXRfaGVhZGVyIGNvbnRpbnVlX3NlbGZ0ZXN0X2hlYWRlciA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHBtX2lucHV0X2hlYWRlciBjb250aW51ZV9zZWxmdGVzdF9oZWFkZXIgPSB7CiAJLnRhZyA9IFRQTV9UQUdfUlFVX0NPTU1BTkQsCiAJLmxlbmd0aCA9IGNwdV90b19iZTMyKDEwKSwKIAkub3JkaW5hbCA9IGNwdV90b19iZTMyKFRQTV9PUkRfQ09OVElOVUVfU0VMRlRFU1QpLApAQCAtNjUyLDE0ICs2NDUsMTQgQEAKIAlzdHJ1Y3QgdHBtX2NtZF90IGNtZDsKIAogCWNtZC5oZWFkZXIuaW4gPSBjb250aW51ZV9zZWxmdGVzdF9oZWFkZXI7Ci0JcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIENPTlRJTlVFX1NFTEZURVNUX1JFU1VMVF9TSVpFLAorCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmY21kLCBDT05USU5VRV9TRUxGVEVTVF9SRVNVTFRfU0laRSwgMCwKIAkJCSAgICAgICJjb250aW51ZSBzZWxmdGVzdCIpOwogCXJldHVybiByYzsKIH0KIAogI2RlZmluZSBUUE1fT1JESU5BTF9QQ1JSRUFEIGNwdV90b19iZTMyKDIxKQogI2RlZmluZSBSRUFEX1BDUl9SRVNVTFRfU0laRSAzMAotc3RhdGljIHN0cnVjdCB0cG1faW5wdXRfaGVhZGVyIHBjcnJlYWRfaGVhZGVyID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cG1faW5wdXRfaGVhZGVyIHBjcnJlYWRfaGVhZGVyID0gewogCS50YWcgPSBUUE1fVEFHX1JRVV9DT01NQU5ELAogCS5sZW5ndGggPSBjcHVfdG9fYmUzMigxNCksCiAJLm9yZGluYWwgPSBUUE1fT1JESU5BTF9QQ1JSRUFECkBAIC02NzIsNyArNjY1LDcgQEAKIAogCWNtZC5oZWFkZXIuaW4gPSBwY3JyZWFkX2hlYWRlcjsKIAljbWQucGFyYW1zLnBjcnJlYWRfaW4ucGNyX2lkeCA9IGNwdV90b19iZTMyKHBjcl9pZHgpOwotCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmY21kLCBSRUFEX1BDUl9SRVNVTFRfU0laRSwKKwlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgUkVBRF9QQ1JfUkVTVUxUX1NJWkUsIDAsCiAJCQkgICAgICAiYXR0ZW1wdGluZyB0byByZWFkIGEgcGNyIHZhbHVlIik7CiAKIAlpZiAocmMgPT0gMCkKQEAgLTc0NSw3ICs3MzgsNyBAQAogICovCiAjZGVmaW5lIFRQTV9PUkRfUENSX0VYVEVORCBjcHVfdG9fYmUzMigyMCkKICNkZWZpbmUgRVhURU5EX1BDUl9SRVNVTFRfU0laRSAzNAotc3RhdGljIHN0cnVjdCB0cG1faW5wdXRfaGVhZGVyIHBjcmV4dGVuZF9oZWFkZXIgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRwbV9pbnB1dF9oZWFkZXIgcGNyZXh0ZW5kX2hlYWRlciA9IHsKIAkudGFnID0gVFBNX1RBR19SUVVfQ09NTUFORCwKIAkubGVuZ3RoID0gY3B1X3RvX2JlMzIoMzQpLAogCS5vcmRpbmFsID0gVFBNX09SRF9QQ1JfRVhURU5ECkBAIC03NzAsNyArNzYzLDcgQEAKIAljbWQuaGVhZGVyLmluID0gcGNyZXh0ZW5kX2hlYWRlcjsKIAljbWQucGFyYW1zLnBjcmV4dGVuZF9pbi5wY3JfaWR4ID0gY3B1X3RvX2JlMzIocGNyX2lkeCk7CiAJbWVtY3B5KGNtZC5wYXJhbXMucGNyZXh0ZW5kX2luLmhhc2gsIGhhc2gsIFRQTV9ESUdFU1RfU0laRSk7Ci0JcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIEVYVEVORF9QQ1JfUkVTVUxUX1NJWkUsCisJcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIEVYVEVORF9QQ1JfUkVTVUxUX1NJWkUsIDAsCiAJCQkgICAgICAiYXR0ZW1wdGluZyBleHRlbmQgYSBQQ1IgdmFsdWUiKTsKIAogCXRwbV9wdXRfb3BzKGNoaXApOwpAQCAtNzkyLDcgKzc4NSw3IEBACiAJdW5zaWduZWQgaW50IGxvb3BzOwogCXVuc2lnbmVkIGludCBkZWxheV9tc2VjID0gMTAwOwogCXVuc2lnbmVkIGxvbmcgZHVyYXRpb247Ci0Jc3RydWN0IHRwbV9jbWRfdCBjbWQ7CisJdTggZHVtbXlbVFBNX0RJR0VTVF9TSVpFXTsKIAogCWR1cmF0aW9uID0gdHBtX2NhbGNfb3JkaW5hbF9kdXJhdGlvbihjaGlwLCBUUE1fT1JEX0NPTlRJTlVFX1NFTEZURVNUKTsKIApAQCAtODA3LDkgKzgwMCw4IEBACiAKIAlkbyB7CiAJCS8qIEF0dGVtcHQgdG8gcmVhZCBhIFBDUiB2YWx1ZSAqLwotCQljbWQuaGVhZGVyLmluID0gcGNycmVhZF9oZWFkZXI7Ci0JCWNtZC5wYXJhbXMucGNycmVhZF9pbi5wY3JfaWR4ID0gY3B1X3RvX2JlMzIoMCk7Ci0JCXJjID0gdHBtX3RyYW5zbWl0KGNoaXAsICh1OCAqKSAmY21kLCBSRUFEX1BDUl9SRVNVTFRfU0laRSk7CisJCXJjID0gdHBtX3Bjcl9yZWFkX2RldihjaGlwLCAwLCBkdW1teSk7CisKIAkJLyogU29tZSBidWdneSBUUE1zIHdpbGwgbm90IHJlc3BvbmQgdG8gdHBtX3Rpc19yZWFkeSgpIGZvcgogCQkgKiBhcm91bmQgMzAwbXMgd2hpbGUgdGhlIHNlbGYgdGVzdCBpcyBvbmdvaW5nLCBrZWVwIHRyeWluZwogCQkgKiB1bnRpbCB0aGUgc2VsZiB0ZXN0IGR1cmF0aW9uIGV4cGlyZXMuICovCkBAIC04MjQsNyArODE2LDYgQEAKIAkJaWYgKHJjIDwgVFBNX0hFQURFUl9TSVpFKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKLQkJcmMgPSBiZTMyX3RvX2NwdShjbWQuaGVhZGVyLm91dC5yZXR1cm5fY29kZSk7CiAJCWlmIChyYyA9PSBUUE1fRVJSX0RJU0FCTEVEIHx8IHJjID09IFRQTV9FUlJfREVBQ1RJVkFURUQpIHsKIAkJCWRldl9pbmZvKCZjaGlwLT5kZXYsCiAJCQkJICJUUE0gaXMgZGlzYWJsZWQvZGVhY3RpdmF0ZWQgKDB4JVgpXG4iLCByYyk7CkBAIC04NzksNyArODcwLDcgQEAKIAlpZiAoY2hpcCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCBjbWQsIGJ1ZmxlbiwgImF0dGVtcHRpbmcgdHBtX2NtZCIpOworCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCBjbWQsIGJ1ZmxlbiwgMCwgImF0dGVtcHRpbmcgdHBtX2NtZCIpOwogCiAJdHBtX3B1dF9vcHMoY2hpcCk7CiAJcmV0dXJuIHJjOwpAQCAtOTQ5LDcgKzk0MCw3IEBACiAjZGVmaW5lIFRQTV9PUkRfU0FWRVNUQVRFIGNwdV90b19iZTMyKDE1MikKICNkZWZpbmUgU0FWRVNUQVRFX1JFU1VMVF9TSVpFIDEwCiAKLXN0YXRpYyBzdHJ1Y3QgdHBtX2lucHV0X2hlYWRlciBzYXZlc3RhdGVfaGVhZGVyID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cG1faW5wdXRfaGVhZGVyIHNhdmVzdGF0ZV9oZWFkZXIgPSB7CiAJLnRhZyA9IFRQTV9UQUdfUlFVX0NPTU1BTkQsCiAJLmxlbmd0aCA9IGNwdV90b19iZTMyKDEwKSwKIAkub3JkaW5hbCA9IFRQTV9PUkRfU0FWRVNUQVRFCkBAIC05ODEsMTQgKzk3MiwxNSBAQAogCQljbWQucGFyYW1zLnBjcmV4dGVuZF9pbi5wY3JfaWR4ID0gY3B1X3RvX2JlMzIodHBtX3N1c3BlbmRfcGNyKTsKIAkJbWVtY3B5KGNtZC5wYXJhbXMucGNyZXh0ZW5kX2luLmhhc2gsIGR1bW15X2hhc2gsCiAJCSAgICAgICBUUE1fRElHRVNUX1NJWkUpOwotCQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgRVhURU5EX1BDUl9SRVNVTFRfU0laRSwKKwkJcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIEVYVEVORF9QQ1JfUkVTVUxUX1NJWkUsIDAsCiAJCQkJICAgICAgImV4dGVuZGluZyBkdW1teSBwY3IgYmVmb3JlIHN1c3BlbmQiKTsKIAl9CiAKIAkvKiBub3cgZG8gdGhlIGFjdHVhbCBzYXZlc3RhdGUgKi8KIAlmb3IgKHRyeSA9IDA7IHRyeSA8IFRQTV9SRVRSWTsgdHJ5KyspIHsKIAkJY21kLmhlYWRlci5pbiA9IHNhdmVzdGF0ZV9oZWFkZXI7Ci0JCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmY21kLCBTQVZFU1RBVEVfUkVTVUxUX1NJWkUsIE5VTEwpOworCQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgU0FWRVNUQVRFX1JFU1VMVF9TSVpFLCAwLAorCQkJCSAgICAgIE5VTEwpOwogCiAJCS8qCiAJCSAqIElmIHRoZSBUUE0gaW5kaWNhdGVzIHRoYXQgaXQgaXMgdG9vIGJ1c3kgdG8gcmVzcG9uZCB0bwpAQCAtMTAzMiw3ICsxMDI0LDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHRwbV9wbV9yZXN1bWUpOwogCiAjZGVmaW5lIFRQTV9HRVRSQU5ET01fUkVTVUxUX1NJWkUJMTgKLXN0YXRpYyBzdHJ1Y3QgdHBtX2lucHV0X2hlYWRlciB0cG1fZ2V0cmFuZG9tX2hlYWRlciA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHBtX2lucHV0X2hlYWRlciB0cG1fZ2V0cmFuZG9tX2hlYWRlciA9IHsKIAkudGFnID0gVFBNX1RBR19SUVVfQ09NTUFORCwKIAkubGVuZ3RoID0gY3B1X3RvX2JlMzIoMTQpLAogCS5vcmRpbmFsID0gVFBNX09SRF9HRVRfUkFORE9NCkBAIC0xMDcyLDggKzEwNjQsOCBAQAogCQl0cG1fY21kLnBhcmFtcy5nZXRyYW5kb21faW4ubnVtX2J5dGVzID0gY3B1X3RvX2JlMzIobnVtX2J5dGVzKTsKIAogCQllcnIgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZ0cG1fY21kLAotCQkJCSAgIFRQTV9HRVRSQU5ET01fUkVTVUxUX1NJWkUgKyBudW1fYnl0ZXMsCi0JCQkJICAgImF0dGVtcHRpbmcgZ2V0IHJhbmRvbSIpOworCQkJCSAgICAgICBUUE1fR0VUUkFORE9NX1JFU1VMVF9TSVpFICsgbnVtX2J5dGVzLAorCQkJCSAgICAgICAwLCAiYXR0ZW1wdGluZyBnZXQgcmFuZG9tIik7CiAJCWlmIChlcnIpCiAJCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS90cG0tc3lzZnMuYyBiL2RyaXZlcnMvY2hhci90cG0vdHBtLXN5c2ZzLmMKaW5kZXggYjQ2Y2Y3MC4uYTc2YWI0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS90cG0tc3lzZnMuYworKysgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbS1zeXNmcy5jCkBAIC0yMiw3ICsyMiw3IEBACiAKICNkZWZpbmUgUkVBRF9QVUJFS19SRVNVTFRfU0laRSAzMTQKICNkZWZpbmUgVFBNX09SRF9SRUFEUFVCRUsgY3B1X3RvX2JlMzIoMTI0KQotc3RhdGljIHN0cnVjdCB0cG1faW5wdXRfaGVhZGVyIHRwbV9yZWFkcHViZWtfaGVhZGVyID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cG1faW5wdXRfaGVhZGVyIHRwbV9yZWFkcHViZWtfaGVhZGVyID0gewogCS50YWcgPSBUUE1fVEFHX1JRVV9DT01NQU5ELAogCS5sZW5ndGggPSBjcHVfdG9fYmUzMigzMCksCiAJLm9yZGluYWwgPSBUUE1fT1JEX1JFQURQVUJFSwpAQCAtMzksNyArMzksNyBAQAogCXN0cnVjdCB0cG1fY2hpcCAqY2hpcCA9IHRvX3RwbV9jaGlwKGRldik7CiAKIAl0cG1fY21kLmhlYWRlci5pbiA9IHRwbV9yZWFkcHViZWtfaGVhZGVyOwotCWVyciA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJnRwbV9jbWQsIFJFQURfUFVCRUtfUkVTVUxUX1NJWkUsCisJZXJyID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmdHBtX2NtZCwgUkVBRF9QVUJFS19SRVNVTFRfU0laRSwgMCwKIAkJCSAgICAgICAiYXR0ZW1wdGluZyB0byByZWFkIHRoZSBQVUJFSyIpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS90cG0uaCBiL2RyaXZlcnMvY2hhci90cG0vdHBtLmgKaW5kZXggM2UzMmQ1Yi4uNGQxODNjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS90cG0uaAorKysgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbS5oCkBAIC00NzYsMzIgKzQ3NiwzNSBAQAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHBtX2ZvcHM7CiBleHRlcm4gc3RydWN0IGlkciBkZXZfbnVtc19pZHI7CiAKK2VudW0gdHBtX3RyYW5zbWl0X2ZsYWdzIHsKKwlUUE1fVFJBTlNNSVRfVU5MT0NLRUQJPSBCSVQoMCksCit9OworCitzc2l6ZV90IHRwbV90cmFuc21pdChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsIGNvbnN0IHU4ICpidWYsIHNpemVfdCBidWZzaXosCisJCSAgICAgdW5zaWduZWQgaW50IGZsYWdzKTsKK3NzaXplX3QgdHBtX3RyYW5zbWl0X2NtZChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsIGNvbnN0IHZvaWQgKmNtZCwgaW50IGxlbiwKKwkJCSB1bnNpZ25lZCBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRlc2MpOwogc3NpemVfdCB0cG1fZ2V0Y2FwKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgX19iZTMyIHN1YmNhcF9pZCwgY2FwX3QgKmNhcCwKIAkJICAgY29uc3QgY2hhciAqZGVzYyk7Ci1zc2l6ZV90IHRwbV90cmFuc21pdChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJICAgICBzaXplX3QgYnVmc2l6KTsKLXNzaXplX3QgdHBtX3RyYW5zbWl0X2NtZChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsIHZvaWQgKmNtZCwgaW50IGxlbiwKLQkJCSBjb25zdCBjaGFyICpkZXNjKTsKLWV4dGVybiBpbnQgdHBtX2dldF90aW1lb3V0cyhzdHJ1Y3QgdHBtX2NoaXAgKik7Ci1leHRlcm4gdm9pZCB0cG1fZ2VuX2ludGVycnVwdChzdHJ1Y3QgdHBtX2NoaXAgKik7CitpbnQgdHBtX2dldF90aW1lb3V0cyhzdHJ1Y3QgdHBtX2NoaXAgKik7CiBpbnQgdHBtMV9hdXRvX3N0YXJ0dXAoc3RydWN0IHRwbV9jaGlwICpjaGlwKTsKLWV4dGVybiBpbnQgdHBtX2RvX3NlbGZ0ZXN0KHN0cnVjdCB0cG1fY2hpcCAqKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIHRwbV9jYWxjX29yZGluYWxfZHVyYXRpb24oc3RydWN0IHRwbV9jaGlwICosIHUzMik7Ci1leHRlcm4gaW50IHRwbV9wbV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKik7Ci1leHRlcm4gaW50IHRwbV9wbV9yZXN1bWUoc3RydWN0IGRldmljZSAqKTsKLWV4dGVybiBpbnQgd2FpdF9mb3JfdHBtX3N0YXQoc3RydWN0IHRwbV9jaGlwICosIHU4LCB1bnNpZ25lZCBsb25nLAotCQkJICAgICB3YWl0X3F1ZXVlX2hlYWRfdCAqLCBib29sKTsKK2ludCB0cG1fZG9fc2VsZnRlc3Qoc3RydWN0IHRwbV9jaGlwICpjaGlwKTsKK3Vuc2lnbmVkIGxvbmcgdHBtX2NhbGNfb3JkaW5hbF9kdXJhdGlvbihzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsIHUzMiBvcmRpbmFsKTsKK2ludCB0cG1fcG1fc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpOworaW50IHRwbV9wbV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KTsKK2ludCB3YWl0X2Zvcl90cG1fc3RhdChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsIHU4IG1hc2ssIHVuc2lnbmVkIGxvbmcgdGltZW91dCwKKwkJICAgICAgd2FpdF9xdWV1ZV9oZWFkX3QgKnF1ZXVlLCBib29sIGNoZWNrX2NhbmNlbCk7CiAKIHN0cnVjdCB0cG1fY2hpcCAqdHBtX2NoaXBfZmluZF9nZXQoaW50IGNoaXBfbnVtKTsKIF9fbXVzdF9jaGVjayBpbnQgdHBtX3RyeV9nZXRfb3BzKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCk7CiB2b2lkIHRwbV9wdXRfb3BzKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCk7CiAKLWV4dGVybiBzdHJ1Y3QgdHBtX2NoaXAgKnRwbV9jaGlwX2FsbG9jKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgICAgY29uc3Qgc3RydWN0IHRwbV9jbGFzc19vcHMgKm9wcyk7Ci1leHRlcm4gc3RydWN0IHRwbV9jaGlwICp0cG1tX2NoaXBfYWxsb2Moc3RydWN0IGRldmljZSAqcGRldiwKLQkJCQkgICAgICAgY29uc3Qgc3RydWN0IHRwbV9jbGFzc19vcHMgKm9wcyk7Ci1leHRlcm4gaW50IHRwbV9jaGlwX3JlZ2lzdGVyKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCk7Ci1leHRlcm4gdm9pZCB0cG1fY2hpcF91bnJlZ2lzdGVyKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCk7CitzdHJ1Y3QgdHBtX2NoaXAgKnRwbV9jaGlwX2FsbG9jKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQljb25zdCBzdHJ1Y3QgdHBtX2NsYXNzX29wcyAqb3BzKTsKK3N0cnVjdCB0cG1fY2hpcCAqdHBtbV9jaGlwX2FsbG9jKHN0cnVjdCBkZXZpY2UgKnBkZXYsCisJCQkJIGNvbnN0IHN0cnVjdCB0cG1fY2xhc3Nfb3BzICpvcHMpOworaW50IHRwbV9jaGlwX3JlZ2lzdGVyKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCk7Cit2b2lkIHRwbV9jaGlwX3VucmVnaXN0ZXIoc3RydWN0IHRwbV9jaGlwICpjaGlwKTsKIAogdm9pZCB0cG1fc3lzZnNfYWRkX2RldmljZShzdHJ1Y3QgdHBtX2NoaXAgKmNoaXApOwogCkBAIC01MjgsOCArNTMxLDcgQEAKIAkJCXUzMiAqdmFsdWUsIGNvbnN0IGNoYXIgKmRlc2MpOwogCiBpbnQgdHBtMl9hdXRvX3N0YXJ0dXAoc3RydWN0IHRwbV9jaGlwICpjaGlwKTsKLWV4dGVybiB2b2lkIHRwbTJfc2h1dGRvd24oc3RydWN0IHRwbV9jaGlwICpjaGlwLCB1MTYgc2h1dGRvd25fdHlwZSk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyB0cG0yX2NhbGNfb3JkaW5hbF9kdXJhdGlvbihzdHJ1Y3QgdHBtX2NoaXAgKiwgdTMyKTsKLWV4dGVybiBpbnQgdHBtMl9nZW5faW50ZXJydXB0KHN0cnVjdCB0cG1fY2hpcCAqY2hpcCk7Ci1leHRlcm4gaW50IHRwbTJfcHJvYmUoc3RydWN0IHRwbV9jaGlwICpjaGlwKTsKK3ZvaWQgdHBtMl9zaHV0ZG93bihzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsIHUxNiBzaHV0ZG93bl90eXBlKTsKK3Vuc2lnbmVkIGxvbmcgdHBtMl9jYWxjX29yZGluYWxfZHVyYXRpb24oc3RydWN0IHRwbV9jaGlwICpjaGlwLCB1MzIgb3JkaW5hbCk7CitpbnQgdHBtMl9wcm9iZShzdHJ1Y3QgdHBtX2NoaXAgKmNoaXApOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbTItY21kLmMgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbTItY21kLmMKaW5kZXggMDhjN2UyMy4uN2RmNTVkNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90cG0vdHBtMi1jbWQuYworKysgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbTItY21kLmMKQEAgLTI4Miw3ICsyODIsNyBAQAogCSAgICAgICBzaXplb2YoY21kLnBhcmFtcy5wY3JyZWFkX2luLnBjcl9zZWxlY3QpKTsKIAljbWQucGFyYW1zLnBjcnJlYWRfaW4ucGNyX3NlbGVjdFtwY3JfaWR4ID4+IDNdID0gMSA8PCAocGNyX2lkeCAmIDB4Nyk7CiAKLQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgc2l6ZW9mKGNtZCksCisJcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIHNpemVvZihjbWQpLCAwLAogCQkJICAgICAgImF0dGVtcHRpbmcgdG8gcmVhZCBhIHBjciB2YWx1ZSIpOwogCWlmIChyYyA9PSAwKSB7CiAJCWJ1ZiA9IGNtZC5wYXJhbXMucGNycmVhZF9vdXQuZGlnZXN0OwpAQCAtMzMwLDcgKzMzMCw3IEBACiAJY21kLnBhcmFtcy5wY3JleHRlbmRfaW4uaGFzaF9hbGcgPSBjcHVfdG9fYmUxNihUUE0yX0FMR19TSEExKTsKIAltZW1jcHkoY21kLnBhcmFtcy5wY3JleHRlbmRfaW4uZGlnZXN0LCBoYXNoLCBUUE1fRElHRVNUX1NJWkUpOwogCi0JcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIHNpemVvZihjbWQpLAorCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmY21kLCBzaXplb2YoY21kKSwgMCwKIAkJCSAgICAgICJhdHRlbXB0aW5nIGV4dGVuZCBhIFBDUiB2YWx1ZSIpOwogCiAJcmV0dXJuIHJjOwpAQCAtMzc2LDcgKzM3Niw3IEBACiAJCWNtZC5oZWFkZXIuaW4gPSB0cG0yX2dldHJhbmRvbV9oZWFkZXI7CiAJCWNtZC5wYXJhbXMuZ2V0cmFuZG9tX2luLnNpemUgPSBjcHVfdG9fYmUxNihudW1fYnl0ZXMpOwogCi0JCWVyciA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgc2l6ZW9mKGNtZCksCisJCWVyciA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgc2l6ZW9mKGNtZCksIDAsCiAJCQkJICAgICAgICJhdHRlbXB0aW5nIGdldCByYW5kb20iKTsKIAkJaWYgKGVycikKIAkJCWJyZWFrOwpAQCAtNDM0LDEyICs0MzQsMTIgQEAKIH0KIAogLyoqCi0gKiB0cG0yX3NlYWxfdHJ1c3RlZCgpIC0gc2VhbCBhIHRydXN0ZWQga2V5Ci0gKiBAY2hpcF9udW06IEEgc3BlY2lmaWMgY2hpcCBudW1iZXIgZm9yIHRoZSByZXF1ZXN0IG9yIFRQTV9BTllfTlVNCi0gKiBAb3B0aW9uczogYXV0aGVudGljYXRpb24gdmFsdWVzIGFuZCBvdGhlciBvcHRpb25zCisgKiB0cG0yX3NlYWxfdHJ1c3RlZCgpIC0gc2VhbCB0aGUgcGF5bG9hZCBvZiBhIHRydXN0ZWQga2V5CisgKiBAY2hpcF9udW06IFRQTSBjaGlwIHRvIHVzZQogICogQHBheWxvYWQ6IHRoZSBrZXkgZGF0YSBpbiBjbGVhciBhbmQgZW5jcnlwdGVkIGZvcm0KKyAqIEBvcHRpb25zOiBhdXRoZW50aWNhdGlvbiB2YWx1ZXMgYW5kIG90aGVyIG9wdGlvbnMKICAqCi0gKiBSZXR1cm5zIDwgMCBvbiBlcnJvciBhbmQgMCBvbiBzdWNjZXNzLgorICogUmV0dXJuOiA8IDAgb24gZXJyb3IgYW5kIDAgb24gc3VjY2Vzcy4KICAqLwogaW50IHRwbTJfc2VhbF90cnVzdGVkKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwKIAkJICAgICAgc3RydWN0IHRydXN0ZWRfa2V5X3BheWxvYWQgKnBheWxvYWQsCkBAIC01MTIsNyArNTEyLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsIGJ1Zi5kYXRhLCBQQUdFX1NJWkUsICJzZWFsaW5nIGRhdGEiKTsKKwlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgYnVmLmRhdGEsIFBBR0VfU0laRSwgMCwgInNlYWxpbmcgZGF0YSIpOwogCWlmIChyYykKIAkJZ290byBvdXQ7CiAKQEAgLTUzOCwxMCArNTM4LDE4IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IHRwbTJfbG9hZChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsCi0JCSAgICAgc3RydWN0IHRydXN0ZWRfa2V5X3BheWxvYWQgKnBheWxvYWQsCi0JCSAgICAgc3RydWN0IHRydXN0ZWRfa2V5X29wdGlvbnMgKm9wdGlvbnMsCi0JCSAgICAgdTMyICpibG9iX2hhbmRsZSkKKy8qKgorICogdHBtMl9sb2FkX2NtZCgpIC0gZXhlY3V0ZSBhIFRQTTJfTG9hZCBjb21tYW5kCisgKiBAY2hpcF9udW06IFRQTSBjaGlwIHRvIHVzZQorICogQHBheWxvYWQ6IHRoZSBrZXkgZGF0YSBpbiBjbGVhciBhbmQgZW5jcnlwdGVkIGZvcm0KKyAqIEBvcHRpb25zOiBhdXRoZW50aWNhdGlvbiB2YWx1ZXMgYW5kIG90aGVyIG9wdGlvbnMKKyAqCisgKiBSZXR1cm46IHNhbWUgYXMgd2l0aCB0cG1fdHJhbnNtaXRfY21kCisgKi8KK3N0YXRpYyBpbnQgdHBtMl9sb2FkX2NtZChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsCisJCQkgc3RydWN0IHRydXN0ZWRfa2V5X3BheWxvYWQgKnBheWxvYWQsCisJCQkgc3RydWN0IHRydXN0ZWRfa2V5X29wdGlvbnMgKm9wdGlvbnMsCisJCQkgdTMyICpibG9iX2hhbmRsZSwgdW5zaWduZWQgaW50IGZsYWdzKQogewogCXN0cnVjdCB0cG1fYnVmIGJ1ZjsKIAl1bnNpZ25lZCBpbnQgcHJpdmF0ZV9sZW47CkBAIC01NzYsNyArNTg0LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsIGJ1Zi5kYXRhLCBQQUdFX1NJWkUsICJsb2FkaW5nIGJsb2IiKTsKKwlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgYnVmLmRhdGEsIFBBR0VfU0laRSwgZmxhZ3MsICJsb2FkaW5nIGJsb2IiKTsKIAlpZiAoIXJjKQogCQkqYmxvYl9oYW5kbGUgPSBiZTMyX3RvX2NwdXAoCiAJCQkoX19iZTMyICopICZidWYuZGF0YVtUUE1fSEVBREVSX1NJWkVdKTsKQEAgLTU5MCw3ICs1OTgsMTYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyB2b2lkIHRwbTJfZmx1c2hfY29udGV4dChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsIHUzMiBoYW5kbGUpCisvKioKKyAqIHRwbTJfZmx1c2hfY29udGV4dF9jbWQoKSAtIGV4ZWN1dGUgYSBUUE0yX0ZsdXNoQ29udGV4dCBjb21tYW5kCisgKiBAY2hpcF9udW06IFRQTSBjaGlwIHRvIHVzZQorICogQHBheWxvYWQ6IHRoZSBrZXkgZGF0YSBpbiBjbGVhciBhbmQgZW5jcnlwdGVkIGZvcm0KKyAqIEBvcHRpb25zOiBhdXRoZW50aWNhdGlvbiB2YWx1ZXMgYW5kIG90aGVyIG9wdGlvbnMKKyAqCisgKiBSZXR1cm46IHNhbWUgYXMgd2l0aCB0cG1fdHJhbnNtaXRfY21kCisgKi8KK3N0YXRpYyB2b2lkIHRwbTJfZmx1c2hfY29udGV4dF9jbWQoc3RydWN0IHRwbV9jaGlwICpjaGlwLCB1MzIgaGFuZGxlLAorCQkJCSAgIHVuc2lnbmVkIGludCBmbGFncykKIHsKIAlzdHJ1Y3QgdHBtX2J1ZiBidWY7CiAJaW50IHJjOwpAQCAtNjA0LDcgKzYyMSw4IEBACiAKIAl0cG1fYnVmX2FwcGVuZF91MzIoJmJ1ZiwgaGFuZGxlKTsKIAotCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCBidWYuZGF0YSwgUEFHRV9TSVpFLCAiZmx1c2hpbmcgY29udGV4dCIpOworCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCBidWYuZGF0YSwgUEFHRV9TSVpFLCBmbGFncywKKwkJCSAgICAgICJmbHVzaGluZyBjb250ZXh0Iik7CiAJaWYgKHJjKQogCQlkZXZfd2FybigmY2hpcC0+ZGV2LCAiMHglMDh4IHdhcyBub3QgZmx1c2hlZCwgcmM9JWRcbiIsIGhhbmRsZSwKIAkJCSByYyk7CkBAIC02MTIsMTAgKzYzMCwxOCBAQAogCXRwbV9idWZfZGVzdHJveSgmYnVmKTsKIH0KIAotc3RhdGljIGludCB0cG0yX3Vuc2VhbChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsCi0JCSAgICAgICBzdHJ1Y3QgdHJ1c3RlZF9rZXlfcGF5bG9hZCAqcGF5bG9hZCwKLQkJICAgICAgIHN0cnVjdCB0cnVzdGVkX2tleV9vcHRpb25zICpvcHRpb25zLAotCQkgICAgICAgdTMyIGJsb2JfaGFuZGxlKQorLyoqCisgKiB0cG0yX3Vuc2VhbF9jbWQoKSAtIGV4ZWN1dGUgYSBUUE0yX1VubG9hZCBjb21tYW5kCisgKiBAY2hpcF9udW06IFRQTSBjaGlwIHRvIHVzZQorICogQHBheWxvYWQ6IHRoZSBrZXkgZGF0YSBpbiBjbGVhciBhbmQgZW5jcnlwdGVkIGZvcm0KKyAqIEBvcHRpb25zOiBhdXRoZW50aWNhdGlvbiB2YWx1ZXMgYW5kIG90aGVyIG9wdGlvbnMKKyAqCisgKiBSZXR1cm46IHNhbWUgYXMgd2l0aCB0cG1fdHJhbnNtaXRfY21kCisgKi8KK3N0YXRpYyBpbnQgdHBtMl91bnNlYWxfY21kKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwKKwkJCSAgIHN0cnVjdCB0cnVzdGVkX2tleV9wYXlsb2FkICpwYXlsb2FkLAorCQkJICAgc3RydWN0IHRydXN0ZWRfa2V5X29wdGlvbnMgKm9wdGlvbnMsCisJCQkgICB1MzIgYmxvYl9oYW5kbGUsIHVuc2lnbmVkIGludCBmbGFncykKIHsKIAlzdHJ1Y3QgdHBtX2J1ZiBidWY7CiAJdTE2IGRhdGFfbGVuOwpAQCAtNjM1LDcgKzY2MSw3IEBACiAJCQkgICAgIG9wdGlvbnMtPmJsb2JhdXRoIC8qIGhtYWMgKi8sCiAJCQkgICAgIFRQTV9ESUdFU1RfU0laRSk7CiAKLQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgYnVmLmRhdGEsIFBBR0VfU0laRSwgInVuc2VhbGluZyIpOworCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCBidWYuZGF0YSwgUEFHRV9TSVpFLCBmbGFncywgInVuc2VhbGluZyIpOwogCWlmIChyYyA+IDApCiAJCXJjID0gLUVQRVJNOwogCkBAIC02NTQsMTIgKzY4MCwxMiBAQAogfQogCiAvKioKLSAqIHRwbV91bnNlYWxfdHJ1c3RlZCgpIC0gdW5zZWFsIGEgdHJ1c3RlZCBrZXkKLSAqIEBjaGlwX251bTogQSBzcGVjaWZpYyBjaGlwIG51bWJlciBmb3IgdGhlIHJlcXVlc3Qgb3IgVFBNX0FOWV9OVU0KLSAqIEBvcHRpb25zOiBhdXRoZW50aWNhdGlvbiB2YWx1ZXMgYW5kIG90aGVyIG9wdGlvbnMKKyAqIHRwbV91bnNlYWxfdHJ1c3RlZCgpIC0gdW5zZWFsIHRoZSBwYXlsb2FkIG9mIGEgdHJ1c3RlZCBrZXkKKyAqIEBjaGlwX251bTogVFBNIGNoaXAgdG8gdXNlCiAgKiBAcGF5bG9hZDogdGhlIGtleSBkYXRhIGluIGNsZWFyIGFuZCBlbmNyeXB0ZWQgZm9ybQorICogQG9wdGlvbnM6IGF1dGhlbnRpY2F0aW9uIHZhbHVlcyBhbmQgb3RoZXIgb3B0aW9ucwogICoKLSAqIFJldHVybnMgPCAwIG9uIGVycm9yIGFuZCAwIG9uIHN1Y2Nlc3MuCisgKiBSZXR1cm46IDwgMCBvbiBlcnJvciBhbmQgMCBvbiBzdWNjZXNzLgogICovCiBpbnQgdHBtMl91bnNlYWxfdHJ1c3RlZChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsCiAJCQlzdHJ1Y3QgdHJ1c3RlZF9rZXlfcGF5bG9hZCAqcGF5bG9hZCwKQEAgLTY2OCwxNCArNjk0LDE3IEBACiAJdTMyIGJsb2JfaGFuZGxlOwogCWludCByYzsKIAotCXJjID0gdHBtMl9sb2FkKGNoaXAsIHBheWxvYWQsIG9wdGlvbnMsICZibG9iX2hhbmRsZSk7CisJbXV0ZXhfbG9jaygmY2hpcC0+dHBtX211dGV4KTsKKwlyYyA9IHRwbTJfbG9hZF9jbWQoY2hpcCwgcGF5bG9hZCwgb3B0aW9ucywgJmJsb2JfaGFuZGxlLAorCQkJICAgVFBNX1RSQU5TTUlUX1VOTE9DS0VEKTsKIAlpZiAocmMpCi0JCXJldHVybiByYzsKKwkJZ290byBvdXQ7CiAKLQlyYyA9IHRwbTJfdW5zZWFsKGNoaXAsIHBheWxvYWQsIG9wdGlvbnMsIGJsb2JfaGFuZGxlKTsKLQotCXRwbTJfZmx1c2hfY29udGV4dChjaGlwLCBibG9iX2hhbmRsZSk7Ci0KKwlyYyA9IHRwbTJfdW5zZWFsX2NtZChjaGlwLCBwYXlsb2FkLCBvcHRpb25zLCBibG9iX2hhbmRsZSwKKwkJCSAgICAgVFBNX1RSQU5TTUlUX1VOTE9DS0VEKTsKKwl0cG0yX2ZsdXNoX2NvbnRleHRfY21kKGNoaXAsIGJsb2JfaGFuZGxlLCBUUE1fVFJBTlNNSVRfVU5MT0NLRUQpOworb3V0OgorCW11dGV4X3VubG9jaygmY2hpcC0+dHBtX211dGV4KTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTcwMSwxMiArNzMwLDEzIEBACiAJY21kLnBhcmFtcy5nZXRfdHBtX3B0X2luLnByb3BlcnR5X2lkID0gY3B1X3RvX2JlMzIocHJvcGVydHlfaWQpOwogCWNtZC5wYXJhbXMuZ2V0X3RwbV9wdF9pbi5wcm9wZXJ0eV9jbnQgPSBjcHVfdG9fYmUzMigxKTsKIAotCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmY21kLCBzaXplb2YoY21kKSwgZGVzYyk7CisJcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIHNpemVvZihjbWQpLCAwLCBkZXNjKTsKIAlpZiAoIXJjKQogCQkqdmFsdWUgPSBiZTMyX3RvX2NwdShjbWQucGFyYW1zLmdldF90cG1fcHRfb3V0LnZhbHVlKTsKIAogCXJldHVybiByYzsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHRwbTJfZ2V0X3RwbV9wdCk7CiAKICNkZWZpbmUgVFBNMl9TVEFSVFVQX0lOX1NJWkUgXAogCShzaXplb2Yoc3RydWN0IHRwbV9pbnB1dF9oZWFkZXIpICsgXApAQCAtNzM1LDcgKzc2NSw3IEBACiAJY21kLmhlYWRlci5pbiA9IHRwbTJfc3RhcnR1cF9oZWFkZXI7CiAKIAljbWQucGFyYW1zLnN0YXJ0dXBfaW4uc3RhcnR1cF90eXBlID0gY3B1X3RvX2JlMTYoc3RhcnR1cF90eXBlKTsKLQlyZXR1cm4gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmY21kLCBzaXplb2YoY21kKSwKKwlyZXR1cm4gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmY21kLCBzaXplb2YoY21kKSwgMCwKIAkJCQkiYXR0ZW1wdGluZyB0byBzdGFydCB0aGUgVFBNIik7CiB9CiAKQEAgLTc2Myw3ICs3OTMsNyBAQAogCWNtZC5oZWFkZXIuaW4gPSB0cG0yX3NodXRkb3duX2hlYWRlcjsKIAljbWQucGFyYW1zLnN0YXJ0dXBfaW4uc3RhcnR1cF90eXBlID0gY3B1X3RvX2JlMTYoc2h1dGRvd25fdHlwZSk7CiAKLQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgc2l6ZW9mKGNtZCksICJzdG9wcGluZyB0aGUgVFBNIik7CisJcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIHNpemVvZihjbWQpLCAwLCAic3RvcHBpbmcgdGhlIFRQTSIpOwogCiAJLyogSW4gcGxhY2VzIHdoZXJlIHNodXRkb3duIGNvbW1hbmQgaXMgc2VudCB0aGVyZSdzIG5vIG11Y2ggd2UgY2FuIGRvCiAJICogZXhjZXB0IHByaW50IHRoZSBlcnJvciBjb2RlIG9uIGEgc3lzdGVtIGZhaWx1cmUuCkBAIC04MjgsNyArODU4LDcgQEAKIAljbWQuaGVhZGVyLmluID0gdHBtMl9zZWxmdGVzdF9oZWFkZXI7CiAJY21kLnBhcmFtcy5zZWxmdGVzdF9pbi5mdWxsX3Rlc3QgPSBmdWxsOwogCi0JcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIFRQTTJfU0VMRl9URVNUX0lOX1NJWkUsCisJcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIFRQTTJfU0VMRl9URVNUX0lOX1NJWkUsIDAsCiAJCQkgICAgICAiY29udGludWUgc2VsZnRlc3QiKTsKIAogCS8qIEF0IGxlYXN0IHNvbWUgcHJvdG90eXBlIGNoaXBzIHNlZW0gdG8gZ2l2ZSBSQ19URVNUSU5HIGVycm9yCkBAIC04ODAsNyArOTEwLDcgQEAKIAkJY21kLnBhcmFtcy5wY3JyZWFkX2luLnBjcl9zZWxlY3RbMV0gPSAweDAwOwogCQljbWQucGFyYW1zLnBjcnJlYWRfaW4ucGNyX3NlbGVjdFsyXSA9IDB4MDA7CiAKLQkJcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICh1OCAqKSAmY21kLCBzaXplb2YoY21kKSwgTlVMTCk7CisJCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmY21kLCBzaXplb2YoY21kKSwgMCwgTlVMTCk7CiAJCWlmIChyYyA8IDApCiAJCQlicmVhazsKIApAQCAtODk1LDIzICs5MjUsNiBAQAogfQogCiAvKioKLSAqIHRwbTJfZ2VuX2ludGVycnVwdCgpIC0gZ2VuZXJhdGUgYW4gaW50ZXJydXB0Ci0gKiBAY2hpcDogVFBNIGNoaXAgdG8gdXNlCi0gKgotICogMCBpcyByZXR1cm5lZCB3aGVuIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC4gSWYgYSBuZWdhdGl2ZSBudW1iZXIgaXMKLSAqIHJldHVybmVkIGl0IHJlbWFya3MgYSBQT1NJWCBlcnJvciBjb2RlLiBJZiBhIHBvc2l0aXZlIG51bWJlciBpcyByZXR1cm5lZAotICogaXQgcmVtYXJrcyBhIFRQTSBlcnJvci4KLSAqLwotaW50IHRwbTJfZ2VuX2ludGVycnVwdChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXApCi17Ci0JdTMyIGR1bW15OwotCi0JcmV0dXJuIHRwbTJfZ2V0X3RwbV9wdChjaGlwLCAweDEwMCwgJmR1bW15LAotCQkJICAgICAgICJhdHRlbXB0aW5nIHRvIGdlbmVyYXRlIGFuIGludGVycnVwdCIpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodHBtMl9nZW5faW50ZXJydXB0KTsKLQotLyoqCiAgKiB0cG0yX3Byb2JlKCkgLSBwcm9iZSBUUE0gMi4wCiAgKiBAY2hpcDogVFBNIGNoaXAgdG8gdXNlCiAgKgpAQCAtOTI4LDExICs5NDEsOSBAQAogCWNtZC5wYXJhbXMuZ2V0X3RwbV9wdF9pbi5wcm9wZXJ0eV9pZCA9IGNwdV90b19iZTMyKDB4MTAwKTsKIAljbWQucGFyYW1zLmdldF90cG1fcHRfaW4ucHJvcGVydHlfY250ID0gY3B1X3RvX2JlMzIoMSk7CiAKLQlyYyA9IHRwbV90cmFuc21pdChjaGlwLCAoY29uc3QgY2hhciAqKSAmY21kLCBzaXplb2YoY21kKSk7CisJcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIHNpemVvZihjbWQpLCAgMCwgTlVMTCk7CiAJaWYgKHJjIDwgIDApCiAJCXJldHVybiByYzsKLQllbHNlIGlmIChyYyA8IFRQTV9IRUFERVJfU0laRSkKLQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlpZiAoYmUxNl90b19jcHUoY21kLmhlYWRlci5vdXQudGFnKSA9PSBUUE0yX1NUX05PX1NFU1NJT05TKQogCQljaGlwLT5mbGFncyB8PSBUUE1fQ0hJUF9GTEFHX1RQTTI7CkBAIC05NTcsNyArOTY4LDcgQEAKIAkJZ290byBvdXQ7CiAKIAlyYyA9IHRwbTJfZG9fc2VsZnRlc3QoY2hpcCk7Ci0JaWYgKHJjICE9IFRQTTJfUkNfSU5JVElBTElaRSkgeworCWlmIChyYyAhPSAwICYmIHJjICE9IFRQTTJfUkNfSU5JVElBTElaRSkgewogCQlkZXZfZXJyKCZjaGlwLT5kZXYsICJUUE0gc2VsZiB0ZXN0IGZhaWxlZFxuIik7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTk3NCw3ICs5ODUsNiBAQAogCQl9CiAJfQogCi0JcmV0dXJuIHJjOwogb3V0OgogCWlmIChyYyA+IDApCiAJCXJjID0gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vdHBtX2NyYi5jIGIvZHJpdmVycy9jaGFyL3RwbS90cG1fY3JiLmMKaW5kZXggMDE4YzM4MjUuLmE3Yzg3MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90cG0vdHBtX2NyYi5jCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtX2NyYi5jCkBAIC0xOSw3ICsxOSw2IEBACiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlICJ0cG0uaCIKIAogI2RlZmluZSBBQ1BJX1NJR19UUE0yICJUUE0yIgpAQCAtMzQsMTQgKzMzLDE0IEBACiAJQ1JCX0FDUElfU1RBUlRfSU5ERVggPSAxLAogfTsKIAotZW51bSBjcmJfY2FfcmVxdWVzdCB7Ci0JQ1JCX0NBX1JFUV9HT19JRExFCT0gQklUKDApLAotCUNSQl9DQV9SRVFfQ01EX1JFQURZCT0gQklUKDEpLAorZW51bSBjcmJfY3RybF9yZXEgeworCUNSQl9DVFJMX1JFUV9DTURfUkVBRFkJPSBCSVQoMCksCisJQ1JCX0NUUkxfUkVRX0dPX0lETEUJPSBCSVQoMSksCiB9OwogCi1lbnVtIGNyYl9jYV9zdGF0dXMgewotCUNSQl9DQV9TVFNfRVJST1IJPSBCSVQoMCksCi0JQ1JCX0NBX1NUU19UUE1fSURMRQk9IEJJVCgxKSwKK2VudW0gY3JiX2N0cmxfc3RzIHsKKwlDUkJfQ1RSTF9TVFNfRVJST1IJPSBCSVQoMCksCisJQ1JCX0NUUkxfU1RTX1RQTV9JRExFCT0gQklUKDEpLAogfTsKIAogZW51bSBjcmJfc3RhcnQgewpAQCAtNjcsNyArNjYsNyBAQAogfSBfX3BhY2tlZDsKIAogZW51bSBjcmJfc3RhdHVzIHsKLQlDUkJfU1RTX0NPTVBMRVRFCT0gQklUKDApLAorCUNSQl9EUlZfU1RTX0NPTVBMRVRFCT0gQklUKDApLAogfTsKIAogZW51bSBjcmJfZmxhZ3MgewpAQCAtODEsNiArODAsNyBAQAogCXN0cnVjdCBjcmJfY29udHJvbF9hcmVhIF9faW9tZW0gKmNjYTsKIAl1OCBfX2lvbWVtICpjbWQ7CiAJdTggX19pb21lbSAqcnNwOworCXUzMiBjbWRfc2l6ZTsKIH07CiAKIHN0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhjcmJfcG0sIHRwbV9wbV9zdXNwZW5kLCB0cG1fcG1fcmVzdW1lKTsKQEAgLTkyLDcgKzkyLDcgQEAKIAogCWlmICgoaW9yZWFkMzIoJnByaXYtPmNjYS0+c3RhcnQpICYgQ1JCX1NUQVJUX0lOVk9LRSkgIT0KIAkgICAgQ1JCX1NUQVJUX0lOVk9LRSkKLQkJc3RzIHw9IENSQl9TVFNfQ09NUExFVEU7CisJCXN0cyB8PSBDUkJfRFJWX1NUU19DT01QTEVURTsKIAogCXJldHVybiBzdHM7CiB9CkBAIC0xMDYsNyArMTA2LDcgQEAKIAlpZiAoY291bnQgPCA2KQogCQlyZXR1cm4gLUVJTzsKIAotCWlmIChpb3JlYWQzMigmcHJpdi0+Y2NhLT5zdHMpICYgQ1JCX0NBX1NUU19FUlJPUikKKwlpZiAoaW9yZWFkMzIoJnByaXYtPmNjYS0+c3RzKSAmIENSQl9DVFJMX1NUU19FUlJPUikKIAkJcmV0dXJuIC1FSU87CiAKIAltZW1jcHlfZnJvbWlvKGJ1ZiwgcHJpdi0+cnNwLCA2KTsKQEAgLTE0MiwxMSArMTQyLDE0IEBACiAJc3RydWN0IGNyYl9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKCZjaGlwLT5kZXYpOwogCWludCByYyA9IDA7CiAKLQlpZiAobGVuID4gaW9yZWFkMzIoJnByaXYtPmNjYS0+Y21kX3NpemUpKSB7Ci0JCWRldl9lcnIoJmNoaXAtPmRldiwKLQkJCSJpbnZhbGlkIGNvbW1hbmQgY291bnQgdmFsdWUgJXggJXp4XG4iLAotCQkJKHVuc2lnbmVkIGludCkgbGVuLAotCQkJKHNpemVfdCkgaW9yZWFkMzIoJnByaXYtPmNjYS0+Y21kX3NpemUpKTsKKwkvKiBaZXJvIHRoZSBjYW5jZWwgcmVnaXN0ZXIgc28gdGhhdCB0aGUgbmV4dCBjb21tYW5kIHdpbGwgbm90IGdldAorCSAqIGNhbmNlbGVkLgorCSAqLworCWlvd3JpdGUzMigwLCAmcHJpdi0+Y2NhLT5jYW5jZWwpOworCisJaWYgKGxlbiA+IHByaXYtPmNtZF9zaXplKSB7CisJCWRldl9lcnIoJmNoaXAtPmRldiwgImludmFsaWQgY29tbWFuZCBjb3VudCB2YWx1ZSAlemQgJWRcbiIsCisJCQlsZW4sIHByaXYtPmNtZF9zaXplKTsKIAkJcmV0dXJuIC1FMkJJRzsKIAl9CiAKQEAgLTE1Niw3ICsxNTksNyBAQAogCXdtYigpOwogCiAJaWYgKHByaXYtPmZsYWdzICYgQ1JCX0ZMX0NSQl9TVEFSVCkKLQkJaW93cml0ZTMyKGNwdV90b19sZTMyKENSQl9TVEFSVF9JTlZPS0UpLCAmcHJpdi0+Y2NhLT5zdGFydCk7CisJCWlvd3JpdGUzMihDUkJfU1RBUlRfSU5WT0tFLCAmcHJpdi0+Y2NhLT5zdGFydCk7CiAKIAlpZiAocHJpdi0+ZmxhZ3MgJiBDUkJfRkxfQUNQSV9TVEFSVCkKIAkJcmMgPSBjcmJfZG9fYWNwaV9zdGFydChjaGlwKTsKQEAgLTE2OCwxNSArMTcxLDEwIEBACiB7CiAJc3RydWN0IGNyYl9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKCZjaGlwLT5kZXYpOwogCi0JaW93cml0ZTMyKGNwdV90b19sZTMyKENSQl9DQU5DRUxfSU5WT0tFKSwgJnByaXYtPmNjYS0+Y2FuY2VsKTsKLQotCS8qIE1ha2Ugc3VyZSB0aGF0IGNtZCBpcyBwb3B1bGF0ZWQgYmVmb3JlIGlzc3VpbmcgY2FuY2VsLiAqLwotCXdtYigpOworCWlvd3JpdGUzMihDUkJfQ0FOQ0VMX0lOVk9LRSwgJnByaXYtPmNjYS0+Y2FuY2VsKTsKIAogCWlmICgocHJpdi0+ZmxhZ3MgJiBDUkJfRkxfQUNQSV9TVEFSVCkgJiYgY3JiX2RvX2FjcGlfc3RhcnQoY2hpcCkpCiAJCWRldl9lcnIoJmNoaXAtPmRldiwgIkFDUEkgU3RhcnQgZmFpbGVkXG4iKTsKLQotCWlvd3JpdGUzMigwLCAmcHJpdi0+Y2NhLT5jYW5jZWwpOwogfQogCiBzdGF0aWMgYm9vbCBjcmJfcmVxX2NhbmNlbGVkKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgdTggc3RhdHVzKQpAQCAtMTk0LDggKzE5Miw4IEBACiAJLnNlbmQgPSBjcmJfc2VuZCwKIAkuY2FuY2VsID0gY3JiX2NhbmNlbCwKIAkucmVxX2NhbmNlbGVkID0gY3JiX3JlcV9jYW5jZWxlZCwKLQkucmVxX2NvbXBsZXRlX21hc2sgPSBDUkJfU1RTX0NPTVBMRVRFLAotCS5yZXFfY29tcGxldGVfdmFsID0gQ1JCX1NUU19DT01QTEVURSwKKwkucmVxX2NvbXBsZXRlX21hc2sgPSBDUkJfRFJWX1NUU19DT01QTEVURSwKKwkucmVxX2NvbXBsZXRlX3ZhbCA9IENSQl9EUlZfU1RTX0NPTVBMRVRFLAogfTsKIAogc3RhdGljIGludCBjcmJfaW5pdChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgc3RydWN0IGNyYl9wcml2ICpwcml2KQpAQCAtMjY1LDggKzI2Myw3IEBACiAJYWNwaV9kZXZfZnJlZV9yZXNvdXJjZV9saXN0KCZyZXNvdXJjZXMpOwogCiAJaWYgKHJlc291cmNlX3R5cGUoJmlvX3JlcykgIT0gSU9SRVNPVVJDRV9NRU0pIHsKLQkJZGV2X2VycihkZXYsCi0JCQlGV19CVUcgIlRQTTIgQUNQSSB0YWJsZSBkb2VzIG5vdCBkZWZpbmUgYSBtZW1vcnkgcmVzb3VyY2VcbiIpOworCQlkZXZfZXJyKGRldiwgRldfQlVHICJUUE0yIEFDUEkgdGFibGUgZG9lcyBub3QgZGVmaW5lIGEgbWVtb3J5IHJlc291cmNlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0zMDIsNiArMjk5LDcgQEAKIAkJZGV2X2VycihkZXYsIEZXX0JVRyAib3ZlcmxhcHBpbmcgY29tbWFuZCBhbmQgcmVzcG9uc2UgYnVmZmVyIHNpemVzIGFyZSBub3QgaWRlbnRpY2FsIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KKwlwcml2LT5jbWRfc2l6ZSA9IGNtZF9zaXplOwogCiAJcHJpdi0+cnNwID0gcHJpdi0+Y21kOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS90cG1fdGlzX2NvcmUuYyBiL2RyaXZlcnMvY2hhci90cG0vdHBtX3Rpc19jb3JlLmMKaW5kZXggZDY2ZjUxYi4uZTNiZjMxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS90cG1fdGlzX2NvcmUuYworKysgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbV90aXNfY29yZS5jCkBAIC00NDAsNyArNDQwLDYgQEAKIAkJMHgwMCwgMHgwMCwgMHgwMCwgMHhmMQogCX07CiAJc2l6ZV90IGxlbiA9IHNpemVvZihjbWRfZ2V0dGlja3MpOwotCWJvb2wgaXRwbTsKIAl1MTYgdmVuZG9yOwogCiAJcmMgPSB0cG1fdGlzX3JlYWQxNihwcml2LCBUUE1fRElEX1ZJRCgwKSwgJnZlbmRvcik7CkBAIC00NTEsOCArNDUwLDYgQEAKIAlpZiAodmVuZG9yICE9IFRQTV9WSURfSU5URUwpCiAJCXJldHVybiAwOwogCi0JaXRwbSA9IGZhbHNlOwotCiAJcmMgPSB0cG1fdGlzX3NlbmRfZGF0YShjaGlwLCBjbWRfZ2V0dGlja3MsIGxlbik7CiAJaWYgKHJjID09IDApCiAJCWdvdG8gb3V0OwpAQCAtNDYwLDggKzQ1Nyw2IEBACiAJdHBtX3Rpc19yZWFkeShjaGlwKTsKIAlyZWxlYXNlX2xvY2FsaXR5KGNoaXAsIHByaXYtPmxvY2FsaXR5LCAwKTsKIAotCWl0cG0gPSB0cnVlOwotCiAJcmMgPSB0cG1fdGlzX3NlbmRfZGF0YShjaGlwLCBjbWRfZ2V0dGlja3MsIGxlbik7CiAJaWYgKHJjID09IDApIHsKIAkJZGV2X2luZm8oJmNoaXAtPmRldiwgIkRldGVjdGVkIGFuIGlUUE0uXG4iKTsKQEAgLTUyNiw2ICs1MjEsMTggQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKK3N0YXRpYyBpbnQgdHBtX3Rpc19nZW5faW50ZXJydXB0KHN0cnVjdCB0cG1fY2hpcCAqY2hpcCkKK3sKKwljb25zdCBjaGFyICpkZXNjID0gImF0dGVtcHRpbmcgdG8gZ2VuZXJhdGUgYW4gaW50ZXJydXB0IjsKKwl1MzIgY2FwMjsKKwljYXBfdCBjYXA7CisKKwlpZiAoY2hpcC0+ZmxhZ3MgJiBUUE1fQ0hJUF9GTEFHX1RQTTIpCisJCXJldHVybiB0cG0yX2dldF90cG1fcHQoY2hpcCwgMHgxMDAsICZjYXAyLCBkZXNjKTsKKwllbHNlCisJCXJldHVybiB0cG1fZ2V0Y2FwKGNoaXAsIFRQTV9DQVBfUFJPUF9USVNfVElNRU9VVCwgJmNhcCwgZGVzYyk7Cit9CisKIC8qIFJlZ2lzdGVyIHRoZSBJUlEgYW5kIGlzc3VlIGEgY29tbWFuZCB0aGF0IHdpbGwgY2F1c2UgYW4gaW50ZXJydXB0LiBJZiBhbgogICogaXJxIGlzIHNlZW4gdGhlbiBsZWF2ZSB0aGUgY2hpcCBzZXR1cCBmb3IgSVJRIG9wZXJhdGlvbiwgb3RoZXJ3aXNlIHJldmVyc2UKICAqIGV2ZXJ5dGhpbmcgYW5kIGxlYXZlIGluIHBvbGxpbmcgbW9kZS4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCkBAIC01NzUsMTAgKzU4Miw5IEBACiAJLyogR2VuZXJhdGUgYW4gaW50ZXJydXB0IGJ5IGhhdmluZyB0aGUgY29yZSBjYWxsIHRocm91Z2ggdG8KIAkgKiB0cG1fdGlzX3NlbmQKIAkgKi8KLQlpZiAoY2hpcC0+ZmxhZ3MgJiBUUE1fQ0hJUF9GTEFHX1RQTTIpCi0JCXRwbTJfZ2VuX2ludGVycnVwdChjaGlwKTsKLQllbHNlCi0JCXRwbV9nZW5faW50ZXJydXB0KGNoaXApOworCXJjID0gdHBtX3Rpc19nZW5faW50ZXJydXB0KGNoaXApOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKIAogCS8qIHRwbV90aXNfc2VuZCB3aWxsIGVpdGhlciBjb25maXJtIHRoZSBpbnRlcnJ1cHQgaXMgd29ya2luZyBvciBpdAogCSAqIHdpbGwgY2FsbCBkaXNhYmxlX2lycSB3aGljaCB1bmRvZXMgYWxsIG9mIHRoZSBhYm92ZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90dHlwcmludGsuYyBiL2RyaXZlcnMvY2hhci90dHlwcmludGsuYwppbmRleCBiMDk4ZDJkLi42NzU0OWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHR5cHJpbnRrLmMKKysrIGIvZHJpdmVycy9jaGFyL3R0eXByaW50ay5jCkBAIC0zMSw2MCArMzEsNTMgQEAKICAqIHByaW50ayBtZXNzYWdlcyAoYWxzbyBzdWl0YWJsZSBmb3IgbG9nZ2luZyBzZXJ2aWNlKToKICAqIC0gYW55IGNyIGlzIHJlcGxhY2VkIGJ5IG5sCiAgKiAtIGFkZHMgYSB0dHlwcmludGsgc291cmNlIHRhZyBpbiBmcm9udCBvZiBlYWNoIGxpbmUKLSAqIC0gdG9vIGxvbmcgbWVzc2FnZSBpcyBmcmFnbWV0ZWQsIHdpdGggJ1wnbmwgYmV0d2VlbiBmcmFnbWVudHMKLSAqIC0gVFBLX1NUUl9TSVpFIGlzbid0IHJlYWxseSB0aGUgd3JpdGVfcm9vbSBsaW1pdGluZyBmYWN0b3IsIGJjYXVzZQorICogLSB0b28gbG9uZyBtZXNzYWdlIGlzIGZyYWdtZW50ZWQsIHdpdGggJ1wnbmwgYmV0d2VlbiBmcmFnbWVudHMKKyAqIC0gVFBLX1NUUl9TSVpFIGlzbid0IHJlYWxseSB0aGUgd3JpdGVfcm9vbSBsaW1pdGluZyBmYWN0b3IsIGJlY2F1c2UKICAqICAgaXQgaXMgZW1wdGllZCBvbiB0aGUgZmx5IGR1cmluZyBwcmVmb3JtYXR0aW5nLgogICovCiAjZGVmaW5lIFRQS19TVFJfU0laRSA1MDggLyogc2hvdWxkIGJlIGJpZ2dlciB0aGVuIG1heCBleHBlY3RlZCBsaW5lIGxlbmd0aCAqLwogI2RlZmluZSBUUEtfTUFYX1JPT00gNDA5NiAvKiB3ZSBjb3VsZCBhc3N1bWUgNEsgZm9yIGluc3RhbmNlICovCi1zdGF0aWMgY29uc3QgY2hhciAqdHBrX3RhZyA9ICJbVV0gIjsgLyogVSBmb3IgVXNlciAqLwogc3RhdGljIGludCB0cGtfY3VycjsKIAorc3RhdGljIGNoYXIgdHBrX2J1ZmZlcltUUEtfU1RSX1NJWkUgKyA0XTsKKworc3RhdGljIHZvaWQgdHBrX2ZsdXNoKHZvaWQpCit7CisJaWYgKHRwa19jdXJyID4gMCkgeworCQl0cGtfYnVmZmVyW3Rwa19jdXJyXSA9ICdcMCc7CisJCXByX2luZm8oIltVXSAlc1xuIiwgdHBrX2J1ZmZlcik7CisJCXRwa19jdXJyID0gMDsKKwl9Cit9CisKIHN0YXRpYyBpbnQgdHBrX3ByaW50ayhjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKIHsKLQlzdGF0aWMgY2hhciB0bXBbVFBLX1NUUl9TSVpFICsgNF07CiAJaW50IGkgPSB0cGtfY3VycjsKIAogCWlmIChidWYgPT0gTlVMTCkgewotCQkvKiBmbHVzaCB0bXBbXSAqLwotCQlpZiAodHBrX2N1cnIgPiAwKSB7Ci0JCQkvKiBub24gbmwgb3IgY3IgdGVybWluYXRlZCBtZXNzYWdlIC0gYWRkIG5sICovCi0JCQl0bXBbdHBrX2N1cnIgKyAwXSA9ICdcbic7Ci0JCQl0bXBbdHBrX2N1cnIgKyAxXSA9ICdcMCc7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlcyVzIiwgdHBrX3RhZywgdG1wKTsKLQkJCXRwa19jdXJyID0gMDsKLQkJfQorCQl0cGtfZmx1c2goKTsKIAkJcmV0dXJuIGk7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJdG1wW3Rwa19jdXJyXSA9IGJ1ZltpXTsKLQkJaWYgKHRwa19jdXJyIDwgVFBLX1NUUl9TSVpFKSB7Ci0JCQlzd2l0Y2ggKGJ1ZltpXSkgewotCQkJY2FzZSAnXHInOgotCQkJCS8qIHJlcGxhY2UgY3Igd2l0aCBubCAqLwotCQkJCXRtcFt0cGtfY3VyciArIDBdID0gJ1xuJzsKLQkJCQl0bXBbdHBrX2N1cnIgKyAxXSA9ICdcMCc7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMlcyIsIHRwa190YWcsIHRtcCk7Ci0JCQkJdHBrX2N1cnIgPSAwOwotCQkJCWlmICgoaSArIDEpIDwgY291bnQgJiYgYnVmW2kgKyAxXSA9PSAnXG4nKQotCQkJCQlpKys7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdcbic6Ci0JCQkJdG1wW3Rwa19jdXJyICsgMV0gPSAnXDAnOwotCQkJCXByaW50ayhLRVJOX0lORk8gIiVzJXMiLCB0cGtfdGFnLCB0bXApOwotCQkJCXRwa19jdXJyID0gMDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJdHBrX2N1cnIrKzsKLQkJCX0KLQkJfSBlbHNlIHsKKwkJaWYgKHRwa19jdXJyID49IFRQS19TVFJfU0laRSkgewogCQkJLyogZW5kIG9mIHRtcCBidWZmZXIgcmVhY2hlZDogY3V0IHRoZSBtZXNzYWdlIGluIHR3byAqLwotCQkJdG1wW3Rwa19jdXJyICsgMV0gPSAnXFwnOwotCQkJdG1wW3Rwa19jdXJyICsgMl0gPSAnXG4nOwotCQkJdG1wW3Rwa19jdXJyICsgM10gPSAnXDAnOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMlcyIsIHRwa190YWcsIHRtcCk7Ci0JCQl0cGtfY3VyciA9IDA7CisJCQl0cGtfYnVmZmVyW3Rwa19jdXJyKytdID0gJ1xcJzsKKwkJCXRwa19mbHVzaCgpOworCQl9CisKKwkJc3dpdGNoIChidWZbaV0pIHsKKwkJY2FzZSAnXHInOgorCQkJdHBrX2ZsdXNoKCk7CisJCQlpZiAoKGkgKyAxKSA8IGNvdW50ICYmIGJ1ZltpICsgMV0gPT0gJ1xuJykKKwkJCQlpKys7CisJCQlicmVhazsKKwkJY2FzZSAnXG4nOgorCQkJdHBrX2ZsdXNoKCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXRwa19idWZmZXJbdHBrX2N1cnIrK10gPSBidWZbaV07CisJCQlicmVhazsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3ZpcnRpb19jb25zb2xlLmMgYi9kcml2ZXJzL2NoYXIvdmlydGlvX2NvbnNvbGUuYwppbmRleCBkMjQwNmZlLi41ZGE0N2UyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3ZpcnRpb19jb25zb2xlLmMKKysrIGIvZHJpdmVycy9jaGFyL3ZpcnRpb19jb25zb2xlLmMKQEAgLTE2NSw2ICsxNjUsMTIgQEAKIAkgKi8KIAlzdHJ1Y3QgdmlydHF1ZXVlICpjX2l2cSwgKmNfb3ZxOwogCisJLyoKKwkgKiBBIGNvbnRyb2wgcGFja2V0IGJ1ZmZlciBmb3IgZ3Vlc3QtPmhvc3QgcmVxdWVzdHMsIHByb3RlY3RlZAorCSAqIGJ5IGNfb3ZxX2xvY2suCisJICovCisJc3RydWN0IHZpcnRpb19jb25zb2xlX2NvbnRyb2wgY3BrdDsKKwogCS8qIEFycmF5IG9mIHBlci1wb3J0IElPIHZpcnRxdWV1ZXMgKi8KIAlzdHJ1Y3QgdmlydHF1ZXVlICoqaW5fdnFzLCAqKm91dF92cXM7CiAKQEAgLTU2MCwyOCArNTY2LDI5IEBACiAJCQkJICB1bnNpZ25lZCBpbnQgZXZlbnQsIHVuc2lnbmVkIGludCB2YWx1ZSkKIHsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbMV07Ci0Jc3RydWN0IHZpcnRpb19jb25zb2xlX2NvbnRyb2wgY3BrdDsKIAlzdHJ1Y3QgdmlydHF1ZXVlICp2cTsKIAl1bnNpZ25lZCBpbnQgbGVuOwogCiAJaWYgKCF1c2VfbXVsdGlwb3J0KHBvcnRkZXYpKQogCQlyZXR1cm4gMDsKIAotCWNwa3QuaWQgPSBjcHVfdG9fdmlydGlvMzIocG9ydGRldi0+dmRldiwgcG9ydF9pZCk7Ci0JY3BrdC5ldmVudCA9IGNwdV90b192aXJ0aW8xNihwb3J0ZGV2LT52ZGV2LCBldmVudCk7Ci0JY3BrdC52YWx1ZSA9IGNwdV90b192aXJ0aW8xNihwb3J0ZGV2LT52ZGV2LCB2YWx1ZSk7Ci0KIAl2cSA9IHBvcnRkZXYtPmNfb3ZxOwogCi0Jc2dfaW5pdF9vbmUoc2csICZjcGt0LCBzaXplb2YoY3BrdCkpOwotCiAJc3Bpbl9sb2NrKCZwb3J0ZGV2LT5jX292cV9sb2NrKTsKLQlpZiAodmlydHF1ZXVlX2FkZF9vdXRidWYodnEsIHNnLCAxLCAmY3BrdCwgR0ZQX0FUT01JQykgPT0gMCkgeworCisJcG9ydGRldi0+Y3BrdC5pZCA9IGNwdV90b192aXJ0aW8zMihwb3J0ZGV2LT52ZGV2LCBwb3J0X2lkKTsKKwlwb3J0ZGV2LT5jcGt0LmV2ZW50ID0gY3B1X3RvX3ZpcnRpbzE2KHBvcnRkZXYtPnZkZXYsIGV2ZW50KTsKKwlwb3J0ZGV2LT5jcGt0LnZhbHVlID0gY3B1X3RvX3ZpcnRpbzE2KHBvcnRkZXYtPnZkZXYsIHZhbHVlKTsKKworCXNnX2luaXRfb25lKHNnLCAmcG9ydGRldi0+Y3BrdCwgc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fY29uc29sZV9jb250cm9sKSk7CisKKwlpZiAodmlydHF1ZXVlX2FkZF9vdXRidWYodnEsIHNnLCAxLCAmcG9ydGRldi0+Y3BrdCwgR0ZQX0FUT01JQykgPT0gMCkgewogCQl2aXJ0cXVldWVfa2ljayh2cSk7CiAJCXdoaWxlICghdmlydHF1ZXVlX2dldF9idWYodnEsICZsZW4pCiAJCQkmJiAhdmlydHF1ZXVlX2lzX2Jyb2tlbih2cSkpCiAJCQljcHVfcmVsYXgoKTsKIAl9CisKIAlzcGluX3VubG9jaygmcG9ydGRldi0+Y19vdnFfbG9jayk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIveGlsbHlidXMveGlsbHlidXNfY29yZS5jIGIvZHJpdmVycy9jaGFyL3hpbGx5YnVzL3hpbGx5YnVzX2NvcmUuYwppbmRleCBkY2QxOWYzLi5iNmM5Y2RlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIveGlsbHlidXMveGlsbHlidXNfY29yZS5jCisrKyBiL2RyaXZlcnMvY2hhci94aWxseWJ1cy94aWxseWJ1c19jb3JlLmMKQEAgLTY1NSwxMCArNjU1LDEwIEBACiAKIAl2ZXJzaW9uID0gY2hhbm5lbC0+d3JfYnVmZmVyc1swXS0+YWRkcjsKIAotCS8qIENoZWNrIHZlcnNpb24gbnVtYmVyLiBBY2NlcHQgYW55dGhpbmcgYmVsb3cgMHg4MiBmb3Igbm93LiAqLworCS8qIENoZWNrIHZlcnNpb24gbnVtYmVyLiBSZWplY3QgYW55dGhpbmcgYWJvdmUgMHg4Mi4gKi8KIAlpZiAoKnZlcnNpb24gPiAweDgyKSB7CiAJCWRldl9lcnIoZW5kcG9pbnQtPmRldiwKLQkJCSJObyBzdXBwb3J0IGZvciBJRFQgdmVyc2lvbiAweCUwMnguIE1heWJlIHRoZSB4aWxseWJ1cyBkcml2ZXIgbmVlZHMgYW4gdXBnYXJkZS4gQWJvcnRpbmcuXG4iLAorCQkJIk5vIHN1cHBvcnQgZm9yIElEVCB2ZXJzaW9uIDB4JTAyeC4gTWF5YmUgdGhlIHhpbGx5YnVzIGRyaXZlciBuZWVkcyBhbiB1cGdyYWRlLiBBYm9ydGluZy5cbiIsCiAJCQkqdmVyc2lvbik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL0tjb25maWcgYi9kcml2ZXJzL2Nsay9LY29uZmlnCmluZGV4IGUyZDliZDcuLjZhOGFjMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL0tjb25maWcKKysrIGIvZHJpdmVycy9jbGsvS2NvbmZpZwpAQCAtMzEsMjIgKzMxLDEyIEBACiAKIHNvdXJjZSAiZHJpdmVycy9jbGsvdmVyc2F0aWxlL0tjb25maWciCiAKLWNvbmZpZyBDT01NT05fQ0xLX01BWF9HRU4KLSAgICAgICAgYm9vbAotCiBjb25maWcgQ09NTU9OX0NMS19NQVg3NzY4NgotCXRyaXN0YXRlICJDbG9jayBkcml2ZXIgZm9yIE1heGltIDc3Njg2IE1GRCIKLQlkZXBlbmRzIG9uIE1GRF9NQVg3NzY4NgotCXNlbGVjdCBDT01NT05fQ0xLX01BWF9HRU4KKwl0cmlzdGF0ZSAiQ2xvY2sgZHJpdmVyIGZvciBNYXhpbSA3NzYyMC83NzY4Ni83NzgwMiBNRkQiCisJZGVwZW5kcyBvbiBNRkRfTUFYNzc2ODYgfHwgTUZEX01BWDc3NjIwCiAJLS0taGVscC0tLQotCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgTWF4aW0gNzc2ODYgY3J5c3RhbCBvc2NpbGxhdG9yIGNsb2NrLiAKLQotY29uZmlnIENPTU1PTl9DTEtfTUFYNzc4MDIKLQl0cmlzdGF0ZSAiQ2xvY2sgZHJpdmVyIGZvciBNYXhpbSA3NzgwMiBQTUlDIgotCWRlcGVuZHMgb24gTUZEX01BWDc3Njg2Ci0Jc2VsZWN0IENPTU1PTl9DTEtfTUFYX0dFTgotCS0tLWhlbHAtLS0KLQkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIE1heGltIDc3ODAyIGNyeXN0YWwgb3NjaWxsYXRvciBjbG9jay4KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIE1heGltIDc3NjIwLzc3Njg2Lzc3ODAyIGNyeXN0YWwgb3NjaWxsYXRvcgorCSAgY2xvY2suCiAKIGNvbmZpZyBDT01NT05fQ0xLX1JLODA4CiAJdHJpc3RhdGUgIkNsb2NrIGRyaXZlciBmb3IgUks4MDgvUks4MTgiCkBAIC0yMTAsNiArMjAwLDcgQEAKIAogc291cmNlICJkcml2ZXJzL2Nsay9iY20vS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9jbGsvaGlzaWxpY29uL0tjb25maWciCitzb3VyY2UgImRyaXZlcnMvY2xrL21lZGlhdGVrL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvY2xrL21lc29uL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvY2xrL212ZWJ1L0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvY2xrL3Fjb20vS2NvbmZpZyIKQEAgLTIxOCw1ICsyMDksNiBAQAogc291cmNlICJkcml2ZXJzL2Nsay9zdW54aS1uZy9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL2Nsay90ZWdyYS9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL2Nsay90aS9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL2Nsay91bmlwaGllci9LY29uZmlnIgogCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9NYWtlZmlsZSBiL2RyaXZlcnMvY2xrL01ha2VmaWxlCmluZGV4IDNiNmY5Y2YuLjkyNTA4MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2xrL01ha2VmaWxlCkBAIC0yNiwxMCArMjYsNyBAQAogb2JqLSQoQ09ORklHX0NPTU1PTl9DTEtfQ1MyMDAwX0NQKQkrPSBjbGstY3MyMDAwLWNwLm8KIG9iai0kKENPTkZJR19BUkNIX0VGTTMyKQkJKz0gY2xrLWVmbTMyZ2cubwogb2JqLSQoQ09ORklHX0FSQ0hfSElHSEJBTkspCQkrPSBjbGstaGlnaGJhbmsubwotb2JqLSQoQ09ORklHX01BQ0hfTE9PTkdTT04zMikJCSs9IGNsay1sczF4Lm8KLW9iai0kKENPTkZJR19DT01NT05fQ0xLX01BWF9HRU4pCSs9IGNsay1tYXgtZ2VuLm8KIG9iai0kKENPTkZJR19DT01NT05fQ0xLX01BWDc3Njg2KQkrPSBjbGstbWF4Nzc2ODYubwotb2JqLSQoQ09ORklHX0NPTU1PTl9DTEtfTUFYNzc4MDIpCSs9IGNsay1tYXg3NzgwMi5vCiBvYmotJChDT05GSUdfQVJDSF9NQjg2UzdYKQkJKz0gY2xrLW1iODZzN3gubwogb2JqLSQoQ09ORklHX0FSQ0hfTU9YQVJUKQkJKz0gY2xrLW1veGFydC5vCiBvYmotJChDT05GSUdfQVJDSF9OT01BRElLKQkJKz0gY2xrLW5vbWFkaWsubwpAQCAtNjMsNiArNjAsNyBAQAogb2JqLSQoQ09ORklHX0FSQ0hfTVhDKQkJCSs9IGlteC8KIG9iai0kKENPTkZJR19NQUNIX0lOR0VOSUMpCQkrPSBpbmdlbmljLwogb2JqLSQoQ09ORklHX0NPTU1PTl9DTEtfS0VZU1RPTkUpCSs9IGtleXN0b25lLworb2JqLSQoQ09ORklHX01BQ0hfTE9PTkdTT04zMikJCSs9IGxvb25nc29uMS8KIG9iai0kKENPTkZJR19BUkNIX01FRElBVEVLKQkJKz0gbWVkaWF0ZWsvCiBvYmotJChDT05GSUdfQ09NTU9OX0NMS19BTUxPR0lDKQkrPSBtZXNvbi8KIG9iai0kKENPTkZJR19NQUNIX1BJQzMyKQkJKz0gbWljcm9jaGlwLwpAQCAtODYsNiArODQsNyBAQAogb2JqLSQoQ09ORklHX0FSQ0hfU1VOWEkpCQkrPSBzdW54aS1uZy8KIG9iai0kKENPTkZJR19BUkNIX1RFR1JBKQkJKz0gdGVncmEvCiBvYmoteQkJCQkJKz0gdGkvCitvYmotJChDT05GSUdfQ0xLX1VOSVBISUVSKQkJKz0gdW5pcGhpZXIvCiBvYmotJChDT05GSUdfQVJDSF9VODUwMCkJCSs9IHV4NTAwLwogb2JqLSQoQ09ORklHX0NPTU1PTl9DTEtfVkVSU0FUSUxFKQkrPSB2ZXJzYXRpbGUvCiBvYmotJChDT05GSUdfWDg2KQkJCSs9IHg4Ni8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2F0OTEvY2xrLWdlbmVyYXRlZC5jIGIvZHJpdmVycy9jbGsvYXQ5MS9jbGstZ2VuZXJhdGVkLmMKaW5kZXggN2Y2YmVjOC4uNGUxY2Q1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvYXQ5MS9jbGstZ2VuZXJhdGVkLmMKKysrIGIvZHJpdmVycy9jbGsvYXQ5MS9jbGstZ2VuZXJhdGVkLmMKQEAgLTIzMywxNCArMjMzLDE2IEBACiAJCQkJCT4+IEFUOTFfUE1DX1BDUl9HQ0tESVZfT0ZGU0VUOwogfQogCi1zdGF0aWMgc3RydWN0IGNsayAqIF9faW5pdAotYXQ5MV9jbGtfcmVnaXN0ZXJfZ2VuZXJhdGVkKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgIHNwaW5sb2NrX3QgKmxvY2ssIGNvbnN0IGNoYXIKLQkJCSAgICAqbmFtZSwgY29uc3QgY2hhciAqKnBhcmVudF9uYW1lcywgdTggbnVtX3BhcmVudHMsCi0JCQkgICAgdTggaWQsIGNvbnN0IHN0cnVjdCBjbGtfcmFuZ2UgKnJhbmdlKQorc3RhdGljIHN0cnVjdCBjbGtfaHcgKiBfX2luaXQKK2F0OTFfY2xrX3JlZ2lzdGVyX2dlbmVyYXRlZChzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIHNwaW5sb2NrX3QgKmxvY2ssCisJCQkgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKnBhcmVudF9uYW1lcywKKwkJCSAgICB1OCBudW1fcGFyZW50cywgdTggaWQsCisJCQkgICAgY29uc3Qgc3RydWN0IGNsa19yYW5nZSAqcmFuZ2UpCiB7CiAJc3RydWN0IGNsa19nZW5lcmF0ZWQgKmdjazsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJc3RydWN0IGNsa19odyAqaHc7CisJaW50IHJldDsKIAogCWdjayA9IGt6YWxsb2Moc2l6ZW9mKCpnY2spLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWdjaykKQEAgLTI1OCwxMyArMjYwLDE1IEBACiAJZ2NrLT5sb2NrID0gbG9jazsKIAlnY2stPnJhbmdlID0gKnJhbmdlOwogCi0JY2xrID0gY2xrX3JlZ2lzdGVyKE5VTEwsICZnY2stPmh3KTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaHcgPSAmZ2NrLT5odzsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJmdjay0+aHcpOworCWlmIChyZXQpIHsKIAkJa2ZyZWUoZ2NrKTsKLQllbHNlCisJCWh3ID0gRVJSX1BUUihyZXQpOworCX0gZWxzZQogCQljbGtfZ2VuZXJhdGVkX3N0YXJ0dXAoZ2NrKTsKIAotCXJldHVybiBjbGs7CisJcmV0dXJuIGh3OwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgb2Zfc2FtYTVkMl9jbGtfZ2VuZXJhdGVkX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCkBAIC0yNzIsNyArMjc2LDcgQEAKIAlpbnQgbnVtOwogCXUzMiBpZDsKIAljb25zdCBjaGFyICpuYW1lOwotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAl1bnNpZ25lZCBpbnQgbnVtX3BhcmVudHM7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWVzW0dFTkVSQVRFRF9TT1VSQ0VfTUFYXTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmdja25wOwpAQCAtMzA2LDEzICszMTAsMTMgQEAKIAkJb2ZfYXQ5MV9nZXRfY2xrX3JhbmdlKGdja25wLCAiYXRtZWwsY2xrLW91dHB1dC1yYW5nZSIsCiAJCQkJICAgICAgJnJhbmdlKTsKIAotCQljbGsgPSBhdDkxX2Nsa19yZWdpc3Rlcl9nZW5lcmF0ZWQocmVnbWFwLCAmcG1jX3Bjcl9sb2NrLCBuYW1lLAorCQlodyA9IGF0OTFfY2xrX3JlZ2lzdGVyX2dlbmVyYXRlZChyZWdtYXAsICZwbWNfcGNyX2xvY2ssIG5hbWUsCiAJCQkJCQkgIHBhcmVudF9uYW1lcywgbnVtX3BhcmVudHMsCiAJCQkJCQkgIGlkLCAmcmFuZ2UpOwotCQlpZiAoSVNfRVJSKGNsaykpCisJCWlmIChJU19FUlIoaHcpKQogCQkJY29udGludWU7CiAKLQkJb2ZfY2xrX2FkZF9wcm92aWRlcihnY2tucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCQlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKGdja25wLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOwogCX0KIH0KIENMS19PRl9ERUNMQVJFKG9mX3NhbWE1ZDJfY2xrX2dlbmVyYXRlZF9zZXR1cCwgImF0bWVsLHNhbWE1ZDItY2xrLWdlbmVyYXRlZCIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay1oMzJteC5jIGIvZHJpdmVycy9jbGsvYXQ5MS9jbGstaDMybXguYwppbmRleCA4ZTIwYzhhLi5lMGRhYTRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay1oMzJteC5jCisrKyBiL2RyaXZlcnMvY2xrL2F0OTEvY2xrLWgzMm14LmMKQEAgLTkyLDcgKzkyLDcgQEAKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OwogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lOwogCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJaW50IHJldDsKIAogCXJlZ21hcCA9IHN5c2Nvbl9ub2RlX3RvX3JlZ21hcChvZl9nZXRfcGFyZW50KG5wKSk7CiAJaWYgKElTX0VSUihyZWdtYXApKQpAQCAtMTEzLDEzICsxMTMsMTMgQEAKIAloMzJteGNsay0+aHcuaW5pdCA9ICZpbml0OwogCWgzMm14Y2xrLT5yZWdtYXAgPSByZWdtYXA7CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJmgzMm14Y2xrLT5odyk7Ci0JaWYgKElTX0VSUihjbGspKSB7CisJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZoMzJteGNsay0+aHcpOworCWlmIChyZXQpIHsKIAkJa2ZyZWUoaDMybXhjbGspOwogCQlyZXR1cm47CiAJfQogCi0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobnAsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCAmaDMybXhjbGstPmh3KTsKIH0KIENMS19PRl9ERUNMQVJFKG9mX3NhbWE1ZDRfY2xrX2gzMm14X3NldHVwLCAiYXRtZWwsc2FtYTVkNC1jbGstaDMybXgiLAogCSAgICAgICBvZl9zYW1hNWQ0X2Nsa19oMzJteF9zZXR1cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay1tYWluLmMgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay1tYWluLmMKaW5kZXggNThiNWJhY2EuLmM4MTNjMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2F0OTEvY2xrLW1haW4uYworKysgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay1tYWluLmMKQEAgLTEyOCwxNSArMTI4LDE2IEBACiAJLmlzX3ByZXBhcmVkID0gY2xrX21haW5fb3NjX2lzX3ByZXBhcmVkLAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgKiBfX2luaXQKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICogX19pbml0CiBhdDkxX2Nsa19yZWdpc3Rlcl9tYWluX29zYyhzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsCiAJCQkgICBjb25zdCBjaGFyICpuYW1lLAogCQkJICAgY29uc3QgY2hhciAqcGFyZW50X25hbWUsCiAJCQkgICBib29sIGJ5cGFzcykKIHsKIAlzdHJ1Y3QgY2xrX21haW5fb3NjICpvc2M7Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OworCXN0cnVjdCBjbGtfaHcgKmh3OworCWludCByZXQ7CiAKIAlpZiAoIW5hbWUgfHwgIXBhcmVudF9uYW1lKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKQEAgLTE2MCwxNiArMTYxLDE5IEBACiAJCQkJICAgQVQ5MV9QTUNfTU9TQ0VOLAogCQkJCSAgIEFUOTFfUE1DX09TQ0JZUEFTUyB8IEFUOTFfUE1DX0tFWSk7CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJm9zYy0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9ICZvc2MtPmh3OworCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmb3NjLT5odyk7CisJaWYgKHJldCkgewogCQlrZnJlZShvc2MpOworCQlodyA9IEVSUl9QVFIocmV0KTsKKwl9CiAKLQlyZXR1cm4gY2xrOworCXJldHVybiBodzsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG9mX2F0OTFybTkyMDBfY2xrX21haW5fb3NjX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0Jc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCWNvbnN0IGNoYXIgKm5hbWUgPSBucC0+bmFtZTsKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZTsKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CkBAIC0xODMsMTEgKzE4NywxMSBAQAogCWlmIChJU19FUlIocmVnbWFwKSkKIAkJcmV0dXJuOwogCi0JY2xrID0gYXQ5MV9jbGtfcmVnaXN0ZXJfbWFpbl9vc2MocmVnbWFwLCBuYW1lLCBwYXJlbnRfbmFtZSwgYnlwYXNzKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaHcgPSBhdDkxX2Nsa19yZWdpc3Rlcl9tYWluX29zYyhyZWdtYXAsIG5hbWUsIHBhcmVudF9uYW1lLCBieXBhc3MpOworCWlmIChJU19FUlIoaHcpKQogCQlyZXR1cm47CiAKLQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJb2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsIGh3KTsKIH0KIENMS19PRl9ERUNMQVJFKGF0OTFybTkyMDBfY2xrX21haW5fb3NjLCAiYXRtZWwsYXQ5MXJtOTIwMC1jbGstbWFpbi1vc2MiLAogCSAgICAgICBvZl9hdDkxcm05MjAwX2Nsa19tYWluX29zY19zZXR1cCk7CkBAIC0yNzEsMTQgKzI3NSwxNSBAQAogCS5yZWNhbGNfYWNjdXJhY3kgPSBjbGtfbWFpbl9yY19vc2NfcmVjYWxjX2FjY3VyYWN5LAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgKiBfX2luaXQKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICogX19pbml0CiBhdDkxX2Nsa19yZWdpc3Rlcl9tYWluX3JjX29zYyhzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsCiAJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLAogCQkJICAgICAgdTMyIGZyZXF1ZW5jeSwgdTMyIGFjY3VyYWN5KQogewogCXN0cnVjdCBjbGtfbWFpbl9yY19vc2MgKm9zYzsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJc3RydWN0IGNsa19odyAqaHc7CisJaW50IHJldDsKIAogCWlmICghbmFtZSB8fCAhZnJlcXVlbmN5KQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKQEAgLTI5OCwxNiArMzAzLDE5IEBACiAJb3NjLT5mcmVxdWVuY3kgPSBmcmVxdWVuY3k7CiAJb3NjLT5hY2N1cmFjeSA9IGFjY3VyYWN5OwogCi0JY2xrID0gY2xrX3JlZ2lzdGVyKE5VTEwsICZvc2MtPmh3KTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaHcgPSAmb3NjLT5odzsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgaHcpOworCWlmIChyZXQpIHsKIAkJa2ZyZWUob3NjKTsKKwkJaHcgPSBFUlJfUFRSKHJldCk7CisJfQogCi0JcmV0dXJuIGNsazsKKwlyZXR1cm4gaHc7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBvZl9hdDkxc2FtOXg1X2Nsa19tYWluX3JjX29zY19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAl1MzIgZnJlcXVlbmN5ID0gMDsKIAl1MzIgYWNjdXJhY3kgPSAwOwogCWNvbnN0IGNoYXIgKm5hbWUgPSBucC0+bmFtZTsKQEAgLTMyMSwxMSArMzI5LDExIEBACiAJaWYgKElTX0VSUihyZWdtYXApKQogCQlyZXR1cm47CiAKLQljbGsgPSBhdDkxX2Nsa19yZWdpc3Rlcl9tYWluX3JjX29zYyhyZWdtYXAsIG5hbWUsIGZyZXF1ZW5jeSwgYWNjdXJhY3kpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9IGF0OTFfY2xrX3JlZ2lzdGVyX21haW5fcmNfb3NjKHJlZ21hcCwgbmFtZSwgZnJlcXVlbmN5LCBhY2N1cmFjeSk7CisJaWYgKElTX0VSUihodykpCiAJCXJldHVybjsKIAotCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOwogfQogQ0xLX09GX0RFQ0xBUkUoYXQ5MXNhbTl4NV9jbGtfbWFpbl9yY19vc2MsICJhdG1lbCxhdDkxc2FtOXg1LWNsay1tYWluLXJjLW9zYyIsCiAJICAgICAgIG9mX2F0OTFzYW05eDVfY2xrX21haW5fcmNfb3NjX3NldHVwKTsKQEAgLTM5NSwxNCArNDAzLDE1IEBACiAJLnJlY2FsY19yYXRlID0gY2xrX3JtOTIwMF9tYWluX3JlY2FsY19yYXRlLAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgKiBfX2luaXQKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICogX19pbml0CiBhdDkxX2Nsa19yZWdpc3Rlcl9ybTkyMDBfbWFpbihzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsCiAJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLAogCQkJICAgICAgY29uc3QgY2hhciAqcGFyZW50X25hbWUpCiB7CiAJc3RydWN0IGNsa19ybTkyMDBfbWFpbiAqY2xrbWFpbjsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJc3RydWN0IGNsa19odyAqaHc7CisJaW50IHJldDsKIAogCWlmICghbmFtZSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CkBAIC00MjMsMTYgKzQzMiwxOSBAQAogCWNsa21haW4tPmh3LmluaXQgPSAmaW5pdDsKIAljbGttYWluLT5yZWdtYXAgPSByZWdtYXA7CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJmNsa21haW4tPmh3KTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaHcgPSAmY2xrbWFpbi0+aHc7CisJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZjbGttYWluLT5odyk7CisJaWYgKHJldCkgewogCQlrZnJlZShjbGttYWluKTsKKwkJaHcgPSBFUlJfUFRSKHJldCk7CisJfQogCi0JcmV0dXJuIGNsazsKKwlyZXR1cm4gaHc7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBvZl9hdDkxcm05MjAwX2Nsa19tYWluX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0Jc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lOwogCWNvbnN0IGNoYXIgKm5hbWUgPSBucC0+bmFtZTsKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CkBAIC00NDQsMTEgKzQ1NiwxMSBAQAogCWlmIChJU19FUlIocmVnbWFwKSkKIAkJcmV0dXJuOwogCi0JY2xrID0gYXQ5MV9jbGtfcmVnaXN0ZXJfcm05MjAwX21haW4ocmVnbWFwLCBuYW1lLCBwYXJlbnRfbmFtZSk7Ci0JaWYgKElTX0VSUihjbGspKQorCWh3ID0gYXQ5MV9jbGtfcmVnaXN0ZXJfcm05MjAwX21haW4ocmVnbWFwLCBuYW1lLCBwYXJlbnRfbmFtZSk7CisJaWYgKElTX0VSUihodykpCiAJCXJldHVybjsKIAotCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOwogfQogQ0xLX09GX0RFQ0xBUkUoYXQ5MXJtOTIwMF9jbGtfbWFpbiwgImF0bWVsLGF0OTFybTkyMDAtY2xrLW1haW4iLAogCSAgICAgICBvZl9hdDkxcm05MjAwX2Nsa19tYWluX3NldHVwKTsKQEAgLTUyOSwxNiArNTQxLDE3IEBACiAJLmdldF9wYXJlbnQgPSBjbGtfc2FtOXg1X21haW5fZ2V0X3BhcmVudCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICogX19pbml0CitzdGF0aWMgc3RydWN0IGNsa19odyAqIF9faW5pdAogYXQ5MV9jbGtfcmVnaXN0ZXJfc2FtOXg1X21haW4oc3RydWN0IHJlZ21hcCAqcmVnbWFwLAogCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwKIAkJCSAgICAgIGNvbnN0IGNoYXIgKipwYXJlbnRfbmFtZXMsCiAJCQkgICAgICBpbnQgbnVtX3BhcmVudHMpCiB7CiAJc3RydWN0IGNsa19zYW05eDVfbWFpbiAqY2xrbWFpbjsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CiAJdW5zaWduZWQgaW50IHN0YXR1czsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKKwlpbnQgcmV0OwogCiAJaWYgKCFuYW1lKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKQEAgLTU2MSwxNiArNTc0LDE5IEBACiAJcmVnbWFwX3JlYWQoY2xrbWFpbi0+cmVnbWFwLCBBVDkxX0NLR1JfTU9SLCAmc3RhdHVzKTsKIAljbGttYWluLT5wYXJlbnQgPSBzdGF0dXMgJiBBVDkxX1BNQ19NT1NDRU4gPyAxIDogMDsKIAotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmY2xrbWFpbi0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9ICZjbGttYWluLT5odzsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJmNsa21haW4tPmh3KTsKKwlpZiAocmV0KSB7CiAJCWtmcmVlKGNsa21haW4pOworCQlodyA9IEVSUl9QVFIocmV0KTsKKwl9CiAKLQlyZXR1cm4gY2xrOworCXJldHVybiBodzsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG9mX2F0OTFzYW05eDVfY2xrX21haW5fc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19odyAqaHc7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWVzWzJdOwogCXVuc2lnbmVkIGludCBudW1fcGFyZW50czsKIAljb25zdCBjaGFyICpuYW1lID0gbnAtPm5hbWU7CkBAIC01ODcsMTIgKzYwMywxMiBAQAogCiAJb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobnAsICJjbG9jay1vdXRwdXQtbmFtZXMiLCAmbmFtZSk7CiAKLQljbGsgPSBhdDkxX2Nsa19yZWdpc3Rlcl9zYW05eDVfbWFpbihyZWdtYXAsIG5hbWUsIHBhcmVudF9uYW1lcywKKwlodyA9IGF0OTFfY2xrX3JlZ2lzdGVyX3NhbTl4NV9tYWluKHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWVzLAogCQkJCQkgICAgbnVtX3BhcmVudHMpOwotCWlmIChJU19FUlIoY2xrKSkKKwlpZiAoSVNfRVJSKGh3KSkKIAkJcmV0dXJuOwogCi0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobnAsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7CiB9CiBDTEtfT0ZfREVDTEFSRShhdDkxc2FtOXg1X2Nsa19tYWluLCAiYXRtZWwsYXQ5MXNhbTl4NS1jbGstbWFpbiIsCiAJICAgICAgIG9mX2F0OTFzYW05eDVfY2xrX21haW5fc2V0dXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYXQ5MS9jbGstbWFzdGVyLmMgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay1tYXN0ZXIuYwppbmRleCBkMTAyMWUxLi5lOWNiYTlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay1tYXN0ZXIuYworKysgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay1tYXN0ZXIuYwpAQCAtMTIwLDcgKzEyMCw3IEBACiAJLmdldF9wYXJlbnQgPSBjbGtfbWFzdGVyX2dldF9wYXJlbnQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayAqIF9faW5pdAorc3RhdGljIHN0cnVjdCBjbGtfaHcgKiBfX2luaXQKIGF0OTFfY2xrX3JlZ2lzdGVyX21hc3RlcihzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsCiAJCWNvbnN0IGNoYXIgKm5hbWUsIGludCBudW1fcGFyZW50cywKIAkJY29uc3QgY2hhciAqKnBhcmVudF9uYW1lcywKQEAgLTEyOCw4ICsxMjgsOSBAQAogCQljb25zdCBzdHJ1Y3QgY2xrX21hc3Rlcl9jaGFyYWN0ZXJpc3RpY3MgKmNoYXJhY3RlcmlzdGljcykKIHsKIAlzdHJ1Y3QgY2xrX21hc3RlciAqbWFzdGVyOwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKKwlpbnQgcmV0OwogCiAJaWYgKCFuYW1lIHx8ICFudW1fcGFyZW50cyB8fCAhcGFyZW50X25hbWVzKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKQEAgLTE0OSwxMiArMTUwLDE0IEBACiAJbWFzdGVyLT5jaGFyYWN0ZXJpc3RpY3MgPSBjaGFyYWN0ZXJpc3RpY3M7CiAJbWFzdGVyLT5yZWdtYXAgPSByZWdtYXA7CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJm1hc3Rlci0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkgeworCWh3ID0gJm1hc3Rlci0+aHc7CisJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZtYXN0ZXItPmh3KTsKKwlpZiAocmV0KSB7CiAJCWtmcmVlKG1hc3Rlcik7CisJCWh3ID0gRVJSX1BUUihyZXQpOwogCX0KIAotCXJldHVybiBjbGs7CisJcmV0dXJuIGh3OwogfQogCiAKQEAgLTE5OCw3ICsyMDEsNyBAQAogb2ZfYXQ5MV9jbGtfbWFzdGVyX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCiAJCQkgY29uc3Qgc3RydWN0IGNsa19tYXN0ZXJfbGF5b3V0ICpsYXlvdXQpCiB7Ci0Jc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCXVuc2lnbmVkIGludCBudW1fcGFyZW50czsKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZXNbTUFTVEVSX1NPVVJDRV9NQVhdOwogCWNvbnN0IGNoYXIgKm5hbWUgPSBucC0+bmFtZTsKQEAgLTIyMSwxMyArMjI0LDEzIEBACiAJaWYgKElTX0VSUihyZWdtYXApKQogCQlyZXR1cm47CiAKLQljbGsgPSBhdDkxX2Nsa19yZWdpc3Rlcl9tYXN0ZXIocmVnbWFwLCBuYW1lLCBudW1fcGFyZW50cywKKwlodyA9IGF0OTFfY2xrX3JlZ2lzdGVyX21hc3RlcihyZWdtYXAsIG5hbWUsIG51bV9wYXJlbnRzLAogCQkJCSAgICAgICBwYXJlbnRfbmFtZXMsIGxheW91dCwKIAkJCQkgICAgICAgY2hhcmFjdGVyaXN0aWNzKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaWYgKElTX0VSUihodykpCiAJCWdvdG8gb3V0X2ZyZWVfY2hhcmFjdGVyaXN0aWNzOwogCi0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobnAsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7CiAJcmV0dXJuOwogCiBvdXRfZnJlZV9jaGFyYWN0ZXJpc3RpY3M6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay1wZXJpcGhlcmFsLmMgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay1wZXJpcGhlcmFsLmMKaW5kZXggZmQxNjA3Mi4uZGMyOWZkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvYXQ5MS9jbGstcGVyaXBoZXJhbC5jCisrKyBiL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXBlcmlwaGVyYWwuYwpAQCAtMTA0LDEzICsxMDQsMTQgQEAKIAkuaXNfZW5hYmxlZCA9IGNsa19wZXJpcGhlcmFsX2lzX2VuYWJsZWQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayAqIF9faW5pdAorc3RhdGljIHN0cnVjdCBjbGtfaHcgKiBfX2luaXQKIGF0OTFfY2xrX3JlZ2lzdGVyX3BlcmlwaGVyYWwoc3RydWN0IHJlZ21hcCAqcmVnbWFwLCBjb25zdCBjaGFyICpuYW1lLAogCQkJICAgICBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSwgdTMyIGlkKQogewogCXN0cnVjdCBjbGtfcGVyaXBoZXJhbCAqcGVyaXBoOwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKKwlpbnQgcmV0OwogCiAJaWYgKCFuYW1lIHx8ICFwYXJlbnRfbmFtZSB8fCBpZCA+IFBFUklQSEVSQUxfSURfTUFYKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKQEAgLTEyOSwxMSArMTMwLDE0IEBACiAJcGVyaXBoLT5ody5pbml0ID0gJmluaXQ7CiAJcGVyaXBoLT5yZWdtYXAgPSByZWdtYXA7CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJnBlcmlwaC0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9ICZwZXJpcGgtPmh3OworCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmcGVyaXBoLT5odyk7CisJaWYgKHJldCkgewogCQlrZnJlZShwZXJpcGgpOworCQlodyA9IEVSUl9QVFIocmV0KTsKKwl9CiAKLQlyZXR1cm4gY2xrOworCXJldHVybiBodzsKIH0KIAogc3RhdGljIHZvaWQgY2xrX3NhbTl4NV9wZXJpcGhlcmFsX2F1dG9kaXYoc3RydWN0IGNsa19zYW05eDVfcGVyaXBoZXJhbCAqcGVyaXBoKQpAQCAtMzI3LDE0ICszMzEsMTUgQEAKIAkuc2V0X3JhdGUgPSBjbGtfc2FtOXg1X3BlcmlwaGVyYWxfc2V0X3JhdGUsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayAqIF9faW5pdAorc3RhdGljIHN0cnVjdCBjbGtfaHcgKiBfX2luaXQKIGF0OTFfY2xrX3JlZ2lzdGVyX3NhbTl4NV9wZXJpcGhlcmFsKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgc3BpbmxvY2tfdCAqbG9jaywKIAkJCQkgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcGFyZW50X25hbWUsCiAJCQkJICAgIHUzMiBpZCwgY29uc3Qgc3RydWN0IGNsa19yYW5nZSAqcmFuZ2UpCiB7CiAJc3RydWN0IGNsa19zYW05eDVfcGVyaXBoZXJhbCAqcGVyaXBoOwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKKwlpbnQgcmV0OwogCiAJaWYgKCFuYW1lIHx8ICFwYXJlbnRfbmFtZSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CkBAIC0zNTcsMTMgKzM2MiwxNSBAQAogCXBlcmlwaC0+YXV0b19kaXYgPSB0cnVlOwogCXBlcmlwaC0+cmFuZ2UgPSAqcmFuZ2U7CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJnBlcmlwaC0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9ICZwZXJpcGgtPmh3OworCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmcGVyaXBoLT5odyk7CisJaWYgKHJldCkgewogCQlrZnJlZShwZXJpcGgpOwotCWVsc2UKKwkJaHcgPSBFUlJfUFRSKHJldCk7CisJfSBlbHNlCiAJCWNsa19zYW05eDVfcGVyaXBoZXJhbF9hdXRvZGl2KHBlcmlwaCk7CiAKLQlyZXR1cm4gY2xrOworCXJldHVybiBodzsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0CkBAIC0zNzEsNyArMzc4LDcgQEAKIHsKIAlpbnQgbnVtOwogCXUzMiBpZDsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19odyAqaHc7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CiAJY29uc3QgY2hhciAqbmFtZTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBlcmlwaGNsa25wOwpAQCAtNDAwLDcgKzQwNyw3IEBACiAJCQluYW1lID0gcGVyaXBoY2xrbnAtPm5hbWU7CiAKIAkJaWYgKHR5cGUgPT0gUEVSSVBIRVJBTF9BVDkxUk05MjAwKSB7Ci0JCQljbGsgPSBhdDkxX2Nsa19yZWdpc3Rlcl9wZXJpcGhlcmFsKHJlZ21hcCwgbmFtZSwKKwkJCWh3ID0gYXQ5MV9jbGtfcmVnaXN0ZXJfcGVyaXBoZXJhbChyZWdtYXAsIG5hbWUsCiAJCQkJCQkJICAgcGFyZW50X25hbWUsIGlkKTsKIAkJfSBlbHNlIHsKIAkJCXN0cnVjdCBjbGtfcmFuZ2UgcmFuZ2UgPSBDTEtfUkFOR0UoMCwgMCk7CkBAIC00MDksMTcgKzQxNiwxNyBAQAogCQkJCQkgICAgICAiYXRtZWwsY2xrLW91dHB1dC1yYW5nZSIsCiAJCQkJCSAgICAgICZyYW5nZSk7CiAKLQkJCWNsayA9IGF0OTFfY2xrX3JlZ2lzdGVyX3NhbTl4NV9wZXJpcGhlcmFsKHJlZ21hcCwKKwkJCWh3ID0gYXQ5MV9jbGtfcmVnaXN0ZXJfc2FtOXg1X3BlcmlwaGVyYWwocmVnbWFwLAogCQkJCQkJCQkgICZwbWNfcGNyX2xvY2ssCiAJCQkJCQkJCSAgbmFtZSwKIAkJCQkJCQkJICBwYXJlbnRfbmFtZSwKIAkJCQkJCQkJICBpZCwgJnJhbmdlKTsKIAkJfQogCi0JCWlmIChJU19FUlIoY2xrKSkKKwkJaWYgKElTX0VSUihodykpCiAJCQljb250aW51ZTsKIAotCQlvZl9jbGtfYWRkX3Byb3ZpZGVyKHBlcmlwaGNsa25wLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIocGVyaXBoY2xrbnAsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay1wbGwuYyBiL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXBsbC5jCmluZGV4IGZiMmUwYjUuLjQ1YWQxNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXBsbC5jCisrKyBiL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXBsbC5jCkBAIC0yOTYsMTcgKzI5NiwxOCBAQAogCS5zZXRfcmF0ZSA9IGNsa19wbGxfc2V0X3JhdGUsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayAqIF9faW5pdAorc3RhdGljIHN0cnVjdCBjbGtfaHcgKiBfX2luaXQKIGF0OTFfY2xrX3JlZ2lzdGVyX3BsbChzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCSAgICAgIGNvbnN0IGNoYXIgKnBhcmVudF9uYW1lLCB1OCBpZCwKIAkJICAgICAgY29uc3Qgc3RydWN0IGNsa19wbGxfbGF5b3V0ICpsYXlvdXQsCiAJCSAgICAgIGNvbnN0IHN0cnVjdCBjbGtfcGxsX2NoYXJhY3RlcmlzdGljcyAqY2hhcmFjdGVyaXN0aWNzKQogewogCXN0cnVjdCBjbGtfcGxsICpwbGw7Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OwogCWludCBvZmZzZXQgPSBQTExfUkVHKGlkKTsKIAl1bnNpZ25lZCBpbnQgcGxscjsKKwlpbnQgcmV0OwogCiAJaWYgKGlkID4gUExMX01BWF9JRCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CkBAIC0zMzAsMTIgKzMzMSwxNCBAQAogCXBsbC0+ZGl2ID0gUExMX0RJVihwbGxyKTsKIAlwbGwtPm11bCA9IFBMTF9NVUwocGxsciwgbGF5b3V0KTsKIAotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmcGxsLT5odyk7Ci0JaWYgKElTX0VSUihjbGspKSB7CisJaHcgPSAmcGxsLT5odzsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJnBsbC0+aHcpOworCWlmIChyZXQpIHsKIAkJa2ZyZWUocGxsKTsKKwkJaHcgPSBFUlJfUFRSKHJldCk7CiAJfQogCi0JcmV0dXJuIGNsazsKKwlyZXR1cm4gaHc7CiB9CiAKIApAQCAtNDY1LDcgKzQ2OCw3IEBACiAJCSAgICAgIGNvbnN0IHN0cnVjdCBjbGtfcGxsX2xheW91dCAqbGF5b3V0KQogewogCXUzMiBpZDsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19odyAqaHc7CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lOwogCWNvbnN0IGNoYXIgKm5hbWUgPSBucC0+bmFtZTsKQEAgLTQ4NiwxMiArNDg5LDEyIEBACiAJaWYgKCFjaGFyYWN0ZXJpc3RpY3MpCiAJCXJldHVybjsKIAotCWNsayA9IGF0OTFfY2xrX3JlZ2lzdGVyX3BsbChyZWdtYXAsIG5hbWUsIHBhcmVudF9uYW1lLCBpZCwgbGF5b3V0LAorCWh3ID0gYXQ5MV9jbGtfcmVnaXN0ZXJfcGxsKHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWUsIGlkLCBsYXlvdXQsCiAJCQkJICAgIGNoYXJhY3RlcmlzdGljcyk7Ci0JaWYgKElTX0VSUihjbGspKQorCWlmIChJU19FUlIoaHcpKQogCQlnb3RvIG91dF9mcmVlX2NoYXJhY3RlcmlzdGljczsKIAotCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOwogCXJldHVybjsKIAogb3V0X2ZyZWVfY2hhcmFjdGVyaXN0aWNzOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYXQ5MS9jbGstcGxsZGl2LmMgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay1wbGxkaXYuYwppbmRleCAyYmVkMjY0Li5iNGFmYWYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay1wbGxkaXYuYworKysgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay1wbGxkaXYuYwpAQCAtNzUsMTMgKzc1LDE0IEBACiAJLnNldF9yYXRlID0gY2xrX3BsbGRpdl9zZXRfcmF0ZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICogX19pbml0CitzdGF0aWMgc3RydWN0IGNsa19odyAqIF9faW5pdAogYXQ5MV9jbGtfcmVnaXN0ZXJfcGxsZGl2KHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgY29uc3QgY2hhciAqbmFtZSwKIAkJCSBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSkKIHsKIAlzdHJ1Y3QgY2xrX3BsbGRpdiAqcGxsZGl2OwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7CisJc3RydWN0IGNsa19odyAqaHc7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlpbnQgcmV0OwogCiAJcGxsZGl2ID0ga3phbGxvYyhzaXplb2YoKnBsbGRpdiksIEdGUF9LRVJORUwpOwogCWlmICghcGxsZGl2KQpAQCAtOTYsMTggKzk3LDIwIEBACiAJcGxsZGl2LT5ody5pbml0ID0gJmluaXQ7CiAJcGxsZGl2LT5yZWdtYXAgPSByZWdtYXA7CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJnBsbGRpdi0+aHcpOwotCi0JaWYgKElTX0VSUihjbGspKQorCWh3ID0gJnBsbGRpdi0+aHc7CisJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZwbGxkaXYtPmh3KTsKKwlpZiAocmV0KSB7CiAJCWtmcmVlKHBsbGRpdik7CisJCWh3ID0gRVJSX1BUUihyZXQpOworCX0KIAotCXJldHVybiBjbGs7CisJcmV0dXJuIGh3OwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQKIG9mX2F0OTFzYW05eDVfY2xrX3BsbGRpdl9zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZTsKIAljb25zdCBjaGFyICpuYW1lID0gbnAtPm5hbWU7CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwpAQCAtMTIwLDEyICsxMjMsMTEgQEAKIAlpZiAoSVNfRVJSKHJlZ21hcCkpCiAJCXJldHVybjsKIAotCWNsayA9IGF0OTFfY2xrX3JlZ2lzdGVyX3BsbGRpdihyZWdtYXAsIG5hbWUsIHBhcmVudF9uYW1lKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaHcgPSBhdDkxX2Nsa19yZWdpc3Rlcl9wbGxkaXYocmVnbWFwLCBuYW1lLCBwYXJlbnRfbmFtZSk7CisJaWYgKElTX0VSUihodykpCiAJCXJldHVybjsKIAotCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKLQlyZXR1cm47CisJb2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsIGh3KTsKIH0KIENMS19PRl9ERUNMQVJFKGF0OTFzYW05eDVfY2xrX3BsbGRpdiwgImF0bWVsLGF0OTFzYW05eDUtY2xrLXBsbGRpdiIsCiAJICAgICAgIG9mX2F0OTFzYW05eDVfY2xrX3BsbGRpdl9zZXR1cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay1wcm9ncmFtbWFibGUuYyBiL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXByb2dyYW1tYWJsZS5jCmluZGV4IDI1ZDU5MDYuLjE5MDEyMmU2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvYXQ5MS9jbGstcHJvZ3JhbW1hYmxlLmMKKysrIGIvZHJpdmVycy9jbGsvYXQ5MS9jbGstcHJvZ3JhbW1hYmxlLmMKQEAgLTE3MCwxNSArMTcwLDE2IEBACiAJLnNldF9yYXRlID0gY2xrX3Byb2dyYW1tYWJsZV9zZXRfcmF0ZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICogX19pbml0CitzdGF0aWMgc3RydWN0IGNsa19odyAqIF9faW5pdAogYXQ5MV9jbGtfcmVnaXN0ZXJfcHJvZ3JhbW1hYmxlKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKIAkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqcGFyZW50X25hbWVzLAogCQkJICAgICAgIHU4IG51bV9wYXJlbnRzLCB1OCBpZCwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgY2xrX3Byb2dyYW1tYWJsZV9sYXlvdXQgKmxheW91dCkKIHsKIAlzdHJ1Y3QgY2xrX3Byb2dyYW1tYWJsZSAqcHJvZzsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJaW50IHJldDsKIAogCWlmIChpZCA+IFBST0dfSURfTUFYKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKQEAgLTE5OCwxMSArMTk5LDE0IEBACiAJcHJvZy0+aHcuaW5pdCA9ICZpbml0OwogCXByb2ctPnJlZ21hcCA9IHJlZ21hcDsKIAotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmcHJvZy0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9ICZwcm9nLT5odzsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJnByb2ctPmh3KTsKKwlpZiAocmV0KSB7CiAJCWtmcmVlKHByb2cpOworCQlodyA9ICZwcm9nLT5odzsKKwl9CiAKLQlyZXR1cm4gY2xrOworCXJldHVybiBodzsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfcHJvZ3JhbW1hYmxlX2xheW91dCBhdDkxcm05MjAwX3Byb2dyYW1tYWJsZV9sYXlvdXQgPSB7CkBAIC0yMjksNyArMjMzLDcgQEAKIHsKIAlpbnQgbnVtOwogCXUzMiBpZDsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19odyAqaHc7CiAJdW5zaWduZWQgaW50IG51bV9wYXJlbnRzOwogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lc1tQUk9HX1NPVVJDRV9NQVhdOwogCWNvbnN0IGNoYXIgKm5hbWU7CkBAIC0yNTcsMTMgKzI2MSwxMyBAQAogCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobnAsICJjbG9jay1vdXRwdXQtbmFtZXMiLCAmbmFtZSkpCiAJCQluYW1lID0gcHJvZ2Nsa25wLT5uYW1lOwogCi0JCWNsayA9IGF0OTFfY2xrX3JlZ2lzdGVyX3Byb2dyYW1tYWJsZShyZWdtYXAsIG5hbWUsCisJCWh3ID0gYXQ5MV9jbGtfcmVnaXN0ZXJfcHJvZ3JhbW1hYmxlKHJlZ21hcCwgbmFtZSwKIAkJCQkJCSAgICAgcGFyZW50X25hbWVzLCBudW1fcGFyZW50cywKIAkJCQkJCSAgICAgaWQsIGxheW91dCk7Ci0JCWlmIChJU19FUlIoY2xrKSkKKwkJaWYgKElTX0VSUihodykpCiAJCQljb250aW51ZTsKIAotCQlvZl9jbGtfYWRkX3Byb3ZpZGVyKHByb2djbGtucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCQlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKHByb2djbGtucCwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsIGh3KTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXNsb3cuYyBiL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXNsb3cuYwppbmRleCA2MTA5MGIxLi41NjBhOGI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay1zbG93LmMKKysrIGIvZHJpdmVycy9jbGsvYXQ5MS9jbGstc2xvdy5jCkBAIC0xMyw0MiArMTMsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsvYXQ5MV9wbWMuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogCiAjaW5jbHVkZSAicG1jLmgiCi0jaW5jbHVkZSAic2NrYy5oIgotCi0jZGVmaW5lIFNMT1dfQ0xPQ0tfRlJFUQkJMzI3NjgKLSNkZWZpbmUgU0xPV0NLX1NXX0NZQ0xFUwk1Ci0jZGVmaW5lIFNMT1dDS19TV19USU1FX1VTRUMJKChTTE9XQ0tfU1dfQ1lDTEVTICogVVNFQ19QRVJfU0VDKSAvIFwKLQkJCQkgU0xPV19DTE9DS19GUkVRKQotCi0jZGVmaW5lCUFUOTFfU0NLQ19DUgkJCTB4MDAKLSNkZWZpbmUJCUFUOTFfU0NLQ19SQ0VOCQkoMSA8PCAwKQotI2RlZmluZQkJQVQ5MV9TQ0tDX09TQzMyRU4JKDEgPDwgMSkKLSNkZWZpbmUJCUFUOTFfU0NLQ19PU0MzMkJZUAkoMSA8PCAyKQotI2RlZmluZQkJQVQ5MV9TQ0tDX09TQ1NFTAkoMSA8PCAzKQotCi1zdHJ1Y3QgY2xrX3Nsb3dfb3NjIHsKLQlzdHJ1Y3QgY2xrX2h3IGh3OwotCXZvaWQgX19pb21lbSAqc2NrY3I7Ci0JdW5zaWduZWQgbG9uZyBzdGFydHVwX3VzZWM7Ci19OwotCi0jZGVmaW5lIHRvX2Nsa19zbG93X29zYyhodykgY29udGFpbmVyX29mKGh3LCBzdHJ1Y3QgY2xrX3Nsb3dfb3NjLCBodykKLQotc3RydWN0IGNsa19zbG93X3JjX29zYyB7Ci0Jc3RydWN0IGNsa19odyBodzsKLQl2b2lkIF9faW9tZW0gKnNja2NyOwotCXVuc2lnbmVkIGxvbmcgZnJlcXVlbmN5OwotCXVuc2lnbmVkIGxvbmcgYWNjdXJhY3k7Ci0JdW5zaWduZWQgbG9uZyBzdGFydHVwX3VzZWM7Ci19OwotCi0jZGVmaW5lIHRvX2Nsa19zbG93X3JjX29zYyhodykgY29udGFpbmVyX29mKGh3LCBzdHJ1Y3QgY2xrX3Nsb3dfcmNfb3NjLCBodykKIAogc3RydWN0IGNsa19zYW05MjYwX3Nsb3cgewogCXN0cnVjdCBjbGtfaHcgaHc7CkBAIC01NywzMjggKzI2LDYgQEAKIAogI2RlZmluZSB0b19jbGtfc2FtOTI2MF9zbG93KGh3KSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCBjbGtfc2FtOTI2MF9zbG93LCBodykKIAotc3RydWN0IGNsa19zYW05eDVfc2xvdyB7Ci0Jc3RydWN0IGNsa19odyBodzsKLQl2b2lkIF9faW9tZW0gKnNja2NyOwotCXU4IHBhcmVudDsKLX07Ci0KLSNkZWZpbmUgdG9fY2xrX3NhbTl4NV9zbG93KGh3KSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCBjbGtfc2FtOXg1X3Nsb3csIGh3KQotCi1zdGF0aWMgaW50IGNsa19zbG93X29zY19wcmVwYXJlKHN0cnVjdCBjbGtfaHcgKmh3KQotewotCXN0cnVjdCBjbGtfc2xvd19vc2MgKm9zYyA9IHRvX2Nsa19zbG93X29zYyhodyk7Ci0Jdm9pZCBfX2lvbWVtICpzY2tjciA9IG9zYy0+c2NrY3I7Ci0JdTMyIHRtcCA9IHJlYWRsKHNja2NyKTsKLQotCWlmICh0bXAgJiBBVDkxX1NDS0NfT1NDMzJCWVApCi0JCXJldHVybiAwOwotCi0Jd3JpdGVsKHRtcCB8IEFUOTFfU0NLQ19PU0MzMkVOLCBzY2tjcik7Ci0KLQl1c2xlZXBfcmFuZ2Uob3NjLT5zdGFydHVwX3VzZWMsIG9zYy0+c3RhcnR1cF91c2VjICsgMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgY2xrX3Nsb3dfb3NjX3VucHJlcGFyZShzdHJ1Y3QgY2xrX2h3ICpodykKLXsKLQlzdHJ1Y3QgY2xrX3Nsb3dfb3NjICpvc2MgPSB0b19jbGtfc2xvd19vc2MoaHcpOwotCXZvaWQgX19pb21lbSAqc2NrY3IgPSBvc2MtPnNja2NyOwotCXUzMiB0bXAgPSByZWFkbChzY2tjcik7Ci0KLQlpZiAodG1wICYgQVQ5MV9TQ0tDX09TQzMyQllQKQotCQlyZXR1cm47Ci0KLQl3cml0ZWwodG1wICYgfkFUOTFfU0NLQ19PU0MzMkVOLCBzY2tjcik7Ci19Ci0KLXN0YXRpYyBpbnQgY2xrX3Nsb3dfb3NjX2lzX3ByZXBhcmVkKHN0cnVjdCBjbGtfaHcgKmh3KQotewotCXN0cnVjdCBjbGtfc2xvd19vc2MgKm9zYyA9IHRvX2Nsa19zbG93X29zYyhodyk7Ci0Jdm9pZCBfX2lvbWVtICpzY2tjciA9IG9zYy0+c2NrY3I7Ci0JdTMyIHRtcCA9IHJlYWRsKHNja2NyKTsKLQotCWlmICh0bXAgJiBBVDkxX1NDS0NfT1NDMzJCWVApCi0JCXJldHVybiAxOwotCi0JcmV0dXJuICEhKHRtcCAmIEFUOTFfU0NLQ19PU0MzMkVOKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIHNsb3dfb3NjX29wcyA9IHsKLQkucHJlcGFyZSA9IGNsa19zbG93X29zY19wcmVwYXJlLAotCS51bnByZXBhcmUgPSBjbGtfc2xvd19vc2NfdW5wcmVwYXJlLAotCS5pc19wcmVwYXJlZCA9IGNsa19zbG93X29zY19pc19wcmVwYXJlZCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrICogX19pbml0Ci1hdDkxX2Nsa19yZWdpc3Rlcl9zbG93X29zYyh2b2lkIF9faW9tZW0gKnNja2NyLAotCQkJICAgY29uc3QgY2hhciAqbmFtZSwKLQkJCSAgIGNvbnN0IGNoYXIgKnBhcmVudF9uYW1lLAotCQkJICAgdW5zaWduZWQgbG9uZyBzdGFydHVwLAotCQkJICAgYm9vbCBieXBhc3MpCi17Ci0Jc3RydWN0IGNsa19zbG93X29zYyAqb3NjOwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7Ci0Jc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKLQotCWlmICghc2NrY3IgfHwgIW5hbWUgfHwgIXBhcmVudF9uYW1lKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQotCW9zYyA9IGt6YWxsb2Moc2l6ZW9mKCpvc2MpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW9zYykKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0KLQlpbml0Lm5hbWUgPSBuYW1lOwotCWluaXQub3BzID0gJnNsb3dfb3NjX29wczsKLQlpbml0LnBhcmVudF9uYW1lcyA9ICZwYXJlbnRfbmFtZTsKLQlpbml0Lm51bV9wYXJlbnRzID0gMTsKLQlpbml0LmZsYWdzID0gQ0xLX0lHTk9SRV9VTlVTRUQ7Ci0KLQlvc2MtPmh3LmluaXQgPSAmaW5pdDsKLQlvc2MtPnNja2NyID0gc2NrY3I7Ci0Jb3NjLT5zdGFydHVwX3VzZWMgPSBzdGFydHVwOwotCi0JaWYgKGJ5cGFzcykKLQkJd3JpdGVsKChyZWFkbChzY2tjcikgJiB+QVQ5MV9TQ0tDX09TQzMyRU4pIHwgQVQ5MV9TQ0tDX09TQzMyQllQLAotCQkgICAgICAgc2NrY3IpOwotCi0JY2xrID0gY2xrX3JlZ2lzdGVyKE5VTEwsICZvc2MtPmh3KTsKLQlpZiAoSVNfRVJSKGNsaykpCi0JCWtmcmVlKG9zYyk7Ci0KLQlyZXR1cm4gY2xrOwotfQotCi12b2lkIF9faW5pdCBvZl9hdDkxc2FtOXg1X2Nsa19zbG93X29zY19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCQkgICAgIHZvaWQgX19pb21lbSAqc2NrY3IpCi17Ci0Jc3RydWN0IGNsayAqY2xrOwotCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lOwotCWNvbnN0IGNoYXIgKm5hbWUgPSBucC0+bmFtZTsKLQl1MzIgc3RhcnR1cDsKLQlib29sIGJ5cGFzczsKLQotCXBhcmVudF9uYW1lID0gb2ZfY2xrX2dldF9wYXJlbnRfbmFtZShucCwgMCk7Ci0Jb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobnAsICJjbG9jay1vdXRwdXQtbmFtZXMiLCAmbmFtZSk7Ci0Jb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJhdG1lbCxzdGFydHVwLXRpbWUtdXNlYyIsICZzdGFydHVwKTsKLQlieXBhc3MgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJhdG1lbCxvc2MtYnlwYXNzIik7Ci0KLQljbGsgPSBhdDkxX2Nsa19yZWdpc3Rlcl9zbG93X29zYyhzY2tjciwgbmFtZSwgcGFyZW50X25hbWUsIHN0YXJ0dXAsCi0JCQkJCSBieXBhc3MpOwotCWlmIChJU19FUlIoY2xrKSkKLQkJcmV0dXJuOwotCi0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjbGtfc2xvd19yY19vc2NfcmVjYWxjX3JhdGUoc3RydWN0IGNsa19odyAqaHcsCi0JCQkJCQkgdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSkKLXsKLQlzdHJ1Y3QgY2xrX3Nsb3dfcmNfb3NjICpvc2MgPSB0b19jbGtfc2xvd19yY19vc2MoaHcpOwotCi0JcmV0dXJuIG9zYy0+ZnJlcXVlbmN5OwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjbGtfc2xvd19yY19vc2NfcmVjYWxjX2FjY3VyYWN5KHN0cnVjdCBjbGtfaHcgKmh3LAotCQkJCQkJICAgICB1bnNpZ25lZCBsb25nIHBhcmVudF9hY2MpCi17Ci0Jc3RydWN0IGNsa19zbG93X3JjX29zYyAqb3NjID0gdG9fY2xrX3Nsb3dfcmNfb3NjKGh3KTsKLQotCXJldHVybiBvc2MtPmFjY3VyYWN5OwotfQotCi1zdGF0aWMgaW50IGNsa19zbG93X3JjX29zY19wcmVwYXJlKHN0cnVjdCBjbGtfaHcgKmh3KQotewotCXN0cnVjdCBjbGtfc2xvd19yY19vc2MgKm9zYyA9IHRvX2Nsa19zbG93X3JjX29zYyhodyk7Ci0Jdm9pZCBfX2lvbWVtICpzY2tjciA9IG9zYy0+c2NrY3I7Ci0KLQl3cml0ZWwocmVhZGwoc2NrY3IpIHwgQVQ5MV9TQ0tDX1JDRU4sIHNja2NyKTsKLQotCXVzbGVlcF9yYW5nZShvc2MtPnN0YXJ0dXBfdXNlYywgb3NjLT5zdGFydHVwX3VzZWMgKyAxKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBjbGtfc2xvd19yY19vc2NfdW5wcmVwYXJlKHN0cnVjdCBjbGtfaHcgKmh3KQotewotCXN0cnVjdCBjbGtfc2xvd19yY19vc2MgKm9zYyA9IHRvX2Nsa19zbG93X3JjX29zYyhodyk7Ci0Jdm9pZCBfX2lvbWVtICpzY2tjciA9IG9zYy0+c2NrY3I7Ci0KLQl3cml0ZWwocmVhZGwoc2NrY3IpICYgfkFUOTFfU0NLQ19SQ0VOLCBzY2tjcik7Ci19Ci0KLXN0YXRpYyBpbnQgY2xrX3Nsb3dfcmNfb3NjX2lzX3ByZXBhcmVkKHN0cnVjdCBjbGtfaHcgKmh3KQotewotCXN0cnVjdCBjbGtfc2xvd19yY19vc2MgKm9zYyA9IHRvX2Nsa19zbG93X3JjX29zYyhodyk7Ci0KLQlyZXR1cm4gISEocmVhZGwob3NjLT5zY2tjcikgJiBBVDkxX1NDS0NfUkNFTik7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBzbG93X3JjX29zY19vcHMgPSB7Ci0JLnByZXBhcmUgPSBjbGtfc2xvd19yY19vc2NfcHJlcGFyZSwKLQkudW5wcmVwYXJlID0gY2xrX3Nsb3dfcmNfb3NjX3VucHJlcGFyZSwKLQkuaXNfcHJlcGFyZWQgPSBjbGtfc2xvd19yY19vc2NfaXNfcHJlcGFyZWQsCi0JLnJlY2FsY19yYXRlID0gY2xrX3Nsb3dfcmNfb3NjX3JlY2FsY19yYXRlLAotCS5yZWNhbGNfYWNjdXJhY3kgPSBjbGtfc2xvd19yY19vc2NfcmVjYWxjX2FjY3VyYWN5LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgKiBfX2luaXQKLWF0OTFfY2xrX3JlZ2lzdGVyX3Nsb3dfcmNfb3NjKHZvaWQgX19pb21lbSAqc2NrY3IsCi0JCQkgICAgICBjb25zdCBjaGFyICpuYW1lLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBmcmVxdWVuY3ksCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIGFjY3VyYWN5LAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBzdGFydHVwKQotewotCXN0cnVjdCBjbGtfc2xvd19yY19vc2MgKm9zYzsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOwotCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7Ci0KLQlpZiAoIXNja2NyIHx8ICFuYW1lKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQotCW9zYyA9IGt6YWxsb2Moc2l6ZW9mKCpvc2MpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW9zYykKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0KLQlpbml0Lm5hbWUgPSBuYW1lOwotCWluaXQub3BzID0gJnNsb3dfcmNfb3NjX29wczsKLQlpbml0LnBhcmVudF9uYW1lcyA9IE5VTEw7Ci0JaW5pdC5udW1fcGFyZW50cyA9IDA7Ci0JaW5pdC5mbGFncyA9IENMS19JR05PUkVfVU5VU0VEOwotCi0Jb3NjLT5ody5pbml0ID0gJmluaXQ7Ci0Jb3NjLT5zY2tjciA9IHNja2NyOwotCW9zYy0+ZnJlcXVlbmN5ID0gZnJlcXVlbmN5OwotCW9zYy0+YWNjdXJhY3kgPSBhY2N1cmFjeTsKLQlvc2MtPnN0YXJ0dXBfdXNlYyA9IHN0YXJ0dXA7Ci0KLQljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJm9zYy0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkKLQkJa2ZyZWUob3NjKTsKLQotCXJldHVybiBjbGs7Ci19Ci0KLXZvaWQgX19pbml0IG9mX2F0OTFzYW05eDVfY2xrX3Nsb3dfcmNfb3NjX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQkJCQl2b2lkIF9faW9tZW0gKnNja2NyKQotewotCXN0cnVjdCBjbGsgKmNsazsKLQl1MzIgZnJlcXVlbmN5ID0gMDsKLQl1MzIgYWNjdXJhY3kgPSAwOwotCXUzMiBzdGFydHVwID0gMDsKLQljb25zdCBjaGFyICpuYW1lID0gbnAtPm5hbWU7Ci0KLQlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhucCwgImNsb2NrLW91dHB1dC1uYW1lcyIsICZuYW1lKTsKLQlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImNsb2NrLWZyZXF1ZW5jeSIsICZmcmVxdWVuY3kpOwotCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiY2xvY2stYWNjdXJhY3kiLCAmYWNjdXJhY3kpOwotCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiYXRtZWwsc3RhcnR1cC10aW1lLXVzZWMiLCAmc3RhcnR1cCk7Ci0KLQljbGsgPSBhdDkxX2Nsa19yZWdpc3Rlcl9zbG93X3JjX29zYyhzY2tjciwgbmFtZSwgZnJlcXVlbmN5LCBhY2N1cmFjeSwKLQkJCQkJICAgIHN0YXJ0dXApOwotCWlmIChJU19FUlIoY2xrKSkKLQkJcmV0dXJuOwotCi0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOwotfQotCi1zdGF0aWMgaW50IGNsa19zYW05eDVfc2xvd19zZXRfcGFyZW50KHN0cnVjdCBjbGtfaHcgKmh3LCB1OCBpbmRleCkKLXsKLQlzdHJ1Y3QgY2xrX3NhbTl4NV9zbG93ICpzbG93Y2sgPSB0b19jbGtfc2FtOXg1X3Nsb3coaHcpOwotCXZvaWQgX19pb21lbSAqc2NrY3IgPSBzbG93Y2stPnNja2NyOwotCXUzMiB0bXA7Ci0KLQlpZiAoaW5kZXggPiAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXRtcCA9IHJlYWRsKHNja2NyKTsKLQotCWlmICgoIWluZGV4ICYmICEodG1wICYgQVQ5MV9TQ0tDX09TQ1NFTCkpIHx8Ci0JICAgIChpbmRleCAmJiAodG1wICYgQVQ5MV9TQ0tDX09TQ1NFTCkpKQotCQlyZXR1cm4gMDsKLQotCWlmIChpbmRleCkKLQkJdG1wIHw9IEFUOTFfU0NLQ19PU0NTRUw7Ci0JZWxzZQotCQl0bXAgJj0gfkFUOTFfU0NLQ19PU0NTRUw7Ci0KLQl3cml0ZWwodG1wLCBzY2tjcik7Ci0KLQl1c2xlZXBfcmFuZ2UoU0xPV0NLX1NXX1RJTUVfVVNFQywgU0xPV0NLX1NXX1RJTUVfVVNFQyArIDEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1OCBjbGtfc2FtOXg1X3Nsb3dfZ2V0X3BhcmVudChzdHJ1Y3QgY2xrX2h3ICpodykKLXsKLQlzdHJ1Y3QgY2xrX3NhbTl4NV9zbG93ICpzbG93Y2sgPSB0b19jbGtfc2FtOXg1X3Nsb3coaHcpOwotCi0JcmV0dXJuICEhKHJlYWRsKHNsb3djay0+c2NrY3IpICYgQVQ5MV9TQ0tDX09TQ1NFTCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBzYW05eDVfc2xvd19vcHMgPSB7Ci0JLnNldF9wYXJlbnQgPSBjbGtfc2FtOXg1X3Nsb3dfc2V0X3BhcmVudCwKLQkuZ2V0X3BhcmVudCA9IGNsa19zYW05eDVfc2xvd19nZXRfcGFyZW50LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgKiBfX2luaXQKLWF0OTFfY2xrX3JlZ2lzdGVyX3NhbTl4NV9zbG93KHZvaWQgX19pb21lbSAqc2NrY3IsCi0JCQkgICAgICBjb25zdCBjaGFyICpuYW1lLAotCQkJICAgICAgY29uc3QgY2hhciAqKnBhcmVudF9uYW1lcywKLQkJCSAgICAgIGludCBudW1fcGFyZW50cykKLXsKLQlzdHJ1Y3QgY2xrX3NhbTl4NV9zbG93ICpzbG93Y2s7Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKLQlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OwotCi0JaWYgKCFzY2tjciB8fCAhbmFtZSB8fCAhcGFyZW50X25hbWVzIHx8ICFudW1fcGFyZW50cykKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0KLQlzbG93Y2sgPSBremFsbG9jKHNpemVvZigqc2xvd2NrKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzbG93Y2spCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCi0JaW5pdC5uYW1lID0gbmFtZTsKLQlpbml0Lm9wcyA9ICZzYW05eDVfc2xvd19vcHM7Ci0JaW5pdC5wYXJlbnRfbmFtZXMgPSBwYXJlbnRfbmFtZXM7Ci0JaW5pdC5udW1fcGFyZW50cyA9IG51bV9wYXJlbnRzOwotCWluaXQuZmxhZ3MgPSAwOwotCi0Jc2xvd2NrLT5ody5pbml0ID0gJmluaXQ7Ci0Jc2xvd2NrLT5zY2tjciA9IHNja2NyOwotCXNsb3djay0+cGFyZW50ID0gISEocmVhZGwoc2NrY3IpICYgQVQ5MV9TQ0tDX09TQ1NFTCk7Ci0KLQljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJnNsb3djay0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkKLQkJa2ZyZWUoc2xvd2NrKTsKLQotCXJldHVybiBjbGs7Ci19Ci0KLXZvaWQgX19pbml0IG9mX2F0OTFzYW05eDVfY2xrX3Nsb3dfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQkJIHZvaWQgX19pb21lbSAqc2NrY3IpCi17Ci0Jc3RydWN0IGNsayAqY2xrOwotCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lc1syXTsKLQl1bnNpZ25lZCBpbnQgbnVtX3BhcmVudHM7Ci0JY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOwotCi0JbnVtX3BhcmVudHMgPSBvZl9jbGtfZ2V0X3BhcmVudF9jb3VudChucCk7Ci0JaWYgKG51bV9wYXJlbnRzID09IDAgfHwgbnVtX3BhcmVudHMgPiAyKQotCQlyZXR1cm47Ci0KLQlvZl9jbGtfcGFyZW50X2ZpbGwobnAsIHBhcmVudF9uYW1lcywgbnVtX3BhcmVudHMpOwotCi0Jb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobnAsICJjbG9jay1vdXRwdXQtbmFtZXMiLCAmbmFtZSk7Ci0KLQljbGsgPSBhdDkxX2Nsa19yZWdpc3Rlcl9zYW05eDVfc2xvdyhzY2tjciwgbmFtZSwgcGFyZW50X25hbWVzLAotCQkJCQkgICAgbnVtX3BhcmVudHMpOwotCWlmIChJU19FUlIoY2xrKSkKLQkJcmV0dXJuOwotCi0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOwotfQotCiBzdGF0aWMgdTggY2xrX3NhbTkyNjBfc2xvd19nZXRfcGFyZW50KHN0cnVjdCBjbGtfaHcgKmh3KQogewogCXN0cnVjdCBjbGtfc2FtOTI2MF9zbG93ICpzbG93Y2sgPSB0b19jbGtfc2FtOTI2MF9zbG93KGh3KTsKQEAgLTM5MywxNSArNDAsMTYgQEAKIAkuZ2V0X3BhcmVudCA9IGNsa19zYW05MjYwX3Nsb3dfZ2V0X3BhcmVudCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICogX19pbml0CitzdGF0aWMgc3RydWN0IGNsa19odyAqIF9faW5pdAogYXQ5MV9jbGtfcmVnaXN0ZXJfc2FtOTI2MF9zbG93KHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKIAkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLAogCQkJICAgICAgIGNvbnN0IGNoYXIgKipwYXJlbnRfbmFtZXMsCiAJCQkgICAgICAgaW50IG51bV9wYXJlbnRzKQogewogCXN0cnVjdCBjbGtfc2FtOTI2MF9zbG93ICpzbG93Y2s7Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OworCWludCByZXQ7CiAKIAlpZiAoIW5hbWUpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwpAQCAtNDIyLDE2ICs3MCwxOSBAQAogCXNsb3djay0+aHcuaW5pdCA9ICZpbml0OwogCXNsb3djay0+cmVnbWFwID0gcmVnbWFwOwogCi0JY2xrID0gY2xrX3JlZ2lzdGVyKE5VTEwsICZzbG93Y2stPmh3KTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaHcgPSAmc2xvd2NrLT5odzsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJnNsb3djay0+aHcpOworCWlmIChyZXQpIHsKIAkJa2ZyZWUoc2xvd2NrKTsKKwkJaHcgPSBFUlJfUFRSKHJldCk7CisJfQogCi0JcmV0dXJuIGNsazsKKwlyZXR1cm4gaHc7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBvZl9hdDkxc2FtOTI2MF9jbGtfc2xvd19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZXNbMl07CiAJdW5zaWduZWQgaW50IG51bV9wYXJlbnRzOwogCWNvbnN0IGNoYXIgKm5hbWUgPSBucC0+bmFtZTsKQEAgLTQ0OCwxMiArOTksMTIgQEAKIAogCW9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKG5wLCAiY2xvY2stb3V0cHV0LW5hbWVzIiwgJm5hbWUpOwogCi0JY2xrID0gYXQ5MV9jbGtfcmVnaXN0ZXJfc2FtOTI2MF9zbG93KHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWVzLAorCWh3ID0gYXQ5MV9jbGtfcmVnaXN0ZXJfc2FtOTI2MF9zbG93KHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWVzLAogCQkJCQkgICAgIG51bV9wYXJlbnRzKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaWYgKElTX0VSUihodykpCiAJCXJldHVybjsKIAotCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOwogfQogCiBDTEtfT0ZfREVDTEFSRShhdDkxc2FtOTI2MF9jbGtfc2xvdywgImF0bWVsLGF0OTFzYW05MjYwLWNsay1zbG93IiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXNtZC5jIGIvZHJpdmVycy9jbGsvYXQ5MS9jbGstc21kLmMKaW5kZXggM2MwNGIwNi4uOTY1YzY2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvYXQ5MS9jbGstc21kLmMKKysrIGIvZHJpdmVycy9jbGsvYXQ5MS9jbGstc21kLmMKQEAgLTExMSwxMyArMTExLDE0IEBACiAJLnNldF9yYXRlID0gYXQ5MXNhbTl4NV9jbGtfc21kX3NldF9yYXRlLAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgKiBfX2luaXQKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICogX19pbml0CiBhdDkxc2FtOXg1X2Nsa19yZWdpc3Rlcl9zbWQoc3RydWN0IHJlZ21hcCAqcmVnbWFwLCBjb25zdCBjaGFyICpuYW1lLAogCQkJICAgIGNvbnN0IGNoYXIgKipwYXJlbnRfbmFtZXMsIHU4IG51bV9wYXJlbnRzKQogewogCXN0cnVjdCBhdDkxc2FtOXg1X2Nsa19zbWQgKnNtZDsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJaW50IHJldDsKIAogCXNtZCA9IGt6YWxsb2Moc2l6ZW9mKCpzbWQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNtZCkKQEAgLTEzMiwxNiArMTMzLDE5IEBACiAJc21kLT5ody5pbml0ID0gJmluaXQ7CiAJc21kLT5yZWdtYXAgPSByZWdtYXA7CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJnNtZC0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9ICZzbWQtPmh3OworCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmc21kLT5odyk7CisJaWYgKHJldCkgewogCQlrZnJlZShzbWQpOworCQlodyA9IEVSUl9QVFIocmV0KTsKKwl9CiAKLQlyZXR1cm4gY2xrOworCXJldHVybiBodzsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG9mX2F0OTFzYW05eDVfY2xrX3NtZF9zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAl1bnNpZ25lZCBpbnQgbnVtX3BhcmVudHM7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWVzW1NNRF9TT1VSQ0VfTUFYXTsKIAljb25zdCBjaGFyICpuYW1lID0gbnAtPm5hbWU7CkBAIC0xNTksMTIgKzE2MywxMiBAQAogCWlmIChJU19FUlIocmVnbWFwKSkKIAkJcmV0dXJuOwogCi0JY2xrID0gYXQ5MXNhbTl4NV9jbGtfcmVnaXN0ZXJfc21kKHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWVzLAorCWh3ID0gYXQ5MXNhbTl4NV9jbGtfcmVnaXN0ZXJfc21kKHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWVzLAogCQkJCQkgIG51bV9wYXJlbnRzKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaWYgKElTX0VSUihodykpCiAJCXJldHVybjsKIAotCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOwogfQogQ0xLX09GX0RFQ0xBUkUoYXQ5MXNhbTl4NV9jbGtfc21kLCAiYXRtZWwsYXQ5MXNhbTl4NS1jbGstc21kIiwKIAkgICAgICAgb2ZfYXQ5MXNhbTl4NV9jbGtfc21kX3NldHVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXN5c3RlbS5jIGIvZHJpdmVycy9jbGsvYXQ5MS9jbGstc3lzdGVtLmMKaW5kZXggOGYzNWQ4MS4uODZhMzY4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvYXQ5MS9jbGstc3lzdGVtLmMKKysrIGIvZHJpdmVycy9jbGsvYXQ5MS9jbGstc3lzdGVtLmMKQEAgLTg4LDEzICs4OCwxNCBAQAogCS5pc19wcmVwYXJlZCA9IGNsa19zeXN0ZW1faXNfcHJlcGFyZWQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayAqIF9faW5pdAorc3RhdGljIHN0cnVjdCBjbGtfaHcgKiBfX2luaXQKIGF0OTFfY2xrX3JlZ2lzdGVyX3N5c3RlbShzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgY29uc3QgY2hhciAqcGFyZW50X25hbWUsIHU4IGlkKQogewogCXN0cnVjdCBjbGtfc3lzdGVtICpzeXM7Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OworCWludCByZXQ7CiAKIAlpZiAoIXBhcmVudF9uYW1lIHx8IGlkID4gU1lTVEVNX01BWF9JRCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CkBAIC0xMTMsMTggKzExNCwyMSBAQAogCXN5cy0+aHcuaW5pdCA9ICZpbml0OwogCXN5cy0+cmVnbWFwID0gcmVnbWFwOwogCi0JY2xrID0gY2xrX3JlZ2lzdGVyKE5VTEwsICZzeXMtPmh3KTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaHcgPSAmc3lzLT5odzsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJnN5cy0+aHcpOworCWlmIChyZXQpIHsKIAkJa2ZyZWUoc3lzKTsKKwkJaHcgPSBFUlJfUFRSKHJldCk7CisJfQogCi0JcmV0dXJuIGNsazsKKwlyZXR1cm4gaHc7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBvZl9hdDkxcm05MjAwX2Nsa19zeXNfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKIAlpbnQgbnVtOwogCXUzMiBpZDsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19odyAqaHc7CiAJY29uc3QgY2hhciAqbmFtZTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnN5c2Nsa25wOwogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lOwpAQCAtMTQ3LDExICsxNTEsMTEgQEAKIAogCQlwYXJlbnRfbmFtZSA9IG9mX2Nsa19nZXRfcGFyZW50X25hbWUoc3lzY2xrbnAsIDApOwogCi0JCWNsayA9IGF0OTFfY2xrX3JlZ2lzdGVyX3N5c3RlbShyZWdtYXAsIG5hbWUsIHBhcmVudF9uYW1lLCBpZCk7Ci0JCWlmIChJU19FUlIoY2xrKSkKKwkJaHcgPSBhdDkxX2Nsa19yZWdpc3Rlcl9zeXN0ZW0ocmVnbWFwLCBuYW1lLCBwYXJlbnRfbmFtZSwgaWQpOworCQlpZiAoSVNfRVJSKGh3KSkKIAkJCWNvbnRpbnVlOwogCi0JCW9mX2Nsa19hZGRfcHJvdmlkZXIoc3lzY2xrbnAsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKKwkJb2ZfY2xrX2FkZF9od19wcm92aWRlcihzeXNjbGtucCwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsIGh3KTsKIAl9CiB9CiBDTEtfT0ZfREVDTEFSRShhdDkxcm05MjAwX2Nsa19zeXMsICJhdG1lbCxhdDkxcm05MjAwLWNsay1zeXN0ZW0iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYXQ5MS9jbGstdXNiLmMgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay11c2IuYwppbmRleCBkODBiZGIwLi43OTE3NzBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay11c2IuYworKysgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay11c2IuYwpAQCAtMTkyLDEzICsxOTIsMTQgQEAKIAkuc2V0X3JhdGUgPSBhdDkxc2FtOXg1X2Nsa191c2Jfc2V0X3JhdGUsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayAqIF9faW5pdAorc3RhdGljIHN0cnVjdCBjbGtfaHcgKiBfX2luaXQKIGF0OTFzYW05eDVfY2xrX3JlZ2lzdGVyX3VzYihzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgICAgY29uc3QgY2hhciAqKnBhcmVudF9uYW1lcywgdTggbnVtX3BhcmVudHMpCiB7CiAJc3RydWN0IGF0OTFzYW05eDVfY2xrX3VzYiAqdXNiOwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7CisJc3RydWN0IGNsa19odyAqaHc7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlpbnQgcmV0OwogCiAJdXNiID0ga3phbGxvYyhzaXplb2YoKnVzYiksIEdGUF9LRVJORUwpOwogCWlmICghdXNiKQpAQCAtMjE0LDIwICsyMTUsMjQgQEAKIAl1c2ItPmh3LmluaXQgPSAmaW5pdDsKIAl1c2ItPnJlZ21hcCA9IHJlZ21hcDsKIAotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmdXNiLT5odyk7Ci0JaWYgKElTX0VSUihjbGspKQorCWh3ID0gJnVzYi0+aHc7CisJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZ1c2ItPmh3KTsKKwlpZiAocmV0KSB7CiAJCWtmcmVlKHVzYik7CisJCWh3ID0gRVJSX1BUUihyZXQpOworCX0KIAotCXJldHVybiBjbGs7CisJcmV0dXJuIGh3OwogfQogCi1zdGF0aWMgc3RydWN0IGNsayAqIF9faW5pdAorc3RhdGljIHN0cnVjdCBjbGtfaHcgKiBfX2luaXQKIGF0OTFzYW05bjEyX2Nsa19yZWdpc3Rlcl91c2Ioc3RydWN0IHJlZ21hcCAqcmVnbWFwLCBjb25zdCBjaGFyICpuYW1lLAogCQkJICAgICBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSkKIHsKIAlzdHJ1Y3QgYXQ5MXNhbTl4NV9jbGtfdXNiICp1c2I7Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OworCWludCByZXQ7CiAKIAl1c2IgPSBremFsbG9jKHNpemVvZigqdXNiKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF1c2IpCkBAIC0yNDIsMTEgKzI0NywxNCBAQAogCXVzYi0+aHcuaW5pdCA9ICZpbml0OwogCXVzYi0+cmVnbWFwID0gcmVnbWFwOwogCi0JY2xrID0gY2xrX3JlZ2lzdGVyKE5VTEwsICZ1c2ItPmh3KTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaHcgPSAmdXNiLT5odzsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJnVzYi0+aHcpOworCWlmIChyZXQpIHsKIAkJa2ZyZWUodXNiKTsKKwkJaHcgPSBFUlJfUFRSKHJldCk7CisJfQogCi0JcmV0dXJuIGNsazsKKwlyZXR1cm4gaHc7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGF0OTFybTkyMDBfY2xrX3VzYl9yZWNhbGNfcmF0ZShzdHJ1Y3QgY2xrX2h3ICpodywKQEAgLTMzNCwxMyArMzQyLDE0IEBACiAJLnNldF9yYXRlID0gYXQ5MXJtOTIwMF9jbGtfdXNiX3NldF9yYXRlLAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgKiBfX2luaXQKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICogX19pbml0CiBhdDkxcm05MjAwX2Nsa19yZWdpc3Rlcl91c2Ioc3RydWN0IHJlZ21hcCAqcmVnbWFwLCBjb25zdCBjaGFyICpuYW1lLAogCQkJICAgIGNvbnN0IGNoYXIgKnBhcmVudF9uYW1lLCBjb25zdCB1MzIgKmRpdmlzb3JzKQogewogCXN0cnVjdCBhdDkxcm05MjAwX2Nsa191c2IgKnVzYjsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJaW50IHJldDsKIAogCXVzYiA9IGt6YWxsb2Moc2l6ZW9mKCp1c2IpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXVzYikKQEAgLTM1NiwxNiArMzY1LDE5IEBACiAJdXNiLT5yZWdtYXAgPSByZWdtYXA7CiAJbWVtY3B5KHVzYi0+ZGl2aXNvcnMsIGRpdmlzb3JzLCBzaXplb2YodXNiLT5kaXZpc29ycykpOwogCi0JY2xrID0gY2xrX3JlZ2lzdGVyKE5VTEwsICZ1c2ItPmh3KTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaHcgPSAmdXNiLT5odzsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJnVzYi0+aHcpOworCWlmIChyZXQpIHsKIAkJa2ZyZWUodXNiKTsKKwkJaHcgPSBFUlJfUFRSKHJldCk7CisJfQogCi0JcmV0dXJuIGNsazsKKwlyZXR1cm4gaHc7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBvZl9hdDkxc2FtOXg1X2Nsa191c2Jfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19odyAqaHc7CiAJdW5zaWduZWQgaW50IG51bV9wYXJlbnRzOwogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lc1tVU0JfU09VUkNFX01BWF07CiAJY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOwpAQCAtMzgzLDE5ICszOTUsMTkgQEAKIAlpZiAoSVNfRVJSKHJlZ21hcCkpCiAJCXJldHVybjsKIAotCWNsayA9IGF0OTFzYW05eDVfY2xrX3JlZ2lzdGVyX3VzYihyZWdtYXAsIG5hbWUsIHBhcmVudF9uYW1lcywKLQkJCQkJICBudW1fcGFyZW50cyk7Ci0JaWYgKElTX0VSUihjbGspKQorCWh3ID0gYXQ5MXNhbTl4NV9jbGtfcmVnaXN0ZXJfdXNiKHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWVzLAorCQkJCQkgbnVtX3BhcmVudHMpOworCWlmIChJU19FUlIoaHcpKQogCQlyZXR1cm47CiAKLQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJb2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsIGh3KTsKIH0KIENMS19PRl9ERUNMQVJFKGF0OTFzYW05eDVfY2xrX3VzYiwgImF0bWVsLGF0OTFzYW05eDUtY2xrLXVzYiIsCiAJICAgICAgIG9mX2F0OTFzYW05eDVfY2xrX3VzYl9zZXR1cCk7CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBvZl9hdDkxc2FtOW4xMl9jbGtfdXNiX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0Jc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lOwogCWNvbnN0IGNoYXIgKm5hbWUgPSBucC0+bmFtZTsKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CkBAIC00MTAsMTggKzQyMiwxOCBAQAogCWlmIChJU19FUlIocmVnbWFwKSkKIAkJcmV0dXJuOwogCi0JY2xrID0gYXQ5MXNhbTluMTJfY2xrX3JlZ2lzdGVyX3VzYihyZWdtYXAsIG5hbWUsIHBhcmVudF9uYW1lKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaHcgPSBhdDkxc2FtOW4xMl9jbGtfcmVnaXN0ZXJfdXNiKHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWUpOworCWlmIChJU19FUlIoaHcpKQogCQlyZXR1cm47CiAKLQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJb2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsIGh3KTsKIH0KIENMS19PRl9ERUNMQVJFKGF0OTFzYW05bjEyX2Nsa191c2IsICJhdG1lbCxhdDkxc2FtOW4xMi1jbGstdXNiIiwKIAkgICAgICAgb2ZfYXQ5MXNhbTluMTJfY2xrX3VzYl9zZXR1cCk7CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBvZl9hdDkxcm05MjAwX2Nsa191c2Jfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19odyAqaHc7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CiAJY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOwogCXUzMiBkaXZpc29yc1s0XSA9IHswLCAwLCAwLCAwfTsKQEAgLTQ0MCwxMiArNDUyLDExIEBACiAJcmVnbWFwID0gc3lzY29uX25vZGVfdG9fcmVnbWFwKG9mX2dldF9wYXJlbnQobnApKTsKIAlpZiAoSVNfRVJSKHJlZ21hcCkpCiAJCXJldHVybjsKLQotCWNsayA9IGF0OTFybTkyMDBfY2xrX3JlZ2lzdGVyX3VzYihyZWdtYXAsIG5hbWUsIHBhcmVudF9uYW1lLCBkaXZpc29ycyk7Ci0JaWYgKElTX0VSUihjbGspKQorCWh3ID0gYXQ5MXJtOTIwMF9jbGtfcmVnaXN0ZXJfdXNiKHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWUsIGRpdmlzb3JzKTsKKwlpZiAoSVNfRVJSKGh3KSkKIAkJcmV0dXJuOwogCi0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobnAsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7CiB9CiBDTEtfT0ZfREVDTEFSRShhdDkxcm05MjAwX2Nsa191c2IsICJhdG1lbCxhdDkxcm05MjAwLWNsay11c2IiLAogCSAgICAgICBvZl9hdDkxcm05MjAwX2Nsa191c2Jfc2V0dXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYXQ5MS9jbGstdXRtaS5jIGIvZHJpdmVycy9jbGsvYXQ5MS9jbGstdXRtaS5jCmluZGV4IDYxZmNmMzkuLmFhZGFiZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXV0bWkuYworKysgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay11dG1pLmMKQEAgLTc3LDEzICs3NywxNCBAQAogCS5yZWNhbGNfcmF0ZSA9IGNsa191dG1pX3JlY2FsY19yYXRlLAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgKiBfX2luaXQKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICogX19pbml0CiBhdDkxX2Nsa19yZWdpc3Rlcl91dG1pKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKIAkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnBhcmVudF9uYW1lKQogewogCXN0cnVjdCBjbGtfdXRtaSAqdXRtaTsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJaW50IHJldDsKIAogCXV0bWkgPSBremFsbG9jKHNpemVvZigqdXRtaSksIEdGUF9LRVJORUwpOwogCWlmICghdXRtaSkKQEAgLTk4LDE2ICs5OSwxOSBAQAogCXV0bWktPmh3LmluaXQgPSAmaW5pdDsKIAl1dG1pLT5yZWdtYXAgPSByZWdtYXA7CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJnV0bWktPmh3KTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaHcgPSAmdXRtaS0+aHc7CisJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZ1dG1pLT5odyk7CisJaWYgKHJldCkgewogCQlrZnJlZSh1dG1pKTsKKwkJaHcgPSBFUlJfUFRSKHJldCk7CisJfQogCi0JcmV0dXJuIGNsazsKKwlyZXR1cm4gaHc7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBvZl9hdDkxc2FtOXg1X2Nsa191dG1pX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0Jc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lOwogCWNvbnN0IGNoYXIgKm5hbWUgPSBucC0+bmFtZTsKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CkBAIC0xMjAsMTEgKzEyNCwxMSBAQAogCWlmIChJU19FUlIocmVnbWFwKSkKIAkJcmV0dXJuOwogCi0JY2xrID0gYXQ5MV9jbGtfcmVnaXN0ZXJfdXRtaShyZWdtYXAsIG5hbWUsIHBhcmVudF9uYW1lKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaHcgPSBhdDkxX2Nsa19yZWdpc3Rlcl91dG1pKHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWUpOworCWlmIChJU19FUlIoaHcpKQogCQlyZXR1cm47CiAKLQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJb2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsIGh3KTsKIAlyZXR1cm47CiB9CiBDTEtfT0ZfREVDTEFSRShhdDkxc2FtOXg1X2Nsa191dG1pLCAiYXRtZWwsYXQ5MXNhbTl4NS1jbGstdXRtaSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9hdDkxL3Nja2MuYyBiL2RyaXZlcnMvY2xrL2F0OTEvc2NrYy5jCmluZGV4IDExODRkNzYuLmFiNmVjZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2F0OTEvc2NrYy5jCisrKyBiL2RyaXZlcnMvY2xrL2F0OTEvc2NrYy5jCkBAIC0xMiwxMSArMTIsMzgyIEBACiAKICNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlICJzY2tjLmgiCisjZGVmaW5lIFNMT1dfQ0xPQ0tfRlJFUQkJMzI3NjgKKyNkZWZpbmUgU0xPV0NLX1NXX0NZQ0xFUwk1CisjZGVmaW5lIFNMT1dDS19TV19USU1FX1VTRUMJKChTTE9XQ0tfU1dfQ1lDTEVTICogVVNFQ19QRVJfU0VDKSAvIFwKKwkJCQkgU0xPV19DTE9DS19GUkVRKQorCisjZGVmaW5lCUFUOTFfU0NLQ19DUgkJCTB4MDAKKyNkZWZpbmUJCUFUOTFfU0NLQ19SQ0VOCQkoMSA8PCAwKQorI2RlZmluZQkJQVQ5MV9TQ0tDX09TQzMyRU4JKDEgPDwgMSkKKyNkZWZpbmUJCUFUOTFfU0NLQ19PU0MzMkJZUAkoMSA8PCAyKQorI2RlZmluZQkJQVQ5MV9TQ0tDX09TQ1NFTAkoMSA8PCAzKQorCitzdHJ1Y3QgY2xrX3Nsb3dfb3NjIHsKKwlzdHJ1Y3QgY2xrX2h3IGh3OworCXZvaWQgX19pb21lbSAqc2NrY3I7CisJdW5zaWduZWQgbG9uZyBzdGFydHVwX3VzZWM7Cit9OworCisjZGVmaW5lIHRvX2Nsa19zbG93X29zYyhodykgY29udGFpbmVyX29mKGh3LCBzdHJ1Y3QgY2xrX3Nsb3dfb3NjLCBodykKKworc3RydWN0IGNsa19zYW1hNWQ0X3Nsb3dfb3NjIHsKKwlzdHJ1Y3QgY2xrX2h3IGh3OworCXZvaWQgX19pb21lbSAqc2NrY3I7CisJdW5zaWduZWQgbG9uZyBzdGFydHVwX3VzZWM7CisJYm9vbCBwcmVwYXJlZDsKK307CisKKyNkZWZpbmUgdG9fY2xrX3NhbWE1ZDRfc2xvd19vc2MoaHcpIGNvbnRhaW5lcl9vZihodywgc3RydWN0IGNsa19zYW1hNWQ0X3Nsb3dfb3NjLCBodykKKworc3RydWN0IGNsa19zbG93X3JjX29zYyB7CisJc3RydWN0IGNsa19odyBodzsKKwl2b2lkIF9faW9tZW0gKnNja2NyOworCXVuc2lnbmVkIGxvbmcgZnJlcXVlbmN5OworCXVuc2lnbmVkIGxvbmcgYWNjdXJhY3k7CisJdW5zaWduZWQgbG9uZyBzdGFydHVwX3VzZWM7Cit9OworCisjZGVmaW5lIHRvX2Nsa19zbG93X3JjX29zYyhodykgY29udGFpbmVyX29mKGh3LCBzdHJ1Y3QgY2xrX3Nsb3dfcmNfb3NjLCBodykKKworc3RydWN0IGNsa19zYW05eDVfc2xvdyB7CisJc3RydWN0IGNsa19odyBodzsKKwl2b2lkIF9faW9tZW0gKnNja2NyOworCXU4IHBhcmVudDsKK307CisKKyNkZWZpbmUgdG9fY2xrX3NhbTl4NV9zbG93KGh3KSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCBjbGtfc2FtOXg1X3Nsb3csIGh3KQorCitzdGF0aWMgaW50IGNsa19zbG93X29zY19wcmVwYXJlKHN0cnVjdCBjbGtfaHcgKmh3KQoreworCXN0cnVjdCBjbGtfc2xvd19vc2MgKm9zYyA9IHRvX2Nsa19zbG93X29zYyhodyk7CisJdm9pZCBfX2lvbWVtICpzY2tjciA9IG9zYy0+c2NrY3I7CisJdTMyIHRtcCA9IHJlYWRsKHNja2NyKTsKKworCWlmICh0bXAgJiAoQVQ5MV9TQ0tDX09TQzMyQllQIHwgQVQ5MV9TQ0tDX09TQzMyRU4pKQorCQlyZXR1cm4gMDsKKworCXdyaXRlbCh0bXAgfCBBVDkxX1NDS0NfT1NDMzJFTiwgc2NrY3IpOworCisJdXNsZWVwX3JhbmdlKG9zYy0+c3RhcnR1cF91c2VjLCBvc2MtPnN0YXJ0dXBfdXNlYyArIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNsa19zbG93X29zY191bnByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IGNsa19zbG93X29zYyAqb3NjID0gdG9fY2xrX3Nsb3dfb3NjKGh3KTsKKwl2b2lkIF9faW9tZW0gKnNja2NyID0gb3NjLT5zY2tjcjsKKwl1MzIgdG1wID0gcmVhZGwoc2NrY3IpOworCisJaWYgKHRtcCAmIEFUOTFfU0NLQ19PU0MzMkJZUCkKKwkJcmV0dXJuOworCisJd3JpdGVsKHRtcCAmIH5BVDkxX1NDS0NfT1NDMzJFTiwgc2NrY3IpOworfQorCitzdGF0aWMgaW50IGNsa19zbG93X29zY19pc19wcmVwYXJlZChzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgY2xrX3Nsb3dfb3NjICpvc2MgPSB0b19jbGtfc2xvd19vc2MoaHcpOworCXZvaWQgX19pb21lbSAqc2NrY3IgPSBvc2MtPnNja2NyOworCXUzMiB0bXAgPSByZWFkbChzY2tjcik7CisKKwlpZiAodG1wICYgQVQ5MV9TQ0tDX09TQzMyQllQKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAhISh0bXAgJiBBVDkxX1NDS0NfT1NDMzJFTik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBzbG93X29zY19vcHMgPSB7CisJLnByZXBhcmUgPSBjbGtfc2xvd19vc2NfcHJlcGFyZSwKKwkudW5wcmVwYXJlID0gY2xrX3Nsb3dfb3NjX3VucHJlcGFyZSwKKwkuaXNfcHJlcGFyZWQgPSBjbGtfc2xvd19vc2NfaXNfcHJlcGFyZWQsCit9OworCitzdGF0aWMgc3RydWN0IGNsa19odyAqIF9faW5pdAorYXQ5MV9jbGtfcmVnaXN0ZXJfc2xvd19vc2Modm9pZCBfX2lvbWVtICpzY2tjciwKKwkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgc3RhcnR1cCwKKwkJCSAgIGJvb2wgYnlwYXNzKQoreworCXN0cnVjdCBjbGtfc2xvd19vc2MgKm9zYzsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKKwlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OworCWludCByZXQ7CisKKwlpZiAoIXNja2NyIHx8ICFuYW1lIHx8ICFwYXJlbnRfbmFtZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlvc2MgPSBremFsbG9jKHNpemVvZigqb3NjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvc2MpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaW5pdC5uYW1lID0gbmFtZTsKKwlpbml0Lm9wcyA9ICZzbG93X29zY19vcHM7CisJaW5pdC5wYXJlbnRfbmFtZXMgPSAmcGFyZW50X25hbWU7CisJaW5pdC5udW1fcGFyZW50cyA9IDE7CisJaW5pdC5mbGFncyA9IENMS19JR05PUkVfVU5VU0VEOworCisJb3NjLT5ody5pbml0ID0gJmluaXQ7CisJb3NjLT5zY2tjciA9IHNja2NyOworCW9zYy0+c3RhcnR1cF91c2VjID0gc3RhcnR1cDsKKworCWlmIChieXBhc3MpCisJCXdyaXRlbCgocmVhZGwoc2NrY3IpICYgfkFUOTFfU0NLQ19PU0MzMkVOKSB8IEFUOTFfU0NLQ19PU0MzMkJZUCwKKwkJICAgICAgIHNja2NyKTsKKworCWh3ID0gJm9zYy0+aHc7CisJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZvc2MtPmh3KTsKKwlpZiAocmV0KSB7CisJCWtmcmVlKG9zYyk7CisJCWh3ID0gRVJSX1BUUihyZXQpOworCX0KKworCXJldHVybiBodzsKK30KKworc3RhdGljIHZvaWQgX19pbml0CitvZl9hdDkxc2FtOXg1X2Nsa19zbG93X29zY19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCB2b2lkIF9faW9tZW0gKnNja2NyKQoreworCXN0cnVjdCBjbGtfaHcgKmh3OworCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lOworCWNvbnN0IGNoYXIgKm5hbWUgPSBucC0+bmFtZTsKKwl1MzIgc3RhcnR1cDsKKwlib29sIGJ5cGFzczsKKworCXBhcmVudF9uYW1lID0gb2ZfY2xrX2dldF9wYXJlbnRfbmFtZShucCwgMCk7CisJb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobnAsICJjbG9jay1vdXRwdXQtbmFtZXMiLCAmbmFtZSk7CisJb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJhdG1lbCxzdGFydHVwLXRpbWUtdXNlYyIsICZzdGFydHVwKTsKKwlieXBhc3MgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJhdG1lbCxvc2MtYnlwYXNzIik7CisKKwlodyA9IGF0OTFfY2xrX3JlZ2lzdGVyX3Nsb3dfb3NjKHNja2NyLCBuYW1lLCBwYXJlbnRfbmFtZSwgc3RhcnR1cCwKKwkJCQkJIGJ5cGFzcyk7CisJaWYgKElTX0VSUihodykpCisJCXJldHVybjsKKworCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobnAsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNsa19zbG93X3JjX29zY19yZWNhbGNfcmF0ZShzdHJ1Y3QgY2xrX2h3ICpodywKKwkJCQkJCSB1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlKQoreworCXN0cnVjdCBjbGtfc2xvd19yY19vc2MgKm9zYyA9IHRvX2Nsa19zbG93X3JjX29zYyhodyk7CisKKwlyZXR1cm4gb3NjLT5mcmVxdWVuY3k7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNsa19zbG93X3JjX29zY19yZWNhbGNfYWNjdXJhY3koc3RydWN0IGNsa19odyAqaHcsCisJCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgcGFyZW50X2FjYykKK3sKKwlzdHJ1Y3QgY2xrX3Nsb3dfcmNfb3NjICpvc2MgPSB0b19jbGtfc2xvd19yY19vc2MoaHcpOworCisJcmV0dXJuIG9zYy0+YWNjdXJhY3k7Cit9CisKK3N0YXRpYyBpbnQgY2xrX3Nsb3dfcmNfb3NjX3ByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IGNsa19zbG93X3JjX29zYyAqb3NjID0gdG9fY2xrX3Nsb3dfcmNfb3NjKGh3KTsKKwl2b2lkIF9faW9tZW0gKnNja2NyID0gb3NjLT5zY2tjcjsKKworCXdyaXRlbChyZWFkbChzY2tjcikgfCBBVDkxX1NDS0NfUkNFTiwgc2NrY3IpOworCisJdXNsZWVwX3JhbmdlKG9zYy0+c3RhcnR1cF91c2VjLCBvc2MtPnN0YXJ0dXBfdXNlYyArIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNsa19zbG93X3JjX29zY191bnByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IGNsa19zbG93X3JjX29zYyAqb3NjID0gdG9fY2xrX3Nsb3dfcmNfb3NjKGh3KTsKKwl2b2lkIF9faW9tZW0gKnNja2NyID0gb3NjLT5zY2tjcjsKKworCXdyaXRlbChyZWFkbChzY2tjcikgJiB+QVQ5MV9TQ0tDX1JDRU4sIHNja2NyKTsKK30KKworc3RhdGljIGludCBjbGtfc2xvd19yY19vc2NfaXNfcHJlcGFyZWQoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IGNsa19zbG93X3JjX29zYyAqb3NjID0gdG9fY2xrX3Nsb3dfcmNfb3NjKGh3KTsKKworCXJldHVybiAhIShyZWFkbChvc2MtPnNja2NyKSAmIEFUOTFfU0NLQ19SQ0VOKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIHNsb3dfcmNfb3NjX29wcyA9IHsKKwkucHJlcGFyZSA9IGNsa19zbG93X3JjX29zY19wcmVwYXJlLAorCS51bnByZXBhcmUgPSBjbGtfc2xvd19yY19vc2NfdW5wcmVwYXJlLAorCS5pc19wcmVwYXJlZCA9IGNsa19zbG93X3JjX29zY19pc19wcmVwYXJlZCwKKwkucmVjYWxjX3JhdGUgPSBjbGtfc2xvd19yY19vc2NfcmVjYWxjX3JhdGUsCisJLnJlY2FsY19hY2N1cmFjeSA9IGNsa19zbG93X3JjX29zY19yZWNhbGNfYWNjdXJhY3ksCit9OworCitzdGF0aWMgc3RydWN0IGNsa19odyAqIF9faW5pdAorYXQ5MV9jbGtfcmVnaXN0ZXJfc2xvd19yY19vc2Modm9pZCBfX2lvbWVtICpzY2tjciwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGZyZXF1ZW5jeSwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWNjdXJhY3ksCisJCQkgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0dXApCit7CisJc3RydWN0IGNsa19zbG93X3JjX29zYyAqb3NjOworCXN0cnVjdCBjbGtfaHcgKmh3OworCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJaW50IHJldDsKKworCWlmICghc2NrY3IgfHwgIW5hbWUpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJb3NjID0ga3phbGxvYyhzaXplb2YoKm9zYyksIEdGUF9LRVJORUwpOworCWlmICghb3NjKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWluaXQubmFtZSA9IG5hbWU7CisJaW5pdC5vcHMgPSAmc2xvd19yY19vc2Nfb3BzOworCWluaXQucGFyZW50X25hbWVzID0gTlVMTDsKKwlpbml0Lm51bV9wYXJlbnRzID0gMDsKKwlpbml0LmZsYWdzID0gQ0xLX0lHTk9SRV9VTlVTRUQ7CisKKwlvc2MtPmh3LmluaXQgPSAmaW5pdDsKKwlvc2MtPnNja2NyID0gc2NrY3I7CisJb3NjLT5mcmVxdWVuY3kgPSBmcmVxdWVuY3k7CisJb3NjLT5hY2N1cmFjeSA9IGFjY3VyYWN5OworCW9zYy0+c3RhcnR1cF91c2VjID0gc3RhcnR1cDsKKworCWh3ID0gJm9zYy0+aHc7CisJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZvc2MtPmh3KTsKKwlpZiAocmV0KSB7CisJCWtmcmVlKG9zYyk7CisJCWh3ID0gRVJSX1BUUihyZXQpOworCX0KKworCXJldHVybiBodzsKK30KKworc3RhdGljIHZvaWQgX19pbml0CitvZl9hdDkxc2FtOXg1X2Nsa19zbG93X3JjX29zY19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCB2b2lkIF9faW9tZW0gKnNja2NyKQoreworCXN0cnVjdCBjbGtfaHcgKmh3OworCXUzMiBmcmVxdWVuY3kgPSAwOworCXUzMiBhY2N1cmFjeSA9IDA7CisJdTMyIHN0YXJ0dXAgPSAwOworCWNvbnN0IGNoYXIgKm5hbWUgPSBucC0+bmFtZTsKKworCW9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKG5wLCAiY2xvY2stb3V0cHV0LW5hbWVzIiwgJm5hbWUpOworCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiY2xvY2stZnJlcXVlbmN5IiwgJmZyZXF1ZW5jeSk7CisJb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJjbG9jay1hY2N1cmFjeSIsICZhY2N1cmFjeSk7CisJb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJhdG1lbCxzdGFydHVwLXRpbWUtdXNlYyIsICZzdGFydHVwKTsKKworCWh3ID0gYXQ5MV9jbGtfcmVnaXN0ZXJfc2xvd19yY19vc2Moc2NrY3IsIG5hbWUsIGZyZXF1ZW5jeSwgYWNjdXJhY3ksCisJCQkJCSAgICBzdGFydHVwKTsKKwlpZiAoSVNfRVJSKGh3KSkKKwkJcmV0dXJuOworCisJb2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsIGh3KTsKK30KKworc3RhdGljIGludCBjbGtfc2FtOXg1X3Nsb3dfc2V0X3BhcmVudChzdHJ1Y3QgY2xrX2h3ICpodywgdTggaW5kZXgpCit7CisJc3RydWN0IGNsa19zYW05eDVfc2xvdyAqc2xvd2NrID0gdG9fY2xrX3NhbTl4NV9zbG93KGh3KTsKKwl2b2lkIF9faW9tZW0gKnNja2NyID0gc2xvd2NrLT5zY2tjcjsKKwl1MzIgdG1wOworCisJaWYgKGluZGV4ID4gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0bXAgPSByZWFkbChzY2tjcik7CisKKwlpZiAoKCFpbmRleCAmJiAhKHRtcCAmIEFUOTFfU0NLQ19PU0NTRUwpKSB8fAorCSAgICAoaW5kZXggJiYgKHRtcCAmIEFUOTFfU0NLQ19PU0NTRUwpKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoaW5kZXgpCisJCXRtcCB8PSBBVDkxX1NDS0NfT1NDU0VMOworCWVsc2UKKwkJdG1wICY9IH5BVDkxX1NDS0NfT1NDU0VMOworCisJd3JpdGVsKHRtcCwgc2NrY3IpOworCisJdXNsZWVwX3JhbmdlKFNMT1dDS19TV19USU1FX1VTRUMsIFNMT1dDS19TV19USU1FX1VTRUMgKyAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTggY2xrX3NhbTl4NV9zbG93X2dldF9wYXJlbnQoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IGNsa19zYW05eDVfc2xvdyAqc2xvd2NrID0gdG9fY2xrX3NhbTl4NV9zbG93KGh3KTsKKworCXJldHVybiAhIShyZWFkbChzbG93Y2stPnNja2NyKSAmIEFUOTFfU0NLQ19PU0NTRUwpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgc2FtOXg1X3Nsb3dfb3BzID0geworCS5zZXRfcGFyZW50ID0gY2xrX3NhbTl4NV9zbG93X3NldF9wYXJlbnQsCisJLmdldF9wYXJlbnQgPSBjbGtfc2FtOXg1X3Nsb3dfZ2V0X3BhcmVudCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICogX19pbml0CithdDkxX2Nsa19yZWdpc3Rlcl9zYW05eDVfc2xvdyh2b2lkIF9faW9tZW0gKnNja2NyLAorCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKipwYXJlbnRfbmFtZXMsCisJCQkgICAgICBpbnQgbnVtX3BhcmVudHMpCit7CisJc3RydWN0IGNsa19zYW05eDVfc2xvdyAqc2xvd2NrOworCXN0cnVjdCBjbGtfaHcgKmh3OworCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJaW50IHJldDsKKworCWlmICghc2NrY3IgfHwgIW5hbWUgfHwgIXBhcmVudF9uYW1lcyB8fCAhbnVtX3BhcmVudHMpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJc2xvd2NrID0ga3phbGxvYyhzaXplb2YoKnNsb3djayksIEdGUF9LRVJORUwpOworCWlmICghc2xvd2NrKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWluaXQubmFtZSA9IG5hbWU7CisJaW5pdC5vcHMgPSAmc2FtOXg1X3Nsb3dfb3BzOworCWluaXQucGFyZW50X25hbWVzID0gcGFyZW50X25hbWVzOworCWluaXQubnVtX3BhcmVudHMgPSBudW1fcGFyZW50czsKKwlpbml0LmZsYWdzID0gMDsKKworCXNsb3djay0+aHcuaW5pdCA9ICZpbml0OworCXNsb3djay0+c2NrY3IgPSBzY2tjcjsKKwlzbG93Y2stPnBhcmVudCA9ICEhKHJlYWRsKHNja2NyKSAmIEFUOTFfU0NLQ19PU0NTRUwpOworCisJaHcgPSAmc2xvd2NrLT5odzsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJnNsb3djay0+aHcpOworCWlmIChyZXQpIHsKKwkJa2ZyZWUoc2xvd2NrKTsKKwkJaHcgPSBFUlJfUFRSKHJldCk7CisJfQorCisJcmV0dXJuIGh3OworfQorCitzdGF0aWMgdm9pZCBfX2luaXQKK29mX2F0OTFzYW05eDVfY2xrX3Nsb3dfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCwgdm9pZCBfX2lvbWVtICpzY2tjcikKK3sKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKKwljb25zdCBjaGFyICpwYXJlbnRfbmFtZXNbMl07CisJdW5zaWduZWQgaW50IG51bV9wYXJlbnRzOworCWNvbnN0IGNoYXIgKm5hbWUgPSBucC0+bmFtZTsKKworCW51bV9wYXJlbnRzID0gb2ZfY2xrX2dldF9wYXJlbnRfY291bnQobnApOworCWlmIChudW1fcGFyZW50cyA9PSAwIHx8IG51bV9wYXJlbnRzID4gMikKKwkJcmV0dXJuOworCisJb2ZfY2xrX3BhcmVudF9maWxsKG5wLCBwYXJlbnRfbmFtZXMsIG51bV9wYXJlbnRzKTsKKworCW9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKG5wLCAiY2xvY2stb3V0cHV0LW5hbWVzIiwgJm5hbWUpOworCisJaHcgPSBhdDkxX2Nsa19yZWdpc3Rlcl9zYW05eDVfc2xvdyhzY2tjciwgbmFtZSwgcGFyZW50X25hbWVzLAorCQkJCQkgICAgbnVtX3BhcmVudHMpOworCWlmIChJU19FUlIoaHcpKQorCQlyZXR1cm47CisKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOworfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzY2tjX2Nsa19pZHNbXSBfX2luaXRjb25zdCA9IHsKIAkvKiBTbG93IGNsb2NrICovCkBAIC01NSwzICs0MjYsOTQgQEAKIH0KIENMS19PRl9ERUNMQVJFKGF0OTFzYW05eDVfY2xrX3Nja2MsICJhdG1lbCxhdDkxc2FtOXg1LXNja2MiLAogCSAgICAgICBvZl9hdDkxc2FtOXg1X3Nja2Nfc2V0dXApOworCitzdGF0aWMgaW50IGNsa19zYW1hNWQ0X3Nsb3dfb3NjX3ByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IGNsa19zYW1hNWQ0X3Nsb3dfb3NjICpvc2MgPSB0b19jbGtfc2FtYTVkNF9zbG93X29zYyhodyk7CisKKwlpZiAob3NjLT5wcmVwYXJlZCkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIEFzc3VtZSB0aGF0IGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gc2VsZWN0ZWQgKGZvciBleGFtcGxlIGJ5IHRoZQorCSAqIGJvb3Rsb2FkZXIpLCBlbm91Z2ggdGltZSBoYXMgYXJlYWR5IHBhc3NlZC4KKwkgKi8KKwlpZiAoKHJlYWRsKG9zYy0+c2NrY3IpICYgQVQ5MV9TQ0tDX09TQ1NFTCkpIHsKKwkJb3NjLT5wcmVwYXJlZCA9IHRydWU7CisJCXJldHVybiAwOworCX0KKworCXVzbGVlcF9yYW5nZShvc2MtPnN0YXJ0dXBfdXNlYywgb3NjLT5zdGFydHVwX3VzZWMgKyAxKTsKKwlvc2MtPnByZXBhcmVkID0gdHJ1ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNsa19zYW1hNWQ0X3Nsb3dfb3NjX2lzX3ByZXBhcmVkKHN0cnVjdCBjbGtfaHcgKmh3KQoreworCXN0cnVjdCBjbGtfc2FtYTVkNF9zbG93X29zYyAqb3NjID0gdG9fY2xrX3NhbWE1ZDRfc2xvd19vc2MoaHcpOworCisJcmV0dXJuIG9zYy0+cHJlcGFyZWQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBzYW1hNWQ0X3Nsb3dfb3NjX29wcyA9IHsKKwkucHJlcGFyZSA9IGNsa19zYW1hNWQ0X3Nsb3dfb3NjX3ByZXBhcmUsCisJLmlzX3ByZXBhcmVkID0gY2xrX3NhbWE1ZDRfc2xvd19vc2NfaXNfcHJlcGFyZWQsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgb2Zfc2FtYTVkNF9zY2tjX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJdm9pZCBfX2lvbWVtICpyZWdiYXNlID0gb2ZfaW9tYXAobnAsIDApOworCXN0cnVjdCBjbGtfaHcgKmh3OworCXN0cnVjdCBjbGtfc2FtYTVkNF9zbG93X29zYyAqb3NjOworCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJY29uc3QgY2hhciAqeHRhbF9uYW1lOworCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lc1syXSA9IHsgInNsb3dfcmNfb3NjIiwgInNsb3dfb3NjIiB9OworCWJvb2wgYnlwYXNzOworCWludCByZXQ7CisKKwlpZiAoIXJlZ2Jhc2UpCisJCXJldHVybjsKKworCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX3JhdGVfd2l0aF9hY2N1cmFjeShOVUxMLCBwYXJlbnRfbmFtZXNbMF0sCisJCQkJCQkgICAgICBOVUxMLCAwLCAzMjc2OCwKKwkJCQkJCSAgICAgIDI1MDAwMDAwMCk7CisJaWYgKElTX0VSUihodykpCisJCXJldHVybjsKKworCXh0YWxfbmFtZSA9IG9mX2Nsa19nZXRfcGFyZW50X25hbWUobnAsIDApOworCisJYnlwYXNzID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiYXRtZWwsb3NjLWJ5cGFzcyIpOworCisJb3NjID0ga3phbGxvYyhzaXplb2YoKm9zYyksIEdGUF9LRVJORUwpOworCWlmICghb3NjKQorCQlyZXR1cm47CisKKwlpbml0Lm5hbWUgPSBwYXJlbnRfbmFtZXNbMV07CisJaW5pdC5vcHMgPSAmc2FtYTVkNF9zbG93X29zY19vcHM7CisJaW5pdC5wYXJlbnRfbmFtZXMgPSAmeHRhbF9uYW1lOworCWluaXQubnVtX3BhcmVudHMgPSAxOworCWluaXQuZmxhZ3MgPSBDTEtfSUdOT1JFX1VOVVNFRDsKKworCW9zYy0+aHcuaW5pdCA9ICZpbml0OworCW9zYy0+c2NrY3IgPSByZWdiYXNlOworCW9zYy0+c3RhcnR1cF91c2VjID0gMTIwMDAwMDsKKworCWlmIChieXBhc3MpCisJCXdyaXRlbCgocmVhZGwocmVnYmFzZSkgfCBBVDkxX1NDS0NfT1NDMzJCWVApLCByZWdiYXNlKTsKKworCWh3ID0gJm9zYy0+aHc7CisJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZvc2MtPmh3KTsKKwlpZiAocmV0KSB7CisJCWtmcmVlKG9zYyk7CisJCXJldHVybjsKKwl9CisKKwlodyA9IGF0OTFfY2xrX3JlZ2lzdGVyX3NhbTl4NV9zbG93KHJlZ2Jhc2UsICJzbG93Y2siLCBwYXJlbnRfbmFtZXMsIDIpOworCWlmIChJU19FUlIoaHcpKQorCQlyZXR1cm47CisKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOworfQorQ0xLX09GX0RFQ0xBUkUoc2FtYTVkNF9jbGtfc2NrYywgImF0bWVsLHNhbWE1ZDQtc2NrYyIsCisJICAgICAgIG9mX3NhbWE1ZDRfc2NrY19zZXR1cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9hdDkxL3Nja2MuaCBiL2RyaXZlcnMvY2xrL2F0OTEvc2NrYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzZmY2Y1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2xrL2F0OTEvc2NrYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIGRyaXZlcnMvY2xrL2F0OTEvc2NrYy5oCi0gKgotICogIENvcHlyaWdodCAoQykgMjAxMyBCb3JpcyBCUkVaSUxMT04gPGIuYnJlemlsbG9uQG92ZXJraXouY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfX0FUOTFfU0NLQ19IXwotI2RlZmluZSBfX0FUOTFfU0NLQ19IXwotCi1leHRlcm4gdm9pZCBfX2luaXQgb2ZfYXQ5MXNhbTl4NV9jbGtfc2xvd19vc2Nfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQkJCSAgICB2b2lkIF9faW9tZW0gKnNja2NyKTsKLWV4dGVybiB2b2lkIF9faW5pdCBvZl9hdDkxc2FtOXg1X2Nsa19zbG93X3JjX29zY19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCQkJICAgICAgIHZvaWQgX19pb21lbSAqc2NrY3IpOwotZXh0ZXJuIHZvaWQgX19pbml0IG9mX2F0OTFzYW05eDVfY2xrX3Nsb3dfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQkJCXZvaWQgX19pb21lbSAqc2NrY3IpOwotCi0jZW5kaWYgLyogX19BVDkxX1NDS0NfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2F4aXMvY2xrLWFydHBlYzYuYyBiL2RyaXZlcnMvY2xrL2F4aXMvY2xrLWFydHBlYzYuYwppbmRleCBmZmM5ODhiLi5kYTFhMDczIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9heGlzL2Nsay1hcnRwZWM2LmMKKysrIGIvZHJpdmVycy9jbGsvYXhpcy9jbGstYXJ0cGVjNi5jCkBAIC0xMTMsOCArMTEzLDggQEAKIAlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX29uZWNlbGxfZ2V0LCAmY2xrZGF0YS0+Y2xrX2RhdGEpOwogfQogCi1DTEtfT0ZfREVDTEFSRShhcnRwZWM2X2Nsa2N0cmwsICJheGlzLGFydHBlYzYtY2xrY3RybCIsCi0JICAgICAgIG9mX2FydHBlYzZfY2xrY3RybF9zZXR1cCk7CitDTEtfT0ZfREVDTEFSRV9EUklWRVIoYXJ0cGVjNl9jbGtjdHJsLCAiYXhpcyxhcnRwZWM2LWNsa2N0cmwiLAorCQkgICAgICBvZl9hcnRwZWM2X2Nsa2N0cmxfc2V0dXApOwogCiBzdGF0aWMgaW50IGFydHBlYzZfY2xrY3RybF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYmNtL0tjb25maWcgYi9kcml2ZXJzL2Nsay9iY20vS2NvbmZpZwppbmRleCBmMjg3ODQ1Li5mMjFlOWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9iY20vS2NvbmZpZworKysgYi9kcml2ZXJzL2Nsay9iY20vS2NvbmZpZwpAQCAtMTksOCArMTksMzYgQEAKIAkgIGluIHRoZSBCQ00yODF4eCBhbmQgQkNNMjE2NjQgZmFtaWxpZXMuCiAKIGNvbmZpZyBDT01NT05fQ0xLX0lQUk9DCi0JYm9vbAorCWJvb2wgIkJyb2FkY29tIGlQcm9jIGNsb2NrIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUkNIX0JDTV9JUFJPQyB8fCBDT01QSUxFX1RFU1QKIAlkZXBlbmRzIG9uIENPTU1PTl9DTEsKKwlkZWZhdWx0IEFSQ0hfQkNNX0lQUk9DCiAJaGVscAogCSAgRW5hYmxlIGNvbW1vbiBjbG9jayBmcmFtZXdvcmsgc3VwcG9ydCBmb3IgQnJvYWRjb20gU29DcwogCSAgYmFzZWQgb24gdGhlIGlQcm9jIGFyY2hpdGVjdHVyZQorCitpZiBDT01NT05fQ0xLX0lQUk9DCisKK2NvbmZpZyBDTEtfQkNNX0NZR05VUworCWJvb2wgIkJyb2FkY29tIEN5Z251cyBjbG9jayBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVJDSF9CQ01fQ1lHTlVTIHx8IENPTVBJTEVfVEVTVAorCWRlZmF1bHQgQVJDSF9CQ01fQ1lHTlVTCisJaGVscAorCSAgRW5hYmxlIGNvbW1vbiBjbG9jayBmcmFtZXdvcmsgc3VwcG9ydCBmb3IgdGhlIEJyb2FkY29tIEN5Z251cyBTb0MKKworY29uZmlnIENMS19CQ01fTlNQCisJYm9vbCAiQnJvYWRjb20gTm9ydGhzdGFyL05vcnRoc3RhciBQbHVzIGNsb2NrIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUkNIX0JDTV81MzAxWCB8fCBBUkNIX0JDTV9OU1AgfHwgQ09NUElMRV9URVNUCisJZGVmYXVsdCBBUkNIX0JDTV81MzAxWCB8fCBBUkNIX0JDTV9OU1AKKwloZWxwCisJICBFbmFibGUgY29tbW9uIGNsb2NrIGZyYW1ld29yayBzdXBwb3J0IGZvciB0aGUgQnJvYWRjb20gTm9ydGhzdGFyIGFuZAorCSAgTm9ydGhzdGFyIFBsdXMgU29DcworCitjb25maWcgQ0xLX0JDTV9OUzIKKwlib29sICJCcm9hZGNvbSBOb3J0aHN0YXIgMiBjbG9jayBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVJDSF9CQ01fSVBST0MgfHwgQ09NUElMRV9URVNUCisJZGVmYXVsdCBBUkNIX0JDTV9JUFJPQworCWhlbHAKKwkgIEVuYWJsZSBjb21tb24gY2xvY2sgZnJhbWV3b3JrIHN1cHBvcnQgZm9yIHRoZSBCcm9hZGNvbSBOb3J0aHN0YXIgMiBTb0MKKworZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2JjbS9NYWtlZmlsZSBiL2RyaXZlcnMvY2xrL2JjbS9NYWtlZmlsZQppbmRleCAxZDc5YmQyLi5kOWRjODQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9iY20vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jbGsvYmNtL01ha2VmaWxlCkBAIC02LDcgKzYsNyBAQAogb2JqLSQoQ09ORklHX0NPTU1PTl9DTEtfSVBST0MpCSs9IGNsay1pcHJvYy1hcm1wbGwubyBjbGstaXByb2MtcGxsLm8gY2xrLWlwcm9jLWFzaXUubwogb2JqLSQoQ09ORklHX0FSQ0hfQkNNMjgzNSkJKz0gY2xrLWJjbTI4MzUubwogb2JqLSQoQ09ORklHX0FSQ0hfQkNNMjgzNSkJKz0gY2xrLWJjbTI4MzUtYXV4Lm8KLW9iai0kKENPTkZJR19DT01NT05fQ0xLX0lQUk9DKQkrPSBjbGstbnMyLm8KLW9iai0kKENPTkZJR19BUkNIX0JDTV9DWUdOVVMpCSs9IGNsay1jeWdudXMubwotb2JqLSQoQ09ORklHX0FSQ0hfQkNNX05TUCkJKz0gY2xrLW5zcC5vCi1vYmotJChDT05GSUdfQVJDSF9CQ01fNTMwMVgpCSs9IGNsay1uc3Aubworb2JqLSQoQ09ORklHX0FSQ0hfQkNNXzUzNTczKQkrPSBjbGstYmNtNTM1NzMtaWxwLm8KK29iai0kKENPTkZJR19DTEtfQkNNX0NZR05VUykJKz0gY2xrLWN5Z251cy5vCitvYmotJChDT05GSUdfQ0xLX0JDTV9OU1ApCSs9IGNsay1uc3Aubworb2JqLSQoQ09ORklHX0NMS19CQ01fTlMyKQkrPSBjbGstbnMyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2JjbS9jbGstYmNtMjgzNS1hdXguYyBiL2RyaXZlcnMvY2xrL2JjbS9jbGstYmNtMjgzNS1hdXguYwppbmRleCAzYTE3N2FkLi5iZDc1MGNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9iY20vY2xrLWJjbTI4MzUtYXV4LmMKKysrIGIvZHJpdmVycy9jbGsvYmNtL2Nsay1iY20yODM1LWF1eC5jCkBAIC0yNSw3ICsyNSw3IEBACiBzdGF0aWMgaW50IGJjbTI4MzVfYXV4X2Nsa19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Ci0Jc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgKm9uZWNlbGw7CisJc3RydWN0IGNsa19od19vbmVjZWxsX2RhdGEgKm9uZWNlbGw7CiAJY29uc3QgY2hhciAqcGFyZW50OwogCXN0cnVjdCBjbGsgKnBhcmVudF9jbGs7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CkBAIC00MSwyOCArNDEsMjQgQEAKIAlpZiAoSVNfRVJSKHJlZykpCiAJCXJldHVybiBQVFJfRVJSKHJlZyk7CiAKLQlvbmVjZWxsID0gZGV2bV9rbWFsbG9jKGRldiwgc2l6ZW9mKCpvbmVjZWxsKSwgR0ZQX0tFUk5FTCk7CisJb25lY2VsbCA9IGRldm1fa21hbGxvYyhkZXYsIHNpemVvZigqb25lY2VsbCkgKyBzaXplb2YoKm9uZWNlbGwtPmh3cykgKgorCQkJICAgICAgIEJDTTI4MzVfQVVYX0NMT0NLX0NPVU5ULCBHRlBfS0VSTkVMKTsKIAlpZiAoIW9uZWNlbGwpCiAJCXJldHVybiAtRU5PTUVNOwotCW9uZWNlbGwtPmNsa19udW0gPSBCQ00yODM1X0FVWF9DTE9DS19DT1VOVDsKLQlvbmVjZWxsLT5jbGtzID0gZGV2bV9rY2FsbG9jKGRldiwgQkNNMjgzNV9BVVhfQ0xPQ0tfQ09VTlQsCi0JCQkJICAgICBzaXplb2YoKm9uZWNlbGwtPmNsa3MpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW9uZWNlbGwtPmNsa3MpCi0JCXJldHVybiAtRU5PTUVNOworCW9uZWNlbGwtPm51bSA9IEJDTTI4MzVfQVVYX0NMT0NLX0NPVU5UOwogCiAJZ2F0ZSA9IHJlZyArIEJDTTI4MzVfQVVYRU5COwotCW9uZWNlbGwtPmNsa3NbQkNNMjgzNV9BVVhfQ0xPQ0tfVUFSVF0gPQotCQljbGtfcmVnaXN0ZXJfZ2F0ZShkZXYsICJhdXhfdWFydCIsIHBhcmVudCwgMCwgZ2F0ZSwgMCwgMCwgTlVMTCk7CisJb25lY2VsbC0+aHdzW0JDTTI4MzVfQVVYX0NMT0NLX1VBUlRdID0KKwkJY2xrX2h3X3JlZ2lzdGVyX2dhdGUoZGV2LCAiYXV4X3VhcnQiLCBwYXJlbnQsIDAsIGdhdGUsIDAsIDAsIE5VTEwpOwogCi0Jb25lY2VsbC0+Y2xrc1tCQ00yODM1X0FVWF9DTE9DS19TUEkxXSA9Ci0JCWNsa19yZWdpc3Rlcl9nYXRlKGRldiwgImF1eF9zcGkxIiwgcGFyZW50LCAwLCBnYXRlLCAxLCAwLCBOVUxMKTsKKwlvbmVjZWxsLT5od3NbQkNNMjgzNV9BVVhfQ0xPQ0tfU1BJMV0gPQorCQljbGtfaHdfcmVnaXN0ZXJfZ2F0ZShkZXYsICJhdXhfc3BpMSIsIHBhcmVudCwgMCwgZ2F0ZSwgMSwgMCwgTlVMTCk7CiAKLQlvbmVjZWxsLT5jbGtzW0JDTTI4MzVfQVVYX0NMT0NLX1NQSTJdID0KLQkJY2xrX3JlZ2lzdGVyX2dhdGUoZGV2LCAiYXV4X3NwaTIiLCBwYXJlbnQsIDAsIGdhdGUsIDIsIDAsIE5VTEwpOworCW9uZWNlbGwtPmh3c1tCQ00yODM1X0FVWF9DTE9DS19TUEkyXSA9CisJCWNsa19od19yZWdpc3Rlcl9nYXRlKGRldiwgImF1eF9zcGkyIiwgcGFyZW50LCAwLCBnYXRlLCAyLCAwLCBOVUxMKTsKIAotCW9mX2Nsa19hZGRfcHJvdmlkZXIocGRldi0+ZGV2Lm9mX25vZGUsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsIG9uZWNlbGwpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIG9mX2Nsa19hZGRfaHdfcHJvdmlkZXIocGRldi0+ZGV2Lm9mX25vZGUsIG9mX2Nsa19od19vbmVjZWxsX2dldCwKKwkJCQkgICAgICBvbmVjZWxsKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYmNtMjgzNV9hdXhfY2xrX29mX21hdGNoW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9iY20vY2xrLWJjbTI4MzUuYyBiL2RyaXZlcnMvY2xrL2JjbS9jbGstYmNtMjgzNS5jCmluZGV4IDdhNzk3MDguLmI2OGJmNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2JjbS9jbGstYmNtMjgzNS5jCisrKyBiL2RyaXZlcnMvY2xrL2JjbS9jbGstYmNtMjgzNS5jCkBAIC0zNiw2ICszNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsvYmNtMjgzNS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTMwMiw4ICszMDMsOCBAQAogCXNwaW5sb2NrX3QgcmVnc19sb2NrOyAvKiBzcGlubG9jayBmb3IgYWxsIGNsb2NrcyAqLwogCWNvbnN0IGNoYXIgKm9zY19uYW1lOwogCi0Jc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgb25lY2VsbDsKLQlzdHJ1Y3QgY2xrICpjbGtzW107CisJLyogTXVzdCBiZSBsYXN0ICovCisJc3RydWN0IGNsa19od19vbmVjZWxsX2RhdGEgb25lY2VsbDsKIH07CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjcHJtYW5fd3JpdGUoc3RydWN0IGJjbTI4MzVfY3BybWFuICpjcHJtYW4sIHUzMiByZWcsIHUzMiB2YWwpCkBAIC0zNDQsMjQgKzM0NSwyNCBAQAogICovCiB2b2lkIF9faW5pdCBiY20yODM1X2luaXRfY2xvY2tzKHZvaWQpCiB7Ci0Jc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCWludCByZXQ7CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXJfZml4ZWRfcmF0ZShOVUxMLCAiYXBiX3BjbGsiLCBOVUxMLCAwLCAxMjYwMDAwMDApOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9IGNsa19od19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJhcGJfcGNsayIsIE5VTEwsIDAsIDEyNjAwMDAwMCk7CisJaWYgKElTX0VSUihodykpCiAJCXByX2VycigiYXBiX3BjbGsgbm90IHJlZ2lzdGVyZWRcbiIpOwogCi0JY2xrID0gY2xrX3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgInVhcnQwX3BjbGsiLCBOVUxMLCAwLCAzMDAwMDAwKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfZml4ZWRfcmF0ZShOVUxMLCAidWFydDBfcGNsayIsIE5VTEwsIDAsIDMwMDAwMDApOworCWlmIChJU19FUlIoaHcpKQogCQlwcl9lcnIoInVhcnQwX3BjbGsgbm90IHJlZ2lzdGVyZWRcbiIpOwotCXJldCA9IGNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrLCBOVUxMLCAiMjAyMDEwMDAudWFydCIpOworCXJldCA9IGNsa19od19yZWdpc3Rlcl9jbGtkZXYoaHcsIE5VTEwsICIyMDIwMTAwMC51YXJ0Iik7CiAJaWYgKHJldCkKIAkJcHJfZXJyKCJ1YXJ0MF9wY2xrIGFsaWFzIG5vdCByZWdpc3RlcmVkXG4iKTsKIAotCWNsayA9IGNsa19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJ1YXJ0MV9wY2xrIiwgTlVMTCwgMCwgMTI1MDAwMDAwKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfZml4ZWRfcmF0ZShOVUxMLCAidWFydDFfcGNsayIsIE5VTEwsIDAsIDEyNTAwMDAwMCk7CisJaWYgKElTX0VSUihodykpCiAJCXByX2VycigidWFydDFfcGNsayBub3QgcmVnaXN0ZXJlZFxuIik7Ci0JcmV0ID0gY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGssIE5VTEwsICIyMDIxNTAwMC51YXJ0Iik7CisJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgTlVMTCwgIjIwMjE1MDAwLnVhcnQiKTsKIAlpZiAocmV0KQogCQlwcl9lcnIoInVhcnQxX3BjbGsgYWxpYXMgbm90IHJlZ2lzdGVyZWRcbiIpOwogfQpAQCAtNDQzLDYgKzQ0NCw4IEBACiAJLyogTnVtYmVyIG9mIGZyYWN0aW9uYWwgYml0cyBpbiB0aGUgZGl2aWRlciAqLwogCXUzMiBmcmFjX2JpdHM7CiAKKwl1MzIgZmxhZ3M7CisKIAlib29sIGlzX3ZwdV9jbG9jazsKIAlib29sIGlzX21hc2hfY2xvY2s7CiB9OwpAQCAtMTAwNiwxNiArMTAwOSwyOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgYm9vbAorYmNtMjgzNV9jbGtfaXNfcGxsYyhzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlpZiAoIWh3KQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gc3RybmNtcChjbGtfaHdfZ2V0X25hbWUoaHcpLCAicGxsYyIsIDQpID09IDA7Cit9CisKIHN0YXRpYyBpbnQgYmNtMjgzNV9jbG9ja19kZXRlcm1pbmVfcmF0ZShzdHJ1Y3QgY2xrX2h3ICpodywKIAkJCQkJc3RydWN0IGNsa19yYXRlX3JlcXVlc3QgKnJlcSkKIHsKIAlzdHJ1Y3QgYmNtMjgzNV9jbG9jayAqY2xvY2sgPSBiY20yODM1X2Nsb2NrX2Zyb21faHcoaHcpOwogCXN0cnVjdCBjbGtfaHcgKnBhcmVudCwgKmJlc3RfcGFyZW50ID0gTlVMTDsKKwlib29sIGN1cnJlbnRfcGFyZW50X2lzX3BsbGM7CiAJdW5zaWduZWQgbG9uZyByYXRlLCBiZXN0X3JhdGUgPSAwOwogCXVuc2lnbmVkIGxvbmcgcHJhdGUsIGJlc3RfcHJhdGUgPSAwOwogCXNpemVfdCBpOwogCXUzMiBkaXY7CiAKKwljdXJyZW50X3BhcmVudF9pc19wbGxjID0gYmNtMjgzNV9jbGtfaXNfcGxsYyhjbGtfaHdfZ2V0X3BhcmVudChodykpOworCiAJLyoKIAkgKiBTZWxlY3QgcGFyZW50IGNsb2NrIHRoYXQgcmVzdWx0cyBpbiB0aGUgY2xvc2VzdCBidXQgbG93ZXIgcmF0ZQogCSAqLwpAQCAtMTAyMyw2ICsxMDM4LDE3IEBACiAJCXBhcmVudCA9IGNsa19od19nZXRfcGFyZW50X2J5X2luZGV4KGh3LCBpKTsKIAkJaWYgKCFwYXJlbnQpCiAJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBEb24ndCBjaG9vc2UgYSBQTExDLWRlcml2ZWQgY2xvY2sgYXMgb3VyIHBhcmVudAorCQkgKiB1bmxlc3MgaXQgaGFkIGJlZW4gbWFudWFsbHkgc2V0IHRoYXQgd2F5LiAgUExMQydzCisJCSAqIGZyZXF1ZW5jeSBnZXRzIGFkanVzdGVkIGJ5IHRoZSBmaXJtd2FyZSBkdWUgdG8KKwkJICogb3Zlci10ZW1wIG9yIHVuZGVyLXZvbHRhZ2UgY29uZGl0aW9ucywgd2l0aG91dAorCQkgKiBwcmlvciBub3RpZmljYXRpb24gdG8gb3VyIGNsb2NrIGNvbnN1bWVyLgorCQkgKi8KKwkJaWYgKGJjbTI4MzVfY2xrX2lzX3BsbGMocGFyZW50KSAmJiAhY3VycmVudF9wYXJlbnRfaXNfcGxsYykKKwkJCWNvbnRpbnVlOworCiAJCXByYXRlID0gY2xrX2h3X2dldF9yYXRlKHBhcmVudCk7CiAJCWRpdiA9IGJjbTI4MzVfY2xvY2tfY2hvb3NlX2RpdihodywgcmVxLT5yYXRlLCBwcmF0ZSwgdHJ1ZSk7CiAJCXJhdGUgPSBiY20yODM1X2Nsb2NrX3JhdGVfZnJvbV9kaXZpc29yKGNsb2NrLCBwcmF0ZSwgZGl2KTsKQEAgLTExMjEsMTEgKzExNDcsMTIgQEAKIAkuZGVidWdfaW5pdCA9IGJjbTI4MzVfY2xvY2tfZGVidWdfaW5pdCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICpiY20yODM1X3JlZ2lzdGVyX3BsbChzdHJ1Y3QgYmNtMjgzNV9jcHJtYW4gKmNwcm1hbiwKLQkJCQkJY29uc3Qgc3RydWN0IGJjbTI4MzVfcGxsX2RhdGEgKmRhdGEpCitzdGF0aWMgc3RydWN0IGNsa19odyAqYmNtMjgzNV9yZWdpc3Rlcl9wbGwoc3RydWN0IGJjbTI4MzVfY3BybWFuICpjcHJtYW4sCisJCQkJCSAgIGNvbnN0IHN0cnVjdCBiY20yODM1X3BsbF9kYXRhICpkYXRhKQogewogCXN0cnVjdCBiY20yODM1X3BsbCAqcGxsOwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJaW50IHJldDsKIAogCW1lbXNldCgmaW5pdCwgMCwgc2l6ZW9mKGluaXQpKTsKIApAQCAtMTE0NCwxNyArMTE3MSwyMCBAQAogCXBsbC0+ZGF0YSA9IGRhdGE7CiAJcGxsLT5ody5pbml0ID0gJmluaXQ7CiAKLQlyZXR1cm4gZGV2bV9jbGtfcmVnaXN0ZXIoY3BybWFuLT5kZXYsICZwbGwtPmh3KTsKKwlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcihjcHJtYW4tPmRldiwgJnBsbC0+aHcpOworCWlmIChyZXQpCisJCXJldHVybiBOVUxMOworCXJldHVybiAmcGxsLT5odzsKIH0KIAotc3RhdGljIHN0cnVjdCBjbGsgKgorc3RhdGljIHN0cnVjdCBjbGtfaHcgKgogYmNtMjgzNV9yZWdpc3Rlcl9wbGxfZGl2aWRlcihzdHJ1Y3QgYmNtMjgzNV9jcHJtYW4gKmNwcm1hbiwKIAkJCSAgICAgY29uc3Qgc3RydWN0IGJjbTI4MzVfcGxsX2RpdmlkZXJfZGF0YSAqZGF0YSkKIHsKIAlzdHJ1Y3QgYmNtMjgzNV9wbGxfZGl2aWRlciAqZGl2aWRlcjsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OwotCXN0cnVjdCBjbGsgKmNsazsKIAljb25zdCBjaGFyICpkaXZpZGVyX25hbWU7CisJaW50IHJldDsKIAogCWlmIChkYXRhLT5maXhlZF9kaXZpZGVyICE9IDEpIHsKIAkJZGl2aWRlcl9uYW1lID0gZGV2bV9rYXNwcmludGYoY3BybWFuLT5kZXYsIEdGUF9LRVJORUwsCkBAIC0xMTg4LDMyICsxMjE4LDMzIEBACiAJZGl2aWRlci0+Y3BybWFuID0gY3BybWFuOwogCWRpdmlkZXItPmRhdGEgPSBkYXRhOwogCi0JY2xrID0gZGV2bV9jbGtfcmVnaXN0ZXIoY3BybWFuLT5kZXYsICZkaXZpZGVyLT5kaXYuaHcpOwotCWlmIChJU19FUlIoY2xrKSkKLQkJcmV0dXJuIGNsazsKKwlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcihjcHJtYW4tPmRldiwgJmRpdmlkZXItPmRpdi5odyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKIAogCS8qCiAJICogUExMSCdzIGNoYW5uZWxzIGhhdmUgYSBmaXhlZCBkaXZpZGUgYnkgMTAgYWZ0ZXJ3YXJkcywgd2hpY2gKIAkgKiBpcyB3aGF0IG91ciBjb25zdW1lcnMgYXJlIGFjdHVhbGx5IHVzaW5nLgogCSAqLwogCWlmIChkYXRhLT5maXhlZF9kaXZpZGVyICE9IDEpIHsKLQkJcmV0dXJuIGNsa19yZWdpc3Rlcl9maXhlZF9mYWN0b3IoY3BybWFuLT5kZXYsIGRhdGEtPm5hbWUsCi0JCQkJCQkgZGl2aWRlcl9uYW1lLAotCQkJCQkJIENMS19TRVRfUkFURV9QQVJFTlQsCi0JCQkJCQkgMSwKLQkJCQkJCSBkYXRhLT5maXhlZF9kaXZpZGVyKTsKKwkJcmV0dXJuIGNsa19od19yZWdpc3Rlcl9maXhlZF9mYWN0b3IoY3BybWFuLT5kZXYsIGRhdGEtPm5hbWUsCisJCQkJCQkgICAgZGl2aWRlcl9uYW1lLAorCQkJCQkJICAgIENMS19TRVRfUkFURV9QQVJFTlQsCisJCQkJCQkgICAgMSwKKwkJCQkJCSAgICBkYXRhLT5maXhlZF9kaXZpZGVyKTsKIAl9CiAKLQlyZXR1cm4gY2xrOworCXJldHVybiAmZGl2aWRlci0+ZGl2Lmh3OwogfQogCi1zdGF0aWMgc3RydWN0IGNsayAqYmNtMjgzNV9yZWdpc3Rlcl9jbG9jayhzdHJ1Y3QgYmNtMjgzNV9jcHJtYW4gKmNwcm1hbiwKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICpiY20yODM1X3JlZ2lzdGVyX2Nsb2NrKHN0cnVjdCBiY20yODM1X2Nwcm1hbiAqY3BybWFuLAogCQkJCQkgIGNvbnN0IHN0cnVjdCBiY20yODM1X2Nsb2NrX2RhdGEgKmRhdGEpCiB7CiAJc3RydWN0IGJjbTI4MzVfY2xvY2sgKmNsb2NrOwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CiAJY29uc3QgY2hhciAqcGFyZW50c1sxIDw8IENNX1NSQ19CSVRTXTsKIAlzaXplX3QgaTsKKwlpbnQgcmV0OwogCiAJLyoKIAkgKiBSZXBsYWNlIG91ciAieG9zYyIgcmVmZXJlbmNlcyB3aXRoIHRoZSBvc2NpbGxhdG9yJ3MKQEAgLTEyMzAsMTMgKzEyNjEsMTkgQEAKIAlpbml0LnBhcmVudF9uYW1lcyA9IHBhcmVudHM7CiAJaW5pdC5udW1fcGFyZW50cyA9IGRhdGEtPm51bV9tdXhfcGFyZW50czsKIAlpbml0Lm5hbWUgPSBkYXRhLT5uYW1lOwotCWluaXQuZmxhZ3MgPSBDTEtfSUdOT1JFX1VOVVNFRDsKKwlpbml0LmZsYWdzID0gZGF0YS0+ZmxhZ3MgfCBDTEtfSUdOT1JFX1VOVVNFRDsKIAogCWlmIChkYXRhLT5pc192cHVfY2xvY2spIHsKIAkJaW5pdC5vcHMgPSAmYmNtMjgzNV92cHVfY2xvY2tfY2xrX29wczsKIAl9IGVsc2UgewogCQlpbml0Lm9wcyA9ICZiY20yODM1X2Nsb2NrX2Nsa19vcHM7CiAJCWluaXQuZmxhZ3MgfD0gQ0xLX1NFVF9SQVRFX0dBVEUgfCBDTEtfU0VUX1BBUkVOVF9HQVRFOworCisJCS8qIElmIHRoZSBjbG9jayB3YXNuJ3QgYWN0dWFsbHkgZW5hYmxlZCBhdCBib290LCBpdCdzIG5vdAorCQkgKiBjcml0aWNhbC4KKwkJICovCisJCWlmICghKGNwcm1hbl9yZWFkKGNwcm1hbiwgZGF0YS0+Y3RsX3JlZykgJiBDTV9FTkFCTEUpKQorCQkJaW5pdC5mbGFncyAmPSB+Q0xLX0lTX0NSSVRJQ0FMOwogCX0KIAogCWNsb2NrID0gZGV2bV9remFsbG9jKGNwcm1hbi0+ZGV2LCBzaXplb2YoKmNsb2NrKSwgR0ZQX0tFUk5FTCk7CkBAIC0xMjQ3LDcgKzEyODQsMTAgQEAKIAljbG9jay0+ZGF0YSA9IGRhdGE7CiAJY2xvY2stPmh3LmluaXQgPSAmaW5pdDsKIAotCXJldHVybiBkZXZtX2Nsa19yZWdpc3RlcihjcHJtYW4tPmRldiwgJmNsb2NrLT5odyk7CisJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoY3BybWFuLT5kZXYsICZjbG9jay0+aHcpOworCWlmIChyZXQpCisJCXJldHVybiBFUlJfUFRSKHJldCk7CisJcmV0dXJuICZjbG9jay0+aHc7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrICpiY20yODM1X3JlZ2lzdGVyX2dhdGUoc3RydWN0IGJjbTI4MzVfY3BybWFuICpjcHJtYW4sCkBAIC0xMjU5LDggKzEyOTksOCBAQAogCQkJCSBDTV9HQVRFX0JJVCwgMCwgJmNwcm1hbi0+cmVnc19sb2NrKTsKIH0KIAotdHlwZWRlZiBzdHJ1Y3QgY2xrICooKmJjbTI4MzVfY2xrX3JlZ2lzdGVyKShzdHJ1Y3QgYmNtMjgzNV9jcHJtYW4gKmNwcm1hbiwKLQkJCQkJICAgIGNvbnN0IHZvaWQgKmRhdGEpOwordHlwZWRlZiBzdHJ1Y3QgY2xrX2h3ICooKmJjbTI4MzVfY2xrX3JlZ2lzdGVyKShzdHJ1Y3QgYmNtMjgzNV9jcHJtYW4gKmNwcm1hbiwKKwkJCQkJICAgICAgIGNvbnN0IHZvaWQgKmRhdGEpOwogc3RydWN0IGJjbTI4MzVfY2xrX2Rlc2MgewogCWJjbTI4MzVfY2xrX3JlZ2lzdGVyIGNsa19yZWdpc3RlcjsKIAljb25zdCB2b2lkICpkYXRhOwpAQCAtMTY0OSw2ICsxNjg5LDcgQEAKIAkJLmRpdl9yZWcgPSBDTV9WUFVESVYsCiAJCS5pbnRfYml0cyA9IDEyLAogCQkuZnJhY19iaXRzID0gOCwKKwkJLmZsYWdzID0gQ0xLX0lTX0NSSVRJQ0FMLAogCQkuaXNfdnB1X2Nsb2NrID0gdHJ1ZSksCiAKIAkvKiBjbG9ja3Mgd2l0aCBwZXIgcGFyZW50IG11eCAqLwpAQCAtMTcwNSwxMyArMTc0NiwxNSBAQAogCQkuZGl2X3JlZyA9IENNX0dQMURJViwKIAkJLmludF9iaXRzID0gMTIsCiAJCS5mcmFjX2JpdHMgPSAxMiwKKwkJLmZsYWdzID0gQ0xLX0lTX0NSSVRJQ0FMLAogCQkuaXNfbWFzaF9jbG9jayA9IHRydWUpLAogCVtCQ00yODM1X0NMT0NLX0dQMl0JPSBSRUdJU1RFUl9QRVJfQ0xLKAogCQkubmFtZSA9ICJncDIiLAogCQkuY3RsX3JlZyA9IENNX0dQMkNUTCwKIAkJLmRpdl9yZWcgPSBDTV9HUDJESVYsCiAJCS5pbnRfYml0cyA9IDEyLAotCQkuZnJhY19iaXRzID0gMTIpLAorCQkuZnJhY19iaXRzID0gMTIsCisJCS5mbGFncyA9IENMS19JU19DUklUSUNBTCksCiAKIAkvKiBIRE1JIHN0YXRlIG1hY2hpbmUgKi8KIAlbQkNNMjgzNV9DTE9DS19IU01dCT0gUkVHSVNURVJfUEVSX0NMSygKQEAgLTE3OTAsMTggKzE4MzMsMzggQEAKIAkJLmN0bF9yZWcgPSBDTV9QRVJJSUNUTCksCiB9OwogCisvKgorICogUGVybWFuZW50bHkgdGFrZSBhIHJlZmVyZW5jZSBvbiB0aGUgcGFyZW50IG9mIHRoZSBTRFJBTSBjbG9jay4KKyAqCisgKiBXaGlsZSB0aGUgU0RSQU0gaXMgYmVpbmcgZHJpdmVuIGJ5IGl0cyBkZWRpY2F0ZWQgUExMIG1vc3Qgb2YgdGhlCisgKiB0aW1lLCB0aGVyZSBpcyBhIGxpdHRsZSBsb29wIHJ1bm5pbmcgaW4gdGhlIGZpcm13YXJlIHRoYXQKKyAqIHBlcmlvZGljYWxseSBzd2l0Y2hlcyB0aGUgU0RSQU0gdG8gdXNpbmcgb3VyIENNIGNsb2NrIHRvIGRvIFBWVAorICogcmVjYWxpYnJhdGlvbiwgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBwcmV2aW91c2x5IGNvbmZpZ3VyZWQKKyAqIFNEUkFNIHBhcmVudCBpcyBzdGlsbCBlbmFibGVkIGFuZCBydW5uaW5nLgorICovCitzdGF0aWMgaW50IGJjbTI4MzVfbWFya19zZGNfcGFyZW50X2NyaXRpY2FsKHN0cnVjdCBjbGsgKnNkYykKK3sKKwlzdHJ1Y3QgY2xrICpwYXJlbnQgPSBjbGtfZ2V0X3BhcmVudChzZGMpOworCisJaWYgKElTX0VSUihwYXJlbnQpKQorCQlyZXR1cm4gUFRSX0VSUihwYXJlbnQpOworCisJcmV0dXJuIGNsa19wcmVwYXJlX2VuYWJsZShwYXJlbnQpOworfQorCiBzdGF0aWMgaW50IGJjbTI4MzVfY2xrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKLQlzdHJ1Y3QgY2xrICoqY2xrczsKKwlzdHJ1Y3QgY2xrX2h3ICoqaHdzOwogCXN0cnVjdCBiY20yODM1X2Nwcm1hbiAqY3BybWFuOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCWNvbnN0IHN0cnVjdCBiY20yODM1X2Nsa19kZXNjICpkZXNjOwogCWNvbnN0IHNpemVfdCBhc2l6ZSA9IEFSUkFZX1NJWkUoY2xrX2Rlc2NfYXJyYXkpOwogCXNpemVfdCBpOworCWludCByZXQ7CiAKLQljcHJtYW4gPSBkZXZtX2t6YWxsb2MoZGV2LAotCQkJICAgICAgc2l6ZW9mKCpjcHJtYW4pICsgYXNpemUgKiBzaXplb2YoKmNsa3MpLAorCWNwcm1hbiA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqY3BybWFuKSArCisJCQkgICAgICBzaXplb2YoKmNwcm1hbi0+b25lY2VsbC5od3MpICogYXNpemUsCiAJCQkgICAgICBHRlBfS0VSTkVMKTsKIAlpZiAoIWNwcm1hbikKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xODE5LDE4ICsxODgyLDIxIEBACiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjcHJtYW4pOwogCi0JY3BybWFuLT5vbmVjZWxsLmNsa19udW0gPSBhc2l6ZTsKLQljcHJtYW4tPm9uZWNlbGwuY2xrcyA9IGNwcm1hbi0+Y2xrczsKLQljbGtzID0gY3BybWFuLT5jbGtzOworCWNwcm1hbi0+b25lY2VsbC5udW0gPSBhc2l6ZTsKKwlod3MgPSBjcHJtYW4tPm9uZWNlbGwuaHdzOwogCiAJZm9yIChpID0gMDsgaSA8IGFzaXplOyBpKyspIHsKIAkJZGVzYyA9ICZjbGtfZGVzY19hcnJheVtpXTsKIAkJaWYgKGRlc2MtPmNsa19yZWdpc3RlciAmJiBkZXNjLT5kYXRhKQotCQkJY2xrc1tpXSA9IGRlc2MtPmNsa19yZWdpc3RlcihjcHJtYW4sIGRlc2MtPmRhdGEpOworCQkJaHdzW2ldID0gZGVzYy0+Y2xrX3JlZ2lzdGVyKGNwcm1hbiwgZGVzYy0+ZGF0YSk7CiAJfQogCi0JcmV0dXJuIG9mX2Nsa19hZGRfcHJvdmlkZXIoZGV2LT5vZl9ub2RlLCBvZl9jbGtfc3JjX29uZWNlbGxfZ2V0LAotCQkJCSAgICZjcHJtYW4tPm9uZWNlbGwpOworCXJldCA9IGJjbTI4MzVfbWFya19zZGNfcGFyZW50X2NyaXRpY2FsKGh3c1tCQ00yODM1X0NMT0NLX1NEUkFNXS0+Y2xrKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIG9mX2Nsa19hZGRfaHdfcHJvdmlkZXIoZGV2LT5vZl9ub2RlLCBvZl9jbGtfaHdfb25lY2VsbF9nZXQsCisJCQkJICAgICAgJmNwcm1hbi0+b25lY2VsbCk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJjbTI4MzVfY2xrX29mX21hdGNoW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9iY20vY2xrLWJjbTUzNTczLWlscC5jIGIvZHJpdmVycy9jbGsvYmNtL2Nsay1iY201MzU3My1pbHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmViMzcxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbGsvYmNtL2Nsay1iY201MzU3My1pbHAuYwpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBSYWZhxYIgTWnFgmVja2kgPHJhZmFsQG1pbGVja2kucGw+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvc3lzY29uLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjZGVmaW5lIFBNVV9YVEFMX0ZSRVFfUkFUSU8JCQkweDY2YworI2RlZmluZSAgWFRBTF9BTFBfUEVSXzRJTFAJCQkweDAwMDAxZmZmCisjZGVmaW5lICBYVEFMX0NUTF9FTgkJCQkweDgwMDAwMDAwCisjZGVmaW5lIFBNVV9TTE9XX0NMS19QRVJJT0QJCQkweDZkYworCitzdHJ1Y3QgYmNtNTM1NzNfaWxwIHsKKwlzdHJ1Y3QgY2xrX2h3IGh3OworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKK307CisKK3N0YXRpYyBpbnQgYmNtNTM1NzNfaWxwX2VuYWJsZShzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgYmNtNTM1NzNfaWxwICppbHAgPSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCBiY201MzU3M19pbHAsIGh3KTsKKworCXJlZ21hcF93cml0ZShpbHAtPnJlZ21hcCwgUE1VX1NMT1dfQ0xLX1BFUklPRCwgMHgxMDE5OSk7CisJcmVnbWFwX3dyaXRlKGlscC0+cmVnbWFwLCAweDY3NCwgMHgxMDAwMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmNtNTM1NzNfaWxwX2Rpc2FibGUoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IGJjbTUzNTczX2lscCAqaWxwID0gY29udGFpbmVyX29mKGh3LCBzdHJ1Y3QgYmNtNTM1NzNfaWxwLCBodyk7CisKKwlyZWdtYXBfd3JpdGUoaWxwLT5yZWdtYXAsIFBNVV9TTE9XX0NMS19QRVJJT0QsIDApOworCXJlZ21hcF93cml0ZShpbHAtPnJlZ21hcCwgMHg2NzQsIDApOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBiY201MzU3M19pbHBfcmVjYWxjX3JhdGUoc3RydWN0IGNsa19odyAqaHcsCisJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUpCit7CisJc3RydWN0IGJjbTUzNTczX2lscCAqaWxwID0gY29udGFpbmVyX29mKGh3LCBzdHJ1Y3QgYmNtNTM1NzNfaWxwLCBodyk7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gaWxwLT5yZWdtYXA7CisJdTMyIGxhc3RfdmFsLCBjdXJfdmFsOworCWludCBzdW0gPSAwLCBudW0gPSAwLCBsb29wX251bSA9IDA7CisJaW50IGF2ZzsKKworCS8qIEVuYWJsZSBtZWFzdXJlbWVudCAqLworCXJlZ21hcF93cml0ZShyZWdtYXAsIFBNVV9YVEFMX0ZSRVFfUkFUSU8sIFhUQUxfQ1RMX0VOKTsKKworCS8qIFJlYWQgaW5pdGlhbCB2YWx1ZSAqLworCXJlZ21hcF9yZWFkKHJlZ21hcCwgUE1VX1hUQUxfRlJFUV9SQVRJTywgJmxhc3RfdmFsKTsKKwlsYXN0X3ZhbCAmPSBYVEFMX0FMUF9QRVJfNElMUDsKKworCS8qCisJICogQXQgbWluaW11bSB3ZSBzaG91bGQgbG9vcCBmb3IgYSBiaXQgdG8gbGV0IGhhcmR3YXJlIGRvIHRoZQorCSAqIG1lYXN1cmVtZW50LiBUaGlzIGlzbid0IHZlcnkgYWNjdXJhdGUgaG93ZXZlciwgc28gZm9yIGEgYmV0dGVyCisJICogcHJlY2lzaW9uIGxldHMgdHJ5IGdldHRpbmcgMjAgZGlmZmVyZW50IHZhbHVlcyBmb3IgYW5kIHVzZSBhdmVyYWdlLgorCSAqLworCXdoaWxlIChudW0gPCAyMCkgeworCQlyZWdtYXBfcmVhZChyZWdtYXAsIFBNVV9YVEFMX0ZSRVFfUkFUSU8sICZjdXJfdmFsKTsKKwkJY3VyX3ZhbCAmPSBYVEFMX0FMUF9QRVJfNElMUDsKKworCQlpZiAoY3VyX3ZhbCAhPSBsYXN0X3ZhbCkgeworCQkJLyogR290IGRpZmZlcmVudCB2YWx1ZSwgdXNlIGl0ICovCisJCQlzdW0gKz0gY3VyX3ZhbDsKKwkJCW51bSsrOworCQkJbG9vcF9udW0gPSAwOworCQkJbGFzdF92YWwgPSBjdXJfdmFsOworCQl9IGVsc2UgaWYgKCsrbG9vcF9udW0gPiA1MDAwKSB7CisJCQkvKiBTYW1lIHZhbHVlIG92ZXIgYW5kIG92ZXIsIGdpdmUgdXAgKi8KKwkJCXN1bSArPSBjdXJfdmFsOworCQkJbnVtKys7CisJCQlicmVhazsKKwkJfQorCisJCWNwdV9yZWxheCgpOworCX0KKworCS8qIERpc2FibGUgbWVhc3VyZW1lbnQgdG8gc2F2ZSBwb3dlciAqLworCXJlZ21hcF93cml0ZShyZWdtYXAsIFBNVV9YVEFMX0ZSRVFfUkFUSU8sIDB4MCk7CisKKwlhdmcgPSBzdW0gLyBudW07CisKKwlyZXR1cm4gcGFyZW50X3JhdGUgKiA0IC8gYXZnOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgYmNtNTM1NzNfaWxwX2Nsa19vcHMgPSB7CisJLmVuYWJsZSA9IGJjbTUzNTczX2lscF9lbmFibGUsCisJLmRpc2FibGUgPSBiY201MzU3M19pbHBfZGlzYWJsZSwKKwkucmVjYWxjX3JhdGUgPSBiY201MzU3M19pbHBfcmVjYWxjX3JhdGUsCit9OworCitzdGF0aWMgdm9pZCBiY201MzU3M19pbHBfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCXN0cnVjdCBiY201MzU3M19pbHAgKmlscDsKKwlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0ID0geyB9OworCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lOworCWludCBlcnI7CisKKwlpbHAgPSBremFsbG9jKHNpemVvZigqaWxwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbHApCisJCXJldHVybjsKKworCXBhcmVudF9uYW1lID0gb2ZfY2xrX2dldF9wYXJlbnRfbmFtZShucCwgMCk7CisJaWYgKCFwYXJlbnRfbmFtZSkgeworCQllcnIgPSAtRU5PRU5UOworCQlnb3RvIGVycl9mcmVlX2lscDsKKwl9CisKKwlpbHAtPnJlZ21hcCA9IHN5c2Nvbl9ub2RlX3RvX3JlZ21hcChvZl9nZXRfcGFyZW50KG5wKSk7CisJaWYgKElTX0VSUihpbHAtPnJlZ21hcCkpIHsKKwkJZXJyID0gUFRSX0VSUihpbHAtPnJlZ21hcCk7CisJCWdvdG8gZXJyX2ZyZWVfaWxwOworCX0KKworCWluaXQubmFtZSA9IG5wLT5uYW1lOworCWluaXQub3BzID0gJmJjbTUzNTczX2lscF9jbGtfb3BzOworCWluaXQucGFyZW50X25hbWVzID0gJnBhcmVudF9uYW1lOworCWluaXQubnVtX3BhcmVudHMgPSAxOworCisJaWxwLT5ody5pbml0ID0gJmluaXQ7CisJZXJyID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZpbHAtPmh3KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mcmVlX2lscDsKKworCWVyciA9IG9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobnAsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCAmaWxwLT5odyk7CisJaWYgKGVycikKKwkJZ290byBlcnJfY2xrX2h3X3VucmVnaXN0ZXI7CisKKwlyZXR1cm47CisKK2Vycl9jbGtfaHdfdW5yZWdpc3RlcjoKKwljbGtfaHdfdW5yZWdpc3RlcigmaWxwLT5odyk7CitlcnJfZnJlZV9pbHA6CisJa2ZyZWUoaWxwKTsKKwlwcl9lcnIoIkZhaWxlZCB0byBpbml0IElMUCBjbG9jazogJWRcbiIsIGVycik7Cit9CisKKy8qIFdlIG5lZWQgaXQgdmVyeSBlYXJseSBmb3IgYXJjaCBjb2RlLCBiZWZvcmUgZGV2aWNlIG1vZGVsIGdldHMgcmVhZHkgKi8KK0NMS19PRl9ERUNMQVJFKGJjbTUzNTczX2lscF9jbGssICJicmNtLGJjbTUzNTczLWlscCIsIGJjbTUzNTczX2lscF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2JjbS9jbGsta29uYS1zZXR1cC5jIGIvZHJpdmVycy9jbGsvYmNtL2Nsay1rb25hLXNldHVwLmMKaW5kZXggNTI2YjBiMC4uYzM3YTdmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvYmNtL2Nsay1rb25hLXNldHVwLmMKKysrIGIvZHJpdmVycy9jbGsvYmNtL2Nsay1rb25hLXNldHVwLmMKQEAgLTU4Niw4ICs1ODYsOCBAQAogCX0KIAogCS8qIFRoZXJlIGlzIGF0IGxlYXN0IG9uZSBwYXJlbnQsIHNvIGFsbG9jYXRlIGEgc2VsZWN0b3IgYXJyYXkgKi8KLQotCXBhcmVudF9zZWwgPSBrbWFsbG9jKHBhcmVudF9jb3VudCAqIHNpemVvZigqcGFyZW50X3NlbCksIEdGUF9LRVJORUwpOworCXBhcmVudF9zZWwgPSBrbWFsbG9jX2FycmF5KHBhcmVudF9jb3VudCwgc2l6ZW9mKCpwYXJlbnRfc2VsKSwKKwkJCQkgICBHRlBfS0VSTkVMKTsKIAlpZiAoIXBhcmVudF9zZWwpIHsKIAkJcHJfZXJyKCIlczogZXJyb3IgYWxsb2NhdGluZyAldSBwYXJlbnQgc2VsZWN0b3JzXG4iLCBfX2Z1bmNfXywKIAkJCQlwYXJlbnRfY291bnQpOwpAQCAtNjk2LDc3ICs2OTYsNjkgQEAKIAliY21fY2xrLT50eXBlID0gYmNtX2Nsa19ub25lOwogfQogCi1zdGF0aWMgdm9pZCBrb25hX2Nsa190ZWFyZG93bihzdHJ1Y3QgY2xrICpjbGspCitzdGF0aWMgdm9pZCBrb25hX2Nsa190ZWFyZG93bihzdHJ1Y3QgY2xrX2h3ICpodykKIHsKLQlzdHJ1Y3QgY2xrX2h3ICpodzsKIAlzdHJ1Y3Qga29uYV9jbGsgKmJjbV9jbGs7CiAKLQlpZiAoIWNsaykKKwlpZiAoIWh3KQogCQlyZXR1cm47CiAKLQlodyA9IF9fY2xrX2dldF9odyhjbGspOwotCWlmICghaHcpIHsKLQkJcHJfZXJyKCIlczogY2xrICVwIGhhcyBudWxsIGh3IHBvaW50ZXJcbiIsIF9fZnVuY19fLCBjbGspOwotCQlyZXR1cm47Ci0JfQotCWNsa191bnJlZ2lzdGVyKGNsayk7CisJY2xrX2h3X3VucmVnaXN0ZXIoaHcpOwogCiAJYmNtX2NsayA9IHRvX2tvbmFfY2xrKGh3KTsKIAliY21fY2xrX3RlYXJkb3duKGJjbV9jbGspOwogfQogCi1zdHJ1Y3QgY2xrICprb25hX2Nsa19zZXR1cChzdHJ1Y3Qga29uYV9jbGsgKmJjbV9jbGspCitzdGF0aWMgaW50IGtvbmFfY2xrX3NldHVwKHN0cnVjdCBrb25hX2NsayAqYmNtX2NsaykKIHsKKwlpbnQgcmV0OwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhICppbml0X2RhdGEgPSAmYmNtX2Nsay0+aW5pdF9kYXRhOwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7CiAKIAlzd2l0Y2ggKGJjbV9jbGstPnR5cGUpIHsKIAljYXNlIGJjbV9jbGtfcGVyaToKLQkJaWYgKHBlcmlfY2xrX3NldHVwKGJjbV9jbGstPnUuZGF0YSwgaW5pdF9kYXRhKSkKLQkJCXJldHVybiBOVUxMOworCQlyZXQgPSBwZXJpX2Nsa19zZXR1cChiY21fY2xrLT51LmRhdGEsIGluaXRfZGF0YSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcl9lcnIoIiVzOiBjbG9jayB0eXBlICVkIGludmFsaWQgZm9yICVzXG4iLCBfX2Z1bmNfXywKIAkJCShpbnQpYmNtX2Nsay0+dHlwZSwgaW5pdF9kYXRhLT5uYW1lKTsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCS8qIE1ha2Ugc3VyZSBldmVyeXRoaW5nIG1ha2VzIHNlbnNlIGJlZm9yZSB3ZSBzZXQgaXQgdXAgKi8KIAlpZiAoIWtvbmFfY2xrX3ZhbGlkKGJjbV9jbGspKSB7CiAJCXByX2VycigiJXM6IGNsb2NrIGRhdGEgaW52YWxpZCBmb3IgJXNcbiIsIF9fZnVuY19fLAogCQkJaW5pdF9kYXRhLT5uYW1lKTsKKwkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXRfdGVhcmRvd247CiAJfQogCiAJYmNtX2Nsay0+aHcuaW5pdCA9IGluaXRfZGF0YTsKLQljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJmJjbV9jbGstPmh3KTsKLQlpZiAoSVNfRVJSKGNsaykpIHsKLQkJcHJfZXJyKCIlczogZXJyb3IgcmVnaXN0ZXJpbmcgY2xvY2sgJXMgKCVsZClcbiIsIF9fZnVuY19fLAotCQkJaW5pdF9kYXRhLT5uYW1lLCBQVFJfRVJSKGNsaykpOworCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmYmNtX2Nsay0+aHcpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogZXJyb3IgcmVnaXN0ZXJpbmcgY2xvY2sgJXMgKCVkKVxuIiwgX19mdW5jX18sCisJCQlpbml0X2RhdGEtPm5hbWUsIHJldCk7CiAJCWdvdG8gb3V0X3RlYXJkb3duOwogCX0KLQlCVUdfT04oIWNsayk7CiAKLQlyZXR1cm4gY2xrOworCXJldHVybiAwOwogb3V0X3RlYXJkb3duOgogCWJjbV9jbGtfdGVhcmRvd24oYmNtX2Nsayk7CiAKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBjY3VfY2xrc190ZWFyZG93bihzdHJ1Y3QgY2N1X2RhdGEgKmNjdSkKIHsKIAl1MzIgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBjY3UtPmNsa19kYXRhLmNsa19udW07IGkrKykKLQkJa29uYV9jbGtfdGVhcmRvd24oY2N1LT5jbGtfZGF0YS5jbGtzW2ldKTsKLQlrZnJlZShjY3UtPmNsa19kYXRhLmNsa3MpOworCWZvciAoaSA9IDA7IGkgPCBjY3UtPmNsa19udW07IGkrKykKKwkJa29uYV9jbGtfdGVhcmRvd24oJmNjdS0+a29uYV9jbGtzW2ldLmh3KTsKIH0KIAogc3RhdGljIHZvaWQga29uYV9jY3VfdGVhcmRvd24oc3RydWN0IGNjdV9kYXRhICpjY3UpCiB7Ci0Ja2ZyZWUoY2N1LT5jbGtfZGF0YS5jbGtzKTsKLQljY3UtPmNsa19kYXRhLmNsa3MgPSBOVUxMOwogCWlmICghY2N1LT5iYXNlKQogCQlyZXR1cm47CiAKQEAgLTc5Myw2ICs3ODUsMjAgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIHN0cnVjdCBjbGtfaHcgKgorb2ZfY2xrX2tvbmFfb25lY2VsbF9nZXQoc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqY2xrc3BlYywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY2N1X2RhdGEgKmNjdSA9IGRhdGE7CisJdW5zaWduZWQgaW50IGlkeCA9IGNsa3NwZWMtPmFyZ3NbMF07CisKKwlpZiAoaWR4ID49IGNjdS0+Y2xrX251bSkgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGluZGV4ICV1XG4iLCBfX2Z1bmNfXywgaWR4KTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJcmV0dXJuICZjY3UtPmtvbmFfY2xrc1tpZHhdLmh3OworfQorCiAvKgogICogU2V0IHVwIGEgQ0NVLiAgQ2FsbCB0aGUgcHJvdmlkZWQgY2N1X2Nsa3Nfc2V0dXAgY2FsbGJhY2sgdG8KICAqIGluaXRpYWxpemUgdGhlIGFycmF5IG9mIGNsb2NrcyBwcm92aWRlZCBieSB0aGUgQ0NVLgpAQCAtODA1LDE4ICs4MTEsNiBAQAogCXVuc2lnbmVkIGludCBpOwogCWludCByZXQ7CiAKLQlpZiAoY2N1LT5jbGtfZGF0YS5jbGtfbnVtKSB7Ci0JCXNpemVfdCBzaXplOwotCi0JCXNpemUgPSBjY3UtPmNsa19kYXRhLmNsa19udW0gKiBzaXplb2YoKmNjdS0+Y2xrX2RhdGEuY2xrcyk7Ci0JCWNjdS0+Y2xrX2RhdGEuY2xrcyA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghY2N1LT5jbGtfZGF0YS5jbGtzKSB7Ci0JCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgJXUgY2xvY2tzIGZvciAlc1xuIiwKLQkJCQlfX2Z1bmNfXywgY2N1LT5jbGtfZGF0YS5jbGtfbnVtLCBub2RlLT5uYW1lKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQogCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uobm9kZSwgMCwgJnJlcyk7CiAJaWYgKHJldCkgewogCQlwcl9lcnIoIiVzOiBubyB2YWxpZCBDQ1UgcmVnaXN0ZXJzIGZvdW5kIGZvciAlc1xuIiwgX19mdW5jX18sCkBAIC04NTEsMTMgKzg0NSwxMyBAQAogCSAqIHRoZSBjbG9jayBmcmFtZXdvcmsgY2xvY2sgYXJyYXkgKGluIGNjdS0+ZGF0YSkuICBUaGVuCiAJICogcmVnaXN0ZXIgYXMgYSBwcm92aWRlciBmb3IgdGhlc2UgY2xvY2tzLgogCSAqLwotCWZvciAoaSA9IDA7IGkgPCBjY3UtPmNsa19kYXRhLmNsa19udW07IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBjY3UtPmNsa19udW07IGkrKykgewogCQlpZiAoIWNjdS0+a29uYV9jbGtzW2ldLmNjdSkKIAkJCWNvbnRpbnVlOwotCQljY3UtPmNsa19kYXRhLmNsa3NbaV0gPSBrb25hX2Nsa19zZXR1cCgmY2N1LT5rb25hX2Nsa3NbaV0pOworCQlrb25hX2Nsa19zZXR1cCgmY2N1LT5rb25hX2Nsa3NbaV0pOwogCX0KIAotCXJldCA9IG9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwgJmNjdS0+Y2xrX2RhdGEpOworCXJldCA9IG9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX2tvbmFfb25lY2VsbF9nZXQsIGNjdSk7CiAJaWYgKHJldCkgewogCQlwcl9lcnIoIiVzOiBlcnJvciBhZGRpbmcgY2N1ICVzIGFzIHByb3ZpZGVyICglZClcbiIsIF9fZnVuY19fLAogCQkJCW5vZGUtPm5hbWUsIHJldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9iY20vY2xrLWtvbmEuYyBiL2RyaXZlcnMvY2xrL2JjbS9jbGsta29uYS5jCmluZGV4IDNhMTUzNDcuLmVlZTY0YjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2JjbS9jbGsta29uYS5jCisrKyBiL2RyaXZlcnMvY2xrL2JjbS9jbGsta29uYS5jCkBAIC0xMjU2LDE5ICsxMjU2LDE4IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgd2hpY2g7Ci0Jc3RydWN0IGNsayAqKmNsa3MgPSBjY3UtPmNsa19kYXRhLmNsa3M7CiAJc3RydWN0IGtvbmFfY2xrICprb25hX2Nsa3MgPSBjY3UtPmtvbmFfY2xrczsKIAlib29sIHN1Y2Nlc3MgPSB0cnVlOwogCiAJZmxhZ3MgPSBjY3VfbG9jayhjY3UpOwogCV9fY2N1X3dyaXRlX2VuYWJsZShjY3UpOwogCi0JZm9yICh3aGljaCA9IDA7IHdoaWNoIDwgY2N1LT5jbGtfZGF0YS5jbGtfbnVtOyB3aGljaCsrKSB7Ci0JCXN0cnVjdCBrb25hX2NsayAqYmNtX2NsazsKKwlmb3IgKHdoaWNoID0gMDsgd2hpY2ggPCBjY3UtPmNsa19udW07IHdoaWNoKyspIHsKKwkJc3RydWN0IGtvbmFfY2xrICpiY21fY2xrID0gJmtvbmFfY2xrc1t3aGljaF07CiAKLQkJaWYgKCFjbGtzW3doaWNoXSkKKwkJaWYgKCFiY21fY2xrLT5jY3UpCiAJCQljb250aW51ZTsKLQkJYmNtX2NsayA9ICZrb25hX2Nsa3Nbd2hpY2hdOworCiAJCXN1Y2Nlc3MgJj0gX19rb25hX2Nsa19pbml0KGJjbV9jbGspOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYmNtL2Nsay1rb25hLmggYi9kcml2ZXJzL2Nsay9iY20vY2xrLWtvbmEuaAppbmRleCA5MDY1NzZlLi5mNGIzOWJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9iY20vY2xrLWtvbmEuaAorKysgYi9kcml2ZXJzL2Nsay9iY20vY2xrLWtvbmEuaApAQCAtNDgxLDcgKzQ4MSw3IEBACiAJYm9vbCB3cml0ZV9lbmFibGVkOwkvKiB3cml0ZSBhY2Nlc3MgaXMgY3VycmVudGx5IGVuYWJsZWQgKi8KIAlzdHJ1Y3QgY2N1X3BvbGljeSBwb2xpY3k7CiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlOwotCXN0cnVjdCBjbGtfb25lY2VsbF9kYXRhIGNsa19kYXRhOworCXNpemVfdCBjbGtfbnVtOwogCWNvbnN0IGNoYXIgKm5hbWU7CiAJdTMyIHJhbmdlOwkJLyogYnl0ZSByYW5nZSBvZiBhZGRyZXNzIHNwYWNlICovCiAJc3RydWN0IGtvbmFfY2xrIGtvbmFfY2xrc1tdOwkvKiBtdXN0IGJlIGxhc3QgKi8KQEAgLTQ5MSw5ICs0OTEsNyBAQAogI2RlZmluZSBLT05BX0NDVV9DT01NT04oX3ByZWZpeCwgX25hbWUsIF9jY3VuYW1lKQkJCSAgICBcCiAJLm5hbWUJCT0gI19uYW1lICJfY2N1IiwJCQkJICAgIFwKIAkubG9jawkJPSBfX1NQSU5fTE9DS19VTkxPQ0tFRChfbmFtZSAjIyBfY2N1X2RhdGEubG9jayksICAgIFwKLQkuY2xrX2RhdGEJPSB7CQkJCQkJICAgIFwKLQkJLmNsa19udW0gPSBfcHJlZml4ICMjIF8gIyMgX2NjdW5hbWUgIyMgX0NDVV9DTE9DS19DT1VOVCwgICAgXAotCX0KKwkuY2xrX251bQk9IF9wcmVmaXggIyMgXyAjIyBfY2N1bmFtZSAjIyBfQ0NVX0NMT0NLX0NPVU5UCiAKIC8qIEV4cG9ydGVkIGdsb2JhbHMgKi8KIApAQCAtNTA1LDcgKzUwMyw2IEBACiBleHRlcm4gdTY0IHNjYWxlZF9kaXZfYnVpbGQoc3RydWN0IGJjbV9jbGtfZGl2ICpkaXYsIHUzMiBkaXZfdmFsdWUsCiAJCQkJdTMyIGJpbGxpb250aHMpOwogCi1leHRlcm4gc3RydWN0IGNsayAqa29uYV9jbGtfc2V0dXAoc3RydWN0IGtvbmFfY2xrICpiY21fY2xrKTsKIGV4dGVybiB2b2lkIF9faW5pdCBrb25hX2R0X2NjdV9zZXR1cChzdHJ1Y3QgY2N1X2RhdGEgKmNjdSwKIAkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpOwogZXh0ZXJuIGJvb2wgX19pbml0IGtvbmFfY2N1X2luaXQoc3RydWN0IGNjdV9kYXRhICpjY3UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYmVybGluL2JlcmxpbjItYXZwbGwuYyBiL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZXJsaW4yLWF2cGxsLmMKaW5kZXggZmQwZjI2Yy4uY2ZjYWU0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvYmVybGluL2JlcmxpbjItYXZwbGwuYworKysgYi9kcml2ZXJzL2Nsay9iZXJsaW4vYmVybGluMi1hdnBsbC5jCkBAIC0xODgsNyArMTg4LDcgQEAKIAkucmVjYWxjX3JhdGUJPSBiZXJsaW4yX2F2cGxsX3Zjb19yZWNhbGNfcmF0ZSwKIH07CiAKLXN0cnVjdCBjbGsgKiBfX2luaXQgYmVybGluMl9hdnBsbF92Y29fcmVnaXN0ZXIodm9pZCBfX2lvbWVtICpiYXNlLAoraW50IF9faW5pdCBiZXJsaW4yX2F2cGxsX3Zjb19yZWdpc3Rlcih2b2lkIF9faW9tZW0gKmJhc2UsCiAJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcGFyZW50X25hbWUsCiAJCQkgICAgICAgdTggdmNvX2ZsYWdzLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewpAQCAtMTk3LDcgKzE5Nyw3IEBACiAKIAl2Y28gPSBremFsbG9jKHNpemVvZigqdmNvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF2Y28pCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCQlyZXR1cm4gLUVOT01FTTsKIAogCXZjby0+YmFzZSA9IGJhc2U7CiAJdmNvLT5mbGFncyA9IHZjb19mbGFnczsKQEAgLTIwOCw3ICsyMDgsNyBAQAogCWluaXQubnVtX3BhcmVudHMgPSAxOwogCWluaXQuZmxhZ3MgPSBmbGFnczsKIAotCXJldHVybiBjbGtfcmVnaXN0ZXIoTlVMTCwgJnZjby0+aHcpOworCXJldHVybiBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJnZjby0+aHcpOwogfQogCiBzdHJ1Y3QgYmVybGluMl9hdnBsbF9jaGFubmVsIHsKQEAgLTM2NCw3ICszNjQsNyBAQAogICovCiBzdGF0aWMgY29uc3QgdTggcXVpcmtfaW5kZXhbXSBfX2luaXRjb25zdCA9IHsgMCwgNiwgNSwgNCwgMywgMiwgMSwgNyB9OwogCi1zdHJ1Y3QgY2xrICogX19pbml0IGJlcmxpbjJfYXZwbGxfY2hhbm5lbF9yZWdpc3Rlcih2b2lkIF9faW9tZW0gKmJhc2UsCitpbnQgX19pbml0IGJlcmxpbjJfYXZwbGxfY2hhbm5lbF9yZWdpc3Rlcih2b2lkIF9faW9tZW0gKmJhc2UsCiAJCQkgICBjb25zdCBjaGFyICpuYW1lLCB1OCBpbmRleCwgY29uc3QgY2hhciAqcGFyZW50X25hbWUsCiAJCQkgICB1OCBjaF9mbGFncywgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKQEAgLTM3Myw3ICszNzMsNyBAQAogCiAJY2ggPSBremFsbG9jKHNpemVvZigqY2gpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNoKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAljaC0+YmFzZSA9IGJhc2U7CiAJaWYgKGNoX2ZsYWdzICYgQkVSTElOMl9BVlBMTF9TQ1JBTUJMRV9RVUlSSykKQEAgLTM4OSw1ICszODksNSBAQAogCWluaXQubnVtX3BhcmVudHMgPSAxOwogCWluaXQuZmxhZ3MgPSBmbGFnczsKIAotCXJldHVybiBjbGtfcmVnaXN0ZXIoTlVMTCwgJmNoLT5odyk7CisJcmV0dXJuIGNsa19od19yZWdpc3RlcihOVUxMLCAmY2gtPmh3KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZXJsaW4yLWF2cGxsLmggYi9kcml2ZXJzL2Nsay9iZXJsaW4vYmVybGluMi1hdnBsbC5oCmluZGV4IGEzN2Y1MDYuLjE3ZTMxMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZXJsaW4yLWF2cGxsLmgKKysrIGIvZHJpdmVycy9jbGsvYmVybGluL2JlcmxpbjItYXZwbGwuaApAQCAtMTksMTcgKzE5LDEzIEBACiAjaWZuZGVmIF9fQkVSTElOMl9BVlBMTF9ICiAjZGVmaW5lIF9fQkVSTElOMl9BVlBMTF9ICiAKLXN0cnVjdCBjbGs7Ci0KICNkZWZpbmUgQkVSTElOMl9BVlBMTF9CSVRfUVVJUksJCUJJVCgwKQogI2RlZmluZSBCRVJMSU4yX0FWUExMX1NDUkFNQkxFX1FVSVJLCUJJVCgxKQogCi1zdHJ1Y3QgY2xrICogX19pbml0Ci1iZXJsaW4yX2F2cGxsX3Zjb19yZWdpc3Rlcih2b2lkIF9faW9tZW0gKmJhc2UsIGNvbnN0IGNoYXIgKm5hbWUsCitpbnQgYmVybGluMl9hdnBsbF92Y29fcmVnaXN0ZXIodm9pZCBfX2lvbWVtICpiYXNlLCBjb25zdCBjaGFyICpuYW1lLAogCSAgIGNvbnN0IGNoYXIgKnBhcmVudF9uYW1lLCB1OCB2Y29fZmxhZ3MsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogCi1zdHJ1Y3QgY2xrICogX19pbml0Ci1iZXJsaW4yX2F2cGxsX2NoYW5uZWxfcmVnaXN0ZXIodm9pZCBfX2lvbWVtICpiYXNlLCBjb25zdCBjaGFyICpuYW1lLAoraW50IGJlcmxpbjJfYXZwbGxfY2hhbm5lbF9yZWdpc3Rlcih2b2lkIF9faW9tZW0gKmJhc2UsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCSAgICAgICB1OCBpbmRleCwgY29uc3QgY2hhciAqcGFyZW50X25hbWUsIHU4IGNoX2ZsYWdzLAogCQkgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZXJsaW4yLWRpdi5jIGIvZHJpdmVycy9jbGsvYmVybGluL2JlcmxpbjItZGl2LmMKaW5kZXggODFmZjk3Zi4uNDFhYjJkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvYmVybGluL2JlcmxpbjItZGl2LmMKKysrIGIvZHJpdmVycy9jbGsvYmVybGluL2JlcmxpbjItZGl2LmMKQEAgLTIzNCw3ICsyMzQsNyBAQAogCS5nZXRfcGFyZW50CT0gYmVybGluMl9kaXZfZ2V0X3BhcmVudCwKIH07CiAKLXN0cnVjdCBjbGsgKiBfX2luaXQKK3N0cnVjdCBjbGtfaHcgKiBfX2luaXQKIGJlcmxpbjJfZGl2X3JlZ2lzdGVyKGNvbnN0IHN0cnVjdCBiZXJsaW4yX2Rpdl9tYXAgKm1hcCwKIAkJICAgICB2b2lkIF9faW9tZW0gKmJhc2UsIGNvbnN0IGNoYXIgKm5hbWUsIHU4IGRpdl9mbGFncywKIAkJICAgICBjb25zdCBjaGFyICoqcGFyZW50X25hbWVzLCBpbnQgbnVtX3BhcmVudHMsCkBAIC0yNTksNyArMjU5LDcgQEAKIAlpZiAoKGRpdl9mbGFncyAmIEJFUkxJTjJfRElWX0hBU19NVVgpID09IDApCiAJCW11eF9vcHMgPSBOVUxMOwogCi0JcmV0dXJuIGNsa19yZWdpc3Rlcl9jb21wb3NpdGUoTlVMTCwgbmFtZSwgcGFyZW50X25hbWVzLCBudW1fcGFyZW50cywKKwlyZXR1cm4gY2xrX2h3X3JlZ2lzdGVyX2NvbXBvc2l0ZShOVUxMLCBuYW1lLCBwYXJlbnRfbmFtZXMsIG51bV9wYXJlbnRzLAogCQkJCSAgICAgICZkaXYtPmh3LCBtdXhfb3BzLCAmZGl2LT5odywgcmF0ZV9vcHMsCiAJCQkJICAgICAgJmRpdi0+aHcsIGdhdGVfb3BzLCBmbGFncyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9iZXJsaW4vYmVybGluMi1kaXYuaCBiL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZXJsaW4yLWRpdi5oCmluZGV4IDE1ZTMzODQuLmU4MzVkZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZXJsaW4yLWRpdi5oCisrKyBiL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZXJsaW4yLWRpdi5oCkBAIC0xOSw3ICsxOSw3IEBACiAjaWZuZGVmIF9fQkVSTElOMl9ESVZfSAogI2RlZmluZSBfX0JFUkxJTjJfRElWX0gKIAotc3RydWN0IGNsazsKK3N0cnVjdCBjbGtfaHc7CiAKICNkZWZpbmUgQkVSTElOMl9ESVZfSEFTX0dBVEUJCUJJVCgwKQogI2RlZmluZSBCRVJMSU4yX0RJVl9IQVNfTVVYCQlCSVQoMSkKQEAgLTgwLDcgKzgwLDcgQEAKIAl1OCBkaXZfZmxhZ3M7CiB9OwogCi1zdHJ1Y3QgY2xrICogX19pbml0CitzdHJ1Y3QgY2xrX2h3ICoKIGJlcmxpbjJfZGl2X3JlZ2lzdGVyKGNvbnN0IHN0cnVjdCBiZXJsaW4yX2Rpdl9tYXAgKm1hcCwKIAkgICAgIHZvaWQgX19pb21lbSAqYmFzZSwgIGNvbnN0IGNoYXIgKm5hbWUsIHU4IGRpdl9mbGFncywKIAkgICAgIGNvbnN0IGNoYXIgKipwYXJlbnRfbmFtZXMsIGludCBudW1fcGFyZW50cywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZXJsaW4yLXBsbC5jIGIvZHJpdmVycy9jbGsvYmVybGluL2JlcmxpbjItcGxsLmMKaW5kZXggMWMyMjk0ZC4uNGZmYmU4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvYmVybGluL2JlcmxpbjItcGxsLmMKKysrIGIvZHJpdmVycy9jbGsvYmVybGluL2JlcmxpbjItcGxsLmMKQEAgLTg0LDcgKzg0LDcgQEAKIAkucmVjYWxjX3JhdGUJPSBiZXJsaW4yX3BsbF9yZWNhbGNfcmF0ZSwKIH07CiAKLXN0cnVjdCBjbGsgKiBfX2luaXQKK2ludCBfX2luaXQKIGJlcmxpbjJfcGxsX3JlZ2lzdGVyKGNvbnN0IHN0cnVjdCBiZXJsaW4yX3BsbF9tYXAgKm1hcCwKIAkJICAgICB2b2lkIF9faW9tZW0gKmJhc2UsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCSAgICAgY29uc3QgY2hhciAqcGFyZW50X25hbWUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCkBAIC05NCw3ICs5NCw3IEBACiAKIAlwbGwgPSBremFsbG9jKHNpemVvZigqcGxsKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwbGwpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qIGNvcHkgcGxsX21hcCB0byBhbGxvdyBfX2luaXRjb25zdCAqLwogCW1lbWNweSgmcGxsLT5tYXAsIG1hcCwgc2l6ZW9mKCptYXApKTsKQEAgLTEwNiw1ICsxMDYsNSBAQAogCWluaXQubnVtX3BhcmVudHMgPSAxOwogCWluaXQuZmxhZ3MgPSBmbGFnczsKIAotCXJldHVybiBjbGtfcmVnaXN0ZXIoTlVMTCwgJnBsbC0+aHcpOworCXJldHVybiBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJnBsbC0+aHcpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYmVybGluL2JlcmxpbjItcGxsLmggYi9kcml2ZXJzL2Nsay9iZXJsaW4vYmVybGluMi1wbGwuaAppbmRleCA4ODMxY2UyLi41ODNlMDI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9iZXJsaW4vYmVybGluMi1wbGwuaAorKysgYi9kcml2ZXJzL2Nsay9iZXJsaW4vYmVybGluMi1wbGwuaApAQCAtMTksOCArMTksNiBAQAogI2lmbmRlZiBfX0JFUkxJTjJfUExMX0gKICNkZWZpbmUgX19CRVJMSU4yX1BMTF9ICiAKLXN0cnVjdCBjbGs7Ci0KIHN0cnVjdCBiZXJsaW4yX3BsbF9tYXAgewogCWNvbnN0IHU4IHZjb2RpdlsxNl07CiAJdTggbXVsdDsKQEAgLTI5LDkgKzI3LDggQEAKIAl1OCBkaXZzZWxfc2hpZnQ7CiB9OwogCi1zdHJ1Y3QgY2xrICogX19pbml0Ci1iZXJsaW4yX3BsbF9yZWdpc3Rlcihjb25zdCBzdHJ1Y3QgYmVybGluMl9wbGxfbWFwICptYXAsCi0JCSAgICAgdm9pZCBfX2lvbWVtICpiYXNlLCBjb25zdCBjaGFyICpuYW1lLAotCQkgICAgIGNvbnN0IGNoYXIgKnBhcmVudF9uYW1lLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2ludCBiZXJsaW4yX3BsbF9yZWdpc3Rlcihjb25zdCBzdHJ1Y3QgYmVybGluMl9wbGxfbWFwICptYXAsCisJCQkgdm9pZCBfX2lvbWVtICpiYXNlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJIGNvbnN0IGNoYXIgKnBhcmVudF9uYW1lLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIAogI2VuZGlmIC8qIF9fQkVSTElOMl9QTExfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYmVybGluL2JnMi5jIGIvZHJpdmVycy9jbGsvYmVybGluL2JnMi5jCmluZGV4IDIzZTBlM2IuLmVkZjNiOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZzIuYworKysgYi9kcml2ZXJzL2Nsay9iZXJsaW4vYmcyLmMKQEAgLTkyLDggKzkyLDcgQEAKICAqLwogCiAjZGVmaW5lCU1BWF9DTEtTIDQxCi1zdGF0aWMgc3RydWN0IGNsayAqY2xrc1tNQVhfQ0xLU107Ci1zdGF0aWMgc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgY2xrX2RhdGE7CitzdGF0aWMgc3RydWN0IGNsa19od19vbmVjZWxsX2RhdGEgKmNsa19kYXRhOwogc3RhdGljIERFRklORV9TUElOTE9DSyhsb2NrKTsKIHN0YXRpYyB2b2lkIF9faW9tZW0gKmdiYXNlOwogCkBAIC01MDUsOCArNTA0LDE3IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnRfbnAgPSBvZl9nZXRfcGFyZW50KG5wKTsKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZXNbOV07CiAJc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGtfaHcgKmh3OworCXN0cnVjdCBjbGtfaHcgKipod3M7CiAJdTggYXZwbGxfZmxhZ3MgPSAwOwotCWludCBuOworCWludCBuLCByZXQ7CisKKwljbGtfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpjbGtfZGF0YSkgKworCQkJICAgc2l6ZW9mKCpjbGtfZGF0YS0+aHdzKSAqIE1BWF9DTEtTLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNsa19kYXRhKQorCQlyZXR1cm47CisJY2xrX2RhdGEtPm51bSA9IE1BWF9DTEtTOworCWh3cyA9IGNsa19kYXRhLT5od3M7CiAKIAlnYmFzZSA9IG9mX2lvbWFwKHBhcmVudF9ucCwgMCk7CiAJaWYgKCFnYmFzZSkKQEAgLTUyNiwxMTggKzUzNCwxMTggQEAKIAl9CiAKIAkvKiBzaW1wbGUgcmVnaXN0ZXIgUExMcyAqLwotCWNsayA9IGJlcmxpbjJfcGxsX3JlZ2lzdGVyKCZiZzJfcGxsX21hcCwgZ2Jhc2UgKyBSRUdfU1lTUExMQ1RMMCwKKwlyZXQgPSBiZXJsaW4yX3BsbF9yZWdpc3RlcigmYmcyX3BsbF9tYXAsIGdiYXNlICsgUkVHX1NZU1BMTENUTDAsCiAJCQkJICAgY2xrX25hbWVzW1NZU1BMTF0sIGNsa19uYW1lc1tSRUZDTEtdLCAwKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaWYgKHJldCkKIAkJZ290byBiZzJfZmFpbDsKIAotCWNsayA9IGJlcmxpbjJfcGxsX3JlZ2lzdGVyKCZiZzJfcGxsX21hcCwgZ2Jhc2UgKyBSRUdfTUVNUExMQ1RMMCwKKwlyZXQgPSBiZXJsaW4yX3BsbF9yZWdpc3RlcigmYmcyX3BsbF9tYXAsIGdiYXNlICsgUkVHX01FTVBMTENUTDAsCiAJCQkJICAgY2xrX25hbWVzW01FTVBMTF0sIGNsa19uYW1lc1tSRUZDTEtdLCAwKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaWYgKHJldCkKIAkJZ290byBiZzJfZmFpbDsKIAotCWNsayA9IGJlcmxpbjJfcGxsX3JlZ2lzdGVyKCZiZzJfcGxsX21hcCwgZ2Jhc2UgKyBSRUdfQ1BVUExMQ1RMMCwKKwlyZXQgPSBiZXJsaW4yX3BsbF9yZWdpc3RlcigmYmcyX3BsbF9tYXAsIGdiYXNlICsgUkVHX0NQVVBMTENUTDAsCiAJCQkJICAgY2xrX25hbWVzW0NQVVBMTF0sIGNsa19uYW1lc1tSRUZDTEtdLCAwKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaWYgKHJldCkKIAkJZ290byBiZzJfZmFpbDsKIAogCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgIm1hcnZlbGwsYmVybGluMi1nbG9iYWwtcmVnaXN0ZXIiKSkKIAkJYXZwbGxfZmxhZ3MgfD0gQkVSTElOMl9BVlBMTF9TQ1JBTUJMRV9RVUlSSzsKIAogCS8qIGF1ZGlvL3ZpZGVvIFZDT3MgKi8KLQljbGsgPSBiZXJsaW4yX2F2cGxsX3Zjb19yZWdpc3RlcihnYmFzZSArIFJFR19BVlBMTENUTDAsICJhdnBsbF92Y29BIiwKKwlyZXQgPSBiZXJsaW4yX2F2cGxsX3Zjb19yZWdpc3RlcihnYmFzZSArIFJFR19BVlBMTENUTDAsICJhdnBsbF92Y29BIiwKIAkJCSBjbGtfbmFtZXNbUkVGQ0xLXSwgYXZwbGxfZmxhZ3MsIDApOwotCWlmIChJU19FUlIoY2xrKSkKKwlpZiAocmV0KQogCQlnb3RvIGJnMl9mYWlsOwogCiAJZm9yIChuID0gMDsgbiA8IDg7IG4rKykgewotCQljbGsgPSBiZXJsaW4yX2F2cGxsX2NoYW5uZWxfcmVnaXN0ZXIoZ2Jhc2UgKyBSRUdfQVZQTExDVEwwLAorCQlyZXQgPSBiZXJsaW4yX2F2cGxsX2NoYW5uZWxfcmVnaXN0ZXIoZ2Jhc2UgKyBSRUdfQVZQTExDVEwwLAogCQkJICAgICBjbGtfbmFtZXNbQVZQTExfQTEgKyBuXSwgbiwgImF2cGxsX3Zjb0EiLAogCQkJICAgICBhdnBsbF9mbGFncywgMCk7Ci0JCWlmIChJU19FUlIoY2xrKSkKKwkJaWYgKHJldCkKIAkJCWdvdG8gYmcyX2ZhaWw7CiAJfQogCi0JY2xrID0gYmVybGluMl9hdnBsbF92Y29fcmVnaXN0ZXIoZ2Jhc2UgKyBSRUdfQVZQTExDVEwzMSwgImF2cGxsX3Zjb0IiLAorCXJldCA9IGJlcmxpbjJfYXZwbGxfdmNvX3JlZ2lzdGVyKGdiYXNlICsgUkVHX0FWUExMQ1RMMzEsICJhdnBsbF92Y29CIiwKIAkJCQkgY2xrX25hbWVzW1JFRkNMS10sIEJFUkxJTjJfQVZQTExfQklUX1FVSVJLIHwKIAkJCQkgYXZwbGxfZmxhZ3MsIDApOwotCWlmIChJU19FUlIoY2xrKSkKKwlpZiAocmV0KQogCQlnb3RvIGJnMl9mYWlsOwogCiAJZm9yIChuID0gMDsgbiA8IDg7IG4rKykgewotCQljbGsgPSBiZXJsaW4yX2F2cGxsX2NoYW5uZWxfcmVnaXN0ZXIoZ2Jhc2UgKyBSRUdfQVZQTExDVEwzMSwKKwkJcmV0ID0gYmVybGluMl9hdnBsbF9jaGFubmVsX3JlZ2lzdGVyKGdiYXNlICsgUkVHX0FWUExMQ1RMMzEsCiAJCQkgICAgIGNsa19uYW1lc1tBVlBMTF9CMSArIG5dLCBuLCAiYXZwbGxfdmNvQiIsCiAJCQkgICAgIEJFUkxJTjJfQVZQTExfQklUX1FVSVJLIHwgYXZwbGxfZmxhZ3MsIDApOwotCQlpZiAoSVNfRVJSKGNsaykpCisJCWlmIChyZXQpCiAJCQlnb3RvIGJnMl9mYWlsOwogCX0KIAogCS8qIHJlZmVyZW5jZSBjbG9jayBieXBhc3Mgc3dpdGNoZXMgKi8KIAlwYXJlbnRfbmFtZXNbMF0gPSBjbGtfbmFtZXNbU1lTUExMXTsKIAlwYXJlbnRfbmFtZXNbMV0gPSBjbGtfbmFtZXNbUkVGQ0xLXTsKLQljbGsgPSBjbGtfcmVnaXN0ZXJfbXV4KE5VTEwsICJzeXNwbGxfYnlwIiwgcGFyZW50X25hbWVzLCAyLAorCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX211eChOVUxMLCAic3lzcGxsX2J5cCIsIHBhcmVudF9uYW1lcywgMiwKIAkJCSAgICAgICAwLCBnYmFzZSArIFJFR19DTEtTV0lUQ0gwLCAwLCAxLCAwLCAmbG9jayk7Ci0JaWYgKElTX0VSUihjbGspKQorCWlmIChJU19FUlIoaHcpKQogCQlnb3RvIGJnMl9mYWlsOwotCWNsa19uYW1lc1tTWVNQTExdID0gX19jbGtfZ2V0X25hbWUoY2xrKTsKKwljbGtfbmFtZXNbU1lTUExMXSA9IGNsa19od19nZXRfbmFtZShodyk7CiAKIAlwYXJlbnRfbmFtZXNbMF0gPSBjbGtfbmFtZXNbTUVNUExMXTsKIAlwYXJlbnRfbmFtZXNbMV0gPSBjbGtfbmFtZXNbUkVGQ0xLXTsKLQljbGsgPSBjbGtfcmVnaXN0ZXJfbXV4KE5VTEwsICJtZW1wbGxfYnlwIiwgcGFyZW50X25hbWVzLCAyLAorCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX211eChOVUxMLCAibWVtcGxsX2J5cCIsIHBhcmVudF9uYW1lcywgMiwKIAkJCSAgICAgICAwLCBnYmFzZSArIFJFR19DTEtTV0lUQ0gwLCAxLCAxLCAwLCAmbG9jayk7Ci0JaWYgKElTX0VSUihjbGspKQorCWlmIChJU19FUlIoaHcpKQogCQlnb3RvIGJnMl9mYWlsOwotCWNsa19uYW1lc1tNRU1QTExdID0gX19jbGtfZ2V0X25hbWUoY2xrKTsKKwljbGtfbmFtZXNbTUVNUExMXSA9IGNsa19od19nZXRfbmFtZShodyk7CiAKIAlwYXJlbnRfbmFtZXNbMF0gPSBjbGtfbmFtZXNbQ1BVUExMXTsKIAlwYXJlbnRfbmFtZXNbMV0gPSBjbGtfbmFtZXNbUkVGQ0xLXTsKLQljbGsgPSBjbGtfcmVnaXN0ZXJfbXV4KE5VTEwsICJjcHVwbGxfYnlwIiwgcGFyZW50X25hbWVzLCAyLAorCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX211eChOVUxMLCAiY3B1cGxsX2J5cCIsIHBhcmVudF9uYW1lcywgMiwKIAkJCSAgICAgICAwLCBnYmFzZSArIFJFR19DTEtTV0lUQ0gwLCAyLCAxLCAwLCAmbG9jayk7Ci0JaWYgKElTX0VSUihjbGspKQorCWlmIChJU19FUlIoaHcpKQogCQlnb3RvIGJnMl9mYWlsOwotCWNsa19uYW1lc1tDUFVQTExdID0gX19jbGtfZ2V0X25hbWUoY2xrKTsKKwljbGtfbmFtZXNbQ1BVUExMXSA9IGNsa19od19nZXRfbmFtZShodyk7CiAKIAkvKiBjbG9jayBtdXhlcyAqLwogCXBhcmVudF9uYW1lc1swXSA9IGNsa19uYW1lc1tBVlBMTF9CM107CiAJcGFyZW50X25hbWVzWzFdID0gY2xrX25hbWVzW0FWUExMX0EzXTsKLQljbGsgPSBjbGtfcmVnaXN0ZXJfbXV4KE5VTEwsIGNsa19uYW1lc1tBVURJTzFfUExMXSwgcGFyZW50X25hbWVzLCAyLAorCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX211eChOVUxMLCBjbGtfbmFtZXNbQVVESU8xX1BMTF0sIHBhcmVudF9uYW1lcywgMiwKIAkJCSAgICAgICAwLCBnYmFzZSArIFJFR19DTEtTRUxFQ1QyLCAyOSwgMSwgMCwgJmxvY2spOwotCWlmIChJU19FUlIoY2xrKSkKKwlpZiAoSVNfRVJSKGh3KSkKIAkJZ290byBiZzJfZmFpbDsKIAogCXBhcmVudF9uYW1lc1swXSA9IGNsa19uYW1lc1tWSURFTzBfUExMXTsKIAlwYXJlbnRfbmFtZXNbMV0gPSBjbGtfbmFtZXNbVklERU9fRVhUMF07Ci0JY2xrID0gY2xrX3JlZ2lzdGVyX211eChOVUxMLCBjbGtfbmFtZXNbVklERU8wX0lOXSwgcGFyZW50X25hbWVzLCAyLAorCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX211eChOVUxMLCBjbGtfbmFtZXNbVklERU8wX0lOXSwgcGFyZW50X25hbWVzLCAyLAogCQkJICAgICAgIDAsIGdiYXNlICsgUkVHX0NMS1NFTEVDVDMsIDQsIDEsIDAsICZsb2NrKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaWYgKElTX0VSUihodykpCiAJCWdvdG8gYmcyX2ZhaWw7CiAKIAlwYXJlbnRfbmFtZXNbMF0gPSBjbGtfbmFtZXNbVklERU8xX1BMTF07CiAJcGFyZW50X25hbWVzWzFdID0gY2xrX25hbWVzW1ZJREVPX0VYVDBdOwotCWNsayA9IGNsa19yZWdpc3Rlcl9tdXgoTlVMTCwgY2xrX25hbWVzW1ZJREVPMV9JTl0sIHBhcmVudF9uYW1lcywgMiwKKwlodyA9IGNsa19od19yZWdpc3Rlcl9tdXgoTlVMTCwgY2xrX25hbWVzW1ZJREVPMV9JTl0sIHBhcmVudF9uYW1lcywgMiwKIAkJCSAgICAgICAwLCBnYmFzZSArIFJFR19DTEtTRUxFQ1QzLCA2LCAxLCAwLCAmbG9jayk7Ci0JaWYgKElTX0VSUihjbGspKQorCWlmIChJU19FUlIoaHcpKQogCQlnb3RvIGJnMl9mYWlsOwogCiAJcGFyZW50X25hbWVzWzBdID0gY2xrX25hbWVzW0FWUExMX0EyXTsKIAlwYXJlbnRfbmFtZXNbMV0gPSBjbGtfbmFtZXNbQVZQTExfQjJdOwotCWNsayA9IGNsa19yZWdpc3Rlcl9tdXgoTlVMTCwgY2xrX25hbWVzW1ZJREVPMV9QTExdLCBwYXJlbnRfbmFtZXMsIDIsCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfbXV4KE5VTEwsIGNsa19uYW1lc1tWSURFTzFfUExMXSwgcGFyZW50X25hbWVzLCAyLAogCQkJICAgICAgIDAsIGdiYXNlICsgUkVHX0NMS1NFTEVDVDMsIDcsIDEsIDAsICZsb2NrKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaWYgKElTX0VSUihodykpCiAJCWdvdG8gYmcyX2ZhaWw7CiAKIAlwYXJlbnRfbmFtZXNbMF0gPSBjbGtfbmFtZXNbVklERU8yX1BMTF07CiAJcGFyZW50X25hbWVzWzFdID0gY2xrX25hbWVzW1ZJREVPX0VYVDBdOwotCWNsayA9IGNsa19yZWdpc3Rlcl9tdXgoTlVMTCwgY2xrX25hbWVzW1ZJREVPMl9JTl0sIHBhcmVudF9uYW1lcywgMiwKKwlodyA9IGNsa19od19yZWdpc3Rlcl9tdXgoTlVMTCwgY2xrX25hbWVzW1ZJREVPMl9JTl0sIHBhcmVudF9uYW1lcywgMiwKIAkJCSAgICAgICAwLCBnYmFzZSArIFJFR19DTEtTRUxFQ1QzLCA5LCAxLCAwLCAmbG9jayk7Ci0JaWYgKElTX0VSUihjbGspKQorCWlmIChJU19FUlIoaHcpKQogCQlnb3RvIGJnMl9mYWlsOwogCiAJcGFyZW50X25hbWVzWzBdID0gY2xrX25hbWVzW0FWUExMX0IxXTsKIAlwYXJlbnRfbmFtZXNbMV0gPSBjbGtfbmFtZXNbQVZQTExfQTVdOwotCWNsayA9IGNsa19yZWdpc3Rlcl9tdXgoTlVMTCwgY2xrX25hbWVzW1ZJREVPMl9QTExdLCBwYXJlbnRfbmFtZXMsIDIsCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfbXV4KE5VTEwsIGNsa19uYW1lc1tWSURFTzJfUExMXSwgcGFyZW50X25hbWVzLCAyLAogCQkJICAgICAgIDAsIGdiYXNlICsgUkVHX0NMS1NFTEVDVDMsIDEwLCAxLCAwLCAmbG9jayk7Ci0JaWYgKElTX0VSUihjbGspKQorCWlmIChJU19FUlIoaHcpKQogCQlnb3RvIGJnMl9mYWlsOwogCiAJLyogY2xvY2sgZGl2aWRlciBjZWxscyAqLwpAQCAtNjQ4LDcgKzY1Niw3IEBACiAJCWZvciAoayA9IDA7IGsgPCBkZC0+bnVtX3BhcmVudHM7IGsrKykKIAkJCXBhcmVudF9uYW1lc1trXSA9IGNsa19uYW1lc1tkZC0+cGFyZW50X2lkc1trXV07CiAKLQkJY2xrc1tDTEtJRF9TWVMgKyBuXSA9IGJlcmxpbjJfZGl2X3JlZ2lzdGVyKCZkZC0+bWFwLCBnYmFzZSwKKwkJaHdzW0NMS0lEX1NZUyArIG5dID0gYmVybGluMl9kaXZfcmVnaXN0ZXIoJmRkLT5tYXAsIGdiYXNlLAogCQkJCWRkLT5uYW1lLCBkZC0+ZGl2X2ZsYWdzLCBwYXJlbnRfbmFtZXMsCiAJCQkJZGQtPm51bV9wYXJlbnRzLCBkZC0+ZmxhZ3MsICZsb2NrKTsKIAl9CkBAIC02NTcsMTggKzY2NSwxOCBAQAogCWZvciAobiA9IDA7IG4gPCBBUlJBWV9TSVpFKGJnMl9nYXRlcyk7IG4rKykgewogCQljb25zdCBzdHJ1Y3QgYmVybGluMl9nYXRlX2RhdGEgKmdkID0gJmJnMl9nYXRlc1tuXTsKIAotCQljbGtzW0NMS0lEX0dFVEgwICsgbl0gPSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCBnZC0+bmFtZSwKKwkJaHdzW0NMS0lEX0dFVEgwICsgbl0gPSBjbGtfaHdfcmVnaXN0ZXJfZ2F0ZShOVUxMLCBnZC0+bmFtZSwKIAkJCSAgICBnZC0+cGFyZW50X25hbWUsIGdkLT5mbGFncywgZ2Jhc2UgKyBSRUdfQ0xLRU5BQkxFLAogCQkJICAgIGdkLT5iaXRfaWR4LCAwLCAmbG9jayk7CiAJfQogCiAJLyogdHdkY2xrIGlzIGRlcml2ZWQgZnJvbSBjcHUvMyAqLwotCWNsa3NbQ0xLSURfVFdEXSA9Ci0JCWNsa19yZWdpc3Rlcl9maXhlZF9mYWN0b3IoTlVMTCwgInR3ZCIsICJjcHUiLCAwLCAxLCAzKTsKKwlod3NbQ0xLSURfVFdEXSA9CisJCWNsa19od19yZWdpc3Rlcl9maXhlZF9mYWN0b3IoTlVMTCwgInR3ZCIsICJjcHUiLCAwLCAxLCAzKTsKIAogCS8qIGNoZWNrIGZvciBlcnJvcnMgb24gbGVhZiBjbG9ja3MgKi8KIAlmb3IgKG4gPSAwOyBuIDwgTUFYX0NMS1M7IG4rKykgewotCQlpZiAoIUlTX0VSUihjbGtzW25dKSkKKwkJaWYgKCFJU19FUlIoaHdzW25dKSkKIAkJCWNvbnRpbnVlOwogCiAJCXByX2VycigiJXM6IFVuYWJsZSB0byByZWdpc3RlciBsZWFmIGNsb2NrICVkXG4iLApAQCAtNjc3LDkgKzY4NSw3IEBACiAJfQogCiAJLyogcmVnaXN0ZXIgY2xrLXByb3ZpZGVyICovCi0JY2xrX2RhdGEuY2xrcyA9IGNsa3M7Ci0JY2xrX2RhdGEuY2xrX251bSA9IE1BWF9DTEtTOwotCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsICZjbGtfZGF0YSk7CisJb2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X29uZWNlbGxfZ2V0LCAmY2xrX2RhdGEpOwogCiAJcmV0dXJuOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9iZXJsaW4vYmcycS5jIGIvZHJpdmVycy9jbGsvYmVybGluL2JnMnEuYwppbmRleCBmMTQ0NTQ3Li4wNzE4ZTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9iZXJsaW4vYmcycS5jCisrKyBiL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZzJxLmMKQEAgLTQ2LDggKzQ2LDcgQEAKICNkZWZpbmUgUkVHX1NESU8xWElOX0NMS0NUTAkweDAxNWMKIAogI2RlZmluZQlNQVhfQ0xLUyAyOAotc3RhdGljIHN0cnVjdCBjbGsgKmNsa3NbTUFYX0NMS1NdOwotc3RhdGljIHN0cnVjdCBjbGtfb25lY2VsbF9kYXRhIGNsa19kYXRhOworc3RhdGljIHN0cnVjdCBjbGtfaHdfb25lY2VsbF9kYXRhICpjbGtfZGF0YTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7CiBzdGF0aWMgdm9pZCBfX2lvbWVtICpnYmFzZTsKIHN0YXRpYyB2b2lkIF9faW9tZW0gKmNwdXBsbF9iYXNlOwpAQCAtMjkzLDcgKzI5MiwxNSBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50X25wID0gb2ZfZ2V0X3BhcmVudChucCk7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWVzWzldOwogCXN0cnVjdCBjbGsgKmNsazsKLQlpbnQgbjsKKwlzdHJ1Y3QgY2xrX2h3ICoqaHdzOworCWludCBuLCByZXQ7CisKKwljbGtfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpjbGtfZGF0YSkgKworCQkJICAgc2l6ZW9mKCpjbGtfZGF0YS0+aHdzKSAqIE1BWF9DTEtTLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNsa19kYXRhKQorCQlyZXR1cm47CisJY2xrX2RhdGEtPm51bSA9IE1BWF9DTEtTOworCWh3cyA9IGNsa19kYXRhLT5od3M7CiAKIAlnYmFzZSA9IG9mX2lvbWFwKHBhcmVudF9ucCwgMCk7CiAJaWYgKCFnYmFzZSkgewpAQCAtMzE3LDE0ICszMjQsMTQgQEAKIAl9CiAKIAkvKiBzaW1wbGUgcmVnaXN0ZXIgUExMcyAqLwotCWNsayA9IGJlcmxpbjJfcGxsX3JlZ2lzdGVyKCZiZzJxX3BsbF9tYXAsIGdiYXNlICsgUkVHX1NZU1BMTENUTDAsCisJcmV0ID0gYmVybGluMl9wbGxfcmVnaXN0ZXIoJmJnMnFfcGxsX21hcCwgZ2Jhc2UgKyBSRUdfU1lTUExMQ1RMMCwKIAkJCQkgICBjbGtfbmFtZXNbU1lTUExMXSwgY2xrX25hbWVzW1JFRkNMS10sIDApOwotCWlmIChJU19FUlIoY2xrKSkKKwlpZiAocmV0KQogCQlnb3RvIGJnMnFfZmFpbDsKIAotCWNsayA9IGJlcmxpbjJfcGxsX3JlZ2lzdGVyKCZiZzJxX3BsbF9tYXAsIGNwdXBsbF9iYXNlLAorCXJldCA9IGJlcmxpbjJfcGxsX3JlZ2lzdGVyKCZiZzJxX3BsbF9tYXAsIGNwdXBsbF9iYXNlLAogCQkJCSAgIGNsa19uYW1lc1tDUFVQTExdLCBjbGtfbmFtZXNbUkVGQ0xLXSwgMCk7Ci0JaWYgKElTX0VSUihjbGspKQorCWlmIChyZXQpCiAJCWdvdG8gYmcycV9mYWlsOwogCiAJLyogVE9ETzogYWRkIEJHMlEgQVZQTEwgKi8KQEAgLTM0Miw3ICszNDksNyBAQAogCQlmb3IgKGsgPSAwOyBrIDwgZGQtPm51bV9wYXJlbnRzOyBrKyspCiAJCQlwYXJlbnRfbmFtZXNba10gPSBjbGtfbmFtZXNbZGQtPnBhcmVudF9pZHNba11dOwogCi0JCWNsa3NbQ0xLSURfU1lTICsgbl0gPSBiZXJsaW4yX2Rpdl9yZWdpc3RlcigmZGQtPm1hcCwgZ2Jhc2UsCisJCWh3c1tDTEtJRF9TWVMgKyBuXSA9IGJlcmxpbjJfZGl2X3JlZ2lzdGVyKCZkZC0+bWFwLCBnYmFzZSwKIAkJCQlkZC0+bmFtZSwgZGQtPmRpdl9mbGFncywgcGFyZW50X25hbWVzLAogCQkJCWRkLT5udW1fcGFyZW50cywgZGQtPmZsYWdzLCAmbG9jayk7CiAJfQpAQCAtMzUxLDIyICszNTgsMjIgQEAKIAlmb3IgKG4gPSAwOyBuIDwgQVJSQVlfU0laRShiZzJxX2dhdGVzKTsgbisrKSB7CiAJCWNvbnN0IHN0cnVjdCBiZXJsaW4yX2dhdGVfZGF0YSAqZ2QgPSAmYmcycV9nYXRlc1tuXTsKIAotCQljbGtzW0NMS0lEX0dGWDJEQVhJICsgbl0gPSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCBnZC0+bmFtZSwKKwkJaHdzW0NMS0lEX0dGWDJEQVhJICsgbl0gPSBjbGtfaHdfcmVnaXN0ZXJfZ2F0ZShOVUxMLCBnZC0+bmFtZSwKIAkJCSAgICBnZC0+cGFyZW50X25hbWUsIGdkLT5mbGFncywgZ2Jhc2UgKyBSRUdfQ0xLRU5BQkxFLAogCQkJICAgIGdkLT5iaXRfaWR4LCAwLCAmbG9jayk7CiAJfQogCiAJLyogY3B1Y2xrIGRpdmlkZXIgaXMgZml4ZWQgdG8gMSAqLwotCWNsa3NbQ0xLSURfQ1BVXSA9Ci0JCWNsa19yZWdpc3Rlcl9maXhlZF9mYWN0b3IoTlVMTCwgImNwdSIsIGNsa19uYW1lc1tDUFVQTExdLAorCWh3c1tDTEtJRF9DUFVdID0KKwkJY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLCAiY3B1IiwgY2xrX25hbWVzW0NQVVBMTF0sCiAJCQkJCSAgMCwgMSwgMSk7CiAJLyogdHdkY2xrIGlzIGRlcml2ZWQgZnJvbSBjcHUvMyAqLwotCWNsa3NbQ0xLSURfVFdEXSA9Ci0JCWNsa19yZWdpc3Rlcl9maXhlZF9mYWN0b3IoTlVMTCwgInR3ZCIsICJjcHUiLCAwLCAxLCAzKTsKKwlod3NbQ0xLSURfVFdEXSA9CisJCWNsa19od19yZWdpc3Rlcl9maXhlZF9mYWN0b3IoTlVMTCwgInR3ZCIsICJjcHUiLCAwLCAxLCAzKTsKIAogCS8qIGNoZWNrIGZvciBlcnJvcnMgb24gbGVhZiBjbG9ja3MgKi8KIAlmb3IgKG4gPSAwOyBuIDwgTUFYX0NMS1M7IG4rKykgewotCQlpZiAoIUlTX0VSUihjbGtzW25dKSkKKwkJaWYgKCFJU19FUlIoaHdzW25dKSkKIAkJCWNvbnRpbnVlOwogCiAJCXByX2VycigiJXM6IFVuYWJsZSB0byByZWdpc3RlciBsZWFmIGNsb2NrICVkXG4iLApAQCAtMzc1LDkgKzM4Miw3IEBACiAJfQogCiAJLyogcmVnaXN0ZXIgY2xrLXByb3ZpZGVyICovCi0JY2xrX2RhdGEuY2xrcyA9IGNsa3M7Ci0JY2xrX2RhdGEuY2xrX251bSA9IE1BWF9DTEtTOwotCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsICZjbGtfZGF0YSk7CisJb2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X29uZWNlbGxfZ2V0LCAmY2xrX2RhdGEpOwogCiAJcmV0dXJuOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstYXNtOTI2MC5jIGIvZHJpdmVycy9jbGsvY2xrLWFzbTkyNjAuYwppbmRleCA5MDg5N2FmLi5lYTg1Njg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9jbGstYXNtOTI2MC5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay1hc205MjYwLmMKQEAgLTY4LDggKzY4LDcgQEAKICNkZWZpbmUgSFdfTENEQ0xLRElWCQkweDAxZmMKICNkZWZpbmUgSFdfQURDQU5BQ0xLRElWCQkweDAyMDAKIAotc3RhdGljIHN0cnVjdCBjbGsgKmNsa3NbTUFYX0NMS1NdOwotc3RhdGljIHN0cnVjdCBjbGtfb25lY2VsbF9kYXRhIGNsa19kYXRhOworc3RhdGljIHN0cnVjdCBjbGtfaHdfb25lY2VsbF9kYXRhICpjbGtfZGF0YTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soYXNtOTI2MF9jbGtfbG9jayk7CiAKIHN0cnVjdCBhc205MjYwX2Rpdl9jbGsgewpAQCAtMjY3LDEyICsyNjYsMjAgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGFzbTkyNjBfYWNjX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19odyAqaHc7CisJc3RydWN0IGNsa19odyAqKmh3czsKIAljb25zdCBjaGFyICpyZWZfY2xrLCAqcGxsX2NsayA9ICJwbGwiOwogCXUzMiByYXRlOwogCWludCBuOwogCXUzMiBhY2N1cmFjeSA9IDA7CiAKKwljbGtfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpjbGtfZGF0YSkgKworCQkJICAgc2l6ZW9mKCpjbGtfZGF0YS0+aHdzKSAqIE1BWF9DTEtTLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNsa19kYXRhKQorCQlyZXR1cm47CisJY2xrX2RhdGEtPm51bSA9IE1BWF9DTEtTOworCWh3cyA9IGNsa19kYXRhLT5od3M7CisKIAliYXNlID0gb2ZfaW9fcmVxdWVzdF9hbmRfbWFwKG5wLCAwLCBucC0+bmFtZSk7CiAJaWYgKElTX0VSUihiYXNlKSkKIAkJcGFuaWMoIiVzOiB1bmFibGUgdG8gbWFwIHJlc291cmNlIiwgbnAtPm5hbWUpOwpAQCAtMjgyLDEwICsyODksMTAgQEAKIAogCXJlZl9jbGsgPSBvZl9jbGtfZ2V0X3BhcmVudF9uYW1lKG5wLCAwKTsKIAlhY2N1cmFjeSA9IGNsa19nZXRfYWNjdXJhY3koX19jbGtfbG9va3VwKHJlZl9jbGspKTsKLQljbGsgPSBjbGtfcmVnaXN0ZXJfZml4ZWRfcmF0ZV93aXRoX2FjY3VyYWN5KE5VTEwsIHBsbF9jbGssCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfZml4ZWRfcmF0ZV93aXRoX2FjY3VyYWN5KE5VTEwsIHBsbF9jbGssCiAJCQlyZWZfY2xrLCAwLCByYXRlLCBhY2N1cmFjeSk7CiAKLQlpZiAoSVNfRVJSKGNsaykpCisJaWYgKElTX0VSUihodykpCiAJCXBhbmljKCIlczogY2FuJ3QgcmVnaXN0ZXIgUkVGQ0xLLiBDaGVjayBEVCEiLCBucC0+bmFtZSk7CiAKIAlmb3IgKG4gPSAwOyBuIDwgQVJSQVlfU0laRShhc205MjYwX211eF9jbGtzKTsgbisrKSB7CkBAIC0yOTMsNyArMzAwLDcgQEAKIAogCQltYy0+cGFyZW50X25hbWVzWzBdID0gcmVmX2NsazsKIAkJbWMtPnBhcmVudF9uYW1lc1sxXSA9IHBsbF9jbGs7Ci0JCWNsayA9IGNsa19yZWdpc3Rlcl9tdXhfdGFibGUoTlVMTCwgbWMtPm5hbWUsIG1jLT5wYXJlbnRfbmFtZXMsCisJCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX211eF90YWJsZShOVUxMLCBtYy0+bmFtZSwgbWMtPnBhcmVudF9uYW1lcywKIAkJCQltYy0+bnVtX3BhcmVudHMsIG1jLT5mbGFncywgYmFzZSArIG1jLT5vZmZzZXQsCiAJCQkJMCwgbWMtPm1hc2ssIDAsIG1jLT50YWJsZSwgJmFzbTkyNjBfY2xrX2xvY2spOwogCX0KQEAgLTMwMiw3ICszMDksNyBAQAogCWZvciAobiA9IDA7IG4gPCBBUlJBWV9TSVpFKGFzbTkyNjBfbXV4X2dhdGVzKTsgbisrKSB7CiAJCWNvbnN0IHN0cnVjdCBhc205MjYwX2dhdGVfZGF0YSAqZ2QgPSAmYXNtOTI2MF9tdXhfZ2F0ZXNbbl07CiAKLQkJY2xrID0gY2xrX3JlZ2lzdGVyX2dhdGUoTlVMTCwgZ2QtPm5hbWUsCisJCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX2dhdGUoTlVMTCwgZ2QtPm5hbWUsCiAJCQlnZC0+cGFyZW50X25hbWUsIGdkLT5mbGFncyB8IENMS19TRVRfUkFURV9QQVJFTlQsCiAJCQliYXNlICsgZ2QtPnJlZywgZ2QtPmJpdF9pZHgsIDAsICZhc205MjYwX2Nsa19sb2NrKTsKIAl9CkBAIC0zMTEsNyArMzE4LDcgQEAKIAlmb3IgKG4gPSAwOyBuIDwgQVJSQVlfU0laRShhc205MjYwX2Rpdl9jbGtzKTsgbisrKSB7CiAJCWNvbnN0IHN0cnVjdCBhc205MjYwX2Rpdl9jbGsgKmRjID0gJmFzbTkyNjBfZGl2X2Nsa3Nbbl07CiAKLQkJY2xrc1tkYy0+aWR4XSA9IGNsa19yZWdpc3Rlcl9kaXZpZGVyKE5VTEwsIGRjLT5uYW1lLAorCQlod3NbZGMtPmlkeF0gPSBjbGtfaHdfcmVnaXN0ZXJfZGl2aWRlcihOVUxMLCBkYy0+bmFtZSwKIAkJCQlkYy0+cGFyZW50X25hbWUsIENMS19TRVRfUkFURV9QQVJFTlQsCiAJCQkJYmFzZSArIGRjLT5yZWcsIDAsIDgsIENMS19ESVZJREVSX09ORV9CQVNFRCwKIAkJCQkmYXNtOTI2MF9jbGtfbG9jayk7CkBAIC0zMjEsMTQgKzMyOCwxNCBAQAogCWZvciAobiA9IDA7IG4gPCBBUlJBWV9TSVpFKGFzbTkyNjBfYWhiX2dhdGVzKTsgbisrKSB7CiAJCWNvbnN0IHN0cnVjdCBhc205MjYwX2dhdGVfZGF0YSAqZ2QgPSAmYXNtOTI2MF9haGJfZ2F0ZXNbbl07CiAKLQkJY2xrc1tnZC0+aWR4XSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsIGdkLT5uYW1lLAorCQlod3NbZ2QtPmlkeF0gPSBjbGtfaHdfcmVnaXN0ZXJfZ2F0ZShOVUxMLCBnZC0+bmFtZSwKIAkJCQlnZC0+cGFyZW50X25hbWUsIGdkLT5mbGFncywgYmFzZSArIGdkLT5yZWcsCiAJCQkJZ2QtPmJpdF9pZHgsIDAsICZhc205MjYwX2Nsa19sb2NrKTsKIAl9CiAKIAkvKiBjaGVjayBmb3IgZXJyb3JzIG9uIGxlYWYgY2xvY2tzICovCiAJZm9yIChuID0gMDsgbiA8IE1BWF9DTEtTOyBuKyspIHsKLQkJaWYgKCFJU19FUlIoY2xrc1tuXSkpCisJCWlmICghSVNfRVJSKGh3c1tuXSkpCiAJCQljb250aW51ZTsKIAogCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gcmVnaXN0ZXIgbGVhZiBjbG9jayAlZFxuIiwKQEAgLTMzNyw5ICszNDQsNyBAQAogCX0KIAogCS8qIHJlZ2lzdGVyIGNsay1wcm92aWRlciAqLwotCWNsa19kYXRhLmNsa3MgPSBjbGtzOwotCWNsa19kYXRhLmNsa19udW0gPSBNQVhfQ0xLUzsKLQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX29uZWNlbGxfZ2V0LCAmY2xrX2RhdGEpOworCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobnAsIG9mX2Nsa19od19vbmVjZWxsX2dldCwgY2xrX2RhdGEpOwogCXJldHVybjsKIGZhaWw6CiAJaW91bm1hcChiYXNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1heGktY2xrZ2VuLmMgYi9kcml2ZXJzL2Nsay9jbGstYXhpLWNsa2dlbi5jCmluZGV4IDMyOTRkYjMuLjVlOTE4ZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay1heGktY2xrZ2VuLmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLWF4aS1jbGtnZW4uYwpAQCAtMzkyLDggKzM5Miw4IEBACiAJY29uc3QgY2hhciAqcGFyZW50X25hbWVzWzJdOwogCWNvbnN0IGNoYXIgKmNsa19uYW1lOwogCXN0cnVjdCByZXNvdXJjZSAqbWVtOwotCXN0cnVjdCBjbGsgKmNsazsKIAl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0OwogCiAJaWYgKCFwZGV2LT5kZXYub2Zfbm9kZSkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC00MzMsMTIgKzQzMywxMiBAQAogCWF4aV9jbGtnZW5fbW1jbV9lbmFibGUoYXhpX2Nsa2dlbiwgZmFsc2UpOwogCiAJYXhpX2Nsa2dlbi0+Y2xrX2h3LmluaXQgPSAmaW5pdDsKLQljbGsgPSBkZXZtX2Nsa19yZWdpc3RlcigmcGRldi0+ZGV2LCAmYXhpX2Nsa2dlbi0+Y2xrX2h3KTsKLQlpZiAoSVNfRVJSKGNsaykpCi0JCXJldHVybiBQVFJfRVJSKGNsayk7CisJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmF4aV9jbGtnZW4tPmNsa19odyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAotCXJldHVybiBvZl9jbGtfYWRkX3Byb3ZpZGVyKHBkZXYtPmRldi5vZl9ub2RlLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsCi0JCQkJICAgIGNsayk7CisJcmV0dXJuIG9mX2Nsa19hZGRfaHdfcHJvdmlkZXIocGRldi0+ZGV2Lm9mX25vZGUsIG9mX2Nsa19od19zaW1wbGVfZ2V0LAorCQkJCSAgICAgICZheGlfY2xrZ2VuLT5jbGtfaHcpOwogfQogCiBzdGF0aWMgaW50IGF4aV9jbGtnZW5fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstYXhtNTUxNi5jIGIvZHJpdmVycy9jbGsvY2xrLWF4bTU1MTYuYwppbmRleCBjN2M5MWE1Li41ZDdhZTMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9jbGstYXhtNTUxNi5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay1heG01NTE2LmMKQEAgLTUxNiw2ICs1MTYsMTkgQEAKIAlbQVhYSUFfQ0xLX01NQ10gICAgICA9ICZjbGtfbW1jX211eC5hY2xrLAogfTsKIAorc3RhdGljIHN0cnVjdCBjbGtfaHcgKgorb2ZfY2xrX2F4bWNsa19nZXQoc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqY2xrc3BlYywgdm9pZCAqdW51c2VkKQoreworCXVuc2lnbmVkIGludCBpZHggPSBjbGtzcGVjLT5hcmdzWzBdOworCisJaWYgKGlkeCA+PSBBUlJBWV9TSVpFKGF4bWNsa19jbG9ja3MpKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgaW5kZXggJXVcbiIsIF9fZnVuY19fLCBpZHgpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwlyZXR1cm4gJmF4bWNsa19jbG9ja3NbaWR4XS0+aHc7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBheG1jbGtfcmVnbWFwX2NvbmZpZyA9IHsKIAkucmVnX2JpdHMJPSAzMiwKIAkucmVnX3N0cmlkZQk9IDQsCkBAIC01MzAsMjEgKzU0MywxNCBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGF4bWNsa19tYXRjaF90YWJsZSk7CiAKLXN0cnVjdCBheG1jbGtfcHJpdiB7Ci0Jc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgb25lY2VsbDsKLQlzdHJ1Y3QgY2xrICpjbGtzW107Ci19OwotCiBzdGF0aWMgaW50IGF4bWNsa19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXZvaWQgX19pb21lbSAqYmFzZTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlpbnQgaSwgcmV0OwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Ci0Jc3RydWN0IGNsayAqY2xrOwogCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKIAlzaXplX3QgbnVtX2Nsa3M7Ci0Jc3RydWN0IGF4bWNsa19wcml2ICpwcml2OwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAliYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKQEAgLTU1NywyOSArNTYzLDE4IEBACiAKIAludW1fY2xrcyA9IEFSUkFZX1NJWkUoYXhtY2xrX2Nsb2Nrcyk7CiAJcHJfaW5mbygiYXhtY2xrOiBzdXBwb3J0aW5nICV6dSBjbG9ja3NcbiIsIG51bV9jbGtzKTsKLQlwcml2ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwcml2KSArIHNpemVvZigqcHJpdi0+Y2xrcykgKiBudW1fY2xrcywKLQkJCSAgICBHRlBfS0VSTkVMKTsKLQlpZiAoIXByaXYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcHJpdi0+b25lY2VsbC5jbGtzID0gcHJpdi0+Y2xrczsKLQlwcml2LT5vbmVjZWxsLmNsa19udW0gPSBudW1fY2xrczsKIAogCS8qIFVwZGF0ZSBlYWNoIGVudHJ5IHdpdGggdGhlIGFsbG9jYXRlZCByZWdtYXAgYW5kIHJlZ2lzdGVyIHRoZSBjbG9jawogCSAqIHdpdGggdGhlIGNvbW1vbiBjbG9jayBmcmFtZXdvcmsKIAkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2Nsa3M7IGkrKykgewogCQlheG1jbGtfY2xvY2tzW2ldLT5yZWdtYXAgPSByZWdtYXA7Ci0JCWNsayA9IGRldm1fY2xrX3JlZ2lzdGVyKGRldiwgJmF4bWNsa19jbG9ja3NbaV0tPmh3KTsKLQkJaWYgKElTX0VSUihjbGspKQotCQkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKLQkJcHJpdi0+Y2xrc1tpXSA9IGNsazsKKwkJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoZGV2LCAmYXhtY2xrX2Nsb2Nrc1tpXS0+aHcpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBvZl9jbGtfYWRkX3Byb3ZpZGVyKGRldi0+b2Zfbm9kZSwKLQkJCQkgIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsICZwcml2LT5vbmVjZWxsKTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIG9mX2Nsa19hZGRfaHdfcHJvdmlkZXIoZGV2LT5vZl9ub2RlLCBvZl9jbGtfYXhtY2xrX2dldCwgTlVMTCk7CiB9CiAKIHN0YXRpYyBpbnQgYXhtY2xrX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLWNkY2U3MDYuYyBiL2RyaXZlcnMvY2xrL2Nsay1jZGNlNzA2LmMKaW5kZXggMDE4NzdmNi4uZjIxZDkwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLWNkY2U3MDYuYworKysgYi9kcml2ZXJzL2Nsay9jbGstY2RjZTcwNi5jCkBAIC03MSw3ICs3MSw2IEBACiAJc3RydWN0IGNkY2U3MDZfZGV2X2RhdGEgKmRldl9kYXRhOwogCXVuc2lnbmVkIGlkeDsKIAl1bnNpZ25lZCBwYXJlbnQ7Ci0Jc3RydWN0IGNsayAqY2xrOwogCXN0cnVjdCBjbGtfaHcgaHc7CiAJdW5zaWduZWQgZGl2OwogCXVuc2lnbmVkIG11bDsKQEAgLTgxLDggKzgwLDYgQEAKIHN0cnVjdCBjZGNlNzA2X2Rldl9kYXRhIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKLQlzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSBvbmVjZWxsOwotCXN0cnVjdCBjbGsgKmNsa3NbNl07CiAJc3RydWN0IGNsayAqY2xraW5fY2xrWzJdOwogCWNvbnN0IGNoYXIgKmNsa2luX25hbWVbMl07CiAJc3RydWN0IGNkY2U3MDZfaHdfZGF0YSBjbGtpblsxXTsKQEAgLTQ1NSwxOCArNDUyLDE5IEBACiAJCQkgICAgICAgc3RydWN0IGNsa19pbml0X2RhdGEgKmluaXQpCiB7CiAJdW5zaWduZWQgaTsKKwlpbnQgcmV0OwogCiAJZm9yIChpID0gMDsgaSA8IG51bV9odzsgKytpLCArK2h3KSB7CiAJCWluaXQtPm5hbWUgPSBjbGtfbmFtZXNbaV07CiAJCWh3LT5kZXZfZGF0YSA9IGNkY2U7CiAJCWh3LT5pZHggPSBpOwogCQlody0+aHcuaW5pdCA9IGluaXQ7Ci0JCWh3LT5jbGsgPSBkZXZtX2Nsa19yZWdpc3RlcigmY2RjZS0+Y2xpZW50LT5kZXYsCisJCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKCZjZGNlLT5jbGllbnQtPmRldiwKIAkJCQkJICAgICZody0+aHcpOwotCQlpZiAoSVNfRVJSKGh3LT5jbGspKSB7CisJCWlmIChyZXQpIHsKIAkJCWRldl9lcnIoJmNkY2UtPmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyICVzXG4iLAogCQkJCWNsa19uYW1lc1tpXSk7Ci0JCQlyZXR1cm4gUFRSX0VSUihody0+Y2xrKTsKKwkJCXJldHVybiByZXQ7CiAJCX0KIAl9CiAJcmV0dXJuIDA7CkBAIC02MTMsMTMgKzYxMSwyMyBAQAogCQkJY2RjZS0+Y2xrb3V0W2ldLnBhcmVudCk7CiAJfQogCi0JcmV0ID0gY2RjZTcwNl9yZWdpc3Rlcl9odyhjZGNlLCBjZGNlLT5jbGtvdXQsCi0JCQkJICBBUlJBWV9TSVpFKGNkY2UtPmNsa291dCksCi0JCQkJICBjZGNlNzA2X2Nsa291dF9uYW1lLCAmaW5pdCk7Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2RjZS0+Y2xrb3V0KTsgKytpKQotCQljZGNlLT5jbGtzW2ldID0gY2RjZS0+Y2xrb3V0W2ldLmNsazsKKwlyZXR1cm4gY2RjZTcwNl9yZWdpc3Rlcl9odyhjZGNlLCBjZGNlLT5jbGtvdXQsCisJCQkJICAgQVJSQVlfU0laRShjZGNlLT5jbGtvdXQpLAorCQkJCSAgIGNkY2U3MDZfY2xrb3V0X25hbWUsICZpbml0KTsKK30KIAotCXJldHVybiByZXQ7CitzdGF0aWMgc3RydWN0IGNsa19odyAqCitvZl9jbGtfY2RjZV9nZXQoc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqY2xrc3BlYywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY2RjZTcwNl9kZXZfZGF0YSAqY2RjZSA9IGRhdGE7CisJdW5zaWduZWQgaW50IGlkeCA9IGNsa3NwZWMtPmFyZ3NbMF07CisKKwlpZiAoaWR4ID49IEFSUkFZX1NJWkUoY2RjZS0+Y2xrb3V0KSkgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGluZGV4ICV1XG4iLCBfX2Z1bmNfXywgaWR4KTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJcmV0dXJuICZjZGNlLT5jbGtvdXRbaWR4XS5odzsKIH0KIAogc3RhdGljIGludCBjZGNlNzA2X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCkBAIC02NTcsMTIgKzY2NSw4IEBACiAJcmV0ID0gY2RjZTcwNl9yZWdpc3Rlcl9jbGtvdXRzKGNkY2UpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwotCWNkY2UtPm9uZWNlbGwuY2xrcyA9IGNkY2UtPmNsa3M7Ci0JY2RjZS0+b25lY2VsbC5jbGtfbnVtID0gQVJSQVlfU0laRShjZGNlLT5jbGtzKTsKLQlyZXQgPSBvZl9jbGtfYWRkX3Byb3ZpZGVyKGNsaWVudC0+ZGV2Lm9mX25vZGUsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsCi0JCQkJICAmY2RjZS0+b25lY2VsbCk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiBvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKGNsaWVudC0+ZGV2Lm9mX25vZGUsIG9mX2Nsa19jZGNlX2dldCwKKwkJCQkgICAgICBjZGNlKTsKIH0KIAogc3RhdGljIGludCBjZGNlNzA2X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLWNkY2U5MjUuYyBiL2RyaXZlcnMvY2xrL2Nsay1jZGNlOTI1LmMKaW5kZXggMDg5YmY4OC4uYjg0NTljMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLWNkY2U5MjUuYworKysgYi9kcml2ZXJzL2Nsay9jbGstY2RjZTkyNS5jCkBAIC02Miw4ICs2Miw2IEBACiAJc3RydWN0IGkyY19jbGllbnQgKmkyY19jbGllbnQ7CiAJc3RydWN0IGNsa19jZGNlOTI1X3BsbCBwbGxbTlVNQkVSX09GX1BMTFNdOwogCXN0cnVjdCBjbGtfY2RjZTkyNV9vdXRwdXQgY2xrW05VTUJFUl9PRl9PVVRQVVRTXTsKLQlzdHJ1Y3QgY2xrICpkdF9jbGtbTlVNQkVSX09GX09VVFBVVFNdOwotCXN0cnVjdCBjbGtfb25lY2VsbF9kYXRhIG9uZWNlbGw7CiB9OwogCiAvKiAqKiAqKiAqKiAqKiAqKiAqKiAqKiAqKiAqKiAqKiAqKiAqKiAqKiAqKiAqKiAqKiAqKiAqKiAqKiAqKiAqKiAqKiAqLwpAQCAtNTU3LDYgKzU1NSwyMCBAQAogCQlyZXR1cm4gLUVJTzsKIH0KIAorc3RhdGljIHN0cnVjdCBjbGtfaHcgKgorb2ZfY2xrX2NkY2U5MjVfZ2V0KHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmNsa3NwZWMsIHZvaWQgKl9kYXRhKQoreworCXN0cnVjdCBjbGtfY2RjZTkyNV9jaGlwICpkYXRhID0gX2RhdGE7CisJdW5zaWduZWQgaW50IGlkeCA9IGNsa3NwZWMtPmFyZ3NbMF07CisKKwlpZiAoaWR4ID49IEFSUkFZX1NJWkUoZGF0YS0+Y2xrKSkgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGluZGV4ICV1XG4iLCBfX2Z1bmNfXywgaWR4KTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJcmV0dXJuICZkYXRhLT5jbGtbaWR4XS5odzsKK30KKwogLyogVGhlIENEQ0U5MjUgdXNlcyBhIGZ1bmt5IHdheSB0byByZWFkL3dyaXRlIHJlZ2lzdGVycy4gQnVsayBtb2RlIGlzCiAgKiBqdXN0IHdlaXJkLCBzbyBqdXN0IHVzZSB0aGUgc2luZ2xlIGJ5dGUgbW9kZSBleGNsdXNpdmVseS4gKi8KIHN0YXRpYyBzdHJ1Y3QgcmVnbWFwX2J1cyByZWdtYXBfY2RjZTkyNV9idXMgPSB7CkBAIC01NzIsNyArNTg0LDYgQEAKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZTsKIAljb25zdCBjaGFyICpwbGxfY2xrX25hbWVbTlVNQkVSX09GX1BMTFNdID0ge05VTEwsfTsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OwotCXN0cnVjdCBjbGsgKmNsazsKIAl1MzIgdmFsdWU7CiAJaW50IGk7CiAJaW50IGVycjsKQEAgLTYyMiwxMCArNjMzLDkgQEAKIAkJZGF0YS0+cGxsW2ldLmNoaXAgPSBkYXRhOwogCQlkYXRhLT5wbGxbaV0uaHcuaW5pdCA9ICZpbml0OwogCQlkYXRhLT5wbGxbaV0uaW5kZXggPSBpOwotCQljbGsgPSBkZXZtX2Nsa19yZWdpc3RlcigmY2xpZW50LT5kZXYsICZkYXRhLT5wbGxbaV0uaHcpOwotCQlpZiAoSVNfRVJSKGNsaykpIHsKKwkJZXJyID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmZGF0YS0+cGxsW2ldLmh3KTsKKwkJaWYgKGVycikgewogCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgcmVnaXN0ZXIgUExMICVkXG4iLCBpKTsKLQkJCWVyciA9IFBUUl9FUlIoY2xrKTsKIAkJCWdvdG8gZXJyb3I7CiAJCX0KIAkJc3ByaW50ZihjaGlsZF9uYW1lLCAiUExMJWQiLCBpKzEpOwpAQCAtNjM0LDcgKzY0NCw3IEBACiAJCQljb250aW51ZTsKIAkJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihucF9vdXRwdXQsCiAJCQkiY2xvY2stZnJlcXVlbmN5IiwgJnZhbHVlKSkgewotCQkJZXJyID0gY2xrX3NldF9yYXRlKGNsaywgdmFsdWUpOworCQkJZXJyID0gY2xrX3NldF9yYXRlKGRhdGEtPnBsbFtpXS5ody5jbGssIHZhbHVlKTsKIAkJCWlmIChlcnIpCiAJCQkJZGV2X2VycigmY2xpZW50LT5kZXYsCiAJCQkJCSJ1bmFibGUgdG8gc2V0IFBMTCBmcmVxdWVuY3kgJXVkXG4iLApAQCAtNjYzLDE0ICs2NzMsMTIgQEAKIAlkYXRhLT5jbGtbMF0uaHcuaW5pdCA9ICZpbml0OwogCWRhdGEtPmNsa1swXS5pbmRleCA9IDA7CiAJZGF0YS0+Y2xrWzBdLnBkaXYgPSAxOwotCWNsayA9IGRldm1fY2xrX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmRhdGEtPmNsa1swXS5odyk7CisJZXJyID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmZGF0YS0+Y2xrWzBdLmh3KTsKIAlrZnJlZShpbml0Lm5hbWUpOyAvKiBjbG9jayBmcmFtZXdvcmsgbWFkZSBhIGNvcHkgb2YgdGhlIG5hbWUgKi8KLQlpZiAoSVNfRVJSKGNsaykpIHsKKwlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiY2xvY2sgcmVnaXN0cmF0aW9uIFkxIGZhaWxlZFxuIik7Ci0JCWVyciA9IFBUUl9FUlIoY2xrKTsKIAkJZ290byBlcnJvcjsKIAl9Ci0JZGF0YS0+ZHRfY2xrWzBdID0gY2xrOwogCiAJLyogUmVnaXN0ZXIgb3V0cHV0IGNsb2NrcyBZMiAuLiBZNSovCiAJaW5pdC5vcHMgPSAmY2RjZTkyNV9jbGtfb3BzOwpAQCAtNjk1LDIxICs3MDMsMTcgQEAKIAkJCWluaXQucGFyZW50X25hbWVzID0gJnBsbF9jbGtfbmFtZVsxXTsKIAkJCWJyZWFrOwogCQl9Ci0JCWNsayA9IGRldm1fY2xrX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmRhdGEtPmNsa1tpXS5odyk7CisJCWVyciA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmRhdGEtPmNsa1tpXS5odyk7CiAJCWtmcmVlKGluaXQubmFtZSk7IC8qIGNsb2NrIGZyYW1ld29yayBtYWRlIGEgY29weSBvZiB0aGUgbmFtZSAqLwotCQlpZiAoSVNfRVJSKGNsaykpIHsKKwkJaWYgKGVycikgewogCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJjbG9jayByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKLQkJCWVyciA9IFBUUl9FUlIoY2xrKTsKIAkJCWdvdG8gZXJyb3I7CiAJCX0KLQkJZGF0YS0+ZHRfY2xrW2ldID0gY2xrOwogCX0KIAogCS8qIFJlZ2lzdGVyIHRoZSBvdXRwdXQgY2xvY2tzICovCi0JZGF0YS0+b25lY2VsbC5jbGtfbnVtID0gTlVNQkVSX09GX09VVFBVVFM7Ci0JZGF0YS0+b25lY2VsbC5jbGtzID0gZGF0YS0+ZHRfY2xrOwotCWVyciA9IG9mX2Nsa19hZGRfcHJvdmlkZXIoY2xpZW50LT5kZXYub2Zfbm9kZSwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwKLQkJJmRhdGEtPm9uZWNlbGwpOworCWVyciA9IG9mX2Nsa19hZGRfaHdfcHJvdmlkZXIoY2xpZW50LT5kZXYub2Zfbm9kZSwgb2ZfY2xrX2NkY2U5MjVfZ2V0LAorCQkJCSAgZGF0YSk7CiAJaWYgKGVycikKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ1bmFibGUgdG8gYWRkIE9GIGNsb2NrIHByb3ZpZGVyXG4iKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLWNscHM3MTF4LmMgYi9kcml2ZXJzL2Nsay9jbGstY2xwczcxMXguYwppbmRleCBhZGFmMTA5Li45MTkzZjY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9jbGstY2xwczcxMXguYworKysgYi9kcml2ZXJzL2Nsay9jbGstY2xwczcxMXguYwpAQCAtNDAsOSArNDAsOCBAQAogfTsKIAogc3RydWN0IGNscHM3MTF4X2NsayB7Ci0Jc3RydWN0IGNsa19vbmVjZWxsX2RhdGEJY2xrX2RhdGE7Ci0Jc3BpbmxvY2tfdAkJbG9jazsKLQlzdHJ1Y3QgY2xrCQkqY2xrc1tDTFBTNzExWF9DTEtfTUFYXTsKKwlzcGlubG9ja190CQkJbG9jazsKKwlzdHJ1Y3QgY2xrX2h3X29uZWNlbGxfZGF0YQljbGtfZGF0YTsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xwczcxMXhfY2xrICogX19pbml0IF9jbHBzNzExeF9jbGtfaW5pdCh2b2lkIF9faW9tZW0gKmJhc2UsCkBAIC01NSw3ICs1NCw5IEBACiAJaWYgKCFiYXNlKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCWNscHM3MTF4X2NsayA9IGt6YWxsb2Moc2l6ZW9mKCpjbHBzNzExeF9jbGspLCBHRlBfS0VSTkVMKTsKKwljbHBzNzExeF9jbGsgPSBremFsbG9jKHNpemVvZigqY2xwczcxMXhfY2xrKSArCisJCQlzaXplb2YoKmNscHM3MTF4X2Nsay0+Y2xrX2RhdGEuaHdzKSAqIENMUFM3MTFYX0NMS19NQVgsCisJCQlHRlBfS0VSTkVMKTsKIAlpZiAoIWNscHM3MTF4X2NsaykKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKQEAgLTEwNiw0MCArMTA3LDQwIEBACiAJdG1wIHw9IFNZU0NPTjFfVEMyTSB8IFNZU0NPTjFfVEMyUzsKIAl3cml0ZWwodG1wLCBiYXNlICsgQ0xQUzcxMVhfU1lTQ09OMSk7CiAKLQljbHBzNzExeF9jbGstPmNsa3NbQ0xQUzcxMVhfQ0xLX0RVTU1ZXSA9Ci0JCWNsa19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJkdW1teSIsIE5VTEwsIDAsIDApOwotCWNscHM3MTF4X2Nsay0+Y2xrc1tDTFBTNzExWF9DTEtfQ1BVXSA9Ci0JCWNsa19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJjcHUiLCBOVUxMLCAwLCBmX2NwdSk7Ci0JY2xwczcxMXhfY2xrLT5jbGtzW0NMUFM3MTFYX0NMS19CVVNdID0KLQkJY2xrX3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgImJ1cyIsIE5VTEwsIDAsIGZfYnVzKTsKLQljbHBzNzExeF9jbGstPmNsa3NbQ0xQUzcxMVhfQ0xLX1BMTF0gPQotCQljbGtfcmVnaXN0ZXJfZml4ZWRfcmF0ZShOVUxMLCAicGxsIiwgTlVMTCwgMCwgZl9wbGwpOwotCWNscHM3MTF4X2Nsay0+Y2xrc1tDTFBTNzExWF9DTEtfVElNRVJSRUZdID0KLQkJY2xrX3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgInRpbWVyX3JlZiIsIE5VTEwsIDAsIGZfdGltKTsKLQljbHBzNzExeF9jbGstPmNsa3NbQ0xQUzcxMVhfQ0xLX1RJTUVSMV0gPQotCQljbGtfcmVnaXN0ZXJfZGl2aWRlcl90YWJsZShOVUxMLCAidGltZXIxIiwgInRpbWVyX3JlZiIsIDAsCisJY2xwczcxMXhfY2xrLT5jbGtfZGF0YS5od3NbQ0xQUzcxMVhfQ0xLX0RVTU1ZXSA9CisJCWNsa19od19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJkdW1teSIsIE5VTEwsIDAsIDApOworCWNscHM3MTF4X2Nsay0+Y2xrX2RhdGEuaHdzW0NMUFM3MTFYX0NMS19DUFVdID0KKwkJY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgImNwdSIsIE5VTEwsIDAsIGZfY3B1KTsKKwljbHBzNzExeF9jbGstPmNsa19kYXRhLmh3c1tDTFBTNzExWF9DTEtfQlVTXSA9CisJCWNsa19od19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJidXMiLCBOVUxMLCAwLCBmX2J1cyk7CisJY2xwczcxMXhfY2xrLT5jbGtfZGF0YS5od3NbQ0xQUzcxMVhfQ0xLX1BMTF0gPQorCQljbGtfaHdfcmVnaXN0ZXJfZml4ZWRfcmF0ZShOVUxMLCAicGxsIiwgTlVMTCwgMCwgZl9wbGwpOworCWNscHM3MTF4X2Nsay0+Y2xrX2RhdGEuaHdzW0NMUFM3MTFYX0NMS19USU1FUlJFRl0gPQorCQljbGtfaHdfcmVnaXN0ZXJfZml4ZWRfcmF0ZShOVUxMLCAidGltZXJfcmVmIiwgTlVMTCwgMCwgZl90aW0pOworCWNscHM3MTF4X2Nsay0+Y2xrX2RhdGEuaHdzW0NMUFM3MTFYX0NMS19USU1FUjFdID0KKwkJY2xrX2h3X3JlZ2lzdGVyX2RpdmlkZXJfdGFibGUoTlVMTCwgInRpbWVyMSIsICJ0aW1lcl9yZWYiLCAwLAogCQkJCQkgICBiYXNlICsgQ0xQUzcxMVhfU1lTQ09OMSwgNSwgMSwgMCwKIAkJCQkJICAgdGltZXJfZGl2X3RhYmxlLCAmY2xwczcxMXhfY2xrLT5sb2NrKTsKLQljbHBzNzExeF9jbGstPmNsa3NbQ0xQUzcxMVhfQ0xLX1RJTUVSMl0gPQotCQljbGtfcmVnaXN0ZXJfZGl2aWRlcl90YWJsZShOVUxMLCAidGltZXIyIiwgInRpbWVyX3JlZiIsIDAsCisJY2xwczcxMXhfY2xrLT5jbGtfZGF0YS5od3NbQ0xQUzcxMVhfQ0xLX1RJTUVSMl0gPQorCQljbGtfaHdfcmVnaXN0ZXJfZGl2aWRlcl90YWJsZShOVUxMLCAidGltZXIyIiwgInRpbWVyX3JlZiIsIDAsCiAJCQkJCSAgIGJhc2UgKyBDTFBTNzExWF9TWVNDT04xLCA3LCAxLCAwLAogCQkJCQkgICB0aW1lcl9kaXZfdGFibGUsICZjbHBzNzExeF9jbGstPmxvY2spOwotCWNscHM3MTF4X2Nsay0+Y2xrc1tDTFBTNzExWF9DTEtfUFdNXSA9Ci0JCWNsa19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJwd20iLCBOVUxMLCAwLCBmX3B3bSk7Ci0JY2xwczcxMXhfY2xrLT5jbGtzW0NMUFM3MTFYX0NMS19TUElSRUZdID0KLQkJY2xrX3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgInNwaV9yZWYiLCBOVUxMLCAwLCBmX3NwaSk7Ci0JY2xwczcxMXhfY2xrLT5jbGtzW0NMUFM3MTFYX0NMS19TUEldID0KLQkJY2xrX3JlZ2lzdGVyX2RpdmlkZXJfdGFibGUoTlVMTCwgInNwaSIsICJzcGlfcmVmIiwgMCwKKwljbHBzNzExeF9jbGstPmNsa19kYXRhLmh3c1tDTFBTNzExWF9DTEtfUFdNXSA9CisJCWNsa19od19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJwd20iLCBOVUxMLCAwLCBmX3B3bSk7CisJY2xwczcxMXhfY2xrLT5jbGtfZGF0YS5od3NbQ0xQUzcxMVhfQ0xLX1NQSVJFRl0gPQorCQljbGtfaHdfcmVnaXN0ZXJfZml4ZWRfcmF0ZShOVUxMLCAic3BpX3JlZiIsIE5VTEwsIDAsIGZfc3BpKTsKKwljbHBzNzExeF9jbGstPmNsa19kYXRhLmh3c1tDTFBTNzExWF9DTEtfU1BJXSA9CisJCWNsa19od19yZWdpc3Rlcl9kaXZpZGVyX3RhYmxlKE5VTEwsICJzcGkiLCAic3BpX3JlZiIsIDAsCiAJCQkJCSAgIGJhc2UgKyBDTFBTNzExWF9TWVNDT04xLCAxNiwgMiwgMCwKIAkJCQkJICAgc3BpX2Rpdl90YWJsZSwgJmNscHM3MTF4X2Nsay0+bG9jayk7Ci0JY2xwczcxMXhfY2xrLT5jbGtzW0NMUFM3MTFYX0NMS19VQVJUXSA9Ci0JCWNsa19yZWdpc3Rlcl9maXhlZF9mYWN0b3IoTlVMTCwgInVhcnQiLCAiYnVzIiwgMCwgMSwgMTApOwotCWNscHM3MTF4X2Nsay0+Y2xrc1tDTFBTNzExWF9DTEtfVElDS10gPQotCQljbGtfcmVnaXN0ZXJfZml4ZWRfcmF0ZShOVUxMLCAidGljayIsIE5VTEwsIDAsIDY0KTsKKwljbHBzNzExeF9jbGstPmNsa19kYXRhLmh3c1tDTFBTNzExWF9DTEtfVUFSVF0gPQorCQljbGtfaHdfcmVnaXN0ZXJfZml4ZWRfZmFjdG9yKE5VTEwsICJ1YXJ0IiwgImJ1cyIsIDAsIDEsIDEwKTsKKwljbHBzNzExeF9jbGstPmNsa19kYXRhLmh3c1tDTFBTNzExWF9DTEtfVElDS10gPQorCQljbGtfaHdfcmVnaXN0ZXJfZml4ZWRfcmF0ZShOVUxMLCAidGljayIsIE5VTEwsIDAsIDY0KTsKIAlmb3IgKGkgPSAwOyBpIDwgQ0xQUzcxMVhfQ0xLX01BWDsgaSsrKQotCQlpZiAoSVNfRVJSKGNscHM3MTF4X2Nsay0+Y2xrc1tpXSkpCisJCWlmIChJU19FUlIoY2xwczcxMXhfY2xrLT5jbGtfZGF0YS5od3NbaV0pKQogCQkJcHJfZXJyKCJjbGsgJWk6IHJlZ2lzdGVyIGZhaWxlZCB3aXRoICVsZFxuIiwKLQkJCSAgICAgICBpLCBQVFJfRVJSKGNscHM3MTF4X2Nsay0+Y2xrc1tpXSkpOworCQkJICAgICAgIGksIFBUUl9FUlIoY2xwczcxMXhfY2xrLT5jbGtfZGF0YS5od3NbaV0pKTsKIAogCXJldHVybiBjbHBzNzExeF9jbGs7CiB9CkBAIC0xNTMsMTcgKzE1NCwxNyBAQAogCUJVR19PTihJU19FUlIoY2xwczcxMXhfY2xrKSk7CiAKIAkvKiBDbG9ja3NvdXJjZSAqLwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xwczcxMXhfY2xrLT5jbGtzW0NMUFM3MTFYX0NMS19USU1FUjFdLAorCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoY2xwczcxMXhfY2xrLT5jbGtfZGF0YS5od3NbQ0xQUzcxMVhfQ0xLX1RJTUVSMV0sCiAJCQkgICAgTlVMTCwgImNscHM3MTF4LXRpbWVyLjAiKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNscHM3MTF4X2Nsay0+Y2xrc1tDTFBTNzExWF9DTEtfVElNRVIyXSwKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGNscHM3MTF4X2Nsay0+Y2xrX2RhdGEuaHdzW0NMUFM3MTFYX0NMS19USU1FUjJdLAogCQkJICAgIE5VTEwsICJjbHBzNzExeC10aW1lci4xIik7CiAKIAkvKiBEcml2ZXJzICovCi0JY2xrX3JlZ2lzdGVyX2Nsa2RldihjbHBzNzExeF9jbGstPmNsa3NbQ0xQUzcxMVhfQ0xLX1BXTV0sCisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihjbHBzNzExeF9jbGstPmNsa19kYXRhLmh3c1tDTFBTNzExWF9DTEtfUFdNXSwKIAkJCSAgICBOVUxMLCAiY2xwczcxMXgtcHdtIik7Ci0JY2xrX3JlZ2lzdGVyX2Nsa2RldihjbHBzNzExeF9jbGstPmNsa3NbQ0xQUzcxMVhfQ0xLX1VBUlRdLAorCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoY2xwczcxMXhfY2xrLT5jbGtfZGF0YS5od3NbQ0xQUzcxMVhfQ0xLX1VBUlRdLAogCQkJICAgIE5VTEwsICJjbHBzNzExeC11YXJ0LjAiKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNscHM3MTF4X2Nsay0+Y2xrc1tDTFBTNzExWF9DTEtfVUFSVF0sCisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihjbHBzNzExeF9jbGstPmNsa19kYXRhLmh3c1tDTFBTNzExWF9DTEtfVUFSVF0sCiAJCQkgICAgTlVMTCwgImNscHM3MTF4LXVhcnQuMSIpOwogfQogCkBAIC0xNzksMTAgKzE4MCw5IEBACiAJY2xwczcxMXhfY2xrID0gX2NscHM3MTF4X2Nsa19pbml0KGJhc2UsIGZyZWYpOwogCUJVR19PTihJU19FUlIoY2xwczcxMXhfY2xrKSk7CiAKLQljbHBzNzExeF9jbGstPmNsa19kYXRhLmNsa3MgPSBjbHBzNzExeF9jbGstPmNsa3M7Ci0JY2xwczcxMXhfY2xrLT5jbGtfZGF0YS5jbGtfbnVtID0gQ0xQUzcxMVhfQ0xLX01BWDsKLQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX29uZWNlbGxfZ2V0LAotCQkJICAgICZjbHBzNzExeF9jbGstPmNsa19kYXRhKTsKKwljbHBzNzExeF9jbGstPmNsa19kYXRhLm51bSA9IENMUFM3MTFYX0NMS19NQVg7CisJb2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X29uZWNlbGxfZ2V0LAorCQkJICAgICAgICZjbHBzNzExeF9jbGstPmNsa19kYXRhKTsKIH0KIENMS19PRl9ERUNMQVJFKGNscHM3MTF4LCAiY2lycnVzLGVwNzIwOS1jbGsiLCBjbHBzNzExeF9jbGtfaW5pdF9kdCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1jczIwMDAtY3AuYyBiL2RyaXZlcnMvY2xrL2Nsay1jczIwMDAtY3AuYwppbmRleCA3Mzc5ZGU4Li4wMjFmM2RhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9jbGstY3MyMDAwLWNwLmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLWNzMjAwMC1jcC5jCkBAIC01OSw3ICs1OSw2IEBACiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKIAlzdHJ1Y3QgY2xrICpjbGtfaW47CiAJc3RydWN0IGNsayAqcmVmX2NsazsKLQlzdHJ1Y3QgY2xrICpjbGtfb3V0OwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgY3MyMDAwX29mX21hdGNoW10gPSB7CkBAIC0zNzEsNyArMzcwLDYgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CiAJY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOwotCXN0cnVjdCBjbGsgKmNsazsKIAlzdGF0aWMgY29uc3QgY2hhciAqcGFyZW50X25hbWVzW0NMS19NQVhdOwogCWludCBjaCA9IDA7IC8qIGl0IHVzZXMgY2gwIG9ubHkgYXQgdGhpcyBwb2ludCAqLwogCWludCByYXRlOwpAQCAtNDAwLDE4ICszOTgsMTYgQEAKIAogCXByaXYtPmh3LmluaXQgPSAmaW5pdDsKIAotCWNsayA9IGNsa19yZWdpc3RlcihkZXYsICZwcml2LT5odyk7Ci0JaWYgKElTX0VSUihjbGspKQotCQlyZXR1cm4gUFRSX0VSUihjbGspOworCXJldCA9IGNsa19od19yZWdpc3RlcihkZXYsICZwcml2LT5odyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAotCXJldCA9IG9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKKwlyZXQgPSBvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgJnByaXYtPmh3KTsKIAlpZiAocmV0IDwgMCkgewotCQljbGtfdW5yZWdpc3RlcihjbGspOworCQljbGtfaHdfdW5yZWdpc3RlcigmcHJpdi0+aHcpOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCXByaXYtPmNsa19vdXQgPSBjbGs7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNDU0LDcgKzQ1MCw3IEBACiAKIAlvZl9jbGtfZGVsX3Byb3ZpZGVyKG5wKTsKIAotCWNsa191bnJlZ2lzdGVyKHByaXYtPmNsa19vdXQpOworCWNsa19od191bnJlZ2lzdGVyKCZwcml2LT5odyk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1kaXZpZGVyLmMgYi9kcml2ZXJzL2Nsay9jbGstZGl2aWRlci5jCmluZGV4IGEwZjU1YmMuLjk2Mzg2ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay1kaXZpZGVyLmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLWRpdmlkZXIuYwpAQCAtMzUyLDcgKzM1Miw3IEBACiAKIAkvKiBpZiByZWFkIG9ubHksIGp1c3QgcmV0dXJuIGN1cnJlbnQgdmFsdWUgKi8KIAlpZiAoZGl2aWRlci0+ZmxhZ3MgJiBDTEtfRElWSURFUl9SRUFEX09OTFkpIHsKLQkJYmVzdGRpdiA9IHJlYWRsKGRpdmlkZXItPnJlZykgPj4gZGl2aWRlci0+c2hpZnQ7CisJCWJlc3RkaXYgPSBjbGtfcmVhZGwoZGl2aWRlci0+cmVnKSA+PiBkaXZpZGVyLT5zaGlmdDsKIAkJYmVzdGRpdiAmPSBkaXZfbWFzayhkaXZpZGVyLT53aWR0aCk7CiAJCWJlc3RkaXYgPSBfZ2V0X2RpdihkaXZpZGVyLT50YWJsZSwgYmVzdGRpdiwgZGl2aWRlci0+ZmxhZ3MsCiAJCQlkaXZpZGVyLT53aWR0aCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstZWZtMzJnZy5jIGIvZHJpdmVycy9jbGsvY2xrLWVmbTMyZ2cuYwppbmRleCAyMmU0YzY1Li44ODAyYTJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9jbGstZWZtMzJnZy5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay1lZm0zMmdnLmMKQEAgLTEwLDI0ICsxMCwzMSBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL2VmbTMyLWNtdS5oPgogCiAjZGVmaW5lIENNVV9IRlBFUkNMS0VOMAkJMHg0NAorI2RlZmluZSBDTVVfTUFYX0NMS1MJCTM3CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICpjbGtbMzddOwotc3RhdGljIHN0cnVjdCBjbGtfb25lY2VsbF9kYXRhIGNsa19kYXRhID0gewotCS5jbGtzID0gY2xrLAotCS5jbGtfbnVtID0gQVJSQVlfU0laRShjbGspLAotfTsKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3X29uZWNlbGxfZGF0YSAqY2xrX2RhdGE7CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBlZm0zMmdnX2NtdV9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7CiAJaW50IGk7CiAJdm9pZCBfX2lvbWVtICpiYXNlOworCXN0cnVjdCBjbGtfaHcgKipod3M7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjbGspOyArK2kpCi0JCWNsa1tpXSA9IEVSUl9QVFIoLUVOT0VOVCk7CisJY2xrX2RhdGEgPSBremFsbG9jKHNpemVvZigqY2xrX2RhdGEpICsKKwkJCSAgIHNpemVvZigqY2xrX2RhdGEtPmh3cykgKiBDTVVfTUFYX0NMS1MsIEdGUF9LRVJORUwpOworCisJaWYgKCFjbGtfZGF0YSkKKwkJcmV0dXJuOworCisJaHdzID0gY2xrX2RhdGEtPmh3czsKKworCWZvciAoaSA9IDA7IGkgPCBDTVVfTUFYX0NMS1M7ICsraSkKKwkJaHdzW2ldID0gRVJSX1BUUigtRU5PRU5UKTsKIAogCWJhc2UgPSBvZl9pb21hcChucCwgMCk7CiAJaWYgKCFiYXNlKSB7CkBAIC0zNSw0NiArNDIsNDYgQEAKIAkJcmV0dXJuOwogCX0KIAotCWNsa1tjbGtfSEZYT10gPSBjbGtfcmVnaXN0ZXJfZml4ZWRfcmF0ZShOVUxMLCAiSEZYTyIsIE5VTEwsCi0JCQkwLCA0ODAwMDAwMCk7CisJaHdzW2Nsa19IRlhPXSA9IGNsa19od19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJIRlhPIiwgTlVMTCwgMCwKKwkJCQkJCSAgIDQ4MDAwMDAwKTsKIAotCWNsa1tjbGtfSEZQRVJDTEtVU0FSVDBdID0gY2xrX3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLlVTQVJUMCIsCisJaHdzW2Nsa19IRlBFUkNMS1VTQVJUMF0gPSBjbGtfaHdfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuVVNBUlQwIiwKIAkJCSJIRlhPIiwgMCwgYmFzZSArIENNVV9IRlBFUkNMS0VOMCwgMCwgMCwgTlVMTCk7Ci0JY2xrW2Nsa19IRlBFUkNMS1VTQVJUMV0gPSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuVVNBUlQxIiwKKwlod3NbY2xrX0hGUEVSQ0xLVVNBUlQxXSA9IGNsa19od19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5VU0FSVDEiLAogCQkJIkhGWE8iLCAwLCBiYXNlICsgQ01VX0hGUEVSQ0xLRU4wLCAxLCAwLCBOVUxMKTsKLQljbGtbY2xrX0hGUEVSQ0xLVVNBUlQyXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5VU0FSVDIiLAorCWh3c1tjbGtfSEZQRVJDTEtVU0FSVDJdID0gY2xrX2h3X3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLlVTQVJUMiIsCiAJCQkiSEZYTyIsIDAsIGJhc2UgKyBDTVVfSEZQRVJDTEtFTjAsIDIsIDAsIE5VTEwpOwotCWNsa1tjbGtfSEZQRVJDTEtVQVJUMF0gPSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuVUFSVDAiLAorCWh3c1tjbGtfSEZQRVJDTEtVQVJUMF0gPSBjbGtfaHdfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuVUFSVDAiLAogCQkJIkhGWE8iLCAwLCBiYXNlICsgQ01VX0hGUEVSQ0xLRU4wLCAzLCAwLCBOVUxMKTsKLQljbGtbY2xrX0hGUEVSQ0xLVUFSVDFdID0gY2xrX3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLlVBUlQxIiwKKwlod3NbY2xrX0hGUEVSQ0xLVUFSVDFdID0gY2xrX2h3X3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLlVBUlQxIiwKIAkJCSJIRlhPIiwgMCwgYmFzZSArIENNVV9IRlBFUkNMS0VOMCwgNCwgMCwgTlVMTCk7Ci0JY2xrW2Nsa19IRlBFUkNMS1RJTUVSMF0gPSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuVElNRVIwIiwKKwlod3NbY2xrX0hGUEVSQ0xLVElNRVIwXSA9IGNsa19od19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5USU1FUjAiLAogCQkJIkhGWE8iLCAwLCBiYXNlICsgQ01VX0hGUEVSQ0xLRU4wLCA1LCAwLCBOVUxMKTsKLQljbGtbY2xrX0hGUEVSQ0xLVElNRVIxXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5USU1FUjEiLAorCWh3c1tjbGtfSEZQRVJDTEtUSU1FUjFdID0gY2xrX2h3X3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLlRJTUVSMSIsCiAJCQkiSEZYTyIsIDAsIGJhc2UgKyBDTVVfSEZQRVJDTEtFTjAsIDYsIDAsIE5VTEwpOwotCWNsa1tjbGtfSEZQRVJDTEtUSU1FUjJdID0gY2xrX3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLlRJTUVSMiIsCisJaHdzW2Nsa19IRlBFUkNMS1RJTUVSMl0gPSBjbGtfaHdfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuVElNRVIyIiwKIAkJCSJIRlhPIiwgMCwgYmFzZSArIENNVV9IRlBFUkNMS0VOMCwgNywgMCwgTlVMTCk7Ci0JY2xrW2Nsa19IRlBFUkNMS1RJTUVSM10gPSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuVElNRVIzIiwKKwlod3NbY2xrX0hGUEVSQ0xLVElNRVIzXSA9IGNsa19od19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5USU1FUjMiLAogCQkJIkhGWE8iLCAwLCBiYXNlICsgQ01VX0hGUEVSQ0xLRU4wLCA4LCAwLCBOVUxMKTsKLQljbGtbY2xrX0hGUEVSQ0xLQUNNUDBdID0gY2xrX3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLkFDTVAwIiwKKwlod3NbY2xrX0hGUEVSQ0xLQUNNUDBdID0gY2xrX2h3X3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLkFDTVAwIiwKIAkJCSJIRlhPIiwgMCwgYmFzZSArIENNVV9IRlBFUkNMS0VOMCwgOSwgMCwgTlVMTCk7Ci0JY2xrW2Nsa19IRlBFUkNMS0FDTVAxXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5BQ01QMSIsCisJaHdzW2Nsa19IRlBFUkNMS0FDTVAxXSA9IGNsa19od19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5BQ01QMSIsCiAJCQkiSEZYTyIsIDAsIGJhc2UgKyBDTVVfSEZQRVJDTEtFTjAsIDEwLCAwLCBOVUxMKTsKLQljbGtbY2xrX0hGUEVSQ0xLSTJDMF0gPSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuSTJDMCIsCisJaHdzW2Nsa19IRlBFUkNMS0kyQzBdID0gY2xrX2h3X3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLkkyQzAiLAogCQkJIkhGWE8iLCAwLCBiYXNlICsgQ01VX0hGUEVSQ0xLRU4wLCAxMSwgMCwgTlVMTCk7Ci0JY2xrW2Nsa19IRlBFUkNMS0kyQzFdID0gY2xrX3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLkkyQzEiLAorCWh3c1tjbGtfSEZQRVJDTEtJMkMxXSA9IGNsa19od19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5JMkMxIiwKIAkJCSJIRlhPIiwgMCwgYmFzZSArIENNVV9IRlBFUkNMS0VOMCwgMTIsIDAsIE5VTEwpOwotCWNsa1tjbGtfSEZQRVJDTEtHUElPXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5HUElPIiwKKwlod3NbY2xrX0hGUEVSQ0xLR1BJT10gPSBjbGtfaHdfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuR1BJTyIsCiAJCQkiSEZYTyIsIDAsIGJhc2UgKyBDTVVfSEZQRVJDTEtFTjAsIDEzLCAwLCBOVUxMKTsKLQljbGtbY2xrX0hGUEVSQ0xLVkNNUF0gPSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuVkNNUCIsCisJaHdzW2Nsa19IRlBFUkNMS1ZDTVBdID0gY2xrX2h3X3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLlZDTVAiLAogCQkJIkhGWE8iLCAwLCBiYXNlICsgQ01VX0hGUEVSQ0xLRU4wLCAxNCwgMCwgTlVMTCk7Ci0JY2xrW2Nsa19IRlBFUkNMS1BSU10gPSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuUFJTIiwKKwlod3NbY2xrX0hGUEVSQ0xLUFJTXSA9IGNsa19od19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5QUlMiLAogCQkJIkhGWE8iLCAwLCBiYXNlICsgQ01VX0hGUEVSQ0xLRU4wLCAxNSwgMCwgTlVMTCk7Ci0JY2xrW2Nsa19IRlBFUkNMS0FEQzBdID0gY2xrX3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLkFEQzAiLAorCWh3c1tjbGtfSEZQRVJDTEtBREMwXSA9IGNsa19od19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5BREMwIiwKIAkJCSJIRlhPIiwgMCwgYmFzZSArIENNVV9IRlBFUkNMS0VOMCwgMTYsIDAsIE5VTEwpOwotCWNsa1tjbGtfSEZQRVJDTEtEQUMwXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5EQUMwIiwKKwlod3NbY2xrX0hGUEVSQ0xLREFDMF0gPSBjbGtfaHdfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuREFDMCIsCiAJCQkiSEZYTyIsIDAsIGJhc2UgKyBDTVVfSEZQRVJDTEtFTjAsIDE3LCAwLCBOVUxMKTsKIAotCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsICZjbGtfZGF0YSk7CisJb2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X29uZWNlbGxfZ2V0LCAmY2xrX2RhdGEpOwogfQogQ0xLX09GX0RFQ0xBUkUoZWZtMzJnZ2NtdSwgImVmbTMyZ2csY211IiwgZWZtMzJnZ19jbXVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstZml4ZWQtZmFjdG9yLmMgYi9kcml2ZXJzL2Nsay9jbGstZml4ZWQtZmFjdG9yLmMKaW5kZXggNGRiM2JlMi4uYTVkNDAyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLWZpeGVkLWZhY3Rvci5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay1maXhlZC1mYWN0b3IuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCiAvKgogICogRE9DOiBiYXNpYyBmaXhlZCBtdWx0aXBsaWVyIGFuZCBkaXZpZGVyIGNsb2NrIHRoYXQgY2Fubm90IGdhdGUKQEAgLTE0NywyNyArMTQ4LDI1IEBACiAJeyAvKiBTZW50aW5lbCAqLyB9LAogfTsKIAotLyoqCi0gKiBvZl9maXhlZF9mYWN0b3JfY2xrX3NldHVwKCkgLSBTZXR1cCBmdW5jdGlvbiBmb3Igc2ltcGxlIGZpeGVkIGZhY3RvciBjbG9jawotICovCi12b2lkIF9faW5pdCBvZl9maXhlZF9mYWN0b3JfY2xrX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3N0YXRpYyBzdHJ1Y3QgY2xrICpfb2ZfZml4ZWRfZmFjdG9yX2Nsa19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCiB7CiAJc3RydWN0IGNsayAqY2xrOwogCWNvbnN0IGNoYXIgKmNsa19uYW1lID0gbm9kZS0+bmFtZTsKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIAl1MzIgZGl2LCBtdWx0OworCWludCByZXQ7CiAKIAlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgImNsb2NrLWRpdiIsICZkaXYpKSB7CiAJCXByX2VycigiJXMgRml4ZWQgZmFjdG9yIGNsb2NrIDwlcz4gbXVzdCBoYXZlIGEgY2xvY2stZGl2IHByb3BlcnR5XG4iLAogCQkJX19mdW5jX18sIG5vZGUtPm5hbWUpOwotCQlyZXR1cm47CisJCXJldHVybiBFUlJfUFRSKC1FSU8pOwogCX0KIAogCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAiY2xvY2stbXVsdCIsICZtdWx0KSkgewogCQlwcl9lcnIoIiVzIEZpeGVkIGZhY3RvciBjbG9jayA8JXM+IG11c3QgaGF2ZSBhIGNsb2NrLW11bHQgcHJvcGVydHlcbiIsCiAJCQlfX2Z1bmNfXywgbm9kZS0+bmFtZSk7Ci0JCXJldHVybjsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CiAJfQogCiAJb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobm9kZSwgImNsb2NrLW91dHB1dC1uYW1lcyIsICZjbGtfbmFtZSk7CkBAIC0xNzgsMTAgKzE3Nyw2NyBAQAogCiAJY2xrID0gY2xrX3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLCBjbGtfbmFtZSwgcGFyZW50X25hbWUsIGZsYWdzLAogCQkJCQltdWx0LCBkaXYpOwotCWlmICghSVNfRVJSKGNsaykpCi0JCW9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCWlmIChJU19FUlIoY2xrKSkKKwkJcmV0dXJuIGNsazsKKworCXJldCA9IG9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCWlmIChyZXQpIHsKKwkJY2xrX3VucmVnaXN0ZXIoY2xrKTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisKKwlyZXR1cm4gY2xrOwogfQotRVhQT1JUX1NZTUJPTF9HUEwob2ZfZml4ZWRfZmFjdG9yX2Nsa19zZXR1cCk7CisKKy8qKgorICogb2ZfZml4ZWRfZmFjdG9yX2Nsa19zZXR1cCgpIC0gU2V0dXAgZnVuY3Rpb24gZm9yIHNpbXBsZSBmaXhlZCBmYWN0b3IgY2xvY2sKKyAqLwordm9pZCBfX2luaXQgb2ZfZml4ZWRfZmFjdG9yX2Nsa19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCit7CisJX29mX2ZpeGVkX2ZhY3Rvcl9jbGtfc2V0dXAobm9kZSk7Cit9CiBDTEtfT0ZfREVDTEFSRShmaXhlZF9mYWN0b3JfY2xrLCAiZml4ZWQtZmFjdG9yLWNsb2NrIiwKIAkJb2ZfZml4ZWRfZmFjdG9yX2Nsa19zZXR1cCk7CisKK3N0YXRpYyBpbnQgb2ZfZml4ZWRfZmFjdG9yX2Nsa19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgY2xrICpjbGsgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWNsa191bnJlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihjbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2ZfZml4ZWRfZmFjdG9yX2Nsa19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBjbGsgKmNsazsKKworCS8qCisJICogVGhpcyBmdW5jdGlvbiBpcyBub3QgZXhlY3V0ZWQgd2hlbiBvZl9maXhlZF9mYWN0b3JfY2xrX3NldHVwCisJICogc3VjY2VlZGVkLgorCSAqLworCWNsayA9IF9vZl9maXhlZF9mYWN0b3JfY2xrX3NldHVwKHBkZXYtPmRldi5vZl9ub2RlKTsKKwlpZiAoSVNfRVJSKGNsaykpCisJCXJldHVybiBQVFJfRVJSKGNsayk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX2ZpeGVkX2ZhY3Rvcl9jbGtfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJmaXhlZC1mYWN0b3ItY2xvY2siIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgb2ZfZml4ZWRfZmFjdG9yX2Nsa19pZHMpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvZl9maXhlZF9mYWN0b3JfY2xrX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJvZl9maXhlZF9mYWN0b3JfY2xrIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfZml4ZWRfZmFjdG9yX2Nsa19pZHMsCisJfSwKKwkucHJvYmUgPSBvZl9maXhlZF9mYWN0b3JfY2xrX3Byb2JlLAorCS5yZW1vdmUgPSBvZl9maXhlZF9mYWN0b3JfY2xrX3JlbW92ZSwKK307CitidWlsdGluX3BsYXRmb3JtX2RyaXZlcihvZl9maXhlZF9mYWN0b3JfY2xrX2RyaXZlcik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1maXhlZC1yYXRlLmMgYi9kcml2ZXJzL2Nsay9jbGstZml4ZWQtcmF0ZS5jCmluZGV4IDJlZGIzOTMuLmI1YzQ2YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay1maXhlZC1yYXRlLmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLWZpeGVkLXJhdGUuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAogLyoKICAqIERPQzogYmFzaWMgZml4ZWQtcmF0ZSBjbG9jayB0aGF0IGNhbm5vdCBnYXRlCkBAIC0xNTcsMTggKzE1OCwxNiBAQAogRVhQT1JUX1NZTUJPTF9HUEwoY2xrX2h3X3VucmVnaXN0ZXJfZml4ZWRfcmF0ZSk7CiAKICNpZmRlZiBDT05GSUdfT0YKLS8qKgotICogb2ZfZml4ZWRfY2xrX3NldHVwKCkgLSBTZXR1cCBmdW5jdGlvbiBmb3Igc2ltcGxlIGZpeGVkIHJhdGUgY2xvY2sKLSAqLwotdm9pZCBvZl9maXhlZF9jbGtfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpub2RlKQorc3RhdGljIHN0cnVjdCBjbGsgKl9vZl9maXhlZF9jbGtfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpub2RlKQogewogCXN0cnVjdCBjbGsgKmNsazsKIAljb25zdCBjaGFyICpjbGtfbmFtZSA9IG5vZGUtPm5hbWU7CiAJdTMyIHJhdGU7CiAJdTMyIGFjY3VyYWN5ID0gMDsKKwlpbnQgcmV0OwogCiAJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJjbG9jay1mcmVxdWVuY3kiLCAmcmF0ZSkpCi0JCXJldHVybjsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CiAKIAlvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAiY2xvY2stYWNjdXJhY3kiLCAmYWNjdXJhY3kpOwogCkBAIC0xNzYsOSArMTc1LDY2IEBACiAKIAljbGsgPSBjbGtfcmVnaXN0ZXJfZml4ZWRfcmF0ZV93aXRoX2FjY3VyYWN5KE5VTEwsIGNsa19uYW1lLCBOVUxMLAogCQkJCQkJICAgIDAsIHJhdGUsIGFjY3VyYWN5KTsKLQlpZiAoIUlTX0VSUihjbGspKQotCQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKKwlpZiAoSVNfRVJSKGNsaykpCisJCXJldHVybiBjbGs7CisKKwlyZXQgPSBvZl9jbGtfYWRkX3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKKwlpZiAocmV0KSB7CisJCWNsa191bnJlZ2lzdGVyKGNsayk7CisJCXJldHVybiBFUlJfUFRSKHJldCk7CisJfQorCisJcmV0dXJuIGNsazsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKG9mX2ZpeGVkX2Nsa19zZXR1cCk7CisKKy8qKgorICogb2ZfZml4ZWRfY2xrX3NldHVwKCkgLSBTZXR1cCBmdW5jdGlvbiBmb3Igc2ltcGxlIGZpeGVkIHJhdGUgY2xvY2sKKyAqLwordm9pZCBfX2luaXQgb2ZfZml4ZWRfY2xrX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3sKKwlfb2ZfZml4ZWRfY2xrX3NldHVwKG5vZGUpOworfQogQ0xLX09GX0RFQ0xBUkUoZml4ZWRfY2xrLCAiZml4ZWQtY2xvY2siLCBvZl9maXhlZF9jbGtfc2V0dXApOworCitzdGF0aWMgaW50IG9mX2ZpeGVkX2Nsa19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgY2xrICpjbGsgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWNsa191bnJlZ2lzdGVyX2ZpeGVkX3JhdGUoY2xrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9mX2ZpeGVkX2Nsa19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBjbGsgKmNsazsKKworCS8qCisJICogVGhpcyBmdW5jdGlvbiBpcyBub3QgZXhlY3V0ZWQgd2hlbiBvZl9maXhlZF9jbGtfc2V0dXAKKwkgKiBzdWNjZWVkZWQuCisJICovCisJY2xrID0gX29mX2ZpeGVkX2Nsa19zZXR1cChwZGV2LT5kZXYub2Zfbm9kZSk7CisJaWYgKElTX0VSUihjbGspKQorCQlyZXR1cm4gUFRSX0VSUihjbGspOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY2xrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvZl9maXhlZF9jbGtfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJmaXhlZC1jbG9jayIgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBvZl9maXhlZF9jbGtfaWRzKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb2ZfZml4ZWRfY2xrX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJvZl9maXhlZF9jbGsiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9maXhlZF9jbGtfaWRzLAorCX0sCisJLnByb2JlID0gb2ZfZml4ZWRfY2xrX3Byb2JlLAorCS5yZW1vdmUgPSBvZl9maXhlZF9jbGtfcmVtb3ZlLAorfTsKK2J1aWx0aW5fcGxhdGZvcm1fZHJpdmVyKG9mX2ZpeGVkX2Nsa19kcml2ZXIpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstbHMxeC5jIGIvZHJpdmVycy9jbGsvY2xrLWxzMXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5NzgzMS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2Nsay9jbGstbHMxeC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgWmhhbmcsIEtlZ3VhbmcgPGtlZ3VhbmcuemhhbmdAZ21haWwuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Nsa2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotCi0jaW5jbHVkZSA8bG9vbmdzb24xLmg+Ci0KLSNkZWZpbmUgT1NDCQkoMzMgKiAxMDAwMDAwKQotI2RlZmluZSBESVZfQVBCCQkyCi0KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soX2xvY2spOwotCi1zdGF0aWMgaW50IGxzMXhfcGxsX2Nsa19lbmFibGUoc3RydWN0IGNsa19odyAqaHcpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGxzMXhfcGxsX2Nsa19kaXNhYmxlKHN0cnVjdCBjbGtfaHcgKmh3KQotewotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBsczF4X3BsbF9yZWNhbGNfcmF0ZShzdHJ1Y3QgY2xrX2h3ICpodywKLQkJCQkJICB1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlKQotewotCXUzMiBwbGwsIHJhdGU7Ci0KLQlwbGwgPSBfX3Jhd19yZWFkbChMUzFYX0NMS19QTExfRlJFUSk7Ci0JcmF0ZSA9IDEyICsgKHBsbCAmIDB4M2YpICsgKCgocGxsID4+IDgpICYgMHgzZmYpID4+IDEwKTsKLQlyYXRlICo9IE9TQzsKLQlyYXRlID4+PSAxOwotCi0JcmV0dXJuIHJhdGU7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBsczF4X3BsbF9jbGtfb3BzID0gewotCS5lbmFibGUgPSBsczF4X3BsbF9jbGtfZW5hYmxlLAotCS5kaXNhYmxlID0gbHMxeF9wbGxfY2xrX2Rpc2FibGUsCi0JLnJlY2FsY19yYXRlID0gbHMxeF9wbGxfcmVjYWxjX3JhdGUsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayAqX19pbml0IGNsa19yZWdpc3Rlcl9wbGwoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkgICBjb25zdCBjaGFyICpuYW1lLAotCQkJCQkgICBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSwKLQkJCQkJICAgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQlzdHJ1Y3QgY2xrX2h3ICpodzsKLQlzdHJ1Y3QgY2xrICpjbGs7Ci0Jc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKLQotCS8qIGFsbG9jYXRlIHRoZSBkaXZpZGVyICovCi0JaHcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2xrX2h3KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFodykgewotCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgYWxsb2NhdGUgY2xrX2h3XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCX0KLQotCWluaXQubmFtZSA9IG5hbWU7Ci0JaW5pdC5vcHMgPSAmbHMxeF9wbGxfY2xrX29wczsKLQlpbml0LmZsYWdzID0gZmxhZ3MgfCBDTEtfSVNfQkFTSUM7Ci0JaW5pdC5wYXJlbnRfbmFtZXMgPSAocGFyZW50X25hbWUgPyAmcGFyZW50X25hbWUgOiBOVUxMKTsKLQlpbml0Lm51bV9wYXJlbnRzID0gKHBhcmVudF9uYW1lID8gMSA6IDApOwotCWh3LT5pbml0ID0gJmluaXQ7Ci0KLQkvKiByZWdpc3RlciB0aGUgY2xvY2sgKi8KLQljbGsgPSBjbGtfcmVnaXN0ZXIoZGV2LCBodyk7Ci0KLQlpZiAoSVNfRVJSKGNsaykpCi0JCWtmcmVlKGh3KTsKLQotCXJldHVybiBjbGs7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY3B1X3BhcmVudHNbXSA9IHsgImNwdV9jbGtfZGl2IiwgIm9zY18zM21fY2xrIiwgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWhiX3BhcmVudHNbXSA9IHsgImFoYl9jbGtfZGl2IiwgIm9zY18zM21fY2xrIiwgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGNfcGFyZW50c1tdID0geyAiZGNfY2xrX2RpdiIsICJvc2NfMzNtX2NsayIsIH07Ci0KLXZvaWQgX19pbml0IGxzMXhfY2xrX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgY2xrICpjbGs7Ci0KLQljbGsgPSBjbGtfcmVnaXN0ZXJfZml4ZWRfcmF0ZShOVUxMLCAib3NjXzMzbV9jbGsiLCBOVUxMLCAwLCBPU0MpOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrLCAib3NjXzMzbV9jbGsiLCBOVUxMKTsKLQotCS8qIGNsb2NrIGRlcml2ZWQgZnJvbSAzMyBNSHogT1NDIGNsayAqLwotCWNsayA9IGNsa19yZWdpc3Rlcl9wbGwoTlVMTCwgInBsbF9jbGsiLCAib3NjXzMzbV9jbGsiLCAwKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgInBsbF9jbGsiLCBOVUxMKTsKLQotCS8qIGNsb2NrIGRlcml2ZWQgZnJvbSBQTEwgY2xrICovCi0JLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX19fXwotCSAqICAgICAgICAgX19fX19fX19fX19fX19fX19fX19fX198ICAgICB8Ci0JICogT1NDIF9fXy8gICAgICAgICAgICAgICAgICAgICAgIHwgTVVYIHxfX18gQ1BVIENMSwotCSAqICAgICAgICBcX19fIFBMTCBfX18gQ1BVIERJViBfX198ICAgICB8Ci0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxfX19fX3wKLQkgKi8KLQljbGsgPSBjbGtfcmVnaXN0ZXJfZGl2aWRlcihOVUxMLCAiY3B1X2Nsa19kaXYiLCAicGxsX2NsayIsCi0JCQkJICAgQ0xLX0dFVF9SQVRFX05PQ0FDSEUsIExTMVhfQ0xLX1BMTF9ESVYsCi0JCQkJICAgRElWX0NQVV9TSElGVCwgRElWX0NQVV9XSURUSCwKLQkJCQkgICBDTEtfRElWSURFUl9PTkVfQkFTRUQgfAotCQkJCSAgIENMS19ESVZJREVSX1JPVU5EX0NMT1NFU1QsICZfbG9jayk7Ci0JY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGssICJjcHVfY2xrX2RpdiIsIE5VTEwpOwotCWNsayA9IGNsa19yZWdpc3Rlcl9tdXgoTlVMTCwgImNwdV9jbGsiLCBjcHVfcGFyZW50cywKLQkJCSAgICAgICBBUlJBWV9TSVpFKGNwdV9wYXJlbnRzKSwKLQkJCSAgICAgICBDTEtfU0VUX1JBVEVfTk9fUkVQQVJFTlQsIExTMVhfQ0xLX1BMTF9ESVYsCi0JCQkgICAgICAgQllQQVNTX0NQVV9TSElGVCwgQllQQVNTX0NQVV9XSURUSCwgMCwgJl9sb2NrKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgImNwdV9jbGsiLCBOVUxMKTsKLQotCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX18KLQkgKiAgICAgICAgIF9fX19fX19fX19fX19fX19fX19fX19ffCAgICAgfAotCSAqIE9TQyBfX18vICAgICAgICAgICAgICAgICAgICAgICB8IE1VWCB8X19fIERDICBDTEsKLQkgKiAgICAgICAgXF9fXyBQTEwgX19fIERDICBESVYgX19ffCAgICAgfAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8X19fX198Ci0JICovCi0JY2xrID0gY2xrX3JlZ2lzdGVyX2RpdmlkZXIoTlVMTCwgImRjX2Nsa19kaXYiLCAicGxsX2NsayIsCi0JCQkJICAgMCwgTFMxWF9DTEtfUExMX0RJViwgRElWX0RDX1NISUZULAotCQkJCSAgIERJVl9EQ19XSURUSCwgQ0xLX0RJVklERVJfT05FX0JBU0VELCAmX2xvY2spOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrLCAiZGNfY2xrX2RpdiIsIE5VTEwpOwotCWNsayA9IGNsa19yZWdpc3Rlcl9tdXgoTlVMTCwgImRjX2NsayIsIGRjX3BhcmVudHMsCi0JCQkgICAgICAgQVJSQVlfU0laRShkY19wYXJlbnRzKSwKLQkJCSAgICAgICBDTEtfU0VUX1JBVEVfTk9fUkVQQVJFTlQsIExTMVhfQ0xLX1BMTF9ESVYsCi0JCQkgICAgICAgQllQQVNTX0RDX1NISUZULCBCWVBBU1NfRENfV0lEVEgsIDAsICZfbG9jayk7Ci0JY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGssICJkY19jbGsiLCBOVUxMKTsKLQotCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX18KLQkgKiAgICAgICAgIF9fX19fX19fX19fX19fX19fX19fX19ffCAgICAgfAotCSAqIE9TQyBfX18vICAgICAgICAgICAgICAgICAgICAgICB8IE1VWCB8X19fIEREUiBDTEsKLQkgKiAgICAgICAgXF9fXyBQTEwgX19fIEREUiBESVYgX19ffCAgICAgfAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8X19fX198Ci0JICovCi0JY2xrID0gY2xrX3JlZ2lzdGVyX2RpdmlkZXIoTlVMTCwgImFoYl9jbGtfZGl2IiwgInBsbF9jbGsiLAotCQkJCSAgIDAsIExTMVhfQ0xLX1BMTF9ESVYsIERJVl9ERFJfU0hJRlQsCi0JCQkJICAgRElWX0REUl9XSURUSCwgQ0xLX0RJVklERVJfT05FX0JBU0VELAotCQkJCSAgICZfbG9jayk7Ci0JY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGssICJhaGJfY2xrX2RpdiIsIE5VTEwpOwotCWNsayA9IGNsa19yZWdpc3Rlcl9tdXgoTlVMTCwgImFoYl9jbGsiLCBhaGJfcGFyZW50cywKLQkJCSAgICAgICBBUlJBWV9TSVpFKGFoYl9wYXJlbnRzKSwKLQkJCSAgICAgICBDTEtfU0VUX1JBVEVfTk9fUkVQQVJFTlQsIExTMVhfQ0xLX1BMTF9ESVYsCi0JCQkgICAgICAgQllQQVNTX0REUl9TSElGVCwgQllQQVNTX0REUl9XSURUSCwgMCwgJl9sb2NrKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgImFoYl9jbGsiLCBOVUxMKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgInN0bW1hY2V0aCIsIE5VTEwpOwotCi0JLyogY2xvY2sgZGVyaXZlZCBmcm9tIEFIQiBjbGsgKi8KLQkvKiBBUEIgY2xrIGlzIGFsd2F5cyBoYWxmIG9mIHRoZSBBSEIgY2xrICovCi0JY2xrID0gY2xrX3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLCAiYXBiX2NsayIsICJhaGJfY2xrIiwgMCwgMSwKLQkJCQkJRElWX0FQQik7Ci0JY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGssICJhcGJfY2xrIiwgTlVMTCk7Ci0JY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGssICJsczF4X2kyYyIsIE5VTEwpOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrLCAibHMxeF9wd210aW1lciIsIE5VTEwpOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrLCAibHMxeF9zcGkiLCBOVUxMKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgImxzMXhfd2R0IiwgTlVMTCk7Ci0JY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGssICJzZXJpYWw4MjUwIiwgTlVMTCk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstbWF4LWdlbi5jIGIvZHJpdmVycy9jbGsvY2xrLW1heC1nZW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVhZjljYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2Nsay9jbGstbWF4LWdlbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qCi0gKiBjbGstbWF4LWdlbi5jIC0gR2VuZXJpYyBjbG9jayBkcml2ZXIgZm9yIE1heGltIFBNSUNzIGNsb2NrcwotICoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBHb29nbGUsIEluYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBTYW1zdW5nIEVsZWN0b3JuaWNzCi0gKiBKb25naHdhIExlZSA8am9uZ2h3YTMubGVlQHNhbXN1bmcuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiBjbGstbWF4Nzc2ODYuYwotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KLQotI2luY2x1ZGUgImNsay1tYXgtZ2VuLmgiCi0KLXN0cnVjdCBtYXhfZ2VuX2NsayB7Ci0Jc3RydWN0IHJlZ21hcCAqcmVnbWFwOwotCXUzMiBtYXNrOwotCXUzMiByZWc7Ci0Jc3RydWN0IGNsa19odyBodzsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWF4X2dlbl9jbGsgKnRvX21heF9nZW5fY2xrKHN0cnVjdCBjbGtfaHcgKmh3KQotewotCXJldHVybiBjb250YWluZXJfb2YoaHcsIHN0cnVjdCBtYXhfZ2VuX2NsaywgaHcpOwotfQotCi1zdGF0aWMgaW50IG1heF9nZW5fY2xrX3ByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCi17Ci0Jc3RydWN0IG1heF9nZW5fY2xrICptYXhfZ2VuID0gdG9fbWF4X2dlbl9jbGsoaHcpOwotCi0JcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhtYXhfZ2VuLT5yZWdtYXAsIG1heF9nZW4tPnJlZywKLQkJCQkgIG1heF9nZW4tPm1hc2ssIG1heF9nZW4tPm1hc2spOwotfQotCi1zdGF0aWMgdm9pZCBtYXhfZ2VuX2Nsa191bnByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCi17Ci0Jc3RydWN0IG1heF9nZW5fY2xrICptYXhfZ2VuID0gdG9fbWF4X2dlbl9jbGsoaHcpOwotCi0JcmVnbWFwX3VwZGF0ZV9iaXRzKG1heF9nZW4tPnJlZ21hcCwgbWF4X2dlbi0+cmVnLAotCQkJICAgbWF4X2dlbi0+bWFzaywgfm1heF9nZW4tPm1hc2spOwotfQotCi1zdGF0aWMgaW50IG1heF9nZW5fY2xrX2lzX3ByZXBhcmVkKHN0cnVjdCBjbGtfaHcgKmh3KQotewotCXN0cnVjdCBtYXhfZ2VuX2NsayAqbWF4X2dlbiA9IHRvX21heF9nZW5fY2xrKGh3KTsKLQlpbnQgcmV0OwotCXUzMiB2YWw7Ci0KLQlyZXQgPSByZWdtYXBfcmVhZChtYXhfZ2VuLT5yZWdtYXAsIG1heF9nZW4tPnJlZywgJnZhbCk7Ci0KLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gdmFsICYgbWF4X2dlbi0+bWFzazsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgbWF4X2dlbl9yZWNhbGNfcmF0ZShzdHJ1Y3QgY2xrX2h3ICpodywKLQkJCQkJIHVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUpCi17Ci0JcmV0dXJuIDMyNzY4OwotfQotCi1zdHJ1Y3QgY2xrX29wcyBtYXhfZ2VuX2Nsa19vcHMgPSB7Ci0JLnByZXBhcmUJPSBtYXhfZ2VuX2Nsa19wcmVwYXJlLAotCS51bnByZXBhcmUJPSBtYXhfZ2VuX2Nsa191bnByZXBhcmUsCi0JLmlzX3ByZXBhcmVkCT0gbWF4X2dlbl9jbGtfaXNfcHJlcGFyZWQsCi0JLnJlY2FsY19yYXRlCT0gbWF4X2dlbl9yZWNhbGNfcmF0ZSwKLX07Ci1FWFBPUlRfU1lNQk9MX0dQTChtYXhfZ2VuX2Nsa19vcHMpOwotCi1zdGF0aWMgc3RydWN0IGNsayAqbWF4X2dlbl9jbGtfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQlzdHJ1Y3QgbWF4X2dlbl9jbGsgKm1heF9nZW4pCi17Ci0Jc3RydWN0IGNsayAqY2xrOwotCXN0cnVjdCBjbGtfaHcgKmh3ID0gJm1heF9nZW4tPmh3OwotCWludCByZXQ7Ci0KLQljbGsgPSBkZXZtX2Nsa19yZWdpc3RlcihkZXYsIGh3KTsKLQlpZiAoSVNfRVJSKGNsaykpCi0JCXJldHVybiBjbGs7Ci0KLQlyZXQgPSBjbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgaHctPmluaXQtPm5hbWUsIE5VTEwpOwotCi0JaWYgKHJldCkKLQkJcmV0dXJuIEVSUl9QVFIocmV0KTsKLQotCXJldHVybiBjbGs7Ci19Ci0KLWludCBtYXhfZ2VuX2Nsa19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsCi0JCSAgICAgIHUzMiByZWcsIHN0cnVjdCBjbGtfaW5pdF9kYXRhICpjbGtzX2luaXQsIGludCBudW1faW5pdCkKLXsKLQlpbnQgaSwgcmV0OwotCXN0cnVjdCBtYXhfZ2VuX2NsayAqbWF4X2dlbl9jbGtzOwotCXN0cnVjdCBjbGsgKipjbG9ja3M7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gcGRldi0+ZGV2LnBhcmVudDsKLQljb25zdCBjaGFyICpjbGtfbmFtZTsKLQlzdHJ1Y3QgY2xrX2luaXRfZGF0YSAqaW5pdDsKLQotCWNsb2NrcyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgY2xrICopICogbnVtX2luaXQsIEdGUF9LRVJORUwpOwotCWlmICghY2xvY2tzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW1heF9nZW5fY2xrcyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgbWF4X2dlbl9jbGspCi0JCQkJICAgICogbnVtX2luaXQsIEdGUF9LRVJORUwpOwotCWlmICghbWF4X2dlbl9jbGtzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1faW5pdDsgaSsrKSB7Ci0JCW1heF9nZW5fY2xrc1tpXS5yZWdtYXAgPSByZWdtYXA7Ci0JCW1heF9nZW5fY2xrc1tpXS5tYXNrID0gMSA8PCBpOwotCQltYXhfZ2VuX2Nsa3NbaV0ucmVnID0gcmVnOwotCi0JCWluaXQgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmluaXQpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFpbml0KQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJaWYgKGRldi0+b2Zfbm9kZSAmJgotCQkgICAgIW9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nX2luZGV4KGRldi0+b2Zfbm9kZSwKLQkJCQkJCSAgICJjbG9jay1vdXRwdXQtbmFtZXMiLAotCQkJCQkJICAgaSwgJmNsa19uYW1lKSkKLQkJCWluaXQtPm5hbWUgPSBjbGtfbmFtZTsKLQkJZWxzZQotCQkJaW5pdC0+bmFtZSA9IGNsa3NfaW5pdFtpXS5uYW1lOwotCi0JCWluaXQtPm9wcyA9IGNsa3NfaW5pdFtpXS5vcHM7Ci0JCWluaXQtPmZsYWdzID0gY2xrc19pbml0W2ldLmZsYWdzOwotCi0JCW1heF9nZW5fY2xrc1tpXS5ody5pbml0ID0gaW5pdDsKLQotCQljbG9ja3NbaV0gPSBtYXhfZ2VuX2Nsa19yZWdpc3RlcihkZXYsICZtYXhfZ2VuX2Nsa3NbaV0pOwotCQlpZiAoSVNfRVJSKGNsb2Nrc1tpXSkpIHsKLQkJCXJldCA9IFBUUl9FUlIoY2xvY2tzW2ldKTsKLQkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyICVzXG4iLAotCQkJCW1heF9nZW5fY2xrc1tpXS5ody5pbml0LT5uYW1lKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjbG9ja3MpOwotCi0JaWYgKGRldi0+b2Zfbm9kZSkgewotCQlzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSAqb2ZfZGF0YTsKLQotCQlvZl9kYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpvZl9kYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghb2ZfZGF0YSkKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCW9mX2RhdGEtPmNsa3MgPSBjbG9ja3M7Ci0JCW9mX2RhdGEtPmNsa19udW0gPSBudW1faW5pdDsKLQkJcmV0ID0gb2ZfY2xrX2FkZF9wcm92aWRlcihkZXYtPm9mX25vZGUsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsCi0JCQkJCSAgb2ZfZGF0YSk7Ci0KLQkJaWYgKHJldCkgewotCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgT0YgY2xvY2sgcHJvdmlkZXJcbiIpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwobWF4X2dlbl9jbGtfcHJvYmUpOwotCi1pbnQgbWF4X2dlbl9jbGtfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIGludCBudW1faW5pdCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBwZGV2LT5kZXYucGFyZW50OwotCi0JaWYgKGRldi0+b2Zfbm9kZSkKLQkJb2ZfY2xrX2RlbF9wcm92aWRlcihkZXYtPm9mX25vZGUpOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChtYXhfZ2VuX2Nsa19yZW1vdmUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLW1heC1nZW4uaCBiL2RyaXZlcnMvY2xrL2Nsay1tYXgtZ2VuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5N2U4NmYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jbGsvY2xrLW1heC1nZW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBjbGstbWF4LWdlbi5oIC0gR2VuZXJpYyBjbG9jayBkcml2ZXIgZm9yIE1heGltIFBNSUNzIGNsb2NrcwotICoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBHb29nbGUsIEluYwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX0NMS19NQVhfR0VOX0hfXwotI2RlZmluZSBfX0NMS19NQVhfR0VOX0hfXwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGtkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQotaW50IG1heF9nZW5fY2xrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKLQkJICAgICAgdTMyIHJlZywgc3RydWN0IGNsa19pbml0X2RhdGEgKmNsa3NfaW5pdCwgaW50IG51bV9pbml0KTsKLWludCBtYXhfZ2VuX2Nsa19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgaW50IG51bV9pbml0KTsKLWV4dGVybiBzdHJ1Y3QgY2xrX29wcyBtYXhfZ2VuX2Nsa19vcHM7Ci0KLSNlbmRpZiAvKiBfX0NMS19NQVhfR0VOX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLW1heDc3Njg2LmMgYi9kcml2ZXJzL2Nsay9jbGstbWF4Nzc2ODYuYwppbmRleCA5YjZmMjc3Li5iNjM3ZjU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9jbGstbWF4Nzc2ODYuYworKysgYi9kcml2ZXJzL2Nsay9jbGstbWF4Nzc2ODYuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBjbGstbWF4Nzc2ODYuYyAtIENsb2NrIGRyaXZlciBmb3IgTWF4aW0gNzc2ODYKKyAqIGNsay1tYXg3NzY4Ni5jIC0gQ2xvY2sgZHJpdmVyIGZvciBNYXhpbSA3NzY4Ni9NQVg3NzgwMgogICoKICAqIENvcHlyaWdodCAoQykgMjAxMiBTYW1zdW5nIEVsZWN0b3JuaWNzCiAgKiBKb25naHdhIExlZSA8am9uZ2h3YTMubGVlQHNhbXN1bmcuY29tPgpAQCAtMjUsNDYgKzI1LDI4NCBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9tYXg3NzYyMC5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9tYXg3NzY4Ni5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9tYXg3NzY4Ni1wcml2YXRlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9jbGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogCiAjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svbWF4aW0sbWF4Nzc2ODYuaD4KLSNpbmNsdWRlICJjbGstbWF4LWdlbi5oIgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL21heGltLG1heDc3ODAyLmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svbWF4aW0sbWF4Nzc2MjAuaD4KIAotc3RhdGljIHN0cnVjdCBjbGtfaW5pdF9kYXRhIG1heDc3Njg2X2Nsa3NfaW5pdFtNQVg3NzY4Nl9DTEtTX05VTV0gPSB7CisjZGVmaW5lIE1BWDc3ODAyX0NMT0NLX0xPV19KSVRURVJfU0hJRlQgMHgzCisKK2VudW0gbWF4Nzc2ODZfY2hpcF9uYW1lIHsKKwlDSElQX01BWDc3Njg2LAorCUNISVBfTUFYNzc4MDIsCisJQ0hJUF9NQVg3NzYyMCwKK307CisKK3N0cnVjdCBtYXg3NzY4Nl9od19jbGtfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1MzIgY2xrX3JlZzsKKwl1MzIgY2xrX2VuYWJsZV9tYXNrOworCXUzMiBmbGFnczsKK307CisKK3N0cnVjdCBtYXg3NzY4Nl9jbGtfaW5pdF9kYXRhIHsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJc3RydWN0IGNsa19odyBodzsKKwlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBjbGtfaWRhdGE7CisJY29uc3Qgc3RydWN0IG1heDc3Njg2X2h3X2Nsa19pbmZvICpjbGtfaW5mbzsKK307CisKK3N0cnVjdCBtYXg3NzY4Nl9jbGtfZHJpdmVyX2RhdGEgeworCWVudW0gbWF4Nzc2ODZfY2hpcF9uYW1lIGNoaXA7CisJc3RydWN0IG1heDc3Njg2X2Nsa19pbml0X2RhdGEgKm1heF9jbGtfZGF0YTsKKwlzaXplX3QgbnVtX2Nsa3M7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0CittYXg3NzY4Nl9od19jbGtfaW5mbyBtYXg3NzY4Nl9od19jbGtzX2luZm9bTUFYNzc2ODZfQ0xLU19OVU1dID0gewogCVtNQVg3NzY4Nl9DTEtfQVBdID0gewogCQkubmFtZSA9ICIzMmtoel9hcCIsCi0JCS5vcHMgPSAmbWF4X2dlbl9jbGtfb3BzLAorCQkuY2xrX3JlZyA9IE1BWDc3Njg2X1JFR18zMktIWiwKKwkJLmNsa19lbmFibGVfbWFzayA9IEJJVChNQVg3NzY4Nl9DTEtfQVApLAogCX0sCiAJW01BWDc3Njg2X0NMS19DUF0gPSB7CiAJCS5uYW1lID0gIjMya2h6X2NwIiwKLQkJLm9wcyA9ICZtYXhfZ2VuX2Nsa19vcHMsCisJCS5jbGtfcmVnID0gTUFYNzc2ODZfUkVHXzMyS0haLAorCQkuY2xrX2VuYWJsZV9tYXNrID0gQklUKE1BWDc3Njg2X0NMS19DUCksCiAJfSwKIAlbTUFYNzc2ODZfQ0xLX1BNSUNdID0gewogCQkubmFtZSA9ICIzMmtoel9wbWljIiwKLQkJLm9wcyA9ICZtYXhfZ2VuX2Nsa19vcHMsCisJCS5jbGtfcmVnID0gTUFYNzc2ODZfUkVHXzMyS0haLAorCQkuY2xrX2VuYWJsZV9tYXNrID0gQklUKE1BWDc3Njg2X0NMS19QTUlDKSwKIAl9LAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdAorbWF4Nzc2ODZfaHdfY2xrX2luZm8gbWF4Nzc4MDJfaHdfY2xrc19pbmZvW01BWDc3ODAyX0NMS1NfTlVNXSA9IHsKKwlbTUFYNzc4MDJfQ0xLXzMyS19BUF0gPSB7CisJCS5uYW1lID0gIjMya2h6X2FwIiwKKwkJLmNsa19yZWcgPSBNQVg3NzgwMl9SRUdfMzJLSFosCisJCS5jbGtfZW5hYmxlX21hc2sgPSBCSVQoTUFYNzc4MDJfQ0xLXzMyS19BUCksCisJfSwKKwlbTUFYNzc4MDJfQ0xLXzMyS19DUF0gPSB7CisJCS5uYW1lID0gIjMya2h6X2NwIiwKKwkJLmNsa19yZWcgPSBNQVg3NzgwMl9SRUdfMzJLSFosCisJCS5jbGtfZW5hYmxlX21hc2sgPSBCSVQoTUFYNzc4MDJfQ0xLXzMyS19DUCksCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QKK21heDc3Njg2X2h3X2Nsa19pbmZvIG1heDc3NjIwX2h3X2Nsa3NfaW5mb1tNQVg3NzYyMF9DTEtTX05VTV0gPSB7CisJW01BWDc3NjIwX0NMS18zMktfT1VUMF0gPSB7CisJCS5uYW1lID0gIjMya2h6X291dDAiLAorCQkuY2xrX3JlZyA9IE1BWDc3NjIwX1JFR19DTkZHMV8zMkssCisJCS5jbGtfZW5hYmxlX21hc2sgPSBNQVg3NzYyMF9DTkZHMV8zMktfT1VUMF9FTiwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtYXg3NzY4Nl9jbGtfaW5pdF9kYXRhICp0b19tYXg3NzY4Nl9jbGtfaW5pdF9kYXRhKAorCQkJCXN0cnVjdCBjbGtfaHcgKmh3KQoreworCXJldHVybiBjb250YWluZXJfb2YoaHcsIHN0cnVjdCBtYXg3NzY4Nl9jbGtfaW5pdF9kYXRhLCBodyk7Cit9CisKK3N0YXRpYyBpbnQgbWF4Nzc2ODZfY2xrX3ByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IG1heDc3Njg2X2Nsa19pbml0X2RhdGEgKm1heDc3Njg2ID0gdG9fbWF4Nzc2ODZfY2xrX2luaXRfZGF0YShodyk7CisKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKG1heDc3Njg2LT5yZWdtYXAsIG1heDc3Njg2LT5jbGtfaW5mby0+Y2xrX3JlZywKKwkJCQkgIG1heDc3Njg2LT5jbGtfaW5mby0+Y2xrX2VuYWJsZV9tYXNrLAorCQkJCSAgbWF4Nzc2ODYtPmNsa19pbmZvLT5jbGtfZW5hYmxlX21hc2spOworfQorCitzdGF0aWMgdm9pZCBtYXg3NzY4Nl9jbGtfdW5wcmVwYXJlKHN0cnVjdCBjbGtfaHcgKmh3KQoreworCXN0cnVjdCBtYXg3NzY4Nl9jbGtfaW5pdF9kYXRhICptYXg3NzY4NiA9IHRvX21heDc3Njg2X2Nsa19pbml0X2RhdGEoaHcpOworCisJcmVnbWFwX3VwZGF0ZV9iaXRzKG1heDc3Njg2LT5yZWdtYXAsIG1heDc3Njg2LT5jbGtfaW5mby0+Y2xrX3JlZywKKwkJCSAgIG1heDc3Njg2LT5jbGtfaW5mby0+Y2xrX2VuYWJsZV9tYXNrLAorCQkJICAgfm1heDc3Njg2LT5jbGtfaW5mby0+Y2xrX2VuYWJsZV9tYXNrKTsKK30KKworc3RhdGljIGludCBtYXg3NzY4Nl9jbGtfaXNfcHJlcGFyZWQoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IG1heDc3Njg2X2Nsa19pbml0X2RhdGEgKm1heDc3Njg2ID0gdG9fbWF4Nzc2ODZfY2xrX2luaXRfZGF0YShodyk7CisJaW50IHJldDsKKwl1MzIgdmFsOworCisJcmV0ID0gcmVnbWFwX3JlYWQobWF4Nzc2ODYtPnJlZ21hcCwgbWF4Nzc2ODYtPmNsa19pbmZvLT5jbGtfcmVnLCAmdmFsKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiB2YWwgJiBtYXg3NzY4Ni0+Y2xrX2luZm8tPmNsa19lbmFibGVfbWFzazsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbWF4Nzc2ODZfcmVjYWxjX3JhdGUoc3RydWN0IGNsa19odyAqaHcsCisJCQkJCSAgdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSkKK3sKKwlyZXR1cm4gMzI3Njg7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBtYXg3NzY4Nl9jbGtfb3BzID0geworCS5wcmVwYXJlCT0gbWF4Nzc2ODZfY2xrX3ByZXBhcmUsCisJLnVucHJlcGFyZQk9IG1heDc3Njg2X2Nsa191bnByZXBhcmUsCisJLmlzX3ByZXBhcmVkCT0gbWF4Nzc2ODZfY2xrX2lzX3ByZXBhcmVkLAorCS5yZWNhbGNfcmF0ZQk9IG1heDc3Njg2X3JlY2FsY19yYXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfaHcgKgorb2ZfY2xrX21heDc3Njg2X2dldChzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpjbGtzcGVjLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBtYXg3NzY4Nl9jbGtfZHJpdmVyX2RhdGEgKmRydl9kYXRhID0gZGF0YTsKKwl1bnNpZ25lZCBpbnQgaWR4ID0gY2xrc3BlYy0+YXJnc1swXTsKKworCWlmIChpZHggPj0gZHJ2X2RhdGEtPm51bV9jbGtzKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgaW5kZXggJXVcbiIsIF9fZnVuY19fLCBpZHgpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwlyZXR1cm4gJmRydl9kYXRhLT5tYXhfY2xrX2RhdGFbaWR4XS5odzsKK30KKwogc3RhdGljIGludCBtYXg3NzY4Nl9jbGtfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgbWF4Nzc2ODZfZGV2ICppb2RldiA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBkZXZpY2UgKnBhcmVudCA9IGRldi0+cGFyZW50OworCWNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgKmlkID0gcGxhdGZvcm1fZ2V0X2RldmljZV9pZChwZGV2KTsKKwlzdHJ1Y3QgbWF4Nzc2ODZfY2xrX2RyaXZlcl9kYXRhICpkcnZfZGF0YTsKKwljb25zdCBzdHJ1Y3QgbWF4Nzc2ODZfaHdfY2xrX2luZm8gKmh3X2Nsa3M7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCWludCBpLCByZXQsIG51bV9jbGtzOwogCi0JcmV0dXJuIG1heF9nZW5fY2xrX3Byb2JlKHBkZXYsIGlvZGV2LT5yZWdtYXAsIE1BWDc3Njg2X1JFR18zMktIWiwKLQkJCQkgbWF4Nzc2ODZfY2xrc19pbml0LCBNQVg3NzY4Nl9DTEtTX05VTSk7CisJZHJ2X2RhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRydl9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkcnZfZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZWdtYXAgPSBkZXZfZ2V0X3JlZ21hcChwYXJlbnQsIE5VTEwpOworCWlmICghcmVnbWFwKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGdldCBydGMgcmVnbWFwXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZHJ2X2RhdGEtPmNoaXAgPSBpZC0+ZHJpdmVyX2RhdGE7CisKKwlzd2l0Y2ggKGRydl9kYXRhLT5jaGlwKSB7CisJY2FzZSBDSElQX01BWDc3Njg2OgorCQludW1fY2xrcyA9IE1BWDc3Njg2X0NMS1NfTlVNOworCQlod19jbGtzID0gbWF4Nzc2ODZfaHdfY2xrc19pbmZvOworCQlicmVhazsKKworCWNhc2UgQ0hJUF9NQVg3NzgwMjoKKwkJbnVtX2Nsa3MgPSBNQVg3NzgwMl9DTEtTX05VTTsKKwkJaHdfY2xrcyA9IG1heDc3ODAyX2h3X2Nsa3NfaW5mbzsKKwkJYnJlYWs7CisKKwljYXNlIENISVBfTUFYNzc2MjA6CisJCW51bV9jbGtzID0gTUFYNzc2MjBfQ0xLU19OVU07CisJCWh3X2Nsa3MgPSBtYXg3NzYyMF9od19jbGtzX2luZm87CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICJVbmtub3duIENoaXAgSURcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkcnZfZGF0YS0+bWF4X2Nsa19kYXRhID0gZGV2bV9rY2FsbG9jKGRldiwgbnVtX2Nsa3MsCisJCQkJCSAgICAgIHNpemVvZigqZHJ2X2RhdGEtPm1heF9jbGtfZGF0YSksCisJCQkJCSAgICAgIEdGUF9LRVJORUwpOworCWlmICghZHJ2X2RhdGEtPm1heF9jbGtfZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2Nsa3M7IGkrKykgeworCQlzdHJ1Y3QgbWF4Nzc2ODZfY2xrX2luaXRfZGF0YSAqbWF4X2Nsa19kYXRhOworCQljb25zdCBjaGFyICpjbGtfbmFtZTsKKworCQltYXhfY2xrX2RhdGEgPSAmZHJ2X2RhdGEtPm1heF9jbGtfZGF0YVtpXTsKKworCQltYXhfY2xrX2RhdGEtPnJlZ21hcCA9IHJlZ21hcDsKKwkJbWF4X2Nsa19kYXRhLT5jbGtfaW5mbyA9ICZod19jbGtzW2ldOworCQltYXhfY2xrX2RhdGEtPmNsa19pZGF0YS5mbGFncyA9IGh3X2Nsa3NbaV0uZmxhZ3M7CisJCW1heF9jbGtfZGF0YS0+Y2xrX2lkYXRhLm9wcyA9ICZtYXg3NzY4Nl9jbGtfb3BzOworCisJCWlmIChwYXJlbnQtPm9mX25vZGUgJiYKKwkJICAgICFvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleChwYXJlbnQtPm9mX25vZGUsCisJCQkJCQkgICAiY2xvY2stb3V0cHV0LW5hbWVzIiwKKwkJCQkJCSAgIGksICZjbGtfbmFtZSkpCisJCQltYXhfY2xrX2RhdGEtPmNsa19pZGF0YS5uYW1lID0gY2xrX25hbWU7CisJCWVsc2UKKwkJCW1heF9jbGtfZGF0YS0+Y2xrX2lkYXRhLm5hbWUgPSBod19jbGtzW2ldLm5hbWU7CisKKwkJbWF4X2Nsa19kYXRhLT5ody5pbml0ID0gJm1heF9jbGtfZGF0YS0+Y2xrX2lkYXRhOworCisJCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKGRldiwgJm1heF9jbGtfZGF0YS0+aHcpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBjbG9jayByZWdpc3RlcjogJWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldigmbWF4X2Nsa19kYXRhLT5odywKKwkJCQkJICAgICBtYXhfY2xrX2RhdGEtPmNsa19pZGF0YS5uYW1lLCBOVUxMKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGNsa2RldiByZWdpc3RlcjogJWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJaWYgKHBhcmVudC0+b2Zfbm9kZSkgeworCQlyZXQgPSBvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKHBhcmVudC0+b2Zfbm9kZSwgb2ZfY2xrX21heDc3Njg2X2dldCwKKwkJCQkJICAgICBkcnZfZGF0YSk7CisKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIE9GIGNsb2NrIHByb3ZpZGVyOiAlZFxuIiwKKwkJCQlyZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCS8qIE1BWDc3ODAyOiBFbmFibGUgbG93LWppdHRlciBtb2RlIG9uIHRoZSAzMmtoeiBjbG9ja3MuICovCisJaWYgKGRydl9kYXRhLT5jaGlwID09IENISVBfTUFYNzc4MDIpIHsKKwkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHJlZ21hcCwgTUFYNzc4MDJfUkVHXzMyS0haLAorCQkJCQkgMSA8PCBNQVg3NzgwMl9DTE9DS19MT1dfSklUVEVSX1NISUZULAorCQkJCQkgMSA8PCBNQVg3NzgwMl9DTE9DS19MT1dfSklUVEVSX1NISUZUKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGNvbmZpZyBsb3ctaml0dGVyOiAlZFxuIiwgcmV0KTsKKwkJCWdvdG8gcmVtb3ZlX29mX2Nsa19wcm92aWRlcjsKKwkJfQorCX0KKworCXJldHVybiAwOworCityZW1vdmVfb2ZfY2xrX3Byb3ZpZGVyOgorCWlmIChwYXJlbnQtPm9mX25vZGUpCisJCW9mX2Nsa19kZWxfcHJvdmlkZXIocGFyZW50LT5vZl9ub2RlKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgbWF4Nzc2ODZfY2xrX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXJldHVybiBtYXhfZ2VuX2Nsa19yZW1vdmUocGRldiwgTUFYNzc2ODZfQ0xLU19OVU0pOworCXN0cnVjdCBkZXZpY2UgKnBhcmVudCA9IHBkZXYtPmRldi5wYXJlbnQ7CisKKwlpZiAocGFyZW50LT5vZl9ub2RlKQorCQlvZl9jbGtfZGVsX3Byb3ZpZGVyKHBhcmVudC0+b2Zfbm9kZSk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgbWF4Nzc2ODZfY2xrX2lkW10gPSB7Ci0JeyAibWF4Nzc2ODYtY2xrIiwgMH0sCi0JeyB9LAorCXsgIm1heDc3Njg2LWNsayIsIC5kcml2ZXJfZGF0YSA9IENISVBfTUFYNzc2ODYsIH0sCisJeyAibWF4Nzc4MDItY2xrIiwgLmRyaXZlcl9kYXRhID0gQ0hJUF9NQVg3NzgwMiwgfSwKKwl7ICJtYXg3NzYyMC1jbG9jayIsIC5kcml2ZXJfZGF0YSA9IENISVBfTUFYNzc2MjAsIH0sCisJe30sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwbGF0Zm9ybSwgbWF4Nzc2ODZfY2xrX2lkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLW1heDc3ODAyLmMgYi9kcml2ZXJzL2Nsay9jbGstbWF4Nzc4MDIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU1ZGQyZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2Nsay9jbGstbWF4Nzc4MDIuYworKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBjbGstbWF4Nzc4MDIuYyAtIENsb2NrIGRyaXZlciBmb3IgTWF4aW0gNzc4MDIKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgR29vZ2xlLCBJbmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgU2Ftc3VuZyBFbGVjdG9ybmljcwotICogSm9uZ2h3YSBMZWUgPGpvbmdod2EzLmxlZUBzYW1zdW5nLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gY2xrLW1heDc3Njg2LmMKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9tYXg3NzY4Ni1wcml2YXRlLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9jbGtkZXYuaD4KLQotI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL21heGltLG1heDc3ODAyLmg+Ci0jaW5jbHVkZSAiY2xrLW1heC1nZW4uaCIKLQotI2RlZmluZSBNQVg3NzgwMl9DTE9DS19PUE1PREVfTUFTSwkweDEKLSNkZWZpbmUgTUFYNzc4MDJfQ0xPQ0tfTE9XX0pJVFRFUl9TSElGVCAweDMKLQotc3RhdGljIHN0cnVjdCBjbGtfaW5pdF9kYXRhIG1heDc3ODAyX2Nsa3NfaW5pdFtNQVg3NzgwMl9DTEtTX05VTV0gPSB7Ci0JW01BWDc3ODAyX0NMS18zMktfQVBdID0gewotCQkubmFtZSA9ICIzMmtoel9hcCIsCi0JCS5vcHMgPSAmbWF4X2dlbl9jbGtfb3BzLAotCX0sCi0JW01BWDc3ODAyX0NMS18zMktfQ1BdID0gewotCQkubmFtZSA9ICIzMmtoel9jcCIsCi0JCS5vcHMgPSAmbWF4X2dlbl9jbGtfb3BzLAotCX0sCi19OwotCi1zdGF0aWMgaW50IG1heDc3ODAyX2Nsa19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBtYXg3NzY4Nl9kZXYgKmlvZGV2ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwotCWludCByZXQ7Ci0KLQlyZXQgPSBtYXhfZ2VuX2Nsa19wcm9iZShwZGV2LCBpb2Rldi0+cmVnbWFwLCBNQVg3NzgwMl9SRUdfMzJLSFosCi0JCQkJbWF4Nzc4MDJfY2xrc19pbml0LCBNQVg3NzgwMl9DTEtTX05VTSk7Ci0KLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImdlbmVyaWMgcHJvYmUgZmFpbGVkICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qIEVuYWJsZSBsb3ctaml0dGVyIG1vZGUgb24gdGhlIDMya2h6IGNsb2Nrcy4gKi8KLQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoaW9kZXYtPnJlZ21hcCwgTUFYNzc4MDJfUkVHXzMyS0haLAotCQkJCSAxIDw8IE1BWDc3ODAyX0NMT0NLX0xPV19KSVRURVJfU0hJRlQsCi0JCQkJIDEgPDwgTUFYNzc4MDJfQ0xPQ0tfTE9XX0pJVFRFUl9TSElGVCk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBlbmFibGUgbG93LWppdHRlciBtb2RlXG4iKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4Nzc4MDJfY2xrX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybiBtYXhfZ2VuX2Nsa19yZW1vdmUocGRldiwgTUFYNzc4MDJfQ0xLU19OVU0pOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBtYXg3NzgwMl9jbGtfaWRbXSA9IHsKLQl7ICJtYXg3NzgwMi1jbGsiLCAwfSwKLQl7IH0sCi19OwotTU9EVUxFX0RFVklDRV9UQUJMRShwbGF0Zm9ybSwgbWF4Nzc4MDJfY2xrX2lkKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbWF4Nzc4MDJfY2xrX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSAgPSAibWF4Nzc4MDItY2xrIiwKLQl9LAotCS5wcm9iZSA9IG1heDc3ODAyX2Nsa19wcm9iZSwKLQkucmVtb3ZlID0gbWF4Nzc4MDJfY2xrX3JlbW92ZSwKLQkuaWRfdGFibGUgPSBtYXg3NzgwMl9jbGtfaWQsCi19OwotCi1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG1heDc3ODAyX2Nsa19kcml2ZXIpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIk1BWElNIDc3ODAyIENsb2NrIERyaXZlciIpOwotTU9EVUxFX0FVVEhPUigiSmF2aWVyIE1hcnRpbmV6IENhbmlsbGFzIDxqYXZpZXJAb3NnLnNhbXN1bmcuY29tIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstbWI4NnM3eC5jIGIvZHJpdmVycy9jbGsvY2xrLW1iODZzN3guYwppbmRleCBlMDgxNzc1Li4yYTgzYTNmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLW1iODZzN3guYworKysgYi9kcml2ZXJzL2Nsay9jbGstbWI4NnM3eC5jCkBAIC0zMjcsMTAgKzMyNywxMSBAQAogCS5zZXRfcmF0ZSA9IGNsY19zZXRfcmF0ZSwKIH07CiAKLXN0cnVjdCBjbGsgKm1iODZzN3hfY2xjbGtfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqY3B1X2RldikKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICptYjg2czd4X2NsY2xrX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmNwdV9kZXYpCiB7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKIAlzdHJ1Y3QgY2xfY2xrICpjbGM7CisJaW50IHJldDsKIAogCWNsYyA9IGt6YWxsb2Moc2l6ZW9mKCpjbGMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNsYykKQEAgLTM0NCwxNCArMzQ1LDE3IEBACiAJaW5pdC5mbGFncyA9IENMS19HRVRfUkFURV9OT0NBQ0hFOwogCWluaXQubnVtX3BhcmVudHMgPSAwOwogCi0JcmV0dXJuIGRldm1fY2xrX3JlZ2lzdGVyKGNwdV9kZXYsICZjbGMtPmh3KTsKKwlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcihjcHVfZGV2LCAmY2xjLT5odyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwlyZXR1cm4gJmNsYy0+aHc7CiB9CiAKIHN0YXRpYyBpbnQgbWI4NnM3eF9jbGNsa19vZl9pbml0KHZvaWQpCiB7CiAJaW50IGNwdSwgcmV0ID0gLUVOT0RFVjsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAogCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZ1aml0c3UsbWI4NnM3MC1zY2ItMS4wIik7CiAJaWYgKCFucCB8fCAhb2ZfZGV2aWNlX2lzX2F2YWlsYWJsZShucCkpCkBAIC0zNjUsMTIgKzM2OSwxMiBAQAogCQkJY29udGludWU7CiAJCX0KIAotCQljbGsgPSBtYjg2czd4X2NsY2xrX3JlZ2lzdGVyKGNwdV9kZXYpOwotCQlpZiAoSVNfRVJSKGNsaykpIHsKKwkJaHcgPSBtYjg2czd4X2NsY2xrX3JlZ2lzdGVyKGNwdV9kZXYpOworCQlpZiAoSVNfRVJSKGh3KSkgewogCQkJcHJfZXJyKCJmYWlsZWQgdG8gcmVnaXN0ZXIgY3B1JWQgY2xvY2tcbiIsIGNwdSk7CiAJCQljb250aW51ZTsKIAkJfQotCQlpZiAoY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGssIE5VTEwsIGRldl9uYW1lKGNwdV9kZXYpKSkgeworCQlpZiAoY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgTlVMTCwgZGV2X25hbWUoY3B1X2RldikpKSB7CiAJCQlwcl9lcnIoImZhaWxlZCB0byByZWdpc3RlciBjcHUlZCBjbG9jayBsb29rdXBcbiIsIGNwdSk7CiAJCQljb250aW51ZTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLW1veGFydC5jIGIvZHJpdmVycy9jbGsvY2xrLW1veGFydC5jCmluZGV4IGYzN2Y3MTkuLmI4NmRhYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay1tb3hhcnQuYworKysgYi9kcml2ZXJzL2Nsay9jbGstbW94YXJ0LmMKQEAgLTE5LDcgKzE5LDggQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBtb3hhcnRfb2ZfcGxsX2Nsa19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKIHsKIAlzdGF0aWMgdm9pZCBfX2lvbWVtICpiYXNlOwotCXN0cnVjdCBjbGsgKmNsaywgKnJlZl9jbGs7CisJc3RydWN0IGNsa19odyAqaHc7CisJc3RydWN0IGNsayAqcmVmX2NsazsKIAl1bnNpZ25lZCBpbnQgbXVsOwogCWNvbnN0IGNoYXIgKm5hbWUgPSBub2RlLT5uYW1lOwogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lOwpAQCAtNDIsMTQgKzQzLDE0IEBACiAJCXJldHVybjsKIAl9CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXJfZml4ZWRfZmFjdG9yKE5VTEwsIG5hbWUsIHBhcmVudF9uYW1lLCAwLCBtdWwsIDEpOwotCWlmIChJU19FUlIoY2xrKSkgeworCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLCBuYW1lLCBwYXJlbnRfbmFtZSwgMCwgbXVsLCAxKTsKKwlpZiAoSVNfRVJSKGh3KSkgewogCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgY2xvY2tcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CiAJCXJldHVybjsKIAl9CiAKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgTlVMTCwgbmFtZSk7Ci0Jb2ZfY2xrX2FkZF9wcm92aWRlcihub2RlLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgTlVMTCwgbmFtZSk7CisJb2ZfY2xrX2FkZF9od19wcm92aWRlcihub2RlLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOwogfQogQ0xLX09GX0RFQ0xBUkUobW94YXJ0X3BsbF9jbG9jaywgIm1veGEsbW94YXJ0LXBsbC1jbG9jayIsCiAJICAgICAgIG1veGFydF9vZl9wbGxfY2xrX2luaXQpOwpAQCAtNTcsNyArNTgsOCBAQAogc3RhdGljIHZvaWQgX19pbml0IG1veGFydF9vZl9hcGJfY2xrX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlKQogewogCXN0YXRpYyB2b2lkIF9faW9tZW0gKmJhc2U7Ci0Jc3RydWN0IGNsayAqY2xrLCAqcGxsX2NsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKKwlzdHJ1Y3QgY2xrICpwbGxfY2xrOwogCXVuc2lnbmVkIGludCBkaXYsIHZhbDsKIAl1bnNpZ25lZCBpbnQgZGl2X2lkeFtdID0geyAyLCAzLCA0LCA2LCA4fTsKIAljb25zdCBjaGFyICpuYW1lID0gbm9kZS0+bmFtZTsKQEAgLTg1LDE0ICs4NywxNCBAQAogCQlyZXR1cm47CiAJfQogCi0JY2xrID0gY2xrX3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLCBuYW1lLCBwYXJlbnRfbmFtZSwgMCwgMSwgZGl2KTsKLQlpZiAoSVNfRVJSKGNsaykpIHsKKwlodyA9IGNsa19od19yZWdpc3Rlcl9maXhlZF9mYWN0b3IoTlVMTCwgbmFtZSwgcGFyZW50X25hbWUsIDAsIDEsIGRpdik7CisJaWYgKElTX0VSUihodykpIHsKIAkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIGNsb2NrXG4iLCBub2RlLT5mdWxsX25hbWUpOwogCQlyZXR1cm47CiAJfQogCi0JY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGssIE5VTEwsIG5hbWUpOwotCW9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoaHcsIE5VTEwsIG5hbWUpOworCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsIGh3KTsKIH0KIENMS19PRl9ERUNMQVJFKG1veGFydF9hcGJfY2xvY2ssICJtb3hhLG1veGFydC1hcGItY2xvY2siLAogCSAgICAgICBtb3hhcnRfb2ZfYXBiX2Nsa19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1uc3BpcmUuYyBiL2RyaXZlcnMvY2xrL2Nsay1uc3BpcmUuYwppbmRleCA2NGYxOTZhLi5mODYxMDExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9jbGstbnNwaXJlLmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLW5zcGlyZS5jCkBAIC02OSw3ICs2OSw3IEBACiB7CiAJdTMyIHZhbDsKIAl2b2lkIF9faW9tZW0gKmlvOwotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAljb25zdCBjaGFyICpjbGtfbmFtZSA9IG5vZGUtPm5hbWU7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CiAJc3RydWN0IG5zcGlyZV9jbGtfaW5mbyBpbmZvOwpAQCAtODUsMTAgKzg1LDEwIEBACiAJb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobm9kZSwgImNsb2NrLW91dHB1dC1uYW1lcyIsICZjbGtfbmFtZSk7CiAJcGFyZW50X25hbWUgPSBvZl9jbGtfZ2V0X3BhcmVudF9uYW1lKG5vZGUsIDApOwogCi0JY2xrID0gY2xrX3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLCBjbGtfbmFtZSwgcGFyZW50X25hbWUsIDAsCi0JCQkJCTEsIGluZm8uYmFzZV9haGJfcmF0aW8pOwotCWlmICghSVNfRVJSKGNsaykpCi0JCW9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLCBjbGtfbmFtZSwgcGFyZW50X25hbWUsIDAsCisJCQkJCSAgMSwgaW5mby5iYXNlX2FoYl9yYXRpbyk7CisJaWYgKCFJU19FUlIoaHcpKQorCQlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBuc3BpcmVfYWhiZGl2X3NldHVwX2N4KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKQEAgLTExMSw3ICsxMTEsNyBAQAogewogCXUzMiB2YWw7CiAJdm9pZCBfX2lvbWVtICppbzsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19odyAqaHc7CiAJY29uc3QgY2hhciAqY2xrX25hbWUgPSBub2RlLT5uYW1lOwogCXN0cnVjdCBuc3BpcmVfY2xrX2luZm8gaW5mbzsKIApAQCAtMTI1LDkgKzEyNSwxMCBAQAogCiAJb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobm9kZSwgImNsb2NrLW91dHB1dC1uYW1lcyIsICZjbGtfbmFtZSk7CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXJfZml4ZWRfcmF0ZShOVUxMLCBjbGtfbmFtZSwgTlVMTCwgMCwgaW5mby5iYXNlX2Nsb2NrKTsKLQlpZiAoIUlTX0VSUihjbGspKQotCQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKKwlodyA9IGNsa19od19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsIGNsa19uYW1lLCBOVUxMLCAwLAorCQkJCQlpbmZvLmJhc2VfY2xvY2spOworCWlmICghSVNfRVJSKGh3KSkKKwkJb2ZfY2xrX2FkZF9od19wcm92aWRlcihub2RlLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOwogCWVsc2UKIAkJcmV0dXJuOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstcGFsbWFzLmMgYi9kcml2ZXJzL2Nsay9jbGstcGFsbWFzLmMKaW5kZXggODMyODg2My4uMzFmNTkwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLXBhbG1hcy5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay1wYWxtYXMuYwpAQCAtNDEsNyArNDEsNiBAQAogCiBzdHJ1Y3QgcGFsbWFzX2Nsb2NrX2luZm8gewogCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlzdHJ1Y3QgY2xrICpjbGs7CiAJc3RydWN0IGNsa19odyBodzsKIAlzdHJ1Y3QgcGFsbWFzICpwYWxtYXM7CiAJY29uc3Qgc3RydWN0IHBhbG1hc19jbGszMmtfZGVzYyAqY2xrX2Rlc2M7CkBAIC0yMTgsNyArMjE3LDcgQEAKIAl9CiAKIAlpZiAoY2luZm8tPmV4dF9jb250cm9sX3BpbikgewotCQlyZXQgPSBjbGtfcHJlcGFyZShjaW5mby0+Y2xrKTsKKwkJcmV0ID0gY2xrX3ByZXBhcmUoY2luZm8tPmh3LmNsayk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlkZXZfZXJyKGNpbmZvLT5kZXYsICJDbG9jayBwcmVwIGZhaWxlZCwgJWRcbiIsIHJldCk7CiAJCQlyZXR1cm4gcmV0OwpAQCAtMjQyLDcgKzI0MSw2IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAJY29uc3Qgc3RydWN0IHBhbG1hc19jbGtzX29mX21hdGNoX2RhdGEgKm1hdGNoX2RhdGE7CiAJc3RydWN0IHBhbG1hc19jbG9ja19pbmZvICpjaW5mbzsKLQlzdHJ1Y3QgY2xrICpjbGs7CiAJaW50IHJldDsKIAogCW1hdGNoX2RhdGEgPSBvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGEoJnBkZXYtPmRldik7CkBAIC0yNjEsMjIgKzI1OSwyMCBAQAogCiAJY2luZm8tPmNsa19kZXNjID0gJm1hdGNoX2RhdGEtPmRlc2M7CiAJY2luZm8tPmh3LmluaXQgPSAmbWF0Y2hfZGF0YS0+aW5pdDsKLQljbGsgPSBkZXZtX2Nsa19yZWdpc3RlcigmcGRldi0+ZGV2LCAmY2luZm8tPmh3KTsKLQlpZiAoSVNfRVJSKGNsaykpIHsKLQkJcmV0ID0gUFRSX0VSUihjbGspOworCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZjaW5mby0+aHcpOworCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbCB0byByZWdpc3RlciBjbG9jayAlcywgJWRcbiIsCiAJCQltYXRjaF9kYXRhLT5kZXNjLmNsa19uYW1lLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCWNpbmZvLT5jbGsgPSBjbGs7CiAJcmV0ID0gcGFsbWFzX2Nsa3NfaW5pdF9jb25maWd1cmUoY2luZm8pOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNsb2NrIGNvbmZpZyBmYWlsZWQsICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9IG9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjaW5mby0+Y2xrKTsKKwlyZXQgPSBvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCAmY2luZm8tPmh3KTsKIAlpZiAocmV0IDwgMCkKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbCB0byBhZGQgY2xvY2sgZHJpdmVyLCAlZFxuIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLXB3bS5jIGIvZHJpdmVycy9jbGsvY2xrLXB3bS5jCmluZGV4IDE2MzBhMWYuLjhjYjlkMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay1wd20uYworKysgYi9kcml2ZXJzL2Nsay9jbGstcHdtLmMKQEAgLTYxLDcgKzYxLDYgQEAKIAlzdHJ1Y3QgcHdtX2RldmljZSAqcHdtOwogCXN0cnVjdCBwd21fYXJncyBwYXJnczsKIAljb25zdCBjaGFyICpjbGtfbmFtZTsKLQlzdHJ1Y3QgY2xrICpjbGs7CiAJaW50IHJldDsKIAogCWNsa19wd20gPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpjbGtfcHdtKSwgR0ZQX0tFUk5FTCk7CkBAIC0xMDcsMTEgKzEwNiwxMSBAQAogCiAJY2xrX3B3bS0+cHdtID0gcHdtOwogCWNsa19wd20tPmh3LmluaXQgPSAmaW5pdDsKLQljbGsgPSBkZXZtX2Nsa19yZWdpc3RlcigmcGRldi0+ZGV2LCAmY2xrX3B3bS0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkKLQkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKKwlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcigmcGRldi0+ZGV2LCAmY2xrX3B3bS0+aHcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKLQlyZXR1cm4gb2ZfY2xrX2FkZF9wcm92aWRlcihub2RlLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJcmV0dXJuIG9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsICZjbGtfcHdtLT5odyk7CiB9CiAKIHN0YXRpYyBpbnQgY2xrX3B3bV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1xb3JpcS5jIGIvZHJpdmVycy9jbGsvY2xrLXFvcmlxLmMKaW5kZXggNTg1NjZhMTcuLjIwYjEwNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay1xb3JpcS5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay1xb3JpcS5jCkBAIC03NjYsNyArNzY2LDExIEBACiAJaWYgKCFod2MpCiAJCXJldHVybiBOVUxMOwogCi0JaHdjLT5yZWcgPSBjZy0+cmVncyArIDB4MjAgKiBpZHg7CisJaWYgKGNnLT5pbmZvLmZsYWdzICYgQ0dfVkVSMykKKwkJaHdjLT5yZWcgPSBjZy0+cmVncyArIDB4NzAwMDAgKyAweDIwICogaWR4OworCWVsc2UKKwkJaHdjLT5yZWcgPSBjZy0+cmVncyArIDB4MjAgKiBpZHg7CisKIAlod2MtPmluZm8gPSBjZy0+aW5mby5jbXV4X2dyb3Vwc1tjZy0+aW5mby5jbXV4X3RvX2dyb3VwW2lkeF1dOwogCiAJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1yazgwOC5jIGIvZHJpdmVycy9jbGsvY2xrLXJrODA4LmMKaW5kZXggNzQzODMwMy4uNjQ2MWYyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLXJrODA4LmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLXJrODA4LmMKQEAgLTIyLDExICsyMiw4IEBACiAjaW5jbHVkZSA8bGludXgvbWZkL3JrODA4Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAKLSNkZWZpbmUgUks4MDhfTlJfT1VUUFVUIDIKLQogc3RydWN0IHJrODA4X2Nsa291dCB7CiAJc3RydWN0IHJrODA4ICpyazgwODsKLQlzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSBjbGtfZGF0YTsKIAlzdHJ1Y3QgY2xrX2h3CQljbGtvdXQxX2h3OwogCXN0cnVjdCBjbGtfaHcJCWNsa291dDJfaHc7CiB9OwpAQCAtODUsMTQgKzgyLDI4IEBACiAJLnJlY2FsY19yYXRlID0gcms4MDhfY2xrb3V0X3JlY2FsY19yYXRlLAogfTsKIAorc3RhdGljIHN0cnVjdCBjbGtfaHcgKgorb2ZfY2xrX3JrODA4X2dldChzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpjbGtzcGVjLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCByazgwOF9jbGtvdXQgKnJrODA4X2Nsa291dCA9IGRhdGE7CisJdW5zaWduZWQgaW50IGlkeCA9IGNsa3NwZWMtPmFyZ3NbMF07CisKKwlpZiAoaWR4ID49IDIpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBpbmRleCAldVxuIiwgX19mdW5jX18sIGlkeCk7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKworCXJldHVybiBpZHggPyAmcms4MDhfY2xrb3V0LT5jbGtvdXQyX2h3IDogJnJrODA4X2Nsa291dC0+Y2xrb3V0MV9odzsKK30KKwogc3RhdGljIGludCByazgwOF9jbGtvdXRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgcms4MDggKnJrODA4ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSByazgwOC0+aTJjOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IGNsaWVudC0+ZGV2Lm9mX25vZGU7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdCA9IHt9OwotCXN0cnVjdCBjbGsgKipjbGtfdGFibGU7CiAJc3RydWN0IHJrODA4X2Nsa291dCAqcms4MDhfY2xrb3V0OworCWludCByZXQ7CiAKIAlyazgwOF9jbGtvdXQgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LAogCQkJCSAgICBzaXplb2YoKnJrODA4X2Nsa291dCksIEdGUF9LRVJORUwpOwpAQCAtMTAxLDExICsxMTIsNiBAQAogCiAJcms4MDhfY2xrb3V0LT5yazgwOCA9IHJrODA4OwogCi0JY2xrX3RhYmxlID0gZGV2bV9rY2FsbG9jKCZjbGllbnQtPmRldiwgUks4MDhfTlJfT1VUUFVULAotCQkJCSBzaXplb2Yoc3RydWN0IGNsayAqKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjbGtfdGFibGUpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJaW5pdC5wYXJlbnRfbmFtZXMgPSBOVUxMOwogCWluaXQubnVtX3BhcmVudHMgPSAwOwogCWluaXQubmFtZSA9ICJyazgwOC1jbGtvdXQxIjsKQEAgLTExNiwxMCArMTIyLDkgQEAKIAlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleChub2RlLCAiY2xvY2stb3V0cHV0LW5hbWVzIiwKIAkJCQkgICAgICAwLCAmaW5pdC5uYW1lKTsKIAotCWNsa190YWJsZVswXSA9IGRldm1fY2xrX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwKLQkJCQkJICZyazgwOF9jbGtvdXQtPmNsa291dDFfaHcpOwotCWlmIChJU19FUlIoY2xrX3RhYmxlWzBdKSkKLQkJcmV0dXJuIFBUUl9FUlIoY2xrX3RhYmxlWzBdKTsKKwlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcigmY2xpZW50LT5kZXYsICZyazgwOF9jbGtvdXQtPmNsa291dDFfaHcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlpbml0Lm5hbWUgPSAicms4MDgtY2xrb3V0MiI7CiAJaW5pdC5vcHMgPSAmcms4MDhfY2xrb3V0Ml9vcHM7CkBAIC0xMjksMTYgKzEzNCwxMSBAQAogCW9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nX2luZGV4KG5vZGUsICJjbG9jay1vdXRwdXQtbmFtZXMiLAogCQkJCSAgICAgIDEsICZpbml0Lm5hbWUpOwogCi0JY2xrX3RhYmxlWzFdID0gZGV2bV9jbGtfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LAotCQkJCQkgJnJrODA4X2Nsa291dC0+Y2xrb3V0Ml9odyk7Ci0JaWYgKElTX0VSUihjbGtfdGFibGVbMV0pKQotCQlyZXR1cm4gUFRSX0VSUihjbGtfdGFibGVbMV0pOworCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJnJrODA4X2Nsa291dC0+Y2xrb3V0Ml9odyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAotCXJrODA4X2Nsa291dC0+Y2xrX2RhdGEuY2xrcyA9IGNsa190YWJsZTsKLQlyazgwOF9jbGtvdXQtPmNsa19kYXRhLmNsa19udW0gPSBSSzgwOF9OUl9PVVRQVVQ7Ci0KLQlyZXR1cm4gb2ZfY2xrX2FkZF9wcm92aWRlcihub2RlLCBvZl9jbGtfc3JjX29uZWNlbGxfZ2V0LAotCQkJCSAgICZyazgwOF9jbGtvdXQtPmNsa19kYXRhKTsKKwlyZXR1cm4gb2ZfY2xrX2FkZF9od19wcm92aWRlcihub2RlLCBvZl9jbGtfcms4MDhfZ2V0LCByazgwOF9jbGtvdXQpOwogfQogCiBzdGF0aWMgaW50IHJrODA4X2Nsa291dF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1zY3BpLmMgYi9kcml2ZXJzL2Nsay9jbGstc2NwaS5jCmluZGV4IDY5NjJlZTUuLjJhM2U5ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay1zY3BpLmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLXNjcGkuYwpAQCAtMTQ2LDEzICsxNDYsMTMgQEAKIAl7fQogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgKgorc3RhdGljIGludAogc2NwaV9jbGtfb3BzX2luaXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCwKIAkJICBzdHJ1Y3Qgc2NwaV9jbGsgKnNjbGssIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKLQlzdHJ1Y3QgY2xrICpjbGs7CiAJdW5zaWduZWQgbG9uZyBtaW4gPSAwLCBtYXggPSAwOworCWludCByZXQ7CiAKIAlpbml0Lm5hbWUgPSBuYW1lOwogCWluaXQuZmxhZ3MgPSAwOwpAQCAtMTY0LDE4ICsxNjQsMTggQEAKIAlpZiAoaW5pdC5vcHMgPT0gJnNjcGlfZHZmc19vcHMpIHsKIAkJc2Nsay0+aW5mbyA9IHNjbGstPnNjcGlfb3BzLT5kdmZzX2dldF9pbmZvKHNjbGstPmlkKTsKIAkJaWYgKElTX0VSUihzY2xrLT5pbmZvKSkKLQkJCXJldHVybiBOVUxMOworCQkJcmV0dXJuIFBUUl9FUlIoc2Nsay0+aW5mbyk7CiAJfSBlbHNlIGlmIChpbml0Lm9wcyA9PSAmc2NwaV9jbGtfb3BzKSB7CiAJCWlmIChzY2xrLT5zY3BpX29wcy0+Y2xrX2dldF9yYW5nZShzY2xrLT5pZCwgJm1pbiwgJm1heCkgfHwgIW1heCkKLQkJCXJldHVybiBOVUxMOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJfSBlbHNlIHsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWNsayA9IGRldm1fY2xrX3JlZ2lzdGVyKGRldiwgJnNjbGstPmh3KTsKLQlpZiAoIUlTX0VSUihjbGspICYmIG1heCkKKwlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcihkZXYsICZzY2xrLT5odyk7CisJaWYgKCFyZXQgJiYgbWF4KQogCQljbGtfaHdfc2V0X3JhdGVfcmFuZ2UoJnNjbGstPmh3LCBtaW4sIG1heCk7Ci0JcmV0dXJuIGNsazsKKwlyZXR1cm4gcmV0OwogfQogCiBzdHJ1Y3Qgc2NwaV9jbGtfZGF0YSB7CkBAIC0xODMsNyArMTgzLDcgQEAKIAl1bnNpZ25lZCBpbnQgY2xrX251bTsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICoKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICoKIHNjcGlfb2ZfY2xrX3NyY19nZXQoc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqY2xrc3BlYywgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgc2NwaV9jbGsgKnNjbGs7CkBAIC0xOTMsNyArMTkzLDcgQEAKIAlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBjbGtfZGF0YS0+Y2xrX251bTsgY291bnQrKykgewogCQlzY2xrID0gY2xrX2RhdGEtPmNsa1tjb3VudF07CiAJCWlmIChpZHggPT0gc2Nsay0+aWQpCi0JCQlyZXR1cm4gc2Nsay0+aHcuY2xrOworCQkJcmV0dXJuICZzY2xrLT5odzsKIAl9CiAKIAlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKQEAgLTIwMiw4ICsyMDIsNyBAQAogc3RhdGljIGludCBzY3BpX2Nsa19hZGQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAogCQkJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7Ci0Jc3RydWN0IGNsayAqKmNsa3M7Ci0JaW50IGlkeCwgY291bnQ7CisJaW50IGlkeCwgY291bnQsIGVycjsKIAlzdHJ1Y3Qgc2NwaV9jbGtfZGF0YSAqY2xrX2RhdGE7CiAKIAljb3VudCA9IG9mX3Byb3BlcnR5X2NvdW50X3N0cmluZ3MobnAsICJjbG9jay1vdXRwdXQtbmFtZXMiKTsKQEAgLTIyMiwxMCArMjIxLDYgQEAKIAlpZiAoIWNsa19kYXRhLT5jbGspCiAJCXJldHVybiAtRU5PTUVNOwogCi0JY2xrcyA9IGRldm1fa2NhbGxvYyhkZXYsIGNvdW50LCBzaXplb2YoKmNsa3MpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNsa3MpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJZm9yIChpZHggPSAwOyBpZHggPCBjb3VudDsgaWR4KyspIHsKIAkJc3RydWN0IHNjcGlfY2xrICpzY2xrOwogCQljb25zdCBjaGFyICpuYW1lOwpAQCAtMjQ5LDE1ICsyNDQsMTUgQEAKIAogCQlzY2xrLT5pZCA9IHZhbDsKIAotCQljbGtzW2lkeF0gPSBzY3BpX2Nsa19vcHNfaW5pdChkZXYsIG1hdGNoLCBzY2xrLCBuYW1lKTsKLQkJaWYgKElTX0VSUl9PUl9OVUxMKGNsa3NbaWR4XSkpCisJCWVyciA9IHNjcGlfY2xrX29wc19pbml0KGRldiwgbWF0Y2gsIHNjbGssIG5hbWUpOworCQlpZiAoZXJyKQogCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgY2xvY2sgJyVzJ1xuIiwgbmFtZSk7CiAJCWVsc2UKIAkJCWRldl9kYmcoZGV2LCAiUmVnaXN0ZXJlZCBjbG9jayAnJXMnXG4iLCBuYW1lKTsKIAkJY2xrX2RhdGEtPmNsa1tpZHhdID0gc2NsazsKIAl9CiAKLQlyZXR1cm4gb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgc2NwaV9vZl9jbGtfc3JjX2dldCwgY2xrX2RhdGEpOworCXJldHVybiBvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBzY3BpX29mX2Nsa19zcmNfZ2V0LCBjbGtfZGF0YSk7CiB9CiAKIHN0YXRpYyBpbnQgc2NwaV9jbG9ja3NfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstc2k1MTQuYyBiL2RyaXZlcnMvY2xrL2Nsay1zaTUxNC5jCmluZGV4IGNlZWYyNWIuLjA5YjY3MTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay1zaTUxNC5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay1zaTUxNC5jCkBAIC0zMDUsNyArMzA1LDYgQEAKIHsKIAlzdHJ1Y3QgY2xrX3NpNTE0ICpkYXRhOwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7Ci0Jc3RydWN0IGNsayAqY2xrOwogCWludCBlcnI7CiAKIAlkYXRhID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CkBAIC0zMzAsMTMgKzMyOSwxMyBAQAogCiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGF0YSk7CiAKLQljbGsgPSBkZXZtX2Nsa19yZWdpc3RlcigmY2xpZW50LT5kZXYsICZkYXRhLT5odyk7Ci0JaWYgKElTX0VSUihjbGspKSB7CisJZXJyID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmZGF0YS0+aHcpOworCWlmIChlcnIpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJjbG9jayByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKLQkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKKwkJcmV0dXJuIGVycjsKIAl9Ci0JZXJyID0gb2ZfY2xrX2FkZF9wcm92aWRlcihjbGllbnQtPmRldi5vZl9ub2RlLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsCi0JCQljbGspOworCWVyciA9IG9mX2Nsa19hZGRfaHdfcHJvdmlkZXIoY2xpZW50LT5kZXYub2Zfbm9kZSwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsCisJCQkJICAgICAmZGF0YS0+aHcpOwogCWlmIChlcnIpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ1bmFibGUgdG8gYWRkIGNsayBwcm92aWRlclxuIik7CiAJCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstc2k1MzUxLmMgYi9kcml2ZXJzL2Nsay9jbGstc2k1MzUxLmMKaW5kZXggYjFiYzEyYy4uYjA1MWRiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLXNpNTM1MS5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay1zaTUzNTEuYwpAQCAtNTQsNyArNTQsNiBAQAogCWVudW0gc2k1MzUxX3ZhcmlhbnQJdmFyaWFudDsKIAlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OwogCXN0cnVjdCByZWdtYXAJCSpyZWdtYXA7Ci0Jc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgb25lY2VsbDsKIAogCXN0cnVjdCBjbGsJCSpweHRhbDsKIAljb25zdCBjaGFyCQkqcHh0YWxfbmFtZTsKQEAgLTY2LDYgKzY1LDcgQEAKIAlzdHJ1Y3Qgc2k1MzUxX2h3X2RhdGEJcGxsWzJdOwogCXN0cnVjdCBzaTUzNTFfaHdfZGF0YQkqbXN5bnRoOwogCXN0cnVjdCBzaTUzNTFfaHdfZGF0YQkqY2xrb3V0OworCXNpemVfdAkJCW51bV9jbGtvdXQ7CiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNpNTM1MV9pbnB1dF9uYW1lc1tdID0gewpAQCAtMTMwNywxMSArMTMwNywzMSBAQAogCW9mX25vZGVfcHV0KGNoaWxkKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KKworc3RhdGljIHN0cnVjdCBjbGtfaHcgKgorc2k1MzM1MV9vZl9jbGtfZ2V0KHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmNsa3NwZWMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNpNTM1MV9kcml2ZXJfZGF0YSAqZHJ2ZGF0YSA9IGRhdGE7CisJdW5zaWduZWQgaW50IGlkeCA9IGNsa3NwZWMtPmFyZ3NbMF07CisKKwlpZiAoaWR4ID49IGRydmRhdGEtPm51bV9jbGtvdXQpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBpbmRleCAldVxuIiwgX19mdW5jX18sIGlkeCk7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKworCXJldHVybiAmZHJ2ZGF0YS0+Y2xrb3V0W2lkeF0uaHc7Cit9CiAjZWxzZQogc3RhdGljIGludCBzaTUzNTFfZHRfcGFyc2Uoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgZW51bSBzaTUzNTFfdmFyaWFudCB2YXJpYW50KQogewogCXJldHVybiAwOwogfQorCitzdGF0aWMgc3RydWN0IGNsa19odyAqCitzaTUzMzUxX29mX2Nsa19nZXQoc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqY2xrc3BlYywgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gTlVMTDsKK30KICNlbmRpZiAvKiBDT05GSUdfT0YgKi8KIAogc3RhdGljIGludCBzaTUzNTFfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCkBAIC0xMzIxLDcgKzEzNDEsNiBAQAogCXN0cnVjdCBzaTUzNTFfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAJc3RydWN0IHNpNTM1MV9kcml2ZXJfZGF0YSAqZHJ2ZGF0YTsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OwotCXN0cnVjdCBjbGsgKmNsazsKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZXNbNF07CiAJdTggbnVtX3BhcmVudHMsIG51bV9jbG9ja3M7CiAJaW50IHJldCwgbjsKQEAgLTE0MzgsMTAgKzE0NTcsOSBAQAogCQlpbml0Lm51bV9wYXJlbnRzID0gMTsKIAl9CiAJZHJ2ZGF0YS0+eHRhbC5pbml0ID0gJmluaXQ7Ci0JY2xrID0gZGV2bV9jbGtfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmZHJ2ZGF0YS0+eHRhbCk7Ci0JaWYgKElTX0VSUihjbGspKSB7CisJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmZHJ2ZGF0YS0+eHRhbCk7CisJaWYgKHJldCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInVuYWJsZSB0byByZWdpc3RlciAlc1xuIiwgaW5pdC5uYW1lKTsKLQkJcmV0ID0gUFRSX0VSUihjbGspOwogCQlnb3RvIGVycl9jbGs7CiAJfQogCkBAIC0xNDU2LDExICsxNDc0LDEwIEBACiAJCQlpbml0Lm51bV9wYXJlbnRzID0gMTsKIAkJfQogCQlkcnZkYXRhLT5jbGtpbi5pbml0ID0gJmluaXQ7Ci0JCWNsayA9IGRldm1fY2xrX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmRydmRhdGEtPmNsa2luKTsKLQkJaWYgKElTX0VSUihjbGspKSB7CisJCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmRydmRhdGEtPmNsa2luKTsKKwkJaWYgKHJldCkgewogCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgJXNcbiIsCiAJCQkJaW5pdC5uYW1lKTsKLQkJCXJldCA9IFBUUl9FUlIoY2xrKTsKIAkJCWdvdG8gZXJyX2NsazsKIAkJfQogCX0KQEAgLTE0ODAsMTAgKzE0OTcsOSBAQAogCWluaXQuZmxhZ3MgPSAwOwogCWluaXQucGFyZW50X25hbWVzID0gcGFyZW50X25hbWVzOwogCWluaXQubnVtX3BhcmVudHMgPSBudW1fcGFyZW50czsKLQljbGsgPSBkZXZtX2Nsa19yZWdpc3RlcigmY2xpZW50LT5kZXYsICZkcnZkYXRhLT5wbGxbMF0uaHcpOwotCWlmIChJU19FUlIoY2xrKSkgeworCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmRydmRhdGEtPnBsbFswXS5odyk7CisJaWYgKHJldCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInVuYWJsZSB0byByZWdpc3RlciAlc1xuIiwgaW5pdC5uYW1lKTsKLQkJcmV0ID0gUFRSX0VSUihjbGspOwogCQlnb3RvIGVycl9jbGs7CiAJfQogCkBAIC0xNTA1LDEwICsxNTIxLDkgQEAKIAkJaW5pdC5wYXJlbnRfbmFtZXMgPSBwYXJlbnRfbmFtZXM7CiAJCWluaXQubnVtX3BhcmVudHMgPSBudW1fcGFyZW50czsKIAl9Ci0JY2xrID0gZGV2bV9jbGtfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmZHJ2ZGF0YS0+cGxsWzFdLmh3KTsKLQlpZiAoSVNfRVJSKGNsaykpIHsKKwlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcigmY2xpZW50LT5kZXYsICZkcnZkYXRhLT5wbGxbMV0uaHcpOworCWlmIChyZXQpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgJXNcbiIsIGluaXQubmFtZSk7Ci0JCXJldCA9IFBUUl9FUlIoY2xrKTsKIAkJZ290byBlcnJfY2xrOwogCX0KIApAQCAtMTUyNCwxMyArMTUzOSw5IEBACiAJCQkJICAgICAgIHNpemVvZigqZHJ2ZGF0YS0+bXN5bnRoKSwgR0ZQX0tFUk5FTCk7CiAJZHJ2ZGF0YS0+Y2xrb3V0ID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgbnVtX2Nsb2NrcyAqCiAJCQkJICAgICAgIHNpemVvZigqZHJ2ZGF0YS0+Y2xrb3V0KSwgR0ZQX0tFUk5FTCk7CisJZHJ2ZGF0YS0+bnVtX2Nsa291dCA9IG51bV9jbG9ja3M7CiAKLQlkcnZkYXRhLT5vbmVjZWxsLmNsa19udW0gPSBudW1fY2xvY2tzOwotCWRydmRhdGEtPm9uZWNlbGwuY2xrcyA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsCi0JCW51bV9jbG9ja3MgKiBzaXplb2YoKmRydmRhdGEtPm9uZWNlbGwuY2xrcyksIEdGUF9LRVJORUwpOwotCi0JaWYgKFdBUk5fT04oIWRydmRhdGEtPm1zeW50aCB8fCAhZHJ2ZGF0YS0+Y2xrb3V0IHx8Ci0JCSAgICAhZHJ2ZGF0YS0+b25lY2VsbC5jbGtzKSkgeworCWlmIChXQVJOX09OKCFkcnZkYXRhLT5tc3ludGggfHwgIWRydmRhdGEtPmNsa291dCkpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJfY2xrOwogCX0KQEAgLTE1NDcsMTEgKzE1NTgsMTEgQEAKIAkJCWluaXQuZmxhZ3MgfD0gQ0xLX1NFVF9SQVRFX1BBUkVOVDsKIAkJaW5pdC5wYXJlbnRfbmFtZXMgPSBwYXJlbnRfbmFtZXM7CiAJCWluaXQubnVtX3BhcmVudHMgPSAyOwotCQljbGsgPSBkZXZtX2Nsa19yZWdpc3RlcigmY2xpZW50LT5kZXYsICZkcnZkYXRhLT5tc3ludGhbbl0uaHcpOwotCQlpZiAoSVNfRVJSKGNsaykpIHsKKwkJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LAorCQkJCQkgICAmZHJ2ZGF0YS0+bXN5bnRoW25dLmh3KTsKKwkJaWYgKHJldCkgewogCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgJXNcbiIsCiAJCQkJaW5pdC5uYW1lKTsKLQkJCXJldCA9IFBUUl9FUlIoY2xrKTsKIAkJCWdvdG8gZXJyX2NsazsKIAkJfQogCX0KQEAgLTE1NzUsMTkgKzE1ODYsMTkgQEAKIAkJCWluaXQuZmxhZ3MgfD0gQ0xLX1NFVF9SQVRFX1BBUkVOVDsKIAkJaW5pdC5wYXJlbnRfbmFtZXMgPSBwYXJlbnRfbmFtZXM7CiAJCWluaXQubnVtX3BhcmVudHMgPSBudW1fcGFyZW50czsKLQkJY2xrID0gZGV2bV9jbGtfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmZHJ2ZGF0YS0+Y2xrb3V0W25dLmh3KTsKLQkJaWYgKElTX0VSUihjbGspKSB7CisJCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwKKwkJCQkJICAgJmRydmRhdGEtPmNsa291dFtuXS5odyk7CisJCWlmIChyZXQpIHsKIAkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyICVzXG4iLAogCQkJCWluaXQubmFtZSk7Ci0JCQlyZXQgPSBQVFJfRVJSKGNsayk7CiAJCQlnb3RvIGVycl9jbGs7CiAJCX0KLQkJZHJ2ZGF0YS0+b25lY2VsbC5jbGtzW25dID0gY2xrOwogCiAJCS8qIHNldCBpbml0aWFsIGNsa291dCByYXRlICovCiAJCWlmIChwZGF0YS0+Y2xrb3V0W25dLnJhdGUgIT0gMCkgewogCQkJaW50IHJldDsKLQkJCXJldCA9IGNsa19zZXRfcmF0ZShjbGssIHBkYXRhLT5jbGtvdXRbbl0ucmF0ZSk7CisJCQlyZXQgPSBjbGtfc2V0X3JhdGUoZHJ2ZGF0YS0+Y2xrb3V0W25dLmh3LmNsaywKKwkJCQkJICAgcGRhdGEtPmNsa291dFtuXS5yYXRlKTsKIAkJCWlmIChyZXQgIT0gMCkgewogCQkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQ2Fubm90IHNldCByYXRlIDogJWRcbiIsCiAJCQkJCXJldCk7CkBAIC0xNTk1LDggKzE2MDYsOCBAQAogCQl9CiAJfQogCi0JcmV0ID0gb2ZfY2xrX2FkZF9wcm92aWRlcihjbGllbnQtPmRldi5vZl9ub2RlLCBvZl9jbGtfc3JjX29uZWNlbGxfZ2V0LAotCQkJCSAgJmRydmRhdGEtPm9uZWNlbGwpOworCXJldCA9IG9mX2Nsa19hZGRfaHdfcHJvdmlkZXIoY2xpZW50LT5kZXYub2Zfbm9kZSwgc2k1MzM1MV9vZl9jbGtfZ2V0LAorCQkJCSAgICAgZHJ2ZGF0YSk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInVuYWJsZSB0byBhZGQgY2xrIHByb3ZpZGVyXG4iKTsKIAkJZ290byBlcnJfY2xrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLXNpNTcwLmMgYi9kcml2ZXJzL2Nsay9jbGstc2k1NzAuYwppbmRleCBkNTY2NDg1Li42NDZhZjFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9jbGstc2k1NzAuYworKysgYi9kcml2ZXJzL2Nsay9jbGstc2k1NzAuYwpAQCAtNDA4LDcgKzQwOCw2IEBACiB7CiAJc3RydWN0IGNsa19zaTU3MCAqZGF0YTsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OwotCXN0cnVjdCBjbGsgKmNsazsKIAl1MzIgaW5pdGlhbF9mb3V0LCBmYWN0b3J5X2ZvdXQsIHN0YWJpbGl0eTsKIAlpbnQgZXJyOwogCWVudW0gY2xrX3NpNTcwX3ZhcmlhbnQgdmFyaWFudCA9IGlkLT5kcml2ZXJfZGF0YTsKQEAgLTQ2MiwxMyArNDYxLDEzIEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWNsayA9IGRldm1fY2xrX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmRhdGEtPmh3KTsKLQlpZiAoSVNfRVJSKGNsaykpIHsKKwllcnIgPSBkZXZtX2Nsa19od19yZWdpc3RlcigmY2xpZW50LT5kZXYsICZkYXRhLT5odyk7CisJaWYgKGVycikgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImNsb2NrIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOwotCQlyZXR1cm4gUFRSX0VSUihjbGspOworCQlyZXR1cm4gZXJyOwogCX0KLQllcnIgPSBvZl9jbGtfYWRkX3Byb3ZpZGVyKGNsaWVudC0+ZGV2Lm9mX25vZGUsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwKLQkJCWNsayk7CisJZXJyID0gb2ZfY2xrX2FkZF9od19wcm92aWRlcihjbGllbnQtPmRldi5vZl9ub2RlLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwKKwkJCQkgICAgICZkYXRhLT5odyk7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInVuYWJsZSB0byBhZGQgY2xrIHByb3ZpZGVyXG4iKTsKIAkJcmV0dXJuIGVycjsKQEAgLTQ3Nyw3ICs0NzYsNyBAQAogCS8qIFJlYWQgdGhlIHJlcXVlc3RlZCBpbml0aWFsIG91dHB1dCBmcmVxdWVuY3kgZnJvbSBkZXZpY2UgdHJlZSAqLwogCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIoY2xpZW50LT5kZXYub2Zfbm9kZSwgImNsb2NrLWZyZXF1ZW5jeSIsCiAJCQkJJmluaXRpYWxfZm91dCkpIHsKLQkJZXJyID0gY2xrX3NldF9yYXRlKGNsaywgaW5pdGlhbF9mb3V0KTsKKwkJZXJyID0gY2xrX3NldF9yYXRlKGRhdGEtPmh3LmNsaywgaW5pdGlhbF9mb3V0KTsKIAkJaWYgKGVycikgewogCQkJb2ZfY2xrX2RlbF9wcm92aWRlcihjbGllbnQtPmRldi5vZl9ub2RlKTsKIAkJCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstdHdsNjA0MC5jIGIvZHJpdmVycy9jbGsvY2xrLXR3bDYwNDAuYwppbmRleCA2OTdjNjY3Li43YjIyMmE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9jbGstdHdsNjA0MC5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay10d2w2MDQwLmMKQEAgLTI2LDYwICsyNiw3MyBAQAogI2luY2x1ZGUgPGxpbnV4L21mZC90d2w2MDQwLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CiAKLXN0cnVjdCB0d2w2MDQwX2NsayB7CitzdHJ1Y3QgdHdsNjA0MF9wZG1jbGsgewogCXN0cnVjdCB0d2w2MDQwICp0d2w2MDQwOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlzdHJ1Y3QgY2xrX2h3IG1jcGRtX2ZjbGs7Ci0Jc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGtfaHcgcGRtY2xrX2h3OwogCWludCBlbmFibGVkOwogfTsKIAotc3RhdGljIGludCB0d2w2MDQwX2JpdGNsa19pc19lbmFibGVkKHN0cnVjdCBjbGtfaHcgKmh3KQorc3RhdGljIGludCB0d2w2MDQwX3BkbWNsa19pc19wcmVwYXJlZChzdHJ1Y3QgY2xrX2h3ICpodykKIHsKLQlzdHJ1Y3QgdHdsNjA0MF9jbGsgKnR3bDYwNDBfY2xrID0gY29udGFpbmVyX29mKGh3LCBzdHJ1Y3QgdHdsNjA0MF9jbGssCi0JCQkJCQkgICAgICAgbWNwZG1fZmNsayk7Ci0JcmV0dXJuIHR3bDYwNDBfY2xrLT5lbmFibGVkOworCXN0cnVjdCB0d2w2MDQwX3BkbWNsayAqcGRtY2xrID0gY29udGFpbmVyX29mKGh3LCBzdHJ1Y3QgdHdsNjA0MF9wZG1jbGssCisJCQkJCQkgICAgIHBkbWNsa19odyk7CisKKwlyZXR1cm4gcGRtY2xrLT5lbmFibGVkOwogfQogCi1zdGF0aWMgaW50IHR3bDYwNDBfYml0Y2xrX3ByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCitzdGF0aWMgaW50IHR3bDYwNDBfcGRtY2xrX3ByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCiB7Ci0Jc3RydWN0IHR3bDYwNDBfY2xrICp0d2w2MDQwX2NsayA9IGNvbnRhaW5lcl9vZihodywgc3RydWN0IHR3bDYwNDBfY2xrLAotCQkJCQkJICAgICAgIG1jcGRtX2ZjbGspOworCXN0cnVjdCB0d2w2MDQwX3BkbWNsayAqcGRtY2xrID0gY29udGFpbmVyX29mKGh3LCBzdHJ1Y3QgdHdsNjA0MF9wZG1jbGssCisJCQkJCQkgICAgIHBkbWNsa19odyk7CiAJaW50IHJldDsKIAotCXJldCA9IHR3bDYwNDBfcG93ZXIodHdsNjA0MF9jbGstPnR3bDYwNDAsIDEpOworCXJldCA9IHR3bDYwNDBfcG93ZXIocGRtY2xrLT50d2w2MDQwLCAxKTsKIAlpZiAoIXJldCkKLQkJdHdsNjA0MF9jbGstPmVuYWJsZWQgPSAxOworCQlwZG1jbGstPmVuYWJsZWQgPSAxOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgdHdsNjA0MF9iaXRjbGtfdW5wcmVwYXJlKHN0cnVjdCBjbGtfaHcgKmh3KQorc3RhdGljIHZvaWQgdHdsNjA0MF9wZG1jbGtfdW5wcmVwYXJlKHN0cnVjdCBjbGtfaHcgKmh3KQogewotCXN0cnVjdCB0d2w2MDQwX2NsayAqdHdsNjA0MF9jbGsgPSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCB0d2w2MDQwX2NsaywKLQkJCQkJCSAgICAgICBtY3BkbV9mY2xrKTsKKwlzdHJ1Y3QgdHdsNjA0MF9wZG1jbGsgKnBkbWNsayA9IGNvbnRhaW5lcl9vZihodywgc3RydWN0IHR3bDYwNDBfcGRtY2xrLAorCQkJCQkJICAgICBwZG1jbGtfaHcpOwogCWludCByZXQ7CiAKLQlyZXQgPSB0d2w2MDQwX3Bvd2VyKHR3bDYwNDBfY2xrLT50d2w2MDQwLCAwKTsKKwlyZXQgPSB0d2w2MDQwX3Bvd2VyKHBkbWNsay0+dHdsNjA0MCwgMCk7CiAJaWYgKCFyZXQpCi0JCXR3bDYwNDBfY2xrLT5lbmFibGVkID0gMDsKKwkJcGRtY2xrLT5lbmFibGVkID0gMDsKKwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgdHdsNjA0MF9tY3BkbV9vcHMgPSB7Ci0JLmlzX2VuYWJsZWQgPSB0d2w2MDQwX2JpdGNsa19pc19lbmFibGVkLAotCS5wcmVwYXJlID0gdHdsNjA0MF9iaXRjbGtfcHJlcGFyZSwKLQkudW5wcmVwYXJlID0gdHdsNjA0MF9iaXRjbGtfdW5wcmVwYXJlLAorc3RhdGljIHVuc2lnbmVkIGxvbmcgdHdsNjA0MF9wZG1jbGtfcmVjYWxjX3JhdGUoc3RydWN0IGNsa19odyAqaHcsCisJCQkJCQl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlKQoreworCXN0cnVjdCB0d2w2MDQwX3BkbWNsayAqcGRtY2xrID0gY29udGFpbmVyX29mKGh3LCBzdHJ1Y3QgdHdsNjA0MF9wZG1jbGssCisJCQkJCQkgICAgIHBkbWNsa19odyk7CisKKwlyZXR1cm4gdHdsNjA0MF9nZXRfc3lzY2xrKHBkbWNsay0+dHdsNjA0MCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyB0d2w2MDQwX3BkbWNsa19vcHMgPSB7CisJLmlzX3ByZXBhcmVkID0gdHdsNjA0MF9wZG1jbGtfaXNfcHJlcGFyZWQsCisJLnByZXBhcmUgPSB0d2w2MDQwX3BkbWNsa19wcmVwYXJlLAorCS51bnByZXBhcmUgPSB0d2w2MDQwX3BkbWNsa191bnByZXBhcmUsCisJLnJlY2FsY19yYXRlID0gdHdsNjA0MF9wZG1jbGtfcmVjYWxjX3JhdGUsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsa19pbml0X2RhdGEgd204MzF4X2Nsa291dF9pbml0ID0gewotCS5uYW1lID0gIm1jcGRtX2ZjbGsiLAotCS5vcHMgPSAmdHdsNjA0MF9tY3BkbV9vcHMsCitzdGF0aWMgc3RydWN0IGNsa19pbml0X2RhdGEgdHdsNjA0MF9wZG1jbGtfaW5pdCA9IHsKKwkubmFtZSA9ICJwZG1jbGsiLAorCS5vcHMgPSAmdHdsNjA0MF9wZG1jbGtfb3BzLAorCS5mbGFncyA9IENMS19HRVRfUkFURV9OT0NBQ0hFLAogfTsKIAotc3RhdGljIGludCB0d2w2MDQwX2Nsa19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCB0d2w2MDQwX3BkbWNsa19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCB0d2w2MDQwICp0d2w2MDQwID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwotCXN0cnVjdCB0d2w2MDQwX2NsayAqY2xrZGF0YTsKKwlzdHJ1Y3QgdHdsNjA0MF9wZG1jbGsgKmNsa2RhdGE7CisJaW50IHJldDsKIAogCWNsa2RhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpjbGtkYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjbGtkYXRhKQpAQCAtODgsMjYgKzEwMSwyOCBAQAogCWNsa2RhdGEtPmRldiA9ICZwZGV2LT5kZXY7CiAJY2xrZGF0YS0+dHdsNjA0MCA9IHR3bDYwNDA7CiAKLQljbGtkYXRhLT5tY3BkbV9mY2xrLmluaXQgPSAmd204MzF4X2Nsa291dF9pbml0OwotCWNsa2RhdGEtPmNsayA9IGRldm1fY2xrX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZjbGtkYXRhLT5tY3BkbV9mY2xrKTsKLQlpZiAoSVNfRVJSKGNsa2RhdGEtPmNsaykpCi0JCXJldHVybiBQVFJfRVJSKGNsa2RhdGEtPmNsayk7CisJY2xrZGF0YS0+cGRtY2xrX2h3LmluaXQgPSAmdHdsNjA0MF9wZG1jbGtfaW5pdDsKKwlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcigmcGRldi0+ZGV2LCAmY2xrZGF0YS0+cGRtY2xrX2h3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY2xrZGF0YSk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gb2ZfY2xrX2FkZF9od19wcm92aWRlcihwZGV2LT5kZXYucGFyZW50LT5vZl9ub2RlLAorCQkJCSAgICAgIG9mX2Nsa19od19zaW1wbGVfZ2V0LAorCQkJCSAgICAgICZjbGtkYXRhLT5wZG1jbGtfaHcpOwogfQogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0d2w2MDQwX2Nsa19kcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0d2w2MDQwX3BkbWNsa19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAidHdsNjA0MC1jbGsiLAorCQkubmFtZSA9ICJ0d2w2MDQwLXBkbWNsayIsCiAJfSwKLQkucHJvYmUgPSB0d2w2MDQwX2Nsa19wcm9iZSwKKwkucHJvYmUgPSB0d2w2MDQwX3BkbWNsa19wcm9iZSwKIH07CiAKLW1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIodHdsNjA0MF9jbGtfZHJpdmVyKTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIodHdsNjA0MF9wZG1jbGtfZHJpdmVyKTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJUV0w2MDQwIGNsb2NrIGRyaXZlciBmb3IgTWNQRE0gZnVuY3Rpb25hbCBjbG9jayIpOwogTU9EVUxFX0FVVEhPUigiUGV0ZXIgVWpmYWx1c2kgPHBldGVyLnVqZmFsdXNpQHRpLmNvbT4iKTsKLU1PRFVMRV9BTElBUygicGxhdGZvcm06dHdsNjA0MC1jbGsiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06dHdsNjA0MC1wZG1jbGsiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay12dDg1MDAuYyBiL2RyaXZlcnMvY2xrL2Nsay12dDg1MDAuYwppbmRleCAzNzM2OGEzLi40MTYxYTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9jbGstdnQ4NTAwLmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLXZ0ODUwMC5jCkBAIC0yMzIsNyArMjMyLDcgQEAKIHN0YXRpYyBfX2luaXQgdm9pZCB2dHdtX2RldmljZV9jbGtfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCiB7CiAJdTMyIGVuX3JlZywgZGl2X3JlZzsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19odyAqaHc7CiAJc3RydWN0IGNsa19kZXZpY2UgKmRldl9jbGs7CiAJY29uc3QgY2hhciAqY2xrX25hbWUgPSBub2RlLT5uYW1lOwogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lOwpAQCAtMzAxLDEzICszMDEsMTQgQEAKIAogCWRldl9jbGstPmh3LmluaXQgPSAmaW5pdDsKIAotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmZGV2X2Nsay0+aHcpOwotCWlmIChXQVJOX09OKElTX0VSUihjbGspKSkgeworCWh3ID0gJmRldl9jbGstPmh3OworCXJjID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsIGh3KTsKKwlpZiAoV0FSTl9PTihyYykpIHsKIAkJa2ZyZWUoZGV2X2Nsayk7CiAJCXJldHVybjsKIAl9Ci0JcmMgPSBvZl9jbGtfYWRkX3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgY2xrX25hbWUsIE5VTEwpOworCXJjID0gb2ZfY2xrX2FkZF9od19wcm92aWRlcihub2RlLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOworCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoaHcsIGNsa19uYW1lLCBOVUxMKTsKIH0KIENMS19PRl9ERUNMQVJFKHZ0ODUwMF9kZXZpY2UsICJ2aWEsdnQ4NTAwLWRldmljZS1jbG9jayIsIHZ0d21fZGV2aWNlX2Nsa19pbml0KTsKIApAQCAtNjgxLDcgKzY4Miw3IEBACiBzdGF0aWMgX19pbml0IHZvaWQgdnR3bV9wbGxfY2xrX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlLCBpbnQgcGxsX3R5cGUpCiB7CiAJdTMyIHJlZzsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19odyAqaHc7CiAJc3RydWN0IGNsa19wbGwgKnBsbF9jbGs7CiAJY29uc3QgY2hhciAqY2xrX25hbWUgPSBub2RlLT5uYW1lOwogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lOwpAQCAtNzE0LDEzICs3MTUsMTQgQEAKIAogCXBsbF9jbGstPmh3LmluaXQgPSAmaW5pdDsKIAotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmcGxsX2Nsay0+aHcpOwotCWlmIChXQVJOX09OKElTX0VSUihjbGspKSkgeworCWh3ID0gJnBsbF9jbGstPmh3OworCXJjID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZwbGxfY2xrLT5odyk7CisJaWYgKFdBUk5fT04ocmMpKSB7CiAJCWtmcmVlKHBsbF9jbGspOwogCQlyZXR1cm47CiAJfQotCXJjID0gb2ZfY2xrX2FkZF9wcm92aWRlcihub2RlLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7Ci0JY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGssIGNsa19uYW1lLCBOVUxMKTsKKwlyYyA9IG9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsIGh3KTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCBjbGtfbmFtZSwgTlVMTCk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLXdtODMxeC5jIGIvZHJpdmVycy9jbGsvY2xrLXdtODMxeC5jCmluZGV4IDg4ZGVmNGIuLmY0ZmRhYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay13bTgzMXguYworKysgYi9kcml2ZXJzL2Nsay9jbGstd204MzF4LmMKQEAgLTI0LDkgKzI0LDYgQEAKIAlzdHJ1Y3QgY2xrX2h3IHh0YWxfaHc7CiAJc3RydWN0IGNsa19odyBmbGxfaHc7CiAJc3RydWN0IGNsa19odyBjbGtvdXRfaHc7Ci0Jc3RydWN0IGNsayAqeHRhbDsKLQlzdHJ1Y3QgY2xrICpmbGw7Ci0Jc3RydWN0IGNsayAqY2xrb3V0OwogCWJvb2wgeHRhbF9lbmE7CiB9OwogCkBAIC0zNzAsMTkgKzM2NywxOSBAQAogCWNsa2RhdGEtPnh0YWxfZW5hID0gcmV0ICYgV004MzFYX1hUQUxfRU5BOwogCiAJY2xrZGF0YS0+eHRhbF9ody5pbml0ID0gJndtODMxeF94dGFsX2luaXQ7Ci0JY2xrZGF0YS0+eHRhbCA9IGRldm1fY2xrX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZjbGtkYXRhLT54dGFsX2h3KTsKLQlpZiAoSVNfRVJSKGNsa2RhdGEtPnh0YWwpKQotCQlyZXR1cm4gUFRSX0VSUihjbGtkYXRhLT54dGFsKTsKKwlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcigmcGRldi0+ZGV2LCAmY2xrZGF0YS0+eHRhbF9odyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWNsa2RhdGEtPmZsbF9ody5pbml0ID0gJndtODMxeF9mbGxfaW5pdDsKLQljbGtkYXRhLT5mbGwgPSBkZXZtX2Nsa19yZWdpc3RlcigmcGRldi0+ZGV2LCAmY2xrZGF0YS0+ZmxsX2h3KTsKLQlpZiAoSVNfRVJSKGNsa2RhdGEtPmZsbCkpCi0JCXJldHVybiBQVFJfRVJSKGNsa2RhdGEtPmZsbCk7CisJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmNsa2RhdGEtPmZsbF9odyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWNsa2RhdGEtPmNsa291dF9ody5pbml0ID0gJndtODMxeF9jbGtvdXRfaW5pdDsKLQljbGtkYXRhLT5jbGtvdXQgPSBkZXZtX2Nsa19yZWdpc3RlcigmcGRldi0+ZGV2LCAmY2xrZGF0YS0+Y2xrb3V0X2h3KTsKLQlpZiAoSVNfRVJSKGNsa2RhdGEtPmNsa291dCkpCi0JCXJldHVybiBQVFJfRVJSKGNsa2RhdGEtPmNsa291dCk7CisJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmNsa2RhdGEtPmNsa291dF9odyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNsa2RhdGEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGsteGdlbmUuYyBiL2RyaXZlcnMvY2xrL2Nsay14Z2VuZS5jCmluZGV4IDM0MzMxMzIuLjVkYWRkZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay14Z2VuZS5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay14Z2VuZS5jCkBAIC0yMTcsNiArMjE3LDIyNiBAQAogCXhnZW5lX3BsbGNsa19pbml0KG5wLCBQTExfVFlQRV9QQ1ApOwogfQogCisvKioKKyAqIHN0cnVjdCB4Z2VuZV9jbGtfcG1kIC0gUE1EIGNsb2NrCisgKgorICogQGh3OgkJaGFuZGxlIGJldHdlZW4gY29tbW9uIGFuZCBoYXJkd2FyZS1zcGVjaWZpYyBpbnRlcmZhY2VzCisgKiBAcmVnOglyZWdpc3RlciBjb250YWluaW5nIHRoZSBmcmFjdGlvbmFsIHNjYWxlIG11bHRpcGxpZXIgKHNjYWxlcikKKyAqIEBzaGlmdDoJc2hpZnQgdG8gdGhlIHVuaXQgYml0IGZpZWxkCisgKiBAZGVub206CTEvZGVub21pbmF0b3IgdW5pdAorICogQGxvY2s6CXJlZ2lzdGVyIGxvY2sKKyAqIEZsYWdzOgorICogWEdFTkVfQ0xLX1BNRF9TQ0FMRV9JTlZFUlRFRCAtIEJ5IGRlZmF1bHQgdGhlIHNjYWxlciBpcyB0aGUgdmFsdWUgcmVhZAorICoJZnJvbSB0aGUgcmVnaXN0ZXIgcGx1cyBvbmUuIEZvciBleGFtcGxlLAorICoJCTAgZm9yICgwICsgMSkgLyBkZW5vbSwKKyAqCQkxIGZvciAoMSArIDEpIC8gZGVub20gYW5kIGV0Yy4KKyAqCUlmIHRoaXMgZmxhZyBpcyBzZXQsIGl0IGlzCisgKgkJMCBmb3IgKGRlbm9tIC0gMCkgLyBkZW5vbSwKKyAqCQkxIGZvciAoZGVub20gLSAxKSAvIGRlbm9tIGFuZCBldGMuCisgKgorICovCitzdHJ1Y3QgeGdlbmVfY2xrX3BtZCB7CisJc3RydWN0IGNsa19odwlodzsKKwl2b2lkIF9faW9tZW0JKnJlZzsKKwl1OAkJc2hpZnQ7CisJdTMyCQltYXNrOworCXU2NAkJZGVub207CisJdTMyCQlmbGFnczsKKwlzcGlubG9ja190CSpsb2NrOworfTsKKworI2RlZmluZSB0b194Z2VuZV9jbGtfcG1kKF9odykgY29udGFpbmVyX29mKF9odywgc3RydWN0IHhnZW5lX2Nsa19wbWQsIGh3KQorCisjZGVmaW5lIFhHRU5FX0NMS19QTURfU0NBTEVfSU5WRVJURUQJQklUKDApCisjZGVmaW5lIFhHRU5FX0NMS19QTURfU0hJRlQJCTgKKyNkZWZpbmUgWEdFTkVfQ0xLX1BNRF9XSURUSAkJMworCitzdGF0aWMgdW5zaWduZWQgbG9uZyB4Z2VuZV9jbGtfcG1kX3JlY2FsY19yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LAorCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSkKK3sKKwlzdHJ1Y3QgeGdlbmVfY2xrX3BtZCAqZmQgPSB0b194Z2VuZV9jbGtfcG1kKGh3KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwl1NjQgcmV0LCBzY2FsZTsKKwl1MzIgdmFsOworCisJaWYgKGZkLT5sb2NrKQorCQlzcGluX2xvY2tfaXJxc2F2ZShmZC0+bG9jaywgZmxhZ3MpOworCWVsc2UKKwkJX19hY3F1aXJlKGZkLT5sb2NrKTsKKworCXZhbCA9IGNsa19yZWFkbChmZC0+cmVnKTsKKworCWlmIChmZC0+bG9jaykKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShmZC0+bG9jaywgZmxhZ3MpOworCWVsc2UKKwkJX19yZWxlYXNlKGZkLT5sb2NrKTsKKworCXJldCA9ICh1NjQpcGFyZW50X3JhdGU7CisKKwlzY2FsZSA9ICh2YWwgJiBmZC0+bWFzaykgPj4gZmQtPnNoaWZ0OworCWlmIChmZC0+ZmxhZ3MgJiBYR0VORV9DTEtfUE1EX1NDQUxFX0lOVkVSVEVEKQorCQlzY2FsZSA9IGZkLT5kZW5vbSAtIHNjYWxlOworCWVsc2UKKwkJc2NhbGUrKzsKKworCS8qIGZyZXEgPSBwYXJlbnRfcmF0ZSAqIHNjYWxlciAvIGRlbm9tICovCisJZG9fZGl2KHJldCwgZmQtPmRlbm9tKTsKKwlyZXQgKj0gc2NhbGU7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSAodTY0KXBhcmVudF9yYXRlOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGxvbmcgeGdlbmVfY2xrX3BtZF9yb3VuZF9yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LCB1bnNpZ25lZCBsb25nIHJhdGUsCisJCQkJICAgICB1bnNpZ25lZCBsb25nICpwYXJlbnRfcmF0ZSkKK3sKKwlzdHJ1Y3QgeGdlbmVfY2xrX3BtZCAqZmQgPSB0b194Z2VuZV9jbGtfcG1kKGh3KTsKKwl1NjQgcmV0LCBzY2FsZTsKKworCWlmICghcmF0ZSB8fCByYXRlID49ICpwYXJlbnRfcmF0ZSkKKwkJcmV0dXJuICpwYXJlbnRfcmF0ZTsKKworCS8qIGZyZXEgPSBwYXJlbnRfcmF0ZSAqIHNjYWxlciAvIGRlbm9tICovCisJcmV0ID0gcmF0ZSAqIGZkLT5kZW5vbTsKKwlzY2FsZSA9IERJVl9ST1VORF9VUF9VTEwocmV0LCAqcGFyZW50X3JhdGUpOworCisJcmV0ID0gKHU2NCkqcGFyZW50X3JhdGUgKiBzY2FsZTsKKwlkb19kaXYocmV0LCBmZC0+ZGVub20pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB4Z2VuZV9jbGtfcG1kX3NldF9yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LCB1bnNpZ25lZCBsb25nIHJhdGUsCisJCQkJICB1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlKQoreworCXN0cnVjdCB4Z2VuZV9jbGtfcG1kICpmZCA9IHRvX3hnZW5lX2Nsa19wbWQoaHcpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXU2NCBzY2FsZSwgcmV0OworCXUzMiB2YWw7CisKKwkvKgorCSAqIENvbXB1dGUgdGhlIHNjYWxlcjoKKwkgKgorCSAqIGZyZXEgPSBwYXJlbnRfcmF0ZSAqIHNjYWxlciAvIGRlbm9tLCBvcgorCSAqIHNjYWxlciA9IGZyZXEgKiBkZW5vbSAvIHBhcmVudF9yYXRlCisJICovCisJcmV0ID0gcmF0ZSAqIGZkLT5kZW5vbTsKKwlzY2FsZSA9IERJVl9ST1VORF9VUF9VTEwocmV0LCAodTY0KXBhcmVudF9yYXRlKTsKKworCS8qIENoZWNrIGlmIGludmVydGVkICovCisJaWYgKGZkLT5mbGFncyAmIFhHRU5FX0NMS19QTURfU0NBTEVfSU5WRVJURUQpCisJCXNjYWxlID0gZmQtPmRlbm9tIC0gc2NhbGU7CisJZWxzZQorCQlzY2FsZS0tOworCisJaWYgKGZkLT5sb2NrKQorCQlzcGluX2xvY2tfaXJxc2F2ZShmZC0+bG9jaywgZmxhZ3MpOworCWVsc2UKKwkJX19hY3F1aXJlKGZkLT5sb2NrKTsKKworCXZhbCA9IGNsa19yZWFkbChmZC0+cmVnKTsKKwl2YWwgJj0gfmZkLT5tYXNrOworCXZhbCB8PSAoc2NhbGUgPDwgZmQtPnNoaWZ0KTsKKwljbGtfd3JpdGVsKHZhbCwgZmQtPnJlZyk7CisKKwlpZiAoZmQtPmxvY2spCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZmQtPmxvY2ssIGZsYWdzKTsKKwllbHNlCisJCV9fcmVsZWFzZShmZC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIHhnZW5lX2Nsa19wbWRfb3BzID0geworCS5yZWNhbGNfcmF0ZSA9IHhnZW5lX2Nsa19wbWRfcmVjYWxjX3JhdGUsCisJLnJvdW5kX3JhdGUgPSB4Z2VuZV9jbGtfcG1kX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlID0geGdlbmVfY2xrX3BtZF9zZXRfcmF0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICoKK3hnZW5lX3JlZ2lzdGVyX2Nsa19wbWQoc3RydWN0IGRldmljZSAqZGV2LAorCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcGFyZW50X25hbWUsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCB2b2lkIF9faW9tZW0gKnJlZywgdTggc2hpZnQsCisJCSAgICAgICB1OCB3aWR0aCwgdTY0IGRlbm9tLCB1MzIgY2xrX2ZsYWdzLCBzcGlubG9ja190ICpsb2NrKQoreworCXN0cnVjdCB4Z2VuZV9jbGtfcG1kICpmZDsKKwlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OworCXN0cnVjdCBjbGsgKmNsazsKKworCWZkID0ga3phbGxvYyhzaXplb2YoKmZkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmZCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpbml0Lm5hbWUgPSBuYW1lOworCWluaXQub3BzID0gJnhnZW5lX2Nsa19wbWRfb3BzOworCWluaXQuZmxhZ3MgPSBmbGFnczsKKwlpbml0LnBhcmVudF9uYW1lcyA9IHBhcmVudF9uYW1lID8gJnBhcmVudF9uYW1lIDogTlVMTDsKKwlpbml0Lm51bV9wYXJlbnRzID0gcGFyZW50X25hbWUgPyAxIDogMDsKKworCWZkLT5yZWcgPSByZWc7CisJZmQtPnNoaWZ0ID0gc2hpZnQ7CisJZmQtPm1hc2sgPSAoQklUKHdpZHRoKSAtIDEpIDw8IHNoaWZ0OworCWZkLT5kZW5vbSA9IGRlbm9tOworCWZkLT5mbGFncyA9IGNsa19mbGFnczsKKwlmZC0+bG9jayA9IGxvY2s7CisJZmQtPmh3LmluaXQgPSAmaW5pdDsKKworCWNsayA9IGNsa19yZWdpc3RlcihkZXYsICZmZC0+aHcpOworCWlmIChJU19FUlIoY2xrKSkgeworCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgcmVnaXN0ZXIgY2xrICVzXG4iLCBfX2Z1bmNfXywgbmFtZSk7CisJCWtmcmVlKGZkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGNsazsKK30KKworc3RhdGljIHZvaWQgeGdlbmVfcG1kY2xrX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwljb25zdCBjaGFyICpjbGtfbmFtZSA9IG5wLT5mdWxsX25hbWU7CisJdm9pZCBfX2lvbWVtICpjc3JfcmVnOworCXN0cnVjdCByZXNvdXJjZSByZXM7CisJc3RydWN0IGNsayAqY2xrOworCXU2NCBkZW5vbTsKKwl1MzIgZmxhZ3MgPSAwOworCWludCByYzsKKworCS8qIENoZWNrIGlmIHRoZSBlbnRyeSBpcyBkaXNhYmxlZCAqLworCWlmICghb2ZfZGV2aWNlX2lzX2F2YWlsYWJsZShucCkpCisJCXJldHVybjsKKworCS8qIFBhcnNlIHRoZSBEVFMgcmVnaXN0ZXIgZm9yIHJlc291cmNlICovCisJcmMgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcmVzKTsKKwlpZiAocmMgIT0gMCkgeworCQlwcl9lcnIoIm5vIERUUyByZWdpc3RlciBmb3IgJXNcbiIsIG5wLT5mdWxsX25hbWUpOworCQlyZXR1cm47CisJfQorCWNzcl9yZWcgPSBvZl9pb21hcChucCwgMCk7CisJaWYgKCFjc3JfcmVnKSB7CisJCXByX2VycigiVW5hYmxlIHRvIG1hcCByZXNvdXJjZSBmb3IgJXNcbiIsIG5wLT5mdWxsX25hbWUpOworCQlyZXR1cm47CisJfQorCW9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKG5wLCAiY2xvY2stb3V0cHV0LW5hbWVzIiwgJmNsa19uYW1lKTsKKworCWRlbm9tID0gQklUKFhHRU5FX0NMS19QTURfV0lEVEgpOworCWZsYWdzIHw9IFhHRU5FX0NMS19QTURfU0NBTEVfSU5WRVJURUQ7CisKKwljbGsgPSB4Z2VuZV9yZWdpc3Rlcl9jbGtfcG1kKE5VTEwsIGNsa19uYW1lLAorCQkJCSAgICAgb2ZfY2xrX2dldF9wYXJlbnRfbmFtZShucCwgMCksIDAsCisJCQkJICAgICBjc3JfcmVnLCBYR0VORV9DTEtfUE1EX1NISUZULAorCQkJCSAgICAgWEdFTkVfQ0xLX1BNRF9XSURUSCwgZGVub20sCisJCQkJICAgICBmbGFncywgJmNsa19sb2NrKTsKKwlpZiAoIUlTX0VSUihjbGspKSB7CisJCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKKwkJY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGssIGNsa19uYW1lLCBOVUxMKTsKKwkJcHJfZGVidWcoIkFkZCAlcyBjbG9ja1xuIiwgY2xrX25hbWUpOworCX0gZWxzZSB7CisJCWlmIChjc3JfcmVnKQorCQkJaW91bm1hcChjc3JfcmVnKTsKKwl9Cit9CisKIC8qIElQIENsb2NrICovCiBzdHJ1Y3QgeGdlbmVfZGV2X3BhcmFtZXRlcnMgewogCXZvaWQgX19pb21lbSAqY3NyX3JlZzsJCS8qIENTUiBmb3IgSVAgY2xvY2sgKi8KQEAgLTU0Myw2ICs3NjMsNyBAQAogCiBDTEtfT0ZfREVDTEFSRSh4Z2VuZV9zb2NwbGxfY2xvY2ssICJhcG0seGdlbmUtc29jcGxsLWNsb2NrIiwgeGdlbmVfc29jcGxsY2xrX2luaXQpOwogQ0xLX09GX0RFQ0xBUkUoeGdlbmVfcGNwcGxsX2Nsb2NrLCAiYXBtLHhnZW5lLXBjcHBsbC1jbG9jayIsIHhnZW5lX3BjcHBsbGNsa19pbml0KTsKK0NMS19PRl9ERUNMQVJFKHhnZW5lX3BtZF9jbG9jaywgImFwbSx4Z2VuZS1wbWQtY2xvY2siLCB4Z2VuZV9wbWRjbGtfaW5pdCk7CiBDTEtfT0ZfREVDTEFSRSh4Z2VuZV9zb2NwbGxfdjJfY2xvY2ssICJhcG0seGdlbmUtc29jcGxsLXYyLWNsb2NrIiwKIAkgICAgICAgeGdlbmVfc29jcGxsY2xrX2luaXQpOwogQ0xLX09GX0RFQ0xBUkUoeGdlbmVfcGNwcGxsX3YyX2Nsb2NrLCAiYXBtLHhnZW5lLXBjcHBsbC12Mi1jbG9jayIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGsuYyBiL2RyaXZlcnMvY2xrL2Nsay5jCmluZGV4IDgyMGE5MzkuLjBmYjM5ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay5jCkBAIC0xOTA4LDEwICsxOTA4LDYgQEAKIAogCWNsa19wcmVwYXJlX2xvY2soKTsKIAotCS8qIGJhaWwgZWFybHkgaWYgbm90aGluZyB0byBkbyAqLwotCWlmIChkZWdyZWVzID09IGNsay0+Y29yZS0+cGhhc2UpCi0JCWdvdG8gb3V0OwotCiAJdHJhY2VfY2xrX3NldF9waGFzZShjbGstPmNvcmUsIGRlZ3JlZXMpOwogCiAJaWYgKGNsay0+Y29yZS0+b3BzLT5zZXRfcGhhc2UpCkBAIC0xOTIyLDcgKzE5MTgsNiBAQAogCWlmICghcmV0KQogCQljbGstPmNvcmUtPnBoYXNlID0gZGVncmVlczsKIAotb3V0OgogCWNsa19wcmVwYXJlX3VubG9jaygpOwogCiAJcmV0dXJuIHJldDsKQEAgLTI0NDksOCArMjQ0NCwxNiBAQAogCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUob3JwaGFuLCB0bXAyLCAmY2xrX29ycGhhbl9saXN0LCBjaGlsZF9ub2RlKSB7CiAJCXN0cnVjdCBjbGtfY29yZSAqcGFyZW50ID0gX19jbGtfaW5pdF9wYXJlbnQob3JwaGFuKTsKIAotCQlpZiAocGFyZW50KQotCQkJY2xrX2NvcmVfcmVwYXJlbnQob3JwaGFuLCBwYXJlbnQpOworCQkvKgorCQkgKiB3ZSBjb3VsZCBjYWxsIF9fY2xrX3NldF9wYXJlbnQsIGJ1dCB0aGF0IHdvdWxkIHJlc3VsdCBpbiBhCisJCSAqIHJlZHVuZGFudCBjYWxsIHRvIHRoZSAuc2V0X3JhdGUgb3AsIGlmIGl0IGV4aXN0cworCQkgKi8KKwkJaWYgKHBhcmVudCkgeworCQkJX19jbGtfc2V0X3BhcmVudF9iZWZvcmUob3JwaGFuLCBwYXJlbnQpOworCQkJX19jbGtfc2V0X3BhcmVudF9hZnRlcihvcnBoYW4sIHBhcmVudCwgTlVMTCk7CisJCQlfX2Nsa19yZWNhbGNfYWNjdXJhY2llcyhvcnBoYW4pOworCQkJX19jbGtfcmVjYWxjX3JhdGVzKG9ycGhhbiwgMCk7CisJCX0KIAl9CiAKIAkvKgpAQCAtMjQ5MSw3ICsyNDk0LDcgQEAKIAogCS8qIFRoaXMgaXMgdG8gYWxsb3cgdGhpcyBmdW5jdGlvbiB0byBiZSBjaGFpbmVkIHRvIG90aGVycyAqLwogCWlmIChJU19FUlJfT1JfTlVMTChodykpCi0JCXJldHVybiAoc3RydWN0IGNsayAqKSBodzsKKwkJcmV0dXJuIEVSUl9DQVNUKGh3KTsKIAogCWNsayA9IGt6YWxsb2Moc2l6ZW9mKCpjbGspLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNsaykKQEAgLTMxNjYsMTkgKzMxNjksMTQgQEAKIAkJCSAgICAgIHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmNsa3NwZWMpCiB7CiAJc3RydWN0IGNsayAqY2xrOwotCXN0cnVjdCBjbGtfaHcgKmh3ID0gRVJSX1BUUigtRVBST0JFX0RFRkVSKTsKIAotCWlmIChwcm92aWRlci0+Z2V0X2h3KSB7Ci0JCWh3ID0gcHJvdmlkZXItPmdldF9odyhjbGtzcGVjLCBwcm92aWRlci0+ZGF0YSk7Ci0JfSBlbHNlIGlmIChwcm92aWRlci0+Z2V0KSB7Ci0JCWNsayA9IHByb3ZpZGVyLT5nZXQoY2xrc3BlYywgcHJvdmlkZXItPmRhdGEpOwotCQlpZiAoIUlTX0VSUihjbGspKQotCQkJaHcgPSBfX2Nsa19nZXRfaHcoY2xrKTsKLQkJZWxzZQotCQkJaHcgPSBFUlJfQ0FTVChjbGspOwotCX0KKwlpZiAocHJvdmlkZXItPmdldF9odykKKwkJcmV0dXJuIHByb3ZpZGVyLT5nZXRfaHcoY2xrc3BlYywgcHJvdmlkZXItPmRhdGEpOwogCi0JcmV0dXJuIGh3OworCWNsayA9IHByb3ZpZGVyLT5nZXQoY2xrc3BlYywgcHJvdmlkZXItPmRhdGEpOworCWlmIChJU19FUlIoY2xrKSkKKwkJcmV0dXJuIEVSUl9DQVNUKGNsayk7CisJcmV0dXJuIF9fY2xrX2dldF9odyhjbGspOwogfQogCiBzdHJ1Y3QgY2xrICpfX29mX2Nsa19nZXRfZnJvbV9wcm92aWRlcihzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpjbGtzcGVjLApAQCAtMzE4Niw3ICszMTg0LDcgQEAKIHsKIAlzdHJ1Y3Qgb2ZfY2xrX3Byb3ZpZGVyICpwcm92aWRlcjsKIAlzdHJ1Y3QgY2xrICpjbGsgPSBFUlJfUFRSKC1FUFJPQkVfREVGRVIpOwotCXN0cnVjdCBjbGtfaHcgKmh3ID0gRVJSX1BUUigtRVBST0JFX0RFRkVSKTsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAogCWlmICghY2xrc3BlYykKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CkBAIC0zMTk0LDEyICszMTkyLDEzIEBACiAJLyogQ2hlY2sgaWYgd2UgaGF2ZSBzdWNoIGEgcHJvdmlkZXIgaW4gb3VyIGFycmF5ICovCiAJbXV0ZXhfbG9jaygmb2ZfY2xrX211dGV4KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHByb3ZpZGVyLCAmb2ZfY2xrX3Byb3ZpZGVycywgbGluaykgewotCQlpZiAocHJvdmlkZXItPm5vZGUgPT0gY2xrc3BlYy0+bnApCisJCWlmIChwcm92aWRlci0+bm9kZSA9PSBjbGtzcGVjLT5ucCkgewogCQkJaHcgPSBfX29mX2Nsa19nZXRfaHdfZnJvbV9wcm92aWRlcihwcm92aWRlciwgY2xrc3BlYyk7Ci0JCWlmICghSVNfRVJSKGh3KSkgewogCQkJY2xrID0gX19jbGtfY3JlYXRlX2NsayhodywgZGV2X2lkLCBjb25faWQpOworCQl9CiAKLQkJCWlmICghSVNfRVJSKGNsaykgJiYgIV9fY2xrX2dldChjbGspKSB7CisJCWlmICghSVNfRVJSKGNsaykpIHsKKwkJCWlmICghX19jbGtfZ2V0KGNsaykpIHsKIAkJCQlfX2Nsa19mcmVlX2NsayhjbGspOwogCQkJCWNsayA9IEVSUl9QVFIoLUVOT0VOVCk7CiAJCQl9CkBAIC0zNDUxLDYgKzM0NTAsMTAgQEAKIAkJCQkJJmNsa19wcm92aWRlcl9saXN0LCBub2RlKSB7CiAJCQlpZiAoZm9yY2UgfHwgcGFyZW50X3JlYWR5KGNsa19wcm92aWRlci0+bnApKSB7CiAKKwkJCQkvKiBEb24ndCBwb3B1bGF0ZSBwbGF0Zm9ybSBkZXZpY2VzICovCisJCQkJb2Zfbm9kZV9zZXRfZmxhZyhjbGtfcHJvdmlkZXItPm5wLAorCQkJCQkJIE9GX1BPUFVMQVRFRCk7CisKIAkJCQljbGtfcHJvdmlkZXItPmNsa19pbml0X2NiKGNsa19wcm92aWRlci0+bnApOwogCQkJCW9mX2Nsa19zZXRfZGVmYXVsdHMoY2xrX3Byb3ZpZGVyLT5ucCwgdHJ1ZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2g4MzAwL2Nsay1kaXYuYyBiL2RyaXZlcnMvY2xrL2g4MzAwL2Nsay1kaXYuYwppbmRleCA0YmY0NGEyLi43MTViODgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9oODMwMC9jbGstZGl2LmMKKysrIGIvZHJpdmVycy9jbGsvaDgzMDAvY2xrLWRpdi5jCkBAIC0xNCw3ICsxNCw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgaDgzMDBfZGl2X2Nsa19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCiB7CiAJdW5zaWduZWQgaW50IG51bV9wYXJlbnRzOwotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAljb25zdCBjaGFyICpjbGtfbmFtZSA9IG5vZGUtPm5hbWU7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CiAJdm9pZCBfX2lvbWVtICpkaXZjciA9IE5VTEw7CkBAIC0zOCwxNSArMzgsMTUgQEAKIAogCXBhcmVudF9uYW1lID0gb2ZfY2xrX2dldF9wYXJlbnRfbmFtZShub2RlLCAwKTsKIAlvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAicmVuZXNhcyx3aWR0aCIsICZ3aWR0aCk7Ci0JY2xrID0gY2xrX3JlZ2lzdGVyX2RpdmlkZXIoTlVMTCwgY2xrX25hbWUsIHBhcmVudF9uYW1lLAorCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX2RpdmlkZXIoTlVMTCwgY2xrX25hbWUsIHBhcmVudF9uYW1lLAogCQkJCSAgIENMS19TRVRfUkFURV9HQVRFLCBkaXZjciwgb2Zmc2V0LCB3aWR0aCwKIAkJCQkgICBDTEtfRElWSURFUl9QT1dFUl9PRl9UV08sICZjbGtsb2NrKTsKLQlpZiAoIUlTX0VSUihjbGspKSB7Ci0JCW9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCWlmICghSVNfRVJSKGh3KSkgeworCQlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7CiAJCXJldHVybjsKIAl9CiAJcHJfZXJyKCIlczogZmFpbGVkIHRvIHJlZ2lzdGVyICVzIGRpdiBjbG9jayAoJWxkKVxuIiwKLQkgICAgICAgX19mdW5jX18sIGNsa19uYW1lLCBQVFJfRVJSKGNsaykpOworCSAgICAgICBfX2Z1bmNfXywgY2xrX25hbWUsIFBUUl9FUlIoaHcpKTsKIGVycm9yOgogCWlmIChkaXZjcikKIAkJaW91bm1hcChkaXZjcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9oODMwMC9jbGstaDhzMjY3OC5jIGIvZHJpdmVycy9jbGsvaDgzMDAvY2xrLWg4czI2NzguYwppbmRleCBjOWMyZmQ1Li5hMjYzMTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9oODMwMC9jbGstaDhzMjY3OC5jCisrKyBiL2RyaXZlcnMvY2xrL2g4MzAwL2Nsay1oOHMyNjc4LmMKQEAgLTg0LDExICs4NCwxMSBAQAogc3RhdGljIHZvaWQgX19pbml0IGg4czI2NzhfcGxsX2Nsa19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCiB7CiAJdW5zaWduZWQgaW50IG51bV9wYXJlbnRzOwotCXN0cnVjdCBjbGsgKmNsazsKIAljb25zdCBjaGFyICpjbGtfbmFtZSA9IG5vZGUtPm5hbWU7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CiAJc3RydWN0IHBsbF9jbG9jayAqcGxsX2Nsb2NrOwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJaW50IHJldDsKIAogCW51bV9wYXJlbnRzID0gb2ZfY2xrX2dldF9wYXJlbnRfY291bnQobm9kZSk7CiAJaWYgKCFudW1fcGFyZW50cykgewpAQCAtMTIxLDE0ICsxMjEsMTQgQEAKIAlpbml0Lm51bV9wYXJlbnRzID0gMTsKIAlwbGxfY2xvY2stPmh3LmluaXQgPSAmaW5pdDsKIAotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmcGxsX2Nsb2NrLT5odyk7Ci0JaWYgKElTX0VSUihjbGspKSB7Ci0JCXByX2VycigiJXM6IGZhaWxlZCB0byByZWdpc3RlciAlcyBkaXYgY2xvY2sgKCVsZClcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgY2xrX25hbWUsIFBUUl9FUlIoY2xrKSk7CisJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZwbGxfY2xvY2stPmh3KTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byByZWdpc3RlciAlcyBkaXYgY2xvY2sgKCVkKVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBjbGtfbmFtZSwgcmV0KTsKIAkJZ290byB1bm1hcF9wbGxjcjsKIAl9CiAKLQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCAmcGxsX2Nsb2NrLT5odyk7CiAJcmV0dXJuOwogCiB1bm1hcF9wbGxjcjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2lteC9jbGstaW14MzUuYyBiL2RyaXZlcnMvY2xrL2lteC9jbGstaW14MzUuYwppbmRleCBiMDk3OGQzLi4yMDNjYWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9pbXgvY2xrLWlteDM1LmMKKysrIGIvZHJpdmVycy9jbGsvaW14L2Nsay1pbXgzNS5jCkBAIC02NiwyMCArNjYsMjIgQEAKIHN0YXRpYyBjb25zdCBjaGFyICppcGdfcGVyX3NlbFtdID0geyJhaGJfcGVyX2RpdiIsICJhcm1fcGVyX2RpdiJ9OwogCiBlbnVtIG14MzVfY2xrcyB7Ci0JY2tpaCwgbXBsbCwgcHBsbCwgbXBsbF8wNzUsIGFybSwgaHNwLCBoc3BfZGl2LCBoc3Bfc2VsLCBhaGIsIGlwZywKLQlhcm1fcGVyX2RpdiwgYWhiX3Blcl9kaXYsIGlwZ19wZXIsIHVhcnRfc2VsLCB1YXJ0X2RpdiwgZXNkaGNfc2VsLAotCWVzZGhjMV9kaXYsIGVzZGhjMl9kaXYsIGVzZGhjM19kaXYsIHNwZGlmX3NlbCwgc3BkaWZfZGl2X3ByZSwKLQlzcGRpZl9kaXZfcG9zdCwgc3NpX3NlbCwgc3NpMV9kaXZfcHJlLCBzc2kxX2Rpdl9wb3N0LCBzc2kyX2Rpdl9wcmUsCi0Jc3NpMl9kaXZfcG9zdCwgdXNiX3NlbCwgdXNiX2RpdiwgbmZjX2RpdiwgYXNyY19nYXRlLCBwYXRhX2dhdGUsCi0JYXVkbXV4X2dhdGUsIGNhbjFfZ2F0ZSwgY2FuMl9nYXRlLCBjc3BpMV9nYXRlLCBjc3BpMl9nYXRlLCBlY3RfZ2F0ZSwKLQllZGlvX2dhdGUsIGVtaV9nYXRlLCBlcGl0MV9nYXRlLCBlcGl0Ml9nYXRlLCBlc2FpX2dhdGUsIGVzZGhjMV9nYXRlLAotCWVzZGhjMl9nYXRlLCBlc2RoYzNfZ2F0ZSwgZmVjX2dhdGUsIGdwaW8xX2dhdGUsIGdwaW8yX2dhdGUsIGdwaW8zX2dhdGUsCi0JZ3B0X2dhdGUsIGkyYzFfZ2F0ZSwgaTJjMl9nYXRlLCBpMmMzX2dhdGUsIGlvbXV4Y19nYXRlLCBpcHVfZ2F0ZSwKLQlrcHBfZ2F0ZSwgbWxiX2dhdGUsIG1zaGNfZ2F0ZSwgb3dpcmVfZ2F0ZSwgcHdtX2dhdGUsIHJuZ2NfZ2F0ZSwKLQlydGNfZ2F0ZSwgcnRpY19nYXRlLCBzY2NfZ2F0ZSwgc2RtYV9nYXRlLCBzcGJhX2dhdGUsIHNwZGlmX2dhdGUsCi0Jc3NpMV9nYXRlLCBzc2kyX2dhdGUsIHVhcnQxX2dhdGUsIHVhcnQyX2dhdGUsIHVhcnQzX2dhdGUsIHVzYm90Z19nYXRlLAotCXdkb2dfZ2F0ZSwgbWF4X2dhdGUsIGFkbXV4X2dhdGUsIGNzaV9nYXRlLCBjc2lfZGl2LCBjc2lfc2VsLCBpaW1fZ2F0ZSwKLQlncHUyZF9nYXRlLCBja2lsLCBjbGtfbWF4CisJLyogIDAgKi8gY2tpaCwgbXBsbCwgcHBsbCwgbXBsbF8wNzUsIGFybSwgaHNwLCBoc3BfZGl2LCBoc3Bfc2VsLCBhaGIsCisJLyogIDkgKi8gaXBnLCBhcm1fcGVyX2RpdiwgYWhiX3Blcl9kaXYsIGlwZ19wZXIsIHVhcnRfc2VsLCB1YXJ0X2RpdiwKKwkvKiAxNSAqLyBlc2RoY19zZWwsIGVzZGhjMV9kaXYsIGVzZGhjMl9kaXYsIGVzZGhjM19kaXYsIHNwZGlmX3NlbCwKKwkvKiAyMCAqLyBzcGRpZl9kaXZfcHJlLCBzcGRpZl9kaXZfcG9zdCwgc3NpX3NlbCwgc3NpMV9kaXZfcHJlLAorCS8qIDI0ICovIHNzaTFfZGl2X3Bvc3QsIHNzaTJfZGl2X3ByZSwgc3NpMl9kaXZfcG9zdCwgdXNiX3NlbCwgdXNiX2RpdiwKKwkvKiAyOSAqLyBuZmNfZGl2LCBhc3JjX2dhdGUsIHBhdGFfZ2F0ZSwgYXVkbXV4X2dhdGUsIGNhbjFfZ2F0ZSwKKwkvKiAzNCAqLyBjYW4yX2dhdGUsIGNzcGkxX2dhdGUsIGNzcGkyX2dhdGUsIGVjdF9nYXRlLCBlZGlvX2dhdGUsCisJLyogMzkgKi8gZW1pX2dhdGUsIGVwaXQxX2dhdGUsIGVwaXQyX2dhdGUsIGVzYWlfZ2F0ZSwgZXNkaGMxX2dhdGUsCisJLyogNDQgKi8gZXNkaGMyX2dhdGUsIGVzZGhjM19nYXRlLCBmZWNfZ2F0ZSwgZ3BpbzFfZ2F0ZSwgZ3BpbzJfZ2F0ZSwKKwkvKiA0OSAqLyBncGlvM19nYXRlLCBncHRfZ2F0ZSwgaTJjMV9nYXRlLCBpMmMyX2dhdGUsIGkyYzNfZ2F0ZSwKKwkvKiA1NCAqLyBpb211eGNfZ2F0ZSwgaXB1X2dhdGUsIGtwcF9nYXRlLCBtbGJfZ2F0ZSwgbXNoY19nYXRlLAorCS8qIDU5ICovIG93aXJlX2dhdGUsIHB3bV9nYXRlLCBybmdjX2dhdGUsIHJ0Y19nYXRlLCBydGljX2dhdGUsIHNjY19nYXRlLAorCS8qIDY1ICovIHNkbWFfZ2F0ZSwgc3BiYV9nYXRlLCBzcGRpZl9nYXRlLCBzc2kxX2dhdGUsIHNzaTJfZ2F0ZSwKKwkvKiA3MCAqLyB1YXJ0MV9nYXRlLCB1YXJ0Ml9nYXRlLCB1YXJ0M19nYXRlLCB1c2JvdGdfZ2F0ZSwgd2RvZ19nYXRlLAorCS8qIDc1ICovIG1heF9nYXRlLCBhZG11eF9nYXRlLCBjc2lfZ2F0ZSwgY3NpX2RpdiwgY3NpX3NlbCwgaWltX2dhdGUsCisJLyogODEgKi8gZ3B1MmRfZ2F0ZSwgY2tpbCwgY2xrX21heAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgKmNsa1tjbGtfbWF4XTsKQEAgLTExNSw3ICsxMTcsNyBAQAogCX0KIAogCWNsa1tja2loXSA9IGlteF9jbGtfZml4ZWQoImNraWgiLCAyNDAwMDAwMCk7Ci0JY2xrW2NraWxdID0gaW14X2Nsa19maXhlZCgiY2tpaCIsIDMyNzY4KTsKKwljbGtbY2tpbF0gPSBpbXhfY2xrX2ZpeGVkKCJja2lsIiwgMzI3NjgpOwogCWNsa1ttcGxsXSA9IGlteF9jbGtfcGxsdjEoSU1YX1BMTFYxX0lNWDM1LCAibXBsbCIsICJja2loIiwgYmFzZSArIE1YMzVfQ0NNX01QQ1RMKTsKIAljbGtbcHBsbF0gPSBpbXhfY2xrX3BsbHYxKElNWF9QTExWMV9JTVgzNSwgInBwbGwiLCAiY2tpaCIsIGJhc2UgKyBNWDM1X0NDTV9QUENUTCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2lteC9jbGstaW14NTEtaW14NTMuYyBiL2RyaXZlcnMvY2xrL2lteC9jbGstaW14NTEtaW14NTMuYwppbmRleCAyOWQ0YzQ0Li4xZTNjOWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9pbXgvY2xrLWlteDUxLWlteDUzLmMKKysrIGIvZHJpdmVycy9jbGsvaW14L2Nsay1pbXg1MS1pbXg1My5jCkBAIC0xMjYsNiArMTI2LDcgQEAKIHN0YXRpYyBjb25zdCBjaGFyICpteDUxX3NwZGlmMV9jb21fc2VsW10gPSB7ICJzcGRpZjFfcG9kZiIsICJzc2kyX3Jvb3RfZ2F0ZSIsIH07CiBzdGF0aWMgY29uc3QgY2hhciAqc3RlcF9zZWxzW10gPSB7ICJscF9hcG0iLCB9Owogc3RhdGljIGNvbnN0IGNoYXIgKmNwdV9wb2RmX3NlbHNbXSA9IHsgInBsbDFfc3ciLCAic3RlcF9zZWwiIH07CitzdGF0aWMgY29uc3QgY2hhciAqaWVlZTE1ODhfc2Vsc1tdID0geyAicGxsM19zdyIsICJwbGw0X3N3IiwgImR1bW15IiAvKiB1c2JwaHkyX2NsayAqLywgImR1bW15IiAvKiBmZWNfcGh5X2NsayAqLyB9OwogCiBzdGF0aWMgc3RydWN0IGNsayAqY2xrW0lNWDVfQ0xLX0VORF07CiBzdGF0aWMgc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgY2xrX2RhdGE7CkBAIC01NDMsNiArNTQ0LDI1IEBACiAJY2xrW0lNWDVfQ0xLX0kyQzNfR0FURV0JCT0gaW14X2Nsa19nYXRlMigiaTJjM19nYXRlIiwgInBlcl9yb290IiwgTVhDX0NDTV9DQ0dSMSwgMjIpOwogCWNsa1tJTVg1X0NMS19TQVRBX0dBVEVdCQk9IGlteF9jbGtfZ2F0ZTIoInNhdGFfZ2F0ZSIsICJpcGciLCBNWENfQ0NNX0NDR1I0LCAyKTsKIAorCWNsa1tJTVg1X0NMS19GSVJJX1NFTF0JCT0gaW14X2Nsa19tdXgoImZpcmlfc2VsIiwgTVhDX0NDTV9DU0NNUjIsIDEyLCAyLAorCQkJCQkJc3RhbmRhcmRfcGxsX3NlbCwgQVJSQVlfU0laRShzdGFuZGFyZF9wbGxfc2VsKSk7CisJY2xrW0lNWDVfQ0xLX0ZJUklfUFJFRF0JCT0gaW14X2Nsa19kaXZpZGVyKCJmaXJpX3ByZWQiLCAiZmlyaV9zZWwiLCBNWENfQ0NNX0NTQ0RSMywgNiwgMyk7CisJY2xrW0lNWDVfQ0xLX0ZJUklfUE9ERl0JCT0gaW14X2Nsa19kaXZpZGVyKCJmaXJpX3BvZGYiLCAiZmlyaV9wcmVkIiwgTVhDX0NDTV9DU0NEUjMsIDAsIDYpOworCWNsa1tJTVg1X0NMS19GSVJJX1NFUklBTF9HQVRFXQk9IGlteF9jbGtfZ2F0ZTIoImZpcmlfc2VyaWFsX2dhdGUiLCAiZmlyaV9wb2RmIiwgTVhDX0NDTV9DQ0dSMSwgMjgpOworCWNsa1tJTVg1X0NMS19GSVJJX0lQR19HQVRFXQk9IGlteF9jbGtfZ2F0ZTIoImZpcmlfaXBnX2dhdGUiLCAiaXBnIiwgTVhDX0NDTV9DQ0dSMSwgMjYpOworCisJY2xrW0lNWDVfQ0xLX0NTSTBfTUNMSzFfU0VMXQk9IGlteF9jbGtfbXV4KCJjc2kwX21jbGsxX3NlbCIsIE1YQ19DQ01fQ1NDTVIyLCAyMiwgMiwKKwkJCQkJCXN0YW5kYXJkX3BsbF9zZWwsIEFSUkFZX1NJWkUoc3RhbmRhcmRfcGxsX3NlbCkpOworCWNsa1tJTVg1X0NMS19DU0kwX01DTEsxX1BSRURdCT0gaW14X2Nsa19kaXZpZGVyKCJjc2kwX21jbGsxX3ByZWQiLCAiY3NpMF9tY2xrMV9zZWwiLCBNWENfQ0NNX0NTQ0RSNCwgNiwgMyk7CisJY2xrW0lNWDVfQ0xLX0NTSTBfTUNMSzFfUE9ERl0JPSBpbXhfY2xrX2RpdmlkZXIoImNzaTBfbWNsazFfcG9kZiIsICJjc2kwX21jbGsxX3ByZWQiLCBNWENfQ0NNX0NTQ0RSNCwgMCwgNik7CisJY2xrW0lNWDVfQ0xLX0NTSTBfTUNMSzFfR0FURV0JPSBpbXhfY2xrX2dhdGUyKCJjc2kwX21jbGsxX3NlcmlhbF9nYXRlIiwgImNzaTBfbWNsazFfcG9kZiIsIE1YQ19DQ01fQ0NHUjYsIDQpOworCisJY2xrW0lNWDVfQ0xLX0lFRUUxNTg4X1NFTF0JPSBpbXhfY2xrX211eCgiaWVlZTE1ODhfc2VsIiwgTVhDX0NDTV9DU0NNUjIsIDE0LCAyLAorCQkJCQkJaWVlZTE1ODhfc2VscywgQVJSQVlfU0laRShpZWVlMTU4OF9zZWxzKSk7CisJY2xrW0lNWDVfQ0xLX0lFRUUxNTg4X1BSRURdCT0gaW14X2Nsa19kaXZpZGVyKCJpZWVlMTU4OF9wcmVkIiwgImllZWUxNTg4X3NlbCIsIE1YQ19DQ01fQ1NDRFIyLCA2LCAzKTsKKwljbGtbSU1YNV9DTEtfSUVFRTE1ODhfUE9ERl0JPSBpbXhfY2xrX2RpdmlkZXIoImllZWUxNTg4X3BvZGYiLCAiaWVlZTE1ODhfcHJlZCIsIE1YQ19DQ01fQ1NDRFIyLCAwLCA2KTsKKwljbGtbSU1YNV9DTEtfSUVFRTE1ODhfR0FURV0JPSBpbXhfY2xrX2dhdGUyKCJpZWVlMTU4OF9zZXJpYWxfZ2F0ZSIsICJpZWVlMTU4OF9wb2RmIiwgTVhDX0NDTV9DQ0dSNywgNik7CisKIAljbGtbSU1YNV9DTEtfQ0tPMV9TRUxdCQk9IGlteF9jbGtfbXV4KCJja28xX3NlbCIsIE1YQ19DQ01fQ0NPU1IsIDAsIDQsCiAJCQkJCQlteDUzX2NrbzFfc2VsLCBBUlJBWV9TSVpFKG14NTNfY2tvMV9zZWwpKTsKIAljbGtbSU1YNV9DTEtfQ0tPMV9QT0RGXQkJPSBpbXhfY2xrX2RpdmlkZXIoImNrbzFfcG9kZiIsICJja28xX3NlbCIsIE1YQ19DQ01fQ0NPU1IsIDQsIDMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvaW14L2Nsay1pbXg2cS5jIGIvZHJpdmVycy9jbGsvaW14L2Nsay1pbXg2cS5jCmluZGV4IGJhMWMxYWUuLmNlOGVhMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2lteC9jbGstaW14NnEuYworKysgYi9kcml2ZXJzL2Nsay9pbXgvY2xrLWlteDZxLmMKQEAgLTMxOCwxMSArMzE4LDE2IEBACiAJCWNsa1tJTVg2UURMX0NMS19JUEdfUEVSX1NFTF0gPSBpbXhfY2xrX211eCgiaXBnX3Blcl9zZWwiLCBiYXNlICsgMHgxYywgNiwgMSwgaXBnX3Blcl9zZWxzLCBBUlJBWV9TSVpFKGlwZ19wZXJfc2VscykpOwogCQljbGtbSU1YNlFETF9DTEtfVUFSVF9TRUxdID0gaW14X2Nsa19tdXgoInVhcnRfc2VsIiwgYmFzZSArIDB4MjQsIDYsIDEsIHVhcnRfc2VscywgQVJSQVlfU0laRSh1YXJ0X3NlbHMpKTsKIAkJY2xrW0lNWDZRRExfQ0xLX0dQVTJEX0NPUkVfU0VMXSA9IGlteF9jbGtfbXV4KCJncHUyZF9jb3JlX3NlbCIsIGJhc2UgKyAweDE4LCAxNiwgMiwgZ3B1MmRfY29yZV9zZWxzXzIsIEFSUkFZX1NJWkUoZ3B1MmRfY29yZV9zZWxzXzIpKTsKKwl9IGVsc2UgaWYgKGNsa19vbl9pbXg2ZGwoKSkgeworCQljbGtbSU1YNlFETF9DTEtfTUxCX1NFTF0gPSBpbXhfY2xrX211eCgibWxiX3NlbCIsICAgYmFzZSArIDB4MTgsIDE2LCAyLCBncHUyZF9jb3JlX3NlbHMsICAgQVJSQVlfU0laRShncHUyZF9jb3JlX3NlbHMpKTsKIAl9IGVsc2UgewogCQljbGtbSU1YNlFETF9DTEtfR1BVMkRfQ09SRV9TRUxdID0gaW14X2Nsa19tdXgoImdwdTJkX2NvcmVfc2VsIiwgICBiYXNlICsgMHgxOCwgMTYsIDIsIGdwdTJkX2NvcmVfc2VscywgICBBUlJBWV9TSVpFKGdwdTJkX2NvcmVfc2VscykpOwogCX0KIAljbGtbSU1YNlFETF9DTEtfR1BVM0RfQ09SRV9TRUxdICAgPSBpbXhfY2xrX211eCgiZ3B1M2RfY29yZV9zZWwiLCAgIGJhc2UgKyAweDE4LCA0LCAgMiwgZ3B1M2RfY29yZV9zZWxzLCAgIEFSUkFZX1NJWkUoZ3B1M2RfY29yZV9zZWxzKSk7Ci0JY2xrW0lNWDZRRExfQ0xLX0dQVTNEX1NIQURFUl9TRUxdID0gaW14X2Nsa19tdXgoImdwdTNkX3NoYWRlcl9zZWwiLCBiYXNlICsgMHgxOCwgOCwgIDIsIGdwdTNkX3NoYWRlcl9zZWxzLCBBUlJBWV9TSVpFKGdwdTNkX3NoYWRlcl9zZWxzKSk7CisJaWYgKGNsa19vbl9pbXg2ZGwoKSkKKwkJY2xrW0lNWDZRRExfQ0xLX0dQVTJEX0NPUkVfU0VMXSA9IGlteF9jbGtfbXV4KCJncHUyZF9jb3JlX3NlbCIsIGJhc2UgKyAweDE4LCA4LCAgMiwgZ3B1M2Rfc2hhZGVyX3NlbHMsIEFSUkFZX1NJWkUoZ3B1M2Rfc2hhZGVyX3NlbHMpKTsKKwllbHNlCisJCWNsa1tJTVg2UURMX0NMS19HUFUzRF9TSEFERVJfU0VMXSA9IGlteF9jbGtfbXV4KCJncHUzZF9zaGFkZXJfc2VsIiwgYmFzZSArIDB4MTgsIDgsICAyLCBncHUzZF9zaGFkZXJfc2VscywgQVJSQVlfU0laRShncHUzZF9zaGFkZXJfc2VscykpOwogCWNsa1tJTVg2UURMX0NMS19JUFUxX1NFTF0gICAgICAgICA9IGlteF9jbGtfbXV4KCJpcHUxX3NlbCIsICAgICAgICAgYmFzZSArIDB4M2MsIDksICAyLCBpcHVfc2VscywgICAgICAgICAgQVJSQVlfU0laRShpcHVfc2VscykpOwogCWNsa1tJTVg2UURMX0NMS19JUFUyX1NFTF0gICAgICAgICA9IGlteF9jbGtfbXV4KCJpcHUyX3NlbCIsICAgICAgICAgYmFzZSArIDB4M2MsIDE0LCAyLCBpcHVfc2VscywgICAgICAgICAgQVJSQVlfU0laRShpcHVfc2VscykpOwogCWNsa1tJTVg2UURMX0NMS19MREJfREkwX1NFTF0gICAgICA9IGlteF9jbGtfbXV4X2ZsYWdzKCJsZGJfZGkwX3NlbCIsIGJhc2UgKyAweDJjLCA5LCAgMywgbGRiX2RpX3NlbHMsICAgICAgQVJSQVlfU0laRShsZGJfZGlfc2VscyksIENMS19TRVRfUkFURV9QQVJFTlQpOwpAQCAtNDAwLDkgKzQwNSwxNSBAQAogCQljbGtbSU1YNlFETF9DTEtfTERCX0RJMF9ESVZfM181XSA9IGlteF9jbGtfZml4ZWRfZmFjdG9yKCJsZGJfZGkwX2Rpdl8zXzUiLCAibGRiX2RpMF9zZWwiLCAyLCA3KTsKIAkJY2xrW0lNWDZRRExfQ0xLX0xEQl9ESTFfRElWXzNfNV0gPSBpbXhfY2xrX2ZpeGVkX2ZhY3RvcigibGRiX2RpMV9kaXZfM181IiwgImxkYl9kaTFfc2VsIiwgMiwgNyk7CiAJfQotCWNsa1tJTVg2UURMX0NMS19HUFUyRF9DT1JFX1BPREZdICA9IGlteF9jbGtfZGl2aWRlcigiZ3B1MmRfY29yZV9wb2RmIiwgICJncHUyZF9jb3JlX3NlbCIsICAgIGJhc2UgKyAweDE4LCAyMywgMyk7CisJaWYgKGNsa19vbl9pbXg2ZGwoKSkKKwkJY2xrW0lNWDZRRExfQ0xLX01MQl9QT0RGXSAgPSBpbXhfY2xrX2RpdmlkZXIoIm1sYl9wb2RmIiwgICJtbGJfc2VsIiwgICAgYmFzZSArIDB4MTgsIDIzLCAzKTsKKwllbHNlCisJCWNsa1tJTVg2UURMX0NMS19HUFUyRF9DT1JFX1BPREZdICA9IGlteF9jbGtfZGl2aWRlcigiZ3B1MmRfY29yZV9wb2RmIiwgICJncHUyZF9jb3JlX3NlbCIsICAgIGJhc2UgKyAweDE4LCAyMywgMyk7CiAJY2xrW0lNWDZRRExfQ0xLX0dQVTNEX0NPUkVfUE9ERl0gID0gaW14X2Nsa19kaXZpZGVyKCJncHUzZF9jb3JlX3BvZGYiLCAgImdwdTNkX2NvcmVfc2VsIiwgICAgYmFzZSArIDB4MTgsIDI2LCAzKTsKLQljbGtbSU1YNlFETF9DTEtfR1BVM0RfU0hBREVSXSAgICAgPSBpbXhfY2xrX2RpdmlkZXIoImdwdTNkX3NoYWRlciIsICAgICAiZ3B1M2Rfc2hhZGVyX3NlbCIsICBiYXNlICsgMHgxOCwgMjksIDMpOworCWlmIChjbGtfb25faW14NmRsKCkpCisJCWNsa1tJTVg2UURMX0NMS19HUFUyRF9DT1JFX1BPREZdICA9IGlteF9jbGtfZGl2aWRlcigiZ3B1MmRfY29yZV9wb2RmIiwgICAgICJncHUyZF9jb3JlX3NlbCIsICBiYXNlICsgMHgxOCwgMjksIDMpOworCWVsc2UKKwkJY2xrW0lNWDZRRExfQ0xLX0dQVTNEX1NIQURFUl0gICAgID0gaW14X2Nsa19kaXZpZGVyKCJncHUzZF9zaGFkZXIiLCAgICAgImdwdTNkX3NoYWRlcl9zZWwiLCAgYmFzZSArIDB4MTgsIDI5LCAzKTsKIAljbGtbSU1YNlFETF9DTEtfSVBVMV9QT0RGXSAgICAgICAgPSBpbXhfY2xrX2RpdmlkZXIoImlwdTFfcG9kZiIsICAgICAgICAiaXB1MV9zZWwiLCAgICAgICAgICBiYXNlICsgMHgzYywgMTEsIDMpOwogCWNsa1tJTVg2UURMX0NMS19JUFUyX1BPREZdICAgICAgICA9IGlteF9jbGtfZGl2aWRlcigiaXB1Ml9wb2RmIiwgICAgICAgICJpcHUyX3NlbCIsICAgICAgICAgIGJhc2UgKyAweDNjLCAxNiwgMyk7CiAJY2xrW0lNWDZRRExfQ0xLX0xEQl9ESTBfUE9ERl0gICAgID0gaW14X2Nsa19kaXZpZGVyX2ZsYWdzKCJsZGJfZGkwX3BvZGYiLCAibGRiX2RpMF9kaXZfM181IiwgYmFzZSArIDB4MjAsIDEwLCAxLCAwKTsKQEAgLTQ3MywxNCArNDg0LDcgQEAKIAljbGtbSU1YNlFETF9DTEtfRVNBSV9NRU1dICAgICA9IGlteF9jbGtfZ2F0ZTJfc2hhcmVkKCJlc2FpX21lbSIsICJhaGIiLCAgICAgICAgICAgICBiYXNlICsgMHg2YywgMTYsICZzaGFyZV9jb3VudF9lc2FpKTsKIAljbGtbSU1YNlFETF9DTEtfR1BUX0lQR10gICAgICA9IGlteF9jbGtfZ2F0ZTIoImdwdF9pcGciLCAgICAgICAiaXBnIiwgICAgICAgICAgICAgICBiYXNlICsgMHg2YywgMjApOwogCWNsa1tJTVg2UURMX0NMS19HUFRfSVBHX1BFUl0gID0gaW14X2Nsa19nYXRlMigiZ3B0X2lwZ19wZXIiLCAgICJpcGdfcGVyIiwgICAgICAgICAgIGJhc2UgKyAweDZjLCAyMik7Ci0JaWYgKGNsa19vbl9pbXg2ZGwoKSkKLQkJLyoKLQkJICogVGhlIG11bHRpcGxleGVyIGFuZCBkaXZpZGVyIG9mIGlteDZxIGNsb2NrIGdwdTNkX3NoYWRlciBnZXQKLQkJICogcmVkZWZpbmVkL3JldXNlZCBhcyBncHUyZF9jb3JlX3NlbCBhbmQgZ3B1MmRfY29yZV9wb2RmIG9uIGlteDZkbC4KLQkJICovCi0JCWNsa1tJTVg2UURMX0NMS19HUFUyRF9DT1JFXSA9IGlteF9jbGtfZ2F0ZTIoImdwdTJkX2NvcmUiLCAiZ3B1M2Rfc2hhZGVyIiwgYmFzZSArIDB4NmMsIDI0KTsKLQllbHNlCi0JCWNsa1tJTVg2UURMX0NMS19HUFUyRF9DT1JFXSA9IGlteF9jbGtfZ2F0ZTIoImdwdTJkX2NvcmUiLCAiZ3B1MmRfY29yZV9wb2RmIiwgYmFzZSArIDB4NmMsIDI0KTsKKwljbGtbSU1YNlFETF9DTEtfR1BVMkRfQ09SRV0gPSBpbXhfY2xrX2dhdGUyKCJncHUyZF9jb3JlIiwgImdwdTJkX2NvcmVfcG9kZiIsIGJhc2UgKyAweDZjLCAyNCk7CiAJY2xrW0lNWDZRRExfQ0xLX0dQVTNEX0NPUkVdICAgPSBpbXhfY2xrX2dhdGUyKCJncHUzZF9jb3JlIiwgICAgImdwdTNkX2NvcmVfcG9kZiIsICAgYmFzZSArIDB4NmMsIDI2KTsKIAljbGtbSU1YNlFETF9DTEtfSERNSV9JQUhCXSAgICA9IGlteF9jbGtfZ2F0ZTIoImhkbWlfaWFoYiIsICAgICAiYWhiIiwgICAgICAgICAgICAgICBiYXNlICsgMHg3MCwgMCk7CiAJY2xrW0lNWDZRRExfQ0xLX0hETUlfSVNGUl0gICAgPSBpbXhfY2xrX2dhdGUyKCJoZG1pX2lzZnIiLCAgICAgInZpZGVvXzI3bSIsICAgICAgICAgYmFzZSArIDB4NzAsIDQpOwpAQCAtNTExLDcgKzUxNSw3IEBACiAJCSAqIFRoZSBtdWx0aXBsZXhlciBhbmQgZGl2aWRlciBvZiB0aGUgaW14NnEgY2xvY2sgZ3B1MmQgZ2V0CiAJCSAqIHJlZGVmaW5lZC9yZXVzZWQgYXMgbWxiX3N5c19zZWwgYW5kIG1sYl9zeXNfY2xrX3BvZGYgb24gaW14NmRsLgogCQkgKi8KLQkJY2xrW0lNWDZRRExfQ0xLX01MQl0gPSBpbXhfY2xrX2dhdGUyKCJtbGIiLCAgICAgICAgICAgICJncHUyZF9jb3JlX3BvZGYiLCAgIGJhc2UgKyAweDc0LCAxOCk7CisJCWNsa1tJTVg2UURMX0NMS19NTEJdID0gaW14X2Nsa19nYXRlMigibWxiIiwgICAgICAgICAgICAibWxiX3BvZGYiLCAgIGJhc2UgKyAweDc0LCAxOCk7CiAJZWxzZQogCQljbGtbSU1YNlFETF9DTEtfTUxCXSA9IGlteF9jbGtfZ2F0ZTIoIm1sYiIsICAgICAgICAgICAgImF4aSIsICAgICAgICAgICAgICAgYmFzZSArIDB4NzQsIDE4KTsKIAljbGtbSU1YNlFETF9DTEtfTU1EQ19DSDBfQVhJXSA9IGlteF9jbGtfZ2F0ZTIoIm1tZGNfY2gwX2F4aSIsICAibW1kY19jaDBfYXhpX3BvZGYiLCBiYXNlICsgMHg3NCwgMjApOwpAQCAtNjI5LDYgKzYzMywyNCBAQAogCWlmIChJU19FTkFCTEVEKENPTkZJR19QQ0lfSU1YNikpCiAJCWNsa19zZXRfcGFyZW50KGNsa1tJTVg2UURMX0NMS19MVkRTMV9TRUxdLCBjbGtbSU1YNlFETF9DTEtfU0FUQV9SRUZfMTAwTV0pOwogCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBHUFUgY2xvY2sgbXV4ZXMsIHNvIHRoYXQgdGhlIG1heGltdW0gc3BlY2lmaWVkIGNsb2NrCisJICogcmF0ZXMgZm9yIHRoZSByZXNwZWN0aXZlIFNvQyBhcmUgbm90IGV4Y2VlZGVkLgorCSAqLworCWlmIChjbGtfb25faW14NmRsKCkpIHsKKwkJY2xrX3NldF9wYXJlbnQoY2xrW0lNWDZRRExfQ0xLX0dQVTNEX0NPUkVfU0VMXSwKKwkJCSAgICAgICBjbGtbSU1YNlFETF9DTEtfUExMMl9QRkQxXzU5NE1dKTsKKwkJY2xrX3NldF9wYXJlbnQoY2xrW0lNWDZRRExfQ0xLX0dQVTJEX0NPUkVfU0VMXSwKKwkJCSAgICAgICBjbGtbSU1YNlFETF9DTEtfUExMMl9QRkQxXzU5NE1dKTsKKwl9IGVsc2UgaWYgKGNsa19vbl9pbXg2cSgpKSB7CisJCWNsa19zZXRfcGFyZW50KGNsa1tJTVg2UURMX0NMS19HUFUzRF9DT1JFX1NFTF0sCisJCQkgICAgICAgY2xrW0lNWDZRRExfQ0xLX01NRENfQ0gwX0FYSV0pOworCQljbGtfc2V0X3BhcmVudChjbGtbSU1YNlFETF9DTEtfR1BVM0RfU0hBREVSX1NFTF0sCisJCQkgICAgICAgY2xrW0lNWDZRRExfQ0xLX1BMTDJfUEZEMV81OTRNXSk7CisJCWNsa19zZXRfcGFyZW50KGNsa1tJTVg2UURMX0NMS19HUFUyRF9DT1JFX1NFTF0sCisJCQkgICAgICAgY2xrW0lNWDZRRExfQ0xLX1BMTDNfVVNCX09UR10pOworCX0KKwogCWlteF9yZWdpc3Rlcl91YXJ0X2Nsb2Nrcyh1YXJ0X2Nsa3MpOwogfQogQ0xLX09GX0RFQ0xBUkUoaW14NnEsICJmc2wsaW14NnEtY2NtIiwgaW14NnFfY2xvY2tzX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvaW14L2Nsay1pbXg3ZC5jIGIvZHJpdmVycy9jbGsvaW14L2Nsay1pbXg3ZC5jCmluZGV4IDZlZDRmOGYuLmU3YzczNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2lteC9jbGstaW14N2QuYworKysgYi9kcml2ZXJzL2Nsay9pbXgvY2xrLWlteDdkLmMKQEAgLTIyLDQzICsyMiw2MyBAQAogCiAjaW5jbHVkZSAiY2xrLmgiCiAKK3N0YXRpYyB1MzIgc2hhcmVfY291bnRfc2FpMTsKK3N0YXRpYyB1MzIgc2hhcmVfY291bnRfc2FpMjsKK3N0YXRpYyB1MzIgc2hhcmVfY291bnRfc2FpMzsKKworc3RhdGljIHN0cnVjdCBjbGtfZGl2X3RhYmxlIHRlc3RfZGl2X3RhYmxlW10gPSB7CisJeyAudmFsID0gMywgLmRpdiA9IDEsIH0sCisJeyAudmFsID0gMiwgLmRpdiA9IDEsIH0sCisJeyAudmFsID0gMSwgLmRpdiA9IDIsIH0sCisJeyAudmFsID0gMCwgLmRpdiA9IDQsIH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGNsa19kaXZfdGFibGUgcG9zdF9kaXZfdGFibGVbXSA9IHsKKwl7IC52YWwgPSAzLCAuZGl2ID0gNCwgfSwKKwl7IC52YWwgPSAyLCAuZGl2ID0gMSwgfSwKKwl7IC52YWwgPSAxLCAuZGl2ID0gMiwgfSwKKwl7IC52YWwgPSAwLCAuZGl2ID0gMSwgfSwKKwl7IH0KK307CisKIHN0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzW0lNWDdEX0NMS19FTkRdOwogc3RhdGljIGNvbnN0IGNoYXIgKmFybV9hN19zZWxbXSA9IHsgIm9zYyIsICJwbGxfYXJtX21haW5fY2xrIiwKIAkicGxsX2VuZXRfNTAwbV9jbGsiLCAicGxsX2RyYW1fbWFpbl9jbGsiLAotCSJwbGxfc3lzX21haW5fY2xrIiwgInBsbF9zeXNfcGZkMF8zOTJtX2NsayIsICJwbGxfYXVkaW9fbWFpbl9jbGsiLAorCSJwbGxfc3lzX21haW5fY2xrIiwgInBsbF9zeXNfcGZkMF8zOTJtX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLAogCSJwbGxfdXNiX21haW5fY2xrIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmFybV9tNF9zZWxbXSA9IHsgIm9zYyIsICJwbGxfc3lzX21haW5fMjQwbV9jbGsiLAogCSJwbGxfZW5ldF8yNTBtX2NsayIsICJwbGxfc3lzX3BmZDJfMjcwbV9jbGsiLAotCSJwbGxfZHJhbV81MzNtX2NsayIsICJwbGxfYXVkaW9fbWFpbl9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKKwkicGxsX2RyYW1fNTMzbV9jbGsiLCAicGxsX2F1ZGlvX3Bvc3RfZGl2IiwgInBsbF92aWRlb19tYWluX2NsayIsCiAJInBsbF91c2JfbWFpbl9jbGsiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqYXJtX20wX3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsCiAJInBsbF9lbmV0XzEyNW1fY2xrIiwgInBsbF9zeXNfcGZkMl8xMzVtX2NsayIsCi0JInBsbF9kcmFtXzUzM21fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAorCSJwbGxfZHJhbV81MzNtX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKIAkicGxsX3VzYl9tYWluX2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpheGlfc2VsW10gPSB7ICJvc2MiLCAicGxsX3N5c19wZmQxXzMzMm1fY2xrIiwKIAkicGxsX2RyYW1fNTMzbV9jbGsiLCAicGxsX2VuZXRfMjUwbV9jbGsiLCAicGxsX3N5c19wZmQ1X2NsayIsCi0JInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCAicGxsX3N5c19wZmQ3X2NsayIsIH07CisJInBsbF9hdWRpb19wb3N0X2RpdiIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCAicGxsX3N5c19wZmQ3X2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpkaXNwX2F4aV9zZWxbXSA9IHsgIm9zYyIsICJwbGxfc3lzX3BmZDFfMzMybV9jbGsiLAogCSJwbGxfZHJhbV81MzNtX2NsayIsICJwbGxfZW5ldF8yNTBtX2NsayIsICJwbGxfc3lzX3BmZDZfY2xrIiwKLQkicGxsX3N5c19wZmQ3X2NsayIsICJwbGxfYXVkaW9fbWFpbl9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgfTsKKwkicGxsX3N5c19wZmQ3X2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmVuZXRfYXhpX3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfcGZkMl8yNzBtX2NsayIsCiAJInBsbF9kcmFtXzUzM21fY2xrIiwgInBsbF9lbmV0XzI1MG1fY2xrIiwKLQkicGxsX3N5c19tYWluXzI0MG1fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAorCSJwbGxfc3lzX21haW5fMjQwbV9jbGsiLCAicGxsX2F1ZGlvX3Bvc3RfZGl2IiwgInBsbF92aWRlb19tYWluX2NsayIsCiAJInBsbF9zeXNfcGZkNF9jbGsiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqbmFuZF91c2RoY19idXNfc2VsW10gPSB7ICJvc2MiLCAicGxsX3N5c19wZmQyXzI3MG1fY2xrIiwKIAkicGxsX2RyYW1fNTMzbV9jbGsiLCAicGxsX3N5c19tYWluXzI0MG1fY2xrIiwKIAkicGxsX3N5c19wZmQyXzEzNW1fY2xrIiwgInBsbF9zeXNfcGZkNl9jbGsiLCAicGxsX2VuZXRfMjUwbV9jbGsiLAotCSJwbGxfYXVkaW9fbWFpbl9jbGsiLCB9OworCSJwbGxfYXVkaW9fcG9zdF9kaXYiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqYWhiX2NoYW5uZWxfc2VsW10gPSB7ICJvc2MiLCAicGxsX3N5c19wZmQyXzI3MG1fY2xrIiwKIAkicGxsX2RyYW1fNTMzbV9jbGsiLCAicGxsX3N5c19wZmQwXzM5Mm1fY2xrIiwKLQkicGxsX2VuZXRfMTI1bV9jbGsiLCAicGxsX3VzYl9tYWluX2NsayIsICJwbGxfYXVkaW9fbWFpbl9jbGsiLAorCSJwbGxfZW5ldF8xMjVtX2NsayIsICJwbGxfdXNiX21haW5fY2xrIiwgInBsbF9hdWRpb19wb3N0X2RpdiIsCiAJInBsbF92aWRlb19tYWluX2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpkcmFtX3BoeW1fc2VsW10gPSB7ICJwbGxfZHJhbV9tYWluX2NsayIsCkBAIC02OSwxMyArODksMTMgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyYW1fcGh5bV9hbHRfc2VsW10gPSB7ICJvc2MiLCAicGxsX2RyYW1fNTMzbV9jbGsiLAogCSJwbGxfc3lzX21haW5fY2xrIiwgInBsbF9lbmV0XzUwMG1fY2xrIiwKLQkicGxsX3VzYl9tYWluX2NsayIsICJwbGxfc3lzX3BmZDdfY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsCisJInBsbF91c2JfbWFpbl9jbGsiLCAicGxsX3N5c19wZmQ3X2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLAogCSJwbGxfdmlkZW9fbWFpbl9jbGsiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqZHJhbV9hbHRfc2VsW10gPSB7ICJvc2MiLCAicGxsX2RyYW1fNTMzbV9jbGsiLAogCSJwbGxfc3lzX21haW5fY2xrIiwgInBsbF9lbmV0XzUwMG1fY2xrIiwKIAkicGxsX2VuZXRfMjUwbV9jbGsiLCAicGxsX3N5c19wZmQwXzM5Mm1fY2xrIiwKLQkicGxsX2F1ZGlvX21haW5fY2xrIiwgInBsbF9zeXNfcGZkMl8yNzBtX2NsayIsIH07CisJInBsbF9hdWRpb19wb3N0X2RpdiIsICJwbGxfc3lzX3BmZDJfMjcwbV9jbGsiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqdXNiX2hzaWNfc2VsW10gPSB7ICJvc2MiLCAicGxsX3N5c19tYWluX2NsayIsCiAJInBsbF91c2JfbWFpbl9jbGsiLCAicGxsX3N5c19wZmQzX2NsayIsICJwbGxfc3lzX3BmZDRfY2xrIiwKQEAgLTEwMSw1MyArMTIxLDUzIEBACiAKIHN0YXRpYyBjb25zdCBjaGFyICptaXBpX2RzaV9zZWxbXSA9IHsgIm9zYyIsICJwbGxfc3lzX3BmZDVfY2xrIiwKIAkicGxsX3N5c19wZmQzX2NsayIsICJwbGxfc3lzX21haW5fY2xrIiwgInBsbF9zeXNfcGZkMF8xOTZtX2NsayIsCi0JInBsbF9kcmFtXzUzM21fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsICJwbGxfYXVkaW9fbWFpbl9jbGsiLCB9OworCSJwbGxfZHJhbV81MzNtX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCAicGxsX2F1ZGlvX3Bvc3RfZGl2IiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKm1pcGlfY3NpX3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfcGZkNF9jbGsiLAogCSJwbGxfc3lzX3BmZDNfY2xrIiwgInBsbF9zeXNfbWFpbl9jbGsiLCAicGxsX3N5c19wZmQwXzE5Nm1fY2xrIiwKLQkicGxsX2RyYW1fNTMzbV9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsIH07CisJInBsbF9kcmFtXzUzM21fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqbWlwaV9kcGh5X3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsCiAJInBsbF9kcmFtXzUzM21fY2xrIiwgInBsbF9zeXNfcGZkNV9jbGsiLCAicmVmXzFtX2NsayIsICJleHRfY2xrXzIiLAogCSJwbGxfdmlkZW9fbWFpbl9jbGsiLCAiZXh0X2Nsa18zIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnNhaTFfc2VsW10gPSB7ICJvc2MiLCAicGxsX3N5c19wZmQyXzEzNW1fY2xrIiwKLQkicGxsX2F1ZGlvX21haW5fY2xrIiwgInBsbF9kcmFtXzUzM21fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsCisJInBsbF9hdWRpb19wb3N0X2RpdiIsICJwbGxfZHJhbV81MzNtX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAogCSJwbGxfc3lzX3BmZDRfY2xrIiwgInBsbF9lbmV0XzEyNW1fY2xrIiwgImV4dF9jbGtfMiIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpzYWkyX3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfcGZkMl8xMzVtX2NsayIsCi0JInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfZHJhbV81MzNtX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAorCSJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX2RyYW1fNTMzbV9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKIAkicGxsX3N5c19wZmQ0X2NsayIsICJwbGxfZW5ldF8xMjVtX2NsayIsICJleHRfY2xrXzIiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqc2FpM19zZWxbXSA9IHsgIm9zYyIsICJwbGxfc3lzX3BmZDJfMTM1bV9jbGsiLAotCSJwbGxfYXVkaW9fbWFpbl9jbGsiLCAicGxsX2RyYW1fNTMzbV9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKKwkicGxsX2F1ZGlvX3Bvc3RfZGl2IiwgInBsbF9kcmFtXzUzM21fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsCiAJInBsbF9zeXNfcGZkNF9jbGsiLCAicGxsX2VuZXRfMTI1bV9jbGsiLCAiZXh0X2Nsa18zIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnNwZGlmX3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfcGZkMl8xMzVtX2NsayIsCi0JInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfZHJhbV81MzNtX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAorCSJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX2RyYW1fNTMzbV9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKIAkicGxsX3N5c19wZmQ0X2NsayIsICJwbGxfZW5ldF8xMjVtX2NsayIsICJleHRfM19jbGsiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqZW5ldDFfcmVmX3NlbFtdID0geyAib3NjIiwgInBsbF9lbmV0XzEyNW1fY2xrIiwKIAkicGxsX2VuZXRfNTBtX2NsayIsICJwbGxfZW5ldF8yNW1fY2xrIiwKLQkicGxsX3N5c19tYWluXzEyMG1fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAorCSJwbGxfc3lzX21haW5fMTIwbV9jbGsiLCAicGxsX2F1ZGlvX3Bvc3RfZGl2IiwgInBsbF92aWRlb19tYWluX2NsayIsCiAJImV4dF9jbGtfNCIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICplbmV0MV90aW1lX3NlbFtdID0geyAib3NjIiwgInBsbF9lbmV0XzEwMG1fY2xrIiwKLQkicGxsX2F1ZGlvX21haW5fY2xrIiwgImV4dF9jbGtfMSIsICJleHRfY2xrXzIiLCAiZXh0X2Nsa18zIiwKKwkicGxsX2F1ZGlvX3Bvc3RfZGl2IiwgImV4dF9jbGtfMSIsICJleHRfY2xrXzIiLCAiZXh0X2Nsa18zIiwKIAkiZXh0X2Nsa180IiwgInBsbF92aWRlb19tYWluX2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICplbmV0Ml9yZWZfc2VsW10gPSB7ICJvc2MiLCAicGxsX2VuZXRfMTI1bV9jbGsiLAogCSJwbGxfZW5ldF81MG1fY2xrIiwgInBsbF9lbmV0XzI1bV9jbGsiLAotCSJwbGxfc3lzX21haW5fMTIwbV9jbGsiLCAicGxsX2F1ZGlvX21haW5fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsCisJInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKIAkiZXh0X2Nsa180IiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmVuZXQyX3RpbWVfc2VsW10gPSB7ICJvc2MiLCAicGxsX2VuZXRfMTAwbV9jbGsiLAotCSJwbGxfYXVkaW9fbWFpbl9jbGsiLCAiZXh0X2Nsa18xIiwgImV4dF9jbGtfMiIsICJleHRfY2xrXzMiLAorCSJwbGxfYXVkaW9fcG9zdF9kaXYiLCAiZXh0X2Nsa18xIiwgImV4dF9jbGtfMiIsICJleHRfY2xrXzMiLAogCSJleHRfY2xrXzQiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmVuZXRfcGh5X3JlZl9zZWxbXSA9IHsgIm9zYyIsICJwbGxfZW5ldF8yNW1fY2xrIiwKIAkicGxsX2VuZXRfNTBtX2NsayIsICJwbGxfZW5ldF8xMjVtX2NsayIsCi0JInBsbF9kcmFtXzUzM21fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAorCSJwbGxfZHJhbV81MzNtX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKIAkicGxsX3N5c19wZmQzX2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICplaW1fc2VsW10gPSB7ICJvc2MiLCAicGxsX3N5c19wZmQyXzEzNW1fY2xrIiwKQEAgLTE4OCwyMiArMjA4LDIyIEBACiAKIHN0YXRpYyBjb25zdCBjaGFyICppMmMxX3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsCiAJInBsbF9lbmV0XzUwbV9jbGsiLCAicGxsX2RyYW1fNTMzbV9jbGsiLAotCSJwbGxfYXVkaW9fbWFpbl9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgInBsbF91c2JfbWFpbl9jbGsiLAorCSJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgInBsbF91c2JfbWFpbl9jbGsiLAogCSJwbGxfc3lzX3BmZDJfMTM1bV9jbGsiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqaTJjMl9zZWxbXSA9IHsgIm9zYyIsICJwbGxfc3lzX21haW5fMTIwbV9jbGsiLAogCSJwbGxfZW5ldF81MG1fY2xrIiwgInBsbF9kcmFtXzUzM21fY2xrIiwKLQkicGxsX2F1ZGlvX21haW5fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsICJwbGxfdXNiX21haW5fY2xrIiwKKwkicGxsX2F1ZGlvX3Bvc3RfZGl2IiwgInBsbF92aWRlb19tYWluX2NsayIsICJwbGxfdXNiX21haW5fY2xrIiwKIAkicGxsX3N5c19wZmQyXzEzNW1fY2xrIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmkyYzNfc2VsW10gPSB7ICJvc2MiLCAicGxsX3N5c19tYWluXzEyMG1fY2xrIiwKIAkicGxsX2VuZXRfNTBtX2NsayIsICJwbGxfZHJhbV81MzNtX2NsayIsCi0JInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCAicGxsX3VzYl9tYWluX2NsayIsCisJInBsbF9hdWRpb19wb3N0X2RpdiIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCAicGxsX3VzYl9tYWluX2NsayIsCiAJInBsbF9zeXNfcGZkMl8xMzVtX2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICppMmM0X3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsCiAJInBsbF9lbmV0XzUwbV9jbGsiLCAicGxsX2RyYW1fNTMzbV9jbGsiLAotCSJwbGxfYXVkaW9fbWFpbl9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgInBsbF91c2JfbWFpbl9jbGsiLAorCSJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgInBsbF91c2JfbWFpbl9jbGsiLAogCSJwbGxfc3lzX3BmZDJfMTM1bV9jbGsiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqdWFydDFfc2VsW10gPSB7ICJvc2MiLCAicGxsX3N5c19tYWluXzI0MG1fY2xrIiwKQEAgLTI2MiwzMiArMjgyLDMyIEBACiAJInBsbF91c2JfbWFpbl9jbGsiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqcHdtMV9zZWxbXSA9IHsgIm9zYyIsICJwbGxfZW5ldF8xMDBtX2NsayIsCi0JInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsICJwbGxfZW5ldF80MG1fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsCisJInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsICJwbGxfZW5ldF80MG1fY2xrIiwgInBsbF9hdWRpb19wb3N0X2RpdiIsCiAJImV4dF9jbGtfMSIsICJyZWZfMW1fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpwd20yX3NlbFtdID0geyAib3NjIiwgInBsbF9lbmV0XzEwMG1fY2xrIiwKLQkicGxsX3N5c19tYWluXzEyMG1fY2xrIiwgInBsbF9lbmV0XzQwbV9jbGsiLCAicGxsX2F1ZGlvX21haW5fY2xrIiwKKwkicGxsX3N5c19tYWluXzEyMG1fY2xrIiwgInBsbF9lbmV0XzQwbV9jbGsiLCAicGxsX2F1ZGlvX3Bvc3RfZGl2IiwKIAkiZXh0X2Nsa18xIiwgInJlZl8xbV9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnB3bTNfc2VsW10gPSB7ICJvc2MiLCAicGxsX2VuZXRfMTAwbV9jbGsiLAotCSJwbGxfc3lzX21haW5fMTIwbV9jbGsiLCAicGxsX2VuZXRfNDBtX2NsayIsICJwbGxfYXVkaW9fbWFpbl9jbGsiLAorCSJwbGxfc3lzX21haW5fMTIwbV9jbGsiLCAicGxsX2VuZXRfNDBtX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLAogCSJleHRfY2xrXzIiLCAicmVmXzFtX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqcHdtNF9zZWxbXSA9IHsgIm9zYyIsICJwbGxfZW5ldF8xMDBtX2NsayIsCi0JInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsICJwbGxfZW5ldF80MG1fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsCisJInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsICJwbGxfZW5ldF80MG1fY2xrIiwgInBsbF9hdWRpb19wb3N0X2RpdiIsCiAJImV4dF9jbGtfMiIsICJyZWZfMW1fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpmbGV4dGltZXIxX3NlbFtdID0geyAib3NjIiwgInBsbF9lbmV0XzEwMG1fY2xrIiwKLQkicGxsX3N5c19tYWluXzEyMG1fY2xrIiwgInBsbF9lbmV0XzQwbV9jbGsiLCAicGxsX2F1ZGlvX21haW5fY2xrIiwKKwkicGxsX3N5c19tYWluXzEyMG1fY2xrIiwgInBsbF9lbmV0XzQwbV9jbGsiLCAicGxsX2F1ZGlvX3Bvc3RfZGl2IiwKIAkiZXh0X2Nsa18zIiwgInJlZl8xbV9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmZsZXh0aW1lcjJfc2VsW10gPSB7ICJvc2MiLCAicGxsX2VuZXRfMTAwbV9jbGsiLAotCSJwbGxfc3lzX21haW5fMTIwbV9jbGsiLCAicGxsX2VuZXRfNDBtX2NsayIsICJwbGxfYXVkaW9fbWFpbl9jbGsiLAorCSJwbGxfc3lzX21haW5fMTIwbV9jbGsiLCAicGxsX2VuZXRfNDBtX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLAogCSJleHRfY2xrXzMiLCAicmVmXzFtX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqc2ltMV9zZWxbXSA9IHsgIm9zYyIsICJwbGxfc3lzX3BmZDJfMTM1bV9jbGsiLAogCSJwbGxfc3lzX21haW5fMTIwbV9jbGsiLCAicGxsX2RyYW1fNTMzbV9jbGsiLAotCSJwbGxfdXNiX21haW5fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfZW5ldF8xMjVtX2NsayIsCisJInBsbF91c2JfbWFpbl9jbGsiLCAicGxsX2F1ZGlvX3Bvc3RfZGl2IiwgInBsbF9lbmV0XzEyNW1fY2xrIiwKIAkicGxsX3N5c19wZmQ3X2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpzaW0yX3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfcGZkMl8xMzVtX2NsayIsCkBAIC0yOTcsMTkgKzMxNywxOSBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqZ3B0MV9zZWxbXSA9IHsgIm9zYyIsICJwbGxfZW5ldF8xMDBtX2NsayIsCiAJInBsbF9zeXNfcGZkMF8zOTJtX2NsayIsICJwbGxfZW5ldF80MG1fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsCi0JInJlZl8xbV9jbGsiLCAicGxsX2F1ZGlvX21haW5fY2xrIiwgImV4dF9jbGtfMSIsIH07CisJInJlZl8xbV9jbGsiLCAicGxsX2F1ZGlvX3Bvc3RfZGl2IiwgImV4dF9jbGtfMSIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpncHQyX3NlbFtdID0geyAib3NjIiwgInBsbF9lbmV0XzEwMG1fY2xrIiwKIAkicGxsX3N5c19wZmQwXzM5Mm1fY2xrIiwgInBsbF9lbmV0XzQwbV9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKLQkicmVmXzFtX2NsayIsICJwbGxfYXVkaW9fbWFpbl9jbGsiLCAiZXh0X2Nsa18yIiwgfTsKKwkicmVmXzFtX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLCAiZXh0X2Nsa18yIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmdwdDNfc2VsW10gPSB7ICJvc2MiLCAicGxsX2VuZXRfMTAwbV9jbGsiLAogCSJwbGxfc3lzX3BmZDBfMzkybV9jbGsiLCAicGxsX2VuZXRfNDBtX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAotCSJyZWZfMW1fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsICJleHRfY2xrXzMiLCB9OworCSJyZWZfMW1fY2xrIiwgInBsbF9hdWRpb19wb3N0X2RpdiIsICJleHRfY2xrXzMiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqZ3B0NF9zZWxbXSA9IHsgIm9zYyIsICJwbGxfZW5ldF8xMDBtX2NsayIsCiAJInBsbF9zeXNfcGZkMF8zOTJtX2NsayIsICJwbGxfZW5ldF80MG1fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsCi0JInJlZl8xbV9jbGsiLCAicGxsX2F1ZGlvX21haW5fY2xrIiwgImV4dF9jbGtfNCIsIH07CisJInJlZl8xbV9jbGsiLCAicGxsX2F1ZGlvX3Bvc3RfZGl2IiwgImV4dF9jbGtfNCIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICp0cmFjZV9zZWxbXSA9IHsgIm9zYyIsICJwbGxfc3lzX3BmZDJfMTM1bV9jbGsiLAogCSJwbGxfc3lzX21haW5fMTIwbV9jbGsiLCAicGxsX2RyYW1fNTMzbV9jbGsiLApAQCAtMzIzLDEyICszNDMsMTIgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKmNzaV9tY2xrX3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfcGZkMl8xMzVtX2NsayIsCiAJInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsICJwbGxfZHJhbV81MzNtX2NsayIsCi0JInBsbF9lbmV0XzEyNW1fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAorCSJwbGxfZW5ldF8xMjVtX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKIAkicGxsX3VzYl9tYWluX2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICphdWRpb19tY2xrX3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfcGZkMl8xMzVtX2NsayIsCiAJInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsICJwbGxfZHJhbV81MzNtX2NsayIsCi0JInBsbF9lbmV0XzEyNW1fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAorCSJwbGxfZW5ldF8xMjVtX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKIAkicGxsX3VzYl9tYWluX2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICp3cmNsa19zZWxbXSA9IHsgIm9zYyIsICJwbGxfZW5ldF80MG1fY2xrIiwKQEAgLTM0MiwxMyArMzYyLDEzIEBACiAKIHN0YXRpYyBjb25zdCBjaGFyICpjbGtvMl9zZWxbXSA9IHsgIm9zYyIsICJwbGxfc3lzX21haW5fMjQwbV9jbGsiLAogCSJwbGxfc3lzX3BmZDBfMzkybV9jbGsiLCAicGxsX3N5c19wZmQxXzE2Nm1fY2xrIiwgInBsbF9zeXNfcGZkNF9jbGsiLAotCSJwbGxfYXVkaW9fbWFpbl9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgImNraWwiLCB9OworCSJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgImNraWwiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqbHZkczFfc2VsW10gPSB7ICJwbGxfYXJtX21haW5fY2xrIiwKIAkicGxsX3N5c19tYWluX2NsayIsICJwbGxfc3lzX3BmZDBfMzkybV9jbGsiLCAicGxsX3N5c19wZmQxXzMzMm1fY2xrIiwKIAkicGxsX3N5c19wZmQyXzI3MG1fY2xrIiwgInBsbF9zeXNfcGZkM19jbGsiLCAicGxsX3N5c19wZmQ0X2NsayIsCiAJInBsbF9zeXNfcGZkNV9jbGsiLCAicGxsX3N5c19wZmQ2X2NsayIsICJwbGxfc3lzX3BmZDdfY2xrIiwKLQkicGxsX2F1ZGlvX21haW5fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsICJwbGxfZW5ldF81MDBtX2NsayIsCisJInBsbF9hdWRpb19wb3N0X2RpdiIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCAicGxsX2VuZXRfNTAwbV9jbGsiLAogCSJwbGxfZW5ldF8yNTBtX2NsayIsICJwbGxfZW5ldF8xMjVtX2NsayIsICJwbGxfZW5ldF8xMDBtX2NsayIsCiAJInBsbF9lbmV0XzUwbV9jbGsiLCAicGxsX2VuZXRfNDBtX2NsayIsICJwbGxfZW5ldF8yNW1fY2xrIiwKIAkicGxsX2RyYW1fbWFpbl9jbGsiLCB9OwpAQCAtNDMwLDYgKzQ1MCwxMSBAQAogCWNsa3NbSU1YN0RfUExMX0FVRElPX01BSU5fQ0xLXSA9IGlteF9jbGtfZ2F0ZSgicGxsX2F1ZGlvX21haW5fY2xrIiwgInBsbF9hdWRpb19tYWluX2J5cGFzcyIsIGJhc2UgKyAweGYwLCAxMyk7CiAJY2xrc1tJTVg3RF9QTExfVklERU9fTUFJTl9DTEtdID0gaW14X2Nsa19nYXRlKCJwbGxfdmlkZW9fbWFpbl9jbGsiLCAicGxsX3ZpZGVvX21haW5fYnlwYXNzIiwgYmFzZSArIDB4MTMwLCAxMyk7CiAKKwljbGtzW0lNWDdEX1BMTF9BVURJT19URVNUX0RJVl0gID0gY2xrX3JlZ2lzdGVyX2RpdmlkZXJfdGFibGUoTlVMTCwgInBsbF9hdWRpb190ZXN0X2RpdiIsICJwbGxfYXVkaW9fbWFpbl9jbGsiLAorCQkJCUNMS19TRVRfUkFURV9QQVJFTlQgfCBDTEtfU0VUX1JBVEVfR0FURSwgYmFzZSArIDB4ZjAsIDE5LCAyLCAwLCB0ZXN0X2Rpdl90YWJsZSwgJmlteF9jY21fbG9jayk7CisJY2xrc1tJTVg3RF9QTExfQVVESU9fUE9TVF9ESVZdID0gY2xrX3JlZ2lzdGVyX2RpdmlkZXJfdGFibGUoTlVMTCwgInBsbF9hdWRpb19wb3N0X2RpdiIsICJwbGxfYXVkaW9fdGVzdF9kaXYiLAorCQkJCUNMS19TRVRfUkFURV9QQVJFTlQgfCBDTEtfU0VUX1JBVEVfR0FURSwgYmFzZSArIDB4ZjAsIDIyLCAyLCAwLCBwb3N0X2Rpdl90YWJsZSwgJmlteF9jY21fbG9jayk7CisKIAljbGtzW0lNWDdEX1BMTF9TWVNfUEZEMF8zOTJNX0NMS10gPSBpbXhfY2xrX3BmZCgicGxsX3N5c19wZmQwXzM5Mm1fY2xrIiwgInBsbF9zeXNfbWFpbl9jbGsiLCBiYXNlICsgMHhjMCwgMCk7CiAJY2xrc1tJTVg3RF9QTExfU1lTX1BGRDFfMzMyTV9DTEtdID0gaW14X2Nsa19wZmQoInBsbF9zeXNfcGZkMV8zMzJtX2NsayIsICJwbGxfc3lzX21haW5fY2xrIiwgYmFzZSArIDB4YzAsIDEpOwogCWNsa3NbSU1YN0RfUExMX1NZU19QRkQyXzI3ME1fQ0xLXSA9IGlteF9jbGtfcGZkKCJwbGxfc3lzX3BmZDJfMjcwbV9jbGsiLCAicGxsX3N5c19tYWluX2NsayIsIGJhc2UgKyAweGMwLCAyKTsKQEAgLTc3OSw2ICs4MDQsNyBAQAogCWNsa3NbSU1YN0RfRFJBTV9QSFlNX0FMVF9ST09UX0NMS10gPSBpbXhfY2xrX2dhdGU0KCJkcmFtX3BoeW1fYWx0X3Jvb3RfY2xrIiwgImRyYW1fcGh5bV9hbHRfcG9zdF9kaXYiLCBiYXNlICsgMHg0MTMwLCAwKTsKIAljbGtzW0lNWDdEX0RSQU1fQUxUX1JPT1RfQ0xLXSA9IGlteF9jbGtfZ2F0ZTQoImRyYW1fYWx0X3Jvb3RfY2xrIiwgImRyYW1fYWx0X3Bvc3RfZGl2IiwgYmFzZSArIDB4NDEzMCwgMCk7CiAJY2xrc1tJTVg3RF9VU0JfSFNJQ19ST09UX0NMS10gPSBpbXhfY2xrX2dhdGU0KCJ1c2JfaHNpY19yb290X2NsayIsICJ1c2JfaHNpY19wb3N0X2RpdiIsIGJhc2UgKyAweDQ0MjAsIDApOworCWNsa3NbSU1YN0RfU0RNQV9DT1JFX0NMS10gPSBpbXhfY2xrX2dhdGU0KCJzZG1hX3Jvb3RfY2xrIiwgImFoYl9yb290X2NsayIsIGJhc2UgKyAweDQ0ODAsIDApOwogCWNsa3NbSU1YN0RfUENJRV9DVFJMX1JPT1RfQ0xLXSA9IGlteF9jbGtfZ2F0ZTQoInBjaWVfY3RybF9yb290X2NsayIsICJwY2llX2N0cmxfcG9zdF9kaXYiLCBiYXNlICsgMHg0NjAwLCAwKTsKIAljbGtzW0lNWDdEX1BDSUVfUEhZX1JPT1RfQ0xLXSA9IGlteF9jbGtfZ2F0ZTQoInBjaWVfcGh5X3Jvb3RfY2xrIiwgInBjaWVfcGh5X3Bvc3RfZGl2IiwgYmFzZSArIDB4NDYwMCwgMCk7CiAJY2xrc1tJTVg3RF9FUERDX1BJWEVMX1JPT1RfQ0xLXSA9IGlteF9jbGtfZ2F0ZTQoImVwZGNfcGl4ZWxfcm9vdF9jbGsiLCAiZXBkY19waXhlbF9wb3N0X2RpdiIsIGJhc2UgKyAweDQ0YTAsIDApOwpAQCAtNzg2LDkgKzgxMiwxMiBAQAogCWNsa3NbSU1YN0RfTUlQSV9EU0lfUk9PVF9DTEtdID0gaW14X2Nsa19nYXRlNCgibWlwaV9kc2lfcm9vdF9jbGsiLCAibWlwaV9kc2lfcG9zdF9kaXYiLCBiYXNlICsgMHg0NjUwLCAwKTsKIAljbGtzW0lNWDdEX01JUElfQ1NJX1JPT1RfQ0xLXSA9IGlteF9jbGtfZ2F0ZTQoIm1pcGlfY3NpX3Jvb3RfY2xrIiwgIm1pcGlfY3NpX3Bvc3RfZGl2IiwgYmFzZSArIDB4NDY0MCwgMCk7CiAJY2xrc1tJTVg3RF9NSVBJX0RQSFlfUk9PVF9DTEtdID0gaW14X2Nsa19nYXRlNCgibWlwaV9kcGh5X3Jvb3RfY2xrIiwgIm1pcGlfZHBoeV9wb3N0X2RpdiIsIGJhc2UgKyAweDQ2NjAsIDApOwotCWNsa3NbSU1YN0RfU0FJMV9ST09UX0NMS10gPSBpbXhfY2xrX2dhdGU0KCJzYWkxX3Jvb3RfY2xrIiwgInNhaTFfcG9zdF9kaXYiLCBiYXNlICsgMHg0OGMwLCAwKTsKLQljbGtzW0lNWDdEX1NBSTJfUk9PVF9DTEtdID0gaW14X2Nsa19nYXRlNCgic2FpMl9yb290X2NsayIsICJzYWkyX3Bvc3RfZGl2IiwgYmFzZSArIDB4NDhkMCwgMCk7Ci0JY2xrc1tJTVg3RF9TQUkzX1JPT1RfQ0xLXSA9IGlteF9jbGtfZ2F0ZTQoInNhaTNfcm9vdF9jbGsiLCAic2FpM19wb3N0X2RpdiIsIGJhc2UgKyAweDQ4ZTAsIDApOworCWNsa3NbSU1YN0RfU0FJMV9ST09UX0NMS10gPSBpbXhfY2xrX2dhdGUyX3NoYXJlZDIoInNhaTFfcm9vdF9jbGsiLCAic2FpMV9wb3N0X2RpdiIsIGJhc2UgKyAweDQ4YzAsIDAsICZzaGFyZV9jb3VudF9zYWkxKTsKKwljbGtzW0lNWDdEX1NBSTFfSVBHX0NMS10gID0gaW14X2Nsa19nYXRlMl9zaGFyZWQyKCJzYWkxX2lwZ19jbGsiLCAgImlwZ19yb290X2NsayIsICBiYXNlICsgMHg0OGMwLCAwLCAmc2hhcmVfY291bnRfc2FpMSk7CisJY2xrc1tJTVg3RF9TQUkyX1JPT1RfQ0xLXSA9IGlteF9jbGtfZ2F0ZTJfc2hhcmVkMigic2FpMl9yb290X2NsayIsICJzYWkyX3Bvc3RfZGl2IiwgYmFzZSArIDB4NDhkMCwgMCwgJnNoYXJlX2NvdW50X3NhaTIpOworCWNsa3NbSU1YN0RfU0FJMl9JUEdfQ0xLXSAgPSBpbXhfY2xrX2dhdGUyX3NoYXJlZDIoInNhaTJfaXBnX2NsayIsICAiaXBnX3Jvb3RfY2xrIiwgIGJhc2UgKyAweDQ4ZDAsIDAsICZzaGFyZV9jb3VudF9zYWkyKTsKKwljbGtzW0lNWDdEX1NBSTNfUk9PVF9DTEtdID0gaW14X2Nsa19nYXRlMl9zaGFyZWQyKCJzYWkzX3Jvb3RfY2xrIiwgInNhaTNfcG9zdF9kaXYiLCBiYXNlICsgMHg0OGUwLCAwLCAmc2hhcmVfY291bnRfc2FpMyk7CisJY2xrc1tJTVg3RF9TQUkzX0lQR19DTEtdICA9IGlteF9jbGtfZ2F0ZTJfc2hhcmVkMigic2FpM19pcGdfY2xrIiwgICJpcGdfcm9vdF9jbGsiLCAgYmFzZSArIDB4NDhlMCwgMCwgJnNoYXJlX2NvdW50X3NhaTMpOwogCWNsa3NbSU1YN0RfU1BESUZfUk9PVF9DTEtdID0gaW14X2Nsa19nYXRlNCgic3BkaWZfcm9vdF9jbGsiLCAic3BkaWZfcG9zdF9kaXYiLCBiYXNlICsgMHg0NGQwLCAwKTsKIAljbGtzW0lNWDdEX0VORVQxX1JFRl9ST09UX0NMS10gPSBpbXhfY2xrX2dhdGU0KCJlbmV0MV9yZWZfcm9vdF9jbGsiLCAiZW5ldDFfcmVmX3Bvc3RfZGl2IiwgYmFzZSArIDB4NDRlMCwgMCk7CiAJY2xrc1tJTVg3RF9FTkVUMV9USU1FX1JPT1RfQ0xLXSA9IGlteF9jbGtfZ2F0ZTQoImVuZXQxX3RpbWVfcm9vdF9jbGsiLCAiZW5ldDFfdGltZV9wb3N0X2RpdiIsIGJhc2UgKyAweDQ0ZjAsIDApOwpAQCAtODYwLDggKzg4OSw2IEBACiAJLyogdXNlIG9sZCBncHQgY2xrIHNldHRpbmcsIGdwdDEgcm9vdCBjbGsgbXVzdCBiZSB0d2ljZSBhcyBncHQgY291bnRlciBmcmVxICovCiAJY2xrX3NldF9wYXJlbnQoY2xrc1tJTVg3RF9HUFQxX1JPT1RfU1JDXSwgY2xrc1tJTVg3RF9PU0NfMjRNX0NMS10pOwogCi0JY2xrX3NldF9wYXJlbnQoY2xrc1tJTVg3RF9FTkVUX0FYSV9ST09UX1NSQ10sIGNsa3NbSU1YN0RfUExMX0VORVRfTUFJTl8yNTBNX0NMS10pOwotCiAJLyogc2V0IHVhcnQgbW9kdWxlIGNsb2NrJ3MgcGFyZW50IGNsb2NrIHNvdXJjZSB0aGF0IG11c3QgYmUgZ3JlYXQgdGhlbiA4ME1IeiAqLwogCWNsa19zZXRfcGFyZW50KGNsa3NbSU1YN0RfVUFSVDFfUk9PVF9TUkNdLCBjbGtzW0lNWDdEX09TQ18yNE1fQ0xLXSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2lteC9jbGsuaCBiL2RyaXZlcnMvY2xrL2lteC9jbGsuaAppbmRleCBhODFjMDM4Li4zNzk5ZmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9pbXgvY2xrLmgKKysrIGIvZHJpdmVycy9jbGsvaW14L2Nsay5oCkBAIC0xMzQsNiArMTM0LDE1IEBACiAJCQlzaGlmdCwgMHgzLCAwLCAmaW14X2NjbV9sb2NrLCBzaGFyZV9jb3VudCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNsayAqaW14X2Nsa19nYXRlMl9zaGFyZWQyKGNvbnN0IGNoYXIgKm5hbWUsCisJCWNvbnN0IGNoYXIgKnBhcmVudCwgdm9pZCBfX2lvbWVtICpyZWcsIHU4IHNoaWZ0LAorCQl1bnNpZ25lZCBpbnQgKnNoYXJlX2NvdW50KQoreworCXJldHVybiBjbGtfcmVnaXN0ZXJfZ2F0ZTIoTlVMTCwgbmFtZSwgcGFyZW50LCBDTEtfU0VUX1JBVEVfUEFSRU5UIHwKKwkJCQkgIENMS19PUFNfUEFSRU5UX0VOQUJMRSwgcmVnLCBzaGlmdCwgMHgzLCAwLAorCQkJCSAgJmlteF9jY21fbG9jaywgc2hhcmVfY291bnQpOworfQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjbGsgKmlteF9jbGtfZ2F0ZTJfY2dyKGNvbnN0IGNoYXIgKm5hbWUsCiAJCWNvbnN0IGNoYXIgKnBhcmVudCwgdm9pZCBfX2lvbWVtICpyZWcsIHU4IHNoaWZ0LCB1OCBjZ3JfdmFsKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbG9vbmdzb24xL01ha2VmaWxlIGIvZHJpdmVycy9jbGsvbG9vbmdzb24xL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZjZhMTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsay9sb29uZ3NvbjEvTWFrZWZpbGUKQEAgLTAsMCArMSwzIEBACitvYmoteQkJCQkrPSBjbGsubworb2JqLSQoQ09ORklHX0xPT05HU09OMV9MUzFCKQkrPSBjbGstbG9vbmdzb24xYi5vCitvYmotJChDT05GSUdfTE9PTkdTT04xX0xTMUMpCSs9IGNsay1sb29uZ3NvbjFjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2xvb25nc29uMS9jbGstbG9vbmdzb24xYi5jIGIvZHJpdmVycy9jbGsvbG9vbmdzb24xL2Nsay1sb29uZ3NvbjFiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM2YTk3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2xrL2xvb25nc29uMS9jbGstbG9vbmdzb24xYi5jCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTYgWmhhbmcsIEtlZ3VhbmcgPGtlZ3VhbmcuemhhbmdAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNpbmNsdWRlIDxsb29uZ3NvbjEuaD4KKyNpbmNsdWRlICJjbGsuaCIKKworI2RlZmluZSBPU0MJCSgzMyAqIDEwMDAwMDApCisjZGVmaW5lIERJVl9BUEIJCTIKKworc3RhdGljIERFRklORV9TUElOTE9DSyhfbG9jayk7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxzMXhfcGxsX3JlY2FsY19yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LAorCQkJCQkgIHVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUpCit7CisJdTMyIHBsbCwgcmF0ZTsKKworCXBsbCA9IF9fcmF3X3JlYWRsKExTMVhfQ0xLX1BMTF9GUkVRKTsKKwlyYXRlID0gMTIgKyAocGxsICYgR0VOTUFTSyg1LCAwKSk7CisJcmF0ZSAqPSBPU0M7CisJcmF0ZSA+Pj0gMTsKKworCXJldHVybiByYXRlOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgbHMxeF9wbGxfY2xrX29wcyA9IHsKKwkucmVjYWxjX3JhdGUgPSBsczF4X3BsbF9yZWNhbGNfcmF0ZSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjcHVfcGFyZW50c1tdID0geyAiY3B1X2Nsa19kaXYiLCAib3NjX2NsayIsIH07CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYWhiX3BhcmVudHNbXSA9IHsgImFoYl9jbGtfZGl2IiwgIm9zY19jbGsiLCB9Oworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGRjX3BhcmVudHNbXSA9IHsgImRjX2Nsa19kaXYiLCAib3NjX2NsayIsIH07CisKK3ZvaWQgX19pbml0IGxzMXhfY2xrX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKKworCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgIm9zY19jbGsiLCBOVUxMLCAwLCBPU0MpOworCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoaHcsICJvc2NfY2xrIiwgTlVMTCk7CisKKwkvKiBjbG9jayBkZXJpdmVkIGZyb20gMzMgTUh6IE9TQyBjbGsgKi8KKwlodyA9IGNsa19od19yZWdpc3Rlcl9wbGwoTlVMTCwgInBsbF9jbGsiLCAib3NjX2NsayIsCisJCQkJICZsczF4X3BsbF9jbGtfb3BzLCAwKTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCAicGxsX2NsayIsIE5VTEwpOworCisJLyogY2xvY2sgZGVyaXZlZCBmcm9tIFBMTCBjbGsgKi8KKwkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fCisJICogICAgICAgICBfX19fX19fX19fX19fX19fX19fX19fX3wgICAgIHwKKwkgKiBPU0MgX19fLyAgICAgICAgICAgICAgICAgICAgICAgfCBNVVggfF9fXyBDUFUgQ0xLCisJICogICAgICAgIFxfX18gUExMIF9fXyBDUFUgRElWIF9fX3wgICAgIHwKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF9fX19ffAorCSAqLworCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX2RpdmlkZXIoTlVMTCwgImNwdV9jbGtfZGl2IiwgInBsbF9jbGsiLAorCQkJCSAgIENMS19HRVRfUkFURV9OT0NBQ0hFLCBMUzFYX0NMS19QTExfRElWLAorCQkJCSAgIERJVl9DUFVfU0hJRlQsIERJVl9DUFVfV0lEVEgsCisJCQkJICAgQ0xLX0RJVklERVJfT05FX0JBU0VEIHwKKwkJCQkgICBDTEtfRElWSURFUl9ST1VORF9DTE9TRVNULCAmX2xvY2spOworCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoaHcsICJjcHVfY2xrX2RpdiIsIE5VTEwpOworCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX211eChOVUxMLCAiY3B1X2NsayIsIGNwdV9wYXJlbnRzLAorCQkJICAgICAgIEFSUkFZX1NJWkUoY3B1X3BhcmVudHMpLAorCQkJICAgICAgIENMS19TRVRfUkFURV9OT19SRVBBUkVOVCwgTFMxWF9DTEtfUExMX0RJViwKKwkJCSAgICAgICBCWVBBU1NfQ1BVX1NISUZULCBCWVBBU1NfQ1BVX1dJRFRILCAwLCAmX2xvY2spOworCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoaHcsICJjcHVfY2xrIiwgTlVMTCk7CisKKwkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fCisJICogICAgICAgICBfX19fX19fX19fX19fX19fX19fX19fX3wgICAgIHwKKwkgKiBPU0MgX19fLyAgICAgICAgICAgICAgICAgICAgICAgfCBNVVggfF9fXyBEQyAgQ0xLCisJICogICAgICAgIFxfX18gUExMIF9fXyBEQyAgRElWIF9fX3wgICAgIHwKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF9fX19ffAorCSAqLworCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX2RpdmlkZXIoTlVMTCwgImRjX2Nsa19kaXYiLCAicGxsX2NsayIsCisJCQkJICAgMCwgTFMxWF9DTEtfUExMX0RJViwgRElWX0RDX1NISUZULAorCQkJCSAgIERJVl9EQ19XSURUSCwgQ0xLX0RJVklERVJfT05FX0JBU0VELCAmX2xvY2spOworCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoaHcsICJkY19jbGtfZGl2IiwgTlVMTCk7CisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfbXV4KE5VTEwsICJkY19jbGsiLCBkY19wYXJlbnRzLAorCQkJICAgICAgIEFSUkFZX1NJWkUoZGNfcGFyZW50cyksCisJCQkgICAgICAgQ0xLX1NFVF9SQVRFX05PX1JFUEFSRU5ULCBMUzFYX0NMS19QTExfRElWLAorCQkJICAgICAgIEJZUEFTU19EQ19TSElGVCwgQllQQVNTX0RDX1dJRFRILCAwLCAmX2xvY2spOworCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoaHcsICJkY19jbGsiLCBOVUxMKTsKKworCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX18KKwkgKiAgICAgICAgIF9fX19fX19fX19fX19fX19fX19fX19ffCAgICAgfAorCSAqIE9TQyBfX18vICAgICAgICAgICAgICAgICAgICAgICB8IE1VWCB8X19fIEREUiBDTEsKKwkgKiAgICAgICAgXF9fXyBQTEwgX19fIEREUiBESVYgX19ffCAgICAgfAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8X19fX198CisJICovCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfZGl2aWRlcihOVUxMLCAiYWhiX2Nsa19kaXYiLCAicGxsX2NsayIsCisJCQkJICAgMCwgTFMxWF9DTEtfUExMX0RJViwgRElWX0REUl9TSElGVCwKKwkJCQkgICBESVZfRERSX1dJRFRILCBDTEtfRElWSURFUl9PTkVfQkFTRUQsCisJCQkJICAgJl9sb2NrKTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCAiYWhiX2Nsa19kaXYiLCBOVUxMKTsKKwlodyA9IGNsa19od19yZWdpc3Rlcl9tdXgoTlVMTCwgImFoYl9jbGsiLCBhaGJfcGFyZW50cywKKwkJCSAgICAgICBBUlJBWV9TSVpFKGFoYl9wYXJlbnRzKSwKKwkJCSAgICAgICBDTEtfU0VUX1JBVEVfTk9fUkVQQVJFTlQsIExTMVhfQ0xLX1BMTF9ESVYsCisJCQkgICAgICAgQllQQVNTX0REUl9TSElGVCwgQllQQVNTX0REUl9XSURUSCwgMCwgJl9sb2NrKTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCAiYWhiX2NsayIsIE5VTEwpOworCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoaHcsICJsczF4LWRtYSIsIE5VTEwpOworCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoaHcsICJzdG1tYWNldGgiLCBOVUxMKTsKKworCS8qIGNsb2NrIGRlcml2ZWQgZnJvbSBBSEIgY2xrICovCisJLyogQVBCIGNsayBpcyBhbHdheXMgaGFsZiBvZiB0aGUgQUhCIGNsayAqLworCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLCAiYXBiX2NsayIsICJhaGJfY2xrIiwgMCwgMSwKKwkJCQkJRElWX0FQQik7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgImFwYl9jbGsiLCBOVUxMKTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCAibHMxeC1hYzk3IiwgTlVMTCk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgImxzMXgtaTJjIiwgTlVMTCk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgImxzMXgtbmFuZCIsIE5VTEwpOworCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoaHcsICJsczF4LXB3bXRpbWVyIiwgTlVMTCk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgImxzMXgtc3BpIiwgTlVMTCk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgImxzMXgtd2R0IiwgTlVMTCk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgInNlcmlhbDgyNTAiLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2xvb25nc29uMS9jbGstbG9vbmdzb24xYy5jIGIvZHJpdmVycy9jbGsvbG9vbmdzb24xL2Nsay1sb29uZ3NvbjFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ2NmY3MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2xrL2xvb25nc29uMS9jbGstbG9vbmdzb24xYy5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgWWFuZyBMaW5nIDxnbmF5Z25pbEBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CisKKyNpbmNsdWRlIDxsb29uZ3NvbjEuaD4KKyNpbmNsdWRlICJjbGsuaCIKKworI2RlZmluZSBPU0MJCSgyNCAqIDEwMDAwMDApCisjZGVmaW5lIERJVl9BUEIJCTEKKworc3RhdGljIERFRklORV9TUElOTE9DSyhfbG9jayk7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxzMXhfcGxsX3JlY2FsY19yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LAorCQkJCQkgIHVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUpCit7CisJdTMyIHBsbCwgcmF0ZTsKKworCXBsbCA9IF9fcmF3X3JlYWRsKExTMVhfQ0xLX1BMTF9GUkVRKTsKKwlyYXRlID0gKChwbGwgPj4gOCkgJiAweGZmKSArICgocGxsID4+IDE2KSAmIDB4ZmYpOworCXJhdGUgKj0gT1NDOworCXJhdGUgPj49IDI7CisKKwlyZXR1cm4gcmF0ZTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIGxzMXhfcGxsX2Nsa19vcHMgPSB7CisJLnJlY2FsY19yYXRlID0gbHMxeF9wbGxfcmVjYWxjX3JhdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19kaXZfdGFibGUgYWhiX2Rpdl90YWJsZVtdID0geworCVswXSA9IHsgLnZhbCA9IDAsIC5kaXYgPSAyIH0sCisJWzFdID0geyAudmFsID0gMSwgLmRpdiA9IDQgfSwKKwlbMl0gPSB7IC52YWwgPSAyLCAuZGl2ID0gMyB9LAorCVszXSA9IHsgLnZhbCA9IDMsIC5kaXYgPSAzIH0sCit9OworCit2b2lkIF9faW5pdCBsczF4X2Nsa19pbml0KHZvaWQpCit7CisJc3RydWN0IGNsa19odyAqaHc7CisKKwlodyA9IGNsa19od19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJvc2NfY2xrIiwgTlVMTCwgMCwgT1NDKTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCAib3NjX2NsayIsIE5VTEwpOworCisJLyogY2xvY2sgZGVyaXZlZCBmcm9tIDI0IE1IeiBPU0MgY2xrICovCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfcGxsKE5VTEwsICJwbGxfY2xrIiwgIm9zY19jbGsiLAorCQkJCSZsczF4X3BsbF9jbGtfb3BzLCAwKTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCAicGxsX2NsayIsIE5VTEwpOworCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfZGl2aWRlcihOVUxMLCAiY3B1X2Nsa19kaXYiLCAicGxsX2NsayIsCisJCQkJICAgQ0xLX0dFVF9SQVRFX05PQ0FDSEUsIExTMVhfQ0xLX1BMTF9ESVYsCisJCQkJICAgRElWX0NQVV9TSElGVCwgRElWX0NQVV9XSURUSCwKKwkJCQkgICBDTEtfRElWSURFUl9PTkVfQkFTRUQgfAorCQkJCSAgIENMS19ESVZJREVSX1JPVU5EX0NMT1NFU1QsICZfbG9jayk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgImNwdV9jbGtfZGl2IiwgTlVMTCk7CisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfZml4ZWRfZmFjdG9yKE5VTEwsICJjcHVfY2xrIiwgImNwdV9jbGtfZGl2IiwKKwkJCQkJMCwgMSwgMSk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgImNwdV9jbGsiLCBOVUxMKTsKKworCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX2RpdmlkZXIoTlVMTCwgImRjX2Nsa19kaXYiLCAicGxsX2NsayIsCisJCQkJICAgMCwgTFMxWF9DTEtfUExMX0RJViwgRElWX0RDX1NISUZULAorCQkJCSAgIERJVl9EQ19XSURUSCwgQ0xLX0RJVklERVJfT05FX0JBU0VELCAmX2xvY2spOworCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoaHcsICJkY19jbGtfZGl2IiwgTlVMTCk7CisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfZml4ZWRfZmFjdG9yKE5VTEwsICJkY19jbGsiLCAiZGNfY2xrX2RpdiIsCisJCQkJCTAsIDEsIDEpOworCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoaHcsICJkY19jbGsiLCBOVUxMKTsKKworCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX2RpdmlkZXJfdGFibGUoTlVMTCwgImFoYl9jbGtfZGl2IiwgImNwdV9jbGtfZGl2IiwKKwkJCQkwLCBMUzFYX0NMS19QTExfRlJFUSwgRElWX0REUl9TSElGVCwKKwkJCQlESVZfRERSX1dJRFRILCBDTEtfRElWSURFUl9BTExPV19aRVJPLAorCQkJCWFoYl9kaXZfdGFibGUsICZfbG9jayk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgImFoYl9jbGtfZGl2IiwgTlVMTCk7CisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfZml4ZWRfZmFjdG9yKE5VTEwsICJhaGJfY2xrIiwgImFoYl9jbGtfZGl2IiwKKwkJCQkJMCwgMSwgMSk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgImFoYl9jbGsiLCBOVUxMKTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCAibHMxeC1kbWEiLCBOVUxMKTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCAic3RtbWFjZXRoIiwgTlVMTCk7CisKKwkvKiBjbG9jayBkZXJpdmVkIGZyb20gQUhCIGNsayAqLworCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLCAiYXBiX2NsayIsICJhaGJfY2xrIiwgMCwgMSwKKwkJCQkJRElWX0FQQik7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgImFwYl9jbGsiLCBOVUxMKTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCAibHMxeC1hYzk3IiwgTlVMTCk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgImxzMXgtaTJjIiwgTlVMTCk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgImxzMXgtbmFuZCIsIE5VTEwpOworCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoaHcsICJsczF4LXB3bXRpbWVyIiwgTlVMTCk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgImxzMXgtc3BpIiwgTlVMTCk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgImxzMXgtd2R0IiwgTlVMTCk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgInNlcmlhbDgyNTAiLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2xvb25nc29uMS9jbGsuYyBiL2RyaXZlcnMvY2xrL2xvb25nc29uMS9jbGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmNmZDE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbGsvbG9vbmdzb24xL2Nsay5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiBaaGFuZywgS2VndWFuZyA8a2VndWFuZy56aGFuZ0BnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCitzdHJ1Y3QgY2xrX2h3ICpfX2luaXQgY2xrX2h3X3JlZ2lzdGVyX3BsbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJICBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSwKKwkJCQkJICBjb25zdCBzdHJ1Y3QgY2xrX29wcyAqb3BzLAorCQkJCQkgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKKwlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OworCisJLyogYWxsb2NhdGUgdGhlIGRpdmlkZXIgKi8KKwlodyA9IGt6YWxsb2Moc2l6ZW9mKCpodyksIEdGUF9LRVJORUwpOworCWlmICghaHcpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaW5pdC5uYW1lID0gbmFtZTsKKwlpbml0Lm9wcyA9IG9wczsKKwlpbml0LmZsYWdzID0gZmxhZ3MgfCBDTEtfSVNfQkFTSUM7CisJaW5pdC5wYXJlbnRfbmFtZXMgPSAocGFyZW50X25hbWUgPyAmcGFyZW50X25hbWUgOiBOVUxMKTsKKwlpbml0Lm51bV9wYXJlbnRzID0gKHBhcmVudF9uYW1lID8gMSA6IDApOworCWh3LT5pbml0ID0gJmluaXQ7CisKKwkvKiByZWdpc3RlciB0aGUgY2xvY2sgKi8KKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoZGV2LCBodyk7CisJaWYgKHJldCkgeworCQlrZnJlZShodyk7CisJCWh3ID0gRVJSX1BUUihyZXQpOworCX0KKworCXJldHVybiBodzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2xvb25nc29uMS9jbGsuaCBiL2RyaXZlcnMvY2xrL2xvb25nc29uMS9jbGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODVkNzRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbGsvbG9vbmdzb24xL2Nsay5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiBaaGFuZywgS2VndWFuZyA8a2VndWFuZy56aGFuZ0BnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fTE9PTkdTT04xX0NMS19ICisjZGVmaW5lIF9fTE9PTkdTT04xX0NMS19ICisKK3N0cnVjdCBjbGtfaHcgKmNsa19od19yZWdpc3Rlcl9wbGwoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgY29uc3QgY2hhciAqcGFyZW50X25hbWUsCisJCQkJICAgY29uc3Qgc3RydWN0IGNsa19vcHMgKm9wcywKKwkJCQkgICB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKworI2VuZGlmIC8qIF9fTE9PTkdTT04xX0NMS19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9tZWRpYXRlay9LY29uZmlnIGIvZHJpdmVycy9jbGsvbWVkaWF0ZWsvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODBjMzcyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbGsvbWVkaWF0ZWsvS2NvbmZpZwpAQCAtMCwwICsxLDIxIEBACisjCisjIE1lZGlhVGVrIFNvQyBkcml2ZXJzCisjCitjb25maWcgQ09NTU9OX0NMS19NRURJQVRFSworCWJvb2wKKwktLS1oZWxwLS0tCisJICBNZWRpYXRlayBTb0NzJyBjbG9jayBzdXBwb3J0LgorCitjb25maWcgQ09NTU9OX0NMS19NVDgxMzUKKwlib29sICJDbG9jayBkcml2ZXIgZm9yIE1lZGlhdGVrIE1UODEzNSIKKwlzZWxlY3QgQ09NTU9OX0NMS19NRURJQVRFSworCWRlZmF1bHQgQVJDSF9NRURJQVRFSworCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIE1lZGlhdGVrIE1UODEzNSBjbG9ja3MuCisKK2NvbmZpZyBDT01NT05fQ0xLX01UODE3MworCWJvb2wgIkNsb2NrIGRyaXZlciBmb3IgTWVkaWF0ZWsgTVQ4MTczIgorCXNlbGVjdCBDT01NT05fQ0xLX01FRElBVEVLCisJZGVmYXVsdCBBUkNIX01FRElBVEVLCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgTWVkaWF0ZWsgTVQ4MTczIGNsb2Nrcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL21lZGlhdGVrL01ha2VmaWxlIGIvZHJpdmVycy9jbGsvbWVkaWF0ZWsvTWFrZWZpbGUKaW5kZXggOTVmZGZhYy4uMzJlNzIyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvbWVkaWF0ZWsvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jbGsvbWVkaWF0ZWsvTWFrZWZpbGUKQEAgLTEsNCArMSw0IEBACi1vYmoteSArPSBjbGstbXRrLm8gY2xrLXBsbC5vIGNsay1nYXRlLm8gY2xrLWFwbWl4ZWQubworb2JqLSQoQ09ORklHX0NPTU1PTl9DTEtfTUVESUFURUspICs9IGNsay1tdGsubyBjbGstcGxsLm8gY2xrLWdhdGUubyBjbGstYXBtaXhlZC5vCiBvYmotJChDT05GSUdfUkVTRVRfQ09OVFJPTExFUikgKz0gcmVzZXQubwotb2JqLXkgKz0gY2xrLW10ODEzNS5vCi1vYmoteSArPSBjbGstbXQ4MTczLm8KK29iai0kKENPTkZJR19DT01NT05fQ0xLX01UODEzNSkgKz0gY2xrLW10ODEzNS5vCitvYmotJChDT05GSUdfQ09NTU9OX0NMS19NVDgxNzMpICs9IGNsay1tdDgxNzMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLWdhdGUuYyBiL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1nYXRlLmMKaW5kZXggMmE3NjkwMS4uZDg3ODdiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLWdhdGUuYworKysgYi9kcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstZ2F0ZS5jCkBAIC05Nyw3ICs5Nyw3IEBACiAJLmRpc2FibGUJPSBtdGtfY2dfZGlzYWJsZV9pbnYsCiB9OwogCi1zdHJ1Y3QgY2xrICogX19pbml0IG10a19jbGtfcmVnaXN0ZXJfZ2F0ZSgKK3N0cnVjdCBjbGsgKm10a19jbGtfcmVnaXN0ZXJfZ2F0ZSgKIAkJY29uc3QgY2hhciAqbmFtZSwKIAkJY29uc3QgY2hhciAqcGFyZW50X25hbWUsCiAJCXN0cnVjdCByZWdtYXAgKnJlZ21hcCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxNzMuYyBiL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdDgxNzMuYwppbmRleCAxMGM5ODYwLi4wYWMzYWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXQ4MTczLmMKKysrIGIvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10ODE3My5jCkBAIC0xMDc0LDggKzEwNzQsMTAgQEAKIAl9CiAKIAltdDgxNzNfcGxsX2Nsa19kYXRhID0gY2xrX2RhdGEgPSBtdGtfYWxsb2NfY2xrX2RhdGEoQ0xLX0FQTUlYRURfTlJfQ0xLKTsKLQlpZiAoIWNsa19kYXRhKQorCWlmICghY2xrX2RhdGEpIHsKKwkJaW91bm1hcChiYXNlKTsKIAkJcmV0dXJuOworCX0KIAogCW10a19jbGtfcmVnaXN0ZXJfcGxscyhub2RlLCBwbGxzLCBBUlJBWV9TSVpFKHBsbHMpLCBjbGtfZGF0YSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdGsuYyBiL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1tdGsuYwppbmRleCA1YWRhNjQ0Li5iYjMwZjcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstbXRrLmMKKysrIGIvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLW10ay5jCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSAiY2xrLW10ay5oIgogI2luY2x1ZGUgImNsay1nYXRlLmgiCiAKLXN0cnVjdCBjbGtfb25lY2VsbF9kYXRhICogX19pbml0IG10a19hbGxvY19jbGtfZGF0YSh1bnNpZ25lZCBpbnQgY2xrX251bSkKK3N0cnVjdCBjbGtfb25lY2VsbF9kYXRhICptdGtfYWxsb2NfY2xrX2RhdGEodW5zaWduZWQgaW50IGNsa19udW0pCiB7CiAJaW50IGk7CiAJc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgKmNsa19kYXRhOwpAQCAtNDksNyArNDksNyBAQAogCXJldHVybiBOVUxMOwogfQogCi12b2lkIF9faW5pdCBtdGtfY2xrX3JlZ2lzdGVyX2ZpeGVkX2Nsa3MoY29uc3Qgc3RydWN0IG10a19maXhlZF9jbGsgKmNsa3MsCit2b2lkIG10a19jbGtfcmVnaXN0ZXJfZml4ZWRfY2xrcyhjb25zdCBzdHJ1Y3QgbXRrX2ZpeGVkX2NsayAqY2xrcywKIAkJaW50IG51bSwgc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgKmNsa19kYXRhKQogewogCWludCBpOwpAQCAtNzIsNyArNzIsNyBAQAogCX0KIH0KIAotdm9pZCBfX2luaXQgbXRrX2Nsa19yZWdpc3Rlcl9mYWN0b3JzKGNvbnN0IHN0cnVjdCBtdGtfZml4ZWRfZmFjdG9yICpjbGtzLAordm9pZCBtdGtfY2xrX3JlZ2lzdGVyX2ZhY3RvcnMoY29uc3Qgc3RydWN0IG10a19maXhlZF9mYWN0b3IgKmNsa3MsCiAJCWludCBudW0sIHN0cnVjdCBjbGtfb25lY2VsbF9kYXRhICpjbGtfZGF0YSkKIHsKIAlpbnQgaTsKQEAgLTk1LDcgKzk1LDcgQEAKIAl9CiB9CiAKLWludCBfX2luaXQgbXRrX2Nsa19yZWdpc3Rlcl9nYXRlcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCitpbnQgbXRrX2Nsa19yZWdpc3Rlcl9nYXRlcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCiAJCWNvbnN0IHN0cnVjdCBtdGtfZ2F0ZSAqY2xrcywKIAkJaW50IG51bSwgc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgKmNsa19kYXRhKQogewpAQCAtMTM1LDcgKzEzNSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCBjbGsgKiBfX2luaXQgbXRrX2Nsa19yZWdpc3Rlcl9jb21wb3NpdGUoY29uc3Qgc3RydWN0IG10a19jb21wb3NpdGUgKm1jLAorc3RydWN0IGNsayAqbXRrX2Nsa19yZWdpc3Rlcl9jb21wb3NpdGUoY29uc3Qgc3RydWN0IG10a19jb21wb3NpdGUgKm1jLAogCQl2b2lkIF9faW9tZW0gKmJhc2UsIHNwaW5sb2NrX3QgKmxvY2spCiB7CiAJc3RydWN0IGNsayAqY2xrOwpAQCAtMjIyLDcgKzIyMiw3IEBACiAJcmV0dXJuIEVSUl9QVFIocmV0KTsKIH0KIAotdm9pZCBfX2luaXQgbXRrX2Nsa19yZWdpc3Rlcl9jb21wb3NpdGVzKGNvbnN0IHN0cnVjdCBtdGtfY29tcG9zaXRlICptY3MsCit2b2lkIG10a19jbGtfcmVnaXN0ZXJfY29tcG9zaXRlcyhjb25zdCBzdHJ1Y3QgbXRrX2NvbXBvc2l0ZSAqbWNzLAogCQlpbnQgbnVtLCB2b2lkIF9faW9tZW0gKmJhc2UsIHNwaW5sb2NrX3QgKmxvY2ssCiAJCXN0cnVjdCBjbGtfb25lY2VsbF9kYXRhICpjbGtfZGF0YSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1wbGwuYyBiL2RyaXZlcnMvY2xrL21lZGlhdGVrL2Nsay1wbGwuYwppbmRleCA5NjZjYWIxLi4wYzJkZWFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9tZWRpYXRlay9jbGstcGxsLmMKKysrIGIvZHJpdmVycy9jbGsvbWVkaWF0ZWsvY2xrLXBsbC5jCkBAIC0zMTMsNyArMzEzLDcgQEAKIAlyZXR1cm4gY2xrOwogfQogCi12b2lkIF9faW5pdCBtdGtfY2xrX3JlZ2lzdGVyX3BsbHMoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAordm9pZCBtdGtfY2xrX3JlZ2lzdGVyX3BsbHMoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAogCQljb25zdCBzdHJ1Y3QgbXRrX3BsbF9kYXRhICpwbGxzLCBpbnQgbnVtX3BsbHMsIHN0cnVjdCBjbGtfb25lY2VsbF9kYXRhICpjbGtfZGF0YSkKIHsKIAl2b2lkIF9faW9tZW0gKmJhc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9tZXNvbi9NYWtlZmlsZSBiL2RyaXZlcnMvY2xrL21lc29uL01ha2VmaWxlCmluZGV4IDE5N2U0MDEuLjM0OTU4MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL21lc29uL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2xrL21lc29uL01ha2VmaWxlCkBAIC0zLDUgKzMsNSBAQAogIwogCiBvYmotJChDT05GSUdfQ09NTU9OX0NMS19BTUxPR0lDKSArPSBjbGstcGxsLm8gY2xrLWNwdS5vIGNsay1tcGxsLm8KLW9iai0kKENPTkZJR19DT01NT05fQ0xLX01FU09OOEIpICs9IG1lc29uOGItY2xrYy5vCi1vYmotJChDT05GSUdfQ09NTU9OX0NMS19HWEJCKQkgKz0gZ3hiYi5vCitvYmotJChDT05GSUdfQ09NTU9OX0NMS19NRVNPTjhCKSArPSBtZXNvbjhiLm8KK29iai0kKENPTkZJR19DT01NT05fQ0xLX0dYQkIpCSArPSBneGJiLm8gZ3hiYi1hb2Nsay5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9tZXNvbi9jbGtjLmggYi9kcml2ZXJzL2Nsay9tZXNvbi9jbGtjLmgKaW5kZXggNTMzMjZjMy4uOWJiNzBlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvbWVzb24vY2xrYy5oCisrKyBiL2RyaXZlcnMvY2xrL21lc29uL2Nsa2MuaApAQCAtOTgsNyArOTgsNyBAQAogfTsKIAogI2RlZmluZSBNRVNPTl9HQVRFKF9uYW1lLCBfcmVnLCBfYml0KQkJCQkJXAotc3RydWN0IGNsa19nYXRlIGd4YmJfIyNfbmFtZSA9IHsgCQkJCQkJXAorc3RydWN0IGNsa19nYXRlIF9uYW1lID0geyAJCQkJCQlcCiAJLnJlZyA9ICh2b2lkIF9faW9tZW0gKikgX3JlZywgCQkJCQlcCiAJLmJpdF9pZHggPSAoX2JpdCksIAkJCQkJCVwKIAkubG9jayA9ICZjbGtfbG9jaywJCQkJCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9tZXNvbi9neGJiLWFvY2xrLmMgYi9kcml2ZXJzL2Nsay9tZXNvbi9neGJiLWFvY2xrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ1YzVmYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2xrL21lc29uL2d4YmItYW9jbGsuYwpAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBCYXlMaWJyZSwgU0FTLgorICogQXV0aG9yOiBOZWlsIEFybXN0cm9uZyA8bmFybXN0cm9uZ0BiYXlsaWJyZS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IEJheUxpYnJlLCBTQVMuCisgKiBBdXRob3I6IE5laWwgQXJtc3Ryb25nIDxuYXJtc3Ryb25nQGJheWxpYnJlLmNvbT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZXNldC1jb250cm9sbGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL2d4YmItYW9jbGtjLmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvcmVzZXQvZ3hiYi1hb2Nsa2MuaD4KKworc3RhdGljIERFRklORV9TUElOTE9DSyhneGJiX2FvY2xrX2xvY2spOworCitzdHJ1Y3QgZ3hiYl9hb2Nsa19yZXNldF9jb250cm9sbGVyIHsKKwlzdHJ1Y3QgcmVzZXRfY29udHJvbGxlcl9kZXYgcmVzZXQ7CisJdW5zaWduZWQgaW50ICpkYXRhOworCXZvaWQgX19pb21lbSAqYmFzZTsKK307CisKK3N0YXRpYyBpbnQgZ3hiYl9hb2Nsa19kb19yZXNldChzdHJ1Y3QgcmVzZXRfY29udHJvbGxlcl9kZXYgKnJjZGV2LAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgaWQpCit7CisJc3RydWN0IGd4YmJfYW9jbGtfcmVzZXRfY29udHJvbGxlciAqcmVzZXQgPQorCQljb250YWluZXJfb2YocmNkZXYsIHN0cnVjdCBneGJiX2FvY2xrX3Jlc2V0X2NvbnRyb2xsZXIsIHJlc2V0KTsKKworCXdyaXRlbChCSVQocmVzZXQtPmRhdGFbaWRdKSwgcmVzZXQtPmJhc2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVzZXRfY29udHJvbF9vcHMgZ3hiYl9hb2Nsa19yZXNldF9vcHMgPSB7CisJLnJlc2V0ID0gZ3hiYl9hb2Nsa19kb19yZXNldCwKK307CisKKyNkZWZpbmUgR1hCQl9BT19HQVRFKF9uYW1lLCBfYml0KQkJCQkJXAorc3RhdGljIHN0cnVjdCBjbGtfZ2F0ZSBfbmFtZSMjX2FvID0gewkJCQkJXAorCS5yZWcgPSAodm9pZCBfX2lvbWVtICopMCwJCQkJCVwKKwkuYml0X2lkeCA9IChfYml0KSwJCQkJCQlcCisJLmxvY2sgPSAmZ3hiYl9hb2Nsa19sb2NrLAkJCQkJXAorCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSkgewkJCQlcCisJCS5uYW1lID0gI19uYW1lICJfYW8iLAkJCQkJXAorCQkub3BzID0gJmNsa19nYXRlX29wcywJCQkJCVwKKwkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJjbGs4MSIgfSwJCVwKKwkJLm51bV9wYXJlbnRzID0gMSwJCQkJCVwKKwkJLmZsYWdzID0gKENMS19TRVRfUkFURV9QQVJFTlQgfCBDTEtfSUdOT1JFX1VOVVNFRCksCVwKKwl9LAkJCQkJCQkJXAorfQorCitHWEJCX0FPX0dBVEUocmVtb3RlLCAwKTsKK0dYQkJfQU9fR0FURShpMmNfbWFzdGVyLCAxKTsKK0dYQkJfQU9fR0FURShpMmNfc2xhdmUsIDIpOworR1hCQl9BT19HQVRFKHVhcnQxLCAzKTsKK0dYQkJfQU9fR0FURSh1YXJ0MiwgNSk7CitHWEJCX0FPX0dBVEUoaXJfYmxhc3RlciwgNik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ3hiYl9hb2Nsa19yZXNldFtdID0geworCVtSRVNFVF9BT19SRU1PVEVdID0gMTYsCisJW1JFU0VUX0FPX0kyQ19NQVNURVJdID0gMTgsCisJW1JFU0VUX0FPX0kyQ19TTEFWRV0gPSAxOSwKKwlbUkVTRVRfQU9fVUFSVDFdID0gMTcsCisJW1JFU0VUX0FPX1VBUlQyXSA9IDIyLAorCVtSRVNFVF9BT19JUl9CTEFTVEVSXSA9IDIzLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfZ2F0ZSAqZ3hiYl9hb2Nsa19nYXRlW10gPSB7CisJW0NMS0lEX0FPX1JFTU9URV0gPSAmcmVtb3RlX2FvLAorCVtDTEtJRF9BT19JMkNfTUFTVEVSXSA9ICZpMmNfbWFzdGVyX2FvLAorCVtDTEtJRF9BT19JMkNfU0xBVkVdID0gJmkyY19zbGF2ZV9hbywKKwlbQ0xLSURfQU9fVUFSVDFdID0gJnVhcnQxX2FvLAorCVtDTEtJRF9BT19VQVJUMl0gPSAmdWFydDJfYW8sCisJW0NMS0lEX0FPX0lSX0JMQVNURVJdID0gJmlyX2JsYXN0ZXJfYW8sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19od19vbmVjZWxsX2RhdGEgZ3hiYl9hb2Nsa19vbmVjZWxsX2RhdGEgPSB7CisJLmh3cyA9IHsKKwkJW0NMS0lEX0FPX1JFTU9URV0gPSAmcmVtb3RlX2FvLmh3LAorCQlbQ0xLSURfQU9fSTJDX01BU1RFUl0gPSAmaTJjX21hc3Rlcl9hby5odywKKwkJW0NMS0lEX0FPX0kyQ19TTEFWRV0gPSAmaTJjX3NsYXZlX2FvLmh3LAorCQlbQ0xLSURfQU9fVUFSVDFdID0gJnVhcnQxX2FvLmh3LAorCQlbQ0xLSURfQU9fVUFSVDJdID0gJnVhcnQyX2FvLmh3LAorCQlbQ0xLSURfQU9fSVJfQkxBU1RFUl0gPSAmaXJfYmxhc3Rlcl9hby5odywKKwl9LAorCS5udW0gPSBBUlJBWV9TSVpFKGd4YmJfYW9jbGtfZ2F0ZSksCit9OworCitzdGF0aWMgaW50IGd4YmJfYW9jbGtjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCWludCByZXQsIGNsa2lkOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGd4YmJfYW9jbGtfcmVzZXRfY29udHJvbGxlciAqcnN0YzsKKworCXJzdGMgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnJzdGMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJzdGMpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogR2VuZXJpYyBjbG9ja3MgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCWlmIChJU19FUlIoYmFzZSkpCisJCXJldHVybiBQVFJfRVJSKGJhc2UpOworCisJLyogUmVzZXQgQ29udHJvbGxlciAqLworCXJzdGMtPmJhc2UgPSBiYXNlOworCXJzdGMtPmRhdGEgPSBneGJiX2FvY2xrX3Jlc2V0OworCXJzdGMtPnJlc2V0Lm9wcyA9ICZneGJiX2FvY2xrX3Jlc2V0X29wczsKKwlyc3RjLT5yZXNldC5ucl9yZXNldHMgPSBBUlJBWV9TSVpFKGd4YmJfYW9jbGtfcmVzZXQpOworCXJzdGMtPnJlc2V0Lm9mX25vZGUgPSBkZXYtPm9mX25vZGU7CisJcmV0ID0gZGV2bV9yZXNldF9jb250cm9sbGVyX3JlZ2lzdGVyKGRldiwgJnJzdGMtPnJlc2V0KTsKKworCS8qCisJICogUG9wdWxhdGUgYmFzZSBhZGRyZXNzIGFuZCByZWdpc3RlciBhbGwgY2xrcworCSAqLworCWZvciAoY2xraWQgPSAwOyBjbGtpZCA8IGd4YmJfYW9jbGtfb25lY2VsbF9kYXRhLm51bTsgY2xraWQrKykgeworCQlneGJiX2FvY2xrX2dhdGVbY2xraWRdLT5yZWcgPSBiYXNlOworCisJCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKGRldiwKKwkJCQkJZ3hiYl9hb2Nsa19vbmVjZWxsX2RhdGEuaHdzW2Nsa2lkXSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKGRldi0+b2Zfbm9kZSwgb2ZfY2xrX2h3X29uZWNlbGxfZ2V0LAorCQkJJmd4YmJfYW9jbGtfb25lY2VsbF9kYXRhKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZ3hiYl9hb2Nsa2NfbWF0Y2hfdGFibGVbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImFtbG9naWMsZ3hiYi1hb2Nsa2MiIH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBneGJiX2FvY2xrY19kcml2ZXIgPSB7CisJLnByb2JlCQk9IGd4YmJfYW9jbGtjX3Byb2JlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJneGJiLWFvY2xrYyIsCisJCS5vZl9tYXRjaF90YWJsZSA9IGd4YmJfYW9jbGtjX21hdGNoX3RhYmxlLAorCX0sCit9OworYnVpbHRpbl9wbGF0Zm9ybV9kcml2ZXIoZ3hiYl9hb2Nsa2NfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL21lc29uL2d4YmIuYyBiL2RyaXZlcnMvY2xrL21lc29uL2d4YmIuYwppbmRleCBhNGM2Njg0Yi4uOWQ5YWY0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvbWVzb24vZ3hiYi5jCisrKyBiL2RyaXZlcnMvY2xrL21lc29uL2d4YmIuYwpAQCAtNTY1LDkwICs1NjUsOTMgQEAKIH07CiAKIC8qIEV2ZXJ5dGhpbmcgRWxzZSAoRUUpIGRvbWFpbiBnYXRlcyAqLwotc3RhdGljIE1FU09OX0dBVEUoZGRyLCBISElfR0NMS19NUEVHMCwgMCk7Ci1zdGF0aWMgTUVTT05fR0FURShkb3MsIEhISV9HQ0xLX01QRUcwLCAxKTsKLXN0YXRpYyBNRVNPTl9HQVRFKGlzYSwgSEhJX0dDTEtfTVBFRzAsIDUpOwotc3RhdGljIE1FU09OX0dBVEUocGwzMDEsIEhISV9HQ0xLX01QRUcwLCA2KTsKLXN0YXRpYyBNRVNPTl9HQVRFKHBlcmlwaHMsIEhISV9HQ0xLX01QRUcwLCA3KTsKLXN0YXRpYyBNRVNPTl9HQVRFKHNwaWNjLCBISElfR0NMS19NUEVHMCwgOCk7Ci1zdGF0aWMgTUVTT05fR0FURShpMmMsIEhISV9HQ0xLX01QRUcwLCA5KTsKLXN0YXRpYyBNRVNPTl9HQVRFKHNhcl9hZGMsIEhISV9HQ0xLX01QRUcwLCAxMCk7Ci1zdGF0aWMgTUVTT05fR0FURShzbWFydF9jYXJkLCBISElfR0NMS19NUEVHMCwgMTEpOwotc3RhdGljIE1FU09OX0dBVEUocm5nMCwgSEhJX0dDTEtfTVBFRzAsIDEyKTsKLXN0YXRpYyBNRVNPTl9HQVRFKHVhcnQwLCBISElfR0NMS19NUEVHMCwgMTMpOwotc3RhdGljIE1FU09OX0dBVEUoc2RoYywgSEhJX0dDTEtfTVBFRzAsIDE0KTsKLXN0YXRpYyBNRVNPTl9HQVRFKHN0cmVhbSwgSEhJX0dDTEtfTVBFRzAsIDE1KTsKLXN0YXRpYyBNRVNPTl9HQVRFKGFzeW5jX2ZpZm8sIEhISV9HQ0xLX01QRUcwLCAxNik7Ci1zdGF0aWMgTUVTT05fR0FURShzZGlvLCBISElfR0NMS19NUEVHMCwgMTcpOwotc3RhdGljIE1FU09OX0dBVEUoYWJ1ZiwgSEhJX0dDTEtfTVBFRzAsIDE4KTsKLXN0YXRpYyBNRVNPTl9HQVRFKGhpdV9pZmFjZSwgSEhJX0dDTEtfTVBFRzAsIDE5KTsKLXN0YXRpYyBNRVNPTl9HQVRFKGFzc2lzdF9taXNjLCBISElfR0NMS19NUEVHMCwgMjMpOwotc3RhdGljIE1FU09OX0dBVEUoc3BpLCBISElfR0NMS19NUEVHMCwgMzApOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9kZHIsIEhISV9HQ0xLX01QRUcwLCAwKTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfZG9zLCBISElfR0NMS19NUEVHMCwgMSk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2lzYSwgSEhJX0dDTEtfTVBFRzAsIDUpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9wbDMwMSwgSEhJX0dDTEtfTVBFRzAsIDYpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9wZXJpcGhzLCBISElfR0NMS19NUEVHMCwgNyk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX3NwaWNjLCBISElfR0NMS19NUEVHMCwgOCk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2kyYywgSEhJX0dDTEtfTVBFRzAsIDkpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9zYXJfYWRjLCBISElfR0NMS19NUEVHMCwgMTApOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9zbWFydF9jYXJkLCBISElfR0NMS19NUEVHMCwgMTEpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9ybmcwLCBISElfR0NMS19NUEVHMCwgMTIpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl91YXJ0MCwgSEhJX0dDTEtfTVBFRzAsIDEzKTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfc2RoYywgSEhJX0dDTEtfTVBFRzAsIDE0KTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfc3RyZWFtLCBISElfR0NMS19NUEVHMCwgMTUpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9hc3luY19maWZvLCBISElfR0NMS19NUEVHMCwgMTYpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9zZGlvLCBISElfR0NMS19NUEVHMCwgMTcpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9hYnVmLCBISElfR0NMS19NUEVHMCwgMTgpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9oaXVfaWZhY2UsIEhISV9HQ0xLX01QRUcwLCAxOSk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2Fzc2lzdF9taXNjLCBISElfR0NMS19NUEVHMCwgMjMpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9lbW1jX2EsIEhISV9HQ0xLX01QRUcwLCAyNCk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2VtbWNfYiwgSEhJX0dDTEtfTVBFRzAsIDI1KTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfZW1tY19jLCBISElfR0NMS19NUEVHMCwgMjYpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9zcGksIEhISV9HQ0xLX01QRUcwLCAzMCk7CiAKLXN0YXRpYyBNRVNPTl9HQVRFKGkyc19zcGRpZiwgSEhJX0dDTEtfTVBFRzEsIDIpOwotc3RhdGljIE1FU09OX0dBVEUoZXRoLCBISElfR0NMS19NUEVHMSwgMyk7Ci1zdGF0aWMgTUVTT05fR0FURShkZW11eCwgSEhJX0dDTEtfTVBFRzEsIDQpOwotc3RhdGljIE1FU09OX0dBVEUoYWl1X2dsdWUsIEhISV9HQ0xLX01QRUcxLCA2KTsKLXN0YXRpYyBNRVNPTl9HQVRFKGllYzk1OCwgSEhJX0dDTEtfTVBFRzEsIDcpOwotc3RhdGljIE1FU09OX0dBVEUoaTJzX291dCwgSEhJX0dDTEtfTVBFRzEsIDgpOwotc3RhdGljIE1FU09OX0dBVEUoYW1jbGssIEhISV9HQ0xLX01QRUcxLCA5KTsKLXN0YXRpYyBNRVNPTl9HQVRFKGFpZmlmbzIsIEhISV9HQ0xLX01QRUcxLCAxMCk7Ci1zdGF0aWMgTUVTT05fR0FURShtaXhlciwgSEhJX0dDTEtfTVBFRzEsIDExKTsKLXN0YXRpYyBNRVNPTl9HQVRFKG1peGVyX2lmYWNlLCBISElfR0NMS19NUEVHMSwgMTIpOwotc3RhdGljIE1FU09OX0dBVEUoYWRjLCBISElfR0NMS19NUEVHMSwgMTMpOwotc3RhdGljIE1FU09OX0dBVEUoYmxrbXYsIEhISV9HQ0xLX01QRUcxLCAxNCk7Ci1zdGF0aWMgTUVTT05fR0FURShhaXUsIEhISV9HQ0xLX01QRUcxLCAxNSk7Ci1zdGF0aWMgTUVTT05fR0FURSh1YXJ0MSwgSEhJX0dDTEtfTVBFRzEsIDE2KTsKLXN0YXRpYyBNRVNPTl9HQVRFKGcyZCwgSEhJX0dDTEtfTVBFRzEsIDIwKTsKLXN0YXRpYyBNRVNPTl9HQVRFKHVzYjAsIEhISV9HQ0xLX01QRUcxLCAyMSk7Ci1zdGF0aWMgTUVTT05fR0FURSh1c2IxLCBISElfR0NMS19NUEVHMSwgMjIpOwotc3RhdGljIE1FU09OX0dBVEUocmVzZXQsIEhISV9HQ0xLX01QRUcxLCAyMyk7Ci1zdGF0aWMgTUVTT05fR0FURShuYW5kLCBISElfR0NMS19NUEVHMSwgMjQpOwotc3RhdGljIE1FU09OX0dBVEUoZG9zX3BhcnNlciwgSEhJX0dDTEtfTVBFRzEsIDI1KTsKLXN0YXRpYyBNRVNPTl9HQVRFKHVzYiwgSEhJX0dDTEtfTVBFRzEsIDI2KTsKLXN0YXRpYyBNRVNPTl9HQVRFKHZkaW4xLCBISElfR0NMS19NUEVHMSwgMjgpOwotc3RhdGljIE1FU09OX0dBVEUoYWhiX2FyYjAsIEhISV9HQ0xLX01QRUcxLCAyOSk7Ci1zdGF0aWMgTUVTT05fR0FURShlZnVzZSwgSEhJX0dDTEtfTVBFRzEsIDMwKTsKLXN0YXRpYyBNRVNPTl9HQVRFKGJvb3Rfcm9tLCBISElfR0NMS19NUEVHMSwgMzEpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9pMnNfc3BkaWYsIEhISV9HQ0xLX01QRUcxLCAyKTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfZXRoLCBISElfR0NMS19NUEVHMSwgMyk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2RlbXV4LCBISElfR0NMS19NUEVHMSwgNCk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2FpdV9nbHVlLCBISElfR0NMS19NUEVHMSwgNik7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2llYzk1OCwgSEhJX0dDTEtfTVBFRzEsIDcpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9pMnNfb3V0LCBISElfR0NMS19NUEVHMSwgOCk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2FtY2xrLCBISElfR0NMS19NUEVHMSwgOSk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2FpZmlmbzIsIEhISV9HQ0xLX01QRUcxLCAxMCk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX21peGVyLCBISElfR0NMS19NUEVHMSwgMTEpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9taXhlcl9pZmFjZSwgSEhJX0dDTEtfTVBFRzEsIDEyKTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfYWRjLCBISElfR0NMS19NUEVHMSwgMTMpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9ibGttdiwgSEhJX0dDTEtfTVBFRzEsIDE0KTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfYWl1LCBISElfR0NMS19NUEVHMSwgMTUpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl91YXJ0MSwgSEhJX0dDTEtfTVBFRzEsIDE2KTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfZzJkLCBISElfR0NMS19NUEVHMSwgMjApOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl91c2IwLCBISElfR0NMS19NUEVHMSwgMjEpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl91c2IxLCBISElfR0NMS19NUEVHMSwgMjIpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9yZXNldCwgSEhJX0dDTEtfTVBFRzEsIDIzKTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfbmFuZCwgSEhJX0dDTEtfTVBFRzEsIDI0KTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfZG9zX3BhcnNlciwgSEhJX0dDTEtfTVBFRzEsIDI1KTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfdXNiLCBISElfR0NMS19NUEVHMSwgMjYpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl92ZGluMSwgSEhJX0dDTEtfTVBFRzEsIDI4KTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfYWhiX2FyYjAsIEhISV9HQ0xLX01QRUcxLCAyOSk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2VmdXNlLCBISElfR0NMS19NUEVHMSwgMzApOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9ib290X3JvbSwgSEhJX0dDTEtfTVBFRzEsIDMxKTsKIAotc3RhdGljIE1FU09OX0dBVEUoYWhiX2RhdGFfYnVzLCBISElfR0NMS19NUEVHMiwgMSk7Ci1zdGF0aWMgTUVTT05fR0FURShhaGJfY3RybF9idXMsIEhISV9HQ0xLX01QRUcyLCAyKTsKLXN0YXRpYyBNRVNPTl9HQVRFKGhkbWlfaW50cl9zeW5jLCBISElfR0NMS19NUEVHMiwgMyk7Ci1zdGF0aWMgTUVTT05fR0FURShoZG1pX3BjbGssIEhISV9HQ0xLX01QRUcyLCA0KTsKLXN0YXRpYyBNRVNPTl9HQVRFKHVzYjFfZGRyX2JyaWRnZSwgSEhJX0dDTEtfTVBFRzIsIDgpOwotc3RhdGljIE1FU09OX0dBVEUodXNiMF9kZHJfYnJpZGdlLCBISElfR0NMS19NUEVHMiwgOSk7Ci1zdGF0aWMgTUVTT05fR0FURShtbWNfcGNsaywgSEhJX0dDTEtfTVBFRzIsIDExKTsKLXN0YXRpYyBNRVNPTl9HQVRFKGR2aW4sIEhISV9HQ0xLX01QRUcyLCAxMik7Ci1zdGF0aWMgTUVTT05fR0FURSh1YXJ0MiwgSEhJX0dDTEtfTVBFRzIsIDE1KTsKLXN0YXRpYyBNRVNPTl9HQVRFKHNhbmEsIEhISV9HQ0xLX01QRUcyLCAyMik7Ci1zdGF0aWMgTUVTT05fR0FURSh2cHVfaW50ciwgSEhJX0dDTEtfTVBFRzIsIDI1KTsKLXN0YXRpYyBNRVNPTl9HQVRFKHNlY19haGJfYWhiM19icmlkZ2UsIEhISV9HQ0xLX01QRUcyLCAyNik7Ci1zdGF0aWMgTUVTT05fR0FURShjbGs4MV9hNTMsIEhISV9HQ0xLX01QRUcyLCAyOSk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2FoYl9kYXRhX2J1cywgSEhJX0dDTEtfTVBFRzIsIDEpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9haGJfY3RybF9idXMsIEhISV9HQ0xLX01QRUcyLCAyKTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfaGRtaV9pbnRyX3N5bmMsIEhISV9HQ0xLX01QRUcyLCAzKTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfaGRtaV9wY2xrLCBISElfR0NMS19NUEVHMiwgNCk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX3VzYjFfZGRyX2JyaWRnZSwgSEhJX0dDTEtfTVBFRzIsIDgpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl91c2IwX2Rkcl9icmlkZ2UsIEhISV9HQ0xLX01QRUcyLCA5KTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfbW1jX3BjbGssIEhISV9HQ0xLX01QRUcyLCAxMSk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2R2aW4sIEhISV9HQ0xLX01QRUcyLCAxMik7CitzdGF0aWMgTUVTT05fR0FURShneGJiX3VhcnQyLCBISElfR0NMS19NUEVHMiwgMTUpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9zYW5hLCBISElfR0NMS19NUEVHMiwgMjIpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl92cHVfaW50ciwgSEhJX0dDTEtfTVBFRzIsIDI1KTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfc2VjX2FoYl9haGIzX2JyaWRnZSwgSEhJX0dDTEtfTVBFRzIsIDI2KTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfY2xrODFfYTUzLCBISElfR0NMS19NUEVHMiwgMjkpOwogCi1zdGF0aWMgTUVTT05fR0FURSh2Y2xrMl92ZW5jaTAsIEhISV9HQ0xLX09USEVSLCAxKTsKLXN0YXRpYyBNRVNPTl9HQVRFKHZjbGsyX3ZlbmNpMSwgSEhJX0dDTEtfT1RIRVIsIDIpOwotc3RhdGljIE1FU09OX0dBVEUodmNsazJfdmVuY3AwLCBISElfR0NMS19PVEhFUiwgMyk7Ci1zdGF0aWMgTUVTT05fR0FURSh2Y2xrMl92ZW5jcDEsIEhISV9HQ0xLX09USEVSLCA0KTsKLXN0YXRpYyBNRVNPTl9HQVRFKGdjbGtfdmVuY2lfaW50MCwgSEhJX0dDTEtfT1RIRVIsIDgpOwotc3RhdGljIE1FU09OX0dBVEUoZ2Nsa192ZW5jcF9pbnQsIEhISV9HQ0xLX09USEVSLCA5KTsKLXN0YXRpYyBNRVNPTl9HQVRFKGRhY19jbGssIEhISV9HQ0xLX09USEVSLCAxMCk7Ci1zdGF0aWMgTUVTT05fR0FURShhb2Nsa19nYXRlLCBISElfR0NMS19PVEhFUiwgMTQpOwotc3RhdGljIE1FU09OX0dBVEUoaWVjOTU4X2dhdGUsIEhISV9HQ0xLX09USEVSLCAxNik7Ci1zdGF0aWMgTUVTT05fR0FURShlbmM0ODBwLCBISElfR0NMS19PVEhFUiwgMjApOwotc3RhdGljIE1FU09OX0dBVEUocm5nMSwgSEhJX0dDTEtfT1RIRVIsIDIxKTsKLXN0YXRpYyBNRVNPTl9HQVRFKGdjbGtfdmVuY2lfaW50MSwgSEhJX0dDTEtfT1RIRVIsIDIyKTsKLXN0YXRpYyBNRVNPTl9HQVRFKHZjbGsyX3ZlbmNsbWNjLCBISElfR0NMS19PVEhFUiwgMjQpOwotc3RhdGljIE1FU09OX0dBVEUodmNsazJfdmVuY2wsIEhISV9HQ0xLX09USEVSLCAyNSk7Ci1zdGF0aWMgTUVTT05fR0FURSh2Y2xrX290aGVyLCBISElfR0NMS19PVEhFUiwgMjYpOwotc3RhdGljIE1FU09OX0dBVEUoZWRwLCBISElfR0NMS19PVEhFUiwgMzEpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl92Y2xrMl92ZW5jaTAsIEhISV9HQ0xLX09USEVSLCAxKTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfdmNsazJfdmVuY2kxLCBISElfR0NMS19PVEhFUiwgMik7CitzdGF0aWMgTUVTT05fR0FURShneGJiX3ZjbGsyX3ZlbmNwMCwgSEhJX0dDTEtfT1RIRVIsIDMpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl92Y2xrMl92ZW5jcDEsIEhISV9HQ0xLX09USEVSLCA0KTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfZ2Nsa192ZW5jaV9pbnQwLCBISElfR0NMS19PVEhFUiwgOCk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2djbGtfdmVuY3BfaW50LCBISElfR0NMS19PVEhFUiwgOSk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2RhY19jbGssIEhISV9HQ0xLX09USEVSLCAxMCk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2FvY2xrX2dhdGUsIEhISV9HQ0xLX09USEVSLCAxNCk7CitzdGF0aWMgTUVTT05fR0FURShneGJiX2llYzk1OF9nYXRlLCBISElfR0NMS19PVEhFUiwgMTYpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9lbmM0ODBwLCBISElfR0NMS19PVEhFUiwgMjApOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9ybmcxLCBISElfR0NMS19PVEhFUiwgMjEpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9nY2xrX3ZlbmNpX2ludDEsIEhISV9HQ0xLX09USEVSLCAyMik7CitzdGF0aWMgTUVTT05fR0FURShneGJiX3ZjbGsyX3ZlbmNsbWNjLCBISElfR0NMS19PVEhFUiwgMjQpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl92Y2xrMl92ZW5jbCwgSEhJX0dDTEtfT1RIRVIsIDI1KTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfdmNsa19vdGhlciwgSEhJX0dDTEtfT1RIRVIsIDI2KTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfZWRwLCBISElfR0NMS19PVEhFUiwgMzEpOwogCiAvKiBBbHdheXMgT24gKEFPKSBkb21haW4gZ2F0ZXMgKi8KIAotc3RhdGljIE1FU09OX0dBVEUoYW9fbWVkaWFfY3B1LCBISElfR0NMS19BTywgMCk7Ci1zdGF0aWMgTUVTT05fR0FURShhb19haGJfc3JhbSwgSEhJX0dDTEtfQU8sIDEpOwotc3RhdGljIE1FU09OX0dBVEUoYW9fYWhiX2J1cywgSEhJX0dDTEtfQU8sIDIpOwotc3RhdGljIE1FU09OX0dBVEUoYW9faWZhY2UsIEhISV9HQ0xLX0FPLCAzKTsKLXN0YXRpYyBNRVNPTl9HQVRFKGFvX2kyYywgSEhJX0dDTEtfQU8sIDQpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9hb19tZWRpYV9jcHUsIEhISV9HQ0xLX0FPLCAwKTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfYW9fYWhiX3NyYW0sIEhISV9HQ0xLX0FPLCAxKTsKK3N0YXRpYyBNRVNPTl9HQVRFKGd4YmJfYW9fYWhiX2J1cywgSEhJX0dDTEtfQU8sIDIpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9hb19pZmFjZSwgSEhJX0dDTEtfQU8sIDMpOworc3RhdGljIE1FU09OX0dBVEUoZ3hiYl9hb19pMmMsIEhISV9HQ0xLX0FPLCA0KTsKIAogLyogQXJyYXkgb2YgYWxsIGNsb2NrcyBwcm92aWRlZCBieSB0aGlzIHByb3ZpZGVyICovCiAKQEAgLTc0OCw2ICs3NTEsOSBAQAogCQlbQ0xLSURfQU9fQUhCX0JVU10JICAgID0gJmd4YmJfYW9fYWhiX2J1cy5odywKIAkJW0NMS0lEX0FPX0lGQUNFXQkgICAgPSAmZ3hiYl9hb19pZmFjZS5odywKIAkJW0NMS0lEX0FPX0kyQ10JCSAgICA9ICZneGJiX2FvX2kyYy5odywKKwkJW0NMS0lEX1NEX0VNTUNfQV0JICAgID0gJmd4YmJfZW1tY19hLmh3LAorCQlbQ0xLSURfU0RfRU1NQ19CXQkgICAgPSAmZ3hiYl9lbW1jX2IuaHcsCisJCVtDTEtJRF9TRF9FTU1DX0NdCSAgICA9ICZneGJiX2VtbWNfYy5odywKIAl9LAogCS5udW0gPSBOUl9DTEtTLAogfTsKQEAgLTg0Nyw2ICs4NTMsOSBAQAogCSZneGJiX2FvX2FoYl9idXMsCiAJJmd4YmJfYW9faWZhY2UsCiAJJmd4YmJfYW9faTJjLAorCSZneGJiX2VtbWNfYSwKKwkmZ3hiYl9lbW1jX2IsCisJJmd4YmJfZW1tY19jLAogfTsKIAogc3RhdGljIGludCBneGJiX2Nsa2NfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTkzNyw4ICs5NDYsNCBAQAogCX0sCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBneGJiX2Nsa2NfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmd4YmJfZHJpdmVyKTsKLX0KLWRldmljZV9pbml0Y2FsbChneGJiX2Nsa2NfaW5pdCk7CitidWlsdGluX3BsYXRmb3JtX2RyaXZlcihneGJiX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9tZXNvbi9neGJiLmggYi9kcml2ZXJzL2Nsay9tZXNvbi9neGJiLmgKaW5kZXggYTJhZGYzNC4uYWU0NjFiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvbWVzb24vZ3hiYi5oCisrKyBiL2RyaXZlcnMvY2xrL21lc29uL2d4YmIuaApAQCAtMTcwLDExICsxNzAsMTEgQEAKICAqLwogI2RlZmluZSBDTEtJRF9TWVNfUExMCQkgIDAKIC8qIENMS0lEX0NQVUNMSyAqLwotI2RlZmluZSBDTEtJRF9IRE1JX1BMTAkJICAyCisvKiBDTEtJRF9IRE1JX1BMTCAqLwogI2RlZmluZSBDTEtJRF9GSVhFRF9QTEwJCSAgMwotI2RlZmluZSBDTEtJRF9GQ0xLX0RJVjIJCSAgNAotI2RlZmluZSBDTEtJRF9GQ0xLX0RJVjMJCSAgNQotI2RlZmluZSBDTEtJRF9GQ0xLX0RJVjQJCSAgNgorLyogQ0xLSURfRkNMS19ESVYyICovCisvKiBDTEtJRF9GQ0xLX0RJVjMgKi8KKy8qIENMS0lEX0ZDTEtfRElWNCAqLwogI2RlZmluZSBDTEtJRF9GQ0xLX0RJVjUJCSAgNwogI2RlZmluZSBDTEtJRF9GQ0xLX0RJVjcJCSAgOAogI2RlZmluZSBDTEtJRF9HUDBfUExMCQkgIDkKQEAgLTI2Miw4ICsyNjIsMTEgQEAKICNkZWZpbmUgQ0xLSURfQU9fQUhCX0JVUwkgIDkxCiAjZGVmaW5lIENMS0lEX0FPX0lGQUNFCQkgIDkyCiAjZGVmaW5lIENMS0lEX0FPX0kyQwkJICA5MworLyogQ0xLSURfU0RfRU1NQ19BICovCisvKiBDTEtJRF9TRF9FTU1DX0IgKi8KKy8qIENMS0lEX1NEX0VNTUNfQyAqLwogCi0jZGVmaW5lIE5SX0NMS1MJCQkgIDk0CisjZGVmaW5lIE5SX0NMS1MJCQkgIDk3CiAKIC8qIGluY2x1ZGUgdGhlIENMS0lEcyB0aGF0IGhhdmUgYmVlbiBtYWRlIHBhcnQgb2YgdGhlIHN0YWJsZSBEVCBiaW5kaW5nICovCiAjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svZ3hiYi1jbGtjLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9tZXNvbi9tZXNvbjhiLWNsa2MuYyBiL2RyaXZlcnMvY2xrL21lc29uL21lc29uOGItY2xrYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzk0MTNjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2xrL21lc29uL21lc29uOGItY2xrYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQ3ICswLDAgQEAKLS8qCi0gKiBBbUxvZ2ljIFM4MDUgLyBNZXNvbjhiIENsb2NrIENvbnRyb2xsZXIgRHJpdmVyCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDE1IEVuZGxlc3MgTW9iaWxlLCBJbmMuCi0gKiBBdXRob3I6IENhcmxvIENhaW9uZSA8Y2FybG9AZW5kbGVzc20uY29tPgotICoKLSAqIENvcHlyaWdodCAoYykgMjAxNiBCYXlMaWJyZSwgSW5jLgotICogTWljaGFlbCBUdXJxdWV0dGUgPG10dXJxdWV0dGVAYmF5bGlicmUuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KLSNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9tZXNvbjhiLWNsa2MuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlICJjbGtjLmgiCi0KLS8qCi0gKiBDbG9jayBjb250cm9sbGVyIHJlZ2lzdGVyIG9mZnNldHMKLSAqCi0gKiBSZWdpc3RlciBvZmZzZXRzIGZyb20gdGhlIEhhcmRLZXJuZWxbMF0gZGF0YSBzaGVldCBhcmUgbGlzdGVkIGluIGNvbW1lbnQKLSAqIGJsb2NrcyBiZWxvdy4gVGhvc2Ugb2Zmc2V0cyBtdXN0IGJlIG11bHRpcGxpZWQgYnkgNCBiZWZvcmUgYWRkaW5nIHRoZW0gdG8KLSAqIHRoZSBiYXNlIGFkZHJlc3MgdG8gZ2V0IHRoZSByaWdodCB2YWx1ZQotICoKLSAqIFswXSBodHRwOi8vZG4ub2Ryb2lkLmNvbS9TODA1L0RhdGFzaGVldC9TODA1X0RhdGFzaGVldCUyMFYwLjglMjAyMDE1MDEyNi5wZGYKLSAqLwotI2RlZmluZSBNRVNPTjhCX1JFR19TWVNfQ1BVX0NOVEwxCTB4MDE1YyAvKiAweDU3IG9mZnNldCBpbiBkYXRhIHNoZWV0ICovCi0jZGVmaW5lIE1FU09OOEJfUkVHX0hISV9NUEVHCQkweDAxNzQgLyogMHg1ZCBvZmZzZXQgaW4gZGF0YSBzaGVldCAqLwotI2RlZmluZSBNRVNPTjhCX1JFR19NQUxJCQkweDAxYjAgLyogMHg2YyBvZmZzZXQgaW4gZGF0YSBzaGVldCAqLwotI2RlZmluZSBNRVNPTjhCX1JFR19QTExfRklYRUQJCTB4MDI4MAotI2RlZmluZSBNRVNPTjhCX1JFR19QTExfU1lTCQkweDAzMDAKLSNkZWZpbmUgTUVTT044Ql9SRUdfUExMX1ZJRAkJMHgwMzIwCi0KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2xrX2xvY2spOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBsbF9yYXRlX3RhYmxlIHN5c19wbGxfcmF0ZV90YWJsZVtdID0gewotCVBMTF9SQVRFKDMxMjAwMDAwMCwgNTIsIDEsIDIpLAotCVBMTF9SQVRFKDMzNjAwMDAwMCwgNTYsIDEsIDIpLAotCVBMTF9SQVRFKDM2MDAwMDAwMCwgNjAsIDEsIDIpLAotCVBMTF9SQVRFKDM4NDAwMDAwMCwgNjQsIDEsIDIpLAotCVBMTF9SQVRFKDQwODAwMDAwMCwgNjgsIDEsIDIpLAotCVBMTF9SQVRFKDQzMjAwMDAwMCwgNzIsIDEsIDIpLAotCVBMTF9SQVRFKDQ1NjAwMDAwMCwgNzYsIDEsIDIpLAotCVBMTF9SQVRFKDQ4MDAwMDAwMCwgODAsIDEsIDIpLAotCVBMTF9SQVRFKDUwNDAwMDAwMCwgODQsIDEsIDIpLAotCVBMTF9SQVRFKDUyODAwMDAwMCwgODgsIDEsIDIpLAotCVBMTF9SQVRFKDU1MjAwMDAwMCwgOTIsIDEsIDIpLAotCVBMTF9SQVRFKDU3NjAwMDAwMCwgOTYsIDEsIDIpLAotCVBMTF9SQVRFKDYwMDAwMDAwMCwgNTAsIDEsIDEpLAotCVBMTF9SQVRFKDYyNDAwMDAwMCwgNTIsIDEsIDEpLAotCVBMTF9SQVRFKDY0ODAwMDAwMCwgNTQsIDEsIDEpLAotCVBMTF9SQVRFKDY3MjAwMDAwMCwgNTYsIDEsIDEpLAotCVBMTF9SQVRFKDY5NjAwMDAwMCwgNTgsIDEsIDEpLAotCVBMTF9SQVRFKDcyMDAwMDAwMCwgNjAsIDEsIDEpLAotCVBMTF9SQVRFKDc0NDAwMDAwMCwgNjIsIDEsIDEpLAotCVBMTF9SQVRFKDc2ODAwMDAwMCwgNjQsIDEsIDEpLAotCVBMTF9SQVRFKDc5MjAwMDAwMCwgNjYsIDEsIDEpLAotCVBMTF9SQVRFKDgxNjAwMDAwMCwgNjgsIDEsIDEpLAotCVBMTF9SQVRFKDg0MDAwMDAwMCwgNzAsIDEsIDEpLAotCVBMTF9SQVRFKDg2NDAwMDAwMCwgNzIsIDEsIDEpLAotCVBMTF9SQVRFKDg4ODAwMDAwMCwgNzQsIDEsIDEpLAotCVBMTF9SQVRFKDkxMjAwMDAwMCwgNzYsIDEsIDEpLAotCVBMTF9SQVRFKDkzNjAwMDAwMCwgNzgsIDEsIDEpLAotCVBMTF9SQVRFKDk2MDAwMDAwMCwgODAsIDEsIDEpLAotCVBMTF9SQVRFKDk4NDAwMDAwMCwgODIsIDEsIDEpLAotCVBMTF9SQVRFKDEwMDgwMDAwMDAsIDg0LCAxLCAxKSwKLQlQTExfUkFURSgxMDMyMDAwMDAwLCA4NiwgMSwgMSksCi0JUExMX1JBVEUoMTA1NjAwMDAwMCwgODgsIDEsIDEpLAotCVBMTF9SQVRFKDEwODAwMDAwMDAsIDkwLCAxLCAxKSwKLQlQTExfUkFURSgxMTA0MDAwMDAwLCA5MiwgMSwgMSksCi0JUExMX1JBVEUoMTEyODAwMDAwMCwgOTQsIDEsIDEpLAotCVBMTF9SQVRFKDExNTIwMDAwMDAsIDk2LCAxLCAxKSwKLQlQTExfUkFURSgxMTc2MDAwMDAwLCA5OCwgMSwgMSksCi0JUExMX1JBVEUoMTIwMDAwMDAwMCwgNTAsIDEsIDApLAotCVBMTF9SQVRFKDEyMjQwMDAwMDAsIDUxLCAxLCAwKSwKLQlQTExfUkFURSgxMjQ4MDAwMDAwLCA1MiwgMSwgMCksCi0JUExMX1JBVEUoMTI3MjAwMDAwMCwgNTMsIDEsIDApLAotCVBMTF9SQVRFKDEyOTYwMDAwMDAsIDU0LCAxLCAwKSwKLQlQTExfUkFURSgxMzIwMDAwMDAwLCA1NSwgMSwgMCksCi0JUExMX1JBVEUoMTM0NDAwMDAwMCwgNTYsIDEsIDApLAotCVBMTF9SQVRFKDEzNjgwMDAwMDAsIDU3LCAxLCAwKSwKLQlQTExfUkFURSgxMzkyMDAwMDAwLCA1OCwgMSwgMCksCi0JUExMX1JBVEUoMTQxNjAwMDAwMCwgNTksIDEsIDApLAotCVBMTF9SQVRFKDE0NDAwMDAwMDAsIDYwLCAxLCAwKSwKLQlQTExfUkFURSgxNDY0MDAwMDAwLCA2MSwgMSwgMCksCi0JUExMX1JBVEUoMTQ4ODAwMDAwMCwgNjIsIDEsIDApLAotCVBMTF9SQVRFKDE1MTIwMDAwMDAsIDYzLCAxLCAwKSwKLQlQTExfUkFURSgxNTM2MDAwMDAwLCA2NCwgMSwgMCksCi0JeyAvKiBzZW50aW5lbCAqLyB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfZGl2X3RhYmxlIGNwdV9kaXZfdGFibGVbXSA9IHsKLQl7IC52YWwgPSAxLCAuZGl2ID0gMSB9LAotCXsgLnZhbCA9IDIsIC5kaXYgPSAyIH0sCi0JeyAudmFsID0gMywgLmRpdiA9IDMgfSwKLQl7IC52YWwgPSAyLCAuZGl2ID0gNCB9LAotCXsgLnZhbCA9IDMsIC5kaXYgPSA2IH0sCi0JeyAudmFsID0gNCwgLmRpdiA9IDggfSwKLQl7IC52YWwgPSA1LCAuZGl2ID0gMTAgfSwKLQl7IC52YWwgPSA2LCAuZGl2ID0gMTIgfSwKLQl7IC52YWwgPSA3LCAuZGl2ID0gMTQgfSwKLQl7IC52YWwgPSA4LCAuZGl2ID0gMTYgfSwKLQl7IC8qIHNlbnRpbmVsICovIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa19maXhlZF9yYXRlIG1lc29uOGJfeHRhbCA9IHsKLQkuZml4ZWRfcmF0ZSA9IDI0MDAwMDAwLAotCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7Ci0JCS5uYW1lID0gInh0YWwiLAotCQkubnVtX3BhcmVudHMgPSAwLAotCQkub3BzID0gJmNsa19maXhlZF9yYXRlX29wcywKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtZXNvbl9jbGtfcGxsIG1lc29uOGJfZml4ZWRfcGxsID0gewotCS5tID0gewotCQkucmVnX29mZiA9IE1FU09OOEJfUkVHX1BMTF9GSVhFRCwKLQkJLnNoaWZ0ICAgPSAwLAotCQkud2lkdGggICA9IDksCi0JfSwKLQkubiA9IHsKLQkJLnJlZ19vZmYgPSBNRVNPTjhCX1JFR19QTExfRklYRUQsCi0JCS5zaGlmdCAgID0gOSwKLQkJLndpZHRoICAgPSA1LAotCX0sCi0JLm9kID0gewotCQkucmVnX29mZiA9IE1FU09OOEJfUkVHX1BMTF9GSVhFRCwKLQkJLnNoaWZ0ICAgPSAxNiwKLQkJLndpZHRoICAgPSAyLAotCX0sCi0JLmxvY2sgPSAmY2xrX2xvY2ssCi0JLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKLQkJLm5hbWUgPSAiZml4ZWRfcGxsIiwKLQkJLm9wcyA9ICZtZXNvbl9jbGtfcGxsX3JvX29wcywKLQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJ4dGFsIiB9LAotCQkubnVtX3BhcmVudHMgPSAxLAotCQkuZmxhZ3MgPSBDTEtfR0VUX1JBVEVfTk9DQUNIRSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtZXNvbl9jbGtfcGxsIG1lc29uOGJfdmlkX3BsbCA9IHsKLQkubSA9IHsKLQkJLnJlZ19vZmYgPSBNRVNPTjhCX1JFR19QTExfVklELAotCQkuc2hpZnQgICA9IDAsCi0JCS53aWR0aCAgID0gOSwKLQl9LAotCS5uID0gewotCQkucmVnX29mZiA9IE1FU09OOEJfUkVHX1BMTF9WSUQsCi0JCS5zaGlmdCAgID0gOSwKLQkJLndpZHRoICAgPSA1LAotCX0sCi0JLm9kID0gewotCQkucmVnX29mZiA9IE1FU09OOEJfUkVHX1BMTF9WSUQsCi0JCS5zaGlmdCAgID0gMTYsCi0JCS53aWR0aCAgID0gMiwKLQl9LAotCS5sb2NrID0gJmNsa19sb2NrLAotCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7Ci0JCS5uYW1lID0gInZpZF9wbGwiLAotCQkub3BzID0gJm1lc29uX2Nsa19wbGxfcm9fb3BzLAotCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgInh0YWwiIH0sCi0JCS5udW1fcGFyZW50cyA9IDEsCi0JCS5mbGFncyA9IENMS19HRVRfUkFURV9OT0NBQ0hFLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1lc29uX2Nsa19wbGwgbWVzb244Yl9zeXNfcGxsID0gewotCS5tID0gewotCQkucmVnX29mZiA9IE1FU09OOEJfUkVHX1BMTF9TWVMsCi0JCS5zaGlmdCAgID0gMCwKLQkJLndpZHRoICAgPSA5LAotCX0sCi0JLm4gPSB7Ci0JCS5yZWdfb2ZmID0gTUVTT044Ql9SRUdfUExMX1NZUywKLQkJLnNoaWZ0ICAgPSA5LAotCQkud2lkdGggICA9IDUsCi0JfSwKLQkub2QgPSB7Ci0JCS5yZWdfb2ZmID0gTUVTT044Ql9SRUdfUExMX1NZUywKLQkJLnNoaWZ0ICAgPSAxNiwKLQkJLndpZHRoICAgPSAyLAotCX0sCi0JLnJhdGVfdGFibGUgPSBzeXNfcGxsX3JhdGVfdGFibGUsCi0JLnJhdGVfY291bnQgPSBBUlJBWV9TSVpFKHN5c19wbGxfcmF0ZV90YWJsZSksCi0JLmxvY2sgPSAmY2xrX2xvY2ssCi0JLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKLQkJLm5hbWUgPSAic3lzX3BsbCIsCi0JCS5vcHMgPSAmbWVzb25fY2xrX3BsbF9vcHMsCi0JCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAieHRhbCIgfSwKLQkJLm51bV9wYXJlbnRzID0gMSwKLQkJLmZsYWdzID0gQ0xLX0dFVF9SQVRFX05PQ0FDSEUsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrX2ZpeGVkX2ZhY3RvciBtZXNvbjhiX2ZjbGtfZGl2MiA9IHsKLQkubXVsdCA9IDEsCi0JLmRpdiA9IDIsCi0JLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKLQkJLm5hbWUgPSAiZmNsa19kaXYyIiwKLQkJLm9wcyA9ICZjbGtfZml4ZWRfZmFjdG9yX29wcywKLQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJmaXhlZF9wbGwiIH0sCi0JCS5udW1fcGFyZW50cyA9IDEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrX2ZpeGVkX2ZhY3RvciBtZXNvbjhiX2ZjbGtfZGl2MyA9IHsKLQkubXVsdCA9IDEsCi0JLmRpdiA9IDMsCi0JLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKLQkJLm5hbWUgPSAiZmNsa19kaXYzIiwKLQkJLm9wcyA9ICZjbGtfZml4ZWRfZmFjdG9yX29wcywKLQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJmaXhlZF9wbGwiIH0sCi0JCS5udW1fcGFyZW50cyA9IDEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrX2ZpeGVkX2ZhY3RvciBtZXNvbjhiX2ZjbGtfZGl2NCA9IHsKLQkubXVsdCA9IDEsCi0JLmRpdiA9IDQsCi0JLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKLQkJLm5hbWUgPSAiZmNsa19kaXY0IiwKLQkJLm9wcyA9ICZjbGtfZml4ZWRfZmFjdG9yX29wcywKLQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJmaXhlZF9wbGwiIH0sCi0JCS5udW1fcGFyZW50cyA9IDEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrX2ZpeGVkX2ZhY3RvciBtZXNvbjhiX2ZjbGtfZGl2NSA9IHsKLQkubXVsdCA9IDEsCi0JLmRpdiA9IDUsCi0JLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKLQkJLm5hbWUgPSAiZmNsa19kaXY1IiwKLQkJLm9wcyA9ICZjbGtfZml4ZWRfZmFjdG9yX29wcywKLQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJmaXhlZF9wbGwiIH0sCi0JCS5udW1fcGFyZW50cyA9IDEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrX2ZpeGVkX2ZhY3RvciBtZXNvbjhiX2ZjbGtfZGl2NyA9IHsKLQkubXVsdCA9IDEsCi0JLmRpdiA9IDcsCi0JLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKLQkJLm5hbWUgPSAiZmNsa19kaXY3IiwKLQkJLm9wcyA9ICZjbGtfZml4ZWRfZmFjdG9yX29wcywKLQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJmaXhlZF9wbGwiIH0sCi0JCS5udW1fcGFyZW50cyA9IDEsCi0JfSwKLX07Ci0KLS8qCi0gKiBGSVhNRSBjcHUgY2xvY2tzIGFuZCB0aGUgbGVnYWN5IGNvbXBvc2l0ZSBjbG9ja3MgKGUuZy4gY2xrODEpIGFyZSBib3RoIFBMTAotICogcG9zdC1kaXZpZGVycyBhbmQgc2hvdWxkIGJlIG1vZGVsZWQgd2l0aCB0aGVpciByZXNwZWN0aXZlIFBMTHMgdmlhIHRoZQotICogZm9ydGhjb21pbmcgY29vcmRpbmF0ZWQgY2xvY2sgcmF0ZXMgZmVhdHVyZQotICovCi1zdGF0aWMgc3RydWN0IG1lc29uX2Nsa19jcHUgbWVzb244Yl9jcHVfY2xrID0gewotCS5yZWdfb2ZmID0gTUVTT044Ql9SRUdfU1lTX0NQVV9DTlRMMSwKLQkuZGl2X3RhYmxlID0gY3B1X2Rpdl90YWJsZSwKLQkuY2xrX25iLm5vdGlmaWVyX2NhbGwgPSBtZXNvbl9jbGtfY3B1X25vdGlmaWVyX2NiLAotCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7Ci0JCS5uYW1lID0gImNwdV9jbGsiLAotCQkub3BzID0gJm1lc29uX2Nsa19jcHVfb3BzLAotCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgInN5c19wbGwiIH0sCi0JCS5udW1fcGFyZW50cyA9IDEsCi0JfSwKLX07Ci0KLXN0YXRpYyB1MzIgbXV4X3RhYmxlX2NsazgxW10JPSB7IDYsIDUsIDcgfTsKLQotc3RydWN0IGNsa19tdXggbWVzb244Yl9tcGVnX2Nsa19zZWwgPSB7Ci0JLnJlZyA9ICh2b2lkICopTUVTT044Ql9SRUdfSEhJX01QRUcsCi0JLm1hc2sgPSAweDcsCi0JLnNoaWZ0ID0gMTIsCi0JLmZsYWdzID0gQ0xLX01VWF9SRUFEX09OTFksCi0JLnRhYmxlID0gbXV4X3RhYmxlX2NsazgxLAotCS5sb2NrID0gJmNsa19sb2NrLAotCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7Ci0JCS5uYW1lID0gIm1wZWdfY2xrX3NlbCIsCi0JCS5vcHMgPSAmY2xrX211eF9yb19vcHMsCi0JCS8qCi0JCSAqIEZJWE1FIGJpdHMgMTQ6MTIgc2VsZWN0cyBmcm9tIDggcG9zc2libGUgcGFyZW50czoKLQkJICogeHRhbCwgMSdiMCAod3RmKSwgZmNsa19kaXY3LCBtcGxsX2Nsa291dDEsIG1wbGxfY2xrb3V0MiwKLQkJICogZmNsa19kaXY0LCBmY2xrX2RpdjMsIGZjbGtfZGl2NQotCQkgKi8KLQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJmY2xrX2RpdjMiLCAiZmNsa19kaXY0IiwKLQkJCSJmY2xrX2RpdjUiIH0sCi0JCS5udW1fcGFyZW50cyA9IDMsCi0JCS5mbGFncyA9IChDTEtfU0VUX1JBVEVfTk9fUkVQQVJFTlQgfCBDTEtfSUdOT1JFX1VOVVNFRCksCi0JfSwKLX07Ci0KLXN0cnVjdCBjbGtfZGl2aWRlciBtZXNvbjhiX21wZWdfY2xrX2RpdiA9IHsKLQkucmVnID0gKHZvaWQgKilNRVNPTjhCX1JFR19ISElfTVBFRywKLQkuc2hpZnQgPSAwLAotCS53aWR0aCA9IDcsCi0JLmxvY2sgPSAmY2xrX2xvY2ssCi0JLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKLQkJLm5hbWUgPSAibXBlZ19jbGtfZGl2IiwKLQkJLm9wcyA9ICZjbGtfZGl2aWRlcl9vcHMsCi0JCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAibXBlZ19jbGtfc2VsIiB9LAotCQkubnVtX3BhcmVudHMgPSAxLAotCQkuZmxhZ3MgPSAoQ0xLX1NFVF9SQVRFX1BBUkVOVCB8IENMS19JR05PUkVfVU5VU0VEKSwKLQl9LAotfTsKLQotc3RydWN0IGNsa19nYXRlIG1lc29uOGJfY2xrODEgPSB7Ci0JLnJlZyA9ICh2b2lkICopTUVTT044Ql9SRUdfSEhJX01QRUcsCi0JLmJpdF9pZHggPSA3LAotCS5sb2NrID0gJmNsa19sb2NrLAotCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7Ci0JCS5uYW1lID0gImNsazgxIiwKLQkJLm9wcyA9ICZjbGtfZ2F0ZV9vcHMsCi0JCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAibXBlZ19jbGtfZGl2IiB9LAotCQkubnVtX3BhcmVudHMgPSAxLAotCQkuZmxhZ3MgPSAoQ0xLX1NFVF9SQVRFX1BBUkVOVCB8IENMS19JR05PUkVfVU5VU0VEKSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtfaHdfb25lY2VsbF9kYXRhIG1lc29uOGJfaHdfb25lY2VsbF9kYXRhID0gewotCS5od3MgPSB7Ci0JCVtDTEtJRF9YVEFMXSA9ICZtZXNvbjhiX3h0YWwuaHcsCi0JCVtDTEtJRF9QTExfRklYRURdID0gJm1lc29uOGJfZml4ZWRfcGxsLmh3LAotCQlbQ0xLSURfUExMX1ZJRF0gPSAmbWVzb244Yl92aWRfcGxsLmh3LAotCQlbQ0xLSURfUExMX1NZU10gPSAmbWVzb244Yl9zeXNfcGxsLmh3LAotCQlbQ0xLSURfRkNMS19ESVYyXSA9ICZtZXNvbjhiX2ZjbGtfZGl2Mi5odywKLQkJW0NMS0lEX0ZDTEtfRElWM10gPSAmbWVzb244Yl9mY2xrX2RpdjMuaHcsCi0JCVtDTEtJRF9GQ0xLX0RJVjRdID0gJm1lc29uOGJfZmNsa19kaXY0Lmh3LAotCQlbQ0xLSURfRkNMS19ESVY1XSA9ICZtZXNvbjhiX2ZjbGtfZGl2NS5odywKLQkJW0NMS0lEX0ZDTEtfRElWN10gPSAmbWVzb244Yl9mY2xrX2RpdjcuaHcsCi0JCVtDTEtJRF9DUFVDTEtdID0gJm1lc29uOGJfY3B1X2Nsay5odywKLQkJW0NMS0lEX01QRUdfU0VMXSA9ICZtZXNvbjhiX21wZWdfY2xrX3NlbC5odywKLQkJW0NMS0lEX01QRUdfRElWXSA9ICZtZXNvbjhiX21wZWdfY2xrX2Rpdi5odywKLQkJW0NMS0lEX0NMSzgxXSA9ICZtZXNvbjhiX2NsazgxLmh3LAotCX0sCi0JLm51bSA9IENMS19OUl9DTEtTLAotfTsKLQotc3RhdGljIHN0cnVjdCBtZXNvbl9jbGtfcGxsICpjb25zdCBtZXNvbjhiX2Nsa19wbGxzW10gPSB7Ci0JJm1lc29uOGJfZml4ZWRfcGxsLAotCSZtZXNvbjhiX3ZpZF9wbGwsCi0JJm1lc29uOGJfc3lzX3BsbCwKLX07Ci0KLXN0YXRpYyBpbnQgbWVzb244Yl9jbGtjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jdm9pZCBfX2lvbWVtICpjbGtfYmFzZTsKLQlpbnQgcmV0LCBjbGtpZCwgaTsKLQlzdHJ1Y3QgY2xrX2h3ICpwYXJlbnRfaHc7Ci0Jc3RydWN0IGNsayAqcGFyZW50X2NsazsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwotCi0JLyogIEdlbmVyaWMgY2xvY2tzIGFuZCBQTExzICovCi0JY2xrX2Jhc2UgPSBvZl9pb21hcChkZXYtPm9mX25vZGUsIDEpOwotCWlmICghY2xrX2Jhc2UpIHsKLQkJcHJfZXJyKCIlczogVW5hYmxlIHRvIG1hcCBjbGsgYmFzZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQotCS8qIFBvcHVsYXRlIGJhc2UgYWRkcmVzcyBmb3IgUExMcyAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1lc29uOGJfY2xrX3BsbHMpOyBpKyspCi0JCW1lc29uOGJfY2xrX3BsbHNbaV0tPmJhc2UgPSBjbGtfYmFzZTsKLQotCS8qIFBvcHVsYXRlIHRoZSBiYXNlIGFkZHJlc3MgZm9yIENQVSBjbGsgKi8KLQltZXNvbjhiX2NwdV9jbGsuYmFzZSA9IGNsa19iYXNlOwotCi0JLyogUG9wdWxhdGUgdGhlIGJhc2UgYWRkcmVzcyBmb3IgdGhlIE1QRUcgY2xrcyAqLwotCW1lc29uOGJfbXBlZ19jbGtfc2VsLnJlZyA9IGNsa19iYXNlICsgKHUzMiltZXNvbjhiX21wZWdfY2xrX3NlbC5yZWc7Ci0JbWVzb244Yl9tcGVnX2Nsa19kaXYucmVnID0gY2xrX2Jhc2UgKyAodTMyKW1lc29uOGJfbXBlZ19jbGtfZGl2LnJlZzsKLQltZXNvbjhiX2NsazgxLnJlZyA9IGNsa19iYXNlICsgKHUzMiltZXNvbjhiX2NsazgxLnJlZzsKLQotCS8qCi0JICogcmVnaXN0ZXIgYWxsIGNsa3MKLQkgKiBDTEtJRF9VTlVTRUQgPSAwLCBzbyBza2lwIGl0IGFuZCBzdGFydCB3aXRoIENMS0lEX1hUQUwgPSAxCi0JICovCi0JZm9yIChjbGtpZCA9IENMS0lEX1hUQUw7IGNsa2lkIDwgQ0xLX05SX0NMS1M7IGNsa2lkKyspIHsKLQkJLyogYXJyYXkgbWlnaHQgYmUgc3BhcnNlICovCi0JCWlmICghbWVzb244Yl9od19vbmVjZWxsX2RhdGEuaHdzW2Nsa2lkXSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIEZJWE1FIGNvbnZlcnQgdG8gZGV2bV9jbGtfcmVnaXN0ZXIgKi8KLQkJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoZGV2LCBtZXNvbjhiX2h3X29uZWNlbGxfZGF0YS5od3NbY2xraWRdKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gaW91bm1hcDsKLQl9Ci0KLQkvKgotCSAqIFJlZ2lzdGVyIENQVSBjbGsgbm90aWZpZXIKLQkgKgotCSAqIEZJWE1FIHRoaXMgaXMgd3JvbmcgZm9yIGEgbG90IG9mIHJlYXNvbnMuIEZpcnN0LCB0aGUgbXV4ZXMgc2hvdWxkIGJlCi0JICogc3RydWN0IGNsa19odyBvYmplY3RzLiBTZWNvbmQsIHdlIHNob3VsZG4ndCBwcm9ncmFtIHRoZSBtdXhlcyBpbgotCSAqIG5vdGlmaWVyIGhhbmRsZXJzLiBUaGUgdHJpY2t5IHByb2dyYW1taW5nIHNlcXVlbmNlIHdpbGwgYmUgaGFuZGxlZAotCSAqIGJ5IHRoZSBmb3J0aGNvbWluZyBjb29yZGluYXRlZCBjbG9jayByYXRlcyBtZWNoYW5pc20gb25jZSB0aGF0Ci0JICogZmVhdHVyZSBpcyByZWxlYXNlZC4KLQkgKgotCSAqIEZ1cnRoZXJtb3JlLCBsb29raW5nIHVwIHRoZSBwYXJlbnQgdGhpcyB3YXkgaXMgdGVycmlibGUuIEF0IHNvbWUKLQkgKiBwb2ludCB3ZSB3aWxsIHN0b3AgYWxsb2NhdGluZyBhIGRlZmF1bHQgc3RydWN0IGNsayB3aGVuIHJlZ2lzdGVyaW5nCi0JICogYSBuZXcgY2xrX2h3LCBhbmQgdGhpcyBoYWNrIHdpbGwgbm8gbG9uZ2VyIHdvcmsuIFJlbGVhc2luZyB0aGUgY2NyCi0JICogZmVhdHVyZSBiZWZvcmUgdGhhdCB0aW1lIHNvbHZlcyB0aGUgcHJvYmxlbSA6LSkKLQkgKi8KLQlwYXJlbnRfaHcgPSBjbGtfaHdfZ2V0X3BhcmVudCgmbWVzb244Yl9jcHVfY2xrLmh3KTsKLQlwYXJlbnRfY2xrID0gcGFyZW50X2h3LT5jbGs7Ci0JcmV0ID0gY2xrX25vdGlmaWVyX3JlZ2lzdGVyKHBhcmVudF9jbGssICZtZXNvbjhiX2NwdV9jbGsuY2xrX25iKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IGZhaWxlZCB0byByZWdpc3RlciBjbG9jayBub3RpZmllciBmb3IgY3B1X2Nsa1xuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gaW91bm1hcDsKLQl9Ci0KLQlyZXR1cm4gb2ZfY2xrX2FkZF9od19wcm92aWRlcihkZXYtPm9mX25vZGUsIG9mX2Nsa19od19vbmVjZWxsX2dldCwKLQkJCSZtZXNvbjhiX2h3X29uZWNlbGxfZGF0YSk7Ci0KLWlvdW5tYXA6Ci0JaW91bm1hcChjbGtfYmFzZSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbWVzb244Yl9jbGtjX21hdGNoX3RhYmxlW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJhbWxvZ2ljLG1lc29uOGItY2xrYyIgfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1lc29uOGJfZHJpdmVyID0gewotCS5wcm9iZQkJPSBtZXNvbjhiX2Nsa2NfcHJvYmUsCi0JLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gIm1lc29uOGItY2xrYyIsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG1lc29uOGJfY2xrY19tYXRjaF90YWJsZSwKLQl9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbWVzb244Yl9jbGtjX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtZXNvbjhiX2RyaXZlcik7Ci19Ci1kZXZpY2VfaW5pdGNhbGwobWVzb244Yl9jbGtjX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbWVzb24vbWVzb244Yi5jIGIvZHJpdmVycy9jbGsvbWVzb24vbWVzb244Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMWJlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsay9tZXNvbi9tZXNvbjhiLmMKQEAgLTAsMCArMSw2NzYgQEAKKy8qCisgKiBBbUxvZ2ljIFM4MDUgLyBNZXNvbjhiIENsb2NrIENvbnRyb2xsZXIgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE1IEVuZGxlc3MgTW9iaWxlLCBJbmMuCisgKiBBdXRob3I6IENhcmxvIENhaW9uZSA8Y2FybG9AZW5kbGVzc20uY29tPgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBCYXlMaWJyZSwgSW5jLgorICogTWljaGFlbCBUdXJxdWV0dGUgPG10dXJxdWV0dGVAYmF5bGlicmUuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlICJjbGtjLmgiCisjaW5jbHVkZSAibWVzb244Yi5oIgorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNsa19sb2NrKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwbGxfcmF0ZV90YWJsZSBzeXNfcGxsX3JhdGVfdGFibGVbXSA9IHsKKwlQTExfUkFURSgzMTIwMDAwMDAsIDUyLCAxLCAyKSwKKwlQTExfUkFURSgzMzYwMDAwMDAsIDU2LCAxLCAyKSwKKwlQTExfUkFURSgzNjAwMDAwMDAsIDYwLCAxLCAyKSwKKwlQTExfUkFURSgzODQwMDAwMDAsIDY0LCAxLCAyKSwKKwlQTExfUkFURSg0MDgwMDAwMDAsIDY4LCAxLCAyKSwKKwlQTExfUkFURSg0MzIwMDAwMDAsIDcyLCAxLCAyKSwKKwlQTExfUkFURSg0NTYwMDAwMDAsIDc2LCAxLCAyKSwKKwlQTExfUkFURSg0ODAwMDAwMDAsIDgwLCAxLCAyKSwKKwlQTExfUkFURSg1MDQwMDAwMDAsIDg0LCAxLCAyKSwKKwlQTExfUkFURSg1MjgwMDAwMDAsIDg4LCAxLCAyKSwKKwlQTExfUkFURSg1NTIwMDAwMDAsIDkyLCAxLCAyKSwKKwlQTExfUkFURSg1NzYwMDAwMDAsIDk2LCAxLCAyKSwKKwlQTExfUkFURSg2MDAwMDAwMDAsIDUwLCAxLCAxKSwKKwlQTExfUkFURSg2MjQwMDAwMDAsIDUyLCAxLCAxKSwKKwlQTExfUkFURSg2NDgwMDAwMDAsIDU0LCAxLCAxKSwKKwlQTExfUkFURSg2NzIwMDAwMDAsIDU2LCAxLCAxKSwKKwlQTExfUkFURSg2OTYwMDAwMDAsIDU4LCAxLCAxKSwKKwlQTExfUkFURSg3MjAwMDAwMDAsIDYwLCAxLCAxKSwKKwlQTExfUkFURSg3NDQwMDAwMDAsIDYyLCAxLCAxKSwKKwlQTExfUkFURSg3NjgwMDAwMDAsIDY0LCAxLCAxKSwKKwlQTExfUkFURSg3OTIwMDAwMDAsIDY2LCAxLCAxKSwKKwlQTExfUkFURSg4MTYwMDAwMDAsIDY4LCAxLCAxKSwKKwlQTExfUkFURSg4NDAwMDAwMDAsIDcwLCAxLCAxKSwKKwlQTExfUkFURSg4NjQwMDAwMDAsIDcyLCAxLCAxKSwKKwlQTExfUkFURSg4ODgwMDAwMDAsIDc0LCAxLCAxKSwKKwlQTExfUkFURSg5MTIwMDAwMDAsIDc2LCAxLCAxKSwKKwlQTExfUkFURSg5MzYwMDAwMDAsIDc4LCAxLCAxKSwKKwlQTExfUkFURSg5NjAwMDAwMDAsIDgwLCAxLCAxKSwKKwlQTExfUkFURSg5ODQwMDAwMDAsIDgyLCAxLCAxKSwKKwlQTExfUkFURSgxMDA4MDAwMDAwLCA4NCwgMSwgMSksCisJUExMX1JBVEUoMTAzMjAwMDAwMCwgODYsIDEsIDEpLAorCVBMTF9SQVRFKDEwNTYwMDAwMDAsIDg4LCAxLCAxKSwKKwlQTExfUkFURSgxMDgwMDAwMDAwLCA5MCwgMSwgMSksCisJUExMX1JBVEUoMTEwNDAwMDAwMCwgOTIsIDEsIDEpLAorCVBMTF9SQVRFKDExMjgwMDAwMDAsIDk0LCAxLCAxKSwKKwlQTExfUkFURSgxMTUyMDAwMDAwLCA5NiwgMSwgMSksCisJUExMX1JBVEUoMTE3NjAwMDAwMCwgOTgsIDEsIDEpLAorCVBMTF9SQVRFKDEyMDAwMDAwMDAsIDUwLCAxLCAwKSwKKwlQTExfUkFURSgxMjI0MDAwMDAwLCA1MSwgMSwgMCksCisJUExMX1JBVEUoMTI0ODAwMDAwMCwgNTIsIDEsIDApLAorCVBMTF9SQVRFKDEyNzIwMDAwMDAsIDUzLCAxLCAwKSwKKwlQTExfUkFURSgxMjk2MDAwMDAwLCA1NCwgMSwgMCksCisJUExMX1JBVEUoMTMyMDAwMDAwMCwgNTUsIDEsIDApLAorCVBMTF9SQVRFKDEzNDQwMDAwMDAsIDU2LCAxLCAwKSwKKwlQTExfUkFURSgxMzY4MDAwMDAwLCA1NywgMSwgMCksCisJUExMX1JBVEUoMTM5MjAwMDAwMCwgNTgsIDEsIDApLAorCVBMTF9SQVRFKDE0MTYwMDAwMDAsIDU5LCAxLCAwKSwKKwlQTExfUkFURSgxNDQwMDAwMDAwLCA2MCwgMSwgMCksCisJUExMX1JBVEUoMTQ2NDAwMDAwMCwgNjEsIDEsIDApLAorCVBMTF9SQVRFKDE0ODgwMDAwMDAsIDYyLCAxLCAwKSwKKwlQTExfUkFURSgxNTEyMDAwMDAwLCA2MywgMSwgMCksCisJUExMX1JBVEUoMTUzNjAwMDAwMCwgNjQsIDEsIDApLAorCXsgLyogc2VudGluZWwgKi8gfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX2Rpdl90YWJsZSBjcHVfZGl2X3RhYmxlW10gPSB7CisJeyAudmFsID0gMSwgLmRpdiA9IDEgfSwKKwl7IC52YWwgPSAyLCAuZGl2ID0gMiB9LAorCXsgLnZhbCA9IDMsIC5kaXYgPSAzIH0sCisJeyAudmFsID0gMiwgLmRpdiA9IDQgfSwKKwl7IC52YWwgPSAzLCAuZGl2ID0gNiB9LAorCXsgLnZhbCA9IDQsIC5kaXYgPSA4IH0sCisJeyAudmFsID0gNSwgLmRpdiA9IDEwIH0sCisJeyAudmFsID0gNiwgLmRpdiA9IDEyIH0sCisJeyAudmFsID0gNywgLmRpdiA9IDE0IH0sCisJeyAudmFsID0gOCwgLmRpdiA9IDE2IH0sCisJeyAvKiBzZW50aW5lbCAqLyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfZml4ZWRfcmF0ZSBtZXNvbjhiX3h0YWwgPSB7CisJLmZpeGVkX3JhdGUgPSAyNDAwMDAwMCwKKwkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkubmFtZSA9ICJ4dGFsIiwKKwkJLm51bV9wYXJlbnRzID0gMCwKKwkJLm9wcyA9ICZjbGtfZml4ZWRfcmF0ZV9vcHMsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWVzb25fY2xrX3BsbCBtZXNvbjhiX2ZpeGVkX3BsbCA9IHsKKwkubSA9IHsKKwkJLnJlZ19vZmYgPSBISElfTVBMTF9DTlRMLAorCQkuc2hpZnQgICA9IDAsCisJCS53aWR0aCAgID0gOSwKKwl9LAorCS5uID0geworCQkucmVnX29mZiA9IEhISV9NUExMX0NOVEwsCisJCS5zaGlmdCAgID0gOSwKKwkJLndpZHRoICAgPSA1LAorCX0sCisJLm9kID0geworCQkucmVnX29mZiA9IEhISV9NUExMX0NOVEwsCisJCS5zaGlmdCAgID0gMTYsCisJCS53aWR0aCAgID0gMiwKKwl9LAorCS5sb2NrID0gJmNsa19sb2NrLAorCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCS5uYW1lID0gImZpeGVkX3BsbCIsCisJCS5vcHMgPSAmbWVzb25fY2xrX3BsbF9yb19vcHMsCisJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAieHRhbCIgfSwKKwkJLm51bV9wYXJlbnRzID0gMSwKKwkJLmZsYWdzID0gQ0xLX0dFVF9SQVRFX05PQ0FDSEUsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWVzb25fY2xrX3BsbCBtZXNvbjhiX3ZpZF9wbGwgPSB7CisJLm0gPSB7CisJCS5yZWdfb2ZmID0gSEhJX1ZJRF9QTExfQ05UTCwKKwkJLnNoaWZ0ICAgPSAwLAorCQkud2lkdGggICA9IDksCisJfSwKKwkubiA9IHsKKwkJLnJlZ19vZmYgPSBISElfVklEX1BMTF9DTlRMLAorCQkuc2hpZnQgICA9IDksCisJCS53aWR0aCAgID0gNSwKKwl9LAorCS5vZCA9IHsKKwkJLnJlZ19vZmYgPSBISElfVklEX1BMTF9DTlRMLAorCQkuc2hpZnQgICA9IDE2LAorCQkud2lkdGggICA9IDIsCisJfSwKKwkubG9jayA9ICZjbGtfbG9jaywKKwkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkubmFtZSA9ICJ2aWRfcGxsIiwKKwkJLm9wcyA9ICZtZXNvbl9jbGtfcGxsX3JvX29wcywKKwkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJ4dGFsIiB9LAorCQkubnVtX3BhcmVudHMgPSAxLAorCQkuZmxhZ3MgPSBDTEtfR0VUX1JBVEVfTk9DQUNIRSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtZXNvbl9jbGtfcGxsIG1lc29uOGJfc3lzX3BsbCA9IHsKKwkubSA9IHsKKwkJLnJlZ19vZmYgPSBISElfU1lTX1BMTF9DTlRMLAorCQkuc2hpZnQgICA9IDAsCisJCS53aWR0aCAgID0gOSwKKwl9LAorCS5uID0geworCQkucmVnX29mZiA9IEhISV9TWVNfUExMX0NOVEwsCisJCS5zaGlmdCAgID0gOSwKKwkJLndpZHRoICAgPSA1LAorCX0sCisJLm9kID0geworCQkucmVnX29mZiA9IEhISV9TWVNfUExMX0NOVEwsCisJCS5zaGlmdCAgID0gMTYsCisJCS53aWR0aCAgID0gMiwKKwl9LAorCS5yYXRlX3RhYmxlID0gc3lzX3BsbF9yYXRlX3RhYmxlLAorCS5yYXRlX2NvdW50ID0gQVJSQVlfU0laRShzeXNfcGxsX3JhdGVfdGFibGUpLAorCS5sb2NrID0gJmNsa19sb2NrLAorCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCS5uYW1lID0gInN5c19wbGwiLAorCQkub3BzID0gJm1lc29uX2Nsa19wbGxfb3BzLAorCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgInh0YWwiIH0sCisJCS5udW1fcGFyZW50cyA9IDEsCisJCS5mbGFncyA9IENMS19HRVRfUkFURV9OT0NBQ0hFLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19maXhlZF9mYWN0b3IgbWVzb244Yl9mY2xrX2RpdjIgPSB7CisJLm11bHQgPSAxLAorCS5kaXYgPSAyLAorCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCS5uYW1lID0gImZjbGtfZGl2MiIsCisJCS5vcHMgPSAmY2xrX2ZpeGVkX2ZhY3Rvcl9vcHMsCisJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAiZml4ZWRfcGxsIiB9LAorCQkubnVtX3BhcmVudHMgPSAxLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19maXhlZF9mYWN0b3IgbWVzb244Yl9mY2xrX2RpdjMgPSB7CisJLm11bHQgPSAxLAorCS5kaXYgPSAzLAorCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCS5uYW1lID0gImZjbGtfZGl2MyIsCisJCS5vcHMgPSAmY2xrX2ZpeGVkX2ZhY3Rvcl9vcHMsCisJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAiZml4ZWRfcGxsIiB9LAorCQkubnVtX3BhcmVudHMgPSAxLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19maXhlZF9mYWN0b3IgbWVzb244Yl9mY2xrX2RpdjQgPSB7CisJLm11bHQgPSAxLAorCS5kaXYgPSA0LAorCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCS5uYW1lID0gImZjbGtfZGl2NCIsCisJCS5vcHMgPSAmY2xrX2ZpeGVkX2ZhY3Rvcl9vcHMsCisJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAiZml4ZWRfcGxsIiB9LAorCQkubnVtX3BhcmVudHMgPSAxLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19maXhlZF9mYWN0b3IgbWVzb244Yl9mY2xrX2RpdjUgPSB7CisJLm11bHQgPSAxLAorCS5kaXYgPSA1LAorCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCS5uYW1lID0gImZjbGtfZGl2NSIsCisJCS5vcHMgPSAmY2xrX2ZpeGVkX2ZhY3Rvcl9vcHMsCisJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAiZml4ZWRfcGxsIiB9LAorCQkubnVtX3BhcmVudHMgPSAxLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19maXhlZF9mYWN0b3IgbWVzb244Yl9mY2xrX2RpdjcgPSB7CisJLm11bHQgPSAxLAorCS5kaXYgPSA3LAorCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCS5uYW1lID0gImZjbGtfZGl2NyIsCisJCS5vcHMgPSAmY2xrX2ZpeGVkX2ZhY3Rvcl9vcHMsCisJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAiZml4ZWRfcGxsIiB9LAorCQkubnVtX3BhcmVudHMgPSAxLAorCX0sCit9OworCisvKgorICogRklYTUUgY3B1IGNsb2NrcyBhbmQgdGhlIGxlZ2FjeSBjb21wb3NpdGUgY2xvY2tzIChlLmcuIGNsazgxKSBhcmUgYm90aCBQTEwKKyAqIHBvc3QtZGl2aWRlcnMgYW5kIHNob3VsZCBiZSBtb2RlbGVkIHdpdGggdGhlaXIgcmVzcGVjdGl2ZSBQTExzIHZpYSB0aGUKKyAqIGZvcnRoY29taW5nIGNvb3JkaW5hdGVkIGNsb2NrIHJhdGVzIGZlYXR1cmUKKyAqLworc3RhdGljIHN0cnVjdCBtZXNvbl9jbGtfY3B1IG1lc29uOGJfY3B1X2NsayA9IHsKKwkucmVnX29mZiA9IEhISV9TWVNfQ1BVX0NMS19DTlRMMSwKKwkuZGl2X3RhYmxlID0gY3B1X2Rpdl90YWJsZSwKKwkuY2xrX25iLm5vdGlmaWVyX2NhbGwgPSBtZXNvbl9jbGtfY3B1X25vdGlmaWVyX2NiLAorCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCS5uYW1lID0gImNwdV9jbGsiLAorCQkub3BzID0gJm1lc29uX2Nsa19jcHVfb3BzLAorCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgInN5c19wbGwiIH0sCisJCS5udW1fcGFyZW50cyA9IDEsCisJfSwKK307CisKK3N0YXRpYyB1MzIgbXV4X3RhYmxlX2NsazgxW10JPSB7IDYsIDUsIDcgfTsKKworc3RydWN0IGNsa19tdXggbWVzb244Yl9tcGVnX2Nsa19zZWwgPSB7CisJLnJlZyA9ICh2b2lkICopSEhJX01QRUdfQ0xLX0NOVEwsCisJLm1hc2sgPSAweDcsCisJLnNoaWZ0ID0gMTIsCisJLmZsYWdzID0gQ0xLX01VWF9SRUFEX09OTFksCisJLnRhYmxlID0gbXV4X3RhYmxlX2NsazgxLAorCS5sb2NrID0gJmNsa19sb2NrLAorCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCS5uYW1lID0gIm1wZWdfY2xrX3NlbCIsCisJCS5vcHMgPSAmY2xrX211eF9yb19vcHMsCisJCS8qCisJCSAqIEZJWE1FIGJpdHMgMTQ6MTIgc2VsZWN0cyBmcm9tIDggcG9zc2libGUgcGFyZW50czoKKwkJICogeHRhbCwgMSdiMCAod3RmKSwgZmNsa19kaXY3LCBtcGxsX2Nsa291dDEsIG1wbGxfY2xrb3V0MiwKKwkJICogZmNsa19kaXY0LCBmY2xrX2RpdjMsIGZjbGtfZGl2NQorCQkgKi8KKwkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJmY2xrX2RpdjMiLCAiZmNsa19kaXY0IiwKKwkJCSJmY2xrX2RpdjUiIH0sCisJCS5udW1fcGFyZW50cyA9IDMsCisJCS5mbGFncyA9IChDTEtfU0VUX1JBVEVfTk9fUkVQQVJFTlQgfCBDTEtfSUdOT1JFX1VOVVNFRCksCisJfSwKK307CisKK3N0cnVjdCBjbGtfZGl2aWRlciBtZXNvbjhiX21wZWdfY2xrX2RpdiA9IHsKKwkucmVnID0gKHZvaWQgKilISElfTVBFR19DTEtfQ05UTCwKKwkuc2hpZnQgPSAwLAorCS53aWR0aCA9IDcsCisJLmxvY2sgPSAmY2xrX2xvY2ssCisJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJLm5hbWUgPSAibXBlZ19jbGtfZGl2IiwKKwkJLm9wcyA9ICZjbGtfZGl2aWRlcl9vcHMsCisJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAibXBlZ19jbGtfc2VsIiB9LAorCQkubnVtX3BhcmVudHMgPSAxLAorCQkuZmxhZ3MgPSAoQ0xLX1NFVF9SQVRFX1BBUkVOVCB8IENMS19JR05PUkVfVU5VU0VEKSwKKwl9LAorfTsKKworc3RydWN0IGNsa19nYXRlIG1lc29uOGJfY2xrODEgPSB7CisJLnJlZyA9ICh2b2lkICopSEhJX01QRUdfQ0xLX0NOVEwsCisJLmJpdF9pZHggPSA3LAorCS5sb2NrID0gJmNsa19sb2NrLAorCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCS5uYW1lID0gImNsazgxIiwKKwkJLm9wcyA9ICZjbGtfZ2F0ZV9vcHMsCisJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAibXBlZ19jbGtfZGl2IiB9LAorCQkubnVtX3BhcmVudHMgPSAxLAorCQkuZmxhZ3MgPSAoQ0xLX1NFVF9SQVRFX1BBUkVOVCB8IENMS19JR05PUkVfVU5VU0VEKSwKKwl9LAorfTsKKworLyogRXZlcnl0aGluZyBFbHNlIChFRSkgZG9tYWluIGdhdGVzICovCisKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfZGRyLCBISElfR0NMS19NUEVHMCwgMCk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX2RvcywgSEhJX0dDTEtfTVBFRzAsIDEpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9pc2EsIEhISV9HQ0xLX01QRUcwLCA1KTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfcGwzMDEsIEhISV9HQ0xLX01QRUcwLCA2KTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfcGVyaXBocywgSEhJX0dDTEtfTVBFRzAsIDcpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9zcGljYywgSEhJX0dDTEtfTVBFRzAsIDgpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9pMmMsIEhISV9HQ0xLX01QRUcwLCA5KTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfc2FyX2FkYywgSEhJX0dDTEtfTVBFRzAsIDEwKTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfc21hcnRfY2FyZCwgSEhJX0dDTEtfTVBFRzAsIDExKTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfcm5nMCwgSEhJX0dDTEtfTVBFRzAsIDEyKTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfdWFydDAsIEhISV9HQ0xLX01QRUcwLCAxMyk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX3NkaGMsIEhISV9HQ0xLX01QRUcwLCAxNCk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX3N0cmVhbSwgSEhJX0dDTEtfTVBFRzAsIDE1KTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfYXN5bmNfZmlmbywgSEhJX0dDTEtfTVBFRzAsIDE2KTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfc2RpbywgSEhJX0dDTEtfTVBFRzAsIDE3KTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfYWJ1ZiwgSEhJX0dDTEtfTVBFRzAsIDE4KTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfaGl1X2lmYWNlLCBISElfR0NMS19NUEVHMCwgMTkpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9hc3Npc3RfbWlzYywgSEhJX0dDTEtfTVBFRzAsIDIzKTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfc3BpLCBISElfR0NMS19NUEVHMCwgMzApOworCitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX2kyc19zcGRpZiwgSEhJX0dDTEtfTVBFRzEsIDIpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9ldGgsIEhISV9HQ0xLX01QRUcxLCAzKTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfZGVtdXgsIEhISV9HQ0xLX01QRUcxLCA0KTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfYWl1X2dsdWUsIEhISV9HQ0xLX01QRUcxLCA2KTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfaWVjOTU4LCBISElfR0NMS19NUEVHMSwgNyk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX2kyc19vdXQsIEhISV9HQ0xLX01QRUcxLCA4KTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfYW1jbGssIEhISV9HQ0xLX01QRUcxLCA5KTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfYWlmaWZvMiwgSEhJX0dDTEtfTVBFRzEsIDEwKTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfbWl4ZXIsIEhISV9HQ0xLX01QRUcxLCAxMSk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX21peGVyX2lmYWNlLCBISElfR0NMS19NUEVHMSwgMTIpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9hZGMsIEhISV9HQ0xLX01QRUcxLCAxMyk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX2Jsa212LCBISElfR0NMS19NUEVHMSwgMTQpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9haXUsIEhISV9HQ0xLX01QRUcxLCAxNSk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX3VhcnQxLCBISElfR0NMS19NUEVHMSwgMTYpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9nMmQsIEhISV9HQ0xLX01QRUcxLCAyMCk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX3VzYjAsIEhISV9HQ0xLX01QRUcxLCAyMSk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX3VzYjEsIEhISV9HQ0xLX01QRUcxLCAyMik7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX3Jlc2V0LCBISElfR0NMS19NUEVHMSwgMjMpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9uYW5kLCBISElfR0NMS19NUEVHMSwgMjQpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9kb3NfcGFyc2VyLCBISElfR0NMS19NUEVHMSwgMjUpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl91c2IsIEhISV9HQ0xLX01QRUcxLCAyNik7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX3ZkaW4xLCBISElfR0NMS19NUEVHMSwgMjgpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9haGJfYXJiMCwgSEhJX0dDTEtfTVBFRzEsIDI5KTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfZWZ1c2UsIEhISV9HQ0xLX01QRUcxLCAzMCk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX2Jvb3Rfcm9tLCBISElfR0NMS19NUEVHMSwgMzEpOworCitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX2FoYl9kYXRhX2J1cywgSEhJX0dDTEtfTVBFRzIsIDEpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9haGJfY3RybF9idXMsIEhISV9HQ0xLX01QRUcyLCAyKTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfaGRtaV9pbnRyX3N5bmMsIEhISV9HQ0xLX01QRUcyLCAzKTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfaGRtaV9wY2xrLCBISElfR0NMS19NUEVHMiwgNCk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX3VzYjFfZGRyX2JyaWRnZSwgSEhJX0dDTEtfTVBFRzIsIDgpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl91c2IwX2Rkcl9icmlkZ2UsIEhISV9HQ0xLX01QRUcyLCA5KTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfbW1jX3BjbGssIEhISV9HQ0xLX01QRUcyLCAxMSk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX2R2aW4sIEhISV9HQ0xLX01QRUcyLCAxMik7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX3VhcnQyLCBISElfR0NMS19NUEVHMiwgMTUpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9zYW5hLCBISElfR0NMS19NUEVHMiwgMjIpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl92cHVfaW50ciwgSEhJX0dDTEtfTVBFRzIsIDI1KTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfc2VjX2FoYl9haGIzX2JyaWRnZSwgSEhJX0dDTEtfTVBFRzIsIDI2KTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfY2xrODFfYTksIEhISV9HQ0xLX01QRUcyLCAyOSk7CisKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfdmNsazJfdmVuY2kwLCBISElfR0NMS19PVEhFUiwgMSk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX3ZjbGsyX3ZlbmNpMSwgSEhJX0dDTEtfT1RIRVIsIDIpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl92Y2xrMl92ZW5jcDAsIEhISV9HQ0xLX09USEVSLCAzKTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfdmNsazJfdmVuY3AxLCBISElfR0NMS19PVEhFUiwgNCk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX2djbGtfdmVuY2lfaW50LCBISElfR0NMS19PVEhFUiwgOCk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX2djbGtfdmVuY3BfaW50LCBISElfR0NMS19PVEhFUiwgOSk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX2RhY19jbGssIEhISV9HQ0xLX09USEVSLCAxMCk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX2FvY2xrX2dhdGUsIEhISV9HQ0xLX09USEVSLCAxNCk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX2llYzk1OF9nYXRlLCBISElfR0NMS19PVEhFUiwgMTYpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9lbmM0ODBwLCBISElfR0NMS19PVEhFUiwgMjApOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9ybmcxLCBISElfR0NMS19PVEhFUiwgMjEpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9nY2xrX3ZlbmNsX2ludCwgSEhJX0dDTEtfT1RIRVIsIDIyKTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfdmNsazJfdmVuY2xtY2MsIEhISV9HQ0xLX09USEVSLCAyNCk7CitzdGF0aWMgTUVTT05fR0FURShtZXNvbjhiX3ZjbGsyX3ZlbmNsLCBISElfR0NMS19PVEhFUiwgMjUpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl92Y2xrMl9vdGhlciwgSEhJX0dDTEtfT1RIRVIsIDI2KTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfZWRwLCBISElfR0NMS19PVEhFUiwgMzEpOworCisvKiBBbHdheXMgT24gKEFPKSBkb21haW4gZ2F0ZXMgKi8KKworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9hb19tZWRpYV9jcHUsIEhISV9HQ0xLX0FPLCAwKTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfYW9fYWhiX3NyYW0sIEhISV9HQ0xLX0FPLCAxKTsKK3N0YXRpYyBNRVNPTl9HQVRFKG1lc29uOGJfYW9fYWhiX2J1cywgSEhJX0dDTEtfQU8sIDIpOworc3RhdGljIE1FU09OX0dBVEUobWVzb244Yl9hb19pZmFjZSwgSEhJX0dDTEtfQU8sIDMpOworCitzdGF0aWMgc3RydWN0IGNsa19od19vbmVjZWxsX2RhdGEgbWVzb244Yl9od19vbmVjZWxsX2RhdGEgPSB7CisJLmh3cyA9IHsKKwkJW0NMS0lEX1hUQUxdID0gJm1lc29uOGJfeHRhbC5odywKKwkJW0NMS0lEX1BMTF9GSVhFRF0gPSAmbWVzb244Yl9maXhlZF9wbGwuaHcsCisJCVtDTEtJRF9QTExfVklEXSA9ICZtZXNvbjhiX3ZpZF9wbGwuaHcsCisJCVtDTEtJRF9QTExfU1lTXSA9ICZtZXNvbjhiX3N5c19wbGwuaHcsCisJCVtDTEtJRF9GQ0xLX0RJVjJdID0gJm1lc29uOGJfZmNsa19kaXYyLmh3LAorCQlbQ0xLSURfRkNMS19ESVYzXSA9ICZtZXNvbjhiX2ZjbGtfZGl2My5odywKKwkJW0NMS0lEX0ZDTEtfRElWNF0gPSAmbWVzb244Yl9mY2xrX2RpdjQuaHcsCisJCVtDTEtJRF9GQ0xLX0RJVjVdID0gJm1lc29uOGJfZmNsa19kaXY1Lmh3LAorCQlbQ0xLSURfRkNMS19ESVY3XSA9ICZtZXNvbjhiX2ZjbGtfZGl2Ny5odywKKwkJW0NMS0lEX0NQVUNMS10gPSAmbWVzb244Yl9jcHVfY2xrLmh3LAorCQlbQ0xLSURfTVBFR19TRUxdID0gJm1lc29uOGJfbXBlZ19jbGtfc2VsLmh3LAorCQlbQ0xLSURfTVBFR19ESVZdID0gJm1lc29uOGJfbXBlZ19jbGtfZGl2Lmh3LAorCQlbQ0xLSURfQ0xLODFdID0gJm1lc29uOGJfY2xrODEuaHcsCisJCVtDTEtJRF9ERFJdCQkgICAgPSAmbWVzb244Yl9kZHIuaHcsCisJCVtDTEtJRF9ET1NdCQkgICAgPSAmbWVzb244Yl9kb3MuaHcsCisJCVtDTEtJRF9JU0FdCQkgICAgPSAmbWVzb244Yl9pc2EuaHcsCisJCVtDTEtJRF9QTDMwMV0JCSAgICA9ICZtZXNvbjhiX3BsMzAxLmh3LAorCQlbQ0xLSURfUEVSSVBIU10JCSAgICA9ICZtZXNvbjhiX3BlcmlwaHMuaHcsCisJCVtDTEtJRF9TUElDQ10JCSAgICA9ICZtZXNvbjhiX3NwaWNjLmh3LAorCQlbQ0xLSURfSTJDXQkJICAgID0gJm1lc29uOGJfaTJjLmh3LAorCQlbQ0xLSURfU0FSX0FEQ10JCSAgICA9ICZtZXNvbjhiX3Nhcl9hZGMuaHcsCisJCVtDTEtJRF9TTUFSVF9DQVJEXQkgICAgPSAmbWVzb244Yl9zbWFydF9jYXJkLmh3LAorCQlbQ0xLSURfUk5HMF0JCSAgICA9ICZtZXNvbjhiX3JuZzAuaHcsCisJCVtDTEtJRF9VQVJUMF0JCSAgICA9ICZtZXNvbjhiX3VhcnQwLmh3LAorCQlbQ0xLSURfU0RIQ10JCSAgICA9ICZtZXNvbjhiX3NkaGMuaHcsCisJCVtDTEtJRF9TVFJFQU1dCQkgICAgPSAmbWVzb244Yl9zdHJlYW0uaHcsCisJCVtDTEtJRF9BU1lOQ19GSUZPXQkgICAgPSAmbWVzb244Yl9hc3luY19maWZvLmh3LAorCQlbQ0xLSURfU0RJT10JCSAgICA9ICZtZXNvbjhiX3NkaW8uaHcsCisJCVtDTEtJRF9BQlVGXQkJICAgID0gJm1lc29uOGJfYWJ1Zi5odywKKwkJW0NMS0lEX0hJVV9JRkFDRV0JICAgID0gJm1lc29uOGJfaGl1X2lmYWNlLmh3LAorCQlbQ0xLSURfQVNTSVNUX01JU0NdCSAgICA9ICZtZXNvbjhiX2Fzc2lzdF9taXNjLmh3LAorCQlbQ0xLSURfU1BJXQkJICAgID0gJm1lc29uOGJfc3BpLmh3LAorCQlbQ0xLSURfSTJTX1NQRElGXQkgICAgPSAmbWVzb244Yl9pMnNfc3BkaWYuaHcsCisJCVtDTEtJRF9FVEhdCQkgICAgPSAmbWVzb244Yl9ldGguaHcsCisJCVtDTEtJRF9ERU1VWF0JCSAgICA9ICZtZXNvbjhiX2RlbXV4Lmh3LAorCQlbQ0xLSURfQUlVX0dMVUVdCSAgICA9ICZtZXNvbjhiX2FpdV9nbHVlLmh3LAorCQlbQ0xLSURfSUVDOTU4XQkJICAgID0gJm1lc29uOGJfaWVjOTU4Lmh3LAorCQlbQ0xLSURfSTJTX09VVF0JCSAgICA9ICZtZXNvbjhiX2kyc19vdXQuaHcsCisJCVtDTEtJRF9BTUNMS10JCSAgICA9ICZtZXNvbjhiX2FtY2xrLmh3LAorCQlbQ0xLSURfQUlGSUZPMl0JCSAgICA9ICZtZXNvbjhiX2FpZmlmbzIuaHcsCisJCVtDTEtJRF9NSVhFUl0JCSAgICA9ICZtZXNvbjhiX21peGVyLmh3LAorCQlbQ0xLSURfTUlYRVJfSUZBQ0VdCSAgICA9ICZtZXNvbjhiX21peGVyX2lmYWNlLmh3LAorCQlbQ0xLSURfQURDXQkJICAgID0gJm1lc29uOGJfYWRjLmh3LAorCQlbQ0xLSURfQkxLTVZdCQkgICAgPSAmbWVzb244Yl9ibGttdi5odywKKwkJW0NMS0lEX0FJVV0JCSAgICA9ICZtZXNvbjhiX2FpdS5odywKKwkJW0NMS0lEX1VBUlQxXQkJICAgID0gJm1lc29uOGJfdWFydDEuaHcsCisJCVtDTEtJRF9HMkRdCQkgICAgPSAmbWVzb244Yl9nMmQuaHcsCisJCVtDTEtJRF9VU0IwXQkJICAgID0gJm1lc29uOGJfdXNiMC5odywKKwkJW0NMS0lEX1VTQjFdCQkgICAgPSAmbWVzb244Yl91c2IxLmh3LAorCQlbQ0xLSURfUkVTRVRdCQkgICAgPSAmbWVzb244Yl9yZXNldC5odywKKwkJW0NMS0lEX05BTkRdCQkgICAgPSAmbWVzb244Yl9uYW5kLmh3LAorCQlbQ0xLSURfRE9TX1BBUlNFUl0JICAgID0gJm1lc29uOGJfZG9zX3BhcnNlci5odywKKwkJW0NMS0lEX1VTQl0JCSAgICA9ICZtZXNvbjhiX3VzYi5odywKKwkJW0NMS0lEX1ZESU4xXQkJICAgID0gJm1lc29uOGJfdmRpbjEuaHcsCisJCVtDTEtJRF9BSEJfQVJCMF0JICAgID0gJm1lc29uOGJfYWhiX2FyYjAuaHcsCisJCVtDTEtJRF9FRlVTRV0JCSAgICA9ICZtZXNvbjhiX2VmdXNlLmh3LAorCQlbQ0xLSURfQk9PVF9ST01dCSAgICA9ICZtZXNvbjhiX2Jvb3Rfcm9tLmh3LAorCQlbQ0xLSURfQUhCX0RBVEFfQlVTXQkgICAgPSAmbWVzb244Yl9haGJfZGF0YV9idXMuaHcsCisJCVtDTEtJRF9BSEJfQ1RSTF9CVVNdCSAgICA9ICZtZXNvbjhiX2FoYl9jdHJsX2J1cy5odywKKwkJW0NMS0lEX0hETUlfSU5UUl9TWU5DXQkgICAgPSAmbWVzb244Yl9oZG1pX2ludHJfc3luYy5odywKKwkJW0NMS0lEX0hETUlfUENMS10JICAgID0gJm1lc29uOGJfaGRtaV9wY2xrLmh3LAorCQlbQ0xLSURfVVNCMV9ERFJfQlJJREdFXQkgICAgPSAmbWVzb244Yl91c2IxX2Rkcl9icmlkZ2UuaHcsCisJCVtDTEtJRF9VU0IwX0REUl9CUklER0VdCSAgICA9ICZtZXNvbjhiX3VzYjBfZGRyX2JyaWRnZS5odywKKwkJW0NMS0lEX01NQ19QQ0xLXQkgICAgPSAmbWVzb244Yl9tbWNfcGNsay5odywKKwkJW0NMS0lEX0RWSU5dCQkgICAgPSAmbWVzb244Yl9kdmluLmh3LAorCQlbQ0xLSURfVUFSVDJdCQkgICAgPSAmbWVzb244Yl91YXJ0Mi5odywKKwkJW0NMS0lEX1NBTkFdCQkgICAgPSAmbWVzb244Yl9zYW5hLmh3LAorCQlbQ0xLSURfVlBVX0lOVFJdCSAgICA9ICZtZXNvbjhiX3ZwdV9pbnRyLmh3LAorCQlbQ0xLSURfU0VDX0FIQl9BSEIzX0JSSURHRV0gPSAmbWVzb244Yl9zZWNfYWhiX2FoYjNfYnJpZGdlLmh3LAorCQlbQ0xLSURfQ0xLODFfQTldCSAgICA9ICZtZXNvbjhiX2NsazgxX2E5Lmh3LAorCQlbQ0xLSURfVkNMSzJfVkVOQ0kwXQkgICAgPSAmbWVzb244Yl92Y2xrMl92ZW5jaTAuaHcsCisJCVtDTEtJRF9WQ0xLMl9WRU5DSTFdCSAgICA9ICZtZXNvbjhiX3ZjbGsyX3ZlbmNpMS5odywKKwkJW0NMS0lEX1ZDTEsyX1ZFTkNQMF0JICAgID0gJm1lc29uOGJfdmNsazJfdmVuY3AwLmh3LAorCQlbQ0xLSURfVkNMSzJfVkVOQ1AxXQkgICAgPSAmbWVzb244Yl92Y2xrMl92ZW5jcDEuaHcsCisJCVtDTEtJRF9HQ0xLX1ZFTkNJX0lOVF0JICAgID0gJm1lc29uOGJfZ2Nsa192ZW5jaV9pbnQuaHcsCisJCVtDTEtJRF9HQ0xLX1ZFTkNQX0lOVF0JICAgID0gJm1lc29uOGJfZ2Nsa192ZW5jcF9pbnQuaHcsCisJCVtDTEtJRF9EQUNfQ0xLXQkJICAgID0gJm1lc29uOGJfZGFjX2Nsay5odywKKwkJW0NMS0lEX0FPQ0xLX0dBVEVdCSAgICA9ICZtZXNvbjhiX2FvY2xrX2dhdGUuaHcsCisJCVtDTEtJRF9JRUM5NThfR0FURV0JICAgID0gJm1lc29uOGJfaWVjOTU4X2dhdGUuaHcsCisJCVtDTEtJRF9FTkM0ODBQXQkJICAgID0gJm1lc29uOGJfZW5jNDgwcC5odywKKwkJW0NMS0lEX1JORzFdCQkgICAgPSAmbWVzb244Yl9ybmcxLmh3LAorCQlbQ0xLSURfR0NMS19WRU5DTF9JTlRdCSAgICA9ICZtZXNvbjhiX2djbGtfdmVuY2xfaW50Lmh3LAorCQlbQ0xLSURfVkNMSzJfVkVOQ0xNQ0NdCSAgICA9ICZtZXNvbjhiX3ZjbGsyX3ZlbmNsbWNjLmh3LAorCQlbQ0xLSURfVkNMSzJfVkVOQ0xdCSAgICA9ICZtZXNvbjhiX3ZjbGsyX3ZlbmNsLmh3LAorCQlbQ0xLSURfVkNMSzJfT1RIRVJdCSAgICA9ICZtZXNvbjhiX3ZjbGsyX290aGVyLmh3LAorCQlbQ0xLSURfRURQXQkJICAgID0gJm1lc29uOGJfZWRwLmh3LAorCQlbQ0xLSURfQU9fTUVESUFfQ1BVXQkgICAgPSAmbWVzb244Yl9hb19tZWRpYV9jcHUuaHcsCisJCVtDTEtJRF9BT19BSEJfU1JBTV0JICAgID0gJm1lc29uOGJfYW9fYWhiX3NyYW0uaHcsCisJCVtDTEtJRF9BT19BSEJfQlVTXQkgICAgPSAmbWVzb244Yl9hb19haGJfYnVzLmh3LAorCQlbQ0xLSURfQU9fSUZBQ0VdCSAgICA9ICZtZXNvbjhiX2FvX2lmYWNlLmh3LAorCX0sCisJLm51bSA9IENMS19OUl9DTEtTLAorfTsKKworc3RhdGljIHN0cnVjdCBtZXNvbl9jbGtfcGxsICpjb25zdCBtZXNvbjhiX2Nsa19wbGxzW10gPSB7CisJJm1lc29uOGJfZml4ZWRfcGxsLAorCSZtZXNvbjhiX3ZpZF9wbGwsCisJJm1lc29uOGJfc3lzX3BsbCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2dhdGUgKm1lc29uOGJfY2xrX2dhdGVzW10gPSB7CisJJm1lc29uOGJfY2xrODEsCisJJm1lc29uOGJfZGRyLAorCSZtZXNvbjhiX2RvcywKKwkmbWVzb244Yl9pc2EsCisJJm1lc29uOGJfcGwzMDEsCisJJm1lc29uOGJfcGVyaXBocywKKwkmbWVzb244Yl9zcGljYywKKwkmbWVzb244Yl9pMmMsCisJJm1lc29uOGJfc2FyX2FkYywKKwkmbWVzb244Yl9zbWFydF9jYXJkLAorCSZtZXNvbjhiX3JuZzAsCisJJm1lc29uOGJfdWFydDAsCisJJm1lc29uOGJfc2RoYywKKwkmbWVzb244Yl9zdHJlYW0sCisJJm1lc29uOGJfYXN5bmNfZmlmbywKKwkmbWVzb244Yl9zZGlvLAorCSZtZXNvbjhiX2FidWYsCisJJm1lc29uOGJfaGl1X2lmYWNlLAorCSZtZXNvbjhiX2Fzc2lzdF9taXNjLAorCSZtZXNvbjhiX3NwaSwKKwkmbWVzb244Yl9pMnNfc3BkaWYsCisJJm1lc29uOGJfZXRoLAorCSZtZXNvbjhiX2RlbXV4LAorCSZtZXNvbjhiX2FpdV9nbHVlLAorCSZtZXNvbjhiX2llYzk1OCwKKwkmbWVzb244Yl9pMnNfb3V0LAorCSZtZXNvbjhiX2FtY2xrLAorCSZtZXNvbjhiX2FpZmlmbzIsCisJJm1lc29uOGJfbWl4ZXIsCisJJm1lc29uOGJfbWl4ZXJfaWZhY2UsCisJJm1lc29uOGJfYWRjLAorCSZtZXNvbjhiX2Jsa212LAorCSZtZXNvbjhiX2FpdSwKKwkmbWVzb244Yl91YXJ0MSwKKwkmbWVzb244Yl9nMmQsCisJJm1lc29uOGJfdXNiMCwKKwkmbWVzb244Yl91c2IxLAorCSZtZXNvbjhiX3Jlc2V0LAorCSZtZXNvbjhiX25hbmQsCisJJm1lc29uOGJfZG9zX3BhcnNlciwKKwkmbWVzb244Yl91c2IsCisJJm1lc29uOGJfdmRpbjEsCisJJm1lc29uOGJfYWhiX2FyYjAsCisJJm1lc29uOGJfZWZ1c2UsCisJJm1lc29uOGJfYm9vdF9yb20sCisJJm1lc29uOGJfYWhiX2RhdGFfYnVzLAorCSZtZXNvbjhiX2FoYl9jdHJsX2J1cywKKwkmbWVzb244Yl9oZG1pX2ludHJfc3luYywKKwkmbWVzb244Yl9oZG1pX3BjbGssCisJJm1lc29uOGJfdXNiMV9kZHJfYnJpZGdlLAorCSZtZXNvbjhiX3VzYjBfZGRyX2JyaWRnZSwKKwkmbWVzb244Yl9tbWNfcGNsaywKKwkmbWVzb244Yl9kdmluLAorCSZtZXNvbjhiX3VhcnQyLAorCSZtZXNvbjhiX3NhbmEsCisJJm1lc29uOGJfdnB1X2ludHIsCisJJm1lc29uOGJfc2VjX2FoYl9haGIzX2JyaWRnZSwKKwkmbWVzb244Yl9jbGs4MV9hOSwKKwkmbWVzb244Yl92Y2xrMl92ZW5jaTAsCisJJm1lc29uOGJfdmNsazJfdmVuY2kxLAorCSZtZXNvbjhiX3ZjbGsyX3ZlbmNwMCwKKwkmbWVzb244Yl92Y2xrMl92ZW5jcDEsCisJJm1lc29uOGJfZ2Nsa192ZW5jaV9pbnQsCisJJm1lc29uOGJfZ2Nsa192ZW5jcF9pbnQsCisJJm1lc29uOGJfZGFjX2NsaywKKwkmbWVzb244Yl9hb2Nsa19nYXRlLAorCSZtZXNvbjhiX2llYzk1OF9nYXRlLAorCSZtZXNvbjhiX2VuYzQ4MHAsCisJJm1lc29uOGJfcm5nMSwKKwkmbWVzb244Yl9nY2xrX3ZlbmNsX2ludCwKKwkmbWVzb244Yl92Y2xrMl92ZW5jbG1jYywKKwkmbWVzb244Yl92Y2xrMl92ZW5jbCwKKwkmbWVzb244Yl92Y2xrMl9vdGhlciwKKwkmbWVzb244Yl9lZHAsCisJJm1lc29uOGJfYW9fbWVkaWFfY3B1LAorCSZtZXNvbjhiX2FvX2FoYl9zcmFtLAorCSZtZXNvbjhiX2FvX2FoYl9idXMsCisJJm1lc29uOGJfYW9faWZhY2UsCit9OworCitzdGF0aWMgaW50IG1lc29uOGJfY2xrY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXZvaWQgX19pb21lbSAqY2xrX2Jhc2U7CisJaW50IHJldCwgY2xraWQsIGk7CisJc3RydWN0IGNsa19odyAqcGFyZW50X2h3OworCXN0cnVjdCBjbGsgKnBhcmVudF9jbGs7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKworCS8qICBHZW5lcmljIGNsb2NrcyBhbmQgUExMcyAqLworCWNsa19iYXNlID0gb2ZfaW9tYXAoZGV2LT5vZl9ub2RlLCAxKTsKKwlpZiAoIWNsa19iYXNlKSB7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBtYXAgY2xrIGJhc2VcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwkvKiBQb3B1bGF0ZSBiYXNlIGFkZHJlc3MgZm9yIFBMTHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtZXNvbjhiX2Nsa19wbGxzKTsgaSsrKQorCQltZXNvbjhiX2Nsa19wbGxzW2ldLT5iYXNlID0gY2xrX2Jhc2U7CisKKwkvKiBQb3B1bGF0ZSB0aGUgYmFzZSBhZGRyZXNzIGZvciBDUFUgY2xrICovCisJbWVzb244Yl9jcHVfY2xrLmJhc2UgPSBjbGtfYmFzZTsKKworCS8qIFBvcHVsYXRlIHRoZSBiYXNlIGFkZHJlc3MgZm9yIHRoZSBNUEVHIGNsa3MgKi8KKwltZXNvbjhiX21wZWdfY2xrX3NlbC5yZWcgPSBjbGtfYmFzZSArICh1MzIpbWVzb244Yl9tcGVnX2Nsa19zZWwucmVnOworCW1lc29uOGJfbXBlZ19jbGtfZGl2LnJlZyA9IGNsa19iYXNlICsgKHUzMiltZXNvbjhiX21wZWdfY2xrX2Rpdi5yZWc7CisJbWVzb244Yl9jbGs4MS5yZWcgPSBjbGtfYmFzZSArICh1MzIpbWVzb244Yl9jbGs4MS5yZWc7CisKKwkvKiBQb3B1bGF0ZSBiYXNlIGFkZHJlc3MgZm9yIGdhdGVzICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWVzb244Yl9jbGtfZ2F0ZXMpOyBpKyspCisJCW1lc29uOGJfY2xrX2dhdGVzW2ldLT5yZWcgPSBjbGtfYmFzZSArCisJCQkodTMyKW1lc29uOGJfY2xrX2dhdGVzW2ldLT5yZWc7CisKKwkvKgorCSAqIHJlZ2lzdGVyIGFsbCBjbGtzCisJICogQ0xLSURfVU5VU0VEID0gMCwgc28gc2tpcCBpdCBhbmQgc3RhcnQgd2l0aCBDTEtJRF9YVEFMID0gMQorCSAqLworCWZvciAoY2xraWQgPSBDTEtJRF9YVEFMOyBjbGtpZCA8IENMS19OUl9DTEtTOyBjbGtpZCsrKSB7CisJCS8qIGFycmF5IG1pZ2h0IGJlIHNwYXJzZSAqLworCQlpZiAoIW1lc29uOGJfaHdfb25lY2VsbF9kYXRhLmh3c1tjbGtpZF0pCisJCQljb250aW51ZTsKKworCQkvKiBGSVhNRSBjb252ZXJ0IHRvIGRldm1fY2xrX3JlZ2lzdGVyICovCisJCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKGRldiwgbWVzb244Yl9od19vbmVjZWxsX2RhdGEuaHdzW2Nsa2lkXSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGlvdW5tYXA7CisJfQorCisJLyoKKwkgKiBSZWdpc3RlciBDUFUgY2xrIG5vdGlmaWVyCisJICoKKwkgKiBGSVhNRSB0aGlzIGlzIHdyb25nIGZvciBhIGxvdCBvZiByZWFzb25zLiBGaXJzdCwgdGhlIG11eGVzIHNob3VsZCBiZQorCSAqIHN0cnVjdCBjbGtfaHcgb2JqZWN0cy4gU2Vjb25kLCB3ZSBzaG91bGRuJ3QgcHJvZ3JhbSB0aGUgbXV4ZXMgaW4KKwkgKiBub3RpZmllciBoYW5kbGVycy4gVGhlIHRyaWNreSBwcm9ncmFtbWluZyBzZXF1ZW5jZSB3aWxsIGJlIGhhbmRsZWQKKwkgKiBieSB0aGUgZm9ydGhjb21pbmcgY29vcmRpbmF0ZWQgY2xvY2sgcmF0ZXMgbWVjaGFuaXNtIG9uY2UgdGhhdAorCSAqIGZlYXR1cmUgaXMgcmVsZWFzZWQuCisJICoKKwkgKiBGdXJ0aGVybW9yZSwgbG9va2luZyB1cCB0aGUgcGFyZW50IHRoaXMgd2F5IGlzIHRlcnJpYmxlLiBBdCBzb21lCisJICogcG9pbnQgd2Ugd2lsbCBzdG9wIGFsbG9jYXRpbmcgYSBkZWZhdWx0IHN0cnVjdCBjbGsgd2hlbiByZWdpc3RlcmluZworCSAqIGEgbmV3IGNsa19odywgYW5kIHRoaXMgaGFjayB3aWxsIG5vIGxvbmdlciB3b3JrLiBSZWxlYXNpbmcgdGhlIGNjcgorCSAqIGZlYXR1cmUgYmVmb3JlIHRoYXQgdGltZSBzb2x2ZXMgdGhlIHByb2JsZW0gOi0pCisJICovCisJcGFyZW50X2h3ID0gY2xrX2h3X2dldF9wYXJlbnQoJm1lc29uOGJfY3B1X2Nsay5odyk7CisJcGFyZW50X2NsayA9IHBhcmVudF9ody0+Y2xrOworCXJldCA9IGNsa19ub3RpZmllcl9yZWdpc3RlcihwYXJlbnRfY2xrLCAmbWVzb244Yl9jcHVfY2xrLmNsa19uYik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgY2xvY2sgbm90aWZpZXIgZm9yIGNwdV9jbGtcbiIsCisJCQkJX19mdW5jX18pOworCQlnb3RvIGlvdW5tYXA7CisJfQorCisJcmV0dXJuIG9mX2Nsa19hZGRfaHdfcHJvdmlkZXIoZGV2LT5vZl9ub2RlLCBvZl9jbGtfaHdfb25lY2VsbF9nZXQsCisJCQkmbWVzb244Yl9od19vbmVjZWxsX2RhdGEpOworCitpb3VubWFwOgorCWlvdW5tYXAoY2xrX2Jhc2UpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1lc29uOGJfY2xrY19tYXRjaF90YWJsZVtdID0geworCXsgLmNvbXBhdGlibGUgPSAiYW1sb2dpYyxtZXNvbjhiLWNsa2MiIH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtZXNvbjhiX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gbWVzb244Yl9jbGtjX3Byb2JlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJtZXNvbjhiLWNsa2MiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBtZXNvbjhiX2Nsa2NfbWF0Y2hfdGFibGUsCisJfSwKK307CisKK2J1aWx0aW5fcGxhdGZvcm1fZHJpdmVyKG1lc29uOGJfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL21lc29uL21lc29uOGIuaCBiL2RyaXZlcnMvY2xrL21lc29uL21lc29uOGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTBlOTU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbGsvbWVzb24vbWVzb244Yi5oCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1IEVuZGxlc3MgTW9iaWxlLCBJbmMuCisgKiBBdXRob3I6IENhcmxvIENhaW9uZSA8Y2FybG9AZW5kbGVzc20uY29tPgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBCYXlMaWJyZSwgSW5jLgorICogTWljaGFlbCBUdXJxdWV0dGUgPG10dXJxdWV0dGVAYmF5bGlicmUuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfX01FU09OOEJfSAorI2RlZmluZSBfX01FU09OOEJfSAorCisvKgorICogQ2xvY2sgY29udHJvbGxlciByZWdpc3RlciBvZmZzZXRzCisgKgorICogUmVnaXN0ZXIgb2Zmc2V0cyBmcm9tIHRoZSBIYXJkS2VybmVsWzBdIGRhdGEgc2hlZXQgYXJlIGxpc3RlZCBpbiBjb21tZW50CisgKiBibG9ja3MgYmVsb3cuIFRob3NlIG9mZnNldHMgbXVzdCBiZSBtdWx0aXBsaWVkIGJ5IDQgYmVmb3JlIGFkZGluZyB0aGVtIHRvCisgKiB0aGUgYmFzZSBhZGRyZXNzIHRvIGdldCB0aGUgcmlnaHQgdmFsdWUKKyAqCisgKiBbMF0gaHR0cDovL2RuLm9kcm9pZC5jb20vUzgwNS9EYXRhc2hlZXQvUzgwNV9EYXRhc2hlZXQlMjBWMC44JTIwMjAxNTAxMjYucGRmCisgKi8KKyNkZWZpbmUgSEhJX0dDTEtfTVBFRzAJCQkweDE0MCAvKiAweDUwIG9mZnNldCBpbiBkYXRhIHNoZWV0ICovCisjZGVmaW5lIEhISV9HQ0xLX01QRUcxCQkJMHgxNDQgLyogMHg1MSBvZmZzZXQgaW4gZGF0YSBzaGVldCAqLworI2RlZmluZSBISElfR0NMS19NUEVHMgkJCTB4MTQ4IC8qIDB4NTIgb2Zmc2V0IGluIGRhdGEgc2hlZXQgKi8KKyNkZWZpbmUgSEhJX0dDTEtfT1RIRVIJCQkweDE1MCAvKiAweDU0IG9mZnNldCBpbiBkYXRhIHNoZWV0ICovCisjZGVmaW5lIEhISV9HQ0xLX0FPCQkJMHgxNTQgLyogMHg1NSBvZmZzZXQgaW4gZGF0YSBzaGVldCAqLworI2RlZmluZSBISElfU1lTX0NQVV9DTEtfQ05UTDEJCTB4MTVjIC8qIDB4NTcgb2Zmc2V0IGluIGRhdGEgc2hlZXQgKi8KKyNkZWZpbmUgSEhJX01QRUdfQ0xLX0NOVEwJCTB4MTc0IC8qIDB4NWQgb2Zmc2V0IGluIGRhdGEgc2hlZXQgKi8KKyNkZWZpbmUgSEhJX01QTExfQ05UTAkJCTB4MjgwIC8qIDB4YTAgb2Zmc2V0IGluIGRhdGEgc2hlZXQgKi8KKyNkZWZpbmUgSEhJX1NZU19QTExfQ05UTAkJMHgzMDAgLyogMHhjMCBvZmZzZXQgaW4gZGF0YSBzaGVldCAqLworI2RlZmluZSBISElfVklEX1BMTF9DTlRMCQkweDMyMCAvKiAweGM4IG9mZnNldCBpbiBkYXRhIHNoZWV0ICovCisKKy8qCisgKiBDTEtJRCBpbmRleCB2YWx1ZXMKKyAqCisgKiBUaGVzZSBpbmRpY2VzIGFyZSBlbnRpcmVseSBjb250cml2ZWQgYW5kIGRvIG5vdCBtYXAgb250byB0aGUgaGFyZHdhcmUuCisgKiBNaWdyYXRlIHRoZW0gb3V0IG9mIHRoaXMgaGVhZGVyIGFuZCBpbnRvIHRoZSBEVCBoZWFkZXIgZmlsZSB3aGVuIHRoZXkgbmVlZAorICogdG8gYmUgZXhwb3NlZCB0byBjbGllbnQgbm9kZXMgaW4gRFQ6IGluY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svbWVzb244Yi1jbGtjLmgKKyAqLworCisvKiBDTEtJRF9VTlVTRUQgKi8KKy8qIENMS0lEX1hUQUwgKi8KKy8qIENMS0lEX1BMTF9GSVhFRCAqLworLyogQ0xLSURfUExMX1ZJRCAqLworLyogQ0xLSURfUExMX1NZUyAqLworLyogQ0xLSURfRkNMS19ESVYyICovCisvKiBDTEtJRF9GQ0xLX0RJVjMgKi8KKy8qIENMS0lEX0ZDTEtfRElWNCAqLworLyogQ0xLSURfRkNMS19ESVY1ICovCisvKiBDTEtJRF9GQ0xLX0RJVjcgKi8KKy8qIENMS0lEX0NMSzgxICovCisvKiBDTEtJRF9NQUxJICovCisvKiBDTEtJRF9DUFVDTEsgKi8KKy8qIENMS0lEX1pFUk8gKi8KKy8qIENMS0lEX01QRUdfU0VMICovCisvKiBDTEtJRF9NUEVHX0RJViAqLworI2RlZmluZSBDTEtJRF9ERFIJCTE2CisjZGVmaW5lIENMS0lEX0RPUwkJMTcKKyNkZWZpbmUgQ0xLSURfSVNBCQkxOAorI2RlZmluZSBDTEtJRF9QTDMwMQkJMTkKKyNkZWZpbmUgQ0xLSURfUEVSSVBIUwkJMjAKKyNkZWZpbmUgQ0xLSURfU1BJQ0MJCTIxCisjZGVmaW5lIENMS0lEX0kyQwkJMjIKKyNkZWZpbmUgQ0xLSURfU0FSX0FEQwkJMjMKKyNkZWZpbmUgQ0xLSURfU01BUlRfQ0FSRAkyNAorI2RlZmluZSBDTEtJRF9STkcwCQkyNQorI2RlZmluZSBDTEtJRF9VQVJUMAkJMjYKKyNkZWZpbmUgQ0xLSURfU0RIQwkJMjcKKyNkZWZpbmUgQ0xLSURfU1RSRUFNCQkyOAorI2RlZmluZSBDTEtJRF9BU1lOQ19GSUZPCTI5CisjZGVmaW5lIENMS0lEX1NESU8JCTMwCisjZGVmaW5lIENMS0lEX0FCVUYJCTMxCisjZGVmaW5lIENMS0lEX0hJVV9JRkFDRQkJMzIKKyNkZWZpbmUgQ0xLSURfQVNTSVNUX01JU0MJMzMKKyNkZWZpbmUgQ0xLSURfU1BJCQkzNAorI2RlZmluZSBDTEtJRF9JMlNfU1BESUYJCTM1CisjZGVmaW5lIENMS0lEX0VUSAkJMzYKKyNkZWZpbmUgQ0xLSURfREVNVVgJCTM3CisjZGVmaW5lIENMS0lEX0FJVV9HTFVFCQkzOAorI2RlZmluZSBDTEtJRF9JRUM5NTgJCTM5CisjZGVmaW5lIENMS0lEX0kyU19PVVQJCTQwCisjZGVmaW5lIENMS0lEX0FNQ0xLCQk0MQorI2RlZmluZSBDTEtJRF9BSUZJRk8yCQk0MgorI2RlZmluZSBDTEtJRF9NSVhFUgkJNDMKKyNkZWZpbmUgQ0xLSURfTUlYRVJfSUZBQ0UJNDQKKyNkZWZpbmUgQ0xLSURfQURDCQk0NQorI2RlZmluZSBDTEtJRF9CTEtNVgkJNDYKKyNkZWZpbmUgQ0xLSURfQUlVCQk0NworI2RlZmluZSBDTEtJRF9VQVJUMQkJNDgKKyNkZWZpbmUgQ0xLSURfRzJECQk0OQorI2RlZmluZSBDTEtJRF9VU0IwCQk1MAorI2RlZmluZSBDTEtJRF9VU0IxCQk1MQorI2RlZmluZSBDTEtJRF9SRVNFVAkJNTIKKyNkZWZpbmUgQ0xLSURfTkFORAkJNTMKKyNkZWZpbmUgQ0xLSURfRE9TX1BBUlNFUgk1NAorI2RlZmluZSBDTEtJRF9VU0IJCTU1CisjZGVmaW5lIENMS0lEX1ZESU4xCQk1NgorI2RlZmluZSBDTEtJRF9BSEJfQVJCMAkJNTcKKyNkZWZpbmUgQ0xLSURfRUZVU0UJCTU4CisjZGVmaW5lIENMS0lEX0JPT1RfUk9NCQk1OQorI2RlZmluZSBDTEtJRF9BSEJfREFUQV9CVVMJNjAKKyNkZWZpbmUgQ0xLSURfQUhCX0NUUkxfQlVTCTYxCisjZGVmaW5lIENMS0lEX0hETUlfSU5UUl9TWU5DCTYyCisjZGVmaW5lIENMS0lEX0hETUlfUENMSwkJNjMKKyNkZWZpbmUgQ0xLSURfVVNCMV9ERFJfQlJJREdFCTY0CisjZGVmaW5lIENMS0lEX1VTQjBfRERSX0JSSURHRQk2NQorI2RlZmluZSBDTEtJRF9NTUNfUENMSwkJNjYKKyNkZWZpbmUgQ0xLSURfRFZJTgkJNjcKKyNkZWZpbmUgQ0xLSURfVUFSVDIJCTY4CisjZGVmaW5lIENMS0lEX1NBTkEJCTY5CisjZGVmaW5lIENMS0lEX1ZQVV9JTlRSCQk3MAorI2RlZmluZSBDTEtJRF9TRUNfQUhCX0FIQjNfQlJJREdFCTcxCisjZGVmaW5lIENMS0lEX0NMSzgxX0E5CQk3MgorI2RlZmluZSBDTEtJRF9WQ0xLMl9WRU5DSTAJNzMKKyNkZWZpbmUgQ0xLSURfVkNMSzJfVkVOQ0kxCTc0CisjZGVmaW5lIENMS0lEX1ZDTEsyX1ZFTkNQMAk3NQorI2RlZmluZSBDTEtJRF9WQ0xLMl9WRU5DUDEJNzYKKyNkZWZpbmUgQ0xLSURfR0NMS19WRU5DSV9JTlQJNzcKKyNkZWZpbmUgQ0xLSURfR0NMS19WRU5DUF9JTlQJNzgKKyNkZWZpbmUgQ0xLSURfREFDX0NMSwkJNzkKKyNkZWZpbmUgQ0xLSURfQU9DTEtfR0FURQk4MAorI2RlZmluZSBDTEtJRF9JRUM5NThfR0FURQk4MQorI2RlZmluZSBDTEtJRF9FTkM0ODBQCQk4MgorI2RlZmluZSBDTEtJRF9STkcxCQk4MworI2RlZmluZSBDTEtJRF9HQ0xLX1ZFTkNMX0lOVAk4NAorI2RlZmluZSBDTEtJRF9WQ0xLMl9WRU5DTE1DQwk4NQorI2RlZmluZSBDTEtJRF9WQ0xLMl9WRU5DTAk4NgorI2RlZmluZSBDTEtJRF9WQ0xLMl9PVEhFUgk4NworI2RlZmluZSBDTEtJRF9FRFAJCTg4CisjZGVmaW5lIENMS0lEX0FPX01FRElBX0NQVQk4OQorI2RlZmluZSBDTEtJRF9BT19BSEJfU1JBTQk5MAorI2RlZmluZSBDTEtJRF9BT19BSEJfQlVTCTkxCisjZGVmaW5lIENMS0lEX0FPX0lGQUNFCQk5MgorCisjZGVmaW5lIENMS19OUl9DTEtTCQk5MworCisvKiBpbmNsdWRlIHRoZSBDTEtJRHMgdGhhdCBoYXZlIGJlZW4gbWFkZSBwYXJ0IG9mIHRoZSBzdGFibGUgRFQgYmluZGluZyAqLworI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL21lc29uOGItY2xrYy5oPgorCisjZW5kaWYgLyogX19NRVNPTjhCX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL21pY3JvY2hpcC9jbGstY29yZS5jIGIvZHJpdmVycy9jbGsvbWljcm9jaGlwL2Nsay1jb3JlLmMKaW5kZXggY2E4NWNlYS4uYzNiMzAxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvbWljcm9jaGlwL2Nsay1jb3JlLmMKKysrIGIvZHJpdmVycy9jbGsvbWljcm9jaGlwL2Nsay1jb3JlLmMKQEAgLTE5OSw5ICsxOTksOSBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGItPmNvcmUtPnJlZ19sb2NrLCBmbGFncyk7CiAKLQkvKiB3YWl0IGFnYWluLCBmb3IgcGJkaXZyZWFkeSAqLwotCWVyciA9IHJlYWRsX3BvbGxfdGltZW91dF9hdG9taWMocGItPmN0cmxfcmVnLCB2LCB2ICYgUEJfRElWX1JFQURZLAotCQkJCQkxLCBMT0NLX1RJTUVPVVRfVVMpOworCS8qIHdhaXQgYWdhaW4gZm9yIERJVl9SRUFEWSAqLworCWVyciA9IHJlYWRsX3BvbGxfdGltZW91dChwYi0+Y3RybF9yZWcsIHYsIHYgJiBQQl9ESVZfUkVBRFksCisJCQkJIDEsIExPQ0tfVElNRU9VVF9VUyk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbWljcm9jaGlwL2Nsay1waWMzMm16ZGEuYyBiL2RyaXZlcnMvY2xrL21pY3JvY2hpcC9jbGstcGljMzJtemRhLmMKaW5kZXggNTFmNTQzOC4uOWY3MzQ3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvbWljcm9jaGlwL2Nsay1waWMzMm16ZGEuYworKysgYi9kcml2ZXJzL2Nsay9taWNyb2NoaXAvY2xrLXBpYzMybXpkYS5jCkBAIC0xMTgsNiArMTE4LDcgQEAKIAkuc3RhdHVzX3JlZyA9IDB4MWQwLAogCS5lbmFibGVfbWFzayA9IEJJVCgxKSwKIAkuc3RhdHVzX21hc2sgPSBCSVQoNCksCisJLmZpeGVkX3JhdGUgPSAzMjc2OCwKIAkuaW5pdF9kYXRhID0gewogCQkubmFtZSA9ICJzb3NjX2NsayIsCiAJCS5wYXJlbnRfbmFtZXMgPSBOVUxMLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbW1wL2Nsay1tbXAyLmMgYi9kcml2ZXJzL2Nsay9tbXAvY2xrLW1tcDIuYwppbmRleCAzODNmNmE0Li4wMzgwMjM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9tbXAvY2xrLW1tcDIuYworKysgYi9kcml2ZXJzL2Nsay9tbXAvY2xrLW1tcDIuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsvbW1wLmg+CiAKICNpbmNsdWRlICJjbGsuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbXZlYnUvS2NvbmZpZyBiL2RyaXZlcnMvY2xrL212ZWJ1L0tjb25maWcKaW5kZXggMzE2NWRhNy4uZmRkYzhhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvbXZlYnUvS2NvbmZpZworKysgYi9kcml2ZXJzL2Nsay9tdmVidS9LY29uZmlnCkBAIC0yNCw2ICsyNCw5IEBACiAJYm9vbAogCXNlbGVjdCBNVkVCVV9DTEtfQ09NTU9OCiAKK2NvbmZpZyBBUk1BREFfMzdYWF9DTEsKKyAgICAgICBib29sCisKIGNvbmZpZyBBUk1BREFfWFBfQ0xLCiAJYm9vbAogCXNlbGVjdCBNVkVCVV9DTEtfQ09NTU9OCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9tdmVidS9NYWtlZmlsZSBiL2RyaXZlcnMvY2xrL212ZWJ1L01ha2VmaWxlCmluZGV4IDcxNzJlZjYuLmQ5YWU5N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL212ZWJ1L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2xrL212ZWJ1L01ha2VmaWxlCkBAIC02LDYgKzYsOSBAQAogb2JqLSQoQ09ORklHX0FSTUFEQV8zNzVfQ0xLKQkrPSBhcm1hZGEtMzc1Lm8KIG9iai0kKENPTkZJR19BUk1BREFfMzhYX0NMSykJKz0gYXJtYWRhLTM4eC5vCiBvYmotJChDT05GSUdfQVJNQURBXzM5WF9DTEspCSs9IGFybWFkYS0zOXgubworb2JqLSQoQ09ORklHX0FSTUFEQV8zN1hYX0NMSykJKz0gYXJtYWRhLTM3eHgteHRhbC5vCitvYmotJChDT05GSUdfQVJNQURBXzM3WFhfQ0xLKQkrPSBhcm1hZGEtMzd4eC10Ymcubworb2JqLSQoQ09ORklHX0FSTUFEQV8zN1hYX0NMSykJKz0gYXJtYWRhLTM3eHgtcGVyaXBoLm8KIG9iai0kKENPTkZJR19BUk1BREFfWFBfQ0xLKQkrPSBhcm1hZGEteHAubwogb2JqLSQoQ09ORklHX0FSTUFEQV9BUDgwNl9TWVNDT04pICs9IGFwODA2LXN5c3RlbS1jb250cm9sbGVyLm8KIG9iai0kKENPTkZJR19BUk1BREFfQ1AxMTBfU1lTQ09OKSArPSBjcDExMC1zeXN0ZW0tY29udHJvbGxlci5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9tdmVidS9hcm1hZGEtMzd4eC1wZXJpcGguYyBiL2RyaXZlcnMvY2xrL212ZWJ1L2FybWFkYS0zN3h4LXBlcmlwaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OTA1ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsay9tdmVidS9hcm1hZGEtMzd4eC1wZXJpcGguYwpAQCAtMCwwICsxLDQ0NyBAQAorLyoKKyAqIE1hcnZlbGwgQXJtYWRhIDM3eHggU29DIFBlcmlwaGVyYWwgY2xvY2tzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IE1hcnZlbGwKKyAqCisgKiBHcmVnb3J5IENMRU1FTlQgPGdyZWdvcnkuY2xlbWVudEBmcmVlLWVsZWN0cm9ucy5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvciBsYXRlci4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIKKyAqIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqCisgKiBNb3N0IG9mIHRoZSBwZXJpcGhlcmFsIGNsb2NrcyBjYW4gYmUgbW9kZWxsZWQgbGlrZSB0aGlzOgorICogICAgICAgICAgICAgX19fX18gICAgX19fX19fXyAgICBfX19fX19fCisgKiBUQkctQS1QICAtLXwgICAgIHwgIHwgICAgICAgfCAgfCAgICAgICB8ICAgX19fX19fCisgKiBUQkctQi1QICAtLXwgTXV4IHwtLXwgL2RpdjEgfC0tfCAvZGl2MiB8LS18IEdhdGUgfC0tPiBwZXJpcF9jbGsKKyAqIFRCRy1BLVMgIC0tfCAgICAgfCAgfCAgICAgICB8ICB8ICAgICAgIHwgIHxfX19fX198CisgKiBUQkctQi1TICAtLXxfX19fX3wgIHxfX19fX19ffCAgfF9fX19fX198CisgKgorICogSG93ZXZlciBzb21lIGNsb2NrcyBtYXkgdXNlIG9ubHkgb25lIG9yIHR3byBibG9jayBvciBhbmQgdXNlIHRoZQorICogeHRhbCBjbG9jayBhcyBwYXJlbnQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjZGVmaW5lIFRCR19TRUwJCTB4MAorI2RlZmluZSBESVZfU0VMMAkweDQKKyNkZWZpbmUgRElWX1NFTDEJMHg4CisjZGVmaW5lIERJVl9TRUwyCTB4QworI2RlZmluZSBDTEtfU0VMCQkweDEwCisjZGVmaW5lIENMS19ESVMJCTB4MTQKKworc3RydWN0IGNsa19wZXJpcGhfZHJpdmVyX2RhdGEgeworCXN0cnVjdCBjbGtfaHdfb25lY2VsbF9kYXRhICpod19kYXRhOworCXNwaW5sb2NrX3QgbG9jazsKK307CisKK3N0cnVjdCBjbGtfZG91YmxlX2RpdiB7CisJc3RydWN0IGNsa19odyBodzsKKwl2b2lkIF9faW9tZW0gKnJlZzE7CisJdTggc2hpZnQxOworCXZvaWQgX19pb21lbSAqcmVnMjsKKwl1OCBzaGlmdDI7Cit9OworCisjZGVmaW5lIHRvX2Nsa19kb3VibGVfZGl2KF9odykgY29udGFpbmVyX29mKF9odywgc3RydWN0IGNsa19kb3VibGVfZGl2LCBodykKKworc3RydWN0IGNsa19wZXJpcGhfZGF0YSB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICogY29uc3QgKnBhcmVudF9uYW1lczsKKwlpbnQgbnVtX3BhcmVudHM7CisJc3RydWN0IGNsa19odyAqbXV4X2h3OworCXN0cnVjdCBjbGtfaHcgKnJhdGVfaHc7CisJc3RydWN0IGNsa19odyAqZ2F0ZV9odzsKKwlib29sIGlzX2RvdWJsZV9kaXY7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19kaXZfdGFibGUgY2xrX3RhYmxlNltdID0geworCXsgLnZhbCA9IDEsIC5kaXYgPSAxLCB9LAorCXsgLnZhbCA9IDIsIC5kaXYgPSAyLCB9LAorCXsgLnZhbCA9IDMsIC5kaXYgPSAzLCB9LAorCXsgLnZhbCA9IDQsIC5kaXYgPSA0LCB9LAorCXsgLnZhbCA9IDUsIC5kaXYgPSA1LCB9LAorCXsgLnZhbCA9IDYsIC5kaXYgPSA2LCB9LAorCXsgLnZhbCA9IDAsIC5kaXYgPSAwLCB9LCAvKiBsYXN0IGVudHJ5ICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19kaXZfdGFibGUgY2xrX3RhYmxlMVtdID0geworCXsgLnZhbCA9IDAsIC5kaXYgPSAxLCB9LAorCXsgLnZhbCA9IDEsIC5kaXYgPSAyLCB9LAorCXsgLnZhbCA9IDAsIC5kaXYgPSAwLCB9LCAvKiBsYXN0IGVudHJ5ICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19kaXZfdGFibGUgY2xrX3RhYmxlMltdID0geworCXsgLnZhbCA9IDAsIC5kaXYgPSAyLCB9LAorCXsgLnZhbCA9IDEsIC5kaXYgPSA0LCB9LAorCXsgLnZhbCA9IDAsIC5kaXYgPSAwLCB9LCAvKiBsYXN0IGVudHJ5ICovCit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIGNsa19kb3VibGVfZGl2X29wczsKKworI2RlZmluZSBQRVJJUEhfR0FURShfbmFtZSwgX2JpdCkJCVwKK3N0cnVjdCBjbGtfZ2F0ZSBnYXRlXyMjX25hbWUgPSB7CQlcCisJLnJlZyA9ICh2b2lkICopQ0xLX0RJUywJCQlcCisJLmJpdF9pZHggPSBfYml0LAkJCVwKKwkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpewlcCisJCS5vcHMgPSAgJmNsa19nYXRlX29wcywJCVwKKwl9CQkJCQlcCit9OworCisjZGVmaW5lIFBFUklQSF9NVVgoX25hbWUsIF9zaGlmdCkJCVwKK3N0cnVjdCBjbGtfbXV4IG11eF8jI19uYW1lID0gewkJCVwKKwkucmVnID0gKHZvaWQgKilUQkdfU0VMLAkJCVwKKwkuc2hpZnQgPSBfc2hpZnQsCQkJXAorCS5tYXNrID0gMywJCQkJXAorCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CVwKKwkJLm9wcyA9ICAmY2xrX211eF9yb19vcHMsCVwKKwl9CQkJCQlcCit9OworCisjZGVmaW5lIFBFUklQSF9ET1VCTEVESVYoX25hbWUsIF9yZWcxLCBfcmVnMiwgX3NoaWZ0MSwgX3NoaWZ0MikJXAorc3RydWN0IGNsa19kb3VibGVfZGl2IHJhdGVfIyNfbmFtZSA9IHsJCVwKKwkucmVnMSA9ICh2b2lkICopX3JlZzEsCQkJXAorCS5yZWcyID0gKHZvaWQgKilfcmVnMiwJCQlcCisJLnNoaWZ0MSA9IF9zaGlmdDEsCQkJXAorCS5zaGlmdDIgPSBfc2hpZnQyLAkJCVwKKwkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpewlcCisJCS5vcHMgPSAgJmNsa19kb3VibGVfZGl2X29wcywJXAorCX0JCQkJCVwKK307CisKKyNkZWZpbmUgUEVSSVBIX0RJVihfbmFtZSwgX3JlZywgX3NoaWZ0LCBfdGFibGUpCVwKK3N0cnVjdCBjbGtfZGl2aWRlciByYXRlXyMjX25hbWUgPSB7CQlcCisJLnJlZyA9ICh2b2lkICopX3JlZywJCQlcCisJLnRhYmxlID0gX3RhYmxlLAkJCVwKKwkuc2hpZnQgPSBfc2hpZnQsCQkJXAorCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CVwKKwkJLm9wcyA9ICAmY2xrX2RpdmlkZXJfcm9fb3BzLAlcCisJfQkJCQkJXAorfTsKKworI2RlZmluZSBQRVJJUEhfQ0xLX0ZVTExfREQoX25hbWUsIF9iaXQsIF9zaGlmdCwgX3JlZzEsIF9yZWcyLCBfc2hpZnQxLCBfc2hpZnQyKVwKK3N0YXRpYyBQRVJJUEhfR0FURShfbmFtZSwgX2JpdCk7CQkJICAgIFwKK3N0YXRpYyBQRVJJUEhfTVVYKF9uYW1lLCBfc2hpZnQpOwkJCSAgICBcCitzdGF0aWMgUEVSSVBIX0RPVUJMRURJVihfbmFtZSwgX3JlZzEsIF9yZWcyLCBfc2hpZnQxLCBfc2hpZnQyKTsKKworI2RlZmluZSBQRVJJUEhfQ0xLX0ZVTEwoX25hbWUsIF9iaXQsIF9zaGlmdCwgX3JlZywgX3NoaWZ0MSwgX3RhYmxlKQlcCitzdGF0aWMgUEVSSVBIX0dBVEUoX25hbWUsIF9iaXQpOwkJCSAgICBcCitzdGF0aWMgUEVSSVBIX01VWChfbmFtZSwgX3NoaWZ0KTsJCQkgICAgXAorc3RhdGljIFBFUklQSF9ESVYoX25hbWUsIF9yZWcsIF9zaGlmdDEsIF90YWJsZSk7CisKKyNkZWZpbmUgUEVSSVBIX0NMS19HQVRFX0RJVihfbmFtZSwgX2JpdCwgIF9yZWcsIF9zaGlmdCwgX3RhYmxlKQlcCitzdGF0aWMgUEVSSVBIX0dBVEUoX25hbWUsIF9iaXQpOwkJCVwKK3N0YXRpYyBQRVJJUEhfRElWKF9uYW1lLCBfcmVnLCBfc2hpZnQsIF90YWJsZSk7CisKKyNkZWZpbmUgUEVSSVBIX0NMS19NVVhfRElWKF9uYW1lLCBfc2hpZnQsICBfcmVnLCBfc2hpZnRfZGl2LCBfdGFibGUpCVwKK3N0YXRpYyBQRVJJUEhfTVVYKF9uYW1lLCBfc2hpZnQpOwkJCSAgICBcCitzdGF0aWMgUEVSSVBIX0RJVihfbmFtZSwgX3JlZywgX3NoaWZ0X2RpdiwgX3RhYmxlKTsKKworI2RlZmluZSBQRVJJUEhfQ0xLX01VWF9ERChfbmFtZSwgX3NoaWZ0LCBfcmVnMSwgX3JlZzIsIF9zaGlmdDEsIF9zaGlmdDIpXAorc3RhdGljIFBFUklQSF9NVVgoX25hbWUsIF9zaGlmdCk7CQkJICAgIFwKK3N0YXRpYyBQRVJJUEhfRE9VQkxFRElWKF9uYW1lLCBfcmVnMSwgX3JlZzIsIF9zaGlmdDEsIF9zaGlmdDIpOworCisjZGVmaW5lIFJFRl9DTEtfRlVMTChfbmFtZSkJCQkJXAorCXsgLm5hbWUgPSAjX25hbWUsCQkJCVwKKwkgIC5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAiVEJHLUEtUCIsCVwKKwkgICAgICAiVEJHLUItUCIsICJUQkctQS1TIiwgIlRCRy1CLVMifSwJCVwKKwkgIC5udW1fcGFyZW50cyA9IDQsCQkJCVwKKwkgIC5tdXhfaHcgPSAmbXV4XyMjX25hbWUuaHcsCQkJXAorCSAgLmdhdGVfaHcgPSAmZ2F0ZV8jI19uYW1lLmh3LAkJCVwKKwkgIC5yYXRlX2h3ID0gJnJhdGVfIyNfbmFtZS5odywJCQlcCisJfQorCisjZGVmaW5lIFJFRl9DTEtfRlVMTF9ERChfbmFtZSkJCQkJXAorCXsgLm5hbWUgPSAjX25hbWUsCQkJCVwKKwkgIC5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAiVEJHLUEtUCIsCVwKKwkgICAgICAiVEJHLUItUCIsICJUQkctQS1TIiwgIlRCRy1CLVMifSwJCVwKKwkgIC5udW1fcGFyZW50cyA9IDQsCQkJCVwKKwkgIC5tdXhfaHcgPSAmbXV4XyMjX25hbWUuaHcsCQkJXAorCSAgLmdhdGVfaHcgPSAmZ2F0ZV8jI19uYW1lLmh3LAkJCVwKKwkgIC5yYXRlX2h3ID0gJnJhdGVfIyNfbmFtZS5odywJCQlcCisJICAuaXNfZG91YmxlX2RpdiA9IHRydWUsCQkJXAorCX0KKworI2RlZmluZSBSRUZfQ0xLX0dBVEUoX25hbWUsIF9wYXJlbnRfbmFtZSkJCQlcCisJeyAubmFtZSA9ICNfbmFtZSwJCQkJCVwKKwkgIC5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyBfcGFyZW50X25hbWV9LAlcCisJICAubnVtX3BhcmVudHMgPSAxLAkJCQkJXAorCSAgLmdhdGVfaHcgPSAmZ2F0ZV8jI19uYW1lLmh3LAkJCQlcCisJfQorCisjZGVmaW5lIFJFRl9DTEtfR0FURV9ESVYoX25hbWUsIF9wYXJlbnRfbmFtZSkJCQlcCisJeyAubmFtZSA9ICNfbmFtZSwJCQkJCVwKKwkgIC5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyBfcGFyZW50X25hbWV9LAlcCisJICAubnVtX3BhcmVudHMgPSAxLAkJCQkJXAorCSAgLmdhdGVfaHcgPSAmZ2F0ZV8jI19uYW1lLmh3LAkJCQlcCisJICAucmF0ZV9odyA9ICZyYXRlXyMjX25hbWUuaHcsCQkJCVwKKwl9CisKKyNkZWZpbmUgUkVGX0NMS19NVVhfRElWKF9uYW1lKQkJCQlcCisJeyAubmFtZSA9ICNfbmFtZSwJCQkJXAorCSAgLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJUQkctQS1QIiwJXAorCSAgICAgICJUQkctQi1QIiwgIlRCRy1BLVMiLCAiVEJHLUItUyJ9LAkJXAorCSAgLm51bV9wYXJlbnRzID0gNCwJCQkJXAorCSAgLm11eF9odyA9ICZtdXhfIyNfbmFtZS5odywJCQlcCisJICAucmF0ZV9odyA9ICZyYXRlXyMjX25hbWUuaHcsCQkJXAorCX0KKworI2RlZmluZSBSRUZfQ0xLX01VWF9ERChfbmFtZSkJCQkJXAorCXsgLm5hbWUgPSAjX25hbWUsCQkJCVwKKwkgIC5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAiVEJHLUEtUCIsCVwKKwkgICAgICAiVEJHLUItUCIsICJUQkctQS1TIiwgIlRCRy1CLVMifSwJCVwKKwkgIC5udW1fcGFyZW50cyA9IDQsCQkJCVwKKwkgIC5tdXhfaHcgPSAmbXV4XyMjX25hbWUuaHcsCQkJXAorCSAgLnJhdGVfaHcgPSAmcmF0ZV8jI19uYW1lLmh3LAkJCVwKKwkgIC5pc19kb3VibGVfZGl2ID0gdHJ1ZSwJCQlcCisJfQorCisvKiBOQiBwZXJpcGggY2xvY2tzICovCitQRVJJUEhfQ0xLX0ZVTExfREQobW1jLCAyLCAwLCBESVZfU0VMMiwgRElWX1NFTDIsIDE2LCAxMyk7CitQRVJJUEhfQ0xLX0ZVTExfREQoc2F0YV9ob3N0LCAzLCAyLCBESVZfU0VMMiwgRElWX1NFTDIsIDEwLCA3KTsKK1BFUklQSF9DTEtfRlVMTF9ERChzZWNfYXQsIDYsIDQsIERJVl9TRUwxLCBESVZfU0VMMSwgMywgMCk7CitQRVJJUEhfQ0xLX0ZVTExfREQoc2VjX2RhcCwgNywgNiwgRElWX1NFTDEsIERJVl9TRUwxLCA5LCA2KTsKK1BFUklQSF9DTEtfRlVMTF9ERCh0c2NlbSwgOCwgOCwgRElWX1NFTDEsIERJVl9TRUwxLCAxNSwgMTIpOworUEVSSVBIX0NMS19GVUxMKHRzY2VtX3RteCwgMTAsIDEwLCBESVZfU0VMMSwgMTgsIGNsa190YWJsZTYpOworc3RhdGljIFBFUklQSF9HQVRFKGF2cywgMTEpOworUEVSSVBIX0NMS19GVUxMX0REKHB3bSwgMTMsIDE0LCBESVZfU0VMMCwgRElWX1NFTDAsIDMsIDApOworUEVSSVBIX0NMS19GVUxMX0REKHNxZiwgMTIsIDEyLCBESVZfU0VMMSwgRElWX1NFTDEsIDI3LCAyNCk7CitzdGF0aWMgUEVSSVBIX0dBVEUoaTJjXzIsIDE2KTsKK3N0YXRpYyBQRVJJUEhfR0FURShpMmNfMSwgMTcpOworUEVSSVBIX0NMS19HQVRFX0RJVihkZHJfcGh5LCAxOSwgRElWX1NFTDAsIDE4LCBjbGtfdGFibGUyKTsKK1BFUklQSF9DTEtfRlVMTF9ERChkZHJfZmNsaywgMjEsIDE2LCBESVZfU0VMMCwgRElWX1NFTDAsIDE1LCAxMik7CitQRVJJUEhfQ0xLX0ZVTEwodHJhY2UsIDIyLCAxOCwgRElWX1NFTDAsIDIwLCBjbGtfdGFibGU2KTsKK1BFUklQSF9DTEtfRlVMTChjb3VudGVyLCAyMywgMjAsIERJVl9TRUwwLCAyMywgY2xrX3RhYmxlNik7CitQRVJJUEhfQ0xLX0ZVTExfREQoZWlwOTcsIDI0LCAyNCwgRElWX1NFTDIsIERJVl9TRUwyLCAyMiwgMTkpOworUEVSSVBIX0NMS19NVVhfRElWKGNwdSwgMjIsIERJVl9TRUwwLCAyOCwgY2xrX3RhYmxlNik7CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3BlcmlwaF9kYXRhIGRhdGFfbmJbXSA9eworCVJFRl9DTEtfRlVMTF9ERChtbWMpLAorCVJFRl9DTEtfRlVMTF9ERChzYXRhX2hvc3QpLAorCVJFRl9DTEtfRlVMTF9ERChzZWNfYXQpLAorCVJFRl9DTEtfRlVMTF9ERChzZWNfZGFwKSwKKwlSRUZfQ0xLX0ZVTExfREQodHNjZW0pLAorCVJFRl9DTEtfRlVMTCh0c2NlbV90bXgpLAorCVJFRl9DTEtfR0FURShhdnMsICJ4dGFsIiksCisJUkVGX0NMS19GVUxMX0REKHNxZiksCisJUkVGX0NMS19GVUxMX0REKHB3bSksCisJUkVGX0NMS19HQVRFKGkyY18yLCAieHRhbCIpLAorCVJFRl9DTEtfR0FURShpMmNfMSwgInh0YWwiKSwKKwlSRUZfQ0xLX0dBVEVfRElWKGRkcl9waHksICJUQkctQS1TIiksCisJUkVGX0NMS19GVUxMX0REKGRkcl9mY2xrKSwKKwlSRUZfQ0xLX0ZVTEwodHJhY2UpLAorCVJFRl9DTEtfRlVMTChjb3VudGVyKSwKKwlSRUZfQ0xLX0ZVTExfREQoZWlwOTcpLAorCVJFRl9DTEtfTVVYX0RJVihjcHUpLAorCXsgfSwKK307CisKKy8qIFNCIHBlcmlwaCBjbG9ja3MgKi8KK1BFUklQSF9DTEtfTVVYX0REKGdiZV81MCwgNiwgRElWX1NFTDIsIERJVl9TRUwyLCA2LCA5KTsKK1BFUklQSF9DTEtfTVVYX0REKGdiZV9jb3JlLCA4LCBESVZfU0VMMSwgRElWX1NFTDEsIDE4LCAyMSk7CitQRVJJUEhfQ0xLX01VWF9ERChnYmVfMTI1LCAxMCwgRElWX1NFTDEsIERJVl9TRUwxLCA2LCA5KTsKK3N0YXRpYyBQRVJJUEhfR0FURShnYmUxXzUwLCAwKTsKK3N0YXRpYyBQRVJJUEhfR0FURShnYmUwXzUwLCAxKTsKK3N0YXRpYyBQRVJJUEhfR0FURShnYmUxXzEyNSwgMik7CitzdGF0aWMgUEVSSVBIX0dBVEUoZ2JlMF8xMjUsIDMpOworUEVSSVBIX0NMS19HQVRFX0RJVihnYmUxX2NvcmUsIDQsIERJVl9TRUwxLCAxMywgY2xrX3RhYmxlMSk7CitQRVJJUEhfQ0xLX0dBVEVfRElWKGdiZTBfY29yZSwgNSwgRElWX1NFTDEsIDE0LCBjbGtfdGFibGUxKTsKK1BFUklQSF9DTEtfR0FURV9ESVYoZ2JlX2JtLCAxMiwgRElWX1NFTDEsIDAsIGNsa190YWJsZTEpOworUEVSSVBIX0NMS19GVUxMX0REKHNkaW8sIDExLCAxNCwgRElWX1NFTDAsIERJVl9TRUwwLCAzLCA2KTsKK1BFUklQSF9DTEtfRlVMTF9ERCh1c2IzMl91c2IyX3N5cywgMTYsIDE2LCBESVZfU0VMMCwgRElWX1NFTDAsIDksIDEyKTsKK1BFUklQSF9DTEtfRlVMTF9ERCh1c2IzMl9zc19zeXMsIDE3LCAxOCwgRElWX1NFTDAsIERJVl9TRUwwLCAxNSwgMTgpOworCitzdGF0aWMgc3RydWN0IGNsa19wZXJpcGhfZGF0YSBkYXRhX3NiW10gPSB7CisJUkVGX0NMS19NVVhfREQoZ2JlXzUwKSwKKwlSRUZfQ0xLX01VWF9ERChnYmVfY29yZSksCisJUkVGX0NMS19NVVhfREQoZ2JlXzEyNSksCisJUkVGX0NMS19HQVRFKGdiZTFfNTAsICJnYmVfNTAiKSwKKwlSRUZfQ0xLX0dBVEUoZ2JlMF81MCwgImdiZV81MCIpLAorCVJFRl9DTEtfR0FURShnYmUxXzEyNSwgImdiZV8xMjUiKSwKKwlSRUZfQ0xLX0dBVEUoZ2JlMF8xMjUsICJnYmVfMTI1IiksCisJUkVGX0NMS19HQVRFX0RJVihnYmUxX2NvcmUsICJnYmVfY29yZSIpLAorCVJFRl9DTEtfR0FURV9ESVYoZ2JlMF9jb3JlLCAiZ2JlX2NvcmUiKSwKKwlSRUZfQ0xLX0dBVEVfRElWKGdiZV9ibSwgImdiZV9jb3JlIiksCisJUkVGX0NMS19GVUxMX0REKHNkaW8pLAorCVJFRl9DTEtfRlVMTF9ERCh1c2IzMl91c2IyX3N5cyksCisJUkVGX0NMS19GVUxMX0REKHVzYjMyX3NzX3N5cyksCisJeyB9LAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBnZXRfZGl2KHZvaWQgX19pb21lbSAqcmVnLCBpbnQgc2hpZnQpCit7CisJdTMyIHZhbDsKKworCXZhbCA9IChyZWFkbChyZWcpID4+IHNoaWZ0KSAmIDB4NzsKKwlpZiAodmFsID4gNikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xrX2RvdWJsZV9kaXZfcmVjYWxjX3JhdGUoc3RydWN0IGNsa19odyAqaHcsCisJCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUpCit7CisJc3RydWN0IGNsa19kb3VibGVfZGl2ICpkb3VibGVfZGl2ID0gdG9fY2xrX2RvdWJsZV9kaXYoaHcpOworCXVuc2lnbmVkIGludCBkaXY7CisKKwlkaXYgPSBnZXRfZGl2KGRvdWJsZV9kaXYtPnJlZzEsIGRvdWJsZV9kaXYtPnNoaWZ0MSk7CisJZGl2ICo9IGdldF9kaXYoZG91YmxlX2Rpdi0+cmVnMiwgZG91YmxlX2Rpdi0+c2hpZnQyKTsKKworCXJldHVybiBESVZfUk9VTkRfVVBfVUxMKCh1NjQpcGFyZW50X3JhdGUsIGRpdik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBjbGtfZG91YmxlX2Rpdl9vcHMgPSB7CisJLnJlY2FsY19yYXRlID0gY2xrX2RvdWJsZV9kaXZfcmVjYWxjX3JhdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhcm1hZGFfMzcwMF9wZXJpcGhfY2xvY2tfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIm1hcnZlbGwsYXJtYWRhLTM3MDAtcGVyaXBoLWNsb2NrLW5iIiwKKwkgIC5kYXRhID0gZGF0YV9uYiwgfSwKKwl7IC5jb21wYXRpYmxlID0gIm1hcnZlbGwsYXJtYWRhLTM3MDAtcGVyaXBoLWNsb2NrLXNiIiwKKwkuZGF0YSA9IGRhdGFfc2IsIH0sCisJeyB9Cit9Oworc3RhdGljIGludCBhcm1hZGFfMzcwMF9hZGRfY29tcG9zaXRlX2Nsayhjb25zdCBzdHJ1Y3QgY2xrX3BlcmlwaF9kYXRhICpkYXRhLAorCQkJCQkgdm9pZCBfX2lvbWVtICpyZWcsIHNwaW5sb2NrX3QgKmxvY2ssCisJCQkJCSBzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBjbGtfaHcgKmh3KQoreworCWNvbnN0IHN0cnVjdCBjbGtfb3BzICptdXhfb3BzID0gTlVMTCwgKmdhdGVfb3BzID0gTlVMTCwKKwkJKnJhdGVfb3BzID0gTlVMTDsKKwlzdHJ1Y3QgY2xrX2h3ICptdXhfaHcgPSBOVUxMLCAqZ2F0ZV9odyA9IE5VTEwsICpyYXRlX2h3ID0gTlVMTDsKKworCWlmIChkYXRhLT5tdXhfaHcpIHsKKwkJc3RydWN0IGNsa19tdXggKm11eDsKKworCQltdXhfaHcgPSBkYXRhLT5tdXhfaHc7CisJCW11eCA9IHRvX2Nsa19tdXgobXV4X2h3KTsKKwkJbXV4LT5sb2NrID0gbG9jazsKKwkJbXV4X29wcyA9IG11eF9ody0+aW5pdC0+b3BzOworCQltdXgtPnJlZyA9IHJlZyArICh1NjQpbXV4LT5yZWc7CisJfQorCisJaWYgKGRhdGEtPmdhdGVfaHcpIHsKKwkJc3RydWN0IGNsa19nYXRlICpnYXRlOworCisJCWdhdGVfaHcgPSBkYXRhLT5nYXRlX2h3OworCQlnYXRlID0gdG9fY2xrX2dhdGUoZ2F0ZV9odyk7CisJCWdhdGUtPmxvY2sgPSBsb2NrOworCQlnYXRlX29wcyA9IGdhdGVfaHctPmluaXQtPm9wczsKKwkJZ2F0ZS0+cmVnID0gcmVnICsgKHU2NClnYXRlLT5yZWc7CisJfQorCisJaWYgKGRhdGEtPnJhdGVfaHcpIHsKKwkJcmF0ZV9odyA9IGRhdGEtPnJhdGVfaHc7CisJCXJhdGVfb3BzID0gcmF0ZV9ody0+aW5pdC0+b3BzOworCQlpZiAoZGF0YS0+aXNfZG91YmxlX2RpdikgeworCQkJc3RydWN0IGNsa19kb3VibGVfZGl2ICpyYXRlOworCisJCQlyYXRlID0gIHRvX2Nsa19kb3VibGVfZGl2KHJhdGVfaHcpOworCQkJcmF0ZS0+cmVnMSA9IHJlZyArICh1NjQpcmF0ZS0+cmVnMTsKKwkJCXJhdGUtPnJlZzIgPSByZWcgKyAodTY0KXJhdGUtPnJlZzI7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgY2xrX2RpdmlkZXIgKnJhdGUgPSB0b19jbGtfZGl2aWRlcihyYXRlX2h3KTsKKwkJCWNvbnN0IHN0cnVjdCBjbGtfZGl2X3RhYmxlICpjbGt0OworCQkJaW50IHRhYmxlX3NpemUgPSAwOworCisJCQlyYXRlLT5yZWcgPSByZWcgKyAodTY0KXJhdGUtPnJlZzsKKwkJCWZvciAoY2xrdCA9IHJhdGUtPnRhYmxlOyBjbGt0LT5kaXY7IGNsa3QrKykKKwkJCQl0YWJsZV9zaXplKys7CisJCQlyYXRlLT53aWR0aCA9IG9yZGVyX2Jhc2VfMih0YWJsZV9zaXplKTsKKwkJCXJhdGUtPmxvY2sgPSBsb2NrOworCQl9CisJfQorCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfY29tcG9zaXRlKGRldiwgZGF0YS0+bmFtZSwgZGF0YS0+cGFyZW50X25hbWVzLAorCQkJCSAgICAgICBkYXRhLT5udW1fcGFyZW50cywgbXV4X2h3LAorCQkJCSAgICAgICBtdXhfb3BzLCByYXRlX2h3LCByYXRlX29wcywKKwkJCQkgICAgICAgZ2F0ZV9odywgZ2F0ZV9vcHMsIENMS19JR05PUkVfVU5VU0VEKTsKKworCWlmIChJU19FUlIoaHcpKQorCQlyZXR1cm4gUFRSX0VSUihodyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcm1hZGFfMzcwMF9wZXJpcGhfY2xvY2tfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgY2xrX3BlcmlwaF9kcml2ZXJfZGF0YSAqZHJpdmVyX2RhdGE7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCWNvbnN0IHN0cnVjdCBjbGtfcGVyaXBoX2RhdGEgKmRhdGE7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlpbnQgbnVtX3BlcmlwaCA9IDAsIGksIHJldDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwl2b2lkIF9faW9tZW0gKnJlZzsKKworCWRhdGEgPSBvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGEoZGV2KTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PREVWOworCisJd2hpbGUgKGRhdGFbbnVtX3BlcmlwaF0ubmFtZSkKKwkJbnVtX3BlcmlwaCsrOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlyZWcgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCWlmIChJU19FUlIocmVnKSkKKwkJcmV0dXJuIFBUUl9FUlIocmVnKTsKKworCWRyaXZlcl9kYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpkcml2ZXJfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZHJpdmVyX2RhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJZHJpdmVyX2RhdGEtPmh3X2RhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRyaXZlcl9kYXRhLT5od19kYXRhKSArCisJCQkgICAgc2l6ZW9mKCpkcml2ZXJfZGF0YS0+aHdfZGF0YS0+aHdzKSAqIG51bV9wZXJpcGgsCisJCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFkcml2ZXJfZGF0YS0+aHdfZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisJZHJpdmVyX2RhdGEtPmh3X2RhdGEtPm51bSA9IG51bV9wZXJpcGg7CisKKwlzcGluX2xvY2tfaW5pdCgmZHJpdmVyX2RhdGEtPmxvY2spOworCisJZm9yIChpID0gMDsgaSA8IG51bV9wZXJpcGg7IGkrKykgeworCQlzdHJ1Y3QgY2xrX2h3ICpodyA9IGRyaXZlcl9kYXRhLT5od19kYXRhLT5od3NbaV07CisKKwkJaWYgKGFybWFkYV8zNzAwX2FkZF9jb21wb3NpdGVfY2xrKCZkYXRhW2ldLCByZWcsCisJCQkJCQkgICZkcml2ZXJfZGF0YS0+bG9jaywgZGV2LCBodykpCisJCQlkZXZfZXJyKGRldiwgIkNhbid0IHJlZ2lzdGVyIHBlcmlwaCBjbG9jayAlc1xuIiwKKwkJCSAgICAgICBkYXRhW2ldLm5hbWUpOworCisJfQorCisJcmV0ID0gb2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X29uZWNlbGxfZ2V0LAorCQkJCSAgZHJpdmVyX2RhdGEtPmh3X2RhdGEpOworCWlmIChyZXQpIHsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9wZXJpcGg7IGkrKykKKwkJCWNsa19od191bnJlZ2lzdGVyKGRyaXZlcl9kYXRhLT5od19kYXRhLT5od3NbaV0pOworCQlyZXR1cm4gcmV0OworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRyaXZlcl9kYXRhKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcm1hZGFfMzcwMF9wZXJpcGhfY2xvY2tfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGNsa19wZXJpcGhfZHJpdmVyX2RhdGEgKmRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgY2xrX2h3X29uZWNlbGxfZGF0YSAqaHdfZGF0YSA9IGRhdGEtPmh3X2RhdGE7CisJaW50IGk7CisKKwlvZl9jbGtfZGVsX3Byb3ZpZGVyKHBkZXYtPmRldi5vZl9ub2RlKTsKKworCWZvciAoaSA9IDA7IGkgPCBod19kYXRhLT5udW07IGkrKykKKwkJY2xrX2h3X3VucmVnaXN0ZXIoaHdfZGF0YS0+aHdzW2ldKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhcm1hZGFfMzcwMF9wZXJpcGhfY2xvY2tfZHJpdmVyID0geworCS5wcm9iZSA9IGFybWFkYV8zNzAwX3BlcmlwaF9jbG9ja19wcm9iZSwKKwkucmVtb3ZlID0gYXJtYWRhXzM3MDBfcGVyaXBoX2Nsb2NrX3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAibWFydmVsbC1hcm1hZGEtMzcwMC1wZXJpcGgtY2xvY2siLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBhcm1hZGFfMzcwMF9wZXJpcGhfY2xvY2tfb2ZfbWF0Y2gsCisJfSwKK307CisKK2J1aWx0aW5fcGxhdGZvcm1fZHJpdmVyKGFybWFkYV8zNzAwX3BlcmlwaF9jbG9ja19kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbXZlYnUvYXJtYWRhLTM3eHgtdGJnLmMgYi9kcml2ZXJzL2Nsay9tdmVidS9hcm1hZGEtMzd4eC10YmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTgwZGIxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbGsvbXZlYnUvYXJtYWRhLTM3eHgtdGJnLmMKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBNYXJ2ZWxsIEFybWFkYSAzN3h4IFNvQyBUaW1lIEJhc2UgR2VuZXJhdG9yIGNsb2NrcworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBNYXJ2ZWxsCisgKgorICogR3JlZ29yeSBDTEVNRU5UIDxncmVnb3J5LmNsZW1lbnRAZnJlZS1lbGVjdHJvbnMuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb3IgbGF0ZXIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiCisgKiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2RlZmluZSBOVU1fVEJHCSAgICA0CisKKyNkZWZpbmUgVEJHX0NUUkwwCQkweDQKKyNkZWZpbmUgVEJHX0NUUkwxCQkweDgKKyNkZWZpbmUgVEJHX0NUUkw3CQkweDIwCisjZGVmaW5lIFRCR19DVFJMOAkJMHgzMAorCisjZGVmaW5lIFRCR19ESVZfTUFTSwkJMHgxRkYKKworI2RlZmluZSBUQkdfQV9SRUZESVYJCTAKKyNkZWZpbmUgVEJHX0JfUkVGRElWCQkxNgorCisjZGVmaW5lIFRCR19BX0ZCRElWCQkyCisjZGVmaW5lIFRCR19CX0ZCRElWCQkxOAorCisjZGVmaW5lIFRCR19BX1ZDT0RJVl9TRQkJMAorI2RlZmluZSBUQkdfQl9WQ09ESVZfU0UJCTE2CisKKyNkZWZpbmUgVEJHX0FfVkNPRElWX0RJRkYJMQorI2RlZmluZSBUQkdfQl9WQ09ESVZfRElGRgkxNworCitzdHJ1Y3QgdGJnX2RlZiB7CisJY2hhciAqbmFtZTsKKwl1MzIgcmVmZGl2X29mZnNldDsKKwl1MzIgZmJkaXZfb2Zmc2V0OworCXUzMiB2Y29kaXZfcmVnOworCXUzMiB2Y29kaXZfb2Zmc2V0OworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0YmdfZGVmIHRiZ1tOVU1fVEJHXSA9IHsKKwl7IlRCRy1BLVAiLCBUQkdfQV9SRUZESVYsIFRCR19BX0ZCRElWLCBUQkdfQ1RSTDgsIFRCR19BX1ZDT0RJVl9ESUZGfSwKKwl7IlRCRy1CLVAiLCBUQkdfQl9SRUZESVYsIFRCR19CX0ZCRElWLCBUQkdfQ1RSTDgsIFRCR19CX1ZDT0RJVl9ESUZGfSwKKwl7IlRCRy1BLVMiLCBUQkdfQV9SRUZESVYsIFRCR19BX0ZCRElWLCBUQkdfQ1RSTDEsIFRCR19BX1ZDT0RJVl9TRX0sCisJeyJUQkctQi1TIiwgVEJHX0JfUkVGRElWLCBUQkdfQl9GQkRJViwgVEJHX0NUUkwxLCBUQkdfQl9WQ09ESVZfU0V9LAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCB0YmdfZ2V0X211bHQodm9pZCBfX2lvbWVtICpyZWcsIGNvbnN0IHN0cnVjdCB0YmdfZGVmICpwdGJnKQoreworCXUzMiB2YWw7CisKKwl2YWwgPSByZWFkbChyZWcgKyBUQkdfQ1RSTDApOworCisJcmV0dXJuICgodmFsID4+IHB0YmctPmZiZGl2X29mZnNldCkgJiBUQkdfRElWX01BU0spIDw8IDI7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGJnX2dldF9kaXYodm9pZCBfX2lvbWVtICpyZWcsIGNvbnN0IHN0cnVjdCB0YmdfZGVmICpwdGJnKQoreworCXUzMiB2YWw7CisJdW5zaWduZWQgaW50IGRpdjsKKworCXZhbCA9IHJlYWRsKHJlZyArIFRCR19DVFJMNyk7CisKKwlkaXYgPSAodmFsID4+IHB0YmctPnJlZmRpdl9vZmZzZXQpICYgVEJHX0RJVl9NQVNLOworCWlmIChkaXYgPT0gMCkKKwkJZGl2ID0gMTsKKwl2YWwgPSByZWFkbChyZWcgKyBwdGJnLT52Y29kaXZfcmVnKTsKKworCWRpdiAqPSAxIDw8ICgodmFsID4+ICBwdGJnLT52Y29kaXZfb2Zmc2V0KSAmIFRCR19ESVZfTUFTSyk7CisKKwlyZXR1cm4gZGl2OworfQorCisKK3N0YXRpYyBpbnQgYXJtYWRhXzM3MDBfdGJnX2Nsb2NrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBjbGtfaHdfb25lY2VsbF9kYXRhICpod190YmdfZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBjbGsgKnBhcmVudDsKKwl2b2lkIF9faW9tZW0gKnJlZzsKKwlpbnQgaSwgcmV0OworCisJaHdfdGJnX2RhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpod190YmdfZGF0YSkKKwkJCQkgICArIHNpemVvZigqaHdfdGJnX2RhdGEtPmh3cykgKiBOVU1fVEJHLAorCQkJCSAgIEdGUF9LRVJORUwpOworCWlmICghaHdfdGJnX2RhdGEpCisJCXJldHVybiAtRU5PTUVNOworCWh3X3RiZ19kYXRhLT5udW0gPSBOVU1fVEJHOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGh3X3RiZ19kYXRhKTsKKworCXBhcmVudCA9IGRldm1fY2xrX2dldChkZXYsIE5VTEwpOworCWlmIChJU19FUlIocGFyZW50KSkgeworCQlkZXZfZXJyKGRldiwgIkNvdWxkIGdldCB0aGUgY2xvY2sgcGFyZW50XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBhcmVudF9uYW1lID0gX19jbGtfZ2V0X25hbWUocGFyZW50KTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJcmVnID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHJlZykpCisJCXJldHVybiBQVFJfRVJSKHJlZyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1RCRzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKm5hbWU7CisJCXVuc2lnbmVkIGludCBtdWx0LCBkaXY7CisKKwkJbmFtZSA9IHRiZ1tpXS5uYW1lOworCQltdWx0ID0gdGJnX2dldF9tdWx0KHJlZywgJnRiZ1tpXSk7CisJCWRpdiA9IHRiZ19nZXRfZGl2KHJlZywgJnRiZ1tpXSk7CisJCWh3X3RiZ19kYXRhLT5od3NbaV0gPSBjbGtfaHdfcmVnaXN0ZXJfZml4ZWRfZmFjdG9yKE5VTEwsIG5hbWUsCisJCQkJCQlwYXJlbnRfbmFtZSwgMCwgbXVsdCwgZGl2KTsKKwkJaWYgKElTX0VSUihod190YmdfZGF0YS0+aHdzW2ldKSkKKwkJCWRldl9lcnIoZGV2LCAiQ2FuJ3QgcmVnaXN0ZXIgVEJHIGNsb2NrICVzXG4iLCBuYW1lKTsKKwl9CisKKwlyZXQgPSBvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfb25lY2VsbF9nZXQsIGh3X3RiZ19kYXRhKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXJtYWRhXzM3MDBfdGJnX2Nsb2NrX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCBpOworCXN0cnVjdCBjbGtfaHdfb25lY2VsbF9kYXRhICpod190YmdfZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJb2ZfY2xrX2RlbF9wcm92aWRlcihwZGV2LT5kZXYub2Zfbm9kZSk7CisJZm9yIChpID0gMDsgaSA8IGh3X3RiZ19kYXRhLT5udW07IGkrKykKKwkJY2xrX2h3X3VucmVnaXN0ZXJfZml4ZWRfZmFjdG9yKGh3X3RiZ19kYXRhLT5od3NbaV0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFybWFkYV8zNzAwX3RiZ19jbG9ja19vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAibWFydmVsbCxhcm1hZGEtMzcwMC10YmctY2xvY2siLCB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXJtYWRhXzM3MDBfdGJnX2Nsb2NrX2RyaXZlciA9IHsKKwkucHJvYmUgPSBhcm1hZGFfMzcwMF90YmdfY2xvY2tfcHJvYmUsCisJLnJlbW92ZSA9IGFybWFkYV8zNzAwX3RiZ19jbG9ja19yZW1vdmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gIm1hcnZlbGwtYXJtYWRhLTM3MDAtdGJnLWNsb2NrIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gYXJtYWRhXzM3MDBfdGJnX2Nsb2NrX29mX21hdGNoLAorCX0sCit9OworCitidWlsdGluX3BsYXRmb3JtX2RyaXZlcihhcm1hZGFfMzcwMF90YmdfY2xvY2tfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL212ZWJ1L2FybWFkYS0zN3h4LXh0YWwuYyBiL2RyaXZlcnMvY2xrL212ZWJ1L2FybWFkYS0zN3h4LXh0YWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTJkNjVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbGsvbXZlYnUvYXJtYWRhLTM3eHgteHRhbC5jCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBNYXJ2ZWxsIEFybWFkYSAzN3h4IFNvQyB4dGFsIGNsb2NrcworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBNYXJ2ZWxsCisgKgorICogR3JlZ29yeSBDTEVNRU5UIDxncmVnb3J5LmNsZW1lbnRAZnJlZS1lbGVjdHJvbnMuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvc3lzY29uLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKyNkZWZpbmUgTkJfR1BJTzFfTEFUQ0gJMHhDCisjZGVmaW5lIFhUQUxfTU9ERQkgICAgQklUKDMxKQorCitzdGF0aWMgaW50IGFybWFkYV8zNzAwX3h0YWxfY2xvY2tfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJY29uc3QgY2hhciAqeHRhbF9uYW1lID0gInh0YWwiOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50OworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKwlzdHJ1Y3QgY2xrX2h3ICp4dGFsX2h3OworCXVuc2lnbmVkIGludCByYXRlOworCXUzMiByZWc7CisJaW50IHJldDsKKworCXh0YWxfaHcgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCp4dGFsX2h3KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF4dGFsX2h3KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHh0YWxfaHcpOworCisJcGFyZW50ID0gbnAtPnBhcmVudDsKKwlpZiAoIXBhcmVudCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBwYXJlbnRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZWdtYXAgPSBzeXNjb25fbm9kZV90b19yZWdtYXAocGFyZW50KTsKKwlpZiAoSVNfRVJSKHJlZ21hcCkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IGdldCByZWdtYXBcbiIpOworCQlyZXR1cm4gUFRSX0VSUihyZWdtYXApOworCX0KKworCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTkJfR1BJTzFfTEFUQ0gsICZyZWcpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IHJlYWQgZnJvbSByZWdtYXBcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChyZWcgJiBYVEFMX01PREUpCisJCXJhdGUgPSA0MDAwMDAwMDsKKwllbHNlCisJCXJhdGUgPSAyNTAwMDAwMDsKKworCW9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nX2luZGV4KG5wLCAiY2xvY2stb3V0cHV0LW5hbWVzIiwgMCwgJnh0YWxfbmFtZSk7CisJeHRhbF9odyA9IGNsa19od19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsIHh0YWxfbmFtZSwgTlVMTCwgMCwgcmF0ZSk7CisJaWYgKElTX0VSUih4dGFsX2h3KSkKKwkJcmV0dXJuIFBUUl9FUlIoeHRhbF9odyk7CisJcmV0ID0gb2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsIHh0YWxfaHcpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhcm1hZGFfMzcwMF94dGFsX2Nsb2NrX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCW9mX2Nsa19kZWxfcHJvdmlkZXIocGRldi0+ZGV2Lm9mX25vZGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFybWFkYV8zNzAwX3h0YWxfY2xvY2tfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIm1hcnZlbGwsYXJtYWRhLTM3MDAteHRhbC1jbG9jayIsIH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhcm1hZGFfMzcwMF94dGFsX2Nsb2NrX2RyaXZlciA9IHsKKwkucHJvYmUgPSBhcm1hZGFfMzcwMF94dGFsX2Nsb2NrX3Byb2JlLAorCS5yZW1vdmUgPSBhcm1hZGFfMzcwMF94dGFsX2Nsb2NrX3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAibWFydmVsbC1hcm1hZGEtMzcwMC14dGFsLWNsb2NrIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gYXJtYWRhXzM3MDBfeHRhbF9jbG9ja19vZl9tYXRjaCwKKwl9LAorfTsKKworYnVpbHRpbl9wbGF0Zm9ybV9kcml2ZXIoYXJtYWRhXzM3MDBfeHRhbF9jbG9ja19kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbXZlYnUvYXJtYWRhLTM5eC5jIGIvZHJpdmVycy9jbGsvbXZlYnUvYXJtYWRhLTM5eC5jCmluZGV4IGVmYjk3NGQuLjRmZGZkMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL212ZWJ1L2FybWFkYS0zOXguYworKysgYi9kcml2ZXJzL2Nsay9tdmVidS9hcm1hZGEtMzl4LmMKQEAgLTE0Miw2ICsxNDIsOCBAQAogCXsgInBleDMiLCBOVUxMLCA3IH0sCiAJeyAicGV4MCIsIE5VTEwsIDggfSwKIAl7ICJ1c2IzaDAiLCBOVUxMLCA5IH0sCisJeyAidXNiM2gxIiwgTlVMTCwgMTAgfSwKKwl7ICJzYXRhMCIsIE5VTEwsIDE1IH0sCiAJeyAic2RpbyIsIE5VTEwsIDE3IH0sCiAJeyAieG9yMCIsIE5VTEwsIDIyIH0sCiAJeyAieG9yMSIsIE5VTEwsIDI4IH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9tdmVidS9jcDExMC1zeXN0ZW0tY29udHJvbGxlci5jIGIvZHJpdmVycy9jbGsvbXZlYnUvY3AxMTAtc3lzdGVtLWNvbnRyb2xsZXIuYwppbmRleCA3ZmE0MmQ2Li5mMjMwM2RhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9tdmVidS9jcDExMC1zeXN0ZW0tY29udHJvbGxlci5jCisrKyBiL2RyaXZlcnMvY2xrL212ZWJ1L2NwMTEwLXN5c3RlbS1jb250cm9sbGVyLmMKQEAgLTgxLDEzICs4MSw2IEBACiAjZGVmaW5lIENQMTEwX0dBVEVfRUlQMTUwCQkyNQogI2RlZmluZSBDUDExMF9HQVRFX0VJUDE5NwkJMjYKIAotc3RhdGljIHN0cnVjdCBjbGsgKmNwMTEwX2Nsa3NbQ1AxMTBfQ0xLX05VTV07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSBjcDExMF9jbGtfZGF0YSA9IHsKLQkuY2xrcyA9IGNwMTEwX2Nsa3MsCi0JLmNsa19udW0gPSBDUDExMF9DTEtfTlVNLAotfTsKLQogc3RydWN0IGNwMTEwX2dhdGVfY2xrIHsKIAlzdHJ1Y3QgY2xrX2h3IGh3OwogCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKQEAgLTE0Miw2ICsxMzUsOCBAQAogCWlmICghZ2F0ZSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKKwltZW1zZXQoJmluaXQsIDAsIHNpemVvZihpbml0KSk7CisKIAlpbml0Lm5hbWUgPSBuYW1lOwogCWluaXQub3BzID0gJmNwMTEwX2dhdGVfb3BzOwogCWluaXQucGFyZW50X25hbWVzID0gJnBhcmVudF9uYW1lOwpAQCAtMTk0LDcgKzE4OSw4IEBACiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAljb25zdCBjaGFyICpwcHYyX25hbWUsICphcGxsX25hbWUsICpjb3JlX25hbWUsICplaXBfbmFtZSwgKm5hbmRfbmFtZTsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgKmNwMTEwX2Nsa19kYXRhOworCXN0cnVjdCBjbGsgKmNsaywgKipjcDExMF9jbGtzOwogCXUzMiBuYW5kX2Nsa19jdHJsOwogCWludCBpLCByZXQ7CiAKQEAgLTIwNyw2ICsyMDMsMjAgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJY3AxMTBfY2xrcyA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGNsayAqKSwKKwkJCQkgIENQMTEwX0NMS19OVU0sIEdGUF9LRVJORUwpOworCWlmICghY3AxMTBfY2xrcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljcDExMF9jbGtfZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAorCQkJCSAgICAgIHNpemVvZigqY3AxMTBfY2xrX2RhdGEpLAorCQkJCSAgICAgIEdGUF9LRVJORUwpOworCWlmICghY3AxMTBfY2xrX2RhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJY3AxMTBfY2xrX2RhdGEtPmNsa3MgPSBjcDExMF9jbGtzOworCWNwMTEwX2Nsa19kYXRhLT5jbGtfbnVtID0gQ1AxMTBfQ0xLX05VTTsKKwogCS8qIFJlZ2lzdGVyIHRoZSBBUExMIHdoaWNoIGlzIHRoZSByb290IG9mIHRoZSBjbGsgdHJlZSAqLwogCW9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nX2luZGV4KG5wLCAiY29yZS1jbG9jay1vdXRwdXQtbmFtZXMiLAogCQkJCSAgICAgIENQMTEwX0NPUkVfQVBMTCwgJmFwbGxfbmFtZSk7CkBAIC0zMzQsMTAgKzM0NCwxMiBAQAogCQljcDExMF9jbGtzW0NQMTEwX01BWF9DT1JFX0NMT0NLUyArIGldID0gY2xrOwogCX0KIAotCXJldCA9IG9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIGNwMTEwX29mX2Nsa19nZXQsICZjcDExMF9jbGtfZGF0YSk7CisJcmV0ID0gb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgY3AxMTBfb2ZfY2xrX2dldCwgY3AxMTBfY2xrX2RhdGEpOwogCWlmIChyZXQpCiAJCWdvdG8gZmFpbF9jbGtfYWRkOwogCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY3AxMTBfY2xrcyk7CisKIAlyZXR1cm4gMDsKIAogZmFpbF9jbGtfYWRkOgpAQCAtMzY0LDYgKzM3Niw3IEBACiAKIHN0YXRpYyBpbnQgY3AxMTBfc3lzY29uX2Nsa19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlzdHJ1Y3QgY2xrICoqY3AxMTBfY2xrcyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCWludCBpOwogCiAJb2ZfY2xrX2RlbF9wcm92aWRlcihwZGV2LT5kZXYub2Zfbm9kZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9ueHAvY2xrLWxwYzE4eHgtY3JlZy5jIGIvZHJpdmVycy9jbGsvbnhwL2Nsay1scGMxOHh4LWNyZWcuYwppbmRleCA5ZTM1NzQ5Li5jNmU4MDJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9ueHAvY2xrLWxwYzE4eHgtY3JlZy5jCisrKyBiL2RyaXZlcnMvY2xrL254cC9jbGstbHBjMTh4eC1jcmVnLmMKQEAgLTE4NCw3ICsxODQsOCBAQAogCiAJb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwgJmNsa19jcmVnX2Vhcmx5X2RhdGEpOwogfQotQ0xLX09GX0RFQ0xBUkUobHBjMTh4eF9jcmVnX2NsaywgIm54cCxscGMxODUwLWNyZWctY2xrIiwgbHBjMTh4eF9jcmVnX2Nsa19pbml0KTsKK0NMS19PRl9ERUNMQVJFX0RSSVZFUihscGMxOHh4X2NyZWdfY2xrLCAibnhwLGxwYzE4NTAtY3JlZy1jbGsiLAorCQkgICAgICBscGMxOHh4X2NyZWdfY2xrX2luaXQpOwogCiBzdGF0aWMgc3RydWN0IGNsayAqY2xrX2NyZWdbQ1JFR19DTEtfTUFYXTsKIHN0YXRpYyBzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSBjbGtfY3JlZ19kYXRhID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbnhwL2Nsay1scGMzMnh4LmMgYi9kcml2ZXJzL2Nsay9ueHAvY2xrLWxwYzMyeHguYwppbmRleCA5MGQ3NDBhLi4zNGM5NzM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9ueHAvY2xrLWxwYzMyeHguYworKysgYi9kcml2ZXJzL2Nsay9ueHAvY2xrLWxwYzMyeHguYwpAQCAtMTUxMyw2ICsxNTEzLDcgQEAKIAlpZiAoSVNfRVJSKGNsa19yZWdtYXApKSB7CiAJCXByX2VycigiZmFpbGVkIHRvIHJlZ21hcCBzeXN0ZW0gY29udHJvbCBibG9jazogJWxkXG4iLAogCQkJUFRSX0VSUihjbGtfcmVnbWFwKSk7CisJCWlvdW5tYXAoYmFzZSk7CiAJCXJldHVybjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3Fjb20vS2NvbmZpZyBiL2RyaXZlcnMvY2xrL3Fjb20vS2NvbmZpZwppbmRleCA5NWUzYjNlLi4wMTQ2ZDNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9xY29tL0tjb25maWcKKysrIGIvZHJpdmVycy9jbGsvcWNvbS9LY29uZmlnCkBAIC04Nyw2ICs4NywyMyBAQAogCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gdXNlIGF1ZGlvIGRldmljZXMgc3VjaCBhcyBpMnMsIHBjbSwKIAkgIFNMSU1CdXMsIGV0Yy4KIAorY29uZmlnIE1ETV9HQ0NfOTYxNQorCXRyaXN0YXRlICJNRE05NjE1IEdsb2JhbCBDbG9jayBDb250cm9sbGVyIgorCWRlcGVuZHMgb24gQ09NTU9OX0NMS19RQ09NCisJaGVscAorCSAgU3VwcG9ydCBmb3IgdGhlIGdsb2JhbCBjbG9jayBjb250cm9sbGVyIG9uIG1kbTk2MTUgZGV2aWNlcy4KKwkgIFNheSBZIGlmIHlvdSB3YW50IHRvIHVzZSBwZXJpcGhlcmFsIGRldmljZXMgc3VjaCBhcyBVQVJULCBTUEksCisJICBpMmMsIFVTQiwgU0QvZU1NQywgZXRjLgorCitjb25maWcgTURNX0xDQ185NjE1CisJdHJpc3RhdGUgIk1ETTk2MTUgTFBBU1MgQ2xvY2sgQ29udHJvbGxlciIKKwlzZWxlY3QgTURNX0dDQ185NjE1CisJZGVwZW5kcyBvbiBDT01NT05fQ0xLX1FDT00KKwloZWxwCisJICBTdXBwb3J0IGZvciB0aGUgTFBBU1MgY2xvY2sgY29udHJvbGxlciBvbiBtZG05NjE1IGRldmljZXMuCisJICBTYXkgWSBpZiB5b3Ugd2FudCB0byB1c2UgYXVkaW8gZGV2aWNlcyBzdWNoIGFzIGkycywgcGNtLAorCSAgU0xJTUJ1cywgZXRjLgorCiBjb25maWcgTVNNX01NQ0NfODk2MAogCXRyaXN0YXRlICJNU004OTYwIE11bHRpbWVkaWEgQ2xvY2sgQ29udHJvbGxlciIKIAlzZWxlY3QgTVNNX0dDQ184OTYwCkBAIC0xMTcsNiArMTM0LDcgQEAKIAogY29uZmlnIE1TTV9HQ0NfODk5NgogCXRyaXN0YXRlICJNU004OTk2IEdsb2JhbCBDbG9jayBDb250cm9sbGVyIgorCXNlbGVjdCBRQ09NX0dEU0MKIAlkZXBlbmRzIG9uIENPTU1PTl9DTEtfUUNPTQogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIHRoZSBnbG9iYWwgY2xvY2sgY29udHJvbGxlciBvbiBtc204OTk2IGRldmljZXMuCkBAIC0xMjYsNiArMTQ0LDcgQEAKIGNvbmZpZyBNU01fTU1DQ184OTk2CiAJdHJpc3RhdGUgIk1TTTg5OTYgTXVsdGltZWRpYSBDbG9jayBDb250cm9sbGVyIgogCXNlbGVjdCBNU01fR0NDXzg5OTYKKwlzZWxlY3QgUUNPTV9HRFNDCiAJZGVwZW5kcyBvbiBDT01NT05fQ0xLX1FDT00KIAloZWxwCiAJICBTdXBwb3J0IGZvciB0aGUgbXVsdGltZWRpYSBjbG9jayBjb250cm9sbGVyIG9uIG1zbTg5OTYgZGV2aWNlcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3Fjb20vTWFrZWZpbGUgYi9kcml2ZXJzL2Nsay9xY29tL01ha2VmaWxlCmluZGV4IDJhMjVmNGUuLjFmYjFmNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3Fjb20vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jbGsvcWNvbS9NYWtlZmlsZQpAQCAtMTIsMTcgKzEyLDIwIEBACiBjbGstcWNvbS15ICs9IHJlc2V0Lm8KIGNsay1xY29tLSQoQ09ORklHX1FDT01fR0RTQykgKz0gZ2RzYy5vCiAKKyMgS2VlcCBhbHBoYWJldGljYWxseSBzb3J0ZWQgYnkgY29uZmlnCiBvYmotJChDT05GSUdfQVBRX0dDQ184MDg0KSArPSBnY2MtYXBxODA4NC5vCiBvYmotJChDT05GSUdfQVBRX01NQ0NfODA4NCkgKz0gbW1jYy1hcHE4MDg0Lm8KIG9iai0kKENPTkZJR19JUFFfR0NDXzQwMTkpICs9IGdjYy1pcHE0MDE5Lm8KIG9iai0kKENPTkZJR19JUFFfR0NDXzgwNlgpICs9IGdjYy1pcHE4MDZ4Lm8KIG9iai0kKENPTkZJR19JUFFfTENDXzgwNlgpICs9IGxjYy1pcHE4MDZ4Lm8KK29iai0kKENPTkZJR19NRE1fR0NDXzk2MTUpICs9IGdjYy1tZG05NjE1Lm8KK29iai0kKENPTkZJR19NRE1fTENDXzk2MTUpICs9IGxjYy1tZG05NjE1Lm8KIG9iai0kKENPTkZJR19NU01fR0NDXzg2NjApICs9IGdjYy1tc204NjYwLm8KIG9iai0kKENPTkZJR19NU01fR0NDXzg5MTYpICs9IGdjYy1tc204OTE2Lm8KIG9iai0kKENPTkZJR19NU01fR0NDXzg5NjApICs9IGdjYy1tc204OTYwLm8KLW9iai0kKENPTkZJR19NU01fTENDXzg5NjApICs9IGxjYy1tc204OTYwLm8KIG9iai0kKENPTkZJR19NU01fR0NDXzg5NzQpICs9IGdjYy1tc204OTc0Lm8KIG9iai0kKENPTkZJR19NU01fR0NDXzg5OTYpICs9IGdjYy1tc204OTk2Lm8KK29iai0kKENPTkZJR19NU01fTENDXzg5NjApICs9IGxjYy1tc204OTYwLm8KIG9iai0kKENPTkZJR19NU01fTU1DQ184OTYwKSArPSBtbWNjLW1zbTg5NjAubwogb2JqLSQoQ09ORklHX01TTV9NTUNDXzg5NzQpICs9IG1tY2MtbXNtODk3NC5vCiBvYmotJChDT05GSUdfTVNNX01NQ0NfODk5NikgKz0gbW1jYy1tc204OTk2Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3Fjb20vY2xrLXJlZ21hcC5jIGIvZHJpdmVycy9jbGsvcWNvbS9jbGstcmVnbWFwLmMKaW5kZXggYTU4YmEzOS4uMWM4NTZkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvcWNvbS9jbGstcmVnbWFwLmMKKysrIGIvZHJpdmVycy9jbGsvcWNvbS9jbGstcmVnbWFwLmMKQEAgLTEwMSwxNCArMTAxLDEzIEBACiAgKiBjbGtfcmVnbWFwIHN0cnVjdCB2aWEgdGhpcyBmdW5jdGlvbiBzbyB0aGF0IHRoZSByZWdtYXAgaXMgaW5pdGlhbGl6ZWQKICAqIGFuZCBzbyB0aGF0IHRoZSBjbG9jayBpcyByZWdpc3RlcmVkIHdpdGggdGhlIGNvbW1vbiBjbG9jayBmcmFtZXdvcmsuCiAgKi8KLXN0cnVjdCBjbGsgKmRldm1fY2xrX3JlZ2lzdGVyX3JlZ21hcChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgICBzdHJ1Y3QgY2xrX3JlZ21hcCAqcmNsaykKK2ludCBkZXZtX2Nsa19yZWdpc3Rlcl9yZWdtYXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgY2xrX3JlZ21hcCAqcmNsaykKIHsKIAlpZiAoZGV2ICYmIGRldl9nZXRfcmVnbWFwKGRldiwgTlVMTCkpCiAJCXJjbGstPnJlZ21hcCA9IGRldl9nZXRfcmVnbWFwKGRldiwgTlVMTCk7CiAJZWxzZSBpZiAoZGV2ICYmIGRldi0+cGFyZW50KQogCQlyY2xrLT5yZWdtYXAgPSBkZXZfZ2V0X3JlZ21hcChkZXYtPnBhcmVudCwgTlVMTCk7CiAKLQlyZXR1cm4gZGV2bV9jbGtfcmVnaXN0ZXIoZGV2LCAmcmNsay0+aHcpOworCXJldHVybiBkZXZtX2Nsa19od19yZWdpc3RlcihkZXYsICZyY2xrLT5odyk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChkZXZtX2Nsa19yZWdpc3Rlcl9yZWdtYXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvcWNvbS9jbGstcmVnbWFwLmggYi9kcml2ZXJzL2Nsay9xY29tL2Nsay1yZWdtYXAuaAppbmRleCA0OTFhNjNkLi45MGQ5NWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9xY29tL2Nsay1yZWdtYXAuaAorKysgYi9kcml2ZXJzL2Nsay9xY29tL2Nsay1yZWdtYXAuaApAQCAtMzksNyArMzksNiBAQAogaW50IGNsa19pc19lbmFibGVkX3JlZ21hcChzdHJ1Y3QgY2xrX2h3ICpodyk7CiBpbnQgY2xrX2VuYWJsZV9yZWdtYXAoc3RydWN0IGNsa19odyAqaHcpOwogdm9pZCBjbGtfZGlzYWJsZV9yZWdtYXAoc3RydWN0IGNsa19odyAqaHcpOwotc3RydWN0IGNsayAqCi1kZXZtX2Nsa19yZWdpc3Rlcl9yZWdtYXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgY2xrX3JlZ21hcCAqcmNsayk7CitpbnQgZGV2bV9jbGtfcmVnaXN0ZXJfcmVnbWFwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGNsa19yZWdtYXAgKnJjbGspOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3Fjb20vY29tbW9uLmMgYi9kcml2ZXJzL2Nsay9xY29tL2NvbW1vbi5jCmluZGV4IGY3YzIyNmEuLmZmZmNiYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3Fjb20vY29tbW9uLmMKKysrIGIvZHJpdmVycy9jbGsvcWNvbS9jb21tb24uYwpAQCAtMjcsOCArMjcsOCBAQAogCiBzdHJ1Y3QgcWNvbV9jYyB7CiAJc3RydWN0IHFjb21fcmVzZXRfY29udHJvbGxlciByZXNldDsKLQlzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSBkYXRhOwotCXN0cnVjdCBjbGsgKmNsa3NbXTsKKwlzdHJ1Y3QgY2xrX3JlZ21hcCAqKnJjbGtzOworCXNpemVfdCBudW1fcmNsa3M7CiB9OwogCiBjb25zdApAQCAtMTAyLDggKzEwMiw4IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpjbG9ja3Nfbm9kZTsKIAlzdHJ1Y3QgY2xrX2ZpeGVkX2ZhY3RvciAqZmFjdG9yOwogCXN0cnVjdCBjbGtfZml4ZWRfcmF0ZSAqZml4ZWQ7Ci0Jc3RydWN0IGNsayAqY2xrOwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXRfZGF0YSA9IHsgfTsKKwlpbnQgcmV0OwogCiAJY2xvY2tzX25vZGUgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL2Nsb2NrcyIpOwogCWlmIChjbG9ja3Nfbm9kZSkKQEAgLTEyMSw5ICsxMjEsOSBAQAogCQlpbml0X2RhdGEubmFtZSA9IHBhdGg7CiAJCWluaXRfZGF0YS5vcHMgPSAmY2xrX2ZpeGVkX3JhdGVfb3BzOwogCi0JCWNsayA9IGRldm1fY2xrX3JlZ2lzdGVyKGRldiwgJmZpeGVkLT5odyk7Ci0JCWlmIChJU19FUlIoY2xrKSkKLQkJCXJldHVybiBQVFJfRVJSKGNsayk7CisJCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKGRldiwgJmZpeGVkLT5odyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCX0KIAlvZl9ub2RlX3B1dChub2RlKTsKIApAQCAtMTQxLDkgKzE0MSw5IEBACiAJCWluaXRfZGF0YS5mbGFncyA9IDA7CiAJCWluaXRfZGF0YS5vcHMgPSAmY2xrX2ZpeGVkX2ZhY3Rvcl9vcHM7CiAKLQkJY2xrID0gZGV2bV9jbGtfcmVnaXN0ZXIoZGV2LCAmZmFjdG9yLT5odyk7Ci0JCWlmIChJU19FUlIoY2xrKSkKLQkJCXJldHVybiBQVFJfRVJSKGNsayk7CisJCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKGRldiwgJmZhY3Rvci0+aHcpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTE3NCw0MiArMTc0LDQ4IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChxY29tX2NjX3JlZ2lzdGVyX3NsZWVwX2Nsayk7CiAKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICpxY29tX2NjX2Nsa19od19nZXQoc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqY2xrc3BlYywKKwkJCQkJIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHFjb21fY2MgKmNjID0gZGF0YTsKKwl1bnNpZ25lZCBpbnQgaWR4ID0gY2xrc3BlYy0+YXJnc1swXTsKKworCWlmIChpZHggPj0gY2MtPm51bV9yY2xrcykgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGluZGV4ICV1XG4iLCBfX2Z1bmNfXywgaWR4KTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJcmV0dXJuIGNjLT5yY2xrc1tpZHhdID8gJmNjLT5yY2xrc1tpZHhdLT5odyA6IEVSUl9QVFIoLUVOT0VOVCk7Cit9CisKIGludCBxY29tX2NjX3JlYWxseV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAogCQkJIGNvbnN0IHN0cnVjdCBxY29tX2NjX2Rlc2MgKmRlc2MsIHN0cnVjdCByZWdtYXAgKnJlZ21hcCkKIHsKIAlpbnQgaSwgcmV0OwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Ci0Jc3RydWN0IGNsayAqY2xrOwotCXN0cnVjdCBjbGtfb25lY2VsbF9kYXRhICpkYXRhOwotCXN0cnVjdCBjbGsgKipjbGtzOwogCXN0cnVjdCBxY29tX3Jlc2V0X2NvbnRyb2xsZXIgKnJlc2V0OwogCXN0cnVjdCBxY29tX2NjICpjYzsKIAlzdHJ1Y3QgZ2RzY19kZXNjICpzY2Q7CiAJc2l6ZV90IG51bV9jbGtzID0gZGVzYy0+bnVtX2Nsa3M7CiAJc3RydWN0IGNsa19yZWdtYXAgKipyY2xrcyA9IGRlc2MtPmNsa3M7CiAKLQljYyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqY2MpICsgc2l6ZW9mKCpjbGtzKSAqIG51bV9jbGtzLAotCQkJICBHRlBfS0VSTkVMKTsKKwljYyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqY2MpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNjKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWNsa3MgPSBjYy0+Y2xrczsKLQlkYXRhID0gJmNjLT5kYXRhOwotCWRhdGEtPmNsa3MgPSBjbGtzOwotCWRhdGEtPmNsa19udW0gPSBudW1fY2xrczsKKwljYy0+cmNsa3MgPSByY2xrczsKKwljYy0+bnVtX3JjbGtzID0gbnVtX2Nsa3M7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2Nsa3M7IGkrKykgewotCQlpZiAoIXJjbGtzW2ldKSB7Ci0JCQljbGtzW2ldID0gRVJSX1BUUigtRU5PRU5UKTsKKwkJaWYgKCFyY2xrc1tpXSkKIAkJCWNvbnRpbnVlOwotCQl9Ci0JCWNsayA9IGRldm1fY2xrX3JlZ2lzdGVyX3JlZ21hcChkZXYsIHJjbGtzW2ldKTsKLQkJaWYgKElTX0VSUihjbGspKQotCQkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKLQkJY2xrc1tpXSA9IGNsazsKKworCQlyZXQgPSBkZXZtX2Nsa19yZWdpc3Rlcl9yZWdtYXAoZGV2LCByY2xrc1tpXSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9IG9mX2Nsa19hZGRfcHJvdmlkZXIoZGV2LT5vZl9ub2RlLCBvZl9jbGtfc3JjX29uZWNlbGxfZ2V0LCBkYXRhKTsKKwlyZXQgPSBvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKGRldi0+b2Zfbm9kZSwgcWNvbV9jY19jbGtfaHdfZ2V0LCBjYyk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvcWNvbS9nY2MtaXBxNDAxOS5jIGIvZHJpdmVycy9jbGsvcWNvbS9nY2MtaXBxNDAxOS5jCmluZGV4IDNjZDFhZjAuLmI1OTMwNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3Fjb20vZ2NjLWlwcTQwMTkuYworKysgYi9kcml2ZXJzL2Nsay9xY29tL2djYy1pcHE0MDE5LmMKQEAgLTEzMzIsNyArMTMzMiw2IEBACiAJLnByb2JlCQk9IGdjY19pcHE0MDE5X3Byb2JlLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJxY29tLGdjYy1pcHE0MDE5IiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJCS5vZl9tYXRjaF90YWJsZSA9IGdjY19pcHE0MDE5X21hdGNoX3RhYmxlLAogCX0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvcWNvbS9nY2MtbWRtOTYxNS5jIGIvZHJpdmVycy9jbGsvcWNvbS9nY2MtbWRtOTYxNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MWExN2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsay9xY29tL2djYy1tZG05NjE1LmMKQEAgLTAsMCArMSwxNzI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSBCYXlMaWJyZSwgU0FTLgorICogQXV0aG9yIDogTmVpbCBBcm1zdHJvbmcgPG5hcm1zdHJvbmdAYmF5bGlicmUuY29tPgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcmVzZXQtY29udHJvbGxlci5oPgorCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxnY2MtbWRtOTYxNS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL3Jlc2V0L3Fjb20sZ2NjLW1kbTk2MTUuaD4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImNsay1yZWdtYXAuaCIKKyNpbmNsdWRlICJjbGstcGxsLmgiCisjaW5jbHVkZSAiY2xrLXJjZy5oIgorI2luY2x1ZGUgImNsay1icmFuY2guaCIKKyNpbmNsdWRlICJyZXNldC5oIgorCitzdGF0aWMgc3RydWN0IGNsa19maXhlZF9mYWN0b3IgY3hvID0geworCS5tdWx0ID0gMSwKKwkuZGl2ID0gMSwKKwkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkubmFtZSA9ICJjeG8iLAorCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgImN4b19ib2FyZCIgfSwKKwkJLm51bV9wYXJlbnRzID0gMSwKKwkJLm9wcyA9ICZjbGtfZml4ZWRfZmFjdG9yX29wcywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfcGxsIHBsbDAgPSB7CisJLmxfcmVnID0gMHgzMGM0LAorCS5tX3JlZyA9IDB4MzBjOCwKKwkubl9yZWcgPSAweDMwY2MsCisJLmNvbmZpZ19yZWcgPSAweDMwZDQsCisJLm1vZGVfcmVnID0gMHgzMGMwLAorCS5zdGF0dXNfcmVnID0gMHgzMGQ4LAorCS5zdGF0dXNfYml0ID0gMTYsCisJLmNsa3IuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkubmFtZSA9ICJwbGwwIiwKKwkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJjeG8iIH0sCisJCS5udW1fcGFyZW50cyA9IDEsCisJCS5vcHMgPSAmY2xrX3BsbF9vcHMsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3JlZ21hcCBwbGwwX3ZvdGUgPSB7CisJLmVuYWJsZV9yZWcgPSAweDM0YzAsCisJLmVuYWJsZV9tYXNrID0gQklUKDApLAorCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCS5uYW1lID0gInBsbDBfdm90ZSIsCisJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAicGxsOCIgfSwKKwkJLm51bV9wYXJlbnRzID0gMSwKKwkJLm9wcyA9ICZjbGtfcGxsX3ZvdGVfb3BzLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19yZWdtYXAgcGxsNF92b3RlID0geworCS5lbmFibGVfcmVnID0gMHgzNGMwLAorCS5lbmFibGVfbWFzayA9IEJJVCg0KSwKKwkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkubmFtZSA9ICJwbGw0X3ZvdGUiLAorCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgInBsbDQiIH0sCisJCS5udW1fcGFyZW50cyA9IDEsCisJCS5vcHMgPSAmY2xrX3BsbF92b3RlX29wcywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfcGxsIHBsbDggPSB7CisJLmxfcmVnID0gMHgzMTQ0LAorCS5tX3JlZyA9IDB4MzE0OCwKKwkubl9yZWcgPSAweDMxNGMsCisJLmNvbmZpZ19yZWcgPSAweDMxNTQsCisJLm1vZGVfcmVnID0gMHgzMTQwLAorCS5zdGF0dXNfcmVnID0gMHgzMTU4LAorCS5zdGF0dXNfYml0ID0gMTYsCisJLmNsa3IuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkubmFtZSA9ICJwbGw4IiwKKwkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJjeG8iIH0sCisJCS5udW1fcGFyZW50cyA9IDEsCisJCS5vcHMgPSAmY2xrX3BsbF9vcHMsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3JlZ21hcCBwbGw4X3ZvdGUgPSB7CisJLmVuYWJsZV9yZWcgPSAweDM0YzAsCisJLmVuYWJsZV9tYXNrID0gQklUKDgpLAorCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCS5uYW1lID0gInBsbDhfdm90ZSIsCisJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAicGxsOCIgfSwKKwkJLm51bV9wYXJlbnRzID0gMSwKKwkJLm9wcyA9ICZjbGtfcGxsX3ZvdGVfb3BzLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19wbGwgcGxsMTQgPSB7CisJLmxfcmVnID0gMHgzMWM0LAorCS5tX3JlZyA9IDB4MzFjOCwKKwkubl9yZWcgPSAweDMxY2MsCisJLmNvbmZpZ19yZWcgPSAweDMxZDQsCisJLm1vZGVfcmVnID0gMHgzMWMwLAorCS5zdGF0dXNfcmVnID0gMHgzMWQ4LAorCS5zdGF0dXNfYml0ID0gMTYsCisJLmNsa3IuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkubmFtZSA9ICJwbGwxNCIsCisJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAiY3hvIiB9LAorCQkubnVtX3BhcmVudHMgPSAxLAorCQkub3BzID0gJmNsa19wbGxfb3BzLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19yZWdtYXAgcGxsMTRfdm90ZSA9IHsKKwkuZW5hYmxlX3JlZyA9IDB4MzRjMCwKKwkuZW5hYmxlX21hc2sgPSBCSVQoMTEpLAorCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCS5uYW1lID0gInBsbDE0X3ZvdGUiLAorCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgInBsbDE0IiB9LAorCQkubnVtX3BhcmVudHMgPSAxLAorCQkub3BzID0gJmNsa19wbGxfdm90ZV9vcHMsCisJfSwKK307CisKK2VudW0geworCVBfQ1hPLAorCVBfUExMOCwKKwlQX1BMTDE0LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwYXJlbnRfbWFwIGdjY19jeG9fcGxsOF9tYXBbXSA9IHsKKwl7IFBfQ1hPLCAwIH0sCisJeyBQX1BMTDgsIDMgfQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBnY2NfY3hvX3BsbDhbXSA9IHsKKwkiY3hvIiwKKwkicGxsOF92b3RlIiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGFyZW50X21hcCBnY2NfY3hvX3BsbDE0X21hcFtdID0geworCXsgUF9DWE8sIDAgfSwKKwl7IFBfUExMMTQsIDQgfQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBnY2NfY3hvX3BsbDE0W10gPSB7CisJImN4byIsCisJInBsbDE0X3ZvdGUiLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwYXJlbnRfbWFwIGdjY19jeG9fbWFwW10gPSB7CisJeyBQX0NYTywgMCB9LAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBnY2NfY3hvW10gPSB7CisJImN4byIsCit9OworCitzdGF0aWMgc3RydWN0IGZyZXFfdGJsIGNsa190YmxfZ3NiaV91YXJ0W10gPSB7CisJeyAgMTg0MzIwMCwgUF9QTEw4LCAyLCAgNiwgNjI1IH0sCisJeyAgMzY4NjQwMCwgUF9QTEw4LCAyLCAxMiwgNjI1IH0sCisJeyAgNzM3MjgwMCwgUF9QTEw4LCAyLCAyNCwgNjI1IH0sCisJeyAxNDc0NTYwMCwgUF9QTEw4LCAyLCA0OCwgNjI1IH0sCisJeyAxNjAwMDAwMCwgUF9QTEw4LCA0LCAgMSwgICA2IH0sCisJeyAyNDAwMDAwMCwgUF9QTEw4LCA0LCAgMSwgICA0IH0sCisJeyAzMjAwMDAwMCwgUF9QTEw4LCA0LCAgMSwgICAzIH0sCisJeyA0MDAwMDAwMCwgUF9QTEw4LCAxLCAgNSwgIDQ4IH0sCisJeyA0NjQwMDAwMCwgUF9QTEw4LCAxLCAyOSwgMjQwIH0sCisJeyA0ODAwMDAwMCwgUF9QTEw4LCA0LCAgMSwgICAyIH0sCisJeyA1MTIwMDAwMCwgUF9QTEw4LCAxLCAgMiwgIDE1IH0sCisJeyA1NjAwMDAwMCwgUF9QTEw4LCAxLCAgNywgIDQ4IH0sCisJeyA1ODk4MjQwMCwgUF9QTEw4LCAxLCA5NiwgNjI1IH0sCisJeyA2NDAwMDAwMCwgUF9QTEw4LCAyLCAgMSwgICAzIH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGNsa19yY2cgZ3NiaTFfdWFydF9zcmMgPSB7CisJLm5zX3JlZyA9IDB4MjlkNCwKKwkubWRfcmVnID0gMHgyOWQwLAorCS5tbiA9IHsKKwkJLm1uY3RyX2VuX2JpdCA9IDgsCisJCS5tbmN0cl9yZXNldF9iaXQgPSA3LAorCQkubW5jdHJfbW9kZV9zaGlmdCA9IDUsCisJCS5uX3ZhbF9zaGlmdCA9IDE2LAorCQkubV92YWxfc2hpZnQgPSAxNiwKKwkJLndpZHRoID0gMTYsCisJfSwKKwkucCA9IHsKKwkJLnByZV9kaXZfc2hpZnQgPSAzLAorCQkucHJlX2Rpdl93aWR0aCA9IDIsCisJfSwKKwkucyA9IHsKKwkJLnNyY19zZWxfc2hpZnQgPSAwLAorCQkucGFyZW50X21hcCA9IGdjY19jeG9fcGxsOF9tYXAsCisJfSwKKwkuZnJlcV90YmwgPSBjbGtfdGJsX2dzYmlfdWFydCwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDI5ZDQsCisJCS5lbmFibGVfbWFzayA9IEJJVCgxMSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJnc2JpMV91YXJ0X3NyYyIsCisJCQkucGFyZW50X25hbWVzID0gZ2NjX2N4b19wbGw4LAorCQkJLm51bV9wYXJlbnRzID0gMiwKKwkJCS5vcHMgPSAmY2xrX3JjZ19vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1BBUkVOVF9HQVRFLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggZ3NiaTFfdWFydF9jbGsgPSB7CisJLmhhbHRfcmVnID0gMHgyZmNjLAorCS5oYWx0X2JpdCA9IDEwLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MjlkNCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDkpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAiZ3NiaTFfdWFydF9jbGsiLAorCQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7CisJCQkJImdzYmkxX3VhcnRfc3JjIiwKKwkJCX0sCisJCQkubnVtX3BhcmVudHMgPSAxLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3JjZyBnc2JpMl91YXJ0X3NyYyA9IHsKKwkubnNfcmVnID0gMHgyOWY0LAorCS5tZF9yZWcgPSAweDI5ZjAsCisJLm1uID0geworCQkubW5jdHJfZW5fYml0ID0gOCwKKwkJLm1uY3RyX3Jlc2V0X2JpdCA9IDcsCisJCS5tbmN0cl9tb2RlX3NoaWZ0ID0gNSwKKwkJLm5fdmFsX3NoaWZ0ID0gMTYsCisJCS5tX3ZhbF9zaGlmdCA9IDE2LAorCQkud2lkdGggPSAxNiwKKwl9LAorCS5wID0geworCQkucHJlX2Rpdl9zaGlmdCA9IDMsCisJCS5wcmVfZGl2X3dpZHRoID0gMiwKKwl9LAorCS5zID0geworCQkuc3JjX3NlbF9zaGlmdCA9IDAsCisJCS5wYXJlbnRfbWFwID0gZ2NjX2N4b19wbGw4X21hcCwKKwl9LAorCS5mcmVxX3RibCA9IGNsa190YmxfZ3NiaV91YXJ0LAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MjlmNCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDExKSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImdzYmkyX3VhcnRfc3JjIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSBnY2NfY3hvX3BsbDgsCisJCQkubnVtX3BhcmVudHMgPSAyLAorCQkJLm9wcyA9ICZjbGtfcmNnX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUEFSRU5UX0dBVEUsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBnc2JpMl91YXJ0X2NsayA9IHsKKwkuaGFsdF9yZWcgPSAweDJmY2MsCisJLmhhbHRfYml0ID0gNiwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDI5ZjQsCisJCS5lbmFibGVfbWFzayA9IEJJVCg5KSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImdzYmkyX3VhcnRfY2xrIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peworCQkJCSJnc2JpMl91YXJ0X3NyYyIsCisJCQl9LAorCQkJLm51bV9wYXJlbnRzID0gMSwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfUEFSRU5ULAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19yY2cgZ3NiaTNfdWFydF9zcmMgPSB7CisJLm5zX3JlZyA9IDB4MmExNCwKKwkubWRfcmVnID0gMHgyYTEwLAorCS5tbiA9IHsKKwkJLm1uY3RyX2VuX2JpdCA9IDgsCisJCS5tbmN0cl9yZXNldF9iaXQgPSA3LAorCQkubW5jdHJfbW9kZV9zaGlmdCA9IDUsCisJCS5uX3ZhbF9zaGlmdCA9IDE2LAorCQkubV92YWxfc2hpZnQgPSAxNiwKKwkJLndpZHRoID0gMTYsCisJfSwKKwkucCA9IHsKKwkJLnByZV9kaXZfc2hpZnQgPSAzLAorCQkucHJlX2Rpdl93aWR0aCA9IDIsCisJfSwKKwkucyA9IHsKKwkJLnNyY19zZWxfc2hpZnQgPSAwLAorCQkucGFyZW50X21hcCA9IGdjY19jeG9fcGxsOF9tYXAsCisJfSwKKwkuZnJlcV90YmwgPSBjbGtfdGJsX2dzYmlfdWFydCwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDJhMTQsCisJCS5lbmFibGVfbWFzayA9IEJJVCgxMSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJnc2JpM191YXJ0X3NyYyIsCisJCQkucGFyZW50X25hbWVzID0gZ2NjX2N4b19wbGw4LAorCQkJLm51bV9wYXJlbnRzID0gMiwKKwkJCS5vcHMgPSAmY2xrX3JjZ19vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1BBUkVOVF9HQVRFLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggZ3NiaTNfdWFydF9jbGsgPSB7CisJLmhhbHRfcmVnID0gMHgyZmNjLAorCS5oYWx0X2JpdCA9IDIsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyYTE0LAorCQkuZW5hYmxlX21hc2sgPSBCSVQoOSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJnc2JpM191YXJ0X2NsayIsCisJCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsKKwkJCQkiZ3NiaTNfdWFydF9zcmMiLAorCQkJfSwKKwkJCS5udW1fcGFyZW50cyA9IDEsCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX1BBUkVOVCwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfcmNnIGdzYmk0X3VhcnRfc3JjID0geworCS5uc19yZWcgPSAweDJhMzQsCisJLm1kX3JlZyA9IDB4MmEzMCwKKwkubW4gPSB7CisJCS5tbmN0cl9lbl9iaXQgPSA4LAorCQkubW5jdHJfcmVzZXRfYml0ID0gNywKKwkJLm1uY3RyX21vZGVfc2hpZnQgPSA1LAorCQkubl92YWxfc2hpZnQgPSAxNiwKKwkJLm1fdmFsX3NoaWZ0ID0gMTYsCisJCS53aWR0aCA9IDE2LAorCX0sCisJLnAgPSB7CisJCS5wcmVfZGl2X3NoaWZ0ID0gMywKKwkJLnByZV9kaXZfd2lkdGggPSAyLAorCX0sCisJLnMgPSB7CisJCS5zcmNfc2VsX3NoaWZ0ID0gMCwKKwkJLnBhcmVudF9tYXAgPSBnY2NfY3hvX3BsbDhfbWFwLAorCX0sCisJLmZyZXFfdGJsID0gY2xrX3RibF9nc2JpX3VhcnQsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyYTM0LAorCQkuZW5hYmxlX21hc2sgPSBCSVQoMTEpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAiZ3NiaTRfdWFydF9zcmMiLAorCQkJLnBhcmVudF9uYW1lcyA9IGdjY19jeG9fcGxsOCwKKwkJCS5udW1fcGFyZW50cyA9IDIsCisJCQkub3BzID0gJmNsa19yY2dfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9QQVJFTlRfR0FURSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIGdzYmk0X3VhcnRfY2xrID0geworCS5oYWx0X3JlZyA9IDB4MmZkMCwKKwkuaGFsdF9iaXQgPSAyNiwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDJhMzQsCisJCS5lbmFibGVfbWFzayA9IEJJVCg5KSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImdzYmk0X3VhcnRfY2xrIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peworCQkJCSJnc2JpNF91YXJ0X3NyYyIsCisJCQl9LAorCQkJLm51bV9wYXJlbnRzID0gMSwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfUEFSRU5ULAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19yY2cgZ3NiaTVfdWFydF9zcmMgPSB7CisJLm5zX3JlZyA9IDB4MmE1NCwKKwkubWRfcmVnID0gMHgyYTUwLAorCS5tbiA9IHsKKwkJLm1uY3RyX2VuX2JpdCA9IDgsCisJCS5tbmN0cl9yZXNldF9iaXQgPSA3LAorCQkubW5jdHJfbW9kZV9zaGlmdCA9IDUsCisJCS5uX3ZhbF9zaGlmdCA9IDE2LAorCQkubV92YWxfc2hpZnQgPSAxNiwKKwkJLndpZHRoID0gMTYsCisJfSwKKwkucCA9IHsKKwkJLnByZV9kaXZfc2hpZnQgPSAzLAorCQkucHJlX2Rpdl93aWR0aCA9IDIsCisJfSwKKwkucyA9IHsKKwkJLnNyY19zZWxfc2hpZnQgPSAwLAorCQkucGFyZW50X21hcCA9IGdjY19jeG9fcGxsOF9tYXAsCisJfSwKKwkuZnJlcV90YmwgPSBjbGtfdGJsX2dzYmlfdWFydCwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDJhNTQsCisJCS5lbmFibGVfbWFzayA9IEJJVCgxMSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJnc2JpNV91YXJ0X3NyYyIsCisJCQkucGFyZW50X25hbWVzID0gZ2NjX2N4b19wbGw4LAorCQkJLm51bV9wYXJlbnRzID0gMiwKKwkJCS5vcHMgPSAmY2xrX3JjZ19vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1BBUkVOVF9HQVRFLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggZ3NiaTVfdWFydF9jbGsgPSB7CisJLmhhbHRfcmVnID0gMHgyZmQwLAorCS5oYWx0X2JpdCA9IDIyLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MmE1NCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDkpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAiZ3NiaTVfdWFydF9jbGsiLAorCQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7CisJCQkJImdzYmk1X3VhcnRfc3JjIiwKKwkJCX0sCisJCQkubnVtX3BhcmVudHMgPSAxLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZnJlcV90YmwgY2xrX3RibF9nc2JpX3F1cFtdID0geworCXsgICA5NjAwMDAsIFBfQ1hPLCAgNCwgMSwgIDUgfSwKKwl7ICA0ODAwMDAwLCBQX0NYTywgIDQsIDAsICAxIH0sCisJeyAgOTYwMDAwMCwgUF9DWE8sICAyLCAwLCAgMSB9LAorCXsgMTUwNjAwMDAsIFBfUExMOCwgMSwgMiwgNTEgfSwKKwl7IDI0MDAwMDAwLCBQX1BMTDgsIDQsIDEsICA0IH0sCisJeyAyNTYwMDAwMCwgUF9QTEw4LCAxLCAxLCAxNSB9LAorCXsgNDgwMDAwMDAsIFBfUExMOCwgNCwgMSwgIDIgfSwKKwl7IDUxMjAwMDAwLCBQX1BMTDgsIDEsIDIsIDE1IH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGNsa19yY2cgZ3NiaTFfcXVwX3NyYyA9IHsKKwkubnNfcmVnID0gMHgyOWNjLAorCS5tZF9yZWcgPSAweDI5YzgsCisJLm1uID0geworCQkubW5jdHJfZW5fYml0ID0gOCwKKwkJLm1uY3RyX3Jlc2V0X2JpdCA9IDcsCisJCS5tbmN0cl9tb2RlX3NoaWZ0ID0gNSwKKwkJLm5fdmFsX3NoaWZ0ID0gMTYsCisJCS5tX3ZhbF9zaGlmdCA9IDE2LAorCQkud2lkdGggPSA4LAorCX0sCisJLnAgPSB7CisJCS5wcmVfZGl2X3NoaWZ0ID0gMywKKwkJLnByZV9kaXZfd2lkdGggPSAyLAorCX0sCisJLnMgPSB7CisJCS5zcmNfc2VsX3NoaWZ0ID0gMCwKKwkJLnBhcmVudF9tYXAgPSBnY2NfY3hvX3BsbDhfbWFwLAorCX0sCisJLmZyZXFfdGJsID0gY2xrX3RibF9nc2JpX3F1cCwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDI5Y2MsCisJCS5lbmFibGVfbWFzayA9IEJJVCgxMSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJnc2JpMV9xdXBfc3JjIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSBnY2NfY3hvX3BsbDgsCisJCQkubnVtX3BhcmVudHMgPSAyLAorCQkJLm9wcyA9ICZjbGtfcmNnX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUEFSRU5UX0dBVEUsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBnc2JpMV9xdXBfY2xrID0geworCS5oYWx0X3JlZyA9IDB4MmZjYywKKwkuaGFsdF9iaXQgPSA5LAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MjljYywKKwkJLmVuYWJsZV9tYXNrID0gQklUKDkpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAiZ3NiaTFfcXVwX2NsayIsCisJCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgImdzYmkxX3F1cF9zcmMiIH0sCisJCQkubnVtX3BhcmVudHMgPSAxLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3JjZyBnc2JpMl9xdXBfc3JjID0geworCS5uc19yZWcgPSAweDI5ZWMsCisJLm1kX3JlZyA9IDB4MjllOCwKKwkubW4gPSB7CisJCS5tbmN0cl9lbl9iaXQgPSA4LAorCQkubW5jdHJfcmVzZXRfYml0ID0gNywKKwkJLm1uY3RyX21vZGVfc2hpZnQgPSA1LAorCQkubl92YWxfc2hpZnQgPSAxNiwKKwkJLm1fdmFsX3NoaWZ0ID0gMTYsCisJCS53aWR0aCA9IDgsCisJfSwKKwkucCA9IHsKKwkJLnByZV9kaXZfc2hpZnQgPSAzLAorCQkucHJlX2Rpdl93aWR0aCA9IDIsCisJfSwKKwkucyA9IHsKKwkJLnNyY19zZWxfc2hpZnQgPSAwLAorCQkucGFyZW50X21hcCA9IGdjY19jeG9fcGxsOF9tYXAsCisJfSwKKwkuZnJlcV90YmwgPSBjbGtfdGJsX2dzYmlfcXVwLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MjllYywKKwkJLmVuYWJsZV9tYXNrID0gQklUKDExKSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImdzYmkyX3F1cF9zcmMiLAorCQkJLnBhcmVudF9uYW1lcyA9IGdjY19jeG9fcGxsOCwKKwkJCS5udW1fcGFyZW50cyA9IDIsCisJCQkub3BzID0gJmNsa19yY2dfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9QQVJFTlRfR0FURSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIGdzYmkyX3F1cF9jbGsgPSB7CisJLmhhbHRfcmVnID0gMHgyZmNjLAorCS5oYWx0X2JpdCA9IDQsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyOWVjLAorCQkuZW5hYmxlX21hc2sgPSBCSVQoOSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJnc2JpMl9xdXBfY2xrIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAiZ3NiaTJfcXVwX3NyYyIgfSwKKwkJCS5udW1fcGFyZW50cyA9IDEsCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX1BBUkVOVCwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfcmNnIGdzYmkzX3F1cF9zcmMgPSB7CisJLm5zX3JlZyA9IDB4MmEwYywKKwkubWRfcmVnID0gMHgyYTA4LAorCS5tbiA9IHsKKwkJLm1uY3RyX2VuX2JpdCA9IDgsCisJCS5tbmN0cl9yZXNldF9iaXQgPSA3LAorCQkubW5jdHJfbW9kZV9zaGlmdCA9IDUsCisJCS5uX3ZhbF9zaGlmdCA9IDE2LAorCQkubV92YWxfc2hpZnQgPSAxNiwKKwkJLndpZHRoID0gOCwKKwl9LAorCS5wID0geworCQkucHJlX2Rpdl9zaGlmdCA9IDMsCisJCS5wcmVfZGl2X3dpZHRoID0gMiwKKwl9LAorCS5zID0geworCQkuc3JjX3NlbF9zaGlmdCA9IDAsCisJCS5wYXJlbnRfbWFwID0gZ2NjX2N4b19wbGw4X21hcCwKKwl9LAorCS5mcmVxX3RibCA9IGNsa190YmxfZ3NiaV9xdXAsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyYTBjLAorCQkuZW5hYmxlX21hc2sgPSBCSVQoMTEpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAiZ3NiaTNfcXVwX3NyYyIsCisJCQkucGFyZW50X25hbWVzID0gZ2NjX2N4b19wbGw4LAorCQkJLm51bV9wYXJlbnRzID0gMiwKKwkJCS5vcHMgPSAmY2xrX3JjZ19vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1BBUkVOVF9HQVRFLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggZ3NiaTNfcXVwX2NsayA9IHsKKwkuaGFsdF9yZWcgPSAweDJmY2MsCisJLmhhbHRfYml0ID0gMCwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDJhMGMsCisJCS5lbmFibGVfbWFzayA9IEJJVCg5KSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImdzYmkzX3F1cF9jbGsiLAorCQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJnc2JpM19xdXBfc3JjIiB9LAorCQkJLm51bV9wYXJlbnRzID0gMSwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfUEFSRU5ULAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19yY2cgZ3NiaTRfcXVwX3NyYyA9IHsKKwkubnNfcmVnID0gMHgyYTJjLAorCS5tZF9yZWcgPSAweDJhMjgsCisJLm1uID0geworCQkubW5jdHJfZW5fYml0ID0gOCwKKwkJLm1uY3RyX3Jlc2V0X2JpdCA9IDcsCisJCS5tbmN0cl9tb2RlX3NoaWZ0ID0gNSwKKwkJLm5fdmFsX3NoaWZ0ID0gMTYsCisJCS5tX3ZhbF9zaGlmdCA9IDE2LAorCQkud2lkdGggPSA4LAorCX0sCisJLnAgPSB7CisJCS5wcmVfZGl2X3NoaWZ0ID0gMywKKwkJLnByZV9kaXZfd2lkdGggPSAyLAorCX0sCisJLnMgPSB7CisJCS5zcmNfc2VsX3NoaWZ0ID0gMCwKKwkJLnBhcmVudF9tYXAgPSBnY2NfY3hvX3BsbDhfbWFwLAorCX0sCisJLmZyZXFfdGJsID0gY2xrX3RibF9nc2JpX3F1cCwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDJhMmMsCisJCS5lbmFibGVfbWFzayA9IEJJVCgxMSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJnc2JpNF9xdXBfc3JjIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSBnY2NfY3hvX3BsbDgsCisJCQkubnVtX3BhcmVudHMgPSAyLAorCQkJLm9wcyA9ICZjbGtfcmNnX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUEFSRU5UX0dBVEUsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBnc2JpNF9xdXBfY2xrID0geworCS5oYWx0X3JlZyA9IDB4MmZkMCwKKwkuaGFsdF9iaXQgPSAyNCwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDJhMmMsCisJCS5lbmFibGVfbWFzayA9IEJJVCg5KSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImdzYmk0X3F1cF9jbGsiLAorCQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJnc2JpNF9xdXBfc3JjIiB9LAorCQkJLm51bV9wYXJlbnRzID0gMSwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfUEFSRU5ULAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19yY2cgZ3NiaTVfcXVwX3NyYyA9IHsKKwkubnNfcmVnID0gMHgyYTRjLAorCS5tZF9yZWcgPSAweDJhNDgsCisJLm1uID0geworCQkubW5jdHJfZW5fYml0ID0gOCwKKwkJLm1uY3RyX3Jlc2V0X2JpdCA9IDcsCisJCS5tbmN0cl9tb2RlX3NoaWZ0ID0gNSwKKwkJLm5fdmFsX3NoaWZ0ID0gMTYsCisJCS5tX3ZhbF9zaGlmdCA9IDE2LAorCQkud2lkdGggPSA4LAorCX0sCisJLnAgPSB7CisJCS5wcmVfZGl2X3NoaWZ0ID0gMywKKwkJLnByZV9kaXZfd2lkdGggPSAyLAorCX0sCisJLnMgPSB7CisJCS5zcmNfc2VsX3NoaWZ0ID0gMCwKKwkJLnBhcmVudF9tYXAgPSBnY2NfY3hvX3BsbDhfbWFwLAorCX0sCisJLmZyZXFfdGJsID0gY2xrX3RibF9nc2JpX3F1cCwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDJhNGMsCisJCS5lbmFibGVfbWFzayA9IEJJVCgxMSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJnc2JpNV9xdXBfc3JjIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSBnY2NfY3hvX3BsbDgsCisJCQkubnVtX3BhcmVudHMgPSAyLAorCQkJLm9wcyA9ICZjbGtfcmNnX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUEFSRU5UX0dBVEUsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBnc2JpNV9xdXBfY2xrID0geworCS5oYWx0X3JlZyA9IDB4MmZkMCwKKwkuaGFsdF9iaXQgPSAyMCwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDJhNGMsCisJCS5lbmFibGVfbWFzayA9IEJJVCg5KSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImdzYmk1X3F1cF9jbGsiLAorCQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJnc2JpNV9xdXBfc3JjIiB9LAorCQkJLm51bV9wYXJlbnRzID0gMSwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfUEFSRU5ULAorCQl9LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZyZXFfdGJsIGNsa190YmxfZ3BbXSA9IHsKKwl7IDk2MDAwMDAsIFBfQ1hPLCAgMiwgMCwgMCB9LAorCXsgMTkyMDAwMDAsIFBfQ1hPLCAgMSwgMCwgMCB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfcmNnIGdwMF9zcmMgPSB7CisJLm5zX3JlZyA9IDB4MmQyNCwKKwkubWRfcmVnID0gMHgyZDAwLAorCS5tbiA9IHsKKwkJLm1uY3RyX2VuX2JpdCA9IDgsCisJCS5tbmN0cl9yZXNldF9iaXQgPSA3LAorCQkubW5jdHJfbW9kZV9zaGlmdCA9IDUsCisJCS5uX3ZhbF9zaGlmdCA9IDE2LAorCQkubV92YWxfc2hpZnQgPSAxNiwKKwkJLndpZHRoID0gOCwKKwl9LAorCS5wID0geworCQkucHJlX2Rpdl9zaGlmdCA9IDMsCisJCS5wcmVfZGl2X3dpZHRoID0gMiwKKwl9LAorCS5zID0geworCQkuc3JjX3NlbF9zaGlmdCA9IDAsCisJCS5wYXJlbnRfbWFwID0gZ2NjX2N4b19tYXAsCisJfSwKKwkuZnJlcV90YmwgPSBjbGtfdGJsX2dwLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MmQyNCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDExKSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImdwMF9zcmMiLAorCQkJLnBhcmVudF9uYW1lcyA9IGdjY19jeG8sCisJCQkubnVtX3BhcmVudHMgPSAxLAorCQkJLm9wcyA9ICZjbGtfcmNnX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUEFSRU5UX0dBVEUsCisJCX0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIGdwMF9jbGsgPSB7CisJLmhhbHRfcmVnID0gMHgyZmQ4LAorCS5oYWx0X2JpdCA9IDcsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyZDI0LAorCQkuZW5hYmxlX21hc2sgPSBCSVQoOSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJncDBfY2xrIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAiZ3AwX3NyYyIgfSwKKwkJCS5udW1fcGFyZW50cyA9IDEsCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX1BBUkVOVCwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfcmNnIGdwMV9zcmMgPSB7CisJLm5zX3JlZyA9IDB4MmQ0NCwKKwkubWRfcmVnID0gMHgyZDQwLAorCS5tbiA9IHsKKwkJLm1uY3RyX2VuX2JpdCA9IDgsCisJCS5tbmN0cl9yZXNldF9iaXQgPSA3LAorCQkubW5jdHJfbW9kZV9zaGlmdCA9IDUsCisJCS5uX3ZhbF9zaGlmdCA9IDE2LAorCQkubV92YWxfc2hpZnQgPSAxNiwKKwkJLndpZHRoID0gOCwKKwl9LAorCS5wID0geworCQkucHJlX2Rpdl9zaGlmdCA9IDMsCisJCS5wcmVfZGl2X3dpZHRoID0gMiwKKwl9LAorCS5zID0geworCQkuc3JjX3NlbF9zaGlmdCA9IDAsCisJCS5wYXJlbnRfbWFwID0gZ2NjX2N4b19tYXAsCisJfSwKKwkuZnJlcV90YmwgPSBjbGtfdGJsX2dwLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MmQ0NCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDExKSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImdwMV9zcmMiLAorCQkJLnBhcmVudF9uYW1lcyA9IGdjY19jeG8sCisJCQkubnVtX3BhcmVudHMgPSAxLAorCQkJLm9wcyA9ICZjbGtfcmNnX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9HQVRFLAorCQl9LAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBncDFfY2xrID0geworCS5oYWx0X3JlZyA9IDB4MmZkOCwKKwkuaGFsdF9iaXQgPSA2LAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MmQ0NCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDkpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAiZ3AxX2NsayIsCisJCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgImdwMV9zcmMiIH0sCisJCQkubnVtX3BhcmVudHMgPSAxLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3JjZyBncDJfc3JjID0geworCS5uc19yZWcgPSAweDJkNjQsCisJLm1kX3JlZyA9IDB4MmQ2MCwKKwkubW4gPSB7CisJCS5tbmN0cl9lbl9iaXQgPSA4LAorCQkubW5jdHJfcmVzZXRfYml0ID0gNywKKwkJLm1uY3RyX21vZGVfc2hpZnQgPSA1LAorCQkubl92YWxfc2hpZnQgPSAxNiwKKwkJLm1fdmFsX3NoaWZ0ID0gMTYsCisJCS53aWR0aCA9IDgsCisJfSwKKwkucCA9IHsKKwkJLnByZV9kaXZfc2hpZnQgPSAzLAorCQkucHJlX2Rpdl93aWR0aCA9IDIsCisJfSwKKwkucyA9IHsKKwkJLnNyY19zZWxfc2hpZnQgPSAwLAorCQkucGFyZW50X21hcCA9IGdjY19jeG9fbWFwLAorCX0sCisJLmZyZXFfdGJsID0gY2xrX3RibF9ncCwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDJkNjQsCisJCS5lbmFibGVfbWFzayA9IEJJVCgxMSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJncDJfc3JjIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSBnY2NfY3hvLAorCQkJLm51bV9wYXJlbnRzID0gMSwKKwkJCS5vcHMgPSAmY2xrX3JjZ19vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfR0FURSwKKwkJfSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggZ3AyX2NsayA9IHsKKwkuaGFsdF9yZWcgPSAweDJmZDgsCisJLmhhbHRfYml0ID0gNSwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDJkNjQsCisJCS5lbmFibGVfbWFzayA9IEJJVCg5KSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImdwMl9jbGsiLAorCQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJncDJfc3JjIiB9LAorCQkJLm51bV9wYXJlbnRzID0gMSwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfUEFSRU5ULAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggcG1lbV9jbGsgPSB7CisJLmh3Y2dfcmVnID0gMHgyNWEwLAorCS5od2NnX2JpdCA9IDYsCisJLmhhbHRfcmVnID0gMHgyZmM4LAorCS5oYWx0X2JpdCA9IDIwLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MjVhMCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDQpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAicG1lbV9jbGsiLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfcmNnIHBybmdfc3JjID0geworCS5uc19yZWcgPSAweDJlODAsCisJLnAgPSB7CisJCS5wcmVfZGl2X3NoaWZ0ID0gMywKKwkJLnByZV9kaXZfd2lkdGggPSA0LAorCX0sCisJLnMgPSB7CisJCS5zcmNfc2VsX3NoaWZ0ID0gMCwKKwkJLnBhcmVudF9tYXAgPSBnY2NfY3hvX3BsbDhfbWFwLAorCX0sCisJLmNsa3IgPSB7CisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJwcm5nX3NyYyIsCisJCQkucGFyZW50X25hbWVzID0gZ2NjX2N4b19wbGw4LAorCQkJLm51bV9wYXJlbnRzID0gMiwKKwkJCS5vcHMgPSAmY2xrX3JjZ19vcHMsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBwcm5nX2NsayA9IHsKKwkuaGFsdF9yZWcgPSAweDJmZDgsCisJLmhhbHRfY2hlY2sgPSBCUkFOQ0hfSEFMVF9WT1RFRCwKKwkuaGFsdF9iaXQgPSAxMCwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDMwODAsCisJCS5lbmFibGVfbWFzayA9IEJJVCgxMCksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJwcm5nX2NsayIsCisJCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgInBybmdfc3JjIiB9LAorCQkJLm51bV9wYXJlbnRzID0gMSwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZnJlcV90YmwgY2xrX3RibF9zZGNbXSA9IHsKKwl7ICAgIDE0NDAwMCwgUF9DWE8sICAgMSwgMSwgMTMzIH0sCisJeyAgICA0MDAwMDAsIFBfUExMOCwgIDQsIDEsIDI0MCB9LAorCXsgIDE2MDAwMDAwLCBQX1BMTDgsICA0LCAxLCAgIDYgfSwKKwl7ICAxNzA3MDAwMCwgUF9QTEw4LCAgMSwgMiwgIDQ1IH0sCisJeyAgMjAyMTAwMDAsIFBfUExMOCwgIDEsIDEsICAxOSB9LAorCXsgIDI0MDAwMDAwLCBQX1BMTDgsICA0LCAxLCAgIDQgfSwKKwl7ICAzODQwMDAwMCwgUF9QTEw4LCAgMiwgMSwgICA1IH0sCisJeyAgNDgwMDAwMDAsIFBfUExMOCwgIDQsIDEsICAgMiB9LAorCXsgIDY0MDAwMDAwLCBQX1BMTDgsICAzLCAxLCAgIDIgfSwKKwl7ICA3NjgwMDAwMCwgUF9QTEw4LCAgMSwgMSwgICA1IH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGNsa19yY2cgc2RjMV9zcmMgPSB7CisJLm5zX3JlZyA9IDB4MjgyYywKKwkubWRfcmVnID0gMHgyODI4LAorCS5tbiA9IHsKKwkJLm1uY3RyX2VuX2JpdCA9IDgsCisJCS5tbmN0cl9yZXNldF9iaXQgPSA3LAorCQkubW5jdHJfbW9kZV9zaGlmdCA9IDUsCisJCS5uX3ZhbF9zaGlmdCA9IDE2LAorCQkubV92YWxfc2hpZnQgPSAxNiwKKwkJLndpZHRoID0gOCwKKwl9LAorCS5wID0geworCQkucHJlX2Rpdl9zaGlmdCA9IDMsCisJCS5wcmVfZGl2X3dpZHRoID0gMiwKKwl9LAorCS5zID0geworCQkuc3JjX3NlbF9zaGlmdCA9IDAsCisJCS5wYXJlbnRfbWFwID0gZ2NjX2N4b19wbGw4X21hcCwKKwl9LAorCS5mcmVxX3RibCA9IGNsa190Ymxfc2RjLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MjgyYywKKwkJLmVuYWJsZV9tYXNrID0gQklUKDExKSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gInNkYzFfc3JjIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSBnY2NfY3hvX3BsbDgsCisJCQkubnVtX3BhcmVudHMgPSAyLAorCQkJLm9wcyA9ICZjbGtfcmNnX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9HQVRFLAorCQl9LAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBzZGMxX2NsayA9IHsKKwkuaGFsdF9yZWcgPSAweDJmYzgsCisJLmhhbHRfYml0ID0gNiwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDI4MmMsCisJCS5lbmFibGVfbWFzayA9IEJJVCg5KSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gInNkYzFfY2xrIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAic2RjMV9zcmMiIH0sCisJCQkubnVtX3BhcmVudHMgPSAxLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3JjZyBzZGMyX3NyYyA9IHsKKwkubnNfcmVnID0gMHgyODRjLAorCS5tZF9yZWcgPSAweDI4NDgsCisJLm1uID0geworCQkubW5jdHJfZW5fYml0ID0gOCwKKwkJLm1uY3RyX3Jlc2V0X2JpdCA9IDcsCisJCS5tbmN0cl9tb2RlX3NoaWZ0ID0gNSwKKwkJLm5fdmFsX3NoaWZ0ID0gMTYsCisJCS5tX3ZhbF9zaGlmdCA9IDE2LAorCQkud2lkdGggPSA4LAorCX0sCisJLnAgPSB7CisJCS5wcmVfZGl2X3NoaWZ0ID0gMywKKwkJLnByZV9kaXZfd2lkdGggPSAyLAorCX0sCisJLnMgPSB7CisJCS5zcmNfc2VsX3NoaWZ0ID0gMCwKKwkJLnBhcmVudF9tYXAgPSBnY2NfY3hvX3BsbDhfbWFwLAorCX0sCisJLmZyZXFfdGJsID0gY2xrX3RibF9zZGMsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyODRjLAorCQkuZW5hYmxlX21hc2sgPSBCSVQoMTEpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAic2RjMl9zcmMiLAorCQkJLnBhcmVudF9uYW1lcyA9IGdjY19jeG9fcGxsOCwKKwkJCS5udW1fcGFyZW50cyA9IDIsCisJCQkub3BzID0gJmNsa19yY2dfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX0dBVEUsCisJCX0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIHNkYzJfY2xrID0geworCS5oYWx0X3JlZyA9IDB4MmZjOCwKKwkuaGFsdF9iaXQgPSA1LAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4Mjg0YywKKwkJLmVuYWJsZV9tYXNrID0gQklUKDkpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAic2RjMl9jbGsiLAorCQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJzZGMyX3NyYyIgfSwKKwkJCS5udW1fcGFyZW50cyA9IDEsCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX1BBUkVOVCwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmcmVxX3RibCBjbGtfdGJsX3VzYltdID0geworCXsgNjAwMDAwMDAsIFBfUExMOCwgMSwgNSwgMzIgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3JjZyB1c2JfaHMxX3hjdnJfc3JjID0geworCS5uc19yZWcgPSAweDI5MGMsCisJLm1kX3JlZyA9IDB4MjkwOCwKKwkubW4gPSB7CisJCS5tbmN0cl9lbl9iaXQgPSA4LAorCQkubW5jdHJfcmVzZXRfYml0ID0gNywKKwkJLm1uY3RyX21vZGVfc2hpZnQgPSA1LAorCQkubl92YWxfc2hpZnQgPSAxNiwKKwkJLm1fdmFsX3NoaWZ0ID0gMTYsCisJCS53aWR0aCA9IDgsCisJfSwKKwkucCA9IHsKKwkJLnByZV9kaXZfc2hpZnQgPSAzLAorCQkucHJlX2Rpdl93aWR0aCA9IDIsCisJfSwKKwkucyA9IHsKKwkJLnNyY19zZWxfc2hpZnQgPSAwLAorCQkucGFyZW50X21hcCA9IGdjY19jeG9fcGxsOF9tYXAsCisJfSwKKwkuZnJlcV90YmwgPSBjbGtfdGJsX3VzYiwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDI5MGMsCisJCS5lbmFibGVfbWFzayA9IEJJVCgxMSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJ1c2JfaHMxX3hjdnJfc3JjIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSBnY2NfY3hvX3BsbDgsCisJCQkubnVtX3BhcmVudHMgPSAyLAorCQkJLm9wcyA9ICZjbGtfcmNnX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9HQVRFLAorCQl9LAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCB1c2JfaHMxX3hjdnJfY2xrID0geworCS5oYWx0X3JlZyA9IDB4MmZjOCwKKwkuaGFsdF9iaXQgPSAwLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MjkwYywKKwkJLmVuYWJsZV9tYXNrID0gQklUKDkpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAidXNiX2hzMV94Y3ZyX2NsayIsCisJCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgInVzYl9oczFfeGN2cl9zcmMiIH0sCisJCQkubnVtX3BhcmVudHMgPSAxLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3JjZyB1c2JfaHNpY194Y3ZyX2ZzX3NyYyA9IHsKKwkubnNfcmVnID0gMHgyOTI4LAorCS5tZF9yZWcgPSAweDI5MjQsCisJLm1uID0geworCQkubW5jdHJfZW5fYml0ID0gOCwKKwkJLm1uY3RyX3Jlc2V0X2JpdCA9IDcsCisJCS5tbmN0cl9tb2RlX3NoaWZ0ID0gNSwKKwkJLm5fdmFsX3NoaWZ0ID0gMTYsCisJCS5tX3ZhbF9zaGlmdCA9IDE2LAorCQkud2lkdGggPSA4LAorCX0sCisJLnAgPSB7CisJCS5wcmVfZGl2X3NoaWZ0ID0gMywKKwkJLnByZV9kaXZfd2lkdGggPSAyLAorCX0sCisJLnMgPSB7CisJCS5zcmNfc2VsX3NoaWZ0ID0gMCwKKwkJLnBhcmVudF9tYXAgPSBnY2NfY3hvX3BsbDhfbWFwLAorCX0sCisJLmZyZXFfdGJsID0gY2xrX3RibF91c2IsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyOTI4LAorCQkuZW5hYmxlX21hc2sgPSBCSVQoMTEpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAidXNiX2hzaWNfeGN2cl9mc19zcmMiLAorCQkJLnBhcmVudF9uYW1lcyA9IGdjY19jeG9fcGxsOCwKKwkJCS5udW1fcGFyZW50cyA9IDIsCisJCQkub3BzID0gJmNsa19yY2dfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX0dBVEUsCisJCX0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIHVzYl9oc2ljX3hjdnJfZnNfY2xrID0geworCS5oYWx0X3JlZyA9IDB4MmZjOCwKKwkuaGFsdF9iaXQgPSA5LAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MjkyOCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDkpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAidXNiX2hzaWNfeGN2cl9mc19jbGsiLAorCQkJLnBhcmVudF9uYW1lcyA9CisJCQkJKGNvbnN0IGNoYXIgKltdKXsgInVzYl9oc2ljX3hjdnJfZnNfc3JjIiB9LAorCQkJLm51bV9wYXJlbnRzID0gMSwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfUEFSRU5ULAorCQl9LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZyZXFfdGJsIGNsa190YmxfdXNiX2hzMV9zeXN0ZW1bXSA9IHsKKwl7IDYwMDAwMDAwLCBQX1BMTDgsIDEsIDUsIDMyIH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGNsa19yY2cgdXNiX2hzMV9zeXN0ZW1fc3JjID0geworCS5uc19yZWcgPSAweDM2YTQsCisJLm1kX3JlZyA9IDB4MzZhMCwKKwkubW4gPSB7CisJCS5tbmN0cl9lbl9iaXQgPSA4LAorCQkubW5jdHJfcmVzZXRfYml0ID0gNywKKwkJLm1uY3RyX21vZGVfc2hpZnQgPSA1LAorCQkubl92YWxfc2hpZnQgPSAxNiwKKwkJLm1fdmFsX3NoaWZ0ID0gMTYsCisJCS53aWR0aCA9IDgsCisJfSwKKwkucCA9IHsKKwkJLnByZV9kaXZfc2hpZnQgPSAzLAorCQkucHJlX2Rpdl93aWR0aCA9IDIsCisJfSwKKwkucyA9IHsKKwkJLnNyY19zZWxfc2hpZnQgPSAwLAorCQkucGFyZW50X21hcCA9IGdjY19jeG9fcGxsOF9tYXAsCisJfSwKKwkuZnJlcV90YmwgPSBjbGtfdGJsX3VzYl9oczFfc3lzdGVtLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MzZhNCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDExKSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gInVzYl9oczFfc3lzdGVtX3NyYyIsCisJCQkucGFyZW50X25hbWVzID0gZ2NjX2N4b19wbGw4LAorCQkJLm51bV9wYXJlbnRzID0gMiwKKwkJCS5vcHMgPSAmY2xrX3JjZ19vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfR0FURSwKKwkJfSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggdXNiX2hzMV9zeXN0ZW1fY2xrID0geworCS5oYWx0X3JlZyA9IDB4MmZjOCwKKwkuaGFsdF9iaXQgPSA0LAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MzZhNCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDkpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLnBhcmVudF9uYW1lcyA9CisJCQkJKGNvbnN0IGNoYXIgKltdKXsgInVzYl9oczFfc3lzdGVtX3NyYyIgfSwKKwkJCS5udW1fcGFyZW50cyA9IDEsCisJCQkubmFtZSA9ICJ1c2JfaHMxX3N5c3RlbV9jbGsiLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQgfCBDTEtfSUdOT1JFX1VOVVNFRCwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmcmVxX3RibCBjbGtfdGJsX3VzYl9oc2ljX3N5c3RlbVtdID0geworCXsgNjQwMDAwMDAsIFBfUExMOCwgMSwgMSwgNiB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfcmNnIHVzYl9oc2ljX3N5c3RlbV9zcmMgPSB7CisJLm5zX3JlZyA9IDB4MmI1OCwKKwkubWRfcmVnID0gMHgyYjU0LAorCS5tbiA9IHsKKwkJLm1uY3RyX2VuX2JpdCA9IDgsCisJCS5tbmN0cl9yZXNldF9iaXQgPSA3LAorCQkubW5jdHJfbW9kZV9zaGlmdCA9IDUsCisJCS5uX3ZhbF9zaGlmdCA9IDE2LAorCQkubV92YWxfc2hpZnQgPSAxNiwKKwkJLndpZHRoID0gOCwKKwl9LAorCS5wID0geworCQkucHJlX2Rpdl9zaGlmdCA9IDMsCisJCS5wcmVfZGl2X3dpZHRoID0gMiwKKwl9LAorCS5zID0geworCQkuc3JjX3NlbF9zaGlmdCA9IDAsCisJCS5wYXJlbnRfbWFwID0gZ2NjX2N4b19wbGw4X21hcCwKKwl9LAorCS5mcmVxX3RibCA9IGNsa190YmxfdXNiX2hzaWNfc3lzdGVtLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MmI1OCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDExKSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gInVzYl9oc2ljX3N5c3RlbV9zcmMiLAorCQkJLnBhcmVudF9uYW1lcyA9IGdjY19jeG9fcGxsOCwKKwkJCS5udW1fcGFyZW50cyA9IDIsCisJCQkub3BzID0gJmNsa19yY2dfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX0dBVEUsCisJCX0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIHVzYl9oc2ljX3N5c3RlbV9jbGsgPSB7CisJLmhhbHRfcmVnID0gMHgyZmM4LAorCS5oYWx0X2JpdCA9IDcsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyYjU4LAorCQkuZW5hYmxlX21hc2sgPSBCSVQoOSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkucGFyZW50X25hbWVzID0KKwkJCQkoY29uc3QgY2hhciAqW10peyAidXNiX2hzaWNfc3lzdGVtX3NyYyIgfSwKKwkJCS5udW1fcGFyZW50cyA9IDEsCisJCQkubmFtZSA9ICJ1c2JfaHNpY19zeXN0ZW1fY2xrIiwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfUEFSRU5ULAorCQl9LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZyZXFfdGJsIGNsa190YmxfdXNiX2hzaWNfaHNpY1tdID0geworCXsgNDgwMDAwMDAsIFBfUExMMTQsIDEsIDAsIDAgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3JjZyB1c2JfaHNpY19oc2ljX3NyYyA9IHsKKwkubnNfcmVnID0gMHgyYjUwLAorCS5tZF9yZWcgPSAweDJiNGMsCisJLm1uID0geworCQkubW5jdHJfZW5fYml0ID0gOCwKKwkJLm1uY3RyX3Jlc2V0X2JpdCA9IDcsCisJCS5tbmN0cl9tb2RlX3NoaWZ0ID0gNSwKKwkJLm5fdmFsX3NoaWZ0ID0gMTYsCisJCS5tX3ZhbF9zaGlmdCA9IDE2LAorCQkud2lkdGggPSA4LAorCX0sCisJLnAgPSB7CisJCS5wcmVfZGl2X3NoaWZ0ID0gMywKKwkJLnByZV9kaXZfd2lkdGggPSAyLAorCX0sCisJLnMgPSB7CisJCS5zcmNfc2VsX3NoaWZ0ID0gMCwKKwkJLnBhcmVudF9tYXAgPSBnY2NfY3hvX3BsbDE0X21hcCwKKwl9LAorCS5mcmVxX3RibCA9IGNsa190YmxfdXNiX2hzaWNfaHNpYywKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDJiNTAsCisJCS5lbmFibGVfbWFzayA9IEJJVCgxMSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJ1c2JfaHNpY19oc2ljX3NyYyIsCisJCQkucGFyZW50X25hbWVzID0gZ2NjX2N4b19wbGwxNCwKKwkJCS5udW1fcGFyZW50cyA9IDIsCisJCQkub3BzID0gJmNsa19yY2dfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX0dBVEUsCisJCX0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIHVzYl9oc2ljX2hzaWNfY2xrID0geworCS5oYWx0X2NoZWNrID0gQlJBTkNIX0hBTFRfREVMQVksCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyYjUwLAorCQkuZW5hYmxlX21hc2sgPSBCSVQoOSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkucGFyZW50X25hbWVzID0gKGNvbnN0IGNoYXIgKltdKXsgInVzYl9oc2ljX2hzaWNfc3JjIiB9LAorCQkJLm51bV9wYXJlbnRzID0gMSwKKwkJCS5uYW1lID0gInVzYl9oc2ljX2hzaWNfY2xrIiwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfUEFSRU5ULAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggdXNiX2hzaWNfaHNpb19jYWxfY2xrID0geworCS5oYWx0X3JlZyA9IDB4MmZjOCwKKwkuaGFsdF9iaXQgPSA4LAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MmI0OCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDApLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJjeG8iIH0sCisJCQkubnVtX3BhcmVudHMgPSAxLAorCQkJLm5hbWUgPSAidXNiX2hzaWNfaHNpb19jYWxfY2xrIiwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBjZTFfY29yZV9jbGsgPSB7CisJLmh3Y2dfcmVnID0gMHgyNzI0LAorCS5od2NnX2JpdCA9IDYsCisJLmhhbHRfcmVnID0gMHgyZmQ0LAorCS5oYWx0X2JpdCA9IDI3LAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MjcyNCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDQpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAiY2UxX2NvcmVfY2xrIiwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBjZTFfaF9jbGsgPSB7CisJLmhhbHRfcmVnID0gMHgyZmQ0LAorCS5oYWx0X2JpdCA9IDEsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyNzIwLAorCQkuZW5hYmxlX21hc2sgPSBCSVQoNCksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJjZTFfaF9jbGsiLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIGRtYV9iYW1faF9jbGsgPSB7CisJLmh3Y2dfcmVnID0gMHgyNWMwLAorCS5od2NnX2JpdCA9IDYsCisJLmhhbHRfcmVnID0gMHgyZmM4LAorCS5oYWx0X2JpdCA9IDEyLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MjVjMCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDQpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAiZG1hX2JhbV9oX2NsayIsCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggZ3NiaTFfaF9jbGsgPSB7CisJLmh3Y2dfcmVnID0gMHgyOWMwLAorCS5od2NnX2JpdCA9IDYsCisJLmhhbHRfcmVnID0gMHgyZmNjLAorCS5oYWx0X2JpdCA9IDExLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MjljMCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDQpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAiZ3NiaTFfaF9jbGsiLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIGdzYmkyX2hfY2xrID0geworCS5od2NnX3JlZyA9IDB4MjllMCwKKwkuaHdjZ19iaXQgPSA2LAorCS5oYWx0X3JlZyA9IDB4MmZjYywKKwkuaGFsdF9iaXQgPSA3LAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MjllMCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDQpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAiZ3NiaTJfaF9jbGsiLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIGdzYmkzX2hfY2xrID0geworCS5od2NnX3JlZyA9IDB4MmEwMCwKKwkuaHdjZ19iaXQgPSA2LAorCS5oYWx0X3JlZyA9IDB4MmZjYywKKwkuaGFsdF9iaXQgPSAzLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MmEwMCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDQpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAiZ3NiaTNfaF9jbGsiLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIGdzYmk0X2hfY2xrID0geworCS5od2NnX3JlZyA9IDB4MmEyMCwKKwkuaHdjZ19iaXQgPSA2LAorCS5oYWx0X3JlZyA9IDB4MmZkMCwKKwkuaGFsdF9iaXQgPSAyNywKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDJhMjAsCisJCS5lbmFibGVfbWFzayA9IEJJVCg0KSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImdzYmk0X2hfY2xrIiwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBnc2JpNV9oX2NsayA9IHsKKwkuaHdjZ19yZWcgPSAweDJhNDAsCisJLmh3Y2dfYml0ID0gNiwKKwkuaGFsdF9yZWcgPSAweDJmZDAsCisJLmhhbHRfYml0ID0gMjMsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgyYTQwLAorCQkuZW5hYmxlX21hc2sgPSBCSVQoNCksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJnc2JpNV9oX2NsayIsCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggdXNiX2hzMV9oX2NsayA9IHsKKwkuaHdjZ19yZWcgPSAweDI5MDAsCisJLmh3Y2dfYml0ID0gNiwKKwkuaGFsdF9yZWcgPSAweDJmYzgsCisJLmhhbHRfYml0ID0gMSwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDI5MDAsCisJCS5lbmFibGVfbWFzayA9IEJJVCg0KSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gInVzYl9oczFfaF9jbGsiLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIHVzYl9oc2ljX2hfY2xrID0geworCS5oYWx0X3JlZyA9IDB4MmZjYywKKwkuaGFsdF9iaXQgPSAyOCwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDI5MjAsCisJCS5lbmFibGVfbWFzayA9IEJJVCg0KSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gInVzYl9oc2ljX2hfY2xrIiwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBzZGMxX2hfY2xrID0geworCS5od2NnX3JlZyA9IDB4MjgyMCwKKwkuaHdjZ19iaXQgPSA2LAorCS5oYWx0X3JlZyA9IDB4MmZjOCwKKwkuaGFsdF9iaXQgPSAxMSwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDI4MjAsCisJCS5lbmFibGVfbWFzayA9IEJJVCg0KSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gInNkYzFfaF9jbGsiLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIHNkYzJfaF9jbGsgPSB7CisJLmh3Y2dfcmVnID0gMHgyODQwLAorCS5od2NnX2JpdCA9IDYsCisJLmhhbHRfcmVnID0gMHgyZmM4LAorCS5oYWx0X2JpdCA9IDEwLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4Mjg0MCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDQpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAic2RjMl9oX2NsayIsCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggYWRtMF9jbGsgPSB7CisJLmhhbHRfcmVnID0gMHgyZmRjLAorCS5oYWx0X2NoZWNrID0gQlJBTkNIX0hBTFRfVk9URUQsCisJLmhhbHRfYml0ID0gMTQsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHgzMDgwLAorCQkuZW5hYmxlX21hc2sgPSBCSVQoMiksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJhZG0wX2NsayIsCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggYWRtMF9wYnVzX2NsayA9IHsKKwkuaHdjZ19yZWcgPSAweDIyMDgsCisJLmh3Y2dfYml0ID0gNiwKKwkuaGFsdF9yZWcgPSAweDJmZGMsCisJLmhhbHRfY2hlY2sgPSBCUkFOQ0hfSEFMVF9WT1RFRCwKKwkuaGFsdF9iaXQgPSAxMywKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDMwODAsCisJCS5lbmFibGVfbWFzayA9IEJJVCgzKSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gImFkbTBfcGJ1c19jbGsiLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIHBtaWNfYXJiMF9oX2NsayA9IHsKKwkuaGFsdF9yZWcgPSAweDJmZDgsCisJLmhhbHRfY2hlY2sgPSBCUkFOQ0hfSEFMVF9WT1RFRCwKKwkuaGFsdF9iaXQgPSAyMiwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDMwODAsCisJCS5lbmFibGVfbWFzayA9IEJJVCg4KSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gInBtaWNfYXJiMF9oX2NsayIsCisJCQkub3BzID0gJmNsa19icmFuY2hfb3BzLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggcG1pY19hcmIxX2hfY2xrID0geworCS5oYWx0X3JlZyA9IDB4MmZkOCwKKwkuaGFsdF9jaGVjayA9IEJSQU5DSF9IQUxUX1ZPVEVELAorCS5oYWx0X2JpdCA9IDIxLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4MzA4MCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDkpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAicG1pY19hcmIxX2hfY2xrIiwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBwbWljX3NzYmkyX2NsayA9IHsKKwkuaGFsdF9yZWcgPSAweDJmZDgsCisJLmhhbHRfY2hlY2sgPSBCUkFOQ0hfSEFMVF9WT1RFRCwKKwkuaGFsdF9iaXQgPSAyMywKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDMwODAsCisJCS5lbmFibGVfbWFzayA9IEJJVCg3KSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gInBtaWNfc3NiaTJfY2xrIiwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBycG1fbXNnX3JhbV9oX2NsayA9IHsKKwkuaHdjZ19yZWcgPSAweDI3ZTAsCisJLmh3Y2dfYml0ID0gNiwKKwkuaGFsdF9yZWcgPSAweDJmZDgsCisJLmhhbHRfY2hlY2sgPSBCUkFOQ0hfSEFMVF9WT1RFRCwKKwkuaGFsdF9iaXQgPSAxMiwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDMwODAsCisJCS5lbmFibGVfbWFzayA9IEJJVCg2KSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gInJwbV9tc2dfcmFtX2hfY2xrIiwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICpnY2NfbWRtOTYxNV9od3NbXSA9IHsKKwkmY3hvLmh3LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfcmVnbWFwICpnY2NfbWRtOTYxNV9jbGtzW10gPSB7CisJW1BMTDBdID0gJnBsbDAuY2xrciwKKwlbUExMMF9WT1RFXSA9ICZwbGwwX3ZvdGUsCisJW1BMTDRfVk9URV0gPSAmcGxsNF92b3RlLAorCVtQTEw4XSA9ICZwbGw4LmNsa3IsCisJW1BMTDhfVk9URV0gPSAmcGxsOF92b3RlLAorCVtQTEwxNF0gPSAmcGxsMTQuY2xrciwKKwlbUExMMTRfVk9URV0gPSAmcGxsMTRfdm90ZSwKKwlbR1NCSTFfVUFSVF9TUkNdID0gJmdzYmkxX3VhcnRfc3JjLmNsa3IsCisJW0dTQkkxX1VBUlRfQ0xLXSA9ICZnc2JpMV91YXJ0X2Nsay5jbGtyLAorCVtHU0JJMl9VQVJUX1NSQ10gPSAmZ3NiaTJfdWFydF9zcmMuY2xrciwKKwlbR1NCSTJfVUFSVF9DTEtdID0gJmdzYmkyX3VhcnRfY2xrLmNsa3IsCisJW0dTQkkzX1VBUlRfU1JDXSA9ICZnc2JpM191YXJ0X3NyYy5jbGtyLAorCVtHU0JJM19VQVJUX0NMS10gPSAmZ3NiaTNfdWFydF9jbGsuY2xrciwKKwlbR1NCSTRfVUFSVF9TUkNdID0gJmdzYmk0X3VhcnRfc3JjLmNsa3IsCisJW0dTQkk0X1VBUlRfQ0xLXSA9ICZnc2JpNF91YXJ0X2Nsay5jbGtyLAorCVtHU0JJNV9VQVJUX1NSQ10gPSAmZ3NiaTVfdWFydF9zcmMuY2xrciwKKwlbR1NCSTVfVUFSVF9DTEtdID0gJmdzYmk1X3VhcnRfY2xrLmNsa3IsCisJW0dTQkkxX1FVUF9TUkNdID0gJmdzYmkxX3F1cF9zcmMuY2xrciwKKwlbR1NCSTFfUVVQX0NMS10gPSAmZ3NiaTFfcXVwX2Nsay5jbGtyLAorCVtHU0JJMl9RVVBfU1JDXSA9ICZnc2JpMl9xdXBfc3JjLmNsa3IsCisJW0dTQkkyX1FVUF9DTEtdID0gJmdzYmkyX3F1cF9jbGsuY2xrciwKKwlbR1NCSTNfUVVQX1NSQ10gPSAmZ3NiaTNfcXVwX3NyYy5jbGtyLAorCVtHU0JJM19RVVBfQ0xLXSA9ICZnc2JpM19xdXBfY2xrLmNsa3IsCisJW0dTQkk0X1FVUF9TUkNdID0gJmdzYmk0X3F1cF9zcmMuY2xrciwKKwlbR1NCSTRfUVVQX0NMS10gPSAmZ3NiaTRfcXVwX2Nsay5jbGtyLAorCVtHU0JJNV9RVVBfU1JDXSA9ICZnc2JpNV9xdXBfc3JjLmNsa3IsCisJW0dTQkk1X1FVUF9DTEtdID0gJmdzYmk1X3F1cF9jbGsuY2xrciwKKwlbR1AwX1NSQ10gPSAmZ3AwX3NyYy5jbGtyLAorCVtHUDBfQ0xLXSA9ICZncDBfY2xrLmNsa3IsCisJW0dQMV9TUkNdID0gJmdwMV9zcmMuY2xrciwKKwlbR1AxX0NMS10gPSAmZ3AxX2Nsay5jbGtyLAorCVtHUDJfU1JDXSA9ICZncDJfc3JjLmNsa3IsCisJW0dQMl9DTEtdID0gJmdwMl9jbGsuY2xrciwKKwlbUE1FTV9BX0NMS10gPSAmcG1lbV9jbGsuY2xrciwKKwlbUFJOR19TUkNdID0gJnBybmdfc3JjLmNsa3IsCisJW1BSTkdfQ0xLXSA9ICZwcm5nX2Nsay5jbGtyLAorCVtTREMxX1NSQ10gPSAmc2RjMV9zcmMuY2xrciwKKwlbU0RDMV9DTEtdID0gJnNkYzFfY2xrLmNsa3IsCisJW1NEQzJfU1JDXSA9ICZzZGMyX3NyYy5jbGtyLAorCVtTREMyX0NMS10gPSAmc2RjMl9jbGsuY2xrciwKKwlbVVNCX0hTMV9YQ1ZSX1NSQ10gPSAmdXNiX2hzMV94Y3ZyX3NyYy5jbGtyLAorCVtVU0JfSFMxX1hDVlJfQ0xLXSA9ICZ1c2JfaHMxX3hjdnJfY2xrLmNsa3IsCisJW1VTQl9IUzFfU1lTVEVNX0NMS19TUkNdID0gJnVzYl9oczFfc3lzdGVtX3NyYy5jbGtyLAorCVtVU0JfSFMxX1NZU1RFTV9DTEtdID0gJnVzYl9oczFfc3lzdGVtX2Nsay5jbGtyLAorCVtVU0JfSFNJQ19YQ1ZSX0ZTX1NSQ10gPSAmdXNiX2hzaWNfeGN2cl9mc19zcmMuY2xrciwKKwlbVVNCX0hTSUNfWENWUl9GU19DTEtdID0gJnVzYl9oc2ljX3hjdnJfZnNfY2xrLmNsa3IsCisJW1VTQl9IU0lDX1NZU1RFTV9DTEtfU1JDXSA9ICZ1c2JfaHNpY19zeXN0ZW1fc3JjLmNsa3IsCisJW1VTQl9IU0lDX1NZU1RFTV9DTEtdID0gJnVzYl9oc2ljX3N5c3RlbV9jbGsuY2xrciwKKwlbVVNCX0hTSUNfSFNJQ19DTEtfU1JDXSA9ICZ1c2JfaHNpY19oc2ljX3NyYy5jbGtyLAorCVtVU0JfSFNJQ19IU0lDX0NMS10gPSAmdXNiX2hzaWNfaHNpY19jbGsuY2xrciwKKwlbVVNCX0hTSUNfSFNJT19DQUxfQ0xLXSA9ICZ1c2JfaHNpY19oc2lvX2NhbF9jbGsuY2xrciwKKwlbQ0UxX0NPUkVfQ0xLXSA9ICZjZTFfY29yZV9jbGsuY2xrciwKKwlbQ0UxX0hfQ0xLXSA9ICZjZTFfaF9jbGsuY2xrciwKKwlbRE1BX0JBTV9IX0NMS10gPSAmZG1hX2JhbV9oX2Nsay5jbGtyLAorCVtHU0JJMV9IX0NMS10gPSAmZ3NiaTFfaF9jbGsuY2xrciwKKwlbR1NCSTJfSF9DTEtdID0gJmdzYmkyX2hfY2xrLmNsa3IsCisJW0dTQkkzX0hfQ0xLXSA9ICZnc2JpM19oX2Nsay5jbGtyLAorCVtHU0JJNF9IX0NMS10gPSAmZ3NiaTRfaF9jbGsuY2xrciwKKwlbR1NCSTVfSF9DTEtdID0gJmdzYmk1X2hfY2xrLmNsa3IsCisJW1VTQl9IUzFfSF9DTEtdID0gJnVzYl9oczFfaF9jbGsuY2xrciwKKwlbVVNCX0hTSUNfSF9DTEtdID0gJnVzYl9oc2ljX2hfY2xrLmNsa3IsCisJW1NEQzFfSF9DTEtdID0gJnNkYzFfaF9jbGsuY2xrciwKKwlbU0RDMl9IX0NMS10gPSAmc2RjMl9oX2Nsay5jbGtyLAorCVtBRE0wX0NMS10gPSAmYWRtMF9jbGsuY2xrciwKKwlbQURNMF9QQlVTX0NMS10gPSAmYWRtMF9wYnVzX2Nsay5jbGtyLAorCVtQTUlDX0FSQjBfSF9DTEtdID0gJnBtaWNfYXJiMF9oX2Nsay5jbGtyLAorCVtQTUlDX0FSQjFfSF9DTEtdID0gJnBtaWNfYXJiMV9oX2Nsay5jbGtyLAorCVtQTUlDX1NTQkkyX0NMS10gPSAmcG1pY19zc2JpMl9jbGsuY2xrciwKKwlbUlBNX01TR19SQU1fSF9DTEtdID0gJnJwbV9tc2dfcmFtX2hfY2xrLmNsa3IsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHFjb21fcmVzZXRfbWFwIGdjY19tZG05NjE1X3Jlc2V0c1tdID0geworCVtETUFfQkFNX1JFU0VUXSA9IHsgMHgyNWMwLCA3IH0sCisJW0NFMV9IX1JFU0VUXSA9IHsgMHgyNzIwLCA3IH0sCisJW0NFMV9DT1JFX1JFU0VUXSA9IHsgMHgyNzI0LCA3IH0sCisJW1NEQzFfUkVTRVRdID0geyAweDI4MzAgfSwKKwlbU0RDMl9SRVNFVF0gPSB7IDB4Mjg1MCB9LAorCVtBRE0wX0MyX1JFU0VUXSA9IHsgMHgyMjBjLCA0IH0sCisJW0FETTBfQzFfUkVTRVRdID0geyAweDIyMGMsIDMgfSwKKwlbQURNMF9DMF9SRVNFVF0gPSB7IDB4MjIwYywgMiB9LAorCVtBRE0wX1BCVVNfUkVTRVRdID0geyAweDIyMGMsIDEgfSwKKwlbQURNMF9SRVNFVF0gPSB7IDB4MjIwYyB9LAorCVtVU0JfSFMxX1JFU0VUXSA9IHsgMHgyOTEwIH0sCisJW1VTQl9IU0lDX1JFU0VUXSA9IHsgMHgyOTM0IH0sCisJW0dTQkkxX1JFU0VUXSA9IHsgMHgyOWRjIH0sCisJW0dTQkkyX1JFU0VUXSA9IHsgMHgyOWZjIH0sCisJW0dTQkkzX1JFU0VUXSA9IHsgMHgyYTFjIH0sCisJW0dTQkk0X1JFU0VUXSA9IHsgMHgyYTNjIH0sCisJW0dTQkk1X1JFU0VUXSA9IHsgMHgyYTVjIH0sCisJW1BETV9SRVNFVF0gPSB7IDB4MkNDMCwgMTIgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBnY2NfbWRtOTYxNV9yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cwk9IDMyLAorCS5yZWdfc3RyaWRlCT0gNCwKKwkudmFsX2JpdHMJPSAzMiwKKwkubWF4X3JlZ2lzdGVyCT0gMHgzNjYwLAorCS5mYXN0X2lvCT0gdHJ1ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcWNvbV9jY19kZXNjIGdjY19tZG05NjE1X2Rlc2MgPSB7CisJLmNvbmZpZyA9ICZnY2NfbWRtOTYxNV9yZWdtYXBfY29uZmlnLAorCS5jbGtzID0gZ2NjX21kbTk2MTVfY2xrcywKKwkubnVtX2Nsa3MgPSBBUlJBWV9TSVpFKGdjY19tZG05NjE1X2Nsa3MpLAorCS5yZXNldHMgPSBnY2NfbWRtOTYxNV9yZXNldHMsCisJLm51bV9yZXNldHMgPSBBUlJBWV9TSVpFKGdjY19tZG05NjE1X3Jlc2V0cyksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBnY2NfbWRtOTYxNV9tYXRjaF90YWJsZVtdID0geworCXsgLmNvbXBhdGlibGUgPSAicWNvbSxnY2MtbWRtOTYxNSIgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBnY2NfbWRtOTYxNV9tYXRjaF90YWJsZSk7CisKK3N0YXRpYyBpbnQgZ2NjX21kbTk2MTVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKwlpbnQgcmV0OworCWludCBpOworCisJcmVnbWFwID0gcWNvbV9jY19tYXAocGRldiwgJmdjY19tZG05NjE1X2Rlc2MpOworCWlmIChJU19FUlIocmVnbWFwKSkKKwkJcmV0dXJuIFBUUl9FUlIocmVnbWFwKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGdjY19tZG05NjE1X2h3cyk7IGkrKykgeworCQlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcihkZXYsIGdjY19tZG05NjE1X2h3c1tpXSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBxY29tX2NjX3JlYWxseV9wcm9iZShwZGV2LCAmZ2NjX21kbTk2MTVfZGVzYywgcmVnbWFwKTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZ2NjX21kbTk2MTVfZHJpdmVyID0geworCS5wcm9iZQkJPSBnY2NfbWRtOTYxNV9wcm9iZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiZ2NjLW1kbTk2MTUiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBnY2NfbWRtOTYxNV9tYXRjaF90YWJsZSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgZ2NjX21kbTk2MTVfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmdjY19tZG05NjE1X2RyaXZlcik7Cit9Citjb3JlX2luaXRjYWxsKGdjY19tZG05NjE1X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgZ2NjX21kbTk2MTVfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZnY2NfbWRtOTYxNV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoZ2NjX21kbTk2MTVfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiUUNPTSBHQ0MgTURNOTYxNSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06Z2NjLW1kbTk2MTUiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3Fjb20vZ2NjLW1zbTg5OTYuYyBiL2RyaXZlcnMvY2xrL3Fjb20vZ2NjLW1zbTg5OTYuYwppbmRleCBiYmY3MzJiLi5mZTAzZTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9xY29tL2djYy1tc204OTk2LmMKKysrIGIvZHJpdmVycy9jbGsvcWNvbS9nY2MtbXNtODk5Ni5jCkBAIC0yNTkyLDkgKzI1OTIsOSBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIGdjY19wY2llXzJfcGlwZV9jbGsgPSB7Ci0JLmhhbHRfcmVnID0gMHg2ZTEwOCwKKwkuaGFsdF9yZWcgPSAweDZlMDE4LAogCS5jbGtyID0gewotCQkuZW5hYmxlX3JlZyA9IDB4NmUxMDgsCisJCS5lbmFibGVfcmVnID0gMHg2ZTAxOCwKIAkJLmVuYWJsZV9tYXNrID0gQklUKDApLAogCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpewogCQkJLm5hbWUgPSAiZ2NjX3BjaWVfMl9waXBlX2NsayIsCkBAIC0zMzI5LDYgKzMzMjksOCBAQAogCVtHQ0NfVVNCXzIwX0JDUl0gPSB7IDB4MTIwMDAgfSwKIAlbR0NDX1FVU0IyUEhZX1BSSU1fQkNSXSA9IHsgMHgxMjAzOCB9LAogCVtHQ0NfUVVTQjJQSFlfU0VDX0JDUl0gPSB7IDB4MTIwM2MgfSwKKwlbR0NDX1VTQjNfUEhZX0JDUl0gPSB7IDB4NTAwMjAgfSwKKwlbR0NDX1VTQjNQSFlfUEhZX0JDUl0gPSB7IDB4NTAwMjQgfSwKIAlbR0NDX1VTQl9QSFlfQ0ZHX0FIQjJQSFlfQkNSXSA9IHsgMHg2YTAwMCB9LAogCVtHQ0NfU0RDQzFfQkNSXSA9IHsgMHgxMzAwMCB9LAogCVtHQ0NfU0RDQzJfQkNSXSA9IHsgMHgxNDAwMCB9LApAQCAtMzQwNCw2ICszNDA2LDggQEAKIAlbR0NDX1BDSUVfMl9CQ1JdID0geyAweDZlMDAwIH0sCiAJW0dDQ19QQ0lFXzJfUEhZX0JDUl0gPSB7IDB4NmUwMzggfSwKIAlbR0NDX1BDSUVfUEhZX0JDUl0gPSB7IDB4NmYwMDAgfSwKKwlbR0NDX1BDSUVfUEhZX0NPTV9CQ1JdID0geyAweDZmMDE0IH0sCisJW0dDQ19QQ0lFX1BIWV9DT01fTk9DU1JfQkNSXSA9IHsgMHg2ZjAwYyB9LAogCVtHQ0NfRENEX0JDUl0gPSB7IDB4NzAwMDAgfSwKIAlbR0NDX09CVF9PRFRfQkNSXSA9IHsgMHg3MzAwMCB9LAogCVtHQ0NfVUZTX0JDUl0gPSB7IDB4NzUwMDAgfSwKQEAgLTM0NDcsOSArMzQ1MSw4IEBACiAKIHN0YXRpYyBpbnQgZ2NjX21zbTg5OTZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgY2xrICpjbGs7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKLQlpbnQgaTsKKwlpbnQgaSwgcmV0OwogCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKIAogCXJlZ21hcCA9IHFjb21fY2NfbWFwKHBkZXYsICZnY2NfbXNtODk5Nl9kZXNjKTsKQEAgLTM0NjMsOSArMzQ2Niw5IEBACiAJcmVnbWFwX3VwZGF0ZV9iaXRzKHJlZ21hcCwgMHg1MjAwOCwgQklUKDIxKSwgQklUKDIxKSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShnY2NfbXNtODk5Nl9od3MpOyBpKyspIHsKLQkJY2xrID0gZGV2bV9jbGtfcmVnaXN0ZXIoZGV2LCBnY2NfbXNtODk5Nl9od3NbaV0pOwotCQlpZiAoSVNfRVJSKGNsaykpCi0JCQlyZXR1cm4gUFRSX0VSUihjbGspOworCQlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcihkZXYsIGdjY19tc204OTk2X2h3c1tpXSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldHVybiBxY29tX2NjX3JlYWxseV9wcm9iZShwZGV2LCAmZ2NjX21zbTg5OTZfZGVzYywgcmVnbWFwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3Fjb20vbGNjLW1kbTk2MTUuYyBiL2RyaXZlcnMvY2xrL3Fjb20vbGNjLW1kbTk2MTUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjM3ZWY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbGsvcWNvbS9sY2MtbWRtOTYxNS5jCkBAIC0wLDAgKzEsNTgwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgQmF5TGlicmUsIFNBUy4KKyAqIEF1dGhvciA6IE5laWwgQXJtc3Ryb25nIDxuYXJtc3Ryb25nQGJheWxpYnJlLmNvbT4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svcWNvbSxsY2MtbWRtOTYxNS5oPgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiY2xrLXJlZ21hcC5oIgorI2luY2x1ZGUgImNsay1wbGwuaCIKKyNpbmNsdWRlICJjbGstcmNnLmgiCisjaW5jbHVkZSAiY2xrLWJyYW5jaC5oIgorI2luY2x1ZGUgImNsay1yZWdtYXAtZGl2aWRlci5oIgorI2luY2x1ZGUgImNsay1yZWdtYXAtbXV4LmgiCisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3BsbCBwbGw0ID0geworCS5sX3JlZyA9IDB4NCwKKwkubV9yZWcgPSAweDgsCisJLm5fcmVnID0gMHhjLAorCS5jb25maWdfcmVnID0gMHgxNCwKKwkubW9kZV9yZWcgPSAweDAsCisJLnN0YXR1c19yZWcgPSAweDE4LAorCS5zdGF0dXNfYml0ID0gMTYsCisJLmNsa3IuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkubmFtZSA9ICJwbGw0IiwKKwkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJjeG8iIH0sCisJCS5udW1fcGFyZW50cyA9IDEsCisJCS5vcHMgPSAmY2xrX3BsbF9vcHMsCisJfSwKK307CisKK2VudW0geworCVBfQ1hPLAorCVBfUExMNCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGFyZW50X21hcCBsY2NfY3hvX3BsbDRfbWFwW10gPSB7CisJeyBQX0NYTywgMCB9LAorCXsgUF9QTEw0LCAyIH0KK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbGNjX2N4b19wbGw0W10gPSB7CisJImN4byIsCisJInBsbDRfdm90ZSIsCit9OworCitzdGF0aWMgc3RydWN0IGZyZXFfdGJsIGNsa190YmxfYWlmX29zcl80OTJbXSA9IHsKKwl7ICAgNTEyMDAwLCBQX1BMTDQsIDQsIDEsIDI0MCB9LAorCXsgICA3NjgwMDAsIFBfUExMNCwgNCwgMSwgMTYwIH0sCisJeyAgMTAyNDAwMCwgUF9QTEw0LCA0LCAxLCAxMjAgfSwKKwl7ICAxNTM2MDAwLCBQX1BMTDQsIDQsIDEsICA4MCB9LAorCXsgIDIwNDgwMDAsIFBfUExMNCwgNCwgMSwgIDYwIH0sCisJeyAgMzA3MjAwMCwgUF9QTEw0LCA0LCAxLCAgNDAgfSwKKwl7ICA0MDk2MDAwLCBQX1BMTDQsIDQsIDEsICAzMCB9LAorCXsgIDYxNDQwMDAsIFBfUExMNCwgNCwgMSwgIDIwIH0sCisJeyAgODE5MjAwMCwgUF9QTEw0LCA0LCAxLCAgMTUgfSwKKwl7IDEyMjg4MDAwLCBQX1BMTDQsIDQsIDEsICAxMCB9LAorCXsgMjQ1NzYwMDAsIFBfUExMNCwgNCwgMSwgICA1IH0sCisJeyAyNzAwMDAwMCwgUF9DWE8sICAxLCAwLCAgIDAgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZnJlcV90YmwgY2xrX3RibF9haWZfb3NyXzM5M1tdID0geworCXsgICA1MTIwMDAsIFBfUExMNCwgNCwgMSwgMTkyIH0sCisJeyAgIDc2ODAwMCwgUF9QTEw0LCA0LCAxLCAxMjggfSwKKwl7ICAxMDI0MDAwLCBQX1BMTDQsIDQsIDEsICA5NiB9LAorCXsgIDE1MzYwMDAsIFBfUExMNCwgNCwgMSwgIDY0IH0sCisJeyAgMjA0ODAwMCwgUF9QTEw0LCA0LCAxLCAgNDggfSwKKwl7ICAzMDcyMDAwLCBQX1BMTDQsIDQsIDEsICAzMiB9LAorCXsgIDQwOTYwMDAsIFBfUExMNCwgNCwgMSwgIDI0IH0sCisJeyAgNjE0NDAwMCwgUF9QTEw0LCA0LCAxLCAgMTYgfSwKKwl7ICA4MTkyMDAwLCBQX1BMTDQsIDQsIDEsICAxMiB9LAorCXsgMTIyODgwMDAsIFBfUExMNCwgNCwgMSwgICA4IH0sCisJeyAyNDU3NjAwMCwgUF9QTEw0LCA0LCAxLCAgIDQgfSwKKwl7IDI3MDAwMDAwLCBQX0NYTywgIDEsIDAsICAgMCB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfcmNnIG1pMnNfb3NyX3NyYyA9IHsKKwkubnNfcmVnID0gMHg0OCwKKwkubWRfcmVnID0gMHg0YywKKwkubW4gPSB7CisJCS5tbmN0cl9lbl9iaXQgPSA4LAorCQkubW5jdHJfcmVzZXRfYml0ID0gNywKKwkJLm1uY3RyX21vZGVfc2hpZnQgPSA1LAorCQkubl92YWxfc2hpZnQgPSAyNCwKKwkJLm1fdmFsX3NoaWZ0ID0gOCwKKwkJLndpZHRoID0gOCwKKwl9LAorCS5wID0geworCQkucHJlX2Rpdl9zaGlmdCA9IDMsCisJCS5wcmVfZGl2X3dpZHRoID0gMiwKKwl9LAorCS5zID0geworCQkuc3JjX3NlbF9zaGlmdCA9IDAsCisJCS5wYXJlbnRfbWFwID0gbGNjX2N4b19wbGw0X21hcCwKKwl9LAorCS5mcmVxX3RibCA9IGNsa190YmxfYWlmX29zcl8zOTMsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHg0OCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDkpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAibWkyc19vc3Jfc3JjIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSBsY2NfY3hvX3BsbDQsCisJCQkubnVtX3BhcmVudHMgPSAyLAorCQkJLm9wcyA9ICZjbGtfcmNnX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9HQVRFLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxjY19taTJzX3BhcmVudHNbXSA9IHsKKwkibWkyc19vc3Jfc3JjIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBtaTJzX29zcl9jbGsgPSB7CisJLmhhbHRfcmVnID0gMHg1MCwKKwkuaGFsdF9iaXQgPSAxLAorCS5oYWx0X2NoZWNrID0gQlJBTkNIX0hBTFRfRU5BQkxFLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4NDgsCisJCS5lbmFibGVfbWFzayA9IEJJVCgxNyksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJtaTJzX29zcl9jbGsiLAorCQkJLnBhcmVudF9uYW1lcyA9IGxjY19taTJzX3BhcmVudHMsCisJCQkubnVtX3BhcmVudHMgPSAxLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3JlZ21hcF9kaXYgbWkyc19kaXZfY2xrID0geworCS5yZWcgPSAweDQ4LAorCS5zaGlmdCA9IDEwLAorCS53aWR0aCA9IDQsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHg0OCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDE1KSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gIm1pMnNfZGl2X2NsayIsCisJCQkucGFyZW50X25hbWVzID0gbGNjX21pMnNfcGFyZW50cywKKwkJCS5udW1fcGFyZW50cyA9IDEsCisJCQkub3BzID0gJmNsa19yZWdtYXBfZGl2X29wcywKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIG1pMnNfYml0X2Rpdl9jbGsgPSB7CisJLmhhbHRfcmVnID0gMHg1MCwKKwkuaGFsdF9iaXQgPSAwLAorCS5oYWx0X2NoZWNrID0gQlJBTkNIX0hBTFRfRU5BQkxFLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4NDgsCisJCS5lbmFibGVfbWFzayA9IEJJVCgxNSksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJtaTJzX2JpdF9kaXZfY2xrIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peyAibWkyc19kaXZfY2xrIiB9LAorCQkJLm51bV9wYXJlbnRzID0gMSwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfUEFSRU5ULAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19yZWdtYXBfbXV4IG1pMnNfYml0X2NsayA9IHsKKwkucmVnID0gMHg0OCwKKwkuc2hpZnQgPSAxNCwKKwkud2lkdGggPSAxLAorCS5jbGtyID0geworCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAibWkyc19iaXRfY2xrIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10peworCQkJCSJtaTJzX2JpdF9kaXZfY2xrIiwKKwkJCQkibWkyc19jb2RlY19jbGsiLAorCQkJfSwKKwkJCS5udW1fcGFyZW50cyA9IDIsCisJCQkub3BzID0gJmNsa19yZWdtYXBfbXV4X2Nsb3Nlc3Rfb3BzLAorCQkJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX1BBUkVOVCwKKwkJfSwKKwl9LAorfTsKKworI2RlZmluZSBDTEtfQUlGX09TUl9ESVYocHJlZml4LCBfbnMsIF9tZCwgaHIpCQkJXAorc3RhdGljIHN0cnVjdCBjbGtfcmNnIHByZWZpeCMjX29zcl9zcmMgPSB7CQkJXAorCS5uc19yZWcgPSBfbnMsCQkJCQkJXAorCS5tZF9yZWcgPSBfbWQsCQkJCQkJXAorCS5tbiA9IHsJCQkJCQkJXAorCQkubW5jdHJfZW5fYml0ID0gOCwJCQkJXAorCQkubW5jdHJfcmVzZXRfYml0ID0gNywJCQkJXAorCQkubW5jdHJfbW9kZV9zaGlmdCA9IDUsCQkJCVwKKwkJLm5fdmFsX3NoaWZ0ID0gMjQsCQkJCVwKKwkJLm1fdmFsX3NoaWZ0ID0gOCwJCQkJXAorCQkud2lkdGggPSA4LAkJCQkJXAorCX0sCQkJCQkJCVwKKwkucCA9IHsJCQkJCQkJXAorCQkucHJlX2Rpdl9zaGlmdCA9IDMsCQkJCVwKKwkJLnByZV9kaXZfd2lkdGggPSAyLAkJCQlcCisJfSwJCQkJCQkJXAorCS5zID0gewkJCQkJCQlcCisJCS5zcmNfc2VsX3NoaWZ0ID0gMCwJCQkJXAorCQkucGFyZW50X21hcCA9IGxjY19jeG9fcGxsNF9tYXAsCQkJXAorCX0sCQkJCQkJCVwKKwkuZnJlcV90YmwgPSBjbGtfdGJsX2FpZl9vc3JfMzkzLAkJCVwKKwkuY2xrciA9IHsJCQkJCQlcCisJCS5lbmFibGVfcmVnID0gX25zLAkJCQlcCisJCS5lbmFibGVfbWFzayA9IEJJVCg5KSwJCQkJXAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpewkJXAorCQkJLm5hbWUgPSAjcHJlZml4ICJfb3NyX3NyYyIsCQlcCisJCQkucGFyZW50X25hbWVzID0gbGNjX2N4b19wbGw0LAkJXAorCQkJLm51bV9wYXJlbnRzID0gMiwJCQlcCisJCQkub3BzID0gJmNsa19yY2dfb3BzLAkJCVwKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9HQVRFLAkJXAorCQl9LAkJCQkJCVwKKwl9LAkJCQkJCQlcCit9OwkJCQkJCQkJXAorCQkJCQkJCQlcCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxjY18jI3ByZWZpeCMjX3BhcmVudHNbXSA9IHsJCVwKKwkjcHJlZml4ICJfb3NyX3NyYyIsCQkJCQlcCit9OwkJCQkJCQkJXAorCQkJCQkJCQlcCitzdGF0aWMgc3RydWN0IGNsa19icmFuY2ggcHJlZml4IyNfb3NyX2NsayA9IHsJCQlcCisJLmhhbHRfcmVnID0gaHIsCQkJCQkJXAorCS5oYWx0X2JpdCA9IDEsCQkJCQkJXAorCS5oYWx0X2NoZWNrID0gQlJBTkNIX0hBTFRfRU5BQkxFLAkJCVwKKwkuY2xrciA9IHsJCQkJCQlcCisJCS5lbmFibGVfcmVnID0gX25zLAkJCQlcCisJCS5lbmFibGVfbWFzayA9IEJJVCgyMSksCQkJCVwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsJCVwKKwkJCS5uYW1lID0gI3ByZWZpeCAiX29zcl9jbGsiLAkJXAorCQkJLnBhcmVudF9uYW1lcyA9IGxjY18jI3ByZWZpeCMjX3BhcmVudHMsCVwKKwkJCS5udW1fcGFyZW50cyA9IDEsCQkJXAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywJCQlcCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfUEFSRU5ULAkJXAorCQl9LAkJCQkJCVwKKwl9LAkJCQkJCQlcCit9OwkJCQkJCQkJXAorCQkJCQkJCQlcCitzdGF0aWMgc3RydWN0IGNsa19yZWdtYXBfZGl2IHByZWZpeCMjX2Rpdl9jbGsgPSB7CQlcCisJLnJlZyA9IF9ucywJCQkJCQlcCisJLnNoaWZ0ID0gMTAsCQkJCQkJXAorCS53aWR0aCA9IDgsCQkJCQkJXAorCS5jbGtyID0gewkJCQkJCVwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsJCVwKKwkJCS5uYW1lID0gI3ByZWZpeCAiX2Rpdl9jbGsiLAkJXAorCQkJLnBhcmVudF9uYW1lcyA9IGxjY18jI3ByZWZpeCMjX3BhcmVudHMsCVwKKwkJCS5udW1fcGFyZW50cyA9IDEsCQkJXAorCQkJLm9wcyA9ICZjbGtfcmVnbWFwX2Rpdl9vcHMsCQlcCisJCX0sCQkJCQkJXAorCX0sCQkJCQkJCVwKK307CQkJCQkJCQlcCisJCQkJCQkJCVwKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBwcmVmaXgjI19iaXRfZGl2X2NsayA9IHsJCVwKKwkuaGFsdF9yZWcgPSBociwJCQkJCQlcCisJLmhhbHRfYml0ID0gMCwJCQkJCQlcCisJLmhhbHRfY2hlY2sgPSBCUkFOQ0hfSEFMVF9FTkFCTEUsCQkJXAorCS5jbGtyID0gewkJCQkJCVwKKwkJLmVuYWJsZV9yZWcgPSBfbnMsCQkJCVwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDE5KSwJCQkJXAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpewkJXAorCQkJLm5hbWUgPSAjcHJlZml4ICJfYml0X2Rpdl9jbGsiLAkJXAorCQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7CVwKKwkJCQkjcHJlZml4ICJfZGl2X2NsayIJCVwKKwkJCX0sCQkJCQlcCisJCQkubnVtX3BhcmVudHMgPSAxLAkJCVwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCQkJXAorCQkJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX1BBUkVOVCwJCVwKKwkJfSwJCQkJCQlcCisJfSwJCQkJCQkJXAorfTsJCQkJCQkJCVwKKwkJCQkJCQkJXAorc3RhdGljIHN0cnVjdCBjbGtfcmVnbWFwX211eCBwcmVmaXgjI19iaXRfY2xrID0gewkJXAorCS5yZWcgPSBfbnMsCQkJCQkJXAorCS5zaGlmdCA9IDE4LAkJCQkJCVwKKwkud2lkdGggPSAxLAkJCQkJCVwKKwkuY2xrciA9IHsJCQkJCQlcCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CQlcCisJCQkubmFtZSA9ICNwcmVmaXggIl9iaXRfY2xrIiwJCVwKKwkJCS5wYXJlbnRfbmFtZXMgPSAoY29uc3QgY2hhciAqW10pewlcCisJCQkJI3ByZWZpeCAiX2JpdF9kaXZfY2xrIiwJCVwKKwkJCQkjcHJlZml4ICJfY29kZWNfY2xrIiwJCVwKKwkJCX0sCQkJCQlcCisJCQkubnVtX3BhcmVudHMgPSAyLAkJCVwKKwkJCS5vcHMgPSAmY2xrX3JlZ21hcF9tdXhfY2xvc2VzdF9vcHMsCVwKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCQlcCisJCX0sCQkJCQkJXAorCX0sCQkJCQkJCVwKK30KKworQ0xLX0FJRl9PU1JfRElWKGNvZGVjX2kyc19taWMsIDB4NjAsIDB4NjQsIDB4NjgpOworQ0xLX0FJRl9PU1JfRElWKHNwYXJlX2kyc19taWMsIDB4NzgsIDB4N2MsIDB4ODApOworQ0xLX0FJRl9PU1JfRElWKGNvZGVjX2kyc19zcGtyLCAweDZjLCAweDcwLCAweDc0KTsKK0NMS19BSUZfT1NSX0RJVihzcGFyZV9pMnNfc3BrciwgMHg4NCwgMHg4OCwgMHg4Yyk7CisKK3N0YXRpYyBzdHJ1Y3QgZnJlcV90YmwgY2xrX3RibF9wY21fNDkyW10gPSB7CisJeyAgIDI1NjAwMCwgUF9QTEw0LCA0LCAxLCA0ODAgfSwKKwl7ICAgNTEyMDAwLCBQX1BMTDQsIDQsIDEsIDI0MCB9LAorCXsgICA3NjgwMDAsIFBfUExMNCwgNCwgMSwgMTYwIH0sCisJeyAgMTAyNDAwMCwgUF9QTEw0LCA0LCAxLCAxMjAgfSwKKwl7ICAxNTM2MDAwLCBQX1BMTDQsIDQsIDEsICA4MCB9LAorCXsgIDIwNDgwMDAsIFBfUExMNCwgNCwgMSwgIDYwIH0sCisJeyAgMzA3MjAwMCwgUF9QTEw0LCA0LCAxLCAgNDAgfSwKKwl7ICA0MDk2MDAwLCBQX1BMTDQsIDQsIDEsICAzMCB9LAorCXsgIDYxNDQwMDAsIFBfUExMNCwgNCwgMSwgIDIwIH0sCisJeyAgODE5MjAwMCwgUF9QTEw0LCA0LCAxLCAgMTUgfSwKKwl7IDEyMjg4MDAwLCBQX1BMTDQsIDQsIDEsICAxMCB9LAorCXsgMjQ1NzYwMDAsIFBfUExMNCwgNCwgMSwgICA1IH0sCisJeyAyNzAwMDAwMCwgUF9DWE8sICAxLCAwLCAgIDAgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZnJlcV90YmwgY2xrX3RibF9wY21fMzkzW10gPSB7CisJeyAgIDI1NjAwMCwgUF9QTEw0LCA0LCAxLCAzODQgfSwKKwl7ICAgNTEyMDAwLCBQX1BMTDQsIDQsIDEsIDE5MiB9LAorCXsgICA3NjgwMDAsIFBfUExMNCwgNCwgMSwgMTI4IH0sCisJeyAgMTAyNDAwMCwgUF9QTEw0LCA0LCAxLCAgOTYgfSwKKwl7ICAxNTM2MDAwLCBQX1BMTDQsIDQsIDEsICA2NCB9LAorCXsgIDIwNDgwMDAsIFBfUExMNCwgNCwgMSwgIDQ4IH0sCisJeyAgMzA3MjAwMCwgUF9QTEw0LCA0LCAxLCAgMzIgfSwKKwl7ICA0MDk2MDAwLCBQX1BMTDQsIDQsIDEsICAyNCB9LAorCXsgIDYxNDQwMDAsIFBfUExMNCwgNCwgMSwgIDE2IH0sCisJeyAgODE5MjAwMCwgUF9QTEw0LCA0LCAxLCAgMTIgfSwKKwl7IDEyMjg4MDAwLCBQX1BMTDQsIDQsIDEsICAgOCB9LAorCXsgMjQ1NzYwMDAsIFBfUExMNCwgNCwgMSwgICA0IH0sCisJeyAyNzAwMDAwMCwgUF9DWE8sICAxLCAwLCAgIDAgfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3JjZyBwY21fc3JjID0geworCS5uc19yZWcgPSAweDU0LAorCS5tZF9yZWcgPSAweDU4LAorCS5tbiA9IHsKKwkJLm1uY3RyX2VuX2JpdCA9IDgsCisJCS5tbmN0cl9yZXNldF9iaXQgPSA3LAorCQkubW5jdHJfbW9kZV9zaGlmdCA9IDUsCisJCS5uX3ZhbF9zaGlmdCA9IDE2LAorCQkubV92YWxfc2hpZnQgPSAxNiwKKwkJLndpZHRoID0gMTYsCisJfSwKKwkucCA9IHsKKwkJLnByZV9kaXZfc2hpZnQgPSAzLAorCQkucHJlX2Rpdl93aWR0aCA9IDIsCisJfSwKKwkucyA9IHsKKwkJLnNyY19zZWxfc2hpZnQgPSAwLAorCQkucGFyZW50X21hcCA9IGxjY19jeG9fcGxsNF9tYXAsCisJfSwKKwkuZnJlcV90YmwgPSBjbGtfdGJsX3BjbV8zOTMsCisJLmNsa3IgPSB7CisJCS5lbmFibGVfcmVnID0gMHg1NCwKKwkJLmVuYWJsZV9tYXNrID0gQklUKDkpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAicGNtX3NyYyIsCisJCQkucGFyZW50X25hbWVzID0gbGNjX2N4b19wbGw0LAorCQkJLm51bV9wYXJlbnRzID0gMiwKKwkJCS5vcHMgPSAmY2xrX3JjZ19vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfR0FURSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIHBjbV9jbGtfb3V0ID0geworCS5oYWx0X3JlZyA9IDB4NWMsCisJLmhhbHRfYml0ID0gMCwKKwkuaGFsdF9jaGVjayA9IEJSQU5DSF9IQUxUX0VOQUJMRSwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweDU0LAorCQkuZW5hYmxlX21hc2sgPSBCSVQoMTEpLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAicGNtX2Nsa19vdXQiLAorCQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7ICJwY21fc3JjIiB9LAorCQkJLm51bV9wYXJlbnRzID0gMSwKKwkJCS5vcHMgPSAmY2xrX2JyYW5jaF9vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfUEFSRU5ULAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19yZWdtYXBfbXV4IHBjbV9jbGsgPSB7CisJLnJlZyA9IDB4NTQsCisJLnNoaWZ0ID0gMTAsCisJLndpZHRoID0gMSwKKwkuY2xrciA9IHsKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gInBjbV9jbGsiLAorCQkJLnBhcmVudF9uYW1lcyA9IChjb25zdCBjaGFyICpbXSl7CisJCQkJInBjbV9jbGtfb3V0IiwKKwkJCQkicGNtX2NvZGVjX2NsayIsCisJCQl9LAorCQkJLm51bV9wYXJlbnRzID0gMiwKKwkJCS5vcHMgPSAmY2xrX3JlZ21hcF9tdXhfY2xvc2VzdF9vcHMsCisJCQkuZmxhZ3MgPSBDTEtfU0VUX1JBVEVfUEFSRU5ULAorCQl9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19yY2cgc2xpbWJ1c19zcmMgPSB7CisJLm5zX3JlZyA9IDB4Y2MsCisJLm1kX3JlZyA9IDB4ZDAsCisJLm1uID0geworCQkubW5jdHJfZW5fYml0ID0gOCwKKwkJLm1uY3RyX3Jlc2V0X2JpdCA9IDcsCisJCS5tbmN0cl9tb2RlX3NoaWZ0ID0gNSwKKwkJLm5fdmFsX3NoaWZ0ID0gMjQsCisJCS5tX3ZhbF9zaGlmdCA9IDgsCisJCS53aWR0aCA9IDgsCisJfSwKKwkucCA9IHsKKwkJLnByZV9kaXZfc2hpZnQgPSAzLAorCQkucHJlX2Rpdl93aWR0aCA9IDIsCisJfSwKKwkucyA9IHsKKwkJLnNyY19zZWxfc2hpZnQgPSAwLAorCQkucGFyZW50X21hcCA9IGxjY19jeG9fcGxsNF9tYXAsCisJfSwKKwkuZnJlcV90YmwgPSBjbGtfdGJsX2FpZl9vc3JfMzkzLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4Y2MsCisJCS5lbmFibGVfbWFzayA9IEJJVCg5KSwKKwkJLmh3LmluaXQgPSAmKHN0cnVjdCBjbGtfaW5pdF9kYXRhKXsKKwkJCS5uYW1lID0gInNsaW1idXNfc3JjIiwKKwkJCS5wYXJlbnRfbmFtZXMgPSBsY2NfY3hvX3BsbDQsCisJCQkubnVtX3BhcmVudHMgPSAyLAorCQkJLm9wcyA9ICZjbGtfcmNnX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9HQVRFLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxjY19zbGltYnVzX3BhcmVudHNbXSA9IHsKKwkic2xpbWJ1c19zcmMiLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfYnJhbmNoIGF1ZGlvX3NsaW1idXNfY2xrID0geworCS5oYWx0X3JlZyA9IDB4ZDQsCisJLmhhbHRfYml0ID0gMCwKKwkuaGFsdF9jaGVjayA9IEJSQU5DSF9IQUxUX0VOQUJMRSwKKwkuY2xrciA9IHsKKwkJLmVuYWJsZV9yZWcgPSAweGNjLAorCQkuZW5hYmxlX21hc2sgPSBCSVQoMTApLAorCQkuaHcuaW5pdCA9ICYoc3RydWN0IGNsa19pbml0X2RhdGEpeworCQkJLm5hbWUgPSAiYXVkaW9fc2xpbWJ1c19jbGsiLAorCQkJLnBhcmVudF9uYW1lcyA9IGxjY19zbGltYnVzX3BhcmVudHMsCisJCQkubnVtX3BhcmVudHMgPSAxLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2JyYW5jaCBzcHNfc2xpbWJ1c19jbGsgPSB7CisJLmhhbHRfcmVnID0gMHhkNCwKKwkuaGFsdF9iaXQgPSAxLAorCS5oYWx0X2NoZWNrID0gQlJBTkNIX0hBTFRfRU5BQkxFLAorCS5jbGtyID0geworCQkuZW5hYmxlX3JlZyA9IDB4Y2MsCisJCS5lbmFibGVfbWFzayA9IEJJVCgxMiksCisJCS5ody5pbml0ID0gJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSl7CisJCQkubmFtZSA9ICJzcHNfc2xpbWJ1c19jbGsiLAorCQkJLnBhcmVudF9uYW1lcyA9IGxjY19zbGltYnVzX3BhcmVudHMsCisJCQkubnVtX3BhcmVudHMgPSAxLAorCQkJLm9wcyA9ICZjbGtfYnJhbmNoX29wcywKKwkJCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3JlZ21hcCAqbGNjX21kbTk2MTVfY2xrc1tdID0geworCVtQTEw0XSA9ICZwbGw0LmNsa3IsCisJW01JMlNfT1NSX1NSQ10gPSAmbWkyc19vc3Jfc3JjLmNsa3IsCisJW01JMlNfT1NSX0NMS10gPSAmbWkyc19vc3JfY2xrLmNsa3IsCisJW01JMlNfRElWX0NMS10gPSAmbWkyc19kaXZfY2xrLmNsa3IsCisJW01JMlNfQklUX0RJVl9DTEtdID0gJm1pMnNfYml0X2Rpdl9jbGsuY2xrciwKKwlbTUkyU19CSVRfQ0xLXSA9ICZtaTJzX2JpdF9jbGsuY2xrciwKKwlbUENNX1NSQ10gPSAmcGNtX3NyYy5jbGtyLAorCVtQQ01fQ0xLX09VVF0gPSAmcGNtX2Nsa19vdXQuY2xrciwKKwlbUENNX0NMS10gPSAmcGNtX2Nsay5jbGtyLAorCVtTTElNQlVTX1NSQ10gPSAmc2xpbWJ1c19zcmMuY2xrciwKKwlbQVVESU9fU0xJTUJVU19DTEtdID0gJmF1ZGlvX3NsaW1idXNfY2xrLmNsa3IsCisJW1NQU19TTElNQlVTX0NMS10gPSAmc3BzX3NsaW1idXNfY2xrLmNsa3IsCisJW0NPREVDX0kyU19NSUNfT1NSX1NSQ10gPSAmY29kZWNfaTJzX21pY19vc3Jfc3JjLmNsa3IsCisJW0NPREVDX0kyU19NSUNfT1NSX0NMS10gPSAmY29kZWNfaTJzX21pY19vc3JfY2xrLmNsa3IsCisJW0NPREVDX0kyU19NSUNfRElWX0NMS10gPSAmY29kZWNfaTJzX21pY19kaXZfY2xrLmNsa3IsCisJW0NPREVDX0kyU19NSUNfQklUX0RJVl9DTEtdID0gJmNvZGVjX2kyc19taWNfYml0X2Rpdl9jbGsuY2xrciwKKwlbQ09ERUNfSTJTX01JQ19CSVRfQ0xLXSA9ICZjb2RlY19pMnNfbWljX2JpdF9jbGsuY2xrciwKKwlbU1BBUkVfSTJTX01JQ19PU1JfU1JDXSA9ICZzcGFyZV9pMnNfbWljX29zcl9zcmMuY2xrciwKKwlbU1BBUkVfSTJTX01JQ19PU1JfQ0xLXSA9ICZzcGFyZV9pMnNfbWljX29zcl9jbGsuY2xrciwKKwlbU1BBUkVfSTJTX01JQ19ESVZfQ0xLXSA9ICZzcGFyZV9pMnNfbWljX2Rpdl9jbGsuY2xrciwKKwlbU1BBUkVfSTJTX01JQ19CSVRfRElWX0NMS10gPSAmc3BhcmVfaTJzX21pY19iaXRfZGl2X2Nsay5jbGtyLAorCVtTUEFSRV9JMlNfTUlDX0JJVF9DTEtdID0gJnNwYXJlX2kyc19taWNfYml0X2Nsay5jbGtyLAorCVtDT0RFQ19JMlNfU1BLUl9PU1JfU1JDXSA9ICZjb2RlY19pMnNfc3Brcl9vc3Jfc3JjLmNsa3IsCisJW0NPREVDX0kyU19TUEtSX09TUl9DTEtdID0gJmNvZGVjX2kyc19zcGtyX29zcl9jbGsuY2xrciwKKwlbQ09ERUNfSTJTX1NQS1JfRElWX0NMS10gPSAmY29kZWNfaTJzX3Nwa3JfZGl2X2Nsay5jbGtyLAorCVtDT0RFQ19JMlNfU1BLUl9CSVRfRElWX0NMS10gPSAmY29kZWNfaTJzX3Nwa3JfYml0X2Rpdl9jbGsuY2xrciwKKwlbQ09ERUNfSTJTX1NQS1JfQklUX0NMS10gPSAmY29kZWNfaTJzX3Nwa3JfYml0X2Nsay5jbGtyLAorCVtTUEFSRV9JMlNfU1BLUl9PU1JfU1JDXSA9ICZzcGFyZV9pMnNfc3Brcl9vc3Jfc3JjLmNsa3IsCisJW1NQQVJFX0kyU19TUEtSX09TUl9DTEtdID0gJnNwYXJlX2kyc19zcGtyX29zcl9jbGsuY2xrciwKKwlbU1BBUkVfSTJTX1NQS1JfRElWX0NMS10gPSAmc3BhcmVfaTJzX3Nwa3JfZGl2X2Nsay5jbGtyLAorCVtTUEFSRV9JMlNfU1BLUl9CSVRfRElWX0NMS10gPSAmc3BhcmVfaTJzX3Nwa3JfYml0X2Rpdl9jbGsuY2xrciwKKwlbU1BBUkVfSTJTX1NQS1JfQklUX0NMS10gPSAmc3BhcmVfaTJzX3Nwa3JfYml0X2Nsay5jbGtyLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGxjY19tZG05NjE1X3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzCT0gMzIsCisJLnJlZ19zdHJpZGUJPSA0LAorCS52YWxfYml0cwk9IDMyLAorCS5tYXhfcmVnaXN0ZXIJPSAweGZjLAorCS5mYXN0X2lvCT0gdHJ1ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcWNvbV9jY19kZXNjIGxjY19tZG05NjE1X2Rlc2MgPSB7CisJLmNvbmZpZyA9ICZsY2NfbWRtOTYxNV9yZWdtYXBfY29uZmlnLAorCS5jbGtzID0gbGNjX21kbTk2MTVfY2xrcywKKwkubnVtX2Nsa3MgPSBBUlJBWV9TSVpFKGxjY19tZG05NjE1X2Nsa3MpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbGNjX21kbTk2MTVfbWF0Y2hfdGFibGVbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInFjb20sbGNjLW1kbTk2MTUiIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbGNjX21kbTk2MTVfbWF0Y2hfdGFibGUpOworCitzdGF0aWMgaW50IGxjY19tZG05NjE1X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJdTMyIHZhbDsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisKKwlyZWdtYXAgPSBxY29tX2NjX21hcChwZGV2LCAmbGNjX21kbTk2MTVfZGVzYyk7CisJaWYgKElTX0VSUihyZWdtYXApKQorCQlyZXR1cm4gUFRSX0VSUihyZWdtYXApOworCisJLyogVXNlIHRoZSBjb3JyZWN0IGZyZXF1ZW5jeSBwbGFuIGRlcGVuZGluZyBvbiBzcGVlZCBvZiBQTEw0ICovCisJcmVnbWFwX3JlYWQocmVnbWFwLCAweDQsICZ2YWwpOworCWlmICh2YWwgPT0gMHgxMikgeworCQlzbGltYnVzX3NyYy5mcmVxX3RibCA9IGNsa190YmxfYWlmX29zcl80OTI7CisJCW1pMnNfb3NyX3NyYy5mcmVxX3RibCA9IGNsa190YmxfYWlmX29zcl80OTI7CisJCWNvZGVjX2kyc19taWNfb3NyX3NyYy5mcmVxX3RibCA9IGNsa190YmxfYWlmX29zcl80OTI7CisJCXNwYXJlX2kyc19taWNfb3NyX3NyYy5mcmVxX3RibCA9IGNsa190YmxfYWlmX29zcl80OTI7CisJCWNvZGVjX2kyc19zcGtyX29zcl9zcmMuZnJlcV90YmwgPSBjbGtfdGJsX2FpZl9vc3JfNDkyOworCQlzcGFyZV9pMnNfc3Brcl9vc3Jfc3JjLmZyZXFfdGJsID0gY2xrX3RibF9haWZfb3NyXzQ5MjsKKwkJcGNtX3NyYy5mcmVxX3RibCA9IGNsa190YmxfcGNtXzQ5MjsKKwl9CisJLyogRW5hYmxlIFBMTDQgc291cmNlIG9uIHRoZSBMUEFTUyBQcmltYXJ5IFBMTCBNdXggKi8KKwlyZWdtYXBfd3JpdGUocmVnbWFwLCAweGM0LCAweDEpOworCisJcmV0dXJuIHFjb21fY2NfcmVhbGx5X3Byb2JlKHBkZXYsICZsY2NfbWRtOTYxNV9kZXNjLCByZWdtYXApOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBsY2NfbWRtOTYxNV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGxjY19tZG05NjE1X3Byb2JlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJsY2MtbWRtOTYxNSIsCisJCS5vZl9tYXRjaF90YWJsZSA9IGxjY19tZG05NjE1X21hdGNoX3RhYmxlLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihsY2NfbWRtOTYxNV9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlFDT00gTENDIE1ETTk2MTUgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmxjYy1tZG05NjE1Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9xY29tL21tY2MtbXNtODk5Ni5jIGIvZHJpdmVycy9jbGsvcWNvbS9tbWNjLW1zbTg5OTYuYwppbmRleCA4NDdkZDlkLi5jYTk3ZTExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9xY29tL21tY2MtbXNtODk5Ni5jCisrKyBiL2RyaXZlcnMvY2xrL3Fjb20vbW1jYy1tc204OTk2LmMKQEAgLTI4ODgsNiArMjg4OCwxNCBAQAogCSZncGxsMF9kaXYuaHcsCiB9OwogCitzdGF0aWMgc3RydWN0IGdkc2MgbW1hZ2ljX2JpbWNfZ2RzYyA9IHsKKwkuZ2RzY3IgPSAweDUyOWMsCisJLnBkID0geworCQkubmFtZSA9ICJtbWFnaWNfYmltYyIsCisJfSwKKwkucHdyc3RzID0gUFdSU1RTX09GRl9PTiwKK307CisKIHN0YXRpYyBzdHJ1Y3QgZ2RzYyBtbWFnaWNfdmlkZW9fZ2RzYyA9IHsKIAkuZ2RzY3IgPSAweDExOWMsCiAJLmdkc19od19jdHJsID0gMHgxMjBjLApAQCAtMzIwMSw2ICszMjA5LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZ2RzYyAqbW1jY19tc204OTk2X2dkc2NzW10gPSB7CisJW01NQUdJQ19CSU1DX0dEU0NdID0gJm1tYWdpY19iaW1jX2dkc2MsCiAJW01NQUdJQ19WSURFT19HRFNDXSA9ICZtbWFnaWNfdmlkZW9fZ2RzYywKIAlbTU1BR0lDX01EU1NfR0RTQ10gPSAmbW1hZ2ljX21kc3NfZ2RzYywKIAlbTU1BR0lDX0NBTVNTX0dEU0NdID0gJm1tYWdpY19jYW1zc19nZHNjLApAQCAtMzMwNSw5ICszMzE0LDggQEAKIAogc3RhdGljIGludCBtbWNjX21zbTg5OTZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgY2xrICpjbGs7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKLQlpbnQgaTsKKwlpbnQgaSwgcmV0OwogCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKIAogCXJlZ21hcCA9IHFjb21fY2NfbWFwKHBkZXYsICZtbWNjX21zbTg5OTZfZGVzYyk7CkBAIC0zMzIwLDkgKzMzMjgsOSBAQAogCXJlZ21hcF91cGRhdGVfYml0cyhyZWdtYXAsIDB4NTA1NCwgQklUKDE1KSwgMCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtbWNjX21zbTg5OTZfaHdzKTsgaSsrKSB7Ci0JCWNsayA9IGRldm1fY2xrX3JlZ2lzdGVyKGRldiwgbW1jY19tc204OTk2X2h3c1tpXSk7Ci0JCWlmIChJU19FUlIoY2xrKSkKLQkJCXJldHVybiBQVFJfRVJSKGNsayk7CisJCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKGRldiwgbW1jY19tc204OTk2X2h3c1tpXSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldHVybiBxY29tX2NjX3JlYWxseV9wcm9iZShwZGV2LCAmbW1jY19tc204OTk2X2Rlc2MsIHJlZ21hcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9yZW5lc2FzL2Nsay1tc3RwLmMgYi9kcml2ZXJzL2Nsay9yZW5lc2FzL2Nsay1tc3RwLmMKaW5kZXggNTA5M2EyNS4uOTM3NTc3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvcmVuZXNhcy9jbGstbXN0cC5jCisrKyBiL2RyaXZlcnMvY2xrL3JlbmVzYXMvY2xrLW1zdHAuYwpAQCAtMTY3LDcgKzE2Nyw3IEBACiAJdW5zaWduZWQgaW50IGk7CiAKIAlncm91cCA9IGt6YWxsb2Moc2l6ZW9mKCpncm91cCksIEdGUF9LRVJORUwpOwotCWNsa3MgPSBrbWFsbG9jKE1TVFBfTUFYX0NMT0NLUyAqIHNpemVvZigqY2xrcyksIEdGUF9LRVJORUwpOworCWNsa3MgPSBrbWFsbG9jX2FycmF5KE1TVFBfTUFYX0NMT0NLUywgc2l6ZW9mKCpjbGtzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGdyb3VwID09IE5VTEwgfHwgY2xrcyA9PSBOVUxMKSB7CiAJCWtmcmVlKGdyb3VwKTsKIAkJa2ZyZWUoY2xrcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9yZW5lc2FzL2Nsay1yei5jIGIvZHJpdmVycy9jbGsvcmVuZXNhcy9jbGstcnouYwppbmRleCBmNjMxMmM2Li41YWRiOTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9yZW5lc2FzL2Nsay1yei5jCisrKyBiL2RyaXZlcnMvY2xrL3JlbmVzYXMvY2xrLXJ6LmMKQEAgLTI1LDEwICsyNSwzMSBAQAogI2RlZmluZSBDUEdfRlJRQ1IJMHgxMAogI2RlZmluZSBDUEdfRlJRQ1IyCTB4MTQKIAorI2RlZmluZSBQUFIwCQkweEZDRkUzMjAwCisjZGVmaW5lIFBJQkMwCQkweEZDRkU3MDAwCisKKyNkZWZpbmUgTURfQ0xLKHgpCSgoeCA+PiAyKSAmIDEpCS8qIFAwXzIgKi8KKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEluaXRpYWxpemF0aW9uCiAgKi8KIAorc3RhdGljIHUxNiBfX2luaXQgcnpfY3BnX3JlYWRfbW9kZV9waW5zKHZvaWQpCit7CisJdm9pZCBfX2lvbWVtICpwcHIwLCAqcGliYzA7CisJdTE2IG1vZGVzOworCisJcHByMCA9IGlvcmVtYXBfbm9jYWNoZShQUFIwLCAyKTsKKwlwaWJjMCA9IGlvcmVtYXBfbm9jYWNoZShQSUJDMCwgMik7CisJQlVHX09OKCFwcHIwIHx8ICFwaWJjMCk7CisJaW93cml0ZTE2KDQsIHBpYmMwKTsJLyogZW5hYmxlIGlucHV0IGJ1ZmZlciAqLworCW1vZGVzID0gaW9yZWFkMTYocHByMCk7CisJaW91bm1hcChwcHIwKTsKKwlpb3VubWFwKHBpYmMwKTsKKworCXJldHVybiBtb2RlczsKK30KKwogc3RhdGljIHN0cnVjdCBjbGsgKiBfX2luaXQKIHJ6X2NwZ19yZWdpc3Rlcl9jbG9jayhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBzdHJ1Y3QgcnpfY3BnICpjcGcsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CkBAIC0zNyw4ICs1OCw3IEBACiAJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGZycWNyX3RhYls0XSA9IHsgMywgMiwgMCwgMSB9OwogCiAJaWYgKHN0cmNtcChuYW1lLCAicGxsIikgPT0gMCkgewotCQkvKiBGSVhNRTogY3BnX21vZGUgc2hvdWxkIGJlIHJlYWQgZnJvbSBHUElPLiBCdXQgbm8gR1BJTyBzdXBwb3J0IHlldCAqLwotCQl1bnNpZ25lZCBjcGdfbW9kZSA9IDA7IC8qIGhhcmRjb2RlZCB0byBFWFRBTCBmb3Igbm93ICovCisJCXVuc2lnbmVkIGludCBjcGdfbW9kZSA9IE1EX0NMSyhyel9jcGdfcmVhZF9tb2RlX3BpbnMoKSk7CiAJCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lID0gb2ZfY2xrX2dldF9wYXJlbnRfbmFtZShucCwgY3BnX21vZGUpOwogCiAJCW11bHQgPSBjcGdfbW9kZSA/ICgzMiAvIDQpIDogMzA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9yZW5lc2FzL3I4YTc3OTUtY3BnLW1zc3IuYyBiL2RyaXZlcnMvY2xrL3JlbmVzYXMvcjhhNzc5NS1jcGctbXNzci5jCmluZGV4IGQzNTljOTIuLmYyNTVlNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3JlbmVzYXMvcjhhNzc5NS1jcGctbXNzci5jCisrKyBiL2RyaXZlcnMvY2xrL3JlbmVzYXMvcjhhNzc5NS1jcGctbXNzci5jCkBAIC02OSw2ICs2OSw3IEBACiAJREVGX0ZJWEVEKCIuczEiLCAgICAgICAgQ0xLX1MxLCAgICAgICAgICAgIENMS19QTEwxX0RJVjIsICAzLCAxKSwKIAlERUZfRklYRUQoIi5zMiIsICAgICAgICBDTEtfUzIsICAgICAgICAgICAgQ0xLX1BMTDFfRElWMiwgIDQsIDEpLAogCURFRl9GSVhFRCgiLnMzIiwgICAgICAgIENMS19TMywgICAgICAgICAgICBDTEtfUExMMV9ESVYyLCAgNiwgMSksCisJREVGX0ZJWEVEKCIuc2RzcmMiLCAgICAgQ0xLX1NEU1JDLCAgICAgICAgIENMS19QTEwxX0RJVjIsICAyLCAxKSwKIAogCS8qIENvcmUgQ2xvY2sgT3V0cHV0cyAqLwogCURFRl9GSVhFRCgienRyIiwgICAgICAgIFI4QTc3OTVfQ0xLX1pUUiwgICBDTEtfUExMMV9ESVYyLCAgNiwgMSksCkBAIC04NywxMCArODgsMTAgQEAKIAlERUZfRklYRUQoInMzZDIiLCAgICAgICBSOEE3Nzk1X0NMS19TM0QyLCAgQ0xLX1MzLCAgICAgICAgIDIsIDEpLAogCURFRl9GSVhFRCgiczNkNCIsICAgICAgIFI4QTc3OTVfQ0xLX1MzRDQsICBDTEtfUzMsICAgICAgICAgNCwgMSksCiAKLQlERUZfR0VOM19TRCgic2QwIiwgICAgICBSOEE3Nzk1X0NMS19TRDAsICAgQ0xLX1BMTDFfRElWMiwgMHgwMDc0KSwKLQlERUZfR0VOM19TRCgic2QxIiwgICAgICBSOEE3Nzk1X0NMS19TRDEsICAgQ0xLX1BMTDFfRElWMiwgMHgwMDc4KSwKLQlERUZfR0VOM19TRCgic2QyIiwgICAgICBSOEE3Nzk1X0NMS19TRDIsICAgQ0xLX1BMTDFfRElWMiwgMHgwMjY4KSwKLQlERUZfR0VOM19TRCgic2QzIiwgICAgICBSOEE3Nzk1X0NMS19TRDMsICAgQ0xLX1BMTDFfRElWMiwgMHgwMjZjKSwKKwlERUZfR0VOM19TRCgic2QwIiwgICAgICBSOEE3Nzk1X0NMS19TRDAsICAgQ0xLX1NEU1JDLCAgICAgMHgwMDc0KSwKKwlERUZfR0VOM19TRCgic2QxIiwgICAgICBSOEE3Nzk1X0NMS19TRDEsICAgQ0xLX1NEU1JDLCAgICAgMHgwMDc4KSwKKwlERUZfR0VOM19TRCgic2QyIiwgICAgICBSOEE3Nzk1X0NMS19TRDIsICAgQ0xLX1NEU1JDLCAgICAgMHgwMjY4KSwKKwlERUZfR0VOM19TRCgic2QzIiwgICAgICBSOEE3Nzk1X0NMS19TRDMsICAgQ0xLX1NEU1JDLCAgICAgMHgwMjZjKSwKIAogCURFRl9GSVhFRCgiY2wiLCAgICAgICAgIFI4QTc3OTVfQ0xLX0NMLCAgICBDTEtfUExMMV9ESVYyLCA0OCwgMSksCiAJREVGX0ZJWEVEKCJjcCIsICAgICAgICAgUjhBNzc5NV9DTEtfQ1AsICAgIENMS19FWFRBTCwgICAgICAyLCAxKSwKQEAgLTEyMiw2ICsxMjMsMTAgQEAKIAlERUZfTU9EKCJzeXMtZG1hYzIiLAkJIDIxNywJUjhBNzc5NV9DTEtfUzNEMSksCiAJREVGX01PRCgic3lzLWRtYWMxIiwJCSAyMTgsCVI4QTc3OTVfQ0xLX1MzRDEpLAogCURFRl9NT0QoInN5cy1kbWFjMCIsCQkgMjE5LAlSOEE3Nzk1X0NMS19TM0QxKSwKKwlERUZfTU9EKCJjbXQzIiwJCQkgMzAwLAlSOEE3Nzk1X0NMS19SKSwKKwlERUZfTU9EKCJjbXQyIiwJCQkgMzAxLAlSOEE3Nzk1X0NMS19SKSwKKwlERUZfTU9EKCJjbXQxIiwJCQkgMzAyLAlSOEE3Nzk1X0NMS19SKSwKKwlERUZfTU9EKCJjbXQwIiwJCQkgMzAzLAlSOEE3Nzk1X0NMS19SKSwKIAlERUZfTU9EKCJzY2lmMiIsCQkgMzEwLAlSOEE3Nzk1X0NMS19TM0Q0KSwKIAlERUZfTU9EKCJzZGlmMyIsCQkgMzExLAlSOEE3Nzk1X0NMS19TRDMpLAogCURFRl9NT0QoInNkaWYyIiwJCSAzMTIsCVI4QTc3OTVfQ0xLX1NEMiksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9yZW5lc2FzL3I4YTc3OTYtY3BnLW1zc3IuYyBiL2RyaXZlcnMvY2xrL3JlbmVzYXMvcjhhNzc5Ni1jcGctbXNzci5jCmluZGV4IGM4NGI1NDkuLmViMzQ3ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3JlbmVzYXMvcjhhNzc5Ni1jcGctbXNzci5jCisrKyBiL2RyaXZlcnMvY2xrL3JlbmVzYXMvcjhhNzc5Ni1jcGctbXNzci5jCkBAIC00NSw2ICs0NSw3IEBACiAJQ0xLX1MzLAogCUNMS19TRFNSQywKIAlDTEtfU1NQU1JDLAorCUNMS19SSU5ULAogCiAJLyogTW9kdWxlIENsb2NrcyAqLwogCU1PRF9DTEtfQkFTRQpAQCAtNjksNiArNzAsNyBAQAogCURFRl9GSVhFRCgiLnMxIiwgICAgICAgIENMS19TMSwgICAgICAgICAgICBDTEtfUExMMV9ESVYyLCAgMywgMSksCiAJREVGX0ZJWEVEKCIuczIiLCAgICAgICAgQ0xLX1MyLCAgICAgICAgICAgIENMS19QTEwxX0RJVjIsICA0LCAxKSwKIAlERUZfRklYRUQoIi5zMyIsICAgICAgICBDTEtfUzMsICAgICAgICAgICAgQ0xLX1BMTDFfRElWMiwgIDYsIDEpLAorCURFRl9GSVhFRCgiLnNkc3JjIiwgICAgIENMS19TRFNSQywgICAgICAgICBDTEtfUExMMV9ESVYyLCAgMiwgMSksCiAKIAkvKiBDb3JlIENsb2NrIE91dHB1dHMgKi8KIAlERUZfRklYRUQoInp0ciIsICAgICAgICBSOEE3Nzk2X0NMS19aVFIsICAgQ0xLX1BMTDFfRElWMiwgIDYsIDEpLApAQCAtOTIsMTMgKzk0LDQyIEBACiAJREVGX0ZJWEVEKCJzM2QyIiwgICAgICAgUjhBNzc5Nl9DTEtfUzNEMiwgIENMS19TMywgICAgICAgICAyLCAxKSwKIAlERUZfRklYRUQoInMzZDQiLCAgICAgICBSOEE3Nzk2X0NMS19TM0Q0LCAgQ0xLX1MzLCAgICAgICAgIDQsIDEpLAogCisJREVGX0dFTjNfU0QoInNkMCIsICAgICAgUjhBNzc5Nl9DTEtfU0QwLCAgIENMS19TRFNSQywgICAgMHgwMDc0KSwKKwlERUZfR0VOM19TRCgic2QxIiwgICAgICBSOEE3Nzk2X0NMS19TRDEsICAgQ0xLX1NEU1JDLCAgICAweDAwNzgpLAorCURFRl9HRU4zX1NEKCJzZDIiLCAgICAgIFI4QTc3OTZfQ0xLX1NEMiwgICBDTEtfU0RTUkMsICAgIDB4MDI2OCksCisJREVGX0dFTjNfU0QoInNkMyIsICAgICAgUjhBNzc5Nl9DTEtfU0QzLCAgIENMS19TRFNSQywgICAgMHgwMjZjKSwKKwogCURFRl9GSVhFRCgiY2wiLCAgICAgICAgIFI4QTc3OTZfQ0xLX0NMLCAgICBDTEtfUExMMV9ESVYyLCA0OCwgMSksCiAJREVGX0ZJWEVEKCJjcCIsICAgICAgICAgUjhBNzc5Nl9DTEtfQ1AsICAgIENMS19FWFRBTCwgICAgICAyLCAxKSwKKworCURFRl9ESVY2X1JPKCJvc2MiLCAgICAgIFI4QTc3OTZfQ0xLX09TQywgICBDTEtfRVhUQUwsIENQR19SQ0tDUiwgIDgpLAorCURFRl9ESVY2X1JPKCJyX2ludCIsICAgIENMS19SSU5ULCAgICAgICAgICBDTEtfRVhUQUwsIENQR19SQ0tDUiwgMzIpLAorCisJREVGX0JBU0UoInIiLCAgICAgICAgICAgUjhBNzc5Nl9DTEtfUiwgICAgIENMS19UWVBFX0dFTjNfUiwgQ0xLX1JJTlQpLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBtc3NyX21vZF9jbGsgcjhhNzc5Nl9tb2RfY2xrc1tdIF9faW5pdGNvbnN0ID0geworCURFRl9NT0QoImNtdDMiLAkJCSAzMDAsCVI4QTc3OTZfQ0xLX1IpLAorCURFRl9NT0QoImNtdDIiLAkJCSAzMDEsCVI4QTc3OTZfQ0xLX1IpLAorCURFRl9NT0QoImNtdDEiLAkJCSAzMDIsCVI4QTc3OTZfQ0xLX1IpLAorCURFRl9NT0QoImNtdDAiLAkJCSAzMDMsCVI4QTc3OTZfQ0xLX1IpLAogCURFRl9NT0QoInNjaWYyIiwJCSAzMTAsCVI4QTc3OTZfQ0xLX1MzRDQpLAorCURFRl9NT0QoInNkaWYzIiwJCSAzMTEsCVI4QTc3OTZfQ0xLX1NEMyksCisJREVGX01PRCgic2RpZjIiLAkJIDMxMiwJUjhBNzc5Nl9DTEtfU0QyKSwKKwlERUZfTU9EKCJzZGlmMSIsCQkgMzEzLAlSOEE3Nzk2X0NMS19TRDEpLAorCURFRl9NT0QoInNkaWYwIiwJCSAzMTQsCVI4QTc3OTZfQ0xLX1NEMCksCisJREVGX01PRCgicndkdDAiLAkJIDQwMiwJUjhBNzc5Nl9DTEtfUiksCiAJREVGX01PRCgiaW50Yy1hcCIsCQkgNDA4LAlSOEE3Nzk2X0NMS19TM0QxKSwKKwlERUZfTU9EKCJ0aGVybWFsIiwJCSA1MjIsCVI4QTc3OTZfQ0xLX0NQKSwKKwlERUZfTU9EKCJldGhlcmF2YiIsCQkgODEyLAlSOEE3Nzk2X0NMS19TMEQ2KSwKKwlERUZfTU9EKCJncGlvNyIsCQkgOTA1LAlSOEE3Nzk2X0NMS19TM0Q0KSwKKwlERUZfTU9EKCJncGlvNiIsCQkgOTA2LAlSOEE3Nzk2X0NMS19TM0Q0KSwKKwlERUZfTU9EKCJncGlvNSIsCQkgOTA3LAlSOEE3Nzk2X0NMS19TM0Q0KSwKKwlERUZfTU9EKCJncGlvNCIsCQkgOTA4LAlSOEE3Nzk2X0NMS19TM0Q0KSwKKwlERUZfTU9EKCJncGlvMyIsCQkgOTA5LAlSOEE3Nzk2X0NMS19TM0Q0KSwKKwlERUZfTU9EKCJncGlvMiIsCQkgOTEwLAlSOEE3Nzk2X0NMS19TM0Q0KSwKKwlERUZfTU9EKCJncGlvMSIsCQkgOTExLAlSOEE3Nzk2X0NMS19TM0Q0KSwKKwlERUZfTU9EKCJncGlvMCIsCQkgOTEyLAlSOEE3Nzk2X0NMS19TM0Q0KSwKIH07CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcjhhNzc5Nl9jcml0X21vZF9jbGtzW10gX19pbml0Y29uc3QgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9yb2NrY2hpcC9NYWtlZmlsZSBiL2RyaXZlcnMvY2xrL3JvY2tjaGlwL01ha2VmaWxlCmluZGV4IGY0N2EyZmEuLmI1ZjJjOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3JvY2tjaGlwL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2xrL3JvY2tjaGlwL01ha2VmaWxlCkBAIC04LDYgKzgsNyBAQAogb2JqLXkJKz0gY2xrLWNwdS5vCiBvYmoteQkrPSBjbGstaW52ZXJ0ZXIubwogb2JqLXkJKz0gY2xrLW1tYy1waGFzZS5vCitvYmoteQkrPSBjbGstZGRyLm8KIG9iai0kKENPTkZJR19SRVNFVF9DT05UUk9MTEVSKQkrPSBzb2Z0cnN0Lm8KIAogb2JqLXkJKz0gY2xrLXJrMzAzNi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9yb2NrY2hpcC9jbGstZGRyLmMgYi9kcml2ZXJzL2Nsay9yb2NrY2hpcC9jbGstZGRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZlYmE5MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2xrL3JvY2tjaGlwL2Nsay1kZHIuYwpAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBSb2NrY2hpcCBFbGVjdHJvbmljcyBDby4gTHRkLgorICogQXV0aG9yOiBMaW4gSHVhbmcgPGhsQHJvY2stY2hpcHMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYXJtLXNtY2NjLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8c29jL3JvY2tjaGlwL3JvY2tjaGlwX3NpcC5oPgorI2luY2x1ZGUgImNsay5oIgorCitzdHJ1Y3Qgcm9ja2NoaXBfZGRyY2xrIHsKKwlzdHJ1Y3QgY2xrX2h3CWh3OworCXZvaWQgX19pb21lbQkqcmVnX2Jhc2U7CisJaW50CQltdXhfb2Zmc2V0OworCWludAkJbXV4X3NoaWZ0OworCWludAkJbXV4X3dpZHRoOworCWludAkJZGl2X3NoaWZ0OworCWludAkJZGl2X3dpZHRoOworCWludAkJZGRyX2ZsYWc7CisJc3BpbmxvY2tfdAkqbG9jazsKK307CisKKyNkZWZpbmUgdG9fcm9ja2NoaXBfZGRyY2xrX2h3KGh3KSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCByb2NrY2hpcF9kZHJjbGssIGh3KQorCitzdGF0aWMgaW50IHJvY2tjaGlwX2RkcmNsa19zaXBfc2V0X3JhdGUoc3RydWN0IGNsa19odyAqaHcsIHVuc2lnbmVkIGxvbmcgZHJhdGUsCisJCQkJCXVuc2lnbmVkIGxvbmcgcHJhdGUpCit7CisJc3RydWN0IHJvY2tjaGlwX2RkcmNsayAqZGRyY2xrID0gdG9fcm9ja2NoaXBfZGRyY2xrX2h3KGh3KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBhcm1fc21jY2NfcmVzIHJlczsKKworCXNwaW5fbG9ja19pcnFzYXZlKGRkcmNsay0+bG9jaywgZmxhZ3MpOworCWFybV9zbWNjY19zbWMoUk9DS0NISVBfU0lQX0RSQU1fRlJFUSwgZHJhdGUsIDAsCisJCSAgICAgIFJPQ0tDSElQX1NJUF9DT05GSUdfRFJBTV9TRVRfUkFURSwKKwkJICAgICAgMCwgMCwgMCwgMCwgJnJlcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShkZHJjbGstPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXMuYTA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCityb2NrY2hpcF9kZHJjbGtfc2lwX3JlY2FsY19yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LAorCQkJCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUpCit7CisJc3RydWN0IGFybV9zbWNjY19yZXMgcmVzOworCisJYXJtX3NtY2NjX3NtYyhST0NLQ0hJUF9TSVBfRFJBTV9GUkVRLCAwLCAwLAorCQkgICAgICBST0NLQ0hJUF9TSVBfQ09ORklHX0RSQU1fR0VUX1JBVEUsCisJCSAgICAgIDAsIDAsIDAsIDAsICZyZXMpOworCisJcmV0dXJuIHJlcy5hMDsKK30KKworc3RhdGljIGxvbmcgcm9ja2NoaXBfZGRyY2xrX3NpcF9yb3VuZF9yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LAorCQkJCQkgICB1bnNpZ25lZCBsb25nIHJhdGUsCisJCQkJCSAgIHVuc2lnbmVkIGxvbmcgKnByYXRlKQoreworCXN0cnVjdCBhcm1fc21jY2NfcmVzIHJlczsKKworCWFybV9zbWNjY19zbWMoUk9DS0NISVBfU0lQX0RSQU1fRlJFUSwgcmF0ZSwgMCwKKwkJICAgICAgUk9DS0NISVBfU0lQX0NPTkZJR19EUkFNX1JPVU5EX1JBVEUsCisJCSAgICAgIDAsIDAsIDAsIDAsICZyZXMpOworCisJcmV0dXJuIHJlcy5hMDsKK30KKworc3RhdGljIHU4IHJvY2tjaGlwX2RkcmNsa19nZXRfcGFyZW50KHN0cnVjdCBjbGtfaHcgKmh3KQoreworCXN0cnVjdCByb2NrY2hpcF9kZHJjbGsgKmRkcmNsayA9IHRvX3JvY2tjaGlwX2RkcmNsa19odyhodyk7CisJaW50IG51bV9wYXJlbnRzID0gY2xrX2h3X2dldF9udW1fcGFyZW50cyhodyk7CisJdTMyIHZhbDsKKworCXZhbCA9IGNsa19yZWFkbChkZHJjbGstPnJlZ19iYXNlICsKKwkJCWRkcmNsay0+bXV4X29mZnNldCkgPj4gZGRyY2xrLT5tdXhfc2hpZnQ7CisJdmFsICY9IEdFTk1BU0soZGRyY2xrLT5tdXhfd2lkdGggLSAxLCAwKTsKKworCWlmICh2YWwgPj0gbnVtX3BhcmVudHMpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIHJvY2tjaGlwX2RkcmNsa19zaXBfb3BzID0geworCS5yZWNhbGNfcmF0ZSA9IHJvY2tjaGlwX2RkcmNsa19zaXBfcmVjYWxjX3JhdGUsCisJLnNldF9yYXRlID0gcm9ja2NoaXBfZGRyY2xrX3NpcF9zZXRfcmF0ZSwKKwkucm91bmRfcmF0ZSA9IHJvY2tjaGlwX2RkcmNsa19zaXBfcm91bmRfcmF0ZSwKKwkuZ2V0X3BhcmVudCA9IHJvY2tjaGlwX2RkcmNsa19nZXRfcGFyZW50LAorfTsKKworc3RydWN0IGNsayAqcm9ja2NoaXBfY2xrX3JlZ2lzdGVyX2RkcmNsayhjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZ3MsCisJCQkJCSBjb25zdCBjaGFyICpjb25zdCAqcGFyZW50X25hbWVzLAorCQkJCQkgdTggbnVtX3BhcmVudHMsIGludCBtdXhfb2Zmc2V0LAorCQkJCQkgaW50IG11eF9zaGlmdCwgaW50IG11eF93aWR0aCwKKwkJCQkJIGludCBkaXZfc2hpZnQsIGludCBkaXZfd2lkdGgsCisJCQkJCSBpbnQgZGRyX2ZsYWcsIHZvaWQgX19pb21lbSAqcmVnX2Jhc2UsCisJCQkJCSBzcGlubG9ja190ICpsb2NrKQoreworCXN0cnVjdCByb2NrY2hpcF9kZHJjbGsgKmRkcmNsazsKKwlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OworCXN0cnVjdCBjbGsgKmNsazsKKworCWRkcmNsayA9IGt6YWxsb2Moc2l6ZW9mKCpkZHJjbGspLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRkcmNsaykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpbml0Lm5hbWUgPSBuYW1lOworCWluaXQucGFyZW50X25hbWVzID0gcGFyZW50X25hbWVzOworCWluaXQubnVtX3BhcmVudHMgPSBudW1fcGFyZW50czsKKworCWluaXQuZmxhZ3MgPSBmbGFnczsKKwlpbml0LmZsYWdzIHw9IENMS19TRVRfUkFURV9OT19SRVBBUkVOVDsKKworCXN3aXRjaCAoZGRyX2ZsYWcpIHsKKwljYXNlIFJPQ0tDSElQX0REUkNMS19TSVA6CisJCWluaXQub3BzID0gJnJvY2tjaGlwX2RkcmNsa19zaXBfb3BzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiB1bnN1cHBvcnRlZCBkZHJjbGsgdHlwZSAlZFxuIiwgX19mdW5jX18sIGRkcl9mbGFnKTsKKwkJa2ZyZWUoZGRyY2xrKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJZGRyY2xrLT5yZWdfYmFzZSA9IHJlZ19iYXNlOworCWRkcmNsay0+bG9jayA9IGxvY2s7CisJZGRyY2xrLT5ody5pbml0ID0gJmluaXQ7CisJZGRyY2xrLT5tdXhfb2Zmc2V0ID0gbXV4X29mZnNldDsKKwlkZHJjbGstPm11eF9zaGlmdCA9IG11eF9zaGlmdDsKKwlkZHJjbGstPm11eF93aWR0aCA9IG11eF93aWR0aDsKKwlkZHJjbGstPmRpdl9zaGlmdCA9IGRpdl9zaGlmdDsKKwlkZHJjbGstPmRpdl93aWR0aCA9IGRpdl93aWR0aDsKKwlkZHJjbGstPmRkcl9mbGFnID0gZGRyX2ZsYWc7CisKKwljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJmRkcmNsay0+aHcpOworCWlmIChJU19FUlIoY2xrKSkgeworCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgcmVnaXN0ZXIgZGRyY2xrICVzXG4iLCBfX2Z1bmNfXywJbmFtZSk7CisJCWtmcmVlKGRkcmNsayk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBjbGs7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9yb2NrY2hpcC9jbGstcGxsLmMgYi9kcml2ZXJzL2Nsay9yb2NrY2hpcC9jbGstcGxsLmMKaW5kZXggZGI4MWU0NS4uOWMxMzczZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvcm9ja2NoaXAvY2xrLXBsbC5jCisrKyBiL2RyaXZlcnMvY2xrL3JvY2tjaGlwL2Nsay1wbGwuYwpAQCAtODM3LDcgKzgzNyw3IEBACiAJCXU4IG51bV9wYXJlbnRzLCBpbnQgY29uX29mZnNldCwgaW50IGdyZl9sb2NrX29mZnNldCwKIAkJaW50IGxvY2tfc2hpZnQsIGludCBtb2RlX29mZnNldCwgaW50IG1vZGVfc2hpZnQsCiAJCXN0cnVjdCByb2NrY2hpcF9wbGxfcmF0ZV90YWJsZSAqcmF0ZV90YWJsZSwKLQkJdTggY2xrX3BsbF9mbGFncykKKwkJdW5zaWduZWQgbG9uZyBmbGFncywgdTggY2xrX3BsbF9mbGFncykKIHsKIAljb25zdCBjaGFyICpwbGxfcGFyZW50c1szXTsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OwpAQCAtODkyLDcgKzg5Miw3IEBACiAJaW5pdC5uYW1lID0gcGxsX25hbWU7CiAKIAkvKiBrZWVwIGFsbCBwbGxzIHVudG91Y2hlZCBmb3Igbm93ICovCi0JaW5pdC5mbGFncyA9IENMS19JR05PUkVfVU5VU0VEOworCWluaXQuZmxhZ3MgPSBmbGFncyB8IENMS19JR05PUkVfVU5VU0VEOwogCiAJaW5pdC5wYXJlbnRfbmFtZXMgPSAmcGFyZW50X25hbWVzWzBdOwogCWluaXQubnVtX3BhcmVudHMgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvcm9ja2NoaXAvY2xrLXJrMzM5OS5jIGIvZHJpdmVycy9jbGsvcm9ja2NoaXAvY2xrLXJrMzM5OS5jCmluZGV4IGMxMDlkODAuLjgzODdjN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3JvY2tjaGlwL2Nsay1yazMzOTkuYworKysgYi9kcml2ZXJzL2Nsay9yb2NrY2hpcC9jbGstcmszMzk5LmMKQEAgLTEwMCw4ICsxMDAsMTAgQEAKIAlSSzMwMzZfUExMX1JBVEUoIDI5NzAwMDAwMCwgMSwgOTksIDQsIDIsIDEsIDApLAogCVJLMzAzNl9QTExfUkFURSggMjE2MDAwMDAwLCAxLCA3MiwgNCwgMiwgMSwgMCksCiAJUkszMDM2X1BMTF9SQVRFKCAxNDg1MDAwMDAsIDEsIDk5LCA0LCA0LCAxLCAwKSwKKwlSSzMwMzZfUExMX1JBVEUoIDEwNjUwMDAwMCwgMSwgNzEsIDQsIDQsIDEsIDApLAogCVJLMzAzNl9QTExfUkFURSggIDk2MDAwMDAwLCAxLCA2NCwgNCwgNCwgMSwgMCksCiAJUkszMDM2X1BMTF9SQVRFKCAgNzQyNTAwMDAsIDIsIDk5LCA0LCA0LCAxLCAwKSwKKwlSSzMwMzZfUExMX1JBVEUoICA2NTAwMDAwMCwgMSwgNjUsIDYsIDQsIDEsIDApLAogCVJLMzAzNl9QTExfUkFURSggIDU0MDAwMDAwLCAxLCA1NCwgNiwgNCwgMSwgMCksCiAJUkszMDM2X1BMTF9SQVRFKCAgMjcwMDAwMDAsIDEsIDI3LCA2LCA0LCAxLCAwKSwKIAl7IC8qIHNlbnRpbmVsICovIH0sCkBAIC0xMTgsNiArMTIwLDEwIEBACiAJCQkJCQkgICAgImNsa19jb3JlX2JfYnBsbF9zcmMiLAogCQkJCQkJICAgICJjbGtfY29yZV9iX2RwbGxfc3JjIiwKIAkJCQkJCSAgICAiY2xrX2NvcmVfYl9ncGxsX3NyYyIgfTsKK1BOQU1FKG11eF9kZHJjbGtfcCkJCQkJPSB7ICJjbGtfZGRyY19scGxsX3NyYyIsCisJCQkJCQkgICAgImNsa19kZHJjX2JwbGxfc3JjIiwKKwkJCQkJCSAgICAiY2xrX2RkcmNfZHBsbF9zcmMiLAorCQkJCQkJICAgICJjbGtfZGRyY19ncGxsX3NyYyIgfTsKIFBOQU1FKG11eF9hY2xrX2NjaV9wKQkJCQk9IHsgImNwbGxfYWNsa19jY2lfc3JjIiwKIAkJCQkJCSAgICAiZ3BsbF9hY2xrX2NjaV9zcmMiLAogCQkJCQkJICAgICJucGxsX2FjbGtfY2NpX3NyYyIsCkBAIC0zNzMsNiArMzc5LDcgQEAKIAlSSzMzOTlfQ1BVQ0xLQl9SQVRFKDIxODQwMDAwMDAsIDEsIDExLCAxMSksCiAJUkszMzk5X0NQVUNMS0JfUkFURSgyMDg4MDAwMDAwLCAxLCAxMCwgMTApLAogCVJLMzM5OV9DUFVDTEtCX1JBVEUoMjA0MDAwMDAwMCwgMSwgMTAsIDEwKSwKKwlSSzMzOTlfQ1BVQ0xLQl9SQVRFKDIwMTYwMDAwMDAsIDEsIDksIDkpLAogCVJLMzM5OV9DUFVDTEtCX1JBVEUoMTk5MjAwMDAwMCwgMSwgOSwgOSksCiAJUkszMzk5X0NQVUNMS0JfUkFURSgxODk2MDAwMDAwLCAxLCA5LCA5KSwKIAlSSzMzOTlfQ1BVQ0xLQl9SQVRFKDE4MDAwMDAwMDAsIDEsIDgsIDgpLApAQCAtNTc4LDcgKzU4NSw3IEBACiAJQ09NUE9TSVRFKDAsICJjbGtfc3BkaWZfZGl2IiwgbXV4X3BsbF9zcmNfY3BsbF9ncGxsX3AsIDAsCiAJCQlSSzMzOTlfQ0xLU0VMX0NPTigzMiksIDcsIDEsIE1GTEFHUywgMCwgNywgREZMQUdTLAogCQkJUkszMzk5X0NMS0dBVEVfQ09OKDgpLCAxMywgR0ZMQUdTKSwKLQlDT01QT1NJVEVfRlJBQ01VWCgwLCAiY2xrX3NwZGlmX2ZyYWMiLCAiY2xrX3NwZGlmX2RpdiIsIENMS19TRVRfUkFURV9QQVJFTlQsCisJQ09NUE9TSVRFX0ZSQUNNVVgoMCwgImNsa19zcGRpZl9mcmFjIiwgImNsa19zcGRpZl9kaXYiLCAwLAogCQkJUkszMzk5X0NMS1NFTF9DT04oOTkpLCAwLAogCQkJUkszMzk5X0NMS0dBVEVfQ09OKDgpLCAxNCwgR0ZMQUdTLAogCQkJJnJrMzM5OV9zcGRpZl9mcmFjbXV4KSwKQEAgLTU5Miw3ICs1OTksNyBAQAogCUNPTVBPU0lURSgwLCAiY2xrX2kyczBfZGl2IiwgbXV4X3BsbF9zcmNfY3BsbF9ncGxsX3AsIDAsCiAJCQlSSzMzOTlfQ0xLU0VMX0NPTigyOCksIDcsIDEsIE1GTEFHUywgMCwgNywgREZMQUdTLAogCQkJUkszMzk5X0NMS0dBVEVfQ09OKDgpLCAzLCBHRkxBR1MpLAotCUNPTVBPU0lURV9GUkFDTVVYKDAsICJjbGtfaTJzMF9mcmFjIiwgImNsa19pMnMwX2RpdiIsIENMS19TRVRfUkFURV9QQVJFTlQsCisJQ09NUE9TSVRFX0ZSQUNNVVgoMCwgImNsa19pMnMwX2ZyYWMiLCAiY2xrX2kyczBfZGl2IiwgMCwKIAkJCVJLMzM5OV9DTEtTRUxfQ09OKDk2KSwgMCwKIAkJCVJLMzM5OV9DTEtHQVRFX0NPTig4KSwgNCwgR0ZMQUdTLAogCQkJJnJrMzM5OV9pMnMwX2ZyYWNtdXgpLApAQCAtNjAyLDcgKzYwOSw3IEBACiAJQ09NUE9TSVRFKDAsICJjbGtfaTJzMV9kaXYiLCBtdXhfcGxsX3NyY19jcGxsX2dwbGxfcCwgMCwKIAkJCVJLMzM5OV9DTEtTRUxfQ09OKDI5KSwgNywgMSwgTUZMQUdTLCAwLCA3LCBERkxBR1MsCiAJCQlSSzMzOTlfQ0xLR0FURV9DT04oOCksIDYsIEdGTEFHUyksCi0JQ09NUE9TSVRFX0ZSQUNNVVgoMCwgImNsa19pMnMxX2ZyYWMiLCAiY2xrX2kyczFfZGl2IiwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwKKwlDT01QT1NJVEVfRlJBQ01VWCgwLCAiY2xrX2kyczFfZnJhYyIsICJjbGtfaTJzMV9kaXYiLCAwLAogCQkJUkszMzk5X0NMS1NFTF9DT04oOTcpLCAwLAogCQkJUkszMzk5X0NMS0dBVEVfQ09OKDgpLCA3LCBHRkxBR1MsCiAJCQkmcmszMzk5X2kyczFfZnJhY211eCksCkBAIC02MTIsNyArNjE5LDcgQEAKIAlDT01QT1NJVEUoMCwgImNsa19pMnMyX2RpdiIsIG11eF9wbGxfc3JjX2NwbGxfZ3BsbF9wLCAwLAogCQkJUkszMzk5X0NMS1NFTF9DT04oMzApLCA3LCAxLCBNRkxBR1MsIDAsIDcsIERGTEFHUywKIAkJCVJLMzM5OV9DTEtHQVRFX0NPTig4KSwgOSwgR0ZMQUdTKSwKLQlDT01QT1NJVEVfRlJBQ01VWCgwLCAiY2xrX2kyczJfZnJhYyIsICJjbGtfaTJzMl9kaXYiLCBDTEtfU0VUX1JBVEVfUEFSRU5ULAorCUNPTVBPU0lURV9GUkFDTVVYKDAsICJjbGtfaTJzMl9mcmFjIiwgImNsa19pMnMyX2RpdiIsIDAsCiAJCQlSSzMzOTlfQ0xLU0VMX0NPTig5OCksIDAsCiAJCQlSSzMzOTlfQ0xLR0FURV9DT04oOCksIDEwLCBHRkxBR1MsCiAJCQkmcmszMzk5X2kyczJfZnJhY211eCksCkBAIC02MzEsNyArNjM4LDcgQEAKIAlDT01QT1NJVEVfTk9NVVgoMCwgImNsa191YXJ0MF9kaXYiLCAiY2xrX3VhcnQwX3NyYyIsIDAsCiAJCQlSSzMzOTlfQ0xLU0VMX0NPTigzMyksIDAsIDcsIERGTEFHUywKIAkJCVJLMzM5OV9DTEtHQVRFX0NPTig5KSwgMCwgR0ZMQUdTKSwKLQlDT01QT1NJVEVfRlJBQ01VWCgwLCAiY2xrX3VhcnQwX2ZyYWMiLCAiY2xrX3VhcnQwX2RpdiIsIENMS19TRVRfUkFURV9QQVJFTlQsCisJQ09NUE9TSVRFX0ZSQUNNVVgoMCwgImNsa191YXJ0MF9mcmFjIiwgImNsa191YXJ0MF9kaXYiLCAwLAogCQkJUkszMzk5X0NMS1NFTF9DT04oMTAwKSwgMCwKIAkJCVJLMzM5OV9DTEtHQVRFX0NPTig5KSwgMSwgR0ZMQUdTLAogCQkJJnJrMzM5OV91YXJ0MF9mcmFjbXV4KSwKQEAgLTY0MSw3ICs2NDgsNyBAQAogCUNPTVBPU0lURV9OT01VWCgwLCAiY2xrX3VhcnQxX2RpdiIsICJjbGtfdWFydF9zcmMiLCAwLAogCQkJUkszMzk5X0NMS1NFTF9DT04oMzQpLCAwLCA3LCBERkxBR1MsCiAJCQlSSzMzOTlfQ0xLR0FURV9DT04oOSksIDIsIEdGTEFHUyksCi0JQ09NUE9TSVRFX0ZSQUNNVVgoMCwgImNsa191YXJ0MV9mcmFjIiwgImNsa191YXJ0MV9kaXYiLCBDTEtfU0VUX1JBVEVfUEFSRU5ULAorCUNPTVBPU0lURV9GUkFDTVVYKDAsICJjbGtfdWFydDFfZnJhYyIsICJjbGtfdWFydDFfZGl2IiwgMCwKIAkJCVJLMzM5OV9DTEtTRUxfQ09OKDEwMSksIDAsCiAJCQlSSzMzOTlfQ0xLR0FURV9DT04oOSksIDMsIEdGTEFHUywKIAkJCSZyazMzOTlfdWFydDFfZnJhY211eCksCkBAIC02NDksNyArNjU2LDcgQEAKIAlDT01QT1NJVEVfTk9NVVgoMCwgImNsa191YXJ0Ml9kaXYiLCAiY2xrX3VhcnRfc3JjIiwgMCwKIAkJCVJLMzM5OV9DTEtTRUxfQ09OKDM1KSwgMCwgNywgREZMQUdTLAogCQkJUkszMzk5X0NMS0dBVEVfQ09OKDkpLCA0LCBHRkxBR1MpLAotCUNPTVBPU0lURV9GUkFDTVVYKDAsICJjbGtfdWFydDJfZnJhYyIsICJjbGtfdWFydDJfZGl2IiwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwKKwlDT01QT1NJVEVfRlJBQ01VWCgwLCAiY2xrX3VhcnQyX2ZyYWMiLCAiY2xrX3VhcnQyX2RpdiIsIDAsCiAJCQlSSzMzOTlfQ0xLU0VMX0NPTigxMDIpLCAwLAogCQkJUkszMzk5X0NMS0dBVEVfQ09OKDkpLCA1LCBHRkxBR1MsCiAJCQkmcmszMzk5X3VhcnQyX2ZyYWNtdXgpLApAQCAtNjU3LDcgKzY2NCw3IEBACiAJQ09NUE9TSVRFX05PTVVYKDAsICJjbGtfdWFydDNfZGl2IiwgImNsa191YXJ0X3NyYyIsIDAsCiAJCQlSSzMzOTlfQ0xLU0VMX0NPTigzNiksIDAsIDcsIERGTEFHUywKIAkJCVJLMzM5OV9DTEtHQVRFX0NPTig5KSwgNiwgR0ZMQUdTKSwKLQlDT01QT1NJVEVfRlJBQ01VWCgwLCAiY2xrX3VhcnQzX2ZyYWMiLCAiY2xrX3VhcnQzX2RpdiIsIENMS19TRVRfUkFURV9QQVJFTlQsCisJQ09NUE9TSVRFX0ZSQUNNVVgoMCwgImNsa191YXJ0M19mcmFjIiwgImNsa191YXJ0M19kaXYiLCAwLAogCQkJUkszMzk5X0NMS1NFTF9DT04oMTAzKSwgMCwKIAkJCVJLMzM5OV9DTEtHQVRFX0NPTig5KSwgNywgR0ZMQUdTLAogCQkJJnJrMzM5OV91YXJ0M19mcmFjbXV4KSwKQEAgLTgzMyw5ICs4NDAsOSBAQAogCiAJLyogcGVyaWhwICovCiAJR0FURSgwLCAiY3BsbF9hY2xrX3BlcmlocF9zcmMiLCAiY3BsbCIsIENMS19JR05PUkVfVU5VU0VELAotCQkJUkszMzk5X0NMS0dBVEVfQ09OKDUpLCAwLCBHRkxBR1MpLAotCUdBVEUoMCwgImdwbGxfYWNsa19wZXJpaHBfc3JjIiwgImdwbGwiLCBDTEtfSUdOT1JFX1VOVVNFRCwKIAkJCVJLMzM5OV9DTEtHQVRFX0NPTig1KSwgMSwgR0ZMQUdTKSwKKwlHQVRFKDAsICJncGxsX2FjbGtfcGVyaWhwX3NyYyIsICJncGxsIiwgQ0xLX0lHTk9SRV9VTlVTRUQsCisJCQlSSzMzOTlfQ0xLR0FURV9DT04oNSksIDAsIEdGTEFHUyksCiAJQ09NUE9TSVRFKEFDTEtfUEVSSUhQLCAiYWNsa19wZXJpaHAiLCBtdXhfYWNsa19wZXJpaHBfcCwgQ0xLX0lHTk9SRV9VTlVTRUQsCiAJCQlSSzMzOTlfQ0xLU0VMX0NPTigxNCksIDcsIDEsIE1GTEFHUywgMCwgNSwgREZMQUdTLAogCQkJUkszMzk5X0NMS0dBVEVfQ09OKDUpLCAyLCBHRkxBR1MpLApAQCAtODQ2LDkgKzg1Myw5IEBACiAJCQlSSzMzOTlfQ0xLU0VMX0NPTigxNCksIDEyLCAyLCBERkxBR1MsCiAJCQlSSzMzOTlfQ0xLR0FURV9DT04oNSksIDQsIEdGTEFHUyksCiAKLQlHQVRFKEFDTEtfUEVSRl9QQ0lFLCAiYWNsa19wZXJmX3BjaWUiLCAiYWNsa19wZXJpaHAiLCBDTEtfSUdOT1JFX1VOVVNFRCwKKwlHQVRFKEFDTEtfUEVSRl9QQ0lFLCAiYWNsa19wZXJmX3BjaWUiLCAiYWNsa19wZXJpaHAiLCAwLAogCQkJUkszMzk5X0NMS0dBVEVfQ09OKDIwKSwgMiwgR0ZMQUdTKSwKLQlHQVRFKEFDTEtfUENJRSwgImFjbGtfcGNpZSIsICJhY2xrX3BlcmlocCIsIENMS19JR05PUkVfVU5VU0VELAorCUdBVEUoQUNMS19QQ0lFLCAiYWNsa19wY2llIiwgImFjbGtfcGVyaWhwIiwgMCwKIAkJCVJLMzM5OV9DTEtHQVRFX0NPTigyMCksIDEwLCBHRkxBR1MpLAogCUdBVEUoMCwgImFjbGtfcGVyaWhwX25vYyIsICJhY2xrX3BlcmlocCIsIENMS19JR05PUkVfVU5VU0VELAogCQkJUkszMzk5X0NMS0dBVEVfQ09OKDIwKSwgMTIsIEdGTEFHUyksCkBAIC05MjMsOSArOTMwLDkgQEAKIAkJCVJLMzM5OV9DTEtHQVRFX0NPTig2KSwgMTQsIEdGTEFHUyksCiAKIAlHQVRFKDAsICJjcGxsX2FjbGtfZW1tY19zcmMiLCAiY3BsbCIsIENMS19JR05PUkVfVU5VU0VELAotCQkJUkszMzk5X0NMS0dBVEVfQ09OKDYpLCAxMiwgR0ZMQUdTKSwKLQlHQVRFKDAsICJncGxsX2FjbGtfZW1tY19zcmMiLCAiZ3BsbCIsIENMS19JR05PUkVfVU5VU0VELAogCQkJUkszMzk5X0NMS0dBVEVfQ09OKDYpLCAxMywgR0ZMQUdTKSwKKwlHQVRFKDAsICJncGxsX2FjbGtfZW1tY19zcmMiLCAiZ3BsbCIsIENMS19JR05PUkVfVU5VU0VELAorCQkJUkszMzk5X0NMS0dBVEVfQ09OKDYpLCAxMiwgR0ZMQUdTKSwKIAlDT01QT1NJVEVfTk9HQVRFKEFDTEtfRU1NQywgImFjbGtfZW1tYyIsIG11eF9hY2xrX2VtbWNfcCwgQ0xLX0lHTk9SRV9VTlVTRUQsCiAJCQlSSzMzOTlfQ0xLU0VMX0NPTigyMSksIDcsIDEsIE1GTEFHUywgMCwgNSwgREZMQUdTKSwKIAlHQVRFKEFDTEtfRU1NQ19DT1JFLCAiYWNsa19lbW1jY29yZSIsICJhY2xrX2VtbWMiLCBDTEtfSUdOT1JFX1VOVVNFRCwKQEAgLTEwNzEsNyArMTA3OCw3IEBACiAJLyogdmlvICovCiAJQ09NUE9TSVRFKEFDTEtfVklPLCAiYWNsa192aW8iLCBtdXhfcGxsX3NyY19jcGxsX2dwbGxfcHBsbF9wLCBDTEtfSUdOT1JFX1VOVVNFRCwKIAkJCVJLMzM5OV9DTEtTRUxfQ09OKDQyKSwgNiwgMiwgTUZMQUdTLCAwLCA1LCBERkxBR1MsCi0JCQlSSzMzOTlfQ0xLR0FURV9DT04oMTEpLCAxMCwgR0ZMQUdTKSwKKwkJCVJLMzM5OV9DTEtHQVRFX0NPTigxMSksIDAsIEdGTEFHUyksCiAJQ09NUE9TSVRFX05PTVVYKFBDTEtfVklPLCAicGNsa192aW8iLCAiYWNsa192aW8iLCAwLAogCQkJUkszMzk5X0NMS1NFTF9DT04oNDMpLCAwLCA1LCBERkxBR1MsCiAJCQlSSzMzOTlfQ0xLR0FURV9DT04oMTEpLCAxLCBHRkxBR1MpLApAQCAtMTE2MSw3ICsxMTY4LDcgQEAKIAkJCVJLMzM5OV9DTEtTRUxfQ09OKDQ5KSwgOCwgMiwgTUZMQUdTLCAwLCA4LCBERkxBR1MsCiAJCQlSSzMzOTlfQ0xLR0FURV9DT04oMTApLCAxMiwgR0ZMQUdTKSwKIAotCUNPTVBPU0lURV9GUkFDTVVYX05PR0FURSgwLCAiZGNsa192b3AwX2ZyYWMiLCAiZGNsa192b3AwX2RpdiIsIENMS19TRVRfUkFURV9QQVJFTlQsCisJQ09NUE9TSVRFX0ZSQUNNVVhfTk9HQVRFKERDTEtfVk9QMF9GUkFDLCAiZGNsa192b3AwX2ZyYWMiLCAiZGNsa192b3AwX2RpdiIsIDAsCiAJCQlSSzMzOTlfQ0xLU0VMX0NPTigxMDYpLCAwLAogCQkJJnJrMzM5OV9kY2xrX3ZvcDBfZnJhY211eCksCiAKQEAgLTExOTEsNyArMTE5OCw3IEBACiAJCQlSSzMzOTlfQ0xLU0VMX0NPTig1MCksIDgsIDIsIE1GTEFHUywgMCwgOCwgREZMQUdTLAogCQkJUkszMzk5X0NMS0dBVEVfQ09OKDEwKSwgMTMsIEdGTEFHUyksCiAKLQlDT01QT1NJVEVfRlJBQ01VWF9OT0dBVEUoMCwgImRjbGtfdm9wMV9mcmFjIiwgImRjbGtfdm9wMV9kaXYiLCBDTEtfU0VUX1JBVEVfUEFSRU5ULAorCUNPTVBPU0lURV9GUkFDTVVYX05PR0FURShEQ0xLX1ZPUDFfRlJBQywgImRjbGtfdm9wMV9mcmFjIiwgImRjbGtfdm9wMV9kaXYiLCAwLAogCQkJUkszMzk5X0NMS1NFTF9DT04oMTA3KSwgMCwKIAkJCSZyazMzOTlfZGNsa192b3AxX2ZyYWNtdXgpLAogCkBAIC0xMzA1LDcgKzEzMTIsNyBAQAogCS8qIHRlc3RvdXQgKi8KIAlNVVgoMCwgImNsa190ZXN0X3ByZSIsIG11eF9wbGxfc3JjX2NwbGxfZ3BsbF9wLCBDTEtfU0VUX1JBVEVfUEFSRU5ULAogCQkJUkszMzk5X0NMS1NFTF9DT04oNTgpLCA3LCAxLCBNRkxBR1MpLAotCUNPTVBPU0lURV9GUkFDKDAsICJjbGtfdGVzdF9mcmFjIiwgImNsa190ZXN0X3ByZSIsIENMS19TRVRfUkFURV9QQVJFTlQsCisJQ09NUE9TSVRFX0ZSQUMoMCwgImNsa190ZXN0X2ZyYWMiLCAiY2xrX3Rlc3RfcHJlIiwgMCwKIAkJCVJLMzM5OV9DTEtTRUxfQ09OKDEwNSksIDAsCiAJCQlSSzMzOTlfQ0xLR0FURV9DT04oMTMpLCA5LCBHRkxBR1MpLAogCkBAIC0xMzc3LDYgKzEzODQsMTggQEAKIAlDT01QT1NJVEVfTk9NVVgoMCwgImNsa190ZXN0IiwgImNsa190ZXN0X3ByZSIsIENMS19JR05PUkVfVU5VU0VELAogCQkJUkszMzY4X0NMS1NFTF9DT04oNTgpLCAwLCA1LCBERkxBR1MsCiAJCQlSSzMzNjhfQ0xLR0FURV9DT04oMTMpLCAxMSwgR0ZMQUdTKSwKKworCS8qIGRkcmMgKi8KKwlHQVRFKDAsICJjbGtfZGRyY19scGxsX3NyYyIsICJscGxsIiwgMCwgUkszMzk5X0NMS0dBVEVfQ09OKDMpLAorCSAgICAgMCwgR0ZMQUdTKSwKKwlHQVRFKDAsICJjbGtfZGRyY19icGxsX3NyYyIsICJicGxsIiwgMCwgUkszMzk5X0NMS0dBVEVfQ09OKDMpLAorCSAgICAgMSwgR0ZMQUdTKSwKKwlHQVRFKDAsICJjbGtfZGRyY19kcGxsX3NyYyIsICJkcGxsIiwgMCwgUkszMzk5X0NMS0dBVEVfQ09OKDMpLAorCSAgICAgMiwgR0ZMQUdTKSwKKwlHQVRFKDAsICJjbGtfZGRyY19ncGxsX3NyYyIsICJncGxsIiwgMCwgUkszMzk5X0NMS0dBVEVfQ09OKDMpLAorCSAgICAgMywgR0ZMQUdTKSwKKwlDT01QT1NJVEVfRERSQ0xLKFNDTEtfRERSQywgInNjbGtfZGRyYyIsIG11eF9kZHJjbGtfcCwgMCwKKwkJICAgICAgIFJLMzM5OV9DTEtTRUxfQ09OKDYpLCA0LCAyLCAwLCAwLCBST0NLQ0hJUF9ERFJDTEtfU0lQKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgcm9ja2NoaXBfY2xrX2JyYW5jaCByazMzOTlfY2xrX3BtdV9icmFuY2hlc1tdIF9faW5pdGRhdGEgPSB7CkBAIC0xMzk4LDcgKzE0MTcsNyBAQAogCQkJUkszMzk5X1BNVV9DTEtTRUxfQ09OKDEpLCAxMywgMSwgTUZMQUdTLCA4LCA1LCBERkxBR1MsCiAJCQlSSzMzOTlfUE1VX0NMS0dBVEVfQ09OKDApLCA4LCBHRkxBR1MpLAogCi0JQ09NUE9TSVRFX0ZSQUNNVVhfTk9HQVRFKDAsICJjbGtfd2lmaV9mcmFjIiwgImNsa193aWZpX2RpdiIsIENMS19TRVRfUkFURV9QQVJFTlQsCisJQ09NUE9TSVRFX0ZSQUNNVVhfTk9HQVRFKDAsICJjbGtfd2lmaV9mcmFjIiwgImNsa193aWZpX2RpdiIsIDAsCiAJCQlSSzMzOTlfUE1VX0NMS1NFTF9DT04oNyksIDAsCiAJCQkmcmszMzk5X3BtdWNsa193aWZpX2ZyYWNtdXgpLAogCkBAIC0xNDI2LDcgKzE0NDUsNyBAQAogCQkJUkszMzk5X1BNVV9DTEtTRUxfQ09OKDUpLCAxMCwgMSwgTUZMQUdTLCAwLCA3LCBERkxBR1MsCiAJCQlSSzMzOTlfUE1VX0NMS0dBVEVfQ09OKDApLCA1LCBHRkxBR1MpLAogCi0JQ09NUE9TSVRFX0ZSQUNNVVgoMCwgImNsa191YXJ0NF9mcmFjIiwgImNsa191YXJ0NF9kaXYiLCBDTEtfU0VUX1JBVEVfUEFSRU5ULAorCUNPTVBPU0lURV9GUkFDTVVYKDAsICJjbGtfdWFydDRfZnJhYyIsICJjbGtfdWFydDRfZGl2IiwgMCwKIAkJCVJLMzM5OV9QTVVfQ0xLU0VMX0NPTig2KSwgMCwKIAkJCVJLMzM5OV9QTVVfQ0xLR0FURV9DT04oMCksIDYsIEdGTEFHUywKIAkJCSZyazMzOTlfdWFydDRfcG11X2ZyYWNtdXgpLApAQCAtMTQ2OCw2ICsxNDg3LDkgQEAKIAkiYWNsa19jY2lfcHJlIiwKIAkiYWNsa19naWMiLAogCSJhY2xrX2dpY19ub2MiLAorCSJhY2xrX2hkY3Bfbm9jIiwKKwkiaGNsa19oZGNwX25vYyIsCisJInBjbGtfaGRjcF9ub2MiLAogCSJwY2xrX3BlcmlscDAiLAogCSJwY2xrX3BlcmlscDAiLAogCSJoY2xrX3BlcmlscDAiLApAQCAtMTQ4NCw5ICsxNTA2LDE0IEBACiAJImhjbGtfcGVyaWxwMSIsCiAJImhjbGtfcGVyaWxwMV9ub2MiLAogCSJhY2xrX2RtYWMwX3BlcmlscCIsCisJImFjbGtfZW1tY19ub2MiLAogCSJncGxsX2hjbGtfcGVyaWxwMV9zcmMiLAogCSJncGxsX2FjbGtfcGVyaWxwMF9zcmMiLAogCSJncGxsX2FjbGtfcGVyaWhwX3NyYyIsCisJImFjbGtfdmlvX25vYyIsCisKKwkvKiBkZHJjICovCisJInNjbGtfZGRyYyIKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCByazMzOTlfcG11Y3J1X2NyaXRpY2FsX2Nsb2Nrc1tdIF9faW5pdGNvbnN0ID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvcm9ja2NoaXAvY2xrLXJvY2tjaGlwLmMgYi9kcml2ZXJzL2Nsay9yb2NrY2hpcC9jbGstcm9ja2NoaXAuYwppbmRleCA0Y2Y4MzhkNS4uMmM5YmI4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvcm9ja2NoaXAvY2xrLXJvY2tjaGlwLmMKKysrIGIvZHJpdmVycy9jbGsvcm9ja2NoaXAvY2xrLXJvY2tjaGlwLmMKQEAgLTQ5LDE0ICs0OSwxOSBAQAogCX0KIAogCXJlZyA9IG9mX2lvbWFwKG5vZGUsIDApOworCWlmICghcmVnKQorCQlyZXR1cm47CiAKIAljbGtfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbGtfb25lY2VsbF9kYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjbGtfZGF0YSkKKwlpZiAoIWNsa19kYXRhKSB7CisJCWlvdW5tYXAocmVnKTsKIAkJcmV0dXJuOworCX0KIAogCWNsa19kYXRhLT5jbGtzID0ga3phbGxvYyhxdHkgKiBzaXplb2Yoc3RydWN0IGNsayAqKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjbGtfZGF0YS0+Y2xrcykgewogCQlrZnJlZShjbGtfZGF0YSk7CisJCWlvdW5tYXAocmVnKTsKIAkJcmV0dXJuOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvcm9ja2NoaXAvY2xrLmMgYi9kcml2ZXJzL2Nsay9yb2NrY2hpcC9jbGsuYwppbmRleCA3ZmZkMTM0Li5iODg2YmUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9yb2NrY2hpcC9jbGsuYworKysgYi9kcml2ZXJzL2Nsay9yb2NrY2hpcC9jbGsuYwpAQCAtMzg1LDcgKzM4NSw3IEBACiAJCQkJbGlzdC0+Y29uX29mZnNldCwgZ3JmX2xvY2tfb2Zmc2V0LAogCQkJCWxpc3QtPmxvY2tfc2hpZnQsIGxpc3QtPm1vZGVfb2Zmc2V0LAogCQkJCWxpc3QtPm1vZGVfc2hpZnQsIGxpc3QtPnJhdGVfdGFibGUsCi0JCQkJbGlzdC0+cGxsX2ZsYWdzKTsKKwkJCQlsaXN0LT5mbGFncywgbGlzdC0+cGxsX2ZsYWdzKTsKIAkJaWYgKElTX0VSUihjbGspKSB7CiAJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgY2xvY2sgJXNcbiIsIF9fZnVuY19fLAogCQkJCWxpc3QtPm5hbWUpOwpAQCAtNDg0LDYgKzQ4NCwxNSBAQAogCQkJCWxpc3QtPmdhdGVfb2Zmc2V0LCBsaXN0LT5nYXRlX3NoaWZ0LAogCQkJCWxpc3QtPmdhdGVfZmxhZ3MsIGZsYWdzLCAmY3R4LT5sb2NrKTsKIAkJCWJyZWFrOworCQljYXNlIGJyYW5jaF9kZHJjbGs6CisJCQljbGsgPSByb2NrY2hpcF9jbGtfcmVnaXN0ZXJfZGRyY2xrKAorCQkJCWxpc3QtPm5hbWUsIGxpc3QtPmZsYWdzLAorCQkJCWxpc3QtPnBhcmVudF9uYW1lcywgbGlzdC0+bnVtX3BhcmVudHMsCisJCQkJbGlzdC0+bXV4ZGl2X29mZnNldCwgbGlzdC0+bXV4X3NoaWZ0LAorCQkJCWxpc3QtPm11eF93aWR0aCwgbGlzdC0+ZGl2X3NoaWZ0LAorCQkJCWxpc3QtPmRpdl93aWR0aCwgbGlzdC0+ZGl2X2ZsYWdzLAorCQkJCWN0eC0+cmVnX2Jhc2UsICZjdHgtPmxvY2spOworCQkJYnJlYWs7CiAJCX0KIAogCQkvKiBub25lIG9mIHRoZSBjYXNlcyBhYm92ZSBtYXRjaGVkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9yb2NrY2hpcC9jbGsuaCBiL2RyaXZlcnMvY2xrL3JvY2tjaGlwL2Nsay5oCmluZGV4IDIxOTRmZmEuLjE2NTNlZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3JvY2tjaGlwL2Nsay5oCisrKyBiL2RyaXZlcnMvY2xrL3JvY2tjaGlwL2Nsay5oCkBAIC0yMzgsNyArMjM4LDcgQEAKIAkJdTggbnVtX3BhcmVudHMsIGludCBjb25fb2Zmc2V0LCBpbnQgZ3JmX2xvY2tfb2Zmc2V0LAogCQlpbnQgbG9ja19zaGlmdCwgaW50IG1vZGVfb2Zmc2V0LCBpbnQgbW9kZV9zaGlmdCwKIAkJc3RydWN0IHJvY2tjaGlwX3BsbF9yYXRlX3RhYmxlICpyYXRlX3RhYmxlLAotCQl1OCBjbGtfcGxsX2ZsYWdzKTsKKwkJdW5zaWduZWQgbG9uZyBmbGFncywgdTggY2xrX3BsbF9mbGFncyk7CiAKIHN0cnVjdCByb2NrY2hpcF9jcHVjbGtfY2xrc2VsIHsKIAlpbnQgcmVnOwpAQCAtMjgxLDYgKzI4MSwyMCBAQAogCQkJCWNvbnN0IGNoYXIgKmNvbnN0ICpwYXJlbnRfbmFtZXMsIHU4IG51bV9wYXJlbnRzLAogCQkJCXZvaWQgX19pb21lbSAqcmVnLCBpbnQgc2hpZnQpOwogCisvKgorICogRERSQ0xLIGZsYWdzLCBpbmNsdWRpbmcgbWV0aG9kIG9mIHNldHRpbmcgdGhlIHJhdGUKKyAqIFJPQ0tDSElQX0REUkNMS19TSVA6IHVzZSBTSVAgY2FsbCB0byBibDMxIHRvIGNoYW5nZSBkZHJjbGsgcmF0ZS4KKyAqLworI2RlZmluZSBST0NLQ0hJUF9ERFJDTEtfU0lQCQlCSVQoMCkKKworc3RydWN0IGNsayAqcm9ja2NoaXBfY2xrX3JlZ2lzdGVyX2RkcmNsayhjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZ3MsCisJCQkJCSBjb25zdCBjaGFyICpjb25zdCAqcGFyZW50X25hbWVzLAorCQkJCQkgdTggbnVtX3BhcmVudHMsIGludCBtdXhfb2Zmc2V0LAorCQkJCQkgaW50IG11eF9zaGlmdCwgaW50IG11eF93aWR0aCwKKwkJCQkJIGludCBkaXZfc2hpZnQsIGludCBkaXZfd2lkdGgsCisJCQkJCSBpbnQgZGRyX2ZsYWdzLCB2b2lkIF9faW9tZW0gKnJlZ19iYXNlLAorCQkJCQkgc3BpbmxvY2tfdCAqbG9jayk7CisKICNkZWZpbmUgUk9DS0NISVBfSU5WRVJURVJfSElXT1JEX01BU0sJQklUKDApCiAKIHN0cnVjdCBjbGsgKnJvY2tjaGlwX2Nsa19yZWdpc3Rlcl9pbnZlcnRlcihjb25zdCBjaGFyICpuYW1lLApAQCAtMjk5LDYgKzMxMyw3IEBACiAJYnJhbmNoX21tYywKIAlicmFuY2hfaW52ZXJ0ZXIsCiAJYnJhbmNoX2ZhY3RvciwKKwlicmFuY2hfZGRyY2xrLAogfTsKIAogc3RydWN0IHJvY2tjaGlwX2Nsa19icmFuY2ggewpAQCAtNDg4LDYgKzUwMywyNCBAQAogCQkuY2hpbGQJCT0gY2gsCQkJCVwKIAl9CiAKKyNkZWZpbmUgQ09NUE9TSVRFX0REUkNMSyhfaWQsIGNuYW1lLCBwbmFtZXMsIGYsIG1vLCBtcywgbXcsCVwKKwkJCSBkcywgZHcsIGRmKQkJCQlcCisJewkJCQkJCQlcCisJCS5pZAkJPSBfaWQsCQkJCVwKKwkJLmJyYW5jaF90eXBlCT0gYnJhbmNoX2RkcmNsaywJCVwKKwkJLm5hbWUJCT0gY25hbWUsCQkJXAorCQkucGFyZW50X25hbWVzCT0gcG5hbWVzLAkJCVwKKwkJLm51bV9wYXJlbnRzCT0gQVJSQVlfU0laRShwbmFtZXMpLAkJXAorCQkuZmxhZ3MJCT0gZiwJCQkJXAorCQkubXV4ZGl2X29mZnNldCAgPSBtbywgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCS5tdXhfc2hpZnQgICAgICA9IG1zLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJLm11eF93aWR0aCAgICAgID0gbXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkuZGl2X3NoaWZ0ICAgICAgPSBkcywgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCS5kaXZfd2lkdGggICAgICA9IGR3LCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJLmRpdl9mbGFncwk9IGRmLAkJCQlcCisJCS5nYXRlX29mZnNldCAgICA9IC0xLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl9CisKICNkZWZpbmUgTVVYKF9pZCwgY25hbWUsIHBuYW1lcywgZiwgbywgcywgdywgbWYpCQkJXAogCXsJCQkJCQkJXAogCQkuaWQJCT0gX2lkLAkJCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zYW1zdW5nL2Nsay1leHlub3MtYXVkc3MuYyBiL2RyaXZlcnMvY2xrL3NhbXN1bmcvY2xrLWV4eW5vcy1hdWRzcy5jCmluZGV4IGJkZjhiOTcuLjUxZDE1MmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3NhbXN1bmcvY2xrLWV4eW5vcy1hdWRzcy5jCisrKyBiL2RyaXZlcnMvY2xrL3NhbXN1bmcvY2xrLWV4eW5vcy1hdWRzcy5jCkBAIC0xNCwxOCArMTQsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL2V4eW5vcy1hdWRzcy1jbGsuaD4KIAotZW51bSBleHlub3NfYXVkc3NfY2xrX3R5cGUgewotCVRZUEVfRVhZTk9TNDIxMCwKLQlUWVBFX0VYWU5PUzUyNTAsCi0JVFlQRV9FWFlOT1M1NDIwLAotfTsKLQogc3RhdGljIERFRklORV9TUElOTE9DSyhsb2NrKTsKIHN0YXRpYyBzdHJ1Y3QgY2xrICoqY2xrX3RhYmxlOwogc3RhdGljIHZvaWQgX19pb21lbSAqcmVnX2Jhc2U7CkBAIC00NCw5ICszOSw5IEBACiAKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHJlZ19zYXZlW11bMl0gPSB7Ci0Je0FTU19DTEtfU1JDLCAgMH0sCi0Je0FTU19DTEtfRElWLCAgMH0sCi0Je0FTU19DTEtfR0FURSwgMH0sCisJeyBBU1NfQ0xLX1NSQywgIDAgfSwKKwl7IEFTU19DTEtfRElWLCAgMCB9LAorCXsgQVNTX0NMS19HQVRFLCAwIH0sCiB9OwogCiBzdGF0aWMgaW50IGV4eW5vc19hdWRzc19jbGtfc3VzcGVuZCh2b2lkKQpAQCAtNzMsMTQgKzY4LDQzIEBACiB9OwogI2VuZGlmIC8qIENPTkZJR19QTV9TTEVFUCAqLwogCitzdHJ1Y3QgZXh5bm9zX2F1ZHNzX2Nsa19kcnZkYXRhIHsKKwl1bnNpZ25lZCBpbnQgaGFzX2FkbWFfY2xrOjE7CisJdW5zaWduZWQgaW50IGhhc19tc3RfY2xrOjE7CisJdW5zaWduZWQgaW50IGVuYWJsZV9lcGxsOjE7CisJdW5zaWduZWQgaW50IG51bV9jbGtzOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBleHlub3NfYXVkc3NfY2xrX2RydmRhdGEgZXh5bm9zNDIxMF9kcnZkYXRhID0geworCS5udW1fY2xrcwk9IEVYWU5PU19BVURTU19NQVhfQ0xLUyAtIDEsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGV4eW5vc19hdWRzc19jbGtfZHJ2ZGF0YSBleHlub3M1NDEwX2RydmRhdGEgPSB7CisJLm51bV9jbGtzCT0gRVhZTk9TX0FVRFNTX01BWF9DTEtTIC0gMSwKKwkuaGFzX21zdF9jbGsJPSAxLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBleHlub3NfYXVkc3NfY2xrX2RydmRhdGEgZXh5bm9zNTQyMF9kcnZkYXRhID0geworCS5udW1fY2xrcwk9IEVYWU5PU19BVURTU19NQVhfQ0xLUywKKwkuaGFzX2FkbWFfY2xrCT0gMSwKKwkuZW5hYmxlX2VwbGwJPSAxLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZXh5bm9zX2F1ZHNzX2Nsa19vZl9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M0MjEwLWF1ZHNzLWNsb2NrIiwKLQkgIC5kYXRhID0gKHZvaWQgKilUWVBFX0VYWU5PUzQyMTAsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzYW1zdW5nLGV4eW5vczUyNTAtYXVkc3MtY2xvY2siLAotCSAgLmRhdGEgPSAodm9pZCAqKVRZUEVfRVhZTk9TNTI1MCwgfSwKLQl7IC5jb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNTQyMC1hdWRzcy1jbG9jayIsCi0JICAuZGF0YSA9ICh2b2lkICopVFlQRV9FWFlOT1M1NDIwLCB9LAotCXt9LAorCXsKKwkJLmNvbXBhdGlibGUJPSAic2Ftc3VuZyxleHlub3M0MjEwLWF1ZHNzLWNsb2NrIiwKKwkJLmRhdGEJCT0gJmV4eW5vczQyMTBfZHJ2ZGF0YSwKKwl9LCB7CisJCS5jb21wYXRpYmxlCT0gInNhbXN1bmcsZXh5bm9zNTI1MC1hdWRzcy1jbG9jayIsCisJCS5kYXRhCQk9ICZleHlub3M0MjEwX2RydmRhdGEsCisJfSwgeworCQkuY29tcGF0aWJsZQk9ICJzYW1zdW5nLGV4eW5vczU0MTAtYXVkc3MtY2xvY2siLAorCQkuZGF0YQkJPSAmZXh5bm9zNTQxMF9kcnZkYXRhLAorCX0sIHsKKwkJLmNvbXBhdGlibGUJPSAic2Ftc3VuZyxleHlub3M1NDIwLWF1ZHNzLWNsb2NrIiwKKwkJLmRhdGEJCT0gJmV4eW5vczU0MjBfZHJ2ZGF0YSwKKwl9LAorCXsgfSwKIH07CiAKIHN0YXRpYyB2b2lkIGV4eW5vc19hdWRzc19jbGtfdGVhcmRvd24odm9pZCkKQEAgLTEwNiwxOSArMTMwLDE3IEBACiAvKiByZWdpc3RlciBleHlub3NfYXVkc3MgY2xvY2tzICovCiBzdGF0aWMgaW50IGV4eW5vc19hdWRzc19jbGtfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlpbnQgaSwgcmV0ID0gMDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAljb25zdCBjaGFyICptb3V0X2F1ZHNzX3BbXSA9IHsiZmluX3BsbCIsICJmb3V0X2VwbGwifTsKIAljb25zdCBjaGFyICptb3V0X2kyc19wW10gPSB7Im1vdXRfYXVkc3MiLCAiY2RjbGswIiwgInNjbGtfYXVkaW8wIn07CiAJY29uc3QgY2hhciAqc2Nsa19wY21fcCA9ICJzY2xrX3BjbTAiOwogCXN0cnVjdCBjbGsgKnBsbF9yZWYsICpwbGxfaW4sICpjZGNsaywgKnNjbGtfYXVkaW8sICpzY2xrX3BjbV9pbjsKLQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKLQllbnVtIGV4eW5vc19hdWRzc19jbGtfdHlwZSB2YXJpYW50OworCWNvbnN0IHN0cnVjdCBleHlub3NfYXVkc3NfY2xrX2RydmRhdGEgKnZhcmlhbnQ7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGksIHJldCA9IDA7CiAKLQltYXRjaCA9IG9mX21hdGNoX25vZGUoZXh5bm9zX2F1ZHNzX2Nsa19vZl9tYXRjaCwgcGRldi0+ZGV2Lm9mX25vZGUpOwotCWlmICghbWF0Y2gpCisJdmFyaWFudCA9IG9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YSgmcGRldi0+ZGV2KTsKKwlpZiAoIXZhcmlhbnQpCiAJCXJldHVybiAtRUlOVkFMOwotCXZhcmlhbnQgPSAoZW51bSBleHlub3NfYXVkc3NfY2xrX3R5cGUpbWF0Y2gtPmRhdGE7CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCXJlZ19iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CkBAIC0xMjYsNyArMTQ4LDcgQEAKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIG1hcCBhdWRzcyByZWdpc3RlcnNcbiIpOwogCQlyZXR1cm4gUFRSX0VSUihyZWdfYmFzZSk7CiAJfQotCS8qIEVQTEwgZG9uJ3QgaGF2ZSB0byBiZSBlbmFibGVkIGZvciBib2FyZHMgb3RoZXIgdGhhbiBFeHlub3M1NDIwICovCisKIAllcGxsID0gRVJSX1BUUigtRU5PREVWKTsKIAogCWNsa190YWJsZSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LApAQCAtMTM2LDEwICsxNTgsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWNsa19kYXRhLmNsa3MgPSBjbGtfdGFibGU7Ci0JaWYgKHZhcmlhbnQgPT0gVFlQRV9FWFlOT1M1NDIwKQotCQljbGtfZGF0YS5jbGtfbnVtID0gRVhZTk9TX0FVRFNTX01BWF9DTEtTOwotCWVsc2UKLQkJY2xrX2RhdGEuY2xrX251bSA9IEVYWU5PU19BVURTU19NQVhfQ0xLUyAtIDE7CisJY2xrX2RhdGEuY2xrX251bSA9IHZhcmlhbnQtPm51bV9jbGtzOwogCiAJcGxsX3JlZiA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAicGxsX3JlZiIpOwogCXBsbF9pbiA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAicGxsX2luIik7CkBAIC0xNDgsMTMgKzE2NywxMyBAQAogCWlmICghSVNfRVJSKHBsbF9pbikpIHsKIAkJbW91dF9hdWRzc19wWzFdID0gX19jbGtfZ2V0X25hbWUocGxsX2luKTsKIAotCQlpZiAodmFyaWFudCA9PSBUWVBFX0VYWU5PUzU0MjApIHsKKwkJaWYgKHZhcmlhbnQtPmVuYWJsZV9lcGxsKSB7CiAJCQllcGxsID0gcGxsX2luOwogCiAJCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZXBsbCk7CiAJCQlpZiAocmV0KSB7CiAJCQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJCQkJImZhaWxlZCB0byBwcmVwYXJlIHRoZSBlcGxsIGNsb2NrXG4iKTsKKwkJCQkJImZhaWxlZCB0byBwcmVwYXJlIHRoZSBlcGxsIGNsb2NrXG4iKTsKIAkJCQlyZXR1cm4gcmV0OwogCQkJfQogCQl9CkBAIC0yMTAsNyArMjI5LDcgQEAKIAkJCQlzY2xrX3BjbV9wLCBDTEtfU0VUX1JBVEVfUEFSRU5ULAogCQkJCXJlZ19iYXNlICsgQVNTX0NMS19HQVRFLCA1LCAwLCAmbG9jayk7CiAKLQlpZiAodmFyaWFudCA9PSBUWVBFX0VYWU5PUzU0MjApIHsKKwlpZiAodmFyaWFudC0+aGFzX2FkbWFfY2xrKSB7CiAJCWNsa190YWJsZVtFWFlOT1NfQURNQV0gPSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiYWRtYSIsCiAJCQkJImRvdXRfc3JwIiwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwKIAkJCQlyZWdfYmFzZSArIEFTU19DTEtfR0FURSwgOSwgMCwgJmxvY2spOwpAQCAtMjM0LDkgKzI1Myw2IEBACiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiAJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJmV4eW5vc19hdWRzc19jbGtfc3lzY29yZV9vcHMpOwogI2VuZGlmCi0KLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAic2V0dXAgY29tcGxldGVkXG4iKTsKLQogCXJldHVybiAwOwogCiB1bnJlZ2lzdGVyOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc2Ftc3VuZy9jbGstZXh5bm9zNTI2MC5jIGIvZHJpdmVycy9jbGsvc2Ftc3VuZy9jbGstZXh5bm9zNTI2MC5jCmluZGV4IGE0MzY0MmMuLmZkMWQ5YmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3NhbXN1bmcvY2xrLWV4eW5vczUyNjAuYworKysgYi9kcml2ZXJzL2Nsay9zYW1zdW5nL2Nsay1leHlub3M1MjYwLmMKQEAgLTEzMSwyMSArMTMxLDIxIEBACiAJCQlFTl9JUF9BVUQsIDQsIDAsIDApLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBzYW1zdW5nX2NtdV9pbmZvIGF1ZF9jbXUgX19pbml0Y29uc3QgPSB7CisJLm11eF9jbGtzCT0gYXVkX211eF9jbGtzLAorCS5ucl9tdXhfY2xrcwk9IEFSUkFZX1NJWkUoYXVkX211eF9jbGtzKSwKKwkuZGl2X2Nsa3MJPSBhdWRfZGl2X2Nsa3MsCisJLm5yX2Rpdl9jbGtzCT0gQVJSQVlfU0laRShhdWRfZGl2X2Nsa3MpLAorCS5nYXRlX2Nsa3MJPSBhdWRfZ2F0ZV9jbGtzLAorCS5ucl9nYXRlX2Nsa3MJPSBBUlJBWV9TSVpFKGF1ZF9nYXRlX2Nsa3MpLAorCS5ucl9jbGtfaWRzCT0gQVVEX05SX0NMSywKKwkuY2xrX3JlZ3MJPSBhdWRfY2xrX3JlZ3MsCisJLm5yX2Nsa19yZWdzCT0gQVJSQVlfU0laRShhdWRfY2xrX3JlZ3MpLAorfTsKKwogc3RhdGljIHZvaWQgX19pbml0IGV4eW5vczUyNjBfY2xrX2F1ZF9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0Jc3RydWN0IHNhbXN1bmdfY211X2luZm8gY211ID0geyBOVUxMIH07Ci0KLQljbXUubXV4X2Nsa3MgPSBhdWRfbXV4X2Nsa3M7Ci0JY211Lm5yX211eF9jbGtzID0gQVJSQVlfU0laRShhdWRfbXV4X2Nsa3MpOwotCWNtdS5kaXZfY2xrcyA9IGF1ZF9kaXZfY2xrczsKLQljbXUubnJfZGl2X2Nsa3MgPSBBUlJBWV9TSVpFKGF1ZF9kaXZfY2xrcyk7Ci0JY211LmdhdGVfY2xrcyA9IGF1ZF9nYXRlX2Nsa3M7Ci0JY211Lm5yX2dhdGVfY2xrcyA9IEFSUkFZX1NJWkUoYXVkX2dhdGVfY2xrcyk7Ci0JY211Lm5yX2Nsa19pZHMgPSBBVURfTlJfQ0xLOwotCWNtdS5jbGtfcmVncyA9IGF1ZF9jbGtfcmVnczsKLQljbXUubnJfY2xrX3JlZ3MgPSBBUlJBWV9TSVpFKGF1ZF9jbGtfcmVncyk7Ci0KLQlzYW1zdW5nX2NtdV9yZWdpc3Rlcl9vbmUobnAsICZjbXUpOworCXNhbXN1bmdfY211X3JlZ2lzdGVyX29uZShucCwgJmF1ZF9jbXUpOwogfQogCiBDTEtfT0ZfREVDTEFSRShleHlub3M1MjYwX2Nsa19hdWQsICJzYW1zdW5nLGV4eW5vczUyNjAtY2xvY2stYXVkIiwKQEAgLTMyMSwyMSArMzIxLDIxIEBACiAJCQlFTl9JUF9ESVNQLCAyNSwgMCwgMCksCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNhbXN1bmdfY211X2luZm8gZGlzcF9jbXUgX19pbml0Y29uc3QgPSB7CisJLm11eF9jbGtzCT0gZGlzcF9tdXhfY2xrcywKKwkubnJfbXV4X2Nsa3MJPSBBUlJBWV9TSVpFKGRpc3BfbXV4X2Nsa3MpLAorCS5kaXZfY2xrcwk9IGRpc3BfZGl2X2Nsa3MsCisJLm5yX2Rpdl9jbGtzCT0gQVJSQVlfU0laRShkaXNwX2Rpdl9jbGtzKSwKKwkuZ2F0ZV9jbGtzCT0gZGlzcF9nYXRlX2Nsa3MsCisJLm5yX2dhdGVfY2xrcwk9IEFSUkFZX1NJWkUoZGlzcF9nYXRlX2Nsa3MpLAorCS5ucl9jbGtfaWRzCT0gRElTUF9OUl9DTEssCisJLmNsa19yZWdzCT0gZGlzcF9jbGtfcmVncywKKwkubnJfY2xrX3JlZ3MJPSBBUlJBWV9TSVpFKGRpc3BfY2xrX3JlZ3MpLAorfTsKKwogc3RhdGljIHZvaWQgX19pbml0IGV4eW5vczUyNjBfY2xrX2Rpc3BfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCXN0cnVjdCBzYW1zdW5nX2NtdV9pbmZvIGNtdSA9IHsgTlVMTCB9OwotCi0JY211Lm11eF9jbGtzID0gZGlzcF9tdXhfY2xrczsKLQljbXUubnJfbXV4X2Nsa3MgPSBBUlJBWV9TSVpFKGRpc3BfbXV4X2Nsa3MpOwotCWNtdS5kaXZfY2xrcyA9IGRpc3BfZGl2X2Nsa3M7Ci0JY211Lm5yX2Rpdl9jbGtzID0gQVJSQVlfU0laRShkaXNwX2Rpdl9jbGtzKTsKLQljbXUuZ2F0ZV9jbGtzID0gZGlzcF9nYXRlX2Nsa3M7Ci0JY211Lm5yX2dhdGVfY2xrcyA9IEFSUkFZX1NJWkUoZGlzcF9nYXRlX2Nsa3MpOwotCWNtdS5ucl9jbGtfaWRzID0gRElTUF9OUl9DTEs7Ci0JY211LmNsa19yZWdzID0gZGlzcF9jbGtfcmVnczsKLQljbXUubnJfY2xrX3JlZ3MgPSBBUlJBWV9TSVpFKGRpc3BfY2xrX3JlZ3MpOwotCi0Jc2Ftc3VuZ19jbXVfcmVnaXN0ZXJfb25lKG5wLCAmY211KTsKKwlzYW1zdW5nX2NtdV9yZWdpc3Rlcl9vbmUobnAsICZkaXNwX2NtdSk7CiB9CiAKIENMS19PRl9ERUNMQVJFKGV4eW5vczUyNjBfY2xrX2Rpc3AsICJzYW1zdW5nLGV4eW5vczUyNjAtY2xvY2stZGlzcCIsCkBAIC0zODUsMjEgKzM4NSwyMSBAQAogCQlwbGwyNTUwXzI0bWh6X3RibCksCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNhbXN1bmdfY211X2luZm8gZWdsX2NtdSBfX2luaXRjb25zdCA9IHsKKwkucGxsX2Nsa3MJPSBlZ2xfcGxsX2Nsa3MsCisJLm5yX3BsbF9jbGtzCT0gQVJSQVlfU0laRShlZ2xfcGxsX2Nsa3MpLAorCS5tdXhfY2xrcwk9IGVnbF9tdXhfY2xrcywKKwkubnJfbXV4X2Nsa3MJPSBBUlJBWV9TSVpFKGVnbF9tdXhfY2xrcyksCisJLmRpdl9jbGtzCT0gZWdsX2Rpdl9jbGtzLAorCS5ucl9kaXZfY2xrcwk9IEFSUkFZX1NJWkUoZWdsX2Rpdl9jbGtzKSwKKwkubnJfY2xrX2lkcwk9IEVHTF9OUl9DTEssCisJLmNsa19yZWdzCT0gZWdsX2Nsa19yZWdzLAorCS5ucl9jbGtfcmVncwk9IEFSUkFZX1NJWkUoZWdsX2Nsa19yZWdzKSwKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBleHlub3M1MjYwX2Nsa19lZ2xfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCXN0cnVjdCBzYW1zdW5nX2NtdV9pbmZvIGNtdSA9IHsgTlVMTCB9OwotCi0JY211LnBsbF9jbGtzID0gZWdsX3BsbF9jbGtzOwotCWNtdS5ucl9wbGxfY2xrcyA9ICBBUlJBWV9TSVpFKGVnbF9wbGxfY2xrcyk7Ci0JY211Lm11eF9jbGtzID0gZWdsX211eF9jbGtzOwotCWNtdS5ucl9tdXhfY2xrcyA9IEFSUkFZX1NJWkUoZWdsX211eF9jbGtzKTsKLQljbXUuZGl2X2Nsa3MgPSBlZ2xfZGl2X2Nsa3M7Ci0JY211Lm5yX2Rpdl9jbGtzID0gQVJSQVlfU0laRShlZ2xfZGl2X2Nsa3MpOwotCWNtdS5ucl9jbGtfaWRzID0gRUdMX05SX0NMSzsKLQljbXUuY2xrX3JlZ3MgPSBlZ2xfY2xrX3JlZ3M7Ci0JY211Lm5yX2Nsa19yZWdzID0gQVJSQVlfU0laRShlZ2xfY2xrX3JlZ3MpOwotCi0Jc2Ftc3VuZ19jbXVfcmVnaXN0ZXJfb25lKG5wLCAmY211KTsKKwlzYW1zdW5nX2NtdV9yZWdpc3Rlcl9vbmUobnAsICZlZ2xfY211KTsKIH0KIAogQ0xLX09GX0RFQ0xBUkUoZXh5bm9zNTI2MF9jbGtfZWdsLCAic2Ftc3VuZyxleHlub3M1MjYwLWNsb2NrLWVnbCIsCkBAIC00ODcsMTkgKzQ4NywxOSBAQAogCQkJRU5fSVBfRlNZU19TRUNVUkVfU01NVV9SVElDLCAxMiwgMCwgMCksCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNhbXN1bmdfY211X2luZm8gZnN5c19jbXUgX19pbml0Y29uc3QgPSB7CisJLm11eF9jbGtzCT0gZnN5c19tdXhfY2xrcywKKwkubnJfbXV4X2Nsa3MJPSBBUlJBWV9TSVpFKGZzeXNfbXV4X2Nsa3MpLAorCS5nYXRlX2Nsa3MJPSBmc3lzX2dhdGVfY2xrcywKKwkubnJfZ2F0ZV9jbGtzCT0gQVJSQVlfU0laRShmc3lzX2dhdGVfY2xrcyksCisJLm5yX2Nsa19pZHMJPSBGU1lTX05SX0NMSywKKwkuY2xrX3JlZ3MJPSBmc3lzX2Nsa19yZWdzLAorCS5ucl9jbGtfcmVncwk9IEFSUkFZX1NJWkUoZnN5c19jbGtfcmVncyksCit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgZXh5bm9zNTI2MF9jbGtfZnN5c19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0Jc3RydWN0IHNhbXN1bmdfY211X2luZm8gY211ID0geyBOVUxMIH07Ci0KLQljbXUubXV4X2Nsa3MgPSBmc3lzX211eF9jbGtzOwotCWNtdS5ucl9tdXhfY2xrcyA9IEFSUkFZX1NJWkUoZnN5c19tdXhfY2xrcyk7Ci0JY211LmdhdGVfY2xrcyA9IGZzeXNfZ2F0ZV9jbGtzOwotCWNtdS5ucl9nYXRlX2Nsa3MgPSBBUlJBWV9TSVpFKGZzeXNfZ2F0ZV9jbGtzKTsKLQljbXUubnJfY2xrX2lkcyA9IEZTWVNfTlJfQ0xLOwotCWNtdS5jbGtfcmVncyA9IGZzeXNfY2xrX3JlZ3M7Ci0JY211Lm5yX2Nsa19yZWdzID0gQVJSQVlfU0laRShmc3lzX2Nsa19yZWdzKTsKLQotCXNhbXN1bmdfY211X3JlZ2lzdGVyX29uZShucCwgJmNtdSk7CisJc2Ftc3VuZ19jbXVfcmVnaXN0ZXJfb25lKG5wLCAmZnN5c19jbXUpOwogfQogCiBDTEtfT0ZfREVDTEFSRShleHlub3M1MjYwX2Nsa19mc3lzLCAic2Ftc3VuZyxleHlub3M1MjYwLWNsb2NrLWZzeXMiLApAQCAtNTc2LDIxICs1NzYsMjEgQEAKIAkJCUVOX0lQX0cyRF9TRUNVUkVfU01NVV9HMkQsIDE1LCAwLCAwKSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ19jbXVfaW5mbyBnMmRfY211IF9faW5pdGNvbnN0ID0geworCS5tdXhfY2xrcwk9IGcyZF9tdXhfY2xrcywKKwkubnJfbXV4X2Nsa3MJPSBBUlJBWV9TSVpFKGcyZF9tdXhfY2xrcyksCisJLmRpdl9jbGtzCT0gZzJkX2Rpdl9jbGtzLAorCS5ucl9kaXZfY2xrcwk9IEFSUkFZX1NJWkUoZzJkX2Rpdl9jbGtzKSwKKwkuZ2F0ZV9jbGtzCT0gZzJkX2dhdGVfY2xrcywKKwkubnJfZ2F0ZV9jbGtzCT0gQVJSQVlfU0laRShnMmRfZ2F0ZV9jbGtzKSwKKwkubnJfY2xrX2lkcwk9IEcyRF9OUl9DTEssCisJLmNsa19yZWdzCT0gZzJkX2Nsa19yZWdzLAorCS5ucl9jbGtfcmVncwk9IEFSUkFZX1NJWkUoZzJkX2Nsa19yZWdzKSwKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBleHlub3M1MjYwX2Nsa19nMmRfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCXN0cnVjdCBzYW1zdW5nX2NtdV9pbmZvIGNtdSA9IHsgTlVMTCB9OwotCi0JY211Lm11eF9jbGtzID0gZzJkX211eF9jbGtzOwotCWNtdS5ucl9tdXhfY2xrcyA9IEFSUkFZX1NJWkUoZzJkX211eF9jbGtzKTsKLQljbXUuZGl2X2Nsa3MgPSBnMmRfZGl2X2Nsa3M7Ci0JY211Lm5yX2Rpdl9jbGtzID0gQVJSQVlfU0laRShnMmRfZGl2X2Nsa3MpOwotCWNtdS5nYXRlX2Nsa3MgPSBnMmRfZ2F0ZV9jbGtzOwotCWNtdS5ucl9nYXRlX2Nsa3MgPSBBUlJBWV9TSVpFKGcyZF9nYXRlX2Nsa3MpOwotCWNtdS5ucl9jbGtfaWRzID0gRzJEX05SX0NMSzsKLQljbXUuY2xrX3JlZ3MgPSBnMmRfY2xrX3JlZ3M7Ci0JY211Lm5yX2Nsa19yZWdzID0gQVJSQVlfU0laRShnMmRfY2xrX3JlZ3MpOwotCi0Jc2Ftc3VuZ19jbXVfcmVnaXN0ZXJfb25lKG5wLCAmY211KTsKKwlzYW1zdW5nX2NtdV9yZWdpc3Rlcl9vbmUobnAsICZnMmRfY211KTsKIH0KIAogQ0xLX09GX0RFQ0xBUkUoZXh5bm9zNTI2MF9jbGtfZzJkLCAic2Ftc3VuZyxleHlub3M1MjYwLWNsb2NrLWcyZCIsCkBAIC02MzcsMjMgKzYzNywyMyBAQAogCQlwbGwyNTUwXzI0bWh6X3RibCksCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNhbXN1bmdfY211X2luZm8gZzNkX2NtdSBfX2luaXRjb25zdCA9IHsKKwkucGxsX2Nsa3MJPSBnM2RfcGxsX2Nsa3MsCisJLm5yX3BsbF9jbGtzCT0gQVJSQVlfU0laRShnM2RfcGxsX2Nsa3MpLAorCS5tdXhfY2xrcwk9IGczZF9tdXhfY2xrcywKKwkubnJfbXV4X2Nsa3MJPSBBUlJBWV9TSVpFKGczZF9tdXhfY2xrcyksCisJLmRpdl9jbGtzCT0gZzNkX2Rpdl9jbGtzLAorCS5ucl9kaXZfY2xrcwk9IEFSUkFZX1NJWkUoZzNkX2Rpdl9jbGtzKSwKKwkuZ2F0ZV9jbGtzCT0gZzNkX2dhdGVfY2xrcywKKwkubnJfZ2F0ZV9jbGtzCT0gQVJSQVlfU0laRShnM2RfZ2F0ZV9jbGtzKSwKKwkubnJfY2xrX2lkcwk9IEczRF9OUl9DTEssCisJLmNsa19yZWdzCT0gZzNkX2Nsa19yZWdzLAorCS5ucl9jbGtfcmVncwk9IEFSUkFZX1NJWkUoZzNkX2Nsa19yZWdzKSwKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBleHlub3M1MjYwX2Nsa19nM2RfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCXN0cnVjdCBzYW1zdW5nX2NtdV9pbmZvIGNtdSA9IHsgTlVMTCB9OwotCi0JY211LnBsbF9jbGtzID0gZzNkX3BsbF9jbGtzOwotCWNtdS5ucl9wbGxfY2xrcyA9ICBBUlJBWV9TSVpFKGczZF9wbGxfY2xrcyk7Ci0JY211Lm11eF9jbGtzID0gZzNkX211eF9jbGtzOwotCWNtdS5ucl9tdXhfY2xrcyA9IEFSUkFZX1NJWkUoZzNkX211eF9jbGtzKTsKLQljbXUuZGl2X2Nsa3MgPSBnM2RfZGl2X2Nsa3M7Ci0JY211Lm5yX2Rpdl9jbGtzID0gQVJSQVlfU0laRShnM2RfZGl2X2Nsa3MpOwotCWNtdS5nYXRlX2Nsa3MgPSBnM2RfZ2F0ZV9jbGtzOwotCWNtdS5ucl9nYXRlX2Nsa3MgPSBBUlJBWV9TSVpFKGczZF9nYXRlX2Nsa3MpOwotCWNtdS5ucl9jbGtfaWRzID0gRzNEX05SX0NMSzsKLQljbXUuY2xrX3JlZ3MgPSBnM2RfY2xrX3JlZ3M7Ci0JY211Lm5yX2Nsa19yZWdzID0gQVJSQVlfU0laRShnM2RfY2xrX3JlZ3MpOwotCi0Jc2Ftc3VuZ19jbXVfcmVnaXN0ZXJfb25lKG5wLCAmY211KTsKKwlzYW1zdW5nX2NtdV9yZWdpc3Rlcl9vbmUobnAsICZnM2RfY211KTsKIH0KIAogQ0xLX09GX0RFQ0xBUkUoZXh5bm9zNTI2MF9jbGtfZzNkLCAic2Ftc3VuZyxleHlub3M1MjYwLWNsb2NrLWczZCIsCkBAIC03NzIsMjEgKzc3MiwyMSBAQAogCQkJRU5fSVBfR1NDTF9TRUNVUkVfU01NVV9NU0NMMSwgMjAsIDAsIDApLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBzYW1zdW5nX2NtdV9pbmZvIGdzY2xfY211IF9faW5pdGNvbnN0ID0geworCS5tdXhfY2xrcwk9IGdzY2xfbXV4X2Nsa3MsCisJLm5yX211eF9jbGtzCT0gQVJSQVlfU0laRShnc2NsX211eF9jbGtzKSwKKwkuZGl2X2Nsa3MJPSBnc2NsX2Rpdl9jbGtzLAorCS5ucl9kaXZfY2xrcwk9IEFSUkFZX1NJWkUoZ3NjbF9kaXZfY2xrcyksCisJLmdhdGVfY2xrcwk9IGdzY2xfZ2F0ZV9jbGtzLAorCS5ucl9nYXRlX2Nsa3MJPSBBUlJBWV9TSVpFKGdzY2xfZ2F0ZV9jbGtzKSwKKwkubnJfY2xrX2lkcwk9IEdTQ0xfTlJfQ0xLLAorCS5jbGtfcmVncwk9IGdzY2xfY2xrX3JlZ3MsCisJLm5yX2Nsa19yZWdzCT0gQVJSQVlfU0laRShnc2NsX2Nsa19yZWdzKSwKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBleHlub3M1MjYwX2Nsa19nc2NsX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQlzdHJ1Y3Qgc2Ftc3VuZ19jbXVfaW5mbyBjbXUgPSB7IE5VTEwgfTsKLQotCWNtdS5tdXhfY2xrcyA9IGdzY2xfbXV4X2Nsa3M7Ci0JY211Lm5yX211eF9jbGtzID0gQVJSQVlfU0laRShnc2NsX211eF9jbGtzKTsKLQljbXUuZGl2X2Nsa3MgPSBnc2NsX2Rpdl9jbGtzOwotCWNtdS5ucl9kaXZfY2xrcyA9IEFSUkFZX1NJWkUoZ3NjbF9kaXZfY2xrcyk7Ci0JY211LmdhdGVfY2xrcyA9IGdzY2xfZ2F0ZV9jbGtzOwotCWNtdS5ucl9nYXRlX2Nsa3MgPSBBUlJBWV9TSVpFKGdzY2xfZ2F0ZV9jbGtzKTsKLQljbXUubnJfY2xrX2lkcyA9IEdTQ0xfTlJfQ0xLOwotCWNtdS5jbGtfcmVncyA9IGdzY2xfY2xrX3JlZ3M7Ci0JY211Lm5yX2Nsa19yZWdzID0gQVJSQVlfU0laRShnc2NsX2Nsa19yZWdzKTsKLQotCXNhbXN1bmdfY211X3JlZ2lzdGVyX29uZShucCwgJmNtdSk7CisJc2Ftc3VuZ19jbXVfcmVnaXN0ZXJfb25lKG5wLCAmZ3NjbF9jbXUpOwogfQogCiBDTEtfT0ZfREVDTEFSRShleHlub3M1MjYwX2Nsa19nc2NsLCAic2Ftc3VuZyxleHlub3M1MjYwLWNsb2NrLWdzY2wiLApAQCAtODkxLDIxICs4OTEsMjEgQEAKIAkJCUVOX1NDTEtfSVNQLCA5LCBDTEtfU0VUX1JBVEVfUEFSRU5ULCAwKSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ19jbXVfaW5mbyBpc3BfY211IF9faW5pdGNvbnN0ID0geworCS5tdXhfY2xrcwk9IGlzcF9tdXhfY2xrcywKKwkubnJfbXV4X2Nsa3MJPSBBUlJBWV9TSVpFKGlzcF9tdXhfY2xrcyksCisJLmRpdl9jbGtzCT0gaXNwX2Rpdl9jbGtzLAorCS5ucl9kaXZfY2xrcwk9IEFSUkFZX1NJWkUoaXNwX2Rpdl9jbGtzKSwKKwkuZ2F0ZV9jbGtzCT0gaXNwX2dhdGVfY2xrcywKKwkubnJfZ2F0ZV9jbGtzCT0gQVJSQVlfU0laRShpc3BfZ2F0ZV9jbGtzKSwKKwkubnJfY2xrX2lkcwk9IElTUF9OUl9DTEssCisJLmNsa19yZWdzCT0gaXNwX2Nsa19yZWdzLAorCS5ucl9jbGtfcmVncwk9IEFSUkFZX1NJWkUoaXNwX2Nsa19yZWdzKSwKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBleHlub3M1MjYwX2Nsa19pc3BfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCXN0cnVjdCBzYW1zdW5nX2NtdV9pbmZvIGNtdSA9IHsgTlVMTCB9OwotCi0JY211Lm11eF9jbGtzID0gaXNwX211eF9jbGtzOwotCWNtdS5ucl9tdXhfY2xrcyA9IEFSUkFZX1NJWkUoaXNwX211eF9jbGtzKTsKLQljbXUuZGl2X2Nsa3MgPSBpc3BfZGl2X2Nsa3M7Ci0JY211Lm5yX2Rpdl9jbGtzID0gQVJSQVlfU0laRShpc3BfZGl2X2Nsa3MpOwotCWNtdS5nYXRlX2Nsa3MgPSBpc3BfZ2F0ZV9jbGtzOwotCWNtdS5ucl9nYXRlX2Nsa3MgPSBBUlJBWV9TSVpFKGlzcF9nYXRlX2Nsa3MpOwotCWNtdS5ucl9jbGtfaWRzID0gSVNQX05SX0NMSzsKLQljbXUuY2xrX3JlZ3MgPSBpc3BfY2xrX3JlZ3M7Ci0JY211Lm5yX2Nsa19yZWdzID0gQVJSQVlfU0laRShpc3BfY2xrX3JlZ3MpOwotCi0Jc2Ftc3VuZ19jbXVfcmVnaXN0ZXJfb25lKG5wLCAmY211KTsKKwlzYW1zdW5nX2NtdV9yZWdpc3Rlcl9vbmUobnAsICZpc3BfY211KTsKIH0KIAogQ0xLX09GX0RFQ0xBUkUoZXh5bm9zNTI2MF9jbGtfaXNwLCAic2Ftc3VuZyxleHlub3M1MjYwLWNsb2NrLWlzcCIsCkBAIC05NTUsMjEgKzk1NSwyMSBAQAogCQlwbGwyNTUwXzI0bWh6X3RibCksCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNhbXN1bmdfY211X2luZm8ga2ZjX2NtdSBfX2luaXRjb25zdCA9IHsKKwkucGxsX2Nsa3MJPSBrZmNfcGxsX2Nsa3MsCisJLm5yX3BsbF9jbGtzCT0gQVJSQVlfU0laRShrZmNfcGxsX2Nsa3MpLAorCS5tdXhfY2xrcwk9IGtmY19tdXhfY2xrcywKKwkubnJfbXV4X2Nsa3MJPSBBUlJBWV9TSVpFKGtmY19tdXhfY2xrcyksCisJLmRpdl9jbGtzCT0ga2ZjX2Rpdl9jbGtzLAorCS5ucl9kaXZfY2xrcwk9IEFSUkFZX1NJWkUoa2ZjX2Rpdl9jbGtzKSwKKwkubnJfY2xrX2lkcwk9IEtGQ19OUl9DTEssCisJLmNsa19yZWdzCT0ga2ZjX2Nsa19yZWdzLAorCS5ucl9jbGtfcmVncwk9IEFSUkFZX1NJWkUoa2ZjX2Nsa19yZWdzKSwKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBleHlub3M1MjYwX2Nsa19rZmNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCXN0cnVjdCBzYW1zdW5nX2NtdV9pbmZvIGNtdSA9IHsgTlVMTCB9OwotCi0JY211LnBsbF9jbGtzID0ga2ZjX3BsbF9jbGtzOwotCWNtdS5ucl9wbGxfY2xrcyA9ICBBUlJBWV9TSVpFKGtmY19wbGxfY2xrcyk7Ci0JY211Lm11eF9jbGtzID0ga2ZjX211eF9jbGtzOwotCWNtdS5ucl9tdXhfY2xrcyA9IEFSUkFZX1NJWkUoa2ZjX211eF9jbGtzKTsKLQljbXUuZGl2X2Nsa3MgPSBrZmNfZGl2X2Nsa3M7Ci0JY211Lm5yX2Rpdl9jbGtzID0gQVJSQVlfU0laRShrZmNfZGl2X2Nsa3MpOwotCWNtdS5ucl9jbGtfaWRzID0gS0ZDX05SX0NMSzsKLQljbXUuY2xrX3JlZ3MgPSBrZmNfY2xrX3JlZ3M7Ci0JY211Lm5yX2Nsa19yZWdzID0gQVJSQVlfU0laRShrZmNfY2xrX3JlZ3MpOwotCi0Jc2Ftc3VuZ19jbXVfcmVnaXN0ZXJfb25lKG5wLCAmY211KTsKKwlzYW1zdW5nX2NtdV9yZWdpc3Rlcl9vbmUobnAsICZrZmNfY211KTsKIH0KIAogQ0xLX09GX0RFQ0xBUkUoZXh5bm9zNTI2MF9jbGtfa2ZjLCAic2Ftc3VuZyxleHlub3M1MjYwLWNsb2NrLWtmYyIsCkBAIC0xMDExLDIxICsxMDExLDIxIEBACiAJCQlFTl9JUF9NRkNfU0VDVVJFX1NNTVUyX01GQywgNywgMCwgMCksCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNhbXN1bmdfY211X2luZm8gbWZjX2NtdSBfX2luaXRjb25zdCA9IHsKKwkubXV4X2Nsa3MJPSBtZmNfbXV4X2Nsa3MsCisJLm5yX211eF9jbGtzCT0gQVJSQVlfU0laRShtZmNfbXV4X2Nsa3MpLAorCS5kaXZfY2xrcwk9IG1mY19kaXZfY2xrcywKKwkubnJfZGl2X2Nsa3MJPSBBUlJBWV9TSVpFKG1mY19kaXZfY2xrcyksCisJLmdhdGVfY2xrcwk9IG1mY19nYXRlX2Nsa3MsCisJLm5yX2dhdGVfY2xrcwk9IEFSUkFZX1NJWkUobWZjX2dhdGVfY2xrcyksCisJLm5yX2Nsa19pZHMJPSBNRkNfTlJfQ0xLLAorCS5jbGtfcmVncwk9IG1mY19jbGtfcmVncywKKwkubnJfY2xrX3JlZ3MJPSBBUlJBWV9TSVpFKG1mY19jbGtfcmVncyksCit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgZXh5bm9zNTI2MF9jbGtfbWZjX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQlzdHJ1Y3Qgc2Ftc3VuZ19jbXVfaW5mbyBjbXUgPSB7IE5VTEwgfTsKLQotCWNtdS5tdXhfY2xrcyA9IG1mY19tdXhfY2xrczsKLQljbXUubnJfbXV4X2Nsa3MgPSBBUlJBWV9TSVpFKG1mY19tdXhfY2xrcyk7Ci0JY211LmRpdl9jbGtzID0gbWZjX2Rpdl9jbGtzOwotCWNtdS5ucl9kaXZfY2xrcyA9IEFSUkFZX1NJWkUobWZjX2Rpdl9jbGtzKTsKLQljbXUuZ2F0ZV9jbGtzID0gbWZjX2dhdGVfY2xrczsKLQljbXUubnJfZ2F0ZV9jbGtzID0gQVJSQVlfU0laRShtZmNfZ2F0ZV9jbGtzKTsKLQljbXUubnJfY2xrX2lkcyA9IE1GQ19OUl9DTEs7Ci0JY211LmNsa19yZWdzID0gbWZjX2Nsa19yZWdzOwotCWNtdS5ucl9jbGtfcmVncyA9IEFSUkFZX1NJWkUobWZjX2Nsa19yZWdzKTsKLQotCXNhbXN1bmdfY211X3JlZ2lzdGVyX29uZShucCwgJmNtdSk7CisJc2Ftc3VuZ19jbXVfcmVnaXN0ZXJfb25lKG5wLCAmbWZjX2NtdSk7CiB9CiAKIENMS19PRl9ERUNMQVJFKGV4eW5vczUyNjBfY2xrX21mYywgInNhbXN1bmcsZXh5bm9zNTI2MC1jbG9jay1tZmMiLApAQCAtMTE1OCwyMyArMTE1OCwyMyBAQAogCQlwbGwyNTUwXzI0bWh6X3RibCksCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNhbXN1bmdfY211X2luZm8gbWlmX2NtdSBfX2luaXRjb25zdCA9IHsKKwkucGxsX2Nsa3MJPSBtaWZfcGxsX2Nsa3MsCisJLm5yX3BsbF9jbGtzCT0gQVJSQVlfU0laRShtaWZfcGxsX2Nsa3MpLAorCS5tdXhfY2xrcwk9IG1pZl9tdXhfY2xrcywKKwkubnJfbXV4X2Nsa3MJPSBBUlJBWV9TSVpFKG1pZl9tdXhfY2xrcyksCisJLmRpdl9jbGtzCT0gbWlmX2Rpdl9jbGtzLAorCS5ucl9kaXZfY2xrcwk9IEFSUkFZX1NJWkUobWlmX2Rpdl9jbGtzKSwKKwkuZ2F0ZV9jbGtzCT0gbWlmX2dhdGVfY2xrcywKKwkubnJfZ2F0ZV9jbGtzCT0gQVJSQVlfU0laRShtaWZfZ2F0ZV9jbGtzKSwKKwkubnJfY2xrX2lkcwk9IE1JRl9OUl9DTEssCisJLmNsa19yZWdzCT0gbWlmX2Nsa19yZWdzLAorCS5ucl9jbGtfcmVncwk9IEFSUkFZX1NJWkUobWlmX2Nsa19yZWdzKSwKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBleHlub3M1MjYwX2Nsa19taWZfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCXN0cnVjdCBzYW1zdW5nX2NtdV9pbmZvIGNtdSA9IHsgTlVMTCB9OwotCi0JY211LnBsbF9jbGtzID0gbWlmX3BsbF9jbGtzOwotCWNtdS5ucl9wbGxfY2xrcyA9ICBBUlJBWV9TSVpFKG1pZl9wbGxfY2xrcyk7Ci0JY211Lm11eF9jbGtzID0gbWlmX211eF9jbGtzOwotCWNtdS5ucl9tdXhfY2xrcyA9IEFSUkFZX1NJWkUobWlmX211eF9jbGtzKTsKLQljbXUuZGl2X2Nsa3MgPSBtaWZfZGl2X2Nsa3M7Ci0JY211Lm5yX2Rpdl9jbGtzID0gQVJSQVlfU0laRShtaWZfZGl2X2Nsa3MpOwotCWNtdS5nYXRlX2Nsa3MgPSBtaWZfZ2F0ZV9jbGtzOwotCWNtdS5ucl9nYXRlX2Nsa3MgPSBBUlJBWV9TSVpFKG1pZl9nYXRlX2Nsa3MpOwotCWNtdS5ucl9jbGtfaWRzID0gTUlGX05SX0NMSzsKLQljbXUuY2xrX3JlZ3MgPSBtaWZfY2xrX3JlZ3M7Ci0JY211Lm5yX2Nsa19yZWdzID0gQVJSQVlfU0laRShtaWZfY2xrX3JlZ3MpOwotCi0Jc2Ftc3VuZ19jbXVfcmVnaXN0ZXJfb25lKG5wLCAmY211KTsKKwlzYW1zdW5nX2NtdV9yZWdpc3Rlcl9vbmUobnAsICZtaWZfY211KTsKIH0KIAogQ0xLX09GX0RFQ0xBUkUoZXh5bm9zNTI2MF9jbGtfbWlmLCAic2Ftc3VuZyxleHlub3M1MjYwLWNsb2NrLW1pZiIsCkBAIC0xMzY2LDIxICsxMzY2LDIxIEBACiAJCUVOX0lQX1BFUklfU0VDVVJFX1RaUEMsIDIwLCAwLCAwKSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ19jbXVfaW5mbyBwZXJpX2NtdSBfX2luaXRjb25zdCA9IHsKKwkubXV4X2Nsa3MJPSBwZXJpX211eF9jbGtzLAorCS5ucl9tdXhfY2xrcwk9IEFSUkFZX1NJWkUocGVyaV9tdXhfY2xrcyksCisJLmRpdl9jbGtzCT0gcGVyaV9kaXZfY2xrcywKKwkubnJfZGl2X2Nsa3MJPSBBUlJBWV9TSVpFKHBlcmlfZGl2X2Nsa3MpLAorCS5nYXRlX2Nsa3MJPSBwZXJpX2dhdGVfY2xrcywKKwkubnJfZ2F0ZV9jbGtzCT0gQVJSQVlfU0laRShwZXJpX2dhdGVfY2xrcyksCisJLm5yX2Nsa19pZHMJPSBQRVJJX05SX0NMSywKKwkuY2xrX3JlZ3MJPSBwZXJpX2Nsa19yZWdzLAorCS5ucl9jbGtfcmVncwk9IEFSUkFZX1NJWkUocGVyaV9jbGtfcmVncyksCit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgZXh5bm9zNTI2MF9jbGtfcGVyaV9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0Jc3RydWN0IHNhbXN1bmdfY211X2luZm8gY211ID0geyBOVUxMIH07Ci0KLQljbXUubXV4X2Nsa3MgPSBwZXJpX211eF9jbGtzOwotCWNtdS5ucl9tdXhfY2xrcyA9IEFSUkFZX1NJWkUocGVyaV9tdXhfY2xrcyk7Ci0JY211LmRpdl9jbGtzID0gcGVyaV9kaXZfY2xrczsKLQljbXUubnJfZGl2X2Nsa3MgPSBBUlJBWV9TSVpFKHBlcmlfZGl2X2Nsa3MpOwotCWNtdS5nYXRlX2Nsa3MgPSBwZXJpX2dhdGVfY2xrczsKLQljbXUubnJfZ2F0ZV9jbGtzID0gQVJSQVlfU0laRShwZXJpX2dhdGVfY2xrcyk7Ci0JY211Lm5yX2Nsa19pZHMgPSBQRVJJX05SX0NMSzsKLQljbXUuY2xrX3JlZ3MgPSBwZXJpX2Nsa19yZWdzOwotCWNtdS5ucl9jbGtfcmVncyA9IEFSUkFZX1NJWkUocGVyaV9jbGtfcmVncyk7Ci0KLQlzYW1zdW5nX2NtdV9yZWdpc3Rlcl9vbmUobnAsICZjbXUpOworCXNhbXN1bmdfY211X3JlZ2lzdGVyX29uZShucCwgJnBlcmlfY211KTsKIH0KIAogQ0xLX09GX0RFQ0xBUkUoZXh5bm9zNTI2MF9jbGtfcGVyaSwgInNhbXN1bmcsZXh5bm9zNTI2MC1jbG9jay1wZXJpIiwKQEAgLTE4MTgsMjUgKzE4MTgsMjUgQEAKIAkJcGxsMjY1MF8yNG1oel90YmwpLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBzYW1zdW5nX2NtdV9pbmZvIHRvcF9jbXUgX19pbml0Y29uc3QgPSB7CisJLnBsbF9jbGtzCT0gdG9wX3BsbF9jbGtzLAorCS5ucl9wbGxfY2xrcwk9IEFSUkFZX1NJWkUodG9wX3BsbF9jbGtzKSwKKwkubXV4X2Nsa3MJPSB0b3BfbXV4X2Nsa3MsCisJLm5yX211eF9jbGtzCT0gQVJSQVlfU0laRSh0b3BfbXV4X2Nsa3MpLAorCS5kaXZfY2xrcwk9IHRvcF9kaXZfY2xrcywKKwkubnJfZGl2X2Nsa3MJPSBBUlJBWV9TSVpFKHRvcF9kaXZfY2xrcyksCisJLmdhdGVfY2xrcwk9IHRvcF9nYXRlX2Nsa3MsCisJLm5yX2dhdGVfY2xrcwk9IEFSUkFZX1NJWkUodG9wX2dhdGVfY2xrcyksCisJLmZpeGVkX2Nsa3MJPSBmaXhlZF9yYXRlX2Nsa3MsCisJLm5yX2ZpeGVkX2Nsa3MJPSBBUlJBWV9TSVpFKGZpeGVkX3JhdGVfY2xrcyksCisJLm5yX2Nsa19pZHMJPSBUT1BfTlJfQ0xLLAorCS5jbGtfcmVncwk9IHRvcF9jbGtfcmVncywKKwkubnJfY2xrX3JlZ3MJPSBBUlJBWV9TSVpFKHRvcF9jbGtfcmVncyksCit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgZXh5bm9zNTI2MF9jbGtfdG9wX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQlzdHJ1Y3Qgc2Ftc3VuZ19jbXVfaW5mbyBjbXUgPSB7IE5VTEwgfTsKLQotCWNtdS5wbGxfY2xrcyA9IHRvcF9wbGxfY2xrczsKLQljbXUubnJfcGxsX2Nsa3MgPSAgQVJSQVlfU0laRSh0b3BfcGxsX2Nsa3MpOwotCWNtdS5tdXhfY2xrcyA9IHRvcF9tdXhfY2xrczsKLQljbXUubnJfbXV4X2Nsa3MgPSBBUlJBWV9TSVpFKHRvcF9tdXhfY2xrcyk7Ci0JY211LmRpdl9jbGtzID0gdG9wX2Rpdl9jbGtzOwotCWNtdS5ucl9kaXZfY2xrcyA9IEFSUkFZX1NJWkUodG9wX2Rpdl9jbGtzKTsKLQljbXUuZ2F0ZV9jbGtzID0gdG9wX2dhdGVfY2xrczsKLQljbXUubnJfZ2F0ZV9jbGtzID0gQVJSQVlfU0laRSh0b3BfZ2F0ZV9jbGtzKTsKLQljbXUuZml4ZWRfY2xrcyA9IGZpeGVkX3JhdGVfY2xrczsKLQljbXUubnJfZml4ZWRfY2xrcyA9IEFSUkFZX1NJWkUoZml4ZWRfcmF0ZV9jbGtzKTsKLQljbXUubnJfY2xrX2lkcyA9IFRPUF9OUl9DTEs7Ci0JY211LmNsa19yZWdzID0gdG9wX2Nsa19yZWdzOwotCWNtdS5ucl9jbGtfcmVncyA9IEFSUkFZX1NJWkUodG9wX2Nsa19yZWdzKTsKLQotCXNhbXN1bmdfY211X3JlZ2lzdGVyX29uZShucCwgJmNtdSk7CisJc2Ftc3VuZ19jbXVfcmVnaXN0ZXJfb25lKG5wLCAmdG9wX2NtdSk7CiB9CiAKIENMS19PRl9ERUNMQVJFKGV4eW5vczUyNjBfY2xrX3RvcCwgInNhbXN1bmcsZXh5bm9zNTI2MC1jbG9jay10b3AiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc2Ftc3VuZy9jbGstZXh5bm9zNTQxMC5jIGIvZHJpdmVycy9jbGsvc2Ftc3VuZy9jbGstZXh5bm9zNTQxMC5jCmluZGV4IDU0ZWM0ODYuLmZjNDcxYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3NhbXN1bmcvY2xrLWV4eW5vczU0MTAuYworKysgYi9kcml2ZXJzL2Nsay9zYW1zdW5nL2Nsay1leHlub3M1NDEwLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KIAogI2luY2x1ZGUgImNsay5oIgogCkBAIC0yMSw2ICsyMiw4IEBACiAjZGVmaW5lIEFQTExfQ09OMCAgICAgICAgICAgICAgIDB4MTAwCiAjZGVmaW5lIENQTExfTE9DSyAgICAgICAgICAgICAgIDB4MTAwMjAKICNkZWZpbmUgQ1BMTF9DT04wICAgICAgICAgICAgICAgMHgxMDEyMAorI2RlZmluZSBFUExMX0xPQ0sgICAgICAgICAgICAgICAweDEwMDQwCisjZGVmaW5lIEVQTExfQ09OMCAgICAgICAgICAgICAgIDB4MTAxMzAKICNkZWZpbmUgTVBMTF9MT0NLICAgICAgICAgICAgICAgMHg0MDAwCiAjZGVmaW5lIE1QTExfQ09OMCAgICAgICAgICAgICAgIDB4NDEwMAogI2RlZmluZSBCUExMX0xPQ0sgICAgICAgICAgICAgICAweDIwMDEwCkBAIC01OCw3ICs2MSw3IEBACiAKIC8qIGxpc3Qgb2YgUExMcyAqLwogZW51bSBleHlub3M1NDEwX3BsbHMgewotCWFwbGwsIGNwbGwsIG1wbGwsCisJYXBsbCwgY3BsbCwgZXBsbCwgbXBsbCwKIAlicGxsLCBrcGxsLAogCW5yX3BsbHMgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBQTExzICovCiB9OwpAQCAtNjcsNiArNzAsNyBAQAogUE5BTUUoYXBsbF9wKQkJPSB7ICJmaW5fcGxsIiwgImZvdXRfYXBsbCIsIH07CiBQTkFNRShicGxsX3ApCQk9IHsgImZpbl9wbGwiLCAiZm91dF9icGxsIiwgfTsKIFBOQU1FKGNwbGxfcCkJCT0geyAiZmluX3BsbCIsICJmb3V0X2NwbGwiIH07CitQTkFNRShlcGxsX3ApCQk9IHsgImZpbl9wbGwiLCAiZm91dF9lcGxsIiB9OwogUE5BTUUobXBsbF9wKQkJPSB7ICJmaW5fcGxsIiwgImZvdXRfbXBsbCIsIH07CiBQTkFNRShrcGxsX3ApCQk9IHsgImZpbl9wbGwiLCAiZm91dF9rcGxsIiwgfTsKIApAQCAtOTUsNiArOTksOCBAQAogCU1VWCgwLCAic2Nsa19icGxsIiwgYnBsbF9wLCBTUkNfQ0RSRVgsIDAsIDEpLAogCU1VWCgwLCAic2Nsa19icGxsX211eGVkIiwgYnBsbF91c2VyX3AsIFNSQ19UT1AyLCAyNCwgMSksCiAKKwlNVVgoMCwgInNjbGtfZXBsbCIsIGVwbGxfcCwgU1JDX1RPUDIsIDEyLCAxKSwKKwogCU1VWCgwLCAic2Nsa19jcGxsIiwgY3BsbF9wLCBTUkNfVE9QMiwgOCwgMSksCiAKIAlNVVgoMCwgInNjbGtfbXBsbF9icGxsIiwgbXBsbF9icGxsX3AsIFNSQ19UT1AxLCAyMCwgMSksCkBAIC0xNzYsNiArMTgyLDggQEAKIAlHQVRFKENMS19NTUMwLCAic2RtbWMwIiwgImFjbGsyMDAiLCBHQVRFX0JVU19GU1lTMCwgMTIsIDAsIDApLAogCUdBVEUoQ0xLX01NQzEsICJzZG1tYzEiLCAiYWNsazIwMCIsIEdBVEVfQlVTX0ZTWVMwLCAxMywgMCwgMCksCiAJR0FURShDTEtfTU1DMiwgInNkbW1jMiIsICJhY2xrMjAwIiwgR0FURV9CVVNfRlNZUzAsIDE0LCAwLCAwKSwKKwlHQVRFKENMS19QRE1BMSwgInBkbWExIiwgImFjbGsyMDAiLCBHQVRFX0JVU19GU1lTMCwgMiwgMCwgMCksCisJR0FURShDTEtfUERNQTAsICJwZG1hMCIsICJhY2xrMjAwIiwgR0FURV9CVVNfRlNZUzAsIDEsIDAsIDApLAogCiAJR0FURShDTEtfU0NMS19VU0JQSFkzMDEsICJzY2xrX3VzYnBoeTMwMSIsICJkb3V0X3VzYnBoeTMwMSIsCiAJICAgICBHQVRFX1RPUF9TQ0xLX0ZTWVMsIDcsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLApAQCAtMjE3LDExICsyMjUsMjYgQEAKIAlHQVRFKENMS19VU0JEMzAxLCAidXNiZDMwMSIsICJhY2xrMjAwX2ZzeXMiLCBHQVRFX0lQX0ZTWVMsIDIwLCAwLCAwKSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ19wbGxfY2xvY2sgZXh5bm9zNTQxMF9wbGxzW25yX3BsbHNdIF9faW5pdGNvbnN0ID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzYW1zdW5nX3BsbF9yYXRlX3RhYmxlIGV4eW5vczU0MTBfcGxsMjU1MHhfMjRtaHpfdGJsW10gX19pbml0Y29uc3QgPSB7CisJUExMXzM2WFhfUkFURSg0MDAwMDAwMDBVLCAyMDAsIDMsIDIsIDApLAorCVBMTF8zNlhYX1JBVEUoMzMzMDAwMDAwVSwgMTExLCAyLCAyLCAwKSwKKwlQTExfMzZYWF9SQVRFKDMwMDAwMDAwMFUsIDEwMCwgMiwgMiwgMCksCisJUExMXzM2WFhfUkFURSgyNjYwMDAwMDBVLCAyNjYsIDMsIDMsIDApLAorCVBMTF8zNlhYX1JBVEUoMjAwMDAwMDAwVSwgMjAwLCAzLCAzLCAwKSwKKwlQTExfMzZYWF9SQVRFKDE5MjAwMDAwMFUsIDE5MiwgMywgMywgMCksCisJUExMXzM2WFhfUkFURSgxNjYwMDAwMDBVLCAxNjYsIDMsIDMsIDApLAorCVBMTF8zNlhYX1JBVEUoMTMzMDAwMDAwVSwgMjY2LCAzLCA0LCAwKSwKKwlQTExfMzZYWF9SQVRFKDEwMDAwMDAwMFUsIDIwMCwgMywgNCwgMCksCisJUExMXzM2WFhfUkFURSg2NjAwMDAwMFUsICAxNzYsIDIsIDUsIDApLAorfTsKKworc3RhdGljIHN0cnVjdCBzYW1zdW5nX3BsbF9jbG9jayBleHlub3M1NDEwX3BsbHNbbnJfcGxsc10gX19pbml0ZGF0YSA9IHsKIAlbYXBsbF0gPSBQTEwocGxsXzM1eHgsIENMS19GT1VUX0FQTEwsICJmb3V0X2FwbGwiLCAiZmluX3BsbCIsIEFQTExfTE9DSywKIAkJQVBMTF9DT04wLCBOVUxMKSwKIAlbY3BsbF0gPSBQTEwocGxsXzM1eHgsIENMS19GT1VUX0NQTEwsICJmb3V0X2NwbGwiLCAiZmluX3BsbCIsIENQTExfTE9DSywKIAkJQ1BMTF9DT04wLCBOVUxMKSwKKwlbZXBsbF0gPSBQTEwocGxsXzI2NTB4LCBDTEtfRk9VVF9FUExMLCAiZm91dF9lcGxsIiwgImZpbl9wbGwiLCBFUExMX0xPQ0ssCisJCUVQTExfQ09OMCwgTlVMTCksCiAJW21wbGxdID0gUExMKHBsbF8zNXh4LCBDTEtfRk9VVF9NUExMLCAiZm91dF9tcGxsIiwgImZpbl9wbGwiLCBNUExMX0xPQ0ssCiAJCU1QTExfQ09OMCwgTlVMTCksCiAJW2JwbGxdID0gUExMKHBsbF8zNXh4LCBDTEtfRk9VVF9CUExMLCAiZm91dF9icGxsIiwgImZpbl9wbGwiLCBCUExMX0xPQ0ssCkBAIC0yMzAsMjkgKzI1MywyNyBAQAogCQlLUExMX0NPTjAsIE5VTEwpLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBzYW1zdW5nX2NtdV9pbmZvIGNtdSBfX2luaXRjb25zdCA9IHsKKwkucGxsX2Nsa3MJPSBleHlub3M1NDEwX3BsbHMsCisJLm5yX3BsbF9jbGtzCT0gQVJSQVlfU0laRShleHlub3M1NDEwX3BsbHMpLAorCS5tdXhfY2xrcwk9IGV4eW5vczU0MTBfbXV4X2Nsa3MsCisJLm5yX211eF9jbGtzCT0gQVJSQVlfU0laRShleHlub3M1NDEwX211eF9jbGtzKSwKKwkuZGl2X2Nsa3MJPSBleHlub3M1NDEwX2Rpdl9jbGtzLAorCS5ucl9kaXZfY2xrcwk9IEFSUkFZX1NJWkUoZXh5bm9zNTQxMF9kaXZfY2xrcyksCisJLmdhdGVfY2xrcwk9IGV4eW5vczU0MTBfZ2F0ZV9jbGtzLAorCS5ucl9nYXRlX2Nsa3MJPSBBUlJBWV9TSVpFKGV4eW5vczU0MTBfZ2F0ZV9jbGtzKSwKKwkubnJfY2xrX2lkcwk9IENMS19OUl9DTEtTLAorfTsKKwogLyogcmVnaXN0ZXIgZXh5bm9zNTQxMCBjbG9ja3MgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBleHlub3M1NDEwX2Nsa19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0Jc3RydWN0IHNhbXN1bmdfY2xrX3Byb3ZpZGVyICpjdHg7Ci0Jdm9pZCBfX2lvbWVtICpyZWdfYmFzZTsKKwlzdHJ1Y3QgY2xrICp4eHRpID0gb2ZfY2xrX2dldChucCwgMCk7CiAKLQlyZWdfYmFzZSA9IG9mX2lvbWFwKG5wLCAwKTsKLQlpZiAoIXJlZ19iYXNlKQotCQlwYW5pYygiJXM6IGZhaWxlZCB0byBtYXAgcmVnaXN0ZXJzXG4iLCBfX2Z1bmNfXyk7CisJaWYgKCFJU19FUlIoeHh0aSkgJiYgY2xrX2dldF9yYXRlKHh4dGkpID09IDI0ICogTUhaKQorCQlleHlub3M1NDEwX3BsbHNbZXBsbF0ucmF0ZV90YWJsZSA9IGV4eW5vczU0MTBfcGxsMjU1MHhfMjRtaHpfdGJsOwogCi0JY3R4ID0gc2Ftc3VuZ19jbGtfaW5pdChucCwgcmVnX2Jhc2UsIENMS19OUl9DTEtTKTsKLQotCXNhbXN1bmdfY2xrX3JlZ2lzdGVyX3BsbChjdHgsIGV4eW5vczU0MTBfcGxscywKLQkJCUFSUkFZX1NJWkUoZXh5bm9zNTQxMF9wbGxzKSwgcmVnX2Jhc2UpOwotCi0Jc2Ftc3VuZ19jbGtfcmVnaXN0ZXJfbXV4KGN0eCwgZXh5bm9zNTQxMF9tdXhfY2xrcywKLQkJCUFSUkFZX1NJWkUoZXh5bm9zNTQxMF9tdXhfY2xrcykpOwotCXNhbXN1bmdfY2xrX3JlZ2lzdGVyX2RpdihjdHgsIGV4eW5vczU0MTBfZGl2X2Nsa3MsCi0JCQlBUlJBWV9TSVpFKGV4eW5vczU0MTBfZGl2X2Nsa3MpKTsKLQlzYW1zdW5nX2Nsa19yZWdpc3Rlcl9nYXRlKGN0eCwgZXh5bm9zNTQxMF9nYXRlX2Nsa3MsCi0JCQlBUlJBWV9TSVpFKGV4eW5vczU0MTBfZ2F0ZV9jbGtzKSk7Ci0KLQlzYW1zdW5nX2Nsa19vZl9hZGRfcHJvdmlkZXIobnAsIGN0eCk7CisJc2Ftc3VuZ19jbXVfcmVnaXN0ZXJfb25lKG5wLCAmY211KTsKIAogCXByX2RlYnVnKCJFeHlub3M1NDEwOiBjbG9jayBzZXR1cCBjb21wbGV0ZWQuXG4iKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3NhbXN1bmcvY2xrLWV4eW5vczU0MjAuYyBiL2RyaXZlcnMvY2xrL3NhbXN1bmcvY2xrLWV4eW5vczU0MjAuYwppbmRleCBiYjE5NmNhLi44YzhiNDk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9zYW1zdW5nL2Nsay1leHlub3M1NDIwLmMKKysrIGIvZHJpdmVycy9jbGsvc2Ftc3VuZy9jbGstZXh5bm9zNTQyMC5jCkBAIC0xMzEsNiArMTMxLDkgQEAKICNkZWZpbmUgVE9QX1NQQVJFMgkJMHgxMGIwOAogI2RlZmluZSBCUExMX0xPQ0sJCTB4MjAwMTAKICNkZWZpbmUgQlBMTF9DT04wCQkweDIwMTEwCisjZGVmaW5lIFNSQ19DRFJFWAkJMHgyMDIwMAorI2RlZmluZSBESVZfQ0RSRVgwCQkweDIwNTAwCisjZGVmaW5lIERJVl9DRFJFWDEJCTB4MjA1MDQKICNkZWZpbmUgS1BMTF9MT0NLCQkweDI4MDAwCiAjZGVmaW5lIEtQTExfQ09OMAkJMHgyODEwMAogI2RlZmluZSBTUkNfS0ZDCQkJMHgyODIwMApAQCAtMjQ0LDYgKzI0Nyw5IEBACiAJR0FURV9UT1BfU0NMS19GU1lTLAogCUdBVEVfVE9QX1NDTEtfUEVSSUMsCiAJVE9QX1NQQVJFMiwKKwlTUkNfQ0RSRVgsCisJRElWX0NEUkVYMCwKKwlESVZfQ0RSRVgxLAogCVNSQ19LRkMsCiAJRElWX0tGQzAsCiB9OwpAQCAtNDQ4LDYgKzQ1NCw4IEBACiAJCQkgIm1vdXRfc2Nsa19lcGxsIiwgIm1vdXRfc2Nsa19ycGxsIn07CiBQTkFNRShtb3V0X21hdV9lcGxsX2Nsa19wKSA9IHsibW91dF9zY2xrX2VwbGwiLCAibW91dF9zY2xrX2RwbGwiLAogCQkJCSJtb3V0X3NjbGtfbXBsbCIsICJtb3V0X3NjbGtfc3BsbCJ9OworUE5BTUUobW91dF9tY2xrX2NkcmV4X3ApID0geyJtb3V0X2JwbGwiLCAibW91dF9teF9tc3BsbF9jY29yZSJ9OworCiAvKiBMaXN0IG9mIHBhcmVudHMgc3BlY2lmaWMgdG8gZXh5bm9zNTgwMCAqLwogUE5BTUUobW91dF9lcGxsMl81ODAwX3ApCT0geyAibW91dF9zY2xrX2VwbGwiLCAiZmZfZG91dF9lcGxsMiIgfTsKIFBOQU1FKG1vdXRfZ3JvdXAxXzU4MDBfcCkJPSB7ICJtb3V0X3NjbGtfY3BsbCIsICJtb3V0X3NjbGtfZHBsbCIsCkBAIC00NjUsNiArNDczLDkgQEAKIFBOQU1FKG1vdXRfZ3JvdXA3XzU4MDBfcCkJPSB7ICJtb3V0X3NjbGtfY3BsbCIsICJtb3V0X3NjbGtfZHBsbCIsCiAJCQkJCSJtb3V0X3NjbGtfbXBsbCIsICJtb3V0X3NjbGtfc3BsbCIsCiAJCQkJCSJtb3V0X2VwbGwyIiwgIm1vdXRfc2Nsa19pcGxsIiB9OworUE5BTUUobW91dF9teF9tc3BsbF9jY29yZV9wKQk9IHsic2Nsa19icGxsIiwgIm1vdXRfc2Nsa19kcGxsIiwKKwkJCQkJIm1vdXRfc2Nsa19tcGxsIiwgImZmX2RvdXRfc3BsbDIiLAorCQkJCQkibW91dF9zY2xrX3NwbGwiLCAibW91dF9zY2xrX2VwbGwifTsKIFBOQU1FKG1vdXRfbWF1X2VwbGxfY2xrXzU4MDBfcCkJPSB7ICJtb3V0X3NjbGtfZXBsbCIsICJtb3V0X3NjbGtfZHBsbCIsCiAJCQkJCSJtb3V0X3NjbGtfbXBsbCIsCiAJCQkJCSJmZl9kb3V0X3NwbGwyIiB9OwpAQCAtNTIzLDYgKzUzNCw4IEBACiAJTVVYKDAsICJtb3V0X2FjbGszMDBfZGlzcDEiLCBtb3V0X2dyb3VwNV81ODAwX3AsIFNSQ19UT1AyLCAyNCwgMiksCiAJTVVYKDAsICJtb3V0X2FjbGszMDBfZ3NjbCIsIG1vdXRfZ3JvdXA1XzU4MDBfcCwgU1JDX1RPUDIsIDI4LCAyKSwKIAorCU1VWChDTEtfTU9VVF9NWF9NU1BMTF9DQ09SRSwgIm1vdXRfbXhfbXNwbGxfY2NvcmUiLAorCQkJbW91dF9teF9tc3BsbF9jY29yZV9wLCBTUkNfVE9QNywgMTYsIDIpLAogCU1VWCgwLCAibW91dF9tYXVfZXBsbF9jbGsiLCBtb3V0X21hdV9lcGxsX2Nsa181ODAwX3AsIFNSQ19UT1A3LAogCQkJMjAsIDIpLAogCU1VWCgwLCAic2Nsa19icGxsIiwgbW91dF9icGxsX3AsIFNSQ19UT1A3LCAyNCwgMSksCkBAIC02MDEsNiArNjE0LDggQEAKIAlNVVgoMCwgIm1vdXRfYWNsazMwMF9kaXNwMSIsIG1vdXRfZ3JvdXAxX3AsIFNSQ19UT1AyLCAyNCwgMiksCiAJTVVYKDAsICJtb3V0X2FjbGszMDBfZ3NjbCIsIG1vdXRfZ3JvdXAxX3AsIFNSQ19UT1AyLCAyOCwgMiksCiAKKwlNVVgoQ0xLX01PVVRfTVhfTVNQTExfQ0NPUkUsICJtb3V0X214X21zcGxsX2Njb3JlIiwKKwkJCW1vdXRfZ3JvdXA1XzU4MDBfcCwgU1JDX1RPUDcsIDE2LCAyKSwKIAlNVVgoMCwgIm1vdXRfbWF1X2VwbGxfY2xrIiwgbW91dF9tYXVfZXBsbF9jbGtfcCwgU1JDX1RPUDcsIDIwLCAyKSwKIAogCU1VWCgwLCAibW91dF9maW1kMSIsIG1vdXRfZ3JvdXAzX3AsIFNSQ19ESVNQMTAsIDQsIDEpLApAQCAtNzQ0LDYgKzc1OSwxMiBAQAogCiAJTVVYKDAsICJtb3V0X2ZpbWQxX2ZpbmFsIiwgbW91dF9maW1kMV9maW5hbF9wLCBUT1BfU1BBUkUyLCA4LCAxKSwKIAorCS8qIENEUkVYIGJsb2NrICovCisJTVVYX0YoQ0xLX01PVVRfTUNMS19DRFJFWCwgIm1vdXRfbWNsa19jZHJleCIsIG1vdXRfbWNsa19jZHJleF9wLAorCQkJU1JDX0NEUkVYLCA0LCAxLCBDTEtfU0VUX1JBVEVfUEFSRU5ULCAwKSwKKwlNVVhfRihDTEtfTU9VVF9CUExMLCAibW91dF9icGxsIiwgbW91dF9icGxsX3AsIFNSQ19DRFJFWCwgMCwgMSwKKwkJCUNMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCiAJLyogTUFVIEJsb2NrICovCiAJTVVYKENMS19NT1VUX01BVURJTzAsICJtb3V0X21hdWRpbzAiLCBtb3V0X21hdWRpbzBfcCwgU1JDX01BVSwgMjgsIDMpLAogCkBAIC04MzYsNiArODU3LDIxIEBACiAJRElWKENMS19ET1VUX0FDTEs0MDBfRElTUDEsICJkb3V0X2FjbGs0MDBfZGlzcDEiLAogCQkJIm1vdXRfYWNsazQwMF9kaXNwMSIsIERJVl9UT1AyLCA0LCAzKSwKIAorCS8qIENEUkVYIEJsb2NrICovCisJRElWKENMS19ET1VUX1BDTEtfQ0RSRVgsICJkb3V0X3BjbGtfY2RyZXgiLCAiZG91dF9hY2xrX2NkcmV4MSIsCisJCQlESVZfQ0RSRVgwLCAyOCwgMyksCisJRElWX0YoQ0xLX0RPVVRfU0NMS19DRFJFWCwgImRvdXRfc2Nsa19jZHJleCIsICJtb3V0X21jbGtfY2RyZXgiLAorCQkJRElWX0NEUkVYMCwgMjQsIDMsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCURJVihDTEtfRE9VVF9BQ0xLX0NEUkVYMSwgImRvdXRfYWNsa19jZHJleDEiLCAiZG91dF9jbGsyeF9waHkwIiwKKwkJCURJVl9DRFJFWDAsIDE2LCAzKSwKKwlESVYoQ0xLX0RPVVRfQ0NMS19EUkVYMCwgImRvdXRfY2Nsa19kcmV4MCIsICJkb3V0X2NsazJ4X3BoeTAiLAorCQkJRElWX0NEUkVYMCwgOCwgMyksCisJRElWKENMS19ET1VUX0NMSzJYX1BIWTAsICJkb3V0X2NsazJ4X3BoeTAiLCAiZG91dF9zY2xrX2NkcmV4IiwKKwkJCURJVl9DRFJFWDAsIDMsIDUpLAorCisJRElWKENMS19ET1VUX1BDTEtfQ09SRV9NRU0sICJkb3V0X3BjbGtfY29yZV9tZW0iLCAibW91dF9tY2xrX2NkcmV4IiwKKwkJCURJVl9DRFJFWDEsIDgsIDMpLAorCiAJLyogQXVkaW8gQmxvY2sgKi8KIAlESVYoMCwgImRvdXRfbWF1ZGlvMCIsICJtb3V0X21hdWRpbzAiLCBESVZfTUFVLCAyMCwgNCksCiAJRElWKDAsICJkb3V0X21hdXBjbTAiLCAiZG91dF9tYXVkaW8wIiwgRElWX01BVSwgMjQsIDgpLApAQCAtMTM2NCw2ICsxNDAwLDcgQEAKIAlpZiAoX2dldF9yYXRlKCJmaW5fcGxsIikgPT0gMjQgKiBNSFopIHsKIAkJZXh5bm9zNXhfcGxsc1thcGxsXS5yYXRlX3RhYmxlID0gZXh5bm9zNTQyMF9wbGwyNTUweF8yNG1oel90Ymw7CiAJCWV4eW5vczV4X3BsbHNba3BsbF0ucmF0ZV90YWJsZSA9IGV4eW5vczU0MjBfcGxsMjU1MHhfMjRtaHpfdGJsOworCQlleHlub3M1eF9wbGxzW2JwbGxdLnJhdGVfdGFibGUgPSBleHlub3M1NDIwX3BsbDI1NTB4XzI0bWh6X3RibDsKIAl9CiAKIAlzYW1zdW5nX2Nsa19yZWdpc3Rlcl9wbGwoY3R4LCBleHlub3M1eF9wbGxzLCBBUlJBWV9TSVpFKGV4eW5vczV4X3BsbHMpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc2Ftc3VuZy9jbGstZXh5bm9zNTQ0MC5jIGIvZHJpdmVycy9jbGsvc2Ftc3VuZy9jbGstZXh5bm9zNTQ0MC5jCmluZGV4IGE1N2QwMWIuLmE4MGYzZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3NhbXN1bmcvY2xrLWV4eW5vczU0NDAuYworKysgYi9kcml2ZXJzL2Nsay9zYW1zdW5nL2Nsay1leHlub3M1NDQwLmMKQEAgLTExMiw2ICsxMTIsMTEgQEAKIAkucHJpb3JpdHkgPSAxMjgsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNhbXN1bmdfcGxsX2Nsb2NrIGV4eW5vczU0NDBfcGxsc1tdIF9faW5pdGNvbnN0ID0geworCVBMTChwbGxfMjU1MHgsIENMS19DUExMQSwgImNwbGxhIiwgInh0YWwiLCAwLCAweDRjLCBOVUxMKSwKKwlQTEwocGxsXzI1NTB4LCBDTEtfQ1BMTEIsICJjcGxsYiIsICJ4dGFsIiwgMCwgMHg1MCwgTlVMTCksCit9OworCiAvKiByZWdpc3RlciBleHlub3M1NDQwIGNsb2NrcyAqLwogc3RhdGljIHZvaWQgX19pbml0IGV4eW5vczU0NDBfY2xrX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKQEAgLTEyOSw4ICsxMzQsOCBAQAogCXNhbXN1bmdfY2xrX29mX3JlZ2lzdGVyX2ZpeGVkX2V4dChjdHgsIGV4eW5vczU0NDBfZml4ZWRfcmF0ZV9leHRfY2xrcywKIAkJQVJSQVlfU0laRShleHlub3M1NDQwX2ZpeGVkX3JhdGVfZXh0X2Nsa3MpLCBleHRfY2xrX21hdGNoKTsKIAotCXNhbXN1bmdfY2xrX3JlZ2lzdGVyX3BsbDI1NTB4KCJjcGxsYSIsICJ4dGFsIiwgcmVnX2Jhc2UgKyAweDFjLCAweDEwKTsKLQlzYW1zdW5nX2Nsa19yZWdpc3Rlcl9wbGwyNTUweCgiY3BsbGIiLCAieHRhbCIsIHJlZ19iYXNlICsgMHgyMCwgMHgxMCk7CisJc2Ftc3VuZ19jbGtfcmVnaXN0ZXJfcGxsKGN0eCwgZXh5bm9zNTQ0MF9wbGxzLAorCQkJQVJSQVlfU0laRShleHlub3M1NDQwX3BsbHMpLCBjdHgtPnJlZ19iYXNlKTsKIAogCXNhbXN1bmdfY2xrX3JlZ2lzdGVyX2ZpeGVkX3JhdGUoY3R4LCBleHlub3M1NDQwX2ZpeGVkX3JhdGVfY2xrcywKIAkJCUFSUkFZX1NJWkUoZXh5bm9zNTQ0MF9maXhlZF9yYXRlX2Nsa3MpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3NhbXN1bmcvY2xrLXBsbC5jIGIvZHJpdmVycy9jbGsvc2Ftc3VuZy9jbGstcGxsLmMKaW5kZXggNDgxMzliZC4uOTYxNzgyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvc2Ftc3VuZy9jbGstcGxsLmMKKysrIGIvZHJpdmVycy9jbGsvc2Ftc3VuZy9jbGstcGxsLmMKQEAgLTg5MCwyMiArODkwLDE0IEBACiAjZGVmaW5lIFBMTDI1NTBYX01fU0hJRlQgICAgICAoNCkKICNkZWZpbmUgUExMMjU1MFhfU19TSElGVCAgICAgICgwKQogCi1zdHJ1Y3Qgc2Ftc3VuZ19jbGtfcGxsMjU1MHggewotCXN0cnVjdCBjbGtfaHcJCWh3OwotCWNvbnN0IHZvaWQgX19pb21lbQkqcmVnX2Jhc2U7Ci0JdW5zaWduZWQgbG9uZwkJb2Zmc2V0OwotfTsKLQotI2RlZmluZSB0b19jbGtfcGxsMjU1MHgoX2h3KSBjb250YWluZXJfb2YoX2h3LCBzdHJ1Y3Qgc2Ftc3VuZ19jbGtfcGxsMjU1MHgsIGh3KQotCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzYW1zdW5nX3BsbDI1NTB4X3JlY2FsY19yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LAogCQkJCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUpCiB7Ci0Jc3RydWN0IHNhbXN1bmdfY2xrX3BsbDI1NTB4ICpwbGwgPSB0b19jbGtfcGxsMjU1MHgoaHcpOworCXN0cnVjdCBzYW1zdW5nX2Nsa19wbGwgKnBsbCA9IHRvX2Nsa19wbGwoaHcpOwogCXUzMiByLCBwLCBtLCBzLCBwbGxfc3RhdDsKIAl1NjQgZnZjbyA9IHBhcmVudF9yYXRlOwogCi0JcGxsX3N0YXQgPSByZWFkbF9yZWxheGVkKHBsbC0+cmVnX2Jhc2UgKyBwbGwtPm9mZnNldCAqIDMpOworCXBsbF9zdGF0ID0gcmVhZGxfcmVsYXhlZChwbGwtPmNvbl9yZWcpOwogCXIgPSAocGxsX3N0YXQgPj4gUExMMjU1MFhfUl9TSElGVCkgJiBQTEwyNTUwWF9SX01BU0s7CiAJaWYgKCFyKQogCQlyZXR1cm4gMDsKQEAgLTkyMyw0MyArOTE1LDYgQEAKIAkucmVjYWxjX3JhdGUgPSBzYW1zdW5nX3BsbDI1NTB4X3JlY2FsY19yYXRlLAogfTsKIAotc3RydWN0IGNsayAqIF9faW5pdCBzYW1zdW5nX2Nsa19yZWdpc3Rlcl9wbGwyNTUweChjb25zdCBjaGFyICpuYW1lLAotCQkJY29uc3QgY2hhciAqcG5hbWUsIGNvbnN0IHZvaWQgX19pb21lbSAqcmVnX2Jhc2UsCi0JCQljb25zdCB1bnNpZ25lZCBsb25nIG9mZnNldCkKLXsKLQlzdHJ1Y3Qgc2Ftc3VuZ19jbGtfcGxsMjU1MHggKnBsbDsKLQlzdHJ1Y3QgY2xrICpjbGs7Ci0Jc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKLQotCXBsbCA9IGt6YWxsb2Moc2l6ZW9mKCpwbGwpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBsbCkgewotCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgYWxsb2NhdGUgcGxsIGNsayAlc1xuIiwgX19mdW5jX18sIG5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlpbml0Lm5hbWUgPSBuYW1lOwotCWluaXQub3BzID0gJnNhbXN1bmdfcGxsMjU1MHhfY2xrX29wczsKLQlpbml0LmZsYWdzID0gQ0xLX0dFVF9SQVRFX05PQ0FDSEU7Ci0JaW5pdC5wYXJlbnRfbmFtZXMgPSAmcG5hbWU7Ci0JaW5pdC5udW1fcGFyZW50cyA9IDE7Ci0KLQlwbGwtPmh3LmluaXQgPSAmaW5pdDsKLQlwbGwtPnJlZ19iYXNlID0gcmVnX2Jhc2U7Ci0JcGxsLT5vZmZzZXQgPSBvZmZzZXQ7Ci0KLQljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJnBsbC0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkgewotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgcGxsIGNsb2NrICVzXG4iLCBfX2Z1bmNfXywKLQkJCQluYW1lKTsKLQkJa2ZyZWUocGxsKTsKLQl9Ci0KLQlpZiAoY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGssIG5hbWUsIE5VTEwpKQotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgbG9va3VwIGZvciAlcyIsIF9fZnVuY19fLCBuYW1lKTsKLQotCXJldHVybiBjbGs7Ci19Ci0KIC8qCiAgKiBQTEwyNTUweHggQ2xvY2sgVHlwZQogICovCkBAIC0xMDYzLDYgKzEwMTgsMTAyIEBACiB9OwogCiAvKgorICogUExMMjY1MHggQ2xvY2sgVHlwZQorICovCisKKy8qIE1heGltdW0gbG9jayB0aW1lIGNhbiBiZSAzMDAwICogUERJViBjeWNsZXMgKi8KKyNkZWZpbmUgUExMMjY1MFhfTE9DS19GQUNUT1IJCTMwMDAKKworI2RlZmluZSBQTEwyNjUwWF9NX01BU0sJCQkweDFmZgorI2RlZmluZSBQTEwyNjUwWF9QX01BU0sJCQkweDNmCisjZGVmaW5lIFBMTDI2NTBYX1NfTUFTSwkJCTB4NworI2RlZmluZSBQTEwyNjUwWF9LX01BU0sJCQkweGZmZmYKKyNkZWZpbmUgUExMMjY1MFhfTE9DS19TVEFUX01BU0sJCTB4MQorI2RlZmluZSBQTEwyNjUwWF9NX1NISUZUCQkxNgorI2RlZmluZSBQTEwyNjUwWF9QX1NISUZUCQk4CisjZGVmaW5lIFBMTDI2NTBYX1NfU0hJRlQJCTAKKyNkZWZpbmUgUExMMjY1MFhfS19TSElGVAkJMAorI2RlZmluZSBQTEwyNjUwWF9MT0NLX1NUQVRfU0hJRlQJMjkKKyNkZWZpbmUgUExMMjY1MFhfUExMX0VOQUJMRV9TSElGVAkzMQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzYW1zdW5nX3BsbDI2NTB4X3JlY2FsY19yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LAorCQkJCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUpCit7CisJc3RydWN0IHNhbXN1bmdfY2xrX3BsbCAqcGxsID0gdG9fY2xrX3BsbChodyk7CisJdTY0IGZvdXQgPSBwYXJlbnRfcmF0ZTsKKwl1MzIgbWRpdiwgcGRpdiwgc2RpdiwgcGxsX2NvbjAsIHBsbF9jb24xOworCXMxNiBrZGl2OworCisJcGxsX2NvbjAgPSByZWFkbF9yZWxheGVkKHBsbC0+Y29uX3JlZyk7CisJbWRpdiA9IChwbGxfY29uMCA+PiBQTEwyNjUwWF9NX1NISUZUKSAmIFBMTDI2NTBYX01fTUFTSzsKKwlwZGl2ID0gKHBsbF9jb24wID4+IFBMTDI2NTBYX1BfU0hJRlQpICYgUExMMjY1MFhfUF9NQVNLOworCXNkaXYgPSAocGxsX2NvbjAgPj4gUExMMjY1MFhfU19TSElGVCkgJiBQTEwyNjUwWF9TX01BU0s7CisKKwlwbGxfY29uMSA9IHJlYWRsX3JlbGF4ZWQocGxsLT5jb25fcmVnICsgNCk7CisJa2RpdiA9IChzMTYpKChwbGxfY29uMSA+PiBQTEwyNjUwWF9LX1NISUZUKSAmIFBMTDI2NTBYX0tfTUFTSyk7CisKKwlmb3V0ICo9IChtZGl2IDw8IDE2KSArIGtkaXY7CisJZG9fZGl2KGZvdXQsIChwZGl2IDw8IHNkaXYpKTsKKwlmb3V0ID4+PSAxNjsKKworCXJldHVybiAodW5zaWduZWQgbG9uZylmb3V0OworfQorCitzdGF0aWMgaW50IHNhbXN1bmdfcGxsMjY1MHhfc2V0X3JhdGUoc3RydWN0IGNsa19odyAqaHcsIHVuc2lnbmVkIGxvbmcgZHJhdGUsCisJCQkJCXVuc2lnbmVkIGxvbmcgcHJhdGUpCit7CisJc3RydWN0IHNhbXN1bmdfY2xrX3BsbCAqcGxsID0gdG9fY2xrX3BsbChodyk7CisJY29uc3Qgc3RydWN0IHNhbXN1bmdfcGxsX3JhdGVfdGFibGUgKnJhdGU7CisJdTMyIGNvbjAsIGNvbjE7CisKKwkvKiBHZXQgcmVxdWlyZWQgcmF0ZSBzZXR0aW5ncyBmcm9tIHRhYmxlICovCisJcmF0ZSA9IHNhbXN1bmdfZ2V0X3BsbF9zZXR0aW5ncyhwbGwsIGRyYXRlKTsKKwlpZiAoIXJhdGUpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCByYXRlIDogJWx1IGZvciBwbGwgY2xrICVzXG4iLCBfX2Z1bmNfXywKKwkJCWRyYXRlLCBjbGtfaHdfZ2V0X25hbWUoaHcpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY29uMCA9IHJlYWRsX3JlbGF4ZWQocGxsLT5jb25fcmVnKTsKKwljb24xID0gcmVhZGxfcmVsYXhlZChwbGwtPmNvbl9yZWcgKyA0KTsKKworCS8qIFNldCBQTEwgbG9jayB0aW1lLiAqLworCXdyaXRlbF9yZWxheGVkKHJhdGUtPnBkaXYgKiBQTEwyNjUwWF9MT0NLX0ZBQ1RPUiwgcGxsLT5sb2NrX3JlZyk7CisKKwkvKiBDaGFuZ2UgUExMIFBNUyB2YWx1ZXMgKi8KKwljb24wICY9IH4oKFBMTDI2NTBYX01fTUFTSyA8PCBQTEwyNjUwWF9NX1NISUZUKSB8CisJCQkoUExMMjY1MFhfUF9NQVNLIDw8IFBMTDI2NTBYX1BfU0hJRlQpIHwKKwkJCShQTEwyNjUwWF9TX01BU0sgPDwgUExMMjY1MFhfU19TSElGVCkpOworCWNvbjAgfD0gKHJhdGUtPm1kaXYgPDwgUExMMjY1MFhfTV9TSElGVCkgfAorCQkJKHJhdGUtPnBkaXYgPDwgUExMMjY1MFhfUF9TSElGVCkgfAorCQkJKHJhdGUtPnNkaXYgPDwgUExMMjY1MFhfU19TSElGVCk7CisJY29uMCB8PSAoMSA8PCBQTEwyNjUwWF9QTExfRU5BQkxFX1NISUZUKTsKKwl3cml0ZWxfcmVsYXhlZChjb24wLCBwbGwtPmNvbl9yZWcpOworCisJY29uMSAmPSB+KFBMTDI2NTBYX0tfTUFTSyA8PCBQTEwyNjUwWF9LX1NISUZUKTsKKwljb24xIHw9ICgocmF0ZS0+a2RpdiAmIFBMTDI2NTBYX0tfTUFTSykgPDwgUExMMjY1MFhfS19TSElGVCk7CisJd3JpdGVsX3JlbGF4ZWQoY29uMSwgcGxsLT5jb25fcmVnICsgNCk7CisKKwlkbyB7CisJCWNwdV9yZWxheCgpOworCQljb24wID0gcmVhZGxfcmVsYXhlZChwbGwtPmNvbl9yZWcpOworCX0gd2hpbGUgKCEoY29uMCAmIChQTEwyNjUwWF9MT0NLX1NUQVRfTUFTSworCQkJPDwgUExMMjY1MFhfTE9DS19TVEFUX1NISUZUKSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBzYW1zdW5nX3BsbDI2NTB4X2Nsa19vcHMgPSB7CisJLnJlY2FsY19yYXRlID0gc2Ftc3VuZ19wbGwyNjUweF9yZWNhbGNfcmF0ZSwKKwkucm91bmRfcmF0ZSA9IHNhbXN1bmdfcGxsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlID0gc2Ftc3VuZ19wbGwyNjUweF9zZXRfcmF0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBzYW1zdW5nX3BsbDI2NTB4X2Nsa19taW5fb3BzID0geworCS5yZWNhbGNfcmF0ZSA9IHNhbXN1bmdfcGxsMjY1MHhfcmVjYWxjX3JhdGUsCit9OworCisvKgogICogUExMMjY1MFhYIENsb2NrIFR5cGUKICAqLwogCkBAIC0xMjYzLDEyICsxMzE0LDIxIEBACiAJCWVsc2UKIAkJCWluaXQub3BzID0gJnNhbXN1bmdfczNjMjQ0MF9tcGxsX2Nsa19vcHM7CiAJCWJyZWFrOworCWNhc2UgcGxsXzI1NTB4OgorCQlpbml0Lm9wcyA9ICZzYW1zdW5nX3BsbDI1NTB4X2Nsa19vcHM7CisJCWJyZWFrOwogCWNhc2UgcGxsXzI1NTB4eDoKIAkJaWYgKCFwbGwtPnJhdGVfdGFibGUpCiAJCQlpbml0Lm9wcyA9ICZzYW1zdW5nX3BsbDI1NTB4eF9jbGtfbWluX29wczsKIAkJZWxzZQogCQkJaW5pdC5vcHMgPSAmc2Ftc3VuZ19wbGwyNTUweHhfY2xrX29wczsKIAkJYnJlYWs7CisJY2FzZSBwbGxfMjY1MHg6CisJCWlmICghcGxsLT5yYXRlX3RhYmxlKQorCQkJaW5pdC5vcHMgPSAmc2Ftc3VuZ19wbGwyNjUweF9jbGtfbWluX29wczsKKwkJZWxzZQorCQkJaW5pdC5vcHMgPSAmc2Ftc3VuZ19wbGwyNjUweF9jbGtfb3BzOworCQlicmVhazsKIAljYXNlIHBsbF8yNjUweHg6CiAJCWlmICghcGxsLT5yYXRlX3RhYmxlKQogCQkJaW5pdC5vcHMgPSAmc2Ftc3VuZ19wbGwyNjUweHhfY2xrX21pbl9vcHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zYW1zdW5nL2Nsay1wbGwuaCBiL2RyaXZlcnMvY2xrL3NhbXN1bmcvY2xrLXBsbC5oCmluZGV4IDIxM2RlOWEuLmExY2EwMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3NhbXN1bmcvY2xrLXBsbC5oCisrKyBiL2RyaXZlcnMvY2xrL3NhbXN1bmcvY2xrLXBsbC5oCkBAIC0zMSw3ICszMSw5IEBACiAJcGxsX3MzYzI0MTBfbXBsbCwKIAlwbGxfczNjMjQxMF91cGxsLAogCXBsbF9zM2MyNDQwX21wbGwsCisJcGxsXzI1NTB4LAogCXBsbF8yNTUweHgsCisJcGxsXzI2NTB4LAogCXBsbF8yNjUweHgsCiAJcGxsXzE0NTB4LAogCXBsbF8xNDUxeCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3N0L2Nsay1mbGV4Z2VuLmMgYi9kcml2ZXJzL2Nsay9zdC9jbGstZmxleGdlbi5jCmluZGV4IDU0NmJkNzkuLmE0ODVmM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3N0L2Nsay1mbGV4Z2VuLmMKKysrIGIvZHJpdmVycy9jbGsvc3QvY2xrLWZsZXhnZW4uYwpAQCAtMTUsNiArMTUsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KIAorc3RydWN0IGNsa2dlbl9kYXRhIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWJvb2wgbW9kZTsKK307CisKIHN0cnVjdCBmbGV4Z2VuIHsKIAlzdHJ1Y3QgY2xrX2h3IGh3OwogCkBAIC0yOCw5ICszMywxNCBAQAogCXN0cnVjdCBjbGtfZ2F0ZSBmZ2F0ZTsKIAkvKiBGaW5hbCBkaXZpc29yICovCiAJc3RydWN0IGNsa19kaXZpZGVyIGZkaXY7CisJLyogQXN5bmNocm9ub3VzIG1vZGUgY29udHJvbCAqLworCXN0cnVjdCBjbGtfZ2F0ZSBzeW5jOworCS8qIGh3IGNvbnRyb2wgZmxhZ3MgKi8KKwlib29sIGNvbnRyb2xfbW9kZTsKIH07CiAKICNkZWZpbmUgdG9fZmxleGdlbihfaHcpIGNvbnRhaW5lcl9vZihfaHcsIHN0cnVjdCBmbGV4Z2VuLCBodykKKyNkZWZpbmUgdG9fY2xrX2dhdGUoX2h3KSBjb250YWluZXJfb2YoX2h3LCBzdHJ1Y3QgY2xrX2dhdGUsIGh3KQogCiBzdGF0aWMgaW50IGZsZXhnZW5fZW5hYmxlKHN0cnVjdCBjbGtfaHcgKmh3KQogewpAQCAtMTM5LDEyICsxNDksMjEgQEAKIAlzdHJ1Y3QgZmxleGdlbiAqZmxleGdlbiA9IHRvX2ZsZXhnZW4oaHcpOwogCXN0cnVjdCBjbGtfaHcgKnBkaXZfaHcgPSAmZmxleGdlbi0+cGRpdi5odzsKIAlzdHJ1Y3QgY2xrX2h3ICpmZGl2X2h3ID0gJmZsZXhnZW4tPmZkaXYuaHc7CisJc3RydWN0IGNsa19odyAqc3luY19odyA9ICZmbGV4Z2VuLT5zeW5jLmh3OworCXN0cnVjdCBjbGtfZ2F0ZSAqY29uZmlnID0gdG9fY2xrX2dhdGUoc3luY19odyk7CiAJdW5zaWduZWQgbG9uZyBkaXYgPSAwOwogCWludCByZXQgPSAwOworCXUzMiByZWc7CiAKIAlfX2Nsa19od19zZXRfY2xrKHBkaXZfaHcsIGh3KTsKIAlfX2Nsa19od19zZXRfY2xrKGZkaXZfaHcsIGh3KTsKIAorCWlmIChmbGV4Z2VuLT5jb250cm9sX21vZGUpIHsKKwkJcmVnID0gcmVhZGwoY29uZmlnLT5yZWcpOworCQlyZWcgJj0gfkJJVChjb25maWctPmJpdF9pZHgpOworCQl3cml0ZWwocmVnLCBjb25maWctPnJlZyk7CisJfQorCiAJZGl2ID0gY2xrX2Jlc3RfZGl2KHBhcmVudF9yYXRlLCByYXRlKTsKIAogCS8qCkBAIC0xNzgsNyArMTk3LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrICpjbGtfcmVnaXN0ZXJfZmxleGdlbihjb25zdCBjaGFyICpuYW1lLAogCQkJCWNvbnN0IGNoYXIgKipwYXJlbnRfbmFtZXMsIHU4IG51bV9wYXJlbnRzLAogCQkJCXZvaWQgX19pb21lbSAqcmVnLCBzcGlubG9ja190ICpsb2NrLCB1MzIgaWR4LAotCQkJCXVuc2lnbmVkIGxvbmcgZmxleGdlbl9mbGFncykgeworCQkJCXVuc2lnbmVkIGxvbmcgZmxleGdlbl9mbGFncywgYm9vbCBtb2RlKSB7CiAJc3RydWN0IGZsZXhnZW4gKmZneGJhcjsKIAlzdHJ1Y3QgY2xrICpjbGs7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKQEAgLTIyNyw2ICsyNDYsMTMgQEAKIAlmZ3hiYXItPmZkaXYucmVnID0gZmRpdl9yZWc7CiAJZmd4YmFyLT5mZGl2LndpZHRoID0gNjsKIAorCS8qIEZpbmFsIGRpdmlkZXIgc3luYyBjb25maWcgKi8KKwlmZ3hiYXItPnN5bmMubG9jayA9IGxvY2s7CisJZmd4YmFyLT5zeW5jLnJlZyA9IGZkaXZfcmVnOworCWZneGJhci0+c3luYy5iaXRfaWR4ID0gNzsKKworCWZneGJhci0+Y29udHJvbF9tb2RlID0gbW9kZTsKKwogCWZneGJhci0+aHcuaW5pdCA9ICZpbml0OwogCiAJY2xrID0gY2xrX3JlZ2lzdGVyKE5VTEwsICZmZ3hiYXItPmh3KTsKQEAgLTI1OSw2ICsyODUsMjcgQEAKIAlyZXR1cm4gcGFyZW50czsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtnZW5fZGF0YSBjbGtnZW5fYXVkaW8gPSB7CisJLmZsYWdzID0gQ0xLX1NFVF9SQVRFX1BBUkVOVCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrZ2VuX2RhdGEgY2xrZ2VuX3ZpZGVvID0geworCS5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQsCisJLm1vZGUgPSAxLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZmxleGdlbl9vZl9tYXRjaFtdID0geworCXsKKwkJLmNvbXBhdGlibGUgPSAic3QsZmxleGdlbi1hdWRpbyIsCisJCS5kYXRhID0gJmNsa2dlbl9hdWRpbywKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAic3QsZmxleGdlbi12aWRlbyIsCisJCS5kYXRhID0gJmNsa2dlbl92aWRlbywKKwl9LAorCXt9Cit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgc3Rfb2ZfZmxleGdlbl9zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcG5vZGU7CkBAIC0yNjcsNyArMzE0LDExIEBACiAJY29uc3QgY2hhciAqKnBhcmVudHM7CiAJaW50IG51bV9wYXJlbnRzLCBpOwogCXNwaW5sb2NrX3QgKnJsb2NrID0gTlVMTDsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKKwlzdHJ1Y3QgY2xrZ2VuX2RhdGEgKmRhdGEgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxleF9mbGFncyA9IDA7CiAJaW50IHJldDsKKwlib29sIGNsa19tb2RlID0gMDsKIAogCXBub2RlID0gb2ZfZ2V0X3BhcmVudChucCk7CiAJaWYgKCFwbm9kZSkKQEAgLTI4MSw2ICszMzIsMTMgQEAKIAlpZiAoIXBhcmVudHMpCiAJCXJldHVybjsKIAorCW1hdGNoID0gb2ZfbWF0Y2hfbm9kZShmbGV4Z2VuX29mX21hdGNoLCBucCk7CisJaWYgKG1hdGNoKSB7CisJCWRhdGEgPSAoc3RydWN0IGNsa2dlbl9kYXRhICopbWF0Y2gtPmRhdGE7CisJCWZsZXhfZmxhZ3MgPSBkYXRhLT5mbGFnczsKKwkJY2xrX21vZGUgPSBkYXRhLT5tb2RlOworCX0KKwogCWNsa19kYXRhID0ga3phbGxvYyhzaXplb2YoKmNsa19kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjbGtfZGF0YSkKIAkJZ290byBlcnI7CkBAIC0zMDcsNyArMzY1LDYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgY2xrX2RhdGEtPmNsa19udW07IGkrKykgewogCQlzdHJ1Y3QgY2xrICpjbGs7CiAJCWNvbnN0IGNoYXIgKmNsa19uYW1lOwotCQl1bnNpZ25lZCBsb25nIGZsZXhfZmxhZ3MgPSAwOwogCiAJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleChucCwgImNsb2NrLW91dHB1dC1uYW1lcyIsCiAJCQkJCQkgIGksICZjbGtfbmFtZSkpIHsKQEAgLTMyMyw3ICszODAsNyBAQAogCQkJY29udGludWU7CiAKIAkJY2xrID0gY2xrX3JlZ2lzdGVyX2ZsZXhnZW4oY2xrX25hbWUsIHBhcmVudHMsIG51bV9wYXJlbnRzLAotCQkJCQkgICByZWcsIHJsb2NrLCBpLCBmbGV4X2ZsYWdzKTsKKwkJCQkJICAgcmVnLCBybG9jaywgaSwgZmxleF9mbGFncywgY2xrX21vZGUpOwogCiAJCWlmIChJU19FUlIoY2xrKSkKIAkJCWdvdG8gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3QvY2xrZ2VuLWZzeW4uYyBiL2RyaXZlcnMvY2xrL3N0L2Nsa2dlbi1mc3luLmMKaW5kZXggMDlhZmViOC4uMTQ4MTlkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvc3QvY2xrZ2VuLWZzeW4uYworKysgYi9kcml2ZXJzL2Nsay9zdC9jbGtnZW4tZnN5bi5jCkBAIC00Miw3OSArNDIsNiBAQAogCXVuc2lnbmVkIGxvbmcgbnNkaXY7CiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN0bV9mcyBmczIxNmM2NV9ydGJsW10gPSB7Ci0JeyAubWRpdiA9IDB4MWYsIC5wZSA9IDB4MCwJLnNkaXYgPSAweDcsCS5uc2RpdiA9IDAgfSwJLyogMzEyLjUgS2h6ICovCi0JeyAubWRpdiA9IDB4MTcsIC5wZSA9IDB4MjVlZCwJLnNkaXYgPSAweDEsCS5uc2RpdiA9IDAgfSwJLyogMjcgICAgTUh6ICovCi0JeyAubWRpdiA9IDB4MWEsIC5wZSA9IDB4N2IzNiwJLnNkaXYgPSAweDIsCS5uc2RpdiA9IDEgfSwJLyogMzYuODcgTUh6ICovCi0JeyAubWRpdiA9IDB4MTMsIC5wZSA9IDB4MCwJLnNkaXYgPSAweDIsCS5uc2RpdiA9IDEgfSwJLyogNDggICAgTUh6ICovCi0JeyAubWRpdiA9IDB4MTEsIC5wZSA9IDB4MWM3MiwJLnNkaXYgPSAweDEsCS5uc2RpdiA9IDEgfSwJLyogMTA4ICAgTUh6ICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN0bV9mcyBmczQzMmM2NV9ydGJsW10gPSB7Ci0JeyAubWRpdiA9IDB4MWYsIC5wZSA9IDB4MCwJLnNkaXYgPSAweDcsCS5uc2RpdiA9IDAgfSwJLyogNjI1ICAgICBLaHogKi8KLQl7IC5tZGl2ID0gMHgxMywgLnBlID0gMHg3NzdjLAkuc2RpdiA9IDB4NCwJLm5zZGl2ID0gMSB9LAkvKiAyNS4xNzUgIE1IeiAqLwotCXsgLm1kaXYgPSAweDE5LCAucGUgPSAweDRkMzUsCS5zZGl2ID0gMHgyLAkubnNkaXYgPSAwIH0sCS8qIDI1LjIwMCAgTUh6ICovCi0JeyAubWRpdiA9IDB4MTEsIC5wZSA9IDB4MWM3MiwJLnNkaXYgPSAweDQsCS5uc2RpdiA9IDEgfSwJLyogMjcuMDAwICBNSHogKi8KLQl7IC5tZGl2ID0gMHgxNywgLnBlID0gMHgyOGY1LAkuc2RpdiA9IDB4MiwJLm5zZGl2ID0gMCB9LAkvKiAyNy4wMjcgIE1IeiAqLwotCXsgLm1kaXYgPSAweDE2LCAucGUgPSAweDMzNTksCS5zZGl2ID0gMHgyLAkubnNkaXYgPSAwIH0sCS8qIDI4LjMyMCAgTUh6ICovCi0JeyAubWRpdiA9IDB4MWYsIC5wZSA9IDB4MjA4MywJLnNkaXYgPSAweDMsCS5uc2RpdiA9IDEgfSwJLyogMzAuMjQwICBNSHogKi8KLQl7IC5tZGl2ID0gMHgxZSwgLnBlID0gMHg0MzBkLAkuc2RpdiA9IDB4MywJLm5zZGl2ID0gMSB9LAkvKiAzMS41MDAgIE1IeiAqLwotCXsgLm1kaXYgPSAweDE3LCAucGUgPSAweDAsCS5zZGl2ID0gMHgzLAkubnNkaXYgPSAxIH0sCS8qIDQwLjAwMCAgTUh6ICovCi0JeyAubWRpdiA9IDB4MTksIC5wZSA9IDB4MTIxYSwJLnNkaXYgPSAweDEsCS5uc2RpdiA9IDAgfSwJLyogNDkuNTAwICBNSHogKi8KLQl7IC5tZGl2ID0gMHgxMywgLnBlID0gMHg2NjY3LAkuc2RpdiA9IDB4MywJLm5zZGl2ID0gMSB9LAkvKiA1MC4wMDAgIE1IeiAqLwotCXsgLm1kaXYgPSAweDEwLCAucGUgPSAweDFlZTYsCS5zZGl2ID0gMHgzLAkubnNkaXYgPSAxIH0sCS8qIDU3LjI4NCAgTUh6ICovCi0JeyAubWRpdiA9IDB4MWQsIC5wZSA9IDB4M2IxNCwJLnNkaXYgPSAweDIsCS5uc2RpdiA9IDEgfSwJLyogNjUuMDAwICBNSHogKi8KLQl7IC5tZGl2ID0gMHgxMiwgLnBlID0gMHg3YzY1LAkuc2RpdiA9IDB4MSwJLm5zZGl2ID0gMCB9LAkvKiA3MS4wMDAgIE1IeiAqLwotCXsgLm1kaXYgPSAweDE5LCAucGUgPSAweGVjZCwJLnNkaXYgPSAweDIsCS5uc2RpdiA9IDEgfSwJLyogNzQuMTc2ICBNSHogKi8KLQl7IC5tZGl2ID0gMHgxOSwgLnBlID0gMHgxMjFhLAkuc2RpdiA9IDB4MiwJLm5zZGl2ID0gMSB9LAkvKiA3NC4yNTAgIE1IeiAqLwotCXsgLm1kaXYgPSAweDE5LCAucGUgPSAweDMzMzQsCS5zZGl2ID0gMHgyLAkubnNkaXYgPSAxIH0sCS8qIDc1LjAwMCAgTUh6ICovCi0JeyAubWRpdiA9IDB4MTgsIC5wZSA9IDB4NTEzOCwJLnNkaXYgPSAweDIsCS5uc2RpdiA9IDEgfSwJLyogNzguODAwICBNSHogKi8KLQl7IC5tZGl2ID0gMHgxZCwgLnBlID0gMHg3N2QsCS5zZGl2ID0gMHgwLAkubnNkaXYgPSAwIH0sCS8qIDg1LjUwMCAgTUh6ICovCi0JeyAubWRpdiA9IDB4MWMsIC5wZSA9IDB4MTNkNSwJLnNkaXYgPSAweDAsCS5uc2RpdiA9IDAgfSwJLyogODguNzUwICBNSHogKi8KLQl7IC5tZGl2ID0gMHgxMSwgLnBlID0gMHgxYzcyLAkuc2RpdiA9IDB4MiwJLm5zZGl2ID0gMSB9LAkvKiAxMDguMDAwIE1IeiAqLwotCXsgLm1kaXYgPSAweDE3LCAucGUgPSAweDI4ZjUsCS5zZGl2ID0gMHgwLAkubnNkaXYgPSAwIH0sCS8qIDEwOC4xMDggTUh6ICovCi0JeyAubWRpdiA9IDB4MTAsIC5wZSA9IDB4NmUyNiwJLnNkaXYgPSAweDIsCS5uc2RpdiA9IDEgfSwJLyogMTE4Ljk2MyBNSHogKi8KLQl7IC5tZGl2ID0gMHgxNSwgLnBlID0gMHgzZTYzLAkuc2RpdiA9IDB4MCwJLm5zZGl2ID0gMCB9LAkvKiAxMTkuMDAwIE1IeiAqLwotCXsgLm1kaXYgPSAweDFjLCAucGUgPSAweDQ3MWQsCS5zZGl2ID0gMHgxLAkubnNkaXYgPSAxIH0sCS8qIDEzNS4wMDAgTUh6ICovCi0JeyAubWRpdiA9IDB4MTksIC5wZSA9IDB4ZWNkLAkuc2RpdiA9IDB4MSwJLm5zZGl2ID0gMSB9LAkvKiAxNDguMzUyIE1IeiAqLwotCXsgLm1kaXYgPSAweDE5LCAucGUgPSAweDEyMWEsCS5zZGl2ID0gMHgxLAkubnNkaXYgPSAxIH0sCS8qIDE0OC41MDAgTUh6ICovCi0JeyAubWRpdiA9IDB4MTksIC5wZSA9IDB4MTIxYSwJLnNkaXYgPSAweDAsCS5uc2RpdiA9IDEgfSwJLyogMjk3ICAgICBNSHogKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RtX2ZzIGZzNjYwYzMyX3J0YmxbXSA9IHsKLQl7IC5tZGl2ID0gMHgxNCwgLnBlID0gMHgzNzZiLAkuc2RpdiA9IDB4NCwJLm5zZGl2ID0gMSB9LAkvKiAyNS4xNzUgIE1IeiAqLwotCXsgLm1kaXYgPSAweDE0LCAucGUgPSAweDMwYzMsCS5zZGl2ID0gMHg0LAkubnNkaXYgPSAxIH0sCS8qIDI1LjIwMCAgTUh6ICovCi0JeyAubWRpdiA9IDB4MTAsIC5wZSA9IDB4NzFjNywJLnNkaXYgPSAweDQsCS5uc2RpdiA9IDEgfSwJLyogMjcuMDAwICBNSHogKi8KLQl7IC5tZGl2ID0gMHgwMCwgLnBlID0gMHg0N2FmLAkuc2RpdiA9IDB4MywJLm5zZGl2ID0gMCB9LAkvKiAyNy4wMjcgIE1IeiAqLwotCXsgLm1kaXYgPSAweDBlLCAucGUgPSAweDRlMWEsCS5zZGl2ID0gMHg0LAkubnNkaXYgPSAxIH0sCS8qIDI4LjMyMCAgTUh6ICovCi0JeyAubWRpdiA9IDB4MGIsIC5wZSA9IDB4NTM0ZCwJLnNkaXYgPSAweDQsCS5uc2RpdiA9IDEgfSwJLyogMzAuMjQwICBNSHogKi8KLQl7IC5tZGl2ID0gMHgxNywgLnBlID0gMHg2ZmJmLAkuc2RpdiA9IDB4MiwJLm5zZGl2ID0gMCB9LAkvKiAzMS41MDAgIE1IeiAqLwotCXsgLm1kaXYgPSAweDAxLCAucGUgPSAweDAsCS5zZGl2ID0gMHg0LAkubnNkaXYgPSAxIH0sCS8qIDQwLjAwMCAgTUh6ICovCi0JeyAubWRpdiA9IDB4MTUsIC5wZSA9IDB4MmFhYiwJLnNkaXYgPSAweDMsCS5uc2RpdiA9IDEgfSwJLyogNDkuNTAwICBNSHogKi8KLQl7IC5tZGl2ID0gMHgxNCwgLnBlID0gMHg2NjY2LAkuc2RpdiA9IDB4MywJLm5zZGl2ID0gMSB9LAkvKiA1MC4wMDAgIE1IeiAqLwotCXsgLm1kaXYgPSAweDFkLCAucGUgPSAweDM5NWYsCS5zZGl2ID0gMHgxLAkubnNkaXYgPSAwIH0sCS8qIDU3LjI4NCAgTUh6ICovCi0JeyAubWRpdiA9IDB4MDgsIC5wZSA9IDB4NGVjNSwJLnNkaXYgPSAweDMsCS5uc2RpdiA9IDEgfSwJLyogNjUuMDAwICBNSHogKi8KLQl7IC5tZGl2ID0gMHgwNSwgLnBlID0gMHgxNzcwLAkuc2RpdiA9IDB4MywJLm5zZGl2ID0gMSB9LAkvKiA3MS4wMDAgIE1IeiAqLwotCXsgLm1kaXYgPSAweDAzLCAucGUgPSAweDRiYTcsCS5zZGl2ID0gMHgzLAkubnNkaXYgPSAxIH0sCS8qIDc0LjE3NiAgTUh6ICovCi0JeyAubWRpdiA9IDB4MGYsIC5wZSA9IDB4MzQyNiwJLnNkaXYgPSAweDEsCS5uc2RpdiA9IDAgfSwJLyogNzQuMjUwICBNSHogKi8KLQl7IC5tZGl2ID0gMHgwZSwgLnBlID0gMHg3Nzc3LAkuc2RpdiA9IDB4MSwJLm5zZGl2ID0gMCB9LAkvKiA3NS4wMDAgIE1IeiAqLwotCXsgLm1kaXYgPSAweDAxLCAucGUgPSAweDQwNTMsCS5zZGl2ID0gMHgzLAkubnNkaXYgPSAxIH0sCS8qIDc4LjgwMCAgTUh6ICovCi0JeyAubWRpdiA9IDB4MDksIC5wZSA9IDB4MTViNSwJLnNkaXYgPSAweDEsCS5uc2RpdiA9IDAgfSwJLyogODUuNTAwICBNSHogKi8KLQl7IC5tZGl2ID0gMHgxYiwgLnBlID0gMHgzZjE5LAkuc2RpdiA9IDB4MiwJLm5zZGl2ID0gMSB9LAkvKiA4OC43NTAgIE1IeiAqLwotCXsgLm1kaXYgPSAweDEwLCAucGUgPSAweDcxYzcsCS5zZGl2ID0gMHgyLAkubnNkaXYgPSAxIH0sCS8qIDEwOC4wMDAgTUh6ICovCi0JeyAubWRpdiA9IDB4MDAsIC5wZSA9IDB4NDdhZiwJLnNkaXYgPSAweDEsCS5uc2RpdiA9IDAgfSwJLyogMTA4LjEwOCBNSHogKi8KLQl7IC5tZGl2ID0gMHgwYywgLnBlID0gMHgzMTE4LAkuc2RpdiA9IDB4MiwJLm5zZGl2ID0gMSB9LAkvKiAxMTguOTYzIE1IeiAqLwotCXsgLm1kaXYgPSAweDBjLCAucGUgPSAweDJmNTQsCS5zZGl2ID0gMHgyLAkubnNkaXYgPSAxIH0sCS8qIDExOS4wMDAgTUh6ICovCi0JeyAubWRpdiA9IDB4MDcsIC5wZSA9IDB4ZTM5LAkuc2RpdiA9IDB4MiwJLm5zZGl2ID0gMSB9LAkvKiAxMzUuMDAwIE1IeiAqLwotCXsgLm1kaXYgPSAweDAzLCAucGUgPSAweDRiYTcsCS5zZGl2ID0gMHgyLAkubnNkaXYgPSAxIH0sCS8qIDE0OC4zNTIgTUh6ICovCi0JeyAubWRpdiA9IDB4MGYsIC5wZSA9IDB4MzQyNiwJLnNkaXYgPSAweDAsCS5uc2RpdiA9IDAgfSwJLyogMTQ4LjUwMCBNSHogKi8KLQl7IC5tZGl2ID0gMHgwMywgLnBlID0gMHg0YmE3LAkuc2RpdiA9IDB4MSwJLm5zZGl2ID0gMSB9LAkvKiAyOTYuNzA0IE1IeiAqLwotCXsgLm1kaXYgPSAweDAzLCAucGUgPSAweDQ3MWMsCS5zZGl2ID0gMHgxLAkubnNkaXYgPSAxIH0sCS8qIDI5Ny4wMDAgTUh6ICovCi0JeyAubWRpdiA9IDB4MDAsIC5wZSA9IDB4Mjk1ZiwJLnNkaXYgPSAweDEsCS5uc2RpdiA9IDEgfSwJLyogMzI2LjcwMCBNSHogKi8KLQl7IC5tZGl2ID0gMHgxZiwgLnBlID0gMHgzNjMzLAkuc2RpdiA9IDB4MCwJLm5zZGl2ID0gMSB9LAkvKiAzMzMuMDAwIE1IeiAqLwotCXsgLm1kaXYgPSAweDFjLCAucGUgPSAweDAsCS5zZGl2ID0gMHgwLAkubnNkaXYgPSAxIH0sCS8qIDM1Mi4wMDAgTWh6ICovCi19OwotCiBzdHJ1Y3QgY2xrZ2VuX3F1YWRmc19kYXRhIHsKIAlib29sIHJlc2V0X3ByZXNlbnQ7CiAJYm9vbCBid2ZpbHRlcl9wcmVzZW50OwpAQCAtMTM4LDE3NCArNjUsMTggQEAKIAlzdHJ1Y3QgY2xrZ2VuX2ZpZWxkIG5zZGl2W1FVQURGU19NQVhfQ0hBTl07CiAKIAljb25zdCBzdHJ1Y3QgY2xrX29wcyAqcGxsX29wczsKLQljb25zdCBzdHJ1Y3Qgc3RtX2ZzICpydGJsOwotCXU4IHJ0YmxfY250OworCWludCAgKCpnZXRfcGFyYW1zKSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBzdHJ1Y3Qgc3RtX2ZzICopOwogCWludCAgKCpnZXRfcmF0ZSkodW5zaWduZWQgbG9uZyAsIGNvbnN0IHN0cnVjdCBzdG1fZnMgKiwKIAkJCXVuc2lnbmVkIGxvbmcgKik7CiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgc3RfcXVhZGZzX3BsbF9jNjVfb3BzOwogc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIHN0X3F1YWRmc19wbGxfYzMyX29wczsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBzdF9xdWFkZnNfZnMyMTZjNjVfb3BzOwotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIHN0X3F1YWRmc19mczQzMmM2NV9vcHM7CiBzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgc3RfcXVhZGZzX2ZzNjYwYzMyX29wczsKIAotc3RhdGljIGludCBjbGtfZnMyMTZjNjVfZ2V0X3JhdGUodW5zaWduZWQgbG9uZywgY29uc3Qgc3RydWN0IHN0bV9mcyAqLAotCQl1bnNpZ25lZCBsb25nICopOwotc3RhdGljIGludCBjbGtfZnM0MzJjNjVfZ2V0X3JhdGUodW5zaWduZWQgbG9uZywgY29uc3Qgc3RydWN0IHN0bV9mcyAqLAotCQl1bnNpZ25lZCBsb25nICopOworc3RhdGljIGludCBjbGtfZnM2NjBjMzJfZGlnX2dldF9wYXJhbXModW5zaWduZWQgbG9uZyBpbnB1dCwKKwkJdW5zaWduZWQgbG9uZyBvdXRwdXQsIHN0cnVjdCBzdG1fZnMgKmZzKTsKIHN0YXRpYyBpbnQgY2xrX2ZzNjYwYzMyX2RpZ19nZXRfcmF0ZSh1bnNpZ25lZCBsb25nLCBjb25zdCBzdHJ1Y3Qgc3RtX2ZzICosCiAJCXVuc2lnbmVkIGxvbmcgKik7Ci0vKgotICogVmFsdWVzIGZvciBhbGwgb2YgdGhlIHN0YW5kYWxvbmUgaW5zdGFuY2VzIG9mIHRoaXMgY2xvY2sKLSAqIGdlbmVyYXRvciBmb3VuZCBpbiBTVGlINDE1IGFuZCBTVGlINDE2IFNZU0NGRyByZWdpc3RlciBiYW5rcy4gTm90ZQotICogdGhhdCB0aGUgaW5kaXZpZHVhbCBjaGFubmVsIHN0YW5kYnkgY29udHJvbCBiaXRzIChuc2IpIGFyZSBpbiB0aGUKLSAqIGZpcnN0IHJlZ2lzdGVyIGFsb25nIHdpdGggdGhlIFBMTCBjb250cm9sIGJpdHMuCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrZ2VuX3F1YWRmc19kYXRhIHN0X2ZzMjE2YzY1XzQxNiA9IHsKLQkvKiA0MTYgc3BlY2lmaWMgKi8KLQkubnBkYQk9IENMS0dFTl9GSUVMRCgweDAsIDB4MSwgMTQpLAotCS5uc2IJPSB7IENMS0dFTl9GSUVMRCgweDAsIDB4MSwgMTApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MCwgMHgxLCAxMSksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgwLCAweDEsIDEyKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDAsIDB4MSwgMTMpIH0sCi0JLm5zZGl2X3ByZXNlbnQgPSB0cnVlLAotCS5uc2Rpdgk9IHsgQ0xLR0VOX0ZJRUxEKDB4MCwgMHgxLCAxOCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgwLCAweDEsIDE5KSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDAsIDB4MSwgMjApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MCwgMHgxLCAyMSkgfSwKLQkubWRpdgk9IHsgQ0xLR0VOX0ZJRUxEKDB4NCwgMHgxZiwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgxNCwgMHgxZiwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgyNCwgMHgxZiwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgzNCwgMHgxZiwgMCkgfSwKLQkuZW4JPSB7IENMS0dFTl9GSUVMRCgweDEwLCAweDEsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MjAsIDB4MSwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgzMCwgMHgxLCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDQwLCAweDEsIDApIH0sCi0JLm5kaXYJPSBDTEtHRU5fRklFTEQoMHgwLCAweDEsIDE1KSwKLQkuYndmaWx0ZXJfcHJlc2VudCA9IHRydWUsCi0JLnJlZl9idyA9IENMS0dFTl9GSUVMRCgweDAsIDB4MywgMTYpLAotCS5wZQk9IHsgQ0xLR0VOX0ZJRUxEKDB4OCwgMHhmZmZmLCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDE4LCAweGZmZmYsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MjgsIDB4ZmZmZiwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgzOCwgMHhmZmZmLCAwKSB9LAotCS5zZGl2CT0geyBDTEtHRU5fRklFTEQoMHhDLCAweDcsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MUMsIDB4NywgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgyQywgMHg3LCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDNDLCAweDcsIDApIH0sCi0JLnBsbF9vcHMJPSAmc3RfcXVhZGZzX3BsbF9jNjVfb3BzLAotCS5ydGJsCQk9IGZzMjE2YzY1X3J0YmwsCi0JLnJ0YmxfY250CT0gQVJSQVlfU0laRShmczIxNmM2NV9ydGJsKSwKLQkuZ2V0X3JhdGUJPSBjbGtfZnMyMTZjNjVfZ2V0X3JhdGUsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa2dlbl9xdWFkZnNfZGF0YSBzdF9mczQzMmM2NV80MTYgPSB7Ci0JLm5wZGEJPSBDTEtHRU5fRklFTEQoMHgwLCAweDEsIDE0KSwKLQkubnNiCT0geyBDTEtHRU5fRklFTEQoMHgwLCAweDEsIDEwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDAsIDB4MSwgMTEpLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MCwgMHgxLCAxMiksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgwLCAweDEsIDEzKSB9LAotCS5uc2Rpdl9wcmVzZW50ID0gdHJ1ZSwKLQkubnNkaXYJPSB7IENMS0dFTl9GSUVMRCgweDAsIDB4MSwgMTgpLAotCQkgICBDTEtHRU5fRklFTEQoMHgwLCAweDEsIDE5KSwKLQkJICAgQ0xLR0VOX0ZJRUxEKDB4MCwgMHgxLCAyMCksCi0JCSAgIENMS0dFTl9GSUVMRCgweDAsIDB4MSwgMjEpIH0sCi0JLm1kaXYJPSB7IENMS0dFTl9GSUVMRCgweDQsIDB4MWYsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MTQsIDB4MWYsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MjQsIDB4MWYsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MzQsIDB4MWYsIDApIH0sCi0JLmVuCT0geyBDTEtHRU5fRklFTEQoMHgxMCwgMHgxLCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDIwLCAweDEsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MzAsIDB4MSwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHg0MCwgMHgxLCAwKSB9LAotCS5uZGl2CT0gQ0xLR0VOX0ZJRUxEKDB4MCwgMHgxLCAxNSksCi0JLmJ3ZmlsdGVyX3ByZXNlbnQgPSB0cnVlLAotCS5yZWZfYncgPSBDTEtHRU5fRklFTEQoMHgwLCAweDMsIDE2KSwKLQkucGUJPSB7IENMS0dFTl9GSUVMRCgweDgsIDB4ZmZmZiwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgxOCwgMHhmZmZmLCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDI4LCAweGZmZmYsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MzgsIDB4ZmZmZiwgMCkgfSwKLQkuc2Rpdgk9IHsgQ0xLR0VOX0ZJRUxEKDB4QywgMHg3LCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDFDLCAweDcsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MkMsIDB4NywgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgzQywgMHg3LCAwKSB9LAotCS5wbGxfb3BzCT0gJnN0X3F1YWRmc19wbGxfYzY1X29wcywKLQkucnRibAkJPSBmczQzMmM2NV9ydGJsLAotCS5ydGJsX2NudAk9IEFSUkFZX1NJWkUoZnM0MzJjNjVfcnRibCksCi0JLmdldF9yYXRlCT0gY2xrX2ZzNDMyYzY1X2dldF9yYXRlLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtnZW5fcXVhZGZzX2RhdGEgc3RfZnM2NjBjMzJfRV80MTYgPSB7Ci0JLm5wZGEJPSBDTEtHRU5fRklFTEQoMHgwLCAweDEsIDE0KSwKLQkubnNiCT0geyBDTEtHRU5fRklFTEQoMHgwLCAweDEsIDEwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDAsIDB4MSwgMTEpLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MCwgMHgxLCAxMiksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgwLCAweDEsIDEzKSB9LAotCS5uc2Rpdl9wcmVzZW50ID0gdHJ1ZSwKLQkubnNkaXYJPSB7IENMS0dFTl9GSUVMRCgweDAsIDB4MSwgMTgpLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MCwgMHgxLCAxOSksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgwLCAweDEsIDIwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDAsIDB4MSwgMjEpIH0sCi0JLm1kaXYJPSB7IENMS0dFTl9GSUVMRCgweDQsIDB4MWYsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MTQsIDB4MWYsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MjQsIDB4MWYsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MzQsIDB4MWYsIDApIH0sCi0JLmVuCT0geyBDTEtHRU5fRklFTEQoMHgxMCwgMHgxLCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDIwLCAweDEsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MzAsIDB4MSwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHg0MCwgMHgxLCAwKSB9LAotCS5uZGl2CT0gQ0xLR0VOX0ZJRUxEKDB4MCwgMHg3LCAxNSksCi0JLnBlCT0geyBDTEtHRU5fRklFTEQoMHg4LCAweDdmZmYsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MTgsIDB4N2ZmZiwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgyOCwgMHg3ZmZmLCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDM4LCAweDdmZmYsIDApIH0sCi0JLnNkaXYJPSB7IENMS0dFTl9GSUVMRCgweEMsIDB4ZiwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgxQywgMHhmLCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDJDLCAweGYsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4M0MsIDB4ZiwgMCkgfSwKLQkubG9ja3N0YXR1c19wcmVzZW50ID0gdHJ1ZSwKLQkubG9ja19zdGF0dXMgPSBDTEtHRU5fRklFTEQoMHhBQywgMHgxLCAwKSwKLQkucGxsX29wcwk9ICZzdF9xdWFkZnNfcGxsX2MzMl9vcHMsCi0JLnJ0YmwJCT0gZnM2NjBjMzJfcnRibCwKLQkucnRibF9jbnQJPSBBUlJBWV9TSVpFKGZzNjYwYzMyX3J0YmwpLAotCS5nZXRfcmF0ZQk9IGNsa19mczY2MGMzMl9kaWdfZ2V0X3JhdGUsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa2dlbl9xdWFkZnNfZGF0YSBzdF9mczY2MGMzMl9GXzQxNiA9IHsKLQkubnBkYQk9IENMS0dFTl9GSUVMRCgweDAsIDB4MSwgMTQpLAotCS5uc2IJPSB7IENMS0dFTl9GSUVMRCgweDAsIDB4MSwgMTApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MCwgMHgxLCAxMSksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgwLCAweDEsIDEyKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDAsIDB4MSwgMTMpIH0sCi0JLm5zZGl2X3ByZXNlbnQgPSB0cnVlLAotCS5uc2Rpdgk9IHsgQ0xLR0VOX0ZJRUxEKDB4MCwgMHgxLCAxOCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgwLCAweDEsIDE5KSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDAsIDB4MSwgMjApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MCwgMHgxLCAyMSkgfSwKLQkubWRpdgk9IHsgQ0xLR0VOX0ZJRUxEKDB4NCwgMHgxZiwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgxNCwgMHgxZiwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgyNCwgMHgxZiwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgzNCwgMHgxZiwgMCkgfSwKLQkuZW4JPSB7IENMS0dFTl9GSUVMRCgweDEwLCAweDEsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MjAsIDB4MSwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgzMCwgMHgxLCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDQwLCAweDEsIDApIH0sCi0JLm5kaXYJPSBDTEtHRU5fRklFTEQoMHgwLCAweDcsIDE1KSwKLQkucGUJPSB7IENMS0dFTl9GSUVMRCgweDgsIDB4N2ZmZiwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgxOCwgMHg3ZmZmLCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDI4LCAweDdmZmYsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MzgsIDB4N2ZmZiwgMCkgfSwKLQkuc2Rpdgk9IHsgQ0xLR0VOX0ZJRUxEKDB4QywgMHhmLCAwKSwKLQkJICAgIENMS0dFTl9GSUVMRCgweDFDLCAweGYsIDApLAotCQkgICAgQ0xLR0VOX0ZJRUxEKDB4MkMsIDB4ZiwgMCksCi0JCSAgICBDTEtHRU5fRklFTEQoMHgzQywgMHhmLCAwKSB9LAotCS5sb2Nrc3RhdHVzX3ByZXNlbnQgPSB0cnVlLAotCS5sb2NrX3N0YXR1cyA9IENMS0dFTl9GSUVMRCgweEVDLCAweDEsIDApLAotCS5wbGxfb3BzCT0gJnN0X3F1YWRmc19wbGxfYzMyX29wcywKLQkucnRibAkJPSBmczY2MGMzMl9ydGJsLAotCS5ydGJsX2NudAk9IEFSUkFZX1NJWkUoZnM2NjBjMzJfcnRibCksCi0JLmdldF9yYXRlCT0gY2xrX2ZzNjYwYzMyX2RpZ19nZXRfcmF0ZSwKLX07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrZ2VuX3F1YWRmc19kYXRhIHN0X2ZzNjYwYzMyX0MgPSB7CiAJLm5yc3RfcHJlc2VudCA9IHRydWUsCkBAIC0zNDUsOCArMTE2LDcgQEAKIAkucG93ZXJ1cF9wb2xhcml0eSA9IDEsCiAJLnN0YW5kYnlfcG9sYXJpdHkgPSAxLAogCS5wbGxfb3BzCT0gJnN0X3F1YWRmc19wbGxfYzMyX29wcywKLQkucnRibAkJPSBmczY2MGMzMl9ydGJsLAotCS5ydGJsX2NudAk9IEFSUkFZX1NJWkUoZnM2NjBjMzJfcnRibCksCisJLmdldF9wYXJhbXMJPSBjbGtfZnM2NjBjMzJfZGlnX2dldF9wYXJhbXMsCiAJLmdldF9yYXRlCT0gY2xrX2ZzNjYwYzMyX2RpZ19nZXRfcmF0ZSwKIH07CiAKQEAgLTM4OCw4ICsxNTgsNyBAQAogCS5wb3dlcnVwX3BvbGFyaXR5ID0gMSwKIAkuc3RhbmRieV9wb2xhcml0eSA9IDEsCiAJLnBsbF9vcHMJPSAmc3RfcXVhZGZzX3BsbF9jMzJfb3BzLAotCS5ydGJsCQk9IGZzNjYwYzMyX3J0YmwsCi0JLnJ0YmxfY250CT0gQVJSQVlfU0laRShmczY2MGMzMl9ydGJsKSwKKwkuZ2V0X3BhcmFtcwk9IGNsa19mczY2MGMzMl9kaWdfZ2V0X3BhcmFtcywKIAkuZ2V0X3JhdGUJPSBjbGtfZnM2NjBjMzJfZGlnX2dldF9yYXRlLH07CiAKIC8qKgpAQCAtNjA1LDEyICszNzQsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgc3RfcXVhZGZzX3BsbF9jNjVfb3BzID0gewotCS5lbmFibGUJCT0gcXVhZGZzX3BsbF9lbmFibGUsCi0JLmRpc2FibGUJPSBxdWFkZnNfcGxsX2Rpc2FibGUsCi0JLmlzX2VuYWJsZWQJPSBxdWFkZnNfcGxsX2lzX2VuYWJsZWQsCi19OwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgc3RfcXVhZGZzX3BsbF9jMzJfb3BzID0gewogCS5lbmFibGUJCT0gcXVhZGZzX3BsbF9lbmFibGUsCiAJLmRpc2FibGUJPSBxdWFkZnNfcGxsX2Rpc2FibGUsCkBAIC03OTcsNDggKzU2MCw2IEBACiAJcmV0dXJuIGZzLT5kYXRhLT5zdGFuZGJ5X3BvbGFyaXR5ID8gIW5zYiA6ICEhbnNiOwogfQogCi0jZGVmaW5lIFAxNQkJCSh1aW50NjRfdCkoMSA8PCAxNSkKLQotc3RhdGljIGludCBjbGtfZnMyMTZjNjVfZ2V0X3JhdGUodW5zaWduZWQgbG9uZyBpbnB1dCwgY29uc3Qgc3RydWN0IHN0bV9mcyAqZnMsCi0JCXVuc2lnbmVkIGxvbmcgKnJhdGUpCi17Ci0JdWludDY0X3QgcmVzOwotCXVuc2lnbmVkIGxvbmcgbnM7Ci0JdW5zaWduZWQgbG9uZyBuZCA9IDg7IC8qIG5kaXYgc3R1Y2sgYXQgMCA9PiB2YWwgPSA4ICovCi0JdW5zaWduZWQgbG9uZyBzOwotCWxvbmcgbTsKLQotCW0gPSBmcy0+bWRpdiAtIDMyOwotCXMgPSAxIDw8IChmcy0+c2RpdiArIDEpOwotCW5zID0gKGZzLT5uc2RpdiA/IDEgOiAzKTsKLQotCXJlcyA9ICh1aW50NjRfdCkocyAqIG5zICogUDE1ICogKHVpbnQ2NF90KShtICsgMzMpKTsKLQlyZXMgPSByZXMgLSAocyAqIG5zICogZnMtPnBlKTsKLQkqcmF0ZSA9IGRpdjY0X3U2NChQMTUgKiBuZCAqIGlucHV0ICogMzIsIHJlcyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjbGtfZnM0MzJjNjVfZ2V0X3JhdGUodW5zaWduZWQgbG9uZyBpbnB1dCwgY29uc3Qgc3RydWN0IHN0bV9mcyAqZnMsCi0JCXVuc2lnbmVkIGxvbmcgKnJhdGUpCi17Ci0JdWludDY0X3QgcmVzOwotCXVuc2lnbmVkIGxvbmcgbmQgPSAxNjsgLyogbmRpdiB2YWx1ZTsgc3R1Y2sgYXQgMCAoMzBNaHogaW5wdXQpICovCi0JbG9uZyBtOwotCXVuc2lnbmVkIGxvbmcgc2Q7Ci0JdW5zaWduZWQgbG9uZyBuczsKLQotCW0gPSBmcy0+bWRpdiAtIDMyOwotCXNkID0gMSA8PCAoZnMtPnNkaXYgKyAxKTsKLQlucyA9IChmcy0+bnNkaXYgPyAxIDogMyk7Ci0KLQlyZXMgPSAodWludDY0X3QpKHNkICogbnMgKiBQMTUgKiAodWludDY0X3QpKG0gKyAzMykpOwotCXJlcyA9IHJlcyAtIChzZCAqIG5zICogZnMtPnBlKTsKLQkqcmF0ZSA9IGRpdjY0X3U2NChQMTUgKiBuZCAqIGlucHV0ICogMzIsIHJlcyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogI2RlZmluZSBQMjAJCSh1aW50NjRfdCkoMSA8PCAyMCkKIAogc3RhdGljIGludCBjbGtfZnM2NjBjMzJfZGlnX2dldF9yYXRlKHVuc2lnbmVkIGxvbmcgaW5wdXQsCkBAIC04NjQsNiArNTg1LDEwNyBAQAogCXJldHVybiAwOwogfQogCisKK3N0YXRpYyBpbnQgY2xrX2ZzNjYwYzMyX2dldF9wZShpbnQgbSwgaW50IHNpLCB1bnNpZ25lZCBsb25nICpkZXZpYXRpb24sCisJCXNpZ25lZCBsb25nIGlucHV0LCB1bnNpZ25lZCBsb25nIG91dHB1dCwgdWludDY0X3QgKnAsCisJCXN0cnVjdCBzdG1fZnMgKmZzKQoreworCXVuc2lnbmVkIGxvbmcgbmV3X2ZyZXEsIG5ld19kZXZpYXRpb247CisJc3RydWN0IHN0bV9mcyBmc190bXA7CisJdWludDY0X3QgdmFsOworCisJdmFsID0gKHVpbnQ2NF90KW91dHB1dCA8PCBzaTsKKworCSpwID0gKHVpbnQ2NF90KWlucHV0ICogUDIwIC0gKDMyTEwgICsgKHVpbnQ2NF90KW0pICogdmFsICogKFAyMCAvIDMyTEwpOworCisJKnAgPSBkaXY2NF91NjQoKnAsIHZhbCk7CisKKwlpZiAoKnAgPiAzMjc2N0xMKQorCQlyZXR1cm4gMTsKKworCWZzX3RtcC5tZGl2ID0gKHVuc2lnbmVkIGxvbmcpIG07CisJZnNfdG1wLnBlID0gKHVuc2lnbmVkIGxvbmcpKnA7CisJZnNfdG1wLnNkaXYgPSBzaTsKKwlmc190bXAubnNkaXYgPSAxOworCisJY2xrX2ZzNjYwYzMyX2RpZ19nZXRfcmF0ZShpbnB1dCwgJmZzX3RtcCwgJm5ld19mcmVxKTsKKworCW5ld19kZXZpYXRpb24gPSBhYnMob3V0cHV0IC0gbmV3X2ZyZXEpOworCisJaWYgKG5ld19kZXZpYXRpb24gPCAqZGV2aWF0aW9uKSB7CisJCWZzLT5tZGl2ID0gbTsKKwkJZnMtPnBlID0gKHVuc2lnbmVkIGxvbmcpKnA7CisJCWZzLT5zZGl2ID0gc2k7CisJCWZzLT5uc2RpdiA9IDE7CisJCSpkZXZpYXRpb24gPSBuZXdfZGV2aWF0aW9uOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjbGtfZnM2NjBjMzJfZGlnX2dldF9wYXJhbXModW5zaWduZWQgbG9uZyBpbnB1dCwKKwkJdW5zaWduZWQgbG9uZyBvdXRwdXQsIHN0cnVjdCBzdG1fZnMgKmZzKQoreworCWludCBzaTsJLyogc2Rpdl9yZWcgKDggZG93bnRvIDApICovCisJaW50IG07IC8qIG1kIHZhbHVlICovCisJdW5zaWduZWQgbG9uZyBuZXdfZnJlcSwgbmV3X2RldmlhdGlvbjsKKwkvKiBpbml0aWFsIGNvbmRpdGlvbiB0byBzYXk6ICJpbmZpbml0ZSBkZXZpYXRpb24iICovCisJdW5zaWduZWQgbG9uZyBkZXZpYXRpb24gPSB+MDsKKwl1aW50NjRfdCBwLCBwMSwgcDI7CS8qIHBlIHZhbHVlICovCisJaW50IHIxLCByMjsKKworCXN0cnVjdCBzdG1fZnMgZnNfdG1wOworCisJZm9yIChzaSA9IDA7IChzaSA8PSA4KSAmJiBkZXZpYXRpb247IHNpKyspIHsKKworCQkvKiBCb3VuZGFyeSB0ZXN0IHRvIGF2b2lkIHVzZWxlc3MgaXRlcmF0aW9uICovCisJCXIxID0gY2xrX2ZzNjYwYzMyX2dldF9wZSgwLCBzaSwgJmRldmlhdGlvbiwKKwkJCQlpbnB1dCwgb3V0cHV0LCAmcDEsIGZzKTsKKwkJcjIgPSBjbGtfZnM2NjBjMzJfZ2V0X3BlKDMxLCBzaSwgJmRldmlhdGlvbiwKKwkJCQlpbnB1dCwgb3V0cHV0LCAmcDIsIGZzKTsKKworCQkvKiBObyBzb2x1dGlvbiAqLworCQlpZiAocjEgJiYgcjIgJiYgKHAxID4gcDIpKQorCQkJY29udGludWU7CisKKwkJLyogVHJ5IHRvIGZpbmQgYmVzdCBkZXZpYXRpb24gKi8KKwkJZm9yIChtID0gMTsgKG0gPCAzMSkgJiYgZGV2aWF0aW9uOyBtKyspCisJCQljbGtfZnM2NjBjMzJfZ2V0X3BlKG0sIHNpLCAmZGV2aWF0aW9uLAorCQkJCQlpbnB1dCwgb3V0cHV0LCAmcCwgZnMpOworCisJfQorCisJaWYgKGRldmlhdGlvbiA9PSB+MCkgLyogTm8gc29sdXRpb24gZm91bmQgKi8KKwkJcmV0dXJuIC0xOworCisJLyogcGUgZmluZSB0dW5pbmcgaWYgZGV2aWF0aW9uIG5vdCAwOiArLy0gMiBhcm91bmQgY29tcHV0ZWQgcGUgdmFsdWUgKi8KKwlpZiAoZGV2aWF0aW9uKSB7CisJCWZzX3RtcC5tZGl2ID0gZnMtPm1kaXY7CisJCWZzX3RtcC5zZGl2ID0gZnMtPnNkaXY7CisJCWZzX3RtcC5uc2RpdiA9IGZzLT5uc2RpdjsKKworCQlpZiAoZnMtPnBlID4gMikKKwkJCXAyID0gZnMtPnBlIC0gMjsKKwkJZWxzZQorCQkJcDIgPSAwOworCisJCWZvciAoOyBwMiA8IDMyNzY4bGwgJiYgKHAyIDw9IChmcy0+cGUgKyAyKSk7IHAyKyspIHsKKwkJCWZzX3RtcC5wZSA9ICh1bnNpZ25lZCBsb25nKXAyOworCisJCQljbGtfZnM2NjBjMzJfZGlnX2dldF9yYXRlKGlucHV0LCAmZnNfdG1wLCAmbmV3X2ZyZXEpOworCisJCQluZXdfZGV2aWF0aW9uID0gYWJzKG91dHB1dCAtIG5ld19mcmVxKTsKKworCQkJLyogQ2hlY2sgaWYgdGhpcyBpcyBhIGJldHRlciBzb2x1dGlvbiAqLworCQkJaWYgKG5ld19kZXZpYXRpb24gPCBkZXZpYXRpb24pIHsKKwkJCQlmcy0+cGUgPSAodW5zaWduZWQgbG9uZylwMjsKKwkJCQlkZXZpYXRpb24gPSBuZXdfZGV2aWF0aW9uOworCisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgcXVhZGZzX2ZzeW50X2dldF9od192YWx1ZV9mb3JfcmVjYWxjKHN0cnVjdCBzdF9jbGtfcXVhZGZzX2ZzeW50aCAqZnMsCiAJCXN0cnVjdCBzdG1fZnMgKnBhcmFtcykKIHsKQEAgLTg5OSwzOCArNzIxLDE0IEBACiAJc3RydWN0IHN0X2Nsa19xdWFkZnNfZnN5bnRoICpmcyA9IHRvX3F1YWRmc19mc3ludGgoaHcpOwogCWludCAoKmNsa19mc19nZXRfcmF0ZSkodW5zaWduZWQgbG9uZyAsCiAJCQkJY29uc3Qgc3RydWN0IHN0bV9mcyAqLCB1bnNpZ25lZCBsb25nICopOwotCXN0cnVjdCBzdG1fZnMgcHJldl9wYXJhbXM7Ci0JdW5zaWduZWQgbG9uZyBwcmV2X3JhdGUsIHJhdGUgPSAwOwotCXVuc2lnbmVkIGxvbmcgZGlmZl9yYXRlLCBwcmV2X2RpZmZfcmF0ZSA9IH4wOwotCWludCBpbmRleDsKKwlpbnQgKCpjbGtfZnNfZ2V0X3BhcmFtcykodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgc3RydWN0IHN0bV9mcyAqKTsKKwl1bnNpZ25lZCBsb25nIHJhdGUgPSAwOwogCiAJY2xrX2ZzX2dldF9yYXRlID0gZnMtPmRhdGEtPmdldF9yYXRlOworCWNsa19mc19nZXRfcGFyYW1zID0gZnMtPmRhdGEtPmdldF9wYXJhbXM7CiAKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBmcy0+ZGF0YS0+cnRibF9jbnQ7IGluZGV4KyspIHsKLQkJcHJldl9yYXRlID0gcmF0ZTsKLQotCQkqcGFyYW1zID0gZnMtPmRhdGEtPnJ0YmxbaW5kZXhdOwotCQlwcmV2X3BhcmFtcyA9ICpwYXJhbXM7Ci0KLQkJY2xrX2ZzX2dldF9yYXRlKHByYXRlLCAmZnMtPmRhdGEtPnJ0YmxbaW5kZXhdLCAmcmF0ZSk7Ci0KLQkJZGlmZl9yYXRlID0gYWJzKGRyYXRlIC0gcmF0ZSk7Ci0KLQkJaWYgKGRpZmZfcmF0ZSA+IHByZXZfZGlmZl9yYXRlKSB7Ci0JCQlyYXRlID0gcHJldl9yYXRlOwotCQkJKnBhcmFtcyA9IHByZXZfcGFyYW1zOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlwcmV2X2RpZmZfcmF0ZSA9IGRpZmZfcmF0ZTsKLQotCQlpZiAoZHJhdGUgPT0gcmF0ZSkKLQkJCXJldHVybiByYXRlOwotCX0KLQotCi0JaWYgKGluZGV4ID09IGZzLT5kYXRhLT5ydGJsX2NudCkKLQkJKnBhcmFtcyA9IHByZXZfcGFyYW1zOworCWlmICghY2xrX2ZzX2dldF9wYXJhbXMocHJhdGUsIGRyYXRlLCBwYXJhbXMpKQorCQljbGtfZnNfZ2V0X3JhdGUocHJhdGUsIHBhcmFtcywgJnJhdGUpOwogCiAJcmV0dXJuIHJhdGU7CiB9CkBAIC0xMDYzLDM0ICs4NjEsNiBAQAogCXJldHVybiBjbGs7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHF1YWRmc19vZl9tYXRjaFtdID0gewotCXsKLQkJLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNi1xdWFkZnMyMTYiLAotCQkuZGF0YSA9ICZzdF9mczIxNmM2NV80MTYKLQl9LAotCXsKLQkJLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNi1xdWFkZnM0MzIiLAotCQkuZGF0YSA9ICZzdF9mczQzMmM2NV80MTYKLQl9LAotCXsKLQkJLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNi1xdWFkZnM2NjAtRSIsCi0JCS5kYXRhID0gJnN0X2ZzNjYwYzMyX0VfNDE2Ci0JfSwKLQl7Ci0JCS5jb21wYXRpYmxlID0gInN0LHN0aWg0MTYtcXVhZGZzNjYwLUYiLAotCQkuZGF0YSA9ICZzdF9mczY2MGMzMl9GXzQxNgotCX0sCi0JewotCQkuY29tcGF0aWJsZSA9ICJzdCxzdGloNDA3LXF1YWRmczY2MC1DIiwKLQkJLmRhdGEgPSAmc3RfZnM2NjBjMzJfQwotCX0sCi0JewotCQkuY29tcGF0aWJsZSA9ICJzdCxzdGloNDA3LXF1YWRmczY2MC1EIiwKLQkJLmRhdGEgPSAmc3RfZnM2NjBjMzJfRAotCX0sCi0Je30KLX07Ci0KIHN0YXRpYyB2b2lkIF9faW5pdCBzdF9vZl9jcmVhdGVfcXVhZGZzX2ZzeW50aHMoCiAJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNvbnN0IGNoYXIgKnBsbF9uYW1lLAogCQlzdHJ1Y3QgY2xrZ2VuX3F1YWRmc19kYXRhICpxdWFkZnMsIHZvaWQgX19pb21lbSAqcmVnLApAQCAtMTE1MCwxOCArOTIwLDE0IEBACiAJb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwgY2xrX2RhdGEpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgc3Rfb2ZfcXVhZGZzX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCitzdGF0aWMgdm9pZCBfX2luaXQgc3Rfb2ZfcXVhZGZzX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCXN0cnVjdCBjbGtnZW5fcXVhZGZzX2RhdGEgKmRhdGEpCiB7Ci0JY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CiAJc3RydWN0IGNsayAqY2xrOwogCWNvbnN0IGNoYXIgKnBsbF9uYW1lLCAqY2xrX3BhcmVudF9uYW1lOwogCXZvaWQgX19pb21lbSAqcmVnOwogCXNwaW5sb2NrX3QgKmxvY2s7CiAKLQltYXRjaCA9IG9mX21hdGNoX25vZGUocXVhZGZzX29mX21hdGNoLCBucCk7Ci0JaWYgKFdBUk5fT04oIW1hdGNoKSkKLQkJcmV0dXJuOwotCiAJcmVnID0gb2ZfaW9tYXAobnAsIDApOwogCWlmICghcmVnKQogCQlyZXR1cm47CkBAIC0xMTgwLDggKzk0Niw4IEBACiAKIAlzcGluX2xvY2tfaW5pdChsb2NrKTsKIAotCWNsayA9IHN0X2Nsa19yZWdpc3Rlcl9xdWFkZnNfcGxsKHBsbF9uYW1lLCBjbGtfcGFyZW50X25hbWUsCi0JCQkoc3RydWN0IGNsa2dlbl9xdWFkZnNfZGF0YSAqKSBtYXRjaC0+ZGF0YSwgcmVnLCBsb2NrKTsKKwljbGsgPSBzdF9jbGtfcmVnaXN0ZXJfcXVhZGZzX3BsbChwbGxfbmFtZSwgY2xrX3BhcmVudF9uYW1lLCBkYXRhLAorCQkJcmVnLCBsb2NrKTsKIAlpZiAoSVNfRVJSKGNsaykpCiAJCWdvdG8gZXJyX2V4aXQ7CiAJZWxzZQpAQCAtMTE5MCwxMSArOTU2LDIwIEBACiAJCQlfX2Nsa19nZXRfbmFtZShjbGtfZ2V0X3BhcmVudChjbGspKSwKIAkJCSh1bnNpZ25lZCBpbnQpY2xrX2dldF9yYXRlKGNsaykpOwogCi0Jc3Rfb2ZfY3JlYXRlX3F1YWRmc19mc3ludGhzKG5wLCBwbGxfbmFtZSwKLQkJCQkgICAgKHN0cnVjdCBjbGtnZW5fcXVhZGZzX2RhdGEgKiltYXRjaC0+ZGF0YSwKLQkJCQkgICAgcmVnLCBsb2NrKTsKKwlzdF9vZl9jcmVhdGVfcXVhZGZzX2ZzeW50aHMobnAsIHBsbF9uYW1lLCBkYXRhLCByZWcsIGxvY2spOwogCiBlcnJfZXhpdDoKIAlrZnJlZShwbGxfbmFtZSk7IC8qIE5vIGxvbmdlciBuZWVkIGxvY2FsIGNvcHkgb2YgdGhlIFBMTCBuYW1lICovCiB9Ci1DTEtfT0ZfREVDTEFSRShxdWFkZnMsICJzdCxxdWFkZnMiLCBzdF9vZl9xdWFkZnNfc2V0dXApOworCitzdGF0aWMgdm9pZCBfX2luaXQgc3Rfb2ZfcXVhZGZzNjYwQ19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCXN0X29mX3F1YWRmc19zZXR1cChucCwgKHN0cnVjdCBjbGtnZW5fcXVhZGZzX2RhdGEgKikgJnN0X2ZzNjYwYzMyX0MpOworfQorQ0xLX09GX0RFQ0xBUkUocXVhZGZzNjYwQywgInN0LHF1YWRmcy1wbGwiLCBzdF9vZl9xdWFkZnM2NjBDX3NldHVwKTsKKworc3RhdGljIHZvaWQgX19pbml0IHN0X29mX3F1YWRmczY2MERfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwlzdF9vZl9xdWFkZnNfc2V0dXAobnAsIChzdHJ1Y3QgY2xrZ2VuX3F1YWRmc19kYXRhICopICZzdF9mczY2MGMzMl9EKTsKK30KK0NMS19PRl9ERUNMQVJFKHF1YWRmczY2MEQsICJzdCxxdWFkZnMiLCBzdF9vZl9xdWFkZnM2NjBEX3NldHVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3N0L2Nsa2dlbi1tdXguYyBiL2RyaXZlcnMvY2xrL3N0L2Nsa2dlbi1tdXguYwppbmRleCBiMWUxMGZmLi5jNTE0ZDM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9zdC9jbGtnZW4tbXV4LmMKKysrIGIvZHJpdmVycy9jbGsvc3QvY2xrZ2VuLW11eC5jCkBAIC0xOSw5ICsxOSw2IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CiAjaW5jbHVkZSAiY2xrZ2VuLmgiCiAKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2xrZ2VuYV9kaXZtdXhfbG9jayk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNsa2dlbmZfbG9jayk7Ci0KIHN0YXRpYyBjb25zdCBjaGFyICoqIF9faW5pdCBjbGtnZW5fbXV4X2dldF9wYXJlbnRzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCiAJCQkJCQkgICAgICAgaW50ICpudW1fcGFyZW50cykKIHsKQEAgLTQwLDQ5OCArMzcsNiBAQAogCXJldHVybiBwYXJlbnRzOwogfQogCi0vKioKLSAqIERPQzogQ2xvY2sgbXV4IHdpdGggYSBwcm9ncmFtbWFibGUgZGl2aWRlciBvbiBlYWNoIG9mIGl0cyB0aHJlZSBpbnB1dHMuCi0gKiAgICAgIFRoZSBtdXggaGFzIGFuIGlucHV0IHNldHRpbmcgd2hpY2ggZWZmZWN0aXZlbHkgZ2F0ZXMgaXRzIG91dHB1dC4KLSAqCi0gKiBUcmFpdHMgb2YgdGhpcyBjbG9jazoKLSAqIHByZXBhcmUgLSBjbGtfKHVuKXByZXBhcmUgb25seSBlbnN1cmVzIHBhcmVudCBpcyAodW4pcHJlcGFyZWQKLSAqIGVuYWJsZSAtIGNsa19lbmFibGUgYW5kIGNsa19kaXNhYmxlIGFyZSBmdW5jdGlvbmFsICYgY29udHJvbCBnYXRpbmcKLSAqIHJhdGUgLSBzZXQgcmF0ZSBpcyBzdXBwb3J0ZWQKLSAqIHBhcmVudCAtIHNldC9nZXQgcGFyZW50Ci0gKi8KLQotI2RlZmluZSBOVU1fSU5QVVRTIDMKLQotc3RydWN0IGNsa2dlbmFfZGl2bXV4IHsKLQlzdHJ1Y3QgY2xrX2h3IGh3OwotCS8qIFN1YmNsYXNzZWQgbXV4IGFuZCBkaXZpZGVyIHN0cnVjdHVyZXMgKi8KLQlzdHJ1Y3QgY2xrX211eCBtdXg7Ci0Jc3RydWN0IGNsa19kaXZpZGVyIGRpdltOVU1fSU5QVVRTXTsKLQkvKiBFbmFibGUvcnVubmluZyBmZWVkYmFjayByZWdpc3RlciBiaXRzIGZvciBlYWNoIGlucHV0ICovCi0Jdm9pZCBfX2lvbWVtICpmZWVkYmFja19yZWdbTlVNX0lOUFVUU107Ci0JaW50IGZlZWRiYWNrX2JpdF9pZHg7Ci0KLQl1OCAgICAgICAgICAgICAgbXV4c2VsOwotfTsKLQotI2RlZmluZSB0b19jbGtnZW5hX2Rpdm11eChfaHcpIGNvbnRhaW5lcl9vZihfaHcsIHN0cnVjdCBjbGtnZW5hX2Rpdm11eCwgaHcpCi0KLXN0cnVjdCBjbGtnZW5hX2Rpdm11eF9kYXRhIHsKLQlpbnQgbnVtX291dHB1dHM7Ci0JaW50IG11eF9vZmZzZXQ7Ci0JaW50IG11eF9vZmZzZXQyOwotCWludCBtdXhfc3RhcnRfYml0OwotCWludCBkaXZfb2Zmc2V0c1tOVU1fSU5QVVRTXTsKLQlpbnQgZmJfb2Zmc2V0c1tOVU1fSU5QVVRTXTsKLQlpbnQgZmJfc3RhcnRfYml0X2lkeDsKLX07Ci0KLSNkZWZpbmUgQ0tHQVhfQ0xLT1BTUkNfU1dJVENIX09GRiAweDMKLQotc3RhdGljIGludCBjbGtnZW5hX2Rpdm11eF9pc19ydW5uaW5nKHN0cnVjdCBjbGtnZW5hX2Rpdm11eCAqbXV4KQotewotCXUzMiByZWd2YWwgPSByZWFkbChtdXgtPmZlZWRiYWNrX3JlZ1ttdXgtPm11eHNlbF0pOwotCXUzMiBydW5uaW5nID0gcmVndmFsICYgQklUKG11eC0+ZmVlZGJhY2tfYml0X2lkeCk7Ci0JcmV0dXJuICEhcnVubmluZzsKLX0KLQotc3RhdGljIGludCBjbGtnZW5hX2Rpdm11eF9lbmFibGUoc3RydWN0IGNsa19odyAqaHcpCi17Ci0Jc3RydWN0IGNsa2dlbmFfZGl2bXV4ICpnZW5hbXV4ID0gdG9fY2xrZ2VuYV9kaXZtdXgoaHcpOwotCXN0cnVjdCBjbGtfaHcgKm11eF9odyA9ICZnZW5hbXV4LT5tdXguaHc7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OwotCWludCByZXQgPSAwOwotCi0JX19jbGtfaHdfc2V0X2NsayhtdXhfaHcsIGh3KTsKLQotCXJldCA9IGNsa19tdXhfb3BzLnNldF9wYXJlbnQobXV4X2h3LCBnZW5hbXV4LT5tdXhzZWwpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTApOwotCi0Jd2hpbGUgKCFjbGtnZW5hX2Rpdm11eF9pc19ydW5uaW5nKGdlbmFtdXgpKSB7Ci0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JCWNwdV9yZWxheCgpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBjbGtnZW5hX2Rpdm11eF9kaXNhYmxlKHN0cnVjdCBjbGtfaHcgKmh3KQotewotCXN0cnVjdCBjbGtnZW5hX2Rpdm11eCAqZ2VuYW11eCA9IHRvX2Nsa2dlbmFfZGl2bXV4KGh3KTsKLQlzdHJ1Y3QgY2xrX2h3ICptdXhfaHcgPSAmZ2VuYW11eC0+bXV4Lmh3OwotCi0JX19jbGtfaHdfc2V0X2NsayhtdXhfaHcsIGh3KTsKLQotCWNsa19tdXhfb3BzLnNldF9wYXJlbnQobXV4X2h3LCBDS0dBWF9DTEtPUFNSQ19TV0lUQ0hfT0ZGKTsKLX0KLQotc3RhdGljIGludCBjbGtnZW5hX2Rpdm11eF9pc19lbmFibGVkKHN0cnVjdCBjbGtfaHcgKmh3KQotewotCXN0cnVjdCBjbGtnZW5hX2Rpdm11eCAqZ2VuYW11eCA9IHRvX2Nsa2dlbmFfZGl2bXV4KGh3KTsKLQlzdHJ1Y3QgY2xrX2h3ICptdXhfaHcgPSAmZ2VuYW11eC0+bXV4Lmh3OwotCi0JX19jbGtfaHdfc2V0X2NsayhtdXhfaHcsIGh3KTsKLQotCXJldHVybiAoczgpY2xrX211eF9vcHMuZ2V0X3BhcmVudChtdXhfaHcpID4gMDsKLX0KLQotc3RhdGljIHU4IGNsa2dlbmFfZGl2bXV4X2dldF9wYXJlbnQoc3RydWN0IGNsa19odyAqaHcpCi17Ci0Jc3RydWN0IGNsa2dlbmFfZGl2bXV4ICpnZW5hbXV4ID0gdG9fY2xrZ2VuYV9kaXZtdXgoaHcpOwotCXN0cnVjdCBjbGtfaHcgKm11eF9odyA9ICZnZW5hbXV4LT5tdXguaHc7Ci0KLQlfX2Nsa19od19zZXRfY2xrKG11eF9odywgaHcpOwotCi0JZ2VuYW11eC0+bXV4c2VsID0gY2xrX211eF9vcHMuZ2V0X3BhcmVudChtdXhfaHcpOwotCWlmICgoczgpZ2VuYW11eC0+bXV4c2VsIDwgMCkgewotCQlwcl9kZWJ1ZygiJXM6ICVzOiBJbnZhbGlkIHBhcmVudCwgc2V0dGluZyB0byBkZWZhdWx0LlxuIiwKLQkJICAgICAgX19mdW5jX18sIGNsa19od19nZXRfbmFtZShodykpOwotCQlnZW5hbXV4LT5tdXhzZWwgPSAwOwotCX0KLQotCXJldHVybiBnZW5hbXV4LT5tdXhzZWw7Ci19Ci0KLXN0YXRpYyBpbnQgY2xrZ2VuYV9kaXZtdXhfc2V0X3BhcmVudChzdHJ1Y3QgY2xrX2h3ICpodywgdTggaW5kZXgpCi17Ci0Jc3RydWN0IGNsa2dlbmFfZGl2bXV4ICpnZW5hbXV4ID0gdG9fY2xrZ2VuYV9kaXZtdXgoaHcpOwotCi0JaWYgKGluZGV4ID49IENLR0FYX0NMS09QU1JDX1NXSVRDSF9PRkYpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZ2VuYW11eC0+bXV4c2VsID0gaW5kZXg7Ci0KLQkvKgotCSAqIElmIHRoZSBtdXggaXMgYWxyZWFkeSBlbmFibGVkLCBjYWxsIGVuYWJsZSBkaXJlY3RseSB0byBzZXQgdGhlCi0JICogbmV3IG11eCBwb3NpdGlvbiBhbmQgd2FpdCBmb3IgaXQgdG8gc3RhcnQgcnVubmluZyBhZ2Fpbi4gT3RoZXJ3aXNlCi0JICogZG8gbm90aGluZy4KLQkgKi8KLQlpZiAoY2xrZ2VuYV9kaXZtdXhfaXNfZW5hYmxlZChodykpCi0JCWNsa2dlbmFfZGl2bXV4X2VuYWJsZShodyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xrZ2VuYV9kaXZtdXhfcmVjYWxjX3JhdGUoc3RydWN0IGNsa19odyAqaHcsCi0JCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUpCi17Ci0Jc3RydWN0IGNsa2dlbmFfZGl2bXV4ICpnZW5hbXV4ID0gdG9fY2xrZ2VuYV9kaXZtdXgoaHcpOwotCXN0cnVjdCBjbGtfaHcgKmRpdl9odyA9ICZnZW5hbXV4LT5kaXZbZ2VuYW11eC0+bXV4c2VsXS5odzsKLQotCV9fY2xrX2h3X3NldF9jbGsoZGl2X2h3LCBodyk7Ci0KLQlyZXR1cm4gY2xrX2RpdmlkZXJfb3BzLnJlY2FsY19yYXRlKGRpdl9odywgcGFyZW50X3JhdGUpOwotfQotCi1zdGF0aWMgaW50IGNsa2dlbmFfZGl2bXV4X3NldF9yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LCB1bnNpZ25lZCBsb25nIHJhdGUsCi0JCQkJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSkKLXsKLQlzdHJ1Y3QgY2xrZ2VuYV9kaXZtdXggKmdlbmFtdXggPSB0b19jbGtnZW5hX2Rpdm11eChodyk7Ci0Jc3RydWN0IGNsa19odyAqZGl2X2h3ID0gJmdlbmFtdXgtPmRpdltnZW5hbXV4LT5tdXhzZWxdLmh3OwotCi0JX19jbGtfaHdfc2V0X2NsayhkaXZfaHcsIGh3KTsKLQotCXJldHVybiBjbGtfZGl2aWRlcl9vcHMuc2V0X3JhdGUoZGl2X2h3LCByYXRlLCBwYXJlbnRfcmF0ZSk7Ci19Ci0KLXN0YXRpYyBsb25nIGNsa2dlbmFfZGl2bXV4X3JvdW5kX3JhdGUoc3RydWN0IGNsa19odyAqaHcsIHVuc2lnbmVkIGxvbmcgcmF0ZSwKLQkJCQkgICB1bnNpZ25lZCBsb25nICpwcmF0ZSkKLXsKLQlzdHJ1Y3QgY2xrZ2VuYV9kaXZtdXggKmdlbmFtdXggPSB0b19jbGtnZW5hX2Rpdm11eChodyk7Ci0Jc3RydWN0IGNsa19odyAqZGl2X2h3ID0gJmdlbmFtdXgtPmRpdltnZW5hbXV4LT5tdXhzZWxdLmh3OwotCi0JX19jbGtfaHdfc2V0X2NsayhkaXZfaHcsIGh3KTsKLQotCXJldHVybiBjbGtfZGl2aWRlcl9vcHMucm91bmRfcmF0ZShkaXZfaHcsIHJhdGUsIHByYXRlKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIGNsa2dlbmFfZGl2bXV4X29wcyA9IHsKLQkuZW5hYmxlID0gY2xrZ2VuYV9kaXZtdXhfZW5hYmxlLAotCS5kaXNhYmxlID0gY2xrZ2VuYV9kaXZtdXhfZGlzYWJsZSwKLQkuaXNfZW5hYmxlZCA9IGNsa2dlbmFfZGl2bXV4X2lzX2VuYWJsZWQsCi0JLmdldF9wYXJlbnQgPSBjbGtnZW5hX2Rpdm11eF9nZXRfcGFyZW50LAotCS5zZXRfcGFyZW50ID0gY2xrZ2VuYV9kaXZtdXhfc2V0X3BhcmVudCwKLQkucm91bmRfcmF0ZSA9IGNsa2dlbmFfZGl2bXV4X3JvdW5kX3JhdGUsCi0JLnJlY2FsY19yYXRlID0gY2xrZ2VuYV9kaXZtdXhfcmVjYWxjX3JhdGUsCi0JLnNldF9yYXRlID0gY2xrZ2VuYV9kaXZtdXhfc2V0X3JhdGUsCi19OwotCi0vKioKLSAqIGNsa19yZWdpc3Rlcl9nZW5hbXV4IC0gcmVnaXN0ZXIgYSBnZW5hbXV4IGNsb2NrIHdpdGggdGhlIGNsb2NrIGZyYW1ld29yawotICovCi1zdGF0aWMgc3RydWN0IGNsayAqIF9faW5pdCBjbGtfcmVnaXN0ZXJfZ2VuYW11eChjb25zdCBjaGFyICpuYW1lLAotCQkJCWNvbnN0IGNoYXIgKipwYXJlbnRfbmFtZXMsIHU4IG51bV9wYXJlbnRzLAotCQkJCXZvaWQgX19pb21lbSAqcmVnLAotCQkJCWNvbnN0IHN0cnVjdCBjbGtnZW5hX2Rpdm11eF9kYXRhICptdXhkYXRhLAotCQkJCXUzMiBpZHgpCi17Ci0JLyoKLQkgKiBGaXhlZCBjb25zdGFudHMgYWNyb3NzIGFsbCBDbG9ja2dlbkEgdmFyaWFudHMKLQkgKi8KLQljb25zdCBpbnQgbXV4X3dpZHRoID0gMjsKLQljb25zdCBpbnQgZGl2aWRlcl93aWR0aCA9IDU7Ci0Jc3RydWN0IGNsa2dlbmFfZGl2bXV4ICpnZW5hbXV4OwotCXN0cnVjdCBjbGsgKmNsazsKLQlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OwotCWludCBpOwotCi0JZ2VuYW11eCA9IGt6YWxsb2Moc2l6ZW9mKCpnZW5hbXV4KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFnZW5hbXV4KQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQotCWluaXQubmFtZSA9IG5hbWU7Ci0JaW5pdC5vcHMgPSAmY2xrZ2VuYV9kaXZtdXhfb3BzOwotCWluaXQuZmxhZ3MgPSBDTEtfSVNfQkFTSUMgfCBDTEtfR0VUX1JBVEVfTk9DQUNIRTsKLQlpbml0LnBhcmVudF9uYW1lcyA9IHBhcmVudF9uYW1lczsKLQlpbml0Lm51bV9wYXJlbnRzID0gbnVtX3BhcmVudHM7Ci0KLQlnZW5hbXV4LT5tdXgubG9jayAgPSAmY2xrZ2VuYV9kaXZtdXhfbG9jazsKLQlnZW5hbXV4LT5tdXgubWFzayA9IEJJVChtdXhfd2lkdGgpIC0gMTsKLQlnZW5hbXV4LT5tdXguc2hpZnQgPSBtdXhkYXRhLT5tdXhfc3RhcnRfYml0ICsgKGlkeCAqIG11eF93aWR0aCk7Ci0JaWYgKGdlbmFtdXgtPm11eC5zaGlmdCA+IDMxKSB7Ci0JCS8qCi0JCSAqIFdlIGhhdmUgc3BpbGxlZCBpbnRvIHRoZSBzZWNvbmQgbXV4IHJlZ2lzdGVyIHNvCi0JCSAqIGFkanVzdCB0aGUgcmVnaXN0ZXIgYWRkcmVzcyBhbmQgdGhlIGJpdCBzaGlmdCBhY2NvcmRpbmdseQotCQkgKi8KLQkJZ2VuYW11eC0+bXV4LnJlZyA9IHJlZyArIG11eGRhdGEtPm11eF9vZmZzZXQyOwotCQlnZW5hbXV4LT5tdXguc2hpZnQgLT0gMzI7Ci0JfSBlbHNlIHsKLQkJZ2VuYW11eC0+bXV4LnJlZyAgID0gcmVnICsgbXV4ZGF0YS0+bXV4X29mZnNldDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0lOUFVUUzsgaSsrKSB7Ci0JCS8qCi0JCSAqIERpdmlkZXIgY29uZmlnIGZvciBlYWNoIGlucHV0Ci0JCSAqLwotCQl2b2lkIF9faW9tZW0gKmRpdmJhc2UgPSByZWcgKyBtdXhkYXRhLT5kaXZfb2Zmc2V0c1tpXTsKLQkJZ2VuYW11eC0+ZGl2W2ldLndpZHRoID0gZGl2aWRlcl93aWR0aDsKLQkJZ2VuYW11eC0+ZGl2W2ldLnJlZyA9IGRpdmJhc2UgKyAoaWR4ICogc2l6ZW9mKHUzMikpOwotCi0JCS8qCi0JCSAqIE11eCBlbmFibGVkL3J1bm5pbmcgZmVlZGJhY2sgcmVnaXN0ZXIgZm9yIGVhY2ggaW5wdXQuCi0JCSAqLwotCQlnZW5hbXV4LT5mZWVkYmFja19yZWdbaV0gPSByZWcgKyBtdXhkYXRhLT5mYl9vZmZzZXRzW2ldOwotCX0KLQotCWdlbmFtdXgtPmZlZWRiYWNrX2JpdF9pZHggPSBtdXhkYXRhLT5mYl9zdGFydF9iaXRfaWR4ICsgaWR4OwotCWdlbmFtdXgtPmh3LmluaXQgPSAmaW5pdDsKLQotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmZ2VuYW11eC0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkgewotCQlrZnJlZShnZW5hbXV4KTsKLQkJZ290byBlcnI7Ci0JfQotCi0JcHJfZGVidWcoIiVzOiBwYXJlbnQgJXMgcmF0ZSAlbHVcbiIsCi0JCQlfX2Nsa19nZXRfbmFtZShjbGspLAotCQkJX19jbGtfZ2V0X25hbWUoY2xrX2dldF9wYXJlbnQoY2xrKSksCi0JCQljbGtfZ2V0X3JhdGUoY2xrKSk7Ci1lcnI6Ci0JcmV0dXJuIGNsazsKLX0KLQotc3RhdGljIHN0cnVjdCBjbGtnZW5hX2Rpdm11eF9kYXRhIHN0X2Rpdm11eF9jNjVocyA9IHsKLQkubnVtX291dHB1dHMgPSA0LAotCS5tdXhfb2Zmc2V0ID0gMHgxNCwKLQkubXV4X3N0YXJ0X2JpdCA9IDAsCi0JLmRpdl9vZmZzZXRzID0geyAweDgwMCwgMHg5MDAsIDB4YjAwIH0sCi0JLmZiX29mZnNldHMgPSB7IDB4MTgsIDB4MWMsIDB4MjAgfSwKLQkuZmJfc3RhcnRfYml0X2lkeCA9IDAsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa2dlbmFfZGl2bXV4X2RhdGEgc3RfZGl2bXV4X2M2NWxzID0gewotCS5udW1fb3V0cHV0cyA9IDE0LAotCS5tdXhfb2Zmc2V0ID0gMHgxNCwKLQkubXV4X29mZnNldDIgPSAweDI0LAotCS5tdXhfc3RhcnRfYml0ID0gOCwKLQkuZGl2X29mZnNldHMgPSB7IDB4ODEwLCAweGExMCwgMHhiMTAgfSwKLQkuZmJfb2Zmc2V0cyA9IHsgMHgxOCwgMHgxYywgMHgyMCB9LAotCS5mYl9zdGFydF9iaXRfaWR4ID0gNCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrZ2VuYV9kaXZtdXhfZGF0YSBzdF9kaXZtdXhfYzMyb2RmMCA9IHsKLQkubnVtX291dHB1dHMgPSA4LAotCS5tdXhfb2Zmc2V0ID0gMHgxYywKLQkubXV4X3N0YXJ0X2JpdCA9IDAsCi0JLmRpdl9vZmZzZXRzID0geyAweDgwMCwgMHg5MDAsIDB4YTYwIH0sCi0JLmZiX29mZnNldHMgPSB7IDB4MmMsIDB4MjQsIDB4MjggfSwKLQkuZmJfc3RhcnRfYml0X2lkeCA9IDAsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa2dlbmFfZGl2bXV4X2RhdGEgc3RfZGl2bXV4X2MzMm9kZjEgPSB7Ci0JLm51bV9vdXRwdXRzID0gOCwKLQkubXV4X29mZnNldCA9IDB4MWMsCi0JLm11eF9zdGFydF9iaXQgPSAxNiwKLQkuZGl2X29mZnNldHMgPSB7IDB4ODIwLCAweDk4MCwgMHhhODAgfSwKLQkuZmJfb2Zmc2V0cyA9IHsgMHgyYywgMHgyNCwgMHgyOCB9LAotCS5mYl9zdGFydF9iaXRfaWR4ID0gOCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrZ2VuYV9kaXZtdXhfZGF0YSBzdF9kaXZtdXhfYzMyb2RmMiA9IHsKLQkubnVtX291dHB1dHMgPSA4LAotCS5tdXhfb2Zmc2V0ID0gMHgyMCwKLQkubXV4X3N0YXJ0X2JpdCA9IDAsCi0JLmRpdl9vZmZzZXRzID0geyAweDg0MCwgMHhhMjAsIDB4YjEwIH0sCi0JLmZiX29mZnNldHMgPSB7IDB4MmMsIDB4MjQsIDB4MjggfSwKLQkuZmJfc3RhcnRfYml0X2lkeCA9IDE2LAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtnZW5hX2Rpdm11eF9kYXRhIHN0X2Rpdm11eF9jMzJvZGYzID0gewotCS5udW1fb3V0cHV0cyA9IDgsCi0JLm11eF9vZmZzZXQgPSAweDIwLAotCS5tdXhfc3RhcnRfYml0ID0gMTYsCi0JLmRpdl9vZmZzZXRzID0geyAweDg2MCwgMHhhNDAsIDB4YjMwIH0sCi0JLmZiX29mZnNldHMgPSB7IDB4MmMsIDB4MjQsIDB4MjggfSwKLQkuZmJfc3RhcnRfYml0X2lkeCA9IDI0LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgY2xrZ2VuYV9kaXZtdXhfb2ZfbWF0Y2hbXSA9IHsKLQl7Ci0JCS5jb21wYXRpYmxlID0gInN0LGNsa2dlbmEtZGl2bXV4LWM2NS1ocyIsCi0JCS5kYXRhID0gJnN0X2Rpdm11eF9jNjVocywKLQl9LAotCXsKLQkJLmNvbXBhdGlibGUgPSAic3QsY2xrZ2VuYS1kaXZtdXgtYzY1LWxzIiwKLQkJLmRhdGEgPSAmc3RfZGl2bXV4X2M2NWxzLAotCX0sCi0JewotCQkuY29tcGF0aWJsZSA9ICJzdCxjbGtnZW5hLWRpdm11eC1jMzItb2RmMCIsCi0JCS5kYXRhID0gJnN0X2Rpdm11eF9jMzJvZGYwLAotCX0sCi0JewotCQkuY29tcGF0aWJsZSA9ICJzdCxjbGtnZW5hLWRpdm11eC1jMzItb2RmMSIsCi0JCS5kYXRhID0gJnN0X2Rpdm11eF9jMzJvZGYxLAotCX0sCi0JewotCQkuY29tcGF0aWJsZSA9ICJzdCxjbGtnZW5hLWRpdm11eC1jMzItb2RmMiIsCi0JCS5kYXRhID0gJnN0X2Rpdm11eF9jMzJvZGYyLAotCX0sCi0JewotCQkuY29tcGF0aWJsZSA9ICJzdCxjbGtnZW5hLWRpdm11eC1jMzItb2RmMyIsCi0JCS5kYXRhID0gJnN0X2Rpdm11eF9jMzJvZGYzLAotCX0sCi0Je30KLX07Ci0KLXN0YXRpYyB2b2lkIF9faW9tZW0gKiBfX2luaXQgY2xrZ2VuX2dldF9yZWdpc3Rlcl9iYXNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpwbm9kZTsKLQl2b2lkIF9faW9tZW0gKnJlZzsKLQotCXBub2RlID0gb2ZfZ2V0X3BhcmVudChucCk7Ci0JaWYgKCFwbm9kZSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZWcgPSBvZl9pb21hcChwbm9kZSwgMCk7Ci0KLQlvZl9ub2RlX3B1dChwbm9kZSk7Ci0JcmV0dXJuIHJlZzsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHN0X29mX2Nsa2dlbmFfZGl2bXV4X3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCi17Ci0JY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7Ci0JY29uc3Qgc3RydWN0IGNsa2dlbmFfZGl2bXV4X2RhdGEgKmRhdGE7Ci0Jc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgKmNsa19kYXRhOwotCXZvaWQgX19pb21lbSAqcmVnOwotCWNvbnN0IGNoYXIgKipwYXJlbnRzOwotCWludCBudW1fcGFyZW50cyA9IDAsIGk7Ci0KLQltYXRjaCA9IG9mX21hdGNoX25vZGUoY2xrZ2VuYV9kaXZtdXhfb2ZfbWF0Y2gsIG5wKTsKLQlpZiAoV0FSTl9PTighbWF0Y2gpKQotCQlyZXR1cm47Ci0KLQlkYXRhID0gbWF0Y2gtPmRhdGE7Ci0KLQlyZWcgPSBjbGtnZW5fZ2V0X3JlZ2lzdGVyX2Jhc2UobnApOwotCWlmICghcmVnKQotCQlyZXR1cm47Ci0KLQlwYXJlbnRzID0gY2xrZ2VuX211eF9nZXRfcGFyZW50cyhucCwgJm51bV9wYXJlbnRzKTsKLQlpZiAoSVNfRVJSKHBhcmVudHMpKQotCQlnb3RvIGVycl9wYXJlbnRzOwotCi0JY2xrX2RhdGEgPSBremFsbG9jKHNpemVvZigqY2xrX2RhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNsa19kYXRhKQotCQlnb3RvIGVycl9hbGxvYzsKLQotCWNsa19kYXRhLT5jbGtfbnVtID0gZGF0YS0+bnVtX291dHB1dHM7Ci0JY2xrX2RhdGEtPmNsa3MgPSBrY2FsbG9jKGNsa19kYXRhLT5jbGtfbnVtLCBzaXplb2Yoc3RydWN0IGNsayAqKSwKLQkJCQkgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIWNsa19kYXRhLT5jbGtzKQotCQlnb3RvIGVycl9hbGxvY19jbGtzOwotCi0JZm9yIChpID0gMDsgaSA8IGNsa19kYXRhLT5jbGtfbnVtOyBpKyspIHsKLQkJc3RydWN0IGNsayAqY2xrOwotCQljb25zdCBjaGFyICpjbGtfbmFtZTsKLQotCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgobnAsICJjbG9jay1vdXRwdXQtbmFtZXMiLAotCQkJCQkJICBpLCAmY2xrX25hbWUpKQotCQkJYnJlYWs7Ci0KLQkJLyoKLQkJICogSWYgd2UgcmVhZCBhbiBlbXB0eSBjbG9jayBuYW1lIHRoZW4gdGhlIG91dHB1dCBpcyB1bnVzZWQKLQkJICovCi0JCWlmICgqY2xrX25hbWUgPT0gJ1wwJykKLQkJCWNvbnRpbnVlOwotCi0JCWNsayA9IGNsa19yZWdpc3Rlcl9nZW5hbXV4KGNsa19uYW1lLCBwYXJlbnRzLCBudW1fcGFyZW50cywKLQkJCQkJICAgcmVnLCBkYXRhLCBpKTsKLQotCQlpZiAoSVNfRVJSKGNsaykpCi0JCQlnb3RvIGVycjsKLQotCQljbGtfZGF0YS0+Y2xrc1tpXSA9IGNsazsKLQl9Ci0KLQlrZnJlZShwYXJlbnRzKTsKLQotCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsIGNsa19kYXRhKTsKLQlyZXR1cm47Ci1lcnI6Ci0Ja2ZyZWUoY2xrX2RhdGEtPmNsa3MpOwotZXJyX2FsbG9jX2Nsa3M6Ci0Ja2ZyZWUoY2xrX2RhdGEpOwotZXJyX2FsbG9jOgotCWtmcmVlKHBhcmVudHMpOwotZXJyX3BhcmVudHM6Ci0JaW91bm1hcChyZWcpOwotfQotQ0xLX09GX0RFQ0xBUkUoY2xrZ2VuYWRpdm11eCwgInN0LGNsa2dlbmEtZGl2bXV4Iiwgc3Rfb2ZfY2xrZ2VuYV9kaXZtdXhfc2V0dXApOwotCi1zdHJ1Y3QgY2xrZ2VuYV9wcmVkaXZfZGF0YSB7Ci0JdTMyIG9mZnNldDsKLQl1OCBzaGlmdDsKLQlzdHJ1Y3QgY2xrX2Rpdl90YWJsZSAqdGFibGU7Ci19OwotCi1zdGF0aWMgc3RydWN0IGNsa19kaXZfdGFibGUgcHJlZGl2X3RhYmxlMTZbXSA9IHsKLQl7IC52YWwgPSAwLCAuZGl2ID0gMSB9LAotCXsgLnZhbCA9IDEsIC5kaXYgPSAxNiB9LAotCXsgLmRpdiA9IDAgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrZ2VuYV9wcmVkaXZfZGF0YSBwcmVkaXZfYzY1X2RhdGEgPSB7Ci0JLm9mZnNldCA9IDB4NGMsCi0JLnNoaWZ0ID0gMzEsCi0JLnRhYmxlID0gcHJlZGl2X3RhYmxlMTYsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa2dlbmFfcHJlZGl2X2RhdGEgcHJlZGl2X2MzMl9kYXRhID0gewotCS5vZmZzZXQgPSAweDUwLAotCS5zaGlmdCA9IDEsCi0JLnRhYmxlID0gcHJlZGl2X3RhYmxlMTYsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBjbGtnZW5hX3ByZWRpdl9vZl9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAic3QsY2xrZ2VuYS1wcmVkaXYtYzY1IiwgLmRhdGEgPSAmcHJlZGl2X2M2NV9kYXRhIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzdCxjbGtnZW5hLXByZWRpdi1jMzIiLCAuZGF0YSA9ICZwcmVkaXZfYzMyX2RhdGEgfSwKLQl7fQotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IHN0X29mX2Nsa2dlbmFfcHJlZGl2X3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCi17Ci0JY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7Ci0Jdm9pZCBfX2lvbWVtICpyZWc7Ci0JY29uc3QgY2hhciAqcGFyZW50X25hbWUsICpjbGtfbmFtZTsKLQlzdHJ1Y3QgY2xrICpjbGs7Ci0JY29uc3Qgc3RydWN0IGNsa2dlbmFfcHJlZGl2X2RhdGEgKmRhdGE7Ci0KLQltYXRjaCA9IG9mX21hdGNoX25vZGUoY2xrZ2VuYV9wcmVkaXZfb2ZfbWF0Y2gsIG5wKTsKLQlpZiAoIW1hdGNoKSB7Ci0JCXByX2VycigiJXM6IE5vIG1hdGNoaW5nIGRhdGFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCWRhdGEgPSBtYXRjaC0+ZGF0YTsKLQotCXJlZyA9IGNsa2dlbl9nZXRfcmVnaXN0ZXJfYmFzZShucCk7Ci0JaWYgKCFyZWcpCi0JCXJldHVybjsKLQotCXBhcmVudF9uYW1lID0gb2ZfY2xrX2dldF9wYXJlbnRfbmFtZShucCwgMCk7Ci0JaWYgKCFwYXJlbnRfbmFtZSkKLQkJZ290byBlcnI7Ci0KLQlpZiAob2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgobnAsICJjbG9jay1vdXRwdXQtbmFtZXMiLAotCQkJCQkgIDAsICZjbGtfbmFtZSkpCi0JCWdvdG8gZXJyOwotCi0JY2xrID0gY2xrX3JlZ2lzdGVyX2RpdmlkZXJfdGFibGUoTlVMTCwgY2xrX25hbWUsIHBhcmVudF9uYW1lLAotCQkJCQkgQ0xLX0dFVF9SQVRFX05PQ0FDSEUsCi0JCQkJCSByZWcgKyBkYXRhLT5vZmZzZXQsIGRhdGEtPnNoaWZ0LCAxLAotCQkJCQkgMCwgZGF0YS0+dGFibGUsIE5VTEwpOwotCWlmIChJU19FUlIoY2xrKSkKLQkJZ290byBlcnI7Ci0KLQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7Ci0JcHJfZGVidWcoIiVzOiBwYXJlbnQgJXMgcmF0ZSAldVxuIiwKLQkJX19jbGtfZ2V0X25hbWUoY2xrKSwKLQkJX19jbGtfZ2V0X25hbWUoY2xrX2dldF9wYXJlbnQoY2xrKSksCi0JCSh1bnNpZ25lZCBpbnQpY2xrX2dldF9yYXRlKGNsaykpOwotCi0JcmV0dXJuOwotZXJyOgotCWlvdW5tYXAocmVnKTsKLX0KLUNMS19PRl9ERUNMQVJFKGNsa2dlbmFwcmVkaXYsICJzdCxjbGtnZW5hLXByZWRpdiIsIHN0X29mX2Nsa2dlbmFfcHJlZGl2X3NldHVwKTsKLQogc3RydWN0IGNsa2dlbl9tdXhfZGF0YSB7CiAJdTMyIG9mZnNldDsKIAl1OCBzaGlmdDsKQEAgLTU0MSw0OSArNDYsNiBAQAogCXU4IG11eF9mbGFnczsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrZ2VuX211eF9kYXRhIGNsa2dlbl9tdXhfY192Y2NfaGRfNDE2ID0gewotCS5vZmZzZXQgPSAwLAotCS5zaGlmdCA9IDAsCi0JLndpZHRoID0gMSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrZ2VuX211eF9kYXRhIGNsa2dlbl9tdXhfZl92Y2NfZnZkcF80MTYgPSB7Ci0JLm9mZnNldCA9IDAsCi0JLnNoaWZ0ID0gMCwKLQkud2lkdGggPSAxLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtnZW5fbXV4X2RhdGEgY2xrZ2VuX211eF9mX3ZjY19odmFfNDE2ID0gewotCS5vZmZzZXQgPSAwLAotCS5zaGlmdCA9IDAsCi0JLndpZHRoID0gMSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrZ2VuX211eF9kYXRhIGNsa2dlbl9tdXhfZl92Y2NfaGRfNDE2ID0gewotCS5vZmZzZXQgPSAwLAotCS5zaGlmdCA9IDE2LAotCS53aWR0aCA9IDEsCi0JLmxvY2sgPSAmY2xrZ2VuZl9sb2NrLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtnZW5fbXV4X2RhdGEgY2xrZ2VuX211eF9jX3ZjY19zZF80MTYgPSB7Ci0JLm9mZnNldCA9IDAsCi0JLnNoaWZ0ID0gMTcsCi0JLndpZHRoID0gMSwKLQkubG9jayA9ICZjbGtnZW5mX2xvY2ssCi19OwotCi1zdGF0aWMgc3RydWN0IGNsa2dlbl9tdXhfZGF0YSBzdGloNDE1X2E5X211eF9kYXRhID0gewotCS5vZmZzZXQgPSAwLAotCS5zaGlmdCA9IDEsCi0JLndpZHRoID0gMiwKLQkubG9jayA9ICZjbGtnZW5fYTlfbG9jaywKLX07Ci1zdGF0aWMgc3RydWN0IGNsa2dlbl9tdXhfZGF0YSBzdGloNDE2X2E5X211eF9kYXRhID0gewotCS5vZmZzZXQgPSAwLAotCS5zaGlmdCA9IDAsCi0JLndpZHRoID0gMiwKLX07CiBzdGF0aWMgc3RydWN0IGNsa2dlbl9tdXhfZGF0YSBzdGloNDA3X2E5X211eF9kYXRhID0gewogCS5vZmZzZXQgPSAweDFhNCwKIAkuc2hpZnQgPSAwLApAQCAtNTkxLDU4ICs1MywxMyBAQAogCS5sb2NrID0gJmNsa2dlbl9hOV9sb2NrLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXV4X29mX21hdGNoW10gPSB7Ci0JewotCQkuY29tcGF0aWJsZSA9ICJzdCxzdGloNDE2LWNsa2dlbmMtdmNjLWhkIiwKLQkJLmRhdGEgPSAmY2xrZ2VuX211eF9jX3ZjY19oZF80MTYsCi0JfSwKLQl7Ci0JCS5jb21wYXRpYmxlID0gInN0LHN0aWg0MTYtY2xrZ2VuZi12Y2MtZnZkcCIsCi0JCS5kYXRhID0gJmNsa2dlbl9tdXhfZl92Y2NfZnZkcF80MTYsCi0JfSwKLQl7Ci0JCS5jb21wYXRpYmxlID0gInN0LHN0aWg0MTYtY2xrZ2VuZi12Y2MtaHZhIiwKLQkJLmRhdGEgPSAmY2xrZ2VuX211eF9mX3ZjY19odmFfNDE2LAotCX0sCi0JewotCQkuY29tcGF0aWJsZSA9ICJzdCxzdGloNDE2LWNsa2dlbmYtdmNjLWhkIiwKLQkJLmRhdGEgPSAmY2xrZ2VuX211eF9mX3ZjY19oZF80MTYsCi0JfSwKLQl7Ci0JCS5jb21wYXRpYmxlID0gInN0LHN0aWg0MTYtY2xrZ2VuZi12Y2Mtc2QiLAotCQkuZGF0YSA9ICZjbGtnZW5fbXV4X2NfdmNjX3NkXzQxNiwKLQl9LAotCXsKLQkJLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNS1jbGtnZW4tYTktbXV4IiwKLQkJLmRhdGEgPSAmc3RpaDQxNV9hOV9tdXhfZGF0YSwKLQl9LAotCXsKLQkJLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNi1jbGtnZW4tYTktbXV4IiwKLQkJLmRhdGEgPSAmc3RpaDQxNl9hOV9tdXhfZGF0YSwKLQl9LAotCXsKLQkJLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQwNy1jbGtnZW4tYTktbXV4IiwKLQkJLmRhdGEgPSAmc3RpaDQwN19hOV9tdXhfZGF0YSwKLQl9LAotCXt9Ci19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgc3Rfb2ZfY2xrZ2VuX211eF9zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQorc3RhdGljIHZvaWQgX19pbml0IHN0X29mX2Nsa2dlbl9tdXhfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJc3RydWN0IGNsa2dlbl9tdXhfZGF0YSAqZGF0YSkKIHsKLQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKIAlzdHJ1Y3QgY2xrICpjbGs7CiAJdm9pZCBfX2lvbWVtICpyZWc7CiAJY29uc3QgY2hhciAqKnBhcmVudHM7Ci0JaW50IG51bV9wYXJlbnRzOwotCWNvbnN0IHN0cnVjdCBjbGtnZW5fbXV4X2RhdGEgKmRhdGE7Ci0KLQltYXRjaCA9IG9mX21hdGNoX25vZGUobXV4X29mX21hdGNoLCBucCk7Ci0JaWYgKCFtYXRjaCkgewotCQlwcl9lcnIoIiVzOiBObyBtYXRjaGluZyBkYXRhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlkYXRhID0gbWF0Y2gtPmRhdGE7CisJaW50IG51bV9wYXJlbnRzID0gMDsKIAogCXJlZyA9IG9mX2lvbWFwKG5wLCAwKTsKIAlpZiAoIXJlZykgewpAQCAtNjc5LDE2MSArOTYsMTAgQEAKIGVycl9wYXJlbnRzOgogCWlvdW5tYXAocmVnKTsKIH0KLUNMS19PRl9ERUNMQVJFKGNsa2dlbl9tdXgsICJzdCxjbGtnZW4tbXV4Iiwgc3Rfb2ZfY2xrZ2VuX211eF9zZXR1cCk7CiAKLSNkZWZpbmUgVkNDX01BWF9DSEFOTkVMUyAxNgotCi0jZGVmaW5lIFZDQ19HQVRFX09GRlNFVCAweDAKLSNkZWZpbmUgVkNDX01VWF9PRkZTRVQgMHg0Ci0jZGVmaW5lIFZDQ19ESVZfT0ZGU0VUIDB4OAotCi1zdHJ1Y3QgY2xrZ2VuX3ZjY19kYXRhIHsKLQlzcGlubG9ja190ICpsb2NrOwotCXVuc2lnbmVkIGxvbmcgY2xrX2ZsYWdzOwotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtnZW5fdmNjX2RhdGEgc3RfY2xrZ2VuY192Y2NfNDE2ID0gewotCS5jbGtfZmxhZ3MgPSBDTEtfU0VUX1JBVEVfUEFSRU5ULAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtnZW5fdmNjX2RhdGEgc3RfY2xrZ2VuZl92Y2NfNDE2ID0gewotCS5sb2NrID0gJmNsa2dlbmZfbG9jaywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHZjY19vZl9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNi1jbGtnZW5jIiwgLmRhdGEgPSAmc3RfY2xrZ2VuY192Y2NfNDE2IH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzdCxzdGloNDE2LWNsa2dlbmYiLCAuZGF0YSA9ICZzdF9jbGtnZW5mX3ZjY180MTYgfSwKLQl7fQotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IHN0X29mX2Nsa2dlbl92Y2Nfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3N0YXRpYyB2b2lkIF9faW5pdCBzdF9vZl9jbGtnZW5fYTlfbXV4X3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0JY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7Ci0Jdm9pZCBfX2lvbWVtICpyZWc7Ci0JY29uc3QgY2hhciAqKnBhcmVudHM7Ci0JaW50IG51bV9wYXJlbnRzLCBpOwotCXN0cnVjdCBjbGtfb25lY2VsbF9kYXRhICpjbGtfZGF0YTsKLQljb25zdCBzdHJ1Y3QgY2xrZ2VuX3ZjY19kYXRhICpkYXRhOwotCi0JbWF0Y2ggPSBvZl9tYXRjaF9ub2RlKHZjY19vZl9tYXRjaCwgbnApOwotCWlmIChXQVJOX09OKCFtYXRjaCkpCi0JCXJldHVybjsKLQlkYXRhID0gbWF0Y2gtPmRhdGE7Ci0KLQlyZWcgPSBvZl9pb21hcChucCwgMCk7Ci0JaWYgKCFyZWcpCi0JCXJldHVybjsKLQotCXBhcmVudHMgPSBjbGtnZW5fbXV4X2dldF9wYXJlbnRzKG5wLCAmbnVtX3BhcmVudHMpOwotCWlmIChJU19FUlIocGFyZW50cykpCi0JCWdvdG8gZXJyX3BhcmVudHM7Ci0KLQljbGtfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpjbGtfZGF0YSksIEdGUF9LRVJORUwpOwotCWlmICghY2xrX2RhdGEpCi0JCWdvdG8gZXJyX2FsbG9jOwotCi0JY2xrX2RhdGEtPmNsa19udW0gPSBWQ0NfTUFYX0NIQU5ORUxTOwotCWNsa19kYXRhLT5jbGtzID0ga2NhbGxvYyhjbGtfZGF0YS0+Y2xrX251bSwgc2l6ZW9mKHN0cnVjdCBjbGsgKiksCi0JCQkJIEdGUF9LRVJORUwpOwotCi0JaWYgKCFjbGtfZGF0YS0+Y2xrcykKLQkJZ290byBlcnJfYWxsb2NfY2xrczsKLQotCWZvciAoaSA9IDA7IGkgPCBjbGtfZGF0YS0+Y2xrX251bTsgaSsrKSB7Ci0JCXN0cnVjdCBjbGsgKmNsazsKLQkJY29uc3QgY2hhciAqY2xrX25hbWU7Ci0JCXN0cnVjdCBjbGtfZ2F0ZSAqZ2F0ZTsKLQkJc3RydWN0IGNsa19kaXZpZGVyICpkaXY7Ci0JCXN0cnVjdCBjbGtfbXV4ICptdXg7Ci0KLQkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nX2luZGV4KG5wLCAiY2xvY2stb3V0cHV0LW5hbWVzIiwKLQkJCQkJCSAgaSwgJmNsa19uYW1lKSkKLQkJCWJyZWFrOwotCi0JCS8qCi0JCSAqIElmIHdlIHJlYWQgYW4gZW1wdHkgY2xvY2sgbmFtZSB0aGVuIHRoZSBvdXRwdXQgaXMgdW51c2VkCi0JCSAqLwotCQlpZiAoKmNsa19uYW1lID09ICdcMCcpCi0JCQljb250aW51ZTsKLQotCQlnYXRlID0ga3phbGxvYyhzaXplb2YoKmdhdGUpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFnYXRlKQotCQkJZ290byBlcnI7Ci0KLQkJZGl2ID0ga3phbGxvYyhzaXplb2YoKmRpdiksIEdGUF9LRVJORUwpOwotCQlpZiAoIWRpdikgewotCQkJa2ZyZWUoZ2F0ZSk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCi0JCW11eCA9IGt6YWxsb2Moc2l6ZW9mKCptdXgpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFtdXgpIHsKLQkJCWtmcmVlKGdhdGUpOwotCQkJa2ZyZWUoZGl2KTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0KLQkJZ2F0ZS0+cmVnID0gcmVnICsgVkNDX0dBVEVfT0ZGU0VUOwotCQlnYXRlLT5iaXRfaWR4ID0gaTsKLQkJZ2F0ZS0+ZmxhZ3MgPSBDTEtfR0FURV9TRVRfVE9fRElTQUJMRTsKLQkJZ2F0ZS0+bG9jayA9IGRhdGEtPmxvY2s7Ci0KLQkJZGl2LT5yZWcgPSByZWcgKyBWQ0NfRElWX09GRlNFVDsKLQkJZGl2LT5zaGlmdCA9IDIgKiBpOwotCQlkaXYtPndpZHRoID0gMjsKLQkJZGl2LT5mbGFncyA9IENMS19ESVZJREVSX1BPV0VSX09GX1RXTyB8Ci0JCQlDTEtfRElWSURFUl9ST1VORF9DTE9TRVNUOwotCi0JCW11eC0+cmVnID0gcmVnICsgVkNDX01VWF9PRkZTRVQ7Ci0JCW11eC0+c2hpZnQgPSAyICogaTsKLQkJbXV4LT5tYXNrID0gMHgzOwotCi0JCWNsayA9IGNsa19yZWdpc3Rlcl9jb21wb3NpdGUoTlVMTCwgY2xrX25hbWUsIHBhcmVudHMsCi0JCQkJCSAgICAgbnVtX3BhcmVudHMsCi0JCQkJCSAgICAgJm11eC0+aHcsICZjbGtfbXV4X29wcywKLQkJCQkJICAgICAmZGl2LT5odywgJmNsa19kaXZpZGVyX29wcywKLQkJCQkJICAgICAmZ2F0ZS0+aHcsICZjbGtfZ2F0ZV9vcHMsCi0JCQkJCSAgICAgZGF0YS0+Y2xrX2ZsYWdzIHwKLQkJCQkJICAgICBDTEtfR0VUX1JBVEVfTk9DQUNIRSk7Ci0JCWlmIChJU19FUlIoY2xrKSkgewotCQkJa2ZyZWUoZ2F0ZSk7Ci0JCQlrZnJlZShkaXYpOwotCQkJa2ZyZWUobXV4KTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0KLQkJcHJfZGVidWcoIiVzOiBwYXJlbnQgJXMgcmF0ZSAldVxuIiwKLQkJCV9fY2xrX2dldF9uYW1lKGNsayksCi0JCQlfX2Nsa19nZXRfbmFtZShjbGtfZ2V0X3BhcmVudChjbGspKSwKLQkJCSh1bnNpZ25lZCBpbnQpY2xrX2dldF9yYXRlKGNsaykpOwotCi0JCWNsa19kYXRhLT5jbGtzW2ldID0gY2xrOwotCX0KLQotCWtmcmVlKHBhcmVudHMpOwotCi0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwgY2xrX2RhdGEpOwotCXJldHVybjsKLQotZXJyOgotCWZvciAoaSA9IDA7IGkgPCBjbGtfZGF0YS0+Y2xrX251bTsgaSsrKSB7Ci0JCXN0cnVjdCBjbGtfY29tcG9zaXRlICpjb21wb3NpdGU7Ci0KLQkJaWYgKCFjbGtfZGF0YS0+Y2xrc1tpXSkKLQkJCWNvbnRpbnVlOwotCi0JCWNvbXBvc2l0ZSA9IHRvX2Nsa19jb21wb3NpdGUoX19jbGtfZ2V0X2h3KGNsa19kYXRhLT5jbGtzW2ldKSk7Ci0JCWtmcmVlKHRvX2Nsa19nYXRlKGNvbXBvc2l0ZS0+Z2F0ZV9odykpOwotCQlrZnJlZSh0b19jbGtfZGl2aWRlcihjb21wb3NpdGUtPnJhdGVfaHcpKTsKLQkJa2ZyZWUodG9fY2xrX211eChjb21wb3NpdGUtPm11eF9odykpOwotCX0KLQotCWtmcmVlKGNsa19kYXRhLT5jbGtzKTsKLWVycl9hbGxvY19jbGtzOgotCWtmcmVlKGNsa19kYXRhKTsKLWVycl9hbGxvYzoKLQlrZnJlZShwYXJlbnRzKTsKLWVycl9wYXJlbnRzOgotCWlvdW5tYXAocmVnKTsKKwlzdF9vZl9jbGtnZW5fbXV4X3NldHVwKG5wLCAmc3RpaDQwN19hOV9tdXhfZGF0YSk7CiB9Ci1DTEtfT0ZfREVDTEFSRShjbGtnZW5fdmNjLCAic3QsY2xrZ2VuLXZjYyIsIHN0X29mX2Nsa2dlbl92Y2Nfc2V0dXApOworQ0xLX09GX0RFQ0xBUkUoY2xrZ2VuX2E5bXV4LCAic3Qsc3RpaDQwNy1jbGtnZW4tYTktbXV4IiwKKwkJc3Rfb2ZfY2xrZ2VuX2E5X211eF9zZXR1cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdC9jbGtnZW4tcGxsLmMgYi9kcml2ZXJzL2Nsay9zdC9jbGtnZW4tcGxsLmMKaW5kZXggMGI1OTkwZS4uMjViZGE0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvc3QvY2xrZ2VuLXBsbC5jCisrKyBiL2RyaXZlcnMvY2xrL3N0L2Nsa2dlbi1wbGwuYwpAQCAtMjYsMTQgKzI2LDYgQEAKIERFRklORV9TUElOTE9DSyhjbGtnZW5fYTlfbG9jayk7CiAKIC8qCi0gKiBDb21tb24gUExMIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgYml0cyBmb3IgUExMODAwIGFuZCBQTEwxNjAwIEM2NQotICovCi0jZGVmaW5lIEM2NV9NRElWX1BMTDgwMF9NQVNLCSgweGZmKQotI2RlZmluZSBDNjVfTURJVl9QTEwxNjAwX01BU0sJKDB4NykKLSNkZWZpbmUgQzY1X05ESVZfTUFTSwkJKDB4ZmYpCi0jZGVmaW5lIEM2NV9QRElWX01BU0sJCSgweDcpCi0KLS8qCiAgKiBQTEwgY29uZmlndXJhdGlvbiByZWdpc3RlciBiaXRzIGZvciBQTEwzMjAwIEMzMgogICovCiAjZGVmaW5lIEMzMl9ORElWX01BU0sgKDB4ZmYpCkBAIC03MCwxNDQgKzYyLDEwIEBACiAJY29uc3Qgc3RydWN0IGNsa19vcHMgKm9wczsKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBzdF9wbGwxNjAwYzY1X29wczsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBzdF9wbGw4MDBjNjVfb3BzOwogc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIHN0bV9wbGwzMjAwYzMyX29wczsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBzdG1fcGxsMzIwMGMzMl9hOV9vcHM7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgc3RfcGxsMTIwMGMzMl9vcHM7CiBzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgc3RtX3BsbDQ2MDBjMjhfb3BzOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa2dlbl9wbGxfZGF0YSBzdF9wbGwxNjAwYzY1X2F4ID0gewotCS5wZG5fc3RhdHVzCT0gQ0xLR0VOX0ZJRUxEKDB4MCwgMHgxLAkJCTE5KSwKLQkucGRuX2N0cmwJPSBDTEtHRU5fRklFTEQoMHgxMCwJMHgxLAkJCTApLAotCS5sb2NrZWRfc3RhdHVzCT0gQ0xLR0VOX0ZJRUxEKDB4MCwgMHgxLAkJCTMxKSwKLQkubWRpdgkJPSBDTEtHRU5fRklFTEQoMHgwLCBDNjVfTURJVl9QTEwxNjAwX01BU0ssCTApLAotCS5uZGl2CQk9IENMS0dFTl9GSUVMRCgweDAsIEM2NV9ORElWX01BU0ssCQk4KSwKLQkub3BzCQk9ICZzdF9wbGwxNjAwYzY1X29wcwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtnZW5fcGxsX2RhdGEgc3RfcGxsODAwYzY1X2F4ID0gewotCS5wZG5fc3RhdHVzCT0gQ0xLR0VOX0ZJRUxEKDB4MCwJMHgxLAkJCTE5KSwKLQkucGRuX2N0cmwJPSBDTEtHRU5fRklFTEQoMHhDLAkweDEsCQkJMSksCi0JLmxvY2tlZF9zdGF0dXMJPSBDTEtHRU5fRklFTEQoMHgwLAkweDEsCQkJMzEpLAotCS5tZGl2CQk9IENMS0dFTl9GSUVMRCgweDAsCUM2NV9NRElWX1BMTDgwMF9NQVNLLAkwKSwKLQkubmRpdgkJPSBDTEtHRU5fRklFTEQoMHgwLAlDNjVfTkRJVl9NQVNLLAkJOCksCi0JLnBkaXYJCT0gQ0xLR0VOX0ZJRUxEKDB4MCwJQzY1X1BESVZfTUFTSywJCTE2KSwKLQkub3BzCQk9ICZzdF9wbGw4MDBjNjVfb3BzCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa2dlbl9wbGxfZGF0YSBzdF9wbGwzMjAwYzMyX2ExeF8wID0gewotCS5wZG5fc3RhdHVzCT0gQ0xLR0VOX0ZJRUxEKDB4MCwJMHgxLAkJCTMxKSwKLQkucGRuX2N0cmwJPSBDTEtHRU5fRklFTEQoMHgxOCwJMHgxLAkJCTApLAotCS5sb2NrZWRfc3RhdHVzCT0gQ0xLR0VOX0ZJRUxEKDB4NCwJMHgxLAkJCTMxKSwKLQkubmRpdgkJPSBDTEtHRU5fRklFTEQoMHgwLAlDMzJfTkRJVl9NQVNLLAkJMHgwKSwKLQkuaWRmCQk9IENMS0dFTl9GSUVMRCgweDQsCUMzMl9JREZfTUFTSywJCTB4MCksCi0JLm51bV9vZGZzID0gNCwKLQkub2RmID0JewlDTEtHRU5fRklFTEQoMHg1NCwJQzMyX09ERl9NQVNLLAkJNCksCi0JCQlDTEtHRU5fRklFTEQoMHg1NCwJQzMyX09ERl9NQVNLLAkJMTApLAotCQkJQ0xLR0VOX0ZJRUxEKDB4NTQsCUMzMl9PREZfTUFTSywJCTE2KSwKLQkJCUNMS0dFTl9GSUVMRCgweDU0LAlDMzJfT0RGX01BU0ssCQkyMikgfSwKLQkub2RmX2dhdGUgPSB7CUNMS0dFTl9GSUVMRCgweDU0LAkweDEsCQkJMCksCi0JCQlDTEtHRU5fRklFTEQoMHg1NCwJMHgxLAkJCTEpLAotCQkJQ0xLR0VOX0ZJRUxEKDB4NTQsCTB4MSwJCQkyKSwKLQkJCUNMS0dFTl9GSUVMRCgweDU0LAkweDEsCQkJMykgfSwKLQkub3BzCQk9ICZzdG1fcGxsMzIwMGMzMl9vcHMsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa2dlbl9wbGxfZGF0YSBzdF9wbGwzMjAwYzMyX2ExeF8xID0gewotCS5wZG5fc3RhdHVzCT0gQ0xLR0VOX0ZJRUxEKDB4QywJMHgxLAkJCTMxKSwKLQkucGRuX2N0cmwJPSBDTEtHRU5fRklFTEQoMHgxOCwJMHgxLAkJCTEpLAotCS5sb2NrZWRfc3RhdHVzCT0gQ0xLR0VOX0ZJRUxEKDB4MTAsCTB4MSwJCQkzMSksCi0JLm5kaXYJCT0gQ0xLR0VOX0ZJRUxEKDB4QywJQzMyX05ESVZfTUFTSywJCTB4MCksCi0JLmlkZgkJPSBDTEtHRU5fRklFTEQoMHgxMCwJQzMyX0lERl9NQVNLLAkJMHgwKSwKLQkubnVtX29kZnMgPSA0LAotCS5vZGYgPSB7CUNMS0dFTl9GSUVMRCgweDU4LAlDMzJfT0RGX01BU0ssCQk0KSwKLQkJCUNMS0dFTl9GSUVMRCgweDU4LAlDMzJfT0RGX01BU0ssCQkxMCksCi0JCQlDTEtHRU5fRklFTEQoMHg1OCwJQzMyX09ERl9NQVNLLAkJMTYpLAotCQkJQ0xLR0VOX0ZJRUxEKDB4NTgsCUMzMl9PREZfTUFTSywJCTIyKSB9LAotCS5vZGZfZ2F0ZSA9IHsJQ0xLR0VOX0ZJRUxEKDB4NTgsCTB4MSwJCQkwKSwKLQkJCUNMS0dFTl9GSUVMRCgweDU4LAkweDEsCQkJMSksCi0JCQlDTEtHRU5fRklFTEQoMHg1OCwJMHgxLAkJCTIpLAotCQkJQ0xLR0VOX0ZJRUxEKDB4NTgsCTB4MSwJCQkzKSB9LAotCS5vcHMJCT0gJnN0bV9wbGwzMjAwYzMyX29wcywKLX07Ci0KLS8qIDQxNSBzcGVjaWZpYyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtnZW5fcGxsX2RhdGEgc3RfcGxsMzIwMGMzMl9hOV80MTUgPSB7Ci0JLnBkbl9zdGF0dXMJPSBDTEtHRU5fRklFTEQoMHgwLAkweDEsCQkJMCksCi0JLnBkbl9jdHJsCT0gQ0xLR0VOX0ZJRUxEKDB4MCwJMHgxLAkJCTApLAotCS5sb2NrZWRfc3RhdHVzCT0gQ0xLR0VOX0ZJRUxEKDB4NkMsCTB4MSwJCQkwKSwKLQkubmRpdgkJPSBDTEtHRU5fRklFTEQoMHgwLAlDMzJfTkRJVl9NQVNLLAkJOSksCi0JLmlkZgkJPSBDTEtHRU5fRklFTEQoMHgwLAlDMzJfSURGX01BU0ssCQkyMiksCi0JLm51bV9vZGZzID0gMSwKLQkub2RmID0JCXsgQ0xLR0VOX0ZJRUxEKDB4MCwJQzMyX09ERl9NQVNLLAkJMykgfSwKLQkub2RmX2dhdGUgPQl7IENMS0dFTl9GSUVMRCgweDAsCTB4MSwJCQkyOCkgfSwKLQkub3BzCQk9ICZzdG1fcGxsMzIwMGMzMl9vcHMsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa2dlbl9wbGxfZGF0YSBzdF9wbGwzMjAwYzMyX2Rkcl80MTUgPSB7Ci0JLnBkbl9zdGF0dXMJPSBDTEtHRU5fRklFTEQoMHgwLAkweDEsCQkJMCksCi0JLnBkbl9jdHJsCT0gQ0xLR0VOX0ZJRUxEKDB4MCwJMHgxLAkJCTApLAotCS5sb2NrZWRfc3RhdHVzCT0gQ0xLR0VOX0ZJRUxEKDB4MTAwLAkweDEsCQkJMCksCi0JLm5kaXYJCT0gQ0xLR0VOX0ZJRUxEKDB4OCwJQzMyX05ESVZfTUFTSywJCTApLAotCS5pZGYJCT0gQ0xLR0VOX0ZJRUxEKDB4MCwJQzMyX0lERl9NQVNLLAkJMjUpLAotCS5udW1fb2RmcyA9IDIsCi0JLm9kZgkJPSB7IENMS0dFTl9GSUVMRCgweDgsCUMzMl9PREZfTUFTSywJCTgpLAotCQkJICAgIENMS0dFTl9GSUVMRCgweDgsCUMzMl9PREZfTUFTSywJCTE0KSB9LAotCS5vZGZfZ2F0ZQk9IHsgQ0xLR0VOX0ZJRUxEKDB4NCwJMHgxLAkJCTI4KSwKLQkJCSAgICBDTEtHRU5fRklFTEQoMHg0LAkweDEsCQkJMjkpIH0sCi0JLm9wcwkJPSAmc3RtX3BsbDMyMDBjMzJfb3BzLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtnZW5fcGxsX2RhdGEgc3RfcGxsMTIwMGMzMl9ncHVfNDE1ID0gewotCS5wZG5fc3RhdHVzCT0gQ0xLR0VOX0ZJRUxEKDB4NCwJMHgxLAkJCTApLAotCS5wZG5fY3RybAk9IENMS0dFTl9GSUVMRCgweDQsCTB4MSwJCQkwKSwKLQkubG9ja2VkX3N0YXR1cwk9IENMS0dFTl9GSUVMRCgweDE2OCwJMHgxLAkJCTApLAotCS5sZGYJCT0gQ0xLR0VOX0ZJRUxEKDB4MCwJQzMyX0xERl9NQVNLLAkJMyksCi0JLmlkZgkJPSBDTEtHRU5fRklFTEQoMHgwLAlDMzJfSURGX01BU0ssCQkwKSwKLQkubnVtX29kZnMgPSAwLAotCS5vZGYJCT0geyBDTEtHRU5fRklFTEQoMHgwLAlDMzJfT0RGX01BU0ssCQkxMCkgfSwKLQkub3BzCQk9ICZzdF9wbGwxMjAwYzMyX29wcywKLX07Ci0KLS8qIDQxNiBzcGVjaWZpYyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtnZW5fcGxsX2RhdGEgc3RfcGxsMzIwMGMzMl9hOV80MTYgPSB7Ci0JLnBkbl9zdGF0dXMJPSBDTEtHRU5fRklFTEQoMHgwLAkweDEsCQkJMCksCi0JLnBkbl9jdHJsCT0gQ0xLR0VOX0ZJRUxEKDB4MCwJMHgxLAkJCTApLAotCS5sb2NrZWRfc3RhdHVzCT0gQ0xLR0VOX0ZJRUxEKDB4NkMsCTB4MSwJCQkwKSwKLQkubmRpdgkJPSBDTEtHRU5fRklFTEQoMHg4LAlDMzJfTkRJVl9NQVNLLAkJMCksCi0JLmlkZgkJPSBDTEtHRU5fRklFTEQoMHgwLAlDMzJfSURGX01BU0ssCQkyNSksCi0JLm51bV9vZGZzID0gMSwKLQkub2RmCQk9IHsgQ0xLR0VOX0ZJRUxEKDB4OCwJQzMyX09ERl9NQVNLLAkJOCkgfSwKLQkub2RmX2dhdGUJPSB7IENMS0dFTl9GSUVMRCgweDQsCTB4MSwJCQkyOCkgfSwKLQkub3BzCQk9ICZzdG1fcGxsMzIwMGMzMl9vcHMsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa2dlbl9wbGxfZGF0YSBzdF9wbGwzMjAwYzMyX2Rkcl80MTYgPSB7Ci0JLnBkbl9zdGF0dXMJPSBDTEtHRU5fRklFTEQoMHgwLAkweDEsCQkJMCksCi0JLnBkbl9jdHJsCT0gQ0xLR0VOX0ZJRUxEKDB4MCwJMHgxLAkJCTApLAotCS5sb2NrZWRfc3RhdHVzCT0gQ0xLR0VOX0ZJRUxEKDB4MTBDLAkweDEsCQkJMCksCi0JLm5kaXYJCT0gQ0xLR0VOX0ZJRUxEKDB4OCwJQzMyX05ESVZfTUFTSywJCTApLAotCS5pZGYJCT0gQ0xLR0VOX0ZJRUxEKDB4MCwJQzMyX0lERl9NQVNLLAkJMjUpLAotCS5udW1fb2RmcyA9IDIsCi0JLm9kZgkJPSB7IENMS0dFTl9GSUVMRCgweDgsCUMzMl9PREZfTUFTSywJCTgpLAotCQkJICAgIENMS0dFTl9GSUVMRCgweDgsCUMzMl9PREZfTUFTSywJCTE0KSB9LAotCS5vZGZfZ2F0ZQk9IHsgQ0xLR0VOX0ZJRUxEKDB4NCwJMHgxLAkJCTI4KSwKLQkJCSAgICBDTEtHRU5fRklFTEQoMHg0LAkweDEsCQkJMjkpIH0sCi0JLm9wcwkJPSAmc3RtX3BsbDMyMDBjMzJfb3BzLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtnZW5fcGxsX2RhdGEgc3RfcGxsMTIwMGMzMl9ncHVfNDE2ID0gewotCS5wZG5fc3RhdHVzCT0gQ0xLR0VOX0ZJRUxEKDB4OEU0LAkweDEsCQkJMyksCi0JLnBkbl9jdHJsCT0gQ0xLR0VOX0ZJRUxEKDB4OEU0LAkweDEsCQkJMyksCi0JLmxvY2tlZF9zdGF0dXMJPSBDTEtHRU5fRklFTEQoMHg5MEMsCTB4MSwJCQkwKSwKLQkubGRmCQk9IENMS0dFTl9GSUVMRCgweDAsCUMzMl9MREZfTUFTSywJCTMpLAotCS5pZGYJCT0gQ0xLR0VOX0ZJRUxEKDB4MCwJQzMyX0lERl9NQVNLLAkJMCksCi0JLm51bV9vZGZzID0gMCwKLQkub2RmCQk9IHsgQ0xLR0VOX0ZJRUxEKDB4MCwJQzMyX09ERl9NQVNLLAkJMTApIH0sCi0JLm9wcwkJPSAmc3RfcGxsMTIwMGMzMl9vcHMsCi19OwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNsa2dlbl9wbGxfZGF0YSBzdF9wbGwzMjAwYzMyXzQwN19hMCA9IHsKIAkvKiA0MDcgQTAgKi8KIAkucGRuX3N0YXR1cwk9IENMS0dFTl9GSUVMRCgweDJhMCwJMHgxLAkJCTgpLApAQCAtNDEwLDU3ICsyNjgsNiBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHBsbC0+bG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyByZWNhbGNfc3RtX3BsbDgwMGM2NShzdHJ1Y3QgY2xrX2h3ICpodywKLQkJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSkKLXsKLQlzdHJ1Y3QgY2xrZ2VuX3BsbCAqcGxsID0gdG9fY2xrZ2VuX3BsbChodyk7Ci0JdW5zaWduZWQgbG9uZyBtZGl2LCBuZGl2LCBwZGl2OwotCXVuc2lnbmVkIGxvbmcgcmF0ZTsKLQl1aW50NjRfdCByZXM7Ci0KLQlpZiAoIWNsa2dlbl9wbGxfaXNfZW5hYmxlZChodykgfHwgIWNsa2dlbl9wbGxfaXNfbG9ja2VkKGh3KSkKLQkJcmV0dXJuIDA7Ci0KLQlwZGl2ID0gQ0xLR0VOX1JFQUQocGxsLCBwZGl2KTsKLQltZGl2ID0gQ0xLR0VOX1JFQUQocGxsLCBtZGl2KTsKLQluZGl2ID0gQ0xLR0VOX1JFQUQocGxsLCBuZGl2KTsKLQotCWlmICghbWRpdikKLQkJbWRpdisrOyAvKiBtZGl2PTAgb3IgMSA9PiBNRElWPTEgKi8KLQotCXJlcyA9ICh1aW50NjRfdCkyICogKHVpbnQ2NF90KXBhcmVudF9yYXRlICogKHVpbnQ2NF90KW5kaXY7Ci0JcmF0ZSA9ICh1bnNpZ25lZCBsb25nKWRpdjY0X3U2NChyZXMsIG1kaXYgKiAoMSA8PCBwZGl2KSk7Ci0KLQlwcl9kZWJ1ZygiJXM6JXMgcmF0ZSAlbHVcbiIsIGNsa19od19nZXRfbmFtZShodyksIF9fZnVuY19fLCByYXRlKTsKLQotCXJldHVybiByYXRlOwotCi19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHJlY2FsY19zdG1fcGxsMTYwMGM2NShzdHJ1Y3QgY2xrX2h3ICpodywKLQkJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSkKLXsKLQlzdHJ1Y3QgY2xrZ2VuX3BsbCAqcGxsID0gdG9fY2xrZ2VuX3BsbChodyk7Ci0JdW5zaWduZWQgbG9uZyBtZGl2LCBuZGl2OwotCXVuc2lnbmVkIGxvbmcgcmF0ZTsKLQotCWlmICghY2xrZ2VuX3BsbF9pc19lbmFibGVkKGh3KSB8fCAhY2xrZ2VuX3BsbF9pc19sb2NrZWQoaHcpKQotCQlyZXR1cm4gMDsKLQotCW1kaXYgPSBDTEtHRU5fUkVBRChwbGwsIG1kaXYpOwotCW5kaXYgPSBDTEtHRU5fUkVBRChwbGwsIG5kaXYpOwotCi0JaWYgKCFtZGl2KQotCQltZGl2ID0gMTsKLQotCS8qIE5vdGU6IGlucHV0IGlzIGRpdmlkZWQgYnkgMTAwMCB0byBhdm9pZCBvdmVyZmxvdyAqLwotCXJhdGUgPSAoKDIgKiAocGFyZW50X3JhdGUgLyAxMDAwKSAqIG5kaXYpIC8gbWRpdikgKiAxMDAwOwotCi0JcHJfZGVidWcoIiVzOiVzIHJhdGUgJWx1XG4iLCBjbGtfaHdfZ2V0X25hbWUoaHcpLCBfX2Z1bmNfXywgcmF0ZSk7Ci0KLQlyZXR1cm4gcmF0ZTsKLX0KLQogc3RhdGljIGludCBjbGtfcGxsMzIwMGMzMl9nZXRfcGFyYW1zKHVuc2lnbmVkIGxvbmcgaW5wdXQsIHVuc2lnbmVkIGxvbmcgb3V0cHV0LAogCQkJICBzdHJ1Y3Qgc3RtX3BsbCAqcGxsKQogewpAQCAtNjA4LDMzICs0MTUsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyByZWNhbGNfc3RtX3BsbDEyMDBjMzIoc3RydWN0IGNsa19odyAqaHcsCi0JCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUpCi17Ci0Jc3RydWN0IGNsa2dlbl9wbGwgKnBsbCA9IHRvX2Nsa2dlbl9wbGwoaHcpOwotCXVuc2lnbmVkIGxvbmcgb2RmLCBsZGYsIGlkZjsKLQl1bnNpZ25lZCBsb25nIHJhdGU7Ci0KLQlpZiAoIWNsa2dlbl9wbGxfaXNfZW5hYmxlZChodykgfHwgIWNsa2dlbl9wbGxfaXNfbG9ja2VkKGh3KSkKLQkJcmV0dXJuIDA7Ci0KLQlvZGYgPSBDTEtHRU5fUkVBRChwbGwsIG9kZlswXSk7Ci0JbGRmID0gQ0xLR0VOX1JFQUQocGxsLCBsZGYpOwotCWlkZiA9IENMS0dFTl9SRUFEKHBsbCwgaWRmKTsKLQotCWlmICghaWRmKSAvKiBpZGY9PTAgbWVhbnMgMSAqLwotCQlpZGYgPSAxOwotCWlmICghb2RmKSAvKiBvZGY9PTAgbWVhbnMgMSAqLwotCQlvZGYgPSAxOwotCi0JLyogTm90ZTogaW5wdXQgaXMgZGl2aWRlZCBieSAxMDAwIHRvIGF2b2lkIG92ZXJmbG93ICovCi0JcmF0ZSA9ICgoKHBhcmVudF9yYXRlIC8gMTAwMCkgKiBsZGYpIC8gKG9kZiAqIGlkZikpICogMTAwMDsKLQotCXByX2RlYnVnKCIlczolcyByYXRlICVsdVxuIiwgY2xrX2h3X2dldF9uYW1lKGh3KSwgX19mdW5jX18sIHJhdGUpOwotCi0JcmV0dXJuIHJhdGU7Ci19Ci0KIC8qIFBMTCBvdXRwdXQgc3RydWN0dXJlCiAgKiBGVkNPID4+IC8yID4+IEZWQ09CWTIgKG5vIG91dHB1dCkKICAqICAgICAgICAgICAgICAgICB8PiBEaXZpZGVyIChPREYpID4+IFBISQpAQCAtNzkyLDIwICs1NzIsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgc3RfcGxsMTYwMGM2NV9vcHMgPSB7Ci0JLmVuYWJsZQkJPSBjbGtnZW5fcGxsX2VuYWJsZSwKLQkuZGlzYWJsZQk9IGNsa2dlbl9wbGxfZGlzYWJsZSwKLQkuaXNfZW5hYmxlZAk9IGNsa2dlbl9wbGxfaXNfZW5hYmxlZCwKLQkucmVjYWxjX3JhdGUJPSByZWNhbGNfc3RtX3BsbDE2MDBjNjUsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgc3RfcGxsODAwYzY1X29wcyA9IHsKLQkuZW5hYmxlCQk9IGNsa2dlbl9wbGxfZW5hYmxlLAotCS5kaXNhYmxlCT0gY2xrZ2VuX3BsbF9kaXNhYmxlLAotCS5pc19lbmFibGVkCT0gY2xrZ2VuX3BsbF9pc19lbmFibGVkLAotCS5yZWNhbGNfcmF0ZQk9IHJlY2FsY19zdG1fcGxsODAwYzY1LAotfTsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIHN0bV9wbGwzMjAwYzMyX29wcyA9IHsKIAkuZW5hYmxlCQk9IGNsa2dlbl9wbGxfZW5hYmxlLAogCS5kaXNhYmxlCT0gY2xrZ2VuX3BsbF9kaXNhYmxlLApAQCAtODIyLDEzICs1ODgsNiBAQAogCS5zZXRfcmF0ZQk9IHNldF9yYXRlX3N0bV9wbGwzMjAwYzMyLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIHN0X3BsbDEyMDBjMzJfb3BzID0gewotCS5lbmFibGUJCT0gY2xrZ2VuX3BsbF9lbmFibGUsCi0JLmRpc2FibGUJPSBjbGtnZW5fcGxsX2Rpc2FibGUsCi0JLmlzX2VuYWJsZWQJPSBjbGtnZW5fcGxsX2lzX2VuYWJsZWQsCi0JLnJlY2FsY19yYXRlCT0gcmVjYWxjX3N0bV9wbGwxMjAwYzMyLAotfTsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIHN0bV9wbGw0NjAwYzI4X29wcyA9IHsKIAkuZW5hYmxlCQk9IGNsa2dlbl9wbGxfZW5hYmxlLAogCS5kaXNhYmxlCT0gY2xrZ2VuX3BsbF9kaXNhYmxlLApAQCAtODc3LDIyICs2MzYsNiBAQAogCXJldHVybiBjbGs7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICogX19pbml0IGNsa2dlbl9jNjVfbHNkaXZfcmVnaXN0ZXIoY29uc3QgY2hhciAqcGFyZW50X25hbWUsCi0JCQkJCQkgICAgIGNvbnN0IGNoYXIgKmNsa19uYW1lKQotewotCXN0cnVjdCBjbGsgKmNsazsKLQotCWNsayA9IGNsa19yZWdpc3Rlcl9maXhlZF9mYWN0b3IoTlVMTCwgY2xrX25hbWUsIHBhcmVudF9uYW1lLCAwLCAxLCAyKTsKLQlpZiAoSVNfRVJSKGNsaykpCi0JCXJldHVybiBjbGs7Ci0KLQlwcl9kZWJ1ZygiJXM6IHBhcmVudCAlcyByYXRlICVsdVxuIiwKLQkJCV9fY2xrX2dldF9uYW1lKGNsayksCi0JCQlfX2Nsa19nZXRfbmFtZShjbGtfZ2V0X3BhcmVudChjbGspKSwKLQkJCWNsa19nZXRfcmF0ZShjbGspKTsKLQlyZXR1cm4gY2xrOwotfQotCiBzdGF0aWMgdm9pZCBfX2lvbWVtICogX19pbml0IGNsa2dlbl9nZXRfcmVnaXN0ZXJfYmFzZSgKIAkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewpAQCAtOTA5LDg5ICs2NTIsNiBAQAogCXJldHVybiByZWc7CiB9CiAKLSNkZWZpbmUgQ0xLR0VOQXhfUExMMF9PRkZTRVQgMHgwCi0jZGVmaW5lIENMS0dFTkF4X1BMTDFfT0ZGU0VUIDB4NAotCi1zdGF0aWMgdm9pZCBfX2luaXQgY2xrZ2VuYV9jNjVfcGxsX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCi17Ci0JY29uc3QgaW50IG51bV9wbGxfb3V0cHV0cyA9IDM7Ci0Jc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgKmNsa19kYXRhOwotCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lOwotCXZvaWQgX19pb21lbSAqcmVnOwotCWNvbnN0IGNoYXIgKmNsa19uYW1lOwotCi0JcGFyZW50X25hbWUgPSBvZl9jbGtfZ2V0X3BhcmVudF9uYW1lKG5wLCAwKTsKLQlpZiAoIXBhcmVudF9uYW1lKQotCQlyZXR1cm47Ci0KLQlyZWcgPSBjbGtnZW5fZ2V0X3JlZ2lzdGVyX2Jhc2UobnApOwotCWlmICghcmVnKQotCQlyZXR1cm47Ci0KLQljbGtfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpjbGtfZGF0YSksIEdGUF9LRVJORUwpOwotCWlmICghY2xrX2RhdGEpCi0JCXJldHVybjsKLQotCWNsa19kYXRhLT5jbGtfbnVtID0gbnVtX3BsbF9vdXRwdXRzOwotCWNsa19kYXRhLT5jbGtzID0ga3phbGxvYyhjbGtfZGF0YS0+Y2xrX251bSAqIHNpemVvZihzdHJ1Y3QgY2xrICopLAotCQkJCSBHRlBfS0VSTkVMKTsKLQotCWlmICghY2xrX2RhdGEtPmNsa3MpCi0JCWdvdG8gZXJyOwotCi0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nX2luZGV4KG5wLCAiY2xvY2stb3V0cHV0LW5hbWVzIiwKLQkJCQkJICAwLCAmY2xrX25hbWUpKQotCQlnb3RvIGVycjsKLQotCS8qCi0JICogUExMMCBIUyAoaGlnaCBzcGVlZCkgb3V0cHV0Ci0JICovCi0JY2xrX2RhdGEtPmNsa3NbMF0gPSBjbGtnZW5fcGxsX3JlZ2lzdGVyKHBhcmVudF9uYW1lLAotCQkJKHN0cnVjdCBjbGtnZW5fcGxsX2RhdGEgKikgJnN0X3BsbDE2MDBjNjVfYXgsCi0JCQlyZWcgKyBDTEtHRU5BeF9QTEwwX09GRlNFVCwgMCwgY2xrX25hbWUsIE5VTEwpOwotCi0JaWYgKElTX0VSUihjbGtfZGF0YS0+Y2xrc1swXSkpCi0JCWdvdG8gZXJyOwotCi0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nX2luZGV4KG5wLCAiY2xvY2stb3V0cHV0LW5hbWVzIiwKLQkJCQkJICAxLCAmY2xrX25hbWUpKQotCQlnb3RvIGVycjsKLQotCS8qCi0JICogUExMMCBMUyAobG93IHNwZWVkKSBvdXRwdXQsIHdoaWNoIGlzIGEgZml4ZWQgZGl2aWRlIGJ5IDIgb2YgdGhlCi0JICogaGlnaCBzcGVlZCBvdXRwdXQuCi0JICovCi0JY2xrX2RhdGEtPmNsa3NbMV0gPSBjbGtnZW5fYzY1X2xzZGl2X3JlZ2lzdGVyKF9fY2xrX2dldF9uYW1lCi0JCQkJCQkgICAgICAoY2xrX2RhdGEtPmNsa3NbMF0pLAotCQkJCQkJICAgICAgY2xrX25hbWUpOwotCi0JaWYgKElTX0VSUihjbGtfZGF0YS0+Y2xrc1sxXSkpCi0JCWdvdG8gZXJyOwotCi0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nX2luZGV4KG5wLCAiY2xvY2stb3V0cHV0LW5hbWVzIiwKLQkJCQkJICAyLCAmY2xrX25hbWUpKQotCQlnb3RvIGVycjsKLQotCS8qCi0JICogUExMMSBvdXRwdXQKLQkgKi8KLQljbGtfZGF0YS0+Y2xrc1syXSA9IGNsa2dlbl9wbGxfcmVnaXN0ZXIocGFyZW50X25hbWUsCi0JCQkoc3RydWN0IGNsa2dlbl9wbGxfZGF0YSAqKSAmc3RfcGxsODAwYzY1X2F4LAotCQkJcmVnICsgQ0xLR0VOQXhfUExMMV9PRkZTRVQsIDAsIGNsa19uYW1lLCBOVUxMKTsKLQotCWlmIChJU19FUlIoY2xrX2RhdGEtPmNsa3NbMl0pKQotCQlnb3RvIGVycjsKLQotCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsIGNsa19kYXRhKTsKLQlyZXR1cm47Ci0KLWVycjoKLQlrZnJlZShjbGtfZGF0YS0+Y2xrcyk7Ci0Ja2ZyZWUoY2xrX2RhdGEpOwotfQotQ0xLX09GX0RFQ0xBUkUoY2xrZ2VuYV9jNjVfcGxscywKLQkgICAgICAgInN0LGNsa2dlbmEtcGxscy1jNjUiLCBjbGtnZW5hX2M2NV9wbGxfc2V0dXApOwotCiBzdGF0aWMgc3RydWN0IGNsayAqIF9faW5pdCBjbGtnZW5fb2RmX3JlZ2lzdGVyKGNvbnN0IGNoYXIgKnBhcmVudF9uYW1lLAogCQkJCQkgICAgICAgdm9pZCBfX2lvbWVtICpyZWcsCiAJCQkJCSAgICAgICBzdHJ1Y3QgY2xrZ2VuX3BsbF9kYXRhICpwbGxfZGF0YSwKQEAgLTEwNDIsNzIgKzcwMiwxNyBAQAogCXJldHVybiBjbGs7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGMzMl9wbGxfb2ZfbWF0Y2hbXSA9IHsKLQl7Ci0JCS5jb21wYXRpYmxlID0gInN0LHBsbHMtYzMyLWExeC0wIiwKLQkJLmRhdGEgPSAmc3RfcGxsMzIwMGMzMl9hMXhfMCwKLQl9LAotCXsKLQkJLmNvbXBhdGlibGUgPSAic3QscGxscy1jMzItYTF4LTEiLAotCQkuZGF0YSA9ICZzdF9wbGwzMjAwYzMyX2ExeF8xLAotCX0sCi0JewotCQkuY29tcGF0aWJsZSA9ICJzdCxzdGloNDE1LXBsbHMtYzMyLWE5IiwKLQkJLmRhdGEgPSAmc3RfcGxsMzIwMGMzMl9hOV80MTUsCi0JfSwKLQl7Ci0JCS5jb21wYXRpYmxlID0gInN0LHN0aWg0MTUtcGxscy1jMzItZGRyIiwKLQkJLmRhdGEgPSAmc3RfcGxsMzIwMGMzMl9kZHJfNDE1LAotCX0sCi0JewotCQkuY29tcGF0aWJsZSA9ICJzdCxzdGloNDE2LXBsbHMtYzMyLWE5IiwKLQkJLmRhdGEgPSAmc3RfcGxsMzIwMGMzMl9hOV80MTYsCi0JfSwKLQl7Ci0JCS5jb21wYXRpYmxlID0gInN0LHN0aWg0MTYtcGxscy1jMzItZGRyIiwKLQkJLmRhdGEgPSAmc3RfcGxsMzIwMGMzMl9kZHJfNDE2LAotCX0sCi0JewotCQkuY29tcGF0aWJsZSA9ICJzdCxzdGloNDA3LXBsbHMtYzMyLWEwIiwKLQkJLmRhdGEgPSAmc3RfcGxsMzIwMGMzMl80MDdfYTAsCi0JfSwKLQl7Ci0JCS5jb21wYXRpYmxlID0gInN0LHBsbHMtYzMyLWN4XzAiLAotCQkuZGF0YSA9ICZzdF9wbGwzMjAwYzMyX2N4XzAsCi0JfSwKLQl7Ci0JCS5jb21wYXRpYmxlID0gInN0LHBsbHMtYzMyLWN4XzEiLAotCQkuZGF0YSA9ICZzdF9wbGwzMjAwYzMyX2N4XzEsCi0JfSwKLQl7Ci0JCS5jb21wYXRpYmxlID0gInN0LHN0aWg0MDctcGxscy1jMzItYTkiLAotCQkuZGF0YSA9ICZzdF9wbGwzMjAwYzMyXzQwN19hOSwKLQl9LAotCXsKLQkJLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxOC1wbGxzLWMyOC1hOSIsCi0JCS5kYXRhID0gJnN0X3BsbDQ2MDBjMjhfNDE4X2E5LAotCX0sCi0Je30KLX07CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBjbGtnZW5fYzMyX3BsbF9zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQorc3RhdGljIHZvaWQgX19pbml0IGNsa2dlbl9jMzJfcGxsX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCXN0cnVjdCBjbGtnZW5fcGxsX2RhdGEgKmRhdGEpCiB7Ci0JY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CiAJc3RydWN0IGNsayAqY2xrOwogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lLCAqcGxsX25hbWU7CiAJdm9pZCBfX2lvbWVtICpwbGxfYmFzZTsKIAlpbnQgbnVtX29kZnMsIG9kZjsKIAlzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSAqY2xrX2RhdGE7Ci0Jc3RydWN0IGNsa2dlbl9wbGxfZGF0YQkqZGF0YTsKIAl1bnNpZ25lZCBsb25nIHBsbF9mbGFncyA9IDA7CiAKLQltYXRjaCA9IG9mX21hdGNoX25vZGUoYzMyX3BsbF9vZl9tYXRjaCwgbnApOwotCWlmICghbWF0Y2gpIHsKLQkJcHJfZXJyKCIlczogTm8gbWF0Y2hpbmcgZGF0YVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JZGF0YSA9IChzdHJ1Y3QgY2xrZ2VuX3BsbF9kYXRhICopIG1hdGNoLT5kYXRhOwogCiAJcGFyZW50X25hbWUgPSBvZl9jbGtfZ2V0X3BhcmVudF9uYW1lKG5wLCAwKTsKIAlpZiAoIXBhcmVudF9uYW1lKQpAQCAtMTE2Niw1OSArNzcxLDMwIEBACiAJa2ZyZWUoY2xrX2RhdGEtPmNsa3MpOwogCWtmcmVlKGNsa19kYXRhKTsKIH0KLUNMS19PRl9ERUNMQVJFKGNsa2dlbl9jMzJfcGxsLCAic3QsY2xrZ2VuLXBsbHMtYzMyIiwgY2xrZ2VuX2MzMl9wbGxfc2V0dXApOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBjMzJfZ3B1X3BsbF9vZl9tYXRjaFtdID0gewotCXsKLQkJLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNS1ncHUtcGxsLWMzMiIsCi0JCS5kYXRhID0gJnN0X3BsbDEyMDBjMzJfZ3B1XzQxNSwKLQl9LAotCXsKLQkJLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNi1ncHUtcGxsLWMzMiIsCi0JCS5kYXRhID0gJnN0X3BsbDEyMDBjMzJfZ3B1XzQxNiwKLQl9LAotCXt9Ci19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgY2xrZ2VuZ3B1X2MzMl9wbGxfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3N0YXRpYyB2b2lkIF9faW5pdCBjbGtnZW5fYzMyX3BsbDBfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKLQlzdHJ1Y3QgY2xrICpjbGs7Ci0JY29uc3QgY2hhciAqcGFyZW50X25hbWU7Ci0Jdm9pZCBfX2lvbWVtICpyZWc7Ci0JY29uc3QgY2hhciAqY2xrX25hbWU7Ci0Jc3RydWN0IGNsa2dlbl9wbGxfZGF0YQkqZGF0YTsKLQotCW1hdGNoID0gb2ZfbWF0Y2hfbm9kZShjMzJfZ3B1X3BsbF9vZl9tYXRjaCwgbnApOwotCWlmICghbWF0Y2gpIHsKLQkJcHJfZXJyKCIlczogTm8gbWF0Y2hpbmcgZGF0YVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JZGF0YSA9IChzdHJ1Y3QgY2xrZ2VuX3BsbF9kYXRhICopbWF0Y2gtPmRhdGE7Ci0KLQlwYXJlbnRfbmFtZSA9IG9mX2Nsa19nZXRfcGFyZW50X25hbWUobnAsIDApOwotCWlmICghcGFyZW50X25hbWUpCi0JCXJldHVybjsKLQotCXJlZyA9IGNsa2dlbl9nZXRfcmVnaXN0ZXJfYmFzZShucCk7Ci0JaWYgKCFyZWcpCi0JCXJldHVybjsKLQotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleChucCwgImNsb2NrLW91dHB1dC1uYW1lcyIsCi0JCQkJCSAgMCwgJmNsa19uYW1lKSkKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBQTEwgMTIwME1IeiBvdXRwdXQKLQkgKi8KLQljbGsgPSBjbGtnZW5fcGxsX3JlZ2lzdGVyKHBhcmVudF9uYW1lLCBkYXRhLCByZWcsCi0JCQkJICAwLCBjbGtfbmFtZSwgZGF0YS0+bG9jayk7Ci0KLQlpZiAoIUlTX0VSUihjbGspKQotCQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7Ci0KLQlyZXR1cm47CisJY2xrZ2VuX2MzMl9wbGxfc2V0dXAobnAsCisJCQkoc3RydWN0IGNsa2dlbl9wbGxfZGF0YSAqKSAmc3RfcGxsMzIwMGMzMl9jeF8wKTsKIH0KLUNMS19PRl9ERUNMQVJFKGNsa2dlbmdwdV9jMzJfcGxsLAotCSAgICAgICAic3QsY2xrZ2VuZ3B1LXBsbC1jMzIiLCBjbGtnZW5ncHVfYzMyX3BsbF9zZXR1cCk7CitDTEtfT0ZfREVDTEFSRShjMzJfcGxsMCwgInN0LGNsa2dlbi1wbGwwIiwgY2xrZ2VuX2MzMl9wbGwwX3NldHVwKTsKKworc3RhdGljIHZvaWQgX19pbml0IGNsa2dlbl9jMzJfcGxsMV9zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCWNsa2dlbl9jMzJfcGxsX3NldHVwKG5wLAorCQkJKHN0cnVjdCBjbGtnZW5fcGxsX2RhdGEgKikgJnN0X3BsbDMyMDBjMzJfY3hfMSk7Cit9CitDTEtfT0ZfREVDTEFSRShjMzJfcGxsMSwgInN0LGNsa2dlbi1wbGwxIiwgY2xrZ2VuX2MzMl9wbGwxX3NldHVwKTsKKworc3RhdGljIHZvaWQgX19pbml0IGNsa2dlbl9jMzJfcGxsYTlfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwljbGtnZW5fYzMyX3BsbF9zZXR1cChucCwKKwkJCShzdHJ1Y3QgY2xrZ2VuX3BsbF9kYXRhICopICZzdF9wbGwzMjAwYzMyXzQwN19hOSk7Cit9CitDTEtfT0ZfREVDTEFSRShjMzJfcGxsYTksICJzdCxzdGloNDA3LWNsa2dlbi1wbGxhOSIsIGNsa2dlbl9jMzJfcGxsYTlfc2V0dXApOworCitzdGF0aWMgdm9pZCBfX2luaXQgY2xrZ2VuX2MyOF9wbGxhOV9zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCWNsa2dlbl9jMzJfcGxsX3NldHVwKG5wLAorCQkJKHN0cnVjdCBjbGtnZW5fcGxsX2RhdGEgKikgJnN0X3BsbDQ2MDBjMjhfNDE4X2E5KTsKK30KK0NMS19PRl9ERUNMQVJFKGMyOF9wbGxhOSwgInN0LHN0aWg0MTgtY2xrZ2VuLXBsbGE5IiwgY2xrZ2VuX2MyOF9wbGxhOV9zZXR1cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9LY29uZmlnIGIvZHJpdmVycy9jbGsvc3VueGktbmcvS2NvbmZpZwppbmRleCAyYWZjYmQzLi4yNTRkOTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL0tjb25maWcKQEAgLTEsNSArMSw2IEBACiBjb25maWcgU1VOWElfQ0NVCiAJYm9vbCAiQ2xvY2sgc3VwcG9ydCBmb3IgQWxsd2lubmVyIFNvQ3MiCisJZGVwZW5kcyBvbiBBUkNIX1NVTlhJIHx8IENPTVBJTEVfVEVTVAogCWRlZmF1bHQgQVJDSF9TVU5YSQogCiBpZiBTVU5YSV9DQ1UKQEAgLTE5LDYgKzIwLDEwIEBACiBjb25maWcgU1VOWElfQ0NVX01VWAogCWJvb2wKIAorY29uZmlnIFNVTlhJX0NDVV9NVUxUCisJYm9vbAorCXNlbGVjdCBTVU5YSV9DQ1VfTVVYCisKIGNvbmZpZyBTVU5YSV9DQ1VfUEhBU0UKIAlib29sCiAKQEAgLTUxLDYgKzU2LDQwIEBACiAKICMgU29DIERyaXZlcnMKIAorY29uZmlnIFNVTjZJX0EzMV9DQ1UKKwlib29sICJTdXBwb3J0IGZvciB0aGUgQWxsd2lubmVyIEEzMS9BMzFzIENDVSIKKwlzZWxlY3QgU1VOWElfQ0NVX0RJVgorCXNlbGVjdCBTVU5YSV9DQ1VfTksKKwlzZWxlY3QgU1VOWElfQ0NVX05LTQorCXNlbGVjdCBTVU5YSV9DQ1VfTk0KKwlzZWxlY3QgU1VOWElfQ0NVX01QCisJc2VsZWN0IFNVTlhJX0NDVV9QSEFTRQorCWRlZmF1bHQgTUFDSF9TVU42SQorCitjb25maWcgU1VOOElfQTIzX0NDVQorCWJvb2wgIlN1cHBvcnQgZm9yIHRoZSBBbGx3aW5uZXIgQTIzIENDVSIKKwlzZWxlY3QgU1VOWElfQ0NVX0RJVgorCXNlbGVjdCBTVU5YSV9DQ1VfTVVMVAorCXNlbGVjdCBTVU5YSV9DQ1VfTksKKwlzZWxlY3QgU1VOWElfQ0NVX05LTQorCXNlbGVjdCBTVU5YSV9DQ1VfTktNUAorCXNlbGVjdCBTVU5YSV9DQ1VfTk0KKwlzZWxlY3QgU1VOWElfQ0NVX01QCisJc2VsZWN0IFNVTlhJX0NDVV9QSEFTRQorCWRlZmF1bHQgTUFDSF9TVU44SQorCitjb25maWcgU1VOOElfQTMzX0NDVQorCWJvb2wgIlN1cHBvcnQgZm9yIHRoZSBBbGx3aW5uZXIgQTMzIENDVSIKKwlzZWxlY3QgU1VOWElfQ0NVX0RJVgorCXNlbGVjdCBTVU5YSV9DQ1VfTVVMVAorCXNlbGVjdCBTVU5YSV9DQ1VfTksKKwlzZWxlY3QgU1VOWElfQ0NVX05LTQorCXNlbGVjdCBTVU5YSV9DQ1VfTktNUAorCXNlbGVjdCBTVU5YSV9DQ1VfTk0KKwlzZWxlY3QgU1VOWElfQ0NVX01QCisJc2VsZWN0IFNVTlhJX0NDVV9QSEFTRQorCWRlZmF1bHQgTUFDSF9TVU44SQorCiBjb25maWcgU1VOOElfSDNfQ0NVCiAJYm9vbCAiU3VwcG9ydCBmb3IgdGhlIEFsbHdpbm5lciBIMyBDQ1UiCiAJc2VsZWN0IFNVTlhJX0NDVV9ESVYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL01ha2VmaWxlIGIvZHJpdmVycy9jbGsvc3VueGktbmcvTWFrZWZpbGUKaW5kZXggNjMzY2U2NC4uMTA2Y2JhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvc3VueGktbmcvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jbGsvc3VueGktbmcvTWFrZWZpbGUKQEAgLTcsNiArNyw3IEBACiBvYmotJChDT05GSUdfU1VOWElfQ0NVX0ZSQUMpCSs9IGNjdV9mcmFjLm8KIG9iai0kKENPTkZJR19TVU5YSV9DQ1VfR0FURSkJKz0gY2N1X2dhdGUubwogb2JqLSQoQ09ORklHX1NVTlhJX0NDVV9NVVgpCSs9IGNjdV9tdXgubworb2JqLSQoQ09ORklHX1NVTlhJX0NDVV9NVUxUKQkrPSBjY3VfbXVsdC5vCiBvYmotJChDT05GSUdfU1VOWElfQ0NVX1BIQVNFKQkrPSBjY3VfcGhhc2UubwogCiAjIE11bHRpLWZhY3RvciBjbG9ja3MKQEAgLTE3LDQgKzE4LDcgQEAKIG9iai0kKENPTkZJR19TVU5YSV9DQ1VfTVApCSs9IGNjdV9tcC5vCiAKICMgU29DIHN1cHBvcnQKK29iai0kKENPTkZJR19TVU42SV9BMzFfQ0NVKQkrPSBjY3Utc3VuNmktYTMxLm8KK29iai0kKENPTkZJR19TVU44SV9BMjNfQ0NVKQkrPSBjY3Utc3VuOGktYTIzLm8KK29iai0kKENPTkZJR19TVU44SV9BMzNfQ0NVKQkrPSBjY3Utc3VuOGktYTMzLm8KIG9iai0kKENPTkZJR19TVU44SV9IM19DQ1UpCSs9IGNjdS1zdW44aS1oMy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuNmktYTMxLmMgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuNmktYTMxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk1OTY0NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW42aS1hMzEuYwpAQCAtMCwwICsxLDEyMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ2hlbi1ZdSBUc2FpCisgKgorICogQ2hlbi1ZdSBUc2FpIDx3ZW5zQGNzaWUub3JnPgorICoKKyAqIEJhc2VkIG9uIGNjdS1zdW44aS1oMy5jIGJ5IE1heGltZSBSaXBhcmQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorCisjaW5jbHVkZSAiY2N1X2NvbW1vbi5oIgorI2luY2x1ZGUgImNjdV9yZXNldC5oIgorCisjaW5jbHVkZSAiY2N1X2Rpdi5oIgorI2luY2x1ZGUgImNjdV9nYXRlLmgiCisjaW5jbHVkZSAiY2N1X21wLmgiCisjaW5jbHVkZSAiY2N1X211bHQuaCIKKyNpbmNsdWRlICJjY3VfbXV4LmgiCisjaW5jbHVkZSAiY2N1X25rLmgiCisjaW5jbHVkZSAiY2N1X25rbS5oIgorI2luY2x1ZGUgImNjdV9ua21wLmgiCisjaW5jbHVkZSAiY2N1X25tLmgiCisjaW5jbHVkZSAiY2N1X3BoYXNlLmgiCisKKyNpbmNsdWRlICJjY3Utc3VuNmktYTMxLmgiCisKK3N0YXRpYyBTVU5YSV9DQ1VfTktNX1dJVEhfR0FURV9MT0NLKHBsbF9jcHVfY2xrLCAicGxsLWNwdSIsCisJCQkJICAgICAib3NjMjRNIiwgMHgwMDAsCisJCQkJICAgICA4LCA1LAkvKiBOICovCisJCQkJICAgICA0LCAyLAkvKiBLICovCisJCQkJICAgICAwLCAyLAkvKiBNICovCisJCQkJICAgICBCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJICAgICBCSVQoMjgpLAkvKiBsb2NrICovCisJCQkJICAgICAwKTsKKworLyoKKyAqIFRoZSBBdWRpbyBQTEwgaXMgc3VwcG9zZWQgdG8gaGF2ZSA0IG91dHB1dHM6IDMgZml4ZWQgZmFjdG9ycyBmcm9tCisgKiB0aGUgYmFzZSAoMngsIDR4IGFuZCA4eCksIGFuZCBvbmUgdmFyaWFibGUgZGl2aWRlciAodGhlIG9uZSB0cnVlCisgKiBwbGwgYXVkaW8pLgorICoKKyAqIFdlIGRvbid0IGhhdmUgYW55IG5lZWQgZm9yIHRoZSB2YXJpYWJsZSBkaXZpZGVyIGZvciBub3csIHNvIHdlIGp1c3QKKyAqIGhhcmRjb2RlIGl0IHRvIG1hdGNoIHdpdGggdGhlIGNsb2NrIG5hbWVzCisgKi8KKyNkZWZpbmUgU1VONklfQTMxX1BMTF9BVURJT19SRUcJMHgwMDgKKworc3RhdGljIFNVTlhJX0NDVV9OTV9XSVRIX0dBVEVfTE9DSyhwbGxfYXVkaW9fYmFzZV9jbGssICJwbGwtYXVkaW8tYmFzZSIsCisJCQkJICAgIm9zYzI0TSIsIDB4MDA4LAorCQkJCSAgIDgsIDcsCS8qIE4gKi8KKwkJCQkgICAwLCA1LAkvKiBNICovCisJCQkJICAgQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCSAgIEJJVCgyOCksCS8qIGxvY2sgKi8KKwkJCQkgICBDTEtfU0VUX1JBVEVfVU5HQVRFKTsKKworc3RhdGljIFNVTlhJX0NDVV9OTV9XSVRIX0ZSQUNfR0FURV9MT0NLKHBsbF92aWRlbzBfY2xrLCAicGxsLXZpZGVvMCIsCisJCQkJCSJvc2MyNE0iLCAweDAxMCwKKwkJCQkJOCwgNywJCS8qIE4gKi8KKwkJCQkJMCwgNCwJCS8qIE0gKi8KKwkJCQkJQklUKDI0KSwJLyogZnJhYyBlbmFibGUgKi8KKwkJCQkJQklUKDI1KSwJLyogZnJhYyBzZWxlY3QgKi8KKwkJCQkJMjcwMDAwMDAwLAkvKiBmcmFjIHJhdGUgMCAqLworCQkJCQkyOTcwMDAwMDAsCS8qIGZyYWMgcmF0ZSAxICovCisJCQkJCUJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkJQklUKDI4KSwJLyogbG9jayAqLworCQkJCQlDTEtfU0VUX1JBVEVfVU5HQVRFKTsKKworc3RhdGljIFNVTlhJX0NDVV9OTV9XSVRIX0ZSQUNfR0FURV9MT0NLKHBsbF92ZV9jbGssICJwbGwtdmUiLAorCQkJCQkib3NjMjRNIiwgMHgwMTgsCisJCQkJCTgsIDcsCQkvKiBOICovCisJCQkJCTAsIDQsCQkvKiBNICovCisJCQkJCUJJVCgyNCksCS8qIGZyYWMgZW5hYmxlICovCisJCQkJCUJJVCgyNSksCS8qIGZyYWMgc2VsZWN0ICovCisJCQkJCTI3MDAwMDAwMCwJLyogZnJhYyByYXRlIDAgKi8KKwkJCQkJMjk3MDAwMDAwLAkvKiBmcmFjIHJhdGUgMSAqLworCQkJCQlCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJCUJJVCgyOCksCS8qIGxvY2sgKi8KKwkJCQkJQ0xLX1NFVF9SQVRFX1VOR0FURSk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTktNX1dJVEhfR0FURV9MT0NLKHBsbF9kZHJfY2xrLCAicGxsLWRkciIsCisJCQkJICAgICJvc2MyNE0iLCAweDAyMCwKKwkJCQkgICAgOCwgNSwJLyogTiAqLworCQkJCSAgICA0LCAyLAkvKiBLICovCisJCQkJICAgIDAsIDIsCS8qIE0gKi8KKwkJCQkgICAgQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCSAgICBCSVQoMjgpLAkvKiBsb2NrICovCisJCQkJICAgIENMS19TRVRfUkFURV9VTkdBVEUpOworCitzdGF0aWMgU1VOWElfQ0NVX05LX1dJVEhfR0FURV9MT0NLX1BPU1RESVYocGxsX3BlcmlwaF9jbGssICJwbGwtcGVyaXBoIiwKKwkJCQkJICAgIm9zYzI0TSIsIDB4MDI4LAorCQkJCQkgICA4LCA1LAkvKiBOICovCisJCQkJCSAgIDQsIDIsCS8qIEsgKi8KKwkJCQkJICAgQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCQkgICBCSVQoMjgpLAkvKiBsb2NrICovCisJCQkJCSAgIDIsCQkvKiBwb3N0LWRpdiAqLworCQkJCQkgICBDTEtfU0VUX1JBVEVfVU5HQVRFKTsKKworc3RhdGljIFNVTlhJX0NDVV9OTV9XSVRIX0ZSQUNfR0FURV9MT0NLKHBsbF92aWRlbzFfY2xrLCAicGxsLXZpZGVvMSIsCisJCQkJCSJvc2MyNE0iLCAweDAzMCwKKwkJCQkJOCwgNywJCS8qIE4gKi8KKwkJCQkJMCwgNCwJCS8qIE0gKi8KKwkJCQkJQklUKDI0KSwJLyogZnJhYyBlbmFibGUgKi8KKwkJCQkJQklUKDI1KSwJLyogZnJhYyBzZWxlY3QgKi8KKwkJCQkJMjcwMDAwMDAwLAkvKiBmcmFjIHJhdGUgMCAqLworCQkJCQkyOTcwMDAwMDAsCS8qIGZyYWMgcmF0ZSAxICovCisJCQkJCUJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkJQklUKDI4KSwJLyogbG9jayAqLworCQkJCQlDTEtfU0VUX1JBVEVfVU5HQVRFKTsKKworc3RhdGljIFNVTlhJX0NDVV9OTV9XSVRIX0ZSQUNfR0FURV9MT0NLKHBsbF9ncHVfY2xrLCAicGxsLWdwdSIsCisJCQkJCSJvc2MyNE0iLCAweDAzOCwKKwkJCQkJOCwgNywJCS8qIE4gKi8KKwkJCQkJMCwgNCwJCS8qIE0gKi8KKwkJCQkJQklUKDI0KSwJLyogZnJhYyBlbmFibGUgKi8KKwkJCQkJQklUKDI1KSwJLyogZnJhYyBzZWxlY3QgKi8KKwkJCQkJMjcwMDAwMDAwLAkvKiBmcmFjIHJhdGUgMCAqLworCQkJCQkyOTcwMDAwMDAsCS8qIGZyYWMgcmF0ZSAxICovCisJCQkJCUJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkJQklUKDI4KSwJLyogbG9jayAqLworCQkJCQlDTEtfU0VUX1JBVEVfVU5HQVRFKTsKKworLyoKKyAqIFRoZSBNSVBJIFBMTCBoYXMgMiBtb2RlczogIk1JUEkiIGFuZCAiSERNSSIuCisgKgorICogVGhlIE1JUEkgbW9kZSBpcyBhIHN0YW5kYXJkIE5LTS1zdHlsZSBjbG9jay4gVGhlIEhETUkgbW9kZSBpcyBhbgorICogaW50ZWdlciAvIGZyYWN0aW9uYWwgY2xvY2sgd2l0aCBzd2l0Y2hhYmxlIG11bHRpcGxpZXJzIGFuZCBkaXZpZGVycy4KKyAqIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBoZXJlLiBXZSBoYXJkY29kZSB0aGUgUExMIHRvIE1JUEkgbW9kZS4KKyAqLworI2RlZmluZSBTVU42SV9BMzFfUExMX01JUElfUkVHCTB4MDQwCisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGxsX21pcGlfcGFyZW50c1tdID0geyAicGxsLXZpZGVvMCIsICJwbGwtdmlkZW8xIiB9Oworc3RhdGljIFNVTlhJX0NDVV9OS01fV0lUSF9NVVhfR0FURV9MT0NLKHBsbF9taXBpX2NsaywgInBsbC1taXBpIiwKKwkJCQkJcGxsX21pcGlfcGFyZW50cywgMHgwNDAsCisJCQkJCTgsIDQsCS8qIE4gKi8KKwkJCQkJNCwgMiwJLyogSyAqLworCQkJCQkwLCA0LAkvKiBNICovCisJCQkJCTIxLCAwLAkvKiBtdXggKi8KKwkJCQkJQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCQlCSVQoMjgpLAkvKiBsb2NrICovCisJCQkJCUNMS19TRVRfUkFURV9VTkdBVEUpOworCitzdGF0aWMgU1VOWElfQ0NVX05NX1dJVEhfRlJBQ19HQVRFX0xPQ0socGxsOV9jbGssICJwbGw5IiwKKwkJCQkJIm9zYzI0TSIsIDB4MDQ0LAorCQkJCQk4LCA3LAkJLyogTiAqLworCQkJCQkwLCA0LAkJLyogTSAqLworCQkJCQlCSVQoMjQpLAkvKiBmcmFjIGVuYWJsZSAqLworCQkJCQlCSVQoMjUpLAkvKiBmcmFjIHNlbGVjdCAqLworCQkJCQkyNzAwMDAwMDAsCS8qIGZyYWMgcmF0ZSAwICovCisJCQkJCTI5NzAwMDAwMCwJLyogZnJhYyByYXRlIDEgKi8KKwkJCQkJQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCQlCSVQoMjgpLAkvKiBsb2NrICovCisJCQkJCUNMS19TRVRfUkFURV9VTkdBVEUpOworCitzdGF0aWMgU1VOWElfQ0NVX05NX1dJVEhfRlJBQ19HQVRFX0xPQ0socGxsMTBfY2xrLCAicGxsMTAiLAorCQkJCQkib3NjMjRNIiwgMHgwNDgsCisJCQkJCTgsIDcsCQkvKiBOICovCisJCQkJCTAsIDQsCQkvKiBNICovCisJCQkJCUJJVCgyNCksCS8qIGZyYWMgZW5hYmxlICovCisJCQkJCUJJVCgyNSksCS8qIGZyYWMgc2VsZWN0ICovCisJCQkJCTI3MDAwMDAwMCwJLyogZnJhYyByYXRlIDAgKi8KKwkJCQkJMjk3MDAwMDAwLAkvKiBmcmFjIHJhdGUgMSAqLworCQkJCQlCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJCUJJVCgyOCksCS8qIGxvY2sgKi8KKwkJCQkJQ0xLX1NFVF9SQVRFX1VOR0FURSk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY3B1eF9wYXJlbnRzW10gPSB7ICJvc2MzMmsiLCAib3NjMjRNIiwKKwkJCQkJICAgICAicGxsLWNwdSIsICJwbGwtY3B1IiB9Oworc3RhdGljIFNVTlhJX0NDVV9NVVgoY3B1X2NsaywgImNwdSIsIGNwdXhfcGFyZW50cywKKwkJICAgICAweDA1MCwgMTYsIDIsIENMS19TRVRfUkFURV9QQVJFTlQgfCBDTEtfSVNfQ1JJVElDQUwpOworCitzdGF0aWMgc3RydWN0IGNsa19kaXZfdGFibGUgYXhpX2Rpdl90YWJsZVtdID0geworCXsgLnZhbCA9IDAsIC5kaXYgPSAxIH0sCisJeyAudmFsID0gMSwgLmRpdiA9IDIgfSwKKwl7IC52YWwgPSAyLCAuZGl2ID0gMyB9LAorCXsgLnZhbCA9IDMsIC5kaXYgPSA0IH0sCisJeyAudmFsID0gNCwgLmRpdiA9IDQgfSwKKwl7IC52YWwgPSA1LCAuZGl2ID0gNCB9LAorCXsgLnZhbCA9IDYsIC5kaXYgPSA0IH0sCisJeyAudmFsID0gNywgLmRpdiA9IDQgfSwKKwl7IC8qIFNlbnRpbmVsICovIH0sCit9OworCitzdGF0aWMgU1VOWElfQ0NVX0RJVl9UQUJMRShheGlfY2xrLCAiYXhpIiwgImNwdSIsCisJCQkgICAweDA1MCwgMCwgMywgYXhpX2Rpdl90YWJsZSwgMCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWhiMV9wYXJlbnRzW10gPSB7ICJvc2MzMmsiLCAib3NjMjRNIiwKKwkJCQkJICAgICAiYXhpIiwgInBsbC1wZXJpcGgiIH07CisKK3N0YXRpYyBzdHJ1Y3QgY2N1X2RpdiBhaGIxX2NsayA9IHsKKwkuZGl2CQk9IF9TVU5YSV9DQ1VfRElWX0ZMQUdTKDQsIDIsIENMS19ESVZJREVSX1BPV0VSX09GX1RXTyksCisKKwkubXV4CQk9IHsKKwkJLnNoaWZ0CT0gMTIsCisJCS53aWR0aAk9IDIsCisKKwkJLnZhcmlhYmxlX3ByZWRpdgk9IHsKKwkJCS5pbmRleAk9IDMsCisJCQkuc2hpZnQJPSA2LAorCQkJLndpZHRoCT0gMiwKKwkJfSwKKwl9LAorCisJLmNvbW1vbgkJPSB7CisJCS5yZWcJCT0gMHgwNTQsCisJCS5mZWF0dXJlcwk9IENDVV9GRUFUVVJFX1ZBUklBQkxFX1BSRURJViwKKwkJLmh3LmluaXQJPSBDTEtfSFdfSU5JVF9QQVJFTlRTKCJhaGIxIiwKKwkJCQkJCSAgICAgIGFoYjFfcGFyZW50cywKKwkJCQkJCSAgICAgICZjY3VfZGl2X29wcywKKwkJCQkJCSAgICAgIDApLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19kaXZfdGFibGUgYXBiMV9kaXZfdGFibGVbXSA9IHsKKwl7IC52YWwgPSAwLCAuZGl2ID0gMiB9LAorCXsgLnZhbCA9IDEsIC5kaXYgPSAyIH0sCisJeyAudmFsID0gMiwgLmRpdiA9IDQgfSwKKwl7IC52YWwgPSAzLCAuZGl2ID0gOCB9LAorCXsgLyogU2VudGluZWwgKi8gfSwKK307CisKK3N0YXRpYyBTVU5YSV9DQ1VfRElWX1RBQkxFKGFwYjFfY2xrLCAiYXBiMSIsICJhaGIxIiwKKwkJCSAgIDB4MDU0LCA4LCAyLCBhcGIxX2Rpdl90YWJsZSwgMCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXBiMl9wYXJlbnRzW10gPSB7ICJvc2MzMmsiLCAib3NjMjRNIiwKKwkJCQkJICAgICAicGxsLXBlcmlwaCIsICJwbGwtcGVyaXBoIiB9Oworc3RhdGljIFNVTlhJX0NDVV9NUF9XSVRIX01VWChhcGIyX2NsaywgImFwYjIiLCBhcGIyX3BhcmVudHMsIDB4MDU4LAorCQkJICAgICAwLCA1LAkvKiBNICovCisJCQkgICAgIDE2LCAyLAkvKiBQICovCisJCQkgICAgIDI0LCAyLAkvKiBtdXggKi8KKwkJCSAgICAgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhaGIxX21pcGlkc2lfY2xrLAkiYWhiMS1taXBpZHNpIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDEpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhaGIxX3NzX2NsaywJImFoYjEtc3MiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoNSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFoYjFfZG1hX2NsaywJImFoYjEtZG1hIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDYpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhaGIxX21tYzBfY2xrLAkiYWhiMS1tbWMwIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDgpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhaGIxX21tYzFfY2xrLAkiYWhiMS1tbWMxIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDkpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhaGIxX21tYzJfY2xrLAkiYWhiMS1tbWMyIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDEwKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYWhiMV9tbWMzX2NsaywJImFoYjEtbW1jMyIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCgxMiksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFoYjFfbmFuZDFfY2xrLAkiYWhiMS1uYW5kMSIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCgxMyksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFoYjFfbmFuZDBfY2xrLAkiYWhiMS1uYW5kMCIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCgxMyksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFoYjFfc2RyYW1fY2xrLAkiYWhiMS1zZHJhbSIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCgxNCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFoYjFfZW1hY19jbGssCSJhaGIxLWVtYWMiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoMTcpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhaGIxX3RzX2NsaywJImFoYjEtdHMiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoMTgpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhaGIxX2hzdGltZXJfY2xrLAkiYWhiMS1oc3RpbWVyIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDE5KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYWhiMV9zcGkwX2NsaywJImFoYjEtc3BpMCIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCgyMCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFoYjFfc3BpMV9jbGssCSJhaGIxLXNwaTEiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoMjEpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhaGIxX3NwaTJfY2xrLAkiYWhiMS1zcGkyIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDIyKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYWhiMV9zcGkzX2NsaywJImFoYjEtc3BpMyIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCgyMyksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFoYjFfb3RnX2NsaywJImFoYjEtb3RnIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDI0KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYWhiMV9laGNpMF9jbGssCSJhaGIxLWVoY2kwIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDI2KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYWhiMV9laGNpMV9jbGssCSJhaGIxLWVoY2kxIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDI3KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYWhiMV9vaGNpMF9jbGssCSJhaGIxLW9oY2kwIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDI5KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYWhiMV9vaGNpMV9jbGssCSJhaGIxLW9oY2kxIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDMwKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYWhiMV9vaGNpMl9jbGssCSJhaGIxLW9oY2kyIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDMxKSwgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhaGIxX3ZlX2NsaywJImFoYjEtdmUiLAkiYWhiMSIsCisJCSAgICAgIDB4MDY0LCBCSVQoMCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFoYjFfbGNkMF9jbGssCSJhaGIxLWxjZDAiLAkiYWhiMSIsCisJCSAgICAgIDB4MDY0LCBCSVQoNCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFoYjFfbGNkMV9jbGssCSJhaGIxLWxjZDEiLAkiYWhiMSIsCisJCSAgICAgIDB4MDY0LCBCSVQoNSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFoYjFfY3NpX2NsaywJImFoYjEtY3NpIiwJImFoYjEiLAorCQkgICAgICAweDA2NCwgQklUKDgpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhaGIxX2hkbWlfY2xrLAkiYWhiMS1oZG1pIiwJImFoYjEiLAorCQkgICAgICAweDA2NCwgQklUKDExKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYWhiMV9iZTBfY2xrLAkiYWhiMS1iZTAiLAkiYWhiMSIsCisJCSAgICAgIDB4MDY0LCBCSVQoMTIpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhaGIxX2JlMV9jbGssCSJhaGIxLWJlMSIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjQsIEJJVCgxMyksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFoYjFfZmUwX2NsaywJImFoYjEtZmUwIiwJImFoYjEiLAorCQkgICAgICAweDA2NCwgQklUKDE0KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYWhiMV9mZTFfY2xrLAkiYWhiMS1mZTEiLAkiYWhiMSIsCisJCSAgICAgIDB4MDY0LCBCSVQoMTUpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhaGIxX21wX2NsaywJImFoYjEtbXAiLAkiYWhiMSIsCisJCSAgICAgIDB4MDY0LCBCSVQoMTgpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhaGIxX2dwdV9jbGssCSJhaGIxLWdwdSIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjQsIEJJVCgyMCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFoYjFfZGV1MF9jbGssCSJhaGIxLWRldTAiLAkiYWhiMSIsCisJCSAgICAgIDB4MDY0LCBCSVQoMjMpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhaGIxX2RldTFfY2xrLAkiYWhiMS1kZXUxIiwJImFoYjEiLAorCQkgICAgICAweDA2NCwgQklUKDI0KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYWhiMV9kcmMwX2NsaywJImFoYjEtZHJjMCIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjQsIEJJVCgyNSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFoYjFfZHJjMV9jbGssCSJhaGIxLWRyYzEiLAkiYWhiMSIsCisJCSAgICAgIDB4MDY0LCBCSVQoMjYpLCAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFwYjFfY29kZWNfY2xrLAkiYXBiMS1jb2RlYyIsCSJhcGIxIiwKKwkJICAgICAgMHgwNjgsIEJJVCgwKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYXBiMV9zcGRpZl9jbGssCSJhcGIxLXNwZGlmIiwJImFwYjEiLAorCQkgICAgICAweDA2OCwgQklUKDEpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhcGIxX2RpZ2l0YWxfbWljX2NsaywJImFwYjEtZGlnaXRhbC1taWMiLAkiYXBiMSIsCisJCSAgICAgIDB4MDY4LCBCSVQoNCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGFwYjFfcGlvX2NsaywJImFwYjEtcGlvIiwJImFwYjEiLAorCQkgICAgICAweDA2OCwgQklUKDUpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhcGIxX2RhdWRpbzBfY2xrLAkiYXBiMS1kYXVkaW8wIiwJImFwYjEiLAorCQkgICAgICAweDA2OCwgQklUKDEyKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYXBiMV9kYXVkaW8xX2NsaywJImFwYjEtZGF1ZGlvMSIsCSJhcGIxIiwKKwkJICAgICAgMHgwNjgsIEJJVCgxMyksIDApOworCitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYXBiMl9pMmMwX2NsaywJImFwYjItaTJjMCIsCSJhcGIyIiwKKwkJICAgICAgMHgwNmMsIEJJVCgwKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYXBiMl9pMmMxX2NsaywJImFwYjItaTJjMSIsCSJhcGIyIiwKKwkJICAgICAgMHgwNmMsIEJJVCgxKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYXBiMl9pMmMyX2NsaywJImFwYjItaTJjMiIsCSJhcGIyIiwKKwkJICAgICAgMHgwNmMsIEJJVCgyKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYXBiMl9pMmMzX2NsaywJImFwYjItaTJjMyIsCSJhcGIyIiwKKwkJICAgICAgMHgwNmMsIEJJVCgzKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYXBiMl91YXJ0MF9jbGssCSJhcGIyLXVhcnQwIiwJImFwYjIiLAorCQkgICAgICAweDA2YywgQklUKDE2KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYXBiMl91YXJ0MV9jbGssCSJhcGIyLXVhcnQxIiwJImFwYjIiLAorCQkgICAgICAweDA2YywgQklUKDE3KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYXBiMl91YXJ0Ml9jbGssCSJhcGIyLXVhcnQyIiwJImFwYjIiLAorCQkgICAgICAweDA2YywgQklUKDE4KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYXBiMl91YXJ0M19jbGssCSJhcGIyLXVhcnQzIiwJImFwYjIiLAorCQkgICAgICAweDA2YywgQklUKDE5KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYXBiMl91YXJ0NF9jbGssCSJhcGIyLXVhcnQ0IiwJImFwYjIiLAorCQkgICAgICAweDA2YywgQklUKDIwKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYXBiMl91YXJ0NV9jbGssCSJhcGIyLXVhcnQ1IiwJImFwYjIiLAorCQkgICAgICAweDA2YywgQklUKDIxKSwgMCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbW9kMF9kZWZhdWx0X3BhcmVudHNbXSA9IHsgIm9zYzI0TSIsICJwbGwtcGVyaXBoIiB9Oworc3RhdGljIFNVTlhJX0NDVV9NUF9XSVRIX01VWF9HQVRFKG5hbmQwX2NsaywgIm5hbmQwIiwgbW9kMF9kZWZhdWx0X3BhcmVudHMsCisJCQkJICAweDA4MCwKKwkJCQkgIDAsIDQsCQkvKiBNICovCisJCQkJICAxNiwgMiwJLyogUCAqLworCQkJCSAgMjQsIDIsCS8qIG11eCAqLworCQkJCSAgQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCSAgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTVBfV0lUSF9NVVhfR0FURShuYW5kMV9jbGssICJuYW5kMSIsIG1vZDBfZGVmYXVsdF9wYXJlbnRzLAorCQkJCSAgMHgwODQsCisJCQkJICAwLCA0LAkJLyogTSAqLworCQkJCSAgMTYsIDIsCS8qIFAgKi8KKwkJCQkgIDI0LCAyLAkvKiBtdXggKi8KKwkJCQkgIEJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkgIDApOworCitzdGF0aWMgU1VOWElfQ0NVX01QX1dJVEhfTVVYX0dBVEUobW1jMF9jbGssICJtbWMwIiwgbW9kMF9kZWZhdWx0X3BhcmVudHMsCisJCQkJICAweDA4OCwKKwkJCQkgIDAsIDQsCQkvKiBNICovCisJCQkJICAxNiwgMiwJLyogUCAqLworCQkJCSAgMjQsIDIsCS8qIG11eCAqLworCQkJCSAgQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCSAgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfUEhBU0UobW1jMF9zYW1wbGVfY2xrLCAibW1jMF9zYW1wbGUiLCAibW1jMCIsCisJCSAgICAgICAweDA4OCwgMjAsIDMsIDApOworc3RhdGljIFNVTlhJX0NDVV9QSEFTRShtbWMwX291dHB1dF9jbGssICJtbWMwX291dHB1dCIsICJtbWMwIiwKKwkJICAgICAgIDB4MDg4LCA4LCAzLCAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9NUF9XSVRIX01VWF9HQVRFKG1tYzFfY2xrLCAibW1jMSIsIG1vZDBfZGVmYXVsdF9wYXJlbnRzLAorCQkJCSAgMHgwOGMsCisJCQkJICAwLCA0LAkJLyogTSAqLworCQkJCSAgMTYsIDIsCS8qIFAgKi8KKwkJCQkgIDI0LCAyLAkvKiBtdXggKi8KKwkJCQkgIEJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkgIDApOworCitzdGF0aWMgU1VOWElfQ0NVX1BIQVNFKG1tYzFfc2FtcGxlX2NsaywgIm1tYzFfc2FtcGxlIiwgIm1tYzEiLAorCQkgICAgICAgMHgwOGMsIDIwLCAzLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfUEhBU0UobW1jMV9vdXRwdXRfY2xrLCAibW1jMV9vdXRwdXQiLCAibW1jMSIsCisJCSAgICAgICAweDA4YywgOCwgMywgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTVBfV0lUSF9NVVhfR0FURShtbWMyX2NsaywgIm1tYzIiLCBtb2QwX2RlZmF1bHRfcGFyZW50cywKKwkJCQkgIDB4MDkwLAorCQkJCSAgMCwgNCwJCS8qIE0gKi8KKwkJCQkgIDE2LCAyLAkvKiBQICovCisJCQkJICAyNCwgMiwJLyogbXV4ICovCisJCQkJICBCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJICAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9QSEFTRShtbWMyX3NhbXBsZV9jbGssICJtbWMyX3NhbXBsZSIsICJtbWMyIiwKKwkJICAgICAgIDB4MDkwLCAyMCwgMywgMCk7CitzdGF0aWMgU1VOWElfQ0NVX1BIQVNFKG1tYzJfb3V0cHV0X2NsaywgIm1tYzJfb3V0cHV0IiwgIm1tYzIiLAorCQkgICAgICAgMHgwOTAsIDgsIDMsIDApOworCitzdGF0aWMgU1VOWElfQ0NVX01QX1dJVEhfTVVYX0dBVEUobW1jM19jbGssICJtbWMzIiwgbW9kMF9kZWZhdWx0X3BhcmVudHMsCisJCQkJICAweDA5NCwKKwkJCQkgIDAsIDQsCQkvKiBNICovCisJCQkJICAxNiwgMiwJLyogUCAqLworCQkJCSAgMjQsIDIsCS8qIG11eCAqLworCQkJCSAgQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCSAgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfUEhBU0UobW1jM19zYW1wbGVfY2xrLCAibW1jM19zYW1wbGUiLCAibW1jMyIsCisJCSAgICAgICAweDA5NCwgMjAsIDMsIDApOworc3RhdGljIFNVTlhJX0NDVV9QSEFTRShtbWMzX291dHB1dF9jbGssICJtbWMzX291dHB1dCIsICJtbWMzIiwKKwkJICAgICAgIDB4MDk0LCA4LCAzLCAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9NUF9XSVRIX01VWF9HQVRFKHRzX2NsaywgInRzIiwgbW9kMF9kZWZhdWx0X3BhcmVudHMsIDB4MDk4LAorCQkJCSAgMCwgNCwJCS8qIE0gKi8KKwkJCQkgIDE2LCAyLAkvKiBQICovCisJCQkJICAyNCwgMiwJLyogbXV4ICovCisJCQkJICBCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJICAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9NUF9XSVRIX01VWF9HQVRFKHNzX2NsaywgInNzIiwgbW9kMF9kZWZhdWx0X3BhcmVudHMsIDB4MDljLAorCQkJCSAgMCwgNCwJCS8qIE0gKi8KKwkJCQkgIDE2LCAyLAkvKiBQICovCisJCQkJICAyNCwgMiwJLyogbXV4ICovCisJCQkJICBCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJICAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9NUF9XSVRIX01VWF9HQVRFKHNwaTBfY2xrLCAic3BpMCIsIG1vZDBfZGVmYXVsdF9wYXJlbnRzLCAweDBhMCwKKwkJCQkgIDAsIDQsCQkvKiBNICovCisJCQkJICAxNiwgMiwJLyogUCAqLworCQkJCSAgMjQsIDIsCS8qIG11eCAqLworCQkJCSAgQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCSAgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTVBfV0lUSF9NVVhfR0FURShzcGkxX2NsaywgInNwaTEiLCBtb2QwX2RlZmF1bHRfcGFyZW50cywgMHgwYTQsCisJCQkJICAwLCA0LAkJLyogTSAqLworCQkJCSAgMTYsIDIsCS8qIFAgKi8KKwkJCQkgIDI0LCAyLAkvKiBtdXggKi8KKwkJCQkgIEJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkgIDApOworc3RhdGljIFNVTlhJX0NDVV9NUF9XSVRIX01VWF9HQVRFKHNwaTJfY2xrLCAic3BpMiIsIG1vZDBfZGVmYXVsdF9wYXJlbnRzLCAweDBhOCwKKwkJCQkgIDAsIDQsCQkvKiBNICovCisJCQkJICAxNiwgMiwJLyogUCAqLworCQkJCSAgMjQsIDIsCS8qIG11eCAqLworCQkJCSAgQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCSAgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTVBfV0lUSF9NVVhfR0FURShzcGkzX2NsaywgInNwaTMiLCBtb2QwX2RlZmF1bHRfcGFyZW50cywgMHgwYWMsCisJCQkJICAwLCA0LAkJLyogTSAqLworCQkJCSAgMTYsIDIsCS8qIFAgKi8KKwkJCQkgIDI0LCAyLAkvKiBtdXggKi8KKwkJCQkgIEJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkgIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRhdWRpb19wYXJlbnRzW10gPSB7ICJwbGwtYXVkaW8tOHgiLCAicGxsLWF1ZGlvLTR4IiwKKwkJCQkJICAgICAgICJwbGwtYXVkaW8tMngiLCAicGxsLWF1ZGlvIiB9Oworc3RhdGljIFNVTlhJX0NDVV9NVVhfV0lUSF9HQVRFKGRhdWRpbzBfY2xrLCAiZGF1ZGlvMCIsIGRhdWRpb19wYXJlbnRzLAorCQkJICAgICAgIDB4MGIwLCAxNiwgMiwgQklUKDMxKSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7CitzdGF0aWMgU1VOWElfQ0NVX01VWF9XSVRIX0dBVEUoZGF1ZGlvMV9jbGssICJkYXVkaW8xIiwgZGF1ZGlvX3BhcmVudHMsCisJCQkgICAgICAgMHgwYjQsIDE2LCAyLCBCSVQoMzEpLCBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKKworc3RhdGljIFNVTlhJX0NDVV9NX1dJVEhfR0FURShzcGRpZl9jbGssICJzcGRpZiIsICJwbGwtYXVkaW8iLAorCQkJICAgICAweDBjMCwgMCwgNCwgQklUKDMxKSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURSh1c2JfcGh5MF9jbGssCSJ1c2ItcGh5MCIsCSJvc2MyNE0iLAorCQkgICAgICAweDBjYywgQklUKDgpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURSh1c2JfcGh5MV9jbGssCSJ1c2ItcGh5MSIsCSJvc2MyNE0iLAorCQkgICAgICAweDBjYywgQklUKDkpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURSh1c2JfcGh5Ml9jbGssCSJ1c2ItcGh5MiIsCSJvc2MyNE0iLAorCQkgICAgICAweDBjYywgQklUKDEwKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUodXNiX29oY2kwX2NsaywJInVzYi1vaGNpMCIsCSJvc2MyNE0iLAorCQkgICAgICAweDBjYywgQklUKDE2KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUodXNiX29oY2kxX2NsaywJInVzYi1vaGNpMSIsCSJvc2MyNE0iLAorCQkgICAgICAweDBjYywgQklUKDE3KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUodXNiX29oY2kyX2NsaywJInVzYi1vaGNpMiIsCSJvc2MyNE0iLAorCQkgICAgICAweDBjYywgQklUKDE4KSwgMCk7CisKKy8qIFRPRE8gZW1hYyBjbGsgbm90IHN1cHBvcnRlZCB5ZXQgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkcmFtX3BhcmVudHNbXSA9IHsgInBsbC1kZHIiLCAicGxsLXBlcmlwaCIgfTsKK3N0YXRpYyBTVU5YSV9DQ1VfTVBfV0lUSF9NVVhfR0FURShtZGZzX2NsaywgIm1kZnMiLCBkcmFtX3BhcmVudHMsIDB4MGYwLAorCQkJCSAgMCwgNCwJCS8qIE0gKi8KKwkJCQkgIDE2LCAyLAkvKiBQICovCisJCQkJICAyNCwgMiwJLyogbXV4ICovCisJCQkJICBCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJICBDTEtfSVNfQ1JJVElDQUwpOworCitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9NVVgoc2RyYW0wX2NsaywgInNkcmFtMCIsIGRyYW1fcGFyZW50cywKKwkJCSAgICAweDBmNCwgMCwgNCwgNCwgMSwgQ0xLX0lTX0NSSVRJQ0FMKTsKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWChzZHJhbTFfY2xrLCAic2RyYW0xIiwgZHJhbV9wYXJlbnRzLAorCQkJICAgIDB4MGY0LCA4LCA0LCAxMiwgMSwgQ0xLX0lTX0NSSVRJQ0FMKTsKKworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGRyYW1fdmVfY2xrLAkiZHJhbS12ZSIsCSJtZGZzIiwKKwkJICAgICAgMHgxMDAsIEJJVCgwKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoZHJhbV9jc2lfaXNwX2NsaywJImRyYW0tY3NpLWlzcCIsCSJtZGZzIiwKKwkJICAgICAgMHgxMDAsIEJJVCgxKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoZHJhbV90c19jbGssCSJkcmFtLXRzIiwJIm1kZnMiLAorCQkgICAgICAweDEwMCwgQklUKDMpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShkcmFtX2RyYzBfY2xrLAkiZHJhbS1kcmMwIiwJIm1kZnMiLAorCQkgICAgICAweDEwMCwgQklUKDE2KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoZHJhbV9kcmMxX2NsaywJImRyYW0tZHJjMSIsCSJtZGZzIiwKKwkJICAgICAgMHgxMDAsIEJJVCgxNyksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGRyYW1fZGV1MF9jbGssCSJkcmFtLWRldTAiLAkibWRmcyIsCisJCSAgICAgIDB4MTAwLCBCSVQoMTgpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShkcmFtX2RldTFfY2xrLAkiZHJhbS1kZXUxIiwJIm1kZnMiLAorCQkgICAgICAweDEwMCwgQklUKDE5KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoZHJhbV9mZTBfY2xrLAkiZHJhbS1mZTAiLAkibWRmcyIsCisJCSAgICAgIDB4MTAwLCBCSVQoMjQpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShkcmFtX2ZlMV9jbGssCSJkcmFtLWZlMSIsCSJtZGZzIiwKKwkJICAgICAgMHgxMDAsIEJJVCgyNSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGRyYW1fYmUwX2NsaywJImRyYW0tYmUwIiwJIm1kZnMiLAorCQkgICAgICAweDEwMCwgQklUKDI2KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoZHJhbV9iZTFfY2xrLAkiZHJhbS1iZTEiLAkibWRmcyIsCisJCSAgICAgIDB4MTAwLCBCSVQoMjcpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShkcmFtX21wX2NsaywJImRyYW0tbXAiLAkibWRmcyIsCisJCSAgICAgIDB4MTAwLCBCSVQoMjgpLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkZV9wYXJlbnRzW10gPSB7ICJwbGwtdmlkZW8wIiwgInBsbC12aWRlbzEiLAorCQkJCQkgICAicGxsLXBlcmlwaC0yeCIsICJwbGwtZ3B1IiwKKwkJCQkJICAgInBsbDkiLCAicGxsMTAiIH07CitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9NVVhfR0FURShiZTBfY2xrLCAiYmUwIiwgZGVfcGFyZW50cywKKwkJCQkgMHgxMDQsIDAsIDQsIDI0LCAzLCBCSVQoMzEpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9HQVRFKGJlMV9jbGssICJiZTEiLCBkZV9wYXJlbnRzLAorCQkJCSAweDEwOCwgMCwgNCwgMjQsIDMsIEJJVCgzMSksIDApOworc3RhdGljIFNVTlhJX0NDVV9NX1dJVEhfTVVYX0dBVEUoZmUwX2NsaywgImZlMCIsIGRlX3BhcmVudHMsCisJCQkJIDB4MTBjLCAwLCA0LCAyNCwgMywgQklUKDMxKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9NVVhfR0FURShmZTFfY2xrLCAiZmUxIiwgZGVfcGFyZW50cywKKwkJCQkgMHgxMTAsIDAsIDQsIDI0LCAzLCBCSVQoMzEpLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtcF9wYXJlbnRzW10gPSB7ICJwbGwtdmlkZW8wIiwgInBsbC12aWRlbzEiLAorCQkJCQkgICAicGxsOSIsICJwbGwxMCIgfTsKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9HQVRFKG1wX2NsaywgIm1wIiwgbXBfcGFyZW50cywKKwkJCQkgMHgxMTQsIDAsIDQsIDI0LCAzLCBCSVQoMzEpLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsY2RfY2gwX3BhcmVudHNbXSA9IHsgInBsbC12aWRlbzAiLCAicGxsLXZpZGVvMSIsCisJCQkJCQkicGxsLXZpZGVvMC0yeCIsCisJCQkJCQkicGxsLXZpZGVvMS0yeCIsICJwbGwtbWlwaSIgfTsKK3N0YXRpYyBTVU5YSV9DQ1VfTVVYX1dJVEhfR0FURShsY2QwX2NoMF9jbGssICJsY2QwLWNoMCIsIGxjZF9jaDBfcGFyZW50cywKKwkJCSAgICAgICAweDExOCwgMjQsIDIsIEJJVCgzMSksIENMS19TRVRfUkFURV9QQVJFTlQpOworc3RhdGljIFNVTlhJX0NDVV9NVVhfV0lUSF9HQVRFKGxjZDFfY2gwX2NsaywgImxjZDEtY2gwIiwgbGNkX2NoMF9wYXJlbnRzLAorCQkJICAgICAgIDB4MTFjLCAyNCwgMiwgQklUKDMxKSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbGNkX2NoMV9wYXJlbnRzW10gPSB7ICJwbGwtdmlkZW8wIiwgInBsbC12aWRlbzEiLAorCQkJCQkJInBsbC12aWRlbzAtMngiLAorCQkJCQkJInBsbC12aWRlbzEtMngiIH07CitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9NVVhfR0FURShsY2QwX2NoMV9jbGssICJsY2QwLWNoMSIsIGxjZF9jaDFfcGFyZW50cywKKwkJCQkgMHgxMmMsIDAsIDQsIDI0LCAzLCBCSVQoMzEpLAorCQkJCSBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9HQVRFKGxjZDFfY2gxX2NsaywgImxjZDEtY2gxIiwgbGNkX2NoMV9wYXJlbnRzLAorCQkJCSAweDEyYywgMCwgNCwgMjQsIDMsIEJJVCgzMSksCisJCQkJIENMS19TRVRfUkFURV9QQVJFTlQpOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNzaV9zY2xrX3BhcmVudHNbXSA9IHsgInBsbC12aWRlbzAiLCAicGxsLXZpZGVvMSIsCisJCQkJCQkgInBsbDkiLCAicGxsMTAiLCAicGxsLW1pcGkiLAorCQkJCQkJICJwbGwtdmUiIH07CitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9NVVhfR0FURShjc2kwX3NjbGtfY2xrLCAiY3NpMC1zY2xrIiwgY3NpX3NjbGtfcGFyZW50cywKKwkJCQkgMHgxMzQsIDE2LCA0LCAyNCwgMywgQklUKDMxKSwgMCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY3NpX21jbGtfcGFyZW50c1tdID0geyAicGxsLXZpZGVvMCIsICJwbGwtdmlkZW8xIiwKKwkJCQkJCSAib3NjMjRNIiB9Oworc3RhdGljIGNvbnN0IHU4IGNzaV9tY2xrX3RhYmxlW10gPSB7IDAsIDEsIDUgfTsKK3N0YXRpYyBzdHJ1Y3QgY2N1X2RpdiBjc2kwX21jbGtfY2xrID0geworCS5lbmFibGUJCT0gQklUKDE1KSwKKwkuZGl2CQk9IF9TVU5YSV9DQ1VfRElWKDAsIDQpLAorCS5tdXgJCT0gX1NVTlhJX0NDVV9NVVhfVEFCTEUoOCwgMywgY3NpX21jbGtfdGFibGUpLAorCS5jb21tb24JCT0geworCQkucmVnCQk9IDB4MTM0LAorCQkuaHcuaW5pdAk9IENMS19IV19JTklUX1BBUkVOVFMoImNzaTAtbWNsayIsCisJCQkJCQkgICAgICBjc2lfbWNsa19wYXJlbnRzLAorCQkJCQkJICAgICAgJmNjdV9kaXZfb3BzLAorCQkJCQkJICAgICAgMCksCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2N1X2RpdiBjc2kxX21jbGtfY2xrID0geworCS5lbmFibGUJCT0gQklUKDE1KSwKKwkuZGl2CQk9IF9TVU5YSV9DQ1VfRElWKDAsIDQpLAorCS5tdXgJCT0gX1NVTlhJX0NDVV9NVVhfVEFCTEUoOCwgMywgY3NpX21jbGtfdGFibGUpLAorCS5jb21tb24JCT0geworCQkucmVnCQk9IDB4MTM4LAorCQkuaHcuaW5pdAk9IENMS19IV19JTklUX1BBUkVOVFMoImNzaTEtbWNsayIsCisJCQkJCQkgICAgICBjc2lfbWNsa19wYXJlbnRzLAorCQkJCQkJICAgICAgJmNjdV9kaXZfb3BzLAorCQkJCQkJICAgICAgMCksCisJfSwKK307CisKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX0dBVEUodmVfY2xrLCAidmUiLCAicGxsLXZlIiwKKwkJCSAgICAgMHgxM2MsIDE2LCAzLCBCSVQoMzEpLCAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGNvZGVjX2NsaywJImNvZGVjIiwJInBsbC1hdWRpbyIsCisJCSAgICAgIDB4MTQwLCBCSVQoMzEpLCBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShhdnNfY2xrLAkJImF2cyIsCQkib3NjMjRNIiwKKwkJICAgICAgMHgxNDQsIEJJVCgzMSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGRpZ2l0YWxfbWljX2NsaywJImRpZ2l0YWwtbWljIiwJInBsbC1hdWRpbyIsCisJCSAgICAgIDB4MTQ4LCBCSVQoMzEpLCBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKKworc3RhdGljIFNVTlhJX0NDVV9NX1dJVEhfTVVYX0dBVEUoaGRtaV9jbGssICJoZG1pIiwgbGNkX2NoMV9wYXJlbnRzLAorCQkJCSAweDE1MCwgMCwgNCwgMjQsIDIsIEJJVCgzMSksCisJCQkJIENMS19TRVRfUkFURV9QQVJFTlQpOworCitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoaGRtaV9kZGNfY2xrLCAiaGRtaS1kZGMiLCAib3NjMjRNIiwgMHgxNTAsIEJJVCgzMSksIDApOworCitzdGF0aWMgU1VOWElfQ0NVX0dBVEUocHNfY2xrLCAicHMiLCAibGNkMS1jaDEiLCAweDE0MCwgQklUKDMxKSwgMCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWJ1c19wYXJlbnRzW10gPSB7ICJvc2MyNE0iLCAicGxsLXBlcmlwaCIsCisJCQkJCSAgICAgInBsbC1kZHIiIH07CitzdGF0aWMgU1VOWElfQ0NVX01QX1dJVEhfTVVYX0dBVEUobWJ1czBfY2xrLCAibWJ1czAiLCBtYnVzX3BhcmVudHMsIDB4MTVjLAorCQkJCSAgMCwgMywJCS8qIE0gKi8KKwkJCQkgIDE2LCAyLAkvKiBQICovCisJCQkJICAyNCwgMiwJLyogbXV4ICovCisJCQkJICBCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJICBDTEtfSVNfQ1JJVElDQUwpOworCitzdGF0aWMgU1VOWElfQ0NVX01QX1dJVEhfTVVYX0dBVEUobWJ1czFfY2xrLCAibWJ1czEiLCBtYnVzX3BhcmVudHMsIDB4MTYwLAorCQkJCSAgMCwgMywJCS8qIE0gKi8KKwkJCQkgIDE2LCAyLAkvKiBQICovCisJCQkJICAyNCwgMiwJLyogbXV4ICovCisJCQkJICBCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJICBDTEtfSVNfQ1JJVElDQUwpOworCitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9NVVhfR0FURShtaXBpX2RzaV9jbGssICJtaXBpLWRzaSIsIGxjZF9jaDFfcGFyZW50cywKKwkJCQkgMHgxNjgsIDE2LCAzLCAyNCwgMiwgQklUKDMxKSwKKwkJCQkgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7CitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9NVVhfR0FURShtaXBpX2RzaV9kcGh5X2NsaywgIm1pcGktZHNpLWRwaHkiLAorCQkJCSBsY2RfY2gxX3BhcmVudHMsIDB4MTY4LCAwLCAzLCA4LCAyLAorCQkJCSBCSVQoMTUpLCBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9HQVRFKG1pcGlfY3NpX2RwaHlfY2xrLCAibWlwaS1jc2ktZHBoeSIsCisJCQkJIGxjZF9jaDFfcGFyZW50cywgMHgxNmMsIDAsIDMsIDgsIDIsCisJCQkJIEJJVCgxNSksIDApOworCitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9NVVhfR0FURShpZXBfZHJjMF9jbGssICJpZXAtZHJjMCIsIGRlX3BhcmVudHMsCisJCQkJIDB4MTgwLCAwLCAzLCAyNCwgMiwgQklUKDMxKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9NVVhfR0FURShpZXBfZHJjMV9jbGssICJpZXAtZHJjMSIsIGRlX3BhcmVudHMsCisJCQkJIDB4MTg0LCAwLCAzLCAyNCwgMiwgQklUKDMxKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9NVVhfR0FURShpZXBfZGV1MF9jbGssICJpZXAtZGV1MCIsIGRlX3BhcmVudHMsCisJCQkJIDB4MTg4LCAwLCAzLCAyNCwgMiwgQklUKDMxKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9NVVhfR0FURShpZXBfZGV1MV9jbGssICJpZXAtZGV1MSIsIGRlX3BhcmVudHMsCisJCQkJIDB4MThjLCAwLCAzLCAyNCwgMiwgQklUKDMxKSwgMCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZ3B1X3BhcmVudHNbXSA9IHsgInBsbC1ncHUiLCAicGxsLXBlcmlwaC0yeCIsCisJCQkJCSAgICAicGxsLXZpZGVvMCIsICJwbGwtdmlkZW8xIiwKKwkJCQkJICAgICJwbGw5IiwgInBsbDEwIiB9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBjY3VfbXV4X2ZpeGVkX3ByZWRpdiBncHVfcHJlZGl2c1tdID0geworCXsgLmluZGV4ID0gMSwgLmRpdiA9IDMsIH0sCit9OworCitzdGF0aWMgc3RydWN0IGNjdV9kaXYgZ3B1X2NvcmVfY2xrID0geworCS5lbmFibGUJCT0gQklUKDMxKSwKKwkuZGl2CQk9IF9TVU5YSV9DQ1VfRElWKDAsIDMpLAorCS5tdXgJCT0geworCQkuc2hpZnQJCT0gMjQsCisJCS53aWR0aAkJPSAzLAorCQkuZml4ZWRfcHJlZGl2cwk9IGdwdV9wcmVkaXZzLAorCQkubl9wcmVkaXZzCT0gQVJSQVlfU0laRShncHVfcHJlZGl2cyksCisJfSwKKwkuY29tbW9uCQk9IHsKKwkJLnJlZwkJPSAweDFhMCwKKwkJLmZlYXR1cmVzCT0gQ0NVX0ZFQVRVUkVfRklYRURfUFJFRElWLAorCQkuaHcuaW5pdAk9IENMS19IV19JTklUX1BBUkVOVFMoImdwdS1jb3JlIiwKKwkJCQkJCSAgICAgIGdwdV9wYXJlbnRzLAorCQkJCQkJICAgICAgJmNjdV9kaXZfb3BzLAorCQkJCQkJICAgICAgMCksCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2N1X2RpdiBncHVfbWVtb3J5X2NsayA9IHsKKwkuZW5hYmxlCQk9IEJJVCgzMSksCisJLmRpdgkJPSBfU1VOWElfQ0NVX0RJVigwLCAzKSwKKwkubXV4CQk9IHsKKwkJLnNoaWZ0CQk9IDI0LAorCQkud2lkdGgJCT0gMywKKwkJLmZpeGVkX3ByZWRpdnMJPSBncHVfcHJlZGl2cywKKwkJLm5fcHJlZGl2cwk9IEFSUkFZX1NJWkUoZ3B1X3ByZWRpdnMpLAorCX0sCisJLmNvbW1vbgkJPSB7CisJCS5yZWcJCT0gMHgxYTQsCisJCS5mZWF0dXJlcwk9IENDVV9GRUFUVVJFX0ZJWEVEX1BSRURJViwKKwkJLmh3LmluaXQJPSBDTEtfSFdfSU5JVF9QQVJFTlRTKCJncHUtbWVtb3J5IiwKKwkJCQkJCSAgICAgIGdwdV9wYXJlbnRzLAorCQkJCQkJICAgICAgJmNjdV9kaXZfb3BzLAorCQkJCQkJICAgICAgMCksCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2N1X2RpdiBncHVfaHlkX2NsayA9IHsKKwkuZW5hYmxlCQk9IEJJVCgzMSksCisJLmRpdgkJPSBfU1VOWElfQ0NVX0RJVigwLCAzKSwKKwkubXV4CQk9IHsKKwkJLnNoaWZ0CQk9IDI0LAorCQkud2lkdGgJCT0gMywKKwkJLmZpeGVkX3ByZWRpdnMJPSBncHVfcHJlZGl2cywKKwkJLm5fcHJlZGl2cwk9IEFSUkFZX1NJWkUoZ3B1X3ByZWRpdnMpLAorCX0sCisJLmNvbW1vbgkJPSB7CisJCS5yZWcJCT0gMHgxYTgsCisJCS5mZWF0dXJlcwk9IENDVV9GRUFUVVJFX0ZJWEVEX1BSRURJViwKKwkJLmh3LmluaXQJPSBDTEtfSFdfSU5JVF9QQVJFTlRTKCJncHUtaHlkIiwKKwkJCQkJCSAgICAgIGdwdV9wYXJlbnRzLAorCQkJCQkJICAgICAgJmNjdV9kaXZfb3BzLAorCQkJCQkJICAgICAgMCksCisJfSwKK307CisKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9HQVRFKGF0c19jbGssICJhdHMiLCBtb2QwX2RlZmF1bHRfcGFyZW50cywgMHgxYjAsCisJCQkJIDAsIDMsCQkvKiBNICovCisJCQkJIDI0LCAyLAkJLyogbXV4ICovCisJCQkJIEJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9HQVRFKHRyYWNlX2NsaywgInRyYWNlIiwgbW9kMF9kZWZhdWx0X3BhcmVudHMsCisJCQkJIDB4MWIwLAorCQkJCSAwLCAzLAkJLyogTSAqLworCQkJCSAyNCwgMiwJCS8qIG11eCAqLworCQkJCSBCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNsa19vdXRfcGFyZW50c1tdID0geyAib3NjMjRNIiwgIm9zYzMyayIsICJvc2MyNE0iLAorCQkJCQkJImF4aSIsICJhaGIxIiB9Oworc3RhdGljIGNvbnN0IHU4IGNsa19vdXRfdGFibGVbXSA9IHsgMCwgMSwgMiwgMTEsIDEzIH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2N1X211eF9maXhlZF9wcmVkaXYgY2xrX291dF9wcmVkaXZzW10gPSB7CisJeyAuaW5kZXggPSAwLCAuZGl2ID0gNzUwLCB9LAorCXsgLmluZGV4ID0gMywgLmRpdiA9IDQsIH0sCisJeyAuaW5kZXggPSA0LCAuZGl2ID0gNCwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2N1X21wIG91dF9hX2NsayA9IHsKKwkuZW5hYmxlCQk9IEJJVCgzMSksCisJLm0JCT0gX1NVTlhJX0NDVV9ESVYoOCwgNSksCisJLnAJCT0gX1NVTlhJX0NDVV9ESVYoMjAsIDIpLAorCS5tdXgJCT0geworCQkuc2hpZnQJCT0gMjQsCisJCS53aWR0aAkJPSA0LAorCQkudGFibGUJCT0gY2xrX291dF90YWJsZSwKKwkJLmZpeGVkX3ByZWRpdnMJPSBjbGtfb3V0X3ByZWRpdnMsCisJCS5uX3ByZWRpdnMJPSBBUlJBWV9TSVpFKGNsa19vdXRfcHJlZGl2cyksCisJfSwKKwkuY29tbW9uCQk9IHsKKwkJLnJlZwkJPSAweDMwMCwKKwkJLmZlYXR1cmVzCT0gQ0NVX0ZFQVRVUkVfRklYRURfUFJFRElWLAorCQkuaHcuaW5pdAk9IENMS19IV19JTklUX1BBUkVOVFMoIm91dC1hIiwKKwkJCQkJCSAgICAgIGNsa19vdXRfcGFyZW50cywKKwkJCQkJCSAgICAgICZjY3VfZGl2X29wcywKKwkJCQkJCSAgICAgIDApLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNjdV9tcCBvdXRfYl9jbGsgPSB7CisJLmVuYWJsZQkJPSBCSVQoMzEpLAorCS5tCQk9IF9TVU5YSV9DQ1VfRElWKDgsIDUpLAorCS5wCQk9IF9TVU5YSV9DQ1VfRElWKDIwLCAyKSwKKwkubXV4CQk9IHsKKwkJLnNoaWZ0CQk9IDI0LAorCQkud2lkdGgJCT0gNCwKKwkJLnRhYmxlCQk9IGNsa19vdXRfdGFibGUsCisJCS5maXhlZF9wcmVkaXZzCT0gY2xrX291dF9wcmVkaXZzLAorCQkubl9wcmVkaXZzCT0gQVJSQVlfU0laRShjbGtfb3V0X3ByZWRpdnMpLAorCX0sCisJLmNvbW1vbgkJPSB7CisJCS5yZWcJCT0gMHgzMDQsCisJCS5mZWF0dXJlcwk9IENDVV9GRUFUVVJFX0ZJWEVEX1BSRURJViwKKwkJLmh3LmluaXQJPSBDTEtfSFdfSU5JVF9QQVJFTlRTKCJvdXQtYiIsCisJCQkJCQkgICAgICBjbGtfb3V0X3BhcmVudHMsCisJCQkJCQkgICAgICAmY2N1X2Rpdl9vcHMsCisJCQkJCQkgICAgICAwKSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjY3VfbXAgb3V0X2NfY2xrID0geworCS5lbmFibGUJCT0gQklUKDMxKSwKKwkubQkJPSBfU1VOWElfQ0NVX0RJVig4LCA1KSwKKwkucAkJPSBfU1VOWElfQ0NVX0RJVigyMCwgMiksCisJLm11eAkJPSB7CisJCS5zaGlmdAkJPSAyNCwKKwkJLndpZHRoCQk9IDQsCisJCS50YWJsZQkJPSBjbGtfb3V0X3RhYmxlLAorCQkuZml4ZWRfcHJlZGl2cwk9IGNsa19vdXRfcHJlZGl2cywKKwkJLm5fcHJlZGl2cwk9IEFSUkFZX1NJWkUoY2xrX291dF9wcmVkaXZzKSwKKwl9LAorCS5jb21tb24JCT0geworCQkucmVnCQk9IDB4MzA4LAorCQkuZmVhdHVyZXMJPSBDQ1VfRkVBVFVSRV9GSVhFRF9QUkVESVYsCisJCS5ody5pbml0CT0gQ0xLX0hXX0lOSVRfUEFSRU5UUygib3V0LWMiLAorCQkJCQkJICAgICAgY2xrX291dF9wYXJlbnRzLAorCQkJCQkJICAgICAgJmNjdV9kaXZfb3BzLAorCQkJCQkJICAgICAgMCksCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2N1X2NvbW1vbiAqc3VuNmlfYTMxX2NjdV9jbGtzW10gPSB7CisJJnBsbF9jcHVfY2xrLmNvbW1vbiwKKwkmcGxsX2F1ZGlvX2Jhc2VfY2xrLmNvbW1vbiwKKwkmcGxsX3ZpZGVvMF9jbGsuY29tbW9uLAorCSZwbGxfdmVfY2xrLmNvbW1vbiwKKwkmcGxsX2Rkcl9jbGsuY29tbW9uLAorCSZwbGxfcGVyaXBoX2Nsay5jb21tb24sCisJJnBsbF92aWRlbzFfY2xrLmNvbW1vbiwKKwkmcGxsX2dwdV9jbGsuY29tbW9uLAorCSZwbGxfbWlwaV9jbGsuY29tbW9uLAorCSZwbGw5X2Nsay5jb21tb24sCisJJnBsbDEwX2Nsay5jb21tb24sCisJJmNwdV9jbGsuY29tbW9uLAorCSZheGlfY2xrLmNvbW1vbiwKKwkmYWhiMV9jbGsuY29tbW9uLAorCSZhcGIxX2Nsay5jb21tb24sCisJJmFwYjJfY2xrLmNvbW1vbiwKKwkmYWhiMV9taXBpZHNpX2Nsay5jb21tb24sCisJJmFoYjFfc3NfY2xrLmNvbW1vbiwKKwkmYWhiMV9kbWFfY2xrLmNvbW1vbiwKKwkmYWhiMV9tbWMwX2Nsay5jb21tb24sCisJJmFoYjFfbW1jMV9jbGsuY29tbW9uLAorCSZhaGIxX21tYzJfY2xrLmNvbW1vbiwKKwkmYWhiMV9tbWMzX2Nsay5jb21tb24sCisJJmFoYjFfbmFuZDFfY2xrLmNvbW1vbiwKKwkmYWhiMV9uYW5kMF9jbGsuY29tbW9uLAorCSZhaGIxX3NkcmFtX2Nsay5jb21tb24sCisJJmFoYjFfZW1hY19jbGsuY29tbW9uLAorCSZhaGIxX3RzX2Nsay5jb21tb24sCisJJmFoYjFfaHN0aW1lcl9jbGsuY29tbW9uLAorCSZhaGIxX3NwaTBfY2xrLmNvbW1vbiwKKwkmYWhiMV9zcGkxX2Nsay5jb21tb24sCisJJmFoYjFfc3BpMl9jbGsuY29tbW9uLAorCSZhaGIxX3NwaTNfY2xrLmNvbW1vbiwKKwkmYWhiMV9vdGdfY2xrLmNvbW1vbiwKKwkmYWhiMV9laGNpMF9jbGsuY29tbW9uLAorCSZhaGIxX2VoY2kxX2Nsay5jb21tb24sCisJJmFoYjFfb2hjaTBfY2xrLmNvbW1vbiwKKwkmYWhiMV9vaGNpMV9jbGsuY29tbW9uLAorCSZhaGIxX29oY2kyX2Nsay5jb21tb24sCisJJmFoYjFfdmVfY2xrLmNvbW1vbiwKKwkmYWhiMV9sY2QwX2Nsay5jb21tb24sCisJJmFoYjFfbGNkMV9jbGsuY29tbW9uLAorCSZhaGIxX2NzaV9jbGsuY29tbW9uLAorCSZhaGIxX2hkbWlfY2xrLmNvbW1vbiwKKwkmYWhiMV9iZTBfY2xrLmNvbW1vbiwKKwkmYWhiMV9iZTFfY2xrLmNvbW1vbiwKKwkmYWhiMV9mZTBfY2xrLmNvbW1vbiwKKwkmYWhiMV9mZTFfY2xrLmNvbW1vbiwKKwkmYWhiMV9tcF9jbGsuY29tbW9uLAorCSZhaGIxX2dwdV9jbGsuY29tbW9uLAorCSZhaGIxX2RldTBfY2xrLmNvbW1vbiwKKwkmYWhiMV9kZXUxX2Nsay5jb21tb24sCisJJmFoYjFfZHJjMF9jbGsuY29tbW9uLAorCSZhaGIxX2RyYzFfY2xrLmNvbW1vbiwKKwkmYXBiMV9jb2RlY19jbGsuY29tbW9uLAorCSZhcGIxX3NwZGlmX2Nsay5jb21tb24sCisJJmFwYjFfZGlnaXRhbF9taWNfY2xrLmNvbW1vbiwKKwkmYXBiMV9waW9fY2xrLmNvbW1vbiwKKwkmYXBiMV9kYXVkaW8wX2Nsay5jb21tb24sCisJJmFwYjFfZGF1ZGlvMV9jbGsuY29tbW9uLAorCSZhcGIyX2kyYzBfY2xrLmNvbW1vbiwKKwkmYXBiMl9pMmMxX2Nsay5jb21tb24sCisJJmFwYjJfaTJjMl9jbGsuY29tbW9uLAorCSZhcGIyX2kyYzNfY2xrLmNvbW1vbiwKKwkmYXBiMl91YXJ0MF9jbGsuY29tbW9uLAorCSZhcGIyX3VhcnQxX2Nsay5jb21tb24sCisJJmFwYjJfdWFydDJfY2xrLmNvbW1vbiwKKwkmYXBiMl91YXJ0M19jbGsuY29tbW9uLAorCSZhcGIyX3VhcnQ0X2Nsay5jb21tb24sCisJJmFwYjJfdWFydDVfY2xrLmNvbW1vbiwKKwkmbmFuZDBfY2xrLmNvbW1vbiwKKwkmbmFuZDFfY2xrLmNvbW1vbiwKKwkmbW1jMF9jbGsuY29tbW9uLAorCSZtbWMwX3NhbXBsZV9jbGsuY29tbW9uLAorCSZtbWMwX291dHB1dF9jbGsuY29tbW9uLAorCSZtbWMxX2Nsay5jb21tb24sCisJJm1tYzFfc2FtcGxlX2Nsay5jb21tb24sCisJJm1tYzFfb3V0cHV0X2Nsay5jb21tb24sCisJJm1tYzJfY2xrLmNvbW1vbiwKKwkmbW1jMl9zYW1wbGVfY2xrLmNvbW1vbiwKKwkmbW1jMl9vdXRwdXRfY2xrLmNvbW1vbiwKKwkmbW1jM19jbGsuY29tbW9uLAorCSZtbWMzX3NhbXBsZV9jbGsuY29tbW9uLAorCSZtbWMzX291dHB1dF9jbGsuY29tbW9uLAorCSZ0c19jbGsuY29tbW9uLAorCSZzc19jbGsuY29tbW9uLAorCSZzcGkwX2Nsay5jb21tb24sCisJJnNwaTFfY2xrLmNvbW1vbiwKKwkmc3BpMl9jbGsuY29tbW9uLAorCSZzcGkzX2Nsay5jb21tb24sCisJJmRhdWRpbzBfY2xrLmNvbW1vbiwKKwkmZGF1ZGlvMV9jbGsuY29tbW9uLAorCSZzcGRpZl9jbGsuY29tbW9uLAorCSZ1c2JfcGh5MF9jbGsuY29tbW9uLAorCSZ1c2JfcGh5MV9jbGsuY29tbW9uLAorCSZ1c2JfcGh5Ml9jbGsuY29tbW9uLAorCSZ1c2Jfb2hjaTBfY2xrLmNvbW1vbiwKKwkmdXNiX29oY2kxX2Nsay5jb21tb24sCisJJnVzYl9vaGNpMl9jbGsuY29tbW9uLAorCSZtZGZzX2Nsay5jb21tb24sCisJJnNkcmFtMF9jbGsuY29tbW9uLAorCSZzZHJhbTFfY2xrLmNvbW1vbiwKKwkmZHJhbV92ZV9jbGsuY29tbW9uLAorCSZkcmFtX2NzaV9pc3BfY2xrLmNvbW1vbiwKKwkmZHJhbV90c19jbGsuY29tbW9uLAorCSZkcmFtX2RyYzBfY2xrLmNvbW1vbiwKKwkmZHJhbV9kcmMxX2Nsay5jb21tb24sCisJJmRyYW1fZGV1MF9jbGsuY29tbW9uLAorCSZkcmFtX2RldTFfY2xrLmNvbW1vbiwKKwkmZHJhbV9mZTBfY2xrLmNvbW1vbiwKKwkmZHJhbV9mZTFfY2xrLmNvbW1vbiwKKwkmZHJhbV9iZTBfY2xrLmNvbW1vbiwKKwkmZHJhbV9iZTFfY2xrLmNvbW1vbiwKKwkmZHJhbV9tcF9jbGsuY29tbW9uLAorCSZiZTBfY2xrLmNvbW1vbiwKKwkmYmUxX2Nsay5jb21tb24sCisJJmZlMF9jbGsuY29tbW9uLAorCSZmZTFfY2xrLmNvbW1vbiwKKwkmbXBfY2xrLmNvbW1vbiwKKwkmbGNkMF9jaDBfY2xrLmNvbW1vbiwKKwkmbGNkMV9jaDBfY2xrLmNvbW1vbiwKKwkmbGNkMF9jaDFfY2xrLmNvbW1vbiwKKwkmbGNkMV9jaDFfY2xrLmNvbW1vbiwKKwkmY3NpMF9zY2xrX2Nsay5jb21tb24sCisJJmNzaTBfbWNsa19jbGsuY29tbW9uLAorCSZjc2kxX21jbGtfY2xrLmNvbW1vbiwKKwkmdmVfY2xrLmNvbW1vbiwKKwkmY29kZWNfY2xrLmNvbW1vbiwKKwkmYXZzX2Nsay5jb21tb24sCisJJmRpZ2l0YWxfbWljX2Nsay5jb21tb24sCisJJmhkbWlfY2xrLmNvbW1vbiwKKwkmaGRtaV9kZGNfY2xrLmNvbW1vbiwKKwkmcHNfY2xrLmNvbW1vbiwKKwkmbWJ1czBfY2xrLmNvbW1vbiwKKwkmbWJ1czFfY2xrLmNvbW1vbiwKKwkmbWlwaV9kc2lfY2xrLmNvbW1vbiwKKwkmbWlwaV9kc2lfZHBoeV9jbGsuY29tbW9uLAorCSZtaXBpX2NzaV9kcGh5X2Nsay5jb21tb24sCisJJmllcF9kcmMwX2Nsay5jb21tb24sCisJJmllcF9kcmMxX2Nsay5jb21tb24sCisJJmllcF9kZXUwX2Nsay5jb21tb24sCisJJmllcF9kZXUxX2Nsay5jb21tb24sCisJJmdwdV9jb3JlX2Nsay5jb21tb24sCisJJmdwdV9tZW1vcnlfY2xrLmNvbW1vbiwKKwkmZ3B1X2h5ZF9jbGsuY29tbW9uLAorCSZhdHNfY2xrLmNvbW1vbiwKKwkmdHJhY2VfY2xrLmNvbW1vbiwKKwkmb3V0X2FfY2xrLmNvbW1vbiwKKwkmb3V0X2JfY2xrLmNvbW1vbiwKKwkmb3V0X2NfY2xrLmNvbW1vbiwKK307CisKKy8qIFdlIGhhcmRjb2RlIHRoZSBkaXZpZGVyIHRvIDQgZm9yIG5vdyAqLworc3RhdGljIENMS19GSVhFRF9GQUNUT1IocGxsX2F1ZGlvX2NsaywgInBsbC1hdWRpbyIsCisJCQkicGxsLWF1ZGlvLWJhc2UiLCA0LCAxLCBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKK3N0YXRpYyBDTEtfRklYRURfRkFDVE9SKHBsbF9hdWRpb18yeF9jbGssICJwbGwtYXVkaW8tMngiLAorCQkJInBsbC1hdWRpby1iYXNlIiwgMiwgMSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7CitzdGF0aWMgQ0xLX0ZJWEVEX0ZBQ1RPUihwbGxfYXVkaW9fNHhfY2xrLCAicGxsLWF1ZGlvLTR4IiwKKwkJCSJwbGwtYXVkaW8tYmFzZSIsIDEsIDEsIENMS19TRVRfUkFURV9QQVJFTlQpOworc3RhdGljIENMS19GSVhFRF9GQUNUT1IocGxsX2F1ZGlvXzh4X2NsaywgInBsbC1hdWRpby04eCIsCisJCQkicGxsLWF1ZGlvLWJhc2UiLCAxLCAyLCBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKK3N0YXRpYyBDTEtfRklYRURfRkFDVE9SKHBsbF9wZXJpcGhfMnhfY2xrLCAicGxsLXBlcmlwaC0yeCIsCisJCQkicGxsLXBlcmlwaCIsIDEsIDIsIDApOworc3RhdGljIENMS19GSVhFRF9GQUNUT1IocGxsX3ZpZGVvMF8yeF9jbGssICJwbGwtdmlkZW8wLTJ4IiwKKwkJCSJwbGwtdmlkZW8wIiwgMSwgMiwgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7CitzdGF0aWMgQ0xLX0ZJWEVEX0ZBQ1RPUihwbGxfdmlkZW8xXzJ4X2NsaywgInBsbC12aWRlbzEtMngiLAorCQkJInBsbC12aWRlbzEiLCAxLCAyLCBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKKworc3RhdGljIHN0cnVjdCBjbGtfaHdfb25lY2VsbF9kYXRhIHN1bjZpX2EzMV9od19jbGtzID0geworCS5od3MJPSB7CisJCVtDTEtfUExMX0NQVV0JCT0gJnBsbF9jcHVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19QTExfQVVESU9fQkFTRV0JPSAmcGxsX2F1ZGlvX2Jhc2VfY2xrLmNvbW1vbi5odywKKwkJW0NMS19QTExfQVVESU9dCQk9ICZwbGxfYXVkaW9fY2xrLmh3LAorCQlbQ0xLX1BMTF9BVURJT18yWF0JPSAmcGxsX2F1ZGlvXzJ4X2Nsay5odywKKwkJW0NMS19QTExfQVVESU9fNFhdCT0gJnBsbF9hdWRpb180eF9jbGsuaHcsCisJCVtDTEtfUExMX0FVRElPXzhYXQk9ICZwbGxfYXVkaW9fOHhfY2xrLmh3LAorCQlbQ0xLX1BMTF9WSURFTzBdCT0gJnBsbF92aWRlbzBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19QTExfVklERU8wXzJYXQk9ICZwbGxfdmlkZW8wXzJ4X2Nsay5odywKKwkJW0NMS19QTExfVkVdCQk9ICZwbGxfdmVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19QTExfRERSXQkJPSAmcGxsX2Rkcl9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1BMTF9QRVJJUEhdCT0gJnBsbF9wZXJpcGhfY2xrLmNvbW1vbi5odywKKwkJW0NMS19QTExfUEVSSVBIXzJYXQk9ICZwbGxfcGVyaXBoXzJ4X2Nsay5odywKKwkJW0NMS19QTExfVklERU8xXQk9ICZwbGxfdmlkZW8xX2Nsay5jb21tb24uaHcsCisJCVtDTEtfUExMX1ZJREVPMV8yWF0JPSAmcGxsX3ZpZGVvMV8yeF9jbGsuaHcsCisJCVtDTEtfUExMX0dQVV0JCT0gJnBsbF9ncHVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19QTExfTUlQSV0JCT0gJnBsbF9taXBpX2Nsay5jb21tb24uaHcsCisJCVtDTEtfUExMOV0JCT0gJnBsbDlfY2xrLmNvbW1vbi5odywKKwkJW0NMS19QTEwxMF0JCT0gJnBsbDEwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQ1BVXQkJPSAmY3B1X2Nsay5jb21tb24uaHcsCisJCVtDTEtfQVhJXQkJPSAmYXhpX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUhCMV0JCT0gJmFoYjFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BUEIxXQkJPSAmYXBiMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FQQjJdCQk9ICZhcGIyX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUhCMV9NSVBJRFNJXQk9ICZhaGIxX21pcGlkc2lfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxX1NTXQkJPSAmYWhiMV9zc19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FIQjFfRE1BXQkJPSAmYWhiMV9kbWFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxX01NQzBdCQk9ICZhaGIxX21tYzBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxX01NQzFdCQk9ICZhaGIxX21tYzFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxX01NQzJdCQk9ICZhaGIxX21tYzJfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxX01NQzNdCQk9ICZhaGIxX21tYzNfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxX05BTkQxXQk9ICZhaGIxX25hbmQxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUhCMV9OQU5EMF0JPSAmYWhiMV9uYW5kMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FIQjFfU0RSQU1dCT0gJmFoYjFfc2RyYW1fY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxX0VNQUNdCQk9ICZhaGIxX2VtYWNfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxX1RTXQkJPSAmYWhiMV90c19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FIQjFfSFNUSU1FUl0JPSAmYWhiMV9oc3RpbWVyX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUhCMV9TUEkwXQkJPSAmYWhiMV9zcGkwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUhCMV9TUEkxXQkJPSAmYWhiMV9zcGkxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUhCMV9TUEkyXQkJPSAmYWhiMV9zcGkyX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUhCMV9TUEkzXQkJPSAmYWhiMV9zcGkzX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUhCMV9PVEddCQk9ICZhaGIxX290Z19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FIQjFfRUhDSTBdCT0gJmFoYjFfZWhjaTBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxX0VIQ0kxXQk9ICZhaGIxX2VoY2kxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUhCMV9PSENJMF0JPSAmYWhiMV9vaGNpMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FIQjFfT0hDSTFdCT0gJmFoYjFfb2hjaTFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxX09IQ0kyXQk9ICZhaGIxX29oY2kyX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUhCMV9WRV0JCT0gJmFoYjFfdmVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxX0xDRDBdCQk9ICZhaGIxX2xjZDBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxX0xDRDFdCQk9ICZhaGIxX2xjZDFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxX0NTSV0JCT0gJmFoYjFfY3NpX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUhCMV9IRE1JXQkJPSAmYWhiMV9oZG1pX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUhCMV9CRTBdCQk9ICZhaGIxX2JlMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FIQjFfQkUxXQkJPSAmYWhiMV9iZTFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BSEIxX0ZFMF0JCT0gJmFoYjFfZmUwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUhCMV9GRTFdCQk9ICZhaGIxX2ZlMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FIQjFfTVBdCQk9ICZhaGIxX21wX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUhCMV9HUFVdCQk9ICZhaGIxX2dwdV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FIQjFfREVVMF0JCT0gJmFoYjFfZGV1MF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FIQjFfREVVMV0JCT0gJmFoYjFfZGV1MV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FIQjFfRFJDMF0JCT0gJmFoYjFfZHJjMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FIQjFfRFJDMV0JCT0gJmFoYjFfZHJjMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FQQjFfQ09ERUNdCT0gJmFwYjFfY29kZWNfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BUEIxX1NQRElGXQk9ICZhcGIxX3NwZGlmX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQVBCMV9ESUdJVEFMX01JQ10JPSAmYXBiMV9kaWdpdGFsX21pY19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FQQjFfUElPXQkJPSAmYXBiMV9waW9fY2xrLmNvbW1vbi5odywKKwkJW0NMS19BUEIxX0RBVURJTzBdCT0gJmFwYjFfZGF1ZGlvMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FQQjFfREFVRElPMV0JPSAmYXBiMV9kYXVkaW8xX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQVBCMl9JMkMwXQkJPSAmYXBiMl9pMmMwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQVBCMl9JMkMxXQkJPSAmYXBiMl9pMmMxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQVBCMl9JMkMyXQkJPSAmYXBiMl9pMmMyX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQVBCMl9JMkMzXQkJPSAmYXBiMl9pMmMzX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQVBCMl9VQVJUMF0JPSAmYXBiMl91YXJ0MF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FQQjJfVUFSVDFdCT0gJmFwYjJfdWFydDFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BUEIyX1VBUlQyXQk9ICZhcGIyX3VhcnQyX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQVBCMl9VQVJUM10JPSAmYXBiMl91YXJ0M19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FQQjJfVUFSVDRdCT0gJmFwYjJfdWFydDRfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BUEIyX1VBUlQ1XQk9ICZhcGIyX3VhcnQ1X2Nsay5jb21tb24uaHcsCisJCVtDTEtfTkFORDBdCQk9ICZuYW5kMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX05BTkQxXQkJPSAmbmFuZDFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19NTUMwXQkJPSAmbW1jMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX01NQzBfU0FNUExFXQk9ICZtbWMwX3NhbXBsZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX01NQzBfT1VUUFVUXQk9ICZtbWMwX291dHB1dF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX01NQzFdCQk9ICZtbWMxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTU1DMV9TQU1QTEVdCT0gJm1tYzFfc2FtcGxlX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTU1DMV9PVVRQVVRdCT0gJm1tYzFfb3V0cHV0X2Nsay5jb21tb24uaHcsCisJCVtDTEtfTU1DMl0JCT0gJm1tYzJfY2xrLmNvbW1vbi5odywKKwkJW0NMS19NTUMyX1NBTVBMRV0JPSAmbW1jMl9zYW1wbGVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19NTUMyX09VVFBVVF0JPSAmbW1jMl9vdXRwdXRfY2xrLmNvbW1vbi5odywKKwkJW0NMS19NTUMzXQkJPSAmbW1jM19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX01NQzNfU0FNUExFXQk9ICZtbWMzX3NhbXBsZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX01NQzNfT1VUUFVUXQk9ICZtbWMzX291dHB1dF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1RTXQkJPSAmdHNfY2xrLmNvbW1vbi5odywKKwkJW0NMS19TU10JCT0gJnNzX2Nsay5jb21tb24uaHcsCisJCVtDTEtfU1BJMF0JCT0gJnNwaTBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19TUEkxXQkJPSAmc3BpMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1NQSTJdCQk9ICZzcGkyX2Nsay5jb21tb24uaHcsCisJCVtDTEtfU1BJM10JCT0gJnNwaTNfY2xrLmNvbW1vbi5odywKKwkJW0NMS19EQVVESU8wXQkJPSAmZGF1ZGlvMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0RBVURJTzFdCQk9ICZkYXVkaW8xX2Nsay5jb21tb24uaHcsCisJCVtDTEtfU1BESUZdCQk9ICZzcGRpZl9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1VTQl9QSFkwXQkJPSAmdXNiX3BoeTBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19VU0JfUEhZMV0JCT0gJnVzYl9waHkxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfVVNCX1BIWTJdCQk9ICZ1c2JfcGh5Ml9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1VTQl9PSENJMF0JCT0gJnVzYl9vaGNpMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1VTQl9PSENJMV0JCT0gJnVzYl9vaGNpMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1VTQl9PSENJMl0JCT0gJnVzYl9vaGNpMl9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX01ERlNdCQk9ICZtZGZzX2Nsay5jb21tb24uaHcsCisJCVtDTEtfU0RSQU0wXQkJPSAmc2RyYW0wX2Nsay5jb21tb24uaHcsCisJCVtDTEtfU0RSQU0xXQkJPSAmc2RyYW0xX2Nsay5jb21tb24uaHcsCisJCVtDTEtfRFJBTV9WRV0JCT0gJmRyYW1fdmVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19EUkFNX0NTSV9JU1BdCT0gJmRyYW1fY3NpX2lzcF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0RSQU1fVFNdCQk9ICZkcmFtX3RzX2Nsay5jb21tb24uaHcsCisJCVtDTEtfRFJBTV9EUkMwXQkJPSAmZHJhbV9kcmMwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfRFJBTV9EUkMxXQkJPSAmZHJhbV9kcmMxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfRFJBTV9ERVUwXQkJPSAmZHJhbV9kZXUwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfRFJBTV9ERVUxXQkJPSAmZHJhbV9kZXUxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfRFJBTV9GRTBdCQk9ICZkcmFtX2ZlMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0RSQU1fRkUxXQkJPSAmZHJhbV9mZTFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19EUkFNX0JFMF0JCT0gJmRyYW1fYmUwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfRFJBTV9CRTFdCQk9ICZkcmFtX2JlMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0RSQU1fTVBdCQk9ICZkcmFtX21wX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQkUwXQkJPSAmYmUwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQkUxXQkJPSAmYmUxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfRkUwXQkJPSAmZmUwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfRkUxXQkJPSAmZmUxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTVBdCQk9ICZtcF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0xDRDBfQ0gwXQkJPSAmbGNkMF9jaDBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19MQ0QxX0NIMF0JCT0gJmxjZDFfY2gwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTENEMF9DSDFdCQk9ICZsY2QwX2NoMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0xDRDFfQ0gxXQkJPSAmbGNkMV9jaDFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19DU0kwX1NDTEtdCQk9ICZjc2kwX3NjbGtfY2xrLmNvbW1vbi5odywKKwkJW0NMS19DU0kwX01DTEtdCQk9ICZjc2kwX21jbGtfY2xrLmNvbW1vbi5odywKKwkJW0NMS19DU0kxX01DTEtdCQk9ICZjc2kxX21jbGtfY2xrLmNvbW1vbi5odywKKwkJW0NMS19WRV0JCT0gJnZlX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQ09ERUNdCQk9ICZjb2RlY19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FWU10JCT0gJmF2c19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0RJR0lUQUxfTUlDXQk9ICZkaWdpdGFsX21pY19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0hETUldCQk9ICZoZG1pX2Nsay5jb21tb24uaHcsCisJCVtDTEtfSERNSV9ERENdCQk9ICZoZG1pX2RkY19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1BTXQkJPSAmcHNfY2xrLmNvbW1vbi5odywKKwkJW0NMS19NQlVTMF0JCT0gJm1idXMwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTUJVUzFdCQk9ICZtYnVzMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX01JUElfRFNJXQkJPSAmbWlwaV9kc2lfY2xrLmNvbW1vbi5odywKKwkJW0NMS19NSVBJX0RTSV9EUEhZXQk9ICZtaXBpX2RzaV9kcGh5X2Nsay5jb21tb24uaHcsCisJCVtDTEtfTUlQSV9DU0lfRFBIWV0JPSAmbWlwaV9jc2lfZHBoeV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0lFUF9EUkMwXQkJPSAmaWVwX2RyYzBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19JRVBfRFJDMV0JCT0gJmllcF9kcmMxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfSUVQX0RFVTBdCQk9ICZpZXBfZGV1MF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0lFUF9ERVUxXQkJPSAmaWVwX2RldTFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19HUFVfQ09SRV0JCT0gJmdwdV9jb3JlX2Nsay5jb21tb24uaHcsCisJCVtDTEtfR1BVX01FTU9SWV0JPSAmZ3B1X21lbW9yeV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0dQVV9IWURdCQk9ICZncHVfaHlkX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQVRTXQkJPSAmYXRzX2Nsay5jb21tb24uaHcsCisJCVtDTEtfVFJBQ0VdCQk9ICZ0cmFjZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX09VVF9BXQkJPSAmb3V0X2FfY2xrLmNvbW1vbi5odywKKwkJW0NMS19PVVRfQl0JCT0gJm91dF9iX2Nsay5jb21tb24uaHcsCisJCVtDTEtfT1VUX0NdCQk9ICZvdXRfY19jbGsuY29tbW9uLmh3LAorCX0sCisJLm51bQk9IENMS19OVU1CRVIsCit9OworCitzdGF0aWMgc3RydWN0IGNjdV9yZXNldF9tYXAgc3VuNmlfYTMxX2NjdV9yZXNldHNbXSA9IHsKKwlbUlNUX1VTQl9QSFkwXQkJPSB7IDB4MGNjLCBCSVQoMCkgfSwKKwlbUlNUX1VTQl9QSFkxXQkJPSB7IDB4MGNjLCBCSVQoMSkgfSwKKwlbUlNUX1VTQl9QSFkyXQkJPSB7IDB4MGNjLCBCSVQoMikgfSwKKworCVtSU1RfQUhCMV9NSVBJX0RTSV0JPSB7IDB4MmMwLCBCSVQoMSkgfSwKKwlbUlNUX0FIQjFfU1NdCQk9IHsgMHgyYzAsIEJJVCg1KSB9LAorCVtSU1RfQUhCMV9ETUFdCQk9IHsgMHgyYzAsIEJJVCg2KSB9LAorCVtSU1RfQUhCMV9NTUMwXQkJPSB7IDB4MmMwLCBCSVQoOCkgfSwKKwlbUlNUX0FIQjFfTU1DMV0JCT0geyAweDJjMCwgQklUKDkpIH0sCisJW1JTVF9BSEIxX01NQzJdCQk9IHsgMHgyYzAsIEJJVCgxMCkgfSwKKwlbUlNUX0FIQjFfTU1DM10JCT0geyAweDJjMCwgQklUKDExKSB9LAorCVtSU1RfQUhCMV9OQU5EMV0JPSB7IDB4MmMwLCBCSVQoMTIpIH0sCisJW1JTVF9BSEIxX05BTkQwXQk9IHsgMHgyYzAsIEJJVCgxMykgfSwKKwlbUlNUX0FIQjFfU0RSQU1dCT0geyAweDJjMCwgQklUKDE0KSB9LAorCVtSU1RfQUhCMV9FTUFDXQkJPSB7IDB4MmMwLCBCSVQoMTcpIH0sCisJW1JTVF9BSEIxX1RTXQkJPSB7IDB4MmMwLCBCSVQoMTgpIH0sCisJW1JTVF9BSEIxX0hTVElNRVJdCT0geyAweDJjMCwgQklUKDE5KSB9LAorCVtSU1RfQUhCMV9TUEkwXQkJPSB7IDB4MmMwLCBCSVQoMjApIH0sCisJW1JTVF9BSEIxX1NQSTFdCQk9IHsgMHgyYzAsIEJJVCgyMSkgfSwKKwlbUlNUX0FIQjFfU1BJMl0JCT0geyAweDJjMCwgQklUKDIyKSB9LAorCVtSU1RfQUhCMV9TUEkzXQkJPSB7IDB4MmMwLCBCSVQoMjMpIH0sCisJW1JTVF9BSEIxX09UR10JCT0geyAweDJjMCwgQklUKDI0KSB9LAorCVtSU1RfQUhCMV9FSENJMF0JPSB7IDB4MmMwLCBCSVQoMjYpIH0sCisJW1JTVF9BSEIxX0VIQ0kxXQk9IHsgMHgyYzAsIEJJVCgyNykgfSwKKwlbUlNUX0FIQjFfT0hDSTBdCT0geyAweDJjMCwgQklUKDI5KSB9LAorCVtSU1RfQUhCMV9PSENJMV0JPSB7IDB4MmMwLCBCSVQoMzApIH0sCisJW1JTVF9BSEIxX09IQ0kyXQk9IHsgMHgyYzAsIEJJVCgzMSkgfSwKKworCVtSU1RfQUhCMV9WRV0JCT0geyAweDJjNCwgQklUKDApIH0sCisJW1JTVF9BSEIxX0xDRDBdCQk9IHsgMHgyYzQsIEJJVCg0KSB9LAorCVtSU1RfQUhCMV9MQ0QxXQkJPSB7IDB4MmM0LCBCSVQoNSkgfSwKKwlbUlNUX0FIQjFfQ1NJXQkJPSB7IDB4MmM0LCBCSVQoOCkgfSwKKwlbUlNUX0FIQjFfSERNSV0JCT0geyAweDJjNCwgQklUKDExKSB9LAorCVtSU1RfQUhCMV9CRTBdCQk9IHsgMHgyYzQsIEJJVCgxMikgfSwKKwlbUlNUX0FIQjFfQkUxXQkJPSB7IDB4MmM0LCBCSVQoMTMpIH0sCisJW1JTVF9BSEIxX0ZFMF0JCT0geyAweDJjNCwgQklUKDE0KSB9LAorCVtSU1RfQUhCMV9GRTFdCQk9IHsgMHgyYzQsIEJJVCgxNSkgfSwKKwlbUlNUX0FIQjFfTVBdCQk9IHsgMHgyYzQsIEJJVCgxOCkgfSwKKwlbUlNUX0FIQjFfR1BVXQkJPSB7IDB4MmM0LCBCSVQoMjApIH0sCisJW1JTVF9BSEIxX0RFVTBdCQk9IHsgMHgyYzQsIEJJVCgyMykgfSwKKwlbUlNUX0FIQjFfREVVMV0JCT0geyAweDJjNCwgQklUKDI0KSB9LAorCVtSU1RfQUhCMV9EUkMwXQkJPSB7IDB4MmM0LCBCSVQoMjUpIH0sCisJW1JTVF9BSEIxX0RSQzFdCQk9IHsgMHgyYzQsIEJJVCgyNikgfSwKKwlbUlNUX0FIQjFfTFZEU10JCT0geyAweDJjOCwgQklUKDApIH0sCisKKwlbUlNUX0FQQjFfQ09ERUNdCT0geyAweDJkMCwgQklUKDApIH0sCisJW1JTVF9BUEIxX1NQRElGXQk9IHsgMHgyZDAsIEJJVCgxKSB9LAorCVtSU1RfQVBCMV9ESUdJVEFMX01JQ10JPSB7IDB4MmQwLCBCSVQoNCkgfSwKKwlbUlNUX0FQQjFfREFVRElPMF0JPSB7IDB4MmQwLCBCSVQoMTIpIH0sCisJW1JTVF9BUEIxX0RBVURJTzFdCT0geyAweDJkMCwgQklUKDEzKSB9LAorCisJW1JTVF9BUEIyX0kyQzBdCQk9IHsgMHgyZDgsIEJJVCgwKSB9LAorCVtSU1RfQVBCMl9JMkMxXQkJPSB7IDB4MmQ4LCBCSVQoMSkgfSwKKwlbUlNUX0FQQjJfSTJDMl0JCT0geyAweDJkOCwgQklUKDIpIH0sCisJW1JTVF9BUEIyX0kyQzNdCQk9IHsgMHgyZDgsIEJJVCgzKSB9LAorCVtSU1RfQVBCMl9VQVJUMF0JPSB7IDB4MmQ4LCBCSVQoMTYpIH0sCisJW1JTVF9BUEIyX1VBUlQxXQk9IHsgMHgyZDgsIEJJVCgxNykgfSwKKwlbUlNUX0FQQjJfVUFSVDJdCT0geyAweDJkOCwgQklUKDE4KSB9LAorCVtSU1RfQVBCMl9VQVJUM10JPSB7IDB4MmQ4LCBCSVQoMTkpIH0sCisJW1JTVF9BUEIyX1VBUlQ0XQk9IHsgMHgyZDgsIEJJVCgyMCkgfSwKKwlbUlNUX0FQQjJfVUFSVDVdCT0geyAweDJkOCwgQklUKDIxKSB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdW54aV9jY3VfZGVzYyBzdW42aV9hMzFfY2N1X2Rlc2MgPSB7CisJLmNjdV9jbGtzCT0gc3VuNmlfYTMxX2NjdV9jbGtzLAorCS5udW1fY2N1X2Nsa3MJPSBBUlJBWV9TSVpFKHN1bjZpX2EzMV9jY3VfY2xrcyksCisKKwkuaHdfY2xrcwk9ICZzdW42aV9hMzFfaHdfY2xrcywKKworCS5yZXNldHMJCT0gc3VuNmlfYTMxX2NjdV9yZXNldHMsCisJLm51bV9yZXNldHMJPSBBUlJBWV9TSVpFKHN1bjZpX2EzMV9jY3VfcmVzZXRzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2N1X211eF9uYiBzdW42aV9hMzFfY3B1X25iID0geworCS5jb21tb24JCT0gJmNwdV9jbGsuY29tbW9uLAorCS5jbQkJPSAmY3B1X2Nsay5tdXgsCisJLmRlbGF5X3VzCT0gMSwgLyogPiA4IGNsb2NrIGN5Y2xlcyBhdCAyNCBNSHogKi8KKwkuYnlwYXNzX2luZGV4CT0gMSwgLyogaW5kZXggb2YgMjQgTUh6IG9zY2lsbGF0b3IgKi8KK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzdW42aV9hMzFfY2N1X3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3sKKwl2b2lkIF9faW9tZW0gKnJlZzsKKwl1MzIgdmFsOworCisJcmVnID0gb2ZfaW9fcmVxdWVzdF9hbmRfbWFwKG5vZGUsIDAsIG9mX25vZGVfZnVsbF9uYW1lKG5vZGUpKTsKKwlpZiAoSVNfRVJSKHJlZykpIHsKKwkJcHJfZXJyKCIlczogQ291bGQgbm90IG1hcCB0aGUgY2xvY2sgcmVnaXN0ZXJzXG4iLAorCQkgICAgICAgb2Zfbm9kZV9mdWxsX25hbWUobm9kZSkpOworCQlyZXR1cm47CisJfQorCisJLyogRm9yY2UgdGhlIFBMTC1BdWRpby0xeCBkaXZpZGVyIHRvIDQgKi8KKwl2YWwgPSByZWFkbChyZWcgKyBTVU42SV9BMzFfUExMX0FVRElPX1JFRyk7CisJdmFsICY9IH5HRU5NQVNLKDE5LCAxNik7CisJd3JpdGVsKHZhbCB8ICgzIDw8IDE2KSwgcmVnICsgU1VONklfQTMxX1BMTF9BVURJT19SRUcpOworCisJLyogRm9yY2UgUExMLU1JUEkgdG8gTUlQSSBtb2RlICovCisJdmFsID0gcmVhZGwocmVnICsgU1VONklfQTMxX1BMTF9NSVBJX1JFRyk7CisJdmFsICY9IEJJVCgxNik7CisJd3JpdGVsKHZhbCwgcmVnICsgU1VONklfQTMxX1BMTF9NSVBJX1JFRyk7CisKKwlzdW54aV9jY3VfcHJvYmUobm9kZSwgcmVnLCAmc3VuNmlfYTMxX2NjdV9kZXNjKTsKKworCWNjdV9tdXhfbm90aWZpZXJfcmVnaXN0ZXIocGxsX2NwdV9jbGsuY29tbW9uLmh3LmNsaywKKwkJCQkgICZzdW42aV9hMzFfY3B1X25iKTsKK30KK0NMS19PRl9ERUNMQVJFKHN1bjZpX2EzMV9jY3UsICJhbGx3aW5uZXIsc3VuNmktYTMxLWNjdSIsCisJICAgICAgIHN1bjZpX2EzMV9jY3Vfc2V0dXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjZpLWEzMS5oIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjZpLWEzMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNDM0MDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuNmktYTMxLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IENoZW4tWXUgVHNhaQorICoKKyAqIENoZW4tWXUgVHNhaSA8d2Vuc0Bjc2llLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfQ0NVX1NVTjZJX0EzMV9IXworI2RlZmluZSBfQ0NVX1NVTjZJX0EzMV9IXworCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svc3VuNmktYTMxLWNjdS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL3Jlc2V0L3N1bjZpLWEzMS1jY3UuaD4KKworI2RlZmluZSBDTEtfUExMX0NQVQkJMAorI2RlZmluZSBDTEtfUExMX0FVRElPX0JBU0UJMQorI2RlZmluZSBDTEtfUExMX0FVRElPCQkyCisjZGVmaW5lIENMS19QTExfQVVESU9fMlgJMworI2RlZmluZSBDTEtfUExMX0FVRElPXzRYCTQKKyNkZWZpbmUgQ0xLX1BMTF9BVURJT184WAk1CisjZGVmaW5lIENMS19QTExfVklERU8wCQk2CisjZGVmaW5lIENMS19QTExfVklERU8wXzJYCTcKKyNkZWZpbmUgQ0xLX1BMTF9WRQkJOAorI2RlZmluZSBDTEtfUExMX0REUgkJOQorCisvKiBUaGUgUExMX1BFUklQSCBjbG9jayBpcyBleHBvcnRlZCAqLworCisjZGVmaW5lIENMS19QTExfUEVSSVBIXzJYCTExCisjZGVmaW5lIENMS19QTExfVklERU8xCQkxMgorI2RlZmluZSBDTEtfUExMX1ZJREVPMV8yWAkxMworI2RlZmluZSBDTEtfUExMX0dQVQkJMTQKKyNkZWZpbmUgQ0xLX1BMTF9NSVBJCQkxNQorI2RlZmluZSBDTEtfUExMOQkJMTYKKyNkZWZpbmUgQ0xLX1BMTDEwCQkxNworCisvKiBUaGUgQ1BVWCBjbG9jayBpcyBleHBvcnRlZCAqLworCisjZGVmaW5lIENMS19BWEkJCQkxOQorI2RlZmluZSBDTEtfQUhCMQkJMjAKKyNkZWZpbmUgQ0xLX0FQQjEJCTIxCisjZGVmaW5lIENMS19BUEIyCQkyMgorCisvKiBBbGwgdGhlIGJ1cyBnYXRlcyBhcmUgZXhwb3J0ZWQgKi8KKworLyogVGhlIGZpcnN0IGJ1bmNoIG9mIG1vZHVsZSBjbG9ja3MgYXJlIGV4cG9ydGVkICovCisKKy8qIEVNQUMgY2xvY2sgaXMgbm90IGltcGxlbWVudGVkICovCisKKyNkZWZpbmUgQ0xLX01ERlMJCTEwNworI2RlZmluZSBDTEtfU0RSQU0wCQkxMDgKKyNkZWZpbmUgQ0xLX1NEUkFNMQkJMTA5CisKKy8qIEFsbCB0aGUgRFJBTSBnYXRlcyBhcmUgZXhwb3J0ZWQgKi8KKworLyogU29tZSBtb3JlIG1vZHVsZSBjbG9ja3MgYXJlIGV4cG9ydGVkICovCisKKyNkZWZpbmUgQ0xLX01CVVMwCQkxNDEKKyNkZWZpbmUgQ0xLX01CVVMxCQkxNDIKKworLyogU29tZSBtb3JlIG1vZHVsZSBjbG9ja3MgYW5kIGV4dGVybmFsIGNsb2NrIG91dHB1dHMgYXJlIGV4cG9ydGVkICovCisKKyNkZWZpbmUgQ0xLX05VTUJFUgkJKENMS19PVVRfQyArIDEpCisKKyNlbmRpZiAvKiBfQ0NVX1NVTjZJX0EzMV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLWEyMy1hMzMuaCBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW44aS1hMjMtYTMzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJjMGY4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW44aS1hMjMtYTMzLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IE1heGltZSBSaXBhcmQKKyAqCisgKiBNYXhpbWUgUmlwYXJkIDxtYXhpbWUucmlwYXJkQGZyZWUtZWxlY3Ryb25zLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfQ0NVX1NVTjhJX0EyM19BMzNfSF8KKyNkZWZpbmUgX0NDVV9TVU44SV9BMjNfQTMzX0hfCisKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9zdW44aS1hMjMtYTMzLWNjdS5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL3Jlc2V0L3N1bjhpLWEyMy1hMzMtY2N1Lmg+CisKKyNkZWZpbmUgQ0xLX1BMTF9DUFVYCQkwCisjZGVmaW5lIENMS19QTExfQVVESU9fQkFTRQkxCisjZGVmaW5lIENMS19QTExfQVVESU8JCTIKKyNkZWZpbmUgQ0xLX1BMTF9BVURJT18yWAkzCisjZGVmaW5lIENMS19QTExfQVVESU9fNFgJNAorI2RlZmluZSBDTEtfUExMX0FVRElPXzhYCTUKKyNkZWZpbmUgQ0xLX1BMTF9WSURFTwkJNgorI2RlZmluZSBDTEtfUExMX1ZJREVPXzJYCTcKKyNkZWZpbmUgQ0xLX1BMTF9WRQkJOAorI2RlZmluZSBDTEtfUExMX0REUjAJCTkKKyNkZWZpbmUgQ0xLX1BMTF9QRVJJUEgJCTEwCisjZGVmaW5lIENMS19QTExfUEVSSVBIXzJYCTExCisjZGVmaW5lIENMS19QTExfR1BVCQkxMgorI2RlZmluZSBDTEtfUExMX01JUEkJCTEzCisjZGVmaW5lIENMS19QTExfSFNJQwkJMTQKKyNkZWZpbmUgQ0xLX1BMTF9ERQkJMTUKKyNkZWZpbmUgQ0xLX1BMTF9ERFIxCQkxNgorI2RlZmluZSBDTEtfUExMX0REUgkJMTcKKworLyogVGhlIENQVVggY2xvY2sgaXMgZXhwb3J0ZWQgKi8KKworI2RlZmluZSBDTEtfQVhJCQkJMTkKKyNkZWZpbmUgQ0xLX0FIQjEJCTIwCisjZGVmaW5lIENMS19BUEIxCQkyMQorI2RlZmluZSBDTEtfQVBCMgkJMjIKKworLyogQWxsIHRoZSBidXMgZ2F0ZXMgYXJlIGV4cG9ydGVkICovCisKKy8qIFRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBtb2QgY2xvY2tzIGlzIGV4cG9ydGVkICovCisKKyNkZWZpbmUgQ0xLX0RSQU0JCTc5CisKKy8qIFNvbWUgbW9yZSBtb2R1bGUgY2xvY2tzIGFyZSBleHBvcnRlZCAqLworCisjZGVmaW5lIENMS19NQlVTCQk5NQorCisvKiBBbmQgdGhlIGxhc3QgbW9kdWxlIGNsb2NrcyBhcmUgZXhwb3J0ZWQgKi8KKworI2RlZmluZSBDTEtfTlVNQkVSCQkoQ0xLX0FUUyArIDEpCisKKyNlbmRpZiAvKiBfQ0NVX1NVTjhJX0EyM19BMzNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW44aS1hMjMuYyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW44aS1hMjMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjQ2ZDk4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLWEyMy5jCkBAIC0wLDAgKzEsNzM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IE1heGltZSBSaXBhcmQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorCisjaW5jbHVkZSAiY2N1X2NvbW1vbi5oIgorI2luY2x1ZGUgImNjdV9yZXNldC5oIgorCisjaW5jbHVkZSAiY2N1X2Rpdi5oIgorI2luY2x1ZGUgImNjdV9nYXRlLmgiCisjaW5jbHVkZSAiY2N1X21wLmgiCisjaW5jbHVkZSAiY2N1X211bHQuaCIKKyNpbmNsdWRlICJjY3VfbmsuaCIKKyNpbmNsdWRlICJjY3VfbmttLmgiCisjaW5jbHVkZSAiY2N1X25rbXAuaCIKKyNpbmNsdWRlICJjY3Vfbm0uaCIKKyNpbmNsdWRlICJjY3VfcGhhc2UuaCIKKworI2luY2x1ZGUgImNjdS1zdW44aS1hMjMtYTMzLmgiCisKKworc3RhdGljIHN0cnVjdCBjY3VfbmttcCBwbGxfY3B1eF9jbGsgPSB7CisJLmVuYWJsZSA9IEJJVCgzMSksCisJLmxvY2sJPSBCSVQoMjgpLAorCisJLm4JPSBfU1VOWElfQ0NVX01VTFQoOCwgNSksCisJLmsJPSBfU1VOWElfQ0NVX01VTFQoNCwgMiksCisJLm0JPSBfU1VOWElfQ0NVX0RJVigwLCAyKSwKKwkucAk9IF9TVU5YSV9DQ1VfRElWX01BWCgxNiwgMiwgNCksCisKKwkuY29tbW9uCT0geworCQkucmVnCQk9IDB4MDAwLAorCQkuaHcuaW5pdAk9IENMS19IV19JTklUKCJwbGwtY3B1eCIsICJvc2MyNE0iLAorCQkJCQkgICAgICAmY2N1X25rbXBfb3BzLAorCQkJCQkgICAgICAwKSwKKwl9LAorfTsKKworLyoKKyAqIFRoZSBBdWRpbyBQTEwgaXMgc3VwcG9zZWQgdG8gaGF2ZSA0IG91dHB1dHM6IDMgZml4ZWQgZmFjdG9ycyBmcm9tCisgKiB0aGUgYmFzZSAoMngsIDR4IGFuZCA4eCksIGFuZCBvbmUgdmFyaWFibGUgZGl2aWRlciAodGhlIG9uZSB0cnVlCisgKiBwbGwgYXVkaW8pLgorICoKKyAqIFdlIGRvbid0IGhhdmUgYW55IG5lZWQgZm9yIHRoZSB2YXJpYWJsZSBkaXZpZGVyIGZvciBub3csIHNvIHdlIGp1c3QKKyAqIGhhcmRjb2RlIGl0IHRvIG1hdGNoIHdpdGggdGhlIGNsb2NrIG5hbWVzCisgKi8KKyNkZWZpbmUgU1VOOElfQTIzX1BMTF9BVURJT19SRUcJMHgwMDgKKworc3RhdGljIFNVTlhJX0NDVV9OTV9XSVRIX0dBVEVfTE9DSyhwbGxfYXVkaW9fYmFzZV9jbGssICJwbGwtYXVkaW8tYmFzZSIsCisJCQkJICAgIm9zYzI0TSIsIDB4MDA4LAorCQkJCSAgIDgsIDcsCQkvKiBOICovCisJCQkJICAgMCwgNSwJCS8qIE0gKi8KKwkJCQkgICBCSVQoMzEpLAkJLyogZ2F0ZSAqLworCQkJCSAgIEJJVCgyOCksCQkvKiBsb2NrICovCisJCQkJICAgQ0xLX1NFVF9SQVRFX1VOR0FURSk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTk1fV0lUSF9GUkFDX0dBVEVfTE9DSyhwbGxfdmlkZW9fY2xrLCAicGxsLXZpZGVvIiwKKwkJCQkJIm9zYzI0TSIsIDB4MDEwLAorCQkJCQk4LCA3LAkJLyogTiAqLworCQkJCQkwLCA0LAkJLyogTSAqLworCQkJCQlCSVQoMjQpLAkvKiBmcmFjIGVuYWJsZSAqLworCQkJCQlCSVQoMjUpLAkvKiBmcmFjIHNlbGVjdCAqLworCQkJCQkyNzAwMDAwMDAsCS8qIGZyYWMgcmF0ZSAwICovCisJCQkJCTI5NzAwMDAwMCwJLyogZnJhYyByYXRlIDEgKi8KKwkJCQkJQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCQlCSVQoMjgpLAkvKiBsb2NrICovCisJCQkJCUNMS19TRVRfUkFURV9VTkdBVEUpOworCitzdGF0aWMgU1VOWElfQ0NVX05NX1dJVEhfRlJBQ19HQVRFX0xPQ0socGxsX3ZlX2NsaywgInBsbC12ZSIsCisJCQkJCSJvc2MyNE0iLCAweDAxOCwKKwkJCQkJOCwgNywJCS8qIE4gKi8KKwkJCQkJMCwgNCwJCS8qIE0gKi8KKwkJCQkJQklUKDI0KSwJLyogZnJhYyBlbmFibGUgKi8KKwkJCQkJQklUKDI1KSwJLyogZnJhYyBzZWxlY3QgKi8KKwkJCQkJMjcwMDAwMDAwLAkvKiBmcmFjIHJhdGUgMCAqLworCQkJCQkyOTcwMDAwMDAsCS8qIGZyYWMgcmF0ZSAxICovCisJCQkJCUJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkJQklUKDI4KSwJLyogbG9jayAqLworCQkJCQlDTEtfU0VUX1JBVEVfVU5HQVRFKTsKKworc3RhdGljIFNVTlhJX0NDVV9OS01fV0lUSF9HQVRFX0xPQ0socGxsX2Rkcl9jbGssICJwbGwtZGRyIiwKKwkJCQkgICAgIm9zYzI0TSIsIDB4MDIwLAorCQkJCSAgICA4LCA1LAkJLyogTiAqLworCQkJCSAgICA0LCAyLAkJLyogSyAqLworCQkJCSAgICAwLCAyLAkJLyogTSAqLworCQkJCSAgICBCSVQoMzEpLAkJLyogZ2F0ZSAqLworCQkJCSAgICBCSVQoMjgpLAkJLyogbG9jayAqLworCQkJCSAgICAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9OS19XSVRIX0dBVEVfTE9DS19QT1NURElWKHBsbF9wZXJpcGhfY2xrLCAicGxsLXBlcmlwaCIsCisJCQkJCSAgICJvc2MyNE0iLCAweDAyOCwKKwkJCQkJICAgOCwgNSwJLyogTiAqLworCQkJCQkgICA0LCAyLAkvKiBLICovCisJCQkJCSAgIEJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkJICAgQklUKDI4KSwJLyogbG9jayAqLworCQkJCQkgICAyLAkJLyogcG9zdC1kaXYgKi8KKwkJCQkJICAgQ0xLX1NFVF9SQVRFX1VOR0FURSk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTk1fV0lUSF9GUkFDX0dBVEVfTE9DSyhwbGxfZ3B1X2NsaywgInBsbC1ncHUiLAorCQkJCQkib3NjMjRNIiwgMHgwMzgsCisJCQkJCTgsIDcsCQkvKiBOICovCisJCQkJCTAsIDQsCQkvKiBNICovCisJCQkJCUJJVCgyNCksCS8qIGZyYWMgZW5hYmxlICovCisJCQkJCUJJVCgyNSksCS8qIGZyYWMgc2VsZWN0ICovCisJCQkJCTI3MDAwMDAwMCwJLyogZnJhYyByYXRlIDAgKi8KKwkJCQkJMjk3MDAwMDAwLAkvKiBmcmFjIHJhdGUgMSAqLworCQkJCQlCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJCUJJVCgyOCksCS8qIGxvY2sgKi8KKwkJCQkJQ0xLX1NFVF9SQVRFX1VOR0FURSk7CisKKy8qCisgKiBUaGUgTUlQSSBQTEwgaGFzIDIgbW9kZXM6ICJNSVBJIiBhbmQgIkhETUkiLgorICoKKyAqIFRoZSBNSVBJIG1vZGUgaXMgYSBzdGFuZGFyZCBOS00tc3R5bGUgY2xvY2suIFRoZSBIRE1JIG1vZGUgaXMgYW4KKyAqIGludGVnZXIgLyBmcmFjdGlvbmFsIGNsb2NrIHdpdGggc3dpdGNoYWJsZSBtdWx0aXBsaWVycyBhbmQgZGl2aWRlcnMuCisgKiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgaGVyZS4gV2UgaGFyZGNvZGUgdGhlIFBMTCB0byBNSVBJIG1vZGUuCisgKi8KKyNkZWZpbmUgU1VOOElfQTIzX1BMTF9NSVBJX1JFRwkweDA0MAorc3RhdGljIFNVTlhJX0NDVV9OS01fV0lUSF9HQVRFX0xPQ0socGxsX21pcGlfY2xrLCAicGxsLW1pcGkiLAorCQkJCSAgICAicGxsLXZpZGVvIiwgMHgwNDAsCisJCQkJICAgIDgsIDQsCQkvKiBOICovCisJCQkJICAgIDQsIDIsCQkvKiBLICovCisJCQkJICAgIDAsIDQsCQkvKiBNICovCisJCQkJICAgIEJJVCgzMSksCQkvKiBnYXRlICovCisJCQkJICAgIEJJVCgyOCksCQkvKiBsb2NrICovCisJCQkJICAgIENMS19TRVRfUkFURV9VTkdBVEUpOworCitzdGF0aWMgU1VOWElfQ0NVX05NX1dJVEhfRlJBQ19HQVRFX0xPQ0socGxsX2hzaWNfY2xrLCAicGxsLWhzaWMiLAorCQkJCQkib3NjMjRNIiwgMHgwNDQsCisJCQkJCTgsIDcsCQkvKiBOICovCisJCQkJCTAsIDQsCQkvKiBNICovCisJCQkJCUJJVCgyNCksCS8qIGZyYWMgZW5hYmxlICovCisJCQkJCUJJVCgyNSksCS8qIGZyYWMgc2VsZWN0ICovCisJCQkJCTI3MDAwMDAwMCwJLyogZnJhYyByYXRlIDAgKi8KKwkJCQkJMjk3MDAwMDAwLAkvKiBmcmFjIHJhdGUgMSAqLworCQkJCQlCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJCUJJVCgyOCksCS8qIGxvY2sgKi8KKwkJCQkJQ0xLX1NFVF9SQVRFX1VOR0FURSk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTk1fV0lUSF9GUkFDX0dBVEVfTE9DSyhwbGxfZGVfY2xrLCAicGxsLWRlIiwKKwkJCQkJIm9zYzI0TSIsIDB4MDQ4LAorCQkJCQk4LCA3LAkJLyogTiAqLworCQkJCQkwLCA0LAkJLyogTSAqLworCQkJCQlCSVQoMjQpLAkvKiBmcmFjIGVuYWJsZSAqLworCQkJCQlCSVQoMjUpLAkvKiBmcmFjIHNlbGVjdCAqLworCQkJCQkyNzAwMDAwMDAsCS8qIGZyYWMgcmF0ZSAwICovCisJCQkJCTI5NzAwMDAwMCwJLyogZnJhYyByYXRlIDEgKi8KKwkJCQkJQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCQlCSVQoMjgpLAkvKiBsb2NrICovCisJCQkJCUNMS19TRVRfUkFURV9VTkdBVEUpOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNwdXhfcGFyZW50c1tdID0geyAib3NjMzJrIiwgIm9zYzI0TSIsCisJCQkJCSAgICAgInBsbC1jcHV4IiAsICJwbGwtY3B1eCIgfTsKK3N0YXRpYyBTVU5YSV9DQ1VfTVVYKGNwdXhfY2xrLCAiY3B1eCIsIGNwdXhfcGFyZW50cywKKwkJICAgICAweDA1MCwgMTYsIDIsIENMS19JU19DUklUSUNBTCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTShheGlfY2xrLCAiYXhpIiwgImNwdXgiLCAweDA1MCwgMCwgMiwgMCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWhiMV9wYXJlbnRzW10gPSB7ICJvc2MzMmsiLCAib3NjMjRNIiwKKwkJCQkJICAgICAiYXhpIiAsICJwbGwtcGVyaXBoIiB9Oworc3RhdGljIHN0cnVjdCBjY3VfZGl2IGFoYjFfY2xrID0geworCS5kaXYJCT0gX1NVTlhJX0NDVV9ESVZfRkxBR1MoNCwgMiwgQ0xLX0RJVklERVJfUE9XRVJfT0ZfVFdPKSwKKworCS5tdXgJCT0geworCQkuc2hpZnQJPSAxMiwKKwkJLndpZHRoCT0gMiwKKworCQkudmFyaWFibGVfcHJlZGl2CT0geworCQkJLmluZGV4CT0gMywKKwkJCS5zaGlmdAk9IDYsCisJCQkud2lkdGgJPSAyLAorCQl9LAorCX0sCisKKwkuY29tbW9uCQk9IHsKKwkJLnJlZwkJPSAweDA1NCwKKwkJLmZlYXR1cmVzCT0gQ0NVX0ZFQVRVUkVfVkFSSUFCTEVfUFJFRElWLAorCQkuaHcuaW5pdAk9IENMS19IV19JTklUX1BBUkVOVFMoImFoYjEiLAorCQkJCQkJICAgICAgYWhiMV9wYXJlbnRzLAorCQkJCQkJICAgICAgJmNjdV9kaXZfb3BzLAorCQkJCQkJICAgICAgMCksCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2Rpdl90YWJsZSBhcGIxX2Rpdl90YWJsZVtdID0geworCXsgLnZhbCA9IDAsIC5kaXYgPSAyIH0sCisJeyAudmFsID0gMSwgLmRpdiA9IDIgfSwKKwl7IC52YWwgPSAyLCAuZGl2ID0gNCB9LAorCXsgLnZhbCA9IDMsIC5kaXYgPSA4IH0sCisJeyAvKiBTZW50aW5lbCAqLyB9LAorfTsKK3N0YXRpYyBTVU5YSV9DQ1VfRElWX1RBQkxFKGFwYjFfY2xrLCAiYXBiMSIsICJhaGIxIiwKKwkJCSAgIDB4MDU0LCA4LCAyLCBhcGIxX2Rpdl90YWJsZSwgMCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXBiMl9wYXJlbnRzW10gPSB7ICJvc2MzMmsiLCAib3NjMjRNIiwKKwkJCQkJICAgICAicGxsLXBlcmlwaCIgLCAicGxsLXBlcmlwaCIgfTsKK3N0YXRpYyBTVU5YSV9DQ1VfTVBfV0lUSF9NVVgoYXBiMl9jbGssICJhcGIyIiwgYXBiMl9wYXJlbnRzLCAweDA1OCwKKwkJCSAgICAgMCwgNSwJLyogTSAqLworCQkJICAgICAxNiwgMiwJLyogUCAqLworCQkJICAgICAyNCwgMiwJLyogbXV4ICovCisJCQkgICAgIDApOworCitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX21pcGlfZHNpX2NsaywJImJ1cy1taXBpLWRzaSIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCgxKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX2RtYV9jbGssCSJidXMtZG1hIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDYpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfbW1jMF9jbGssCSJidXMtbW1jMCIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCg4KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX21tYzFfY2xrLAkiYnVzLW1tYzEiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoOSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19tbWMyX2NsaywJImJ1cy1tbWMyIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDEwKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX25hbmRfY2xrLAkiYnVzLW5hbmQiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoMTMpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfZHJhbV9jbGssCSJidXMtZHJhbSIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCgxNCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19oc3RpbWVyX2NsaywJImJ1cy1oc3RpbWVyIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDE5KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX3NwaTBfY2xrLAkiYnVzLXNwaTAiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoMjApLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfc3BpMV9jbGssCSJidXMtc3BpMSIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCgyMSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19vdGdfY2xrLAkiYnVzLW90ZyIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCgyNCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19laGNpX2NsaywJImJ1cy1laGNpIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDI2KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX29oY2lfY2xrLAkiYnVzLW9oY2kiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoMjkpLCAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c192ZV9jbGssCSJidXMtdmUiLAkiYWhiMSIsCisJCSAgICAgIDB4MDY0LCBCSVQoMCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19sY2RfY2xrLAkiYnVzLWxjZCIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjQsIEJJVCg0KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX2NzaV9jbGssCSJidXMtY3NpIiwJImFoYjEiLAorCQkgICAgICAweDA2NCwgQklUKDgpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfZGVfYmVfY2xrLAkiYnVzLWRlLWJlIiwJImFoYjEiLAorCQkgICAgICAweDA2NCwgQklUKDEyKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX2RlX2ZlX2NsaywJImJ1cy1kZS1mZSIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjQsIEJJVCgxNCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19ncHVfY2xrLAkiYnVzLWdwdSIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjQsIEJJVCgyMCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19tc2dib3hfY2xrLAkiYnVzLW1zZ2JveCIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjQsIEJJVCgyMSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19zcGlubG9ja19jbGssCSJidXMtc3BpbmxvY2siLAkiYWhiMSIsCisJCSAgICAgIDB4MDY0LCBCSVQoMjIpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfZHJjX2NsaywJImJ1cy1kcmMiLAkiYWhiMSIsCisJCSAgICAgIDB4MDY0LCBCSVQoMjUpLCAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19jb2RlY19jbGssCSJidXMtY29kZWMiLAkiYXBiMSIsCisJCSAgICAgIDB4MDY4LCBCSVQoMCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19waW9fY2xrLAkiYnVzLXBpbyIsCSJhcGIxIiwKKwkJICAgICAgMHgwNjgsIEJJVCg1KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX2kyczBfY2xrLAkiYnVzLWkyczAiLAkiYXBiMSIsCisJCSAgICAgIDB4MDY4LCBCSVQoMTIpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfaTJzMV9jbGssCSJidXMtaTJzMSIsCSJhcGIxIiwKKwkJICAgICAgMHgwNjgsIEJJVCgxMyksIDApOworCitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX2kyYzBfY2xrLAkiYnVzLWkyYzAiLAkiYXBiMiIsCisJCSAgICAgIDB4MDZjLCBCSVQoMCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19pMmMxX2NsaywJImJ1cy1pMmMxIiwJImFwYjIiLAorCQkgICAgICAweDA2YywgQklUKDEpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfaTJjMl9jbGssCSJidXMtaTJjMiIsCSJhcGIyIiwKKwkJICAgICAgMHgwNmMsIEJJVCgyKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX3VhcnQwX2NsaywJImJ1cy11YXJ0MCIsCSJhcGIyIiwKKwkJICAgICAgMHgwNmMsIEJJVCgxNiksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c191YXJ0MV9jbGssCSJidXMtdWFydDEiLAkiYXBiMiIsCisJCSAgICAgIDB4MDZjLCBCSVQoMTcpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfdWFydDJfY2xrLAkiYnVzLXVhcnQyIiwJImFwYjIiLAorCQkgICAgICAweDA2YywgQklUKDE4KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX3VhcnQzX2NsaywJImJ1cy11YXJ0MyIsCSJhcGIyIiwKKwkJICAgICAgMHgwNmMsIEJJVCgxOSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c191YXJ0NF9jbGssCSJidXMtdWFydDQiLAkiYXBiMiIsCisJCSAgICAgIDB4MDZjLCBCSVQoMjApLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtb2QwX2RlZmF1bHRfcGFyZW50c1tdID0geyAib3NjMjRNIiwgInBsbC1wZXJpcGgiIH07CitzdGF0aWMgU1VOWElfQ0NVX01QX1dJVEhfTVVYX0dBVEUobmFuZF9jbGssICJuYW5kIiwgbW9kMF9kZWZhdWx0X3BhcmVudHMsIDB4MDgwLAorCQkJCSAgMCwgNCwJCS8qIE0gKi8KKwkJCQkgIDE2LCAyLAkvKiBQICovCisJCQkJICAyNCwgMiwJLyogbXV4ICovCisJCQkJICBCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJICAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9NUF9XSVRIX01VWF9HQVRFKG1tYzBfY2xrLCAibW1jMCIsIG1vZDBfZGVmYXVsdF9wYXJlbnRzLCAweDA4OCwKKwkJCQkgIDAsIDQsCQkvKiBNICovCisJCQkJICAxNiwgMiwJLyogUCAqLworCQkJCSAgMjQsIDIsCS8qIG11eCAqLworCQkJCSAgQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCSAgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfUEhBU0UobW1jMF9zYW1wbGVfY2xrLCAibW1jMF9zYW1wbGUiLCAibW1jMCIsCisJCSAgICAgICAweDA4OCwgMjAsIDMsIDApOworc3RhdGljIFNVTlhJX0NDVV9QSEFTRShtbWMwX291dHB1dF9jbGssICJtbWMwX291dHB1dCIsICJtbWMwIiwKKwkJICAgICAgIDB4MDg4LCA4LCAzLCAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9NUF9XSVRIX01VWF9HQVRFKG1tYzFfY2xrLCAibW1jMSIsIG1vZDBfZGVmYXVsdF9wYXJlbnRzLCAweDA4YywKKwkJCQkgIDAsIDQsCQkvKiBNICovCisJCQkJICAxNiwgMiwJLyogUCAqLworCQkJCSAgMjQsIDIsCS8qIG11eCAqLworCQkJCSAgQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCSAgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfUEhBU0UobW1jMV9zYW1wbGVfY2xrLCAibW1jMV9zYW1wbGUiLCAibW1jMSIsCisJCSAgICAgICAweDA4YywgMjAsIDMsIDApOworc3RhdGljIFNVTlhJX0NDVV9QSEFTRShtbWMxX291dHB1dF9jbGssICJtbWMxX291dHB1dCIsICJtbWMxIiwKKwkJICAgICAgIDB4MDhjLCA4LCAzLCAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9NUF9XSVRIX01VWF9HQVRFKG1tYzJfY2xrLCAibW1jMiIsIG1vZDBfZGVmYXVsdF9wYXJlbnRzLCAweDA5MCwKKwkJCQkgIDAsIDQsCQkvKiBNICovCisJCQkJICAxNiwgMiwJLyogUCAqLworCQkJCSAgMjQsIDIsCS8qIG11eCAqLworCQkJCSAgQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCSAgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfUEhBU0UobW1jMl9zYW1wbGVfY2xrLCAibW1jMl9zYW1wbGUiLCAibW1jMiIsCisJCSAgICAgICAweDA5MCwgMjAsIDMsIDApOworc3RhdGljIFNVTlhJX0NDVV9QSEFTRShtbWMyX291dHB1dF9jbGssICJtbWMyX291dHB1dCIsICJtbWMyIiwKKwkJICAgICAgIDB4MDkwLCA4LCAzLCAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9NUF9XSVRIX01VWF9HQVRFKHNwaTBfY2xrLCAic3BpMCIsIG1vZDBfZGVmYXVsdF9wYXJlbnRzLCAweDBhMCwKKwkJCQkgIDAsIDQsCQkvKiBNICovCisJCQkJICAxNiwgMiwJLyogUCAqLworCQkJCSAgMjQsIDIsCS8qIG11eCAqLworCQkJCSAgQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCSAgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTVBfV0lUSF9NVVhfR0FURShzcGkxX2NsaywgInNwaTEiLCBtb2QwX2RlZmF1bHRfcGFyZW50cywgMHgwYTQsCisJCQkJICAwLCA0LAkJLyogTSAqLworCQkJCSAgMTYsIDIsCS8qIFAgKi8KKwkJCQkgIDI0LCAyLAkvKiBtdXggKi8KKwkJCQkgIEJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkgIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyc19wYXJlbnRzW10gPSB7ICJwbGwtYXVkaW8tOHgiLCAicGxsLWF1ZGlvLTR4IiwKKwkJCQkJICAgICJwbGwtYXVkaW8tMngiLCAicGxsLWF1ZGlvIiB9Oworc3RhdGljIFNVTlhJX0NDVV9NVVhfV0lUSF9HQVRFKGkyczBfY2xrLCAiaTJzMCIsIGkyc19wYXJlbnRzLAorCQkJICAgICAgIDB4MGIwLCAxNiwgMiwgQklUKDMxKSwgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTVVYX1dJVEhfR0FURShpMnMxX2NsaywgImkyczEiLCBpMnNfcGFyZW50cywKKwkJCSAgICAgICAweDBiNCwgMTYsIDIsIEJJVCgzMSksIDApOworCisvKiBUT0RPOiB0aGUgcGFyZW50IGZvciBtb3N0IG9mIHRoZSBVU0IgY2xvY2tzIGlzIG5vdCBrbm93biAqLworc3RhdGljIFNVTlhJX0NDVV9HQVRFKHVzYl9waHkwX2NsaywJInVzYi1waHkwIiwJIm9zYzI0TSIsCisJCSAgICAgIDB4MGNjLCBCSVQoOCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKHVzYl9waHkxX2NsaywJInVzYi1waHkxIiwJIm9zYzI0TSIsCisJCSAgICAgIDB4MGNjLCBCSVQoOSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKHVzYl9oc2ljX2NsaywJInVzYi1oc2ljIiwJInBsbC1oc2ljIiwKKwkJICAgICAgMHgwY2MsIEJJVCgxMCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKHVzYl9oc2ljXzEyTV9jbGssCSJ1c2ItaHNpYy0xMk0iLAkib3NjMjRNIiwKKwkJICAgICAgMHgwY2MsIEJJVCgxMSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKHVzYl9vaGNpX2NsaywJInVzYi1vaGNpIiwJIm9zYzI0TSIsCisJCSAgICAgIDB4MGNjLCBCSVQoMTYpLCAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGRyYW1fdmVfY2xrLAkiZHJhbS12ZSIsCSJwbGwtZGRyIiwKKwkJICAgICAgMHgxMDAsIEJJVCgwKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoZHJhbV9jc2lfY2xrLAkiZHJhbS1jc2kiLAkicGxsLWRkciIsCisJCSAgICAgIDB4MTAwLCBCSVQoMSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGRyYW1fZHJjX2NsaywJImRyYW0tZHJjIiwJInBsbC1kZHIiLAorCQkgICAgICAweDEwMCwgQklUKDE2KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoZHJhbV9kZV9mZV9jbGssCSJkcmFtLWRlLWZlIiwJInBsbC1kZHIiLAorCQkgICAgICAweDEwMCwgQklUKDI0KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoZHJhbV9kZV9iZV9jbGssCSJkcmFtLWRlLWJlIiwJInBsbC1kZHIiLAorCQkgICAgICAweDEwMCwgQklUKDI2KSwgMCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGVfcGFyZW50c1tdID0geyAicGxsLXZpZGVvIiwgInBsbC1wZXJpcGgtMngiLAorCQkJCQkgICAicGxsLWdwdSIsICJwbGwtZGUiIH07CitzdGF0aWMgY29uc3QgdTggZGVfdGFibGVbXSA9IHsgMCwgMiwgMywgNSB9Oworc3RhdGljIFNVTlhJX0NDVV9NX1dJVEhfTVVYX1RBQkxFX0dBVEUoZGVfYmVfY2xrLCAiZGUtYmUiLAorCQkJCSAgICAgICBkZV9wYXJlbnRzLCBkZV90YWJsZSwKKwkJCQkgICAgICAgMHgxMDQsIDAsIDQsIDI0LCAzLCBCSVQoMzEpLCAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9NX1dJVEhfTVVYX1RBQkxFX0dBVEUoZGVfZmVfY2xrLCAiZGUtZmUiLAorCQkJCSAgICAgICBkZV9wYXJlbnRzLCBkZV90YWJsZSwKKwkJCQkgICAgICAgMHgxMGMsIDAsIDQsIDI0LCAzLCBCSVQoMzEpLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsY2RfY2gwX3BhcmVudHNbXSA9IHsgInBsbC12aWRlbyIsICJwbGwtdmlkZW8tMngiLAorCQkJCQkJInBsbC1taXBpIiB9Oworc3RhdGljIGNvbnN0IHU4IGxjZF9jaDBfdGFibGVbXSA9IHsgMCwgMiwgNCB9Oworc3RhdGljIFNVTlhJX0NDVV9NVVhfVEFCTEVfV0lUSF9HQVRFKGxjZF9jaDBfY2xrLCAibGNkLWNoMCIsCisJCQkJICAgICBsY2RfY2gwX3BhcmVudHMsIGxjZF9jaDBfdGFibGUsCisJCQkJICAgICAweDExOCwgMjQsIDMsIEJJVCgzMSksCisJCQkJICAgICBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsY2RfY2gxX3BhcmVudHNbXSA9IHsgInBsbC12aWRlbyIsICJwbGwtdmlkZW8tMngiIH07CitzdGF0aWMgY29uc3QgdTggbGNkX2NoMV90YWJsZVtdID0geyAwLCAyIH07CitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9NVVhfVEFCTEVfR0FURShsY2RfY2gxX2NsaywgImxjZC1jaDEiLAorCQkJCSAgICAgICBsY2RfY2gxX3BhcmVudHMsIGxjZF9jaDFfdGFibGUsCisJCQkJICAgICAgIDB4MTJjLCAwLCA0LCAyNCwgMiwgQklUKDMxKSwgMCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY3NpX3NjbGtfcGFyZW50c1tdID0geyAicGxsLXZpZGVvIiwgInBsbC1kZSIsCisJCQkJCQkgInBsbC1taXBpIiwgInBsbC12ZSIgfTsKK3N0YXRpYyBjb25zdCB1OCBjc2lfc2Nsa190YWJsZVtdID0geyAwLCAzLCA0LCA1IH07CitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9NVVhfVEFCTEVfR0FURShjc2lfc2Nsa19jbGssICJjc2ktc2NsayIsCisJCQkJICAgICAgIGNzaV9zY2xrX3BhcmVudHMsIGNzaV9zY2xrX3RhYmxlLAorCQkJCSAgICAgICAweDEzNCwgMTYsIDQsIDI0LCAzLCBCSVQoMzEpLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjc2lfbWNsa19wYXJlbnRzW10gPSB7ICJwbGwtdmlkZW8iLCAicGxsLWRlIiwKKwkJCQkJCSAib3NjMjRNIiB9Oworc3RhdGljIGNvbnN0IHU4IGNzaV9tY2xrX3RhYmxlW10gPSB7IDAsIDMsIDUgfTsKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9UQUJMRV9HQVRFKGNzaV9tY2xrX2NsaywgImNzaS1tY2xrIiwKKwkJCQkgICAgICAgY3NpX21jbGtfcGFyZW50cywgY3NpX21jbGtfdGFibGUsCisJCQkJICAgICAgIDB4MTM0LCAwLCA1LCA4LCAzLCBCSVQoMTUpLCAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9NX1dJVEhfR0FURSh2ZV9jbGssICJ2ZSIsICJwbGwtdmUiLAorCQkJICAgICAweDEzYywgMTYsIDMsIEJJVCgzMSksIENMS19TRVRfUkFURV9QQVJFTlQpOworCitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYWNfZGlnX2NsaywJImFjLWRpZyIsCSJwbGwtYXVkaW8iLAorCQkgICAgICAweDE0MCwgQklUKDMxKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYXZzX2NsaywJCSJhdnMiLAkJIm9zYzI0TSIsCisJCSAgICAgIDB4MTQ0LCBCSVQoMzEpLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtYnVzX3BhcmVudHNbXSA9IHsgIm9zYzI0TSIsICJwbGwtcGVyaXBoLTJ4IiwKKwkJCQkJICAgICAicGxsLWRkciIgfTsKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9HQVRFKG1idXNfY2xrLCAibWJ1cyIsIG1idXNfcGFyZW50cywKKwkJCQkgMHgxNWMsIDAsIDMsIDI0LCAyLCBCSVQoMzEpLCBDTEtfSVNfQ1JJVElDQUwpOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRzaV9zY2xrX3BhcmVudHNbXSA9IHsgInBsbC12aWRlbyIsICJwbGwtdmlkZW8tMngiIH07CitzdGF0aWMgY29uc3QgdTggZHNpX3NjbGtfdGFibGVbXSA9IHsgMCwgMiB9Oworc3RhdGljIFNVTlhJX0NDVV9NX1dJVEhfTVVYX1RBQkxFX0dBVEUoZHNpX3NjbGtfY2xrLCAiZHNpLXNjbGsiLAorCQkJCSAgICAgICBkc2lfc2Nsa19wYXJlbnRzLCBkc2lfc2Nsa190YWJsZSwKKwkJCQkgICAgICAgMHgxNjgsIDE2LCA0LCAyNCwgMiwgQklUKDMxKSwgMCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZHNpX2RwaHlfcGFyZW50c1tdID0geyAicGxsLXZpZGVvIiwgInBsbC1wZXJpcGgiIH07CitzdGF0aWMgY29uc3QgdTggZHNpX2RwaHlfdGFibGVbXSA9IHsgMCwgMiB9Oworc3RhdGljIFNVTlhJX0NDVV9NX1dJVEhfTVVYX1RBQkxFX0dBVEUoZHNpX2RwaHlfY2xrLCAiZHNpLWRwaHkiLAorCQkJCSAgICAgICBkc2lfZHBoeV9wYXJlbnRzLCBkc2lfZHBoeV90YWJsZSwKKwkJCQkgICAgICAgMHgxNjgsIDAsIDQsIDgsIDIsIEJJVCgxNSksIDApOworCitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9NVVhfVEFCTEVfR0FURShkcmNfY2xrLCAiZHJjIiwKKwkJCQkgICAgICAgZGVfcGFyZW50cywgZGVfdGFibGUsCisJCQkJICAgICAgIDB4MTgwLCAwLCA0LCAyNCwgMywgQklUKDMxKSwgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX0dBVEUoZ3B1X2NsaywgImdwdSIsICJwbGwtZ3B1IiwKKwkJCSAgICAgMHgxYTAsIDAsIDMsIEJJVCgzMSksIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF0c19wYXJlbnRzW10gPSB7ICJvc2MyNE0iLCAicGxsLXBlcmlwaCIgfTsKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9HQVRFKGF0c19jbGssICJhdHMiLCBhdHNfcGFyZW50cywKKwkJCQkgMHgxYjAsIDAsIDMsIDI0LCAyLCBCSVQoMzEpLCAwKTsKKworc3RhdGljIHN0cnVjdCBjY3VfY29tbW9uICpzdW44aV9hMjNfY2N1X2Nsa3NbXSA9IHsKKwkmcGxsX2NwdXhfY2xrLmNvbW1vbiwKKwkmcGxsX2F1ZGlvX2Jhc2VfY2xrLmNvbW1vbiwKKwkmcGxsX3ZpZGVvX2Nsay5jb21tb24sCisJJnBsbF92ZV9jbGsuY29tbW9uLAorCSZwbGxfZGRyX2Nsay5jb21tb24sCisJJnBsbF9wZXJpcGhfY2xrLmNvbW1vbiwKKwkmcGxsX2dwdV9jbGsuY29tbW9uLAorCSZwbGxfbWlwaV9jbGsuY29tbW9uLAorCSZwbGxfaHNpY19jbGsuY29tbW9uLAorCSZwbGxfZGVfY2xrLmNvbW1vbiwKKwkmY3B1eF9jbGsuY29tbW9uLAorCSZheGlfY2xrLmNvbW1vbiwKKwkmYWhiMV9jbGsuY29tbW9uLAorCSZhcGIxX2Nsay5jb21tb24sCisJJmFwYjJfY2xrLmNvbW1vbiwKKwkmYnVzX21pcGlfZHNpX2Nsay5jb21tb24sCisJJmJ1c19kbWFfY2xrLmNvbW1vbiwKKwkmYnVzX21tYzBfY2xrLmNvbW1vbiwKKwkmYnVzX21tYzFfY2xrLmNvbW1vbiwKKwkmYnVzX21tYzJfY2xrLmNvbW1vbiwKKwkmYnVzX25hbmRfY2xrLmNvbW1vbiwKKwkmYnVzX2RyYW1fY2xrLmNvbW1vbiwKKwkmYnVzX2hzdGltZXJfY2xrLmNvbW1vbiwKKwkmYnVzX3NwaTBfY2xrLmNvbW1vbiwKKwkmYnVzX3NwaTFfY2xrLmNvbW1vbiwKKwkmYnVzX290Z19jbGsuY29tbW9uLAorCSZidXNfZWhjaV9jbGsuY29tbW9uLAorCSZidXNfb2hjaV9jbGsuY29tbW9uLAorCSZidXNfdmVfY2xrLmNvbW1vbiwKKwkmYnVzX2xjZF9jbGsuY29tbW9uLAorCSZidXNfY3NpX2Nsay5jb21tb24sCisJJmJ1c19kZV9mZV9jbGsuY29tbW9uLAorCSZidXNfZGVfYmVfY2xrLmNvbW1vbiwKKwkmYnVzX2dwdV9jbGsuY29tbW9uLAorCSZidXNfbXNnYm94X2Nsay5jb21tb24sCisJJmJ1c19zcGlubG9ja19jbGsuY29tbW9uLAorCSZidXNfZHJjX2Nsay5jb21tb24sCisJJmJ1c19jb2RlY19jbGsuY29tbW9uLAorCSZidXNfcGlvX2Nsay5jb21tb24sCisJJmJ1c19pMnMwX2Nsay5jb21tb24sCisJJmJ1c19pMnMxX2Nsay5jb21tb24sCisJJmJ1c19pMmMwX2Nsay5jb21tb24sCisJJmJ1c19pMmMxX2Nsay5jb21tb24sCisJJmJ1c19pMmMyX2Nsay5jb21tb24sCisJJmJ1c191YXJ0MF9jbGsuY29tbW9uLAorCSZidXNfdWFydDFfY2xrLmNvbW1vbiwKKwkmYnVzX3VhcnQyX2Nsay5jb21tb24sCisJJmJ1c191YXJ0M19jbGsuY29tbW9uLAorCSZidXNfdWFydDRfY2xrLmNvbW1vbiwKKwkmbmFuZF9jbGsuY29tbW9uLAorCSZtbWMwX2Nsay5jb21tb24sCisJJm1tYzBfc2FtcGxlX2Nsay5jb21tb24sCisJJm1tYzBfb3V0cHV0X2Nsay5jb21tb24sCisJJm1tYzFfY2xrLmNvbW1vbiwKKwkmbW1jMV9zYW1wbGVfY2xrLmNvbW1vbiwKKwkmbW1jMV9vdXRwdXRfY2xrLmNvbW1vbiwKKwkmbW1jMl9jbGsuY29tbW9uLAorCSZtbWMyX3NhbXBsZV9jbGsuY29tbW9uLAorCSZtbWMyX291dHB1dF9jbGsuY29tbW9uLAorCSZzcGkwX2Nsay5jb21tb24sCisJJnNwaTFfY2xrLmNvbW1vbiwKKwkmaTJzMF9jbGsuY29tbW9uLAorCSZpMnMxX2Nsay5jb21tb24sCisJJnVzYl9waHkwX2Nsay5jb21tb24sCisJJnVzYl9waHkxX2Nsay5jb21tb24sCisJJnVzYl9oc2ljX2Nsay5jb21tb24sCisJJnVzYl9oc2ljXzEyTV9jbGsuY29tbW9uLAorCSZ1c2Jfb2hjaV9jbGsuY29tbW9uLAorCSZkcmFtX3ZlX2Nsay5jb21tb24sCisJJmRyYW1fY3NpX2Nsay5jb21tb24sCisJJmRyYW1fZHJjX2Nsay5jb21tb24sCisJJmRyYW1fZGVfZmVfY2xrLmNvbW1vbiwKKwkmZHJhbV9kZV9iZV9jbGsuY29tbW9uLAorCSZkZV9iZV9jbGsuY29tbW9uLAorCSZkZV9mZV9jbGsuY29tbW9uLAorCSZsY2RfY2gwX2Nsay5jb21tb24sCisJJmxjZF9jaDFfY2xrLmNvbW1vbiwKKwkmY3NpX3NjbGtfY2xrLmNvbW1vbiwKKwkmY3NpX21jbGtfY2xrLmNvbW1vbiwKKwkmdmVfY2xrLmNvbW1vbiwKKwkmYWNfZGlnX2Nsay5jb21tb24sCisJJmF2c19jbGsuY29tbW9uLAorCSZtYnVzX2Nsay5jb21tb24sCisJJmRzaV9zY2xrX2Nsay5jb21tb24sCisJJmRzaV9kcGh5X2Nsay5jb21tb24sCisJJmRyY19jbGsuY29tbW9uLAorCSZncHVfY2xrLmNvbW1vbiwKKwkmYXRzX2Nsay5jb21tb24sCit9OworCisvKiBXZSBoYXJkY29kZSB0aGUgZGl2aWRlciB0byA0IGZvciBub3cgKi8KK3N0YXRpYyBDTEtfRklYRURfRkFDVE9SKHBsbF9hdWRpb19jbGssICJwbGwtYXVkaW8iLAorCQkJInBsbC1hdWRpby1iYXNlIiwgNCwgMSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7CitzdGF0aWMgQ0xLX0ZJWEVEX0ZBQ1RPUihwbGxfYXVkaW9fMnhfY2xrLCAicGxsLWF1ZGlvLTJ4IiwKKwkJCSJwbGwtYXVkaW8tYmFzZSIsIDIsIDEsIENMS19TRVRfUkFURV9QQVJFTlQpOworc3RhdGljIENMS19GSVhFRF9GQUNUT1IocGxsX2F1ZGlvXzR4X2NsaywgInBsbC1hdWRpby00eCIsCisJCQkicGxsLWF1ZGlvLWJhc2UiLCAxLCAxLCBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKK3N0YXRpYyBDTEtfRklYRURfRkFDVE9SKHBsbF9hdWRpb184eF9jbGssICJwbGwtYXVkaW8tOHgiLAorCQkJInBsbC1hdWRpby1iYXNlIiwgMSwgMiwgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7CitzdGF0aWMgQ0xLX0ZJWEVEX0ZBQ1RPUihwbGxfcGVyaXBoXzJ4X2NsaywgInBsbC1wZXJpcGgtMngiLAorCQkJInBsbC1wZXJpcGgiLCAxLCAyLCAwKTsKK3N0YXRpYyBDTEtfRklYRURfRkFDVE9SKHBsbF92aWRlb18yeF9jbGssICJwbGwtdmlkZW8tMngiLAorCQkJInBsbC12aWRlbyIsIDEsIDIsIDApOworCitzdGF0aWMgc3RydWN0IGNsa19od19vbmVjZWxsX2RhdGEgc3VuOGlfYTIzX2h3X2Nsa3MgPSB7CisJLmh3cwk9IHsKKwkJW0NMS19QTExfQ1BVWF0JCT0gJnBsbF9jcHV4X2Nsay5jb21tb24uaHcsCisJCVtDTEtfUExMX0FVRElPX0JBU0VdCT0gJnBsbF9hdWRpb19iYXNlX2Nsay5jb21tb24uaHcsCisJCVtDTEtfUExMX0FVRElPXQkJPSAmcGxsX2F1ZGlvX2Nsay5odywKKwkJW0NMS19QTExfQVVESU9fMlhdCT0gJnBsbF9hdWRpb18yeF9jbGsuaHcsCisJCVtDTEtfUExMX0FVRElPXzRYXQk9ICZwbGxfYXVkaW9fNHhfY2xrLmh3LAorCQlbQ0xLX1BMTF9BVURJT184WF0JPSAmcGxsX2F1ZGlvXzh4X2Nsay5odywKKwkJW0NMS19QTExfVklERU9dCQk9ICZwbGxfdmlkZW9fY2xrLmNvbW1vbi5odywKKwkJW0NMS19QTExfVklERU9fMlhdCT0gJnBsbF92aWRlb18yeF9jbGsuaHcsCisJCVtDTEtfUExMX1ZFXQkJPSAmcGxsX3ZlX2Nsay5jb21tb24uaHcsCisJCVtDTEtfUExMX0REUjBdCQk9ICZwbGxfZGRyX2Nsay5jb21tb24uaHcsCisJCVtDTEtfUExMX1BFUklQSF0JPSAmcGxsX3BlcmlwaF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1BMTF9QRVJJUEhfMlhdCT0gJnBsbF9wZXJpcGhfMnhfY2xrLmh3LAorCQlbQ0xLX1BMTF9HUFVdCQk9ICZwbGxfZ3B1X2Nsay5jb21tb24uaHcsCisJCVtDTEtfUExMX01JUEldCQk9ICZwbGxfbWlwaV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1BMTF9IU0lDXQkJPSAmcGxsX2hzaWNfY2xrLmNvbW1vbi5odywKKwkJW0NMS19QTExfREVdCQk9ICZwbGxfZGVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19DUFVYXQkJPSAmY3B1eF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FYSV0JCT0gJmF4aV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FIQjFdCQk9ICZhaGIxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQVBCMV0JCT0gJmFwYjFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BUEIyXQkJPSAmYXBiMl9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19NSVBJX0RTSV0JPSAmYnVzX21pcGlfZHNpX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX0RNQV0JCT0gJmJ1c19kbWFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfTU1DMF0JCT0gJmJ1c19tbWMwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX01NQzFdCQk9ICZidXNfbW1jMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19NTUMyXQkJPSAmYnVzX21tYzJfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfTkFORF0JCT0gJmJ1c19uYW5kX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX0RSQU1dCQk9ICZidXNfZHJhbV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19IU1RJTUVSXQk9ICZidXNfaHN0aW1lcl9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19TUEkwXQkJPSAmYnVzX3NwaTBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfU1BJMV0JCT0gJmJ1c19zcGkxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX09UR10JCT0gJmJ1c19vdGdfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfRUhDSV0JCT0gJmJ1c19laGNpX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX09IQ0ldCQk9ICZidXNfb2hjaV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19WRV0JCT0gJmJ1c192ZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19MQ0RdCQk9ICZidXNfbGNkX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX0NTSV0JCT0gJmJ1c19jc2lfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfREVfQkVdCQk9ICZidXNfZGVfYmVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfREVfRkVdCQk9ICZidXNfZGVfZmVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfR1BVXQkJPSAmYnVzX2dwdV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19NU0dCT1hdCT0gJmJ1c19tc2dib3hfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfU1BJTkxPQ0tdCT0gJmJ1c19zcGlubG9ja19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19EUkNdCQk9ICZidXNfZHJjX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX0NPREVDXQkJPSAmYnVzX2NvZGVjX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX1BJT10JCT0gJmJ1c19waW9fY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfSTJTMF0JCT0gJmJ1c19pMnMwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX0kyUzFdCQk9ICZidXNfaTJzMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19JMkMwXQkJPSAmYnVzX2kyYzBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfSTJDMV0JCT0gJmJ1c19pMmMxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX0kyQzJdCQk9ICZidXNfaTJjMl9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19VQVJUMF0JCT0gJmJ1c191YXJ0MF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19VQVJUMV0JCT0gJmJ1c191YXJ0MV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19VQVJUMl0JCT0gJmJ1c191YXJ0Ml9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19VQVJUM10JCT0gJmJ1c191YXJ0M19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19VQVJUNF0JCT0gJmJ1c191YXJ0NF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX05BTkRdCQk9ICZuYW5kX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTU1DMF0JCT0gJm1tYzBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19NTUMwX1NBTVBMRV0JPSAmbW1jMF9zYW1wbGVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19NTUMwX09VVFBVVF0JPSAmbW1jMF9vdXRwdXRfY2xrLmNvbW1vbi5odywKKwkJW0NMS19NTUMxXQkJPSAmbW1jMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX01NQzFfU0FNUExFXQk9ICZtbWMxX3NhbXBsZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX01NQzFfT1VUUFVUXQk9ICZtbWMxX291dHB1dF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX01NQzJdCQk9ICZtbWMyX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTU1DMl9TQU1QTEVdCT0gJm1tYzJfc2FtcGxlX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTU1DMl9PVVRQVVRdCT0gJm1tYzJfb3V0cHV0X2Nsay5jb21tb24uaHcsCisJCVtDTEtfU1BJMF0JCT0gJnNwaTBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19TUEkxXQkJPSAmc3BpMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0kyUzBdCQk9ICZpMnMwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfSTJTMV0JCT0gJmkyczFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19VU0JfUEhZMF0JCT0gJnVzYl9waHkwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfVVNCX1BIWTFdCQk9ICZ1c2JfcGh5MV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1VTQl9IU0lDXQkJPSAmdXNiX2hzaWNfY2xrLmNvbW1vbi5odywKKwkJW0NMS19VU0JfSFNJQ18xMk1dCT0gJnVzYl9oc2ljXzEyTV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1VTQl9PSENJXQkJPSAmdXNiX29oY2lfY2xrLmNvbW1vbi5odywKKwkJW0NMS19EUkFNX1ZFXQkJPSAmZHJhbV92ZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0RSQU1fQ1NJXQkJPSAmZHJhbV9jc2lfY2xrLmNvbW1vbi5odywKKwkJW0NMS19EUkFNX0RSQ10JCT0gJmRyYW1fZHJjX2Nsay5jb21tb24uaHcsCisJCVtDTEtfRFJBTV9ERV9GRV0JPSAmZHJhbV9kZV9mZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0RSQU1fREVfQkVdCT0gJmRyYW1fZGVfYmVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19ERV9CRV0JCT0gJmRlX2JlX2Nsay5jb21tb24uaHcsCisJCVtDTEtfREVfRkVdCQk9ICZkZV9mZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0xDRF9DSDBdCQk9ICZsY2RfY2gwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTENEX0NIMV0JCT0gJmxjZF9jaDFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19DU0lfU0NMS10JCT0gJmNzaV9zY2xrX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQ1NJX01DTEtdCQk9ICZjc2lfbWNsa19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1ZFXQkJPSAmdmVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BQ19ESUddCQk9ICZhY19kaWdfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BVlNdCQk9ICZhdnNfY2xrLmNvbW1vbi5odywKKwkJW0NMS19NQlVTXQkJPSAmbWJ1c19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0RTSV9TQ0xLXQkJPSAmZHNpX3NjbGtfY2xrLmNvbW1vbi5odywKKwkJW0NMS19EU0lfRFBIWV0JCT0gJmRzaV9kcGh5X2Nsay5jb21tb24uaHcsCisJCVtDTEtfRFJDXQkJPSAmZHJjX2Nsay5jb21tb24uaHcsCisJCVtDTEtfR1BVXQkJPSAmZ3B1X2Nsay5jb21tb24uaHcsCisJCVtDTEtfQVRTXQkJPSAmYXRzX2Nsay5jb21tb24uaHcsCisJfSwKKwkubnVtCT0gQ0xLX05VTUJFUiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2N1X3Jlc2V0X21hcCBzdW44aV9hMjNfY2N1X3Jlc2V0c1tdID0geworCVtSU1RfVVNCX1BIWTBdCQk9ICB7IDB4MGNjLCBCSVQoMCkgfSwKKwlbUlNUX1VTQl9QSFkxXQkJPSAgeyAweDBjYywgQklUKDEpIH0sCisJW1JTVF9VU0JfSFNJQ10JCT0gIHsgMHgwY2MsIEJJVCgyKSB9LAorCisJW1JTVF9NQlVTXQkJPSAgeyAweDBmYywgQklUKDMxKSB9LAorCisJW1JTVF9CVVNfTUlQSV9EU0ldCT0gIHsgMHgyYzAsIEJJVCgxKSB9LAorCVtSU1RfQlVTX0RNQV0JCT0gIHsgMHgyYzAsIEJJVCg2KSB9LAorCVtSU1RfQlVTX01NQzBdCQk9ICB7IDB4MmMwLCBCSVQoOCkgfSwKKwlbUlNUX0JVU19NTUMxXQkJPSAgeyAweDJjMCwgQklUKDkpIH0sCisJW1JTVF9CVVNfTU1DMl0JCT0gIHsgMHgyYzAsIEJJVCgxMCkgfSwKKwlbUlNUX0JVU19OQU5EXQkJPSAgeyAweDJjMCwgQklUKDEzKSB9LAorCVtSU1RfQlVTX0RSQU1dCQk9ICB7IDB4MmMwLCBCSVQoMTQpIH0sCisJW1JTVF9CVVNfSFNUSU1FUl0JPSAgeyAweDJjMCwgQklUKDE5KSB9LAorCVtSU1RfQlVTX1NQSTBdCQk9ICB7IDB4MmMwLCBCSVQoMjApIH0sCisJW1JTVF9CVVNfU1BJMV0JCT0gIHsgMHgyYzAsIEJJVCgyMSkgfSwKKwlbUlNUX0JVU19PVEddCQk9ICB7IDB4MmMwLCBCSVQoMjQpIH0sCisJW1JTVF9CVVNfRUhDSV0JCT0gIHsgMHgyYzAsIEJJVCgyNikgfSwKKwlbUlNUX0JVU19PSENJXQkJPSAgeyAweDJjMCwgQklUKDI5KSB9LAorCisJW1JTVF9CVVNfVkVdCQk9ICB7IDB4MmM0LCBCSVQoMCkgfSwKKwlbUlNUX0JVU19MQ0RdCQk9ICB7IDB4MmM0LCBCSVQoNCkgfSwKKwlbUlNUX0JVU19DU0ldCQk9ICB7IDB4MmM0LCBCSVQoOCkgfSwKKwlbUlNUX0JVU19ERV9CRV0JCT0gIHsgMHgyYzQsIEJJVCgxMikgfSwKKwlbUlNUX0JVU19ERV9GRV0JCT0gIHsgMHgyYzQsIEJJVCgxNCkgfSwKKwlbUlNUX0JVU19HUFVdCQk9ICB7IDB4MmM0LCBCSVQoMjApIH0sCisJW1JTVF9CVVNfTVNHQk9YXQk9ICB7IDB4MmM0LCBCSVQoMjEpIH0sCisJW1JTVF9CVVNfU1BJTkxPQ0tdCT0gIHsgMHgyYzQsIEJJVCgyMikgfSwKKwlbUlNUX0JVU19EUkNdCQk9ICB7IDB4MmM0LCBCSVQoMjUpIH0sCisKKwlbUlNUX0JVU19MVkRTXQkJPSAgeyAweDJjOCwgQklUKDApIH0sCisKKwlbUlNUX0JVU19DT0RFQ10JCT0gIHsgMHgyZDAsIEJJVCgwKSB9LAorCVtSU1RfQlVTX0kyUzBdCQk9ICB7IDB4MmQwLCBCSVQoMTIpIH0sCisJW1JTVF9CVVNfSTJTMV0JCT0gIHsgMHgyZDAsIEJJVCgxMykgfSwKKworCVtSU1RfQlVTX0kyQzBdCQk9ICB7IDB4MmQ4LCBCSVQoMCkgfSwKKwlbUlNUX0JVU19JMkMxXQkJPSAgeyAweDJkOCwgQklUKDEpIH0sCisJW1JTVF9CVVNfSTJDMl0JCT0gIHsgMHgyZDgsIEJJVCgyKSB9LAorCVtSU1RfQlVTX1VBUlQwXQkJPSAgeyAweDJkOCwgQklUKDE2KSB9LAorCVtSU1RfQlVTX1VBUlQxXQkJPSAgeyAweDJkOCwgQklUKDE3KSB9LAorCVtSU1RfQlVTX1VBUlQyXQkJPSAgeyAweDJkOCwgQklUKDE4KSB9LAorCVtSU1RfQlVTX1VBUlQzXQkJPSAgeyAweDJkOCwgQklUKDE5KSB9LAorCVtSU1RfQlVTX1VBUlQ0XQkJPSAgeyAweDJkOCwgQklUKDIwKSB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdW54aV9jY3VfZGVzYyBzdW44aV9hMjNfY2N1X2Rlc2MgPSB7CisJLmNjdV9jbGtzCT0gc3VuOGlfYTIzX2NjdV9jbGtzLAorCS5udW1fY2N1X2Nsa3MJPSBBUlJBWV9TSVpFKHN1bjhpX2EyM19jY3VfY2xrcyksCisKKwkuaHdfY2xrcwk9ICZzdW44aV9hMjNfaHdfY2xrcywKKworCS5yZXNldHMJCT0gc3VuOGlfYTIzX2NjdV9yZXNldHMsCisJLm51bV9yZXNldHMJPSBBUlJBWV9TSVpFKHN1bjhpX2EyM19jY3VfcmVzZXRzKSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzdW44aV9hMjNfY2N1X3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3sKKwl2b2lkIF9faW9tZW0gKnJlZzsKKwl1MzIgdmFsOworCisJcmVnID0gb2ZfaW9fcmVxdWVzdF9hbmRfbWFwKG5vZGUsIDAsIG9mX25vZGVfZnVsbF9uYW1lKG5vZGUpKTsKKwlpZiAoSVNfRVJSKHJlZykpIHsKKwkJcHJfZXJyKCIlczogQ291bGQgbm90IG1hcCB0aGUgY2xvY2sgcmVnaXN0ZXJzXG4iLAorCQkgICAgICAgb2Zfbm9kZV9mdWxsX25hbWUobm9kZSkpOworCQlyZXR1cm47CisJfQorCisJLyogRm9yY2UgdGhlIFBMTC1BdWRpby0xeCBkaXZpZGVyIHRvIDQgKi8KKwl2YWwgPSByZWFkbChyZWcgKyBTVU44SV9BMjNfUExMX0FVRElPX1JFRyk7CisJdmFsICY9IH5HRU5NQVNLKDE5LCAxNik7CisJd3JpdGVsKHZhbCB8ICgzIDw8IDE2KSwgcmVnICsgU1VOOElfQTIzX1BMTF9BVURJT19SRUcpOworCisJLyogRm9yY2UgUExMLU1JUEkgdG8gTUlQSSBtb2RlICovCisJdmFsID0gcmVhZGwocmVnICsgU1VOOElfQTIzX1BMTF9NSVBJX1JFRyk7CisJdmFsICY9IH5CSVQoMTYpOworCXdyaXRlbCh2YWwsIHJlZyArIFNVTjhJX0EyM19QTExfTUlQSV9SRUcpOworCisJc3VueGlfY2N1X3Byb2JlKG5vZGUsIHJlZywgJnN1bjhpX2EyM19jY3VfZGVzYyk7Cit9CitDTEtfT0ZfREVDTEFSRShzdW44aV9hMjNfY2N1LCAiYWxsd2lubmVyLHN1bjhpLWEyMy1jY3UiLAorCSAgICAgICBzdW44aV9hMjNfY2N1X3NldHVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW44aS1hMzMuYyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW44aS1hMzMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmI0MGNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjhpLWEzMy5jCkBAIC0wLDAgKzEsNzgwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IE1heGltZSBSaXBhcmQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorCisjaW5jbHVkZSAiY2N1X2NvbW1vbi5oIgorI2luY2x1ZGUgImNjdV9yZXNldC5oIgorCisjaW5jbHVkZSAiY2N1X2Rpdi5oIgorI2luY2x1ZGUgImNjdV9nYXRlLmgiCisjaW5jbHVkZSAiY2N1X21wLmgiCisjaW5jbHVkZSAiY2N1X211bHQuaCIKKyNpbmNsdWRlICJjY3VfbmsuaCIKKyNpbmNsdWRlICJjY3VfbmttLmgiCisjaW5jbHVkZSAiY2N1X25rbXAuaCIKKyNpbmNsdWRlICJjY3Vfbm0uaCIKKyNpbmNsdWRlICJjY3VfcGhhc2UuaCIKKworI2luY2x1ZGUgImNjdS1zdW44aS1hMjMtYTMzLmgiCisKK3N0YXRpYyBzdHJ1Y3QgY2N1X25rbXAgcGxsX2NwdXhfY2xrID0geworCS5lbmFibGUgPSBCSVQoMzEpLAorCS5sb2NrCT0gQklUKDI4KSwKKworCS5uCT0gX1NVTlhJX0NDVV9NVUxUKDgsIDUpLAorCS5rCT0gX1NVTlhJX0NDVV9NVUxUKDQsIDIpLAorCS5tCT0gX1NVTlhJX0NDVV9ESVYoMCwgMiksCisJLnAJPSBfU1VOWElfQ0NVX0RJVl9NQVgoMTYsIDIsIDQpLAorCisJLmNvbW1vbgk9IHsKKwkJLnJlZwkJPSAweDAwMCwKKwkJLmh3LmluaXQJPSBDTEtfSFdfSU5JVCgicGxsLWNwdXgiLCAib3NjMjRNIiwKKwkJCQkJICAgICAgJmNjdV9ua21wX29wcywKKwkJCQkJICAgICAgMCksCisJfSwKK307CisKKy8qCisgKiBUaGUgQXVkaW8gUExMIGlzIHN1cHBvc2VkIHRvIGhhdmUgNCBvdXRwdXRzOiAzIGZpeGVkIGZhY3RvcnMgZnJvbQorICogdGhlIGJhc2UgKDJ4LCA0eCBhbmQgOHgpLCBhbmQgb25lIHZhcmlhYmxlIGRpdmlkZXIgKHRoZSBvbmUgdHJ1ZQorICogcGxsIGF1ZGlvKS4KKyAqCisgKiBXZSBkb24ndCBoYXZlIGFueSBuZWVkIGZvciB0aGUgdmFyaWFibGUgZGl2aWRlciBmb3Igbm93LCBzbyB3ZSBqdXN0CisgKiBoYXJkY29kZSBpdCB0byBtYXRjaCB3aXRoIHRoZSBjbG9jayBuYW1lcworICovCisjZGVmaW5lIFNVTjhJX0EzM19QTExfQVVESU9fUkVHCTB4MDA4CisKK3N0YXRpYyBTVU5YSV9DQ1VfTk1fV0lUSF9HQVRFX0xPQ0socGxsX2F1ZGlvX2Jhc2VfY2xrLCAicGxsLWF1ZGlvLWJhc2UiLAorCQkJCSAgICJvc2MyNE0iLCAweDAwOCwKKwkJCQkgICA4LCA3LAkJLyogTiAqLworCQkJCSAgIDAsIDUsCQkvKiBNICovCisJCQkJICAgQklUKDMxKSwJCS8qIGdhdGUgKi8KKwkJCQkgICBCSVQoMjgpLAkJLyogbG9jayAqLworCQkJCSAgIENMS19TRVRfUkFURV9VTkdBVEUpOworCitzdGF0aWMgU1VOWElfQ0NVX05NX1dJVEhfRlJBQ19HQVRFX0xPQ0socGxsX3ZpZGVvX2NsaywgInBsbC12aWRlbyIsCisJCQkJCSJvc2MyNE0iLCAweDAxMCwKKwkJCQkJOCwgNywJCS8qIE4gKi8KKwkJCQkJMCwgNCwJCS8qIE0gKi8KKwkJCQkJQklUKDI0KSwJLyogZnJhYyBlbmFibGUgKi8KKwkJCQkJQklUKDI1KSwJLyogZnJhYyBzZWxlY3QgKi8KKwkJCQkJMjcwMDAwMDAwLAkvKiBmcmFjIHJhdGUgMCAqLworCQkJCQkyOTcwMDAwMDAsCS8qIGZyYWMgcmF0ZSAxICovCisJCQkJCUJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkJQklUKDI4KSwJLyogbG9jayAqLworCQkJCQlDTEtfU0VUX1JBVEVfVU5HQVRFKTsKKworc3RhdGljIFNVTlhJX0NDVV9OTV9XSVRIX0ZSQUNfR0FURV9MT0NLKHBsbF92ZV9jbGssICJwbGwtdmUiLAorCQkJCQkib3NjMjRNIiwgMHgwMTgsCisJCQkJCTgsIDcsCQkvKiBOICovCisJCQkJCTAsIDQsCQkvKiBNICovCisJCQkJCUJJVCgyNCksCS8qIGZyYWMgZW5hYmxlICovCisJCQkJCUJJVCgyNSksCS8qIGZyYWMgc2VsZWN0ICovCisJCQkJCTI3MDAwMDAwMCwJLyogZnJhYyByYXRlIDAgKi8KKwkJCQkJMjk3MDAwMDAwLAkvKiBmcmFjIHJhdGUgMSAqLworCQkJCQlCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJCUJJVCgyOCksCS8qIGxvY2sgKi8KKwkJCQkJQ0xLX1NFVF9SQVRFX1VOR0FURSk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTktNX1dJVEhfR0FURV9MT0NLKHBsbF9kZHIwX2NsaywgInBsbC1kZHIwIiwKKwkJCQkgICAgIm9zYzI0TSIsIDB4MDIwLAorCQkJCSAgICA4LCA1LAkJLyogTiAqLworCQkJCSAgICA0LCAyLAkJLyogSyAqLworCQkJCSAgICAwLCAyLAkJLyogTSAqLworCQkJCSAgICBCSVQoMzEpLAkJLyogZ2F0ZSAqLworCQkJCSAgICBCSVQoMjgpLAkJLyogbG9jayAqLworCQkJCSAgICAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9OS19XSVRIX0dBVEVfTE9DS19QT1NURElWKHBsbF9wZXJpcGhfY2xrLCAicGxsLXBlcmlwaCIsCisJCQkJCSAgICJvc2MyNE0iLCAweDAyOCwKKwkJCQkJICAgOCwgNSwJLyogTiAqLworCQkJCQkgICA0LCAyLAkvKiBLICovCisJCQkJCSAgIEJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkJICAgQklUKDI4KSwJLyogbG9jayAqLworCQkJCQkgICAyLAkJLyogcG9zdC1kaXYgKi8KKwkJCQkJICAgQ0xLX1NFVF9SQVRFX1VOR0FURSk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTk1fV0lUSF9GUkFDX0dBVEVfTE9DSyhwbGxfZ3B1X2NsaywgInBsbC1ncHUiLAorCQkJCQkib3NjMjRNIiwgMHgwMzgsCisJCQkJCTgsIDcsCQkvKiBOICovCisJCQkJCTAsIDQsCQkvKiBNICovCisJCQkJCUJJVCgyNCksCS8qIGZyYWMgZW5hYmxlICovCisJCQkJCUJJVCgyNSksCS8qIGZyYWMgc2VsZWN0ICovCisJCQkJCTI3MDAwMDAwMCwJLyogZnJhYyByYXRlIDAgKi8KKwkJCQkJMjk3MDAwMDAwLAkvKiBmcmFjIHJhdGUgMSAqLworCQkJCQlCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJCUJJVCgyOCksCS8qIGxvY2sgKi8KKwkJCQkJQ0xLX1NFVF9SQVRFX1VOR0FURSk7CisKKy8qCisgKiBUaGUgTUlQSSBQTEwgaGFzIDIgbW9kZXM6ICJNSVBJIiBhbmQgIkhETUkiLgorICoKKyAqIFRoZSBNSVBJIG1vZGUgaXMgYSBzdGFuZGFyZCBOS00tc3R5bGUgY2xvY2suIFRoZSBIRE1JIG1vZGUgaXMgYW4KKyAqIGludGVnZXIgLyBmcmFjdGlvbmFsIGNsb2NrIHdpdGggc3dpdGNoYWJsZSBtdWx0aXBsaWVycyBhbmQgZGl2aWRlcnMuCisgKiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgaGVyZS4gV2UgaGFyZGNvZGUgdGhlIFBMTCB0byBNSVBJIG1vZGUuCisgKi8KKyNkZWZpbmUgU1VOOElfQTMzX1BMTF9NSVBJX1JFRwkweDA0MAorc3RhdGljIFNVTlhJX0NDVV9OS01fV0lUSF9HQVRFX0xPQ0socGxsX21pcGlfY2xrLCAicGxsLW1pcGkiLAorCQkJCSAgICAicGxsLXZpZGVvIiwgMHgwNDAsCisJCQkJICAgIDgsIDQsCQkvKiBOICovCisJCQkJICAgIDQsIDIsCQkvKiBLICovCisJCQkJICAgIDAsIDQsCQkvKiBNICovCisJCQkJICAgIEJJVCgzMSksCQkvKiBnYXRlICovCisJCQkJICAgIEJJVCgyOCksCQkvKiBsb2NrICovCisJCQkJICAgIENMS19TRVRfUkFURV9VTkdBVEUpOworCitzdGF0aWMgU1VOWElfQ0NVX05NX1dJVEhfRlJBQ19HQVRFX0xPQ0socGxsX2hzaWNfY2xrLCAicGxsLWhzaWMiLAorCQkJCQkib3NjMjRNIiwgMHgwNDQsCisJCQkJCTgsIDcsCQkvKiBOICovCisJCQkJCTAsIDQsCQkvKiBNICovCisJCQkJCUJJVCgyNCksCS8qIGZyYWMgZW5hYmxlICovCisJCQkJCUJJVCgyNSksCS8qIGZyYWMgc2VsZWN0ICovCisJCQkJCTI3MDAwMDAwMCwJLyogZnJhYyByYXRlIDAgKi8KKwkJCQkJMjk3MDAwMDAwLAkvKiBmcmFjIHJhdGUgMSAqLworCQkJCQlCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJCUJJVCgyOCksCS8qIGxvY2sgKi8KKwkJCQkJQ0xLX1NFVF9SQVRFX1VOR0FURSk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTk1fV0lUSF9GUkFDX0dBVEVfTE9DSyhwbGxfZGVfY2xrLCAicGxsLWRlIiwKKwkJCQkJIm9zYzI0TSIsIDB4MDQ4LAorCQkJCQk4LCA3LAkJLyogTiAqLworCQkJCQkwLCA0LAkJLyogTSAqLworCQkJCQlCSVQoMjQpLAkvKiBmcmFjIGVuYWJsZSAqLworCQkJCQlCSVQoMjUpLAkvKiBmcmFjIHNlbGVjdCAqLworCQkJCQkyNzAwMDAwMDAsCS8qIGZyYWMgcmF0ZSAwICovCisJCQkJCTI5NzAwMDAwMCwJLyogZnJhYyByYXRlIDEgKi8KKwkJCQkJQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCQlCSVQoMjgpLAkvKiBsb2NrICovCisJCQkJCUNMS19TRVRfUkFURV9VTkdBVEUpOworCisvKiBUT0RPOiBGaXggTiAqLworc3RhdGljIFNVTlhJX0NDVV9OX1dJVEhfR0FURV9MT0NLKHBsbF9kZHIxX2NsaywgInBsbC1kZHIxIiwKKwkJCQkgICJvc2MyNE0iLCAweDA0YywKKwkJCQkgIDgsIDYsCQkJLyogTiAqLworCQkJCSAgQklUKDMxKSwJCS8qIGdhdGUgKi8KKwkJCQkgIEJJVCgyOCksCQkvKiBsb2NrICovCisJCQkJICBDTEtfU0VUX1JBVEVfVU5HQVRFKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjcHV4X3BhcmVudHNbXSA9IHsgIm9zYzMyayIsICJvc2MyNE0iLAorCQkJCQkgICAgICJwbGwtY3B1eCIgLCAicGxsLWNwdXgiIH07CitzdGF0aWMgU1VOWElfQ0NVX01VWChjcHV4X2NsaywgImNwdXgiLCBjcHV4X3BhcmVudHMsCisJCSAgICAgMHgwNTAsIDE2LCAyLCBDTEtfSVNfQ1JJVElDQUwpOworCitzdGF0aWMgU1VOWElfQ0NVX00oYXhpX2NsaywgImF4aSIsICJjcHV4IiwgMHgwNTAsIDAsIDIsIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFoYjFfcGFyZW50c1tdID0geyAib3NjMzJrIiwgIm9zYzI0TSIsCisJCQkJCSAgICAgImF4aSIgLCAicGxsLXBlcmlwaCIgfTsKK3N0YXRpYyBzdHJ1Y3QgY2N1X2RpdiBhaGIxX2NsayA9IHsKKwkuZGl2CQk9IF9TVU5YSV9DQ1VfRElWX0ZMQUdTKDQsIDIsIENMS19ESVZJREVSX1BPV0VSX09GX1RXTyksCisKKwkubXV4CQk9IHsKKwkJLnNoaWZ0CT0gMTIsCisJCS53aWR0aAk9IDIsCisKKwkJLnZhcmlhYmxlX3ByZWRpdgk9IHsKKwkJCS5pbmRleAk9IDMsCisJCQkuc2hpZnQJPSA2LAorCQkJLndpZHRoCT0gMiwKKwkJfSwKKwl9LAorCisJLmNvbW1vbgkJPSB7CisJCS5yZWcJCT0gMHgwNTQsCisJCS5mZWF0dXJlcwk9IENDVV9GRUFUVVJFX1ZBUklBQkxFX1BSRURJViwKKwkJLmh3LmluaXQJPSBDTEtfSFdfSU5JVF9QQVJFTlRTKCJhaGIxIiwKKwkJCQkJCSAgICAgIGFoYjFfcGFyZW50cywKKwkJCQkJCSAgICAgICZjY3VfZGl2X29wcywKKwkJCQkJCSAgICAgIDApLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNsa19kaXZfdGFibGUgYXBiMV9kaXZfdGFibGVbXSA9IHsKKwl7IC52YWwgPSAwLCAuZGl2ID0gMiB9LAorCXsgLnZhbCA9IDEsIC5kaXYgPSAyIH0sCisJeyAudmFsID0gMiwgLmRpdiA9IDQgfSwKKwl7IC52YWwgPSAzLCAuZGl2ID0gOCB9LAorCXsgLyogU2VudGluZWwgKi8gfSwKK307CitzdGF0aWMgU1VOWElfQ0NVX0RJVl9UQUJMRShhcGIxX2NsaywgImFwYjEiLCAiYWhiMSIsCisJCQkgICAweDA1NCwgOCwgMiwgYXBiMV9kaXZfdGFibGUsIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFwYjJfcGFyZW50c1tdID0geyAib3NjMzJrIiwgIm9zYzI0TSIsCisJCQkJCSAgICAgInBsbC1wZXJpcGgiICwgInBsbC1wZXJpcGgiIH07CitzdGF0aWMgU1VOWElfQ0NVX01QX1dJVEhfTVVYKGFwYjJfY2xrLCAiYXBiMiIsIGFwYjJfcGFyZW50cywgMHgwNTgsCisJCQkgICAgIDAsIDUsCS8qIE0gKi8KKwkJCSAgICAgMTYsIDIsCS8qIFAgKi8KKwkJCSAgICAgMjQsIDIsCS8qIG11eCAqLworCQkJICAgICAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19taXBpX2RzaV9jbGssCSJidXMtbWlwaS1kc2kiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoMSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19zc19jbGssCSJidXMtc3MiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoNSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19kbWFfY2xrLAkiYnVzLWRtYSIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCg2KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX21tYzBfY2xrLAkiYnVzLW1tYzAiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoOCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19tbWMxX2NsaywJImJ1cy1tbWMxIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDkpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfbW1jMl9jbGssCSJidXMtbW1jMiIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCgxMCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19uYW5kX2NsaywJImJ1cy1uYW5kIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDEzKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX2RyYW1fY2xrLAkiYnVzLWRyYW0iLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoMTQpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfaHN0aW1lcl9jbGssCSJidXMtaHN0aW1lciIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCgxOSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19zcGkwX2NsaywJImJ1cy1zcGkwIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDIwKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX3NwaTFfY2xrLAkiYnVzLXNwaTEiLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoMjEpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfb3RnX2NsaywJImJ1cy1vdGciLAkiYWhiMSIsCisJCSAgICAgIDB4MDYwLCBCSVQoMjQpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfZWhjaV9jbGssCSJidXMtZWhjaSIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjAsIEJJVCgyNiksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19vaGNpX2NsaywJImJ1cy1vaGNpIiwJImFoYjEiLAorCQkgICAgICAweDA2MCwgQklUKDI5KSwgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfdmVfY2xrLAkiYnVzLXZlIiwJImFoYjEiLAorCQkgICAgICAweDA2NCwgQklUKDApLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfbGNkX2NsaywJImJ1cy1sY2QiLAkiYWhiMSIsCisJCSAgICAgIDB4MDY0LCBCSVQoNCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19jc2lfY2xrLAkiYnVzLWNzaSIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjQsIEJJVCg4KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX2RlX2JlX2NsaywJImJ1cy1kZS1iZSIsCSJhaGIxIiwKKwkJICAgICAgMHgwNjQsIEJJVCgxMiksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19kZV9mZV9jbGssCSJidXMtZGUtZmUiLAkiYWhiMSIsCisJCSAgICAgIDB4MDY0LCBCSVQoMTQpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfZ3B1X2NsaywJImJ1cy1ncHUiLAkiYWhiMSIsCisJCSAgICAgIDB4MDY0LCBCSVQoMjApLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfbXNnYm94X2NsaywJImJ1cy1tc2dib3giLAkiYWhiMSIsCisJCSAgICAgIDB4MDY0LCBCSVQoMjEpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfc3BpbmxvY2tfY2xrLAkiYnVzLXNwaW5sb2NrIiwJImFoYjEiLAorCQkgICAgICAweDA2NCwgQklUKDIyKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX2RyY19jbGssCSJidXMtZHJjIiwJImFoYjEiLAorCQkgICAgICAweDA2NCwgQklUKDI1KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX3NhdF9jbGssCSJidXMtc2F0IiwJImFoYjEiLAorCQkgICAgICAweDA2NCwgQklUKDI2KSwgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfY29kZWNfY2xrLAkiYnVzLWNvZGVjIiwJImFwYjEiLAorCQkgICAgICAweDA2OCwgQklUKDApLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfcGlvX2NsaywJImJ1cy1waW8iLAkiYXBiMSIsCisJCSAgICAgIDB4MDY4LCBCSVQoNSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19pMnMwX2NsaywJImJ1cy1pMnMwIiwJImFwYjEiLAorCQkgICAgICAweDA2OCwgQklUKDEyKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX2kyczFfY2xrLAkiYnVzLWkyczEiLAkiYXBiMSIsCisJCSAgICAgIDB4MDY4LCBCSVQoMTMpLCAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c19pMmMwX2NsaywJImJ1cy1pMmMwIiwJImFwYjIiLAorCQkgICAgICAweDA2YywgQklUKDApLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfaTJjMV9jbGssCSJidXMtaTJjMSIsCSJhcGIyIiwKKwkJICAgICAgMHgwNmMsIEJJVCgxKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX2kyYzJfY2xrLAkiYnVzLWkyYzIiLAkiYXBiMiIsCisJCSAgICAgIDB4MDZjLCBCSVQoMiksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c191YXJ0MF9jbGssCSJidXMtdWFydDAiLAkiYXBiMiIsCisJCSAgICAgIDB4MDZjLCBCSVQoMTYpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfdWFydDFfY2xrLAkiYnVzLXVhcnQxIiwJImFwYjIiLAorCQkgICAgICAweDA2YywgQklUKDE3KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYnVzX3VhcnQyX2NsaywJImJ1cy11YXJ0MiIsCSJhcGIyIiwKKwkJICAgICAgMHgwNmMsIEJJVCgxOCksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGJ1c191YXJ0M19jbGssCSJidXMtdWFydDMiLAkiYXBiMiIsCisJCSAgICAgIDB4MDZjLCBCSVQoMTkpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShidXNfdWFydDRfY2xrLAkiYnVzLXVhcnQ0IiwJImFwYjIiLAorCQkgICAgICAweDA2YywgQklUKDIwKSwgMCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbW9kMF9kZWZhdWx0X3BhcmVudHNbXSA9IHsgIm9zYzI0TSIsICJwbGwtcGVyaXBoIiB9Oworc3RhdGljIFNVTlhJX0NDVV9NUF9XSVRIX01VWF9HQVRFKG5hbmRfY2xrLCAibmFuZCIsIG1vZDBfZGVmYXVsdF9wYXJlbnRzLCAweDA4MCwKKwkJCQkgIDAsIDQsCQkvKiBNICovCisJCQkJICAxNiwgMiwJLyogUCAqLworCQkJCSAgMjQsIDIsCS8qIG11eCAqLworCQkJCSAgQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCSAgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTVBfV0lUSF9NVVhfR0FURShtbWMwX2NsaywgIm1tYzAiLCBtb2QwX2RlZmF1bHRfcGFyZW50cywgMHgwODgsCisJCQkJICAwLCA0LAkJLyogTSAqLworCQkJCSAgMTYsIDIsCS8qIFAgKi8KKwkJCQkgIDI0LCAyLAkvKiBtdXggKi8KKwkJCQkgIEJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkgIDApOworCitzdGF0aWMgU1VOWElfQ0NVX1BIQVNFKG1tYzBfc2FtcGxlX2NsaywgIm1tYzBfc2FtcGxlIiwgIm1tYzAiLAorCQkgICAgICAgMHgwODgsIDIwLCAzLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfUEhBU0UobW1jMF9vdXRwdXRfY2xrLCAibW1jMF9vdXRwdXQiLCAibW1jMCIsCisJCSAgICAgICAweDA4OCwgOCwgMywgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTVBfV0lUSF9NVVhfR0FURShtbWMxX2NsaywgIm1tYzEiLCBtb2QwX2RlZmF1bHRfcGFyZW50cywgMHgwOGMsCisJCQkJICAwLCA0LAkJLyogTSAqLworCQkJCSAgMTYsIDIsCS8qIFAgKi8KKwkJCQkgIDI0LCAyLAkvKiBtdXggKi8KKwkJCQkgIEJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkgIDApOworCitzdGF0aWMgU1VOWElfQ0NVX1BIQVNFKG1tYzFfc2FtcGxlX2NsaywgIm1tYzFfc2FtcGxlIiwgIm1tYzEiLAorCQkgICAgICAgMHgwOGMsIDIwLCAzLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfUEhBU0UobW1jMV9vdXRwdXRfY2xrLCAibW1jMV9vdXRwdXQiLCAibW1jMSIsCisJCSAgICAgICAweDA4YywgOCwgMywgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTVBfV0lUSF9NVVhfR0FURShtbWMyX2NsaywgIm1tYzIiLCBtb2QwX2RlZmF1bHRfcGFyZW50cywgMHgwOTAsCisJCQkJICAwLCA0LAkJLyogTSAqLworCQkJCSAgMTYsIDIsCS8qIFAgKi8KKwkJCQkgIDI0LCAyLAkvKiBtdXggKi8KKwkJCQkgIEJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkgIDApOworCitzdGF0aWMgU1VOWElfQ0NVX1BIQVNFKG1tYzJfc2FtcGxlX2NsaywgIm1tYzJfc2FtcGxlIiwgIm1tYzIiLAorCQkgICAgICAgMHgwOTAsIDIwLCAzLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfUEhBU0UobW1jMl9vdXRwdXRfY2xrLCAibW1jMl9vdXRwdXQiLCAibW1jMiIsCisJCSAgICAgICAweDA5MCwgOCwgMywgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTVBfV0lUSF9NVVhfR0FURShzc19jbGssICJzcyIsIG1vZDBfZGVmYXVsdF9wYXJlbnRzLCAweDA5YywKKwkJCQkgIDAsIDQsCQkvKiBNICovCisJCQkJICAxNiwgMiwJLyogUCAqLworCQkJCSAgMjQsIDIsCS8qIG11eCAqLworCQkJCSAgQklUKDMxKSwJLyogZ2F0ZSAqLworCQkJCSAgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTVBfV0lUSF9NVVhfR0FURShzcGkwX2NsaywgInNwaTAiLCBtb2QwX2RlZmF1bHRfcGFyZW50cywgMHgwYTAsCisJCQkJICAwLCA0LAkJLyogTSAqLworCQkJCSAgMTYsIDIsCS8qIFAgKi8KKwkJCQkgIDI0LCAyLAkvKiBtdXggKi8KKwkJCQkgIEJJVCgzMSksCS8qIGdhdGUgKi8KKwkJCQkgIDApOworCitzdGF0aWMgU1VOWElfQ0NVX01QX1dJVEhfTVVYX0dBVEUoc3BpMV9jbGssICJzcGkxIiwgbW9kMF9kZWZhdWx0X3BhcmVudHMsIDB4MGE0LAorCQkJCSAgMCwgNCwJCS8qIE0gKi8KKwkJCQkgIDE2LCAyLAkvKiBQICovCisJCQkJICAyNCwgMiwJLyogbXV4ICovCisJCQkJICBCSVQoMzEpLAkvKiBnYXRlICovCisJCQkJICAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMnNfcGFyZW50c1tdID0geyAicGxsLWF1ZGlvLTh4IiwgInBsbC1hdWRpby00eCIsCisJCQkJCSAgICAicGxsLWF1ZGlvLTJ4IiwgInBsbC1hdWRpbyIgfTsKK3N0YXRpYyBTVU5YSV9DQ1VfTVVYX1dJVEhfR0FURShpMnMwX2NsaywgImkyczAiLCBpMnNfcGFyZW50cywKKwkJCSAgICAgICAweDBiMCwgMTYsIDIsIEJJVCgzMSksIDApOworCitzdGF0aWMgU1VOWElfQ0NVX01VWF9XSVRIX0dBVEUoaTJzMV9jbGssICJpMnMxIiwgaTJzX3BhcmVudHMsCisJCQkgICAgICAgMHgwYjQsIDE2LCAyLCBCSVQoMzEpLCAwKTsKKworLyogVE9ETzogdGhlIHBhcmVudCBmb3IgbW9zdCBvZiB0aGUgVVNCIGNsb2NrcyBpcyBub3Qga25vd24gKi8KK3N0YXRpYyBTVU5YSV9DQ1VfR0FURSh1c2JfcGh5MF9jbGssCSJ1c2ItcGh5MCIsCSJvc2MyNE0iLAorCQkgICAgICAweDBjYywgQklUKDgpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURSh1c2JfcGh5MV9jbGssCSJ1c2ItcGh5MSIsCSJvc2MyNE0iLAorCQkgICAgICAweDBjYywgQklUKDkpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURSh1c2JfaHNpY19jbGssCSJ1c2ItaHNpYyIsCSJwbGwtaHNpYyIsCisJCSAgICAgIDB4MGNjLCBCSVQoMTApLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURSh1c2JfaHNpY18xMk1fY2xrLAkidXNiLWhzaWMtMTJNIiwJIm9zYzI0TSIsCisJCSAgICAgIDB4MGNjLCBCSVQoMTEpLCAwKTsKK3N0YXRpYyBTVU5YSV9DQ1VfR0FURSh1c2Jfb2hjaV9jbGssCSJ1c2Itb2hjaSIsCSJvc2MyNE0iLAorCQkgICAgICAweDBjYywgQklUKDE2KSwgMCk7CisKK3N0YXRpYyBTVU5YSV9DQ1VfTShkcmFtX2NsaywgImRyYW0iLCAicGxsLWRkciIsCisJCSAgIDB4MGY0LCAwLCA0LCBDTEtfSVNfQ1JJVElDQUwpOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBsbF9kZHJfcGFyZW50c1tdID0geyAicGxsLWRkcjAiLCAicGxsLWRkcjEiIH07CitzdGF0aWMgU1VOWElfQ0NVX01VWChwbGxfZGRyX2NsaywgInBsbC1kZHIiLCBwbGxfZGRyX3BhcmVudHMsCisJCSAgICAgMHgwZjgsIDE2LCAxLCAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGRyYW1fdmVfY2xrLAkiZHJhbS12ZSIsCSJkcmFtIiwKKwkJICAgICAgMHgxMDAsIEJJVCgwKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoZHJhbV9jc2lfY2xrLAkiZHJhbS1jc2kiLAkiZHJhbSIsCisJCSAgICAgIDB4MTAwLCBCSVQoMSksIDApOworc3RhdGljIFNVTlhJX0NDVV9HQVRFKGRyYW1fZHJjX2NsaywJImRyYW0tZHJjIiwJImRyYW0iLAorCQkgICAgICAweDEwMCwgQklUKDE2KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoZHJhbV9kZV9mZV9jbGssCSJkcmFtLWRlLWZlIiwJImRyYW0iLAorCQkgICAgICAweDEwMCwgQklUKDI0KSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoZHJhbV9kZV9iZV9jbGssCSJkcmFtLWRlLWJlIiwJImRyYW0iLAorCQkgICAgICAweDEwMCwgQklUKDI2KSwgMCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGVfcGFyZW50c1tdID0geyAicGxsLXZpZGVvIiwgInBsbC1wZXJpcGgtMngiLAorCQkJCQkgICAicGxsLWdwdSIsICJwbGwtZGUiIH07CitzdGF0aWMgY29uc3QgdTggZGVfdGFibGVbXSA9IHsgMCwgMiwgMywgNSB9Oworc3RhdGljIFNVTlhJX0NDVV9NX1dJVEhfTVVYX1RBQkxFX0dBVEUoZGVfYmVfY2xrLCAiZGUtYmUiLAorCQkJCSAgICAgICBkZV9wYXJlbnRzLCBkZV90YWJsZSwKKwkJCQkgICAgICAgMHgxMDQsIDAsIDQsIDI0LCAzLCBCSVQoMzEpLCAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9NX1dJVEhfTVVYX1RBQkxFX0dBVEUoZGVfZmVfY2xrLCAiZGUtZmUiLAorCQkJCSAgICAgICBkZV9wYXJlbnRzLCBkZV90YWJsZSwKKwkJCQkgICAgICAgMHgxMGMsIDAsIDQsIDI0LCAzLCBCSVQoMzEpLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsY2RfY2gwX3BhcmVudHNbXSA9IHsgInBsbC12aWRlbyIsICJwbGwtdmlkZW8tMngiLAorCQkJCQkJInBsbC1taXBpIiB9Oworc3RhdGljIGNvbnN0IHU4IGxjZF9jaDBfdGFibGVbXSA9IHsgMCwgMiwgNCB9Oworc3RhdGljIFNVTlhJX0NDVV9NVVhfVEFCTEVfV0lUSF9HQVRFKGxjZF9jaDBfY2xrLCAibGNkLWNoMCIsCisJCQkJICAgICBsY2RfY2gwX3BhcmVudHMsIGxjZF9jaDBfdGFibGUsCisJCQkJICAgICAweDExOCwgMjQsIDMsIEJJVCgzMSksCisJCQkJICAgICBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsY2RfY2gxX3BhcmVudHNbXSA9IHsgInBsbC12aWRlbyIsICJwbGwtdmlkZW8tMngiIH07CitzdGF0aWMgY29uc3QgdTggbGNkX2NoMV90YWJsZVtdID0geyAwLCAyIH07CitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9NVVhfVEFCTEVfR0FURShsY2RfY2gxX2NsaywgImxjZC1jaDEiLAorCQkJCSAgICAgICBsY2RfY2gxX3BhcmVudHMsIGxjZF9jaDFfdGFibGUsCisJCQkJICAgICAgIDB4MTJjLCAwLCA0LCAyNCwgMiwgQklUKDMxKSwgMCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY3NpX3NjbGtfcGFyZW50c1tdID0geyAicGxsLXZpZGVvIiwgInBsbC1kZSIsCisJCQkJCQkgInBsbC1taXBpIiwgInBsbC12ZSIgfTsKK3N0YXRpYyBjb25zdCB1OCBjc2lfc2Nsa190YWJsZVtdID0geyAwLCAzLCA0LCA1IH07CitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9NVVhfVEFCTEVfR0FURShjc2lfc2Nsa19jbGssICJjc2ktc2NsayIsCisJCQkJICAgICAgIGNzaV9zY2xrX3BhcmVudHMsIGNzaV9zY2xrX3RhYmxlLAorCQkJCSAgICAgICAweDEzNCwgMTYsIDQsIDI0LCAzLCBCSVQoMzEpLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjc2lfbWNsa19wYXJlbnRzW10gPSB7ICJwbGwtdmlkZW8iLCAicGxsLWRlIiwKKwkJCQkJCSAib3NjMjRNIiB9Oworc3RhdGljIGNvbnN0IHU4IGNzaV9tY2xrX3RhYmxlW10gPSB7IDAsIDMsIDUgfTsKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9UQUJMRV9HQVRFKGNzaV9tY2xrX2NsaywgImNzaS1tY2xrIiwKKwkJCQkgICAgICAgY3NpX21jbGtfcGFyZW50cywgY3NpX21jbGtfdGFibGUsCisJCQkJICAgICAgIDB4MTM0LCAwLCA1LCA4LCAzLCBCSVQoMTUpLCAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9NX1dJVEhfR0FURSh2ZV9jbGssICJ2ZSIsICJwbGwtdmUiLAorCQkJICAgICAweDEzYywgMTYsIDMsIEJJVCgzMSksIENMS19TRVRfUkFURV9QQVJFTlQpOworCitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYWNfZGlnX2NsaywJImFjLWRpZyIsCSJwbGwtYXVkaW8iLAorCQkgICAgICAweDE0MCwgQklUKDMxKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYWNfZGlnXzR4X2NsaywJImFjLWRpZy00eCIsCSJwbGwtYXVkaW8tNHgiLAorCQkgICAgICAweDE0MCwgQklUKDMwKSwgMCk7CitzdGF0aWMgU1VOWElfQ0NVX0dBVEUoYXZzX2NsaywJCSJhdnMiLAkJIm9zYzI0TSIsCisJCSAgICAgIDB4MTQ0LCBCSVQoMzEpLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtYnVzX3BhcmVudHNbXSA9IHsgIm9zYzI0TSIsICJwbGwtcGVyaXBoLTJ4IiwKKwkJCQkJICAgICAicGxsLWRkcjAiLCAicGxsLWRkcjEiIH07CitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9NVVhfR0FURShtYnVzX2NsaywgIm1idXMiLCBtYnVzX3BhcmVudHMsCisJCQkJIDB4MTVjLCAwLCAzLCAyNCwgMiwgQklUKDMxKSwgQ0xLX0lTX0NSSVRJQ0FMKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkc2lfc2Nsa19wYXJlbnRzW10gPSB7ICJwbGwtdmlkZW8iLCAicGxsLXZpZGVvLTJ4IiB9Oworc3RhdGljIGNvbnN0IHU4IGRzaV9zY2xrX3RhYmxlW10gPSB7IDAsIDIgfTsKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9UQUJMRV9HQVRFKGRzaV9zY2xrX2NsaywgImRzaS1zY2xrIiwKKwkJCQkgICAgICAgZHNpX3NjbGtfcGFyZW50cywgZHNpX3NjbGtfdGFibGUsCisJCQkJICAgICAgIDB4MTY4LCAxNiwgNCwgMjQsIDIsIEJJVCgzMSksIDApOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRzaV9kcGh5X3BhcmVudHNbXSA9IHsgInBsbC12aWRlbyIsICJwbGwtcGVyaXBoIiB9Oworc3RhdGljIGNvbnN0IHU4IGRzaV9kcGh5X3RhYmxlW10gPSB7IDAsIDIgfTsKK3N0YXRpYyBTVU5YSV9DQ1VfTV9XSVRIX01VWF9UQUJMRV9HQVRFKGRzaV9kcGh5X2NsaywgImRzaS1kcGh5IiwKKwkJCQkgICAgICAgZHNpX2RwaHlfcGFyZW50cywgZHNpX2RwaHlfdGFibGUsCisJCQkJICAgICAgIDB4MTY4LCAwLCA0LCA4LCAyLCBCSVQoMTUpLCAwKTsKKworc3RhdGljIFNVTlhJX0NDVV9NX1dJVEhfTVVYX1RBQkxFX0dBVEUoZHJjX2NsaywgImRyYyIsCisJCQkJICAgICAgIGRlX3BhcmVudHMsIGRlX3RhYmxlLAorCQkJCSAgICAgICAweDE4MCwgMCwgNCwgMjQsIDMsIEJJVCgzMSksIDApOworCitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9HQVRFKGdwdV9jbGssICJncHUiLCAicGxsLWdwdSIsCisJCQkgICAgIDB4MWEwLCAwLCAzLCBCSVQoMzEpLCAwKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdHNfcGFyZW50c1tdID0geyAib3NjMjRNIiwgInBsbC1wZXJpcGgiIH07CitzdGF0aWMgU1VOWElfQ0NVX01fV0lUSF9NVVhfR0FURShhdHNfY2xrLCAiYXRzIiwgYXRzX3BhcmVudHMsCisJCQkJIDB4MWIwLCAwLCAzLCAyNCwgMiwgQklUKDMxKSwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgY2N1X2NvbW1vbiAqc3VuOGlfYTMzX2NjdV9jbGtzW10gPSB7CisJJnBsbF9jcHV4X2Nsay5jb21tb24sCisJJnBsbF9hdWRpb19iYXNlX2Nsay5jb21tb24sCisJJnBsbF92aWRlb19jbGsuY29tbW9uLAorCSZwbGxfdmVfY2xrLmNvbW1vbiwKKwkmcGxsX2RkcjBfY2xrLmNvbW1vbiwKKwkmcGxsX3BlcmlwaF9jbGsuY29tbW9uLAorCSZwbGxfZ3B1X2Nsay5jb21tb24sCisJJnBsbF9taXBpX2Nsay5jb21tb24sCisJJnBsbF9oc2ljX2Nsay5jb21tb24sCisJJnBsbF9kZV9jbGsuY29tbW9uLAorCSZwbGxfZGRyMV9jbGsuY29tbW9uLAorCSZwbGxfZGRyX2Nsay5jb21tb24sCisJJmNwdXhfY2xrLmNvbW1vbiwKKwkmYXhpX2Nsay5jb21tb24sCisJJmFoYjFfY2xrLmNvbW1vbiwKKwkmYXBiMV9jbGsuY29tbW9uLAorCSZhcGIyX2Nsay5jb21tb24sCisJJmJ1c19taXBpX2RzaV9jbGsuY29tbW9uLAorCSZidXNfc3NfY2xrLmNvbW1vbiwKKwkmYnVzX2RtYV9jbGsuY29tbW9uLAorCSZidXNfbW1jMF9jbGsuY29tbW9uLAorCSZidXNfbW1jMV9jbGsuY29tbW9uLAorCSZidXNfbW1jMl9jbGsuY29tbW9uLAorCSZidXNfbmFuZF9jbGsuY29tbW9uLAorCSZidXNfZHJhbV9jbGsuY29tbW9uLAorCSZidXNfaHN0aW1lcl9jbGsuY29tbW9uLAorCSZidXNfc3BpMF9jbGsuY29tbW9uLAorCSZidXNfc3BpMV9jbGsuY29tbW9uLAorCSZidXNfb3RnX2Nsay5jb21tb24sCisJJmJ1c19laGNpX2Nsay5jb21tb24sCisJJmJ1c19vaGNpX2Nsay5jb21tb24sCisJJmJ1c192ZV9jbGsuY29tbW9uLAorCSZidXNfbGNkX2Nsay5jb21tb24sCisJJmJ1c19jc2lfY2xrLmNvbW1vbiwKKwkmYnVzX2RlX2ZlX2Nsay5jb21tb24sCisJJmJ1c19kZV9iZV9jbGsuY29tbW9uLAorCSZidXNfZ3B1X2Nsay5jb21tb24sCisJJmJ1c19tc2dib3hfY2xrLmNvbW1vbiwKKwkmYnVzX3NwaW5sb2NrX2Nsay5jb21tb24sCisJJmJ1c19kcmNfY2xrLmNvbW1vbiwKKwkmYnVzX3NhdF9jbGsuY29tbW9uLAorCSZidXNfY29kZWNfY2xrLmNvbW1vbiwKKwkmYnVzX3Bpb19jbGsuY29tbW9uLAorCSZidXNfaTJzMF9jbGsuY29tbW9uLAorCSZidXNfaTJzMV9jbGsuY29tbW9uLAorCSZidXNfaTJjMF9jbGsuY29tbW9uLAorCSZidXNfaTJjMV9jbGsuY29tbW9uLAorCSZidXNfaTJjMl9jbGsuY29tbW9uLAorCSZidXNfdWFydDBfY2xrLmNvbW1vbiwKKwkmYnVzX3VhcnQxX2Nsay5jb21tb24sCisJJmJ1c191YXJ0Ml9jbGsuY29tbW9uLAorCSZidXNfdWFydDNfY2xrLmNvbW1vbiwKKwkmYnVzX3VhcnQ0X2Nsay5jb21tb24sCisJJm5hbmRfY2xrLmNvbW1vbiwKKwkmbW1jMF9jbGsuY29tbW9uLAorCSZtbWMwX3NhbXBsZV9jbGsuY29tbW9uLAorCSZtbWMwX291dHB1dF9jbGsuY29tbW9uLAorCSZtbWMxX2Nsay5jb21tb24sCisJJm1tYzFfc2FtcGxlX2Nsay5jb21tb24sCisJJm1tYzFfb3V0cHV0X2Nsay5jb21tb24sCisJJm1tYzJfY2xrLmNvbW1vbiwKKwkmbW1jMl9zYW1wbGVfY2xrLmNvbW1vbiwKKwkmbW1jMl9vdXRwdXRfY2xrLmNvbW1vbiwKKwkmc3NfY2xrLmNvbW1vbiwKKwkmc3BpMF9jbGsuY29tbW9uLAorCSZzcGkxX2Nsay5jb21tb24sCisJJmkyczBfY2xrLmNvbW1vbiwKKwkmaTJzMV9jbGsuY29tbW9uLAorCSZ1c2JfcGh5MF9jbGsuY29tbW9uLAorCSZ1c2JfcGh5MV9jbGsuY29tbW9uLAorCSZ1c2JfaHNpY19jbGsuY29tbW9uLAorCSZ1c2JfaHNpY18xMk1fY2xrLmNvbW1vbiwKKwkmdXNiX29oY2lfY2xrLmNvbW1vbiwKKwkmZHJhbV9jbGsuY29tbW9uLAorCSZkcmFtX3ZlX2Nsay5jb21tb24sCisJJmRyYW1fY3NpX2Nsay5jb21tb24sCisJJmRyYW1fZHJjX2Nsay5jb21tb24sCisJJmRyYW1fZGVfZmVfY2xrLmNvbW1vbiwKKwkmZHJhbV9kZV9iZV9jbGsuY29tbW9uLAorCSZkZV9iZV9jbGsuY29tbW9uLAorCSZkZV9mZV9jbGsuY29tbW9uLAorCSZsY2RfY2gwX2Nsay5jb21tb24sCisJJmxjZF9jaDFfY2xrLmNvbW1vbiwKKwkmY3NpX3NjbGtfY2xrLmNvbW1vbiwKKwkmY3NpX21jbGtfY2xrLmNvbW1vbiwKKwkmdmVfY2xrLmNvbW1vbiwKKwkmYWNfZGlnX2Nsay5jb21tb24sCisJJmFjX2RpZ180eF9jbGsuY29tbW9uLAorCSZhdnNfY2xrLmNvbW1vbiwKKwkmbWJ1c19jbGsuY29tbW9uLAorCSZkc2lfc2Nsa19jbGsuY29tbW9uLAorCSZkc2lfZHBoeV9jbGsuY29tbW9uLAorCSZkcmNfY2xrLmNvbW1vbiwKKwkmZ3B1X2Nsay5jb21tb24sCisJJmF0c19jbGsuY29tbW9uLAorfTsKKworLyogV2UgaGFyZGNvZGUgdGhlIGRpdmlkZXIgdG8gNCBmb3Igbm93ICovCitzdGF0aWMgQ0xLX0ZJWEVEX0ZBQ1RPUihwbGxfYXVkaW9fY2xrLCAicGxsLWF1ZGlvIiwKKwkJCSJwbGwtYXVkaW8tYmFzZSIsIDQsIDEsIENMS19TRVRfUkFURV9QQVJFTlQpOworc3RhdGljIENMS19GSVhFRF9GQUNUT1IocGxsX2F1ZGlvXzJ4X2NsaywgInBsbC1hdWRpby0yeCIsCisJCQkicGxsLWF1ZGlvLWJhc2UiLCAyLCAxLCBDTEtfU0VUX1JBVEVfUEFSRU5UKTsKK3N0YXRpYyBDTEtfRklYRURfRkFDVE9SKHBsbF9hdWRpb180eF9jbGssICJwbGwtYXVkaW8tNHgiLAorCQkJInBsbC1hdWRpby1iYXNlIiwgMSwgMSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7CitzdGF0aWMgQ0xLX0ZJWEVEX0ZBQ1RPUihwbGxfYXVkaW9fOHhfY2xrLCAicGxsLWF1ZGlvLTh4IiwKKwkJCSJwbGwtYXVkaW8tYmFzZSIsIDEsIDIsIENMS19TRVRfUkFURV9QQVJFTlQpOworc3RhdGljIENMS19GSVhFRF9GQUNUT1IocGxsX3BlcmlwaF8yeF9jbGssICJwbGwtcGVyaXBoLTJ4IiwKKwkJCSJwbGwtcGVyaXBoIiwgMSwgMiwgMCk7CitzdGF0aWMgQ0xLX0ZJWEVEX0ZBQ1RPUihwbGxfdmlkZW9fMnhfY2xrLCAicGxsLXZpZGVvLTJ4IiwKKwkJCSJwbGwtdmlkZW8iLCAxLCAyLCAwKTsKKworc3RhdGljIHN0cnVjdCBjbGtfaHdfb25lY2VsbF9kYXRhIHN1bjhpX2EzM19od19jbGtzID0geworCS5od3MJPSB7CisJCVtDTEtfUExMX0NQVVhdCQk9ICZwbGxfY3B1eF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1BMTF9BVURJT19CQVNFXQk9ICZwbGxfYXVkaW9fYmFzZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1BMTF9BVURJT10JCT0gJnBsbF9hdWRpb19jbGsuaHcsCisJCVtDTEtfUExMX0FVRElPXzJYXQk9ICZwbGxfYXVkaW9fMnhfY2xrLmh3LAorCQlbQ0xLX1BMTF9BVURJT180WF0JPSAmcGxsX2F1ZGlvXzR4X2Nsay5odywKKwkJW0NMS19QTExfQVVESU9fOFhdCT0gJnBsbF9hdWRpb184eF9jbGsuaHcsCisJCVtDTEtfUExMX1ZJREVPXQkJPSAmcGxsX3ZpZGVvX2Nsay5jb21tb24uaHcsCisJCVtDTEtfUExMX1ZJREVPXzJYXQk9ICZwbGxfdmlkZW9fMnhfY2xrLmh3LAorCQlbQ0xLX1BMTF9WRV0JCT0gJnBsbF92ZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1BMTF9ERFIwXQkJPSAmcGxsX2RkcjBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19QTExfUEVSSVBIXQk9ICZwbGxfcGVyaXBoX2Nsay5jb21tb24uaHcsCisJCVtDTEtfUExMX1BFUklQSF8yWF0JPSAmcGxsX3BlcmlwaF8yeF9jbGsuaHcsCisJCVtDTEtfUExMX0dQVV0JCT0gJnBsbF9ncHVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19QTExfTUlQSV0JCT0gJnBsbF9taXBpX2Nsay5jb21tb24uaHcsCisJCVtDTEtfUExMX0hTSUNdCQk9ICZwbGxfaHNpY19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1BMTF9ERV0JCT0gJnBsbF9kZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1BMTF9ERFIxXQkJPSAmcGxsX2RkcjFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19QTExfRERSXQkJPSAmcGxsX2Rkcl9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0NQVVhdCQk9ICZjcHV4X2Nsay5jb21tb24uaHcsCisJCVtDTEtfQVhJXQkJPSAmYXhpX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUhCMV0JCT0gJmFoYjFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19BUEIxXQkJPSAmYXBiMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FQQjJdCQk9ICZhcGIyX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX01JUElfRFNJXQk9ICZidXNfbWlwaV9kc2lfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfU1NdCQk9ICZidXNfc3NfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfRE1BXQkJPSAmYnVzX2RtYV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19NTUMwXQkJPSAmYnVzX21tYzBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfTU1DMV0JCT0gJmJ1c19tbWMxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX01NQzJdCQk9ICZidXNfbW1jMl9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19OQU5EXQkJPSAmYnVzX25hbmRfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfRFJBTV0JCT0gJmJ1c19kcmFtX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX0hTVElNRVJdCT0gJmJ1c19oc3RpbWVyX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX1NQSTBdCQk9ICZidXNfc3BpMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19TUEkxXQkJPSAmYnVzX3NwaTFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfT1RHXQkJPSAmYnVzX290Z19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19FSENJXQkJPSAmYnVzX2VoY2lfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfT0hDSV0JCT0gJmJ1c19vaGNpX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX1ZFXQkJPSAmYnVzX3ZlX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX0xDRF0JCT0gJmJ1c19sY2RfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfQ1NJXQkJPSAmYnVzX2NzaV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19ERV9CRV0JCT0gJmJ1c19kZV9iZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19ERV9GRV0JCT0gJmJ1c19kZV9mZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19HUFVdCQk9ICZidXNfZ3B1X2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX01TR0JPWF0JPSAmYnVzX21zZ2JveF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19TUElOTE9DS10JPSAmYnVzX3NwaW5sb2NrX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX0RSQ10JCT0gJmJ1c19kcmNfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfU0FUXQkJPSAmYnVzX3NhdF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19DT0RFQ10JCT0gJmJ1c19jb2RlY19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19QSU9dCQk9ICZidXNfcGlvX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX0kyUzBdCQk9ICZidXNfaTJzMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19JMlMxXQkJPSAmYnVzX2kyczFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfSTJDMF0JCT0gJmJ1c19pMmMwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQlVTX0kyQzFdCQk9ICZidXNfaTJjMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0JVU19JMkMyXQkJPSAmYnVzX2kyYzJfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfVUFSVDBdCQk9ICZidXNfdWFydDBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfVUFSVDFdCQk9ICZidXNfdWFydDFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfVUFSVDJdCQk9ICZidXNfdWFydDJfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfVUFSVDNdCQk9ICZidXNfdWFydDNfY2xrLmNvbW1vbi5odywKKwkJW0NMS19CVVNfVUFSVDRdCQk9ICZidXNfdWFydDRfY2xrLmNvbW1vbi5odywKKwkJW0NMS19OQU5EXQkJPSAmbmFuZF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX01NQzBdCQk9ICZtbWMwX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTU1DMF9TQU1QTEVdCT0gJm1tYzBfc2FtcGxlX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTU1DMF9PVVRQVVRdCT0gJm1tYzBfb3V0cHV0X2Nsay5jb21tb24uaHcsCisJCVtDTEtfTU1DMV0JCT0gJm1tYzFfY2xrLmNvbW1vbi5odywKKwkJW0NMS19NTUMxX1NBTVBMRV0JPSAmbW1jMV9zYW1wbGVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19NTUMxX09VVFBVVF0JPSAmbW1jMV9vdXRwdXRfY2xrLmNvbW1vbi5odywKKwkJW0NMS19NTUMyXQkJPSAmbW1jMl9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX01NQzJfU0FNUExFXQk9ICZtbWMyX3NhbXBsZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX01NQzJfT1VUUFVUXQk9ICZtbWMyX291dHB1dF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1NTXQkJPSAmc3NfY2xrLmNvbW1vbi5odywKKwkJW0NMS19TUEkwXQkJPSAmc3BpMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1NQSTFdCQk9ICZzcGkxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfSTJTMF0JCT0gJmkyczBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19JMlMxXQkJPSAmaTJzMV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1VTQl9QSFkwXQkJPSAmdXNiX3BoeTBfY2xrLmNvbW1vbi5odywKKwkJW0NMS19VU0JfUEhZMV0JCT0gJnVzYl9waHkxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfVVNCX0hTSUNdCQk9ICZ1c2JfaHNpY19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX1VTQl9IU0lDXzEyTV0JPSAmdXNiX2hzaWNfMTJNX2Nsay5jb21tb24uaHcsCisJCVtDTEtfVVNCX09IQ0ldCQk9ICZ1c2Jfb2hjaV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0RSQU1dCQk9ICZkcmFtX2Nsay5jb21tb24uaHcsCisJCVtDTEtfRFJBTV9WRV0JCT0gJmRyYW1fdmVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19EUkFNX0NTSV0JCT0gJmRyYW1fY3NpX2Nsay5jb21tb24uaHcsCisJCVtDTEtfRFJBTV9EUkNdCQk9ICZkcmFtX2RyY19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0RSQU1fREVfRkVdCT0gJmRyYW1fZGVfZmVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19EUkFNX0RFX0JFXQk9ICZkcmFtX2RlX2JlX2Nsay5jb21tb24uaHcsCisJCVtDTEtfREVfQkVdCQk9ICZkZV9iZV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0RFX0ZFXQkJPSAmZGVfZmVfY2xrLmNvbW1vbi5odywKKwkJW0NMS19MQ0RfQ0gwXQkJPSAmbGNkX2NoMF9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0xDRF9DSDFdCQk9ICZsY2RfY2gxX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQ1NJX1NDTEtdCQk9ICZjc2lfc2Nsa19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0NTSV9NQ0xLXQkJPSAmY3NpX21jbGtfY2xrLmNvbW1vbi5odywKKwkJW0NMS19WRV0JCT0gJnZlX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUNfRElHXQkJPSAmYWNfZGlnX2Nsay5jb21tb24uaHcsCisJCVtDTEtfQUNfRElHXzRYXQkJPSAmYWNfZGlnXzR4X2Nsay5jb21tb24uaHcsCisJCVtDTEtfQVZTXQkJPSAmYXZzX2Nsay5jb21tb24uaHcsCisJCVtDTEtfTUJVU10JCT0gJm1idXNfY2xrLmNvbW1vbi5odywKKwkJW0NMS19EU0lfU0NMS10JCT0gJmRzaV9zY2xrX2Nsay5jb21tb24uaHcsCisJCVtDTEtfRFNJX0RQSFldCQk9ICZkc2lfZHBoeV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0RSQ10JCT0gJmRyY19jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0dQVV0JCT0gJmdwdV9jbGsuY29tbW9uLmh3LAorCQlbQ0xLX0FUU10JCT0gJmF0c19jbGsuY29tbW9uLmh3LAorCX0sCisJLm51bQk9IENMS19OVU1CRVIsCit9OworCitzdGF0aWMgc3RydWN0IGNjdV9yZXNldF9tYXAgc3VuOGlfYTMzX2NjdV9yZXNldHNbXSA9IHsKKwlbUlNUX1VTQl9QSFkwXQkJPSAgeyAweDBjYywgQklUKDApIH0sCisJW1JTVF9VU0JfUEhZMV0JCT0gIHsgMHgwY2MsIEJJVCgxKSB9LAorCVtSU1RfVVNCX0hTSUNdCQk9ICB7IDB4MGNjLCBCSVQoMikgfSwKKworCVtSU1RfTUJVU10JCT0gIHsgMHgwZmMsIEJJVCgzMSkgfSwKKworCVtSU1RfQlVTX01JUElfRFNJXQk9ICB7IDB4MmMwLCBCSVQoMSkgfSwKKwlbUlNUX0JVU19TU10JCT0gIHsgMHgyYzAsIEJJVCg1KSB9LAorCVtSU1RfQlVTX0RNQV0JCT0gIHsgMHgyYzAsIEJJVCg2KSB9LAorCVtSU1RfQlVTX01NQzBdCQk9ICB7IDB4MmMwLCBCSVQoOCkgfSwKKwlbUlNUX0JVU19NTUMxXQkJPSAgeyAweDJjMCwgQklUKDkpIH0sCisJW1JTVF9CVVNfTU1DMl0JCT0gIHsgMHgyYzAsIEJJVCgxMCkgfSwKKwlbUlNUX0JVU19OQU5EXQkJPSAgeyAweDJjMCwgQklUKDEzKSB9LAorCVtSU1RfQlVTX0RSQU1dCQk9ICB7IDB4MmMwLCBCSVQoMTQpIH0sCisJW1JTVF9CVVNfSFNUSU1FUl0JPSAgeyAweDJjMCwgQklUKDE5KSB9LAorCVtSU1RfQlVTX1NQSTBdCQk9ICB7IDB4MmMwLCBCSVQoMjApIH0sCisJW1JTVF9CVVNfU1BJMV0JCT0gIHsgMHgyYzAsIEJJVCgyMSkgfSwKKwlbUlNUX0JVU19PVEddCQk9ICB7IDB4MmMwLCBCSVQoMjQpIH0sCisJW1JTVF9CVVNfRUhDSV0JCT0gIHsgMHgyYzAsIEJJVCgyNikgfSwKKwlbUlNUX0JVU19PSENJXQkJPSAgeyAweDJjMCwgQklUKDI5KSB9LAorCisJW1JTVF9CVVNfVkVdCQk9ICB7IDB4MmM0LCBCSVQoMCkgfSwKKwlbUlNUX0JVU19MQ0RdCQk9ICB7IDB4MmM0LCBCSVQoNCkgfSwKKwlbUlNUX0JVU19DU0ldCQk9ICB7IDB4MmM0LCBCSVQoOCkgfSwKKwlbUlNUX0JVU19ERV9CRV0JCT0gIHsgMHgyYzQsIEJJVCgxMikgfSwKKwlbUlNUX0JVU19ERV9GRV0JCT0gIHsgMHgyYzQsIEJJVCgxNCkgfSwKKwlbUlNUX0JVU19HUFVdCQk9ICB7IDB4MmM0LCBCSVQoMjApIH0sCisJW1JTVF9CVVNfTVNHQk9YXQk9ICB7IDB4MmM0LCBCSVQoMjEpIH0sCisJW1JTVF9CVVNfU1BJTkxPQ0tdCT0gIHsgMHgyYzQsIEJJVCgyMikgfSwKKwlbUlNUX0JVU19EUkNdCQk9ICB7IDB4MmM0LCBCSVQoMjUpIH0sCisJW1JTVF9CVVNfU0FUXQkJPSAgeyAweDJjNCwgQklUKDI2KSB9LAorCisJW1JTVF9CVVNfTFZEU10JCT0gIHsgMHgyYzgsIEJJVCgwKSB9LAorCisJW1JTVF9CVVNfQ09ERUNdCQk9ICB7IDB4MmQwLCBCSVQoMCkgfSwKKwlbUlNUX0JVU19JMlMwXQkJPSAgeyAweDJkMCwgQklUKDEyKSB9LAorCVtSU1RfQlVTX0kyUzFdCQk9ICB7IDB4MmQwLCBCSVQoMTMpIH0sCisKKwlbUlNUX0JVU19JMkMwXQkJPSAgeyAweDJkOCwgQklUKDApIH0sCisJW1JTVF9CVVNfSTJDMV0JCT0gIHsgMHgyZDgsIEJJVCgxKSB9LAorCVtSU1RfQlVTX0kyQzJdCQk9ICB7IDB4MmQ4LCBCSVQoMikgfSwKKwlbUlNUX0JVU19VQVJUMF0JCT0gIHsgMHgyZDgsIEJJVCgxNikgfSwKKwlbUlNUX0JVU19VQVJUMV0JCT0gIHsgMHgyZDgsIEJJVCgxNykgfSwKKwlbUlNUX0JVU19VQVJUMl0JCT0gIHsgMHgyZDgsIEJJVCgxOCkgfSwKKwlbUlNUX0JVU19VQVJUM10JCT0gIHsgMHgyZDgsIEJJVCgxOSkgfSwKKwlbUlNUX0JVU19VQVJUNF0JCT0gIHsgMHgyZDgsIEJJVCgyMCkgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VueGlfY2N1X2Rlc2Mgc3VuOGlfYTMzX2NjdV9kZXNjID0geworCS5jY3VfY2xrcwk9IHN1bjhpX2EzM19jY3VfY2xrcywKKwkubnVtX2NjdV9jbGtzCT0gQVJSQVlfU0laRShzdW44aV9hMzNfY2N1X2Nsa3MpLAorCisJLmh3X2Nsa3MJPSAmc3VuOGlfYTMzX2h3X2Nsa3MsCisKKwkucmVzZXRzCQk9IHN1bjhpX2EzM19jY3VfcmVzZXRzLAorCS5udW1fcmVzZXRzCT0gQVJSQVlfU0laRShzdW44aV9hMzNfY2N1X3Jlc2V0cyksCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgc3VuOGlfYTMzX2NjdV9zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCit7CisJdm9pZCBfX2lvbWVtICpyZWc7CisJdTMyIHZhbDsKKworCXJlZyA9IG9mX2lvX3JlcXVlc3RfYW5kX21hcChub2RlLCAwLCBvZl9ub2RlX2Z1bGxfbmFtZShub2RlKSk7CisJaWYgKElTX0VSUihyZWcpKSB7CisJCXByX2VycigiJXM6IENvdWxkIG5vdCBtYXAgdGhlIGNsb2NrIHJlZ2lzdGVyc1xuIiwKKwkJICAgICAgIG9mX25vZGVfZnVsbF9uYW1lKG5vZGUpKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEZvcmNlIHRoZSBQTEwtQXVkaW8tMXggZGl2aWRlciB0byA0ICovCisJdmFsID0gcmVhZGwocmVnICsgU1VOOElfQTMzX1BMTF9BVURJT19SRUcpOworCXZhbCAmPSB+R0VOTUFTSygxOSwgMTYpOworCXdyaXRlbCh2YWwgfCAoMyA8PCAxNiksIHJlZyArIFNVTjhJX0EzM19QTExfQVVESU9fUkVHKTsKKworCS8qIEZvcmNlIFBMTC1NSVBJIHRvIE1JUEkgbW9kZSAqLworCXZhbCA9IHJlYWRsKHJlZyArIFNVTjhJX0EzM19QTExfTUlQSV9SRUcpOworCXZhbCAmPSB+QklUKDE2KTsKKwl3cml0ZWwodmFsLCByZWcgKyBTVU44SV9BMzNfUExMX01JUElfUkVHKTsKKworCXN1bnhpX2NjdV9wcm9iZShub2RlLCByZWcsICZzdW44aV9hMzNfY2N1X2Rlc2MpOworfQorQ0xLX09GX0RFQ0xBUkUoc3VuOGlfYTMzX2NjdSwgImFsbHdpbm5lcixzdW44aS1hMzMtY2N1IiwKKwkgICAgICAgc3VuOGlfYTMzX2NjdV9zZXR1cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuOGktaDMuYyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW44aS1oMy5jCmluZGV4IDlhZjM1OTU0Li40ZDcwNTkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuOGktaDMuYworKysgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuOGktaDMuYwpAQCAtMTg0LDE1ICsxODQsMTUgQEAKIAkJCSAgICAgMCk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWhiMl9wYXJlbnRzW10gPSB7ICJhaGIxIiAsICJwbGwtcGVyaXBoMCIgfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2N1X211eF9maXhlZF9wcmVkaXYgYWhiMl9maXhlZF9wcmVkaXZzW10gPSB7CisJeyAuaW5kZXggPSAxLCAuZGl2ID0gMiB9LAorfTsKIHN0YXRpYyBzdHJ1Y3QgY2N1X211eCBhaGIyX2NsayA9IHsKIAkubXV4CQk9IHsKIAkJLnNoaWZ0CT0gMCwKIAkJLndpZHRoCT0gMSwKLQotCQkuZml4ZWRfcHJlZGl2CT0gewotCQkJLmluZGV4CT0gMSwKLQkJCS5kaXYJPSAyLAotCQl9LAorCQkuZml4ZWRfcHJlZGl2cwk9IGFoYjJfZml4ZWRfcHJlZGl2cywKKwkJLm5fcHJlZGl2cwk9IEFSUkFZX1NJWkUoYWhiMl9maXhlZF9wcmVkaXZzKSwKIAl9LAogCiAJLmNvbW1vbgkJPSB7CkBAIC03ODMsMTQgKzc4MywxNCBAQAogCVtSU1RfQlVTX0kyUzFdCQk9ICB7IDB4MmQwLCBCSVQoMTMpIH0sCiAJW1JTVF9CVVNfSTJTMl0JCT0gIHsgMHgyZDAsIEJJVCgxNCkgfSwKIAotCVtSU1RfQlVTX0kyQzBdCQk9ICB7IDB4MmQ0LCBCSVQoMCkgfSwKLQlbUlNUX0JVU19JMkMxXQkJPSAgeyAweDJkNCwgQklUKDEpIH0sCi0JW1JTVF9CVVNfSTJDMl0JCT0gIHsgMHgyZDQsIEJJVCgyKSB9LAotCVtSU1RfQlVTX1VBUlQwXQkJPSAgeyAweDJkNCwgQklUKDE2KSB9LAotCVtSU1RfQlVTX1VBUlQxXQkJPSAgeyAweDJkNCwgQklUKDE3KSB9LAotCVtSU1RfQlVTX1VBUlQyXQkJPSAgeyAweDJkNCwgQklUKDE4KSB9LAotCVtSU1RfQlVTX1VBUlQzXQkJPSAgeyAweDJkNCwgQklUKDE5KSB9LAotCVtSU1RfQlVTX1NDUl0JCT0gIHsgMHgyZDQsIEJJVCgyMCkgfSwKKwlbUlNUX0JVU19JMkMwXQkJPSAgeyAweDJkOCwgQklUKDApIH0sCisJW1JTVF9CVVNfSTJDMV0JCT0gIHsgMHgyZDgsIEJJVCgxKSB9LAorCVtSU1RfQlVTX0kyQzJdCQk9ICB7IDB4MmQ4LCBCSVQoMikgfSwKKwlbUlNUX0JVU19VQVJUMF0JCT0gIHsgMHgyZDgsIEJJVCgxNikgfSwKKwlbUlNUX0JVU19VQVJUMV0JCT0gIHsgMHgyZDgsIEJJVCgxNykgfSwKKwlbUlNUX0JVU19VQVJUMl0JCT0gIHsgMHgyZDgsIEJJVCgxOCkgfSwKKwlbUlNUX0JVU19VQVJUM10JCT0gIHsgMHgyZDgsIEJJVCgxOSkgfSwKKwlbUlNUX0JVU19TQ1JdCQk9ICB7IDB4MmQ4LCBCSVQoMjApIH0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1bnhpX2NjdV9kZXNjIHN1bjhpX2gzX2NjdV9kZXNjID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X2NvbW1vbi5jIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X2NvbW1vbi5jCmluZGV4IGZjMTdiNTIuLjUxZDRiYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9jb21tb24uYworKysgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfY29tbW9uLmMKQEAgLTMxLDcgKzMxLDcgQEAKIAkJcmV0dXJuOwogCiAJV0FSTl9PTihyZWFkbF9yZWxheGVkX3BvbGxfdGltZW91dChjb21tb24tPmJhc2UgKyBjb21tb24tPnJlZywgcmVnLAotCQkJCQkgICAhKHJlZyAmIGxvY2spLCAxMDAsIDcwMDAwKSk7CisJCQkJCSAgIHJlZyAmIGxvY2ssIDEwMCwgNzAwMDApKTsKIH0KIAogaW50IHN1bnhpX2NjdV9wcm9iZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIHZvaWQgX19pb21lbSAqcmVnLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X2Rpdi5oIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X2Rpdi5oCmluZGV4IDY1M2FkZTUuLjM0YzMzODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9kaXYuaAorKysgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfZGl2LmgKQEAgLTE5LDEwICsxOSwyOSBAQAogI2luY2x1ZGUgImNjdV9jb21tb24uaCIKICNpbmNsdWRlICJjY3VfbXV4LmgiCiAKKy8qKgorICogc3RydWN0IF9jY3VfZGl2IC0gSW50ZXJuYWwgZGl2aWRlciBkZXNjcmlwdGlvbgorICogQHNoaWZ0OiBCaXQgb2Zmc2V0IG9mIHRoZSBkaXZpZGVyIGluIGl0cyByZWdpc3RlcgorICogQHdpZHRoOiBXaWR0aCBvZiB0aGUgZGl2aWRlciBmaWVsZCBpbiBpdHMgcmVnaXN0ZXIKKyAqIEBtYXg6IE1heGltdW0gdmFsdWUgYWxsb3dlZCBmb3IgdGhhdCBkaXZpZGVyLiBUaGlzIGlzIHRoZQorICogICAgICAgYXJpdGhtZXRpYyB2YWx1ZSwgbm90IHRoZSBtYXhpbXVtIHZhbHVlIHRvIGJlIHNldCBpbiB0aGUKKyAqICAgICAgIHJlZ2lzdGVyLgorICogQGZsYWdzOiBjbGtfZGl2aWRlciBmbGFncyB0byBhcHBseSBvbiB0aGlzIGRpdmlkZXIKKyAqIEB0YWJsZTogRGl2aWRlciB0YWJsZSBwb2ludGVyIChpZiBhcHBsaWNhYmxlKQorICoKKyAqIFRoYXQgc3RydWN0dXJlIHJlcHJlc2VudHMgYSBzaW5nbGUgZGl2aWRlciwgYW5kIGlzIG1lYW50IHRvIGJlCisgKiBlbWJlZGRlZCBpbiBvdGhlciBzdHJ1Y3R1cmVzIHJlcHJlc2VudGluZyB0aGUgdmFyaW91cyBjbG9jaworICogY2xhc3Nlcy4KKyAqCisgKiBJdCBpcyBiYXNpY2FsbHkgYSB3cmFwcGVyIGFyb3VuZCB0aGUgY2xrX2RpdmlkZXIgZnVuY3Rpb25zCisgKiBhcmd1bWVudHMuCisgKi8KIHN0cnVjdCBfY2N1X2RpdiB7CiAJdTgJCQlzaGlmdDsKIAl1OAkJCXdpZHRoOwogCisJdTMyCQkJbWF4OworCiAJdTMyCQkJZmxhZ3M7CiAKIAlzdHJ1Y3QgY2xrX2Rpdl90YWJsZQkqdGFibGU7CkBAIC0zNiwxNCArNTUsMjUgQEAKIAkJLnRhYmxlCT0gX3RhYmxlLAkJCQkJXAogCX0KIAotI2RlZmluZSBfU1VOWElfQ0NVX0RJVl9GTEFHUyhfc2hpZnQsIF93aWR0aCwgX2ZsYWdzKQkJCVwKLQlfU1VOWElfQ0NVX0RJVl9UQUJMRV9GTEFHUyhfc2hpZnQsIF93aWR0aCwgTlVMTCwgX2ZsYWdzKQotCiAjZGVmaW5lIF9TVU5YSV9DQ1VfRElWX1RBQkxFKF9zaGlmdCwgX3dpZHRoLCBfdGFibGUpCQkJXAogCV9TVU5YSV9DQ1VfRElWX1RBQkxFX0ZMQUdTKF9zaGlmdCwgX3dpZHRoLCBfdGFibGUsIDApCiAKKyNkZWZpbmUgX1NVTlhJX0NDVV9ESVZfTUFYX0ZMQUdTKF9zaGlmdCwgX3dpZHRoLCBfbWF4LCBfZmxhZ3MpIFwKKwl7CQkJCQkJCQlcCisJCS5zaGlmdAk9IF9zaGlmdCwJCQkJCVwKKwkJLndpZHRoCT0gX3dpZHRoLAkJCQkJXAorCQkuZmxhZ3MJPSBfZmxhZ3MsCQkJCQlcCisJCS5tYXgJPSBfbWF4LAkJCQkJCVwKKwl9CisKKyNkZWZpbmUgX1NVTlhJX0NDVV9ESVZfRkxBR1MoX3NoaWZ0LCBfd2lkdGgsIF9mbGFncykJCQlcCisJX1NVTlhJX0NDVV9ESVZfTUFYX0ZMQUdTKF9zaGlmdCwgX3dpZHRoLCAwLCBfZmxhZ3MpCisKKyNkZWZpbmUgX1NVTlhJX0NDVV9ESVZfTUFYKF9zaGlmdCwgX3dpZHRoLCBfbWF4KQkJCVwKKwlfU1VOWElfQ0NVX0RJVl9NQVhfRkxBR1MoX3NoaWZ0LCBfd2lkdGgsIF9tYXgsIDApCisKICNkZWZpbmUgX1NVTlhJX0NDVV9ESVYoX3NoaWZ0LCBfd2lkdGgpCQkJCQlcCi0JX1NVTlhJX0NDVV9ESVZfVEFCTEVfRkxBR1MoX3NoaWZ0LCBfd2lkdGgsIE5VTEwsIDApCisJX1NVTlhJX0NDVV9ESVZfRkxBR1MoX3NoaWZ0LCBfd2lkdGgsIDApCiAKIHN0cnVjdCBjY3VfZGl2IHsKIAl1MzIJCQllbmFibGU7CkBAIC03NywxMyArMTA3LDE2IEBACiAJCQkJICAgICAgX3NoaWZ0LCBfd2lkdGgsIF90YWJsZSwgMCwJXAogCQkJCSAgICAgIF9mbGFncykKIAotI2RlZmluZSBTVU5YSV9DQ1VfTV9XSVRIX01VWF9HQVRFKF9zdHJ1Y3QsIF9uYW1lLCBfcGFyZW50cywgX3JlZywJXAotCQkJCSAgX21zaGlmdCwgX213aWR0aCwgX211eHNoaWZ0LCBfbXV4d2lkdGgsIFwKLQkJCQkgIF9nYXRlLCBfZmxhZ3MpCQkJXAorI2RlZmluZSBTVU5YSV9DQ1VfTV9XSVRIX01VWF9UQUJMRV9HQVRFKF9zdHJ1Y3QsIF9uYW1lLAkJCVwKKwkJCQkJX3BhcmVudHMsIF90YWJsZSwJCVwKKwkJCQkJX3JlZywJCQkJXAorCQkJCQlfbXNoaWZ0LCBfbXdpZHRoLAkJXAorCQkJCQlfbXV4c2hpZnQsIF9tdXh3aWR0aCwJCVwKKwkJCQkJX2dhdGUsIF9mbGFncykJCQlcCiAJc3RydWN0IGNjdV9kaXYgX3N0cnVjdCA9IHsJCQkJCVwKIAkJLmVuYWJsZQk9IF9nYXRlLAkJCQkJXAogCQkuZGl2CT0gX1NVTlhJX0NDVV9ESVYoX21zaGlmdCwgX213aWR0aCksCQlcCi0JCS5tdXgJPSBTVU5YSV9DTEtfTVVYKF9tdXhzaGlmdCwgX211eHdpZHRoKSwJCVwKKwkJLm11eAk9IF9TVU5YSV9DQ1VfTVVYX1RBQkxFKF9tdXhzaGlmdCwgX211eHdpZHRoLCBfdGFibGUpLCBcCiAJCS5jb21tb24JPSB7CQkJCQkJXAogCQkJLnJlZwkJPSBfcmVnLAkJCQlcCiAJCQkuaHcuaW5pdAk9IENMS19IV19JTklUX1BBUkVOVFMoX25hbWUsCVwKQEAgLTkzLDEyICsxMjYsMjMgQEAKIAkJfSwJCQkJCQkJXAogCX0KIAorI2RlZmluZSBTVU5YSV9DQ1VfTV9XSVRIX01VWF9HQVRFKF9zdHJ1Y3QsIF9uYW1lLCBfcGFyZW50cywgX3JlZywJXAorCQkJCSAgX21zaGlmdCwgX213aWR0aCwgX211eHNoaWZ0LCBfbXV4d2lkdGgsIFwKKwkJCQkgIF9nYXRlLCBfZmxhZ3MpCQkJXAorCVNVTlhJX0NDVV9NX1dJVEhfTVVYX1RBQkxFX0dBVEUoX3N0cnVjdCwgX25hbWUsCQkJXAorCQkJCQlfcGFyZW50cywgTlVMTCwJCQlcCisJCQkJCV9yZWcsIF9tc2hpZnQsIF9td2lkdGgsCQlcCisJCQkJCV9tdXhzaGlmdCwgX211eHdpZHRoLAkJXAorCQkJCQlfZ2F0ZSwgX2ZsYWdzKQorCiAjZGVmaW5lIFNVTlhJX0NDVV9NX1dJVEhfTVVYKF9zdHJ1Y3QsIF9uYW1lLCBfcGFyZW50cywgX3JlZywJCVwKIAkJCSAgICAgX21zaGlmdCwgX213aWR0aCwgX211eHNoaWZ0LCBfbXV4d2lkdGgsCVwKIAkJCSAgICAgX2ZsYWdzKQkJCQkJXAotCVNVTlhJX0NDVV9NX1dJVEhfTVVYX0dBVEUoX3N0cnVjdCwgX25hbWUsIF9wYXJlbnRzLCBfcmVnLAlcCi0JCQkJICBfbXNoaWZ0LCBfbXdpZHRoLCBfbXV4c2hpZnQsIF9tdXh3aWR0aCwgXAotCQkJCSAgMCwgX2ZsYWdzKQorCVNVTlhJX0NDVV9NX1dJVEhfTVVYX1RBQkxFX0dBVEUoX3N0cnVjdCwgX25hbWUsCQkJXAorCQkJCQlfcGFyZW50cywgTlVMTCwJCQlcCisJCQkJCV9yZWcsIF9tc2hpZnQsIF9td2lkdGgsCQlcCisJCQkJCV9tdXhzaGlmdCwgX211eHdpZHRoLAkJXAorCQkJCQkwLCBfZmxhZ3MpCiAKIAogI2RlZmluZSBTVU5YSV9DQ1VfTV9XSVRIX0dBVEUoX3N0cnVjdCwgX25hbWUsIF9wYXJlbnQsIF9yZWcsCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbXAuYyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9tcC5jCmluZGV4IGNiZjMzZWYuLmViYjFiMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9tcC5jCisrKyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9tcC5jCkBAIC0yMSw5ICsyMSw5IEBACiAJdW5zaWduZWQgaW50IGJlc3RfbSA9IDAsIGJlc3RfcCA9IDA7CiAJdW5zaWduZWQgaW50IF9tLCBfcDsKIAotCWZvciAoX3AgPSAwOyBfcCA8PSBtYXhfcDsgX3ArKykgeworCWZvciAoX3AgPSAxOyBfcCA8PSBtYXhfcDsgX3AgPDw9IDEpIHsKIAkJZm9yIChfbSA9IDE7IF9tIDw9IG1heF9tOyBfbSsrKSB7Ci0JCQl1bnNpZ25lZCBsb25nIHRtcF9yYXRlID0gKHBhcmVudCA+PiBfcCkgLyBfbTsKKwkJCXVuc2lnbmVkIGxvbmcgdG1wX3JhdGUgPSBwYXJlbnQgLyBfcCAvIF9tOwogCiAJCQlpZiAodG1wX3JhdGUgPiByYXRlKQogCQkJCWNvbnRpbnVlOwpAQCAtNDYsMTMgKzQ2LDE1IEBACiAJCQkJICAgICAgIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGNjdV9tcCAqY21wID0gZGF0YTsKKwl1bnNpZ25lZCBpbnQgbWF4X20sIG1heF9wOwogCXVuc2lnbmVkIGludCBtLCBwOwogCi0JY2N1X21wX2ZpbmRfYmVzdChwYXJlbnRfcmF0ZSwgcmF0ZSwKLQkJCSAxIDw8IGNtcC0+bS53aWR0aCwgKDEgPDwgY21wLT5wLndpZHRoKSAtIDEsCi0JCQkgJm0sICZwKTsKKwltYXhfbSA9IGNtcC0+bS5tYXggPzogMSA8PCBjbXAtPm0ud2lkdGg7CisJbWF4X3AgPSBjbXAtPnAubWF4ID86IDEgPDwgKCgxIDw8IGNtcC0+cC53aWR0aCkgLSAxKTsKIAotCXJldHVybiAocGFyZW50X3JhdGUgPj4gcCkgLyBtOworCWNjdV9tcF9maW5kX2Jlc3QocGFyZW50X3JhdGUsIHJhdGUsIG1heF9tLCBtYXhfcCwgJm0sICZwKTsKKworCXJldHVybiBwYXJlbnRfcmF0ZSAvIHAgLyBtOwogfQogCiBzdGF0aWMgdm9pZCBjY3VfbXBfZGlzYWJsZShzdHJ1Y3QgY2xrX2h3ICpodykKQEAgLTEwOCwxMyArMTEwLDE0IEBACiB7CiAJc3RydWN0IGNjdV9tcCAqY21wID0gaHdfdG9fY2N1X21wKGh3KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBtYXhfbSwgbWF4X3A7CiAJdW5zaWduZWQgaW50IG0sIHA7CiAJdTMyIHJlZzsKIAotCWNjdV9tcF9maW5kX2Jlc3QocGFyZW50X3JhdGUsIHJhdGUsCi0JCQkgMSA8PCBjbXAtPm0ud2lkdGgsICgxIDw8IGNtcC0+cC53aWR0aCkgLSAxLAotCQkJICZtLCAmcCk7CisJbWF4X20gPSBjbXAtPm0ubWF4ID86IDEgPDwgY21wLT5tLndpZHRoOworCW1heF9wID0gY21wLT5wLm1heCA/OiAxIDw8ICgoMSA8PCBjbXAtPnAud2lkdGgpIC0gMSk7CiAKKwljY3VfbXBfZmluZF9iZXN0KHBhcmVudF9yYXRlLCByYXRlLCBtYXhfbSwgbWF4X3AsICZtLCAmcCk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZShjbXAtPmNvbW1vbi5sb2NrLCBmbGFncyk7CiAKQEAgLTEyMiw3ICsxMjUsNyBAQAogCXJlZyAmPSB+R0VOTUFTSyhjbXAtPm0ud2lkdGggKyBjbXAtPm0uc2hpZnQgLSAxLCBjbXAtPm0uc2hpZnQpOwogCXJlZyAmPSB+R0VOTUFTSyhjbXAtPnAud2lkdGggKyBjbXAtPnAuc2hpZnQgLSAxLCBjbXAtPnAuc2hpZnQpOwogCi0Jd3JpdGVsKHJlZyB8IChwIDw8IGNtcC0+cC5zaGlmdCkgfCAoKG0gLSAxKSA8PCBjbXAtPm0uc2hpZnQpLAorCXdyaXRlbChyZWcgfCAoaWxvZzIocCkgPDwgY21wLT5wLnNoaWZ0KSB8ICgobSAtIDEpIDw8IGNtcC0+bS5zaGlmdCksCiAJICAgICAgIGNtcC0+Y29tbW9uLmJhc2UgKyBjbXAtPmNvbW1vbi5yZWcpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShjbXAtPmNvbW1vbi5sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbXAuaCBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9tcC5oCmluZGV4IDNjZjEyYmYuLmVkZjkyMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9tcC5oCisrKyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9tcC5oCkBAIC00NCw3ICs0NCw3IEBACiAJCS5lbmFibGUJPSBfZ2F0ZSwJCQkJCVwKIAkJLm0JPSBfU1VOWElfQ0NVX0RJVihfbXNoaWZ0LCBfbXdpZHRoKSwJCVwKIAkJLnAJPSBfU1VOWElfQ0NVX0RJVihfcHNoaWZ0LCBfcHdpZHRoKSwJCVwKLQkJLm11eAk9IFNVTlhJX0NMS19NVVgoX211eHNoaWZ0LCBfbXV4d2lkdGgpLAkJXAorCQkubXV4CT0gX1NVTlhJX0NDVV9NVVgoX211eHNoaWZ0LCBfbXV4d2lkdGgpLAkJXAogCQkuY29tbW9uCT0gewkJCQkJCVwKIAkJCS5yZWcJCT0gX3JlZywJCQkJXAogCQkJLmh3LmluaXQJPSBDTEtfSFdfSU5JVF9QQVJFTlRTKF9uYW1lLAlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbXVsdC5jIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X211bHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTBlOTQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X211bHQuYwpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBNYXhpbWUgUmlwYXJkCisgKiBNYXhpbWUgUmlwYXJkIDxtYXhpbWUucmlwYXJkQGZyZWUtZWxlY3Ryb25zLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KKworI2luY2x1ZGUgImNjdV9nYXRlLmgiCisjaW5jbHVkZSAiY2N1X211bHQuaCIKKworc3RhdGljIHZvaWQgY2N1X211bHRfZmluZF9iZXN0KHVuc2lnbmVkIGxvbmcgcGFyZW50LCB1bnNpZ25lZCBsb25nIHJhdGUsCisJCQkgICAgICAgdW5zaWduZWQgaW50IG1heF9uLCB1bnNpZ25lZCBpbnQgKm4pCit7CisJKm4gPSByYXRlIC8gcGFyZW50OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjY3VfbXVsdF9yb3VuZF9yYXRlKHN0cnVjdCBjY3VfbXV4X2ludGVybmFsICptdXgsCisJCQkJCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUsCisJCQkJCXVuc2lnbmVkIGxvbmcgcmF0ZSwKKwkJCQkJdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY2N1X211bHQgKmNtID0gZGF0YTsKKwl1bnNpZ25lZCBpbnQgbjsKKworCWNjdV9tdWx0X2ZpbmRfYmVzdChwYXJlbnRfcmF0ZSwgcmF0ZSwgMSA8PCBjbS0+bXVsdC53aWR0aCwgJm4pOworCisJcmV0dXJuIHBhcmVudF9yYXRlICogbjsKK30KKworc3RhdGljIHZvaWQgY2N1X211bHRfZGlzYWJsZShzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgY2N1X211bHQgKmNtID0gaHdfdG9fY2N1X211bHQoaHcpOworCisJcmV0dXJuIGNjdV9nYXRlX2hlbHBlcl9kaXNhYmxlKCZjbS0+Y29tbW9uLCBjbS0+ZW5hYmxlKTsKK30KKworc3RhdGljIGludCBjY3VfbXVsdF9lbmFibGUoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IGNjdV9tdWx0ICpjbSA9IGh3X3RvX2NjdV9tdWx0KGh3KTsKKworCXJldHVybiBjY3VfZ2F0ZV9oZWxwZXJfZW5hYmxlKCZjbS0+Y29tbW9uLCBjbS0+ZW5hYmxlKTsKK30KKworc3RhdGljIGludCBjY3VfbXVsdF9pc19lbmFibGVkKHN0cnVjdCBjbGtfaHcgKmh3KQoreworCXN0cnVjdCBjY3VfbXVsdCAqY20gPSBod190b19jY3VfbXVsdChodyk7CisKKwlyZXR1cm4gY2N1X2dhdGVfaGVscGVyX2lzX2VuYWJsZWQoJmNtLT5jb21tb24sIGNtLT5lbmFibGUpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjY3VfbXVsdF9yZWNhbGNfcmF0ZShzdHJ1Y3QgY2xrX2h3ICpodywKKwkJCQkJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSkKK3sKKwlzdHJ1Y3QgY2N1X211bHQgKmNtID0gaHdfdG9fY2N1X211bHQoaHcpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCXUzMiByZWc7CisKKwlyZWcgPSByZWFkbChjbS0+Y29tbW9uLmJhc2UgKyBjbS0+Y29tbW9uLnJlZyk7CisJdmFsID0gcmVnID4+IGNtLT5tdWx0LnNoaWZ0OworCXZhbCAmPSAoMSA8PCBjbS0+bXVsdC53aWR0aCkgLSAxOworCisJY2N1X211eF9oZWxwZXJfYWRqdXN0X3BhcmVudF9mb3JfcHJlZGl2KCZjbS0+Y29tbW9uLCAmY20tPm11eCwgLTEsCisJCQkJCQkmcGFyZW50X3JhdGUpOworCisJcmV0dXJuIHBhcmVudF9yYXRlICogKHZhbCArIDEpOworfQorCitzdGF0aWMgaW50IGNjdV9tdWx0X2RldGVybWluZV9yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LAorCQkJCXN0cnVjdCBjbGtfcmF0ZV9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IGNjdV9tdWx0ICpjbSA9IGh3X3RvX2NjdV9tdWx0KGh3KTsKKworCXJldHVybiBjY3VfbXV4X2hlbHBlcl9kZXRlcm1pbmVfcmF0ZSgmY20tPmNvbW1vbiwgJmNtLT5tdXgsCisJCQkJCSAgICAgcmVxLCBjY3VfbXVsdF9yb3VuZF9yYXRlLCBjbSk7Cit9CisKK3N0YXRpYyBpbnQgY2N1X211bHRfc2V0X3JhdGUoc3RydWN0IGNsa19odyAqaHcsIHVuc2lnbmVkIGxvbmcgcmF0ZSwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUpCit7CisJc3RydWN0IGNjdV9tdWx0ICpjbSA9IGh3X3RvX2NjdV9tdWx0KGh3KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBuOworCXUzMiByZWc7CisKKwljY3VfbXV4X2hlbHBlcl9hZGp1c3RfcGFyZW50X2Zvcl9wcmVkaXYoJmNtLT5jb21tb24sICZjbS0+bXV4LCAtMSwKKwkJCQkJCSZwYXJlbnRfcmF0ZSk7CisKKwljY3VfbXVsdF9maW5kX2Jlc3QocGFyZW50X3JhdGUsIHJhdGUsIDEgPDwgY20tPm11bHQud2lkdGgsICZuKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKGNtLT5jb21tb24ubG9jaywgZmxhZ3MpOworCisJcmVnID0gcmVhZGwoY20tPmNvbW1vbi5iYXNlICsgY20tPmNvbW1vbi5yZWcpOworCXJlZyAmPSB+R0VOTUFTSyhjbS0+bXVsdC53aWR0aCArIGNtLT5tdWx0LnNoaWZ0IC0gMSwgY20tPm11bHQuc2hpZnQpOworCisJd3JpdGVsKHJlZyB8ICgobiAtIDEpIDw8IGNtLT5tdWx0LnNoaWZ0KSwKKwkgICAgICAgY20tPmNvbW1vbi5iYXNlICsgY20tPmNvbW1vbi5yZWcpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShjbS0+Y29tbW9uLmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTggY2N1X211bHRfZ2V0X3BhcmVudChzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgY2N1X211bHQgKmNtID0gaHdfdG9fY2N1X211bHQoaHcpOworCisJcmV0dXJuIGNjdV9tdXhfaGVscGVyX2dldF9wYXJlbnQoJmNtLT5jb21tb24sICZjbS0+bXV4KTsKK30KKworc3RhdGljIGludCBjY3VfbXVsdF9zZXRfcGFyZW50KHN0cnVjdCBjbGtfaHcgKmh3LCB1OCBpbmRleCkKK3sKKwlzdHJ1Y3QgY2N1X211bHQgKmNtID0gaHdfdG9fY2N1X211bHQoaHcpOworCisJcmV0dXJuIGNjdV9tdXhfaGVscGVyX3NldF9wYXJlbnQoJmNtLT5jb21tb24sICZjbS0+bXV4LCBpbmRleCk7Cit9CisKK2NvbnN0IHN0cnVjdCBjbGtfb3BzIGNjdV9tdWx0X29wcyA9IHsKKwkuZGlzYWJsZQk9IGNjdV9tdWx0X2Rpc2FibGUsCisJLmVuYWJsZQkJPSBjY3VfbXVsdF9lbmFibGUsCisJLmlzX2VuYWJsZWQJPSBjY3VfbXVsdF9pc19lbmFibGVkLAorCisJLmdldF9wYXJlbnQJPSBjY3VfbXVsdF9nZXRfcGFyZW50LAorCS5zZXRfcGFyZW50CT0gY2N1X211bHRfc2V0X3BhcmVudCwKKworCS5kZXRlcm1pbmVfcmF0ZQk9IGNjdV9tdWx0X2RldGVybWluZV9yYXRlLAorCS5yZWNhbGNfcmF0ZQk9IGNjdV9tdWx0X3JlY2FsY19yYXRlLAorCS5zZXRfcmF0ZQk9IGNjdV9tdWx0X3NldF9yYXRlLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9tdWx0LmggYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbXVsdC5oCmluZGV4IDYwOWRiNjYuLjVkMmM4ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9tdWx0LmgKKysrIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X211bHQuaApAQCAtMSw2ICsxLDkgQEAKICNpZm5kZWYgX0NDVV9NVUxUX0hfCiAjZGVmaW5lIF9DQ1VfTVVMVF9IXwogCisjaW5jbHVkZSAiY2N1X2NvbW1vbi5oIgorI2luY2x1ZGUgImNjdV9tdXguaCIKKwogc3RydWN0IF9jY3VfbXVsdCB7CiAJdTgJc2hpZnQ7CiAJdTgJd2lkdGg7CkBAIC0xMiw0ICsxNSwzNiBAQAogCQkud2lkdGgJPSBfd2lkdGgsCQlcCiAJfQogCitzdHJ1Y3QgY2N1X211bHQgeworCXUzMgkJCWVuYWJsZTsKKworCXN0cnVjdCBfY2N1X211bHQJbXVsdDsKKwlzdHJ1Y3QgY2N1X211eF9pbnRlcm5hbAltdXg7CisJc3RydWN0IGNjdV9jb21tb24JY29tbW9uOworfTsKKworI2RlZmluZSBTVU5YSV9DQ1VfTl9XSVRIX0dBVEVfTE9DSyhfc3RydWN0LCBfbmFtZSwgX3BhcmVudCwgX3JlZywJXAorCQkJCSAgIF9tc2hpZnQsIF9td2lkdGgsIF9nYXRlLCBfbG9jaywJXAorCQkJCSAgIF9mbGFncykJCQkJXAorCXN0cnVjdCBjY3VfbXVsdCBfc3RydWN0ID0gewkJCQkJXAorCQkuZW5hYmxlCT0gX2dhdGUsCQkJCQlcCisJCS5tdWx0CT0gX1NVTlhJX0NDVV9NVUxUKF9tc2hpZnQsIF9td2lkdGgpLAkJXAorCQkuY29tbW9uCT0gewkJCQkJCVwKKwkJCS5yZWcJCT0gX3JlZywJCQkJXAorCQkJLmh3LmluaXQJPSBDTEtfSFdfSU5JVChfbmFtZSwJCVwKKwkJCQkJCSAgICAgIF9wYXJlbnQsCQlcCisJCQkJCQkgICAgICAmY2N1X211bHRfb3BzLAlcCisJCQkJCQkgICAgICBfZmxhZ3MpLAkJXAorCQl9LAkJCQkJCQlcCisJfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjY3VfbXVsdCAqaHdfdG9fY2N1X211bHQoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IGNjdV9jb21tb24gKmNvbW1vbiA9IGh3X3RvX2NjdV9jb21tb24oaHcpOworCisJcmV0dXJuIGNvbnRhaW5lcl9vZihjb21tb24sIHN0cnVjdCBjY3VfbXVsdCwgY29tbW9uKTsKK30KKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBjbGtfb3BzIGNjdV9tdWx0X29wczsKKwogI2VuZGlmIC8qIF9DQ1VfTVVMVF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X211eC5jIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X211eC5jCmluZGV4IDU4ZmMzNmUuLmE0M2FkNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9tdXguYworKysgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbXV4LmMKQEAgLTgsNyArOCw5IEBACiAgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAogI2luY2x1ZGUgImNjdV9nYXRlLmgiCiAjaW5jbHVkZSAiY2N1X211eC5oIgpAQCAtMTgsOCArMjAsOSBAQAogCQkJCQkgICAgIGludCBwYXJlbnRfaW5kZXgsCiAJCQkJCSAgICAgdW5zaWduZWQgbG9uZyAqcGFyZW50X3JhdGUpCiB7Ci0JdTggcHJlZGl2ID0gMTsKKwl1MTYgcHJlZGl2ID0gMTsKIAl1MzIgcmVnOworCWludCBpOwogCiAJaWYgKCEoKGNvbW1vbi0+ZmVhdHVyZXMgJiBDQ1VfRkVBVFVSRV9GSVhFRF9QUkVESVYpIHx8CiAJICAgICAgKGNvbW1vbi0+ZmVhdHVyZXMgJiBDQ1VfRkVBVFVSRV9WQVJJQUJMRV9QUkVESVYpKSkKQEAgLTMyLDggKzM1LDkgQEAKIAl9CiAKIAlpZiAoY29tbW9uLT5mZWF0dXJlcyAmIENDVV9GRUFUVVJFX0ZJWEVEX1BSRURJVikKLQkJaWYgKHBhcmVudF9pbmRleCA9PSBjbS0+Zml4ZWRfcHJlZGl2LmluZGV4KQotCQkJcHJlZGl2ID0gY20tPmZpeGVkX3ByZWRpdi5kaXY7CisJCWZvciAoaSA9IDA7IGkgPCBjbS0+bl9wcmVkaXZzOyBpKyspCisJCQlpZiAocGFyZW50X2luZGV4ID09IGNtLT5maXhlZF9wcmVkaXZzW2ldLmluZGV4KQorCQkJCXByZWRpdiA9IGNtLT5maXhlZF9wcmVkaXZzW2ldLmRpdjsKIAogCWlmIChjb21tb24tPmZlYXR1cmVzICYgQ0NVX0ZFQVRVUkVfVkFSSUFCTEVfUFJFRElWKQogCQlpZiAocGFyZW50X2luZGV4ID09IGNtLT52YXJpYWJsZV9wcmVkaXYuaW5kZXgpIHsKQEAgLTEwNyw2ICsxMTEsMTUgQEAKIAlwYXJlbnQgPSByZWcgPj4gY20tPnNoaWZ0OwogCXBhcmVudCAmPSAoMSA8PCBjbS0+d2lkdGgpIC0gMTsKIAorCWlmIChjbS0+dGFibGUpIHsKKwkJaW50IG51bV9wYXJlbnRzID0gY2xrX2h3X2dldF9udW1fcGFyZW50cygmY29tbW9uLT5odyk7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBudW1fcGFyZW50czsgaSsrKQorCQkJaWYgKGNtLT50YWJsZVtpXSA9PSBwYXJlbnQpCisJCQkJcmV0dXJuIGk7CisJfQorCiAJcmV0dXJuIHBhcmVudDsKIH0KIApAQCAtMTE3LDYgKzEzMCw5IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgcmVnOwogCisJaWYgKGNtLT50YWJsZSkKKwkJaW5kZXggPSBjbS0+dGFibGVbaW5kZXhdOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoY29tbW9uLT5sb2NrLCBmbGFncyk7CiAKIAlyZWcgPSByZWFkbChjb21tb24tPmJhc2UgKyBjb21tb24tPnJlZyk7CkBAIC0xODUsMyArMjAxLDM3IEBACiAJLmRldGVybWluZV9yYXRlCT0gX19jbGtfbXV4X2RldGVybWluZV9yYXRlLAogCS5yZWNhbGNfcmF0ZQk9IGNjdV9tdXhfcmVjYWxjX3JhdGUsCiB9OworCisvKgorICogVGhpcyBjbG9jayBub3RpZmllciBpcyBjYWxsZWQgd2hlbiB0aGUgZnJlcXVlbmN5IG9mIHRoZSBvZiB0aGUgcGFyZW50CisgKiBQTEwgY2xvY2sgaXMgdG8gYmUgY2hhbmdlZC4gVGhlIGlkZWEgaXMgdG8gc3dpdGNoIHRoZSBwYXJlbnQgdG8gYQorICogc3RhYmxlIGNsb2NrLCBzdWNoIGFzIHRoZSBtYWluIG9zY2lsbGF0b3IsIHdoaWxlIHRoZSBQTEwgZnJlcXVlbmN5CisgKiBzdGFiaWxpemVzLgorICovCitzdGF0aWMgaW50IGNjdV9tdXhfbm90aWZpZXJfY2Ioc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBjY3VfbXV4X25iICptdXggPSB0b19jY3VfbXV4X25iKG5iKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChldmVudCA9PSBQUkVfUkFURV9DSEFOR0UpIHsKKwkJbXV4LT5vcmlnaW5hbF9pbmRleCA9IGNjdV9tdXhfaGVscGVyX2dldF9wYXJlbnQobXV4LT5jb21tb24sCisJCQkJCQkJCW11eC0+Y20pOworCQlyZXQgPSBjY3VfbXV4X2hlbHBlcl9zZXRfcGFyZW50KG11eC0+Y29tbW9uLCBtdXgtPmNtLAorCQkJCQkJbXV4LT5ieXBhc3NfaW5kZXgpOworCX0gZWxzZSBpZiAoZXZlbnQgPT0gUE9TVF9SQVRFX0NIQU5HRSkgeworCQlyZXQgPSBjY3VfbXV4X2hlbHBlcl9zZXRfcGFyZW50KG11eC0+Y29tbW9uLCBtdXgtPmNtLAorCQkJCQkJbXV4LT5vcmlnaW5hbF9pbmRleCk7CisJfQorCisJdWRlbGF5KG11eC0+ZGVsYXlfdXMpOworCisJcmV0dXJuIG5vdGlmaWVyX2Zyb21fZXJybm8ocmV0KTsKK30KKworaW50IGNjdV9tdXhfbm90aWZpZXJfcmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrLCBzdHJ1Y3QgY2N1X211eF9uYiAqbXV4X25iKQoreworCW11eF9uYi0+Y2xrX25iLm5vdGlmaWVyX2NhbGwgPSBjY3VfbXV4X25vdGlmaWVyX2NiOworCisJcmV0dXJuIGNsa19ub3RpZmllcl9yZWdpc3RlcihjbGssICZtdXhfbmItPmNsa19uYik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbXV4LmggYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbXV4LmgKaW5kZXggOTQ1MDgyNi4uNDdhYmEzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X211eC5oCisrKyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9tdXguaApAQCAtNSwxNCArNSwxOCBAQAogCiAjaW5jbHVkZSAiY2N1X2NvbW1vbi5oIgogCi1zdHJ1Y3QgY2N1X211eF9pbnRlcm5hbCB7Ci0JdTgJc2hpZnQ7Ci0JdTgJd2lkdGg7CitzdHJ1Y3QgY2N1X211eF9maXhlZF9wcmVkaXYgeworCXU4CWluZGV4OworCXUxNglkaXY7Cit9OwogCi0Jc3RydWN0IHsKLQkJdTgJaW5kZXg7Ci0JCXU4CWRpdjsKLQl9IGZpeGVkX3ByZWRpdjsKK3N0cnVjdCBjY3VfbXV4X2ludGVybmFsIHsKKwl1OAkJc2hpZnQ7CisJdTgJCXdpZHRoOworCWNvbnN0IHU4CSp0YWJsZTsKKworCWNvbnN0IHN0cnVjdCBjY3VfbXV4X2ZpeGVkX3ByZWRpdgkqZml4ZWRfcHJlZGl2czsKKwl1OAkJbl9wcmVkaXZzOwogCiAJc3RydWN0IHsKIAkJdTgJaW5kZXg7CkBAIC0yMSwxMiArMjUsMTYgQEAKIAl9IHZhcmlhYmxlX3ByZWRpdjsKIH07CiAKLSNkZWZpbmUgU1VOWElfQ0xLX01VWChfc2hpZnQsIF93aWR0aCkJXAotCXsJCQkJCVwKLQkJLnNoaWZ0CT0gX3NoaWZ0LAkJXAotCQkud2lkdGgJPSBfd2lkdGgsCQlcCisjZGVmaW5lIF9TVU5YSV9DQ1VfTVVYX1RBQkxFKF9zaGlmdCwgX3dpZHRoLCBfdGFibGUpCVwKKwl7CQkJCQkJXAorCQkuc2hpZnQJPSBfc2hpZnQsCQkJXAorCQkud2lkdGgJPSBfd2lkdGgsCQkJXAorCQkudGFibGUJPSBfdGFibGUsCQkJXAogCX0KIAorI2RlZmluZSBfU1VOWElfQ0NVX01VWChfc2hpZnQsIF93aWR0aCkgXAorCV9TVU5YSV9DQ1VfTVVYX1RBQkxFKF9zaGlmdCwgX3dpZHRoLCBOVUxMKQorCiBzdHJ1Y3QgY2N1X211eCB7CiAJdTE2CQkJcmVnOwogCXUzMgkJCWVuYWJsZTsKQEAgLTM1LDkgKzQzLDEyIEBACiAJc3RydWN0IGNjdV9jb21tb24JY29tbW9uOwogfTsKIAotI2RlZmluZSBTVU5YSV9DQ1VfTVVYKF9zdHJ1Y3QsIF9uYW1lLCBfcGFyZW50cywgX3JlZywgX3NoaWZ0LCBfd2lkdGgsIF9mbGFncykgXAorI2RlZmluZSBTVU5YSV9DQ1VfTVVYX1RBQkxFX1dJVEhfR0FURShfc3RydWN0LCBfbmFtZSwgX3BhcmVudHMsIF90YWJsZSwJXAorCQkJCSAgICAgX3JlZywgX3NoaWZ0LCBfd2lkdGgsIF9nYXRlLAlcCisJCQkJICAgICBfZmxhZ3MpCQkJCVwKIAlzdHJ1Y3QgY2N1X211eCBfc3RydWN0ID0gewkJCQkJXAotCQkubXV4CT0gU1VOWElfQ0xLX01VWChfc2hpZnQsIF93aWR0aCksCQlcCisJCS5lbmFibGUJPSBfZ2F0ZSwJCQkJCVwKKwkJLm11eAk9IF9TVU5YSV9DQ1VfTVVYX1RBQkxFKF9zaGlmdCwgX3dpZHRoLCBfdGFibGUpLAlcCiAJCS5jb21tb24JPSB7CQkJCQkJXAogCQkJLnJlZwkJPSBfcmVnLAkJCQlcCiAJCQkuaHcuaW5pdAk9IENMS19IV19JTklUX1BBUkVOVFMoX25hbWUsCVwKQEAgLTQ5LDE3ICs2MCwxNCBAQAogCiAjZGVmaW5lIFNVTlhJX0NDVV9NVVhfV0lUSF9HQVRFKF9zdHJ1Y3QsIF9uYW1lLCBfcGFyZW50cywgX3JlZywJCVwKIAkJCQlfc2hpZnQsIF93aWR0aCwgX2dhdGUsIF9mbGFncykJCVwKLQlzdHJ1Y3QgY2N1X211eCBfc3RydWN0ID0gewkJCQkJXAotCQkuZW5hYmxlCT0gX2dhdGUsCQkJCQlcCi0JCS5tdXgJPSBTVU5YSV9DTEtfTVVYKF9zaGlmdCwgX3dpZHRoKSwJCVwKLQkJLmNvbW1vbgk9IHsJCQkJCQlcCi0JCQkucmVnCQk9IF9yZWcsCQkJCVwKLQkJCS5ody5pbml0CT0gQ0xLX0hXX0lOSVRfUEFSRU5UUyhfbmFtZSwJXAotCQkJCQkJCSAgICAgIF9wYXJlbnRzLCBcCi0JCQkJCQkJICAgICAgJmNjdV9tdXhfb3BzLCBcCi0JCQkJCQkJICAgICAgX2ZsYWdzKSwJXAotCQl9CQkJCQkJCVwKLQl9CisJU1VOWElfQ0NVX01VWF9UQUJMRV9XSVRIX0dBVEUoX3N0cnVjdCwgX25hbWUsIF9wYXJlbnRzLCBOVUxMLAlcCisJCQkJICAgICAgX3JlZywgX3NoaWZ0LCBfd2lkdGgsIF9nYXRlLAlcCisJCQkJICAgICAgX2ZsYWdzKQorCisjZGVmaW5lIFNVTlhJX0NDVV9NVVgoX3N0cnVjdCwgX25hbWUsIF9wYXJlbnRzLCBfcmVnLCBfc2hpZnQsIF93aWR0aCwJXAorCQkgICAgICBfZmxhZ3MpCQkJCQkJXAorCVNVTlhJX0NDVV9NVVhfVEFCTEVfV0lUSF9HQVRFKF9zdHJ1Y3QsIF9uYW1lLCBfcGFyZW50cywgTlVMTCwJXAorCQkJCSAgICAgIF9yZWcsIF9zaGlmdCwgX3dpZHRoLCAwLCBfZmxhZ3MpCiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGNjdV9tdXggKmh3X3RvX2NjdV9tdXgoc3RydWN0IGNsa19odyAqaHcpCiB7CkBAIC04OCw0ICs5NiwxOCBAQAogCQkJICAgICAgc3RydWN0IGNjdV9tdXhfaW50ZXJuYWwgKmNtLAogCQkJICAgICAgdTggaW5kZXgpOwogCitzdHJ1Y3QgY2N1X211eF9uYiB7CisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrCWNsa19uYjsKKwlzdHJ1Y3QgY2N1X2NvbW1vbgkqY29tbW9uOworCXN0cnVjdCBjY3VfbXV4X2ludGVybmFsCSpjbTsKKworCXUzMglkZWxheV91czsJLyogSG93IG1hbnkgdXMgdG8gd2FpdCBhZnRlciByZXBhcmVudGluZyAqLworCXU4CWJ5cGFzc19pbmRleDsJLyogV2hpY2ggcGFyZW50IHRvIHRlbXBvcmFyaWx5IHVzZSAqLworCXU4CW9yaWdpbmFsX2luZGV4OwkvKiBUaGlzIGlzIHNldCBieSB0aGUgbm90aWZpZXIgY2FsbGJhY2sgKi8KK307CisKKyNkZWZpbmUgdG9fY2N1X211eF9uYihfbmIpIGNvbnRhaW5lcl9vZihfbmIsIHN0cnVjdCBjY3VfbXV4X25iLCBjbGtfbmIpCisKK2ludCBjY3VfbXV4X25vdGlmaWVyX3JlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsaywgc3RydWN0IGNjdV9tdXhfbmIgKm11eF9uYik7CisKICNlbmRpZiAvKiBfQ0NVX01VWF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X25rLmMgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbmsuYwppbmRleCA0NDcwZmZjLi5kNmZhZmIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbmsuYworKysgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbmsuYwpAQCAtMTQsOSArMTQsOSBAQAogI2luY2x1ZGUgImNjdV9nYXRlLmgiCiAjaW5jbHVkZSAiY2N1X25rLmgiCiAKLXZvaWQgY2N1X25rX2ZpbmRfYmVzdCh1bnNpZ25lZCBsb25nIHBhcmVudCwgdW5zaWduZWQgbG9uZyByYXRlLAotCQkgICAgICB1bnNpZ25lZCBpbnQgbWF4X24sIHVuc2lnbmVkIGludCBtYXhfaywKLQkJICAgICAgdW5zaWduZWQgaW50ICpuLCB1bnNpZ25lZCBpbnQgKmspCitzdGF0aWMgdm9pZCBjY3VfbmtfZmluZF9iZXN0KHVuc2lnbmVkIGxvbmcgcGFyZW50LCB1bnNpZ25lZCBsb25nIHJhdGUsCisJCQkgICAgIHVuc2lnbmVkIGludCBtYXhfbiwgdW5zaWduZWQgaW50IG1heF9rLAorCQkJICAgICB1bnNpZ25lZCBpbnQgKm4sIHVuc2lnbmVkIGludCAqaykKIHsKIAl1bnNpZ25lZCBsb25nIGJlc3RfcmF0ZSA9IDA7CiAJdW5zaWduZWQgaW50IGJlc3RfayA9IDAsIGJlc3RfbiA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbmttLmMgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbmttLmMKaW5kZXggMjA3MTgyMi4uMDU5ZmRjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X25rbS5jCisrKyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9ua20uYwpAQCAtOTMsMTkgKzkzLDMwIEBACiAJcmV0dXJuIHBhcmVudF9yYXRlICogKG4gKyAxKSAqIChrICsgMSkgLyAobSArIDEpOwogfQogCi1zdGF0aWMgbG9uZyBjY3VfbmttX3JvdW5kX3JhdGUoc3RydWN0IGNsa19odyAqaHcsIHVuc2lnbmVkIGxvbmcgcmF0ZSwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKnBhcmVudF9yYXRlKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgY2N1X25rbV9yb3VuZF9yYXRlKHN0cnVjdCBjY3VfbXV4X2ludGVybmFsICptdXgsCisJCQkJCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUsCisJCQkJCXVuc2lnbmVkIGxvbmcgcmF0ZSwKKwkJCQkJdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgY2N1X25rbSAqbmttID0gaHdfdG9fY2N1X25rbShodyk7CisJc3RydWN0IGNjdV9ua20gKm5rbSA9IGRhdGE7CiAJc3RydWN0IF9jY3VfbmttIF9ua207CiAKIAlfbmttLm1heF9uID0gMSA8PCBua20tPm4ud2lkdGg7CiAJX25rbS5tYXhfayA9IDEgPDwgbmttLT5rLndpZHRoOwotCV9ua20ubWF4X20gPSAxIDw8IG5rbS0+bS53aWR0aDsKKwlfbmttLm1heF9tID0gbmttLT5tLm1heCA/OiAxIDw8IG5rbS0+bS53aWR0aDsKIAotCWNjdV9ua21fZmluZF9iZXN0KCpwYXJlbnRfcmF0ZSwgcmF0ZSwgJl9ua20pOworCWNjdV9ua21fZmluZF9iZXN0KHBhcmVudF9yYXRlLCByYXRlLCAmX25rbSk7CiAKLQlyZXR1cm4gKnBhcmVudF9yYXRlICogX25rbS5uICogX25rbS5rIC8gX25rbS5tOworCXJldHVybiBwYXJlbnRfcmF0ZSAqIF9ua20ubiAqIF9ua20uayAvIF9ua20ubTsKK30KKworc3RhdGljIGludCBjY3VfbmttX2RldGVybWluZV9yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LAorCQkJCSAgc3RydWN0IGNsa19yYXRlX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgY2N1X25rbSAqbmttID0gaHdfdG9fY2N1X25rbShodyk7CisKKwlyZXR1cm4gY2N1X211eF9oZWxwZXJfZGV0ZXJtaW5lX3JhdGUoJm5rbS0+Y29tbW9uLCAmbmttLT5tdXgsCisJCQkJCSAgICAgcmVxLCBjY3VfbmttX3JvdW5kX3JhdGUsIG5rbSk7CiB9CiAKIHN0YXRpYyBpbnQgY2N1X25rbV9zZXRfcmF0ZShzdHJ1Y3QgY2xrX2h3ICpodywgdW5zaWduZWQgbG9uZyByYXRlLApAQCAtMTE4LDcgKzEyOSw3IEBACiAKIAlfbmttLm1heF9uID0gMSA8PCBua20tPm4ud2lkdGg7CiAJX25rbS5tYXhfayA9IDEgPDwgbmttLT5rLndpZHRoOwotCV9ua20ubWF4X20gPSAxIDw8IG5rbS0+bS53aWR0aDsKKwlfbmttLm1heF9tID0gbmttLT5tLm1heCA/OiAxIDw8IG5rbS0+bS53aWR0aDsKIAogCWNjdV9ua21fZmluZF9iZXN0KHBhcmVudF9yYXRlLCByYXRlLCAmX25rbSk7CiAKQEAgLTE0MiwxMiArMTUzLDI5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB1OCBjY3VfbmttX2dldF9wYXJlbnQoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IGNjdV9ua20gKm5rbSA9IGh3X3RvX2NjdV9ua20oaHcpOworCisJcmV0dXJuIGNjdV9tdXhfaGVscGVyX2dldF9wYXJlbnQoJm5rbS0+Y29tbW9uLCAmbmttLT5tdXgpOworfQorCitzdGF0aWMgaW50IGNjdV9ua21fc2V0X3BhcmVudChzdHJ1Y3QgY2xrX2h3ICpodywgdTggaW5kZXgpCit7CisJc3RydWN0IGNjdV9ua20gKm5rbSA9IGh3X3RvX2NjdV9ua20oaHcpOworCisJcmV0dXJuIGNjdV9tdXhfaGVscGVyX3NldF9wYXJlbnQoJm5rbS0+Y29tbW9uLCAmbmttLT5tdXgsIGluZGV4KTsKK30KKwogY29uc3Qgc3RydWN0IGNsa19vcHMgY2N1X25rbV9vcHMgPSB7CiAJLmRpc2FibGUJPSBjY3VfbmttX2Rpc2FibGUsCiAJLmVuYWJsZQkJPSBjY3VfbmttX2VuYWJsZSwKIAkuaXNfZW5hYmxlZAk9IGNjdV9ua21faXNfZW5hYmxlZCwKIAorCS5nZXRfcGFyZW50CT0gY2N1X25rbV9nZXRfcGFyZW50LAorCS5zZXRfcGFyZW50CT0gY2N1X25rbV9zZXRfcGFyZW50LAorCisJLmRldGVybWluZV9yYXRlCT0gY2N1X25rbV9kZXRlcm1pbmVfcmF0ZSwKIAkucmVjYWxjX3JhdGUJPSBjY3VfbmttX3JlY2FsY19yYXRlLAotCS5yb3VuZF9yYXRlCT0gY2N1X25rbV9yb3VuZF9yYXRlLAogCS5zZXRfcmF0ZQk9IGNjdV9ua21fc2V0X3JhdGUsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X25rbS5oIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X25rbS5oCmluZGV4IDE5MzZhYzEuLjM1NDkzZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9ua20uaAorKysgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbmttLmgKQEAgLTMyLDEwICszMiwzMyBAQAogCXN0cnVjdCBfY2N1X211bHQJbjsKIAlzdHJ1Y3QgX2NjdV9tdWx0CWs7CiAJc3RydWN0IF9jY3VfZGl2CQltOworCXN0cnVjdCBjY3VfbXV4X2ludGVybmFsCW11eDsKIAogCXN0cnVjdCBjY3VfY29tbW9uCWNvbW1vbjsKIH07CiAKKyNkZWZpbmUgU1VOWElfQ0NVX05LTV9XSVRIX01VWF9HQVRFX0xPQ0soX3N0cnVjdCwgX25hbWUsIF9wYXJlbnRzLCBfcmVnLCBcCisJCQkJCSBfbnNoaWZ0LCBfbndpZHRoLAkJXAorCQkJCQkgX2tzaGlmdCwgX2t3aWR0aCwJCVwKKwkJCQkJIF9tc2hpZnQsIF9td2lkdGgsCQlcCisJCQkJCSBfbXV4c2hpZnQsIF9tdXh3aWR0aCwJCVwKKwkJCQkJIF9nYXRlLCBfbG9jaywgX2ZsYWdzKQkJXAorCXN0cnVjdCBjY3VfbmttIF9zdHJ1Y3QgPSB7CQkJCQlcCisJCS5lbmFibGUJCT0gX2dhdGUsCQkJCVwKKwkJLmxvY2sJCT0gX2xvY2ssCQkJCVwKKwkJLmsJCT0gX1NVTlhJX0NDVV9NVUxUKF9rc2hpZnQsIF9rd2lkdGgpLAlcCisJCS5uCQk9IF9TVU5YSV9DQ1VfTVVMVChfbnNoaWZ0LCBfbndpZHRoKSwJXAorCQkubQkJPSBfU1VOWElfQ0NVX0RJVihfbXNoaWZ0LCBfbXdpZHRoKSwJXAorCQkubXV4CQk9IF9TVU5YSV9DQ1VfTVVYKF9tdXhzaGlmdCwgX211eHdpZHRoKSwJXAorCQkuY29tbW9uCQk9IHsJCQkJCVwKKwkJCS5yZWcJCT0gX3JlZywJCQkJXAorCQkJLmh3LmluaXQJPSBDTEtfSFdfSU5JVF9QQVJFTlRTKF9uYW1lLAlcCisJCQkJCQkgICAgICBfcGFyZW50cywJCVwKKwkJCQkJCSAgICAgICZjY3VfbmttX29wcywJXAorCQkJCQkJICAgICAgX2ZsYWdzKSwJCVwKKwkJfSwJCQkJCQkJXAorCX0KKwogI2RlZmluZSBTVU5YSV9DQ1VfTktNX1dJVEhfR0FURV9MT0NLKF9zdHJ1Y3QsIF9uYW1lLCBfcGFyZW50LCBfcmVnLAlcCiAJCQkJICAgICBfbnNoaWZ0LCBfbndpZHRoLAkJCVwKIAkJCQkgICAgIF9rc2hpZnQsIF9rd2lkdGgsCQkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X25rbXAuYyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9ua21wLmMKaW5kZXggOWYyYjk4ZS4uOTc2OWRlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X25rbXAuYworKysgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbmttcC5jCkBAIC0yOSwxNCArMjksMTQgQEAKIAl1bnNpZ25lZCBsb25nIF9uLCBfaywgX20sIF9wOwogCiAJZm9yIChfayA9IDE7IF9rIDw9IG5rbXAtPm1heF9rOyBfaysrKSB7Ci0JCWZvciAoX3AgPSAwOyBfcCA8PSBua21wLT5tYXhfcDsgX3ArKykgeworCQlmb3IgKF9wID0gMTsgX3AgPD0gbmttcC0+bWF4X3A7IF9wIDw8PSAxKSB7CiAJCQl1bnNpZ25lZCBsb25nIHRtcF9yYXRlOwogCi0JCQlyYXRpb25hbF9iZXN0X2FwcHJveGltYXRpb24ocmF0ZSAvIF9rLCBwYXJlbnQgPj4gX3AsCisJCQlyYXRpb25hbF9iZXN0X2FwcHJveGltYXRpb24ocmF0ZSAvIF9rLCBwYXJlbnQgLyBfcCwKIAkJCQkJCSAgICBua21wLT5tYXhfbiwgbmttcC0+bWF4X20sCiAJCQkJCQkgICAgJl9uLCAmX20pOwogCi0JCQl0bXBfcmF0ZSA9IChwYXJlbnQgKiBfbiAqIF9rID4+IF9wKSAvIF9tOworCQkJdG1wX3JhdGUgPSBwYXJlbnQgKiBfbiAqIF9rIC8gKF9tICogX3ApOwogCiAJCQlpZiAodG1wX3JhdGUgPiByYXRlKQogCQkJCWNvbnRpbnVlOwpAQCAtMTEwLDEzICsxMTAsMTIgQEAKIAogCV9ua21wLm1heF9uID0gMSA8PCBua21wLT5uLndpZHRoOwogCV9ua21wLm1heF9rID0gMSA8PCBua21wLT5rLndpZHRoOwotCV9ua21wLm1heF9tID0gMSA8PCBua21wLT5tLndpZHRoOwotCV9ua21wLm1heF9wID0gKDEgPDwgbmttcC0+cC53aWR0aCkgLSAxOworCV9ua21wLm1heF9tID0gbmttcC0+bS5tYXggPzogMSA8PCBua21wLT5tLndpZHRoOworCV9ua21wLm1heF9wID0gbmttcC0+cC5tYXggPzogMSA8PCAoKDEgPDwgbmttcC0+cC53aWR0aCkgLSAxKTsKIAotCWNjdV9ua21wX2ZpbmRfYmVzdCgqcGFyZW50X3JhdGUsIHJhdGUsCi0JCQkgICAmX25rbXApOworCWNjdV9ua21wX2ZpbmRfYmVzdCgqcGFyZW50X3JhdGUsIHJhdGUsICZfbmttcCk7CiAKLQlyZXR1cm4gKCpwYXJlbnRfcmF0ZSAqIF9ua21wLm4gKiBfbmttcC5rID4+IF9ua21wLnApIC8gX25rbXAubTsKKwlyZXR1cm4gKnBhcmVudF9yYXRlICogX25rbXAubiAqIF9ua21wLmsgLyAoX25rbXAubSAqIF9ua21wLnApOwogfQogCiBzdGF0aWMgaW50IGNjdV9ua21wX3NldF9yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LCB1bnNpZ25lZCBsb25nIHJhdGUsCkBAIC0xMjksOCArMTI4LDggQEAKIAogCV9ua21wLm1heF9uID0gMSA8PCBua21wLT5uLndpZHRoOwogCV9ua21wLm1heF9rID0gMSA8PCBua21wLT5rLndpZHRoOwotCV9ua21wLm1heF9tID0gMSA8PCBua21wLT5tLndpZHRoOwotCV9ua21wLm1heF9wID0gKDEgPDwgbmttcC0+cC53aWR0aCkgLSAxOworCV9ua21wLm1heF9tID0gbmttcC0+bS5tYXggPzogMSA8PCBua21wLT5tLndpZHRoOworCV9ua21wLm1heF9wID0gbmttcC0+cC5tYXggPzogMSA8PCAoKDEgPDwgbmttcC0+cC53aWR0aCkgLSAxKTsKIAogCWNjdV9ua21wX2ZpbmRfYmVzdChwYXJlbnRfcmF0ZSwgcmF0ZSwgJl9ua21wKTsKIApAQCAtMTQ1LDcgKzE0NCw3IEBACiAJcmVnIHw9IChfbmttcC5uIC0gMSkgPDwgbmttcC0+bi5zaGlmdDsKIAlyZWcgfD0gKF9ua21wLmsgLSAxKSA8PCBua21wLT5rLnNoaWZ0OwogCXJlZyB8PSAoX25rbXAubSAtIDEpIDw8IG5rbXAtPm0uc2hpZnQ7Ci0JcmVnIHw9IF9ua21wLnAgPDwgbmttcC0+cC5zaGlmdDsKKwlyZWcgfD0gaWxvZzIoX25rbXAucCkgPDwgbmttcC0+cC5zaGlmdDsKIAogCXdyaXRlbChyZWcsIG5rbXAtPmNvbW1vbi5iYXNlICsgbmttcC0+Y29tbW9uLnJlZyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdV9ubS5jIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X25tLmMKaW5kZXggZTM1ZGRkOC4uYjYxYmRkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X25tLmMKKysrIGIvZHJpdmVycy9jbGsvc3VueGktbmcvY2N1X25tLmMKQEAgLTYxLDExICs2MSwxMyBAQAogCQkJICAgICAgdW5zaWduZWQgbG9uZyAqcGFyZW50X3JhdGUpCiB7CiAJc3RydWN0IGNjdV9ubSAqbm0gPSBod190b19jY3Vfbm0oaHcpOworCXVuc2lnbmVkIGxvbmcgbWF4X24sIG1heF9tOwogCXVuc2lnbmVkIGxvbmcgbiwgbTsKIAotCXJhdGlvbmFsX2Jlc3RfYXBwcm94aW1hdGlvbihyYXRlLCAqcGFyZW50X3JhdGUsCi0JCQkJICAgIDEgPDwgbm0tPm4ud2lkdGgsIDEgPDwgbm0tPm0ud2lkdGgsCi0JCQkJICAgICZuLCAmbSk7CisJbWF4X24gPSAxIDw8IG5tLT5uLndpZHRoOworCW1heF9tID0gbm0tPm0ubWF4ID86IDEgPDwgbm0tPm0ud2lkdGg7CisKKwlyYXRpb25hbF9iZXN0X2FwcHJveGltYXRpb24ocmF0ZSwgKnBhcmVudF9yYXRlLCBtYXhfbiwgbWF4X20sICZuLCAmbSk7CiAKIAlyZXR1cm4gKnBhcmVudF9yYXRlICogbiAvIG07CiB9CkBAIC03NSw2ICs3Nyw3IEBACiB7CiAJc3RydWN0IGNjdV9ubSAqbm0gPSBod190b19jY3Vfbm0oaHcpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBtYXhfbiwgbWF4X207CiAJdW5zaWduZWQgbG9uZyBuLCBtOwogCXUzMiByZWc7CiAKQEAgLTgzLDkgKzg2LDEwIEBACiAJZWxzZQogCQljY3VfZnJhY19oZWxwZXJfZGlzYWJsZSgmbm0tPmNvbW1vbiwgJm5tLT5mcmFjKTsKIAotCXJhdGlvbmFsX2Jlc3RfYXBwcm94aW1hdGlvbihyYXRlLCBwYXJlbnRfcmF0ZSwKLQkJCQkgICAgMSA8PCBubS0+bi53aWR0aCwgMSA8PCBubS0+bS53aWR0aCwKLQkJCQkgICAgJm4sICZtKTsKKwltYXhfbiA9IDEgPDwgbm0tPm4ud2lkdGg7CisJbWF4X20gPSBubS0+bS5tYXggPzogMSA8PCBubS0+bS53aWR0aDsKKworCXJhdGlvbmFsX2Jlc3RfYXBwcm94aW1hdGlvbihyYXRlLCBwYXJlbnRfcmF0ZSwgbWF4X24sIG1heF9tLCAmbiwgJm0pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUobm0tPmNvbW1vbi5sb2NrLCBmbGFncyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3N1bnhpL2Nsay1hMTAtcGxsMi5jIGIvZHJpdmVycy9jbGsvc3VueGkvY2xrLWExMC1wbGwyLmMKaW5kZXggMGVlMWYzNi4uZDhlYWI5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvc3VueGkvY2xrLWExMC1wbGwyLmMKKysrIGIvZHJpdmVycy9jbGsvc3VueGkvY2xrLWExMC1wbGwyLmMKQEAgLTczLDcgKzczLDcgQEAKIAkJCQkJICBTVU40SV9QTEwyX1BSRV9ESVZfV0lEVEgsCiAJCQkJCSAgQ0xLX0RJVklERVJfT05FX0JBU0VEIHwgQ0xLX0RJVklERVJfQUxMT1dfWkVSTywKIAkJCQkJICAmc3VuNGlfYTEwX3BsbDJfbG9jayk7Ci0JaWYgKCFwcmVkaXZfY2xrKSB7CisJaWYgKElTX0VSUihwcmVkaXZfY2xrKSkgewogCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyIHRoZSBwcmVkaXYgY2xvY2tcbiIpOwogCQlnb3RvIGVycl9mcmVlX2FycmF5OwogCX0KQEAgLTEwNiw3ICsxMDYsNyBAQAogCQkJCQkgICZtdWx0LT5odywgJmNsa19tdWx0aXBsaWVyX29wcywKIAkJCQkJICAmZ2F0ZS0+aHcsICZjbGtfZ2F0ZV9vcHMsCiAJCQkJCSAgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7Ci0JaWYgKCFiYXNlX2NsaykgeworCWlmIChJU19FUlIoYmFzZV9jbGspKSB7CiAJCXByX2VycigiQ291bGRuJ3QgcmVnaXN0ZXIgdGhlIGJhc2UgbXVsdGlwbGllciBjbG9ja1xuIik7CiAJCWdvdG8gZXJyX2ZyZWVfbXVsdGlwbGllcjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54aS9jbGstbW9kMC5jIGIvZHJpdmVycy9jbGsvc3VueGkvY2xrLW1vZDAuYwppbmRleCBiMzhkNzFjLi5lNTQyNjZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9zdW54aS9jbGstbW9kMC5jCisrKyBiL2RyaXZlcnMvY2xrL3N1bnhpL2Nsay1tb2QwLmMKQEAgLTkxLDcgKzkxLDggQEAKIAlzdW54aV9mYWN0b3JzX3JlZ2lzdGVyKG5vZGUsICZzdW40aV9hMTBfbW9kMF9kYXRhLAogCQkJICAgICAgICZzdW40aV9hMTBfbW9kMF9sb2NrLCByZWcpOwogfQotQ0xLX09GX0RFQ0xBUkUoc3VuNGlfYTEwX21vZDAsICJhbGx3aW5uZXIsc3VuNGktYTEwLW1vZDAtY2xrIiwgc3VuNGlfYTEwX21vZDBfc2V0dXApOworQ0xLX09GX0RFQ0xBUkVfRFJJVkVSKHN1bjRpX2ExMF9tb2QwLCAiYWxsd2lubmVyLHN1bjRpLWExMC1tb2QwLWNsayIsCisJCSAgICAgIHN1bjRpX2ExMF9tb2QwX3NldHVwKTsKIAogc3RhdGljIGludCBzdW40aV9hMTBfbW9kMF9jbGtfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3N1bnhpL2Nsay1zdW44aS1hcGIwLmMgYi9kcml2ZXJzL2Nsay9zdW54aS9jbGstc3VuOGktYXBiMC5jCmluZGV4IGE1NjY2ZTEuLmVhMWVlZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3N1bnhpL2Nsay1zdW44aS1hcGIwLmMKKysrIGIvZHJpdmVycy9jbGsvc3VueGkvY2xrLXN1bjhpLWFwYjAuYwpAQCAtODIsOCArODIsOCBAQAogCW9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uobm9kZSwgMCwgJnJlcyk7CiAJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcmVzKSk7CiB9Ci1DTEtfT0ZfREVDTEFSRShzdW44aV9hMjNfYXBiMCwgImFsbHdpbm5lcixzdW44aS1hMjMtYXBiMC1jbGsiLAotCSAgICAgICBzdW44aV9hMjNfYXBiMF9zZXR1cCk7CitDTEtfT0ZfREVDTEFSRV9EUklWRVIoc3VuOGlfYTIzX2FwYjAsICJhbGx3aW5uZXIsc3VuOGktYTIzLWFwYjAtY2xrIiwKKwkJICAgICAgc3VuOGlfYTIzX2FwYjBfc2V0dXApOwogCiBzdGF0aWMgaW50IHN1bjhpX2EyM19hcGIwX2Nsa19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvc3VueGkvY2xrLXN1bjhpLW1idXMuYyBiL2RyaXZlcnMvY2xrL3N1bnhpL2Nsay1zdW44aS1tYnVzLmMKaW5kZXggNDExZDMwMy4uYjIwMGViZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvc3VueGkvY2xrLXN1bjhpLW1idXMuYworKysgYi9kcml2ZXJzL2Nsay9zdW54aS9jbGstc3VuOGktbWJ1cy5jCkBAIC00OCw3ICs0OCw3IEBACiAJCXJldHVybjsKIAogCXJlZyA9IG9mX2lvX3JlcXVlc3RfYW5kX21hcChub2RlLCAwLCBvZl9ub2RlX2Z1bGxfbmFtZShub2RlKSk7Ci0JaWYgKCFyZWcpIHsKKwlpZiAoSVNfRVJSKHJlZykpIHsKIAkJcHJfZXJyKCJDb3VsZCBub3QgZ2V0IHJlZ2lzdGVycyBmb3Igc3VuOGktbWJ1cy1jbGtcbiIpOwogCQlnb3RvIGVycl9mcmVlX3BhcmVudHM7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvdGVncmEvY2xrLXRlZ3JhMTE0LmMgYi9kcml2ZXJzL2Nsay90ZWdyYS9jbGstdGVncmExMTQuYwppbmRleCA2NGRhN2I3Li45MzNiNWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay90ZWdyYS9jbGstdGVncmExMTQuYworKysgYi9kcml2ZXJzL2Nsay90ZWdyYS9jbGstdGVncmExMTQuYwpAQCAtNDI4LDcgKzQyOCw3IEBACiAJLmRpdl9ubXAgPSAmcGxscF9ubXAsCiAJLmZyZXFfdGFibGUgPSBwbGxfZF9mcmVxX3RhYmxlLAogCS5mbGFncyA9IFRFR1JBX1BMTF9IQVNfQ1BDT04gfCBURUdSQV9QTExfU0VUX0xGQ09OIHwKLQkJIFRFR1JBX1BMTF9VU0VfTE9DSyB8IFRFR1JBX1BMTF9IQVNfTE9DS19FTkFCTEUsCisJCSBURUdSQV9QTExfSEFTX0xPQ0tfRU5BQkxFLAogfTsKIAogc3RhdGljIHN0cnVjdCB0ZWdyYV9jbGtfcGxsX3BhcmFtcyBwbGxfZDJfcGFyYW1zID0gewpAQCAtNDQ2LDcgKzQ0Niw3IEBACiAJLmRpdl9ubXAgPSAmcGxscF9ubXAsCiAJLmZyZXFfdGFibGUgPSBwbGxfZF9mcmVxX3RhYmxlLAogCS5mbGFncyA9IFRFR1JBX1BMTF9IQVNfQ1BDT04gfCBURUdSQV9QTExfU0VUX0xGQ09OIHwKLQkJIFRFR1JBX1BMTF9VU0VfTE9DSyB8IFRFR1JBX1BMTF9IQVNfTE9DS19FTkFCTEUsCisJCSBURUdSQV9QTExfSEFTX0xPQ0tfRU5BQkxFLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwZGl2X21hcCBwbGx1X3BbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3VuaXBoaWVyL0tjb25maWcgYi9kcml2ZXJzL2Nsay91bmlwaGllci9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MTIzNzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsay91bmlwaGllci9LY29uZmlnCkBAIC0wLDAgKzEsOSBAQAorY29uZmlnIENMS19VTklQSElFUgorCWJvb2wgIkNsb2NrIGRyaXZlciBmb3IgVW5pUGhpZXIgU29DcyIKKwlkZXBlbmRzIG9uIEFSQ0hfVU5JUEhJRVIgfHwgQ09NUElMRV9URVNUCisJZGVwZW5kcyBvbiBPRiAmJiBNRkRfU1lTQ09OCisJZGVmYXVsdCBBUkNIX1VOSVBISUVSCisJaGVscAorCSAgU3VwcG9ydCBmb3IgY2xvY2sgY29udHJvbGxlcnMgb24gVW5pUGhpZXIgU29Dcy4KKwkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGNvbnRyb2wgY2xvY2tzIHByb3ZpZGVkIGJ5IFN5c3RlbSBDb250cm9sCisJICBibG9jaywgTWVkaWEgSS9PIGJsb2NrLCBQZXJpcGhlcmFsIEJsb2NrLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvdW5pcGhpZXIvTWFrZWZpbGUgYi9kcml2ZXJzL2Nsay91bmlwaGllci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjdiMzYwMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2xrL3VuaXBoaWVyL01ha2VmaWxlCkBAIC0wLDAgKzEsOCBAQAorb2JqLXkJKz0gY2xrLXVuaXBoaWVyLWNvcmUubworb2JqLXkJKz0gY2xrLXVuaXBoaWVyLWZpeGVkLWZhY3Rvci5vCitvYmoteQkrPSBjbGstdW5pcGhpZXItZml4ZWQtcmF0ZS5vCitvYmoteQkrPSBjbGstdW5pcGhpZXItZ2F0ZS5vCitvYmoteQkrPSBjbGstdW5pcGhpZXItbXV4Lm8KK29iai15CSs9IGNsay11bmlwaGllci1zeXMubworb2JqLXkJKz0gY2xrLXVuaXBoaWVyLW1pby5vCitvYmoteQkrPSBjbGstdW5pcGhpZXItcGVyaS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay91bmlwaGllci9jbGstdW5pcGhpZXItY29yZS5jIGIvZHJpdmVycy9jbGsvdW5pcGhpZXIvY2xrLXVuaXBoaWVyLWNvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmZiODk4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbGsvdW5pcGhpZXIvY2xrLXVuaXBoaWVyLWNvcmUuYwpAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBTb2Npb25leHQgSW5jLgorICogICBBdXRob3I6IE1hc2FoaXJvIFlhbWFkYSA8eWFtYWRhLm1hc2FoaXJvQHNvY2lvbmV4dC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlICJjbGstdW5pcGhpZXIuaCIKKworc3RhdGljIHN0cnVjdCBjbGtfaHcgKnVuaXBoaWVyX2Nsa19yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICBzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsCisJCQkJCWNvbnN0IHN0cnVjdCB1bmlwaGllcl9jbGtfZGF0YSAqZGF0YSkKK3sKKwlzd2l0Y2ggKGRhdGEtPnR5cGUpIHsKKwljYXNlIFVOSVBISUVSX0NMS19UWVBFX0ZJWEVEX0ZBQ1RPUjoKKwkJcmV0dXJuIHVuaXBoaWVyX2Nsa19yZWdpc3Rlcl9maXhlZF9mYWN0b3IoZGV2LCBkYXRhLT5uYW1lLAorCQkJCQkJCSAgJmRhdGEtPmRhdGEuZmFjdG9yKTsKKwljYXNlIFVOSVBISUVSX0NMS19UWVBFX0ZJWEVEX1JBVEU6CisJCXJldHVybiB1bmlwaGllcl9jbGtfcmVnaXN0ZXJfZml4ZWRfcmF0ZShkZXYsIGRhdGEtPm5hbWUsCisJCQkJCQkJJmRhdGEtPmRhdGEucmF0ZSk7CisJY2FzZSBVTklQSElFUl9DTEtfVFlQRV9HQVRFOgorCQlyZXR1cm4gdW5pcGhpZXJfY2xrX3JlZ2lzdGVyX2dhdGUoZGV2LCByZWdtYXAsIGRhdGEtPm5hbWUsCisJCQkJCQkgICZkYXRhLT5kYXRhLmdhdGUpOworCWNhc2UgVU5JUEhJRVJfQ0xLX1RZUEVfTVVYOgorCQlyZXR1cm4gdW5pcGhpZXJfY2xrX3JlZ2lzdGVyX211eChkZXYsIHJlZ21hcCwgZGF0YS0+bmFtZSwKKwkJCQkJCSAmZGF0YS0+ZGF0YS5tdXgpOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGV2LCAidW5zdXBwb3J0ZWQgY2xvY2sgdHlwZVxuIik7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KK30KKworc3RhdGljIGludCB1bmlwaGllcl9jbGtfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBjbGtfaHdfb25lY2VsbF9kYXRhICpod19kYXRhOworCWNvbnN0IHN0cnVjdCB1bmlwaGllcl9jbGtfZGF0YSAqcCwgKmRhdGE7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50OworCWludCBjbGtfbnVtID0gMDsKKworCWRhdGEgPSBvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGEoZGV2KTsKKwlpZiAoV0FSTl9PTighZGF0YSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcGFyZW50ID0gb2ZfZ2V0X3BhcmVudChkZXYtPm9mX25vZGUpOyAvKiBwYXJlbnQgc2hvdWxkIGJlIHN5c2NvbiBub2RlICovCisJcmVnbWFwID0gc3lzY29uX25vZGVfdG9fcmVnbWFwKHBhcmVudCk7CisJb2Zfbm9kZV9wdXQocGFyZW50KTsKKwlpZiAoSVNfRVJSKHJlZ21hcCkpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IHJlZ21hcCAoZXJyb3IgJWxkKVxuIiwKKwkJCVBUUl9FUlIocmVnbWFwKSk7CisJCXJldHVybiBQVFJfRVJSKHJlZ21hcCk7CisJfQorCisJZm9yIChwID0gZGF0YTsgcC0+bmFtZTsgcCsrKQorCQljbGtfbnVtID0gbWF4KGNsa19udW0sIHAtPmlkeCArIDEpOworCisJaHdfZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsCisJCQlzaXplb2YoKmh3X2RhdGEpICsgY2xrX251bSAqIHNpemVvZihzdHJ1Y3QgY2xrX2h3ICopLAorCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFod19kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWh3X2RhdGEtPm51bSA9IGNsa19udW07CisKKwkvKiBhdm9pZCByZXR1cm5pbmcgTlVMTCBmb3IgdW51c2VkIGlkeCAqLworCWZvciAoOyBjbGtfbnVtID49IDA7IGNsa19udW0tLSkKKwkJaHdfZGF0YS0+aHdzW2Nsa19udW1dID0gRVJSX1BUUigtRUlOVkFMKTsKKworCWZvciAocCA9IGRhdGE7IHAtPm5hbWU7IHArKykgeworCQlzdHJ1Y3QgY2xrX2h3ICpodzsKKworCQlkZXZfZGJnKGRldiwgInJlZ2lzdGVyICVzIChpbmRleD0lZClcbiIsIHAtPm5hbWUsIHAtPmlkeCk7CisJCWh3ID0gdW5pcGhpZXJfY2xrX3JlZ2lzdGVyKGRldiwgcmVnbWFwLCBwKTsKKwkJaWYgKElTX0VSUihodykpIHsKKwkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyICVzIChlcnJvciAlbGQpXG4iLAorCQkJCXAtPm5hbWUsIFBUUl9FUlIoaHcpKTsKKwkJCXJldHVybiBQVFJfRVJSKGh3KTsKKwkJfQorCisJCWlmIChwLT5pZHggPj0gMCkKKwkJCWh3X2RhdGEtPmh3c1twLT5pZHhdID0gaHc7CisJfQorCisJcmV0dXJuIG9mX2Nsa19hZGRfaHdfcHJvdmlkZXIoZGV2LT5vZl9ub2RlLCBvZl9jbGtfaHdfb25lY2VsbF9nZXQsCisJCQkJICAgICAgaHdfZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgdW5pcGhpZXJfY2xrX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCW9mX2Nsa19kZWxfcHJvdmlkZXIocGRldi0+ZGV2Lm9mX25vZGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHVuaXBoaWVyX2Nsa19tYXRjaFtdID0geworCS8qIFN5c3RlbSBjbG9jayAqLworCXsKKwkJLmNvbXBhdGlibGUgPSAic29jaW9uZXh0LHVuaXBoaWVyLWxkNC1jbG9jayIsCisJCS5kYXRhID0gdW5pcGhpZXJfbGQ0X3N5c19jbGtfZGF0YSwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAic29jaW9uZXh0LHVuaXBoaWVyLXBybzQtY2xvY2siLAorCQkuZGF0YSA9IHVuaXBoaWVyX3BybzRfc3lzX2Nsa19kYXRhLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJzb2Npb25leHQsdW5pcGhpZXItc2xkOC1jbG9jayIsCisJCS5kYXRhID0gdW5pcGhpZXJfc2xkOF9zeXNfY2xrX2RhdGEsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInNvY2lvbmV4dCx1bmlwaGllci1wcm81LWNsb2NrIiwKKwkJLmRhdGEgPSB1bmlwaGllcl9wcm81X3N5c19jbGtfZGF0YSwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAic29jaW9uZXh0LHVuaXBoaWVyLXB4czItY2xvY2siLAorCQkuZGF0YSA9IHVuaXBoaWVyX3B4czJfc3lzX2Nsa19kYXRhLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJzb2Npb25leHQsdW5pcGhpZXItbGQxMS1jbG9jayIsCisJCS5kYXRhID0gdW5pcGhpZXJfbGQxMV9zeXNfY2xrX2RhdGEsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInNvY2lvbmV4dCx1bmlwaGllci1sZDIwLWNsb2NrIiwKKwkJLmRhdGEgPSB1bmlwaGllcl9sZDIwX3N5c19jbGtfZGF0YSwKKwl9LAorCS8qIE1lZGlhIEkvTyBjbG9jayAqLworCXsKKwkJLmNvbXBhdGlibGUgPSAic29jaW9uZXh0LHVuaXBoaWVyLXNsZDMtbWlvLWNsb2NrIiwKKwkJLmRhdGEgPSB1bmlwaGllcl9zbGQzX21pb19jbGtfZGF0YSwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAic29jaW9uZXh0LHVuaXBoaWVyLWxkNC1taW8tY2xvY2siLAorCQkuZGF0YSA9IHVuaXBoaWVyX3NsZDNfbWlvX2Nsa19kYXRhLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJzb2Npb25leHQsdW5pcGhpZXItcHJvNC1taW8tY2xvY2siLAorCQkuZGF0YSA9IHVuaXBoaWVyX3NsZDNfbWlvX2Nsa19kYXRhLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJzb2Npb25leHQsdW5pcGhpZXItc2xkOC1taW8tY2xvY2siLAorCQkuZGF0YSA9IHVuaXBoaWVyX3NsZDNfbWlvX2Nsa19kYXRhLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJzb2Npb25leHQsdW5pcGhpZXItcHJvNS1taW8tY2xvY2siLAorCQkuZGF0YSA9IHVuaXBoaWVyX3BybzVfbWlvX2Nsa19kYXRhLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJzb2Npb25leHQsdW5pcGhpZXItcHhzMi1taW8tY2xvY2siLAorCQkuZGF0YSA9IHVuaXBoaWVyX3BybzVfbWlvX2Nsa19kYXRhLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJzb2Npb25leHQsdW5pcGhpZXItbGQxMS1taW8tY2xvY2siLAorCQkuZGF0YSA9IHVuaXBoaWVyX3NsZDNfbWlvX2Nsa19kYXRhLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJzb2Npb25leHQsdW5pcGhpZXItbGQyMC1taW8tY2xvY2siLAorCQkuZGF0YSA9IHVuaXBoaWVyX3BybzVfbWlvX2Nsa19kYXRhLAorCX0sCisJLyogUGVyaXBoZXJhbCBjbG9jayAqLworCXsKKwkJLmNvbXBhdGlibGUgPSAic29jaW9uZXh0LHVuaXBoaWVyLWxkNC1wZXJpLWNsb2NrIiwKKwkJLmRhdGEgPSB1bmlwaGllcl9sZDRfcGVyaV9jbGtfZGF0YSwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAic29jaW9uZXh0LHVuaXBoaWVyLXBybzQtcGVyaS1jbG9jayIsCisJCS5kYXRhID0gdW5pcGhpZXJfcHJvNF9wZXJpX2Nsa19kYXRhLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJzb2Npb25leHQsdW5pcGhpZXItc2xkOC1wZXJpLWNsb2NrIiwKKwkJLmRhdGEgPSB1bmlwaGllcl9sZDRfcGVyaV9jbGtfZGF0YSwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAic29jaW9uZXh0LHVuaXBoaWVyLXBybzUtcGVyaS1jbG9jayIsCisJCS5kYXRhID0gdW5pcGhpZXJfcHJvNF9wZXJpX2Nsa19kYXRhLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJzb2Npb25leHQsdW5pcGhpZXItcHhzMi1wZXJpLWNsb2NrIiwKKwkJLmRhdGEgPSB1bmlwaGllcl9wcm80X3BlcmlfY2xrX2RhdGEsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInNvY2lvbmV4dCx1bmlwaGllci1sZDExLXBlcmktY2xvY2siLAorCQkuZGF0YSA9IHVuaXBoaWVyX3BybzRfcGVyaV9jbGtfZGF0YSwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAic29jaW9uZXh0LHVuaXBoaWVyLWxkMjAtcGVyaS1jbG9jayIsCisJCS5kYXRhID0gdW5pcGhpZXJfcHJvNF9wZXJpX2Nsa19kYXRhLAorCX0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB1bmlwaGllcl9jbGtfZHJpdmVyID0geworCS5wcm9iZSA9IHVuaXBoaWVyX2Nsa19wcm9iZSwKKwkucmVtb3ZlID0gdW5pcGhpZXJfY2xrX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ1bmlwaGllci1jbGsiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB1bmlwaGllcl9jbGtfbWF0Y2gsCisJfSwKK307CitidWlsdGluX3BsYXRmb3JtX2RyaXZlcih1bmlwaGllcl9jbGtfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3VuaXBoaWVyL2Nsay11bmlwaGllci1maXhlZC1mYWN0b3IuYyBiL2RyaXZlcnMvY2xrL3VuaXBoaWVyL2Nsay11bmlwaGllci1maXhlZC1mYWN0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTJkOWY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbGsvdW5pcGhpZXIvY2xrLXVuaXBoaWVyLWZpeGVkLWZhY3Rvci5jCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgU29jaW9uZXh0IEluYy4KKyAqICAgQXV0aG9yOiBNYXNhaGlybyBZYW1hZGEgPHlhbWFkYS5tYXNhaGlyb0Bzb2Npb25leHQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNpbmNsdWRlICJjbGstdW5pcGhpZXIuaCIKKworc3RydWN0IGNsa19odyAqdW5pcGhpZXJfY2xrX3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQljb25zdCBzdHJ1Y3QgdW5pcGhpZXJfY2xrX2ZpeGVkX2ZhY3Rvcl9kYXRhICpkYXRhKQoreworCXN0cnVjdCBjbGtfZml4ZWRfZmFjdG9yICpmaXg7CisJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlpbnQgcmV0OworCisJZml4ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpmaXgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZpeCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpbml0Lm5hbWUgPSBuYW1lOworCWluaXQub3BzID0gJmNsa19maXhlZF9mYWN0b3Jfb3BzOworCWluaXQuZmxhZ3MgPSBkYXRhLT5wYXJlbnRfbmFtZSA/IENMS19TRVRfUkFURV9QQVJFTlQgOiAwOworCWluaXQucGFyZW50X25hbWVzID0gZGF0YS0+cGFyZW50X25hbWUgPyAmZGF0YS0+cGFyZW50X25hbWUgOiBOVUxMOworCWluaXQubnVtX3BhcmVudHMgPSBkYXRhLT5wYXJlbnRfbmFtZSA/IDEgOiAwOworCisJZml4LT5tdWx0ID0gZGF0YS0+bXVsdDsKKwlmaXgtPmRpdiA9IGRhdGEtPmRpdjsKKwlmaXgtPmh3LmluaXQgPSAmaW5pdDsKKworCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKGRldiwgJmZpeC0+aHcpOworCWlmIChyZXQpCisJCXJldHVybiBFUlJfUFRSKHJldCk7CisKKwlyZXR1cm4gJmZpeC0+aHc7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay91bmlwaGllci9jbGstdW5pcGhpZXItZml4ZWQtcmF0ZS5jIGIvZHJpdmVycy9jbGsvdW5pcGhpZXIvY2xrLXVuaXBoaWVyLWZpeGVkLXJhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWQwZDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbGsvdW5pcGhpZXIvY2xrLXVuaXBoaWVyLWZpeGVkLXJhdGUuYwpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFNvY2lvbmV4dCBJbmMuCisgKiAgIEF1dGhvcjogTWFzYWhpcm8gWWFtYWRhIDx5YW1hZGEubWFzYWhpcm9Ac29jaW9uZXh0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisjaW5jbHVkZSAiY2xrLXVuaXBoaWVyLmgiCisKK3N0cnVjdCBjbGtfaHcgKnVuaXBoaWVyX2Nsa19yZWdpc3Rlcl9maXhlZF9yYXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJCWNvbnN0IGNoYXIgKm5hbWUsCisJCQkJY29uc3Qgc3RydWN0IHVuaXBoaWVyX2Nsa19maXhlZF9yYXRlX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGNsa19maXhlZF9yYXRlICpmaXhlZDsKKwlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OworCWludCByZXQ7CisKKwkvKiBhbGxvY2F0ZSBmaXhlZC1yYXRlIGNsb2NrICovCisJZml4ZWQgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmZpeGVkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmaXhlZCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpbml0Lm5hbWUgPSBuYW1lOworCWluaXQub3BzID0gJmNsa19maXhlZF9yYXRlX29wczsKKwlpbml0LnBhcmVudF9uYW1lcyA9IE5VTEw7CisJaW5pdC5udW1fcGFyZW50cyA9IDA7CisKKwlmaXhlZC0+Zml4ZWRfcmF0ZSA9IGRhdGEtPmZpeGVkX3JhdGU7CisJZml4ZWQtPmh3LmluaXQgPSAmaW5pdDsKKworCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKGRldiwgJmZpeGVkLT5odyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKworCXJldHVybiAmZml4ZWQtPmh3OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvdW5pcGhpZXIvY2xrLXVuaXBoaWVyLWdhdGUuYyBiL2RyaXZlcnMvY2xrL3VuaXBoaWVyL2Nsay11bmlwaGllci1nYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkxNDJkNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2xrL3VuaXBoaWVyL2Nsay11bmlwaGllci1nYXRlLmMKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBTb2Npb25leHQgSW5jLgorICogICBBdXRob3I6IE1hc2FoaXJvIFlhbWFkYSA8eWFtYWRhLm1hc2FoaXJvQHNvY2lvbmV4dC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworI2luY2x1ZGUgImNsay11bmlwaGllci5oIgorCitzdHJ1Y3QgdW5pcGhpZXJfY2xrX2dhdGUgeworCXN0cnVjdCBjbGtfaHcgaHc7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCXVuc2lnbmVkIGludCByZWc7CisJdW5zaWduZWQgaW50IGJpdDsKK307CisKKyNkZWZpbmUgdG9fdW5pcGhpZXJfY2xrX2dhdGUoX2h3KSBcCisJCQkJY29udGFpbmVyX29mKF9odywgc3RydWN0IHVuaXBoaWVyX2Nsa19nYXRlLCBodykKKworc3RhdGljIGludCB1bmlwaGllcl9jbGtfZ2F0ZV9lbmRpc2FibGUoc3RydWN0IGNsa19odyAqaHcsIGludCBlbmFibGUpCit7CisJc3RydWN0IHVuaXBoaWVyX2Nsa19nYXRlICpnYXRlID0gdG9fdW5pcGhpZXJfY2xrX2dhdGUoaHcpOworCisJcmV0dXJuIHJlZ21hcF93cml0ZV9iaXRzKGdhdGUtPnJlZ21hcCwgZ2F0ZS0+cmVnLCBCSVQoZ2F0ZS0+Yml0KSwKKwkJCQkgZW5hYmxlID8gQklUKGdhdGUtPmJpdCkgOiAwKTsKK30KKworc3RhdGljIGludCB1bmlwaGllcl9jbGtfZ2F0ZV9lbmFibGUoc3RydWN0IGNsa19odyAqaHcpCit7CisJcmV0dXJuIHVuaXBoaWVyX2Nsa19nYXRlX2VuZGlzYWJsZShodywgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHVuaXBoaWVyX2Nsa19nYXRlX2Rpc2FibGUoc3RydWN0IGNsa19odyAqaHcpCit7CisJaWYgKHVuaXBoaWVyX2Nsa19nYXRlX2VuZGlzYWJsZShodywgMCkgPCAwKQorCQlwcl93YXJuKCJmYWlsZWQgdG8gZGlzYWJsZSBjbGtcbiIpOworfQorCitzdGF0aWMgaW50IHVuaXBoaWVyX2Nsa19nYXRlX2lzX2VuYWJsZWQoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IHVuaXBoaWVyX2Nsa19nYXRlICpnYXRlID0gdG9fdW5pcGhpZXJfY2xrX2dhdGUoaHcpOworCXVuc2lnbmVkIGludCB2YWw7CisKKwlpZiAocmVnbWFwX3JlYWQoZ2F0ZS0+cmVnbWFwLCBnYXRlLT5yZWcsICZ2YWwpIDwgMCkKKwkJcHJfd2FybigiaXNfZW5hYmxlZCgpIG1heSByZXR1cm4gd3JvbmcgcmVzdWx0XG4iKTsKKworCXJldHVybiAhISh2YWwgJiBCSVQoZ2F0ZS0+Yml0KSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyB1bmlwaGllcl9jbGtfZ2F0ZV9vcHMgPSB7CisJLmVuYWJsZSA9IHVuaXBoaWVyX2Nsa19nYXRlX2VuYWJsZSwKKwkuZGlzYWJsZSA9IHVuaXBoaWVyX2Nsa19nYXRlX2Rpc2FibGUsCisJLmlzX2VuYWJsZWQgPSB1bmlwaGllcl9jbGtfZ2F0ZV9pc19lbmFibGVkLAorfTsKKworc3RydWN0IGNsa19odyAqdW5pcGhpZXJfY2xrX3JlZ2lzdGVyX2dhdGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgIHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKKwkJCQkJICBjb25zdCBjaGFyICpuYW1lLAorCQkJCWNvbnN0IHN0cnVjdCB1bmlwaGllcl9jbGtfZ2F0ZV9kYXRhICpkYXRhKQoreworCXN0cnVjdCB1bmlwaGllcl9jbGtfZ2F0ZSAqZ2F0ZTsKKwlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OworCWludCByZXQ7CisKKwlnYXRlID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpnYXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFnYXRlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWluaXQubmFtZSA9IG5hbWU7CisJaW5pdC5vcHMgPSAmdW5pcGhpZXJfY2xrX2dhdGVfb3BzOworCWluaXQuZmxhZ3MgPSBkYXRhLT5wYXJlbnRfbmFtZSA/IENMS19TRVRfUkFURV9QQVJFTlQgOiAwOworCWluaXQucGFyZW50X25hbWVzID0gZGF0YS0+cGFyZW50X25hbWUgPyAmZGF0YS0+cGFyZW50X25hbWUgOiBOVUxMOworCWluaXQubnVtX3BhcmVudHMgPSBkYXRhLT5wYXJlbnRfbmFtZSA/IDEgOiAwOworCisJZ2F0ZS0+cmVnbWFwID0gcmVnbWFwOworCWdhdGUtPnJlZyA9IGRhdGEtPnJlZzsKKwlnYXRlLT5iaXQgPSBkYXRhLT5iaXQ7CisJZ2F0ZS0+aHcuaW5pdCA9ICZpbml0OworCisJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoZGV2LCAmZ2F0ZS0+aHcpOworCWlmIChyZXQpCisJCXJldHVybiBFUlJfUFRSKHJldCk7CisKKwlyZXR1cm4gJmdhdGUtPmh3OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvdW5pcGhpZXIvY2xrLXVuaXBoaWVyLW1pby5jIGIvZHJpdmVycy9jbGsvdW5pcGhpZXIvY2xrLXVuaXBoaWVyLW1pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYTdlYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsay91bmlwaGllci9jbGstdW5pcGhpZXItbWlvLmMKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgU29jaW9uZXh0IEluYy4KKyAqICAgQXV0aG9yOiBNYXNhaGlybyBZYW1hZGEgPHlhbWFkYS5tYXNhaGlyb0Bzb2Npb25leHQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSAiY2xrLXVuaXBoaWVyLmgiCisKKyNkZWZpbmUgVU5JUEhJRVJfTUlPX0NMS19TRF9GSVhFRAkJCQkJXAorCVVOSVBISUVSX0NMS19GQUNUT1IoInNkLTQ0bSIsIC0xLCAic2QtMTMzbSIsIDEsIDMpLAkJXAorCVVOSVBISUVSX0NMS19GQUNUT1IoInNkLTMzbSIsIC0xLCAic2QtMjAwbSIsIDEsIDYpLAkJXAorCVVOSVBISUVSX0NMS19GQUNUT1IoInNkLTUwbSIsIC0xLCAic2QtMjAwbSIsIDEsIDQpLAkJXAorCVVOSVBISUVSX0NMS19GQUNUT1IoInNkLTY3bSIsIC0xLCAic2QtMjAwbSIsIDEsIDMpLAkJXAorCVVOSVBISUVSX0NMS19GQUNUT1IoInNkLTEwMG0iLCAtMSwgInNkLTIwMG0iLCAxLCAyKSwJCVwKKwlVTklQSElFUl9DTEtfRkFDVE9SKCJzZC00MG0iLCAtMSwgInNkLTIwMG0iLCAxLCA1KSwJCVwKKwlVTklQSElFUl9DTEtfRkFDVE9SKCJzZC0yNW0iLCAtMSwgInNkLTIwMG0iLCAxLCA4KSwJCVwKKwlVTklQSElFUl9DTEtfRkFDVE9SKCJzZC0yMm0iLCAtMSwgInNkLTEzM20iLCAxLCA2KQorCisjZGVmaW5lIFVOSVBISUVSX01JT19DTEtfU0QoX2lkeCwgY2gpCQkJCQlcCisJewkJCQkJCQkJXAorCQkubmFtZSA9ICJzZCIgI2NoICItc2VsIiwJCQkJXAorCQkudHlwZSA9IFVOSVBISUVSX0NMS19UWVBFX01VWCwJCQkJXAorCQkuaWR4ID0gLTEsCQkJCQkJXAorCQkuZGF0YS5tdXggPSB7CQkJCQkJXAorCQkJLnBhcmVudF9uYW1lcyA9IHsJCQkJXAorCQkJCSJzZC00NG0iLAkJCQlcCisJCQkJInNkLTMzbSIsCQkJCVwKKwkJCQkic2QtNTBtIiwJCQkJXAorCQkJCSJzZC02N20iLAkJCQlcCisJCQkJInNkLTEwMG0iLAkJCQlcCisJCQkJInNkLTQwbSIsCQkJCVwKKwkJCQkic2QtMjVtIiwJCQkJXAorCQkJCSJzZC0yMm0iLAkJCQlcCisJCQl9LAkJCQkJCVwKKwkJCS5udW1fcGFyZW50cyA9IDgsCQkJCVwKKwkJCS5yZWcgPSAweDMwICsgMHgyMDAgKiAoY2gpLAkJCVwKKwkJCS5tYXNrcyA9IHsJCQkJCVwKKwkJCQkweDAwMDMxMDAwLAkJCQlcCisJCQkJMHgwMDAzMTAwMCwJCQkJXAorCQkJCTB4MDAwMzEwMDAsCQkJCVwKKwkJCQkweDAwMDMxMDAwLAkJCQlcCisJCQkJMHgwMDAwMTMwMCwJCQkJXAorCQkJCTB4MDAwMDEzMDAsCQkJCVwKKwkJCQkweDAwMDAxMzAwLAkJCQlcCisJCQkJMHgwMDAwMTMwMCwJCQkJXAorCQkJfSwJCQkJCQlcCisJCQkudmFscyA9IHsJCQkJCVwKKwkJCQkweDAwMDAwMDAwLAkJCQlcCisJCQkJMHgwMDAxMDAwMCwJCQkJXAorCQkJCTB4MDAwMjAwMDAsCQkJCVwKKwkJCQkweDAwMDMwMDAwLAkJCQlcCisJCQkJMHgwMDAwMTAwMCwJCQkJXAorCQkJCTB4MDAwMDExMDAsCQkJCVwKKwkJCQkweDAwMDAxMjAwLAkJCQlcCisJCQkJMHgwMDAwMTMwMCwJCQkJXAorCQkJfSwJCQkJCQlcCisJCX0sCQkJCQkJCVwKKwl9LAkJCQkJCQkJXAorCVVOSVBISUVSX0NMS19HQVRFKCJzZCIgI2NoLCAoX2lkeCksICJzZCIgI2NoICItc2VsIiwgMHgyMCArIDB4MjAwICogKGNoKSwgOCkKKworI2RlZmluZSBVTklQSElFUl9NSU9fQ0xLX1VTQjIoaWR4LCBjaCkJCQkJCVwKKwlVTklQSElFUl9DTEtfR0FURSgidXNiMiIgI2NoLCAoaWR4KSwgInVzYjIiLCAweDIwICsgMHgyMDAgKiAoY2gpLCAyOCkKKworI2RlZmluZSBVTklQSElFUl9NSU9fQ0xLX1VTQjJfUEhZKGlkeCwgY2gpCQkJCVwKKwlVTklQSElFUl9DTEtfR0FURSgidXNiMiIgI2NoICItcGh5IiwgKGlkeCksICJ1c2IyIiwgMHgyMCArIDB4MjAwICogKGNoKSwgMjkpCisKKyNkZWZpbmUgVU5JUEhJRVJfTUlPX0NMS19ETUFDKGlkeCkJCQkJCVwKKwlVTklQSElFUl9DTEtfR0FURSgibWlvZG1hYyIsIChpZHgpLCAic3RkbWFjIiwgMHgyMCwgMjUpCisKK2NvbnN0IHN0cnVjdCB1bmlwaGllcl9jbGtfZGF0YSB1bmlwaGllcl9zbGQzX21pb19jbGtfZGF0YVtdID0geworCVVOSVBISUVSX01JT19DTEtfU0RfRklYRUQsCisJVU5JUEhJRVJfTUlPX0NMS19TRCgwLCAwKSwKKwlVTklQSElFUl9NSU9fQ0xLX1NEKDEsIDEpLAorCVVOSVBISUVSX01JT19DTEtfU0QoMiwgMiksCisJVU5JUEhJRVJfTUlPX0NMS19ETUFDKDcpLAorCVVOSVBISUVSX01JT19DTEtfVVNCMig4LCAwKSwKKwlVTklQSElFUl9NSU9fQ0xLX1VTQjIoOSwgMSksCisJVU5JUEhJRVJfTUlPX0NMS19VU0IyKDEwLCAyKSwKKwlVTklQSElFUl9NSU9fQ0xLX1VTQjIoMTEsIDMpLAorCVVOSVBISUVSX01JT19DTEtfVVNCMl9QSFkoMTIsIDApLAorCVVOSVBISUVSX01JT19DTEtfVVNCMl9QSFkoMTMsIDEpLAorCVVOSVBISUVSX01JT19DTEtfVVNCMl9QSFkoMTQsIDIpLAorCVVOSVBISUVSX01JT19DTEtfVVNCMl9QSFkoMTUsIDMpLAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKKworY29uc3Qgc3RydWN0IHVuaXBoaWVyX2Nsa19kYXRhIHVuaXBoaWVyX3BybzVfbWlvX2Nsa19kYXRhW10gPSB7CisJVU5JUEhJRVJfTUlPX0NMS19TRF9GSVhFRCwKKwlVTklQSElFUl9NSU9fQ0xLX1NEKDAsIDApLAorCVVOSVBISUVSX01JT19DTEtfU0QoMSwgMSksCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvdW5pcGhpZXIvY2xrLXVuaXBoaWVyLW11eC5jIGIvZHJpdmVycy9jbGsvdW5pcGhpZXIvY2xrLXVuaXBoaWVyLW11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YTJmMmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsay91bmlwaGllci9jbGstdW5pcGhpZXItbXV4LmMKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBTb2Npb25leHQgSW5jLgorICogICBBdXRob3I6IE1hc2FoaXJvIFlhbWFkYSA8eWFtYWRhLm1hc2FoaXJvQHNvY2lvbmV4dC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworI2luY2x1ZGUgImNsay11bmlwaGllci5oIgorCitzdHJ1Y3QgdW5pcGhpZXJfY2xrX211eCB7CisJc3RydWN0IGNsa19odyBodzsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJdW5zaWduZWQgaW50IHJlZzsKKwljb25zdCB1bnNpZ25lZCBpbnQgKm1hc2tzOworCWNvbnN0IHVuc2lnbmVkIGludCAqdmFsczsKK307CisKKyNkZWZpbmUgdG9fdW5pcGhpZXJfY2xrX211eChfaHcpIGNvbnRhaW5lcl9vZihfaHcsIHN0cnVjdCB1bmlwaGllcl9jbGtfbXV4LCBodykKKworc3RhdGljIGludCB1bmlwaGllcl9jbGtfbXV4X3NldF9wYXJlbnQoc3RydWN0IGNsa19odyAqaHcsIHU4IGluZGV4KQoreworCXN0cnVjdCB1bmlwaGllcl9jbGtfbXV4ICptdXggPSB0b191bmlwaGllcl9jbGtfbXV4KGh3KTsKKworCXJldHVybiByZWdtYXBfd3JpdGVfYml0cyhtdXgtPnJlZ21hcCwgbXV4LT5yZWcsIG11eC0+bWFza3NbaW5kZXhdLAorCQkJCSBtdXgtPnZhbHNbaW5kZXhdKTsKK30KKworc3RhdGljIHU4IHVuaXBoaWVyX2Nsa19tdXhfZ2V0X3BhcmVudChzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgdW5pcGhpZXJfY2xrX211eCAqbXV4ID0gdG9fdW5pcGhpZXJfY2xrX211eChodyk7CisJaW50IG51bV9wYXJlbnRzID0gY2xrX2h3X2dldF9udW1fcGFyZW50cyhodyk7CisJaW50IHJldDsKKwl1MzIgdmFsOworCXU4IGk7CisKKwlyZXQgPSByZWdtYXBfcmVhZChtdXgtPnJlZ21hcCwgbXV4LT5yZWcsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhcmVudHM7IGkrKykKKwkJaWYgKChtdXgtPm1hc2tzW2ldICYgdmFsKSA9PSBtdXgtPnZhbHNbaV0pCisJCQlyZXR1cm4gaTsKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgdW5pcGhpZXJfY2xrX211eF9vcHMgPSB7CisJLmRldGVybWluZV9yYXRlID0gX19jbGtfbXV4X2RldGVybWluZV9yYXRlLAorCS5zZXRfcGFyZW50ID0gdW5pcGhpZXJfY2xrX211eF9zZXRfcGFyZW50LAorCS5nZXRfcGFyZW50ID0gdW5pcGhpZXJfY2xrX211eF9nZXRfcGFyZW50LAorfTsKKworc3RydWN0IGNsa19odyAqdW5pcGhpZXJfY2xrX3JlZ2lzdGVyX211eChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsCisJCQkJCSBjb25zdCBjaGFyICpuYW1lLAorCQkJCWNvbnN0IHN0cnVjdCB1bmlwaGllcl9jbGtfbXV4X2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHVuaXBoaWVyX2Nsa19tdXggKm11eDsKKwlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OworCWludCByZXQ7CisKKwltdXggPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKm11eCksIEdGUF9LRVJORUwpOworCWlmICghbXV4KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWluaXQubmFtZSA9IG5hbWU7CisJaW5pdC5vcHMgPSAmdW5pcGhpZXJfY2xrX211eF9vcHM7CisJaW5pdC5mbGFncyA9IENMS19TRVRfUkFURV9QQVJFTlQ7CisJaW5pdC5wYXJlbnRfbmFtZXMgPSBkYXRhLT5wYXJlbnRfbmFtZXM7CisJaW5pdC5udW1fcGFyZW50cyA9IGRhdGEtPm51bV9wYXJlbnRzLAorCisJbXV4LT5yZWdtYXAgPSByZWdtYXA7CisJbXV4LT5yZWcgPSBkYXRhLT5yZWc7CisJbXV4LT5tYXNrcyA9IGRhdGEtPm1hc2tzOworCW11eC0+dmFscyA9IGRhdGEtPnZhbHM7CisJbXV4LT5ody5pbml0ID0gJmluaXQ7CisKKwlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcihkZXYsICZtdXgtPmh3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCisJcmV0dXJuICZtdXgtPmh3OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvdW5pcGhpZXIvY2xrLXVuaXBoaWVyLXBlcmkuYyBiL2RyaXZlcnMvY2xrL3VuaXBoaWVyL2Nsay11bmlwaGllci1wZXJpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIxYzgwZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2xrL3VuaXBoaWVyL2Nsay11bmlwaGllci1wZXJpLmMKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBTb2Npb25leHQgSW5jLgorICogICBBdXRob3I6IE1hc2FoaXJvIFlhbWFkYSA8eWFtYWRhLm1hc2FoaXJvQHNvY2lvbmV4dC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlICJjbGstdW5pcGhpZXIuaCIKKworI2RlZmluZSBVTklQSElFUl9QRVJJX0NMS19VQVJUKGlkeCwgY2gpCQkJCQlcCisJVU5JUEhJRVJfQ0xLX0dBVEUoInVhcnQiICNjaCwgKGlkeCksICJ1YXJ0IiwgMHgyNCwgMTkgKyAoY2gpKQorCisjZGVmaW5lIFVOSVBISUVSX1BFUklfQ0xLX0kyQ19DT01NT04JCQkJCVwKKwlVTklQSElFUl9DTEtfR0FURSgiaTJjLWNvbW1vbiIsIC0xLCAiaTJjIiwgMHgyMCwgMSkKKworI2RlZmluZSBVTklQSElFUl9QRVJJX0NMS19JMkMoaWR4LCBjaCkJCQkJCVwKKwlVTklQSElFUl9DTEtfR0FURSgiaTJjIiAjY2gsIChpZHgpLCAiaTJjLWNvbW1vbiIsIDB4MjQsIDUgKyAoY2gpKQorCisjZGVmaW5lIFVOSVBISUVSX1BFUklfQ0xLX0ZJMkMoaWR4LCBjaCkJCQkJCVwKKwlVTklQSElFUl9DTEtfR0FURSgiaTJjIiAjY2gsIChpZHgpLCAiaTJjIiwgMHgyNCwgMjQgKyAoY2gpKQorCitjb25zdCBzdHJ1Y3QgdW5pcGhpZXJfY2xrX2RhdGEgdW5pcGhpZXJfbGQ0X3BlcmlfY2xrX2RhdGFbXSA9IHsKKwlVTklQSElFUl9QRVJJX0NMS19VQVJUKDAsIDApLAorCVVOSVBISUVSX1BFUklfQ0xLX1VBUlQoMSwgMSksCisJVU5JUEhJRVJfUEVSSV9DTEtfVUFSVCgyLCAyKSwKKwlVTklQSElFUl9QRVJJX0NMS19VQVJUKDMsIDMpLAorCVVOSVBISUVSX1BFUklfQ0xLX0kyQ19DT01NT04sCisJVU5JUEhJRVJfUEVSSV9DTEtfSTJDKDQsIDApLAorCVVOSVBISUVSX1BFUklfQ0xLX0kyQyg1LCAxKSwKKwlVTklQSElFUl9QRVJJX0NMS19JMkMoNiwgMiksCisJVU5JUEhJRVJfUEVSSV9DTEtfSTJDKDcsIDMpLAorCVVOSVBISUVSX1BFUklfQ0xLX0kyQyg4LCA0KSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CisKK2NvbnN0IHN0cnVjdCB1bmlwaGllcl9jbGtfZGF0YSB1bmlwaGllcl9wcm80X3BlcmlfY2xrX2RhdGFbXSA9IHsKKwlVTklQSElFUl9QRVJJX0NMS19VQVJUKDAsIDApLAorCVVOSVBISUVSX1BFUklfQ0xLX1VBUlQoMSwgMSksCisJVU5JUEhJRVJfUEVSSV9DTEtfVUFSVCgyLCAyKSwKKwlVTklQSElFUl9QRVJJX0NMS19VQVJUKDMsIDMpLAorCVVOSVBISUVSX1BFUklfQ0xLX0ZJMkMoNCwgMCksCisJVU5JUEhJRVJfUEVSSV9DTEtfRkkyQyg1LCAxKSwKKwlVTklQSElFUl9QRVJJX0NMS19GSTJDKDYsIDIpLAorCVVOSVBISUVSX1BFUklfQ0xLX0ZJMkMoNywgMyksCisJVU5JUEhJRVJfUEVSSV9DTEtfRkkyQyg4LCA0KSwKKwlVTklQSElFUl9QRVJJX0NMS19GSTJDKDksIDUpLAorCVVOSVBISUVSX1BFUklfQ0xLX0ZJMkMoMTAsIDYpLAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3VuaXBoaWVyL2Nsay11bmlwaGllci1zeXMuYyBiL2RyaXZlcnMvY2xrL3VuaXBoaWVyL2Nsay11bmlwaGllci1zeXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDAyOTk5MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2xrL3VuaXBoaWVyL2Nsay11bmlwaGllci1zeXMuYwpAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBTb2Npb25leHQgSW5jLgorICogICBBdXRob3I6IE1hc2FoaXJvIFlhbWFkYSA8eWFtYWRhLm1hc2FoaXJvQHNvY2lvbmV4dC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKworI2luY2x1ZGUgImNsay11bmlwaGllci5oIgorCisjZGVmaW5lIFVOSVBISUVSX1NMRDNfU1lTX0NMS19TRAkJCQkJXAorCVVOSVBISUVSX0NMS19GQUNUT1IoInNkLTIwMG0iLCAtMSwgInNwbGwiLCAxLCA4KSwJCVwKKwlVTklQSElFUl9DTEtfRkFDVE9SKCJzZC0xMzNtIiwgLTEsICJ2cGxsMjdhIiwgMSwgMikKKworI2RlZmluZSBVTklQSElFUl9QUk81X1NZU19DTEtfU0QJCQkJCVwKKwlVTklQSElFUl9DTEtfRkFDVE9SKCJzZC0yMDBtIiwgLTEsICJzcGxsIiwgMSwgMTIpLAkJXAorCVVOSVBISUVSX0NMS19GQUNUT1IoInNkLTEzM20iLCAtMSwgInNwbGwiLCAxLCAxOCkKKworI2RlZmluZSBVTklQSElFUl9MRDIwX1NZU19DTEtfU0QJCQkJCVwKKwlVTklQSElFUl9DTEtfRkFDVE9SKCJzZC0yMDBtIiwgLTEsICJzcGxsIiwgMSwgMTApLAkJXAorCVVOSVBISUVSX0NMS19GQUNUT1IoInNkLTEzM20iLCAtMSwgInNwbGwiLCAxLCAxNSkKKworI2RlZmluZSBVTklQSElFUl9TTEQzX1NZU19DTEtfU1RETUFDKGlkeCkJCQkJXAorCVVOSVBISUVSX0NMS19HQVRFKCJzdGRtYWMiLCAoaWR4KSwgTlVMTCwgMHgyMTA0LCAxMCkKKworI2RlZmluZSBVTklQSElFUl9MRDExX1NZU19DTEtfU1RETUFDKGlkeCkJCQkJXAorCVVOSVBISUVSX0NMS19HQVRFKCJzdGRtYWMiLCAoaWR4KSwgTlVMTCwgMHgyMTBjLCA4KQorCisjZGVmaW5lIFVOSVBISUVSX1BSTzRfU1lTX0NMS19HSU8oaWR4KQkJCQkJXAorCVVOSVBISUVSX0NMS19HQVRFKCJnaW8iLCAoaWR4KSwgTlVMTCwgMHgyMTA0LCA2KQorCisjZGVmaW5lIFVOSVBISUVSX1BSTzRfU1lTX0NMS19VU0IzKGlkeCwgY2gpCQkJCVwKKwlVTklQSElFUl9DTEtfR0FURSgidXNiMyIgI2NoLCAoaWR4KSwgTlVMTCwgMHgyMTA0LCAxNiArIChjaCkpCisKK2NvbnN0IHN0cnVjdCB1bmlwaGllcl9jbGtfZGF0YSB1bmlwaGllcl9zbGQzX3N5c19jbGtfZGF0YVtdID0geworCVVOSVBISUVSX0NMS19GQUNUT1IoInNwbGwiLCAtMSwgInJlZiIsIDY1LCAxKSwJCS8qIDE1OTcuNDQgTUh6ICovCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigidXBsbCIsIC0xLCAicmVmIiwgNjAwMCwgNTEyKSwJLyogMjg4IE1IeiAqLworCVVOSVBISUVSX0NMS19GQUNUT1IoImEycGxsIiwgLTEsICJyZWYiLCAyNCwgMSksCQkvKiA1ODkuODI0IE1IeiAqLworCVVOSVBISUVSX0NMS19GQUNUT1IoInZwbGwyN2EiLCAtMSwgInJlZiIsIDU2MjUsIDUxMiksCS8qIDI3MCBNSHogKi8KKwlVTklQSElFUl9DTEtfRkFDVE9SKCJ1YXJ0IiwgMCwgImEycGxsIiwgMSwgMTYpLAorCVVOSVBISUVSX0NMS19GQUNUT1IoImkyYyIsIDEsICJzcGxsIiwgMSwgMTYpLAorCVVOSVBISUVSX1NMRDNfU1lTX0NMS19TRCwKKwlVTklQSElFUl9DTEtfRkFDVE9SKCJ1c2IyIiwgLTEsICJ1cGxsIiwgMSwgMTIpLAorCVVOSVBISUVSX1NMRDNfU1lTX0NMS19TVERNQUMoOCksCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworCitjb25zdCBzdHJ1Y3QgdW5pcGhpZXJfY2xrX2RhdGEgdW5pcGhpZXJfbGQ0X3N5c19jbGtfZGF0YVtdID0geworCVVOSVBISUVSX0NMS19GQUNUT1IoInNwbGwiLCAtMSwgInJlZiIsIDY1LCAxKSwJCS8qIDE1OTcuNDQgTUh6ICovCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigidXBsbCIsIC0xLCAicmVmIiwgNjAwMCwgNTEyKSwJLyogMjg4IE1IeiAqLworCVVOSVBISUVSX0NMS19GQUNUT1IoImEycGxsIiwgLTEsICJyZWYiLCAyNCwgMSksCQkvKiA1ODkuODI0IE1IeiAqLworCVVOSVBISUVSX0NMS19GQUNUT1IoInZwbGwyN2EiLCAtMSwgInJlZiIsIDU2MjUsIDUxMiksCS8qIDI3MCBNSHogKi8KKwlVTklQSElFUl9DTEtfRkFDVE9SKCJ1YXJ0IiwgMCwgImEycGxsIiwgMSwgMTYpLAorCVVOSVBISUVSX0NMS19GQUNUT1IoImkyYyIsIDEsICJzcGxsIiwgMSwgMTYpLAorCVVOSVBISUVSX1NMRDNfU1lTX0NMS19TRCwKKwlVTklQSElFUl9DTEtfRkFDVE9SKCJ1c2IyIiwgLTEsICJ1cGxsIiwgMSwgMTIpLAorCVVOSVBISUVSX1NMRDNfU1lTX0NMS19TVERNQUMoOCksCQkvKiBFdGhlciwgSFNDLCBNSU8gKi8KKwl7IC8qIHNlbnRpbmVsICovIH0KK307CisKK2NvbnN0IHN0cnVjdCB1bmlwaGllcl9jbGtfZGF0YSB1bmlwaGllcl9wcm80X3N5c19jbGtfZGF0YVtdID0geworCVVOSVBISUVSX0NMS19GQUNUT1IoInNwbGwiLCAtMSwgInJlZiIsIDY0LCAxKSwJCS8qIDE2MDAgTUh6ICovCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigidXBsbCIsIC0xLCAicmVmIiwgMjg4LCAyNSksCS8qIDI4OCBNSHogKi8KKwlVTklQSElFUl9DTEtfRkFDVE9SKCJhMnBsbCIsIC0xLCAidXBsbCIsIDI1NiwgMTI1KSwJLyogNTg5LjgyNCBNSHogKi8KKwlVTklQSElFUl9DTEtfRkFDVE9SKCJ2cGxsMjdhIiwgLTEsICJyZWYiLCAyNzAsIDI1KSwJLyogMjcwIE1IeiAqLworCVVOSVBISUVSX0NMS19GQUNUT1IoInVhcnQiLCAwLCAiYTJwbGwiLCAxLCA4KSwKKwlVTklQSElFUl9DTEtfRkFDVE9SKCJpMmMiLCAxLCAic3BsbCIsIDEsIDMyKSwKKwlVTklQSElFUl9TTEQzX1NZU19DTEtfU0QsCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigidXNiMiIsIC0xLCAidXBsbCIsIDEsIDEyKSwKKwlVTklQSElFUl9TTEQzX1NZU19DTEtfU1RETUFDKDgpLAkJLyogSFNDLCBNSU8sIFJMRSAqLworCVVOSVBISUVSX1BSTzRfU1lTX0NMS19HSU8oMTIpLAkJCS8qIEV0aGVyLCBTQVRBLCBVU0IzICovCisJVU5JUEhJRVJfUFJPNF9TWVNfQ0xLX1VTQjMoMTQsIDApLAorCVVOSVBISUVSX1BSTzRfU1lTX0NMS19VU0IzKDE1LCAxKSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CisKK2NvbnN0IHN0cnVjdCB1bmlwaGllcl9jbGtfZGF0YSB1bmlwaGllcl9zbGQ4X3N5c19jbGtfZGF0YVtdID0geworCVVOSVBISUVSX0NMS19GQUNUT1IoInNwbGwiLCAtMSwgInJlZiIsIDY0LCAxKSwJCS8qIDE2MDAgTUh6ICovCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigidXBsbCIsIC0xLCAicmVmIiwgMjg4LCAyNSksCS8qIDI4OCBNSHogKi8KKwlVTklQSElFUl9DTEtfRkFDVE9SKCJ2cGxsMjdhIiwgLTEsICJyZWYiLCAyNzAsIDI1KSwJLyogMjcwIE1IeiAqLworCVVOSVBISUVSX0NMS19GQUNUT1IoInVhcnQiLCAwLCAic3BsbCIsIDEsIDIwKSwKKwlVTklQSElFUl9DTEtfRkFDVE9SKCJpMmMiLCAxLCAic3BsbCIsIDEsIDE2KSwKKwlVTklQSElFUl9TTEQzX1NZU19DTEtfU0QsCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigidXNiMiIsIC0xLCAidXBsbCIsIDEsIDEyKSwKKwlVTklQSElFUl9TTEQzX1NZU19DTEtfU1RETUFDKDgpLAkJLyogRXRoZXIsIEhTQywgTUlPICovCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworCitjb25zdCBzdHJ1Y3QgdW5pcGhpZXJfY2xrX2RhdGEgdW5pcGhpZXJfcHJvNV9zeXNfY2xrX2RhdGFbXSA9IHsKKwlVTklQSElFUl9DTEtfRkFDVE9SKCJzcGxsIiwgLTEsICJyZWYiLCAxMjAsIDEpLAkJLyogMjQwMCBNSHogKi8KKwlVTklQSElFUl9DTEtfRkFDVE9SKCJkYXBsbDEiLCAtMSwgInJlZiIsIDEyOCwgMSksCS8qIDI1NjAgTUh6ICovCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigiZGFwbGwyIiwgLTEsICJyZWYiLCAxNDQsIDEyNSksCS8qIDI5NDkuMTIgTUh6ICovCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigidWFydCIsIDAsICJkYXBsbDIiLCAxLCA0MCksCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigiaTJjIiwgMSwgInNwbGwiLCAxLCA0OCksCisJVU5JUEhJRVJfUFJPNV9TWVNfQ0xLX1NELAorCVVOSVBISUVSX1NMRDNfU1lTX0NMS19TVERNQUMoOCksCQkJLyogSFNDICovCisJVU5JUEhJRVJfUFJPNF9TWVNfQ0xLX0dJTygxMiksCQkJCS8qIFBDSWUsIFVTQjMgKi8KKwlVTklQSElFUl9QUk80X1NZU19DTEtfVVNCMygxNCwgMCksCisJVU5JUEhJRVJfUFJPNF9TWVNfQ0xLX1VTQjMoMTUsIDEpLAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKKworY29uc3Qgc3RydWN0IHVuaXBoaWVyX2Nsa19kYXRhIHVuaXBoaWVyX3B4czJfc3lzX2Nsa19kYXRhW10gPSB7CisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigic3BsbCIsIC0xLCAicmVmIiwgOTYsIDEpLAkJLyogMjQwMCBNSHogKi8KKwlVTklQSElFUl9DTEtfRkFDVE9SKCJ1YXJ0IiwgMCwgInNwbGwiLCAxLCAyNyksCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigiaTJjIiwgMSwgInNwbGwiLCAxLCA0OCksCisJVU5JUEhJRVJfUFJPNV9TWVNfQ0xLX1NELAorCVVOSVBISUVSX1NMRDNfU1lTX0NMS19TVERNQUMoOCksCQkJLyogSFNDLCBSTEUgKi8KKwkvKiBHSU8gaXMgYWx3YXlzIGNsb2NrLWVuYWJsZWQ6IG5vIGZ1bmN0aW9uIGZvciAweDIxMDQgYml0NiAqLworCVVOSVBISUVSX1BSTzRfU1lTX0NMS19VU0IzKDE0LCAwKSwKKwlVTklQSElFUl9QUk80X1NZU19DTEtfVVNCMygxNSwgMSksCisJLyogVGhlIGRvY3VtZW50IG1lbnRpb25zIDB4MjEwNCBiaXQgMTgsIGJ1dCBub3QgZnVuY3Rpb25hbCAqLworCVVOSVBISUVSX0NMS19HQVRFKCJ1c2IzMC1waHkiLCAxNiwgTlVMTCwgMHgyMTA0LCAxOSksCisJVU5JUEhJRVJfQ0xLX0dBVEUoInVzYjMxLXBoeSIsIDIwLCBOVUxMLCAweDIxMDQsIDIwKSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CisKK2NvbnN0IHN0cnVjdCB1bmlwaGllcl9jbGtfZGF0YSB1bmlwaGllcl9sZDExX3N5c19jbGtfZGF0YVtdID0geworCVVOSVBISUVSX0NMS19GQUNUT1IoInNwbGwiLCAtMSwgInJlZiIsIDgwLCAxKSwJCS8qIDIwMDAgTUh6ICovCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigidWFydCIsIDAsICJzcGxsIiwgMSwgMzQpLAorCVVOSVBISUVSX0NMS19GQUNUT1IoImkyYyIsIDEsICJzcGxsIiwgMSwgNDApLAorCVVOSVBISUVSX0xEMTFfU1lTX0NMS19TVERNQUMoOCksCQkJLyogSFNDLCBNSU8gKi8KKwlVTklQSElFUl9DTEtfRkFDVE9SKCJ1c2IyIiwgLTEsICJyZWYiLCAyNCwgMjUpLAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKKworY29uc3Qgc3RydWN0IHVuaXBoaWVyX2Nsa19kYXRhIHVuaXBoaWVyX2xkMjBfc3lzX2Nsa19kYXRhW10gPSB7CisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigic3BsbCIsIC0xLCAicmVmIiwgODAsIDEpLAkJLyogMjAwMCBNSHogKi8KKwlVTklQSElFUl9DTEtfRkFDVE9SKCJ1YXJ0IiwgMCwgInNwbGwiLCAxLCAzNCksCisJVU5JUEhJRVJfQ0xLX0ZBQ1RPUigiaTJjIiwgMSwgInNwbGwiLCAxLCA0MCksCisJVU5JUEhJRVJfTEQyMF9TWVNfQ0xLX1NELAorCVVOSVBISUVSX0xEMTFfU1lTX0NMS19TVERNQUMoOCksCQkJLyogSFNDICovCisJLyogR0lPIGlzIGFsd2F5cyBjbG9jay1lbmFibGVkOiBubyBmdW5jdGlvbiBmb3IgMHgyMTBjIGJpdDUgKi8KKwkvKgorCSAqIGNsb2NrIGZvciBVU0IgTGluayBpcyBlbmFibGVkIGJ5IHRoZSBsb2dpYyAiT1IiIG9mIGJpdCAxNCBhbmQgYml0IDE1LgorCSAqIFdlIGRvIG5vdCB1c2UgYml0IDE1IGhlcmUuCisJICovCisJVU5JUEhJRVJfQ0xLX0dBVEUoInVzYjMwIiwgMTQsIE5VTEwsIDB4MjEwYywgMTQpLAorCVVOSVBISUVSX0NMS19HQVRFKCJ1c2IzMC1waHkwIiwgMTYsIE5VTEwsIDB4MjEwYywgMTIpLAorCVVOSVBISUVSX0NMS19HQVRFKCJ1c2IzMC1waHkxIiwgMTcsIE5VTEwsIDB4MjEwYywgMTMpLAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3VuaXBoaWVyL2Nsay11bmlwaGllci5oIGIvZHJpdmVycy9jbGsvdW5pcGhpZXIvY2xrLXVuaXBoaWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FlMTg0MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2xrL3VuaXBoaWVyL2Nsay11bmlwaGllci5oCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFNvY2lvbmV4dCBJbmMuCisgKiAgIEF1dGhvcjogTWFzYWhpcm8gWWFtYWRhIDx5YW1hZGEubWFzYWhpcm9Ac29jaW9uZXh0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX0NMS19VTklQSElFUl9IX18KKyNkZWZpbmUgX19DTEtfVU5JUEhJRVJfSF9fCisKK3N0cnVjdCBjbGtfaHc7CitzdHJ1Y3QgZGV2aWNlOworc3RydWN0IHJlZ21hcDsKKworI2RlZmluZSBVTklQSElFUl9DTEtfTVVYX01BWF9QQVJFTlRTCTgKKworZW51bSB1bmlwaGllcl9jbGtfdHlwZSB7CisJVU5JUEhJRVJfQ0xLX1RZUEVfRklYRURfRkFDVE9SLAorCVVOSVBISUVSX0NMS19UWVBFX0ZJWEVEX1JBVEUsCisJVU5JUEhJRVJfQ0xLX1RZUEVfR0FURSwKKwlVTklQSElFUl9DTEtfVFlQRV9NVVgsCit9OworCitzdHJ1Y3QgdW5pcGhpZXJfY2xrX2ZpeGVkX2ZhY3Rvcl9kYXRhIHsKKwljb25zdCBjaGFyICpwYXJlbnRfbmFtZTsKKwl1bnNpZ25lZCBpbnQgbXVsdDsKKwl1bnNpZ25lZCBpbnQgZGl2OworfTsKKworc3RydWN0IHVuaXBoaWVyX2Nsa19maXhlZF9yYXRlX2RhdGEgeworCXVuc2lnbmVkIGxvbmcgZml4ZWRfcmF0ZTsKK307CisKK3N0cnVjdCB1bmlwaGllcl9jbGtfZ2F0ZV9kYXRhIHsKKwljb25zdCBjaGFyICpwYXJlbnRfbmFtZTsKKwl1bnNpZ25lZCBpbnQgcmVnOworCXVuc2lnbmVkIGludCBiaXQ7Cit9OworCitzdHJ1Y3QgdW5pcGhpZXJfY2xrX211eF9kYXRhIHsKKwljb25zdCBjaGFyICpwYXJlbnRfbmFtZXNbVU5JUEhJRVJfQ0xLX01VWF9NQVhfUEFSRU5UU107CisJdW5zaWduZWQgaW50IG51bV9wYXJlbnRzOworCXVuc2lnbmVkIGludCByZWc7CisJdW5zaWduZWQgaW50IG1hc2tzW1VOSVBISUVSX0NMS19NVVhfTUFYX1BBUkVOVFNdOworCXVuc2lnbmVkIGludCB2YWxzW1VOSVBISUVSX0NMS19NVVhfTUFYX1BBUkVOVFNdOworfTsKKworc3RydWN0IHVuaXBoaWVyX2Nsa19kYXRhIHsKKwljb25zdCBjaGFyICpuYW1lOworCWVudW0gdW5pcGhpZXJfY2xrX3R5cGUgdHlwZTsKKwlpbnQgaWR4OworCXVuaW9uIHsKKwkJc3RydWN0IHVuaXBoaWVyX2Nsa19maXhlZF9mYWN0b3JfZGF0YSBmYWN0b3I7CisJCXN0cnVjdCB1bmlwaGllcl9jbGtfZml4ZWRfcmF0ZV9kYXRhIHJhdGU7CisJCXN0cnVjdCB1bmlwaGllcl9jbGtfZ2F0ZV9kYXRhIGdhdGU7CisJCXN0cnVjdCB1bmlwaGllcl9jbGtfbXV4X2RhdGEgbXV4OworCX0gZGF0YTsKK307CisKKyNkZWZpbmUgVU5JUEhJRVJfQ0xLX0ZBQ1RPUihfbmFtZSwgX2lkeCwgX3BhcmVudCwgX211bHQsIF9kaXYpCVwKKwl7CQkJCQkJCVwKKwkJLm5hbWUgPSAoX25hbWUpLAkJCQlcCisJCS50eXBlID0gVU5JUEhJRVJfQ0xLX1RZUEVfRklYRURfRkFDVE9SLAkJXAorCQkuaWR4ID0gKF9pZHgpLAkJCQkJXAorCQkuZGF0YS5mYWN0b3IgPSB7CQkJCVwKKwkJCS5wYXJlbnRfbmFtZSA9IChfcGFyZW50KSwJCVwKKwkJCS5tdWx0ID0gKF9tdWx0KSwJCQlcCisJCQkuZGl2ID0gKF9kaXYpLAkJCQlcCisJCX0sCQkJCQkJXAorCX0KKworCisjZGVmaW5lIFVOSVBISUVSX0NMS19HQVRFKF9uYW1lLCBfaWR4LCBfcGFyZW50LCBfcmVnLCBfYml0KQlcCisJewkJCQkJCQlcCisJCS5uYW1lID0gKF9uYW1lKSwJCQkJXAorCQkudHlwZSA9IFVOSVBISUVSX0NMS19UWVBFX0dBVEUsCQkJXAorCQkuaWR4ID0gKF9pZHgpLAkJCQkJXAorCQkuZGF0YS5nYXRlID0gewkJCQkJXAorCQkJLnBhcmVudF9uYW1lID0gKF9wYXJlbnQpLAkJXAorCQkJLnJlZyA9IChfcmVnKSwJCQkJXAorCQkJLmJpdCA9IChfYml0KSwJCQkJXAorCQl9LAkJCQkJCVwKKwl9CisKKworc3RydWN0IGNsa19odyAqdW5pcGhpZXJfY2xrX3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQljb25zdCBzdHJ1Y3QgdW5pcGhpZXJfY2xrX2ZpeGVkX2ZhY3Rvcl9kYXRhICpkYXRhKTsKK3N0cnVjdCBjbGtfaHcgKnVuaXBoaWVyX2Nsa19yZWdpc3Rlcl9maXhlZF9yYXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJCWNvbnN0IGNoYXIgKm5hbWUsCisJCQljb25zdCBzdHJ1Y3QgdW5pcGhpZXJfY2xrX2ZpeGVkX3JhdGVfZGF0YSAqZGF0YSk7CitzdHJ1Y3QgY2xrX2h3ICp1bmlwaGllcl9jbGtfcmVnaXN0ZXJfZ2F0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgc3RydWN0IHJlZ21hcCAqcmVnbWFwLAorCQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJY29uc3Qgc3RydWN0IHVuaXBoaWVyX2Nsa19nYXRlX2RhdGEgKmRhdGEpOworc3RydWN0IGNsa19odyAqdW5pcGhpZXJfY2xrX3JlZ2lzdGVyX211eChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsCisJCQkJCSBjb25zdCBjaGFyICpuYW1lLAorCQkJCWNvbnN0IHN0cnVjdCB1bmlwaGllcl9jbGtfbXV4X2RhdGEgKmRhdGEpOworCitleHRlcm4gY29uc3Qgc3RydWN0IHVuaXBoaWVyX2Nsa19kYXRhIHVuaXBoaWVyX3NsZDNfc3lzX2Nsa19kYXRhW107CitleHRlcm4gY29uc3Qgc3RydWN0IHVuaXBoaWVyX2Nsa19kYXRhIHVuaXBoaWVyX2xkNF9zeXNfY2xrX2RhdGFbXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdW5pcGhpZXJfY2xrX2RhdGEgdW5pcGhpZXJfcHJvNF9zeXNfY2xrX2RhdGFbXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdW5pcGhpZXJfY2xrX2RhdGEgdW5pcGhpZXJfc2xkOF9zeXNfY2xrX2RhdGFbXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdW5pcGhpZXJfY2xrX2RhdGEgdW5pcGhpZXJfcHJvNV9zeXNfY2xrX2RhdGFbXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdW5pcGhpZXJfY2xrX2RhdGEgdW5pcGhpZXJfcHhzMl9zeXNfY2xrX2RhdGFbXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdW5pcGhpZXJfY2xrX2RhdGEgdW5pcGhpZXJfbGQxMV9zeXNfY2xrX2RhdGFbXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdW5pcGhpZXJfY2xrX2RhdGEgdW5pcGhpZXJfbGQyMF9zeXNfY2xrX2RhdGFbXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdW5pcGhpZXJfY2xrX2RhdGEgdW5pcGhpZXJfc2xkM19taW9fY2xrX2RhdGFbXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdW5pcGhpZXJfY2xrX2RhdGEgdW5pcGhpZXJfcHJvNV9taW9fY2xrX2RhdGFbXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdW5pcGhpZXJfY2xrX2RhdGEgdW5pcGhpZXJfbGQ0X3BlcmlfY2xrX2RhdGFbXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdW5pcGhpZXJfY2xrX2RhdGEgdW5pcGhpZXJfcHJvNF9wZXJpX2Nsa19kYXRhW107CisKKyNlbmRpZiAvKiBfX0NMS19VTklQSElFUl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3ZlcnNhdGlsZS9jbGstaWNzdC5jIGIvZHJpdmVycy9jbGsvdmVyc2F0aWxlL2Nsay1pY3N0LmMKaW5kZXggNWU5YjY1Mi4uNGZhYTk0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvdmVyc2F0aWxlL2Nsay1pY3N0LmMKKysrIGIvZHJpdmVycy9jbGsvdmVyc2F0aWxlL2Nsay1pY3N0LmMKQEAgLTI3LDYgKzI3LDI2IEBACiAvKiBNYWdpYyB1bmxvY2tpbmcgdG9rZW4gdXNlZCBvbiBhbGwgVmVyc2F0aWxlIGJvYXJkcyAqLwogI2RlZmluZSBWRVJTQVRJTEVfTE9DS19WQUwJMHhBMDVGCiAKKyNkZWZpbmUgVkVSU0FUSUxFX0FVWF9PU0NfQklUUyAweDdGRkZGCisjZGVmaW5lIElOVEVHUkFUT1JfQVBfQ01fQklUUyAweEZGCisjZGVmaW5lIElOVEVHUkFUT1JfQVBfU1lTX0JJVFMgMHhGRgorI2RlZmluZSBJTlRFR1JBVE9SX0NQX0NNX0NPUkVfQklUUyAweDdGRgorI2RlZmluZSBJTlRFR1JBVE9SX0NQX0NNX01FTV9CSVRTIDB4N0ZGMDAwCisKKyNkZWZpbmUgSU5URUdSQVRPUl9BUF9QQ0lfMjVfMzNfTUhaIEJJVCg4KQorCisvKioKKyAqIGVudW0gaWNzdF9jb250cm9sX3R5cGUgLSB0aGUgdHlwZSBvZiBJQ1NUIGNvbnRyb2wgcmVnaXN0ZXIKKyAqLworZW51bSBpY3N0X2NvbnRyb2xfdHlwZSB7CisJSUNTVF9WRVJTQVRJTEUsIC8qIFRoZSBzdGFuZGFyZCB0eXBlLCBhbGwgY29udHJvbCBiaXRzIGF2YWlsYWJsZSAqLworCUlDU1RfSU5URUdSQVRPUl9BUF9DTSwgLyogT25seSA4IGJpdHMgb2YgVkRXIGF2YWlsYWJsZSAqLworCUlDU1RfSU5URUdSQVRPUl9BUF9TWVMsIC8qIE9ubHkgOCBiaXRzIG9mIFZEVyBhdmFpbGFibGUgKi8KKwlJQ1NUX0lOVEVHUkFUT1JfQVBfUENJLCAvKiBPZGQgYml0IHBhdHRlcm4gc3RvcmFnZSAqLworCUlDU1RfSU5URUdSQVRPUl9DUF9DTV9DT1JFLCAvKiBPbmx5IDggYml0cyBvZiBWRFcgYW5kIDMgYml0cyBvZiBPRCAqLworCUlDU1RfSU5URUdSQVRPUl9DUF9DTV9NRU0sIC8qIE9ubHkgOCBiaXRzIG9mIFZEVyBhbmQgMyBiaXRzIG9mIE9EICovCit9OworCiAvKioKICAqIHN0cnVjdCBjbGtfaWNzdCAtIElDU1QgVkNPIGNsb2NrIHdyYXBwZXIKICAqIEBodzogY29ycmVzcG9uZGluZyBjbG9jayBoYXJkd2FyZSBlbnRyeQpAQCAtMzQsNiArNTQsNyBAQAogICogQGxvY2tyZWc6IFZDTyBsb2NrIHJlZ2lzdGVyIGFkZHJlc3MKICAqIEBwYXJhbXM6IHBhcmFtZXRlcnMgZm9yIHRoaXMgSUNTVCBpbnN0YW5jZQogICogQHJhdGU6IGN1cnJlbnQgcmF0ZQorICogQGN0eXBlOiB0aGUgdHlwZSBvZiBjb250cm9sIHJlZ2lzdGVyIGZvciB0aGUgSUNTVAogICovCiBzdHJ1Y3QgY2xrX2ljc3QgewogCXN0cnVjdCBjbGtfaHcgaHc7CkBAIC00Miw2ICs2Myw3IEBACiAJdTMyIGxvY2tyZWdfb2ZmOwogCXN0cnVjdCBpY3N0X3BhcmFtcyAqcGFyYW1zOwogCXVuc2lnbmVkIGxvbmcgcmF0ZTsKKwllbnVtIGljc3RfY29udHJvbF90eXBlIGN0eXBlOwogfTsKIAogI2RlZmluZSB0b19pY3N0KF9odykgY29udGFpbmVyX29mKF9odywgc3RydWN0IGNsa19pY3N0LCBodykKQEAgLTU5LDYgKzgxLDc2IEBACiAJcmV0ID0gcmVnbWFwX3JlYWQoaWNzdC0+bWFwLCBpY3N0LT52Y29yZWdfb2ZmLCAmdmFsKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBUaGUgSW50ZWdyYXRvci9BUCBjb3JlIGNsb2NrIGNhbiBvbmx5IGFjY2VzcyB0aGUgbG93IGVpZ2h0CisJICogYml0cyBvZiB0aGUgdiBQTEwgZGl2aWRlci4gQml0IDggaXMgdGllZCBsb3cgYW5kIGFsd2F5cyB6ZXJvLAorCSAqIHIgaXMgaGFyZHdpcmVkIHRvIDIyIGFuZCBvdXRwdXQgZGl2aWRlciBzIGlzIGhhcmR3aXJlZCB0byAxCisJICogKGRpdmlkZSBieSAyKSBhY2NvcmRpbmcgdG8gdGhlIGRvY3VtZW50CisJICogIkludGVncmF0b3IgQ005MjZFSi1TLCBDTTk0NkUtUywgQ005NjZFLVMsIENNMTAyNkVKLVMgYW5kCisJICogQ00xMTM2SkYtUyBVc2VyIEd1aWRlIiBBUk0gRFVJIDAxMzhFLCBwYWdlIDMtMTMgdGhydSAzLTE0LgorCSAqLworCWlmIChpY3N0LT5jdHlwZSA9PSBJQ1NUX0lOVEVHUkFUT1JfQVBfQ00pIHsKKwkJdmNvLT52ID0gdmFsICYgSU5URUdSQVRPUl9BUF9DTV9CSVRTOworCQl2Y28tPnIgPSAyMjsKKwkJdmNvLT5zID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBUaGUgSW50ZWdyYXRvci9BUCBzeXN0ZW0gY2xvY2sgb24gdGhlIGJhc2UgYm9hcmQgY2FuIG9ubHkKKwkgKiBhY2Nlc3MgdGhlIGxvdyBlaWdodCBiaXRzIG9mIHRoZSB2IFBMTCBkaXZpZGVyLiBCaXQgOCBpcyB0aWVkIGxvdworCSAqIGFuZCBhbHdheXMgemVybywgciBpcyBoYXJkd2lyZWQgdG8gNDYsIGFuZCB0aGUgb3V0cHV0IGRpdmlkZXIgaXMKKwkgKiBoYXJkd2lyZWQgdG8gMyAoZGl2aWRlIGJ5IDQpIGFjY29yZGluZyB0byB0aGUgZG9jdW1lbnQKKwkgKiAiSW50ZWdyYXRvciBBUCBBU0lDIERldmVsb3BtZW50IE1vdGhlcmJvYXJkIiBBUk0gRFVJIDAwOThCLAorCSAqIHBhZ2UgMy0xNi4KKwkgKi8KKwlpZiAoaWNzdC0+Y3R5cGUgPT0gSUNTVF9JTlRFR1JBVE9SX0FQX1NZUykgeworCQl2Y28tPnYgPSB2YWwgJiBJTlRFR1JBVE9SX0FQX1NZU19CSVRTOworCQl2Y28tPnIgPSA0NjsKKwkJdmNvLT5zID0gMzsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBUaGUgSW50ZWdyYXRvci9BUCBQQ0kgY2xvY2sgaXMgdXNpbmcgYW4gb2RkIHBhdHRlcm4gdG8gY3JlYXRlCisJICogdGhlIGNoaWxkIGNsb2NrLCBiYXNpY2FsbHkgYSBzaW5nbGUgYml0IGNhbGxlZCBESVZYL1kgaXMgdXNlZAorCSAqIHRvIHNlbGVjdCBiZXR3ZWVuIHR3byBkaWZmZXJlbnQgaGFyZHdpcmVkIHZhbHVlczogc2V0dGluZyB0aGUKKwkgKiBiaXQgdG8gMCB5aWVsZHMgdiA9IDE3LCByID0gMjIgYW5kIE9EID0gMSwgd2hlcmVhcyBzZXR0aW5nIHRoZQorCSAqIGJpdCB0byAxIHlpZWxkcyB2ID0gMTQsIHIgPSAxNCBhbmQgT0QgPSAxIGdpdmluZyB0aGUgZnJlcXVlbmNpZXMKKwkgKiAzMyBvciAyNSBNSHogcmVzcGVjdGl2ZWx5LgorCSAqLworCWlmIChpY3N0LT5jdHlwZSA9PSBJQ1NUX0lOVEVHUkFUT1JfQVBfUENJKSB7CisJCWJvb2wgZGl2eHkgPSAhISh2YWwgJiBJTlRFR1JBVE9SX0FQX1BDSV8yNV8zM19NSFopOworCisJCXZjby0+diA9IGRpdnh5ID8gMTcgOiAxNDsKKwkJdmNvLT5yID0gZGl2eHkgPyAyMiA6IDE0OworCQl2Y28tPnMgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFRoZSBJbnRlZ3JhdG9yL0NQIGNvcmUgY2xvY2sgY2FuIGFjY2VzcyB0aGUgbG93IGVpZ2h0IGJpdHMKKwkgKiBvZiB0aGUgdiBQTEwgZGl2aWRlci4gQml0IDggaXMgdGllZCBsb3cgYW5kIGFsd2F5cyB6ZXJvLAorCSAqIHIgaXMgaGFyZHdpcmVkIHRvIDIyIGFuZCB0aGUgb3V0cHV0IGRpdmlkZXIgcyBpcyBhY2Nlc3NpYmxlCisJICogaW4gYml0cyA4IHRocnUgMTAgYWNjb3JkaW5nIHRvIHRoZSBkb2N1bWVudAorCSAqICJJbnRlZ3JhdG9yL0NNOTQwVCwgQ005MjBULCBDTTc0MFQsIGFuZCBDTTcyMFQgVXNlciBHdWlkZSIKKwkgKiBBUk0gRFVJIDAxNTdBLCBwYWdlIDMtMjAgdGhydSAzLTIzIGFuZCA0LTEwLgorCSAqLworCWlmIChpY3N0LT5jdHlwZSA9PSBJQ1NUX0lOVEVHUkFUT1JfQ1BfQ01fQ09SRSkgeworCQl2Y28tPnYgPSB2YWwgJiAweEZGOworCQl2Y28tPnIgPSAyMjsKKwkJdmNvLT5zID0gKHZhbCA+PiA4KSAmIDc7CisJCXJldHVybiAwOworCX0KKworCWlmIChpY3N0LT5jdHlwZSA9PSBJQ1NUX0lOVEVHUkFUT1JfQ1BfQ01fTUVNKSB7CisJCXZjby0+diA9ICh2YWwgPj4gMTIpICYgMHhGRjsKKwkJdmNvLT5yID0gMjI7CisJCXZjby0+cyA9ICh2YWwgPj4gMjApICYgNzsKKwkJcmV0dXJuIDA7CisJfQorCiAJdmNvLT52ID0gdmFsICYgMHgxZmY7CiAJdmNvLT5yID0gKHZhbCA+PiA5KSAmIDB4N2Y7CiAJdmNvLT5zID0gKHZhbCA+PiAxNikgJiAwMzsKQEAgLTcyLDIyICsxNjQsNjIgQEAKICAqLwogc3RhdGljIGludCB2Y29fc2V0KHN0cnVjdCBjbGtfaWNzdCAqaWNzdCwgc3RydWN0IGljc3RfdmNvIHZjbykKIHsKKwl1MzIgbWFzazsKIAl1MzIgdmFsOwogCWludCByZXQ7CiAKLQlyZXQgPSByZWdtYXBfcmVhZChpY3N0LT5tYXAsIGljc3QtPnZjb3JlZ19vZmYsICZ2YWwpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJLyogTWFzayB0aGUgYml0cyB1c2VkIGJ5IHRoZSBWQ08gKi8KKwlzd2l0Y2ggKGljc3QtPmN0eXBlKSB7CisJY2FzZSBJQ1NUX0lOVEVHUkFUT1JfQVBfQ006CisJCW1hc2sgPSBJTlRFR1JBVE9SX0FQX0NNX0JJVFM7CisJCXZhbCA9IHZjby52ICYgMHhGRjsKKwkJaWYgKHZjby52ICYgMHgxMDApCisJCQlwcl9lcnIoIklDU1QgZXJyb3I6IHRyaWVkIHRvIHNldCBiaXQgOCBvZiBWRFdcbiIpOworCQlpZiAodmNvLnMgIT0gMSkKKwkJCXByX2VycigiSUNTVCBlcnJvcjogdHJpZWQgdG8gdXNlIFZPRCAhPSAxXG4iKTsKKwkJaWYgKHZjby5yICE9IDIyKQorCQkJcHJfZXJyKCJJQ1NUIGVycm9yOiB0cmllZCB0byB1c2UgUkRXICE9IDIyXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBJQ1NUX0lOVEVHUkFUT1JfQVBfU1lTOgorCQltYXNrID0gSU5URUdSQVRPUl9BUF9TWVNfQklUUzsKKwkJdmFsID0gdmNvLnYgJiAweEZGOworCQlpZiAodmNvLnYgJiAweDEwMCkKKwkJCXByX2VycigiSUNTVCBlcnJvcjogdHJpZWQgdG8gc2V0IGJpdCA4IG9mIFZEV1xuIik7CisJCWlmICh2Y28ucyAhPSAzKQorCQkJcHJfZXJyKCJJQ1NUIGVycm9yOiB0cmllZCB0byB1c2UgVk9EICE9IDFcbiIpOworCQlpZiAodmNvLnIgIT0gNDYpCisJCQlwcl9lcnIoIklDU1QgZXJyb3I6IHRyaWVkIHRvIHVzZSBSRFcgIT0gMjJcbiIpOworCQlicmVhazsKKwljYXNlIElDU1RfSU5URUdSQVRPUl9DUF9DTV9DT1JFOgorCQltYXNrID0gSU5URUdSQVRPUl9DUF9DTV9DT1JFX0JJVFM7IC8qIFVzZXMgMTIgYml0cyAqLworCQl2YWwgPSAodmNvLnYgJiAweEZGKSB8IHZjby5zIDw8IDg7CisJCWlmICh2Y28udiAmIDB4MTAwKQorCQkJcHJfZXJyKCJJQ1NUIGVycm9yOiB0cmllZCB0byBzZXQgYml0IDggb2YgVkRXXG4iKTsKKwkJaWYgKHZjby5yICE9IDIyKQorCQkJcHJfZXJyKCJJQ1NUIGVycm9yOiB0cmllZCB0byB1c2UgUkRXICE9IDIyXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBJQ1NUX0lOVEVHUkFUT1JfQ1BfQ01fTUVNOgorCQltYXNrID0gSU5URUdSQVRPUl9DUF9DTV9NRU1fQklUUzsgLyogVXNlcyAxMiBiaXRzICovCisJCXZhbCA9ICgodmNvLnYgJiAweEZGKSA8PCAxMikgfCAodmNvLnMgPDwgMjApOworCQlpZiAodmNvLnYgJiAweDEwMCkKKwkJCXByX2VycigiSUNTVCBlcnJvcjogdHJpZWQgdG8gc2V0IGJpdCA4IG9mIFZEV1xuIik7CisJCWlmICh2Y28uciAhPSAyMikKKwkJCXByX2VycigiSUNTVCBlcnJvcjogdHJpZWQgdG8gdXNlIFJEVyAhPSAyMlxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIFJlZ3VsYXIgYXV4aWxhcnkgb3NjaWxsYXRvciAqLworCQltYXNrID0gVkVSU0FUSUxFX0FVWF9PU0NfQklUUzsKKwkJdmFsID0gdmNvLnYgfCAodmNvLnIgPDwgOSkgfCAodmNvLnMgPDwgMTYpOworCQlicmVhazsKKwl9CiAKLQkvKiBNYXNrIHRoZSAxOCBiaXRzIHVzZWQgYnkgdGhlIFZDTyAqLwotCXZhbCAmPSB+MHg3ZmZmZjsKLQl2YWwgfD0gdmNvLnYgfCAodmNvLnIgPDwgOSkgfCAodmNvLnMgPDwgMTYpOworCXByX2RlYnVnKCJJQ1NUOiBuZXcgdmFsID0gMHglMDh4XG4iLCB2YWwpOwogCiAJLyogVGhpcyBtYWdpYyB1bmxvY2tzIHRoZSBWQ08gc28gaXQgY2FuIGJlIGNvbnRyb2xsZWQgKi8KIAlyZXQgPSByZWdtYXBfd3JpdGUoaWNzdC0+bWFwLCBpY3N0LT5sb2NrcmVnX29mZiwgVkVSU0FUSUxFX0xPQ0tfVkFMKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwotCXJldCA9IHJlZ21hcF93cml0ZShpY3N0LT5tYXAsIGljc3QtPnZjb3JlZ19vZmYsIHZhbCk7CisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGljc3QtPm1hcCwgaWNzdC0+dmNvcmVnX29mZiwgbWFzaywgdmFsKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCS8qIFRoaXMgbG9ja3MgdGhlIFZDTyBhZ2FpbiAqLwpAQCAtMTIxLDYgKzI1Myw0NiBAQAogCXN0cnVjdCBjbGtfaWNzdCAqaWNzdCA9IHRvX2ljc3QoaHcpOwogCXN0cnVjdCBpY3N0X3ZjbyB2Y287CiAKKwlpZiAoaWNzdC0+Y3R5cGUgPT0gSUNTVF9JTlRFR1JBVE9SX0FQX0NNIHx8CisJICAgIGljc3QtPmN0eXBlID09IElDU1RfSU5URUdSQVRPUl9DUF9DTV9DT1JFKSB7CisJCWlmIChyYXRlIDw9IDEyMDAwMDAwKQorCQkJcmV0dXJuIDEyMDAwMDAwOworCQlpZiAocmF0ZSA+PSAxNjAwMDAwMDApCisJCQlyZXR1cm4gMTYwMDAwMDAwOworCQkvKiBTbGFtIHRvIGNsb3Nlc3QgbWVnYWhlcnR6ICovCisJCXJldHVybiBESVZfUk9VTkRfQ0xPU0VTVChyYXRlLCAxMDAwMDAwKSAqIDEwMDAwMDA7CisJfQorCisJaWYgKGljc3QtPmN0eXBlID09IElDU1RfSU5URUdSQVRPUl9DUF9DTV9NRU0pIHsKKwkJaWYgKHJhdGUgPD0gNjAwMDAwMCkKKwkJCXJldHVybiA2MDAwMDAwOworCQlpZiAocmF0ZSA+PSA2NjAwMDAwMCkKKwkJCXJldHVybiA2NjAwMDAwMDsKKwkJLyogU2xhbSB0byBjbG9zZXN0IDAuNSBtZWdhaGVydHogKi8KKwkJcmV0dXJuIERJVl9ST1VORF9DTE9TRVNUKHJhdGUsIDUwMDAwMCkgKiA1MDAwMDA7CisJfQorCisJaWYgKGljc3QtPmN0eXBlID09IElDU1RfSU5URUdSQVRPUl9BUF9TWVMpIHsKKwkJLyogRGl2aWRlcyBiZXR3ZWVuIDMgYW5kIDUwIE1IeiBpbiBzdGVwcyBvZiAwLjI1IE1IeiAqLworCQlpZiAocmF0ZSA8PSAzMDAwMDAwKQorCQkJcmV0dXJuIDMwMDAwMDA7CisJCWlmIChyYXRlID49IDUwMDAwMDAwKQorCQkJcmV0dXJuIDUwMDAwMDA7CisJCS8qIFNsYW0gdG8gY2xvc2VzdCAwLjI1IE1IeiAqLworCQlyZXR1cm4gRElWX1JPVU5EX0NMT1NFU1QocmF0ZSwgMjUwMDAwKSAqIDI1MDAwMDsKKwl9CisKKwlpZiAoaWNzdC0+Y3R5cGUgPT0gSUNTVF9JTlRFR1JBVE9SX0FQX1BDSSkgeworCQkvKgorCQkgKiBJZiB3ZSdyZSBiZWxvdyBvciBsZXNzIHRoYW4gaGFsZndheSBmcm9tIDI1IHRvIDMzIE1IegorCQkgKiBzZWxlY3QgMjUgTUh6CisJCSAqLworCQlpZiAocmF0ZSA8PSAyNTAwMDAwMCB8fCByYXRlIDwgMjkwMDAwMDApCisJCQlyZXR1cm4gMjUwMDAwMDA7CisJCS8qIEVsc2UganVzdCByZXR1cm4gdGhlIGRlZmF1bHQgZnJlcXVlbmN5ICovCisJCXJldHVybiAzMzAwMDAwMDsKKwl9CisKIAl2Y28gPSBpY3N0X2h6X3RvX3ZjbyhpY3N0LT5wYXJhbXMsIHJhdGUpOwogCXJldHVybiBpY3N0X2h6KGljc3QtPnBhcmFtcywgdmNvKTsKIH0KQEAgLTEzMSw2ICszMDMsMzYgQEAKIAlzdHJ1Y3QgY2xrX2ljc3QgKmljc3QgPSB0b19pY3N0KGh3KTsKIAlzdHJ1Y3QgaWNzdF92Y28gdmNvOwogCisJaWYgKGljc3QtPmN0eXBlID09IElDU1RfSU5URUdSQVRPUl9BUF9QQ0kpIHsKKwkJLyogVGhpcyBjbG9jayBpcyBlc3BlY2lhbGx5IHByaW1pdGl2ZSAqLworCQl1bnNpZ25lZCBpbnQgdmFsOworCQlpbnQgcmV0OworCisJCWlmIChyYXRlID09IDI1MDAwMDAwKSB7CisJCQl2YWwgPSAwOworCQl9IGVsc2UgaWYgKHJhdGUgPT0gMzMwMDAwMDApIHsKKwkJCXZhbCA9IElOVEVHUkFUT1JfQVBfUENJXzI1XzMzX01IWjsKKwkJfSBlbHNlIHsKKwkJCXByX2VycigiSUNTVDogY2Fubm90IHNldCBQQ0kgZnJlcXVlbmN5ICVsdVxuIiwKKwkJCSAgICAgICByYXRlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJldCA9IHJlZ21hcF93cml0ZShpY3N0LT5tYXAsIGljc3QtPmxvY2tyZWdfb2ZmLAorCQkJCSAgIFZFUlNBVElMRV9MT0NLX1ZBTCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoaWNzdC0+bWFwLCBpY3N0LT52Y29yZWdfb2ZmLAorCQkJCQkgSU5URUdSQVRPUl9BUF9QQ0lfMjVfMzNfTUhaLAorCQkJCQkgdmFsKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCS8qIFRoaXMgbG9ja3MgdGhlIFZDTyBhZ2FpbiAqLworCQlyZXQgPSByZWdtYXBfd3JpdGUoaWNzdC0+bWFwLCBpY3N0LT5sb2NrcmVnX29mZiwgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlyZXR1cm4gMDsKKwl9CisKIAlpZiAocGFyZW50X3JhdGUpCiAJCWljc3QtPnBhcmFtcy0+cmVmID0gcGFyZW50X3JhdGU7CiAJdmNvID0gaWNzdF9oel90b192Y28oaWNzdC0+cGFyYW1zLCByYXRlKTsKQEAgLTE0OCw3ICszNTAsOCBAQAogCQkJCSAgY29uc3Qgc3RydWN0IGNsa19pY3N0X2Rlc2MgKmRlc2MsCiAJCQkJICBjb25zdCBjaGFyICpuYW1lLAogCQkJCSAgY29uc3QgY2hhciAqcGFyZW50X25hbWUsCi0JCQkJICBzdHJ1Y3QgcmVnbWFwICptYXApCisJCQkJICBzdHJ1Y3QgcmVnbWFwICptYXAsCisJCQkJICBlbnVtIGljc3RfY29udHJvbF90eXBlIGN0eXBlKQogewogCXN0cnVjdCBjbGsgKmNsazsKIAlzdHJ1Y3QgY2xrX2ljc3QgKmljc3Q7CkBAIC0xNzgsNiArMzgxLDcgQEAKIAlpY3N0LT5wYXJhbXMgPSBwY2xvbmU7CiAJaWNzdC0+dmNvcmVnX29mZiA9IGRlc2MtPnZjb19vZmZzZXQ7CiAJaWNzdC0+bG9ja3JlZ19vZmYgPSBkZXNjLT5sb2NrX29mZnNldDsKKwlpY3N0LT5jdHlwZSA9IGN0eXBlOwogCiAJY2xrID0gY2xrX3JlZ2lzdGVyKGRldiwgJmljc3QtPmh3KTsKIAlpZiAoSVNfRVJSKGNsaykpIHsKQEAgLTIwNiw3ICs0MTAsOCBAQAogCQlwcl9lcnIoImNvdWxkIG5vdCBpbml0aWFsaXplIElDU1QgcmVnbWFwXG4iKTsKIAkJcmV0dXJuIEVSUl9DQVNUKG1hcCk7CiAJfQotCXJldHVybiBpY3N0X2Nsa19zZXR1cChkZXYsIGRlc2MsIG5hbWUsIHBhcmVudF9uYW1lLCBtYXApOworCXJldHVybiBpY3N0X2Nsa19zZXR1cChkZXYsIGRlc2MsIG5hbWUsIHBhcmVudF9uYW1lLCBtYXAsCisJCQkgICAgICBJQ1NUX1ZFUlNBVElMRSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpY3N0X2Nsa19yZWdpc3Rlcik7CiAKQEAgLTIzOSw2ICs0NDQsNTYgQEAKIAkuaWR4MnMJCT0gaWNzdDMwN19pZHgycywKIH07CiAKKy8qKgorICogVGhlIGNvcmUgbW9kdWxlcyBvbiB0aGUgSW50ZWdyYXRvci9BUCBhbmQgSW50ZWdyYXRvci9DUCBoYXZlCisgKiBlc3BlY2lhbGx5IGNyaXBwbGVkIElDU1Q1MjUgY29udHJvbC4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpY3N0X3BhcmFtcyBpY3N0NTI1X2FwY3BfY21fcGFyYW1zID0geworCS52Y29fbWF4CT0gSUNTVDUyNV9WQ09fTUFYXzVWLAorCS52Y29fbWluCT0gSUNTVDUyNV9WQ09fTUlOLAorCS8qIE1pbmltdW0gMTIgTUh6LCBWRFcgPSA0ICovCisJLnZkX21pbgkJPSAxMiwKKwkvKgorCSAqIE1heGltdW0gMTYwIE1IeiwgVkRXID0gMTUyIGZvciBhbGwgY29yZSBtb2R1bGVzLCBidXQKKwkgKiBDTTkyNkVKLVMsIENNMTAyNkVKLVMgYW5kIENNMTEzNkpGLVMgY2FuIGFjdHVhbGx5CisJICogZ28gdG8gMjAwIE1IeiAobWF4IFZEVyA9IDE5MikuCisJICovCisJLnZkX21heAkJPSAxOTIsCisJLyogciBpcyBoYXJkY29kZWQgdG8gMjIgYW5kIHRoaXMgaXMgdGhlIGFjdHVhbCBkaXZpc29yLCArMiAqLworCS5yZF9taW4JCT0gMjQsCisJLnJkX21heAkJPSAyNCwKKwkuczJkaXYJCT0gaWNzdDUyNV9zMmRpdiwKKwkuaWR4MnMJCT0gaWNzdDUyNV9pZHgycywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWNzdF9wYXJhbXMgaWNzdDUyNV9hcF9zeXNfcGFyYW1zID0geworCS52Y29fbWF4CT0gSUNTVDUyNV9WQ09fTUFYXzVWLAorCS52Y29fbWluCT0gSUNTVDUyNV9WQ09fTUlOLAorCS8qIE1pbmltdW0gMyBNSHosIFZEVyA9IDQgKi8KKwkudmRfbWluCQk9IDMsCisJLyogTWF4aW11bSA1MCBNSHosIFZEVyA9IDE5MiAqLworCS52ZF9tYXgJCT0gNTAsCisJLyogciBpcyBoYXJkY29kZWQgdG8gNDYgYW5kIHRoaXMgaXMgdGhlIGFjdHVhbCBkaXZpc29yLCArMiAqLworCS5yZF9taW4JCT0gNDgsCisJLnJkX21heAkJPSA0OCwKKwkuczJkaXYJCT0gaWNzdDUyNV9zMmRpdiwKKwkuaWR4MnMJCT0gaWNzdDUyNV9pZHgycywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWNzdF9wYXJhbXMgaWNzdDUyNV9hcF9wY2lfcGFyYW1zID0geworCS52Y29fbWF4CT0gSUNTVDUyNV9WQ09fTUFYXzVWLAorCS52Y29fbWluCT0gSUNTVDUyNV9WQ09fTUlOLAorCS8qIE1pbmltdW0gMjUgTUh6ICovCisJLnZkX21pbgkJPSAyNSwKKwkvKiBNYXhpbXVtIDMzIE1IeiAqLworCS52ZF9tYXgJCT0gMzMsCisJLyogciBpcyBoYXJkY29kZWQgdG8gMTQgb3IgMjIgYW5kIHRoaXMgaXMgdGhlIGFjdHVhbCBkaXZpc29ycyArMiAqLworCS5yZF9taW4JCT0gMTYsCisJLnJkX21heAkJPSAyNCwKKwkuczJkaXYJCT0gaWNzdDUyNV9zMmRpdiwKKwkuaWR4MnMJCT0gaWNzdDUyNV9pZHgycywKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBvZl9zeXNjb25faWNzdF9zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50OwpAQCAtMjQ3LDYgKzUwMiw3IEBACiAJY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOwogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lOwogCXN0cnVjdCBjbGsgKnJlZ2NsazsKKwllbnVtIGljc3RfY29udHJvbF90eXBlIGN0eXBlOwogCiAJLyogV2UgZG8gbm90IHJlbGVhc2UgdGhpcyByZWZlcmVuY2UsIHdlIGFyZSB1c2luZyBpdCBwZXJwZXR1YWxseSAqLwogCXBhcmVudCA9IG9mX2dldF9wYXJlbnQobnApOwpAQCAtMjY5LDExICs1MjUsMjggQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImFybSxzeXNjb24taWNzdDUyNSIpKQorCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImFybSxzeXNjb24taWNzdDUyNSIpKSB7CiAJCWljc3RfZGVzYy5wYXJhbXMgPSAmaWNzdDUyNV9wYXJhbXM7Ci0JZWxzZSBpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJhcm0sc3lzY29uLWljc3QzMDciKSkKKwkJY3R5cGUgPSBJQ1NUX1ZFUlNBVElMRTsKKwl9IGVsc2UgaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiYXJtLHN5c2Nvbi1pY3N0MzA3IikpIHsKIAkJaWNzdF9kZXNjLnBhcmFtcyA9ICZpY3N0MzA3X3BhcmFtczsKLQllbHNlIHsKKwkJY3R5cGUgPSBJQ1NUX1ZFUlNBVElMRTsKKwl9IGVsc2UgaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiYXJtLHN5c2Nvbi1pY3N0NTI1LWludGVncmF0b3JhcC1jbSIpKSB7CisJCWljc3RfZGVzYy5wYXJhbXMgPSAmaWNzdDUyNV9hcGNwX2NtX3BhcmFtczsKKwkJY3R5cGUgPSBJQ1NUX0lOVEVHUkFUT1JfQVBfQ007CisJfSBlbHNlIGlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImFybSxzeXNjb24taWNzdDUyNS1pbnRlZ3JhdG9yYXAtc3lzIikpIHsKKwkJaWNzdF9kZXNjLnBhcmFtcyA9ICZpY3N0NTI1X2FwX3N5c19wYXJhbXM7CisJCWN0eXBlID0gSUNTVF9JTlRFR1JBVE9SX0FQX1NZUzsKKwl9IGVsc2UgaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiYXJtLHN5c2Nvbi1pY3N0NTI1LWludGVncmF0b3JhcC1wY2kiKSkgeworCQlpY3N0X2Rlc2MucGFyYW1zID0gJmljc3Q1MjVfYXBfcGNpX3BhcmFtczsKKwkJY3R5cGUgPSBJQ1NUX0lOVEVHUkFUT1JfQVBfUENJOworCX0gZWxzZSBpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJhcm0sc3lzY29uLWljc3Q1MjUtaW50ZWdyYXRvcmNwLWNtLWNvcmUiKSkgeworCQlpY3N0X2Rlc2MucGFyYW1zID0gJmljc3Q1MjVfYXBjcF9jbV9wYXJhbXM7CisJCWN0eXBlID0gSUNTVF9JTlRFR1JBVE9SX0NQX0NNX0NPUkU7CisJfSBlbHNlIGlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImFybSxzeXNjb24taWNzdDUyNS1pbnRlZ3JhdG9yY3AtY20tbWVtIikpIHsKKwkJaWNzdF9kZXNjLnBhcmFtcyA9ICZpY3N0NTI1X2FwY3BfY21fcGFyYW1zOworCQljdHlwZSA9IElDU1RfSU5URUdSQVRPUl9DUF9DTV9NRU07CisJfSBlbHNlIHsKIAkJcHJfZXJyKCJ1bmtub3duIElDU1QgY2xvY2sgJXNcbiIsIG5hbWUpOwogCQlyZXR1cm47CiAJfQpAQCAtMjgxLDcgKzU1NCw3IEBACiAJLyogUGFyZW50IGNsb2NrIG5hbWUgaXMgbm90IHRoZSBzYW1lIGFzIG5vZGUgcGFyZW50ICovCiAJcGFyZW50X25hbWUgPSBvZl9jbGtfZ2V0X3BhcmVudF9uYW1lKG5wLCAwKTsKIAotCXJlZ2NsayA9IGljc3RfY2xrX3NldHVwKE5VTEwsICZpY3N0X2Rlc2MsIG5hbWUsIHBhcmVudF9uYW1lLCBtYXApOworCXJlZ2NsayA9IGljc3RfY2xrX3NldHVwKE5VTEwsICZpY3N0X2Rlc2MsIG5hbWUsIHBhcmVudF9uYW1lLCBtYXAsIGN0eXBlKTsKIAlpZiAoSVNfRVJSKHJlZ2NsaykpIHsKIAkJcHJfZXJyKCJlcnJvciBzZXR0aW5nIHVwIHN5c2NvbiBJQ1NUIGNsb2NrICVzXG4iLCBuYW1lKTsKIAkJcmV0dXJuOwpAQCAtMjk0LDUgKzU2NywxNCBAQAogCSAgICAgICAiYXJtLHN5c2Nvbi1pY3N0NTI1Iiwgb2Zfc3lzY29uX2ljc3Rfc2V0dXApOwogQ0xLX09GX0RFQ0xBUkUoYXJtX3N5c2Nvbl9pY3N0MzA3X2NsaywKIAkgICAgICAgImFybSxzeXNjb24taWNzdDMwNyIsIG9mX3N5c2Nvbl9pY3N0X3NldHVwKTsKLQorQ0xLX09GX0RFQ0xBUkUoYXJtX3N5c2Nvbl9pbnRlZ3JhdG9yYXBfY21fY2xrLAorCSAgICAgICAiYXJtLHN5c2Nvbi1pY3N0NTI1LWludGVncmF0b3JhcC1jbSIsIG9mX3N5c2Nvbl9pY3N0X3NldHVwKTsKK0NMS19PRl9ERUNMQVJFKGFybV9zeXNjb25faW50ZWdyYXRvcmFwX3N5c19jbGssCisJICAgICAgICJhcm0sc3lzY29uLWljc3Q1MjUtaW50ZWdyYXRvcmFwLXN5cyIsIG9mX3N5c2Nvbl9pY3N0X3NldHVwKTsKK0NMS19PRl9ERUNMQVJFKGFybV9zeXNjb25faW50ZWdyYXRvcmFwX3BjaV9jbGssCisJICAgICAgICJhcm0sc3lzY29uLWljc3Q1MjUtaW50ZWdyYXRvcmFwLXBjaSIsIG9mX3N5c2Nvbl9pY3N0X3NldHVwKTsKK0NMS19PRl9ERUNMQVJFKGFybV9zeXNjb25faW50ZWdyYXRvcmNwX2NtX2NvcmVfY2xrLAorCSAgICAgICAiYXJtLHN5c2Nvbi1pY3N0NTI1LWludGVncmF0b3JjcC1jbS1jb3JlIiwgb2Zfc3lzY29uX2ljc3Rfc2V0dXApOworQ0xLX09GX0RFQ0xBUkUoYXJtX3N5c2Nvbl9pbnRlZ3JhdG9yY3BfY21fbWVtX2NsaywKKwkgICAgICAgImFybSxzeXNjb24taWNzdDUyNS1pbnRlZ3JhdG9yY3AtY20tbWVtIiwgb2Zfc3lzY29uX2ljc3Rfc2V0dXApOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay96dGUvTWFrZWZpbGUgYi9kcml2ZXJzL2Nsay96dGUvTWFrZWZpbGUKaW5kZXggNzQwMDVhYS4uODMzNzRiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvenRlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2xrL3p0ZS9NYWtlZmlsZQpAQCAtMSwyICsxLDMgQEAKIG9iai15IDo9IGNsay5vCiBvYmotJChDT05GSUdfU09DX1pYMjk2NzAyKSArPSBjbGstengyOTY3MDIubworb2JqLSQoQ09ORklHX0FSQ0hfWlgpICs9IGNsay16eDI5NjcxOC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay96dGUvY2xrLXp4Mjk2NzE4LmMgYi9kcml2ZXJzL2Nsay96dGUvY2xrLXp4Mjk2NzE4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA3ZDYyOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2xrL3p0ZS9jbGstengyOTY3MTguYwpAQCAtMCwwICsxLDkyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSAtIDIwMTYgWlRFIENvcnBvcmF0aW9uLgorICogQ29weXJpZ2h0IChDKSAyMDE2IExpbmFybyBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2Nsb2NrL3p4Mjk2NzE4LWNsb2NrLmg+CisjaW5jbHVkZSAiY2xrLmgiCisKKy8qIFRPUCBDUk0gKi8KKyNkZWZpbmUgVE9QX0NMS19NVVgwCTB4MDQKKyNkZWZpbmUgVE9QX0NMS19NVVgxCTB4MDgKKyNkZWZpbmUgVE9QX0NMS19NVVgyCTB4MGMKKyNkZWZpbmUgVE9QX0NMS19NVVgzCTB4MTAKKyNkZWZpbmUgVE9QX0NMS19NVVg0CTB4MTQKKyNkZWZpbmUgVE9QX0NMS19NVVg1CTB4MTgKKyNkZWZpbmUgVE9QX0NMS19NVVg2CTB4MWMKKyNkZWZpbmUgVE9QX0NMS19NVVg3CTB4MjAKKyNkZWZpbmUgVE9QX0NMS19NVVg5CTB4MjgKKworCisjZGVmaW5lIFRPUF9DTEtfR0FURTAJMHgzNAorI2RlZmluZSBUT1BfQ0xLX0dBVEUxCTB4MzgKKyNkZWZpbmUgVE9QX0NMS19HQVRFMgkweDNjCisjZGVmaW5lIFRPUF9DTEtfR0FURTMJMHg0MAorI2RlZmluZSBUT1BfQ0xLX0dBVEU0CTB4NDQKKyNkZWZpbmUgVE9QX0NMS19HQVRFNQkweDQ4CisjZGVmaW5lIFRPUF9DTEtfR0FURTYJMHg0YworCisjZGVmaW5lIFRPUF9DTEtfRElWMAkweDU4CisKKyNkZWZpbmUgUExMX0NQVV9SRUcJMHg4MAorI2RlZmluZSBQTExfVkdBX1JFRwkweGIwCisjZGVmaW5lIFBMTF9ERFJfUkVHCTB4YTAKKworLyogTFNQMCBDUk0gKi8KKyNkZWZpbmUgTFNQMF9USU1FUjNfQ0xLCTB4NAorI2RlZmluZSBMU1AwX1RJTUVSNF9DTEsJMHg4CisjZGVmaW5lIExTUDBfVElNRVI1X0NMSwkweGMKKyNkZWZpbmUgTFNQMF9VQVJUM19DTEsJMHgxMAorI2RlZmluZSBMU1AwX1VBUlQxX0NMSwkweDE0CisjZGVmaW5lIExTUDBfVUFSVDJfQ0xLCTB4MTgKKyNkZWZpbmUgTFNQMF9TUElGQzBfQ0xLCTB4MWMKKyNkZWZpbmUgTFNQMF9JMkM0X0NMSwkweDIwCisjZGVmaW5lIExTUDBfSTJDNV9DTEsJMHgyNAorI2RlZmluZSBMU1AwX1NTUDBfQ0xLCTB4MjgKKyNkZWZpbmUgTFNQMF9TU1AxX0NMSwkweDJjCisjZGVmaW5lIExTUDBfVVNJTTBfQ0xLCTB4MzAKKyNkZWZpbmUgTFNQMF9HUElPX0NMSwkweDM0CisjZGVmaW5lIExTUDBfSTJDM19DTEsJMHgzOAorCisvKiBMU1AxIENSTSAqLworI2RlZmluZSBMU1AxX1VBUlQ0X0NMSwkweDA4CisjZGVmaW5lIExTUDFfVUFSVDVfQ0xLCTB4MGMKKyNkZWZpbmUgTFNQMV9QV01fQ0xLCTB4MTAKKyNkZWZpbmUgTFNQMV9JMkMyX0NMSwkweDE0CisjZGVmaW5lIExTUDFfU1NQMl9DTEsJMHgxYworI2RlZmluZSBMU1AxX1NTUDNfQ0xLCTB4MjAKKyNkZWZpbmUgTFNQMV9TU1A0X0NMSwkweDI0CisjZGVmaW5lIExTUDFfVVNJTTFfQ0xLCTB4MjgKKworLyogYXVkaW8gbHNwICovCisjZGVmaW5lIEFVRElPX0kyUzBfRElWX0NGRzEJMHgxMAorI2RlZmluZSBBVURJT19JMlMwX0RJVl9DRkcyCTB4MTQKKyNkZWZpbmUgQVVESU9fSTJTMF9DTEsJCTB4MTgKKyNkZWZpbmUgQVVESU9fSTJTMV9ESVZfQ0ZHMQkweDIwCisjZGVmaW5lIEFVRElPX0kyUzFfRElWX0NGRzIJMHgyNAorI2RlZmluZSBBVURJT19JMlMxX0NMSwkJMHgyOAorI2RlZmluZSBBVURJT19JMlMyX0RJVl9DRkcxCTB4MzAKKyNkZWZpbmUgQVVESU9fSTJTMl9ESVZfQ0ZHMgkweDM0CisjZGVmaW5lIEFVRElPX0kyUzJfQ0xLCQkweDM4CisjZGVmaW5lIEFVRElPX0kyUzNfRElWX0NGRzEJMHg0MAorI2RlZmluZSBBVURJT19JMlMzX0RJVl9DRkcyCTB4NDQKKyNkZWZpbmUgQVVESU9fSTJTM19DTEsJCTB4NDgKKyNkZWZpbmUgQVVESU9fSTJDMF9DTEsJCTB4NTAKKyNkZWZpbmUgQVVESU9fU1BESUYwX0RJVl9DRkcxCTB4NjAKKyNkZWZpbmUgQVVESU9fU1BESUYwX0RJVl9DRkcyCTB4NjQKKyNkZWZpbmUgQVVESU9fU1BESUYwX0NMSwkweDY4CisjZGVmaW5lIEFVRElPX1NQRElGMV9ESVZfQ0ZHMQkweDcwCisjZGVmaW5lIEFVRElPX1NQRElGMV9ESVZfQ0ZHMgkweDc0CisjZGVmaW5lIEFVRElPX1NQRElGMV9DTEsJMHg3OAorI2RlZmluZSBBVURJT19USU1FUl9DTEsJCTB4ODAKKyNkZWZpbmUgQVVESU9fVERNX0NMSwkJMHg5MAorI2RlZmluZSBBVURJT19UU19DTEsJCTB4YTAKKworc3RhdGljIERFRklORV9TUElOTE9DSyhjbGtfbG9jayk7CisKK3N0YXRpYyBzdHJ1Y3QgenhfcGxsX2NvbmZpZyBwbGxfY3B1X3RhYmxlW10gPSB7CisJUExMX1JBVEUoMTMxMjAwMDAwMCwgMHgwMDEwMzYyMSwgMHgwNGFhYWFhYSksCisJUExMX1JBVEUoMTQwNzAwMDAwMCwgMHgwMDEwM2EyMSwgMHgwNGFhYWFhYSksCisJUExMX1JBVEUoMTUwMzAwMDAwMCwgMHgwMDEwM2UyMSwgMHgwNGFhYWFhYSksCisJUExMX1JBVEUoMTYwMDAwMDAwMCwgMHgwMDEwNDIyMSwgMHgwNGFhYWFhYSksCit9OworCitQTkFNRShvc2MpID0geworCSJvc2MyNG0iLAorCSJvc2MzMmsiLAorfTsKKworUE5BTUUoZGJnX3djbGtfcCkgPSB7CisJImNsazMzNG0iLAorCSJjbGs0NjZtIiwKKwkiY2xrMzk2bSIsCisJImNsazI1MG0iLAorfTsKKworUE5BTUUoYTcyX2NvcmVjbGtfcCkgPSB7CisJIm9zYzI0bSIsCisJInBsbF9tbTBfMTE4OG0iLAorCSJwbGxfbW0xXzEyOTZtIiwKKwkiY2xrMTAwMG0iLAorCSJjbGs2NDhtIiwKKwkiY2xrMTYwMG0iLAorCSJwbGxfYXVkaW9fMTgwMG0iLAorCSJwbGxfdmdhXzE4MDBtIiwKK307CisKK1BOQU1FKGNwdV9wZXJpY2xrX3ApID0geworCSJvc2MyNG0iLAorCSJjbGs1MDBtIiwKKwkiY2xrNTk0bSIsCisJImNsazQ2Nm0iLAorCSJjbGsyOTRtIiwKKwkiY2xrMzM0bSIsCisJImNsazI1MG0iLAorCSJjbGsxMjVtIiwKK307CisKK1BOQU1FKGE1M19jb3JlY2xrX3ApID0geworCSJvc2MyNG0iLAorCSJjbGsxMDAwbSIsCisJInBsbF9tbTBfMTE4OG0iLAorCSJjbGs2NDhtIiwKKwkiY2xrNTAwbSIsCisJImNsazgwMG0iLAorCSJjbGsxNjAwbSIsCisJInBsbF9hdWRpb18xODAwbSIsCit9OworCitQTkFNRShzZWNfd2Nsa19wKSA9IHsKKwkib3NjMjRtIiwKKwkiY2xrMzk2bSIsCisJImNsazMzNG0iLAorCSJjbGsyOTdtIiwKKwkiY2xrMjUwbSIsCisJImNsazE5OG0iLAorCSJjbGsxNDhtNSIsCisJImNsazk5bSIsCit9OworCitQTkFNRShzZF9uYW5kX3djbGtfcCkgPSB7CisJIm9zYzI0bSIsCisJImNsazQ5bTUiLAorCSJjbGs5OW0iLAorCSJjbGsxOThtIiwKKwkiY2xrMTY3bSIsCisJImNsazE0OG01IiwKKwkiY2xrMTI1bSIsCisJImNsazIxNm0iLAorfTsKKworUE5BTUUoZW1tY193Y2xrX3ApID0geworCSJvc2MyNG0iLAorCSJjbGsxOThtIiwKKwkiY2xrOTltIiwKKwkiY2xrMzk2bSIsCisJImNsazMzNG0iLAorCSJjbGsyOTdtIiwKKwkiY2xrMjUwbSIsCisJImNsazE0OG01IiwKK307CisKK1BOQU1FKGNsazMyX3ApID0geworCSJvc2MzMmsiLAorCSJjbGszMms3NjgiLAorfTsKKworUE5BTUUodXNiX3JlZjI0bV9wKSA9IHsKKwkib3NjMzJrIiwKKwkiY2xrMzJrNzY4IiwKK307CisKK1BOQU1FKHN5c19ub2NfYWxja19wKSA9IHsKKwkib3NjMjRtIiwKKwkiY2xrMjUwbSIsCisJImNsazE5OG0iLAorCSJjbGsxNDhtNSIsCisJImNsazEwOG0iLAorCSJjbGs1NG0iLAorCSJjbGsyMTZtIiwKKwkiY2xrMjQwbSIsCit9OworCitQTkFNRSh2ZGVfYWNsa19wKSA9IHsKKwkiY2xrMzM0bSIsCisJImNsazU5NG0iLAorCSJjbGs1MDBtIiwKKwkiY2xrNDMybSIsCisJImNsazQ4MG0iLAorCSJjbGsyOTdtIiwKKwkiY2xrX3ZnYSIsICAvKjYwME1IeiovCisJImNsazI5NG0iLAorfTsKKworUE5BTUUodmNlX2FjbGtfcCkgPSB7CisJImNsazMzNG0iLAorCSJjbGs1OTRtIiwKKwkiY2xrNTAwbSIsCisJImNsazQzMm0iLAorCSJjbGszOTZtIiwKKwkiY2xrMjk3bSIsCisJImNsa192Z2EiLCAgLyo2MDBNSHoqLworCSJjbGsyOTRtIiwKK307CisKK1BOQU1FKGhkZV9hY2xrX3ApID0geworCSJjbGszMzRtIiwKKwkiY2xrNTk0bSIsCisJImNsazUwMG0iLAorCSJjbGs0MzJtIiwKKwkiY2xrMzk2bSIsCisJImNsazI5N20iLAorCSJjbGtfdmdhIiwgIC8qNjAwTUh6Ki8KKwkiY2xrMjk0bSIsCit9OworCitQTkFNRShncHVfYWNsa19wKSA9IHsKKwkiY2xrMzM0bSIsCisJImNsazY0OG0iLAorCSJjbGs1OTRtIiwKKwkiY2xrNTAwbSIsCisJImNsazM5Nm0iLAorCSJjbGsyOTdtIiwKKwkiY2xrX3ZnYSIsICAvKjYwME1IeiovCisJImNsazI5NG0iLAorfTsKKworUE5BTUUoc2FwcHVfYWNsa19wKSA9IHsKKwkiY2xrMzk2bSIsCisJImNsazUwMG0iLAorCSJjbGsyNTBtIiwKKwkiY2xrMTQ4bTUiLAorfTsKKworUE5BTUUoc2FwcHVfd2Nsa19wKSA9IHsKKwkiY2xrMTk4bSIsCisJImNsazM5Nm0iLAorCSJjbGszMzRtIiwKKwkiY2xrMjk3bSIsCisJImNsazI1MG0iLAorCSJjbGsxNDhtNSIsCisJImNsazEyNW0iLAorCSJjbGs5OW0iLAorfTsKKworUE5BTUUodm91X2FjbGtfcCkgPSB7CisJImNsazMzNG0iLAorCSJjbGs1OTRtIiwKKwkiY2xrNTAwbSIsCisJImNsazQzMm0iLAorCSJjbGszOTZtIiwKKwkiY2xrMjk3bSIsCisJImNsa192Z2EiLCAgLyo2MDBNSHoqLworCSJjbGsyOTRtIiwKK307CisKK1BOQU1FKHZvdV9tYWluX3djbGtfcCkgPSB7CisJImNsazEwOG0iLAorCSJjbGs1OTRtIiwKKwkiY2xrMjk3bSIsCisJImNsazE0OG01IiwKKwkiY2xrNzRtMjUiLAorCSJjbGs1NG0iLAorCSJjbGsyN20iLAorCSJjbGtfdmdhIiwKK307CisKK1BOQU1FKHZvdV9hdXhfd2Nsa19wKSA9IHsKKwkiY2xrMTA4bSIsCisJImNsazE0OG01IiwKKwkiY2xrNzRtMjUiLAorCSJjbGs1NG0iLAorCSJjbGsyN20iLAorCSJjbGtfdmdhIiwKKwkiY2xrNTRtX21tMCIsCisJImNsayIKK307CisKK1BOQU1FKHZvdV9wcHVfd2Nsa19wKSA9IHsKKwkiY2xrMzM0bSIsCisJImNsazQzMm0iLAorCSJjbGszOTZtIiwKKwkiY2xrMjk3bSIsCisJImNsazI1MG0iLAorCSJjbGsxMjVtIiwKKwkiY2xrMTk4bSIsCisJImNsazk5bSIsCit9OworCitQTkFNRSh2Z2FfaTJjX3djbGtfcCkgPSB7CisJIm9zYzI0bSIsCisJImNsazk5bSIsCit9OworCitQTkFNRSh2aXVfbTBfYWNsa19wKSA9IHsKKwkiY2xrMzM0bSIsCisJImNsazQzMm0iLAorCSJjbGszOTZtIiwKKwkiY2xrMjk3bSIsCisJImNsazI1MG0iLAorCSJjbGsxMjVtIiwKKwkiY2xrMTk4bSIsCisJIm9zYzI0bSIsCit9OworCitQTkFNRSh2aXVfbTFfYWNsa19wKSA9IHsKKwkiY2xrMTk4bSIsCisJImNsazI1MG0iLAorCSJjbGsyOTdtIiwKKwkiY2xrMTI1bSIsCisJImNsazM5Nm0iLAorCSJjbGszMzRtIiwKKwkiY2xrMTQ4bTUiLAorCSJvc2MyNG0iLAorfTsKKworUE5BTUUodml1X2Nsa19wKSA9IHsKKwkiY2xrMTk4bSIsCisJImNsazMzNG0iLAorCSJjbGsyOTdtIiwKKwkiY2xrMjUwbSIsCisJImNsazM5Nm0iLAorCSJjbGsxMjVtIiwKKwkiY2xrOTltIiwKKwkiY2xrMTQ4bTUiLAorfTsKKworUE5BTUUodml1X2pwZWdfY2xrX3ApID0geworCSJjbGszMzRtIiwKKwkiY2xrNDgwbSIsCisJImNsazQzMm0iLAorCSJjbGszOTZtIiwKKwkiY2xrMjk3bSIsCisJImNsazI1MG0iLAorCSJjbGsxMjVtIiwKKwkiY2xrMTk4bSIsCit9OworCitQTkFNRSh0c19zeXNfY2xrX3ApID0geworCSJjbGsxOTJtIiwKKwkiY2xrMTY3bSIsCisJImNsazEyNW0iLAorCSJjbGs5OW0iLAorfTsKKworUE5BTUUod2R0X2FyZXNfcCkgPSB7CisJIm9zYzI0bSIsCisJImNsazMyayIKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX3p4X3BsbCB6eDI5NjcxOF9wbGxfY2xrW10gPSB7CisJWlgyOTY3MThfUExMKCJwbGxfY3B1IiwJIm9zYzI0bSIsCVBMTF9DUFVfUkVHLAlwbGxfY3B1X3RhYmxlKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgenhfY2xrX2ZpeGVkX2ZhY3RvciB0b3BfZmZhY3Rvcl9jbGtbXSA9IHsKKwlGRkFDVE9SKDAsICJjbGs0bSIsCQkib3NjMjRtIiwgMSwgNiwgIDApLAorCUZGQUNUT1IoMCwgImNsazJtIiwJCSJvc2MyNG0iLCAxLCAxMiwgMCksCisJLyogcGxsIGNwdSAqLworCUZGQUNUT1IoMCwgImNsazE2MDBtIiwJCSJwbGxfY3B1IiwgMSwgMSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCksCisJRkZBQ1RPUigwLCAiY2xrODAwbSIsCQkicGxsX2NwdSIsIDEsIDIsIENMS19TRVRfUkFURV9QQVJFTlQpLAorCS8qIHBsbCBtYWMgKi8KKwlGRkFDVE9SKDAsICJjbGsyNW0iLAkJInBsbF9tYWMiLCAxLCA0MCwgMCksCisJRkZBQ1RPUigwLCAiY2xrMTI1bSIsCQkicGxsX21hYyIsIDEsIDgsIDApLAorCUZGQUNUT1IoMCwgImNsazI1MG0iLAkJInBsbF9tYWMiLCAxLCA0LCAwKSwKKwlGRkFDVE9SKDAsICJjbGs1MG0iLAkJInBsbF9tYWMiLCAxLCAyMCwgMCksCisJRkZBQ1RPUigwLCAiY2xrNTAwbSIsCQkicGxsX21hYyIsIDEsIDIsIDApLAorCUZGQUNUT1IoMCwgImNsazEwMDBtIiwJCSJwbGxfbWFjIiwgMSwgMSwgMCksCisJRkZBQ1RPUigwLCAiY2xrMzM0bSIsCQkicGxsX21hYyIsIDEsIDMsIDApLAorCUZGQUNUT1IoMCwgImNsazE2N20iLAkJInBsbF9tYWMiLCAxLCA2LCAwKSwKKwkvKiBwbGwgbW0gKi8KKwlGRkFDVE9SKDAsICJjbGs1NG1fbW0wIiwJInBsbF9tbTAiLCAxLCAyMiwgMCksCisJRkZBQ1RPUigwLCAiY2xrNzRtMjUiLAkJInBsbF9tbTAiLCAxLCAxNiwgMCksCisJRkZBQ1RPUigwLCAiY2xrMTQ4bTUiLAkJInBsbF9tbTAiLCAxLCA4LCAwKSwKKwlGRkFDVE9SKDAsICJjbGsyOTdtIiwJCSJwbGxfbW0wIiwgMSwgNCwgMCksCisJRkZBQ1RPUigwLCAiY2xrNTk0bSIsCQkicGxsX21tMCIsIDEsIDIsIDApLAorCUZGQUNUT1IoMCwgInBsbF9tbTBfMTE4OG0iLAkicGxsX21tMCIsIDEsIDEsIDApLAorCUZGQUNUT1IoMCwgImNsazM5Nm0iLAkJInBsbF9tbTAiLCAxLCAzLCAwKSwKKwlGRkFDVE9SKDAsICJjbGsxOThtIiwJCSJwbGxfbW0wIiwgMSwgNiwgMCksCisJRkZBQ1RPUigwLCAiY2xrOTltIiwJCSJwbGxfbW0wIiwgMSwgMTIsIDApLAorCUZGQUNUT1IoMCwgImNsazQ5bTUiLAkJInBsbF9tbTAiLCAxLCAyNCwgMCksCisJLyogcGxsIG1tICovCisJRkZBQ1RPUigwLCAiY2xrMzI0bSIsCQkicGxsX21tMSIsIDEsIDQsIDApLAorCUZGQUNUT1IoMCwgImNsazY0OG0iLAkJInBsbF9tbTEiLCAxLCAyLCAwKSwKKwlGRkFDVE9SKDAsICJwbGxfbW0xXzEyOTZtIiwJInBsbF9tbTEiLCAxLCAxLCAwKSwKKwlGRkFDVE9SKDAsICJjbGsyMTZtIiwJCSJwbGxfbW0xIiwgMSwgNiwgMCksCisJRkZBQ1RPUigwLCAiY2xrNDMybSIsCQkicGxsX21tMSIsIDEsIDMsIDApLAorCUZGQUNUT1IoMCwgImNsazEwOG0iLAkJInBsbF9tbTEiLCAxLCAxMiwgMCksCisJRkZBQ1RPUigwLCAiY2xrNzJtIiwJCSJwbGxfbW0xIiwgMSwgMTgsIDApLAorCUZGQUNUT1IoMCwgImNsazI3bSIsCQkicGxsX21tMSIsIDEsIDQ4LCAwKSwKKwlGRkFDVE9SKDAsICJjbGs1NG0iLAkJInBsbF9tbTEiLCAxLCAyNCwgMCksCisJLyogdmdhICovCisJRkZBQ1RPUigwLCAicGxsX3ZnYV8xODAwbSIsCSJwbGxfdmdhIiwgMSwgMSwgMCksCisJRkZBQ1RPUigwLCAiY2xrX3ZnYSIsCQkicGxsX3ZnYSIsIDEsIDIsIDApLAorCS8qIHBsbCBkZHIgKi8KKwlGRkFDVE9SKDAsICJjbGs0NjZtIiwJCSJwbGxfZGRyIiwgMSwgMiwgMCksCisKKwkvKiBwbGwgYXVkaW8gKi8KKwlGRkFDVE9SKDAsICJwbGxfYXVkaW9fMTgwMG0iLAkicGxsX2F1ZGlvIiwgMSwgMSwgMCksCisJRkZBQ1RPUigwLCAiY2xrMzJrNzY4IiwJCSJwbGxfYXVkaW8iLCAxLCAyNzAwMCwgMCksCisJRkZBQ1RPUigwLCAiY2xrMTZtMzg0IiwJCSJwbGxfYXVkaW8iLCAxLCA1NCwgMCksCisJRkZBQ1RPUigwLCAiY2xrMjk0bSIsCQkicGxsX2F1ZGlvIiwgMSwgMywgMCksCisKKwkvKiBwbGwgaHNpYyovCisJRkZBQ1RPUigwLCAiY2xrMjQwbSIsCQkicGxsX2hzaWMiLCAxLCA0LCAwKSwKKwlGRkFDVE9SKDAsICJjbGs0ODBtIiwJCSJwbGxfaHNpYyIsIDEsIDIsIDApLAorCUZGQUNUT1IoMCwgImNsazE5Mm0iLAkJInBsbF9oc2ljIiwgMSwgNSwgMCksCisJRkZBQ1RPUigwLCAiY2xrX3BsbF8yNG0iLAkicGxsX2hzaWMiLCAxLCA0MCwgMCksCisJRkZBQ1RPUigwLCAiZW1tY19tdXhfZGl2MiIsCSJlbW1jX211eCIsIDEsIDIsIENMS19TRVRfUkFURV9QQVJFTlQpLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfZGl2X3RhYmxlIG5vY19kaXZfdGFibGVbXSA9IHsKKwl7IC52YWwgPSAxLCAuZGl2ID0gMiwgfSwKKwl7IC52YWwgPSAzLCAuZGl2ID0gNCwgfSwKK307CitzdGF0aWMgc3RydWN0IHp4X2Nsa19kaXYgdG9wX2Rpdl9jbGtbXSA9IHsKKwlESVZfVCgwLCAic3lzX25vY19oY2xrIiwgInN5c19ub2NfYWNsayIsIFRPUF9DTEtfRElWMCwgMCwgMiwgMCwgbm9jX2Rpdl90YWJsZSksCisJRElWX1QoMCwgInN5c19ub2NfcGNsayIsICJzeXNfbm9jX2FjbGsiLCBUT1BfQ0xLX0RJVjAsIDQsIDIsIDAsIG5vY19kaXZfdGFibGUpLAorfTsKKworc3RhdGljIHN0cnVjdCB6eF9jbGtfbXV4IHRvcF9tdXhfY2xrW10gPSB7CisJTVVYKDAsICJkYmdfbXV4IiwJIGRiZ193Y2xrX3AsCSAgVE9QX0NMS19NVVgwLCAxMiwgMiksCisJTVVYKDAsICJhNzJfbXV4IiwJIGE3Ml9jb3JlY2xrX3AsCSAgVE9QX0NMS19NVVgwLCA4LCAzKSwKKwlNVVgoMCwgImNwdV9wZXJpX211eCIsCSBjcHVfcGVyaWNsa19wLAkgIFRPUF9DTEtfTVVYMCwgNCwgMyksCisJTVVYX0YoMCwgImE1M19tdXgiLAkgYTUzX2NvcmVjbGtfcCwJICBUT1BfQ0xLX01VWDAsIDAsIDMsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCU1VWCgwLCAic3lzX25vY19hY2xrIiwJIHN5c19ub2NfYWxja19wLCAgVE9QX0NMS19NVVgxLCAwLCAzKSwKKwlNVVgoMCwgInNlY19tdXgiLAkgc2VjX3djbGtfcCwJICBUT1BfQ0xLX01VWDIsIDE2LCAzKSwKKwlNVVgoMCwgInNkMV9tdXgiLAkgc2RfbmFuZF93Y2xrX3AsICBUT1BfQ0xLX01VWDIsIDEyLCAzKSwKKwlNVVgoMCwgInNkMF9tdXgiLAkgc2RfbmFuZF93Y2xrX3AsICBUT1BfQ0xLX01VWDIsIDgsIDMpLAorCU1VWCgwLCAiZW1tY19tdXgiLAkgZW1tY193Y2xrX3AsCSAgVE9QX0NMS19NVVgyLCA0LCAzKSwKKwlNVVgoMCwgIm5hbmRfbXV4IiwJIHNkX25hbmRfd2Nsa19wLCAgVE9QX0NMS19NVVgyLCAwLCAzKSwKKwlNVVgoMCwgInVzYl9yZWYyNG1fbXV4IiwgdXNiX3JlZjI0bV9wLAkgIFRPUF9DTEtfTVVYOSwgMTYsIDEpLAorCU1VWCgwLCAiY2xrMzJrIiwJIGNsazMyX3AsCSAgVE9QX0NMS19NVVg5LCAxMiwgMSksCisJTVVYX0YoMCwgIndkdF9tdXgiLAkgd2R0X2FyZXNfcCwJICBUT1BfQ0xLX01VWDksIDgsIDEsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCU1VWCgwLCAidGltZXJfbXV4IiwJIG9zYywJCSAgVE9QX0NMS19NVVg5LCA0LCAxKSwKKwlNVVgoMCwgInZkZV9tdXgiLAkgdmRlX2FjbGtfcCwJICBUT1BfQ0xLX01VWDQsICAwLCAzKSwKKwlNVVgoMCwgInZjZV9tdXgiLAkgdmNlX2FjbGtfcCwJICBUT1BfQ0xLX01VWDQsICA0LCAzKSwKKwlNVVgoMCwgImhkZV9tdXgiLAkgaGRlX2FjbGtfcCwJICBUT1BfQ0xLX01VWDQsICA4LCAzKSwKKwlNVVgoMCwgImdwdV9tdXgiLAkgZ3B1X2FjbGtfcCwJICBUT1BfQ0xLX01VWDUsICAwLCAzKSwKKwlNVVgoMCwgInNhcHB1X2FfbXV4IiwJIHNhcHB1X2FjbGtfcCwJICBUT1BfQ0xLX01VWDUsICA0LCAyKSwKKwlNVVgoMCwgInNhcHB1X3dfbXV4IiwJIHNhcHB1X3djbGtfcCwJICBUT1BfQ0xLX01VWDUsICA4LCAzKSwKKwlNVVgoMCwgInZvdV9hX211eCIsCSB2b3VfYWNsa19wLAkgIFRPUF9DTEtfTVVYNywgIDAsIDMpLAorCU1VWCgwLCAidm91X21haW5fd19tdXgiLCB2b3VfbWFpbl93Y2xrX3AsIFRPUF9DTEtfTVVYNywgIDQsIDMpLAorCU1VWCgwLCAidm91X2F1eF93X211eCIsCSB2b3VfYXV4X3djbGtfcCwgIFRPUF9DTEtfTVVYNywgIDgsIDMpLAorCU1VWCgwLCAidm91X3BwdV93X211eCIsCSB2b3VfcHB1X3djbGtfcCwgIFRPUF9DTEtfTVVYNywgMTIsIDMpLAorCU1VWCgwLCAidmdhX2kyY19tdXgiLAkgdmdhX2kyY193Y2xrX3AsICBUT1BfQ0xLX01VWDcsIDE2LCAxKSwKKwlNVVgoMCwgInZpdV9tMF9hX211eCIsCSB2aXVfbTBfYWNsa19wLAkgIFRPUF9DTEtfTVVYNiwgIDAsIDMpLAorCU1VWCgwLCAidml1X20xX2FfbXV4IiwJIHZpdV9tMV9hY2xrX3AsCSAgVE9QX0NMS19NVVg2LCAgNCwgMyksCisJTVVYKDAsICJ2aXVfd19tdXgiLAkgdml1X2Nsa19wLAkgIFRPUF9DTEtfTVVYNiwgIDgsIDMpLAorCU1VWCgwLCAidml1X2pwZWdfd19tdXgiLCB2aXVfanBlZ19jbGtfcCwgIFRPUF9DTEtfTVVYNiwgMTIsIDMpLAorCU1VWCgwLCAidHNfc3lzX211eCIsCSB0c19zeXNfY2xrX3AsICAgIFRPUF9DTEtfTVVYNiwgMTYsIDIpLAorfTsKKworc3RhdGljIHN0cnVjdCB6eF9jbGtfZ2F0ZSB0b3BfZ2F0ZV9jbGtbXSA9IHsKKwlHQVRFKENQVV9EQkdfR0FURSwgICAgImRiZ193Y2xrIiwgICAgICAgICJkYmdfbXV4IiwgICAgICAgIFRPUF9DTEtfR0FURTAsIDQsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoQTcyX0dBVEUsICAgICAgICAiYTcyX2NvcmVjbGsiLCAgICAgImE3Ml9tdXgiLCAgICAgICAgVE9QX0NMS19HQVRFMCwgMywgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShDUFVfUEVSSV9HQVRFLCAgICJjcHVfcGVyaSIsICAgICAgICAiY3B1X3BlcmlfbXV4IiwgICBUT1BfQ0xLX0dBVEUwLCAxLCBDTEtfU0VUX1JBVEVfUEFSRU5ULCAwKSwKKwlHQVRFKEE1M19HQVRFLCAgICAgICAgImE1M19jb3JlY2xrIiwgICAgICJhNTNfbXV4IiwgICAgICAgIFRPUF9DTEtfR0FURTAsIDAsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoU0QxX1dDTEssICAgICAgICAic2QxX3djbGsiLCAgICAgICAgInNkMV9tdXgiLCAgICAgICAgVE9QX0NMS19HQVRFMSwgMTMsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoU0QwX1dDTEssICAgICAgICAic2QwX3djbGsiLCAgICAgICAgInNkMF9tdXgiLCAgICAgICAgVE9QX0NMS19HQVRFMSwgOSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShFTU1DX1dDTEssICAgICAgICJlbW1jX3djbGsiLCAgICAgICAiZW1tY19tdXhfZGl2MiIsICBUT1BfQ0xLX0dBVEUwLCA1LCBDTEtfU0VUX1JBVEVfUEFSRU5ULCAwKSwKKwlHQVRFKEVNTUNfTkFORF9BWEksICAgImVtbWNfbmFuZF9hY2xrIiwgICJzeXNfbm9jX2FjbGsiLCAgIFRPUF9DTEtfR0FURTEsIDQsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoTkFORF9XQ0xLLCAgICAgICAibmFuZF93Y2xrIiwgICAgICAgIm5hbmRfbXV4IiwgICAgICAgVE9QX0NMS19HQVRFMCwgMSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShFTU1DX05BTkRfQUhCLCAgICJlbW1jX25hbmRfaGNsayIsICAic3lzX25vY19oY2xrIiwgICBUT1BfQ0xLX0dBVEUxLCAwLCBDTEtfU0VUX1JBVEVfUEFSRU5ULCAwKSwKKwlHQVRFKDAsICAgICAgICAgICAgICAgImxzcDFfcGNsayIsICAgICAgICJzeXNfbm9jX3BjbGsiLCAgIFRPUF9DTEtfR0FURTIsIDMxLCAwLCAgICAgICAgICAgICAgICAgIDApLAorCUdBVEUoTFNQMV8xNDhNNSwgICAgICAibHNwMV8xNDhtNSIsICAgICAgImNsazE0OG01IiwgICAgICAgVE9QX0NMS19HQVRFMiwgMzAsIDAsICAgICAgICAgICAgICAgICAgMCksCisJR0FURShMU1AxXzk5TSwgICAgICAgICJsc3AxXzk5bSIsICAgICAgICAiY2xrOTltIiwgICAgICAgICBUT1BfQ0xLX0dBVEUyLCAyOSwgMCwgICAgICAgICAgICAgICAgICAwKSwKKwlHQVRFKExTUDFfMjRNLCAgICAgICAgImxzcDFfMjRtIiwgICAgICAgICJvc2MyNG0iLCAgICAgICAgIFRPUF9DTEtfR0FURTIsIDI4LCAwLCAgICAgICAgICAgICAgICAgIDApLAorCUdBVEUoTFNQMF83NE0yNSwgICAgICAibHNwMF83NG0yNSIsICAgICAgImNsazc0bTI1IiwgICAgICAgVE9QX0NMS19HQVRFMiwgMjUsIDAsICAgICAgICAgICAgICAgICAgMCksCisJR0FURSgwLCAgICAgICAgICAgICAgICJsc3AwX3BjbGsiLCAgICAgICAic3lzX25vY19wY2xrIiwgICBUT1BfQ0xLX0dBVEUyLCAyNCwgMCwgICAgICAgICAgICAgICAgICAwKSwKKwlHQVRFKExTUDBfMzJLLCAgICAgICAgImxzcDBfMzJrIiwgICAgICAgICJvc2MzMmsiLCAgICAgICAgIFRPUF9DTEtfR0FURTIsIDIzLCAwLCAgICAgICAgICAgICAgICAgIDApLAorCUdBVEUoTFNQMF8xNDhNNSwgICAgICAibHNwMF8xNDhtNSIsICAgICAgImNsazE0OG01IiwgICAgICAgVE9QX0NMS19HQVRFMiwgMjIsIDAsICAgICAgICAgICAgICAgICAgMCksCisJR0FURShMU1AwXzk5TSwgICAgICAgICJsc3AwXzk5bSIsICAgICAgICAiY2xrOTltIiwgICAgICAgICBUT1BfQ0xLX0dBVEUyLCAyMSwgMCwgICAgICAgICAgICAgICAgICAwKSwKKwlHQVRFKExTUDBfMjRNLCAgICAgICAgImxzcDBfMjRtIiwgICAgICAgICJvc2MyNG0iLCAgICAgICAgIFRPUF9DTEtfR0FURTIsIDIwLCAwLCAgICAgICAgICAgICAgICAgIDApLAorCUdBVEUoQVVESU9fOTlNLCAgICAgICAiYXVkaW9fOTltIiwgICAgICAgImNsazk5bSIsICAgICAgICAgVE9QX0NMS19HQVRFNSwgMjcsIDAsICAgICAgICAgICAgICAgICAgMCksCisJR0FURShBVURJT18yNE0sICAgICAgICJhdWRpb18yNG0iLCAgICAgICAib3NjMjRtIiwgICAgICAgICBUT1BfQ0xLX0dBVEU1LCAyOCwgMCwgICAgICAgICAgICAgICAgICAwKSwKKwlHQVRFKEFVRElPXzE2TTM4NCwgICAgImF1ZGlvXzE2bTM4NCIsICAgICJjbGsxNm0zODQiLCAgICAgIFRPUF9DTEtfR0FURTUsIDI5LCAwLCAgICAgICAgICAgICAgICAgIDApLAorCUdBVEUoQVVESU9fMzJLLCAgICAgICAiYXVkaW9fMzJrIiwgICAgICAgImNsazMyayIsICAgICAgICAgVE9QX0NMS19HQVRFNSwgMzAsIDAsICAgICAgICAgICAgICAgICAgMCksCisJR0FURShXRFRfV0NMSywgICAgICAgICJ3ZHRfd2NsayIsICAgICAgICAid2R0X211eCIsICAgICAgICBUT1BfQ0xLX0dBVEU2LCA5LCBDTEtfU0VUX1JBVEVfUEFSRU5ULCAwKSwKKwlHQVRFKFRJTUVSX1dDTEssICAgICAgInRpbWVyX3djbGsiLCAgICAgICJ0aW1lcl9tdXgiLCAgICAgIFRPUF9DTEtfR0FURTYsIDUsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoVkRFX0FDTEssICAgICAgICAidmRlX2FjbGsiLCAgICAgICAgInZkZV9tdXgiLCAgICAgICAgVE9QX0NMS19HQVRFMywgMCwgIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoVkNFX0FDTEssICAgICAgICAidmNlX2FjbGsiLCAgICAgICAgInZjZV9tdXgiLCAgICAgICAgVE9QX0NMS19HQVRFMywgNCwgIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoSERFX0FDTEssICAgICAgICAiaGRlX2FjbGsiLCAgICAgICAgImhkZV9tdXgiLCAgICAgICAgVE9QX0NMS19HQVRFMywgOCwgIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoR1BVX0FDTEssICAgICAgICAiZ3B1X2FjbGsiLCAgICAgICAgImdwdV9tdXgiLCAgICAgICAgVE9QX0NMS19HQVRFMywgMTYsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoU0FQUFVfQUNMSywgICAgICAic2FwcHVfYWNsayIsICAgICAgInNhcHB1X2FfbXV4IiwgICAgVE9QX0NMS19HQVRFMywgMjAsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoU0FQUFVfV0NMSywgICAgICAic2FwcHVfd2NsayIsICAgICAgInNhcHB1X3dfbXV4IiwgICAgVE9QX0NMS19HQVRFMywgMjIsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoVk9VX0FDTEssICAgICAgICAidm91X2FjbGsiLCAgICAgICAgInZvdV9hX211eCIsICAgICAgVE9QX0NMS19HQVRFNCwgMTYsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoVk9VX01BSU5fV0NMSywgICAidm91X21haW5fd2NsayIsICAgInZvdV9tYWluX3dfbXV4IiwgVE9QX0NMS19HQVRFNCwgMTgsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoVk9VX0FVWF9XQ0xLLCAgICAidm91X2F1eF93Y2xrIiwgICAgInZvdV9hdXhfd19tdXgiLCAgVE9QX0NMS19HQVRFNCwgMTksIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoVk9VX1BQVV9XQ0xLLCAgICAidm91X3BwdV93Y2xrIiwgICAgInZvdV9wcHVfd19tdXgiLCAgVE9QX0NMS19HQVRFNCwgMjAsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoTUlQSV9DRkdfQ0xLLCAgICAibWlwaV9jZmdfY2xrIiwgICAgIm9zYzI0bSIsICAgICAgICAgVE9QX0NMS19HQVRFNCwgMjEsIDAsICAgICAgICAgICAgICAgICAgIDApLAorCUdBVEUoVkdBX0kyQ19XQ0xLLCAgICAidmdhX2kyY193Y2xrIiwgICAgInZnYV9pMmNfbXV4IiwgICAgVE9QX0NMS19HQVRFNCwgMjMsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoTUlQSV9SRUZfQ0xLLCAgICAibWlwaV9yZWZfY2xrIiwgICAgImNsazI3bSIsICAgICAgICAgVE9QX0NMS19HQVRFNCwgMjQsIDAsICAgICAgICAgICAgICAgICAgIDApLAorCUdBVEUoSERNSV9PU0NfQ0VDLCAgICAiaGRtaV9vc2NfY2VjIiwgICAgImNsazJtIiwgICAgICAgICAgVE9QX0NMS19HQVRFNCwgMjIsIDAsICAgICAgICAgICAgICAgICAgIDApLAorCUdBVEUoSERNSV9PU0NfQ0xLLCAgICAiaGRtaV9vc2NfY2xrIiwgICAgImNsazI0MG0iLCAgICAgICAgVE9QX0NMS19HQVRFNCwgMjUsIDAsICAgICAgICAgICAgICAgICAgIDApLAorCUdBVEUoSERNSV9YQ0xLLCAgICAgICAiaGRtaV94Y2xrIiwgICAgICAgIm9zYzI0bSIsICAgICAgICAgVE9QX0NMS19HQVRFNCwgMjYsIDAsICAgICAgICAgICAgICAgICAgIDApLAorCUdBVEUoVklVX00wX0FDTEssICAgICAidml1X20wX2FjbGsiLCAgICAgInZpdV9tMF9hX211eCIsICAgVE9QX0NMS19HQVRFNCwgMCwgIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoVklVX00xX0FDTEssICAgICAidml1X20xX2FjbGsiLCAgICAgInZpdV9tMV9hX211eCIsICAgVE9QX0NMS19HQVRFNCwgMSwgIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoVklVX1dDTEssICAgICAgICAidml1X3djbGsiLCAgICAgICAgInZpdV93X211eCIsICAgICAgVE9QX0NMS19HQVRFNCwgMiwgIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoVklVX0pQRUdfV0NMSywgICAidml1X2pwZWdfd2NsayIsICAgInZpdV9qcGVnX3dfbXV4IiwgVE9QX0NMS19HQVRFNCwgMywgIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoVklVX0NGR19DTEssICAgICAidml1X2NmZ19jbGsiLCAgICAgIm9zYzI0bSIsICAgICAgICAgVE9QX0NMS19HQVRFNCwgNiwgIDAsICAgICAgICAgICAgICAgICAgIDApLAorCUdBVEUoVFNfU1lTX1dDTEssICAgICAidHNfc3lzX3djbGsiLCAgICAgInRzX3N5c19tdXgiLCAgICAgVE9QX0NMS19HQVRFNSwgMiwgIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoVFNfU1lTXzEwOE0sICAgICAidHNfc3lzXzEwOG0iLCAgICAgImNsazEwOG0iLCAgICAgICAgVE9QX0NMS19HQVRFNSwgMywgIDAsICAgICAgICAgICAgICAgICAgIDApLAorCUdBVEUoVVNCMjBfSENMSywgICAgICAidXNiMjBfaGNsayIsICAgICAgInN5c19ub2NfaGNsayIsICAgVE9QX0NMS19HQVRFMiwgMTIsIDAsICAgICAgICAgICAgICAgICAgIDApLAorCUdBVEUoVVNCMjBfUEhZX0NMSywgICAidXNiMjBfcGh5X2NsayIsICAgInVzYl9yZWYyNG1fbXV4IiwgVE9QX0NMS19HQVRFMiwgMTMsIDAsICAgICAgICAgICAgICAgICAgIDApLAorCUdBVEUoVVNCMjFfSENMSywgICAgICAidXNiMjFfaGNsayIsICAgICAgInN5c19ub2NfaGNsayIsICAgVE9QX0NMS19HQVRFMiwgMTQsIDAsICAgICAgICAgICAgICAgICAgIDApLAorCUdBVEUoVVNCMjFfUEhZX0NMSywgICAidXNiMjFfcGh5X2NsayIsICAgInVzYl9yZWYyNG1fbXV4IiwgVE9QX0NMS19HQVRFMiwgMTUsIDAsICAgICAgICAgICAgICAgICAgIDApLAorCUdBVEUoR01BQ19STUlJQ0xLLCAgICAiZ21hY19ybWlpX2NsayIsICAgImNsazUwbSIsICAgICAgICAgVE9QX0NMS19HQVRFMiwgMywgMCwgICAgICAgICAgICAgICAgICAgIDApLAorCUdBVEUoR01BQ19QQ0xLLCAgICAgICAiZ21hY19wY2xrIiwgICAgICAgImNsazE5OG0iLCAgICAgICAgVE9QX0NMS19HQVRFMiwgMSwgMCwgICAgICAgICAgICAgICAgICAgIDApLAorCUdBVEUoR01BQ19BQ0xLLCAgICAgICAiZ21hY19hY2xrIiwgICAgICAgImNsazQ5bTUiLCAgICAgICAgVE9QX0NMS19HQVRFMiwgMCwgMCwgICAgICAgICAgICAgICAgICAgIDApLAorCUdBVEUoR01BQ19SRkNMSywgICAgICAiZ21hY19yZWZjbGsiLCAgICAgImNsazI1bSIsICAgICAgICAgVE9QX0NMS19HQVRFMiwgNCwgMCwgICAgICAgICAgICAgICAgICAgIDApLAorCUdBVEUoU0QxX0FIQiwgICAgICAgICAic2QxX2hjbGsiLCAgICAgICAgInN5c19ub2NfaGNsayIsICAgVE9QX0NMS19HQVRFMSwgMTIsICAwLCAgICAgICAgICAgICAgICAgIDApLAorCUdBVEUoU0QwX0FIQiwgICAgICAgICAic2QwX2hjbGsiLCAgICAgICAgInN5c19ub2NfaGNsayIsICAgVE9QX0NMS19HQVRFMSwgOCwgIDAsICAgICAgICAgICAgICAgICAgIDApLAorCUdBVEUoVEVNUFNFTlNPUl9HQVRFLCAidGVtcHNlbnNvcl9nYXRlIiwgImNsazRtIiwgICAgICAgICAgVE9QX0NMS19HQVRFNSwgMzEsICAwLCAgICAgICAgICAgICAgICAgIDApLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfaHdfb25lY2VsbF9kYXRhIHRvcF9od19vbmVjZWxsX2RhdGEgPSB7CisJLm51bSA9IFRPUF9OUl9DTEtTLAorCS5od3MgPSB7CisJCVtUT1BfTlJfQ0xLUyAtIDFdID0gTlVMTCwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgdG9wX2Nsb2Nrc19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJdm9pZCBfX2lvbWVtICpyZWdfYmFzZTsKKwlpbnQgaSwgcmV0OworCisJcmVnX2Jhc2UgPSBvZl9pb21hcChucCwgMCk7CisJaWYgKCFyZWdfYmFzZSkgeworCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gbWFwIGNsayBiYXNlXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoengyOTY3MThfcGxsX2Nsayk7IGkrKykgeworCQl6eDI5NjcxOF9wbGxfY2xrW2ldLnJlZ19iYXNlICs9ICh1aW50cHRyX3QpcmVnX2Jhc2U7CisJCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmengyOTY3MThfcGxsX2Nsa1tpXS5odyk7CisJCWlmIChyZXQpIHsKKwkJCXByX3dhcm4oInRvcCBjbGsgJXMgaW5pdCBlcnJvciFcbiIsCisJCQkJengyOTY3MThfcGxsX2Nsa1tpXS5ody5pbml0LT5uYW1lKTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRvcF9mZmFjdG9yX2Nsayk7IGkrKykgeworCQlpZiAodG9wX2ZmYWN0b3JfY2xrW2ldLmlkKQorCQkJdG9wX2h3X29uZWNlbGxfZGF0YS5od3NbdG9wX2ZmYWN0b3JfY2xrW2ldLmlkXSA9CisJCQkJCSZ0b3BfZmZhY3Rvcl9jbGtbaV0uZmFjdG9yLmh3OworCisJCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmdG9wX2ZmYWN0b3JfY2xrW2ldLmZhY3Rvci5odyk7CisJCWlmIChyZXQpIHsKKwkJCXByX3dhcm4oInRvcCBjbGsgJXMgaW5pdCBlcnJvciFcbiIsCisJCQkJdG9wX2ZmYWN0b3JfY2xrW2ldLmZhY3Rvci5ody5pbml0LT5uYW1lKTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRvcF9tdXhfY2xrKTsgaSsrKSB7CisJCWlmICh0b3BfbXV4X2Nsa1tpXS5pZCkKKwkJCXRvcF9od19vbmVjZWxsX2RhdGEuaHdzW3RvcF9tdXhfY2xrW2ldLmlkXSA9CisJCQkJCSZ0b3BfbXV4X2Nsa1tpXS5tdXguaHc7CisKKwkJdG9wX211eF9jbGtbaV0ubXV4LnJlZyArPSAodWludHB0cl90KXJlZ19iYXNlOworCQlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJnRvcF9tdXhfY2xrW2ldLm11eC5odyk7CisJCWlmIChyZXQpIHsKKwkJCXByX3dhcm4oInRvcCBjbGsgJXMgaW5pdCBlcnJvciFcbiIsCisJCQkJdG9wX211eF9jbGtbaV0ubXV4Lmh3LmluaXQtPm5hbWUpOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodG9wX2dhdGVfY2xrKTsgaSsrKSB7CisJCWlmICh0b3BfZ2F0ZV9jbGtbaV0uaWQpCisJCQl0b3BfaHdfb25lY2VsbF9kYXRhLmh3c1t0b3BfZ2F0ZV9jbGtbaV0uaWRdID0KKwkJCQkJJnRvcF9nYXRlX2Nsa1tpXS5nYXRlLmh3OworCisJCXRvcF9nYXRlX2Nsa1tpXS5nYXRlLnJlZyArPSAodWludHB0cl90KXJlZ19iYXNlOworCQlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJnRvcF9nYXRlX2Nsa1tpXS5nYXRlLmh3KTsKKwkJaWYgKHJldCkgeworCQkJcHJfd2FybigidG9wIGNsayAlcyBpbml0IGVycm9yIVxuIiwKKwkJCQl0b3BfZ2F0ZV9jbGtbaV0uZ2F0ZS5ody5pbml0LT5uYW1lKTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRvcF9kaXZfY2xrKTsgaSsrKSB7CisJCWlmICh0b3BfZGl2X2Nsa1tpXS5pZCkKKwkJCXRvcF9od19vbmVjZWxsX2RhdGEuaHdzW3RvcF9kaXZfY2xrW2ldLmlkXSA9CisJCQkJCSZ0b3BfZGl2X2Nsa1tpXS5kaXYuaHc7CisKKwkJdG9wX2Rpdl9jbGtbaV0uZGl2LnJlZyArPSAodWludHB0cl90KXJlZ19iYXNlOworCQlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJnRvcF9kaXZfY2xrW2ldLmRpdi5odyk7CisJCWlmIChyZXQpIHsKKwkJCXByX3dhcm4oInRvcCBjbGsgJXMgaW5pdCBlcnJvciFcbiIsCisJCQkJdG9wX2Rpdl9jbGtbaV0uZGl2Lmh3LmluaXQtPm5hbWUpOworCQl9CisJfQorCisJaWYgKG9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobnAsIG9mX2Nsa19od19vbmVjZWxsX2dldCwgJnRvcF9od19vbmVjZWxsX2RhdGEpKQorCQlwYW5pYygiY291bGQgbm90IHJlZ2lzdGVyIGNsayBwcm92aWRlclxuIik7CisJcHJfaW5mbygidG9wIGNsayBpbml0IG92ZXIsIG5yOiVkXG4iLCBUT1BfTlJfQ0xLUyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfZGl2X3RhYmxlIGNvbW1vbl9ldmVuX2Rpdl90YWJsZVtdID0geworCXsgLnZhbCA9IDAsIC5kaXYgPSAxLCB9LAorCXsgLnZhbCA9IDEsIC5kaXYgPSAyLCB9LAorCXsgLnZhbCA9IDMsIC5kaXYgPSA0LCB9LAorCXsgLnZhbCA9IDUsIC5kaXYgPSA2LCB9LAorCXsgLnZhbCA9IDcsIC5kaXYgPSA4LCB9LAorCXsgLnZhbCA9IDksIC5kaXYgPSAxMCwgfSwKKwl7IC52YWwgPSAxMSwgLmRpdiA9IDEyLCB9LAorCXsgLnZhbCA9IDEzLCAuZGl2ID0gMTQsIH0sCisJeyAudmFsID0gMTUsIC5kaXYgPSAxNiwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2Rpdl90YWJsZSBjb21tb25fZGl2X3RhYmxlW10gPSB7CisJeyAudmFsID0gMCwgLmRpdiA9IDEsIH0sCisJeyAudmFsID0gMSwgLmRpdiA9IDIsIH0sCisJeyAudmFsID0gMiwgLmRpdiA9IDMsIH0sCisJeyAudmFsID0gMywgLmRpdiA9IDQsIH0sCisJeyAudmFsID0gNCwgLmRpdiA9IDUsIH0sCisJeyAudmFsID0gNSwgLmRpdiA9IDYsIH0sCisJeyAudmFsID0gNiwgLmRpdiA9IDcsIH0sCisJeyAudmFsID0gNywgLmRpdiA9IDgsIH0sCisJeyAudmFsID0gOCwgLmRpdiA9IDksIH0sCisJeyAudmFsID0gOSwgLmRpdiA9IDEwLCB9LAorCXsgLnZhbCA9IDEwLCAuZGl2ID0gMTEsIH0sCisJeyAudmFsID0gMTEsIC5kaXYgPSAxMiwgfSwKKwl7IC52YWwgPSAxMiwgLmRpdiA9IDEzLCB9LAorCXsgLnZhbCA9IDEzLCAuZGl2ID0gMTQsIH0sCisJeyAudmFsID0gMTQsIC5kaXYgPSAxNSwgfSwKKwl7IC52YWwgPSAxNSwgLmRpdiA9IDE2LCB9LAorfTsKKworUE5BTUUobHNwMF93Y2xrX2NvbW1vbl9wKSA9IHsKKwkibHNwMF8yNG0iLAorCSJsc3AwXzk5bSIsCit9OworCitQTkFNRShsc3AwX3djbGtfdGltZXIzX3ApID0geworCSJ0aW1lcjNfZGl2IiwKKwkibHNwMF8zMmsiCit9OworCitQTkFNRShsc3AwX3djbGtfdGltZXI0X3ApID0geworCSJ0aW1lcjRfZGl2IiwKKwkibHNwMF8zMmsiCit9OworCitQTkFNRShsc3AwX3djbGtfdGltZXI1X3ApID0geworCSJ0aW1lcjVfZGl2IiwKKwkibHNwMF8zMmsiCit9OworCitQTkFNRShsc3AwX3djbGtfc3BpZmMwX3ApID0geworCSJsc3AwXzE0OG01IiwKKwkibHNwMF8yNG0iLAorCSJsc3AwXzk5bSIsCisJImxzcDBfNzRtMjUiCit9OworCitQTkFNRShsc3AwX3djbGtfc3NwX3ApID0geworCSJsc3AwXzE0OG01IiwKKwkibHNwMF85OW0iLAorCSJsc3AwXzI0bSIsCit9OworCitzdGF0aWMgc3RydWN0IHp4X2Nsa19tdXggbHNwMF9tdXhfY2xrW10gPSB7CisJTVVYKDAsICJ0aW1lcjNfd2Nsa19tdXgiLCBsc3AwX3djbGtfdGltZXIzX3AsIExTUDBfVElNRVIzX0NMSywgNCwgMSksCisJTVVYKDAsICJ0aW1lcjRfd2Nsa19tdXgiLCBsc3AwX3djbGtfdGltZXI0X3AsIExTUDBfVElNRVI0X0NMSywgNCwgMSksCisJTVVYKDAsICJ0aW1lcjVfd2Nsa19tdXgiLCBsc3AwX3djbGtfdGltZXI1X3AsIExTUDBfVElNRVI1X0NMSywgNCwgMSksCisJTVVYKDAsICJ1YXJ0M193Y2xrX211eCIsICBsc3AwX3djbGtfY29tbW9uX3AsIExTUDBfVUFSVDNfQ0xLLCAgNCwgMSksCisJTVVYKDAsICJ1YXJ0MV93Y2xrX211eCIsICBsc3AwX3djbGtfY29tbW9uX3AsIExTUDBfVUFSVDFfQ0xLLCAgNCwgMSksCisJTVVYKDAsICJ1YXJ0Ml93Y2xrX211eCIsICBsc3AwX3djbGtfY29tbW9uX3AsIExTUDBfVUFSVDJfQ0xLLCAgNCwgMSksCisJTVVYKDAsICJzcGlmYzBfd2Nsa19tdXgiLCBsc3AwX3djbGtfc3BpZmMwX3AsIExTUDBfU1BJRkMwX0NMSywgNCwgMiksCisJTVVYKDAsICJpMmM0X3djbGtfbXV4IiwgICBsc3AwX3djbGtfY29tbW9uX3AsIExTUDBfSTJDNF9DTEssICAgNCwgMSksCisJTVVYKDAsICJpMmM1X3djbGtfbXV4IiwgICBsc3AwX3djbGtfY29tbW9uX3AsIExTUDBfSTJDNV9DTEssICAgNCwgMSksCisJTVVYKDAsICJzc3AwX3djbGtfbXV4IiwgICBsc3AwX3djbGtfc3NwX3AsICAgIExTUDBfU1NQMF9DTEssICAgNCwgMSksCisJTVVYKDAsICJzc3AxX3djbGtfbXV4IiwgICBsc3AwX3djbGtfc3NwX3AsICAgIExTUDBfU1NQMV9DTEssICAgNCwgMSksCisJTVVYKDAsICJpMmMzX3djbGtfbXV4IiwgICBsc3AwX3djbGtfY29tbW9uX3AsIExTUDBfSTJDM19DTEssICAgNCwgMSksCit9OworCitzdGF0aWMgc3RydWN0IHp4X2Nsa19nYXRlIGxzcDBfZ2F0ZV9jbGtbXSA9IHsKKwlHQVRFKExTUDBfVElNRVIzX1dDTEssICJ0aW1lcjNfd2NsayIsICJ0aW1lcjNfd2Nsa19tdXgiLCBMU1AwX1RJTUVSM19DTEssIDEsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoTFNQMF9USU1FUjRfV0NMSywgInRpbWVyNF93Y2xrIiwgInRpbWVyNF93Y2xrX211eCIsIExTUDBfVElNRVI0X0NMSywgMSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShMU1AwX1RJTUVSNV9XQ0xLLCAidGltZXI1X3djbGsiLCAidGltZXI1X3djbGtfbXV4IiwgTFNQMF9USU1FUjVfQ0xLLCAxLCBDTEtfU0VUX1JBVEVfUEFSRU5ULCAwKSwKKwlHQVRFKExTUDBfVUFSVDNfV0NMSywgICJ1YXJ0M193Y2xrIiwgICJ1YXJ0M193Y2xrX211eCIsICBMU1AwX1VBUlQzX0NMSywgIDEsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoTFNQMF9VQVJUMV9XQ0xLLCAgInVhcnQxX3djbGsiLCAgInVhcnQxX3djbGtfbXV4IiwgIExTUDBfVUFSVDFfQ0xLLCAgMSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShMU1AwX1VBUlQyX1dDTEssICAidWFydDJfd2NsayIsICAidWFydDJfd2Nsa19tdXgiLCAgTFNQMF9VQVJUMl9DTEssICAxLCBDTEtfU0VUX1JBVEVfUEFSRU5ULCAwKSwKKwlHQVRFKExTUDBfU1BJRkMwX1dDTEssICJzcGlmYzBfd2NsayIsICJzcGlmYzBfd2Nsa19tdXgiLCBMU1AwX1NQSUZDMF9DTEssIDEsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoTFNQMF9JMkM0X1dDTEssICAgImkyYzRfd2NsayIsICAgImkyYzRfd2Nsa19tdXgiLCAgIExTUDBfSTJDNF9DTEssICAgMSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShMU1AwX0kyQzVfV0NMSywgICAiaTJjNV93Y2xrIiwgICAiaTJjNV93Y2xrX211eCIsICAgTFNQMF9JMkM1X0NMSywgICAxLCBDTEtfU0VUX1JBVEVfUEFSRU5ULCAwKSwKKwlHQVRFKExTUDBfU1NQMF9XQ0xLLCAgICJzc3AwX3djbGsiLCAgICJzc3AwX2RpdiIsICAgICAgICBMU1AwX1NTUDBfQ0xLLCAgIDEsIENMS19TRVRfUkFURV9QQVJFTlQsIDApLAorCUdBVEUoTFNQMF9TU1AxX1dDTEssICAgInNzcDFfd2NsayIsICAgInNzcDFfZGl2IiwgICAgICAgIExTUDBfU1NQMV9DTEssICAgMSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShMU1AwX0kyQzNfV0NMSywgICAiaTJjM193Y2xrIiwgICAiaTJjM193Y2xrX211eCIsICAgTFNQMF9JMkMzX0NMSywgICAxLCBDTEtfU0VUX1JBVEVfUEFSRU5ULCAwKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgenhfY2xrX2RpdiBsc3AwX2Rpdl9jbGtbXSA9IHsKKwlESVZfVCgwLCAidGltZXIzX2RpdiIsICJsc3AwXzI0bSIsIExTUDBfVElNRVIzX0NMSywgIDEyLCA0LCAwLCBjb21tb25fZXZlbl9kaXZfdGFibGUpLAorCURJVl9UKDAsICJ0aW1lcjRfZGl2IiwgImxzcDBfMjRtIiwgTFNQMF9USU1FUjRfQ0xLLCAgMTIsIDQsIDAsIGNvbW1vbl9ldmVuX2Rpdl90YWJsZSksCisJRElWX1QoMCwgInRpbWVyNV9kaXYiLCAibHNwMF8yNG0iLCBMU1AwX1RJTUVSNV9DTEssICAxMiwgNCwgMCwgY29tbW9uX2V2ZW5fZGl2X3RhYmxlKSwKKwlESVZfVCgwLCAic3NwMF9kaXYiLCAic3NwMF93Y2xrX211eCIsIExTUDBfU1NQMF9DTEssIDEyLCA0LCAwLCBjb21tb25fZXZlbl9kaXZfdGFibGUpLAorCURJVl9UKDAsICJzc3AxX2RpdiIsICJzc3AxX3djbGtfbXV4IiwgTFNQMF9TU1AxX0NMSywgMTIsIDQsIDAsIGNvbW1vbl9ldmVuX2Rpdl90YWJsZSksCit9OworCitzdGF0aWMgc3RydWN0IGNsa19od19vbmVjZWxsX2RhdGEgbHNwMF9od19vbmVjZWxsX2RhdGEgPSB7CisJLm51bSA9IExTUDBfTlJfQ0xLUywKKwkuaHdzID0geworCQlbTFNQMF9OUl9DTEtTIC0gMV0gPSBOVUxMLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBsc3AwX2Nsb2Nrc19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJdm9pZCBfX2lvbWVtICpyZWdfYmFzZTsKKwlpbnQgaSwgcmV0OworCisJcmVnX2Jhc2UgPSBvZl9pb21hcChucCwgMCk7CisJaWYgKCFyZWdfYmFzZSkgeworCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gbWFwIGNsayBiYXNlXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobHNwMF9tdXhfY2xrKTsgaSsrKSB7CisJCWlmIChsc3AwX211eF9jbGtbaV0uaWQpCisJCQlsc3AwX2h3X29uZWNlbGxfZGF0YS5od3NbbHNwMF9tdXhfY2xrW2ldLmlkXSA9CisJCQkJCSZsc3AwX211eF9jbGtbaV0ubXV4Lmh3OworCisJCWxzcDBfbXV4X2Nsa1tpXS5tdXgucmVnICs9ICh1aW50cHRyX3QpcmVnX2Jhc2U7CisJCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmbHNwMF9tdXhfY2xrW2ldLm11eC5odyk7CisJCWlmIChyZXQpIHsKKwkJCXByX3dhcm4oImxzcDAgY2xrICVzIGluaXQgZXJyb3IhXG4iLAorCQkJCWxzcDBfbXV4X2Nsa1tpXS5tdXguaHcuaW5pdC0+bmFtZSk7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsc3AwX2dhdGVfY2xrKTsgaSsrKSB7CisJCWlmIChsc3AwX2dhdGVfY2xrW2ldLmlkKQorCQkJbHNwMF9od19vbmVjZWxsX2RhdGEuaHdzW2xzcDBfZ2F0ZV9jbGtbaV0uaWRdID0KKwkJCQkJJmxzcDBfZ2F0ZV9jbGtbaV0uZ2F0ZS5odzsKKworCQlsc3AwX2dhdGVfY2xrW2ldLmdhdGUucmVnICs9ICh1aW50cHRyX3QpcmVnX2Jhc2U7CisJCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmbHNwMF9nYXRlX2Nsa1tpXS5nYXRlLmh3KTsKKwkJaWYgKHJldCkgeworCQkJcHJfd2FybigibHNwMCBjbGsgJXMgaW5pdCBlcnJvciFcbiIsCisJCQkJbHNwMF9nYXRlX2Nsa1tpXS5nYXRlLmh3LmluaXQtPm5hbWUpOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobHNwMF9kaXZfY2xrKTsgaSsrKSB7CisJCWlmIChsc3AwX2Rpdl9jbGtbaV0uaWQpCisJCQlsc3AwX2h3X29uZWNlbGxfZGF0YS5od3NbbHNwMF9kaXZfY2xrW2ldLmlkXSA9CisJCQkJCSZsc3AwX2Rpdl9jbGtbaV0uZGl2Lmh3OworCisJCWxzcDBfZGl2X2Nsa1tpXS5kaXYucmVnICs9ICh1aW50cHRyX3QpcmVnX2Jhc2U7CisJCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmbHNwMF9kaXZfY2xrW2ldLmRpdi5odyk7CisJCWlmIChyZXQpIHsKKwkJCXByX3dhcm4oImxzcDAgY2xrICVzIGluaXQgZXJyb3IhXG4iLAorCQkJCWxzcDBfZGl2X2Nsa1tpXS5kaXYuaHcuaW5pdC0+bmFtZSk7CisJCX0KKwl9CisKKwlpZiAob2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X29uZWNlbGxfZ2V0LCAmbHNwMF9od19vbmVjZWxsX2RhdGEpKQorCQlwYW5pYygiY291bGQgbm90IHJlZ2lzdGVyIGNsayBwcm92aWRlclxuIik7CisJcHJfaW5mbygibHNwMC1jbGsgaW5pdCBvdmVyOiVkXG4iLCBMU1AwX05SX0NMS1MpOworCisJcmV0dXJuIDA7Cit9CisKK1BOQU1FKGxzcDFfd2Nsa19jb21tb25fcCkgPSB7CisJImxzcDFfMjRtIiwKKwkibHNwMV85OW0iLAorfTsKKworUE5BTUUobHNwMV93Y2xrX3NzcF9wKSA9IHsKKwkibHNwMV8xNDhtNSIsCisJImxzcDFfOTltIiwKKwkibHNwMV8yNG0iLAorfTsKKworc3RhdGljIHN0cnVjdCB6eF9jbGtfbXV4IGxzcDFfbXV4X2Nsa1tdID0geworCU1VWCgwLCAidWFydDRfd2Nsa19tdXgiLCBsc3AxX3djbGtfY29tbW9uX3AsIExTUDFfVUFSVDRfQ0xLLCA0LCAxKSwKKwlNVVgoMCwgInVhcnQ1X3djbGtfbXV4IiwgbHNwMV93Y2xrX2NvbW1vbl9wLCBMU1AxX1VBUlQ1X0NMSywgNCwgMSksCisJTVVYKDAsICJwd21fd2Nsa19tdXgiLCAgIGxzcDFfd2Nsa19jb21tb25fcCwgTFNQMV9QV01fQ0xLLCAgIDQsIDEpLAorCU1VWCgwLCAiaTJjMl93Y2xrX211eCIsICBsc3AxX3djbGtfY29tbW9uX3AsIExTUDFfSTJDMl9DTEssICA0LCAxKSwKKwlNVVgoMCwgInNzcDJfd2Nsa19tdXgiLCAgbHNwMV93Y2xrX3NzcF9wLCAgICBMU1AxX1NTUDJfQ0xLLCAgNCwgMiksCisJTVVYKDAsICJzc3AzX3djbGtfbXV4IiwgIGxzcDFfd2Nsa19zc3BfcCwgICAgTFNQMV9TU1AzX0NMSywgIDQsIDIpLAorCU1VWCgwLCAic3NwNF93Y2xrX211eCIsICBsc3AxX3djbGtfc3NwX3AsICAgIExTUDFfU1NQNF9DTEssICA0LCAyKSwKKwlNVVgoMCwgInVzaW0xX3djbGtfbXV4IiwgbHNwMV93Y2xrX2NvbW1vbl9wLCBMU1AxX1VTSU0xX0NMSywgNCwgMSksCit9OworCitzdGF0aWMgc3RydWN0IHp4X2Nsa19kaXYgbHNwMV9kaXZfY2xrW10gPSB7CisJRElWX1QoMCwgInB3bV9kaXYiLCAgInB3bV93Y2xrX211eCIsICBMU1AxX1BXTV9DTEssICAxMiwgNCwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgY29tbW9uX2Rpdl90YWJsZSksCisJRElWX1QoMCwgInNzcDJfZGl2IiwgInNzcDJfd2Nsa19tdXgiLCBMU1AxX1NTUDJfQ0xLLCAxMiwgNCwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgY29tbW9uX2V2ZW5fZGl2X3RhYmxlKSwKKwlESVZfVCgwLCAic3NwM19kaXYiLCAic3NwM193Y2xrX211eCIsIExTUDFfU1NQM19DTEssIDEyLCA0LCBDTEtfU0VUX1JBVEVfUEFSRU5ULCBjb21tb25fZXZlbl9kaXZfdGFibGUpLAorCURJVl9UKDAsICJzc3A0X2RpdiIsICJzc3A0X3djbGtfbXV4IiwgTFNQMV9TU1A0X0NMSywgMTIsIDQsIENMS19TRVRfUkFURV9QQVJFTlQsIGNvbW1vbl9ldmVuX2Rpdl90YWJsZSksCit9OworCitzdGF0aWMgc3RydWN0IHp4X2Nsa19nYXRlIGxzcDFfZ2F0ZV9jbGtbXSA9IHsKKwlHQVRFKExTUDFfVUFSVDRfV0NMSywgImxzcDFfdWFydDRfd2NsayIsICJ1YXJ0NF93Y2xrX211eCIsIExTUDFfVUFSVDRfQ0xLLCAxLCBDTEtfU0VUX1JBVEVfUEFSRU5ULCAwKSwKKwlHQVRFKExTUDFfVUFSVDVfV0NMSywgImxzcDFfdWFydDVfd2NsayIsICJ1YXJ0NV93Y2xrX211eCIsIExTUDFfVUFSVDVfQ0xLLCAxLCBDTEtfU0VUX1JBVEVfUEFSRU5ULCAwKSwKKwlHQVRFKExTUDFfUFdNX1dDTEssICAgImxzcDFfcHdtX3djbGsiLCAgICJwd21fZGl2IiwgICAgICAgIExTUDFfUFdNX0NMSywgICAxLCBDTEtfU0VUX1JBVEVfUEFSRU5ULCAwKSwKKwlHQVRFKExTUDFfUFdNX1BDTEssICAgImxzcDFfcHdtX3BjbGsiLCAgICJsc3AxX3BjbGsiLCAgICAgIExTUDFfUFdNX0NMSywgICAwLCAwLAkJICAgMCksCisJR0FURShMU1AxX0kyQzJfV0NMSywgICJsc3AxX2kyYzJfd2NsayIsICAiaTJjMl93Y2xrX211eCIsICBMU1AxX0kyQzJfQ0xLLCAgMSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShMU1AxX1NTUDJfV0NMSywgICJsc3AxX3NzcDJfd2NsayIsICAic3NwMl9kaXYiLCAgICAgICBMU1AxX1NTUDJfQ0xLLCAgMSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShMU1AxX1NTUDNfV0NMSywgICJsc3AxX3NzcDNfd2NsayIsICAic3NwM19kaXYiLCAgICAgICBMU1AxX1NTUDNfQ0xLLCAgMSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShMU1AxX1NTUDRfV0NMSywgICJsc3AxX3NzcDRfd2NsayIsICAic3NwNF9kaXYiLCAgICAgICBMU1AxX1NTUDRfQ0xLLCAgMSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCisJR0FURShMU1AxX1VTSU0xX1dDTEssICJsc3AxX3VzaW0xX3djbGsiLCAidXNpbTFfd2Nsa19tdXgiLCBMU1AxX1VTSU0xX0NMSywgMSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwgMCksCit9OworCitzdGF0aWMgc3RydWN0IGNsa19od19vbmVjZWxsX2RhdGEgbHNwMV9od19vbmVjZWxsX2RhdGEgPSB7CisJLm51bSA9IExTUDFfTlJfQ0xLUywKKwkuaHdzID0geworCQlbTFNQMV9OUl9DTEtTIC0gMV0gPSBOVUxMLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBsc3AxX2Nsb2Nrc19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJdm9pZCBfX2lvbWVtICpyZWdfYmFzZTsKKwlpbnQgaSwgcmV0OworCisJcmVnX2Jhc2UgPSBvZl9pb21hcChucCwgMCk7CisJaWYgKCFyZWdfYmFzZSkgeworCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gbWFwIGNsayBiYXNlXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobHNwMV9tdXhfY2xrKTsgaSsrKSB7CisJCWlmIChsc3AxX211eF9jbGtbaV0uaWQpCisJCQlsc3AxX2h3X29uZWNlbGxfZGF0YS5od3NbbHNwMV9tdXhfY2xrW2ldLmlkXSA9CisJCQkJCSZsc3AwX211eF9jbGtbaV0ubXV4Lmh3OworCisJCWxzcDFfbXV4X2Nsa1tpXS5tdXgucmVnICs9ICh1aW50cHRyX3QpcmVnX2Jhc2U7CisJCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmbHNwMV9tdXhfY2xrW2ldLm11eC5odyk7CisJCWlmIChyZXQpIHsKKwkJCXByX3dhcm4oImxzcDEgY2xrICVzIGluaXQgZXJyb3IhXG4iLAorCQkJCWxzcDFfbXV4X2Nsa1tpXS5tdXguaHcuaW5pdC0+bmFtZSk7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsc3AxX2dhdGVfY2xrKTsgaSsrKSB7CisJCWlmIChsc3AxX2dhdGVfY2xrW2ldLmlkKQorCQkJbHNwMV9od19vbmVjZWxsX2RhdGEuaHdzW2xzcDFfZ2F0ZV9jbGtbaV0uaWRdID0KKwkJCQkJJmxzcDFfZ2F0ZV9jbGtbaV0uZ2F0ZS5odzsKKworCQlsc3AxX2dhdGVfY2xrW2ldLmdhdGUucmVnICs9ICh1aW50cHRyX3QpcmVnX2Jhc2U7CisJCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmbHNwMV9nYXRlX2Nsa1tpXS5nYXRlLmh3KTsKKwkJaWYgKHJldCkgeworCQkJcHJfd2FybigibHNwMSBjbGsgJXMgaW5pdCBlcnJvciFcbiIsCisJCQkJbHNwMV9nYXRlX2Nsa1tpXS5nYXRlLmh3LmluaXQtPm5hbWUpOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobHNwMV9kaXZfY2xrKTsgaSsrKSB7CisJCWlmIChsc3AxX2Rpdl9jbGtbaV0uaWQpCisJCQlsc3AxX2h3X29uZWNlbGxfZGF0YS5od3NbbHNwMV9kaXZfY2xrW2ldLmlkXSA9CisJCQkJCSZsc3AxX2Rpdl9jbGtbaV0uZGl2Lmh3OworCisJCWxzcDFfZGl2X2Nsa1tpXS5kaXYucmVnICs9ICh1aW50cHRyX3QpcmVnX2Jhc2U7CisJCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmbHNwMV9kaXZfY2xrW2ldLmRpdi5odyk7CisJCWlmIChyZXQpIHsKKwkJCXByX3dhcm4oImxzcDEgY2xrICVzIGluaXQgZXJyb3IhXG4iLAorCQkJCWxzcDFfZGl2X2Nsa1tpXS5kaXYuaHcuaW5pdC0+bmFtZSk7CisJCX0KKwl9CisKKwlpZiAob2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X29uZWNlbGxfZ2V0LCAmbHNwMV9od19vbmVjZWxsX2RhdGEpKQorCQlwYW5pYygiY291bGQgbm90IHJlZ2lzdGVyIGNsayBwcm92aWRlclxuIik7CisJcHJfaW5mbygibHNwMS1jbGsgaW5pdCBvdmVyLCBucjolZFxuIiwgTFNQMV9OUl9DTEtTKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB6eF9jbGtjX21hdGNoX3RhYmxlW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJ6dGUsengyOTY3MTgtdG9wY3JtIiwgLmRhdGEgPSAmdG9wX2Nsb2Nrc19pbml0IH0sCisJeyAuY29tcGF0aWJsZSA9ICJ6dGUsengyOTY3MTgtbHNwMGNybSIsIC5kYXRhID0gJmxzcDBfY2xvY2tzX2luaXQgfSwKKwl7IC5jb21wYXRpYmxlID0gInp0ZSx6eDI5NjcxOC1sc3AxY3JtIiwgLmRhdGEgPSAmbHNwMV9jbG9ja3NfaW5pdCB9LAorCXsgfQorfTsKKworc3RhdGljIGludCB6eF9jbGtjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50ICgqaW5pdF9mbikoc3RydWN0IGRldmljZV9ub2RlICpucCk7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCisJaW5pdF9mbiA9IG9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YSgmcGRldi0+ZGV2KTsKKwlpZiAoIWluaXRfZm4pIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRXJyb3I6IE5vIGRldmljZSBtYXRjaCBmb3VuZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiBpbml0X2ZuKG5wKTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgenhfY2xrX2RyaXZlciA9IHsKKwkucHJvYmUJCT0genhfY2xrY19wcm9iZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiengyOTY3MTgtY2xrYyIsCisJCS5vZl9tYXRjaF90YWJsZSA9IHp4X2Nsa2NfbWF0Y2hfdGFibGUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHp4X2Nsa19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmenhfY2xrX2RyaXZlcik7Cit9Citjb3JlX2luaXRjYWxsKHp4X2Nsa19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3p0ZS9jbGsuYyBiL2RyaXZlcnMvY2xrL3p0ZS9jbGsuYwppbmRleCA3YzczYzUzLi5jNGMxMjUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay96dGUvY2xrLmMKKysrIGIvZHJpdmVycy9jbGsvenRlL2Nsay5jCkBAIC0yMSw4ICsyMSw4IEBACiAjZGVmaW5lIHRvX2Nsa196eF9hdWRpbyhfaHcpIGNvbnRhaW5lcl9vZihfaHcsIHN0cnVjdCBjbGtfenhfYXVkaW8sIGh3KQogCiAjZGVmaW5lIENGRzBfQ0ZHMV9PRkZTRVQgNAotI2RlZmluZSBMT0NLX0ZMQUcgQklUKDMwKQotI2RlZmluZSBQT1dFUl9ET1dOIEJJVCgzMSkKKyNkZWZpbmUgTE9DS19GTEFHIDMwCisjZGVmaW5lIFBPV0VSX0RPV04gMzEKIAogc3RhdGljIGludCByYXRlX3RvX2lkeChzdHJ1Y3QgY2xrX3p4X3BsbCAqenhfcGxsLCB1bnNpZ25lZCBsb25nIHJhdGUpCiB7CkBAIC01MCw4ICs1MCw4IEBACiAJaHdfY2ZnMSA9IHJlYWRsX3JlbGF4ZWQoenhfcGxsLT5yZWdfYmFzZSArIENGRzBfQ0ZHMV9PRkZTRVQpOwogCiAJLyogRm9yIG1hdGNoaW5nIHRoZSB2YWx1ZSBpbiBsb29rdXAgdGFibGUgKi8KLQlod19jZmcwICY9IH5MT0NLX0ZMQUc7Ci0JaHdfY2ZnMCB8PSBQT1dFUl9ET1dOOworCWh3X2NmZzAgJj0gfkJJVCh6eF9wbGwtPmxvY2tfYml0KTsKKwlod19jZmcwIHw9IEJJVCh6eF9wbGwtPnBkX2JpdCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgenhfcGxsLT5jb3VudDsgaSsrKSB7CiAJCWlmIChod19jZmcwID09IGNvbmZpZ1tpXS5jZmcwICYmIGh3X2NmZzEgPT0gY29uZmlnW2ldLmNmZzEpCkBAIC0xMDgsMTAgKzEwOCwxMCBAQAogCXUzMiByZWc7CiAKIAlyZWcgPSByZWFkbF9yZWxheGVkKHp4X3BsbC0+cmVnX2Jhc2UpOwotCXdyaXRlbF9yZWxheGVkKHJlZyAmIH5QT1dFUl9ET1dOLCB6eF9wbGwtPnJlZ19iYXNlKTsKKwl3cml0ZWxfcmVsYXhlZChyZWcgJiB+QklUKHp4X3BsbC0+cGRfYml0KSwgenhfcGxsLT5yZWdfYmFzZSk7CiAKIAlyZXR1cm4gcmVhZGxfcmVsYXhlZF9wb2xsX3RpbWVvdXQoenhfcGxsLT5yZWdfYmFzZSwgcmVnLAotCQkJCQkgIHJlZyAmIExPQ0tfRkxBRywgMCwgMTAwKTsKKwkJCQkJICByZWcgJiBCSVQoenhfcGxsLT5sb2NrX2JpdCksIDAsIDEwMCk7CiB9CiAKIHN0YXRpYyB2b2lkIHp4X3BsbF9kaXNhYmxlKHN0cnVjdCBjbGtfaHcgKmh3KQpAQCAtMTIwLDcgKzEyMCw3IEBACiAJdTMyIHJlZzsKIAogCXJlZyA9IHJlYWRsX3JlbGF4ZWQoenhfcGxsLT5yZWdfYmFzZSk7Ci0Jd3JpdGVsX3JlbGF4ZWQocmVnIHwgUE9XRVJfRE9XTiwgenhfcGxsLT5yZWdfYmFzZSk7CisJd3JpdGVsX3JlbGF4ZWQocmVnIHwgQklUKHp4X3BsbC0+cGRfYml0KSwgenhfcGxsLT5yZWdfYmFzZSk7CiB9CiAKIHN0YXRpYyBpbnQgenhfcGxsX2lzX2VuYWJsZWQoc3RydWN0IGNsa19odyAqaHcpCkBAIC0xMzAsMTAgKzEzMCwxMCBAQAogCiAJcmVnID0gcmVhZGxfcmVsYXhlZCh6eF9wbGwtPnJlZ19iYXNlKTsKIAotCXJldHVybiAhKHJlZyAmIFBPV0VSX0RPV04pOworCXJldHVybiAhKHJlZyAmIEJJVCh6eF9wbGwtPnBkX2JpdCkpOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgenhfcGxsX29wcyA9IHsKK2NvbnN0IHN0cnVjdCBjbGtfb3BzIHp4X3BsbF9vcHMgPSB7CiAJLnJlY2FsY19yYXRlID0genhfcGxsX3JlY2FsY19yYXRlLAogCS5yb3VuZF9yYXRlID0genhfcGxsX3JvdW5kX3JhdGUsCiAJLnNldF9yYXRlID0genhfcGxsX3NldF9yYXRlLApAQCAtMTQxLDYgKzE0MSw3IEBACiAJLmRpc2FibGUgPSB6eF9wbGxfZGlzYWJsZSwKIAkuaXNfZW5hYmxlZCA9IHp4X3BsbF9pc19lbmFibGVkLAogfTsKK0VYUE9SVF9TWU1CT0woenhfcGxsX29wcyk7CiAKIHN0cnVjdCBjbGsgKmNsa19yZWdpc3Rlcl96eF9wbGwoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcGFyZW50X25hbWUsCiAJCQkJdW5zaWduZWQgbG9uZyBmbGFncywgdm9pZCBfX2lvbWVtICpyZWdfYmFzZSwKQEAgLTE2NCw2ICsxNjUsOCBAQAogCXp4X3BsbC0+cmVnX2Jhc2UgPSByZWdfYmFzZTsKIAl6eF9wbGwtPmxvb2t1cF90YWJsZSA9IGxvb2t1cF90YWJsZTsKIAl6eF9wbGwtPmNvdW50ID0gY291bnQ7CisJenhfcGxsLT5sb2NrX2JpdCA9IExPQ0tfRkxBRzsKKwl6eF9wbGwtPnBkX2JpdCA9IFBPV0VSX0RPV047CiAJenhfcGxsLT5sb2NrID0gbG9jazsKIAl6eF9wbGwtPmh3LmluaXQgPSAmaW5pdDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvenRlL2Nsay5oIGIvZHJpdmVycy9jbGsvenRlL2Nsay5oCmluZGV4IDY1YWUwOGIuLjBkZjM0NzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL3p0ZS9jbGsuaAorKysgYi9kcml2ZXJzL2Nsay96dGUvY2xrLmgKQEAgLTEyLDYgKzEyLDI2IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIAorI2RlZmluZSBQTkFNRSh4KSBzdGF0aWMgY29uc3QgY2hhciAqeFtdCisKKyNkZWZpbmUgQ0xLX0hXX0lOSVQoX25hbWUsIF9wYXJlbnQsIF9vcHMsIF9mbGFncykJCQlcCisJJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSkgewkJCQkJXAorCQkuZmxhZ3MJCT0gX2ZsYWdzLAkJCQlcCisJCS5uYW1lCQk9IF9uYW1lLAkJCQlcCisJCS5wYXJlbnRfbmFtZXMJPSAoY29uc3QgY2hhciAqW10pIHsgX3BhcmVudCB9LAkJXAorCQkubnVtX3BhcmVudHMJPSAxLAkJCQkJXAorCQkub3BzCQk9IF9vcHMsCQkJCQlcCisJfQorCisjZGVmaW5lIENMS19IV19JTklUX1BBUkVOVFMoX25hbWUsIF9wYXJlbnRzLCBfb3BzLCBfZmxhZ3MpCQlcCisJJihzdHJ1Y3QgY2xrX2luaXRfZGF0YSkgewkJCQkJXAorCQkuZmxhZ3MJCT0gX2ZsYWdzLAkJCQlcCisJCS5uYW1lCQk9IF9uYW1lLAkJCQlcCisJCS5wYXJlbnRfbmFtZXMJPSBfcGFyZW50cywJCQkJXAorCQkubnVtX3BhcmVudHMJPSBBUlJBWV9TSVpFKF9wYXJlbnRzKSwJCQlcCisJCS5vcHMJCT0gX29wcywJCQkJCVwKKwl9CisKIHN0cnVjdCB6eF9wbGxfY29uZmlnIHsKIAl1bnNpZ25lZCBsb25nIHJhdGU7CiAJdTMyIGNmZzA7CkBAIC0yNCw4ICs0NCwxMTUgQEAKIAljb25zdCBzdHJ1Y3QgenhfcGxsX2NvbmZpZyAqbG9va3VwX3RhYmxlOyAvKiBvcmRlciBieSByYXRlIGFzYyAqLwogCWludCBjb3VudDsKIAlzcGlubG9ja190ICpsb2NrOworCXU4IHBkX2JpdDsJCS8qIHBvd2VyIGRvd24gYml0ICovCisJdTggbG9ja19iaXQ7CQkvKiBwbGwgbG9jayBmbGFnIGJpdCAqLwogfTsKIAorI2RlZmluZSBQTExfUkFURShfcmF0ZSwgX2NmZzAsIF9jZmcxKQlcCit7CQkJCQlcCisJLnJhdGUgPSBfcmF0ZSwJCQlcCisJLmNmZzAgPSBfY2ZnMCwJCQlcCisJLmNmZzEgPSBfY2ZnMSwJCQlcCit9CisKKyNkZWZpbmUgWlhfUExMKF9uYW1lLCBfcGFyZW50LCBfcmVnLCBfdGFibGUsIF9wZCwgX2xvY2spCQlcCit7CQkJCQkJCQkJXAorCS5yZWdfYmFzZQk9ICh2b2lkIF9faW9tZW0gKikgX3JlZywJCQlcCisJLmxvb2t1cF90YWJsZQk9IF90YWJsZSwJCQkJCVwKKwkuY291bnQJCT0gQVJSQVlfU0laRShfdGFibGUpLAkJCQlcCisJLnBkX2JpdAkJPSBfcGQsCQkJCQkJXAorCS5sb2NrX2JpdAk9IF9sb2NrLAkJCQkJXAorCS5ody5pbml0CSA9IENMS19IV19JTklUKF9uYW1lLCBfcGFyZW50LCAmenhfcGxsX29wcywJXAorCQkJCUNMS19HRVRfUkFURV9OT0NBQ0hFKSwJCQlcCit9CisKKyNkZWZpbmUgWlgyOTY3MThfUExMKF9uYW1lLCBfcGFyZW50LCBfcmVnLCBfdGFibGUpCQkJXAorWlhfUExMKF9uYW1lLCBfcGFyZW50LCBfcmVnLCBfdGFibGUsIDAsIDMwKQorCitzdHJ1Y3QgenhfY2xrX2dhdGUgeworCXN0cnVjdCBjbGtfZ2F0ZSBnYXRlOworCXUxNgkJaWQ7Cit9OworCisjZGVmaW5lIEdBVEUoX2lkLCBfbmFtZSwgX3BhcmVudCwgX3JlZywgX2JpdCwgX2ZsYWcsIF9nZmxhZ3MpCQlcCit7CQkJCQkJCQkJXAorCS5nYXRlID0gewkJCQkJCQlcCisJCS5yZWcgPSAodm9pZCBfX2lvbWVtICopIF9yZWcsCQkJCVwKKwkJLmJpdF9pZHggPSAoX2JpdCksCQkJCQlcCisJCS5mbGFncyA9IF9nZmxhZ3MsCQkJCQlcCisJCS5sb2NrID0gJmNsa19sb2NrLAkJCQkJXAorCQkuaHcuaW5pdCA9IENMS19IV19JTklUKF9uYW1lLAkJCQlcCisJCQkJCV9wYXJlbnQsCQkJXAorCQkJCQkmY2xrX2dhdGVfb3BzLAkJCVwKKwkJCQkJX2ZsYWcgfCBDTEtfSUdOT1JFX1VOVVNFRCksCVwKKwl9LAkJCQkJCQkJXAorCS5pZAk9IF9pZCwJCQkJCQkJXAorfQorCitzdHJ1Y3QgenhfY2xrX2ZpeGVkX2ZhY3RvciB7CisJc3RydWN0IGNsa19maXhlZF9mYWN0b3IgZmFjdG9yOworCXUxNglpZDsKK307CisKKyNkZWZpbmUgRkZBQ1RPUihfaWQsIF9uYW1lLCBfcGFyZW50LCBfbXVsdCwgX2RpdiwgX2ZsYWcpCQlcCit7CQkJCQkJCQkJXAorCS5mYWN0b3IgPSB7CQkJCQkJCVwKKwkJLmRpdgkJPSBfZGl2LAkJCQkJXAorCQkubXVsdAkJPSBfbXVsdCwJCQkJXAorCQkuaHcuaW5pdAk9IENMS19IV19JTklUKF9uYW1lLAkJCVwKKwkJCQkJICAgICAgX3BhcmVudCwJCQlcCisJCQkJCSAgICAgICZjbGtfZml4ZWRfZmFjdG9yX29wcywJXAorCQkJCQkgICAgICBfZmxhZyksCQkJXAorCX0sCQkJCQkJCQlcCisJLmlkID0gX2lkLAkJCQkJCQlcCit9CisKK3N0cnVjdCB6eF9jbGtfbXV4IHsKKwlzdHJ1Y3QgY2xrX211eCBtdXg7CisJdTE2CWlkOworfTsKKworI2RlZmluZSBNVVhfRihfaWQsIF9uYW1lLCBfcGFyZW50LCBfcmVnLCBfc2hpZnQsIF93aWR0aCwgX2ZsYWcsIF9tZmxhZykJXAorewkJCQkJCQkJCVwKKwkubXV4ID0gewkJCQkJCQlcCisJCS5yZWcJCT0gKHZvaWQgX19pb21lbSAqKSBfcmVnLAkJXAorCQkubWFzawkJPSBCSVQoX3dpZHRoKSAtIDEsCQkJXAorCQkuc2hpZnQJCT0gX3NoaWZ0LAkJCQlcCisJCS5mbGFncwkJPSBfbWZsYWcsCQkJCVwKKwkJLmxvY2sJCT0gJmNsa19sb2NrLAkJCQlcCisJCS5ody5pbml0CT0gQ0xLX0hXX0lOSVRfUEFSRU5UUyhfbmFtZSwJCVwKKwkJCQkJCSAgICAgIF9wYXJlbnQsCQlcCisJCQkJCQkgICAgICAmY2xrX211eF9vcHMsCVwKKwkJCQkJCSAgICAgIF9mbGFnKSwJCVwKKwl9LAkJCQkJCQkJXAorCS5pZCA9IF9pZCwJCQkJCQkJXAorfQorCisjZGVmaW5lIE1VWChfaWQsIF9uYW1lLCBfcGFyZW50LCBfcmVnLCBfc2hpZnQsIF93aWR0aCkJCQlcCitNVVhfRihfaWQsIF9uYW1lLCBfcGFyZW50LCBfcmVnLCBfc2hpZnQsIF93aWR0aCwgMCwgMCkKKworc3RydWN0IHp4X2Nsa19kaXYgeworCXN0cnVjdCBjbGtfZGl2aWRlciBkaXY7CisJdTE2CWlkOworfTsKKworI2RlZmluZSBESVZfVChfaWQsIF9uYW1lLCBfcGFyZW50LCBfcmVnLCBfc2hpZnQsIF93aWR0aCwgX2ZsYWcsIF90YWJsZSkJXAorewkJCQkJCQkJCVwKKwkuZGl2ID0gewkJCQkJCQlcCisJCS5yZWcJCT0gKHZvaWQgX19pb21lbSAqKSBfcmVnLAkJXAorCQkuc2hpZnQJCT0gX3NoaWZ0LAkJCQlcCisJCS53aWR0aAkJPSBfd2lkdGgsCQkJCVwKKwkJLmZsYWdzCQk9IDAsCQkJCQlcCisJCS50YWJsZQkJPSBfdGFibGUsCQkJCVwKKwkJLmxvY2sJCT0gJmNsa19sb2NrLAkJCQlcCisJCS5ody5pbml0CT0gQ0xLX0hXX0lOSVQoX25hbWUsCQkJXAorCQkJCQkgICAgICBfcGFyZW50LAkJCVwKKwkJCQkJICAgICAgJmNsa19kaXZpZGVyX29wcywJCVwKKwkJCQkJICAgICAgX2ZsYWcpLAkJCVwKKwl9LAkJCQkJCQkJXAorCS5pZCA9IF9pZCwJCQkJCQkJXAorfQorCiBzdHJ1Y3QgY2xrICpjbGtfcmVnaXN0ZXJfenhfcGxsKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnBhcmVudF9uYW1lLAogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHZvaWQgX19pb21lbSAqcmVnX2Jhc2UsCiAJY29uc3Qgc3RydWN0IHp4X3BsbF9jb25maWcgKmxvb2t1cF90YWJsZSwgaW50IGNvdW50LCBzcGlubG9ja190ICpsb2NrKTsKQEAgLTM4LDQgKzE2NSw2IEBACiBzdHJ1Y3QgY2xrICpjbGtfcmVnaXN0ZXJfenhfYXVkaW8oY29uc3QgY2hhciAqbmFtZSwKIAkJCQkgIGNvbnN0IGNoYXIgKiBjb25zdCBwYXJlbnRfbmFtZSwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHZvaWQgX19pb21lbSAqcmVnX2Jhc2UpOworCitleHRlcm4gY29uc3Qgc3RydWN0IGNsa19vcHMgenhfcGxsX29wczsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9LY29uZmlnIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9LY29uZmlnCmluZGV4IDU2Nzc4ODYuLjhhNzUzZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvS2NvbmZpZworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL0tjb25maWcKQEAgLTMwNSw2ICszMDUsMTYgQEAKIAkgIFRoaXMgbXVzdCBiZSBkaXNhYmxlZCBmb3IgaGFyZHdhcmUgdmFsaWRhdGlvbiBwdXJwb3NlcyB0byBkZXRlY3QgYW55CiAJICBoYXJkd2FyZSBhbm9tYWxpZXMgb2YgbWlzc2luZyBldmVudHMuCiAKK2NvbmZpZyBGU0xfRVJSQVRVTV9BMDA4NTg1CisJYm9vbCAiV29ya2Fyb3VuZCBmb3IgRnJlZXNjYWxlL05YUCBFcnJhdHVtIEEtMDA4NTg1IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQVJNX0FSQ0hfVElNRVIgJiYgQVJNNjQKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIGEgd29ya2Fyb3VuZCBmb3IgRnJlZXNjYWxlL05YUCBFcnJhdHVtCisJICBBLTAwODU4NSAoIkFSTSBnZW5lcmljIHRpbWVyIG1heSBjb250YWluIGFuIGVycm9uZW91cworCSAgdmFsdWUiKS4gIFRoZSB3b3JrYXJvdW5kIHdpbGwgb25seSBiZSBhY3RpdmUgaWYgdGhlCisJICBmc2wsZXJyYXR1bS1hMDA4NTg1IHByb3BlcnR5IGlzIGZvdW5kIGluIHRoZSB0aW1lciBub2RlLgorCiBjb25maWcgQVJNX0dMT0JBTF9USU1FUgogCWJvb2wgIlN1cHBvcnQgZm9yIHRoZSBBUk0gZ2xvYmFsIHRpbWVyIiBpZiBDT01QSUxFX1RFU1QKIAlzZWxlY3QgQ0xLU1JDX09GIGlmIE9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2FybV9hcmNoX3RpbWVyLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2FybV9hcmNoX3RpbWVyLmMKaW5kZXggNTc3MDA1NC4uNzNjNDg3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS9hcm1fYXJjaF90aW1lci5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvYXJtX2FyY2hfdGltZXIuYwpAQCAtOTQsNiArOTQsNDMgQEAKICAqIEFyY2hpdGVjdGVkIHN5c3RlbSB0aW1lciBzdXBwb3J0LgogICovCiAKKyNpZmRlZiBDT05GSUdfRlNMX0VSUkFUVU1fQTAwODU4NQorREVGSU5FX1NUQVRJQ19LRVlfRkFMU0UoYXJjaF90aW1lcl9yZWFkX29vbF9lbmFibGVkKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGFyY2hfdGltZXJfcmVhZF9vb2xfZW5hYmxlZCk7CisKK3N0YXRpYyBpbnQgZnNsX2EwMDg1ODVfZW5hYmxlID0gLTE7CisKK3N0YXRpYyBpbnQgX19pbml0IGVhcmx5X2ZzbF9hMDA4NTg1X2NmZyhjaGFyICpidWYpCit7CisJaW50IHJldDsKKwlib29sIHZhbDsKKworCXJldCA9IHN0cnRvYm9vbChidWYsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlmc2xfYTAwODU4NV9lbmFibGUgPSB2YWw7CisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgiY2xvY2tzb3VyY2UuYXJtX2FyY2hfdGltZXIuZnNsLWEwMDg1ODUiLCBlYXJseV9mc2xfYTAwODU4NV9jZmcpOworCit1MzIgX19mc2xfYTAwODU4NV9yZWFkX2NudHBfdHZhbF9lbDAodm9pZCkKK3sKKwlyZXR1cm4gX19mc2xfYTAwODU4NV9yZWFkX3JlZyhjbnRwX3R2YWxfZWwwKTsKK30KKwordTMyIF9fZnNsX2EwMDg1ODVfcmVhZF9jbnR2X3R2YWxfZWwwKHZvaWQpCit7CisJcmV0dXJuIF9fZnNsX2EwMDg1ODVfcmVhZF9yZWcoY250dl90dmFsX2VsMCk7Cit9CisKK3U2NCBfX2ZzbF9hMDA4NTg1X3JlYWRfY250dmN0X2VsMCh2b2lkKQoreworCXJldHVybiBfX2ZzbF9hMDA4NTg1X3JlYWRfcmVnKGNudHZjdF9lbDApOworfQorRVhQT1JUX1NZTUJPTChfX2ZzbF9hMDA4NTg1X3JlYWRfY250dmN0X2VsMCk7CisjZW5kaWYgLyogQ09ORklHX0ZTTF9FUlJBVFVNX0EwMDg1ODUgKi8KKwogc3RhdGljIF9fYWx3YXlzX2lubGluZQogdm9pZCBhcmNoX3RpbWVyX3JlZ193cml0ZShpbnQgYWNjZXNzLCBlbnVtIGFyY2hfdGltZXJfcmVnIHJlZywgdTMyIHZhbCwKIAkJCSAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2xrKQpAQCAtMjQzLDYgKzI4MCw0MCBAQAogCWFyY2hfdGltZXJfcmVnX3dyaXRlKGFjY2VzcywgQVJDSF9USU1FUl9SRUdfQ1RSTCwgY3RybCwgY2xrKTsKIH0KIAorI2lmZGVmIENPTkZJR19GU0xfRVJSQVRVTV9BMDA4NTg1CitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgZnNsX2EwMDg1ODVfc2V0X25leHRfZXZlbnQoY29uc3QgaW50IGFjY2VzcywKKwkJdW5zaWduZWQgbG9uZyBldnQsIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNsaykKK3sKKwl1bnNpZ25lZCBsb25nIGN0cmw7CisJdTY0IGN2YWwgPSBldnQgKyBhcmNoX2NvdW50ZXJfZ2V0X2NudHZjdCgpOworCisJY3RybCA9IGFyY2hfdGltZXJfcmVnX3JlYWQoYWNjZXNzLCBBUkNIX1RJTUVSX1JFR19DVFJMLCBjbGspOworCWN0cmwgfD0gQVJDSF9USU1FUl9DVFJMX0VOQUJMRTsKKwljdHJsICY9IH5BUkNIX1RJTUVSX0NUUkxfSVRfTUFTSzsKKworCWlmIChhY2Nlc3MgPT0gQVJDSF9USU1FUl9QSFlTX0FDQ0VTUykKKwkJd3JpdGVfc3lzcmVnKGN2YWwsIGNudHBfY3ZhbF9lbDApOworCWVsc2UgaWYgKGFjY2VzcyA9PSBBUkNIX1RJTUVSX1ZJUlRfQUNDRVNTKQorCQl3cml0ZV9zeXNyZWcoY3ZhbCwgY250dl9jdmFsX2VsMCk7CisKKwlhcmNoX3RpbWVyX3JlZ193cml0ZShhY2Nlc3MsIEFSQ0hfVElNRVJfUkVHX0NUUkwsIGN0cmwsIGNsayk7Cit9CisKK3N0YXRpYyBpbnQgZnNsX2EwMDg1ODVfc2V0X25leHRfZXZlbnRfdmlydCh1bnNpZ25lZCBsb25nIGV2dCwKKwkJCQkJICAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2xrKQoreworCWZzbF9hMDA4NTg1X3NldF9uZXh0X2V2ZW50KEFSQ0hfVElNRVJfVklSVF9BQ0NFU1MsIGV2dCwgY2xrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmc2xfYTAwODU4NV9zZXRfbmV4dF9ldmVudF9waHlzKHVuc2lnbmVkIGxvbmcgZXZ0LAorCQkJCQkgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpjbGspCit7CisJZnNsX2EwMDg1ODVfc2V0X25leHRfZXZlbnQoQVJDSF9USU1FUl9QSFlTX0FDQ0VTUywgZXZ0LCBjbGspOworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19GU0xfRVJSQVRVTV9BMDA4NTg1ICovCisKIHN0YXRpYyBpbnQgYXJjaF90aW1lcl9zZXRfbmV4dF9ldmVudF92aXJ0KHVuc2lnbmVkIGxvbmcgZXZ0LAogCQkJCQkgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNsaykKIHsKQEAgLTI3MSw2ICszNDIsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgZnNsX2EwMDg1ODVfc2V0X3NuZShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpjbGspCit7CisjaWZkZWYgQ09ORklHX0ZTTF9FUlJBVFVNX0EwMDg1ODUKKwlpZiAoIXN0YXRpY19icmFuY2hfdW5saWtlbHkoJmFyY2hfdGltZXJfcmVhZF9vb2xfZW5hYmxlZCkpCisJCXJldHVybjsKKworCWlmIChhcmNoX3RpbWVyX3VzZXNfcHBpID09IFZJUlRfUFBJKQorCQljbGstPnNldF9uZXh0X2V2ZW50ID0gZnNsX2EwMDg1ODVfc2V0X25leHRfZXZlbnRfdmlydDsKKwllbHNlCisJCWNsay0+c2V0X25leHRfZXZlbnQgPSBmc2xfYTAwODU4NV9zZXRfbmV4dF9ldmVudF9waHlzOworI2VuZGlmCit9CisKIHN0YXRpYyB2b2lkIF9fYXJjaF90aW1lcl9zZXR1cCh1bnNpZ25lZCB0eXBlLAogCQkJICAgICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNsaykKIHsKQEAgLTI5OSw2ICszODMsOCBAQAogCQlkZWZhdWx0OgogCQkJQlVHKCk7CiAJCX0KKworCQlmc2xfYTAwODU4NV9zZXRfc25lKGNsayk7CiAJfSBlbHNlIHsKIAkJY2xrLT5mZWF0dXJlcyB8PSBDTE9DS19FVlRfRkVBVF9EWU5JUlE7CiAJCWNsay0+bmFtZSA9ICJhcmNoX21lbV90aW1lciI7CkBAIC01MTUsMTUgKzYwMSwxOSBAQAogCQkJYXJjaF90aW1lcl9yZWFkX2NvdW50ZXIgPSBhcmNoX2NvdW50ZXJfZ2V0X2NudHZjdDsKIAkJZWxzZQogCQkJYXJjaF90aW1lcl9yZWFkX2NvdW50ZXIgPSBhcmNoX2NvdW50ZXJfZ2V0X2NudHBjdDsKKworCQljbG9ja3NvdXJjZV9jb3VudGVyLmFyY2hkYXRhLnZkc29fZGlyZWN0ID0gdHJ1ZTsKKworI2lmZGVmIENPTkZJR19GU0xfRVJSQVRVTV9BMDA4NTg1CisJCS8qCisJCSAqIERvbid0IHVzZSB0aGUgdmRzbyBmYXN0cGF0aCBpZiBlcnJhdGEgcmVxdWlyZSB1c2luZworCQkgKiB0aGUgb3V0LW9mLWxpbmUgY291bnRlciBhY2Nlc3Nvci4KKwkJICovCisJCWlmIChzdGF0aWNfYnJhbmNoX3VubGlrZWx5KCZhcmNoX3RpbWVyX3JlYWRfb29sX2VuYWJsZWQpKQorCQkJY2xvY2tzb3VyY2VfY291bnRlci5hcmNoZGF0YS52ZHNvX2RpcmVjdCA9IGZhbHNlOworI2VuZGlmCiAJfSBlbHNlIHsKIAkJYXJjaF90aW1lcl9yZWFkX2NvdW50ZXIgPSBhcmNoX2NvdW50ZXJfZ2V0X2NudHZjdF9tZW07Ci0KLQkJLyogSWYgdGhlIGNsb2Nrc291cmNlIG5hbWUgaXMgImFyY2hfc3lzX2NvdW50ZXIiIHRoZQotCQkgKiBWRFNPIHdpbGwgYXR0ZW1wdCB0byByZWFkIHRoZSBDUDE1LWJhc2VkIGNvdW50ZXIuCi0JCSAqIEVuc3VyZSB0aGlzIGRvZXMgbm90IGhhcHBlbiB3aGVuIENQMTUtYmFzZWQKLQkJICogY291bnRlciBpcyBub3QgYXZhaWxhYmxlLgotCQkgKi8KLQkJY2xvY2tzb3VyY2VfY291bnRlci5uYW1lID0gImFyY2hfbWVtX2NvdW50ZXIiOwogCX0KIAogCXN0YXJ0X2NvdW50ID0gYXJjaF90aW1lcl9yZWFkX2NvdW50ZXIoKTsKQEAgLTgwMCw2ICs4OTAsMTUgQEAKIAogCWFyY2hfdGltZXJfYzNzdG9wID0gIW9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImFsd2F5cy1vbiIpOwogCisjaWZkZWYgQ09ORklHX0ZTTF9FUlJBVFVNX0EwMDg1ODUKKwlpZiAoZnNsX2EwMDg1ODVfZW5hYmxlIDwgMCkKKwkJZnNsX2EwMDg1ODVfZW5hYmxlID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiZnNsLGVycmF0dW0tYTAwODU4NSIpOworCWlmIChmc2xfYTAwODU4NV9lbmFibGUpIHsKKwkJc3RhdGljX2JyYW5jaF9lbmFibGUoJmFyY2hfdGltZXJfcmVhZF9vb2xfZW5hYmxlZCk7CisJCXByX2luZm8oIkVuYWJsaW5nIHdvcmthcm91bmQgZm9yIEZTTCBlcnJhdHVtIEEtMDA4NTg1XG4iKTsKKwl9CisjZW5kaWYKKwogCS8qCiAJICogSWYgd2UgY2Fubm90IHJlbHkgb24gZmlybXdhcmUgaW5pdGlhbGl6aW5nIHRoZSB0aW1lciByZWdpc3RlcnMgdGhlbgogCSAqIHdlIHNob3VsZCB1c2UgdGhlIHBoeXNpY2FsIHRpbWVycyBpbnN0ZWFkLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9iY21fa29uYV90aW1lci5jIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9iY21fa29uYV90aW1lci5jCmluZGV4IDdlM2ZkMzcuLjkyZjZlNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvYmNtX2tvbmFfdGltZXIuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2JjbV9rb25hX3RpbWVyLmMKQEAgLTY2LDEwICs2NiwxMCBAQAogCiB9CiAKLXN0YXRpYyB2b2lkCitzdGF0aWMgaW50CiBrb25hX3RpbWVyX2dldF9jb3VudGVyKHZvaWQgX19pb21lbSAqdGltZXJfYmFzZSwgdWludDMyX3QgKm1zdywgdWludDMyX3QgKmxzdykKIHsKLQlpbnQgbG9vcF9saW1pdCA9IDQ7CisJaW50IGxvb3BfbGltaXQgPSAzOwogCiAJLyoKIAkgKiBSZWFkIDY0LWJpdCBmcmVlIHJ1bm5pbmcgY291bnRlcgpAQCAtODMsMTggKzgzLDE5IEBACiAJICogICAgICBpZiBuZXcgaGktd29yZCBpcyBlcXVhbCB0byBwcmV2aW91c2x5IHJlYWQgaGktd29yZCB0aGVuIHN0b3AuCiAJICovCiAKLQl3aGlsZSAoLS1sb29wX2xpbWl0KSB7CisJZG8gewogCQkqbXN3ID0gcmVhZGwodGltZXJfYmFzZSArIEtPTkFfR1BUSU1FUl9TVENISV9PRkZTRVQpOwogCQkqbHN3ID0gcmVhZGwodGltZXJfYmFzZSArIEtPTkFfR1BUSU1FUl9TVENMT19PRkZTRVQpOwogCQlpZiAoKm1zdyA9PSByZWFkbCh0aW1lcl9iYXNlICsgS09OQV9HUFRJTUVSX1NUQ0hJX09GRlNFVCkpCiAJCQlicmVhazsKLQl9CisJfSB3aGlsZSAoLS1sb29wX2xpbWl0KTsKIAlpZiAoIWxvb3BfbGltaXQpIHsKIAkJcHJfZXJyKCJiY21fa29uYV90aW1lcjogZ2V0dGluZyBjb3VudGVyIGZhaWxlZC5cbiIpOwogCQlwcl9lcnIoIiBUaW1lciB3aWxsIGJlIGltcGFjdGVkXG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CiAJfQogCi0JcmV0dXJuOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGtvbmFfdGltZXJfc2V0X25leHRfZXZlbnQodW5zaWduZWQgbG9uZyBjbGMsCkBAIC0xMTIsOCArMTEzLDExIEBACiAKIAl1aW50MzJfdCBsc3csIG1zdzsKIAl1aW50MzJfdCByZWc7CisJaW50IHJldDsKIAotCWtvbmFfdGltZXJfZ2V0X2NvdW50ZXIodGltZXJzLnRtcl9yZWdzLCAmbXN3LCAmbHN3KTsKKwlyZXQgPSBrb25hX3RpbWVyX2dldF9jb3VudGVyKHRpbWVycy50bXJfcmVncywgJm1zdywgJmxzdyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCS8qIExvYWQgdGhlICJuZXh0IiBldmVudCB0aWNrIHZhbHVlICovCiAJd3JpdGVsKGxzdyArIGNsYywgdGltZXJzLnRtcl9yZWdzICsgS09OQV9HUFRJTUVSX1NUQ00wX09GRlNFVCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL21pcHMtZ2ljLXRpbWVyLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL21pcHMtZ2ljLXRpbWVyLmMKaW5kZXggZDkxZTg3Mi4uN2E5NjBjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS9taXBzLWdpYy10aW1lci5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvbWlwcy1naWMtdGltZXIuYwpAQCAtMTA5LDEyICsxMDksMTUgQEAKIHsKIAlpbnQgcmV0OwogCi0JaWYgKCFjcHVfaGFzX2NvdW50ZXIgfHwgIWdpY19mcmVxdWVuY3kpCisJaWYgKCFnaWNfZnJlcXVlbmN5KQogCQlyZXR1cm4gLUVOWElPOwogCiAJcmV0ID0gc2V0dXBfcGVyY3B1X2lycShnaWNfdGltZXJfaXJxLCAmZ2ljX2NvbXBhcmVfaXJxYWN0aW9uKTsKLQlpZiAocmV0IDwgMCkKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIkdJQyB0aW1lciBJUlEgJWQgc2V0dXAgZmFpbGVkOiAlZFxuIiwKKwkJICAgICAgIGdpY190aW1lcl9pcnEsIHJldCk7CiAJCXJldHVybiByZXQ7CisJfQogCiAJY3B1aHBfc2V0dXBfc3RhdGUoQ1BVSFBfQVBfTUlQU19HSUNfVElNRVJfU1RBUlRJTkcsCiAJCQkgICJBUF9NSVBTX0dJQ19USU1FUl9TVEFSVElORyIsIGdpY19zdGFydGluZ19jcHUsCkBAIC0xNjQsNyArMTY3LDcgQEAKIAlnaWNfc3RhcnRfY291bnQoKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGdpY19jbG9ja3NvdXJjZV9vZl9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3N0YXRpYyBpbnQgX19pbml0IGdpY19jbG9ja3NvdXJjZV9vZl9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKIHsKIAlzdHJ1Y3QgY2xrICpjbGs7CiAJaW50IHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvbW94YXJ0X3RpbWVyLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL21veGFydF90aW1lci5jCmluZGV4IDg0MTQ1NDQuLjJhOGY0NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvbW94YXJ0X3RpbWVyLmMKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9tb3hhcnRfdGltZXIuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNkZWZpbmUgVElNRVIxX0JBU0UJCTB4MDAKICNkZWZpbmUgVElNRVIyX0JBU0UJCTB4MTAKQEAgLTM2LDc1ICszNywxMDkgQEAKICNkZWZpbmUgVElNRVJfSU5UUl9NQVNLCQkweDM4CiAKIC8qCi0gKiBUSU1FUl9DUiBmbGFnczoKKyAqIE1veGFydCBUSU1FUl9DUiBmbGFnczoKICAqCi0gKiBUSU1FUkVHX0NSXypfQ0xPQ0sJMDogUENMSywgMTogRVhUMUNMSwotICogVElNRVJFR19DUl8qX0lOVAlvdmVyZmxvdyBpbnRlcnJ1cHQgZW5hYmxlIGJpdAorICogTU9YQVJUX0NSXypfQ0xPQ0sJMDogUENMSywgMTogRVhUMUNMSworICogTU9YQVJUX0NSXypfSU5UCW92ZXJmbG93IGludGVycnVwdCBlbmFibGUgYml0CiAgKi8KLSNkZWZpbmUgVElNRVJFR19DUl8xX0VOQUJMRQlCSVQoMCkKLSNkZWZpbmUgVElNRVJFR19DUl8xX0NMT0NLCUJJVCgxKQotI2RlZmluZSBUSU1FUkVHX0NSXzFfSU5UCUJJVCgyKQotI2RlZmluZSBUSU1FUkVHX0NSXzJfRU5BQkxFCUJJVCgzKQotI2RlZmluZSBUSU1FUkVHX0NSXzJfQ0xPQ0sJQklUKDQpCi0jZGVmaW5lIFRJTUVSRUdfQ1JfMl9JTlQJQklUKDUpCi0jZGVmaW5lIFRJTUVSRUdfQ1JfM19FTkFCTEUJQklUKDYpCi0jZGVmaW5lIFRJTUVSRUdfQ1JfM19DTE9DSwlCSVQoNykKLSNkZWZpbmUgVElNRVJFR19DUl8zX0lOVAlCSVQoOCkKLSNkZWZpbmUgVElNRVJFR19DUl9DT1VOVF9VUAlCSVQoOSkKKyNkZWZpbmUgTU9YQVJUX0NSXzFfRU5BQkxFCUJJVCgwKQorI2RlZmluZSBNT1hBUlRfQ1JfMV9DTE9DSwlCSVQoMSkKKyNkZWZpbmUgTU9YQVJUX0NSXzFfSU5UCUJJVCgyKQorI2RlZmluZSBNT1hBUlRfQ1JfMl9FTkFCTEUJQklUKDMpCisjZGVmaW5lIE1PWEFSVF9DUl8yX0NMT0NLCUJJVCg0KQorI2RlZmluZSBNT1hBUlRfQ1JfMl9JTlQJQklUKDUpCisjZGVmaW5lIE1PWEFSVF9DUl8zX0VOQUJMRQlCSVQoNikKKyNkZWZpbmUgTU9YQVJUX0NSXzNfQ0xPQ0sJQklUKDcpCisjZGVmaW5lIE1PWEFSVF9DUl8zX0lOVAlCSVQoOCkKKyNkZWZpbmUgTU9YQVJUX0NSX0NPVU5UX1VQCUJJVCg5KQogCi0jZGVmaW5lIFRJTUVSMV9FTkFCTEUJCShUSU1FUkVHX0NSXzJfRU5BQkxFIHwgVElNRVJFR19DUl8xX0VOQUJMRSkKLSNkZWZpbmUgVElNRVIxX0RJU0FCTEUJCShUSU1FUkVHX0NSXzJfRU5BQkxFKQorI2RlZmluZSBNT1hBUlRfVElNRVIxX0VOQUJMRQkoTU9YQVJUX0NSXzJfRU5BQkxFIHwgTU9YQVJUX0NSXzFfRU5BQkxFKQorI2RlZmluZSBNT1hBUlRfVElNRVIxX0RJU0FCTEUJKE1PWEFSVF9DUl8yX0VOQUJMRSkKIAotc3RhdGljIHZvaWQgX19pb21lbSAqYmFzZTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY2xvY2tfY291bnRfcGVyX3RpY2s7CisvKgorICogVGhlIEFTcGVlZCB2YXJpYW50IG9mIHRoZSBJUCBibG9jayBoYXMgYSBkaWZmZXJlbnQgbGF5b3V0CisgKiBmb3IgdGhlIGNvbnRyb2wgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBBU1BFRURfQ1JfMV9FTkFCTEUJQklUKDApCisjZGVmaW5lIEFTUEVFRF9DUl8xX0NMT0NLCUJJVCgxKQorI2RlZmluZSBBU1BFRURfQ1JfMV9JTlQJCUJJVCgyKQorI2RlZmluZSBBU1BFRURfQ1JfMl9FTkFCTEUJQklUKDQpCisjZGVmaW5lIEFTUEVFRF9DUl8yX0NMT0NLCUJJVCg1KQorI2RlZmluZSBBU1BFRURfQ1JfMl9JTlQJCUJJVCg2KQorI2RlZmluZSBBU1BFRURfQ1JfM19FTkFCTEUJQklUKDgpCisjZGVmaW5lIEFTUEVFRF9DUl8zX0NMT0NLCUJJVCg5KQorI2RlZmluZSBBU1BFRURfQ1JfM19JTlQJCUJJVCgxMCkKKworI2RlZmluZSBBU1BFRURfVElNRVIxX0VOQUJMRSAgIChBU1BFRURfQ1JfMl9FTkFCTEUgfCBBU1BFRURfQ1JfMV9FTkFCTEUpCisjZGVmaW5lIEFTUEVFRF9USU1FUjFfRElTQUJMRSAgKEFTUEVFRF9DUl8yX0VOQUJMRSkKKworc3RydWN0IG1veGFydF90aW1lciB7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXVuc2lnbmVkIGludCB0MV9kaXNhYmxlX3ZhbDsKKwl1bnNpZ25lZCBpbnQgdDFfZW5hYmxlX3ZhbDsKKwl1bnNpZ25lZCBpbnQgY291bnRfcGVyX3RpY2s7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSBjbGtldnQ7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtb3hhcnRfdGltZXIgKnRvX21veGFydChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihldnQsIHN0cnVjdCBtb3hhcnRfdGltZXIsIGNsa2V2dCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtb3hhcnRfZGlzYWJsZShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJc3RydWN0IG1veGFydF90aW1lciAqdGltZXIgPSB0b19tb3hhcnQoZXZ0KTsKKworCXdyaXRlbCh0aW1lci0+dDFfZGlzYWJsZV92YWwsIHRpbWVyLT5iYXNlICsgVElNRVJfQ1IpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbW94YXJ0X2VuYWJsZShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJc3RydWN0IG1veGFydF90aW1lciAqdGltZXIgPSB0b19tb3hhcnQoZXZ0KTsKKworCXdyaXRlbCh0aW1lci0+dDFfZW5hYmxlX3ZhbCwgdGltZXItPmJhc2UgKyBUSU1FUl9DUik7Cit9CiAKIHN0YXRpYyBpbnQgbW94YXJ0X3NodXRkb3duKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKIHsKLQl3cml0ZWwoVElNRVIxX0RJU0FCTEUsIGJhc2UgKyBUSU1FUl9DUik7CisJbW94YXJ0X2Rpc2FibGUoZXZ0KTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBtb3hhcnRfc2V0X29uZXNob3Qoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQogewotCXdyaXRlbChUSU1FUjFfRElTQUJMRSwgYmFzZSArIFRJTUVSX0NSKTsKLQl3cml0ZWwofjAsIGJhc2UgKyBUSU1FUjFfQkFTRSArIFJFR19MT0FEKTsKKwltb3hhcnRfZGlzYWJsZShldnQpOworCXdyaXRlbCh+MCwgdG9fbW94YXJ0KGV2dCktPmJhc2UgKyBUSU1FUjFfQkFTRSArIFJFR19MT0FEKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBtb3hhcnRfc2V0X3BlcmlvZGljKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKIHsKLQl3cml0ZWwoY2xvY2tfY291bnRfcGVyX3RpY2ssIGJhc2UgKyBUSU1FUjFfQkFTRSArIFJFR19MT0FEKTsKLQl3cml0ZWwoVElNRVIxX0VOQUJMRSwgYmFzZSArIFRJTUVSX0NSKTsKKwlzdHJ1Y3QgbW94YXJ0X3RpbWVyICp0aW1lciA9IHRvX21veGFydChldnQpOworCisJbW94YXJ0X2Rpc2FibGUoZXZ0KTsKKwl3cml0ZWwodGltZXItPmNvdW50X3Blcl90aWNrLCB0aW1lci0+YmFzZSArIFRJTUVSMV9CQVNFICsgUkVHX0xPQUQpOworCXdyaXRlbCgwLCB0aW1lci0+YmFzZSArIFRJTUVSMV9CQVNFICsgUkVHX01BVENIMSk7CisJbW94YXJ0X2VuYWJsZShldnQpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG1veGFydF9jbGtldnRfbmV4dF9ldmVudCh1bnNpZ25lZCBsb25nIGN5Y2xlcywKLQkJCQkgICAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqdW51c2VkKQorCQkJCSAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCiB7CisJc3RydWN0IG1veGFydF90aW1lciAqdGltZXIgPSB0b19tb3hhcnQoZXZ0KTsKIAl1MzIgdTsKIAotCXdyaXRlbChUSU1FUjFfRElTQUJMRSwgYmFzZSArIFRJTUVSX0NSKTsKKwltb3hhcnRfZGlzYWJsZShldnQpOwogCi0JdSA9IHJlYWRsKGJhc2UgKyBUSU1FUjFfQkFTRSArIFJFR19DT1VOVCkgLSBjeWNsZXM7Ci0Jd3JpdGVsKHUsIGJhc2UgKyBUSU1FUjFfQkFTRSArIFJFR19NQVRDSDEpOworCXUgPSByZWFkbCh0aW1lci0+YmFzZSArIFRJTUVSMV9CQVNFICsgUkVHX0NPVU5UKSAtIGN5Y2xlczsKKwl3cml0ZWwodSwgdGltZXItPmJhc2UgKyBUSU1FUjFfQkFTRSArIFJFR19NQVRDSDEpOwogCi0Jd3JpdGVsKFRJTUVSMV9FTkFCTEUsIGJhc2UgKyBUSU1FUl9DUik7CisJbW94YXJ0X2VuYWJsZShldnQpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIG1veGFydF9jbG9ja2V2ZW50ID0gewotCS5uYW1lCQkJPSAibW94YXJ0X3RpbWVyIiwKLQkucmF0aW5nCQkJPSAyMDAsCi0JLmZlYXR1cmVzCQk9IENMT0NLX0VWVF9GRUFUX1BFUklPRElDIHwKLQkJCQkgIENMT0NLX0VWVF9GRUFUX09ORVNIT1QsCi0JLnNldF9zdGF0ZV9zaHV0ZG93bgk9IG1veGFydF9zaHV0ZG93biwKLQkuc2V0X3N0YXRlX3BlcmlvZGljCT0gbW94YXJ0X3NldF9wZXJpb2RpYywKLQkuc2V0X3N0YXRlX29uZXNob3QJPSBtb3hhcnRfc2V0X29uZXNob3QsCi0JLnRpY2tfcmVzdW1lCQk9IG1veGFydF9zZXRfb25lc2hvdCwKLQkuc2V0X25leHRfZXZlbnQJCT0gbW94YXJ0X2Nsa2V2dF9uZXh0X2V2ZW50LAotfTsKLQogc3RhdGljIGlycXJldHVybl90IG1veGFydF90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCA9IGRldl9pZDsKQEAgLTExMiwyMSArMTQ3LDE5IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiBtb3hhcnRfdGltZXJfaXJxID0gewotCS5uYW1lCQk9ICJtb3hhcnQtdGltZXIiLAotCS5mbGFncwkJPSBJUlFGX1RJTUVSLAotCS5oYW5kbGVyCT0gbW94YXJ0X3RpbWVyX2ludGVycnVwdCwKLQkuZGV2X2lkCQk9ICZtb3hhcnRfY2xvY2tldmVudCwKLX07Ci0KIHN0YXRpYyBpbnQgX19pbml0IG1veGFydF90aW1lcl9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKIHsKIAlpbnQgcmV0LCBpcnE7CiAJdW5zaWduZWQgbG9uZyBwY2xrOwogCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgbW94YXJ0X3RpbWVyICp0aW1lcjsKIAotCWJhc2UgPSBvZl9pb21hcChub2RlLCAwKTsKLQlpZiAoIWJhc2UpIHsKKwl0aW1lciA9IGt6YWxsb2Moc2l6ZW9mKCp0aW1lciksIEdGUF9LRVJORUwpOworCWlmICghdGltZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJdGltZXItPmJhc2UgPSBvZl9pb21hcChub2RlLCAwKTsKKwlpZiAoIXRpbWVyLT5iYXNlKSB7CiAJCXByX2VycigiJXM6IG9mX2lvbWFwIGZhaWxlZFxuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CkBAIC0xMzcsMTIgKzE3MCw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJldCA9IHNldHVwX2lycShpcnEsICZtb3hhcnRfdGltZXJfaXJxKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IHNldHVwX2lycSBmYWlsZWRcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJY2xrID0gb2ZfY2xrX2dldChub2RlLCAwKTsKIAlpZiAoSVNfRVJSKGNsaykpICB7CiAJCXByX2VycigiJXM6IG9mX2Nsa19nZXQgZmFpbGVkXG4iLCBub2RlLT5mdWxsX25hbWUpOwpAQCAtMTUxLDcgKzE3OCwzMiBAQAogCiAJcGNsayA9IGNsa19nZXRfcmF0ZShjbGspOwogCi0JcmV0ID0gY2xvY2tzb3VyY2VfbW1pb19pbml0KGJhc2UgKyBUSU1FUjJfQkFTRSArIFJFR19DT1VOVCwKKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobm9kZSwgIm1veGEsbW94YXJ0LXRpbWVyIikpIHsKKwkJdGltZXItPnQxX2VuYWJsZV92YWwgPSBNT1hBUlRfVElNRVIxX0VOQUJMRTsKKwkJdGltZXItPnQxX2Rpc2FibGVfdmFsID0gTU9YQVJUX1RJTUVSMV9ESVNBQkxFOworCX0gZWxzZSBpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobm9kZSwgImFzcGVlZCxhc3QyNDAwLXRpbWVyIikpIHsKKwkJdGltZXItPnQxX2VuYWJsZV92YWwgPSBBU1BFRURfVElNRVIxX0VOQUJMRTsKKwkJdGltZXItPnQxX2Rpc2FibGVfdmFsID0gQVNQRUVEX1RJTUVSMV9ESVNBQkxFOworCX0gZWxzZSB7CisJCXByX2VycigiJXM6IHVua25vd24gcGxhdGZvcm1cbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXRpbWVyLT5jb3VudF9wZXJfdGljayA9IERJVl9ST1VORF9DTE9TRVNUKHBjbGssIEhaKTsKKworCXRpbWVyLT5jbGtldnQubmFtZSA9IG5vZGUtPm5hbWU7CisJdGltZXItPmNsa2V2dC5yYXRpbmcgPSAyMDA7CisJdGltZXItPmNsa2V2dC5mZWF0dXJlcyA9IENMT0NLX0VWVF9GRUFUX1BFUklPRElDIHwKKwkJCQkJQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVDsKKwl0aW1lci0+Y2xrZXZ0LnNldF9zdGF0ZV9zaHV0ZG93biA9IG1veGFydF9zaHV0ZG93bjsKKwl0aW1lci0+Y2xrZXZ0LnNldF9zdGF0ZV9wZXJpb2RpYyA9IG1veGFydF9zZXRfcGVyaW9kaWM7CisJdGltZXItPmNsa2V2dC5zZXRfc3RhdGVfb25lc2hvdCA9IG1veGFydF9zZXRfb25lc2hvdDsKKwl0aW1lci0+Y2xrZXZ0LnRpY2tfcmVzdW1lID0gbW94YXJ0X3NldF9vbmVzaG90OworCXRpbWVyLT5jbGtldnQuc2V0X25leHRfZXZlbnQgPSBtb3hhcnRfY2xrZXZ0X25leHRfZXZlbnQ7CisJdGltZXItPmNsa2V2dC5jcHVtYXNrID0gY3B1bWFza19vZigwKTsKKwl0aW1lci0+Y2xrZXZ0LmlycSA9IGlycTsKKworCXJldCA9IGNsb2Nrc291cmNlX21taW9faW5pdCh0aW1lci0+YmFzZSArIFRJTUVSMl9CQVNFICsgUkVHX0NPVU5ULAogCQkJCSAgICAibW94YXJ0X3RpbWVyIiwgcGNsaywgMjAwLCAzMiwKIAkJCQkgICAgY2xvY2tzb3VyY2VfbW1pb19yZWFkbF9kb3duKTsKIAlpZiAocmV0KSB7CkBAIC0xNTksMTMgKzIxMSwyNiBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCWNsb2NrX2NvdW50X3Blcl90aWNrID0gRElWX1JPVU5EX0NMT1NFU1QocGNsaywgSFopOworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgbW94YXJ0X3RpbWVyX2ludGVycnVwdCwgSVJRRl9USU1FUiwKKwkJCSAgbm9kZS0+bmFtZSwgJnRpbWVyLT5jbGtldnQpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogc2V0dXBfaXJxIGZhaWxlZFxuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKKwkJcmV0dXJuIHJldDsKKwl9CiAKLQl3cml0ZWwofjAsIGJhc2UgKyBUSU1FUjJfQkFTRSArIFJFR19MT0FEKTsKLQl3cml0ZWwoVElNRVJFR19DUl8yX0VOQUJMRSwgYmFzZSArIFRJTUVSX0NSKTsKKwkvKiBDbGVhciBtYXRjaCByZWdpc3RlcnMgKi8KKwl3cml0ZWwoMCwgdGltZXItPmJhc2UgKyBUSU1FUjFfQkFTRSArIFJFR19NQVRDSDEpOworCXdyaXRlbCgwLCB0aW1lci0+YmFzZSArIFRJTUVSMV9CQVNFICsgUkVHX01BVENIMik7CisJd3JpdGVsKDAsIHRpbWVyLT5iYXNlICsgVElNRVIyX0JBU0UgKyBSRUdfTUFUQ0gxKTsKKwl3cml0ZWwoMCwgdGltZXItPmJhc2UgKyBUSU1FUjJfQkFTRSArIFJFR19NQVRDSDIpOwogCi0JbW94YXJ0X2Nsb2NrZXZlbnQuY3B1bWFzayA9IGNwdW1hc2tfb2YoMCk7Ci0JbW94YXJ0X2Nsb2NrZXZlbnQuaXJxID0gaXJxOworCS8qCisJICogU3RhcnQgdGltZXIgMiByb2xsaW5nIGFzIG91ciBtYWluIHdhbGwgY2xvY2sgc291cmNlLCBrZWVwIHRpbWVyIDEKKwkgKiBkaXNhYmxlZAorCSAqLworCXdyaXRlbCgwLCB0aW1lci0+YmFzZSArIFRJTUVSX0NSKTsKKwl3cml0ZWwofjAsIHRpbWVyLT5iYXNlICsgVElNRVIyX0JBU0UgKyBSRUdfTE9BRCk7CisJd3JpdGVsKHRpbWVyLT50MV9kaXNhYmxlX3ZhbCwgdGltZXItPmJhc2UgKyBUSU1FUl9DUik7CiAKIAkvKgogCSAqIGRvY3VtZW50YXRpb24gaXMgbm90IHB1YmxpY2x5IGF2YWlsYWJsZToKQEAgLTE3Myw5ICsyMzgsOSBAQAogCSAqIG1heF9kZWx0YSAweGZmZmZmZmZlIHNob3VsZCBiZSBvayBiZWNhdXNlIGNvdW50CiAJICogcmVnaXN0ZXIgc2l6ZSBpcyB1MzIKIAkgKi8KLQljbG9ja2V2ZW50c19jb25maWdfYW5kX3JlZ2lzdGVyKCZtb3hhcnRfY2xvY2tldmVudCwgcGNsaywKLQkJCQkJMHg0LCAweGZmZmZmZmZlKTsKKwljbG9ja2V2ZW50c19jb25maWdfYW5kX3JlZ2lzdGVyKCZ0aW1lci0+Y2xrZXZ0LCBwY2xrLCAweDQsIDB4ZmZmZmZmZmUpOwogCiAJcmV0dXJuIDA7CiB9CiBDTE9DS1NPVVJDRV9PRl9ERUNMQVJFKG1veGFydCwgIm1veGEsbW94YXJ0LXRpbWVyIiwgbW94YXJ0X3RpbWVyX2luaXQpOworQ0xPQ0tTT1VSQ0VfT0ZfREVDTEFSRShhc3BlZWQsICJhc3BlZWQsYXN0MjQwMC10aW1lciIsIG1veGFydF90aW1lcl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvcHhhX3RpbWVyLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3B4YV90aW1lci5jCmluZGV4IDkzN2UxMGIuLjNlMWNiNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvcHhhX3RpbWVyLmMKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9weGFfdGltZXIuYwpAQCAtMjEsNiArMjEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkX2Nsb2NrLmg+CiAKKyNpbmNsdWRlIDxjbG9ja3NvdXJjZS9weGEuaD4KKwogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogCiAjZGVmaW5lIE9TTVIwCQkweDAwCS8qIE9TIFRpbWVyIDAgTWF0Y2ggUmVnaXN0ZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc3VuNGlfdGltZXIuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc3VuNGlfdGltZXIuYwppbmRleCA5NzY2OWVlLi5jODM0NTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3N1bjRpX3RpbWVyLmMKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9zdW40aV90aW1lci5jCkBAIC0xMjMsMTIgKzEyMywxNiBAQAogCS5zZXRfbmV4dF9ldmVudCA9IHN1bjRpX2Nsa2V2dF9uZXh0X2V2ZW50LAogfTsKIAorc3RhdGljIHZvaWQgc3VuNGlfdGltZXJfY2xlYXJfaW50ZXJydXB0KHZvaWQpCit7CisJd3JpdGVsKFRJTUVSX0lSUV9FTigwKSwgdGltZXJfYmFzZSArIFRJTUVSX0lSUV9TVF9SRUcpOworfQogCiBzdGF0aWMgaXJxcmV0dXJuX3Qgc3VuNGlfdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQgPSAoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKWRldl9pZDsKIAotCXdyaXRlbCgweDEsIHRpbWVyX2Jhc2UgKyBUSU1FUl9JUlFfU1RfUkVHKTsKKwlzdW40aV90aW1lcl9jbGVhcl9pbnRlcnJ1cHQoKTsKIAlldnQtPmV2ZW50X2hhbmRsZXIoZXZ0KTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKQEAgLTIwOCw2ICsyMTIsOSBAQAogCS8qIE1ha2Ugc3VyZSB0aW1lciBpcyBzdG9wcGVkIGJlZm9yZSBwbGF5aW5nIHdpdGggaW50ZXJydXB0cyAqLwogCXN1bjRpX2Nsa2V2dF90aW1lX3N0b3AoMCk7CiAKKwkvKiBjbGVhciB0aW1lcjAgaW50ZXJydXB0ICovCisJc3VuNGlfdGltZXJfY2xlYXJfaW50ZXJydXB0KCk7CisKIAlzdW40aV9jbG9ja2V2ZW50LmNwdW1hc2sgPSBjcHVfcG9zc2libGVfbWFzazsKIAlzdW40aV9jbG9ja2V2ZW50LmlycSA9IGlycTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lLWFybWFkYS0zNzAteHAuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZS1hcm1hZGEtMzcwLXhwLmMKaW5kZXggNzE5YjQ3OC4uM2MzOWU2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lLWFybWFkYS0zNzAteHAuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWUtYXJtYWRhLTM3MC14cC5jCkBAIC0zMzgsNyArMzM4LDYgQEAKIAlzdHJ1Y3QgY2xrICpjbGsgPSBvZl9jbGtfZ2V0X2J5X25hbWUobnAsICJmaXhlZCIpOwogCWludCByZXQ7CiAKLQljbGsgPSBvZl9jbGtfZ2V0KG5wLCAwKTsKIAlpZiAoSVNfRVJSKGNsaykpIHsKIAkJcHJfZXJyKCJGYWlsZWQgdG8gZ2V0IGNsb2NrIik7CiAJCXJldHVybiBQVFJfRVJSKGNsayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWUtcGlzdGFjaGlvLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWUtcGlzdGFjaGlvLmMKaW5kZXggYTdkOWEwOC4uYThlNmM3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lLXBpc3RhY2hpby5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZS1waXN0YWNoaW8uYwpAQCAtMjAyLDEwICsyMDIsMTAgQEAKIAlyYXRlID0gY2xrX2dldF9yYXRlKGZhc3RfY2xrKTsKIAogCS8qIERpc2FibGUgaXJxJ3MgZm9yIGNsb2Nrc291cmNlIHVzYWdlICovCi0JZ3B0X3dyaXRlbCgmcGNzX2dwdC5iYXNlLCAwLCBUSU1FUl9JUlFfTUFTSywgMCk7Ci0JZ3B0X3dyaXRlbCgmcGNzX2dwdC5iYXNlLCAwLCBUSU1FUl9JUlFfTUFTSywgMSk7Ci0JZ3B0X3dyaXRlbCgmcGNzX2dwdC5iYXNlLCAwLCBUSU1FUl9JUlFfTUFTSywgMik7Ci0JZ3B0X3dyaXRlbCgmcGNzX2dwdC5iYXNlLCAwLCBUSU1FUl9JUlFfTUFTSywgMyk7CisJZ3B0X3dyaXRlbChwY3NfZ3B0LmJhc2UsIDAsIFRJTUVSX0lSUV9NQVNLLCAwKTsKKwlncHRfd3JpdGVsKHBjc19ncHQuYmFzZSwgMCwgVElNRVJfSVJRX01BU0ssIDEpOworCWdwdF93cml0ZWwocGNzX2dwdC5iYXNlLCAwLCBUSU1FUl9JUlFfTUFTSywgMik7CisJZ3B0X3dyaXRlbChwY3NfZ3B0LmJhc2UsIDAsIFRJTUVSX0lSUV9NQVNLLCAzKTsKIAogCS8qIEVuYWJsZSB0aW1lciBibG9jayAqLwogCXdyaXRlbChUSU1FUl9NRV9HTE9CQUwsIHBjc19ncHQuYmFzZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWVyLWF0bWVsLXBpdC5jIGIvZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lci1hdG1lbC1waXQuYwppbmRleCAxZmZhYzBjLi42NTU1ODIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWVyLWF0bWVsLXBpdC5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZXItYXRtZWwtcGl0LmMKQEAgLTE0OSwyNCArMTQ5LDEzIEBACiB7CiAJc3RydWN0IHBpdF9kYXRhICpkYXRhID0gZGV2X2lkOwogCi0JLyoKLQkgKiBpcnFzIHNob3VsZCBiZSBkaXNhYmxlZCBoZXJlLCBidXQgYXMgdGhlIGlycSBpcyBzaGFyZWQgdGhleSBhcmUgb25seQotCSAqIGd1YXJhbnRlZWQgdG8gYmUgb2ZmIGlmIHRoZSB0aW1lciBpcnEgaXMgcmVnaXN0ZXJlZCBmaXJzdC4KLQkgKi8KLQlXQVJOX09OX09OQ0UoIWlycXNfZGlzYWJsZWQoKSk7Ci0KIAkvKiBUaGUgUElUIGludGVycnVwdCBtYXkgYmUgZGlzYWJsZWQsIGFuZCBpcyBzaGFyZWQgKi8KIAlpZiAoY2xvY2tldmVudF9zdGF0ZV9wZXJpb2RpYygmZGF0YS0+Y2xrZXZ0KSAmJgogCSAgICAocGl0X3JlYWQoZGF0YS0+YmFzZSwgQVQ5MV9QSVRfU1IpICYgQVQ5MV9QSVRfUElUUykpIHsKLQkJdW5zaWduZWQgbnJfdGlja3M7Ci0KIAkJLyogR2V0IG51bWJlciBvZiB0aWNrcyBwZXJmb3JtZWQgYmVmb3JlIGlycSwgYW5kIGFjayBpdCAqLwotCQlucl90aWNrcyA9IFBJVF9QSUNOVChwaXRfcmVhZChkYXRhLT5iYXNlLCBBVDkxX1BJVF9QSVZSKSk7Ci0JCWRvIHsKLQkJCWRhdGEtPmNudCArPSBkYXRhLT5jeWNsZTsKLQkJCWRhdGEtPmNsa2V2dC5ldmVudF9oYW5kbGVyKCZkYXRhLT5jbGtldnQpOwotCQkJbnJfdGlja3MtLTsKLQkJfSB3aGlsZSAobnJfdGlja3MpOworCQlkYXRhLT5jbnQgKz0gZGF0YS0+Y3ljbGUgKiBQSVRfUElDTlQocGl0X3JlYWQoZGF0YS0+YmFzZSwKKwkJCQkJCQkgICAgICBBVDkxX1BJVF9QSVZSKSk7CisJCWRhdGEtPmNsa2V2dC5ldmVudF9oYW5kbGVyKCZkYXRhLT5jbGtldnQpOwogCiAJCXJldHVybiBJUlFfSEFORExFRDsKIAl9CkBAIC0xNzcsMTEgKzE2Niw0MSBAQAogLyoKICAqIFNldCB1cCBib3RoIGNsb2Nrc291cmNlIGFuZCBjbG9ja2V2ZW50IHN1cHBvcnQuCiAgKi8KLXN0YXRpYyBpbnQgX19pbml0IGF0OTFzYW05MjZ4X3BpdF9jb21tb25faW5pdChzdHJ1Y3QgcGl0X2RhdGEgKmRhdGEpCitzdGF0aWMgaW50IF9faW5pdCBhdDkxc2FtOTI2eF9waXRfZHRfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCiB7Ci0JdW5zaWduZWQgbG9uZwlwaXRfcmF0ZTsKLQl1bnNpZ25lZAliaXRzOwotCWludAkJcmV0OworCXVuc2lnbmVkIGxvbmcgICBwaXRfcmF0ZTsKKwl1bnNpZ25lZCAgICAgICAgYml0czsKKwlpbnQgICAgICAgICAgICAgcmV0OworCXN0cnVjdCBwaXRfZGF0YSAqZGF0YTsKKworCWRhdGEgPSBremFsbG9jKHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkYXRhLT5iYXNlID0gb2ZfaW9tYXAobm9kZSwgMCk7CisJaWYgKCFkYXRhLT5iYXNlKSB7CisJCXByX2VycigiQ291bGQgbm90IG1hcCBQSVQgYWRkcmVzc1xuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJZGF0YS0+bWNrID0gb2ZfY2xrX2dldChub2RlLCAwKTsKKwlpZiAoSVNfRVJSKGRhdGEtPm1jaykpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gZ2V0IG1jayBjbGtcbiIpOworCQlyZXR1cm4gUFRSX0VSUihkYXRhLT5tY2spOworCX0KKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShkYXRhLT5tY2spOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gZW5hYmxlIG1ja1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogR2V0IHRoZSBpbnRlcnJ1cHRzIHByb3BlcnR5ICovCisJZGF0YS0+aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobm9kZSwgMCk7CisJaWYgKCFkYXRhLT5pcnEpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gZ2V0IElSUSBmcm9tIERUXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJLyoKIAkgKiBVc2Ugb3VyIGFjdHVhbCBNQ0sgdG8gZmlndXJlIG91dCBob3cgbWFueSBNQ0svMTYgdGlja3MgcGVyCkBAIC0yMzYsMzkgKzI1NSw1IEBACiAKIAlyZXR1cm4gMDsKIH0KLQotc3RhdGljIGludCBfX2luaXQgYXQ5MXNhbTkyNnhfcGl0X2R0X2luaXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlKQotewotCXN0cnVjdCBwaXRfZGF0YSAqZGF0YTsKLQotCWRhdGEgPSBremFsbG9jKHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOwotCWlmICghZGF0YSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlkYXRhLT5iYXNlID0gb2ZfaW9tYXAobm9kZSwgMCk7Ci0JaWYgKCFkYXRhLT5iYXNlKSB7Ci0JCXByX2VycigiQ291bGQgbm90IG1hcCBQSVQgYWRkcmVzc1xuIik7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0JZGF0YS0+bWNrID0gb2ZfY2xrX2dldChub2RlLCAwKTsKLQlpZiAoSVNfRVJSKGRhdGEtPm1jaykpCi0JCS8qIEZhbGxiYWNrIG9uIGNsa2RldiBmb3IgIUNDRi1iYXNlZCBib2FyZHMgKi8KLQkJZGF0YS0+bWNrID0gY2xrX2dldChOVUxMLCAibWNrIik7Ci0KLQlpZiAoSVNfRVJSKGRhdGEtPm1jaykpIHsKLQkJcHJfZXJyKCJVbmFibGUgdG8gZ2V0IG1jayBjbGtcbiIpOwotCQlyZXR1cm4gUFRSX0VSUihkYXRhLT5tY2spOwotCX0KLQotCS8qIEdldCB0aGUgaW50ZXJydXB0cyBwcm9wZXJ0eSAqLwotCWRhdGEtPmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5vZGUsIDApOwotCWlmICghZGF0YS0+aXJxKSB7Ci0JCXByX2VycigiVW5hYmxlIHRvIGdldCBJUlEgZnJvbSBEVFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiBhdDkxc2FtOTI2eF9waXRfY29tbW9uX2luaXQoZGF0YSk7Ci19CiBDTE9DS1NPVVJDRV9PRl9ERUNMQVJFKGF0OTFzYW05MjZ4X3BpdCwgImF0bWVsLGF0OTFzYW05MjYwLXBpdCIsCiAJCSAgICAgICBhdDkxc2FtOTI2eF9waXRfZHRfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWVyLW94bmFzLXJwcy5jIGIvZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lci1veG5hcy1ycHMuYwppbmRleCBiZDg4N2UyLi5kNjMwYmY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWVyLW94bmFzLXJwcy5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZXItb3huYXMtcnBzLmMKQEAgLTI5NSwzICsyOTUsNSBAQAogCiBDTE9DS1NPVVJDRV9PRl9ERUNMQVJFKG94ODEwc2VfcnBzLAogCQkgICAgICAgIm94c2VtaSxveDgxMHNlLXJwcy10aW1lciIsIG94bmFzX3Jwc190aW1lcl9pbml0KTsKK0NMT0NLU09VUkNFX09GX0RFQ0xBUkUob3g4MjBfcnBzLAorCQkgICAgICAgIm94c2VtaSxveDgyMHNlLXJwcy10aW1lciIsIG94bmFzX3Jwc190aW1lcl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZXItdGktMzJrLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWVyLXRpLTMyay5jCmluZGV4IDkyYjdlMzkuLmNmNWIxNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZXItdGktMzJrLmMKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lci10aS0zMmsuYwpAQCAtNjUsNyArNjUsNyBAQAogCXJldHVybiBjb250YWluZXJfb2YoY3MsIHN0cnVjdCB0aV8zMmssIGNzKTsKIH0KIAotc3RhdGljIGN5Y2xlX3QgdGlfMzJrX3JlYWRfY3ljbGVzKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCitzdGF0aWMgY3ljbGVfdCBub3RyYWNlIHRpXzMya19yZWFkX2N5Y2xlcyhzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQogewogCXN0cnVjdCB0aV8zMmsgKnRpID0gdG9fdGlfMzJrKGNzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL0tjb25maWcgYi9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZwppbmRleCA3NDkxOWFhLi5kOGIxNjRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZworKysgYi9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZwpAQCAtMTk0LDcgKzE5NCw3IEBACiAJICBJZiBpbiBkb3VidCwgc2F5IE4uCiAKIGNvbmZpZyBDUFVfRlJFUV9HT1ZfU0NIRURVVElMCi0JdHJpc3RhdGUgIidzY2hlZHV0aWwnIGNwdWZyZXEgcG9saWN5IGdvdmVybm9yIgorCWJvb2wgIidzY2hlZHV0aWwnIGNwdWZyZXEgcG9saWN5IGdvdmVybm9yIgogCWRlcGVuZHMgb24gQ1BVX0ZSRVEgJiYgU01QCiAJc2VsZWN0IENQVV9GUkVRX0dPVl9BVFRSX1NFVAogCXNlbGVjdCBJUlFfV09SSwpAQCAtMjA4LDkgKzIwOCw2IEBACiAJICBmcmVxdWVuY3kgdGlwcGluZyBwb2ludCBpcyBhdCB1dGlsaXphdGlvbi9jYXBhY2l0eSBlcXVhbCB0byA4MCUgaW4KIAkgIGJvdGggY2FzZXMuCiAKLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbAotCSAgYmUgY2FsbGVkIGNwdWZyZXFfc2NoZWR1dGlsLgotCiAJICBJZiBpbiBkb3VidCwgc2F5IE4uCiAKIGNvbW1lbnQgIkNQVSBmcmVxdWVuY3kgc2NhbGluZyBkcml2ZXJzIgpAQCAtMjI1LDcgKzIyMiw3IEBACiAJaGVscAogCSAgVGhpcyBhZGRzIGEgZ2VuZXJpYyBEVCBiYXNlZCBjcHVmcmVxIGRyaXZlciBmb3IgZnJlcXVlbmN5IG1hbmFnZW1lbnQuCiAJICBJdCBzdXBwb3J0cyBib3RoIHVuaXByb2Nlc3NvciAoVVApIGFuZCBzeW1tZXRyaWMgbXVsdGlwcm9jZXNzb3IgKFNNUCkKLQkgIHN5c3RlbXMgd2hpY2ggc2hhcmUgY2xvY2sgYW5kIHZvbHRhZ2UgYWNyb3NzIGFsbCBDUFVzLgorCSAgc3lzdGVtcy4KIAogCSAgSWYgaW4gZG91YnQsIHNheSBOLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvY3BwY19jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3BwY19jcHVmcmVxLmMKaW5kZXggODg4MmI4ZS4uMWIyZjI4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwcGNfY3B1ZnJlcS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHBjX2NwdWZyZXEuYwpAQCAtMTksMTAgKzE5LDE5IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogCisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCiAjaW5jbHVkZSA8YWNwaS9jcHBjX2FjcGkuaD4KIAorLyogTWluaW11bSBzdHJ1Y3QgbGVuZ3RoIG5lZWRlZCBmb3IgdGhlIERNSSBwcm9jZXNzb3IgZW50cnkgd2Ugd2FudCAqLworI2RlZmluZSBETUlfRU5UUllfUFJPQ0VTU09SX01JTl9MRU5HVEgJNDgKKworLyogT2ZmZXN0IGluIHRoZSBETUkgcHJvY2Vzc29yIHN0cnVjdHVyZSBmb3IgdGhlIG1heCBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgRE1JX1BST0NFU1NPUl9NQVhfU1BFRUQgIDB4MTQKKwogLyoKICAqIFRoZXNlIHN0cnVjdHMgY29udGFpbiBpbmZvcm1hdGlvbiBwYXJzZWQgZnJvbSBwZXIgQ1BVCiAgKiBBQ1BJIF9DUEMgc3RydWN0dXJlcy4KQEAgLTMwLDE5ICszOSw1MiBAQAogICogcGVyZm9ybWFuY2UgY2FwYWJpbGl0aWVzLCBkZXNpcmVkIHBlcmZvcm1hbmNlIGxldmVsCiAgKiByZXF1ZXN0ZWQgZXRjLgogICovCi1zdGF0aWMgc3RydWN0IGNwdWRhdGEgKiphbGxfY3B1X2RhdGE7CitzdGF0aWMgc3RydWN0IGNwcGNfY3B1ZGF0YSAqKmFsbF9jcHVfZGF0YTsKKworLyogQ2FwdHVyZSB0aGUgbWF4IEtIeiBmcm9tIERNSSAqLworc3RhdGljIHU2NCBjcHBjX2RtaV9tYXhfa2h6OworCisvKiBDYWxsYmFjayBmdW5jdGlvbiB1c2VkIHRvIHJldHJpZXZlIHRoZSBtYXggZnJlcXVlbmN5IGZyb20gRE1JICovCitzdGF0aWMgdm9pZCBjcHBjX2ZpbmRfZG1pX21oeihjb25zdCBzdHJ1Y3QgZG1pX2hlYWRlciAqZG0sIHZvaWQgKnByaXZhdGUpCit7CisJY29uc3QgdTggKmRtaV9kYXRhID0gKGNvbnN0IHU4ICopZG07CisJdTE2ICptaHogPSAodTE2ICopcHJpdmF0ZTsKKworCWlmIChkbS0+dHlwZSA9PSBETUlfRU5UUllfUFJPQ0VTU09SICYmCisJICAgIGRtLT5sZW5ndGggPj0gRE1JX0VOVFJZX1BST0NFU1NPUl9NSU5fTEVOR1RIKSB7CisJCXUxNiB2YWwgPSAodTE2KWdldF91bmFsaWduZWQoKGNvbnN0IHUxNiAqKQorCQkJCShkbWlfZGF0YSArIERNSV9QUk9DRVNTT1JfTUFYX1NQRUVEKSk7CisJCSptaHogPSB2YWwgPiAqbWh6ID8gdmFsIDogKm1oejsKKwl9Cit9CisKKy8qIExvb2sgdXAgdGhlIG1heCBmcmVxdWVuY3kgaW4gRE1JICovCitzdGF0aWMgdTY0IGNwcGNfZ2V0X2RtaV9tYXhfa2h6KHZvaWQpCit7CisJdTE2IG1oeiA9IDA7CisKKwlkbWlfd2FsayhjcHBjX2ZpbmRfZG1pX21oeiwgJm1oeik7CisKKwkvKgorCSAqIFJlYWwgc3R1cGlkIGZhbGxiYWNrIHZhbHVlLCBqdXN0IGluIGNhc2UgdGhlcmUgaXMgbm8KKwkgKiBhY3R1YWwgdmFsdWUgc2V0LgorCSAqLworCW1oeiA9IG1oeiA/IG1oeiA6IDE7CisKKwlyZXR1cm4gKDEwMDAgKiBtaHopOworfQogCiBzdGF0aWMgaW50IGNwcGNfY3B1ZnJlcV9zZXRfdGFyZ2V0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAogCQl1bnNpZ25lZCBpbnQgdGFyZ2V0X2ZyZXEsCiAJCXVuc2lnbmVkIGludCByZWxhdGlvbikKIHsKLQlzdHJ1Y3QgY3B1ZGF0YSAqY3B1OworCXN0cnVjdCBjcHBjX2NwdWRhdGEgKmNwdTsKIAlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyBmcmVxczsKIAlpbnQgcmV0ID0gMDsKIAogCWNwdSA9IGFsbF9jcHVfZGF0YVtwb2xpY3ktPmNwdV07CiAKLQljcHUtPnBlcmZfY3RybHMuZGVzaXJlZF9wZXJmID0gdGFyZ2V0X2ZyZXE7CisJY3B1LT5wZXJmX2N0cmxzLmRlc2lyZWRfcGVyZiA9ICh1NjQpdGFyZ2V0X2ZyZXEgKiBwb2xpY3ktPm1heCAvIGNwcGNfZG1pX21heF9raHo7CiAJZnJlcXMub2xkID0gcG9saWN5LT5jdXI7CiAJZnJlcXMubmV3ID0gdGFyZ2V0X2ZyZXE7CiAKQEAgLTY2LDcgKzEwOCw3IEBACiBzdGF0aWMgdm9pZCBjcHBjX2NwdWZyZXFfc3RvcF9jcHUoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCiB7CiAJaW50IGNwdV9udW0gPSBwb2xpY3ktPmNwdTsKLQlzdHJ1Y3QgY3B1ZGF0YSAqY3B1ID0gYWxsX2NwdV9kYXRhW2NwdV9udW1dOworCXN0cnVjdCBjcHBjX2NwdWRhdGEgKmNwdSA9IGFsbF9jcHVfZGF0YVtjcHVfbnVtXTsKIAlpbnQgcmV0OwogCiAJY3B1LT5wZXJmX2N0cmxzLmRlc2lyZWRfcGVyZiA9IGNwdS0+cGVyZl9jYXBzLmxvd2VzdF9wZXJmOwpAQCAtNzksNyArMTIxLDcgQEAKIAogc3RhdGljIGludCBjcHBjX2NwdWZyZXFfY3B1X2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCiB7Ci0Jc3RydWN0IGNwdWRhdGEgKmNwdTsKKwlzdHJ1Y3QgY3BwY19jcHVkYXRhICpjcHU7CiAJdW5zaWduZWQgaW50IGNwdV9udW0gPSBwb2xpY3ktPmNwdTsKIAlpbnQgcmV0ID0gMDsKIApAQCAtOTQsMTAgKzEzNiwxMyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCXBvbGljeS0+bWluID0gY3B1LT5wZXJmX2NhcHMubG93ZXN0X3BlcmY7Ci0JcG9saWN5LT5tYXggPSBjcHUtPnBlcmZfY2Fwcy5oaWdoZXN0X3BlcmY7CisJY3BwY19kbWlfbWF4X2toeiA9IGNwcGNfZ2V0X2RtaV9tYXhfa2h6KCk7CisKKwlwb2xpY3ktPm1pbiA9IGNwdS0+cGVyZl9jYXBzLmxvd2VzdF9wZXJmICogY3BwY19kbWlfbWF4X2toeiAvIGNwdS0+cGVyZl9jYXBzLmhpZ2hlc3RfcGVyZjsKKwlwb2xpY3ktPm1heCA9IGNwcGNfZG1pX21heF9raHo7CiAJcG9saWN5LT5jcHVpbmZvLm1pbl9mcmVxID0gcG9saWN5LT5taW47CiAJcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxID0gcG9saWN5LT5tYXg7CisJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IGNwcGNfZ2V0X3RyYW5zaXRpb25fbGF0ZW5jeShjcHVfbnVtKTsKIAlwb2xpY3ktPnNoYXJlZF90eXBlID0gY3B1LT5zaGFyZWRfdHlwZTsKIAogCWlmIChwb2xpY3ktPnNoYXJlZF90eXBlID09IENQVUZSRVFfU0hBUkVEX1RZUEVfQU5ZKQpAQCAtMTEyLDcgKzE1Nyw4IEBACiAJY3B1LT5jdXJfcG9saWN5ID0gcG9saWN5OwogCiAJLyogU2V0IHBvbGljeS0+Y3VyIHRvIG1heCBub3cuIFRoZSBnb3Zlcm5vcnMgd2lsbCBhZGp1c3QgbGF0ZXIuICovCi0JcG9saWN5LT5jdXIgPSBjcHUtPnBlcmZfY3RybHMuZGVzaXJlZF9wZXJmID0gY3B1LT5wZXJmX2NhcHMuaGlnaGVzdF9wZXJmOworCXBvbGljeS0+Y3VyID0gY3BwY19kbWlfbWF4X2toejsKKwljcHUtPnBlcmZfY3RybHMuZGVzaXJlZF9wZXJmID0gY3B1LT5wZXJmX2NhcHMuaGlnaGVzdF9wZXJmOwogCiAJcmV0ID0gY3BwY19zZXRfcGVyZihjcHVfbnVtLCAmY3B1LT5wZXJmX2N0cmxzKTsKIAlpZiAocmV0KQpAQCAtMTM0LDcgKzE4MCw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBjcHBjX2NwdWZyZXFfaW5pdCh2b2lkKQogewogCWludCBpLCByZXQgPSAwOwotCXN0cnVjdCBjcHVkYXRhICpjcHU7CisJc3RydWN0IGNwcGNfY3B1ZGF0YSAqY3B1OwogCiAJaWYgKGFjcGlfZGlzYWJsZWQpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTQ0LDcgKzE5MCw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKLQkJYWxsX2NwdV9kYXRhW2ldID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNwdWRhdGEpLCBHRlBfS0VSTkVMKTsKKwkJYWxsX2NwdV9kYXRhW2ldID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNwcGNfY3B1ZGF0YSksIEdGUF9LRVJORUwpOwogCQlpZiAoIWFsbF9jcHVfZGF0YVtpXSkKIAkJCWdvdG8gb3V0OwogCkBAIC0xNzUsNyArMjIxLDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGNwcGNfY3B1ZnJlcV9leGl0KHZvaWQpCiB7Ci0Jc3RydWN0IGNwdWRhdGEgKmNwdTsKKwlzdHJ1Y3QgY3BwY19jcHVkYXRhICpjcHU7CiAJaW50IGk7CiAKIAljcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKCZjcHBjX2NwdWZyZXFfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLWR0LXBsYXRkZXYuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLWR0LXBsYXRkZXYuYwppbmRleCAwYmI0NGQ1Li43MTI2NzYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS1kdC1wbGF0ZGV2LmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEtZHQtcGxhdGRldi5jCkBAIC0xMSw2ICsxMSw4IEBACiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAorI2luY2x1ZGUgImNwdWZyZXEtZHQuaCIKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbWFjaGluZXNbXSBfX2luaXRjb25zdCA9IHsKIAl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjVpLWExMHMiLCB9LApAQCAtNDAsNiArNDIsNyBAQAogCXsgLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M1MjUwIiwgfSwKICNpZm5kZWYgQ09ORklHX0JMX1NXSVRDSEVSCiAJeyAuY29tcGF0aWJsZSA9ICJzYW1zdW5nLGV4eW5vczU0MjAiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M1NDMzIiwgfSwKIAl7IC5jb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNTgwMCIsIH0sCiAjZW5kaWYKIApAQCAtNTEsNiArNTQsNyBAQAogCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxyOGE3Nzc5IiwgfSwKIAl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMscjhhNzc5MCIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHI4YTc3OTEiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxyOGE3NzkyIiwgfSwKIAl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMscjhhNzc5MyIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHI4YTc3OTQiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxzaDczYTAiLCB9LApAQCAtNjgsMTIgKzcyLDE2IEBACiAKIAl7IC5jb21wYXRpYmxlID0gInNpZ21hLHRhbmdvNCIgfSwKIAorCXsgLmNvbXBhdGlibGUgPSAidGksYW0zM3h4IiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLGRyYTciLCB9LAogCXsgLmNvbXBhdGlibGUgPSAidGksb21hcDIiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAidGksb21hcDMiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAidGksb21hcDQiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAidGksb21hcDUiLCB9LAogCiAJeyAuY29tcGF0aWJsZSA9ICJ4bG54LHp5bnEtNzAwMCIsIH0sCisKKwl7IH0KIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGNwdWZyZXFfZHRfcGxhdGRldl9pbml0KHZvaWQpCkBAIC04OSw3ICs5Nyw4IEBACiAJaWYgKCFtYXRjaCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoImNwdWZyZXEtZHQiLCAtMSwKLQkJCQkJCQkgICAgICAgTlVMTCwgMCkpOworCXJldHVybiBQVFJfRVJSX09SX1pFUk8ocGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX2RhdGEoTlVMTCwgImNwdWZyZXEtZHQiLAorCQkJICAgICAgIC0xLCBtYXRjaC0+ZGF0YSwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGNwdWZyZXFfZHRfcGxhdGZvcm1fZGF0YSkpKTsKIH0KIGRldmljZV9pbml0Y2FsbChjcHVmcmVxX2R0X3BsYXRkZXZfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS1kdC5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEtZHQuYwppbmRleCAzOTU3ZGU4Li41YzA3YWUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS1kdC5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLWR0LmMKQEAgLTI1LDYgKzI1LDggQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdGhlcm1hbC5oPgogCisjaW5jbHVkZSAiY3B1ZnJlcS1kdC5oIgorCiBzdHJ1Y3QgcHJpdmF0ZV9kYXRhIHsKIAlzdHJ1Y3QgZGV2aWNlICpjcHVfZGV2OwogCXN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjZGV2OwpAQCAtMzUzLDYgKzM1NSw3IEBACiAKIHN0YXRpYyBpbnQgZHRfY3B1ZnJlcV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCXN0cnVjdCBjcHVmcmVxX2R0X3BsYXRmb3JtX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwogCWludCByZXQ7CiAKIAkvKgpAQCAtMzY2LDcgKzM2OSw4IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWR0X2NwdWZyZXFfZHJpdmVyLmRyaXZlcl9kYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKKwlpZiAoZGF0YSAmJiBkYXRhLT5oYXZlX2dvdmVybm9yX3Blcl9wb2xpY3kpCisJCWR0X2NwdWZyZXFfZHJpdmVyLmZsYWdzIHw9IENQVUZSRVFfSEFWRV9HT1ZFUk5PUl9QRVJfUE9MSUNZOwogCiAJcmV0ID0gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJmR0X2NwdWZyZXFfZHJpdmVyKTsKIAlpZiAocmV0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEtZHQuaCBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLWR0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRkNzc0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLWR0LmgKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBMaW5hcm8KKyAqIFZpcmVzaCBLdW1hciA8dmlyZXNoLmt1bWFyQGxpbmFyby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fQ1BVRlJFUV9EVF9IX18KKyNkZWZpbmUgX19DUFVGUkVRX0RUX0hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IGNwdWZyZXFfZHRfcGxhdGZvcm1fZGF0YSB7CisJYm9vbCBoYXZlX2dvdmVybm9yX3Blcl9wb2xpY3k7Cit9OworCisjZW5kaWYgLyogX19DUFVGUkVRX0RUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKaW5kZXggM2RkNDg4NC4uNmU2YzFmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCkBAIC05MTYsNTggKzkxNiwxOCBAQAogCS5yZWxlYXNlCT0gY3B1ZnJlcV9zeXNmc19yZWxlYXNlLAogfTsKIAotc3RhdGljIGludCBhZGRfY3B1X2Rldl9zeW1saW5rKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LCBpbnQgY3B1KQorc3RhdGljIGludCBhZGRfY3B1X2Rldl9zeW1saW5rKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCQkJICAgICAgIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZGV2aWNlICpjcHVfZGV2OwotCi0JcHJfZGVidWcoIiVzOiBBZGRpbmcgc3ltbGluayBmb3IgQ1BVOiAldVxuIiwgX19mdW5jX18sIGNwdSk7Ci0KLQlpZiAoIXBvbGljeSkKLQkJcmV0dXJuIDA7Ci0KLQljcHVfZGV2ID0gZ2V0X2NwdV9kZXZpY2UoY3B1KTsKLQlpZiAoV0FSTl9PTighY3B1X2RldikpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIHN5c2ZzX2NyZWF0ZV9saW5rKCZjcHVfZGV2LT5rb2JqLCAmcG9saWN5LT5rb2JqLCAiY3B1ZnJlcSIpOworCWRldl9kYmcoZGV2LCAiJXM6IEFkZGluZyBzeW1saW5rXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmtvYmosICZwb2xpY3ktPmtvYmosICJjcHVmcmVxIik7CiB9CiAKLXN0YXRpYyB2b2lkIHJlbW92ZV9jcHVfZGV2X3N5bWxpbmsoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIGludCBjcHUpCitzdGF0aWMgdm9pZCByZW1vdmVfY3B1X2Rldl9zeW1saW5rKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCQkJCSAgIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZGV2aWNlICpjcHVfZGV2OwotCi0JcHJfZGVidWcoIiVzOiBSZW1vdmluZyBzeW1saW5rIGZvciBDUFU6ICV1XG4iLCBfX2Z1bmNfXywgY3B1KTsKLQotCWNwdV9kZXYgPSBnZXRfY3B1X2RldmljZShjcHUpOwotCWlmIChXQVJOX09OKCFjcHVfZGV2KSkKLQkJcmV0dXJuOwotCi0Jc3lzZnNfcmVtb3ZlX2xpbmsoJmNwdV9kZXYtPmtvYmosICJjcHVmcmVxIik7Ci19Ci0KLS8qIEFkZC9yZW1vdmUgc3ltbGlua3MgZm9yIGFsbCByZWxhdGVkIENQVXMgKi8KLXN0YXRpYyBpbnQgY3B1ZnJlcV9hZGRfZGV2X3N5bWxpbmsoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCi17Ci0JdW5zaWduZWQgaW50IGo7Ci0JaW50IHJldCA9IDA7Ci0KLQkvKiBTb21lIHJlbGF0ZWQgQ1BVcyBtaWdodCBub3QgYmUgcHJlc2VudCAocGh5c2ljYWxseSBob3RwbHVnZ2VkKSAqLwotCWZvcl9lYWNoX2NwdShqLCBwb2xpY3ktPnJlYWxfY3B1cykgewotCQlyZXQgPSBhZGRfY3B1X2Rldl9zeW1saW5rKHBvbGljeSwgaik7Ci0JCWlmIChyZXQpCi0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBjcHVmcmVxX3JlbW92ZV9kZXZfc3ltbGluayhzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKLXsKLQl1bnNpZ25lZCBpbnQgajsKLQotCS8qIFNvbWUgcmVsYXRlZCBDUFVzIG1pZ2h0IG5vdCBiZSBwcmVzZW50IChwaHlzaWNhbGx5IGhvdHBsdWdnZWQpICovCi0JZm9yX2VhY2hfY3B1KGosIHBvbGljeS0+cmVhbF9jcHVzKQotCQlyZW1vdmVfY3B1X2Rldl9zeW1saW5rKHBvbGljeSwgaik7CisJZGV2X2RiZyhkZXYsICIlczogUmVtb3Zpbmcgc3ltbGlua1xuIiwgX19mdW5jX18pOworCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmtvYmosICJjcHVmcmVxIik7CiB9CiAKIHN0YXRpYyBpbnQgY3B1ZnJlcV9hZGRfZGV2X2ludGVyZmFjZShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKQEAgLTk5OSw3ICs5NTksNyBAQAogCQkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXR1cm4gY3B1ZnJlcV9hZGRfZGV2X3N5bWxpbmsocG9saWN5KTsKKwlyZXR1cm4gMDsKIH0KIAogX193ZWFrIHN0cnVjdCBjcHVmcmVxX2dvdmVybm9yICpjcHVmcmVxX2RlZmF1bHRfZ292ZXJub3Iodm9pZCkKQEAgLTEwNzMsMTMgKzEwMzMsOSBAQAogCiBzdGF0aWMgc3RydWN0IGNwdWZyZXFfcG9saWN5ICpjcHVmcmVxX3BvbGljeV9hbGxvYyh1bnNpZ25lZCBpbnQgY3B1KQogewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGdldF9jcHVfZGV2aWNlKGNwdSk7CiAJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3k7CiAJaW50IHJldDsKIAotCWlmIChXQVJOX09OKCFkZXYpKQotCQlyZXR1cm4gTlVMTDsKLQogCXBvbGljeSA9IGt6YWxsb2Moc2l6ZW9mKCpwb2xpY3kpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBvbGljeSkKIAkJcmV0dXJuIE5VTEw7CkBAIC0xMTMzLDcgKzEwODksNiBAQAogCiAJZG93bl93cml0ZSgmcG9saWN5LT5yd3NlbSk7CiAJY3B1ZnJlcV9zdGF0c19mcmVlX3RhYmxlKHBvbGljeSk7Ci0JY3B1ZnJlcV9yZW1vdmVfZGV2X3N5bWxpbmsocG9saWN5KTsKIAlrb2JqID0gJnBvbGljeS0+a29iajsKIAljbXAgPSAmcG9saWN5LT5rb2JqX3VucmVnaXN0ZXI7CiAJdXBfd3JpdGUoJnBvbGljeS0+cndzZW0pOwpAQCAtMTIxNSw4ICsxMTcwLDggQEAKIAlpZiAobmV3X3BvbGljeSkgewogCQkvKiByZWxhdGVkX2NwdXMgc2hvdWxkIGF0IGxlYXN0IGluY2x1ZGUgcG9saWN5LT5jcHVzLiAqLwogCQljcHVtYXNrX2NvcHkocG9saWN5LT5yZWxhdGVkX2NwdXMsIHBvbGljeS0+Y3B1cyk7Ci0JCS8qIFJlbWVtYmVyIENQVXMgcHJlc2VudCBhdCB0aGUgcG9saWN5IGNyZWF0aW9uIHRpbWUuICovCi0JCWNwdW1hc2tfYW5kKHBvbGljeS0+cmVhbF9jcHVzLCBwb2xpY3ktPmNwdXMsIGNwdV9wcmVzZW50X21hc2spOworCQkvKiBDbGVhciBtYXNrIG9mIHJlZ2lzdGVyZWQgQ1BVcyAqLworCQljcHVtYXNrX2NsZWFyKHBvbGljeS0+cmVhbF9jcHVzKTsKIAl9CiAKIAkvKgpAQCAtMTMzMSw2ICsxMjg2LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IGNwdWZyZXFfb2ZmbGluZSh1bnNpZ25lZCBpbnQgY3B1KTsKKwogLyoqCiAgKiBjcHVmcmVxX2FkZF9kZXYgLSB0aGUgY3B1ZnJlcSBpbnRlcmZhY2UgZm9yIGEgQ1BVIGRldmljZS4KICAqIEBkZXY6IENQVSBkZXZpY2UuCkBAIC0xMzQwLDI1ICsxMjk3LDMxIEBACiB7CiAJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3k7CiAJdW5zaWduZWQgY3B1ID0gZGV2LT5pZDsKKwlpbnQgcmV0OwogCiAJZGV2X2RiZyhkZXYsICIlczogYWRkaW5nIENQVSV1XG4iLCBfX2Z1bmNfXywgY3B1KTsKIAotCWlmIChjcHVfb25saW5lKGNwdSkpCi0JCXJldHVybiBjcHVmcmVxX29ubGluZShjcHUpOworCWlmIChjcHVfb25saW5lKGNwdSkpIHsKKwkJcmV0ID0gY3B1ZnJlcV9vbmxpbmUoY3B1KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQogCi0JLyoKLQkgKiBBIGhvdHBsdWcgbm90aWZpZXIgd2lsbCBmb2xsb3cgYW5kIHdlIHdpbGwgaGFuZGxlIGl0IGFzIENQVSBvbmxpbmUKLQkgKiB0aGVuLiAgRm9yIG5vdywganVzdCBjcmVhdGUgdGhlIHN5c2ZzIGxpbmssIHVubGVzcyB0aGVyZSBpcyBubyBwb2xpY3kKLQkgKiBvciB0aGUgbGluayBpcyBhbHJlYWR5IHByZXNlbnQuCi0JICovCisJLyogQ3JlYXRlIHN5c2ZzIGxpbmsgb24gQ1BVIHJlZ2lzdHJhdGlvbiAqLwogCXBvbGljeSA9IHBlcl9jcHUoY3B1ZnJlcV9jcHVfZGF0YSwgY3B1KTsKIAlpZiAoIXBvbGljeSB8fCBjcHVtYXNrX3Rlc3RfYW5kX3NldF9jcHUoY3B1LCBwb2xpY3ktPnJlYWxfY3B1cykpCiAJCXJldHVybiAwOwogCi0JcmV0dXJuIGFkZF9jcHVfZGV2X3N5bWxpbmsocG9saWN5LCBjcHUpOworCXJldCA9IGFkZF9jcHVfZGV2X3N5bWxpbmsocG9saWN5LCBkZXYpOworCWlmIChyZXQpIHsKKwkJY3B1bWFza19jbGVhcl9jcHUoY3B1LCBwb2xpY3ktPnJlYWxfY3B1cyk7CisJCWNwdWZyZXFfb2ZmbGluZShjcHUpOworCX0KKworCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGNwdWZyZXFfb2ZmbGluZSh1bnNpZ25lZCBpbnQgY3B1KQorc3RhdGljIGludCBjcHVmcmVxX29mZmxpbmUodW5zaWduZWQgaW50IGNwdSkKIHsKIAlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeTsKIAlpbnQgcmV0OwpAQCAtMTM2OCw3ICsxMzMxLDcgQEAKIAlwb2xpY3kgPSBjcHVmcmVxX2NwdV9nZXRfcmF3KGNwdSk7CiAJaWYgKCFwb2xpY3kpIHsKIAkJcHJfZGVidWcoIiVzOiBObyBjcHVfZGF0YSBmb3VuZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47CisJCXJldHVybiAwOwogCX0KIAogCWRvd25fd3JpdGUoJnBvbGljeS0+cndzZW0pOwpAQCAtMTQxNyw2ICsxMzgwLDcgQEAKIAogdW5sb2NrOgogCXVwX3dyaXRlKCZwb2xpY3ktPnJ3c2VtKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0xNDM2LDcgKzE0MDAsNyBAQAogCQljcHVmcmVxX29mZmxpbmUoY3B1KTsKIAogCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgcG9saWN5LT5yZWFsX2NwdXMpOwotCXJlbW92ZV9jcHVfZGV2X3N5bWxpbmsocG9saWN5LCBjcHUpOworCXJlbW92ZV9jcHVfZGV2X3N5bWxpbmsocG9saWN5LCBkZXYpOwogCiAJaWYgKGNwdW1hc2tfZW1wdHkocG9saWN5LT5yZWFsX2NwdXMpKQogCQljcHVmcmVxX3BvbGljeV9mcmVlKHBvbGljeSwgdHJ1ZSk7CkBAIC0yMzMyLDI4ICsyMjk2LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0woY3B1ZnJlcV91cGRhdGVfcG9saWN5KTsKIAotc3RhdGljIGludCBjcHVmcmVxX2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKLQkJCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCi17Ci0JdW5zaWduZWQgaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7Ci0KLQlzd2l0Y2ggKGFjdGlvbiAmIH5DUFVfVEFTS1NfRlJPWkVOKSB7Ci0JY2FzZSBDUFVfT05MSU5FOgotCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgotCQljcHVmcmVxX29ubGluZShjcHUpOwotCQlicmVhazsKLQotCWNhc2UgQ1BVX0RPV05fUFJFUEFSRToKLQkJY3B1ZnJlcV9vZmZsaW5lKGNwdSk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gTk9USUZZX09LOwotfQotCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIF9fcmVmZGF0YSBjcHVmcmVxX2NwdV9ub3RpZmllciA9IHsKLQkubm90aWZpZXJfY2FsbCA9IGNwdWZyZXFfY3B1X2NhbGxiYWNrLAotfTsKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICBCT09TVAkJCQkJCSAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTI0NTUsNiArMjM5Nyw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgIFJFR0lTVEVSIC8gVU5SRUdJU1RFUiBDUFVGUkVRIERSSVZFUiAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGVudW0gY3B1aHBfc3RhdGUgaHBfb25saW5lOwogCiAvKioKICAqIGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyIC0gcmVnaXN0ZXIgYSBDUFUgRnJlcXVlbmN5IGRyaXZlcgpAQCAtMjUxNyw3ICsyNDYwLDE0IEBACiAJCWdvdG8gZXJyX2lmX3VucmVnOwogCX0KIAotCXJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmY3B1ZnJlcV9jcHVfbm90aWZpZXIpOworCXJldCA9IGNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVBfT05MSU5FX0RZTiwgImNwdWZyZXE6b25saW5lIiwKKwkJCQkJY3B1ZnJlcV9vbmxpbmUsCisJCQkJCWNwdWZyZXFfb2ZmbGluZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX2lmX3VucmVnOworCWhwX29ubGluZSA9IHJldDsKKwlyZXQgPSAwOworCiAJcHJfZGVidWcoImRyaXZlciAlcyB1cCBhbmQgcnVubmluZ1xuIiwgZHJpdmVyX2RhdGEtPm5hbWUpOwogCWdvdG8gb3V0OwogCkBAIC0yNTU2LDcgKzI1MDYsNyBAQAogCWdldF9vbmxpbmVfY3B1cygpOwogCXN1YnN5c19pbnRlcmZhY2VfdW5yZWdpc3RlcigmY3B1ZnJlcV9pbnRlcmZhY2UpOwogCXJlbW92ZV9ib29zdF9zeXNmc19maWxlKCk7Ci0JdW5yZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJmNwdWZyZXFfY3B1X25vdGlmaWVyKTsKKwljcHVocF9yZW1vdmVfc3RhdGVfbm9jYWxscyhocF9vbmxpbmUpOwogCiAJd3JpdGVfbG9ja19pcnFzYXZlKCZjcHVmcmVxX2RyaXZlcl9sb2NrLCBmbGFncyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX2dvdmVybm9yLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9nb3Zlcm5vci5jCmluZGV4IGU0MTUzNDkuLjY0MmRkMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX2dvdmVybm9yLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfZ292ZXJub3IuYwpAQCAtMjYwLDcgKzI2MCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGRic191cGRhdGVfdXRpbF9oYW5kbGVyKHN0cnVjdCB1cGRhdGVfdXRpbF9kYXRhICpkYXRhLCB1NjQgdGltZSwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyB1dGlsLCB1bnNpZ25lZCBsb25nIG1heCkKKwkJCQkgICAgdW5zaWduZWQgaW50IGZsYWdzKQogewogCXN0cnVjdCBjcHVfZGJzX2luZm8gKmNkYnMgPSBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGNwdV9kYnNfaW5mbywgdXBkYXRlX3V0aWwpOwogCXN0cnVjdCBwb2xpY3lfZGJzX2luZm8gKnBvbGljeV9kYnMgPSBjZGJzLT5wb2xpY3lfZGJzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2ludGVsX3BzdGF0ZS5jIGIvZHJpdmVycy9jcHVmcmVxL2ludGVsX3BzdGF0ZS5jCmluZGV4IGJlOWVhZGUuLjgwNmYyMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9pbnRlbF9wc3RhdGUuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvaW50ZWxfcHN0YXRlLmMKQEAgLTE4MSw2ICsxODEsOCBAQAogICogQGNwdToJCUNQVSBudW1iZXIgZm9yIHRoaXMgaW5zdGFuY2UgZGF0YQogICogQHVwZGF0ZV91dGlsOglDUFVGcmVxIHV0aWxpdHkgY2FsbGJhY2sgaW5mb3JtYXRpb24KICAqIEB1cGRhdGVfdXRpbF9zZXQ6CUNQVUZyZXEgdXRpbGl0eSBjYWxsYmFjayBpcyBzZXQKKyAqIEBpb3dhaXRfYm9vc3Q6CWlvd2FpdC1yZWxhdGVkIGJvb3N0IGZyYWN0aW9uCisgKiBAbGFzdF91cGRhdGU6CVRpbWUgb2YgdGhlIGxhc3QgdXBkYXRlLgogICogQHBzdGF0ZToJCVN0b3JlcyBQIHN0YXRlIGxpbWl0cyBmb3IgdGhpcyBDUFUKICAqIEB2aWQ6CQlTdG9yZXMgVklEIGxpbWl0cyBmb3IgdGhpcyBDUFUKICAqIEBwaWQ6CQlTdG9yZXMgUElEIHBhcmFtZXRlcnMgZm9yIHRoaXMgQ1BVCkBAIC0yMDYsNiArMjA4LDcgQEAKIAlzdHJ1Y3QgdmlkX2RhdGEgdmlkOwogCXN0cnVjdCBfcGlkIHBpZDsKIAorCXU2NAlsYXN0X3VwZGF0ZTsKIAl1NjQJbGFzdF9zYW1wbGVfdGltZTsKIAl1NjQJcHJldl9hcGVyZjsKIAl1NjQJcHJldl9tcGVyZjsKQEAgLTIxNiw2ICsyMTksNyBAQAogCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSBhY3BpX3BlcmZfZGF0YTsKIAlib29sIHZhbGlkX3Bzc190YWJsZTsKICNlbmRpZgorCXVuc2lnbmVkIGludCBpb3dhaXRfYm9vc3Q7CiB9OwogCiBzdGF0aWMgc3RydWN0IGNwdWRhdGEgKiphbGxfY3B1X2RhdGE7CkBAIC0yMjksNiArMjMzLDcgQEAKICAqIEBwX2dhaW5fcGN0OgkJUElEIHByb3BvcnRpb25hbCBnYWluCiAgKiBAaV9nYWluX3BjdDoJCVBJRCBpbnRlZ3JhbCBnYWluCiAgKiBAZF9nYWluX3BjdDoJCVBJRCBkZXJpdmF0aXZlIGdhaW4KKyAqIEBib29zdF9pb3dhaXQ6CVdoZXRoZXIgb3Igbm90IHRvIHVzZSBpb3dhaXQgYm9vc3RpbmcuCiAgKgogICogU3RvcmVzIHBlciBDUFUgbW9kZWwgc3RhdGljIFBJRCBjb25maWd1cmF0aW9uIGRhdGEuCiAgKi8KQEAgLTI0MCw2ICsyNDUsNyBAQAogCWludCBwX2dhaW5fcGN0OwogCWludCBkX2dhaW5fcGN0OwogCWludCBpX2dhaW5fcGN0OworCWJvb2wgYm9vc3RfaW93YWl0OwogfTsKIAogLyoqCkBAIC0xMDI5LDcgKzEwMzUsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IGNwdV9kZWZhdWx0cyBzaWx2ZXJtb250X3BhcmFtcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3B1X2RlZmF1bHRzIHNpbHZlcm1vbnRfcGFyYW1zID0gewogCS5waWRfcG9saWN5ID0gewogCQkuc2FtcGxlX3JhdGVfbXMgPSAxMCwKIAkJLmRlYWRiYW5kID0gMCwKQEAgLTEwMzcsNiArMTA0Myw3IEBACiAJCS5wX2dhaW5fcGN0ID0gMTQsCiAJCS5kX2dhaW5fcGN0ID0gMCwKIAkJLmlfZ2Fpbl9wY3QgPSA0LAorCQkuYm9vc3RfaW93YWl0ID0gdHJ1ZSwKIAl9LAogCS5mdW5jcyA9IHsKIAkJLmdldF9tYXggPSBhdG9tX2dldF9tYXhfcHN0YXRlLApAQCAtMTA1MCw3ICsxMDU3LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBjcHVfZGVmYXVsdHMgYWlybW9udF9wYXJhbXMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGNwdV9kZWZhdWx0cyBhaXJtb250X3BhcmFtcyA9IHsKIAkucGlkX3BvbGljeSA9IHsKIAkJLnNhbXBsZV9yYXRlX21zID0gMTAsCiAJCS5kZWFkYmFuZCA9IDAsCkBAIC0xMDU4LDYgKzEwNjUsNyBAQAogCQkucF9nYWluX3BjdCA9IDE0LAogCQkuZF9nYWluX3BjdCA9IDAsCiAJCS5pX2dhaW5fcGN0ID0gNCwKKwkJLmJvb3N0X2lvd2FpdCA9IHRydWUsCiAJfSwKIAkuZnVuY3MgPSB7CiAJCS5nZXRfbWF4ID0gYXRvbV9nZXRfbWF4X3BzdGF0ZSwKQEAgLTEwNzEsNyArMTA3OSw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY3B1X2RlZmF1bHRzIGtubF9wYXJhbXMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGNwdV9kZWZhdWx0cyBrbmxfcGFyYW1zID0gewogCS5waWRfcG9saWN5ID0gewogCQkuc2FtcGxlX3JhdGVfbXMgPSAxMCwKIAkJLmRlYWRiYW5kID0gMCwKQEAgLTEwOTEsNyArMTA5OSw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY3B1X2RlZmF1bHRzIGJ4dF9wYXJhbXMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGNwdV9kZWZhdWx0cyBieHRfcGFyYW1zID0gewogCS5waWRfcG9saWN5ID0gewogCQkuc2FtcGxlX3JhdGVfbXMgPSAxMCwKIAkJLmRlYWRiYW5kID0gMCwKQEAgLTEwOTksNiArMTEwNyw3IEBACiAJCS5wX2dhaW5fcGN0ID0gMTQsCiAJCS5kX2dhaW5fcGN0ID0gMCwKIAkJLmlfZ2Fpbl9wY3QgPSA0LAorCQkuYm9vc3RfaW93YWl0ID0gdHJ1ZSwKIAl9LAogCS5mdW5jcyA9IHsKIAkJLmdldF9tYXggPSBjb3JlX2dldF9tYXhfcHN0YXRlLApAQCAtMTIyMiwzNiArMTIzMSwxOCBAQAogc3RhdGljIGlubGluZSBpbnQzMl90IGdldF90YXJnZXRfcHN0YXRlX3VzZV9jcHVfbG9hZChzdHJ1Y3QgY3B1ZGF0YSAqY3B1KQogewogCXN0cnVjdCBzYW1wbGUgKnNhbXBsZSA9ICZjcHUtPnNhbXBsZTsKLQl1NjQgY3VtbXVsYXRpdmVfaW93YWl0LCBkZWx0YV9pb3dhaXRfdXM7Ci0JdTY0IGRlbHRhX2lvd2FpdF9tcGVyZjsKLQl1NjQgbXBlcmYsIG5vdzsKLQlpbnQzMl90IGNwdV9sb2FkOworCWludDMyX3QgYnVzeV9mcmFjLCBib29zdDsKIAotCWN1bW11bGF0aXZlX2lvd2FpdCA9IGdldF9jcHVfaW93YWl0X3RpbWVfdXMoY3B1LT5jcHUsICZub3cpOworCWJ1c3lfZnJhYyA9IGRpdl9mcChzYW1wbGUtPm1wZXJmLCBzYW1wbGUtPnRzYyk7CiAKLQkvKgotCSAqIENvbnZlcnQgaW93YWl0IHRpbWUgaW50byBudW1iZXIgb2YgSU8gY3ljbGVzIHNwZW50IGF0IG1heF9mcmVxLgotCSAqIElPIGlzIGNvbnNpZGVyZWQgYXMgYnVzeSBvbmx5IGZvciB0aGUgY3B1X2xvYWQgYWxnb3JpdGhtLiBGb3IKLQkgKiBwZXJmb3JtYW5jZSB0aGlzIGlzIG5vdCBuZWVkZWQgc2luY2Ugd2UgYWx3YXlzIHRyeSB0byByZWFjaCB0aGUKLQkgKiBtYXhpbXVtIFAtU3RhdGUsIHNvIHdlIGFyZSBhbHJlYWR5IGJvb3N0aW5nIHRoZSBJT3MuCi0JICovCi0JZGVsdGFfaW93YWl0X3VzID0gY3VtbXVsYXRpdmVfaW93YWl0IC0gY3B1LT5wcmV2X2N1bW11bGF0aXZlX2lvd2FpdDsKLQlkZWx0YV9pb3dhaXRfbXBlcmYgPSBkaXY2NF91NjQoZGVsdGFfaW93YWl0X3VzICogY3B1LT5wc3RhdGUuc2NhbGluZyAqCi0JCWNwdS0+cHN0YXRlLm1heF9wc3RhdGUsIE1TRUNfUEVSX1NFQyk7CisJYm9vc3QgPSBjcHUtPmlvd2FpdF9ib29zdDsKKwljcHUtPmlvd2FpdF9ib29zdCA+Pj0gMTsKIAotCW1wZXJmID0gY3B1LT5zYW1wbGUubXBlcmYgKyBkZWx0YV9pb3dhaXRfbXBlcmY7Ci0JY3B1LT5wcmV2X2N1bW11bGF0aXZlX2lvd2FpdCA9IGN1bW11bGF0aXZlX2lvd2FpdDsKKwlpZiAoYnVzeV9mcmFjIDwgYm9vc3QpCisJCWJ1c3lfZnJhYyA9IGJvb3N0OwogCi0JLyoKLQkgKiBUaGUgbG9hZCBjYW4gYmUgZXN0aW1hdGVkIGFzIHRoZSByYXRpbyBvZiB0aGUgbXBlcmYgY291bnRlcgotCSAqIHJ1bm5pbmcgYXQgYSBjb25zdGFudCBmcmVxdWVuY3kgZHVyaW5nIGFjdGl2ZSBwZXJpb2RzCi0JICogKEMwKSBhbmQgdGhlIHRpbWUgc3RhbXAgY291bnRlciBydW5uaW5nIGF0IHRoZSBzYW1lIGZyZXF1ZW5jeQotCSAqIGFsc28gZHVyaW5nIEMtc3RhdGVzLgotCSAqLwotCWNwdV9sb2FkID0gZGl2NjRfdTY0KGludF90b2ZwKDEwMCkgKiBtcGVyZiwgc2FtcGxlLT50c2MpOwotCWNwdS0+c2FtcGxlLmJ1c3lfc2NhbGVkID0gY3B1X2xvYWQ7Ci0KLQlyZXR1cm4gZ2V0X2F2Z19wc3RhdGUoY3B1KSAtIHBpZF9jYWxjKCZjcHUtPnBpZCwgY3B1X2xvYWQpOworCXNhbXBsZS0+YnVzeV9zY2FsZWQgPSBidXN5X2ZyYWMgKiAxMDA7CisJcmV0dXJuIGdldF9hdmdfcHN0YXRlKGNwdSkgLSBwaWRfY2FsYygmY3B1LT5waWQsIHNhbXBsZS0+YnVzeV9zY2FsZWQpOwogfQogCiBzdGF0aWMgaW5saW5lIGludDMyX3QgZ2V0X3RhcmdldF9wc3RhdGVfdXNlX3BlcmZvcm1hbmNlKHN0cnVjdCBjcHVkYXRhICpjcHUpCkBAIC0xMzI1LDE1ICsxMzE2LDI5IEBACiAJCXNhbXBsZS0+bXBlcmYsCiAJCXNhbXBsZS0+YXBlcmYsCiAJCXNhbXBsZS0+dHNjLAotCQlnZXRfYXZnX2ZyZXF1ZW5jeShjcHUpKTsKKwkJZ2V0X2F2Z19mcmVxdWVuY3koY3B1KSwKKwkJZnBfdG9pbnQoY3B1LT5pb3dhaXRfYm9vc3QgKiAxMDApKTsKIH0KIAogc3RhdGljIHZvaWQgaW50ZWxfcHN0YXRlX3VwZGF0ZV91dGlsKHN0cnVjdCB1cGRhdGVfdXRpbF9kYXRhICpkYXRhLCB1NjQgdGltZSwKLQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgdXRpbCwgdW5zaWduZWQgbG9uZyBtYXgpCisJCQkJICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IGNwdWRhdGEgKmNwdSA9IGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgY3B1ZGF0YSwgdXBkYXRlX3V0aWwpOwotCXU2NCBkZWx0YV9ucyA9IHRpbWUgLSBjcHUtPnNhbXBsZS50aW1lOworCXU2NCBkZWx0YV9uczsKIAorCWlmIChwaWRfcGFyYW1zLmJvb3N0X2lvd2FpdCkgeworCQlpZiAoZmxhZ3MgJiBTQ0hFRF9DUFVGUkVRX0lPV0FJVCkgeworCQkJY3B1LT5pb3dhaXRfYm9vc3QgPSBpbnRfdG9mcCgxKTsKKwkJfSBlbHNlIGlmIChjcHUtPmlvd2FpdF9ib29zdCkgeworCQkJLyogQ2xlYXIgaW93YWl0X2Jvb3N0IGlmIHRoZSBDUFUgbWF5IGhhdmUgYmVlbiBpZGxlLiAqLworCQkJZGVsdGFfbnMgPSB0aW1lIC0gY3B1LT5sYXN0X3VwZGF0ZTsKKwkJCWlmIChkZWx0YV9ucyA+IFRJQ0tfTlNFQykKKwkJCQljcHUtPmlvd2FpdF9ib29zdCA9IDA7CisJCX0KKwkJY3B1LT5sYXN0X3VwZGF0ZSA9IHRpbWU7CisJfQorCisJZGVsdGFfbnMgPSB0aW1lIC0gY3B1LT5zYW1wbGUudGltZTsKIAlpZiAoKHM2NClkZWx0YV9ucyA+PSBwaWRfcGFyYW1zLnNhbXBsZV9yYXRlX25zKSB7CiAJCWJvb2wgc2FtcGxlX3Rha2VuID0gaW50ZWxfcHN0YXRlX3NhbXBsZShjcHUsIHRpbWUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEva2lya3dvb2QtY3B1ZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL2tpcmt3b29kLWNwdWZyZXEuYwppbmRleCBiZTQyZjEwLi4xYjliY2Q3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEva2lya3dvb2QtY3B1ZnJlcS5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9raXJrd29vZC1jcHVmcmVxLmMKQEAgLTEyMyw3ICsxMjMsNyBAQAogCiAJcHJpdi5jcHVfY2xrID0gb2ZfY2xrX2dldF9ieV9uYW1lKG5wLCAiY3B1X2NsayIpOwogCWlmIChJU19FUlIocHJpdi5jcHVfY2xrKSkgewotCQlkZXZfZXJyKHByaXYuZGV2LCAiVW5hYmxlIHRvIGdldCBjcHVjbGsiKTsKKwkJZGV2X2Vycihwcml2LmRldiwgIlVuYWJsZSB0byBnZXQgY3B1Y2xrXG4iKTsKIAkJcmV0dXJuIFBUUl9FUlIocHJpdi5jcHVfY2xrKTsKIAl9CiAKQEAgLTEzMiw3ICsxMzIsNyBAQAogCiAJcHJpdi5kZHJfY2xrID0gb2ZfY2xrX2dldF9ieV9uYW1lKG5wLCAiZGRyY2xrIik7CiAJaWYgKElTX0VSUihwcml2LmRkcl9jbGspKSB7Ci0JCWRldl9lcnIocHJpdi5kZXYsICJVbmFibGUgdG8gZ2V0IGRkcmNsayIpOworCQlkZXZfZXJyKHByaXYuZGV2LCAiVW5hYmxlIHRvIGdldCBkZHJjbGtcbiIpOwogCQllcnIgPSBQVFJfRVJSKHByaXYuZGRyX2Nsayk7CiAJCWdvdG8gb3V0X2NwdTsKIAl9CkBAIC0xNDIsNyArMTQyLDcgQEAKIAogCXByaXYucG93ZXJzYXZlX2NsayA9IG9mX2Nsa19nZXRfYnlfbmFtZShucCwgInBvd2Vyc2F2ZSIpOwogCWlmIChJU19FUlIocHJpdi5wb3dlcnNhdmVfY2xrKSkgewotCQlkZXZfZXJyKHByaXYuZGV2LCAiVW5hYmxlIHRvIGdldCBwb3dlcnNhdmUiKTsKKwkJZGV2X2Vycihwcml2LmRldiwgIlVuYWJsZSB0byBnZXQgcG93ZXJzYXZlXG4iKTsKIAkJZXJyID0gUFRSX0VSUihwcml2LnBvd2Vyc2F2ZV9jbGspOwogCQlnb3RvIG91dF9kZHI7CiAJfQpAQCAtMTU1LDcgKzE1NSw3IEBACiAJaWYgKCFlcnIpCiAJCXJldHVybiAwOwogCi0JZGV2X2Vycihwcml2LmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBjcHVmcmVxIGRyaXZlciIpOworCWRldl9lcnIocHJpdi5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgY3B1ZnJlcSBkcml2ZXJcbiIpOwogCiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHByaXYucG93ZXJzYXZlX2Nsayk7CiBvdXRfZGRyOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL3NhMTExMC1jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvc2ExMTEwLWNwdWZyZXEuYwppbmRleCBiNWJlZmMyLi4yYmFjOWI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvc2ExMTEwLWNwdWZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvc2ExMTEwLWNwdWZyZXEuYwpAQCAtMTU5LDcgKzE1OSw3IEBACiAJICogaGFsZiBzcGVlZCBvciB1c2UgZGVsYXllZCByZWFkIGxhdGNoaW5nIChlcnJhdGEgMTMpLgogCSAqLwogCWlmICgobnNfdG9fY3ljbGVzKHNkcmFtLT50Y2ssIHNkX2toeikgPiAxKSB8fAotCSAgICAoQ1BVX1JFVklTSU9OIDwgQ1BVX1NBMTExMF9CMiAmJiBzZF9raHogPCA2MjAwMCkpCisJICAgIChyZWFkX2NwdWlkX3JldmlzaW9uKCkgPCBBUk1fQ1BVX1JFVl9TQTExMTBfQjIgJiYgc2Rfa2h6IDwgNjIwMDApKQogCQlzZF9raHogLz0gMjsKIAogCXNkLT5tZGNuZmcgPSBNRENORkcgJiAweDAwN2YwMDdmOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL3NjcGktY3B1ZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL3NjcGktY3B1ZnJlcS5jCmluZGV4IGU4YTdiZjUuLmVhN2E0ZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9zY3BpLWNwdWZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvc2NwaS1jcHVmcmVxLmMKQEAgLTEwNSw3ICsxMDUsNiBAQAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2NwaV9jcHVmcmVxX3BsYXRkcnYgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUJPSAic2NwaS1jcHVmcmVxIiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfSwKIAkucHJvYmUJCT0gc2NwaV9jcHVmcmVxX3Byb2JlLAogCS5yZW1vdmUJCT0gc2NwaV9jcHVmcmVxX3JlbW92ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9zdGktY3B1ZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL3N0aS1jcHVmcmVxLmMKaW5kZXggMDQwNDIwMy4uYjM2NmU2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL3N0aS1jcHVmcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL3N0aS1jcHVmcmVxLmMKQEAgLTE2Myw3ICsxNjMsNyBAQAogCiAJcmVnX2ZpZWxkcyA9IHN0aV9jcHVmcmVxX21hdGNoKCk7CiAJaWYgKCFyZWdfZmllbGRzKSB7Ci0JCWRldl9lcnIoZGV2LCAiVGhpcyBTb0MgZG9lc24ndCBzdXBwb3J0IHZvbHRhZ2Ugc2NhbGluZyIpOworCQlkZXZfZXJyKGRldiwgIlRoaXMgU29DIGRvZXNuJ3Qgc3VwcG9ydCB2b2x0YWdlIHNjYWxpbmdcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9jb3VwbGVkLmMgYi9kcml2ZXJzL2NwdWlkbGUvY291cGxlZC5jCmluZGV4IGQ1NjU3ZDUuLjcxZTU4NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1aWRsZS9jb3VwbGVkLmMKKysrIGIvZHJpdmVycy9jcHVpZGxlL2NvdXBsZWQuYwpAQCAtNzQ5LDY1ICs3NDksNTIgQEAKIAlwdXRfY3B1KCk7CiB9CiAKLS8qKgotICogY3B1aWRsZV9jb3VwbGVkX2NwdV9ub3RpZnkgLSBub3RpZmllciBjYWxsZWQgZHVyaW5nIGhvdHBsdWcgdHJhbnNpdGlvbnMKLSAqIEBuYjogbm90aWZpZXIgYmxvY2sKLSAqIEBhY3Rpb246IGhvdHBsdWcgdHJhbnNpdGlvbgotICogQGhjcHU6IHRhcmdldCBjcHUgbnVtYmVyCi0gKgotICogQ2FsbGVkIHdoZW4gYSBjcHUgaXMgYnJvdWdodCBvbiBvciBvZmZsaW5lIHVzaW5nIGhvdHBsdWcuICBVcGRhdGVzIHRoZQotICogY291cGxlZCBjcHUgc2V0IGFwcHJvcHJpYXRlbHkKLSAqLwotc3RhdGljIGludCBjcHVpZGxlX2NvdXBsZWRfY3B1X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAotCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQgY291cGxlZF9jcHVfb25saW5lKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0JaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7CiAJc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXY7CiAKLQlzd2l0Y2ggKGFjdGlvbiAmIH5DUFVfVEFTS1NfRlJPWkVOKSB7Ci0JY2FzZSBDUFVfVVBfUFJFUEFSRToKLQljYXNlIENQVV9ET1dOX1BSRVBBUkU6Ci0JY2FzZSBDUFVfT05MSU5FOgotCWNhc2UgQ1BVX0RFQUQ6Ci0JY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6Ci0JY2FzZSBDUFVfRE9XTl9GQUlMRUQ6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBOT1RJRllfT0s7Ci0JfQotCiAJbXV0ZXhfbG9jaygmY3B1aWRsZV9sb2NrKTsKIAogCWRldiA9IHBlcl9jcHUoY3B1aWRsZV9kZXZpY2VzLCBjcHUpOwotCWlmICghZGV2IHx8ICFkZXYtPmNvdXBsZWQpCi0JCWdvdG8gb3V0OwotCi0Jc3dpdGNoIChhY3Rpb24gJiB+Q1BVX1RBU0tTX0ZST1pFTikgewotCWNhc2UgQ1BVX1VQX1BSRVBBUkU6Ci0JY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgotCQljcHVpZGxlX2NvdXBsZWRfcHJldmVudF9pZGxlKGRldi0+Y291cGxlZCk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BVX09OTElORToKLQljYXNlIENQVV9ERUFEOgorCWlmIChkZXYgJiYgZGV2LT5jb3VwbGVkKSB7CiAJCWNwdWlkbGVfY291cGxlZF91cGRhdGVfb25saW5lX2NwdXMoZGV2LT5jb3VwbGVkKTsKLQkJLyogRmFsbCB0aHJvdWdoICovCi0JY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6Ci0JY2FzZSBDUFVfRE9XTl9GQUlMRUQ6CiAJCWNwdWlkbGVfY291cGxlZF9hbGxvd19pZGxlKGRldi0+Y291cGxlZCk7Ci0JCWJyZWFrOwogCX0KIAotb3V0OgogCW11dGV4X3VubG9jaygmY3B1aWRsZV9sb2NrKTsKLQlyZXR1cm4gTk9USUZZX09LOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGNwdWlkbGVfY291cGxlZF9jcHVfbm90aWZpZXIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSBjcHVpZGxlX2NvdXBsZWRfY3B1X25vdGlmeSwKLX07CitzdGF0aWMgaW50IGNvdXBsZWRfY3B1X3VwX3ByZXBhcmUodW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldjsKKworCW11dGV4X2xvY2soJmNwdWlkbGVfbG9jayk7CisKKwlkZXYgPSBwZXJfY3B1KGNwdWlkbGVfZGV2aWNlcywgY3B1KTsKKwlpZiAoZGV2ICYmIGRldi0+Y291cGxlZCkKKwkJY3B1aWRsZV9jb3VwbGVkX3ByZXZlbnRfaWRsZShkZXYtPmNvdXBsZWQpOworCisJbXV0ZXhfdW5sb2NrKCZjcHVpZGxlX2xvY2spOworCXJldHVybiAwOworfQogCiBzdGF0aWMgaW50IF9faW5pdCBjcHVpZGxlX2NvdXBsZWRfaW5pdCh2b2lkKQogewotCXJldHVybiByZWdpc3Rlcl9jcHVfbm90aWZpZXIoJmNwdWlkbGVfY291cGxlZF9jcHVfbm90aWZpZXIpOworCWludCByZXQ7CisKKwlyZXQgPSBjcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX0NQVUlETEVfQ09VUExFRF9QUkVQQVJFLAorCQkJCQkiY3B1aWRsZS9jb3VwbGVkOnByZXBhcmUiLAorCQkJCQljb3VwbGVkX2NwdV91cF9wcmVwYXJlLAorCQkJCQljb3VwbGVkX2NwdV9vbmxpbmUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9BUF9PTkxJTkVfRFlOLAorCQkJCQkiY3B1aWRsZS9jb3VwbGVkOm9ubGluZSIsCisJCQkJCWNvdXBsZWRfY3B1X29ubGluZSwKKwkJCQkJY291cGxlZF9jcHVfdXBfcHJlcGFyZSk7CisJaWYgKHJldCA8IDApCisJCWNwdWhwX3JlbW92ZV9zdGF0ZV9ub2NhbGxzKENQVUhQX0NQVUlETEVfQ09VUExFRF9QUkVQQVJFKTsKKwlyZXR1cm4gcmV0OwogfQogY29yZV9pbml0Y2FsbChjcHVpZGxlX2NvdXBsZWRfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS1hcm0uYyBiL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLWFybS5jCmluZGV4IDRiYTNkM2YuLmY0NDBkMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLWFybS5jCisrKyBiL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLWFybS5jCkBAIC0xMjEsNiArMTIxLDcgQEAKIAkJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOwogCQlpZiAoIWRldikgewogCQkJcHJfZXJyKCJGYWlsZWQgdG8gYWxsb2NhdGUgY3B1aWRsZSBkZXZpY2VcbiIpOworCQkJcmV0ID0gLUVOT01FTTsKIAkJCWdvdG8gb3V0X2ZhaWw7CiAJCX0KIAkJZGV2LT5jcHUgPSBjcHU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS1wb3dlcm52LmMgYi9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS1wb3dlcm52LmMKaW5kZXggZjdjYTg5MS4uN2ZlNDQyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtcG93ZXJudi5jCisrKyBiL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLXBvd2VybnYuYwpAQCAtMTE5LDM5ICsxMTksMjkgQEAKIAkJLmVudGVyID0gc25vb3plX2xvb3AgfSwKIH07CiAKLXN0YXRpYyBpbnQgcG93ZXJudl9jcHVpZGxlX2FkZF9jcHVfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuLAotCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCitzdGF0aWMgaW50IHBvd2VybnZfY3B1aWRsZV9jcHVfb25saW5lKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0JaW50IGhvdGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7Ci0Jc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYgPQotCQkJCXBlcl9jcHUoY3B1aWRsZV9kZXZpY2VzLCBob3RjcHUpOworCXN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2ID0gcGVyX2NwdShjcHVpZGxlX2RldmljZXMsIGNwdSk7CiAKIAlpZiAoZGV2ICYmIGNwdWlkbGVfZ2V0X2RyaXZlcigpKSB7Ci0JCXN3aXRjaCAoYWN0aW9uKSB7Ci0JCWNhc2UgQ1BVX09OTElORToKLQkJY2FzZSBDUFVfT05MSU5FX0ZST1pFTjoKLQkJCWNwdWlkbGVfcGF1c2VfYW5kX2xvY2soKTsKLQkJCWNwdWlkbGVfZW5hYmxlX2RldmljZShkZXYpOwotCQkJY3B1aWRsZV9yZXN1bWVfYW5kX3VubG9jaygpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDUFVfREVBRDoKLQkJY2FzZSBDUFVfREVBRF9GUk9aRU46Ci0JCQljcHVpZGxlX3BhdXNlX2FuZF9sb2NrKCk7Ci0JCQljcHVpZGxlX2Rpc2FibGVfZGV2aWNlKGRldik7Ci0JCQljcHVpZGxlX3Jlc3VtZV9hbmRfdW5sb2NrKCk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIE5PVElGWV9ET05FOwotCQl9CisJCWNwdWlkbGVfcGF1c2VfYW5kX2xvY2soKTsKKwkJY3B1aWRsZV9lbmFibGVfZGV2aWNlKGRldik7CisJCWNwdWlkbGVfcmVzdW1lX2FuZF91bmxvY2soKTsKIAl9Ci0JcmV0dXJuIE5PVElGWV9PSzsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBzZXR1cF9ob3RwbHVnX25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsID0gcG93ZXJudl9jcHVpZGxlX2FkZF9jcHVfbm90aWZpZXIsCi19Oworc3RhdGljIGludCBwb3dlcm52X2NwdWlkbGVfY3B1X2RlYWQodW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiA9IHBlcl9jcHUoY3B1aWRsZV9kZXZpY2VzLCBjcHUpOworCisJaWYgKGRldiAmJiBjcHVpZGxlX2dldF9kcml2ZXIoKSkgeworCQljcHVpZGxlX3BhdXNlX2FuZF9sb2NrKCk7CisJCWNwdWlkbGVfZGlzYWJsZV9kZXZpY2UoZGV2KTsKKwkJY3B1aWRsZV9yZXN1bWVfYW5kX3VubG9jaygpOworCX0KKwlyZXR1cm4gMDsKK30KIAogLyoKICAqIHBvd2VybnZfY3B1aWRsZV9kcml2ZXJfaW5pdCgpCkBAIC0zNTUsNyArMzQ1LDE0IEBACiAJCXJldHVybiByZXR2YWw7CiAJfQogCi0JcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZzZXR1cF9ob3RwbHVnX25vdGlmaWVyKTsKKwlyZXR2YWwgPSBjcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX0FQX09OTElORV9EWU4sCisJCQkJCSAgICJjcHVpZGxlL3Bvd2VybnY6b25saW5lIiwKKwkJCQkJICAgcG93ZXJudl9jcHVpZGxlX2NwdV9vbmxpbmUsIE5VTEwpOworCVdBUk5fT04ocmV0dmFsIDwgMCk7CisJcmV0dmFsID0gY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9DUFVJRExFX0RFQUQsCisJCQkJCSAgICJjcHVpZGxlL3Bvd2VybnY6ZGVhZCIsIE5VTEwsCisJCQkJCSAgIHBvd2VybnZfY3B1aWRsZV9jcHVfZGVhZCk7CisJV0FSTl9PTihyZXR2YWwgPCAwKTsKIAlwcmludGsoS0VSTl9ERUJVRyAicG93ZXJudl9pZGxlX2RyaXZlciByZWdpc3RlcmVkXG4iKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLXBzZXJpZXMuYyBiL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLXBzZXJpZXMuYwppbmRleCAwNzEzNWUwLi4xNjZjY2Q3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS1wc2VyaWVzLmMKKysrIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtcHNlcmllcy5jCkBAIC0xNzEsMzkgKzE3MSwyOSBAQAogCQkuZW50ZXIgPSAmc2hhcmVkX2NlZGVfbG9vcCB9LAogfTsKIAotc3RhdGljIGludCBwc2VyaWVzX2NwdWlkbGVfYWRkX2NwdV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm4sCi0JCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQgcHNlcmllc19jcHVpZGxlX2NwdV9vbmxpbmUodW5zaWduZWQgaW50IGNwdSkKIHsKLQlpbnQgaG90Y3B1ID0gKHVuc2lnbmVkIGxvbmcpaGNwdTsKLQlzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiA9Ci0JCQkJcGVyX2NwdShjcHVpZGxlX2RldmljZXMsIGhvdGNwdSk7CisJc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYgPSBwZXJfY3B1KGNwdWlkbGVfZGV2aWNlcywgY3B1KTsKIAogCWlmIChkZXYgJiYgY3B1aWRsZV9nZXRfZHJpdmVyKCkpIHsKLQkJc3dpdGNoIChhY3Rpb24pIHsKLQkJY2FzZSBDUFVfT05MSU5FOgotCQljYXNlIENQVV9PTkxJTkVfRlJPWkVOOgotCQkJY3B1aWRsZV9wYXVzZV9hbmRfbG9jaygpOwotCQkJY3B1aWRsZV9lbmFibGVfZGV2aWNlKGRldik7Ci0JCQljcHVpZGxlX3Jlc3VtZV9hbmRfdW5sb2NrKCk7Ci0JCQlicmVhazsKLQotCQljYXNlIENQVV9ERUFEOgotCQljYXNlIENQVV9ERUFEX0ZST1pFTjoKLQkJCWNwdWlkbGVfcGF1c2VfYW5kX2xvY2soKTsKLQkJCWNwdWlkbGVfZGlzYWJsZV9kZXZpY2UoZGV2KTsKLQkJCWNwdWlkbGVfcmVzdW1lX2FuZF91bmxvY2soKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0JCX0KKwkJY3B1aWRsZV9wYXVzZV9hbmRfbG9jaygpOworCQljcHVpZGxlX2VuYWJsZV9kZXZpY2UoZGV2KTsKKwkJY3B1aWRsZV9yZXN1bWVfYW5kX3VubG9jaygpOwogCX0KLQlyZXR1cm4gTk9USUZZX09LOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHNldHVwX2hvdHBsdWdfbm90aWZpZXIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSBwc2VyaWVzX2NwdWlkbGVfYWRkX2NwdV9ub3RpZmllciwKLX07CitzdGF0aWMgaW50IHBzZXJpZXNfY3B1aWRsZV9jcHVfZGVhZCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2ID0gcGVyX2NwdShjcHVpZGxlX2RldmljZXMsIGNwdSk7CisKKwlpZiAoZGV2ICYmIGNwdWlkbGVfZ2V0X2RyaXZlcigpKSB7CisJCWNwdWlkbGVfcGF1c2VfYW5kX2xvY2soKTsKKwkJY3B1aWRsZV9kaXNhYmxlX2RldmljZShkZXYpOworCQljcHVpZGxlX3Jlc3VtZV9hbmRfdW5sb2NrKCk7CisJfQorCXJldHVybiAwOworfQogCiAvKgogICogcHNlcmllc19jcHVpZGxlX2RyaXZlcl9pbml0KCkKQEAgLTI3Myw3ICsyNjMsMTQgQEAKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKLQlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnNldHVwX2hvdHBsdWdfbm90aWZpZXIpOworCXJldHZhbCA9IGNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVBfT05MSU5FX0RZTiwKKwkJCQkJICAgImNwdWlkbGUvcHNlcmllczpvbmxpbmUiLAorCQkJCQkgICBwc2VyaWVzX2NwdWlkbGVfY3B1X29ubGluZSwgTlVMTCk7CisJV0FSTl9PTihyZXR2YWwgPCAwKTsKKwlyZXR2YWwgPSBjcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX0NQVUlETEVfREVBRCwKKwkJCQkJICAgImNwdWlkbGUvcHNlcmllczpERUFEIiwgTlVMTCwKKwkJCQkJICAgcHNlcmllc19jcHVpZGxlX2NwdV9kZWFkKTsKKwlXQVJOX09OKHJldHZhbCA8IDApOwogCXByaW50ayhLRVJOX0RFQlVHICJwc2VyaWVzX2lkbGVfZHJpdmVyIHJlZ2lzdGVyZWRcbiIpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vS2NvbmZpZyBiL2RyaXZlcnMvY3J5cHRvL0tjb25maWcKaW5kZXggMWFmOTRlMi4uOWIwMzViNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vS2NvbmZpZworKysgYi9kcml2ZXJzL2NyeXB0by9LY29uZmlnCkBAIC01NTAsNCArNTUwLDYgQEAKIAkgIFRoaXMgZHJpdmVyIGludGVyZmFjZXMgd2l0aCB0aGUgaGFyZHdhcmUgY3J5cHRvIGFjY2VsZXJhdG9yLgogCSAgU3VwcG9ydGluZyBjYmMvZWNiIGNoYWlubW9kZSwgYW5kIGFlcy9kZXMvZGVzM19lZGUgY2lwaGVyIG1vZGUuCiAKK3NvdXJjZSAiZHJpdmVycy9jcnlwdG8vY2hlbHNpby9LY29uZmlnIgorCiBlbmRpZiAjIENSWVBUT19IVwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vTWFrZWZpbGUgYi9kcml2ZXJzL2NyeXB0by9NYWtlZmlsZQppbmRleCAzYzY0MzJkZC4uYWQ3MjUwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jcnlwdG8vTWFrZWZpbGUKQEAgLTMxLDMgKzMxLDQgQEAKIG9iai0kKENPTkZJR19DUllQVE9fREVWX1ZNWCkgKz0gdm14Lwogb2JqLSQoQ09ORklHX0NSWVBUT19ERVZfU1VONElfU1MpICs9IHN1bnhpLXNzLwogb2JqLSQoQ09ORklHX0NSWVBUT19ERVZfUk9DS0NISVApICs9IHJvY2tjaGlwLworb2JqLSQoQ09ORklHX0NSWVBUT19ERVZfQ0hFTFNJTykgKz0gY2hlbHNpby8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL2NhYW0vY2FhbWFsZy5jIGIvZHJpdmVycy9jcnlwdG8vY2FhbS9jYWFtYWxnLmMKaW5kZXggZWE4MTg5Zi4uYjMwNDQyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vY2FhbS9jYWFtYWxnLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vY2FhbS9jYWFtYWxnLmMKQEAgLTQ0MSw2ICs0NDEsOSBAQAogCQkJICAgICAgIE9QX0FMR19BQUlfQ1RSX01PRDEyOCk7CiAJY29uc3QgYm9vbCBpc19yZmMzNjg2ID0gYWxnLT5jYWFtLnJmYzM2ODY7CiAKKwlpZiAoIWN0eC0+YXV0aHNpemUpCisJCXJldHVybiAwOworCiAJLyogTlVMTCBlbmNyeXB0aW9uIC8gZGVjcnlwdGlvbiAqLwogCWlmICghY3R4LT5lbmNrZXlsZW4pCiAJCXJldHVybiBhZWFkX251bGxfc2V0X3NoX2Rlc2MoYWVhZCk7CkBAIC01NTMsNyArNTU2LDEwIEBACiAKIAkvKiBSZWFkIGFuZCB3cml0ZSBhc3NvY2xlbiBieXRlcyAqLwogCWFwcGVuZF9tYXRoX2FkZChkZXNjLCBWQVJTRVFJTkxFTiwgWkVSTywgUkVHMywgQ0FBTV9DTURfU1opOwotCWFwcGVuZF9tYXRoX2FkZChkZXNjLCBWQVJTRVFPVVRMRU4sIFpFUk8sIFJFRzMsIENBQU1fQ01EX1NaKTsKKwlpZiAoYWxnLT5jYWFtLmdlbml2KQorCQlhcHBlbmRfbWF0aF9hZGRfaW1tX3UzMihkZXNjLCBWQVJTRVFPVVRMRU4sIFJFRzMsIElNTSwgaXZzaXplKTsKKwllbHNlCisJCWFwcGVuZF9tYXRoX2FkZChkZXNjLCBWQVJTRVFPVVRMRU4sIFpFUk8sIFJFRzMsIENBQU1fQ01EX1NaKTsKIAogCS8qIFNraXAgYXNzb2MgZGF0YSAqLwogCWFwcGVuZF9zZXFfZmlmb19zdG9yZShkZXNjLCAwLCBGSUZPU1RfVFlQRV9TS0lQIHwgRklGT0xEU1RfVkxGKTsKQEAgLTU2Miw2ICs1NjgsMTQgQEAKIAlhcHBlbmRfc2VxX2ZpZm9fbG9hZChkZXNjLCAwLCBGSUZPTERfQ0xBU1NfQ0xBU1MyIHwgRklGT0xEX1RZUEVfTVNHIHwKIAkJCSAgICAgS0VZX1ZMRik7CiAKKwlpZiAoYWxnLT5jYWFtLmdlbml2KSB7CisJCWFwcGVuZF9zZXFfbG9hZChkZXNjLCBpdnNpemUsIExEU1RfQ0xBU1NfMV9DQ0IgfAorCQkJCUxEU1RfU1JDRFNUX0JZVEVfQ09OVEVYVCB8CisJCQkJKGN0eDFfaXZfb2ZmIDw8IExEU1RfT0ZGU0VUX1NISUZUKSk7CisJCWFwcGVuZF9tb3ZlKGRlc2MsIE1PVkVfU1JDX0NMQVNTMUNUWCB8IE1PVkVfREVTVF9DTEFTUzJJTkZJRk8gfAorCQkJICAgIChjdHgxX2l2X29mZiA8PCBNT1ZFX09GRlNFVF9TSElGVCkgfCBpdnNpemUpOworCX0KKwogCS8qIExvYWQgQ291bnRlciBpbnRvIENPTlRFWFQxIHJlZyAqLwogCWlmIChpc19yZmMzNjg2KQogCQlhcHBlbmRfbG9hZF9pbW1fdTMyKGRlc2MsIGJlMzJfdG9fY3B1KDEpLCBMRFNUX0lNTSB8CkBAIC02MTQsNyArNjI4LDcgQEAKIAkJa2V5c19maXRfaW5saW5lID0gdHJ1ZTsKIAogCS8qIGFlYWRfZ2l2ZW5jcnlwdCBzaGFyZWQgZGVzY3JpcHRvciAqLwotCWRlc2MgPSBjdHgtPnNoX2Rlc2NfZ2l2ZW5jOworCWRlc2MgPSBjdHgtPnNoX2Rlc2NfZW5jOwogCiAJLyogTm90ZTogQ29udGV4dCByZWdpc3RlcnMgYXJlIHNhdmVkLiAqLwogCWluaXRfc2hfZGVzY19rZXlfYWVhZChkZXNjLCBjdHgsIGtleXNfZml0X2lubGluZSwgaXNfcmZjMzY4Nik7CkBAIC02NDUsMTMgKzY1OSwxMyBAQAogCWFwcGVuZF9vcGVyYXRpb24oZGVzYywgY3R4LT5jbGFzczJfYWxnX3R5cGUgfAogCQkJIE9QX0FMR19BU19JTklURklOQUwgfCBPUF9BTEdfRU5DUllQVCk7CiAKLQkvKiBpdnNpemUgKyBjcnlwdGxlbiA9IHNlcW91dGxlbiAtIGF1dGhzaXplICovCi0JYXBwZW5kX21hdGhfc3ViX2ltbV91MzIoZGVzYywgUkVHMywgU0VRT1VUTEVOLCBJTU0sIGN0eC0+YXV0aHNpemUpOwotCiAJLyogUmVhZCBhbmQgd3JpdGUgYXNzb2NsZW4gYnl0ZXMgKi8KIAlhcHBlbmRfbWF0aF9hZGQoZGVzYywgVkFSU0VRSU5MRU4sIFpFUk8sIFJFRzMsIENBQU1fQ01EX1NaKTsKIAlhcHBlbmRfbWF0aF9hZGQoZGVzYywgVkFSU0VRT1VUTEVOLCBaRVJPLCBSRUczLCBDQUFNX0NNRF9TWik7CiAKKwkvKiBpdnNpemUgKyBjcnlwdGxlbiA9IHNlcW91dGxlbiAtIGF1dGhzaXplICovCisJYXBwZW5kX21hdGhfc3ViX2ltbV91MzIoZGVzYywgUkVHMywgU0VRT1VUTEVOLCBJTU0sIGN0eC0+YXV0aHNpemUpOworCiAJLyogU2tpcCBhc3NvYyBkYXRhICovCiAJYXBwZW5kX3NlcV9maWZvX3N0b3JlKGRlc2MsIDAsIEZJRk9TVF9UWVBFX1NLSVAgfCBGSUZPTERTVF9WTEYpOwogCkBAIC02OTcsNyArNzExLDcgQEAKIAljdHgtPnNoX2Rlc2NfZW5jX2RtYSA9IGRtYV9tYXBfc2luZ2xlKGpyZGV2LCBkZXNjLAogCQkJCQkgICAgICBkZXNjX2J5dGVzKGRlc2MpLAogCQkJCQkgICAgICBETUFfVE9fREVWSUNFKTsKLQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoanJkZXYsIGN0eC0+c2hfZGVzY19naXZlbmNfZG1hKSkgeworCWlmIChkbWFfbWFwcGluZ19lcnJvcihqcmRldiwgY3R4LT5zaF9kZXNjX2VuY19kbWEpKSB7CiAJCWRldl9lcnIoanJkZXYsICJ1bmFibGUgdG8gbWFwIHNoYXJlZCBkZXNjcmlwdG9yXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMjE0Nyw3ICsyMTYxLDcgQEAKIAogCWluaXRfYWVhZF9qb2IocmVxLCBlZGVzYywgYWxsX2NvbnRpZywgZW5jcnlwdCk7CiAKLQlpZiAoaXZzaXplICYmIChpc19yZmMzNjg2IHx8ICEoYWxnLT5jYWFtLmdlbml2ICYmIGVuY3J5cHQpKSkKKwlpZiAoaXZzaXplICYmICgoaXNfcmZjMzY4NiAmJiBlbmNyeXB0KSB8fCAhYWxnLT5jYWFtLmdlbml2KSkKIAkJYXBwZW5kX2xvYWRfYXNfaW1tKGRlc2MsIHJlcS0+aXYsIGl2c2l6ZSwKIAkJCQkgICBMRFNUX0NMQVNTXzFfQ0NCIHwKIAkJCQkgICBMRFNUX1NSQ0RTVF9CWVRFX0NPTlRFWFQgfApAQCAtMjUzNCwyMCArMjU0OCw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBhZWFkX2dpdmRlY3J5cHQoc3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxKQotewotCXN0cnVjdCBjcnlwdG9fYWVhZCAqYWVhZCA9IGNyeXB0b19hZWFkX3JlcXRmbShyZXEpOwotCXVuc2lnbmVkIGludCBpdnNpemUgPSBjcnlwdG9fYWVhZF9pdnNpemUoYWVhZCk7Ci0KLQlpZiAocmVxLT5jcnlwdGxlbiA8IGl2c2l6ZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXEtPmNyeXB0bGVuIC09IGl2c2l6ZTsKLQlyZXEtPmFzc29jbGVuICs9IGl2c2l6ZTsKLQotCXJldHVybiBhZWFkX2RlY3J5cHQocmVxKTsKLX0KLQogLyoKICAqIGFsbG9jYXRlIGFuZCBtYXAgdGhlIGFibGtjaXBoZXIgZXh0ZW5kZWQgZGVzY3JpcHRvciBmb3IgYWJsa2NpcGhlcgogICovCkBAIC0zMjA3LDcgKzMyMDcsNyBAQAogCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAogCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKIAkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2dpdmRlY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKIAkJCS5pdnNpemUgPSBBRVNfQkxPQ0tfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IE1ENV9ESUdFU1RfU0laRSwKIAkJfSwKQEAgLTMyNTMsNyArMzI1Myw3IEBACiAJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCiAJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAogCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfZ2l2ZGVjcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWVhZF9kZWNyeXB0LAogCQkJLml2c2l6ZSA9IEFFU19CTE9DS19TSVpFLAogCQkJLm1heGF1dGhzaXplID0gU0hBMV9ESUdFU1RfU0laRSwKIAkJfSwKQEAgLTMyOTksNyArMzI5OSw3IEBACiAJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCiAJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAogCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfZ2l2ZGVjcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWVhZF9kZWNyeXB0LAogCQkJLml2c2l6ZSA9IEFFU19CTE9DS19TSVpFLAogCQkJLm1heGF1dGhzaXplID0gU0hBMjI0X0RJR0VTVF9TSVpFLAogCQl9LApAQCAtMzM0NSw3ICszMzQ1LDcgQEAKIAkJCS5zZXRrZXkgPSBhZWFkX3NldGtleSwKIAkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfc2V0YXV0aHNpemUsCiAJCQkuZW5jcnlwdCA9IGFlYWRfZW5jcnlwdCwKLQkJCS5kZWNyeXB0ID0gYWVhZF9naXZkZWNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCiAJCQkuaXZzaXplID0gQUVTX0JMT0NLX1NJWkUsCiAJCQkubWF4YXV0aHNpemUgPSBTSEEyNTZfRElHRVNUX1NJWkUsCiAJCX0sCkBAIC0zMzkxLDcgKzMzOTEsNyBAQAogCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAogCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKIAkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2dpdmRlY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKIAkJCS5pdnNpemUgPSBBRVNfQkxPQ0tfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IFNIQTM4NF9ESUdFU1RfU0laRSwKIAkJfSwKQEAgLTM0MzcsNyArMzQzNyw3IEBACiAJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCiAJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAogCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfZ2l2ZGVjcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWVhZF9kZWNyeXB0LAogCQkJLml2c2l6ZSA9IEFFU19CTE9DS19TSVpFLAogCQkJLm1heGF1dGhzaXplID0gU0hBNTEyX0RJR0VTVF9TSVpFLAogCQl9LApAQCAtMzQ4Myw3ICszNDgzLDcgQEAKIAkJCS5zZXRrZXkgPSBhZWFkX3NldGtleSwKIAkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfc2V0YXV0aHNpemUsCiAJCQkuZW5jcnlwdCA9IGFlYWRfZW5jcnlwdCwKLQkJCS5kZWNyeXB0ID0gYWVhZF9naXZkZWNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCiAJCQkuaXZzaXplID0gREVTM19FREVfQkxPQ0tfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IE1ENV9ESUdFU1RfU0laRSwKIAkJfSwKQEAgLTM1MzEsNyArMzUzMSw3IEBACiAJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCiAJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAogCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfZ2l2ZGVjcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWVhZF9kZWNyeXB0LAogCQkJLml2c2l6ZSA9IERFUzNfRURFX0JMT0NLX1NJWkUsCiAJCQkubWF4YXV0aHNpemUgPSBTSEExX0RJR0VTVF9TSVpFLAogCQl9LApAQCAtMzU3OSw3ICszNTc5LDcgQEAKIAkJCS5zZXRrZXkgPSBhZWFkX3NldGtleSwKIAkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfc2V0YXV0aHNpemUsCiAJCQkuZW5jcnlwdCA9IGFlYWRfZW5jcnlwdCwKLQkJCS5kZWNyeXB0ID0gYWVhZF9naXZkZWNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCiAJCQkuaXZzaXplID0gREVTM19FREVfQkxPQ0tfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IFNIQTIyNF9ESUdFU1RfU0laRSwKIAkJfSwKQEAgLTM2MjcsNyArMzYyNyw3IEBACiAJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCiAJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAogCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfZ2l2ZGVjcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWVhZF9kZWNyeXB0LAogCQkJLml2c2l6ZSA9IERFUzNfRURFX0JMT0NLX1NJWkUsCiAJCQkubWF4YXV0aHNpemUgPSBTSEEyNTZfRElHRVNUX1NJWkUsCiAJCX0sCkBAIC0zNjc1LDcgKzM2NzUsNyBAQAogCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAogCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKIAkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2dpdmRlY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKIAkJCS5pdnNpemUgPSBERVMzX0VERV9CTE9DS19TSVpFLAogCQkJLm1heGF1dGhzaXplID0gU0hBMzg0X0RJR0VTVF9TSVpFLAogCQl9LApAQCAtMzcyMyw3ICszNzIzLDcgQEAKIAkJCS5zZXRrZXkgPSBhZWFkX3NldGtleSwKIAkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfc2V0YXV0aHNpemUsCiAJCQkuZW5jcnlwdCA9IGFlYWRfZW5jcnlwdCwKLQkJCS5kZWNyeXB0ID0gYWVhZF9naXZkZWNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCiAJCQkuaXZzaXplID0gREVTM19FREVfQkxPQ0tfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IFNIQTUxMl9ESUdFU1RfU0laRSwKIAkJfSwKQEAgLTM3NjksNyArMzc2OSw3IEBACiAJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCiAJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAogCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfZ2l2ZGVjcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWVhZF9kZWNyeXB0LAogCQkJLml2c2l6ZSA9IERFU19CTE9DS19TSVpFLAogCQkJLm1heGF1dGhzaXplID0gTUQ1X0RJR0VTVF9TSVpFLAogCQl9LApAQCAtMzgxNSw3ICszODE1LDcgQEAKIAkJCS5zZXRrZXkgPSBhZWFkX3NldGtleSwKIAkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfc2V0YXV0aHNpemUsCiAJCQkuZW5jcnlwdCA9IGFlYWRfZW5jcnlwdCwKLQkJCS5kZWNyeXB0ID0gYWVhZF9naXZkZWNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCiAJCQkuaXZzaXplID0gREVTX0JMT0NLX1NJWkUsCiAJCQkubWF4YXV0aHNpemUgPSBTSEExX0RJR0VTVF9TSVpFLAogCQl9LApAQCAtMzg2MSw3ICszODYxLDcgQEAKIAkJCS5zZXRrZXkgPSBhZWFkX3NldGtleSwKIAkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfc2V0YXV0aHNpemUsCiAJCQkuZW5jcnlwdCA9IGFlYWRfZW5jcnlwdCwKLQkJCS5kZWNyeXB0ID0gYWVhZF9naXZkZWNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCiAJCQkuaXZzaXplID0gREVTX0JMT0NLX1NJWkUsCiAJCQkubWF4YXV0aHNpemUgPSBTSEEyMjRfRElHRVNUX1NJWkUsCiAJCX0sCkBAIC0zOTA3LDcgKzM5MDcsNyBAQAogCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAogCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKIAkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2dpdmRlY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKIAkJCS5pdnNpemUgPSBERVNfQkxPQ0tfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IFNIQTI1Nl9ESUdFU1RfU0laRSwKIAkJfSwKQEAgLTM5NTMsNyArMzk1Myw3IEBACiAJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCiAJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAogCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfZ2l2ZGVjcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWVhZF9kZWNyeXB0LAogCQkJLml2c2l6ZSA9IERFU19CTE9DS19TSVpFLAogCQkJLm1heGF1dGhzaXplID0gU0hBMzg0X0RJR0VTVF9TSVpFLAogCQl9LApAQCAtMzk5OSw3ICszOTk5LDcgQEAKIAkJCS5zZXRrZXkgPSBhZWFkX3NldGtleSwKIAkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfc2V0YXV0aHNpemUsCiAJCQkuZW5jcnlwdCA9IGFlYWRfZW5jcnlwdCwKLQkJCS5kZWNyeXB0ID0gYWVhZF9naXZkZWNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCiAJCQkuaXZzaXplID0gREVTX0JMT0NLX1NJWkUsCiAJCQkubWF4YXV0aHNpemUgPSBTSEE1MTJfRElHRVNUX1NJWkUsCiAJCX0sCkBAIC00MDQ4LDcgKzQwNDgsNyBAQAogCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAogCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKIAkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2dpdmRlY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKIAkJCS5pdnNpemUgPSBDVFJfUkZDMzY4Nl9JVl9TSVpFLAogCQkJLm1heGF1dGhzaXplID0gTUQ1X0RJR0VTVF9TSVpFLAogCQl9LApAQCAtNDA5OSw3ICs0MDk5LDcgQEAKIAkJCS5zZXRrZXkgPSBhZWFkX3NldGtleSwKIAkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfc2V0YXV0aHNpemUsCiAJCQkuZW5jcnlwdCA9IGFlYWRfZW5jcnlwdCwKLQkJCS5kZWNyeXB0ID0gYWVhZF9naXZkZWNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCiAJCQkuaXZzaXplID0gQ1RSX1JGQzM2ODZfSVZfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IFNIQTFfRElHRVNUX1NJWkUsCiAJCX0sCkBAIC00MTUwLDcgKzQxNTAsNyBAQAogCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAogCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKIAkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2dpdmRlY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKIAkJCS5pdnNpemUgPSBDVFJfUkZDMzY4Nl9JVl9TSVpFLAogCQkJLm1heGF1dGhzaXplID0gU0hBMjI0X0RJR0VTVF9TSVpFLAogCQl9LApAQCAtNDIwMSw3ICs0MjAxLDcgQEAKIAkJCS5zZXRrZXkgPSBhZWFkX3NldGtleSwKIAkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfc2V0YXV0aHNpemUsCiAJCQkuZW5jcnlwdCA9IGFlYWRfZW5jcnlwdCwKLQkJCS5kZWNyeXB0ID0gYWVhZF9naXZkZWNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCiAJCQkuaXZzaXplID0gQ1RSX1JGQzM2ODZfSVZfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IFNIQTI1Nl9ESUdFU1RfU0laRSwKIAkJfSwKQEAgLTQyNTIsNyArNDI1Miw3IEBACiAJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCiAJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAogCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfZ2l2ZGVjcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWVhZF9kZWNyeXB0LAogCQkJLml2c2l6ZSA9IENUUl9SRkMzNjg2X0lWX1NJWkUsCiAJCQkubWF4YXV0aHNpemUgPSBTSEEzODRfRElHRVNUX1NJWkUsCiAJCX0sCkBAIC00MzAzLDcgKzQzMDMsNyBAQAogCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAogCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKIAkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2dpdmRlY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKIAkJCS5pdnNpemUgPSBDVFJfUkZDMzY4Nl9JVl9TSVpFLAogCQkJLm1heGF1dGhzaXplID0gU0hBNTEyX0RJR0VTVF9TSVpFLAogCQl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vY2FhbS9jYWFtaGFzaC5jIGIvZHJpdmVycy9jcnlwdG8vY2FhbS9jYWFtaGFzaC5jCmluZGV4IGYxZWNjOGQuLjM2MzY1YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL2NhYW0vY2FhbWhhc2guYworKysgYi9kcml2ZXJzL2NyeXB0by9jYWFtL2NhYW1oYXNoLmMKQEAgLTE4OTgsNiArMTg5OCw3IEBACiAJCQkgdGVtcGxhdGUtPm5hbWUpOwogCQlzbnByaW50ZihhbGctPmNyYV9kcml2ZXJfbmFtZSwgQ1JZUFRPX01BWF9BTEdfTkFNRSwgIiVzIiwKIAkJCSB0ZW1wbGF0ZS0+ZHJpdmVyX25hbWUpOworCQl0X2FsZy0+YWhhc2hfYWxnLnNldGtleSA9IE5VTEw7CiAJfQogCWFsZy0+Y3JhX21vZHVsZSA9IFRISVNfTU9EVUxFOwogCWFsZy0+Y3JhX2luaXQgPSBjYWFtX2hhc2hfY3JhX2luaXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9jaGVsc2lvL0tjb25maWcgYi9kcml2ZXJzL2NyeXB0by9jaGVsc2lvL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNlNjdmYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vS2NvbmZpZwpAQCAtMCwwICsxLDE5IEBACitjb25maWcgQ1JZUFRPX0RFVl9DSEVMU0lPCisJdHJpc3RhdGUgIkNoZWxzaW8gQ3J5cHRvIENvLXByb2Nlc3NvciBEcml2ZXIiCisJZGVwZW5kcyBvbiBDSEVMU0lPX1Q0CisJc2VsZWN0IENSWVBUT19TSEExCisJc2VsZWN0IENSWVBUT19TSEEyNTYKKwlzZWxlY3QgQ1JZUFRPX1NIQTUxMgorCS0tLWhlbHAtLS0KKwkgIFRoZSBDaGVsc2lvIENyeXB0byBDby1wcm9jZXNzb3IgZHJpdmVyIGZvciBUNiBhZGFwdGVycy4KKworCSAgRm9yIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgQ2hlbHNpbyBhbmQgb3VyIHByb2R1Y3RzLCB2aXNpdAorCSAgb3VyIHdlYnNpdGUgYXQgPGh0dHA6Ly93d3cuY2hlbHNpby5jb20+LgorCisJICBGb3IgY3VzdG9tZXIgc3VwcG9ydCwgcGxlYXNlIHZpc2l0IG91ciBjdXN0b21lciBzdXBwb3J0IHBhZ2UgYXQKKwkgIDxodHRwOi8vd3d3LmNoZWxzaW8uY29tL3N1cHBvcnQuaHRtbD4uCisKKwkgIFBsZWFzZSBzZW5kIGZlZWRiYWNrIHRvIDxsaW51eC1idWdzQGNoZWxzaW8uY29tPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgY2hjci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vTWFrZWZpbGUgYi9kcml2ZXJzL2NyeXB0by9jaGVsc2lvL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYmRmMDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NyeXB0by9jaGVsc2lvL01ha2VmaWxlCkBAIC0wLDAgKzEsNCBAQAorY2NmbGFncy15IDo9IC1JZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNAorCitvYmotJChDT05GSUdfQ1JZUFRPX0RFVl9DSEVMU0lPKSArPSBjaGNyLm8KK2NoY3Itb2JqcyA6PSAgY2hjcl9jb3JlLm8gY2hjcl9hbGdvLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vY2hjcl9hbGdvLmMgYi9kcml2ZXJzL2NyeXB0by9jaGVsc2lvL2NoY3JfYWxnby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZGRiOTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NyeXB0by9jaGVsc2lvL2NoY3JfYWxnby5jCkBAIC0wLDAgKzEsMTUyNSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDaGVsc2lvIFQ2IENyeXB0byBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE2IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqIFdyaXR0ZW4gYW5kIE1haW50YWluZWQgYnk6CisgKglNYW5vaiBNYWx2aXlhIChtYW5vam1hbHZpeWFAY2hlbHNpby5jb20pCisgKglBdHVsIEd1cHRhIChhdHVsLmd1cHRhQGNoZWxzaW8uY29tKQorICoJSml0ZW5kcmEgTHVsbGEgKGpsdWxsYUBjaGVsc2lvLmNvbSkKKyAqCVllc2hhc3dpIE0gUiBHb3dkYSAoeWVzaGFzd2lAY2hlbHNpby5jb20pCisgKglIYXJzaCBKYWluIChoYXJzaEBjaGVsc2lvLmNvbSkKKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpICJjaGNyOiIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG9oYXNoLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisKKyNpbmNsdWRlIDxjcnlwdG8vYWVzLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2FsZ2FwaS5oPgorI2luY2x1ZGUgPGNyeXB0by9oYXNoLmg+CisjaW5jbHVkZSA8Y3J5cHRvL3NoYS5oPgorI2luY2x1ZGUgPGNyeXB0by9pbnRlcm5hbC9oYXNoLmg+CisKKyNpbmNsdWRlICJ0NGZ3X2FwaS5oIgorI2luY2x1ZGUgInQ0X21zZy5oIgorI2luY2x1ZGUgImNoY3JfY29yZS5oIgorI2luY2x1ZGUgImNoY3JfYWxnby5oIgorI2luY2x1ZGUgImNoY3JfY3J5cHRvLmgiCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGFibGtfY3R4ICpBQkxLX0NUWChzdHJ1Y3QgY2hjcl9jb250ZXh0ICpjdHgpCit7CisJcmV0dXJuIGN0eC0+Y3J5cHRvX2N0eC0+YWJsa2N0eDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaG1hY19jdHggKkhNQUNfQ1RYKHN0cnVjdCBjaGNyX2NvbnRleHQgKmN0eCkKK3sKKwlyZXR1cm4gY3R4LT5jcnlwdG9fY3R4LT5obWFjY3R4OworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB1bGRfY3R4ICpVTERfQ1RYKHN0cnVjdCBjaGNyX2NvbnRleHQgKmN0eCkKK3sKKwlyZXR1cm4gY3R4LT5kZXYtPnVfY3R4OworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19vZmxkX2ltbShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAoc2tiLT5sZW4gPD0gQ1JZUFRPX01BWF9JTU1fVFhfUEtUX0xFTik7Cit9CisKKy8qCisgKglzZ2xfbGVuIC0gY2FsY3VsYXRlcyB0aGUgc2l6ZSBvZiBhbiBTR0wgb2YgdGhlIGdpdmVuIGNhcGFjaXR5CisgKglAbjogdGhlIG51bWJlciBvZiBTR0wgZW50cmllcworICoJQ2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mIGZsaXRzIG5lZWRlZCBmb3IgYSBzY2F0dGVyL2dhdGhlciBsaXN0IHRoYXQKKyAqCWNhbiBob2xkIHRoZSBnaXZlbiBudW1iZXIgb2YgZW50cmllcy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc2dsX2xlbih1bnNpZ25lZCBpbnQgbikKK3sKKwluLS07CisJcmV0dXJuICgzICogbikgLyAyICsgKG4gJiAxKSArIDI7Cit9CisKKy8qCisgKgljaGNyX2hhbmRsZV9yZXNwIC0gVW5tYXAgdGhlIERNQSBidWZmZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdAorICoJQHJlcTogY3J5cHRvIHJlcXVlc3QKKyAqLworaW50IGNoY3JfaGFuZGxlX3Jlc3Aoc3RydWN0IGNyeXB0b19hc3luY19yZXF1ZXN0ICpyZXEsIHVuc2lnbmVkIGNoYXIgKmlucHV0LAorCQkgICAgIGludCBlcnJvcl9zdGF0dXMpCit7CisJc3RydWN0IGNyeXB0b190Zm0gKnRmbSA9IHJlcS0+dGZtOworCXN0cnVjdCBjaGNyX2NvbnRleHQgKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CisJc3RydWN0IHVsZF9jdHggKnVfY3R4ID0gVUxEX0NUWChjdHgpOworCXN0cnVjdCBjaGNyX3JlcV9jdHggY3R4X3JlcTsKKwlzdHJ1Y3QgY3BsX2Z3Nl9wbGQgKmZ3Nl9wbGQ7CisJdW5zaWduZWQgaW50IGRpZ2VzdHNpemUsIHVwZGF0ZWRfZGlnZXN0c2l6ZTsKKworCXN3aXRjaCAodGZtLT5fX2NydF9hbGctPmNyYV9mbGFncyAmIENSWVBUT19BTEdfVFlQRV9NQVNLKSB7CisJY2FzZSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSOgorCQljdHhfcmVxLnJlcS5hYmxrX3JlcSA9IChzdHJ1Y3QgYWJsa2NpcGhlcl9yZXF1ZXN0ICopcmVxOworCQljdHhfcmVxLmN0eC5hYmxrX2N0eCA9CisJCQlhYmxrY2lwaGVyX3JlcXVlc3RfY3R4KGN0eF9yZXEucmVxLmFibGtfcmVxKTsKKwkJaWYgKCFlcnJvcl9zdGF0dXMpIHsKKwkJCWZ3Nl9wbGQgPSAoc3RydWN0IGNwbF9mdzZfcGxkICopaW5wdXQ7CisJCQltZW1jcHkoY3R4X3JlcS5yZXEuYWJsa19yZXEtPmluZm8sICZmdzZfcGxkLT5kYXRhWzJdLAorCQkJICAgICAgIEFFU19CTE9DS19TSVpFKTsKKwkJfQorCQlkbWFfdW5tYXBfc2coJnVfY3R4LT5sbGRpLnBkZXYtPmRldiwgY3R4X3JlcS5yZXEuYWJsa19yZXEtPmRzdCwKKwkJCSAgICAgQUJMS19DVFgoY3R4KS0+ZHN0X25lbnRzLCBETUFfRlJPTV9ERVZJQ0UpOworCQlpZiAoY3R4X3JlcS5jdHguYWJsa19jdHgtPnNrYikgeworCQkJa2ZyZWVfc2tiKGN0eF9yZXEuY3R4LmFibGtfY3R4LT5za2IpOworCQkJY3R4X3JlcS5jdHguYWJsa19jdHgtPnNrYiA9IE5VTEw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIENSWVBUT19BTEdfVFlQRV9BSEFTSDoKKwkJY3R4X3JlcS5yZXEuYWhhc2hfcmVxID0gKHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICopcmVxOworCQljdHhfcmVxLmN0eC5haGFzaF9jdHggPQorCQkJYWhhc2hfcmVxdWVzdF9jdHgoY3R4X3JlcS5yZXEuYWhhc2hfcmVxKTsKKwkJZGlnZXN0c2l6ZSA9CisJCQljcnlwdG9fYWhhc2hfZGlnZXN0c2l6ZShjcnlwdG9fYWhhc2hfcmVxdGZtKAorCQkJCQkJCWN0eF9yZXEucmVxLmFoYXNoX3JlcSkpOworCQl1cGRhdGVkX2RpZ2VzdHNpemUgPSBkaWdlc3RzaXplOworCQlpZiAoZGlnZXN0c2l6ZSA9PSBTSEEyMjRfRElHRVNUX1NJWkUpCisJCQl1cGRhdGVkX2RpZ2VzdHNpemUgPSBTSEEyNTZfRElHRVNUX1NJWkU7CisJCWVsc2UgaWYgKGRpZ2VzdHNpemUgPT0gU0hBMzg0X0RJR0VTVF9TSVpFKQorCQkJdXBkYXRlZF9kaWdlc3RzaXplID0gU0hBNTEyX0RJR0VTVF9TSVpFOworCQlpZiAoY3R4X3JlcS5jdHguYWhhc2hfY3R4LT5za2IpCisJCQljdHhfcmVxLmN0eC5haGFzaF9jdHgtPnNrYiA9IE5VTEw7CisJCWlmIChjdHhfcmVxLmN0eC5haGFzaF9jdHgtPnJlc3VsdCA9PSAxKSB7CisJCQljdHhfcmVxLmN0eC5haGFzaF9jdHgtPnJlc3VsdCA9IDA7CisJCQltZW1jcHkoY3R4X3JlcS5yZXEuYWhhc2hfcmVxLT5yZXN1bHQsIGlucHV0ICsKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGNwbF9mdzZfcGxkKSwKKwkJCSAgICAgICBkaWdlc3RzaXplKTsKKwkJfSBlbHNlIHsKKwkJCW1lbWNweShjdHhfcmVxLmN0eC5haGFzaF9jdHgtPnBhcnRpYWxfaGFzaCwgaW5wdXQgKworCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgY3BsX2Z3Nl9wbGQpLAorCQkJICAgICAgIHVwZGF0ZWRfZGlnZXN0c2l6ZSk7CisJCX0KKwkJa2ZyZWUoY3R4X3JlcS5jdHguYWhhc2hfY3R4LT5kdW1teV9wYXlsb2FkX3B0cik7CisJCWN0eF9yZXEuY3R4LmFoYXNoX2N0eC0+ZHVtbXlfcGF5bG9hZF9wdHIgPSBOVUxMOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKgljYWxjX3R4X2ZsaXRzX29mbGQgLSBjYWxjdWxhdGUgIyBvZiBmbGl0cyBmb3IgYW4gb2ZmbG9hZCBwYWNrZXQKKyAqCUBza2I6IHRoZSBwYWNrZXQKKyAqCVJldHVybnMgdGhlIG51bWJlciBvZiBmbGl0cyBuZWVkZWQgZm9yIHRoZSBnaXZlbiBvZmZsb2FkIHBhY2tldC4KKyAqCVRoZXNlIHBhY2tldHMgYXJlIGFscmVhZHkgZnVsbHkgY29uc3RydWN0ZWQgYW5kIG5vIGFkZGl0aW9uYWwgaGVhZGVycworICoJd2lsbCBiZSBhZGRlZC4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2FsY190eF9mbGl0c19vZmxkKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJdW5zaWduZWQgaW50IGZsaXRzLCBjbnQ7CisKKwlpZiAoaXNfb2ZsZF9pbW0oc2tiKSkKKwkJcmV0dXJuIERJVl9ST1VORF9VUChza2ItPmxlbiwgOCk7CisKKwlmbGl0cyA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgLyA4OyAgIC8qIGhlYWRlcnMgKi8KKwljbnQgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOworCWlmIChza2JfdGFpbF9wb2ludGVyKHNrYikgIT0gc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSkKKwkJY250Kys7CisJcmV0dXJuIGZsaXRzICsgc2dsX2xlbihjbnQpOworfQorCitzdGF0aWMgc3RydWN0IHNoYXNoX2Rlc2MgKmNoY3JfYWxsb2Nfc2hhc2godW5zaWduZWQgaW50IGRzKQoreworCXN0cnVjdCBjcnlwdG9fc2hhc2ggKmJhc2VfaGFzaCA9IE5VTEw7CisJc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2M7CisKKwlzd2l0Y2ggKGRzKSB7CisJY2FzZSBTSEExX0RJR0VTVF9TSVpFOgorCQliYXNlX2hhc2ggPSBjcnlwdG9fYWxsb2Nfc2hhc2goInNoYTEtZ2VuZXJpYyIsIDAsIDApOworCQlicmVhazsKKwljYXNlIFNIQTIyNF9ESUdFU1RfU0laRToKKwkJYmFzZV9oYXNoID0gY3J5cHRvX2FsbG9jX3NoYXNoKCJzaGEyMjQtZ2VuZXJpYyIsIDAsIDApOworCQlicmVhazsKKwljYXNlIFNIQTI1Nl9ESUdFU1RfU0laRToKKwkJYmFzZV9oYXNoID0gY3J5cHRvX2FsbG9jX3NoYXNoKCJzaGEyNTYtZ2VuZXJpYyIsIDAsIDApOworCQlicmVhazsKKwljYXNlIFNIQTM4NF9ESUdFU1RfU0laRToKKwkJYmFzZV9oYXNoID0gY3J5cHRvX2FsbG9jX3NoYXNoKCJzaGEzODQtZ2VuZXJpYyIsIDAsIDApOworCQlicmVhazsKKwljYXNlIFNIQTUxMl9ESUdFU1RfU0laRToKKwkJYmFzZV9oYXNoID0gY3J5cHRvX2FsbG9jX3NoYXNoKCJzaGE1MTItZ2VuZXJpYyIsIDAsIDApOworCQlicmVhazsKKwl9CisJaWYgKElTX0VSUihiYXNlX2hhc2gpKSB7CisJCXByX2VycigiQ2FuIG5vdCBhbGxvY2F0ZSBzaGEtZ2VuZXJpYyBhbGdvLlxuIik7CisJCXJldHVybiAodm9pZCAqKWJhc2VfaGFzaDsKKwl9CisKKwlkZXNjID0ga21hbGxvYyhzaXplb2YoKmRlc2MpICsgY3J5cHRvX3NoYXNoX2Rlc2NzaXplKGJhc2VfaGFzaCksCisJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWRlc2MpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWRlc2MtPnRmbSA9IGJhc2VfaGFzaDsKKwlkZXNjLT5mbGFncyA9IGNyeXB0b19zaGFzaF9nZXRfZmxhZ3MoYmFzZV9oYXNoKTsKKwlyZXR1cm4gZGVzYzsKK30KKworc3RhdGljIGludCBjaGNyX2NvbXB1dGVfcGFydGlhbF9oYXNoKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLAorCQkJCSAgICAgY2hhciAqaW9wYWQsIGNoYXIgKnJlc3VsdF9oYXNoLAorCQkJCSAgICAgaW50IGRpZ2VzdF9zaXplKQoreworCXN0cnVjdCBzaGExX3N0YXRlIHNoYTFfc3Q7CisJc3RydWN0IHNoYTI1Nl9zdGF0ZSBzaGEyNTZfc3Q7CisJc3RydWN0IHNoYTUxMl9zdGF0ZSBzaGE1MTJfc3Q7CisJaW50IGVycm9yOworCisJaWYgKGRpZ2VzdF9zaXplID09IFNIQTFfRElHRVNUX1NJWkUpIHsKKwkJZXJyb3IgPSBjcnlwdG9fc2hhc2hfaW5pdChkZXNjKSA/OgorCQkJY3J5cHRvX3NoYXNoX3VwZGF0ZShkZXNjLCBpb3BhZCwgU0hBMV9CTE9DS19TSVpFKSA/OgorCQkJY3J5cHRvX3NoYXNoX2V4cG9ydChkZXNjLCAodm9pZCAqKSZzaGExX3N0KTsKKwkJbWVtY3B5KHJlc3VsdF9oYXNoLCBzaGExX3N0LnN0YXRlLCBTSEExX0RJR0VTVF9TSVpFKTsKKwl9IGVsc2UgaWYgKGRpZ2VzdF9zaXplID09IFNIQTIyNF9ESUdFU1RfU0laRSkgeworCQllcnJvciA9IGNyeXB0b19zaGFzaF9pbml0KGRlc2MpID86CisJCQljcnlwdG9fc2hhc2hfdXBkYXRlKGRlc2MsIGlvcGFkLCBTSEEyNTZfQkxPQ0tfU0laRSkgPzoKKwkJCWNyeXB0b19zaGFzaF9leHBvcnQoZGVzYywgKHZvaWQgKikmc2hhMjU2X3N0KTsKKwkJbWVtY3B5KHJlc3VsdF9oYXNoLCBzaGEyNTZfc3Quc3RhdGUsIFNIQTI1Nl9ESUdFU1RfU0laRSk7CisKKwl9IGVsc2UgaWYgKGRpZ2VzdF9zaXplID09IFNIQTI1Nl9ESUdFU1RfU0laRSkgeworCQllcnJvciA9IGNyeXB0b19zaGFzaF9pbml0KGRlc2MpID86CisJCQljcnlwdG9fc2hhc2hfdXBkYXRlKGRlc2MsIGlvcGFkLCBTSEEyNTZfQkxPQ0tfU0laRSkgPzoKKwkJCWNyeXB0b19zaGFzaF9leHBvcnQoZGVzYywgKHZvaWQgKikmc2hhMjU2X3N0KTsKKwkJbWVtY3B5KHJlc3VsdF9oYXNoLCBzaGEyNTZfc3Quc3RhdGUsIFNIQTI1Nl9ESUdFU1RfU0laRSk7CisKKwl9IGVsc2UgaWYgKGRpZ2VzdF9zaXplID09IFNIQTM4NF9ESUdFU1RfU0laRSkgeworCQllcnJvciA9IGNyeXB0b19zaGFzaF9pbml0KGRlc2MpID86CisJCQljcnlwdG9fc2hhc2hfdXBkYXRlKGRlc2MsIGlvcGFkLCBTSEE1MTJfQkxPQ0tfU0laRSkgPzoKKwkJCWNyeXB0b19zaGFzaF9leHBvcnQoZGVzYywgKHZvaWQgKikmc2hhNTEyX3N0KTsKKwkJbWVtY3B5KHJlc3VsdF9oYXNoLCBzaGE1MTJfc3Quc3RhdGUsIFNIQTUxMl9ESUdFU1RfU0laRSk7CisKKwl9IGVsc2UgaWYgKGRpZ2VzdF9zaXplID09IFNIQTUxMl9ESUdFU1RfU0laRSkgeworCQllcnJvciA9IGNyeXB0b19zaGFzaF9pbml0KGRlc2MpID86CisJCQljcnlwdG9fc2hhc2hfdXBkYXRlKGRlc2MsIGlvcGFkLCBTSEE1MTJfQkxPQ0tfU0laRSkgPzoKKwkJCWNyeXB0b19zaGFzaF9leHBvcnQoZGVzYywgKHZvaWQgKikmc2hhNTEyX3N0KTsKKwkJbWVtY3B5KHJlc3VsdF9oYXNoLCBzaGE1MTJfc3Quc3RhdGUsIFNIQTUxMl9ESUdFU1RfU0laRSk7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlwcl9lcnIoIlVua25vd24gZGlnZXN0IHNpemUgJWRcbiIsIGRpZ2VzdF9zaXplKTsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBjaGNyX2NoYW5nZV9vcmRlcihjaGFyICpidWYsIGludCBkcykKK3sKKwlpbnQgaTsKKworCWlmIChkcyA9PSBTSEE1MTJfRElHRVNUX1NJWkUpIHsKKwkJZm9yIChpID0gMDsgaSA8IChkcyAvIHNpemVvZih1NjQpKTsgaSsrKQorCQkJKigoX19iZTY0ICopYnVmICsgaSkgPQorCQkJCWNwdV90b19iZTY0KCooKHU2NCAqKWJ1ZiArIGkpKTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgKGRzIC8gc2l6ZW9mKHUzMikpOyBpKyspCisJCQkqKChfX2JlMzIgKilidWYgKyBpKSA9CisJCQkJY3B1X3RvX2JlMzIoKigodTMyICopYnVmICsgaSkpOworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfaG1hYyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXN0cnVjdCBjcnlwdG9fYWxnICphbGcgPSB0Zm0tPl9fY3J0X2FsZzsKKwlzdHJ1Y3QgY2hjcl9hbGdfdGVtcGxhdGUgKmNoY3JfY3J5cHRvX2FsZyA9CisJCWNvbnRhaW5lcl9vZihfX2NyeXB0b19haGFzaF9hbGcoYWxnKSwgc3RydWN0IGNoY3JfYWxnX3RlbXBsYXRlLAorCQkJICAgICBhbGcuaGFzaCk7CisJaWYgKChjaGNyX2NyeXB0b19hbGctPnR5cGUgJiBDUllQVE9fQUxHX1NVQl9UWVBFX01BU0spID09CisJICAgIENSWVBUT19BTEdfU1VCX1RZUEVfSEFTSF9ITUFDKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2hfbmVudHMoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCQkgICAgdW5zaWduZWQgaW50ICp0b3RhbF9zaXplKQoreworCXVuc2lnbmVkIGludCBuZW50czsKKworCWZvciAobmVudHMgPSAwLCAqdG90YWxfc2l6ZSA9IDA7IHNnOyBzZyA9IHNnX25leHQoc2cpKSB7CisJCW5lbnRzKys7CisJCSp0b3RhbF9zaXplICs9IHNnLT5sZW5ndGg7CisJfQorCXJldHVybiBuZW50czsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfcGh5c19jcGwoc3RydWN0IGNwbF9yeF9waHlzX2RzZ2wgKnBoeXNfY3BsLAorCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCSAgIHN0cnVjdCBwaHlzX3NnZV9wYXJtICpzZ19wYXJhbSkKK3sKKwlzdHJ1Y3QgcGh5c19zZ2VfcGFpcnMgKnRvOworCXVuc2lnbmVkIGludCBvdXRfYnVmX3NpemUgPSBzZ19wYXJhbS0+b2JzaXplOworCXVuc2lnbmVkIGludCBuZW50cyA9IHNnX3BhcmFtLT5uZW50cywgaSwgaiwgdG90X2xlbiA9IDA7CisKKwlwaHlzX2NwbC0+b3BfdG9fdGlkID0gaHRvbmwoQ1BMX1JYX1BIWVNfRFNHTF9PUENPREVfVihDUExfUlhfUEhZU19EU0dMKQorCQkJCSAgICB8IENQTF9SWF9QSFlTX0RTR0xfSVNSRE1BX1YoMCkpOworCXBoeXNfY3BsLT5wY2lybHhvcmRlcl90b19ub29mc2dlbnRyID0KKwkJaHRvbmwoQ1BMX1JYX1BIWVNfRFNHTF9QQ0lSTFhPUkRFUl9WKDApIHwKKwkJICAgICAgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lOT1NOT09QX1YoMCkgfAorCQkgICAgICBDUExfUlhfUEhZU19EU0dMX1BDSVRQSE5URU5CX1YoMCkgfAorCQkgICAgICBDUExfUlhfUEhZU19EU0dMX1BDSVRQSE5UX1YoMCkgfAorCQkgICAgICBDUExfUlhfUEhZU19EU0dMX0RDQUlEX1YoMCkgfAorCQkgICAgICBDUExfUlhfUEhZU19EU0dMX05PT0ZTR0VOVFJfVihuZW50cykpOworCXBoeXNfY3BsLT5yc3NfaGRyX2ludC5vcGNvZGUgPSBDUExfUlhfUEhZU19BRERSOworCXBoeXNfY3BsLT5yc3NfaGRyX2ludC5xaWQgPSBodG9ucyhzZ19wYXJhbS0+cWlkKTsKKwlwaHlzX2NwbC0+cnNzX2hkcl9pbnQuaGFzaF92YWwgPSAwOworCXRvID0gKHN0cnVjdCBwaHlzX3NnZV9wYWlycyAqKSgodW5zaWduZWQgY2hhciAqKXBoeXNfY3BsICsKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjcGxfcnhfcGh5c19kc2dsKSk7CisKKwlmb3IgKGkgPSAwOyBuZW50czsgdG8rKykgeworCQlmb3IgKGogPSBpOyAobmVudHMgJiYgKGogPCAoOCArIGkpKSk7IGorKywgbmVudHMtLSkgeworCQkJdG8tPmxlbltqXSA9IGh0b25zKHNnLT5sZW5ndGgpOworCQkJdG8tPmFkZHJbal0gPSBjcHVfdG9fYmU2NChzZ19kbWFfYWRkcmVzcyhzZykpOworCQkJaWYgKG91dF9idWZfc2l6ZSkgeworCQkJCWlmICh0b3RfbGVuICsgc2dfZG1hX2xlbihzZykgPj0gb3V0X2J1Zl9zaXplKSB7CisJCQkJCXRvLT5sZW5bal0gPSBodG9ucyhvdXRfYnVmX3NpemUgLQorCQkJCQkJCSAgIHRvdF9sZW4pOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCXRvdF9sZW4gKz0gc2dfZG1hX2xlbihzZyk7CisJCQl9CisJCQlzZyA9IHNnX25leHQoc2cpOworCQl9CisJfQorfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkCitpbnQgbWFwX3dyaXRlc2dfcGh5c19jcGwoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgY3BsX3J4X3BoeXNfZHNnbCAqcGh5c19jcGwsCisJCQkgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgc3RydWN0IHBoeXNfc2dlX3Bhcm0gKnNnX3BhcmFtKQoreworCWlmICghc2cgfHwgIXNnX3BhcmFtLT5uZW50cykKKwkJcmV0dXJuIDA7CisKKwlzZ19wYXJhbS0+bmVudHMgPSBkbWFfbWFwX3NnKGRldiwgc2csIHNnX3BhcmFtLT5uZW50cywgRE1BX0ZST01fREVWSUNFKTsKKwlpZiAoc2dfcGFyYW0tPm5lbnRzID09IDApIHsKKwkJcHJfZXJyKCJDSENSIDogRE1BIG1hcHBpbmcgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXdyaXRlX3BoeXNfY3BsKHBoeXNfY3BsLCBzZywgc2dfcGFyYW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfY3J5cHRvYWxnX3N1YnR5cGUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnID0gdGZtLT5fX2NydF9hbGc7CisJc3RydWN0IGNoY3JfYWxnX3RlbXBsYXRlICpjaGNyX2NyeXB0b19hbGcgPQorCQljb250YWluZXJfb2YoYWxnLCBzdHJ1Y3QgY2hjcl9hbGdfdGVtcGxhdGUsIGFsZy5jcnlwdG8pOworCisJcmV0dXJuIGNoY3JfY3J5cHRvX2FsZy0+dHlwZSAmIENSWVBUT19BTEdfU1VCX1RZUEVfTUFTSzsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit3cml0ZV9zZ19kYXRhX3BhZ2VfZGVzYyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgKmZyYWdzLAorCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IGNvdW50KQoreworCXN0cnVjdCBwYWdlICpzcGFnZTsKKwl1bnNpZ25lZCBpbnQgcGFnZV9sZW47CisKKwlza2ItPmxlbiArPSBjb3VudDsKKwlza2ItPmRhdGFfbGVuICs9IGNvdW50OworCXNrYi0+dHJ1ZXNpemUgKz0gY291bnQ7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlpZiAoc2cgJiYgKCEoc2ctPmxlbmd0aCkpKQorCQkJYnJlYWs7CisJCXNwYWdlID0gc2dfcGFnZShzZyk7CisJCWdldF9wYWdlKHNwYWdlKTsKKwkJcGFnZV9sZW4gPSBtaW4oc2ctPmxlbmd0aCwgY291bnQpOworCQlza2JfZmlsbF9wYWdlX2Rlc2Moc2tiLCAqZnJhZ3MsIHNwYWdlLCBzZy0+b2Zmc2V0LCBwYWdlX2xlbik7CisJCSgqZnJhZ3MpKys7CisJCWNvdW50IC09IHBhZ2VfbGVuOworCQlzZyA9IHNnX25leHQoc2cpOworCX0KK30KKworc3RhdGljIGludCBnZW5lcmF0ZV9jb3B5X3Jya2V5KHN0cnVjdCBhYmxrX2N0eCAqYWJsa2N0eCwKKwkJCSAgICAgICBzdHJ1Y3QgX2tleV9jdHggKmtleV9jdHgpCit7CisJaWYgKGFibGtjdHgtPmNpcGhfbW9kZSA9PSBDSENSX1NDTURfQ0lQSEVSX01PREVfQUVTX0NCQykgeworCQlnZXRfYWVzX2RlY3J5cHRfa2V5KGtleV9jdHgtPmtleSwgYWJsa2N0eC0+a2V5LAorCQkJCSAgICBhYmxrY3R4LT5lbmNrZXlfbGVuIDw8IDMpOworCQltZW1zZXQoa2V5X2N0eC0+a2V5ICsgYWJsa2N0eC0+ZW5ja2V5X2xlbiwgMCwKKwkJICAgICAgIENIQ1JfQUVTX01BWF9LRVlfTEVOIC0gYWJsa2N0eC0+ZW5ja2V5X2xlbik7CisJfSBlbHNlIHsKKwkJbWVtY3B5KGtleV9jdHgtPmtleSwKKwkJICAgICAgIGFibGtjdHgtPmtleSArIChhYmxrY3R4LT5lbmNrZXlfbGVuID4+IDEpLAorCQkgICAgICAgYWJsa2N0eC0+ZW5ja2V5X2xlbiA+PiAxKTsKKwkJZ2V0X2Flc19kZWNyeXB0X2tleShrZXlfY3R4LT5rZXkgKyAoYWJsa2N0eC0+ZW5ja2V5X2xlbiA+PiAxKSwKKwkJCQkgICAgYWJsa2N0eC0+a2V5LCBhYmxrY3R4LT5lbmNrZXlfbGVuIDw8IDIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNyZWF0ZV93cmVxKHN0cnVjdCBjaGNyX2NvbnRleHQgKmN0eCwKKwkJCSAgICAgICBzdHJ1Y3QgZndfY3J5cHRvX2xvb2thc2lkZV93ciAqd3JlcSwKKwkJCSAgICAgICB2b2lkICpyZXEsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgaW50IGtjdHhfbGVuLCBpbnQgaGFzaF9zeiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgcGh5c19kc2dsKQoreworCXN0cnVjdCB1bGRfY3R4ICp1X2N0eCA9IFVMRF9DVFgoY3R4KTsKKwlzdHJ1Y3QgdWxwX3R4cGt0ICp1bHB0eCA9IChzdHJ1Y3QgdWxwX3R4cGt0ICopKHdyZXEgKyAxKTsKKwlzdHJ1Y3QgdWxwdHhfaWRhdGEgKnNjX2ltbSA9IChzdHJ1Y3QgdWxwdHhfaWRhdGEgKikodWxwdHggKyAxKTsKKwlpbnQgaXZfbG9jID0gSVZfRFNHTDsKKwlpbnQgcWlkID0gdV9jdHgtPmxsZGkucnhxX2lkc1tjdHgtPnR4X2NoYW5uZWxfaWRdOworCXVuc2lnbmVkIGludCBpbW1kYXRhbGVuID0gMCwgbnJfZnJhZ3MgPSAwOworCisJaWYgKGlzX29mbGRfaW1tKHNrYikpIHsKKwkJaW1tZGF0YWxlbiA9IHNrYi0+ZGF0YV9sZW47CisJCWl2X2xvYyA9IElWX0lNTUVESUFURTsKKwl9IGVsc2UgeworCQlucl9mcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisJfQorCisJd3JlcS0+b3BfdG9fY2N0eF9zaXplID0gRklMTF9XUl9PUF9DQ1RYX1NJWkUoaW1tZGF0YWxlbiwKKwkJCQkJCSAgICAgKGtjdHhfbGVuID4+IDQpKTsKKwl3cmVxLT5wbGRfc2l6ZV9oYXNoX3NpemUgPQorCQlodG9ubChGV19DUllQVE9fTE9PS0FTSURFX1dSX1BMRF9TSVpFX1Yoc2dsX2xlbmd0aHNbbnJfZnJhZ3NdKSB8CisJCSAgICAgIEZXX0NSWVBUT19MT09LQVNJREVfV1JfSEFTSF9TSVpFX1YoaGFzaF9zeikpOworCXdyZXEtPmxlbjE2X3BrZCA9IGh0b25sKEZXX0NSWVBUT19MT09LQVNJREVfV1JfTEVOMTZfVihESVZfUk9VTkRfVVAoCisJCQkJICAgIChjYWxjX3R4X2ZsaXRzX29mbGQoc2tiKSAqIDgpLCAxNikpKTsKKwl3cmVxLT5jb29raWUgPSBjcHVfdG9fYmU2NCgodWludHB0cl90KXJlcSk7CisJd3JlcS0+cnhfY2hpZF90b19yeF9xX2lkID0KKwkJRklMTF9XUl9SWF9RX0lEKGN0eC0+ZGV2LT50eF9jaGFubmVsX2lkLCBxaWQsCisJCQkJKGhhc2hfc3opID8gSVZfTk9QIDogaXZfbG9jKTsKKworCXVscHR4LT5jbWRfZGVzdCA9IEZJTExfVUxQVFhfQ01EX0RFU1QoY3R4LT5kZXYtPnR4X2NoYW5uZWxfaWQpOworCXVscHR4LT5sZW4gPSBodG9ubCgoRElWX1JPVU5EX1VQKChjYWxjX3R4X2ZsaXRzX29mbGQoc2tiKSAqIDgpLAorCQkJCQkgMTYpIC0gKChzaXplb2YoKndyZXEpKSA+PiA0KSkpOworCisJc2NfaW1tLT5jbWRfbW9yZSA9IEZJTExfQ01EX01PUkUoaW1tZGF0YWxlbik7CisJc2NfaW1tLT5sZW4gPSBjcHVfdG9fYmUzMihzaXplb2Yoc3RydWN0IGNwbF90eF9zZWNfcGR1KSArIGtjdHhfbGVuICsKKwkJCQkgICgoaGFzaF9zeikgPyBEVU1NWV9CWVRFUyA6CisJCQkJICAoc2l6ZW9mKHN0cnVjdCBjcGxfcnhfcGh5c19kc2dsKSArCisJCQkJICAgcGh5c19kc2dsKSkgKyBpbW1kYXRhbGVuKTsKK30KKworLyoqCisgKgljcmVhdGVfY2lwaGVyX3dyIC0gZm9ybSB0aGUgV1IgZm9yIGNpcGhlciBvcGVyYXRpb25zCisgKglAcmVxOiBjaXBoZXIgcmVxLgorICoJQGN0eDogY3J5cHRvIGRyaXZlciBjb250ZXh0IG9mIHRoZSByZXF1ZXN0LgorICoJQHFpZDogaW5ncmVzcyBxaWQgd2hlcmUgcmVzcG9uc2Ugb2YgdGhpcyBXUiBzaG91bGQgYmUgcmVjZWl2ZWQuCisgKglAb3BfdHlwZToJZW5jcnlwdGlvbiBvciBkZWNyeXB0aW9uCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZgorKmNyZWF0ZV9jaXBoZXJfd3Ioc3RydWN0IGNyeXB0b19hc3luY19yZXF1ZXN0ICpyZXFfYmFzZSwKKwkJICBzdHJ1Y3QgY2hjcl9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIHNob3J0IHFpZCwKKwkJICB1bnNpZ25lZCBzaG9ydCBvcF90eXBlKQoreworCXN0cnVjdCBhYmxrY2lwaGVyX3JlcXVlc3QgKnJlcSA9IChzdHJ1Y3QgYWJsa2NpcGhlcl9yZXF1ZXN0ICopcmVxX2Jhc2U7CisJc3RydWN0IGNyeXB0b19hYmxrY2lwaGVyICp0Zm0gPSBjcnlwdG9fYWJsa2NpcGhlcl9yZXF0Zm0ocmVxKTsKKwlzdHJ1Y3QgdWxkX2N0eCAqdV9jdHggPSBVTERfQ1RYKGN0eCk7CisJc3RydWN0IGFibGtfY3R4ICphYmxrY3R4ID0gQUJMS19DVFgoY3R4KTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlzdHJ1Y3QgX2tleV9jdHggKmtleV9jdHg7CisJc3RydWN0IGZ3X2NyeXB0b19sb29rYXNpZGVfd3IgKndyZXE7CisJc3RydWN0IGNwbF90eF9zZWNfcGR1ICpzZWNfY3BsOworCXN0cnVjdCBjcGxfcnhfcGh5c19kc2dsICpwaHlzX2NwbDsKKwlzdHJ1Y3QgY2hjcl9ibGtjaXBoZXJfcmVxX2N0eCAqcmVxX2N0eCA9IGFibGtjaXBoZXJfcmVxdWVzdF9jdHgocmVxKTsKKwlzdHJ1Y3QgcGh5c19zZ2VfcGFybSBzZ19wYXJhbTsKKwl1bnNpZ25lZCBpbnQgZnJhZ3MgPSAwLCB0cmFuc2hkcl9sZW4sIHBoeXNfZHNnbCwgZHN0X2J1ZnNpemUgPSAwOworCXVuc2lnbmVkIGludCBpdnNpemUgPSBjcnlwdG9fYWJsa2NpcGhlcl9pdnNpemUodGZtKSwga2N0eF9sZW47CisKKwlpZiAoIXJlcS0+aW5mbykKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJYWJsa2N0eC0+ZHN0X25lbnRzID0gY2hfbmVudHMocmVxLT5kc3QsICZkc3RfYnVmc2l6ZSk7CisJYWJsa2N0eC0+ZW5jID0gb3BfdHlwZTsKKworCWlmICgoYWJsa2N0eC0+ZW5ja2V5X2xlbiA9PSAwKSB8fCAoaXZzaXplID4gQUVTX0JMT0NLX1NJWkUpIHx8CisJICAgIChyZXEtPm5ieXRlcyA8PSAwKSB8fCAocmVxLT5uYnl0ZXMgJSBBRVNfQkxPQ0tfU0laRSkpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJcGh5c19kc2dsID0gZ2V0X3NwYWNlX2Zvcl9waHlzX2RzZ2woYWJsa2N0eC0+ZHN0X25lbnRzKTsKKworCWtjdHhfbGVuID0gc2l6ZW9mKCprZXlfY3R4KSArCisJCShESVZfUk9VTkRfVVAoYWJsa2N0eC0+ZW5ja2V5X2xlbiwgMTYpICogMTYpOworCXRyYW5zaGRyX2xlbiA9IENJUEhFUl9UUkFOU0hEUl9TSVpFKGtjdHhfbGVuLCBwaHlzX2RzZ2wpOworCXNrYiA9IGFsbG9jX3NrYigodHJhbnNoZHJfbGVuICsgc2l6ZW9mKHN0cnVjdCBzZ2Vfb3BhcXVlX2hkcikpLAorCQkJR0ZQX0FUT01JQyk7CisJaWYgKCFza2IpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCXNrYl9yZXNlcnZlKHNrYiwgc2l6ZW9mKHN0cnVjdCBzZ2Vfb3BhcXVlX2hkcikpOworCXdyZXEgPSAoc3RydWN0IGZ3X2NyeXB0b19sb29rYXNpZGVfd3IgKilfX3NrYl9wdXQoc2tiLCB0cmFuc2hkcl9sZW4pOworCisJc2VjX2NwbCA9IChzdHJ1Y3QgY3BsX3R4X3NlY19wZHUgKikoKHU4ICopd3JlcSArIFNFQ19DUExfT0ZGU0VUKTsKKwlzZWNfY3BsLT5vcF9pdmluc3J0b2ZzdCA9CisJCUZJTExfU0VDX0NQTF9PUF9JVklOU1IoY3R4LT5kZXYtPnR4X2NoYW5uZWxfaWQsIDIsIDEsIDEpOworCisJc2VjX2NwbC0+cGxkbGVuID0gaHRvbmwoaXZzaXplICsgcmVxLT5uYnl0ZXMpOworCXNlY19jcGwtPmFhZHN0YXJ0X2NpcGhlcnN0b3BfaGkgPSBGSUxMX1NFQ19DUExfQ0lQSEVSU1RPUF9ISSgwLCAwLAorCQkJCQkJCQlpdnNpemUgKyAxLCAwKTsKKworCXNlY19jcGwtPmNpcGhlcnN0b3BfbG9fYXV0aGluc2VydCA9ICBGSUxMX1NFQ19DUExfQVVUSElOU0VSVCgwLCAwLAorCQkJCQkJCQkgICAgIDAsIDApOworCXNlY19jcGwtPnNlcW5vX251bWl2cyA9IEZJTExfU0VDX0NQTF9TQ01EMF9TRVFOTyhvcF90eXBlLCAwLAorCQkJCQkJCSBhYmxrY3R4LT5jaXBoX21vZGUsCisJCQkJCQkJIDAsIDAsIGl2c2l6ZSA+PiAxLCAxKTsKKwlzZWNfY3BsLT5pdmdlbl9oZHJsZW4gPSBGSUxMX1NFQ19DUExfSVZHRU5fSERSTEVOKDAsIDAsIDAsCisJCQkJCQkJICAwLCAxLCBwaHlzX2RzZ2wpOworCisJa2V5X2N0eCA9IChzdHJ1Y3QgX2tleV9jdHggKikoKHU4ICopc2VjX2NwbCArIHNpemVvZigqc2VjX2NwbCkpOworCWtleV9jdHgtPmN0eF9oZHIgPSBhYmxrY3R4LT5rZXlfY3R4X2hkcjsKKwlpZiAob3BfdHlwZSA9PSBDSENSX0RFQ1JZUFRfT1ApIHsKKwkJaWYgKGdlbmVyYXRlX2NvcHlfcnJrZXkoYWJsa2N0eCwga2V5X2N0eCkpCisJCQlnb3RvIG1hcF9mYWlsMTsKKwl9IGVsc2UgeworCQlpZiAoYWJsa2N0eC0+Y2lwaF9tb2RlID09IENIQ1JfU0NNRF9DSVBIRVJfTU9ERV9BRVNfQ0JDKSB7CisJCQltZW1jcHkoa2V5X2N0eC0+a2V5LCBhYmxrY3R4LT5rZXksIGFibGtjdHgtPmVuY2tleV9sZW4pOworCQl9IGVsc2UgeworCQkJbWVtY3B5KGtleV9jdHgtPmtleSwgYWJsa2N0eC0+a2V5ICsKKwkJCSAgICAgICAoYWJsa2N0eC0+ZW5ja2V5X2xlbiA+PiAxKSwKKwkJCSAgICAgICBhYmxrY3R4LT5lbmNrZXlfbGVuID4+IDEpOworCQkJbWVtY3B5KGtleV9jdHgtPmtleSArCisJCQkgICAgICAgKGFibGtjdHgtPmVuY2tleV9sZW4gPj4gMSksCisJCQkgICAgICAgYWJsa2N0eC0+a2V5LAorCQkJICAgICAgIGFibGtjdHgtPmVuY2tleV9sZW4gPj4gMSk7CisJCX0KKwl9CisJcGh5c19jcGwgPSAoc3RydWN0IGNwbF9yeF9waHlzX2RzZ2wgKikoKHU4ICopa2V5X2N0eCArIGtjdHhfbGVuKTsKKworCW1lbWNweShhYmxrY3R4LT5pdiwgcmVxLT5pbmZvLCBpdnNpemUpOworCXNnX2luaXRfdGFibGUoJmFibGtjdHgtPml2X3NnLCAxKTsKKwlzZ19zZXRfYnVmKCZhYmxrY3R4LT5pdl9zZywgYWJsa2N0eC0+aXYsIGl2c2l6ZSk7CisJc2dfcGFyYW0ubmVudHMgPSBhYmxrY3R4LT5kc3RfbmVudHM7CisJc2dfcGFyYW0ub2JzaXplID0gZHN0X2J1ZnNpemU7CisJc2dfcGFyYW0ucWlkID0gcWlkOworCXNnX3BhcmFtLmFsaWduID0gMTsKKwlpZiAobWFwX3dyaXRlc2dfcGh5c19jcGwoJnVfY3R4LT5sbGRpLnBkZXYtPmRldiwgcGh5c19jcGwsIHJlcS0+ZHN0LAorCQkJCSAmc2dfcGFyYW0pKQorCQlnb3RvIG1hcF9mYWlsMTsKKworCXNrYl9zZXRfdHJhbnNwb3J0X2hlYWRlcihza2IsIHRyYW5zaGRyX2xlbik7CisJd3JpdGVfc2dfZGF0YV9wYWdlX2Rlc2Moc2tiLCAmZnJhZ3MsICZhYmxrY3R4LT5pdl9zZywgaXZzaXplKTsKKwl3cml0ZV9zZ19kYXRhX3BhZ2VfZGVzYyhza2IsICZmcmFncywgcmVxLT5zcmMsIHJlcS0+bmJ5dGVzKTsKKwljcmVhdGVfd3JlcShjdHgsIHdyZXEsIHJlcSwgc2tiLCBrY3R4X2xlbiwgMCwgcGh5c19kc2dsKTsKKwlyZXFfY3R4LT5za2IgPSBza2I7CisJc2tiX2dldChza2IpOworCXJldHVybiBza2I7CittYXBfZmFpbDE6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Cit9CisKK3N0YXRpYyBpbnQgY2hjcl9hZXNfY2JjX3NldGtleShzdHJ1Y3QgY3J5cHRvX2FibGtjaXBoZXIgKnRmbSwgY29uc3QgdTggKmtleSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQga2V5bGVuKQoreworCXN0cnVjdCBjaGNyX2NvbnRleHQgKmN0eCA9IGNyeXB0b19hYmxrY2lwaGVyX2N0eCh0Zm0pOworCXN0cnVjdCBhYmxrX2N0eCAqYWJsa2N0eCA9IEFCTEtfQ1RYKGN0eCk7CisJc3RydWN0IGFibGtjaXBoZXJfYWxnICphbGcgPSBjcnlwdG9fYWJsa2NpcGhlcl9hbGcodGZtKTsKKwl1bnNpZ25lZCBpbnQgY2tfc2l6ZSwgY29udGV4dF9zaXplOworCXUxNiBhbGlnbm1lbnQgPSAwOworCisJaWYgKChrZXlsZW4gPCBhbGctPm1pbl9rZXlzaXplKSB8fCAoa2V5bGVuID4gYWxnLT5tYXhfa2V5c2l6ZSkpCisJCWdvdG8gYmFka2V5X2VycjsKKworCW1lbWNweShhYmxrY3R4LT5rZXksIGtleSwga2V5bGVuKTsKKwlhYmxrY3R4LT5lbmNrZXlfbGVuID0ga2V5bGVuOworCWlmIChrZXlsZW4gPT0gQUVTX0tFWVNJWkVfMTI4KSB7CisJCWNrX3NpemUgPSBDSENSX0tFWUNUWF9DSVBIRVJfS0VZX1NJWkVfMTI4OworCX0gZWxzZSBpZiAoa2V5bGVuID09IEFFU19LRVlTSVpFXzE5MikgeworCQlhbGlnbm1lbnQgPSA4OworCQlja19zaXplID0gQ0hDUl9LRVlDVFhfQ0lQSEVSX0tFWV9TSVpFXzE5MjsKKwl9IGVsc2UgaWYgKGtleWxlbiA9PSBBRVNfS0VZU0laRV8yNTYpIHsKKwkJY2tfc2l6ZSA9IENIQ1JfS0VZQ1RYX0NJUEhFUl9LRVlfU0laRV8yNTY7CisJfSBlbHNlIHsKKwkJZ290byBiYWRrZXlfZXJyOworCX0KKworCWNvbnRleHRfc2l6ZSA9IChLRVlfQ09OVEVYVF9IRFJfU0FMVF9BTkRfUEFEICsKKwkJCWtleWxlbiArIGFsaWdubWVudCkgPj4gNDsKKworCWFibGtjdHgtPmtleV9jdHhfaGRyID0gRklMTF9LRVlfQ1RYX0hEUihja19zaXplLCBDSENSX0tFWUNUWF9OT19LRVksCisJCQkJCQkwLCAwLCBjb250ZXh0X3NpemUpOworCWFibGtjdHgtPmNpcGhfbW9kZSA9IENIQ1JfU0NNRF9DSVBIRVJfTU9ERV9BRVNfQ0JDOworCXJldHVybiAwOworYmFka2V5X2VycjoKKwljcnlwdG9fYWJsa2NpcGhlcl9zZXRfZmxhZ3ModGZtLCBDUllQVE9fVEZNX1JFU19CQURfS0VZX0xFTik7CisJYWJsa2N0eC0+ZW5ja2V5X2xlbiA9IDA7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgY3hnYjRfaXNfY3J5cHRvX3FfZnVsbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaWR4KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBzZ2Vfb2ZsZF90eHEgKnE7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBuZXRkZXYyYWRhcChkZXYpOworCisJbG9jYWxfYmhfZGlzYWJsZSgpOworCXEgPSAmYWRhcC0+c2dlLm9mbGR0eHFbaWR4XTsKKwlzcGluX2xvY2soJnEtPnNlbmRxLmxvY2spOworCWlmIChxLT5mdWxsKQorCQlyZXQgPSAtMTsKKwlzcGluX3VubG9jaygmcS0+c2VuZHEubG9jayk7CisJbG9jYWxfYmhfZW5hYmxlKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjaGNyX2Flc19lbmNyeXB0KHN0cnVjdCBhYmxrY2lwaGVyX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2FibGtjaXBoZXIgKnRmbSA9IGNyeXB0b19hYmxrY2lwaGVyX3JlcXRmbShyZXEpOworCXN0cnVjdCBjaGNyX2NvbnRleHQgKmN0eCA9IGNyeXB0b19hYmxrY2lwaGVyX2N0eCh0Zm0pOworCXN0cnVjdCBjcnlwdG9fYXN5bmNfcmVxdWVzdCAqcmVxX2Jhc2UgPSAmcmVxLT5iYXNlOworCXN0cnVjdCB1bGRfY3R4ICp1X2N0eCA9IFVMRF9DVFgoY3R4KTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJaWYgKHVubGlrZWx5KGN4Z2I0X2lzX2NyeXB0b19xX2Z1bGwodV9jdHgtPmxsZGkucG9ydHNbMF0sCisJCQkJCSAgICBjdHgtPnR4X2NoYW5uZWxfaWQpKSkgeworCQlpZiAoIShyZXEtPmJhc2UuZmxhZ3MgJiBDUllQVE9fVEZNX1JFUV9NQVlfQkFDS0xPRykpCisJCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXNrYiA9IGNyZWF0ZV9jaXBoZXJfd3IocmVxX2Jhc2UsIGN0eCwKKwkJCSAgICAgICB1X2N0eC0+bGxkaS5yeHFfaWRzW2N0eC0+dHhfY2hhbm5lbF9pZF0sCisJCQkgICAgICAgQ0hDUl9FTkNSWVBUX09QKTsKKwlpZiAoSVNfRVJSKHNrYikpIHsKKwkJcHJfZXJyKCJjaGNyIDogJXMgOiBGYWlsZWQgdG8gZm9ybSBXUi4gTm8gbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAgUFRSX0VSUihza2IpOworCX0KKwlza2ItPmRldiA9IHVfY3R4LT5sbGRpLnBvcnRzWzBdOworCXNldF93cl90eHEoc2tiLCBDUExfUFJJT1JJVFlfREFUQSwgY3R4LT50eF9jaGFubmVsX2lkKTsKKwljaGNyX3NlbmRfd3Ioc2tiKTsKKwlyZXR1cm4gLUVJTlBST0dSRVNTOworfQorCitzdGF0aWMgaW50IGNoY3JfYWVzX2RlY3J5cHQoc3RydWN0IGFibGtjaXBoZXJfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBjcnlwdG9fYWJsa2NpcGhlciAqdGZtID0gY3J5cHRvX2FibGtjaXBoZXJfcmVxdGZtKHJlcSk7CisJc3RydWN0IGNoY3JfY29udGV4dCAqY3R4ID0gY3J5cHRvX2FibGtjaXBoZXJfY3R4KHRmbSk7CisJc3RydWN0IGNyeXB0b19hc3luY19yZXF1ZXN0ICpyZXFfYmFzZSA9ICZyZXEtPmJhc2U7CisJc3RydWN0IHVsZF9jdHggKnVfY3R4ID0gVUxEX0NUWChjdHgpOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlpZiAodW5saWtlbHkoY3hnYjRfaXNfY3J5cHRvX3FfZnVsbCh1X2N0eC0+bGxkaS5wb3J0c1swXSwKKwkJCQkJICAgIGN0eC0+dHhfY2hhbm5lbF9pZCkpKSB7CisJCWlmICghKHJlcS0+YmFzZS5mbGFncyAmIENSWVBUT19URk1fUkVRX01BWV9CQUNLTE9HKSkKKwkJCXJldHVybiAtRUJVU1k7CisJfQorCisJc2tiID0gY3JlYXRlX2NpcGhlcl93cihyZXFfYmFzZSwgY3R4LCB1X2N0eC0+bGxkaS5yeHFfaWRzWzBdLAorCQkJICAgICAgIENIQ1JfREVDUllQVF9PUCk7CisJaWYgKElTX0VSUihza2IpKSB7CisJCXByX2VycigiY2hjciA6ICVzIDogRmFpbGVkIHRvIGZvcm0gV1IuIE5vIG1lbW9yeVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gUFRSX0VSUihza2IpOworCX0KKwlza2ItPmRldiA9IHVfY3R4LT5sbGRpLnBvcnRzWzBdOworCXNldF93cl90eHEoc2tiLCBDUExfUFJJT1JJVFlfREFUQSwgY3R4LT50eF9jaGFubmVsX2lkKTsKKwljaGNyX3NlbmRfd3Ioc2tiKTsKKwlyZXR1cm4gLUVJTlBST0dSRVNTOworfQorCitzdGF0aWMgaW50IGNoY3JfZGV2aWNlX2luaXQoc3RydWN0IGNoY3JfY29udGV4dCAqY3R4KQoreworCXN0cnVjdCB1bGRfY3R4ICp1X2N0eDsKKwl1bnNpZ25lZCBpbnQgaWQ7CisJaW50IGVyciA9IDAsIHJ4cV9wZXJjaGFuLCByeHFfaWR4OworCisJaWQgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJaWYgKCFjdHgtPmRldikgeworCQllcnIgPSBhc3NpZ25fY2hjcl9kZXZpY2UoJmN0eC0+ZGV2KTsKKwkJaWYgKGVycikgeworCQkJcHJfZXJyKCJjaGNyIGRldmljZSBhc3NpZ25tZW50IGZhaWxzXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXVfY3R4ID0gVUxEX0NUWChjdHgpOworCQlyeHFfcGVyY2hhbiA9IHVfY3R4LT5sbGRpLm5yeHEgLyB1X2N0eC0+bGxkaS5uY2hhbjsKKwkJY3R4LT5kZXYtPnR4X2NoYW5uZWxfaWQgPSAwOworCQlyeHFfaWR4ID0gY3R4LT5kZXYtPnR4X2NoYW5uZWxfaWQgKiByeHFfcGVyY2hhbjsKKwkJcnhxX2lkeCArPSBpZCAlIHJ4cV9wZXJjaGFuOworCQlzcGluX2xvY2soJmN0eC0+ZGV2LT5sb2NrX2NoY3JfZGV2KTsKKwkJY3R4LT50eF9jaGFubmVsX2lkID0gcnhxX2lkeDsKKwkJc3Bpbl91bmxvY2soJmN0eC0+ZGV2LT5sb2NrX2NoY3JfZGV2KTsKKwl9CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBjaGNyX2NyYV9pbml0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJdGZtLT5jcnRfYWJsa2NpcGhlci5yZXFzaXplID0gIHNpemVvZihzdHJ1Y3QgY2hjcl9ibGtjaXBoZXJfcmVxX2N0eCk7CisJcmV0dXJuIGNoY3JfZGV2aWNlX2luaXQoY3J5cHRvX3RmbV9jdHgodGZtKSk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2FsZ19jb25maWcoc3RydWN0IGFsZ29fcGFyYW0gKnBhcmFtcywKKwkJCSAgdW5zaWduZWQgaW50IGF1dGhfc2l6ZSkKK3sKKwlzd2l0Y2ggKGF1dGhfc2l6ZSkgeworCWNhc2UgU0hBMV9ESUdFU1RfU0laRToKKwkJcGFyYW1zLT5ta19zaXplID0gQ0hDUl9LRVlDVFhfTUFDX0tFWV9TSVpFXzE2MDsKKwkJcGFyYW1zLT5hdXRoX21vZGUgPSBDSENSX1NDTURfQVVUSF9NT0RFX1NIQTE7CisJCXBhcmFtcy0+cmVzdWx0X3NpemUgPSBTSEExX0RJR0VTVF9TSVpFOworCQlicmVhazsKKwljYXNlIFNIQTIyNF9ESUdFU1RfU0laRToKKwkJcGFyYW1zLT5ta19zaXplID0gQ0hDUl9LRVlDVFhfTUFDX0tFWV9TSVpFXzI1NjsKKwkJcGFyYW1zLT5hdXRoX21vZGUgPSBDSENSX1NDTURfQVVUSF9NT0RFX1NIQTIyNDsKKwkJcGFyYW1zLT5yZXN1bHRfc2l6ZSA9IFNIQTI1Nl9ESUdFU1RfU0laRTsKKwkJYnJlYWs7CisJY2FzZSBTSEEyNTZfRElHRVNUX1NJWkU6CisJCXBhcmFtcy0+bWtfc2l6ZSA9IENIQ1JfS0VZQ1RYX01BQ19LRVlfU0laRV8yNTY7CisJCXBhcmFtcy0+YXV0aF9tb2RlID0gQ0hDUl9TQ01EX0FVVEhfTU9ERV9TSEEyNTY7CisJCXBhcmFtcy0+cmVzdWx0X3NpemUgPSBTSEEyNTZfRElHRVNUX1NJWkU7CisJCWJyZWFrOworCWNhc2UgU0hBMzg0X0RJR0VTVF9TSVpFOgorCQlwYXJhbXMtPm1rX3NpemUgPSBDSENSX0tFWUNUWF9NQUNfS0VZX1NJWkVfNTEyOworCQlwYXJhbXMtPmF1dGhfbW9kZSA9IENIQ1JfU0NNRF9BVVRIX01PREVfU0hBNTEyXzM4NDsKKwkJcGFyYW1zLT5yZXN1bHRfc2l6ZSA9IFNIQTUxMl9ESUdFU1RfU0laRTsKKwkJYnJlYWs7CisJY2FzZSBTSEE1MTJfRElHRVNUX1NJWkU6CisJCXBhcmFtcy0+bWtfc2l6ZSA9IENIQ1JfS0VZQ1RYX01BQ19LRVlfU0laRV81MTI7CisJCXBhcmFtcy0+YXV0aF9tb2RlID0gQ0hDUl9TQ01EX0FVVEhfTU9ERV9TSEE1MTJfNTEyOworCQlwYXJhbXMtPnJlc3VsdF9zaXplID0gU0hBNTEyX0RJR0VTVF9TSVpFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoImNoY3IgOiBFUlJPUiwgdW5zdXBwb3J0ZWQgZGlnZXN0IHNpemVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Cit3cml0ZV9idWZmZXJfZGF0YV9wYWdlX2Rlc2Moc3RydWN0IGNoY3JfYWhhc2hfcmVxX2N0eCAqcmVxX2N0eCwKKwkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgKmZyYWdzLCBjaGFyICpiZnIsCisJCQkgICAgdTggYmZyX2xlbikKK3sKKwl2b2lkICpwYWdlX3B0ciA9IE5VTEw7CisKKwlza2ItPmxlbiArPSBiZnJfbGVuOworCXNrYi0+ZGF0YV9sZW4gKz0gYmZyX2xlbjsKKwlza2ItPnRydWVzaXplICs9IGJmcl9sZW47CisJcGFnZV9wdHIgPSBrbWFsbG9jKENIQ1JfSEFTSF9NQVhfQkxPQ0tfU0laRV8xMjgsIEdGUF9BVE9NSUMgfCBHRlBfRE1BKTsKKwlpZiAoIXBhZ2VfcHRyKQorCQlyZXR1cm4gLUVOT01FTTsKKwlnZXRfcGFnZSh2aXJ0X3RvX3BhZ2UocGFnZV9wdHIpKTsKKwlyZXFfY3R4LT5kdW1teV9wYXlsb2FkX3B0ciA9IHBhZ2VfcHRyOworCW1lbWNweShwYWdlX3B0ciwgYmZyLCBiZnJfbGVuKTsKKwlza2JfZmlsbF9wYWdlX2Rlc2Moc2tiLCAqZnJhZ3MsIHZpcnRfdG9fcGFnZShwYWdlX3B0ciksCisJCQkgICBvZmZzZXRfaW5fcGFnZShwYWdlX3B0ciksIGJmcl9sZW4pOworCSgqZnJhZ3MpKys7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJY3JlYXRlX2ZpbmFsX2hhc2hfd3IgLSBDcmVhdGUgaGFzaCB3b3JrIHJlcXVlc3QKKyAqCUByZXEgLSBDaXBoZXIgcmVxIGJhc2UKKyAqLworc3RhdGljIHN0cnVjdCBza19idWZmICpjcmVhdGVfZmluYWxfaGFzaF93cihzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxLAorCQkJCQkgICAgc3RydWN0IGhhc2hfd3JfcGFyYW0gKnBhcmFtKQoreworCXN0cnVjdCBjaGNyX2FoYXNoX3JlcV9jdHggKnJlcV9jdHggPSBhaGFzaF9yZXF1ZXN0X2N0eChyZXEpOworCXN0cnVjdCBjcnlwdG9fYWhhc2ggKnRmbSA9IGNyeXB0b19haGFzaF9yZXF0Zm0ocmVxKTsKKwlzdHJ1Y3QgY2hjcl9jb250ZXh0ICpjdHggPSBjcnlwdG9fdGZtX2N0eChjcnlwdG9fYWhhc2hfdGZtKHRmbSkpOworCXN0cnVjdCBobWFjX2N0eCAqaG1hY2N0eCA9IEhNQUNfQ1RYKGN0eCk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJc3RydWN0IF9rZXlfY3R4ICprZXlfY3R4OworCXN0cnVjdCBmd19jcnlwdG9fbG9va2FzaWRlX3dyICp3cmVxOworCXN0cnVjdCBjcGxfdHhfc2VjX3BkdSAqc2VjX2NwbDsKKwl1bnNpZ25lZCBpbnQgZnJhZ3MgPSAwLCB0cmFuc2hkcl9sZW4sIGlvcGFkX2FsaWdubWVudCA9IDA7CisJdW5zaWduZWQgaW50IGRpZ2VzdHNpemUgPSBjcnlwdG9fYWhhc2hfZGlnZXN0c2l6ZSh0Zm0pOworCXVuc2lnbmVkIGludCBrY3R4X2xlbiA9IHNpemVvZigqa2V5X2N0eCk7CisJdTggaGFzaF9zaXplX2luX3Jlc3BvbnNlID0gMDsKKworCWlvcGFkX2FsaWdubWVudCA9IEtFWUNUWF9BTElHTl9QQUQoZGlnZXN0c2l6ZSk7CisJa2N0eF9sZW4gKz0gcGFyYW0tPmFsZ19wcm0ucmVzdWx0X3NpemUgKyBpb3BhZF9hbGlnbm1lbnQ7CisJaWYgKHBhcmFtLT5vcGFkX25lZWRlZCkKKwkJa2N0eF9sZW4gKz0gcGFyYW0tPmFsZ19wcm0ucmVzdWx0X3NpemUgKyBpb3BhZF9hbGlnbm1lbnQ7CisKKwlpZiAocmVxX2N0eC0+cmVzdWx0KQorCQloYXNoX3NpemVfaW5fcmVzcG9uc2UgPSBkaWdlc3RzaXplOworCWVsc2UKKwkJaGFzaF9zaXplX2luX3Jlc3BvbnNlID0gcGFyYW0tPmFsZ19wcm0ucmVzdWx0X3NpemU7CisJdHJhbnNoZHJfbGVuID0gSEFTSF9UUkFOU0hEUl9TSVpFKGtjdHhfbGVuKTsKKwlza2IgPSBhbGxvY19za2IoKHRyYW5zaGRyX2xlbiArIHNpemVvZihzdHJ1Y3Qgc2dlX29wYXF1ZV9oZHIpKSwKKwkJCUdGUF9BVE9NSUMpOworCWlmICghc2tiKQorCQlyZXR1cm4gc2tiOworCisJc2tiX3Jlc2VydmUoc2tiLCBzaXplb2Yoc3RydWN0IHNnZV9vcGFxdWVfaGRyKSk7CisJd3JlcSA9IChzdHJ1Y3QgZndfY3J5cHRvX2xvb2thc2lkZV93ciAqKV9fc2tiX3B1dChza2IsIHRyYW5zaGRyX2xlbik7CisJbWVtc2V0KHdyZXEsIDAsIHRyYW5zaGRyX2xlbik7CisKKwlzZWNfY3BsID0gKHN0cnVjdCBjcGxfdHhfc2VjX3BkdSAqKSgodTggKil3cmVxICsgU0VDX0NQTF9PRkZTRVQpOworCXNlY19jcGwtPm9wX2l2aW5zcnRvZnN0ID0KKwkJRklMTF9TRUNfQ1BMX09QX0lWSU5TUihjdHgtPmRldi0+dHhfY2hhbm5lbF9pZCwgMiwgMCwgMCk7CisJc2VjX2NwbC0+cGxkbGVuID0gaHRvbmwocGFyYW0tPmJmcl9sZW4gKyBwYXJhbS0+c2dfbGVuKTsKKworCXNlY19jcGwtPmFhZHN0YXJ0X2NpcGhlcnN0b3BfaGkgPQorCQlGSUxMX1NFQ19DUExfQ0lQSEVSU1RPUF9ISSgwLCAwLCAwLCAwKTsKKwlzZWNfY3BsLT5jaXBoZXJzdG9wX2xvX2F1dGhpbnNlcnQgPQorCQlGSUxMX1NFQ19DUExfQVVUSElOU0VSVCgwLCAxLCAwLCAwKTsKKwlzZWNfY3BsLT5zZXFub19udW1pdnMgPQorCQlGSUxMX1NFQ19DUExfU0NNRDBfU0VRTk8oMCwgMCwgMCwgcGFyYW0tPmFsZ19wcm0uYXV0aF9tb2RlLAorCQkJCQkgcGFyYW0tPm9wYWRfbmVlZGVkLCAwLCAwKTsKKworCXNlY19jcGwtPml2Z2VuX2hkcmxlbiA9CisJCUZJTExfU0VDX0NQTF9JVkdFTl9IRFJMRU4ocGFyYW0tPmxhc3QsIHBhcmFtLT5tb3JlLCAwLCAxLCAwLCAwKTsKKworCWtleV9jdHggPSAoc3RydWN0IF9rZXlfY3R4ICopKCh1OCAqKXNlY19jcGwgKyBzaXplb2YoKnNlY19jcGwpKTsKKwltZW1jcHkoa2V5X2N0eC0+a2V5LCByZXFfY3R4LT5wYXJ0aWFsX2hhc2gsIHBhcmFtLT5hbGdfcHJtLnJlc3VsdF9zaXplKTsKKworCWlmIChwYXJhbS0+b3BhZF9uZWVkZWQpCisJCW1lbWNweShrZXlfY3R4LT5rZXkgKyAoKHBhcmFtLT5hbGdfcHJtLnJlc3VsdF9zaXplIDw9IDMyKSA/IDMyIDoKKwkJCQkgICAgICAgQ0hDUl9IQVNIX01BWF9ESUdFU1RfU0laRSksCisJCSAgICAgICBobWFjY3R4LT5vcGFkLCBwYXJhbS0+YWxnX3BybS5yZXN1bHRfc2l6ZSk7CisKKwlrZXlfY3R4LT5jdHhfaGRyID0gRklMTF9LRVlfQ1RYX0hEUihDSENSX0tFWUNUWF9OT19LRVksCisJCQkJCSAgICBwYXJhbS0+YWxnX3BybS5ta19zaXplLCAwLAorCQkJCQkgICAgcGFyYW0tPm9wYWRfbmVlZGVkLAorCQkJCQkgICAgKGtjdHhfbGVuID4+IDQpKTsKKwlzZWNfY3BsLT5zY21kMSA9IGNwdV90b19iZTY0KCh1NjQpcGFyYW0tPnNjbWQxKTsKKworCXNrYl9zZXRfdHJhbnNwb3J0X2hlYWRlcihza2IsIHRyYW5zaGRyX2xlbik7CisJaWYgKHBhcmFtLT5iZnJfbGVuICE9IDApCisJCXdyaXRlX2J1ZmZlcl9kYXRhX3BhZ2VfZGVzYyhyZXFfY3R4LCBza2IsICZmcmFncywgcmVxX2N0eC0+YmZyLAorCQkJCQkgICAgcGFyYW0tPmJmcl9sZW4pOworCWlmIChwYXJhbS0+c2dfbGVuICE9IDApCisJCXdyaXRlX3NnX2RhdGFfcGFnZV9kZXNjKHNrYiwgJmZyYWdzLCByZXEtPnNyYywgcGFyYW0tPnNnX2xlbik7CisKKwljcmVhdGVfd3JlcShjdHgsIHdyZXEsIHJlcSwgc2tiLCBrY3R4X2xlbiwgaGFzaF9zaXplX2luX3Jlc3BvbnNlLAorCQkgICAgMCk7CisJcmVxX2N0eC0+c2tiID0gc2tiOworCXNrYl9nZXQoc2tiKTsKKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgaW50IGNoY3JfYWhhc2hfdXBkYXRlKHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IGNoY3JfYWhhc2hfcmVxX2N0eCAqcmVxX2N0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KHJlcSk7CisJc3RydWN0IGNyeXB0b19haGFzaCAqcnRmbSA9IGNyeXB0b19haGFzaF9yZXF0Zm0ocmVxKTsKKwlzdHJ1Y3QgY2hjcl9jb250ZXh0ICpjdHggPSBjcnlwdG9fdGZtX2N0eChjcnlwdG9fYWhhc2hfdGZtKHJ0Zm0pKTsKKwlzdHJ1Y3QgdWxkX2N0eCAqdV9jdHggPSBOVUxMOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTggcmVtYWluZGVyID0gMCwgYnM7CisJdW5zaWduZWQgaW50IG5ieXRlcyA9IHJlcS0+bmJ5dGVzOworCXN0cnVjdCBoYXNoX3dyX3BhcmFtIHBhcmFtczsKKworCWJzID0gY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKGNyeXB0b19haGFzaF90Zm0ocnRmbSkpOworCisJdV9jdHggPSBVTERfQ1RYKGN0eCk7CisJaWYgKHVubGlrZWx5KGN4Z2I0X2lzX2NyeXB0b19xX2Z1bGwodV9jdHgtPmxsZGkucG9ydHNbMF0sCisJCQkJCSAgICBjdHgtPnR4X2NoYW5uZWxfaWQpKSkgeworCQlpZiAoIShyZXEtPmJhc2UuZmxhZ3MgJiBDUllQVE9fVEZNX1JFUV9NQVlfQkFDS0xPRykpCisJCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmIChuYnl0ZXMgKyByZXFfY3R4LT5iZnJfbGVuID49IGJzKSB7CisJCXJlbWFpbmRlciA9IChuYnl0ZXMgKyByZXFfY3R4LT5iZnJfbGVuKSAlIGJzOworCQluYnl0ZXMgPSBuYnl0ZXMgKyByZXFfY3R4LT5iZnJfbGVuIC0gcmVtYWluZGVyOworCX0gZWxzZSB7CisJCXNnX3Bjb3B5X3RvX2J1ZmZlcihyZXEtPnNyYywgc2dfbmVudHMocmVxLT5zcmMpLCByZXFfY3R4LT5iZnIgKworCQkJCSAgIHJlcV9jdHgtPmJmcl9sZW4sIG5ieXRlcywgMCk7CisJCXJlcV9jdHgtPmJmcl9sZW4gKz0gbmJ5dGVzOworCQlyZXR1cm4gMDsKKwl9CisKKwlwYXJhbXMub3BhZF9uZWVkZWQgPSAwOworCXBhcmFtcy5tb3JlID0gMTsKKwlwYXJhbXMubGFzdCA9IDA7CisJcGFyYW1zLnNnX2xlbiA9IG5ieXRlcyAtIHJlcV9jdHgtPmJmcl9sZW47CisJcGFyYW1zLmJmcl9sZW4gPSByZXFfY3R4LT5iZnJfbGVuOworCXBhcmFtcy5zY21kMSA9IDA7CisJZ2V0X2FsZ19jb25maWcoJnBhcmFtcy5hbGdfcHJtLCBjcnlwdG9fYWhhc2hfZGlnZXN0c2l6ZShydGZtKSk7CisJcmVxX2N0eC0+cmVzdWx0ID0gMDsKKwlyZXFfY3R4LT5kYXRhX2xlbiArPSBwYXJhbXMuc2dfbGVuICsgcGFyYW1zLmJmcl9sZW47CisJc2tiID0gY3JlYXRlX2ZpbmFsX2hhc2hfd3IocmVxLCAmcGFyYW1zKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXFfY3R4LT5iZnJfbGVuID0gcmVtYWluZGVyOworCWlmIChyZW1haW5kZXIpCisJCXNnX3Bjb3B5X3RvX2J1ZmZlcihyZXEtPnNyYywgc2dfbmVudHMocmVxLT5zcmMpLAorCQkJCSAgIHJlcV9jdHgtPmJmciwgcmVtYWluZGVyLCByZXEtPm5ieXRlcyAtCisJCQkJICAgcmVtYWluZGVyKTsKKwlza2ItPmRldiA9IHVfY3R4LT5sbGRpLnBvcnRzWzBdOworCXNldF93cl90eHEoc2tiLCBDUExfUFJJT1JJVFlfREFUQSwgY3R4LT50eF9jaGFubmVsX2lkKTsKKwljaGNyX3NlbmRfd3Ioc2tiKTsKKworCXJldHVybiAtRUlOUFJPR1JFU1M7Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9sYXN0X2hhc2hfYmxvY2soY2hhciAqYmZyX3B0ciwgdW5zaWduZWQgaW50IGJzLCB1NjQgc2NtZDEpCit7CisJbWVtc2V0KGJmcl9wdHIsIDAsIGJzKTsKKwkqYmZyX3B0ciA9IDB4ODA7CisJaWYgKGJzID09IDY0KQorCQkqKF9fYmU2NCAqKShiZnJfcHRyICsgNTYpID0gY3B1X3RvX2JlNjQoc2NtZDEgIDw8IDMpOworCWVsc2UKKwkJKihfX2JlNjQgKikoYmZyX3B0ciArIDEyMCkgPSAgY3B1X3RvX2JlNjQoc2NtZDEgIDw8IDMpOworfQorCitzdGF0aWMgaW50IGNoY3JfYWhhc2hfZmluYWwoc3RydWN0IGFoYXNoX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgY2hjcl9haGFzaF9yZXFfY3R4ICpyZXFfY3R4ID0gYWhhc2hfcmVxdWVzdF9jdHgocmVxKTsKKwlzdHJ1Y3QgY3J5cHRvX2FoYXNoICpydGZtID0gY3J5cHRvX2FoYXNoX3JlcXRmbShyZXEpOworCXN0cnVjdCBjaGNyX2NvbnRleHQgKmN0eCA9IGNyeXB0b190Zm1fY3R4KGNyeXB0b19haGFzaF90Zm0ocnRmbSkpOworCXN0cnVjdCBoYXNoX3dyX3BhcmFtIHBhcmFtczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCB1bGRfY3R4ICp1X2N0eCA9IE5VTEw7CisJdTggYnMgPSBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUoY3J5cHRvX2FoYXNoX3RmbShydGZtKSk7CisKKwl1X2N0eCA9IFVMRF9DVFgoY3R4KTsKKwlpZiAoaXNfaG1hYyhjcnlwdG9fYWhhc2hfdGZtKHJ0Zm0pKSkKKwkJcGFyYW1zLm9wYWRfbmVlZGVkID0gMTsKKwllbHNlCisJCXBhcmFtcy5vcGFkX25lZWRlZCA9IDA7CisJcGFyYW1zLnNnX2xlbiA9IDA7CisJZ2V0X2FsZ19jb25maWcoJnBhcmFtcy5hbGdfcHJtLCBjcnlwdG9fYWhhc2hfZGlnZXN0c2l6ZShydGZtKSk7CisJcmVxX2N0eC0+cmVzdWx0ID0gMTsKKwlwYXJhbXMuYmZyX2xlbiA9IHJlcV9jdHgtPmJmcl9sZW47CisJcmVxX2N0eC0+ZGF0YV9sZW4gKz0gcGFyYW1zLmJmcl9sZW4gKyBwYXJhbXMuc2dfbGVuOworCWlmIChyZXFfY3R4LT5iZnIgJiYgKHJlcV9jdHgtPmJmcl9sZW4gPT0gMCkpIHsKKwkJY3JlYXRlX2xhc3RfaGFzaF9ibG9jayhyZXFfY3R4LT5iZnIsIGJzLCByZXFfY3R4LT5kYXRhX2xlbik7CisJCXBhcmFtcy5sYXN0ID0gMDsKKwkJcGFyYW1zLm1vcmUgPSAxOworCQlwYXJhbXMuc2NtZDEgPSAwOworCQlwYXJhbXMuYmZyX2xlbiA9IGJzOworCisJfSBlbHNlIHsKKwkJcGFyYW1zLnNjbWQxID0gcmVxX2N0eC0+ZGF0YV9sZW47CisJCXBhcmFtcy5sYXN0ID0gMTsKKwkJcGFyYW1zLm1vcmUgPSAwOworCX0KKwlza2IgPSBjcmVhdGVfZmluYWxfaGFzaF93cihyZXEsICZwYXJhbXMpOworCXNrYi0+ZGV2ID0gdV9jdHgtPmxsZGkucG9ydHNbMF07CisJc2V0X3dyX3R4cShza2IsIENQTF9QUklPUklUWV9EQVRBLCBjdHgtPnR4X2NoYW5uZWxfaWQpOworCWNoY3Jfc2VuZF93cihza2IpOworCXJldHVybiAtRUlOUFJPR1JFU1M7Cit9CisKK3N0YXRpYyBpbnQgY2hjcl9haGFzaF9maW51cChzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBjaGNyX2FoYXNoX3JlcV9jdHggKnJlcV9jdHggPSBhaGFzaF9yZXF1ZXN0X2N0eChyZXEpOworCXN0cnVjdCBjcnlwdG9fYWhhc2ggKnJ0Zm0gPSBjcnlwdG9fYWhhc2hfcmVxdGZtKHJlcSk7CisJc3RydWN0IGNoY3JfY29udGV4dCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgoY3J5cHRvX2FoYXNoX3RmbShydGZtKSk7CisJc3RydWN0IHVsZF9jdHggKnVfY3R4ID0gTlVMTDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBoYXNoX3dyX3BhcmFtIHBhcmFtczsKKwl1OCAgYnM7CisKKwlicyA9IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZShjcnlwdG9fYWhhc2hfdGZtKHJ0Zm0pKTsKKwl1X2N0eCA9IFVMRF9DVFgoY3R4KTsKKworCWlmICh1bmxpa2VseShjeGdiNF9pc19jcnlwdG9fcV9mdWxsKHVfY3R4LT5sbGRpLnBvcnRzWzBdLAorCQkJCQkgICAgY3R4LT50eF9jaGFubmVsX2lkKSkpIHsKKwkJaWYgKCEocmVxLT5iYXNlLmZsYWdzICYgQ1JZUFRPX1RGTV9SRVFfTUFZX0JBQ0tMT0cpKQorCQkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoaXNfaG1hYyhjcnlwdG9fYWhhc2hfdGZtKHJ0Zm0pKSkKKwkJcGFyYW1zLm9wYWRfbmVlZGVkID0gMTsKKwllbHNlCisJCXBhcmFtcy5vcGFkX25lZWRlZCA9IDA7CisKKwlwYXJhbXMuc2dfbGVuID0gcmVxLT5uYnl0ZXM7CisJcGFyYW1zLmJmcl9sZW4gPSByZXFfY3R4LT5iZnJfbGVuOworCWdldF9hbGdfY29uZmlnKCZwYXJhbXMuYWxnX3BybSwgY3J5cHRvX2FoYXNoX2RpZ2VzdHNpemUocnRmbSkpOworCXJlcV9jdHgtPmRhdGFfbGVuICs9IHBhcmFtcy5iZnJfbGVuICsgcGFyYW1zLnNnX2xlbjsKKwlyZXFfY3R4LT5yZXN1bHQgPSAxOworCWlmIChyZXFfY3R4LT5iZnIgJiYgKHJlcV9jdHgtPmJmcl9sZW4gKyByZXEtPm5ieXRlcykgPT0gMCkgeworCQljcmVhdGVfbGFzdF9oYXNoX2Jsb2NrKHJlcV9jdHgtPmJmciwgYnMsIHJlcV9jdHgtPmRhdGFfbGVuKTsKKwkJcGFyYW1zLmxhc3QgPSAwOworCQlwYXJhbXMubW9yZSA9IDE7CisJCXBhcmFtcy5zY21kMSA9IDA7CisJCXBhcmFtcy5iZnJfbGVuID0gYnM7CisJfSBlbHNlIHsKKwkJcGFyYW1zLnNjbWQxID0gcmVxX2N0eC0+ZGF0YV9sZW47CisJCXBhcmFtcy5sYXN0ID0gMTsKKwkJcGFyYW1zLm1vcmUgPSAwOworCX0KKworCXNrYiA9IGNyZWF0ZV9maW5hbF9oYXNoX3dyKHJlcSwgJnBhcmFtcyk7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PTUVNOworCXNrYi0+ZGV2ID0gdV9jdHgtPmxsZGkucG9ydHNbMF07CisJc2V0X3dyX3R4cShza2IsIENQTF9QUklPUklUWV9EQVRBLCBjdHgtPnR4X2NoYW5uZWxfaWQpOworCWNoY3Jfc2VuZF93cihza2IpOworCisJcmV0dXJuIC1FSU5QUk9HUkVTUzsKK30KKworc3RhdGljIGludCBjaGNyX2FoYXNoX2RpZ2VzdChzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBjaGNyX2FoYXNoX3JlcV9jdHggKnJlcV9jdHggPSBhaGFzaF9yZXF1ZXN0X2N0eChyZXEpOworCXN0cnVjdCBjcnlwdG9fYWhhc2ggKnJ0Zm0gPSBjcnlwdG9fYWhhc2hfcmVxdGZtKHJlcSk7CisJc3RydWN0IGNoY3JfY29udGV4dCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgoY3J5cHRvX2FoYXNoX3RmbShydGZtKSk7CisJc3RydWN0IHVsZF9jdHggKnVfY3R4ID0gTlVMTDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBoYXNoX3dyX3BhcmFtIHBhcmFtczsKKwl1OCAgYnM7CisKKwlydGZtLT5pbml0KHJlcSk7CisJYnMgPSBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUoY3J5cHRvX2FoYXNoX3RmbShydGZtKSk7CisKKwl1X2N0eCA9IFVMRF9DVFgoY3R4KTsKKwlpZiAodW5saWtlbHkoY3hnYjRfaXNfY3J5cHRvX3FfZnVsbCh1X2N0eC0+bGxkaS5wb3J0c1swXSwKKwkJCQkJICAgIGN0eC0+dHhfY2hhbm5lbF9pZCkpKSB7CisJCWlmICghKHJlcS0+YmFzZS5mbGFncyAmIENSWVBUT19URk1fUkVRX01BWV9CQUNLTE9HKSkKKwkJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKGlzX2htYWMoY3J5cHRvX2FoYXNoX3RmbShydGZtKSkpCisJCXBhcmFtcy5vcGFkX25lZWRlZCA9IDE7CisJZWxzZQorCQlwYXJhbXMub3BhZF9uZWVkZWQgPSAwOworCisJcGFyYW1zLmxhc3QgPSAwOworCXBhcmFtcy5tb3JlID0gMDsKKwlwYXJhbXMuc2dfbGVuID0gcmVxLT5uYnl0ZXM7CisJcGFyYW1zLmJmcl9sZW4gPSAwOworCXBhcmFtcy5zY21kMSA9IDA7CisJZ2V0X2FsZ19jb25maWcoJnBhcmFtcy5hbGdfcHJtLCBjcnlwdG9fYWhhc2hfZGlnZXN0c2l6ZShydGZtKSk7CisJcmVxX2N0eC0+cmVzdWx0ID0gMTsKKwlyZXFfY3R4LT5kYXRhX2xlbiArPSBwYXJhbXMuYmZyX2xlbiArIHBhcmFtcy5zZ19sZW47CisKKwlpZiAocmVxX2N0eC0+YmZyICYmIHJlcS0+bmJ5dGVzID09IDApIHsKKwkJY3JlYXRlX2xhc3RfaGFzaF9ibG9jayhyZXFfY3R4LT5iZnIsIGJzLCAwKTsKKwkJcGFyYW1zLm1vcmUgPSAxOworCQlwYXJhbXMuYmZyX2xlbiA9IGJzOworCX0KKworCXNrYiA9IGNyZWF0ZV9maW5hbF9oYXNoX3dyKHJlcSwgJnBhcmFtcyk7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PTUVNOworCisJc2tiLT5kZXYgPSB1X2N0eC0+bGxkaS5wb3J0c1swXTsKKwlzZXRfd3JfdHhxKHNrYiwgQ1BMX1BSSU9SSVRZX0RBVEEsIGN0eC0+dHhfY2hhbm5lbF9pZCk7CisJY2hjcl9zZW5kX3dyKHNrYik7CisJcmV0dXJuIC1FSU5QUk9HUkVTUzsKK30KKworc3RhdGljIGludCBjaGNyX2FoYXNoX2V4cG9ydChzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqYXJlcSwgdm9pZCAqb3V0KQoreworCXN0cnVjdCBjaGNyX2FoYXNoX3JlcV9jdHggKnJlcV9jdHggPSBhaGFzaF9yZXF1ZXN0X2N0eChhcmVxKTsKKwlzdHJ1Y3QgY2hjcl9haGFzaF9yZXFfY3R4ICpzdGF0ZSA9IG91dDsKKworCXN0YXRlLT5iZnJfbGVuID0gcmVxX2N0eC0+YmZyX2xlbjsKKwlzdGF0ZS0+ZGF0YV9sZW4gPSByZXFfY3R4LT5kYXRhX2xlbjsKKwltZW1jcHkoc3RhdGUtPmJmciwgcmVxX2N0eC0+YmZyLCBDSENSX0hBU0hfTUFYX0JMT0NLX1NJWkVfMTI4KTsKKwltZW1jcHkoc3RhdGUtPnBhcnRpYWxfaGFzaCwgcmVxX2N0eC0+cGFydGlhbF9oYXNoLAorCSAgICAgICBDSENSX0hBU0hfTUFYX0RJR0VTVF9TSVpFKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGNyX2FoYXNoX2ltcG9ydChzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqYXJlcSwgY29uc3Qgdm9pZCAqaW4pCit7CisJc3RydWN0IGNoY3JfYWhhc2hfcmVxX2N0eCAqcmVxX2N0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KGFyZXEpOworCXN0cnVjdCBjaGNyX2FoYXNoX3JlcV9jdHggKnN0YXRlID0gKHN0cnVjdCBjaGNyX2FoYXNoX3JlcV9jdHggKilpbjsKKworCXJlcV9jdHgtPmJmcl9sZW4gPSBzdGF0ZS0+YmZyX2xlbjsKKwlyZXFfY3R4LT5kYXRhX2xlbiA9IHN0YXRlLT5kYXRhX2xlbjsKKwlyZXFfY3R4LT5kdW1teV9wYXlsb2FkX3B0ciA9IE5VTEw7CisJbWVtY3B5KHJlcV9jdHgtPmJmciwgc3RhdGUtPmJmciwgQ0hDUl9IQVNIX01BWF9CTE9DS19TSVpFXzEyOCk7CisJbWVtY3B5KHJlcV9jdHgtPnBhcnRpYWxfaGFzaCwgc3RhdGUtPnBhcnRpYWxfaGFzaCwKKwkgICAgICAgQ0hDUl9IQVNIX01BWF9ESUdFU1RfU0laRSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hjcl9haGFzaF9zZXRrZXkoc3RydWN0IGNyeXB0b19haGFzaCAqdGZtLCBjb25zdCB1OCAqa2V5LAorCQkJICAgICB1bnNpZ25lZCBpbnQga2V5bGVuKQoreworCXN0cnVjdCBjaGNyX2NvbnRleHQgKmN0eCA9IGNyeXB0b190Zm1fY3R4KGNyeXB0b19haGFzaF90Zm0odGZtKSk7CisJc3RydWN0IGhtYWNfY3R4ICpobWFjY3R4ID0gSE1BQ19DVFgoY3R4KTsKKwl1bnNpZ25lZCBpbnQgZGlnZXN0c2l6ZSA9IGNyeXB0b19haGFzaF9kaWdlc3RzaXplKHRmbSk7CisJdW5zaWduZWQgaW50IGJzID0gY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKGNyeXB0b19haGFzaF90Zm0odGZtKSk7CisJdW5zaWduZWQgaW50IGksIGVyciA9IDAsIHVwZGF0ZWRfZGlnZXN0c2l6ZTsKKworCS8qCisJICogdXNlIHRoZSBrZXkgdG8gY2FsY3VsYXRlIHRoZSBpcGFkIGFuZCBvcGFkLiBpcGFkIHdpbGwgc2VudCB3aXRoIHRoZQorCSAqIGZpcnN0IHJlcXVlc3QncyBkYXRhLiBvcGFkIHdpbGwgYmUgc2VudCB3aXRoIHRoZSBmaW5hbCBoYXNoIHJlc3VsdAorCSAqIGlwYWQgaW4gaG1hY2N0eC0+aXBhZCBhbmQgb3BhZCBpbiBobWFjY3R4LT5vcGFkIGxvY2F0aW9uCisJICovCisJaWYgKCFobWFjY3R4LT5kZXNjKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa2V5bGVuID4gYnMpIHsKKwkJZXJyID0gY3J5cHRvX3NoYXNoX2RpZ2VzdChobWFjY3R4LT5kZXNjLCBrZXksIGtleWxlbiwKKwkJCQkJICBobWFjY3R4LT5pcGFkKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCQlrZXlsZW4gPSBkaWdlc3RzaXplOworCX0gZWxzZSB7CisJCW1lbWNweShobWFjY3R4LT5pcGFkLCBrZXksIGtleWxlbik7CisJfQorCW1lbXNldChobWFjY3R4LT5pcGFkICsga2V5bGVuLCAwLCBicyAtIGtleWxlbik7CisJbWVtY3B5KGhtYWNjdHgtPm9wYWQsIGhtYWNjdHgtPmlwYWQsIGJzKTsKKworCWZvciAoaSA9IDA7IGkgPCBicyAvIHNpemVvZihpbnQpOyBpKyspIHsKKwkJKigodW5zaWduZWQgaW50ICopKCZobWFjY3R4LT5pcGFkKSArIGkpIF49IElQQURfREFUQTsKKwkJKigodW5zaWduZWQgaW50ICopKCZobWFjY3R4LT5vcGFkKSArIGkpIF49IE9QQURfREFUQTsKKwl9CisKKwl1cGRhdGVkX2RpZ2VzdHNpemUgPSBkaWdlc3RzaXplOworCWlmIChkaWdlc3RzaXplID09IFNIQTIyNF9ESUdFU1RfU0laRSkKKwkJdXBkYXRlZF9kaWdlc3RzaXplID0gU0hBMjU2X0RJR0VTVF9TSVpFOworCWVsc2UgaWYgKGRpZ2VzdHNpemUgPT0gU0hBMzg0X0RJR0VTVF9TSVpFKQorCQl1cGRhdGVkX2RpZ2VzdHNpemUgPSBTSEE1MTJfRElHRVNUX1NJWkU7CisJZXJyID0gY2hjcl9jb21wdXRlX3BhcnRpYWxfaGFzaChobWFjY3R4LT5kZXNjLCBobWFjY3R4LT5pcGFkLAorCQkJCQlobWFjY3R4LT5pcGFkLCBkaWdlc3RzaXplKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwljaGNyX2NoYW5nZV9vcmRlcihobWFjY3R4LT5pcGFkLCB1cGRhdGVkX2RpZ2VzdHNpemUpOworCisJZXJyID0gY2hjcl9jb21wdXRlX3BhcnRpYWxfaGFzaChobWFjY3R4LT5kZXNjLCBobWFjY3R4LT5vcGFkLAorCQkJCQlobWFjY3R4LT5vcGFkLCBkaWdlc3RzaXplKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwljaGNyX2NoYW5nZV9vcmRlcihobWFjY3R4LT5vcGFkLCB1cGRhdGVkX2RpZ2VzdHNpemUpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgY2hjcl9hZXNfeHRzX3NldGtleShzdHJ1Y3QgY3J5cHRvX2FibGtjaXBoZXIgKnRmbSwgY29uc3QgdTggKmtleSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQga2V5X2xlbikKK3sKKwlzdHJ1Y3QgY2hjcl9jb250ZXh0ICpjdHggPSBjcnlwdG9fYWJsa2NpcGhlcl9jdHgodGZtKTsKKwlzdHJ1Y3QgYWJsa19jdHggKmFibGtjdHggPSBBQkxLX0NUWChjdHgpOworCWludCBzdGF0dXMgPSAwOworCXVuc2lnbmVkIHNob3J0IGNvbnRleHRfc2l6ZSA9IDA7CisKKwlpZiAoKGtleV9sZW4gPT0gKEFFU19LRVlTSVpFXzEyOCA8PCAxKSkgfHwKKwkgICAgKGtleV9sZW4gPT0gKEFFU19LRVlTSVpFXzI1NiA8PCAxKSkpIHsKKwkJbWVtY3B5KGFibGtjdHgtPmtleSwga2V5LCBrZXlfbGVuKTsKKwkJYWJsa2N0eC0+ZW5ja2V5X2xlbiA9IGtleV9sZW47CisJCWNvbnRleHRfc2l6ZSA9IChLRVlfQ09OVEVYVF9IRFJfU0FMVF9BTkRfUEFEICsga2V5X2xlbikgPj4gNDsKKwkJYWJsa2N0eC0+a2V5X2N0eF9oZHIgPQorCQkJRklMTF9LRVlfQ1RYX0hEUigoa2V5X2xlbiA9PSBBRVNfS0VZU0laRV8yNTYpID8KKwkJCQkJIENIQ1JfS0VZQ1RYX0NJUEhFUl9LRVlfU0laRV8xMjggOgorCQkJCQkgQ0hDUl9LRVlDVFhfQ0lQSEVSX0tFWV9TSVpFXzI1NiwKKwkJCQkJIENIQ1JfS0VZQ1RYX05PX0tFWSwgMSwKKwkJCQkJIDAsIGNvbnRleHRfc2l6ZSk7CisJCWFibGtjdHgtPmNpcGhfbW9kZSA9IENIQ1JfU0NNRF9DSVBIRVJfTU9ERV9BRVNfWFRTOworCX0gZWxzZSB7CisJCWNyeXB0b190Zm1fc2V0X2ZsYWdzKChzdHJ1Y3QgY3J5cHRvX3RmbSAqKXRmbSwKKwkJCQkgICAgIENSWVBUT19URk1fUkVTX0JBRF9LRVlfTEVOKTsKKwkJYWJsa2N0eC0+ZW5ja2V5X2xlbiA9IDA7CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgY2hjcl9zaGFfaW5pdChzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqYXJlcSkKK3sKKwlzdHJ1Y3QgY2hjcl9haGFzaF9yZXFfY3R4ICpyZXFfY3R4ID0gYWhhc2hfcmVxdWVzdF9jdHgoYXJlcSk7CisJc3RydWN0IGNyeXB0b19haGFzaCAqdGZtID0gY3J5cHRvX2FoYXNoX3JlcXRmbShhcmVxKTsKKwlpbnQgZGlnZXN0c2l6ZSA9ICBjcnlwdG9fYWhhc2hfZGlnZXN0c2l6ZSh0Zm0pOworCisJcmVxX2N0eC0+ZGF0YV9sZW4gPSAwOworCXJlcV9jdHgtPmR1bW15X3BheWxvYWRfcHRyID0gTlVMTDsKKwlyZXFfY3R4LT5iZnJfbGVuID0gMDsKKwlyZXFfY3R4LT5za2IgPSBOVUxMOworCXJlcV9jdHgtPnJlc3VsdCA9IDA7CisJY29weV9oYXNoX2luaXRfdmFsdWVzKHJlcV9jdHgtPnBhcnRpYWxfaGFzaCwgZGlnZXN0c2l6ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hjcl9zaGFfY3JhX2luaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwljcnlwdG9fYWhhc2hfc2V0X3JlcXNpemUoX19jcnlwdG9fYWhhc2hfY2FzdCh0Zm0pLAorCQkJCSBzaXplb2Yoc3RydWN0IGNoY3JfYWhhc2hfcmVxX2N0eCkpOworCXJldHVybiBjaGNyX2RldmljZV9pbml0KGNyeXB0b190Zm1fY3R4KHRmbSkpOworfQorCitzdGF0aWMgaW50IGNoY3JfaG1hY19pbml0KHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICphcmVxKQoreworCXN0cnVjdCBjaGNyX2FoYXNoX3JlcV9jdHggKnJlcV9jdHggPSBhaGFzaF9yZXF1ZXN0X2N0eChhcmVxKTsKKwlzdHJ1Y3QgY3J5cHRvX2FoYXNoICpydGZtID0gY3J5cHRvX2FoYXNoX3JlcXRmbShhcmVxKTsKKwlzdHJ1Y3QgY2hjcl9jb250ZXh0ICpjdHggPSBjcnlwdG9fdGZtX2N0eChjcnlwdG9fYWhhc2hfdGZtKHJ0Zm0pKTsKKwlzdHJ1Y3QgaG1hY19jdHggKmhtYWNjdHggPSBITUFDX0NUWChjdHgpOworCXVuc2lnbmVkIGludCBkaWdlc3RzaXplID0gY3J5cHRvX2FoYXNoX2RpZ2VzdHNpemUocnRmbSk7CisJdW5zaWduZWQgaW50IGJzID0gY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKGNyeXB0b19haGFzaF90Zm0ocnRmbSkpOworCisJY2hjcl9zaGFfaW5pdChhcmVxKTsKKwlyZXFfY3R4LT5kYXRhX2xlbiA9IGJzOworCWlmIChpc19obWFjKGNyeXB0b19haGFzaF90Zm0ocnRmbSkpKSB7CisJCWlmIChkaWdlc3RzaXplID09IFNIQTIyNF9ESUdFU1RfU0laRSkKKwkJCW1lbWNweShyZXFfY3R4LT5wYXJ0aWFsX2hhc2gsIGhtYWNjdHgtPmlwYWQsCisJCQkgICAgICAgU0hBMjU2X0RJR0VTVF9TSVpFKTsKKwkJZWxzZSBpZiAoZGlnZXN0c2l6ZSA9PSBTSEEzODRfRElHRVNUX1NJWkUpCisJCQltZW1jcHkocmVxX2N0eC0+cGFydGlhbF9oYXNoLCBobWFjY3R4LT5pcGFkLAorCQkJICAgICAgIFNIQTUxMl9ESUdFU1RfU0laRSk7CisJCWVsc2UKKwkJCW1lbWNweShyZXFfY3R4LT5wYXJ0aWFsX2hhc2gsIGhtYWNjdHgtPmlwYWQsCisJCQkgICAgICAgZGlnZXN0c2l6ZSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoY3JfaG1hY19jcmFfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXN0cnVjdCBjaGNyX2NvbnRleHQgKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CisJc3RydWN0IGhtYWNfY3R4ICpobWFjY3R4ID0gSE1BQ19DVFgoY3R4KTsKKwl1bnNpZ25lZCBpbnQgZGlnZXN0c2l6ZSA9CisJCWNyeXB0b19haGFzaF9kaWdlc3RzaXplKF9fY3J5cHRvX2FoYXNoX2Nhc3QodGZtKSk7CisKKwljcnlwdG9fYWhhc2hfc2V0X3JlcXNpemUoX19jcnlwdG9fYWhhc2hfY2FzdCh0Zm0pLAorCQkJCSBzaXplb2Yoc3RydWN0IGNoY3JfYWhhc2hfcmVxX2N0eCkpOworCWhtYWNjdHgtPmRlc2MgPSBjaGNyX2FsbG9jX3NoYXNoKGRpZ2VzdHNpemUpOworCWlmIChJU19FUlIoaG1hY2N0eC0+ZGVzYykpCisJCXJldHVybiBQVFJfRVJSKGhtYWNjdHgtPmRlc2MpOworCXJldHVybiBjaGNyX2RldmljZV9pbml0KGNyeXB0b190Zm1fY3R4KHRmbSkpOworfQorCitzdGF0aWMgdm9pZCBjaGNyX2ZyZWVfc2hhc2goc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MpCit7CisJY3J5cHRvX2ZyZWVfc2hhc2goZGVzYy0+dGZtKTsKKwlrZnJlZShkZXNjKTsKK30KKworc3RhdGljIHZvaWQgY2hjcl9obWFjX2NyYV9leGl0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJc3RydWN0IGNoY3JfY29udGV4dCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKwlzdHJ1Y3QgaG1hY19jdHggKmhtYWNjdHggPSBITUFDX0NUWChjdHgpOworCisJaWYgKGhtYWNjdHgtPmRlc2MpIHsKKwkJY2hjcl9mcmVlX3NoYXNoKGhtYWNjdHgtPmRlc2MpOworCQlobWFjY3R4LT5kZXNjID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2hjcl9hbGdfdGVtcGxhdGUgZHJpdmVyX2FsZ3NbXSA9IHsKKwkvKiBBRVMtQ0JDICovCisJeworCQkudHlwZSA9IENSWVBUT19BTEdfVFlQRV9BQkxLQ0lQSEVSLAorCQkuaXNfcmVnaXN0ZXJlZCA9IDAsCisJCS5hbGcuY3J5cHRvID0geworCQkJLmNyYV9uYW1lCQk9ICJjYmMoYWVzKSIsCisJCQkuY3JhX2RyaXZlcl9uYW1lCT0gImNiYyhhZXMtY2hjcikiLAorCQkJLmNyYV9wcmlvcml0eQkJPSBDSENSX0NSQV9QUklPUklUWSwKKwkJCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiB8CisJCQkJQ1JZUFRPX0FMR19BU1lOQywKKwkJCS5jcmFfYmxvY2tzaXplCQk9IEFFU19CTE9DS19TSVpFLAorCQkJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3QgY2hjcl9jb250ZXh0KQorCQkJCSsgc2l6ZW9mKHN0cnVjdCBhYmxrX2N0eCksCisJCQkuY3JhX2FsaWdubWFzawkJPSAwLAorCQkJLmNyYV90eXBlCQk9ICZjcnlwdG9fYWJsa2NpcGhlcl90eXBlLAorCQkJLmNyYV9tb2R1bGUJCT0gVEhJU19NT0RVTEUsCisJCQkuY3JhX2luaXQJCT0gY2hjcl9jcmFfaW5pdCwKKwkJCS5jcmFfZXhpdAkJPSBOVUxMLAorCQkJLmNyYV91LmFibGtjaXBoZXIJPSB7CisJCQkJLm1pbl9rZXlzaXplCT0gQUVTX01JTl9LRVlfU0laRSwKKwkJCQkubWF4X2tleXNpemUJPSBBRVNfTUFYX0tFWV9TSVpFLAorCQkJCS5pdnNpemUJCT0gQUVTX0JMT0NLX1NJWkUsCisJCQkJLnNldGtleQkJCT0gY2hjcl9hZXNfY2JjX3NldGtleSwKKwkJCQkuZW5jcnlwdAkJPSBjaGNyX2Flc19lbmNyeXB0LAorCQkJCS5kZWNyeXB0CQk9IGNoY3JfYWVzX2RlY3J5cHQsCisJCQl9CisJCX0KKwl9LAorCXsKKwkJLnR5cGUgPSBDUllQVE9fQUxHX1RZUEVfQUJMS0NJUEhFUiwKKwkJLmlzX3JlZ2lzdGVyZWQgPSAwLAorCQkuYWxnLmNyeXB0byA9ICAgeworCQkJLmNyYV9uYW1lCQk9ICJ4dHMoYWVzKSIsCisJCQkuY3JhX2RyaXZlcl9uYW1lCT0gInh0cyhhZXMtY2hjcikiLAorCQkJLmNyYV9wcmlvcml0eQkJPSBDSENSX0NSQV9QUklPUklUWSwKKwkJCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiB8CisJCQkJQ1JZUFRPX0FMR19BU1lOQywKKwkJCS5jcmFfYmxvY2tzaXplCQk9IEFFU19CTE9DS19TSVpFLAorCQkJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3QgY2hjcl9jb250ZXh0KSArCisJCQkJc2l6ZW9mKHN0cnVjdCBhYmxrX2N0eCksCisJCQkuY3JhX2FsaWdubWFzawkJPSAwLAorCQkJLmNyYV90eXBlCQk9ICZjcnlwdG9fYWJsa2NpcGhlcl90eXBlLAorCQkJLmNyYV9tb2R1bGUJCT0gVEhJU19NT0RVTEUsCisJCQkuY3JhX2luaXQJCT0gY2hjcl9jcmFfaW5pdCwKKwkJCS5jcmFfZXhpdAkJPSBOVUxMLAorCQkJLmNyYV91ID0geworCQkJCS5hYmxrY2lwaGVyID0geworCQkJCQkubWluX2tleXNpemUJPSAyICogQUVTX01JTl9LRVlfU0laRSwKKwkJCQkJLm1heF9rZXlzaXplCT0gMiAqIEFFU19NQVhfS0VZX1NJWkUsCisJCQkJCS5pdnNpemUJCT0gQUVTX0JMT0NLX1NJWkUsCisJCQkJCS5zZXRrZXkJCT0gY2hjcl9hZXNfeHRzX3NldGtleSwKKwkJCQkJLmVuY3J5cHQJPSBjaGNyX2Flc19lbmNyeXB0LAorCQkJCQkuZGVjcnlwdAk9IGNoY3JfYWVzX2RlY3J5cHQsCisJCQkJfQorCQkJfQorCQl9CisJfSwKKwkvKiBTSEEgKi8KKwl7CisJCS50eXBlID0gQ1JZUFRPX0FMR19UWVBFX0FIQVNILAorCQkuaXNfcmVnaXN0ZXJlZCA9IDAsCisJCS5hbGcuaGFzaCA9IHsKKwkJCS5oYWxnLmRpZ2VzdHNpemUgPSBTSEExX0RJR0VTVF9TSVpFLAorCQkJLmhhbGcuYmFzZSA9IHsKKwkJCQkuY3JhX25hbWUgPSAic2hhMSIsCisJCQkJLmNyYV9kcml2ZXJfbmFtZSA9ICJzaGExLWNoY3IiLAorCQkJCS5jcmFfYmxvY2tzaXplID0gU0hBMV9CTE9DS19TSVpFLAorCQkJfQorCQl9CisJfSwKKwl7CisJCS50eXBlID0gQ1JZUFRPX0FMR19UWVBFX0FIQVNILAorCQkuaXNfcmVnaXN0ZXJlZCA9IDAsCisJCS5hbGcuaGFzaCA9IHsKKwkJCS5oYWxnLmRpZ2VzdHNpemUgPSBTSEEyNTZfRElHRVNUX1NJWkUsCisJCQkuaGFsZy5iYXNlID0geworCQkJCS5jcmFfbmFtZSA9ICJzaGEyNTYiLAorCQkJCS5jcmFfZHJpdmVyX25hbWUgPSAic2hhMjU2LWNoY3IiLAorCQkJCS5jcmFfYmxvY2tzaXplID0gU0hBMjU2X0JMT0NLX1NJWkUsCisJCQl9CisJCX0KKwl9LAorCXsKKwkJLnR5cGUgPSBDUllQVE9fQUxHX1RZUEVfQUhBU0gsCisJCS5pc19yZWdpc3RlcmVkID0gMCwKKwkJLmFsZy5oYXNoID0geworCQkJLmhhbGcuZGlnZXN0c2l6ZSA9IFNIQTIyNF9ESUdFU1RfU0laRSwKKwkJCS5oYWxnLmJhc2UgPSB7CisJCQkJLmNyYV9uYW1lID0gInNoYTIyNCIsCisJCQkJLmNyYV9kcml2ZXJfbmFtZSA9ICJzaGEyMjQtY2hjciIsCisJCQkJLmNyYV9ibG9ja3NpemUgPSBTSEEyMjRfQkxPQ0tfU0laRSwKKwkJCX0KKwkJfQorCX0sCisJeworCQkudHlwZSA9IENSWVBUT19BTEdfVFlQRV9BSEFTSCwKKwkJLmlzX3JlZ2lzdGVyZWQgPSAwLAorCQkuYWxnLmhhc2ggPSB7CisJCQkuaGFsZy5kaWdlc3RzaXplID0gU0hBMzg0X0RJR0VTVF9TSVpFLAorCQkJLmhhbGcuYmFzZSA9IHsKKwkJCQkuY3JhX25hbWUgPSAic2hhMzg0IiwKKwkJCQkuY3JhX2RyaXZlcl9uYW1lID0gInNoYTM4NC1jaGNyIiwKKwkJCQkuY3JhX2Jsb2Nrc2l6ZSA9IFNIQTM4NF9CTE9DS19TSVpFLAorCQkJfQorCQl9CisJfSwKKwl7CisJCS50eXBlID0gQ1JZUFRPX0FMR19UWVBFX0FIQVNILAorCQkuaXNfcmVnaXN0ZXJlZCA9IDAsCisJCS5hbGcuaGFzaCA9IHsKKwkJCS5oYWxnLmRpZ2VzdHNpemUgPSBTSEE1MTJfRElHRVNUX1NJWkUsCisJCQkuaGFsZy5iYXNlID0geworCQkJCS5jcmFfbmFtZSA9ICJzaGE1MTIiLAorCQkJCS5jcmFfZHJpdmVyX25hbWUgPSAic2hhNTEyLWNoY3IiLAorCQkJCS5jcmFfYmxvY2tzaXplID0gU0hBNTEyX0JMT0NLX1NJWkUsCisJCQl9CisJCX0KKwl9LAorCS8qIEhNQUMgKi8KKwl7CisJCS50eXBlID0gQ1JZUFRPX0FMR19UWVBFX0hNQUMsCisJCS5pc19yZWdpc3RlcmVkID0gMCwKKwkJLmFsZy5oYXNoID0geworCQkJLmhhbGcuZGlnZXN0c2l6ZSA9IFNIQTFfRElHRVNUX1NJWkUsCisJCQkuaGFsZy5iYXNlID0geworCQkJCS5jcmFfbmFtZSA9ICJobWFjKHNoYTEpIiwKKwkJCQkuY3JhX2RyaXZlcl9uYW1lID0gImhtYWMoc2hhMS1jaGNyKSIsCisJCQkJLmNyYV9ibG9ja3NpemUgPSBTSEExX0JMT0NLX1NJWkUsCisJCQl9CisJCX0KKwl9LAorCXsKKwkJLnR5cGUgPSBDUllQVE9fQUxHX1RZUEVfSE1BQywKKwkJLmlzX3JlZ2lzdGVyZWQgPSAwLAorCQkuYWxnLmhhc2ggPSB7CisJCQkuaGFsZy5kaWdlc3RzaXplID0gU0hBMjI0X0RJR0VTVF9TSVpFLAorCQkJLmhhbGcuYmFzZSA9IHsKKwkJCQkuY3JhX25hbWUgPSAiaG1hYyhzaGEyMjQpIiwKKwkJCQkuY3JhX2RyaXZlcl9uYW1lID0gImhtYWMoc2hhMjI0LWNoY3IpIiwKKwkJCQkuY3JhX2Jsb2Nrc2l6ZSA9IFNIQTIyNF9CTE9DS19TSVpFLAorCQkJfQorCQl9CisJfSwKKwl7CisJCS50eXBlID0gQ1JZUFRPX0FMR19UWVBFX0hNQUMsCisJCS5pc19yZWdpc3RlcmVkID0gMCwKKwkJLmFsZy5oYXNoID0geworCQkJLmhhbGcuZGlnZXN0c2l6ZSA9IFNIQTI1Nl9ESUdFU1RfU0laRSwKKwkJCS5oYWxnLmJhc2UgPSB7CisJCQkJLmNyYV9uYW1lID0gImhtYWMoc2hhMjU2KSIsCisJCQkJLmNyYV9kcml2ZXJfbmFtZSA9ICJobWFjKHNoYTI1Ni1jaGNyKSIsCisJCQkJLmNyYV9ibG9ja3NpemUgPSBTSEEyNTZfQkxPQ0tfU0laRSwKKwkJCX0KKwkJfQorCX0sCisJeworCQkudHlwZSA9IENSWVBUT19BTEdfVFlQRV9ITUFDLAorCQkuaXNfcmVnaXN0ZXJlZCA9IDAsCisJCS5hbGcuaGFzaCA9IHsKKwkJCS5oYWxnLmRpZ2VzdHNpemUgPSBTSEEzODRfRElHRVNUX1NJWkUsCisJCQkuaGFsZy5iYXNlID0geworCQkJCS5jcmFfbmFtZSA9ICJobWFjKHNoYTM4NCkiLAorCQkJCS5jcmFfZHJpdmVyX25hbWUgPSAiaG1hYyhzaGEzODQtY2hjcikiLAorCQkJCS5jcmFfYmxvY2tzaXplID0gU0hBMzg0X0JMT0NLX1NJWkUsCisJCQl9CisJCX0KKwl9LAorCXsKKwkJLnR5cGUgPSBDUllQVE9fQUxHX1RZUEVfSE1BQywKKwkJLmlzX3JlZ2lzdGVyZWQgPSAwLAorCQkuYWxnLmhhc2ggPSB7CisJCQkuaGFsZy5kaWdlc3RzaXplID0gU0hBNTEyX0RJR0VTVF9TSVpFLAorCQkJLmhhbGcuYmFzZSA9IHsKKwkJCQkuY3JhX25hbWUgPSAiaG1hYyhzaGE1MTIpIiwKKwkJCQkuY3JhX2RyaXZlcl9uYW1lID0gImhtYWMoc2hhNTEyLWNoY3IpIiwKKwkJCQkuY3JhX2Jsb2Nrc2l6ZSA9IFNIQTUxMl9CTE9DS19TSVpFLAorCQkJfQorCQl9CisJfSwKK307CisKKy8qCisgKgljaGNyX3VucmVnaXN0ZXJfYWxnIC0gRGVyZWdpc3RlciBjcnlwdG8gYWxnb3JpdGhtcyB3aXRoCisgKglrZXJuZWwgZnJhbWV3b3JrLgorICovCitzdGF0aWMgaW50IGNoY3JfdW5yZWdpc3Rlcl9hbGcodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRyaXZlcl9hbGdzKTsgaSsrKSB7CisJCXN3aXRjaCAoZHJpdmVyX2FsZ3NbaV0udHlwZSAmIENSWVBUT19BTEdfVFlQRV9NQVNLKSB7CisJCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0FCTEtDSVBIRVI6CisJCQlpZiAoZHJpdmVyX2FsZ3NbaV0uaXNfcmVnaXN0ZXJlZCkKKwkJCQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoCisJCQkJCQkmZHJpdmVyX2FsZ3NbaV0uYWxnLmNyeXB0byk7CisJCQlicmVhazsKKwkJY2FzZSBDUllQVE9fQUxHX1RZUEVfQUhBU0g6CisJCQlpZiAoZHJpdmVyX2FsZ3NbaV0uaXNfcmVnaXN0ZXJlZCkKKwkJCQljcnlwdG9fdW5yZWdpc3Rlcl9haGFzaCgKKwkJCQkJCSZkcml2ZXJfYWxnc1tpXS5hbGcuaGFzaCk7CisJCQlicmVhazsKKwkJfQorCQlkcml2ZXJfYWxnc1tpXS5pc19yZWdpc3RlcmVkID0gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgU1pfQUhBU0hfQ1RYIHNpemVvZihzdHJ1Y3QgY2hjcl9jb250ZXh0KQorI2RlZmluZSBTWl9BSEFTSF9IX0NUWCAoc2l6ZW9mKHN0cnVjdCBjaGNyX2NvbnRleHQpICsgc2l6ZW9mKHN0cnVjdCBobWFjX2N0eCkpCisjZGVmaW5lIFNaX0FIQVNIX1JFUV9DVFggc2l6ZW9mKHN0cnVjdCBjaGNyX2FoYXNoX3JlcV9jdHgpCisjZGVmaW5lIEFIQVNIX0NSQV9GTEFHUyAoQ1JZUFRPX0FMR19UWVBFX0FIQVNIIHwgQ1JZUFRPX0FMR19BU1lOQykKKworLyoKKyAqCWNoY3JfcmVnaXN0ZXJfYWxnIC0gUmVnaXN0ZXIgY3J5cHRvIGFsZ29yaXRobXMgd2l0aCBrZXJuZWwgZnJhbWV3b3JrLgorICovCitzdGF0aWMgaW50IGNoY3JfcmVnaXN0ZXJfYWxnKHZvaWQpCit7CisJc3RydWN0IGNyeXB0b19hbGcgYWk7CisJc3RydWN0IGFoYXNoX2FsZyAqYV9oYXNoOworCWludCBlcnIgPSAwLCBpOworCWNoYXIgKm5hbWUgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZHJpdmVyX2FsZ3MpOyBpKyspIHsKKwkJaWYgKGRyaXZlcl9hbGdzW2ldLmlzX3JlZ2lzdGVyZWQpCisJCQljb250aW51ZTsKKwkJc3dpdGNoIChkcml2ZXJfYWxnc1tpXS50eXBlICYgQ1JZUFRPX0FMR19UWVBFX01BU0spIHsKKwkJY2FzZSBDUllQVE9fQUxHX1RZUEVfQUJMS0NJUEhFUjoKKwkJCWVyciA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJmRyaXZlcl9hbGdzW2ldLmFsZy5jcnlwdG8pOworCQkJbmFtZSA9IGRyaXZlcl9hbGdzW2ldLmFsZy5jcnlwdG8uY3JhX2RyaXZlcl9uYW1lOworCQkJYnJlYWs7CisJCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0FIQVNIOgorCQkJYV9oYXNoID0gJmRyaXZlcl9hbGdzW2ldLmFsZy5oYXNoOworCQkJYV9oYXNoLT51cGRhdGUgPSBjaGNyX2FoYXNoX3VwZGF0ZTsKKwkJCWFfaGFzaC0+ZmluYWwgPSBjaGNyX2FoYXNoX2ZpbmFsOworCQkJYV9oYXNoLT5maW51cCA9IGNoY3JfYWhhc2hfZmludXA7CisJCQlhX2hhc2gtPmRpZ2VzdCA9IGNoY3JfYWhhc2hfZGlnZXN0OworCQkJYV9oYXNoLT5leHBvcnQgPSBjaGNyX2FoYXNoX2V4cG9ydDsKKwkJCWFfaGFzaC0+aW1wb3J0ID0gY2hjcl9haGFzaF9pbXBvcnQ7CisJCQlhX2hhc2gtPmhhbGcuc3RhdGVzaXplID0gU1pfQUhBU0hfUkVRX0NUWDsKKwkJCWFfaGFzaC0+aGFsZy5iYXNlLmNyYV9wcmlvcml0eSA9IENIQ1JfQ1JBX1BSSU9SSVRZOworCQkJYV9oYXNoLT5oYWxnLmJhc2UuY3JhX21vZHVsZSA9IFRISVNfTU9EVUxFOworCQkJYV9oYXNoLT5oYWxnLmJhc2UuY3JhX2ZsYWdzID0gQUhBU0hfQ1JBX0ZMQUdTOworCQkJYV9oYXNoLT5oYWxnLmJhc2UuY3JhX2FsaWdubWFzayA9IDA7CisJCQlhX2hhc2gtPmhhbGcuYmFzZS5jcmFfZXhpdCA9IE5VTEw7CisJCQlhX2hhc2gtPmhhbGcuYmFzZS5jcmFfdHlwZSA9ICZjcnlwdG9fYWhhc2hfdHlwZTsKKworCQkJaWYgKGRyaXZlcl9hbGdzW2ldLnR5cGUgPT0gQ1JZUFRPX0FMR19UWVBFX0hNQUMpIHsKKwkJCQlhX2hhc2gtPmhhbGcuYmFzZS5jcmFfaW5pdCA9IGNoY3JfaG1hY19jcmFfaW5pdDsKKwkJCQlhX2hhc2gtPmhhbGcuYmFzZS5jcmFfZXhpdCA9IGNoY3JfaG1hY19jcmFfZXhpdDsKKwkJCQlhX2hhc2gtPmluaXQgPSBjaGNyX2htYWNfaW5pdDsKKwkJCQlhX2hhc2gtPnNldGtleSA9IGNoY3JfYWhhc2hfc2V0a2V5OworCQkJCWFfaGFzaC0+aGFsZy5iYXNlLmNyYV9jdHhzaXplID0gU1pfQUhBU0hfSF9DVFg7CisJCQl9IGVsc2UgeworCQkJCWFfaGFzaC0+aW5pdCA9IGNoY3Jfc2hhX2luaXQ7CisJCQkJYV9oYXNoLT5oYWxnLmJhc2UuY3JhX2N0eHNpemUgPSBTWl9BSEFTSF9DVFg7CisJCQkJYV9oYXNoLT5oYWxnLmJhc2UuY3JhX2luaXQgPSBjaGNyX3NoYV9jcmFfaW5pdDsKKwkJCX0KKwkJCWVyciA9IGNyeXB0b19yZWdpc3Rlcl9haGFzaCgmZHJpdmVyX2FsZ3NbaV0uYWxnLmhhc2gpOworCQkJYWkgPSBkcml2ZXJfYWxnc1tpXS5hbGcuaGFzaC5oYWxnLmJhc2U7CisJCQluYW1lID0gYWkuY3JhX2RyaXZlcl9uYW1lOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGVycikgeworCQkJcHJfZXJyKCJjaGNyIDogJXMgOiBBbGdvcml0aG0gcmVnaXN0cmF0aW9uIGZhaWxlZFxuIiwKKwkJCSAgICAgICBuYW1lKTsKKwkJCWdvdG8gcmVnaXN0ZXJfZXJyOworCQl9IGVsc2UgeworCQkJZHJpdmVyX2FsZ3NbaV0uaXNfcmVnaXN0ZXJlZCA9IDE7CisJCX0KKwl9CisJcmV0dXJuIDA7CisKK3JlZ2lzdGVyX2VycjoKKwljaGNyX3VucmVnaXN0ZXJfYWxnKCk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqCXN0YXJ0X2NyeXB0byAtIFJlZ2lzdGVyIHRoZSBjcnlwdG8gYWxnb3JpdGhtcy4KKyAqCVRoaXMgc2hvdWxkIGNhbGxlZCBvbmNlIHdoZW4gdGhlIGZpcnN0IGRldmljZSBjb21lc3VwLiBBZnRlciB0aGlzCisgKglrZXJuZWwgd2lsbCBzdGFydCBjYWxsaW5nIGRyaXZlciBBUElzIGZvciBjcnlwdG8gb3BlcmF0aW9ucy4KKyAqLworaW50IHN0YXJ0X2NyeXB0byh2b2lkKQoreworCXJldHVybiBjaGNyX3JlZ2lzdGVyX2FsZygpOworfQorCisvKgorICoJc3RvcF9jcnlwdG8gLSBEZXJlZ2lzdGVyIGFsbCB0aGUgY3J5cHRvIGFsZ29yaXRobXMgd2l0aCBrZXJuZWwuCisgKglUaGlzIHNob3VsZCBiZSBjYWxsZWQgb25jZSB3aGVuIHRoZSBsYXN0IGRldmljZSBnb2VzIGRvd24uIEFmdGVyIHRoaXMKKyAqCWtlcm5lbCB3aWxsIG5vdCBjYWxsIHRoZSBkcml2ZXIgQVBJIGZvciBjcnlwdG8gb3BlcmF0aW9ucy4KKyAqLworaW50IHN0b3BfY3J5cHRvKHZvaWQpCit7CisJY2hjcl91bnJlZ2lzdGVyX2FsZygpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vY2hlbHNpby9jaGNyX2FsZ28uaCBiL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vY2hjcl9hbGdvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM2NGZiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vY2hjcl9hbGdvLmgKQEAgLTAsMCArMSw0NzEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQ2hlbHNpbyBUNiBDcnlwdG8gZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNiBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX0NIQ1JfQUxHT19IX18KKyNkZWZpbmUgX19DSENSX0FMR09fSF9fCisKKy8qIENyeXB0byBrZXkgY29udGV4dCAqLworI2RlZmluZSBLRVlfQ09OVEVYVF9DVFhfTEVOX1MgICAgICAgICAgIDI0CisjZGVmaW5lIEtFWV9DT05URVhUX0NUWF9MRU5fTSAgICAgICAgICAgMHhmZgorI2RlZmluZSBLRVlfQ09OVEVYVF9DVFhfTEVOX1YoeCkgICAgICAgICgoeCkgPDwgS0VZX0NPTlRFWFRfQ1RYX0xFTl9TKQorI2RlZmluZSBLRVlfQ09OVEVYVF9DVFhfTEVOX0coeCkgXAorCSgoKHgpID4+IEtFWV9DT05URVhUX0NUWF9MRU5fUykgJiBLRVlfQ09OVEVYVF9DVFhfTEVOX00pCisKKyNkZWZpbmUgS0VZX0NPTlRFWFRfRFVBTF9DS19TICAgICAgMTIKKyNkZWZpbmUgS0VZX0NPTlRFWFRfRFVBTF9DS19NICAgICAgMHgxCisjZGVmaW5lIEtFWV9DT05URVhUX0RVQUxfQ0tfVih4KSAgICgoeCkgPDwgS0VZX0NPTlRFWFRfRFVBTF9DS19TKQorI2RlZmluZSBLRVlfQ09OVEVYVF9EVUFMX0NLX0coeCkgICBcCisoKCh4KSA+PiBLRVlfQ09OVEVYVF9EVUFMX0NLX1MpICYgS0VZX0NPTlRFWFRfRFVBTF9DS19NKQorI2RlZmluZSBLRVlfQ09OVEVYVF9EVUFMX0NLX0YgICAgICBLRVlfQ09OVEVYVF9EVUFMX0NLX1YoMVUpCisKKyNkZWZpbmUgS0VZX0NPTlRFWFRfU0FMVF9QUkVTRU5UX1MgICAgICAxMAorI2RlZmluZSBLRVlfQ09OVEVYVF9TQUxUX1BSRVNFTlRfTSAgICAgIDB4MQorI2RlZmluZSBLRVlfQ09OVEVYVF9TQUxUX1BSRVNFTlRfVih4KSAgICgoeCkgPDwgS0VZX0NPTlRFWFRfU0FMVF9QUkVTRU5UX1MpCisjZGVmaW5lIEtFWV9DT05URVhUX1NBTFRfUFJFU0VOVF9HKHgpICAgXAorCSgoKHgpID4+IEtFWV9DT05URVhUX1NBTFRfUFJFU0VOVF9TKSAmIFwKKwkgS0VZX0NPTlRFWFRfU0FMVF9QUkVTRU5UX00pCisjZGVmaW5lIEtFWV9DT05URVhUX1NBTFRfUFJFU0VOVF9GICAgICAgS0VZX0NPTlRFWFRfU0FMVF9QUkVTRU5UX1YoMVUpCisKKyNkZWZpbmUgS0VZX0NPTlRFWFRfVkFMSURfUyAgICAgMAorI2RlZmluZSBLRVlfQ09OVEVYVF9WQUxJRF9NICAgICAweDEKKyNkZWZpbmUgS0VZX0NPTlRFWFRfVkFMSURfVih4KSAgKCh4KSA8PCBLRVlfQ09OVEVYVF9WQUxJRF9TKQorI2RlZmluZSBLRVlfQ09OVEVYVF9WQUxJRF9HKHgpICBcCisJKCgoeCkgPj4gS0VZX0NPTlRFWFRfVkFMSURfUykgJiBcCisJIEtFWV9DT05URVhUX1ZBTElEX00pCisjZGVmaW5lIEtFWV9DT05URVhUX1ZBTElEX0YgICAgIEtFWV9DT05URVhUX1ZBTElEX1YoMVUpCisKKyNkZWZpbmUgS0VZX0NPTlRFWFRfQ0tfU0laRV9TICAgICAgICAgICA2CisjZGVmaW5lIEtFWV9DT05URVhUX0NLX1NJWkVfTSAgICAgICAgICAgMHhmCisjZGVmaW5lIEtFWV9DT05URVhUX0NLX1NJWkVfVih4KSAgICAgICAgKCh4KSA8PCBLRVlfQ09OVEVYVF9DS19TSVpFX1MpCisjZGVmaW5lIEtFWV9DT05URVhUX0NLX1NJWkVfRyh4KSAgICAgICAgXAorCSgoKHgpID4+IEtFWV9DT05URVhUX0NLX1NJWkVfUykgJiBLRVlfQ09OVEVYVF9DS19TSVpFX00pCisKKyNkZWZpbmUgS0VZX0NPTlRFWFRfTUtfU0laRV9TICAgICAgICAgICAyCisjZGVmaW5lIEtFWV9DT05URVhUX01LX1NJWkVfTSAgICAgICAgICAgMHhmCisjZGVmaW5lIEtFWV9DT05URVhUX01LX1NJWkVfVih4KSAgICAgICAgKCh4KSA8PCBLRVlfQ09OVEVYVF9NS19TSVpFX1MpCisjZGVmaW5lIEtFWV9DT05URVhUX01LX1NJWkVfRyh4KSAgICAgICAgXAorCSgoKHgpID4+IEtFWV9DT05URVhUX01LX1NJWkVfUykgJiBLRVlfQ09OVEVYVF9NS19TSVpFX00pCisKKyNkZWZpbmUgS0VZX0NPTlRFWFRfT1BBRF9QUkVTRU5UX1MgICAgICAxMQorI2RlZmluZSBLRVlfQ09OVEVYVF9PUEFEX1BSRVNFTlRfTSAgICAgIDB4MQorI2RlZmluZSBLRVlfQ09OVEVYVF9PUEFEX1BSRVNFTlRfVih4KSAgICgoeCkgPDwgS0VZX0NPTlRFWFRfT1BBRF9QUkVTRU5UX1MpCisjZGVmaW5lIEtFWV9DT05URVhUX09QQURfUFJFU0VOVF9HKHgpICAgXAorCSgoKHgpID4+IEtFWV9DT05URVhUX09QQURfUFJFU0VOVF9TKSAmIFwKKwkgS0VZX0NPTlRFWFRfT1BBRF9QUkVTRU5UX00pCisjZGVmaW5lIEtFWV9DT05URVhUX09QQURfUFJFU0VOVF9GICAgICAgS0VZX0NPTlRFWFRfT1BBRF9QUkVTRU5UX1YoMVUpCisKKyNkZWZpbmUgQ0hDUl9IQVNIX01BWF9ESUdFU1RfU0laRSA2NAorI2RlZmluZSBDSENSX01BWF9TSEFfRElHRVNUX1NJWkUgNjQKKworI2RlZmluZSBJUFNFQ19UUlVOQ0FURURfSUNWX1NJWkUgMTIKKyNkZWZpbmUgVExTX1RSVU5DQVRFRF9ITUFDX1NJWkUgMTAKKyNkZWZpbmUgQ0JDTUFDX0RJR0VTVF9TSVpFIDE2CisjZGVmaW5lIE1BWF9IQVNIX05BTUUgMjAKKworI2RlZmluZSBTSEExX0lOSVRfU1RBVEVfNVg0QiAgICA1CisjZGVmaW5lIFNIQTI1Nl9JTklUX1NUQVRFXzhYNEIgIDgKKyNkZWZpbmUgU0hBNTEyX0lOSVRfU1RBVEVfOFg4QiAgOAorI2RlZmluZSBTSEExX0lOSVRfU1RBVEUgICAgICAgICBTSEExX0lOSVRfU1RBVEVfNVg0QgorI2RlZmluZSBTSEEyMjRfSU5JVF9TVEFURSAgICAgICBTSEEyNTZfSU5JVF9TVEFURV84WDRCCisjZGVmaW5lIFNIQTI1Nl9JTklUX1NUQVRFICAgICAgIFNIQTI1Nl9JTklUX1NUQVRFXzhYNEIKKyNkZWZpbmUgU0hBMzg0X0lOSVRfU1RBVEUgICAgICAgU0hBNTEyX0lOSVRfU1RBVEVfOFg4QgorI2RlZmluZSBTSEE1MTJfSU5JVF9TVEFURSAgICAgICBTSEE1MTJfSU5JVF9TVEFURV84WDhCCisKKyNkZWZpbmUgRFVNTVlfQllURVMgMTYKKworI2RlZmluZSBJUEFEX0RBVEEgMHgzNjM2MzYzNgorI2RlZmluZSBPUEFEX0RBVEEgMHg1YzVjNWM1YworCisjZGVmaW5lIFRSQU5TSERSX1NJWkUoYWxpZ25lZGtjdHhfbGVuKVwKKwkoc2l6ZW9mKHN0cnVjdCB1bHB0eF9pZGF0YSkgK1wKKwkgc2l6ZW9mKHN0cnVjdCB1bHBfdHhwa3QpICtcCisJIHNpemVvZihzdHJ1Y3QgZndfY3J5cHRvX2xvb2thc2lkZV93cikgK1wKKwkgc2l6ZW9mKHN0cnVjdCBjcGxfdHhfc2VjX3BkdSkgK1wKKwkgKGFsaWduZWRrY3R4X2xlbikpCisjZGVmaW5lIENJUEhFUl9UUkFOU0hEUl9TSVpFKGFsaWduZWRrY3R4X2xlbiwgc2dlX3BhaXJzKSBcCisJKFRSQU5TSERSX1NJWkUoYWxpZ25lZGtjdHhfbGVuKSArIHNnZV9wYWlycyArXAorCSBzaXplb2Yoc3RydWN0IGNwbF9yeF9waHlzX2RzZ2wpKQorI2RlZmluZSBIQVNIX1RSQU5TSERSX1NJWkUoYWxpZ25lZGtjdHhfbGVuKVwKKwkoVFJBTlNIRFJfU0laRShhbGlnbmVka2N0eF9sZW4pICsgRFVNTVlfQllURVMpCisKKyNkZWZpbmUgU0VDX0NQTF9PRkZTRVQgKHNpemVvZihzdHJ1Y3QgZndfY3J5cHRvX2xvb2thc2lkZV93cikgKyBcCisJCQlzaXplb2Yoc3RydWN0IHVscF90eHBrdCkgKyBcCisJCQlzaXplb2Yoc3RydWN0IHVscHR4X2lkYXRhKSkKKworI2RlZmluZSBGSUxMX1NFQ19DUExfT1BfSVZJTlNSKGlkLCBsZW4sIGhsZHIsIG9mc3QpICAgICAgXAorCWh0b25sKCBcCisJICAgICAgIENQTF9UWF9TRUNfUERVX09QQ09ERV9WKENQTF9UWF9TRUNfUERVKSB8IFwKKwkgICAgICAgQ1BMX1RYX1NFQ19QRFVfUlhDSElEX1YoKGlkKSkgfCBcCisJICAgICAgIENQTF9UWF9TRUNfUERVX0FDS0ZPTExPV1NfVigwKSB8IFwKKwkgICAgICAgQ1BMX1RYX1NFQ19QRFVfVUxQVFhMUEJLX1YoMSkgfCBcCisJICAgICAgIENQTF9UWF9TRUNfUERVX0NQTExFTl9WKChsZW4pKSB8IFwKKwkgICAgICAgQ1BMX1RYX1NFQ19QRFVfUExBQ0VIT0xERVJfVigoaGxkcikpIHwgXAorCSAgICAgICBDUExfVFhfU0VDX1BEVV9JVklOU1JUT0ZTVF9WKChvZnN0KSkpCisKKyNkZWZpbmUgIEZJTExfU0VDX0NQTF9DSVBIRVJTVE9QX0hJKGFfc3RhcnQsIGFfc3RvcCwgY19zdGFydCwgY19zdG9wX2hpKSBcCisJaHRvbmwoIFwKKwkgICAgICAgQ1BMX1RYX1NFQ19QRFVfQUFEU1RBUlRfVigoYV9zdGFydCkpIHwgXAorCSAgICAgICBDUExfVFhfU0VDX1BEVV9BQURTVE9QX1YoKGFfc3RvcCkpIHwgXAorCSAgICAgICBDUExfVFhfU0VDX1BEVV9DSVBIRVJTVEFSVF9WKChjX3N0YXJ0KSkgfCBcCisJICAgICAgIENQTF9UWF9TRUNfUERVX0NJUEhFUlNUT1BfSElfVigoY19zdG9wX2hpKSkpCisKKyNkZWZpbmUgIEZJTExfU0VDX0NQTF9BVVRISU5TRVJUKGNfc3RvcF9sbywgYV9zdGFydCwgYV9zdG9wLCBhX2luc3QpIFwKKwlodG9ubCggXAorCSAgICAgICBDUExfVFhfU0VDX1BEVV9DSVBIRVJTVE9QX0xPX1YoKGNfc3RvcF9sbykpIHwgXAorCQlDUExfVFhfU0VDX1BEVV9BVVRIU1RBUlRfVigoYV9zdGFydCkpIHwgXAorCQlDUExfVFhfU0VDX1BEVV9BVVRIU1RPUF9WKChhX3N0b3ApKSB8IFwKKwkJQ1BMX1RYX1NFQ19QRFVfQVVUSElOU0VSVF9WKChhX2luc3QpKSkKKworI2RlZmluZSAgRklMTF9TRUNfQ1BMX1NDTUQwX1NFUU5PKGN0cmwsIHNlcSwgY21vZGUsIGFtb2RlLCBvcGFkLCBzaXplLCBuaXZzKSAgXAorCQlodG9ubCggXAorCQlTQ01EX1NFUV9OT19DVFJMX1YoMCkgfCBcCisJCVNDTURfU1RBVFVTX1BSRVNFTlRfVigwKSB8IFwKKwkJU0NNRF9QUk9UT19WRVJTSU9OX1YoQ0hDUl9TQ01EX1BST1RPX1ZFUlNJT05fR0VORVJJQykgfCBcCisJCVNDTURfRU5DX0RFQ19DVFJMX1YoKGN0cmwpKSB8IFwKKwkJU0NNRF9DSVBIX0FVVEhfU0VRX0NUUkxfVigoc2VxKSkgfCBcCisJCVNDTURfQ0lQSF9NT0RFX1YoKGNtb2RlKSkgfCBcCisJCVNDTURfQVVUSF9NT0RFX1YoKGFtb2RlKSkgfCBcCisJCVNDTURfSE1BQ19DVFJMX1YoKG9wYWQpKSB8IFwKKwkJU0NNRF9JVl9TSVpFX1YoKHNpemUpKSB8IFwKKwkJU0NNRF9OVU1fSVZTX1YoKG5pdnMpKSkKKworI2RlZmluZSBGSUxMX1NFQ19DUExfSVZHRU5fSERSTEVOKGxhc3QsIG1vcmUsIGN0eF9pbiwgbWFjLCBpdmRyb3AsIGxlbikgaHRvbmwoIFwKKwkJU0NNRF9FTkJfREJHSURfVigwKSB8IFwKKwkJU0NNRF9JVl9HRU5fQ1RSTF9WKDApIHwgXAorCQlTQ01EX0xBU1RfRlJBR19WKChsYXN0KSkgfCBcCisJCVNDTURfTU9SRV9GUkFHU19WKChtb3JlKSkgfCBcCisJCVNDTURfVExTX0NPTVBQRFVfVigwKSB8IFwKKwkJU0NNRF9LRVlfQ1RYX0lOTElORV9WKChjdHhfaW4pKSB8IFwKKwkJU0NNRF9UTFNfRlJBR19FTkFCTEVfVigwKSB8IFwKKwkJU0NNRF9NQUNfT05MWV9WKChtYWMpKSB8ICBcCisJCVNDTURfQUFESVZEUk9QX1YoKGl2ZHJvcCkpIHwgXAorCQlTQ01EX0hEUl9MRU5fVigobGVuKSkpCisKKyNkZWZpbmUgIEZJTExfS0VZX0NUWF9IRFIoY2tfc2l6ZSwgbWtfc2l6ZSwgZF9jaywgb3BhZCwgY3R4X2xlbikgXAorCQlodG9ubChLRVlfQ09OVEVYVF9WQUxJRF9WKDEpIHwgXAorCQkgICAgICBLRVlfQ09OVEVYVF9DS19TSVpFX1YoKGNrX3NpemUpKSB8IFwKKwkJICAgICAgS0VZX0NPTlRFWFRfTUtfU0laRV9WKG1rX3NpemUpIHwgXAorCQkgICAgICBLRVlfQ09OVEVYVF9EVUFMX0NLX1YoKGRfY2spKSB8IFwKKwkJICAgICAgS0VZX0NPTlRFWFRfT1BBRF9QUkVTRU5UX1YoKG9wYWQpKSB8IFwKKwkJICAgICAgS0VZX0NPTlRFWFRfU0FMVF9QUkVTRU5UX1YoMSkgfCBcCisJCSAgICAgIEtFWV9DT05URVhUX0NUWF9MRU5fVigoY3R4X2xlbikpKQorCisjZGVmaW5lIEZJTExfV1JfT1BfQ0NUWF9TSVpFKGxlbiwgY3R4X2xlbikgXAorCQlodG9ubCggXAorCQkJRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9PUENPREVfViggXAorCQkJRldfQ1JZUFRPX0xPT0tBU0lERV9XUikgfCBcCisJCQlGV19DUllQVE9fTE9PS0FTSURFX1dSX0NPTVBMX1YoMCkgfCBcCisJCQlGV19DUllQVE9fTE9PS0FTSURFX1dSX0lNTV9MRU5fVigobGVuKSkgfCBcCisJCQlGV19DUllQVE9fTE9PS0FTSURFX1dSX0NDVFhfTE9DX1YoMSkgfCBcCisJCQlGV19DUllQVE9fTE9PS0FTSURFX1dSX0NDVFhfU0laRV9WKChjdHhfbGVuKSkpCisKKyNkZWZpbmUgRklMTF9XUl9SWF9RX0lEKGNpZCwgcWlkLCB3cl9pdikgXAorCQlodG9ubCggXAorCQkJRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9SWF9DSElEX1YoKGNpZCkpIHwgXAorCQkJRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9SWF9RX0lEX1YoKHFpZCkpIHwgXAorCQkJRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9MQ0JfVigwKSB8IFwKKwkJCUZXX0NSWVBUT19MT09LQVNJREVfV1JfSVZfVigod3JfaXYpKSkKKworI2RlZmluZSBGSUxMX1VMUFRYX0NNRF9ERVNUKGNpZCkgXAorCWh0b25sKFVMUFRYX0NNRF9WKFVMUF9UWF9QS1QpIHwgXAorCSAgICAgIFVMUF9UWFBLVF9ERVNUX1YoMCkgfCBcCisJICAgICAgVUxQX1RYUEtUX0RBVEFNT0RJRllfVigwKSB8IFwKKwkgICAgICBVTFBfVFhQS1RfQ0hBTk5FTElEX1YoKGNpZCkpIHwgXAorCSAgICAgIFVMUF9UWFBLVF9ST19WKDEpIHwgXAorCSAgICAgIFVMUF9UWFBLVF9GSURfVigwKSkKKworI2RlZmluZSBLRVlDVFhfQUxJR05fUEFEKGJzKSAoe3Vuc2lnbmVkIGludCBfYnMgPSAoYnMpO1wKKwkJCSAgICAgIF9icyA9PSBTSEExX0RJR0VTVF9TSVpFID8gMTIgOiAwOyB9KQorCisjZGVmaW5lIEZJTExfUExEX1NJWkVfSEFTSF9TSVpFKHBheWxvYWRfc2dsX2xlbiwgc2dsX2xlbmd0aHMsIHRvdGFsX2ZyYWdzKSBcCisJaHRvbmwoRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9QTERfU0laRV9WKHBheWxvYWRfc2dsX2xlbiA/IFwKKwkJCQkJCXNnbF9sZW5ndGhzW3RvdGFsX2ZyYWdzXSA6IDApIHxcCisJICAgICAgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9IQVNIX1NJWkVfVigwKSkKKworI2RlZmluZSBGSUxMX0xFTl9QS0QoY2FsY190eF9mbGl0c19vZmxkLCBza2IpIFwKKwlodG9ubChGV19DUllQVE9fTE9PS0FTSURFX1dSX0xFTjE2X1YoRElWX1JPVU5EX1VQKChcCisJCQkJCSAgIGNhbGNfdHhfZmxpdHNfb2ZsZChza2IpICogOCksIDE2KSkpCisKKyNkZWZpbmUgRklMTF9DTURfTU9SRShpbW1kYXRhbGVuKSBodG9ubChVTFBUWF9DTURfVihVTFBfVFhfU0NfSU1NKSB8XAorCQkJCQlVTFBfVFhfU0NfTU9SRV9WKChpbW1kYXRhbGVuKSA/IDAgOiAxKSkKKworI2RlZmluZSBNQVhfTksgOAorI2RlZmluZSBDUllQVE9fTUFYX0lNTV9UWF9QS1RfTEVOIDI1NgorCitzdHJ1Y3QgYWxnb19wYXJhbSB7CisJdW5zaWduZWQgaW50IGF1dGhfbW9kZTsKKwl1bnNpZ25lZCBpbnQgbWtfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgcmVzdWx0X3NpemU7Cit9OworCitzdHJ1Y3QgaGFzaF93cl9wYXJhbSB7CisJdW5zaWduZWQgaW50IG9wYWRfbmVlZGVkOworCXVuc2lnbmVkIGludCBtb3JlOworCXVuc2lnbmVkIGludCBsYXN0OworCXN0cnVjdCBhbGdvX3BhcmFtIGFsZ19wcm07CisJdW5zaWduZWQgaW50IHNnX2xlbjsKKwl1bnNpZ25lZCBpbnQgYmZyX2xlbjsKKwl1NjQgc2NtZDE7Cit9OworCitlbnVtIHsKKwlBRVNfS0VZTEVOR1RIXzEyOEJJVCA9IDEyOCwKKwlBRVNfS0VZTEVOR1RIXzE5MkJJVCA9IDE5MiwKKwlBRVNfS0VZTEVOR1RIXzI1NkJJVCA9IDI1NgorfTsKKworZW51bSB7CisJS0VZTEVOR1RIXzNCWVRFUyA9IDMsCisJS0VZTEVOR1RIXzRCWVRFUyA9IDQsCisJS0VZTEVOR1RIXzZCWVRFUyA9IDYsCisJS0VZTEVOR1RIXzhCWVRFUyA9IDgKK307CisKK2VudW0geworCU5VTUJFUl9PRl9ST1VORFNfMTAgPSAxMCwKKwlOVU1CRVJfT0ZfUk9VTkRTXzEyID0gMTIsCisJTlVNQkVSX09GX1JPVU5EU18xNCA9IDE0LAorfTsKKworLyoKKyAqIENDTSBkZWZpbmVzIHZhbHVlcyBvZiA0LCA2LCA4LCAxMCwgMTIsIDE0LCBhbmQgMTYgb2N0ZXRzLAorICogd2hlcmUgdGhleSBpbmRpY2F0ZSB0aGUgc2l6ZSBvZiB0aGUgaW50ZWdyaXR5IGNoZWNrIHZhbHVlIChJQ1YpCisgKi8KK2VudW0geworCUFFU19DQ01fSUNWXzQgICA9IDQsCisJQUVTX0NDTV9JQ1ZfNiAgID0gNiwKKwlBRVNfQ0NNX0lDVl84ICAgPSA4LAorCUFFU19DQ01fSUNWXzEwICA9IDEwLAorCUFFU19DQ01fSUNWXzEyICA9IDEyLAorCUFFU19DQ01fSUNWXzE0ICA9IDE0LAorCUFFU19DQ01fSUNWXzE2ID0gMTYKK307CisKK3N0cnVjdCBoYXNoX29wX3BhcmFtcyB7CisJdW5zaWduZWQgY2hhciBta19zaXplOworCXVuc2lnbmVkIGNoYXIgcGFkX2FsaWduOworCXVuc2lnbmVkIGNoYXIgYXV0aF9tb2RlOworCWNoYXIgaGFzaF9uYW1lW01BWF9IQVNIX05BTUVdOworCXVuc2lnbmVkIHNob3J0IGJsb2NrX3NpemU7CisJdW5zaWduZWQgc2hvcnQgd29yZF9zaXplOworCXVuc2lnbmVkIHNob3J0IGlwYWRfc2l6ZTsKK307CisKK3N0cnVjdCBwaHlzX3NnZV9wYWlycyB7CisJX19iZTE2IGxlbls4XTsKKwlfX2JlNjQgYWRkcls4XTsKK307CisKK3N0cnVjdCBwaHlzX3NnZV9wYXJtIHsKKwl1bnNpZ25lZCBpbnQgbmVudHM7CisJdW5zaWduZWQgaW50IG9ic2l6ZTsKKwl1bnNpZ25lZCBzaG9ydCBxaWQ7CisJdW5zaWduZWQgY2hhciBhbGlnbjsKK307CisKK3N0cnVjdCBjcnlwdG9fcmVzdWx0IHsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0aW9uOworCWludCBlcnI7Cit9OworCitzdGF0aWMgY29uc3QgdTMyIHNoYTFfaW5pdFtTSEExX0RJR0VTVF9TSVpFIC8gNF0gPSB7CisJCVNIQTFfSDAsIFNIQTFfSDEsIFNIQTFfSDIsIFNIQTFfSDMsIFNIQTFfSDQsCit9OworCitzdGF0aWMgY29uc3QgdTMyIHNoYTIyNF9pbml0W1NIQTI1Nl9ESUdFU1RfU0laRSAvIDRdID0geworCQlTSEEyMjRfSDAsIFNIQTIyNF9IMSwgU0hBMjI0X0gyLCBTSEEyMjRfSDMsCisJCVNIQTIyNF9INCwgU0hBMjI0X0g1LCBTSEEyMjRfSDYsIFNIQTIyNF9INywKK307CisKK3N0YXRpYyBjb25zdCB1MzIgc2hhMjU2X2luaXRbU0hBMjU2X0RJR0VTVF9TSVpFIC8gNF0gPSB7CisJCVNIQTI1Nl9IMCwgU0hBMjU2X0gxLCBTSEEyNTZfSDIsIFNIQTI1Nl9IMywKKwkJU0hBMjU2X0g0LCBTSEEyNTZfSDUsIFNIQTI1Nl9INiwgU0hBMjU2X0g3LAorfTsKKworc3RhdGljIGNvbnN0IHU2NCBzaGEzODRfaW5pdFtTSEE1MTJfRElHRVNUX1NJWkUgLyA4XSA9IHsKKwkJU0hBMzg0X0gwLCBTSEEzODRfSDEsIFNIQTM4NF9IMiwgU0hBMzg0X0gzLAorCQlTSEEzODRfSDQsIFNIQTM4NF9INSwgU0hBMzg0X0g2LCBTSEEzODRfSDcsCit9OworCitzdGF0aWMgY29uc3QgdTY0IHNoYTUxMl9pbml0W1NIQTUxMl9ESUdFU1RfU0laRSAvIDhdID0geworCQlTSEE1MTJfSDAsIFNIQTUxMl9IMSwgU0hBNTEyX0gyLCBTSEE1MTJfSDMsCisJCVNIQTUxMl9INCwgU0hBNTEyX0g1LCBTSEE1MTJfSDYsIFNIQTUxMl9INywKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X2hhc2hfaW5pdF92YWx1ZXMoY2hhciAqa2V5LCBpbnQgZGlnZXN0c2l6ZSkKK3sKKwl1OCBpOworCV9fYmUzMiAqZGtleSA9IChfX2JlMzIgKilrZXk7CisJdTY0ICpsZGtleSA9ICh1NjQgKilrZXk7CisJX19iZTY0ICpzaGEzODQgPSAoX19iZTY0ICopc2hhMzg0X2luaXQ7CisJX19iZTY0ICpzaGE1MTIgPSAoX19iZTY0ICopc2hhNTEyX2luaXQ7CisKKwlzd2l0Y2ggKGRpZ2VzdHNpemUpIHsKKwljYXNlIFNIQTFfRElHRVNUX1NJWkU6CisJCWZvciAoaSA9IDA7IGkgPCBTSEExX0lOSVRfU1RBVEU7IGkrKykKKwkJCWRrZXlbaV0gPSBjcHVfdG9fYmUzMihzaGExX2luaXRbaV0pOworCQlicmVhazsKKwljYXNlIFNIQTIyNF9ESUdFU1RfU0laRToKKwkJZm9yIChpID0gMDsgaSA8IFNIQTIyNF9JTklUX1NUQVRFOyBpKyspCisJCQlka2V5W2ldID0gY3B1X3RvX2JlMzIoc2hhMjI0X2luaXRbaV0pOworCQlicmVhazsKKwljYXNlIFNIQTI1Nl9ESUdFU1RfU0laRToKKwkJZm9yIChpID0gMDsgaSA8IFNIQTI1Nl9JTklUX1NUQVRFOyBpKyspCisJCQlka2V5W2ldID0gY3B1X3RvX2JlMzIoc2hhMjU2X2luaXRbaV0pOworCQlicmVhazsKKwljYXNlIFNIQTM4NF9ESUdFU1RfU0laRToKKwkJZm9yIChpID0gMDsgaSA8IFNIQTM4NF9JTklUX1NUQVRFOyBpKyspCisJCQlsZGtleVtpXSA9IGJlNjRfdG9fY3B1KHNoYTM4NFtpXSk7CisJCWJyZWFrOworCWNhc2UgU0hBNTEyX0RJR0VTVF9TSVpFOgorCQlmb3IgKGkgPSAwOyBpIDwgU0hBNTEyX0lOSVRfU1RBVEU7IGkrKykKKwkJCWxka2V5W2ldID0gYmU2NF90b19jcHUoc2hhNTEyW2ldKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgY29uc3QgdTggc2dsX2xlbmd0aHNbMjBdID0geworCTAsIDEsIDIsIDMsIDQsIDQsIDUsIDYsIDcsIDcsIDgsIDksIDEwLCAxMCwgMTEsIDEyLCAxMywgMTMsIDE0LCAxNQorfTsKKworLyogTnVtYmVyIG9mIGxlbiBmaWVsZHMoOCkgKiBzaXplIG9mIG9uZSBhZGRyIGZpZWxkICovCisjZGVmaW5lIFBIWVNEU0dMX01BWF9MRU5fU0laRSAxNgorCitzdGF0aWMgaW5saW5lIHUxNiBnZXRfc3BhY2VfZm9yX3BoeXNfZHNnbCh1bnNpZ25lZCBpbnQgc2dsX2VudHIpCit7CisJLyogbGVuIGZpZWxkIHNpemUgKyBhZGRyIGZpZWxkIHNpemUgKi8KKwlyZXR1cm4gKChzZ2xfZW50ciA+PiAzKSArICgoc2dsX2VudHIgJSA4KSA/CisJCQkJICAgMSA6IDApKSAqIFBIWVNEU0dMX01BWF9MRU5fU0laRSArCisJCShzZ2xfZW50ciA8PCAzKSArICgoc2dsX2VudHIgJSAyID8gMSA6IDApIDw8IDMpOworfQorCisvKiBUaGUgQUVTIHMtdHJhbnNmb3JtIG1hdHJpeCAocy1ib3gpLiAqLworc3RhdGljIGNvbnN0IHU4IGFlc19zYm94WzI1Nl0gPSB7CisJOTksICAxMjQsIDExOSwgMTIzLCAyNDIsIDEwNywgMTExLCAxOTcsIDQ4LCAgMSwgICAxMDMsIDQzLCAgMjU0LCAyMTUsCisJMTcxLCAxMTgsIDIwMiwgMTMwLCAyMDEsIDEyNSwgMjUwLCA4OSwgIDcxLCAgMjQwLCAxNzMsIDIxMiwgMTYyLCAxNzUsCisJMTU2LCAxNjQsIDExNCwgMTkyLCAxODMsIDI1MywgMTQ3LCAzOCwgIDU0LCAgNjMsICAyNDcsIDIwNCwgNTIsICAxNjUsCisJMjI5LCAyNDEsIDExMywgMjE2LCA0OSwgIDIxLCA0LCAgIDE5OSwgMzUsICAxOTUsIDI0LCAgMTUwLCA1LCAxNTQsIDcsCisJMTgsICAxMjgsIDIyNiwgMjM1LCAzOSwgIDE3OCwgMTE3LCA5LCAgIDEzMSwgNDQsICAyNiwgIDI3LCAgMTEwLCA5MCwKKwkxNjAsIDgyLCAgNTksICAyMTQsIDE3OSwgNDEsICAyMjcsIDQ3LCAgMTMyLCA4MywgIDIwOSwgMCwgICAyMzcsIDMyLAorCTI1MiwgMTc3LCA5MSwgIDEwNiwgMjAzLCAxOTAsIDU3LCAgNzQsICA3NiwgIDg4LCAgMjA3LCAyMDgsIDIzOSwgMTcwLAorCTI1MSwgNjcsICA3NywgIDUxLCAgMTMzLCA2OSwgIDI0OSwgMiwgICAxMjcsIDgwLCAgNjAsICAxNTksIDE2OCwgODEsCisJMTYzLCA2NCwgIDE0MywgMTQ2LCAxNTcsIDU2LCAgMjQ1LCAxODgsIDE4MiwgMjE4LCAzMywgIDE2LCAgMjU1LCAyNDMsCisJMjEwLCAyMDUsIDEyLCAgMTksICAyMzYsIDk1LCAgMTUxLCA2OCwgIDIzLCAgMTk2LCAxNjcsIDEyNiwgNjEsICAxMDAsCisJOTMsICAyNSwgIDExNSwgOTYsICAxMjksIDc5LCAgMjIwLCAzNCwgIDQyLCAgMTQ0LCAxMzYsIDcwLCAgMjM4LCAxODQsCisJMjAsICAyMjIsIDk0LCAgMTEsICAyMTksIDIyNCwgNTAsICA1OCwgIDEwLCAgNzMsICA2LCAgIDM2LCAgOTIsICAxOTQsCisJMjExLCAxNzIsIDk4LCAgMTQ1LCAxNDksIDIyOCwgMTIxLCAyMzEsIDIwMCwgNTUsICAxMDksIDE0MSwgMjEzLCA3OCwKKwkxNjksIDEwOCwgODYsICAyNDQsIDIzNCwgMTAxLCAxMjIsIDE3NCwgOCwgMTg2LCAxMjAsIDM3LCAgNDYsICAyOCwgMTY2LAorCTE4MCwgMTk4LCAyMzIsIDIyMSwgMTE2LCAzMSwgIDc1LCAgMTg5LCAxMzksIDEzOCwgMTEyLCA2MiwgIDE4MSwgMTAyLAorCTcyLCAgMywgICAyNDYsIDE0LCAgOTcsICA1MywgIDg3LCAgMTg1LCAxMzQsIDE5MywgMjksICAxNTgsIDIyNSwgMjQ4LAorCTE1MiwgMTcsICAxMDUsIDIxNywgMTQyLCAxNDgsIDE1NSwgMzAsICAxMzUsIDIzMywgMjA2LCA4NSwgIDQwLCAgMjIzLAorCTE0MCwgMTYxLCAxMzcsIDEzLCAgMTkxLCAyMzAsIDY2LCAgMTA0LCA2NSwgIDE1MywgNDUsICAxNSwgIDE3NiwgODQsCisJMTg3LCAyMgorfTsKKworc3RhdGljIHUzMiBhZXNfa3Nfc3Vid29yZChjb25zdCB1MzIgdykKK3sKKwl1OCBieXRlc1s0XTsKKworCSoodTMyICopKCZieXRlc1swXSkgPSB3OworCWJ5dGVzWzBdID0gYWVzX3Nib3hbYnl0ZXNbMF1dOworCWJ5dGVzWzFdID0gYWVzX3Nib3hbYnl0ZXNbMV1dOworCWJ5dGVzWzJdID0gYWVzX3Nib3hbYnl0ZXNbMl1dOworCWJ5dGVzWzNdID0gYWVzX3Nib3hbYnl0ZXNbM11dOworCXJldHVybiAqKHUzMiAqKSgmYnl0ZXNbMF0pOworfQorCitzdGF0aWMgdTMyIHJvdW5kX2NvbnN0YW50WzExXSA9IHsKKwkweDAxMDAwMDAwLCAweDAyMDAwMDAwLCAweDA0MDAwMDAwLCAweDA4MDAwMDAwLAorCTB4MTAwMDAwMDAsIDB4MjAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4ODAwMDAwMDAsCisJMHgxQjAwMDAwMCwgMHgzNjAwMDAwMCwgMHg2QzAwMDAwMAorfTsKKworLyogZGVjX2tleSAtIE9VVFBVVCAtIFJldmVyc2Ugcm91bmQga2V5CisgKiBrZXkgLSBJTlBVVCAtIGtleQorICoga2V5bGVuZ3RoIC0gSU5QVVQgLSBsZW5ndGggb2YgdGhlIGtleSBpbiBudW1iZXIgb2YgYml0cworICovCitzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X2Flc19kZWNyeXB0X2tleSh1bnNpZ25lZCBjaGFyICpkZWNfa2V5LAorCQkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBrZXlsZW5ndGgpCit7CisJdTMyIHRlbXA7CisJdTMyIHdfcmluZ1tNQVhfTktdOworCWludCBpLCBqLCBrID0gMDsKKwl1OCAgbnIsIG5rOworCisJc3dpdGNoIChrZXlsZW5ndGgpIHsKKwljYXNlIEFFU19LRVlMRU5HVEhfMTI4QklUOgorCQluayA9IEtFWUxFTkdUSF80QllURVM7CisJCW5yID0gTlVNQkVSX09GX1JPVU5EU18xMDsKKwkJYnJlYWs7CisKKwljYXNlIEFFU19LRVlMRU5HVEhfMTkyQklUOgorCQluayA9IEtFWUxFTkdUSF82QllURVM7CisJCW5yID0gTlVNQkVSX09GX1JPVU5EU18xMjsKKwkJYnJlYWs7CisJY2FzZSBBRVNfS0VZTEVOR1RIXzI1NkJJVDoKKwkJbmsgPSBLRVlMRU5HVEhfOEJZVEVTOworCQluciA9IE5VTUJFUl9PRl9ST1VORFNfMTQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisJZm9yIChpID0gMDsgaSA8IG5rOyBpKysgKQorCQl3X3JpbmdbaV0gPSBiZTMyX3RvX2NwdSgqKHUzMiAqKSZrZXlbNCAqIGldKTsKKworCWkgPSAwOworCXRlbXAgPSB3X3JpbmdbbmsgLSAxXTsKKwl3aGlsZShpICsgbmsgPCAobnIgKyAxKSAqIDQpIHsKKwkJaWYoIShpICUgbmspKSB7CisJCQkvKiBSb3RXb3JkKHRlbXApICovCisJCQl0ZW1wID0gKHRlbXAgPDwgOCkgfCAodGVtcCA+PiAyNCk7CisJCQl0ZW1wID0gYWVzX2tzX3N1YndvcmQodGVtcCk7CisJCQl0ZW1wIF49IHJvdW5kX2NvbnN0YW50W2kgLyBua107CisJCX0KKwkJZWxzZSBpZiAobmsgPT0gOCAmJiAoaSAlIDQgPT0gMCkpCisJCQl0ZW1wID0gYWVzX2tzX3N1YndvcmQodGVtcCk7CisJCXdfcmluZ1tpICUgbmtdIF49IHRlbXA7CisJCXRlbXAgPSB3X3JpbmdbaSAlIG5rXTsKKwkJaSsrOworCX0KKwlmb3IgKGsgPSAwLCBqID0gaSAlIG5rOyBrIDwgbms7IGsrKykgeworCQkqKCh1MzIgKilkZWNfa2V5ICsgaykgPSBodG9ubCh3X3Jpbmdbal0pOworCQlqLS07CisJCWlmKGogPCAwKQorCQkJaiArPSBuazsKKwl9Cit9CisKKyNlbmRpZiAvKiBfX0NIQ1JfQUxHT19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vY2hjcl9jb3JlLmMgYi9kcml2ZXJzL2NyeXB0by9jaGVsc2lvL2NoY3JfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNWY5YmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NyeXB0by9jaGVsc2lvL2NoY3JfY29yZS5jCkBAIC0wLDAgKzEsMjM4IEBACisvKioKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDaGVsc2lvIFQ0L1Q1L1Q2IEV0aGVybmV0IGRyaXZlciBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTYgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFdyaXR0ZW4gYW5kIE1haW50YWluZWQgYnk6CisgKiBNYW5vaiBNYWx2aXlhIChtYW5vam1hbHZpeWFAY2hlbHNpby5jb20pCisgKiBBdHVsIEd1cHRhIChhdHVsLmd1cHRhQGNoZWxzaW8uY29tKQorICogSml0ZW5kcmEgTHVsbGEgKGpsdWxsYUBjaGVsc2lvLmNvbSkKKyAqIFllc2hhc3dpIE0gUiBHb3dkYSAoeWVzaGFzd2lAY2hlbHNpby5jb20pCisgKiBIYXJzaCBKYWluIChoYXJzaEBjaGVsc2lvLmNvbSkKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKyNpbmNsdWRlIDxjcnlwdG8vYWVzLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2hhc2guaD4KKworI2luY2x1ZGUgInQ0X21zZy5oIgorI2luY2x1ZGUgImNoY3JfY29yZS5oIgorI2luY2x1ZGUgImN4Z2I0X3VsZC5oIgorCitzdGF0aWMgTElTVF9IRUFEKHVsZF9jdHhfbGlzdCk7CitzdGF0aWMgREVGSU5FX01VVEVYKGRldl9tdXRleCk7CitzdGF0aWMgYXRvbWljX3QgZGV2X2NvdW50OworCit0eXBlZGVmIGludCAoKmNoY3JfaGFuZGxlcl9mdW5jKShzdHJ1Y3QgY2hjcl9kZXYgKmRldiwgdW5zaWduZWQgY2hhciAqaW5wdXQpOworc3RhdGljIGludCBjcGxfZnc2X3BsZF9oYW5kbGVyKHN0cnVjdCBjaGNyX2RldiAqZGV2LCB1bnNpZ25lZCBjaGFyICppbnB1dCk7CitzdGF0aWMgdm9pZCAqY2hjcl91bGRfYWRkKGNvbnN0IHN0cnVjdCBjeGdiNF9sbGRfaW5mbyAqbGxkKTsKK3N0YXRpYyBpbnQgY2hjcl91bGRfc3RhdGVfY2hhbmdlKHZvaWQgKmhhbmRsZSwgZW51bSBjeGdiNF9zdGF0ZSBzdGF0ZSk7CisKK3N0YXRpYyBjaGNyX2hhbmRsZXJfZnVuYyB3b3JrX2hhbmRsZXJzW05VTV9DUExfQ01EU10gPSB7CisJW0NQTF9GVzZfUExEXSA9IGNwbF9mdzZfcGxkX2hhbmRsZXIsCit9OworCitzdGF0aWMgc3RydWN0IGN4Z2I0X3VsZF9pbmZvIGNoY3JfdWxkX2luZm8gPSB7CisJLm5hbWUgPSBEUlZfTU9EVUxFX05BTUUsCisJLm5yeHEgPSBNQVhfVUxEX1FTRVRTLAorCS5yeHFfc2l6ZSA9IDEwMjQsCisJLmFkZCA9IGNoY3JfdWxkX2FkZCwKKwkuc3RhdGVfY2hhbmdlID0gY2hjcl91bGRfc3RhdGVfY2hhbmdlLAorCS5yeF9oYW5kbGVyID0gY2hjcl91bGRfcnhfaGFuZGxlciwKK307CisKK2ludCBhc3NpZ25fY2hjcl9kZXZpY2Uoc3RydWN0IGNoY3JfZGV2ICoqZGV2KQoreworCXN0cnVjdCB1bGRfY3R4ICp1X2N0eDsKKworCS8qCisJICogV2hpY2ggZGV2aWNlIHRvIHVzZSBpZiBtdWx0aXBsZSBkZXZpY2VzIGFyZSBhdmFpbGFibGUgVE9ETworCSAqIE1heSBiZSBzZWxlY3QgdGhlIGRldmljZSBiYXNlZCBvbiByb3VuZCByb2Jpbi4gT25lIHNlc3Npb24KKwkgKiBtdXN0IGdvIHRvIHRoZSBzYW1lIGRldmljZSB0byBtYWludGFpbiB0aGUgb3JkZXJpbmcuCisJICovCisJbXV0ZXhfbG9jaygmZGV2X211dGV4KTsgLyogVE9ETyA/ICovCisJdV9jdHggPSBsaXN0X2ZpcnN0X2VudHJ5KCZ1bGRfY3R4X2xpc3QsIHN0cnVjdCB1bGRfY3R4LCBlbnRyeSk7CisJaWYgKCF1X2N0eCkgeworCQltdXRleF91bmxvY2soJmRldl9tdXRleCk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJKmRldiA9IHVfY3R4LT5kZXY7CisJbXV0ZXhfdW5sb2NrKCZkZXZfbXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoY3JfZGV2X2FkZChzdHJ1Y3QgdWxkX2N0eCAqdV9jdHgpCit7CisJc3RydWN0IGNoY3JfZGV2ICpkZXY7CisKKwlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5YSU87CisKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT5sb2NrX2NoY3JfZGV2KTsKKwl1X2N0eC0+ZGV2ID0gZGV2OworCWRldi0+dV9jdHggPSB1X2N0eDsKKwlhdG9taWNfaW5jKCZkZXZfY291bnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoY3JfZGV2X3JlbW92ZShzdHJ1Y3QgdWxkX2N0eCAqdV9jdHgpCit7CisJa2ZyZWUodV9jdHgtPmRldik7CisJdV9jdHgtPmRldiA9IE5VTEw7CisJYXRvbWljX2RlYygmZGV2X2NvdW50KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjcGxfZnc2X3BsZF9oYW5kbGVyKHN0cnVjdCBjaGNyX2RldiAqZGV2LAorCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmlucHV0KQoreworCXN0cnVjdCBjcnlwdG9fYXN5bmNfcmVxdWVzdCAqcmVxOworCXN0cnVjdCBjcGxfZnc2X3BsZCAqZnc2X3BsZDsKKwl1MzIgYWNrX2Vycl9zdGF0dXMgPSAwOworCWludCBlcnJvcl9zdGF0dXMgPSAwOworCisJZnc2X3BsZCA9IChzdHJ1Y3QgY3BsX2Z3Nl9wbGQgKilpbnB1dDsKKwlyZXEgPSAoc3RydWN0IGNyeXB0b19hc3luY19yZXF1ZXN0ICopKHVpbnRwdHJfdCliZTY0X3RvX2NwdSgKKwkJCQkJCSAgICBmdzZfcGxkLT5kYXRhWzFdKTsKKworCWFja19lcnJfc3RhdHVzID0KKwkJbnRvaGwoKihfX2JlMzIgKikoKHVuc2lnbmVkIGNoYXIgKikmZnc2X3BsZC0+ZGF0YVswXSArIDQpKTsKKwlpZiAoYWNrX2Vycl9zdGF0dXMpIHsKKwkJaWYgKENIS19NQUNfRVJSX0JJVChhY2tfZXJyX3N0YXR1cykgfHwKKwkJICAgIENIS19QQURfRVJSX0JJVChhY2tfZXJyX3N0YXR1cykpCisJCQllcnJvcl9zdGF0dXMgPSAtRUlOVkFMOworCX0KKwkvKiBjYWxsIGNvbXBsZXRpb24gY2FsbGJhY2sgd2l0aCBmYWlsdXJlIHN0YXR1cyAqLworCWlmIChyZXEpIHsKKwkJaWYgKCFjaGNyX2hhbmRsZV9yZXNwKHJlcSwgaW5wdXQsIGVycm9yX3N0YXR1cykpCisJCQlyZXEtPmNvbXBsZXRlKHJlcSwgZXJyb3Jfc3RhdHVzKTsKKwkJZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCJJbmNvcnJlY3QgcmVxdWVzdCBhZGRyZXNzIGZyb20gdGhlIGZpcm13YXJlXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiAwOworfQorCitpbnQgY2hjcl9zZW5kX3dyKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIGN4Z2I0X29mbGRfc2VuZChza2ItPmRldiwgc2tiKTsKK30KKworc3RhdGljIHZvaWQgKmNoY3JfdWxkX2FkZChjb25zdCBzdHJ1Y3QgY3hnYjRfbGxkX2luZm8gKmxsZCkKK3sKKwlzdHJ1Y3QgdWxkX2N0eCAqdV9jdHg7CisKKwkvKiBDcmVhdGUgdGhlIGRldmljZSBhbmQgYWRkIGl0IGluIHRoZSBkZXZpY2UgbGlzdCAqLworCXVfY3R4ID0ga3phbGxvYyhzaXplb2YoKnVfY3R4KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1X2N0eCkgeworCQl1X2N0eCA9IEVSUl9QVFIoLUVOT01FTSk7CisJCWdvdG8gb3V0OworCX0KKwl1X2N0eC0+bGxkaSA9ICpsbGQ7CisJbXV0ZXhfbG9jaygmZGV2X211dGV4KTsKKwlsaXN0X2FkZF90YWlsKCZ1X2N0eC0+ZW50cnksICZ1bGRfY3R4X2xpc3QpOworCW11dGV4X3VubG9jaygmZGV2X211dGV4KTsKK291dDoKKwlyZXR1cm4gdV9jdHg7Cit9CisKK2ludCBjaGNyX3VsZF9yeF9oYW5kbGVyKHZvaWQgKmhhbmRsZSwgY29uc3QgX19iZTY0ICpyc3AsCisJCQljb25zdCBzdHJ1Y3QgcGt0X2dsICpwZ2wpCit7CisJc3RydWN0IHVsZF9jdHggKnVfY3R4ID0gKHN0cnVjdCB1bGRfY3R4ICopaGFuZGxlOworCXN0cnVjdCBjaGNyX2RldiAqZGV2ID0gdV9jdHgtPmRldjsKKwljb25zdCBzdHJ1Y3QgY3BsX2FjdF9lc3RhYmxpc2ggKnJwbCA9IChzdHJ1Y3QgY3BsX2FjdF9lc3RhYmxpc2gKKwkJCQkJICAgICAgICopcnNwOworCisJaWYgKHJwbC0+b3Qub3Bjb2RlICE9IENQTF9GVzZfUExEKSB7CisJCXByX2VycigiVW5zdXBwb3J0ZWQgb3Bjb2RlXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFwZ2wpCisJCXdvcmtfaGFuZGxlcnNbcnBsLT5vdC5vcGNvZGVdKGRldiwgKHVuc2lnbmVkIGNoYXIgKikmcnNwWzFdKTsKKwllbHNlCisJCXdvcmtfaGFuZGxlcnNbcnBsLT5vdC5vcGNvZGVdKGRldiwgcGdsLT52YSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hjcl91bGRfc3RhdGVfY2hhbmdlKHZvaWQgKmhhbmRsZSwgZW51bSBjeGdiNF9zdGF0ZSBzdGF0ZSkKK3sKKwlzdHJ1Y3QgdWxkX2N0eCAqdV9jdHggPSBoYW5kbGU7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBDWEdCNF9TVEFURV9VUDoKKwkJaWYgKCF1X2N0eC0+ZGV2KSB7CisJCQlyZXQgPSBjaGNyX2Rldl9hZGQodV9jdHgpOworCQkJaWYgKHJldCAhPSAwKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJaWYgKGF0b21pY19yZWFkKCZkZXZfY291bnQpID09IDEpCisJCQlyZXQgPSBzdGFydF9jcnlwdG8oKTsKKwkJYnJlYWs7CisKKwljYXNlIENYR0I0X1NUQVRFX0RFVEFDSDoKKwkJaWYgKHVfY3R4LT5kZXYpIHsKKwkJCW11dGV4X2xvY2soJmRldl9tdXRleCk7CisJCQljaGNyX2Rldl9yZW1vdmUodV9jdHgpOworCQkJbXV0ZXhfdW5sb2NrKCZkZXZfbXV0ZXgpOworCQl9CisJCWlmICghYXRvbWljX3JlYWQoJmRldl9jb3VudCkpCisJCQlzdG9wX2NyeXB0bygpOworCQlicmVhazsKKworCWNhc2UgQ1hHQjRfU1RBVEVfU1RBUlRfUkVDT1ZFUlk6CisJY2FzZSBDWEdCNF9TVEFURV9ET1dOOgorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBjaGNyX2NyeXB0b19pbml0KHZvaWQpCit7CisJaWYgKGN4Z2I0X3JlZ2lzdGVyX3VsZChDWEdCNF9VTERfQ1JZUFRPLCAmY2hjcl91bGRfaW5mbykpIHsKKwkJcHJfZXJyKCJVTEQgcmVnaXN0ZXIgZmFpbDogTm8gY2hjciBjcnlwdG8gc3VwcG9ydCBpbiBjeGdiNCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjaGNyX2NyeXB0b19leGl0KHZvaWQpCit7CisJc3RydWN0IHVsZF9jdHggKnVfY3R4LCAqdG1wOworCisJaWYgKGF0b21pY19yZWFkKCZkZXZfY291bnQpKQorCQlzdG9wX2NyeXB0bygpOworCisJLyogUmVtb3ZlIGFsbCBkZXZpY2VzIGZyb20gbGlzdCAqLworCW11dGV4X2xvY2soJmRldl9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHVfY3R4LCB0bXAsICZ1bGRfY3R4X2xpc3QsIGVudHJ5KSB7CisJCWlmICh1X2N0eC0+ZGV2KQorCQkJY2hjcl9kZXZfcmVtb3ZlKHVfY3R4KTsKKwkJa2ZyZWUodV9jdHgpOworCX0KKwltdXRleF91bmxvY2soJmRldl9tdXRleCk7CisJY3hnYjRfdW5yZWdpc3Rlcl91bGQoQ1hHQjRfVUxEX0NSWVBUTyk7Cit9CisKK21vZHVsZV9pbml0KGNoY3JfY3J5cHRvX2luaXQpOworbW9kdWxlX2V4aXQoY2hjcl9jcnlwdG9fZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQ3J5cHRvIENvLXByb2Nlc3NvciBmb3IgQ2hlbHNpbyBUZXJtaW5hdG9yIGNhcmRzLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQ2hlbHNpbyBDb21tdW5pY2F0aW9ucyIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vY2hlbHNpby9jaGNyX2NvcmUuaCBiL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vY2hjcl9jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE1YzY3MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vY2hjcl9jb3JlLmgKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDaGVsc2lvIFQ2IENyeXB0byBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE2IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9fQ0hDUl9DT1JFX0hfXworI2RlZmluZSBfX0NIQ1JfQ09SRV9IX18KKworI2luY2x1ZGUgPGNyeXB0by9hbGdhcGkuaD4KKyNpbmNsdWRlICJ0NF9ody5oIgorI2luY2x1ZGUgImN4Z2I0LmgiCisjaW5jbHVkZSAiY3hnYjRfdWxkLmgiCisKKyNkZWZpbmUgRFJWX01PRFVMRV9OQU1FICJjaGNyIgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMS4wLjAuMCIKKworI2RlZmluZSBNQVhfUEVORElOR19SRVFfVE9fSFcgMjAKKyNkZWZpbmUgQ0hDUl9URVNUX1JFU1BPTlNFX1RJTUVPVVQgMTAwMAorCisjZGVmaW5lIFBBRF9FUlJPUl9CSVQJCTEKKyNkZWZpbmUgQ0hLX1BBRF9FUlJfQklUKHgpCSgoKHgpID4+IFBBRF9FUlJPUl9CSVQpICYgMSkKKworI2RlZmluZSBNQUNfRVJST1JfQklUCQkwCisjZGVmaW5lIENIS19NQUNfRVJSX0JJVCh4KQkoKCh4KSA+PiBNQUNfRVJST1JfQklUKSAmIDEpCisKK3N0cnVjdCB1bGRfY3R4OworCitzdHJ1Y3QgY2hjcl9kZXYgeworCS8qIFJlcXVlc3Qgc3VibWl0ZWQgdG8gaC93IGFuZCB3YWl0aW5nIGZvciByZXNwb25zZS4gKi8KKwlzcGlubG9ja190IGxvY2tfY2hjcl9kZXY7CisJc3RydWN0IGNyeXB0b19xdWV1ZSBwZW5kaW5nX3F1ZXVlOworCXN0cnVjdCB1bGRfY3R4ICp1X2N0eDsKKwl1bnNpZ25lZCBjaGFyIHR4X2NoYW5uZWxfaWQ7Cit9OworCitzdHJ1Y3QgdWxkX2N0eCB7CisJc3RydWN0IGxpc3RfaGVhZCBlbnRyeTsKKwlzdHJ1Y3QgY3hnYjRfbGxkX2luZm8gbGxkaTsKKwlzdHJ1Y3QgY2hjcl9kZXYgKmRldjsKK307CisKK2ludCBhc3NpZ25fY2hjcl9kZXZpY2Uoc3RydWN0IGNoY3JfZGV2ICoqZGV2KTsKK2ludCBjaGNyX3NlbmRfd3Ioc3RydWN0IHNrX2J1ZmYgKnNrYik7CitpbnQgc3RhcnRfY3J5cHRvKHZvaWQpOworaW50IHN0b3BfY3J5cHRvKHZvaWQpOworaW50IGNoY3JfdWxkX3J4X2hhbmRsZXIodm9pZCAqaGFuZGxlLCBjb25zdCBfX2JlNjQgKnJzcCwKKwkJCWNvbnN0IHN0cnVjdCBwa3RfZ2wgKnBnbCk7CitpbnQgY2hjcl9oYW5kbGVfcmVzcChzdHJ1Y3QgY3J5cHRvX2FzeW5jX3JlcXVlc3QgKnJlcSwgdW5zaWduZWQgY2hhciAqaW5wdXQsCisJCSAgICAgaW50IGVycik7CisjZW5kaWYgLyogX19DSENSX0NPUkVfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9jaGVsc2lvL2NoY3JfY3J5cHRvLmggYi9kcml2ZXJzL2NyeXB0by9jaGVsc2lvL2NoY3JfY3J5cHRvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdkNzU2MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vY2hjcl9jcnlwdG8uaApAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDaGVsc2lvIFQ2IENyeXB0byBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE2IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9fQ0hDUl9DUllQVE9fSF9fCisjZGVmaW5lIF9fQ0hDUl9DUllQVE9fSF9fCisKKy8qIERlZmluZSBmb2xsb3dpbmcgaWYgaC93IGlzIG5vdCBkcm9wcGluZyB0aGUgQUFEIGFuZCBJViBkYXRhIGJlZm9yZQorICogZ2l2aW5nIHRoZSBwcm9jZXNzZWQgZGF0YQorICovCisKKyNkZWZpbmUgQ0hDUl9DUkFfUFJJT1JJVFkgMzAwCisKKyNkZWZpbmUgQ0hDUl9BRVNfTUFYX0tFWV9MRU4gICgyICogKEFFU19NQVhfS0VZX1NJWkUpKSAvKiBjb25zaWRlciB4dHMgKi8KKyNkZWZpbmUgQ0hDUl9NQVhfQ1JZUFRPX0lWX0xFTiAxNiAvKiBBRVMgSVYgbGVuICovCisKKyNkZWZpbmUgQ0hDUl9NQVhfQVVUSEVOQ19BRVNfS0VZX0xFTiAzMiAvKiBtYXggYWVzIGtleSBsZW5ndGgqLworI2RlZmluZSBDSENSX01BWF9BVVRIRU5DX1NIQV9LRVlfTEVOIDEyOCAvKiBtYXggc2hhIGtleSBsZW5ndGgqLworCisjZGVmaW5lIENIQ1JfR0lWRU5DUllQVF9PUCAyCisvKiBDUEwvU0NNRCBwYXJhbWV0ZXJzICovCisKKyNkZWZpbmUgQ0hDUl9FTkNSWVBUX09QIDAKKyNkZWZpbmUgQ0hDUl9ERUNSWVBUX09QIDEKKworI2RlZmluZSBDSENSX1NDTURfU0VRX05PX0NUUkxfMzJCSVQgICAgIDEKKyNkZWZpbmUgQ0hDUl9TQ01EX1NFUV9OT19DVFJMXzQ4QklUICAgICAyCisjZGVmaW5lIENIQ1JfU0NNRF9TRVFfTk9fQ1RSTF82NEJJVCAgICAgMworCisjZGVmaW5lIENIQ1JfU0NNRF9QUk9UT19WRVJTSU9OX0dFTkVSSUMgNAorCisjZGVmaW5lIENIQ1JfU0NNRF9BVVRIX0NUUkxfQVVUSF9DSVBIRVIgMAorI2RlZmluZSBDSENSX1NDTURfQVVUSF9DVFJMX0NJUEhFUl9BVVRIIDEKKworI2RlZmluZSBDSENSX1NDTURfQ0lQSEVSX01PREVfTk9QICAgICAgICAgICAwCisjZGVmaW5lIENIQ1JfU0NNRF9DSVBIRVJfTU9ERV9BRVNfQ0JDICAgICAgIDEKKyNkZWZpbmUgQ0hDUl9TQ01EX0NJUEhFUl9NT0RFX0dFTkVSSUNfQUVTICAgNAorI2RlZmluZSBDSENSX1NDTURfQ0lQSEVSX01PREVfQUVTX1hUUyAgICAgICA2CisKKyNkZWZpbmUgQ0hDUl9TQ01EX0FVVEhfTU9ERV9OT1AgICAgICAgICAgICAgMAorI2RlZmluZSBDSENSX1NDTURfQVVUSF9NT0RFX1NIQTEgICAgICAgICAgICAxCisjZGVmaW5lIENIQ1JfU0NNRF9BVVRIX01PREVfU0hBMjI0ICAgICAgICAgIDIKKyNkZWZpbmUgQ0hDUl9TQ01EX0FVVEhfTU9ERV9TSEEyNTYgICAgICAgICAgMworI2RlZmluZSBDSENSX1NDTURfQVVUSF9NT0RFX1NIQTUxMl8yMjQgICAgICA1CisjZGVmaW5lIENIQ1JfU0NNRF9BVVRIX01PREVfU0hBNTEyXzI1NiAgICAgIDYKKyNkZWZpbmUgQ0hDUl9TQ01EX0FVVEhfTU9ERV9TSEE1MTJfMzg0ICAgICAgNworI2RlZmluZSBDSENSX1NDTURfQVVUSF9NT0RFX1NIQTUxMl81MTIgICAgICA4CisKKyNkZWZpbmUgQ0hDUl9TQ01EX0hNQUNfQ1RSTF9OT1AgICAgICAgICAgICAgMAorI2RlZmluZSBDSENSX1NDTURfSE1BQ19DVFJMX05PX1RSVU5DICAgICAgICAxCisKKyNkZWZpbmUgQ0hDUl9TQ01EX0lWR0VOX0NUUkxfSFcgICAgICAgICAgICAgMAorI2RlZmluZSBDSENSX1NDTURfSVZHRU5fQ1RSTF9TVyAgICAgICAgICAgICAxCisvKiBUaGlzIGFyZSBub3QgcmVhbGx5IG1hYyBrZXkgc2l6ZS4gVGhleSBhcmUgaW50ZXJtZWRpYXRlIHZhbHVlcworICogb2Ygc2hhIGVuZ2luZSBhbmQgaXRzIHNpemUKKyAqLworI2RlZmluZSBDSENSX0tFWUNUWF9NQUNfS0VZX1NJWkVfMTI4ICAgICAgICAwCisjZGVmaW5lIENIQ1JfS0VZQ1RYX01BQ19LRVlfU0laRV8xNjAgICAgICAgIDEKKyNkZWZpbmUgQ0hDUl9LRVlDVFhfTUFDX0tFWV9TSVpFXzE5MiAgICAgICAgMgorI2RlZmluZSBDSENSX0tFWUNUWF9NQUNfS0VZX1NJWkVfMjU2ICAgICAgICAzCisjZGVmaW5lIENIQ1JfS0VZQ1RYX01BQ19LRVlfU0laRV81MTIgICAgICAgIDQKKyNkZWZpbmUgQ0hDUl9LRVlDVFhfQ0lQSEVSX0tFWV9TSVpFXzEyOCAgICAgMAorI2RlZmluZSBDSENSX0tFWUNUWF9DSVBIRVJfS0VZX1NJWkVfMTkyICAgICAxCisjZGVmaW5lIENIQ1JfS0VZQ1RYX0NJUEhFUl9LRVlfU0laRV8yNTYgICAgIDIKKyNkZWZpbmUgQ0hDUl9LRVlDVFhfTk9fS0VZICAgICAgICAgICAgICAgICAgMTUKKworI2RlZmluZSBDSENSX0NQTF9GVzRfUExEX0lWX09GRlNFVCAgICAgICAgICAoNSAqIDY0KSAvKiBieXRlcy4gZmx0ICM1IGFuZCAjNiAqLworI2RlZmluZSBDSENSX0NQTF9GVzRfUExEX0hBU0hfUkVTVUxUX09GRlNFVCAoNyAqIDY0KSAvKiBieXRlcy4gZmx0ICM3ICovCisjZGVmaW5lIENIQ1JfQ1BMX0ZXNF9QTERfREFUQV9TSVpFICAgICAgICAgICg0ICogNjQpIC8qIGJ5dGVzLiBmbHQgIzQgdG8gIzcgKi8KKworI2RlZmluZSBLRVlfQ09OVEVYVF9IRFJfU0FMVF9BTkRfUEFECSAgICAxNgorI2RlZmluZSBmbGl0c190b19ieXRlcyh4KSAgKHggKiA4KQorCisjZGVmaW5lIElWX05PUCAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSVZfSU1NRURJQVRFICAgICAgICAgICAgMQorI2RlZmluZSBJVl9EU0dMCQkJMgorCisjZGVmaW5lIENSWVBUT19BTEdfU1VCX1RZUEVfTUFTSyAgICAgICAgICAgIDB4MGYwMDAwMDAKKyNkZWZpbmUgQ1JZUFRPX0FMR19TVUJfVFlQRV9IQVNIX0hNQUMgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBDUllQVE9fQUxHX1RZUEVfSE1BQyAoQ1JZUFRPX0FMR19UWVBFX0FIQVNIIHxcCisJCQkgICAgICBDUllQVE9fQUxHX1NVQl9UWVBFX0hBU0hfSE1BQykKKworI2RlZmluZSBNQVhfU0FMVCAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1BWF9TQ1JBVENIX1BBRF9TSVpFICAgIDMyCisKKyNkZWZpbmUgQ0hDUl9IQVNIX01BWF9CTE9DS19TSVpFXzY0ICA2NAorI2RlZmluZSBDSENSX0hBU0hfTUFYX0JMT0NLX1NJWkVfMTI4IDEyOAorCisvKiBBbGlnbmVkIHRvIDEyOCBiaXQgYm91bmRhcnkgKi8KK3N0cnVjdCBfa2V5X2N0eCB7CisJX19iZTMyIGN0eF9oZHI7CisJdTggc2FsdFtNQVhfU0FMVF07CisJX19iZTY0IHJlc2VydmVyZDsKKwl1bnNpZ25lZCBjaGFyIGtleVswXTsKK307CisKK3N0cnVjdCBhYmxrX2N0eCB7CisJdTggZW5jOworCXVuc2lnbmVkIGludCBwcm9jZXNzZWRfbGVuOworCV9fYmUzMiBrZXlfY3R4X2hkcjsKKwl1bnNpZ25lZCBpbnQgZW5ja2V5X2xlbjsKKwl1bnNpZ25lZCBpbnQgZHN0X25lbnRzOworCXN0cnVjdCBzY2F0dGVybGlzdCBpdl9zZzsKKwl1OCBrZXlbQ0hDUl9BRVNfTUFYX0tFWV9MRU5dOworCXU4IGl2W0NIQ1JfTUFYX0NSWVBUT19JVl9MRU5dOworCXVuc2lnbmVkIGNoYXIgY2lwaF9tb2RlOworfTsKKworc3RydWN0IGhtYWNfY3R4IHsKKwlzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYzsKKwl1OCBpcGFkW0NIQ1JfSEFTSF9NQVhfQkxPQ0tfU0laRV8xMjhdOworCXU4IG9wYWRbQ0hDUl9IQVNIX01BWF9CTE9DS19TSVpFXzEyOF07Cit9OworCitzdHJ1Y3QgX19jcnlwdG9fY3R4IHsKKwlzdHJ1Y3QgaG1hY19jdHggaG1hY2N0eFswXTsKKwlzdHJ1Y3QgYWJsa19jdHggYWJsa2N0eFswXTsKK307CisKK3N0cnVjdCBjaGNyX2NvbnRleHQgeworCXN0cnVjdCBjaGNyX2RldiAqZGV2OworCXVuc2lnbmVkIGNoYXIgdHhfY2hhbm5lbF9pZDsKKwlzdHJ1Y3QgX19jcnlwdG9fY3R4IGNyeXB0b19jdHhbMF07Cit9OworCitzdHJ1Y3QgY2hjcl9haGFzaF9yZXFfY3R4IHsKKwl1MzIgcmVzdWx0OworCWNoYXIgYmZyW0NIQ1JfSEFTSF9NQVhfQkxPQ0tfU0laRV8xMjhdOworCXU4IGJmcl9sZW47CisJLyogRE1BIHRoZSBwYXJ0aWFsIGhhc2ggaW4gaXQgKi8KKwl1OCBwYXJ0aWFsX2hhc2hbQ0hDUl9IQVNIX01BWF9ESUdFU1RfU0laRV07CisJdTY0IGRhdGFfbGVuOyAgLyogRGF0YSBsZW4gdGlsbCB0aW1lICovCisJdm9pZCAqZHVtbXlfcGF5bG9hZF9wdHI7CisJLyogU0tCIHdoaWNoIGlzIGJlaW5nIHNlbnQgdG8gdGhlIGhhcmR3YXJlIGZvciBwcm9jZXNzaW5nICovCisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKK307CisKK3N0cnVjdCBjaGNyX2Jsa2NpcGhlcl9yZXFfY3R4IHsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworfTsKKworc3RydWN0IGNoY3JfYWxnX3RlbXBsYXRlIHsKKwl1MzIgdHlwZTsKKwl1MzIgaXNfcmVnaXN0ZXJlZDsKKwl1bmlvbiB7CisJCXN0cnVjdCBjcnlwdG9fYWxnIGNyeXB0bzsKKwkJc3RydWN0IGFoYXNoX2FsZyBoYXNoOworCX0gYWxnOworfTsKKworc3RydWN0IGNoY3JfcmVxX2N0eCB7CisJdW5pb24geworCQlzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqYWhhc2hfcmVxOworCQlzdHJ1Y3QgYWJsa2NpcGhlcl9yZXF1ZXN0ICphYmxrX3JlcTsKKwl9IHJlcTsKKwl1bmlvbiB7CisJCXN0cnVjdCBjaGNyX2FoYXNoX3JlcV9jdHggKmFoYXNoX2N0eDsKKwkJc3RydWN0IGNoY3JfYmxrY2lwaGVyX3JlcV9jdHggKmFibGtfY3R4OworCX0gY3R4OworfTsKKworc3RydWN0IHNnZV9vcGFxdWVfaGRyIHsKKwl2b2lkICpkZXY7CisJZG1hX2FkZHJfdCBhZGRyW01BWF9TS0JfRlJBR1MgKyAxXTsKK307CisKK3R5cGVkZWYgc3RydWN0IHNrX2J1ZmYgKigqY3JlYXRlX3dyX3QpKHN0cnVjdCBjcnlwdG9fYXN5bmNfcmVxdWVzdCAqcmVxLAorCQkJCSAgICAgICBzdHJ1Y3QgY2hjcl9jb250ZXh0ICpjdHgsCisJCQkJICAgICAgIHVuc2lnbmVkIHNob3J0IHFpZCwKKwkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgb3BfdHlwZSk7CisKKyNlbmRpZiAvKiBfX0NIQ1JfQ1JZUFRPX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9jb21tb24vcWF0X2FsZ3MuYyBiL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfY29tbW9uL3FhdF9hbGdzLmMKaW5kZXggNzY5MTQ4ZC4uMjBmMzVkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9jb21tb24vcWF0X2FsZ3MuYworKysgYi9kcml2ZXJzL2NyeXB0by9xYXQvcWF0X2NvbW1vbi9xYXRfYWxncy5jCkBAIC0xMjYwLDggKzEyNjAsOCBAQAogCQkJLnNldGtleSA9IHFhdF9hbGdfYWJsa2NpcGhlcl94dHNfc2V0a2V5LAogCQkJLmRlY3J5cHQgPSBxYXRfYWxnX2FibGtjaXBoZXJfZGVjcnlwdCwKIAkJCS5lbmNyeXB0ID0gcWF0X2FsZ19hYmxrY2lwaGVyX2VuY3J5cHQsCi0JCQkubWluX2tleXNpemUgPSBBRVNfTUlOX0tFWV9TSVpFLAotCQkJLm1heF9rZXlzaXplID0gQUVTX01BWF9LRVlfU0laRSwKKwkJCS5taW5fa2V5c2l6ZSA9IDIgKiBBRVNfTUlOX0tFWV9TSVpFLAorCQkJLm1heF9rZXlzaXplID0gMiAqIEFFU19NQVhfS0VZX1NJWkUsCiAJCQkuaXZzaXplID0gQUVTX0JMT0NLX1NJWkUsCiAJCX0sCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3ZteC9hZXNfeHRzLmMgYi9kcml2ZXJzL2NyeXB0by92bXgvYWVzX3h0cy5jCmluZGV4IGNmYjI1NDEuLjI0MzUzZWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by92bXgvYWVzX3h0cy5jCisrKyBiL2RyaXZlcnMvY3J5cHRvL3ZteC9hZXNfeHRzLmMKQEAgLTEyOSw4ICsxMjksOCBAQAogCiAJCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOwogCi0JCWl2ID0gKHU4ICopd2Fsay5pdjsKIAkJcmV0ID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCAmd2Fsayk7CisJCWl2ID0gd2Fsay5pdjsKIAkJbWVtc2V0KHR3ZWFrLCAwLCBBRVNfQkxPQ0tfU0laRSk7CiAJCWFlc19wOF9lbmNyeXB0KGl2LCB0d2VhaywgJmN0eC0+dHdlYWtfa2V5KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kYXgvZGF4LmMgYi9kcml2ZXJzL2RheC9kYXguYwppbmRleCA4MDNmMzk1Li4yOWY2MDBmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kYXgvZGF4LmMKKysrIGIvZHJpdmVycy9kYXgvZGF4LmMKQEAgLTQ1OSw3ICs0NTksNyBAQAogCX0KIAogCXBnb2ZmID0gbGluZWFyX3BhZ2VfaW5kZXgodm1hLCBwbWRfYWRkcik7Ci0JcGh5cyA9IHBnb2ZmX3RvX3BoeXMoZGF4X2RldiwgcGdvZmYsIFBBR0VfU0laRSk7CisJcGh5cyA9IHBnb2ZmX3RvX3BoeXMoZGF4X2RldiwgcGdvZmYsIFBNRF9TSVpFKTsKIAlpZiAocGh5cyA9PSAtMSkgewogCQlkZXZfZGJnKGRldiwgIiVzOiBwaHlzX3RvX3Bnb2ZmKCUjbHgpIGZhaWxlZFxuIiwgX19mdW5jX18sCiAJCQkJcGdvZmYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kYXgvcG1lbS5jIGIvZHJpdmVycy9kYXgvcG1lbS5jCmluZGV4IGRmYjE2ODUuLjFmMDFlOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZGF4L3BtZW0uYworKysgYi9kcml2ZXJzL2RheC9wbWVtLmMKQEAgLTExNiw2ICsxMTYsOSBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCisJLyogYWRqdXN0IHRoZSBkYXhfcmVnaW9uIHJlc291cmNlIHRvIHRoZSBzdGFydCBvZiBkYXRhICovCisJcmVzLnN0YXJ0ICs9IGxlNjRfdG9fY3B1KHBmbl9zYi0+ZGF0YW9mZik7CisKIAluZF9yZWdpb24gPSB0b19uZF9yZWdpb24oZGV2LT5wYXJlbnQpOwogCWRheF9yZWdpb24gPSBhbGxvY19kYXhfcmVnaW9uKGRldiwgbmRfcmVnaW9uLT5pZCwgJnJlcywKIAkJCWxlMzJfdG9fY3B1KHBmbl9zYi0+YWxpZ24pLCBhZGRyLCBQRk5fREVWfFBGTl9NQVApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kZXZmcmVxL0tjb25maWcgYi9kcml2ZXJzL2RldmZyZXEvS2NvbmZpZwppbmRleCBhNWJlNTZlLi40MTI1NGU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RldmZyZXEvS2NvbmZpZworKysgYi9kcml2ZXJzL2RldmZyZXEvS2NvbmZpZwpAQCAtNzYsNyArNzYsNyBAQAogCiBjb25maWcgQVJNX0VYWU5PU19CVVNfREVWRlJFUQogCXRyaXN0YXRlICJBUk0gRVhZTk9TIEdlbmVyaWMgTWVtb3J5IEJ1cyBERVZGUkVRIERyaXZlciIKLQlkZXBlbmRzIG9uIEFSQ0hfRVhZTk9TCisJZGVwZW5kcyBvbiBBUkNIX0VYWU5PUyB8fCBDT01QSUxFX1RFU1QKIAlzZWxlY3QgREVWRlJFUV9HT1ZfU0lNUExFX09OREVNQU5ECiAJc2VsZWN0IERFVkZSRVFfR09WX1BBU1NJVkUKIAlzZWxlY3QgREVWRlJFUV9FVkVOVF9FWFlOT1NfUFBNVQpAQCAtOTEsMTQgKzkxLDI2IEBACiAJICBUaGlzIGRvZXMgbm90IHlldCBvcGVyYXRlIHdpdGggb3B0aW1hbCB2b2x0YWdlcy4KIAogY29uZmlnIEFSTV9URUdSQV9ERVZGUkVRCi0gICAgICAgdHJpc3RhdGUgIlRlZ3JhIERFVkZSRVEgRHJpdmVyIgotICAgICAgIGRlcGVuZHMgb24gQVJDSF9URUdSQV8xMjRfU09DCi0gICAgICAgc2VsZWN0IERFVkZSRVFfR09WX1NJTVBMRV9PTkRFTUFORAotICAgICAgIHNlbGVjdCBQTV9PUFAKLSAgICAgICBoZWxwCi0gICAgICAgICBUaGlzIGFkZHMgdGhlIERFVkZSRVEgZHJpdmVyIGZvciB0aGUgVGVncmEgZmFtaWx5IG9mIFNvQ3MuCi0gICAgICAgICBJdCByZWFkcyBBQ1RNT04gY291bnRlcnMgb2YgbWVtb3J5IGNvbnRyb2xsZXJzIGFuZCBhZGp1c3RzIHRoZQotICAgICAgICAgb3BlcmF0aW5nIGZyZXF1ZW5jaWVzIGFuZCB2b2x0YWdlcyB3aXRoIE9QUCBzdXBwb3J0LgorCXRyaXN0YXRlICJUZWdyYSBERVZGUkVRIERyaXZlciIKKwlkZXBlbmRzIG9uIEFSQ0hfVEVHUkFfMTI0X1NPQworCXNlbGVjdCBERVZGUkVRX0dPVl9TSU1QTEVfT05ERU1BTkQKKwlzZWxlY3QgUE1fT1BQCisJaGVscAorCSAgVGhpcyBhZGRzIHRoZSBERVZGUkVRIGRyaXZlciBmb3IgdGhlIFRlZ3JhIGZhbWlseSBvZiBTb0NzLgorCSAgSXQgcmVhZHMgQUNUTU9OIGNvdW50ZXJzIG9mIG1lbW9yeSBjb250cm9sbGVycyBhbmQgYWRqdXN0cyB0aGUKKwkgIG9wZXJhdGluZyBmcmVxdWVuY2llcyBhbmQgdm9sdGFnZXMgd2l0aCBPUFAgc3VwcG9ydC4KKworY29uZmlnIEFSTV9SSzMzOTlfRE1DX0RFVkZSRVEKKwl0cmlzdGF0ZSAiQVJNIFJLMzM5OSBETUMgREVWRlJFUSBEcml2ZXIiCisJZGVwZW5kcyBvbiBBUkNIX1JPQ0tDSElQCisJc2VsZWN0IERFVkZSRVFfRVZFTlRfUk9DS0NISVBfREZJCisJc2VsZWN0IERFVkZSRVFfR09WX1NJTVBMRV9PTkRFTUFORAorCXNlbGVjdCBQTV9ERVZGUkVRX0VWRU5UCisJc2VsZWN0IFBNX09QUAorCWhlbHAKKyAgICAgICAgICBUaGlzIGFkZHMgdGhlIERFVkZSRVEgZHJpdmVyIGZvciB0aGUgUkszMzk5IERNQyhEeW5hbWljIE1lbW9yeSBDb250cm9sbGVyKS4KKyAgICAgICAgICBJdCBzZXRzIHRoZSBmcmVxdWVuY3kgZm9yIHRoZSBtZW1vcnkgY29udHJvbGxlciBhbmQgcmVhZHMgdGhlIHVzYWdlIGNvdW50cworICAgICAgICAgIGZyb20gaGFyZHdhcmUuCiAKIHNvdXJjZSAiZHJpdmVycy9kZXZmcmVxL2V2ZW50L0tjb25maWciCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZGV2ZnJlcS9NYWtlZmlsZSBiL2RyaXZlcnMvZGV2ZnJlcS9NYWtlZmlsZQppbmRleCAwOWYxMWQ5Li5mYmZmNDBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RldmZyZXEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9kZXZmcmVxL01ha2VmaWxlCkBAIC04LDYgKzgsNyBAQAogCiAjIERFVkZSRVEgRHJpdmVycwogb2JqLSQoQ09ORklHX0FSTV9FWFlOT1NfQlVTX0RFVkZSRVEpCSs9IGV4eW5vcy1idXMubworb2JqLSQoQ09ORklHX0FSTV9SSzMzOTlfRE1DX0RFVkZSRVEpCSs9IHJrMzM5OV9kbWMubwogb2JqLSQoQ09ORklHX0FSTV9URUdSQV9ERVZGUkVRKQkJKz0gdGVncmEtZGV2ZnJlcS5vCiAKICMgREVWRlJFUSBFdmVudCBEcml2ZXJzCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RldmZyZXEvZXZlbnQvS2NvbmZpZyBiL2RyaXZlcnMvZGV2ZnJlcS9ldmVudC9LY29uZmlnCmluZGV4IGViNmY3NGEuLjBmZGFlODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZGV2ZnJlcS9ldmVudC9LY29uZmlnCisrKyBiL2RyaXZlcnMvZGV2ZnJlcS9ldmVudC9LY29uZmlnCkBAIC0xNSw3ICsxNSw3IEBACiAKIGNvbmZpZyBERVZGUkVRX0VWRU5UX0VYWU5PU19OT0NQCiAJdHJpc3RhdGUgIkVYWU5PUyBOb0MgKE5ldHdvcmsgT24gQ2hpcCkgUHJvYmUgREVWRlJFUSBldmVudCBEcml2ZXIiCi0JZGVwZW5kcyBvbiBBUkNIX0VYWU5PUworCWRlcGVuZHMgb24gQVJDSF9FWFlOT1MgfHwgQ09NUElMRV9URVNUCiAJc2VsZWN0IFBNX09QUAogCWhlbHAKIAkgIFRoaXMgYWRkIHRoZSBkZXZmcmVxLWV2ZW50IGRyaXZlciBmb3IgRXh5bm9zIFNvQy4gSXQgcHJvdmlkZXMgTm9DCkBAIC0yMywxMSArMjMsMTggQEAKIAogY29uZmlnIERFVkZSRVFfRVZFTlRfRVhZTk9TX1BQTVUKIAl0cmlzdGF0ZSAiRVhZTk9TIFBQTVUgKFBsYXRmb3JtIFBlcmZvcm1hbmNlIE1vbml0b3JpbmcgVW5pdCkgREVWRlJFUSBldmVudCBEcml2ZXIiCi0JZGVwZW5kcyBvbiBBUkNIX0VYWU5PUworCWRlcGVuZHMgb24gQVJDSF9FWFlOT1MgfHwgQ09NUElMRV9URVNUCiAJc2VsZWN0IFBNX09QUAogCWhlbHAKIAkgIFRoaXMgYWRkIHRoZSBkZXZmcmVxLWV2ZW50IGRyaXZlciBmb3IgRXh5bm9zIFNvQy4gSXQgcHJvdmlkZXMgUFBNVQogCSAgKFBsYXRmb3JtIFBlcmZvcm1hbmNlIE1vbml0b3JpbmcgVW5pdCkgY291bnRlcnMgdG8gZXN0aW1hdGUgdGhlCiAJICB1dGlsaXphdGlvbiBvZiBlYWNoIG1vZHVsZS4KIAorY29uZmlnIERFVkZSRVFfRVZFTlRfUk9DS0NISVBfREZJCisJdHJpc3RhdGUgIlJPQ0tDSElQIERGSSBERVZGUkVRIGV2ZW50IERyaXZlciIKKwlkZXBlbmRzIG9uIEFSQ0hfUk9DS0NISVAKKwloZWxwCisJICBUaGlzIGFkZCB0aGUgZGV2ZnJlcS1ldmVudCBkcml2ZXIgZm9yIFJvY2tjaGlwIFNvQy4gSXQgcHJvdmlkZXMgREZJCisJICAoRERSIE1vbml0b3IgTW9kdWxlKSBkcml2ZXIgdG8gY291bnQgZGRyIGxvYWQuCisKIGVuZGlmICMgUE1fREVWRlJFUV9FVkVOVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kZXZmcmVxL2V2ZW50L01ha2VmaWxlIGIvZHJpdmVycy9kZXZmcmVxL2V2ZW50L01ha2VmaWxlCmluZGV4IDNkNmFmZDMuLmRkYTcwOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZGV2ZnJlcS9ldmVudC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2RldmZyZXEvZXZlbnQvTWFrZWZpbGUKQEAgLTIsMyArMiw0IEBACiAKIG9iai0kKENPTkZJR19ERVZGUkVRX0VWRU5UX0VYWU5PU19OT0NQKSArPSBleHlub3Mtbm9jcC5vCiBvYmotJChDT05GSUdfREVWRlJFUV9FVkVOVF9FWFlOT1NfUFBNVSkgKz0gZXh5bm9zLXBwbXUubworb2JqLSQoQ09ORklHX0RFVkZSRVFfRVZFTlRfUk9DS0NISVBfREZJKSArPSByb2NrY2hpcC1kZmkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kZXZmcmVxL2V2ZW50L2V4eW5vcy1wcG11LmMgYi9kcml2ZXJzL2RldmZyZXEvZXZlbnQvZXh5bm9zLXBwbXUuYwppbmRleCA4NDViZjI1Li5mNTVjZjBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RldmZyZXEvZXZlbnQvZXh5bm9zLXBwbXUuYworKysgYi9kcml2ZXJzL2RldmZyZXEvZXZlbnQvZXh5bm9zLXBwbXUuYwpAQCAtNDA2LDggKzQwNiw2IEBACiAJCW9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKG5vZGUsICJldmVudC1uYW1lIiwgJmRlc2Nbal0ubmFtZSk7CiAKIAkJaisrOwotCi0JCW9mX25vZGVfcHV0KG5vZGUpOwogCX0KIAlpbmZvLT5kZXNjID0gZGVzYzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kZXZmcmVxL2V2ZW50L3JvY2tjaGlwLWRmaS5jIGIvZHJpdmVycy9kZXZmcmVxL2V2ZW50L3JvY2tjaGlwLWRmaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZmNjNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2RldmZyZXEvZXZlbnQvcm9ja2NoaXAtZGZpLmMKQEAgLTAsMCArMSwyNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIEZ1emhvdSBSb2NrY2hpcCBFbGVjdHJvbmljcyBDby4sIEx0ZAorICogQXV0aG9yOiBMaW4gSHVhbmcgPGhsQHJvY2stY2hpcHMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnJlcS1ldmVudC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9zeXNjb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisKKyNkZWZpbmUgUkszMzk5X0RNQ19OVU1fQ0gJMgorCisvKiBERFJNT05fQ1RSTCAqLworI2RlZmluZSBERFJNT05fQ1RSTAkweDA0CisjZGVmaW5lIENMUl9ERFJNT05fQ1RSTAkoMHgxZjAwMDAgPDwgMCkKKyNkZWZpbmUgTFBERFI0X0VOCSgweDEwMDAxIDw8IDQpCisjZGVmaW5lIEhBUkRXQVJFX0VOCSgweDEwMDAxIDw8IDMpCisjZGVmaW5lIExQRERSM19FTgkoMHgxMDAwMSA8PCAyKQorI2RlZmluZSBTT0ZUV0FSRV9FTgkoMHgxMDAwMSA8PCAxKQorI2RlZmluZSBTT0ZUV0FSRV9ESVMJKDB4MTAwMDAgPDwgMSkKKyNkZWZpbmUgVElNRV9DTlRfRU4JKDB4MTAwMDEgPDwgMCkKKworI2RlZmluZSBERFJNT05fQ0gwX0NPVU5UX05VTQkJMHgyOAorI2RlZmluZSBERFJNT05fQ0gwX0RGSV9BQ0NFU1NfTlVNCTB4MmMKKyNkZWZpbmUgRERSTU9OX0NIMV9DT1VOVF9OVU0JCTB4M2MKKyNkZWZpbmUgRERSTU9OX0NIMV9ERklfQUNDRVNTX05VTQkweDQwCisKKy8qIHBtdSBncmYgKi8KKyNkZWZpbmUgUE1VR1JGX09TX1JFRzIJMHgzMDgKKyNkZWZpbmUgRERSVFlQRV9TSElGVAkxMworI2RlZmluZSBERFJUWVBFX01BU0sJNworCitlbnVtIHsKKwlERFIzID0gMywKKwlMUEREUjMgPSA2LAorCUxQRERSNCA9IDcsCisJVU5VU0VEID0gMHhGRgorfTsKKworc3RydWN0IGRtY191c2FnZSB7CisJdTMyIGFjY2VzczsKKwl1MzIgdG90YWw7Cit9OworCisvKgorICogVGhlIGRmaSBjb250cm9sbGVyIGNhbiBtb25pdG9yIEREUiBsb2FkLiBJdCBoYXMgYW4gdXBwZXIgYW5kIGxvd2VyIHRocmVzaG9sZAorICogZm9yIHRoZSBvcGVyYXRpbmcgcG9pbnRzLiBXaGVuZXZlciB0aGUgdXNhZ2UgbGVhdmVzIHRoZXNlIGJvdW5kcyBhbiBldmVudCBpcworICogZ2VuZXJhdGVkIHRvIGluZGljYXRlIHRoZSBERFIgZnJlcXVlbmN5IHNob3VsZCBiZSBjaGFuZ2VkLgorICovCitzdHJ1Y3Qgcm9ja2NoaXBfZGZpIHsKKwlzdHJ1Y3QgZGV2ZnJlcV9ldmVudF9kZXYgKmVkZXY7CisJc3RydWN0IGRldmZyZXFfZXZlbnRfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgZG1jX3VzYWdlIGNoX3VzYWdlW1JLMzM5OV9ETUNfTlVNX0NIXTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJdm9pZCBfX2lvbWVtICpyZWdzOworCXN0cnVjdCByZWdtYXAgKnJlZ21hcF9wbXU7CisJc3RydWN0IGNsayAqY2xrOworfTsKKworc3RhdGljIHZvaWQgcm9ja2NoaXBfZGZpX3N0YXJ0X2hhcmR3YXJlX2NvdW50ZXIoc3RydWN0IGRldmZyZXFfZXZlbnRfZGV2ICplZGV2KQoreworCXN0cnVjdCByb2NrY2hpcF9kZmkgKmluZm8gPSBkZXZmcmVxX2V2ZW50X2dldF9kcnZkYXRhKGVkZXYpOworCXZvaWQgX19pb21lbSAqZGZpX3JlZ3MgPSBpbmZvLT5yZWdzOworCXUzMiB2YWw7CisJdTMyIGRkcl90eXBlOworCisJLyogZ2V0IGRkciB0eXBlICovCisJcmVnbWFwX3JlYWQoaW5mby0+cmVnbWFwX3BtdSwgUE1VR1JGX09TX1JFRzIsICZ2YWwpOworCWRkcl90eXBlID0gKHZhbCA+PiBERFJUWVBFX1NISUZUKSAmIEREUlRZUEVfTUFTSzsKKworCS8qIGNsZWFyIEREUk1PTl9DVFJMIHNldHRpbmcgKi8KKwl3cml0ZWxfcmVsYXhlZChDTFJfRERSTU9OX0NUUkwsIGRmaV9yZWdzICsgRERSTU9OX0NUUkwpOworCisJLyogc2V0IGRkciB0eXBlIHRvIGRmaSAqLworCWlmIChkZHJfdHlwZSA9PSBMUEREUjMpCisJCXdyaXRlbF9yZWxheGVkKExQRERSM19FTiwgZGZpX3JlZ3MgKyBERFJNT05fQ1RSTCk7CisJZWxzZSBpZiAoZGRyX3R5cGUgPT0gTFBERFI0KQorCQl3cml0ZWxfcmVsYXhlZChMUEREUjRfRU4sIGRmaV9yZWdzICsgRERSTU9OX0NUUkwpOworCisJLyogZW5hYmxlIGNvdW50LCB1c2Ugc29mdHdhcmUgbW9kZSAqLworCXdyaXRlbF9yZWxheGVkKFNPRlRXQVJFX0VOLCBkZmlfcmVncyArIEREUk1PTl9DVFJMKTsKK30KKworc3RhdGljIHZvaWQgcm9ja2NoaXBfZGZpX3N0b3BfaGFyZHdhcmVfY291bnRlcihzdHJ1Y3QgZGV2ZnJlcV9ldmVudF9kZXYgKmVkZXYpCit7CisJc3RydWN0IHJvY2tjaGlwX2RmaSAqaW5mbyA9IGRldmZyZXFfZXZlbnRfZ2V0X2RydmRhdGEoZWRldik7CisJdm9pZCBfX2lvbWVtICpkZmlfcmVncyA9IGluZm8tPnJlZ3M7CisKKwl3cml0ZWxfcmVsYXhlZChTT0ZUV0FSRV9ESVMsIGRmaV9yZWdzICsgRERSTU9OX0NUUkwpOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX2RmaV9nZXRfYnVzaWVyX2NoKHN0cnVjdCBkZXZmcmVxX2V2ZW50X2RldiAqZWRldikKK3sKKwlzdHJ1Y3Qgcm9ja2NoaXBfZGZpICppbmZvID0gZGV2ZnJlcV9ldmVudF9nZXRfZHJ2ZGF0YShlZGV2KTsKKwl1MzIgdG1wLCBtYXggPSAwOworCXUzMiBpLCBidXNpZXJfY2ggPSAwOworCXZvaWQgX19pb21lbSAqZGZpX3JlZ3MgPSBpbmZvLT5yZWdzOworCisJcm9ja2NoaXBfZGZpX3N0b3BfaGFyZHdhcmVfY291bnRlcihlZGV2KTsKKworCS8qIEZpbmQgb3V0IHdoaWNoIGNoYW5uZWwgaXMgYnVzaWVyICovCisJZm9yIChpID0gMDsgaSA8IFJLMzM5OV9ETUNfTlVNX0NIOyBpKyspIHsKKwkJaW5mby0+Y2hfdXNhZ2VbaV0uYWNjZXNzID0gcmVhZGxfcmVsYXhlZChkZmlfcmVncyArCisJCQkJRERSTU9OX0NIMF9ERklfQUNDRVNTX05VTSArIGkgKiAyMCkgKiA0OworCQlpbmZvLT5jaF91c2FnZVtpXS50b3RhbCA9IHJlYWRsX3JlbGF4ZWQoZGZpX3JlZ3MgKworCQkJCUREUk1PTl9DSDBfQ09VTlRfTlVNICsgaSAqIDIwKTsKKwkJdG1wID0gaW5mby0+Y2hfdXNhZ2VbaV0uYWNjZXNzOworCQlpZiAodG1wID4gbWF4KSB7CisJCQlidXNpZXJfY2ggPSBpOworCQkJbWF4ID0gdG1wOworCQl9CisJfQorCXJvY2tjaGlwX2RmaV9zdGFydF9oYXJkd2FyZV9jb3VudGVyKGVkZXYpOworCisJcmV0dXJuIGJ1c2llcl9jaDsKK30KKworc3RhdGljIGludCByb2NrY2hpcF9kZmlfZGlzYWJsZShzdHJ1Y3QgZGV2ZnJlcV9ldmVudF9kZXYgKmVkZXYpCit7CisJc3RydWN0IHJvY2tjaGlwX2RmaSAqaW5mbyA9IGRldmZyZXFfZXZlbnRfZ2V0X2RydmRhdGEoZWRldik7CisKKwlyb2NrY2hpcF9kZmlfc3RvcF9oYXJkd2FyZV9jb3VudGVyKGVkZXYpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShpbmZvLT5jbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfZGZpX2VuYWJsZShzdHJ1Y3QgZGV2ZnJlcV9ldmVudF9kZXYgKmVkZXYpCit7CisJc3RydWN0IHJvY2tjaGlwX2RmaSAqaW5mbyA9IGRldmZyZXFfZXZlbnRfZ2V0X2RydmRhdGEoZWRldik7CisJaW50IHJldDsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShpbmZvLT5jbGspOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmZWRldi0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBkZmkgY2xrOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyb2NrY2hpcF9kZmlfc3RhcnRfaGFyZHdhcmVfY291bnRlcihlZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByb2NrY2hpcF9kZmlfc2V0X2V2ZW50KHN0cnVjdCBkZXZmcmVxX2V2ZW50X2RldiAqZWRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByb2NrY2hpcF9kZmlfZ2V0X2V2ZW50KHN0cnVjdCBkZXZmcmVxX2V2ZW50X2RldiAqZWRldiwKKwkJCQkgIHN0cnVjdCBkZXZmcmVxX2V2ZW50X2RhdGEgKmVkYXRhKQoreworCXN0cnVjdCByb2NrY2hpcF9kZmkgKmluZm8gPSBkZXZmcmVxX2V2ZW50X2dldF9kcnZkYXRhKGVkZXYpOworCWludCBidXNpZXJfY2g7CisKKwlidXNpZXJfY2ggPSByb2NrY2hpcF9kZmlfZ2V0X2J1c2llcl9jaChlZGV2KTsKKworCWVkYXRhLT5sb2FkX2NvdW50ID0gaW5mby0+Y2hfdXNhZ2VbYnVzaWVyX2NoXS5hY2Nlc3M7CisJZWRhdGEtPnRvdGFsX2NvdW50ID0gaW5mby0+Y2hfdXNhZ2VbYnVzaWVyX2NoXS50b3RhbDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldmZyZXFfZXZlbnRfb3BzIHJvY2tjaGlwX2RmaV9vcHMgPSB7CisJLmRpc2FibGUgPSByb2NrY2hpcF9kZmlfZGlzYWJsZSwKKwkuZW5hYmxlID0gcm9ja2NoaXBfZGZpX2VuYWJsZSwKKwkuZ2V0X2V2ZW50ID0gcm9ja2NoaXBfZGZpX2dldF9ldmVudCwKKwkuc2V0X2V2ZW50ID0gcm9ja2NoaXBfZGZpX3NldF9ldmVudCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJvY2tjaGlwX2RmaV9pZF9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMzk5LWRmaSIgfSwKKwl7IH0sCit9OworCitzdGF0aWMgaW50IHJvY2tjaGlwX2RmaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IHJvY2tjaGlwX2RmaSAqZGF0YTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgZGV2ZnJlcV9ldmVudF9kZXNjICpkZXNjOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZSwgKm5vZGU7CisKKwlkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCByb2NrY2hpcF9kZmkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlkYXRhLT5yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihkYXRhLT5yZWdzKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGF0YS0+cmVncyk7CisKKwlkYXRhLT5jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAicGNsa19kZHJfbW9uIik7CisJaWYgKElTX0VSUihkYXRhLT5jbGspKSB7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IGdldCB0aGUgY2xrIGRtY19jbGtcbiIpOworCQlyZXR1cm4gUFRSX0VSUihkYXRhLT5jbGspOworCX07CisKKwkvKiB0cnkgdG8gZmluZCB0aGUgb3B0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBwbXUgc3lzY29uICovCisJbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUobnAsICJyb2NrY2hpcCxwbXUiLCAwKTsKKwlpZiAobm9kZSkgeworCQlkYXRhLT5yZWdtYXBfcG11ID0gc3lzY29uX25vZGVfdG9fcmVnbWFwKG5vZGUpOworCQlpZiAoSVNfRVJSKGRhdGEtPnJlZ21hcF9wbXUpKQorCQkJcmV0dXJuIFBUUl9FUlIoZGF0YS0+cmVnbWFwX3BtdSk7CisJfQorCWRhdGEtPmRldiA9IGRldjsKKworCWRlc2MgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRlc2MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRlc2MpCisJCXJldHVybiAtRU5PTUVNOworCisJZGVzYy0+b3BzID0gJnJvY2tjaGlwX2RmaV9vcHM7CisJZGVzYy0+ZHJpdmVyX2RhdGEgPSBkYXRhOworCWRlc2MtPm5hbWUgPSBucC0+bmFtZTsKKwlkYXRhLT5kZXNjID0gZGVzYzsKKworCWRhdGEtPmVkZXYgPSBkZXZtX2RldmZyZXFfZXZlbnRfYWRkX2VkZXYoJnBkZXYtPmRldiwgZGVzYyk7CisJaWYgKElTX0VSUihkYXRhLT5lZGV2KSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiZmFpbGVkIHRvIGFkZCBkZXZmcmVxLWV2ZW50IGRldmljZVxuIik7CisJCXJldHVybiBQVFJfRVJSKGRhdGEtPmVkZXYpOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHJvY2tjaGlwX2RmaV9kcml2ZXIgPSB7CisJLnByb2JlCT0gcm9ja2NoaXBfZGZpX3Byb2JlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInJvY2tjaGlwLWRmaSIsCisJCS5vZl9tYXRjaF90YWJsZSA9IHJvY2tjaGlwX2RmaV9pZF9tYXRjaCwKKwl9LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIocm9ja2NoaXBfZGZpX2RyaXZlcik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BVVRIT1IoIkxpbiBIdWFuZyA8aGxAcm9jay1jaGlwcy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJvY2tjaGlwIERGSSBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZGV2ZnJlcS9yazMzOTlfZG1jLmMgYi9kcml2ZXJzL2RldmZyZXEvcmszMzk5X2RtYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNGI3M2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2RldmZyZXEvcmszMzk5X2RtYy5jCkBAIC0wLDAgKzEsNDcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2LCBGdXpob3UgUm9ja2NoaXAgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBBdXRob3I6IExpbiBIdWFuZyA8aGxAcm9jay1jaGlwcy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9hcm0tc21jY2MuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmcmVxLWV2ZW50Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9vcHAuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKworI2luY2x1ZGUgPHNvYy9yb2NrY2hpcC9yb2NrY2hpcF9zaXAuaD4KKworc3RydWN0IGRyYW1fdGltaW5nIHsKKwl1bnNpZ25lZCBpbnQgZGRyM19zcGVlZF9iaW47CisJdW5zaWduZWQgaW50IHBkX2lkbGU7CisJdW5zaWduZWQgaW50IHNyX2lkbGU7CisJdW5zaWduZWQgaW50IHNyX21jX2dhdGVfaWRsZTsKKwl1bnNpZ25lZCBpbnQgc3JwZF9saXRlX2lkbGU7CisJdW5zaWduZWQgaW50IHN0YW5kYnlfaWRsZTsKKwl1bnNpZ25lZCBpbnQgYXV0b19wZF9kaXNfZnJlcTsKKwl1bnNpZ25lZCBpbnQgZHJhbV9kbGxfZGlzX2ZyZXE7CisJdW5zaWduZWQgaW50IHBoeV9kbGxfZGlzX2ZyZXE7CisJdW5zaWduZWQgaW50IGRkcjNfb2R0X2Rpc19mcmVxOworCXVuc2lnbmVkIGludCBkZHIzX2RydjsKKwl1bnNpZ25lZCBpbnQgZGRyM19vZHQ7CisJdW5zaWduZWQgaW50IHBoeV9kZHIzX2NhX2RydjsKKwl1bnNpZ25lZCBpbnQgcGh5X2RkcjNfZHFfZHJ2OworCXVuc2lnbmVkIGludCBwaHlfZGRyM19vZHQ7CisJdW5zaWduZWQgaW50IGxwZGRyM19vZHRfZGlzX2ZyZXE7CisJdW5zaWduZWQgaW50IGxwZGRyM19kcnY7CisJdW5zaWduZWQgaW50IGxwZGRyM19vZHQ7CisJdW5zaWduZWQgaW50IHBoeV9scGRkcjNfY2FfZHJ2OworCXVuc2lnbmVkIGludCBwaHlfbHBkZHIzX2RxX2RydjsKKwl1bnNpZ25lZCBpbnQgcGh5X2xwZGRyM19vZHQ7CisJdW5zaWduZWQgaW50IGxwZGRyNF9vZHRfZGlzX2ZyZXE7CisJdW5zaWduZWQgaW50IGxwZGRyNF9kcnY7CisJdW5zaWduZWQgaW50IGxwZGRyNF9kcV9vZHQ7CisJdW5zaWduZWQgaW50IGxwZGRyNF9jYV9vZHQ7CisJdW5zaWduZWQgaW50IHBoeV9scGRkcjRfY2FfZHJ2OworCXVuc2lnbmVkIGludCBwaHlfbHBkZHI0X2NrX2NzX2RydjsKKwl1bnNpZ25lZCBpbnQgcGh5X2xwZGRyNF9kcV9kcnY7CisJdW5zaWduZWQgaW50IHBoeV9scGRkcjRfb2R0OworfTsKKworc3RydWN0IHJrMzM5OV9kbWNmcmVxIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IGRldmZyZXEgKmRldmZyZXE7CisJc3RydWN0IGRldmZyZXFfc2ltcGxlX29uZGVtYW5kX2RhdGEgb25kZW1hbmRfZGF0YTsKKwlzdHJ1Y3QgY2xrICpkbWNfY2xrOworCXN0cnVjdCBkZXZmcmVxX2V2ZW50X2RldiAqZWRldjsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlzdHJ1Y3QgZHJhbV90aW1pbmcgdGltaW5nOworCisJLyoKKwkgKiBERFIgQ29udmVyc2VyIG9mIEZyZXF1ZW5jeSAoRENGKSBpcyB1c2VkIHRvIGltcGxlbWVudCBERFIgZnJlcXVlbmN5CisJICogY29udmVyc2lvbiB3aXRob3V0IHRoZSBwYXJ0aWNpcGF0aW9uIG9mIENQVSwgd2Ugd2lsbCBpbXBsZW1lbnQgYW5kCisJICogY29udHJvbCBpdCBpbiBhcm0gdHJ1c3QgZmlybXdhcmUuCisJICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdF9kY2ZfcXVldWU7CisJaW50IGlycTsKKwlpbnQgd2FpdF9kY2ZfZmxhZzsKKwlzdHJ1Y3QgcmVndWxhdG9yICp2ZGRfY2VudGVyOworCXVuc2lnbmVkIGxvbmcgcmF0ZSwgdGFyZ2V0X3JhdGU7CisJdW5zaWduZWQgbG9uZyB2b2x0LCB0YXJnZXRfdm9sdDsKKwlzdHJ1Y3QgZGV2X3BtX29wcCAqY3Vycl9vcHA7Cit9OworCitzdGF0aWMgaW50IHJrMzM5OV9kbWNmcmVxX3RhcmdldChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgKmZyZXEsCisJCQkJIHUzMiBmbGFncykKK3sKKwlzdHJ1Y3QgcmszMzk5X2RtY2ZyZXEgKmRtY2ZyZXEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgZGV2X3BtX29wcCAqb3BwOworCXVuc2lnbmVkIGxvbmcgb2xkX2Nsa19yYXRlID0gZG1jZnJlcS0+cmF0ZTsKKwl1bnNpZ25lZCBsb25nIHRhcmdldF92b2x0LCB0YXJnZXRfcmF0ZTsKKwlpbnQgZXJyOworCisJcmN1X3JlYWRfbG9jaygpOworCW9wcCA9IGRldmZyZXFfcmVjb21tZW5kZWRfb3BwKGRldiwgZnJlcSwgZmxhZ3MpOworCWlmIChJU19FUlIob3BwKSkgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJcmV0dXJuIFBUUl9FUlIob3BwKTsKKwl9CisKKwl0YXJnZXRfcmF0ZSA9IGRldl9wbV9vcHBfZ2V0X2ZyZXEob3BwKTsKKwl0YXJnZXRfdm9sdCA9IGRldl9wbV9vcHBfZ2V0X3ZvbHRhZ2Uob3BwKTsKKworCWRtY2ZyZXEtPnJhdGUgPSBkZXZfcG1fb3BwX2dldF9mcmVxKGRtY2ZyZXEtPmN1cnJfb3BwKTsKKwlkbWNmcmVxLT52b2x0ID0gZGV2X3BtX29wcF9nZXRfdm9sdGFnZShkbWNmcmVxLT5jdXJyX29wcCk7CisKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCWlmIChkbWNmcmVxLT5yYXRlID09IHRhcmdldF9yYXRlKQorCQlyZXR1cm4gMDsKKworCW11dGV4X2xvY2soJmRtY2ZyZXEtPmxvY2spOworCisJLyoKKwkgKiBJZiBmcmVxdWVuY3kgc2NhbGluZyBmcm9tIGxvdyB0byBoaWdoLCBhZGp1c3Qgdm9sdGFnZSBmaXJzdC4KKwkgKiBJZiBmcmVxdWVuY3kgc2NhbGluZyBmcm9tIGhpZ2ggdG8gbG93LCBhZGp1c3QgZnJlcXVlbmN5IGZpcnN0LgorCSAqLworCWlmIChvbGRfY2xrX3JhdGUgPCB0YXJnZXRfcmF0ZSkgeworCQllcnIgPSByZWd1bGF0b3Jfc2V0X3ZvbHRhZ2UoZG1jZnJlcS0+dmRkX2NlbnRlciwgdGFyZ2V0X3ZvbHQsCisJCQkJCSAgICB0YXJnZXRfdm9sdCk7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoZGV2LCAiQ2Fubm90IHRvIHNldCB2b2x0YWdlICVsdSB1VlxuIiwKKwkJCQl0YXJnZXRfdm9sdCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlkbWNmcmVxLT53YWl0X2RjZl9mbGFnID0gMTsKKworCWVyciA9IGNsa19zZXRfcmF0ZShkbWNmcmVxLT5kbWNfY2xrLCB0YXJnZXRfcmF0ZSk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKGRldiwgIkNhbm5vdCB0byBzZXQgZnJlcXVlbmN5ICVsdSAoJWQpXG4iLAorCQkJdGFyZ2V0X3JhdGUsIGVycik7CisJCXJlZ3VsYXRvcl9zZXRfdm9sdGFnZShkbWNmcmVxLT52ZGRfY2VudGVyLCBkbWNmcmVxLT52b2x0LAorCQkJCSAgICAgIGRtY2ZyZXEtPnZvbHQpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIFdhaXQgdW50aWwgYmNmIGlycSBoYXBwZW4sIGl0IG1lYW5zIGZyZXEgc2NhbGluZyBmaW5pc2ggaW4KKwkgKiBhcm0gdHJ1c3QgZmlybXdhcmUsIHVzZSAxMDBtcyBhcyB0aW1lb3V0IHRpbWUuCisJICovCisJaWYgKCF3YWl0X2V2ZW50X3RpbWVvdXQoZG1jZnJlcS0+d2FpdF9kY2ZfcXVldWUsCisJCQkJIWRtY2ZyZXEtPndhaXRfZGNmX2ZsYWcsIEhaIC8gMTApKQorCQlkZXZfd2FybihkZXYsICJUaW1lb3V0IHdhaXRpbmcgZm9yIGRjZiBpbnRlcnJ1cHRcbiIpOworCisJLyoKKwkgKiBDaGVjayB0aGUgZHBsbCByYXRlLAorCSAqIFRoZXJlIG9ubHkgdHdvIHJlc3VsdCB3ZSB3aWxsIGdldCwKKwkgKiAxLiBEZHIgZnJlcXVlbmN5IHNjYWxpbmcgZmFpbCwgd2Ugc3RpbGwgZ2V0IHRoZSBvbGQgcmF0ZS4KKwkgKiAyLiBEZHIgZnJlcXVlbmN5IHNjYWxpbmcgc3VjZXNzZnVsLCB3ZSBnZXQgdGhlIHJhdGUgd2Ugc2V0LgorCSAqLworCWRtY2ZyZXEtPnJhdGUgPSBjbGtfZ2V0X3JhdGUoZG1jZnJlcS0+ZG1jX2Nsayk7CisKKwkvKiBJZiBnZXQgdGhlIGluY29ycmVjdCByYXRlLCBzZXQgdm9sdGFnZSB0byBvbGQgdmFsdWUuICovCisJaWYgKGRtY2ZyZXEtPnJhdGUgIT0gdGFyZ2V0X3JhdGUpIHsKKwkJZGV2X2VycihkZXYsICJHZXQgd3JvbmcgZGRyIGZyZXF1ZW5jeSwgUmVxdWVzdCBmcmVxdWVuY3kgJWx1LFwKKwkJCUN1cnJlbnQgZnJlcXVlbmN5ICVsdVxuIiwgdGFyZ2V0X3JhdGUsIGRtY2ZyZXEtPnJhdGUpOworCQlyZWd1bGF0b3Jfc2V0X3ZvbHRhZ2UoZG1jZnJlcS0+dmRkX2NlbnRlciwgZG1jZnJlcS0+dm9sdCwKKwkJCQkgICAgICBkbWNmcmVxLT52b2x0KTsKKwkJZ290byBvdXQ7CisJfSBlbHNlIGlmIChvbGRfY2xrX3JhdGUgPiB0YXJnZXRfcmF0ZSkKKwkJZXJyID0gcmVndWxhdG9yX3NldF92b2x0YWdlKGRtY2ZyZXEtPnZkZF9jZW50ZXIsIHRhcmdldF92b2x0LAorCQkJCQkgICAgdGFyZ2V0X3ZvbHQpOworCWlmIChlcnIpCisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IHRvIHNldCB2b2wgJWx1IHVWXG4iLCB0YXJnZXRfdm9sdCk7CisKKwlkbWNmcmVxLT5jdXJyX29wcCA9IG9wcDsKK291dDoKKwltdXRleF91bmxvY2soJmRtY2ZyZXEtPmxvY2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmszMzk5X2RtY2ZyZXFfZ2V0X2Rldl9zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGRldmZyZXFfZGV2X3N0YXR1cyAqc3RhdCkKK3sKKwlzdHJ1Y3QgcmszMzk5X2RtY2ZyZXEgKmRtY2ZyZXEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgZGV2ZnJlcV9ldmVudF9kYXRhIGVkYXRhOworCWludCByZXQgPSAwOworCisJcmV0ID0gZGV2ZnJlcV9ldmVudF9nZXRfZXZlbnQoZG1jZnJlcS0+ZWRldiwgJmVkYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXN0YXQtPmN1cnJlbnRfZnJlcXVlbmN5ID0gZG1jZnJlcS0+cmF0ZTsKKwlzdGF0LT5idXN5X3RpbWUgPSBlZGF0YS5sb2FkX2NvdW50OworCXN0YXQtPnRvdGFsX3RpbWUgPSBlZGF0YS50b3RhbF9jb3VudDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmszMzk5X2RtY2ZyZXFfZ2V0X2N1cl9mcmVxKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyAqZnJlcSkKK3sKKwlzdHJ1Y3QgcmszMzk5X2RtY2ZyZXEgKmRtY2ZyZXEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCSpmcmVxID0gZG1jZnJlcS0+cmF0ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRldmZyZXFfZGV2X3Byb2ZpbGUgcmszMzk5X2RldmZyZXFfZG1jX3Byb2ZpbGUgPSB7CisJLnBvbGxpbmdfbXMJPSAyMDAsCisJLnRhcmdldAkJPSByazMzOTlfZG1jZnJlcV90YXJnZXQsCisJLmdldF9kZXZfc3RhdHVzCT0gcmszMzk5X2RtY2ZyZXFfZ2V0X2Rldl9zdGF0dXMsCisJLmdldF9jdXJfZnJlcQk9IHJrMzM5OV9kbWNmcmVxX2dldF9jdXJfZnJlcSwKK307CisKK3N0YXRpYyBfX21heWJlX3VudXNlZCBpbnQgcmszMzk5X2RtY2ZyZXFfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJrMzM5OV9kbWNmcmVxICpkbWNmcmVxID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBkZXZmcmVxX2V2ZW50X2Rpc2FibGVfZWRldihkbWNmcmVxLT5lZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBkaXNhYmxlIHRoZSBkZXZmcmVxLWV2ZW50IGRldmljZXNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGRldmZyZXFfc3VzcGVuZF9kZXZpY2UoZG1jZnJlcS0+ZGV2ZnJlcSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gc3VzcGVuZCB0aGUgZGV2ZnJlcSBkZXZpY2VzXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9fbWF5YmVfdW51c2VkIGludCByazMzOTlfZG1jZnJlcV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCByazMzOTlfZG1jZnJlcSAqZG1jZnJlcSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZXQgPSAwOworCisJcmV0ID0gZGV2ZnJlcV9ldmVudF9lbmFibGVfZWRldihkbWNmcmVxLT5lZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBlbmFibGUgdGhlIGRldmZyZXEtZXZlbnQgZGV2aWNlc1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZGV2ZnJlcV9yZXN1bWVfZGV2aWNlKGRtY2ZyZXEtPmRldmZyZXEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlc3VtZSB0aGUgZGV2ZnJlcSBkZXZpY2VzXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKHJrMzM5OV9kbWNmcmVxX3BtLCByazMzOTlfZG1jZnJlcV9zdXNwZW5kLAorCQkJIHJrMzM5OV9kbWNmcmVxX3Jlc3VtZSk7CisKK3N0YXRpYyBpcnFyZXR1cm5fdCByazMzOTlfZG1jX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHJrMzM5OV9kbWNmcmVxICpkbWNmcmVxID0gZGV2X2lkOworCXN0cnVjdCBhcm1fc21jY2NfcmVzIHJlczsKKworCWRtY2ZyZXEtPndhaXRfZGNmX2ZsYWcgPSAwOworCXdha2VfdXAoJmRtY2ZyZXEtPndhaXRfZGNmX3F1ZXVlKTsKKworCS8qIENsZWFyIHRoZSBEQ0YgaW50ZXJydXB0ICovCisJYXJtX3NtY2NjX3NtYyhST0NLQ0hJUF9TSVBfRFJBTV9GUkVRLCAwLCAwLAorCQkgICAgICBST0NLQ0hJUF9TSVBfQ09ORklHX0RSQU1fQ0xSX0lSUSwKKwkJICAgICAgMCwgMCwgMCwgMCwgJnJlcyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgb2ZfZ2V0X2Rkcl90aW1pbmdzKHN0cnVjdCBkcmFtX3RpbWluZyAqdGltaW5nLAorCQkJICAgICAgc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAsZGRyM19zcGVlZF9iaW4iLAorCQkJCSAgICZ0aW1pbmctPmRkcjNfc3BlZWRfYmluKTsKKwlyZXQgfD0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxwZF9pZGxlIiwKKwkJCQkgICAgJnRpbWluZy0+cGRfaWRsZSk7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAsc3JfaWRsZSIsCisJCQkJICAgICZ0aW1pbmctPnNyX2lkbGUpOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLHNyX21jX2dhdGVfaWRsZSIsCisJCQkJICAgICZ0aW1pbmctPnNyX21jX2dhdGVfaWRsZSk7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAsc3JwZF9saXRlX2lkbGUiLAorCQkJCSAgICAmdGltaW5nLT5zcnBkX2xpdGVfaWRsZSk7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAsc3RhbmRieV9pZGxlIiwKKwkJCQkgICAgJnRpbWluZy0+c3RhbmRieV9pZGxlKTsKKwlyZXQgfD0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxhdXRvX3BkX2Rpc19mcmVxIiwKKwkJCQkgICAgJnRpbWluZy0+YXV0b19wZF9kaXNfZnJlcSk7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAsZHJhbV9kbGxfZGlzX2ZyZXEiLAorCQkJCSAgICAmdGltaW5nLT5kcmFtX2RsbF9kaXNfZnJlcSk7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAscGh5X2RsbF9kaXNfZnJlcSIsCisJCQkJICAgICZ0aW1pbmctPnBoeV9kbGxfZGlzX2ZyZXEpOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLGRkcjNfb2R0X2Rpc19mcmVxIiwKKwkJCQkgICAgJnRpbWluZy0+ZGRyM19vZHRfZGlzX2ZyZXEpOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLGRkcjNfZHJ2IiwKKwkJCQkgICAgJnRpbWluZy0+ZGRyM19kcnYpOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLGRkcjNfb2R0IiwKKwkJCQkgICAgJnRpbWluZy0+ZGRyM19vZHQpOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLHBoeV9kZHIzX2NhX2RydiIsCisJCQkJICAgICZ0aW1pbmctPnBoeV9kZHIzX2NhX2Rydik7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAscGh5X2RkcjNfZHFfZHJ2IiwKKwkJCQkgICAgJnRpbWluZy0+cGh5X2RkcjNfZHFfZHJ2KTsKKwlyZXQgfD0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxwaHlfZGRyM19vZHQiLAorCQkJCSAgICAmdGltaW5nLT5waHlfZGRyM19vZHQpOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLGxwZGRyM19vZHRfZGlzX2ZyZXEiLAorCQkJCSAgICAmdGltaW5nLT5scGRkcjNfb2R0X2Rpc19mcmVxKTsKKwlyZXQgfD0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxscGRkcjNfZHJ2IiwKKwkJCQkgICAgJnRpbWluZy0+bHBkZHIzX2Rydik7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAsbHBkZHIzX29kdCIsCisJCQkJICAgICZ0aW1pbmctPmxwZGRyM19vZHQpOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLHBoeV9scGRkcjNfY2FfZHJ2IiwKKwkJCQkgICAgJnRpbWluZy0+cGh5X2xwZGRyM19jYV9kcnYpOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLHBoeV9scGRkcjNfZHFfZHJ2IiwKKwkJCQkgICAgJnRpbWluZy0+cGh5X2xwZGRyM19kcV9kcnYpOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLHBoeV9scGRkcjNfb2R0IiwKKwkJCQkgICAgJnRpbWluZy0+cGh5X2xwZGRyM19vZHQpOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLGxwZGRyNF9vZHRfZGlzX2ZyZXEiLAorCQkJCSAgICAmdGltaW5nLT5scGRkcjRfb2R0X2Rpc19mcmVxKTsKKwlyZXQgfD0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxscGRkcjRfZHJ2IiwKKwkJCQkgICAgJnRpbWluZy0+bHBkZHI0X2Rydik7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAsbHBkZHI0X2RxX29kdCIsCisJCQkJICAgICZ0aW1pbmctPmxwZGRyNF9kcV9vZHQpOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLGxwZGRyNF9jYV9vZHQiLAorCQkJCSAgICAmdGltaW5nLT5scGRkcjRfY2Ffb2R0KTsKKwlyZXQgfD0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxwaHlfbHBkZHI0X2NhX2RydiIsCisJCQkJICAgICZ0aW1pbmctPnBoeV9scGRkcjRfY2FfZHJ2KTsKKwlyZXQgfD0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxwaHlfbHBkZHI0X2NrX2NzX2RydiIsCisJCQkJICAgICZ0aW1pbmctPnBoeV9scGRkcjRfY2tfY3NfZHJ2KTsKKwlyZXQgfD0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxwaHlfbHBkZHI0X2RxX2RydiIsCisJCQkJICAgICZ0aW1pbmctPnBoeV9scGRkcjRfZHFfZHJ2KTsKKwlyZXQgfD0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxwaHlfbHBkZHI0X29kdCIsCisJCQkJICAgICZ0aW1pbmctPnBoeV9scGRkcjRfb2R0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmszMzk5X2RtY2ZyZXFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJc3RydWN0IHJrMzM5OV9kbWNmcmVxICpkYXRhOworCWludCByZXQsIGlycSwgaW5kZXgsIHNpemU7CisJdWludDMyX3QgKnRpbWluZzsKKwlzdHJ1Y3QgZGV2X3BtX29wcCAqb3BwOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgZ2V0IHRoZSBkbWMgaW50ZXJydXB0IHJlc291cmNlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IHJrMzM5OV9kbWNmcmVxKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW11dGV4X2luaXQoJmRhdGEtPmxvY2spOworCisJZGF0YS0+dmRkX2NlbnRlciA9IGRldm1fcmVndWxhdG9yX2dldChkZXYsICJjZW50ZXIiKTsKKwlpZiAoSVNfRVJSKGRhdGEtPnZkZF9jZW50ZXIpKSB7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IGdldCB0aGUgcmVndWxhdG9yIFwiY2VudGVyXCJcbiIpOworCQlyZXR1cm4gUFRSX0VSUihkYXRhLT52ZGRfY2VudGVyKTsKKwl9CisKKwlkYXRhLT5kbWNfY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgImRtY19jbGsiKTsKKwlpZiAoSVNfRVJSKGRhdGEtPmRtY19jbGspKSB7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IGdldCB0aGUgY2xrIGRtY19jbGtcbiIpOworCQlyZXR1cm4gUFRSX0VSUihkYXRhLT5kbWNfY2xrKTsKKwl9OworCisJZGF0YS0+aXJxID0gaXJxOworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoZGV2LCBpcnEsIHJrMzM5OV9kbWNfaXJxLCAwLAorCQkJICAgICAgIGRldl9uYW1lKGRldiksIGRhdGEpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBkbWMgaXJxOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkYXRhLT53YWl0X2RjZl9xdWV1ZSk7CisJZGF0YS0+d2FpdF9kY2ZfZmxhZyA9IDA7CisKKwlkYXRhLT5lZGV2ID0gZGV2ZnJlcV9ldmVudF9nZXRfZWRldl9ieV9waGFuZGxlKGRldiwgMCk7CisJaWYgKElTX0VSUihkYXRhLT5lZGV2KSkKKwkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisKKwlyZXQgPSBkZXZmcmVxX2V2ZW50X2VuYWJsZV9lZGV2KGRhdGEtPmVkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBkZXZmcmVxLWV2ZW50IGRldmljZXNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qCisJICogR2V0IGRyYW0gdGltaW5nIGFuZCBwYXNzIGl0IHRvIGFybSB0cnVzdCBmaXJtd2FyZSwKKwkgKiB0aGUgZHJhbSBkcnZpZXIgaW4gYXJtIHRydXN0IGZpcm13YXJlIHdpbGwgZ2V0IHRoZXNlCisJICogdGltaW5nIGFuZCB0byBkbyBkcmFtIGluaXRpYWwuCisJICovCisJaWYgKCFvZl9nZXRfZGRyX3RpbWluZ3MoJmRhdGEtPnRpbWluZywgbnApKSB7CisJCXRpbWluZyA9ICZkYXRhLT50aW1pbmcuZGRyM19zcGVlZF9iaW47CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IGRyYW1fdGltaW5nKSAvIDQ7CisJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHNpemU7IGluZGV4KyspIHsKKwkJCWFybV9zbWNjY19zbWMoUk9DS0NISVBfU0lQX0RSQU1fRlJFUSwgKnRpbWluZysrLCBpbmRleCwKKwkJCQkgICAgICBST0NLQ0hJUF9TSVBfQ09ORklHX0RSQU1fU0VUX1BBUkFNLAorCQkJCSAgICAgIDAsIDAsIDAsIDAsICZyZXMpOworCQkJaWYgKHJlcy5hMCkgeworCQkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHNldCBkcmFtIHBhcmFtOiAlbGRcbiIsCisJCQkJCXJlcy5hMCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKwl9CisKKwlhcm1fc21jY2Nfc21jKFJPQ0tDSElQX1NJUF9EUkFNX0ZSRVEsIDAsIDAsCisJCSAgICAgIFJPQ0tDSElQX1NJUF9DT05GSUdfRFJBTV9JTklULAorCQkgICAgICAwLCAwLCAwLCAwLCAmcmVzKTsKKworCS8qCisJICogV2UgYWRkIGEgZGV2ZnJlcSBkcml2ZXIgdG8gb3VyIHBhcmVudCBzaW5jZSBpdCBoYXMgYSBkZXZpY2UgdHJlZSBub2RlCisJICogd2l0aCBvcGVyYXRpbmcgcG9pbnRzLgorCSAqLworCWlmIChkZXZfcG1fb3BwX29mX2FkZF90YWJsZShkZXYpKSB7CisJCWRldl9lcnIoZGV2LCAiSW52YWxpZCBvcGVyYXRpbmctcG9pbnRzIGluIGRldmljZSB0cmVlLlxuIik7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInVwdGhyZXNob2xkIiwKKwkJCSAgICAgJmRhdGEtPm9uZGVtYW5kX2RhdGEudXB0aHJlc2hvbGQpOworCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiZG93bmRpZmZlcmVudGlhbCIsCisJCQkgICAgICZkYXRhLT5vbmRlbWFuZF9kYXRhLmRvd25kaWZmZXJlbnRpYWwpOworCisJZGF0YS0+cmF0ZSA9IGNsa19nZXRfcmF0ZShkYXRhLT5kbWNfY2xrKTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlvcHAgPSBkZXZmcmVxX3JlY29tbWVuZGVkX29wcChkZXYsICZkYXRhLT5yYXRlLCAwKTsKKwlpZiAoSVNfRVJSKG9wcCkpIHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybiBQVFJfRVJSKG9wcCk7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCWRhdGEtPmN1cnJfb3BwID0gb3BwOworCisJcmszMzk5X2RldmZyZXFfZG1jX3Byb2ZpbGUuaW5pdGlhbF9mcmVxID0gZGF0YS0+cmF0ZTsKKworCWRhdGEtPmRldmZyZXEgPSBkZXZmcmVxX2FkZF9kZXZpY2UoZGV2LAorCQkJCQkgICAmcmszMzk5X2RldmZyZXFfZG1jX3Byb2ZpbGUsCisJCQkJCSAgICJzaW1wbGVfb25kZW1hbmQiLAorCQkJCQkgICAmZGF0YS0+b25kZW1hbmRfZGF0YSk7CisJaWYgKElTX0VSUihkYXRhLT5kZXZmcmVxKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGF0YS0+ZGV2ZnJlcSk7CisJZGV2bV9kZXZmcmVxX3JlZ2lzdGVyX29wcF9ub3RpZmllcihkZXYsIGRhdGEtPmRldmZyZXEpOworCisJZGF0YS0+ZGV2ID0gZGV2OworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJrMzM5OWRtY19kZXZmcmVxX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzOTktZG1jIiB9LAorCXsgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHJrMzM5OV9kbWNmcmVxX2RyaXZlciA9IHsKKwkucHJvYmUJPSByazMzOTlfZG1jZnJlcV9wcm9iZSwKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJyazMzOTktZG1jLWZyZXEiLAorCQkucG0JPSAmcmszMzk5X2RtY2ZyZXFfcG0sCisJCS5vZl9tYXRjaF90YWJsZSA9IHJrMzM5OWRtY19kZXZmcmVxX29mX21hdGNoLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihyazMzOTlfZG1jZnJlcV9kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQVVUSE9SKCJMaW4gSHVhbmcgPGhsQHJvY2stY2hpcHMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSSzMzOTkgZG1jZnJlcSBkcml2ZXIgd2l0aCBkZXZmcmVxIGZyYW1ld29yayIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEtYnVmL0tjb25maWcgYi9kcml2ZXJzL2RtYS1idWYvS2NvbmZpZwppbmRleCAyNWJjZmEwLi4yNTg1ODIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS1idWYvS2NvbmZpZworKysgYi9kcml2ZXJzL2RtYS1idWYvS2NvbmZpZwpAQCAtMTcsNCArMTcsMTcgQEAKIAkgIEZpbGVzIGZkcywgdG8gdGhlIERSTSBkcml2ZXIgZm9yIGV4YW1wbGUuIE1vcmUgZGV0YWlscyBhdAogCSAgRG9jdW1lbnRhdGlvbi9zeW5jX2ZpbGUudHh0LgogCitjb25maWcgU1dfU1lOQworCWJvb2wgIlN5bmMgRmlsZSBWYWxpZGF0aW9uIEZyYW1ld29yayIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFNZTkNfRklMRQorCWRlcGVuZHMgb24gREVCVUdfRlMKKwktLS1oZWxwLS0tCisJICBBIHN5bmMgb2JqZWN0IGRyaXZlciB0aGF0IHVzZXMgYSAzMmJpdCBjb3VudGVyIHRvIGNvb3JkaW5hdGUKKwkgIHN5bmNocm9uaXphdGlvbi4gIFVzZWZ1bCB3aGVuIHRoZXJlIGlzIG5vIGhhcmR3YXJlIHByaW1pdGl2ZSBiYWNraW5nCisJICB0aGUgc3luY2hyb25pemF0aW9uLgorCisJICBXQVJOSU5HOiBpbXByb3BlciB1c2Ugb2YgdGhpcyBjYW4gcmVzdWx0IGluIGRlYWRsb2NraW5nIGtlcm5lbAorCSAgZHJpdmVycyBmcm9tIHVzZXJzcGFjZS4gSW50ZW5kZWQgZm9yIHRlc3QgYW5kIGRlYnVnIG9ubHkuCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hLWJ1Zi9NYWtlZmlsZSBiL2RyaXZlcnMvZG1hLWJ1Zi9NYWtlZmlsZQppbmRleCBmMzUzZGIyLi4yMTBhMTBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS1idWYvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9kbWEtYnVmL01ha2VmaWxlCkBAIC0xLDIgKzEsMyBAQAogb2JqLXkgOj0gZG1hLWJ1Zi5vIGZlbmNlLm8gcmVzZXJ2YXRpb24ubyBzZXFuby1mZW5jZS5vIGZlbmNlLWFycmF5Lm8KIG9iai0kKENPTkZJR19TWU5DX0ZJTEUpCQkrPSBzeW5jX2ZpbGUubworb2JqLSQoQ09ORklHX1NXX1NZTkMpCQkrPSBzd19zeW5jLm8gc3luY19kZWJ1Zy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS1idWYvc3dfc3luYy5jIGIvZHJpdmVycy9kbWEtYnVmL3N3X3N5bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmU4ZTZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9kbWEtYnVmL3N3X3N5bmMuYwpAQCAtMCwwICsxLDM3NSBAQAorLyoKKyAqIFN5bmMgRmlsZSB2YWxpZGF0aW9uIGZyYW1ld29yaworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUsIEluYy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeW5jX2ZpbGUuaD4KKworI2luY2x1ZGUgInN5bmNfZGVidWcuaCIKKworI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCisjaW5jbHVkZSAic3luY190cmFjZS5oIgorCisvKgorICogU1cgU1lOQyB2YWxpZGF0aW9uIGZyYW1ld29yaworICoKKyAqIEEgc3luYyBvYmplY3QgZHJpdmVyIHRoYXQgdXNlcyBhIDMyYml0IGNvdW50ZXIgdG8gY29vcmRpbmF0ZQorICogc3luY2hyb25pemF0aW9uLiAgVXNlZnVsIHdoZW4gdGhlcmUgaXMgbm8gaGFyZHdhcmUgcHJpbWl0aXZlIGJhY2tpbmcKKyAqIHRoZSBzeW5jaHJvbml6YXRpb24uCisgKgorICogVG8gc3RhcnQgdGhlIGZyYW1ld29yayBqdXN0IG9wZW46CisgKgorICogPGRlYnVnZnM+L3N5bmMvc3dfc3luYworICoKKyAqIFRoYXQgd2lsbCBjcmVhdGUgYSBzeW5jIHRpbWVsaW5lLCBhbGwgZmVuY2VzIGNyZWF0ZWQgdW5kZXIgdGhpcyB0aW1lbGluZQorICogZmlsZSBkZXNjcmlwdG9yIHdpbGwgYmVsb25nIHRvIHRoZSB0aGlzIHRpbWVsaW5lLgorICoKKyAqIFRoZSAnc3dfc3luYycgZmlsZSBjYW4gYmUgb3BlbmVkIG1hbnkgdGltZXMgYXMgdG8gY3JlYXRlIGRpZmZlcmVudAorICogdGltZWxpbmVzLgorICoKKyAqIEZlbmNlcyBjYW4gYmUgY3JlYXRlZCB3aXRoIFNXX1NZTkNfSU9DX0NSRUFURV9GRU5DRSBpb2N0bCB3aXRoIHN0cnVjdAorICogc3dfc3luY19pb2N0bF9jcmVhdGVfZmVuY2UgYXMgcGFyYW1ldGVyLgorICoKKyAqIFRvIGluY3JlbWVudCB0aGUgdGltZWxpbmUgY291bnRlciwgU1dfU1lOQ19JT0NfSU5DIGlvY3RsIHNob3VsZCBiZSB1c2VkCisgKiB3aXRoIHRoZSBpbmNyZW1lbnQgYXMgdTMyLiBUaGlzIHdpbGwgdXBkYXRlIHRoZSBsYXN0IHNpZ25hbGVkIHZhbHVlCisgKiBmcm9tIHRoZSB0aW1lbGluZSBhbmQgc2lnbmFsIGFueSBmZW5jZSB0aGF0IGhhcyBhIHNlcW5vIHNtYWxsZXIgb3IgZXF1YWwKKyAqIHRvIGl0LgorICoKKyAqIHN0cnVjdCBzd19zeW5jX2lvY3RsX2NyZWF0ZV9mZW5jZQorICogQHZhbHVlOgl0aGUgc2Vxbm8gdG8gaW5pdGlhbGlzZSB0aGUgZmVuY2Ugd2l0aAorICogQG5hbWU6CXRoZSBuYW1lIG9mIHRoZSBuZXcgc3luYyBwb2ludAorICogQGZlbmNlOglyZXR1cm4gdGhlIGZkIG9mIHRoZSBuZXcgc3luY19maWxlIHdpdGggdGhlIGNyZWF0ZWQgZmVuY2UKKyAqLworc3RydWN0IHN3X3N5bmNfY3JlYXRlX2ZlbmNlX2RhdGEgeworCV9fdTMyCXZhbHVlOworCWNoYXIJbmFtZVszMl07CisJX19zMzIJZmVuY2U7IC8qIGZkIG9mIG5ldyBmZW5jZSAqLworfTsKKworI2RlZmluZSBTV19TWU5DX0lPQ19NQUdJQwknVycKKworI2RlZmluZSBTV19TWU5DX0lPQ19DUkVBVEVfRkVOQ0UJX0lPV1IoU1dfU1lOQ19JT0NfTUFHSUMsIDAsXAorCQlzdHJ1Y3Qgc3dfc3luY19jcmVhdGVfZmVuY2VfZGF0YSkKKworI2RlZmluZSBTV19TWU5DX0lPQ19JTkMJCQlfSU9XKFNXX1NZTkNfSU9DX01BR0lDLCAxLCBfX3UzMikKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmZW5jZV9vcHMgdGltZWxpbmVfZmVuY2Vfb3BzOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzeW5jX3B0ICpmZW5jZV90b19zeW5jX3B0KHN0cnVjdCBmZW5jZSAqZmVuY2UpCit7CisJaWYgKGZlbmNlLT5vcHMgIT0gJnRpbWVsaW5lX2ZlbmNlX29wcykKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihmZW5jZSwgc3RydWN0IHN5bmNfcHQsIGJhc2UpOworfQorCisvKioKKyAqIHN5bmNfdGltZWxpbmVfY3JlYXRlKCkgLSBjcmVhdGVzIGEgc3luYyBvYmplY3QKKyAqIEBuYW1lOglzeW5jX3RpbWVsaW5lIG5hbWUKKyAqCisgKiBDcmVhdGVzIGEgbmV3IHN5bmNfdGltZWxpbmUuIFJldHVybnMgdGhlIHN5bmNfdGltZWxpbmUgb2JqZWN0IG9yIE5VTEwgaW4KKyAqIGNhc2Ugb2YgZXJyb3IuCisgKi8KK3N0cnVjdCBzeW5jX3RpbWVsaW5lICpzeW5jX3RpbWVsaW5lX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmo7CisKKwlvYmogPSBremFsbG9jKHNpemVvZigqb2JqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvYmopCisJCXJldHVybiBOVUxMOworCisJa3JlZl9pbml0KCZvYmotPmtyZWYpOworCW9iai0+Y29udGV4dCA9IGZlbmNlX2NvbnRleHRfYWxsb2MoMSk7CisJc3RybGNweShvYmotPm5hbWUsIG5hbWUsIHNpemVvZihvYmotPm5hbWUpKTsKKworCUlOSVRfTElTVF9IRUFEKCZvYmotPmNoaWxkX2xpc3RfaGVhZCk7CisJSU5JVF9MSVNUX0hFQUQoJm9iai0+YWN0aXZlX2xpc3RfaGVhZCk7CisJc3Bpbl9sb2NrX2luaXQoJm9iai0+Y2hpbGRfbGlzdF9sb2NrKTsKKworCXN5bmNfdGltZWxpbmVfZGVidWdfYWRkKG9iaik7CisKKwlyZXR1cm4gb2JqOworfQorCitzdGF0aWMgdm9pZCBzeW5jX3RpbWVsaW5lX2ZyZWUoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaiA9CisJCWNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3Qgc3luY190aW1lbGluZSwga3JlZik7CisKKwlzeW5jX3RpbWVsaW5lX2RlYnVnX3JlbW92ZShvYmopOworCisJa2ZyZWUob2JqKTsKK30KKworc3RhdGljIHZvaWQgc3luY190aW1lbGluZV9nZXQoc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaikKK3sKKwlrcmVmX2dldCgmb2JqLT5rcmVmKTsKK30KKworc3RhdGljIHZvaWQgc3luY190aW1lbGluZV9wdXQoc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaikKK3sKKwlrcmVmX3B1dCgmb2JqLT5rcmVmLCBzeW5jX3RpbWVsaW5lX2ZyZWUpOworfQorCisvKioKKyAqIHN5bmNfdGltZWxpbmVfc2lnbmFsKCkgLSBzaWduYWwgYSBzdGF0dXMgY2hhbmdlIG9uIGEgc3luY190aW1lbGluZQorICogQG9iajoJc3luY190aW1lbGluZSB0byBzaWduYWwKKyAqIEBpbmM6CW51bSB0byBpbmNyZW1lbnQgb24gdGltZWxpbmUtPnZhbHVlCisgKgorICogQSBzeW5jIGltcGxlbWVudGF0aW9uIHNob3VsZCBjYWxsIHRoaXMgYW55IHRpbWUgb25lIG9mIGl0J3MgZmVuY2VzCisgKiBoYXMgc2lnbmFsZWQgb3IgaGFzIGFuIGVycm9yIGNvbmRpdGlvbi4KKyAqLworc3RhdGljIHZvaWQgc3luY190aW1lbGluZV9zaWduYWwoc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaiwgdW5zaWduZWQgaW50IGluYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzeW5jX3B0ICpwdCwgKm5leHQ7CisKKwl0cmFjZV9zeW5jX3RpbWVsaW5lKG9iaik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb2JqLT5jaGlsZF9saXN0X2xvY2ssIGZsYWdzKTsKKworCW9iai0+dmFsdWUgKz0gaW5jOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB0LCBuZXh0LCAmb2JqLT5hY3RpdmVfbGlzdF9oZWFkLAorCQkJCSBhY3RpdmVfbGlzdCkgeworCQlpZiAoZmVuY2VfaXNfc2lnbmFsZWRfbG9ja2VkKCZwdC0+YmFzZSkpCisJCQlsaXN0X2RlbF9pbml0KCZwdC0+YWN0aXZlX2xpc3QpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9iai0+Y2hpbGRfbGlzdF9sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogc3luY19wdF9jcmVhdGUoKSAtIGNyZWF0ZXMgYSBzeW5jIHB0CisgKiBAcGFyZW50OglmZW5jZSdzIHBhcmVudCBzeW5jX3RpbWVsaW5lCisgKiBAc2l6ZToJc2l6ZSB0byBhbGxvY2F0ZSBmb3IgdGhpcyBwdAorICogQGluYzoJdmFsdWUgb2YgdGhlIGZlbmNlCisgKgorICogQ3JlYXRlcyBhIG5ldyBzeW5jX3B0IGFzIGEgY2hpbGQgb2YgQHBhcmVudC4gIEBzaXplIGJ5dGVzIHdpbGwgYmUKKyAqIGFsbG9jYXRlZCBhbGxvd2luZyBmb3IgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgZGF0YSB0byBiZSBrZXB0IGFmdGVyCisgKiB0aGUgZ2VuZXJpYyBzeW5jX3RpbWVsaW5lIHN0cnVjdC4gUmV0dXJucyB0aGUgc3luY19wdCBvYmplY3Qgb3IKKyAqIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KKyAqLworc3RhdGljIHN0cnVjdCBzeW5jX3B0ICpzeW5jX3B0X2NyZWF0ZShzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqLCBpbnQgc2l6ZSwKKwkJCSAgICAgdW5zaWduZWQgaW50IHZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHN5bmNfcHQgKnB0OworCisJaWYgKHNpemUgPCBzaXplb2YoKnB0KSkKKwkJcmV0dXJuIE5VTEw7CisKKwlwdCA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwdCkKKwkJcmV0dXJuIE5VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb2JqLT5jaGlsZF9saXN0X2xvY2ssIGZsYWdzKTsKKwlzeW5jX3RpbWVsaW5lX2dldChvYmopOworCWZlbmNlX2luaXQoJnB0LT5iYXNlLCAmdGltZWxpbmVfZmVuY2Vfb3BzLCAmb2JqLT5jaGlsZF9saXN0X2xvY2ssCisJCSAgIG9iai0+Y29udGV4dCwgdmFsdWUpOworCWxpc3RfYWRkX3RhaWwoJnB0LT5jaGlsZF9saXN0LCAmb2JqLT5jaGlsZF9saXN0X2hlYWQpOworCUlOSVRfTElTVF9IRUFEKCZwdC0+YWN0aXZlX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9iai0+Y2hpbGRfbGlzdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHB0OworfQorCitzdGF0aWMgY29uc3QgY2hhciAqdGltZWxpbmVfZmVuY2VfZ2V0X2RyaXZlcl9uYW1lKHN0cnVjdCBmZW5jZSAqZmVuY2UpCit7CisJcmV0dXJuICJzd19zeW5jIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnRpbWVsaW5lX2ZlbmNlX2dldF90aW1lbGluZV9uYW1lKHN0cnVjdCBmZW5jZSAqZmVuY2UpCit7CisJc3RydWN0IHN5bmNfdGltZWxpbmUgKnBhcmVudCA9IGZlbmNlX3BhcmVudChmZW5jZSk7CisKKwlyZXR1cm4gcGFyZW50LT5uYW1lOworfQorCitzdGF0aWMgdm9pZCB0aW1lbGluZV9mZW5jZV9yZWxlYXNlKHN0cnVjdCBmZW5jZSAqZmVuY2UpCit7CisJc3RydWN0IHN5bmNfcHQgKnB0ID0gZmVuY2VfdG9fc3luY19wdChmZW5jZSk7CisJc3RydWN0IHN5bmNfdGltZWxpbmUgKnBhcmVudCA9IGZlbmNlX3BhcmVudChmZW5jZSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKGZlbmNlLT5sb2NrLCBmbGFncyk7CisJbGlzdF9kZWwoJnB0LT5jaGlsZF9saXN0KTsKKwlpZiAoIWxpc3RfZW1wdHkoJnB0LT5hY3RpdmVfbGlzdCkpCisJCWxpc3RfZGVsKCZwdC0+YWN0aXZlX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZmVuY2UtPmxvY2ssIGZsYWdzKTsKKworCXN5bmNfdGltZWxpbmVfcHV0KHBhcmVudCk7CisJZmVuY2VfZnJlZShmZW5jZSk7Cit9CisKK3N0YXRpYyBib29sIHRpbWVsaW5lX2ZlbmNlX3NpZ25hbGVkKHN0cnVjdCBmZW5jZSAqZmVuY2UpCit7CisJc3RydWN0IHN5bmNfdGltZWxpbmUgKnBhcmVudCA9IGZlbmNlX3BhcmVudChmZW5jZSk7CisKKwlyZXR1cm4gKGZlbmNlLT5zZXFubyA+IHBhcmVudC0+dmFsdWUpID8gZmFsc2UgOiB0cnVlOworfQorCitzdGF0aWMgYm9vbCB0aW1lbGluZV9mZW5jZV9lbmFibGVfc2lnbmFsaW5nKHN0cnVjdCBmZW5jZSAqZmVuY2UpCit7CisJc3RydWN0IHN5bmNfcHQgKnB0ID0gZmVuY2VfdG9fc3luY19wdChmZW5jZSk7CisJc3RydWN0IHN5bmNfdGltZWxpbmUgKnBhcmVudCA9IGZlbmNlX3BhcmVudChmZW5jZSk7CisKKwlpZiAodGltZWxpbmVfZmVuY2Vfc2lnbmFsZWQoZmVuY2UpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlsaXN0X2FkZF90YWlsKCZwdC0+YWN0aXZlX2xpc3QsICZwYXJlbnQtPmFjdGl2ZV9saXN0X2hlYWQpOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCB0aW1lbGluZV9mZW5jZV92YWx1ZV9zdHIoc3RydWN0IGZlbmNlICpmZW5jZSwKKwkJCQkgICAgY2hhciAqc3RyLCBpbnQgc2l6ZSkKK3sKKwlzbnByaW50ZihzdHIsIHNpemUsICIlZCIsIGZlbmNlLT5zZXFubyk7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVsaW5lX2ZlbmNlX3RpbWVsaW5lX3ZhbHVlX3N0cihzdHJ1Y3QgZmVuY2UgKmZlbmNlLAorCQkJCQkgICAgIGNoYXIgKnN0ciwgaW50IHNpemUpCit7CisJc3RydWN0IHN5bmNfdGltZWxpbmUgKnBhcmVudCA9IGZlbmNlX3BhcmVudChmZW5jZSk7CisKKwlzbnByaW50ZihzdHIsIHNpemUsICIlZCIsIHBhcmVudC0+dmFsdWUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZlbmNlX29wcyB0aW1lbGluZV9mZW5jZV9vcHMgPSB7CisJLmdldF9kcml2ZXJfbmFtZSA9IHRpbWVsaW5lX2ZlbmNlX2dldF9kcml2ZXJfbmFtZSwKKwkuZ2V0X3RpbWVsaW5lX25hbWUgPSB0aW1lbGluZV9mZW5jZV9nZXRfdGltZWxpbmVfbmFtZSwKKwkuZW5hYmxlX3NpZ25hbGluZyA9IHRpbWVsaW5lX2ZlbmNlX2VuYWJsZV9zaWduYWxpbmcsCisJLnNpZ25hbGVkID0gdGltZWxpbmVfZmVuY2Vfc2lnbmFsZWQsCisJLndhaXQgPSBmZW5jZV9kZWZhdWx0X3dhaXQsCisJLnJlbGVhc2UgPSB0aW1lbGluZV9mZW5jZV9yZWxlYXNlLAorCS5mZW5jZV92YWx1ZV9zdHIgPSB0aW1lbGluZV9mZW5jZV92YWx1ZV9zdHIsCisJLnRpbWVsaW5lX3ZhbHVlX3N0ciA9IHRpbWVsaW5lX2ZlbmNlX3RpbWVsaW5lX3ZhbHVlX3N0ciwKK307CisKKy8qCisgKiAqV0FSTklORyoKKyAqCisgKiBpbXByb3BlciB1c2Ugb2YgdGhpcyBjYW4gcmVzdWx0IGluIGRlYWRsb2NraW5nIGtlcm5lbCBkcml2ZXJzIGZyb20gdXNlcnNwYWNlLgorICovCisKKy8qIG9wZW5pbmcgc3dfc3luYyBjcmVhdGUgYSBuZXcgc3luYyBvYmogKi8KK3N0YXRpYyBpbnQgc3dfc3luY19kZWJ1Z2ZzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iajsKKwljaGFyIHRhc2tfY29tbVtUQVNLX0NPTU1fTEVOXTsKKworCWdldF90YXNrX2NvbW0odGFza19jb21tLCBjdXJyZW50KTsKKworCW9iaiA9IHN5bmNfdGltZWxpbmVfY3JlYXRlKHRhc2tfY29tbSk7CisJaWYgKCFvYmopCisJCXJldHVybiAtRU5PTUVNOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gb2JqOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3dfc3luY19kZWJ1Z2ZzX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXNtcF93bWIoKTsKKworCXN5bmNfdGltZWxpbmVfcHV0KG9iaik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nIHN3X3N5bmNfaW9jdGxfY3JlYXRlX2ZlbmNlKHN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmosCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBmZCA9IGdldF91bnVzZWRfZmRfZmxhZ3MoT19DTE9FWEVDKTsKKwlpbnQgZXJyOworCXN0cnVjdCBzeW5jX3B0ICpwdDsKKwlzdHJ1Y3Qgc3luY19maWxlICpzeW5jX2ZpbGU7CisJc3RydWN0IHN3X3N5bmNfY3JlYXRlX2ZlbmNlX2RhdGEgZGF0YTsKKworCWlmIChmZCA8IDApCisJCXJldHVybiBmZDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZGF0YSwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoZGF0YSkpKSB7CisJCWVyciA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyOworCX0KKworCXB0ID0gc3luY19wdF9jcmVhdGUob2JqLCBzaXplb2YoKnB0KSwgZGF0YS52YWx1ZSk7CisJaWYgKCFwdCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwlzeW5jX2ZpbGUgPSBzeW5jX2ZpbGVfY3JlYXRlKCZwdC0+YmFzZSk7CisJaWYgKCFzeW5jX2ZpbGUpIHsKKwkJZmVuY2VfcHV0KCZwdC0+YmFzZSk7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCWRhdGEuZmVuY2UgPSBmZDsKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmRhdGEsIHNpemVvZihkYXRhKSkpIHsKKwkJZnB1dChzeW5jX2ZpbGUtPmZpbGUpOworCQllcnIgPSAtRUZBVUxUOworCQlnb3RvIGVycjsKKwl9CisKKwlmZF9pbnN0YWxsKGZkLCBzeW5jX2ZpbGUtPmZpbGUpOworCisJcmV0dXJuIDA7CisKK2VycjoKKwlwdXRfdW51c2VkX2ZkKGZkKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgbG9uZyBzd19zeW5jX2lvY3RsX2luYyhzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl1MzIgdmFsdWU7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnZhbHVlLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZih2YWx1ZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN5bmNfdGltZWxpbmVfc2lnbmFsKG9iaiwgdmFsdWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nIHN3X3N5bmNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmogPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU1dfU1lOQ19JT0NfQ1JFQVRFX0ZFTkNFOgorCQlyZXR1cm4gc3dfc3luY19pb2N0bF9jcmVhdGVfZmVuY2Uob2JqLCBhcmcpOworCisJY2FzZSBTV19TWU5DX0lPQ19JTkM6CisJCXJldHVybiBzd19zeW5jX2lvY3RsX2luYyhvYmosIGFyZyk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1RUWTsKKwl9Cit9CisKK2NvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3dfc3luY19kZWJ1Z2ZzX2ZvcHMgPSB7CisJLm9wZW4gICAgICAgICAgID0gc3dfc3luY19kZWJ1Z2ZzX29wZW4sCisJLnJlbGVhc2UgICAgICAgID0gc3dfc3luY19kZWJ1Z2ZzX3JlbGVhc2UsCisJLnVubG9ja2VkX2lvY3RsID0gc3dfc3luY19pb2N0bCwKKwkuY29tcGF0X2lvY3RsCT0gc3dfc3luY19pb2N0bCwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS1idWYvc3luY19kZWJ1Zy5jIGIvZHJpdmVycy9kbWEtYnVmL3N5bmNfZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWI5NTIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9kbWEtYnVmL3N5bmNfZGVidWcuYwpAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIFN5bmMgRmlsZSB2YWxpZGF0aW9uIGZyYW1ld29yayBhbmQgZGVidWcgaW5mb3JtYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlLCBJbmMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlICJzeW5jX2RlYnVnLmgiCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkYmdmczsKKworc3RhdGljIExJU1RfSEVBRChzeW5jX3RpbWVsaW5lX2xpc3RfaGVhZCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN5bmNfdGltZWxpbmVfbGlzdF9sb2NrKTsKK3N0YXRpYyBMSVNUX0hFQUQoc3luY19maWxlX2xpc3RfaGVhZCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN5bmNfZmlsZV9saXN0X2xvY2spOworCit2b2lkIHN5bmNfdGltZWxpbmVfZGVidWdfYWRkKHN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmopCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzeW5jX3RpbWVsaW5lX2xpc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJm9iai0+c3luY190aW1lbGluZV9saXN0LCAmc3luY190aW1lbGluZV9saXN0X2hlYWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN5bmNfdGltZWxpbmVfbGlzdF9sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgc3luY190aW1lbGluZV9kZWJ1Z19yZW1vdmUoc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN5bmNfdGltZWxpbmVfbGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9kZWwoJm9iai0+c3luY190aW1lbGluZV9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzeW5jX3RpbWVsaW5lX2xpc3RfbG9jaywgZmxhZ3MpOworfQorCit2b2lkIHN5bmNfZmlsZV9kZWJ1Z19hZGQoc3RydWN0IHN5bmNfZmlsZSAqc3luY19maWxlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3luY19maWxlX2xpc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJnN5bmNfZmlsZS0+c3luY19maWxlX2xpc3QsICZzeW5jX2ZpbGVfbGlzdF9oZWFkKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzeW5jX2ZpbGVfbGlzdF9sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgc3luY19maWxlX2RlYnVnX3JlbW92ZShzdHJ1Y3Qgc3luY19maWxlICpzeW5jX2ZpbGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzeW5jX2ZpbGVfbGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9kZWwoJnN5bmNfZmlsZS0+c3luY19maWxlX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN5bmNfZmlsZV9saXN0X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnN5bmNfc3RhdHVzX3N0cihpbnQgc3RhdHVzKQoreworCWlmIChzdGF0dXMgPT0gMCkKKwkJcmV0dXJuICJzaWduYWxlZCI7CisKKwlpZiAoc3RhdHVzID4gMCkKKwkJcmV0dXJuICJhY3RpdmUiOworCisJcmV0dXJuICJlcnJvciI7Cit9CisKK3N0YXRpYyB2b2lkIHN5bmNfcHJpbnRfZmVuY2Uoc3RydWN0IHNlcV9maWxlICpzLCBzdHJ1Y3QgZmVuY2UgKmZlbmNlLCBib29sIHNob3cpCit7CisJaW50IHN0YXR1cyA9IDE7CisJc3RydWN0IHN5bmNfdGltZWxpbmUgKnBhcmVudCA9IGZlbmNlX3BhcmVudChmZW5jZSk7CisKKwlpZiAoZmVuY2VfaXNfc2lnbmFsZWRfbG9ja2VkKGZlbmNlKSkKKwkJc3RhdHVzID0gZmVuY2UtPnN0YXR1czsKKworCXNlcV9wcmludGYocywgIiAgJXMlc2ZlbmNlICVzIiwKKwkJICAgc2hvdyA/IHBhcmVudC0+bmFtZSA6ICIiLAorCQkgICBzaG93ID8gIl8iIDogIiIsCisJCSAgIHN5bmNfc3RhdHVzX3N0cihzdGF0dXMpKTsKKworCWlmIChzdGF0dXMgPD0gMCkgeworCQlzdHJ1Y3QgdGltZXNwZWM2NCB0czY0ID0KKwkJCWt0aW1lX3RvX3RpbWVzcGVjNjQoZmVuY2UtPnRpbWVzdGFtcCk7CisKKwkJc2VxX3ByaW50ZihzLCAiQCVsbGQuJTA5bGQiLCAoczY0KXRzNjQudHZfc2VjLCB0czY0LnR2X25zZWMpOworCX0KKworCWlmIChmZW5jZS0+b3BzLT50aW1lbGluZV92YWx1ZV9zdHIgJiYKKwkJZmVuY2UtPm9wcy0+ZmVuY2VfdmFsdWVfc3RyKSB7CisJCWNoYXIgdmFsdWVbNjRdOworCQlib29sIHN1Y2Nlc3M7CisKKwkJZmVuY2UtPm9wcy0+ZmVuY2VfdmFsdWVfc3RyKGZlbmNlLCB2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7CisJCXN1Y2Nlc3MgPSBzdHJsZW4odmFsdWUpOworCisJCWlmIChzdWNjZXNzKSB7CisJCQlzZXFfcHJpbnRmKHMsICI6ICVzIiwgdmFsdWUpOworCisJCQlmZW5jZS0+b3BzLT50aW1lbGluZV92YWx1ZV9zdHIoZmVuY2UsIHZhbHVlLAorCQkJCQkJICAgICAgIHNpemVvZih2YWx1ZSkpOworCisJCQlpZiAoc3RybGVuKHZhbHVlKSkKKwkJCQlzZXFfcHJpbnRmKHMsICIgLyAlcyIsIHZhbHVlKTsKKwkJfQorCX0KKworCXNlcV9wdXRzKHMsICJcbiIpOworfQorCitzdGF0aWMgdm9pZCBzeW5jX3ByaW50X29iaihzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmopCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzZXFfcHJpbnRmKHMsICIlczogJWRcbiIsIG9iai0+bmFtZSwgb2JqLT52YWx1ZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb2JqLT5jaGlsZF9saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJm9iai0+Y2hpbGRfbGlzdF9oZWFkKSB7CisJCXN0cnVjdCBzeW5jX3B0ICpwdCA9CisJCQljb250YWluZXJfb2YocG9zLCBzdHJ1Y3Qgc3luY19wdCwgY2hpbGRfbGlzdCk7CisJCXN5bmNfcHJpbnRfZmVuY2UocywgJnB0LT5iYXNlLCBmYWxzZSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9iai0+Y2hpbGRfbGlzdF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHN5bmNfcHJpbnRfc3luY19maWxlKHN0cnVjdCBzZXFfZmlsZSAqcywKKwkJCQkgIHN0cnVjdCBzeW5jX2ZpbGUgKnN5bmNfZmlsZSkKK3sKKwlpbnQgaTsKKworCXNlcV9wcmludGYocywgIlslcF0gJXM6ICVzXG4iLCBzeW5jX2ZpbGUsIHN5bmNfZmlsZS0+bmFtZSwKKwkJICAgc3luY19zdGF0dXNfc3RyKGF0b21pY19yZWFkKCZzeW5jX2ZpbGUtPnN0YXR1cykpKTsKKworCWZvciAoaSA9IDA7IGkgPCBzeW5jX2ZpbGUtPm51bV9mZW5jZXM7ICsraSkKKwkJc3luY19wcmludF9mZW5jZShzLCBzeW5jX2ZpbGUtPmNic1tpXS5mZW5jZSwgdHJ1ZSk7Cit9CisKK3N0YXRpYyBpbnQgc3luY19kZWJ1Z2ZzX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp1bnVzZWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisKKwlzZXFfcHV0cyhzLCAib2Jqczpcbi0tLS0tLS0tLS0tLS0tXG4iKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzeW5jX3RpbWVsaW5lX2xpc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2gocG9zLCAmc3luY190aW1lbGluZV9saXN0X2hlYWQpIHsKKwkJc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaiA9CisJCQljb250YWluZXJfb2YocG9zLCBzdHJ1Y3Qgc3luY190aW1lbGluZSwKKwkJCQkgICAgIHN5bmNfdGltZWxpbmVfbGlzdCk7CisKKwkJc3luY19wcmludF9vYmoocywgb2JqKTsKKwkJc2VxX3B1dHMocywgIlxuIik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN5bmNfdGltZWxpbmVfbGlzdF9sb2NrLCBmbGFncyk7CisKKwlzZXFfcHV0cyhzLCAiZmVuY2VzOlxuLS0tLS0tLS0tLS0tLS1cbiIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN5bmNfZmlsZV9saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJnN5bmNfZmlsZV9saXN0X2hlYWQpIHsKKwkJc3RydWN0IHN5bmNfZmlsZSAqc3luY19maWxlID0KKwkJCWNvbnRhaW5lcl9vZihwb3MsIHN0cnVjdCBzeW5jX2ZpbGUsIHN5bmNfZmlsZV9saXN0KTsKKworCQlzeW5jX3ByaW50X3N5bmNfZmlsZShzLCBzeW5jX2ZpbGUpOworCQlzZXFfcHV0cyhzLCAiXG4iKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3luY19maWxlX2xpc3RfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN5bmNfaW5mb19kZWJ1Z2ZzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHN5bmNfZGVidWdmc19zaG93LCBpbm9kZS0+aV9wcml2YXRlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3luY19pbmZvX2RlYnVnZnNfZm9wcyA9IHsKKwkub3BlbiAgICAgICAgICAgPSBzeW5jX2luZm9fZGVidWdmc19vcGVuLAorCS5yZWFkICAgICAgICAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgICAgICAgICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSAgICAgICAgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IHN5bmNfZGVidWdmc19pbml0KHZvaWQpCit7CisJZGJnZnMgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoInN5bmMiLCBOVUxMKTsKKworCS8qCisJICogVGhlIGRlYnVnZnMgZmlsZXMgd29uJ3QgZXZlciBnZXQgcmVtb3ZlZCBhbmQgdGh1cywgdGhlcmUgaXMKKwkgKiBubyBuZWVkIHRvIHByb3RlY3QgaXQgYWdhaW5zdCByZW1vdmFsIHJhY2VzLiBUaGUgdXNlIG9mCisJICogZGVidWdmc19jcmVhdGVfZmlsZV91bnNhZmUoKSBpcyBhY3R1YWxseSBzYWZlIGhlcmUuCisJICovCisJZGVidWdmc19jcmVhdGVfZmlsZV91bnNhZmUoImluZm8iLCAwNDQ0LCBkYmdmcywgTlVMTCwKKwkJCQkgICAmc3luY19pbmZvX2RlYnVnZnNfZm9wcyk7CisJZGVidWdmc19jcmVhdGVfZmlsZV91bnNhZmUoInN3X3N5bmMiLCAwNjQ0LCBkYmdmcywgTlVMTCwKKwkJCQkgICAmc3dfc3luY19kZWJ1Z2ZzX2ZvcHMpOworCisJcmV0dXJuIDA7Cit9CitsYXRlX2luaXRjYWxsKHN5bmNfZGVidWdmc19pbml0KTsKKworI2RlZmluZSBEVU1QX0NIVU5LIDI1Ngorc3RhdGljIGNoYXIgc3luY19kdW1wX2J1Zls2NCAqIDEwMjRdOwordm9pZCBzeW5jX2R1bXAodm9pZCkKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgcyA9IHsKKwkJLmJ1ZiA9IHN5bmNfZHVtcF9idWYsCisJCS5zaXplID0gc2l6ZW9mKHN5bmNfZHVtcF9idWYpIC0gMSwKKwl9OworCWludCBpOworCisJc3luY19kZWJ1Z2ZzX3Nob3coJnMsIE5VTEwpOworCisJZm9yIChpID0gMDsgaSA8IHMuY291bnQ7IGkgKz0gRFVNUF9DSFVOSykgeworCQlpZiAoKHMuY291bnQgLSBpKSA+IERVTVBfQ0hVTkspIHsKKwkJCWNoYXIgYyA9IHMuYnVmW2kgKyBEVU1QX0NIVU5LXTsKKworCQkJcy5idWZbaSArIERVTVBfQ0hVTktdID0gMDsKKwkJCXByX2NvbnQoIiVzIiwgcy5idWYgKyBpKTsKKwkJCXMuYnVmW2kgKyBEVU1QX0NIVU5LXSA9IGM7CisJCX0gZWxzZSB7CisJCQlzLmJ1ZltzLmNvdW50XSA9IDA7CisJCQlwcl9jb250KCIlcyIsIHMuYnVmICsgaSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS1idWYvc3luY19kZWJ1Zy5oIGIvZHJpdmVycy9kbWEtYnVmL3N5bmNfZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjY5YWE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9kbWEtYnVmL3N5bmNfZGVidWcuaApAQCAtMCwwICsxLDg0IEBACisvKgorICogU3luYyBGaWxlIHZhbGlkYXRpb24gZnJhbWV3b3JrIGFuZCBkZWJ1ZyBpbmZvbWF0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgX0xJTlVYX1NZTkNfSAorI2RlZmluZSBfTElOVVhfU1lOQ19ICisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9mZW5jZS5oPgorCisjaW5jbHVkZSA8bGludXgvc3luY19maWxlLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9zeW5jX2ZpbGUuaD4KKworLyoqCisgKiBzdHJ1Y3Qgc3luY190aW1lbGluZSAtIHN5bmMgb2JqZWN0CisgKiBAa3JlZjoJCXJlZmVyZW5jZSBjb3VudCBvbiBmZW5jZS4KKyAqIEBuYW1lOgkJbmFtZSBvZiB0aGUgc3luY190aW1lbGluZS4gVXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyAqIEBjaGlsZF9saXN0X2hlYWQ6CWxpc3Qgb2YgY2hpbGRyZW4gc3luY19wdHMgZm9yIHRoaXMgc3luY190aW1lbGluZQorICogQGNoaWxkX2xpc3RfbG9jazoJbG9jayBwcm90ZWN0aW5nIEBjaGlsZF9saXN0X2hlYWQgYW5kIGZlbmNlLnN0YXR1cworICogQGFjdGl2ZV9saXN0X2hlYWQ6CWxpc3Qgb2YgYWN0aXZlICh1bnNpZ25hbGVkL2Vycm9yZWQpIHN5bmNfcHRzCisgKiBAc3luY190aW1lbGluZV9saXN0OgltZW1iZXJzaGlwIGluIGdsb2JhbCBzeW5jX3RpbWVsaW5lX2xpc3QKKyAqLworc3RydWN0IHN5bmNfdGltZWxpbmUgeworCXN0cnVjdCBrcmVmCQlrcmVmOworCWNoYXIJCQluYW1lWzMyXTsKKworCS8qIHByb3RlY3RlZCBieSBjaGlsZF9saXN0X2xvY2sgKi8KKwl1NjQJCQljb250ZXh0OworCWludAkJCXZhbHVlOworCisJc3RydWN0IGxpc3RfaGVhZAljaGlsZF9saXN0X2hlYWQ7CisJc3BpbmxvY2tfdAkJY2hpbGRfbGlzdF9sb2NrOworCisJc3RydWN0IGxpc3RfaGVhZAlhY3RpdmVfbGlzdF9oZWFkOworCisJc3RydWN0IGxpc3RfaGVhZAlzeW5jX3RpbWVsaW5lX2xpc3Q7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzeW5jX3RpbWVsaW5lICpmZW5jZV9wYXJlbnQoc3RydWN0IGZlbmNlICpmZW5jZSkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGZlbmNlLT5sb2NrLCBzdHJ1Y3Qgc3luY190aW1lbGluZSwKKwkJCSAgICBjaGlsZF9saXN0X2xvY2spOworfQorCisvKioKKyAqIHN0cnVjdCBzeW5jX3B0IC0gc3luY19wdCBvYmplY3QKKyAqIEBiYXNlOiBiYXNlIGZlbmNlIG9iamVjdAorICogQGNoaWxkX2xpc3Q6IHN5bmMgdGltZWxpbmUgY2hpbGQncyBsaXN0CisgKiBAYWN0aXZlX2xpc3Q6IHN5bmMgdGltZWxpbmUgYWN0aXZlIGNoaWxkJ3MgbGlzdAorICovCitzdHJ1Y3Qgc3luY19wdCB7CisJc3RydWN0IGZlbmNlIGJhc2U7CisJc3RydWN0IGxpc3RfaGVhZCBjaGlsZF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgYWN0aXZlX2xpc3Q7Cit9OworCisjaWZkZWYgQ09ORklHX1NXX1NZTkMKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3dfc3luY19kZWJ1Z2ZzX2ZvcHM7CisKK3ZvaWQgc3luY190aW1lbGluZV9kZWJ1Z19hZGQoc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaik7Cit2b2lkIHN5bmNfdGltZWxpbmVfZGVidWdfcmVtb3ZlKHN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmopOwordm9pZCBzeW5jX2ZpbGVfZGVidWdfYWRkKHN0cnVjdCBzeW5jX2ZpbGUgKmZlbmNlKTsKK3ZvaWQgc3luY19maWxlX2RlYnVnX3JlbW92ZShzdHJ1Y3Qgc3luY19maWxlICpmZW5jZSk7Cit2b2lkIHN5bmNfZHVtcCh2b2lkKTsKKworI2Vsc2UKKyMgZGVmaW5lIHN5bmNfdGltZWxpbmVfZGVidWdfYWRkKG9iaikKKyMgZGVmaW5lIHN5bmNfdGltZWxpbmVfZGVidWdfcmVtb3ZlKG9iaikKKyMgZGVmaW5lIHN5bmNfZmlsZV9kZWJ1Z19hZGQoZmVuY2UpCisjIGRlZmluZSBzeW5jX2ZpbGVfZGVidWdfcmVtb3ZlKGZlbmNlKQorIyBkZWZpbmUgc3luY19kdW1wKCkKKyNlbmRpZgorCisjZW5kaWYgLyogX0xJTlVYX1NZTkNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEtYnVmL3N5bmNfdHJhY2UuaCBiL2RyaXZlcnMvZG1hLWJ1Zi9zeW5jX3RyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEzZDU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZG1hLWJ1Zi9zeW5jX3RyYWNlLmgKQEAgLTAsMCArMSwzMiBAQAorI3VuZGVmIFRSQUNFX1NZU1RFTQorI2RlZmluZSBUUkFDRV9JTkNMVURFX1BBVEggLi4vLi4vZHJpdmVycy9kbWEtYnVmCisjZGVmaW5lIFRSQUNFX1NZU1RFTSBzeW5jX3RyYWNlCisKKyNpZiAhZGVmaW5lZChfVFJBQ0VfU1lOQ19IKSB8fCBkZWZpbmVkKFRSQUNFX0hFQURFUl9NVUxUSV9SRUFEKQorI2RlZmluZSBfVFJBQ0VfU1lOQ19ICisKKyNpbmNsdWRlICJzeW5jX2RlYnVnLmgiCisjaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgorCitUUkFDRV9FVkVOVChzeW5jX3RpbWVsaW5lLAorCVRQX1BST1RPKHN0cnVjdCBzeW5jX3RpbWVsaW5lICp0aW1lbGluZSksCisKKwlUUF9BUkdTKHRpbWVsaW5lKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCQlfX3N0cmluZyhuYW1lLCB0aW1lbGluZS0+bmFtZSkKKwkJCV9fZmllbGQodTMyLCB2YWx1ZSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCQlfX2Fzc2lnbl9zdHIobmFtZSwgdGltZWxpbmUtPm5hbWUpOworCQkJX19lbnRyeS0+dmFsdWUgPSB0aW1lbGluZS0+dmFsdWU7CisJKSwKKworCVRQX3ByaW50aygibmFtZT0lcyB2YWx1ZT0lZCIsIF9fZ2V0X3N0cihuYW1lKSwgX19lbnRyeS0+dmFsdWUpCispOworCisjZW5kaWYgLyogaWYgIWRlZmluZWQoX1RSQUNFX1NZTkNfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkgKi8KKworLyogVGhpcyBwYXJ0IG11c3QgYmUgb3V0c2lkZSBwcm90ZWN0aW9uICovCisjaW5jbHVkZSA8dHJhY2UvZGVmaW5lX3RyYWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9LY29uZmlnIGIvZHJpdmVycy9kbWEvS2NvbmZpZwppbmRleCA3MzlmNzk3Li5hZjYzYTZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZG1hL0tjb25maWcKQEAgLTEwMiw3ICsxMDIsNyBAQAogY29uZmlnIENPSDkwMTMxOAogCWJvb2wgIlNULUVyaWNzc29uIENPSDkwMTMxOCBETUEgc3VwcG9ydCIKIAlzZWxlY3QgRE1BX0VOR0lORQotCWRlcGVuZHMgb24gQVJDSF9VMzAwCisJZGVwZW5kcyBvbiBBUkNIX1UzMDAgfHwgQ09NUElMRV9URVNUCiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIFNULUVyaWNzc29uIENPSCA5MDEgMzE4IERNQS4KIApAQCAtMTE0LDEzICsxMTQsMTMgQEAKIAogY29uZmlnIERNQV9KWjQ3NDAKIAl0cmlzdGF0ZSAiSlo0NzQwIERNQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gTUFDSF9KWjQ3NDAKKwlkZXBlbmRzIG9uIE1BQ0hfSlo0NzQwIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBETUFfRU5HSU5FCiAJc2VsZWN0IERNQV9WSVJUVUFMX0NIQU5ORUxTCiAKIGNvbmZpZyBETUFfSlo0NzgwCiAJdHJpc3RhdGUgIkpaNDc4MCBETUEgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE1BQ0hfSlo0NzgwCisJZGVwZW5kcyBvbiBNQUNIX0paNDc4MCB8fCBDT01QSUxFX1RFU1QKIAlzZWxlY3QgRE1BX0VOR0lORQogCXNlbGVjdCBETUFfVklSVFVBTF9DSEFOTkVMUwogCWhlbHAKQEAgLTEzMCwxNCArMTMwLDE0IEBACiAKIGNvbmZpZyBETUFfT01BUAogCXRyaXN0YXRlICJPTUFQIERNQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVJDSF9PTUFQCisJZGVwZW5kcyBvbiBBUkNIX09NQVAgfHwgQ09NUElMRV9URVNUCiAJc2VsZWN0IERNQV9FTkdJTkUKIAlzZWxlY3QgRE1BX1ZJUlRVQUxfQ0hBTk5FTFMKLQlzZWxlY3QgVElfRE1BX0NST1NTQkFSIGlmIFNPQ19EUkE3WFgKKwlzZWxlY3QgVElfRE1BX0NST1NTQkFSIGlmIChTT0NfRFJBN1hYIHx8IENPTVBJTEVfVEVTVCkKIAogY29uZmlnIERNQV9TQTExWDAKIAl0cmlzdGF0ZSAiU0EtMTF4MCBETUEgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFSQ0hfU0ExMTAwCisJZGVwZW5kcyBvbiBBUkNIX1NBMTEwMCB8fCBDT01QSUxFX1RFU1QKIAlzZWxlY3QgRE1BX0VOR0lORQogCXNlbGVjdCBETUFfVklSVFVBTF9DSEFOTkVMUwogCWhlbHAKQEAgLTE1MCw3ICsxNTAsNiBAQAogCWRlcGVuZHMgb24gTUFDSF9TVU40SSB8fCBNQUNIX1NVTjVJIHx8IE1BQ0hfU1VON0kKIAlkZWZhdWx0IChNQUNIX1NVTjRJIHx8IE1BQ0hfU1VONUkgfHwgTUFDSF9TVU43SSkKIAlzZWxlY3QgRE1BX0VOR0lORQotCXNlbGVjdCBETUFfT0YKIAlzZWxlY3QgRE1BX1ZJUlRVQUxfQ0hBTk5FTFMKIAloZWxwCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIERNQSBjb250cm9sbGVyIHByZXNlbnQgaW4gdGhlIHN1bjRpLApAQCAtMTY3LDcgKzE2Niw3IEBACiAKIGNvbmZpZyBFUDkzWFhfRE1BCiAJYm9vbCAiQ2lycnVzIExvZ2ljIEVQOTN4eCBETUEgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFSQ0hfRVA5M1hYCisJZGVwZW5kcyBvbiBBUkNIX0VQOTNYWCB8fCBDT01QSUxFX1RFU1QKIAlzZWxlY3QgRE1BX0VOR0lORQogCWhlbHAKIAkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgQ2lycnVzIExvZ2ljIEVQOTN4eCBNMlAvTTJNIERNQSBjb250cm9sbGVyLgpAQCAtMjc5LDcgKzI3OCw3IEBACiAKIGNvbmZpZyBLM19ETUEKIAl0cmlzdGF0ZSAiSGlzaWxpY29uIEszIERNQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVJDSF9ISTN4eHgKKwlkZXBlbmRzIG9uIEFSQ0hfSEkzeHh4IHx8IEFSQ0hfSElTSSB8fCBDT01QSUxFX1RFU1QKIAlzZWxlY3QgRE1BX0VOR0lORQogCXNlbGVjdCBETUFfVklSVFVBTF9DSEFOTkVMUwogCWhlbHAKQEAgLTI5NywxNiArMjk2LDE2IEBACiAKIGNvbmZpZyBNTVBfUERNQQogCWJvb2wgIk1NUCBQRE1BIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiAoQVJDSF9NTVAgfHwgQVJDSF9QWEEpCisJZGVwZW5kcyBvbiBBUkNIX01NUCB8fCBBUkNIX1BYQSB8fCBDT01QSUxFX1RFU1QKIAlzZWxlY3QgRE1BX0VOR0lORQogCWhlbHAKIAkgIFN1cHBvcnQgdGhlIE1NUCBQRE1BIGVuZ2luZSBmb3IgUFhBIGFuZCBNTVAgcGxhdGZvcm0uCiAKIGNvbmZpZyBNTVBfVERNQQogCWJvb2wgIk1NUCBUd28tQ2hhbm5lbCBETUEgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFSQ0hfTU1QCisJZGVwZW5kcyBvbiBBUkNIX01NUCB8fCBDT01QSUxFX1RFU1QKIAlzZWxlY3QgRE1BX0VOR0lORQotCXNlbGVjdCBNTVBfU1JBTQorCXNlbGVjdCBNTVBfU1JBTSBpZiBBUkNIX01NUAogCWhlbHAKIAkgIFN1cHBvcnQgdGhlIE1NUCBUd28tQ2hhbm5lbCBETUEgZW5naW5lLgogCSAgVGhpcyBlbmdpbmUgdXNlZCBmb3IgTU1QIEF1ZGlvIERNQSBhbmQgcHhhOTEwIFNRVS4KQEAgLTMxNiw3ICszMTUsNiBAQAogCXRyaXN0YXRlICJNT1hBUlQgRE1BIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBBUkNIX01PWEFSVAogCXNlbGVjdCBETUFfRU5HSU5FCi0Jc2VsZWN0IERNQV9PRgogCXNlbGVjdCBETUFfVklSVFVBTF9DSEFOTkVMUwogCWhlbHAKIAkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgTU9YQSBBUlQgU29DIERNQSBjb250cm9sbGVyLgpAQCAtNDM5LDkgKzQzNyw4IEBACiAKIGNvbmZpZyBTVE0zMl9ETUEKIAlib29sICJTVE1pY3JvZWxlY3Ryb25pY3MgU1RNMzIgRE1BIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBUkNIX1NUTTMyCisJZGVwZW5kcyBvbiBBUkNIX1NUTTMyIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBETUFfRU5HSU5FCi0Jc2VsZWN0IERNQV9PRgogCXNlbGVjdCBETUFfVklSVFVBTF9DSEFOTkVMUwogCWhlbHAKIAkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgb24tY2hpcCBETUEgY29udHJvbGxlciBvbiBTVE1pY3JvZWxlY3Ryb25pY3MKQEAgLTQ1MSw3ICs0NDgsNyBAQAogCiBjb25maWcgUzNDMjRYWF9ETUFDCiAJYm9vbCAiU2Ftc3VuZyBTM0MyNFhYIERNQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVJDSF9TM0MyNFhYCisJZGVwZW5kcyBvbiBBUkNIX1MzQzI0WFggfHwgQ09NUElMRV9URVNUCiAJc2VsZWN0IERNQV9FTkdJTkUKIAlzZWxlY3QgRE1BX1ZJUlRVQUxfQ0hBTk5FTFMKIAloZWxwCkBAIC00ODMsMTAgKzQ4MCw5IEBACiAKIGNvbmZpZyBURUdSQTIxMF9BRE1BCiAJYm9vbCAiTlZJRElBIFRlZ3JhMjEwIEFETUEgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFSQ0hfVEVHUkFfMjEwX1NPQworCWRlcGVuZHMgb24gKEFSQ0hfVEVHUkFfMjEwX1NPQyB8fCBDT01QSUxFX1RFU1QpICYmIFBNX0NMSwogCXNlbGVjdCBETUFfRU5HSU5FCiAJc2VsZWN0IERNQV9WSVJUVUFMX0NIQU5ORUxTCi0Jc2VsZWN0IFBNX0NMSwogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIHRoZSBOVklESUEgVGVncmEyMTAgQURNQSBjb250cm9sbGVyIGRyaXZlci4gVGhlCiAJICBETUEgY29udHJvbGxlciBoYXMgbXVsdGlwbGUgRE1BIGNoYW5uZWxzIGFuZCBpcyB1c2VkIHRvIHNlcnZpY2UKQEAgLTQ5Nyw3ICs0OTMsNyBAQAogCiBjb25maWcgVElNQl9ETUEKIAl0cmlzdGF0ZSAiVGltYmVyZGFsZSBGUEdBIERNQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gTUZEX1RJTUJFUkRBTEUKKwlkZXBlbmRzIG9uIE1GRF9USU1CRVJEQUxFIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBETUFfRU5HSU5FCiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBUaW1iZXJkYWxlIEZQR0EgRE1BIGVuZ2luZS4KQEAgLTUxNSwxMCArNTExLDEwIEBACiAKIGNvbmZpZyBUSV9FRE1BCiAJYm9vbCAiVEkgRURNQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVJDSF9EQVZJTkNJIHx8IEFSQ0hfT01BUCB8fCBBUkNIX0tFWVNUT05FCisJZGVwZW5kcyBvbiBBUkNIX0RBVklOQ0kgfHwgQVJDSF9PTUFQIHx8IEFSQ0hfS0VZU1RPTkUgfHwgQ09NUElMRV9URVNUCiAJc2VsZWN0IERNQV9FTkdJTkUKIAlzZWxlY3QgRE1BX1ZJUlRVQUxfQ0hBTk5FTFMKLQlzZWxlY3QgVElfRE1BX0NST1NTQkFSIGlmIEFSQ0hfT01BUAorCXNlbGVjdCBUSV9ETUFfQ1JPU1NCQVIgaWYgKEFSQ0hfT01BUCB8fCBDT01QSUxFX1RFU1QpCiAJZGVmYXVsdCBuCiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBUSSBFRE1BIGNvbnRyb2xsZXIuIFRoaXMgRE1BCkBAIC01NjEsNyArNTU3LDcgQEAKIAogY29uZmlnIFpYX0RNQQogCXRyaXN0YXRlICJaVEUgWlgyOTY3MDIgRE1BIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBUkNIX1pYCisJZGVwZW5kcyBvbiBBUkNIX1pYIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBETUFfRU5HSU5FCiAJc2VsZWN0IERNQV9WSVJUVUFMX0NIQU5ORUxTCiAJaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvYXRfaGRtYWMuYyBiL2RyaXZlcnMvZG1hL2F0X2hkbWFjLmMKaW5kZXggNTNkMjJlYi4uYTRjOGY4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvYXRfaGRtYWMuYworKysgYi9kcml2ZXJzL2RtYS9hdF9oZG1hYy5jCkBAIC00NzMsMTUgKzQ3MywxMSBAQAogCS8qIGZvciBjeWNsaWMgdHJhbnNmZXJzLAogCSAqIG5vIG5lZWQgdG8gcmVwbGF5IGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWxlIHN0b3BwaW5nICovCiAJaWYgKCFhdGNfY2hhbl9pc19jeWNsaWMoYXRjaGFuKSkgewotCQlkbWFfYXN5bmNfdHhfY2FsbGJhY2sJY2FsbGJhY2sgPSB0eGQtPmNhbGxiYWNrOwotCQl2b2lkCQkJKnBhcmFtID0gdHhkLT5jYWxsYmFja19wYXJhbTsKLQogCQkvKgogCQkgKiBUaGUgQVBJIHJlcXVpcmVzIHRoYXQgbm8gc3VibWlzc2lvbnMgYXJlIGRvbmUgZnJvbSBhCiAJCSAqIGNhbGxiYWNrLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGRyb3AgdGhlIGxvY2sgaGVyZQogCQkgKi8KLQkJaWYgKGNhbGxiYWNrKQotCQkJY2FsbGJhY2socGFyYW0pOworCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2tfaW52b2tlKHR4ZCwgTlVMTCk7CiAJfQogCiAJZG1hX3J1bl9kZXBlbmRlbmNpZXModHhkKTsKQEAgLTU5OCwxNSArNTk0LDEyIEBACiB7CiAJc3RydWN0IGF0X2Rlc2MJCQkqZmlyc3QgPSBhdGNfZmlyc3RfYWN0aXZlKGF0Y2hhbik7CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yCSp0eGQgPSAmZmlyc3QtPnR4ZDsKLQlkbWFfYXN5bmNfdHhfY2FsbGJhY2sJCWNhbGxiYWNrID0gdHhkLT5jYWxsYmFjazsKLQl2b2lkCQkJCSpwYXJhbSA9IHR4ZC0+Y2FsbGJhY2tfcGFyYW07CiAKIAlkZXZfdmRiZyhjaGFuMmRldigmYXRjaGFuLT5jaGFuX2NvbW1vbiksCiAJCQkibmV3IGN5Y2xpYyBwZXJpb2QgbGxwIDB4JTA4eFxuIiwKIAkJCWNoYW5uZWxfcmVhZGwoYXRjaGFuLCBEU0NSKSk7CiAKLQlpZiAoY2FsbGJhY2spCi0JCWNhbGxiYWNrKHBhcmFtKTsKKwlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2tfaW52b2tlKHR4ZCwgTlVMTCk7CiB9CiAKIC8qLS0gIElSUSAmIFRhc2tsZXQgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9hdF94ZG1hYy5jIGIvZHJpdmVycy9kbWEvYXRfeGRtYWMuYwppbmRleCBlNDM0ZmZlLi5iN2Q3ZjJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9hdF94ZG1hYy5jCisrKyBiL2RyaXZlcnMvZG1hL2F0X3hkbWFjLmMKQEAgLTE1NzIsOCArMTU3Miw4IEBACiAJZGVzYyA9IGxpc3RfZmlyc3RfZW50cnkoJmF0Y2hhbi0+eGZlcnNfbGlzdCwgc3RydWN0IGF0X3hkbWFjX2Rlc2MsIHhmZXJfbm9kZSk7CiAJdHhkID0gJmRlc2MtPnR4X2RtYV9kZXNjOwogCi0JaWYgKHR4ZC0+Y2FsbGJhY2sgJiYgKHR4ZC0+ZmxhZ3MgJiBETUFfUFJFUF9JTlRFUlJVUFQpKQotCQl0eGQtPmNhbGxiYWNrKHR4ZC0+Y2FsbGJhY2tfcGFyYW0pOworCWlmICh0eGQtPmZsYWdzICYgRE1BX1BSRVBfSU5URVJSVVBUKQorCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2tfaW52b2tlKHR4ZCwgTlVMTCk7CiB9CiAKIHN0YXRpYyB2b2lkIGF0X3hkbWFjX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQpAQCAtMTYxNiw4ICsxNjE2LDggQEAKIAogCQlpZiAoIWF0X3hkbWFjX2NoYW5faXNfY3ljbGljKGF0Y2hhbikpIHsKIAkJCWRtYV9jb29raWVfY29tcGxldGUodHhkKTsKLQkJCWlmICh0eGQtPmNhbGxiYWNrICYmICh0eGQtPmZsYWdzICYgRE1BX1BSRVBfSU5URVJSVVBUKSkKLQkJCQl0eGQtPmNhbGxiYWNrKHR4ZC0+Y2FsbGJhY2tfcGFyYW0pOworCQkJaWYgKHR4ZC0+ZmxhZ3MgJiBETUFfUFJFUF9JTlRFUlJVUFQpCisJCQkJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrX2ludm9rZSh0eGQsIE5VTEwpOwogCQl9CiAKIAkJZG1hX3J1bl9kZXBlbmRlbmNpZXModHhkKTsKQEAgLTIwNjcsNyArMjA2Nyw3IEBACiBlcnJfY2xrX2Rpc2FibGU6CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGF0eGRtYWMtPmNsayk7CiBlcnJfZnJlZV9pcnE6Ci0JZnJlZV9pcnEoYXR4ZG1hYy0+aXJxLCBhdHhkbWFjLT5kbWEuZGV2KTsKKwlmcmVlX2lycShhdHhkbWFjLT5pcnEsIGF0eGRtYWMpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTIwODEsNyArMjA4MSw3IEBACiAJZG1hX2FzeW5jX2RldmljZV91bnJlZ2lzdGVyKCZhdHhkbWFjLT5kbWEpOwogCWNsa19kaXNhYmxlX3VucHJlcGFyZShhdHhkbWFjLT5jbGspOwogCi0JZnJlZV9pcnEoYXR4ZG1hYy0+aXJxLCBhdHhkbWFjLT5kbWEuZGV2KTsKKwlmcmVlX2lycShhdHhkbWFjLT5pcnEsIGF0eGRtYWMpOwogCiAJZm9yIChpID0gMDsgaSA8IGF0eGRtYWMtPmRtYS5jaGFuY250OyBpKyspIHsKIAkJc3RydWN0IGF0X3hkbWFjX2NoYW4gKmF0Y2hhbiA9ICZhdHhkbWFjLT5jaGFuW2ldOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvYmVzdGNvbW0vYmVzdGNvbW0uYyBiL2RyaXZlcnMvZG1hL2Jlc3Rjb21tL2Jlc3Rjb21tLmMKaW5kZXggN2NlODQzNy4uN2E2N2I4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvYmVzdGNvbW0vYmVzdGNvbW0uYworKysgYi9kcml2ZXJzL2RtYS9iZXN0Y29tbS9iZXN0Y29tbS5jCkBAIC04Miw3ICs4Miw3IEBACiAKIAkvKiBHZXQgSVJRIG9mIHRoYXQgdGFzayAqLwogCXRzay0+aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoYmNvbV9lbmctPm9mbm9kZSwgdHNrLT50YXNrbnVtKTsKLQlpZiAodHNrLT5pcnEgPT0gTk9fSVJRKQorCWlmICghdHNrLT5pcnEpCiAJCWdvdG8gZXJyb3I7CiAKIAkvKiBJbml0IHRoZSBCRHMsIGlmIG5lZWRlZCAqLwpAQCAtMTA0LDcgKzEwNCw3IEBACiAKIGVycm9yOgogCWlmICh0c2spIHsKLQkJaWYgKHRzay0+aXJxICE9IE5PX0lSUSkKKwkJaWYgKHRzay0+aXJxKQogCQkJaXJxX2Rpc3Bvc2VfbWFwcGluZyh0c2stPmlycSk7CiAJCWJjb21fc3JhbV9mcmVlKHRzay0+YmQpOwogCQlrZnJlZSh0c2stPmNvb2tpZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9jb2g5MDEzMTguYyBiL2RyaXZlcnMvZG1hL2NvaDkwMTMxOC5jCmluZGV4IGU0YWNkNjMuLjc0Nzk0YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2NvaDkwMTMxOC5jCisrKyBiL2RyaXZlcnMvZG1hL2NvaDkwMTMxOC5jCkBAIC0xMzE5LDEwICsxMzE5LDEwIEBACiAJaW50IGkgPSAwOwogCiAJd2hpbGUgKGwpIHsKLQkJZGV2X3ZkYmcoQ09IQ18yX0RFVihjb2hjKSwgImkgJWQsIGxsaSAlcCwgY3RybCAweCV4LCBzcmMgMHgleCIKLQkJCSAiLCBkc3QgMHgleCwgbGluayAweCV4IHZpcnRfbGlua19hZGRyIDB4JXBcbiIsCi0JCQkgaSwgbCwgbC0+Y29udHJvbCwgbC0+c3JjX2FkZHIsIGwtPmRzdF9hZGRyLAotCQkJIGwtPmxpbmtfYWRkciwgbC0+dmlydF9saW5rX2FkZHIpOworCQlkZXZfdmRiZyhDT0hDXzJfREVWKGNvaGMpLCAiaSAlZCwgbGxpICVwLCBjdHJsIDB4JXgsIHNyYyAweCVwYWQiCisJCQkgIiwgZHN0IDB4JXBhZCwgbGluayAweCVwYWQgdmlydF9saW5rX2FkZHIgMHglcFxuIiwKKwkJCSBpLCBsLCBsLT5jb250cm9sLCAmbC0+c3JjX2FkZHIsICZsLT5kc3RfYWRkciwKKwkJCSAmbC0+bGlua19hZGRyLCBsLT52aXJ0X2xpbmtfYWRkcik7CiAJCWkrKzsKIAkJbCA9IGwtPnZpcnRfbGlua19hZGRyOwogCX0KQEAgLTEzMzUsNyArMTMzNSw3IEBACiBzdGF0aWMgc3RydWN0IGNvaDkwMTMxOF9iYXNlICpkZWJ1Z2ZzX2RtYV9iYXNlOwogc3RhdGljIHN0cnVjdCBkZW50cnkgKmRtYV9kZW50cnk7CiAKLXN0YXRpYyBpbnQgY29oOTAxMzE4X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKK3N0YXRpYyBzc2l6ZV90IGNvaDkwMTMxOF9kZWJ1Z2ZzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCiAJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqZl9wb3MpCiB7CiAJdTY0IHN0YXJ0ZWRfY2hhbm5lbHMgPSBkZWJ1Z2ZzX2RtYV9iYXNlLT5wbS5zdGFydGVkX2NoYW5uZWxzOwpAQCAtMTM1Miw5ICsxMzUyLDEwIEBACiAKIAl0bXAgKz0gc3ByaW50Zih0bXAsICJETUEgLS0gZW5hYmxlZCBkbWEgY2hhbm5lbHNcbiIpOwogCi0JZm9yIChpID0gMDsgaSA8IFUzMDBfRE1BX0NIQU5ORUxTOyBpKyspCi0JCWlmIChzdGFydGVkX2NoYW5uZWxzICYgKDEgPDwgaSkpCisJZm9yIChpID0gMDsgaSA8IFUzMDBfRE1BX0NIQU5ORUxTOyBpKyspIHsKKwkJaWYgKHN0YXJ0ZWRfY2hhbm5lbHMgJiAoMVVMTCA8PCBpKSkKIAkJCXRtcCArPSBzcHJpbnRmKHRtcCwgImNoYW5uZWwgJWRcbiIsIGkpOworCX0KIAogCXRtcCArPSBzcHJpbnRmKHRtcCwgIlBvb2wgYWxsb2MgbmJyICVkXG4iLCBwb29sX2NvdW50KTsKIApAQCAtMTU1MywxNSArMTU1NCw4IEBACiBzdGF0aWMgc3RydWN0IGNvaDkwMTMxOF9kZXNjICoKIGNvaDkwMTMxOF9maXJzdF9hY3RpdmVfZ2V0KHN0cnVjdCBjb2g5MDEzMThfY2hhbiAqY29oYykKIHsKLQlzdHJ1Y3QgY29oOTAxMzE4X2Rlc2MgKmQ7Ci0KLQlpZiAobGlzdF9lbXB0eSgmY29oYy0+YWN0aXZlKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlkID0gbGlzdF9maXJzdF9lbnRyeSgmY29oYy0+YWN0aXZlLAotCQkJICAgICBzdHJ1Y3QgY29oOTAxMzE4X2Rlc2MsCi0JCQkgICAgIG5vZGUpOwotCXJldHVybiBkOworCXJldHVybiBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmNvaGMtPmFjdGl2ZSwgc3RydWN0IGNvaDkwMTMxOF9kZXNjLAorCQkJCQlub2RlKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTE1NzksMTUgKzE1NzMsOCBAQAogc3RhdGljIHN0cnVjdCBjb2g5MDEzMThfZGVzYyAqCiBjb2g5MDEzMThfZmlyc3RfcXVldWVkKHN0cnVjdCBjb2g5MDEzMThfY2hhbiAqY29oYykKIHsKLQlzdHJ1Y3QgY29oOTAxMzE4X2Rlc2MgKmQ7Ci0KLQlpZiAobGlzdF9lbXB0eSgmY29oYy0+cXVldWUpKQotCQlyZXR1cm4gTlVMTDsKLQotCWQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZjb2hjLT5xdWV1ZSwKLQkJCSAgICAgc3RydWN0IGNvaDkwMTMxOF9kZXNjLAotCQkJICAgICBub2RlKTsKLQlyZXR1cm4gZDsKKwlyZXR1cm4gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZjb2hjLT5xdWV1ZSwgc3RydWN0IGNvaDkwMTMxOF9kZXNjLAorCQkJCQlub2RlKTsKIH0KIAogc3RhdGljIGlubGluZSB1MzIgY29oOTAxMzE4X2dldF9ieXRlc19pbl9sbGkoc3RydWN0IGNvaDkwMTMxOF9sbGkgKmluX2xsaSkKQEAgLTE3NjYsNyArMTc1Myw3IEBACiAKIGJvb2wgY29oOTAxMzE4X2ZpbHRlcl9pZChzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIHZvaWQgKmNoYW5faWQpCiB7Ci0JdW5zaWduZWQgaW50IGNoX25yID0gKHVuc2lnbmVkIGludCkgY2hhbl9pZDsKKwl1bnNpZ25lZCBsb25nIGNoX25yID0gKHVuc2lnbmVkIGxvbmcpIGNoYW5faWQ7CiAKIAlpZiAoY2hfbnIgPT0gdG9fY29oOTAxMzE4X2NoYW4oY2hhbiktPmlkKQogCQlyZXR1cm4gdHJ1ZTsKQEAgLTE4ODgsOCArMTg3NSw3IEBACiAJc3RydWN0IGNvaDkwMTMxOF9jaGFuICpjb2hjID0gKHN0cnVjdCBjb2g5MDEzMThfY2hhbiAqKSBkYXRhOwogCXN0cnVjdCBjb2g5MDEzMThfZGVzYyAqY29oZF9maW47CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlkbWFfYXN5bmNfdHhfY2FsbGJhY2sgY2FsbGJhY2s7Ci0Jdm9pZCAqY2FsbGJhY2tfcGFyYW07CisJc3RydWN0IGRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrIGNiOwogCiAJZGV2X3ZkYmcoQ09IQ18yX0RFVihjb2hjKSwgIlslc10gY2hhbl9pZCAlZCIKIAkJICIgbmJyX2FjdGl2ZV9kb25lICVsZFxuIiwgX19mdW5jX18sCkBAIC0xOTA0LDggKzE4OTAsNyBAQAogCQlnb3RvIGVycjsKIAogCS8qIGxvY2F0ZSBjYWxsYmFjayB0byBjbGllbnQgKi8KLQljYWxsYmFjayA9IGNvaGRfZmluLT5kZXNjLmNhbGxiYWNrOwotCWNhbGxiYWNrX3BhcmFtID0gY29oZF9maW4tPmRlc2MuY2FsbGJhY2tfcGFyYW07CisJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrKCZjb2hkX2Zpbi0+ZGVzYywgJmNiKTsKIAogCS8qIHNpZ24gdGhpcyBqb2IgYXMgY29tcGxldGVkIG9uIHRoZSBjaGFubmVsICovCiAJZG1hX2Nvb2tpZV9jb21wbGV0ZSgmY29oZF9maW4tPmRlc2MpOwpAQCAtMTkyMCw4ICsxOTA1LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb2hjLT5sb2NrLCBmbGFncyk7CiAKIAkvKiBDYWxsIHRoZSBjYWxsYmFjayB3aGVuIHdlJ3JlIGRvbmUgKi8KLQlpZiAoY2FsbGJhY2spCi0JCWNhbGxiYWNrKGNhbGxiYWNrX3BhcmFtKTsKKwlkbWFlbmdpbmVfZGVzY19jYWxsYmFja19pbnZva2UoJmNiLCBOVUxMKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjb2hjLT5sb2NrLCBmbGFncyk7CiAKQEAgLTIyNDcsOCArMjIzMSw4IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNvaGMtPmxvY2ssIGZsZyk7CiAKIAlkZXZfdmRiZyhDT0hDXzJfREVWKGNvaGMpLAotCQkgIlslc10gY2hhbm5lbCAlZCBzcmMgMHgleCBkZXN0IDB4JXggc2l6ZSAlZFxuIiwKLQkJIF9fZnVuY19fLCBjb2hjLT5pZCwgc3JjLCBkZXN0LCBzaXplKTsKKwkJICJbJXNdIGNoYW5uZWwgJWQgc3JjIDB4JXBhZCBkZXN0IDB4JXBhZCBzaXplICV6dVxuIiwKKwkJIF9fZnVuY19fLCBjb2hjLT5pZCwgJnNyYywgJmRlc3QsIHNpemUpOwogCiAJaWYgKGZsYWdzICYgRE1BX1BSRVBfSU5URVJSVVBUKQogCQkvKiBUcmlnZ2VyIGludGVycnVwdCBhZnRlciBsYXN0IGxsaSAqLwpAQCAtMjc0NCw4ICsyNzI4LDggQEAKIAkJZ290byBlcnJfcmVnaXN0ZXJfb2ZfZG1hOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgYmFzZSk7Ci0JZGV2X2luZm8oJnBkZXYtPmRldiwgIkluaXRpYWxpemVkIENPSDkwMTMxOCBETUEgb24gdmlydHVhbCBiYXNlIDB4JTA4eFxuIiwKLQkJKHUzMikgYmFzZS0+dmlydGJhc2UpOworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJJbml0aWFsaXplZCBDT0g5MDEzMTggRE1BIG9uIHZpcnR1YWwgYmFzZSAweCVwXG4iLAorCQliYXNlLT52aXJ0YmFzZSk7CiAKIAlyZXR1cm4gZXJyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9jb2g5MDEzMThfbGxpLmMgYi9kcml2ZXJzL2RtYS9jb2g5MDEzMThfbGxpLmMKaW5kZXggNzAyMTEyZC4uZDYxMmIyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvY29oOTAxMzE4X2xsaS5jCisrKyBiL2RyaXZlcnMvZG1hL2NvaDkwMTMxOF9sbGkuYwpAQCAtNzUsNyArNzUsNyBAQAogCWxsaSA9IGhlYWQ7CiAJbGxpLT5waHlfdGhpcyA9IHBoeTsKIAlsbGktPmxpbmtfYWRkciA9IDB4MDAwMDAwMDA7Ci0JbGxpLT52aXJ0X2xpbmtfYWRkciA9IDB4MDAwMDAwMDBVOworCWxsaS0+dmlydF9saW5rX2FkZHIgPSBOVUxMOwogCiAJZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKSB7CiAJCWxsaV9wcmV2ID0gbGxpOwpAQCAtODgsNyArODgsNyBAQAogCQlERUJVR0ZTX1BPT0xfQ09VTlRFUl9BREQocG9vbCwgMSk7CiAJCWxsaS0+cGh5X3RoaXMgPSBwaHk7CiAJCWxsaS0+bGlua19hZGRyID0gMHgwMDAwMDAwMDsKLQkJbGxpLT52aXJ0X2xpbmtfYWRkciA9IDB4MDAwMDAwMDBVOworCQlsbGktPnZpcnRfbGlua19hZGRyID0gTlVMTDsKIAogCQlsbGlfcHJldi0+bGlua19hZGRyID0gcGh5OwogCQlsbGlfcHJldi0+dmlydF9saW5rX2FkZHIgPSBsbGk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9jcHBpNDEuYyBiL2RyaXZlcnMvZG1hL2NwcGk0MS5jCmluZGV4IDRiMjMxNzQuLmJhYzVmMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2NwcGk0MS5jCisrKyBiL2RyaXZlcnMvZG1hL2NwcGk0MS5jCkBAIC0xMDgsNiArMTA4LDggQEAKIAl1bnNpZ25lZCB0ZF9xdWV1ZWQ6MTsKIAl1bnNpZ25lZCB0ZF9zZWVuOjE7CiAJdW5zaWduZWQgdGRfZGVzY19zZWVuOjE7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CQkvKiBOb2RlIGZvciBwZW5kaW5nIGxpc3QgKi8KIH07CiAKIHN0cnVjdCBjcHBpNDFfZGVzYyB7CkBAIC0xNDYsNiArMTQ4LDkgQEAKIAljb25zdCBzdHJ1Y3QgY2hhbl9xdWV1ZXMgKnF1ZXVlc190eDsKIAlzdHJ1Y3QgY2hhbl9xdWV1ZXMgdGRfcXVldWU7CiAKKwlzdHJ1Y3QgbGlzdF9oZWFkIHBlbmRpbmc7CS8qIFBlbmRpbmcgcXVldWVkIHRyYW5zZmVycyAqLworCXNwaW5sb2NrX3QgbG9jazsJCS8qIExvY2sgZm9yIHBlbmRpbmcgbGlzdCAqLworCiAJLyogY29udGV4dCBmb3Igc3VzcGVuZC9yZXN1bWUgKi8KIAl1bnNpZ25lZCBpbnQgZG1hX3RkZmRxOwogfTsKQEAgLTMzMSw3ICszMzYsMTEgQEAKIAogCQkJYy0+cmVzaWR1ZSA9IHBkX3RyYW5zX2xlbihjLT5kZXNjLT5wZDYpIC0gbGVuOwogCQkJZG1hX2Nvb2tpZV9jb21wbGV0ZSgmYy0+dHhkKTsKLQkJCWMtPnR4ZC5jYWxsYmFjayhjLT50eGQuY2FsbGJhY2tfcGFyYW0pOworCQkJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrX2ludm9rZSgmYy0+dHhkLCBOVUxMKTsKKworCQkJLyogUGFpcmVkIHdpdGggY3BwaTQxX2RtYV9pc3N1ZV9wZW5kaW5nICovCisJCQlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KGNkZC0+ZGRldi5kZXYpOworCQkJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoY2RkLT5kZGV2LmRldik7CiAJCX0KIAl9CiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtMzQ5LDYgKzM1OCwxMiBAQAogc3RhdGljIGludCBjcHBpNDFfZG1hX2FsbG9jX2NoYW5fcmVzb3VyY2VzKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKIHsKIAlzdHJ1Y3QgY3BwaTQxX2NoYW5uZWwgKmMgPSB0b19jcHA0MV9jaGFuKGNoYW4pOworCXN0cnVjdCBjcHBpNDFfZGQgKmNkZCA9IGMtPmNkZDsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoY2RkLT5kZGV2LmRldik7CisJaWYgKGVycm9yIDwgMCkKKwkJcmV0dXJuIGVycm9yOwogCiAJZG1hX2Nvb2tpZV9pbml0KGNoYW4pOwogCWRtYV9hc3luY190eF9kZXNjcmlwdG9yX2luaXQoJmMtPnR4ZCwgY2hhbik7CkBAIC0zNTcsMTEgKzM3MiwyNiBAQAogCWlmICghYy0+aXNfdHgpCiAJCWNwcGlfd3JpdGVsKGMtPnFfbnVtLCBjLT5nY3JfcmVnICsgUlhIUENSQTApOwogCisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShjZGQtPmRkZXYuZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChjZGQtPmRkZXYuZGV2KTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBjcHBpNDFfZG1hX2ZyZWVfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuKQogeworCXN0cnVjdCBjcHBpNDFfY2hhbm5lbCAqYyA9IHRvX2NwcDQxX2NoYW4oY2hhbik7CisJc3RydWN0IGNwcGk0MV9kZCAqY2RkID0gYy0+Y2RkOworCWludCBlcnJvcjsKKworCWVycm9yID0gcG1fcnVudGltZV9nZXRfc3luYyhjZGQtPmRkZXYuZGV2KTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm47CisKKwlXQVJOX09OKCFsaXN0X2VtcHR5KCZjZGQtPnBlbmRpbmcpKTsKKworCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koY2RkLT5kZGV2LmRldik7CisJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoY2RkLT5kZGV2LmRldik7CiB9CiAKIHN0YXRpYyBlbnVtIGRtYV9zdGF0dXMgY3BwaTQxX2RtYV90eF9zdGF0dXMoc3RydWN0IGRtYV9jaGFuICpjaGFuLApAQCAtMzg2LDIxICs0MTYsNiBAQAogCXUzMiBkZXNjX3BoeXM7CiAJdTMyIHJlZzsKIAotCWRlc2NfcGh5cyA9IGxvd2VyXzMyX2JpdHMoYy0+ZGVzY19waHlzKTsKLQlkZXNjX251bSA9IChkZXNjX3BoeXMgLSBjZGQtPmRlc2NzX3BoeXMpIC8gc2l6ZW9mKHN0cnVjdCBjcHBpNDFfZGVzYyk7Ci0JV0FSTl9PTihjZGQtPmNoYW5fYnVzeVtkZXNjX251bV0pOwotCWNkZC0+Y2hhbl9idXN5W2Rlc2NfbnVtXSA9IGM7Ci0KLQlyZWcgPSAoc2l6ZW9mKHN0cnVjdCBjcHBpNDFfZGVzYykgLSAyNCkgLyA0OwotCXJlZyB8PSBkZXNjX3BoeXM7Ci0JY3BwaV93cml0ZWwocmVnLCBjZGQtPnFtZ3JfbWVtICsgUU1HUl9RVUVVRV9EKGMtPnFfbnVtKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNwcGk0MV9kbWFfaXNzdWVfcGVuZGluZyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCi17Ci0Jc3RydWN0IGNwcGk0MV9jaGFubmVsICpjID0gdG9fY3BwNDFfY2hhbihjaGFuKTsKLQl1MzIgcmVnOwotCiAJYy0+cmVzaWR1ZSA9IDA7CiAKIAlyZWcgPSBHQ1JfQ0hBTl9FTkFCTEU7CkBAIC00MTgsNyArNDMzLDQ2IEBACiAJICogYmVmb3JlIHN0YXJ0aW5nIHRoZSBkbWEgZW5naW5lLgogCSAqLwogCV9faW93bWIoKTsKLQlwdXNoX2Rlc2NfcXVldWUoYyk7CisKKwlkZXNjX3BoeXMgPSBsb3dlcl8zMl9iaXRzKGMtPmRlc2NfcGh5cyk7CisJZGVzY19udW0gPSAoZGVzY19waHlzIC0gY2RkLT5kZXNjc19waHlzKSAvIHNpemVvZihzdHJ1Y3QgY3BwaTQxX2Rlc2MpOworCVdBUk5fT04oY2RkLT5jaGFuX2J1c3lbZGVzY19udW1dKTsKKwljZGQtPmNoYW5fYnVzeVtkZXNjX251bV0gPSBjOworCisJcmVnID0gKHNpemVvZihzdHJ1Y3QgY3BwaTQxX2Rlc2MpIC0gMjQpIC8gNDsKKwlyZWcgfD0gZGVzY19waHlzOworCWNwcGlfd3JpdGVsKHJlZywgY2RkLT5xbWdyX21lbSArIFFNR1JfUVVFVUVfRChjLT5xX251bSkpOworfQorCitzdGF0aWMgdm9pZCBwZW5kaW5nX2Rlc2Moc3RydWN0IGNwcGk0MV9jaGFubmVsICpjKQoreworCXN0cnVjdCBjcHBpNDFfZGQgKmNkZCA9IGMtPmNkZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNkZC0+bG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJmMtPm5vZGUsICZjZGQtPnBlbmRpbmcpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNkZC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBjcHBpNDFfZG1hX2lzc3VlX3BlbmRpbmcoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXN0cnVjdCBjcHBpNDFfY2hhbm5lbCAqYyA9IHRvX2NwcDQxX2NoYW4oY2hhbik7CisJc3RydWN0IGNwcGk0MV9kZCAqY2RkID0gYy0+Y2RkOworCWludCBlcnJvcjsKKworCS8qIFBNIHJ1bnRpbWUgcGFpcmVkIHdpdGggZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrX2ludm9rZSAqLworCWVycm9yID0gcG1fcnVudGltZV9nZXQoY2RkLT5kZGV2LmRldik7CisJaWYgKChlcnJvciAhPSAtRUlOUFJPR1JFU1MpICYmIGVycm9yIDwgMCkgeworCQlkZXZfZXJyKGNkZC0+ZGRldi5kZXYsICJGYWlsZWQgdG8gcG1fcnVudGltZV9nZXQ6ICVpXG4iLAorCQkJZXJyb3IpOworCisJCXJldHVybjsKKwl9CisKKwlpZiAobGlrZWx5KHBtX3J1bnRpbWVfYWN0aXZlKGNkZC0+ZGRldi5kZXYpKSkKKwkJcHVzaF9kZXNjX3F1ZXVlKGMpOworCWVsc2UKKwkJcGVuZGluZ19kZXNjKGMpOwogfQogCiBzdGF0aWMgdTMyIGdldF9ob3N0X3BkMCh1MzIgbGVuZ3RoKQpAQCAtOTQwLDEyICs5OTQsMTggQEAKIAljZGQtPmN0cmxfbWVtID0gb2ZfaW9tYXAoZGV2LT5vZl9ub2RlLCAxKTsKIAljZGQtPnNjaGVkX21lbSA9IG9mX2lvbWFwKGRldi0+b2Zfbm9kZSwgMik7CiAJY2RkLT5xbWdyX21lbSA9IG9mX2lvbWFwKGRldi0+b2Zfbm9kZSwgMyk7CisJc3Bpbl9sb2NrX2luaXQoJmNkZC0+bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmNkZC0+cGVuZGluZyk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjZGQpOwogCiAJaWYgKCFjZGQtPnVzYnNzX21lbSB8fCAhY2RkLT5jdHJsX21lbSB8fCAhY2RkLT5zY2hlZF9tZW0gfHwKIAkJCSFjZGQtPnFtZ3JfbWVtKQogCQlyZXR1cm4gLUVOWElPOwogCiAJcG1fcnVudGltZV9lbmFibGUoZGV2KTsKKwlwbV9ydW50aW1lX3NldF9hdXRvc3VzcGVuZF9kZWxheShkZXYsIDEwMCk7CisJcG1fcnVudGltZV91c2VfYXV0b3N1c3BlbmQoZGV2KTsKIAlyZXQgPSBwbV9ydW50aW1lX2dldF9zeW5jKGRldik7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyX2dldF9zeW5jOwpAQCAtOTg1LDcgKzEwNDUsOSBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyX29mOwogCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY2RkKTsKKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KGRldik7CisJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoZGV2KTsKKwogCXJldHVybiAwOwogZXJyX29mOgogCWRtYV9hc3luY19kZXZpY2VfdW5yZWdpc3RlcigmY2RkLT5kZGV2KTsKQEAgLTk5Niw3ICsxMDU4LDggQEAKIGVycl9jaGFuczoKIAlkZWluaXRfY3BwaTQxKGRldiwgY2RkKTsKIGVycl9pbml0X2NwcGk6Ci0JcG1fcnVudGltZV9wdXQoZGV2KTsKKwlwbV9ydW50aW1lX2RvbnRfdXNlX2F1dG9zdXNwZW5kKGRldik7CisJcG1fcnVudGltZV9wdXRfc3luYyhkZXYpOwogZXJyX2dldF9zeW5jOgogCXBtX3J1bnRpbWVfZGlzYWJsZShkZXYpOwogCWlvdW5tYXAoY2RkLT51c2Jzc19tZW0pOwpAQCAtMTAyMSwxMyArMTA4NCwxMyBAQAogCWlvdW5tYXAoY2RkLT5jdHJsX21lbSk7CiAJaW91bm1hcChjZGQtPnNjaGVkX21lbSk7CiAJaW91bm1hcChjZGQtPnFtZ3JfbWVtKTsKLQlwbV9ydW50aW1lX3B1dCgmcGRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX2RvbnRfdXNlX2F1dG9zdXNwZW5kKCZwZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnBkZXYtPmRldik7CiAJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BNX1NMRUVQCi1zdGF0aWMgaW50IGNwcGk0MV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgY3BwaTQxX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBjcHBpNDFfZGQgKmNkZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCkBAIC0xMDM4LDcgKzExMDEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGNwcGk0MV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBfX21heWJlX3VudXNlZCBjcHBpNDFfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgY3BwaTQxX2RkICpjZGQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgY3BwaTQxX2NoYW5uZWwgKmM7CkBAIC0xMDYyLDkgKzExMjUsMzggQEAKIAogCXJldHVybiAwOwogfQotI2VuZGlmCiAKLXN0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhjcHBpNDFfcG1fb3BzLCBjcHBpNDFfc3VzcGVuZCwgY3BwaTQxX3Jlc3VtZSk7CitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIGNwcGk0MV9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBjcHBpNDFfZGQgKmNkZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJV0FSTl9PTighbGlzdF9lbXB0eSgmY2RkLT5wZW5kaW5nKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX21heWJlX3VudXNlZCBjcHBpNDFfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBjcHBpNDFfZGQgKmNkZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBjcHBpNDFfY2hhbm5lbCAqYywgKl9jOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2RkLT5sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGMsIF9jLCAmY2RkLT5wZW5kaW5nLCBub2RlKSB7CisJCXB1c2hfZGVzY19xdWV1ZShjKTsKKwkJbGlzdF9kZWwoJmMtPm5vZGUpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjZGQtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgY3BwaTQxX3BtX29wcyA9IHsKKwlTRVRfTEFURV9TWVNURU1fU0xFRVBfUE1fT1BTKGNwcGk0MV9zdXNwZW5kLCBjcHBpNDFfcmVzdW1lKQorCVNFVF9SVU5USU1FX1BNX09QUyhjcHBpNDFfcnVudGltZV9zdXNwZW5kLAorCQkJICAgY3BwaTQxX3J1bnRpbWVfcmVzdW1lLAorCQkJICAgTlVMTCkKK307CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNwcDQxX2RtYV9kcml2ZXIgPSB7CiAJLnByb2JlICA9IGNwcGk0MV9kbWFfcHJvYmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9kbWEtano0NzQwLmMgYi9kcml2ZXJzL2RtYS9kbWEtano0NzQwLmMKaW5kZXggOTY4OWIzNi4uZDUwMjczZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvZG1hLWp6NDc0MC5jCisrKyBiL2RyaXZlcnMvZG1hL2RtYS1qejQ3NDAuYwpAQCAtMjEsOCArMjEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogCi0jaW5jbHVkZSA8YXNtL21hY2gtano0NzQwL2RtYS5oPgotCiAjaW5jbHVkZSAidmlydC1kbWEuaCIKIAogI2RlZmluZSBKWl9ETUFfTlJfQ0hBTlMgNgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvZG1hLWp6NDc4MC5jIGIvZHJpdmVycy9kbWEvZG1hLWp6NDc4MC5jCmluZGV4IGRhZGU3YzQuLjczNzNiN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2RtYS1qejQ3ODAuYworKysgYi9kcml2ZXJzL2RtYS9kbWEtano0NzgwLmMKQEAgLTMyNCw4ICszMjQsMTAgQEAKIAkJCQkJICAgICAgc2dfZG1hX2FkZHJlc3MoJnNnbFtpXSksCiAJCQkJCSAgICAgIHNnX2RtYV9sZW4oJnNnbFtpXSksCiAJCQkJCSAgICAgIGRpcmVjdGlvbik7Ci0JCWlmIChlcnIgPCAwKQorCQlpZiAoZXJyIDwgMCkgeworCQkJano0NzgwX2RtYV9kZXNjX2ZyZWUoJmp6Y2hhbi0+ZGVzYy0+dmRlc2MpOwogCQkJcmV0dXJuIE5VTEw7CisJCX0KIAogCQlkZXNjLT5kZXNjW2ldLmRjbSB8PSBKWl9ETUFfRENNX1RJRTsKIApAQCAtMzY4LDggKzM3MCwxMCBAQAogCWZvciAoaSA9IDA7IGkgPCBwZXJpb2RzOyBpKyspIHsKIAkJZXJyID0gano0NzgwX2RtYV9zZXR1cF9od2Rlc2MoanpjaGFuLCAmZGVzYy0+ZGVzY1tpXSwgYnVmX2FkZHIsCiAJCQkJCSAgICAgIHBlcmlvZF9sZW4sIGRpcmVjdGlvbik7Ci0JCWlmIChlcnIgPCAwKQorCQlpZiAoZXJyIDwgMCkgeworCQkJano0NzgwX2RtYV9kZXNjX2ZyZWUoJmp6Y2hhbi0+ZGVzYy0+dmRlc2MpOwogCQkJcmV0dXJuIE5VTEw7CisJCX0KIAogCQlidWZfYWRkciArPSBwZXJpb2RfbGVuOwogCkBAIC0zOTYsNyArNDAwLDcgQEAKIAlyZXR1cm4gdmNoYW5fdHhfcHJlcCgmanpjaGFuLT52Y2hhbiwgJmRlc2MtPnZkZXNjLCBmbGFncyk7CiB9CiAKLXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqano0NzgwX2RtYV9wcmVwX2RtYV9tZW1jcHkoCitzdGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpqejQ3ODBfZG1hX3ByZXBfZG1hX21lbWNweSgKIAlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIGRtYV9hZGRyX3QgZGVzdCwgZG1hX2FkZHJfdCBzcmMsCiAJc2l6ZV90IGxlbiwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2RtYWVuZ2luZS5jIGIvZHJpdmVycy9kbWEvZG1hZW5naW5lLmMKaW5kZXggOGM5ZjQ1Zi4uNmI1MzUyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvZG1hZW5naW5lLmMKKysrIGIvZHJpdmVycy9kbWEvZG1hZW5naW5lLmMKQEAgLTk5Nyw2ICs5OTcsMTMgQEAKIAkJfQogCQljaGFuLT5jbGllbnRfY291bnQgPSAwOwogCX0KKworCWlmICghY2hhbmNudCkgeworCQlkZXZfZXJyKGRldmljZS0+ZGV2LCAiJXM6IGRldmljZSBoYXMgbm8gY2hhbm5lbHMhXG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBlcnJfb3V0OworCX0KKwogCWRldmljZS0+Y2hhbmNudCA9IGNoYW5jbnQ7CiAKIAltdXRleF9sb2NrKCZkbWFfbGlzdF9tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9kbWFlbmdpbmUuaCBiL2RyaXZlcnMvZG1hL2RtYWVuZ2luZS5oCmluZGV4IDE3Zjk4M2EuLjg4MmZmOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2RtYWVuZ2luZS5oCisrKyBiL2RyaXZlcnMvZG1hL2RtYWVuZ2luZS5oCkBAIC04Niw0ICs4Niw4OCBAQAogCQlzdGF0ZS0+cmVzaWR1ZSA9IHJlc2lkdWU7CiB9CiAKK3N0cnVjdCBkbWFlbmdpbmVfZGVzY19jYWxsYmFjayB7CisJZG1hX2FzeW5jX3R4X2NhbGxiYWNrIGNhbGxiYWNrOworCWRtYV9hc3luY190eF9jYWxsYmFja19yZXN1bHQgY2FsbGJhY2tfcmVzdWx0OworCXZvaWQgKmNhbGxiYWNrX3BhcmFtOworfTsKKworLyoqCisgKiBkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2sgLSBnZXQgdGhlIHBhc3NlZCBpbiBjYWxsYmFjayBmdW5jdGlvbgorICogQHR4OiB0eCBkZXNjcmlwdG9yCisgKiBAY2I6IHRlbXAgc3RydWN0IHRvIGhvbGQgdGhlIGNhbGxiYWNrIGluZm8KKyAqCisgKiBGaWxsIHRoZSBwYXNzZWQgaW4gY2Igc3RydWN0IHdpdGggd2hhdCdzIGF2YWlsYWJsZSBpbiB0aGUgcGFzc2VkIGluCisgKiB0eCBkZXNjcmlwdG9yIHN0cnVjdAorICogTm8gbG9ja2luZyBpcyByZXF1aXJlZC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2soc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCwKKwkJCSAgICBzdHJ1Y3QgZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2sgKmNiKQoreworCWNiLT5jYWxsYmFjayA9IHR4LT5jYWxsYmFjazsKKwljYi0+Y2FsbGJhY2tfcmVzdWx0ID0gdHgtPmNhbGxiYWNrX3Jlc3VsdDsKKwljYi0+Y2FsbGJhY2tfcGFyYW0gPSB0eC0+Y2FsbGJhY2tfcGFyYW07Cit9CisKKy8qKgorICogZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2tfaW52b2tlIC0gY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gaW4gY2Igc3RydWN0CisgKiBAY2I6IHRlbXAgc3RydWN0IHRoYXQgaXMgaG9sZGluZyB0aGUgY2FsbGJhY2sgaW5mbworICogQHJlc3VsdDogdHJhbnNhY3Rpb24gcmVzdWx0CisgKgorICogQ2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gcHJvdmlkZWQgaW4gdGhlIGNiIHN0cnVjdCB3aXRoIHRoZSBwYXJhbWV0ZXIKKyAqIGluIHRoZSBjYiBzdHJ1Y3QuCisgKiBMb2NraW5nIGlzIGRlcGVuZGVudCBvbiB0aGUgZHJpdmVyLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2RtYWVuZ2luZV9kZXNjX2NhbGxiYWNrX2ludm9rZShzdHJ1Y3QgZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2sgKmNiLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBkbWFlbmdpbmVfcmVzdWx0ICpyZXN1bHQpCit7CisJc3RydWN0IGRtYWVuZ2luZV9yZXN1bHQgZHVtbXlfcmVzdWx0ID0geworCQkucmVzdWx0ID0gRE1BX1RSQU5TX05PRVJST1IsCisJCS5yZXNpZHVlID0gMAorCX07CisKKwlpZiAoY2ItPmNhbGxiYWNrX3Jlc3VsdCkgeworCQlpZiAoIXJlc3VsdCkKKwkJCXJlc3VsdCA9ICZkdW1teV9yZXN1bHQ7CisJCWNiLT5jYWxsYmFja19yZXN1bHQoY2ItPmNhbGxiYWNrX3BhcmFtLCByZXN1bHQpOworCX0gZWxzZSBpZiAoY2ItPmNhbGxiYWNrKSB7CisJCWNiLT5jYWxsYmFjayhjYi0+Y2FsbGJhY2tfcGFyYW0pOworCX0KK30KKworLyoqCisgKiBkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2tfaW52b2tlIC0gZ2V0IHRoZSBjYWxsYmFjayBpbiB0eCBkZXNjcmlwdG9yIGFuZAorICogCQkJCQl0aGVuIGltbWVkaWF0ZWx5IGNhbGwgdGhlIGNhbGxiYWNrLgorICogQHR4OiBkbWEgYXN5bmMgdHggZGVzY3JpcHRvcgorICogQHJlc3VsdDogdHJhbnNhY3Rpb24gcmVzdWx0CisgKgorICogQ2FsbCBkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2soKSBhbmQgZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2tfaW52b2tlKCkKKyAqIGluIGEgc2luZ2xlIGZ1bmN0aW9uIHNpbmNlIG5vIHdvcmsgaXMgbmVjZXNzYXJ5IGluIGJldHdlZW4gZm9yIHRoZSBkcml2ZXIuCisgKiBMb2NraW5nIGlzIGRlcGVuZGVudCBvbiB0aGUgZHJpdmVyLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2RtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFja19pbnZva2Uoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgZG1hZW5naW5lX3Jlc3VsdCAqcmVzdWx0KQoreworCXN0cnVjdCBkbWFlbmdpbmVfZGVzY19jYWxsYmFjayBjYjsKKworCWRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFjayh0eCwgJmNiKTsKKwlkbWFlbmdpbmVfZGVzY19jYWxsYmFja19pbnZva2UoJmNiLCByZXN1bHQpOworfQorCisvKioKKyAqIGRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrX3ZhbGlkIC0gdmVyaWZ5IHRoZSBjYWxsYmFjayBpcyB2YWxpZCBpbiBjYgorICogQGNiOiBjYWxsYmFjayBpbmZvIHN0cnVjdAorICoKKyAqIFJldHVybiBhIGJvb2wgdGhhdCB2ZXJpZmllcyB3aGV0aGVyIGNhbGxiYWNrIGluIGNiIGlzIHZhbGlkIG9yIG5vdC4KKyAqIE5vIGxvY2tpbmcgaXMgcmVxdWlyZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbAorZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2tfdmFsaWQoc3RydWN0IGRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrICpjYikKK3sKKwlyZXR1cm4gKGNiLT5jYWxsYmFjaykgPyB0cnVlIDogZmFsc2U7Cit9CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvZG1hdGVzdC5jIGIvZHJpdmVycy9kbWEvZG1hdGVzdC5jCmluZGV4IDEyNDVkYjUuLmNmNzZmYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2RtYXRlc3QuYworKysgYi9kcml2ZXJzL2RtYS9kbWF0ZXN0LmMKQEAgLTU2LDEwICs1NiwxMCBAQAogTU9EVUxFX1BBUk1fREVTQyhzZ19idWZmZXJzLAogCQkiTnVtYmVyIG9mIHNjYXR0ZXIgZ2F0aGVyIGJ1ZmZlcnMgKGRlZmF1bHQ6IDEpIik7CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZG1hdGVzdCA9IDE7CitzdGF0aWMgdW5zaWduZWQgaW50IGRtYXRlc3Q7CiBtb2R1bGVfcGFyYW0oZG1hdGVzdCwgdWludCwgU19JUlVHTyB8IFNfSVdVU1IpOwogTU9EVUxFX1BBUk1fREVTQyhkbWF0ZXN0LAotCQkiZG1hdGVzdCAwLW1lbWNweSAxLXNsYXZlX3NnIChkZWZhdWx0OiAxKSIpOworCQkiZG1hdGVzdCAwLW1lbWNweSAxLXNsYXZlX3NnIChkZWZhdWx0OiAwKSIpOwogCiBzdGF0aWMgdW5zaWduZWQgaW50IHhvcl9zb3VyY2VzID0gMzsKIG1vZHVsZV9wYXJhbSh4b3Jfc291cmNlcywgdWludCwgU19JUlVHTyB8IFNfSVdVU1IpOwpAQCAtNDI2LDcgKzQyNiw5IEBACiAJaW50CQkJc3JjX2NudDsKIAlpbnQJCQlkc3RfY250OwogCWludAkJCWk7Ci0Ja3RpbWVfdAkJCWt0aW1lOworCWt0aW1lX3QJCQlrdGltZSwgc3RhcnQsIGRpZmY7CisJa3RpbWVfdAkJCWZpbGx0aW1lID0ga3RpbWVfc2V0KDAsIDApOworCWt0aW1lX3QJCQljb21wYXJldGltZSA9IGt0aW1lX3NldCgwLCAwKTsKIAlzNjQJCQlydW50aW1lID0gMDsKIAl1bnNpZ25lZCBsb25nIGxvbmcJdG90YWxfbGVuID0gMDsKIApAQCAtNTAzLDcgKzUwNSw3IEBACiAJCXRvdGFsX3Rlc3RzKys7CiAKIAkJLyogaG9ub3IgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyAqLwotCQlpZiAodGhyZWFkLT50eXBlID09IERNQV9NRU1DUFkpCisJCWlmICh0aHJlYWQtPnR5cGUgPT0gRE1BX01FTUNQWSB8fCB0aHJlYWQtPnR5cGUgPT0gRE1BX1NHKQogCQkJYWxpZ24gPSBkZXYtPmNvcHlfYWxpZ247CiAJCWVsc2UgaWYgKHRocmVhZC0+dHlwZSA9PSBETUFfWE9SKQogCQkJYWxpZ24gPSBkZXYtPnhvcl9hbGlnbjsKQEAgLTUzMSw2ICs1MzMsNyBAQAogCQkJc3JjX29mZiA9IDA7CiAJCQlkc3Rfb2ZmID0gMDsKIAkJfSBlbHNlIHsKKwkJCXN0YXJ0ID0ga3RpbWVfZ2V0KCk7CiAJCQlzcmNfb2ZmID0gZG1hdGVzdF9yYW5kb20oKSAlIChwYXJhbXMtPmJ1Zl9zaXplIC0gbGVuICsgMSk7CiAJCQlkc3Rfb2ZmID0gZG1hdGVzdF9yYW5kb20oKSAlIChwYXJhbXMtPmJ1Zl9zaXplIC0gbGVuICsgMSk7CiAKQEAgLTU0MSw2ICs1NDQsOSBAQAogCQkJCQkgIHBhcmFtcy0+YnVmX3NpemUpOwogCQkJZG1hdGVzdF9pbml0X2RzdHModGhyZWFkLT5kc3RzLCBkc3Rfb2ZmLCBsZW4sCiAJCQkJCSAgcGFyYW1zLT5idWZfc2l6ZSk7CisKKwkJCWRpZmYgPSBrdGltZV9zdWIoa3RpbWVfZ2V0KCksIHN0YXJ0KTsKKwkJCWZpbGx0aW1lID0ga3RpbWVfYWRkKGZpbGx0aW1lLCBkaWZmKTsKIAkJfQogCiAJCXVtID0gZG1hZW5naW5lX2dldF91bm1hcF9kYXRhKGRldi0+ZGV2LCBzcmNfY250K2RzdF9jbnQsCkBAIC02ODMsNiArNjg5LDcgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKKwkJc3RhcnQgPSBrdGltZV9nZXQoKTsKIAkJcHJfZGVidWcoIiVzOiB2ZXJpZnlpbmcgc291cmNlIGJ1ZmZlci4uLlxuIiwgY3VycmVudC0+Y29tbSk7CiAJCWVycm9yX2NvdW50ID0gZG1hdGVzdF92ZXJpZnkodGhyZWFkLT5zcmNzLCAwLCBzcmNfb2ZmLAogCQkJCTAsIFBBVFRFUk5fU1JDLCB0cnVlKTsKQEAgLTcwMyw2ICs3MTAsOSBAQAogCQkJCXBhcmFtcy0+YnVmX3NpemUsIGRzdF9vZmYgKyBsZW4sCiAJCQkJUEFUVEVSTl9EU1QsIGZhbHNlKTsKIAorCQlkaWZmID0ga3RpbWVfc3ViKGt0aW1lX2dldCgpLCBzdGFydCk7CisJCWNvbXBhcmV0aW1lID0ga3RpbWVfYWRkKGNvbXBhcmV0aW1lLCBkaWZmKTsKKwogCQlpZiAoZXJyb3JfY291bnQpIHsKIAkJCXJlc3VsdCgiZGF0YSBlcnJvciIsIHRvdGFsX3Rlc3RzLCBzcmNfb2ZmLCBkc3Rfb2ZmLAogCQkJICAgICAgIGxlbiwgZXJyb3JfY291bnQpOwpAQCAtNzEyLDcgKzcyMiwxMCBAQAogCQkJCSAgICAgICBkc3Rfb2ZmLCBsZW4sIDApOwogCQl9CiAJfQotCXJ1bnRpbWUgPSBrdGltZV91c19kZWx0YShrdGltZV9nZXQoKSwga3RpbWUpOworCWt0aW1lID0ga3RpbWVfc3ViKGt0aW1lX2dldCgpLCBrdGltZSk7CisJa3RpbWUgPSBrdGltZV9zdWIoa3RpbWUsIGNvbXBhcmV0aW1lKTsKKwlrdGltZSA9IGt0aW1lX3N1YihrdGltZSwgZmlsbHRpbWUpOworCXJ1bnRpbWUgPSBrdGltZV90b191cyhrdGltZSk7CiAKIAlyZXQgPSAwOwogZXJyX2RzdGJ1ZjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2R3L2NvcmUuYyBiL2RyaXZlcnMvZG1hL2R3L2NvcmUuYwppbmRleCBlZGYwNTNmLi5jMmMwYTYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9kdy9jb3JlLmMKKysrIGIvZHJpdmVycy9kbWEvZHcvY29yZS5jCkBAIC00Niw5ICs0Niw5IEBACiAJCXU4IF9kbXNpemUgPSBfaXNfc2xhdmUgPyBfc2NvbmZpZy0+ZHN0X21heGJ1cnN0IDoJXAogCQkJRFdfRE1BX01TSVpFXzE2OwkJCVwKIAkJdTggX2RtcyA9IChfZHdjLT5kaXJlY3Rpb24gPT0gRE1BX01FTV9UT19ERVYpID8JCVwKLQkJCV9kd2MtPnBfbWFzdGVyIDogX2R3Yy0+bV9tYXN0ZXI7CQlcCisJCQlfZHdjLT5kd3MucF9tYXN0ZXIgOiBfZHdjLT5kd3MubV9tYXN0ZXI7CVwKIAkJdTggX3NtcyA9IChfZHdjLT5kaXJlY3Rpb24gPT0gRE1BX0RFVl9UT19NRU0pID8JCVwKLQkJCV9kd2MtPnBfbWFzdGVyIDogX2R3Yy0+bV9tYXN0ZXI7CQlcCisJCQlfZHdjLT5kd3MucF9tYXN0ZXIgOiBfZHdjLT5kd3MubV9tYXN0ZXI7CVwKIAkJCQkJCQkJXAogCQkoRFdDX0NUTExfRFNUX01TSVpFKF9kbXNpemUpCQkJXAogCQkgfCBEV0NfQ1RMTF9TUkNfTVNJWkUoX3Ntc2l6ZSkJCQlcCkBAIC0xNDMsMTIgKzE0MywxNiBAQAogCXN0cnVjdCBkd19kbWEgKmR3ID0gdG9fZHdfZG1hKGR3Yy0+Y2hhbi5kZXZpY2UpOwogCXUzMiBjZmdoaSA9IERXQ19DRkdIX0ZJRk9fTU9ERTsKIAl1MzIgY2ZnbG8gPSBEV0NfQ0ZHTF9DSF9QUklPUihkd2MtPnByaW9yaXR5KTsKKwlib29sIGhzX3BvbGFyaXR5ID0gZHdjLT5kd3MuaHNfcG9sYXJpdHk7CiAKIAlpZiAodGVzdF9iaXQoRFdfRE1BX0lTX0lOSVRJQUxJWkVELCAmZHdjLT5mbGFncykpCiAJCXJldHVybjsKIAotCWNmZ2hpIHw9IERXQ19DRkdIX0RTVF9QRVIoZHdjLT5kc3RfaWQpOwotCWNmZ2hpIHw9IERXQ19DRkdIX1NSQ19QRVIoZHdjLT5zcmNfaWQpOworCWNmZ2hpIHw9IERXQ19DRkdIX0RTVF9QRVIoZHdjLT5kd3MuZHN0X2lkKTsKKwljZmdoaSB8PSBEV0NfQ0ZHSF9TUkNfUEVSKGR3Yy0+ZHdzLnNyY19pZCk7CisKKwkvKiBTZXQgcG9sYXJpdHkgb2YgaGFuZHNoYWtlIGludGVyZmFjZSAqLworCWNmZ2xvIHw9IGhzX3BvbGFyaXR5ID8gRFdDX0NGR0xfSFNfRFNUX1BPTCB8IERXQ19DRkdMX0hTX1NSQ19QT0wgOiAwOwogCiAJY2hhbm5lbF93cml0ZWwoZHdjLCBDRkdfTE8sIGNmZ2xvKTsKIAljaGFubmVsX3dyaXRlbChkd2MsIENGR19ISSwgY2ZnaGkpOwpAQCAtMjA5LDcgKzIxMyw3IEBACiBzdGF0aWMgdm9pZCBkd2NfZG9zdGFydChzdHJ1Y3QgZHdfZG1hX2NoYW4gKmR3Yywgc3RydWN0IGR3X2Rlc2MgKmZpcnN0KQogewogCXN0cnVjdCBkd19kbWEJKmR3ID0gdG9fZHdfZG1hKGR3Yy0+Y2hhbi5kZXZpY2UpOwotCXU4CQlsbXMgPSBEV0NfTExQX0xNUyhkd2MtPm1fbWFzdGVyKTsKKwl1OAkJbG1zID0gRFdDX0xMUF9MTVMoZHdjLT5kd3MubV9tYXN0ZXIpOwogCXVuc2lnbmVkIGxvbmcJd2FzX3NvZnRfbGxwOwogCiAJLyogQVNTRVJUOiAgY2hhbm5lbCBpcyBpZGxlICovCkBAIC0yNzAsMjAgKzI3NCwxOSBAQAogZHdjX2Rlc2NyaXB0b3JfY29tcGxldGUoc3RydWN0IGR3X2RtYV9jaGFuICpkd2MsIHN0cnVjdCBkd19kZXNjICpkZXNjLAogCQlib29sIGNhbGxiYWNrX3JlcXVpcmVkKQogewotCWRtYV9hc3luY190eF9jYWxsYmFjawkJY2FsbGJhY2sgPSBOVUxMOwotCXZvaWQJCQkJKnBhcmFtID0gTlVMTDsKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IJKnR4ZCA9ICZkZXNjLT50eGQ7CiAJc3RydWN0IGR3X2Rlc2MJCQkqY2hpbGQ7CiAJdW5zaWduZWQgbG9uZwkJCWZsYWdzOworCXN0cnVjdCBkbWFlbmdpbmVfZGVzY19jYWxsYmFjawljYjsKIAogCWRldl92ZGJnKGNoYW4yZGV2KCZkd2MtPmNoYW4pLCAiZGVzY3JpcHRvciAldSBjb21wbGV0ZVxuIiwgdHhkLT5jb29raWUpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmR3Yy0+bG9jaywgZmxhZ3MpOwogCWRtYV9jb29raWVfY29tcGxldGUodHhkKTsKLQlpZiAoY2FsbGJhY2tfcmVxdWlyZWQpIHsKLQkJY2FsbGJhY2sgPSB0eGQtPmNhbGxiYWNrOwotCQlwYXJhbSA9IHR4ZC0+Y2FsbGJhY2tfcGFyYW07Ci0JfQorCWlmIChjYWxsYmFja19yZXF1aXJlZCkKKwkJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrKHR4ZCwgJmNiKTsKKwllbHNlCisJCW1lbXNldCgmY2IsIDAsIHNpemVvZihjYikpOwogCiAJLyogYXN5bmNfdHhfYWNrICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGlsZCwgJmRlc2MtPnR4X2xpc3QsIGRlc2Nfbm9kZSkKQEAgLTI5Miw4ICsyOTUsNyBAQAogCWR3Y19kZXNjX3B1dChkd2MsIGRlc2MpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR3Yy0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKGNhbGxiYWNrKQotCQljYWxsYmFjayhwYXJhbSk7CisJZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2tfaW52b2tlKCZjYiwgTlVMTCk7CiB9CiAKIHN0YXRpYyB2b2lkIGR3Y19jb21wbGV0ZV9hbGwoc3RydWN0IGR3X2RtYSAqZHcsIHN0cnVjdCBkd19kbWFfY2hhbiAqZHdjKQpAQCAtNjYyLDcgKzY2NCw3IEBACiAJc3RydWN0IGR3X2Rlc2MJCSpwcmV2OwogCXNpemVfdAkJCXhmZXJfY291bnQ7CiAJc2l6ZV90CQkJb2Zmc2V0OwotCXU4CQkJbV9tYXN0ZXIgPSBkd2MtPm1fbWFzdGVyOworCXU4CQkJbV9tYXN0ZXIgPSBkd2MtPmR3cy5tX21hc3RlcjsKIAl1bnNpZ25lZCBpbnQJCXNyY193aWR0aDsKIAl1bnNpZ25lZCBpbnQJCWRzdF93aWR0aDsKIAl1bnNpZ25lZCBpbnQJCWRhdGFfd2lkdGggPSBkdy0+cGRhdGEtPmRhdGFfd2lkdGhbbV9tYXN0ZXJdOwpAQCAtNzQwLDcgKzc0Miw3IEBACiAJc3RydWN0IGR3X2Rlc2MJCSpwcmV2OwogCXN0cnVjdCBkd19kZXNjCQkqZmlyc3Q7CiAJdTMyCQkJY3RsbG87Ci0JdTgJCQltX21hc3RlciA9IGR3Yy0+bV9tYXN0ZXI7CisJdTgJCQltX21hc3RlciA9IGR3Yy0+ZHdzLm1fbWFzdGVyOwogCXU4CQkJbG1zID0gRFdDX0xMUF9MTVMobV9tYXN0ZXIpOwogCWRtYV9hZGRyX3QJCXJlZzsKIAl1bnNpZ25lZCBpbnQJCXJlZ193aWR0aDsKQEAgLTg5NSwxMiArODk3LDcgQEAKIAkJcmV0dXJuIGZhbHNlOwogCiAJLyogV2UgaGF2ZSB0byBjb3B5IGRhdGEgc2luY2UgZHdzIGNhbiBiZSB0ZW1wb3Jhcnkgc3RvcmFnZSAqLwotCi0JZHdjLT5zcmNfaWQgPSBkd3MtPnNyY19pZDsKLQlkd2MtPmRzdF9pZCA9IGR3cy0+ZHN0X2lkOwotCi0JZHdjLT5tX21hc3RlciA9IGR3cy0+bV9tYXN0ZXI7Ci0JZHdjLT5wX21hc3RlciA9IGR3cy0+cF9tYXN0ZXI7CisJbWVtY3B5KCZkd2MtPmR3cywgZHdzLCBzaXplb2Yoc3RydWN0IGR3X2RtYV9zbGF2ZSkpOwogCiAJcmV0dXJuIHRydWU7CiB9CkBAIC0xMTY3LDExICsxMTY0LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZHdjLT5sb2NrLCBmbGFncyk7CiAKIAkvKiBDbGVhciBjdXN0b20gY2hhbm5lbCBjb25maWd1cmF0aW9uICovCi0JZHdjLT5zcmNfaWQgPSAwOwotCWR3Yy0+ZHN0X2lkID0gMDsKLQotCWR3Yy0+bV9tYXN0ZXIgPSAwOwotCWR3Yy0+cF9tYXN0ZXIgPSAwOworCW1lbXNldCgmZHdjLT5kd3MsIDAsIHNpemVvZihzdHJ1Y3QgZHdfZG1hX3NsYXZlKSk7CiAKIAljbGVhcl9iaXQoRFdfRE1BX0lTX0lOSVRJQUxJWkVELCAmZHdjLT5mbGFncyk7CiAKQEAgLTEyNjQsNyArMTI1Nyw3IEBACiAJc3RydWN0IGR3X2N5Y2xpY19kZXNjCQkqcmV0dmFsID0gTlVMTDsKIAlzdHJ1Y3QgZHdfZGVzYwkJCSpkZXNjOwogCXN0cnVjdCBkd19kZXNjCQkJKmxhc3QgPSBOVUxMOwotCXU4CQkJCWxtcyA9IERXQ19MTFBfTE1TKGR3Yy0+bV9tYXN0ZXIpOworCXU4CQkJCWxtcyA9IERXQ19MTFBfTE1TKGR3Yy0+ZHdzLm1fbWFzdGVyKTsKIAl1bnNpZ25lZCBsb25nCQkJd2FzX2N5Y2xpYzsKIAl1bnNpZ25lZCBpbnQJCQlyZWdfd2lkdGg7CiAJdW5zaWduZWQgaW50CQkJcGVyaW9kczsKQEAgLTE1NzYsMTEgKzE1NjksNyBAQAogCQkJCShkd2NfcGFyYW1zID4+IERXQ19QQVJBTVNfTUJMS19FTiAmIDB4MSkgPT0gMDsKIAkJfSBlbHNlIHsKIAkJCWR3Yy0+YmxvY2tfc2l6ZSA9IHBkYXRhLT5ibG9ja19zaXplOwotCi0JCQkvKiBDaGVjayBpZiBjaGFubmVsIHN1cHBvcnRzIG11bHRpIGJsb2NrIHRyYW5zZmVyICovCi0JCQljaGFubmVsX3dyaXRlbChkd2MsIExMUCwgRFdDX0xMUF9MT0MoMHhmZmZmZmZmZikpOwotCQkJZHdjLT5ub2xscCA9IERXQ19MTFBfTE9DKGNoYW5uZWxfcmVhZGwoZHdjLCBMTFApKSA9PSAwOwotCQkJY2hhbm5lbF93cml0ZWwoZHdjLCBMTFAsIDApOworCQkJZHdjLT5ub2xscCA9IHBkYXRhLT5pc19ub2xscDsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvZHcvcmVncy5oIGIvZHJpdmVycy9kbWEvZHcvcmVncy5oCmluZGV4IDRiN2JkNzguLmY2NWRkMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2R3L3JlZ3MuaAorKysgYi9kcml2ZXJzL2RtYS9kdy9yZWdzLmgKQEAgLTI0NSwxMCArMjQ1LDcgQEAKIAlib29sCQkJbm9sbHA7CiAKIAkvKiBjdXN0b20gc2xhdmUgY29uZmlndXJhdGlvbiAqLwotCXU4CQkJc3JjX2lkOwotCXU4CQkJZHN0X2lkOwotCXU4CQkJbV9tYXN0ZXI7Ci0JdTgJCQlwX21hc3RlcjsKKwlzdHJ1Y3QgZHdfZG1hX3NsYXZlCWR3czsKIAogCS8qIGNvbmZpZ3VyYXRpb24gcGFzc2VkIHZpYSAuZGV2aWNlX2NvbmZpZyAqLwogCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnIGRtYV9zY29uZmlnOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvZWRtYS5jIGIvZHJpdmVycy9kbWEvZWRtYS5jCmluZGV4IDNkMjc3ZmEuLmUxOGE1ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2VkbWEuYworKysgYi9kcml2ZXJzL2RtYS9lZG1hLmMKQEAgLTI2MywyMiArMjYzLDI5IEBACiAKICNkZWZpbmUgRURNQV9CSU5ESU5HX0xFR0FDWQkwCiAjZGVmaW5lIEVETUFfQklORElOR19UUENDCTEKK3N0YXRpYyBjb25zdCB1MzIgZWRtYV9iaW5kaW5nX3R5cGVbXSA9IHsKKwlbRURNQV9CSU5ESU5HX0xFR0FDWV0gPSBFRE1BX0JJTkRJTkdfTEVHQUNZLAorCVtFRE1BX0JJTkRJTkdfVFBDQ10gPSBFRE1BX0JJTkRJTkdfVFBDQywKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGVkbWFfb2ZfaWRzW10gPSB7CiAJewogCQkuY29tcGF0aWJsZSA9ICJ0aSxlZG1hMyIsCi0JCS5kYXRhID0gKHZvaWQgKilFRE1BX0JJTkRJTkdfTEVHQUNZLAorCQkuZGF0YSA9ICZlZG1hX2JpbmRpbmdfdHlwZVtFRE1BX0JJTkRJTkdfTEVHQUNZXSwKIAl9LAogCXsKIAkJLmNvbXBhdGlibGUgPSAidGksZWRtYTMtdHBjYyIsCi0JCS5kYXRhID0gKHZvaWQgKilFRE1BX0JJTkRJTkdfVFBDQywKKwkJLmRhdGEgPSAmZWRtYV9iaW5kaW5nX3R5cGVbRURNQV9CSU5ESU5HX1RQQ0NdLAogCX0sCiAJe30KIH07CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBlZG1hX29mX2lkcyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGVkbWFfdHB0Y19vZl9pZHNbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInRpLGVkbWEzLXRwdGMiLCB9LAogCXt9CiB9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgZWRtYV90cHRjX29mX2lkcyk7CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGVkbWFfcmVhZChzdHJ1Y3QgZWRtYV9jYyAqZWNjLCBpbnQgb2Zmc2V0KQogewpAQCAtNDA1LDE4ICs0MTIsMTIgQEAKIAllZG1hX29yKGVjYywgRURNQV9QQVJNICsgb2Zmc2V0ICsgKHBhcmFtX25vIDw8IDUpLCBvcik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYml0cyhpbnQgb2Zmc2V0LCBpbnQgbGVuLCB1bnNpZ25lZCBsb25nICpwKQorc3RhdGljIGlubGluZSB2b2lkIGVkbWFfc2V0X2JpdHMoaW50IG9mZnNldCwgaW50IGxlbiwgdW5zaWduZWQgbG9uZyAqcCkKIHsKIAlmb3IgKDsgbGVuID4gMDsgbGVuLS0pCiAJCXNldF9iaXQob2Zmc2V0ICsgKGxlbiAtIDEpLCBwKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX2JpdHMoaW50IG9mZnNldCwgaW50IGxlbiwgdW5zaWduZWQgbG9uZyAqcCkKLXsKLQlmb3IgKDsgbGVuID4gMDsgbGVuLS0pCi0JCWNsZWFyX2JpdChvZmZzZXQgKyAobGVuIC0gMSksIHApOwotfQotCiBzdGF0aWMgdm9pZCBlZG1hX2Fzc2lnbl9wcmlvcml0eV90b19xdWV1ZShzdHJ1Y3QgZWRtYV9jYyAqZWNjLCBpbnQgcXVldWVfbm8sCiAJCQkJCSAgaW50IHByaW9yaXR5KQogewpAQCAtNDY0LDEzICs0NjUsMTUgQEAKIAltZW1jcHlfdG9pbyhlY2MtPmJhc2UgKyBQQVJNX09GRlNFVChzbG90KSwgcGFyYW0sIFBBUk1fU0laRSk7CiB9CiAKLXN0YXRpYyB2b2lkIGVkbWFfcmVhZF9zbG90KHN0cnVjdCBlZG1hX2NjICplY2MsIHVuc2lnbmVkIHNsb3QsCitzdGF0aWMgaW50IGVkbWFfcmVhZF9zbG90KHN0cnVjdCBlZG1hX2NjICplY2MsIHVuc2lnbmVkIHNsb3QsCiAJCQkgICBzdHJ1Y3QgZWRtYWNjX3BhcmFtICpwYXJhbSkKIHsKIAlzbG90ID0gRURNQV9DSEFOX1NMT1Qoc2xvdCk7CiAJaWYgKHNsb3QgPj0gZWNjLT5udW1fc2xvdHMpCi0JCXJldHVybjsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJbWVtY3B5X2Zyb21pbyhwYXJhbSwgZWNjLT5iYXNlICsgUEFSTV9PRkZTRVQoc2xvdCksIFBBUk1fU0laRSk7CisKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0xNDc2LDEzICsxNDc5LDE1IEBACiAJc3RydWN0IGVkbWFfY2MgKmVjYyA9IGVjaGFuLT5lY2M7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gZWNoYW4tPnZjaGFuLmNoYW4uZGV2aWNlLT5kZXY7CiAJc3RydWN0IGVkbWFjY19wYXJhbSBwOworCWludCBlcnI7CiAKIAlpZiAoIWVjaGFuLT5lZGVzYykKIAkJcmV0dXJuOwogCiAJc3Bpbl9sb2NrKCZlY2hhbi0+dmNoYW4ubG9jayk7CiAKLQllZG1hX3JlYWRfc2xvdChlY2MsIGVjaGFuLT5zbG90WzBdLCAmcCk7CisJZXJyID0gZWRtYV9yZWFkX3Nsb3QoZWNjLCBlY2hhbi0+c2xvdFswXSwgJnApOworCiAJLyoKIAkgKiBJc3N1ZSBsYXRlciBiYXNlZCBvbiBtaXNzZWQgZmxhZyB3aGljaCB3aWxsIGJlIHN1cmUKIAkgKiB0byBoYXBwZW4gYXM6CkBAIC0xNDk1LDcgKzE1MDAsNyBAQAogCSAqIGxlYWQgdG8gc29tZSBuYXN0eSByZWN1cnNpb24gd2hlbiB3ZSBhcmUgaW4gYSBOVUxMCiAJICogc2xvdC4gU28gd2UgYXZvaWQgZG9pbmcgc28gYW5kIHNldCB0aGUgbWlzc2VkIGZsYWcuCiAJICovCi0JaWYgKHAuYV9iX2NudCA9PSAwICYmIHAuY2NudCA9PSAwKSB7CisJaWYgKGVyciB8fCAocC5hX2JfY250ID09IDAgJiYgcC5jY250ID09IDApKSB7CiAJCWRldl9kYmcoZGV2LCAiRXJyb3Igb24gbnVsbCBzbG90LCBzZXR0aW5nIG1pc3NcbiIpOwogCQllY2hhbi0+bWlzc2VkID0gMTsKIAl9IGVsc2UgewpAQCAtMjAxOSw4ICsyMDI0LDcgQEAKIHsKIAlzdHJ1Y3QgZWRtYV9zb2NfaW5mbyAqaW5mbzsKIAlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7Ci0Jc2l6ZV90IHN6OwotCWludCByZXQ7CisJaW50IHN6LCByZXQ7CiAKIAlpbmZvID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBlZG1hX3NvY19pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbmZvKQpAQCAtMjE4Miw3ICsyMTg2LDcgQEAKIAkJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CiAKIAkJbWF0Y2ggPSBvZl9tYXRjaF9ub2RlKGVkbWFfb2ZfaWRzLCBub2RlKTsKLQkJaWYgKG1hdGNoICYmICh1MzIpbWF0Y2gtPmRhdGEgPT0gRURNQV9CSU5ESU5HX1RQQ0MpCisJCWlmIChtYXRjaCAmJiAoKih1MzIgKiltYXRjaC0+ZGF0YSkgPT0gRURNQV9CSU5ESU5HX1RQQ0MpCiAJCQlsZWdhY3lfbW9kZSA9IGZhbHNlOwogCiAJCWluZm8gPSBlZG1hX3NldHVwX2luZm9fZnJvbV9kdChkZXYsIGxlZ2FjeV9tb2RlKTsKQEAgLTIyNjAsNyArMjI2NCw3IEBACiAJCQlmb3IgKGkgPSAwOyByc3Zfc2xvdHNbaV1bMF0gIT0gLTE7IGkrKykgewogCQkJCW9mZiA9IHJzdl9zbG90c1tpXVswXTsKIAkJCQlsbiA9IHJzdl9zbG90c1tpXVsxXTsKLQkJCQlzZXRfYml0cyhvZmYsIGxuLCBlY2MtPnNsb3RfaW51c2UpOworCQkJCWVkbWFfc2V0X2JpdHMob2ZmLCBsbiwgZWNjLT5zbG90X2ludXNlKTsKIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2VwOTN4eF9kbWEuYyBiL2RyaXZlcnMvZG1hL2VwOTN4eF9kbWEuYwppbmRleCAyMWYwOGNjLi5kMzdlOGRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9lcDkzeHhfZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvZXA5M3h4X2RtYS5jCkBAIC0yNjIsMTAgKzI2Miw4IEBACiBzdGF0aWMgc3RydWN0IGVwOTN4eF9kbWFfZGVzYyAqCiBlcDkzeHhfZG1hX2dldF9hY3RpdmUoc3RydWN0IGVwOTN4eF9kbWFfY2hhbiAqZWRtYWMpCiB7Ci0JaWYgKGxpc3RfZW1wdHkoJmVkbWFjLT5hY3RpdmUpKQotCQlyZXR1cm4gTlVMTDsKLQotCXJldHVybiBsaXN0X2ZpcnN0X2VudHJ5KCZlZG1hYy0+YWN0aXZlLCBzdHJ1Y3QgZXA5M3h4X2RtYV9kZXNjLCBub2RlKTsKKwlyZXR1cm4gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZlZG1hYy0+YWN0aXZlLAorCQkJCQlzdHJ1Y3QgZXA5M3h4X2RtYV9kZXNjLCBub2RlKTsKIH0KIAogLyoqCkBAIC03MzksMTAgKzczNywxMCBAQAogewogCXN0cnVjdCBlcDkzeHhfZG1hX2NoYW4gKmVkbWFjID0gKHN0cnVjdCBlcDkzeHhfZG1hX2NoYW4gKilkYXRhOwogCXN0cnVjdCBlcDkzeHhfZG1hX2Rlc2MgKmRlc2MsICpkOwotCWRtYV9hc3luY190eF9jYWxsYmFjayBjYWxsYmFjayA9IE5VTEw7Ci0Jdm9pZCAqY2FsbGJhY2tfcGFyYW0gPSBOVUxMOworCXN0cnVjdCBkbWFlbmdpbmVfZGVzY19jYWxsYmFjayBjYjsKIAlMSVNUX0hFQUQobGlzdCk7CiAKKwltZW1zZXQoJmNiLCAwLCBzaXplb2YoY2IpKTsKIAlzcGluX2xvY2tfaXJxKCZlZG1hYy0+bG9jayk7CiAJLyoKIAkgKiBJZiBkbWFfdGVybWluYXRlX2FsbCgpIHdhcyBjYWxsZWQgYmVmb3JlIHdlIGdldCB0byBydW4sIHRoZSBhY3RpdmUKQEAgLTc1Nyw4ICs3NTUsNyBAQAogCQkJCWRtYV9jb29raWVfY29tcGxldGUoJmRlc2MtPnR4ZCk7CiAJCQlsaXN0X3NwbGljZV9pbml0KCZlZG1hYy0+YWN0aXZlLCAmbGlzdCk7CiAJCX0KLQkJY2FsbGJhY2sgPSBkZXNjLT50eGQuY2FsbGJhY2s7Ci0JCWNhbGxiYWNrX3BhcmFtID0gZGVzYy0+dHhkLmNhbGxiYWNrX3BhcmFtOworCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2soJmRlc2MtPnR4ZCwgJmNiKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxKCZlZG1hYy0+bG9jayk7CiAKQEAgLTc3MSw4ICs3NjgsNyBAQAogCQllcDkzeHhfZG1hX2Rlc2NfcHV0KGVkbWFjLCBkZXNjKTsKIAl9CiAKLQlpZiAoY2FsbGJhY2spCi0JCWNhbGxiYWNrKGNhbGxiYWNrX3BhcmFtKTsKKwlkbWFlbmdpbmVfZGVzY19jYWxsYmFja19pbnZva2UoJmNiLCBOVUxMKTsKIH0KIAogc3RhdGljIGlycXJldHVybl90IGVwOTN4eF9kbWFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKQEAgLTEwNDcsMTEgKzEwNDMsMTEgQEAKIAogCWZpcnN0ID0gTlVMTDsKIAlmb3JfZWFjaF9zZyhzZ2wsIHNnLCBzZ19sZW4sIGkpIHsKLQkJc2l6ZV90IHNnX2xlbiA9IHNnX2RtYV9sZW4oc2cpOworCQlzaXplX3QgbGVuID0gc2dfZG1hX2xlbihzZyk7CiAKLQkJaWYgKHNnX2xlbiA+IERNQV9NQVhfQ0hBTl9CWVRFUykgewotCQkJZGV2X3dhcm4oY2hhbjJkZXYoZWRtYWMpLCAidG9vIGJpZyB0cmFuc2ZlciBzaXplICVkXG4iLAotCQkJCSBzZ19sZW4pOworCQlpZiAobGVuID4gRE1BX01BWF9DSEFOX0JZVEVTKSB7CisJCQlkZXZfd2FybihjaGFuMmRldihlZG1hYyksICJ0b28gYmlnIHRyYW5zZmVyIHNpemUgJXp1XG4iLAorCQkJCSBsZW4pOwogCQkJZ290byBmYWlsOwogCQl9CiAKQEAgLTEwNjgsNyArMTA2NCw3IEBACiAJCQlkZXNjLT5zcmNfYWRkciA9IGVkbWFjLT5ydW50aW1lX2FkZHI7CiAJCQlkZXNjLT5kc3RfYWRkciA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKIAkJfQotCQlkZXNjLT5zaXplID0gc2dfbGVuOworCQlkZXNjLT5zaXplID0gbGVuOwogCiAJCWlmICghZmlyc3QpCiAJCQlmaXJzdCA9IGRlc2M7CkBAIC0xMTI1LDcgKzExMjEsNyBAQAogCX0KIAogCWlmIChwZXJpb2RfbGVuID4gRE1BX01BWF9DSEFOX0JZVEVTKSB7Ci0JCWRldl93YXJuKGNoYW4yZGV2KGVkbWFjKSwgInRvbyBiaWcgcGVyaW9kIGxlbmd0aCAlZFxuIiwKKwkJZGV2X3dhcm4oY2hhbjJkZXYoZWRtYWMpLCAidG9vIGJpZyBwZXJpb2QgbGVuZ3RoICV6dVxuIiwKIAkJCSBwZXJpb2RfbGVuKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvZnNsX3JhaWQuYyBiL2RyaXZlcnMvZG1hL2ZzbF9yYWlkLmMKaW5kZXggYWFkMTY3ZS4uZGIyZjllMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvZnNsX3JhaWQuYworKysgYi9kcml2ZXJzL2RtYS9mc2xfcmFpZC5jCkBAIC0xMzQsMTcgKzEzNCw5IEBACiAKIHN0YXRpYyB2b2lkIGZzbF9yZV9kZXNjX2RvbmUoc3RydWN0IGZzbF9yZV9kZXNjICpkZXNjKQogewotCWRtYV9hc3luY190eF9jYWxsYmFjayBjYWxsYmFjazsKLQl2b2lkICpjYWxsYmFja19wYXJhbTsKLQogCWRtYV9jb29raWVfY29tcGxldGUoJmRlc2MtPmFzeW5jX3R4KTsKLQotCWNhbGxiYWNrID0gZGVzYy0+YXN5bmNfdHguY2FsbGJhY2s7Ci0JY2FsbGJhY2tfcGFyYW0gPSBkZXNjLT5hc3luY190eC5jYWxsYmFja19wYXJhbTsKLQlpZiAoY2FsbGJhY2spCi0JCWNhbGxiYWNrKGNhbGxiYWNrX3BhcmFtKTsKLQogCWRtYV9kZXNjcmlwdG9yX3VubWFwKCZkZXNjLT5hc3luY190eCk7CisJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrX2ludm9rZSgmZGVzYy0+YXN5bmNfdHgsIE5VTEwpOwogfQogCiBzdGF0aWMgdm9pZCBmc2xfcmVfY2xlYW51cF9kZXNjcyhzdHJ1Y3QgZnNsX3JlX2NoYW4gKnJlX2NoYW4pCkBAIC02NzAsNyArNjYyLDcgQEAKIAogCS8qIHJlYWQgaXJxIHByb3BlcnR5IGZyb20gZHRzICovCiAJY2hhbi0+aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOwotCWlmIChjaGFuLT5pcnEgPT0gTk9fSVJRKSB7CisJaWYgKCFjaGFuLT5pcnEpIHsKIAkJZGV2X2VycihkZXYsICJObyBJUlEgZGVmaW5lZCBmb3IgSlIgJWRcbiIsIHEpOwogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIGVycl9mcmVlOwpAQCAtODM2LDYgKzgyOCw3IEBACiAJCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyZWciLCAmb2ZmKTsKIAkJaWYgKHJjKSB7CiAJCQlkZXZfZXJyKGRldiwgIlJlZyBwcm9wZXJ0eSBub3QgZm91bmQgaW4gSlEgbm9kZVxuIik7CisJCQlvZl9ub2RlX3B1dChucCk7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCQkvKiBGaW5kIG91dCB0aGUgSm9iIFJpbmdzIHByZXNlbnQgdW5kZXIgZWFjaCBKUSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvZnNsZG1hLmMgYi9kcml2ZXJzL2RtYS9mc2xkbWEuYwppbmRleCA5MTFiNzE3Li41MWM3NWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9mc2xkbWEuYworKysgYi9kcml2ZXJzL2RtYS9mc2xkbWEuYwpAQCAtNTE2LDEzICs1MTYsOSBAQAogCWlmICh0eGQtPmNvb2tpZSA+IDApIHsKIAkJcmV0ID0gdHhkLT5jb29raWU7CiAKLQkJLyogUnVuIHRoZSBsaW5rIGRlc2NyaXB0b3IgY2FsbGJhY2sgZnVuY3Rpb24gKi8KLQkJaWYgKHR4ZC0+Y2FsbGJhY2spIHsKLQkJCWNoYW5fZGJnKGNoYW4sICJMRCAlcCBjYWxsYmFja1xuIiwgZGVzYyk7Ci0JCQl0eGQtPmNhbGxiYWNrKHR4ZC0+Y2FsbGJhY2tfcGFyYW0pOwotCQl9Ci0KIAkJZG1hX2Rlc2NyaXB0b3JfdW5tYXAodHhkKTsKKwkJLyogUnVuIHRoZSBsaW5rIGRlc2NyaXB0b3IgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKwkJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrX2ludm9rZSh0eGQsIE5VTEwpOwogCX0KIAogCS8qIFJ1biBhbnkgZGVwZW5kZW5jaWVzICovCkBAIC0xMTUzLDcgKzExNDksNyBAQAogCXN0cnVjdCBmc2xkbWFfY2hhbiAqY2hhbjsKIAlpbnQgaTsKIAotCWlmIChmZGV2LT5pcnEgIT0gTk9fSVJRKSB7CisJaWYgKGZkZXYtPmlycSkgewogCQlkZXZfZGJnKGZkZXYtPmRldiwgImZyZWUgcGVyLWNvbnRyb2xsZXIgSVJRXG4iKTsKIAkJZnJlZV9pcnEoZmRldi0+aXJxLCBmZGV2KTsKIAkJcmV0dXJuOwpAQCAtMTE2MSw3ICsxMTU3LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBGU0xfRE1BX01BWF9DSEFOU19QRVJfREVWSUNFOyBpKyspIHsKIAkJY2hhbiA9IGZkZXYtPmNoYW5baV07Ci0JCWlmIChjaGFuICYmIGNoYW4tPmlycSAhPSBOT19JUlEpIHsKKwkJaWYgKGNoYW4gJiYgY2hhbi0+aXJxKSB7CiAJCQljaGFuX2RiZyhjaGFuLCAiZnJlZSBwZXItY2hhbm5lbCBJUlFcbiIpOwogCQkJZnJlZV9pcnEoY2hhbi0+aXJxLCBjaGFuKTsKIAkJfQpAQCAtMTE3NSw3ICsxMTcxLDcgQEAKIAlpbnQgaTsKIAogCS8qIGlmIHdlIGhhdmUgYSBwZXItY29udHJvbGxlciBJUlEsIHVzZSB0aGF0ICovCi0JaWYgKGZkZXYtPmlycSAhPSBOT19JUlEpIHsKKwlpZiAoZmRldi0+aXJxKSB7CiAJCWRldl9kYmcoZmRldi0+ZGV2LCAicmVxdWVzdCBwZXItY29udHJvbGxlciBJUlFcbiIpOwogCQlyZXQgPSByZXF1ZXN0X2lycShmZGV2LT5pcnEsIGZzbGRtYV9jdHJsX2lycSwgSVJRRl9TSEFSRUQsCiAJCQkJICAiZnNsZG1hLWNvbnRyb2xsZXIiLCBmZGV2KTsKQEAgLTExODgsNyArMTE4NCw3IEBACiAJCWlmICghY2hhbikKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChjaGFuLT5pcnEgPT0gTk9fSVJRKSB7CisJCWlmICghY2hhbi0+aXJxKSB7CiAJCQljaGFuX2VycihjaGFuLCAiaW50ZXJydXB0cyBwcm9wZXJ0eSBtaXNzaW5nIGluIGRldmljZSB0cmVlXG4iKTsKIAkJCXJldCA9IC1FTk9ERVY7CiAJCQlnb3RvIG91dF91bndpbmQ7CkBAIC0xMjExLDcgKzEyMDcsNyBAQAogCQlpZiAoIWNoYW4pCiAJCQljb250aW51ZTsKIAotCQlpZiAoY2hhbi0+aXJxID09IE5PX0lSUSkKKwkJaWYgKCFjaGFuLT5pcnEpCiAJCQljb250aW51ZTsKIAogCQlmcmVlX2lycShjaGFuLT5pcnEsIGNoYW4pOwpAQCAtMTMxMSw3ICsxMzA3LDcgQEAKIAlsaXN0X2FkZF90YWlsKCZjaGFuLT5jb21tb24uZGV2aWNlX25vZGUsICZmZGV2LT5jb21tb24uY2hhbm5lbHMpOwogCiAJZGV2X2luZm8oZmRldi0+ZGV2LCAiIyVkICglcyksIGlycSAlZFxuIiwgY2hhbi0+aWQsIGNvbXBhdGlibGUsCi0JCSBjaGFuLT5pcnEgIT0gTk9fSVJRID8gY2hhbi0+aXJxIDogZmRldi0+aXJxKTsKKwkJIGNoYW4tPmlycSA/IGNoYW4tPmlycSA6IGZkZXYtPmlycSk7CiAKIAlyZXR1cm4gMDsKIApAQCAtMTM1MSw3ICsxMzQ3LDcgQEAKIAlpZiAoIWZkZXYtPnJlZ3MpIHsKIAkJZGV2X2Vycigmb3AtPmRldiwgInVuYWJsZSB0byBpb3JlbWFwIHJlZ2lzdGVyc1xuIik7CiAJCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X2ZyZWVfZmRldjsKKwkJZ290byBvdXRfZnJlZTsKIAl9CiAKIAkvKiBtYXAgdGhlIGNoYW5uZWwgSVJRIGlmIGl0IGV4aXN0cywgYnV0IGRvbid0IGhvb2t1cCB0aGUgaGFuZGxlciB5ZXQgKi8KQEAgLTE0MTYsNiArMTQxMiw4IEBACiAKIG91dF9mcmVlX2ZkZXY6CiAJaXJxX2Rpc3Bvc2VfbWFwcGluZyhmZGV2LT5pcnEpOworCWlvdW5tYXAoZmRldi0+cmVncyk7CitvdXRfZnJlZToKIAlrZnJlZShmZGV2KTsKIG91dF9yZXR1cm46CiAJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2hzdS9oc3UuYyBiL2RyaXZlcnMvZG1hL2hzdS9oc3UuYwppbmRleCBjNWYyMWVmLi4yOWQwNGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9oc3UvaHN1LmMKKysrIGIvZHJpdmVycy9kbWEvaHN1L2hzdS5jCkBAIC0yMDAsMTAgKzIwMCw5IEBACiAgKiAgICAgIGlzIG5vdCBhIG5vcm1hbCB0aW1lb3V0IGludGVycnVwdCwgaWUuIGhzdV9kbWFfZ2V0X3N0YXR1cygpIHJldHVybmVkIDAuCiAgKgogICogICAgICBSZXR1cm46Ci0gKiAgICAgIElSUV9OT05FIGZvciBpbnZhbGlkIGNoYW5uZWwgbnVtYmVyLCBJUlFfSEFORExFRCBvdGhlcndpc2UuCisgKiAgICAgIDAgZm9yIGludmFsaWQgY2hhbm5lbCBudW1iZXIsIDEgb3RoZXJ3aXNlLgogICovCi1pcnFyZXR1cm5fdCBoc3VfZG1hX2RvX2lycShzdHJ1Y3QgaHN1X2RtYV9jaGlwICpjaGlwLCB1bnNpZ25lZCBzaG9ydCBuciwKLQkJCSAgIHUzMiBzdGF0dXMpCitpbnQgaHN1X2RtYV9kb19pcnEoc3RydWN0IGhzdV9kbWFfY2hpcCAqY2hpcCwgdW5zaWduZWQgc2hvcnQgbnIsIHUzMiBzdGF0dXMpCiB7CiAJc3RydWN0IGhzdV9kbWFfY2hhbiAqaHN1YzsKIAlzdHJ1Y3QgaHN1X2RtYV9kZXNjICpkZXNjOwpAQCAtMjExLDcgKzIxMCw3IEBACiAKIAkvKiBTYW5pdHkgY2hlY2sgKi8KIAlpZiAobnIgPj0gY2hpcC0+aHN1LT5ucl9jaGFubmVscykKLQkJcmV0dXJuIElSUV9OT05FOworCQlyZXR1cm4gMDsKIAogCWhzdWMgPSAmY2hpcC0+aHN1LT5jaGFuW25yXTsKIApAQCAtMjMwLDcgKzIyOSw3IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhzdWMtPnZjaGFuLmxvY2ssIGZsYWdzKTsKIAotCXJldHVybiBJUlFfSEFORExFRDsKKwlyZXR1cm4gMTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGhzdV9kbWFfZG9faXJxKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaHN1L3BjaS5jIGIvZHJpdmVycy9kbWEvaHN1L3BjaS5jCmluZGV4IDk5MTYwNTguLmI1MTYzOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2hzdS9wY2kuYworKysgYi9kcml2ZXJzL2RtYS9oc3UvcGNpLmMKQEAgLTI5LDcgKzI5LDcgQEAKIAl1MzIgZG1haXNyOwogCXUzMiBzdGF0dXM7CiAJdW5zaWduZWQgc2hvcnQgaTsKLQlpcnFyZXR1cm5fdCByZXQgPSBJUlFfTk9ORTsKKwlpbnQgcmV0ID0gMDsKIAlpbnQgZXJyOwogCiAJZG1haXNyID0gcmVhZGwoY2hpcC0+cmVncyArIEhTVV9QQ0lfRE1BSVNSKTsKQEAgLTM3LDE0ICszNywxNCBAQAogCQlpZiAoZG1haXNyICYgMHgxKSB7CiAJCQllcnIgPSBoc3VfZG1hX2dldF9zdGF0dXMoY2hpcCwgaSwgJnN0YXR1cyk7CiAJCQlpZiAoZXJyID4gMCkKLQkJCQlyZXQgfD0gSVJRX0hBTkRMRUQ7CisJCQkJcmV0IHw9IDE7CiAJCQllbHNlIGlmIChlcnIgPT0gMCkKIAkJCQlyZXQgfD0gaHN1X2RtYV9kb19pcnEoY2hpcCwgaSwgc3RhdHVzKTsKIAkJfQogCQlkbWFpc3IgPj49IDE7CiAJfQogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gSVJRX1JFVFZBTChyZXQpOwogfQogCiBzdGF0aWMgaW50IGhzdV9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2ltZy1tZGMtZG1hLmMgYi9kcml2ZXJzL2RtYS9pbWctbWRjLWRtYS5jCmluZGV4IGE0YzUzYmUuLjYyNGYxZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2ltZy1tZGMtZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvaW1nLW1kYy1kbWEuYwpAQCAtODYxLDcgKzg2MSw2IEBACiB7CiAJc3RydWN0IG1kY19kbWEgKm1kbWE7CiAJc3RydWN0IHJlc291cmNlICpyZXM7Ci0JY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CiAJdW5zaWduZWQgaW50IGk7CiAJdTMyIHZhbDsKIAlpbnQgcmV0OwpAQCAtODcxLDggKzg3MCw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1kbWEpOwogCi0JbWF0Y2ggPSBvZl9tYXRjaF9kZXZpY2UobWRjX2RtYV9vZl9tYXRjaCwgJnBkZXYtPmRldik7Ci0JbWRtYS0+c29jID0gbWF0Y2gtPmRhdGE7CisJbWRtYS0+c29jID0gb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKCZwZGV2LT5kZXYpOwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAltZG1hLT5yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9pbXgtZG1hLmMgYi9kcml2ZXJzL2RtYS9pbXgtZG1hLmMKaW5kZXggYTk2MDYwOC4uYWIwZmI4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvaW14LWRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL2lteC1kbWEuYwpAQCAtNjYzLDkgKzY2Myw3IEBACiBvdXQ6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW14ZG1hLT5sb2NrLCBmbGFncyk7CiAKLQlpZiAoZGVzYy0+ZGVzYy5jYWxsYmFjaykKLQkJZGVzYy0+ZGVzYy5jYWxsYmFjayhkZXNjLT5kZXNjLmNhbGxiYWNrX3BhcmFtKTsKLQorCWRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFja19pbnZva2UoJmRlc2MtPmRlc2MsIE5VTEwpOwogfQogCiBzdGF0aWMgaW50IGlteGRtYV90ZXJtaW5hdGVfYWxsKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2lteC1zZG1hLmMgYi9kcml2ZXJzL2RtYS9pbXgtc2RtYS5jCmluZGV4IDAzZWM3NmYuLmI5NjI5YjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2lteC1zZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvaW14LXNkbWEuYwpAQCAtMTg0LDcgKzE4NCw3IEBACiBzdHJ1Y3Qgc2RtYV9tb2RlX2NvdW50IHsKIAl1MzIgY291bnQgICA6IDE2OyAvKiBzaXplIG9mIHRoZSBidWZmZXIgcG9pbnRlZCBieSB0aGlzIEJEICovCiAJdTMyIHN0YXR1cyAgOiAgODsgLyogRSxSLEksQyxXLEQgc3RhdHVzIGJpdHMgc3RvcmVkIGhlcmUgKi8KLQl1MzIgY29tbWFuZCA6ICA4OyAvKiBjb21tYW5kIG1vc3Rsa3kgdXNlZCBmb3IgY2hhbm5lbCAwICovCisJdTMyIGNvbW1hbmQgOiAgODsgLyogY29tbWFuZCBtb3N0bHkgdXNlZCBmb3IgY2hhbm5lbCAwICovCiB9OwogCiAvKgpAQCAtNDc5LDYgKzQ3OSwyNCBAQAogCS5zY3JpcHRfYWRkcnMgPSAmc2RtYV9zY3JpcHRfaW14NnEsCiB9OwogCitzdGF0aWMgc3RydWN0IHNkbWFfc2NyaXB0X3N0YXJ0X2FkZHJzIHNkbWFfc2NyaXB0X2lteDdkID0geworCS5hcF8yX2FwX2FkZHIgPSA2NDQsCisJLnVhcnRfMl9tY3VfYWRkciA9IDgxOSwKKwkubWN1XzJfYXBwX2FkZHIgPSA3NDksCisJLnVhcnRzaF8yX21jdV9hZGRyID0gMTAzNCwKKwkubWN1XzJfc2hwX2FkZHIgPSA5NjIsCisJLmFwcF8yX21jdV9hZGRyID0gNjg1LAorCS5zaHBfMl9tY3VfYWRkciA9IDg5MywKKwkuc3BkaWZfMl9tY3VfYWRkciA9IDExMDIsCisJLm1jdV8yX3NwZGlmX2FkZHIgPSAxMTM2LAorfTsKKworc3RhdGljIHN0cnVjdCBzZG1hX2RyaXZlcl9kYXRhIHNkbWFfaW14N2QgPSB7CisJLmNobmVuYmwwID0gU0RNQV9DSE5FTkJMMF9JTVgzNSwKKwkubnVtX2V2ZW50cyA9IDQ4LAorCS5zY3JpcHRfYWRkcnMgPSAmc2RtYV9zY3JpcHRfaW14N2QsCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBzZG1hX2RldnR5cGVzW10gPSB7CiAJewogCQkubmFtZSA9ICJpbXgyNS1zZG1hIiwKQEAgLTQ5OSw2ICs1MTcsOSBAQAogCQkubmFtZSA9ICJpbXg2cS1zZG1hIiwKIAkJLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcpJnNkbWFfaW14NnEsCiAJfSwgeworCQkubmFtZSA9ICJpbXg3ZC1zZG1hIiwKKwkJLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcpJnNkbWFfaW14N2QsCisJfSwgewogCQkvKiBzZW50aW5lbCAqLwogCX0KIH07CkBAIC01MTEsNiArNTMyLDcgQEAKIAl7IC5jb21wYXRpYmxlID0gImZzbCxpbXgzNS1zZG1hIiwgLmRhdGEgPSAmc2RtYV9pbXgzNSwgfSwKIAl7IC5jb21wYXRpYmxlID0gImZzbCxpbXgzMS1zZG1hIiwgLmRhdGEgPSAmc2RtYV9pbXgzMSwgfSwKIAl7IC5jb21wYXRpYmxlID0gImZzbCxpbXgyNS1zZG1hIiwgLmRhdGEgPSAmc2RtYV9pbXgyNSwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg3ZC1zZG1hIiwgLmRhdGEgPSAmc2RtYV9pbXg3ZCwgfSwKIAl7IC8qIHNlbnRpbmVsICovIH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzZG1hX2R0X2lkcyk7CkBAIC02NDgsMTUgKzY3MCwxMSBAQAogCXdyaXRlbF9yZWxheGVkKHZhbCwgc2RtYS0+cmVncyArIGNobmVuYmwpOwogfQogCi1zdGF0aWMgdm9pZCBzZG1hX2hhbmRsZV9jaGFubmVsX2xvb3Aoc3RydWN0IHNkbWFfY2hhbm5lbCAqc2RtYWMpCi17Ci0JaWYgKHNkbWFjLT5kZXNjLmNhbGxiYWNrKQotCQlzZG1hYy0+ZGVzYy5jYWxsYmFjayhzZG1hYy0+ZGVzYy5jYWxsYmFja19wYXJhbSk7Ci19Ci0KIHN0YXRpYyB2b2lkIHNkbWFfdXBkYXRlX2NoYW5uZWxfbG9vcChzdHJ1Y3Qgc2RtYV9jaGFubmVsICpzZG1hYykKIHsKIAlzdHJ1Y3Qgc2RtYV9idWZmZXJfZGVzY3JpcHRvciAqYmQ7CisJaW50IGVycm9yID0gMDsKKwllbnVtIGRtYV9zdGF0dXMJb2xkX3N0YXR1cyA9IHNkbWFjLT5zdGF0dXM7CiAKIAkvKgogCSAqIGxvb3AgbW9kZS4gSXRlcmF0ZSBvdmVyIGRlc2NyaXB0b3JzLCByZS1zZXR1cCB0aGVtIGFuZApAQCAtNjY4LDE3ICs2ODYsNDEgQEAKIAkJaWYgKGJkLT5tb2RlLnN0YXR1cyAmIEJEX0RPTkUpCiAJCQlicmVhazsKIAotCQlpZiAoYmQtPm1vZGUuc3RhdHVzICYgQkRfUlJPUikKKwkJaWYgKGJkLT5tb2RlLnN0YXR1cyAmIEJEX1JST1IpIHsKKwkJCWJkLT5tb2RlLnN0YXR1cyAmPSB+QkRfUlJPUjsKIAkJCXNkbWFjLT5zdGF0dXMgPSBETUFfRVJST1I7CisJCQllcnJvciA9IC1FSU87CisJCX0KIAorCSAgICAgICAvKgorCQkqIFdlIHVzZSBiZC0+bW9kZS5jb3VudCB0byBjYWxjdWxhdGUgdGhlIHJlc2lkdWUsIHNpbmNlIGNvbnRhaW5zCisJCSogdGhlIG51bWJlciBvZiBieXRlcyBwcmVzZW50IGluIHRoZSBjdXJyZW50IGJ1ZmZlciBkZXNjcmlwdG9yLgorCQkqLworCisJCXNkbWFjLT5jaG5fcmVhbF9jb3VudCA9IGJkLT5tb2RlLmNvdW50OwogCQliZC0+bW9kZS5zdGF0dXMgfD0gQkRfRE9ORTsKKwkJYmQtPm1vZGUuY291bnQgPSBzZG1hYy0+cGVyaW9kX2xlbjsKKworCQkvKgorCQkgKiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIGZyb20gdGhlIGludGVycnVwdCBjb250ZXh0IGluIG9yZGVyCisJCSAqIHRvIHJlZHVjZSBsYXRlbmN5IGFuZCB0byBhdm9pZCB0aGUgcmlzayBvZiBhbHRlcmluZyB0aGUKKwkJICogU0RNQSB0cmFuc2FjdGlvbiBzdGF0dXMgYnkgdGhlIHRpbWUgdGhlIGNsaWVudCB0YXNrbGV0IGlzCisJCSAqIGV4ZWN1dGVkLgorCQkgKi8KKworCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2tfaW52b2tlKCZzZG1hYy0+ZGVzYywgTlVMTCk7CisKIAkJc2RtYWMtPmJ1Zl90YWlsKys7CiAJCXNkbWFjLT5idWZfdGFpbCAlPSBzZG1hYy0+bnVtX2JkOworCisJCWlmIChlcnJvcikKKwkJCXNkbWFjLT5zdGF0dXMgPSBvbGRfc3RhdHVzOwogCX0KIH0KIAotc3RhdGljIHZvaWQgbXhjX3NkbWFfaGFuZGxlX2NoYW5uZWxfbm9ybWFsKHN0cnVjdCBzZG1hX2NoYW5uZWwgKnNkbWFjKQorc3RhdGljIHZvaWQgbXhjX3NkbWFfaGFuZGxlX2NoYW5uZWxfbm9ybWFsKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKKwlzdHJ1Y3Qgc2RtYV9jaGFubmVsICpzZG1hYyA9IChzdHJ1Y3Qgc2RtYV9jaGFubmVsICopIGRhdGE7CiAJc3RydWN0IHNkbWFfYnVmZmVyX2Rlc2NyaXB0b3IgKmJkOwogCWludCBpLCBlcnJvciA9IDA7CiAKQEAgLTcwMSwxOCArNzQzLDggQEAKIAkJc2RtYWMtPnN0YXR1cyA9IERNQV9DT01QTEVURTsKIAogCWRtYV9jb29raWVfY29tcGxldGUoJnNkbWFjLT5kZXNjKTsKLQlpZiAoc2RtYWMtPmRlc2MuY2FsbGJhY2spCi0JCXNkbWFjLT5kZXNjLmNhbGxiYWNrKHNkbWFjLT5kZXNjLmNhbGxiYWNrX3BhcmFtKTsKLX0KIAotc3RhdGljIHZvaWQgc2RtYV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3Qgc2RtYV9jaGFubmVsICpzZG1hYyA9IChzdHJ1Y3Qgc2RtYV9jaGFubmVsICopIGRhdGE7Ci0KLQlpZiAoc2RtYWMtPmZsYWdzICYgSU1YX0RNQV9TR19MT09QKQotCQlzZG1hX2hhbmRsZV9jaGFubmVsX2xvb3Aoc2RtYWMpOwotCWVsc2UKLQkJbXhjX3NkbWFfaGFuZGxlX2NoYW5uZWxfbm9ybWFsKHNkbWFjKTsKKwlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2tfaW52b2tlKCZzZG1hYy0+ZGVzYywgTlVMTCk7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBzZG1hX2ludF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKQEAgLTczMSw4ICs3NjMsOCBAQAogCiAJCWlmIChzZG1hYy0+ZmxhZ3MgJiBJTVhfRE1BX1NHX0xPT1ApCiAJCQlzZG1hX3VwZGF0ZV9jaGFubmVsX2xvb3Aoc2RtYWMpOwotCi0JCXRhc2tsZXRfc2NoZWR1bGUoJnNkbWFjLT50YXNrbGV0KTsKKwkJZWxzZQorCQkJdGFza2xldF9zY2hlZHVsZSgmc2RtYWMtPnRhc2tsZXQpOwogCiAJCV9fY2xlYXJfYml0KGNoYW5uZWwsICZzdGF0KTsKIAl9CkBAIC0xMzUzLDcgKzEzODUsOCBAQAogCXUzMiByZXNpZHVlOwogCiAJaWYgKHNkbWFjLT5mbGFncyAmIElNWF9ETUFfU0dfTE9PUCkKLQkJcmVzaWR1ZSA9IChzZG1hYy0+bnVtX2JkIC0gc2RtYWMtPmJ1Zl90YWlsKSAqIHNkbWFjLT5wZXJpb2RfbGVuOworCQlyZXNpZHVlID0gKHNkbWFjLT5udW1fYmQgLSBzZG1hYy0+YnVmX3RhaWwpICoKKwkJCSAgIHNkbWFjLT5wZXJpb2RfbGVuIC0gc2RtYWMtPmNobl9yZWFsX2NvdW50OwogCWVsc2UKIAkJcmVzaWR1ZSA9IHNkbWFjLT5jaG5fY291bnQgLSBzZG1hYy0+Y2huX3JlYWxfY291bnQ7CiAKQEAgLTEzNzUsNiArMTQwOCw3IEBACiAjZGVmaW5lIFNETUFfU0NSSVBUX0FERFJTX0FSUkFZX1NJWkVfVjEJMzQKICNkZWZpbmUgU0RNQV9TQ1JJUFRfQUREUlNfQVJSQVlfU0laRV9WMgkzOAogI2RlZmluZSBTRE1BX1NDUklQVF9BRERSU19BUlJBWV9TSVpFX1YzCTQxCisjZGVmaW5lIFNETUFfU0NSSVBUX0FERFJTX0FSUkFZX1NJWkVfVjQJNDIKIAogc3RhdGljIHZvaWQgc2RtYV9hZGRfc2NyaXB0cyhzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkbWEsCiAJCWNvbnN0IHN0cnVjdCBzZG1hX3NjcmlwdF9zdGFydF9hZGRycyAqYWRkcikKQEAgLTE0MjQsNiArMTQ1OCw5IEBACiAJY2FzZSAzOgogCQlzZG1hLT5zY3JpcHRfbnVtYmVyID0gU0RNQV9TQ1JJUFRfQUREUlNfQVJSQVlfU0laRV9WMzsKIAkJYnJlYWs7CisJY2FzZSA0OgorCQlzZG1hLT5zY3JpcHRfbnVtYmVyID0gU0RNQV9TQ1JJUFRfQUREUlNfQVJSQVlfU0laRV9WNDsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2VycihzZG1hLT5kZXYsICJ1bmtub3duIGZpcm13YXJlIHZlcnNpb25cbiIpOwogCQlnb3RvIGVycl9maXJtd2FyZTsKQEAgLTE3MzIsNyArMTc2OSw3IEBACiAJCWRtYV9jb29raWVfaW5pdCgmc2RtYWMtPmNoYW4pOwogCQlzZG1hYy0+Y2hhbm5lbCA9IGk7CiAKLQkJdGFza2xldF9pbml0KCZzZG1hYy0+dGFza2xldCwgc2RtYV90YXNrbGV0LAorCQl0YXNrbGV0X2luaXQoJnNkbWFjLT50YXNrbGV0LCBteGNfc2RtYV9oYW5kbGVfY2hhbm5lbF9ub3JtYWwsCiAJCQkgICAgICh1bnNpZ25lZCBsb25nKSBzZG1hYyk7CiAJCS8qCiAJCSAqIEFkZCB0aGUgY2hhbm5lbCB0byB0aGUgRE1BQyBsaXN0LiBEbyBub3QgYWRkIGNoYW5uZWwgMCB0aG91Z2gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2lvYXQvZG1hLmMgYi9kcml2ZXJzL2RtYS9pb2F0L2RtYS5jCmluZGV4IGJkMDk5NjEuLjQ5Mzg2Y2UwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9pb2F0L2RtYS5jCisrKyBiL2RyaXZlcnMvZG1hL2lvYXQvZG1hLmMKQEAgLTM4LDggKzM4LDU0IEBACiAKICNpbmNsdWRlICIuLi9kbWFlbmdpbmUuaCIKIAorc3RhdGljIGNoYXIgKmNoYW5lcnJfc3RyW10gPSB7CisJIkRNQSBUcmFuc2ZlciBEZXN0aW5hdGlvbiBBZGRyZXNzIEVycm9yIiwKKwkiTmV4dCBEZXNjcmlwdG9yIEFkZHJlc3MgRXJyb3IiLAorCSJEZXNjcmlwdG9yIEVycm9yIiwKKwkiQ2hhbiBBZGRyZXNzIFZhbHVlIEVycm9yIiwKKwkiQ0hBTkNNRCBFcnJvciIsCisJIkNoaXBzZXQgVW5jb3JyZWN0YWJsZSBEYXRhIEludGVncml0eSBFcnJvciIsCisJIkRNQSBVbmNvcnJlY3RhYmxlIERhdGEgSW50ZWdyaXR5IEVycm9yIiwKKwkiUmVhZCBEYXRhIEVycm9yIiwKKwkiV3JpdGUgRGF0YSBFcnJvciIsCisJIkRlc2NyaXB0b3IgQ29udHJvbCBFcnJvciIsCisJIkRlc2NyaXB0b3IgVHJhbnNmZXIgU2l6ZSBFcnJvciIsCisJIkNvbXBsZXRpb24gQWRkcmVzcyBFcnJvciIsCisJIkludGVycnVwdCBDb25maWd1cmF0aW9uIEVycm9yIiwKKwkiU3VwZXIgZXh0ZW5kZWQgZGVzY3JpcHRvciBBZGRyZXNzIEVycm9yIiwKKwkiVW5hZmZpbGlhdGVkIEVycm9yIiwKKwkiQ1JDIG9yIFhPUiBQIEVycm9yIiwKKwkiWE9SIFEgRXJyb3IiLAorCSJEZXNjcmlwdG9yIENvdW50IEVycm9yIiwKKwkiRElGIEFsbCBGIGRldGVjdCBFcnJvciIsCisJIkd1YXJkIFRhZyB2ZXJpZmljYXRpb24gRXJyb3IiLAorCSJBcHBsaWNhdGlvbiBUYWcgdmVyaWZpY2F0aW9uIEVycm9yIiwKKwkiUmVmZXJlbmNlIFRhZyB2ZXJpZmljYXRpb24gRXJyb3IiLAorCSJCdW5kbGUgQml0IEVycm9yIiwKKwkiUmVzdWx0IERJRiBBbGwgRiBkZXRlY3QgRXJyb3IiLAorCSJSZXN1bHQgR3VhcmQgVGFnIHZlcmlmaWNhdGlvbiBFcnJvciIsCisJIlJlc3VsdCBBcHBsaWNhdGlvbiBUYWcgdmVyaWZpY2F0aW9uIEVycm9yIiwKKwkiUmVzdWx0IFJlZmVyZW5jZSBUYWcgdmVyaWZpY2F0aW9uIEVycm9yIiwKKwlOVUxMCit9OworCiBzdGF0aWMgdm9pZCBpb2F0X2VoKHN0cnVjdCBpb2F0ZG1hX2NoYW4gKmlvYXRfY2hhbik7CiAKK3N0YXRpYyB2b2lkIGlvYXRfcHJpbnRfY2hhbmVycnMoc3RydWN0IGlvYXRkbWFfY2hhbiAqaW9hdF9jaGFuLCB1MzIgY2hhbmVycikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCWlmICgoY2hhbmVyciA+PiBpKSAmIDEpIHsKKwkJCWlmIChjaGFuZXJyX3N0cltpXSkgeworCQkJCWRldl9lcnIodG9fZGV2KGlvYXRfY2hhbiksICJFcnIoJWQpOiAlc1xuIiwKKwkJCQkJaSwgY2hhbmVycl9zdHJbaV0pOworCQkJfSBlbHNlCisJCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKIC8qKgogICogaW9hdF9kbWFfZG9faW50ZXJydXB0IC0gaGFuZGxlciB1c2VkIGZvciBzaW5nbGUgdmVjdG9yIGludGVycnVwdCBtb2RlCiAgKiBAaXJxOiBpbnRlcnJ1cHQgaWQKQEAgLTU2OCwxMiArNjE0LDE0IEBACiAKIAkJdHggPSAmZGVzYy0+dHhkOwogCQlpZiAodHgtPmNvb2tpZSkgeworCQkJc3RydWN0IGRtYWVuZ2luZV9yZXN1bHQgcmVzOworCiAJCQlkbWFfY29va2llX2NvbXBsZXRlKHR4KTsKIAkJCWRtYV9kZXNjcmlwdG9yX3VubWFwKHR4KTsKLQkJCWlmICh0eC0+Y2FsbGJhY2spIHsKLQkJCQl0eC0+Y2FsbGJhY2sodHgtPmNhbGxiYWNrX3BhcmFtKTsKLQkJCQl0eC0+Y2FsbGJhY2sgPSBOVUxMOwotCQkJfQorCQkJcmVzLnJlc3VsdCA9IERNQV9UUkFOU19OT0VSUk9SOworCQkJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrX2ludm9rZSh0eCwgTlVMTCk7CisJCQl0eC0+Y2FsbGJhY2sgPSBOVUxMOworCQkJdHgtPmNhbGxiYWNrX3Jlc3VsdCA9IE5VTEw7CiAJCX0KIAogCQlpZiAodHgtPnBoeXMgPT0gcGh5c19jb21wbGV0ZSkKQEAgLTYyMiw3ICs2NzAsOCBAQAogCWlmIChpc19pb2F0X2hhbHRlZCgqaW9hdF9jaGFuLT5jb21wbGV0aW9uKSkgewogCQl1MzIgY2hhbmVyciA9IHJlYWRsKGlvYXRfY2hhbi0+cmVnX2Jhc2UgKyBJT0FUX0NIQU5FUlJfT0ZGU0VUKTsKIAotCQlpZiAoY2hhbmVyciAmIElPQVRfQ0hBTkVSUl9IQU5ETEVfTUFTSykgeworCQlpZiAoY2hhbmVyciAmCisJCSAgICAoSU9BVF9DSEFORVJSX0hBTkRMRV9NQVNLIHwgSU9BVF9DSEFORVJSX1JFQ09WRVJfTUFTSykpIHsKIAkJCW1vZF90aW1lcigmaW9hdF9jaGFuLT50aW1lciwgamlmZmllcyArIElETEVfVElNRU9VVCk7CiAJCQlpb2F0X2VoKGlvYXRfY2hhbik7CiAJCX0KQEAgLTY1Miw2ICs3MDEsNjEgQEAKIAlfX2lvYXRfcmVzdGFydF9jaGFuKGlvYXRfY2hhbik7CiB9CiAKKworc3RhdGljIHZvaWQgaW9hdF9hYm9ydF9kZXNjcyhzdHJ1Y3QgaW9hdGRtYV9jaGFuICppb2F0X2NoYW4pCit7CisJc3RydWN0IGlvYXRkbWFfZGV2aWNlICppb2F0X2RtYSA9IGlvYXRfY2hhbi0+aW9hdF9kbWE7CisJc3RydWN0IGlvYXRfcmluZ19lbnQgKmRlc2M7CisJdTE2IGFjdGl2ZTsKKwlpbnQgaWR4ID0gaW9hdF9jaGFuLT50YWlsLCBpOworCisJLyoKKwkgKiBXZSBhc3N1bWUgdGhhdCB0aGUgZmFpbGVkIGRlc2NyaXB0b3IgaGFzIGJlZW4gcHJvY2Vzc2VkLgorCSAqIE5vdyB3ZSBhcmUganVzdCByZXR1cm5pbmcgYWxsIHRoZSByZW1haW5pbmcgc3VibWl0dGVkCisJICogZGVzY3JpcHRvcnMgdG8gYWJvcnQuCisJICovCisJYWN0aXZlID0gaW9hdF9yaW5nX2FjdGl2ZShpb2F0X2NoYW4pOworCisJLyogd2Ugc2tpcCB0aGUgZmFpbGVkIGRlc2NyaXB0b3IgdGhhdCB0YWlsIHBvaW50cyB0byAqLworCWZvciAoaSA9IDE7IGkgPCBhY3RpdmU7IGkrKykgeworCQlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4OworCisJCXNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpOworCQlwcmVmZXRjaChpb2F0X2dldF9yaW5nX2VudChpb2F0X2NoYW4sIGlkeCArIGkgKyAxKSk7CisJCWRlc2MgPSBpb2F0X2dldF9yaW5nX2VudChpb2F0X2NoYW4sIGlkeCArIGkpOworCisJCXR4ID0gJmRlc2MtPnR4ZDsKKwkJaWYgKHR4LT5jb29raWUpIHsKKwkJCXN0cnVjdCBkbWFlbmdpbmVfcmVzdWx0IHJlczsKKworCQkJZG1hX2Nvb2tpZV9jb21wbGV0ZSh0eCk7CisJCQlkbWFfZGVzY3JpcHRvcl91bm1hcCh0eCk7CisJCQlyZXMucmVzdWx0ID0gRE1BX1RSQU5TX0FCT1JURUQ7CisJCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2tfaW52b2tlKHR4LCAmcmVzKTsKKwkJCXR4LT5jYWxsYmFjayA9IE5VTEw7CisJCQl0eC0+Y2FsbGJhY2tfcmVzdWx0ID0gTlVMTDsKKwkJfQorCisJCS8qIHNraXAgZXh0ZW5kZWQgZGVzY3JpcHRvcnMgKi8KKwkJaWYgKGRlc2NfaGFzX2V4dChkZXNjKSkgeworCQkJV0FSTl9PTihpICsgMSA+PSBhY3RpdmUpOworCQkJaSsrOworCQl9CisKKwkJLyogY2xlYW51cCBzdXBlciBleHRlbmRlZCBkZXNjcmlwdG9ycyAqLworCQlpZiAoZGVzYy0+c2VkKSB7CisJCQlpb2F0X2ZyZWVfc2VkKGlvYXRfZG1hLCBkZXNjLT5zZWQpOworCQkJZGVzYy0+c2VkID0gTlVMTDsKKwkJfQorCX0KKworCXNtcF9tYigpOyAvKiBmaW5pc2ggYWxsIGRlc2NyaXB0b3IgcmVhZHMgYmVmb3JlIGluY3JlbWVudGluZyB0YWlsICovCisJaW9hdF9jaGFuLT50YWlsID0gaWR4ICsgYWN0aXZlOworCisJZGVzYyA9IGlvYXRfZ2V0X3JpbmdfZW50KGlvYXRfY2hhbiwgaW9hdF9jaGFuLT50YWlsKTsKKwlpb2F0X2NoYW4tPmxhc3RfY29tcGxldGlvbiA9ICppb2F0X2NoYW4tPmNvbXBsZXRpb24gPSBkZXNjLT50eGQucGh5czsKK30KKwogc3RhdGljIHZvaWQgaW9hdF9laChzdHJ1Y3QgaW9hdGRtYV9jaGFuICppb2F0X2NoYW4pCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wZGV2KGlvYXRfY2hhbik7CkBAIC02NjIsNiArNzY2LDggQEAKIAl1MzIgZXJyX2hhbmRsZWQgPSAwOwogCXUzMiBjaGFuZXJyX2ludDsKIAl1MzIgY2hhbmVycjsKKwlib29sIGFib3J0ID0gZmFsc2U7CisJc3RydWN0IGRtYWVuZ2luZV9yZXN1bHQgcmVzOwogCiAJLyogY2xlYW51cCBzbyB0YWlsIHBvaW50cyB0byBkZXNjcmlwdG9yIHRoYXQgY2F1c2VkIHRoZSBlcnJvciAqLwogCWlmIChpb2F0X2NsZWFudXBfcHJlYW1ibGUoaW9hdF9jaGFuLCAmcGh5c19jb21wbGV0ZSkpCkBAIC02OTcsMzAgKzgwMyw1NSBAQAogCQlicmVhazsKIAl9CiAKKwlpZiAoY2hhbmVyciAmIElPQVRfQ0hBTkVSUl9SRUNPVkVSX01BU0spIHsKKwkJaWYgKGNoYW5lcnIgJiBJT0FUX0NIQU5FUlJfUkVBRF9EQVRBX0VSUikgeworCQkJcmVzLnJlc3VsdCA9IERNQV9UUkFOU19SRUFEX0ZBSUxFRDsKKwkJCWVycl9oYW5kbGVkIHw9IElPQVRfQ0hBTkVSUl9SRUFEX0RBVEFfRVJSOworCQl9IGVsc2UgaWYgKGNoYW5lcnIgJiBJT0FUX0NIQU5FUlJfV1JJVEVfREFUQV9FUlIpIHsKKwkJCXJlcy5yZXN1bHQgPSBETUFfVFJBTlNfV1JJVEVfRkFJTEVEOworCQkJZXJyX2hhbmRsZWQgfD0gSU9BVF9DSEFORVJSX1dSSVRFX0RBVEFfRVJSOworCQl9CisKKwkJYWJvcnQgPSB0cnVlOworCX0gZWxzZQorCQlyZXMucmVzdWx0ID0gRE1BX1RSQU5TX05PRVJST1I7CisKIAkvKiBmYXVsdCBvbiB1bmhhbmRsZWQgZXJyb3Igb3Igc3B1cmlvdXMgaGFsdCAqLwogCWlmIChjaGFuZXJyIF4gZXJyX2hhbmRsZWQgfHwgY2hhbmVyciA9PSAwKSB7CiAJCWRldl9lcnIodG9fZGV2KGlvYXRfY2hhbiksICIlczogZmF0YWwgZXJyb3IgKCV4OiV4KVxuIiwKIAkJCV9fZnVuY19fLCBjaGFuZXJyLCBlcnJfaGFuZGxlZCk7CisJCWRldl9lcnIodG9fZGV2KGlvYXRfY2hhbiksICJFcnJvcnMgaGFuZGxlZDpcbiIpOworCQlpb2F0X3ByaW50X2NoYW5lcnJzKGlvYXRfY2hhbiwgZXJyX2hhbmRsZWQpOworCQlkZXZfZXJyKHRvX2Rldihpb2F0X2NoYW4pLCAiRXJyb3JzIG5vdCBoYW5kbGVkOlxuIik7CisJCWlvYXRfcHJpbnRfY2hhbmVycnMoaW9hdF9jaGFuLCAoY2hhbmVyciAmIH5lcnJfaGFuZGxlZCkpOworCiAJCUJVRygpOwotCX0gZWxzZSB7IC8qIGNsZWFudXAgdGhlIGZhdWx0eSBkZXNjcmlwdG9yICovCi0JCXR4ID0gJmRlc2MtPnR4ZDsKLQkJaWYgKHR4LT5jb29raWUpIHsKLQkJCWRtYV9jb29raWVfY29tcGxldGUodHgpOwotCQkJZG1hX2Rlc2NyaXB0b3JfdW5tYXAodHgpOwotCQkJaWYgKHR4LT5jYWxsYmFjaykgewotCQkJCXR4LT5jYWxsYmFjayh0eC0+Y2FsbGJhY2tfcGFyYW0pOwotCQkJCXR4LT5jYWxsYmFjayA9IE5VTEw7Ci0JCQl9Ci0JCX0KIAl9CiAKLQl3cml0ZWwoY2hhbmVyciwgaW9hdF9jaGFuLT5yZWdfYmFzZSArIElPQVRfQ0hBTkVSUl9PRkZTRVQpOwotCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgSU9BVF9QQ0lfQ0hBTkVSUl9JTlRfT0ZGU0VULCBjaGFuZXJyX2ludCk7CisJLyogY2xlYW51cCB0aGUgZmF1bHR5IGRlc2NyaXB0b3Igc2luY2Ugd2UgYXJlIGNvbnRpbnVpbmcgKi8KKwl0eCA9ICZkZXNjLT50eGQ7CisJaWYgKHR4LT5jb29raWUpIHsKKwkJZG1hX2Nvb2tpZV9jb21wbGV0ZSh0eCk7CisJCWRtYV9kZXNjcmlwdG9yX3VubWFwKHR4KTsKKwkJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrX2ludm9rZSh0eCwgJnJlcyk7CisJCXR4LT5jYWxsYmFjayA9IE5VTEw7CisJCXR4LT5jYWxsYmFja19yZXN1bHQgPSBOVUxMOworCX0KIAogCS8qIG1hcmsgZmF1bHRpbmcgZGVzY3JpcHRvciBhcyBjb21wbGV0ZSAqLwogCSppb2F0X2NoYW4tPmNvbXBsZXRpb24gPSBkZXNjLT50eGQucGh5czsKIAogCXNwaW5fbG9ja19iaCgmaW9hdF9jaGFuLT5wcmVwX2xvY2spOworCS8qIHdlIG5lZWQgYWJvcnQgYWxsIGRlc2NyaXB0b3JzICovCisJaWYgKGFib3J0KSB7CisJCWlvYXRfYWJvcnRfZGVzY3MoaW9hdF9jaGFuKTsKKwkJLyogY2xlYW4gdXAgdGhlIGNoYW5uZWwsIHdlIGNvdWxkIGJlIGluIHdlaXJkIHN0YXRlICovCisJCWlvYXRfcmVzZXRfaHcoaW9hdF9jaGFuKTsKKwl9CisKKwl3cml0ZWwoY2hhbmVyciwgaW9hdF9jaGFuLT5yZWdfYmFzZSArIElPQVRfQ0hBTkVSUl9PRkZTRVQpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgSU9BVF9QQ0lfQ0hBTkVSUl9JTlRfT0ZGU0VULCBjaGFuZXJyX2ludCk7CisKIAlpb2F0X3Jlc3RhcnRfY2hhbm5lbChpb2F0X2NoYW4pOwogCXNwaW5fdW5sb2NrX2JoKCZpb2F0X2NoYW4tPnByZXBfbG9jayk7CiB9CkBAIC03NTMsMTAgKzg4NCwyOCBAQAogCQljaGFuZXJyID0gcmVhZGwoaW9hdF9jaGFuLT5yZWdfYmFzZSArIElPQVRfQ0hBTkVSUl9PRkZTRVQpOwogCQlkZXZfZXJyKHRvX2Rldihpb2F0X2NoYW4pLCAiJXM6IENoYW5uZWwgaGFsdGVkICgleClcbiIsCiAJCQlfX2Z1bmNfXywgY2hhbmVycik7Ci0JCWlmICh0ZXN0X2JpdChJT0FUX1JVTiwgJmlvYXRfY2hhbi0+c3RhdGUpKQotCQkJQlVHX09OKGlzX2lvYXRfYnVnKGNoYW5lcnIpKTsKLQkJZWxzZSAvKiB3ZSBuZXZlciBnb3Qgb2ZmIHRoZSBncm91bmQgKi8KLQkJCXJldHVybjsKKwkJZGV2X2Vycih0b19kZXYoaW9hdF9jaGFuKSwgIkVycm9yczpcbiIpOworCQlpb2F0X3ByaW50X2NoYW5lcnJzKGlvYXRfY2hhbiwgY2hhbmVycik7CisKKwkJaWYgKHRlc3RfYml0KElPQVRfUlVOLCAmaW9hdF9jaGFuLT5zdGF0ZSkpIHsKKwkJCXNwaW5fbG9ja19iaCgmaW9hdF9jaGFuLT5jbGVhbnVwX2xvY2spOworCQkJc3Bpbl9sb2NrX2JoKCZpb2F0X2NoYW4tPnByZXBfbG9jayk7CisJCQlzZXRfYml0KElPQVRfQ0hBTl9ET1dOLCAmaW9hdF9jaGFuLT5zdGF0ZSk7CisJCQlzcGluX3VubG9ja19iaCgmaW9hdF9jaGFuLT5wcmVwX2xvY2spOworCisJCQlpb2F0X2Fib3J0X2Rlc2NzKGlvYXRfY2hhbik7CisJCQlkZXZfd2Fybih0b19kZXYoaW9hdF9jaGFuKSwgIlJlc2V0IGNoYW5uZWwuLi5cbiIpOworCQkJaW9hdF9yZXNldF9odyhpb2F0X2NoYW4pOworCQkJZGV2X3dhcm4odG9fZGV2KGlvYXRfY2hhbiksICJSZXN0YXJ0IGNoYW5uZWwuLi5cbiIpOworCQkJaW9hdF9yZXN0YXJ0X2NoYW5uZWwoaW9hdF9jaGFuKTsKKworCQkJc3Bpbl9sb2NrX2JoKCZpb2F0X2NoYW4tPnByZXBfbG9jayk7CisJCQljbGVhcl9iaXQoSU9BVF9DSEFOX0RPV04sICZpb2F0X2NoYW4tPnN0YXRlKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZpb2F0X2NoYW4tPnByZXBfbG9jayk7CisJCQlzcGluX3VubG9ja19iaCgmaW9hdF9jaGFuLT5jbGVhbnVwX2xvY2spOworCQl9CisKKwkJcmV0dXJuOwogCX0KIAogCXNwaW5fbG9ja19iaCgmaW9hdF9jaGFuLT5jbGVhbnVwX2xvY2spOwpAQCAtNzgwLDE0ICs5MjksMjYgQEAKIAkJdTMyIGNoYW5lcnI7CiAKIAkJY2hhbmVyciA9IHJlYWRsKGlvYXRfY2hhbi0+cmVnX2Jhc2UgKyBJT0FUX0NIQU5FUlJfT0ZGU0VUKTsKLQkJZGV2X3dhcm4odG9fZGV2KGlvYXRfY2hhbiksICJSZXN0YXJ0aW5nIGNoYW5uZWwuLi5cbiIpOwotCQlkZXZfd2Fybih0b19kZXYoaW9hdF9jaGFuKSwgIkNIQU5TVFM6ICUjTHggQ0hBTkVSUjogJSN4XG4iLAotCQkJIHN0YXR1cywgY2hhbmVycik7Ci0JCWRldl93YXJuKHRvX2Rldihpb2F0X2NoYW4pLCAiQWN0aXZlIGRlc2NyaXB0b3JzOiAlZFxuIiwKLQkJCSBpb2F0X3JpbmdfYWN0aXZlKGlvYXRfY2hhbikpOworCQlkZXZfZXJyKHRvX2Rldihpb2F0X2NoYW4pLCAiQ0hBTlNUUzogJSNMeCBDSEFORVJSOiAlI3hcbiIsCisJCQlzdGF0dXMsIGNoYW5lcnIpOworCQlkZXZfZXJyKHRvX2Rldihpb2F0X2NoYW4pLCAiRXJyb3JzOlxuIik7CisJCWlvYXRfcHJpbnRfY2hhbmVycnMoaW9hdF9jaGFuLCBjaGFuZXJyKTsKKworCQlkZXZfZGJnKHRvX2Rldihpb2F0X2NoYW4pLCAiQWN0aXZlIGRlc2NyaXB0b3JzOiAlZFxuIiwKKwkJCWlvYXRfcmluZ19hY3RpdmUoaW9hdF9jaGFuKSk7CiAKIAkJc3Bpbl9sb2NrX2JoKCZpb2F0X2NoYW4tPnByZXBfbG9jayk7CisJCXNldF9iaXQoSU9BVF9DSEFOX0RPV04sICZpb2F0X2NoYW4tPnN0YXRlKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmlvYXRfY2hhbi0+cHJlcF9sb2NrKTsKKworCQlpb2F0X2Fib3J0X2Rlc2NzKGlvYXRfY2hhbik7CisJCWRldl93YXJuKHRvX2Rldihpb2F0X2NoYW4pLCAiUmVzZXR0aW5nIGNoYW5uZWwuLi5cbiIpOworCQlpb2F0X3Jlc2V0X2h3KGlvYXRfY2hhbik7CisJCWRldl93YXJuKHRvX2Rldihpb2F0X2NoYW4pLCAiUmVzdGFydGluZyBjaGFubmVsLi4uXG4iKTsKIAkJaW9hdF9yZXN0YXJ0X2NoYW5uZWwoaW9hdF9jaGFuKTsKKworCQlzcGluX2xvY2tfYmgoJmlvYXRfY2hhbi0+cHJlcF9sb2NrKTsKKwkJY2xlYXJfYml0KElPQVRfQ0hBTl9ET1dOLCAmaW9hdF9jaGFuLT5zdGF0ZSk7CiAJCXNwaW5fdW5sb2NrX2JoKCZpb2F0X2NoYW4tPnByZXBfbG9jayk7CiAJCXNwaW5fdW5sb2NrX2JoKCZpb2F0X2NoYW4tPmNsZWFudXBfbG9jayk7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2lvYXQvaW5pdC5jIGIvZHJpdmVycy9kbWEvaW9hdC9pbml0LmMKaW5kZXggNzE0NWY3Ny4uMDE1ZjcxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvaW9hdC9pbml0LmMKKysrIGIvZHJpdmVycy9kbWEvaW9hdC9pbml0LmMKQEAgLTgyOCw3ICs4MjgsNyBAQAogCiAJZGVzdF9kbWEgPSBkbWFfbWFwX3BhZ2UoZGV2LCBkZXN0LCAwLCBQQUdFX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CiAJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgZGVzdF9kbWEpKQotCQlnb3RvIGRtYV91bm1hcDsKKwkJZ290byBmcmVlX3Jlc291cmNlczsKIAogCWZvciAoaSA9IDA7IGkgPCBJT0FUX05VTV9TUkNfVEVTVDsgaSsrKQogCQlkbWFfc3Jjc1tpXSA9IERNQV9FUlJPUl9DT0RFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaW9hdC9yZWdpc3RlcnMuaCBiL2RyaXZlcnMvZG1hL2lvYXQvcmVnaXN0ZXJzLmgKaW5kZXggNzA1MzQ5OC4uNDhmYTRjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvaW9hdC9yZWdpc3RlcnMuaAorKysgYi9kcml2ZXJzL2RtYS9pb2F0L3JlZ2lzdGVycy5oCkBAIC0yNDAsNiArMjQwLDggQEAKICNkZWZpbmUgSU9BVF9DSEFORVJSX0RFU0NSSVBUT1JfQ09VTlRfRVJSCTB4NDAwMDAKIAogI2RlZmluZSBJT0FUX0NIQU5FUlJfSEFORExFX01BU0sgKElPQVRfQ0hBTkVSUl9YT1JfUF9PUl9DUkNfRVJSIHwgSU9BVF9DSEFORVJSX1hPUl9RX0VSUikKKyNkZWZpbmUgSU9BVF9DSEFORVJSX1JFQ09WRVJfTUFTSyAoSU9BVF9DSEFORVJSX1JFQURfREFUQV9FUlIgfCBcCisJCQkJICAgSU9BVF9DSEFORVJSX1dSSVRFX0RBVEFfRVJSKQogCiAjZGVmaW5lIElPQVRfQ0hBTkVSUl9NQVNLX09GRlNFVAkJMHgyQwkvKiAzMi1iaXQgQ2hhbm5lbCBFcnJvciBSZWdpc3RlciAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9pb3AtYWRtYS5jIGIvZHJpdmVycy9kbWEvaW9wLWFkbWEuYwppbmRleCBmMDM5Y2ZhLi5hNDEwNjU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9pb3AtYWRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL2lvcC1hZG1hLmMKQEAgLTcxLDggKzcxLDcgQEAKIAkJLyogY2FsbCB0aGUgY2FsbGJhY2sgKG11c3Qgbm90IHNsZWVwIG9yIHN1Ym1pdCBuZXcKIAkJICogb3BlcmF0aW9ucyB0byB0aGlzIGNoYW5uZWwpCiAJCSAqLwotCQlpZiAodHgtPmNhbGxiYWNrKQotCQkJdHgtPmNhbGxiYWNrKHR4LT5jYWxsYmFja19wYXJhbSk7CisJCWRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFja19pbnZva2UodHgsIE5VTEwpOwogCiAJCWRtYV9kZXNjcmlwdG9yX3VubWFwKHR4KTsKIAkJaWYgKGRlc2MtPmdyb3VwX2hlYWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9pcHUvaXB1X2lkbWFjLmMgYi9kcml2ZXJzL2RtYS9pcHUvaXB1X2lkbWFjLmMKaW5kZXggYjU0ZjYyZC4uZWQ3NjA0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvaXB1L2lwdV9pZG1hYy5jCisrKyBiL2RyaXZlcnMvZG1hL2lwdS9pcHVfaWRtYWMuYwpAQCAtMTE2MCwxMSArMTE2MCwxMCBAQAogCXN0cnVjdCBzY2F0dGVybGlzdCAqKnNnLCAqc2duZXh0LCAqc2duZXcgPSBOVUxMOwogCS8qIE5leHQgdHJhbnNmZXIgZGVzY3JpcHRvciAqLwogCXN0cnVjdCBpZG1hY190eF9kZXNjICpkZXNjLCAqZGVzY25ldzsKLQlkbWFfYXN5bmNfdHhfY2FsbGJhY2sgY2FsbGJhY2s7Ci0Jdm9pZCAqY2FsbGJhY2tfcGFyYW07CiAJYm9vbCBkb25lID0gZmFsc2U7CiAJdTMyIHJlYWR5MCwgcmVhZHkxLCBjdXJidWYsIGVycjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBkbWFlbmdpbmVfZGVzY19jYWxsYmFjayBjYjsKIAogCS8qIElETUFDIGhhcyBjbGVhcmVkIHRoZSByZXNwZWN0aXZlIEJVRnhfUkRZIGJpdCwgd2UgbWFuYWdlIHRoZSBidWZmZXIgKi8KIApAQCAtMTI3OCwxMiArMTI3NywxMiBAQAogCiAJaWYgKGxpa2VseShzZ25ldykgJiYKIAkgICAgaXB1X3N1Ym1pdF9idWZmZXIoaWNoYW4sIGRlc2NuZXcsIHNnbmV3LCBpY2hhbi0+YWN0aXZlX2J1ZmZlcikgPCAwKSB7Ci0JCWNhbGxiYWNrID0gZGVzY25ldy0+dHhkLmNhbGxiYWNrOwotCQljYWxsYmFja19wYXJhbSA9IGRlc2NuZXctPnR4ZC5jYWxsYmFja19wYXJhbTsKKwkJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrKCZkZXNjbmV3LT50eGQsICZjYik7CisKIAkJbGlzdF9kZWxfaW5pdCgmZGVzY25ldy0+bGlzdCk7CiAJCXNwaW5fdW5sb2NrKCZpY2hhbi0+bG9jayk7Ci0JCWlmIChjYWxsYmFjaykKLQkJCWNhbGxiYWNrKGNhbGxiYWNrX3BhcmFtKTsKKworCQlkbWFlbmdpbmVfZGVzY19jYWxsYmFja19pbnZva2UoJmNiLCBOVUxMKTsKIAkJc3Bpbl9sb2NrKCZpY2hhbi0+bG9jayk7CiAJfQogCkBAIC0xMjkyLDEzICsxMjkxLDEyIEBACiAJaWYgKGRvbmUpCiAJCWRtYV9jb29raWVfY29tcGxldGUoJmRlc2MtPnR4ZCk7CiAKLQljYWxsYmFjayA9IGRlc2MtPnR4ZC5jYWxsYmFjazsKLQljYWxsYmFja19wYXJhbSA9IGRlc2MtPnR4ZC5jYWxsYmFja19wYXJhbTsKKwlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2soJmRlc2MtPnR4ZCwgJmNiKTsKIAogCXNwaW5fdW5sb2NrKCZpY2hhbi0+bG9jayk7CiAKLQlpZiAoZG9uZSAmJiAoZGVzYy0+dHhkLmZsYWdzICYgRE1BX1BSRVBfSU5URVJSVVBUKSAmJiBjYWxsYmFjaykKLQkJY2FsbGJhY2soY2FsbGJhY2tfcGFyYW0pOworCWlmIChkb25lICYmIChkZXNjLT50eGQuZmxhZ3MgJiBETUFfUFJFUF9JTlRFUlJVUFQpKQorCQlkbWFlbmdpbmVfZGVzY19jYWxsYmFja19pbnZva2UoJmNiLCBOVUxMKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2lwdS9pcHVfaXJxLmMgYi9kcml2ZXJzL2RtYS9pcHUvaXB1X2lycS5jCmluZGV4IDJiZjM3ZTYuLmRkMTg0YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2lwdS9pcHVfaXJxLmMKKysrIGIvZHJpdmVycy9kbWEvaXB1L2lwdV9pcnEuYwpAQCAtMjg2LDIyICsyODYsMjEgQEAKIAkJcmF3X3NwaW5fdW5sb2NrKCZiYW5rX2xvY2spOwogCQl3aGlsZSAoKGxpbmUgPSBmZnMoc3RhdHVzKSkpIHsKIAkJCXN0cnVjdCBpcHVfaXJxX21hcCAqbWFwOwotCQkJdW5zaWduZWQgaW50IGlycSA9IE5PX0lSUTsKKwkJCXVuc2lnbmVkIGludCBpcnE7CiAKIAkJCWxpbmUtLTsKIAkJCXN0YXR1cyAmPSB+KDFVTCA8PCBsaW5lKTsKIAogCQkJcmF3X3NwaW5fbG9jaygmYmFua19sb2NrKTsKIAkJCW1hcCA9IHNyYzJtYXAoMzIgKiBpICsgbGluZSk7Ci0JCQlpZiAobWFwKQotCQkJCWlycSA9IG1hcC0+aXJxOwotCQkJcmF3X3NwaW5fdW5sb2NrKCZiYW5rX2xvY2spOwotCiAJCQlpZiAoIW1hcCkgeworCQkJCXJhd19zcGluX3VubG9jaygmYmFua19sb2NrKTsKIAkJCQlwcl9lcnIoIklQVTogSW50ZXJydXB0IG9uIHVubWFwcGVkIHNvdXJjZSAldSBiYW5rICVkXG4iLAogCQkJCSAgICAgICBsaW5lLCBpKTsKIAkJCQljb250aW51ZTsKIAkJCX0KKwkJCWlycSA9IG1hcC0+aXJxOworCQkJcmF3X3NwaW5fdW5sb2NrKCZiYW5rX2xvY2spOwogCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycSk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9rM2RtYS5jIGIvZHJpdmVycy9kbWEvazNkbWEuYwppbmRleCAzOWRlODk4Li5hYWJjYjc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9rM2RtYS5jCisrKyBiL2RyaXZlcnMvZG1hL2szZG1hLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDEzIExpbmFybyBMdGQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgLSAyMDE1IExpbmFybyBMdGQuCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTMgSGlzaWxpY29uIExpbWl0ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTgsNiArOCw4IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZG1hcG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTI1LDIyICsyNywyOCBAQAogCiAjZGVmaW5lIERSSVZFUl9OQU1FCQkiazMtZG1hIgogI2RlZmluZSBETUFfTUFYX1NJWkUJCTB4MWZmYworI2RlZmluZSBETUFfQ1lDTElDX01BWF9QRVJJT0QJMHgxMDAwCisjZGVmaW5lIExMSV9CTE9DS19TSVpFCQkoNCAqIFBBR0VfU0laRSkKIAogI2RlZmluZSBJTlRfU1RBVAkJMHgwMAogI2RlZmluZSBJTlRfVEMxCQkJMHgwNAorI2RlZmluZSBJTlRfVEMyCQkJMHgwOAogI2RlZmluZSBJTlRfRVJSMQkJMHgwYwogI2RlZmluZSBJTlRfRVJSMgkJMHgxMAogI2RlZmluZSBJTlRfVEMxX01BU0sJCTB4MTgKKyNkZWZpbmUgSU5UX1RDMl9NQVNLCQkweDFjCiAjZGVmaW5lIElOVF9FUlIxX01BU0sJCTB4MjAKICNkZWZpbmUgSU5UX0VSUjJfTUFTSwkJMHgyNAogI2RlZmluZSBJTlRfVEMxX1JBVwkJMHg2MDAKLSNkZWZpbmUgSU5UX0VSUjFfUkFXCQkweDYwOAotI2RlZmluZSBJTlRfRVJSMl9SQVcJCTB4NjEwCisjZGVmaW5lIElOVF9UQzJfUkFXCQkweDYwOAorI2RlZmluZSBJTlRfRVJSMV9SQVcJCTB4NjEwCisjZGVmaW5lIElOVF9FUlIyX1JBVwkJMHg2MTgKICNkZWZpbmUgQ0hfUFJJCQkJMHg2ODgKICNkZWZpbmUgQ0hfU1RBVAkJCTB4NjkwCiAjZGVmaW5lIENYX0NVUl9DTlQJCTB4NzA0CiAjZGVmaW5lIENYX0xMSQkJCTB4ODAwCi0jZGVmaW5lIENYX0NOVAkJCTB4ODEwCisjZGVmaW5lIENYX0NOVDEJCQkweDgwYworI2RlZmluZSBDWF9DTlQwCQkJMHg4MTAKICNkZWZpbmUgQ1hfU1JDCQkJMHg4MTQKICNkZWZpbmUgQ1hfRFNUCQkJMHg4MTgKICNkZWZpbmUgQ1hfQ0ZHCQkJMHg4MWMKQEAgLTQ5LDYgKzU3LDcgQEAKIAogI2RlZmluZSBDWF9MTElfQ0hBSU5fRU4JCTB4MgogI2RlZmluZSBDWF9DRkdfRU4JCTB4MQorI2RlZmluZSBDWF9DRkdfTk9ERUlSUQkJQklUKDEpCiAjZGVmaW5lIENYX0NGR19NRU0yUEVSCQkoMHgxIDw8IDIpCiAjZGVmaW5lIENYX0NGR19QRVIyTUVNCQkoMHgyIDw8IDIpCiAjZGVmaW5lIENYX0NGR19TUkNJTkNSCQkoMHgxIDw8IDMxKQpAQCAtNjgsNyArNzcsNyBAQAogCWRtYV9hZGRyX3QJCWRlc2NfaHdfbGxpOwogCXNpemVfdAkJCWRlc2NfbnVtOwogCXNpemVfdAkJCXNpemU7Ci0Jc3RydWN0IGszX2Rlc2NfaHcJZGVzY19od1swXTsKKwlzdHJ1Y3QgazNfZGVzY19odwkqZGVzY19odzsKIH07CiAKIHN0cnVjdCBrM19kbWFfcGh5OwpAQCAtODEsNiArOTAsNyBAQAogCWVudW0gZG1hX3RyYW5zZmVyX2RpcmVjdGlvbiBkaXI7CiAJZG1hX2FkZHJfdAkJZGV2X2FkZHI7CiAJZW51bSBkbWFfc3RhdHVzCQlzdGF0dXM7CisJYm9vbAkJCWN5Y2xpYzsKIH07CiAKIHN0cnVjdCBrM19kbWFfcGh5IHsKQEAgLTEwMCw2ICsxMTAsNyBAQAogCXN0cnVjdCBrM19kbWFfcGh5CSpwaHk7CiAJc3RydWN0IGszX2RtYV9jaGFuCSpjaGFuczsKIAlzdHJ1Y3QgY2xrCQkqY2xrOworCXN0cnVjdCBkbWFfcG9vbAkJKnBvb2w7CiAJdTMyCQkJZG1hX2NoYW5uZWxzOwogCXUzMgkJCWRtYV9yZXF1ZXN0czsKIAl1bnNpZ25lZCBpbnQJCWlycTsKQEAgLTEzNSw2ICsxNDYsNyBAQAogCiAJdmFsID0gMHgxIDw8IHBoeS0+aWR4OwogCXdyaXRlbF9yZWxheGVkKHZhbCwgZC0+YmFzZSArIElOVF9UQzFfUkFXKTsKKwl3cml0ZWxfcmVsYXhlZCh2YWwsIGQtPmJhc2UgKyBJTlRfVEMyX1JBVyk7CiAJd3JpdGVsX3JlbGF4ZWQodmFsLCBkLT5iYXNlICsgSU5UX0VSUjFfUkFXKTsKIAl3cml0ZWxfcmVsYXhlZCh2YWwsIGQtPmJhc2UgKyBJTlRfRVJSMl9SQVcpOwogfQpAQCAtMTQyLDcgKzE1NCw3IEBACiBzdGF0aWMgdm9pZCBrM19kbWFfc2V0X2Rlc2Moc3RydWN0IGszX2RtYV9waHkgKnBoeSwgc3RydWN0IGszX2Rlc2NfaHcgKmh3KQogewogCXdyaXRlbF9yZWxheGVkKGh3LT5sbGksIHBoeS0+YmFzZSArIENYX0xMSSk7Ci0Jd3JpdGVsX3JlbGF4ZWQoaHctPmNvdW50LCBwaHktPmJhc2UgKyBDWF9DTlQpOworCXdyaXRlbF9yZWxheGVkKGh3LT5jb3VudCwgcGh5LT5iYXNlICsgQ1hfQ05UMCk7CiAJd3JpdGVsX3JlbGF4ZWQoaHctPnNhZGRyLCBwaHktPmJhc2UgKyBDWF9TUkMpOwogCXdyaXRlbF9yZWxheGVkKGh3LT5kYWRkciwgcGh5LT5iYXNlICsgQ1hfRFNUKTsKIAl3cml0ZWxfcmVsYXhlZChBWElfQ0ZHX0RFRkFVTFQsIHBoeS0+YmFzZSArIEFYSV9DRkcpOwpAQCAtMTc2LDExICsxODgsMTMgQEAKIAogCQkvKiB1bm1hc2sgaXJxICovCiAJCXdyaXRlbF9yZWxheGVkKDB4ZmZmZiwgZC0+YmFzZSArIElOVF9UQzFfTUFTSyk7CisJCXdyaXRlbF9yZWxheGVkKDB4ZmZmZiwgZC0+YmFzZSArIElOVF9UQzJfTUFTSyk7CiAJCXdyaXRlbF9yZWxheGVkKDB4ZmZmZiwgZC0+YmFzZSArIElOVF9FUlIxX01BU0spOwogCQl3cml0ZWxfcmVsYXhlZCgweGZmZmYsIGQtPmJhc2UgKyBJTlRfRVJSMl9NQVNLKTsKIAl9IGVsc2UgewogCQkvKiBtYXNrIGlycSAqLwogCQl3cml0ZWxfcmVsYXhlZCgweDAsIGQtPmJhc2UgKyBJTlRfVEMxX01BU0spOworCQl3cml0ZWxfcmVsYXhlZCgweDAsIGQtPmJhc2UgKyBJTlRfVEMyX01BU0spOwogCQl3cml0ZWxfcmVsYXhlZCgweDAsIGQtPmJhc2UgKyBJTlRfRVJSMV9NQVNLKTsKIAkJd3JpdGVsX3JlbGF4ZWQoMHgwLCBkLT5iYXNlICsgSU5UX0VSUjJfTUFTSyk7CiAJfQpAQCAtMTkzLDIyICsyMDcsMzEgQEAKIAlzdHJ1Y3QgazNfZG1hX2NoYW4gKmM7CiAJdTMyIHN0YXQgPSByZWFkbF9yZWxheGVkKGQtPmJhc2UgKyBJTlRfU1RBVCk7CiAJdTMyIHRjMSAgPSByZWFkbF9yZWxheGVkKGQtPmJhc2UgKyBJTlRfVEMxKTsKKwl1MzIgdGMyICA9IHJlYWRsX3JlbGF4ZWQoZC0+YmFzZSArIElOVF9UQzIpOwogCXUzMiBlcnIxID0gcmVhZGxfcmVsYXhlZChkLT5iYXNlICsgSU5UX0VSUjEpOwogCXUzMiBlcnIyID0gcmVhZGxfcmVsYXhlZChkLT5iYXNlICsgSU5UX0VSUjIpOwogCXUzMiBpLCBpcnFfY2hhbiA9IDA7CiAKIAl3aGlsZSAoc3RhdCkgewogCQlpID0gX19mZnMoc3RhdCk7Ci0JCXN0YXQgJj0gKHN0YXQgLSAxKTsKLQkJaWYgKGxpa2VseSh0YzEgJiBCSVQoaSkpKSB7CisJCXN0YXQgJj0gfkJJVChpKTsKKwkJaWYgKGxpa2VseSh0YzEgJiBCSVQoaSkpIHx8ICh0YzIgJiBCSVQoaSkpKSB7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCiAJCQlwID0gJmQtPnBoeVtpXTsKIAkJCWMgPSBwLT52Y2hhbjsKLQkJCWlmIChjKSB7Ci0JCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQorCQkJaWYgKGMgJiYgKHRjMSAmIEJJVChpKSkpIHsKIAkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYy0+dmMubG9jaywgZmxhZ3MpOwogCQkJCXZjaGFuX2Nvb2tpZV9jb21wbGV0ZSgmcC0+ZHNfcnVuLT52ZCk7CisJCQkJV0FSTl9PTl9PTkNFKHAtPmRzX2RvbmUpOwogCQkJCXAtPmRzX2RvbmUgPSBwLT5kc19ydW47CisJCQkJcC0+ZHNfcnVuID0gTlVMTDsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjLT52Yy5sb2NrLCBmbGFncyk7CisJCQl9CisJCQlpZiAoYyAmJiAodGMyICYgQklUKGkpKSkgeworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjLT52Yy5sb2NrLCBmbGFncyk7CisJCQkJaWYgKHAtPmRzX3J1biAhPSBOVUxMKQorCQkJCQl2Y2hhbl9jeWNsaWNfY2FsbGJhY2soJnAtPmRzX3J1bi0+dmQpOwogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMtPnZjLmxvY2ssIGZsYWdzKTsKIAkJCX0KIAkJCWlycV9jaGFuIHw9IEJJVChpKTsKQEAgLTIxOCwxNCArMjQxLDE3IEBACiAJfQogCiAJd3JpdGVsX3JlbGF4ZWQoaXJxX2NoYW4sIGQtPmJhc2UgKyBJTlRfVEMxX1JBVyk7CisJd3JpdGVsX3JlbGF4ZWQoaXJxX2NoYW4sIGQtPmJhc2UgKyBJTlRfVEMyX1JBVyk7CiAJd3JpdGVsX3JlbGF4ZWQoZXJyMSwgZC0+YmFzZSArIElOVF9FUlIxX1JBVyk7CiAJd3JpdGVsX3JlbGF4ZWQoZXJyMiwgZC0+YmFzZSArIElOVF9FUlIyX1JBVyk7CiAKLQlpZiAoaXJxX2NoYW4pIHsKKwlpZiAoaXJxX2NoYW4pCiAJCXRhc2tsZXRfc2NoZWR1bGUoJmQtPnRhc2spOworCisJaWYgKGlycV9jaGFuIHx8IGVycjEgfHwgZXJyMikKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0gZWxzZQotCQlyZXR1cm4gSVJRX05PTkU7CisKKwlyZXR1cm4gSVJRX05PTkU7CiB9CiAKIHN0YXRpYyBpbnQgazNfZG1hX3N0YXJ0X3R4ZChzdHJ1Y3QgazNfZG1hX2NoYW4gKmMpCkBAIC0yNDcsMTQgKzI3MywxNCBAQAogCQkgKiBzbyB2Yy0+ZGVzY19pc3N1ZWQgb25seSBjb250YWlucyBkZXNjIHBlbmRpbmcKIAkJICovCiAJCWxpc3RfZGVsKCZkcy0+dmQubm9kZSk7CisKKwkJV0FSTl9PTl9PTkNFKGMtPnBoeS0+ZHNfcnVuKTsKKwkJV0FSTl9PTl9PTkNFKGMtPnBoeS0+ZHNfZG9uZSk7CiAJCWMtPnBoeS0+ZHNfcnVuID0gZHM7Ci0JCWMtPnBoeS0+ZHNfZG9uZSA9IE5VTEw7CiAJCS8qIHN0YXJ0IGRtYSAqLwogCQlrM19kbWFfc2V0X2Rlc2MoYy0+cGh5LCAmZHMtPmRlc2NfaHdbMF0pOwogCQlyZXR1cm4gMDsKIAl9Ci0JYy0+cGh5LT5kc19kb25lID0gTlVMTDsKLQljLT5waHktPmRzX3J1biA9IE5VTEw7CiAJcmV0dXJuIC1FQUdBSU47CiB9CiAKQEAgLTM1MSw3ICszNzcsNyBAQAogCSAqIGl0cyB0b3RhbCBzaXplLgogCSAqLwogCXZkID0gdmNoYW5fZmluZF9kZXNjKCZjLT52YywgY29va2llKTsKLQlpZiAodmQpIHsKKwlpZiAodmQgJiYgIWMtPmN5Y2xpYykgewogCQlieXRlcyA9IGNvbnRhaW5lcl9vZih2ZCwgc3RydWN0IGszX2RtYV9kZXNjX3N3LCB2ZCktPnNpemU7CiAJfSBlbHNlIGlmICgoIXApIHx8ICghcC0+ZHNfcnVuKSkgewogCQlieXRlcyA9IDA7CkBAIC0zNjEsNyArMzg3LDggQEAKIAogCQlieXRlcyA9IGszX2RtYV9nZXRfY3Vycl9jbnQoZCwgcCk7CiAJCWNsbGkgPSBrM19kbWFfZ2V0X2N1cnJfbGxpKHApOwotCQlpbmRleCA9IChjbGxpIC0gZHMtPmRlc2NfaHdfbGxpKSAvIHNpemVvZihzdHJ1Y3QgazNfZGVzY19odyk7CisJCWluZGV4ID0gKChjbGxpIC0gZHMtPmRlc2NfaHdfbGxpKSAvCisJCQkJc2l6ZW9mKHN0cnVjdCBrM19kZXNjX2h3KSkgKyAxOwogCQlmb3IgKDsgaW5kZXggPCBkcy0+ZGVzY19udW07IGluZGV4KyspIHsKIAkJCWJ5dGVzICs9IGRzLT5kZXNjX2h3W2luZGV4XS5jb3VudDsKIAkJCS8qIGVuZCBvZiBsbGkgKi8KQEAgLTQwMiw5ICs0MjksMTAgQEAKIHN0YXRpYyB2b2lkIGszX2RtYV9maWxsX2Rlc2Moc3RydWN0IGszX2RtYV9kZXNjX3N3ICpkcywgZG1hX2FkZHJfdCBkc3QsCiAJCQlkbWFfYWRkcl90IHNyYywgc2l6ZV90IGxlbiwgdTMyIG51bSwgdTMyIGNjZmcpCiB7Ci0JaWYgKChudW0gKyAxKSA8IGRzLT5kZXNjX251bSkKKwlpZiAobnVtICE9IGRzLT5kZXNjX251bSAtIDEpCiAJCWRzLT5kZXNjX2h3W251bV0ubGxpID0gZHMtPmRlc2NfaHdfbGxpICsgKG51bSArIDEpICoKIAkJCXNpemVvZihzdHJ1Y3QgazNfZGVzY19odyk7CisKIAlkcy0+ZGVzY19od1tudW1dLmxsaSB8PSBDWF9MTElfQ0hBSU5fRU47CiAJZHMtPmRlc2NfaHdbbnVtXS5jb3VudCA9IGxlbjsKIAlkcy0+ZGVzY19od1tudW1dLnNhZGRyID0gc3JjOwpAQCAtNDEyLDYgKzQ0MCwzNSBAQAogCWRzLT5kZXNjX2h3W251bV0uY29uZmlnID0gY2NmZzsKIH0KIAorc3RhdGljIHN0cnVjdCBrM19kbWFfZGVzY19zdyAqazNfZG1hX2FsbG9jX2Rlc2NfcmVzb3VyY2UoaW50IG51bSwKKwkJCQkJCQlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJc3RydWN0IGszX2RtYV9jaGFuICpjID0gdG9fazNfY2hhbihjaGFuKTsKKwlzdHJ1Y3QgazNfZG1hX2Rlc2Nfc3cgKmRzOworCXN0cnVjdCBrM19kbWFfZGV2ICpkID0gdG9fazNfZG1hKGNoYW4tPmRldmljZSk7CisJaW50IGxsaV9saW1pdCA9IExMSV9CTE9DS19TSVpFIC8gc2l6ZW9mKHN0cnVjdCBrM19kZXNjX2h3KTsKKworCWlmIChudW0gPiBsbGlfbGltaXQpIHsKKwkJZGV2X2RiZyhjaGFuLT5kZXZpY2UtPmRldiwgInZjaCAlcDogc2cgbnVtICVkIGV4Y2VlZCBtYXggJWRcbiIsCisJCQkmYy0+dmMsIG51bSwgbGxpX2xpbWl0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZHMgPSBremFsbG9jKHNpemVvZigqZHMpLCBHRlBfTk9XQUlUKTsKKwlpZiAoIWRzKQorCQlyZXR1cm4gTlVMTDsKKworCWRzLT5kZXNjX2h3ID0gZG1hX3Bvb2xfYWxsb2MoZC0+cG9vbCwgR0ZQX05PV0FJVCwgJmRzLT5kZXNjX2h3X2xsaSk7CisJaWYgKCFkcy0+ZGVzY19odykgeworCQlkZXZfZGJnKGNoYW4tPmRldmljZS0+ZGV2LCAidmNoICVwOiBkbWEgYWxsb2MgZmFpbFxuIiwgJmMtPnZjKTsKKwkJa2ZyZWUoZHMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtc2V0KGRzLT5kZXNjX2h3LCAwLCBzaXplb2Yoc3RydWN0IGszX2Rlc2NfaHcpICogbnVtKTsKKwlkcy0+ZGVzY19udW0gPSBudW07CisJcmV0dXJuIGRzOworfQorCiBzdGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICprM19kbWFfcHJlcF9tZW1jcHkoCiAJc3RydWN0IGRtYV9jaGFuICpjaGFuLAlkbWFfYWRkcl90IGRzdCwgZG1hX2FkZHJfdCBzcmMsCiAJc2l6ZV90IGxlbiwgdW5zaWduZWQgbG9uZyBmbGFncykKQEAgLTQyNSwxMyArNDgyLDEzIEBACiAJCXJldHVybiBOVUxMOwogCiAJbnVtID0gRElWX1JPVU5EX1VQKGxlbiwgRE1BX01BWF9TSVpFKTsKLQlkcyA9IGt6YWxsb2Moc2l6ZW9mKCpkcykgKyBudW0gKiBzaXplb2YoZHMtPmRlc2NfaHdbMF0pLCBHRlBfQVRPTUlDKTsKKworCWRzID0gazNfZG1hX2FsbG9jX2Rlc2NfcmVzb3VyY2UobnVtLCBjaGFuKTsKIAlpZiAoIWRzKQogCQlyZXR1cm4gTlVMTDsKIAotCWRzLT5kZXNjX2h3X2xsaSA9IF9fdmlydF90b19waHlzKCh1bnNpZ25lZCBsb25nKSZkcy0+ZGVzY19od1swXSk7CisJYy0+Y3ljbGljID0gMDsKIAlkcy0+c2l6ZSA9IGxlbjsKLQlkcy0+ZGVzY19udW0gPSBudW07CiAJbnVtID0gMDsKIAogCWlmICghYy0+Y2NmZykgewpAQCAtNDc0LDE4ICs1MzEsMTcgQEAKIAlpZiAoc2dsID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCisJYy0+Y3ljbGljID0gMDsKKwogCWZvcl9lYWNoX3NnKHNnbCwgc2csIHNnbGVuLCBpKSB7CiAJCWF2YWlsID0gc2dfZG1hX2xlbihzZyk7CiAJCWlmIChhdmFpbCA+IERNQV9NQVhfU0laRSkKIAkJCW51bSArPSBESVZfUk9VTkRfVVAoYXZhaWwsIERNQV9NQVhfU0laRSkgLSAxOwogCX0KIAotCWRzID0ga3phbGxvYyhzaXplb2YoKmRzKSArIG51bSAqIHNpemVvZihkcy0+ZGVzY19od1swXSksIEdGUF9BVE9NSUMpOworCWRzID0gazNfZG1hX2FsbG9jX2Rlc2NfcmVzb3VyY2UobnVtLCBjaGFuKTsKIAlpZiAoIWRzKQogCQlyZXR1cm4gTlVMTDsKLQotCWRzLT5kZXNjX2h3X2xsaSA9IF9fdmlydF90b19waHlzKCh1bnNpZ25lZCBsb25nKSZkcy0+ZGVzY19od1swXSk7Ci0JZHMtPmRlc2NfbnVtID0gbnVtOwogCW51bSA9IDA7CiAKIAlmb3JfZWFjaF9zZyhzZ2wsIHNnLCBzZ2xlbiwgaSkgewpAQCAtNTE2LDYgKzU3Miw3MyBAQAogCXJldHVybiB2Y2hhbl90eF9wcmVwKCZjLT52YywgJmRzLT52ZCwgZmxhZ3MpOwogfQogCitzdGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKK2szX2RtYV9wcmVwX2RtYV9jeWNsaWMoc3RydWN0IGRtYV9jaGFuICpjaGFuLCBkbWFfYWRkcl90IGJ1Zl9hZGRyLAorCQkgICAgICAgc2l6ZV90IGJ1Zl9sZW4sIHNpemVfdCBwZXJpb2RfbGVuLAorCQkgICAgICAgZW51bSBkbWFfdHJhbnNmZXJfZGlyZWN0aW9uIGRpciwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IGszX2RtYV9jaGFuICpjID0gdG9fazNfY2hhbihjaGFuKTsKKwlzdHJ1Y3QgazNfZG1hX2Rlc2Nfc3cgKmRzOworCXNpemVfdCBsZW4sIGF2YWlsLCB0b3RhbCA9IDA7CisJZG1hX2FkZHJfdCBhZGRyLCBzcmMgPSAwLCBkc3QgPSAwOworCWludCBudW0gPSAxLCBzaW5jZSA9IDA7CisJc2l6ZV90IG1vZHVsbyA9IERNQV9DWUNMSUNfTUFYX1BFUklPRDsKKwl1MzIgZW5fdGMyID0gMDsKKworCWRldl9kYmcoY2hhbi0+ZGV2aWNlLT5kZXYsICIlczogYnVmICVwYWQsIGRzdCAlcGFkLCBidWYgbGVuICV6dSwgcGVyaW9kX2xlbiA9ICV6dSwgZGlyICVkXG4iLAorCSAgICAgICBfX2Z1bmNfXywgJmJ1Zl9hZGRyLCAmdG9fazNfY2hhbihjaGFuKS0+ZGV2X2FkZHIsCisJICAgICAgIGJ1Zl9sZW4sIHBlcmlvZF9sZW4sIChpbnQpZGlyKTsKKworCWF2YWlsID0gYnVmX2xlbjsKKwlpZiAoYXZhaWwgPiBtb2R1bG8pCisJCW51bSArPSBESVZfUk9VTkRfVVAoYXZhaWwsIG1vZHVsbykgLSAxOworCisJZHMgPSBrM19kbWFfYWxsb2NfZGVzY19yZXNvdXJjZShudW0sIGNoYW4pOworCWlmICghZHMpCisJCXJldHVybiBOVUxMOworCisJYy0+Y3ljbGljID0gMTsKKwlhZGRyID0gYnVmX2FkZHI7CisJYXZhaWwgPSBidWZfbGVuOworCXRvdGFsID0gYXZhaWw7CisJbnVtID0gMDsKKworCWlmIChwZXJpb2RfbGVuIDwgbW9kdWxvKQorCQltb2R1bG8gPSBwZXJpb2RfbGVuOworCisJZG8geworCQlsZW4gPSBtaW5fdChzaXplX3QsIGF2YWlsLCBtb2R1bG8pOworCisJCWlmIChkaXIgPT0gRE1BX01FTV9UT19ERVYpIHsKKwkJCXNyYyA9IGFkZHI7CisJCQlkc3QgPSBjLT5kZXZfYWRkcjsKKwkJfSBlbHNlIGlmIChkaXIgPT0gRE1BX0RFVl9UT19NRU0pIHsKKwkJCXNyYyA9IGMtPmRldl9hZGRyOworCQkJZHN0ID0gYWRkcjsKKwkJfQorCQlzaW5jZSArPSBsZW47CisJCWlmIChzaW5jZSA+PSBwZXJpb2RfbGVuKSB7CisJCQkvKiBkZXNjcmlwdG9yIGFza3MgZm9yIFRDMiBpbnRlcnJ1cHQgb24gY29tcGxldGlvbiAqLworCQkJZW5fdGMyID0gQ1hfQ0ZHX05PREVJUlE7CisJCQlzaW5jZSAtPSBwZXJpb2RfbGVuOworCQl9IGVsc2UKKwkJCWVuX3RjMiA9IDA7CisKKwkJazNfZG1hX2ZpbGxfZGVzYyhkcywgZHN0LCBzcmMsIGxlbiwgbnVtKyssIGMtPmNjZmcgfCBlbl90YzIpOworCisJCWFkZHIgKz0gbGVuOworCQlhdmFpbCAtPSBsZW47CisJfSB3aGlsZSAoYXZhaWwpOworCisJLyogIkN5Y2xpYyIgPT0gZW5kIG9mIGxpbmsgcG9pbnRzIGJhY2sgdG8gc3RhcnQgb2YgbGluayAqLworCWRzLT5kZXNjX2h3W251bSAtIDFdLmxsaSB8PSBkcy0+ZGVzY19od19sbGk7CisKKwlkcy0+c2l6ZSA9IHRvdGFsOworCisJcmV0dXJuIHZjaGFuX3R4X3ByZXAoJmMtPnZjLCAmZHMtPnZkLCBmbGFncyk7Cit9CisKIHN0YXRpYyBpbnQgazNfZG1hX2NvbmZpZyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sCiAJCQkgc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgKmNmZykKIHsKQEAgLTU1MSw3ICs2NzQsNyBAQAogCWMtPmNjZmcgfD0gKHZhbCA8PCAxMikgfCAodmFsIDw8IDE2KTsKIAogCWlmICgobWF4YnVyc3QgPT0gMCkgfHwgKG1heGJ1cnN0ID4gMTYpKQotCQl2YWwgPSAxNjsKKwkJdmFsID0gMTU7CiAJZWxzZQogCQl2YWwgPSBtYXhidXJzdCAtIDE7CiAJYy0+Y2NmZyB8PSAodmFsIDw8IDIwKSB8ICh2YWwgPDwgMjQpOwpAQCAtNTYzLDYgKzY4NiwxNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBrM19kbWFfZnJlZV9kZXNjKHN0cnVjdCB2aXJ0X2RtYV9kZXNjICp2ZCkKK3sKKwlzdHJ1Y3QgazNfZG1hX2Rlc2Nfc3cgKmRzID0KKwkJY29udGFpbmVyX29mKHZkLCBzdHJ1Y3QgazNfZG1hX2Rlc2Nfc3csIHZkKTsKKwlzdHJ1Y3QgazNfZG1hX2RldiAqZCA9IHRvX2szX2RtYSh2ZC0+dHguY2hhbi0+ZGV2aWNlKTsKKworCWRtYV9wb29sX2ZyZWUoZC0+cG9vbCwgZHMtPmRlc2NfaHcsIGRzLT5kZXNjX2h3X2xsaSk7CisJa2ZyZWUoZHMpOworfQorCiBzdGF0aWMgaW50IGszX2RtYV90ZXJtaW5hdGVfYWxsKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKIHsKIAlzdHJ1Y3QgazNfZG1hX2NoYW4gKmMgPSB0b19rM19jaGFuKGNoYW4pOwpAQCAtNTg2LDcgKzcxOSwxNSBAQAogCQlrM19kbWFfdGVybWluYXRlX2NoYW4ocCwgZCk7CiAJCWMtPnBoeSA9IE5VTEw7CiAJCXAtPnZjaGFuID0gTlVMTDsKLQkJcC0+ZHNfcnVuID0gcC0+ZHNfZG9uZSA9IE5VTEw7CisJCWlmIChwLT5kc19ydW4pIHsKKwkJCWszX2RtYV9mcmVlX2Rlc2MoJnAtPmRzX3J1bi0+dmQpOworCQkJcC0+ZHNfcnVuID0gTlVMTDsKKwkJfQorCQlpZiAocC0+ZHNfZG9uZSkgeworCQkJazNfZG1hX2ZyZWVfZGVzYygmcC0+ZHNfZG9uZS0+dmQpOworCQkJcC0+ZHNfZG9uZSA9IE5VTEw7CisJCX0KKwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjLT52Yy5sb2NrLCBmbGFncyk7CiAJdmNoYW5fZG1hX2Rlc2NfZnJlZV9saXN0KCZjLT52YywgJmhlYWQpOwpAQCAtNjM5LDE0ICs3ODAsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBrM19kbWFfZnJlZV9kZXNjKHN0cnVjdCB2aXJ0X2RtYV9kZXNjICp2ZCkKLXsKLQlzdHJ1Y3QgazNfZG1hX2Rlc2Nfc3cgKmRzID0KLQkJY29udGFpbmVyX29mKHZkLCBzdHJ1Y3QgazNfZG1hX2Rlc2Nfc3csIHZkKTsKLQotCWtmcmVlKGRzKTsKLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgazNfcGRtYV9kdF9pZHNbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gImhpc2lsaWNvbixrMy1kbWEtMS4wIiwgfSwKIAl7fQpAQCAtNzA2LDYgKzgzOSwxMiBAQAogCiAJZC0+aXJxID0gaXJxOwogCisJLyogQSBETUEgbWVtb3J5IHBvb2wgZm9yIExMSXMsIGFsaWduIG9uIDMyLWJ5dGUgYm91bmRhcnkgKi8KKwlkLT5wb29sID0gZG1hbV9wb29sX2NyZWF0ZShEUklWRVJfTkFNRSwgJm9wLT5kZXYsCisJCQkJCUxMSV9CTE9DS19TSVpFLCAzMiwgMCk7CisJaWYgKCFkLT5wb29sKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCS8qIGluaXQgcGh5IGNoYW5uZWwgKi8KIAlkLT5waHkgPSBkZXZtX2t6YWxsb2MoJm9wLT5kZXYsCiAJCWQtPmRtYV9jaGFubmVscyAqIHNpemVvZihzdHJ1Y3QgazNfZG1hX3BoeSksIEdGUF9LRVJORUwpOwpAQCAtNzIyLDExICs4NjEsMTMgQEAKIAlJTklUX0xJU1RfSEVBRCgmZC0+c2xhdmUuY2hhbm5lbHMpOwogCWRtYV9jYXBfc2V0KERNQV9TTEFWRSwgZC0+c2xhdmUuY2FwX21hc2spOwogCWRtYV9jYXBfc2V0KERNQV9NRU1DUFksIGQtPnNsYXZlLmNhcF9tYXNrKTsKKwlkbWFfY2FwX3NldChETUFfQ1lDTElDLCBkLT5zbGF2ZS5jYXBfbWFzayk7CiAJZC0+c2xhdmUuZGV2ID0gJm9wLT5kZXY7CiAJZC0+c2xhdmUuZGV2aWNlX2ZyZWVfY2hhbl9yZXNvdXJjZXMgPSBrM19kbWFfZnJlZV9jaGFuX3Jlc291cmNlczsKIAlkLT5zbGF2ZS5kZXZpY2VfdHhfc3RhdHVzID0gazNfZG1hX3R4X3N0YXR1czsKIAlkLT5zbGF2ZS5kZXZpY2VfcHJlcF9kbWFfbWVtY3B5ID0gazNfZG1hX3ByZXBfbWVtY3B5OwogCWQtPnNsYXZlLmRldmljZV9wcmVwX3NsYXZlX3NnID0gazNfZG1hX3ByZXBfc2xhdmVfc2c7CisJZC0+c2xhdmUuZGV2aWNlX3ByZXBfZG1hX2N5Y2xpYyA9IGszX2RtYV9wcmVwX2RtYV9jeWNsaWM7CiAJZC0+c2xhdmUuZGV2aWNlX2lzc3VlX3BlbmRpbmcgPSBrM19kbWFfaXNzdWVfcGVuZGluZzsKIAlkLT5zbGF2ZS5kZXZpY2VfY29uZmlnID0gazNfZG1hX2NvbmZpZzsKIAlkLT5zbGF2ZS5kZXZpY2VfcGF1c2UgPSBrM19kbWFfdHJhbnNmZXJfcGF1c2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9taWNfeDEwMF9kbWEuYyBiL2RyaXZlcnMvZG1hL21pY194MTAwX2RtYS5jCmluZGV4IDE1MDJiMjQuLjgxODI1NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL21pY194MTAwX2RtYS5jCisrKyBiL2RyaXZlcnMvZG1hL21pY194MTAwX2RtYS5jCkBAIC0xMDQsMTAgKzEwNCw4IEBACiAJCXR4ID0gJmNoLT50eF9hcnJheVtsYXN0X3RhaWxdOwogCQlpZiAodHgtPmNvb2tpZSkgewogCQkJZG1hX2Nvb2tpZV9jb21wbGV0ZSh0eCk7Ci0JCQlpZiAodHgtPmNhbGxiYWNrKSB7Ci0JCQkJdHgtPmNhbGxiYWNrKHR4LT5jYWxsYmFja19wYXJhbSk7Ci0JCQkJdHgtPmNhbGxiYWNrID0gTlVMTDsKLQkJCX0KKwkJCWRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFja19pbnZva2UodHgsIE5VTEwpOworCQkJdHgtPmNhbGxiYWNrID0gTlVMTDsKIAkJfQogCQlsYXN0X3RhaWwgPSBtaWNfZG1hX2h3X3JpbmdfaW5jKGxhc3RfdGFpbCk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvbW1wX3BkbWEuYyBiL2RyaXZlcnMvZG1hL21tcF9wZG1hLmMKaW5kZXggZjRiMjVmYi4uZWIzYTFmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvbW1wX3BkbWEuYworKysgYi9kcml2ZXJzL2RtYS9tbXBfcGRtYS5jCkBAIC04NjQsMTkgKzg2NCwxNSBAQAogCXN0cnVjdCBtbXBfcGRtYV9kZXNjX3N3ICpkZXNjLCAqX2Rlc2M7CiAJTElTVF9IRUFEKGNoYWluX2NsZWFudXApOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrIGNiOwogCiAJaWYgKGNoYW4tPmN5Y2xpY19maXJzdCkgewotCQlkbWFfYXN5bmNfdHhfY2FsbGJhY2sgY2IgPSBOVUxMOwotCQl2b2lkICpjYl9kYXRhID0gTlVMTDsKLQogCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+ZGVzY19sb2NrLCBmbGFncyk7CiAJCWRlc2MgPSBjaGFuLT5jeWNsaWNfZmlyc3Q7Ci0JCWNiID0gZGVzYy0+YXN5bmNfdHguY2FsbGJhY2s7Ci0JCWNiX2RhdGEgPSBkZXNjLT5hc3luY190eC5jYWxsYmFja19wYXJhbTsKKwkJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrKCZkZXNjLT5hc3luY190eCwgJmNiKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbi0+ZGVzY19sb2NrLCBmbGFncyk7CiAKLQkJaWYgKGNiKQotCQkJY2IoY2JfZGF0YSk7CisJCWRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrX2ludm9rZSgmY2IsIE5VTEwpOwogCiAJCXJldHVybjsKIAl9CkBAIC05MjEsOCArOTE3LDggQEAKIAkJLyogUmVtb3ZlIGZyb20gdGhlIGxpc3Qgb2YgdHJhbnNhY3Rpb25zICovCiAJCWxpc3RfZGVsKCZkZXNjLT5ub2RlKTsKIAkJLyogUnVuIHRoZSBsaW5rIGRlc2NyaXB0b3IgY2FsbGJhY2sgZnVuY3Rpb24gKi8KLQkJaWYgKHR4ZC0+Y2FsbGJhY2spCi0JCQl0eGQtPmNhbGxiYWNrKHR4ZC0+Y2FsbGJhY2tfcGFyYW0pOworCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2sodHhkLCAmY2IpOworCQlkbWFlbmdpbmVfZGVzY19jYWxsYmFja19pbnZva2UoJmNiLCBOVUxMKTsKIAogCQlkbWFfcG9vbF9mcmVlKGNoYW4tPmRlc2NfcG9vbCwgZGVzYywgdHhkLT5waHlzKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9tbXBfdGRtYS5jIGIvZHJpdmVycy9kbWEvbW1wX3RkbWEuYwppbmRleCBiMzQ0MWY1Li4xM2M2OGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9tbXBfdGRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL21tcF90ZG1hLmMKQEAgLTM0OSw5ICszNDksNyBAQAogewogCXN0cnVjdCBtbXBfdGRtYV9jaGFuICp0ZG1hYyA9IChzdHJ1Y3QgbW1wX3RkbWFfY2hhbiAqKWRhdGE7CiAKLQlpZiAodGRtYWMtPmRlc2MuY2FsbGJhY2spCi0JCXRkbWFjLT5kZXNjLmNhbGxiYWNrKHRkbWFjLT5kZXNjLmNhbGxiYWNrX3BhcmFtKTsKLQorCWRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFja19pbnZva2UoJnRkbWFjLT5kZXNjLCBOVUxMKTsKIH0KIAogc3RhdGljIHZvaWQgbW1wX3RkbWFfZnJlZV9kZXNjcmlwdG9yKHN0cnVjdCBtbXBfdGRtYV9jaGFuICp0ZG1hYykKQEAgLTQzMyw3ICs0MzEsNyBAQAogCiAJaWYgKHBlcmlvZF9sZW4gPiBURE1BX01BWF9YRkVSX0JZVEVTKSB7CiAJCWRldl9lcnIodGRtYWMtPmRldiwKLQkJCQkibWF4aW11bSBwZXJpb2Qgc2l6ZSBleGNlZWRlZDogJWQgPiAlZFxuIiwKKwkJCQkibWF4aW11bSBwZXJpb2Qgc2l6ZSBleGNlZWRlZDogJXp1ID4gJWRcbiIsCiAJCQkJcGVyaW9kX2xlbiwgVERNQV9NQVhfWEZFUl9CWVRFUyk7CiAJCWdvdG8gZXJyX291dDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9tb3hhcnQtZG1hLmMgYi9kcml2ZXJzL2RtYS9tb3hhcnQtZG1hLmMKaW5kZXggYTZlNjQyNy4uZTFhNWMyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvbW94YXJ0LWRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL21veGFydC1kbWEuYwpAQCAtNTc5LDcgKzU3OSw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobm9kZSwgMCk7Ci0JaWYgKGlycSA9PSBOT19JUlEpIHsKKwlpZiAoIWlycSkgewogCQlkZXZfZXJyKGRldiwgIm5vIElSUSByZXNvdXJjZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL21wYzUxMnhfZG1hLmMgYi9kcml2ZXJzL2RtYS9tcGM1MTJ4X2RtYS5jCmluZGV4IGZhODY1OTIuLmRkZTcxMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL21wYzUxMnhfZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvbXBjNTEyeF9kbWEuYwpAQCAtNDExLDggKzQxMSw3IEBACiAJCWxpc3RfZm9yX2VhY2hfZW50cnkobWRlc2MsICZsaXN0LCBub2RlKSB7CiAJCQlkZXNjID0gJm1kZXNjLT5kZXNjOwogCi0JCQlpZiAoZGVzYy0+Y2FsbGJhY2spCi0JCQkJZGVzYy0+Y2FsbGJhY2soZGVzYy0+Y2FsbGJhY2tfcGFyYW0pOworCQkJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrX2ludm9rZShkZXNjLCBOVUxMKTsKIAogCQkJbGFzdF9jb29raWUgPSBkZXNjLT5jb29raWU7CiAJCQlkbWFfcnVuX2RlcGVuZGVuY2llcyhkZXNjKTsKQEAgLTkyNiw3ICs5MjUsNyBAQAogCX0KIAogCW1kbWEtPmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKGRuLCAwKTsKLQlpZiAobWRtYS0+aXJxID09IE5PX0lSUSkgeworCWlmICghbWRtYS0+aXJxKSB7CiAJCWRldl9lcnIoZGV2LCAiRXJyb3IgbWFwcGluZyBJUlEhXG4iKTsKIAkJcmV0dmFsID0gLUVJTlZBTDsKIAkJZ290byBlcnI7CkBAIC05MzUsNyArOTM0LDcgQEAKIAlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoZG4sICJmc2wsbXBjODMwOC1kbWEiKSkgewogCQltZG1hLT5pc19tcGM4MzA4ID0gMTsKIAkJbWRtYS0+aXJxMiA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKGRuLCAxKTsKLQkJaWYgKG1kbWEtPmlycTIgPT0gTk9fSVJRKSB7CisJCWlmICghbWRtYS0+aXJxMikgewogCQkJZGV2X2VycihkZXYsICJFcnJvciBtYXBwaW5nIElSUSFcbiIpOwogCQkJcmV0dmFsID0gLUVJTlZBTDsKIAkJCWdvdG8gZXJyX2Rpc3Bvc2UxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvbXZfeG9yLmMgYi9kcml2ZXJzL2RtYS9tdl94b3IuYwppbmRleCBmNGM5Zjk4Li4yM2Y3NTI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9tdl94b3IuYworKysgYi9kcml2ZXJzL2RtYS9tdl94b3IuYwpAQCAtMjA2LDE0ICsyMDYsMTEgQEAKIAlpZiAoZGVzYy0+YXN5bmNfdHguY29va2llID4gMCkgewogCQljb29raWUgPSBkZXNjLT5hc3luY190eC5jb29raWU7CiAKKwkJZG1hX2Rlc2NyaXB0b3JfdW5tYXAoJmRlc2MtPmFzeW5jX3R4KTsKIAkJLyogY2FsbCB0aGUgY2FsbGJhY2sgKG11c3Qgbm90IHNsZWVwIG9yIHN1Ym1pdCBuZXcKIAkJICogb3BlcmF0aW9ucyB0byB0aGlzIGNoYW5uZWwpCiAJCSAqLwotCQlpZiAoZGVzYy0+YXN5bmNfdHguY2FsbGJhY2spCi0JCQlkZXNjLT5hc3luY190eC5jYWxsYmFjaygKLQkJCQlkZXNjLT5hc3luY190eC5jYWxsYmFja19wYXJhbSk7Ci0KLQkJZG1hX2Rlc2NyaXB0b3JfdW5tYXAoJmRlc2MtPmFzeW5jX3R4KTsKKwkJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrX2ludm9rZSgmZGVzYy0+YXN5bmNfdHgsIE5VTEwpOwogCX0KIAogCS8qIHJ1biBkZXBlbmRlbnQgb3BlcmF0aW9ucyAqLwpAQCAtNDcwLDEyICs0NjcsOTAgQEAKIAlyZXR1cm4gbXZfY2hhbi0+c2xvdHNfYWxsb2NhdGVkID8gOiAtRU5PTUVNOwogfQogCisvKgorICogQ2hlY2sgaWYgc291cmNlIG9yIGRlc3RpbmF0aW9uIGlzIGFuIFBDSWUvSU8gYWRkcmVzcyAobm9uLVNEUkFNKSBhbmQgYWRkCisgKiBhIG5ldyBNQnVzIHdpbmRvdyBpZiBuZWNlc3NhcnkuIFVzZSBhIGNhY2hlIGZvciB0aGVzZSBjaGVjayBzbyB0aGF0CisgKiB0aGUgTU1JTyBtYXBwZWQgcmVnaXN0ZXJzIGRvbid0IGhhdmUgdG8gYmUgYWNjZXNzZWQgZm9yIHRoaXMgY2hlY2sKKyAqIHRvIHNwZWVkIHVwIHRoaXMgcHJvY2Vzcy4KKyAqLworc3RhdGljIGludCBtdl94b3JfYWRkX2lvX3dpbihzdHJ1Y3QgbXZfeG9yX2NoYW4gKm12X2NoYW4sIHUzMiBhZGRyKQoreworCXN0cnVjdCBtdl94b3JfZGV2aWNlICp4b3JkZXYgPSBtdl9jaGFuLT54b3JkZXY7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gbXZfY2hhbi0+bW1yX2hpZ2hfYmFzZTsKKwl1MzIgd2luX2VuYWJsZTsKKwl1MzIgc2l6ZTsKKwl1OCB0YXJnZXQsIGF0dHI7CisJaW50IHJldDsKKwlpbnQgaTsKKworCS8qIE5vdGhpbmcgbmVlZHMgdG8gZ2V0IGRvbmUgZm9yIHRoZSBBcm1hZGEgMzcwMCAqLworCWlmICh4b3JkZXYtPnhvcl90eXBlID09IFhPUl9BUk1BREFfMzdYWCkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIExvb3Agb3ZlciB0aGUgY2FjaGVkIHdpbmRvd3MgdG8gY2hlY2ssIGlmIHRoZSByZXF1ZXN0ZWQgYXJlYQorCSAqIGlzIGFscmVhZHkgbWFwcGVkLiBJZiB0aGlzIHRoZSBjYXNlLCBub3RoaW5nIG5lZWRzIHRvIGJlIGRvbmUKKwkgKiBhbmQgd2UgY2FuIHJldHVybi4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgV0lORE9XX0NPVU5UOyBpKyspIHsKKwkJaWYgKGFkZHIgPj0geG9yZGV2LT53aW5fc3RhcnRbaV0gJiYKKwkJICAgIGFkZHIgPD0geG9yZGV2LT53aW5fZW5kW2ldKSB7CisJCQkvKiBXaW5kb3cgaXMgYWxyZWFkeSBtYXBwZWQgKi8KKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyoKKwkgKiBUaGUgd2luZG93IGlzIG5vdCBtYXBwZWQsIHNvIHdlIG5lZWQgdG8gY3JlYXRlIHRoZSBuZXcgbWFwcGluZworCSAqLworCisJLyogSWYgbm8gSU8gd2luZG93IGlzIGZvdW5kIHRoYXQgYWRkciBoYXMgdG8gYmUgbG9jYXRlZCBpbiBTRFJBTSAqLworCXJldCA9IG12ZWJ1X21idXNfZ2V0X2lvX3dpbl9pbmZvKGFkZHIsICZzaXplLCAmdGFyZ2V0LCAmYXR0cik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAwOworCisJLyoKKwkgKiBNYXNrIHRoZSBiYXNlIGFkZHIgJ2FkZHInIGFjY29yZGluZyB0byAnc2l6ZScgcmVhZCBiYWNrIGZyb20gdGhlCisJICogTUJ1cyB3aW5kb3cuIE90aGVyd2lzZSB3ZSBtaWdodCBlbmQgdXAgd2l0aCBhbiBhZGRyZXNzIGxvY2F0ZWQKKwkgKiBzb21ld2hlcmUgaW4gdGhlIG1pZGRsZSBvZiB0aGlzIGFyZWEgaGVyZS4KKwkgKi8KKwlzaXplIC09IDE7CisJYWRkciAmPSB+c2l6ZTsKKworCS8qCisJICogUmVhZGluZyBvbmUgb2YgYm90aCBlbmFibGVkIHJlZ2lzdGVyIGlzIGVub3VnaCwgYXMgdGhleSBhcmUgYWx3YXlzCisJICogcHJvZ3JhbW1lZCB0byB0aGUgaWRlbnRpY2FsIHZhbHVlcworCSAqLworCXdpbl9lbmFibGUgPSByZWFkbChiYXNlICsgV0lORE9XX0JBUl9FTkFCTEUoMCkpOworCisJLyogU2V0ICdpJyB0byB0aGUgZmlyc3QgZnJlZSB3aW5kb3cgdG8gd3JpdGUgdGhlIG5ldyB2YWx1ZXMgdG8gKi8KKwlpID0gZmZzKH53aW5fZW5hYmxlKSAtIDE7CisJaWYgKGkgPj0gV0lORE9XX0NPVU5UKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdyaXRlbCgoYWRkciAmIDB4ZmZmZjAwMDApIHwgKGF0dHIgPDwgOCkgfCB0YXJnZXQsCisJICAgICAgIGJhc2UgKyBXSU5ET1dfQkFTRShpKSk7CisJd3JpdGVsKHNpemUgJiAweGZmZmYwMDAwLCBiYXNlICsgV0lORE9XX1NJWkUoaSkpOworCisJLyogRmlsbCB0aGUgY2FjaGluZyB2YXJpYWJsZXMgZm9yIGxhdGVyIHVzZSAqLworCXhvcmRldi0+d2luX3N0YXJ0W2ldID0gYWRkcjsKKwl4b3JkZXYtPndpbl9lbmRbaV0gPSBhZGRyICsgc2l6ZTsKKworCXdpbl9lbmFibGUgfD0gKDEgPDwgaSk7CisJd2luX2VuYWJsZSB8PSAzIDw8ICgxNiArICgyICogaSkpOworCXdyaXRlbCh3aW5fZW5hYmxlLCBiYXNlICsgV0lORE9XX0JBUl9FTkFCTEUoMCkpOworCXdyaXRlbCh3aW5fZW5hYmxlLCBiYXNlICsgV0lORE9XX0JBUl9FTkFCTEUoMSkpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgogbXZfeG9yX3ByZXBfZG1hX3hvcihzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIGRtYV9hZGRyX3QgZGVzdCwgZG1hX2FkZHJfdCAqc3JjLAogCQkgICAgdW5zaWduZWQgaW50IHNyY19jbnQsIHNpemVfdCBsZW4sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IG12X3hvcl9jaGFuICptdl9jaGFuID0gdG9fbXZfeG9yX2NoYW4oY2hhbik7CiAJc3RydWN0IG12X3hvcl9kZXNjX3Nsb3QgKnN3X2Rlc2M7CisJaW50IHJldDsKIAogCWlmICh1bmxpa2VseShsZW4gPCBNVl9YT1JfTUlOX0JZVEVfQ09VTlQpKQogCQlyZXR1cm4gTlVMTDsKQEAgLTQ4Niw2ICs1NjEsMTEgQEAKIAkJIiVzIHNyY19jbnQ6ICVkIGxlbjogJXp1IGRlc3QgJXBhZCBmbGFnczogJWxkXG4iLAogCQlfX2Z1bmNfXywgc3JjX2NudCwgbGVuLCAmZGVzdCwgZmxhZ3MpOwogCisJLyogQ2hlY2sgaWYgYSBuZXcgd2luZG93IG5lZWRzIHRvIGdldCBhZGRlZCBmb3IgJ2Rlc3QnICovCisJcmV0ID0gbXZfeG9yX2FkZF9pb193aW4obXZfY2hhbiwgZGVzdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIE5VTEw7CisKIAlzd19kZXNjID0gbXZfY2hhbl9hbGxvY19zbG90KG12X2NoYW4pOwogCWlmIChzd19kZXNjKSB7CiAJCXN3X2Rlc2MtPnR5cGUgPSBETUFfWE9SOwpAQCAtNDkzLDggKzU3MywxMyBAQAogCQltdl9kZXNjX2luaXQoc3dfZGVzYywgZGVzdCwgbGVuLCBmbGFncyk7CiAJCWlmIChtdl9jaGFuLT5vcF9pbl9kZXNjID09IFhPUl9NT0RFX0lOX0RFU0MpCiAJCQltdl9kZXNjX3NldF9tb2RlKHN3X2Rlc2MpOwotCQl3aGlsZSAoc3JjX2NudC0tKQorCQl3aGlsZSAoc3JjX2NudC0tKSB7CisJCQkvKiBDaGVjayBpZiBhIG5ldyB3aW5kb3cgbmVlZHMgdG8gZ2V0IGFkZGVkIGZvciAnc3JjJyAqLworCQkJcmV0ID0gbXZfeG9yX2FkZF9pb193aW4obXZfY2hhbiwgc3JjW3NyY19jbnRdKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIE5VTEw7CiAJCQltdl9kZXNjX3NldF9zcmNfYWRkcihzd19kZXNjLCBzcmNfY250LCBzcmNbc3JjX2NudF0pOworCQl9CiAJfQogCiAJZGV2X2RiZyhtdl9jaGFuX3RvX2RldnAobXZfY2hhbiksCkBAIC05NTksNiArMTA0NCw3IEBACiAJCW12X2NoYW4tPm9wX2luX2Rlc2MgPSBYT1JfTU9ERV9JTl9ERVNDOwogCiAJZG1hX2RldiA9ICZtdl9jaGFuLT5kbWFkZXY7CisJbXZfY2hhbi0+eG9yZGV2ID0geG9yZGV2OwogCiAJLyoKIAkgKiBUaGVzZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGR1bW15IGJ1ZmZlcnMgYXJlIHVzZWQgdG8gaW1wbGVtZW50CkBAIC0xMDg2LDYgKzExNzIsMTAgQEAKIAkJICAgICAgIGRyYW0tPm1idXNfZHJhbV90YXJnZXRfaWQsIGJhc2UgKyBXSU5ET1dfQkFTRShpKSk7CiAJCXdyaXRlbCgoY3MtPnNpemUgLSAxKSAmIDB4ZmZmZjAwMDAsIGJhc2UgKyBXSU5ET1dfU0laRShpKSk7CiAKKwkJLyogRmlsbCB0aGUgY2FjaGluZyB2YXJpYWJsZXMgZm9yIGxhdGVyIHVzZSAqLworCQl4b3JkZXYtPndpbl9zdGFydFtpXSA9IGNzLT5iYXNlOworCQl4b3JkZXYtPndpbl9lbmRbaV0gPSBjcy0+YmFzZSArIGNzLT5zaXplIC0gMTsKKwogCQl3aW5fZW5hYmxlIHw9ICgxIDw8IGkpOwogCQl3aW5fZW5hYmxlIHw9IDMgPDwgKDE2ICsgKDIgKiBpKSk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvbXZfeG9yLmggYi9kcml2ZXJzL2RtYS9tdl94b3IuaAppbmRleCBiZjU2ZTA4Li44OGVlYWIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9tdl94b3IuaAorKysgYi9kcml2ZXJzL2RtYS9tdl94b3IuaApAQCAtODAsMTIgKzgwLDE3IEBACiAjZGVmaW5lIFdJTkRPV19CQVJfRU5BQkxFKGNoYW4pCSgweDQwICsgKChjaGFuKSA8PCAyKSkKICNkZWZpbmUgV0lORE9XX09WRVJSSURFX0NUUkwoY2hhbikJKDB4QTAgKyAoKGNoYW4pIDw8IDIpKQogCisjZGVmaW5lIFdJTkRPV19DT1VOVAkJOAorCiBzdHJ1Y3QgbXZfeG9yX2RldmljZSB7CiAJdm9pZCBfX2lvbWVtCSAgICAgKnhvcl9iYXNlOwogCXZvaWQgX19pb21lbQkgICAgICp4b3JfaGlnaF9iYXNlOwogCXN0cnVjdCBjbGsJICAgICAqY2xrOwogCXN0cnVjdCBtdl94b3JfY2hhbiAgICpjaGFubmVsc1tNVl9YT1JfTUFYX0NIQU5ORUxTXTsKIAlpbnQJCSAgICAgeG9yX3R5cGU7CisKKwl1MzIgICAgICAgICAgICAgICAgICB3aW5fc3RhcnRbV0lORE9XX0NPVU5UXTsKKwl1MzIgICAgICAgICAgICAgICAgICB3aW5fZW5kW1dJTkRPV19DT1VOVF07CiB9OwogCiAvKioKQEAgLTEyNyw2ICsxMzIsOCBAQAogCWNoYXIJCQlkdW1teV9kc3RbTVZfWE9SX01JTl9CWVRFX0NPVU5UXTsKIAlkbWFfYWRkcl90CQlkdW1teV9zcmNfYWRkciwgZHVtbXlfZHN0X2FkZHI7CiAJdTMyICAgICAgICAgICAgICAgICAgICAgc2F2ZWRfY29uZmlnX3JlZywgc2F2ZWRfaW50X21hc2tfcmVnOworCisJc3RydWN0IG12X3hvcl9kZXZpY2UJKnhvcmRldjsKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvbXhzLWRtYS5jIGIvZHJpdmVycy9kbWEvbXhzLWRtYS5jCmluZGV4IDYwZGUzNTIuLmUyMTcyNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL214cy1kbWEuYworKysgYi9kcml2ZXJzL2RtYS9teHMtZG1hLmMKQEAgLTMyNiw4ICszMjYsNyBAQAogewogCXN0cnVjdCBteHNfZG1hX2NoYW4gKm14c19jaGFuID0gKHN0cnVjdCBteHNfZG1hX2NoYW4gKikgZGF0YTsKIAotCWlmIChteHNfY2hhbi0+ZGVzYy5jYWxsYmFjaykKLQkJbXhzX2NoYW4tPmRlc2MuY2FsbGJhY2sobXhzX2NoYW4tPmRlc2MuY2FsbGJhY2tfcGFyYW0pOworCWRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFja19pbnZva2UoJm14c19jaGFuLT5kZXNjLCBOVUxMKTsKIH0KIAogc3RhdGljIGludCBteHNfZG1hX2lycV90b19jaGFuKHN0cnVjdCBteHNfZG1hX2VuZ2luZSAqbXhzX2RtYSwgaW50IGlycSkKQEAgLTQyOSwxMiArNDI4LDEwIEBACiAJCWdvdG8gZXJyX2FsbG9jOwogCX0KIAotCWlmIChteHNfY2hhbi0+Y2hhbl9pcnEgIT0gTk9fSVJRKSB7Ci0JCXJldCA9IHJlcXVlc3RfaXJxKG14c19jaGFuLT5jaGFuX2lycSwgbXhzX2RtYV9pbnRfaGFuZGxlciwKLQkJCQkJMCwgIm14cy1kbWEiLCBteHNfZG1hKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyX2lycTsKLQl9CisJcmV0ID0gcmVxdWVzdF9pcnEobXhzX2NoYW4tPmNoYW5faXJxLCBteHNfZG1hX2ludF9oYW5kbGVyLAorCQkJICAwLCAibXhzLWRtYSIsIG14c19kbWEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2lycTsKIAogCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShteHNfZG1hLT5jbGspOwogCWlmIChyZXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9uYnBmYXhpLmMgYi9kcml2ZXJzL2RtYS9uYnBmYXhpLmMKaW5kZXggMDhjNDVjMS4uMDlkZTcxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvbmJwZmF4aS5jCisrKyBiL2RyaXZlcnMvZG1hL25icGZheGkuYwpAQCAtMTEwMiw4ICsxMTAyLDcgQEAKIHsKIAlzdHJ1Y3QgbmJwZl9jaGFubmVsICpjaGFuID0gKHN0cnVjdCBuYnBmX2NoYW5uZWwgKilkYXRhOwogCXN0cnVjdCBuYnBmX2Rlc2MgKmRlc2MsICp0bXA7Ci0JZG1hX2FzeW5jX3R4X2NhbGxiYWNrIGNhbGxiYWNrOwotCXZvaWQgKnBhcmFtOworCXN0cnVjdCBkbWFlbmdpbmVfZGVzY19jYWxsYmFjayBjYjsKIAogCXdoaWxlICghbGlzdF9lbXB0eSgmY2hhbi0+ZG9uZSkpIHsKIAkJYm9vbCBmb3VuZCA9IGZhbHNlLCBtdXN0X3B1dCwgcmVjeWNsaW5nID0gZmFsc2U7CkBAIC0xMTUxLDE0ICsxMTUwLDEyIEBACiAJCQltdXN0X3B1dCA9IGZhbHNlOwogCQl9CiAKLQkJY2FsbGJhY2sgPSBkZXNjLT5hc3luY190eC5jYWxsYmFjazsKLQkJcGFyYW0gPSBkZXNjLT5hc3luY190eC5jYWxsYmFja19wYXJhbTsKKwkJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrKCZkZXNjLT5hc3luY190eCwgJmNiKTsKIAogCQkvKiBhY2sgYW5kIGNhbGxiYWNrIGNvbXBsZXRlZCBkZXNjcmlwdG9yICovCiAJCXNwaW5fdW5sb2NrX2lycSgmY2hhbi0+bG9jayk7CiAKLQkJaWYgKGNhbGxiYWNrKQotCQkJY2FsbGJhY2socGFyYW0pOworCQlkbWFlbmdpbmVfZGVzY19jYWxsYmFja19pbnZva2UoJmNiLCBOVUxMKTsKIAogCQlpZiAobXVzdF9wdXQpCiAJCQluYnBmX2Rlc2NfcHV0KGRlc2MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvb21hcC1kbWEuYyBiL2RyaXZlcnMvZG1hL29tYXAtZG1hLmMKaW5kZXggZDk5Y2EyYi4uN2NhMjdkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvb21hcC1kbWEuYworKysgYi9kcml2ZXJzL2RtYS9vbWFwLWRtYS5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFwb29sLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtMzIsMTAgKzMzLDEyIEBACiAJY29uc3Qgc3RydWN0IG9tYXBfZG1hX3JlZyAqcmVnX21hcDsKIAlzdHJ1Y3Qgb21hcF9zeXN0ZW1fZG1hX3BsYXRfaW5mbyAqcGxhdDsKIAlib29sIGxlZ2FjeTsKKwlib29sIGxsMTIzX3N1cHBvcnRlZDsKKwlzdHJ1Y3QgZG1hX3Bvb2wgKmRlc2NfcG9vbDsKIAl1bnNpZ25lZCBkbWFfcmVxdWVzdHM7CiAJc3BpbmxvY2tfdCBpcnFfbG9jazsKIAl1aW50MzJfdCBpcnFfZW5hYmxlX21hc2s7Ci0Jc3RydWN0IG9tYXBfY2hhbiAqbGNoX21hcFtPTUFQX1NETUFfQ0hBTk5FTFNdOworCXN0cnVjdCBvbWFwX2NoYW4gKipsY2hfbWFwOwogfTsKIAogc3RydWN0IG9tYXBfY2hhbiB7CkBAIC01NSwxNiArNTgsNDAgQEAKIAl1bnNpZ25lZCBzZ2lkeDsKIH07CiAKKyNkZWZpbmUgREVTQ19OWFRfU1ZfUkVGUkVTSAkoMHgxIDw8IDI0KQorI2RlZmluZSBERVNDX05YVF9TVl9SRVVTRQkoMHgyIDw8IDI0KQorI2RlZmluZSBERVNDX05YVF9EVl9SRUZSRVNICSgweDEgPDwgMjYpCisjZGVmaW5lIERFU0NfTlhUX0RWX1JFVVNFCSgweDIgPDwgMjYpCisjZGVmaW5lIERFU0NfTlRZUEVfVFlQRTIJKDB4MiA8PCAyOSkKKworLyogVHlwZSAyIGRlc2NyaXB0b3Igd2l0aCBTb3VyY2Ugb3IgRGVzdGluYXRpb24gYWRkcmVzcyB1cGRhdGUgKi8KK3N0cnVjdCBvbWFwX3R5cGUyX2Rlc2MgeworCXVpbnQzMl90IG5leHRfZGVzYzsKKwl1aW50MzJfdCBlbjsKKwl1aW50MzJfdCBhZGRyOyAvKiBzcmMgb3IgZHN0ICovCisJdWludDE2X3QgZm47CisJdWludDE2X3QgY2ljcjsKKwlpbnQxNl90IGNkZWk7CisJaW50MTZfdCBjc2VpOworCWludDMyX3QgY2RmaTsKKwlpbnQzMl90IGNzZmk7Cit9IF9fcGFja2VkOworCiBzdHJ1Y3Qgb21hcF9zZyB7CiAJZG1hX2FkZHJfdCBhZGRyOwogCXVpbnQzMl90IGVuOwkJLyogbnVtYmVyIG9mIGVsZW1lbnRzICgyNC1iaXQpICovCiAJdWludDMyX3QgZm47CQkvKiBudW1iZXIgb2YgZnJhbWVzICgxNi1iaXQpICovCiAJaW50MzJfdCBmaTsJCS8qIGZvciBkb3VibGUgaW5kZXhpbmcgKi8KIAlpbnQxNl90IGVpOwkJLyogZm9yIGRvdWJsZSBpbmRleGluZyAqLworCisJLyogTGlua2VkIGxpc3QgKi8KKwlzdHJ1Y3Qgb21hcF90eXBlMl9kZXNjICp0Ml9kZXNjOworCWRtYV9hZGRyX3QgdDJfZGVzY19wYWRkcjsKIH07CiAKIHN0cnVjdCBvbWFwX2Rlc2MgewogCXN0cnVjdCB2aXJ0X2RtYV9kZXNjIHZkOworCWJvb2wgdXNpbmdfbGw7CiAJZW51bSBkbWFfdHJhbnNmZXJfZGlyZWN0aW9uIGRpcjsKIAlkbWFfYWRkcl90IGRldl9hZGRyOwogCkBAIC04MSw2ICsxMDgsOSBAQAogfTsKIAogZW51bSB7CisJQ0FQU18wX1NVUFBPUlRfTEwxMjMJPSBCSVQoMjApLAkvKiBMaW5rZWQgTGlzdCB0eXBlMS8yLzMgKi8KKwlDQVBTXzBfU1VQUE9SVF9MTDQJPSBCSVQoMjEpLAkvKiBMaW5rZWQgTGlzdCB0eXBlNCAqLworCiAJQ0NSX0ZTCQkJPSBCSVQoNSksCiAJQ0NSX1JFQURfUFJJT1JJVFkJPSBCSVQoNiksCiAJQ0NSX0VOQUJMRQkJPSBCSVQoNyksCkBAIC0xNTEsNiArMTgxLDE5IEBACiAJQ0lDUl9TVVBFUl9CTE9DS19JRQk9IEJJVCgxNCksCS8qIE9NQVAyKyBvbmx5ICovCiAKIAlDTE5LX0NUUkxfRU5BQkxFX0xOSwk9IEJJVCgxNSksCisKKwlDRFBfRFNUX1ZBTElEX0lOQwk9IDAgPDwgMCwKKwlDRFBfRFNUX1ZBTElEX1JFTE9BRAk9IDEgPDwgMCwKKwlDRFBfRFNUX1ZBTElEX1JFVVNFCT0gMiA8PCAwLAorCUNEUF9TUkNfVkFMSURfSU5DCT0gMCA8PCAyLAorCUNEUF9TUkNfVkFMSURfUkVMT0FECT0gMSA8PCAyLAorCUNEUF9TUkNfVkFMSURfUkVVU0UJPSAyIDw8IDIsCisJQ0RQX05UWVBFX1RZUEUxCQk9IDEgPDwgNCwKKwlDRFBfTlRZUEVfVFlQRTIJCT0gMiA8PCA0LAorCUNEUF9OVFlQRV9UWVBFMwkJPSAzIDw8IDQsCisJQ0RQX1RNT0RFX05PUk1BTAk9IDAgPDwgOCwKKwlDRFBfVE1PREVfTExJU1QJCT0gMSA8PCA4LAorCUNEUF9GQVNUCQk9IEJJVCgxMCksCiB9OwogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgZXNfYnl0ZXNbXSA9IHsKQEAgLTE4MCw3ICsyMjMsNjQgQEAKIAogc3RhdGljIHZvaWQgb21hcF9kbWFfZGVzY19mcmVlKHN0cnVjdCB2aXJ0X2RtYV9kZXNjICp2ZCkKIHsKLQlrZnJlZShjb250YWluZXJfb2YodmQsIHN0cnVjdCBvbWFwX2Rlc2MsIHZkKSk7CisJc3RydWN0IG9tYXBfZGVzYyAqZCA9IHRvX29tYXBfZG1hX2Rlc2MoJnZkLT50eCk7CisKKwlpZiAoZC0+dXNpbmdfbGwpIHsKKwkJc3RydWN0IG9tYXBfZG1hZGV2ICpvZCA9IHRvX29tYXBfZG1hX2Rldih2ZC0+dHguY2hhbi0+ZGV2aWNlKTsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IGQtPnNnbGVuOyBpKyspIHsKKwkJCWlmIChkLT5zZ1tpXS50Ml9kZXNjKQorCQkJCWRtYV9wb29sX2ZyZWUob2QtPmRlc2NfcG9vbCwgZC0+c2dbaV0udDJfZGVzYywKKwkJCQkJICAgICAgZC0+c2dbaV0udDJfZGVzY19wYWRkcik7CisJCX0KKwl9CisKKwlrZnJlZShkKTsKK30KKworc3RhdGljIHZvaWQgb21hcF9kbWFfZmlsbF90eXBlMl9kZXNjKHN0cnVjdCBvbWFwX2Rlc2MgKmQsIGludCBpZHgsCisJCQkJICAgICBlbnVtIGRtYV90cmFuc2Zlcl9kaXJlY3Rpb24gZGlyLCBib29sIGxhc3QpCit7CisJc3RydWN0IG9tYXBfc2cgKnNnID0gJmQtPnNnW2lkeF07CisJc3RydWN0IG9tYXBfdHlwZTJfZGVzYyAqdDJfZGVzYyA9IHNnLT50Ml9kZXNjOworCisJaWYgKGlkeCkKKwkJZC0+c2dbaWR4IC0gMV0udDJfZGVzYy0+bmV4dF9kZXNjID0gc2ctPnQyX2Rlc2NfcGFkZHI7CisJaWYgKGxhc3QpCisJCXQyX2Rlc2MtPm5leHRfZGVzYyA9IDB4ZmZmZmZmZmM7CisKKwl0Ml9kZXNjLT5lbiA9IHNnLT5lbjsKKwl0Ml9kZXNjLT5hZGRyID0gc2ctPmFkZHI7CisJdDJfZGVzYy0+Zm4gPSBzZy0+Zm4gJiAweGZmZmY7CisJdDJfZGVzYy0+Y2ljciA9IGQtPmNpY3I7CisJaWYgKCFsYXN0KQorCQl0Ml9kZXNjLT5jaWNyICY9IH5DSUNSX0JMT0NLX0lFOworCisJc3dpdGNoIChkaXIpIHsKKwljYXNlIERNQV9ERVZfVE9fTUVNOgorCQl0Ml9kZXNjLT5jZGVpID0gc2ctPmVpOworCQl0Ml9kZXNjLT5jc2VpID0gZC0+ZWk7CisJCXQyX2Rlc2MtPmNkZmkgPSBzZy0+Zmk7CisJCXQyX2Rlc2MtPmNzZmkgPSBkLT5maTsKKworCQl0Ml9kZXNjLT5lbiB8PSBERVNDX05YVF9EVl9SRUZSRVNIOworCQl0Ml9kZXNjLT5lbiB8PSBERVNDX05YVF9TVl9SRVVTRTsKKwkJYnJlYWs7CisJY2FzZSBETUFfTUVNX1RPX0RFVjoKKwkJdDJfZGVzYy0+Y2RlaSA9IGQtPmVpOworCQl0Ml9kZXNjLT5jc2VpID0gc2ctPmVpOworCQl0Ml9kZXNjLT5jZGZpID0gZC0+Zmk7CisJCXQyX2Rlc2MtPmNzZmkgPSBzZy0+Zmk7CisKKwkJdDJfZGVzYy0+ZW4gfD0gREVTQ19OWFRfU1ZfUkVGUkVTSDsKKwkJdDJfZGVzYy0+ZW4gfD0gREVTQ19OWFRfRFZfUkVVU0U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisKKwl0Ml9kZXNjLT5lbiB8PSBERVNDX05UWVBFX1RZUEUyOwogfQogCiBzdGF0aWMgdm9pZCBvbWFwX2RtYV93cml0ZSh1aW50MzJfdCB2YWwsIHVuc2lnbmVkIHR5cGUsIHZvaWQgX19pb21lbSAqYWRkcikKQEAgLTI4NSw2ICszODUsNyBAQAogc3RhdGljIHZvaWQgb21hcF9kbWFfc3RhcnQoc3RydWN0IG9tYXBfY2hhbiAqYywgc3RydWN0IG9tYXBfZGVzYyAqZCkKIHsKIAlzdHJ1Y3Qgb21hcF9kbWFkZXYgKm9kID0gdG9fb21hcF9kbWFfZGV2KGMtPnZjLmNoYW4uZGV2aWNlKTsKKwl1aW50MTZfdCBjaWNyID0gZC0+Y2ljcjsKIAogCWlmIChfX2RtYV9vbWFwMTV4eChvZC0+cGxhdC0+ZG1hX2F0dHIpKQogCQlvbWFwX2RtYV9jaGFuX3dyaXRlKGMsIENQQywgMCk7CkBAIC0yOTMsOCArMzk0LDI3IEBACiAKIAlvbWFwX2RtYV9jbGVhcl9jc3IoYyk7CiAKKwlpZiAoZC0+dXNpbmdfbGwpIHsKKwkJdWludDMyX3QgY2RwID0gQ0RQX1RNT0RFX0xMSVNUIHwgQ0RQX05UWVBFX1RZUEUyIHwgQ0RQX0ZBU1Q7CisKKwkJaWYgKGQtPmRpciA9PSBETUFfREVWX1RPX01FTSkKKwkJCWNkcCB8PSAoQ0RQX0RTVF9WQUxJRF9SRUxPQUQgfCBDRFBfU1JDX1ZBTElEX1JFVVNFKTsKKwkJZWxzZQorCQkJY2RwIHw9IChDRFBfRFNUX1ZBTElEX1JFVVNFIHwgQ0RQX1NSQ19WQUxJRF9SRUxPQUQpOworCQlvbWFwX2RtYV9jaGFuX3dyaXRlKGMsIENEUCwgY2RwKTsKKworCQlvbWFwX2RtYV9jaGFuX3dyaXRlKGMsIENORFAsIGQtPnNnWzBdLnQyX2Rlc2NfcGFkZHIpOworCQlvbWFwX2RtYV9jaGFuX3dyaXRlKGMsIENDRE4sIDApOworCQlvbWFwX2RtYV9jaGFuX3dyaXRlKGMsIENDRk4sIDB4ZmZmZik7CisJCW9tYXBfZG1hX2NoYW5fd3JpdGUoYywgQ0NFTiwgMHhmZmZmZmYpOworCisJCWNpY3IgJj0gfkNJQ1JfQkxPQ0tfSUU7CisJfSBlbHNlIGlmIChvZC0+bGwxMjNfc3VwcG9ydGVkKSB7CisJCW9tYXBfZG1hX2NoYW5fd3JpdGUoYywgQ0RQLCAwKTsKKwl9CisKIAkvKiBFbmFibGUgaW50ZXJydXB0cyAqLwotCW9tYXBfZG1hX2NoYW5fd3JpdGUoYywgQ0lDUiwgZC0+Y2ljcik7CisJb21hcF9kbWFfY2hhbl93cml0ZShjLCBDSUNSLCBjaWNyKTsKIAogCS8qIEVuYWJsZSBjaGFubmVsICovCiAJb21hcF9kbWFfY2hhbl93cml0ZShjLCBDQ1IsIGQtPmNjciB8IENDUl9FTkFCTEUpOwpAQCAtMzY1LDEwICs0ODUsOSBAQAogCWMtPnJ1bm5pbmcgPSBmYWxzZTsKIH0KIAotc3RhdGljIHZvaWQgb21hcF9kbWFfc3RhcnRfc2coc3RydWN0IG9tYXBfY2hhbiAqYywgc3RydWN0IG9tYXBfZGVzYyAqZCwKLQl1bnNpZ25lZCBpZHgpCitzdGF0aWMgdm9pZCBvbWFwX2RtYV9zdGFydF9zZyhzdHJ1Y3Qgb21hcF9jaGFuICpjLCBzdHJ1Y3Qgb21hcF9kZXNjICpkKQogewotCXN0cnVjdCBvbWFwX3NnICpzZyA9IGQtPnNnICsgaWR4OworCXN0cnVjdCBvbWFwX3NnICpzZyA9IGQtPnNnICsgYy0+c2dpZHg7CiAJdW5zaWduZWQgY3hzYSwgY3hlaSwgY3hmaTsKIAogCWlmIChkLT5kaXIgPT0gRE1BX0RFVl9UT19NRU0gfHwgZC0+ZGlyID09IERNQV9NRU1fVE9fTUVNKSB7CkBAIC0zODgsNiArNTA3LDcgQEAKIAlvbWFwX2RtYV9jaGFuX3dyaXRlKGMsIENGTiwgc2ctPmZuKTsKIAogCW9tYXBfZG1hX3N0YXJ0KGMsIGQpOworCWMtPnNnaWR4Kys7CiB9CiAKIHN0YXRpYyB2b2lkIG9tYXBfZG1hX3N0YXJ0X2Rlc2Moc3RydWN0IG9tYXBfY2hhbiAqYykKQEAgLTQzMyw3ICs1NTMsNyBAQAogCW9tYXBfZG1hX2NoYW5fd3JpdGUoYywgQ1NEUCwgZC0+Y3NkcCk7CiAJb21hcF9kbWFfY2hhbl93cml0ZShjLCBDTE5LX0NUUkwsIGQtPmNsbmtfY3RybCk7CiAKLQlvbWFwX2RtYV9zdGFydF9zZyhjLCBkLCAwKTsKKwlvbWFwX2RtYV9zdGFydF9zZyhjLCBkKTsKIH0KIAogc3RhdGljIHZvaWQgb21hcF9kbWFfY2FsbGJhY2soaW50IGNoLCB1MTYgc3RhdHVzLCB2b2lkICpkYXRhKQpAQCAtNDQ1LDE1ICs1NjUsMTMgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYy0+dmMubG9jaywgZmxhZ3MpOwogCWQgPSBjLT5kZXNjOwogCWlmIChkKSB7Ci0JCWlmICghYy0+Y3ljbGljKSB7Ci0JCQlpZiAoKytjLT5zZ2lkeCA8IGQtPnNnbGVuKSB7Ci0JCQkJb21hcF9kbWFfc3RhcnRfc2coYywgZCwgYy0+c2dpZHgpOwotCQkJfSBlbHNlIHsKLQkJCQlvbWFwX2RtYV9zdGFydF9kZXNjKGMpOwotCQkJCXZjaGFuX2Nvb2tpZV9jb21wbGV0ZSgmZC0+dmQpOwotCQkJfQotCQl9IGVsc2UgeworCQlpZiAoYy0+Y3ljbGljKSB7CiAJCQl2Y2hhbl9jeWNsaWNfY2FsbGJhY2soJmQtPnZkKTsKKwkJfSBlbHNlIGlmIChkLT51c2luZ19sbCB8fCBjLT5zZ2lkeCA9PSBkLT5zZ2xlbikgeworCQkJb21hcF9kbWFfc3RhcnRfZGVzYyhjKTsKKwkJCXZjaGFuX2Nvb2tpZV9jb21wbGV0ZSgmZC0+dmQpOworCQl9IGVsc2UgeworCQkJb21hcF9kbWFfc3RhcnRfc2coYywgZCk7CiAJCX0KIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYy0+dmMubG9jaywgZmxhZ3MpOwpAQCAtNTAzLDYgKzYyMSw3IEBACiB7CiAJc3RydWN0IG9tYXBfZG1hZGV2ICpvZCA9IHRvX29tYXBfZG1hX2RldihjaGFuLT5kZXZpY2UpOwogCXN0cnVjdCBvbWFwX2NoYW4gKmMgPSB0b19vbWFwX2RtYV9jaGFuKGNoYW4pOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IG9kLT5kZGV2LmRldjsKIAlpbnQgcmV0OwogCiAJaWYgKG9kLT5sZWdhY3kpIHsKQEAgLTUxMyw4ICs2MzIsNyBAQAogCQkJCSAgICAgICAmYy0+ZG1hX2NoKTsKIAl9CiAKLQlkZXZfZGJnKG9kLT5kZGV2LmRldiwgImFsbG9jYXRpbmcgY2hhbm5lbCAldSBmb3IgJXVcbiIsCi0JCWMtPmRtYV9jaCwgYy0+ZG1hX3NpZyk7CisJZGV2X2RiZyhkZXYsICJhbGxvY2F0aW5nIGNoYW5uZWwgJXUgZm9yICV1XG4iLCBjLT5kbWFfY2gsIGMtPmRtYV9zaWcpOwogCiAJaWYgKHJldCA+PSAwKSB7CiAJCW9tYXBfZG1hX2Fzc2lnbihvZCwgYywgYy0+ZG1hX2NoKTsKQEAgLTU3MCw3ICs2ODgsOCBAQAogCXZjaGFuX2ZyZWVfY2hhbl9yZXNvdXJjZXMoJmMtPnZjKTsKIAlvbWFwX2ZyZWVfZG1hKGMtPmRtYV9jaCk7CiAKLQlkZXZfZGJnKG9kLT5kZGV2LmRldiwgImZyZWVpbmcgY2hhbm5lbCBmb3IgJXVcbiIsIGMtPmRtYV9zaWcpOworCWRldl9kYmcob2QtPmRkZXYuZGV2LCAiZnJlZWluZyBjaGFubmVsICV1IHVzZWQgZm9yICV1XG4iLCBjLT5kbWFfY2gsCisJCWMtPmRtYV9zaWcpOwogCWMtPmRtYV9zaWcgPSAwOwogfQogCkBAIC03NDQsNiArODYzLDcgQEAKIAlzdHJ1Y3Qgb21hcF9kZXNjICpkOwogCWRtYV9hZGRyX3QgZGV2X2FkZHI7CiAJdW5zaWduZWQgaSwgZXMsIGVuLCBmcmFtZV9ieXRlczsKKwlib29sIGxsX2ZhaWxlZCA9IGZhbHNlOwogCXUzMiBidXJzdDsKIAogCWlmIChkaXIgPT0gRE1BX0RFVl9UT19NRU0pIHsKQEAgLTc4NCwxMyArOTA0LDE2IEBACiAJZC0+ZXMgPSBlczsKIAogCWQtPmNjciA9IGMtPmNjciB8IENDUl9TWU5DX0ZSQU1FOwotCWlmIChkaXIgPT0gRE1BX0RFVl9UT19NRU0pCisJaWYgKGRpciA9PSBETUFfREVWX1RPX01FTSkgewogCQlkLT5jY3IgfD0gQ0NSX0RTVF9BTU9ERV9QT1NUSU5DIHwgQ0NSX1NSQ19BTU9ERV9DT05TVEFOVDsKLQllbHNlCisJCWQtPmNzZHAgPSBDU0RQX0RTVF9CVVJTVF82NCB8IENTRFBfRFNUX1BBQ0tFRDsKKwl9IGVsc2UgewogCQlkLT5jY3IgfD0gQ0NSX0RTVF9BTU9ERV9DT05TVEFOVCB8IENDUl9TUkNfQU1PREVfUE9TVElOQzsKKwkJZC0+Y3NkcCA9IENTRFBfU1JDX0JVUlNUXzY0IHwgQ1NEUF9TUkNfUEFDS0VEOworCX0KIAogCWQtPmNpY3IgPSBDSUNSX0RST1BfSUUgfCBDSUNSX0JMT0NLX0lFOwotCWQtPmNzZHAgPSBlczsKKwlkLT5jc2RwIHw9IGVzOwogCiAJaWYgKGRtYV9vbWFwMSgpKSB7CiAJCWQtPmNpY3IgfD0gQ0lDUl9UT1VUX0lFOwpAQCAtODE5LDE0ICs5NDIsNDcgQEAKIAkgKi8KIAllbiA9IGJ1cnN0OwogCWZyYW1lX2J5dGVzID0gZXNfYnl0ZXNbZXNdICogZW47CisKKwlpZiAoc2dsZW4gPj0gMikKKwkJZC0+dXNpbmdfbGwgPSBvZC0+bGwxMjNfc3VwcG9ydGVkOworCiAJZm9yX2VhY2hfc2coc2dsLCBzZ2VudCwgc2dsZW4sIGkpIHsKLQkJZC0+c2dbaV0uYWRkciA9IHNnX2RtYV9hZGRyZXNzKHNnZW50KTsKLQkJZC0+c2dbaV0uZW4gPSBlbjsKLQkJZC0+c2dbaV0uZm4gPSBzZ19kbWFfbGVuKHNnZW50KSAvIGZyYW1lX2J5dGVzOworCQlzdHJ1Y3Qgb21hcF9zZyAqb3NnID0gJmQtPnNnW2ldOworCisJCW9zZy0+YWRkciA9IHNnX2RtYV9hZGRyZXNzKHNnZW50KTsKKwkJb3NnLT5lbiA9IGVuOworCQlvc2ctPmZuID0gc2dfZG1hX2xlbihzZ2VudCkgLyBmcmFtZV9ieXRlczsKKworCQlpZiAoZC0+dXNpbmdfbGwpIHsKKwkJCW9zZy0+dDJfZGVzYyA9IGRtYV9wb29sX2FsbG9jKG9kLT5kZXNjX3Bvb2wsIEdGUF9BVE9NSUMsCisJCQkJCQkgICAgICAmb3NnLT50Ml9kZXNjX3BhZGRyKTsKKwkJCWlmICghb3NnLT50Ml9kZXNjKSB7CisJCQkJZGV2X2VycihjaGFuLT5kZXZpY2UtPmRldiwKKwkJCQkJInQyX2Rlc2NbJWRdIGFsbG9jYXRpb24gZmFpbGVkXG4iLCBpKTsKKwkJCQlsbF9mYWlsZWQgPSB0cnVlOworCQkJCWQtPnVzaW5nX2xsID0gZmFsc2U7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCW9tYXBfZG1hX2ZpbGxfdHlwZTJfZGVzYyhkLCBpLCBkaXIsIChpID09IHNnbGVuIC0gMSkpOworCQl9CiAJfQogCiAJZC0+c2dsZW4gPSBzZ2xlbjsKIAorCS8qIFJlbGVhc2UgdGhlIGRtYV9wb29sIGVudHJpZXMgaWYgb25lIGFsbG9jYXRpb24gZmFpbGVkICovCisJaWYgKGxsX2ZhaWxlZCkgeworCQlmb3IgKGkgPSAwOyBpIDwgZC0+c2dsZW47IGkrKykgeworCQkJc3RydWN0IG9tYXBfc2cgKm9zZyA9ICZkLT5zZ1tpXTsKKworCQkJaWYgKG9zZy0+dDJfZGVzYykgeworCQkJCWRtYV9wb29sX2ZyZWUob2QtPmRlc2NfcG9vbCwgb3NnLT50Ml9kZXNjLAorCQkJCQkgICAgICBvc2ctPnQyX2Rlc2NfcGFkZHIpOworCQkJCW9zZy0+dDJfZGVzYyA9IE5VTEw7CisJCQl9CisJCX0KKwl9CisKIAlyZXR1cm4gdmNoYW5fdHhfcHJlcCgmYy0+dmMsICZkLT52ZCwgdHhfZmxhZ3MpOwogfQogCkBAIC0xMjI1LDE2ICsxMzgxLDI0IEBACiAJc3Bpbl9sb2NrX2luaXQoJm9kLT5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmb2QtPmlycV9sb2NrKTsKIAotCW9kLT5kbWFfcmVxdWVzdHMgPSBPTUFQX1NETUFfUkVRVUVTVFM7Ci0JaWYgKHBkZXYtPmRldi5vZl9ub2RlICYmIG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCQkJICAgICAgImRtYS1yZXF1ZXN0cyIsCi0JCQkJCQkgICAgICAmb2QtPmRtYV9yZXF1ZXN0cykpIHsKKwlpZiAoIXBkZXYtPmRldi5vZl9ub2RlKSB7CisJCW9kLT5kbWFfcmVxdWVzdHMgPSBvZC0+cGxhdC0+ZG1hX2F0dHItPmxjaF9jb3VudDsKKwkJaWYgKHVubGlrZWx5KCFvZC0+ZG1hX3JlcXVlc3RzKSkKKwkJCW9kLT5kbWFfcmVxdWVzdHMgPSBPTUFQX1NETUFfUkVRVUVTVFM7CisJfSBlbHNlIGlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwgImRtYS1yZXF1ZXN0cyIsCisJCQkJCSZvZC0+ZG1hX3JlcXVlc3RzKSkgewogCQlkZXZfaW5mbygmcGRldi0+ZGV2LAogCQkJICJNaXNzaW5nIGRtYS1yZXF1ZXN0cyBwcm9wZXJ0eSwgdXNpbmcgJXUuXG4iLAogCQkJIE9NQVBfU0RNQV9SRVFVRVNUUyk7CisJCW9kLT5kbWFfcmVxdWVzdHMgPSBPTUFQX1NETUFfUkVRVUVTVFM7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IE9NQVBfU0RNQV9DSEFOTkVMUzsgaSsrKSB7CisJb2QtPmxjaF9tYXAgPSBkZXZtX2tjYWxsb2MoJnBkZXYtPmRldiwgb2QtPmRtYV9yZXF1ZXN0cywKKwkJCQkgICBzaXplb2YoKm9kLT5sY2hfbWFwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvZC0+bGNoX21hcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgb2QtPmRtYV9yZXF1ZXN0czsgaSsrKSB7CiAJCXJjID0gb21hcF9kbWFfY2hhbl9pbml0KG9kKTsKIAkJaWYgKHJjKSB7CiAJCQlvbWFwX2RtYV9mcmVlKG9kKTsKQEAgLTEyNTcsMTAgKzE0MjEsMjUgQEAKIAkJCXJldHVybiByYzsKIAl9CiAKKwlpZiAob21hcF9kbWFfZ2xibF9yZWFkKG9kLCBDQVBTXzApICYgQ0FQU18wX1NVUFBPUlRfTEwxMjMpCisJCW9kLT5sbDEyM19zdXBwb3J0ZWQgPSB0cnVlOworCiAJb2QtPmRkZXYuZmlsdGVyLm1hcCA9IG9kLT5wbGF0LT5zbGF2ZV9tYXA7CiAJb2QtPmRkZXYuZmlsdGVyLm1hcGNudCA9IG9kLT5wbGF0LT5zbGF2ZWNudDsKIAlvZC0+ZGRldi5maWx0ZXIuZm4gPSBvbWFwX2RtYV9maWx0ZXJfZm47CiAKKwlpZiAob2QtPmxsMTIzX3N1cHBvcnRlZCkgeworCQlvZC0+ZGVzY19wb29sID0gZG1hX3Bvb2xfY3JlYXRlKGRldl9uYW1lKCZwZGV2LT5kZXYpLAorCQkJCQkJJnBkZXYtPmRldiwKKwkJCQkJCXNpemVvZihzdHJ1Y3Qgb21hcF90eXBlMl9kZXNjKSwKKwkJCQkJCTQsIDApOworCQlpZiAoIW9kLT5kZXNjX3Bvb2wpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkidW5hYmxlIHRvIGFsbG9jYXRlIGRlc2NyaXB0b3IgcG9vbFxuIik7CisJCQlvZC0+bGwxMjNfc3VwcG9ydGVkID0gZmFsc2U7CisJCX0KKwl9CisKIAlyYyA9IGRtYV9hc3luY19kZXZpY2VfcmVnaXN0ZXIoJm9kLT5kZGV2KTsKIAlpZiAocmMpIHsKIAkJcHJfd2FybigiT01BUC1ETUE6IGZhaWxlZCB0byByZWdpc3RlciBzbGF2ZSBETUEgZW5naW5lIGRldmljZTogJWRcbiIsCkBAIC0xMjg0LDcgKzE0NjMsOCBAQAogCQl9CiAJfQogCi0JZGV2X2luZm8oJnBkZXYtPmRldiwgIk9NQVAgRE1BIGVuZ2luZSBkcml2ZXJcbiIpOworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJPTUFQIERNQSBlbmdpbmUgZHJpdmVyJXNcbiIsCisJCSBvZC0+bGwxMjNfc3VwcG9ydGVkID8gIiAoTGlua2VkTGlzdDEvMi8zIHN1cHBvcnRlZCkiIDogIiIpOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtMTMwNyw2ICsxNDg3LDkgQEAKIAkJb21hcF9kbWFfZ2xibF93cml0ZShvZCwgSVJRRU5BQkxFX0wwLCAwKTsKIAl9CiAKKwlpZiAob2QtPmxsMTIzX3N1cHBvcnRlZCkKKwkJZG1hX3Bvb2xfZGVzdHJveShvZC0+ZGVzY19wb29sKTsKKwogCW9tYXBfZG1hX2ZyZWUob2QpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9wY2hfZG1hLmMgYi9kcml2ZXJzL2RtYS9wY2hfZG1hLmMKaW5kZXggMTEzNjA1Zi4uZGY5NTcyN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3BjaF9kbWEuYworKysgYi9kcml2ZXJzL2RtYS9wY2hfZG1hLmMKQEAgLTM1NywxNCArMzU3LDEzIEBACiAJCQkgICAgICAgc3RydWN0IHBjaF9kbWFfZGVzYyAqZGVzYykKIHsKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4ZCA9ICZkZXNjLT50eGQ7Ci0JZG1hX2FzeW5jX3R4X2NhbGxiYWNrIGNhbGxiYWNrID0gdHhkLT5jYWxsYmFjazsKLQl2b2lkICpwYXJhbSA9IHR4ZC0+Y2FsbGJhY2tfcGFyYW07CisJc3RydWN0IGRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrIGNiOwogCisJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrKHR4ZCwgJmNiKTsKIAlsaXN0X3NwbGljZV9pbml0KCZkZXNjLT50eF9saXN0LCAmcGRfY2hhbi0+ZnJlZV9saXN0KTsKIAlsaXN0X21vdmUoJmRlc2MtPmRlc2Nfbm9kZSwgJnBkX2NoYW4tPmZyZWVfbGlzdCk7CiAKLQlpZiAoY2FsbGJhY2spCi0JCWNhbGxiYWNrKHBhcmFtKTsKKwlkbWFlbmdpbmVfZGVzY19jYWxsYmFja19pbnZva2UoJmNiLCBOVUxMKTsKIH0KIAogc3RhdGljIHZvaWQgcGRjX2NvbXBsZXRlX2FsbChzdHJ1Y3QgcGNoX2RtYV9jaGFuICpwZF9jaGFuKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvcGwzMzAuYyBiL2RyaXZlcnMvZG1hL3BsMzMwLmMKaW5kZXggNGZjM2ZmYi4uMDMwZmUwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvcGwzMzAuYworKysgYi9kcml2ZXJzL2RtYS9wbDMzMC5jCkBAIC0yMDM5LDE0ICsyMDM5LDEyIEBACiAJfQogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZwY2gtPmNvbXBsZXRlZF9saXN0KSkgewotCQlkbWFfYXN5bmNfdHhfY2FsbGJhY2sgY2FsbGJhY2s7Ci0JCXZvaWQgKmNhbGxiYWNrX3BhcmFtOworCQlzdHJ1Y3QgZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2sgY2I7CiAKIAkJZGVzYyA9IGxpc3RfZmlyc3RfZW50cnkoJnBjaC0+Y29tcGxldGVkX2xpc3QsCiAJCQkJCXN0cnVjdCBkbWFfcGwzMzBfZGVzYywgbm9kZSk7CiAKLQkJY2FsbGJhY2sgPSBkZXNjLT50eGQuY2FsbGJhY2s7Ci0JCWNhbGxiYWNrX3BhcmFtID0gZGVzYy0+dHhkLmNhbGxiYWNrX3BhcmFtOworCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2soJmRlc2MtPnR4ZCwgJmNiKTsKIAogCQlpZiAocGNoLT5jeWNsaWMpIHsKIAkJCWRlc2MtPnN0YXR1cyA9IFBSRVA7CkBAIC0yMDY0LDkgKzIwNjIsOSBAQAogCiAJCWRtYV9kZXNjcmlwdG9yX3VubWFwKCZkZXNjLT50eGQpOwogCi0JCWlmIChjYWxsYmFjaykgeworCQlpZiAoZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2tfdmFsaWQoJmNiKSkgewogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNoLT5sb2NrLCBmbGFncyk7Ci0JCQljYWxsYmFjayhjYWxsYmFja19wYXJhbSk7CisJCQlkbWFlbmdpbmVfZGVzY19jYWxsYmFja19pbnZva2UoJmNiLCBOVUxMKTsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZwY2gtPmxvY2ssIGZsYWdzKTsKIAkJfQogCX0KQEAgLTIyNzQsNyArMjI3Miw3IEBACiB7CiAJZW51bSBkbWFfc3RhdHVzIHJldDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBkbWFfcGwzMzBfZGVzYyAqZGVzYywgKnJ1bm5pbmcgPSBOVUxMOworCXN0cnVjdCBkbWFfcGwzMzBfZGVzYyAqZGVzYywgKnJ1bm5pbmcgPSBOVUxMLCAqbGFzdF9lbnEgPSBOVUxMOwogCXN0cnVjdCBkbWFfcGwzMzBfY2hhbiAqcGNoID0gdG9fcGNoYW4oY2hhbik7CiAJdW5zaWduZWQgaW50IHRyYW5zZmVycmVkLCByZXNpZHVhbCA9IDA7CiAKQEAgLTIyODcsMTAgKzIyODUsMTMgQEAKIAkJZ290byBvdXQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGNoLT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrKCZwY2gtPnRocmVhZC0+ZG1hYy0+bG9jayk7CiAKIAlpZiAocGNoLT50aHJlYWQtPnJlcV9ydW5uaW5nICE9IC0xKQogCQlydW5uaW5nID0gcGNoLT50aHJlYWQtPnJlcVtwY2gtPnRocmVhZC0+cmVxX3J1bm5pbmddLmRlc2M7CiAKKwlsYXN0X2VucSA9IHBjaC0+dGhyZWFkLT5yZXFbcGNoLT50aHJlYWQtPmxzdGVucV0uZGVzYzsKKwogCS8qIENoZWNrIGluIHBlbmRpbmcgbGlzdCAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVzYywgJnBjaC0+d29ya19saXN0LCBub2RlKSB7CiAJCWlmIChkZXNjLT5zdGF0dXMgPT0gRE9ORSkKQEAgLTIyOTgsNiArMjI5OSwxNSBAQAogCQllbHNlIGlmIChydW5uaW5nICYmIGRlc2MgPT0gcnVubmluZykKIAkJCXRyYW5zZmVycmVkID0KIAkJCQlwbDMzMF9nZXRfY3VycmVudF94ZmVycmVkX2NvdW50KHBjaCwgZGVzYyk7CisJCWVsc2UgaWYgKGRlc2MtPnN0YXR1cyA9PSBCVVNZKQorCQkJLyoKKwkJCSAqIEJ1c3kgYnV0IG5vdCBydW5uaW5nIG1lYW5zIGVpdGhlciBqdXN0IGVucXVldWVkLAorCQkJICogb3IgZmluaXNoZWQgYW5kIG5vdCB5ZXQgbWFya2VkIGRvbmUKKwkJCSAqLworCQkJaWYgKGRlc2MgPT0gbGFzdF9lbnEpCisJCQkJdHJhbnNmZXJyZWQgPSAwOworCQkJZWxzZQorCQkJCXRyYW5zZmVycmVkID0gZGVzYy0+Ynl0ZXNfcmVxdWVzdGVkOwogCQllbHNlCiAJCQl0cmFuc2ZlcnJlZCA9IDA7CiAJCXJlc2lkdWFsICs9IGRlc2MtPmJ5dGVzX3JlcXVlc3RlZCAtIHRyYW5zZmVycmVkOwpAQCAtMjMxOCw2ICsyMzI4LDcgQEAKIAkJaWYgKGRlc2MtPmxhc3QpCiAJCQlyZXNpZHVhbCA9IDA7CiAJfQorCXNwaW5fdW5sb2NrKCZwY2gtPnRocmVhZC0+ZG1hYy0+bG9jayk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNoLT5sb2NrLCBmbGFncyk7CiAKIG91dDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3BwYzR4eC9hZG1hLmMgYi9kcml2ZXJzL2RtYS9wcGM0eHgvYWRtYS5jCmluZGV4IGRhMzY4OGIuLmIxNTM1YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3BwYzR4eC9hZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvcHBjNHh4L2FkbWEuYwpAQCAtMTQ4MiwxNCArMTQ4MiwxMSBAQAogCQljb29raWUgPSBkZXNjLT5hc3luY190eC5jb29raWU7CiAJCWRlc2MtPmFzeW5jX3R4LmNvb2tpZSA9IDA7CiAKKwkJZG1hX2Rlc2NyaXB0b3JfdW5tYXAoJmRlc2MtPmFzeW5jX3R4KTsKIAkJLyogY2FsbCB0aGUgY2FsbGJhY2sgKG11c3Qgbm90IHNsZWVwIG9yIHN1Ym1pdCBuZXcKIAkJICogb3BlcmF0aW9ucyB0byB0aGlzIGNoYW5uZWwpCiAJCSAqLwotCQlpZiAoZGVzYy0+YXN5bmNfdHguY2FsbGJhY2spCi0JCQlkZXNjLT5hc3luY190eC5jYWxsYmFjaygKLQkJCQlkZXNjLT5hc3luY190eC5jYWxsYmFja19wYXJhbSk7Ci0KLQkJZG1hX2Rlc2NyaXB0b3JfdW5tYXAoJmRlc2MtPmFzeW5jX3R4KTsKKwkJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrX2ludm9rZSgmZGVzYy0+YXN5bmNfdHgsIE5VTEwpOwogCX0KIAogCS8qIHJ1biBkZXBlbmRlbnQgb3BlcmF0aW9ucyAqLwpAQCAtMzg5MSw3ICszODg4LDcgQEAKIAlucCA9IG9mZGV2LT5kZXYub2Zfbm9kZTsKIAlpZiAoYWRldi0+aWQgIT0gUFBDNDQwU1BFX1hPUl9JRCkgewogCQlhZGV2LT5lcnJfaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDEpOwotCQlpZiAoYWRldi0+ZXJyX2lycSA9PSBOT19JUlEpIHsKKwkJaWYgKCFhZGV2LT5lcnJfaXJxKSB7CiAJCQlkZXZfd2FybihhZGV2LT5kZXYsICJubyBlcnIgaXJxIHJlc291cmNlP1xuIik7CiAJCQkqaW5pdGNvZGUgPSBQUENfQURNQV9JTklUX0lSUTI7CiAJCQlhZGV2LT5lcnJfaXJxID0gLUVOWElPOwpAQCAtMzkwMiw3ICszODk5LDcgQEAKIAl9CiAKIAlhZGV2LT5pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7Ci0JaWYgKGFkZXYtPmlycSA9PSBOT19JUlEpIHsKKwlpZiAoIWFkZXYtPmlycSkgewogCQlkZXZfZXJyKGFkZXYtPmRldiwgIm5vIGlycSByZXNvdXJjZVxuIik7CiAJCSppbml0Y29kZSA9IFBQQ19BRE1BX0lOSVRfSVJRMTsKIAkJcmV0ID0gLUVOWElPOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvcHhhX2RtYS5jIGIvZHJpdmVycy9kbWEvcHhhX2RtYS5jCmluZGV4IGRjNzg1MGEuLjNmNTZmOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3B4YV9kbWEuYworKysgYi9kcml2ZXJzL2RtYS9weGFfZG1hLmMKQEAgLTYzOCw3ICs2MzgsNyBAQAogCQl2ZF9sYXN0X2lzc3VlZCA9IGxpc3RfZW50cnkodmMtPmRlc2NfaXNzdWVkLnByZXYsCiAJCQkJCSAgICBzdHJ1Y3QgdmlydF9kbWFfZGVzYywgbm9kZSk7CiAJCXB4YWRfZGVzY19jaGFpbih2ZF9sYXN0X2lzc3VlZCwgdmQpOwotCQlpZiAoaXNfY2hhbl9ydW5uaW5nKGNoYW4pIHx8IGlzX2Rlc2NfY29tcGxldGVkKHZkX2xhc3RfaXNzdWVkKSkKKwkJaWYgKGlzX2NoYW5fcnVubmluZyhjaGFuKSB8fCBpc19kZXNjX2NvbXBsZXRlZCh2ZCkpCiAJCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKQEAgLTY3MSw2ICs2NzEsNyBAQAogCXN0cnVjdCB2aXJ0X2RtYV9kZXNjICp2ZCwgKnRtcDsKIAl1bnNpZ25lZCBpbnQgZGNzcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWJvb2wgdmRfY29tcGxldGVkOwogCWRtYV9jb29raWVfdCBsYXN0X3N0YXJ0ZWQgPSAwOwogCiAJQlVHX09OKCFjaGFuKTsKQEAgLTY4MSwxNSArNjgyLDE3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+dmMubG9jaywgZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2ZCwgdG1wLCAmY2hhbi0+dmMuZGVzY19pc3N1ZWQsIG5vZGUpIHsKKwkJdmRfY29tcGxldGVkID0gaXNfZGVzY19jb21wbGV0ZWQodmQpOwogCQlkZXZfZGJnKCZjaGFuLT52Yy5jaGFuLmRldi0+ZGV2aWNlLAotCQkJIiVzKCk6IGNoZWNraW5nIHR4ZCAlcFsleF06IGNvbXBsZXRlZD0lZFxuIiwKLQkJCV9fZnVuY19fLCB2ZCwgdmQtPnR4LmNvb2tpZSwgaXNfZGVzY19jb21wbGV0ZWQodmQpKTsKKwkJCSIlcygpOiBjaGVja2luZyB0eGQgJXBbJXhdOiBjb21wbGV0ZWQ9JWQgZGNzcj0weCV4XG4iLAorCQkJX19mdW5jX18sIHZkLCB2ZC0+dHguY29va2llLCB2ZF9jb21wbGV0ZWQsCisJCQlkY3NyKTsKIAkJbGFzdF9zdGFydGVkID0gdmQtPnR4LmNvb2tpZTsKIAkJaWYgKHRvX3B4YWRfc3dfZGVzYyh2ZCktPmN5Y2xpYykgewogCQkJdmNoYW5fY3ljbGljX2NhbGxiYWNrKHZkKTsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmIChpc19kZXNjX2NvbXBsZXRlZCh2ZCkpIHsKKwkJaWYgKHZkX2NvbXBsZXRlZCkgewogCQkJbGlzdF9kZWwoJnZkLT5ub2RlKTsKIAkJCXZjaGFuX2Nvb2tpZV9jb21wbGV0ZSh2ZCk7CiAJCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9xY29tL2hpZG1hLmMgYi9kcml2ZXJzL2RtYS9xY29tL2hpZG1hLmMKaW5kZXggYjIzNzRjZC4uZTI0NGUxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvcWNvbS9oaWRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL3Fjb20vaGlkbWEuYwpAQCAtMTExLDYgKzExMSw3IEBACiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNjOwogCWRtYV9jb29raWVfdCBsYXN0X2Nvb2tpZTsKIAlzdHJ1Y3QgaGlkbWFfZGVzYyAqbWRlc2M7CisJc3RydWN0IGhpZG1hX2Rlc2MgKm5leHQ7CiAJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAKQEAgLTEyMiwyOCArMTIzLDM2IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWNoYW4tPmxvY2ssIGlycWZsYWdzKTsKIAogCS8qIEV4ZWN1dGUgY2FsbGJhY2tzIGFuZCBydW4gZGVwZW5kZW5jaWVzICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShtZGVzYywgJmxpc3QsIG5vZGUpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobWRlc2MsIG5leHQsICZsaXN0LCBub2RlKSB7CiAJCWVudW0gZG1hX3N0YXR1cyBsbHN0YXQ7CisJCXN0cnVjdCBkbWFlbmdpbmVfZGVzY19jYWxsYmFjayBjYjsKKwkJc3RydWN0IGRtYWVuZ2luZV9yZXN1bHQgcmVzdWx0OwogCiAJCWRlc2MgPSAmbWRlc2MtPmRlc2M7CisJCWxhc3RfY29va2llID0gZGVzYy0+Y29va2llOwogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZtY2hhbi0+bG9jaywgaXJxZmxhZ3MpOwogCQlkbWFfY29va2llX2NvbXBsZXRlKGRlc2MpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtY2hhbi0+bG9jaywgaXJxZmxhZ3MpOwogCiAJCWxsc3RhdCA9IGhpZG1hX2xsX3N0YXR1cyhtZG1hLT5sbGRldiwgbWRlc2MtPnRyZV9jaCk7Ci0JCWlmIChkZXNjLT5jYWxsYmFjayAmJiAobGxzdGF0ID09IERNQV9DT01QTEVURSkpCi0JCQlkZXNjLT5jYWxsYmFjayhkZXNjLT5jYWxsYmFja19wYXJhbSk7CisJCWRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFjayhkZXNjLCAmY2IpOwogCi0JCWxhc3RfY29va2llID0gZGVzYy0+Y29va2llOwogCQlkbWFfcnVuX2RlcGVuZGVuY2llcyhkZXNjKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbWNoYW4tPmxvY2ssIGlycWZsYWdzKTsKKwkJbGlzdF9tb3ZlKCZtZGVzYy0+bm9kZSwgJm1jaGFuLT5mcmVlKTsKKworCQlpZiAobGxzdGF0ID09IERNQV9DT01QTEVURSkgeworCQkJbWNoYW4tPmxhc3Rfc3VjY2VzcyA9IGxhc3RfY29va2llOworCQkJcmVzdWx0LnJlc3VsdCA9IERNQV9UUkFOU19OT0VSUk9SOworCQl9IGVsc2UKKwkJCXJlc3VsdC5yZXN1bHQgPSBETUFfVFJBTlNfQUJPUlRFRDsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtY2hhbi0+bG9jaywgaXJxZmxhZ3MpOworCisJCWRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrX2ludm9rZSgmY2IsICZyZXN1bHQpOwogCX0KLQotCS8qIEZyZWUgZGVzY3JpcHRvcnMgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWNoYW4tPmxvY2ssIGlycWZsYWdzKTsKLQlsaXN0X3NwbGljZV90YWlsX2luaXQoJmxpc3QsICZtY2hhbi0+ZnJlZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWNoYW4tPmxvY2ssIGlycWZsYWdzKTsKLQogfQogCiAvKgpAQCAtMjM4LDYgKzI0NywxOSBAQAogCQloaWRtYV9sbF9zdGFydChkbWFkZXYtPmxsZGV2KTsKIH0KIAorc3RhdGljIGlubGluZSBib29sIGhpZG1hX3R4bl9pc19zdWNjZXNzKGRtYV9jb29raWVfdCBjb29raWUsCisJCWRtYV9jb29raWVfdCBsYXN0X3N1Y2Nlc3MsIGRtYV9jb29raWVfdCBsYXN0X3VzZWQpCit7CisJaWYgKGxhc3Rfc3VjY2VzcyA8PSBsYXN0X3VzZWQpIHsKKwkJaWYgKChjb29raWUgPD0gbGFzdF9zdWNjZXNzKSB8fCAoY29va2llID4gbGFzdF91c2VkKSkKKwkJCXJldHVybiB0cnVlOworCX0gZWxzZSB7CisJCWlmICgoY29va2llIDw9IGxhc3Rfc3VjY2VzcykgJiYgKGNvb2tpZSA+IGxhc3RfdXNlZCkpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCiBzdGF0aWMgZW51bSBkbWFfc3RhdHVzIGhpZG1hX3R4X3N0YXR1cyhzdHJ1Y3QgZG1hX2NoYW4gKmRtYWNoLAogCQkJCSAgICAgICBkbWFfY29va2llX3QgY29va2llLAogCQkJCSAgICAgICBzdHJ1Y3QgZG1hX3R4X3N0YXRlICp0eHN0YXRlKQpAQCAtMjQ2LDggKzI2OCwxMyBAQAogCWVudW0gZG1hX3N0YXR1cyByZXQ7CiAKIAlyZXQgPSBkbWFfY29va2llX3N0YXR1cyhkbWFjaCwgY29va2llLCB0eHN0YXRlKTsKLQlpZiAocmV0ID09IERNQV9DT01QTEVURSkKLQkJcmV0dXJuIHJldDsKKwlpZiAocmV0ID09IERNQV9DT01QTEVURSkgeworCQlib29sIGlzX3N1Y2Nlc3M7CisKKwkJaXNfc3VjY2VzcyA9IGhpZG1hX3R4bl9pc19zdWNjZXNzKGNvb2tpZSwgbWNoYW4tPmxhc3Rfc3VjY2VzcywKKwkJCQkJCSAgZG1hY2gtPmNvb2tpZSk7CisJCXJldHVybiBpc19zdWNjZXNzID8gcmV0IDogRE1BX0VSUk9SOworCX0KIAogCWlmIChtY2hhbi0+cGF1c2VkICYmIChyZXQgPT0gRE1BX0lOX1BST0dSRVNTKSkgewogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMzk4LDYgKzQyNSw3IEBACiAJaGlkbWFfcHJvY2Vzc19jb21wbGV0ZWQobWNoYW4pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1jaGFuLT5sb2NrLCBpcnFmbGFncyk7CisJbWNoYW4tPmxhc3Rfc3VjY2VzcyA9IDA7CiAJbGlzdF9zcGxpY2VfaW5pdCgmbWNoYW4tPmFjdGl2ZSwgJmxpc3QpOwogCWxpc3Rfc3BsaWNlX2luaXQoJm1jaGFuLT5wcmVwYXJlZCwgJmxpc3QpOwogCWxpc3Rfc3BsaWNlX2luaXQoJm1jaGFuLT5jb21wbGV0ZWQsICZsaXN0KTsKQEAgLTQxMywxNCArNDQxLDkgQEAKIAkvKiByZXR1cm4gYWxsIHVzZXIgcmVxdWVzdHMgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobWRlc2MsIHRtcCwgJmxpc3QsIG5vZGUpIHsKIAkJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eGQgPSAmbWRlc2MtPmRlc2M7Ci0JCWRtYV9hc3luY190eF9jYWxsYmFjayBjYWxsYmFjayA9IG1kZXNjLT5kZXNjLmNhbGxiYWNrOwotCQl2b2lkICpwYXJhbSA9IG1kZXNjLT5kZXNjLmNhbGxiYWNrX3BhcmFtOwogCiAJCWRtYV9kZXNjcmlwdG9yX3VubWFwKHR4ZCk7Ci0KLQkJaWYgKGNhbGxiYWNrKQotCQkJY2FsbGJhY2socGFyYW0pOwotCisJCWRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFja19pbnZva2UodHhkLCBOVUxMKTsKIAkJZG1hX3J1bl9kZXBlbmRlbmNpZXModHhkKTsKIAogCQkvKiBtb3ZlIG15c2VsZiB0byBmcmVlX2xpc3QgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3Fjb20vaGlkbWEuaCBiL2RyaXZlcnMvZG1hL3Fjb20vaGlkbWEuaAppbmRleCBkYjQxM2E1Li5lNTJlMjA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9xY29tL2hpZG1hLmgKKysrIGIvZHJpdmVycy9kbWEvcWNvbS9oaWRtYS5oCkBAIC03Miw3ICs3Miw2IEBACiAKIAl1MzIgdHJlX3dyaXRlX29mZnNldDsgICAgICAgICAgIC8qIFRSRSB3cml0ZSBsb2NhdGlvbiAgICAgICAgICAgICAgKi8KIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdGFzazsJLyogdGFzayBkZWxpdmVyaW5nIG5vdGlmaWNhdGlvbnMgICAqLwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCByc3RfdGFzazsJLyogdGFzayB0byByZXNldCBIVyAgICAgICAgICAgICAgICAqLwogCURFQ0xBUkVfS0ZJRk9fUFRSKGhhbmRvZmZfZmlmbywKIAkJc3RydWN0IGhpZG1hX3RyZSAqKTsgICAgLyogcGVuZGluZyBUUkVzIEZJRk8gICAgICAgICAgICAgICAqLwogfTsKQEAgLTg5LDYgKzg4LDcgQEAKIAlib29sCQkJCWFsbG9jYXRlZDsKIAljaGFyCQkJCWRiZ19uYW1lWzE2XTsKIAl1MzIJCQkJZG1hX3NpZzsKKwlkbWFfY29va2llX3QJCQlsYXN0X3N1Y2Nlc3M7CiAKIAkvKgogCSAqIGFjdGl2ZSBkZXNjcmlwdG9yIG9uIHRoaXMgY2hhbm5lbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvcWNvbS9oaWRtYV9sbC5jIGIvZHJpdmVycy9kbWEvcWNvbS9oaWRtYV9sbC5jCmluZGV4IGFkMjBkZmIuLjMyMjRmMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3Fjb20vaGlkbWFfbGwuYworKysgYi9kcml2ZXJzL2RtYS9xY29tL2hpZG1hX2xsLmMKQEAgLTM4MSwyNyArMzgxLDYgQEAKIH0KIAogLyoKLSAqIEFib3J0IGFsbCB0cmFuc2FjdGlvbnMgYW5kIHBlcmZvcm0gYSByZXNldC4KLSAqLwotc3RhdGljIHZvaWQgaGlkbWFfbGxfYWJvcnQodW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGhpZG1hX2xsZGV2ICpsbGRldiA9IChzdHJ1Y3QgaGlkbWFfbGxkZXYgKilhcmc7Ci0JdTggZXJyX2NvZGUgPSBISURNQV9FVlJFX1NUQVRVU19FUlJPUjsKLQl1OCBlcnJfaW5mbyA9IDB4RkY7Ci0JaW50IHJjOwotCi0JaGlkbWFfY2xlYW51cF9wZW5kaW5nX3RyZShsbGRldiwgZXJyX2luZm8sIGVycl9jb2RlKTsKLQotCS8qIHJlc2V0IHRoZSBjaGFubmVsIGZvciByZWNvdmVyeSAqLwotCXJjID0gaGlkbWFfbGxfc2V0dXAobGxkZXYpOwotCWlmIChyYykgewotCQlkZXZfZXJyKGxsZGV2LT5kZXYsICJjaGFubmVsIHJlaW5pdGlhbGl6ZSBmYWlsZWQgYWZ0ZXIgZXJyb3JcbiIpOwotCQlyZXR1cm47Ci0JfQotCXdyaXRlbChFTkFCTEVfSVJRUywgbGxkZXYtPmV2Y2EgKyBISURNQV9FVkNBX0lSUV9FTl9SRUcpOwotfQotCi0vKgogICogVGhlIGludGVycnVwdCBoYW5kbGVyIGZvciBISURNQSB3aWxsIHRyeSB0byBjb25zdW1lIGFzIG1hbnkgcGVuZGluZwogICogRVZSRSBmcm9tIHRoZSBldmVudCBxdWV1ZSBhcyBwb3NzaWJsZS4gRWFjaCBFVlJFIGhhcyBhbiBhc3NvY2lhdGVkCiAgKiBUUkUgdGhhdCBob2xkcyB0aGUgdXNlciBpbnRlcmZhY2UgcGFyYW1ldGVycy4gRVZSRSByZXBvcnRzIHRoZQpAQCAtNDU0LDEzICs0MzMsMTggQEAKIAogCXdoaWxlIChjYXVzZSkgewogCQlpZiAoY2F1c2UgJiBISURNQV9FUlJfSU5UX01BU0spIHsKLQkJCWRldl9lcnIobGxkZXYtPmRldiwgImVycm9yIDB4JXgsIHJlc2V0dGluZy4uLlxuIiwKKwkJCWRldl9lcnIobGxkZXYtPmRldiwgImVycm9yIDB4JXgsIGRpc2FibGluZy4uLlxuIiwKIAkJCQkJY2F1c2UpOwogCiAJCQkvKiBDbGVhciBvdXQgcGVuZGluZyBpbnRlcnJ1cHRzICovCiAJCQl3cml0ZWwoY2F1c2UsIGxsZGV2LT5ldmNhICsgSElETUFfRVZDQV9JUlFfQ0xSX1JFRyk7CiAKLQkJCXRhc2tsZXRfc2NoZWR1bGUoJmxsZGV2LT5yc3RfdGFzayk7CisJCQkvKiBObyBmdXJ0aGVyIHN1Ym1pc3Npb25zLiAqLworCQkJaGlkbWFfbGxfZGlzYWJsZShsbGRldik7CisKKwkJCS8qIERyaXZlciBjb21wbGV0ZXMgdGhlIHR4biBhbmQgaW50aW1hdGVzIHRoZSBjbGllbnQuKi8KKwkJCWhpZG1hX2NsZWFudXBfcGVuZGluZ190cmUobGxkZXYsIDB4RkYsCisJCQkJCQkgIEhJRE1BX0VWUkVfU1RBVFVTX0VSUk9SKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAKQEAgLTgwOCw3ICs3OTIsNiBAQAogCQlyZXR1cm4gTlVMTDsKIAogCXNwaW5fbG9ja19pbml0KCZsbGRldi0+bG9jayk7Ci0JdGFza2xldF9pbml0KCZsbGRldi0+cnN0X3Rhc2ssIGhpZG1hX2xsX2Fib3J0LCAodW5zaWduZWQgbG9uZylsbGRldik7CiAJdGFza2xldF9pbml0KCZsbGRldi0+dGFzaywgaGlkbWFfbGxfdHJlX2NvbXBsZXRlLCAodW5zaWduZWQgbG9uZylsbGRldik7CiAJbGxkZXYtPmluaXRpYWxpemVkID0gMTsKIAl3cml0ZWwoRU5BQkxFX0lSUVMsIGxsZGV2LT5ldmNhICsgSElETUFfRVZDQV9JUlFfRU5fUkVHKTsKQEAgLTgzMSw3ICs4MTQsNiBAQAogCiAJcmVxdWlyZWRfYnl0ZXMgPSBzaXplb2Yoc3RydWN0IGhpZG1hX3RyZSkgKiBsbGRldi0+bnJfdHJlczsKIAl0YXNrbGV0X2tpbGwoJmxsZGV2LT50YXNrKTsKLQl0YXNrbGV0X2tpbGwoJmxsZGV2LT5yc3RfdGFzayk7CiAJbWVtc2V0KGxsZGV2LT50cmVwb29sLCAwLCByZXF1aXJlZF9ieXRlcyk7CiAJbGxkZXYtPnRyZXBvb2wgPSBOVUxMOwogCWxsZGV2LT5wZW5kaW5nX3RyZV9jb3VudCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9zM2MyNHh4LWRtYS5jIGIvZHJpdmVycy9kbWEvczNjMjR4eC1kbWEuYwppbmRleCBjZTY3MDc1Li4zYzU3OWFiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvczNjMjR4eC1kbWEuYworKysgYi9kcml2ZXJzL2RtYS9zM2MyNHh4LWRtYS5jCkBAIC04MjMsMTEgKzgyMywxMSBAQAogCXN0cnVjdCBzM2MyNHh4X3NnICpkc2c7CiAJaW50IHNyY19tb2QsIGRlc3RfbW9kOwogCi0JZGV2X2RiZygmczNjZG1hLT5wZGV2LT5kZXYsICJwcmVwYXJlIG1lbWNweSBvZiAlZCBieXRlcyBmcm9tICVzXG4iLAorCWRldl9kYmcoJnMzY2RtYS0+cGRldi0+ZGV2LCAicHJlcGFyZSBtZW1jcHkgb2YgJXp1IGJ5dGVzIGZyb20gJXNcbiIsCiAJCQlsZW4sIHMzY2NoYW4tPm5hbWUpOwogCiAJaWYgKChsZW4gJiBTM0MyNFhYX0RDT05fVENfTUFTSykgIT0gbGVuKSB7Ci0JCWRldl9lcnIoJnMzY2RtYS0+cGRldi0+ZGV2LCAibWVtY3B5IHNpemUgJWQgdG8gbGFyZ2VcbiIsIGxlbik7CisJCWRldl9lcnIoJnMzY2RtYS0+cGRldi0+ZGV2LCAibWVtY3B5IHNpemUgJXp1IHRvIGxhcmdlXG4iLCBsZW4pOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTEzMDEsNiArMTMwMSw5IEBACiAJczNjZG1hLT5zbGF2ZS5kZXZpY2VfcHJlcF9kbWFfY3ljbGljID0gczNjMjR4eF9kbWFfcHJlcF9kbWFfY3ljbGljOwogCXMzY2RtYS0+c2xhdmUuZGV2aWNlX2NvbmZpZyA9IHMzYzI0eHhfZG1hX3NldF9ydW50aW1lX2NvbmZpZzsKIAlzM2NkbWEtPnNsYXZlLmRldmljZV90ZXJtaW5hdGVfYWxsID0gczNjMjR4eF9kbWFfdGVybWluYXRlX2FsbDsKKwlzM2NkbWEtPnNsYXZlLmZpbHRlci5tYXAgPSBwZGF0YS0+c2xhdmVfbWFwOworCXMzY2RtYS0+c2xhdmUuZmlsdGVyLm1hcGNudCA9IHBkYXRhLT5zbGF2ZWNudDsKKwlzM2NkbWEtPnNsYXZlLmZpbHRlci5mbiA9IHMzYzI0eHhfZG1hX2ZpbHRlcjsKIAogCS8qIFJlZ2lzdGVyIGFzIG1hbnkgbWVtY3B5IGNoYW5uZWxzIGFzIHRoZXJlIGFyZSBwaHlzaWNhbCBjaGFubmVscyAqLwogCXJldCA9IHMzYzI0eHhfZG1hX2luaXRfdmlydHVhbF9jaGFubmVscyhzM2NkbWEsICZzM2NkbWEtPm1lbWNweSwKQEAgLTE0MTgsNyArMTQyMSw3IEBACiAKIAlzM2NjaGFuID0gdG9fczNjMjR4eF9kbWFfY2hhbihjaGFuKTsKIAotCXJldHVybiBzM2NjaGFuLT5pZCA9PSAoaW50KXBhcmFtOworCXJldHVybiBzM2NjaGFuLT5pZCA9PSAodWludHB0cl90KXBhcmFtOwogfQogRVhQT1JUX1NZTUJPTChzM2MyNHh4X2RtYV9maWx0ZXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9zYTExeDAtZG1hLmMgYi9kcml2ZXJzL2RtYS9zYTExeDAtZG1hLmMKaW5kZXggNDNkYjI1NS4uMWFkZWIzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvc2ExMXgwLWRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL3NhMTF4MC1kbWEuYwpAQCAtNDYzLDcgKzQ2Myw3IEBACiAJCQlkbWFfYWRkcl90IGFkZHIgPSBzYTExeDBfZG1hX3BvcyhwKTsKIAkJCXVuc2lnbmVkIGk7CiAKLQkJCWRldl92ZGJnKGQtPnNsYXZlLmRldiwgInR4X3N0YXR1czogYWRkcjoleFxuIiwgYWRkcik7CisJCQlkZXZfdmRiZyhkLT5zbGF2ZS5kZXYsICJ0eF9zdGF0dXM6IGFkZHI6JXBhZFxuIiwgJmFkZHIpOwogCiAJCQlmb3IgKGkgPSAwOyBpIDwgdHhkLT5zZ2xlbjsgaSsrKSB7CiAJCQkJZGV2X3ZkYmcoZC0+c2xhdmUuZGV2LCAidHhfc3RhdHVzOiBbJXVdICV4KyV4XG4iLApAQCAtNDkxLDcgKzQ5MSw3IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMtPnZjLmxvY2ssIGZsYWdzKTsKIAotCWRldl92ZGJnKGQtPnNsYXZlLmRldiwgInR4X3N0YXR1czogYnl0ZXMgMHglenhcbiIsIHN0YXRlLT5yZXNpZHVlKTsKKwlkZXZfdmRiZyhkLT5zbGF2ZS5kZXYsICJ0eF9zdGF0dXM6IGJ5dGVzIDB4JXhcbiIsIHN0YXRlLT5yZXNpZHVlKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC01NTEsOCArNTUxLDggQEAKIAkJaWYgKGxlbiA+IERNQV9NQVhfU0laRSkKIAkJCWogKz0gRElWX1JPVU5EX1VQKGxlbiwgRE1BX01BWF9TSVpFICYgfkRNQV9BTElHTikgLSAxOwogCQlpZiAoYWRkciAmIERNQV9BTElHTikgewotCQkJZGV2X2RiZyhjaGFuLT5kZXZpY2UtPmRldiwgInZjaGFuICVwOiBiYWQgYnVmZmVyIGFsaWdubWVudDogJTA4eFxuIiwKLQkJCQkmYy0+dmMsIGFkZHIpOworCQkJZGV2X2RiZyhjaGFuLT5kZXZpY2UtPmRldiwgInZjaGFuICVwOiBiYWQgYnVmZmVyIGFsaWdubWVudDogJXBhZFxuIiwKKwkJCQkmYy0+dmMsICZhZGRyKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJfQpAQCAtNTk5LDcgKzU5OSw3IEBACiAJdHhkLT5zaXplID0gc2l6ZTsKIAl0eGQtPnNnbGVuID0gajsKIAotCWRldl9kYmcoY2hhbi0+ZGV2aWNlLT5kZXYsICJ2Y2hhbiAlcDogdHhkICVwOiBzaXplICV1IG5yICV1XG4iLAorCWRldl9kYmcoY2hhbi0+ZGV2aWNlLT5kZXYsICJ2Y2hhbiAlcDogdHhkICVwOiBzaXplICV6dSBuciAldVxuIiwKIAkJJmMtPnZjLCAmdHhkLT52ZCwgdHhkLT5zaXplLCB0eGQtPnNnbGVuKTsKIAogCXJldHVybiB2Y2hhbl90eF9wcmVwKCZjLT52YywgJnR4ZC0+dmQsIGZsYWdzKTsKQEAgLTY5Myw4ICs2OTMsOCBAQAogCWlmIChtYXhidXJzdCA9PSA4KQogCQlkZGFyIHw9IEREQVJfQlM7CiAKLQlkZXZfZGJnKGMtPnZjLmNoYW4uZGV2aWNlLT5kZXYsICJ2Y2hhbiAlcDogZG1hX3NsYXZlX2NvbmZpZyBhZGRyICV4IHdpZHRoICV1IGJ1cnN0ICV1XG4iLAotCQkmYy0+dmMsIGFkZHIsIHdpZHRoLCBtYXhidXJzdCk7CisJZGV2X2RiZyhjLT52Yy5jaGFuLmRldmljZS0+ZGV2LCAidmNoYW4gJXA6IGRtYV9zbGF2ZV9jb25maWcgYWRkciAlcGFkIHdpZHRoICV1IGJ1cnN0ICV1XG4iLAorCQkmYy0+dmMsICZhZGRyLCB3aWR0aCwgbWF4YnVyc3QpOwogCiAJYy0+ZGRhciA9IGRkYXIgfCAoYWRkciAmIDB4ZjAwMDAwMDApIHwgKGFkZHIgJiAweDAwM2ZmZmZjKSA8PCA2OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9zaC9yY2FyLWRtYWMuYyBiL2RyaXZlcnMvZG1hL3NoL3JjYXItZG1hYy5jCmluZGV4IDBkZDk1MzguLjJlNDQxZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3NoL3JjYXItZG1hYy5jCisrKyBiL2RyaXZlcnMvZG1hL3NoL3JjYXItZG1hYy5jCkBAIC0xMTgsMTQgKzExOCwzNCBAQAogCXNpemVvZihzdHJ1Y3QgcmNhcl9kbWFjX3hmZXJfY2h1bmspKQogCiAvKgorICogc3RydWN0IHJjYXJfZG1hY19jaGFuX3NsYXZlIC0gU2xhdmUgY29uZmlndXJhdGlvbgorICogQHNsYXZlX2FkZHI6IHNsYXZlIG1lbW9yeSBhZGRyZXNzCisgKiBAeGZlcl9zaXplOiBzaXplIChpbiBieXRlcykgb2YgaGFyZHdhcmUgdHJhbnNmZXJzCisgKi8KK3N0cnVjdCByY2FyX2RtYWNfY2hhbl9zbGF2ZSB7CisJcGh5c19hZGRyX3Qgc2xhdmVfYWRkcjsKKwl1bnNpZ25lZCBpbnQgeGZlcl9zaXplOworfTsKKworLyoKKyAqIHN0cnVjdCByY2FyX2RtYWNfY2hhbl9tYXAgLSBNYXAgb2Ygc2xhdmUgZGV2aWNlIHBoeXMgdG8gZG1hIGFkZHJlc3MKKyAqIEBhZGRyOiBzbGF2ZSBkbWEgYWRkcmVzcworICogQGRpcjogZGlyZWN0aW9uIG9mIG1hcHBpbmcKKyAqIEBzbGF2ZTogc2xhdmUgY29uZmlndXJhdGlvbiB0aGF0IGlzIG1hcHBlZAorICovCitzdHJ1Y3QgcmNhcl9kbWFjX2NoYW5fbWFwIHsKKwlkbWFfYWRkcl90IGFkZHI7CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyOworCXN0cnVjdCByY2FyX2RtYWNfY2hhbl9zbGF2ZSBzbGF2ZTsKK307CisKKy8qCiAgKiBzdHJ1Y3QgcmNhcl9kbWFjX2NoYW4gLSBSLUNhciBHZW4yIERNQSBDb250cm9sbGVyIENoYW5uZWwKICAqIEBjaGFuOiBiYXNlIERNQSBjaGFubmVsIG9iamVjdAogICogQGlvbWVtOiBjaGFubmVsIEkvTyBtZW1vcnkgYmFzZQogICogQGluZGV4OiBpbmRleCBvZiB0aGlzIGNoYW5uZWwgaW4gdGhlIGNvbnRyb2xsZXIKLSAqIEBzcmNfeGZlcl9zaXplOiBzaXplIChpbiBieXRlcykgb2YgaGFyZHdhcmUgdHJhbnNmZXJzIG9uIHRoZSBzb3VyY2Ugc2lkZQotICogQGRzdF94ZmVyX3NpemU6IHNpemUgKGluIGJ5dGVzKSBvZiBoYXJkd2FyZSB0cmFuc2ZlcnMgb24gdGhlIGRlc3RpbmF0aW9uIHNpZGUKLSAqIEBzcmNfc2xhdmVfYWRkcjogc2xhdmUgc291cmNlIG1lbW9yeSBhZGRyZXNzCi0gKiBAZHN0X3NsYXZlX2FkZHI6IHNsYXZlIGRlc3RpbmF0aW9uIG1lbW9yeSBhZGRyZXNzCisgKiBAc3JjOiBzbGF2ZSBtZW1vcnkgYWRkcmVzcyBhbmQgc2l6ZSBvbiB0aGUgc291cmNlIHNpZGUKKyAqIEBkc3Q6IHNsYXZlIG1lbW9yeSBhZGRyZXNzIGFuZCBzaXplIG9uIHRoZSBkZXN0aW5hdGlvbiBzaWRlCiAgKiBAbWlkX3JpZDogaGFyZHdhcmUgTUlEL1JJRCBmb3IgdGhlIERNQSBjbGllbnQgdXNpbmcgdGhpcyBjaGFubmVsCiAgKiBAbG9jazogcHJvdGVjdHMgdGhlIGNoYW5uZWwgQ0hDUiByZWdpc3RlciBhbmQgdGhlIGRlc2MgbWVtYmVycwogICogQGRlc2MuZnJlZTogbGlzdCBvZiBmcmVlIGRlc2NyaXB0b3JzCkBAIC0xNDIsMTAgKzE2Miw5IEBACiAJdm9pZCBfX2lvbWVtICppb21lbTsKIAl1bnNpZ25lZCBpbnQgaW5kZXg7CiAKLQl1bnNpZ25lZCBpbnQgc3JjX3hmZXJfc2l6ZTsKLQl1bnNpZ25lZCBpbnQgZHN0X3hmZXJfc2l6ZTsKLQlkbWFfYWRkcl90IHNyY19zbGF2ZV9hZGRyOwotCWRtYV9hZGRyX3QgZHN0X3NsYXZlX2FkZHI7CisJc3RydWN0IHJjYXJfZG1hY19jaGFuX3NsYXZlIHNyYzsKKwlzdHJ1Y3QgcmNhcl9kbWFjX2NoYW5fc2xhdmUgZHN0OworCXN0cnVjdCByY2FyX2RtYWNfY2hhbl9tYXAgbWFwOwogCWludCBtaWRfcmlkOwogCiAJc3BpbmxvY2tfdCBsb2NrOwpAQCAtNzkzLDEzICs4MTIsMTMgQEAKIAljYXNlIERNQV9ERVZfVE9fTUVNOgogCQljaGNyID0gUkNBUl9ETUFDSENSX0RNX0lOQyB8IFJDQVJfRE1BQ0hDUl9TTV9GSVhFRAogCQkgICAgIHwgUkNBUl9ETUFDSENSX1JTX0RNQVJTOwotCQl4ZmVyX3NpemUgPSBjaGFuLT5zcmNfeGZlcl9zaXplOworCQl4ZmVyX3NpemUgPSBjaGFuLT5zcmMueGZlcl9zaXplOwogCQlicmVhazsKIAogCWNhc2UgRE1BX01FTV9UT19ERVY6CiAJCWNoY3IgPSBSQ0FSX0RNQUNIQ1JfRE1fRklYRUQgfCBSQ0FSX0RNQUNIQ1JfU01fSU5DCiAJCSAgICAgfCBSQ0FSX0RNQUNIQ1JfUlNfRE1BUlM7Ci0JCXhmZXJfc2l6ZSA9IGNoYW4tPmRzdF94ZmVyX3NpemU7CisJCXhmZXJfc2l6ZSA9IGNoYW4tPmRzdC54ZmVyX3NpemU7CiAJCWJyZWFrOwogCiAJY2FzZSBETUFfTUVNX1RPX01FTToKQEAgLTEwMjMsMTMgKzEwNDIsNjUgQEAKIAkJCQkgICAgICBETUFfTUVNX1RPX01FTSwgZmxhZ3MsIGZhbHNlKTsKIH0KIAorc3RhdGljIGludCByY2FyX2RtYWNfbWFwX3NsYXZlX2FkZHIoc3RydWN0IGRtYV9jaGFuICpjaGFuLAorCQkJCSAgICBlbnVtIGRtYV90cmFuc2Zlcl9kaXJlY3Rpb24gZGlyKQoreworCXN0cnVjdCByY2FyX2RtYWNfY2hhbiAqcmNoYW4gPSB0b19yY2FyX2RtYWNfY2hhbihjaGFuKTsKKwlzdHJ1Y3QgcmNhcl9kbWFjX2NoYW5fbWFwICptYXAgPSAmcmNoYW4tPm1hcDsKKwlwaHlzX2FkZHJfdCBkZXZfYWRkcjsKKwlzaXplX3QgZGV2X3NpemU7CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGV2X2RpcjsKKworCWlmIChkaXIgPT0gRE1BX0RFVl9UT19NRU0pIHsKKwkJZGV2X2FkZHIgPSByY2hhbi0+c3JjLnNsYXZlX2FkZHI7CisJCWRldl9zaXplID0gcmNoYW4tPnNyYy54ZmVyX3NpemU7CisJCWRldl9kaXIgPSBETUFfVE9fREVWSUNFOworCX0gZWxzZSB7CisJCWRldl9hZGRyID0gcmNoYW4tPmRzdC5zbGF2ZV9hZGRyOworCQlkZXZfc2l6ZSA9IHJjaGFuLT5kc3QueGZlcl9zaXplOworCQlkZXZfZGlyID0gRE1BX0ZST01fREVWSUNFOworCX0KKworCS8qIFJldXNlIGN1cnJlbnQgbWFwIGlmIHBvc3NpYmxlLiAqLworCWlmIChkZXZfYWRkciA9PSBtYXAtPnNsYXZlLnNsYXZlX2FkZHIgJiYKKwkgICAgZGV2X3NpemUgPT0gbWFwLT5zbGF2ZS54ZmVyX3NpemUgJiYKKwkgICAgZGV2X2RpciA9PSBtYXAtPmRpcikKKwkJcmV0dXJuIDA7CisKKwkvKiBSZW1vdmUgb2xkIG1hcHBpbmcgaWYgcHJlc2VudC4gKi8KKwlpZiAobWFwLT5zbGF2ZS54ZmVyX3NpemUpCisJCWRtYV91bm1hcF9yZXNvdXJjZShjaGFuLT5kZXZpY2UtPmRldiwgbWFwLT5hZGRyLAorCQkJCSAgIG1hcC0+c2xhdmUueGZlcl9zaXplLCBtYXAtPmRpciwgMCk7CisJbWFwLT5zbGF2ZS54ZmVyX3NpemUgPSAwOworCisJLyogQ3JlYXRlIG5ldyBzbGF2ZSBhZGRyZXNzIG1hcC4gKi8KKwltYXAtPmFkZHIgPSBkbWFfbWFwX3Jlc291cmNlKGNoYW4tPmRldmljZS0+ZGV2LCBkZXZfYWRkciwgZGV2X3NpemUsCisJCQkJICAgICBkZXZfZGlyLCAwKTsKKworCWlmIChkbWFfbWFwcGluZ19lcnJvcihjaGFuLT5kZXZpY2UtPmRldiwgbWFwLT5hZGRyKSkgeworCQlkZXZfZXJyKGNoYW4tPmRldmljZS0+ZGV2LAorCQkJImNoYW4ldTogZmFpbGVkIHRvIG1hcCAlenhAJXBhcCIsIHJjaGFuLT5pbmRleCwKKwkJCWRldl9zaXplLCAmZGV2X2FkZHIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlkZXZfZGJnKGNoYW4tPmRldmljZS0+ZGV2LCAiY2hhbiV1OiBtYXAgJXp4QCVwYXAgdG8gJXBhZCBkaXI6ICVzXG4iLAorCQlyY2hhbi0+aW5kZXgsIGRldl9zaXplLCAmZGV2X2FkZHIsICZtYXAtPmFkZHIsCisJCWRldl9kaXIgPT0gRE1BX1RPX0RFVklDRSA/ICJETUFfVE9fREVWSUNFIiA6ICJETUFfRlJPTV9ERVZJQ0UiKTsKKworCW1hcC0+c2xhdmUuc2xhdmVfYWRkciA9IGRldl9hZGRyOworCW1hcC0+c2xhdmUueGZlcl9zaXplID0gZGV2X3NpemU7CisJbWFwLT5kaXIgPSBkZXZfZGlyOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgogcmNhcl9kbWFjX3ByZXBfc2xhdmVfc2coc3RydWN0IGRtYV9jaGFuICpjaGFuLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwKIAkJCXVuc2lnbmVkIGludCBzZ19sZW4sIGVudW0gZG1hX3RyYW5zZmVyX2RpcmVjdGlvbiBkaXIsCiAJCQl1bnNpZ25lZCBsb25nIGZsYWdzLCB2b2lkICpjb250ZXh0KQogewogCXN0cnVjdCByY2FyX2RtYWNfY2hhbiAqcmNoYW4gPSB0b19yY2FyX2RtYWNfY2hhbihjaGFuKTsKLQlkbWFfYWRkcl90IGRldl9hZGRyOwogCiAJLyogU29tZW9uZSBjYWxsaW5nIHNsYXZlIERNQSBvbiBhIGdlbmVyaWMgY2hhbm5lbD8gKi8KIAlpZiAocmNoYW4tPm1pZF9yaWQgPCAwIHx8ICFzZ19sZW4pIHsKQEAgLTEwMzksOSArMTExMCwxMCBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlkZXZfYWRkciA9IGRpciA9PSBETUFfREVWX1RPX01FTQotCQkgPyByY2hhbi0+c3JjX3NsYXZlX2FkZHIgOiByY2hhbi0+ZHN0X3NsYXZlX2FkZHI7Ci0JcmV0dXJuIHJjYXJfZG1hY19jaGFuX3ByZXBfc2cocmNoYW4sIHNnbCwgc2dfbGVuLCBkZXZfYWRkciwKKwlpZiAocmNhcl9kbWFjX21hcF9zbGF2ZV9hZGRyKGNoYW4sIGRpcikpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIHJjYXJfZG1hY19jaGFuX3ByZXBfc2cocmNoYW4sIHNnbCwgc2dfbGVuLCByY2hhbi0+bWFwLmFkZHIsCiAJCQkJICAgICAgZGlyLCBmbGFncywgZmFsc2UpOwogfQogCkBAIC0xMDU1LDcgKzExMjcsNiBAQAogCXN0cnVjdCByY2FyX2RtYWNfY2hhbiAqcmNoYW4gPSB0b19yY2FyX2RtYWNfY2hhbihjaGFuKTsKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2M7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2w7Ci0JZG1hX2FkZHJfdCBkZXZfYWRkcjsKIAl1bnNpZ25lZCBpbnQgc2dfbGVuOwogCXVuc2lnbmVkIGludCBpOwogCkBAIC0xMDY3LDYgKzExMzgsOSBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKKwlpZiAocmNhcl9kbWFjX21hcF9zbGF2ZV9hZGRyKGNoYW4sIGRpcikpCisJCXJldHVybiBOVUxMOworCiAJc2dfbGVuID0gYnVmX2xlbiAvIHBlcmlvZF9sZW47CiAJaWYgKHNnX2xlbiA+IFJDQVJfRE1BQ19NQVhfU0dfTEVOKSB7CiAJCWRldl9lcnIoY2hhbi0+ZGV2aWNlLT5kZXYsCkBAIC0xMDk0LDkgKzExNjgsNyBAQAogCQlzZ19kbWFfbGVuKCZzZ2xbaV0pID0gcGVyaW9kX2xlbjsKIAl9CiAKLQlkZXZfYWRkciA9IGRpciA9PSBETUFfREVWX1RPX01FTQotCQkgPyByY2hhbi0+c3JjX3NsYXZlX2FkZHIgOiByY2hhbi0+ZHN0X3NsYXZlX2FkZHI7Ci0JZGVzYyA9IHJjYXJfZG1hY19jaGFuX3ByZXBfc2cocmNoYW4sIHNnbCwgc2dfbGVuLCBkZXZfYWRkciwKKwlkZXNjID0gcmNhcl9kbWFjX2NoYW5fcHJlcF9zZyhyY2hhbiwgc2dsLCBzZ19sZW4sIHJjaGFuLT5tYXAuYWRkciwKIAkJCQkgICAgICBkaXIsIGZsYWdzLCB0cnVlKTsKIAogCWtmcmVlKHNnbCk7CkBAIC0xMTEyLDEwICsxMTg0LDEwIEBACiAJICogV2UgY291bGQgbG9jayB0aGlzLCBidXQgeW91IHNob3VsZG4ndCBiZSBjb25maWd1cmluZyB0aGUKIAkgKiBjaGFubmVsLCB3aGlsZSB1c2luZyBpdC4uLgogCSAqLwotCXJjaGFuLT5zcmNfc2xhdmVfYWRkciA9IGNmZy0+c3JjX2FkZHI7Ci0JcmNoYW4tPmRzdF9zbGF2ZV9hZGRyID0gY2ZnLT5kc3RfYWRkcjsKLQlyY2hhbi0+c3JjX3hmZXJfc2l6ZSA9IGNmZy0+c3JjX2FkZHJfd2lkdGg7Ci0JcmNoYW4tPmRzdF94ZmVyX3NpemUgPSBjZmctPmRzdF9hZGRyX3dpZHRoOworCXJjaGFuLT5zcmMuc2xhdmVfYWRkciA9IGNmZy0+c3JjX2FkZHI7CisJcmNoYW4tPmRzdC5zbGF2ZV9hZGRyID0gY2ZnLT5kc3RfYWRkcjsKKwlyY2hhbi0+c3JjLnhmZXJfc2l6ZSA9IGNmZy0+c3JjX2FkZHJfd2lkdGg7CisJcmNoYW4tPmRzdC54ZmVyX3NpemUgPSBjZmctPmRzdF9hZGRyX3dpZHRoOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMzg5LDIxICsxNDYxLDE4IEBACiB7CiAJc3RydWN0IHJjYXJfZG1hY19jaGFuICpjaGFuID0gZGV2OwogCXN0cnVjdCByY2FyX2RtYWNfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2sgY2I7CiAKIAlzcGluX2xvY2tfaXJxKCZjaGFuLT5sb2NrKTsKIAogCS8qIEZvciBjeWNsaWMgdHJhbnNmZXJzIG5vdGlmeSB0aGUgdXNlciBhZnRlciBldmVyeSBjaHVuay4gKi8KIAlpZiAoY2hhbi0+ZGVzYy5ydW5uaW5nICYmIGNoYW4tPmRlc2MucnVubmluZy0+Y3ljbGljKSB7Ci0JCWRtYV9hc3luY190eF9jYWxsYmFjayBjYWxsYmFjazsKLQkJdm9pZCAqY2FsbGJhY2tfcGFyYW07Ci0KIAkJZGVzYyA9IGNoYW4tPmRlc2MucnVubmluZzsKLQkJY2FsbGJhY2sgPSBkZXNjLT5hc3luY190eC5jYWxsYmFjazsKLQkJY2FsbGJhY2tfcGFyYW0gPSBkZXNjLT5hc3luY190eC5jYWxsYmFja19wYXJhbTsKKwkJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrKCZkZXNjLT5hc3luY190eCwgJmNiKTsKIAotCQlpZiAoY2FsbGJhY2spIHsKKwkJaWYgKGRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrX3ZhbGlkKCZjYikpIHsKIAkJCXNwaW5fdW5sb2NrX2lycSgmY2hhbi0+bG9jayk7Ci0JCQljYWxsYmFjayhjYWxsYmFja19wYXJhbSk7CisJCQlkbWFlbmdpbmVfZGVzY19jYWxsYmFja19pbnZva2UoJmNiLCBOVUxMKTsKIAkJCXNwaW5fbG9ja19pcnEoJmNoYW4tPmxvY2spOwogCQl9CiAJfQpAQCAtMTQxOCwxNCArMTQ4NywxNSBAQAogCQlkbWFfY29va2llX2NvbXBsZXRlKCZkZXNjLT5hc3luY190eCk7CiAJCWxpc3RfZGVsKCZkZXNjLT5ub2RlKTsKIAotCQlpZiAoZGVzYy0+YXN5bmNfdHguY2FsbGJhY2spIHsKKwkJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrKCZkZXNjLT5hc3luY190eCwgJmNiKTsKKwkJaWYgKGRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrX3ZhbGlkKCZjYikpIHsKIAkJCXNwaW5fdW5sb2NrX2lycSgmY2hhbi0+bG9jayk7CiAJCQkvKgogCQkJICogV2Ugb3duIHRoZSBvbmx5IHJlZmVyZW5jZSB0byB0aGlzIGRlc2NyaXB0b3IsIHdlIGNhbgogCQkJICogc2FmZWx5IGRlcmVmZXJlbmNlIGl0IHdpdGhvdXQgaG9sZGluZyB0aGUgY2hhbm5lbAogCQkJICogbG9jay4KIAkJCSAqLwotCQkJZGVzYy0+YXN5bmNfdHguY2FsbGJhY2soZGVzYy0+YXN5bmNfdHguY2FsbGJhY2tfcGFyYW0pOworCQkJZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2tfaW52b2tlKCZjYiwgTlVMTCk7CiAJCQlzcGluX2xvY2tfaXJxKCZjaGFuLT5sb2NrKTsKIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9zaC9zaGRtYS1iYXNlLmMgYi9kcml2ZXJzL2RtYS9zaC9zaGRtYS1iYXNlLmMKaW5kZXggMTBmY2FiYS4uMTJmYTQ4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvc2gvc2hkbWEtYmFzZS5jCisrKyBiL2RyaXZlcnMvZG1hL3NoL3NoZG1hLWJhc2UuYwpAQCAtMzMwLDEwICszMzAsMTEgQEAKIAlib29sIGhlYWRfYWNrZWQgPSBmYWxzZTsKIAlkbWFfY29va2llX3QgY29va2llID0gMDsKIAlkbWFfYXN5bmNfdHhfY2FsbGJhY2sgY2FsbGJhY2sgPSBOVUxMOwotCXZvaWQgKnBhcmFtID0gTlVMTDsKKwlzdHJ1Y3QgZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2sgY2I7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlMSVNUX0hFQUQoY3ljbGljX2xpc3QpOwogCisJbWVtc2V0KCZjYiwgMCwgc2l6ZW9mKGNiKSk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnNjaGFuLT5jaGFuX2xvY2ssIGZsYWdzKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVzYywgX2Rlc2MsICZzY2hhbi0+bGRfcXVldWUsIG5vZGUpIHsKIAkJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCA9ICZkZXNjLT5hc3luY190eDsKQEAgLTM2Nyw4ICszNjgsOCBAQAogCQkvKiBDYWxsIGNhbGxiYWNrIG9uIHRoZSBsYXN0IGNodW5rICovCiAJCWlmIChkZXNjLT5tYXJrID09IERFU0NfQ09NUExFVEVEICYmIHR4LT5jYWxsYmFjaykgewogCQkJZGVzYy0+bWFyayA9IERFU0NfV0FJVElORzsKKwkJCWRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFjayh0eCwgJmNiKTsKIAkJCWNhbGxiYWNrID0gdHgtPmNhbGxiYWNrOwotCQkJcGFyYW0gPSB0eC0+Y2FsbGJhY2tfcGFyYW07CiAJCQlkZXZfZGJnKHNjaGFuLT5kZXYsICJkZXNjcmlwdG9yICMlZEAlcCBvbiAlZCBjYWxsYmFja1xuIiwKIAkJCQl0eC0+Y29va2llLCB0eCwgc2NoYW4tPmlkKTsKIAkJCUJVR19PTihkZXNjLT5jaHVua3MgIT0gMSk7CkBAIC00MzAsOCArNDMxLDcgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjaGFuLT5jaGFuX2xvY2ssIGZsYWdzKTsKIAotCWlmIChjYWxsYmFjaykKLQkJY2FsbGJhY2socGFyYW0pOworCWRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrX2ludm9rZSgmY2IsIE5VTEwpOwogCiAJcmV0dXJuIGNhbGxiYWNrOwogfQpAQCAtODg1LDkgKzg4NSw5IEBACiAJCS8qIENvbXBsZXRlIGFsbCAgKi8KIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShzZGVzYywgJmRsLCBub2RlKSB7CiAJCQlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4ID0gJnNkZXNjLT5hc3luY190eDsKKwogCQkJc2Rlc2MtPm1hcmsgPSBERVNDX0lETEU7Ci0JCQlpZiAodHgtPmNhbGxiYWNrKQotCQkJCXR4LT5jYWxsYmFjayh0eC0+Y2FsbGJhY2tfcGFyYW0pOworCQkJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrX2ludm9rZSh0eCwgTlVMTCk7CiAJCX0KIAogCQlzcGluX2xvY2soJnNjaGFuLT5jaGFuX2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvc2gvdXNiLWRtYWMuYyBiL2RyaXZlcnMvZG1hL3NoL3VzYi1kbWFjLmMKaW5kZXggNzQ5ZjFiZC4uMDZlY2RjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvc2gvdXNiLWRtYWMuYworKysgYi9kcml2ZXJzL2RtYS9zaC91c2ItZG1hYy5jCkBAIC02MDAsMjcgKzYwMCwzMCBAQAogewogCXN0cnVjdCB1c2JfZG1hY19jaGFuICpjaGFuID0gZGV2OwogCWlycXJldHVybl90IHJldCA9IElSUV9OT05FOwotCXUzMiBtYXNrID0gVVNCX0RNQUNIQ1JfVEU7Ci0JdTMyIGNoZWNrX2JpdHMgPSBVU0JfRE1BQ0hDUl9URSB8IFVTQl9ETUFDSENSX1NQOworCXUzMiBtYXNrID0gMDsKIAl1MzIgY2hjcjsKKwlib29sIHhmZXJfZW5kID0gZmFsc2U7CiAKIAlzcGluX2xvY2soJmNoYW4tPnZjLmxvY2spOwogCiAJY2hjciA9IHVzYl9kbWFjX2NoYW5fcmVhZChjaGFuLCBVU0JfRE1BQ0hDUik7Ci0JaWYgKGNoY3IgJiBjaGVja19iaXRzKQotCQltYXNrIHw9IFVTQl9ETUFDSENSX0RFIHwgY2hlY2tfYml0czsKKwlpZiAoY2hjciAmIChVU0JfRE1BQ0hDUl9URSB8IFVTQl9ETUFDSENSX1NQKSkgeworCQltYXNrIHw9IFVTQl9ETUFDSENSX0RFIHwgVVNCX0RNQUNIQ1JfVEUgfCBVU0JfRE1BQ0hDUl9TUDsKKwkJaWYgKGNoY3IgJiBVU0JfRE1BQ0hDUl9ERSkKKwkJCXhmZXJfZW5kID0gdHJ1ZTsKKwkJcmV0IHw9IElSUV9IQU5ETEVEOworCX0KIAlpZiAoY2hjciAmIFVTQl9ETUFDSENSX05VTEwpIHsKIAkJLyogQW4gaW50ZXJydXB0aW9uIG9mIFRFIHdpbGwgaGFwcGVuIGFmdGVyIHdlIHNldCBGVEUgKi8KIAkJbWFzayB8PSBVU0JfRE1BQ0hDUl9OVUxMOwogCQljaGNyIHw9IFVTQl9ETUFDSENSX0ZURTsKIAkJcmV0IHw9IElSUV9IQU5ETEVEOwogCX0KLQl1c2JfZG1hY19jaGFuX3dyaXRlKGNoYW4sIFVTQl9ETUFDSENSLCBjaGNyICYgfm1hc2spOworCWlmIChtYXNrKQorCQl1c2JfZG1hY19jaGFuX3dyaXRlKGNoYW4sIFVTQl9ETUFDSENSLCBjaGNyICYgfm1hc2spOwogCi0JaWYgKGNoY3IgJiBjaGVja19iaXRzKSB7CisJaWYgKHhmZXJfZW5kKQogCQl1c2JfZG1hY19pc3JfdHJhbnNmZXJfZW5kKGNoYW4pOwotCQlyZXQgfD0gSVJRX0hBTkRMRUQ7Ci0JfQogCiAJc3Bpbl91bmxvY2soJmNoYW4tPnZjLmxvY2spOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9zaXJmLWRtYS5jIGIvZHJpdmVycy9kbWEvc2lyZi1kbWEuYwppbmRleCBkOGJjM2YyLi44ZjYyZWRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9zaXJmLWRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL3NpcmYtZG1hLmMKQEAgLTM2MCw5ICszNjAsNyBAQAogCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShzZGVzYywgJmxpc3QsIG5vZGUpIHsKIAkJCQlkZXNjID0gJnNkZXNjLT5kZXNjOwogCi0JCQkJaWYgKGRlc2MtPmNhbGxiYWNrKQotCQkJCQlkZXNjLT5jYWxsYmFjayhkZXNjLT5jYWxsYmFja19wYXJhbSk7Ci0KKwkJCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2tfaW52b2tlKGRlc2MsIE5VTEwpOwogCQkJCWxhc3RfY29va2llID0gZGVzYy0+Y29va2llOwogCQkJCWRtYV9ydW5fZGVwZW5kZW5jaWVzKGRlc2MpOwogCQkJfQpAQCAtMzg4LDggKzM4Niw3IEBACiAKIAkJCWRlc2MgPSAmc2Rlc2MtPmRlc2M7CiAJCQl3aGlsZSAoaGFwcGVuZWRfY3ljbGljICE9IHNjaGFuLT5jb21wbGV0ZWRfY3ljbGljKSB7Ci0JCQkJaWYgKGRlc2MtPmNhbGxiYWNrKQotCQkJCQlkZXNjLT5jYWxsYmFjayhkZXNjLT5jYWxsYmFja19wYXJhbSk7CisJCQkJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrX2ludm9rZShkZXNjLCBOVUxMKTsKIAkJCQlzY2hhbi0+Y29tcGxldGVkX2N5Y2xpYysrOwogCQkJfQogCQl9CkBAIC04NjksNyArODY2LDcgQEAKIAl9CiAKIAlzZG1hLT5pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChkbiwgMCk7Ci0JaWYgKHNkbWEtPmlycSA9PSBOT19JUlEpIHsKKwlpZiAoIXNkbWEtPmlycSkgewogCQlkZXZfZXJyKGRldiwgIkVycm9yIG1hcHBpbmcgSVJRIVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3N0ZV9kbWE0MC5jIGIvZHJpdmVycy9kbWEvc3RlX2RtYTQwLmMKaW5kZXggOGIxOGU0NC4uODY4NGQxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvc3RlX2RtYTQwLmMKKysrIGIvZHJpdmVycy9kbWEvc3RlX2RtYTQwLmMKQEAgLTg3NCw3ICs4NzQsNyBAQAogCX0KIAogCWlmIChjdXJyX2xjbGEgPCAwKQotCQlnb3RvIG91dDsKKwkJZ290byBzZXRfY3VycmVudDsKIAogCWZvciAoOyBsbGlfY3VycmVudCA8IGxsaV9sZW47IGxsaV9jdXJyZW50KyspIHsKIAkJdW5zaWduZWQgaW50IGxjbGFfb2Zmc2V0ID0gY2hhbi0+cGh5X2NoYW4tPm51bSAqIDEwMjQgKwpAQCAtOTI1LDggKzkyNSw3IEBACiAJCQlicmVhazsKIAkJfQogCX0KLQotb3V0OgorIHNldF9jdXJyZW50OgogCWRlc2MtPmxsaV9jdXJyZW50ID0gbGxpX2N1cnJlbnQ7CiB9CiAKQEAgLTk0MSwxNSArOTQwLDcgQEAKIAogc3RhdGljIHN0cnVjdCBkNDBfZGVzYyAqZDQwX2ZpcnN0X2FjdGl2ZV9nZXQoc3RydWN0IGQ0MF9jaGFuICpkNDBjKQogewotCXN0cnVjdCBkNDBfZGVzYyAqZDsKLQotCWlmIChsaXN0X2VtcHR5KCZkNDBjLT5hY3RpdmUpKQotCQlyZXR1cm4gTlVMTDsKLQotCWQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZkNDBjLT5hY3RpdmUsCi0JCQkgICAgIHN0cnVjdCBkNDBfZGVzYywKLQkJCSAgICAgbm9kZSk7Ci0JcmV0dXJuIGQ7CisJcmV0dXJuIGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmZDQwYy0+YWN0aXZlLCBzdHJ1Y3QgZDQwX2Rlc2MsIG5vZGUpOwogfQogCiAvKiByZW1vdmUgZGVzYyBmcm9tIGN1cnJlbnQgcXVldWUgYW5kIGFkZCBpdCB0byB0aGUgcGVuZGluZ19xdWV1ZSAqLwpAQCAtOTYyLDM2ICs5NTMsMTggQEAKIAogc3RhdGljIHN0cnVjdCBkNDBfZGVzYyAqZDQwX2ZpcnN0X3BlbmRpbmcoc3RydWN0IGQ0MF9jaGFuICpkNDBjKQogewotCXN0cnVjdCBkNDBfZGVzYyAqZDsKLQotCWlmIChsaXN0X2VtcHR5KCZkNDBjLT5wZW5kaW5nX3F1ZXVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlkID0gbGlzdF9maXJzdF9lbnRyeSgmZDQwYy0+cGVuZGluZ19xdWV1ZSwKLQkJCSAgICAgc3RydWN0IGQ0MF9kZXNjLAotCQkJICAgICBub2RlKTsKLQlyZXR1cm4gZDsKKwlyZXR1cm4gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZkNDBjLT5wZW5kaW5nX3F1ZXVlLCBzdHJ1Y3QgZDQwX2Rlc2MsCisJCQkJCW5vZGUpOwogfQogCiBzdGF0aWMgc3RydWN0IGQ0MF9kZXNjICpkNDBfZmlyc3RfcXVldWVkKHN0cnVjdCBkNDBfY2hhbiAqZDQwYykKIHsKLQlzdHJ1Y3QgZDQwX2Rlc2MgKmQ7Ci0KLQlpZiAobGlzdF9lbXB0eSgmZDQwYy0+cXVldWUpKQotCQlyZXR1cm4gTlVMTDsKLQotCWQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZkNDBjLT5xdWV1ZSwKLQkJCSAgICAgc3RydWN0IGQ0MF9kZXNjLAotCQkJICAgICBub2RlKTsKLQlyZXR1cm4gZDsKKwlyZXR1cm4gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZkNDBjLT5xdWV1ZSwgc3RydWN0IGQ0MF9kZXNjLCBub2RlKTsKIH0KIAogc3RhdGljIHN0cnVjdCBkNDBfZGVzYyAqZDQwX2ZpcnN0X2RvbmUoc3RydWN0IGQ0MF9jaGFuICpkNDBjKQogewotCWlmIChsaXN0X2VtcHR5KCZkNDBjLT5kb25lKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gbGlzdF9maXJzdF9lbnRyeSgmZDQwYy0+ZG9uZSwgc3RydWN0IGQ0MF9kZXNjLCBub2RlKTsKKwlyZXR1cm4gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZkNDBjLT5kb25lLCBzdHJ1Y3QgZDQwX2Rlc2MsIG5vZGUpOwogfQogCiBzdGF0aWMgaW50IGQ0MF9wc2l6ZV8yX2J1cnN0X3NpemUoYm9vbCBpc19sb2csIGludCBwc2l6ZSkKQEAgLTEwODMsNyArMTA1Niw3IEBACiAJCQlENDBfQ0hBTl9QT1MoZDQwYy0+cGh5X2NoYW4tPm51bSk7CiAKIAkJaWYgKHN0YXR1cyA9PSBENDBfRE1BX1NVU1BFTkRFRCB8fCBzdGF0dXMgPT0gRDQwX0RNQV9TVE9QKQotCQkJZ290byBkb25lOworCQkJZ290byB1bmxvY2s7CiAJfQogCiAJd21hc2sgPSAweGZmZmZmZmZmICYgfihENDBfQ0hBTl9QT1NfTUFTSyhkNDBjLT5waHlfY2hhbi0+bnVtKSk7CkBAIC0xMTE5LDcgKzEwOTIsNyBAQAogCQl9CiAKIAl9Ci1kb25lOgorIHVubG9jazoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkNDBjLT5iYXNlLT5leGVjbWRfbG9jaywgZmxhZ3MpOwogCXJldHVybiByZXQ7CiB9CkBAIC0xNTk2LDggKzE1NjksNyBAQAogCXN0cnVjdCBkNDBfZGVzYyAqZDQwZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWJvb2wgY2FsbGJhY2tfYWN0aXZlOwotCWRtYV9hc3luY190eF9jYWxsYmFjayBjYWxsYmFjazsKLQl2b2lkICpjYWxsYmFja19wYXJhbTsKKwlzdHJ1Y3QgZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2sgY2I7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZDQwYy0+bG9jaywgZmxhZ3MpOwogCkBAIC0xNjA3LDcgKzE1NzksNyBAQAogCQkvKiBDaGVjayBpZiB3ZSBoYXZlIHJlYWNoZWQgaGVyZSBmb3IgY3ljbGljIGpvYiAqLwogCQlkNDBkID0gZDQwX2ZpcnN0X2FjdGl2ZV9nZXQoZDQwYyk7CiAJCWlmIChkNDBkID09IE5VTEwgfHwgIWQ0MGQtPmN5Y2xpYykKLQkJCWdvdG8gZXJyOworCQkJZ290byBjaGVja19wZW5kaW5nX3R4OwogCX0KIAogCWlmICghZDQwZC0+Y3ljbGljKQpAQCAtMTYyNCw4ICsxNTk2LDcgQEAKIAogCS8qIENhbGxiYWNrIHRvIGNsaWVudCAqLwogCWNhbGxiYWNrX2FjdGl2ZSA9ICEhKGQ0MGQtPnR4ZC5mbGFncyAmIERNQV9QUkVQX0lOVEVSUlVQVCk7Ci0JY2FsbGJhY2sgPSBkNDBkLT50eGQuY2FsbGJhY2s7Ci0JY2FsbGJhY2tfcGFyYW0gPSBkNDBkLT50eGQuY2FsbGJhY2tfcGFyYW07CisJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrKCZkNDBkLT50eGQsICZjYik7CiAKIAlpZiAoIWQ0MGQtPmN5Y2xpYykgewogCQlpZiAoYXN5bmNfdHhfdGVzdF9hY2soJmQ0MGQtPnR4ZCkpIHsKQEAgLTE2NDYsMTIgKzE2MTcsMTEgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQ0MGMtPmxvY2ssIGZsYWdzKTsKIAotCWlmIChjYWxsYmFja19hY3RpdmUgJiYgY2FsbGJhY2spCi0JCWNhbGxiYWNrKGNhbGxiYWNrX3BhcmFtKTsKKwlpZiAoY2FsbGJhY2tfYWN0aXZlKQorCQlkbWFlbmdpbmVfZGVzY19jYWxsYmFja19pbnZva2UoJmNiLCBOVUxMKTsKIAogCXJldHVybjsKLQotZXJyOgorIGNoZWNrX3BlbmRpbmdfdHg6CiAJLyogUmVzY3VlIG1hbm91dmVyIGlmIHJlY2VpdmluZyBkb3VibGUgaW50ZXJydXB0cyAqLwogCWlmIChkNDBjLT5wZW5kaW5nX3R4ID4gMCkKIAkJZDQwYy0+cGVuZGluZ190eC0tOwpAQCAtMTc4MCw0MiArMTc1MCw0MCBAQAogCQkgICAgcGh5LT5hbGxvY2F0ZWRfZHN0ID09IEQ0MF9BTExPQ19GUkVFKSB7CiAJCQlwaHktPmFsbG9jYXRlZF9kc3QgPSBENDBfQUxMT0NfUEhZOwogCQkJcGh5LT5hbGxvY2F0ZWRfc3JjID0gRDQwX0FMTE9DX1BIWTsKLQkJCWdvdG8gZm91bmQ7CisJCQlnb3RvIGZvdW5kX3VubG9jazsKIAkJfSBlbHNlCi0JCQlnb3RvIG5vdF9mb3VuZDsKKwkJCWdvdG8gbm90X2ZvdW5kX3VubG9jazsKIAl9CiAKIAkvKiBMb2dpY2FsIGNoYW5uZWwgKi8KIAlpZiAoaXNfc3JjKSB7CiAJCWlmIChwaHktPmFsbG9jYXRlZF9zcmMgPT0gRDQwX0FMTE9DX1BIWSkKLQkJCWdvdG8gbm90X2ZvdW5kOworCQkJZ290byBub3RfZm91bmRfdW5sb2NrOwogCiAJCWlmIChwaHktPmFsbG9jYXRlZF9zcmMgPT0gRDQwX0FMTE9DX0ZSRUUpCiAJCQlwaHktPmFsbG9jYXRlZF9zcmMgPSBENDBfQUxMT0NfTE9HX0ZSRUU7CiAKIAkJaWYgKCEocGh5LT5hbGxvY2F0ZWRfc3JjICYgQklUKGxvZ19ldmVudF9saW5lKSkpIHsKIAkJCXBoeS0+YWxsb2NhdGVkX3NyYyB8PSBCSVQobG9nX2V2ZW50X2xpbmUpOwotCQkJZ290byBmb3VuZDsKKwkJCWdvdG8gZm91bmRfdW5sb2NrOwogCQl9IGVsc2UKLQkJCWdvdG8gbm90X2ZvdW5kOworCQkJZ290byBub3RfZm91bmRfdW5sb2NrOwogCX0gZWxzZSB7CiAJCWlmIChwaHktPmFsbG9jYXRlZF9kc3QgPT0gRDQwX0FMTE9DX1BIWSkKLQkJCWdvdG8gbm90X2ZvdW5kOworCQkJZ290byBub3RfZm91bmRfdW5sb2NrOwogCiAJCWlmIChwaHktPmFsbG9jYXRlZF9kc3QgPT0gRDQwX0FMTE9DX0ZSRUUpCiAJCQlwaHktPmFsbG9jYXRlZF9kc3QgPSBENDBfQUxMT0NfTE9HX0ZSRUU7CiAKIAkJaWYgKCEocGh5LT5hbGxvY2F0ZWRfZHN0ICYgQklUKGxvZ19ldmVudF9saW5lKSkpIHsKIAkJCXBoeS0+YWxsb2NhdGVkX2RzdCB8PSBCSVQobG9nX2V2ZW50X2xpbmUpOwotCQkJZ290byBmb3VuZDsKLQkJfSBlbHNlCi0JCQlnb3RvIG5vdF9mb3VuZDsKKwkJCWdvdG8gZm91bmRfdW5sb2NrOworCQl9CiAJfQotCi1ub3RfZm91bmQ6Cisgbm90X2ZvdW5kX3VubG9jazoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaHktPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gZmFsc2U7Ci1mb3VuZDoKKyBmb3VuZF91bmxvY2s6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGh5LT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHRydWU7CiB9CkBAIC0xODMxLDcgKzE3OTksNyBAQAogCQlwaHktPmFsbG9jYXRlZF9kc3QgPSBENDBfQUxMT0NfRlJFRTsKIAkJcGh5LT5hbGxvY2F0ZWRfc3JjID0gRDQwX0FMTE9DX0ZSRUU7CiAJCWlzX2ZyZWUgPSB0cnVlOwotCQlnb3RvIG91dDsKKwkJZ290byB1bmxvY2s7CiAJfQogCiAJLyogTG9naWNhbCBjaGFubmVsICovCkBAIC0xODQ3LDggKzE4MTUsNyBAQAogCiAJaXNfZnJlZSA9ICgocGh5LT5hbGxvY2F0ZWRfc3JjIHwgcGh5LT5hbGxvY2F0ZWRfZHN0KSA9PQogCQkgICBENDBfQUxMT0NfRlJFRSk7Ci0KLW91dDoKKyB1bmxvY2s6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGh5LT5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gaXNfZnJlZTsKQEAgLTIwNDcsNyArMjAxNCw3IEBACiAJcmVzID0gZDQwX2NoYW5uZWxfZXhlY3V0ZV9jb21tYW5kKGQ0MGMsIEQ0MF9ETUFfU1RPUCk7CiAJaWYgKHJlcykgewogCQljaGFuX2VycihkNDBjLCAic3RvcCBmYWlsZWRcbiIpOwotCQlnb3RvIG91dDsKKwkJZ290byBtYXJrX2xhc3RfYnVzeTsKIAl9CiAKIAlkNDBfYWxsb2NfbWFza19mcmVlKHBoeSwgaXNfc3JjLCBjaGFuX2lzX2xvZ2ljYWwoZDQwYykgPyBldmVudCA6IDApOwpAQCAtMjA2NSw4ICsyMDMyLDcgQEAKIAlkNDBjLT5idXN5ID0gZmFsc2U7CiAJZDQwYy0+cGh5X2NoYW4gPSBOVUxMOwogCWQ0MGMtPmNvbmZpZ3VyZWQgPSBmYWxzZTsKLW91dDoKLQorIG1hcmtfbGFzdF9idXN5OgogCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koZDQwYy0+YmFzZS0+ZGV2KTsKIAlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChkNDBjLT5iYXNlLT5kZXYpOwogCXJldHVybiByZXM7CkBAIC0yMDk0LDggKzIwNjAsNyBAQAogCQkJRDQwX0NIQU5fUE9TKGQ0MGMtPnBoeV9jaGFuLT5udW0pOwogCQlpZiAoc3RhdHVzID09IEQ0MF9ETUFfU1VTUEVOREVEIHx8IHN0YXR1cyA9PSBENDBfRE1BX1NUT1ApCiAJCQlpc19wYXVzZWQgPSB0cnVlOwotCi0JCWdvdG8gX2V4aXQ7CisJCWdvdG8gdW5sb2NrOwogCX0KIAogCWlmIChkNDBjLT5kbWFfY2ZnLmRpciA9PSBETUFfTUVNX1RPX0RFViB8fApAQCAtMjEwNSw3ICsyMDcwLDcgQEAKIAkJc3RhdHVzID0gcmVhZGwoY2hhbmJhc2UgKyBENDBfQ0hBTl9SRUdfU1NMTkspOwogCX0gZWxzZSB7CiAJCWNoYW5fZXJyKGQ0MGMsICJVbmtub3duIGRpcmVjdGlvblxuIik7Ci0JCWdvdG8gX2V4aXQ7CisJCWdvdG8gdW5sb2NrOwogCX0KIAogCXN0YXR1cyA9IChzdGF0dXMgJiBENDBfRVZFTlRMSU5FX01BU0soZXZlbnQpKSA+PgpAQCAtMjExMyw3ICsyMDc4LDcgQEAKIAogCWlmIChzdGF0dXMgIT0gRDQwX0RNQV9SVU4pCiAJCWlzX3BhdXNlZCA9IHRydWU7Ci1fZXhpdDoKKyB1bmxvY2s6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZDQwYy0+bG9jaywgZmxhZ3MpOwogCXJldHVybiBpc19wYXVzZWQ7CiAKQEAgLTIxOTgsNyArMjE2Myw3IEBACiBkNDBfcHJlcF9kZXNjKHN0cnVjdCBkNDBfY2hhbiAqY2hhbiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKIAkgICAgICB1bnNpZ25lZCBpbnQgc2dfbGVuLCB1bnNpZ25lZCBsb25nIGRtYV9mbGFncykKIHsKLQlzdHJ1Y3Qgc3RlZG1hNDBfY2hhbl9jZmcgKmNmZyA9ICZjaGFuLT5kbWFfY2ZnOworCXN0cnVjdCBzdGVkbWE0MF9jaGFuX2NmZyAqY2ZnOwogCXN0cnVjdCBkNDBfZGVzYyAqZGVzYzsKIAlpbnQgcmV0OwogCkBAIC0yMjA2LDE3ICsyMTcxLDE4IEBACiAJaWYgKCFkZXNjKQogCQlyZXR1cm4gTlVMTDsKIAorCWNmZyA9ICZjaGFuLT5kbWFfY2ZnOwogCWRlc2MtPmxsaV9sZW4gPSBkNDBfc2dfMl9kbWFsZW4oc2csIHNnX2xlbiwgY2ZnLT5zcmNfaW5mby5kYXRhX3dpZHRoLAogCQkJCQljZmctPmRzdF9pbmZvLmRhdGFfd2lkdGgpOwogCWlmIChkZXNjLT5sbGlfbGVuIDwgMCkgewogCQljaGFuX2VycihjaGFuLCAiVW5hbGlnbmVkIHNpemVcbiIpOwotCQlnb3RvIGVycjsKKwkJZ290byBmcmVlX2Rlc2M7CiAJfQogCiAJcmV0ID0gZDQwX3Bvb2xfbGxpX2FsbG9jKGNoYW4sIGRlc2MsIGRlc2MtPmxsaV9sZW4pOwogCWlmIChyZXQgPCAwKSB7CiAJCWNoYW5fZXJyKGNoYW4sICJDb3VsZCBub3QgYWxsb2NhdGUgbGxpXG4iKTsKLQkJZ290byBlcnI7CisJCWdvdG8gZnJlZV9kZXNjOwogCX0KIAogCWRlc2MtPmxsaV9jdXJyZW50ID0gMDsKQEAgLTIyMjYsOCArMjE5Miw3IEBACiAJZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3JfaW5pdCgmZGVzYy0+dHhkLCAmY2hhbi0+Y2hhbik7CiAKIAlyZXR1cm4gZGVzYzsKLQotZXJyOgorIGZyZWVfZGVzYzoKIAlkNDBfZGVzY19mcmVlKGNoYW4sIGRlc2MpOwogCXJldHVybiBOVUxMOwogfQpAQCAtMjIzOCw4ICsyMjAzLDggQEAKIAkgICAgZW51bSBkbWFfdHJhbnNmZXJfZGlyZWN0aW9uIGRpcmVjdGlvbiwgdW5zaWduZWQgbG9uZyBkbWFfZmxhZ3MpCiB7CiAJc3RydWN0IGQ0MF9jaGFuICpjaGFuID0gY29udGFpbmVyX29mKGRjaGFuLCBzdHJ1Y3QgZDQwX2NoYW4sIGNoYW4pOwotCWRtYV9hZGRyX3Qgc3JjX2Rldl9hZGRyID0gMDsKLQlkbWFfYWRkcl90IGRzdF9kZXZfYWRkciA9IDA7CisJZG1hX2FkZHJfdCBzcmNfZGV2X2FkZHI7CisJZG1hX2FkZHJfdCBkc3RfZGV2X2FkZHI7CiAJc3RydWN0IGQ0MF9kZXNjICpkZXNjOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKQEAgLTIyNTMsMTEgKzIyMTgsMTMgQEAKIAogCWRlc2MgPSBkNDBfcHJlcF9kZXNjKGNoYW4sIHNnX3NyYywgc2dfbGVuLCBkbWFfZmxhZ3MpOwogCWlmIChkZXNjID09IE5VTEwpCi0JCWdvdG8gZXJyOworCQlnb3RvIHVubG9jazsKIAogCWlmIChzZ19uZXh0KCZzZ19zcmNbc2dfbGVuIC0gMV0pID09IHNnX3NyYykKIAkJZGVzYy0+Y3ljbGljID0gdHJ1ZTsKIAorCXNyY19kZXZfYWRkciA9IDA7CisJZHN0X2Rldl9hZGRyID0gMDsKIAlpZiAoZGlyZWN0aW9uID09IERNQV9ERVZfVE9fTUVNKQogCQlzcmNfZGV2X2FkZHIgPSBjaGFuLT5ydW50aW1lX2FkZHI7CiAJZWxzZSBpZiAoZGlyZWN0aW9uID09IERNQV9NRU1fVE9fREVWKQpAQCAtMjI3Myw3ICsyMjQwLDcgQEAKIAlpZiAocmV0KSB7CiAJCWNoYW5fZXJyKGNoYW4sICJGYWlsZWQgdG8gcHJlcGFyZSAlcyBzZyBqb2I6ICVkXG4iLAogCQkJIGNoYW5faXNfbG9naWNhbChjaGFuKSA/ICJsb2ciIDogInBoeSIsIHJldCk7Ci0JCWdvdG8gZXJyOworCQlnb3RvIGZyZWVfZGVzYzsKIAl9CiAKIAkvKgpAQCAtMjI4NSwxMCArMjI1Miw5IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbi0+bG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuICZkZXNjLT50eGQ7Ci0KLWVycjoKLQlpZiAoZGVzYykKLQkJZDQwX2Rlc2NfZnJlZShjaGFuLCBkZXNjKTsKKyBmcmVlX2Rlc2M6CisJZDQwX2Rlc2NfZnJlZShjaGFuLCBkZXNjKTsKKyB1bmxvY2s6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbi0+bG9jaywgZmxhZ3MpOwogCXJldHVybiBOVUxMOwogfQpAQCAtMjQyNiw3ICsyMzkyLDcgQEAKIAkJZXJyID0gZDQwX2NvbmZpZ19tZW1jcHkoZDQwYyk7CiAJCWlmIChlcnIpIHsKIAkJCWNoYW5fZXJyKGQ0MGMsICJGYWlsZWQgdG8gY29uZmlndXJlIG1lbWNweSBjaGFubmVsXG4iKTsKLQkJCWdvdG8gZmFpbDsKKwkJCWdvdG8gbWFya19sYXN0X2J1c3k7CiAJCX0KIAl9CiAKQEAgLTI0MzQsNyArMjQwMCw3IEBACiAJaWYgKGVycikgewogCQljaGFuX2VycihkNDBjLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGNoYW5uZWxcbiIpOwogCQlkNDBjLT5jb25maWd1cmVkID0gZmFsc2U7Ci0JCWdvdG8gZmFpbDsKKwkJZ290byBtYXJrX2xhc3RfYnVzeTsKIAl9CiAKIAlwbV9ydW50aW1lX2dldF9zeW5jKGQ0MGMtPmJhc2UtPmRldik7CkBAIC0yNDY4LDcgKzI0MzQsNyBAQAogCSAqLwogCWlmIChpc19mcmVlX3BoeSkKIAkJZDQwX2NvbmZpZ193cml0ZShkNDBjKTsKLWZhaWw6CisgbWFya19sYXN0X2J1c3k6CiAJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShkNDBjLT5iYXNlLT5kZXYpOwogCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGQ0MGMtPmJhc2UtPmRldik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZDQwYy0+bG9jaywgZmxhZ3MpOwpAQCAtMjg5MSw3ICsyODU3LDcgQEAKIAogCWlmIChlcnIpIHsKIAkJZDQwX2VycihiYXNlLT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgc2xhdmUgY2hhbm5lbHNcbiIpOwotCQlnb3RvIGZhaWx1cmUxOworCQlnb3RvIGV4aXQ7CiAJfQogCiAJZDQwX2NoYW5faW5pdChiYXNlLCAmYmFzZS0+ZG1hX21lbWNweSwgYmFzZS0+bG9nX2NoYW5zLApAQCAtMjkwOCw3ICsyODc0LDcgQEAKIAlpZiAoZXJyKSB7CiAJCWQ0MF9lcnIoYmFzZS0+ZGV2LAogCQkJIkZhaWxlZCB0byByZWdpc3RlciBtZW1jcHkgb25seSBjaGFubmVsc1xuIik7Ci0JCWdvdG8gZmFpbHVyZTI7CisJCWdvdG8gdW5yZWdpc3Rlcl9zbGF2ZTsKIAl9CiAKIAlkNDBfY2hhbl9pbml0KGJhc2UsICZiYXNlLT5kbWFfYm90aCwgYmFzZS0+cGh5X2NoYW5zLApAQCAtMjkyNiwxNCArMjg5MiwxNCBAQAogCWlmIChlcnIpIHsKIAkJZDQwX2VycihiYXNlLT5kZXYsCiAJCQkiRmFpbGVkIHRvIHJlZ2lzdGVyIGxvZ2ljYWwgYW5kIHBoeXNpY2FsIGNhcGFibGUgY2hhbm5lbHNcbiIpOwotCQlnb3RvIGZhaWx1cmUzOworCQlnb3RvIHVucmVnaXN0ZXJfbWVtY3B5OwogCX0KIAlyZXR1cm4gMDsKLWZhaWx1cmUzOgorIHVucmVnaXN0ZXJfbWVtY3B5OgogCWRtYV9hc3luY19kZXZpY2VfdW5yZWdpc3RlcigmYmFzZS0+ZG1hX21lbWNweSk7Ci1mYWlsdXJlMjoKKyB1bnJlZ2lzdGVyX3NsYXZlOgogCWRtYV9hc3luY19kZXZpY2VfdW5yZWdpc3RlcigmYmFzZS0+ZG1hX3NsYXZlKTsKLWZhaWx1cmUxOgorIGV4aXQ6CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMzE0NCwxMSArMzExMCwxMSBAQAogc3RhdGljIHN0cnVjdCBkNDBfYmFzZSAqIF9faW5pdCBkNDBfaHdfZGV0ZWN0X2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgc3RlZG1hNDBfcGxhdGZvcm1fZGF0YSAqcGxhdF9kYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOwotCXZvaWQgX19pb21lbSAqdmlydGJhc2UgPSBOVUxMOwotCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gTlVMTDsKLQlzdHJ1Y3QgZDQwX2Jhc2UgKmJhc2UgPSBOVUxMOwotCWludCBudW1fbG9nX2NoYW5zID0gMDsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJdm9pZCBfX2lvbWVtICp2aXJ0YmFzZTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgZDQwX2Jhc2UgKmJhc2U7CisJaW50IG51bV9sb2dfY2hhbnM7CiAJaW50IG51bV9waHlfY2hhbnM7CiAJaW50IG51bV9tZW1jcHlfY2hhbnM7CiAJaW50IGNsa19yZXQgPSAtRUlOVkFMOwpAQCAtMzE2MCwyNyArMzEyNiwyNyBAQAogCWNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CiAJaWYgKElTX0VSUihjbGspKSB7CiAJCWQ0MF9lcnIoJnBkZXYtPmRldiwgIk5vIG1hdGNoaW5nIGNsb2NrIGZvdW5kXG4iKTsKLQkJZ290byBmYWlsdXJlOworCQlnb3RvIGNoZWNrX3ByZXBhcmVfZW5hYmxlZDsKIAl9CiAKIAljbGtfcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGNsayk7CiAJaWYgKGNsa19yZXQpIHsKIAkJZDQwX2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHByZXBhcmUvZW5hYmxlIGNsb2NrXG4iKTsKLQkJZ290byBmYWlsdXJlOworCQlnb3RvIGRpc2FibGVfdW5wcmVwYXJlOwogCX0KIAogCS8qIEdldCBJTyBmb3IgRE1BQyBiYXNlIGFkZHJlc3MgKi8KIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAiYmFzZSIpOwogCWlmICghcmVzKQotCQlnb3RvIGZhaWx1cmU7CisJCWdvdG8gZGlzYWJsZV91bnByZXBhcmU7CiAKIAlpZiAocmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwKIAkJCSAgICAgICBENDBfTkFNRSAiIEkvTyBiYXNlIikgPT0gTlVMTCkKLQkJZ290byBmYWlsdXJlOworCQlnb3RvIHJlbGVhc2VfcmVnaW9uOwogCiAJdmlydGJhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CiAJaWYgKCF2aXJ0YmFzZSkKLQkJZ290byBmYWlsdXJlOworCQlnb3RvIHJlbGVhc2VfcmVnaW9uOwogCiAJLyogVGhpcyBpcyBqdXN0IGEgcmVndWxhciBBTUJBIFByaW1lQ2VsbCBJRCBhY3R1YWxseSAqLwogCWZvciAocGlkID0gMCwgaSA9IDA7IGkgPCA0OyBpKyspCkBAIC0zMTkyLDEzICszMTU4LDEzIEBACiAKIAlpZiAoY2lkICE9IEFNQkFfQ0lEKSB7CiAJCWQ0MF9lcnIoJnBkZXYtPmRldiwgIlVua25vd24gaGFyZHdhcmUhIE5vIFByaW1lQ2VsbCBJRFxuIik7Ci0JCWdvdG8gZmFpbHVyZTsKKwkJZ290byB1bm1hcF9pbzsKIAl9CiAJaWYgKEFNQkFfTUFORl9CSVRTKHBpZCkgIT0gQU1CQV9WRU5ET1JfU1QpIHsKIAkJZDQwX2VycigmcGRldi0+ZGV2LCAiVW5rbm93biBkZXNpZ25lciEgR290ICV4IHdhbnRlZCAleFxuIiwKIAkJCUFNQkFfTUFORl9CSVRTKHBpZCksCiAJCQlBTUJBX1ZFTkRPUl9TVCk7Ci0JCWdvdG8gZmFpbHVyZTsKKwkJZ290byB1bm1hcF9pbzsKIAl9CiAJLyoKIAkgKiBIVyByZXZpc2lvbjoKQEAgLTMyMTIsNyArMzE3OCw3IEBACiAJcmV2ID0gQU1CQV9SRVZfQklUUyhwaWQpOwogCWlmIChyZXYgPCAyKSB7CiAJCWQ0MF9lcnIoJnBkZXYtPmRldiwgImhhcmR3YXJlIHJldmlzaW9uOiAlZCBpcyBub3Qgc3VwcG9ydGVkIiwgcmV2KTsKLQkJZ290byBmYWlsdXJlOworCQlnb3RvIHVubWFwX2lvOwogCX0KIAogCS8qIFRoZSBudW1iZXIgb2YgcGh5c2ljYWwgY2hhbm5lbHMgb24gdGhpcyBIVyAqLwpAQCAtMzIzOCw3ICszMjA0LDcgQEAKIAkJICAgICAgIHNpemVvZihzdHJ1Y3QgZDQwX2NoYW4pLCBHRlBfS0VSTkVMKTsKIAogCWlmIChiYXNlID09IE5VTEwpCi0JCWdvdG8gZmFpbHVyZTsKKwkJZ290byB1bm1hcF9pbzsKIAogCWJhc2UtPnJldiA9IHJldjsKIAliYXNlLT5jbGsgPSBjbGs7CkBAIC0zMjgzLDY1ICszMjQ5LDY2IEBACiAJCWJhc2UtPmdlbl9kbWFjLmluaXRfcmVnX3NpemUgPSBBUlJBWV9TSVpFKGRtYV9pbml0X3JlZ192NGEpOwogCX0KIAotCWJhc2UtPnBoeV9yZXMgPSBremFsbG9jKG51bV9waHlfY2hhbnMgKiBzaXplb2Yoc3RydWN0IGQ0MF9waHlfcmVzKSwKKwliYXNlLT5waHlfcmVzID0ga2NhbGxvYyhudW1fcGh5X2NoYW5zLAorCQkJCXNpemVvZigqYmFzZS0+cGh5X3JlcyksCiAJCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFiYXNlLT5waHlfcmVzKQotCQlnb3RvIGZhaWx1cmU7CisJCWdvdG8gZnJlZV9iYXNlOwogCi0JYmFzZS0+bG9va3VwX3BoeV9jaGFucyA9IGt6YWxsb2MobnVtX3BoeV9jaGFucyAqCi0JCQkJCSBzaXplb2Yoc3RydWN0IGQ0MF9jaGFuICopLAorCWJhc2UtPmxvb2t1cF9waHlfY2hhbnMgPSBrY2FsbG9jKG51bV9waHlfY2hhbnMsCisJCQkJCSBzaXplb2YoKmJhc2UtPmxvb2t1cF9waHlfY2hhbnMpLAogCQkJCQkgR0ZQX0tFUk5FTCk7CiAJaWYgKCFiYXNlLT5sb29rdXBfcGh5X2NoYW5zKQotCQlnb3RvIGZhaWx1cmU7CisJCWdvdG8gZnJlZV9waHlfcmVzOwogCi0JYmFzZS0+bG9va3VwX2xvZ19jaGFucyA9IGt6YWxsb2MobnVtX2xvZ19jaGFucyAqCi0JCQkJCSBzaXplb2Yoc3RydWN0IGQ0MF9jaGFuICopLAorCWJhc2UtPmxvb2t1cF9sb2dfY2hhbnMgPSBrY2FsbG9jKG51bV9sb2dfY2hhbnMsCisJCQkJCSBzaXplb2YoKmJhc2UtPmxvb2t1cF9sb2dfY2hhbnMpLAogCQkJCQkgR0ZQX0tFUk5FTCk7CiAJaWYgKCFiYXNlLT5sb29rdXBfbG9nX2NoYW5zKQotCQlnb3RvIGZhaWx1cmU7CisJCWdvdG8gZnJlZV9waHlfY2hhbnM7CiAKLQliYXNlLT5yZWdfdmFsX2JhY2t1cF9jaGFuID0ga21hbGxvYyhiYXNlLT5udW1fcGh5X2NoYW5zICoKLQkJCQkJICAgIHNpemVvZihkNDBfYmFja3VwX3JlZ3NfY2hhbiksCi0JCQkJCSAgICBHRlBfS0VSTkVMKTsKKwliYXNlLT5yZWdfdmFsX2JhY2t1cF9jaGFuID0ga21hbGxvY19hcnJheShiYXNlLT5udW1fcGh5X2NoYW5zLAorCQkJCQkJICBzaXplb2YoZDQwX2JhY2t1cF9yZWdzX2NoYW4pLAorCQkJCQkJICBHRlBfS0VSTkVMKTsKIAlpZiAoIWJhc2UtPnJlZ192YWxfYmFja3VwX2NoYW4pCi0JCWdvdG8gZmFpbHVyZTsKKwkJZ290byBmcmVlX2xvZ19jaGFuczsKIAotCWJhc2UtPmxjbGFfcG9vbC5hbGxvY19tYXAgPQotCQlremFsbG9jKG51bV9waHlfY2hhbnMgKiBzaXplb2Yoc3RydWN0IGQ0MF9kZXNjICopCi0JCQkqIEQ0MF9MQ0xBX0xJTktfUEVSX0VWRU5UX0dSUCwgR0ZQX0tFUk5FTCk7CisJYmFzZS0+bGNsYV9wb29sLmFsbG9jX21hcCA9IGtjYWxsb2MobnVtX3BoeV9jaGFucworCQkJCQkgICAgKiBENDBfTENMQV9MSU5LX1BFUl9FVkVOVF9HUlAsCisJCQkJCSAgICBzaXplb2YoKmJhc2UtPmxjbGFfcG9vbC5hbGxvY19tYXApLAorCQkJCQkgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFiYXNlLT5sY2xhX3Bvb2wuYWxsb2NfbWFwKQotCQlnb3RvIGZhaWx1cmU7CisJCWdvdG8gZnJlZV9iYWNrdXBfY2hhbjsKIAogCWJhc2UtPmRlc2Nfc2xhYiA9IGttZW1fY2FjaGVfY3JlYXRlKEQ0MF9OQU1FLCBzaXplb2Yoc3RydWN0IGQ0MF9kZXNjKSwKIAkJCQkJICAgIDAsIFNMQUJfSFdDQUNIRV9BTElHTiwKIAkJCQkJICAgIE5VTEwpOwogCWlmIChiYXNlLT5kZXNjX3NsYWIgPT0gTlVMTCkKLQkJZ290byBmYWlsdXJlOworCQlnb3RvIGZyZWVfbWFwOwogCiAJcmV0dXJuIGJhc2U7Ci0KLWZhaWx1cmU6CisgZnJlZV9tYXA6CisJa2ZyZWUoYmFzZS0+bGNsYV9wb29sLmFsbG9jX21hcCk7CisgZnJlZV9iYWNrdXBfY2hhbjoKKwlrZnJlZShiYXNlLT5yZWdfdmFsX2JhY2t1cF9jaGFuKTsKKyBmcmVlX2xvZ19jaGFuczoKKwlrZnJlZShiYXNlLT5sb29rdXBfbG9nX2NoYW5zKTsKKyBmcmVlX3BoeV9jaGFuczoKKwlrZnJlZShiYXNlLT5sb29rdXBfcGh5X2NoYW5zKTsKKyBmcmVlX3BoeV9yZXM6CisJa2ZyZWUoYmFzZS0+cGh5X3Jlcyk7CisgZnJlZV9iYXNlOgorCWtmcmVlKGJhc2UpOworIHVubWFwX2lvOgorCWlvdW5tYXAodmlydGJhc2UpOworIHJlbGVhc2VfcmVnaW9uOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworIGNoZWNrX3ByZXBhcmVfZW5hYmxlZDoKIAlpZiAoIWNsa19yZXQpCisgZGlzYWJsZV91bnByZXBhcmU6CiAJCWNsa19kaXNhYmxlX3VucHJlcGFyZShjbGspOwogCWlmICghSVNfRVJSKGNsaykpCiAJCWNsa19wdXQoY2xrKTsKLQlpZiAodmlydGJhc2UpCi0JCWlvdW5tYXAodmlydGJhc2UpOwotCWlmIChyZXMpCi0JCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LAotCQkJCSAgIHJlc291cmNlX3NpemUocmVzKSk7Ci0JaWYgKHZpcnRiYXNlKQotCQlpb3VubWFwKHZpcnRiYXNlKTsKLQotCWlmIChiYXNlKSB7Ci0JCWtmcmVlKGJhc2UtPmxjbGFfcG9vbC5hbGxvY19tYXApOwotCQlrZnJlZShiYXNlLT5yZWdfdmFsX2JhY2t1cF9jaGFuKTsKLQkJa2ZyZWUoYmFzZS0+bG9va3VwX2xvZ19jaGFucyk7Ci0JCWtmcmVlKGJhc2UtPmxvb2t1cF9waHlfY2hhbnMpOwotCQlrZnJlZShiYXNlLT5waHlfcmVzKTsKLQkJa2ZyZWUoYmFzZSk7Ci0JfQotCiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTM0MDQsMjAgKzMzNzEsMTggQEAKIAlzdHJ1Y3QgZDQwX2xjbGFfcG9vbCAqcG9vbCA9ICZiYXNlLT5sY2xhX3Bvb2w7CiAJdW5zaWduZWQgbG9uZyAqcGFnZV9saXN0OwogCWludCBpLCBqOwotCWludCByZXQgPSAwOworCWludCByZXQ7CiAKIAkvKgogCSAqIFRoaXMgaXMgc29tZXdoYXQgdWdseS4gV2UgbmVlZCA4MTkyIGJ5dGVzIHRoYXQgYXJlIDE4IGJpdCBhbGlnbmVkLAogCSAqIFRvIGZ1bGwgZmlsbCB0aGlzIGhhcmR3YXJlIHJlcXVpcmVtZW50IHdpdGhvdXQgd2FzdGluZyAyNTYga2IKIAkgKiB3ZSBhbGxvY2F0ZSBwYWdlcyB1bnRpbCB3ZSBnZXQgYW4gYWxpZ25lZCBvbmUuCiAJICovCi0JcGFnZV9saXN0ID0ga21hbGxvYyhzaXplb2YodW5zaWduZWQgbG9uZykgKiBNQVhfTENMQV9BTExPQ19BVFRFTVBUUywKLQkJCSAgICBHRlBfS0VSTkVMKTsKLQotCWlmICghcGFnZV9saXN0KSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbHVyZTsKLQl9CisJcGFnZV9saXN0ID0ga21hbGxvY19hcnJheShNQVhfTENMQV9BTExPQ19BVFRFTVBUUywKKwkJCQkgIHNpemVvZigqcGFnZV9saXN0KSwKKwkJCQkgIEdGUF9LRVJORUwpOworCWlmICghcGFnZV9saXN0KQorCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qIENhbGN1bGF0aW5nIGhvdyBtYW55IHBhZ2VzIHRoYXQgYXJlIHJlcXVpcmVkICovCiAJYmFzZS0+bGNsYV9wb29sLnBhZ2VzID0gU1pfMUsgKiBiYXNlLT5udW1fcGh5X2NoYW5zIC8gUEFHRV9TSVpFOwpAQCAtMzQzMyw3ICszMzk4LDcgQEAKIAogCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykKIAkJCQlmcmVlX3BhZ2VzKHBhZ2VfbGlzdFtqXSwgYmFzZS0+bGNsYV9wb29sLnBhZ2VzKTsKLQkJCWdvdG8gZmFpbHVyZTsKKwkJCWdvdG8gZnJlZV9wYWdlX2xpc3Q7CiAJCX0KIAogCQlpZiAoKHZpcnRfdG9fcGh5cygodm9pZCAqKXBhZ2VfbGlzdFtpXSkgJgpAQCAtMzQ2MCw3ICszNDI1LDcgQEAKIAkJCQkJCQkgR0ZQX0tFUk5FTCk7CiAJCWlmICghYmFzZS0+bGNsYV9wb29sLmJhc2VfdW5hbGlnbmVkKSB7CiAJCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBmYWlsdXJlOworCQkJZ290byBmcmVlX3BhZ2VfbGlzdDsKIAkJfQogCiAJCWJhc2UtPmxjbGFfcG9vbC5iYXNlID0gUFRSX0FMSUdOKGJhc2UtPmxjbGFfcG9vbC5iYXNlX3VuYWxpZ25lZCwKQEAgLTM0NzMsMTIgKzM0MzgsMTMgQEAKIAlpZiAoZG1hX21hcHBpbmdfZXJyb3IoYmFzZS0+ZGV2LCBwb29sLT5kbWFfYWRkcikpIHsKIAkJcG9vbC0+ZG1hX2FkZHIgPSAwOwogCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWx1cmU7CisJCWdvdG8gZnJlZV9wYWdlX2xpc3Q7CiAJfQogCiAJd3JpdGVsKHZpcnRfdG9fcGh5cyhiYXNlLT5sY2xhX3Bvb2wuYmFzZSksCiAJICAgICAgIGJhc2UtPnZpcnRiYXNlICsgRDQwX0RSRUdfTENMQSk7Ci1mYWlsdXJlOgorCXJldCA9IDA7CisgZnJlZV9wYWdlX2xpc3Q6CiAJa2ZyZWUocGFnZV9saXN0KTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzQ5MCw5ICszNDU2LDcgQEAKIAlpbnQgbnVtX3BoeSA9IDAsIG51bV9tZW1jcHkgPSAwLCBudW1fZGlzYWJsZWQgPSAwOwogCWNvbnN0IF9fYmUzMiAqbGlzdDsKIAotCXBkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCi0JCQkgICAgIHNpemVvZihzdHJ1Y3Qgc3RlZG1hNDBfcGxhdGZvcm1fZGF0YSksCi0JCQkgICAgIEdGUF9LRVJORUwpOworCXBkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcGRhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBkYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMzU3NCw3ICszNTM4LDcgQEAKIAlpZiAoIXJlcykgewogCQlyZXQgPSAtRU5PRU5UOwogCQlkNDBfZXJyKCZwZGV2LT5kZXYsICJObyBcImxjcGFcIiBtZW1vcnkgcmVzb3VyY2VcbiIpOwotCQlnb3RvIGZhaWx1cmU7CisJCWdvdG8gZGVzdHJveV9jYWNoZTsKIAl9CiAJYmFzZS0+bGNwYV9zaXplID0gcmVzb3VyY2Vfc2l6ZShyZXMpOwogCWJhc2UtPnBoeV9sY3BhID0gcmVzLT5zdGFydDsKQEAgLTM1ODMsNyArMzU0Nyw3IEBACiAJCQkgICAgICAgRDQwX05BTUUgIiBJL08gbGNwYSIpID09IE5VTEwpIHsKIAkJcmV0ID0gLUVCVVNZOwogCQlkNDBfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBMQ1BBIHJlZ2lvbiAlcFJcbiIsIHJlcyk7Ci0JCWdvdG8gZmFpbHVyZTsKKwkJZ290byBkZXN0cm95X2NhY2hlOwogCX0KIAogCS8qIFdlIG1ha2UgdXNlIG9mIEVTUkFNIG1lbW9yeSBmb3IgdGhpcy4gKi8KQEAgLTM1OTksNyArMzU2Myw3IEBACiAJaWYgKCFiYXNlLT5sY3BhX2Jhc2UpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZDQwX2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGlvcmVtYXAgTENQQSByZWdpb25cbiIpOwotCQlnb3RvIGZhaWx1cmU7CisJCWdvdG8gZGVzdHJveV9jYWNoZTsKIAl9CiAJLyogSWYgbGNsYSBoYXMgdG8gYmUgbG9jYXRlZCBpbiBFU1JBTSB3ZSBkb24ndCBuZWVkIHRvIGFsbG9jYXRlICovCiAJaWYgKGJhc2UtPnBsYXRfZGF0YS0+dXNlX2VzcmFtX2xjbGEpIHsKQEAgLTM2MDksMTQgKzM1NzMsMTQgQEAKIAkJCXJldCA9IC1FTk9FTlQ7CiAJCQlkNDBfZXJyKCZwZGV2LT5kZXYsCiAJCQkJIk5vIFwibGNsYV9lc3JhbVwiIG1lbW9yeSByZXNvdXJjZVxuIik7Ci0JCQlnb3RvIGZhaWx1cmU7CisJCQlnb3RvIGRlc3Ryb3lfY2FjaGU7CiAJCX0KIAkJYmFzZS0+bGNsYV9wb29sLmJhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsCiAJCQkJCQlyZXNvdXJjZV9zaXplKHJlcykpOwogCQlpZiAoIWJhc2UtPmxjbGFfcG9vbC5iYXNlKSB7CiAJCQlyZXQgPSAtRU5PTUVNOwogCQkJZDQwX2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGlvcmVtYXAgTENMQSByZWdpb25cbiIpOwotCQkJZ290byBmYWlsdXJlOworCQkJZ290byBkZXN0cm95X2NhY2hlOwogCQl9CiAJCXdyaXRlbChyZXMtPnN0YXJ0LCBiYXNlLT52aXJ0YmFzZSArIEQ0MF9EUkVHX0xDTEEpOwogCkBAIC0zNjI0LDcgKzM1ODgsNyBAQAogCQlyZXQgPSBkNDBfbGNsYV9hbGxvY2F0ZShiYXNlKTsKIAkJaWYgKHJldCkgewogCQkJZDQwX2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIExDTEEgYXJlYVxuIik7Ci0JCQlnb3RvIGZhaWx1cmU7CisJCQlnb3RvIGRlc3Ryb3lfY2FjaGU7CiAJCX0KIAl9CiAKQEAgLTM2MzUsNyArMzU5OSw3IEBACiAJcmV0ID0gcmVxdWVzdF9pcnEoYmFzZS0+aXJxLCBkNDBfaGFuZGxlX2ludGVycnVwdCwgMCwgRDQwX05BTUUsIGJhc2UpOwogCWlmIChyZXQpIHsKIAkJZDQwX2VycigmcGRldi0+ZGV2LCAiTm8gSVJRIGRlZmluZWRcbiIpOwotCQlnb3RvIGZhaWx1cmU7CisJCWdvdG8gZGVzdHJveV9jYWNoZTsKIAl9CiAKIAlpZiAoYmFzZS0+cGxhdF9kYXRhLT51c2VfZXNyYW1fbGNsYSkgewpAQCAtMzY0NSw3ICszNjA5LDcgQEAKIAkJCWQ0MF9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgbGNwYV9yZWd1bGF0b3JcbiIpOwogCQkJcmV0ID0gUFRSX0VSUihiYXNlLT5sY3BhX3JlZ3VsYXRvcik7CiAJCQliYXNlLT5sY3BhX3JlZ3VsYXRvciA9IE5VTEw7Ci0JCQlnb3RvIGZhaWx1cmU7CisJCQlnb3RvIGRlc3Ryb3lfY2FjaGU7CiAJCX0KIAogCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKGJhc2UtPmxjcGFfcmVndWxhdG9yKTsKQEAgLTM2NTQsNyArMzYxOCw3IEBACiAJCQkJIkZhaWxlZCB0byBlbmFibGUgbGNwYV9yZWd1bGF0b3JcbiIpOwogCQkJcmVndWxhdG9yX3B1dChiYXNlLT5sY3BhX3JlZ3VsYXRvcik7CiAJCQliYXNlLT5sY3BhX3JlZ3VsYXRvciA9IE5VTEw7Ci0JCQlnb3RvIGZhaWx1cmU7CisJCQlnb3RvIGRlc3Ryb3lfY2FjaGU7CiAJCX0KIAl9CiAKQEAgLTM2NjksMTMgKzM2MzMsMTMgQEAKIAogCXJldCA9IGQ0MF9kbWFlbmdpbmVfaW5pdChiYXNlLCBudW1fcmVzZXJ2ZWRfY2hhbnMpOwogCWlmIChyZXQpCi0JCWdvdG8gZmFpbHVyZTsKKwkJZ290byBkZXN0cm95X2NhY2hlOwogCiAJYmFzZS0+ZGV2LT5kbWFfcGFybXMgPSAmYmFzZS0+ZG1hX3Bhcm1zOwogCXJldCA9IGRtYV9zZXRfbWF4X3NlZ19zaXplKGJhc2UtPmRldiwgU1RFRE1BNDBfTUFYX1NFR19TSVpFKTsKIAlpZiAocmV0KSB7CiAJCWQ0MF9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBzZXQgZG1hIG1heCBzZWcgc2l6ZVxuIik7Ci0JCWdvdG8gZmFpbHVyZTsKKwkJZ290byBkZXN0cm95X2NhY2hlOwogCX0KIAogCWQ0MF9od19pbml0KGJhc2UpOwpAQCAtMzY4OSw4ICszNjUzLDcgQEAKIAogCWRldl9pbmZvKGJhc2UtPmRldiwgImluaXRpYWxpemVkXG4iKTsKIAlyZXR1cm4gMDsKLQotZmFpbHVyZToKKyBkZXN0cm95X2NhY2hlOgogCWttZW1fY2FjaGVfZGVzdHJveShiYXNlLT5kZXNjX3NsYWIpOwogCWlmIChiYXNlLT52aXJ0YmFzZSkKIAkJaW91bm1hcChiYXNlLT52aXJ0YmFzZSk7CkBAIC0zNzMyLDcgKzM2OTUsNyBAQAogCWtmcmVlKGJhc2UtPmxvb2t1cF9waHlfY2hhbnMpOwogCWtmcmVlKGJhc2UtPnBoeV9yZXMpOwogCWtmcmVlKGJhc2UpOwotcmVwb3J0X2ZhaWx1cmU6CisgcmVwb3J0X2ZhaWx1cmU6CiAJZDQwX2VycigmcGRldi0+ZGV2LCAicHJvYmUgZmFpbGVkXG4iKTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvc3RtMzItZG1hLmMgYi9kcml2ZXJzL2RtYS9zdG0zMi1kbWEuYwppbmRleCAwNDc0NzZhLi4zMDc1NDdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9zdG0zMi1kbWEuYworKysgYi9kcml2ZXJzL2RtYS9zdG0zMi1kbWEuYwpAQCAtOTU0LDcgKzk1NCw3IEBACiAJa2ZyZWUoY29udGFpbmVyX29mKHZkZXNjLCBzdHJ1Y3Qgc3RtMzJfZG1hX2Rlc2MsIHZkZXNjKSk7CiB9CiAKLXZvaWQgc3RtMzJfZG1hX3NldF9jb25maWcoc3RydWN0IHN0bTMyX2RtYV9jaGFuICpjaGFuLAorc3RhdGljIHZvaWQgc3RtMzJfZG1hX3NldF9jb25maWcoc3RydWN0IHN0bTMyX2RtYV9jaGFuICpjaGFuLAogCQkJICBzdHJ1Y3Qgc3RtMzJfZG1hX2NmZyAqY2ZnKQogewogCXN0bTMyX2RtYV9jbGVhcl9yZWcoJmNoYW4tPmNoYW5fcmVnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3N1bjZpLWRtYS5jIGIvZHJpdmVycy9kbWEvc3VuNmktZG1hLmMKaW5kZXggMzgzNWZjZC4uODM0NjE5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvc3VuNmktZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvc3VuNmktZG1hLmMKQEAgLTEwMTEsNiArMTAxMSwxMiBAQAogCS5ucl9tYXhfdmNoYW5zICAgPSAzNywKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc3VuNmlfZG1hX2NvbmZpZyBzdW44aV9hODN0X2RtYV9jZmcgPSB7CisJLm5yX21heF9jaGFubmVscyA9IDgsCisJLm5yX21heF9yZXF1ZXN0cyA9IDI4LAorCS5ucl9tYXhfdmNoYW5zICAgPSAzOSwKK307CisKIC8qCiAgKiBUaGUgSDMgaGFzIDEyIHBoeXNpY2FsIGNoYW5uZWxzLCBhIG1heGltdW0gRFJRIHBvcnQgaWQgb2YgMjcsCiAgKiBhbmQgYSB0b3RhbCBvZiAzNCB1c2FibGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBlbmRwb2ludHMuCkBAIC0xMDI1LDYgKzEwMzEsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VuNmlfZG1hX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNmktYTMxLWRtYSIsIC5kYXRhID0gJnN1bjZpX2EzMV9kbWFfY2ZnIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuOGktYTIzLWRtYSIsIC5kYXRhID0gJnN1bjhpX2EyM19kbWFfY2ZnIH0sCisJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuOGktYTgzdC1kbWEiLCAuZGF0YSA9ICZzdW44aV9hODN0X2RtYV9jZmcgfSwKIAl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW44aS1oMy1kbWEiLCAuZGF0YSA9ICZzdW44aV9oM19kbWFfY2ZnIH0sCiAJeyAvKiBzZW50aW5lbCAqLyB9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvdGVncmEyMC1hcGItZG1hLmMgYi9kcml2ZXJzL2RtYS90ZWdyYTIwLWFwYi1kbWEuYwppbmRleCA2YWI5ZWI5Li4zNzIyYjlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS90ZWdyYTIwLWFwYi1kbWEuYworKysgYi9kcml2ZXJzL2RtYS90ZWdyYTIwLWFwYi1kbWEuYwpAQCAtNjU1LDggKzY1NSw3IEBACiBzdGF0aWMgdm9pZCB0ZWdyYV9kbWFfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJc3RydWN0IHRlZ3JhX2RtYV9jaGFubmVsICp0ZGMgPSAoc3RydWN0IHRlZ3JhX2RtYV9jaGFubmVsICopZGF0YTsKLQlkbWFfYXN5bmNfdHhfY2FsbGJhY2sgY2FsbGJhY2sgPSBOVUxMOwotCXZvaWQgKmNhbGxiYWNrX3BhcmFtID0gTlVMTDsKKwlzdHJ1Y3QgZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2sgY2I7CiAJc3RydWN0IHRlZ3JhX2RtYV9kZXNjICpkbWFfZGVzYzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBjYl9jb3VudDsKQEAgLTY2NiwxMyArNjY1LDEyIEBACiAJCWRtYV9kZXNjICA9IGxpc3RfZmlyc3RfZW50cnkoJnRkYy0+Y2JfZGVzYywKIAkJCQkJdHlwZW9mKCpkbWFfZGVzYyksIGNiX25vZGUpOwogCQlsaXN0X2RlbCgmZG1hX2Rlc2MtPmNiX25vZGUpOwotCQljYWxsYmFjayA9IGRtYV9kZXNjLT50eGQuY2FsbGJhY2s7Ci0JCWNhbGxiYWNrX3BhcmFtID0gZG1hX2Rlc2MtPnR4ZC5jYWxsYmFja19wYXJhbTsKKwkJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrKCZkbWFfZGVzYy0+dHhkLCAmY2IpOwogCQljYl9jb3VudCA9IGRtYV9kZXNjLT5jYl9jb3VudDsKIAkJZG1hX2Rlc2MtPmNiX2NvdW50ID0gMDsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGRjLT5sb2NrLCBmbGFncyk7Ci0JCXdoaWxlIChjYl9jb3VudC0tICYmIGNhbGxiYWNrKQotCQkJY2FsbGJhY2soY2FsbGJhY2tfcGFyYW0pOworCQl3aGlsZSAoY2JfY291bnQtLSkKKwkJCWRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrX2ludm9rZSgmY2IsIE5VTEwpOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmdGRjLT5sb2NrLCBmbGFncyk7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRkYy0+bG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvdGVncmEyMTAtYWRtYS5jIGIvZHJpdmVycy9kbWEvdGVncmEyMTAtYWRtYS5jCmluZGV4IGM0YjEyMWMuLmIxMGNiYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3RlZ3JhMjEwLWFkbWEuYworKysgYi9kcml2ZXJzL2RtYS90ZWdyYTIxMC1hZG1hLmMKQEAgLTY3MCw3ICs2NzAsNiBAQAogCWNvbnN0IHN0cnVjdCB0ZWdyYV9hZG1hX2NoaXBfZGF0YSAqY2RhdGE7CiAJc3RydWN0IHRlZ3JhX2FkbWEgKnRkbWE7CiAJc3RydWN0IHJlc291cmNlCSpyZXM7Ci0Jc3RydWN0IGNsayAqY2xrOwogCWludCByZXQsIGk7CiAKIAljZGF0YSA9IG9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YSgmcGRldi0+ZGV2KTsKQEAgLTY5NywxOCArNjk2LDkgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAiZF9hdWRpbyIpOwotCWlmIChJU19FUlIoY2xrKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJBRE1BIGNsb2NrIG5vdCBmb3VuZFxuIik7Ci0JCXJldCA9IFBUUl9FUlIoY2xrKTsKKwlyZXQgPSBvZl9wbV9jbGtfYWRkX2NsaygmcGRldi0+ZGV2LCAiZF9hdWRpbyIpOworCWlmIChyZXQpCiAJCWdvdG8gY2xrX2Rlc3Ryb3k7Ci0JfQotCi0JcmV0ID0gcG1fY2xrX2FkZF9jbGsoJnBkZXYtPmRldiwgY2xrKTsKLQlpZiAocmV0KSB7Ci0JCWNsa19wdXQoY2xrKTsKLQkJZ290byBjbGtfZGVzdHJveTsKLQl9CiAKIAlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvdGktZG1hLWNyb3NzYmFyLmMgYi9kcml2ZXJzL2RtYS90aS1kbWEtY3Jvc3NiYXIuYwppbmRleCA1YWUyOTRiLi4zZjI0YWViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS90aS1kbWEtY3Jvc3NiYXIuYworKysgYi9kcml2ZXJzL2RtYS90aS1kbWEtY3Jvc3NiYXIuYwpAQCAtMTgsMTUgKzE4LDE5IEBACiAKICNkZWZpbmUgVElfWEJBUl9EUkE3CQkwCiAjZGVmaW5lIFRJX1hCQVJfQU0zMzVYCQkxCitzdGF0aWMgY29uc3QgdTMyIHRpX3hiYXJfdHlwZVtdID0geworCVtUSV9YQkFSX0RSQTddID0gVElfWEJBUl9EUkE3LAorCVtUSV9YQkFSX0FNMzM1WF0gPSBUSV9YQkFSX0FNMzM1WCwKK307CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHRpX2RtYV94YmFyX21hdGNoW10gPSB7CiAJewogCQkuY29tcGF0aWJsZSA9ICJ0aSxkcmE3LWRtYS1jcm9zc2JhciIsCi0JCS5kYXRhID0gKHZvaWQgKilUSV9YQkFSX0RSQTcsCisJCS5kYXRhID0gJnRpX3hiYXJfdHlwZVtUSV9YQkFSX0RSQTddLAogCX0sCiAJewogCQkuY29tcGF0aWJsZSA9ICJ0aSxhbTMzNXgtZWRtYS1jcm9zc2JhciIsCi0JCS5kYXRhID0gKHZvaWQgKilUSV9YQkFSX0FNMzM1WCwKKwkJLmRhdGEgPSAmdGlfeGJhcl90eXBlW1RJX1hCQVJfQU0zMzVYXSwKIAl9LAogCXt9LAogfTsKQEAgLTE5MCw5ICsxOTQsNiBAQAogI2RlZmluZSBUSV9EUkE3X1hCQVJfT1VUUFVUUwkxMjcKICNkZWZpbmUgVElfRFJBN19YQkFSX0lOUFVUUwkyNTYKIAotI2RlZmluZSBUSV9YQkFSX0VETUFfT0ZGU0VUCTAKLSNkZWZpbmUgVElfWEJBUl9TRE1BX09GRlNFVAkxCi0KIHN0cnVjdCB0aV9kcmE3X3hiYXJfZGF0YSB7CiAJdm9pZCBfX2lvbWVtICppb21lbTsKIApAQCAtMjgwLDE4ICsyODEsMjUgQEAKIAlyZXR1cm4gbWFwOwogfQogCisjZGVmaW5lIFRJX1hCQVJfRURNQV9PRkZTRVQJMAorI2RlZmluZSBUSV9YQkFSX1NETUFfT0ZGU0VUCTEKK3N0YXRpYyBjb25zdCB1MzIgdGlfZG1hX29mZnNldFtdID0geworCVtUSV9YQkFSX0VETUFfT0ZGU0VUXSA9IDAsCisJW1RJX1hCQVJfU0RNQV9PRkZTRVRdID0gMSwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHRpX2RyYTdfbWFzdGVyX21hdGNoW10gPSB7CiAJewogCQkuY29tcGF0aWJsZSA9ICJ0aSxvbWFwNDQzMC1zZG1hIiwKLQkJLmRhdGEgPSAodm9pZCAqKVRJX1hCQVJfU0RNQV9PRkZTRVQsCisJCS5kYXRhID0gJnRpX2RtYV9vZmZzZXRbVElfWEJBUl9TRE1BX09GRlNFVF0sCiAJfSwKIAl7CiAJCS5jb21wYXRpYmxlID0gInRpLGVkbWEzIiwKLQkJLmRhdGEgPSAodm9pZCAqKVRJX1hCQVJfRURNQV9PRkZTRVQsCisJCS5kYXRhID0gJnRpX2RtYV9vZmZzZXRbVElfWEJBUl9FRE1BX09GRlNFVF0sCiAJfSwKIAl7CiAJCS5jb21wYXRpYmxlID0gInRpLGVkbWEzLXRwY2MiLAotCQkuZGF0YSA9ICh2b2lkICopVElfWEJBUl9FRE1BX09GRlNFVCwKKwkJLmRhdGEgPSAmdGlfZG1hX29mZnNldFtUSV9YQkFSX0VETUFfT0ZGU0VUXSwKIAl9LAogCXt9LAogfTsKQEAgLTMxMSw3ICszMTksNyBAQAogCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAl1MzIgc2FmZV92YWw7Ci0Jc2l6ZV90IHN6OworCWludCBzejsKIAl2b2lkIF9faW9tZW0gKmlvbWVtOwogCWludCBpLCByZXQ7CiAKQEAgLTM5NSw3ICs0MDMsNyBAQAogCiAJeGJhci0+ZG1hcm91dGVyLmRldiA9ICZwZGV2LT5kZXY7CiAJeGJhci0+ZG1hcm91dGVyLnJvdXRlX2ZyZWUgPSB0aV9kcmE3X3hiYXJfZnJlZTsKLQl4YmFyLT5kbWFfb2Zmc2V0ID0gKHUzMiltYXRjaC0+ZGF0YTsKKwl4YmFyLT5kbWFfb2Zmc2V0ID0gKih1MzIgKiltYXRjaC0+ZGF0YTsKIAogCW11dGV4X2luaXQoJnhiYXItPm11dGV4KTsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB4YmFyKTsKQEAgLTQyOCw3ICs0MzYsNyBAQAogCWlmICh1bmxpa2VseSghbWF0Y2gpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXN3aXRjaCAoKHUzMiltYXRjaC0+ZGF0YSkgeworCXN3aXRjaCAoKih1MzIgKiltYXRjaC0+ZGF0YSkgewogCWNhc2UgVElfWEJBUl9EUkE3OgogCQlyZXQgPSB0aV9kcmE3X3hiYXJfcHJvYmUocGRldik7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvdGltYl9kbWEuYyBiL2RyaXZlcnMvZG1hL3RpbWJfZG1hLmMKaW5kZXggZTgyNzQ1YS4uODk2YmFmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvdGltYl9kbWEuYworKysgYi9kcml2ZXJzL2RtYS90aW1iX2RtYS5jCkBAIC0yMjYsOCArMjI2LDcgQEAKIAogc3RhdGljIHZvaWQgX190ZF9maW5pc2goc3RydWN0IHRpbWJfZG1hX2NoYW4gKnRkX2NoYW4pCiB7Ci0JZG1hX2FzeW5jX3R4X2NhbGxiYWNrCQljYWxsYmFjazsKLQl2b2lkCQkJCSpwYXJhbTsKKwlzdHJ1Y3QgZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2sJY2I7CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yCSp0eGQ7CiAJc3RydWN0IHRpbWJfZG1hX2Rlc2MJCSp0ZF9kZXNjOwogCkBAIC0yNTIsOCArMjUxLDcgQEAKIAlkbWFfY29va2llX2NvbXBsZXRlKHR4ZCk7CiAJdGRfY2hhbi0+b25nb2luZyA9IGZhbHNlOwogCi0JY2FsbGJhY2sgPSB0eGQtPmNhbGxiYWNrOwotCXBhcmFtID0gdHhkLT5jYWxsYmFja19wYXJhbTsKKwlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2sodHhkLCAmY2IpOwogCiAJbGlzdF9tb3ZlKCZ0ZF9kZXNjLT5kZXNjX25vZGUsICZ0ZF9jaGFuLT5mcmVlX2xpc3QpOwogCkBAIC0yNjIsOCArMjYwLDcgQEAKIAkgKiBUaGUgQVBJIHJlcXVpcmVzIHRoYXQgbm8gc3VibWlzc2lvbnMgYXJlIGRvbmUgZnJvbSBhCiAJICogY2FsbGJhY2ssIHNvIHdlIGRvbid0IG5lZWQgdG8gZHJvcCB0aGUgbG9jayBoZXJlCiAJICovCi0JaWYgKGNhbGxiYWNrKQotCQljYWxsYmFjayhwYXJhbSk7CisJZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2tfaW52b2tlKCZjYiwgTlVMTCk7CiB9CiAKIHN0YXRpYyB1MzIgX190ZF9pZXJfbWFzayhzdHJ1Y3QgdGltYl9kbWEgKnRkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvdHh4OWRtYWMuYyBiL2RyaXZlcnMvZG1hL3R4eDlkbWFjLmMKaW5kZXggNzYzMjI5MC4uNGQ4YzdiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvdHh4OWRtYWMuYworKysgYi9kcml2ZXJzL2RtYS90eHg5ZG1hYy5jCkBAIC00MDMsMTYgKzQwMywxNCBAQAogdHh4OWRtYWNfZGVzY3JpcHRvcl9jb21wbGV0ZShzdHJ1Y3QgdHh4OWRtYWNfY2hhbiAqZGMsCiAJCQkgICAgIHN0cnVjdCB0eHg5ZG1hY19kZXNjICpkZXNjKQogewotCWRtYV9hc3luY190eF9jYWxsYmFjayBjYWxsYmFjazsKLQl2b2lkICpwYXJhbTsKKwlzdHJ1Y3QgZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2sgY2I7CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eGQgPSAmZGVzYy0+dHhkOwogCiAJZGV2X3ZkYmcoY2hhbjJkZXYoJmRjLT5jaGFuKSwgImRlc2NyaXB0b3IgJXUgJXAgY29tcGxldGVcbiIsCiAJCSB0eGQtPmNvb2tpZSwgZGVzYyk7CiAKIAlkbWFfY29va2llX2NvbXBsZXRlKHR4ZCk7Ci0JY2FsbGJhY2sgPSB0eGQtPmNhbGxiYWNrOwotCXBhcmFtID0gdHhkLT5jYWxsYmFja19wYXJhbTsKKwlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2sodHhkLCAmY2IpOwogCiAJdHh4OWRtYWNfc3luY19kZXNjX2Zvcl9jcHUoZGMsIGRlc2MpOwogCWxpc3Rfc3BsaWNlX2luaXQoJmRlc2MtPnR4X2xpc3QsICZkYy0+ZnJlZV9saXN0KTsKQEAgLTQyMyw4ICs0MjEsNyBAQAogCSAqIFRoZSBBUEkgcmVxdWlyZXMgdGhhdCBubyBzdWJtaXNzaW9ucyBhcmUgZG9uZSBmcm9tIGEKIAkgKiBjYWxsYmFjaywgc28gd2UgZG9uJ3QgbmVlZCB0byBkcm9wIHRoZSBsb2NrIGhlcmUKIAkgKi8KLQlpZiAoY2FsbGJhY2spCi0JCWNhbGxiYWNrKHBhcmFtKTsKKwlkbWFlbmdpbmVfZGVzY19jYWxsYmFja19pbnZva2UoJmNiLCBOVUxMKTsKIAlkbWFfcnVuX2RlcGVuZGVuY2llcyh0eGQpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS92aXJ0LWRtYS5jIGIvZHJpdmVycy9kbWEvdmlydC1kbWEuYwppbmRleCBhMzVjMjExLi5lNDdmYzliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS92aXJ0LWRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL3ZpcnQtZG1hLmMKQEAgLTg3LDggKzg3LDcgQEAKIHsKIAlzdHJ1Y3QgdmlydF9kbWFfY2hhbiAqdmMgPSAoc3RydWN0IHZpcnRfZG1hX2NoYW4gKilhcmc7CiAJc3RydWN0IHZpcnRfZG1hX2Rlc2MgKnZkOwotCWRtYV9hc3luY190eF9jYWxsYmFjayBjYiA9IE5VTEw7Ci0Jdm9pZCAqY2JfZGF0YSA9IE5VTEw7CisJc3RydWN0IGRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrIGNiOwogCUxJU1RfSEVBRChoZWFkKTsKIAogCXNwaW5fbG9ja19pcnEoJnZjLT5sb2NrKTsKQEAgLTk2LDE4ICs5NSwxNyBAQAogCXZkID0gdmMtPmN5Y2xpYzsKIAlpZiAodmQpIHsKIAkJdmMtPmN5Y2xpYyA9IE5VTEw7Ci0JCWNiID0gdmQtPnR4LmNhbGxiYWNrOwotCQljYl9kYXRhID0gdmQtPnR4LmNhbGxiYWNrX3BhcmFtOworCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2soJnZkLT50eCwgJmNiKTsKKwl9IGVsc2UgeworCQltZW1zZXQoJmNiLCAwLCBzaXplb2YoY2IpKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxKCZ2Yy0+bG9jayk7CiAKLQlpZiAoY2IpCi0JCWNiKGNiX2RhdGEpOworCWRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrX2ludm9rZSgmY2IsIE5VTEwpOwogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZoZWFkKSkgewogCQl2ZCA9IGxpc3RfZmlyc3RfZW50cnkoJmhlYWQsIHN0cnVjdCB2aXJ0X2RtYV9kZXNjLCBub2RlKTsKLQkJY2IgPSB2ZC0+dHguY2FsbGJhY2s7Ci0JCWNiX2RhdGEgPSB2ZC0+dHguY2FsbGJhY2tfcGFyYW07CisJCWRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFjaygmdmQtPnR4LCAmY2IpOwogCiAJCWxpc3RfZGVsKCZ2ZC0+bm9kZSk7CiAJCWlmIChkbWFlbmdpbmVfZGVzY190ZXN0X3JldXNlKCZ2ZC0+dHgpKQpAQCAtMTE1LDggKzExMyw3IEBACiAJCWVsc2UKIAkJCXZjLT5kZXNjX2ZyZWUodmQpOwogCi0JCWlmIChjYikKLQkJCWNiKGNiX2RhdGEpOworCQlkbWFlbmdpbmVfZGVzY19jYWxsYmFja19pbnZva2UoJmNiLCBOVUxMKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3ZpcnQtZG1hLmggYi9kcml2ZXJzL2RtYS92aXJ0LWRtYS5oCmluZGV4IGQ5NzMxY2EuLjNmNzc2YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3ZpcnQtZG1hLmgKKysrIGIvZHJpdmVycy9kbWEvdmlydC1kbWEuaApAQCAtNDUsNiArNDUsOCBAQAogdm9pZCB2Y2hhbl9kbWFfZGVzY19mcmVlX2xpc3Qoc3RydWN0IHZpcnRfZG1hX2NoYW4gKnZjLCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKTsKIHZvaWQgdmNoYW5faW5pdChzdHJ1Y3QgdmlydF9kbWFfY2hhbiAqdmMsIHN0cnVjdCBkbWFfZGV2aWNlICpkbWFkZXYpOwogc3RydWN0IHZpcnRfZG1hX2Rlc2MgKnZjaGFuX2ZpbmRfZGVzYyhzdHJ1Y3QgdmlydF9kbWFfY2hhbiAqLCBkbWFfY29va2llX3QpOworZXh0ZXJuIGRtYV9jb29raWVfdCB2Y2hhbl90eF9zdWJtaXQoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICopOworZXh0ZXJuIGludCB2Y2hhbl90eF9kZXNjX2ZyZWUoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICopOwogCiAvKioKICAqIHZjaGFuX3R4X3ByZXAgLSBwcmVwYXJlIGEgZGVzY3JpcHRvcgpAQCAtNTUsOCArNTcsNiBAQAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnZjaGFuX3R4X3ByZXAoc3RydWN0IHZpcnRfZG1hX2NoYW4gKnZjLAogCXN0cnVjdCB2aXJ0X2RtYV9kZXNjICp2ZCwgdW5zaWduZWQgbG9uZyB0eF9mbGFncykKIHsKLQlleHRlcm4gZG1hX2Nvb2tpZV90IHZjaGFuX3R4X3N1Ym1pdChzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKik7Ci0JZXh0ZXJuIGludCB2Y2hhbl90eF9kZXNjX2ZyZWUoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICopOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlkbWFfYXN5bmNfdHhfZGVzY3JpcHRvcl9pbml0KCZ2ZC0+dHgsICZ2Yy0+Y2hhbik7CkBAIC0xMjMsMTAgKzEyMyw4IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHZpcnRfZG1hX2Rlc2MgKnZjaGFuX25leHRfZGVzYyhzdHJ1Y3QgdmlydF9kbWFfY2hhbiAqdmMpCiB7Ci0JaWYgKGxpc3RfZW1wdHkoJnZjLT5kZXNjX2lzc3VlZCkpCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIGxpc3RfZmlyc3RfZW50cnkoJnZjLT5kZXNjX2lzc3VlZCwgc3RydWN0IHZpcnRfZG1hX2Rlc2MsIG5vZGUpOworCXJldHVybiBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJnZjLT5kZXNjX2lzc3VlZCwKKwkJCQkJc3RydWN0IHZpcnRfZG1hX2Rlc2MsIG5vZGUpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3hnZW5lLWRtYS5jIGIvZHJpdmVycy9kbWEveGdlbmUtZG1hLmMKaW5kZXggOWNiOTNjNS4uOGI2OTNiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEveGdlbmUtZG1hLmMKKysrIGIvZHJpdmVycy9kbWEveGdlbmUtZG1hLmMKQEAgLTYwNiwxMiArNjA2LDEwIEBACiAJCXJldHVybjsKIAogCWRtYV9jb29raWVfY29tcGxldGUodHgpOworCWRtYV9kZXNjcmlwdG9yX3VubWFwKHR4KTsKIAogCS8qIFJ1biB0aGUgbGluayBkZXNjcmlwdG9yIGNhbGxiYWNrIGZ1bmN0aW9uICovCi0JaWYgKHR4LT5jYWxsYmFjaykKLQkJdHgtPmNhbGxiYWNrKHR4LT5jYWxsYmFja19wYXJhbSk7Ci0KLQlkbWFfZGVzY3JpcHRvcl91bm1hcCh0eCk7CisJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrX2ludm9rZSh0eCwgTlVMTCk7CiAKIAkvKiBSdW4gYW55IGRlcGVuZGVuY2llcyAqLwogCWRtYV9ydW5fZGVwZW5kZW5jaWVzKHR4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3hpbGlueC94aWxpbnhfZG1hLmMgYi9kcml2ZXJzL2RtYS94aWxpbngveGlsaW54X2RtYS5jCmluZGV4IDRlMjIzZDAuLjgyODhmZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3hpbGlueC94aWxpbnhfZG1hLmMKKysrIGIvZHJpdmVycy9kbWEveGlsaW54L3hpbGlueF9kbWEuYwpAQCAtNzU1LDggKzc1NSw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW4tPmxvY2ssIGZsYWdzKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXNjLCBuZXh0LCAmY2hhbi0+ZG9uZV9saXN0LCBub2RlKSB7Ci0JCWRtYV9hc3luY190eF9jYWxsYmFjayBjYWxsYmFjazsKLQkJdm9pZCAqY2FsbGJhY2tfcGFyYW07CisJCXN0cnVjdCBkbWFlbmdpbmVfZGVzY19jYWxsYmFjayBjYjsKIAogCQlpZiAoZGVzYy0+Y3ljbGljKSB7CiAJCQl4aWxpbnhfZG1hX2NoYW5faGFuZGxlX2N5Y2xpYyhjaGFuLCBkZXNjLCAmZmxhZ3MpOwpAQCAtNzY3LDExICs3NjYsMTAgQEAKIAkJbGlzdF9kZWwoJmRlc2MtPm5vZGUpOwogCiAJCS8qIFJ1biB0aGUgbGluayBkZXNjcmlwdG9yIGNhbGxiYWNrIGZ1bmN0aW9uICovCi0JCWNhbGxiYWNrID0gZGVzYy0+YXN5bmNfdHguY2FsbGJhY2s7Ci0JCWNhbGxiYWNrX3BhcmFtID0gZGVzYy0+YXN5bmNfdHguY2FsbGJhY2tfcGFyYW07Ci0JCWlmIChjYWxsYmFjaykgeworCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2soJmRlc2MtPmFzeW5jX3R4LCAmY2IpOworCQlpZiAoZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2tfdmFsaWQoJmNiKSkgewogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbi0+bG9jaywgZmxhZ3MpOwotCQkJY2FsbGJhY2soY2FsbGJhY2tfcGFyYW0pOworCQkJZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2tfaW52b2tlKCZjYiwgTlVMTCk7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+bG9jaywgZmxhZ3MpOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9LY29uZmlnIGIvZHJpdmVycy9lZGFjL0tjb25maWcKaW5kZXggZDBjMWRhYi4uODJkODVjY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvZWRhYy9LY29uZmlnCkBAIC0yNTEsNiArMjUxLDE0IEBACiAJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gdGhlIEludGVsCiAJICBTYW5keSBCcmlkZ2UsIEl2eSBCcmlkZ2UgYW5kIEhhc3dlbGwgSW50ZWdyYXRlZCBNZW1vcnkgQ29udHJvbGxlcnMuCiAKK2NvbmZpZyBFREFDX1NLWAorCXRyaXN0YXRlICJJbnRlbCBTa3lsYWtlIHNlcnZlciBJbnRlZ3JhdGVkIE1DIgorCWRlcGVuZHMgb24gRURBQ19NTV9FREFDICYmIFBDSSAmJiBYODZfNjQgJiYgWDg2X01DRV9JTlRFTAorCWRlcGVuZHMgb24gUENJX01NQ09ORklHCisJaGVscAorCSAgU3VwcG9ydCBmb3IgZXJyb3IgZGV0ZWN0aW9uIGFuZCBjb3JyZWN0aW9uIHRoZSBJbnRlbAorCSAgU2t5bGFrZSBzZXJ2ZXIgSW50ZWdyYXRlZCBNZW1vcnkgQ29udHJvbGxlcnMuCisKIGNvbmZpZyBFREFDX01QQzg1WFgKIAl0cmlzdGF0ZSAiRnJlZXNjYWxlIE1QQzgzeHggLyBNUEM4NXh4IgogCWRlcGVuZHMgb24gRURBQ19NTV9FREFDICYmIEZTTF9TT0MKQEAgLTI1OCw2ICsyNjYsMTMgQEAKIAkgIFN1cHBvcnQgZm9yIGVycm9yIGRldGVjdGlvbiBhbmQgY29ycmVjdGlvbiBvbiB0aGUgRnJlZXNjYWxlCiAJICBNUEM4MzQ5LCBNUEM4NTYwLCBNUEM4NTQwLCBNUEM4NTQ4LCBUNDI0MAogCitjb25maWcgRURBQ19MQVlFUlNDQVBFCisJdHJpc3RhdGUgIkZyZWVzY2FsZSBMYXllcnNjYXBlIEREUiIKKwlkZXBlbmRzIG9uIEVEQUNfTU1fRURBQyAmJiBBUkNIX0xBWUVSU0NBUEUKKwloZWxwCisJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gb24gRnJlZXNjYWxlIG1lbW9yeQorCSAgY29udHJvbGxlcnMgb24gTGF5ZXJzY2FwZSBTb0NzLgorCiBjb25maWcgRURBQ19NVjY0WDYwCiAJdHJpc3RhdGUgIk1hcnZlbGwgTVY2NHg2MCIKIAlkZXBlbmRzIG9uIEVEQUNfTU1fRURBQyAmJiBNVjY0WDYwCkBAIC0zOTgsNiArNDEzLDQxIEBACiAJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gb24gdGhlCiAJICBBbHRlcmEgRXRoZXJuZXQgRklGTyBNZW1vcnkgZm9yIEFsdGVyYSBTb0NzLgogCitjb25maWcgRURBQ19BTFRFUkFfTkFORAorCWJvb2wgIkFsdGVyYSBOQU5EIEZJRk8gRUNDIgorCWRlcGVuZHMgb24gRURBQ19BTFRFUkE9eSAmJiBNVERfTkFORF9ERU5BTEkKKwloZWxwCisJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gb24gdGhlCisJICBBbHRlcmEgTkFORCBGSUZPIE1lbW9yeSBmb3IgQWx0ZXJhIFNvQ3MuCisKK2NvbmZpZyBFREFDX0FMVEVSQV9ETUEKKwlib29sICJBbHRlcmEgRE1BIEZJRk8gRUNDIgorCWRlcGVuZHMgb24gRURBQ19BTFRFUkE9eSAmJiBQTDMzMF9ETUE9eQorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIGVycm9yIGRldGVjdGlvbiBhbmQgY29ycmVjdGlvbiBvbiB0aGUKKwkgIEFsdGVyYSBETUEgRklGTyBNZW1vcnkgZm9yIEFsdGVyYSBTb0NzLgorCitjb25maWcgRURBQ19BTFRFUkFfVVNCCisJYm9vbCAiQWx0ZXJhIFVTQiBGSUZPIEVDQyIKKwlkZXBlbmRzIG9uIEVEQUNfQUxURVJBPXkgJiYgVVNCX0RXQzIKKwloZWxwCisJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gb24gdGhlCisJICBBbHRlcmEgVVNCIEZJRk8gTWVtb3J5IGZvciBBbHRlcmEgU29Dcy4KKworY29uZmlnIEVEQUNfQUxURVJBX1FTUEkKKwlib29sICJBbHRlcmEgUVNQSSBGSUZPIEVDQyIKKwlkZXBlbmRzIG9uIEVEQUNfQUxURVJBPXkgJiYgU1BJX0NBREVOQ0VfUVVBRFNQSQorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIGVycm9yIGRldGVjdGlvbiBhbmQgY29ycmVjdGlvbiBvbiB0aGUKKwkgIEFsdGVyYSBRU1BJIEZJRk8gTWVtb3J5IGZvciBBbHRlcmEgU29Dcy4KKworY29uZmlnIEVEQUNfQUxURVJBX1NETU1DCisJYm9vbCAiQWx0ZXJhIFNETU1DIEZJRk8gRUNDIgorCWRlcGVuZHMgb24gRURBQ19BTFRFUkE9eSAmJiBNTUNfRFcKKwloZWxwCisJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gb24gdGhlCisJICBBbHRlcmEgU0RNTUMgRklGTyBNZW1vcnkgZm9yIEFsdGVyYSBTb0NzLgorCiBjb25maWcgRURBQ19TWU5PUFNZUwogCXRyaXN0YXRlICJTeW5vcHN5cyBERFIgTWVtb3J5IENvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBFREFDX01NX0VEQUMgJiYgQVJDSF9aWU5RCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvTWFrZWZpbGUgYi9kcml2ZXJzL2VkYWMvTWFrZWZpbGUKaW5kZXggZjllNGEzZS4uODhlNDcyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZWRhYy9NYWtlZmlsZQpAQCAtMzEsNiArMzEsNyBAQAogb2JqLSQoQ09ORklHX0VEQUNfSTczMDApCQkrPSBpNzMwMF9lZGFjLm8KIG9iai0kKENPTkZJR19FREFDX0k3Q09SRSkJCSs9IGk3Y29yZV9lZGFjLm8KIG9iai0kKENPTkZJR19FREFDX1NCUklER0UpCQkrPSBzYl9lZGFjLm8KK29iai0kKENPTkZJR19FREFDX1NLWCkJCQkrPSBza3hfZWRhYy5vCiBvYmotJChDT05GSUdfRURBQ19FN1hYWCkJCSs9IGU3eHh4X2VkYWMubwogb2JqLSQoQ09ORklHX0VEQUNfRTc1MlgpCQkrPSBlNzUyeF9lZGFjLm8KIG9iai0kKENPTkZJR19FREFDX0k4MjQ0M0JYR1gpCQkrPSBpODI0NDNieGd4X2VkYWMubwpAQCAtNTAsNyArNTEsMTMgQEAKIG9iai0kKENPTkZJR19FREFDX0FNRDY0KQkJKz0gYW1kNjRfZWRhY19tb2QubwogCiBvYmotJChDT05GSUdfRURBQ19QQVNFTUkpCQkrPSBwYXNlbWlfZWRhYy5vCi1vYmotJChDT05GSUdfRURBQ19NUEM4NVhYKQkJKz0gbXBjODV4eF9lZGFjLm8KKworbXBjODV4eF9lZGFjX21vZC15CQkJOj0gZnNsX2Rkcl9lZGFjLm8gbXBjODV4eF9lZGFjLm8KK29iai0kKENPTkZJR19FREFDX01QQzg1WFgpCQkrPSBtcGM4NXh4X2VkYWNfbW9kLm8KKworbGF5ZXJzY2FwZV9lZGFjX21vZC15CQkJOj0gZnNsX2Rkcl9lZGFjLm8gbGF5ZXJzY2FwZV9lZGFjLm8KK29iai0kKENPTkZJR19FREFDX0xBWUVSU0NBUEUpCQkrPSBsYXllcnNjYXBlX2VkYWNfbW9kLm8KKwogb2JqLSQoQ09ORklHX0VEQUNfTVY2NFg2MCkJCSs9IG12NjR4NjBfZWRhYy5vCiBvYmotJChDT05GSUdfRURBQ19DRUxMKQkJCSs9IGNlbGxfZWRhYy5vCiBvYmotJChDT05GSUdfRURBQ19QUEM0WFgpCQkrPSBwcGM0eHhfZWRhYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvYWx0ZXJhX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9hbHRlcmFfZWRhYy5jCmluZGV4IDIzOThkMDcuLjU4ZDNlMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9hbHRlcmFfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9hbHRlcmFfZWRhYy5jCkBAIC0yMDMsNyArMjAzLDcgQEAKIAlpZiAoIW1jaS0+ZGVidWdmcykKIAkJcmV0dXJuOwogCi0JZWRhY19kZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJpbmplY3RfY3RybCIsIFNfSVdVU1IsIG1jaS0+ZGVidWdmcywgbWNpLAorCWVkYWNfZGVidWdmc19jcmVhdGVfZmlsZSgiYWx0cl90cmlnZ2VyIiwgU19JV1VTUiwgbWNpLT5kZWJ1Z2ZzLCBtY2ksCiAJCQkJICZhbHRyX3Nkcl9tY19kZWJ1Z19pbmplY3RfZm9wcyk7CiB9CiAKQEAgLTY4MCw3ICs2ODAsNyBAQAogCWlmICghZHJ2ZGF0YS0+ZGVidWdmc19kaXIpCiAJCXJldHVybjsKIAotCWlmICghZWRhY19kZWJ1Z2ZzX2NyZWF0ZV9maWxlKHByaXYtPmRiZ2ZzX25hbWUsIFNfSVdVU1IsCisJaWYgKCFlZGFjX2RlYnVnZnNfY3JlYXRlX2ZpbGUoImFsdHJfdHJpZ2dlciIsIFNfSVdVU1IsCiAJCQkJICAgICAgZHJ2ZGF0YS0+ZGVidWdmc19kaXIsIGVkYWNfZGNpLAogCQkJCSAgICAgIHByaXYtPmluamVjdF9mb3BzKSkKIAkJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGRydmRhdGEtPmRlYnVnZnNfZGlyKTsKQEAgLTExMDgsNyArMTEwOCw2IEBACiAJLnNldHVwID0gYWx0cl9jaGVja19lY2NfZGVwcywKIAkuY2VfY2xlYXJfbWFzayA9IChBTFRSX09DUl9FQ0NfRU4gfCBBTFRSX09DUl9FQ0NfU0VSUiksCiAJLnVlX2NsZWFyX21hc2sgPSAoQUxUUl9PQ1JfRUNDX0VOIHwgQUxUUl9PQ1JfRUNDX0RFUlIpLAotCS5kYmdmc19uYW1lID0gImFsdHJfb2NyYW1fdHJpZ2dlciIsCiAJLmFsbG9jX21lbSA9IG9jcmFtX2FsbG9jX21lbSwKIAkuZnJlZV9tZW0gPSBvY3JhbV9mcmVlX21lbSwKIAkuZWNjX2VuYWJsZV9tYXNrID0gQUxUUl9PQ1JfRUNDX0VOLApAQCAtMTEyNSw3ICsxMTI0LDYgQEAKIAkuY2VfY2xlYXJfbWFzayA9IEFMVFJfQTEwX0VDQ19TRVJSUEVOQSwKIAkudWVfY2xlYXJfbWFzayA9IEFMVFJfQTEwX0VDQ19ERVJSUEVOQSwKIAkuaXJxX3N0YXR1c19tYXNrID0gQTEwX1NZU01HUl9FQ0NfSU5UU1RBVF9PQ1JBTSwKLQkuZGJnZnNfbmFtZSA9ICJhbHRyX29jcmFtX3RyaWdnZXIiLAogCS5lY2NfZW5hYmxlX21hc2sgPSBBTFRSX0ExMF9PQ1JBTV9FQ0NfRU5fQ1RMLAogCS5lY2NfZW5fb2ZzdCA9IEFMVFJfQTEwX0VDQ19DVFJMX09GU1QsCiAJLmNlX3NldF9tYXNrID0gQUxUUl9BMTBfRUNDX1RTRVJSQSwKQEAgLTEyMjgsNyArMTIyNiw2IEBACiAJLnNldHVwID0gYWx0cl9sMl9jaGVja19kZXBzLAogCS5jZV9jbGVhcl9tYXNrID0gMCwKIAkudWVfY2xlYXJfbWFzayA9IDAsCi0JLmRiZ2ZzX25hbWUgPSAiYWx0cl9sMl90cmlnZ2VyIiwKIAkuYWxsb2NfbWVtID0gbDJfYWxsb2NfbWVtLAogCS5mcmVlX21lbSA9IGwyX2ZyZWVfbWVtLAogCS5lY2NfZW5hYmxlX21hc2sgPSBBTFRSX0wyX0VDQ19FTiwKQEAgLTEyNDQsNyArMTI0MSw2IEBACiAJLmNlX2NsZWFyX21hc2sgPSBBTFRSX0ExMF9MMl9FQ0NfU0VSUl9DTFIsCiAJLnVlX2NsZWFyX21hc2sgPSBBTFRSX0ExMF9MMl9FQ0NfTUVSUl9DTFIsCiAJLmlycV9zdGF0dXNfbWFzayA9IEExMF9TWVNNR1JfRUNDX0lOVFNUQVRfTDIsCi0JLmRiZ2ZzX25hbWUgPSAiYWx0cl9sMl90cmlnZ2VyIiwKIAkuYWxsb2NfbWVtID0gbDJfYWxsb2NfbWVtLAogCS5mcmVlX21lbSA9IGwyX2ZyZWVfbWVtLAogCS5lY2NfZW5hYmxlX21hc2sgPSBBTFRSX0ExMF9MMl9FQ0NfRU5fQ1RMLApAQCAtMTI2Niw3ICsxMjYyLDYgQEAKIAkuc2V0dXAgPSBhbHRyX2NoZWNrX2VjY19kZXBzLAogCS5jZV9jbGVhcl9tYXNrID0gQUxUUl9BMTBfRUNDX1NFUlJQRU5BLAogCS51ZV9jbGVhcl9tYXNrID0gQUxUUl9BMTBfRUNDX0RFUlJQRU5BLAotCS5kYmdmc19uYW1lID0gImFsdHJfdHJpZ2dlciIsCiAJLmVjY19lbmFibGVfbWFzayA9IEFMVFJfQTEwX0NPTU1PTl9FQ0NfRU5fQ1RMLAogCS5lY2NfZW5fb2ZzdCA9IEFMVFJfQTEwX0VDQ19DVFJMX09GU1QsCiAJLmNlX3NldF9tYXNrID0gQUxUUl9BMTBfRUNDX1RTRVJSQSwKQEAgLTEyODUsNiArMTI4MCwyOTIgQEAKIAogI2VuZGlmCS8qIENPTkZJR19FREFDX0FMVEVSQV9FVEhFUk5FVCAqLwogCisvKioqKioqKioqKioqKioqKioqKioqKiBOQU5EIERldmljZSBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIENPTkZJR19FREFDX0FMVEVSQV9OQU5ECisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWRhY19kZXZpY2VfcHJ2X2RhdGEgYTEwX25hbmRlY2NfZGF0YSA9IHsKKwkuc2V0dXAgPSBhbHRyX2NoZWNrX2VjY19kZXBzLAorCS5jZV9jbGVhcl9tYXNrID0gQUxUUl9BMTBfRUNDX1NFUlJQRU5BLAorCS51ZV9jbGVhcl9tYXNrID0gQUxUUl9BMTBfRUNDX0RFUlJQRU5BLAorCS5lY2NfZW5hYmxlX21hc2sgPSBBTFRSX0ExMF9DT01NT05fRUNDX0VOX0NUTCwKKwkuZWNjX2VuX29mc3QgPSBBTFRSX0ExMF9FQ0NfQ1RSTF9PRlNULAorCS5jZV9zZXRfbWFzayA9IEFMVFJfQTEwX0VDQ19UU0VSUkEsCisJLnVlX3NldF9tYXNrID0gQUxUUl9BMTBfRUNDX1RERVJSQSwKKwkuc2V0X2Vycl9vZnN0ID0gQUxUUl9BMTBfRUNDX0lOVFRFU1RfT0ZTVCwKKwkuZWNjX2lycV9oYW5kbGVyID0gYWx0cl9lZGFjX2ExMF9lY2NfaXJxLAorCS5pbmplY3RfZm9wcyA9ICZhbHRyX2VkYWNfYTEwX2RldmljZV9pbmplY3RfZm9wcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNvY2ZwZ2FfaW5pdF9uYW5kX2VjYyh2b2lkKQoreworCXJldHVybiBhbHRyX2luaXRfYTEwX2VjY19kZXZpY2VfdHlwZSgiYWx0cixzb2NmcGdhLW5hbmQtZWNjIik7Cit9CisKK2Vhcmx5X2luaXRjYWxsKHNvY2ZwZ2FfaW5pdF9uYW5kX2VjYyk7CisKKyNlbmRpZgkvKiBDT05GSUdfRURBQ19BTFRFUkFfTkFORCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKiBETUEgRGV2aWNlIEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgQ09ORklHX0VEQUNfQUxURVJBX0RNQQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGVkYWNfZGV2aWNlX3Bydl9kYXRhIGExMF9kbWFlY2NfZGF0YSA9IHsKKwkuc2V0dXAgPSBhbHRyX2NoZWNrX2VjY19kZXBzLAorCS5jZV9jbGVhcl9tYXNrID0gQUxUUl9BMTBfRUNDX1NFUlJQRU5BLAorCS51ZV9jbGVhcl9tYXNrID0gQUxUUl9BMTBfRUNDX0RFUlJQRU5BLAorCS5lY2NfZW5hYmxlX21hc2sgPSBBTFRSX0ExMF9DT01NT05fRUNDX0VOX0NUTCwKKwkuZWNjX2VuX29mc3QgPSBBTFRSX0ExMF9FQ0NfQ1RSTF9PRlNULAorCS5jZV9zZXRfbWFzayA9IEFMVFJfQTEwX0VDQ19UU0VSUkEsCisJLnVlX3NldF9tYXNrID0gQUxUUl9BMTBfRUNDX1RERVJSQSwKKwkuc2V0X2Vycl9vZnN0ID0gQUxUUl9BMTBfRUNDX0lOVFRFU1RfT0ZTVCwKKwkuZWNjX2lycV9oYW5kbGVyID0gYWx0cl9lZGFjX2ExMF9lY2NfaXJxLAorCS5pbmplY3RfZm9wcyA9ICZhbHRyX2VkYWNfYTEwX2RldmljZV9pbmplY3RfZm9wcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNvY2ZwZ2FfaW5pdF9kbWFfZWNjKHZvaWQpCit7CisJcmV0dXJuIGFsdHJfaW5pdF9hMTBfZWNjX2RldmljZV90eXBlKCJhbHRyLHNvY2ZwZ2EtZG1hLWVjYyIpOworfQorCitlYXJseV9pbml0Y2FsbChzb2NmcGdhX2luaXRfZG1hX2VjYyk7CisKKyNlbmRpZgkvKiBDT05GSUdfRURBQ19BTFRFUkFfRE1BICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqIFVTQiBEZXZpY2UgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBDT05GSUdfRURBQ19BTFRFUkFfVVNCCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWRhY19kZXZpY2VfcHJ2X2RhdGEgYTEwX3VzYmVjY19kYXRhID0geworCS5zZXR1cCA9IGFsdHJfY2hlY2tfZWNjX2RlcHMsCisJLmNlX2NsZWFyX21hc2sgPSBBTFRSX0ExMF9FQ0NfU0VSUlBFTkEsCisJLnVlX2NsZWFyX21hc2sgPSBBTFRSX0ExMF9FQ0NfREVSUlBFTkEsCisJLmVjY19lbmFibGVfbWFzayA9IEFMVFJfQTEwX0NPTU1PTl9FQ0NfRU5fQ1RMLAorCS5lY2NfZW5fb2ZzdCA9IEFMVFJfQTEwX0VDQ19DVFJMX09GU1QsCisJLmNlX3NldF9tYXNrID0gQUxUUl9BMTBfRUNDX1RTRVJSQSwKKwkudWVfc2V0X21hc2sgPSBBTFRSX0ExMF9FQ0NfVERFUlJBLAorCS5zZXRfZXJyX29mc3QgPSBBTFRSX0ExMF9FQ0NfSU5UVEVTVF9PRlNULAorCS5lY2NfaXJxX2hhbmRsZXIgPSBhbHRyX2VkYWNfYTEwX2VjY19pcnEsCisJLmluamVjdF9mb3BzID0gJmFsdHJfZWRhY19hMTBfZGV2aWNlX2luamVjdF9mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc29jZnBnYV9pbml0X3VzYl9lY2Modm9pZCkKK3sKKwlyZXR1cm4gYWx0cl9pbml0X2ExMF9lY2NfZGV2aWNlX3R5cGUoImFsdHIsc29jZnBnYS11c2ItZWNjIik7Cit9CisKK2Vhcmx5X2luaXRjYWxsKHNvY2ZwZ2FfaW5pdF91c2JfZWNjKTsKKworI2VuZGlmCS8qIENPTkZJR19FREFDX0FMVEVSQV9VU0IgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKiogUVNQSSBEZXZpY2UgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBDT05GSUdfRURBQ19BTFRFUkFfUVNQSQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGVkYWNfZGV2aWNlX3Bydl9kYXRhIGExMF9xc3BpZWNjX2RhdGEgPSB7CisJLnNldHVwID0gYWx0cl9jaGVja19lY2NfZGVwcywKKwkuY2VfY2xlYXJfbWFzayA9IEFMVFJfQTEwX0VDQ19TRVJSUEVOQSwKKwkudWVfY2xlYXJfbWFzayA9IEFMVFJfQTEwX0VDQ19ERVJSUEVOQSwKKwkuZWNjX2VuYWJsZV9tYXNrID0gQUxUUl9BMTBfQ09NTU9OX0VDQ19FTl9DVEwsCisJLmVjY19lbl9vZnN0ID0gQUxUUl9BMTBfRUNDX0NUUkxfT0ZTVCwKKwkuY2Vfc2V0X21hc2sgPSBBTFRSX0ExMF9FQ0NfVFNFUlJBLAorCS51ZV9zZXRfbWFzayA9IEFMVFJfQTEwX0VDQ19UREVSUkEsCisJLnNldF9lcnJfb2ZzdCA9IEFMVFJfQTEwX0VDQ19JTlRURVNUX09GU1QsCisJLmVjY19pcnFfaGFuZGxlciA9IGFsdHJfZWRhY19hMTBfZWNjX2lycSwKKwkuaW5qZWN0X2ZvcHMgPSAmYWx0cl9lZGFjX2ExMF9kZXZpY2VfaW5qZWN0X2ZvcHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzb2NmcGdhX2luaXRfcXNwaV9lY2Modm9pZCkKK3sKKwlyZXR1cm4gYWx0cl9pbml0X2ExMF9lY2NfZGV2aWNlX3R5cGUoImFsdHIsc29jZnBnYS1xc3BpLWVjYyIpOworfQorCitlYXJseV9pbml0Y2FsbChzb2NmcGdhX2luaXRfcXNwaV9lY2MpOworCisjZW5kaWYJLyogQ09ORklHX0VEQUNfQUxURVJBX1FTUEkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKiBTRE1NQyBEZXZpY2UgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBDT05GSUdfRURBQ19BTFRFUkFfU0RNTUMKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlZGFjX2RldmljZV9wcnZfZGF0YSBhMTBfc2RtbWNlY2NiX2RhdGE7CitzdGF0aWMgaW50IGFsdHJfcG9ydGJfc2V0dXAoc3RydWN0IGFsdHJfZWRhY19kZXZpY2VfZGV2ICpkZXZpY2UpCit7CisJc3RydWN0IGVkYWNfZGV2aWNlX2N0bF9pbmZvICpkY2k7CisJc3RydWN0IGFsdHJfZWRhY19kZXZpY2VfZGV2ICphbHRkZXY7CisJY2hhciAqZWNjX25hbWUgPSAic2RtbWNiLWVjYyI7CisJaW50IGVkYWNfaWR4LCByYzsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCWNvbnN0IHN0cnVjdCBlZGFjX2RldmljZV9wcnZfZGF0YSAqcHJ2ID0gJmExMF9zZG1tY2VjY2JfZGF0YTsKKworCXJjID0gYWx0cl9jaGVja19lY2NfZGVwcyhkZXZpY2UpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiYWx0cixzb2NmcGdhLXNkbW1jLWVjYyIpOworCWlmICghbnApIHsKKwkJZWRhY19wcmludGsoS0VSTl9XQVJOSU5HLCBFREFDX0RFVklDRSwgIlNETU1DIG5vZGUgbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogQ3JlYXRlIHRoZSBQb3J0QiBFREFDIGRldmljZSAqLworCWVkYWNfaWR4ID0gZWRhY19kZXZpY2VfYWxsb2NfaW5kZXgoKTsKKwlkY2kgPSBlZGFjX2RldmljZV9hbGxvY19jdGxfaW5mbyhzaXplb2YoKmFsdGRldiksIGVjY19uYW1lLCAxLAorCQkJCQkgZWNjX25hbWUsIDEsIDAsIE5VTEwsIDAsIGVkYWNfaWR4KTsKKwlpZiAoIWRjaSkgeworCQllZGFjX3ByaW50ayhLRVJOX0VSUiwgRURBQ19ERVZJQ0UsCisJCQkgICAgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgUG9ydEIgRURBQyBkZXZpY2VcbiIsCisJCQkgICAgZWNjX25hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSBQb3J0QiBFREFDIGRldmljZSBzdHJ1Y3R1cmUgZnJvbSBQb3J0QSBzdHJ1Y3R1cmUgKi8KKwlhbHRkZXYgPSBkY2ktPnB2dF9pbmZvOworCSphbHRkZXYgPSAqZGV2aWNlOworCisJaWYgKCFkZXZyZXNfb3Blbl9ncm91cCgmYWx0ZGV2LT5kZGV2LCBhbHRyX3BvcnRiX3NldHVwLCBHRlBfS0VSTkVMKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBVcGRhdGUgUG9ydEIgc3BlY2lmaWMgdmFsdWVzICovCisJYWx0ZGV2LT5lZGFjX2Rldl9uYW1lID0gZWNjX25hbWU7CisJYWx0ZGV2LT5lZGFjX2lkeCA9IGVkYWNfaWR4OworCWFsdGRldi0+ZWRhY19kZXYgPSBkY2k7CisJYWx0ZGV2LT5kYXRhID0gcHJ2OworCWRjaS0+ZGV2ID0gJmFsdGRldi0+ZGRldjsKKwlkY2ktPmN0bF9uYW1lID0gIkFsdGVyYSBFQ0MgTWFuYWdlciI7CisJZGNpLT5tb2RfbmFtZSA9IGVjY19uYW1lOworCWRjaS0+ZGV2X25hbWUgPSBlY2NfbmFtZTsKKworCS8qIFVwZGF0ZSB0aGUgSVJRcyBmb3IgUG9ydEIgKi8KKwlhbHRkZXYtPnNiX2lycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAyKTsKKwlpZiAoIWFsdGRldi0+c2JfaXJxKSB7CisJCWVkYWNfcHJpbnRrKEtFUk5fRVJSLCBFREFDX0RFVklDRSwgIkVycm9yIFBvcnRCIFNCSVJRIGFsbG9jXG4iKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGVycl9yZWxlYXNlX2dyb3VwXzE7CisJfQorCXJjID0gZGV2bV9yZXF1ZXN0X2lycSgmYWx0ZGV2LT5kZGV2LCBhbHRkZXYtPnNiX2lycSwKKwkJCSAgICAgIHBydi0+ZWNjX2lycV9oYW5kbGVyLAorCQkJICAgICAgSVJRRl9PTkVTSE9UIHwgSVJRRl9UUklHR0VSX0hJR0gsCisJCQkgICAgICBlY2NfbmFtZSwgYWx0ZGV2KTsKKwlpZiAocmMpIHsKKwkJZWRhY19wcmludGsoS0VSTl9FUlIsIEVEQUNfREVWSUNFLCAiUG9ydEIgU0JFUlIgSVJRIGVycm9yXG4iKTsKKwkJZ290byBlcnJfcmVsZWFzZV9ncm91cF8xOworCX0KKworCWFsdGRldi0+ZGJfaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDMpOworCWlmICghYWx0ZGV2LT5kYl9pcnEpIHsKKwkJZWRhY19wcmludGsoS0VSTl9FUlIsIEVEQUNfREVWSUNFLCAiRXJyb3IgUG9ydEIgREJJUlEgYWxsb2NcbiIpOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3JlbGVhc2VfZ3JvdXBfMTsKKwl9CisJcmMgPSBkZXZtX3JlcXVlc3RfaXJxKCZhbHRkZXYtPmRkZXYsIGFsdGRldi0+ZGJfaXJxLAorCQkJICAgICAgcHJ2LT5lY2NfaXJxX2hhbmRsZXIsCisJCQkgICAgICBJUlFGX09ORVNIT1QgfCBJUlFGX1RSSUdHRVJfSElHSCwKKwkJCSAgICAgIGVjY19uYW1lLCBhbHRkZXYpOworCWlmIChyYykgeworCQllZGFjX3ByaW50ayhLRVJOX0VSUiwgRURBQ19ERVZJQ0UsICJQb3J0QiBEQkVSUiBJUlEgZXJyb3JcbiIpOworCQlnb3RvIGVycl9yZWxlYXNlX2dyb3VwXzE7CisJfQorCisJcmMgPSBlZGFjX2RldmljZV9hZGRfZGV2aWNlKGRjaSk7CisJaWYgKHJjKSB7CisJCWVkYWNfcHJpbnRrKEtFUk5fRVJSLCBFREFDX0RFVklDRSwKKwkJCSAgICAiZWRhY19kZXZpY2VfYWRkX2RldmljZSBwb3J0QiBmYWlsZWRcbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3JlbGVhc2VfZ3JvdXBfMTsKKwl9CisJYWx0cl9jcmVhdGVfZWRhY2Rldl9kYmdmcyhkY2ksIHBydik7CisKKwlsaXN0X2FkZCgmYWx0ZGV2LT5uZXh0LCAmYWx0ZGV2LT5lZGFjLT5hMTBfZWNjX2RldmljZXMpOworCisJZGV2cmVzX3JlbW92ZV9ncm91cCgmYWx0ZGV2LT5kZGV2LCBhbHRyX3BvcnRiX3NldHVwKTsKKworCXJldHVybiAwOworCitlcnJfcmVsZWFzZV9ncm91cF8xOgorCWVkYWNfZGV2aWNlX2ZyZWVfY3RsX2luZm8oZGNpKTsKKwlkZXZyZXNfcmVsZWFzZV9ncm91cCgmYWx0ZGV2LT5kZGV2LCBhbHRyX3BvcnRiX3NldHVwKTsKKwllZGFjX3ByaW50ayhLRVJOX0VSUiwgRURBQ19ERVZJQ0UsCisJCSAgICAiJXM6RXJyb3Igc2V0dGluZyB1cCBFREFDIGRldmljZTogJWRcbiIsIGVjY19uYW1lLCByYyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYWx0cl9lZGFjX2ExMF9lY2NfaXJxX3BvcnRiKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgYWx0cl9lZGFjX2RldmljZV9kZXYgKmFkID0gZGV2X2lkOworCXZvaWQgX19pb21lbSAgKmJhc2UgPSBhZC0+YmFzZTsKKwljb25zdCBzdHJ1Y3QgZWRhY19kZXZpY2VfcHJ2X2RhdGEgKnByaXYgPSBhZC0+ZGF0YTsKKworCWlmIChpcnEgPT0gYWQtPnNiX2lycSkgeworCQl3cml0ZWwocHJpdi0+Y2VfY2xlYXJfbWFzaywKKwkJICAgICAgIGJhc2UgKyBBTFRSX0ExMF9FQ0NfSU5UU1RBVF9PRlNUKTsKKwkJZWRhY19kZXZpY2VfaGFuZGxlX2NlKGFkLT5lZGFjX2RldiwgMCwgMCwgYWQtPmVkYWNfZGV2X25hbWUpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfSBlbHNlIGlmIChpcnEgPT0gYWQtPmRiX2lycSkgeworCQl3cml0ZWwocHJpdi0+dWVfY2xlYXJfbWFzaywKKwkJICAgICAgIGJhc2UgKyBBTFRSX0ExMF9FQ0NfSU5UU1RBVF9PRlNUKTsKKwkJZWRhY19kZXZpY2VfaGFuZGxlX3VlKGFkLT5lZGFjX2RldiwgMCwgMCwgYWQtPmVkYWNfZGV2X25hbWUpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJV0FSTl9PTkNFKDEsICJVbmhhbmRsZWQgSVJRJWQgb24gUG9ydCBCLiIsIGlycSk7CisKKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWRhY19kZXZpY2VfcHJ2X2RhdGEgYTEwX3NkbW1jZWNjYV9kYXRhID0geworCS5zZXR1cCA9IGFsdHJfcG9ydGJfc2V0dXAsCisJLmNlX2NsZWFyX21hc2sgPSBBTFRSX0ExMF9FQ0NfU0VSUlBFTkEsCisJLnVlX2NsZWFyX21hc2sgPSBBTFRSX0ExMF9FQ0NfREVSUlBFTkEsCisJLmVjY19lbmFibGVfbWFzayA9IEFMVFJfQTEwX0NPTU1PTl9FQ0NfRU5fQ1RMLAorCS5lY2NfZW5fb2ZzdCA9IEFMVFJfQTEwX0VDQ19DVFJMX09GU1QsCisJLmNlX3NldF9tYXNrID0gQUxUUl9BMTBfRUNDX1NFUlJQRU5BLAorCS51ZV9zZXRfbWFzayA9IEFMVFJfQTEwX0VDQ19ERVJSUEVOQSwKKwkuc2V0X2Vycl9vZnN0ID0gQUxUUl9BMTBfRUNDX0lOVFRFU1RfT0ZTVCwKKwkuZWNjX2lycV9oYW5kbGVyID0gYWx0cl9lZGFjX2ExMF9lY2NfaXJxLAorCS5pbmplY3RfZm9wcyA9ICZhbHRyX2VkYWNfYTEwX2RldmljZV9pbmplY3RfZm9wcywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWRhY19kZXZpY2VfcHJ2X2RhdGEgYTEwX3NkbW1jZWNjYl9kYXRhID0geworCS5zZXR1cCA9IGFsdHJfcG9ydGJfc2V0dXAsCisJLmNlX2NsZWFyX21hc2sgPSBBTFRSX0ExMF9FQ0NfU0VSUlBFTkIsCisJLnVlX2NsZWFyX21hc2sgPSBBTFRSX0ExMF9FQ0NfREVSUlBFTkIsCisJLmVjY19lbmFibGVfbWFzayA9IEFMVFJfQTEwX0NPTU1PTl9FQ0NfRU5fQ1RMLAorCS5lY2NfZW5fb2ZzdCA9IEFMVFJfQTEwX0VDQ19DVFJMX09GU1QsCisJLmNlX3NldF9tYXNrID0gQUxUUl9BMTBfRUNDX1RTRVJSQiwKKwkudWVfc2V0X21hc2sgPSBBTFRSX0ExMF9FQ0NfVERFUlJCLAorCS5zZXRfZXJyX29mc3QgPSBBTFRSX0ExMF9FQ0NfSU5UVEVTVF9PRlNULAorCS5lY2NfaXJxX2hhbmRsZXIgPSBhbHRyX2VkYWNfYTEwX2VjY19pcnFfcG9ydGIsCisJLmluamVjdF9mb3BzID0gJmFsdHJfZWRhY19hMTBfZGV2aWNlX2luamVjdF9mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc29jZnBnYV9pbml0X3NkbW1jX2VjYyh2b2lkKQoreworCWludCByYyA9IC1FTk9ERVY7CisJc3RydWN0IGRldmljZV9ub2RlICpjaGlsZCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsCisJCQkJCQkiYWx0cixzb2NmcGdhLXNkbW1jLWVjYyIpOworCWlmICghY2hpbGQpIHsKKwkJZWRhY19wcmludGsoS0VSTl9XQVJOSU5HLCBFREFDX0RFVklDRSwgIlNETU1DIG5vZGUgbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCFvZl9kZXZpY2VfaXNfYXZhaWxhYmxlKGNoaWxkKSkKKwkJZ290byBleGl0OworCisJaWYgKHZhbGlkYXRlX3BhcmVudF9hdmFpbGFibGUoY2hpbGQpKQorCQlnb3RvIGV4aXQ7CisKKwlyYyA9IGFsdHJfaW5pdF9hMTBfZWNjX2Jsb2NrKGNoaWxkLCBBTFRSX0ExMF9TRE1NQ19JUlFfTUFTSywKKwkJCQkgICAgIGExMF9zZG1tY2VjY2FfZGF0YS5lY2NfZW5hYmxlX21hc2ssIDEpOworZXhpdDoKKwlvZl9ub2RlX3B1dChjaGlsZCk7CisJcmV0dXJuIHJjOworfQorCitlYXJseV9pbml0Y2FsbChzb2NmcGdhX2luaXRfc2RtbWNfZWNjKTsKKworI2VuZGlmCS8qIENPTkZJR19FREFDX0FMVEVSQV9TRE1NQyAqLworCiAvKioqKioqKioqKioqKioqKioqKioqIEFycmlhMTAgRURBQyBEZXZpY2UgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhbHRyX2VkYWNfYTEwX2RldmljZV9vZl9tYXRjaFtdID0gewogI2lmZGVmIENPTkZJR19FREFDX0FMVEVSQV9MMkMKQEAgLTEyOTgsNiArMTU3OSwyMSBAQAogCXsgLmNvbXBhdGlibGUgPSAiYWx0cixzb2NmcGdhLWV0aC1tYWMtZWNjIiwKIAkgIC5kYXRhID0gJmExMF9lbmV0ZWNjX2RhdGEgfSwKICNlbmRpZgorI2lmZGVmIENPTkZJR19FREFDX0FMVEVSQV9OQU5ECisJeyAuY29tcGF0aWJsZSA9ICJhbHRyLHNvY2ZwZ2EtbmFuZC1lY2MiLCAuZGF0YSA9ICZhMTBfbmFuZGVjY19kYXRhIH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRURBQ19BTFRFUkFfRE1BCisJeyAuY29tcGF0aWJsZSA9ICJhbHRyLHNvY2ZwZ2EtZG1hLWVjYyIsIC5kYXRhID0gJmExMF9kbWFlY2NfZGF0YSB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0VEQUNfQUxURVJBX1VTQgorCXsgLmNvbXBhdGlibGUgPSAiYWx0cixzb2NmcGdhLXVzYi1lY2MiLCAuZGF0YSA9ICZhMTBfdXNiZWNjX2RhdGEgfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FREFDX0FMVEVSQV9RU1BJCisJeyAuY29tcGF0aWJsZSA9ICJhbHRyLHNvY2ZwZ2EtcXNwaS1lY2MiLCAuZGF0YSA9ICZhMTBfcXNwaWVjY19kYXRhIH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRURBQ19BTFRFUkFfU0RNTUMKKwl7IC5jb21wYXRpYmxlID0gImFsdHIsc29jZnBnYS1zZG1tYy1lY2MiLCAuZGF0YSA9ICZhMTBfc2RtbWNlY2NhX2RhdGEgfSwKKyNlbmRpZgogCXt9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGFsdHJfZWRhY19hMTBfZGV2aWNlX29mX21hdGNoKTsKQEAgLTE0NTEsMTEgKzE3NDcsMTEgQEAKIAkJcmMgPSAtRU5PREVWOwogCQlnb3RvIGVycl9yZWxlYXNlX2dyb3VwMTsKIAl9Ci0JcmMgPSBkZXZtX3JlcXVlc3RfaXJxKGVkYWMtPmRldiwgYWx0ZGV2LT5zYl9pcnEsCi0JCQkgICAgICBwcnYtPmVjY19pcnFfaGFuZGxlciwKLQkJCSAgICAgIElSUUZfU0hBUkVELCBlY2NfbmFtZSwgYWx0ZGV2KTsKKwlyYyA9IGRldm1fcmVxdWVzdF9pcnEoZWRhYy0+ZGV2LCBhbHRkZXYtPnNiX2lycSwgcHJ2LT5lY2NfaXJxX2hhbmRsZXIsCisJCQkgICAgICBJUlFGX09ORVNIT1QgfCBJUlFGX1RSSUdHRVJfSElHSCwKKwkJCSAgICAgIGVjY19uYW1lLCBhbHRkZXYpOwogCWlmIChyYykgewotCQllZGFjX3ByaW50ayhLRVJOX0VSUiwgRURBQ19ERVZJQ0UsICJObyBEQkVSUiBJUlEgcmVzb3VyY2VcbiIpOworCQllZGFjX3ByaW50ayhLRVJOX0VSUiwgRURBQ19ERVZJQ0UsICJObyBTQkVSUiBJUlEgcmVzb3VyY2VcbiIpOwogCQlnb3RvIGVycl9yZWxlYXNlX2dyb3VwMTsKIAl9CiAKQEAgLTE0NjUsOSArMTc2MSw5IEBACiAJCXJjID0gLUVOT0RFVjsKIAkJZ290byBlcnJfcmVsZWFzZV9ncm91cDE7CiAJfQotCXJjID0gZGV2bV9yZXF1ZXN0X2lycShlZGFjLT5kZXYsIGFsdGRldi0+ZGJfaXJxLAotCQkJICAgICAgcHJ2LT5lY2NfaXJxX2hhbmRsZXIsCi0JCQkgICAgICBJUlFGX1NIQVJFRCwgZWNjX25hbWUsIGFsdGRldik7CisJcmMgPSBkZXZtX3JlcXVlc3RfaXJxKGVkYWMtPmRldiwgYWx0ZGV2LT5kYl9pcnEsIHBydi0+ZWNjX2lycV9oYW5kbGVyLAorCQkJICAgICAgSVJRRl9PTkVTSE9UIHwgSVJRRl9UUklHR0VSX0hJR0gsCisJCQkgICAgICBlY2NfbmFtZSwgYWx0ZGV2KTsKIAlpZiAocmMpIHsKIAkJZWRhY19wcmludGsoS0VSTl9FUlIsIEVEQUNfREVWSUNFLCAiTm8gREJFUlIgSVJRIHJlc291cmNlXG4iKTsKIAkJZ290byBlcnJfcmVsZWFzZV9ncm91cDE7CkBAIC0xNTI2LDcgKzE4MjIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdHJ1Y3QgaXJxX2RvbWFpbl9vcHMgYTEwX2VjY21ncl9pY19vcHMgPSB7CitzdGF0aWMgc3RydWN0IGlycV9kb21haW5fb3BzIGExMF9lY2NtZ3JfaWNfb3BzID0gewogCS5tYXAgPSBhMTBfZWNjbWdyX2lycWRvbWFpbl9tYXAsCiAJLnhsYXRlID0gaXJxX2RvbWFpbl94bGF0ZV90d29jZWxsLAogfTsKQEAgLTE1ODQsMTUgKzE4ODAsMTkgQEAKIAlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKHBkZXYtPmRldi5vZl9ub2RlLCBjaGlsZCkgewogCQlpZiAoIW9mX2RldmljZV9pc19hdmFpbGFibGUoY2hpbGQpKQogCQkJY29udGludWU7Ci0JCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShjaGlsZCwgImFsdHIsc29jZnBnYS1hMTAtbDItZWNjIikpCisKKwkJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKGNoaWxkLCAiYWx0cixzb2NmcGdhLWExMC1sMi1lY2MiKSB8fCAKKwkJICAgIG9mX2RldmljZV9pc19jb21wYXRpYmxlKGNoaWxkLCAiYWx0cixzb2NmcGdhLWExMC1vY3JhbS1lY2MiKSB8fAorCQkgICAgb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoY2hpbGQsICJhbHRyLHNvY2ZwZ2EtZXRoLW1hYy1lY2MiKSB8fAorCQkgICAgb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoY2hpbGQsICJhbHRyLHNvY2ZwZ2EtbmFuZC1lY2MiKSB8fAorCQkgICAgb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoY2hpbGQsICJhbHRyLHNvY2ZwZ2EtZG1hLWVjYyIpIHx8CisJCSAgICBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShjaGlsZCwgImFsdHIsc29jZnBnYS11c2ItZWNjIikgfHwKKwkJICAgIG9mX2RldmljZV9pc19jb21wYXRpYmxlKGNoaWxkLCAiYWx0cixzb2NmcGdhLXFzcGktZWNjIikgfHwKKwkJICAgIG9mX2RldmljZV9pc19jb21wYXRpYmxlKGNoaWxkLCAiYWx0cixzb2NmcGdhLXNkbW1jLWVjYyIpKQorCiAJCQlhbHRyX2VkYWNfYTEwX2RldmljZV9hZGQoZWRhYywgY2hpbGQpOwotCQllbHNlIGlmICgob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoY2hpbGQsCi0JCQkJCSJhbHRyLHNvY2ZwZ2EtYTEwLW9jcmFtLWVjYyIpKSB8fAotCQkJIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShjaGlsZCwKLQkJCQkJImFsdHIsc29jZnBnYS1ldGgtbWFjLWVjYyIpKSkKLQkJCWFsdHJfZWRhY19hMTBfZGV2aWNlX2FkZChlZGFjLCBjaGlsZCk7Ci0JCWVsc2UgaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKGNoaWxkLAotCQkJCQkJICJhbHRyLHNkcmFtLWVkYWMtYTEwIikpCisKKwkJZWxzZSBpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoY2hpbGQsICJhbHRyLHNkcmFtLWVkYWMtYTEwIikpCiAJCQlvZl9wbGF0Zm9ybV9wb3B1bGF0ZShwZGV2LT5kZXYub2Zfbm9kZSwKIAkJCQkJICAgICBhbHRyX3NkcmFtX2N0cmxfb2ZfbWF0Y2gsCiAJCQkJCSAgICAgTlVMTCwgJnBkZXYtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvYWx0ZXJhX2VkYWMuaCBiL2RyaXZlcnMvZWRhYy9hbHRlcmFfZWRhYy5oCmluZGV4IDY4N2Q4ZTcuLmNiYzk2MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9hbHRlcmFfZWRhYy5oCisrKyBiL2RyaXZlcnMvZWRhYy9hbHRlcmFfZWRhYy5oCkBAIC0yNTAsNiArMjUwLDggQEAKICNkZWZpbmUgQUxUUl9BMTBfRUNDX0lOVFRFU1RfT0ZTVCAgICAgICAweDI0CiAjZGVmaW5lIEFMVFJfQTEwX0VDQ19UU0VSUkEgICAgICAgICAgICAgQklUKDApCiAjZGVmaW5lIEFMVFJfQTEwX0VDQ19UREVSUkEgICAgICAgICAgICAgQklUKDgpCisjZGVmaW5lIEFMVFJfQTEwX0VDQ19UU0VSUkIgICAgICAgICAgICAgQklUKDE2KQorI2RlZmluZSBBTFRSX0ExMF9FQ0NfVERFUlJCICAgICAgICAgICAgIEJJVCgyNCkKIAogLyogRUNDIE1hbmFnZXIgRGVmaW5lcyAqLwogI2RlZmluZSBBMTBfU1lTTUdSX0VDQ19JTlRNQVNLX1NFVF9PRlNUICAgMHg5NApAQCAtMjg4LDYgKzI5MCw5IEBACiAvKiBBcnJpYSAxMCBFdGhlcm5ldCBFQ0MgTWFuYWdlbWVudCBHcm91cCBEZWZpbmVzICovCiAjZGVmaW5lIEFMVFJfQTEwX0NPTU1PTl9FQ0NfRU5fQ1RMICAgICAgQklUKDApCiAKKy8qIEFycmlhIDEwIFNETU1DIEVDQyBNYW5hZ2VtZW50IEdyb3VwIERlZmluZXMgKi8KKyNkZWZpbmUgQUxUUl9BMTBfU0RNTUNfSVJRX01BU0sgICAgICAgICAoQklUKDE2KSB8IEJJVCgxNSkpCisKIC8qIEExMCBFQ0MgQ29udHJvbGxlciBtZW1vcnkgaW5pdGlhbGl6YXRpb24gdGltZW91dCAqLwogI2RlZmluZSBBTFRSX0ExMF9FQ0NfSU5JVF9XQVRDSERPR18xMFVTICAgICAgMTAwMDAKIApAQCAtMjk4LDcgKzMwMyw2IEBACiAJaW50IGNlX2NsZWFyX21hc2s7CiAJaW50IHVlX2NsZWFyX21hc2s7CiAJaW50IGlycV9zdGF0dXNfbWFzazsKLQljaGFyIGRiZ2ZzX25hbWVbMjBdOwogCXZvaWQgKiAoKmFsbG9jX21lbSkoc2l6ZV90IHNpemUsIHZvaWQgKipvdGhlcik7CiAJdm9pZCAoKmZyZWVfbWVtKSh2b2lkICpwLCBzaXplX3Qgc2l6ZSwgdm9pZCAqb3RoZXIpOwogCWludCBlY2NfZW5hYmxlX21hc2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5jIGIvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWMuYwppbmRleCA4YzBlYzIxLi5lZTE4MWM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjLmMKQEAgLTE0MjUsMTEgKzE0MjUsMTcgQEAKIAogCQlpZiAoaW50bHZfYWRkciAmIDB4MikgewogCQkJdTggc2hpZnQgPSBpbnRsdl9hZGRyICYgMHgxID8gOSA6IDY7Ci0JCQl1MzIgdGVtcCA9IGh3ZWlnaHRfbG9uZygodTMyKSAoKHN5c19hZGRyID4+IDE2KSAmIDB4MUYpKSAlIDI7CisJCQl1MzIgdGVtcCA9IGh3ZWlnaHRfbG9uZygodTMyKSAoKHN5c19hZGRyID4+IDE2KSAmIDB4MUYpKSAmIDE7CiAKIAkJCXJldHVybiAoKHN5c19hZGRyID4+IHNoaWZ0KSAmIDEpIF4gdGVtcDsKIAkJfQogCisJCWlmIChpbnRsdl9hZGRyICYgMHg0KSB7CisJCQl1OCBzaGlmdCA9IGludGx2X2FkZHIgJiAweDEgPyA5IDogODsKKworCQkJcmV0dXJuIChzeXNfYWRkciA+PiBzaGlmdCkgJiAxOworCQl9CisKIAkJcmV0dXJuIChzeXNfYWRkciA+PiAoMTIgKyBod2VpZ2h0OChpbnRsdl9lbikpKSAmIDE7CiAJfQogCkBAIC0xNzI2LDggKzE3MzIsMTEgQEAKIAlpZiAoIShudW1fZGN0c19pbnRsdiAlIDIgPT0gMCkgfHwgKG51bV9kY3RzX2ludGx2ID4gNCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JY2hhbm5lbCA9IGYxNV9tMzBoX2RldGVybWluZV9jaGFubmVsKHB2dCwgc3lzX2FkZHIsIGludGx2X2VuLAotCQkJCQkgICAgIG51bV9kY3RzX2ludGx2LCBkY3Rfc2VsKTsKKwlpZiAocHZ0LT5tb2RlbCA+PSAweDYwKQorCQljaGFubmVsID0gZjF4X2RldGVybWluZV9jaGFubmVsKHB2dCwgc3lzX2FkZHIsIGZhbHNlLCBpbnRsdl9lbik7CisJZWxzZQorCQljaGFubmVsID0gZjE1X20zMGhfZGV0ZXJtaW5lX2NoYW5uZWwocHZ0LCBzeXNfYWRkciwgaW50bHZfZW4sCisJCQkJCQkgICAgIG51bV9kY3RzX2ludGx2LCBkY3Rfc2VsKTsKIAogCS8qIFZlcmlmeSB3ZSBzdGF5IHdpdGhpbiB0aGUgTUFYIG51bWJlciBvZiBjaGFubmVscyBhbGxvd2VkICovCiAJaWYgKGNoYW5uZWwgPiAzKQpAQCAtMjk2MSw2ICsyOTcwLDE1IEBACiAJfQogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IHg4Nl9jcHVfaWQgYW1kNjRfY3B1aWRzW10gPSB7CisJeyBYODZfVkVORE9SX0FNRCwgMHhGLAlYODZfTU9ERUxfQU5ZLAlYODZfRkVBVFVSRV9BTlksIDAgfSwKKwl7IFg4Nl9WRU5ET1JfQU1ELCAweDEwLCBYODZfTU9ERUxfQU5ZLAlYODZfRkVBVFVSRV9BTlksIDAgfSwKKwl7IFg4Nl9WRU5ET1JfQU1ELCAweDE1LCBYODZfTU9ERUxfQU5ZLAlYODZfRkVBVFVSRV9BTlksIDAgfSwKKwl7IFg4Nl9WRU5ET1JfQU1ELCAweDE2LCBYODZfTU9ERUxfQU5ZLAlYODZfRkVBVFVSRV9BTlksIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHg4NmNwdSwgYW1kNjRfY3B1aWRzKTsKKwogc3RhdGljIGludCBfX2luaXQgYW1kNjRfZWRhY19pbml0KHZvaWQpCiB7CiAJaW50IGVyciA9IC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvZnNsX2Rkcl9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvZnNsX2Rkcl9lZGFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc3NGY1MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZWRhYy9mc2xfZGRyX2VkYWMuYwpAQCAtMCwwICsxLDYzMyBAQAorLyoKKyAqIEZyZWVzY2FsZSBNZW1vcnkgQ29udHJvbGxlciBrZXJuZWwgbW9kdWxlCisgKgorICogU3VwcG9ydCBQb3dlci1iYXNlZCBTb0NzIGluY2x1ZGluZyBNUEM4NXh4LCBNUEM4Nnh4LCBNUEM4M3h4IGFuZAorICogQVJNLWJhc2VkIExheWVyc2NhcGUgU29DcyBpbmNsdWRpbmcgTFMyeHh4LiBPcmlnaW5hbGx5IHNwbGl0CisgKiBvdXQgZnJvbSBtcGM4NXh4X2VkYWMgRURBQyBkcml2ZXIuCisgKgorICogUGFydHMgQ29weXJpZ2h0ZWQgKGMpIDIwMTMgYnkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBBdXRob3I6IERhdmUgSmlhbmcgPGRqaWFuZ0BtdmlzdGEuY29tPgorICoKKyAqIDIwMDYtMjAwNyAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CisjaW5jbHVkZSA8bGludXgvZWRhYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorCisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSAiZWRhY19tb2R1bGUuaCIKKyNpbmNsdWRlICJlZGFjX2NvcmUuaCIKKyNpbmNsdWRlICJmc2xfZGRyX2VkYWMuaCIKKworI2RlZmluZSBFREFDX01PRF9TVFIJImZzbF9kZHJfZWRhYyIKKworc3RhdGljIGludCBlZGFjX21jX2lkeDsKKworc3RhdGljIHUzMiBvcmlnX2Rkcl9lcnJfZGlzYWJsZTsKK3N0YXRpYyB1MzIgb3JpZ19kZHJfZXJyX3NiZTsKK3N0YXRpYyBib29sIGxpdHRsZV9lbmRpYW47CisKK3N0YXRpYyBpbmxpbmUgdTMyIGRkcl9pbjMyKHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlyZXR1cm4gbGl0dGxlX2VuZGlhbiA/IGlvcmVhZDMyKGFkZHIpIDogaW9yZWFkMzJiZShhZGRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRkcl9vdXQzMih2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiB2YWx1ZSkKK3sKKwlpZiAobGl0dGxlX2VuZGlhbikKKwkJaW93cml0ZTMyKHZhbHVlLCBhZGRyKTsKKwllbHNlCisJCWlvd3JpdGUzMmJlKHZhbHVlLCBhZGRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBNQyBTWVNGUyBwYXJ0cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSB0b19tY2koaykgY29udGFpbmVyX29mKGssIHN0cnVjdCBtZW1fY3RsX2luZm8sIGRldikKKworc3RhdGljIHNzaXplX3QgZnNsX21jX2luamVjdF9kYXRhX2hpX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICptYXR0ciwKKwkJCQkJICBjaGFyICpkYXRhKQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IHRvX21jaShkZXYpOworCXN0cnVjdCBmc2xfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKKwlyZXR1cm4gc3ByaW50ZihkYXRhLCAiMHglMDh4IiwKKwkJICAgICAgIGRkcl9pbjMyKHBkYXRhLT5tY192YmFzZSArIEZTTF9NQ19EQVRBX0VSUl9JTkpFQ1RfSEkpKTsKK30KKworc3RhdGljIHNzaXplX3QgZnNsX21jX2luamVjdF9kYXRhX2xvX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICptYXR0ciwKKwkJCQkJICAgICAgY2hhciAqZGF0YSkKK3sKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kgPSB0b19tY2koZGV2KTsKKwlzdHJ1Y3QgZnNsX21jX3BkYXRhICpwZGF0YSA9IG1jaS0+cHZ0X2luZm87CisJcmV0dXJuIHNwcmludGYoZGF0YSwgIjB4JTA4eCIsCisJCSAgICAgICBkZHJfaW4zMihwZGF0YS0+bWNfdmJhc2UgKyBGU0xfTUNfREFUQV9FUlJfSU5KRUNUX0xPKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZzbF9tY19pbmplY3RfY3RybF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKm1hdHRyLAorCQkJCQkgICBjaGFyICpkYXRhKQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IHRvX21jaShkZXYpOworCXN0cnVjdCBmc2xfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKKwlyZXR1cm4gc3ByaW50ZihkYXRhLCAiMHglMDh4IiwKKwkJICAgICAgIGRkcl9pbjMyKHBkYXRhLT5tY192YmFzZSArIEZTTF9NQ19FQ0NfRVJSX0lOSkVDVCkpOworfQorCitzdGF0aWMgc3NpemVfdCBmc2xfbWNfaW5qZWN0X2RhdGFfaGlfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqbWF0dHIsCisJCQkJCSAgICAgICBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpID0gdG9fbWNpKGRldik7CisJc3RydWN0IGZzbF9tY19wZGF0YSAqcGRhdGEgPSBtY2ktPnB2dF9pbmZvOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCByYzsKKworCWlmIChpc2RpZ2l0KCpkYXRhKSkgeworCQlyYyA9IGtzdHJ0b3VsKGRhdGEsIDAsICZ2YWwpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJZGRyX291dDMyKHBkYXRhLT5tY192YmFzZSArIEZTTF9NQ19EQVRBX0VSUl9JTkpFQ1RfSEksIHZhbCk7CisJCXJldHVybiBjb3VudDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZzbF9tY19pbmplY3RfZGF0YV9sb19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICptYXR0ciwKKwkJCQkJICAgICAgIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kgPSB0b19tY2koZGV2KTsKKwlzdHJ1Y3QgZnNsX21jX3BkYXRhICpwZGF0YSA9IG1jaS0+cHZ0X2luZm87CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHJjOworCisJaWYgKGlzZGlnaXQoKmRhdGEpKSB7CisJCXJjID0ga3N0cnRvdWwoZGF0YSwgMCwgJnZhbCk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQlkZHJfb3V0MzIocGRhdGEtPm1jX3ZiYXNlICsgRlNMX01DX0RBVEFfRVJSX0lOSkVDVF9MTywgdmFsKTsKKwkJcmV0dXJuIGNvdW50OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgZnNsX21jX2luamVjdF9jdHJsX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKm1hdHRyLAorCQkJCQkgICAgICAgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IHRvX21jaShkZXYpOworCXN0cnVjdCBmc2xfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgcmM7CisKKwlpZiAoaXNkaWdpdCgqZGF0YSkpIHsKKwkJcmMgPSBrc3RydG91bChkYXRhLCAwLCAmdmFsKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCWRkcl9vdXQzMihwZGF0YS0+bWNfdmJhc2UgKyBGU0xfTUNfRUNDX0VSUl9JTkpFQ1QsIHZhbCk7CisJCXJldHVybiBjb3VudDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0RFVklDRV9BVFRSKGluamVjdF9kYXRhX2hpLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkgICAgZnNsX21jX2luamVjdF9kYXRhX2hpX3Nob3csIGZzbF9tY19pbmplY3RfZGF0YV9oaV9zdG9yZSk7CitERVZJQ0VfQVRUUihpbmplY3RfZGF0YV9sbywgU19JUlVHTyB8IFNfSVdVU1IsCisJICAgIGZzbF9tY19pbmplY3RfZGF0YV9sb19zaG93LCBmc2xfbWNfaW5qZWN0X2RhdGFfbG9fc3RvcmUpOworREVWSUNFX0FUVFIoaW5qZWN0X2N0cmwsIFNfSVJVR08gfCBTX0lXVVNSLAorCSAgICBmc2xfbWNfaW5qZWN0X2N0cmxfc2hvdywgZnNsX21jX2luamVjdF9jdHJsX3N0b3JlKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmZzbF9kZHJfZGV2X2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2luamVjdF9kYXRhX2hpLmF0dHIsCisJJmRldl9hdHRyX2luamVjdF9kYXRhX2xvLmF0dHIsCisJJmRldl9hdHRyX2luamVjdF9jdHJsLmF0dHIsCisJTlVMTAorfTsKKworQVRUUklCVVRFX0dST1VQUyhmc2xfZGRyX2Rldik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1DIEVyciBkZXZpY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGFrZW4gZnJvbSB0YWJsZSA4LTU1IGluIHRoZSBNUEM4NjQxIFVzZXIncyBNYW51YWwgYW5kL29yIDktNjEgaW4gdGhlCisgKiBNUEM4NTcyIFVzZXIncyBNYW51YWwuICBFYWNoIGxpbmUgcmVwcmVzZW50cyBhIHN5bmRyb21lIGJpdCBjb2x1bW4gYXMgYQorICogNjQtYml0IHZhbHVlLCBidXQgc3BsaXQgaW50byBhbiB1cHBlciBhbmQgbG93ZXIgMzItYml0IGNodW5rLiAgVGhlIGxhYmVscworICogYmVsb3cgY29ycmVzcG9uZCB0byBGcmVlc2NhbGUncyBtYW51YWxzLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGVjY190YWJsZVsxNl0gPSB7CisJLyogTVNCICAgICAgICAgICBMU0IgKi8KKwkvKiBbMDozMV0gICAgWzMyOjYzXSAqLworCTB4ZjAwZmUxMWUsIDB4YzMzYzBmZjcsCS8qIFN5bmRyb21lIGJpdCA3ICovCisJMHgwMGZmMDBmZiwgMHgwMGZmZjBmZiwKKwkweDBmMGYwZjBmLCAweDBmMGZmZjAwLAorCTB4MTExMTMzMzMsIDB4Nzc3NzAwMGYsCisJMHgyMjIyNDQ0NCwgMHg4ODg4MjIyZiwKKwkweDQ0NDQ4ODg4LCAweGZmZmY0NDQxLAorCTB4ODg4OGZmZmYsIDB4MTExMTg4ODIsCisJMHhmZmZmMTExMSwgMHgyMjIyMTExNCwJLyogU3luZHJvbWUgYml0IDAgKi8KK307CisKKy8qCisgKiBDYWxjdWxhdGUgdGhlIGNvcnJlY3QgRUNDIHZhbHVlIGZvciBhIDY0LWJpdCB2YWx1ZSBzcGVjaWZpZWQgYnkgaGlnaDpsb3cKKyAqLworc3RhdGljIHU4IGNhbGN1bGF0ZV9lY2ModTMyIGhpZ2gsIHUzMiBsb3cpCit7CisJdTMyIG1hc2tfbG93OworCXUzMiBtYXNrX2hpZ2g7CisJaW50IGJpdF9jbnQ7CisJdTggZWNjID0gMDsKKwlpbnQgaTsKKwlpbnQgajsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJbWFza19oaWdoID0gZWNjX3RhYmxlW2kgKiAyXTsKKwkJbWFza19sb3cgPSBlY2NfdGFibGVbaSAqIDIgKyAxXTsKKwkJYml0X2NudCA9IDA7CisKKwkJZm9yIChqID0gMDsgaiA8IDMyOyBqKyspIHsKKwkJCWlmICgobWFza19oaWdoID4+IGopICYgMSkKKwkJCQliaXRfY250IF49IChoaWdoID4+IGopICYgMTsKKwkJCWlmICgobWFza19sb3cgPj4gaikgJiAxKQorCQkJCWJpdF9jbnQgXj0gKGxvdyA+PiBqKSAmIDE7CisJCX0KKworCQllY2MgfD0gYml0X2NudCA8PCBpOworCX0KKworCXJldHVybiBlY2M7Cit9CisKKy8qCisgKiBDcmVhdGUgdGhlIHN5bmRyb21lIGNvZGUgd2hpY2ggaXMgZ2VuZXJhdGVkIGlmIHRoZSBkYXRhIGxpbmUgc3BlY2lmaWVkIGJ5CisgKiAnYml0JyBmYWlsZWQuICBFZyBnZW5lcmF0ZSBhbiA4LWJpdCBjb2RlcyBzZWVuIGluIFRhYmxlIDgtNTUgaW4gdGhlIE1QQzg2NDEKKyAqIFVzZXIncyBNYW51YWwgYW5kIDktNjEgaW4gdGhlIE1QQzg1NzIgVXNlcidzIE1hbnVhbC4KKyAqLworc3RhdGljIHU4IHN5bmRyb21lX2Zyb21fYml0KHVuc2lnbmVkIGludCBiaXQpIHsKKwlpbnQgaTsKKwl1OCBzeW5kcm9tZSA9IDA7CisKKwkvKgorCSAqIEN5Y2xlIHRocm91Z2ggdGhlIHVwcGVyIG9yIGxvd2VyIDMyLWJpdCBwb3J0aW9uIG9mIGVhY2ggdmFsdWUgaW4KKwkgKiBlY2NfdGFibGUgZGVwZW5kaW5nIG9uIGlmICdiaXQnIGlzIGluIHRoZSB1cHBlciBvciBsb3dlciBoYWxmIG9mCisJICogNjQtYml0IGRhdGEuCisJICovCisJZm9yIChpID0gYml0IDwgMzI7IGkgPCAxNjsgaSArPSAyKQorCQlzeW5kcm9tZSB8PSAoKGVjY190YWJsZVtpXSA+PiAoYml0ICUgMzIpKSAmIDEpIDw8IChpIC8gMik7CisKKwlyZXR1cm4gc3luZHJvbWU7Cit9CisKKy8qCisgKiBEZWNvZGUgZGF0YSBhbmQgZWNjIHN5bmRyb21lIHRvIGRldGVybWluZSB3aGF0IHdlbnQgd3JvbmcKKyAqIE5vdGU6IFRoaXMgY2FuIG9ubHkgZGVjb2RlIHNpbmdsZS1iaXQgZXJyb3JzCisgKi8KK3N0YXRpYyB2b2lkIHNiZV9lY2NfZGVjb2RlKHUzMiBjYXBfaGlnaCwgdTMyIGNhcF9sb3csIHUzMiBjYXBfZWNjLAorCQkgICAgICAgaW50ICpiYWRfZGF0YV9iaXQsIGludCAqYmFkX2VjY19iaXQpCit7CisJaW50IGk7CisJdTggc3luZHJvbWU7CisKKwkqYmFkX2RhdGFfYml0ID0gLTE7CisJKmJhZF9lY2NfYml0ID0gLTE7CisKKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgRUNDIG9mIHRoZSBjYXB0dXJlZCBkYXRhIGFuZCBYT1IgaXQgd2l0aCB0aGUgY2FwdHVyZWQKKwkgKiBFQ0MgdG8gZmluZCBhbiBFQ0Mgc3luZHJvbWUgdmFsdWUgd2UgY2FuIHNlYXJjaCBmb3IKKwkgKi8KKwlzeW5kcm9tZSA9IGNhbGN1bGF0ZV9lY2MoY2FwX2hpZ2gsIGNhcF9sb3cpIF4gY2FwX2VjYzsKKworCS8qIENoZWNrIGlmIGEgZGF0YSBsaW5lIGlzIHN0dWNrLi4uICovCisJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKwkJaWYgKHN5bmRyb21lID09IHN5bmRyb21lX2Zyb21fYml0KGkpKSB7CisJCQkqYmFkX2RhdGFfYml0ID0gaTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qIElmIGRhdGEgaXMgY29ycmVjdCwgY2hlY2sgRUNDIGJpdHMgZm9yIGVycm9ycy4uLiAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJaWYgKChzeW5kcm9tZSA+PiBpKSAmIDB4MSkgeworCQkJKmJhZF9lY2NfYml0ID0gaTsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworI2RlZmluZSBtYWtlNjQoaGlnaCwgbG93KSAoKCh1NjQpKGhpZ2gpIDw8IDMyKSB8IChsb3cpKQorCitzdGF0aWMgdm9pZCBmc2xfbWNfY2hlY2soc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQoreworCXN0cnVjdCBmc2xfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKKwlzdHJ1Y3QgY3Nyb3dfaW5mbyAqY3Nyb3c7CisJdTMyIGJ1c193aWR0aDsKKwl1MzIgZXJyX2RldGVjdDsKKwl1MzIgc3luZHJvbWU7CisJdTY0IGVycl9hZGRyOworCXUzMiBwZm47CisJaW50IHJvd19pbmRleDsKKwl1MzIgY2FwX2hpZ2g7CisJdTMyIGNhcF9sb3c7CisJaW50IGJhZF9kYXRhX2JpdDsKKwlpbnQgYmFkX2VjY19iaXQ7CisKKwllcnJfZGV0ZWN0ID0gZGRyX2luMzIocGRhdGEtPm1jX3ZiYXNlICsgRlNMX01DX0VSUl9ERVRFQ1QpOworCWlmICghZXJyX2RldGVjdCkKKwkJcmV0dXJuOworCisJZnNsX21jX3ByaW50ayhtY2ksIEtFUk5fRVJSLCAiRXJyIERldGVjdCBSZWdpc3RlcjogJSM4Ljh4XG4iLAorCQkgICAgICBlcnJfZGV0ZWN0KTsKKworCS8qIG5vIG1vcmUgcHJvY2Vzc2luZyBpZiBub3QgRUNDIGJpdCBlcnJvcnMgKi8KKwlpZiAoIShlcnJfZGV0ZWN0ICYgKEREUl9FREVfU0JFIHwgRERSX0VERV9NQkUpKSkgeworCQlkZHJfb3V0MzIocGRhdGEtPm1jX3ZiYXNlICsgRlNMX01DX0VSUl9ERVRFQ1QsIGVycl9kZXRlY3QpOworCQlyZXR1cm47CisJfQorCisJc3luZHJvbWUgPSBkZHJfaW4zMihwZGF0YS0+bWNfdmJhc2UgKyBGU0xfTUNfQ0FQVFVSRV9FQ0MpOworCisJLyogTWFzayBvZmYgYXBwcm9wcmlhdGUgYml0cyBvZiBzeW5kcm9tZSBiYXNlZCBvbiBidXMgd2lkdGggKi8KKwlidXNfd2lkdGggPSAoZGRyX2luMzIocGRhdGEtPm1jX3ZiYXNlICsgRlNMX01DX0REUl9TRFJBTV9DRkcpICYKKwkJICAgICBEU0NfREJXX01BU0spID8gMzIgOiA2NDsKKwlpZiAoYnVzX3dpZHRoID09IDY0KQorCQlzeW5kcm9tZSAmPSAweGZmOworCWVsc2UKKwkJc3luZHJvbWUgJj0gMHhmZmZmOworCisJZXJyX2FkZHIgPSBtYWtlNjQoCisJCWRkcl9pbjMyKHBkYXRhLT5tY192YmFzZSArIEZTTF9NQ19DQVBUVVJFX0VYVF9BRERSRVNTKSwKKwkJZGRyX2luMzIocGRhdGEtPm1jX3ZiYXNlICsgRlNMX01DX0NBUFRVUkVfQUREUkVTUykpOworCXBmbiA9IGVycl9hZGRyID4+IFBBR0VfU0hJRlQ7CisKKwlmb3IgKHJvd19pbmRleCA9IDA7IHJvd19pbmRleCA8IG1jaS0+bnJfY3Nyb3dzOyByb3dfaW5kZXgrKykgeworCQljc3JvdyA9IG1jaS0+Y3Nyb3dzW3Jvd19pbmRleF07CisJCWlmICgocGZuID49IGNzcm93LT5maXJzdF9wYWdlKSAmJiAocGZuIDw9IGNzcm93LT5sYXN0X3BhZ2UpKQorCQkJYnJlYWs7CisJfQorCisJY2FwX2hpZ2ggPSBkZHJfaW4zMihwZGF0YS0+bWNfdmJhc2UgKyBGU0xfTUNfQ0FQVFVSRV9EQVRBX0hJKTsKKwljYXBfbG93ID0gZGRyX2luMzIocGRhdGEtPm1jX3ZiYXNlICsgRlNMX01DX0NBUFRVUkVfREFUQV9MTyk7CisKKwkvKgorCSAqIEFuYWx5emUgc2luZ2xlLWJpdCBlcnJvcnMgb24gNjQtYml0IHdpZGUgYnVzZXMKKwkgKiBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgMzItYml0IHdpZGUgYnVzZXMKKwkgKi8KKwlpZiAoKGVycl9kZXRlY3QgJiBERFJfRURFX1NCRSkgJiYgKGJ1c193aWR0aCA9PSA2NCkpIHsKKwkJc2JlX2VjY19kZWNvZGUoY2FwX2hpZ2gsIGNhcF9sb3csIHN5bmRyb21lLAorCQkJCSZiYWRfZGF0YV9iaXQsICZiYWRfZWNjX2JpdCk7CisKKwkJaWYgKGJhZF9kYXRhX2JpdCAhPSAtMSkKKwkJCWZzbF9tY19wcmludGsobWNpLCBLRVJOX0VSUiwKKwkJCQkiRmF1bHR5IERhdGEgYml0OiAlZFxuIiwgYmFkX2RhdGFfYml0KTsKKwkJaWYgKGJhZF9lY2NfYml0ICE9IC0xKQorCQkJZnNsX21jX3ByaW50ayhtY2ksIEtFUk5fRVJSLAorCQkJCSJGYXVsdHkgRUNDIGJpdDogJWRcbiIsIGJhZF9lY2NfYml0KTsKKworCQlmc2xfbWNfcHJpbnRrKG1jaSwgS0VSTl9FUlIsCisJCQkiRXhwZWN0ZWQgRGF0YSAvIEVDQzpcdCUjOC44eF8lMDh4IC8gJSMyLjJ4XG4iLAorCQkJY2FwX2hpZ2ggXiAoMSA8PCAoYmFkX2RhdGFfYml0IC0gMzIpKSwKKwkJCWNhcF9sb3cgXiAoMSA8PCBiYWRfZGF0YV9iaXQpLAorCQkJc3luZHJvbWUgXiAoMSA8PCBiYWRfZWNjX2JpdCkpOworCX0KKworCWZzbF9tY19wcmludGsobWNpLCBLRVJOX0VSUiwKKwkJCSJDYXB0dXJlZCBEYXRhIC8gRUNDOlx0JSM4Ljh4XyUwOHggLyAlIzIuMnhcbiIsCisJCQljYXBfaGlnaCwgY2FwX2xvdywgc3luZHJvbWUpOworCWZzbF9tY19wcmludGsobWNpLCBLRVJOX0VSUiwgIkVyciBhZGRyOiAlIzguOGxseFxuIiwgZXJyX2FkZHIpOworCWZzbF9tY19wcmludGsobWNpLCBLRVJOX0VSUiwgIlBGTjogJSM4Ljh4XG4iLCBwZm4pOworCisJLyogd2UgYXJlIG91dCBvZiByYW5nZSAqLworCWlmIChyb3dfaW5kZXggPT0gbWNpLT5ucl9jc3Jvd3MpCisJCWZzbF9tY19wcmludGsobWNpLCBLRVJOX0VSUiwgIlBGTiBvdXQgb2YgcmFuZ2UhXG4iKTsKKworCWlmIChlcnJfZGV0ZWN0ICYgRERSX0VERV9TQkUpCisJCWVkYWNfbWNfaGFuZGxlX2Vycm9yKEhXX0VWRU5UX0VSUl9DT1JSRUNURUQsIG1jaSwgMSwKKwkJCQkgICAgIHBmbiwgZXJyX2FkZHIgJiB+UEFHRV9NQVNLLCBzeW5kcm9tZSwKKwkJCQkgICAgIHJvd19pbmRleCwgMCwgLTEsCisJCQkJICAgICBtY2ktPmN0bF9uYW1lLCAiIik7CisKKwlpZiAoZXJyX2RldGVjdCAmIEREUl9FREVfTUJFKQorCQllZGFjX21jX2hhbmRsZV9lcnJvcihIV19FVkVOVF9FUlJfVU5DT1JSRUNURUQsIG1jaSwgMSwKKwkJCQkgICAgIHBmbiwgZXJyX2FkZHIgJiB+UEFHRV9NQVNLLCBzeW5kcm9tZSwKKwkJCQkgICAgIHJvd19pbmRleCwgMCwgLTEsCisJCQkJICAgICBtY2ktPmN0bF9uYW1lLCAiIik7CisKKwlkZHJfb3V0MzIocGRhdGEtPm1jX3ZiYXNlICsgRlNMX01DX0VSUl9ERVRFQ1QsIGVycl9kZXRlY3QpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZnNsX21jX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpID0gZGV2X2lkOworCXN0cnVjdCBmc2xfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKKwl1MzIgZXJyX2RldGVjdDsKKworCWVycl9kZXRlY3QgPSBkZHJfaW4zMihwZGF0YS0+bWNfdmJhc2UgKyBGU0xfTUNfRVJSX0RFVEVDVCk7CisJaWYgKCFlcnJfZGV0ZWN0KQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlmc2xfbWNfY2hlY2sobWNpKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgZnNsX2Rkcl9pbml0X2Nzcm93cyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCit7CisJc3RydWN0IGZzbF9tY19wZGF0YSAqcGRhdGEgPSBtY2ktPnB2dF9pbmZvOworCXN0cnVjdCBjc3Jvd19pbmZvICpjc3JvdzsKKwlzdHJ1Y3QgZGltbV9pbmZvICpkaW1tOworCXUzMiBzZHJhbV9jdGw7CisJdTMyIHNkdHlwZTsKKwllbnVtIG1lbV90eXBlIG10eXBlOworCXUzMiBjc19ibmRzOworCWludCBpbmRleDsKKworCXNkcmFtX2N0bCA9IGRkcl9pbjMyKHBkYXRhLT5tY192YmFzZSArIEZTTF9NQ19ERFJfU0RSQU1fQ0ZHKTsKKworCXNkdHlwZSA9IHNkcmFtX2N0bCAmIERTQ19TRFRZUEVfTUFTSzsKKwlpZiAoc2RyYW1fY3RsICYgRFNDX1JEX0VOKSB7CisJCXN3aXRjaCAoc2R0eXBlKSB7CisJCWNhc2UgMHgwMjAwMDAwMDoKKwkJCW10eXBlID0gTUVNX1JERFI7CisJCQlicmVhazsKKwkJY2FzZSAweDAzMDAwMDAwOgorCQkJbXR5cGUgPSBNRU1fUkREUjI7CisJCQlicmVhazsKKwkJY2FzZSAweDA3MDAwMDAwOgorCQkJbXR5cGUgPSBNRU1fUkREUjM7CisJCQlicmVhazsKKwkJY2FzZSAweDA1MDAwMDAwOgorCQkJbXR5cGUgPSBNRU1fUkREUjQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW10eXBlID0gTUVNX1VOS05PV047CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAoc2R0eXBlKSB7CisJCWNhc2UgMHgwMjAwMDAwMDoKKwkJCW10eXBlID0gTUVNX0REUjsKKwkJCWJyZWFrOworCQljYXNlIDB4MDMwMDAwMDA6CisJCQltdHlwZSA9IE1FTV9ERFIyOworCQkJYnJlYWs7CisJCWNhc2UgMHgwNzAwMDAwMDoKKwkJCW10eXBlID0gTUVNX0REUjM7CisJCQlicmVhazsKKwkJY2FzZSAweDA1MDAwMDAwOgorCQkJbXR5cGUgPSBNRU1fRERSNDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbXR5cGUgPSBNRU1fVU5LTk9XTjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbWNpLT5ucl9jc3Jvd3M7IGluZGV4KyspIHsKKwkJdTMyIHN0YXJ0OworCQl1MzIgZW5kOworCisJCWNzcm93ID0gbWNpLT5jc3Jvd3NbaW5kZXhdOworCQlkaW1tID0gY3Nyb3ctPmNoYW5uZWxzWzBdLT5kaW1tOworCisJCWNzX2JuZHMgPSBkZHJfaW4zMihwZGF0YS0+bWNfdmJhc2UgKyBGU0xfTUNfQ1NfQk5EU18wICsKKwkJCQkgICAoaW5kZXggKiBGU0xfTUNfQ1NfQk5EU19PRlMpKTsKKworCQlzdGFydCA9IChjc19ibmRzICYgMHhmZmZmMDAwMCkgPj4gMTY7CisJCWVuZCAgID0gKGNzX2JuZHMgJiAweDAwMDBmZmZmKTsKKworCQlpZiAoc3RhcnQgPT0gZW5kKQorCQkJY29udGludWU7CS8qIG5vdCBwb3B1bGF0ZWQgKi8KKworCQlzdGFydCA8PD0gKDI0IC0gUEFHRV9TSElGVCk7CisJCWVuZCAgIDw8PSAoMjQgLSBQQUdFX1NISUZUKTsKKwkJZW5kICAgIHw9ICgxIDw8ICgyNCAtIFBBR0VfU0hJRlQpKSAtIDE7CisKKwkJY3Nyb3ctPmZpcnN0X3BhZ2UgPSBzdGFydDsKKwkJY3Nyb3ctPmxhc3RfcGFnZSA9IGVuZDsKKworCQlkaW1tLT5ucl9wYWdlcyA9IGVuZCArIDEgLSBzdGFydDsKKwkJZGltbS0+Z3JhaW4gPSA4OworCQlkaW1tLT5tdHlwZSA9IG10eXBlOworCQlkaW1tLT5kdHlwZSA9IERFVl9VTktOT1dOOworCQlpZiAoc2RyYW1fY3RsICYgRFNDX1gzMl9FTikKKwkJCWRpbW0tPmR0eXBlID0gREVWX1gzMjsKKwkJZGltbS0+ZWRhY19tb2RlID0gRURBQ19TRUNERUQ7CisJfQorfQorCitpbnQgZnNsX21jX2Vycl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCkKK3sKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2k7CisJc3RydWN0IGVkYWNfbWNfbGF5ZXIgbGF5ZXJzWzJdOworCXN0cnVjdCBmc2xfbWNfcGRhdGEgKnBkYXRhOworCXN0cnVjdCByZXNvdXJjZSByOworCXUzMiBzZHJhbV9jdGw7CisJaW50IHJlczsKKworCWlmICghZGV2cmVzX29wZW5fZ3JvdXAoJm9wLT5kZXYsIGZzbF9tY19lcnJfcHJvYmUsIEdGUF9LRVJORUwpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxheWVyc1swXS50eXBlID0gRURBQ19NQ19MQVlFUl9DSElQX1NFTEVDVDsKKwlsYXllcnNbMF0uc2l6ZSA9IDQ7CisJbGF5ZXJzWzBdLmlzX3ZpcnRfY3Nyb3cgPSB0cnVlOworCWxheWVyc1sxXS50eXBlID0gRURBQ19NQ19MQVlFUl9DSEFOTkVMOworCWxheWVyc1sxXS5zaXplID0gMTsKKwlsYXllcnNbMV0uaXNfdmlydF9jc3JvdyA9IGZhbHNlOworCW1jaSA9IGVkYWNfbWNfYWxsb2MoZWRhY19tY19pZHgsIEFSUkFZX1NJWkUobGF5ZXJzKSwgbGF5ZXJzLAorCQkJICAgIHNpemVvZigqcGRhdGEpKTsKKwlpZiAoIW1jaSkgeworCQlkZXZyZXNfcmVsZWFzZV9ncm91cCgmb3AtPmRldiwgZnNsX21jX2Vycl9wcm9iZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBkYXRhID0gbWNpLT5wdnRfaW5mbzsKKwlwZGF0YS0+bmFtZSA9ICJmc2xfbWNfZXJyIjsKKwltY2ktPnBkZXYgPSAmb3AtPmRldjsKKwlwZGF0YS0+ZWRhY19pZHggPSBlZGFjX21jX2lkeCsrOworCWRldl9zZXRfZHJ2ZGF0YShtY2ktPnBkZXYsIG1jaSk7CisJbWNpLT5jdGxfbmFtZSA9IHBkYXRhLT5uYW1lOworCW1jaS0+ZGV2X25hbWUgPSBwZGF0YS0+bmFtZTsKKworCS8qCisJICogR2V0IHRoZSBlbmRpYW5uZXNzIG9mIEREUiBjb250cm9sbGVyIHJlZ2lzdGVycy4KKwkgKiBEZWZhdWx0IGlzIGJpZyBlbmRpYW4uCisJICovCisJbGl0dGxlX2VuZGlhbiA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChvcC0+ZGV2Lm9mX25vZGUsICJsaXR0bGUtZW5kaWFuIik7CisKKwlyZXMgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG9wLT5kZXYub2Zfbm9kZSwgMCwgJnIpOworCWlmIChyZXMpIHsKKwkJcHJfZXJyKCIlczogVW5hYmxlIHRvIGdldCByZXNvdXJjZSBmb3IgTUMgZXJyIHJlZ3NcbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyOworCX0KKworCWlmICghZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJm9wLT5kZXYsIHIuc3RhcnQsIHJlc291cmNlX3NpemUoJnIpLAorCQkJCSAgICAgcGRhdGEtPm5hbWUpKSB7CisJCXByX2VycigiJXM6IEVycm9yIHdoaWxlIHJlcXVlc3RpbmcgbWVtIHJlZ2lvblxuIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJcmVzID0gLUVCVVNZOworCQlnb3RvIGVycjsKKwl9CisKKwlwZGF0YS0+bWNfdmJhc2UgPSBkZXZtX2lvcmVtYXAoJm9wLT5kZXYsIHIuc3RhcnQsIHJlc291cmNlX3NpemUoJnIpKTsKKwlpZiAoIXBkYXRhLT5tY192YmFzZSkgeworCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gc2V0dXAgTUMgZXJyIHJlZ3NcbiIsIF9fZnVuY19fKTsKKwkJcmVzID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJc2RyYW1fY3RsID0gZGRyX2luMzIocGRhdGEtPm1jX3ZiYXNlICsgRlNMX01DX0REUl9TRFJBTV9DRkcpOworCWlmICghKHNkcmFtX2N0bCAmIERTQ19FQ0NfRU4pKSB7CisJCS8qIG5vIEVDQyAqLworCQlwcl93YXJuKCIlczogTm8gRUNDIERJTU1zIGRpc2NvdmVyZWRcbiIsIF9fZnVuY19fKTsKKwkJcmVzID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CisJfQorCisJZWRhY19kYmcoMywgImluaXQgbWNpXG4iKTsKKwltY2ktPm10eXBlX2NhcCA9IE1FTV9GTEFHX0REUiB8IE1FTV9GTEFHX1JERFIgfAorCQkJIE1FTV9GTEFHX0REUjIgfCBNRU1fRkxBR19SRERSMiB8CisJCQkgTUVNX0ZMQUdfRERSMyB8IE1FTV9GTEFHX1JERFIzIHwKKwkJCSBNRU1fRkxBR19ERFI0IHwgTUVNX0ZMQUdfUkREUjQ7CisJbWNpLT5lZGFjX2N0bF9jYXAgPSBFREFDX0ZMQUdfTk9ORSB8IEVEQUNfRkxBR19TRUNERUQ7CisJbWNpLT5lZGFjX2NhcCA9IEVEQUNfRkxBR19TRUNERUQ7CisJbWNpLT5tb2RfbmFtZSA9IEVEQUNfTU9EX1NUUjsKKworCWlmIChlZGFjX29wX3N0YXRlID09IEVEQUNfT1BTVEFURV9QT0xMKQorCQltY2ktPmVkYWNfY2hlY2sgPSBmc2xfbWNfY2hlY2s7CisKKwltY2ktPmN0bF9wYWdlX3RvX3BoeXMgPSBOVUxMOworCisJbWNpLT5zY3J1Yl9tb2RlID0gU0NSVUJfU1dfU1JDOworCisJZnNsX2Rkcl9pbml0X2Nzcm93cyhtY2kpOworCisJLyogc3RvcmUgdGhlIG9yaWdpbmFsIGVycm9yIGRpc2FibGUgYml0cyAqLworCW9yaWdfZGRyX2Vycl9kaXNhYmxlID0gZGRyX2luMzIocGRhdGEtPm1jX3ZiYXNlICsgRlNMX01DX0VSUl9ESVNBQkxFKTsKKwlkZHJfb3V0MzIocGRhdGEtPm1jX3ZiYXNlICsgRlNMX01DX0VSUl9ESVNBQkxFLCAwKTsKKworCS8qIGNsZWFyIGFsbCBlcnJvciBiaXRzICovCisJZGRyX291dDMyKHBkYXRhLT5tY192YmFzZSArIEZTTF9NQ19FUlJfREVURUNULCB+MCk7CisKKwlyZXMgPSBlZGFjX21jX2FkZF9tY193aXRoX2dyb3VwcyhtY2ksIGZzbF9kZHJfZGV2X2dyb3Vwcyk7CisJaWYgKHJlcykgeworCQllZGFjX2RiZygzLCAiZmFpbGVkIGVkYWNfbWNfYWRkX21jKClcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoZWRhY19vcF9zdGF0ZSA9PSBFREFDX09QU1RBVEVfSU5UKSB7CisJCWRkcl9vdXQzMihwZGF0YS0+bWNfdmJhc2UgKyBGU0xfTUNfRVJSX0lOVF9FTiwKKwkJCSAgRERSX0VJRV9NQkVFIHwgRERSX0VJRV9TQkVFKTsKKworCQkvKiBzdG9yZSB0aGUgb3JpZ2luYWwgZXJyb3IgbWFuYWdlbWVudCB0aHJlc2hvbGQgKi8KKwkJb3JpZ19kZHJfZXJyX3NiZSA9IGRkcl9pbjMyKHBkYXRhLT5tY192YmFzZSArCisJCQkJCSAgICBGU0xfTUNfRVJSX1NCRSkgJiAweGZmMDAwMDsKKworCQkvKiBzZXQgdGhyZXNob2xkIHRvIDEgZXJyb3IgcGVyIGludGVycnVwdCAqLworCQlkZHJfb3V0MzIocGRhdGEtPm1jX3ZiYXNlICsgRlNMX01DX0VSUl9TQkUsIDB4MTAwMDApOworCisJCS8qIHJlZ2lzdGVyIGludGVycnVwdHMgKi8KKwkJcGRhdGEtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEob3AsIDApOworCQlyZXMgPSBkZXZtX3JlcXVlc3RfaXJxKCZvcC0+ZGV2LCBwZGF0YS0+aXJxLAorCQkJCSAgICAgICBmc2xfbWNfaXNyLAorCQkJCSAgICAgICBJUlFGX1NIQVJFRCwKKwkJCQkgICAgICAgIltFREFDXSBNQyBlcnIiLCBtY2kpOworCQlpZiAocmVzIDwgMCkgeworCQkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHJlcXVlc3QgaXJxICVkIGZvciBGU0wgRERSIERSQU0gRVJSXG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBwZGF0YS0+aXJxKTsKKwkJCXJlcyA9IC1FTk9ERVY7CisJCQlnb3RvIGVycjI7CisJCX0KKworCQlwcl9pbmZvKEVEQUNfTU9EX1NUUiAiIGFjcXVpcmVkIGlycSAlZCBmb3IgTUNcbiIsCisJCSAgICAgICBwZGF0YS0+aXJxKTsKKwl9CisKKwlkZXZyZXNfcmVtb3ZlX2dyb3VwKCZvcC0+ZGV2LCBmc2xfbWNfZXJyX3Byb2JlKTsKKwllZGFjX2RiZygzLCAic3VjY2Vzc1xuIik7CisJcHJfaW5mbyhFREFDX01PRF9TVFIgIiBNQyBlcnIgcmVnaXN0ZXJlZFxuIik7CisKKwlyZXR1cm4gMDsKKworZXJyMjoKKwllZGFjX21jX2RlbF9tYygmb3AtPmRldik7CitlcnI6CisJZGV2cmVzX3JlbGVhc2VfZ3JvdXAoJm9wLT5kZXYsIGZzbF9tY19lcnJfcHJvYmUpOworCWVkYWNfbWNfZnJlZShtY2kpOworCXJldHVybiByZXM7Cit9CisKK2ludCBmc2xfbWNfZXJyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCkKK3sKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kgPSBkZXZfZ2V0X2RydmRhdGEoJm9wLT5kZXYpOworCXN0cnVjdCBmc2xfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKKworCWVkYWNfZGJnKDAsICJcbiIpOworCisJaWYgKGVkYWNfb3Bfc3RhdGUgPT0gRURBQ19PUFNUQVRFX0lOVCkgeworCQlkZHJfb3V0MzIocGRhdGEtPm1jX3ZiYXNlICsgRlNMX01DX0VSUl9JTlRfRU4sIDApOworCX0KKworCWRkcl9vdXQzMihwZGF0YS0+bWNfdmJhc2UgKyBGU0xfTUNfRVJSX0RJU0FCTEUsCisJCSAgb3JpZ19kZHJfZXJyX2Rpc2FibGUpOworCWRkcl9vdXQzMihwZGF0YS0+bWNfdmJhc2UgKyBGU0xfTUNfRVJSX1NCRSwgb3JpZ19kZHJfZXJyX3NiZSk7CisKKwllZGFjX21jX2RlbF9tYygmb3AtPmRldik7CisJZWRhY19tY19mcmVlKG1jaSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvZnNsX2Rkcl9lZGFjLmggYi9kcml2ZXJzL2VkYWMvZnNsX2Rkcl9lZGFjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNjZWUyOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZWRhYy9mc2xfZGRyX2VkYWMuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogRnJlZXNjYWxlIE1lbW9yeSBDb250cm9sbGVyIGtlcm5lbCBtb2R1bGUKKyAqCisgKiBTdXBwb3J0ICBQb3dlci1iYXNlZCBTb0NzIGluY2x1ZGluZyBNUEM4NXh4LCBNUEM4Nnh4LCBNUEM4M3h4IGFuZAorICogQVJNLWJhc2VkIExheWVyc2NhcGUgU29DcyBpbmNsdWRpbmcgTFMyeHh4LiBPcmlnaW5hbGx5IHNwbGl0CisgKiBvdXQgZnJvbSBtcGM4NXh4X2VkYWMgRURBQyBkcml2ZXIuCisgKgorICogQXV0aG9yOiBEYXZlIEppYW5nIDxkamlhbmdAbXZpc3RhLmNvbT4KKyAqCisgKiAyMDA2LTIwMDcgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtCisgKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuCisgKgorICovCisjaWZuZGVmIF9GU0xfRERSX0VEQUNfSF8KKyNkZWZpbmUgX0ZTTF9ERFJfRURBQ19IXworCisjZGVmaW5lIGZzbF9tY19wcmludGsobWNpLCBsZXZlbCwgZm10LCBhcmcuLi4pIFwKKwllZGFjX21jX2NoaXBzZXRfcHJpbnRrKG1jaSwgbGV2ZWwsICJGU0xfRERSIiwgZm10LCAjI2FyZykKKworLyoKKyAqIERSQU0gZXJyb3IgZGVmaW5lcworICovCisKKy8qIEREUl9TRFJBTV9DRkcgKi8KKyNkZWZpbmUgRlNMX01DX0REUl9TRFJBTV9DRkcJMHgwMTEwCisjZGVmaW5lIEZTTF9NQ19DU19CTkRTXzAJCTB4MDAwMAorI2RlZmluZSBGU0xfTUNfQ1NfQk5EU19PRlMJCTB4MDAwOAorCisjZGVmaW5lIEZTTF9NQ19EQVRBX0VSUl9JTkpFQ1RfSEkJMHgwZTAwCisjZGVmaW5lIEZTTF9NQ19EQVRBX0VSUl9JTkpFQ1RfTE8JMHgwZTA0CisjZGVmaW5lIEZTTF9NQ19FQ0NfRVJSX0lOSkVDVAkweDBlMDgKKyNkZWZpbmUgRlNMX01DX0NBUFRVUkVfREFUQV9ISQkweDBlMjAKKyNkZWZpbmUgRlNMX01DX0NBUFRVUkVfREFUQV9MTwkweDBlMjQKKyNkZWZpbmUgRlNMX01DX0NBUFRVUkVfRUNDCQkweDBlMjgKKyNkZWZpbmUgRlNMX01DX0VSUl9ERVRFQ1QJCTB4MGU0MAorI2RlZmluZSBGU0xfTUNfRVJSX0RJU0FCTEUJCTB4MGU0NAorI2RlZmluZSBGU0xfTUNfRVJSX0lOVF9FTgkJMHgwZTQ4CisjZGVmaW5lIEZTTF9NQ19DQVBUVVJFX0FUUklCVVRFUwkweDBlNGMKKyNkZWZpbmUgRlNMX01DX0NBUFRVUkVfQUREUkVTUwkweDBlNTAKKyNkZWZpbmUgRlNMX01DX0NBUFRVUkVfRVhUX0FERFJFU1MJMHgwZTU0CisjZGVmaW5lIEZTTF9NQ19FUlJfU0JFCQkweDBlNTgKKworI2RlZmluZSBEU0NfTUVNX0VOCTB4ODAwMDAwMDAKKyNkZWZpbmUgRFNDX0VDQ19FTgkweDIwMDAwMDAwCisjZGVmaW5lIERTQ19SRF9FTgkweDEwMDAwMDAwCisjZGVmaW5lIERTQ19EQldfTUFTSwkweDAwMTgwMDAwCisjZGVmaW5lIERTQ19EQldfMzIJMHgwMDA4MDAwMAorI2RlZmluZSBEU0NfREJXXzY0CTB4MDAwMDAwMDAKKworI2RlZmluZSBEU0NfU0RUWVBFX01BU0sJCTB4MDcwMDAwMDAKKyNkZWZpbmUgRFNDX1gzMl9FTgkweDAwMDAwMDIwCisKKy8qIEVycl9JbnRfRW4gKi8KKyNkZWZpbmUgRERSX0VJRV9NU0VFCTB4MQkvKiBtZW1vcnkgc2VsZWN0ICovCisjZGVmaW5lIEREUl9FSUVfU0JFRQkweDQJLyogc2luZ2xlLWJpdCBFQ0MgZXJyb3IgKi8KKyNkZWZpbmUgRERSX0VJRV9NQkVFCTB4OAkvKiBtdWx0aS1iaXQgRUNDIGVycm9yICovCisKKy8qIEVycl9EZXRlY3QgKi8KKyNkZWZpbmUgRERSX0VERV9NU0UJCTB4MQkvKiBtZW1vcnkgc2VsZWN0ICovCisjZGVmaW5lIEREUl9FREVfU0JFCQkweDQJLyogc2luZ2xlLWJpdCBFQ0MgZXJyb3IgKi8KKyNkZWZpbmUgRERSX0VERV9NQkUJCTB4OAkvKiBtdWx0aS1iaXQgRUNDIGVycm9yICovCisjZGVmaW5lIEREUl9FREVfTU1FCQkweDgwMDAwMDAwCS8qIG11bHRpcGxlIG1lbW9yeSBlcnJvcnMgKi8KKworLyogRXJyX0Rpc2FibGUgKi8KKyNkZWZpbmUgRERSX0VESV9NU0VECTB4MQkvKiBtZW1vcnkgc2VsZWN0IGRpc2FibGUgKi8KKyNkZWZpbmUJRERSX0VESV9TQkVECTB4NAkvKiBzaW5nbGUtYml0IEVDQyBlcnJvciBkaXNhYmxlICovCisjZGVmaW5lCUREUl9FRElfTUJFRAkweDgJLyogbXVsdGktYml0IEVDQyBlcnJvciBkaXNhYmxlICovCisKK3N0cnVjdCBmc2xfbWNfcGRhdGEgeworCWNoYXIgKm5hbWU7CisJaW50IGVkYWNfaWR4OworCXZvaWQgX19pb21lbSAqbWNfdmJhc2U7CisJaW50IGlycTsKK307CitpbnQgZnNsX21jX2Vycl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCk7CitpbnQgZnNsX21jX2Vycl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3ApOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvbGF5ZXJzY2FwZV9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvbGF5ZXJzY2FwZV9lZGFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1OWQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZWRhYy9sYXllcnNjYXBlX2VkYWMuYwpAQCAtMCwwICsxLDczIEBACisvKgorICogRnJlZXNjYWxlIE1lbW9yeSBDb250cm9sbGVyIGtlcm5lbCBtb2R1bGUKKyAqCisgKiBBdXRob3I6IFlvcmsgU3VuIDx5b3JrLnN1bkBueHAuY29tPgorICoKKyAqIENvcHlyaWdodCAyMDE2IE5YUCBTZW1pY29uZHVjdG9yCisgKgorICogRGVyaXZlZCBmcm9tIG1wYzg1eHhfZWRhYy5jCisgKiBBdXRob3I6IERhdmUgSmlhbmcgPGRqaWFuZ0BtdmlzdGEuY29tPgorICoKKyAqIDIwMDYtMjAwNyAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpbmNsdWRlICJlZGFjX2NvcmUuaCIKKyNpbmNsdWRlICJmc2xfZGRyX2VkYWMuaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZnNsX2Rkcl9tY19lcnJfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZzbCxxb3JpcS1tZW1vcnktY29udHJvbGxlciIsIH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgZnNsX2Rkcl9tY19lcnJfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBmc2xfZGRyX21jX2Vycl9kcml2ZXIgPSB7CisJLnByb2JlID0gZnNsX21jX2Vycl9wcm9iZSwKKwkucmVtb3ZlID0gZnNsX21jX2Vycl9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiZnNsX2Rkcl9tY19lcnIiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBmc2xfZGRyX21jX2Vycl9vZl9tYXRjaCwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgZnNsX2Rkcl9tY19pbml0KHZvaWQpCit7CisJaW50IHJlczsKKworCS8qIG1ha2Ugc3VyZSBlcnJvciByZXBvcnRpbmcgbWV0aG9kIGlzIHNhbmUgKi8KKwlzd2l0Y2ggKGVkYWNfb3Bfc3RhdGUpIHsKKwljYXNlIEVEQUNfT1BTVEFURV9QT0xMOgorCWNhc2UgRURBQ19PUFNUQVRFX0lOVDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZWRhY19vcF9zdGF0ZSA9IEVEQUNfT1BTVEFURV9JTlQ7CisJCWJyZWFrOworCX0KKworCXJlcyA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZnNsX2Rkcl9tY19lcnJfZHJpdmVyKTsKKwlpZiAocmVzKSB7CisJCXByX2VycigiTUMgZmFpbHMgdG8gcmVnaXN0ZXJcbiIpOworCQlyZXR1cm4gcmVzOworCX0KKworCXJldHVybiAwOworfQorCittb2R1bGVfaW5pdChmc2xfZGRyX21jX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgZnNsX2Rkcl9tY19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmZzbF9kZHJfbWNfZXJyX2RyaXZlcik7Cit9CisKK21vZHVsZV9leGl0KGZzbF9kZHJfbWNfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIk5YUCBTZW1pY29uZHVjdG9yIik7Cittb2R1bGVfcGFyYW0oZWRhY19vcF9zdGF0ZSwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZWRhY19vcF9zdGF0ZSwKKwkJICJFREFDIEVycm9yIFJlcG9ydGluZyBzdGF0ZTogMD1Qb2xsLCAyPUludGVycnVwdCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL21jZV9hbWQuYyBiL2RyaXZlcnMvZWRhYy9tY2VfYW1kLmMKaW5kZXggOWI2ODAwYS4uZGFhYWMyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL21jZV9hbWQuYworKysgYi9kcml2ZXJzL2VkYWMvbWNlX2FtZC5jCkBAIC0xNDgsMTIgKzE0OCwxMiBAQAogfTsKIAogLyogU2NhbGFibGUgTUNBIGVycm9yIHN0cmluZ3MgKi8KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZjE3aF9sc19tY2VfZGVzY1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzbWNhX2xzX21jZV9kZXNjW10gPSB7CiAJIkxvYWQgcXVldWUgcGFyaXR5IiwKIAkiU3RvcmUgcXVldWUgcGFyaXR5IiwKIAkiTWlzcyBhZGRyZXNzIGJ1ZmZlciBwYXlsb2FkIHBhcml0eSIsCiAJIkwxIFRMQiBwYXJpdHkiLAotCSIiLAkJCQkJCS8qIHJlc2VydmVkICovCisJIlJlc2VydmVkIiwKIAkiREMgdGFnIGVycm9yIHR5cGUgNiIsCiAJIkRDIHRhZyBlcnJvciB0eXBlIDEiLAogCSJJbnRlcm5hbCBlcnJvciB0eXBlIDEiLApAQCAtMTcyLDcgKzE3Miw3IEBACiAJIkwyIGZpbGwgZGF0YSBlcnJvciIsCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGYxN2hfaWZfbWNlX2Rlc2NbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc21jYV9pZl9tY2VfZGVzY1tdID0gewogCSJtaWNyb3RhZyBwcm9iZSBwb3J0IHBhcml0eSBlcnJvciIsCiAJIklDIG1pY3JvdGFnIG9yIGZ1bGwgdGFnIG11bHRpLWhpdCBlcnJvciIsCiAJIklDIGZ1bGwgdGFnIHBhcml0eSIsCkBAIC0xODUsMTkgKzE4NSwyMiBAQAogCSJCUFEgc25vb3AgcGFyaXR5IG9uIFRocmVhZCAxIiwKIAkiTDEgQlRCIG11bHRpLW1hdGNoIGVycm9yIiwKIAkiTDIgQlRCIG11bHRpLW1hdGNoIGVycm9yIiwKKwkiTDIgQ2FjaGUgUmVzcG9uc2UgUG9pc29uIGVycm9yIiwKKwkiU3lzdGVtIFJlYWQgRGF0YSBlcnJvciIsCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGYxN2hfbDJfbWNlX2Rlc2NbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc21jYV9sMl9tY2VfZGVzY1tdID0gewogCSJMMk0gdGFnIG11bHRpLXdheS1oaXQgZXJyb3IiLAogCSJMMk0gdGFnIEVDQyBlcnJvciIsCiAJIkwyTSBkYXRhIEVDQyBlcnJvciIsCiAJIkhXIGFzc2VydCIsCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGYxN2hfZGVfbWNlX2Rlc2NbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc21jYV9kZV9tY2VfZGVzY1tdID0gewogCSJ1b3AgY2FjaGUgdGFnIHBhcml0eSBlcnJvciIsCiAJInVvcCBjYWNoZSBkYXRhIHBhcml0eSBlcnJvciIsCiAJIkluc24gYnVmZmVyIHBhcml0eSBlcnJvciIsCisJInVvcCBxdWV1ZSBwYXJpdHkgZXJyb3IiLAogCSJJbnNuIGRpc3BhdGNoIHF1ZXVlIHBhcml0eSBlcnJvciIsCiAJIkZldGNoIGFkZHJlc3MgRklGTyBwYXJpdHkiLAogCSJQYXRjaCBSQU0gZGF0YSBwYXJpdHkiLApAQCAtMjA1LDcgKzIwOCw3IEBACiAJInVvcCBidWZmZXIgcGFyaXR5IgogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmMTdoX2V4X21jZV9kZXNjW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNtY2FfZXhfbWNlX2Rlc2NbXSA9IHsKIAkiV2F0Y2hkb2cgdGltZW91dCBlcnJvciIsCiAJIlBoeSByZWdpc3RlciBmaWxlIHBhcml0eSIsCiAJIkZsYWcgcmVnaXN0ZXIgZmlsZSBwYXJpdHkiLApAQCAtMjE0LDE4ICsyMTcsMjIgQEAKIAkiRVggcGF5bG9hZCBwYXJpdHkiLAogCSJDaGVja3BvaW50IHF1ZXVlIHBhcml0eSIsCiAJIlJldGlyZSBkaXNwYXRjaCBxdWV1ZSBwYXJpdHkiLAorCSJSZXRpcmUgc3RhdHVzIHF1ZXVlIHBhcml0eSBlcnJvciIsCisJIlNjaGVkdWxpbmcgcXVldWUgcGFyaXR5IGVycm9yIiwKKwkiQnJhbmNoIGJ1ZmZlciBxdWV1ZSBwYXJpdHkgZXJyb3IiLAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmMTdoX2ZwX21jZV9kZXNjW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNtY2FfZnBfbWNlX2Rlc2NbXSA9IHsKIAkiUGh5c2ljYWwgcmVnaXN0ZXIgZmlsZSBwYXJpdHkiLAogCSJGcmVlbGlzdCBwYXJpdHkgZXJyb3IiLAogCSJTY2hlZHVsZSBxdWV1ZSBwYXJpdHkiLAogCSJOU1EgcGFyaXR5IGVycm9yIiwKIAkiUmV0aXJlIHF1ZXVlIHBhcml0eSIsCiAJIlN0YXR1cyByZWdpc3RlciBmaWxlIHBhcml0eSIsCisJIkhhcmR3YXJlIGFzc2VydGlvbiIsCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGYxN2hfbDNfbWNlX2Rlc2NbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc21jYV9sM19tY2VfZGVzY1tdID0gewogCSJTaGFkb3cgdGFnIG1hY3JvIEVDQyBlcnJvciIsCiAJIlNoYWRvdyB0YWcgbWFjcm8gbXVsdGktd2F5LWhpdCBlcnJvciIsCiAJIkwzTSB0YWcgRUNDIGVycm9yIiwKQEAgLTIzNiw3ICsyNDMsNyBAQAogCSJMMyBIVyBhc3NlcnQiLAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmMTdoX2NzX21jZV9kZXNjW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNtY2FfY3NfbWNlX2Rlc2NbXSA9IHsKIAkiSWxsZWdhbCByZXF1ZXN0IGZyb20gdHJhbnNwb3J0IGxheWVyIiwKIAkiQWRkcmVzcyB2aW9sYXRpb24iLAogCSJTZWN1cml0eSB2aW9sYXRpb24iLApAQCAtMjQ4LDE0ICsyNTUsMTQgQEAKIAkiRUNDIGVycm9yIG9uIHByb2JlIGZpbHRlciBhY2Nlc3MiLAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmMTdoX3BpZV9tY2VfZGVzY1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzbWNhX3BpZV9tY2VfZGVzY1tdID0gewogCSJIVyBhc3NlcnQiLAogCSJJbnRlcm5hbCBQSUUgcmVnaXN0ZXIgc2VjdXJpdHkgdmlvbGF0aW9uIiwKIAkiRXJyb3Igb24gR01JIGxpbmsiLAogCSJQb2lzb24gZGF0YSB3cml0dGVuIHRvIGludGVybmFsIFBJRSByZWdpc3RlciIsCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGYxN2hfdW1jX21jZV9kZXNjW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNtY2FfdW1jX21jZV9kZXNjW10gPSB7CiAJIkRSQU0gRUNDIGVycm9yIiwKIAkiRGF0YSBwb2lzb24gZXJyb3Igb24gRFJBTSIsCiAJIlNEUCBwYXJpdHkgZXJyb3IiLApAQCAtMjY0LDE4ICsyNzEsMzkgQEAKIAkiV3JpdGUgZGF0YSBDUkMgZXJyb3IiLAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmMTdoX3BiX21jZV9kZXNjW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNtY2FfcGJfbWNlX2Rlc2NbXSA9IHsKIAkiUGFyYW1ldGVyIEJsb2NrIFJBTSBFQ0MgZXJyb3IiLAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmMTdoX3BzcF9tY2VfZGVzY1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzbWNhX3BzcF9tY2VfZGVzY1tdID0gewogCSJQU1AgUkFNIEVDQyBvciBwYXJpdHkgZXJyb3IiLAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmMTdoX3NtdV9tY2VfZGVzY1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzbWNhX3NtdV9tY2VfZGVzY1tdID0gewogCSJTTVUgUkFNIEVDQyBvciBwYXJpdHkgZXJyb3IiLAogfTsKIAorc3RydWN0IHNtY2FfbWNlX2Rlc2MgeworCWNvbnN0IGNoYXIgKiBjb25zdCAqZGVzY3M7CisJdW5zaWduZWQgaW50IG51bV9kZXNjczsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc21jYV9tY2VfZGVzYyBzbWNhX21jZV9kZXNjc1tdID0geworCVtTTUNBX0xTXQk9IHsgc21jYV9sc19tY2VfZGVzYywJQVJSQVlfU0laRShzbWNhX2xzX21jZV9kZXNjKQl9LAorCVtTTUNBX0lGXQk9IHsgc21jYV9pZl9tY2VfZGVzYywJQVJSQVlfU0laRShzbWNhX2lmX21jZV9kZXNjKQl9LAorCVtTTUNBX0wyX0NBQ0hFXQk9IHsgc21jYV9sMl9tY2VfZGVzYywJQVJSQVlfU0laRShzbWNhX2wyX21jZV9kZXNjKQl9LAorCVtTTUNBX0RFXQk9IHsgc21jYV9kZV9tY2VfZGVzYywJQVJSQVlfU0laRShzbWNhX2RlX21jZV9kZXNjKQl9LAorCVtTTUNBX0VYXQk9IHsgc21jYV9leF9tY2VfZGVzYywJQVJSQVlfU0laRShzbWNhX2V4X21jZV9kZXNjKQl9LAorCVtTTUNBX0ZQXQk9IHsgc21jYV9mcF9tY2VfZGVzYywJQVJSQVlfU0laRShzbWNhX2ZwX21jZV9kZXNjKQl9LAorCVtTTUNBX0wzX0NBQ0hFXQk9IHsgc21jYV9sM19tY2VfZGVzYywJQVJSQVlfU0laRShzbWNhX2wzX21jZV9kZXNjKQl9LAorCVtTTUNBX0NTXQk9IHsgc21jYV9jc19tY2VfZGVzYywJQVJSQVlfU0laRShzbWNhX2NzX21jZV9kZXNjKQl9LAorCVtTTUNBX1BJRV0JPSB7IHNtY2FfcGllX21jZV9kZXNjLAlBUlJBWV9TSVpFKHNtY2FfcGllX21jZV9kZXNjKQl9LAorCVtTTUNBX1VNQ10JPSB7IHNtY2FfdW1jX21jZV9kZXNjLAlBUlJBWV9TSVpFKHNtY2FfdW1jX21jZV9kZXNjKQl9LAorCVtTTUNBX1BCXQk9IHsgc21jYV9wYl9tY2VfZGVzYywJQVJSQVlfU0laRShzbWNhX3BiX21jZV9kZXNjKQl9LAorCVtTTUNBX1BTUF0JPSB7IHNtY2FfcHNwX21jZV9kZXNjLAlBUlJBWV9TSVpFKHNtY2FfcHNwX21jZV9kZXNjKQl9LAorCVtTTUNBX1NNVV0JPSB7IHNtY2Ffc211X21jZV9kZXNjLAlBUlJBWV9TSVpFKHNtY2Ffc211X21jZV9kZXNjKQl9LAorfTsKKwogc3RhdGljIGJvb2wgZjEyaF9tYzBfbWNlKHUxNiBlYywgdTggeGVjKQogewogCWJvb2wgcmV0ID0gZmFsc2U7CkBAIC04MjAsMTc1ICs4NDgsMzUgQEAKIAlwcl9lbWVyZyhIV19FUlIgIkNvcnJ1cHRlZCBNQzYgTUNFIGluZm8/XG4iKTsKIH0KIAotc3RhdGljIHZvaWQgZGVjb2RlX2YxN2hfY29yZV9lcnJvcnMoY29uc3QgY2hhciAqaXBfbmFtZSwgdTggeGVjLAotCQkJCSAgIHVuc2lnbmVkIGludCBtY2FfdHlwZSkKLXsKLQljb25zdCBjaGFyICogY29uc3QgKmVycm9yX2Rlc2NfYXJyYXk7Ci0Jc2l6ZV90IGxlbjsKLQotCXByX2VtZXJnKEhXX0VSUiAiJXMgRXJyb3I6ICIsIGlwX25hbWUpOwotCi0Jc3dpdGNoIChtY2FfdHlwZSkgewotCWNhc2UgU01DQV9MUzoKLQkJZXJyb3JfZGVzY19hcnJheSA9IGYxN2hfbHNfbWNlX2Rlc2M7Ci0JCWxlbiA9IEFSUkFZX1NJWkUoZjE3aF9sc19tY2VfZGVzYykgLSAxOwotCi0JCWlmICh4ZWMgPT0gMHg0KSB7Ci0JCQlwcl9jb250KCJVbnJlY29nbml6ZWQgTFMgTUNBIGVycm9yIGNvZGUuXG4iKTsKLQkJCXJldHVybjsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgU01DQV9JRjoKLQkJZXJyb3JfZGVzY19hcnJheSA9IGYxN2hfaWZfbWNlX2Rlc2M7Ci0JCWxlbiA9IEFSUkFZX1NJWkUoZjE3aF9pZl9tY2VfZGVzYykgLSAxOwotCQlicmVhazsKLQotCWNhc2UgU01DQV9MMl9DQUNIRToKLQkJZXJyb3JfZGVzY19hcnJheSA9IGYxN2hfbDJfbWNlX2Rlc2M7Ci0JCWxlbiA9IEFSUkFZX1NJWkUoZjE3aF9sMl9tY2VfZGVzYykgLSAxOwotCQlicmVhazsKLQotCWNhc2UgU01DQV9ERToKLQkJZXJyb3JfZGVzY19hcnJheSA9IGYxN2hfZGVfbWNlX2Rlc2M7Ci0JCWxlbiA9IEFSUkFZX1NJWkUoZjE3aF9kZV9tY2VfZGVzYykgLSAxOwotCQlicmVhazsKLQotCWNhc2UgU01DQV9FWDoKLQkJZXJyb3JfZGVzY19hcnJheSA9IGYxN2hfZXhfbWNlX2Rlc2M7Ci0JCWxlbiA9IEFSUkFZX1NJWkUoZjE3aF9leF9tY2VfZGVzYykgLSAxOwotCQlicmVhazsKLQotCWNhc2UgU01DQV9GUDoKLQkJZXJyb3JfZGVzY19hcnJheSA9IGYxN2hfZnBfbWNlX2Rlc2M7Ci0JCWxlbiA9IEFSUkFZX1NJWkUoZjE3aF9mcF9tY2VfZGVzYykgLSAxOwotCQlicmVhazsKLQotCWNhc2UgU01DQV9MM19DQUNIRToKLQkJZXJyb3JfZGVzY19hcnJheSA9IGYxN2hfbDNfbWNlX2Rlc2M7Ci0JCWxlbiA9IEFSUkFZX1NJWkUoZjE3aF9sM19tY2VfZGVzYykgLSAxOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXByX2NvbnQoIkNvcnJ1cHRlZCBNQ0EgY29yZSBlcnJvciBpbmZvLlxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoeGVjID4gbGVuKSB7Ci0JCXByX2NvbnQoIlVucmVjb2duaXplZCAlcyBNQ0EgYmFuayBlcnJvciBjb2RlLlxuIiwKLQkJCSBhbWRfY29yZV9tY2FibG9ja19uYW1lc1ttY2FfdHlwZV0pOwotCQlyZXR1cm47Ci0JfQotCi0JcHJfY29udCgiJXMuXG4iLCBlcnJvcl9kZXNjX2FycmF5W3hlY10pOwotfQotCi1zdGF0aWMgdm9pZCBkZWNvZGVfZGZfZXJyb3JzKHU4IHhlYywgdW5zaWduZWQgaW50IG1jYV90eXBlKQotewotCWNvbnN0IGNoYXIgKiBjb25zdCAqZXJyb3JfZGVzY19hcnJheTsKLQlzaXplX3QgbGVuOwotCi0JcHJfZW1lcmcoSFdfRVJSICJEYXRhIEZhYnJpYyBFcnJvcjogIik7Ci0KLQlzd2l0Y2ggKG1jYV90eXBlKSB7Ci0JY2FzZSAgU01DQV9DUzoKLQkJZXJyb3JfZGVzY19hcnJheSA9IGYxN2hfY3NfbWNlX2Rlc2M7Ci0JCWxlbiA9IEFSUkFZX1NJWkUoZjE3aF9jc19tY2VfZGVzYykgLSAxOwotCQlicmVhazsKLQotCWNhc2UgU01DQV9QSUU6Ci0JCWVycm9yX2Rlc2NfYXJyYXkgPSBmMTdoX3BpZV9tY2VfZGVzYzsKLQkJbGVuID0gQVJSQVlfU0laRShmMTdoX3BpZV9tY2VfZGVzYykgLSAxOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXByX2NvbnQoIkNvcnJ1cHRlZCBNQ0EgRGF0YSBGYWJyaWMgaW5mby5cbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHhlYyA+IGxlbikgewotCQlwcl9jb250KCJVbnJlY29nbml6ZWQgJXMgTUNBIGJhbmsgZXJyb3IgY29kZS5cbiIsCi0JCQkgYW1kX2RmX21jYWJsb2NrX25hbWVzW21jYV90eXBlXSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwcl9jb250KCIlcy5cbiIsIGVycm9yX2Rlc2NfYXJyYXlbeGVjXSk7Ci19Ci0KIC8qIERlY29kZSBlcnJvcnMgYWNjb3JkaW5nIHRvIFNjYWxhYmxlIE1DQSBzcGVjaWZpY2F0aW9uICovCiBzdGF0aWMgdm9pZCBkZWNvZGVfc21jYV9lcnJvcnMoc3RydWN0IG1jZSAqbSkKIHsKLQl1MzIgYWRkciA9IE1TUl9BTUQ2NF9TTUNBX01DeF9JUElEKG0tPmJhbmspOwotCXVuc2lnbmVkIGludCBod2lkLCBtY2FfdHlwZSwgaTsKLQl1OCB4ZWMgPSBYRUMobS0+c3RhdHVzLCB4ZWNfbWFzayk7Ci0JY29uc3QgY2hhciAqIGNvbnN0ICplcnJvcl9kZXNjX2FycmF5OworCXN0cnVjdCBzbWNhX2h3aWRfbWNhdHlwZSAqdHlwZTsKKwl1bnNpZ25lZCBpbnQgYmFua190eXBlOwogCWNvbnN0IGNoYXIgKmlwX25hbWU7Ci0JdTMyIGxvdywgaGlnaDsKLQlzaXplX3QgbGVuOworCXU4IHhlYyA9IFhFQyhtLT5zdGF0dXMsIHhlY19tYXNrKTsKIAotCWlmIChyZG1zcl9zYWZlKGFkZHIsICZsb3csICZoaWdoKSkgewotCQlwcl9lbWVyZygiSW52YWxpZCBJUCBibG9jayBzcGVjaWZpZWQsIGVycm9yIGluZm9ybWF0aW9uIGlzIHVucmVsaWFibGUuXG4iKTsKKwlpZiAobS0+YmFuayA+PSBBUlJBWV9TSVpFKHNtY2FfYmFua3MpKQogCQlyZXR1cm47Ci0JfQogCi0JaHdpZCA9IGhpZ2ggJiBNQ0lfSVBJRF9IV0lEOwotCW1jYV90eXBlID0gKGhpZ2ggJiBNQ0lfSVBJRF9NQ0FUWVBFKSA+PiAxNjsKKwlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPj0gMHgxNyAmJiBtLT5iYW5rID09IDQpCisJCXByX2VtZXJnKEhXX0VSUiAiQmFuayA0IGlzIHJlc2VydmVkIG9uIEZhbTE3aC5cbiIpOwogCi0JcHJfZW1lcmcoSFdfRVJSICJNQyVkIElQSUQgdmFsdWU6IDB4JTA4eCUwOHhcbiIsIG0tPmJhbmssIGhpZ2gsIGxvdyk7Ci0KLQkvKgotCSAqIEJhc2VkIG9uIGh3aWQgYW5kIG1jYV90eXBlIHZhbHVlcywgZGVjb2RlIGVycm9ycyBmcm9tIHJlc3BlY3RpdmUgSVBzLgotCSAqIE5vdGU6IG1jYV90eXBlIHZhbHVlcyBtYWtlIHNlbnNlIG9ubHkgaW4gdGhlIGNvbnRleHQgb2YgYW4gaHdpZC4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhbWRfaHdpZHMpOyBpKyspCi0JCWlmIChhbWRfaHdpZHNbaV0uaHdpZCA9PSBod2lkKQotCQkJYnJlYWs7Ci0KLQlzd2l0Y2ggKGkpIHsKLQljYXNlIFNNQ0FfRjE3SF9DT1JFOgotCQlpcF9uYW1lID0gKG1jYV90eXBlID09IFNNQ0FfTDNfQ0FDSEUpID8KLQkJCSAgIkwzIENhY2hlIiA6ICJGMTdoIENvcmUiOwotCQlyZXR1cm4gZGVjb2RlX2YxN2hfY29yZV9lcnJvcnMoaXBfbmFtZSwgeGVjLCBtY2FfdHlwZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTTUNBX0RGOgotCQlyZXR1cm4gZGVjb2RlX2RmX2Vycm9ycyh4ZWMsIG1jYV90eXBlKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNNQ0FfVU1DOgotCQllcnJvcl9kZXNjX2FycmF5ID0gZjE3aF91bWNfbWNlX2Rlc2M7Ci0JCWxlbiA9IEFSUkFZX1NJWkUoZjE3aF91bWNfbWNlX2Rlc2MpIC0gMTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNNQ0FfUEI6Ci0JCWVycm9yX2Rlc2NfYXJyYXkgPSBmMTdoX3BiX21jZV9kZXNjOwotCQlsZW4gPSBBUlJBWV9TSVpFKGYxN2hfcGJfbWNlX2Rlc2MpIC0gMTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNNQ0FfUFNQOgotCQllcnJvcl9kZXNjX2FycmF5ID0gZjE3aF9wc3BfbWNlX2Rlc2M7Ci0JCWxlbiA9IEFSUkFZX1NJWkUoZjE3aF9wc3BfbWNlX2Rlc2MpIC0gMTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNNQ0FfU01VOgotCQllcnJvcl9kZXNjX2FycmF5ID0gZjE3aF9zbXVfbWNlX2Rlc2M7Ci0JCWxlbiA9IEFSUkFZX1NJWkUoZjE3aF9zbXVfbWNlX2Rlc2MpIC0gMTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwcl9lbWVyZyhIV19FUlIgIkhXSUQ6JWQgZG9lcyBub3QgbWF0Y2ggYW55IGV4aXN0aW5nIElQcy5cbiIsIGh3aWQpOworCXR5cGUgPSBzbWNhX2JhbmtzW20tPmJhbmtdLnR5cGU7CisJaWYgKCF0eXBlKQogCQlyZXR1cm47CisKKwliYW5rX3R5cGUgPSB0eXBlLT5iYW5rX3R5cGU7CisJaXBfbmFtZSA9IHNtY2FfYmFua19uYW1lc1tiYW5rX3R5cGVdLmxvbmdfbmFtZTsKKworCXByX2VtZXJnKEhXX0VSUiAiJXMgRXh0ZW5kZWQgRXJyb3IgQ29kZTogJWRcbiIsIGlwX25hbWUsIHhlYyk7CisKKwkvKiBPbmx5IHByaW50IHRoZSBkZWNvZGUgb2YgdmFsaWQgZXJyb3IgY29kZXMgKi8KKwlpZiAoeGVjIDwgc21jYV9tY2VfZGVzY3NbYmFua190eXBlXS5udW1fZGVzY3MgJiYKKwkJCSh0eXBlLT54ZWNfYml0bWFwICYgQklUX1VMTCh4ZWMpKSkgeworCQlwcl9lbWVyZyhIV19FUlIgIiVzIEVycm9yOiAiLCBpcF9uYW1lKTsKKwkJcHJfY29udCgiJXMuXG4iLCBzbWNhX21jZV9kZXNjc1tiYW5rX3R5cGVdLmRlc2NzW3hlY10pOwogCX0KLQotCWlwX25hbWUgPSBhbWRfaHdpZHNbaV0ubmFtZTsKLQlwcl9lbWVyZyhIV19FUlIgIiVzIEVycm9yOiAiLCBpcF9uYW1lKTsKLQotCWlmICh4ZWMgPiBsZW4pIHsKLQkJcHJfY29udCgiVW5yZWNvZ25pemVkICVzIE1DQSBiYW5rIGVycm9yIGNvZGUuXG4iLCBpcF9uYW1lKTsKLQkJcmV0dXJuOwotCX0KLQotCXByX2NvbnQoIiVzLlxuIiwgZXJyb3JfZGVzY19hcnJheVt4ZWNdKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGFtZF9kZWNvZGVfZXJyX2NvZGUodTE2IGVjKQpAQCAtMTA3OCw2ICs5NjYsOCBAQAogCQl1MzIgbG93LCBoaWdoOwogCQl1MzIgYWRkciA9IE1TUl9BTUQ2NF9TTUNBX01DeF9DT05GSUcobS0+YmFuayk7CiAKKwkJcHJfY29udCgifCVzIiwgKChtLT5zdGF0dXMgJiBNQ0lfU1RBVFVTX1NZTkRWKSA/ICJTeW5kViIgOiAiLSIpKTsKKwogCQlpZiAoIXJkbXNyX3NhZmUoYWRkciwgJmxvdywgJmhpZ2gpICYmCiAJCSAgICAobG93ICYgTUNJX0NPTkZJR19NQ0FYKSkKIAkJCXByX2NvbnQoInwlcyIsICgobS0+c3RhdHVzICYgTUNJX1NUQVRVU19UQ0MpID8gIlRDQyIgOiAiLSIpKTsKQEAgLTEwOTEsMTIgKzk4MSwyMCBAQAogCXByX2NvbnQoIl06IDB4JTAxNmxseFxuIiwgbS0+c3RhdHVzKTsKIAogCWlmIChtLT5zdGF0dXMgJiBNQ0lfU1RBVFVTX0FERFJWKQotCQlwcl9lbWVyZyhIV19FUlIgIk1DJWQgRXJyb3IgQWRkcmVzczogMHglMDE2bGx4XG4iLCBtLT5iYW5rLCBtLT5hZGRyKTsKKwkJcHJfZW1lcmcoSFdfRVJSICJFcnJvciBBZGRyOiAweCUwMTZsbHgiLCBtLT5hZGRyKTsKIAogCWlmIChib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfU01DQSkpIHsKKwkJaWYgKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfU1lORFYpCisJCQlwcl9jb250KCIsIFN5bmRyb21lOiAweCUwMTZsbHgiLCBtLT5zeW5kKTsKKworCQlwcl9jb250KCIsIElQSUQ6IDB4JTAxNmxseCIsIG0tPmlwaWQpOworCisJCXByX2NvbnQoIlxuIik7CisKIAkJZGVjb2RlX3NtY2FfZXJyb3JzKG0pOwogCQlnb3RvIGVycl9jb2RlOwotCX0KKwl9IGVsc2UKKwkJcHJfY29udCgiXG4iKTsKIAogCWlmICghZmFtX29wcykKIAkJZ290byBlcnJfY29kZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9tcGM4NXh4X2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9tcGM4NXh4X2VkYWMuYwppbmRleCBjYTYzZDBkLi5mZjA1Njc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvbXBjODV4eF9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL21wYzg1eHhfZWRhYy5jCkBAIC0yNywxNSArMjcsMTIgQEAKICNpbmNsdWRlICJlZGFjX21vZHVsZS5oIgogI2luY2x1ZGUgImVkYWNfY29yZS5oIgogI2luY2x1ZGUgIm1wYzg1eHhfZWRhYy5oIgorI2luY2x1ZGUgImZzbF9kZHJfZWRhYy5oIgogCiBzdGF0aWMgaW50IGVkYWNfZGV2X2lkeDsKICNpZmRlZiBDT05GSUdfUENJCiBzdGF0aWMgaW50IGVkYWNfcGNpX2lkeDsKICNlbmRpZgotc3RhdGljIGludCBlZGFjX21jX2lkeDsKLQotc3RhdGljIHUzMiBvcmlnX2Rkcl9lcnJfZGlzYWJsZTsKLXN0YXRpYyB1MzIgb3JpZ19kZHJfZXJyX3NiZTsKIAogLyoKICAqIFBDSSBFcnIgZGVmaW5lcwpAQCAtNDYsMTAzICs0Myw2IEBACiAjZW5kaWYKIAogc3RhdGljIHUzMiBvcmlnX2wyX2Vycl9kaXNhYmxlOwotI2lmZGVmIENPTkZJR19GU0xfU09DX0JPT0tFCi1zdGF0aWMgdTMyIG9yaWdfaGlkMVsyXTsKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqIE1DIFNZU0ZTIHBhcnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIHRvX21jaShrKSBjb250YWluZXJfb2Yoaywgc3RydWN0IG1lbV9jdGxfaW5mbywgZGV2KQotCi1zdGF0aWMgc3NpemVfdCBtcGM4NXh4X21jX2luamVjdF9kYXRhX2hpX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqbWF0dHIsCi0JCQkJCSAgICAgIGNoYXIgKmRhdGEpCi17Ci0Jc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpID0gdG9fbWNpKGRldik7Ci0Jc3RydWN0IG1wYzg1eHhfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKLQlyZXR1cm4gc3ByaW50ZihkYXRhLCAiMHglMDh4IiwKLQkJICAgICAgIGluX2JlMzIocGRhdGEtPm1jX3ZiYXNlICsKLQkJCSAgICAgICBNUEM4NVhYX01DX0RBVEFfRVJSX0lOSkVDVF9ISSkpOwotfQotCi1zdGF0aWMgc3NpemVfdCBtcGM4NXh4X21jX2luamVjdF9kYXRhX2xvX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqbWF0dHIsCi0JCQkJCSAgICAgIGNoYXIgKmRhdGEpCi17Ci0Jc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpID0gdG9fbWNpKGRldik7Ci0Jc3RydWN0IG1wYzg1eHhfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKLQlyZXR1cm4gc3ByaW50ZihkYXRhLCAiMHglMDh4IiwKLQkJICAgICAgIGluX2JlMzIocGRhdGEtPm1jX3ZiYXNlICsKLQkJCSAgICAgICBNUEM4NVhYX01DX0RBVEFfRVJSX0lOSkVDVF9MTykpOwotfQotCi1zdGF0aWMgc3NpemVfdCBtcGM4NXh4X21jX2luamVjdF9jdHJsX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqbWF0dHIsCi0JCQkJCSAgIGNoYXIgKmRhdGEpCi17Ci0Jc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpID0gdG9fbWNpKGRldik7Ci0Jc3RydWN0IG1wYzg1eHhfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKLQlyZXR1cm4gc3ByaW50ZihkYXRhLCAiMHglMDh4IiwKLQkJICAgICAgIGluX2JlMzIocGRhdGEtPm1jX3ZiYXNlICsgTVBDODVYWF9NQ19FQ0NfRVJSX0lOSkVDVCkpOwotfQotCi1zdGF0aWMgc3NpemVfdCBtcGM4NXh4X21jX2luamVjdF9kYXRhX2hpX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICptYXR0ciwKLQkJCQkJICAgICAgIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kgPSB0b19tY2koZGV2KTsKLQlzdHJ1Y3QgbXBjODV4eF9tY19wZGF0YSAqcGRhdGEgPSBtY2ktPnB2dF9pbmZvOwotCWlmIChpc2RpZ2l0KCpkYXRhKSkgewotCQlvdXRfYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0RBVEFfRVJSX0lOSkVDVF9ISSwKLQkJCSBzaW1wbGVfc3RydG91bChkYXRhLCBOVUxMLCAwKSk7Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IG1wYzg1eHhfbWNfaW5qZWN0X2RhdGFfbG9fc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKm1hdHRyLAotCQkJCQkgICAgICAgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IHRvX21jaShkZXYpOwotCXN0cnVjdCBtcGM4NXh4X21jX3BkYXRhICpwZGF0YSA9IG1jaS0+cHZ0X2luZm87Ci0JaWYgKGlzZGlnaXQoKmRhdGEpKSB7Ci0JCW91dF9iZTMyKHBkYXRhLT5tY192YmFzZSArIE1QQzg1WFhfTUNfREFUQV9FUlJfSU5KRUNUX0xPLAotCQkJIHNpbXBsZV9zdHJ0b3VsKGRhdGEsIE5VTEwsIDApKTsKLQkJcmV0dXJuIGNvdW50OwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgbXBjODV4eF9tY19pbmplY3RfY3RybF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqbWF0dHIsCi0JCQkJCSAgICAgICBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpID0gdG9fbWNpKGRldik7Ci0Jc3RydWN0IG1wYzg1eHhfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKLQlpZiAoaXNkaWdpdCgqZGF0YSkpIHsKLQkJb3V0X2JlMzIocGRhdGEtPm1jX3ZiYXNlICsgTVBDODVYWF9NQ19FQ0NfRVJSX0lOSkVDVCwKLQkJCSBzaW1wbGVfc3RydG91bChkYXRhLCBOVUxMLCAwKSk7Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLURFVklDRV9BVFRSKGluamVjdF9kYXRhX2hpLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkgICAgbXBjODV4eF9tY19pbmplY3RfZGF0YV9oaV9zaG93LCBtcGM4NXh4X21jX2luamVjdF9kYXRhX2hpX3N0b3JlKTsKLURFVklDRV9BVFRSKGluamVjdF9kYXRhX2xvLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkgICAgbXBjODV4eF9tY19pbmplY3RfZGF0YV9sb19zaG93LCBtcGM4NXh4X21jX2luamVjdF9kYXRhX2xvX3N0b3JlKTsKLURFVklDRV9BVFRSKGluamVjdF9jdHJsLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkgICAgbXBjODV4eF9tY19pbmplY3RfY3RybF9zaG93LCBtcGM4NXh4X21jX2luamVjdF9jdHJsX3N0b3JlKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm1wYzg1eHhfZGV2X2F0dHJzW10gPSB7Ci0JJmRldl9hdHRyX2luamVjdF9kYXRhX2hpLmF0dHIsCi0JJmRldl9hdHRyX2luamVjdF9kYXRhX2xvLmF0dHIsCi0JJmRldl9hdHRyX2luamVjdF9jdHJsLmF0dHIsCi0JTlVMTAotfTsKLQotQVRUUklCVVRFX0dST1VQUyhtcGM4NXh4X2Rldik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBDSSBFcnIgZGV2aWNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZmRlZiBDT05GSUdfUENJCkBAIC0xNjAsMTggKzYwLDE4IEBACiAJCXJldHVybjsKIAl9CiAKLQlwcmludGsoS0VSTl9FUlIgIlBDSSBlcnJvcihzKSBkZXRlY3RlZFxuIik7Ci0JcHJpbnRrKEtFUk5fRVJSICJQQ0kvWCBFUlJfRFIgcmVnaXN0ZXI6ICUjMDh4XG4iLCBlcnJfZGV0ZWN0KTsKKwlwcl9lcnIoIlBDSSBlcnJvcihzKSBkZXRlY3RlZFxuIik7CisJcHJfZXJyKCJQQ0kvWCBFUlJfRFIgcmVnaXN0ZXI6ICUjMDh4XG4iLCBlcnJfZGV0ZWN0KTsKIAotCXByaW50ayhLRVJOX0VSUiAiUENJL1ggRVJSX0FUVFJJQiByZWdpc3RlcjogJSMwOHhcbiIsCisJcHJfZXJyKCJQQ0kvWCBFUlJfQVRUUklCIHJlZ2lzdGVyOiAlIzA4eFxuIiwKIAkgICAgICAgaW5fYmUzMihwZGF0YS0+cGNpX3ZiYXNlICsgTVBDODVYWF9QQ0lfRVJSX0FUVFJJQikpOwotCXByaW50ayhLRVJOX0VSUiAiUENJL1ggRVJSX0FERFIgcmVnaXN0ZXI6ICUjMDh4XG4iLAorCXByX2VycigiUENJL1ggRVJSX0FERFIgcmVnaXN0ZXI6ICUjMDh4XG4iLAogCSAgICAgICBpbl9iZTMyKHBkYXRhLT5wY2lfdmJhc2UgKyBNUEM4NVhYX1BDSV9FUlJfQUREUikpOwotCXByaW50ayhLRVJOX0VSUiAiUENJL1ggRVJSX0VYVF9BRERSIHJlZ2lzdGVyOiAlIzA4eFxuIiwKKwlwcl9lcnIoIlBDSS9YIEVSUl9FWFRfQUREUiByZWdpc3RlcjogJSMwOHhcbiIsCiAJICAgICAgIGluX2JlMzIocGRhdGEtPnBjaV92YmFzZSArIE1QQzg1WFhfUENJX0VSUl9FWFRfQUREUikpOwotCXByaW50ayhLRVJOX0VSUiAiUENJL1ggRVJSX0RMIHJlZ2lzdGVyOiAlIzA4eFxuIiwKKwlwcl9lcnIoIlBDSS9YIEVSUl9ETCByZWdpc3RlcjogJSMwOHhcbiIsCiAJICAgICAgIGluX2JlMzIocGRhdGEtPnBjaV92YmFzZSArIE1QQzg1WFhfUENJX0VSUl9ETCkpOwotCXByaW50ayhLRVJOX0VSUiAiUENJL1ggRVJSX0RIIHJlZ2lzdGVyOiAlIzA4eFxuIiwKKwlwcl9lcnIoIlBDSS9YIEVSUl9ESCByZWdpc3RlcjogJSMwOHhcbiIsCiAJICAgICAgIGluX2JlMzIocGRhdGEtPnBjaV92YmFzZSArIE1QQzg1WFhfUENJX0VSUl9ESCkpOwogCiAJLyogY2xlYXIgZXJyb3IgYml0cyAqLwpAQCAtMTg3LDE0ICs4NywxNCBAQAogc3RhdGljIHZvaWQgbXBjODV4eF9wY2llX2NoZWNrKHN0cnVjdCBlZGFjX3BjaV9jdGxfaW5mbyAqcGNpKQogewogCXN0cnVjdCBtcGM4NXh4X3BjaV9wZGF0YSAqcGRhdGEgPSBwY2ktPnB2dF9pbmZvOwotCXUzMiBlcnJfZGV0ZWN0OworCXUzMiBlcnJfZGV0ZWN0LCBlcnJfY2FwX3N0YXQ7CiAKIAllcnJfZGV0ZWN0ID0gaW5fYmUzMihwZGF0YS0+cGNpX3ZiYXNlICsgTVBDODVYWF9QQ0lfRVJSX0RSKTsKKwllcnJfY2FwX3N0YXQgPSBpbl9iZTMyKHBkYXRhLT5wY2lfdmJhc2UgKyBNUEM4NVhYX1BDSV9HQVNfVElNUik7CiAKIAlwcl9lcnIoIlBDSWUgZXJyb3IocykgZGV0ZWN0ZWRcbiIpOwogCXByX2VycigiUENJZSBFUlJfRFIgcmVnaXN0ZXI6IDB4JTA4eFxuIiwgZXJyX2RldGVjdCk7Ci0JcHJfZXJyKCJQQ0llIEVSUl9DQVBfU1RBVCByZWdpc3RlcjogMHglMDh4XG4iLAotCQkJaW5fYmUzMihwZGF0YS0+cGNpX3ZiYXNlICsgTVBDODVYWF9QQ0lfR0FTX1RJTVIpKTsKKwlwcl9lcnIoIlBDSWUgRVJSX0NBUF9TVEFUIHJlZ2lzdGVyOiAweCUwOHhcbiIsIGVycl9jYXBfc3RhdCk7CiAJcHJfZXJyKCJQQ0llIEVSUl9DQVBfUjAgcmVnaXN0ZXI6IDB4JTA4eFxuIiwKIAkJCWluX2JlMzIocGRhdGEtPnBjaV92YmFzZSArIE1QQzg1WFhfUENJRV9FUlJfQ0FQX1IwKSk7CiAJcHJfZXJyKCJQQ0llIEVSUl9DQVBfUjEgcmVnaXN0ZXI6IDB4JTA4eFxuIiwKQEAgLTIwNiw2ICsxMDYsOSBAQAogCiAJLyogY2xlYXIgZXJyb3IgYml0cyAqLwogCW91dF9iZTMyKHBkYXRhLT5wY2lfdmJhc2UgKyBNUEM4NVhYX1BDSV9FUlJfRFIsIGVycl9kZXRlY3QpOworCisJLyogcmVzZXQgZXJyb3IgY2FwdHVyZSAqLworCW91dF9iZTMyKHBkYXRhLT5wY2lfdmJhc2UgKyBNUEM4NVhYX1BDSV9HQVNfVElNUiwgZXJyX2NhcF9zdGF0IHwgMHgxKTsKIH0KIAogc3RhdGljIGludCBtcGM4NXh4X3BjaWVfZmluZF9jYXBhYmlsaXR5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCkBAIC0yNjcsNyArMTcwLDYgQEAKIAogCXBkYXRhID0gcGNpLT5wdnRfaW5mbzsKIAlwZGF0YS0+bmFtZSA9ICJtcGM4NXh4X3BjaV9lcnIiOwotCXBkYXRhLT5pcnEgPSBOT19JUlE7CiAKIAlwbGF0X2RhdGEgPSBvcC0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJaWYgKCFwbGF0X2RhdGEpIHsKQEAgLTI5Nyw4ICsxOTksNyBAQAogCiAJcmVzID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShvZl9ub2RlLCAwLCAmcik7CiAJaWYgKHJlcykgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gZ2V0IHJlc291cmNlIGZvciAiCi0JCSAgICAgICAiUENJIGVyciByZWdzXG4iLCBfX2Z1bmNfXyk7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBnZXQgcmVzb3VyY2UgZm9yIFBDSSBlcnIgcmVnc1xuIiwgX19mdW5jX18pOwogCQlnb3RvIGVycjsKIAl9CiAKQEAgLTMwNywxNSArMjA4LDE0IEBACiAKIAlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZvcC0+ZGV2LCByLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZyKSwKIAkJCQkJcGRhdGEtPm5hbWUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIHdoaWxlIHJlcXVlc3RpbmcgbWVtIHJlZ2lvblxuIiwKLQkJICAgICAgIF9fZnVuY19fKTsKKwkJcHJfZXJyKCIlczogRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBtZW0gcmVnaW9uXG4iLCBfX2Z1bmNfXyk7CiAJCXJlcyA9IC1FQlVTWTsKIAkJZ290byBlcnI7CiAJfQogCiAJcGRhdGEtPnBjaV92YmFzZSA9IGRldm1faW9yZW1hcCgmb3AtPmRldiwgci5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcikpOwogCWlmICghcGRhdGEtPnBjaV92YmFzZSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gc2V0dXAgUENJIGVyciByZWdzXG4iLCBfX2Z1bmNfXyk7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBzZXR1cCBQQ0kgZXJyIHJlZ3NcbiIsIF9fZnVuY19fKTsKIAkJcmVzID0gLUVOT01FTTsKIAkJZ290byBlcnI7CiAJfQpAQCAtMzQ0LDYgKzI0NCw5IEBACiAJLyogY2xlYXIgZXJyb3IgYml0cyAqLwogCW91dF9iZTMyKHBkYXRhLT5wY2lfdmJhc2UgKyBNUEM4NVhYX1BDSV9FUlJfRFIsIH4wKTsKIAorCS8qIHJlc2V0IGVycm9yIGNhcHR1cmUgKi8KKwlvdXRfYmUzMihwZGF0YS0+cGNpX3ZiYXNlICsgTVBDODVYWF9QQ0lfR0FTX1RJTVIsIDB4MSk7CisKIAlpZiAoZWRhY19wY2lfYWRkX2RldmljZShwY2ksIHBkYXRhLT5lZGFjX2lkeCkgPiAwKSB7CiAJCWVkYWNfZGJnKDMsICJmYWlsZWQgZWRhY19wY2lfYWRkX2RldmljZSgpXG4iKTsKIAkJZ290byBlcnI7CkBAIC0zNTYsMTUgKzI1OSwxNCBAQAogCQkJCSAgICAgICBJUlFGX1NIQVJFRCwKIAkJCQkgICAgICAgIltFREFDXSBQQ0kgZXJyIiwgcGNpKTsKIAkJaWYgKHJlcyA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICIlczogVW5hYmxlIHRvIHJlcXVlc3QgaXJxICVkIGZvciAiCi0JCQkgICAgICAgIk1QQzg1eHggUENJIGVyclxuIiwgX19mdW5jX18sIHBkYXRhLT5pcnEpOworCQkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHJlcXVlc3QgaXJxICVkIGZvciBNUEM4NXh4IFBDSSBlcnJcbiIsCisJCQkJX19mdW5jX18sIHBkYXRhLT5pcnEpOwogCQkJaXJxX2Rpc3Bvc2VfbWFwcGluZyhwZGF0YS0+aXJxKTsKIAkJCXJlcyA9IC1FTk9ERVY7CiAJCQlnb3RvIGVycjI7CiAJCX0KIAotCQlwcmludGsoS0VSTl9JTkZPIEVEQUNfTU9EX1NUUiAiIGFjcXVpcmVkIGlycSAlZCBmb3IgUENJIEVyclxuIiwKKwkJcHJfaW5mbyhFREFDX01PRF9TVFIgIiBhY3F1aXJlZCBpcnEgJWQgZm9yIFBDSSBFcnJcbiIsCiAJCSAgICAgICBwZGF0YS0+aXJxKTsKIAl9CiAKQEAgLTM4Niw3ICsyODgsNyBAQAogCiAJZGV2cmVzX3JlbW92ZV9ncm91cCgmb3AtPmRldiwgbXBjODV4eF9wY2lfZXJyX3Byb2JlKTsKIAllZGFjX2RiZygzLCAic3VjY2Vzc1xuIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyBFREFDX01PRF9TVFIgIiBQQ0kgZXJyIHJlZ2lzdGVyZWRcbiIpOworCXByX2luZm8oRURBQ19NT0RfU1RSICIgUENJIGVyciByZWdpc3RlcmVkXG4iKTsKIAogCXJldHVybiAwOwogCkBAIC01MjksMTcgKzQzMSwxNyBAQAogCWlmICghKGVycl9kZXRlY3QgJiBMMl9FREVfTUFTSykpCiAJCXJldHVybjsKIAotCXByaW50ayhLRVJOX0VSUiAiRUNDIEVycm9yIGluIENQVSBMMiBjYWNoZVxuIik7Ci0JcHJpbnRrKEtFUk5fRVJSICJMMiBFcnJvciBEZXRlY3QgUmVnaXN0ZXI6IDB4JTA4eFxuIiwgZXJyX2RldGVjdCk7Ci0JcHJpbnRrKEtFUk5fRVJSICJMMiBFcnJvciBDYXB0dXJlIERhdGEgSGlnaCBSZWdpc3RlcjogMHglMDh4XG4iLAorCXByX2VycigiRUNDIEVycm9yIGluIENQVSBMMiBjYWNoZVxuIik7CisJcHJfZXJyKCJMMiBFcnJvciBEZXRlY3QgUmVnaXN0ZXI6IDB4JTA4eFxuIiwgZXJyX2RldGVjdCk7CisJcHJfZXJyKCJMMiBFcnJvciBDYXB0dXJlIERhdGEgSGlnaCBSZWdpc3RlcjogMHglMDh4XG4iLAogCSAgICAgICBpbl9iZTMyKHBkYXRhLT5sMl92YmFzZSArIE1QQzg1WFhfTDJfQ0FQVERBVEFISSkpOwotCXByaW50ayhLRVJOX0VSUiAiTDIgRXJyb3IgQ2FwdHVyZSBEYXRhIExvIFJlZ2lzdGVyOiAweCUwOHhcbiIsCisJcHJfZXJyKCJMMiBFcnJvciBDYXB0dXJlIERhdGEgTG8gUmVnaXN0ZXI6IDB4JTA4eFxuIiwKIAkgICAgICAgaW5fYmUzMihwZGF0YS0+bDJfdmJhc2UgKyBNUEM4NVhYX0wyX0NBUFREQVRBTE8pKTsKLQlwcmludGsoS0VSTl9FUlIgIkwyIEVycm9yIFN5bmRyb21lIFJlZ2lzdGVyOiAweCUwOHhcbiIsCisJcHJfZXJyKCJMMiBFcnJvciBTeW5kcm9tZSBSZWdpc3RlcjogMHglMDh4XG4iLAogCSAgICAgICBpbl9iZTMyKHBkYXRhLT5sMl92YmFzZSArIE1QQzg1WFhfTDJfQ0FQVEVDQykpOwotCXByaW50ayhLRVJOX0VSUiAiTDIgRXJyb3IgQXR0cmlidXRlcyBDYXB0dXJlIFJlZ2lzdGVyOiAweCUwOHhcbiIsCisJcHJfZXJyKCJMMiBFcnJvciBBdHRyaWJ1dGVzIENhcHR1cmUgUmVnaXN0ZXI6IDB4JTA4eFxuIiwKIAkgICAgICAgaW5fYmUzMihwZGF0YS0+bDJfdmJhc2UgKyBNUEM4NVhYX0wyX0VSUkFUVFIpKTsKLQlwcmludGsoS0VSTl9FUlIgIkwyIEVycm9yIEFkZHJlc3MgQ2FwdHVyZSBSZWdpc3RlcjogMHglMDh4XG4iLAorCXByX2VycigiTDIgRXJyb3IgQWRkcmVzcyBDYXB0dXJlIFJlZ2lzdGVyOiAweCUwOHhcbiIsCiAJICAgICAgIGluX2JlMzIocGRhdGEtPmwyX3ZiYXNlICsgTVBDODVYWF9MMl9FUlJBRERSKSk7CiAKIAkvKiBjbGVhciBlcnJvciBkZXRlY3QgcmVnaXN0ZXIgKi8KQEAgLTU4OCw3ICs0OTAsNiBAQAogCiAJcGRhdGEgPSBlZGFjX2Rldi0+cHZ0X2luZm87CiAJcGRhdGEtPm5hbWUgPSAibXBjODV4eF9sMl9lcnIiOwotCXBkYXRhLT5pcnEgPSBOT19JUlE7CiAJZWRhY19kZXYtPmRldiA9ICZvcC0+ZGV2OwogCWRldl9zZXRfZHJ2ZGF0YShlZGFjX2Rldi0+ZGV2LCBlZGFjX2Rldik7CiAJZWRhY19kZXYtPmN0bF9uYW1lID0gcGRhdGEtPm5hbWU7CkBAIC01OTYsOCArNDk3LDcgQEAKIAogCXJlcyA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uob3AtPmRldi5vZl9ub2RlLCAwLCAmcik7CiAJaWYgKHJlcykgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gZ2V0IHJlc291cmNlIGZvciAiCi0JCSAgICAgICAiTDIgZXJyIHJlZ3NcbiIsIF9fZnVuY19fKTsKKwkJcHJfZXJyKCIlczogVW5hYmxlIHRvIGdldCByZXNvdXJjZSBmb3IgTDIgZXJyIHJlZ3NcbiIsIF9fZnVuY19fKTsKIAkJZ290byBlcnI7CiAJfQogCkBAIC02MDYsMTUgKzUwNiwxNCBAQAogCiAJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmb3AtPmRldiwgci5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmciksCiAJCQkJICAgICBwZGF0YS0+bmFtZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBtZW0gcmVnaW9uXG4iLAotCQkgICAgICAgX19mdW5jX18pOworCQlwcl9lcnIoIiVzOiBFcnJvciB3aGlsZSByZXF1ZXN0aW5nIG1lbSByZWdpb25cbiIsIF9fZnVuY19fKTsKIAkJcmVzID0gLUVCVVNZOwogCQlnb3RvIGVycjsKIAl9CiAKIAlwZGF0YS0+bDJfdmJhc2UgPSBkZXZtX2lvcmVtYXAoJm9wLT5kZXYsIHIuc3RhcnQsIHJlc291cmNlX3NpemUoJnIpKTsKIAlpZiAoIXBkYXRhLT5sMl92YmFzZSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gc2V0dXAgTDIgZXJyIHJlZ3NcbiIsIF9fZnVuY19fKTsKKwkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHNldHVwIEwyIGVyciByZWdzXG4iLCBfX2Z1bmNfXyk7CiAJCXJlcyA9IC1FTk9NRU07CiAJCWdvdG8gZXJyOwogCX0KQEAgLTY0NiwxNiArNTQ1LDE0IEBACiAJCQkJICAgICAgIG1wYzg1eHhfbDJfaXNyLCBJUlFGX1NIQVJFRCwKIAkJCQkgICAgICAgIltFREFDXSBMMiBlcnIiLCBlZGFjX2Rldik7CiAJCWlmIChyZXMgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiJXM6IFVuYWJsZSB0byByZXF1ZXN0IGlycSAlZCBmb3IgIgotCQkJICAgICAgICJNUEM4NXh4IEwyIGVyclxuIiwgX19mdW5jX18sIHBkYXRhLT5pcnEpOworCQkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHJlcXVlc3QgaXJxICVkIGZvciBNUEM4NXh4IEwyIGVyclxuIiwKKwkJCQlfX2Z1bmNfXywgcGRhdGEtPmlycSk7CiAJCQlpcnFfZGlzcG9zZV9tYXBwaW5nKHBkYXRhLT5pcnEpOwogCQkJcmVzID0gLUVOT0RFVjsKIAkJCWdvdG8gZXJyMjsKIAkJfQogCi0JCXByaW50ayhLRVJOX0lORk8gRURBQ19NT0RfU1RSICIgYWNxdWlyZWQgaXJxICVkIGZvciBMMiBFcnJcbiIsCi0JCSAgICAgICBwZGF0YS0+aXJxKTsKKwkJcHJfaW5mbyhFREFDX01PRF9TVFIgIiBhY3F1aXJlZCBpcnEgJWQgZm9yIEwyIEVyclxuIiwgcGRhdGEtPmlycSk7CiAKIAkJZWRhY19kZXYtPm9wX3N0YXRlID0gT1BfUlVOTklOR19JTlRFUlJVUFQ7CiAKQEAgLTY2NSw3ICs1NjIsNyBAQAogCWRldnJlc19yZW1vdmVfZ3JvdXAoJm9wLT5kZXYsIG1wYzg1eHhfbDJfZXJyX3Byb2JlKTsKIAogCWVkYWNfZGJnKDMsICJzdWNjZXNzXG4iKTsKLQlwcmludGsoS0VSTl9JTkZPIEVEQUNfTU9EX1NUUiAiIEwyIGVyciByZWdpc3RlcmVkXG4iKTsKKwlwcl9pbmZvKEVEQUNfTU9EX1NUUiAiIEwyIGVyciByZWdpc3RlcmVkXG4iKTsKIAogCXJldHVybiAwOwogCkBAIC03MjksNDY2ICs2MjYsNiBAQAogCX0sCiB9OwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNQyBFcnIgZGV2aWNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIFRha2VuIGZyb20gdGFibGUgOC01NSBpbiB0aGUgTVBDODY0MSBVc2VyJ3MgTWFudWFsIGFuZC9vciA5LTYxIGluIHRoZQotICogTVBDODU3MiBVc2VyJ3MgTWFudWFsLiAgRWFjaCBsaW5lIHJlcHJlc2VudHMgYSBzeW5kcm9tZSBiaXQgY29sdW1uIGFzIGEKLSAqIDY0LWJpdCB2YWx1ZSwgYnV0IHNwbGl0IGludG8gYW4gdXBwZXIgYW5kIGxvd2VyIDMyLWJpdCBjaHVuay4gIFRoZSBsYWJlbHMKLSAqIGJlbG93IGNvcnJlc3BvbmQgdG8gRnJlZXNjYWxlJ3MgbWFudWFscy4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBlY2NfdGFibGVbMTZdID0gewotCS8qIE1TQiAgICAgICAgICAgTFNCICovCi0JLyogWzA6MzFdICAgIFszMjo2M10gKi8KLQkweGYwMGZlMTFlLCAweGMzM2MwZmY3LAkvKiBTeW5kcm9tZSBiaXQgNyAqLwotCTB4MDBmZjAwZmYsIDB4MDBmZmYwZmYsCi0JMHgwZjBmMGYwZiwgMHgwZjBmZmYwMCwKLQkweDExMTEzMzMzLCAweDc3NzcwMDBmLAotCTB4MjIyMjQ0NDQsIDB4ODg4ODIyMmYsCi0JMHg0NDQ0ODg4OCwgMHhmZmZmNDQ0MSwKLQkweDg4ODhmZmZmLCAweDExMTE4ODgyLAotCTB4ZmZmZjExMTEsIDB4MjIyMjExMTQsCS8qIFN5bmRyb21lIGJpdCAwICovCi19OwotCi0vKgotICogQ2FsY3VsYXRlIHRoZSBjb3JyZWN0IEVDQyB2YWx1ZSBmb3IgYSA2NC1iaXQgdmFsdWUgc3BlY2lmaWVkIGJ5IGhpZ2g6bG93Ci0gKi8KLXN0YXRpYyB1OCBjYWxjdWxhdGVfZWNjKHUzMiBoaWdoLCB1MzIgbG93KQotewotCXUzMiBtYXNrX2xvdzsKLQl1MzIgbWFza19oaWdoOwotCWludCBiaXRfY250OwotCXU4IGVjYyA9IDA7Ci0JaW50IGk7Ci0JaW50IGo7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCW1hc2tfaGlnaCA9IGVjY190YWJsZVtpICogMl07Ci0JCW1hc2tfbG93ID0gZWNjX3RhYmxlW2kgKiAyICsgMV07Ci0JCWJpdF9jbnQgPSAwOwotCi0JCWZvciAoaiA9IDA7IGogPCAzMjsgaisrKSB7Ci0JCQlpZiAoKG1hc2tfaGlnaCA+PiBqKSAmIDEpCi0JCQkJYml0X2NudCBePSAoaGlnaCA+PiBqKSAmIDE7Ci0JCQlpZiAoKG1hc2tfbG93ID4+IGopICYgMSkKLQkJCQliaXRfY250IF49IChsb3cgPj4gaikgJiAxOwotCQl9Ci0KLQkJZWNjIHw9IGJpdF9jbnQgPDwgaTsKLQl9Ci0KLQlyZXR1cm4gZWNjOwotfQotCi0vKgotICogQ3JlYXRlIHRoZSBzeW5kcm9tZSBjb2RlIHdoaWNoIGlzIGdlbmVyYXRlZCBpZiB0aGUgZGF0YSBsaW5lIHNwZWNpZmllZCBieQotICogJ2JpdCcgZmFpbGVkLiAgRWcgZ2VuZXJhdGUgYW4gOC1iaXQgY29kZXMgc2VlbiBpbiBUYWJsZSA4LTU1IGluIHRoZSBNUEM4NjQxCi0gKiBVc2VyJ3MgTWFudWFsIGFuZCA5LTYxIGluIHRoZSBNUEM4NTcyIFVzZXIncyBNYW51YWwuCi0gKi8KLXN0YXRpYyB1OCBzeW5kcm9tZV9mcm9tX2JpdCh1bnNpZ25lZCBpbnQgYml0KSB7Ci0JaW50IGk7Ci0JdTggc3luZHJvbWUgPSAwOwotCi0JLyoKLQkgKiBDeWNsZSB0aHJvdWdoIHRoZSB1cHBlciBvciBsb3dlciAzMi1iaXQgcG9ydGlvbiBvZiBlYWNoIHZhbHVlIGluCi0JICogZWNjX3RhYmxlIGRlcGVuZGluZyBvbiBpZiAnYml0JyBpcyBpbiB0aGUgdXBwZXIgb3IgbG93ZXIgaGFsZiBvZgotCSAqIDY0LWJpdCBkYXRhLgotCSAqLwotCWZvciAoaSA9IGJpdCA8IDMyOyBpIDwgMTY7IGkgKz0gMikKLQkJc3luZHJvbWUgfD0gKChlY2NfdGFibGVbaV0gPj4gKGJpdCAlIDMyKSkgJiAxKSA8PCAoaSAvIDIpOwotCi0JcmV0dXJuIHN5bmRyb21lOwotfQotCi0vKgotICogRGVjb2RlIGRhdGEgYW5kIGVjYyBzeW5kcm9tZSB0byBkZXRlcm1pbmUgd2hhdCB3ZW50IHdyb25nCi0gKiBOb3RlOiBUaGlzIGNhbiBvbmx5IGRlY29kZSBzaW5nbGUtYml0IGVycm9ycwotICovCi1zdGF0aWMgdm9pZCBzYmVfZWNjX2RlY29kZSh1MzIgY2FwX2hpZ2gsIHUzMiBjYXBfbG93LCB1MzIgY2FwX2VjYywKLQkJICAgICAgIGludCAqYmFkX2RhdGFfYml0LCBpbnQgKmJhZF9lY2NfYml0KQotewotCWludCBpOwotCXU4IHN5bmRyb21lOwotCi0JKmJhZF9kYXRhX2JpdCA9IC0xOwotCSpiYWRfZWNjX2JpdCA9IC0xOwotCi0JLyoKLQkgKiBDYWxjdWxhdGUgdGhlIEVDQyBvZiB0aGUgY2FwdHVyZWQgZGF0YSBhbmQgWE9SIGl0IHdpdGggdGhlIGNhcHR1cmVkCi0JICogRUNDIHRvIGZpbmQgYW4gRUNDIHN5bmRyb21lIHZhbHVlIHdlIGNhbiBzZWFyY2ggZm9yCi0JICovCi0Jc3luZHJvbWUgPSBjYWxjdWxhdGVfZWNjKGNhcF9oaWdoLCBjYXBfbG93KSBeIGNhcF9lY2M7Ci0KLQkvKiBDaGVjayBpZiBhIGRhdGEgbGluZSBpcyBzdHVjay4uLiAqLwotCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7Ci0JCWlmIChzeW5kcm9tZSA9PSBzeW5kcm9tZV9mcm9tX2JpdChpKSkgewotCQkJKmJhZF9kYXRhX2JpdCA9IGk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKiBJZiBkYXRhIGlzIGNvcnJlY3QsIGNoZWNrIEVDQyBiaXRzIGZvciBlcnJvcnMuLi4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCWlmICgoc3luZHJvbWUgPj4gaSkgJiAweDEpIHsKLQkJCSpiYWRfZWNjX2JpdCA9IGk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci19Ci0KLSNkZWZpbmUgbWFrZTY0KGhpZ2gsIGxvdykgKCgodTY0KShoaWdoKSA8PCAzMikgfCAobG93KSkKLQotc3RhdGljIHZvaWQgbXBjODV4eF9tY19jaGVjayhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCi17Ci0Jc3RydWN0IG1wYzg1eHhfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKLQlzdHJ1Y3QgY3Nyb3dfaW5mbyAqY3Nyb3c7Ci0JdTMyIGJ1c193aWR0aDsKLQl1MzIgZXJyX2RldGVjdDsKLQl1MzIgc3luZHJvbWU7Ci0JdTY0IGVycl9hZGRyOwotCXUzMiBwZm47Ci0JaW50IHJvd19pbmRleDsKLQl1MzIgY2FwX2hpZ2g7Ci0JdTMyIGNhcF9sb3c7Ci0JaW50IGJhZF9kYXRhX2JpdDsKLQlpbnQgYmFkX2VjY19iaXQ7Ci0KLQllcnJfZGV0ZWN0ID0gaW5fYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0VSUl9ERVRFQ1QpOwotCWlmICghZXJyX2RldGVjdCkKLQkJcmV0dXJuOwotCi0JbXBjODV4eF9tY19wcmludGsobWNpLCBLRVJOX0VSUiwgIkVyciBEZXRlY3QgUmVnaXN0ZXI6ICUjOC44eFxuIiwKLQkJCSAgZXJyX2RldGVjdCk7Ci0KLQkvKiBubyBtb3JlIHByb2Nlc3NpbmcgaWYgbm90IEVDQyBiaXQgZXJyb3JzICovCi0JaWYgKCEoZXJyX2RldGVjdCAmIChERFJfRURFX1NCRSB8IEREUl9FREVfTUJFKSkpIHsKLQkJb3V0X2JlMzIocGRhdGEtPm1jX3ZiYXNlICsgTVBDODVYWF9NQ19FUlJfREVURUNULCBlcnJfZGV0ZWN0KTsKLQkJcmV0dXJuOwotCX0KLQotCXN5bmRyb21lID0gaW5fYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0NBUFRVUkVfRUNDKTsKLQotCS8qIE1hc2sgb2ZmIGFwcHJvcHJpYXRlIGJpdHMgb2Ygc3luZHJvbWUgYmFzZWQgb24gYnVzIHdpZHRoICovCi0JYnVzX3dpZHRoID0gKGluX2JlMzIocGRhdGEtPm1jX3ZiYXNlICsgTVBDODVYWF9NQ19ERFJfU0RSQU1fQ0ZHKSAmCi0JCQlEU0NfREJXX01BU0spID8gMzIgOiA2NDsKLQlpZiAoYnVzX3dpZHRoID09IDY0KQotCQlzeW5kcm9tZSAmPSAweGZmOwotCWVsc2UKLQkJc3luZHJvbWUgJj0gMHhmZmZmOwotCi0JZXJyX2FkZHIgPSBtYWtlNjQoCi0JCWluX2JlMzIocGRhdGEtPm1jX3ZiYXNlICsgTVBDODVYWF9NQ19DQVBUVVJFX0VYVF9BRERSRVNTKSwKLQkJaW5fYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0NBUFRVUkVfQUREUkVTUykpOwotCXBmbiA9IGVycl9hZGRyID4+IFBBR0VfU0hJRlQ7Ci0KLQlmb3IgKHJvd19pbmRleCA9IDA7IHJvd19pbmRleCA8IG1jaS0+bnJfY3Nyb3dzOyByb3dfaW5kZXgrKykgewotCQljc3JvdyA9IG1jaS0+Y3Nyb3dzW3Jvd19pbmRleF07Ci0JCWlmICgocGZuID49IGNzcm93LT5maXJzdF9wYWdlKSAmJiAocGZuIDw9IGNzcm93LT5sYXN0X3BhZ2UpKQotCQkJYnJlYWs7Ci0JfQotCi0JY2FwX2hpZ2ggPSBpbl9iZTMyKHBkYXRhLT5tY192YmFzZSArIE1QQzg1WFhfTUNfQ0FQVFVSRV9EQVRBX0hJKTsKLQljYXBfbG93ID0gaW5fYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0NBUFRVUkVfREFUQV9MTyk7Ci0KLQkvKgotCSAqIEFuYWx5emUgc2luZ2xlLWJpdCBlcnJvcnMgb24gNjQtYml0IHdpZGUgYnVzZXMKLQkgKiBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgMzItYml0IHdpZGUgYnVzZXMKLQkgKi8KLQlpZiAoKGVycl9kZXRlY3QgJiBERFJfRURFX1NCRSkgJiYgKGJ1c193aWR0aCA9PSA2NCkpIHsKLQkJc2JlX2VjY19kZWNvZGUoY2FwX2hpZ2gsIGNhcF9sb3csIHN5bmRyb21lLAotCQkJCSZiYWRfZGF0YV9iaXQsICZiYWRfZWNjX2JpdCk7Ci0KLQkJaWYgKGJhZF9kYXRhX2JpdCAhPSAtMSkKLQkJCW1wYzg1eHhfbWNfcHJpbnRrKG1jaSwgS0VSTl9FUlIsCi0JCQkJIkZhdWx0eSBEYXRhIGJpdDogJWRcbiIsIGJhZF9kYXRhX2JpdCk7Ci0JCWlmIChiYWRfZWNjX2JpdCAhPSAtMSkKLQkJCW1wYzg1eHhfbWNfcHJpbnRrKG1jaSwgS0VSTl9FUlIsCi0JCQkJIkZhdWx0eSBFQ0MgYml0OiAlZFxuIiwgYmFkX2VjY19iaXQpOwotCi0JCW1wYzg1eHhfbWNfcHJpbnRrKG1jaSwgS0VSTl9FUlIsCi0JCQkiRXhwZWN0ZWQgRGF0YSAvIEVDQzpcdCUjOC44eF8lMDh4IC8gJSMyLjJ4XG4iLAotCQkJY2FwX2hpZ2ggXiAoMSA8PCAoYmFkX2RhdGFfYml0IC0gMzIpKSwKLQkJCWNhcF9sb3cgXiAoMSA8PCBiYWRfZGF0YV9iaXQpLAotCQkJc3luZHJvbWUgXiAoMSA8PCBiYWRfZWNjX2JpdCkpOwotCX0KLQotCW1wYzg1eHhfbWNfcHJpbnRrKG1jaSwgS0VSTl9FUlIsCi0JCQkiQ2FwdHVyZWQgRGF0YSAvIEVDQzpcdCUjOC44eF8lMDh4IC8gJSMyLjJ4XG4iLAotCQkJY2FwX2hpZ2gsIGNhcF9sb3csIHN5bmRyb21lKTsKLQltcGM4NXh4X21jX3ByaW50ayhtY2ksIEtFUk5fRVJSLCAiRXJyIGFkZHI6ICUjOC44bGx4XG4iLCBlcnJfYWRkcik7Ci0JbXBjODV4eF9tY19wcmludGsobWNpLCBLRVJOX0VSUiwgIlBGTjogJSM4Ljh4XG4iLCBwZm4pOwotCi0JLyogd2UgYXJlIG91dCBvZiByYW5nZSAqLwotCWlmIChyb3dfaW5kZXggPT0gbWNpLT5ucl9jc3Jvd3MpCi0JCW1wYzg1eHhfbWNfcHJpbnRrKG1jaSwgS0VSTl9FUlIsICJQRk4gb3V0IG9mIHJhbmdlIVxuIik7Ci0KLQlpZiAoZXJyX2RldGVjdCAmIEREUl9FREVfU0JFKQotCQllZGFjX21jX2hhbmRsZV9lcnJvcihIV19FVkVOVF9FUlJfQ09SUkVDVEVELCBtY2ksIDEsCi0JCQkJICAgICBwZm4sIGVycl9hZGRyICYgflBBR0VfTUFTSywgc3luZHJvbWUsCi0JCQkJICAgICByb3dfaW5kZXgsIDAsIC0xLAotCQkJCSAgICAgbWNpLT5jdGxfbmFtZSwgIiIpOwotCi0JaWYgKGVycl9kZXRlY3QgJiBERFJfRURFX01CRSkKLQkJZWRhY19tY19oYW5kbGVfZXJyb3IoSFdfRVZFTlRfRVJSX1VOQ09SUkVDVEVELCBtY2ksIDEsCi0JCQkJICAgICBwZm4sIGVycl9hZGRyICYgflBBR0VfTUFTSywgc3luZHJvbWUsCi0JCQkJICAgICByb3dfaW5kZXgsIDAsIC0xLAotCQkJCSAgICAgbWNpLT5jdGxfbmFtZSwgIiIpOwotCi0Jb3V0X2JlMzIocGRhdGEtPm1jX3ZiYXNlICsgTVBDODVYWF9NQ19FUlJfREVURUNULCBlcnJfZGV0ZWN0KTsKLX0KLQotc3RhdGljIGlycXJldHVybl90IG1wYzg1eHhfbWNfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kgPSBkZXZfaWQ7Ci0Jc3RydWN0IG1wYzg1eHhfbWNfcGRhdGEgKnBkYXRhID0gbWNpLT5wdnRfaW5mbzsKLQl1MzIgZXJyX2RldGVjdDsKLQotCWVycl9kZXRlY3QgPSBpbl9iZTMyKHBkYXRhLT5tY192YmFzZSArIE1QQzg1WFhfTUNfRVJSX0RFVEVDVCk7Ci0JaWYgKCFlcnJfZGV0ZWN0KQotCQlyZXR1cm4gSVJRX05PTkU7Ci0KLQltcGM4NXh4X21jX2NoZWNrKG1jaSk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG1wYzg1eHhfaW5pdF9jc3Jvd3Moc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQotewotCXN0cnVjdCBtcGM4NXh4X21jX3BkYXRhICpwZGF0YSA9IG1jaS0+cHZ0X2luZm87Ci0Jc3RydWN0IGNzcm93X2luZm8gKmNzcm93OwotCXN0cnVjdCBkaW1tX2luZm8gKmRpbW07Ci0JdTMyIHNkcmFtX2N0bDsKLQl1MzIgc2R0eXBlOwotCWVudW0gbWVtX3R5cGUgbXR5cGU7Ci0JdTMyIGNzX2JuZHM7Ci0JaW50IGluZGV4OwotCi0Jc2RyYW1fY3RsID0gaW5fYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0REUl9TRFJBTV9DRkcpOwotCi0Jc2R0eXBlID0gc2RyYW1fY3RsICYgRFNDX1NEVFlQRV9NQVNLOwotCWlmIChzZHJhbV9jdGwgJiBEU0NfUkRfRU4pIHsKLQkJc3dpdGNoIChzZHR5cGUpIHsKLQkJY2FzZSBEU0NfU0RUWVBFX0REUjoKLQkJCW10eXBlID0gTUVNX1JERFI7Ci0JCQlicmVhazsKLQkJY2FzZSBEU0NfU0RUWVBFX0REUjI6Ci0JCQltdHlwZSA9IE1FTV9SRERSMjsKLQkJCWJyZWFrOwotCQljYXNlIERTQ19TRFRZUEVfRERSMzoKLQkJCW10eXBlID0gTUVNX1JERFIzOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQltdHlwZSA9IE1FTV9VTktOT1dOOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQlzd2l0Y2ggKHNkdHlwZSkgewotCQljYXNlIERTQ19TRFRZUEVfRERSOgotCQkJbXR5cGUgPSBNRU1fRERSOwotCQkJYnJlYWs7Ci0JCWNhc2UgRFNDX1NEVFlQRV9ERFIyOgotCQkJbXR5cGUgPSBNRU1fRERSMjsKLQkJCWJyZWFrOwotCQljYXNlIERTQ19TRFRZUEVfRERSMzoKLQkJCW10eXBlID0gTUVNX0REUjM7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCW10eXBlID0gTUVNX1VOS05PV047Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IG1jaS0+bnJfY3Nyb3dzOyBpbmRleCsrKSB7Ci0JCXUzMiBzdGFydDsKLQkJdTMyIGVuZDsKLQotCQljc3JvdyA9IG1jaS0+Y3Nyb3dzW2luZGV4XTsKLQkJZGltbSA9IGNzcm93LT5jaGFubmVsc1swXS0+ZGltbTsKLQotCQljc19ibmRzID0gaW5fYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0NTX0JORFNfMCArCi0JCQkJICAoaW5kZXggKiBNUEM4NVhYX01DX0NTX0JORFNfT0ZTKSk7Ci0KLQkJc3RhcnQgPSAoY3NfYm5kcyAmIDB4ZmZmZjAwMDApID4+IDE2OwotCQllbmQgICA9IChjc19ibmRzICYgMHgwMDAwZmZmZik7Ci0KLQkJaWYgKHN0YXJ0ID09IGVuZCkKLQkJCWNvbnRpbnVlOwkvKiBub3QgcG9wdWxhdGVkICovCi0KLQkJc3RhcnQgPDw9ICgyNCAtIFBBR0VfU0hJRlQpOwotCQllbmQgICA8PD0gKDI0IC0gUEFHRV9TSElGVCk7Ci0JCWVuZCAgICB8PSAoMSA8PCAoMjQgLSBQQUdFX1NISUZUKSkgLSAxOwotCi0JCWNzcm93LT5maXJzdF9wYWdlID0gc3RhcnQ7Ci0JCWNzcm93LT5sYXN0X3BhZ2UgPSBlbmQ7Ci0KLQkJZGltbS0+bnJfcGFnZXMgPSBlbmQgKyAxIC0gc3RhcnQ7Ci0JCWRpbW0tPmdyYWluID0gODsKLQkJZGltbS0+bXR5cGUgPSBtdHlwZTsKLQkJZGltbS0+ZHR5cGUgPSBERVZfVU5LTk9XTjsKLQkJaWYgKHNkcmFtX2N0bCAmIERTQ19YMzJfRU4pCi0JCQlkaW1tLT5kdHlwZSA9IERFVl9YMzI7Ci0JCWRpbW0tPmVkYWNfbW9kZSA9IEVEQUNfU0VDREVEOwotCX0KLX0KLQotc3RhdGljIGludCBtcGM4NXh4X21jX2Vycl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCkKLXsKLQlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2k7Ci0Jc3RydWN0IGVkYWNfbWNfbGF5ZXIgbGF5ZXJzWzJdOwotCXN0cnVjdCBtcGM4NXh4X21jX3BkYXRhICpwZGF0YTsKLQlzdHJ1Y3QgcmVzb3VyY2UgcjsKLQl1MzIgc2RyYW1fY3RsOwotCWludCByZXM7Ci0KLQlpZiAoIWRldnJlc19vcGVuX2dyb3VwKCZvcC0+ZGV2LCBtcGM4NXh4X21jX2Vycl9wcm9iZSwgR0ZQX0tFUk5FTCkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbGF5ZXJzWzBdLnR5cGUgPSBFREFDX01DX0xBWUVSX0NISVBfU0VMRUNUOwotCWxheWVyc1swXS5zaXplID0gNDsKLQlsYXllcnNbMF0uaXNfdmlydF9jc3JvdyA9IHRydWU7Ci0JbGF5ZXJzWzFdLnR5cGUgPSBFREFDX01DX0xBWUVSX0NIQU5ORUw7Ci0JbGF5ZXJzWzFdLnNpemUgPSAxOwotCWxheWVyc1sxXS5pc192aXJ0X2Nzcm93ID0gZmFsc2U7Ci0JbWNpID0gZWRhY19tY19hbGxvYyhlZGFjX21jX2lkeCwgQVJSQVlfU0laRShsYXllcnMpLCBsYXllcnMsCi0JCQkgICAgc2l6ZW9mKCpwZGF0YSkpOwotCWlmICghbWNpKSB7Ci0JCWRldnJlc19yZWxlYXNlX2dyb3VwKCZvcC0+ZGV2LCBtcGM4NXh4X21jX2Vycl9wcm9iZSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXBkYXRhID0gbWNpLT5wdnRfaW5mbzsKLQlwZGF0YS0+bmFtZSA9ICJtcGM4NXh4X21jX2VyciI7Ci0JcGRhdGEtPmlycSA9IE5PX0lSUTsKLQltY2ktPnBkZXYgPSAmb3AtPmRldjsKLQlwZGF0YS0+ZWRhY19pZHggPSBlZGFjX21jX2lkeCsrOwotCWRldl9zZXRfZHJ2ZGF0YShtY2ktPnBkZXYsIG1jaSk7Ci0JbWNpLT5jdGxfbmFtZSA9IHBkYXRhLT5uYW1lOwotCW1jaS0+ZGV2X25hbWUgPSBwZGF0YS0+bmFtZTsKLQotCXJlcyA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uob3AtPmRldi5vZl9ub2RlLCAwLCAmcik7Ci0JaWYgKHJlcykgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gZ2V0IHJlc291cmNlIGZvciBNQyBlcnIgcmVnc1xuIiwKLQkJICAgICAgIF9fZnVuY19fKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmb3AtPmRldiwgci5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmciksCi0JCQkJICAgICBwZGF0YS0+bmFtZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBtZW0gcmVnaW9uXG4iLAotCQkgICAgICAgX19mdW5jX18pOwotCQlyZXMgPSAtRUJVU1k7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXBkYXRhLT5tY192YmFzZSA9IGRldm1faW9yZW1hcCgmb3AtPmRldiwgci5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcikpOwotCWlmICghcGRhdGEtPm1jX3ZiYXNlKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBzZXR1cCBNQyBlcnIgcmVnc1xuIiwgX19mdW5jX18pOwotCQlyZXMgPSAtRU5PTUVNOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlzZHJhbV9jdGwgPSBpbl9iZTMyKHBkYXRhLT5tY192YmFzZSArIE1QQzg1WFhfTUNfRERSX1NEUkFNX0NGRyk7Ci0JaWYgKCEoc2RyYW1fY3RsICYgRFNDX0VDQ19FTikpIHsKLQkJLyogbm8gRUNDICovCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBObyBFQ0MgRElNTXMgZGlzY292ZXJlZFxuIiwgX19mdW5jX18pOwotCQlyZXMgPSAtRU5PREVWOwotCQlnb3RvIGVycjsKLQl9Ci0KLQllZGFjX2RiZygzLCAiaW5pdCBtY2lcbiIpOwotCW1jaS0+bXR5cGVfY2FwID0gTUVNX0ZMQUdfUkREUiB8IE1FTV9GTEFHX1JERFIyIHwKLQkgICAgTUVNX0ZMQUdfRERSIHwgTUVNX0ZMQUdfRERSMjsKLQltY2ktPmVkYWNfY3RsX2NhcCA9IEVEQUNfRkxBR19OT05FIHwgRURBQ19GTEFHX1NFQ0RFRDsKLQltY2ktPmVkYWNfY2FwID0gRURBQ19GTEFHX1NFQ0RFRDsKLQltY2ktPm1vZF9uYW1lID0gRURBQ19NT0RfU1RSOwotCW1jaS0+bW9kX3ZlciA9IE1QQzg1WFhfUkVWSVNJT047Ci0KLQlpZiAoZWRhY19vcF9zdGF0ZSA9PSBFREFDX09QU1RBVEVfUE9MTCkKLQkJbWNpLT5lZGFjX2NoZWNrID0gbXBjODV4eF9tY19jaGVjazsKLQotCW1jaS0+Y3RsX3BhZ2VfdG9fcGh5cyA9IE5VTEw7Ci0KLQltY2ktPnNjcnViX21vZGUgPSBTQ1JVQl9TV19TUkM7Ci0KLQltcGM4NXh4X2luaXRfY3Nyb3dzKG1jaSk7Ci0KLQkvKiBzdG9yZSB0aGUgb3JpZ2luYWwgZXJyb3IgZGlzYWJsZSBiaXRzICovCi0Jb3JpZ19kZHJfZXJyX2Rpc2FibGUgPQotCSAgICBpbl9iZTMyKHBkYXRhLT5tY192YmFzZSArIE1QQzg1WFhfTUNfRVJSX0RJU0FCTEUpOwotCW91dF9iZTMyKHBkYXRhLT5tY192YmFzZSArIE1QQzg1WFhfTUNfRVJSX0RJU0FCTEUsIDApOwotCi0JLyogY2xlYXIgYWxsIGVycm9yIGJpdHMgKi8KLQlvdXRfYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0VSUl9ERVRFQ1QsIH4wKTsKLQotCWlmIChlZGFjX21jX2FkZF9tY193aXRoX2dyb3VwcyhtY2ksIG1wYzg1eHhfZGV2X2dyb3VwcykpIHsKLQkJZWRhY19kYmcoMywgImZhaWxlZCBlZGFjX21jX2FkZF9tYygpXG4iKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JaWYgKGVkYWNfb3Bfc3RhdGUgPT0gRURBQ19PUFNUQVRFX0lOVCkgewotCQlvdXRfYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0VSUl9JTlRfRU4sCi0JCQkgRERSX0VJRV9NQkVFIHwgRERSX0VJRV9TQkVFKTsKLQotCQkvKiBzdG9yZSB0aGUgb3JpZ2luYWwgZXJyb3IgbWFuYWdlbWVudCB0aHJlc2hvbGQgKi8KLQkJb3JpZ19kZHJfZXJyX3NiZSA9IGluX2JlMzIocGRhdGEtPm1jX3ZiYXNlICsKLQkJCQkJICAgTVBDODVYWF9NQ19FUlJfU0JFKSAmIDB4ZmYwMDAwOwotCi0JCS8qIHNldCB0aHJlc2hvbGQgdG8gMSBlcnJvciBwZXIgaW50ZXJydXB0ICovCi0JCW91dF9iZTMyKHBkYXRhLT5tY192YmFzZSArIE1QQzg1WFhfTUNfRVJSX1NCRSwgMHgxMDAwMCk7Ci0KLQkJLyogcmVnaXN0ZXIgaW50ZXJydXB0cyAqLwotCQlwZGF0YS0+aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAob3AtPmRldi5vZl9ub2RlLCAwKTsKLQkJcmVzID0gZGV2bV9yZXF1ZXN0X2lycSgmb3AtPmRldiwgcGRhdGEtPmlycSwKLQkJCQkgICAgICAgbXBjODV4eF9tY19pc3IsCi0JCQkJICAgICAgIElSUUZfU0hBUkVELAotCQkJCSAgICAgICAiW0VEQUNdIE1DIGVyciIsIG1jaSk7Ci0JCWlmIChyZXMgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gcmVxdWVzdCBpcnEgJWQgZm9yICIKLQkJCSAgICAgICAiTVBDODV4eCBEUkFNIEVSUlxuIiwgX19mdW5jX18sIHBkYXRhLT5pcnEpOwotCQkJaXJxX2Rpc3Bvc2VfbWFwcGluZyhwZGF0YS0+aXJxKTsKLQkJCXJlcyA9IC1FTk9ERVY7Ci0JCQlnb3RvIGVycjI7Ci0JCX0KLQotCQlwcmludGsoS0VSTl9JTkZPIEVEQUNfTU9EX1NUUiAiIGFjcXVpcmVkIGlycSAlZCBmb3IgTUNcbiIsCi0JCSAgICAgICBwZGF0YS0+aXJxKTsKLQl9Ci0KLQlkZXZyZXNfcmVtb3ZlX2dyb3VwKCZvcC0+ZGV2LCBtcGM4NXh4X21jX2Vycl9wcm9iZSk7Ci0JZWRhY19kYmcoMywgInN1Y2Nlc3NcbiIpOwotCXByaW50ayhLRVJOX0lORk8gRURBQ19NT0RfU1RSICIgTUMgZXJyIHJlZ2lzdGVyZWRcbiIpOwotCi0JcmV0dXJuIDA7Ci0KLWVycjI6Ci0JZWRhY19tY19kZWxfbWMoJm9wLT5kZXYpOwotZXJyOgotCWRldnJlc19yZWxlYXNlX2dyb3VwKCZvcC0+ZGV2LCBtcGM4NXh4X21jX2Vycl9wcm9iZSk7Ci0JZWRhY19tY19mcmVlKG1jaSk7Ci0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGludCBtcGM4NXh4X21jX2Vycl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3ApCi17Ci0Jc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpID0gZGV2X2dldF9kcnZkYXRhKCZvcC0+ZGV2KTsKLQlzdHJ1Y3QgbXBjODV4eF9tY19wZGF0YSAqcGRhdGEgPSBtY2ktPnB2dF9pbmZvOwotCi0JZWRhY19kYmcoMCwgIlxuIik7Ci0KLQlpZiAoZWRhY19vcF9zdGF0ZSA9PSBFREFDX09QU1RBVEVfSU5UKSB7Ci0JCW91dF9iZTMyKHBkYXRhLT5tY192YmFzZSArIE1QQzg1WFhfTUNfRVJSX0lOVF9FTiwgMCk7Ci0JCWlycV9kaXNwb3NlX21hcHBpbmcocGRhdGEtPmlycSk7Ci0JfQotCi0Jb3V0X2JlMzIocGRhdGEtPm1jX3ZiYXNlICsgTVBDODVYWF9NQ19FUlJfRElTQUJMRSwKLQkJIG9yaWdfZGRyX2Vycl9kaXNhYmxlKTsKLQlvdXRfYmUzMihwZGF0YS0+bWNfdmJhc2UgKyBNUEM4NVhYX01DX0VSUl9TQkUsIG9yaWdfZGRyX2Vycl9zYmUpOwotCi0JZWRhY19tY19kZWxfbWMoJm9wLT5kZXYpOwotCWVkYWNfbWNfZnJlZShtY2kpOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtcGM4NXh4X21jX2Vycl9vZl9tYXRjaFtdID0gewogLyogZGVwcmVjYXRlIHRoZSBmc2wsODUuLiBmb3JtcyBpbiB0aGUgZnV0dXJlLCAyLjYuMzA/ICovCiAJeyAuY29tcGF0aWJsZSA9ICJmc2wsODU0MC1tZW1vcnktY29udHJvbGxlciIsIH0sCkBAIC0xMjE3LDIyICs2NTQsMTQgQEAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1wYzg1eHhfbWNfZXJyX29mX21hdGNoKTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXBjODV4eF9tY19lcnJfZHJpdmVyID0gewotCS5wcm9iZSA9IG1wYzg1eHhfbWNfZXJyX3Byb2JlLAotCS5yZW1vdmUgPSBtcGM4NXh4X21jX2Vycl9yZW1vdmUsCisJLnByb2JlID0gZnNsX21jX2Vycl9wcm9iZSwKKwkucmVtb3ZlID0gZnNsX21jX2Vycl9yZW1vdmUsCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAibXBjODV4eF9tY19lcnIiLAogCQkub2ZfbWF0Y2hfdGFibGUgPSBtcGM4NXh4X21jX2Vycl9vZl9tYXRjaCwKIAl9LAogfTsKIAotI2lmZGVmIENPTkZJR19GU0xfU09DX0JPT0tFCi1zdGF0aWMgdm9pZCBfX2luaXQgbXBjODV4eF9tY19jbGVhcl9yZnhlKHZvaWQgKmRhdGEpCi17Ci0Jb3JpZ19oaWQxW3NtcF9wcm9jZXNzb3JfaWQoKV0gPSBtZnNwcihTUFJOX0hJRDEpOwotCW10c3ByKFNQUk5fSElEMSwgKG9yaWdfaGlkMVtzbXBfcHJvY2Vzc29yX2lkKCldICYgfkhJRDFfUkZYRSkpOwotfQotI2VuZGlmCi0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyICogY29uc3QgZHJpdmVyc1tdID0gewogCSZtcGM4NXh4X21jX2Vycl9kcml2ZXIsCiAJJm1wYzg1eHhfbDJfZXJyX2RyaXZlciwKQEAgLTEyNDYsOCArNjc1LDcgQEAKIAlpbnQgcmVzID0gMDsKIAl1MzIgX19tYXliZV91bnVzZWQgcHZyID0gMDsKIAotCXByaW50ayhLRVJOX0lORk8gIkZyZWVzY2FsZShSKSBNUEM4NXh4IEVEQUMgZHJpdmVyLCAiCi0JICAgICAgICIoQykgMjAwNiBNb250YXZpc3RhIFNvZnR3YXJlXG4iKTsKKwlwcl9pbmZvKCJGcmVlc2NhbGUoUikgTVBDODV4eCBFREFDIGRyaXZlciwgKEMpIDIwMDYgTW9udGF2aXN0YSBTb2Z0d2FyZVxuIik7CiAKIAkvKiBtYWtlIHN1cmUgZXJyb3IgcmVwb3J0aW5nIG1ldGhvZCBpcyBzYW5lICovCiAJc3dpdGNoIChlZGFjX29wX3N0YXRlKSB7CkBAIC0xMjYxLDQ0ICs2ODksMTUgQEAKIAogCXJlcyA9IHBsYXRmb3JtX3JlZ2lzdGVyX2RyaXZlcnMoZHJpdmVycywgQVJSQVlfU0laRShkcml2ZXJzKSk7CiAJaWYgKHJlcykKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBFREFDX01PRF9TVFIgImRyaXZlcnMgZmFpbCB0byByZWdpc3RlclxuIik7Ci0KLSNpZmRlZiBDT05GSUdfRlNMX1NPQ19CT09LRQotCXB2ciA9IG1mc3ByKFNQUk5fUFZSKTsKLQotCWlmICgoUFZSX1ZFUihwdnIpID09IFBWUl9WRVJfRTUwMFYxKSB8fAotCSAgICAoUFZSX1ZFUihwdnIpID09IFBWUl9WRVJfRTUwMFYyKSkgewotCQkvKgotCQkgKiBuZWVkIHRvIGNsZWFyIEhJRDFbUkZYRV0gdG8gZGlzYWJsZSBtYWNoaW5lIGNoZWNrIGludAotCQkgKiBzbyB3ZSBjYW4gY2F0Y2ggaXQKLQkJICovCi0JCWlmIChlZGFjX29wX3N0YXRlID09IEVEQUNfT1BTVEFURV9JTlQpCi0JCQlvbl9lYWNoX2NwdShtcGM4NXh4X21jX2NsZWFyX3JmeGUsIE5VTEwsIDApOwotCX0KLSNlbmRpZgorCQlwcl93YXJuKEVEQUNfTU9EX1NUUiAiZHJpdmVycyBmYWlsIHRvIHJlZ2lzdGVyXG4iKTsKIAogCXJldHVybiAwOwogfQogCiBtb2R1bGVfaW5pdChtcGM4NXh4X21jX2luaXQpOwogCi0jaWZkZWYgQ09ORklHX0ZTTF9TT0NfQk9PS0UKLXN0YXRpYyB2b2lkIF9fZXhpdCBtcGM4NXh4X21jX3Jlc3RvcmVfaGlkMSh2b2lkICpkYXRhKQotewotCW10c3ByKFNQUk5fSElEMSwgb3JpZ19oaWQxW3NtcF9wcm9jZXNzb3JfaWQoKV0pOwotfQotI2VuZGlmCi0KIHN0YXRpYyB2b2lkIF9fZXhpdCBtcGM4NXh4X21jX2V4aXQodm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfRlNMX1NPQ19CT09LRQotCXUzMiBwdnIgPSBtZnNwcihTUFJOX1BWUik7Ci0KLQlpZiAoKFBWUl9WRVIocHZyKSA9PSBQVlJfVkVSX0U1MDBWMSkgfHwKLQkgICAgKFBWUl9WRVIocHZyKSA9PSBQVlJfVkVSX0U1MDBWMikpIHsKLQkJb25fZWFjaF9jcHUobXBjODV4eF9tY19yZXN0b3JlX2hpZDEsIE5VTEwsIDApOwotCX0KLSNlbmRpZgogCXBsYXRmb3JtX3VucmVnaXN0ZXJfZHJpdmVycyhkcml2ZXJzLCBBUlJBWV9TSVpFKGRyaXZlcnMpKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL21wYzg1eHhfZWRhYy5oIGIvZHJpdmVycy9lZGFjL21wYzg1eHhfZWRhYy5oCmluZGV4IDkzNTJlODguLjNmNmZiMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9tcGM4NXh4X2VkYWMuaAorKysgYi9kcml2ZXJzL2VkYWMvbXBjODV4eF9lZGFjLmgKQEAgLTE3LDY1ICsxNyw2IEBACiAjZGVmaW5lIG1wYzg1eHhfcHJpbnRrKGxldmVsLCBmbXQsIGFyZy4uLikgXAogCWVkYWNfcHJpbnRrKGxldmVsLCAiTVBDODV4eCIsIGZtdCwgIyNhcmcpCiAKLSNkZWZpbmUgbXBjODV4eF9tY19wcmludGsobWNpLCBsZXZlbCwgZm10LCBhcmcuLi4pIFwKLQllZGFjX21jX2NoaXBzZXRfcHJpbnRrKG1jaSwgbGV2ZWwsICJNUEM4NXh4IiwgZm10LCAjI2FyZykKLQotLyoKLSAqIERSQU0gZXJyb3IgZGVmaW5lcwotICovCi0KLS8qIEREUl9TRFJBTV9DRkcgKi8KLSNkZWZpbmUgTVBDODVYWF9NQ19ERFJfU0RSQU1fQ0ZHCTB4MDExMAotI2RlZmluZSBNUEM4NVhYX01DX0NTX0JORFNfMAkJMHgwMDAwCi0jZGVmaW5lIE1QQzg1WFhfTUNfQ1NfQk5EU18xCQkweDAwMDgKLSNkZWZpbmUgTVBDODVYWF9NQ19DU19CTkRTXzIJCTB4MDAxMAotI2RlZmluZSBNUEM4NVhYX01DX0NTX0JORFNfMwkJMHgwMDE4Ci0jZGVmaW5lIE1QQzg1WFhfTUNfQ1NfQk5EU19PRlMJCTB4MDAwOAotCi0jZGVmaW5lIE1QQzg1WFhfTUNfREFUQV9FUlJfSU5KRUNUX0hJCTB4MGUwMAotI2RlZmluZSBNUEM4NVhYX01DX0RBVEFfRVJSX0lOSkVDVF9MTwkweDBlMDQKLSNkZWZpbmUgTVBDODVYWF9NQ19FQ0NfRVJSX0lOSkVDVAkweDBlMDgKLSNkZWZpbmUgTVBDODVYWF9NQ19DQVBUVVJFX0RBVEFfSEkJMHgwZTIwCi0jZGVmaW5lIE1QQzg1WFhfTUNfQ0FQVFVSRV9EQVRBX0xPCTB4MGUyNAotI2RlZmluZSBNUEM4NVhYX01DX0NBUFRVUkVfRUNDCQkweDBlMjgKLSNkZWZpbmUgTVBDODVYWF9NQ19FUlJfREVURUNUCQkweDBlNDAKLSNkZWZpbmUgTVBDODVYWF9NQ19FUlJfRElTQUJMRQkJMHgwZTQ0Ci0jZGVmaW5lIE1QQzg1WFhfTUNfRVJSX0lOVF9FTgkJMHgwZTQ4Ci0jZGVmaW5lIE1QQzg1WFhfTUNfQ0FQVFVSRV9BVFJJQlVURVMJMHgwZTRjCi0jZGVmaW5lIE1QQzg1WFhfTUNfQ0FQVFVSRV9BRERSRVNTCTB4MGU1MAotI2RlZmluZSBNUEM4NVhYX01DX0NBUFRVUkVfRVhUX0FERFJFU1MJMHgwZTU0Ci0jZGVmaW5lIE1QQzg1WFhfTUNfRVJSX1NCRQkJMHgwZTU4Ci0KLSNkZWZpbmUgRFNDX01FTV9FTgkweDgwMDAwMDAwCi0jZGVmaW5lIERTQ19FQ0NfRU4JMHgyMDAwMDAwMAotI2RlZmluZSBEU0NfUkRfRU4JMHgxMDAwMDAwMAotI2RlZmluZSBEU0NfREJXX01BU0sJMHgwMDE4MDAwMAotI2RlZmluZSBEU0NfREJXXzMyCTB4MDAwODAwMDAKLSNkZWZpbmUgRFNDX0RCV182NAkweDAwMDAwMDAwCi0KLSNkZWZpbmUgRFNDX1NEVFlQRV9NQVNLCQkweDA3MDAwMDAwCi0KLSNkZWZpbmUgRFNDX1NEVFlQRV9ERFIJCTB4MDIwMDAwMDAKLSNkZWZpbmUgRFNDX1NEVFlQRV9ERFIyCQkweDAzMDAwMDAwCi0jZGVmaW5lIERTQ19TRFRZUEVfRERSMwkJMHgwNzAwMDAwMAotI2RlZmluZSBEU0NfWDMyX0VOCTB4MDAwMDAwMjAKLQotLyogRXJyX0ludF9FbiAqLwotI2RlZmluZSBERFJfRUlFX01TRUUJMHgxCS8qIG1lbW9yeSBzZWxlY3QgKi8KLSNkZWZpbmUgRERSX0VJRV9TQkVFCTB4NAkvKiBzaW5nbGUtYml0IEVDQyBlcnJvciAqLwotI2RlZmluZSBERFJfRUlFX01CRUUJMHg4CS8qIG11bHRpLWJpdCBFQ0MgZXJyb3IgKi8KLQotLyogRXJyX0RldGVjdCAqLwotI2RlZmluZSBERFJfRURFX01TRQkJMHgxCS8qIG1lbW9yeSBzZWxlY3QgKi8KLSNkZWZpbmUgRERSX0VERV9TQkUJCTB4NAkvKiBzaW5nbGUtYml0IEVDQyBlcnJvciAqLwotI2RlZmluZSBERFJfRURFX01CRQkJMHg4CS8qIG11bHRpLWJpdCBFQ0MgZXJyb3IgKi8KLSNkZWZpbmUgRERSX0VERV9NTUUJCTB4ODAwMDAwMDAJLyogbXVsdGlwbGUgbWVtb3J5IGVycm9ycyAqLwotCi0vKiBFcnJfRGlzYWJsZSAqLwotI2RlZmluZSBERFJfRURJX01TRUQJMHgxCS8qIG1lbW9yeSBzZWxlY3QgZGlzYWJsZSAqLwotI2RlZmluZQlERFJfRURJX1NCRUQJMHg0CS8qIHNpbmdsZS1iaXQgRUNDIGVycm9yIGRpc2FibGUgKi8KLSNkZWZpbmUJRERSX0VESV9NQkVECTB4OAkvKiBtdWx0aS1iaXQgRUNDIGVycm9yIGRpc2FibGUgKi8KLQogLyoKICAqIEwyIEVyciBkZWZpbmVzCiAgKi8KQEAgLTE0OSwxMyArOTAsNiBAQAogI2RlZmluZSBNUEM4NVhYX1BDSUVfRVJSX0NBUF9SMgkJMHgwMDMwCiAjZGVmaW5lIE1QQzg1WFhfUENJRV9FUlJfQ0FQX1IzCQkweDAwMzQKIAotc3RydWN0IG1wYzg1eHhfbWNfcGRhdGEgewotCWNoYXIgKm5hbWU7Ci0JaW50IGVkYWNfaWR4OwotCXZvaWQgX19pb21lbSAqbWNfdmJhc2U7Ci0JaW50IGlycTsKLX07Ci0KIHN0cnVjdCBtcGM4NXh4X2wyX3BkYXRhIHsKIAljaGFyICpuYW1lOwogCWludCBlZGFjX2lkeDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9tdjY0eDYwX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9tdjY0eDYwX2VkYWMuYwppbmRleCA2YzU0MTI3Li5jYjliODU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvbXY2NHg2MF9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL212NjR4NjBfZWRhYy5jCkBAIC0xMTgsNyArMTE4LDYgQEAKIAogCXBkYXRhLT5wY2lfaG9zZSA9IHBkZXYtPmlkOwogCXBkYXRhLT5uYW1lID0gIm1wYzg1eHhfcGNpX2VyciI7Ci0JcGRhdGEtPmlycSA9IE5PX0lSUTsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwY2kpOwogCXBjaS0+ZGV2ID0gJnBkZXYtPmRldjsKIAlwY2ktPmRldl9uYW1lID0gZGV2X25hbWUoJnBkZXYtPmRldik7CkBAIC0yOTEsNyArMjkwLDYgQEAKIAogCXBkYXRhID0gZWRhY19kZXYtPnB2dF9pbmZvOwogCXBkYXRhLT5uYW1lID0gIm12NjR4NjBfc3JhbV9lcnIiOwotCXBkYXRhLT5pcnEgPSBOT19JUlE7CiAJZWRhY19kZXYtPmRldiA9ICZwZGV2LT5kZXY7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZWRhY19kZXYpOwogCWVkYWNfZGV2LT5kZXZfbmFtZSA9IGRldl9uYW1lKCZwZGV2LT5kZXYpOwpAQCAtNDU5LDcgKzQ1Nyw2IEBACiAKIAlwZGF0YSA9IGVkYWNfZGV2LT5wdnRfaW5mbzsKIAlwZGF0YS0+bmFtZSA9ICJtdjY0eDYwX2NwdV9lcnIiOwotCXBkYXRhLT5pcnEgPSBOT19JUlE7CiAJZWRhY19kZXYtPmRldiA9ICZwZGV2LT5kZXY7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZWRhY19kZXYpOwogCWVkYWNfZGV2LT5kZXZfbmFtZSA9IGRldl9uYW1lKCZwZGV2LT5kZXYpOwpAQCAtNzI3LDcgKzcyNCw2IEBACiAJbWNpLT5wZGV2ID0gJnBkZXYtPmRldjsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtY2kpOwogCXBkYXRhLT5uYW1lID0gIm12NjR4NjBfbWNfZXJyIjsKLQlwZGF0YS0+aXJxID0gTk9fSVJROwogCW1jaS0+ZGV2X25hbWUgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKIAlwZGF0YS0+ZWRhY19pZHggPSBlZGFjX21jX2lkeCsrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvcHBjNHh4X2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9wcGM0eHhfZWRhYy5jCmluZGV4IGQzYTY0YmEuLjY5MWNlMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9wcGM0eHhfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9wcGM0eHhfZWRhYy5jCkBAIC0xMDI5LDggKzEwMjksNiBAQAogCXBkYXRhCQkJPSBtY2ktPnB2dF9pbmZvOwogCiAJcGRhdGEtPmRjcl9ob3N0CQk9ICpkY3JfaG9zdDsKLQlwZGF0YS0+aXJxcy5zZWMJCT0gTk9fSVJROwotCXBkYXRhLT5pcnFzLmRlZAkJPSBOT19JUlE7CiAKIAkvKiBJbml0aWFsaXplIGNvbnRyb2xsZXIgY2FwYWJpbGl0aWVzIGFuZCBjb25maWd1cmF0aW9uICovCiAKQEAgLTExMTEsNyArMTEwOSw3IEBACiAJZGVkX2lycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCBJTlRNQVBfRUNDREVEX0lOREVYKTsKIAlzZWNfaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIElOVE1BUF9FQ0NTRUNfSU5ERVgpOwogCi0JaWYgKGRlZF9pcnEgPT0gTk9fSVJRIHx8IHNlY19pcnEgPT0gTk9fSVJRKSB7CisJaWYgKCFkZWRfaXJxIHx8ICFzZWNfaXJxKSB7CiAJCXBwYzR4eF9lZGFjX21jX3ByaW50ayhLRVJOX0VSUiwgbWNpLAogCQkJCSAgICAgICJVbmFibGUgdG8gbWFwIGludGVycnVwdHMuXG4iKTsKIAkJc3RhdHVzID0gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9zYl9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvc2JfZWRhYy5jCmluZGV4IDRmYjJlYjcuLjU0Nzc1MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9zYl9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL3NiX2VkYWMuYwpAQCAtNTUyLDkgKzU1Miw5IEBACiAvKiBLbmlnaHQncyBMYW5kaW5nIFN1cHBvcnQgKi8KIC8qCiAgKiBLTkwncyBtZW1vcnkgY2hhbm5lbHMgYXJlIHN3aXp6bGVkIGJldHdlZW4gbWVtb3J5IGNvbnRyb2xsZXJzLgotICogTUMwIGlzIG1hcHBlZCB0byBDSDMsNSw2IGFuZCBNQzEgaXMgbWFwcGVkIHRvIENIMCwxLDIKKyAqIE1DMCBpcyBtYXBwZWQgdG8gQ0gzLDQsNSBhbmQgTUMxIGlzIG1hcHBlZCB0byBDSDAsMSwyCiAgKi8KLSNkZWZpbmUga25sX2NoYW5uZWxfcmVtYXAoY2hhbm5lbCkgKChjaGFubmVsICsgMykgJSA2KQorI2RlZmluZSBrbmxfY2hhbm5lbF9yZW1hcChtYywgY2hhbikgKChtYykgPyAoY2hhbikgOiAoY2hhbikgKyAzKQogCiAvKiBNZW1vcnkgY29udHJvbGxlciwgVEFEIHRhYmxlcywgZXJyb3IgaW5qZWN0aW9uIC0gMi04LTAsIDItOS0wICgyIG9mIHRoZXNlKSAqLwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0tOTF9JTUNfTUMgICAgICAgMHg3ODQwCkBAIC0xMjg2LDcgKzEyODYsNyBAQAogCW1jID0gR0VUX0JJVEZJRUxEKHJlZywgZW50cnkqMywgKGVudHJ5KjMpKzIpOwogCWNoYW4gPSBHRVRfQklURklFTEQocmVnLCAoZW50cnkqMikgKyAxOCwgKGVudHJ5KjIpICsgMTggKyAxKTsKIAotCXJldHVybiBrbmxfY2hhbm5lbF9yZW1hcChtYyozICsgY2hhbik7CisJcmV0dXJuIGtubF9jaGFubmVsX3JlbWFwKG1jLCBjaGFuKTsKIH0KIAogLyoKQEAgLTI0NzQsNyArMjQ3NCw3IEBACiAKIAkvKiBDaGVjayBpZiBldmVyeXRoaW5nIHdlcmUgcmVnaXN0ZXJlZCAqLwogCWlmICghcHZ0LT5wY2lfc2FkMCB8fCAhcHZ0LT5wY2lfc2FkMSB8fCAhcHZ0LT5wY2lfaGEwIHx8Ci0JICAgICFwdnQtPiBwY2lfdGFkIHx8ICFwdnQtPnBjaV9yYXMgIHx8ICFwdnQtPnBjaV90YSkKKwkgICAgIXB2dC0+cGNpX3JhcyB8fCAhcHZ0LT5wY2lfdGEpCiAJCWdvdG8gZW5vZGV2OwogCiAJaWYgKHNhd19jaGFuX21hc2sgIT0gMHgwZikKQEAgLTI1NjMsOCArMjU2Myw3IEBACiAKIAkvKiBDaGVjayBpZiBldmVyeXRoaW5nIHdlcmUgcmVnaXN0ZXJlZCAqLwogCWlmICghcHZ0LT5wY2lfc2FkMCB8fCAhcHZ0LT5wY2lfaGEwIHx8ICFwdnQtPnBjaV9icjAgfHwKLQkgICAgIXB2dC0+cGNpX2JyMSB8fCAhcHZ0LT5wY2lfdGFkIHx8ICFwdnQtPnBjaV9yYXMgIHx8Ci0JICAgICFwdnQtPnBjaV90YSkKKwkgICAgIXB2dC0+cGNpX2JyMSB8fCAhcHZ0LT5wY2lfcmFzIHx8ICFwdnQtPnBjaV90YSkKIAkJZ290byBlbm9kZXY7CiAKIAlpZiAoc2F3X2NoYW5fbWFzayAhPSAweDBmICYmIC8qIC1FTiAqLwpAQCAtMjk5Nyw4ICsyOTk2LDE1IEBACiAJCX0gZWxzZSB7CiAJCQljaGFyIEEgPSAqKCJBIik7CiAKLQkJCWNoYW5uZWwgPSBrbmxfY2hhbm5lbF9yZW1hcChjaGFubmVsKTsKKwkJCS8qCisJCQkgKiBSZXBvcnRlZCBjaGFubmVsIGlzIGluIHJhbmdlIDAtMiwgc28gd2UgY2FuJ3QgbWFwIGl0CisJCQkgKiBiYWNrIHRvIG1jLiBUbyBmaWd1cmUgb3V0IG1jIHdlIGNoZWNrIG1hY2hpbmUgY2hlY2sKKwkJCSAqIGJhbmsgcmVnaXN0ZXIgdGhhdCByZXBvcnRlZCB0aGlzIGVycm9yLgorCQkJICogYmFuazE1IG1lYW5zIG1jMCBhbmQgYmFuazE2IG1lYW5zIG1jMS4KKwkJCSAqLworCQkJY2hhbm5lbCA9IGtubF9jaGFubmVsX3JlbWFwKG0tPmJhbmsgPT0gMTYsIGNoYW5uZWwpOwogCQkJY2hhbm5lbF9tYXNrID0gMSA8PCBjaGFubmVsOworCiAJCQlzbnByaW50Zihtc2csIHNpemVvZihtc2cpLAogCQkJCSIlcyVzIGVycl9jb2RlOiUwNHg6JTA0eCBjaGFubmVsOiVkIChESU1NXyVjKSIsCiAJCQkJb3ZlcmZsb3cgPyAiIE9WRVJGTE9XIiA6ICIiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL3NreF9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvc2t4X2VkYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmY0ODc4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9lZGFjL3NreF9lZGFjLmMKQEAgLTAsMCArMSwxMTIxIEBACisvKgorICogRURBQyBkcml2ZXIgZm9yIEludGVsKFIpIFhlb24oUikgU2t5bGFrZSBwcm9jZXNzb3JzCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lZGFjLmg+CisjaW5jbHVkZSA8bGludXgvbW16b25lLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CisjaW5jbHVkZSA8bGludXgvbWF0aDY0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2NwdV9kZXZpY2VfaWQuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL21jZS5oPgorCisjaW5jbHVkZSAiZWRhY19jb3JlLmgiCisKKyNkZWZpbmUgU0tYX1JFVklTSU9OICAgICIgVmVyOiAxLjAgIgorCisvKgorICogRGVidWcgbWFjcm9zCisgKi8KKyNkZWZpbmUgc2t4X3ByaW50ayhsZXZlbCwgZm10LCBhcmcuLi4pCQkJXAorCWVkYWNfcHJpbnRrKGxldmVsLCAic2t4IiwgZm10LCAjI2FyZykKKworI2RlZmluZSBza3hfbWNfcHJpbnRrKG1jaSwgbGV2ZWwsIGZtdCwgYXJnLi4uKQkJXAorCWVkYWNfbWNfY2hpcHNldF9wcmludGsobWNpLCBsZXZlbCwgInNreCIsIGZtdCwgIyNhcmcpCisKKy8qCisgKiBHZXQgYSBiaXQgZmllbGQgYXQgcmVnaXN0ZXIgdmFsdWUgPHY+LCBmcm9tIGJpdCA8bG8+IHRvIGJpdCA8aGk+CisgKi8KKyNkZWZpbmUgR0VUX0JJVEZJRUxEKHYsIGxvLCBoaSkgXAorCSgoKHYpICYgR0VOTUFTS19VTEwoKGhpKSwgKGxvKSkpID4+IChsbykpCisKK3N0YXRpYyBMSVNUX0hFQUQoc2t4X2VkYWNfbGlzdCk7CisKK3N0YXRpYyB1NjQgc2t4X3RvbG0sIHNreF90b2htOworCisjZGVmaW5lIE5VTV9JTUMJCQkyCS8qIG1lbW9yeSBjb250cm9sbGVycyBwZXIgc29ja2V0ICovCisjZGVmaW5lIE5VTV9DSEFOTkVMUwkJMwkvKiBjaGFubmVscyBwZXIgbWVtb3J5IGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUgTlVNX0RJTU1TCQkyCS8qIE1heCBESU1NUyBwZXIgY2hhbm5lbCAqLworCisjZGVmaW5lCU1BU0syNgkweDNGRkZGRkYJCS8qIE1hc2sgZm9yIDJeMjYgKi8KKyNkZWZpbmUgTUFTSzI5CTB4MUZGRkZGRkYJCS8qIE1hc2sgZm9yIDJeMjkgKi8KKworLyoKKyAqIEVhY2ggY3B1IHNvY2tldCBjb250YWlucyBzb21lIHBjaSBkZXZpY2VzIHRoYXQgcHJvdmlkZSBnbG9iYWwKKyAqIGluZm9ybWF0aW9uLCBhbmQgYWxzbyBzb21lIHRoYXQgYXJlIGxvY2FsIHRvIGVhY2ggb2YgdGhlIHR3bworICogbWVtb3J5IGNvbnRyb2xsZXJzIG9uIHRoZSBkaWUuCisgKi8KK3N0cnVjdCBza3hfZGV2IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJdTgJCQlidXNbNF07CisJc3RydWN0IHBjaV9kZXYJKnNhZF9hbGw7CisJc3RydWN0IHBjaV9kZXYJKnV0aWxfYWxsOworCXUzMgltY3JvdXRlOworCXN0cnVjdCBza3hfaW1jIHsKKwkJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpOworCQl1OAltYzsJLyogc3lzdGVtIHdpZGUgbWMjICovCisJCXU4CWxtYzsJLyogc29ja2V0IHJlbGF0aXZlIG1jIyAqLworCQl1OAlzcmNfaWQsIG5vZGVfaWQ7CisJCXN0cnVjdCBza3hfY2hhbm5lbCB7CisJCQlzdHJ1Y3QgcGNpX2RldiAqY2RldjsKKwkJCXN0cnVjdCBza3hfZGltbSB7CisJCQkJdTgJY2xvc2VfcGc7CisJCQkJdTgJYmFua194b3JfZW5hYmxlOworCQkJCXU4CWZpbmVfZ3JhaW5fYmFuazsKKwkJCQl1OAlyb3diaXRzOworCQkJCXU4CWNvbGJpdHM7CisJCQl9IGRpbW1zW05VTV9ESU1NU107CisJCX0gY2hhbltOVU1fQ0hBTk5FTFNdOworCX0gaW1jW05VTV9JTUNdOworfTsKK3N0YXRpYyBpbnQgc2t4X251bV9zb2NrZXRzOworCitzdHJ1Y3Qgc2t4X3B2dCB7CisJc3RydWN0IHNreF9pbWMJKmltYzsKK307CisKK3N0cnVjdCBkZWNvZGVkX2FkZHIgeworCXN0cnVjdCBza3hfZGV2ICpkZXY7CisJdTY0CWFkZHI7CisJaW50CXNvY2tldDsKKwlpbnQJaW1jOworCWludAljaGFubmVsOworCXU2NAljaGFuX2FkZHI7CisJaW50CXNrdHdheXM7CisJaW50CWNoYW53YXlzOworCWludAlkaW1tOworCWludAlyYW5rOworCWludAljaGFubmVsX3Jhbms7CisJdTY0CXJhbmtfYWRkcmVzczsKKwlpbnQJcm93OworCWludAljb2x1bW47CisJaW50CWJhbmtfYWRkcmVzczsKKwlpbnQJYmFua19ncm91cDsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2t4X2RldiAqZ2V0X3NreF9kZXYodTggYnVzLCB1OCBpZHgpCit7CisJc3RydWN0IHNreF9kZXYgKmQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGQsICZza3hfZWRhY19saXN0LCBsaXN0KSB7CisJCWlmIChkLT5idXNbaWR4XSA9PSBidXMpCisJCQlyZXR1cm4gZDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworZW51bSBtdW5pdHR5cGUgeworCUNIQU4wLCBDSEFOMSwgQ0hBTjIsIFNBRF9BTEwsIFVUSUxfQUxMLCBTQUQKK307CisKK3N0cnVjdCBtdW5pdCB7CisJdTE2CWRpZDsKKwl1MTYJZGV2Zm5bTlVNX0lNQ107CisJdTgJYnVzaWR4OworCXU4CXBlcl9zb2NrZXQ7CisJZW51bSBtdW5pdHR5cGUgbXR5cGU7Cit9OworCisvKgorICogTGlzdCBvZiBQQ0kgZGV2aWNlIGlkcyB0aGF0IHdlIG5lZWQgdG9nZXRoZXIgd2l0aCBzb21lIGRldmljZQorICogbnVtYmVyIGFuZCBmdW5jdGlvbiBudW1iZXJzIHRvIHRlbGwgd2hpY2ggbWVtb3J5IGNvbnRyb2xsZXIgdGhlCisgKiBkZXZpY2UgYmVsb25ncyB0by4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBtdW5pdCBza3hfYWxsX211bml0c1tdID0geworCXsgMHgyMDU0LCB7IH0sIDEsIDEsIFNBRF9BTEwgfSwKKwl7IDB4MjA1NSwgeyB9LCAxLCAxLCBVVElMX0FMTCB9LAorCXsgMHgyMDQwLCB7IFBDSV9ERVZGTigxMCwgMCksIFBDSV9ERVZGTigxMiwgMCkgfSwgMiwgMiwgQ0hBTjAgfSwKKwl7IDB4MjA0NCwgeyBQQ0lfREVWRk4oMTAsIDQpLCBQQ0lfREVWRk4oMTIsIDQpIH0sIDIsIDIsIENIQU4xIH0sCisJeyAweDIwNDgsIHsgUENJX0RFVkZOKDExLCAwKSwgUENJX0RFVkZOKDEzLCAwKSB9LCAyLCAyLCBDSEFOMiB9LAorCXsgMHgyMDhlLCB7IH0sIDEsIDAsIFNBRCB9LAorCXsgfQorfTsKKworLyoKKyAqIFdlIHVzZSB0aGUgcGVyLXNvY2tldCBkZXZpY2UgMHgyMDE2IHRvIGNvdW50IGhvdyBtYW55IHNvY2tldHMgYXJlIHByZXNlbnQsCisgKiBhbmQgdG8gZGV0ZW1pbmUgd2hpY2ggUENJIGJ1c2VzIGFyZSBhc3NvY2lhdGVkIHdpdGggZWFjaCBzb2NrZXQuIEFsbG9jYXRlCisgKiBhbmQgYnVpbGQgdGhlIGZ1bGwgbGlzdCBvZiBhbGwgdGhlIHNreF9kZXYgc3RydWN0dXJlcyB0aGF0IHdlIG5lZWQgaGVyZS4KKyAqLworc3RhdGljIGludCBnZXRfYWxsX2J1c19tYXBwaW5ncyh2b2lkKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2LCAqcHJldjsKKwlzdHJ1Y3Qgc2t4X2RldiAqZDsKKwl1MzIgcmVnOworCWludCBuZGV2ID0gMDsKKworCXByZXYgPSBOVUxMOworCWZvciAoOzspIHsKKwkJcGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjAxNiwgcHJldik7CisJCWlmICghcGRldikKKwkJCWJyZWFrOworCQluZGV2Kys7CisJCWQgPSBremFsbG9jKHNpemVvZigqZCksIEdGUF9LRVJORUwpOworCQlpZiAoIWQpIHsKKwkJCXBjaV9kZXZfcHV0KHBkZXYpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4Q0MsICZyZWcpOworCQlkLT5idXNbMF0gPSAgR0VUX0JJVEZJRUxEKHJlZywgMCwgNyk7CisJCWQtPmJ1c1sxXSA9ICBHRVRfQklURklFTEQocmVnLCA4LCAxNSk7CisJCWQtPmJ1c1syXSA9ICBHRVRfQklURklFTEQocmVnLCAxNiwgMjMpOworCQlkLT5idXNbM10gPSAgR0VUX0JJVEZJRUxEKHJlZywgMjQsIDMxKTsKKwkJZWRhY19kYmcoMiwgImJ1c3NlczogJXgsICV4LCAleCwgJXhcbiIsCisJCQkgZC0+YnVzWzBdLCBkLT5idXNbMV0sIGQtPmJ1c1syXSwgZC0+YnVzWzNdKTsKKwkJbGlzdF9hZGRfdGFpbCgmZC0+bGlzdCwgJnNreF9lZGFjX2xpc3QpOworCQlza3hfbnVtX3NvY2tldHMrKzsKKwkJcHJldiA9IHBkZXY7CisJfQorCisJcmV0dXJuIG5kZXY7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2FsbF9tdW5pdHMoY29uc3Qgc3RydWN0IG11bml0ICptKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2LCAqcHJldjsKKwlzdHJ1Y3Qgc2t4X2RldiAqZDsKKwl1MzIgcmVnOworCWludCBpID0gMCwgbmRldiA9IDA7CisKKwlwcmV2ID0gTlVMTDsKKwlmb3IgKDs7KSB7CisJCXBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLCBtLT5kaWQsIHByZXYpOworCQlpZiAoIXBkZXYpCisJCQlicmVhazsKKwkJbmRldisrOworCQlpZiAobS0+cGVyX3NvY2tldCA9PSBOVU1fSU1DKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0lNQzsgaSsrKQorCQkJCWlmIChtLT5kZXZmbltpXSA9PSBwZGV2LT5kZXZmbikKKwkJCQkJYnJlYWs7CisJCQlpZiAoaSA9PSBOVU1fSU1DKQorCQkJCWdvdG8gZmFpbDsKKwkJfQorCQlkID0gZ2V0X3NreF9kZXYocGRldi0+YnVzLT5udW1iZXIsIG0tPmJ1c2lkeCk7CisJCWlmICghZCkKKwkJCWdvdG8gZmFpbDsKKworCQkvKiBCZSBzdXJlIHRoYXQgdGhlIGRldmljZSBpcyBlbmFibGVkICovCisJCWlmICh1bmxpa2VseShwY2lfZW5hYmxlX2RldmljZShwZGV2KSA8IDApKSB7CisJCQlza3hfcHJpbnRrKEtFUk5fRVJSLAorCQkJCSJDb3VsZG4ndCBlbmFibGUgJTA0eDolMDR4XG4iLCBQQ0lfVkVORE9SX0lEX0lOVEVMLCBtLT5kaWQpOworCQkJZ290byBmYWlsOworCQl9CisKKwkJc3dpdGNoIChtLT5tdHlwZSkgeworCQljYXNlIENIQU4wOiBjYXNlIENIQU4xOiBjYXNlIENIQU4yOgorCQkJcGNpX2Rldl9nZXQocGRldik7CisJCQlkLT5pbWNbaV0uY2hhblttLT5tdHlwZV0uY2RldiA9IHBkZXY7CisJCQlicmVhazsKKwkJY2FzZSBTQURfQUxMOgorCQkJcGNpX2Rldl9nZXQocGRldik7CisJCQlkLT5zYWRfYWxsID0gcGRldjsKKwkJCWJyZWFrOworCQljYXNlIFVUSUxfQUxMOgorCQkJcGNpX2Rldl9nZXQocGRldik7CisJCQlkLT51dGlsX2FsbCA9IHBkZXY7CisJCQlicmVhazsKKwkJY2FzZSBTQUQ6CisJCQkvKgorCQkJICogb25lIG9mIHRoZXNlIGRldmljZXMgcGVyIGNvcmUsIGluY2x1ZGluZyBjb3JlcworCQkJICogdGhhdCBkb24ndCBleGlzdCBvbiB0aGlzIFNLVS4gSWdub3JlIGFueSB0aGF0CisJCQkgKiByZWFkIGEgcm91dGUgdGFibGUgb2YgemVybywgbWFrZSBzdXJlIGFsbCB0aGUKKwkJCSAqIG5vbi16ZXJvIHZhbHVlcyBtYXRjaC4KKwkJCSAqLworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4QjQsICZyZWcpOworCQkJaWYgKHJlZyAhPSAwKSB7CisJCQkJaWYgKGQtPm1jcm91dGUgPT0gMCkKKwkJCQkJZC0+bWNyb3V0ZSA9IHJlZzsKKwkJCQllbHNlIGlmIChkLT5tY3JvdXRlICE9IHJlZykgeworCQkJCQlza3hfcHJpbnRrKEtFUk5fRVJSLAorCQkJCQkJIm1jcm91dGUgbWlzbWF0Y2hcbiIpOworCQkJCQlnb3RvIGZhaWw7CisJCQkJfQorCQkJfQorCQkJbmRldi0tOworCQkJYnJlYWs7CisJCX0KKworCQlwcmV2ID0gcGRldjsKKwl9CisKKwlyZXR1cm4gbmRldjsKK2ZhaWw6CisJcGNpX2Rldl9wdXQocGRldik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK2NvbnN0IHN0cnVjdCB4ODZfY3B1X2lkIHNreF9jcHVpZHNbXSA9IHsKKwl7IFg4Nl9WRU5ET1JfSU5URUwsIDYsIDB4NTUsIDAsIDAgfSwJLyogU2t5bGFrZSAqLworCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoeDg2Y3B1LCBza3hfY3B1aWRzKTsKKworc3RhdGljIHU4IGdldF9zcmNfaWQoc3RydWN0IHNreF9kZXYgKmQpCit7CisJdTMyIHJlZzsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkLT51dGlsX2FsbCwgMHhGMCwgJnJlZyk7CisKKwlyZXR1cm4gR0VUX0JJVEZJRUxEKHJlZywgMTIsIDE0KTsKK30KKworc3RhdGljIHU4IHNreF9nZXRfbm9kZV9pZChzdHJ1Y3Qgc2t4X2RldiAqZCkKK3sKKwl1MzIgcmVnOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGQtPnV0aWxfYWxsLCAweEY0LCAmcmVnKTsKKworCXJldHVybiBHRVRfQklURklFTEQocmVnLCAwLCAyKTsKK30KKworc3RhdGljIGludCBnZXRfZGltbV9hdHRyKHUzMiByZWcsIGludCBsb2JpdCwgaW50IGhpYml0LCBpbnQgYWRkLCBpbnQgbWludmFsLAorCQkJIGludCBtYXh2YWwsIGNoYXIgKm5hbWUpCit7CisJdTMyIHZhbCA9IEdFVF9CSVRGSUVMRChyZWcsIGxvYml0LCBoaWJpdCk7CisKKwlpZiAodmFsIDwgbWludmFsIHx8IHZhbCA+IG1heHZhbCkgeworCQllZGFjX2RiZygyLCAiYmFkICVzID0gJWQgKHJhdz0leClcbiIsIG5hbWUsIHZhbCwgcmVnKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiB2YWwgKyBhZGQ7Cit9CisKKyNkZWZpbmUgSVNfRElNTV9QUkVTRU5UKG10cikJCUdFVF9CSVRGSUVMRCgobXRyKSwgMTUsIDE1KQorCisjZGVmaW5lIG51bXJhbmsocmVnKSBnZXRfZGltbV9hdHRyKChyZWcpLCAxMiwgMTMsIDAsIDEsIDIsICJyYW5rcyIpCisjZGVmaW5lIG51bXJvdyhyZWcpIGdldF9kaW1tX2F0dHIoKHJlZyksIDIsIDQsIDEyLCAxLCA2LCAicm93cyIpCisjZGVmaW5lIG51bWNvbChyZWcpIGdldF9kaW1tX2F0dHIoKHJlZyksIDAsIDEsIDEwLCAwLCAyLCAiY29scyIpCisKK3N0YXRpYyBpbnQgZ2V0X3dpZHRoKHUzMiBtdHIpCit7CisJc3dpdGNoIChHRVRfQklURklFTEQobXRyLCA4LCA5KSkgeworCWNhc2UgMDoKKwkJcmV0dXJuIERFVl9YNDsKKwljYXNlIDE6CisJCXJldHVybiBERVZfWDg7CisJY2FzZSAyOgorCQlyZXR1cm4gREVWX1gxNjsKKwl9CisJcmV0dXJuIERFVl9VTktOT1dOOworfQorCitzdGF0aWMgaW50IHNreF9nZXRfaGlfbG8odm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwl1MzIgcmVnOworCisJcGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjAzNCwgTlVMTCk7CisJaWYgKCFwZGV2KSB7CisJCWVkYWNfZGJnKDAsICJDYW4ndCBnZXQgdG9sbS90b2htXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4RDAsICZyZWcpOworCXNreF90b2xtID0gcmVnOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweEQ0LCAmcmVnKTsKKwlza3hfdG9obSA9IHJlZzsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgMHhEOCwgJnJlZyk7CisJc2t4X3RvaG0gfD0gKHU2NClyZWcgPDwgMzI7CisKKwlwY2lfZGV2X3B1dChwZGV2KTsKKwllZGFjX2RiZygyLCAidG9sbT0lbGx4IHRvaG09JWxseFxuIiwgc2t4X3RvbG0sIHNreF90b2htKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9kaW1tX2luZm8odTMyIG10ciwgdTMyIGFtYXAsIHN0cnVjdCBkaW1tX2luZm8gKmRpbW0sCisJCQkgc3RydWN0IHNreF9pbWMgKmltYywgaW50IGNoYW4sIGludCBkaW1tbm8pCit7CisJaW50ICBiYW5rcyA9IDE2LCByYW5rcywgcm93cywgY29scywgbnBhZ2VzOworCXU2NCBzaXplOworCisJaWYgKCFJU19ESU1NX1BSRVNFTlQobXRyKSkKKwkJcmV0dXJuIDA7CisJcmFua3MgPSBudW1yYW5rKG10cik7CisJcm93cyA9IG51bXJvdyhtdHIpOworCWNvbHMgPSBudW1jb2wobXRyKTsKKworCS8qCisJICogQ29tcHV0ZSBzaXplIGluIDgtYnl0ZSAoMl4zKSB3b3JkcywgdGhlbiBzaGlmdCB0byBNaUIgKDJeMjApCisJICovCisJc2l6ZSA9ICgoMXVsbCA8PCAocm93cyArIGNvbHMgKyByYW5rcykpICogYmFua3MpID4+ICgyMCAtIDMpOworCW5wYWdlcyA9IE1pQl9UT19QQUdFUyhzaXplKTsKKworCWVkYWNfZGJnKDAsICJtYyMlZDogY2hhbm5lbCAlZCwgZGltbSAlZCwgJWxsZCBNYiAoJWQgcGFnZXMpIGJhbms6ICVkLCByYW5rOiAlZCwgcm93OiAlI3gsIGNvbDogJSN4XG4iLAorCQkgaW1jLT5tYywgY2hhbiwgZGltbW5vLCBzaXplLCBucGFnZXMsCisJCSBiYW5rcywgcmFua3MsIHJvd3MsIGNvbHMpOworCisJaW1jLT5jaGFuW2NoYW5dLmRpbW1zW2RpbW1ub10uY2xvc2VfcGcgPSBHRVRfQklURklFTEQobXRyLCAwLCAwKTsKKwlpbWMtPmNoYW5bY2hhbl0uZGltbXNbZGltbW5vXS5iYW5rX3hvcl9lbmFibGUgPSBHRVRfQklURklFTEQobXRyLCA5LCA5KTsKKwlpbWMtPmNoYW5bY2hhbl0uZGltbXNbZGltbW5vXS5maW5lX2dyYWluX2JhbmsgPSBHRVRfQklURklFTEQoYW1hcCwgMCwgMCk7CisJaW1jLT5jaGFuW2NoYW5dLmRpbW1zW2RpbW1ub10ucm93Yml0cyA9IHJvd3M7CisJaW1jLT5jaGFuW2NoYW5dLmRpbW1zW2RpbW1ub10uY29sYml0cyA9IGNvbHM7CisKKwlkaW1tLT5ucl9wYWdlcyA9IG5wYWdlczsKKwlkaW1tLT5ncmFpbiA9IDMyOworCWRpbW0tPmR0eXBlID0gZ2V0X3dpZHRoKG10cik7CisJZGltbS0+bXR5cGUgPSBNRU1fRERSNDsKKwlkaW1tLT5lZGFjX21vZGUgPSBFREFDX1NFQ0RFRDsgLyogbGlrZWx5IGJldHRlciB0aGFuIHRoaXMgKi8KKwlzbnByaW50ZihkaW1tLT5sYWJlbCwgc2l6ZW9mKGRpbW0tPmxhYmVsKSwgIkNQVV9TcmNJRCMldV9NQyMldV9DaGFuIyV1X0RJTU0jJXUiLAorCQkgaW1jLT5zcmNfaWQsIGltYy0+bG1jLCBjaGFuLCBkaW1tbm8pOworCisJcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgU0tYX0dFVF9NVE1UUihkZXYsIHJlZykgXAorCXBjaV9yZWFkX2NvbmZpZ19kd29yZCgoZGV2KSwgMHg4N2MsICZyZWcpCisKK3N0YXRpYyBib29sIHNreF9jaGVja19lY2Moc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdTMyIG10bXRyOworCisJU0tYX0dFVF9NVE1UUihwZGV2LCBtdG10cik7CisKKwlyZXR1cm4gISFHRVRfQklURklFTEQobXRtdHIsIDIsIDIpOworfQorCitzdGF0aWMgaW50IHNreF9nZXRfZGltbV9jb25maWcoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQoreworCXN0cnVjdCBza3hfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOworCXN0cnVjdCBza3hfaW1jICppbWMgPSBwdnQtPmltYzsKKwlzdHJ1Y3QgZGltbV9pbmZvICpkaW1tOworCWludCBpLCBqOworCXUzMiBtdHIsIGFtYXA7CisJaW50IG5kaW1tczsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fQ0hBTk5FTFM7IGkrKykgeworCQluZGltbXMgPSAwOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoaW1jLT5jaGFuW2ldLmNkZXYsIDB4OEMsICZhbWFwKTsKKwkJZm9yIChqID0gMDsgaiA8IE5VTV9ESU1NUzsgaisrKSB7CisJCQlkaW1tID0gRURBQ19ESU1NX1BUUihtY2ktPmxheWVycywgbWNpLT5kaW1tcywKKwkJCQkJICAgICBtY2ktPm5fbGF5ZXJzLCBpLCBqLCAwKTsKKwkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChpbWMtPmNoYW5baV0uY2RldiwKKwkJCQkJMHg4MCArIDQqaiwgJm10cik7CisJCQluZGltbXMgKz0gZ2V0X2RpbW1faW5mbyhtdHIsIGFtYXAsIGRpbW0sIGltYywgaSwgaik7CisJCX0KKwkJaWYgKG5kaW1tcyAmJiAhc2t4X2NoZWNrX2VjYyhpbWMtPmNoYW5bMF0uY2RldikpIHsKKwkJCXNreF9wcmludGsoS0VSTl9FUlIsICJFQ0MgaXMgZGlzYWJsZWQgb24gaW1jICVkXG4iLCBpbWMtPm1jKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNreF91bnJlZ2lzdGVyX21jaShzdHJ1Y3Qgc2t4X2ltYyAqaW1jKQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IGltYy0+bWNpOworCisJaWYgKCFtY2kpCisJCXJldHVybjsKKworCWVkYWNfZGJnKDAsICJNQyVkOiBtY2kgPSAlcFxuIiwgaW1jLT5tYywgbWNpKTsKKworCS8qIFJlbW92ZSBNQyBzeXNmcyBub2RlcyAqLworCWVkYWNfbWNfZGVsX21jKG1jaS0+cGRldik7CisKKwllZGFjX2RiZygxLCAiJXM6IGZyZWUgbWNpIHN0cnVjdFxuIiwgbWNpLT5jdGxfbmFtZSk7CisJa2ZyZWUobWNpLT5jdGxfbmFtZSk7CisJZWRhY19tY19mcmVlKG1jaSk7Cit9CisKK3N0YXRpYyBpbnQgc2t4X3JlZ2lzdGVyX21jaShzdHJ1Y3Qgc2t4X2ltYyAqaW1jKQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaTsKKwlzdHJ1Y3QgZWRhY19tY19sYXllciBsYXllcnNbMl07CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBpbWMtPmNoYW5bMF0uY2RldjsKKwlzdHJ1Y3Qgc2t4X3B2dCAqcHZ0OworCWludCByYzsKKworCS8qIGFsbG9jYXRlIGEgbmV3IE1DIGNvbnRyb2wgc3RydWN0dXJlICovCisJbGF5ZXJzWzBdLnR5cGUgPSBFREFDX01DX0xBWUVSX0NIQU5ORUw7CisJbGF5ZXJzWzBdLnNpemUgPSBOVU1fQ0hBTk5FTFM7CisJbGF5ZXJzWzBdLmlzX3ZpcnRfY3Nyb3cgPSBmYWxzZTsKKwlsYXllcnNbMV0udHlwZSA9IEVEQUNfTUNfTEFZRVJfU0xPVDsKKwlsYXllcnNbMV0uc2l6ZSA9IE5VTV9ESU1NUzsKKwlsYXllcnNbMV0uaXNfdmlydF9jc3JvdyA9IHRydWU7CisJbWNpID0gZWRhY19tY19hbGxvYyhpbWMtPm1jLCBBUlJBWV9TSVpFKGxheWVycyksIGxheWVycywKKwkJCSAgICBzaXplb2Yoc3RydWN0IHNreF9wdnQpKTsKKworCWlmICh1bmxpa2VseSghbWNpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllZGFjX2RiZygwLCAiTUMjJWQ6IG1jaSA9ICVwXG4iLCBpbWMtPm1jLCBtY2kpOworCisJLyogQXNzb2NpYXRlIHNreF9kZXYgYW5kIG1jaSBmb3IgZnV0dXJlIHVzYWdlICovCisJaW1jLT5tY2kgPSBtY2k7CisJcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwlwdnQtPmltYyA9IGltYzsKKworCW1jaS0+Y3RsX25hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIlNreWxha2UgU29ja2V0IyVkIElNQyMlZCIsCisJCQkJICBpbWMtPm5vZGVfaWQsIGltYy0+bG1jKTsKKwltY2ktPm10eXBlX2NhcCA9IE1FTV9GTEFHX0REUjQ7CisJbWNpLT5lZGFjX2N0bF9jYXAgPSBFREFDX0ZMQUdfTk9ORTsKKwltY2ktPmVkYWNfY2FwID0gRURBQ19GTEFHX05PTkU7CisJbWNpLT5tb2RfbmFtZSA9ICJza3hfZWRhYy5jIjsKKwltY2ktPmRldl9uYW1lID0gcGNpX25hbWUoaW1jLT5jaGFuWzBdLmNkZXYpOworCW1jaS0+bW9kX3ZlciA9IFNLWF9SRVZJU0lPTjsKKwltY2ktPmN0bF9wYWdlX3RvX3BoeXMgPSBOVUxMOworCisJcmMgPSBza3hfZ2V0X2RpbW1fY29uZmlnKG1jaSk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBmYWlsOworCisJLyogcmVjb3JkIHB0ciB0byB0aGUgZ2VuZXJpYyBkZXZpY2UgKi8KKwltY2ktPnBkZXYgPSAmcGRldi0+ZGV2OworCisJLyogYWRkIHRoaXMgbmV3IE1DIGNvbnRyb2wgc3RydWN0dXJlIHRvIEVEQUMncyBsaXN0IG9mIE1DcyAqLworCWlmICh1bmxpa2VseShlZGFjX21jX2FkZF9tYyhtY2kpKSkgeworCQllZGFjX2RiZygwLCAiTUM6IGZhaWxlZCBlZGFjX21jX2FkZF9tYygpXG4iKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dXJuIDA7CisKK2ZhaWw6CisJa2ZyZWUobWNpLT5jdGxfbmFtZSk7CisJZWRhY19tY19mcmVlKG1jaSk7CisJaW1jLT5tY2kgPSBOVUxMOworCXJldHVybiByYzsKK30KKworI2RlZmluZQlTS1hfTUFYX1NBRCAyNAorCisjZGVmaW5lIFNLWF9HRVRfU0FEKGQsIGksIHJlZykJXAorCXBjaV9yZWFkX2NvbmZpZ19kd29yZCgoZCktPnNhZF9hbGwsIDB4NjAgKyA4ICogKGkpLCAmcmVnKQorI2RlZmluZSBTS1hfR0VUX0lMVihkLCBpLCByZWcpCVwKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoKGQpLT5zYWRfYWxsLCAweDY0ICsgOCAqIChpKSwgJnJlZykKKworI2RlZmluZQlTS1hfU0FEX01PRDNNT0RFKHNhZCkJR0VUX0JJVEZJRUxEKChzYWQpLCAzMCwgMzEpCisjZGVmaW5lCVNLWF9TQURfTU9EMyhzYWQpCUdFVF9CSVRGSUVMRCgoc2FkKSwgMjcsIDI3KQorI2RlZmluZSBTS1hfU0FEX0xJTUlUKHNhZCkJKCgodTY0KUdFVF9CSVRGSUVMRCgoc2FkKSwgNywgMjYpIDw8IDI2KSB8IE1BU0syNikKKyNkZWZpbmUJU0tYX1NBRF9NT0QzQVNNT0QyKHNhZCkJR0VUX0JJVEZJRUxEKChzYWQpLCA1LCA2KQorI2RlZmluZQlTS1hfU0FEX0FUVFIoc2FkKQlHRVRfQklURklFTEQoKHNhZCksIDMsIDQpCisjZGVmaW5lCVNLWF9TQURfSU5URVJMRUFWRShzYWQpCUdFVF9CSVRGSUVMRCgoc2FkKSwgMSwgMikKKyNkZWZpbmUgU0tYX1NBRF9FTkFCTEUoc2FkKQlHRVRfQklURklFTEQoKHNhZCksIDAsIDApCisKKyNkZWZpbmUgU0tYX0lMVl9SRU1PVEUodGd0KQkoKCh0Z3QpICYgOCkgPT0gMCkKKyNkZWZpbmUgU0tYX0lMVl9UQVJHRVQodGd0KQkoKHRndCkgJiA3KQorCitzdGF0aWMgYm9vbCBza3hfc2FkX2RlY29kZShzdHJ1Y3QgZGVjb2RlZF9hZGRyICpyZXMpCit7CisJc3RydWN0IHNreF9kZXYgKmQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZza3hfZWRhY19saXN0LCB0eXBlb2YoKmQpLCBsaXN0KTsKKwl1NjQgYWRkciA9IHJlcy0+YWRkcjsKKwlpbnQgaSwgaWR4LCB0Z3QsIGxjaGFuLCBzaGlmdDsKKwl1MzIgc2FkLCBpbHY7CisJdTY0IGxpbWl0LCBwcmV2X2xpbWl0OworCWludCByZW1vdGUgPSAwOworCisJLyogU2ltcGxlIHNhbml0eSBjaGVjayBmb3IgSS9PIHNwYWNlIG9yIG91dCBvZiByYW5nZSAqLworCWlmIChhZGRyID49IHNreF90b2htIHx8IChhZGRyID49IHNreF90b2xtICYmIGFkZHIgPCBCSVRfVUxMKDMyKSkpIHsKKwkJZWRhY19kYmcoMCwgIkFkZHJlc3MgJWxseCBvdXQgb2YgcmFuZ2VcbiIsIGFkZHIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCityZXN0YXJ0OgorCXByZXZfbGltaXQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBTS1hfTUFYX1NBRDsgaSsrKSB7CisJCVNLWF9HRVRfU0FEKGQsIGksIHNhZCk7CisJCWxpbWl0ID0gU0tYX1NBRF9MSU1JVChzYWQpOworCQlpZiAoU0tYX1NBRF9FTkFCTEUoc2FkKSkgeworCQkJaWYgKGFkZHIgPj0gcHJldl9saW1pdCAmJiBhZGRyIDw9IGxpbWl0KQorCQkJCWdvdG8gc2FkX2ZvdW5kOworCQl9CisJCXByZXZfbGltaXQgPSBsaW1pdCArIDE7CisJfQorCWVkYWNfZGJnKDAsICJObyBTQUQgZW50cnkgZm9yICVsbHhcbiIsIGFkZHIpOworCXJldHVybiBmYWxzZTsKKworc2FkX2ZvdW5kOgorCVNLWF9HRVRfSUxWKGQsIGksIGlsdik7CisKKwlzd2l0Y2ggKFNLWF9TQURfSU5URVJMRUFWRShzYWQpKSB7CisJY2FzZSAwOgorCQlpZHggPSBHRVRfQklURklFTEQoYWRkciwgNiwgOCk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJaWR4ID0gR0VUX0JJVEZJRUxEKGFkZHIsIDgsIDEwKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlpZHggPSBHRVRfQklURklFTEQoYWRkciwgMTIsIDE0KTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlpZHggPSBHRVRfQklURklFTEQoYWRkciwgMzAsIDMyKTsKKwkJYnJlYWs7CisJfQorCisJdGd0ID0gR0VUX0JJVEZJRUxEKGlsdiwgNCAqIGlkeCwgNCAqIGlkeCArIDMpOworCisJLyogSWYgcG9pbnQgdG8gYW5vdGhlciBub2RlLCBmaW5kIGl0IGFuZCBzdGFydCBvdmVyICovCisJaWYgKFNLWF9JTFZfUkVNT1RFKHRndCkpIHsKKwkJaWYgKHJlbW90ZSkgeworCQkJZWRhY19kYmcoMCwgIkRvdWJsZSByZW1vdGUhXG4iKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZW1vdGUgPSAxOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGQsICZza3hfZWRhY19saXN0LCBsaXN0KSB7CisJCQlpZiAoZC0+aW1jWzBdLnNyY19pZCA9PSBTS1hfSUxWX1RBUkdFVCh0Z3QpKQorCQkJCWdvdG8gcmVzdGFydDsKKwkJfQorCQllZGFjX2RiZygwLCAiQ2FuJ3QgZmluZCBub2RlICVkXG4iLCBTS1hfSUxWX1RBUkdFVCh0Z3QpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChTS1hfU0FEX01PRDMoc2FkKSA9PSAwKQorCQlsY2hhbiA9IFNLWF9JTFZfVEFSR0VUKHRndCk7CisJZWxzZSB7CisJCXN3aXRjaCAoU0tYX1NBRF9NT0QzTU9ERShzYWQpKSB7CisJCWNhc2UgMDoKKwkJCXNoaWZ0ID0gNjsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlzaGlmdCA9IDg7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJc2hpZnQgPSAxMjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZWRhY19kYmcoMCwgImlsbGVnYWwgbW9kM21vZGVcbiIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXN3aXRjaCAoU0tYX1NBRF9NT0QzQVNNT0QyKHNhZCkpIHsKKwkJY2FzZSAwOgorCQkJbGNoYW4gPSAoYWRkciA+PiBzaGlmdCkgJSAzOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWxjaGFuID0gKGFkZHIgPj4gc2hpZnQpICUgMjsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlsY2hhbiA9IChhZGRyID4+IHNoaWZ0KSAlIDI7CisJCQlsY2hhbiA9IChsY2hhbiA8PCAxKSB8IH5sY2hhbjsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlsY2hhbiA9ICgoYWRkciA+PiBzaGlmdCkgJSAyKSA8PCAxOworCQkJYnJlYWs7CisJCX0KKwkJbGNoYW4gPSAobGNoYW4gPDwgMSkgfCAoU0tYX0lMVl9UQVJHRVQodGd0KSAmIDEpOworCX0KKworCXJlcy0+ZGV2ID0gZDsKKwlyZXMtPnNvY2tldCA9IGQtPmltY1swXS5zcmNfaWQ7CisJcmVzLT5pbWMgPSBHRVRfQklURklFTEQoZC0+bWNyb3V0ZSwgbGNoYW4gKiAzLCBsY2hhbiAqIDMgKyAyKTsKKwlyZXMtPmNoYW5uZWwgPSBHRVRfQklURklFTEQoZC0+bWNyb3V0ZSwgbGNoYW4gKiAyICsgMTgsIGxjaGFuICogMiArIDE5KTsKKworCWVkYWNfZGJnKDIsICIlbGx4OiBzb2NrZXQ9JWQgaW1jPSVkIGNoYW5uZWw9JWRcbiIsCisJCSByZXMtPmFkZHIsIHJlcy0+c29ja2V0LCByZXMtPmltYywgcmVzLT5jaGFubmVsKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworI2RlZmluZQlTS1hfTUFYX1RBRCA4CisKKyNkZWZpbmUgU0tYX0dFVF9UQURCQVNFKGQsIG1jLCBpLCByZWcpCQkJXAorCXBjaV9yZWFkX2NvbmZpZ19kd29yZCgoZCktPmltY1ttY10uY2hhblswXS5jZGV2LCAweDg1MCArIDQgKiAoaSksICZyZWcpCisjZGVmaW5lIFNLWF9HRVRfVEFEV0FZTkVTUyhkLCBtYywgaSwgcmVnKQkJXAorCXBjaV9yZWFkX2NvbmZpZ19kd29yZCgoZCktPmltY1ttY10uY2hhblswXS5jZGV2LCAweDg4MCArIDQgKiAoaSksICZyZWcpCisjZGVmaW5lIFNLWF9HRVRfVEFEQ0hOSUxWT0ZGU0VUKGQsIG1jLCBjaCwgaSwgcmVnKQlcCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKChkKS0+aW1jW21jXS5jaGFuW2NoXS5jZGV2LCAweDkwICsgNCAqIChpKSwgJnJlZykKKworI2RlZmluZQlTS1hfVEFEX0JBU0UoYikJCSgodTY0KUdFVF9CSVRGSUVMRCgoYiksIDEyLCAzMSkgPDwgMjYpCisjZGVmaW5lIFNLWF9UQURfU0tUX0dSQU4oYikJR0VUX0JJVEZJRUxEKChiKSwgNCwgNSkKKyNkZWZpbmUgU0tYX1RBRF9DSE5fR1JBTihiKQlHRVRfQklURklFTEQoKGIpLCA2LCA3KQorI2RlZmluZQlTS1hfVEFEX0xJTUlUKGIpCSgoKHU2NClHRVRfQklURklFTEQoKGIpLCAxMiwgMzEpIDw8IDI2KSB8IE1BU0syNikKKyNkZWZpbmUJU0tYX1RBRF9PRkZTRVQoYikJKCh1NjQpR0VUX0JJVEZJRUxEKChiKSwgNCwgMjMpIDw8IDI2KQorI2RlZmluZQlTS1hfVEFEX1NLVFdBWVMoYikJKDEgPDwgR0VUX0JJVEZJRUxEKChiKSwgMTAsIDExKSkKKyNkZWZpbmUJU0tYX1RBRF9DSE5XQVlTKGIpCShHRVRfQklURklFTEQoKGIpLCA4LCA5KSArIDEpCisKKy8qIHdoaWNoIGJpdCB1c2VkIGZvciBib3RoIHNvY2tldCBhbmQgY2hhbm5lbCBpbnRlcmxlYXZlICovCitzdGF0aWMgaW50IHNreF9ncmFudWxhcml0eVtdID0geyA2LCA4LCAxMiwgMzAgfTsKKworc3RhdGljIHU2NCBza3hfZG9faW50ZXJsZWF2ZSh1NjQgYWRkciwgaW50IHNoaWZ0LCBpbnQgd2F5cywgdTY0IGxvd2JpdHMpCit7CisJYWRkciA+Pj0gc2hpZnQ7CisJYWRkciAvPSB3YXlzOworCWFkZHIgPDw9IHNoaWZ0OworCisJcmV0dXJuIGFkZHIgfCAobG93Yml0cyAmICgoMXVsbCA8PCBzaGlmdCkgLSAxKSk7Cit9CisKK3N0YXRpYyBib29sIHNreF90YWRfZGVjb2RlKHN0cnVjdCBkZWNvZGVkX2FkZHIgKnJlcykKK3sKKwlpbnQgaTsKKwl1MzIgYmFzZSwgd2F5bmVzcywgY2huaWx2b2Zmc2V0OworCWludCBza3RfaW50ZXJsZWF2ZV9iaXQsIGNobl9pbnRlcmxlYXZlX2JpdDsKKwl1NjQgY2hhbm5lbF9hZGRyOworCisJZm9yIChpID0gMDsgaSA8IFNLWF9NQVhfVEFEOyBpKyspIHsKKwkJU0tYX0dFVF9UQURCQVNFKHJlcy0+ZGV2LCByZXMtPmltYywgaSwgYmFzZSk7CisJCVNLWF9HRVRfVEFEV0FZTkVTUyhyZXMtPmRldiwgcmVzLT5pbWMsIGksIHdheW5lc3MpOworCQlpZiAoU0tYX1RBRF9CQVNFKGJhc2UpIDw9IHJlcy0+YWRkciAmJiByZXMtPmFkZHIgPD0gU0tYX1RBRF9MSU1JVCh3YXluZXNzKSkKKwkJCWdvdG8gdGFkX2ZvdW5kOworCX0KKwllZGFjX2RiZygwLCAiTm8gVEFEIGVudHJ5IGZvciAlbGx4XG4iLCByZXMtPmFkZHIpOworCXJldHVybiBmYWxzZTsKKwordGFkX2ZvdW5kOgorCXJlcy0+c2t0d2F5cyA9IFNLWF9UQURfU0tUV0FZUyh3YXluZXNzKTsKKwlyZXMtPmNoYW53YXlzID0gU0tYX1RBRF9DSE5XQVlTKHdheW5lc3MpOworCXNrdF9pbnRlcmxlYXZlX2JpdCA9IHNreF9ncmFudWxhcml0eVtTS1hfVEFEX1NLVF9HUkFOKGJhc2UpXTsKKwljaG5faW50ZXJsZWF2ZV9iaXQgPSBza3hfZ3JhbnVsYXJpdHlbU0tYX1RBRF9DSE5fR1JBTihiYXNlKV07CisKKwlTS1hfR0VUX1RBRENITklMVk9GRlNFVChyZXMtPmRldiwgcmVzLT5pbWMsIHJlcy0+Y2hhbm5lbCwgaSwgY2huaWx2b2Zmc2V0KTsKKwljaGFubmVsX2FkZHIgPSByZXMtPmFkZHIgLSBTS1hfVEFEX09GRlNFVChjaG5pbHZvZmZzZXQpOworCisJaWYgKHJlcy0+Y2hhbndheXMgPT0gMyAmJiBza3RfaW50ZXJsZWF2ZV9iaXQgPiBjaG5faW50ZXJsZWF2ZV9iaXQpIHsKKwkJLyogTXVzdCBoYW5kbGUgY2hhbm5lbCBmaXJzdCwgdGhlbiBzb2NrZXQgKi8KKwkJY2hhbm5lbF9hZGRyID0gc2t4X2RvX2ludGVybGVhdmUoY2hhbm5lbF9hZGRyLCBjaG5faW50ZXJsZWF2ZV9iaXQsCisJCQkJCQkgcmVzLT5jaGFud2F5cywgY2hhbm5lbF9hZGRyKTsKKwkJY2hhbm5lbF9hZGRyID0gc2t4X2RvX2ludGVybGVhdmUoY2hhbm5lbF9hZGRyLCBza3RfaW50ZXJsZWF2ZV9iaXQsCisJCQkJCQkgcmVzLT5za3R3YXlzLCBjaGFubmVsX2FkZHIpOworCX0gZWxzZSB7CisJCS8qIEhhbmRsZSBzb2NrZXQgdGhlbiBjaGFubmVsLiBQcmVzZXJ2ZSBsb3cgYml0cyBmcm9tIG9yaWdpbmFsIGFkZHJlc3MgKi8KKwkJY2hhbm5lbF9hZGRyID0gc2t4X2RvX2ludGVybGVhdmUoY2hhbm5lbF9hZGRyLCBza3RfaW50ZXJsZWF2ZV9iaXQsCisJCQkJCQkgcmVzLT5za3R3YXlzLCByZXMtPmFkZHIpOworCQljaGFubmVsX2FkZHIgPSBza3hfZG9faW50ZXJsZWF2ZShjaGFubmVsX2FkZHIsIGNobl9pbnRlcmxlYXZlX2JpdCwKKwkJCQkJCSByZXMtPmNoYW53YXlzLCByZXMtPmFkZHIpOworCX0KKworCXJlcy0+Y2hhbl9hZGRyID0gY2hhbm5lbF9hZGRyOworCisJZWRhY19kYmcoMiwgIiVsbHg6IGNoYW5fYWRkcj0lbGx4IHNrdHdheXM9JWQgY2hhbndheXM9JWRcbiIsCisJCSByZXMtPmFkZHIsIHJlcy0+Y2hhbl9hZGRyLCByZXMtPnNrdHdheXMsIHJlcy0+Y2hhbndheXMpOworCXJldHVybiB0cnVlOworfQorCisjZGVmaW5lIFNLWF9NQVhfUklSIDQKKworI2RlZmluZSBTS1hfR0VUX1JJUldBWU5FU1MoZCwgbWMsIGNoLCBpLCByZWcpCQlcCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKChkKS0+aW1jW21jXS5jaGFuW2NoXS5jZGV2LAlcCisJCQkgICAgICAweDEwOCArIDQgKiAoaSksICZyZWcpCisjZGVmaW5lIFNLWF9HRVRfUklSSUxWKGQsIG1jLCBjaCwgaWR4LCBpLCByZWcpCQlcCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKChkKS0+aW1jW21jXS5jaGFuW2NoXS5jZGV2LAlcCisJCQkgICAgICAweDEyMCArIDE2ICogaWR4ICsgNCAqIChpKSwgJnJlZykKKworI2RlZmluZQlTS1hfUklSX1ZBTElEKGIpIEdFVF9CSVRGSUVMRCgoYiksIDMxLCAzMSkKKyNkZWZpbmUJU0tYX1JJUl9MSU1JVChiKSAoKCh1NjQpR0VUX0JJVEZJRUxEKChiKSwgMSwgMTEpIDw8IDI5KSB8IE1BU0syOSkKKyNkZWZpbmUJU0tYX1JJUl9XQVlTKGIpICgxIDw8IEdFVF9CSVRGSUVMRCgoYiksIDI4LCAyOSkpCisjZGVmaW5lCVNLWF9SSVJfQ0hBTl9SQU5LKGIpIEdFVF9CSVRGSUVMRCgoYiksIDE2LCAxOSkKKyNkZWZpbmUJU0tYX1JJUl9PRkZTRVQoYikgKCh1NjQpKEdFVF9CSVRGSUVMRCgoYiksIDIsIDE1KSA8PCAyNikpCisKK3N0YXRpYyBib29sIHNreF9yaXJfZGVjb2RlKHN0cnVjdCBkZWNvZGVkX2FkZHIgKnJlcykKK3sKKwlpbnQgaSwgaWR4LCBjaGFuX3Jhbms7CisJaW50IHNoaWZ0OworCXUzMiByaXJ3YXksIHJpcmx2OworCXU2NCByYW5rX2FkZHIsIHByZXZfbGltaXQgPSAwLCBsaW1pdDsKKworCWlmIChyZXMtPmRldi0+aW1jW3Jlcy0+aW1jXS5jaGFuW3Jlcy0+Y2hhbm5lbF0uZGltbXNbMF0uY2xvc2VfcGcpCisJCXNoaWZ0ID0gNjsKKwllbHNlCisJCXNoaWZ0ID0gMTM7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0tYX01BWF9SSVI7IGkrKykgeworCQlTS1hfR0VUX1JJUldBWU5FU1MocmVzLT5kZXYsIHJlcy0+aW1jLCByZXMtPmNoYW5uZWwsIGksIHJpcndheSk7CisJCWxpbWl0ID0gU0tYX1JJUl9MSU1JVChyaXJ3YXkpOworCQlpZiAoU0tYX1JJUl9WQUxJRChyaXJ3YXkpKSB7CisJCQlpZiAocHJldl9saW1pdCA8PSByZXMtPmNoYW5fYWRkciAmJgorCQkJICAgIHJlcy0+Y2hhbl9hZGRyIDw9IGxpbWl0KQorCQkJCWdvdG8gcmlyX2ZvdW5kOworCQl9CisJCXByZXZfbGltaXQgPSBsaW1pdDsKKwl9CisJZWRhY19kYmcoMCwgIk5vIFJJUiBlbnRyeSBmb3IgJWxseFxuIiwgcmVzLT5hZGRyKTsKKwlyZXR1cm4gZmFsc2U7CisKK3Jpcl9mb3VuZDoKKwlyYW5rX2FkZHIgPSByZXMtPmNoYW5fYWRkciA+PiBzaGlmdDsKKwlyYW5rX2FkZHIgLz0gU0tYX1JJUl9XQVlTKHJpcndheSk7CisJcmFua19hZGRyIDw8PSBzaGlmdDsKKwlyYW5rX2FkZHIgfD0gcmVzLT5jaGFuX2FkZHIgJiBHRU5NQVNLX1VMTChzaGlmdCAtIDEsIDApOworCisJcmVzLT5yYW5rX2FkZHJlc3MgPSByYW5rX2FkZHI7CisJaWR4ID0gKHJlcy0+Y2hhbl9hZGRyID4+IHNoaWZ0KSAlIFNLWF9SSVJfV0FZUyhyaXJ3YXkpOworCisJU0tYX0dFVF9SSVJJTFYocmVzLT5kZXYsIHJlcy0+aW1jLCByZXMtPmNoYW5uZWwsIGlkeCwgaSwgcmlybHYpOworCXJlcy0+cmFua19hZGRyZXNzID0gcmFua19hZGRyIC0gU0tYX1JJUl9PRkZTRVQocmlybHYpOworCWNoYW5fcmFuayA9IFNLWF9SSVJfQ0hBTl9SQU5LKHJpcmx2KTsKKwlyZXMtPmNoYW5uZWxfcmFuayA9IGNoYW5fcmFuazsKKwlyZXMtPmRpbW0gPSBjaGFuX3JhbmsgLyA0OworCXJlcy0+cmFuayA9IGNoYW5fcmFuayAlIDQ7CisKKwllZGFjX2RiZygyLCAiJWxseDogZGltbT0lZCByYW5rPSVkIGNoYW5fcmFuaz0lZCByYW5rX2FkZHI9JWxseFxuIiwKKwkJIHJlcy0+YWRkciwgcmVzLT5kaW1tLCByZXMtPnJhbmssCisJCSByZXMtPmNoYW5uZWxfcmFuaywgcmVzLT5yYW5rX2FkZHJlc3MpOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdTggc2t4X2Nsb3NlX3Jvd1tdID0geworCTE1LCAxNiwgMTcsIDE4LCAyMCwgMjEsIDIyLCAyOCwgMTAsIDExLCAxMiwgMTMsIDI5LCAzMCwgMzEsIDMyLCAzMworfTsKK3N0YXRpYyB1OCBza3hfY2xvc2VfY29sdW1uW10gPSB7CisJMywgNCwgNSwgMTQsIDE5LCAyMywgMjQsIDI1LCAyNiwgMjcKK307CitzdGF0aWMgdTggc2t4X29wZW5fcm93W10gPSB7CisJMTQsIDE1LCAxNiwgMjAsIDI4LCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjksIDMwLCAzMSwgMzIsIDMzCit9Oworc3RhdGljIHU4IHNreF9vcGVuX2NvbHVtbltdID0geworCTMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIKK307CitzdGF0aWMgdTggc2t4X29wZW5fZmluZV9jb2x1bW5bXSA9IHsKKwkzLCA0LCA1LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMworfTsKKworc3RhdGljIGludCBza3hfYml0cyh1NjQgYWRkciwgaW50IG5iaXRzLCB1OCAqYml0cykKK3sKKwlpbnQgaSwgcmVzID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBuYml0czsgaSsrKQorCQlyZXMgfD0gKChhZGRyID4+IGJpdHNbaV0pICYgMSkgPDwgaTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IHNreF9iYW5rX2JpdHModTY0IGFkZHIsIGludCBiMCwgaW50IGIxLCBpbnQgZG9feG9yLCBpbnQgeDAsIGludCB4MSkKK3sKKwlpbnQgcmV0ID0gR0VUX0JJVEZJRUxEKGFkZHIsIGIwLCBiMCkgfCAoR0VUX0JJVEZJRUxEKGFkZHIsIGIxLCBiMSkgPDwgMSk7CisKKwlpZiAoZG9feG9yKQorCQlyZXQgXj0gR0VUX0JJVEZJRUxEKGFkZHIsIHgwLCB4MCkgfCAoR0VUX0JJVEZJRUxEKGFkZHIsIHgxLCB4MSkgPDwgMSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgYm9vbCBza3hfbWFkX2RlY29kZShzdHJ1Y3QgZGVjb2RlZF9hZGRyICpyKQoreworCXN0cnVjdCBza3hfZGltbSAqZGltbSA9ICZyLT5kZXYtPmltY1tyLT5pbWNdLmNoYW5bci0+Y2hhbm5lbF0uZGltbXNbci0+ZGltbV07CisJaW50IGJnMCA9IGRpbW0tPmZpbmVfZ3JhaW5fYmFuayA/IDYgOiAxMzsKKworCWlmIChkaW1tLT5jbG9zZV9wZykgeworCQlyLT5yb3cgPSBza3hfYml0cyhyLT5yYW5rX2FkZHJlc3MsIGRpbW0tPnJvd2JpdHMsIHNreF9jbG9zZV9yb3cpOworCQlyLT5jb2x1bW4gPSBza3hfYml0cyhyLT5yYW5rX2FkZHJlc3MsIGRpbW0tPmNvbGJpdHMsIHNreF9jbG9zZV9jb2x1bW4pOworCQlyLT5jb2x1bW4gfD0gMHg0MDA7IC8qIEMxMCBpcyBhdXRvcHJlY2hhcmdlLCBhbHdheXMgc2V0ICovCisJCXItPmJhbmtfYWRkcmVzcyA9IHNreF9iYW5rX2JpdHMoci0+cmFua19hZGRyZXNzLCA4LCA5LCBkaW1tLT5iYW5rX3hvcl9lbmFibGUsIDIyLCAyOCk7CisJCXItPmJhbmtfZ3JvdXAgPSBza3hfYmFua19iaXRzKHItPnJhbmtfYWRkcmVzcywgNiwgNywgZGltbS0+YmFua194b3JfZW5hYmxlLCAyMCwgMjEpOworCX0gZWxzZSB7CisJCXItPnJvdyA9IHNreF9iaXRzKHItPnJhbmtfYWRkcmVzcywgZGltbS0+cm93Yml0cywgc2t4X29wZW5fcm93KTsKKwkJaWYgKGRpbW0tPmZpbmVfZ3JhaW5fYmFuaykKKwkJCXItPmNvbHVtbiA9IHNreF9iaXRzKHItPnJhbmtfYWRkcmVzcywgZGltbS0+Y29sYml0cywgc2t4X29wZW5fZmluZV9jb2x1bW4pOworCQllbHNlCisJCQlyLT5jb2x1bW4gPSBza3hfYml0cyhyLT5yYW5rX2FkZHJlc3MsIGRpbW0tPmNvbGJpdHMsIHNreF9vcGVuX2NvbHVtbik7CisJCXItPmJhbmtfYWRkcmVzcyA9IHNreF9iYW5rX2JpdHMoci0+cmFua19hZGRyZXNzLCAxOCwgMTksIGRpbW0tPmJhbmtfeG9yX2VuYWJsZSwgMjIsIDIzKTsKKwkJci0+YmFua19ncm91cCA9IHNreF9iYW5rX2JpdHMoci0+cmFua19hZGRyZXNzLCBiZzAsIDE3LCBkaW1tLT5iYW5rX3hvcl9lbmFibGUsIDIwLCAyMSk7CisJfQorCXItPnJvdyAmPSAoMXUgPDwgZGltbS0+cm93Yml0cykgLSAxOworCisJZWRhY19kYmcoMiwgIiVsbHg6IHJvdz0leCBjb2w9JXggYmFua19hZGRyPSVkIGJhbmtfZ3JvdXA9JWRcbiIsCisJCSByLT5hZGRyLCByLT5yb3csIHItPmNvbHVtbiwgci0+YmFua19hZGRyZXNzLAorCQkgci0+YmFua19ncm91cCk7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIHNreF9kZWNvZGUoc3RydWN0IGRlY29kZWRfYWRkciAqcmVzKQoreworCisJcmV0dXJuIHNreF9zYWRfZGVjb2RlKHJlcykgJiYgc2t4X3RhZF9kZWNvZGUocmVzKSAmJgorCQlza3hfcmlyX2RlY29kZShyZXMpICYmIHNreF9tYWRfZGVjb2RlKHJlcyk7Cit9CisKKyNpZmRlZiBDT05GSUdfRURBQ19ERUJVRworLyoKKyAqIERlYnVnIGZlYXR1cmUuIE1ha2UgL3N5cy9rZXJuZWwvZGVidWcvc2t4X2VkYWNfdGVzdC9hZGRyLgorICogV3JpdGUgYW4gYWRkcmVzcyB0byB0aGlzIGZpbGUgdG8gZXhlcmNpc2UgdGhlIGFkZHJlc3MgZGVjb2RlCisgKiBsb2dpYyBpbiB0aGlzIGRyaXZlci4KKyAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKnNreF90ZXN0Oworc3RhdGljIHU2NCBza3hfZmFrZV9hZGRyOworCitzdGF0aWMgaW50IGRlYnVnZnNfdTY0X3NldCh2b2lkICpkYXRhLCB1NjQgdmFsKQoreworCXN0cnVjdCBkZWNvZGVkX2FkZHIgcmVzOworCisJcmVzLmFkZHIgPSB2YWw7CisJc2t4X2RlY29kZSgmcmVzKTsKKworCXJldHVybiAwOworfQorCitERUZJTkVfU0lNUExFX0FUVFJJQlVURShmb3BzX3U2NF93bywgTlVMTCwgZGVidWdmc191NjRfc2V0LCAiJWxsdVxuIik7CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpteWRlYnVnZnNfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsIHVtb2RlX3QgbW9kZSwKKwkJCQkgICAgICAgc3RydWN0IGRlbnRyeSAqcGFyZW50LCB1NjQgKnZhbHVlKQoreworCXJldHVybiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIG1vZGUsIHBhcmVudCwgdmFsdWUsICZmb3BzX3U2NF93byk7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX3NreF9kZWJ1Zyh2b2lkKQoreworCXNreF90ZXN0ID0gZGVidWdmc19jcmVhdGVfZGlyKCJza3hfZWRhY190ZXN0IiwgTlVMTCk7CisJbXlkZWJ1Z2ZzX2NyZWF0ZSgiYWRkciIsIFNfSVdVU1IsIHNreF90ZXN0LCAmc2t4X2Zha2VfYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIHRlYXJkb3duX3NreF9kZWJ1Zyh2b2lkKQoreworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShza3hfdGVzdCk7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgc2V0dXBfc2t4X2RlYnVnKHZvaWQpCit7Cit9CisKK3N0YXRpYyB2b2lkIHRlYXJkb3duX3NreF9kZWJ1Zyh2b2lkKQoreworfQorI2VuZGlmIC8qQ09ORklHX0VEQUNfREVCVUcqLworCitzdGF0aWMgdm9pZCBza3hfbWNlX291dHB1dF9lcnJvcihzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCQkJIGNvbnN0IHN0cnVjdCBtY2UgKm0sCisJCQkJIHN0cnVjdCBkZWNvZGVkX2FkZHIgKnJlcykKK3sKKwllbnVtIGh3X2V2ZW50X21jX2Vycl90eXBlIHRwX2V2ZW50OworCWNoYXIgKnR5cGUsICpvcHR5cGUsIG1zZ1syNTZdOworCWJvb2wgcmlwdiA9IEdFVF9CSVRGSUVMRChtLT5tY2dzdGF0dXMsIDAsIDApOworCWJvb2wgb3ZlcmZsb3cgPSBHRVRfQklURklFTEQobS0+c3RhdHVzLCA2MiwgNjIpOworCWJvb2wgdW5jb3JyZWN0ZWRfZXJyb3IgPSBHRVRfQklURklFTEQobS0+c3RhdHVzLCA2MSwgNjEpOworCWJvb2wgcmVjb3ZlcmFibGU7CisJdTMyIGNvcmVfZXJyX2NudCA9IEdFVF9CSVRGSUVMRChtLT5zdGF0dXMsIDM4LCA1Mik7CisJdTMyIG1zY29kID0gR0VUX0JJVEZJRUxEKG0tPnN0YXR1cywgMTYsIDMxKTsKKwl1MzIgZXJyY29kZSA9IEdFVF9CSVRGSUVMRChtLT5zdGF0dXMsIDAsIDE1KTsKKwl1MzIgb3B0eXBlbnVtID0gR0VUX0JJVEZJRUxEKG0tPnN0YXR1cywgNCwgNik7CisKKwlyZWNvdmVyYWJsZSA9IEdFVF9CSVRGSUVMRChtLT5zdGF0dXMsIDU2LCA1Nik7CisKKwlpZiAodW5jb3JyZWN0ZWRfZXJyb3IpIHsKKwkJaWYgKHJpcHYpIHsKKwkJCXR5cGUgPSAiRkFUQUwiOworCQkJdHBfZXZlbnQgPSBIV19FVkVOVF9FUlJfRkFUQUw7CisJCX0gZWxzZSB7CisJCQl0eXBlID0gIk5PTl9GQVRBTCI7CisJCQl0cF9ldmVudCA9IEhXX0VWRU5UX0VSUl9VTkNPUlJFQ1RFRDsKKwkJfQorCX0gZWxzZSB7CisJCXR5cGUgPSAiQ09SUkVDVEVEIjsKKwkJdHBfZXZlbnQgPSBIV19FVkVOVF9FUlJfQ09SUkVDVEVEOworCX0KKworCS8qCisJICogQWNjb3JkaW5nIHdpdGggVGFibGUgMTUtOSBvZiB0aGUgSW50ZWwgQXJjaGl0ZWN0dXJlIHNwZWMgdm9sIDNBLAorCSAqIG1lbW9yeSBlcnJvcnMgc2hvdWxkIGZpdCBpbiB0aGlzIG1hc2s6CisJICoJMDAwZiAwMDAwIDFtbW0gY2NjYyAoYmluYXJ5KQorCSAqIHdoZXJlOgorCSAqCWYgPSBDb3JyZWN0aW9uIFJlcG9ydCBGaWx0ZXJpbmcgQml0LiBJZiAxLCBzdWJzZXF1ZW50IGVycm9ycworCSAqCSAgICB3b24ndCBiZSBzaG93bgorCSAqCW1tbSA9IGVycm9yIHR5cGUKKwkgKgljY2NjID0gY2hhbm5lbAorCSAqIElmIHRoZSBtYXNrIGRvZXNuJ3QgbWF0Y2gsIHJlcG9ydCBhbiBlcnJvciB0byB0aGUgcGFyc2luZyBsb2dpYworCSAqLworCWlmICghKChlcnJjb2RlICYgMHhlZjgwKSA9PSAweDgwKSkgeworCQlvcHR5cGUgPSAiQ2FuJ3QgcGFyc2U6IGl0IGlzIG5vdCBhIG1lbSI7CisJfSBlbHNlIHsKKwkJc3dpdGNoIChvcHR5cGVudW0pIHsKKwkJY2FzZSAwOgorCQkJb3B0eXBlID0gImdlbmVyaWMgdW5kZWYgcmVxdWVzdCBlcnJvciI7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJb3B0eXBlID0gIm1lbW9yeSByZWFkIGVycm9yIjsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlvcHR5cGUgPSAibWVtb3J5IHdyaXRlIGVycm9yIjsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlvcHR5cGUgPSAiYWRkci9jbWQgZXJyb3IiOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCW9wdHlwZSA9ICJtZW1vcnkgc2NydWJiaW5nIGVycm9yIjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJb3B0eXBlID0gInJlc2VydmVkIjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJc25wcmludGYobXNnLCBzaXplb2YobXNnKSwKKwkJICIlcyVzIGVycl9jb2RlOiUwNHg6JTA0eCBzb2NrZXQ6JWQgaW1jOiVkIHJhbms6JWQgYmc6JWQgYmE6JWQgcm93OiV4IGNvbDoleCIsCisJCSBvdmVyZmxvdyA/ICIgT1ZFUkZMT1ciIDogIiIsCisJCSAodW5jb3JyZWN0ZWRfZXJyb3IgJiYgcmVjb3ZlcmFibGUpID8gIiByZWNvdmVyYWJsZSIgOiAiIiwKKwkJIG1zY29kLCBlcnJjb2RlLAorCQkgcmVzLT5zb2NrZXQsIHJlcy0+aW1jLCByZXMtPnJhbmssCisJCSByZXMtPmJhbmtfZ3JvdXAsIHJlcy0+YmFua19hZGRyZXNzLCByZXMtPnJvdywgcmVzLT5jb2x1bW4pOworCisJZWRhY19kYmcoMCwgIiVzXG4iLCBtc2cpOworCisJLyogQ2FsbCB0aGUgaGVscGVyIHRvIG91dHB1dCBtZXNzYWdlICovCisJZWRhY19tY19oYW5kbGVfZXJyb3IodHBfZXZlbnQsIG1jaSwgY29yZV9lcnJfY250LAorCQkJICAgICBtLT5hZGRyID4+IFBBR0VfU0hJRlQsIG0tPmFkZHIgJiB+UEFHRV9NQVNLLCAwLAorCQkJICAgICByZXMtPmNoYW5uZWwsIHJlcy0+ZGltbSwgLTEsCisJCQkgICAgIG9wdHlwZSwgbXNnKTsKK30KKworc3RhdGljIGludCBza3hfbWNlX2NoZWNrX2Vycm9yKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgdmFsLAorCQkJICAgICAgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG1jZSAqbWNlID0gKHN0cnVjdCBtY2UgKilkYXRhOworCXN0cnVjdCBkZWNvZGVkX2FkZHIgcmVzOworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaTsKKwljaGFyICp0eXBlOworCisJaWYgKGdldF9lZGFjX3JlcG9ydF9zdGF0dXMoKSA9PSBFREFDX1JFUE9SVElOR19ESVNBQkxFRCkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCisJLyogaWdub3JlIHVubGVzcyB0aGlzIGlzIG1lbW9yeSByZWxhdGVkIHdpdGggYW4gYWRkcmVzcyAqLworCWlmICgobWNlLT5zdGF0dXMgJiAweGVmZmYpID4+IDcgIT0gMSB8fCAhKG1jZS0+c3RhdHVzICYgTUNJX1NUQVRVU19BRERSVikpCisJCXJldHVybiBOT1RJRllfRE9ORTsKKworCXJlcy5hZGRyID0gbWNlLT5hZGRyOworCWlmICghc2t4X2RlY29kZSgmcmVzKSkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCW1jaSA9IHJlcy5kZXYtPmltY1tyZXMuaW1jXS5tY2k7CisKKwlpZiAobWNlLT5tY2dzdGF0dXMgJiBNQ0dfU1RBVFVTX01DSVApCisJCXR5cGUgPSAiRXhjZXB0aW9uIjsKKwllbHNlCisJCXR5cGUgPSAiRXZlbnQiOworCisJc2t4X21jX3ByaW50ayhtY2ksIEtFUk5fREVCVUcsICJIQU5ETElORyBNQ0UgTUVNT1JZIEVSUk9SXG4iKTsKKworCXNreF9tY19wcmludGsobWNpLCBLRVJOX0RFQlVHLCAiQ1BVICVkOiBNYWNoaW5lIENoZWNrICVzOiAlTHggIgorCQkJICAiQmFuayAlZDogJTAxNkx4XG4iLCBtY2UtPmV4dGNwdSwgdHlwZSwKKwkJCSAgbWNlLT5tY2dzdGF0dXMsIG1jZS0+YmFuaywgbWNlLT5zdGF0dXMpOworCXNreF9tY19wcmludGsobWNpLCBLRVJOX0RFQlVHLCAiVFNDICVsbHggIiwgbWNlLT50c2MpOworCXNreF9tY19wcmludGsobWNpLCBLRVJOX0RFQlVHLCAiQUREUiAlbGx4ICIsIG1jZS0+YWRkcik7CisJc2t4X21jX3ByaW50ayhtY2ksIEtFUk5fREVCVUcsICJNSVNDICVsbHggIiwgbWNlLT5taXNjKTsKKworCXNreF9tY19wcmludGsobWNpLCBLRVJOX0RFQlVHLCAiUFJPQ0VTU09SICV1OiV4IFRJTUUgJWxsdSBTT0NLRVQgIgorCQkJICAiJXUgQVBJQyAleFxuIiwgbWNlLT5jcHV2ZW5kb3IsIG1jZS0+Y3B1aWQsCisJCQkgIG1jZS0+dGltZSwgbWNlLT5zb2NrZXRpZCwgbWNlLT5hcGljaWQpOworCisJc2t4X21jZV9vdXRwdXRfZXJyb3IobWNpLCBtY2UsICZyZXMpOworCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHNreF9tY2VfZGVjID0geworCS5ub3RpZmllcl9jYWxsID0gc2t4X21jZV9jaGVja19lcnJvciwKK307CisKK3N0YXRpYyB2b2lkIHNreF9yZW1vdmUodm9pZCkKK3sKKwlpbnQgaSwgajsKKwlzdHJ1Y3Qgc2t4X2RldiAqZCwgKnRtcDsKKworCWVkYWNfZGJnKDAsICJcbiIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGQsIHRtcCwgJnNreF9lZGFjX2xpc3QsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJmQtPmxpc3QpOworCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0lNQzsgaSsrKSB7CisJCQlza3hfdW5yZWdpc3Rlcl9tY2koJmQtPmltY1tpXSk7CisJCQlmb3IgKGogPSAwOyBqIDwgTlVNX0NIQU5ORUxTOyBqKyspCisJCQkJcGNpX2Rldl9wdXQoZC0+aW1jW2ldLmNoYW5bal0uY2Rldik7CisJCX0KKwkJcGNpX2Rldl9wdXQoZC0+dXRpbF9hbGwpOworCQlwY2lfZGV2X3B1dChkLT5zYWRfYWxsKTsKKworCQlrZnJlZShkKTsKKwl9Cit9CisKKy8qCisgKiBza3hfaW5pdDoKKyAqCW1ha2Ugc3VyZSB3ZSBhcmUgcnVubmluZyBvbiB0aGUgY29ycmVjdCBjcHUgbW9kZWwKKyAqCXNlYXJjaCBmb3IgYWxsIHRoZSBkZXZpY2VzIHdlIG5lZWQKKyAqCWNoZWNrIHdoaWNoIERJTU1zIGFyZSBwcmVzZW50LgorICovCitpbnQgX19pbml0IHNreF9pbml0KHZvaWQpCit7CisJY29uc3Qgc3RydWN0IHg4Nl9jcHVfaWQgKmlkOworCWNvbnN0IHN0cnVjdCBtdW5pdCAqbTsKKwlpbnQgcmMgPSAwLCBpOworCXU4IG1jID0gMCwgc3JjX2lkLCBub2RlX2lkOworCXN0cnVjdCBza3hfZGV2ICpkOworCisJZWRhY19kYmcoMiwgIlxuIik7CisKKwlpZCA9IHg4Nl9tYXRjaF9jcHUoc2t4X2NwdWlkcyk7CisJaWYgKCFpZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyYyA9IHNreF9nZXRfaGlfbG8oKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gZ2V0X2FsbF9idXNfbWFwcGluZ3MoKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGZhaWw7CisJaWYgKHJjID09IDApIHsKKwkJZWRhY19kYmcoMiwgIk5vIG1lbW9yeSBjb250cm9sbGVycyBmb3VuZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWZvciAobSA9IHNreF9hbGxfbXVuaXRzOyBtLT5kaWQ7IG0rKykgeworCQlyYyA9IGdldF9hbGxfbXVuaXRzKG0pOworCQlpZiAocmMgPCAwKQorCQkJZ290byBmYWlsOworCQlpZiAocmMgIT0gbS0+cGVyX3NvY2tldCAqIHNreF9udW1fc29ja2V0cykgeworCQkJZWRhY19kYmcoMiwgIkV4cGVjdGVkICVkLCBnb3QgJWQgb2YgJXhcbiIsCisJCQkJIG0tPnBlcl9zb2NrZXQgKiBza3hfbnVtX3NvY2tldHMsIHJjLCBtLT5kaWQpOworCQkJcmMgPSAtRU5PREVWOworCQkJZ290byBmYWlsOworCQl9CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkLCAmc2t4X2VkYWNfbGlzdCwgbGlzdCkgeworCQlzcmNfaWQgPSBnZXRfc3JjX2lkKGQpOworCQlub2RlX2lkID0gc2t4X2dldF9ub2RlX2lkKGQpOworCQllZGFjX2RiZygyLCAic3JjX2lkPSVkIG5vZGVfaWQ9JWRcbiIsIHNyY19pZCwgbm9kZV9pZCk7CisJCWZvciAoaSA9IDA7IGkgPCBOVU1fSU1DOyBpKyspIHsKKwkJCWQtPmltY1tpXS5tYyA9IG1jKys7CisJCQlkLT5pbWNbaV0ubG1jID0gaTsKKwkJCWQtPmltY1tpXS5zcmNfaWQgPSBzcmNfaWQ7CisJCQlkLT5pbWNbaV0ubm9kZV9pZCA9IG5vZGVfaWQ7CisJCQlyYyA9IHNreF9yZWdpc3Rlcl9tY2koJmQtPmltY1tpXSk7CisJCQlpZiAocmMgPCAwKQorCQkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCS8qIEVuc3VyZSB0aGF0IHRoZSBPUFNUQVRFIGlzIHNldCBjb3JyZWN0bHkgZm9yIFBPTEwgb3IgTk1JICovCisJb3BzdGF0ZV9pbml0KCk7CisKKwlzZXR1cF9za3hfZGVidWcoKTsKKworCW1jZV9yZWdpc3Rlcl9kZWNvZGVfY2hhaW4oJnNreF9tY2VfZGVjKTsKKworCXJldHVybiAwOworZmFpbDoKKwlza3hfcmVtb3ZlKCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2t4X2V4aXQodm9pZCkKK3sKKwllZGFjX2RiZygyLCAiXG4iKTsKKwltY2VfdW5yZWdpc3Rlcl9kZWNvZGVfY2hhaW4oJnNreF9tY2VfZGVjKTsKKwlza3hfcmVtb3ZlKCk7CisJdGVhcmRvd25fc2t4X2RlYnVnKCk7Cit9CisKK21vZHVsZV9pbml0KHNreF9pbml0KTsKK21vZHVsZV9leGl0KHNreF9leGl0KTsKKworbW9kdWxlX3BhcmFtKGVkYWNfb3Bfc3RhdGUsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVkYWNfb3Bfc3RhdGUsICJFREFDIEVycm9yIFJlcG9ydGluZyBzdGF0ZTogMD1Qb2xsLDE9Tk1JIik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BVVRIT1IoIlRvbnkgTHVjayIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNQyBEcml2ZXIgZm9yIEludGVsIFNreWxha2Ugc2VydmVyIHByb2Nlc3NvcnMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy93cS5jIGIvZHJpdmVycy9lZGFjL3dxLmMKaW5kZXggMWI4YzA3ZS4uMmE5YTExYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL3dxLmMKKysrIGIvZHJpdmVycy9lZGFjL3dxLmMKQEAgLTI3LDcgKzI3LDcgQEAKIAogaW50IGVkYWNfd29ya3F1ZXVlX3NldHVwKHZvaWQpCiB7Ci0Jd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiZWRhYy1wb2xsZXIiKTsKKwl3cSA9IGFsbG9jX29yZGVyZWRfd29ya3F1ZXVlKCJlZGFjLXBvbGxlciIsIFdRX01FTV9SRUNMQUlNKTsKIAlpZiAoIXdxKQogCQlyZXR1cm4gLUVOT0RFVjsKIAllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9LY29uZmlnIGIvZHJpdmVycy9leHRjb24vS2NvbmZpZwppbmRleCAzZDg5ZTYwLi4wNDc4OGQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2V4dGNvbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvZXh0Y29uL0tjb25maWcKQEAgLTk2LDYgKzk2LDEyIEBACiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBVU0IgcGVyaXBoZXJhbCBhbmQgVVNCIGhvc3QKIAkgIGRldGVjdGlvbiBieSBwYWxtYXMgdXNiLgogCitjb25maWcgRVhUQ09OX1FDT01fU1BNSV9NSVNDCisJdHJpc3RhdGUgIlF1YWxjb21tIFVTQiBleHRjb24gc3VwcG9ydCIKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBTUE1JIFBNSUMgYmFzZWQgVVNCIGNhYmxlIGRldGVjdGlvbgorCSAgc3VwcG9ydCBvbiBRdWFsY29tbSBQTUlDcyBzdWNoIGFzIFBNODk0MS4KKwogY29uZmlnIEVYVENPTl9SVDg5NzNBCiAJdHJpc3RhdGUgIlJpY2h0ZWsgUlQ4OTczQSBFWFRDT04gc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEkyQwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9leHRjb24vTWFrZWZpbGUgYi9kcml2ZXJzL2V4dGNvbi9NYWtlZmlsZQppbmRleCA5NzJjODEzLi4zMWEwYTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2V4dGNvbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2V4dGNvbi9NYWtlZmlsZQpAQCAtMTQsNiArMTQsNyBAQAogb2JqLSQoQ09ORklHX0VYVENPTl9NQVg3Nzg0MykJKz0gZXh0Y29uLW1heDc3ODQzLm8KIG9iai0kKENPTkZJR19FWFRDT05fTUFYODk5NykJKz0gZXh0Y29uLW1heDg5OTcubwogb2JqLSQoQ09ORklHX0VYVENPTl9QQUxNQVMpCSs9IGV4dGNvbi1wYWxtYXMubworb2JqLSQoQ09ORklHX0VYVENPTl9RQ09NX1NQTUlfTUlTQykgKz0gZXh0Y29uLXFjb20tc3BtaS1taXNjLm8KIG9iai0kKENPTkZJR19FWFRDT05fUlQ4OTczQSkJKz0gZXh0Y29uLXJ0ODk3M2Eubwogb2JqLSQoQ09ORklHX0VYVENPTl9TTTU1MDIpCSs9IGV4dGNvbi1zbTU1MDIubwogb2JqLSQoQ09ORklHX0VYVENPTl9VU0JfR1BJTykJKz0gZXh0Y29uLXVzYi1ncGlvLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1hZGMtamFjay5jIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLWFkYy1qYWNrLmMKaW5kZXggNDRlNDhhYS4uYmM1Mzg3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9leHRjb24vZXh0Y29uLWFkYy1qYWNrLmMKKysrIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLWFkYy1qYWNrLmMKQEAgLTMsNiArMyw5IEBACiAgKgogICogQW5hbG9nIEphY2sgZXh0Y29uIGRyaXZlciB3aXRoIEFEQy1iYXNlZCBkZXRlY3Rpb24gY2FwYWJpbGl0eS4KICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgU2Ftc3VuZyBFbGVjdHJvbmljcworICogQ2hhbndvbyBDaG9pIDxjdzAwLmNob2lAc2Ftc3VuZy5jb20+CisgKgogICogQ29weXJpZ2h0IChDKSAyMDEyIFNhbXN1bmcgRWxlY3Ryb25pY3MKICAqIE15dW5nSm9vIEhhbSA8bXl1bmdqb28uaGFtQHNhbXN1bmcuY29tPgogICoKQEAgLTU4LDcgKzYxLDcgQEAKIAlzdHJ1Y3QgYWRjX2phY2tfZGF0YSAqZGF0YSA9IGNvbnRhaW5lcl9vZih0b19kZWxheWVkX3dvcmsod29yayksCiAJCQlzdHJ1Y3QgYWRjX2phY2tfZGF0YSwKIAkJCWhhbmRsZXIpOwotCXUzMiBzdGF0ZSA9IDA7CisJc3RydWN0IGFkY19qYWNrX2NvbmQgKmRlZjsKIAlpbnQgcmV0LCBhZGNfdmFsOwogCWludCBpOwogCkBAIC03MCwxNyArNzMsMTggQEAKIAogCS8qIEdldCBzdGF0ZSBmcm9tIGFkYyB2YWx1ZSB3aXRoIGFkY19jb25kaXRpb25zICovCiAJZm9yIChpID0gMDsgaSA8IGRhdGEtPm51bV9jb25kaXRpb25zOyBpKyspIHsKLQkJc3RydWN0IGFkY19qYWNrX2NvbmQgKmRlZiA9ICZkYXRhLT5hZGNfY29uZGl0aW9uc1tpXTsKLQkJaWYgKCFkZWYtPnN0YXRlKQotCQkJYnJlYWs7CisJCWRlZiA9ICZkYXRhLT5hZGNfY29uZGl0aW9uc1tpXTsKIAkJaWYgKGRlZi0+bWluX2FkYyA8PSBhZGNfdmFsICYmIGRlZi0+bWF4X2FkYyA+PSBhZGNfdmFsKSB7Ci0JCQlzdGF0ZSA9IGRlZi0+c3RhdGU7Ci0JCQlicmVhazsKKwkJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhkYXRhLT5lZGV2LCBkZWYtPmlkLCB0cnVlKTsKKwkJCXJldHVybjsKIAkJfQogCX0KLQkvKiBpZiBubyBkZWYgaGFzIG1ldCwgaXQgbWVhbnMgc3RhdGUgPSAwIChubyBjYWJsZXMgYXR0YWNoZWQpICovCiAKLQlleHRjb25fc2V0X3N0YXRlKGRhdGEtPmVkZXYsIHN0YXRlKTsKKwkvKiBTZXQgdGhlIGRldGFjaGVkIHN0YXRlIGlmIGFkYyB2YWx1ZSBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIHJhbmdlICovCisJZm9yIChpID0gMDsgaSA8IGRhdGEtPm51bV9jb25kaXRpb25zOyBpKyspIHsKKwkJZGVmID0gJmRhdGEtPmFkY19jb25kaXRpb25zW2ldOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoZGF0YS0+ZWRldiwgZGVmLT5pZCwgZmFsc2UpOworCX0KIH0KIAogc3RhdGljIGlycXJldHVybl90IGFkY19qYWNrX2lycV90aHJlYWQoaW50IGlycSwgdm9pZCAqX2RhdGEpCkBAIC0xMTQsMTYgKzExOCwxNCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlpZiAoIXBkYXRhLT5hZGNfY29uZGl0aW9ucyB8fAotCQkJIXBkYXRhLT5hZGNfY29uZGl0aW9uc1swXS5zdGF0ZSkgeworCWlmICghcGRhdGEtPmFkY19jb25kaXRpb25zKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImVycm9yOiBhZGNfY29uZGl0aW9ucyBub3QgZGVmaW5lZC5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJZGF0YS0+YWRjX2NvbmRpdGlvbnMgPSBwZGF0YS0+YWRjX2NvbmRpdGlvbnM7CiAKIAkvKiBDaGVjayB0aGUgbGVuZ3RoIG9mIGFycmF5IGFuZCBzZXQgbnVtX2NvbmRpdGlvbnMgKi8KLQlmb3IgKGkgPSAwOyBkYXRhLT5hZGNfY29uZGl0aW9uc1tpXS5zdGF0ZTsgaSsrKQotCQk7CisJZm9yIChpID0gMDsgZGF0YS0+YWRjX2NvbmRpdGlvbnNbaV0uaWQgIT0gRVhUQ09OX05PTkU7IGkrKyk7CiAJZGF0YS0+bnVtX2NvbmRpdGlvbnMgPSBpOwogCiAJZGF0YS0+Y2hhbiA9IGlpb19jaGFubmVsX2dldCgmcGRldi0+ZGV2LCBwZGF0YS0+Y29uc3VtZXJfY2hhbm5lbCk7CkBAIC0xNTgsNiArMTYwLDcgQEAKIAlpZiAoZGF0YS0+d2FrZXVwX3NvdXJjZSkKIAkJZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIDEpOwogCisJYWRjX2phY2tfaGFuZGxlcigmZGF0YS0+aGFuZGxlci53b3JrKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9leHRjb24vZXh0Y29uLWFyaXpvbmEuYyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1hcml6b25hLmMKaW5kZXggMWQ4ZTBhNS4uNTZlNmM0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9leHRjb24vZXh0Y29uLWFyaXpvbmEuYworKysgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tYXJpem9uYS5jCkBAIC0xODMsNyArMTgzLDcgQEAKIAkJaWYgKGNsYW1wKQogCQkJdmFsID0gQVJJWk9OQV9STVZfU0hSVF9IUDFMOwogCQlicmVhazsKLQl9OworCX0KIAogCXNuZF9zb2NfZGFwbV9tdXRleF9sb2NrKGFyaXpvbmEtPmRhcG0pOwogCkBAIC02MTQsNyArNjE0LDcgQEAKIAl9CiAKIAkvKiBJZiB0aGUgY2FibGUgd2FzIHJlbW92ZWQgd2hpbGUgbWVhc3VyaW5nIGlnbm9yZSB0aGUgcmVzdWx0ICovCi0JcmV0ID0gZXh0Y29uX2dldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX01FQ0hBTklDQUwpOworCXJldCA9IGV4dGNvbl9nZXRfc3RhdGUoaW5mby0+ZWRldiwgRVhUQ09OX01FQ0hBTklDQUwpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoYXJpem9uYS0+ZGV2LCAiRmFpbGVkIHRvIGNoZWNrIGNhYmxlIHN0YXRlOiAlZFxuIiwKIAkJCXJldCk7CkBAIC02NDksNyArNjQ5LDcgQEAKIAllbHNlCiAJCXJlcG9ydCA9IEVYVENPTl9KQUNLX0hFQURQSE9ORTsKIAotCXJldCA9IGV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIHJlcG9ydCwgdHJ1ZSk7CisJcmV0ID0gZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIHJlcG9ydCwgdHJ1ZSk7CiAJaWYgKHJldCAhPSAwKQogCQlkZXZfZXJyKGFyaXpvbmEtPmRldiwgIkZhaWxlZCB0byByZXBvcnQgSFAvbGluZTogJWRcbiIsCiAJCQlyZXQpOwpAQCAtNzMyLDcgKzczMiw3IEBACiAJCQkgICBBUklaT05BX0FDQ0RFVF9NT0RFX01BU0ssIEFSSVpPTkFfQUNDREVUX01PREVfTUlDKTsKIAogCS8qIEp1c3QgcmVwb3J0IGhlYWRwaG9uZSAqLwotCXJldCA9IGV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9KQUNLX0hFQURQSE9ORSwgdHJ1ZSk7CisJcmV0ID0gZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9KQUNLX0hFQURQSE9ORSwgdHJ1ZSk7CiAJaWYgKHJldCAhPSAwKQogCQlkZXZfZXJyKGFyaXpvbmEtPmRldiwgIkZhaWxlZCB0byByZXBvcnQgaGVhZHBob25lOiAlZFxuIiwgcmV0KTsKIApAQCAtNzg5LDcgKzc4OSw3IEBACiAJCQkgICBBUklaT05BX0FDQ0RFVF9NT0RFX01BU0ssIEFSSVpPTkFfQUNDREVUX01PREVfTUlDKTsKIAogCS8qIEp1c3QgcmVwb3J0IGhlYWRwaG9uZSAqLwotCXJldCA9IGV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9KQUNLX0hFQURQSE9ORSwgdHJ1ZSk7CisJcmV0ID0gZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9KQUNLX0hFQURQSE9ORSwgdHJ1ZSk7CiAJaWYgKHJldCAhPSAwKQogCQlkZXZfZXJyKGFyaXpvbmEtPmRldiwgIkZhaWxlZCB0byByZXBvcnQgaGVhZHBob25lOiAlZFxuIiwgcmV0KTsKIApAQCAtODI5LDcgKzgyOSw3IEBACiAJbXV0ZXhfbG9jaygmaW5mby0+bG9jayk7CiAKIAkvKiBJZiB0aGUgY2FibGUgd2FzIHJlbW92ZWQgd2hpbGUgbWVhc3VyaW5nIGlnbm9yZSB0aGUgcmVzdWx0ICovCi0JcmV0ID0gZXh0Y29uX2dldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX01FQ0hBTklDQUwpOworCXJldCA9IGV4dGNvbl9nZXRfc3RhdGUoaW5mby0+ZWRldiwgRVhUQ09OX01FQ0hBTklDQUwpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoYXJpem9uYS0+ZGV2LCAiRmFpbGVkIHRvIGNoZWNrIGNhYmxlIHN0YXRlOiAlZFxuIiwKIAkJCQlyZXQpOwpAQCAtOTE0LDcgKzkxNCw3IEBACiAKIAkJYXJpem9uYV9pZGVudGlmeV9oZWFkcGhvbmUoaW5mbyk7CiAKLQkJcmV0ID0gZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwKKwkJcmV0ID0gZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsCiAJCQkJCSAgICAgIEVYVENPTl9KQUNLX01JQ1JPUEhPTkUsIHRydWUpOwogCQlpZiAocmV0ICE9IDApCiAJCQlkZXZfZXJyKGFyaXpvbmEtPmRldiwgIkhlYWRzZXQgcmVwb3J0IGZhaWxlZDogJWRcbiIsCkBAIC0xMTA4LDcgKzExMDgsNyBAQAogCiAJaWYgKGluZm8tPmxhc3RfamFja2RldCA9PSBwcmVzZW50KSB7CiAJCWRldl9kYmcoYXJpem9uYS0+ZGV2LCAiRGV0ZWN0ZWQgamFja1xuIik7Ci0JCXJldCA9IGV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsCisJCXJldCA9IGV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LAogCQkJCQkgICAgICBFWFRDT05fTUVDSEFOSUNBTCwgdHJ1ZSk7CiAKIAkJaWYgKHJldCAhPSAwKQpAQCAtMTE0OSwxMCArMTE0OSwxMyBAQAogCQkJCQkgaW5mby0+bWljZF9yYW5nZXNbaV0ua2V5LCAwKTsKIAkJaW5wdXRfc3luYyhpbmZvLT5pbnB1dCk7CiAKLQkJcmV0ID0gZXh0Y29uX3VwZGF0ZV9zdGF0ZShpbmZvLT5lZGV2LCAweGZmZmZmZmZmLCAwKTsKLQkJaWYgKHJldCAhPSAwKQotCQkJZGV2X2Vycihhcml6b25hLT5kZXYsICJSZW1vdmFsIHJlcG9ydCBmYWlsZWQ6ICVkXG4iLAotCQkJCXJldCk7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFyaXpvbmFfY2FibGUpIC0gMTsgaSsrKSB7CisJCQlyZXQgPSBleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwKKwkJCQkJYXJpem9uYV9jYWJsZVtpXSwgZmFsc2UpOworCQkJaWYgKHJldCAhPSAwKQorCQkJCWRldl9lcnIoYXJpem9uYS0+ZGV2LAorCQkJCQkiUmVtb3ZhbCByZXBvcnQgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJfQogCiAJCXJlZ21hcF91cGRhdGVfYml0cyhhcml6b25hLT5yZWdtYXAsCiAJCQkJICAgQVJJWk9OQV9KQUNLX0RFVEVDVF9ERUJPVU5DRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1heHAyODguYyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1heHAyODguYwppbmRleCBmZDU1YzJmLi40MmY0MWU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tYXhwMjg4LmMKKysrIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLWF4cDI4OC5jCkBAIC0xODksMTkgKzE4OSwxOSBAQAogCiAJc3dpdGNoIChjaHJnX3R5cGUpIHsKIAljYXNlIERFVF9TVEFUX1NEUDoKLQkJZGV2X2RiZyhpbmZvLT5kZXYsICJzZHAgY2FibGUgaXMgY29ubmVjZXRkXG4iKTsKKwkJZGV2X2RiZyhpbmZvLT5kZXYsICJzZHAgY2FibGUgaXMgY29ubmVjdGVkXG4iKTsKIAkJbm90aWZ5X290ZyA9IHRydWU7CiAJCW5vdGlmeV9jaGFyZ2VyID0gdHJ1ZTsKIAkJY2FibGUgPSBFWFRDT05fQ0hHX1VTQl9TRFA7CiAJCWJyZWFrOwogCWNhc2UgREVUX1NUQVRfQ0RQOgotCQlkZXZfZGJnKGluZm8tPmRldiwgImNkcCBjYWJsZSBpcyBjb25uZWNldGRcbiIpOworCQlkZXZfZGJnKGluZm8tPmRldiwgImNkcCBjYWJsZSBpcyBjb25uZWN0ZWRcbiIpOwogCQlub3RpZnlfb3RnID0gdHJ1ZTsKIAkJbm90aWZ5X2NoYXJnZXIgPSB0cnVlOwogCQljYWJsZSA9IEVYVENPTl9DSEdfVVNCX0NEUDsKIAkJYnJlYWs7CiAJY2FzZSBERVRfU1RBVF9EQ1A6Ci0JCWRldl9kYmcoaW5mby0+ZGV2LCAiZGNwIGNhYmxlIGlzIGNvbm5lY2V0ZFxuIik7CisJCWRldl9kYmcoaW5mby0+ZGV2LCAiZGNwIGNhYmxlIGlzIGNvbm5lY3RlZFxuIik7CiAJCW5vdGlmeV9jaGFyZ2VyID0gdHJ1ZTsKIAkJY2FibGUgPSBFWFRDT05fQ0hHX1VTQl9EQ1A7CiAJCWJyZWFrOwpAQCAtMjI2LDcgKzIyNiw3IEBACiAJfQogCiAJaWYgKG5vdGlmeV9jaGFyZ2VyKQotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBjYWJsZSwgdmJ1c19hdHRhY2gpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgY2FibGUsIHZidXNfYXR0YWNoKTsKIAogCS8qIENsZWFyIHRoZSBmbGFncyBvbiBkaXNjb25uZWN0IGV2ZW50ICovCiAJaWYgKCF2YnVzX2F0dGFjaCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1ncGlvLmMgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tZ3Bpby5jCmluZGV4IGQwMjM3ODkuLmViZWQyMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1ncGlvLmMKKysrIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLWdwaW8uYwpAQCAtNDksNyArNDksOCBAQAogCXN0YXRlID0gZ3Bpb2RfZ2V0X3ZhbHVlX2NhbnNsZWVwKGRhdGEtPmlkX2dwaW9kKTsKIAlpZiAoZGF0YS0+cGRhdGEtPmdwaW9fYWN0aXZlX2xvdykKIAkJc3RhdGUgPSAhc3RhdGU7Ci0JZXh0Y29uX3NldF9zdGF0ZShkYXRhLT5lZGV2LCBzdGF0ZSk7CisKKwlleHRjb25fc2V0X3N0YXRlX3N5bmMoZGF0YS0+ZWRldiwgZGF0YS0+cGRhdGEtPmV4dGNvbl9pZCwgc3RhdGUpOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QgZ3Bpb19pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tbWF4MTQ1NzcuYyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1tYXgxNDU3Ny5jCmluZGV4IDg1MmE3MTEuLjEyZTI2YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1tYXgxNDU3Ny5jCisrKyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1tYXgxNDU3Ny5jCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIENvcHlyaWdodCAoQykgMjAxMywyMDE0IFNhbXN1bmcgRWxlY3Ryb25pY3MKICAqIENoYW53b28gQ2hvaSA8Y3cwMC5jaG9pQHNhbXN1bmcuY29tPgotICogS3J6eXN6dG9mIEtvemxvd3NraSA8ay5rb3psb3dza2lAc2Ftc3VuZy5jb20+CisgKiBLcnp5c3p0b2YgS296bG93c2tpIDxrcnprQGtlcm5lbC5vcmc+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0zNTcsNyArMzU3LDcgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9KSUcsIGF0dGFjaGVkKTsKKwlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0pJRywgYXR0YWNoZWQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00NTQsMjQgKzQ1NCwyNCBAQAogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX1VTQiwgYXR0YWNoZWQpOwotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TRFAsCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCLCBhdHRhY2hlZCk7CisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TRFAsCiAJCQkJCWF0dGFjaGVkKTsKIAkJYnJlYWs7CiAJY2FzZSBNQVgxNDU3N19DSEFSR0VSX1RZUEVfREVESUNBVEVEX0NIRzoKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfRENQLAorCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfRENQLAogCQkJCQlhdHRhY2hlZCk7CiAJCWJyZWFrOwogCWNhc2UgTUFYMTQ1NzdfQ0hBUkdFUl9UWVBFX0RPV05TVFJFQU1fUE9SVDoKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfQ0RQLAorCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfQ0RQLAogCQkJCQlhdHRhY2hlZCk7CiAJCWJyZWFrOwogCWNhc2UgTUFYMTQ1NzdfQ0hBUkdFUl9UWVBFX1NQRUNJQUxfNTAwTUE6Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NMT1csCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TTE9XLAogCQkJCQlhdHRhY2hlZCk7CiAJCWJyZWFrOwogCWNhc2UgTUFYMTQ1NzdfQ0hBUkdFUl9UWVBFX1NQRUNJQUxfMUE6Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX0ZBU1QsCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9GQVNULAogCQkJCQlhdHRhY2hlZCk7CiAJCWJyZWFrOwogCWNhc2UgTUFYMTQ1NzdfQ0hBUkdFUl9UWVBFX05PTkU6CkBAIC03OTEsNiArNzkxLDYgQEAKIG1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobWF4MTQ1NzdfbXVpY19kcml2ZXIpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIk1heGltIDE0NTc3Lzc3ODM2IEV4dGNvbiBkcml2ZXIiKTsKLU1PRFVMRV9BVVRIT1IoIkNoYW53b28gQ2hvaSA8Y3cwMC5jaG9pQHNhbXN1bmcuY29tPiwgS3J6eXN6dG9mIEtvemxvd3NraSA8ay5rb3psb3dza2lAc2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJDaGFud29vIENob2kgPGN3MDAuY2hvaUBzYW1zdW5nLmNvbT4sIEtyenlzenRvZiBLb3psb3dza2kgPGtyemtAa2VybmVsLm9yZz4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BTElBUygicGxhdGZvcm06ZXh0Y29uLW1heDE0NTc3Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tbWF4MzM1NS5jIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLW1heDMzNTUuYwppbmRleCBjMjRhYmVjLi41MzNlMTZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tbWF4MzM1NS5jCisrKyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1tYXgzMzU1LmMKQEAgLTM5LDE2ICszOSwxNiBAQAogCQkgKiBBcyB3ZSBkb24ndCBoYXZlIGV2ZW50IGZvciBVU0IgcGVyaXBoZXJhbCBjYWJsZSBhdHRhY2hlZCwKIAkJICogd2Ugc2ltdWxhdGUgVVNCIHBlcmlwaGVyYWwgYXR0YWNoIGhlcmUuCiAJCSAqLwotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhkYXRhLT5lZGV2LCBFWFRDT05fVVNCX0hPU1QsIGZhbHNlKTsKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oZGF0YS0+ZWRldiwgRVhUQ09OX1VTQiwgdHJ1ZSk7CisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhkYXRhLT5lZGV2LCBFWFRDT05fVVNCX0hPU1QsIGZhbHNlKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGRhdGEtPmVkZXYsIEVYVENPTl9VU0IsIHRydWUpOwogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIElEID0gMCBtZWFucyBVU0IgSE9TVCBjYWJsZSBhdHRhY2hlZC4KIAkJICogQXMgd2UgZG9uJ3QgaGF2ZSBldmVudCBmb3IgVVNCIHBlcmlwaGVyYWwgY2FibGUgZGV0YWNoZWQsCiAJCSAqIHdlIHNpbXVsYXRlIFVTQiBwZXJpcGhlcmFsIGRldGFjaCBoZXJlLgogCQkgKi8KLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oZGF0YS0+ZWRldiwgRVhUQ09OX1VTQiwgZmFsc2UpOwotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhkYXRhLT5lZGV2LCBFWFRDT05fVVNCX0hPU1QsIHRydWUpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoZGF0YS0+ZWRldiwgRVhUQ09OX1VTQiwgZmFsc2UpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoZGF0YS0+ZWRldiwgRVhUQ09OX1VTQl9IT1NULCB0cnVlKTsKIAl9CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tbWF4Nzc2OTMuYyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1tYXg3NzY5My5jCmluZGV4IGYxN2NiNzYuLjY4ZGJjYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1tYXg3NzY5My5jCisrKyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1tYXg3NzY5My5jCkBAIC01MDUsOCArNTA1LDggQEAKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCi0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9ET0NLLCBhdHRhY2hlZCk7Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9ESVNQX01ITCwgYXR0YWNoZWQpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0RPQ0ssIGF0dGFjaGVkKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9ESVNQX01ITCwgYXR0YWNoZWQpOwogCQlnb3RvIG91dDsKIAljYXNlIE1BWDc3NjkzX01VSUNfQURDX0FVRElPX01PREVfUkVNT1RFOgkvKiBEb2NrLURlc2sgKi8KIAkJZG9ja19pZCA9IEVYVENPTl9ET0NLOwpAQCAtNTE0LDggKzUxNCw4IEBACiAJY2FzZSBNQVg3NzY5M19NVUlDX0FEQ19BVl9DQUJMRV9OT0xPQUQ6CQkvKiBEb2NrLUF1ZGlvICovCiAJCWRvY2tfaWQgPSBFWFRDT05fRE9DSzsKIAkJaWYgKCFhdHRhY2hlZCkgewotCQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX1VTQiwgZmFsc2UpOwotCQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfU0RQLAorCQkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9VU0IsIGZhbHNlKTsKKwkJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TRFAsCiAJCQkJCQlmYWxzZSk7CiAJCX0KIAkJYnJlYWs7CkBAIC01MzAsNyArNTMwLDcgQEAKIAkJCQkJYXR0YWNoZWQpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwotCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIGRvY2tfaWQsIGF0dGFjaGVkKTsKKwlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgZG9ja19pZCwgYXR0YWNoZWQpOwogCiBvdXQ6CiAJcmV0dXJuIDA7CkBAIC01OTYsNyArNTk2LDcgQEAKIAkJCQkJCWF0dGFjaGVkKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCX0hPU1QsIGF0dGFjaGVkKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9VU0JfSE9TVCwgYXR0YWNoZWQpOwogCQlicmVhazsKIAljYXNlIE1BWDc3NjkzX01VSUNfR05EX0FWX0NBQkxFX0xPQUQ6CiAJCS8qIEF1ZGlvIFZpZGVvIENhYmxlIHdpdGggbG9hZCwgUEFUSDpBVURJTyAqLwpAQCAtNjA0LDE0ICs2MDQsMTQgQEAKIAkJCQkJCWF0dGFjaGVkKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCLCBhdHRhY2hlZCk7Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NEUCwKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9VU0IsIGF0dGFjaGVkKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NEUCwKIAkJCQkJYXR0YWNoZWQpOwogCQlicmVhazsKIAljYXNlIE1BWDc3NjkzX01VSUNfR05EX01ITDoKIAljYXNlIE1BWDc3NjkzX01VSUNfR05EX01ITF9WQjoKIAkJLyogTUhMIG9yIE1ITCB3aXRoIFVTQi9UQSBjYWJsZSAqLwotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fRElTUF9NSEwsIGF0dGFjaGVkKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9ESVNQX01ITCwgYXR0YWNoZWQpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZXZfZXJyKGluZm8tPmRldiwgImZhaWxlZCB0byBkZXRlY3QgJXMgY2FibGUgb2YgZ25kIHR5cGVcbiIsCkBAIC02NTMsNyArNjUzLDcgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9KSUcsIGF0dGFjaGVkKTsKKwlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0pJRywgYXR0YWNoZWQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC04MDcsMTAgKzgwNywxMCBAQAogCQkJICogLSBTdXBwb3J0IGNoYXJnaW5nIHRocm91Z2ggbWljcm8tdXNiIHBvcnQgd2l0aG91dAogCQkJICogICBkYXRhIGNvbm5lY3Rpb24KIAkJCSAqLwotCQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfRENQLAorCQkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX0RDUCwKIAkJCQkJCWF0dGFjaGVkKTsKIAkJCWlmICghY2FibGVfYXR0YWNoZWQpCi0JCQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwKKwkJCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwKIAkJCQkJRVhUQ09OX0RJU1BfTUhMLCBjYWJsZV9hdHRhY2hlZCk7CiAJCQlicmVhazsKIAkJfQpAQCAtODM0LDEzICs4MzQsMTMgQEAKIAkJCSAqIC0gU3VwcG9ydCBjaGFyZ2luZyB0aHJvdWdoIG1pY3JvLXVzYiBwb3J0IHdpdGhvdXQKIAkJCSAqICAgZGF0YSBjb25uZWN0aW9uLgogCQkJICovCi0JCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCLAorCQkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9VU0IsCiAJCQkJCQlhdHRhY2hlZCk7Ci0JCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TRFAsCisJCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfU0RQLAogCQkJCQkJYXR0YWNoZWQpOwogCiAJCQlpZiAoIWNhYmxlX2F0dGFjaGVkKQotCQkJCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9ET0NLLAorCQkJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fRE9DSywKIAkJCQkJCQljYWJsZV9hdHRhY2hlZCk7CiAJCQlicmVhazsKIAkJY2FzZSBNQVg3NzY5M19NVUlDX0FEQ19SRVNFUlZFRF9BQ0NfMzoJCS8qIERvY2stU21hcnQgKi8KQEAgLTg2OSw5ICs4NjksOSBAQAogCQkJaWYgKHJldCA8IDApCiAJCQkJcmV0dXJuIHJldDsKIAotCQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0RPQ0ssCisJCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0RPQ0ssCiAJCQkJCQlhdHRhY2hlZCk7Ci0JCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fRElTUF9NSEwsCisJCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0RJU1BfTUhMLAogCQkJCQkJYXR0YWNoZWQpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTkwNSwyOCArOTA1LDI4IEBACiAJCQlpZiAocmV0IDwgMCkKIAkJCQlyZXR1cm4gcmV0OwogCi0JCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCLAorCQkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9VU0IsCiAJCQkJCQlhdHRhY2hlZCk7Ci0JCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TRFAsCisJCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfU0RQLAogCQkJCQkJYXR0YWNoZWQpOwogCQkJYnJlYWs7CiAJCWNhc2UgTUFYNzc2OTNfQ0hBUkdFUl9UWVBFX0RFRElDQVRFRF9DSEc6CiAJCQkvKiBPbmx5IFRBIGNhYmxlICovCi0JCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9EQ1AsCisJCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfRENQLAogCQkJCQkJYXR0YWNoZWQpOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBNQVg3NzY5M19DSEFSR0VSX1RZUEVfRE9XTlNUUkVBTV9QT1JUOgotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9DRFAsCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9DRFAsCiAJCQkJCWF0dGFjaGVkKTsKIAkJYnJlYWs7CiAJY2FzZSBNQVg3NzY5M19DSEFSR0VSX1RZUEVfQVBQTEVfNTAwTUE6Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NMT1csCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TTE9XLAogCQkJCQlhdHRhY2hlZCk7CiAJCWJyZWFrOwogCWNhc2UgTUFYNzc2OTNfQ0hBUkdFUl9UWVBFX0FQUExFXzFBXzJBOgotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9GQVNULAorCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfRkFTVCwKIAkJCQkJYXR0YWNoZWQpOwogCQlicmVhazsKIAljYXNlIE1BWDc3NjkzX0NIQVJHRVJfVFlQRV9ERUFEX0JBVFRFUlk6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tbWF4Nzc4NDMuYyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1tYXg3Nzg0My5jCmluZGV4IGIxODhiZDYuLjVkMTFmZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1tYXg3Nzg0My5jCisrKyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1tYXg3Nzg0My5jCkBAIC0zNDYsNyArMzQ2LDcgQEAKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCi0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9VU0JfSE9TVCwgYXR0YWNoZWQpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX1VTQl9IT1NULCBhdHRhY2hlZCk7CiAJCWJyZWFrOwogCWNhc2UgTUFYNzc4NDNfTVVJQ19HTkRfTUhMX1ZCOgogCWNhc2UgTUFYNzc4NDNfTVVJQ19HTkRfTUhMOgpAQCAtMzU2LDcgKzM1Niw3IEBACiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fRElTUF9NSEwsIGF0dGFjaGVkKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9ESVNQX01ITCwgYXR0YWNoZWQpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZXZfZXJyKGluZm8tPmRldiwgImZhaWxlZCB0byBkZXRlY3QgJXMgYWNjZXNzb3J5KGduZDoweCV4KVxuIiwKQEAgLTM5Miw3ICszOTIsNyBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0pJRywgYXR0YWNoZWQpOworCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fSklHLCBhdHRhY2hlZCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ4Niw4ICs0ODYsOCBAQAogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX1VTQiwgYXR0YWNoZWQpOwotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TRFAsCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCLCBhdHRhY2hlZCk7CisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TRFAsCiAJCQkJCWF0dGFjaGVkKTsKIAkJYnJlYWs7CiAJY2FzZSBNQVg3Nzg0M19NVUlDX0NIR19ET1dOU1RSRUFNOgpAQCAtNDk3LDcgKzQ5Nyw3IEBACiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9DRFAsCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9DRFAsCiAJCQkJCWF0dGFjaGVkKTsKIAkJYnJlYWs7CiAJY2FzZSBNQVg3Nzg0M19NVUlDX0NIR19ERURJQ0FURUQ6CkBAIC01MDcsNyArNTA3LDcgQEAKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCi0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX0RDUCwKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX0RDUCwKIAkJCQkJYXR0YWNoZWQpOwogCQlicmVhazsKIAljYXNlIE1BWDc3ODQzX01VSUNfQ0hHX1NQRUNJQUxfNTAwTUE6CkBAIC01MTcsNyArNTE3LDcgQEAKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCi0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NMT1csCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TTE9XLAogCQkJCQlhdHRhY2hlZCk7CiAJCWJyZWFrOwogCWNhc2UgTUFYNzc4NDNfTVVJQ19DSEdfU1BFQ0lBTF8xQToKQEAgLTUyNyw3ICs1MjcsNyBAQAogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfRkFTVCwKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX0ZBU1QsCiAJCQkJCWF0dGFjaGVkKTsKIAkJYnJlYWs7CiAJY2FzZSBNQVg3Nzg0M19NVUlDX0NIR19HTkQ6CkBAIC01MzYsMTAgKzUzNiwxMCBAQAogCiAJCS8qIENoYXJnZXIgY2FibGUgb24gTUhMIGFjY2Vzc29yeSBpcyBhdHRhY2ggb3IgZGV0YWNoICovCiAJCWlmIChnbmRfdHlwZSA9PSBNQVg3Nzg0M19NVUlDX0dORF9NSExfVkIpCi0JCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9EQ1AsCisJCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfRENQLAogCQkJCQkJdHJ1ZSk7CiAJCWVsc2UgaWYgKGduZF90eXBlID09IE1BWDc3ODQzX01VSUNfR05EX01ITCkKLQkJCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX0RDUCwKKwkJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9EQ1AsCiAJCQkJCQlmYWxzZSk7CiAJCWJyZWFrOwogCWNhc2UgTUFYNzc4NDNfTVVJQ19DSEdfTk9ORToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1tYXg4OTk3LmMgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tbWF4ODk5Ny5jCmluZGV4IDlhODkzMjAuLjRhMDYxMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1tYXg4OTk3LmMKKysrIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLW1heDg5OTcuYwpAQCAtMzMxLDExICszMzEsMTEgQEAKIAogCXN3aXRjaCAodXNiX3R5cGUpIHsKIAljYXNlIE1BWDg5OTdfVVNCX0hPU1Q6Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9VU0JfSE9TVCwgYXR0YWNoZWQpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX1VTQl9IT1NULCBhdHRhY2hlZCk7CiAJCWJyZWFrOwogCWNhc2UgTUFYODk5N19VU0JfREVWSUNFOgotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCLCBhdHRhY2hlZCk7Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NEUCwKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9VU0IsIGF0dGFjaGVkKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NEUCwKIAkJCQkJYXR0YWNoZWQpOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMzYxLDcgKzM2MSw3IEBACiAJc3dpdGNoIChjYWJsZV90eXBlKSB7CiAJY2FzZSBNQVg4OTk3X01VSUNfQURDX0FWX0NBQkxFX05PTE9BRDoKIAljYXNlIE1BWDg5OTdfTVVJQ19BRENfRkFDVE9SWV9NT0RFX1VBUlRfT046Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9ET0NLLCBhdHRhY2hlZCk7CisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fRE9DSywgYXR0YWNoZWQpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZXZfZXJyKGluZm8tPmRldiwgImZhaWxlZCB0byBkZXRlY3QgJXMgZG9jayBkZXZpY2VcbiIsCkBAIC0zODQsNyArMzg0LDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fSklHLCBhdHRhY2hlZCk7CisJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9KSUcsIGF0dGFjaGVkKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDA2LDcgKzQwNiw3IEBACiAJCQlyZXR1cm4gcmV0OwogCQlicmVhazsKIAljYXNlIE1BWDg5OTdfTVVJQ19BRENfTUhMOgotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fRElTUF9NSEwsIGF0dGFjaGVkKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9ESVNQX01ITCwgYXR0YWNoZWQpOwogCQlicmVhazsKIAljYXNlIE1BWDg5OTdfTVVJQ19BRENfRkFDVE9SWV9NT0RFX1VTQl9PRkY6CiAJY2FzZSBNQVg4OTk3X01VSUNfQURDX0ZBQ1RPUllfTU9ERV9VU0JfT046CkBAIC00ODksMTkgKzQ4OSwxOSBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgTUFYODk5N19DSEFSR0VSX1RZUEVfRE9XTlNUUkVBTV9QT1JUOgotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9DRFAsCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9DRFAsCiAJCQkJCWF0dGFjaGVkKTsKIAkJYnJlYWs7CiAJY2FzZSBNQVg4OTk3X0NIQVJHRVJfVFlQRV9ERURJQ0FURURfQ0hHOgotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9EQ1AsCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9EQ1AsCiAJCQkJCWF0dGFjaGVkKTsKIAkJYnJlYWs7CiAJY2FzZSBNQVg4OTk3X0NIQVJHRVJfVFlQRV81MDBNQToKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfU0xPVywKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NMT1csCiAJCQkJCWF0dGFjaGVkKTsKIAkJYnJlYWs7CiAJY2FzZSBNQVg4OTk3X0NIQVJHRVJfVFlQRV8xQToKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfRkFTVCwKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX0ZBU1QsCiAJCQkJCWF0dGFjaGVkKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1wYWxtYXMuYyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1wYWxtYXMuYwppbmRleCBjYWZmNDZjLi42MzRiYTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tcGFsbWFzLmMKKysrIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLXBhbG1hcy5jCkBAIC02MSw3ICs2MSw3IEBACiAJaWYgKHZidXNfbGluZV9zdGF0ZSAmIFBBTE1BU19JTlQzX0xJTkVfU1RBVEVfVkJVUykgewogCQlpZiAocGFsbWFzX3VzYi0+bGlua3N0YXQgIT0gUEFMTUFTX1VTQl9TVEFURV9WQlVTKSB7CiAJCQlwYWxtYXNfdXNiLT5saW5rc3RhdCA9IFBBTE1BU19VU0JfU1RBVEVfVkJVUzsKLQkJCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGVkZXYsIEVYVENPTl9VU0IsIHRydWUpOworCQkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGVkZXYsIEVYVENPTl9VU0IsIHRydWUpOwogCQkJZGV2X2luZm8ocGFsbWFzX3VzYi0+ZGV2LCAiVVNCIGNhYmxlIGlzIGF0dGFjaGVkXG4iKTsKIAkJfSBlbHNlIHsKIAkJCWRldl9kYmcocGFsbWFzX3VzYi0+ZGV2LApAQCAtNzAsNyArNzAsNyBAQAogCX0gZWxzZSBpZiAoISh2YnVzX2xpbmVfc3RhdGUgJiBQQUxNQVNfSU5UM19MSU5FX1NUQVRFX1ZCVVMpKSB7CiAJCWlmIChwYWxtYXNfdXNiLT5saW5rc3RhdCA9PSBQQUxNQVNfVVNCX1NUQVRFX1ZCVVMpIHsKIAkJCXBhbG1hc191c2ItPmxpbmtzdGF0ID0gUEFMTUFTX1VTQl9TVEFURV9ESVNDT05ORUNUOwotCQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oZWRldiwgRVhUQ09OX1VTQiwgZmFsc2UpOworCQkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGVkZXYsIEVYVENPTl9VU0IsIGZhbHNlKTsKIAkJCWRldl9pbmZvKHBhbG1hc191c2ItPmRldiwgIlVTQiBjYWJsZSBpcyBkZXRhY2hlZFxuIik7CiAJCX0gZWxzZSB7CiAJCQlkZXZfZGJnKHBhbG1hc191c2ItPmRldiwKQEAgLTk4LDcgKzk4LDcgQEAKIAkJCVBBTE1BU19VU0JfSURfSU5UX0xBVENIX0NMUiwKIAkJCVBBTE1BU19VU0JfSURfSU5UX0VOX0hJX0NMUl9JRF9HTkQpOwogCQlwYWxtYXNfdXNiLT5saW5rc3RhdCA9IFBBTE1BU19VU0JfU1RBVEVfSUQ7Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGVkZXYsIEVYVENPTl9VU0JfSE9TVCwgdHJ1ZSk7CisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhlZGV2LCBFWFRDT05fVVNCX0hPU1QsIHRydWUpOwogCQlkZXZfaW5mbyhwYWxtYXNfdXNiLT5kZXYsICJVU0ItSE9TVCBjYWJsZSBpcyBhdHRhY2hlZFxuIik7CiAJfSBlbHNlIGlmICgoc2V0ICYgUEFMTUFTX1VTQl9JRF9JTlRfU1JDX0lEX0ZMT0FUKSAmJgogCQkJCShpZF9zcmMgJiBQQUxNQVNfVVNCX0lEX0lOVF9TUkNfSURfRkxPQVQpKSB7CkBAIC0xMDYsMTcgKzEwNiwxNyBAQAogCQkJUEFMTUFTX1VTQl9JRF9JTlRfTEFUQ0hfQ0xSLAogCQkJUEFMTUFTX1VTQl9JRF9JTlRfRU5fSElfQ0xSX0lEX0ZMT0FUKTsKIAkJcGFsbWFzX3VzYi0+bGlua3N0YXQgPSBQQUxNQVNfVVNCX1NUQVRFX0RJU0NPTk5FQ1Q7Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGVkZXYsIEVYVENPTl9VU0JfSE9TVCwgZmFsc2UpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoZWRldiwgRVhUQ09OX1VTQl9IT1NULCBmYWxzZSk7CiAJCWRldl9pbmZvKHBhbG1hc191c2ItPmRldiwgIlVTQi1IT1NUIGNhYmxlIGlzIGRldGFjaGVkXG4iKTsKIAl9IGVsc2UgaWYgKChwYWxtYXNfdXNiLT5saW5rc3RhdCA9PSBQQUxNQVNfVVNCX1NUQVRFX0lEKSAmJgogCQkJCSghKHNldCAmIFBBTE1BU19VU0JfSURfSU5UX1NSQ19JRF9HTkQpKSkgewogCQlwYWxtYXNfdXNiLT5saW5rc3RhdCA9IFBBTE1BU19VU0JfU1RBVEVfRElTQ09OTkVDVDsKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oZWRldiwgRVhUQ09OX1VTQl9IT1NULCBmYWxzZSk7CisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhlZGV2LCBFWFRDT05fVVNCX0hPU1QsIGZhbHNlKTsKIAkJZGV2X2luZm8ocGFsbWFzX3VzYi0+ZGV2LCAiVVNCLUhPU1QgY2FibGUgaXMgZGV0YWNoZWRcbiIpOwogCX0gZWxzZSBpZiAoKHBhbG1hc191c2ItPmxpbmtzdGF0ID09IFBBTE1BU19VU0JfU1RBVEVfRElTQ09OTkVDVCkgJiYKIAkJCQkoaWRfc3JjICYgUEFMTUFTX1VTQl9JRF9JTlRfU1JDX0lEX0dORCkpIHsKIAkJcGFsbWFzX3VzYi0+bGlua3N0YXQgPSBQQUxNQVNfVVNCX1NUQVRFX0lEOwotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhlZGV2LCBFWFRDT05fVVNCX0hPU1QsIHRydWUpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoZWRldiwgRVhUQ09OX1VTQl9IT1NULCB0cnVlKTsKIAkJZGV2X2luZm8ocGFsbWFzX3VzYi0+ZGV2LCAiIFVTQi1IT1NUIGNhYmxlIGlzIGF0dGFjaGVkXG4iKTsKIAl9CiAKQEAgLTEzNywxMCArMTM3LDEwIEBACiAJaWQgPSBncGlvZF9nZXRfdmFsdWVfY2Fuc2xlZXAocGFsbWFzX3VzYi0+aWRfZ3Bpb2QpOwogCiAJaWYgKGlkKSB7Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGVkZXYsIEVYVENPTl9VU0JfSE9TVCwgZmFsc2UpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoZWRldiwgRVhUQ09OX1VTQl9IT1NULCBmYWxzZSk7CiAJCWRldl9pbmZvKHBhbG1hc191c2ItPmRldiwgIlVTQi1IT1NUIGNhYmxlIGlzIGRldGFjaGVkXG4iKTsKIAl9IGVsc2UgewotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhlZGV2LCBFWFRDT05fVVNCX0hPU1QsIHRydWUpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoZWRldiwgRVhUQ09OX1VTQl9IT1NULCB0cnVlKTsKIAkJZGV2X2luZm8ocGFsbWFzX3VzYi0+ZGV2LCAiVVNCLUhPU1QgY2FibGUgaXMgYXR0YWNoZWRcbiIpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1xY29tLXNwbWktbWlzYy5jIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLXFjb20tc3BtaS1taXNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E5NTdhNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1xY29tLXNwbWktbWlzYy5jCkBAIC0wLDAgKzEsMTcwIEBACisvKioKKyAqIGV4dGNvbi1xY29tLXNwbWktbWlzYy5jIC0gUXVhbGNvbW0gVVNCIGV4dGNvbiBkcml2ZXIgdG8gc3VwcG9ydCBVU0IgSUQKKyAqCQkJCWRldGVjdGlvbiBiYXNlZCBvbiBleHRjb24tdXNiLWdwaW8uYy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgTGluYXJvLCBMdGQuCisgKiBTdGVwaGVuIEJveWQgPHN0ZXBoZW4uYm95ZEBsaW5hcm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXh0Y29uLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2RlZmluZSBVU0JfSURfREVCT1VOQ0VfTVMJNQkvKiBtcyAqLworCitzdHJ1Y3QgcWNvbV91c2JfZXh0Y29uX2luZm8geworCXN0cnVjdCBleHRjb25fZGV2ICplZGV2OworCWludCBpcnE7CisJc3RydWN0IGRlbGF5ZWRfd29yayB3cV9kZXRjYWJsZTsKKwl1bnNpZ25lZCBsb25nIGRlYm91bmNlX2ppZmZpZXM7Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHFjb21fdXNiX2V4dGNvbl9jYWJsZVtdID0geworCUVYVENPTl9VU0JfSE9TVCwKKwlFWFRDT05fTk9ORSwKK307CisKK3N0YXRpYyB2b2lkIHFjb21fdXNiX2V4dGNvbl9kZXRlY3RfY2FibGUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWJvb2wgaWQ7CisJaW50IHJldDsKKwlzdHJ1Y3QgcWNvbV91c2JfZXh0Y29uX2luZm8gKmluZm8gPSBjb250YWluZXJfb2YodG9fZGVsYXllZF93b3JrKHdvcmspLAorCQkJCQkJICAgIHN0cnVjdCBxY29tX3VzYl9leHRjb25faW5mbywKKwkJCQkJCSAgICB3cV9kZXRjYWJsZSk7CisKKwkvKiBjaGVjayBJRCBhbmQgdXBkYXRlIGNhYmxlIHN0YXRlICovCisJcmV0ID0gaXJxX2dldF9pcnFjaGlwX3N0YXRlKGluZm8tPmlycSwgSVJRQ0hJUF9TVEFURV9MSU5FX0xFVkVMLCAmaWQpOworCWlmIChyZXQpCisJCXJldHVybjsKKworCWV4dGNvbl9zZXRfc3RhdGUoaW5mby0+ZWRldiwgRVhUQ09OX1VTQl9IT1NULCAhaWQpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgcWNvbV91c2JfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBxY29tX3VzYl9leHRjb25faW5mbyAqaW5mbyA9IGRldl9pZDsKKworCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fcG93ZXJfZWZmaWNpZW50X3dxLCAmaW5mby0+d3FfZGV0Y2FibGUsCisJCQkgICBpbmZvLT5kZWJvdW5jZV9qaWZmaWVzKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBxY29tX3VzYl9leHRjb25fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBxY29tX3VzYl9leHRjb25faW5mbyAqaW5mbzsKKwlpbnQgcmV0OworCisJaW5mbyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbmZvLT5lZGV2ID0gZGV2bV9leHRjb25fZGV2X2FsbG9jYXRlKGRldiwgcWNvbV91c2JfZXh0Y29uX2NhYmxlKTsKKwlpZiAoSVNfRVJSKGluZm8tPmVkZXYpKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGV4dGNvbiBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXQgPSBkZXZtX2V4dGNvbl9kZXZfcmVnaXN0ZXIoZGV2LCBpbmZvLT5lZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZWdpc3RlciBleHRjb24gZGV2aWNlXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpbmZvLT5kZWJvdW5jZV9qaWZmaWVzID0gbXNlY3NfdG9famlmZmllcyhVU0JfSURfREVCT1VOQ0VfTVMpOworCUlOSVRfREVMQVlFRF9XT1JLKCZpbmZvLT53cV9kZXRjYWJsZSwgcWNvbV91c2JfZXh0Y29uX2RldGVjdF9jYWJsZSk7CisKKwlpbmZvLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAidXNiX2lkIik7CisJaWYgKGluZm8tPmlycSA8IDApCisJCXJldHVybiBpbmZvLT5pcnE7CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKGRldiwgaW5mby0+aXJxLCBOVUxMLAorCQkJCQlxY29tX3VzYl9pcnFfaGFuZGxlciwKKwkJCQkJSVJRRl9UUklHR0VSX1JJU0lORyB8CisJCQkJCUlSUUZfVFJJR0dFUl9GQUxMSU5HIHwgSVJRRl9PTkVTSE9ULAorCQkJCQlwZGV2LT5uYW1lLCBpbmZvKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZXF1ZXN0IGhhbmRsZXIgZm9yIElEIElSUVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaW5mbyk7CisJZGV2aWNlX2luaXRfd2FrZXVwKGRldiwgMSk7CisKKwkvKiBQZXJmb3JtIGluaXRpYWwgZGV0ZWN0aW9uICovCisJcWNvbV91c2JfZXh0Y29uX2RldGVjdF9jYWJsZSgmaW5mby0+d3FfZGV0Y2FibGUud29yayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxY29tX3VzYl9leHRjb25fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHFjb21fdXNiX2V4dGNvbl9pbmZvICppbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmluZm8tPndxX2RldGNhYmxlKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IHFjb21fdXNiX2V4dGNvbl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcWNvbV91c2JfZXh0Y29uX2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cChkZXYpKQorCQlyZXQgPSBlbmFibGVfaXJxX3dha2UoaW5mby0+aXJxKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcWNvbV91c2JfZXh0Y29uX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHFjb21fdXNiX2V4dGNvbl9pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZGV2aWNlX21heV93YWtldXAoZGV2KSkKKwkJcmV0ID0gZGlzYWJsZV9pcnFfd2FrZShpbmZvLT5pcnEpOworCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMocWNvbV91c2JfZXh0Y29uX3BtX29wcywKKwkJCSBxY29tX3VzYl9leHRjb25fc3VzcGVuZCwgcWNvbV91c2JfZXh0Y29uX3Jlc3VtZSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHFjb21fdXNiX2V4dGNvbl9kdF9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAicWNvbSxwbTg5NDEtbWlzYyIsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcWNvbV91c2JfZXh0Y29uX2R0X21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcWNvbV91c2JfZXh0Y29uX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gcWNvbV91c2JfZXh0Y29uX3Byb2JlLAorCS5yZW1vdmUJCT0gcWNvbV91c2JfZXh0Y29uX3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiZXh0Y29uLXBtODk0MS1taXNjIiwKKwkJLnBtCT0gJnFjb21fdXNiX2V4dGNvbl9wbV9vcHMsCisJCS5vZl9tYXRjaF90YWJsZSA9IHFjb21fdXNiX2V4dGNvbl9kdF9tYXRjaCwKKwl9LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIocWNvbV91c2JfZXh0Y29uX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiUUNPTSBVU0IgSUQgZXh0Y29uIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiU3RlcGhlbiBCb3lkIDxzdGVwaGVuLmJveWRAbGluYXJvLm9yZz4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1ydDg5NzNhLmMgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tcnQ4OTczYS5jCmluZGV4IDk3ZTA3NGQuLjE3NGMzODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1ydDg5NzNhLmMKKysrIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLXJ0ODk3M2EuYwpAQCAtMzk4LDkgKzM5OCw5IEBACiAJCXJldHVybiByZXQ7CiAKIAkvKiBDaGFuZ2UgdGhlIHN0YXRlIG9mIGV4dGVybmFsIGFjY2Vzc29yeSAqLwotCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIGlkLCBhdHRhY2hlZCk7CisJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIGlkLCBhdHRhY2hlZCk7CiAJaWYgKGlkID09IEVYVENPTl9VU0IpCi0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NEUCwKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NEUCwKIAkJCQkJYXR0YWNoZWQpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tc201NTAyLmMgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tc201NTAyLmMKaW5kZXggZGY3NjlhMS4uYjIyMzI1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9leHRjb24vZXh0Y29uLXNtNTUwMi5jCisrKyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1zbTU1MDIuYwpAQCAtNDExLDkgKzQxMSw5IEBACiAJCXJldHVybiByZXQ7CiAKIAkvKiBDaGFuZ2UgdGhlIHN0YXRlIG9mIGV4dGVybmFsIGFjY2Vzc29yeSAqLwotCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIGlkLCBhdHRhY2hlZCk7CisJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIGlkLCBhdHRhY2hlZCk7CiAJaWYgKGlkID09IEVYVENPTl9VU0IpCi0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NEUCwKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NEUCwKIAkJCQkJYXR0YWNoZWQpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tdXNiLWdwaW8uYyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi11c2ItZ3Bpby5jCmluZGV4IDI1MTI2NjAuLmEyN2QzNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi11c2ItZ3Bpby5jCisrKyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi11c2ItZ3Bpby5jCkBAIC02MywxNiArNjMsMTYgQEAKIAkJICogQXMgd2UgZG9uJ3QgaGF2ZSBldmVudCBmb3IgVVNCIHBlcmlwaGVyYWwgY2FibGUgYXR0YWNoZWQsCiAJCSAqIHdlIHNpbXVsYXRlIFVTQiBwZXJpcGhlcmFsIGF0dGFjaCBoZXJlLgogCQkgKi8KLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX1VTQl9IT1NULCBmYWxzZSk7Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9VU0IsIHRydWUpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX1VTQl9IT1NULCBmYWxzZSk7CisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCLCB0cnVlKTsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBJRCA9IDAgbWVhbnMgVVNCIEhPU1QgY2FibGUgYXR0YWNoZWQuCiAJCSAqIEFzIHdlIGRvbid0IGhhdmUgZXZlbnQgZm9yIFVTQiBwZXJpcGhlcmFsIGNhYmxlIGRldGFjaGVkLAogCQkgKiB3ZSBzaW11bGF0ZSBVU0IgcGVyaXBoZXJhbCBkZXRhY2ggaGVyZS4KIAkJICovCi0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9VU0IsIGZhbHNlKTsKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX1VTQl9IT1NULCB0cnVlKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9VU0IsIGZhbHNlKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9VU0JfSE9TVCwgdHJ1ZSk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9leHRjb24uYyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi5jCmluZGV4IDg2ODJlZmMuLjc4Mjk4NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi5jCisrKyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi5jCkBAIC0zOCw0MyArMzgsMTU5IEBACiAjZGVmaW5lIFNVUFBPUlRFRF9DQUJMRV9NQVgJMzIKICNkZWZpbmUgQ0FCTEVfTkFNRV9NQVgJCTMwCiAKLXN0YXRpYyBjb25zdCBjaGFyICpleHRjb25fbmFtZVtdID0gIHsKLQlbRVhUQ09OX05PTkVdCQkJPSAiTk9ORSIsCitzdHJ1Y3QgX19leHRjb25faW5mbyB7CisJdW5zaWduZWQgaW50IHR5cGU7CisJdW5zaWduZWQgaW50IGlkOworCWNvbnN0IGNoYXIgKm5hbWU7CisKK30gZXh0Y29uX2luZm9bXSA9IHsKKwlbRVhUQ09OX05PTkVdID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX01JU0MsCisJCS5pZCA9IEVYVENPTl9OT05FLAorCQkubmFtZSA9ICJOT05FIiwKKwl9LAogCiAJLyogVVNCIGV4dGVybmFsIGNvbm5lY3RvciAqLwotCVtFWFRDT05fVVNCXQkJCT0gIlVTQiIsCi0JW0VYVENPTl9VU0JfSE9TVF0JCT0gIlVTQi1IT1NUIiwKKwlbRVhUQ09OX1VTQl0gPSB7CisJCS50eXBlID0gRVhUQ09OX1RZUEVfVVNCLAorCQkuaWQgPSBFWFRDT05fVVNCLAorCQkubmFtZSA9ICJVU0IiLAorCX0sCisJW0VYVENPTl9VU0JfSE9TVF0gPSB7CisJCS50eXBlID0gRVhUQ09OX1RZUEVfVVNCLAorCQkuaWQgPSBFWFRDT05fVVNCX0hPU1QsCisJCS5uYW1lID0gIlVTQl9IT1NUIiwKKwl9LAogCiAJLyogQ2hhcmdpbmcgZXh0ZXJuYWwgY29ubmVjdG9yICovCi0JW0VYVENPTl9DSEdfVVNCX1NEUF0JCT0gIlNEUCIsCi0JW0VYVENPTl9DSEdfVVNCX0RDUF0JCT0gIkRDUCIsCi0JW0VYVENPTl9DSEdfVVNCX0NEUF0JCT0gIkNEUCIsCi0JW0VYVENPTl9DSEdfVVNCX0FDQV0JCT0gIkFDQSIsCi0JW0VYVENPTl9DSEdfVVNCX0ZBU1RdCQk9ICJGQVNULUNIQVJHRVIiLAotCVtFWFRDT05fQ0hHX1VTQl9TTE9XXQkJPSAiU0xPVy1DSEFSR0VSIiwKKwlbRVhUQ09OX0NIR19VU0JfU0RQXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9DSEcgfCBFWFRDT05fVFlQRV9VU0IsCisJCS5pZCA9IEVYVENPTl9DSEdfVVNCX1NEUCwKKwkJLm5hbWUgPSAiU0RQIiwKKwl9LAorCVtFWFRDT05fQ0hHX1VTQl9EQ1BdID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX0NIRyB8IEVYVENPTl9UWVBFX1VTQiwKKwkJLmlkID0gRVhUQ09OX0NIR19VU0JfRENQLAorCQkubmFtZSA9ICJEQ1AiLAorCX0sCisJW0VYVENPTl9DSEdfVVNCX0NEUF0gPSB7CisJCS50eXBlID0gRVhUQ09OX1RZUEVfQ0hHIHwgRVhUQ09OX1RZUEVfVVNCLAorCQkuaWQgPSBFWFRDT05fQ0hHX1VTQl9DRFAsCisJCS5uYW1lID0gIkNEUCIsCisJfSwKKwlbRVhUQ09OX0NIR19VU0JfQUNBXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9DSEcgfCBFWFRDT05fVFlQRV9VU0IsCisJCS5pZCA9IEVYVENPTl9DSEdfVVNCX0FDQSwKKwkJLm5hbWUgPSAiQUNBIiwKKwl9LAorCVtFWFRDT05fQ0hHX1VTQl9GQVNUXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9DSEcgfCBFWFRDT05fVFlQRV9VU0IsCisJCS5pZCA9IEVYVENPTl9DSEdfVVNCX0ZBU1QsCisJCS5uYW1lID0gIkZBU1QtQ0hBUkdFUiIsCisJfSwKKwlbRVhUQ09OX0NIR19VU0JfU0xPV10gPSB7CisJCS50eXBlID0gRVhUQ09OX1RZUEVfQ0hHIHwgRVhUQ09OX1RZUEVfVVNCLAorCQkuaWQgPSBFWFRDT05fQ0hHX1VTQl9TTE9XLAorCQkubmFtZSA9ICJTTE9XLUNIQVJHRVIiLAorCX0sCisJW0VYVENPTl9DSEdfV1BUXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9DSEcsCisJCS5pZCA9IEVYVENPTl9DSEdfV1BULAorCQkubmFtZSA9ICJXUFQiLAorCX0sCiAKIAkvKiBKYWNrIGV4dGVybmFsIGNvbm5lY3RvciAqLwotCVtFWFRDT05fSkFDS19NSUNST1BIT05FXQk9ICJNSUNST1BIT05FIiwKLQlbRVhUQ09OX0pBQ0tfSEVBRFBIT05FXQkJPSAiSEVBRFBIT05FIiwKLQlbRVhUQ09OX0pBQ0tfTElORV9JTl0JCT0gIkxJTkUtSU4iLAotCVtFWFRDT05fSkFDS19MSU5FX09VVF0JCT0gIkxJTkUtT1VUIiwKLQlbRVhUQ09OX0pBQ0tfVklERU9fSU5dCQk9ICJWSURFTy1JTiIsCi0JW0VYVENPTl9KQUNLX1ZJREVPX09VVF0JCT0gIlZJREVPLU9VVCIsCi0JW0VYVENPTl9KQUNLX1NQRElGX0lOXQkJPSAiU1BESUYtSU4iLAotCVtFWFRDT05fSkFDS19TUERJRl9PVVRdCQk9ICJTUERJRi1PVVQiLAorCVtFWFRDT05fSkFDS19NSUNST1BIT05FXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9KQUNLLAorCQkuaWQgPSBFWFRDT05fSkFDS19NSUNST1BIT05FLAorCQkubmFtZSA9ICJNSUNST1BIT05FIiwKKwl9LAorCVtFWFRDT05fSkFDS19IRUFEUEhPTkVdID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX0pBQ0ssCisJCS5pZCA9IEVYVENPTl9KQUNLX0hFQURQSE9ORSwKKwkJLm5hbWUgPSAiSEVBRFBIT05FIiwKKwl9LAorCVtFWFRDT05fSkFDS19MSU5FX0lOXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9KQUNLLAorCQkuaWQgPSBFWFRDT05fSkFDS19MSU5FX0lOLAorCQkubmFtZSA9ICJMSU5FLUlOIiwKKwl9LAorCVtFWFRDT05fSkFDS19MSU5FX09VVF0gPSB7CisJCS50eXBlID0gRVhUQ09OX1RZUEVfSkFDSywKKwkJLmlkID0gRVhUQ09OX0pBQ0tfTElORV9PVVQsCisJCS5uYW1lID0gIkxJTkUtT1VUIiwKKwl9LAorCVtFWFRDT05fSkFDS19WSURFT19JTl0gPSB7CisJCS50eXBlID0gRVhUQ09OX1RZUEVfSkFDSywKKwkJLmlkID0gRVhUQ09OX0pBQ0tfVklERU9fSU4sCisJCS5uYW1lID0gIlZJREVPLUlOIiwKKwl9LAorCVtFWFRDT05fSkFDS19WSURFT19PVVRdID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX0pBQ0ssCisJCS5pZCA9IEVYVENPTl9KQUNLX1ZJREVPX09VVCwKKwkJLm5hbWUgPSAiVklERU8tT1VUIiwKKwl9LAorCVtFWFRDT05fSkFDS19TUERJRl9JTl0gPSB7CisJCS50eXBlID0gRVhUQ09OX1RZUEVfSkFDSywKKwkJLmlkID0gRVhUQ09OX0pBQ0tfU1BESUZfSU4sCisJCS5uYW1lID0gIlNQRElGLUlOIiwKKwl9LAorCVtFWFRDT05fSkFDS19TUERJRl9PVVRdID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX0pBQ0ssCisJCS5pZCA9IEVYVENPTl9KQUNLX1NQRElGX09VVCwKKwkJLm5hbWUgPSAiU1BESUYtT1VUIiwKKwl9LAogCiAJLyogRGlzcGxheSBleHRlcm5hbCBjb25uZWN0b3IgKi8KLQlbRVhUQ09OX0RJU1BfSERNSV0JCT0gIkhETUkiLAotCVtFWFRDT05fRElTUF9NSExdCQk9ICJNSEwiLAotCVtFWFRDT05fRElTUF9EVkldCQk9ICJEVkkiLAotCVtFWFRDT05fRElTUF9WR0FdCQk9ICJWR0EiLAorCVtFWFRDT05fRElTUF9IRE1JXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9ESVNQLAorCQkuaWQgPSBFWFRDT05fRElTUF9IRE1JLAorCQkubmFtZSA9ICJIRE1JIiwKKwl9LAorCVtFWFRDT05fRElTUF9NSExdID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX0RJU1AsCisJCS5pZCA9IEVYVENPTl9ESVNQX01ITCwKKwkJLm5hbWUgPSAiTUhMIiwKKwl9LAorCVtFWFRDT05fRElTUF9EVkldID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX0RJU1AsCisJCS5pZCA9IEVYVENPTl9ESVNQX0RWSSwKKwkJLm5hbWUgPSAiRFZJIiwKKwl9LAorCVtFWFRDT05fRElTUF9WR0FdID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX0RJU1AsCisJCS5pZCA9IEVYVENPTl9ESVNQX1ZHQSwKKwkJLm5hbWUgPSAiVkdBIiwKKwl9LAorCVtFWFRDT05fRElTUF9EUF0gPSB7CisJCS50eXBlID0gRVhUQ09OX1RZUEVfRElTUCB8IEVYVENPTl9UWVBFX1VTQiwKKwkJLmlkID0gRVhUQ09OX0RJU1BfRFAsCisJCS5uYW1lID0gIkRQIiwKKwl9LAorCVtFWFRDT05fRElTUF9ITURdID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX0RJU1AgfCBFWFRDT05fVFlQRV9VU0IsCisJCS5pZCA9IEVYVENPTl9ESVNQX0hNRCwKKwkJLm5hbWUgPSAiSE1EIiwKKwl9LAogCiAJLyogTWlzY2VsbGFuZW91cyBleHRlcm5hbCBjb25uZWN0b3IgKi8KLQlbRVhUQ09OX0RPQ0tdCQkJPSAiRE9DSyIsCi0JW0VYVENPTl9KSUddCQkJPSAiSklHIiwKLQlbRVhUQ09OX01FQ0hBTklDQUxdCQk9ICJNRUNIQU5JQ0FMIiwKKwlbRVhUQ09OX0RPQ0tdID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX01JU0MsCisJCS5pZCA9IEVYVENPTl9ET0NLLAorCQkubmFtZSA9ICJET0NLIiwKKwl9LAorCVtFWFRDT05fSklHXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9NSVNDLAorCQkuaWQgPSBFWFRDT05fSklHLAorCQkubmFtZSA9ICJKSUciLAorCX0sCisJW0VYVENPTl9NRUNIQU5JQ0FMXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9NSVNDLAorCQkuaWQgPSBFWFRDT05fTUVDSEFOSUNBTCwKKwkJLm5hbWUgPSAiTUVDSEFOSUNBTCIsCisJfSwKIAotCU5VTEwsCisJeyAvKiBzZW50aW5lbCAqLyB9CiB9OwogCiAvKioKQEAgLTk1LDYgKzIxMSwxNiBAQAogCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGF0dHJfc3RhdGU7CiAKIAlzdHJ1Y3QgYXR0cmlidXRlICphdHRyc1szXTsgLyogdG8gYmUgZmVkIHRvIGF0dHJfZy5hdHRycyAqLworCisJdW5pb24gZXh0Y29uX3Byb3BlcnR5X3ZhbHVlIHVzYl9wcm9wdmFsW0VYVENPTl9QUk9QX1VTQl9DTlRdOworCXVuaW9uIGV4dGNvbl9wcm9wZXJ0eV92YWx1ZSBjaGdfcHJvcHZhbFtFWFRDT05fUFJPUF9DSEdfQ05UXTsKKwl1bmlvbiBleHRjb25fcHJvcGVydHlfdmFsdWUgamFja19wcm9wdmFsW0VYVENPTl9QUk9QX0pBQ0tfQ05UXTsKKwl1bmlvbiBleHRjb25fcHJvcGVydHlfdmFsdWUgZGlzcF9wcm9wdmFsW0VYVENPTl9QUk9QX0RJU1BfQ05UXTsKKworCXVuc2lnbmVkIGxvbmcgdXNiX2JpdHNbQklUU19UT19MT05HUyhFWFRDT05fUFJPUF9VU0JfQ05UKV07CisJdW5zaWduZWQgbG9uZyBjaGdfYml0c1tCSVRTX1RPX0xPTkdTKEVYVENPTl9QUk9QX0NIR19DTlQpXTsKKwl1bnNpZ25lZCBsb25nIGphY2tfYml0c1tCSVRTX1RPX0xPTkdTKEVYVENPTl9QUk9QX0pBQ0tfQ05UKV07CisJdW5zaWduZWQgbG9uZyBkaXNwX2JpdHNbQklUU19UT19MT05HUyhFWFRDT05fUFJPUF9ESVNQX0NOVCldOwogfTsKIAogc3RhdGljIHN0cnVjdCBjbGFzcyAqZXh0Y29uX2NsYXNzOwpAQCAtMTQ3LDE0ICsyNzMsOTMgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGJvb2wgaXNfZXh0Y29uX2NoYW5nZWQodTMyIHByZXYsIHUzMiBuZXcsIGludCBpZHgsIGJvb2wgKmF0dGFjaGVkKQorc3RhdGljIGludCBnZXRfZXh0Y29uX3R5cGUodW5zaWduZWQgaW50IHByb3ApCiB7Ci0JaWYgKCgocHJldiA+PiBpZHgpICYgMHgxKSAhPSAoKG5ldyA+PiBpZHgpICYgMHgxKSkgewotCQkqYXR0YWNoZWQgPSAoKG5ldyA+PiBpZHgpICYgMHgxKSA/IHRydWUgOiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7CisJc3dpdGNoIChwcm9wKSB7CisJY2FzZSBFWFRDT05fUFJPUF9VU0JfTUlOIC4uLiBFWFRDT05fUFJPUF9VU0JfTUFYOgorCQlyZXR1cm4gRVhUQ09OX1RZUEVfVVNCOworCWNhc2UgRVhUQ09OX1BST1BfQ0hHX01JTiAuLi4gRVhUQ09OX1BST1BfQ0hHX01BWDoKKwkJcmV0dXJuIEVYVENPTl9UWVBFX0NIRzsKKwljYXNlIEVYVENPTl9QUk9QX0pBQ0tfTUlOIC4uLiBFWFRDT05fUFJPUF9KQUNLX01BWDoKKwkJcmV0dXJuIEVYVENPTl9UWVBFX0pBQ0s7CisJY2FzZSBFWFRDT05fUFJPUF9ESVNQX01JTiAuLi4gRVhUQ09OX1BST1BfRElTUF9NQVg6CisJCXJldHVybiBFWFRDT05fVFlQRV9ESVNQOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGJvb2wgaXNfZXh0Y29uX2F0dGFjaGVkKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJcmV0dXJuICEhKGVkZXYtPnN0YXRlICYgQklUKGluZGV4KSk7Cit9CisKK3N0YXRpYyBib29sIGlzX2V4dGNvbl9jaGFuZ2VkKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCBpbnQgaW5kZXgsCisJCQkJYm9vbCBuZXdfc3RhdGUpCit7CisJaW50IHN0YXRlID0gISEoZWRldi0+c3RhdGUgJiBCSVQoaW5kZXgpKTsKKwlyZXR1cm4gKHN0YXRlICE9IG5ld19zdGF0ZSk7Cit9CisKK3N0YXRpYyBib29sIGlzX2V4dGNvbl9wcm9wZXJ0eV9zdXBwb3J0ZWQodW5zaWduZWQgaW50IGlkLCB1bnNpZ25lZCBpbnQgcHJvcCkKK3sKKwlpbnQgdHlwZTsKKworCS8qIENoZWNrIHdoZXRoZXIgdGhlIHByb3BlcnR5IGlzIHN1cHBvcnRlZCBvciBub3QuICovCisJdHlwZSA9IGdldF9leHRjb25fdHlwZShwcm9wKTsKKwlpZiAodHlwZSA8IDApCisJCXJldHVybiBmYWxzZTsKKworCS8qIENoZWNrIHdoZXRoZXIgYSBzcGVjaWZpYyBleHRjb24gaWQgc3VwcG9ydHMgdGhlIHByb3BlcnR5IG9yIG5vdC4gKi8KKwlyZXR1cm4gISEoZXh0Y29uX2luZm9baWRdLnR5cGUgJiB0eXBlKTsKK30KKworc3RhdGljIGludCBpc19leHRjb25fcHJvcGVydHlfY2FwYWJpbGl0eShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwKKwkJCQl1bnNpZ25lZCBpbnQgaWQsIGludCBpbmRleCx1bnNpZ25lZCBpbnQgcHJvcCkKK3sKKwlzdHJ1Y3QgZXh0Y29uX2NhYmxlICpjYWJsZTsKKwlpbnQgdHlwZSwgcmV0OworCisJLyogQ2hlY2sgd2hldGhlciB0aGUgcHJvcGVydHkgaXMgc3VwcG9ydGVkIG9yIG5vdC4gKi8KKwl0eXBlID0gZ2V0X2V4dGNvbl90eXBlKHByb3ApOworCWlmICh0eXBlIDwgMCkKKwkJcmV0dXJuIHR5cGU7CisKKwljYWJsZSA9ICZlZGV2LT5jYWJsZXNbaW5kZXhdOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBFWFRDT05fVFlQRV9VU0I6CisJCXJldCA9IHRlc3RfYml0KHByb3AgLSBFWFRDT05fUFJPUF9VU0JfTUlOLCBjYWJsZS0+dXNiX2JpdHMpOworCQlicmVhazsKKwljYXNlIEVYVENPTl9UWVBFX0NIRzoKKwkJcmV0ID0gdGVzdF9iaXQocHJvcCAtIEVYVENPTl9QUk9QX0NIR19NSU4sIGNhYmxlLT5jaGdfYml0cyk7CisJCWJyZWFrOworCWNhc2UgRVhUQ09OX1RZUEVfSkFDSzoKKwkJcmV0ID0gdGVzdF9iaXQocHJvcCAtIEVYVENPTl9QUk9QX0pBQ0tfTUlOLCBjYWJsZS0+amFja19iaXRzKTsKKwkJYnJlYWs7CisJY2FzZSBFWFRDT05fVFlQRV9ESVNQOgorCQlyZXQgPSB0ZXN0X2JpdChwcm9wIC0gRVhUQ09OX1BST1BfRElTUF9NSU4sIGNhYmxlLT5kaXNwX2JpdHMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOwogCX0KIAotCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpbml0X3Byb3BlcnR5KHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQsIGludCBpbmRleCkKK3sKKwl1bnNpZ25lZCBpbnQgdHlwZSA9IGV4dGNvbl9pbmZvW2lkXS50eXBlOworCXN0cnVjdCBleHRjb25fY2FibGUgKmNhYmxlID0gJmVkZXYtPmNhYmxlc1tpbmRleF07CisKKwlpZiAoRVhUQ09OX1RZUEVfVVNCICYgdHlwZSkKKwkJbWVtc2V0KGNhYmxlLT51c2JfcHJvcHZhbCwgMCwgc2l6ZW9mKGNhYmxlLT51c2JfcHJvcHZhbCkpOworCWlmIChFWFRDT05fVFlQRV9DSEcgJiB0eXBlKQorCQltZW1zZXQoY2FibGUtPmNoZ19wcm9wdmFsLCAwLCBzaXplb2YoY2FibGUtPmNoZ19wcm9wdmFsKSk7CisJaWYgKEVYVENPTl9UWVBFX0pBQ0sgJiB0eXBlKQorCQltZW1zZXQoY2FibGUtPmphY2tfcHJvcHZhbCwgMCwgc2l6ZW9mKGNhYmxlLT5qYWNrX3Byb3B2YWwpKTsKKwlpZiAoRVhUQ09OX1RZUEVfRElTUCAmIHR5cGUpCisJCW1lbXNldChjYWJsZS0+ZGlzcF9wcm9wdmFsLCAwLCBzaXplb2YoY2FibGUtPmRpc3BfcHJvcHZhbCkpOwogfQogCiBzdGF0aWMgc3NpemVfdCBzdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCkBAIC0xNjgsMzIgKzM3MywxMyBAQAogCiAJZm9yIChpID0gMDsgaSA8IGVkZXYtPm1heF9zdXBwb3J0ZWQ7IGkrKykgewogCQljb3VudCArPSBzcHJpbnRmKGJ1ZiArIGNvdW50LCAiJXM9JWRcbiIsCi0JCQkJZXh0Y29uX25hbWVbZWRldi0+c3VwcG9ydGVkX2NhYmxlW2ldXSwKKwkJCQlleHRjb25faW5mb1tlZGV2LT5zdXBwb3J0ZWRfY2FibGVbaV1dLm5hbWUsCiAJCQkJICEhKGVkZXYtPnN0YXRlICYgKDEgPDwgaSkpKTsKIAl9CiAKIAlyZXR1cm4gY291bnQ7CiB9Ci0KLXN0YXRpYyBzc2l6ZV90IHN0YXRlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQl1MzIgc3RhdGU7Ci0Jc3NpemVfdCByZXQgPSAwOwotCXN0cnVjdCBleHRjb25fZGV2ICplZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlyZXQgPSBzc2NhbmYoYnVmLCAiMHgleCIsICZzdGF0ZSk7Ci0JaWYgKHJldCA9PSAwKQotCQlyZXQgPSAtRUlOVkFMOwotCWVsc2UKLQkJcmV0ID0gZXh0Y29uX3NldF9zdGF0ZShlZGV2LCBzdGF0ZSk7Ci0KLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiBjb3VudDsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUl9SVyhzdGF0ZSk7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8oc3RhdGUpOwogCiBzdGF0aWMgc3NpemVfdCBuYW1lX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJY2hhciAqYnVmKQpAQCAtMjEyLDcgKzM5OCw3IEBACiAJaW50IGkgPSBjYWJsZS0+Y2FibGVfaW5kZXg7CiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwKLQkJCWV4dGNvbl9uYW1lW2NhYmxlLT5lZGV2LT5zdXBwb3J0ZWRfY2FibGVbaV1dKTsKKwkJCWV4dGNvbl9pbmZvW2NhYmxlLT5lZGV2LT5zdXBwb3J0ZWRfY2FibGVbaV1dLm5hbWUpOwogfQogCiBzdGF0aWMgc3NpemVfdCBjYWJsZV9zdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTIyNCwyNiArNDEwLDE3IEBACiAJaW50IGkgPSBjYWJsZS0+Y2FibGVfaW5kZXg7CiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKLQkJICAgICAgIGV4dGNvbl9nZXRfY2FibGVfc3RhdGVfKGNhYmxlLT5lZGV2LAotCQkJCQkgICAgICAgY2FibGUtPmVkZXYtPnN1cHBvcnRlZF9jYWJsZVtpXSkpOworCQlleHRjb25fZ2V0X3N0YXRlKGNhYmxlLT5lZGV2LCBjYWJsZS0+ZWRldi0+c3VwcG9ydGVkX2NhYmxlW2ldKSk7CiB9CiAKIC8qKgotICogZXh0Y29uX3VwZGF0ZV9zdGF0ZSgpIC0gVXBkYXRlIHRoZSBjYWJsZSBhdHRhY2ggc3RhdGVzIG9mIHRoZSBleHRjb24gZGV2aWNlCi0gKgkJCSAgIG9ubHkgZm9yIHRoZSBtYXNrZWQgYml0cy4KLSAqIEBlZGV2Ogl0aGUgZXh0Y29uIGRldmljZQotICogQG1hc2s6CXRoZSBiaXQgbWFzayB0byBkZXNpZ25hdGUgdXBkYXRlZCBiaXRzLgotICogQHN0YXRlOgluZXcgY2FibGUgYXR0YWNoIHN0YXR1cyBmb3IgQGVkZXYKKyAqIGV4dGNvbl9zeW5jKCkJLSBTeW5jaHJvbml6ZSB0aGUgc3RhdGVzIGZvciBib3RoIHRoZSBhdHRhY2hlZC9kZXRhY2hlZAorICogQGVkZXY6CQl0aGUgZXh0Y29uIGRldmljZSB0aGF0IGhhcyB0aGUgY2FibGUuCiAgKgotICogQ2hhbmdpbmcgdGhlIHN0YXRlIHNlbmRzIHVldmVudCB3aXRoIGVudmlyb25tZW50IHZhcmlhYmxlIGNvbnRhaW5pbmcKLSAqIHRoZSBuYW1lIG9mIGV4dGNvbiBkZXZpY2UgKGVudnBbMF0pIGFuZCB0aGUgc3RhdGUgb3V0cHV0IChlbnZwWzFdKS4KLSAqIFRpemVuIHVzZXMgdGhpcyBmb3JtYXQgZm9yIGV4dGNvbiBkZXZpY2UgdG8gZ2V0IGV2ZW50cyBmcm9tIHBvcnRzLgotICogQW5kcm9pZCB1c2VzIHRoaXMgZm9ybWF0IGFzIHdlbGwuCi0gKgotICogTm90ZSB0aGF0IHRoZSBub3RpZmllciBwcm92aWRlcyB3aGljaCBiaXRzIGFyZSBjaGFuZ2VkIGluIHRoZSBzdGF0ZQotICogdmFyaWFibGUgd2l0aCB0aGUgdmFsIHBhcmFtZXRlciAoc2Vjb25kKSB0byB0aGUgY2FsbGJhY2suCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmQgYSBub3RpZmljYXRpb24gdG8gc3luY2hyb25pemUgdGhlIGFsbCBzdGF0ZXMgb2YgYQorICogc3BlY2lmaWMgZXh0ZXJuYWwgY29ubmVjdG9yCiAgKi8KLWludCBleHRjb25fdXBkYXRlX3N0YXRlKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1MzIgbWFzaywgdTMyIHN0YXRlKQoraW50IGV4dGNvbl9zeW5jKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQpCiB7CiAJY2hhciBuYW1lX2J1ZlsxMjBdOwogCWNoYXIgc3RhdGVfYnVmWzEyMF07CkBAIC0yNTIsMTAwICs0MjksOCBAQAogCWludCBlbnZfb2Zmc2V0ID0gMDsKIAlpbnQgbGVuZ3RoOwogCWludCBpbmRleDsKKwlpbnQgc3RhdGU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlib29sIGF0dGFjaGVkOwotCi0JaWYgKCFlZGV2KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZlZGV2LT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoZWRldi0+c3RhdGUgIT0gKChlZGV2LT5zdGF0ZSAmIH5tYXNrKSB8IChzdGF0ZSAmIG1hc2spKSkgewotCQl1MzIgb2xkX3N0YXRlOwotCi0JCWlmIChjaGVja19tdXR1YWxseV9leGNsdXNpdmUoZWRldiwgKGVkZXYtPnN0YXRlICYgfm1hc2spIHwKLQkJCQkJCSAgIChzdGF0ZSAmIG1hc2spKSkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRldi0+bG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuIC1FUEVSTTsKLQkJfQotCi0JCW9sZF9zdGF0ZSA9IGVkZXYtPnN0YXRlOwotCQllZGV2LT5zdGF0ZSAmPSB+bWFzazsKLQkJZWRldi0+c3RhdGUgfD0gc3RhdGUgJiBtYXNrOwotCi0JCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGVkZXYtPm1heF9zdXBwb3J0ZWQ7IGluZGV4KyspIHsKLQkJCWlmIChpc19leHRjb25fY2hhbmdlZChvbGRfc3RhdGUsIGVkZXYtPnN0YXRlLCBpbmRleCwKLQkJCQkJICAgICAgJmF0dGFjaGVkKSkKLQkJCQlyYXdfbm90aWZpZXJfY2FsbF9jaGFpbigmZWRldi0+bmhbaW5kZXhdLAotCQkJCQkJCWF0dGFjaGVkLCBlZGV2KTsKLQkJfQotCi0JCS8qIFRoaXMgY291bGQgYmUgaW4gaW50ZXJydXB0IGhhbmRsZXIgKi8KLQkJcHJvcF9idWYgPSAoY2hhciAqKWdldF96ZXJvZWRfcGFnZShHRlBfQVRPTUlDKTsKLQkJaWYgKHByb3BfYnVmKSB7Ci0JCQlsZW5ndGggPSBuYW1lX3Nob3coJmVkZXYtPmRldiwgTlVMTCwgcHJvcF9idWYpOwotCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQlpZiAocHJvcF9idWZbbGVuZ3RoIC0gMV0gPT0gJ1xuJykKLQkJCQkJcHJvcF9idWZbbGVuZ3RoIC0gMV0gPSAwOwotCQkJCXNucHJpbnRmKG5hbWVfYnVmLCBzaXplb2YobmFtZV9idWYpLAotCQkJCQkiTkFNRT0lcyIsIHByb3BfYnVmKTsKLQkJCQllbnZwW2Vudl9vZmZzZXQrK10gPSBuYW1lX2J1ZjsKLQkJCX0KLQkJCWxlbmd0aCA9IHN0YXRlX3Nob3coJmVkZXYtPmRldiwgTlVMTCwgcHJvcF9idWYpOwotCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQlpZiAocHJvcF9idWZbbGVuZ3RoIC0gMV0gPT0gJ1xuJykKLQkJCQkJcHJvcF9idWZbbGVuZ3RoIC0gMV0gPSAwOwotCQkJCXNucHJpbnRmKHN0YXRlX2J1Ziwgc2l6ZW9mKHN0YXRlX2J1ZiksCi0JCQkJCSJTVEFURT0lcyIsIHByb3BfYnVmKTsKLQkJCQllbnZwW2Vudl9vZmZzZXQrK10gPSBzdGF0ZV9idWY7Ci0JCQl9Ci0JCQllbnZwW2Vudl9vZmZzZXRdID0gTlVMTDsKLQkJCS8qIFVubG9jayBlYXJseSBiZWZvcmUgdWV2ZW50ICovCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZGV2LT5sb2NrLCBmbGFncyk7Ci0KLQkJCWtvYmplY3RfdWV2ZW50X2VudigmZWRldi0+ZGV2LmtvYmosIEtPQkpfQ0hBTkdFLCBlbnZwKTsKLQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwcm9wX2J1Zik7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBVbmxvY2sgZWFybHkgYmVmb3JlIHVldmVudCAqLwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRldi0+bG9jaywgZmxhZ3MpOwotCi0JCQlkZXZfZXJyKCZlZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5IGluIGV4dGNvbl9zZXRfc3RhdGVcbiIpOwotCQkJa29iamVjdF91ZXZlbnQoJmVkZXYtPmRldi5rb2JqLCBLT0JKX0NIQU5HRSk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBObyBjaGFuZ2VzICovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVkZXYtPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGV4dGNvbl91cGRhdGVfc3RhdGUpOwotCi0vKioKLSAqIGV4dGNvbl9zZXRfc3RhdGUoKSAtIFNldCB0aGUgY2FibGUgYXR0YWNoIHN0YXRlcyBvZiB0aGUgZXh0Y29uIGRldmljZS4KLSAqIEBlZGV2Ogl0aGUgZXh0Y29uIGRldmljZQotICogQHN0YXRlOgluZXcgY2FibGUgYXR0YWNoIHN0YXR1cyBmb3IgQGVkZXYKLSAqCi0gKiBOb3RlIHRoYXQgbm90aWZpZXIgcHJvdmlkZXMgd2hpY2ggYml0cyBhcmUgY2hhbmdlZCBpbiB0aGUgc3RhdGUKLSAqIHZhcmlhYmxlIHdpdGggdGhlIHZhbCBwYXJhbWV0ZXIgKHNlY29uZCkgdG8gdGhlIGNhbGxiYWNrLgotICovCi1pbnQgZXh0Y29uX3NldF9zdGF0ZShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdTMyIHN0YXRlKQotewotCWlmICghZWRldikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gZXh0Y29uX3VwZGF0ZV9zdGF0ZShlZGV2LCAweGZmZmZmZmZmLCBzdGF0ZSk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChleHRjb25fc2V0X3N0YXRlKTsKLQotLyoqCi0gKiBleHRjb25fZ2V0X2NhYmxlX3N0YXRlXygpIC0gR2V0IHRoZSBzdGF0dXMgb2YgYSBzcGVjaWZpYyBjYWJsZS4KLSAqIEBlZGV2Ogl0aGUgZXh0Y29uIGRldmljZSB0aGF0IGhhcyB0aGUgY2FibGUuCi0gKiBAaWQ6CQl0aGUgdW5pcXVlIGlkIG9mIGVhY2ggZXh0ZXJuYWwgY29ubmVjdG9yIGluIGV4dGNvbiBlbnVtZXJhdGlvbi4KLSAqLwotaW50IGV4dGNvbl9nZXRfY2FibGVfc3RhdGVfKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCBjb25zdCB1bnNpZ25lZCBpbnQgaWQpCi17Ci0JaW50IGluZGV4OwogCiAJaWYgKCFlZGV2KQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTM1NCwyNiArNDM5LDkyIEBACiAJaWYgKGluZGV4IDwgMCkKIAkJcmV0dXJuIGluZGV4OwogCi0JaWYgKGVkZXYtPm1heF9zdXBwb3J0ZWQgJiYgZWRldi0+bWF4X3N1cHBvcnRlZCA8PSBpbmRleCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmVkZXYtPmxvY2ssIGZsYWdzKTsKIAotCXJldHVybiAhIShlZGV2LT5zdGF0ZSAmICgxIDw8IGluZGV4KSk7CisJc3RhdGUgPSAhIShlZGV2LT5zdGF0ZSAmIEJJVChpbmRleCkpOworCXJhd19ub3RpZmllcl9jYWxsX2NoYWluKCZlZGV2LT5uaFtpbmRleF0sIHN0YXRlLCBlZGV2KTsKKworCS8qIFRoaXMgY291bGQgYmUgaW4gaW50ZXJydXB0IGhhbmRsZXIgKi8KKwlwcm9wX2J1ZiA9IChjaGFyICopZ2V0X3plcm9lZF9wYWdlKEdGUF9BVE9NSUMpOworCWlmICghcHJvcF9idWYpIHsKKwkJLyogVW5sb2NrIGVhcmx5IGJlZm9yZSB1ZXZlbnQgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRldi0+bG9jaywgZmxhZ3MpOworCisJCWRldl9lcnIoJmVkZXYtPmRldiwgIm91dCBvZiBtZW1vcnkgaW4gZXh0Y29uX3NldF9zdGF0ZVxuIik7CisJCWtvYmplY3RfdWV2ZW50KCZlZGV2LT5kZXYua29iaiwgS09CSl9DSEFOR0UpOworCisJCXJldHVybiAwOworCX0KKworCWxlbmd0aCA9IG5hbWVfc2hvdygmZWRldi0+ZGV2LCBOVUxMLCBwcm9wX2J1Zik7CisJaWYgKGxlbmd0aCA+IDApIHsKKwkJaWYgKHByb3BfYnVmW2xlbmd0aCAtIDFdID09ICdcbicpCisJCQlwcm9wX2J1ZltsZW5ndGggLSAxXSA9IDA7CisJCXNucHJpbnRmKG5hbWVfYnVmLCBzaXplb2YobmFtZV9idWYpLCAiTkFNRT0lcyIsIHByb3BfYnVmKTsKKwkJZW52cFtlbnZfb2Zmc2V0KytdID0gbmFtZV9idWY7CisJfQorCisJbGVuZ3RoID0gc3RhdGVfc2hvdygmZWRldi0+ZGV2LCBOVUxMLCBwcm9wX2J1Zik7CisJaWYgKGxlbmd0aCA+IDApIHsKKwkJaWYgKHByb3BfYnVmW2xlbmd0aCAtIDFdID09ICdcbicpCisJCQlwcm9wX2J1ZltsZW5ndGggLSAxXSA9IDA7CisJCXNucHJpbnRmKHN0YXRlX2J1Ziwgc2l6ZW9mKHN0YXRlX2J1ZiksICJTVEFURT0lcyIsIHByb3BfYnVmKTsKKwkJZW52cFtlbnZfb2Zmc2V0KytdID0gc3RhdGVfYnVmOworCX0KKwllbnZwW2Vudl9vZmZzZXRdID0gTlVMTDsKKworCS8qIFVubG9jayBlYXJseSBiZWZvcmUgdWV2ZW50ICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRldi0+bG9jaywgZmxhZ3MpOworCWtvYmplY3RfdWV2ZW50X2VudigmZWRldi0+ZGV2LmtvYmosIEtPQkpfQ0hBTkdFLCBlbnZwKTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcHJvcF9idWYpOworCisJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChleHRjb25fZ2V0X2NhYmxlX3N0YXRlXyk7CitFWFBPUlRfU1lNQk9MX0dQTChleHRjb25fc3luYyk7CiAKIC8qKgotICogZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oKSAtIFNldCB0aGUgc3RhdHVzIG9mIGEgc3BlY2lmaWMgY2FibGUuCisgKiBleHRjb25fZ2V0X3N0YXRlKCkgLSBHZXQgdGhlIHN0YXRlIG9mIGEgZXh0ZXJuYWwgY29ubmVjdG9yLgorICogQGVkZXY6CXRoZSBleHRjb24gZGV2aWNlIHRoYXQgaGFzIHRoZSBjYWJsZS4KKyAqIEBpZDoJCXRoZSB1bmlxdWUgaWQgb2YgZWFjaCBleHRlcm5hbCBjb25uZWN0b3IgaW4gZXh0Y29uIGVudW1lcmF0aW9uLgorICovCitpbnQgZXh0Y29uX2dldF9zdGF0ZShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgY29uc3QgdW5zaWduZWQgaW50IGlkKQoreworCWludCBpbmRleCwgc3RhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghZWRldikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpbmRleCA9IGZpbmRfY2FibGVfaW5kZXhfYnlfaWQoZWRldiwgaWQpOworCWlmIChpbmRleCA8IDApCisJCXJldHVybiBpbmRleDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlZGV2LT5sb2NrLCBmbGFncyk7CisJc3RhdGUgPSBpc19leHRjb25fYXR0YWNoZWQoZWRldiwgaW5kZXgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVkZXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBzdGF0ZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGV4dGNvbl9nZXRfc3RhdGUpOworCisvKioKKyAqIGV4dGNvbl9zZXRfc3RhdGUoKSAtIFNldCB0aGUgc3RhdGUgb2YgYSBleHRlcm5hbCBjb25uZWN0b3IuCisgKgkJCXdpdGhvdXQgYSBub3RpZmljYXRpb24uCiAgKiBAZWRldjoJCXRoZSBleHRjb24gZGV2aWNlIHRoYXQgaGFzIHRoZSBjYWJsZS4KICAqIEBpZDoJCQl0aGUgdW5pcXVlIGlkIG9mIGVhY2ggZXh0ZXJuYWwgY29ubmVjdG9yCiAgKgkJCWluIGV4dGNvbiBlbnVtZXJhdGlvbi4KICAqIEBzdGF0ZToJCXRoZSBuZXcgY2FibGUgc3RhdHVzLiBUaGUgZGVmYXVsdCBzZW1hbnRpY3MgaXMKICAqCQkJdHJ1ZTogYXR0YWNoZWQgLyBmYWxzZTogZGV0YWNoZWQuCisgKgorICogVGhpcyBmdW5jdGlvbiBvbmx5IHNldCB0aGUgc3RhdGUgb2YgYSBleHRlcm5hbCBjb25uZWN0b3Igd2l0aG91dAorICogYSBub3RpZmljYXRpb24uIFRvIHN5bmNocm9uaXplIHRoZSBkYXRhIG9mIGEgZXh0ZXJuYWwgY29ubmVjdG9yLAorICogdXNlIGV4dGNvbl9zZXRfc3RhdGVfc3luYygpIGFuZCBleHRjb25fc3luYygpLgogICovCi1pbnQgZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsIHVuc2lnbmVkIGludCBpZCwKK2ludCBleHRjb25fc2V0X3N0YXRlKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQsCiAJCQkJYm9vbCBjYWJsZV9zdGF0ZSkKIHsKLQl1MzIgc3RhdGU7Ci0JaW50IGluZGV4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGluZGV4LCByZXQgPSAwOwogCiAJaWYgKCFlZGV2KQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTM4MiwxMyArNTMzLDMzOCBAQAogCWlmIChpbmRleCA8IDApCiAJCXJldHVybiBpbmRleDsKIAotCWlmIChlZGV2LT5tYXhfc3VwcG9ydGVkICYmIGVkZXYtPm1heF9zdXBwb3J0ZWQgPD0gaW5kZXgpCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVkZXYtPmxvY2ssIGZsYWdzKTsKKworCS8qIENoZWNrIHdoZXRoZXIgdGhlIGV4dGVybmFsIGNvbm5lY3RvcidzIHN0YXRlIGlzIGNoYW5nZWQuICovCisJaWYgKCFpc19leHRjb25fY2hhbmdlZChlZGV2LCBpbmRleCwgY2FibGVfc3RhdGUpKQorCQlnb3RvIG91dDsKKworCWlmIChjaGVja19tdXR1YWxseV9leGNsdXNpdmUoZWRldiwKKwkJKGVkZXYtPnN0YXRlICYgfkJJVChpbmRleCkpIHwgKGNhYmxlX3N0YXRlICYgQklUKGluZGV4KSkpKSB7CisJCXJldCA9IC1FUEVSTTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSB2YWx1ZSBvZiBleHRjb24gcHJvcGVydHkgYmVmb3JlIHNldHRpbmcKKwkgKiB0aGUgZGV0YWNoZWQgc3RhdGUgZm9yIGFuIGV4dGVybmFsIGNvbm5lY3Rvci4KKwkgKi8KKwlpZiAoIWNhYmxlX3N0YXRlKQorCQlpbml0X3Byb3BlcnR5KGVkZXYsIGlkLCBpbmRleCk7CisKKwkvKiBVcGRhdGUgdGhlIHN0YXRlIGZvciBhIGV4dGVybmFsIGNvbm5lY3Rvci4gKi8KKwlpZiAoY2FibGVfc3RhdGUpCisJCWVkZXYtPnN0YXRlIHw9IEJJVChpbmRleCk7CisJZWxzZQorCQllZGV2LT5zdGF0ZSAmPSB+KEJJVChpbmRleCkpOworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVkZXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChleHRjb25fc2V0X3N0YXRlKTsKKworLyoqCisgKiBleHRjb25fc2V0X3N0YXRlX3N5bmMoKSAtIFNldCB0aGUgc3RhdGUgb2YgYSBleHRlcm5hbCBjb25uZWN0b3IKKyAqCQkJd2l0aCBhIG5vdGlmaWNhdGlvbi4KKyAqIEBlZGV2OgkJdGhlIGV4dGNvbiBkZXZpY2UgdGhhdCBoYXMgdGhlIGNhYmxlLgorICogQGlkOgkJCXRoZSB1bmlxdWUgaWQgb2YgZWFjaCBleHRlcm5hbCBjb25uZWN0b3IKKyAqCQkJaW4gZXh0Y29uIGVudW1lcmF0aW9uLgorICogQHN0YXRlOgkJdGhlIG5ldyBjYWJsZSBzdGF0dXMuIFRoZSBkZWZhdWx0IHNlbWFudGljcyBpcworICoJCQl0cnVlOiBhdHRhY2hlZCAvIGZhbHNlOiBkZXRhY2hlZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNldCB0aGUgc3RhdGUgb2YgZXh0ZXJuYWwgY29ubmVjdG9yIGFuZCBzeW5jaHJvbml6ZSB0aGUgZGF0YQorICogYnkgdXNuaW5nIGEgbm90aWZpY2F0aW9uLgorICovCitpbnQgZXh0Y29uX3NldF9zdGF0ZV9zeW5jKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQsCisJCQkJYm9vbCBjYWJsZV9zdGF0ZSkKK3sKKwlpbnQgcmV0LCBpbmRleDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaW5kZXggPSBmaW5kX2NhYmxlX2luZGV4X2J5X2lkKGVkZXYsIGlkKTsKKwlpZiAoaW5kZXggPCAwKQorCQlyZXR1cm4gaW5kZXg7CisKKwkvKiBDaGVjayB3aGV0aGVyIHRoZSBleHRlcm5hbCBjb25uZWN0b3IncyBzdGF0ZSBpcyBjaGFuZ2VkLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZlZGV2LT5sb2NrLCBmbGFncyk7CisJcmV0ID0gaXNfZXh0Y29uX2NoYW5nZWQoZWRldiwgaW5kZXgsIGNhYmxlX3N0YXRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZGV2LT5sb2NrLCBmbGFncyk7CisJaWYgKCFyZXQpCisJCXJldHVybiAwOworCisJcmV0ID0gZXh0Y29uX3NldF9zdGF0ZShlZGV2LCBpZCwgY2FibGVfc3RhdGUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGV4dGNvbl9zeW5jKGVkZXYsIGlkKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGV4dGNvbl9zZXRfc3RhdGVfc3luYyk7CisKKy8qKgorICogZXh0Y29uX2dldF9wcm9wZXJ0eSgpIC0gR2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiBhIHNwZWNpZmljIGNhYmxlLgorICogQGVkZXY6CQl0aGUgZXh0Y29uIGRldmljZSB0aGF0IGhhcyB0aGUgY2FibGUuCisgKiBAaWQ6CQkJdGhlIHVuaXF1ZSBpZCBvZiBlYWNoIGV4dGVybmFsIGNvbm5lY3RvcgorICoJCQlpbiBleHRjb24gZW51bWVyYXRpb24uCisgKiBAcHJvcDoJCXRoZSBwcm9wZXJ0eSBpZCBhbW9uZyBlbnVtIGV4dGNvbl9wcm9wZXJ0eS4KKyAqIEBwcm9wX3ZhbDoJCXRoZSBwb2ludGVyIHdoaWNoIHN0b3JlIHRoZSB2YWx1ZSBvZiBwcm9wZXJ0eS4KKyAqCisgKiBXaGVuIGdldHRpbmcgdGhlIHByb3BlcnR5IHZhbHVlIG9mIGV4dGVybmFsIGNvbm5lY3RvciwgdGhlIGV4dGVybmFsIGNvbm5lY3RvcgorICogc2hvdWxkIGJlIGF0dGFjaGVkLiBJZiBkZXRhY2hlZCBzdGF0ZSwgZnVuY3Rpb24ganVzdCByZXR1cm4gMCB3aXRob3V0CisgKiBwcm9wZXJ0eSB2YWx1ZS4gQWxzbywgdGhlIGVhY2ggcHJvcGVydHkgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0IG9mCisgKiBzdXBwb3J0ZWQgcHJvcGVydGllcyBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgb2YgZXh0ZXJuYWwgY29ubmVjdG9ycy4KKyAqCisgKiBSZXR1cm5zIDAgaWYgc3VjY2VzcyBvciBlcnJvciBudW1iZXIgaWYgZmFpbAorICovCitpbnQgZXh0Y29uX2dldF9wcm9wZXJ0eShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkLAorCQkJCXVuc2lnbmVkIGludCBwcm9wLAorCQkJCXVuaW9uIGV4dGNvbl9wcm9wZXJ0eV92YWx1ZSAqcHJvcF92YWwpCit7CisJc3RydWN0IGV4dGNvbl9jYWJsZSAqY2FibGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaW5kZXgsIHJldCA9IDA7CisKKwkqcHJvcF92YWwgPSAodW5pb24gZXh0Y29uX3Byb3BlcnR5X3ZhbHVlKSgwKTsKKworCWlmICghZWRldikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzdGF0ZSA9IGNhYmxlX3N0YXRlID8gKDEgPDwgaW5kZXgpIDogMDsKLQlyZXR1cm4gZXh0Y29uX3VwZGF0ZV9zdGF0ZShlZGV2LCAxIDw8IGluZGV4LCBzdGF0ZSk7CisJLyogQ2hlY2sgd2hldGhlciB0aGUgcHJvcGVydHkgaXMgc3VwcG9ydGVkIG9yIG5vdCAqLworCWlmICghaXNfZXh0Y29uX3Byb3BlcnR5X3N1cHBvcnRlZChpZCwgcHJvcCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRmluZCB0aGUgY2FibGUgaW5kZXggb2YgZXh0ZXJuYWwgY29ubmVjdG9yIGJ5IHVzaW5nIGlkICovCisJaW5kZXggPSBmaW5kX2NhYmxlX2luZGV4X2J5X2lkKGVkZXYsIGlkKTsKKwlpZiAoaW5kZXggPCAwKQorCQlyZXR1cm4gaW5kZXg7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZWRldi0+bG9jaywgZmxhZ3MpOworCisJLyogQ2hlY2sgd2hldGhlciB0aGUgcHJvcGVydHkgaXMgYXZhaWxhYmxlIG9yIG5vdC4gKi8KKwlpZiAoIWlzX2V4dGNvbl9wcm9wZXJ0eV9jYXBhYmlsaXR5KGVkZXYsIGlkLCBpbmRleCwgcHJvcCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRldi0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCS8qCisJICogQ2hlY2sgd2hldGhlciB0aGUgZXh0ZXJuYWwgY29ubmVjdG9yIGlzIGF0dGFjaGVkLgorCSAqIElmIGV4dGVybmFsIGNvbm5lY3RvciBpcyBkZXRhY2hlZCwgdGhlIHVzZXIgY2FuIG5vdAorCSAqIGdldCB0aGUgcHJvcGVydHkgdmFsdWUuCisJICovCisJaWYgKCFpc19leHRjb25fYXR0YWNoZWQoZWRldiwgaW5kZXgpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVkZXYtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FibGUgPSAmZWRldi0+Y2FibGVzW2luZGV4XTsKKworCS8qIEdldCB0aGUgcHJvcGVydHkgdmFsdWUgYWNjb3JkaW5nIHRvIGV4dGNvbiB0eXBlICovCisJc3dpdGNoIChwcm9wKSB7CisJY2FzZSBFWFRDT05fUFJPUF9VU0JfTUlOIC4uLiBFWFRDT05fUFJPUF9VU0JfTUFYOgorCQkqcHJvcF92YWwgPSBjYWJsZS0+dXNiX3Byb3B2YWxbcHJvcCAtIEVYVENPTl9QUk9QX1VTQl9NSU5dOworCQlicmVhazsKKwljYXNlIEVYVENPTl9QUk9QX0NIR19NSU4gLi4uIEVYVENPTl9QUk9QX0NIR19NQVg6CisJCSpwcm9wX3ZhbCA9IGNhYmxlLT5jaGdfcHJvcHZhbFtwcm9wIC0gRVhUQ09OX1BST1BfQ0hHX01JTl07CisJCWJyZWFrOworCWNhc2UgRVhUQ09OX1BST1BfSkFDS19NSU4gLi4uIEVYVENPTl9QUk9QX0pBQ0tfTUFYOgorCQkqcHJvcF92YWwgPSBjYWJsZS0+amFja19wcm9wdmFsW3Byb3AgLSBFWFRDT05fUFJPUF9KQUNLX01JTl07CisJCWJyZWFrOworCWNhc2UgRVhUQ09OX1BST1BfRElTUF9NSU4gLi4uIEVYVENPTl9QUk9QX0RJU1BfTUFYOgorCQkqcHJvcF92YWwgPSBjYWJsZS0+ZGlzcF9wcm9wdmFsW3Byb3AgLSBFWFRDT05fUFJPUF9ESVNQX01JTl07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVkZXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChleHRjb25fc2V0X2NhYmxlX3N0YXRlXyk7CitFWFBPUlRfU1lNQk9MX0dQTChleHRjb25fZ2V0X3Byb3BlcnR5KTsKKworLyoqCisgKiBleHRjb25fc2V0X3Byb3BlcnR5KCkgLSBTZXQgdGhlIHByb3BlcnR5IHZhbHVlIG9mIGEgc3BlY2lmaWMgY2FibGUuCisgKiBAZWRldjoJCXRoZSBleHRjb24gZGV2aWNlIHRoYXQgaGFzIHRoZSBjYWJsZS4KKyAqIEBpZDoJCQl0aGUgdW5pcXVlIGlkIG9mIGVhY2ggZXh0ZXJuYWwgY29ubmVjdG9yCisgKgkJCWluIGV4dGNvbiBlbnVtZXJhdGlvbi4KKyAqIEBwcm9wOgkJdGhlIHByb3BlcnR5IGlkIGFtb25nIGVudW0gZXh0Y29uX3Byb3BlcnR5LgorICogQHByb3BfdmFsOgkJdGhlIHBvaW50ZXIgaW5jbHVkaW5nIHRoZSBuZXcgdmFsdWUgb2YgcHJvcGVydHkuCisgKgorICogVGhlIGVhY2ggcHJvcGVydHkgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBwcm9wZXJ0aWVzCisgKiBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgb2YgZXh0ZXJuYWwgY29ubmVjdG9ycy4KKyAqCisgKiBSZXR1cm5zIDAgaWYgc3VjY2VzcyBvciBlcnJvciBudW1iZXIgaWYgZmFpbAorICovCitpbnQgZXh0Y29uX3NldF9wcm9wZXJ0eShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkLAorCQkJCXVuc2lnbmVkIGludCBwcm9wLAorCQkJCXVuaW9uIGV4dGNvbl9wcm9wZXJ0eV92YWx1ZSBwcm9wX3ZhbCkKK3sKKwlzdHJ1Y3QgZXh0Y29uX2NhYmxlICpjYWJsZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpbmRleCwgcmV0ID0gMDsKKworCWlmICghZWRldikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBDaGVjayB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQgb3Igbm90ICovCisJaWYgKCFpc19leHRjb25fcHJvcGVydHlfc3VwcG9ydGVkKGlkLCBwcm9wKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBGaW5kIHRoZSBjYWJsZSBpbmRleCBvZiBleHRlcm5hbCBjb25uZWN0b3IgYnkgdXNpbmcgaWQgKi8KKwlpbmRleCA9IGZpbmRfY2FibGVfaW5kZXhfYnlfaWQoZWRldiwgaWQpOworCWlmIChpbmRleCA8IDApCisJCXJldHVybiBpbmRleDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlZGV2LT5sb2NrLCBmbGFncyk7CisKKwkvKiBDaGVjayB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBpcyBhdmFpbGFibGUgb3Igbm90LiAqLworCWlmICghaXNfZXh0Y29uX3Byb3BlcnR5X2NhcGFiaWxpdHkoZWRldiwgaWQsIGluZGV4LCBwcm9wKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZGV2LT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJY2FibGUgPSAmZWRldi0+Y2FibGVzW2luZGV4XTsKKworCS8qIFNldCB0aGUgcHJvcGVydHkgdmFsdWUgYWNjb3JkaW5nIHRvIGV4dGNvbiB0eXBlICovCisJc3dpdGNoIChwcm9wKSB7CisJY2FzZSBFWFRDT05fUFJPUF9VU0JfTUlOIC4uLiBFWFRDT05fUFJPUF9VU0JfTUFYOgorCQljYWJsZS0+dXNiX3Byb3B2YWxbcHJvcCAtIEVYVENPTl9QUk9QX1VTQl9NSU5dID0gcHJvcF92YWw7CisJCWJyZWFrOworCWNhc2UgRVhUQ09OX1BST1BfQ0hHX01JTiAuLi4gRVhUQ09OX1BST1BfQ0hHX01BWDoKKwkJY2FibGUtPmNoZ19wcm9wdmFsW3Byb3AgLSBFWFRDT05fUFJPUF9DSEdfTUlOXSA9IHByb3BfdmFsOworCQlicmVhazsKKwljYXNlIEVYVENPTl9QUk9QX0pBQ0tfTUlOIC4uLiBFWFRDT05fUFJPUF9KQUNLX01BWDoKKwkJY2FibGUtPmphY2tfcHJvcHZhbFtwcm9wIC0gRVhUQ09OX1BST1BfSkFDS19NSU5dID0gcHJvcF92YWw7CisJCWJyZWFrOworCWNhc2UgRVhUQ09OX1BST1BfRElTUF9NSU4gLi4uIEVYVENPTl9QUk9QX0RJU1BfTUFYOgorCQljYWJsZS0+ZGlzcF9wcm9wdmFsW3Byb3AgLSBFWFRDT05fUFJPUF9ESVNQX01JTl0gPSBwcm9wX3ZhbDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRldi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGV4dGNvbl9zZXRfcHJvcGVydHkpOworCisvKioKKyAqIGV4dGNvbl9zZXRfcHJvcGVydHlfc3luYygpIC0gU2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiBhIHNwZWNpZmljIGNhYmxlCisJCQl3aXRoIGEgbm90aWZpY2F0aW9uLgorICogQHByb3BfdmFsOgkJdGhlIHBvaW50ZXIgaW5jbHVkaW5nIHRoZSBuZXcgdmFsdWUgb2YgcHJvcGVydHkuCisgKgorICogV2hlbiBzZXR0aW5nIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiBleHRlcm5hbCBjb25uZWN0b3IsIHRoZSBleHRlcm5hbCBjb25uZWN0b3IKKyAqIHNob3VsZCBiZSBhdHRhY2hlZC4gVGhlIGVhY2ggcHJvcGVydHkgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0IG9mCisgKiBzdXBwb3J0ZWQgcHJvcGVydGllcyBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgb2YgZXh0ZXJuYWwgY29ubmVjdG9ycy4KKyAqCisgKiBSZXR1cm5zIDAgaWYgc3VjY2VzcyBvciBlcnJvciBudW1iZXIgaWYgZmFpbAorICovCitpbnQgZXh0Y29uX3NldF9wcm9wZXJ0eV9zeW5jKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQsCisJCQkJdW5zaWduZWQgaW50IHByb3AsCisJCQkJdW5pb24gZXh0Y29uX3Byb3BlcnR5X3ZhbHVlIHByb3BfdmFsKQoreworCWludCByZXQ7CisKKwlyZXQgPSBleHRjb25fc2V0X3Byb3BlcnR5KGVkZXYsIGlkLCBwcm9wLCBwcm9wX3ZhbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gZXh0Y29uX3N5bmMoZWRldiwgaWQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZXh0Y29uX3NldF9wcm9wZXJ0eV9zeW5jKTsKKworLyoqCisgKiBleHRjb25fZ2V0X3Byb3BlcnR5X2NhcGFiaWxpdHkoKSAtIEdldCB0aGUgY2FwYWJpbGl0eSBvZiBwcm9wZXJ0eQorICoJCQlvZiBhbiBleHRlcm5hbCBjb25uZWN0b3IuCisgKiBAZWRldjoJCXRoZSBleHRjb24gZGV2aWNlIHRoYXQgaGFzIHRoZSBjYWJsZS4KKyAqIEBpZDoJCQl0aGUgdW5pcXVlIGlkIG9mIGVhY2ggZXh0ZXJuYWwgY29ubmVjdG9yCisgKgkJCWluIGV4dGNvbiBlbnVtZXJhdGlvbi4KKyAqIEBwcm9wOgkJdGhlIHByb3BlcnR5IGlkIGFtb25nIGVudW0gZXh0Y29uX3Byb3BlcnR5LgorICoKKyAqIFJldHVybnMgMSBpZiB0aGUgcHJvcGVydHkgaXMgYXZhaWxhYmxlIG9yIDAgaWYgbm90IGF2YWlsYWJsZS4KKyAqLworaW50IGV4dGNvbl9nZXRfcHJvcGVydHlfY2FwYWJpbGl0eShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkLAorCQkJCQl1bnNpZ25lZCBpbnQgcHJvcCkKK3sKKwlpbnQgaW5kZXg7CisKKwlpZiAoIWVkZXYpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQ2hlY2sgd2hldGhlciB0aGUgcHJvcGVydHkgaXMgc3VwcG9ydGVkIG9yIG5vdCAqLworCWlmICghaXNfZXh0Y29uX3Byb3BlcnR5X3N1cHBvcnRlZChpZCwgcHJvcCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRmluZCB0aGUgY2FibGUgaW5kZXggb2YgZXh0ZXJuYWwgY29ubmVjdG9yIGJ5IHVzaW5nIGlkICovCisJaW5kZXggPSBmaW5kX2NhYmxlX2luZGV4X2J5X2lkKGVkZXYsIGlkKTsKKwlpZiAoaW5kZXggPCAwKQorCQlyZXR1cm4gaW5kZXg7CisKKwlyZXR1cm4gaXNfZXh0Y29uX3Byb3BlcnR5X2NhcGFiaWxpdHkoZWRldiwgaWQsIGluZGV4LCBwcm9wKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGV4dGNvbl9nZXRfcHJvcGVydHlfY2FwYWJpbGl0eSk7CisKKy8qKgorICogZXh0Y29uX3NldF9wcm9wZXJ0eV9jYXBhYmlsaXR5KCkgLSBTZXQgdGhlIGNhcGFiaWxpdHkgb2YgYSBwcm9wZXJ0eQorICoJCQlvZiBhbiBleHRlcm5hbCBjb25uZWN0b3IuCisgKiBAZWRldjoJCXRoZSBleHRjb24gZGV2aWNlIHRoYXQgaGFzIHRoZSBjYWJsZS4KKyAqIEBpZDoJCQl0aGUgdW5pcXVlIGlkIG9mIGVhY2ggZXh0ZXJuYWwgY29ubmVjdG9yCisgKgkJCWluIGV4dGNvbiBlbnVtZXJhdGlvbi4KKyAqIEBwcm9wOgkJdGhlIHByb3BlcnR5IGlkIGFtb25nIGVudW0gZXh0Y29uX3Byb3BlcnR5LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0IHRoZSBjYXBhYmlsaXR5IG9mIGEgcHJvcGVydHkgZm9yIGFuIGV4dGVybmFsIGNvbm5lY3RvcgorICogdG8gbWFyayB0aGUgYml0IGluIGNhcGFiaWxpdHkgYml0bWFwIHdoaWNoIG1lYW4gdGhlIGF2YWlsYWJsZSBzdGF0ZSBvZgorICogYSBwcm9wZXJ0eS4KKyAqCisgKiBSZXR1cm5zIDAgaWYgc3VjY2VzcyBvciBlcnJvciBudW1iZXIgaWYgZmFpbAorICovCitpbnQgZXh0Y29uX3NldF9wcm9wZXJ0eV9jYXBhYmlsaXR5KHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQsCisJCQkJCXVuc2lnbmVkIGludCBwcm9wKQoreworCXN0cnVjdCBleHRjb25fY2FibGUgKmNhYmxlOworCWludCBpbmRleCwgdHlwZSwgcmV0ID0gMDsKKworCWlmICghZWRldikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBDaGVjayB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQgb3Igbm90LiAqLworCWlmICghaXNfZXh0Y29uX3Byb3BlcnR5X3N1cHBvcnRlZChpZCwgcHJvcCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRmluZCB0aGUgY2FibGUgaW5kZXggb2YgZXh0ZXJuYWwgY29ubmVjdG9yIGJ5IHVzaW5nIGlkLiAqLworCWluZGV4ID0gZmluZF9jYWJsZV9pbmRleF9ieV9pZChlZGV2LCBpZCk7CisJaWYgKGluZGV4IDwgMCkKKwkJcmV0dXJuIGluZGV4OworCisJdHlwZSA9IGdldF9leHRjb25fdHlwZShwcm9wKTsKKwlpZiAodHlwZSA8IDApCisJCXJldHVybiB0eXBlOworCisJY2FibGUgPSAmZWRldi0+Y2FibGVzW2luZGV4XTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgRVhUQ09OX1RZUEVfVVNCOgorCQlfX3NldF9iaXQocHJvcCAtIEVYVENPTl9QUk9QX1VTQl9NSU4sIGNhYmxlLT51c2JfYml0cyk7CisJCWJyZWFrOworCWNhc2UgRVhUQ09OX1RZUEVfQ0hHOgorCQlfX3NldF9iaXQocHJvcCAtIEVYVENPTl9QUk9QX0NIR19NSU4sIGNhYmxlLT5jaGdfYml0cyk7CisJCWJyZWFrOworCWNhc2UgRVhUQ09OX1RZUEVfSkFDSzoKKwkJX19zZXRfYml0KHByb3AgLSBFWFRDT05fUFJPUF9KQUNLX01JTiwgY2FibGUtPmphY2tfYml0cyk7CisJCWJyZWFrOworCWNhc2UgRVhUQ09OX1RZUEVfRElTUDoKKwkJX19zZXRfYml0KHByb3AgLSBFWFRDT05fUFJPUF9ESVNQX01JTiwgY2FibGUtPmRpc3BfYml0cyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGV4dGNvbl9zZXRfcHJvcGVydHlfY2FwYWJpbGl0eSk7CiAKIC8qKgogICogZXh0Y29uX2dldF9leHRjb25fZGV2KCkgLSBHZXQgdGhlIGV4dGNvbiBkZXZpY2UgaW5zdGFuY2UgZnJvbSB0aGUgbmFtZQpAQCAtNDI4LDcgKzkwNCw3IEBACiAJCQkgICAgIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0LCBpZHg7CisJaW50IHJldCwgaWR4ID0gLUVJTlZBTDsKIAogCWlmICghbmIpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtODQ2LDEzICsxMzIyLDEzIEBACiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCiAJaWYgKCFkZXYtPm9mX25vZGUpIHsKLQkJZGV2X2VycihkZXYsICJkZXZpY2UgZG9lcyBub3QgaGF2ZSBhIGRldmljZSBub2RlIGVudHJ5XG4iKTsKKwkJZGV2X2RiZyhkZXYsICJkZXZpY2UgZG9lcyBub3QgaGF2ZSBhIGRldmljZSBub2RlIGVudHJ5XG4iKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJfQogCiAJbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUoZGV2LT5vZl9ub2RlLCAiZXh0Y29uIiwgaW5kZXgpOwogCWlmICghbm9kZSkgewotCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgcGhhbmRsZSBpbiAlcyBub2RlXG4iLAorCQlkZXZfZGJnKGRldiwgImZhaWxlZCB0byBnZXQgcGhhbmRsZSBpbiAlcyBub2RlXG4iLAogCQkJZGV2LT5vZl9ub2RlLT5mdWxsX25hbWUpOwogCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9zY3BpLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9zY3BpLmMKaW5kZXggNDM4ODkzNy4uY2UyYmMyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9hcm1fc2NwaS5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3NjcGkuYwpAQCAtNzA5LDkgKzcwOSwxMCBAQAogCQlzdHJ1Y3QgbWJveF9jbGllbnQgKmNsID0gJnBjaGFuLT5jbDsKIAkJc3RydWN0IGRldmljZV9ub2RlICpzaG1lbSA9IG9mX3BhcnNlX3BoYW5kbGUobnAsICJzaG1lbSIsIGlkeCk7CiAKLQkJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc2htZW0sIDAsICZyZXMpKSB7CisJCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc2htZW0sIDAsICZyZXMpOworCQlvZl9ub2RlX3B1dChzaG1lbSk7CisJCWlmIChyZXQpIHsKIAkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBTQ1BJIHBheWxvYWQgbWVtIHJlc291cmNlXG4iKTsKLQkJCXJldCA9IC1FSU5WQUw7CiAJCQlnb3RvIGVycjsKIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2RjZGJhcy5jIGIvZHJpdmVycy9maXJtd2FyZS9kY2RiYXMuYwppbmRleCA4MjllZWM4Li4yZmUxYTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2RjZGJhcy5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZGNkYmFzLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMjM4LDMzICsyMzksMTQgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLS8qKgotICogZGNkYmFzX3NtaV9yZXF1ZXN0OiBnZW5lcmF0ZSBTTUkgcmVxdWVzdAotICoKLSAqIENhbGxlZCB3aXRoIHNtaV9kYXRhX2xvY2suCi0gKi8KLWludCBkY2RiYXNfc21pX3JlcXVlc3Qoc3RydWN0IHNtaV9jbWQgKnNtaV9jbWQpCitzdGF0aWMgaW50IHJhaXNlX3NtaSh2b2lkICpwYXIpCiB7Ci0JY3B1bWFza192YXJfdCBvbGRfbWFzazsKLQlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc21pX2NtZCAqc21pX2NtZCA9IHBhcjsKIAotCWlmIChzbWlfY21kLT5tYWdpYyAhPSBTTUlfQ01EX01BR0lDKSB7Ci0JCWRldl9pbmZvKCZkY2RiYXNfcGRldi0+ZGV2LCAiJXM6IGludmFsaWQgbWFnaWMgdmFsdWVcbiIsCi0JCQkgX19mdW5jX18pOwotCQlyZXR1cm4gLUVCQURSOwotCX0KLQotCS8qIFNNSSByZXF1aXJlcyBDUFUgMCAqLwotCWlmICghYWxsb2NfY3B1bWFza192YXIoJm9sZF9tYXNrLCBHRlBfS0VSTkVMKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQljcHVtYXNrX2NvcHkob2xkX21hc2ssICZjdXJyZW50LT5jcHVzX2FsbG93ZWQpOwotCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsIGNwdW1hc2tfb2YoMCkpOwogCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgIT0gMCkgewogCQlkZXZfZGJnKCZkY2RiYXNfcGRldi0+ZGV2LCAiJXM6IGZhaWxlZCB0byBnZXQgQ1BVIDBcbiIsCiAJCQlfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBvdXQ7CisJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJLyogZ2VuZXJhdGUgU01JICovCkBAIC0yODAsOSArMjYyLDI4IEBACiAJCTogIm1lbW9yeSIKIAkpOwogCi1vdXQ6Ci0Jc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgb2xkX21hc2spOwotCWZyZWVfY3B1bWFza192YXIob2xkX21hc2spOworCXJldHVybiAwOworfQorLyoqCisgKiBkY2RiYXNfc21pX3JlcXVlc3Q6IGdlbmVyYXRlIFNNSSByZXF1ZXN0CisgKgorICogQ2FsbGVkIHdpdGggc21pX2RhdGFfbG9jay4KKyAqLworaW50IGRjZGJhc19zbWlfcmVxdWVzdChzdHJ1Y3Qgc21pX2NtZCAqc21pX2NtZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKHNtaV9jbWQtPm1hZ2ljICE9IFNNSV9DTURfTUFHSUMpIHsKKwkJZGV2X2luZm8oJmRjZGJhc19wZGV2LT5kZXYsICIlczogaW52YWxpZCBtYWdpYyB2YWx1ZVxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUJBRFI7CisJfQorCisJLyogU01JIHJlcXVpcmVzIENQVSAwICovCisJZ2V0X29ubGluZV9jcHVzKCk7CisJcmV0ID0gc21wX2NhbGxfb25fY3B1KDAsIHJhaXNlX3NtaSwgc21pX2NtZCwgdHJ1ZSk7CisJcHV0X29ubGluZV9jcHVzKCk7CisKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2RtaS1pZC5jIGIvZHJpdmVycy9maXJtd2FyZS9kbWktaWQuYwppbmRleCA5NGE1OGEwLi40NGMwMTM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2RtaS1pZC5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZG1pLWlkLmMKQEAgLTIyOSwxNCArMjI5LDE0IEBACiAKIAlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoZG1pX2Rldik7CiAJaWYgKHJldCkKLQkJZ290byBmYWlsX2ZyZWVfZG1pX2RldjsKKwkJZ290byBmYWlsX3B1dF9kbWlfZGV2OwogCiAJcmV0dXJuIDA7CiAKLWZhaWxfZnJlZV9kbWlfZGV2OgotCWtmcmVlKGRtaV9kZXYpOwotZmFpbF9jbGFzc191bnJlZ2lzdGVyOgorZmFpbF9wdXRfZG1pX2RldjoKKwlwdXRfZGV2aWNlKGRtaV9kZXYpOwogCitmYWlsX2NsYXNzX3VucmVnaXN0ZXI6CiAJY2xhc3NfdW5yZWdpc3RlcigmZG1pX2NsYXNzKTsKIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9LY29uZmlnIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvS2NvbmZpZwppbmRleCA2Mzk0MTUyLi5jOTgxYmUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL0tjb25maWcKQEAgLTExMiw2ICsxMTIsMjMgQEAKIAogCSAgTW9zdCB1c2VycyBzaG91bGQgc2F5IE4uCiAKK2NvbmZpZyBFRklfVEVTVAorCXRyaXN0YXRlICJFRkkgUnVudGltZSBTZXJ2aWNlIFRlc3RzIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBFRkkKKwlkZWZhdWx0IG4KKwloZWxwCisJICBUaGlzIGRyaXZlciB1c2VzIHRoZSBlZmkuPHNlcnZpY2U+IGZ1bmN0aW9uIHBvaW50ZXJzIGRpcmVjdGx5IGluc3RlYWQKKwkgIG9mIGdvaW5nIHRocm91Z2ggdGhlIGVmaXZhciBBUEksIGJlY2F1c2UgaXQgaXMgbm90IHRyeWluZyB0byB0ZXN0IHRoZQorCSAga2VybmVsIHN1YnN5c3RlbSwganVzdCBmb3IgdGVzdGluZyB0aGUgVUVGSSBydW50aW1lIHNlcnZpY2UKKwkgIGludGVyZmFjZXMgd2hpY2ggYXJlIHByb3ZpZGVkIGJ5IHRoZSBmaXJtd2FyZS4gVGhpcyBkcml2ZXIgaXMgdXNlZAorCSAgYnkgdGhlIEZpcm13YXJlIFRlc3QgU3VpdGUgKEZXVFMpIGZvciB0ZXN0aW5nIHRoZSBVRUZJIHJ1bnRpbWUKKwkgIGludGVyZmFjZXMgcmVhZGluZXNzIG9mIHRoZSBmaXJtd2FyZS4KKwkgIERldGFpbHMgZm9yIEZXVFMgYXJlIGF2YWlsYWJsZSBmcm9tOgorCSAgPGh0dHBzOi8vd2lraS51YnVudHUuY29tL0Zpcm13YXJlVGVzdFN1aXRlPgorCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSB0aGUgcnVudGltZSBzZXJ2aWNlcyBzdXBwb3J0IHZpYSAvZGV2L2VmaV90ZXN0LgorCSAgSWYgdW5zdXJlLCBzYXkgTi4KKwogZW5kbWVudQogCiBjb25maWcgVUVGSV9DUEVSCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9NYWtlZmlsZSBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL01ha2VmaWxlCmluZGV4IGEyMTk2NDAuLmM4YTQzOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL01ha2VmaWxlCkBAIC0xMCw3ICsxMCw3IEBACiBLQVNBTl9TQU5JVElaRV9ydW50aW1lLXdyYXBwZXJzLm8JOj0gbgogCiBvYmotJChDT05GSUdfRUZJKQkJCSs9IGVmaS5vIHZhcnMubyByZWJvb3QubyBtZW1hdHRyLm8KLW9iai0kKENPTkZJR19FRkkpCQkJKz0gY2Fwc3VsZS5vCitvYmotJChDT05GSUdfRUZJKQkJCSs9IGNhcHN1bGUubyBtZW1tYXAubwogb2JqLSQoQ09ORklHX0VGSV9WQVJTKQkJCSs9IGVmaXZhcnMubwogb2JqLSQoQ09ORklHX0VGSV9FU1JUKQkJCSs9IGVzcnQubwogb2JqLSQoQ09ORklHX0VGSV9WQVJTX1BTVE9SRSkJCSs9IGVmaS1wc3RvcmUubwpAQCAtMjAsNiArMjAsNyBAQAogb2JqLSQoQ09ORklHX0VGSV9TVFVCKQkJCSs9IGxpYnN0dWIvCiBvYmotJChDT05GSUdfRUZJX0ZBS0VfTUVNTUFQKQkJKz0gZmFrZV9tZW0ubwogb2JqLSQoQ09ORklHX0VGSV9CT09UTE9BREVSX0NPTlRST0wpCSs9IGVmaWJjLm8KK29iai0kKENPTkZJR19FRklfVEVTVCkJCQkrPSB0ZXN0LwogCiBhcm0tb2JqLSQoQ09ORklHX0VGSSkJCQk6PSBhcm0taW5pdC5vIGFybS1ydW50aW1lLm8KIG9iai0kKENPTkZJR19BUk0pCQkJKz0gJChhcm0tb2JqLXkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9hcm0taW5pdC5jIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvYXJtLWluaXQuYwppbmRleCBjNDlkNTBlLi44ZWZlMTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9hcm0taW5pdC5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL2FybS1pbml0LmMKQEAgLTI2LDkgKzI2LDkgQEAKIAogdTY0IGVmaV9zeXN0ZW1fdGFibGU7CiAKLXN0YXRpYyBpbnQgX19pbml0IGlzX25vcm1hbF9yYW0oZWZpX21lbW9yeV9kZXNjX3QgKm1kKQorc3RhdGljIGludCBfX2luaXQgaXNfbWVtb3J5KGVmaV9tZW1vcnlfZGVzY190ICptZCkKIHsKLQlpZiAobWQtPmF0dHJpYnV0ZSAmIEVGSV9NRU1PUllfV0IpCisJaWYgKG1kLT5hdHRyaWJ1dGUgJiAoRUZJX01FTU9SWV9XQnxFRklfTUVNT1JZX1dUfEVGSV9NRU1PUllfV0MpKQogCQlyZXR1cm4gMTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE1Miw5ICsxNTIsOSBAQAogfQogCiAvKgotICogUmV0dXJuIHRydWUgZm9yIFJBTSByZWdpb25zIHdlIHdhbnQgdG8gcGVybWFuZW50bHkgcmVzZXJ2ZS4KKyAqIFJldHVybiB0cnVlIGZvciByZWdpb25zIHRoYXQgY2FuIGJlIHVzZWQgYXMgU3lzdGVtIFJBTS4KICAqLwotc3RhdGljIF9faW5pdCBpbnQgaXNfcmVzZXJ2ZV9yZWdpb24oZWZpX21lbW9yeV9kZXNjX3QgKm1kKQorc3RhdGljIF9faW5pdCBpbnQgaXNfdXNhYmxlX21lbW9yeShlZmlfbWVtb3J5X2Rlc2NfdCAqbWQpCiB7CiAJc3dpdGNoIChtZC0+dHlwZSkgewogCWNhc2UgRUZJX0xPQURFUl9DT0RFOgpAQCAtMTYzLDE4ICsxNjMsMjIgQEAKIAljYXNlIEVGSV9CT09UX1NFUlZJQ0VTX0RBVEE6CiAJY2FzZSBFRklfQ09OVkVOVElPTkFMX01FTU9SWToKIAljYXNlIEVGSV9QRVJTSVNURU5UX01FTU9SWToKLQkJcmV0dXJuIDA7CisJCS8qCisJCSAqIEFjY29yZGluZyB0byB0aGUgc3BlYywgdGhlc2UgcmVnaW9ucyBhcmUgbm8gbG9uZ2VyIHJlc2VydmVkCisJCSAqIGFmdGVyIGNhbGxpbmcgRXhpdEJvb3RTZXJ2aWNlcygpLiBIb3dldmVyLCB3ZSBjYW4gb25seSB1c2UKKwkJICogdGhlbSBhcyBTeXN0ZW0gUkFNIGlmIHRoZXkgY2FuIGJlIG1hcHBlZCB3cml0ZWJhY2sgY2FjaGVhYmxlLgorCQkgKi8KKwkJcmV0dXJuIChtZC0+YXR0cmlidXRlICYgRUZJX01FTU9SWV9XQik7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQotCXJldHVybiBpc19ub3JtYWxfcmFtKG1kKTsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIHN0YXRpYyBfX2luaXQgdm9pZCByZXNlcnZlX3JlZ2lvbnModm9pZCkKIHsKIAllZmlfbWVtb3J5X2Rlc2NfdCAqbWQ7CiAJdTY0IHBhZGRyLCBucGFnZXMsIHNpemU7Ci0JaW50IHJlc3Y7CiAKIAlpZiAoZWZpX2VuYWJsZWQoRUZJX0RCRykpCiAJCXByX2luZm8oIlByb2Nlc3NpbmcgRUZJIG1lbW9yeSBtYXA6XG4iKTsKQEAgLTE5MSwzMiArMTk1LDI5IEBACiAJCXBhZGRyID0gbWQtPnBoeXNfYWRkcjsKIAkJbnBhZ2VzID0gbWQtPm51bV9wYWdlczsKIAotCQlyZXN2ID0gaXNfcmVzZXJ2ZV9yZWdpb24obWQpOwogCQlpZiAoZWZpX2VuYWJsZWQoRUZJX0RCRykpIHsKIAkJCWNoYXIgYnVmWzY0XTsKIAotCQkJcHJfaW5mbygiICAweCUwMTJsbHgtMHglMDEybGx4ICVzJXNcbiIsCisJCQlwcl9pbmZvKCIgIDB4JTAxMmxseC0weCUwMTJsbHggJXNcbiIsCiAJCQkJcGFkZHIsIHBhZGRyICsgKG5wYWdlcyA8PCBFRklfUEFHRV9TSElGVCkgLSAxLAotCQkJCWVmaV9tZF90eXBlYXR0cl9mb3JtYXQoYnVmLCBzaXplb2YoYnVmKSwgbWQpLAotCQkJCXJlc3YgPyAiKiIgOiAiIik7CisJCQkJZWZpX21kX3R5cGVhdHRyX2Zvcm1hdChidWYsIHNpemVvZihidWYpLCBtZCkpOwogCQl9CiAKIAkJbWVtcmFuZ2VfZWZpX3RvX25hdGl2ZSgmcGFkZHIsICZucGFnZXMpOwogCQlzaXplID0gbnBhZ2VzIDw8IFBBR0VfU0hJRlQ7CiAKLQkJaWYgKGlzX25vcm1hbF9yYW0obWQpKQorCQlpZiAoaXNfbWVtb3J5KG1kKSkgewogCQkJZWFybHlfaW5pdF9kdF9hZGRfbWVtb3J5X2FyY2gocGFkZHIsIHNpemUpOwogCi0JCWlmIChyZXN2KQotCQkJbWVtYmxvY2tfbWFya19ub21hcChwYWRkciwgc2l6ZSk7Ci0KKwkJCWlmICghaXNfdXNhYmxlX21lbW9yeShtZCkpCisJCQkJbWVtYmxvY2tfbWFya19ub21hcChwYWRkciwgc2l6ZSk7CisJCX0KIAl9Ci0KLQlzZXRfYml0KEVGSV9NRU1NQVAsICZlZmkuZmxhZ3MpOwogfQogCiB2b2lkIF9faW5pdCBlZmlfaW5pdCh2b2lkKQogeworCXN0cnVjdCBlZmlfbWVtb3J5X21hcF9kYXRhIGRhdGE7CiAJc3RydWN0IGVmaV9mZHRfcGFyYW1zIHBhcmFtczsKIAogCS8qIEdyYWIgVUVGSSBpbmZvcm1hdGlvbiBwbGFjZWQgaW4gRkRUIGJ5IHN0dWIgKi8KQEAgLTIyNSw5ICsyMjYsMTIgQEAKIAogCWVmaV9zeXN0ZW1fdGFibGUgPSBwYXJhbXMuc3lzdGVtX3RhYmxlOwogCi0JZWZpLm1lbW1hcC5waHlzX21hcCA9IHBhcmFtcy5tbWFwOwotCWVmaS5tZW1tYXAubWFwID0gZWFybHlfbWVtcmVtYXBfcm8ocGFyYW1zLm1tYXAsIHBhcmFtcy5tbWFwX3NpemUpOwotCWlmIChlZmkubWVtbWFwLm1hcCA9PSBOVUxMKSB7CisJZGF0YS5kZXNjX3ZlcnNpb24gPSBwYXJhbXMuZGVzY192ZXI7CisJZGF0YS5kZXNjX3NpemUgPSBwYXJhbXMuZGVzY19zaXplOworCWRhdGEuc2l6ZSA9IHBhcmFtcy5tbWFwX3NpemU7CisJZGF0YS5waHlzX21hcCA9IHBhcmFtcy5tbWFwOworCisJaWYgKGVmaV9tZW1tYXBfaW5pdF9lYXJseSgmZGF0YSkgPCAwKSB7CiAJCS8qCiAJCSogSWYgd2UgYXJlIGJvb3RpbmcgdmlhIFVFRkksIHRoZSBVRUZJIG1lbW9yeSBtYXAgaXMgdGhlIG9ubHkKIAkJKiBkZXNjcmlwdGlvbiBvZiBtZW1vcnkgd2UgaGF2ZSwgc28gdGhlcmUgaXMgbGl0dGxlIHBvaW50IGluCkBAIC0yMzUsOSArMjM5LDYgQEAKIAkJKi8KIAkJcGFuaWMoIlVuYWJsZSB0byBtYXAgRUZJIG1lbW9yeSBtYXAuXG4iKTsKIAl9Ci0JZWZpLm1lbW1hcC5tYXBfZW5kID0gZWZpLm1lbW1hcC5tYXAgKyBwYXJhbXMubW1hcF9zaXplOwotCWVmaS5tZW1tYXAuZGVzY19zaXplID0gcGFyYW1zLmRlc2Nfc2l6ZTsKLQllZmkubWVtbWFwLmRlc2NfdmVyc2lvbiA9IHBhcmFtcy5kZXNjX3ZlcjsKIAogCVdBUk4oZWZpLm1lbW1hcC5kZXNjX3ZlcnNpb24gIT0gMSwKIAkgICAgICJVbmV4cGVjdGVkIEVGSV9NRU1PUllfREVTQ1JJUFRPUiB2ZXJzaW9uICVsZCIsCkBAIC0yNDgsNyArMjQ5LDggQEAKIAogCXJlc2VydmVfcmVnaW9ucygpOwogCWVmaV9tZW1hdHRyX2luaXQoKTsKLQllYXJseV9tZW11bm1hcChlZmkubWVtbWFwLm1hcCwgcGFyYW1zLm1tYXBfc2l6ZSk7CisJZWZpX2VzcnRfaW5pdCgpOworCWVmaV9tZW1tYXBfdW5tYXAoKTsKIAogCW1lbWJsb2NrX3Jlc2VydmUocGFyYW1zLm1tYXAgJiBQQUdFX01BU0ssCiAJCQkgUEFHRV9BTElHTihwYXJhbXMubW1hcF9zaXplICsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL2FybS1ydW50aW1lLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9hcm0tcnVudGltZS5jCmluZGV4IGMzOTRiODEuLjdjNzVhOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL2FybS1ydW50aW1lLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvYXJtLXJ1bnRpbWUuYwpAQCAtMzksNiArMzksMjYgQEAKIAkubW1saXN0CQkJPSBMSVNUX0hFQURfSU5JVChlZmlfbW0ubW1saXN0KSwKIH07CiAKKyNpZmRlZiBDT05GSUdfQVJNNjRfUFREVU1QCisjaW5jbHVkZSA8YXNtL3B0ZHVtcC5oPgorCitzdGF0aWMgc3RydWN0IHB0ZHVtcF9pbmZvIGVmaV9wdGR1bXBfaW5mbyA9IHsKKwkubW0JCT0gJmVmaV9tbSwKKwkubWFya2Vycwk9IChzdHJ1Y3QgYWRkcl9tYXJrZXJbXSl7CisJCXsgMCwJCSJVRUZJIHJ1bnRpbWUgc3RhcnQiIH0sCisJCXsgVEFTS19TSVpFXzY0LAkiVUVGSSBydW50aW1lIGVuZCIgfQorCX0sCisJLmJhc2VfYWRkcgk9IDAsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwdGR1bXBfaW5pdCh2b2lkKQoreworCXJldHVybiBwdGR1bXBfcmVnaXN0ZXIoJmVmaV9wdGR1bXBfaW5mbywgImVmaV9wYWdlX3RhYmxlcyIpOworfQorZGV2aWNlX2luaXRjYWxsKHB0ZHVtcF9pbml0KTsKKworI2VuZGlmCisKIHN0YXRpYyBib29sIF9faW5pdCBlZmlfdmlydG1hcF9pbml0KHZvaWQpCiB7CiAJZWZpX21lbW9yeV9kZXNjX3QgKm1kOwpAQCAtMTE0LDE0ICsxMzQsMTIgQEAKIAogCXByX2luZm8oIlJlbWFwcGluZyBhbmQgZW5hYmxpbmcgRUZJIHNlcnZpY2VzLlxuIik7CiAKLQltYXBzaXplID0gZWZpLm1lbW1hcC5tYXBfZW5kIC0gZWZpLm1lbW1hcC5tYXA7CisJbWFwc2l6ZSA9IGVmaS5tZW1tYXAuZGVzY19zaXplICogZWZpLm1lbW1hcC5ucl9tYXA7CiAKLQllZmkubWVtbWFwLm1hcCA9IG1lbXJlbWFwKGVmaS5tZW1tYXAucGh5c19tYXAsIG1hcHNpemUsIE1FTVJFTUFQX1dCKTsKLQlpZiAoIWVmaS5tZW1tYXAubWFwKSB7CisJaWYgKGVmaV9tZW1tYXBfaW5pdF9sYXRlKGVmaS5tZW1tYXAucGh5c19tYXAsIG1hcHNpemUpKSB7CiAJCXByX2VycigiRmFpbGVkIHRvIHJlbWFwIEVGSSBtZW1vcnkgbWFwXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCWVmaS5tZW1tYXAubWFwX2VuZCA9IGVmaS5tZW1tYXAubWFwICsgbWFwc2l6ZTsKIAogCWlmICghZWZpX3ZpcnRtYXBfaW5pdCgpKSB7CiAJCXByX2VycigiVUVGSSB2aXJ0dWFsIG1hcHBpbmcgbWlzc2luZyBvciBpbnZhbGlkIC0tIHJ1bnRpbWUgc2VydmljZXMgd2lsbCBub3QgYmUgYXZhaWxhYmxlXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL2VmaS1wc3RvcmUuYyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL2VmaS1wc3RvcmUuYwppbmRleCAzMGEyNGQwLi5mNDAyYmEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9lZmktcHN0b3JlLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvZWZpLXBzdG9yZS5jCkBAIC0xMjUsMTYgKzEyNSwxOSBAQAogICogQGVudHJ5OiBkZWxldGluZyBlbnRyeQogICogQHR1cm5fb2ZmX3NjYW5uaW5nOiBDaGVjayBpZiBhIHNjYW5uaW5nIGZsYWcgc2hvdWxkIGJlIHR1cm5lZCBvZmYKICAqLwotc3RhdGljIGlubGluZSB2b2lkIF9fZWZpX3BzdG9yZV9zY2FuX3N5c2ZzX2V4aXQoc3RydWN0IGVmaXZhcl9lbnRyeSAqZW50cnksCitzdGF0aWMgaW5saW5lIGludCBfX2VmaV9wc3RvcmVfc2Nhbl9zeXNmc19leGl0KHN0cnVjdCBlZml2YXJfZW50cnkgKmVudHJ5LAogCQkJCQkJYm9vbCB0dXJuX29mZl9zY2FubmluZykKIHsKIAlpZiAoZW50cnktPmRlbGV0aW5nKSB7CiAJCWxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7CiAJCWVmaXZhcl9lbnRyeV9pdGVyX2VuZCgpOwogCQllZml2YXJfdW5yZWdpc3RlcihlbnRyeSk7Ci0JCWVmaXZhcl9lbnRyeV9pdGVyX2JlZ2luKCk7CisJCWlmIChlZml2YXJfZW50cnlfaXRlcl9iZWdpbigpKQorCQkJcmV0dXJuIC1FSU5UUjsKIAl9IGVsc2UgaWYgKHR1cm5fb2ZmX3NjYW5uaW5nKQogCQllbnRyeS0+c2Nhbm5pbmcgPSBmYWxzZTsKKworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTE0NCwxMyArMTQ3LDE4IEBACiAgKiBAaGVhZDogbGlzdCBoZWFkCiAgKiBAc3RvcDogYSBmbGFnIGNoZWNraW5nIGlmIHNjYW5uaW5nIHdpbGwgc3RvcAogICovCi1zdGF0aWMgdm9pZCBlZmlfcHN0b3JlX3NjYW5fc3lzZnNfZXhpdChzdHJ1Y3QgZWZpdmFyX2VudHJ5ICpwb3MsCitzdGF0aWMgaW50IGVmaV9wc3RvcmVfc2Nhbl9zeXNmc19leGl0KHN0cnVjdCBlZml2YXJfZW50cnkgKnBvcywKIAkJCQkgICAgICAgc3RydWN0IGVmaXZhcl9lbnRyeSAqbmV4dCwKIAkJCQkgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgYm9vbCBzdG9wKQogewotCV9fZWZpX3BzdG9yZV9zY2FuX3N5c2ZzX2V4aXQocG9zLCB0cnVlKTsKKwlpbnQgcmV0ID0gX19lZmlfcHN0b3JlX3NjYW5fc3lzZnNfZXhpdChwb3MsIHRydWUpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCWlmIChzdG9wKQotCQlfX2VmaV9wc3RvcmVfc2Nhbl9zeXNmc19leGl0KG5leHQsICZuZXh0LT5saXN0ICE9IGhlYWQpOworCQlyZXQgPSBfX2VmaV9wc3RvcmVfc2Nhbl9zeXNmc19leGl0KG5leHQsICZuZXh0LT5saXN0ICE9IGhlYWQpOworCXJldHVybiByZXQ7CiB9CiAKIC8qKgpAQCAtMTcyLDEzICsxODAsMTcgQEAKIAlzdHJ1Y3QgZWZpdmFyX2VudHJ5ICplbnRyeSwgKm47CiAJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9ICZlZml2YXJfc3lzZnNfbGlzdDsKIAlpbnQgc2l6ZSA9IDA7CisJaW50IHJldDsKIAogCWlmICghKnBvcykgewogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIG4sIGhlYWQsIGxpc3QpIHsKIAkJCWVmaV9wc3RvcmVfc2Nhbl9zeXNmc19lbnRlcihlbnRyeSwgbiwgaGVhZCk7CiAKIAkJCXNpemUgPSBlZmlfcHN0b3JlX3JlYWRfZnVuYyhlbnRyeSwgZGF0YSk7Ci0JCQllZmlfcHN0b3JlX3NjYW5fc3lzZnNfZXhpdChlbnRyeSwgbiwgaGVhZCwgc2l6ZSA8IDApOworCQkJcmV0ID0gZWZpX3BzdG9yZV9zY2FuX3N5c2ZzX2V4aXQoZW50cnksIG4sIGhlYWQsCisJCQkJCQkJIHNpemUgPCAwKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKIAkJCWlmIChzaXplKQogCQkJCWJyZWFrOwogCQl9CkBAIC0xOTAsNyArMjAyLDkgQEAKIAkJZWZpX3BzdG9yZV9zY2FuX3N5c2ZzX2VudGVyKCgqcG9zKSwgbiwgaGVhZCk7CiAKIAkJc2l6ZSA9IGVmaV9wc3RvcmVfcmVhZF9mdW5jKCgqcG9zKSwgZGF0YSk7Ci0JCWVmaV9wc3RvcmVfc2Nhbl9zeXNmc19leGl0KCgqcG9zKSwgbiwgaGVhZCwgc2l6ZSA8IDApOworCQlyZXQgPSBlZmlfcHN0b3JlX3NjYW5fc3lzZnNfZXhpdCgoKnBvcyksIG4sIGhlYWQsIHNpemUgPCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJCWlmIChzaXplKQogCQkJYnJlYWs7CiAJfQpAQCAtMjMyLDcgKzI0NiwxMCBAQAogCWlmICghKmRhdGEuYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWVmaXZhcl9lbnRyeV9pdGVyX2JlZ2luKCk7CisJaWYgKGVmaXZhcl9lbnRyeV9pdGVyX2JlZ2luKCkpIHsKKwkJa2ZyZWUoKmRhdGEuYnVmKTsKKwkJcmV0dXJuIC1FSU5UUjsKKwl9CiAJc2l6ZSA9IGVmaV9wc3RvcmVfc3lzZnNfZW50cnlfaXRlcigmZGF0YSwKIAkJCQkJICAgKHN0cnVjdCBlZml2YXJfZW50cnkgKiopJnBzaS0+ZGF0YSk7CiAJZWZpdmFyX2VudHJ5X2l0ZXJfZW5kKCk7CkBAIC0zNDcsNyArMzY0LDggQEAKIAllZGF0YS50aW1lID0gdGltZTsKIAllZGF0YS5uYW1lID0gZWZpX25hbWU7CiAKLQllZml2YXJfZW50cnlfaXRlcl9iZWdpbigpOworCWlmIChlZml2YXJfZW50cnlfaXRlcl9iZWdpbigpKQorCQlyZXR1cm4gLUVJTlRSOwogCWZvdW5kID0gX19lZml2YXJfZW50cnlfaXRlcihlZmlfcHN0b3JlX2VyYXNlX2Z1bmMsICZlZml2YXJfc3lzZnNfbGlzdCwgJmVkYXRhLCAmZW50cnkpOwogCiAJaWYgKGZvdW5kICYmICFlbnRyeS0+c2Nhbm5pbmcpIHsKQEAgLTM2Miw3ICszODAsNyBAQAogc3RhdGljIHN0cnVjdCBwc3RvcmVfaW5mbyBlZmlfcHN0b3JlX2luZm8gPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5uYW1lCQk9ICJlZmkiLAotCS5mbGFncwkJPSBQU1RPUkVfRkxBR1NfRlJBR0lMRSwKKwkuZmxhZ3MJCT0gUFNUT1JFX0ZMQUdTX0RNRVNHLAogCS5vcGVuCQk9IGVmaV9wc3RvcmVfb3BlbiwKIAkuY2xvc2UJCT0gZWZpX3BzdG9yZV9jbG9zZSwKIAkucmVhZAkJPSBlZmlfcHN0b3JlX3JlYWQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9lZmkuYyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL2VmaS5jCmluZGV4IDVhMjYzMWEuLjFhYzE5OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL2VmaS5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL2VmaS5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC91Y3MyX3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAKICNpbmNsdWRlIDxhc20vZWFybHlfaW9yZW1hcC5oPgogCkBAIC0zNDcsNTYgKzM0OCwzMSBAQAogCiAvKgogICogRmluZCB0aGUgZWZpIG1lbW9yeSBkZXNjcmlwdG9yIGZvciBhIGdpdmVuIHBoeXNpY2FsIGFkZHJlc3MuICBHaXZlbiBhCi0gKiBwaHlzaWNhbGwgYWRkcmVzcywgZGV0ZXJtaW5lIGlmIGl0IGV4aXN0cyB3aXRoaW4gYW4gRUZJIE1lbW9yeSBNYXAgZW50cnksCisgKiBwaHlzaWNhbCBhZGRyZXNzLCBkZXRlcm1pbmUgaWYgaXQgZXhpc3RzIHdpdGhpbiBhbiBFRkkgTWVtb3J5IE1hcCBlbnRyeSwKICAqIGFuZCBpZiBzbywgcG9wdWxhdGUgdGhlIHN1cHBsaWVkIG1lbW9yeSBkZXNjcmlwdG9yIHdpdGggdGhlIGFwcHJvcHJpYXRlCiAgKiBkYXRhLgogICovCiBpbnQgX19pbml0IGVmaV9tZW1fZGVzY19sb29rdXAodTY0IHBoeXNfYWRkciwgZWZpX21lbW9yeV9kZXNjX3QgKm91dF9tZCkKIHsKLQlzdHJ1Y3QgZWZpX21lbW9yeV9tYXAgKm1hcCA9ICZlZmkubWVtbWFwOwotCXBoeXNfYWRkcl90IHAsIGU7CisJZWZpX21lbW9yeV9kZXNjX3QgKm1kOwogCiAJaWYgKCFlZmlfZW5hYmxlZChFRklfTUVNTUFQKSkgewogCQlwcl9lcnJfb25jZSgiRUZJX01FTU1BUCBpcyBub3QgZW5hYmxlZC5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoIW1hcCkgewotCQlwcl9lcnJfb25jZSgiZWZpLm1lbW1hcCBpcyBub3Qgc2V0LlxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KIAlpZiAoIW91dF9tZCkgewogCQlwcl9lcnJfb25jZSgib3V0X21kIGlzIG51bGwuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KLQlpZiAoV0FSTl9PTl9PTkNFKCFtYXAtPnBoeXNfbWFwKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKFdBUk5fT05fT05DRShtYXAtPm5yX21hcCA9PSAwKSB8fCBXQVJOX09OX09OQ0UobWFwLT5kZXNjX3NpemUgPT0gMCkpCi0JCXJldHVybiAtRUlOVkFMOwogCi0JZSA9IG1hcC0+cGh5c19tYXAgKyBtYXAtPm5yX21hcCAqIG1hcC0+ZGVzY19zaXplOwotCWZvciAocCA9IG1hcC0+cGh5c19tYXA7IHAgPCBlOyBwICs9IG1hcC0+ZGVzY19zaXplKSB7Ci0JCWVmaV9tZW1vcnlfZGVzY190ICptZDsKKwlmb3JfZWFjaF9lZmlfbWVtb3J5X2Rlc2MobWQpIHsKIAkJdTY0IHNpemU7CiAJCXU2NCBlbmQ7CiAKLQkJLyoKLQkJICogSWYgYSBkcml2ZXIgY2FsbHMgdGhpcyBhZnRlciBlZmlfZnJlZV9ib290X3NlcnZpY2VzLAotCQkgKiAtPm1hcCB3aWxsIGJlIE5VTEwsIGFuZCB0aGUgdGFyZ2V0IG1heSBhbHNvIG5vdCBiZSBtYXBwZWQuCi0JCSAqIFNvIGp1c3QgYWx3YXlzIGdldCBvdXIgb3duIHZpcnR1YWwgbWFwIG9uIHRoZSBDUFUuCi0JCSAqCi0JCSAqLwotCQltZCA9IGVhcmx5X21lbXJlbWFwKHAsIHNpemVvZiAoKm1kKSk7Ci0JCWlmICghbWQpIHsKLQkJCXByX2Vycl9vbmNlKCJlYXJseV9tZW1yZW1hcCglcGEsICV6dSkgZmFpbGVkLlxuIiwKLQkJCQkgICAgJnAsIHNpemVvZiAoKm1kKSk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCiAJCWlmICghKG1kLT5hdHRyaWJ1dGUgJiBFRklfTUVNT1JZX1JVTlRJTUUpICYmCiAJCSAgICBtZC0+dHlwZSAhPSBFRklfQk9PVF9TRVJWSUNFU19EQVRBICYmCiAJCSAgICBtZC0+dHlwZSAhPSBFRklfUlVOVElNRV9TRVJWSUNFU19EQVRBKSB7Ci0JCQllYXJseV9tZW11bm1hcChtZCwgc2l6ZW9mICgqbWQpKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTQwNCwxMSArMzgwLDggQEAKIAkJZW5kID0gbWQtPnBoeXNfYWRkciArIHNpemU7CiAJCWlmIChwaHlzX2FkZHIgPj0gbWQtPnBoeXNfYWRkciAmJiBwaHlzX2FkZHIgPCBlbmQpIHsKIAkJCW1lbWNweShvdXRfbWQsIG1kLCBzaXplb2YoKm91dF9tZCkpOwotCQkJZWFybHlfbWVtdW5tYXAobWQsIHNpemVvZiAoKm1kKSk7CiAJCQlyZXR1cm4gMDsKIAkJfQotCi0JCWVhcmx5X21lbXVubWFwKG1kLCBzaXplb2YgKCptZCkpOwogCX0KIAlwcl9lcnJfb25jZSgicmVxdWVzdGVkIG1hcCBub3QgZm91bmQuXG4iKTsKIAlyZXR1cm4gLUVOT0VOVDsKQEAgLTQyNCw2ICszOTcsMzUgQEAKIAlyZXR1cm4gZW5kOwogfQogCit2b2lkIF9faW5pdCBfX3dlYWsgZWZpX2FyY2hfbWVtX3Jlc2VydmUocGh5c19hZGRyX3QgYWRkciwgdTY0IHNpemUpIHt9CisKKy8qKgorICogZWZpX21lbV9yZXNlcnZlIC0gUmVzZXJ2ZSBhbiBFRkkgbWVtb3J5IHJlZ2lvbgorICogQGFkZHI6IFBoeXNpY2FsIGFkZHJlc3MgdG8gcmVzZXJ2ZQorICogQHNpemU6IFNpemUgb2YgcmVzZXJ2YXRpb24KKyAqCisgKiBNYXJrIGEgcmVnaW9uIGFzIHJlc2VydmVkIGZyb20gZ2VuZXJhbCBrZXJuZWwgYWxsb2NhdGlvbiBhbmQKKyAqIHByZXZlbnQgaXQgYmVpbmcgcmVsZWFzZWQgYnkgZWZpX2ZyZWVfYm9vdF9zZXJ2aWNlcygpLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBkcml2ZXJzIG9uY2UgdGhleSd2ZSBwYXJzZWQgRUZJCisgKiBjb25maWd1cmF0aW9uIHRhYmxlcyB0byBmaWd1cmUgb3V0IHdoZXJlIHRoZWlyIGRhdGEgbGl2ZXMsIGUuZy4KKyAqIGVmaV9lc3J0X2luaXQoKS4KKyAqLwordm9pZCBfX2luaXQgZWZpX21lbV9yZXNlcnZlKHBoeXNfYWRkcl90IGFkZHIsIHU2NCBzaXplKQoreworCWlmICghbWVtYmxvY2tfaXNfcmVnaW9uX3Jlc2VydmVkKGFkZHIsIHNpemUpKQorCQltZW1ibG9ja19yZXNlcnZlKGFkZHIsIHNpemUpOworCisJLyoKKwkgKiBTb21lIGFyY2hpdGVjdHVyZXMgKHg4NikgcmVzZXJ2ZSBhbGwgYm9vdCBzZXJ2aWNlcyByYW5nZXMKKwkgKiB1bnRpbCBlZmlfZnJlZV9ib290X3NlcnZpY2VzKCkgYmVjYXVzZSBvZiBidWdneSBmaXJtd2FyZQorCSAqIGltcGxlbWVudGF0aW9ucy4gVGhpcyBtZWFucyB0aGUgYWJvdmUgbWVtYmxvY2tfcmVzZXJ2ZSgpIGlzCisJICogc3VwZXJmbHVvdXMgb24geDg2IGFuZCBpbnN0ZWFkIHdoYXQgaXQgbmVlZHMgdG8gZG8gaXMKKwkgKiBlbnN1cmUgdGhlIEBzdGFydCwgQHNpemUgaXMgbm90IGZyZWVkLgorCSAqLworCWVmaV9hcmNoX21lbV9yZXNlcnZlKGFkZHIsIHNpemUpOworfQorCiBzdGF0aWMgX19pbml0ZGF0YSBlZmlfY29uZmlnX3RhYmxlX3R5cGVfdCBjb21tb25fdGFibGVzW10gPSB7CiAJe0FDUElfMjBfVEFCTEVfR1VJRCwgIkFDUEkgMi4wIiwgJmVmaS5hY3BpMjB9LAogCXtBQ1BJX1RBQkxFX0dVSUQsICJBQ1BJIiwgJmVmaS5hY3BpfSwKQEAgLTY1Nyw5ICs2NTksMTIgQEAKIAkJfQogCiAJCWlmIChzdWJub2RlKSB7Ci0JCQlub2RlID0gb2ZfZ2V0X2ZsYXRfZHRfc3Vibm9kZV9ieV9uYW1lKG5vZGUsIHN1Ym5vZGUpOwotCQkJaWYgKG5vZGUgPCAwKQorCQkJaW50IGVyciA9IG9mX2dldF9mbGF0X2R0X3N1Ym5vZGVfYnlfbmFtZShub2RlLCBzdWJub2RlKTsKKworCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIDA7CisKKwkJCW5vZGUgPSBlcnI7CiAJCX0KIAogCQlyZXR1cm4gX19maW5kX3VlZmlfcGFyYW1zKG5vZGUsIGluZm8sIGR0X3BhcmFtc1tpXS5wYXJhbXMpOwpAQCAtODA4LDYgKzgxMyw5IEBACiAJY2FzZSBFRklfTk9UX0ZPVU5EOgogCQllcnIgPSAtRU5PRU5UOwogCQlicmVhazsKKwljYXNlIEVGSV9BQk9SVEVEOgorCQllcnIgPSAtRUlOVFI7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWVyciA9IC1FSU5WQUw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZmkvZWZpdmFycy5jIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvZWZpdmFycy5jCmluZGV4IDExNmIyNDQuLjNlNjI2ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL2VmaXZhcnMuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9lZml2YXJzLmMKQEAgLTUxMCw3ICs1MTAsOCBAQAogCQl2ZW5kb3IgPSBkZWxfdmFyLT5WZW5kb3JHdWlkOwogCX0KIAotCWVmaXZhcl9lbnRyeV9pdGVyX2JlZ2luKCk7CisJaWYgKGVmaXZhcl9lbnRyeV9pdGVyX2JlZ2luKCkpCisJCXJldHVybiAtRUlOVFI7CiAJZW50cnkgPSBlZml2YXJfZW50cnlfZmluZChuYW1lLCB2ZW5kb3IsICZlZml2YXJfc3lzZnNfbGlzdCwgdHJ1ZSk7CiAJaWYgKCFlbnRyeSkKIAkJZXJyID0gLUVJTlZBTDsKQEAgLTU3NSw3ICs1NzYsMTAgQEAKIAkJcmV0dXJuIHJldDsKIAogCWtvYmplY3RfdWV2ZW50KCZuZXdfdmFyLT5rb2JqLCBLT0JKX0FERCk7Ci0JZWZpdmFyX2VudHJ5X2FkZChuZXdfdmFyLCAmZWZpdmFyX3N5c2ZzX2xpc3QpOworCWlmIChlZml2YXJfZW50cnlfYWRkKG5ld192YXIsICZlZml2YXJfc3lzZnNfbGlzdCkpIHsKKwkJZWZpdmFyX3VucmVnaXN0ZXIobmV3X3Zhcik7CisJCXJldHVybiAtRUlOVFI7CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC02OTAsNyArNjk0LDEwIEBACiAKIHN0YXRpYyBpbnQgZWZpdmFyX3N5c2ZzX2Rlc3Ryb3koc3RydWN0IGVmaXZhcl9lbnRyeSAqZW50cnksIHZvaWQgKmRhdGEpCiB7Ci0JZWZpdmFyX2VudHJ5X3JlbW92ZShlbnRyeSk7CisJaW50IGVyciA9IGVmaXZhcl9lbnRyeV9yZW1vdmUoZW50cnkpOworCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAllZml2YXJfdW5yZWdpc3RlcihlbnRyeSk7CiAJcmV0dXJuIDA7CiB9CkBAIC02OTgsNyArNzA1LDE0IEBACiBzdGF0aWMgdm9pZCBlZml2YXJzX3N5c2ZzX2V4aXQodm9pZCkKIHsKIAkvKiBSZW1vdmUgYWxsIGVudHJpZXMgYW5kIGRlc3Ryb3kgKi8KLQlfX2VmaXZhcl9lbnRyeV9pdGVyKGVmaXZhcl9zeXNmc19kZXN0cm95LCAmZWZpdmFyX3N5c2ZzX2xpc3QsIE5VTEwsIE5VTEwpOworCWludCBlcnI7CisKKwllcnIgPSBfX2VmaXZhcl9lbnRyeV9pdGVyKGVmaXZhcl9zeXNmc19kZXN0cm95LCAmZWZpdmFyX3N5c2ZzX2xpc3QsCisJCQkJICBOVUxMLCBOVUxMKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiZWZpdmFyczogRmFpbGVkIHRvIGRlc3Ryb3kgc3lzZnMgZW50cmllc1xuIik7CisJCXJldHVybjsKKwl9CiAKIAlpZiAoZWZpdmFyc19uZXdfdmFyKQogCQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmVmaXZhcnNfa3NldC0+a29iaiwgZWZpdmFyc19uZXdfdmFyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL2VzcnQuYyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL2VzcnQuYwppbmRleCA3NWZlYjNmLi4xNDkxNDA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9lc3J0LmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvZXNydC5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZWZpLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KQEAgLTIzNSw3ICsyMzYsNyBAQAogfTsKIAogLyoKLSAqIHJlbWFwIHRoZSB0YWJsZSwgY29weSBpdCB0byBrbWFsbG9jZWQgcGFnZXMsIGFuZCB1bm1hcCBpdC4KKyAqIHJlbWFwIHRoZSB0YWJsZSwgdmFsaWRhdGUgaXQsIG1hcmsgaXQgcmVzZXJ2ZWQgYW5kIHVubWFwIGl0LgogICovCiB2b2lkIF9faW5pdCBlZmlfZXNydF9pbml0KHZvaWQpCiB7CkBAIC0zMzUsNyArMzM2LDcgQEAKIAogCWVuZCA9IGVzcnRfZGF0YSArIHNpemU7CiAJcHJfaW5mbygiUmVzZXJ2aW5nIEVTUlQgc3BhY2UgZnJvbSAlcGEgdG8gJXBhLlxuIiwgJmVzcnRfZGF0YSwgJmVuZCk7Ci0JbWVtYmxvY2tfcmVzZXJ2ZShlc3J0X2RhdGEsIGVzcnRfZGF0YV9zaXplKTsKKwllZmlfbWVtX3Jlc2VydmUoZXNydF9kYXRhLCBlc3J0X2RhdGFfc2l6ZSk7CiAKIAlwcl9kZWJ1ZygiZXNydC1pbml0OiBsb2FkZWQuXG4iKTsKIGVycl9tZW11bm1hcDoKQEAgLTM4MiwyOCArMzgzLDE4IEBACiBzdGF0aWMgaW50IF9faW5pdCBlc3J0X3N5c2ZzX2luaXQodm9pZCkKIHsKIAlpbnQgZXJyb3I7Ci0Jc3RydWN0IGVmaV9zeXN0ZW1fcmVzb3VyY2VfdGFibGUgX19pb21lbSAqaW9lc3J0OwogCiAJcHJfZGVidWcoImVzcnQtc3lzZnM6IGxvYWRpbmcuXG4iKTsKIAlpZiAoIWVzcnRfZGF0YSB8fCAhZXNydF9kYXRhX3NpemUpCiAJCXJldHVybiAtRU5PU1lTOwogCi0JaW9lc3J0ID0gaW9yZW1hcChlc3J0X2RhdGEsIGVzcnRfZGF0YV9zaXplKTsKLQlpZiAoIWlvZXNydCkgewotCQlwcl9lcnIoImlvcmVtYXAoJXBhLCAlenUpIGZhaWxlZC5cbiIsICZlc3J0X2RhdGEsCisJZXNydCA9IG1lbXJlbWFwKGVzcnRfZGF0YSwgZXNydF9kYXRhX3NpemUsIE1FTVJFTUFQX1dCKTsKKwlpZiAoIWVzcnQpIHsKKwkJcHJfZXJyKCJtZW1yZW1hcCglcGEsICV6dSkgZmFpbGVkLlxuIiwgJmVzcnRfZGF0YSwKIAkJICAgICAgIGVzcnRfZGF0YV9zaXplKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JZXNydCA9IGttYWxsb2MoZXNydF9kYXRhX3NpemUsIEdGUF9LRVJORUwpOwotCWlmICghZXNydCkgewotCQlwcl9lcnIoImttYWxsb2MgZmFpbGVkLiAod2FudGVkICV6dSBieXRlcylcbiIsIGVzcnRfZGF0YV9zaXplKTsKLQkJaW91bm1hcChpb2VzcnQpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQltZW1jcHlfZnJvbWlvKGVzcnQsIGlvZXNydCwgZXNydF9kYXRhX3NpemUpOwotCiAJZXNydF9rb2JqID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZCgiZXNydCIsIGVmaV9rb2JqKTsKIAlpZiAoIWVzcnRfa29iaikgewogCQlwcl9lcnIoIkZpcm13YXJlIHRhYmxlIHJlZ2lzdHJhdGlvbiBmYWlsZWQuXG4iKTsKQEAgLTQyOSw4ICs0MjAsNiBAQAogCWlmIChlcnJvcikKIAkJZ290byBlcnJfY2xlYW51cF9saXN0OwogCi0JbWVtYmxvY2tfcmVtb3ZlKGVzcnRfZGF0YSwgZXNydF9kYXRhX3NpemUpOwotCiAJcHJfZGVidWcoImVzcnQtc3lzZnM6IGxvYWRlZC5cbiIpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9mYWtlX21lbS5jIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvZmFrZV9tZW0uYwppbmRleCA0ODQzMGFiLi41MjBhNDBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9mYWtlX21lbS5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL2Zha2VfbWVtLmMKQEAgLTM1LDE3ICszNSwxMyBAQAogCiAjZGVmaW5lIEVGSV9NQVhfRkFLRU1FTSBDT05GSUdfRUZJX01BWF9GQUtFX01FTQogCi1zdHJ1Y3QgZmFrZV9tZW0gewotCXN0cnVjdCByYW5nZSByYW5nZTsKLQl1NjQgYXR0cmlidXRlOwotfTsKLXN0YXRpYyBzdHJ1Y3QgZmFrZV9tZW0gZmFrZV9tZW1zW0VGSV9NQVhfRkFLRU1FTV07CitzdGF0aWMgc3RydWN0IGVmaV9tZW1fcmFuZ2UgZmFrZV9tZW1zW0VGSV9NQVhfRkFLRU1FTV07CiBzdGF0aWMgaW50IG5yX2Zha2VfbWVtOwogCiBzdGF0aWMgaW50IF9faW5pdCBjbXBfZmFrZV9tZW0oY29uc3Qgdm9pZCAqeDEsIGNvbnN0IHZvaWQgKngyKQogewotCWNvbnN0IHN0cnVjdCBmYWtlX21lbSAqbTEgPSB4MTsKLQljb25zdCBzdHJ1Y3QgZmFrZV9tZW0gKm0yID0geDI7CisJY29uc3Qgc3RydWN0IGVmaV9tZW1fcmFuZ2UgKm0xID0geDE7CisJY29uc3Qgc3RydWN0IGVmaV9tZW1fcmFuZ2UgKm0yID0geDI7CiAKIAlpZiAobTEtPnJhbmdlLnN0YXJ0IDwgbTItPnJhbmdlLnN0YXJ0KQogCQlyZXR1cm4gLTE7CkBAIC01Niw0MCArNTIsMjEgQEAKIAogdm9pZCBfX2luaXQgZWZpX2Zha2VfbWVtbWFwKHZvaWQpCiB7Ci0JdTY0IHN0YXJ0LCBlbmQsIG1fc3RhcnQsIG1fZW5kLCBtX2F0dHI7CiAJaW50IG5ld19ucl9tYXAgPSBlZmkubWVtbWFwLm5yX21hcDsKIAllZmlfbWVtb3J5X2Rlc2NfdCAqbWQ7CiAJcGh5c19hZGRyX3QgbmV3X21lbW1hcF9waHk7CiAJdm9pZCAqbmV3X21lbW1hcDsKLQl2b2lkICpvbGQsICpuZXc7CiAJaW50IGk7CiAKLQlpZiAoIW5yX2Zha2VfbWVtIHx8ICFlZmlfZW5hYmxlZChFRklfTUVNTUFQKSkKKwlpZiAoIW5yX2Zha2VfbWVtKQogCQlyZXR1cm47CiAKIAkvKiBjb3VudCB1cCB0aGUgbnVtYmVyIG9mIEVGSSBtZW1vcnkgZGVzY3JpcHRvciAqLwotCWZvcl9lYWNoX2VmaV9tZW1vcnlfZGVzYyhtZCkgewotCQlzdGFydCA9IG1kLT5waHlzX2FkZHI7Ci0JCWVuZCA9IHN0YXJ0ICsgKG1kLT5udW1fcGFnZXMgPDwgRUZJX1BBR0VfU0hJRlQpIC0gMTsKKwlmb3IgKGkgPSAwOyBpIDwgbnJfZmFrZV9tZW07IGkrKykgeworCQlmb3JfZWFjaF9lZmlfbWVtb3J5X2Rlc2MobWQpIHsKKwkJCXN0cnVjdCByYW5nZSAqciA9ICZmYWtlX21lbXNbaV0ucmFuZ2U7CiAKLQkJZm9yIChpID0gMDsgaSA8IG5yX2Zha2VfbWVtOyBpKyspIHsKLQkJCS8qIG1vZGlmeWluZyByYW5nZSAqLwotCQkJbV9zdGFydCA9IGZha2VfbWVtc1tpXS5yYW5nZS5zdGFydDsKLQkJCW1fZW5kID0gZmFrZV9tZW1zW2ldLnJhbmdlLmVuZDsKLQotCQkJaWYgKG1fc3RhcnQgPD0gc3RhcnQpIHsKLQkJCQkvKiBzcGxpdCBpbnRvIDIgcGFydHMgKi8KLQkJCQlpZiAoc3RhcnQgPCBtX2VuZCAmJiBtX2VuZCA8IGVuZCkKLQkJCQkJbmV3X25yX21hcCsrOwotCQkJfQotCQkJaWYgKHN0YXJ0IDwgbV9zdGFydCAmJiBtX3N0YXJ0IDwgZW5kKSB7Ci0JCQkJLyogc3BsaXQgaW50byAzIHBhcnRzICovCi0JCQkJaWYgKG1fZW5kIDwgZW5kKQotCQkJCQluZXdfbnJfbWFwICs9IDI7Ci0JCQkJLyogc3BsaXQgaW50byAyIHBhcnRzICovCi0JCQkJaWYgKGVuZCA8PSBtX2VuZCkKLQkJCQkJbmV3X25yX21hcCsrOwotCQkJfQorCQkJbmV3X25yX21hcCArPSBlZmlfbWVtbWFwX3NwbGl0X2NvdW50KG1kLCByKTsKIAkJfQogCX0KIApAQCAtMTA3LDg1ICs4NCwxMyBAQAogCQlyZXR1cm47CiAJfQogCi0JZm9yIChvbGQgPSBlZmkubWVtbWFwLm1hcCwgbmV3ID0gbmV3X21lbW1hcDsKLQkgICAgIG9sZCA8IGVmaS5tZW1tYXAubWFwX2VuZDsKLQkgICAgIG9sZCArPSBlZmkubWVtbWFwLmRlc2Nfc2l6ZSwgbmV3ICs9IGVmaS5tZW1tYXAuZGVzY19zaXplKSB7Ci0KLQkJLyogY29weSBvcmlnaW5hbCBFRkkgbWVtb3J5IGRlc2NyaXB0b3IgKi8KLQkJbWVtY3B5KG5ldywgb2xkLCBlZmkubWVtbWFwLmRlc2Nfc2l6ZSk7Ci0JCW1kID0gbmV3OwotCQlzdGFydCA9IG1kLT5waHlzX2FkZHI7Ci0JCWVuZCA9IG1kLT5waHlzX2FkZHIgKyAobWQtPm51bV9wYWdlcyA8PCBFRklfUEFHRV9TSElGVCkgLSAxOwotCi0JCWZvciAoaSA9IDA7IGkgPCBucl9mYWtlX21lbTsgaSsrKSB7Ci0JCQkvKiBtb2RpZnlpbmcgcmFuZ2UgKi8KLQkJCW1fc3RhcnQgPSBmYWtlX21lbXNbaV0ucmFuZ2Uuc3RhcnQ7Ci0JCQltX2VuZCA9IGZha2VfbWVtc1tpXS5yYW5nZS5lbmQ7Ci0JCQltX2F0dHIgPSBmYWtlX21lbXNbaV0uYXR0cmlidXRlOwotCi0JCQlpZiAobV9zdGFydCA8PSBzdGFydCAmJiBlbmQgPD0gbV9lbmQpCi0JCQkJbWQtPmF0dHJpYnV0ZSB8PSBtX2F0dHI7Ci0KLQkJCWlmIChtX3N0YXJ0IDw9IHN0YXJ0ICYmCi0JCQkgICAgKHN0YXJ0IDwgbV9lbmQgJiYgbV9lbmQgPCBlbmQpKSB7Ci0JCQkJLyogZmlyc3QgcGFydCAqLwotCQkJCW1kLT5hdHRyaWJ1dGUgfD0gbV9hdHRyOwotCQkJCW1kLT5udW1fcGFnZXMgPSAobV9lbmQgLSBtZC0+cGh5c19hZGRyICsgMSkgPj4KLQkJCQkJRUZJX1BBR0VfU0hJRlQ7Ci0JCQkJLyogbGF0dGVyIHBhcnQgKi8KLQkJCQluZXcgKz0gZWZpLm1lbW1hcC5kZXNjX3NpemU7Ci0JCQkJbWVtY3B5KG5ldywgb2xkLCBlZmkubWVtbWFwLmRlc2Nfc2l6ZSk7Ci0JCQkJbWQgPSBuZXc7Ci0JCQkJbWQtPnBoeXNfYWRkciA9IG1fZW5kICsgMTsKLQkJCQltZC0+bnVtX3BhZ2VzID0gKGVuZCAtIG1kLT5waHlzX2FkZHIgKyAxKSA+PgotCQkJCQlFRklfUEFHRV9TSElGVDsKLQkJCX0KLQotCQkJaWYgKChzdGFydCA8IG1fc3RhcnQgJiYgbV9zdGFydCA8IGVuZCkgJiYgbV9lbmQgPCBlbmQpIHsKLQkJCQkvKiBmaXJzdCBwYXJ0ICovCi0JCQkJbWQtPm51bV9wYWdlcyA9IChtX3N0YXJ0IC0gbWQtPnBoeXNfYWRkcikgPj4KLQkJCQkJRUZJX1BBR0VfU0hJRlQ7Ci0JCQkJLyogbWlkZGxlIHBhcnQgKi8KLQkJCQluZXcgKz0gZWZpLm1lbW1hcC5kZXNjX3NpemU7Ci0JCQkJbWVtY3B5KG5ldywgb2xkLCBlZmkubWVtbWFwLmRlc2Nfc2l6ZSk7Ci0JCQkJbWQgPSBuZXc7Ci0JCQkJbWQtPmF0dHJpYnV0ZSB8PSBtX2F0dHI7Ci0JCQkJbWQtPnBoeXNfYWRkciA9IG1fc3RhcnQ7Ci0JCQkJbWQtPm51bV9wYWdlcyA9IChtX2VuZCAtIG1fc3RhcnQgKyAxKSA+PgotCQkJCQlFRklfUEFHRV9TSElGVDsKLQkJCQkvKiBsYXN0IHBhcnQgKi8KLQkJCQluZXcgKz0gZWZpLm1lbW1hcC5kZXNjX3NpemU7Ci0JCQkJbWVtY3B5KG5ldywgb2xkLCBlZmkubWVtbWFwLmRlc2Nfc2l6ZSk7Ci0JCQkJbWQgPSBuZXc7Ci0JCQkJbWQtPnBoeXNfYWRkciA9IG1fZW5kICsgMTsKLQkJCQltZC0+bnVtX3BhZ2VzID0gKGVuZCAtIG1fZW5kKSA+PgotCQkJCQlFRklfUEFHRV9TSElGVDsKLQkJCX0KLQotCQkJaWYgKChzdGFydCA8IG1fc3RhcnQgJiYgbV9zdGFydCA8IGVuZCkgJiYKLQkJCSAgICAoZW5kIDw9IG1fZW5kKSkgewotCQkJCS8qIGZpcnN0IHBhcnQgKi8KLQkJCQltZC0+bnVtX3BhZ2VzID0gKG1fc3RhcnQgLSBtZC0+cGh5c19hZGRyKSA+PgotCQkJCQlFRklfUEFHRV9TSElGVDsKLQkJCQkvKiBsYXR0ZXIgcGFydCAqLwotCQkJCW5ldyArPSBlZmkubWVtbWFwLmRlc2Nfc2l6ZTsKLQkJCQltZW1jcHkobmV3LCBvbGQsIGVmaS5tZW1tYXAuZGVzY19zaXplKTsKLQkJCQltZCA9IG5ldzsKLQkJCQltZC0+cGh5c19hZGRyID0gbV9zdGFydDsKLQkJCQltZC0+bnVtX3BhZ2VzID0gKGVuZCAtIG1kLT5waHlzX2FkZHIgKyAxKSA+PgotCQkJCQlFRklfUEFHRV9TSElGVDsKLQkJCQltZC0+YXR0cmlidXRlIHw9IG1fYXR0cjsKLQkJCX0KLQkJfQotCX0KKwlmb3IgKGkgPSAwOyBpIDwgbnJfZmFrZV9tZW07IGkrKykKKwkJZWZpX21lbW1hcF9pbnNlcnQoJmVmaS5tZW1tYXAsIG5ld19tZW1tYXAsICZmYWtlX21lbXNbaV0pOwogCiAJLyogc3dhcCBpbnRvIG5ldyBFRkkgbWVtbWFwICovCi0JZWZpX3VubWFwX21lbW1hcCgpOwotCWVmaS5tZW1tYXAubWFwID0gbmV3X21lbW1hcDsKLQllZmkubWVtbWFwLnBoeXNfbWFwID0gbmV3X21lbW1hcF9waHk7Ci0JZWZpLm1lbW1hcC5ucl9tYXAgPSBuZXdfbnJfbWFwOwotCWVmaS5tZW1tYXAubWFwX2VuZCA9IGVmaS5tZW1tYXAubWFwICsgZWZpLm1lbW1hcC5ucl9tYXAgKiBlZmkubWVtbWFwLmRlc2Nfc2l6ZTsKLQlzZXRfYml0KEVGSV9NRU1NQVAsICZlZmkuZmxhZ3MpOworCWVhcmx5X21lbXVubWFwKG5ld19tZW1tYXAsIGVmaS5tZW1tYXAuZGVzY19zaXplICogbmV3X25yX21hcCk7CisKKwllZmlfbWVtbWFwX2luc3RhbGwobmV3X21lbW1hcF9waHksIG5ld19ucl9tYXApOwogCiAJLyogcHJpbnQgbmV3IEVGSSBtZW1tYXAgKi8KIAllZmlfcHJpbnRfbWVtbWFwKCk7CkBAIC0yMjMsNyArMTI4LDcgQEAKIAkJCXArKzsKIAl9CiAKLQlzb3J0KGZha2VfbWVtcywgbnJfZmFrZV9tZW0sIHNpemVvZihzdHJ1Y3QgZmFrZV9tZW0pLAorCXNvcnQoZmFrZV9tZW1zLCBucl9mYWtlX21lbSwgc2l6ZW9mKHN0cnVjdCBlZmlfbWVtX3JhbmdlKSwKIAkgICAgIGNtcF9mYWtlX21lbSwgTlVMTCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnJfZmFrZV9tZW07IGkrKykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL2xpYnN0dWIvZWZpLXN0dWItaGVscGVyLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9saWJzdHViL2VmaS1zdHViLWhlbHBlci5jCmluZGV4IDNiZDEyN2Y5Li5hZGVkMTA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9saWJzdHViL2VmaS1zdHViLWhlbHBlci5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL2xpYnN0dWIvZWZpLXN0dWItaGVscGVyLmMKQEAgLTQxLDYgKzQxLDggQEAKICNkZWZpbmUgRUZJX0FMTE9DX0FMSUdOCQlFRklfUEFHRV9TSVpFCiAjZW5kaWYKIAorI2RlZmluZSBFRklfTU1BUF9OUl9TTEFDS19TTE9UUwk4CisKIHN0cnVjdCBmaWxlX2luZm8gewogCWVmaV9maWxlX2hhbmRsZV90ICpoYW5kbGU7CiAJdTY0IHNpemU7CkBAIC02Myw0OSArNjUsNjIgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBtbWFwX2hhc19oZWFkcm9vbSh1bnNpZ25lZCBsb25nIGJ1ZmZfc2l6ZSwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgbWFwX3NpemUsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIGRlc2Nfc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHNsYWNrID0gYnVmZl9zaXplIC0gbWFwX3NpemU7CisKKwlyZXR1cm4gc2xhY2sgLyBkZXNjX3NpemUgPj0gRUZJX01NQVBfTlJfU0xBQ0tfU0xPVFM7Cit9CisKIGVmaV9zdGF0dXNfdCBlZmlfZ2V0X21lbW9yeV9tYXAoZWZpX3N5c3RlbV90YWJsZV90ICpzeXNfdGFibGVfYXJnLAotCQkJCWVmaV9tZW1vcnlfZGVzY190ICoqbWFwLAotCQkJCXVuc2lnbmVkIGxvbmcgKm1hcF9zaXplLAotCQkJCXVuc2lnbmVkIGxvbmcgKmRlc2Nfc2l6ZSwKLQkJCQl1MzIgKmRlc2NfdmVyLAotCQkJCXVuc2lnbmVkIGxvbmcgKmtleV9wdHIpCisJCQkJc3RydWN0IGVmaV9ib290X21lbW1hcCAqbWFwKQogewogCWVmaV9tZW1vcnlfZGVzY190ICptID0gTlVMTDsKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwogCXVuc2lnbmVkIGxvbmcga2V5OwogCXUzMiBkZXNjX3ZlcnNpb247CiAKLQkqbWFwX3NpemUgPSBzaXplb2YoKm0pICogMzI7CisJKm1hcC0+ZGVzY19zaXplID0Jc2l6ZW9mKCptKTsKKwkqbWFwLT5tYXBfc2l6ZSA9CSptYXAtPmRlc2Nfc2l6ZSAqIDMyOworCSptYXAtPmJ1ZmZfc2l6ZSA9CSptYXAtPm1hcF9zaXplOwogYWdhaW46Ci0JLyoKLQkgKiBBZGQgYW4gYWRkaXRpb25hbCBlZmlfbWVtb3J5X2Rlc2NfdCBiZWNhdXNlIHdlJ3JlIGRvaW5nIGFuCi0JICogYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgaW4gYSBuZXcgZGVzY3JpcHRvciByZWdpb24uCi0JICovCi0JKm1hcF9zaXplICs9IHNpemVvZigqbSk7CiAJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkoYWxsb2NhdGVfcG9vbCwgRUZJX0xPQURFUl9EQVRBLAotCQkJCSptYXBfc2l6ZSwgKHZvaWQgKiopJm0pOworCQkJCSptYXAtPm1hcF9zaXplLCAodm9pZCAqKikmbSk7CiAJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKIAkJZ290byBmYWlsOwogCi0JKmRlc2Nfc2l6ZSA9IDA7CisJKm1hcC0+ZGVzY19zaXplID0gMDsKIAlrZXkgPSAwOwotCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGdldF9tZW1vcnlfbWFwLCBtYXBfc2l6ZSwgbSwKLQkJCQkma2V5LCBkZXNjX3NpemUsICZkZXNjX3ZlcnNpb24pOwotCWlmIChzdGF0dXMgPT0gRUZJX0JVRkZFUl9UT09fU01BTEwpIHsKKwlzdGF0dXMgPSBlZmlfY2FsbF9lYXJseShnZXRfbWVtb3J5X21hcCwgbWFwLT5tYXBfc2l6ZSwgbSwKKwkJCQkma2V5LCBtYXAtPmRlc2Nfc2l6ZSwgJmRlc2NfdmVyc2lvbik7CisJaWYgKHN0YXR1cyA9PSBFRklfQlVGRkVSX1RPT19TTUFMTCB8fAorCSAgICAhbW1hcF9oYXNfaGVhZHJvb20oKm1hcC0+YnVmZl9zaXplLCAqbWFwLT5tYXBfc2l6ZSwKKwkJCSAgICAgICAqbWFwLT5kZXNjX3NpemUpKSB7CiAJCWVmaV9jYWxsX2Vhcmx5KGZyZWVfcG9vbCwgbSk7CisJCS8qCisJCSAqIE1ha2Ugc3VyZSB0aGVyZSBpcyBzb21lIGVudHJpZXMgb2YgaGVhZHJvb20gc28gdGhhdCB0aGUKKwkJICogYnVmZmVyIGNhbiBiZSByZXVzZWQgZm9yIGEgbmV3IG1hcCBhZnRlciBhbGxvY2F0aW9ucyBhcmUKKwkJICogbm8gbG9uZ2VyIHBlcm1pdHRlZC4gIEl0cyB1bmxpa2VseSB0aGF0IHRoZSBtYXAgd2lsbCBncm93IHRvCisJCSAqIGV4Y2VlZCB0aGlzIGhlYWRyb29tIG9uY2Ugd2UgYXJlIHJlYWR5IHRvIHRyaWdnZXIKKwkJICogRXhpdEJvb3RTZXJ2aWNlcygpCisJCSAqLworCQkqbWFwLT5tYXBfc2l6ZSArPSAqbWFwLT5kZXNjX3NpemUgKiBFRklfTU1BUF9OUl9TTEFDS19TTE9UUzsKKwkJKm1hcC0+YnVmZl9zaXplID0gKm1hcC0+bWFwX3NpemU7CiAJCWdvdG8gYWdhaW47CiAJfQogCiAJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKIAkJZWZpX2NhbGxfZWFybHkoZnJlZV9wb29sLCBtKTsKIAotCWlmIChrZXlfcHRyICYmIHN0YXR1cyA9PSBFRklfU1VDQ0VTUykKLQkJKmtleV9wdHIgPSBrZXk7Ci0JaWYgKGRlc2NfdmVyICYmIHN0YXR1cyA9PSBFRklfU1VDQ0VTUykKLQkJKmRlc2NfdmVyID0gZGVzY192ZXJzaW9uOworCWlmIChtYXAtPmtleV9wdHIgJiYgc3RhdHVzID09IEVGSV9TVUNDRVNTKQorCQkqbWFwLT5rZXlfcHRyID0ga2V5OworCWlmIChtYXAtPmRlc2NfdmVyICYmIHN0YXR1cyA9PSBFRklfU1VDQ0VTUykKKwkJKm1hcC0+ZGVzY192ZXIgPSBkZXNjX3ZlcnNpb247CiAKIGZhaWw6Ci0JKm1hcCA9IG07CisJKm1hcC0+bWFwID0gbTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xMTMsMTMgKzEyOCwyMCBAQAogdW5zaWduZWQgbG9uZyBnZXRfZHJhbV9iYXNlKGVmaV9zeXN0ZW1fdGFibGVfdCAqc3lzX3RhYmxlX2FyZykKIHsKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwotCXVuc2lnbmVkIGxvbmcgbWFwX3NpemU7CisJdW5zaWduZWQgbG9uZyBtYXBfc2l6ZSwgYnVmZl9zaXplOwogCXVuc2lnbmVkIGxvbmcgbWVtYmFzZSAgPSBFRklfRVJST1I7CiAJc3RydWN0IGVmaV9tZW1vcnlfbWFwIG1hcDsKIAllZmlfbWVtb3J5X2Rlc2NfdCAqbWQ7CisJc3RydWN0IGVmaV9ib290X21lbW1hcCBib290X21hcDsKIAotCXN0YXR1cyA9IGVmaV9nZXRfbWVtb3J5X21hcChzeXNfdGFibGVfYXJnLCAoZWZpX21lbW9yeV9kZXNjX3QgKiopJm1hcC5tYXAsCi0JCQkJICAgICZtYXBfc2l6ZSwgJm1hcC5kZXNjX3NpemUsIE5VTEwsIE5VTEwpOworCWJvb3RfbWFwLm1hcCA9CQkoZWZpX21lbW9yeV9kZXNjX3QgKiopJm1hcC5tYXA7CisJYm9vdF9tYXAubWFwX3NpemUgPQkmbWFwX3NpemU7CisJYm9vdF9tYXAuZGVzY19zaXplID0JJm1hcC5kZXNjX3NpemU7CisJYm9vdF9tYXAuZGVzY192ZXIgPQlOVUxMOworCWJvb3RfbWFwLmtleV9wdHIgPQlOVUxMOworCWJvb3RfbWFwLmJ1ZmZfc2l6ZSA9CSZidWZmX3NpemU7CisKKwlzdGF0dXMgPSBlZmlfZ2V0X21lbW9yeV9tYXAoc3lzX3RhYmxlX2FyZywgJmJvb3RfbWFwKTsKIAlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQogCQlyZXR1cm4gbWVtYmFzZTsKIApAQCAtMTQ0LDE1ICsxNjYsMjIgQEAKIAkJCSAgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgYWxpZ24sCiAJCQkgICAgdW5zaWduZWQgbG9uZyAqYWRkciwgdW5zaWduZWQgbG9uZyBtYXgpCiB7Ci0JdW5zaWduZWQgbG9uZyBtYXBfc2l6ZSwgZGVzY19zaXplOworCXVuc2lnbmVkIGxvbmcgbWFwX3NpemUsIGRlc2Nfc2l6ZSwgYnVmZl9zaXplOwogCWVmaV9tZW1vcnlfZGVzY190ICptYXA7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKIAl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOwogCXU2NCBtYXhfYWRkciA9IDA7CiAJaW50IGk7CisJc3RydWN0IGVmaV9ib290X21lbW1hcCBib290X21hcDsKIAotCXN0YXR1cyA9IGVmaV9nZXRfbWVtb3J5X21hcChzeXNfdGFibGVfYXJnLCAmbWFwLCAmbWFwX3NpemUsICZkZXNjX3NpemUsCi0JCQkJICAgIE5VTEwsIE5VTEwpOworCWJvb3RfbWFwLm1hcCA9CQkmbWFwOworCWJvb3RfbWFwLm1hcF9zaXplID0JJm1hcF9zaXplOworCWJvb3RfbWFwLmRlc2Nfc2l6ZSA9CSZkZXNjX3NpemU7CisJYm9vdF9tYXAuZGVzY192ZXIgPQlOVUxMOworCWJvb3RfbWFwLmtleV9wdHIgPQlOVUxMOworCWJvb3RfbWFwLmJ1ZmZfc2l6ZSA9CSZidWZmX3NpemU7CisKKwlzdGF0dXMgPSBlZmlfZ2V0X21lbW9yeV9tYXAoc3lzX3RhYmxlX2FyZywgJmJvb3RfbWFwKTsKIAlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQogCQlnb3RvIGZhaWw7CiAKQEAgLTIzMCwxNCArMjU5LDIxIEBACiAJCQkgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgYWxpZ24sCiAJCQkgICB1bnNpZ25lZCBsb25nICphZGRyKQogewotCXVuc2lnbmVkIGxvbmcgbWFwX3NpemUsIGRlc2Nfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIG1hcF9zaXplLCBkZXNjX3NpemUsIGJ1ZmZfc2l6ZTsKIAllZmlfbWVtb3J5X2Rlc2NfdCAqbWFwOwogCWVmaV9zdGF0dXNfdCBzdGF0dXM7CiAJdW5zaWduZWQgbG9uZyBucl9wYWdlczsKIAlpbnQgaTsKKwlzdHJ1Y3QgZWZpX2Jvb3RfbWVtbWFwIGJvb3RfbWFwOwogCi0Jc3RhdHVzID0gZWZpX2dldF9tZW1vcnlfbWFwKHN5c190YWJsZV9hcmcsICZtYXAsICZtYXBfc2l6ZSwgJmRlc2Nfc2l6ZSwKLQkJCQkgICAgTlVMTCwgTlVMTCk7CisJYm9vdF9tYXAubWFwID0JCSZtYXA7CisJYm9vdF9tYXAubWFwX3NpemUgPQkmbWFwX3NpemU7CisJYm9vdF9tYXAuZGVzY19zaXplID0JJmRlc2Nfc2l6ZTsKKwlib290X21hcC5kZXNjX3ZlciA9CU5VTEw7CisJYm9vdF9tYXAua2V5X3B0ciA9CU5VTEw7CisJYm9vdF9tYXAuYnVmZl9zaXplID0JJmJ1ZmZfc2l6ZTsKKworCXN0YXR1cyA9IGVmaV9nZXRfbWVtb3J5X21hcChzeXNfdGFibGVfYXJnLCAmYm9vdF9tYXApOwogCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCiAJCWdvdG8gZmFpbDsKIApAQCAtNzA0LDMgKzc0MCw3NiBAQAogCSpjbWRfbGluZV9sZW4gPSBvcHRpb25zX2J5dGVzOwogCXJldHVybiAoY2hhciAqKWNtZGxpbmVfYWRkcjsKIH0KKworLyoKKyAqIEhhbmRsZSBjYWxsaW5nIEV4aXRCb290U2VydmljZXMgYWNjb3JkaW5nIHRvIHRoZSByZXF1aXJlbWVudHMgc2V0IG91dCBieSB0aGUKKyAqIHNwZWMuICBPYnRhaW5zIHRoZSBjdXJyZW50IG1lbW9yeSBtYXAsIGFuZCByZXR1cm5zIHRoYXQgaW5mbyBhZnRlciBjYWxsaW5nCisgKiBFeGl0Qm9vdFNlcnZpY2VzLiAgVGhlIGNsaWVudCBtdXN0IHNwZWNpZnkgYSBmdW5jdGlvbiB0byBwZXJmb3JtIGFueQorICogcHJvY2Vzc2luZyBvZiB0aGUgbWVtb3J5IG1hcCBkYXRhIHByaW9yIHRvIEV4aXRCb290U2VydmljZXMuICBBIGNsaWVudAorICogc3BlY2lmaWMgc3RydWN0dXJlIG1heSBiZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIHZpYSBwcml2LiAgVGhlIGNsaWVudAorICogZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KKyAqLworZWZpX3N0YXR1c190IGVmaV9leGl0X2Jvb3Rfc2VydmljZXMoZWZpX3N5c3RlbV90YWJsZV90ICpzeXNfdGFibGVfYXJnLAorCQkJCSAgICB2b2lkICpoYW5kbGUsCisJCQkJICAgIHN0cnVjdCBlZmlfYm9vdF9tZW1tYXAgKm1hcCwKKwkJCQkgICAgdm9pZCAqcHJpdiwKKwkJCQkgICAgZWZpX2V4aXRfYm9vdF9tYXBfcHJvY2Vzc2luZyBwcml2X2Z1bmMpCit7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKworCXN0YXR1cyA9IGVmaV9nZXRfbWVtb3J5X21hcChzeXNfdGFibGVfYXJnLCBtYXApOworCisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJZ290byBmYWlsOworCisJc3RhdHVzID0gcHJpdl9mdW5jKHN5c190YWJsZV9hcmcsIG1hcCwgcHJpdik7CisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJZ290byBmcmVlX21hcDsKKworCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGV4aXRfYm9vdF9zZXJ2aWNlcywgaGFuZGxlLCAqbWFwLT5rZXlfcHRyKTsKKworCWlmIChzdGF0dXMgPT0gRUZJX0lOVkFMSURfUEFSQU1FVEVSKSB7CisJCS8qCisJCSAqIFRoZSBtZW1vcnkgbWFwIGNoYW5nZWQgYmV0d2VlbiBlZmlfZ2V0X21lbW9yeV9tYXAoKSBhbmQKKwkJICogZXhpdF9ib290X3NlcnZpY2VzKCkuICBQZXIgdGhlIFVFRkkgU3BlYyB2Mi42LCBTZWN0aW9uIDYuNDoKKwkJICogRUZJX0JPT1RfU0VSVklDRVMuRXhpdEJvb3RTZXJ2aWNlcyB3ZSBuZWVkIHRvIGdldCB0aGUKKwkJICogdXBkYXRlZCBtYXAsIGFuZCB0cnkgYWdhaW4uICBUaGUgc3BlYyBpbXBsaWVzIG9uZSByZXRyeQorCQkgKiBzaG91bGQgYmUgc3VmZmljZW50LCB3aGljaCBpcyBjb25maXJtZWQgYWdhaW5zdCB0aGUgRURLMgorCQkgKiBpbXBsZW1lbnRhdGlvbi4gIFBlciB0aGUgc3BlYywgd2UgY2FuIG9ubHkgaW52b2tlCisJCSAqIGdldF9tZW1vcnlfbWFwKCkgYW5kIGV4aXRfYm9vdF9zZXJ2aWNlcygpIC0gd2UgY2Fubm90IGFsbG9jCisJCSAqIHNvIGVmaV9nZXRfbWVtb3J5X21hcCgpIGNhbm5vdCBiZSB1c2VkLCBhbmQgd2UgbXVzdCByZXVzZQorCQkgKiB0aGUgYnVmZmVyLiAgRm9yIGFsbCBwcmFjdGljYWwgcHVycG9zZXMsIHRoZSBoZWFkcm9vbSBpbiB0aGUKKwkJICogYnVmZmVyIHNob3VsZCBhY2NvdW50IGZvciBhbnkgY2hhbmdlcyBpbiB0aGUgbWFwIHNvIHRoZSBjYWxsCisJCSAqIHRvIGdldF9tZW1vcnlfbWFwKCkgaXMgZXhwZWN0ZWQgdG8gc3VjY2VlZCBoZXJlLgorCQkgKi8KKwkJKm1hcC0+bWFwX3NpemUgPSAqbWFwLT5idWZmX3NpemU7CisJCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGdldF9tZW1vcnlfbWFwLAorCQkJCQltYXAtPm1hcF9zaXplLAorCQkJCQkqbWFwLT5tYXAsCisJCQkJCW1hcC0+a2V5X3B0ciwKKwkJCQkJbWFwLT5kZXNjX3NpemUsCisJCQkJCW1hcC0+ZGVzY192ZXIpOworCisJCS8qIGV4aXRfYm9vdF9zZXJ2aWNlcygpIHdhcyBjYWxsZWQsIHRodXMgY2Fubm90IGZyZWUgKi8KKwkJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJCWdvdG8gZmFpbDsKKworCQlzdGF0dXMgPSBwcml2X2Z1bmMoc3lzX3RhYmxlX2FyZywgbWFwLCBwcml2KTsKKwkJLyogZXhpdF9ib290X3NlcnZpY2VzKCkgd2FzIGNhbGxlZCwgdGh1cyBjYW5ub3QgZnJlZSAqLworCQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCQkJZ290byBmYWlsOworCisJCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGV4aXRfYm9vdF9zZXJ2aWNlcywgaGFuZGxlLCAqbWFwLT5rZXlfcHRyKTsKKwl9CisKKwkvKiBleGl0X2Jvb3Rfc2VydmljZXMoKSB3YXMgY2FsbGVkLCB0aHVzIGNhbm5vdCBmcmVlICovCisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJZ290byBmYWlsOworCisJcmV0dXJuIEVGSV9TVUNDRVNTOworCitmcmVlX21hcDoKKwllZmlfY2FsbF9lYXJseShmcmVlX3Bvb2wsICptYXAtPm1hcCk7CitmYWlsOgorCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9saWJzdHViL2ZkdC5jIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvbGlic3R1Yi9mZHQuYwppbmRleCBlNThhYmZhLi5hNmE5MzExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9saWJzdHViL2ZkdC5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL2xpYnN0dWIvZmR0LmMKQEAgLTE1Miw2ICsxNTIsMjcgQEAKICNkZWZpbmUgRUZJX0ZEVF9BTElHTiBFRklfUEFHRV9TSVpFCiAjZW5kaWYKIAorc3RydWN0IGV4aXRfYm9vdF9zdHJ1Y3QgeworCWVmaV9tZW1vcnlfZGVzY190ICpydW50aW1lX21hcDsKKwlpbnQgKnJ1bnRpbWVfZW50cnlfY291bnQ7Cit9OworCitzdGF0aWMgZWZpX3N0YXR1c190IGV4aXRfYm9vdF9mdW5jKGVmaV9zeXN0ZW1fdGFibGVfdCAqc3lzX3RhYmxlX2FyZywKKwkJCQkgICBzdHJ1Y3QgZWZpX2Jvb3RfbWVtbWFwICptYXAsCisJCQkJICAgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgZXhpdF9ib290X3N0cnVjdCAqcCA9IHByaXY7CisJLyoKKwkgKiBVcGRhdGUgdGhlIG1lbW9yeSBtYXAgd2l0aCB2aXJ0dWFsIGFkZHJlc3Nlcy4gVGhlIGZ1bmN0aW9uIHdpbGwgYWxzbworCSAqIHBvcHVsYXRlIEBydW50aW1lX21hcCB3aXRoIGNvcGllcyBvZiBqdXN0IHRoZSBFRklfTUVNT1JZX1JVTlRJTUUKKwkgKiBlbnRyaWVzIHNvIHRoYXQgd2UgY2FuIHBhc3MgaXQgc3RyYWlnaHQgdG8gU2V0VmlydHVhbEFkZHJlc3NNYXAoKQorCSAqLworCWVmaV9nZXRfdmlydG1hcCgqbWFwLT5tYXAsICptYXAtPm1hcF9zaXplLCAqbWFwLT5kZXNjX3NpemUsCisJCQlwLT5ydW50aW1lX21hcCwgcC0+cnVudGltZV9lbnRyeV9jb3VudCk7CisKKwlyZXR1cm4gRUZJX1NVQ0NFU1M7Cit9CisKIC8qCiAgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGEgbmV3IEZEVCwgdGhlbiBhZGQgRUZJLCBjb21tYW5kbGluZSwgYW5kCiAgKiBpbml0cmQgcmVsYXRlZCBmaWVsZHMgdG8gdGhlIEZEVC4gIFRoaXMgcm91dGluZSBpbmNyZWFzZXMgdGhlCkBAIC0xNzUsMTMgKzE5NiwyMiBAQAogCQkJCQkgICAgdW5zaWduZWQgbG9uZyBmZHRfYWRkciwKIAkJCQkJICAgIHVuc2lnbmVkIGxvbmcgZmR0X3NpemUpCiB7Ci0JdW5zaWduZWQgbG9uZyBtYXBfc2l6ZSwgZGVzY19zaXplOworCXVuc2lnbmVkIGxvbmcgbWFwX3NpemUsIGRlc2Nfc2l6ZSwgYnVmZl9zaXplOwogCXUzMiBkZXNjX3ZlcjsKIAl1bnNpZ25lZCBsb25nIG1tYXBfa2V5OwogCWVmaV9tZW1vcnlfZGVzY190ICptZW1vcnlfbWFwLCAqcnVudGltZV9tYXA7CiAJdW5zaWduZWQgbG9uZyBuZXdfZmR0X3NpemU7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKIAlpbnQgcnVudGltZV9lbnRyeV9jb3VudCA9IDA7CisJc3RydWN0IGVmaV9ib290X21lbW1hcCBtYXA7CisJc3RydWN0IGV4aXRfYm9vdF9zdHJ1Y3QgcHJpdjsKKworCW1hcC5tYXAgPQkmcnVudGltZV9tYXA7CisJbWFwLm1hcF9zaXplID0JJm1hcF9zaXplOworCW1hcC5kZXNjX3NpemUgPQkmZGVzY19zaXplOworCW1hcC5kZXNjX3ZlciA9CSZkZXNjX3ZlcjsKKwltYXAua2V5X3B0ciA9CSZtbWFwX2tleTsKKwltYXAuYnVmZl9zaXplID0JJmJ1ZmZfc2l6ZTsKIAogCS8qCiAJICogR2V0IGEgY29weSBvZiB0aGUgY3VycmVudCBtZW1vcnkgbWFwIHRoYXQgd2Ugd2lsbCB1c2UgdG8gcHJlcGFyZQpAQCAtMTg5LDggKzIxOSw3IEBACiAJICogc3Vic2VxdWVudCBhbGxvY2F0aW9ucyBhZGRpbmcgZW50cmllcywgc2luY2UgdGhleSBjb3VsZCBub3QgYWZmZWN0CiAJICogdGhlIG51bWJlciBvZiBFRklfTUVNT1JZX1JVTlRJTUUgcmVnaW9ucy4KIAkgKi8KLQlzdGF0dXMgPSBlZmlfZ2V0X21lbW9yeV9tYXAoc3lzX3RhYmxlLCAmcnVudGltZV9tYXAsICZtYXBfc2l6ZSwKLQkJCQkgICAgJmRlc2Nfc2l6ZSwgJmRlc2NfdmVyLCAmbW1hcF9rZXkpOworCXN0YXR1cyA9IGVmaV9nZXRfbWVtb3J5X21hcChzeXNfdGFibGUsICZtYXApOwogCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKIAkJcHJfZWZpX2VycihzeXNfdGFibGUsICJVbmFibGUgdG8gcmV0cmlldmUgVUVGSSBtZW1vcnkgbWFwLlxuIik7CiAJCXJldHVybiBzdGF0dXM7CkBAIC0xOTksNiArMjI4LDcgQEAKIAlwcl9lZmkoc3lzX3RhYmxlLAogCSAgICAgICAiRXhpdGluZyBib290IHNlcnZpY2VzIGFuZCBpbnN0YWxsaW5nIHZpcnR1YWwgYWRkcmVzcyBtYXAuLi5cbiIpOwogCisJbWFwLm1hcCA9ICZtZW1vcnlfbWFwOwogCS8qCiAJICogRXN0aW1hdGUgc2l6ZSBvZiBuZXcgRkRULCBhbmQgYWxsb2NhdGUgbWVtb3J5IGZvciBpdC4gV2UKIAkgKiB3aWxsIGFsbG9jYXRlIGEgYmlnZ2VyIGJ1ZmZlciBpZiB0aGlzIGVuZHMgdXAgYmVpbmcgdG9vCkBAIC0yMTgsOCArMjQ4LDcgQEAKIAkJICogd2UgY2FuIGdldCB0aGUgbWVtb3J5IG1hcCBrZXkgIG5lZWRlZCBmb3IKIAkJICogZXhpdF9ib290X3NlcnZpY2VzKCkuCiAJCSAqLwotCQlzdGF0dXMgPSBlZmlfZ2V0X21lbW9yeV9tYXAoc3lzX3RhYmxlLCAmbWVtb3J5X21hcCwgJm1hcF9zaXplLAotCQkJCQkgICAgJmRlc2Nfc2l6ZSwgJmRlc2NfdmVyLCAmbW1hcF9rZXkpOworCQlzdGF0dXMgPSBlZmlfZ2V0X21lbW9yeV9tYXAoc3lzX3RhYmxlLCAmbWFwKTsKIAkJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKIAkJCWdvdG8gZmFpbF9mcmVlX25ld19mZHQ7CiAKQEAgLTI1MCwxNiArMjc5LDExIEBACiAJCX0KIAl9CiAKLQkvKgotCSAqIFVwZGF0ZSB0aGUgbWVtb3J5IG1hcCB3aXRoIHZpcnR1YWwgYWRkcmVzc2VzLiBUaGUgZnVuY3Rpb24gd2lsbCBhbHNvCi0JICogcG9wdWxhdGUgQHJ1bnRpbWVfbWFwIHdpdGggY29waWVzIG9mIGp1c3QgdGhlIEVGSV9NRU1PUllfUlVOVElNRQotCSAqIGVudHJpZXMgc28gdGhhdCB3ZSBjYW4gcGFzcyBpdCBzdHJhaWdodCBpbnRvIFNldFZpcnR1YWxBZGRyZXNzTWFwKCkKLQkgKi8KLQllZmlfZ2V0X3ZpcnRtYXAobWVtb3J5X21hcCwgbWFwX3NpemUsIGRlc2Nfc2l6ZSwgcnVudGltZV9tYXAsCi0JCQkmcnVudGltZV9lbnRyeV9jb3VudCk7Ci0KLQkvKiBOb3cgd2UgYXJlIHJlYWR5IHRvIGV4aXRfYm9vdF9zZXJ2aWNlcy4qLwotCXN0YXR1cyA9IHN5c190YWJsZS0+Ym9vdHRpbWUtPmV4aXRfYm9vdF9zZXJ2aWNlcyhoYW5kbGUsIG1tYXBfa2V5KTsKKwlzeXNfdGFibGUtPmJvb3R0aW1lLT5mcmVlX3Bvb2wobWVtb3J5X21hcCk7CisJcHJpdi5ydW50aW1lX21hcCA9IHJ1bnRpbWVfbWFwOworCXByaXYucnVudGltZV9lbnRyeV9jb3VudCA9ICZydW50aW1lX2VudHJ5X2NvdW50OworCXN0YXR1cyA9IGVmaV9leGl0X2Jvb3Rfc2VydmljZXMoc3lzX3RhYmxlLCBoYW5kbGUsICZtYXAsICZwcml2LAorCQkJCQlleGl0X2Jvb3RfZnVuYyk7CiAKIAlpZiAoc3RhdHVzID09IEVGSV9TVUNDRVNTKSB7CiAJCWVmaV9zZXRfdmlydHVhbF9hZGRyZXNzX21hcF90ICpzdmFtOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZmkvbGlic3R1Yi9yYW5kb20uYyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL2xpYnN0dWIvcmFuZG9tLmMKaW5kZXggNTNmNmQzZi4uMGM5ZjU4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9lZmkvbGlic3R1Yi9yYW5kb20uYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9saWJzdHViL3JhbmRvbS5jCkBAIC03MywxMiArNzMsMjAgQEAKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgcmFuZG9tX3NlZWQpCiB7CiAJdW5zaWduZWQgbG9uZyBtYXBfc2l6ZSwgZGVzY19zaXplLCB0b3RhbF9zbG90cyA9IDAsIHRhcmdldF9zbG90OworCXVuc2lnbmVkIGxvbmcgYnVmZl9zaXplOwogCWVmaV9zdGF0dXNfdCBzdGF0dXM7CiAJZWZpX21lbW9yeV9kZXNjX3QgKm1lbW9yeV9tYXA7CiAJaW50IG1hcF9vZmZzZXQ7CisJc3RydWN0IGVmaV9ib290X21lbW1hcCBtYXA7CiAKLQlzdGF0dXMgPSBlZmlfZ2V0X21lbW9yeV9tYXAoc3lzX3RhYmxlX2FyZywgJm1lbW9yeV9tYXAsICZtYXBfc2l6ZSwKLQkJCQkgICAgJmRlc2Nfc2l6ZSwgTlVMTCwgTlVMTCk7CisJbWFwLm1hcCA9CSZtZW1vcnlfbWFwOworCW1hcC5tYXBfc2l6ZSA9CSZtYXBfc2l6ZTsKKwltYXAuZGVzY19zaXplID0JJmRlc2Nfc2l6ZTsKKwltYXAuZGVzY192ZXIgPQlOVUxMOworCW1hcC5rZXlfcHRyID0JTlVMTDsKKwltYXAuYnVmZl9zaXplID0JJmJ1ZmZfc2l6ZTsKKworCXN0YXR1cyA9IGVmaV9nZXRfbWVtb3J5X21hcChzeXNfdGFibGVfYXJnLCAmbWFwKTsKIAlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQogCQlyZXR1cm4gc3RhdHVzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9tZW1tYXAuYyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL21lbW1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwM2RkZWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9tZW1tYXAuYwpAQCAtMCwwICsxLDMwMyBAQAorLyoKKyAqIENvbW1vbiBFRkkgbWVtb3J5IG1hcCBmdW5jdGlvbnMuCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSAiZWZpOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL2Vhcmx5X2lvcmVtYXAuaD4KKworLyoqCisgKiBfX2VmaV9tZW1tYXBfaW5pdCAtIENvbW1vbiBjb2RlIGZvciBtYXBwaW5nIHRoZSBFRkkgbWVtb3J5IG1hcAorICogQGRhdGE6IEVGSSBtZW1vcnkgbWFwIGRhdGEKKyAqIEBsYXRlOiBVc2UgZWFybHkgb3IgbGF0ZSBtYXBwaW5nIGZ1bmN0aW9uPworICoKKyAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgY2FyZSBvZiBmaWd1cmluZyBvdXQgd2hpY2ggZnVuY3Rpb24gdG8gdXNlIHRvCisgKiBtYXAgdGhlIEVGSSBtZW1vcnkgbWFwIGluIGVmaS5tZW1tYXAgYmFzZWQgb24gaG93IGZhciBpbnRvIHRoZSBib290CisgKiB3ZSBhcmUuCisgKgorICogRHVyaW5nIGJvb3R1cCBAbGF0ZSBzaG91bGQgYmUgJWZhbHNlIHNpbmNlIHdlIG9ubHkgaGF2ZSBhY2Nlc3MgdG8KKyAqIHRoZSBlYXJseV9tZW1yZW1hcCooKSBmdW5jdGlvbnMgYXMgdGhlIHZtYWxsb2Mgc3BhY2UgaXNuJ3Qgc2V0dXAuCisgKiBPbmNlIHRoZSBrZXJuZWwgaXMgZnVsbHkgYm9vdGVkIHdlIGNhbiBmYWxsYmFjayB0byB0aGUgbW9yZSByb2J1c3QKKyAqIG1lbXJlbWFwKigpIEFQSS4KKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0CitfX2VmaV9tZW1tYXBfaW5pdChzdHJ1Y3QgZWZpX21lbW9yeV9tYXBfZGF0YSAqZGF0YSwgYm9vbCBsYXRlKQoreworCXN0cnVjdCBlZmlfbWVtb3J5X21hcCBtYXA7CisJcGh5c19hZGRyX3QgcGh5c19tYXA7CisKKwlpZiAoZWZpX2VuYWJsZWQoRUZJX1BBUkFWSVJUKSkKKwkJcmV0dXJuIDA7CisKKwlwaHlzX21hcCA9IGRhdGEtPnBoeXNfbWFwOworCisJaWYgKGxhdGUpCisJCW1hcC5tYXAgPSBtZW1yZW1hcChwaHlzX21hcCwgZGF0YS0+c2l6ZSwgTUVNUkVNQVBfV0IpOworCWVsc2UKKwkJbWFwLm1hcCA9IGVhcmx5X21lbXJlbWFwKHBoeXNfbWFwLCBkYXRhLT5zaXplKTsKKworCWlmICghbWFwLm1hcCkgeworCQlwcl9lcnIoIkNvdWxkIG5vdCBtYXAgdGhlIG1lbW9yeSBtYXAhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWFwLnBoeXNfbWFwID0gZGF0YS0+cGh5c19tYXA7CisJbWFwLm5yX21hcCA9IGRhdGEtPnNpemUgLyBkYXRhLT5kZXNjX3NpemU7CisJbWFwLm1hcF9lbmQgPSBtYXAubWFwICsgZGF0YS0+c2l6ZTsKKworCW1hcC5kZXNjX3ZlcnNpb24gPSBkYXRhLT5kZXNjX3ZlcnNpb247CisJbWFwLmRlc2Nfc2l6ZSA9IGRhdGEtPmRlc2Nfc2l6ZTsKKwltYXAubGF0ZSA9IGxhdGU7CisKKwlzZXRfYml0KEVGSV9NRU1NQVAsICZlZmkuZmxhZ3MpOworCisJZWZpLm1lbW1hcCA9IG1hcDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGVmaV9tZW1tYXBfaW5pdF9lYXJseSAtIE1hcCB0aGUgRUZJIG1lbW9yeSBtYXAgZGF0YSBzdHJ1Y3R1cmUKKyAqIEBkYXRhOiBFRkkgbWVtb3J5IG1hcCBkYXRhCisgKgorICogVXNlIGVhcmx5X21lbXJlbWFwKCkgdG8gbWFwIHRoZSBwYXNzZWQgaW4gRUZJIG1lbW9yeSBtYXAgYW5kIGFzc2lnbgorICogaXQgdG8gZWZpLm1lbW1hcC4KKyAqLworaW50IF9faW5pdCBlZmlfbWVtbWFwX2luaXRfZWFybHkoc3RydWN0IGVmaV9tZW1vcnlfbWFwX2RhdGEgKmRhdGEpCit7CisJLyogQ2Fubm90IGdvIGJhY2t3YXJkcyAqLworCVdBUk5fT04oZWZpLm1lbW1hcC5sYXRlKTsKKworCXJldHVybiBfX2VmaV9tZW1tYXBfaW5pdChkYXRhLCBmYWxzZSk7Cit9CisKK3ZvaWQgX19pbml0IGVmaV9tZW1tYXBfdW5tYXAodm9pZCkKK3sKKwlpZiAoIWVmaS5tZW1tYXAubGF0ZSkgeworCQl1bnNpZ25lZCBsb25nIHNpemU7CisKKwkJc2l6ZSA9IGVmaS5tZW1tYXAuZGVzY19zaXplICogZWZpLm1lbW1hcC5ucl9tYXA7CisJCWVhcmx5X21lbXVubWFwKGVmaS5tZW1tYXAubWFwLCBzaXplKTsKKwl9IGVsc2UgeworCQltZW11bm1hcChlZmkubWVtbWFwLm1hcCk7CisJfQorCisJZWZpLm1lbW1hcC5tYXAgPSBOVUxMOworCWNsZWFyX2JpdChFRklfTUVNTUFQLCAmZWZpLmZsYWdzKTsKK30KKworLyoqCisgKiBlZmlfbWVtbWFwX2luaXRfbGF0ZSAtIE1hcCBlZmkubWVtbWFwIHdpdGggbWVtcmVtYXAoKQorICogQHBoeXNfYWRkcjogUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgbmV3IEVGSSBtZW1vcnkgbWFwCisgKiBAc2l6ZTogU2l6ZSBpbiBieXRlcyBvZiB0aGUgbmV3IEVGSSBtZW1vcnkgbWFwCisgKgorICogU2V0dXAgYSBtYXBwaW5nIG9mIHRoZSBFRkkgbWVtb3J5IG1hcCB1c2luZyBpb3JlbWFwX2NhY2hlKCkuIFRoaXMKKyAqIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlIHRoZSB2bWFsbG9jIHNwYWNlIGhhcyBiZWVuCisgKiBzZXR1cCBhbmQgaXMgdGhlcmVmb3JlIG5vdCBzdWl0YWJsZSBmb3IgY2FsbGluZyBkdXJpbmcgZWFybHkgRUZJCisgKiBpbml0aWFsaXNlLCBlLmcuIGluIGVmaV9pbml0KCkuIEFkZGl0aW9uYWxseSwgaXQgZXhwZWN0cworICogZWZpX21lbW1hcF9pbml0X2Vhcmx5KCkgdG8gaGF2ZSBhbHJlYWR5IGJlZW4gY2FsbGVkLgorICoKKyAqIFRoZSByZWFzb24gdGhlcmUgYXJlIHR3byBFRkkgbWVtbWFwIGluaXRpYWxpc2F0aW9uCisgKiAoZWZpX21lbW1hcF9pbml0X2Vhcmx5KCkgYW5kIHRoaXMgbGF0ZSB2ZXJzaW9uKSBpcyBiZWNhdXNlIHRoZQorICogZWFybHkgRUZJIG1lbW1hcCBzaG91bGQgYmUgZXhwbGljaXRseSB1bm1hcHBlZCBvbmNlIEVGSQorICogaW5pdGlhbGlzYXRpb24gaXMgY29tcGxldGUgYXMgdGhlIGZpeG1hcCBzcGFjZSB1c2VkIHRvIG1hcCB0aGUgRUZJCisgKiBtZW1tYXAgKHZpYSBlYXJseV9tZW1yZW1hcCgpKSBpcyBhIHNjYXJjZSByZXNvdXJjZS4KKyAqCisgKiBUaGlzIGxhdGUgbWFwcGluZyBpcyBpbnRlbmRlZCB0byBwZXJzaXN0IGZvciB0aGUgZHVyYXRpb24gb2YKKyAqIHJ1bnRpbWUgc28gdGhhdCB0aGluZ3MgbGlrZSBlZmlfbWVtX2Rlc2NfbG9va3VwKCkgYW5kCisgKiBlZmlfbWVtX2F0dHJpYnV0ZXMoKSBhbHdheXMgd29yay4KKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBfX2luaXQgZWZpX21lbW1hcF9pbml0X2xhdGUocGh5c19hZGRyX3QgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXN0cnVjdCBlZmlfbWVtb3J5X21hcF9kYXRhIGRhdGEgPSB7CisJCS5waHlzX21hcCA9IGFkZHIsCisJCS5zaXplID0gc2l6ZSwKKwl9OworCisJLyogRGlkIHdlIGZvcmdldCB0byB1bm1hcCB0aGUgZWFybHkgRUZJIG1lbW1hcD8gKi8KKwlXQVJOX09OKGVmaS5tZW1tYXAubWFwKTsKKworCS8qIFdlcmUgd2UgYWxyZWFkeSBjYWxsZWQ/ICovCisJV0FSTl9PTihlZmkubWVtbWFwLmxhdGUpOworCisJLyoKKwkgKiBJdCBtYWtlcyBubyBzZW5zZSB0byBhbGxvdyBjYWxsZXJzIHRvIHJlZ2lzdGVyIGRpZmZlcmVudAorCSAqIHZhbHVlcyBmb3IgdGhlIGZvbGxvd2luZyBmaWVsZHMuIENvcHkgdGhlbSBvdXQgb2YgdGhlCisJICogZXhpc3RpbmcgZWFybHkgRUZJIG1lbW1hcC4KKwkgKi8KKwlkYXRhLmRlc2NfdmVyc2lvbiA9IGVmaS5tZW1tYXAuZGVzY192ZXJzaW9uOworCWRhdGEuZGVzY19zaXplID0gZWZpLm1lbW1hcC5kZXNjX3NpemU7CisKKwlyZXR1cm4gX19lZmlfbWVtbWFwX2luaXQoJmRhdGEsIHRydWUpOworfQorCisvKioKKyAqIGVmaV9tZW1tYXBfaW5zdGFsbCAtIEluc3RhbGwgYSBuZXcgRUZJIG1lbW9yeSBtYXAgaW4gZWZpLm1lbW1hcAorICogQGFkZHI6IFBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSBtYXAKKyAqIEBucl9tYXA6IE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBtZW1vcnkgbWFwCisgKgorICogVW5saWtlIGVmaV9tZW1tYXBfaW5pdF8qKCksIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWxsb3cgdGhlIGNhbGxlcgorICogdG8gc3dpdGNoIGZyb20gZWFybHkgdG8gbGF0ZSBtYXBwaW5ncy4gSXQgc2ltcGx5IHVzZXMgdGhlIGV4aXN0aW5nCisgKiBtYXBwaW5nIGZ1bmN0aW9uIGFuZCBpbnN0YWxscyB0aGUgbmV3IG1lbW1hcC4KKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBfX2luaXQgZWZpX21lbW1hcF9pbnN0YWxsKHBoeXNfYWRkcl90IGFkZHIsIHVuc2lnbmVkIGludCBucl9tYXApCit7CisJc3RydWN0IGVmaV9tZW1vcnlfbWFwX2RhdGEgZGF0YTsKKworCWVmaV9tZW1tYXBfdW5tYXAoKTsKKworCWRhdGEucGh5c19tYXAgPSBhZGRyOworCWRhdGEuc2l6ZSA9IGVmaS5tZW1tYXAuZGVzY19zaXplICogbnJfbWFwOworCWRhdGEuZGVzY192ZXJzaW9uID0gZWZpLm1lbW1hcC5kZXNjX3ZlcnNpb247CisJZGF0YS5kZXNjX3NpemUgPSBlZmkubWVtbWFwLmRlc2Nfc2l6ZTsKKworCXJldHVybiBfX2VmaV9tZW1tYXBfaW5pdCgmZGF0YSwgZWZpLm1lbW1hcC5sYXRlKTsKK30KKworLyoqCisgKiBlZmlfbWVtbWFwX3NwbGl0X2NvdW50IC0gQ291bnQgbnVtYmVyIG9mIGFkZGl0aW9uYWwgRUZJIG1lbW1hcCBlbnRyaWVzCisgKiBAbWQ6IEVGSSBtZW1vcnkgZGVzY3JpcHRvciB0byBzcGxpdAorICogQHJhbmdlOiBBZGRyZXNzIHJhbmdlIChzdGFydCwgZW5kKSB0byBzcGxpdCBhcm91bmQKKyAqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBFRkkgbWVtbWFwIGVudHJpZXMgcmVxdWlyZWQgdG8KKyAqIGFjY29tb2RhdGUgQHJhbmdlLgorICovCitpbnQgX19pbml0IGVmaV9tZW1tYXBfc3BsaXRfY291bnQoZWZpX21lbW9yeV9kZXNjX3QgKm1kLCBzdHJ1Y3QgcmFuZ2UgKnJhbmdlKQoreworCXU2NCBtX3N0YXJ0LCBtX2VuZDsKKwl1NjQgc3RhcnQsIGVuZDsKKwlpbnQgY291bnQgPSAwOworCisJc3RhcnQgPSBtZC0+cGh5c19hZGRyOworCWVuZCA9IHN0YXJ0ICsgKG1kLT5udW1fcGFnZXMgPDwgRUZJX1BBR0VfU0hJRlQpIC0gMTsKKworCS8qIG1vZGlmeWluZyByYW5nZSAqLworCW1fc3RhcnQgPSByYW5nZS0+c3RhcnQ7CisJbV9lbmQgPSByYW5nZS0+ZW5kOworCisJaWYgKG1fc3RhcnQgPD0gc3RhcnQpIHsKKwkJLyogc3BsaXQgaW50byAyIHBhcnRzICovCisJCWlmIChzdGFydCA8IG1fZW5kICYmIG1fZW5kIDwgZW5kKQorCQkJY291bnQrKzsKKwl9CisKKwlpZiAoc3RhcnQgPCBtX3N0YXJ0ICYmIG1fc3RhcnQgPCBlbmQpIHsKKwkJLyogc3BsaXQgaW50byAzIHBhcnRzICovCisJCWlmIChtX2VuZCA8IGVuZCkKKwkJCWNvdW50ICs9IDI7CisJCS8qIHNwbGl0IGludG8gMiBwYXJ0cyAqLworCQlpZiAoZW5kIDw9IG1fZW5kKQorCQkJY291bnQrKzsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qKgorICogZWZpX21lbW1hcF9pbnNlcnQgLSBJbnNlcnQgYSBtZW1vcnkgcmVnaW9uIGluIGFuIEVGSSBtZW1tYXAKKyAqIEBvbGRfbWVtbWFwOiBUaGUgZXhpc3RpbmcgRUZJIG1lbW9yeSBtYXAgc3RydWN0dXJlCisgKiBAYnVmOiBBZGRyZXNzIG9mIGJ1ZmZlciB0byBzdG9yZSBuZXcgbWFwCisgKiBAbWVtOiBNZW1vcnkgbWFwIGVudHJ5IHRvIGluc2VydAorICoKKyAqIEl0IGlzIHN1Z2dlc3RlZCB0aGF0IHlvdSBjYWxsIGVmaV9tZW1tYXBfc3BsaXRfY291bnQoKSBmaXJzdAorICogdG8gc2VlIGhvdyBsYXJnZSBAYnVmIG5lZWRzIHRvIGJlLgorICovCit2b2lkIF9faW5pdCBlZmlfbWVtbWFwX2luc2VydChzdHJ1Y3QgZWZpX21lbW9yeV9tYXAgKm9sZF9tZW1tYXAsIHZvaWQgKmJ1ZiwKKwkJCSAgICAgIHN0cnVjdCBlZmlfbWVtX3JhbmdlICptZW0pCit7CisJdTY0IG1fc3RhcnQsIG1fZW5kLCBtX2F0dHI7CisJZWZpX21lbW9yeV9kZXNjX3QgKm1kOworCXU2NCBzdGFydCwgZW5kOworCXZvaWQgKm9sZCwgKm5ldzsKKworCS8qIG1vZGlmeWluZyByYW5nZSAqLworCW1fc3RhcnQgPSBtZW0tPnJhbmdlLnN0YXJ0OworCW1fZW5kID0gbWVtLT5yYW5nZS5lbmQ7CisJbV9hdHRyID0gbWVtLT5hdHRyaWJ1dGU7CisKKwkvKgorCSAqIFRoZSBFRkkgbWVtb3J5IG1hcCBkZWFscyB3aXRoIHJlZ2lvbnMgaW4gRUZJX1BBR0VfU0laRQorCSAqIHVuaXRzLiBFbnN1cmUgdGhhdCB0aGUgcmVnaW9uIGRlc2NyaWJlZCBieSAnbWVtJyBpcyBhbGlnbmVkCisJICogY29ycmVjdGx5LgorCSAqLworCWlmICghSVNfQUxJR05FRChtX3N0YXJ0LCBFRklfUEFHRV9TSVpFKSB8fAorCSAgICAhSVNfQUxJR05FRChtX2VuZCArIDEsIEVGSV9QQUdFX1NJWkUpKSB7CisJCVdBUk5fT04oMSk7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKG9sZCA9IG9sZF9tZW1tYXAtPm1hcCwgbmV3ID0gYnVmOworCSAgICAgb2xkIDwgb2xkX21lbW1hcC0+bWFwX2VuZDsKKwkgICAgIG9sZCArPSBvbGRfbWVtbWFwLT5kZXNjX3NpemUsIG5ldyArPSBvbGRfbWVtbWFwLT5kZXNjX3NpemUpIHsKKworCQkvKiBjb3B5IG9yaWdpbmFsIEVGSSBtZW1vcnkgZGVzY3JpcHRvciAqLworCQltZW1jcHkobmV3LCBvbGQsIG9sZF9tZW1tYXAtPmRlc2Nfc2l6ZSk7CisJCW1kID0gbmV3OworCQlzdGFydCA9IG1kLT5waHlzX2FkZHI7CisJCWVuZCA9IG1kLT5waHlzX2FkZHIgKyAobWQtPm51bV9wYWdlcyA8PCBFRklfUEFHRV9TSElGVCkgLSAxOworCisJCWlmIChtX3N0YXJ0IDw9IHN0YXJ0ICYmIGVuZCA8PSBtX2VuZCkKKwkJCW1kLT5hdHRyaWJ1dGUgfD0gbV9hdHRyOworCisJCWlmIChtX3N0YXJ0IDw9IHN0YXJ0ICYmCisJCSAgICAoc3RhcnQgPCBtX2VuZCAmJiBtX2VuZCA8IGVuZCkpIHsKKwkJCS8qIGZpcnN0IHBhcnQgKi8KKwkJCW1kLT5hdHRyaWJ1dGUgfD0gbV9hdHRyOworCQkJbWQtPm51bV9wYWdlcyA9IChtX2VuZCAtIG1kLT5waHlzX2FkZHIgKyAxKSA+PgorCQkJCUVGSV9QQUdFX1NISUZUOworCQkJLyogbGF0dGVyIHBhcnQgKi8KKwkJCW5ldyArPSBvbGRfbWVtbWFwLT5kZXNjX3NpemU7CisJCQltZW1jcHkobmV3LCBvbGQsIG9sZF9tZW1tYXAtPmRlc2Nfc2l6ZSk7CisJCQltZCA9IG5ldzsKKwkJCW1kLT5waHlzX2FkZHIgPSBtX2VuZCArIDE7CisJCQltZC0+bnVtX3BhZ2VzID0gKGVuZCAtIG1kLT5waHlzX2FkZHIgKyAxKSA+PgorCQkJCUVGSV9QQUdFX1NISUZUOworCQl9CisKKwkJaWYgKChzdGFydCA8IG1fc3RhcnQgJiYgbV9zdGFydCA8IGVuZCkgJiYgbV9lbmQgPCBlbmQpIHsKKwkJCS8qIGZpcnN0IHBhcnQgKi8KKwkJCW1kLT5udW1fcGFnZXMgPSAobV9zdGFydCAtIG1kLT5waHlzX2FkZHIpID4+CisJCQkJRUZJX1BBR0VfU0hJRlQ7CisJCQkvKiBtaWRkbGUgcGFydCAqLworCQkJbmV3ICs9IG9sZF9tZW1tYXAtPmRlc2Nfc2l6ZTsKKwkJCW1lbWNweShuZXcsIG9sZCwgb2xkX21lbW1hcC0+ZGVzY19zaXplKTsKKwkJCW1kID0gbmV3OworCQkJbWQtPmF0dHJpYnV0ZSB8PSBtX2F0dHI7CisJCQltZC0+cGh5c19hZGRyID0gbV9zdGFydDsKKwkJCW1kLT5udW1fcGFnZXMgPSAobV9lbmQgLSBtX3N0YXJ0ICsgMSkgPj4KKwkJCQlFRklfUEFHRV9TSElGVDsKKwkJCS8qIGxhc3QgcGFydCAqLworCQkJbmV3ICs9IG9sZF9tZW1tYXAtPmRlc2Nfc2l6ZTsKKwkJCW1lbWNweShuZXcsIG9sZCwgb2xkX21lbW1hcC0+ZGVzY19zaXplKTsKKwkJCW1kID0gbmV3OworCQkJbWQtPnBoeXNfYWRkciA9IG1fZW5kICsgMTsKKwkJCW1kLT5udW1fcGFnZXMgPSAoZW5kIC0gbV9lbmQpID4+CisJCQkJRUZJX1BBR0VfU0hJRlQ7CisJCX0KKworCQlpZiAoKHN0YXJ0IDwgbV9zdGFydCAmJiBtX3N0YXJ0IDwgZW5kKSAmJgorCQkgICAgKGVuZCA8PSBtX2VuZCkpIHsKKwkJCS8qIGZpcnN0IHBhcnQgKi8KKwkJCW1kLT5udW1fcGFnZXMgPSAobV9zdGFydCAtIG1kLT5waHlzX2FkZHIpID4+CisJCQkJRUZJX1BBR0VfU0hJRlQ7CisJCQkvKiBsYXR0ZXIgcGFydCAqLworCQkJbmV3ICs9IG9sZF9tZW1tYXAtPmRlc2Nfc2l6ZTsKKwkJCW1lbWNweShuZXcsIG9sZCwgb2xkX21lbW1hcC0+ZGVzY19zaXplKTsKKwkJCW1kID0gbmV3OworCQkJbWQtPnBoeXNfYWRkciA9IG1fc3RhcnQ7CisJCQltZC0+bnVtX3BhZ2VzID0gKGVuZCAtIG1kLT5waHlzX2FkZHIgKyAxKSA+PgorCQkJCUVGSV9QQUdFX1NISUZUOworCQkJbWQtPmF0dHJpYnV0ZSB8PSBtX2F0dHI7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9ydW50aW1lLW1hcC5jIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvcnVudGltZS1tYXAuYwppbmRleCA1YzU1MjI3Li44ZTY0Yjc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9ydW50aW1lLW1hcC5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL3J1bnRpbWUtbWFwLmMKQEAgLTE0LDEwICsxNCw2IEBACiAKICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KIAotc3RhdGljIHZvaWQgKmVmaV9ydW50aW1lX21hcDsKLXN0YXRpYyBpbnQgbnJfZWZpX3J1bnRpbWVfbWFwOwotc3RhdGljIHUzMiBlZmlfbWVtZGVzY19zaXplOwotCiBzdHJ1Y3QgZWZpX3J1bnRpbWVfbWFwX2VudHJ5IHsKIAllZmlfbWVtb3J5X2Rlc2NfdCBtZDsKIAlzdHJ1Y3Qga29iamVjdCBrb2JqOyAgIC8qIGtvYmplY3QgZm9yIGVhY2ggZW50cnkgKi8KQEAgLTEwNiw3ICsxMDIsOCBAQAogc3RhdGljIHN0cnVjdCBrc2V0ICptYXBfa3NldDsKIAogc3RhdGljIHN0cnVjdCBlZmlfcnVudGltZV9tYXBfZW50cnkgKgotYWRkX3N5c2ZzX3J1bnRpbWVfbWFwX2VudHJ5KHN0cnVjdCBrb2JqZWN0ICprb2JqLCBpbnQgbnIpCithZGRfc3lzZnNfcnVudGltZV9tYXBfZW50cnkoc3RydWN0IGtvYmplY3QgKmtvYmosIGludCBuciwKKwkJCSAgICBlZmlfbWVtb3J5X2Rlc2NfdCAqbWQpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgZWZpX3J1bnRpbWVfbWFwX2VudHJ5ICplbnRyeTsKQEAgLTEyNCw4ICsxMjEsNyBAQAogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAKLQltZW1jcHkoJmVudHJ5LT5tZCwgZWZpX3J1bnRpbWVfbWFwICsgbnIgKiBlZmlfbWVtZGVzY19zaXplLAotCSAgICAgICBzaXplb2YoZWZpX21lbW9yeV9kZXNjX3QpKTsKKwltZW1jcHkoJmVudHJ5LT5tZCwgbWQsIHNpemVvZihlZmlfbWVtb3J5X2Rlc2NfdCkpOwogCiAJa29iamVjdF9pbml0KCZlbnRyeS0+a29iaiwgJm1hcF9rdHlwZSk7CiAJZW50cnktPmtvYmoua3NldCA9IG1hcF9rc2V0OwpAQCAtMTQyLDEyICsxMzgsMTIgQEAKIAogaW50IGVmaV9nZXRfcnVudGltZV9tYXBfc2l6ZSh2b2lkKQogewotCXJldHVybiBucl9lZmlfcnVudGltZV9tYXAgKiBlZmlfbWVtZGVzY19zaXplOworCXJldHVybiBlZmkubWVtbWFwLm5yX21hcCAqIGVmaS5tZW1tYXAuZGVzY19zaXplOwogfQogCiBpbnQgZWZpX2dldF9ydW50aW1lX21hcF9kZXNjX3NpemUodm9pZCkKIHsKLQlyZXR1cm4gZWZpX21lbWRlc2Nfc2l6ZTsKKwlyZXR1cm4gZWZpLm1lbW1hcC5kZXNjX3NpemU7CiB9CiAKIGludCBlZmlfcnVudGltZV9tYXBfY29weSh2b2lkICpidWYsIHNpemVfdCBidWZzeikKQEAgLTE1NywzOCArMTUzLDMzIEBACiAJaWYgKHN6ID4gYnVmc3opCiAJCXN6ID0gYnVmc3o7CiAKLQltZW1jcHkoYnVmLCBlZmlfcnVudGltZV9tYXAsIHN6KTsKKwltZW1jcHkoYnVmLCBlZmkubWVtbWFwLm1hcCwgc3opOwogCXJldHVybiAwOwogfQogCi12b2lkIGVmaV9ydW50aW1lX21hcF9zZXR1cCh2b2lkICptYXAsIGludCBucl9lbnRyaWVzLCB1MzIgZGVzY19zaXplKQotewotCWVmaV9ydW50aW1lX21hcCA9IG1hcDsKLQlucl9lZmlfcnVudGltZV9tYXAgPSBucl9lbnRyaWVzOwotCWVmaV9tZW1kZXNjX3NpemUgPSBkZXNjX3NpemU7Ci19Ci0KIGludCBfX2luaXQgZWZpX3J1bnRpbWVfbWFwX2luaXQoc3RydWN0IGtvYmplY3QgKmVmaV9rb2JqKQogewogCWludCBpLCBqLCByZXQgPSAwOwogCXN0cnVjdCBlZmlfcnVudGltZV9tYXBfZW50cnkgKmVudHJ5OworCWVmaV9tZW1vcnlfZGVzY190ICptZDsKIAotCWlmICghZWZpX3J1bnRpbWVfbWFwKQorCWlmICghZWZpX2VuYWJsZWQoRUZJX01FTU1BUCkpCiAJCXJldHVybiAwOwogCi0JbWFwX2VudHJpZXMgPSBremFsbG9jKG5yX2VmaV9ydW50aW1lX21hcCAqIHNpemVvZihlbnRyeSksIEdGUF9LRVJORUwpOworCW1hcF9lbnRyaWVzID0ga3phbGxvYyhlZmkubWVtbWFwLm5yX21hcCAqIHNpemVvZihlbnRyeSksIEdGUF9LRVJORUwpOwogCWlmICghbWFwX2VudHJpZXMpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IG5yX2VmaV9ydW50aW1lX21hcDsgaSsrKSB7Ci0JCWVudHJ5ID0gYWRkX3N5c2ZzX3J1bnRpbWVfbWFwX2VudHJ5KGVmaV9rb2JqLCBpKTsKKwlpID0gMDsKKwlmb3JfZWFjaF9lZmlfbWVtb3J5X2Rlc2MobWQpIHsKKwkJZW50cnkgPSBhZGRfc3lzZnNfcnVudGltZV9tYXBfZW50cnkoZWZpX2tvYmosIGksIG1kKTsKIAkJaWYgKElTX0VSUihlbnRyeSkpIHsKIAkJCXJldCA9IFBUUl9FUlIoZW50cnkpOwogCQkJZ290byBvdXRfYWRkX2VudHJ5OwogCQl9Ci0JCSoobWFwX2VudHJpZXMgKyBpKSA9IGVudHJ5OworCQkqKG1hcF9lbnRyaWVzICsgaSsrKSA9IGVudHJ5OwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZmkvcnVudGltZS13cmFwcGVycy5jIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvcnVudGltZS13cmFwcGVycy5jCmluZGV4IDQxOTU4NzcuLmFlNTQ4NzBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9ydW50aW1lLXdyYXBwZXJzLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvcnVudGltZS13cmFwcGVycy5jCkBAIC0xNCwxMSArMTQsMTMgQEAKICAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIuCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KQkiZWZpOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvZWZpLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CiAjaW5jbHVkZSA8YXNtL2VmaS5oPgogCkBAIC04MSwyMCArODMsMjEgQEAKICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAqCiAgKiBEdWUgdG8gdGhlIGZhY3QgdGhhdCB0aGUgRUZJIHBzdG9yZSBtYXkgd3JpdGUgdG8gdGhlIHZhcmlhYmxlIHN0b3JlIGluCi0gKiBpbnRlcnJ1cHQgY29udGV4dCwgd2UgbmVlZCB0byB1c2UgYSBzcGlubG9jayBmb3IgYXQgbGVhc3QgdGhlIGdyb3VwcyB0aGF0CisgKiBpbnRlcnJ1cHQgY29udGV4dCwgd2UgbmVlZCB0byB1c2UgYSBsb2NrIGZvciBhdCBsZWFzdCB0aGUgZ3JvdXBzIHRoYXQKICAqIGNvbnRhaW4gU2V0VmFyaWFibGUoKSBhbmQgUXVlcnlWYXJpYWJsZUluZm8oKS4gVGhhdCBsZWF2ZXMgbGl0dGxlIGVsc2UsIGFzCiAgKiBub25lIG9mIHRoZSByZW1haW5pbmcgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBldmVyIGNhbGxlZCBhdCBydW50aW1lLgotICogU28gbGV0J3MganVzdCB1c2UgYSBzaW5nbGUgc3BpbmxvY2sgdG8gc2VyaWFsaXplIGFsbCBSdW50aW1lIFNlcnZpY2VzIGNhbGxzLgorICogU28gbGV0J3MganVzdCB1c2UgYSBzaW5nbGUgbG9jayB0byBzZXJpYWxpemUgYWxsIFJ1bnRpbWUgU2VydmljZXMgY2FsbHMuCiAgKi8KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZWZpX3J1bnRpbWVfbG9jayk7CitzdGF0aWMgREVGSU5FX1NFTUFQSE9SRShlZmlfcnVudGltZV9sb2NrKTsKIAogc3RhdGljIGVmaV9zdGF0dXNfdCB2aXJ0X2VmaV9nZXRfdGltZShlZmlfdGltZV90ICp0bSwgZWZpX3RpbWVfY2FwX3QgKnRjKQogewogCWVmaV9zdGF0dXNfdCBzdGF0dXM7CiAKLQlzcGluX2xvY2soJmVmaV9ydW50aW1lX2xvY2spOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVmaV9ydW50aW1lX2xvY2spKQorCQlyZXR1cm4gRUZJX0FCT1JURUQ7CiAJc3RhdHVzID0gZWZpX2NhbGxfdmlydChnZXRfdGltZSwgdG0sIHRjKTsKLQlzcGluX3VubG9jaygmZWZpX3J1bnRpbWVfbG9jayk7CisJdXAoJmVmaV9ydW50aW1lX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTEwMiw5ICsxMDUsMTAgQEAKIHsKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrKCZlZmlfcnVudGltZV9sb2NrKTsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZlZmlfcnVudGltZV9sb2NrKSkKKwkJcmV0dXJuIEVGSV9BQk9SVEVEOwogCXN0YXR1cyA9IGVmaV9jYWxsX3ZpcnQoc2V0X3RpbWUsIHRtKTsKLQlzcGluX3VubG9jaygmZWZpX3J1bnRpbWVfbG9jayk7CisJdXAoJmVmaV9ydW50aW1lX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTExNCw5ICsxMTgsMTAgQEAKIHsKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrKCZlZmlfcnVudGltZV9sb2NrKTsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZlZmlfcnVudGltZV9sb2NrKSkKKwkJcmV0dXJuIEVGSV9BQk9SVEVEOwogCXN0YXR1cyA9IGVmaV9jYWxsX3ZpcnQoZ2V0X3dha2V1cF90aW1lLCBlbmFibGVkLCBwZW5kaW5nLCB0bSk7Ci0Jc3Bpbl91bmxvY2soJmVmaV9ydW50aW1lX2xvY2spOworCXVwKCZlZmlfcnVudGltZV9sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xMjQsOSArMTI5LDEwIEBACiB7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKIAotCXNwaW5fbG9jaygmZWZpX3J1bnRpbWVfbG9jayk7CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZWZpX3J1bnRpbWVfbG9jaykpCisJCXJldHVybiBFRklfQUJPUlRFRDsKIAlzdGF0dXMgPSBlZmlfY2FsbF92aXJ0KHNldF93YWtldXBfdGltZSwgZW5hYmxlZCwgdG0pOwotCXNwaW5fdW5sb2NrKCZlZmlfcnVudGltZV9sb2NrKTsKKwl1cCgmZWZpX3J1bnRpbWVfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMTM4LDEwICsxNDQsMTEgQEAKIHsKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrKCZlZmlfcnVudGltZV9sb2NrKTsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZlZmlfcnVudGltZV9sb2NrKSkKKwkJcmV0dXJuIEVGSV9BQk9SVEVEOwogCXN0YXR1cyA9IGVmaV9jYWxsX3ZpcnQoZ2V0X3ZhcmlhYmxlLCBuYW1lLCB2ZW5kb3IsIGF0dHIsIGRhdGFfc2l6ZSwKIAkJCSAgICAgICBkYXRhKTsKLQlzcGluX3VubG9jaygmZWZpX3J1bnRpbWVfbG9jayk7CisJdXAoJmVmaV9ydW50aW1lX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE1MSw5ICsxNTgsMTAgQEAKIHsKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrKCZlZmlfcnVudGltZV9sb2NrKTsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZlZmlfcnVudGltZV9sb2NrKSkKKwkJcmV0dXJuIEVGSV9BQk9SVEVEOwogCXN0YXR1cyA9IGVmaV9jYWxsX3ZpcnQoZ2V0X25leHRfdmFyaWFibGUsIG5hbWVfc2l6ZSwgbmFtZSwgdmVuZG9yKTsKLQlzcGluX3VubG9jaygmZWZpX3J1bnRpbWVfbG9jayk7CisJdXAoJmVmaV9ydW50aW1lX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE2NSwxMCArMTczLDExIEBACiB7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKIAotCXNwaW5fbG9jaygmZWZpX3J1bnRpbWVfbG9jayk7CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZWZpX3J1bnRpbWVfbG9jaykpCisJCXJldHVybiBFRklfQUJPUlRFRDsKIAlzdGF0dXMgPSBlZmlfY2FsbF92aXJ0KHNldF92YXJpYWJsZSwgbmFtZSwgdmVuZG9yLCBhdHRyLCBkYXRhX3NpemUsCiAJCQkgICAgICAgZGF0YSk7Ci0Jc3Bpbl91bmxvY2soJmVmaV9ydW50aW1lX2xvY2spOworCXVwKCZlZmlfcnVudGltZV9sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xNzksMTIgKzE4OCwxMiBAQAogewogCWVmaV9zdGF0dXNfdCBzdGF0dXM7CiAKLQlpZiAoIXNwaW5fdHJ5bG9jaygmZWZpX3J1bnRpbWVfbG9jaykpCisJaWYgKGRvd25fdHJ5bG9jaygmZWZpX3J1bnRpbWVfbG9jaykpCiAJCXJldHVybiBFRklfTk9UX1JFQURZOwogCiAJc3RhdHVzID0gZWZpX2NhbGxfdmlydChzZXRfdmFyaWFibGUsIG5hbWUsIHZlbmRvciwgYXR0ciwgZGF0YV9zaXplLAogCQkJICAgICAgIGRhdGEpOwotCXNwaW5fdW5sb2NrKCZlZmlfcnVudGltZV9sb2NrKTsKKwl1cCgmZWZpX3J1bnRpbWVfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMTk5LDEwICsyMDgsMTEgQEAKIAlpZiAoZWZpLnJ1bnRpbWVfdmVyc2lvbiA8IEVGSV8yXzAwX1NZU1RFTV9UQUJMRV9SRVZJU0lPTikKIAkJcmV0dXJuIEVGSV9VTlNVUFBPUlRFRDsKIAotCXNwaW5fbG9jaygmZWZpX3J1bnRpbWVfbG9jayk7CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZWZpX3J1bnRpbWVfbG9jaykpCisJCXJldHVybiBFRklfQUJPUlRFRDsKIAlzdGF0dXMgPSBlZmlfY2FsbF92aXJ0KHF1ZXJ5X3ZhcmlhYmxlX2luZm8sIGF0dHIsIHN0b3JhZ2Vfc3BhY2UsCiAJCQkgICAgICAgcmVtYWluaW5nX3NwYWNlLCBtYXhfdmFyaWFibGVfc2l6ZSk7Ci0Jc3Bpbl91bmxvY2soJmVmaV9ydW50aW1lX2xvY2spOworCXVwKCZlZmlfcnVudGltZV9sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0yMTcsMTIgKzIyNywxMiBAQAogCWlmIChlZmkucnVudGltZV92ZXJzaW9uIDwgRUZJXzJfMDBfU1lTVEVNX1RBQkxFX1JFVklTSU9OKQogCQlyZXR1cm4gRUZJX1VOU1VQUE9SVEVEOwogCi0JaWYgKCFzcGluX3RyeWxvY2soJmVmaV9ydW50aW1lX2xvY2spKQorCWlmIChkb3duX3RyeWxvY2soJmVmaV9ydW50aW1lX2xvY2spKQogCQlyZXR1cm4gRUZJX05PVF9SRUFEWTsKIAogCXN0YXR1cyA9IGVmaV9jYWxsX3ZpcnQocXVlcnlfdmFyaWFibGVfaW5mbywgYXR0ciwgc3RvcmFnZV9zcGFjZSwKIAkJCSAgICAgICByZW1haW5pbmdfc3BhY2UsIG1heF92YXJpYWJsZV9zaXplKTsKLQlzcGluX3VubG9jaygmZWZpX3J1bnRpbWVfbG9jayk7CisJdXAoJmVmaV9ydW50aW1lX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTIzMCw5ICsyNDAsMTAgQEAKIHsKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrKCZlZmlfcnVudGltZV9sb2NrKTsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZlZmlfcnVudGltZV9sb2NrKSkKKwkJcmV0dXJuIEVGSV9BQk9SVEVEOwogCXN0YXR1cyA9IGVmaV9jYWxsX3ZpcnQoZ2V0X25leHRfaGlnaF9tb25vX2NvdW50LCBjb3VudCk7Ci0Jc3Bpbl91bmxvY2soJmVmaV9ydW50aW1lX2xvY2spOworCXVwKCZlZmlfcnVudGltZV9sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0yNDEsOSArMjUyLDEzIEBACiAJCQkJICB1bnNpZ25lZCBsb25nIGRhdGFfc2l6ZSwKIAkJCQkgIGVmaV9jaGFyMTZfdCAqZGF0YSkKIHsKLQlzcGluX2xvY2soJmVmaV9ydW50aW1lX2xvY2spOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVmaV9ydW50aW1lX2xvY2spKSB7CisJCXByX3dhcm4oImZhaWxlZCB0byBpbnZva2UgdGhlIHJlc2V0X3N5c3RlbSgpIHJ1bnRpbWUgc2VydmljZTpcbiIKKwkJCSJjb3VsZCBub3QgZ2V0IGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIGZpcm13YXJlXG4iKTsKKwkJcmV0dXJuOworCX0KIAlfX2VmaV9jYWxsX3ZpcnQocmVzZXRfc3lzdGVtLCByZXNldF90eXBlLCBzdGF0dXMsIGRhdGFfc2l6ZSwgZGF0YSk7Ci0Jc3Bpbl91bmxvY2soJmVmaV9ydW50aW1lX2xvY2spOworCXVwKCZlZmlfcnVudGltZV9sb2NrKTsKIH0KIAogc3RhdGljIGVmaV9zdGF0dXNfdCB2aXJ0X2VmaV91cGRhdGVfY2Fwc3VsZShlZmlfY2Fwc3VsZV9oZWFkZXJfdCAqKmNhcHN1bGVzLApAQCAtMjU1LDkgKzI3MCwxMCBAQAogCWlmIChlZmkucnVudGltZV92ZXJzaW9uIDwgRUZJXzJfMDBfU1lTVEVNX1RBQkxFX1JFVklTSU9OKQogCQlyZXR1cm4gRUZJX1VOU1VQUE9SVEVEOwogCi0Jc3Bpbl9sb2NrKCZlZmlfcnVudGltZV9sb2NrKTsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZlZmlfcnVudGltZV9sb2NrKSkKKwkJcmV0dXJuIEVGSV9BQk9SVEVEOwogCXN0YXR1cyA9IGVmaV9jYWxsX3ZpcnQodXBkYXRlX2NhcHN1bGUsIGNhcHN1bGVzLCBjb3VudCwgc2dfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJmVmaV9ydW50aW1lX2xvY2spOworCXVwKCZlZmlfcnVudGltZV9sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0yNzEsMTAgKzI4NywxMSBAQAogCWlmIChlZmkucnVudGltZV92ZXJzaW9uIDwgRUZJXzJfMDBfU1lTVEVNX1RBQkxFX1JFVklTSU9OKQogCQlyZXR1cm4gRUZJX1VOU1VQUE9SVEVEOwogCi0Jc3Bpbl9sb2NrKCZlZmlfcnVudGltZV9sb2NrKTsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZlZmlfcnVudGltZV9sb2NrKSkKKwkJcmV0dXJuIEVGSV9BQk9SVEVEOwogCXN0YXR1cyA9IGVmaV9jYWxsX3ZpcnQocXVlcnlfY2Fwc3VsZV9jYXBzLCBjYXBzdWxlcywgY291bnQsIG1heF9zaXplLAogCQkJICAgICAgIHJlc2V0X3R5cGUpOwotCXNwaW5fdW5sb2NrKCZlZmlfcnVudGltZV9sb2NrKTsKKwl1cCgmZWZpX3J1bnRpbWVfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZmkvdGVzdC9NYWtlZmlsZSBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL3Rlc3QvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNkNDU3NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL3Rlc3QvTWFrZWZpbGUKQEAgLTAsMCArMSBAQAorb2JqLSQoQ09ORklHX0VGSV9URVNUKQkJCSs9IGVmaV90ZXN0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL3Rlc3QvZWZpX3Rlc3QuYyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL3Rlc3QvZWZpX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjFiYjUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvdGVzdC9lZmlfdGVzdC5jCkBAIC0wLDAgKzEsNzQ5IEBACisvKgorICogRUZJIFRlc3QgRHJpdmVyIGZvciBSdW50aW1lIFNlcnZpY2VzCisgKgorICogQ29weXJpZ2h0KEMpIDIwMTItMjAxNiBDYW5vbmljYWwgTHRkLgorICoKKyAqIFRoaXMgZHJpdmVyIGV4cG9ydHMgRUZJIHJ1bnRpbWUgc2VydmljZXMgaW50ZXJmYWNlcyBpbnRvIHVzZXJzcGFjZSwgd2hpY2gKKyAqIGFsbG93IHRvIHVzZSBhbmQgdGVzdCBVRUZJIHJ1bnRpbWUgc2VydmljZXMgcHJvdmlkZWQgYnkgZmlybXdhcmUuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZWZpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgImVmaV90ZXN0LmgiCisKK01PRFVMRV9BVVRIT1IoIkl2YW4gSHUgPGl2YW4uaHVAY2Fub25pY2FsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRUZJIFRlc3QgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qCisgKiBDb3VudCB0aGUgYnl0ZXMgaW4gJ3N0cicsIGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgTlVMTC4KKyAqCisgKiBOb3RlIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mICpieXRlcyosIG5vdCB0aGUgbnVtYmVyIG9mCisgKiB1Y3MyIGNoYXJhY3RlcnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgc2l6ZV90IHVzZXJfdWNzMl9zdHJzaXplKGVmaV9jaGFyMTZfdCAgX191c2VyICpzdHIpCit7CisJZWZpX2NoYXIxNl90ICpzID0gc3RyLCBjOworCXNpemVfdCBsZW47CisKKwlpZiAoIXN0cikKKwkJcmV0dXJuIDA7CisKKwkvKiBJbmNsdWRlIHRlcm1pbmF0aW5nIE5VTEwgKi8KKwlsZW4gPSBzaXplb2YoZWZpX2NoYXIxNl90KTsKKworCWlmIChnZXRfdXNlcihjLCBzKyspKSB7CisJCS8qIENhbid0IHJlYWQgdXNlcnNwYWNlIG1lbW9yeSBmb3Igc2l6ZSAqLworCQlyZXR1cm4gMDsKKwl9CisKKwl3aGlsZSAoYyAhPSAwKSB7CisJCWlmIChnZXRfdXNlcihjLCBzKyspKSB7CisJCQkvKiBDYW4ndCByZWFkIHVzZXJzcGFjZSBtZW1vcnkgZm9yIHNpemUgKi8KKwkJCXJldHVybiAwOworCQl9CisJCWxlbiArPSBzaXplb2YoZWZpX2NoYXIxNl90KTsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworLyoKKyAqIEFsbG9jYXRlIGEgYnVmZmVyIGFuZCBjb3B5IGEgdWNzMiBzdHJpbmcgZnJvbSB1c2VyIHNwYWNlIGludG8gaXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Citjb3B5X3VjczJfZnJvbV91c2VyX2xlbihlZmlfY2hhcjE2X3QgKipkc3QsIGVmaV9jaGFyMTZfdCBfX3VzZXIgKnNyYywKKwkJCXNpemVfdCBsZW4pCit7CisJZWZpX2NoYXIxNl90ICpidWY7CisKKwlpZiAoIXNyYykgeworCQkqZHN0ID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHNyYywgMSkpCisJCXJldHVybiAtRUZBVUxUOworCisJYnVmID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCWlmICghYnVmKSB7CisJCSpkc3QgPSBOVUxMOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJKmRzdCA9IGJ1ZjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigqZHN0LCBzcmMsIGxlbikpIHsKKwkJa2ZyZWUoYnVmKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDb3VudCB0aGUgYnl0ZXMgaW4gJ3N0cicsIGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgTlVMTC4KKyAqCisgKiBKdXN0IGEgd3JhcCBmb3IgdXNlcl91Y3MyX3N0cnNpemUKKyAqLworc3RhdGljIGlubGluZSBpbnQKK2dldF91Y3MyX3N0cnNpemVfZnJvbV91c2VyKGVmaV9jaGFyMTZfdCBfX3VzZXIgKnNyYywgc2l6ZV90ICpsZW4pCit7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHNyYywgMSkpCisJCXJldHVybiAtRUZBVUxUOworCisJKmxlbiA9IHVzZXJfdWNzMl9zdHJzaXplKHNyYyk7CisJaWYgKCpsZW4gPT0gMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENhbGN1bGF0ZSB0aGUgcmVxdWlyZWQgYnVmZmVyIGFsbG9jYXRpb24gc2l6ZSBhbmQgY29weSBhIHVjczIgc3RyaW5nCisgKiBmcm9tIHVzZXIgc3BhY2UgaW50byBpdC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRpZmZlcnMgZnJvbSBjb3B5X3VjczJfZnJvbV91c2VyX2xlbigpIGJlY2F1c2UgaXQKKyAqIGNhbGN1bGF0ZXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciB0byBhbGxvY2F0ZSBieSB0YWtpbmcgdGhlIGxlbmd0aCBvZgorICogdGhlIHN0cmluZyAnc3JjJy4KKyAqCisgKiBJZiBhIG5vbi16ZXJvIHZhbHVlIGlzIHJldHVybmVkLCB0aGUgY2FsbGVyIE1VU1QgTk9UIGFjY2VzcyAnZHN0Jy4KKyAqCisgKiBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZnJlZSAnZHN0Jy4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK2NvcHlfdWNzMl9mcm9tX3VzZXIoZWZpX2NoYXIxNl90ICoqZHN0LCBlZmlfY2hhcjE2X3QgX191c2VyICpzcmMpCit7CisJc2l6ZV90IGxlbjsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBzcmMsIDEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWxlbiA9IHVzZXJfdWNzMl9zdHJzaXplKHNyYyk7CisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gY29weV91Y3MyX2Zyb21fdXNlcl9sZW4oZHN0LCBzcmMsIGxlbik7Cit9CisKKy8qCisgKiBDb3B5IGEgdWNzMiBzdHJpbmcgdG8gYSB1c2VyIGJ1ZmZlci4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGEgc2ltcGxlIHdyYXBwZXIgYXJvdW5kIGNvcHlfdG9fdXNlcigpIHRoYXQgZG9lcworICogbm90aGluZyBpZiAnc3JjJyBpcyBOVUxMLCB3aGljaCBpcyB1c2VmdWwgZm9yIHJlZHVjaW5nIHRoZSBhbW91bnQgb2YKKyAqIE5VTEwgY2hlY2tpbmcgdGhlIGNhbGxlciBoYXMgdG8gZG8uCisgKgorICogJ2xlbicgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weS4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK2NvcHlfdWNzMl90b191c2VyX2xlbihlZmlfY2hhcjE2X3QgX191c2VyICpkc3QsIGVmaV9jaGFyMTZfdCAqc3JjLCBzaXplX3QgbGVuKQoreworCWlmICghc3JjKQorCQlyZXR1cm4gMDsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZHN0LCAxKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gY29weV90b191c2VyKGRzdCwgc3JjLCBsZW4pOworfQorCitzdGF0aWMgbG9uZyBlZmlfcnVudGltZV9nZXRfdmFyaWFibGUodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGVmaV9nZXR2YXJpYWJsZSBfX3VzZXIgKmdldHZhcmlhYmxlX3VzZXI7CisJc3RydWN0IGVmaV9nZXR2YXJpYWJsZSBnZXR2YXJpYWJsZTsKKwl1bnNpZ25lZCBsb25nIGRhdGFzaXplLCBwcmV2X2RhdGFzaXplLCAqZHo7CisJZWZpX2d1aWRfdCB2ZW5kb3JfZ3VpZCwgKnZkID0gTlVMTDsKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCWVmaV9jaGFyMTZfdCAqbmFtZSA9IE5VTEw7CisJdTMyIGF0dHIsICphdDsKKwl2b2lkICpkYXRhID0gTlVMTDsKKwlpbnQgcnYgPSAwOworCisJZ2V0dmFyaWFibGVfdXNlciA9IChzdHJ1Y3QgZWZpX2dldHZhcmlhYmxlIF9fdXNlciAqKWFyZzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZ2V0dmFyaWFibGUsIGdldHZhcmlhYmxlX3VzZXIsCisJCQkgICBzaXplb2YoZ2V0dmFyaWFibGUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGdldHZhcmlhYmxlLmRhdGFfc2l6ZSAmJgorCSAgICBnZXRfdXNlcihkYXRhc2l6ZSwgZ2V0dmFyaWFibGUuZGF0YV9zaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGdldHZhcmlhYmxlLnZlbmRvcl9ndWlkKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdmVuZG9yX2d1aWQsIGdldHZhcmlhYmxlLnZlbmRvcl9ndWlkLAorCQkJCQlzaXplb2YodmVuZG9yX2d1aWQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl2ZCA9ICZ2ZW5kb3JfZ3VpZDsKKwl9CisKKwlpZiAoZ2V0dmFyaWFibGUudmFyaWFibGVfbmFtZSkgeworCQlydiA9IGNvcHlfdWNzMl9mcm9tX3VzZXIoJm5hbWUsIGdldHZhcmlhYmxlLnZhcmlhYmxlX25hbWUpOworCQlpZiAocnYpCisJCQlyZXR1cm4gcnY7CisJfQorCisJYXQgPSBnZXR2YXJpYWJsZS5hdHRyaWJ1dGVzID8gJmF0dHIgOiBOVUxMOworCWR6ID0gZ2V0dmFyaWFibGUuZGF0YV9zaXplID8gJmRhdGFzaXplIDogTlVMTDsKKworCWlmIChnZXR2YXJpYWJsZS5kYXRhX3NpemUgJiYgZ2V0dmFyaWFibGUuZGF0YSkgeworCQlkYXRhID0ga21hbGxvYyhkYXRhc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZGF0YSkgeworCQkJa2ZyZWUobmFtZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCXByZXZfZGF0YXNpemUgPSBkYXRhc2l6ZTsKKwlzdGF0dXMgPSBlZmkuZ2V0X3ZhcmlhYmxlKG5hbWUsIHZkLCBhdCwgZHosIGRhdGEpOworCWtmcmVlKG5hbWUpOworCisJaWYgKHB1dF91c2VyKHN0YXR1cywgZ2V0dmFyaWFibGUuc3RhdHVzKSkgeworCQlydiA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKKwkJaWYgKHN0YXR1cyA9PSBFRklfQlVGRkVSX1RPT19TTUFMTCkgeworCQkJaWYgKGR6ICYmIHB1dF91c2VyKGRhdGFzaXplLCBnZXR2YXJpYWJsZS5kYXRhX3NpemUpKSB7CisJCQkJcnYgPSAtRUZBVUxUOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJCXJ2ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHByZXZfZGF0YXNpemUgPCBkYXRhc2l6ZSkgeworCQlydiA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChkYXRhKSB7CisJCWlmIChjb3B5X3RvX3VzZXIoZ2V0dmFyaWFibGUuZGF0YSwgZGF0YSwgZGF0YXNpemUpKSB7CisJCQlydiA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmIChhdCAmJiBwdXRfdXNlcihhdHRyLCBnZXR2YXJpYWJsZS5hdHRyaWJ1dGVzKSkgeworCQlydiA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChkeiAmJiBwdXRfdXNlcihkYXRhc2l6ZSwgZ2V0dmFyaWFibGUuZGF0YV9zaXplKSkKKwkJcnYgPSAtRUZBVUxUOworCitvdXQ6CisJa2ZyZWUoZGF0YSk7CisJcmV0dXJuIHJ2OworCit9CisKK3N0YXRpYyBsb25nIGVmaV9ydW50aW1lX3NldF92YXJpYWJsZSh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZWZpX3NldHZhcmlhYmxlIF9fdXNlciAqc2V0dmFyaWFibGVfdXNlcjsKKwlzdHJ1Y3QgZWZpX3NldHZhcmlhYmxlIHNldHZhcmlhYmxlOworCWVmaV9ndWlkX3QgdmVuZG9yX2d1aWQ7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwllZmlfY2hhcjE2X3QgKm5hbWUgPSBOVUxMOworCXZvaWQgKmRhdGE7CisJaW50IHJ2ID0gMDsKKworCXNldHZhcmlhYmxlX3VzZXIgPSAoc3RydWN0IGVmaV9zZXR2YXJpYWJsZSBfX3VzZXIgKilhcmc7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnNldHZhcmlhYmxlLCBzZXR2YXJpYWJsZV91c2VyLCBzaXplb2Yoc2V0dmFyaWFibGUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZ2ZW5kb3JfZ3VpZCwgc2V0dmFyaWFibGUudmVuZG9yX2d1aWQsCisJCQkJc2l6ZW9mKHZlbmRvcl9ndWlkKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKHNldHZhcmlhYmxlLnZhcmlhYmxlX25hbWUpIHsKKwkJcnYgPSBjb3B5X3VjczJfZnJvbV91c2VyKCZuYW1lLCBzZXR2YXJpYWJsZS52YXJpYWJsZV9uYW1lKTsKKwkJaWYgKHJ2KQorCQkJcmV0dXJuIHJ2OworCX0KKworCWRhdGEgPSBrbWFsbG9jKHNldHZhcmlhYmxlLmRhdGFfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKSB7CisJCWtmcmVlKG5hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKGRhdGEsIHNldHZhcmlhYmxlLmRhdGEsIHNldHZhcmlhYmxlLmRhdGFfc2l6ZSkpIHsKKwkJcnYgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisKKwlzdGF0dXMgPSBlZmkuc2V0X3ZhcmlhYmxlKG5hbWUsICZ2ZW5kb3JfZ3VpZCwKKwkJCQlzZXR2YXJpYWJsZS5hdHRyaWJ1dGVzLAorCQkJCXNldHZhcmlhYmxlLmRhdGFfc2l6ZSwgZGF0YSk7CisKKwlpZiAocHV0X3VzZXIoc3RhdHVzLCBzZXR2YXJpYWJsZS5zdGF0dXMpKSB7CisJCXJ2ID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCisJcnYgPSBzdGF0dXMgPT0gRUZJX1NVQ0NFU1MgPyAwIDogLUVJTlZBTDsKKworb3V0OgorCWtmcmVlKGRhdGEpOworCWtmcmVlKG5hbWUpOworCisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgbG9uZyBlZmlfcnVudGltZV9nZXRfdGltZSh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZWZpX2dldHRpbWUgX191c2VyICpnZXR0aW1lX3VzZXI7CisJc3RydWN0IGVmaV9nZXR0aW1lICBnZXR0aW1lOworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJZWZpX3RpbWVfY2FwX3QgY2FwOworCWVmaV90aW1lX3QgZWZpX3RpbWU7CisKKwlnZXR0aW1lX3VzZXIgPSAoc3RydWN0IGVmaV9nZXR0aW1lIF9fdXNlciAqKWFyZzsKKwlpZiAoY29weV9mcm9tX3VzZXIoJmdldHRpbWUsIGdldHRpbWVfdXNlciwgc2l6ZW9mKGdldHRpbWUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzdGF0dXMgPSBlZmkuZ2V0X3RpbWUoZ2V0dGltZS50aW1lID8gJmVmaV90aW1lIDogTlVMTCwKKwkJCSAgICAgIGdldHRpbWUuY2FwYWJpbGl0aWVzID8gJmNhcCA6IE5VTEwpOworCisJaWYgKHB1dF91c2VyKHN0YXR1cywgZ2V0dGltZS5zdGF0dXMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGdldHRpbWUuY2FwYWJpbGl0aWVzKSB7CisJCWVmaV90aW1lX2NhcF90IF9fdXNlciAqY2FwX2xvY2FsOworCisJCWNhcF9sb2NhbCA9IChlZmlfdGltZV9jYXBfdCAqKWdldHRpbWUuY2FwYWJpbGl0aWVzOworCQlpZiAocHV0X3VzZXIoY2FwLnJlc29sdXRpb24sICYoY2FwX2xvY2FsLT5yZXNvbHV0aW9uKSkgfHwKKwkJCXB1dF91c2VyKGNhcC5hY2N1cmFjeSwgJihjYXBfbG9jYWwtPmFjY3VyYWN5KSkgfHwKKwkJCXB1dF91c2VyKGNhcC5zZXRzX3RvX3plcm8sICYoY2FwX2xvY2FsLT5zZXRzX3RvX3plcm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwlpZiAoZ2V0dGltZS50aW1lKSB7CisJCWlmIChjb3B5X3RvX3VzZXIoZ2V0dGltZS50aW1lLCAmZWZpX3RpbWUsIHNpemVvZihlZmlfdGltZV90KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgZWZpX3J1bnRpbWVfc2V0X3RpbWUodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGVmaV9zZXR0aW1lIF9fdXNlciAqc2V0dGltZV91c2VyOworCXN0cnVjdCBlZmlfc2V0dGltZSBzZXR0aW1lOworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJZWZpX3RpbWVfdCBlZmlfdGltZTsKKworCXNldHRpbWVfdXNlciA9IChzdHJ1Y3QgZWZpX3NldHRpbWUgX191c2VyICopYXJnOworCWlmIChjb3B5X2Zyb21fdXNlcigmc2V0dGltZSwgc2V0dGltZV91c2VyLCBzaXplb2Yoc2V0dGltZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoY29weV9mcm9tX3VzZXIoJmVmaV90aW1lLCBzZXR0aW1lLnRpbWUsCisJCQkJCXNpemVvZihlZmlfdGltZV90KSkpCisJCXJldHVybiAtRUZBVUxUOworCXN0YXR1cyA9IGVmaS5zZXRfdGltZSgmZWZpX3RpbWUpOworCisJaWYgKHB1dF91c2VyKHN0YXR1cywgc2V0dGltZS5zdGF0dXMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBzdGF0dXMgPT0gRUZJX1NVQ0NFU1MgPyAwIDogLUVJTlZBTDsKK30KKworc3RhdGljIGxvbmcgZWZpX3J1bnRpbWVfZ2V0X3dha2V0aW1lKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBlZmlfZ2V0d2FrZXVwdGltZSBfX3VzZXIgKmdldHdha2V1cHRpbWVfdXNlcjsKKwlzdHJ1Y3QgZWZpX2dldHdha2V1cHRpbWUgZ2V0d2FrZXVwdGltZTsKKwllZmlfYm9vbF90IGVuYWJsZWQsIHBlbmRpbmc7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwllZmlfdGltZV90IGVmaV90aW1lOworCisJZ2V0d2FrZXVwdGltZV91c2VyID0gKHN0cnVjdCBlZmlfZ2V0d2FrZXVwdGltZSBfX3VzZXIgKilhcmc7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZnZXR3YWtldXB0aW1lLCBnZXR3YWtldXB0aW1lX3VzZXIsCisJCQkJc2l6ZW9mKGdldHdha2V1cHRpbWUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzdGF0dXMgPSBlZmkuZ2V0X3dha2V1cF90aW1lKAorCQlnZXR3YWtldXB0aW1lLmVuYWJsZWQgPyAoZWZpX2Jvb2xfdCAqKSZlbmFibGVkIDogTlVMTCwKKwkJZ2V0d2FrZXVwdGltZS5wZW5kaW5nID8gKGVmaV9ib29sX3QgKikmcGVuZGluZyA6IE5VTEwsCisJCWdldHdha2V1cHRpbWUudGltZSA/ICZlZmlfdGltZSA6IE5VTEwpOworCisJaWYgKHB1dF91c2VyKHN0YXR1cywgZ2V0d2FrZXVwdGltZS5zdGF0dXMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGdldHdha2V1cHRpbWUuZW5hYmxlZCAmJiBwdXRfdXNlcihlbmFibGVkLAorCQkJCQkJZ2V0d2FrZXVwdGltZS5lbmFibGVkKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoZ2V0d2FrZXVwdGltZS50aW1lKSB7CisJCWlmIChjb3B5X3RvX3VzZXIoZ2V0d2FrZXVwdGltZS50aW1lLCAmZWZpX3RpbWUsCisJCQkJc2l6ZW9mKGVmaV90aW1lX3QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgbG9uZyBlZmlfcnVudGltZV9zZXRfd2FrZXRpbWUodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGVmaV9zZXR3YWtldXB0aW1lIF9fdXNlciAqc2V0d2FrZXVwdGltZV91c2VyOworCXN0cnVjdCBlZmlfc2V0d2FrZXVwdGltZSBzZXR3YWtldXB0aW1lOworCWVmaV9ib29sX3QgZW5hYmxlZDsKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCWVmaV90aW1lX3QgZWZpX3RpbWU7CisKKwlzZXR3YWtldXB0aW1lX3VzZXIgPSAoc3RydWN0IGVmaV9zZXR3YWtldXB0aW1lIF9fdXNlciAqKWFyZzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmc2V0d2FrZXVwdGltZSwgc2V0d2FrZXVwdGltZV91c2VyLAorCQkJCXNpemVvZihzZXR3YWtldXB0aW1lKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZW5hYmxlZCA9IHNldHdha2V1cHRpbWUuZW5hYmxlZDsKKwlpZiAoc2V0d2FrZXVwdGltZS50aW1lKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmZWZpX3RpbWUsIHNldHdha2V1cHRpbWUudGltZSwKKwkJCQkJc2l6ZW9mKGVmaV90aW1lX3QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXN0YXR1cyA9IGVmaS5zZXRfd2FrZXVwX3RpbWUoZW5hYmxlZCwgJmVmaV90aW1lKTsKKwl9IGVsc2UKKwkJc3RhdHVzID0gZWZpLnNldF93YWtldXBfdGltZShlbmFibGVkLCBOVUxMKTsKKworCWlmIChwdXRfdXNlcihzdGF0dXMsIHNldHdha2V1cHRpbWUuc3RhdHVzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gc3RhdHVzID09IEVGSV9TVUNDRVNTID8gMCA6IC1FSU5WQUw7Cit9CisKK3N0YXRpYyBsb25nIGVmaV9ydW50aW1lX2dldF9uZXh0dmFyaWFibGVuYW1lKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBlZmlfZ2V0bmV4dHZhcmlhYmxlbmFtZSBfX3VzZXIgKmdldG5leHR2YXJpYWJsZW5hbWVfdXNlcjsKKwlzdHJ1Y3QgZWZpX2dldG5leHR2YXJpYWJsZW5hbWUgZ2V0bmV4dHZhcmlhYmxlbmFtZTsKKwl1bnNpZ25lZCBsb25nIG5hbWVfc2l6ZSwgcHJldl9uYW1lX3NpemUgPSAwLCAqbnMgPSBOVUxMOworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJZWZpX2d1aWRfdCAqdmQgPSBOVUxMOworCWVmaV9ndWlkX3QgdmVuZG9yX2d1aWQ7CisJZWZpX2NoYXIxNl90ICpuYW1lID0gTlVMTDsKKwlpbnQgcnY7CisKKwlnZXRuZXh0dmFyaWFibGVuYW1lX3VzZXIgPSAoc3RydWN0IGVmaV9nZXRuZXh0dmFyaWFibGVuYW1lIF9fdXNlciAqKWFyZzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZ2V0bmV4dHZhcmlhYmxlbmFtZSwgZ2V0bmV4dHZhcmlhYmxlbmFtZV91c2VyLAorCQkJICAgc2l6ZW9mKGdldG5leHR2YXJpYWJsZW5hbWUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoZ2V0bmV4dHZhcmlhYmxlbmFtZS52YXJpYWJsZV9uYW1lX3NpemUpIHsKKwkJaWYgKGdldF91c2VyKG5hbWVfc2l6ZSwgZ2V0bmV4dHZhcmlhYmxlbmFtZS52YXJpYWJsZV9uYW1lX3NpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCW5zID0gJm5hbWVfc2l6ZTsKKwkJcHJldl9uYW1lX3NpemUgPSBuYW1lX3NpemU7CisJfQorCisJaWYgKGdldG5leHR2YXJpYWJsZW5hbWUudmVuZG9yX2d1aWQpIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2ZW5kb3JfZ3VpZCwKKwkJCQlnZXRuZXh0dmFyaWFibGVuYW1lLnZlbmRvcl9ndWlkLAorCQkJCXNpemVvZih2ZW5kb3JfZ3VpZCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXZkID0gJnZlbmRvcl9ndWlkOworCX0KKworCWlmIChnZXRuZXh0dmFyaWFibGVuYW1lLnZhcmlhYmxlX25hbWUpIHsKKwkJc2l6ZV90IG5hbWVfc3RyaW5nX3NpemUgPSAwOworCisJCXJ2ID0gZ2V0X3VjczJfc3Ryc2l6ZV9mcm9tX3VzZXIoCisJCQkJZ2V0bmV4dHZhcmlhYmxlbmFtZS52YXJpYWJsZV9uYW1lLAorCQkJCSZuYW1lX3N0cmluZ19zaXplKTsKKwkJaWYgKHJ2KQorCQkJcmV0dXJuIHJ2OworCQkvKgorCQkgKiBUaGUgbmFtZV9zaXplIG1heSBiZSBzbWFsbGVyIHRoYW4gdGhlIHJlYWwgYnVmZmVyIHNpemUgd2hlcmUKKwkJICogdmFyaWFibGUgbmFtZSBsb2NhdGVkIGluIHNvbWUgdXNlIGNhc2VzLiBUaGUgbW9zdCB0eXBpY2FsCisJCSAqIGNhc2UgaXMgcGFzc2luZyBhIDAgdG8gZ2V0IHRoZSByZXF1aXJlZCBidWZmZXIgc2l6ZSBmb3IgdGhlCisJCSAqIDFzdCB0aW1lIGNhbGwuIFNvIHdlIG5lZWQgdG8gY29weSB0aGUgY29udGVudCBmcm9tIHVzZXIKKwkJICogc3BhY2UgZm9yIGF0IGxlYXN0IHRoZSBzdHJpbmcgc2l6ZSBvZiB2YXJpYWJsZSBuYW1lLCBvciBlbHNlCisJCSAqIHRoZSBuYW1lIHBhc3NlZCB0byBVRUZJIG1heSBub3QgYmUgdGVybWluYXRlZCBhcyB3ZSBleHBlY3RlZC4KKwkJICovCisJCXJ2ID0gY29weV91Y3MyX2Zyb21fdXNlcl9sZW4oJm5hbWUsCisJCQkJZ2V0bmV4dHZhcmlhYmxlbmFtZS52YXJpYWJsZV9uYW1lLAorCQkJCXByZXZfbmFtZV9zaXplID4gbmFtZV9zdHJpbmdfc2l6ZSA/CisJCQkJcHJldl9uYW1lX3NpemUgOiBuYW1lX3N0cmluZ19zaXplKTsKKwkJaWYgKHJ2KQorCQkJcmV0dXJuIHJ2OworCX0KKworCXN0YXR1cyA9IGVmaS5nZXRfbmV4dF92YXJpYWJsZShucywgbmFtZSwgdmQpOworCisJaWYgKHB1dF91c2VyKHN0YXR1cywgZ2V0bmV4dHZhcmlhYmxlbmFtZS5zdGF0dXMpKSB7CisJCXJ2ID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgeworCQlpZiAoc3RhdHVzID09IEVGSV9CVUZGRVJfVE9PX1NNQUxMKSB7CisJCQlpZiAobnMgJiYgcHV0X3VzZXIoKm5zLAorCQkJCWdldG5leHR2YXJpYWJsZW5hbWUudmFyaWFibGVfbmFtZV9zaXplKSkgeworCQkJCXJ2ID0gLUVGQVVMVDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQlydiA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChuYW1lKSB7CisJCWlmIChjb3B5X3VjczJfdG9fdXNlcl9sZW4oZ2V0bmV4dHZhcmlhYmxlbmFtZS52YXJpYWJsZV9uYW1lLAorCQkJCQkJbmFtZSwgcHJldl9uYW1lX3NpemUpKSB7CisJCQlydiA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmIChucykgeworCQlpZiAocHV0X3VzZXIoKm5zLCBnZXRuZXh0dmFyaWFibGVuYW1lLnZhcmlhYmxlX25hbWVfc2l6ZSkpIHsKKwkJCXJ2ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKHZkKSB7CisJCWlmIChjb3B5X3RvX3VzZXIoZ2V0bmV4dHZhcmlhYmxlbmFtZS52ZW5kb3JfZ3VpZCwgdmQsCisJCQkJCQkJc2l6ZW9mKGVmaV9ndWlkX3QpKSkKKwkJCXJ2ID0gLUVGQVVMVDsKKwl9CisKK291dDoKKwlrZnJlZShuYW1lKTsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBsb25nIGVmaV9ydW50aW1lX2dldF9uZXh0aGlnaG1vbm9jb3VudCh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZWZpX2dldG5leHRoaWdobW9ub3RvbmljY291bnQgX191c2VyICpnZXRuZXh0aGlnaG1vbm9jb3VudF91c2VyOworCXN0cnVjdCBlZmlfZ2V0bmV4dGhpZ2htb25vdG9uaWNjb3VudCBnZXRuZXh0aGlnaG1vbm9jb3VudDsKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCXUzMiBjb3VudDsKKworCWdldG5leHRoaWdobW9ub2NvdW50X3VzZXIgPSAoc3RydWN0CisJCQllZmlfZ2V0bmV4dGhpZ2htb25vdG9uaWNjb3VudCBfX3VzZXIgKilhcmc7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmdldG5leHRoaWdobW9ub2NvdW50LAorCQkJICAgZ2V0bmV4dGhpZ2htb25vY291bnRfdXNlciwKKwkJCSAgIHNpemVvZihnZXRuZXh0aGlnaG1vbm9jb3VudCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN0YXR1cyA9IGVmaS5nZXRfbmV4dF9oaWdoX21vbm9fY291bnQoCisJCWdldG5leHRoaWdobW9ub2NvdW50LmhpZ2hfY291bnQgPyAmY291bnQgOiBOVUxMKTsKKworCWlmIChwdXRfdXNlcihzdGF0dXMsIGdldG5leHRoaWdobW9ub2NvdW50LnN0YXR1cykpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZ2V0bmV4dGhpZ2htb25vY291bnQuaGlnaF9jb3VudCAmJgorCSAgICBwdXRfdXNlcihjb3VudCwgZ2V0bmV4dGhpZ2htb25vY291bnQuaGlnaF9jb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nIGVmaV9ydW50aW1lX3F1ZXJ5X3ZhcmlhYmxlaW5mbyh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZWZpX3F1ZXJ5dmFyaWFibGVpbmZvIF9fdXNlciAqcXVlcnl2YXJpYWJsZWluZm9fdXNlcjsKKwlzdHJ1Y3QgZWZpX3F1ZXJ5dmFyaWFibGVpbmZvIHF1ZXJ5dmFyaWFibGVpbmZvOworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJdTY0IG1heF9zdG9yYWdlLCByZW1haW5pbmcsIG1heF9zaXplOworCisJcXVlcnl2YXJpYWJsZWluZm9fdXNlciA9IChzdHJ1Y3QgZWZpX3F1ZXJ5dmFyaWFibGVpbmZvIF9fdXNlciAqKWFyZzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcXVlcnl2YXJpYWJsZWluZm8sIHF1ZXJ5dmFyaWFibGVpbmZvX3VzZXIsCisJCQkgICBzaXplb2YocXVlcnl2YXJpYWJsZWluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzdGF0dXMgPSBlZmkucXVlcnlfdmFyaWFibGVfaW5mbyhxdWVyeXZhcmlhYmxlaW5mby5hdHRyaWJ1dGVzLAorCQkJCQkgJm1heF9zdG9yYWdlLCAmcmVtYWluaW5nLCAmbWF4X3NpemUpOworCisJaWYgKHB1dF91c2VyKHN0YXR1cywgcXVlcnl2YXJpYWJsZWluZm8uc3RhdHVzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwdXRfdXNlcihtYXhfc3RvcmFnZSwKKwkJICAgICBxdWVyeXZhcmlhYmxlaW5mby5tYXhpbXVtX3ZhcmlhYmxlX3N0b3JhZ2Vfc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKHB1dF91c2VyKHJlbWFpbmluZywKKwkJICAgICBxdWVyeXZhcmlhYmxlaW5mby5yZW1haW5pbmdfdmFyaWFibGVfc3RvcmFnZV9zaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAocHV0X3VzZXIobWF4X3NpemUsIHF1ZXJ5dmFyaWFibGVpbmZvLm1heGltdW1fdmFyaWFibGVfc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nIGVmaV9ydW50aW1lX3F1ZXJ5X2NhcHN1bGVjYXBzKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBlZmlfcXVlcnljYXBzdWxlY2FwYWJpbGl0aWVzIF9fdXNlciAqcWNhcHNfdXNlcjsKKwlzdHJ1Y3QgZWZpX3F1ZXJ5Y2Fwc3VsZWNhcGFiaWxpdGllcyBxY2FwczsKKwllZmlfY2Fwc3VsZV9oZWFkZXJfdCAqY2Fwc3VsZXM7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwl1NjQgbWF4X3NpemU7CisJaW50IGksIHJlc2V0X3R5cGU7CisJaW50IHJ2ID0gMDsKKworCXFjYXBzX3VzZXIgPSAoc3RydWN0IGVmaV9xdWVyeWNhcHN1bGVjYXBhYmlsaXRpZXMgX191c2VyICopYXJnOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZxY2FwcywgcWNhcHNfdXNlciwgc2l6ZW9mKHFjYXBzKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJY2Fwc3VsZXMgPSBrY2FsbG9jKHFjYXBzLmNhcHN1bGVfY291bnQgKyAxLAorCQkJICAgc2l6ZW9mKGVmaV9jYXBzdWxlX2hlYWRlcl90KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjYXBzdWxlcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgcWNhcHMuY2Fwc3VsZV9jb3VudDsgaSsrKSB7CisJCWVmaV9jYXBzdWxlX2hlYWRlcl90ICpjOworCQkvKgorCQkgKiBXZSBjYW5ub3QgZGVyZWZlcmVuY2UgcWNhcHMuY2Fwc3VsZV9oZWFkZXJfYXJyYXkgZGlyZWN0bHkgdG8KKwkJICogb2J0YWluIHRoZSBhZGRyZXNzIG9mIHRoZSBjYXBzdWxlIGFzIGl0IHJlc2lkZXMgaW4gdGhlCisJCSAqIHVzZXIgc3BhY2UKKwkJICovCisJCWlmIChnZXRfdXNlcihjLCBxY2Fwcy5jYXBzdWxlX2hlYWRlcl9hcnJheSArIGkpKSB7CisJCQlydiA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIoJmNhcHN1bGVzW2ldLCBjLAorCQkJCXNpemVvZihlZmlfY2Fwc3VsZV9oZWFkZXJfdCkpKSB7CisJCQlydiA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCXFjYXBzLmNhcHN1bGVfaGVhZGVyX2FycmF5ID0gJmNhcHN1bGVzOworCisJc3RhdHVzID0gZWZpLnF1ZXJ5X2NhcHN1bGVfY2FwcygoZWZpX2NhcHN1bGVfaGVhZGVyX3QgKiopCisJCQkJCXFjYXBzLmNhcHN1bGVfaGVhZGVyX2FycmF5LAorCQkJCQlxY2Fwcy5jYXBzdWxlX2NvdW50LAorCQkJCQkmbWF4X3NpemUsICZyZXNldF90eXBlKTsKKworCWlmIChwdXRfdXNlcihzdGF0dXMsIHFjYXBzLnN0YXR1cykpIHsKKwkJcnYgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CisJCXJ2ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHB1dF91c2VyKG1heF9zaXplLCBxY2Fwcy5tYXhpbXVtX2NhcHN1bGVfc2l6ZSkpIHsKKwkJcnYgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocHV0X3VzZXIocmVzZXRfdHlwZSwgcWNhcHMucmVzZXRfdHlwZSkpCisJCXJ2ID0gLUVGQVVMVDsKKworb3V0OgorCWtmcmVlKGNhcHN1bGVzKTsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBsb25nIGVmaV90ZXN0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBFRklfUlVOVElNRV9HRVRfVkFSSUFCTEU6CisJCXJldHVybiBlZmlfcnVudGltZV9nZXRfdmFyaWFibGUoYXJnKTsKKworCWNhc2UgRUZJX1JVTlRJTUVfU0VUX1ZBUklBQkxFOgorCQlyZXR1cm4gZWZpX3J1bnRpbWVfc2V0X3ZhcmlhYmxlKGFyZyk7CisKKwljYXNlIEVGSV9SVU5USU1FX0dFVF9USU1FOgorCQlyZXR1cm4gZWZpX3J1bnRpbWVfZ2V0X3RpbWUoYXJnKTsKKworCWNhc2UgRUZJX1JVTlRJTUVfU0VUX1RJTUU6CisJCXJldHVybiBlZmlfcnVudGltZV9zZXRfdGltZShhcmcpOworCisJY2FzZSBFRklfUlVOVElNRV9HRVRfV0FLRVRJTUU6CisJCXJldHVybiBlZmlfcnVudGltZV9nZXRfd2FrZXRpbWUoYXJnKTsKKworCWNhc2UgRUZJX1JVTlRJTUVfU0VUX1dBS0VUSU1FOgorCQlyZXR1cm4gZWZpX3J1bnRpbWVfc2V0X3dha2V0aW1lKGFyZyk7CisKKwljYXNlIEVGSV9SVU5USU1FX0dFVF9ORVhUVkFSSUFCTEVOQU1FOgorCQlyZXR1cm4gZWZpX3J1bnRpbWVfZ2V0X25leHR2YXJpYWJsZW5hbWUoYXJnKTsKKworCWNhc2UgRUZJX1JVTlRJTUVfR0VUX05FWFRISUdITU9OT1RPTklDQ09VTlQ6CisJCXJldHVybiBlZmlfcnVudGltZV9nZXRfbmV4dGhpZ2htb25vY291bnQoYXJnKTsKKworCWNhc2UgRUZJX1JVTlRJTUVfUVVFUllfVkFSSUFCTEVJTkZPOgorCQlyZXR1cm4gZWZpX3J1bnRpbWVfcXVlcnlfdmFyaWFibGVpbmZvKGFyZyk7CisKKwljYXNlIEVGSV9SVU5USU1FX1FVRVJZX0NBUFNVTEVDQVBBQklMSVRJRVM6CisJCXJldHVybiBlZmlfcnVudGltZV9xdWVyeV9jYXBzdWxlY2FwcyhhcmcpOworCX0KKworCXJldHVybiAtRU5PVFRZOworfQorCitzdGF0aWMgaW50IGVmaV90ZXN0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyoKKwkgKiBub3RoaW5nIHNwZWNpYWwgdG8gZG8gaGVyZQorCSAqIFdlIGRvIGFjY2VwdCBtdWx0aXBsZSBvcGVuIGZpbGVzIGF0IHRoZSBzYW1lIHRpbWUgYXMgd2UKKwkgKiBzeW5jaHJvbml6ZSBvbiB0aGUgcGVyIGNhbGwgb3BlcmF0aW9uLgorCSAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVmaV90ZXN0X2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiAwOworfQorCisvKgorICoJVGhlIHZhcmlvdXMgZmlsZSBvcGVyYXRpb25zIHdlIHN1cHBvcnQuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVmaV90ZXN0X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS51bmxvY2tlZF9pb2N0bAk9IGVmaV90ZXN0X2lvY3RsLAorCS5vcGVuCQk9IGVmaV90ZXN0X29wZW4sCisJLnJlbGVhc2UJPSBlZmlfdGVzdF9jbG9zZSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBlZmlfdGVzdF9kZXYgPSB7CisJTUlTQ19EWU5BTUlDX01JTk9SLAorCSJlZmlfdGVzdCIsCisJJmVmaV90ZXN0X2ZvcHMKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGVmaV90ZXN0X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gbWlzY19yZWdpc3RlcigmZWZpX3Rlc3RfZGV2KTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiZWZpX3Rlc3Q6IGNhbid0IG1pc2NfcmVnaXN0ZXIgb24gbWlub3I9JWRcbiIsCisJCQlNSVNDX0RZTkFNSUNfTUlOT1IpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZWZpX3Rlc3RfZXhpdCh2b2lkKQoreworCW1pc2NfZGVyZWdpc3RlcigmZWZpX3Rlc3RfZGV2KTsKK30KKworbW9kdWxlX2luaXQoZWZpX3Rlc3RfaW5pdCk7Cittb2R1bGVfZXhpdChlZmlfdGVzdF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL3Rlc3QvZWZpX3Rlc3QuaCBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL3Rlc3QvZWZpX3Rlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzNhNmM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvdGVzdC9lZmlfdGVzdC5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogRUZJIFRlc3QgZHJpdmVyIEhlYWRlcgorICoKKyAqIENvcHlyaWdodChDKSAyMDEyLTIwMTYgQ2Fub25pY2FsIEx0ZC4KKyAqCisgKi8KKworI2lmbmRlZiBfRFJJVkVSU19GSVJNV0FSRV9FRklfVEVTVF9IXworI2RlZmluZSBfRFJJVkVSU19GSVJNV0FSRV9FRklfVEVTVF9IXworCisjaW5jbHVkZSA8bGludXgvZWZpLmg+CisKK3N0cnVjdCBlZmlfZ2V0dmFyaWFibGUgeworCWVmaV9jaGFyMTZfdAkqdmFyaWFibGVfbmFtZTsKKwllZmlfZ3VpZF90CSp2ZW5kb3JfZ3VpZDsKKwl1MzIJCSphdHRyaWJ1dGVzOworCXVuc2lnbmVkIGxvbmcJKmRhdGFfc2l6ZTsKKwl2b2lkCQkqZGF0YTsKKwllZmlfc3RhdHVzX3QJKnN0YXR1czsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBlZmlfc2V0dmFyaWFibGUgeworCWVmaV9jaGFyMTZfdAkqdmFyaWFibGVfbmFtZTsKKwllZmlfZ3VpZF90CSp2ZW5kb3JfZ3VpZDsKKwl1MzIJCWF0dHJpYnV0ZXM7CisJdW5zaWduZWQgbG9uZwlkYXRhX3NpemU7CisJdm9pZAkJKmRhdGE7CisJZWZpX3N0YXR1c190CSpzdGF0dXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZWZpX2dldG5leHR2YXJpYWJsZW5hbWUgeworCXVuc2lnbmVkIGxvbmcJKnZhcmlhYmxlX25hbWVfc2l6ZTsKKwllZmlfY2hhcjE2X3QJKnZhcmlhYmxlX25hbWU7CisJZWZpX2d1aWRfdAkqdmVuZG9yX2d1aWQ7CisJZWZpX3N0YXR1c190CSpzdGF0dXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZWZpX3F1ZXJ5dmFyaWFibGVpbmZvIHsKKwl1MzIJCWF0dHJpYnV0ZXM7CisJdTY0CQkqbWF4aW11bV92YXJpYWJsZV9zdG9yYWdlX3NpemU7CisJdTY0CQkqcmVtYWluaW5nX3ZhcmlhYmxlX3N0b3JhZ2Vfc2l6ZTsKKwl1NjQJCSptYXhpbXVtX3ZhcmlhYmxlX3NpemU7CisJZWZpX3N0YXR1c190CSpzdGF0dXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZWZpX2dldHRpbWUgeworCWVmaV90aW1lX3QJKnRpbWU7CisJZWZpX3RpbWVfY2FwX3QJKmNhcGFiaWxpdGllczsKKwllZmlfc3RhdHVzX3QJKnN0YXR1czsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBlZmlfc2V0dGltZSB7CisJZWZpX3RpbWVfdAkqdGltZTsKKwllZmlfc3RhdHVzX3QJKnN0YXR1czsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBlZmlfZ2V0d2FrZXVwdGltZSB7CisJZWZpX2Jvb2xfdAkqZW5hYmxlZDsKKwllZmlfYm9vbF90CSpwZW5kaW5nOworCWVmaV90aW1lX3QJKnRpbWU7CisJZWZpX3N0YXR1c190CSpzdGF0dXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZWZpX3NldHdha2V1cHRpbWUgeworCWVmaV9ib29sX3QJZW5hYmxlZDsKKwllZmlfdGltZV90CSp0aW1lOworCWVmaV9zdGF0dXNfdAkqc3RhdHVzOworfSBfX3BhY2tlZDsKKworc3RydWN0IGVmaV9nZXRuZXh0aGlnaG1vbm90b25pY2NvdW50IHsKKwl1MzIJCSpoaWdoX2NvdW50OworCWVmaV9zdGF0dXNfdAkqc3RhdHVzOworfSBfX3BhY2tlZDsKKworc3RydWN0IGVmaV9xdWVyeWNhcHN1bGVjYXBhYmlsaXRpZXMgeworCWVmaV9jYXBzdWxlX2hlYWRlcl90CSoqY2Fwc3VsZV9oZWFkZXJfYXJyYXk7CisJdW5zaWduZWQgbG9uZwkJY2Fwc3VsZV9jb3VudDsKKwl1NjQJCQkqbWF4aW11bV9jYXBzdWxlX3NpemU7CisJaW50CQkJKnJlc2V0X3R5cGU7CisJZWZpX3N0YXR1c190CQkqc3RhdHVzOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBFRklfUlVOVElNRV9HRVRfVkFSSUFCTEUgXAorCV9JT1dSKCdwJywgMHgwMSwgc3RydWN0IGVmaV9nZXR2YXJpYWJsZSkKKyNkZWZpbmUgRUZJX1JVTlRJTUVfU0VUX1ZBUklBQkxFIFwKKwlfSU9XKCdwJywgMHgwMiwgc3RydWN0IGVmaV9zZXR2YXJpYWJsZSkKKworI2RlZmluZSBFRklfUlVOVElNRV9HRVRfVElNRSBcCisJX0lPUigncCcsIDB4MDMsIHN0cnVjdCBlZmlfZ2V0dGltZSkKKyNkZWZpbmUgRUZJX1JVTlRJTUVfU0VUX1RJTUUgXAorCV9JT1coJ3AnLCAweDA0LCBzdHJ1Y3QgZWZpX3NldHRpbWUpCisKKyNkZWZpbmUgRUZJX1JVTlRJTUVfR0VUX1dBS0VUSU1FIFwKKwlfSU9SKCdwJywgMHgwNSwgc3RydWN0IGVmaV9nZXR3YWtldXB0aW1lKQorI2RlZmluZSBFRklfUlVOVElNRV9TRVRfV0FLRVRJTUUgXAorCV9JT1coJ3AnLCAweDA2LCBzdHJ1Y3QgZWZpX3NldHdha2V1cHRpbWUpCisKKyNkZWZpbmUgRUZJX1JVTlRJTUVfR0VUX05FWFRWQVJJQUJMRU5BTUUgXAorCV9JT1dSKCdwJywgMHgwNywgc3RydWN0IGVmaV9nZXRuZXh0dmFyaWFibGVuYW1lKQorCisjZGVmaW5lIEVGSV9SVU5USU1FX1FVRVJZX1ZBUklBQkxFSU5GTyBcCisJX0lPUigncCcsIDB4MDgsIHN0cnVjdCBlZmlfcXVlcnl2YXJpYWJsZWluZm8pCisKKyNkZWZpbmUgRUZJX1JVTlRJTUVfR0VUX05FWFRISUdITU9OT1RPTklDQ09VTlQgXAorCV9JT1IoJ3AnLCAweDA5LCBzdHJ1Y3QgZWZpX2dldG5leHRoaWdobW9ub3RvbmljY291bnQpCisKKyNkZWZpbmUgRUZJX1JVTlRJTUVfUVVFUllfQ0FQU1VMRUNBUEFCSUxJVElFUyBcCisJX0lPUigncCcsIDB4MEEsIHN0cnVjdCBlZmlfcXVlcnljYXBzdWxlY2FwYWJpbGl0aWVzKQorCisjZW5kaWYgLyogX0RSSVZFUlNfRklSTVdBUkVfRUZJX1RFU1RfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL3ZhcnMuYyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL3ZhcnMuYwppbmRleCBkM2I3NTEzLi45MzM2ZmZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS92YXJzLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvdmFycy5jCkBAIC0zNyw2ICszNywxNCBAQAogLyogUHJpdmF0ZSBwb2ludGVyIHRvIHJlZ2lzdGVyZWQgZWZpdmFycyAqLwogc3RhdGljIHN0cnVjdCBlZml2YXJzICpfX2VmaXZhcnM7CiAKKy8qCisgKiBlZml2YXJzX2xvY2sgcHJvdGVjdHMgdGhyZWUgdGhpbmdzOgorICogMSkgZWZpdmFyZnNfbGlzdCBhbmQgZWZpdmFyc19zeXNmc19saXN0CisgKiAyKSAtPm9wcyBjYWxscworICogMykgKHVuKXJlZ2lzdHJhdGlvbiBvZiBfX2VmaXZhcnMKKyAqLworc3RhdGljIERFRklORV9TRU1BUEhPUkUoZWZpdmFyc19sb2NrKTsKKwogc3RhdGljIGJvb2wgZWZpdmFyX3dxX2VuYWJsZWQgPSB0cnVlOwogREVDTEFSRV9XT1JLKGVmaXZhcl93b3JrLCBOVUxMKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGVmaXZhcl93b3JrKTsKQEAgLTQzNCw3ICs0NDIsMTAgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0Jc3Bpbl9sb2NrX2lycSgmX19lZml2YXJzLT5sb2NrKTsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZlZml2YXJzX2xvY2spKSB7CisJCWVyciA9IC1FSU5UUjsKKwkJZ290byBmcmVlOworCX0KIAogCS8qCiAJICogUGVyIEVGSSBzcGVjLCB0aGUgbWF4aW11bSBzdG9yYWdlIGFsbG9jYXRlZCBmb3IgYm90aApAQCAtNDUwLDcgKzQ2MSw3IEBACiAJCXN3aXRjaCAoc3RhdHVzKSB7CiAJCWNhc2UgRUZJX1NVQ0NFU1M6CiAJCQlpZiAoZHVwbGljYXRlcykKLQkJCQlzcGluX3VubG9ja19pcnEoJl9fZWZpdmFycy0+bG9jayk7CisJCQkJdXAoJmVmaXZhcnNfbG9jayk7CiAKIAkJCXZhcmlhYmxlX25hbWVfc2l6ZSA9IHZhcl9uYW1lX3N0cm5zaXplKHZhcmlhYmxlX25hbWUsCiAJCQkJCQkJICAgICAgIHZhcmlhYmxlX25hbWVfc2l6ZSk7CkBAIC00NzYsOCArNDg3LDEyIEBACiAJCQkJCXN0YXR1cyA9IEVGSV9OT1RfRk9VTkQ7CiAJCQl9CiAKLQkJCWlmIChkdXBsaWNhdGVzKQotCQkJCXNwaW5fbG9ja19pcnEoJl9fZWZpdmFycy0+bG9jayk7CisJCQlpZiAoZHVwbGljYXRlcykgeworCQkJCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVmaXZhcnNfbG9jaykpIHsKKwkJCQkJZXJyID0gLUVJTlRSOworCQkJCQlnb3RvIGZyZWU7CisJCQkJfQorCQkJfQogCiAJCQlicmVhazsKIAkJY2FzZSBFRklfTk9UX0ZPVU5EOgpAQCAtNDkxLDggKzUwNiw4IEBACiAKIAl9IHdoaWxlIChzdGF0dXMgIT0gRUZJX05PVF9GT1VORCk7CiAKLQlzcGluX3VubG9ja19pcnEoJl9fZWZpdmFycy0+bG9jayk7Ci0KKwl1cCgmZWZpdmFyc19sb2NrKTsKK2ZyZWU6CiAJa2ZyZWUodmFyaWFibGVfbmFtZSk7CiAKIAlyZXR1cm4gZXJyOwpAQCAtNTAzLDI0ICs1MTgsMzQgQEAKICAqIGVmaXZhcl9lbnRyeV9hZGQgLSBhZGQgZW50cnkgdG8gdmFyaWFibGUgbGlzdAogICogQGVudHJ5OiBlbnRyeSB0byBhZGQgdG8gbGlzdAogICogQGhlYWQ6IGxpc3QgaGVhZAorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBvciBhIGtlcm5lbCBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCiAgKi8KLXZvaWQgZWZpdmFyX2VudHJ5X2FkZChzdHJ1Y3QgZWZpdmFyX2VudHJ5ICplbnRyeSwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK2ludCBlZml2YXJfZW50cnlfYWRkKHN0cnVjdCBlZml2YXJfZW50cnkgKmVudHJ5LCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQogewotCXNwaW5fbG9ja19pcnEoJl9fZWZpdmFycy0+bG9jayk7CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZWZpdmFyc19sb2NrKSkKKwkJcmV0dXJuIC1FSU5UUjsKIAlsaXN0X2FkZCgmZW50cnktPmxpc3QsIGhlYWQpOwotCXNwaW5fdW5sb2NrX2lycSgmX19lZml2YXJzLT5sb2NrKTsKKwl1cCgmZWZpdmFyc19sb2NrKTsKKworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZWZpdmFyX2VudHJ5X2FkZCk7CiAKIC8qKgogICogZWZpdmFyX2VudHJ5X3JlbW92ZSAtIHJlbW92ZSBlbnRyeSBmcm9tIHZhcmlhYmxlIGxpc3QKICAqIEBlbnRyeTogZW50cnkgdG8gcmVtb3ZlIGZyb20gbGlzdAorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBvciBhIGtlcm5lbCBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCiAgKi8KLXZvaWQgZWZpdmFyX2VudHJ5X3JlbW92ZShzdHJ1Y3QgZWZpdmFyX2VudHJ5ICplbnRyeSkKK2ludCBlZml2YXJfZW50cnlfcmVtb3ZlKHN0cnVjdCBlZml2YXJfZW50cnkgKmVudHJ5KQogewotCXNwaW5fbG9ja19pcnEoJl9fZWZpdmFycy0+bG9jayk7CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZWZpdmFyc19sb2NrKSkKKwkJcmV0dXJuIC1FSU5UUjsKIAlsaXN0X2RlbCgmZW50cnktPmxpc3QpOwotCXNwaW5fdW5sb2NrX2lycSgmX19lZml2YXJzLT5sb2NrKTsKKwl1cCgmZWZpdmFyc19sb2NrKTsKKworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZWZpdmFyX2VudHJ5X3JlbW92ZSk7CiAKQEAgLTUzNywxMCArNTYyLDggQEAKICAqLwogc3RhdGljIHZvaWQgZWZpdmFyX2VudHJ5X2xpc3RfZGVsX3VubG9jayhzdHJ1Y3QgZWZpdmFyX2VudHJ5ICplbnRyeSkKIHsKLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZfX2VmaXZhcnMtPmxvY2spOwotCiAJbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKLQlzcGluX3VubG9ja19pcnEoJl9fZWZpdmFycy0+bG9jayk7CisJdXAoJmVmaXZhcnNfbG9jayk7CiB9CiAKIC8qKgpAQCAtNTYzLDggKzU4Niw2IEBACiAJY29uc3Qgc3RydWN0IGVmaXZhcl9vcGVyYXRpb25zICpvcHMgPSBfX2VmaXZhcnMtPm9wczsKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwogCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmX19lZml2YXJzLT5sb2NrKTsKLQogCXN0YXR1cyA9IG9wcy0+c2V0X3ZhcmlhYmxlKGVudHJ5LT52YXIuVmFyaWFibGVOYW1lLAogCQkJCSAgICZlbnRyeS0+dmFyLlZlbmRvckd1aWQsCiAJCQkJICAgMCwgMCwgTlVMTCk7CkBAIC01ODEsMjAgKzYwMiwyMiBAQAogICogdmFyaWFibGUgbGlzdC4gSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGZyZWUgQGVudHJ5CiAgKiBvbmNlIHdlIHJldHVybi4KICAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgYSBjb252ZXJ0ZWQgRUZJIHN0YXR1cyBjb2RlIGlmCi0gKiBzZXRfdmFyaWFibGUoKSBmYWlscy4KKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUlOVFIgaWYgd2UgY2FuJ3QgZ3JhYiB0aGUgc2VtYXBob3JlLAorICogY29udmVydGVkIEVGSSBzdGF0dXMgY29kZSBpZiBzZXRfdmFyaWFibGUoKSBmYWlscy4KICAqLwogaW50IGVmaXZhcl9lbnRyeV9kZWxldGUoc3RydWN0IGVmaXZhcl9lbnRyeSAqZW50cnkpCiB7CiAJY29uc3Qgc3RydWN0IGVmaXZhcl9vcGVyYXRpb25zICpvcHMgPSBfX2VmaXZhcnMtPm9wczsKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrX2lycSgmX19lZml2YXJzLT5sb2NrKTsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZlZml2YXJzX2xvY2spKQorCQlyZXR1cm4gLUVJTlRSOworCiAJc3RhdHVzID0gb3BzLT5zZXRfdmFyaWFibGUoZW50cnktPnZhci5WYXJpYWJsZU5hbWUsCiAJCQkJICAgJmVudHJ5LT52YXIuVmVuZG9yR3VpZCwKIAkJCQkgICAwLCAwLCBOVUxMKTsKIAlpZiAoIShzdGF0dXMgPT0gRUZJX1NVQ0NFU1MgfHwgc3RhdHVzID09IEVGSV9OT1RfRk9VTkQpKSB7Ci0JCXNwaW5fdW5sb2NrX2lycSgmX19lZml2YXJzLT5sb2NrKTsKKwkJdXAoJmVmaXZhcnNfbG9jayk7CiAJCXJldHVybiBlZmlfc3RhdHVzX3RvX2VycihzdGF0dXMpOwogCX0KIApAQCAtNjIwLDkgKzY0Myw5IEBACiAgKiBJZiBAaGVhZCBpcyBub3QgTlVMTCBhIGxvb2t1cCBpcyBwZXJmb3JtZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKICAqIHRoZSBlbnRyeSBpcyBhbHJlYWR5IG9uIHRoZSBsaXN0LgogICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUVYSVNUIGlmIGEgbG9va3VwIGlzIHBlcmZvcm1lZCBhbmQgdGhlIGVudHJ5Ci0gKiBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgbGlzdCwgb3IgYSBjb252ZXJ0ZWQgRUZJIHN0YXR1cyBjb2RlIGlmCi0gKiBzZXRfdmFyaWFibGUoKSBmYWlscy4KKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUlOVFIgaWYgd2UgY2FuJ3QgZ3JhYiB0aGUgc2VtYXBob3JlLAorICogLUVFWElTVCBpZiBhIGxvb2t1cCBpcyBwZXJmb3JtZWQgYW5kIHRoZSBlbnRyeSBhbHJlYWR5IGV4aXN0cyBvbgorICogdGhlIGxpc3QsIG9yIGEgY29udmVydGVkIEVGSSBzdGF0dXMgY29kZSBpZiBzZXRfdmFyaWFibGUoKSBmYWlscy4KICAqLwogaW50IGVmaXZhcl9lbnRyeV9zZXQoc3RydWN0IGVmaXZhcl9lbnRyeSAqZW50cnksIHUzMiBhdHRyaWJ1dGVzLAogCQkgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdm9pZCAqZGF0YSwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKQEAgLTYzMiwxMCArNjU1LDEwIEBACiAJZWZpX2NoYXIxNl90ICpuYW1lID0gZW50cnktPnZhci5WYXJpYWJsZU5hbWU7CiAJZWZpX2d1aWRfdCB2ZW5kb3IgPSBlbnRyeS0+dmFyLlZlbmRvckd1aWQ7CiAKLQlzcGluX2xvY2tfaXJxKCZfX2VmaXZhcnMtPmxvY2spOwotCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZWZpdmFyc19sb2NrKSkKKwkJcmV0dXJuIC1FSU5UUjsKIAlpZiAoaGVhZCAmJiBlZml2YXJfZW50cnlfZmluZChuYW1lLCB2ZW5kb3IsIGhlYWQsIGZhbHNlKSkgewotCQlzcGluX3VubG9ja19pcnEoJl9fZWZpdmFycy0+bG9jayk7CisJCXVwKCZlZml2YXJzX2xvY2spOwogCQlyZXR1cm4gLUVFWElTVDsKIAl9CiAKQEAgLTY0NCw3ICs2NjcsNyBAQAogCQlzdGF0dXMgPSBvcHMtPnNldF92YXJpYWJsZShuYW1lLCAmdmVuZG9yLAogCQkJCQkgICBhdHRyaWJ1dGVzLCBzaXplLCBkYXRhKTsKIAotCXNwaW5fdW5sb2NrX2lycSgmX19lZml2YXJzLT5sb2NrKTsKKwl1cCgmZWZpdmFyc19sb2NrKTsKIAogCXJldHVybiBlZmlfc3RhdHVzX3RvX2VycihzdGF0dXMpOwogCkBAIC02NTgsMzAgKzY4MSwyOSBAQAogICogZnJvbSBjcmFzaC9wYW5pYyBoYW5kbGVycy4KICAqCiAgKiBDcnVjaWFsbHksIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgYmxvY2sgaWYgaXQgY2Fubm90IGFjcXVpcmUKLSAqIF9fZWZpdmFycy0+bG9jay4gSW5zdGVhZCwgaXQgcmV0dXJucyAtRUJVU1kuCisgKiBlZml2YXJzX2xvY2suIEluc3RlYWQsIGl0IHJldHVybnMgLUVCVVNZLgogICovCiBzdGF0aWMgaW50CiBlZml2YXJfZW50cnlfc2V0X25vbmJsb2NraW5nKGVmaV9jaGFyMTZfdCAqbmFtZSwgZWZpX2d1aWRfdCB2ZW5kb3IsCiAJCQkgICAgIHUzMiBhdHRyaWJ1dGVzLCB1bnNpZ25lZCBsb25nIHNpemUsIHZvaWQgKmRhdGEpCiB7CiAJY29uc3Qgc3RydWN0IGVmaXZhcl9vcGVyYXRpb25zICpvcHMgPSBfX2VmaXZhcnMtPm9wczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWVmaV9zdGF0dXNfdCBzdGF0dXM7CiAKLQlpZiAoIXNwaW5fdHJ5bG9ja19pcnFzYXZlKCZfX2VmaXZhcnMtPmxvY2ssIGZsYWdzKSkKKwlpZiAoZG93bl90cnlsb2NrKCZlZml2YXJzX2xvY2spKQogCQlyZXR1cm4gLUVCVVNZOwogCiAJc3RhdHVzID0gY2hlY2tfdmFyX3NpemVfbm9uYmxvY2tpbmcoYXR0cmlidXRlcywKIAkJCQkJICAgIHNpemUgKyB1Y3MyX3N0cnNpemUobmFtZSwgMTAyNCkpOwogCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmX19lZml2YXJzLT5sb2NrLCBmbGFncyk7CisJCXVwKCZlZml2YXJzX2xvY2spOwogCQlyZXR1cm4gLUVOT1NQQzsKIAl9CiAKIAlzdGF0dXMgPSBvcHMtPnNldF92YXJpYWJsZV9ub25ibG9ja2luZyhuYW1lLCAmdmVuZG9yLCBhdHRyaWJ1dGVzLAogCQkJCQkgICAgICAgc2l6ZSwgZGF0YSk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZfX2VmaXZhcnMtPmxvY2ssIGZsYWdzKTsKKwl1cCgmZWZpdmFyc19sb2NrKTsKIAlyZXR1cm4gZWZpX3N0YXR1c190b19lcnIoc3RhdHVzKTsKIH0KIApAQCAtNzA2LDcgKzcyOCw2IEBACiAJCQkgIGJvb2wgYmxvY2ssIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdm9pZCAqZGF0YSkKIHsKIAljb25zdCBzdHJ1Y3QgZWZpdmFyX29wZXJhdGlvbnMgKm9wcyA9IF9fZWZpdmFycy0+b3BzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKIAogCWlmICghb3BzLT5xdWVyeV92YXJpYWJsZV9zdG9yZSkKQEAgLTcyNywyMSArNzQ4LDIyIEBACiAJCQkJCQkgICAgc2l6ZSwgZGF0YSk7CiAKIAlpZiAoIWJsb2NrKSB7Ci0JCWlmICghc3Bpbl90cnlsb2NrX2lycXNhdmUoJl9fZWZpdmFycy0+bG9jaywgZmxhZ3MpKQorCQlpZiAoZG93bl90cnlsb2NrKCZlZml2YXJzX2xvY2spKQogCQkJcmV0dXJuIC1FQlVTWTsKIAl9IGVsc2UgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmX19lZml2YXJzLT5sb2NrLCBmbGFncyk7CisJCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVmaXZhcnNfbG9jaykpCisJCQlyZXR1cm4gLUVJTlRSOwogCX0KIAogCXN0YXR1cyA9IGNoZWNrX3Zhcl9zaXplKGF0dHJpYnV0ZXMsIHNpemUgKyB1Y3MyX3N0cnNpemUobmFtZSwgMTAyNCkpOwogCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmX19lZml2YXJzLT5sb2NrLCBmbGFncyk7CisJCXVwKCZlZml2YXJzX2xvY2spOwogCQlyZXR1cm4gLUVOT1NQQzsKIAl9CiAKIAlzdGF0dXMgPSBvcHMtPnNldF92YXJpYWJsZShuYW1lLCAmdmVuZG9yLCBhdHRyaWJ1dGVzLCBzaXplLCBkYXRhKTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJl9fZWZpdmFycy0+bG9jaywgZmxhZ3MpOworCXVwKCZlZml2YXJzX2xvY2spOwogCiAJcmV0dXJuIGVmaV9zdGF0dXNfdG9fZXJyKHN0YXR1cyk7CiB9CkBAIC03NzEsOCArNzkzLDYgQEAKIAlpbnQgc3Ryc2l6ZTEsIHN0cnNpemUyOwogCWJvb2wgZm91bmQgPSBmYWxzZTsKIAotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJl9fZWZpdmFycy0+bG9jayk7Ci0KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIG4sIGhlYWQsIGxpc3QpIHsKIAkJc3Ryc2l6ZTEgPSB1Y3MyX3N0cnNpemUobmFtZSwgMTAyNCk7CiAJCXN0cnNpemUyID0gdWNzMl9zdHJzaXplKGVudHJ5LT52YXIuVmFyaWFibGVOYW1lLCAxMDI0KTsKQEAgLTgxNCwxMCArODM0LDExIEBACiAKIAkqc2l6ZSA9IDA7CiAKLQlzcGluX2xvY2tfaXJxKCZfX2VmaXZhcnMtPmxvY2spOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVmaXZhcnNfbG9jaykpCisJCXJldHVybiAtRUlOVFI7CiAJc3RhdHVzID0gb3BzLT5nZXRfdmFyaWFibGUoZW50cnktPnZhci5WYXJpYWJsZU5hbWUsCiAJCQkJICAgJmVudHJ5LT52YXIuVmVuZG9yR3VpZCwgTlVMTCwgc2l6ZSwgTlVMTCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZfX2VmaXZhcnMtPmxvY2spOworCXVwKCZlZml2YXJzX2xvY2spOwogCiAJaWYgKHN0YXR1cyAhPSBFRklfQlVGRkVSX1RPT19TTUFMTCkKIAkJcmV0dXJuIGVmaV9zdGF0dXNfdG9fZXJyKHN0YXR1cyk7CkBAIC04NDMsOCArODY0LDYgQEAKIAljb25zdCBzdHJ1Y3QgZWZpdmFyX29wZXJhdGlvbnMgKm9wcyA9IF9fZWZpdmFycy0+b3BzOwogCWVmaV9zdGF0dXNfdCBzdGF0dXM7CiAKLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZfX2VmaXZhcnMtPmxvY2spOwotCiAJc3RhdHVzID0gb3BzLT5nZXRfdmFyaWFibGUoZW50cnktPnZhci5WYXJpYWJsZU5hbWUsCiAJCQkJICAgJmVudHJ5LT52YXIuVmVuZG9yR3VpZCwKIAkJCQkgICBhdHRyaWJ1dGVzLCBzaXplLCBkYXRhKTsKQEAgLTg2NiwxMSArODg1LDEyIEBACiAJY29uc3Qgc3RydWN0IGVmaXZhcl9vcGVyYXRpb25zICpvcHMgPSBfX2VmaXZhcnMtPm9wczsKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrX2lycSgmX19lZml2YXJzLT5sb2NrKTsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZlZml2YXJzX2xvY2spKQorCQlyZXR1cm4gLUVJTlRSOwogCXN0YXR1cyA9IG9wcy0+Z2V0X3ZhcmlhYmxlKGVudHJ5LT52YXIuVmFyaWFibGVOYW1lLAogCQkJCSAgICZlbnRyeS0+dmFyLlZlbmRvckd1aWQsCiAJCQkJICAgYXR0cmlidXRlcywgc2l6ZSwgZGF0YSk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZfX2VmaXZhcnMtPmxvY2spOworCXVwKCZlZml2YXJzX2xvY2spOwogCiAJcmV0dXJuIGVmaV9zdGF0dXNfdG9fZXJyKHN0YXR1cyk7CiB9CkBAIC05MTcsNyArOTM3LDggQEAKIAkgKiBzZXRfdmFyaWFibGUgY2FsbCwgYW5kIHJlbW92YWwgb2YgdGhlIHZhcmlhYmxlIGZyb20gdGhlIGVmaXZhcnMKIAkgKiBsaXN0IChpbiB0aGUgY2FzZSBvZiBhbiBhdXRoZW50aWNhdGVkIGRlbGV0ZSkuCiAJICovCi0Jc3Bpbl9sb2NrX2lycSgmX19lZml2YXJzLT5sb2NrKTsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZlZml2YXJzX2xvY2spKQorCQlyZXR1cm4gLUVJTlRSOwogCiAJLyoKIAkgKiBFbnN1cmUgdGhhdCB0aGUgYXZhaWxhYmxlIHNwYWNlIGhhc24ndCBzaHJ1bmsgYmVsb3cgdGhlIHNhZmUgbGV2ZWwKQEAgLTk1Nyw3ICs5NzgsNyBAQAogCWlmIChzdGF0dXMgPT0gRUZJX05PVF9GT1VORCkKIAkJZWZpdmFyX2VudHJ5X2xpc3RfZGVsX3VubG9jayhlbnRyeSk7CiAJZWxzZQotCQlzcGluX3VubG9ja19pcnEoJl9fZWZpdmFycy0+bG9jayk7CisJCXVwKCZlZml2YXJzX2xvY2spOwogCiAJaWYgKHN0YXR1cyAmJiBzdGF0dXMgIT0gRUZJX0JVRkZFUl9UT09fU01BTEwpCiAJCXJldHVybiBlZmlfc3RhdHVzX3RvX2VycihzdGF0dXMpOwpAQCAtOTY1LDcgKzk4Niw3IEBACiAJcmV0dXJuIDA7CiAKIG91dDoKLQlzcGluX3VubG9ja19pcnEoJl9fZWZpdmFycy0+bG9jayk7CisJdXAoJmVmaXZhcnNfbG9jayk7CiAJcmV0dXJuIGVycjsKIAogfQpAQCAtOTc4LDkgKzk5OSw5IEBACiAgKiBlZml2YXJfZW50cnlfaXRlcl9lbmQoKSBpcyBjYWxsZWQuIFRoaXMgZnVuY3Rpb24gaXMgdXN1YWxseSB1c2VkIGluCiAgKiBjb25qdW5jdGlvbiB3aXRoIF9fZWZpdmFyX2VudHJ5X2l0ZXIoKSBvciBlZml2YXJfZW50cnlfaXRlcigpLgogICovCi12b2lkIGVmaXZhcl9lbnRyeV9pdGVyX2JlZ2luKHZvaWQpCitpbnQgZWZpdmFyX2VudHJ5X2l0ZXJfYmVnaW4odm9pZCkKIHsKLQlzcGluX2xvY2tfaXJxKCZfX2VmaXZhcnMtPmxvY2spOworCXJldHVybiBkb3duX2ludGVycnVwdGlibGUoJmVmaXZhcnNfbG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChlZml2YXJfZW50cnlfaXRlcl9iZWdpbik7CiAKQEAgLTk5MSw3ICsxMDEyLDcgQEAKICAqLwogdm9pZCBlZml2YXJfZW50cnlfaXRlcl9lbmQodm9pZCkKIHsKLQlzcGluX3VubG9ja19pcnEoJl9fZWZpdmFycy0+bG9jayk7CisJdXAoJmVmaXZhcnNfbG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChlZml2YXJfZW50cnlfaXRlcl9lbmQpOwogCkBAIC0xMDY3LDcgKzEwODgsOSBAQAogewogCWludCBlcnIgPSAwOwogCi0JZWZpdmFyX2VudHJ5X2l0ZXJfYmVnaW4oKTsKKwllcnIgPSBlZml2YXJfZW50cnlfaXRlcl9iZWdpbigpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAJZXJyID0gX19lZml2YXJfZW50cnlfaXRlcihmdW5jLCBoZWFkLCBkYXRhLCBOVUxMKTsKIAllZml2YXJfZW50cnlfaXRlcl9lbmQoKTsKIApAQCAtMTExMiwxMiArMTEzNSwxOCBAQAogCQkgICAgIGNvbnN0IHN0cnVjdCBlZml2YXJfb3BlcmF0aW9ucyAqb3BzLAogCQkgICAgIHN0cnVjdCBrb2JqZWN0ICprb2JqZWN0KQogewotCXNwaW5fbG9ja19pbml0KCZlZml2YXJzLT5sb2NrKTsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZlZml2YXJzX2xvY2spKQorCQlyZXR1cm4gLUVJTlRSOworCiAJZWZpdmFycy0+b3BzID0gb3BzOwogCWVmaXZhcnMtPmtvYmplY3QgPSBrb2JqZWN0OwogCiAJX19lZml2YXJzID0gZWZpdmFyczsKIAorCXByX2luZm8oIlJlZ2lzdGVyZWQgZWZpdmFycyBvcGVyYXRpb25zXG4iKTsKKworCXVwKCZlZml2YXJzX2xvY2spOworCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChlZml2YXJzX3JlZ2lzdGVyKTsKQEAgLTExMzMsNiArMTE2Miw5IEBACiB7CiAJaW50IHJ2OwogCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZWZpdmFyc19sb2NrKSkKKwkJcmV0dXJuIC1FSU5UUjsKKwogCWlmICghX19lZml2YXJzKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZWZpdmFycyBub3QgcmVnaXN0ZXJlZFxuIik7CiAJCXJ2ID0gLUVJTlZBTDsKQEAgLTExNDQsMTAgKzExNzYsMTIgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJcHJfaW5mbygiVW5yZWdpc3RlcmVkIGVmaXZhcnMgb3BlcmF0aW9uc1xuIik7CiAJX19lZml2YXJzID0gTlVMTDsKIAogCXJ2ID0gMDsKIG91dDoKKwl1cCgmZWZpdmFyc19sb2NrKTsKIAlyZXR1cm4gcnY7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChlZml2YXJzX3VucmVnaXN0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9nb29nbGUvZ3NtaS5jIGIvZHJpdmVycy9maXJtd2FyZS9nb29nbGUvZ3NtaS5jCmluZGV4IGYxYWIwNWUuLmM0NjM4NzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZ29vZ2xlL2dzbWkuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2dvb2dsZS9nc21pLmMKQEAgLTkxMCw4ICs5MTAsNyBAQAogCWdzbWlfYnVmX2ZyZWUoZ3NtaV9kZXYucGFyYW1fYnVmKTsKIAlnc21pX2J1Zl9mcmVlKGdzbWlfZGV2LmRhdGFfYnVmKTsKIAlnc21pX2J1Zl9mcmVlKGdzbWlfZGV2Lm5hbWVfYnVmKTsKLQlpZiAoZ3NtaV9kZXYuZG1hX3Bvb2wpCi0JCWRtYV9wb29sX2Rlc3Ryb3koZ3NtaV9kZXYuZG1hX3Bvb2wpOworCWRtYV9wb29sX2Rlc3Ryb3koZ3NtaV9kZXYuZG1hX3Bvb2wpOwogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGdzbWlfZGV2LnBkZXYpOwogCXByX2luZm8oImdzbWk6IGZhaWxlZCB0byBsb2FkOiAlZFxuIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9mcGdhL0tjb25maWcgYi9kcml2ZXJzL2ZwZ2EvS2NvbmZpZwppbmRleCBkNjE0MTAyLi5jZDg0OTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2ZwZ2EvS2NvbmZpZworKysgYi9kcml2ZXJzL2ZwZ2EvS2NvbmZpZwpAQCAtMjEsNiArMjEsNyBAQAogCiBjb25maWcgRlBHQV9NR1JfWllOUV9GUEdBCiAJdHJpc3RhdGUgIlhpbGlueCBaeW5xIEZQR0EiCisJZGVwZW5kcyBvbiBBUkNIX1pZTlEgfHwgQ09NUElMRV9URVNUCiAJZGVwZW5kcyBvbiBIQVNfRE1BCiAJaGVscAogCSAgRlBHQSBtYW5hZ2VyIGRyaXZlciBzdXBwb3J0IGZvciBYaWxpbnggWnlucSBGUEdBcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9LY29uZmlnIGIvZHJpdmVycy9ncGlvL0tjb25maWcKaW5kZXggMzQ2ZTlhOS4uMjZlZTAwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL0tjb25maWcKKysrIGIvZHJpdmVycy9ncGlvL0tjb25maWcKQEAgLTEwLDI3ICsxMCw2IEBACiAJICBvdmVycmlkaW5nIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucy4gIE5ldyB1c2VzIG9mIHRoaXMgYXJlCiAJICBzdHJvbmdseSBkaXNjb3VyYWdlZC4KIAotY29uZmlnIEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCCi0JYm9vbAotCWhlbHAKLQkgIFNlbGVjdCB0aGlzIGNvbmZpZyBvcHRpb24gZnJvbSB0aGUgYXJjaGl0ZWN0dXJlIEtjb25maWcsIGlmCi0JICBpdCBpcyBwb3NzaWJsZSB0byB1c2UgZ3Bpb2xpYiBvbiB0aGUgYXJjaGl0ZWN0dXJlLCBidXQgbGV0IHRoZQotCSAgdXNlciBkZWNpZGUgd2hldGhlciB0byBhY3R1YWxseSBidWlsZCBpdCBvciBub3QuCi0JICBTZWxlY3QgdGhpcyBpbnN0ZWFkIG9mIEFSQ0hfUkVRVUlSRV9HUElPTElCLCBpZiB5b3VyIGFyY2hpdGVjdHVyZSBkb2VzCi0JICBub3QgZGVwZW5kIG9uIEdQSU9zIGJlaW5nIGF2YWlsYWJsZSwgYnV0IHJhdGhlciBsZXQgdGhlIHVzZXIKLQkgIGRlY2lkZSB3aGV0aGVyIGhlIG5lZWRzIGl0IG9yIG5vdC4KLQotY29uZmlnIEFSQ0hfUkVRVUlSRV9HUElPTElCCi0JYm9vbAotCXNlbGVjdCBHUElPTElCCi0JaGVscAotCSAgUGxhdGZvcm1zIHNlbGVjdCBncGlvbGliIGlmIHRoZXkgdXNlIHRoaXMgaW5mcmFzdHJ1Y3R1cmUKLQkgIGZvciBhbGwgdGhlaXIgR1BJT3MsIHVzdWFsbHkgc3RhcnRpbmcgd2l0aCBvbmVzIGludGVncmF0ZWQKLQkgIGludG8gU09DIHByb2Nlc3NvcnMuCi0JICBTZWxlY3RpbmcgdGhpcyBmcm9tIHRoZSBhcmNoaXRlY3R1cmUgY29kZSB3aWxsIGNhdXNlIHRoZSBncGlvbGliCi0JICBjb2RlIHRvIGFsd2F5cyBnZXQgYnVpbHQgaW4uCi0KLQogbWVudWNvbmZpZyBHUElPTElCCiAJYm9vbCAiR1BJTyBTdXBwb3J0IgogCXNlbGVjdCBBTk9OX0lOT0RFUwpAQCAtNTAsNiArMjksNyBAQAogY29uZmlnIE9GX0dQSU8KIAlkZWZfYm9vbCB5CiAJZGVwZW5kcyBvbiBPRgorCWRlcGVuZHMgb24gSEFTX0lPTUVNCiAKIGNvbmZpZyBHUElPX0FDUEkKIAlkZWZfYm9vbCB5CkBAIC04Niw2ICs2Niw3IEBACiAJICBleHBvcnRlZCB0byB1c2Vyc3BhY2U7IHRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIGRlYnVnZ2luZy4KIAogY29uZmlnIEdQSU9fR0VORVJJQworCWRlcGVuZHMgb24gSEFTX0lPTUVNICMgT25seSBmb3IgSU9NRU0gZHJpdmVycwogCXRyaXN0YXRlCiAKICMgcHV0IGRyaXZlcnMgaW4gdGhlIHJpZ2h0IHNlY3Rpb24sIGluIGFscGhhYmV0aWNhbCBvcmRlcgpAQCAtOTUsNiArNzYsNyBAQAogCXRyaXN0YXRlCiAKIG1lbnUgIk1lbW9yeSBtYXBwZWQgR1BJTyBkcml2ZXJzIgorCWRlcGVuZHMgb24gSEFTX0lPTUVNCiAKIGNvbmZpZyBHUElPXzc0WFhfTU1JTwogCXRyaXN0YXRlICJHUElPIGRyaXZlciBmb3IgNzR4eC1JQ3Mgd2l0aCBNTUlPIGFjY2VzcyIKQEAgLTEyNyw2ICsxMDksMTMgQEAKIAkgIGRyaXZlciBmb3IgR1BJTyBmdW5jdGlvbmFsaXR5IG9uIFByb21vbnRvcnkgSU9IdWIKIAkgIFJlcXVpcmUgQUNQSSBBU0wgY29kZSB0byBlbnVtZXJhdGUgYXMgYSBwbGF0Zm9ybSBkZXZpY2UuCiAKK2NvbmZpZyBHUElPX0FTUEVFRAorCXRyaXN0YXRlICJBc3BlZWQgR1BJTyBzdXBwb3J0IgorCWRlcGVuZHMgb24gKEFSQ0hfQVNQRUVEIHx8IENPTVBJTEVfVEVTVCkgJiYgT0ZfR1BJTworCXNlbGVjdCBHUElPTElCX0lSUUNISVAKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgQXNwZWVkIEFTVDI0MDAgYW5kIEFTVDI1MDAgR1BJTyBjb250cm9sbGVycy4KKwogY29uZmlnIEdQSU9fQVRINzkKIAl0cmlzdGF0ZSAiQXRoZXJvcyBBUjcxWFgvQVI3MjRYL0FSOTEzWCBHUElPIHN1cHBvcnQiCiAJZGVmYXVsdCB5IGlmIEFUSDc5CkBAIC0xMzcsNiArMTI2LDEyIEBACiAJICBTZWxlY3QgdGhpcyBvcHRpb24gdG8gZW5hYmxlIEdQSU8gZHJpdmVyIGZvcgogCSAgQXRoZXJvcyBBUjcxWFgvQVI3MjRYL0FSOTEzWCBTb0MgZGV2aWNlcy4KIAorY29uZmlnIEdQSU9fQVhQMjA5CisJdHJpc3RhdGUgIlgtUG93ZXJzIEFYUDIwOSBQTUlDIEdQSU8gU3VwcG9ydCIKKwlkZXBlbmRzIG9uIE1GRF9BWFAyMFgKKwloZWxwCisJICBTYXkgeWVzIHRvIGVuYWJsZSBHUElPIHN1cHBvcnQgZm9yIHRoZSBBWFAyMDkgUE1JQworCiBjb25maWcgR1BJT19CQ01fS09OQQogCWJvb2wgIkJyb2FkY29tIEtvbmEgR1BJTyIKIAlkZXBlbmRzIG9uIE9GX0dQSU8gJiYgKEFSQ0hfQkNNX01PQklMRSB8fCBDT01QSUxFX1RFU1QpCkBAIC0xODgsNyArMTgzLDcgQEAKIGNvbmZpZyBHUElPX0VUUkFYRlMKIAlib29sICJBeGlzIEVUUkFYIEZTIEdlbmVyYWwgSS9PIgogCWRlcGVuZHMgb24gQ1JJUyB8fCBDT01QSUxFX1RFU1QKLQlkZXBlbmRzIG9uIE9GCisJZGVwZW5kcyBvbiBPRl9HUElPCiAJc2VsZWN0IEdQSU9fR0VORVJJQwogCXNlbGVjdCBHUElPTElCX0lSUUNISVAKIAloZWxwCkBAIC0yMTQsNyArMjA5LDcgQEAKIAogY29uZmlnIEdQSU9fR1JHUElPCiAJdHJpc3RhdGUgIkFlcm9mbGV4IEdhaXNsZXIgR1JHUElPIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBPRgorCWRlcGVuZHMgb24gT0ZfR1BJTwogCXNlbGVjdCBHUElPX0dFTkVSSUMKIAlzZWxlY3QgSVJRX0RPTUFJTgogCWhlbHAKQEAgLTIzNiw3ICsyMzEsOCBAQAogCiBjb25maWcgR1BJT19JT1AKIAl0cmlzdGF0ZSAiSW50ZWwgSU9QIEdQSU8iCi0JZGVwZW5kcyBvbiBBUk0gJiYgKEFSQ0hfSU9QMzJYIHx8IEFSQ0hfSU9QMzNYKQorCWRlcGVuZHMgb24gQVJDSF9JT1AzMlggfHwgQVJDSF9JT1AzM1ggfHwgQ09NUElMRV9URVNUCisJc2VsZWN0IEdQSU9fR0VORVJJQwogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSB0byBzdXBwb3J0IHRoZSBHUElPIGZ1bmN0aW9uYWxpdHkgb2YgYSBudW1iZXIgb2YgSW50ZWwKIAkgIElPUDMyWCBvciBJT1AzM1guCkBAIC0yODYsNiArMjgyLDE4IEBACiAJICAoRUJVKSBmb3VuZCBvbiBMYW50aXEgU29Dcy4gVGhlIGdwaW9zIGFyZSBvdXRwdXQgb25seSBhcyB0aGV5IGFyZQogCSAgY3JlYXRlZCBieSBhdHRhY2hpbmcgYSAxNmJpdCBsYXRjaCB0byB0aGUgYnVzLgogCitjb25maWcgR1BJT19NT0NLVVAKKwl0cmlzdGF0ZSAiR1BJTyBUZXN0aW5nIERyaXZlciIKKwlkZXBlbmRzIG9uIEdQSU9MSUIKKwlzZWxlY3QgR1BJT19TWVNGUworCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBHUElPIFRlc3RpbmcgZHJpdmVyLCB3aGljaCBwcm92aWRlcyBhIHdheSB0byB0ZXN0IEdQSU8KKwkgIHN1YnN5c3RlbSB0aHJvdWdoIHN5c2ZzKG9yIGNoYXIgZGV2aWNlKSBhbmQgZGVidWdmcy4gR1BJT19TWVNGUworCSAgbXVzdCBiZSBzZWxlY3RlZCBmb3IgdGhpcyB0ZXN0LgorCSAgVXNlciBjb3VsZCB1c2UgaXQgdGhyb3VnaCB0aGUgc2NyaXB0IGluCisJICB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9ncGlvL2dwaW8tbW9ja3VwLnNoLiBSZWZlcmVuY2UgdGhlIHVzYWdlIGluCisJICBpdC4KKwogY29uZmlnIEdQSU9fTU9YQVJUCiAJYm9vbCAiTU9YQVJUIEdQSU8gc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEFSQ0hfTU9YQVJUIHx8IENPTVBJTEVfVEVTVApAQCAtMzEyLDcgKzMyMCw3IEBACiBjb25maWcgR1BJT19NVkVCVQogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIFBMQVRfT1JJT04KLQlkZXBlbmRzIG9uIE9GCisJZGVwZW5kcyBvbiBPRl9HUElPCiAJc2VsZWN0IEdFTkVSSUNfSVJRX0NISVAKIAogY29uZmlnIEdQSU9fTVhDCkBAIC00MDUsNyArNDEzLDcgQEAKIAlib29sICJOVklESUEgVGVncmEgR1BJTyBzdXBwb3J0IgogCWRlZmF1bHQgQVJDSF9URUdSQQogCWRlcGVuZHMgb24gQVJDSF9URUdSQSB8fCBDT01QSUxFX1RFU1QKLQlkZXBlbmRzIG9uIE9GCisJZGVwZW5kcyBvbiBPRl9HUElPCiAJaGVscAogCSAgU2F5IHllcyBoZXJlIHRvIHN1cHBvcnQgR1BJTyBwaW5zIG9uIE5WSURJQSBUZWdyYSBTb0NzLgogCkBAIC01NzMsNiArNTgxLDE5IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKIAkgIGJlIGNhbGxlZCBmNzE4OHgtZ3Bpby4KIAorY29uZmlnIEdQSU9fR1BJT19NTQorCXRyaXN0YXRlICJEaWFtb25kIFN5c3RlbXMgR1BJTy1NTSBHUElPIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJU0FfQlVTX0FQSQorCWhlbHAKKwkgIEVuYWJsZXMgR1BJTyBzdXBwb3J0IGZvciB0aGUgRGlhbW9uZCBTeXN0ZW1zIEdQSU8tTU0gYW5kIEdQSU8tTU0tMTIuCisKKwkgIFRoZSBEaWFtb25kIFN5c3RlbXMgR1BJTy1NTSBkZXZpY2UgZmVhdHVyZXMgNDggbGluZXMgb2YgZGlnaXRhbCBJL08KKwkgIHZpYSB0aGUgZW11bGF0aW9uIG9mIGR1YWwgODJDNTVBIFBQSSBjaGlwcy4gVGhpcyBkcml2ZXIgcHJvdmlkZXMgR1BJTworCSAgc3VwcG9ydCBmb3IgdGhlc2UgNDggY2hhbm5lbHMgb2YgZGlnaXRhbCBJL08uCisKKwkgIFRoZSBiYXNlIHBvcnQgYWRkcmVzc2VzIGZvciB0aGUgZGV2aWNlcyBtYXkgYmUgY29uZmlndXJlZCB2aWEgdGhlIGJhc2UKKwkgIGFycmF5IG1vZHVsZSBwYXJhbWV0ZXIuCisKIGNvbmZpZyBHUElPX0lUODcKIAl0cmlzdGF0ZSAiSVQ4N3h4IEdQSU8gc3VwcG9ydCIKIAloZWxwCkBAIC03NzksNiArODAwLDEzIEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKIAkgIGJlIGNhbGxlZCBncGlvLXRwaWMyODEwLgogCitjb25maWcgR1BJT19UUzQ5MDAKKwl0cmlzdGF0ZSAiVGVjaG5vbG9naWMgU3lzdGVtcyBGUEdBIEkyQyBHUElPIgorCXNlbGVjdCBSRUdNQVBfSTJDCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGVuYWJsZWQgdGhlIEdQSU8gZHJpdmVyIGZvciBUZWNobm9sb2dpYydzIEZQR0EgY29yZS4KKwkgIFNlcmllcyBzdXBwb3J0ZWQgaW5jbHVkZSBUUy00MTAwLCBUUy00OTAwLCBUUy03OTcwIGFuZCBUUy03OTkwLgorCiBlbmRtZW51CiAKIG1lbnUgIk1GRCBHUElPIGV4cGFuZGVycyIKQEAgLTg0OCw2ICs4NzYsMTQgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgZ3Bpby1kbG4yLgogCitjb25maWcgSFRDX0VHUElPCisJYm9vbCAiSFRDIEVHUElPIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBHUElPTElCICYmIEFSTQorCWhlbHAKKwkgICAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIENQTEQgZWdwaW8gY2hpcCBwcmVzZW50IG9uCisJICAgIHNldmVyYWwgSFRDIHBob25lcy4gIEl0IHByb3ZpZGVzIGJhc2ljIHN1cHBvcnQgZm9yIGlucHV0CisJICAgIHBpbnMsIG91dHB1dCBwaW5zLCBhbmQgaXJxcy4KKwogY29uZmlnIEdQSU9fSkFOWl9UVEwKIAl0cmlzdGF0ZSAiSmFueiBWTU9ELVRUTCBEaWdpdGFsIElPIE1vZHVsZSIKIAlkZXBlbmRzIG9uIE1GRF9KQU5aX0NNT0RJTwpAQCAtOTk0LDYgKzEwMzAsMTkgQEAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgUGhpbGlwcyBVQ0IxNDAwIEdQSU8gcGlucy4KIAkgIFRoZSBVQ0IxNDAwIGlzIGFuIEFDOTcgYXVkaW8gY29kZWMuCiAKK2NvbmZpZyBHUElPX1dISVNLRVlfQ09WRQorCXRyaXN0YXRlICJHUElPIHN1cHBvcnQgZm9yIFdoaXNrZXkgQ292ZSBQTUlDIgorCWRlcGVuZHMgb24gSU5URUxfU09DX1BNSUMKKwlzZWxlY3QgR1BJT0xJQl9JUlFDSElQCisJaGVscAorCSAgU3VwcG9ydCBmb3IgR1BJTyBwaW5zIG9uIFdoaXNrZXkgQ292ZSBQTUlDLgorCisJICBTYXkgWWVzIGlmIHlvdSBoYXZlIGEgSW50ZWwgU29DIGJhc2VkIHRhYmxldCB3aXRoIFdoaXNrZXkgQ292ZSBQTUlDCisJICBpbnNpZGUuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgZ3Bpby13Y292ZS4KKwogY29uZmlnIEdQSU9fV004MzFYCiAJdHJpc3RhdGUgIldNODMxeCBHUElPcyIKIAlkZXBlbmRzIG9uIE1GRF9XTTgzMVgKQEAgLTExMDksNyArMTE1OCw3IEBACiAKIGNvbmZpZyBHUElPXzc0WDE2NAogCXRyaXN0YXRlICI3NHgxNjQgc2VyaWFsLWluL3BhcmFsbGVsLW91dCA4LWJpdHMgc2hpZnQgcmVnaXN0ZXIiCi0JZGVwZW5kcyBvbiBPRgorCWRlcGVuZHMgb24gT0ZfR1BJTwogCWhlbHAKIAkgIERyaXZlciBmb3IgNzR4MTY0IGNvbXBhdGlibGUgc2VyaWFsLWluL3BhcmFsbGVsLW91dCA4LW91dHB1dHMKIAkgIHNoaWZ0IHJlZ2lzdGVycy4gVGhpcyBkcml2ZXIgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBhY2Nlc3MKQEAgLTExNDAsNiArMTE4OSw3IEBACiAKIGNvbmZpZyBHUElPX01DUDIzUzA4CiAJdHJpc3RhdGUgIk1pY3JvY2hpcCBNQ1AyM3h4eCBJL08gZXhwYW5kZXIiCisJZGVwZW5kcyBvbiBPRl9HUElPCiAJc2VsZWN0IEdQSU9MSUJfSVJRQ0hJUAogCWhlbHAKIAkgIFNQSS9JMkMgZHJpdmVyIGZvciBNaWNyb2NoaXAgTUNQMjNTMDgvTUNQMjNTMTcvTUNQMjMwMDgvTUNQMjMwMTcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9NYWtlZmlsZSBiL2RyaXZlcnMvZ3Bpby9NYWtlZmlsZQppbmRleCBkNjA0MzJmLi5hYjI4YTJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ncGlvL01ha2VmaWxlCkBAIC0yOCw2ICsyOCw4IEBACiBvYmotJChDT05GSUdfR1BJT19BTURQVCkJKz0gZ3Bpby1hbWRwdC5vCiBvYmotJChDT05GSUdfR1BJT19BUklaT05BKQkrPSBncGlvLWFyaXpvbmEubwogb2JqLSQoQ09ORklHX0dQSU9fQVRINzkpCSs9IGdwaW8tYXRoNzkubworb2JqLSQoQ09ORklHX0dQSU9fQVNQRUVEKQkrPSBncGlvLWFzcGVlZC5vCitvYmotJChDT05GSUdfR1BJT19BWFAyMDkpCSs9IGdwaW8tYXhwMjA5Lm8KIG9iai0kKENPTkZJR19HUElPX0JDTV9LT05BKQkrPSBncGlvLWJjbS1rb25hLm8KIG9iai0kKENPTkZJR19HUElPX0JSQ01TVEIpCSs9IGdwaW8tYnJjbXN0Yi5vCiBvYmotJChDT05GSUdfR1BJT19CVDhYWCkJKz0gZ3Bpby1idDh4eC5vCkBAIC00NCw3ICs0Niw5IEBACiBvYmotJChDT05GSUdfR1BJT19FVFJBWEZTKQkrPSBncGlvLWV0cmF4ZnMubwogb2JqLSQoQ09ORklHX0dQSU9fRjcxODhYKQkrPSBncGlvLWY3MTg4eC5vCiBvYmotJChDT05GSUdfR1BJT19HRV9GUEdBKQkrPSBncGlvLWdlLm8KK29iai0kKENPTkZJR19HUElPX0dQSU9fTU0pCSs9IGdwaW8tZ3Bpby1tbS5vCiBvYmotJChDT05GSUdfR1BJT19HUkdQSU8pCSs9IGdwaW8tZ3JncGlvLm8KK29iai0kKENPTkZJR19IVENfRUdQSU8pCQkrPSBncGlvLWh0Yy1lZ3Bpby5vCiBvYmotJChDT05GSUdfR1BJT19JQ0gpCQkrPSBncGlvLWljaC5vCiBvYmotJChDT05GSUdfR1BJT19JT1ApCQkrPSBncGlvLWlvcC5vCiBvYmotJChDT05GSUdfR1BJT19JVDg3KQkJKz0gZ3Bpby1pdDg3Lm8KQEAgLTcxLDYgKzc1LDcgQEAKIG9iai0kKENPTkZJR19HUElPX01DUDIzUzA4KQkrPSBncGlvLW1jcDIzczA4Lm8KIG9iai0kKENPTkZJR19HUElPX01MX0lPSCkJKz0gZ3Bpby1tbC1pb2gubwogb2JqLSQoQ09ORklHX0dQSU9fTU1fTEFOVElRKQkrPSBncGlvLW1tLWxhbnRpcS5vCitvYmotJChDT05GSUdfR1BJT19NT0NLVVApICAgICAgKz0gZ3Bpby1tb2NrdXAubwogb2JqLSQoQ09ORklHX0dQSU9fTU9YQVJUKQkrPSBncGlvLW1veGFydC5vCiBvYmotJChDT05GSUdfR1BJT19NUEM1MjAwKQkrPSBncGlvLW1wYzUyMDAubwogb2JqLSQoQ09ORklHX0dQSU9fTVBDOFhYWCkJKz0gZ3Bpby1tcGM4eHh4Lm8KQEAgLTExMSw2ICsxMTYsNyBAQAogb2JqLSQoQ09ORklHX0dQSU9fVFBTNjU5MTApCSs9IGdwaW8tdHBzNjU5MTAubwogb2JqLSQoQ09ORklHX0dQSU9fVFBTNjU5MTIpCSs9IGdwaW8tdHBzNjU5MTIubwogb2JqLSQoQ09ORklHX0dQSU9fVFM0ODAwKQkrPSBncGlvLXRzNDgwMC5vCitvYmotJChDT05GSUdfR1BJT19UUzQ5MDApCSs9IGdwaW8tdHM0OTAwLm8KIG9iai0kKENPTkZJR19HUElPX1RTNTUwMCkJKz0gZ3Bpby10czU1MDAubwogb2JqLSQoQ09ORklHX0dQSU9fVFdMNDAzMCkJKz0gZ3Bpby10d2w0MDMwLm8KIG9iai0kKENPTkZJR19HUElPX1RXTDYwNDApCSs9IGdwaW8tdHdsNjA0MC5vCkBAIC0xMjEsNiArMTI3LDcgQEAKIG9iai0kKENPTkZJR19HUElPX1ZJUEVSQk9BUkQpCSs9IGdwaW8tdmlwZXJib2FyZC5vCiBvYmotJChDT05GSUdfR1BJT19WUjQxWFgpCSs9IGdwaW8tdnI0MXh4Lm8KIG9iai0kKENPTkZJR19HUElPX1ZYODU1KQkrPSBncGlvLXZ4ODU1Lm8KK29iai0kKENPTkZJR19HUElPX1dISVNLRVlfQ09WRSkJKz0gZ3Bpby13Y292ZS5vCiBvYmotJChDT05GSUdfR1BJT19XTTgzMVgpCSs9IGdwaW8td204MzF4Lm8KIG9iai0kKENPTkZJR19HUElPX1dNODM1MCkJKz0gZ3Bpby13bTgzNTAubwogb2JqLSQoQ09ORklHX0dQSU9fV004OTk0KQkrPSBncGlvLXdtODk5NC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1hbHRlcmEuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWFsdGVyYS5jCmluZGV4IDNmODdhMDMuLjViZGRiZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLWFsdGVyYS5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWFsdGVyYS5jCkBAIC0xNyw2ICsxNyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1hcml6b25hLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1hcml6b25hLmMKaW5kZXggOTkxMzcwNC4uNDgyNDYyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tYXJpem9uYS5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWFyaXpvbmEuYwpAQCAtNzksNyArNzksNyBAQAogCQkJICAgQVJJWk9OQV9HUE5fTFZMLCB2YWx1ZSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0gewogCS5sYWJlbAkJCT0gImFyaXpvbmEiLAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLmRpcmVjdGlvbl9pbnB1dAk9IGFyaXpvbmFfZ3Bpb19kaXJlY3Rpb25faW4sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1hc3BlZWQuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWFzcGVlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYTU5MjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1hc3BlZWQuYwpAQCAtMCwwICsxLDQ1NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IElCTSBDb3JwLgorICoKKyAqIEpvZWwgU3RhbmxleSA8am9lbEBqbXMuaWQuYXU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvY29uc3VtZXIuaD4KKworc3RydWN0IGFzcGVlZF9ncGlvIHsKKwlzdHJ1Y3QgZ3Bpb19jaGlwIGNoaXA7CisJc3BpbmxvY2tfdCBsb2NrOworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlpbnQgaXJxOworfTsKKworc3RydWN0IGFzcGVlZF9ncGlvX2JhbmsgeworCXVpbnQxNl90CXZhbF9yZWdzOworCXVpbnQxNl90CWlycV9yZWdzOworCWNvbnN0IGNoYXIJbmFtZXNbNF07Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFzcGVlZF9ncGlvX2JhbmsgYXNwZWVkX2dwaW9fYmFua3NbXSA9IHsKKwl7CisJCS52YWxfcmVncyA9IDB4MDAwMCwKKwkJLmlycV9yZWdzID0gMHgwMDA4LAorCQkubmFtZXMgPSB7ICdBJywgJ0InLCAnQycsICdEJyB9LAorCX0sCisJeworCQkudmFsX3JlZ3MgPSAweDAwMjAsCisJCS5pcnFfcmVncyA9IDB4MDAyOCwKKwkJLm5hbWVzID0geyAnRScsICdGJywgJ0cnLCAnSCcgfSwKKwl9LAorCXsKKwkJLnZhbF9yZWdzID0gMHgwMDcwLAorCQkuaXJxX3JlZ3MgPSAweDAwOTgsCisJCS5uYW1lcyA9IHsgJ0knLCAnSicsICdLJywgJ0wnIH0sCisJfSwKKwl7CisJCS52YWxfcmVncyA9IDB4MDA3OCwKKwkJLmlycV9yZWdzID0gMHgwMGU4LAorCQkubmFtZXMgPSB7ICdNJywgJ04nLCAnTycsICdQJyB9LAorCX0sCisJeworCQkudmFsX3JlZ3MgPSAweDAwODAsCisJCS5pcnFfcmVncyA9IDB4MDExOCwKKwkJLm5hbWVzID0geyAnUScsICdSJywgJ1MnLCAnVCcgfSwKKwl9LAorCXsKKwkJLnZhbF9yZWdzID0gMHgwMDg4LAorCQkuaXJxX3JlZ3MgPSAweDAxNDgsCisJCS5uYW1lcyA9IHsgJ1UnLCAnVicsICdXJywgJ1gnIH0sCisJfSwKKwkvKgorCSAqIEEgYmFuayBleGlzdHMgZm9yIHsgJ1knLCAnWicsICJBQSIsICJBQiIgfSwgYnV0IGlzIG5vdCBpbXBsZW1lbnRlZC4KKwkgKiBPbmx5IGhhbGYgb2YgR1BJT3MgWSBzdXBwb3J0IGludGVycnVwdCBjb25maWd1cmF0aW9uLCBhbmQgbm9uZSBvZiBaLAorCSAqIEFBIG9yIEFCIGRvIGFzIHRoZXkgYXJlIG91dHB1dCBvbmx5LgorCSAqLworfTsKKworI2RlZmluZSBHUElPX0JBTksoeCkJKCh4KSA+PiA1KQorI2RlZmluZSBHUElPX09GRlNFVCh4KQkoKHgpICYgMHgxZikKKyNkZWZpbmUgR1BJT19CSVQoeCkJQklUKEdQSU9fT0ZGU0VUKHgpKQorCisjZGVmaW5lIEdQSU9fREFUQQkweDAwCisjZGVmaW5lIEdQSU9fRElSCTB4MDQKKworI2RlZmluZSBHUElPX0lSUV9FTkFCTEUJMHgwMAorI2RlZmluZSBHUElPX0lSUV9UWVBFMAkweDA0CisjZGVmaW5lIEdQSU9fSVJRX1RZUEUxCTB4MDgKKyNkZWZpbmUgR1BJT19JUlFfVFlQRTIJMHgwYworI2RlZmluZSBHUElPX0lSUV9TVEFUVVMJMHgxMAorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFzcGVlZF9ncGlvX2JhbmsgKnRvX2JhbmsodW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwl1bnNpZ25lZCBpbnQgYmFuayA9IEdQSU9fQkFOSyhvZmZzZXQpOworCisJV0FSTl9PTihiYW5rID4gQVJSQVlfU0laRShhc3BlZWRfZ3Bpb19iYW5rcykpOworCXJldHVybiAmYXNwZWVkX2dwaW9fYmFua3NbYmFua107Cit9CisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKmJhbmtfdmFsX3JlZyhzdHJ1Y3QgYXNwZWVkX2dwaW8gKmdwaW8sCisJCWNvbnN0IHN0cnVjdCBhc3BlZWRfZ3Bpb19iYW5rICpiYW5rLAorCQl1bnNpZ25lZCBpbnQgcmVnKQoreworCXJldHVybiBncGlvLT5iYXNlICsgYmFuay0+dmFsX3JlZ3MgKyByZWc7Cit9CisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKmJhbmtfaXJxX3JlZyhzdHJ1Y3QgYXNwZWVkX2dwaW8gKmdwaW8sCisJCWNvbnN0IHN0cnVjdCBhc3BlZWRfZ3Bpb19iYW5rICpiYW5rLAorCQl1bnNpZ25lZCBpbnQgcmVnKQoreworCXJldHVybiBncGlvLT5iYXNlICsgYmFuay0+aXJxX3JlZ3MgKyByZWc7Cit9CisKK3N0YXRpYyBpbnQgYXNwZWVkX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCBhc3BlZWRfZ3BpbyAqZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGdjKTsKKwljb25zdCBzdHJ1Y3QgYXNwZWVkX2dwaW9fYmFuayAqYmFuayA9IHRvX2Jhbmsob2Zmc2V0KTsKKworCXJldHVybiAhIShpb3JlYWQzMihiYW5rX3ZhbF9yZWcoZ3BpbywgYmFuaywgR1BJT19EQVRBKSkKKwkJCSYgR1BJT19CSVQob2Zmc2V0KSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fYXNwZWVkX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkJICAgICAgaW50IHZhbCkKK3sKKwlzdHJ1Y3QgYXNwZWVkX2dwaW8gKmdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShnYyk7CisJY29uc3Qgc3RydWN0IGFzcGVlZF9ncGlvX2JhbmsgKmJhbmsgPSB0b19iYW5rKG9mZnNldCk7CisJdm9pZCBfX2lvbWVtICphZGRyOworCXUzMiByZWc7CisKKwlhZGRyID0gYmFua192YWxfcmVnKGdwaW8sIGJhbmssIEdQSU9fREFUQSk7CisJcmVnID0gaW9yZWFkMzIoYWRkcik7CisKKwlpZiAodmFsKQorCQlyZWcgfD0gR1BJT19CSVQob2Zmc2V0KTsKKwllbHNlCisJCXJlZyAmPSB+R1BJT19CSVQob2Zmc2V0KTsKKworCWlvd3JpdGUzMihyZWcsIGFkZHIpOworfQorCitzdGF0aWMgdm9pZCBhc3BlZWRfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCQkgICAgaW50IHZhbCkKK3sKKwlzdHJ1Y3QgYXNwZWVkX2dwaW8gKmdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShnYyk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvLT5sb2NrLCBmbGFncyk7CisKKwlfX2FzcGVlZF9ncGlvX3NldChnYywgb2Zmc2V0LCB2YWwpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpby0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGFzcGVlZF9ncGlvX2Rpcl9pbihzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgYXNwZWVkX2dwaW8gKmdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShnYyk7CisJY29uc3Qgc3RydWN0IGFzcGVlZF9ncGlvX2JhbmsgKmJhbmsgPSB0b19iYW5rKG9mZnNldCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgcmVnOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW8tPmxvY2ssIGZsYWdzKTsKKworCXJlZyA9IGlvcmVhZDMyKGJhbmtfdmFsX3JlZyhncGlvLCBiYW5rLCBHUElPX0RJUikpOworCWlvd3JpdGUzMihyZWcgJiB+R1BJT19CSVQob2Zmc2V0KSwgYmFua192YWxfcmVnKGdwaW8sIGJhbmssIEdQSU9fRElSKSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc3BlZWRfZ3Bpb19kaXJfb3V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQsIGludCB2YWwpCit7CisJc3RydWN0IGFzcGVlZF9ncGlvICpncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoZ2MpOworCWNvbnN0IHN0cnVjdCBhc3BlZWRfZ3Bpb19iYW5rICpiYW5rID0gdG9fYmFuayhvZmZzZXQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHJlZzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvLT5sb2NrLCBmbGFncyk7CisKKwlyZWcgPSBpb3JlYWQzMihiYW5rX3ZhbF9yZWcoZ3BpbywgYmFuaywgR1BJT19ESVIpKTsKKwlpb3dyaXRlMzIocmVnIHwgR1BJT19CSVQob2Zmc2V0KSwgYmFua192YWxfcmVnKGdwaW8sIGJhbmssIEdQSU9fRElSKSk7CisKKwlfX2FzcGVlZF9ncGlvX3NldChnYywgb2Zmc2V0LCB2YWwpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpby0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXNwZWVkX2dwaW9fZ2V0X2RpcmVjdGlvbihzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgYXNwZWVkX2dwaW8gKmdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShnYyk7CisJY29uc3Qgc3RydWN0IGFzcGVlZF9ncGlvX2JhbmsgKmJhbmsgPSB0b19iYW5rKG9mZnNldCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgdmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW8tPmxvY2ssIGZsYWdzKTsKKworCXZhbCA9IGlvcmVhZDMyKGJhbmtfdmFsX3JlZyhncGlvLCBiYW5rLCBHUElPX0RJUikpICYgR1BJT19CSVQob2Zmc2V0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW8tPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAhdmFsOworCit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlycWRfdG9fYXNwZWVkX2dwaW9fZGF0YShzdHJ1Y3QgaXJxX2RhdGEgKmQsCisJCXN0cnVjdCBhc3BlZWRfZ3BpbyAqKmdwaW8sCisJCWNvbnN0IHN0cnVjdCBhc3BlZWRfZ3Bpb19iYW5rICoqYmFuaywKKwkJdTMyICpiaXQpCit7CisJaW50IG9mZnNldDsKKworCW9mZnNldCA9IGlycWRfdG9faHdpcnEoZCk7CisKKwkqZ3BpbyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCSpiYW5rID0gdG9fYmFuayhvZmZzZXQpOworCSpiaXQgPSBHUElPX0JJVChvZmZzZXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFzcGVlZF9ncGlvX2lycV9hY2soc3RydWN0IGlycV9kYXRhICpkKQoreworCWNvbnN0IHN0cnVjdCBhc3BlZWRfZ3Bpb19iYW5rICpiYW5rOworCXN0cnVjdCBhc3BlZWRfZ3BpbyAqZ3BpbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvaWQgX19pb21lbSAqc3RhdHVzX2FkZHI7CisJdTMyIGJpdDsKKwlpbnQgcmM7CisKKwlyYyA9IGlycWRfdG9fYXNwZWVkX2dwaW9fZGF0YShkLCAmZ3BpbywgJmJhbmssICZiaXQpOworCWlmIChyYykKKwkJcmV0dXJuOworCisJc3RhdHVzX2FkZHIgPSBiYW5rX2lycV9yZWcoZ3BpbywgYmFuaywgR1BJT19JUlFfU1RBVFVTKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvLT5sb2NrLCBmbGFncyk7CisJaW93cml0ZTMyKGJpdCwgc3RhdHVzX2FkZHIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW8tPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYXNwZWVkX2dwaW9faXJxX3NldF9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCwgYm9vbCBzZXQpCit7CisJY29uc3Qgc3RydWN0IGFzcGVlZF9ncGlvX2JhbmsgKmJhbms7CisJc3RydWN0IGFzcGVlZF9ncGlvICpncGlvOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHJlZywgYml0OworCXZvaWQgX19pb21lbSAqYWRkcjsKKwlpbnQgcmM7CisKKwlyYyA9IGlycWRfdG9fYXNwZWVkX2dwaW9fZGF0YShkLCAmZ3BpbywgJmJhbmssICZiaXQpOworCWlmIChyYykKKwkJcmV0dXJuOworCisJYWRkciA9IGJhbmtfaXJxX3JlZyhncGlvLCBiYW5rLCBHUElPX0lSUV9FTkFCTEUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW8tPmxvY2ssIGZsYWdzKTsKKworCXJlZyA9IGlvcmVhZDMyKGFkZHIpOworCWlmIChzZXQpCisJCXJlZyB8PSBiaXQ7CisJZWxzZQorCQlyZWcgJj0gYml0OworCWlvd3JpdGUzMihyZWcsIGFkZHIpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpby0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhc3BlZWRfZ3Bpb19pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJYXNwZWVkX2dwaW9faXJxX3NldF9tYXNrKGQsIGZhbHNlKTsKK30KKworc3RhdGljIHZvaWQgYXNwZWVkX2dwaW9faXJxX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJYXNwZWVkX2dwaW9faXJxX3NldF9tYXNrKGQsIHRydWUpOworfQorCitzdGF0aWMgaW50IGFzcGVlZF9ncGlvX3NldF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IHR5cGUpCit7CisJdTMyIHR5cGUwID0gMDsKKwl1MzIgdHlwZTEgPSAwOworCXUzMiB0eXBlMiA9IDA7CisJdTMyIGJpdCwgcmVnOworCWNvbnN0IHN0cnVjdCBhc3BlZWRfZ3Bpb19iYW5rICpiYW5rOworCWlycV9mbG93X2hhbmRsZXJfdCBoYW5kbGVyOworCXN0cnVjdCBhc3BlZWRfZ3BpbyAqZ3BpbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvaWQgX19pb21lbSAqYWRkcjsKKwlpbnQgcmM7CisKKwlyYyA9IGlycWRfdG9fYXNwZWVkX2dwaW9fZGF0YShkLCAmZ3BpbywgJmJhbmssICZiaXQpOworCWlmIChyYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKHR5cGUgJiBJUlFfVFlQRV9TRU5TRV9NQVNLKSB7CisJY2FzZSBJUlFfVFlQRV9FREdFX0JPVEg6CisJCXR5cGUyIHw9IGJpdDsKKwljYXNlIElSUV9UWVBFX0VER0VfUklTSU5HOgorCQl0eXBlMCB8PSBiaXQ7CisJY2FzZSBJUlFfVFlQRV9FREdFX0ZBTExJTkc6CisJCWhhbmRsZXIgPSBoYW5kbGVfZWRnZV9pcnE7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfTEVWRUxfSElHSDoKKwkJdHlwZTAgfD0gYml0OworCWNhc2UgSVJRX1RZUEVfTEVWRUxfTE9XOgorCQl0eXBlMSB8PSBiaXQ7CisJCWhhbmRsZXIgPSBoYW5kbGVfbGV2ZWxfaXJxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpby0+bG9jaywgZmxhZ3MpOworCisJYWRkciA9IGJhbmtfaXJxX3JlZyhncGlvLCBiYW5rLCBHUElPX0lSUV9UWVBFMCk7CisJcmVnID0gaW9yZWFkMzIoYWRkcik7CisJcmVnID0gKHJlZyAmIH5iaXQpIHwgdHlwZTA7CisJaW93cml0ZTMyKHJlZywgYWRkcik7CisKKwlhZGRyID0gYmFua19pcnFfcmVnKGdwaW8sIGJhbmssIEdQSU9fSVJRX1RZUEUxKTsKKwlyZWcgPSBpb3JlYWQzMihhZGRyKTsKKwlyZWcgPSAocmVnICYgfmJpdCkgfCB0eXBlMTsKKwlpb3dyaXRlMzIocmVnLCBhZGRyKTsKKworCWFkZHIgPSBiYW5rX2lycV9yZWcoZ3BpbywgYmFuaywgR1BJT19JUlFfVFlQRTIpOworCXJlZyA9IGlvcmVhZDMyKGFkZHIpOworCXJlZyA9IChyZWcgJiB+Yml0KSB8IHR5cGUyOworCWlvd3JpdGUzMihyZWcsIGFkZHIpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpby0+bG9jaywgZmxhZ3MpOworCisJaXJxX3NldF9oYW5kbGVyX2xvY2tlZChkLCBoYW5kbGVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhc3BlZWRfZ3Bpb19pcnFfaGFuZGxlcihzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IGdwaW9fY2hpcCAqZ2MgPSBpcnFfZGVzY19nZXRfaGFuZGxlcl9kYXRhKGRlc2MpOworCXN0cnVjdCBpcnFfY2hpcCAqaWMgPSBpcnFfZGVzY19nZXRfY2hpcChkZXNjKTsKKwlzdHJ1Y3QgYXNwZWVkX2dwaW8gKmRhdGEgPSBncGlvY2hpcF9nZXRfZGF0YShnYyk7CisJdW5zaWduZWQgaW50IGksIHAsIGdpcnE7CisJdW5zaWduZWQgbG9uZyByZWc7CisKKwljaGFpbmVkX2lycV9lbnRlcihpYywgZGVzYyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhc3BlZWRfZ3Bpb19iYW5rcyk7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgYXNwZWVkX2dwaW9fYmFuayAqYmFuayA9ICZhc3BlZWRfZ3Bpb19iYW5rc1tpXTsKKworCQlyZWcgPSBpb3JlYWQzMihiYW5rX2lycV9yZWcoZGF0YSwgYmFuaywgR1BJT19JUlFfU1RBVFVTKSk7CisKKwkJZm9yX2VhY2hfc2V0X2JpdChwLCAmcmVnLCAzMikgeworCQkJZ2lycSA9IGlycV9maW5kX21hcHBpbmcoZ2MtPmlycWRvbWFpbiwgaSAqIDMyICsgcCk7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEoZ2lycSk7CisJCX0KKworCX0KKworCWNoYWluZWRfaXJxX2V4aXQoaWMsIGRlc2MpOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGFzcGVlZF9ncGlvX2lycWNoaXAgPSB7CisJLm5hbWUJCT0gImFzcGVlZC1ncGlvIiwKKwkuaXJxX2Fjawk9IGFzcGVlZF9ncGlvX2lycV9hY2ssCisJLmlycV9tYXNrCT0gYXNwZWVkX2dwaW9faXJxX21hc2ssCisJLmlycV91bm1hc2sJPSBhc3BlZWRfZ3Bpb19pcnFfdW5tYXNrLAorCS5pcnFfc2V0X3R5cGUJPSBhc3BlZWRfZ3Bpb19zZXRfdHlwZSwKK307CisKK3N0YXRpYyBpbnQgYXNwZWVkX2dwaW9fc2V0dXBfaXJxcyhzdHJ1Y3QgYXNwZWVkX2dwaW8gKmdwaW8sCisJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJjOworCisJcmMgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCWdwaW8tPmlycSA9IHJjOworCisJcmMgPSBncGlvY2hpcF9pcnFjaGlwX2FkZCgmZ3Bpby0+Y2hpcCwgJmFzcGVlZF9ncGlvX2lycWNoaXAsCisJCQkwLCBoYW5kbGVfYmFkX2lycSwgSVJRX1RZUEVfTk9ORSk7CisJaWYgKHJjKSB7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJDb3VsZCBub3QgYWRkIGlycWNoaXBcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJZ3Bpb2NoaXBfc2V0X2NoYWluZWRfaXJxY2hpcCgmZ3Bpby0+Y2hpcCwgJmFzcGVlZF9ncGlvX2lycWNoaXAsCisJCQkJICAgICBncGlvLT5pcnEsIGFzcGVlZF9ncGlvX2lycV9oYW5kbGVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzcGVlZF9ncGlvX3JlcXVlc3Qoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gcGluY3RybF9yZXF1ZXN0X2dwaW8oY2hpcC0+YmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIGFzcGVlZF9ncGlvX2ZyZWUoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlwaW5jdHJsX2ZyZWVfZ3BpbyhjaGlwLT5iYXNlICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGludCBfX2luaXQgYXNwZWVkX2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYXNwZWVkX2dwaW8gKmdwaW87CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IHJjOworCisJZ3BpbyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmdwaW8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdwaW8pCisJCXJldHVybiAtRU5PTUVNOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlncGlvLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihncGlvLT5iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoZ3Bpby0+YmFzZSk7CisKKwlzcGluX2xvY2tfaW5pdCgmZ3Bpby0+bG9jayk7CisKKwlncGlvLT5jaGlwLm5ncGlvID0gQVJSQVlfU0laRShhc3BlZWRfZ3Bpb19iYW5rcykgKiAzMjsKKworCWdwaW8tPmNoaXAucGFyZW50ID0gJnBkZXYtPmRldjsKKwlncGlvLT5jaGlwLmRpcmVjdGlvbl9pbnB1dCA9IGFzcGVlZF9ncGlvX2Rpcl9pbjsKKwlncGlvLT5jaGlwLmRpcmVjdGlvbl9vdXRwdXQgPSBhc3BlZWRfZ3Bpb19kaXJfb3V0OworCWdwaW8tPmNoaXAuZ2V0X2RpcmVjdGlvbiA9IGFzcGVlZF9ncGlvX2dldF9kaXJlY3Rpb247CisJZ3Bpby0+Y2hpcC5yZXF1ZXN0ID0gYXNwZWVkX2dwaW9fcmVxdWVzdDsKKwlncGlvLT5jaGlwLmZyZWUgPSBhc3BlZWRfZ3Bpb19mcmVlOworCWdwaW8tPmNoaXAuZ2V0ID0gYXNwZWVkX2dwaW9fZ2V0OworCWdwaW8tPmNoaXAuc2V0ID0gYXNwZWVkX2dwaW9fc2V0OworCWdwaW8tPmNoaXAubGFiZWwgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKKwlncGlvLT5jaGlwLmJhc2UgPSAtMTsKKworCXJjID0gZGV2bV9ncGlvY2hpcF9hZGRfZGF0YSgmcGRldi0+ZGV2LCAmZ3Bpby0+Y2hpcCwgZ3Bpbyk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIGFzcGVlZF9ncGlvX3NldHVwX2lycXMoZ3BpbywgcGRldik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFzcGVlZF9ncGlvX29mX3RhYmxlW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJhc3BlZWQsYXN0MjQwMC1ncGlvIiB9LAorCXsgLmNvbXBhdGlibGUgPSAiYXNwZWVkLGFzdDI1MDAtZ3BpbyIgfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGFzcGVlZF9ncGlvX29mX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXNwZWVkX2dwaW9fZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gS0JVSUxEX01PRE5BTUUsCisJCS5vZl9tYXRjaF90YWJsZSA9IGFzcGVlZF9ncGlvX29mX3RhYmxlLAorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyX3Byb2JlKGFzcGVlZF9ncGlvX2RyaXZlciwgYXNwZWVkX2dwaW9fcHJvYmUpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFzcGVlZCBHUElPIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tYXRoNzkuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWF0aDc5LmMKaW5kZXggYzRmNGNkZC4uOTQ1N2UyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tYXRoNzkuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1hdGg3OS5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9ncGlvLWF0aDc5Lmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAKICNkZWZpbmUgQVI3MVhYX0dQSU9fUkVHX09FCQkweDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1heHAyMDkuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWF4cDIwOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YzJhNTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1heHAyMDkuYwpAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIEFYUDIweCBHUElPIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBNYXhpbWUgUmlwYXJkIDxtYXhpbWUucmlwYXJkQGZyZWUtZWxlY3Ryb25zLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvYXhwMjB4Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNkZWZpbmUgQVhQMjBYX0dQSU9fRlVOQ1RJT05TCQkweDcKKyNkZWZpbmUgQVhQMjBYX0dQSU9fRlVOQ1RJT05fT1VUX0xPVwkwCisjZGVmaW5lIEFYUDIwWF9HUElPX0ZVTkNUSU9OX09VVF9ISUdICTEKKyNkZWZpbmUgQVhQMjBYX0dQSU9fRlVOQ1RJT05fSU5QVVQJMgorCitzdHJ1Y3QgYXhwMjB4X2dwaW8geworCXN0cnVjdCBncGlvX2NoaXAJY2hpcDsKKwlzdHJ1Y3QgcmVnbWFwCQkqcmVnbWFwOworfTsKKworc3RhdGljIGludCBheHAyMHhfZ3Bpb19nZXRfcmVnKHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzd2l0Y2ggKG9mZnNldCkgeworCWNhc2UgMDoKKwkJcmV0dXJuIEFYUDIwWF9HUElPMF9DVFJMOworCWNhc2UgMToKKwkJcmV0dXJuIEFYUDIwWF9HUElPMV9DVFJMOworCWNhc2UgMjoKKwkJcmV0dXJuIEFYUDIwWF9HUElPMl9DVFJMOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGF4cDIweF9ncGlvX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgYXhwMjB4X2dwaW8gKmdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKwlpbnQgcmVnOworCisJcmVnID0gYXhwMjB4X2dwaW9fZ2V0X3JlZyhvZmZzZXQpOworCWlmIChyZWcgPCAwKQorCQlyZXR1cm4gcmVnOworCisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhncGlvLT5yZWdtYXAsIHJlZywKKwkJCQkgIEFYUDIwWF9HUElPX0ZVTkNUSU9OUywKKwkJCQkgIEFYUDIwWF9HUElPX0ZVTkNUSU9OX0lOUFVUKTsKK30KKworc3RhdGljIGludCBheHAyMHhfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBheHAyMHhfZ3BpbyAqZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IHJlZywgcmV0OworCisJcmVnID0gYXhwMjB4X2dwaW9fZ2V0X3JlZyhvZmZzZXQpOworCWlmIChyZWcgPCAwKQorCQlyZXR1cm4gcmVnOworCisJcmV0ID0gcmVnbWFwX3JlYWQoZ3Bpby0+cmVnbWFwLCByZWcsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gISEodmFsICYgQklUKG9mZnNldCArIDQpKTsKK30KKworc3RhdGljIGludCBheHAyMHhfZ3Bpb19nZXRfZGlyZWN0aW9uKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgYXhwMjB4X2dwaW8gKmdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCByZWcsIHJldDsKKworCXJlZyA9IGF4cDIweF9ncGlvX2dldF9yZWcob2Zmc2V0KTsKKwlpZiAocmVnIDwgMCkKKwkJcmV0dXJuIHJlZzsKKworCXJldCA9IHJlZ21hcF9yZWFkKGdwaW8tPnJlZ21hcCwgcmVnLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBUaGlzIHNob3VsZG4ndCByZWFsbHkgaGFwcGVuIGlmIHRoZSBwaW4gaXMgaW4gdXNlIGFscmVhZHksCisJICogb3IgaWYgaXQncyBub3QgaW4gdXNlIHlldCwgaXQgZG9lc24ndCBtYXR0ZXIgc2luY2Ugd2UncmUKKwkgKiBnb2luZyB0byBjaGFuZ2UgdGhlIHZhbHVlIHNvb24gYW55d2F5LiBEZWZhdWx0IHRvIG91dHB1dC4KKwkgKi8KKwlpZiAoKHZhbCAmIEFYUDIwWF9HUElPX0ZVTkNUSU9OUykgPiAyKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogVGhlIEdQSU8gZGlyZWN0aW9ucyBhcmUgdGhlIHRocmVlIGxvd2VzdCB2YWx1ZXMuCisJICogMiBpcyBpbnB1dCwgMCBhbmQgMSBhcmUgb3V0cHV0CisJICovCisJcmV0dXJuIHZhbCAmIDI7Cit9CisKK3N0YXRpYyBpbnQgYXhwMjB4X2dwaW9fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwKKwkJCSAgICAgIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgYXhwMjB4X2dwaW8gKmdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKwlpbnQgcmVnOworCisJcmVnID0gYXhwMjB4X2dwaW9fZ2V0X3JlZyhvZmZzZXQpOworCWlmIChyZWcgPCAwKQorCQlyZXR1cm4gcmVnOworCisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhncGlvLT5yZWdtYXAsIHJlZywKKwkJCQkgIEFYUDIwWF9HUElPX0ZVTkNUSU9OUywKKwkJCQkgIHZhbHVlID8gQVhQMjBYX0dQSU9fRlVOQ1RJT05fT1VUX0hJR0gKKwkJCQkgIDogQVhQMjBYX0dQSU9fRlVOQ1RJT05fT1VUX0xPVyk7Cit9CisKK3N0YXRpYyB2b2lkIGF4cDIweF9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsCisJCQkgICAgaW50IHZhbHVlKQoreworCWF4cDIweF9ncGlvX291dHB1dChjaGlwLCBvZmZzZXQsIHZhbHVlKTsKK30KKworc3RhdGljIGludCBheHAyMHhfZ3Bpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBheHAyMHhfZGV2ICpheHAyMHggPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGF4cDIweF9ncGlvICpncGlvOworCWludCByZXQ7CisKKwlpZiAoIW9mX2RldmljZV9pc19hdmFpbGFibGUocGRldi0+ZGV2Lm9mX25vZGUpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghYXhwMjB4KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlBhcmVudCBkcnZkYXRhIG5vdCBzZXRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlncGlvID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZ3BpbyksIEdGUF9LRVJORUwpOworCWlmICghZ3BpbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlncGlvLT5jaGlwLmJhc2UJCQk9IC0xOworCWdwaW8tPmNoaXAuY2FuX3NsZWVwCQk9IHRydWU7CisJZ3Bpby0+Y2hpcC5wYXJlbnQJCT0gJnBkZXYtPmRldjsKKwlncGlvLT5jaGlwLmxhYmVsCQk9IGRldl9uYW1lKCZwZGV2LT5kZXYpOworCWdwaW8tPmNoaXAub3duZXIJCT0gVEhJU19NT0RVTEU7CisJZ3Bpby0+Y2hpcC5nZXQJCQk9IGF4cDIweF9ncGlvX2dldDsKKwlncGlvLT5jaGlwLmdldF9kaXJlY3Rpb24JPSBheHAyMHhfZ3Bpb19nZXRfZGlyZWN0aW9uOworCWdwaW8tPmNoaXAuc2V0CQkJPSBheHAyMHhfZ3Bpb19zZXQ7CisJZ3Bpby0+Y2hpcC5kaXJlY3Rpb25faW5wdXQJPSBheHAyMHhfZ3Bpb19pbnB1dDsKKwlncGlvLT5jaGlwLmRpcmVjdGlvbl9vdXRwdXQJPSBheHAyMHhfZ3Bpb19vdXRwdXQ7CisJZ3Bpby0+Y2hpcC5uZ3BpbwkJPSAzOworCisJZ3Bpby0+cmVnbWFwID0gYXhwMjB4LT5yZWdtYXA7CisKKwlyZXQgPSBkZXZtX2dwaW9jaGlwX2FkZF9kYXRhKCZwZGV2LT5kZXYsICZncGlvLT5jaGlwLCBncGlvKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBHUElPIGNoaXBcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJBWFAyMDkgR1BJTyBkcml2ZXIgbG9hZGVkXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBheHAyMHhfZ3Bpb19tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAieC1wb3dlcnMsYXhwMjA5LWdwaW8iIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYXhwMjB4X2dwaW9fbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBheHAyMHhfZ3Bpb19kcml2ZXIgPSB7CisJLnByb2JlCQk9IGF4cDIweF9ncGlvX3Byb2JlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCQk9ICJheHAyMHgtZ3BpbyIsCisJCS5vZl9tYXRjaF90YWJsZQk9IGF4cDIweF9ncGlvX21hdGNoLAorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGF4cDIweF9ncGlvX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIk1heGltZSBSaXBhcmQgPG1heGltZS5yaXBhcmRAZnJlZS1lbGVjdHJvbnMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBWFAyMHggUE1JQyBHUElPIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tYmNtLWtvbmEuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWJjbS1rb25hLmMKaW5kZXggOTUzZTRiOC4uM2QxY2YwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tYmNtLWtvbmEuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1iY20ta29uYS5jCkBAIC0zMDgsNyArMzA4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgdGVtcGxhdGVfY2hpcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CiAJLmxhYmVsID0gImJjbS1rb25hLWdwaW8iLAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5yZXF1ZXN0ID0gYmNtX2tvbmFfZ3Bpb19yZXF1ZXN0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tZGE5MDUyLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1kYTkwNTIuYwppbmRleCBlMjk1NTNiLi5kZDg5NzdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1kYTkwNTIuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1kYTkwNTIuYwpAQCAtMTg0LDcgKzE4NCw3IEBACiAJcmV0dXJuIGlycTsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgcmVmZXJlbmNlX2dwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2NoaXAgcmVmZXJlbmNlX2dwID0gewogCS5sYWJlbCA9ICJkYTkwNTItZ3BpbyIsCiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLmdldCA9IGRhOTA1Ml9ncGlvX2dldCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWRhOTA1NS5jIGIvZHJpdmVycy9ncGlvL2dwaW8tZGE5MDU1LmMKaW5kZXggMmMyYzE4ZC4uODIwNTNiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tZGE5MDU1LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tZGE5MDU1LmMKQEAgLTEyMSw3ICsxMjEsNyBAQAogCQkJCSAgREE5MDU1X0lSUV9HUEkwICsgb2Zmc2V0KTsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgcmVmZXJlbmNlX2dwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2NoaXAgcmVmZXJlbmNlX2dwID0gewogCS5sYWJlbCA9ICJkYTkwNTUtZ3BpbyIsCiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLmdldCA9IGRhOTA1NV9ncGlvX2dldCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWY3MTg4eC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tZjcxODh4LmMKaW5kZXggNjAwYmU4NC4uZThhY2NkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tZjcxODh4LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tZjcxODh4LmMKQEAgLTIxNCw4ICsyMTQsNyBAQAogc3RhdGljIGludCBmNzE4OHhfZ3Bpb19nZXRfZGlyZWN0aW9uKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKIHsKIAlpbnQgZXJyOwotCXN0cnVjdCBmNzE4OHhfZ3Bpb19iYW5rICpiYW5rID0KLQkJY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBmNzE4OHhfZ3Bpb19iYW5rLCBjaGlwKTsKKwlzdHJ1Y3QgZjcxODh4X2dwaW9fYmFuayAqYmFuayA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOwogCXN0cnVjdCBmNzE4OHhfc2lvICpzaW8gPSBiYW5rLT5kYXRhLT5zaW87CiAJdTggZGlyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1ncGlvLW1tLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1ncGlvLW1tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3ZGVmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWdwaW8tbW0uYwpAQCAtMCwwICsxLDI2NyBAQAorLyoKKyAqIEdQSU8gZHJpdmVyIGZvciB0aGUgRGlhbW9uZCBTeXN0ZW1zIEdQSU8tTU0KKyAqIENvcHlyaWdodCAoQykgMjAxNiBXaWxsaWFtIEJyZWF0aGl0dCBHcmF5CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBEaWFtb25kIFN5c3RlbXMgZGV2aWNlczogR1BJTy1NTSBhbmQKKyAqIEdQSU8tTU0tMTIuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8vZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pc2EuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNkZWZpbmUgR1BJT01NX0VYVEVOVCA4CisjZGVmaW5lIE1BWF9OVU1fR1BJT01NIG1heF9udW1faXNhX2RldihHUElPTU1fRVhURU5UKQorCitzdGF0aWMgdW5zaWduZWQgaW50IGJhc2VbTUFYX05VTV9HUElPTU1dOworc3RhdGljIHVuc2lnbmVkIGludCBudW1fZ3Bpb21tOworbW9kdWxlX3BhcmFtX2FycmF5KGJhc2UsIHVpbnQsICZudW1fZ3Bpb21tLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYmFzZSwgIkRpYW1vbmQgU3lzdGVtcyBHUElPLU1NIGJhc2UgYWRkcmVzc2VzIik7CisKKy8qKgorICogc3RydWN0IGdwaW9tbV9ncGlvIC0gR1BJTyBkZXZpY2UgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQorICogQGNoaXA6CWluc3RhbmNlIG9mIHRoZSBncGlvX2NoaXAKKyAqIEBpb19zdGF0ZToJYml0IEkvTyBzdGF0ZSAod2hldGhlciBiaXQgaXMgc2V0IHRvIGlucHV0IG9yIG91dHB1dCkKKyAqIEBvdXRfc3RhdGU6CW91dHB1dCBiaXRzIHN0YXRlCisgKiBAY29udHJvbDoJQ29udHJvbCByZWdpc3RlcnMgc3RhdGUKKyAqIEBsb2NrOglzeW5jaHJvbml6YXRpb24gbG9jayB0byBwcmV2ZW50IEkvTyByYWNlIGNvbmRpdGlvbnMKKyAqIEBiYXNlOgliYXNlIHBvcnQgYWRkcmVzcyBvZiB0aGUgR1BJTyBkZXZpY2UKKyAqLworc3RydWN0IGdwaW9tbV9ncGlvIHsKKwlzdHJ1Y3QgZ3Bpb19jaGlwIGNoaXA7CisJdW5zaWduZWQgY2hhciBpb19zdGF0ZVs2XTsKKwl1bnNpZ25lZCBjaGFyIG91dF9zdGF0ZVs2XTsKKwl1bnNpZ25lZCBjaGFyIGNvbnRyb2xbMl07CisJc3BpbmxvY2tfdCBsb2NrOworCXVuc2lnbmVkIGludCBiYXNlOworfTsKKworc3RhdGljIGludCBncGlvbW1fZ3Bpb19nZXRfZGlyZWN0aW9uKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgZ3Bpb21tX2dwaW8gKmNvbnN0IGdwaW9tbWdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKwljb25zdCB1bnNpZ25lZCBpbnQgcG9ydCA9IG9mZnNldCAvIDg7CisJY29uc3QgdW5zaWduZWQgaW50IG1hc2sgPSBCSVQob2Zmc2V0ICUgOCk7CisKKwlyZXR1cm4gISEoZ3Bpb21tZ3Bpby0+aW9fc3RhdGVbcG9ydF0gJiBtYXNrKTsKK30KKworc3RhdGljIGludCBncGlvbW1fZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCBncGlvbW1fZ3BpbyAqY29uc3QgZ3Bpb21tZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCWNvbnN0IHVuc2lnbmVkIGludCBpb19wb3J0ID0gb2Zmc2V0IC8gODsKKwljb25zdCB1bnNpZ25lZCBpbnQgY29udHJvbF9wb3J0ID0gaW9fcG9ydCAvIDM7CisJY29uc3QgdW5zaWduZWQgaW50IGNvbnRyb2xfYWRkciA9IGdwaW9tbWdwaW8tPmJhc2UgKyAzICsgY29udHJvbF9wb3J0KjQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgY29udHJvbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvbW1ncGlvLT5sb2NrLCBmbGFncyk7CisKKwkvKiBDaGVjayBpZiBjb25maWd1cmluZyBQb3J0IEMgKi8KKwlpZiAoaW9fcG9ydCA9PSAyIHx8IGlvX3BvcnQgPT0gNSkgeworCQkvKiBQb3J0IEMgY2FuIGJlIGNvbmZpZ3VyZWQgYnkgbmliYmxlICovCisJCWlmIChvZmZzZXQgJSA4ID4gMykgeworCQkJZ3Bpb21tZ3Bpby0+aW9fc3RhdGVbaW9fcG9ydF0gfD0gMHhGMDsKKwkJCWdwaW9tbWdwaW8tPmNvbnRyb2xbY29udHJvbF9wb3J0XSB8PSBCSVQoMyk7CisJCX0gZWxzZSB7CisJCQlncGlvbW1ncGlvLT5pb19zdGF0ZVtpb19wb3J0XSB8PSAweDBGOworCQkJZ3Bpb21tZ3Bpby0+Y29udHJvbFtjb250cm9sX3BvcnRdIHw9IEJJVCgwKTsKKwkJfQorCX0gZWxzZSB7CisJCWdwaW9tbWdwaW8tPmlvX3N0YXRlW2lvX3BvcnRdIHw9IDB4RkY7CisJCWlmIChpb19wb3J0ID09IDAgfHwgaW9fcG9ydCA9PSAzKQorCQkJZ3Bpb21tZ3Bpby0+Y29udHJvbFtjb250cm9sX3BvcnRdIHw9IEJJVCg0KTsKKwkJZWxzZQorCQkJZ3Bpb21tZ3Bpby0+Y29udHJvbFtjb250cm9sX3BvcnRdIHw9IEJJVCgxKTsKKwl9CisKKwljb250cm9sID0gQklUKDcpIHwgZ3Bpb21tZ3Bpby0+Y29udHJvbFtjb250cm9sX3BvcnRdOworCW91dGIoY29udHJvbCwgY29udHJvbF9hZGRyKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9tbWdwaW8tPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdwaW9tbV9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGdwaW9tbV9ncGlvICpjb25zdCBncGlvbW1ncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisJY29uc3QgdW5zaWduZWQgaW50IGlvX3BvcnQgPSBvZmZzZXQgLyA4OworCWNvbnN0IHVuc2lnbmVkIGludCBjb250cm9sX3BvcnQgPSBpb19wb3J0IC8gMzsKKwljb25zdCB1bnNpZ25lZCBpbnQgbWFzayA9IEJJVChvZmZzZXQgJSA4KTsKKwljb25zdCB1bnNpZ25lZCBpbnQgY29udHJvbF9hZGRyID0gZ3Bpb21tZ3Bpby0+YmFzZSArIDMgKyBjb250cm9sX3BvcnQqNDsKKwljb25zdCB1bnNpZ25lZCBpbnQgb3V0X3BvcnQgPSAoaW9fcG9ydCA+IDIpID8gaW9fcG9ydCArIDEgOiBpb19wb3J0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGNvbnRyb2w7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb21tZ3Bpby0+bG9jaywgZmxhZ3MpOworCisJLyogQ2hlY2sgaWYgY29uZmlndXJpbmcgUG9ydCBDICovCisJaWYgKGlvX3BvcnQgPT0gMiB8fCBpb19wb3J0ID09IDUpIHsKKwkJLyogUG9ydCBDIGNhbiBiZSBjb25maWd1cmVkIGJ5IG5pYmJsZSAqLworCQlpZiAob2Zmc2V0ICUgOCA+IDMpIHsKKwkJCWdwaW9tbWdwaW8tPmlvX3N0YXRlW2lvX3BvcnRdICY9IDB4MEY7CisJCQlncGlvbW1ncGlvLT5jb250cm9sW2NvbnRyb2xfcG9ydF0gJj0gfkJJVCgzKTsKKwkJfSBlbHNlIHsKKwkJCWdwaW9tbWdwaW8tPmlvX3N0YXRlW2lvX3BvcnRdICY9IDB4RjA7CisJCQlncGlvbW1ncGlvLT5jb250cm9sW2NvbnRyb2xfcG9ydF0gJj0gfkJJVCgwKTsKKwkJfQorCX0gZWxzZSB7CisJCWdwaW9tbWdwaW8tPmlvX3N0YXRlW2lvX3BvcnRdICY9IDB4MDA7CisJCWlmIChpb19wb3J0ID09IDAgfHwgaW9fcG9ydCA9PSAzKQorCQkJZ3Bpb21tZ3Bpby0+Y29udHJvbFtjb250cm9sX3BvcnRdICY9IH5CSVQoNCk7CisJCWVsc2UKKwkJCWdwaW9tbWdwaW8tPmNvbnRyb2xbY29udHJvbF9wb3J0XSAmPSB+QklUKDEpOworCX0KKworCWlmICh2YWx1ZSkKKwkJZ3Bpb21tZ3Bpby0+b3V0X3N0YXRlW2lvX3BvcnRdIHw9IG1hc2s7CisJZWxzZQorCQlncGlvbW1ncGlvLT5vdXRfc3RhdGVbaW9fcG9ydF0gJj0gfm1hc2s7CisKKwljb250cm9sID0gQklUKDcpIHwgZ3Bpb21tZ3Bpby0+Y29udHJvbFtjb250cm9sX3BvcnRdOworCW91dGIoY29udHJvbCwgY29udHJvbF9hZGRyKTsKKworCW91dGIoZ3Bpb21tZ3Bpby0+b3V0X3N0YXRlW2lvX3BvcnRdLCBncGlvbW1ncGlvLT5iYXNlICsgb3V0X3BvcnQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb21tZ3Bpby0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb21tX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc3RydWN0IGdwaW9tbV9ncGlvICpjb25zdCBncGlvbW1ncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisJY29uc3QgdW5zaWduZWQgaW50IHBvcnQgPSBvZmZzZXQgLyA4OworCWNvbnN0IHVuc2lnbmVkIGludCBtYXNrID0gQklUKG9mZnNldCAlIDgpOworCWNvbnN0IHVuc2lnbmVkIGludCBpbl9wb3J0ID0gKHBvcnQgPiAyKSA/IHBvcnQgKyAxIDogcG9ydDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBwb3J0X3N0YXRlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9tbWdwaW8tPmxvY2ssIGZsYWdzKTsKKworCS8qIGVuc3VyZSB0aGF0IEdQSU8gaXMgc2V0IGZvciBpbnB1dCAqLworCWlmICghKGdwaW9tbWdwaW8tPmlvX3N0YXRlW3BvcnRdICYgbWFzaykpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb21tZ3Bpby0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwb3J0X3N0YXRlID0gaW5iKGdwaW9tbWdwaW8tPmJhc2UgKyBpbl9wb3J0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9tbWdwaW8tPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAhIShwb3J0X3N0YXRlICYgbWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIGdwaW9tbV9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCWludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZ3Bpb21tX2dwaW8gKmNvbnN0IGdwaW9tbWdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKwljb25zdCB1bnNpZ25lZCBpbnQgcG9ydCA9IG9mZnNldCAvIDg7CisJY29uc3QgdW5zaWduZWQgaW50IG1hc2sgPSBCSVQob2Zmc2V0ICUgOCk7CisJY29uc3QgdW5zaWduZWQgaW50IG91dF9wb3J0ID0gKHBvcnQgPiAyKSA/IHBvcnQgKyAxIDogcG9ydDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9tbWdwaW8tPmxvY2ssIGZsYWdzKTsKKworCWlmICh2YWx1ZSkKKwkJZ3Bpb21tZ3Bpby0+b3V0X3N0YXRlW3BvcnRdIHw9IG1hc2s7CisJZWxzZQorCQlncGlvbW1ncGlvLT5vdXRfc3RhdGVbcG9ydF0gJj0gfm1hc2s7CisKKwlvdXRiKGdwaW9tbWdwaW8tPm91dF9zdGF0ZVtwb3J0XSwgZ3Bpb21tZ3Bpby0+YmFzZSArIG91dF9wb3J0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9tbWdwaW8tPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBncGlvbW1fcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaWQpCit7CisJc3RydWN0IGdwaW9tbV9ncGlvICpncGlvbW1ncGlvOworCWNvbnN0IGNoYXIgKmNvbnN0IG5hbWUgPSBkZXZfbmFtZShkZXYpOworCWludCBlcnI7CisKKwlncGlvbW1ncGlvID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpncGlvbW1ncGlvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFncGlvbW1ncGlvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICghZGV2bV9yZXF1ZXN0X3JlZ2lvbihkZXYsIGJhc2VbaWRdLCBHUElPTU1fRVhURU5ULCBuYW1lKSkgeworCQlkZXZfZXJyKGRldiwgIlVuYWJsZSB0byBsb2NrIHBvcnQgYWRkcmVzc2VzICgweCVYLTB4JVgpXG4iLAorCQkJYmFzZVtpZF0sIGJhc2VbaWRdICsgR1BJT01NX0VYVEVOVCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJZ3Bpb21tZ3Bpby0+Y2hpcC5sYWJlbCA9IG5hbWU7CisJZ3Bpb21tZ3Bpby0+Y2hpcC5wYXJlbnQgPSBkZXY7CisJZ3Bpb21tZ3Bpby0+Y2hpcC5vd25lciA9IFRISVNfTU9EVUxFOworCWdwaW9tbWdwaW8tPmNoaXAuYmFzZSA9IC0xOworCWdwaW9tbWdwaW8tPmNoaXAubmdwaW8gPSA0ODsKKwlncGlvbW1ncGlvLT5jaGlwLmdldF9kaXJlY3Rpb24gPSBncGlvbW1fZ3Bpb19nZXRfZGlyZWN0aW9uOworCWdwaW9tbWdwaW8tPmNoaXAuZGlyZWN0aW9uX2lucHV0ID0gZ3Bpb21tX2dwaW9fZGlyZWN0aW9uX2lucHV0OworCWdwaW9tbWdwaW8tPmNoaXAuZGlyZWN0aW9uX291dHB1dCA9IGdwaW9tbV9ncGlvX2RpcmVjdGlvbl9vdXRwdXQ7CisJZ3Bpb21tZ3Bpby0+Y2hpcC5nZXQgPSBncGlvbW1fZ3Bpb19nZXQ7CisJZ3Bpb21tZ3Bpby0+Y2hpcC5zZXQgPSBncGlvbW1fZ3Bpb19zZXQ7CisJZ3Bpb21tZ3Bpby0+YmFzZSA9IGJhc2VbaWRdOworCisJc3Bpbl9sb2NrX2luaXQoJmdwaW9tbWdwaW8tPmxvY2spOworCisJZGV2X3NldF9kcnZkYXRhKGRldiwgZ3Bpb21tZ3Bpbyk7CisKKwllcnIgPSBncGlvY2hpcF9hZGRfZGF0YSgmZ3Bpb21tZ3Bpby0+Y2hpcCwgZ3Bpb21tZ3Bpbyk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKGRldiwgIkdQSU8gcmVnaXN0ZXJpbmcgZmFpbGVkICglZClcbiIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogaW5pdGlhbGl6ZSBhbGwgR1BJTyBhcyBvdXRwdXQgKi8KKwlvdXRiKDB4ODAsIGJhc2VbaWRdICsgMyk7CisJb3V0YigweDAwLCBiYXNlW2lkXSk7CisJb3V0YigweDAwLCBiYXNlW2lkXSArIDEpOworCW91dGIoMHgwMCwgYmFzZVtpZF0gKyAyKTsKKwlvdXRiKDB4ODAsIGJhc2VbaWRdICsgNyk7CisJb3V0YigweDAwLCBiYXNlW2lkXSArIDQpOworCW91dGIoMHgwMCwgYmFzZVtpZF0gKyA1KTsKKwlvdXRiKDB4MDAsIGJhc2VbaWRdICsgNik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBncGlvbW1fcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGlkKQoreworCXN0cnVjdCBncGlvbW1fZ3BpbyAqY29uc3QgZ3Bpb21tZ3BpbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJZ3Bpb2NoaXBfcmVtb3ZlKCZncGlvbW1ncGlvLT5jaGlwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlzYV9kcml2ZXIgZ3Bpb21tX2RyaXZlciA9IHsKKwkucHJvYmUgPSBncGlvbW1fcHJvYmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiZ3Bpby1tbSIKKwl9LAorCS5yZW1vdmUgPSBncGlvbW1fcmVtb3ZlCit9OworCittb2R1bGVfaXNhX2RyaXZlcihncGlvbW1fZHJpdmVyLCBudW1fZ3Bpb21tKTsKKworTU9EVUxFX0FVVEhPUigiV2lsbGlhbSBCcmVhdGhpdHQgR3JheSA8dmlsaGVsbS5ncmF5QGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGlhbW9uZCBTeXN0ZW1zIEdQSU8tTU0gR1BJTyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWh0Yy1lZ3Bpby5jIGIvZHJpdmVycy9ncGlvL2dwaW8taHRjLWVncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI0ZGY2MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWh0Yy1lZ3Bpby5jCkBAIC0wLDAgKzEsNDQwIEBACisvKgorICogU3VwcG9ydCBmb3IgdGhlIEdQSU8vSVJRIGV4cGFuZGVyIGNoaXBzIHByZXNlbnQgb24gc2V2ZXJhbCBIVEMgcGhvbmVzLgorICogVGhlc2UgYXJlIGltcGxlbWVudGVkIGluIENQTEQgY2hpcHMgcHJlc2VudCBvbiB0aGUgYm9hcmQuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IEtldmluIE8nQ29ubm9yIDxrZXZpbkBrb2Nvbm5vci5uZXQ+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgUGhpbGlwcCBaYWJlbCA8cGhpbGlwcC56YWJlbEBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgbGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9ncGlvLWh0Yy1lZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworc3RydWN0IGVncGlvX2NoaXAgeworCWludCAgICAgICAgICAgICAgcmVnX3N0YXJ0OworCWludCAgICAgICAgICAgICAgY2FjaGVkX3ZhbHVlczsKKwl1bnNpZ25lZCBsb25nICAgIGlzX291dDsKKwlzdHJ1Y3QgZGV2aWNlICAgICpkZXY7CisJc3RydWN0IGdwaW9fY2hpcCBjaGlwOworfTsKKworc3RydWN0IGVncGlvX2luZm8geworCXNwaW5sb2NrX3QgICAgICAgIGxvY2s7CisKKwkvKiBpb21lbSBpbmZvICovCisJdm9pZCBfX2lvbWVtICAgICAgKmJhc2VfYWRkcjsKKwlpbnQgICAgICAgICAgICAgICBidXNfc2hpZnQ7CS8qIGJ5dGUgc2hpZnQgKi8KKwlpbnQgICAgICAgICAgICAgICByZWdfc2hpZnQ7CS8qIGJpdCBzaGlmdCAqLworCWludCAgICAgICAgICAgICAgIHJlZ19tYXNrOworCisJLyogaXJxIGluZm8gKi8KKwlpbnQgICAgICAgICAgICAgICBhY2tfcmVnaXN0ZXI7CisJaW50ICAgICAgICAgICAgICAgYWNrX3dyaXRlOworCXUxNiAgICAgICAgICAgICAgIGlycXNfZW5hYmxlZDsKKwl1aW50ICAgICAgICAgICAgICBpcnFfc3RhcnQ7CisJaW50ICAgICAgICAgICAgICAgbmlycXM7CisJdWludCAgICAgICAgICAgICAgY2hhaW5lZF9pcnE7CisKKwkvKiBlZ3BpbyBpbmZvICovCisJc3RydWN0IGVncGlvX2NoaXAgKmNoaXA7CisJaW50ICAgICAgICAgICAgICAgbmNoaXBzOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIGVncGlvX3dyaXRldyh1MTYgdmFsdWUsIHN0cnVjdCBlZ3Bpb19pbmZvICplaSwgaW50IHJlZykKK3sKKwl3cml0ZXcodmFsdWUsIGVpLT5iYXNlX2FkZHIgKyAocmVnIDw8IGVpLT5idXNfc2hpZnQpKTsKK30KKworc3RhdGljIGlubGluZSB1MTYgZWdwaW9fcmVhZHcoc3RydWN0IGVncGlvX2luZm8gKmVpLCBpbnQgcmVnKQoreworCXJldHVybiByZWFkdyhlaS0+YmFzZV9hZGRyICsgKHJlZyA8PCBlaS0+YnVzX3NoaWZ0KSk7Cit9CisKKy8qCisgKiBJUlFzCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGFja19pcnFzKHN0cnVjdCBlZ3Bpb19pbmZvICplaSkKK3sKKwllZ3Bpb193cml0ZXcoZWktPmFja193cml0ZSwgZWksIGVpLT5hY2tfcmVnaXN0ZXIpOworCXByX2RlYnVnKCJFR1BJTyBhY2sgLSB3cml0ZSAleCB0byBiYXNlKyV4XG4iLAorCQkJZWktPmFja193cml0ZSwgZWktPmFja19yZWdpc3RlciA8PCBlaS0+YnVzX3NoaWZ0KTsKK30KKworc3RhdGljIHZvaWQgZWdwaW9fYWNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKK30KKworLyogVGhlcmUgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByb2FjdGl2ZWx5IG1hc2sgaW50ZXJydXB0cworICogb24gdGhlIGVncGlvIGNoaXAgaXRzZWxmLiAgU28sIHdlIHNpbXBseSBpZ25vcmUgaW50ZXJydXB0cyB0aGF0CisgKiBhcmVuJ3QgZGVzaXJlZC4gKi8KK3N0YXRpYyB2b2lkIGVncGlvX21hc2soc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBlZ3Bpb19pbmZvICplaSA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOworCWVpLT5pcnFzX2VuYWJsZWQgJj0gfigxIDw8IChkYXRhLT5pcnEgLSBlaS0+aXJxX3N0YXJ0KSk7CisJcHJfZGVidWcoIkVHUElPIG1hc2sgJWQgJTA0eFxuIiwgZGF0YS0+aXJxLCBlaS0+aXJxc19lbmFibGVkKTsKK30KKworc3RhdGljIHZvaWQgZWdwaW9fdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgZWdwaW9faW5mbyAqZWkgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwllaS0+aXJxc19lbmFibGVkIHw9IDEgPDwgKGRhdGEtPmlycSAtIGVpLT5pcnFfc3RhcnQpOworCXByX2RlYnVnKCJFR1BJTyB1bm1hc2sgJWQgJTA0eFxuIiwgZGF0YS0+aXJxLCBlaS0+aXJxc19lbmFibGVkKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBlZ3Bpb19tdXhlZF9jaGlwID0geworCS5uYW1lCQk9ICJodGMtZWdwaW8iLAorCS5pcnFfYWNrCT0gZWdwaW9fYWNrLAorCS5pcnFfbWFzawk9IGVncGlvX21hc2ssCisJLmlycV91bm1hc2sJPSBlZ3Bpb191bm1hc2ssCit9OworCitzdGF0aWMgdm9pZCBlZ3Bpb19oYW5kbGVyKHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgZWdwaW9faW5mbyAqZWkgPSBpcnFfZGVzY19nZXRfaGFuZGxlcl9kYXRhKGRlc2MpOworCWludCBpcnFwaW47CisKKwkvKiBSZWFkIGN1cnJlbnQgcGlucy4gKi8KKwl1bnNpZ25lZCBsb25nIHJlYWR2YWwgPSBlZ3Bpb19yZWFkdyhlaSwgZWktPmFja19yZWdpc3Rlcik7CisJcHJfZGVidWcoIklSUSByZWc6ICV4XG4iLCAodW5zaWduZWQgaW50KXJlYWR2YWwpOworCS8qIEFjay91bm1hc2sgaW50ZXJydXB0cy4gKi8KKwlhY2tfaXJxcyhlaSk7CisJLyogUHJvY2VzcyBhbGwgc2V0IHBpbnMuICovCisJcmVhZHZhbCAmPSBlaS0+aXJxc19lbmFibGVkOworCWZvcl9lYWNoX3NldF9iaXQoaXJxcGluLCAmcmVhZHZhbCwgZWktPm5pcnFzKSB7CisJCS8qIFJ1biBpcnEgaGFuZGxlciAqLworCQlwcl9kZWJ1ZygiZ290IElSUSAlZFxuIiwgaXJxcGluKTsKKwkJZ2VuZXJpY19oYW5kbGVfaXJxKGVpLT5pcnFfc3RhcnQgKyBpcnFwaW4pOworCX0KK30KKworaW50IGh0Y19lZ3Bpb19nZXRfd2FrZXVwX2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGVncGlvX2luZm8gKmVpID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwkvKiBSZWFkIGN1cnJlbnQgcGlucy4gKi8KKwl1MTYgcmVhZHZhbCA9IGVncGlvX3JlYWR3KGVpLCBlaS0+YWNrX3JlZ2lzdGVyKTsKKwkvKiBBY2svdW5tYXNrIGludGVycnVwdHMuICovCisJYWNrX2lycXMoZWkpOworCS8qIFJldHVybiBmaXJzdCBzZXQgcGluLiAqLworCXJlYWR2YWwgJj0gZWktPmlycXNfZW5hYmxlZDsKKwlyZXR1cm4gZWktPmlycV9zdGFydCArIGZmcyhyZWFkdmFsKSAtIDE7Cit9CitFWFBPUlRfU1lNQk9MKGh0Y19lZ3Bpb19nZXRfd2FrZXVwX2lycSk7CisKK3N0YXRpYyBpbmxpbmUgaW50IGVncGlvX3BvcyhzdHJ1Y3QgZWdwaW9faW5mbyAqZWksIGludCBiaXQpCit7CisJcmV0dXJuIGJpdCA+PiBlaS0+cmVnX3NoaWZ0OworfQorCitzdGF0aWMgaW5saW5lIGludCBlZ3Bpb19iaXQoc3RydWN0IGVncGlvX2luZm8gKmVpLCBpbnQgYml0KQoreworCXJldHVybiAxIDw8IChiaXQgJiAoKDEgPDwgZWktPnJlZ19zaGlmdCktMSkpOworfQorCisvKgorICogSW5wdXQgcGlucworICovCisKK3N0YXRpYyBpbnQgZWdwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgZWdwaW9fY2hpcCAqZWdwaW87CisJc3RydWN0IGVncGlvX2luZm8gKmVpOworCXVuc2lnbmVkICAgICAgICAgICBiaXQ7CisJaW50ICAgICAgICAgICAgICAgIHJlZzsKKwlpbnQgICAgICAgICAgICAgICAgdmFsdWU7CisKKwlwcl9kZWJ1ZygiZWdwaW9fZ2V0X3ZhbHVlKCVkKVxuIiwgY2hpcC0+YmFzZSArIG9mZnNldCk7CisKKwllZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCWVpICAgID0gZGV2X2dldF9kcnZkYXRhKGVncGlvLT5kZXYpOworCWJpdCAgID0gZWdwaW9fYml0KGVpLCBvZmZzZXQpOworCXJlZyAgID0gZWdwaW8tPnJlZ19zdGFydCArIGVncGlvX3BvcyhlaSwgb2Zmc2V0KTsKKworCXZhbHVlID0gZWdwaW9fcmVhZHcoZWksIHJlZyk7CisJcHJfZGVidWcoInJlYWR3KCVwICsgJXgpID0gJXhcbiIsCisJCQllaS0+YmFzZV9hZGRyLCByZWcgPDwgZWktPmJ1c19zaGlmdCwgdmFsdWUpOworCXJldHVybiAhISh2YWx1ZSAmIGJpdCk7Cit9CisKK3N0YXRpYyBpbnQgZWdwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgZWdwaW9fY2hpcCAqZWdwaW87CisKKwllZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCXJldHVybiB0ZXN0X2JpdChvZmZzZXQsICZlZ3Bpby0+aXNfb3V0KSA/IC1FSU5WQUwgOiAwOworfQorCisKKy8qCisgKiBPdXRwdXQgcGlucworICovCisKK3N0YXRpYyB2b2lkIGVncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nICAgICBmbGFnOworCXN0cnVjdCBlZ3Bpb19jaGlwICplZ3BpbzsKKwlzdHJ1Y3QgZWdwaW9faW5mbyAqZWk7CisJdW5zaWduZWQgICAgICAgICAgYml0OworCWludCAgICAgICAgICAgICAgIHBvczsKKwlpbnQgICAgICAgICAgICAgICByZWc7CisJaW50ICAgICAgICAgICAgICAgc2hpZnQ7CisKKwlwcl9kZWJ1ZygiZWdwaW9fc2V0KCVzLCAlZCglZCksICVkKVxuIiwKKwkJCWNoaXAtPmxhYmVsLCBvZmZzZXQsIG9mZnNldCtjaGlwLT5iYXNlLCB2YWx1ZSk7CisKKwllZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCWVpICAgID0gZGV2X2dldF9kcnZkYXRhKGVncGlvLT5kZXYpOworCWJpdCAgID0gZWdwaW9fYml0KGVpLCBvZmZzZXQpOworCXBvcyAgID0gZWdwaW9fcG9zKGVpLCBvZmZzZXQpOworCXJlZyAgID0gZWdwaW8tPnJlZ19zdGFydCArIHBvczsKKwlzaGlmdCA9IHBvcyA8PCBlaS0+cmVnX3NoaWZ0OworCisJcHJfZGVidWcoImVncGlvICVzOiByZWcgJWQgPSAweCUwNHhcbiIsIHZhbHVlID8gInNldCIgOiAiY2xlYXIiLAorCQkJcmVnLCAoZWdwaW8tPmNhY2hlZF92YWx1ZXMgPj4gc2hpZnQpICYgZWktPnJlZ19tYXNrKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlaS0+bG9jaywgZmxhZyk7CisJaWYgKHZhbHVlKQorCQllZ3Bpby0+Y2FjaGVkX3ZhbHVlcyB8PSAoMSA8PCBvZmZzZXQpOworCWVsc2UKKwkJZWdwaW8tPmNhY2hlZF92YWx1ZXMgJj0gfigxIDw8IG9mZnNldCk7CisJZWdwaW9fd3JpdGV3KChlZ3Bpby0+Y2FjaGVkX3ZhbHVlcyA+PiBzaGlmdCkgJiBlaS0+cmVnX21hc2ssIGVpLCByZWcpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVpLT5sb2NrLCBmbGFnKTsKK30KKworc3RhdGljIGludCBlZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJCXVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCXN0cnVjdCBlZ3Bpb19jaGlwICplZ3BpbzsKKworCWVncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisJaWYgKHRlc3RfYml0KG9mZnNldCwgJmVncGlvLT5pc19vdXQpKSB7CisJCWVncGlvX3NldChjaGlwLCBvZmZzZXQsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgdm9pZCBlZ3Bpb193cml0ZV9jYWNoZShzdHJ1Y3QgZWdwaW9faW5mbyAqZWkpCit7CisJaW50ICAgICAgICAgICAgICAgaTsKKwlzdHJ1Y3QgZWdwaW9fY2hpcCAqZWdwaW87CisJaW50ICAgICAgICAgICAgICAgc2hpZnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgZWktPm5jaGlwczsgaSsrKSB7CisJCWVncGlvID0gJihlaS0+Y2hpcFtpXSk7CisJCWlmICghZWdwaW8tPmlzX291dCkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoc2hpZnQgPSAwOyBzaGlmdCA8IGVncGlvLT5jaGlwLm5ncGlvOworCQkJCXNoaWZ0ICs9ICgxPDxlaS0+cmVnX3NoaWZ0KSkgeworCisJCQlpbnQgcmVnID0gZWdwaW8tPnJlZ19zdGFydCArIGVncGlvX3BvcyhlaSwgc2hpZnQpOworCisJCQlpZiAoISgoZWdwaW8tPmlzX291dCA+PiBzaGlmdCkgJiBlaS0+cmVnX21hc2spKQorCQkJCWNvbnRpbnVlOworCisJCQlwcl9kZWJ1ZygiRUdQSU86IHNldHRpbmcgJXggdG8gJXgsIHdhcyAleFxuIiwgcmVnLAorCQkJCShlZ3Bpby0+Y2FjaGVkX3ZhbHVlcyA+PiBzaGlmdCkgJiBlaS0+cmVnX21hc2ssCisJCQkJZWdwaW9fcmVhZHcoZWksIHJlZykpOworCisJCQllZ3Bpb193cml0ZXcoKGVncGlvLT5jYWNoZWRfdmFsdWVzID4+IHNoaWZ0KQorCQkJCQkmIGVpLT5yZWdfbWFzaywgZWksIHJlZyk7CisJCX0KKwl9Cit9CisKKworLyoKKyAqIFNldHVwCisgKi8KKworc3RhdGljIGludCBfX2luaXQgZWdwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaHRjX2VncGlvX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgcmVzb3VyY2UgICAqcmVzOworCXN0cnVjdCBlZ3Bpb19pbmZvICplaTsKKwlzdHJ1Y3QgZ3Bpb19jaGlwICAqY2hpcDsKKwl1bnNpZ25lZCBpbnQgICAgICBpcnEsIGlycV9lbmQ7CisJaW50ICAgICAgICAgICAgICAgaTsKKwlpbnQgICAgICAgICAgICAgICByZXQ7CisKKwkvKiBJbml0aWFsaXplIGVpIGRhdGEgc3RydWN0dXJlLiAqLworCWVpID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZWkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pbml0KCZlaS0+bG9jayk7CisKKwkvKiBGaW5kIGNoYWluZWQgaXJxICovCisJcmV0ID0gLUVJTlZBTDsKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOworCWlmIChyZXMpCisJCWVpLT5jaGFpbmVkX2lycSA9IHJlcy0+c3RhcnQ7CisKKwkvKiBNYXAgZWdwaW8gY2hpcCBpbnRvIHZpcnR1YWwgYWRkcmVzcyBzcGFjZS4gKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKQorCQlnb3RvIGZhaWw7CisJZWktPmJhc2VfYWRkciA9IGRldm1faW9yZW1hcF9ub2NhY2hlKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCisJCQkJCSAgICAgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAoIWVpLT5iYXNlX2FkZHIpCisJCWdvdG8gZmFpbDsKKwlwcl9kZWJ1ZygiRUdQSU8gcGh5cz0lMDh4IHZpcnQ9JXBcbiIsICh1MzIpcmVzLT5zdGFydCwgZWktPmJhc2VfYWRkcik7CisKKwlpZiAoKHBkYXRhLT5idXNfd2lkdGggIT0gMTYpICYmIChwZGF0YS0+YnVzX3dpZHRoICE9IDMyKSkKKwkJZ290byBmYWlsOworCWVpLT5idXNfc2hpZnQgPSBmbHMocGRhdGEtPmJ1c193aWR0aCAtIDEpIC0gMzsKKwlwcl9kZWJ1ZygiYnVzX3NoaWZ0ID0gJWRcbiIsIGVpLT5idXNfc2hpZnQpOworCisJaWYgKChwZGF0YS0+cmVnX3dpZHRoICE9IDgpICYmIChwZGF0YS0+cmVnX3dpZHRoICE9IDE2KSkKKwkJZ290byBmYWlsOworCWVpLT5yZWdfc2hpZnQgPSBmbHMocGRhdGEtPnJlZ193aWR0aCAtIDEpOworCXByX2RlYnVnKCJyZWdfc2hpZnQgPSAlZFxuIiwgZWktPnJlZ19zaGlmdCk7CisKKwllaS0+cmVnX21hc2sgPSAoMSA8PCBwZGF0YS0+cmVnX3dpZHRoKSAtIDE7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBlaSk7CisKKwllaS0+bmNoaXBzID0gcGRhdGEtPm51bV9jaGlwczsKKwllaS0+Y2hpcCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAorCQkJCXNpemVvZihzdHJ1Y3QgZWdwaW9fY2hpcCkgKiBlaS0+bmNoaXBzLAorCQkJCUdGUF9LRVJORUwpOworCWlmICghZWktPmNoaXApIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgZWktPm5jaGlwczsgaSsrKSB7CisJCWVpLT5jaGlwW2ldLnJlZ19zdGFydCA9IHBkYXRhLT5jaGlwW2ldLnJlZ19zdGFydDsKKwkJZWktPmNoaXBbaV0uY2FjaGVkX3ZhbHVlcyA9IHBkYXRhLT5jaGlwW2ldLmluaXRpYWxfdmFsdWVzOworCQllaS0+Y2hpcFtpXS5pc19vdXQgPSBwZGF0YS0+Y2hpcFtpXS5kaXJlY3Rpb247CisJCWVpLT5jaGlwW2ldLmRldiA9ICYocGRldi0+ZGV2KTsKKwkJY2hpcCA9ICYoZWktPmNoaXBbaV0uY2hpcCk7CisJCWNoaXAtPmxhYmVsICAgICAgICAgICA9ICJodGMtZWdwaW8iOworCQljaGlwLT5wYXJlbnQgICAgICAgICAgPSAmcGRldi0+ZGV2OworCQljaGlwLT5vd25lciAgICAgICAgICAgPSBUSElTX01PRFVMRTsKKwkJY2hpcC0+Z2V0ICAgICAgICAgICAgID0gZWdwaW9fZ2V0OworCQljaGlwLT5zZXQgICAgICAgICAgICAgPSBlZ3Bpb19zZXQ7CisJCWNoaXAtPmRpcmVjdGlvbl9pbnB1dCA9IGVncGlvX2RpcmVjdGlvbl9pbnB1dDsKKwkJY2hpcC0+ZGlyZWN0aW9uX291dHB1dCA9IGVncGlvX2RpcmVjdGlvbl9vdXRwdXQ7CisJCWNoaXAtPmJhc2UgICAgICAgICAgICA9IHBkYXRhLT5jaGlwW2ldLmdwaW9fYmFzZTsKKwkJY2hpcC0+bmdwaW8gICAgICAgICAgID0gcGRhdGEtPmNoaXBbaV0ubnVtX2dwaW9zOworCisJCWdwaW9jaGlwX2FkZF9kYXRhKGNoaXAsICZlaS0+Y2hpcFtpXSk7CisJfQorCisJLyogU2V0IGluaXRpYWwgcGluIHZhbHVlcyAqLworCWVncGlvX3dyaXRlX2NhY2hlKGVpKTsKKworCWVpLT5pcnFfc3RhcnQgPSBwZGF0YS0+aXJxX2Jhc2U7CisJZWktPm5pcnFzID0gcGRhdGEtPm51bV9pcnFzOworCWVpLT5hY2tfcmVnaXN0ZXIgPSBwZGF0YS0+YWNrX3JlZ2lzdGVyOworCisJaWYgKGVpLT5jaGFpbmVkX2lycSkgeworCQkvKiBTZXR1cCBpcnEgaGFuZGxlcnMgKi8KKwkJZWktPmFja193cml0ZSA9IDB4RkZGRjsKKwkJaWYgKHBkYXRhLT5pbnZlcnRfYWNrcykKKwkJCWVpLT5hY2tfd3JpdGUgPSAwOworCQlpcnFfZW5kID0gZWktPmlycV9zdGFydCArIGVpLT5uaXJxczsKKwkJZm9yIChpcnEgPSBlaS0+aXJxX3N0YXJ0OyBpcnEgPCBpcnFfZW5kOyBpcnErKykgeworCQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGlycSwgJmVncGlvX211eGVkX2NoaXAsCisJCQkJCQkgaGFuZGxlX3NpbXBsZV9pcnEpOworCQkJaXJxX3NldF9jaGlwX2RhdGEoaXJxLCBlaSk7CisJCQlpcnFfY2xlYXJfc3RhdHVzX2ZsYWdzKGlycSwgSVJRX05PUkVRVUVTVCB8IElSUV9OT1BST0JFKTsKKwkJfQorCQlpcnFfc2V0X2lycV90eXBlKGVpLT5jaGFpbmVkX2lycSwgSVJRX1RZUEVfRURHRV9SSVNJTkcpOworCQlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcl9hbmRfZGF0YShlaS0+Y2hhaW5lZF9pcnEsCisJCQkJCQkgZWdwaW9faGFuZGxlciwgZWkpOworCQlhY2tfaXJxcyhlaSk7CisKKwkJZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIDEpOworCX0KKworCXJldHVybiAwOworCitmYWlsOgorCXByaW50ayhLRVJOX0VSUiAiRUdQSU8gZmFpbGVkIHRvIHNldHVwXG4iKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZXhpdCBlZ3Bpb19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZWdwaW9faW5mbyAqZWkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl1bnNpZ25lZCBpbnQgICAgICBpcnEsIGlycV9lbmQ7CisKKwlpZiAoZWktPmNoYWluZWRfaXJxKSB7CisJCWlycV9lbmQgPSBlaS0+aXJxX3N0YXJ0ICsgZWktPm5pcnFzOworCQlmb3IgKGlycSA9IGVpLT5pcnFfc3RhcnQ7IGlycSA8IGlycV9lbmQ7IGlycSsrKSB7CisJCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaXJxLCBOVUxMLCBOVUxMKTsKKwkJCWlycV9zZXRfc3RhdHVzX2ZsYWdzKGlycSwgSVJRX05PUkVRVUVTVCB8IElSUV9OT1BST0JFKTsKKwkJfQorCQlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihlaS0+Y2hhaW5lZF9pcnEsIE5VTEwpOworCQlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgZWdwaW9fc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IGVncGlvX2luZm8gKmVpID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoZWktPmNoYWluZWRfaXJxICYmIGRldmljZV9tYXlfd2FrZXVwKCZwZGV2LT5kZXYpKQorCQllbmFibGVfaXJxX3dha2UoZWktPmNoYWluZWRfaXJxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlZ3Bpb19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZWdwaW9faW5mbyAqZWkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChlaS0+Y2hhaW5lZF9pcnEgJiYgZGV2aWNlX21heV93YWtldXAoJnBkZXYtPmRldikpCisJCWRpc2FibGVfaXJxX3dha2UoZWktPmNoYWluZWRfaXJxKTsKKworCS8qIFVwZGF0ZSByZWdpc3RlcnMgZnJvbSB0aGUgY2FjaGUsIGluIGNhc2UKKwkgICB0aGUgQ1BMRCB3YXMgcG93ZXJlZCBvZmYgZHVyaW5nIHN1c3BlbmQgKi8KKwllZ3Bpb193cml0ZV9jYWNoZShlaSk7CisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBlZ3Bpb19zdXNwZW5kIE5VTEwKKyNkZWZpbmUgZWdwaW9fcmVzdW1lIE5VTEwKKyNlbmRpZgorCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGVncGlvX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJodGMtZWdwaW8iLAorCX0sCisJLnJlbW92ZSAgICAgICA9IF9fZXhpdF9wKGVncGlvX3JlbW92ZSksCisJLnN1c3BlbmQgICAgICA9IGVncGlvX3N1c3BlbmQsCisJLnJlc3VtZSAgICAgICA9IGVncGlvX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGVncGlvX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZlZ3Bpb19kcml2ZXIsIGVncGlvX3Byb2JlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGVncGlvX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZWdwaW9fZHJpdmVyKTsKK30KKworLyogc3RhcnQgZWFybHkgZm9yIGRlcGVuZGVuY2llcyAqLworc3Vic3lzX2luaXRjYWxsKGVncGlvX2luaXQpOworbW9kdWxlX2V4aXQoZWdwaW9fZXhpdCkKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiS2V2aW4gTydDb25ub3IgPGtldmluQGtvY29ubm9yLm5ldD4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWlvcC5jIGIvZHJpdmVycy9ncGlvL2dwaW8taW9wLmMKaW5kZXggODYwYzUzNS4uOThjN2ZmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8taW9wLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8taW9wLmMKQEAgLTEwLDExMSArMTAsNDAgQEAKICAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jZGVmaW5lIElPUDNYWF9OX0dQSU9TCTgKLQotI2RlZmluZSBHUElPX0lOCQkJMAotI2RlZmluZSBHUElPX09VVAkJMQotI2RlZmluZSBHUElPX0xPVwkJMAotI2RlZmluZSBHUElPX0hJR0gJCTEKLQotLyogTWVtb3J5IGJhc2Ugb2Zmc2V0ICovCi1zdGF0aWMgdm9pZCBfX2lvbWVtICpiYXNlOwotCi0jZGVmaW5lIElPUDNYWF9HUElPX1JFRyhyZWcpCShiYXNlICsgKHJlZykpCi0jZGVmaW5lIElPUDNYWF9HUE9FCQlJT1AzWFhfR1BJT19SRUcoMHgwMDAwKQotI2RlZmluZSBJT1AzWFhfR1BJRAkJSU9QM1hYX0dQSU9fUkVHKDB4MDAwNCkKLSNkZWZpbmUgSU9QM1hYX0dQT0QJCUlPUDNYWF9HUElPX1JFRygweDAwMDgpCi0KLXN0YXRpYyB2b2lkIGdwaW9fbGluZV9jb25maWcoaW50IGxpbmUsIGludCBkaXJlY3Rpb24pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgdmFsOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXZhbCA9IHJlYWRsKElPUDNYWF9HUE9FKTsKLQlpZiAoZGlyZWN0aW9uID09IEdQSU9fSU4pIHsKLQkJdmFsIHw9IEJJVChsaW5lKTsKLQl9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBHUElPX09VVCkgewotCQl2YWwgJj0gfkJJVChsaW5lKTsKLQl9Ci0Jd3JpdGVsKHZhbCwgSU9QM1hYX0dQT0UpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotc3RhdGljIGludCBncGlvX2xpbmVfZ2V0KGludCBsaW5lKQotewotCXJldHVybiAhIShyZWFkbChJT1AzWFhfR1BJRCkgJiBCSVQobGluZSkpOwotfQotCi1zdGF0aWMgdm9pZCBncGlvX2xpbmVfc2V0KGludCBsaW5lLCBpbnQgdmFsdWUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgdmFsOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXZhbCA9IHJlYWRsKElPUDNYWF9HUE9EKTsKLQlpZiAodmFsdWUgPT0gR1BJT19MT1cpIHsKLQkJdmFsICY9IH5CSVQobGluZSk7Ci0JfSBlbHNlIGlmICh2YWx1ZSA9PSBHUElPX0hJR0gpIHsKLQkJdmFsIHw9IEJJVChsaW5lKTsKLQl9Ci0Jd3JpdGVsKHZhbCwgSU9QM1hYX0dQT0QpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotc3RhdGljIGludCBpb3AzeHhfZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgZ3BpbykKLXsKLQlncGlvX2xpbmVfY29uZmlnKGdwaW8sIEdQSU9fSU4pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGlvcDN4eF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgZ3BpbywgaW50IGxldmVsKQotewotCWdwaW9fbGluZV9zZXQoZ3BpbywgbGV2ZWwpOwotCWdwaW9fbGluZV9jb25maWcoZ3BpbywgR1BJT19PVVQpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGlvcDN4eF9ncGlvX2dldF92YWx1ZShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBncGlvKQotewotCXJldHVybiBncGlvX2xpbmVfZ2V0KGdwaW8pOwotfQotCi1zdGF0aWMgdm9pZCBpb3AzeHhfZ3Bpb19zZXRfdmFsdWUoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQotewotCWdwaW9fbGluZV9zZXQoZ3BpbywgdmFsdWUpOwotfQotCi1zdGF0aWMgc3RydWN0IGdwaW9fY2hpcCBpb3AzeHhfY2hpcCA9IHsKLQkubGFiZWwJCQk9ICJpb3AzeHgiLAotCS5kaXJlY3Rpb25faW5wdXQJPSBpb3AzeHhfZ3Bpb19kaXJlY3Rpb25faW5wdXQsCi0JLmdldAkJCT0gaW9wM3h4X2dwaW9fZ2V0X3ZhbHVlLAotCS5kaXJlY3Rpb25fb3V0cHV0CT0gaW9wM3h4X2dwaW9fZGlyZWN0aW9uX291dHB1dCwKLQkuc2V0CQkJPSBpb3AzeHhfZ3Bpb19zZXRfdmFsdWUsCi0JLmJhc2UJCQk9IDAsCi0JLm5ncGlvCQkJPSBJT1AzWFhfTl9HUElPUywKLX07CisjZGVmaW5lIElPUDNYWF9HUE9FCTB4MDAwMAorI2RlZmluZSBJT1AzWFhfR1BJRAkweDAwMDQKKyNkZWZpbmUgSU9QM1hYX0dQT0QJMHgwMDA4CiAKIHN0YXRpYyBpbnQgaW9wM3h4X2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpnYzsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJaW50IGVycjsKKworCWdjID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZ2MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdjKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwogCWlmIChJU19FUlIoYmFzZSkpCiAJCXJldHVybiBQVFJfRVJSKGJhc2UpOwogCi0JcmV0dXJuIGRldm1fZ3Bpb2NoaXBfYWRkX2RhdGEoJnBkZXYtPmRldiwgJmlvcDN4eF9jaGlwLCBOVUxMKTsKKwllcnIgPSBiZ3Bpb19pbml0KGdjLCAmcGRldi0+ZGV2LCAxLCBiYXNlICsgSU9QM1hYX0dQSUQsCisJCQkgYmFzZSArIElPUDNYWF9HUE9ELCBOVUxMLCBOVUxMLCBiYXNlICsgSU9QM1hYX0dQT0UsIDApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlnYy0+YmFzZSA9IDA7CisJZ2MtPm93bmVyID0gVEhJU19NT0RVTEU7CisKKwlyZXR1cm4gZGV2bV9ncGlvY2hpcF9hZGRfZGF0YSgmcGRldi0+ZGV2LCBnYywgTlVMTCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGlvcDN4eF9ncGlvX2RyaXZlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWl0ODcuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWl0ODcuYwppbmRleCA2M2E5NjJkLi40NWQyOWU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1pdDg3LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8taXQ4Ny5jCkBAIC0yNzMsNyArMjczLDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIGl0ODdfdGVtcGxhdGVfY2hpcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIGl0ODdfdGVtcGxhdGVfY2hpcCA9IHsKIAkubGFiZWwJCQk9IEtCVUlMRF9NT0ROQU1FLAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLnJlcXVlc3QJCT0gaXQ4N19ncGlvX3JlcXVlc3QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1sb29uZ3NvbjEuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWxvb25nc29uMS5jCmluZGV4IDEwYzA5YmQuLjcyYjY0MDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLWxvb25nc29uMS5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWxvb25nc29uMS5jCkBAIC04LDYgKzgsNyBAQAogICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvL2RyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCkBAIC01NSwxMSArNTYsNiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKCFyZXMpIHsKLQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IEkvTyBtZW1vcnlcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAlncGlvX3JlZ19iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKIAlpZiAoSVNfRVJSKGdwaW9fcmVnX2Jhc2UpKQogCQlyZXR1cm4gUFRSX0VSUihncGlvX3JlZ19iYXNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWxwODczeC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tbHA4NzN4LmMKaW5kZXggZjEwZDQ5ZC4uMjE4YzcwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tbHA4NzN4LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tbHA4NzN4LmMKQEAgLTEyNCw3ICsxMjQsNyBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgdGVtcGxhdGVfY2hpcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CiAJLmxhYmVsCQkJPSAibHA4NzN4LWdwaW8iLAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLnJlcXVlc3QJCT0gbHA4NzN4X2dwaW9fcmVxdWVzdCwKQEAgLTE1NCw3ICsxNTQsNyBAQAogCWdwaW8tPmNoaXAgPSB0ZW1wbGF0ZV9jaGlwOwogCWdwaW8tPmNoaXAucGFyZW50ID0gZ3Bpby0+bHA4NzMtPmRldjsKIAotCXJldCA9IGdwaW9jaGlwX2FkZF9kYXRhKCZncGlvLT5jaGlwLCBncGlvKTsKKwlyZXQgPSBkZXZtX2dwaW9jaGlwX2FkZF9kYXRhKCZwZGV2LT5kZXYsICZncGlvLT5jaGlwLCBncGlvKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDb3VsZCBub3QgcmVnaXN0ZXIgZ3Bpb2NoaXAsICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwpAQCAtMTYzLDE1ICsxNjMsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGxwODczeF9ncGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBscDg3M3hfZ3BpbyAqZ3BpbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JZ3Bpb2NoaXBfcmVtb3ZlKCZncGlvLT5jaGlwKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBscDg3M3hfZ3Bpb19pZF90YWJsZVtdID0gewogCXsgImxwODczeC1ncGlvIiwgfSwKIAl7IC8qIHNlbnRpbmVsICovIH0KQEAgLTE4Myw3ICsxNzQsNiBAQAogCQkubmFtZSA9ICJscDg3M3gtZ3BpbyIsCiAJfSwKIAkucHJvYmUgPSBscDg3M3hfZ3Bpb19wcm9iZSwKLQkucmVtb3ZlID0gbHA4NzN4X2dwaW9fcmVtb3ZlLAogCS5pZF90YWJsZSA9IGxwODczeF9ncGlvX2lkX3RhYmxlLAogfTsKIG1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobHA4NzN4X2dwaW9fZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWxwYzE4eHguYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWxwYzE4eHguYwppbmRleCA5ODgzMmM5Li5mMTJlMDJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1scGMxOHh4LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tbHBjMTh4eC5jCkBAIC03OCw3ICs3OCw3IEBACiAJcmV0dXJuIGxwYzE4eHhfZ3Bpb19kaXJlY3Rpb24oY2hpcCwgb2Zmc2V0LCB0cnVlKTsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgbHBjMTh4eF9jaGlwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2NoaXAgbHBjMTh4eF9jaGlwID0gewogCS5sYWJlbAkJCT0gImxwYzE4eHgvNDN4eC1ncGlvIiwKIAkucmVxdWVzdAkJPSBncGlvY2hpcF9nZW5lcmljX3JlcXVlc3QsCiAJLmZyZWUJCQk9IGdwaW9jaGlwX2dlbmVyaWNfZnJlZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWxwYzMyeHguYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWxwYzMyeHguYwppbmRleCBmYzVmMTk3Li45MmIzYWUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1scGMzMnh4LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tbHBjMzJ4eC5jCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvZ3Bpby1scGMzMnh4Lmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9wbGF0Zm9ybS5oPgpAQCAtNjgsNiArNjcsMjAgQEAKICNkZWZpbmUgR1BJM19QSU5fSU5fU0VMKHgsIHkpCQkJKCgoeCkgPj4gKHkpKSAmIDEpCiAjZGVmaW5lIEdQTzNfUElOX0lOX1NFTCh4LCB5KQkJCSgoKHgpID4+ICh5KSkgJiAxKQogCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMF9NQVgJOAorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDFfTUFYCTI0CisjZGVmaW5lIExQQzMyWFhfR1BJT19QMl9NQVgJMTMKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AzX01BWAk2CisjZGVmaW5lIExQQzMyWFhfR1BJX1AzX01BWAkyOQorI2RlZmluZSBMUEMzMlhYX0dQT19QM19NQVgJMjQKKworI2RlZmluZSBMUEMzMlhYX0dQSU9fUDBfR1JQCTAKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AxX0dSUAkoTFBDMzJYWF9HUElPX1AwX0dSUCArIExQQzMyWFhfR1BJT19QMF9NQVgpCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMl9HUlAJKExQQzMyWFhfR1BJT19QMV9HUlAgKyBMUEMzMlhYX0dQSU9fUDFfTUFYKQorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDNfR1JQCShMUEMzMlhYX0dQSU9fUDJfR1JQICsgTFBDMzJYWF9HUElPX1AyX01BWCkKKyNkZWZpbmUgTFBDMzJYWF9HUElfUDNfR1JQCShMUEMzMlhYX0dQSU9fUDNfR1JQICsgTFBDMzJYWF9HUElPX1AzX01BWCkKKyNkZWZpbmUgTFBDMzJYWF9HUE9fUDNfR1JQCShMUEMzMlhYX0dQSV9QM19HUlAgKyBMUEMzMlhYX0dQSV9QM19NQVgpCisKIHN0cnVjdCBncGlvX3JlZ3MgewogCXZvaWQgX19pb21lbSAqaW5wX3N0YXRlOwogCXZvaWQgX19pb21lbSAqb3V0cF9zdGF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLW1heDczMHguYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW1heDczMHguYwppbmRleCAwODgwNzM2Li45NDZkMDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1tYXg3MzB4LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tbWF4NzMweC5jCkBAIC0xOTIsNiArMTkyLDEwIEBACiAJdHMtPmNoaXAucGFyZW50ID0gZGV2OwogCXRzLT5jaGlwLm93bmVyID0gVEhJU19NT0RVTEU7CiAKKwlyZXQgPSBncGlvY2hpcF9hZGRfZGF0YSgmdHMtPmNoaXAsIHRzKTsKKwlpZiAocmV0KQorCQlnb3RvIGV4aXRfZGVzdHJveTsKKwogCS8qCiAJICogaW5pdGlhbGl6ZSBwdWxsdXBzIGFjY29yZGluZyB0byBwbGF0Zm9ybSBkYXRhIGFuZCBjYWNoZSB0aGUKIAkgKiByZWdpc3RlciB2YWx1ZXMgZm9yIGxhdGVyIHVzZS4KQEAgLTIxMywxMCArMjE3LDYgQEAKIAkJfQogCX0KIAotCXJldCA9IGdwaW9jaGlwX2FkZF9kYXRhKCZ0cy0+Y2hpcCwgdHMpOwotCWlmIChyZXQpCi0JCWdvdG8gZXhpdF9kZXN0cm95OwotCiAJcmV0dXJuIHJldDsKIAogZXhpdF9kZXN0cm95OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tbWNwMjNzMDguYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW1jcDIzczA4LmMKaW5kZXggYWMyMmVmYy4uOTlkMzdiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tbWNwMjNzMDguYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tY3AyM3MwOC5jCkBAIC01NjQsNyArNTY0LDcgQEAKIAltY3AtPmNoaXAuZGlyZWN0aW9uX291dHB1dCA9IG1jcDIzczA4X2RpcmVjdGlvbl9vdXRwdXQ7CiAJbWNwLT5jaGlwLnNldCA9IG1jcDIzczA4X3NldDsKIAltY3AtPmNoaXAuZGJnX3Nob3cgPSBtY3AyM3MwOF9kYmdfc2hvdzsKLSNpZmRlZiBDT05GSUdfT0YKKyNpZmRlZiBDT05GSUdfT0ZfR1BJTwogCW1jcC0+Y2hpcC5vZl9ncGlvX25fY2VsbHMgPSAyOwogCW1jcC0+Y2hpcC5vZl9ub2RlID0gZGV2LT5vZl9ub2RlOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1tbWlvLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tbWlvLmMKaW5kZXggNmVjMTQ0Yi4uZDdkMDNhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tbW1pby5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW1taW8uYwpAQCAtNTczLDYgKzU3Myw3IEBACiAKICNpZmRlZiBDT05GSUdfT0YKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJncGlvX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJicmNtLGJjbTYzNDUtZ3BpbyIgfSwKIAl7IC5jb21wYXRpYmxlID0gIndkLG1ibC1ncGlvIiB9LAogCXsgfQogfTsKQEAgLTU5Myw2ICs1OTQsOSBAQAogCiAJcGRhdGEtPmJhc2UgPSAtMTsKIAorCWlmIChvZl9kZXZpY2VfaXNfYmlnX2VuZGlhbihwZGV2LT5kZXYub2Zfbm9kZSkpCisJCSpmbGFncyB8PSBCR1BJT0ZfQklHX0VORElBTl9CWVRFX09SREVSOworCiAJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChwZGV2LT5kZXYub2Zfbm9kZSwgIm5vLW91dHB1dCIpKQogCQkqZmxhZ3MgfD0gQkdQSU9GX05PX09VVFBVVDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tbW9ja3VwLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tb2NrdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWY4NWIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tbW9ja3VwLmMKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBHUElPIFRlc3RpbmcgRGV2aWNlIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCAgS2FtbGFrYW50IFBhdGVsIDxrYW1sYWthbnQucGF0ZWxAYnJvYWRjb20uY29tPgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgIEJhbXZvciBKaWFuIFpoYW5nIDxiYW12b3IuemhhbmdqaWFuQGxpbmFyby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjZGVmaW5lIEdQSU9fTkFNRQkiZ3Bpby1tb2NrdXAiCisjZGVmaW5lCU1BWF9HQwkJMTAKKworZW51bSBkaXJlY3Rpb24geworCU9VVCwKKwlJTgorfTsKKworLyoKKyAqIHN0cnVjdCBncGlvX3Bpbl9zdGF0dXMgLSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIEdQSU8gc3RhdHVzCisgKiBAZGlyOiAgICAgICBDb25maWd1cmVzIGRpcmVjdGlvbiBvZiBncGlvIGFzICJpbiIgb3IgIm91dCIsIDA9aW4sIDE9b3V0CisgKiBAdmFsdWU6ICAgICBDb25maWd1cmVzIHN0YXR1cyBvZiB0aGUgZ3BpbyBhcyAwKGxvdykgb3IgMShoaWdoKQorICovCitzdHJ1Y3QgZ3Bpb19waW5fc3RhdHVzIHsKKwllbnVtIGRpcmVjdGlvbiBkaXI7CisJYm9vbCB2YWx1ZTsKK307CisKK3N0cnVjdCBtb2NrdXBfZ3Bpb19jb250cm9sbGVyIHsKKwlzdHJ1Y3QgZ3Bpb19jaGlwIGdjOworCXN0cnVjdCBncGlvX3Bpbl9zdGF0dXMgKnN0YXRzOworfTsKKworc3RhdGljIGludCBncGlvX21vY2t1cF9yYW5nZXNbTUFYX0dDIDw8IDFdOworc3RhdGljIGludCBncGlvX21vY2t1cF9wYXJhbXNfbnI7Cittb2R1bGVfcGFyYW1fYXJyYXkoZ3Bpb19tb2NrdXBfcmFuZ2VzLCBpbnQsICZncGlvX21vY2t1cF9wYXJhbXNfbnIsIDA0MDApOworCitjb25zdCBjaGFyIHBpbnNfbmFtZV9zdGFydCA9ICdBJzsKKworc3RhdGljIGludCBtb2NrdXBfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc3RydWN0IG1vY2t1cF9ncGlvX2NvbnRyb2xsZXIgKmNudHIgPSBncGlvY2hpcF9nZXRfZGF0YShnYyk7CisKKwlyZXR1cm4gY250ci0+c3RhdHNbb2Zmc2V0XS52YWx1ZTsKK30KKworc3RhdGljIHZvaWQgbW9ja3VwX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkJICAgIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbW9ja3VwX2dwaW9fY29udHJvbGxlciAqY250ciA9IGdwaW9jaGlwX2dldF9kYXRhKGdjKTsKKworCWNudHItPnN0YXRzW29mZnNldF0udmFsdWUgPSAhIXZhbHVlOworfQorCitzdGF0aWMgaW50IG1vY2t1cF9ncGlvX2Rpcm91dChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJCSAgICAgIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbW9ja3VwX2dwaW9fY29udHJvbGxlciAqY250ciA9IGdwaW9jaGlwX2dldF9kYXRhKGdjKTsKKworCW1vY2t1cF9ncGlvX3NldChnYywgb2Zmc2V0LCB2YWx1ZSk7CisJY250ci0+c3RhdHNbb2Zmc2V0XS5kaXIgPSBPVVQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW9ja3VwX2dwaW9fZGlyaW4oc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc3RydWN0IG1vY2t1cF9ncGlvX2NvbnRyb2xsZXIgKmNudHIgPSBncGlvY2hpcF9nZXRfZGF0YShnYyk7CisKKwljbnRyLT5zdGF0c1tvZmZzZXRdLmRpciA9IElOOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1vY2t1cF9ncGlvX2dldF9kaXJlY3Rpb24oc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc3RydWN0IG1vY2t1cF9ncGlvX2NvbnRyb2xsZXIgKmNudHIgPSBncGlvY2hpcF9nZXRfZGF0YShnYyk7CisKKwlyZXR1cm4gY250ci0+c3RhdHNbb2Zmc2V0XS5kaXI7Cit9CisKK3N0YXRpYyBpbnQgbW9ja3VwX2dwaW9fYWRkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBtb2NrdXBfZ3Bpb19jb250cm9sbGVyICpjbnRyLAorCQkJICAgY29uc3QgY2hhciAqbmFtZSwgaW50IGJhc2UsIGludCBuZ3BpbykKK3sKKwlpbnQgcmV0OworCisJY250ci0+Z2MuYmFzZSA9IGJhc2U7CisJY250ci0+Z2MubmdwaW8gPSBuZ3BpbzsKKwljbnRyLT5nYy5sYWJlbCA9IG5hbWU7CisJY250ci0+Z2Mub3duZXIgPSBUSElTX01PRFVMRTsKKwljbnRyLT5nYy5wYXJlbnQgPSBkZXY7CisJY250ci0+Z2MuZ2V0ID0gbW9ja3VwX2dwaW9fZ2V0OworCWNudHItPmdjLnNldCA9IG1vY2t1cF9ncGlvX3NldDsKKwljbnRyLT5nYy5kaXJlY3Rpb25fb3V0cHV0ID0gbW9ja3VwX2dwaW9fZGlyb3V0OworCWNudHItPmdjLmRpcmVjdGlvbl9pbnB1dCA9IG1vY2t1cF9ncGlvX2RpcmluOworCWNudHItPmdjLmdldF9kaXJlY3Rpb24gPSBtb2NrdXBfZ3Bpb19nZXRfZGlyZWN0aW9uOworCWNudHItPnN0YXRzID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpjbnRyLT5zdGF0cykgKiBjbnRyLT5nYy5uZ3BpbywKKwkJCQkgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWNudHItPnN0YXRzKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKwlyZXQgPSBkZXZtX2dwaW9jaGlwX2FkZF9kYXRhKGRldiwgJmNudHItPmdjLCBjbnRyKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCWRldl9pbmZvKGRldiwgImdwaW88JWQuLiVkPiBhZGQgc3VjY2Vzc2Z1bCEiLCBiYXNlLCBiYXNlICsgbmdwaW8pOworCXJldHVybiAwOworZXJyOgorCWRldl9lcnIoZGV2LCAiZ3BpbzwlZC4uJWQ+IGFkZCBmYWlsZWQhIiwgYmFzZSwgYmFzZSArIG5ncGlvKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1vY2t1cF9ncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgbW9ja3VwX2dwaW9fY29udHJvbGxlciAqY250cjsKKwlpbnQgcmV0OworCWludCBpOworCWludCBiYXNlOworCWludCBuZ3BpbzsKKwljaGFyIGNoaXBfbmFtZVtzaXplb2YoR1BJT19OQU1FKSArIDNdOworCisJaWYgKGdwaW9fbW9ja3VwX3BhcmFtc19uciA8IDIpCisJCXJldHVybiAtRUlOVkFMOworCisJY250ciA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqY250cikgKiAoZ3Bpb19tb2NrdXBfcGFyYW1zX25yID4+IDEpLAorCQkJICAgIEdGUF9LRVJORUwpOworCWlmICghY250cikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjbnRyKTsKKworCWZvciAoaSA9IDA7IGkgPCBncGlvX21vY2t1cF9wYXJhbXNfbnIgPj4gMTsgaSsrKSB7CisJCWJhc2UgPSBncGlvX21vY2t1cF9yYW5nZXNbaSAqIDJdOworCQlpZiAoYmFzZSA9PSAtMSkKKwkJCW5ncGlvID0gZ3Bpb19tb2NrdXBfcmFuZ2VzW2kgKiAyICsgMV07CisJCWVsc2UKKwkJCW5ncGlvID0gZ3Bpb19tb2NrdXBfcmFuZ2VzW2kgKiAyICsgMV0gLSBiYXNlOworCisJCWlmIChuZ3BpbyA+PSAwKSB7CisJCQlzcHJpbnRmKGNoaXBfbmFtZSwgIiVzLSVjIiwgR1BJT19OQU1FLAorCQkJCXBpbnNfbmFtZV9zdGFydCArIGkpOworCQkJcmV0ID0gbW9ja3VwX2dwaW9fYWRkKGRldiwgJmNudHJbaV0sCisJCQkJCSAgICAgIGNoaXBfbmFtZSwgYmFzZSwgbmdwaW8pOworCQl9IGVsc2UgeworCQkJcmV0ID0gLTE7CisJCX0KKwkJaWYgKHJldCkgeworCQkJaWYgKGJhc2UgPCAwKQorCQkJCWRldl9lcnIoZGV2LCAiZ3BpbzwlZC4uJWQ+IGFkZCBmYWlsZWRcbiIsCisJCQkJCWJhc2UsIG5ncGlvKTsKKwkJCWVsc2UKKwkJCQlkZXZfZXJyKGRldiwgImdwaW88JWQuLiVkPiBhZGQgZmFpbGVkXG4iLAorCQkJCQliYXNlLCBiYXNlICsgbmdwaW8pOworCisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1vY2t1cF9ncGlvX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9IEdQSU9fTkFNRSwKKwkJICAgfSwKKwkucHJvYmUgPSBtb2NrdXBfZ3Bpb19wcm9iZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2Oworc3RhdGljIGludCBfX2luaXQgbW9ja19kZXZpY2VfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKEdQSU9fTkFNRSwgLTEpOworCWlmICghcGRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOworCWlmIChlcnIpIHsKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1vY2t1cF9ncGlvX2RyaXZlcik7CisJaWYgKGVycikgeworCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1vY2tfZGV2aWNlX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbW9ja3VwX2dwaW9fZHJpdmVyKTsKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKK30KKworbW9kdWxlX2luaXQobW9ja19kZXZpY2VfaW5pdCk7Cittb2R1bGVfZXhpdChtb2NrX2RldmljZV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiS2FtbGFrYW50IFBhdGVsIDxrYW1sYWthbnQucGF0ZWxAYnJvYWRjb20uY29tPiIpOworTU9EVUxFX0FVVEhPUigiQmFtdm9yIEppYW4gWmhhbmcgPGJhbXZvci56aGFuZ2ppYW5AbGluYXJvLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiR1BJTyBUZXN0aW5nIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tbXNpYy5jIGIvZHJpdmVycy9ncGlvL2dwaW8tbXNpYy5jCmluZGV4IGQ3NTY0OTcuLjFiN2NlN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLW1zaWMuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tc2ljLmMKQEAgLTIwLDcgKzIwLDYgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTMyOCw5ICszMjcsNCBAQAogewogCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnBsYXRmb3JtX21zaWNfZ3Bpb19kcml2ZXIpOwogfQotCiBzdWJzeXNfaW5pdGNhbGwocGxhdGZvcm1fbXNpY19ncGlvX2luaXQpOwotCi1NT0RVTEVfQVVUSE9SKCJNYXRoaWFzIE55bWFuIDxtYXRoaWFzLm55bWFuQGxpbnV4LmludGVsLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgTWVkZmllbGQgTVNJQyBHUElPIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tbXhjLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1teGMuYwppbmRleCAxYjM0MmEzLi5jMWExZTAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1teGMuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1teGMuYwpAQCAtMiw3ICsyLDggQEAKICAqIE1YQyBHUElPIHN1cHBvcnQuIChjKSAyMDA4IERhbmllbCBNYWNrIDxkYW5pZWxAY2FpYXEuZGU+CiAgKiBDb3B5cmlnaHQgMjAwOCBKdWVyZ2VuIEJlaXNlcnQsIGtlcm5lbEBwZW5ndXRyb25peC5kZQogICoKLSAqIEJhc2VkIG9uIGNvZGUgZnJvbSBGcmVlc2NhbGUsCisgKiBCYXNlZCBvbiBjb2RlIGZyb20gRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsCisgKiBBdXRob3JzOiBEYW5pZWwgTWFjaywgSnVlcmdlbiBCZWlzZXJ0LgogICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0zMyw3ICszNCw2IEBACiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYnVnLmg+CiAKIGVudW0gbXhjX2dwaW9faHd0eXBlIHsKQEAgLTQ1OCw2ICs0NTgsMTEgQEAKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9iZ2lvOwogCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImdwaW8tcmFuZ2VzIikpIHsKKwkJcG9ydC0+Z2MucmVxdWVzdCA9IGdwaW9jaGlwX2dlbmVyaWNfcmVxdWVzdDsKKwkJcG9ydC0+Z2MuZnJlZSA9IGdwaW9jaGlwX2dlbmVyaWNfZnJlZTsKKwl9CisKIAlwb3J0LT5nYy50b19pcnEgPSBteGNfZ3Bpb190b19pcnE7CiAJcG9ydC0+Z2MuYmFzZSA9IChwZGV2LT5pZCA8IDApID8gb2ZfYWxpYXNfZ2V0X2lkKG5wLCAiZ3BpbyIpICogMzIgOgogCQkJCQkgICAgIHBkZXYtPmlkICogMzI7CkBAIC01MTAsMTAgKzUxNSw0IEBACiB7CiAJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXhjX2dwaW9fZHJpdmVyKTsKIH0KLXBvc3Rjb3JlX2luaXRjYWxsKGdwaW9fbXhjX2luaXQpOwotCi1NT0RVTEVfQVVUSE9SKCJGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgIgotCSAgICAgICJEYW5pZWwgTWFjayA8ZGFuaWVsbmNhaWFxLmRlPiwgIgotCSAgICAgICJKdWVyZ2VuIEJlaXNlcnQgPGtlcm5lbEBwZW5ndXRyb25peC5kZT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiRnJlZXNjYWxlIE1YQyBHUElPIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CitzdWJzeXNfaW5pdGNhbGwoZ3Bpb19teGNfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1wYWxtYXMuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXBhbG1hcy5jCmluZGV4IDgzOTQ3NDQuLjNkODE4MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXBhbG1hcy5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXBhbG1hcy5jCkBAIC0xNTIsNyArMTUyLDYgQEAKIAl7IC5jb21wYXRpYmxlID0gInRpLHRwczgwMDM2LWdwaW8iLCAuZGF0YSA9ICZ0cHM4MDAzNl9kZXZfZGF0YSx9LAogCXsgfSwKIH07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBvZl9wYWxtYXNfZ3Bpb19tYXRjaCk7CiAKIHN0YXRpYyBpbnQgcGFsbWFzX2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXBjYTk1M3guYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXBjYTk1M3guYwppbmRleCAwMmYyYTU2Li41ZDA1OTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1wY2E5NTN4LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tcGNhOTUzeC5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogCiAjZGVmaW5lIFBDQTk1M1hfSU5QVVQJCTAKICNkZWZpbmUgUENBOTUzWF9PVVRQVVQJCTEKQEAgLTk0LDYgKzk1LDI0IEBACiAKICNkZWZpbmUgTkJBTksoY2hpcCkgRElWX1JPVU5EX1VQKGNoaXAtPmdwaW9fY2hpcC5uZ3BpbywgQkFOS19TWikKIAorc3RydWN0IHBjYTk1M3hfcmVnX2NvbmZpZyB7CisJaW50IGRpcmVjdGlvbjsKKwlpbnQgb3V0cHV0OworCWludCBpbnB1dDsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNhOTUzeF9yZWdfY29uZmlnIHBjYTk1M3hfcmVncyA9IHsKKwkuZGlyZWN0aW9uID0gUENBOTUzWF9ESVJFQ1RJT04sCisJLm91dHB1dCA9IFBDQTk1M1hfT1VUUFVULAorCS5pbnB1dCA9IFBDQTk1M1hfSU5QVVQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjYTk1M3hfcmVnX2NvbmZpZyBwY2E5NTd4X3JlZ3MgPSB7CisJLmRpcmVjdGlvbiA9IFBDQTk1N1hfQ0ZHLAorCS5vdXRwdXQgPSBQQ0E5NTdYX09VVCwKKwkuaW5wdXQgPSBQQ0E5NTdYX0lOLAorfTsKKwogc3RydWN0IHBjYTk1M3hfY2hpcCB7CiAJdW5zaWduZWQgZ3Bpb19zdGFydDsKIAl1OCByZWdfb3V0cHV0W01BWF9CQU5LXTsKQEAgLTExMSw4ICsxMzAsMTMgQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCBncGlvX2NoaXAgZ3Bpb19jaGlwOwogCWNvbnN0IGNoYXIgKmNvbnN0ICpuYW1lczsKLQlpbnQJY2hpcF90eXBlOwogCXVuc2lnbmVkIGxvbmcgZHJpdmVyX2RhdGE7CisJc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yOworCisJY29uc3Qgc3RydWN0IHBjYTk1M3hfcmVnX2NvbmZpZyAqcmVnczsKKworCWludCAoKndyaXRlX3JlZ3MpKHN0cnVjdCBwY2E5NTN4X2NoaXAgKiwgaW50LCB1OCAqKTsKKwlpbnQgKCpyZWFkX3JlZ3MpKHN0cnVjdCBwY2E5NTN4X2NoaXAgKiwgaW50LCB1OCAqKTsKIH07CiAKIHN0YXRpYyBpbnQgcGNhOTUzeF9yZWFkX3NpbmdsZShzdHJ1Y3QgcGNhOTUzeF9jaGlwICpjaGlwLCBpbnQgcmVnLCB1MzIgKnZhbCwKQEAgLTE1MiwzOCArMTc2LDQ0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgcGNhOTUzeF93cml0ZV9yZWdzXzgoc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCwgaW50IHJlZywgdTggKnZhbCkKK3sKKwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjaGlwLT5jbGllbnQsIHJlZywgKnZhbCk7Cit9CisKK3N0YXRpYyBpbnQgcGNhOTUzeF93cml0ZV9yZWdzXzE2KHN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXAsIGludCByZWcsIHU4ICp2YWwpCit7CisJX19sZTE2IHdvcmQgPSBjcHVfdG9fbGUxNihnZXRfdW5hbGlnbmVkKCh1MTYgKil2YWwpKTsKKworCXJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNoaXAtPmNsaWVudCwKKwkJCQkJIHJlZyA8PCAxLCAoX19mb3JjZSB1MTYpd29yZCk7Cit9CisKK3N0YXRpYyBpbnQgcGNhOTU3eF93cml0ZV9yZWdzXzE2KHN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXAsIGludCByZWcsIHU4ICp2YWwpCit7CisJaW50IHJldDsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2hpcC0+Y2xpZW50LCByZWcgPDwgMSwgdmFsWzBdKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNoaXAtPmNsaWVudCwgKHJlZyA8PCAxKSArIDEsIHZhbFsxXSk7Cit9CisKK3N0YXRpYyBpbnQgcGNhOTUzeF93cml0ZV9yZWdzXzI0KHN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXAsIGludCByZWcsIHU4ICp2YWwpCit7CisJaW50IGJhbmtfc2hpZnQgPSBmbHMoKGNoaXAtPmdwaW9fY2hpcC5uZ3BpbyAtIDEpIC8gQkFOS19TWik7CisKKwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2kyY19ibG9ja19kYXRhKGNoaXAtPmNsaWVudCwKKwkJCQkJICAgICAgKHJlZyA8PCBiYW5rX3NoaWZ0KSB8IFJFR19BRERSX0FJLAorCQkJCQkgICAgICBOQkFOSyhjaGlwKSwgdmFsKTsKK30KKwogc3RhdGljIGludCBwY2E5NTN4X3dyaXRlX3JlZ3Moc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCwgaW50IHJlZywgdTggKnZhbCkKIHsKIAlpbnQgcmV0ID0gMDsKIAotCWlmIChjaGlwLT5ncGlvX2NoaXAubmdwaW8gPD0gOCkKLQkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjaGlwLT5jbGllbnQsIHJlZywgKnZhbCk7Ci0JZWxzZSBpZiAoY2hpcC0+Z3Bpb19jaGlwLm5ncGlvID49IDI0KSB7Ci0JCWludCBiYW5rX3NoaWZ0ID0gZmxzKChjaGlwLT5ncGlvX2NoaXAubmdwaW8gLSAxKSAvIEJBTktfU1opOwotCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfaTJjX2Jsb2NrX2RhdGEoY2hpcC0+Y2xpZW50LAotCQkJCQkocmVnIDw8IGJhbmtfc2hpZnQpIHwgUkVHX0FERFJfQUksCi0JCQkJCU5CQU5LKGNoaXApLCB2YWwpOwotCX0gZWxzZSB7Ci0JCXN3aXRjaCAoY2hpcC0+Y2hpcF90eXBlKSB7Ci0JCWNhc2UgUENBOTUzWF9UWVBFOiB7Ci0JCQlfX2xlMTYgd29yZCA9IGNwdV90b19sZTE2KGdldF91bmFsaWduZWQoKHUxNiAqKXZhbCkpOwotCi0JCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNoaXAtPmNsaWVudCwgcmVnIDw8IDEsCi0JCQkJCQkJKF9fZm9yY2UgdTE2KXdvcmQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBQQ0E5NTdYX1RZUEU6Ci0JCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNoaXAtPmNsaWVudCwgcmVnIDw8IDEsCi0JCQkJCQkJdmFsWzBdKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCWJyZWFrOwotCQkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjaGlwLT5jbGllbnQsCi0JCQkJCQkJKHJlZyA8PCAxKSArIDEsCi0JCQkJCQkJdmFsWzFdKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCisJcmV0ID0gY2hpcC0+d3JpdGVfcmVncyhjaGlwLCByZWcsIHZhbCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsICJmYWlsZWQgd3JpdGluZyByZWdpc3RlclxuIik7CiAJCXJldHVybiByZXQ7CkBAIC0xOTIsMjQgKzIyMiw0MSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHBjYTk1M3hfcmVhZF9yZWdzXzgoc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCwgaW50IHJlZywgdTggKnZhbCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNoaXAtPmNsaWVudCwgcmVnKTsKKwkqdmFsID0gcmV0OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwY2E5NTN4X3JlYWRfcmVnc18xNihzdHJ1Y3QgcGNhOTUzeF9jaGlwICpjaGlwLCBpbnQgcmVnLCB1OCAqdmFsKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2hpcC0+Y2xpZW50LCByZWcgPDwgMSk7CisJdmFsWzBdID0gKHUxNilyZXQgJiAweEZGOworCXZhbFsxXSA9ICh1MTYpcmV0ID4+IDg7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBjYTk1M3hfcmVhZF9yZWdzXzI0KHN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXAsIGludCByZWcsIHU4ICp2YWwpCit7CisJaW50IGJhbmtfc2hpZnQgPSBmbHMoKGNoaXAtPmdwaW9fY2hpcC5uZ3BpbyAtIDEpIC8gQkFOS19TWik7CisKKwlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoY2hpcC0+Y2xpZW50LAorCQkJCQkgICAgIChyZWcgPDwgYmFua19zaGlmdCkgfCBSRUdfQUREUl9BSSwKKwkJCQkJICAgICBOQkFOSyhjaGlwKSwgdmFsKTsKK30KKwogc3RhdGljIGludCBwY2E5NTN4X3JlYWRfcmVncyhzdHJ1Y3QgcGNhOTUzeF9jaGlwICpjaGlwLCBpbnQgcmVnLCB1OCAqdmFsKQogewogCWludCByZXQ7CiAKLQlpZiAoY2hpcC0+Z3Bpb19jaGlwLm5ncGlvIDw9IDgpIHsKLQkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNoaXAtPmNsaWVudCwgcmVnKTsKLQkJKnZhbCA9IHJldDsKLQl9IGVsc2UgaWYgKGNoaXAtPmdwaW9fY2hpcC5uZ3BpbyA+PSAyNCkgewotCQlpbnQgYmFua19zaGlmdCA9IGZscygoY2hpcC0+Z3Bpb19jaGlwLm5ncGlvIC0gMSkgLyBCQU5LX1NaKTsKLQotCQlyZXQgPSBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShjaGlwLT5jbGllbnQsCi0JCQkJCShyZWcgPDwgYmFua19zaGlmdCkgfCBSRUdfQUREUl9BSSwKLQkJCQkJTkJBTksoY2hpcCksIHZhbCk7Ci0JfSBlbHNlIHsKLQkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNoaXAtPmNsaWVudCwgcmVnIDw8IDEpOwotCQl2YWxbMF0gPSAodTE2KXJldCAmIDB4RkY7Ci0JCXZhbFsxXSA9ICh1MTYpcmV0ID4+IDg7Ci0JfQorCXJldCA9IGNoaXAtPnJlYWRfcmVncyhjaGlwLCByZWcsIHZhbCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsICJmYWlsZWQgcmVhZGluZyByZWdpc3RlclxuIik7CiAJCXJldHVybiByZXQ7CkBAIC0yMjIsMjAgKzI2OSwxMiBAQAogewogCXN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXAgPSBncGlvY2hpcF9nZXRfZGF0YShnYyk7CiAJdTggcmVnX3ZhbDsKLQlpbnQgcmV0LCBvZmZzZXQgPSAwOworCWludCByZXQ7CiAKIAltdXRleF9sb2NrKCZjaGlwLT5pMmNfbG9jayk7CiAJcmVnX3ZhbCA9IGNoaXAtPnJlZ19kaXJlY3Rpb25bb2ZmIC8gQkFOS19TWl0gfCAoMXUgPDwgKG9mZiAlIEJBTktfU1opKTsKIAotCXN3aXRjaCAoY2hpcC0+Y2hpcF90eXBlKSB7Ci0JY2FzZSBQQ0E5NTNYX1RZUEU6Ci0JCW9mZnNldCA9IFBDQTk1M1hfRElSRUNUSU9OOwotCQlicmVhazsKLQljYXNlIFBDQTk1N1hfVFlQRToKLQkJb2Zmc2V0ID0gUENBOTU3WF9DRkc7Ci0JCWJyZWFrOwotCX0KLQlyZXQgPSBwY2E5NTN4X3dyaXRlX3NpbmdsZShjaGlwLCBvZmZzZXQsIHJlZ192YWwsIG9mZik7CisJcmV0ID0gcGNhOTUzeF93cml0ZV9zaW5nbGUoY2hpcCwgY2hpcC0+cmVncy0+ZGlyZWN0aW9uLCByZWdfdmFsLCBvZmYpOwogCWlmIChyZXQpCiAJCWdvdG8gZXhpdDsKIApAQCAtMjUwLDcgKzI4OSw3IEBACiB7CiAJc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCA9IGdwaW9jaGlwX2dldF9kYXRhKGdjKTsKIAl1OCByZWdfdmFsOwotCWludCByZXQsIG9mZnNldCA9IDA7CisJaW50IHJldDsKIAogCW11dGV4X2xvY2soJmNoaXAtPmkyY19sb2NrKTsKIAkvKiBzZXQgb3V0cHV0IGxldmVsICovCkBAIC0yNjEsMTUgKzMwMCw3IEBACiAJCXJlZ192YWwgPSBjaGlwLT5yZWdfb3V0cHV0W29mZiAvIEJBTktfU1pdCiAJCQkmIH4oMXUgPDwgKG9mZiAlIEJBTktfU1opKTsKIAotCXN3aXRjaCAoY2hpcC0+Y2hpcF90eXBlKSB7Ci0JY2FzZSBQQ0E5NTNYX1RZUEU6Ci0JCW9mZnNldCA9IFBDQTk1M1hfT1VUUFVUOwotCQlicmVhazsKLQljYXNlIFBDQTk1N1hfVFlQRToKLQkJb2Zmc2V0ID0gUENBOTU3WF9PVVQ7Ci0JCWJyZWFrOwotCX0KLQlyZXQgPSBwY2E5NTN4X3dyaXRlX3NpbmdsZShjaGlwLCBvZmZzZXQsIHJlZ192YWwsIG9mZik7CisJcmV0ID0gcGNhOTUzeF93cml0ZV9zaW5nbGUoY2hpcCwgY2hpcC0+cmVncy0+b3V0cHV0LCByZWdfdmFsLCBvZmYpOwogCWlmIChyZXQpCiAJCWdvdG8gZXhpdDsKIApAQCAtMjc3LDE1ICszMDgsNyBAQAogCiAJLyogdGhlbiBkaXJlY3Rpb24gKi8KIAlyZWdfdmFsID0gY2hpcC0+cmVnX2RpcmVjdGlvbltvZmYgLyBCQU5LX1NaXSAmIH4oMXUgPDwgKG9mZiAlIEJBTktfU1opKTsKLQlzd2l0Y2ggKGNoaXAtPmNoaXBfdHlwZSkgewotCWNhc2UgUENBOTUzWF9UWVBFOgotCQlvZmZzZXQgPSBQQ0E5NTNYX0RJUkVDVElPTjsKLQkJYnJlYWs7Ci0JY2FzZSBQQ0E5NTdYX1RZUEU6Ci0JCW9mZnNldCA9IFBDQTk1N1hfQ0ZHOwotCQlicmVhazsKLQl9Ci0JcmV0ID0gcGNhOTUzeF93cml0ZV9zaW5nbGUoY2hpcCwgb2Zmc2V0LCByZWdfdmFsLCBvZmYpOworCXJldCA9IHBjYTk1M3hfd3JpdGVfc2luZ2xlKGNoaXAsIGNoaXAtPnJlZ3MtPmRpcmVjdGlvbiwgcmVnX3ZhbCwgb2ZmKTsKIAlpZiAocmV0KQogCQlnb3RvIGV4aXQ7CiAKQEAgLTI5OSwxOCArMzIyLDEwIEBACiB7CiAJc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCA9IGdwaW9jaGlwX2dldF9kYXRhKGdjKTsKIAl1MzIgcmVnX3ZhbDsKLQlpbnQgcmV0LCBvZmZzZXQgPSAwOworCWludCByZXQ7CiAKIAltdXRleF9sb2NrKCZjaGlwLT5pMmNfbG9jayk7Ci0Jc3dpdGNoIChjaGlwLT5jaGlwX3R5cGUpIHsKLQljYXNlIFBDQTk1M1hfVFlQRToKLQkJb2Zmc2V0ID0gUENBOTUzWF9JTlBVVDsKLQkJYnJlYWs7Ci0JY2FzZSBQQ0E5NTdYX1RZUEU6Ci0JCW9mZnNldCA9IFBDQTk1N1hfSU47Ci0JCWJyZWFrOwotCX0KLQlyZXQgPSBwY2E5NTN4X3JlYWRfc2luZ2xlKGNoaXAsIG9mZnNldCwgJnJlZ192YWwsIG9mZik7CisJcmV0ID0gcGNhOTUzeF9yZWFkX3NpbmdsZShjaGlwLCBjaGlwLT5yZWdzLT5pbnB1dCwgJnJlZ192YWwsIG9mZik7CiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5pMmNfbG9jayk7CiAJaWYgKHJldCA8IDApIHsKIAkJLyogTk9URTogIGRpYWdub3N0aWMgYWxyZWFkeSBlbWl0dGVkOyB0aGF0J3MgYWxsIHdlIHNob3VsZApAQCAtMzI3LDcgKzM0Miw3IEBACiB7CiAJc3RydWN0IHBjYTk1M3hfY2hpcCAqY2hpcCA9IGdwaW9jaGlwX2dldF9kYXRhKGdjKTsKIAl1OCByZWdfdmFsOwotCWludCByZXQsIG9mZnNldCA9IDA7CisJaW50IHJldDsKIAogCW11dGV4X2xvY2soJmNoaXAtPmkyY19sb2NrKTsKIAlpZiAodmFsKQpAQCAtMzM3LDE1ICszNTIsNyBAQAogCQlyZWdfdmFsID0gY2hpcC0+cmVnX291dHB1dFtvZmYgLyBCQU5LX1NaXQogCQkJJiB+KDF1IDw8IChvZmYgJSBCQU5LX1NaKSk7CiAKLQlzd2l0Y2ggKGNoaXAtPmNoaXBfdHlwZSkgewotCWNhc2UgUENBOTUzWF9UWVBFOgotCQlvZmZzZXQgPSBQQ0E5NTNYX09VVFBVVDsKLQkJYnJlYWs7Ci0JY2FzZSBQQ0E5NTdYX1RZUEU6Ci0JCW9mZnNldCA9IFBDQTk1N1hfT1VUOwotCQlicmVhazsKLQl9Ci0JcmV0ID0gcGNhOTUzeF93cml0ZV9zaW5nbGUoY2hpcCwgb2Zmc2V0LCByZWdfdmFsLCBvZmYpOworCXJldCA9IHBjYTk1M3hfd3JpdGVfc2luZ2xlKGNoaXAsIGNoaXAtPnJlZ3MtPm91dHB1dCwgcmVnX3ZhbCwgb2ZmKTsKIAlpZiAocmV0KQogCQlnb3RvIGV4aXQ7CiAKQEAgLTM1NSwzNSArMzYyLDMxIEBACiB9CiAKIHN0YXRpYyB2b2lkIHBjYTk1M3hfZ3Bpb19zZXRfbXVsdGlwbGUoc3RydWN0IGdwaW9fY2hpcCAqZ2MsCi0JCXVuc2lnbmVkIGxvbmcgKm1hc2ssIHVuc2lnbmVkIGxvbmcgKmJpdHMpCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyAqbWFzaywgdW5zaWduZWQgbG9uZyAqYml0cykKIHsKIAlzdHJ1Y3QgcGNhOTUzeF9jaGlwICpjaGlwID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoZ2MpOworCXVuc2lnbmVkIGludCBiYW5rX21hc2ssIGJhbmtfdmFsOworCWludCBiYW5rX3NoaWZ0LCBiYW5rOwogCXU4IHJlZ192YWxbTUFYX0JBTktdOwotCWludCByZXQsIG9mZnNldCA9IDA7Ci0JaW50IGJhbmtfc2hpZnQgPSBmbHMoKGNoaXAtPmdwaW9fY2hpcC5uZ3BpbyAtIDEpIC8gQkFOS19TWik7Ci0JaW50IGJhbms7CisJaW50IHJldDsKIAotCXN3aXRjaCAoY2hpcC0+Y2hpcF90eXBlKSB7Ci0JY2FzZSBQQ0E5NTNYX1RZUEU6Ci0JCW9mZnNldCA9IFBDQTk1M1hfT1VUUFVUOwotCQlicmVhazsKLQljYXNlIFBDQTk1N1hfVFlQRToKLQkJb2Zmc2V0ID0gUENBOTU3WF9PVVQ7Ci0JCWJyZWFrOwotCX0KKwliYW5rX3NoaWZ0ID0gZmxzKChjaGlwLT5ncGlvX2NoaXAubmdwaW8gLSAxKSAvIEJBTktfU1opOwogCiAJbWVtY3B5KHJlZ192YWwsIGNoaXAtPnJlZ19vdXRwdXQsIE5CQU5LKGNoaXApKTsKIAltdXRleF9sb2NrKCZjaGlwLT5pMmNfbG9jayk7Ci0JZm9yKGJhbms9MDsgYmFuazxOQkFOSyhjaGlwKTsgYmFuaysrKSB7Ci0JCXVuc2lnbmVkIGJhbmttYXNrID0gbWFza1tiYW5rIC8gc2l6ZW9mKCptYXNrKV0gPj4KLQkJCQkgICAgKChiYW5rICUgc2l6ZW9mKCptYXNrKSkgKiA4KTsKLQkJaWYoYmFua21hc2spIHsKLQkJCXVuc2lnbmVkIGJhbmt2YWwgID0gYml0c1tiYW5rIC8gc2l6ZW9mKCpiaXRzKV0gPj4KLQkJCQkJICAgICgoYmFuayAlIHNpemVvZigqYml0cykpICogOCk7Ci0JCQlyZWdfdmFsW2JhbmtdID0gKHJlZ192YWxbYmFua10gJiB+YmFua21hc2spIHwgYmFua3ZhbDsKKwlmb3IgKGJhbmsgPSAwOyBiYW5rIDwgTkJBTksoY2hpcCk7IGJhbmsrKykgeworCQliYW5rX21hc2sgPSBtYXNrW2JhbmsgLyBzaXplb2YoKm1hc2spXSA+PgorCQkJICAgKChiYW5rICUgc2l6ZW9mKCptYXNrKSkgKiA4KTsKKwkJaWYgKGJhbmtfbWFzaykgeworCQkJYmFua192YWwgPSBiaXRzW2JhbmsgLyBzaXplb2YoKmJpdHMpXSA+PgorCQkJCSAgKChiYW5rICUgc2l6ZW9mKCpiaXRzKSkgKiA4KTsKKwkJCXJlZ192YWxbYmFua10gPSAocmVnX3ZhbFtiYW5rXSAmIH5iYW5rX21hc2spIHwgYmFua192YWw7CiAJCX0KIAl9Ci0JcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2kyY19ibG9ja19kYXRhKGNoaXAtPmNsaWVudCwgb2Zmc2V0IDw8IGJhbmtfc2hpZnQsIE5CQU5LKGNoaXApLCByZWdfdmFsKTsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV9pMmNfYmxvY2tfZGF0YShjaGlwLT5jbGllbnQsCisJCQkJCSAgICAgY2hpcC0+cmVncy0+b3V0cHV0IDw8IGJhbmtfc2hpZnQsCisJCQkJCSAgICAgTkJBTksoY2hpcCksIHJlZ192YWwpOwogCWlmIChyZXQpCiAJCWdvdG8gZXhpdDsKIApAQCAtNTE1LDcgKzUxOCw3IEBACiAJYm9vbCBwZW5kaW5nX3NlZW4gPSBmYWxzZTsKIAlib29sIHRyaWdnZXJfc2VlbiA9IGZhbHNlOwogCXU4IHRyaWdnZXJbTUFYX0JBTktdOwotCWludCByZXQsIGksIG9mZnNldCA9IDA7CisJaW50IHJldCwgaTsKIAogCWlmIChjaGlwLT5kcml2ZXJfZGF0YSAmIFBDQV9QQ0FMKSB7CiAJCS8qIFJlYWQgdGhlIGN1cnJlbnQgaW50ZXJydXB0IHN0YXR1cyBmcm9tIHRoZSBkZXZpY2UgKi8KQEAgLTU0MCwxNSArNTQzLDcgQEAKIAkJcmV0dXJuIHBlbmRpbmdfc2VlbjsKIAl9CiAKLQlzd2l0Y2ggKGNoaXAtPmNoaXBfdHlwZSkgewotCWNhc2UgUENBOTUzWF9UWVBFOgotCQlvZmZzZXQgPSBQQ0E5NTNYX0lOUFVUOwotCQlicmVhazsKLQljYXNlIFBDQTk1N1hfVFlQRToKLQkJb2Zmc2V0ID0gUENBOTU3WF9JTjsKLQkJYnJlYWs7Ci0JfQotCXJldCA9IHBjYTk1M3hfcmVhZF9yZWdzKGNoaXAsIG9mZnNldCwgY3VyX3N0YXQpOworCXJldCA9IHBjYTk1M3hfcmVhZF9yZWdzKGNoaXAsIGNoaXAtPnJlZ3MtPmlucHV0LCBjdXJfc3RhdCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIGZhbHNlOwogCkBAIC02MDgsMjAgKzYwMywxMyBAQAogCQkJICAgICBpbnQgaXJxX2Jhc2UpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKLQlpbnQgcmV0LCBpLCBvZmZzZXQgPSAwOworCWludCByZXQsIGk7CiAKIAlpZiAoY2xpZW50LT5pcnEgJiYgaXJxX2Jhc2UgIT0gLTEKIAkJCSYmIChjaGlwLT5kcml2ZXJfZGF0YSAmIFBDQV9JTlQpKSB7CiAKLQkJc3dpdGNoIChjaGlwLT5jaGlwX3R5cGUpIHsKLQkJY2FzZSBQQ0E5NTNYX1RZUEU6Ci0JCQlvZmZzZXQgPSBQQ0E5NTNYX0lOUFVUOwotCQkJYnJlYWs7Ci0JCWNhc2UgUENBOTU3WF9UWVBFOgotCQkJb2Zmc2V0ID0gUENBOTU3WF9JTjsKLQkJCWJyZWFrOwotCQl9Ci0JCXJldCA9IHBjYTk1M3hfcmVhZF9yZWdzKGNoaXAsIG9mZnNldCwgY2hpcC0+aXJxX3N0YXQpOworCQlyZXQgPSBwY2E5NTN4X3JlYWRfcmVncyhjaGlwLAorCQkJCQljaGlwLT5yZWdzLT5pbnB1dCwgY2hpcC0+aXJxX3N0YXQpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIApAQCAtNjg0LDEyICs2NzIsMTQgQEAKIAlpbnQgcmV0OwogCXU4IHZhbFtNQVhfQkFOS107CiAKLQlyZXQgPSBwY2E5NTN4X3JlYWRfcmVncyhjaGlwLCBQQ0E5NTNYX09VVFBVVCwgY2hpcC0+cmVnX291dHB1dCk7CisJY2hpcC0+cmVncyA9ICZwY2E5NTN4X3JlZ3M7CisKKwlyZXQgPSBwY2E5NTN4X3JlYWRfcmVncyhjaGlwLCBjaGlwLT5yZWdzLT5vdXRwdXQsIGNoaXAtPnJlZ19vdXRwdXQpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCi0JcmV0ID0gcGNhOTUzeF9yZWFkX3JlZ3MoY2hpcCwgUENBOTUzWF9ESVJFQ1RJT04sCi0JCQkgICAgICAgY2hpcC0+cmVnX2RpcmVjdGlvbik7CisJcmV0ID0gcGNhOTUzeF9yZWFkX3JlZ3MoY2hpcCwgY2hpcC0+cmVncy0+ZGlyZWN0aW9uLAorCQkJCWNoaXAtPnJlZ19kaXJlY3Rpb24pOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCkBAIC03MDksMTAgKzY5OSwxMyBAQAogCWludCByZXQ7CiAJdTggdmFsW01BWF9CQU5LXTsKIAotCXJldCA9IHBjYTk1M3hfcmVhZF9yZWdzKGNoaXAsIFBDQTk1N1hfT1VULCBjaGlwLT5yZWdfb3V0cHV0KTsKKwljaGlwLT5yZWdzID0gJnBjYTk1N3hfcmVnczsKKworCXJldCA9IHBjYTk1M3hfcmVhZF9yZWdzKGNoaXAsIGNoaXAtPnJlZ3MtPm91dHB1dCwgY2hpcC0+cmVnX291dHB1dCk7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7Ci0JcmV0ID0gcGNhOTUzeF9yZWFkX3JlZ3MoY2hpcCwgUENBOTU3WF9DRkcsIGNoaXAtPnJlZ19kaXJlY3Rpb24pOworCXJldCA9IHBjYTk1M3hfcmVhZF9yZWdzKGNoaXAsIGNoaXAtPnJlZ3MtPmRpcmVjdGlvbiwKKwkJCQljaGlwLT5yZWdfZGlyZWN0aW9uKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIApAQCAtNzQ2LDYgKzczOSw3IEBACiAJaW50IGlycV9iYXNlID0gMDsKIAlpbnQgcmV0OwogCXUzMiBpbnZlcnQgPSAwOworCXN0cnVjdCByZWd1bGF0b3IgKnJlZzsKIAogCWNoaXAgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LAogCQkJc2l6ZW9mKHN0cnVjdCBwY2E5NTN4X2NoaXApLCBHRlBfS0VSTkVMKTsKQEAgLTc2NSw2ICs3NTksMjAgQEAKIAogCWNoaXAtPmNsaWVudCA9IGNsaWVudDsKIAorCXJlZyA9IGRldm1fcmVndWxhdG9yX2dldCgmY2xpZW50LT5kZXYsICJ2Y2MiKTsKKwlpZiAoSVNfRVJSKHJlZykpIHsKKwkJcmV0ID0gUFRSX0VSUihyZWcpOworCQlpZiAocmV0ICE9IC1FUFJPQkVfREVGRVIpCisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInJlZyBnZXQgZXJyOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShyZWcpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJyZWcgZW4gZXJyOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJY2hpcC0+cmVndWxhdG9yID0gcmVnOworCiAJaWYgKGlkKSB7CiAJCWNoaXAtPmRyaXZlcl9kYXRhID0gaWQtPmRyaXZlcl9kYXRhOwogCX0gZWxzZSB7CkBAIC03NzYsMTUgKzc4NCwxNSBAQAogCQkJY2hpcC0+ZHJpdmVyX2RhdGEgPSAoaW50KSh1aW50cHRyX3QpbWF0Y2gtPmRhdGE7CiAJCX0gZWxzZSB7CiAJCQlpZCA9IGFjcGlfbWF0Y2hfZGV2aWNlKHBjYTk1M3hfYWNwaV9pZHMsICZjbGllbnQtPmRldik7Ci0JCQlpZiAoIWlkKQotCQkJCXJldHVybiAtRU5PREVWOworCQkJaWYgKCFpZCkgeworCQkJCXJldCA9IC1FTk9ERVY7CisJCQkJZ290byBlcnJfZXhpdDsKKwkJCX0KIAogCQkJY2hpcC0+ZHJpdmVyX2RhdGEgPSBpZC0+ZHJpdmVyX2RhdGE7CiAJCX0KIAl9CiAKLQljaGlwLT5jaGlwX3R5cGUgPSBQQ0FfQ0hJUF9UWVBFKGNoaXAtPmRyaXZlcl9kYXRhKTsKLQogCW11dGV4X2luaXQoJmNoaXAtPmkyY19sb2NrKTsKIAogCS8qIGluaXRpYWxpemUgY2FjaGVkIHJlZ2lzdGVycyBmcm9tIHRoZWlyIG9yaWdpbmFsIHZhbHVlcy4KQEAgLTc5MiwyMCArODAwLDM0IEBACiAJICovCiAJcGNhOTUzeF9zZXR1cF9ncGlvKGNoaXAsIGNoaXAtPmRyaXZlcl9kYXRhICYgUENBX0dQSU9fTUFTSyk7CiAKLQlpZiAoY2hpcC0+Y2hpcF90eXBlID09IFBDQTk1M1hfVFlQRSkKKwlpZiAoY2hpcC0+Z3Bpb19jaGlwLm5ncGlvIDw9IDgpIHsKKwkJY2hpcC0+d3JpdGVfcmVncyA9IHBjYTk1M3hfd3JpdGVfcmVnc184OworCQljaGlwLT5yZWFkX3JlZ3MgPSBwY2E5NTN4X3JlYWRfcmVnc184OworCX0gZWxzZSBpZiAoY2hpcC0+Z3Bpb19jaGlwLm5ncGlvID49IDI0KSB7CisJCWNoaXAtPndyaXRlX3JlZ3MgPSBwY2E5NTN4X3dyaXRlX3JlZ3NfMjQ7CisJCWNoaXAtPnJlYWRfcmVncyA9IHBjYTk1M3hfcmVhZF9yZWdzXzI0OworCX0gZWxzZSB7CisJCWlmIChQQ0FfQ0hJUF9UWVBFKGNoaXAtPmRyaXZlcl9kYXRhKSA9PSBQQ0E5NTNYX1RZUEUpCisJCQljaGlwLT53cml0ZV9yZWdzID0gcGNhOTUzeF93cml0ZV9yZWdzXzE2OworCQllbHNlCisJCQljaGlwLT53cml0ZV9yZWdzID0gcGNhOTU3eF93cml0ZV9yZWdzXzE2OworCQljaGlwLT5yZWFkX3JlZ3MgPSBwY2E5NTN4X3JlYWRfcmVnc18xNjsKKwl9CisKKwlpZiAoUENBX0NISVBfVFlQRShjaGlwLT5kcml2ZXJfZGF0YSkgPT0gUENBOTUzWF9UWVBFKQogCQlyZXQgPSBkZXZpY2VfcGNhOTUzeF9pbml0KGNoaXAsIGludmVydCk7CiAJZWxzZQogCQlyZXQgPSBkZXZpY2VfcGNhOTU3eF9pbml0KGNoaXAsIGludmVydCk7CiAJaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnJfZXhpdDsKIAogCXJldCA9IGRldm1fZ3Bpb2NoaXBfYWRkX2RhdGEoJmNsaWVudC0+ZGV2LCAmY2hpcC0+Z3Bpb19jaGlwLCBjaGlwKTsKIAlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCQlnb3RvIGVycl9leGl0OwogCiAJcmV0ID0gcGNhOTUzeF9pcnFfc2V0dXAoY2hpcCwgaXJxX2Jhc2UpOwogCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJCWdvdG8gZXJyX2V4aXQ7CiAKIAlpZiAocGRhdGEgJiYgcGRhdGEtPnNldHVwKSB7CiAJCXJldCA9IHBkYXRhLT5zZXR1cChjbGllbnQsIGNoaXAtPmdwaW9fY2hpcC5iYXNlLApAQCAtODE2LDYgKzgzOCwxMCBAQAogCiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgY2hpcCk7CiAJcmV0dXJuIDA7CisKK2Vycl9leGl0OgorCXJlZ3VsYXRvcl9kaXNhYmxlKGNoaXAtPnJlZ3VsYXRvcik7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBwY2E5NTN4X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQpAQCAtODI3LDE0ICs4NTMsMTYgQEAKIAlpZiAocGRhdGEgJiYgcGRhdGEtPnRlYXJkb3duKSB7CiAJCXJldCA9IHBkYXRhLT50ZWFyZG93bihjbGllbnQsIGNoaXAtPmdwaW9fY2hpcC5iYXNlLAogCQkJCWNoaXAtPmdwaW9fY2hpcC5uZ3BpbywgcGRhdGEtPmNvbnRleHQpOwotCQlpZiAocmV0IDwgMCkgeworCQlpZiAocmV0IDwgMCkKIAkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXMgZmFpbGVkLCAlZFxuIiwKIAkJCQkJInRlYXJkb3duIiwgcmV0KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KKwl9IGVsc2UgeworCQlyZXQgPSAwOwogCX0KIAotCXJldHVybiAwOworCXJlZ3VsYXRvcl9kaXNhYmxlKGNoaXAtPnJlZ3VsYXRvcik7CisKKwlyZXR1cm4gcmV0OwogfQogCiAvKiBjb252ZW5pZW5jZSB0byBzdG9wIG92ZXJsb25nIG1hdGNoLXRhYmxlIGxpbmVzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1waXNvc3IuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXBpc29zci5jCmluZGV4IGNiMTRiOGQuLmY1NTQ1MDQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1waXNvc3IuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1waXNvc3IuYwpAQCAtOTAsNyArOTAsNyBAQAogCXJldHVybiAoZ3Bpby0+YnVmZmVyW29mZnNldCAvIDhdID4+IChvZmZzZXQgJSA4KSkgJiAweDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0gewogCS5sYWJlbAkJCT0gInBpc29zci1ncGlvIiwKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5nZXRfZGlyZWN0aW9uCQk9IHBpc29zcl9ncGlvX2dldF9kaXJlY3Rpb24sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1yY2FyLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1yY2FyLmMKaW5kZXggYjk2ZTBiNC4uMmJlNDhmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tcmNhci5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXJjYXIuYwpAQCAtMzQ4LDYgKzM0OCwxMCBAQAogCQkvKiBHZW4zIEdQSU8gaXMgaWRlbnRpY2FsIHRvIEdlbjIuICovCiAJCS5kYXRhID0gJmdwaW9fcmNhcl9pbmZvX2dlbjIsCiAJfSwgeworCQkuY29tcGF0aWJsZSA9ICJyZW5lc2FzLGdwaW8tcjhhNzc5NiIsCisJCS8qIEdlbjMgR1BJTyBpcyBpZGVudGljYWwgdG8gR2VuMi4gKi8KKwkJLmRhdGEgPSAmZ3Bpb19yY2FyX2luZm9fZ2VuMiwKKwl9LCB7CiAJCS5jb21wYXRpYmxlID0gInJlbmVzYXMsZ3Bpby1yY2FyIiwKIAkJLmRhdGEgPSAmZ3Bpb19yY2FyX2luZm9fZ2VuMSwKIAl9LCB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1zYTExMDAuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXNhMTEwMC5jCmluZGV4IDBjOTllOGYuLjhkOGVlMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXNhMTEwMC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXNhMTEwMC5jCkBAIC0xNTUsNyArMTU1LDcgQEAKIHsKIAlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmc2ExMTAwX2dwaW9faXJxX2NoaXAsCiAJCQkJIGhhbmRsZV9lZGdlX2lycSk7Ci0JaXJxX3NldF9ub3Byb2JlKGlycSk7CisJaXJxX3NldF9wcm9iZShpcnEpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1zY2guYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXNjaC5jCmluZGV4IGViNDNhZTQuLjU0NTAwNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXNjaC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXNjaC5jCkBAIC0xMzgsNyArMTM4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgc2NoX2dwaW9fY2hpcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIHNjaF9ncGlvX2NoaXAgPSB7CiAJLmxhYmVsCQkJPSAic2NoX2dwaW8iLAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLmRpcmVjdGlvbl9pbnB1dAk9IHNjaF9ncGlvX2RpcmVjdGlvbl9pbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXNwZWFyLXNwaWNzLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1zcGVhci1zcGljcy5jCmluZGV4IDdmZmQxNjQuLjIyMjY3NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXNwZWFyLXNwaWNzLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tc3BlYXItc3BpY3MuYwpAQCAtMTIsNyArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC0xODMsNyArMTgzLDYgQEAKIAl7IC5jb21wYXRpYmxlID0gInN0LHNwZWFyLXNwaWNzLWdwaW8iIH0sCiAJe30KIH07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzcGljc19ncGlvX29mX21hdGNoKTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3BpY3NfZ3Bpb19kcml2ZXIgPSB7CiAJLnByb2JlID0gc3BpY3NfZ3Bpb19wcm9iZSwKQEAgLTE5OCw3ICsxOTcsMyBAQAogCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNwaWNzX2dwaW9fZHJpdmVyKTsKIH0KIHN1YnN5c19pbml0Y2FsbChzcGljc19ncGlvX2luaXQpOwotCi1NT0RVTEVfQVVUSE9SKCJTaGlyYXogSGFzaGltIDxzaGlyYXoubGludXgua2VybmVsQGdtYWlsLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiU1RNaWNyb2VsZWN0cm9uaWNzIFNQRUFyIFNQSSBDaGlwIFNlbGVjdCBBYnN0cmFjdGlvbiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tc3RtcGUuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXN0bXBlLmMKaW5kZXggNWMwZDgxOC4uZTdkNDIyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tc3RtcGUuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1zdG1wZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvc3RtcGUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogCiAvKgogICogVGhlc2UgcmVnaXN0ZXJzIGFyZSBtb2RpZmllZCB1bmRlciB0aGUgaXJxIGJ1cyBsb2NrIGFuZCBjYWNoZWQgdG8gYXZvaWQKQEAgLTQyLDcgKzQzLDcgQEAKIAlzdHJ1Y3Qgc3RtcGVfZ3BpbyAqc3RtcGVfZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOwogCXN0cnVjdCBzdG1wZSAqc3RtcGUgPSBzdG1wZV9ncGlvLT5zdG1wZTsKIAl1OCByZWcgPSBzdG1wZS0+cmVnc1tTVE1QRV9JRFhfR1BNUl9MU0IgKyAob2Zmc2V0IC8gOCldOwotCXU4IG1hc2sgPSAxIDw8IChvZmZzZXQgJSA4KTsKKwl1OCBtYXNrID0gQklUKG9mZnNldCAlIDgpOwogCWludCByZXQ7CiAKIAlyZXQgPSBzdG1wZV9yZWdfcmVhZChzdG1wZSwgcmVnKTsKQEAgLTU4LDcgKzU5LDcgQEAKIAlzdHJ1Y3Qgc3RtcGUgKnN0bXBlID0gc3RtcGVfZ3Bpby0+c3RtcGU7CiAJaW50IHdoaWNoID0gdmFsID8gU1RNUEVfSURYX0dQU1JfTFNCIDogU1RNUEVfSURYX0dQQ1JfTFNCOwogCXU4IHJlZyA9IHN0bXBlLT5yZWdzW3doaWNoICsgKG9mZnNldCAvIDgpXTsKLQl1OCBtYXNrID0gMSA8PCAob2Zmc2V0ICUgOCk7CisJdTggbWFzayA9IEJJVChvZmZzZXQgJSA4KTsKIAogCS8qCiAJICogU29tZSB2YXJpYW50cyBoYXZlIHNpbmdsZSByZWdpc3RlciBmb3IgZ3BpbyBzZXQvY2xlYXIgZnVuY3Rpb25hbGl0eS4KQEAgLTc2LDcgKzc3LDcgQEAKIAlzdHJ1Y3Qgc3RtcGVfZ3BpbyAqc3RtcGVfZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOwogCXN0cnVjdCBzdG1wZSAqc3RtcGUgPSBzdG1wZV9ncGlvLT5zdG1wZTsKIAl1OCByZWcgPSBzdG1wZS0+cmVnc1tTVE1QRV9JRFhfR1BEUl9MU0JdIC0gKG9mZnNldCAvIDgpOwotCXU4IG1hc2sgPSAxIDw8IChvZmZzZXQgJSA4KTsKKwl1OCBtYXNrID0gQklUKG9mZnNldCAlIDgpOwogCWludCByZXQ7CiAKIAlyZXQgPSBzdG1wZV9yZWdfcmVhZChzdG1wZSwgcmVnKTsKQEAgLTkyLDcgKzkzLDcgQEAKIAlzdHJ1Y3Qgc3RtcGVfZ3BpbyAqc3RtcGVfZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOwogCXN0cnVjdCBzdG1wZSAqc3RtcGUgPSBzdG1wZV9ncGlvLT5zdG1wZTsKIAl1OCByZWcgPSBzdG1wZS0+cmVnc1tTVE1QRV9JRFhfR1BEUl9MU0IgKyAob2Zmc2V0IC8gOCldOwotCXU4IG1hc2sgPSAxIDw8IChvZmZzZXQgJSA4KTsKKwl1OCBtYXNrID0gQklUKG9mZnNldCAlIDgpOwogCiAJc3RtcGVfZ3Bpb19zZXQoY2hpcCwgb2Zmc2V0LCB2YWwpOwogCkBAIC0xMDUsNyArMTA2LDcgQEAKIAlzdHJ1Y3Qgc3RtcGVfZ3BpbyAqc3RtcGVfZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOwogCXN0cnVjdCBzdG1wZSAqc3RtcGUgPSBzdG1wZV9ncGlvLT5zdG1wZTsKIAl1OCByZWcgPSBzdG1wZS0+cmVnc1tTVE1QRV9JRFhfR1BEUl9MU0IgKyAob2Zmc2V0IC8gOCldOwotCXU4IG1hc2sgPSAxIDw8IChvZmZzZXQgJSA4KTsKKwl1OCBtYXNrID0gQklUKG9mZnNldCAlIDgpOwogCiAJcmV0dXJuIHN0bXBlX3NldF9iaXRzKHN0bXBlLCByZWcsIG1hc2ssIDApOwogfQpAQCAtMTE1LDEzICsxMTYsMTMgQEAKIAlzdHJ1Y3Qgc3RtcGVfZ3BpbyAqc3RtcGVfZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOwogCXN0cnVjdCBzdG1wZSAqc3RtcGUgPSBzdG1wZV9ncGlvLT5zdG1wZTsKIAotCWlmIChzdG1wZV9ncGlvLT5ub3JlcXVlc3RfbWFzayAmICgxIDw8IG9mZnNldCkpCisJaWYgKHN0bXBlX2dwaW8tPm5vcmVxdWVzdF9tYXNrICYgQklUKG9mZnNldCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIHN0bXBlX3NldF9hbHRmdW5jKHN0bXBlLCAxIDw8IG9mZnNldCwgU1RNUEVfQkxPQ0tfR1BJTyk7CisJcmV0dXJuIHN0bXBlX3NldF9hbHRmdW5jKHN0bXBlLCBCSVQob2Zmc2V0KSwgU1RNUEVfQkxPQ0tfR1BJTyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0gewogCS5sYWJlbAkJCT0gInN0bXBlIiwKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5nZXRfZGlyZWN0aW9uCQk9IHN0bXBlX2dwaW9fZ2V0X2RpcmVjdGlvbiwKQEAgLTEzOSw3ICsxNDAsNyBAQAogCXN0cnVjdCBzdG1wZV9ncGlvICpzdG1wZV9ncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoZ2MpOwogCWludCBvZmZzZXQgPSBkLT5od2lycTsKIAlpbnQgcmVnb2Zmc2V0ID0gb2Zmc2V0IC8gODsKLQlpbnQgbWFzayA9IDEgPDwgKG9mZnNldCAlIDgpOworCWludCBtYXNrID0gQklUKG9mZnNldCAlIDgpOwogCiAJaWYgKHR5cGUgJiBJUlFfVFlQRV9MRVZFTF9MT1cgfHwgdHlwZSAmIElSUV9UWVBFX0xFVkVMX0hJR0gpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjE3LDcgKzIxOCw3IEBACiAJc3RydWN0IHN0bXBlX2dwaW8gKnN0bXBlX2dwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShnYyk7CiAJaW50IG9mZnNldCA9IGQtPmh3aXJxOwogCWludCByZWdvZmZzZXQgPSBvZmZzZXQgLyA4OwotCWludCBtYXNrID0gMSA8PCAob2Zmc2V0ICUgOCk7CisJaW50IG1hc2sgPSBCSVQob2Zmc2V0ICUgOCk7CiAKIAlzdG1wZV9ncGlvLT5yZWdzW1JFR19JRV1bcmVnb2Zmc2V0XSAmPSB+bWFzazsKIH0KQEAgLTIyOSw3ICsyMzAsNyBAQAogCXN0cnVjdCBzdG1wZSAqc3RtcGUgPSBzdG1wZV9ncGlvLT5zdG1wZTsKIAlpbnQgb2Zmc2V0ID0gZC0+aHdpcnE7CiAJaW50IHJlZ29mZnNldCA9IG9mZnNldCAvIDg7Ci0JaW50IG1hc2sgPSAxIDw8IChvZmZzZXQgJSA4KTsKKwlpbnQgbWFzayA9IEJJVChvZmZzZXQgJSA4KTsKIAogCXN0bXBlX2dwaW8tPnJlZ3NbUkVHX0lFXVtyZWdvZmZzZXRdIHw9IG1hc2s7CiAKQEAgLTI1Myw3ICsyNTQsNyBAQAogCWJvb2wgdmFsID0gISFzdG1wZV9ncGlvX2dldChnYywgb2Zmc2V0KTsKIAl1OCBiYW5rID0gb2Zmc2V0IC8gODsKIAl1OCBkaXJfcmVnID0gc3RtcGUtPnJlZ3NbU1RNUEVfSURYX0dQRFJfTFNCICsgYmFua107Ci0JdTggbWFzayA9IDEgPDwgKG9mZnNldCAlIDgpOworCXU4IG1hc2sgPSBCSVQob2Zmc2V0ICUgOCk7CiAJaW50IHJldDsKIAl1OCBkaXI7CiAKQEAgLTQwMCw3ICs0MDEsNyBAQAogCQkJCQkJCSBsaW5lKTsKIAogCQkJaGFuZGxlX25lc3RlZF9pcnEoY2hpbGRfaXJxKTsKLQkJCXN0YXQgJj0gfigxIDw8IGJpdCk7CisJCQlzdGF0ICY9IH5CSVQoYml0KTsKIAkJfQogCiAJCS8qCkBAIC00NDksNiArNDUwLDggQEAKIAogCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAic3Qsbm9yZXF1ZXN0LW1hc2siLAogCQkJJnN0bXBlX2dwaW8tPm5vcmVxdWVzdF9tYXNrKTsKKwlpZiAoc3RtcGVfZ3Bpby0+bm9yZXF1ZXN0X21hc2spCisJCXN0bXBlX2dwaW8tPmNoaXAuaXJxX25lZWRfdmFsaWRfbWFzayA9IHRydWU7CiAKIAlpZiAoaXJxIDwgMCkKIAkJZGV2X2luZm8oJnBkZXYtPmRldiwKQEAgLTQ3Myw2ICs0NzYsMTQgQEAKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBnZXQgaXJxOiAlZFxuIiwgcmV0KTsKIAkJCWdvdG8gb3V0X2Rpc2FibGU7CiAJCX0KKwkJaWYgKHN0bXBlX2dwaW8tPm5vcmVxdWVzdF9tYXNrKSB7CisJCQlpbnQgaTsKKworCQkJLyogRm9yYmlkIHVudXNlZCBsaW5lcyB0byBiZSBtYXBwZWQgYXMgSVJRcyAqLworCQkJZm9yIChpID0gMDsgaSA8IHNpemVvZih1MzIpOyBpKyspCisJCQkJaWYgKHN0bXBlX2dwaW8tPm5vcmVxdWVzdF9tYXNrICYgQklUKGkpKQorCQkJCQljbGVhcl9iaXQoaSwgc3RtcGVfZ3Bpby0+Y2hpcC5pcnFfdmFsaWRfbWFzayk7CisJCX0KIAkJcmV0ID0gIGdwaW9jaGlwX2lycWNoaXBfYWRkKCZzdG1wZV9ncGlvLT5jaGlwLAogCQkJCQkgICAgJnN0bXBlX2dwaW9faXJxX2NoaXAsCiAJCQkJCSAgICAwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tc3gxNTB4LmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1zeDE1MHguYwppbmRleCBhMTc3ZWJkLi5hZjk1ZGU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1zeDE1MHguYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1zeDE1MHguYwpAQCAtMjM2LDcgKzIzNiw2IEBACiAJeyJzeDE1MDJxIiwgM30sCiAJe30KIH07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgc3gxNTB4X2lkKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3gxNTB4X29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJzZW10ZWNoLHN4MTUwOHEiIH0sCkBAIC0yNDUsNyArMjQ0LDYgQEAKIAl7IC5jb21wYXRpYmxlID0gInNlbXRlY2gsc3gxNTAycSIgfSwKIAl7fSwKIH07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzeDE1MHhfb2ZfbWF0Y2gpOwogCiBzdGF0aWMgczMyIHN4MTUweF9pMmNfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCB2YWwpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby10YzM1ODl4LmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby10YzM1ODl4LmMKaW5kZXggOGIzNjU5My4uNWE1YTZjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tdGMzNTg5eC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXRjMzU4OXguYwpAQCAtMzQsNyArMzQsNyBAQAogCXU4IG9sZHJlZ3NbQ0FDSEVfTlJfUkVHU11bQ0FDSEVfTlJfQkFOS1NdOwogfTsKIAotc3RhdGljIGludCB0YzM1ODl4X2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3N0YXRpYyBpbnQgdGMzNTg5eF9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQogewogCXN0cnVjdCB0YzM1ODl4X2dwaW8gKnRjMzU4OXhfZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOwogCXN0cnVjdCB0YzM1ODl4ICp0YzM1ODl4ID0gdGMzNTg5eF9ncGlvLT50YzM1ODl4OwpAQCAtNDksMjQgKzQ5LDI0IEBACiAJcmV0dXJuICEhKHJldCAmIG1hc2spOwogfQogCi1zdGF0aWMgdm9pZCB0YzM1ODl4X2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbCkKK3N0YXRpYyB2b2lkIHRjMzU4OXhfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IG9mZnNldCwgaW50IHZhbCkKIHsKIAlzdHJ1Y3QgdGMzNTg5eF9ncGlvICp0YzM1ODl4X2dwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKIAlzdHJ1Y3QgdGMzNTg5eCAqdGMzNTg5eCA9IHRjMzU4OXhfZ3Bpby0+dGMzNTg5eDsKIAl1OCByZWcgPSBUQzM1ODl4X0dQSU9EQVRBMCArIChvZmZzZXQgLyA4KSAqIDI7Ci0JdW5zaWduZWQgcG9zID0gb2Zmc2V0ICUgODsKKwl1bnNpZ25lZCBpbnQgcG9zID0gb2Zmc2V0ICUgODsKIAl1OCBkYXRhW10gPSB7dmFsID8gQklUKHBvcykgOiAwLCBCSVQocG9zKX07CiAKIAl0YzM1ODl4X2Jsb2NrX3dyaXRlKHRjMzU4OXgsIHJlZywgQVJSQVlfU0laRShkYXRhKSwgZGF0YSk7CiB9CiAKIHN0YXRpYyBpbnQgdGMzNTg5eF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKLQkJCQkJIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbCkKKwkJCQkJIHVuc2lnbmVkIGludCBvZmZzZXQsIGludCB2YWwpCiB7CiAJc3RydWN0IHRjMzU4OXhfZ3BpbyAqdGMzNTg5eF9ncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CiAJc3RydWN0IHRjMzU4OXggKnRjMzU4OXggPSB0YzM1ODl4X2dwaW8tPnRjMzU4OXg7CiAJdTggcmVnID0gVEMzNTg5eF9HUElPRElSMCArIG9mZnNldCAvIDg7Ci0JdW5zaWduZWQgcG9zID0gb2Zmc2V0ICUgODsKKwl1bnNpZ25lZCBpbnQgcG9zID0gb2Zmc2V0ICUgODsKIAogCXRjMzU4OXhfZ3Bpb19zZXQoY2hpcCwgb2Zmc2V0LCB2YWwpOwogCkBAIC03NCwxOSArNzQsMzUgQEAKIH0KIAogc3RhdGljIGludCB0YzM1ODl4X2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCi0JCQkJCXVuc2lnbmVkIG9mZnNldCkKKwkJCQkJdW5zaWduZWQgaW50IG9mZnNldCkKIHsKIAlzdHJ1Y3QgdGMzNTg5eF9ncGlvICp0YzM1ODl4X2dwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKIAlzdHJ1Y3QgdGMzNTg5eCAqdGMzNTg5eCA9IHRjMzU4OXhfZ3Bpby0+dGMzNTg5eDsKIAl1OCByZWcgPSBUQzM1ODl4X0dQSU9ESVIwICsgb2Zmc2V0IC8gODsKLQl1bnNpZ25lZCBwb3MgPSBvZmZzZXQgJSA4OworCXVuc2lnbmVkIGludCBwb3MgPSBvZmZzZXQgJSA4OwogCiAJcmV0dXJuIHRjMzU4OXhfc2V0X2JpdHModGMzNTg5eCwgcmVnLCBCSVQocG9zKSwgMCk7CiB9CiAKLXN0YXRpYyBpbnQgdGMzNTg5eF9ncGlvX3NpbmdsZV9lbmRlZChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAotCQkJCSAgICAgdW5zaWduZWQgb2Zmc2V0LAotCQkJCSAgICAgZW51bSBzaW5nbGVfZW5kZWRfbW9kZSBtb2RlKQorc3RhdGljIGludCB0YzM1ODl4X2dwaW9fZ2V0X2RpcmVjdGlvbihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc3RydWN0IHRjMzU4OXhfZ3BpbyAqdGMzNTg5eF9ncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisJc3RydWN0IHRjMzU4OXggKnRjMzU4OXggPSB0YzM1ODl4X2dwaW8tPnRjMzU4OXg7CisJdTggcmVnID0gVEMzNTg5eF9HUElPRElSMCArIG9mZnNldCAvIDg7CisJdW5zaWduZWQgaW50IHBvcyA9IG9mZnNldCAlIDg7CisJaW50IHJldDsKKworCXJldCA9IHRjMzU4OXhfcmVnX3JlYWQodGMzNTg5eCwgcmVnKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAhIShyZXQgJiBCSVQocG9zKSk7Cit9CisKK3N0YXRpYyBpbnQgdGMzNTg5eF9ncGlvX3NldF9zaW5nbGVfZW5kZWQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwkJCQkJIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCQkJCSBlbnVtIHNpbmdsZV9lbmRlZF9tb2RlIG1vZGUpCiB7CiAJc3RydWN0IHRjMzU4OXhfZ3BpbyAqdGMzNTg5eF9ncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CiAJc3RydWN0IHRjMzU4OXggKnRjMzU4OXggPSB0YzM1ODl4X2dwaW8tPnRjMzU4OXg7CkBAIC05Nyw3ICsxMTMsNyBAQAogCSAqLwogCXU4IG9kbXJlZyA9IFRDMzU4OXhfR1BJT09ETTAgKyAob2Zmc2V0IC8gOCkgKiAyOwogCXU4IG9kZXJlZyA9IFRDMzU4OXhfR1BJT09ERTAgKyAob2Zmc2V0IC8gOCkgKiAyOwotCXVuc2lnbmVkIHBvcyA9IG9mZnNldCAlIDg7CisJdW5zaWduZWQgaW50IHBvcyA9IG9mZnNldCAlIDg7CiAJaW50IHJldDsKIAogCXN3aXRjaChtb2RlKSB7CkBAIC0xMjQsMTQgKzE0MCwxNSBAQAogCXJldHVybiAtRU5PVFNVUFA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0gewogCS5sYWJlbAkJCT0gInRjMzU4OXgiLAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCi0JLmRpcmVjdGlvbl9pbnB1dAk9IHRjMzU4OXhfZ3Bpb19kaXJlY3Rpb25faW5wdXQsCiAJLmdldAkJCT0gdGMzNTg5eF9ncGlvX2dldCwKLQkuZGlyZWN0aW9uX291dHB1dAk9IHRjMzU4OXhfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0LAogCS5zZXQJCQk9IHRjMzU4OXhfZ3Bpb19zZXQsCi0JLnNldF9zaW5nbGVfZW5kZWQJPSB0YzM1ODl4X2dwaW9fc2luZ2xlX2VuZGVkLAorCS5kaXJlY3Rpb25fb3V0cHV0CT0gdGMzNTg5eF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQsCisJLmRpcmVjdGlvbl9pbnB1dAk9IHRjMzU4OXhfZ3Bpb19kaXJlY3Rpb25faW5wdXQsCisJLmdldF9kaXJlY3Rpb24JCT0gdGMzNTg5eF9ncGlvX2dldF9kaXJlY3Rpb24sCisJLnNldF9zaW5nbGVfZW5kZWQJPSB0YzM1ODl4X2dwaW9fc2V0X3NpbmdsZV9lbmRlZCwKIAkuY2FuX3NsZWVwCQk9IHRydWUsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby10cGljMjgxMC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tdHBpYzI4MTAuYwppbmRleCBjYWNlNzljLi5jOGIzNGQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby10cGljMjgxMC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXRwaWMyODEwLmMKQEAgLTg3LDcgKzg3LDcgQEAKIAl0cGljMjgxMF9zZXRfbWFza19iaXRzKGNoaXAsICptYXNrLCAqYml0cyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0gewogCS5sYWJlbAkJCT0gInRwaWMyODEwIiwKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5nZXRfZGlyZWN0aW9uCQk9IHRwaWMyODEwX2dldF9kaXJlY3Rpb24sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby10cHM2NTA4Ni5jIGIvZHJpdmVycy9ncGlvL2dwaW8tdHBzNjUwODYuYwppbmRleCA4ZTI1ZjAxLi5iMjNjNGQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby10cHM2NTA4Ni5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXRwczY1MDg2LmMKQEAgLTcyLDcgKzcyLDcgQEAKIAkJCSAgIEJJVCg0ICsgb2Zmc2V0KSwgdmFsdWUgPyBCSVQoNCArIG9mZnNldCkgOiAwKTsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgdGVtcGxhdGVfY2hpcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CiAJLmxhYmVsCQkJPSAidHBzNjUwODYtZ3BpbyIsCiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkuZ2V0X2RpcmVjdGlvbgkJPSB0cHM2NTA4Nl9ncGlvX2dldF9kaXJlY3Rpb24sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby10cHM2NTIxOC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tdHBzNjUyMTguYwppbmRleCAxYzA5YTE5Li5kNzc5MzA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby10cHM2NTIxOC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXRwczY1MjE4LmMKQEAgLTE3Miw3ICsxNzIsNyBAQAogCXJldHVybiAtRU5PVFNVUFA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0gewogCS5sYWJlbAkJCT0gImdwaW8tdHBzNjUyMTgiLAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLnJlcXVlc3QJCT0gdHBzNjUyMThfZ3Bpb19yZXF1ZXN0LApAQCAtMjA0LDcgKzIwNCw4IEBACiAJdHBzNjUyMThfZ3Bpby0+Z3Bpb19jaGlwLm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKICNlbmRpZgogCi0JcmV0ID0gZ3Bpb2NoaXBfYWRkX2RhdGEoJnRwczY1MjE4X2dwaW8tPmdwaW9fY2hpcCwgdHBzNjUyMThfZ3Bpbyk7CisJcmV0ID0gZGV2bV9ncGlvY2hpcF9hZGRfZGF0YSgmcGRldi0+ZGV2LCAmdHBzNjUyMThfZ3Bpby0+Z3Bpb19jaGlwLAorCQkJCSAgICAgdHBzNjUyMThfZ3Bpbyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGdwaW9jaGlwLCAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKQEAgLTIxNSwxNSArMjE2LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHRwczY1MjE4X2dwaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHRwczY1MjE4X2dwaW8gKnRwczY1MjE4X2dwaW8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWdwaW9jaGlwX3JlbW92ZSgmdHBzNjUyMThfZ3Bpby0+Z3Bpb19jaGlwKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB0cHM2NTIxOF9kdF9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAidGksdHBzNjUyMTgtZ3BpbyIgfSwKIAl7ICB9CkBAIC0yNDIsNyArMjM0LDYgQEAKIAkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHRwczY1MjE4X2R0X21hdGNoKQogCX0sCiAJLnByb2JlID0gdHBzNjUyMThfZ3Bpb19wcm9iZSwKLQkucmVtb3ZlID0gdHBzNjUyMThfZ3Bpb19yZW1vdmUsCiAJLmlkX3RhYmxlID0gdHBzNjUyMThfZ3Bpb19pZF90YWJsZSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXRwczY1OTEyLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby10cHM2NTkxMi5jCmluZGV4IGFjZmQzMGEuLmFiYzA3OTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXRwczY1OTEyLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tdHBzNjU5MTIuYwpAQCAtOTAsNyArOTAsNyBAQAogCQkJICAgR1BJT19TRVRfTUFTSywgdmFsdWUgPyBHUElPX1NFVF9NQVNLIDogMCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0gewogCS5sYWJlbAkJCT0gInRwczY1OTEyLWdwaW8iLAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLmdldF9kaXJlY3Rpb24JCT0gdHBzNjU5MTJfZ3Bpb19nZXRfZGlyZWN0aW9uLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tdHM0ODAwLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby10czQ4MDAuYwppbmRleCAwYzE0NGE3Li45OTI1NjExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby10czQ4MDAuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby10czQ4MDAuYwpAQCAtOSw2ICs5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZ3Bpby9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby10czQ5MDAuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXRzNDkwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZDIxNzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby10czQ5MDAuYwpAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIERpZ2l0YWwgSS9PIGRyaXZlciBmb3IgVGVjaG5vbG9naWMgU3lzdGVtcyBJMkMgRlBHQSBDb3JlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRlY2hub2xvZ2ljIFN5c3RlbXMKKyAqIENvcHlyaWdodCAoQykgMjAxNiBTYXZvaXItRmFpcmUgTGludXgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCAiYXMgaXMiIFdJVEhPVVQgQU5ZIFdBUlJBTlRZIG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzZWQgb3IgaW1wbGllZDsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZ3Bpby9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworI2RlZmluZSBERUZBVUxUX1BJTl9OVU1CRVIJMzIKKy8qCisgKiBSZWdpc3RlciBiaXRzIHVzZWQgYnkgdGhlIEdQSU8gZGV2aWNlCisgKiBTb21lIGJvYXJkcywgc3VjaCBhcyBUUy03OTcwIGRvIG5vdCBoYXZlIGEgc2VwYXJhdGUgaW5wdXQgYml0CisgKi8KKyNkZWZpbmUgVFM0OTAwX0dQSU9fT0UJCTB4MDEKKyNkZWZpbmUgVFM0OTAwX0dQSU9fT1VUCQkweDAyCisjZGVmaW5lIFRTNDkwMF9HUElPX0lOCQkweDA0CisjZGVmaW5lIFRTNzk3MF9HUElPX0lOCQkweDAyCisKK3N0cnVjdCB0czQ5MDBfZ3Bpb19wcml2IHsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJc3RydWN0IGdwaW9fY2hpcCBncGlvX2NoaXA7CisJdW5zaWduZWQgaW50IGlucHV0X2JpdDsKK307CisKK3N0YXRpYyBpbnQgdHM0OTAwX2dwaW9fZ2V0X2RpcmVjdGlvbihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCSAgICAgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgdHM0OTAwX2dwaW9fcHJpdiAqcHJpdiA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCXVuc2lnbmVkIGludCByZWc7CisKKwlyZWdtYXBfcmVhZChwcml2LT5yZWdtYXAsIG9mZnNldCwgJnJlZyk7CisKKwlyZXR1cm4gIShyZWcgJiBUUzQ5MDBfR1BJT19PRSk7Cit9CisKK3N0YXRpYyBpbnQgdHM0OTAwX2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc3RydWN0IHRzNDkwMF9ncGlvX3ByaXYgKnByaXYgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKworCS8qCisJICogVGhpcyB3aWxsIGNsZWFyIHRoZSBvdXRwdXQgZW5hYmxlIGJpdCwgdGhlIG90aGVyIGJpdHMgYXJlCisJICogZG9udGNhcmUgd2hlbiB0aGlzIGlzIGNsZWFyZWQKKwkgKi8KKwlyZXR1cm4gcmVnbWFwX3dyaXRlKHByaXYtPnJlZ21hcCwgb2Zmc2V0LCAwKTsKK30KKworc3RhdGljIGludCB0czQ5MDBfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJCXVuc2lnbmVkIGludCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgdHM0OTAwX2dwaW9fcHJpdiAqcHJpdiA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCWludCByZXQ7CisKKwlpZiAodmFsdWUpCisJCXJldCA9IHJlZ21hcF93cml0ZShwcml2LT5yZWdtYXAsIG9mZnNldCwgVFM0OTAwX0dQSU9fT0UgfAorCQkJCQkJCSBUUzQ5MDBfR1BJT19PVVQpOworCWVsc2UKKwkJcmV0ID0gcmVnbWFwX3dyaXRlKHByaXYtPnJlZ21hcCwgb2Zmc2V0LCBUUzQ5MDBfR1BJT19PRSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRzNDkwMF9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCB0czQ5MDBfZ3Bpb19wcml2ICpwcml2ID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisJdW5zaWduZWQgaW50IHJlZzsKKworCXJlZ21hcF9yZWFkKHByaXYtPnJlZ21hcCwgb2Zmc2V0LCAmcmVnKTsKKworCXJldHVybiAhIShyZWcgJiBwcml2LT5pbnB1dF9iaXQpOworfQorCitzdGF0aWMgdm9pZCB0czQ5MDBfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJCSAgICBpbnQgdmFsdWUpCit7CisJc3RydWN0IHRzNDkwMF9ncGlvX3ByaXYgKnByaXYgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKworCWlmICh2YWx1ZSkKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHByaXYtPnJlZ21hcCwgb2Zmc2V0LCBUUzQ5MDBfR1BJT19PVVQsCisJCQkJICAgVFM0OTAwX0dQSU9fT1VUKTsKKwllbHNlCisJCXJlZ21hcF91cGRhdGVfYml0cyhwcml2LT5yZWdtYXAsIG9mZnNldCwgVFM0OTAwX0dQSU9fT1VULCAwKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHRzNDkwMF9yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cyA9IDE2LAorCS52YWxfYml0cyA9IDgsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0geworCS5sYWJlbAkJCT0gInRzNDkwMC1ncGlvIiwKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5nZXRfZGlyZWN0aW9uCQk9IHRzNDkwMF9ncGlvX2dldF9kaXJlY3Rpb24sCisJLmRpcmVjdGlvbl9pbnB1dAk9IHRzNDkwMF9ncGlvX2RpcmVjdGlvbl9pbnB1dCwKKwkuZGlyZWN0aW9uX291dHB1dAk9IHRzNDkwMF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQsCisJLmdldAkJCT0gdHM0OTAwX2dwaW9fZ2V0LAorCS5zZXQJCQk9IHRzNDkwMF9ncGlvX3NldCwKKwkuYmFzZQkJCT0gLTEsCisJLmNhbl9zbGVlcAkJPSB0cnVlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdHM0OTAwX2dwaW9fb2ZfbWF0Y2hfdGFibGVbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0gInRlY2hub2xvZ2ljLHRzNDkwMC1ncGlvIiwKKwkJLmRhdGEgPSAodm9pZCAqKVRTNDkwMF9HUElPX0lOLAorCX0sIHsKKwkJLmNvbXBhdGlibGUgPSAidGVjaG5vbG9naWMsdHM3OTcwLWdwaW8iLAorCQkuZGF0YSA9ICh2b2lkICopVFM3OTcwX0dQSU9fSU4sCisJfSwKKwl7IC8qIHNlbnRpbmVsICovIH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgdHM0OTAwX2dwaW9fb2ZfbWF0Y2hfdGFibGUpOworCitzdGF0aWMgaW50IHRzNDkwMF9ncGlvX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CisJc3RydWN0IHRzNDkwMF9ncGlvX3ByaXYgKnByaXY7CisJdTMyIG5ncGlvOworCWludCByZXQ7CisKKwltYXRjaCA9IG9mX21hdGNoX2RldmljZSh0czQ5MDBfZ3Bpb19vZl9tYXRjaF90YWJsZSwgJmNsaWVudC0+ZGV2KTsKKwlpZiAoIW1hdGNoKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihjbGllbnQtPmRldi5vZl9ub2RlLCAibmdwaW9zIiwgJm5ncGlvKSkKKwkJbmdwaW8gPSBERUZBVUxUX1BJTl9OVU1CRVI7CisKKwlwcml2ID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByaXYtPmdwaW9fY2hpcCA9IHRlbXBsYXRlX2NoaXA7CisJcHJpdi0+Z3Bpb19jaGlwLmxhYmVsID0gInRzNDkwMC1ncGlvIjsKKwlwcml2LT5ncGlvX2NoaXAubmdwaW8gPSBuZ3BpbzsKKwlwcml2LT5ncGlvX2NoaXAucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCXByaXYtPmlucHV0X2JpdCA9ICh1aW50cHRyX3QpbWF0Y2gtPmRhdGE7CisKKwlwcml2LT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZ0czQ5MDBfcmVnbWFwX2NvbmZpZyk7CisJaWYgKElTX0VSUihwcml2LT5yZWdtYXApKSB7CisJCXJldCA9IFBUUl9FUlIocHJpdi0+cmVnbWFwKTsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVnaXN0ZXIgbWFwOiAlZFxuIiwKKwkJCXJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZGV2bV9ncGlvY2hpcF9hZGRfZGF0YSgmY2xpZW50LT5kZXYsICZwcml2LT5ncGlvX2NoaXAsIHByaXYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiVW5hYmxlIHRvIHJlZ2lzdGVyIGdwaW9jaGlwXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBwcml2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgdHM0OTAwX2dwaW9faWRfdGFibGVbXSA9IHsKKwl7ICJ0czQ5MDAtZ3BpbyIsIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHRzNDkwMF9ncGlvX2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHRzNDkwMF9ncGlvX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ0czQ5MDAtZ3BpbyIsCisJCS5vZl9tYXRjaF90YWJsZSA9IHRzNDkwMF9ncGlvX29mX21hdGNoX3RhYmxlLAorCX0sCisJLnByb2JlID0gdHM0OTAwX2dwaW9fcHJvYmUsCisJLmlkX3RhYmxlID0gdHM0OTAwX2dwaW9faWRfdGFibGUsCit9OworbW9kdWxlX2kyY19kcml2ZXIodHM0OTAwX2dwaW9fZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiVGVjaG5vbG9naWMgU3lzdGVtcyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJHUElPIGludGVyZmFjZSBmb3IgVGVjaG5vbG9naWMgU3lzdGVtcyBJMkMtRlBHQSBjb3JlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby10d2w0MDMwLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby10d2w0MDMwLmMKaW5kZXggNGI4MDdiMC4uZGZjZmJiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tdHdsNDAzMC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXR3bDQwMzAuYwpAQCAtMzgxLDcgKzM4MSw3IEBACiAJCTogLUVJTlZBTDsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgdGVtcGxhdGVfY2hpcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CiAJLmxhYmVsCQkJPSAidHdsNDAzMCIsCiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkucmVxdWVzdAkJPSB0d2xfcmVxdWVzdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXZmNjEwLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby12ZjYxMC5jCmluZGV4IDYyODRiZGIuLjNlZGIwOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXZmNjEwLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tdmY2MTAuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiB2ZjYxMCBHUElPIHN1cHBvcnQgdGhyb3VnaCBQT1JUIGFuZCBHUElPIG1vZHVsZQorICogRnJlZXNjYWxlIHZmNjEwIEdQSU8gc3VwcG9ydCB0aHJvdWdoIFBPUlQgYW5kIEdQSU8KICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTQgVG9yYWRleCBBRy4KICAqCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgpAQCAtMjg5LDcgKzI4OCwzIEBACiAJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdmY2MTBfZ3Bpb19kcml2ZXIpOwogfQogZGV2aWNlX2luaXRjYWxsKGdwaW9fdmY2MTBfaW5pdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIlN0ZWZhbiBBZ25lciA8c3RlZmFuQGFnbmVyLmNoPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJGcmVlc2NhbGUgVkY2MTAgR1BJTyIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8td2NvdmUuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXdjb3ZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBkZGJhNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXdjb3ZlLmMKQEAgLTAsMCArMSw0NzAgQEAKKy8qCisgKiBJbnRlbCBXaGlza2V5IENvdmUgUE1JQyBHUElPIERyaXZlcgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIHdyaXR0ZW4gYmFzZWQgb24gZ3Bpby1jcnlzdGFsY292ZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvaW50ZWxfc29jX3BtaWMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisvKgorICogV2hpc2tleSBDb3ZlIFBNSUMgaGFzIDEzIHBoeXNpY2FsIEdQSU8gcGlucyBkaXZpZGVkIGludG8gMyBiYW5rczoKKyAqIEJhbmsgMDogUGluIDAgLSA2CisgKiBCYW5rIDE6IFBpbiA3IC0gMTAKKyAqIEJhbmsgMjogUGluIDExIC0xMgorICogRWFjaCBwaW4gaGFzIG9uZSBvdXRwdXQgY29udHJvbCByZWdpc3RlciBhbmQgb25lIGlucHV0IGNvbnRyb2wgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgQkFOSzBfTlJfUElOUwkJNworI2RlZmluZSBCQU5LMV9OUl9QSU5TCQk0CisjZGVmaW5lIEJBTksyX05SX1BJTlMJCTIKKyNkZWZpbmUgV0NPVkVfR1BJT19OVU0JCShCQU5LMF9OUl9QSU5TICsgQkFOSzFfTlJfUElOUyArIEJBTksyX05SX1BJTlMpCisjZGVmaW5lIFdDT1ZFX1ZHUElPX05VTQkJOTQKKy8qIEdQSU8gb3V0cHV0IGNvbnRyb2wgcmVnaXN0ZXJzIChvbmUgcGVyIHBpbik6IDB4NGU0NCAtIDB4NGU1MCAqLworI2RlZmluZSBHUElPX09VVF9DVFJMX0JBU0UJMHg0ZTQ0CisvKiBHUElPIGlucHV0IGNvbnRyb2wgcmVnaXN0ZXJzIChvbmUgcGVyIHBpbik6IDB4NGU1MSAtIDB4NGU1ZCAqLworI2RlZmluZSBHUElPX0lOX0NUUkxfQkFTRQkweDRlNTEKKworLyoKKyAqIEdQSU8gaW50ZXJydXB0cyBhcmUgb3JnYW5pemVkIGluIHR3byBncm91cHM6CisgKiBHcm91cCAwOiBCYW5rIDAgcGlucyAoUGluIDAgLSA2KQorICogR3JvdXAgMTogQmFuayAxIGFuZCBCYW5rIDIgcGlucyAoUGluIDcgLSAxMikKKyAqIEVhY2ggZ3JvdXAgaGFzIHR3byByZWdpc3RlcnMgKG9uZSBiaXQgcGVyIHBpbik6IHN0YXR1cyBhbmQgbWFzay4KKyAqLworI2RlZmluZSBHUk9VUDBfTlJfSVJRUwkJNworI2RlZmluZSBHUk9VUDFfTlJfSVJRUwkJNgorI2RlZmluZSBJUlFfTUFTS19CQVNFCQkweDRlMTkKKyNkZWZpbmUgSVJRX1NUQVRVU19CQVNFCQkweDRlMGIKKyNkZWZpbmUgVVBEQVRFX0lSUV9UWVBFCQlCSVQoMCkKKyNkZWZpbmUgVVBEQVRFX0lSUV9NQVNLCQlCSVQoMSkKKworI2RlZmluZSBDVExJX0lOVENOVF9ESVMJCSgwIDw8IDEpCisjZGVmaW5lIENUTElfSU5UQ05UX05FCQkoMSA8PCAxKQorI2RlZmluZSBDVExJX0lOVENOVF9QRQkJKDIgPDwgMSkKKyNkZWZpbmUgQ1RMSV9JTlRDTlRfQkUJCSgzIDw8IDEpCisKKyNkZWZpbmUgQ1RMT19ESVJfSU4JCSgwIDw8IDUpCisjZGVmaW5lIENUTE9fRElSX09VVAkJKDEgPDwgNSkKKworI2RlZmluZSBDVExPX0RSVl9NQVNLCQkoMSA8PCA0KQorI2RlZmluZSBDVExPX0RSVl9PRAkJKDAgPDwgNCkKKyNkZWZpbmUgQ1RMT19EUlZfQ01PUwkJKDEgPDwgNCkKKworI2RlZmluZSBDVExPX0RSVl9SRU4JCSgxIDw8IDMpCisKKyNkZWZpbmUgQ1RMT19SVkFMXzJLRE9XTgkoMCA8PCAxKQorI2RlZmluZSBDVExPX1JWQUxfMktVUAkJKDEgPDwgMSkKKyNkZWZpbmUgQ1RMT19SVkFMXzUwS0RPV04JKDIgPDwgMSkKKyNkZWZpbmUgQ1RMT19SVkFMXzUwS1VQCQkoMyA8PCAxKQorCisjZGVmaW5lIENUTE9fSU5QVVRfU0VUCShDVExPX0RSVl9DTU9TIHwgQ1RMT19EUlZfUkVOIHwgQ1RMT19SVkFMXzJLVVApCisjZGVmaW5lIENUTE9fT1VUUFVUX1NFVAkoQ1RMT19ESVJfT1VUIHwgQ1RMT19JTlBVVF9TRVQpCisKK2VudW0gY3RybF9yZWdpc3RlciB7CisJQ1RSTF9JTiwKKwlDVFJMX09VVCwKK307CisKKy8qCisgKiBzdHJ1Y3Qgd2NvdmVfZ3BpbyAtIFdoaXNrZXkgQ292ZSBHUElPIGNvbnRyb2xsZXIKKyAqIEBidXNsb2NrOiBmb3IgYnVzIGxvY2svc3luYyBhbmQgdW5sb2NrLgorICogQGNoaXA6IHRoZSBhYnN0cmFjdCBncGlvX2NoaXAgc3RydWN0dXJlLgorICogQGRldjogdGhlIGdwaW8gZGV2aWNlCisgKiBAcmVnbWFwOiB0aGUgcmVnbWFwIGZyb20gdGhlIHBhcmVudCBkZXZpY2UuCisgKiBAcmVnbWFwX2lycV9jaGlwOiB0aGUgcmVnbWFwIG9mIHRoZSBncGlvIGlycSBjaGlwLgorICogQHVwZGF0ZTogcGVuZGluZyBJUlEgc2V0dGluZyB1cGRhdGUsIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGNoaXAgdXBvbiB1bmxvY2suCisgKiBAaW50Y250OiB0aGUgSW50ZXJydXB0IERldGVjdCB2YWx1ZSB0byBiZSB3cml0dGVuLgorICogQHNldF9pcnFfbWFzazogdHJ1ZSBpZiB0aGUgSVJRIG1hc2sgbmVlZHMgdG8gYmUgc2V0LCBmYWxzZSB0byBjbGVhci4KKyAqLworc3RydWN0IHdjb3ZlX2dwaW8geworCXN0cnVjdCBtdXRleCBidXNsb2NrOworCXN0cnVjdCBncGlvX2NoaXAgY2hpcDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCXN0cnVjdCByZWdtYXBfaXJxX2NoaXBfZGF0YSAqcmVnbWFwX2lycV9jaGlwOworCWludCB1cGRhdGU7CisJaW50IGludGNudDsKKwlib29sIHNldF9pcnFfbWFzazsKK307CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHRvX3JlZyhpbnQgZ3BpbywgZW51bSBjdHJsX3JlZ2lzdGVyIHJlZ190eXBlKQoreworCXVuc2lnbmVkIGludCByZWc7CisJaW50IGJhbms7CisKKwlpZiAoZ3BpbyA8IEJBTkswX05SX1BJTlMpCisJCWJhbmsgPSAwOworCWVsc2UgaWYgKGdwaW8gPCBCQU5LMF9OUl9QSU5TICsgQkFOSzFfTlJfUElOUykKKwkJYmFuayA9IDE7CisJZWxzZQorCQliYW5rID0gMjsKKworCWlmIChyZWdfdHlwZSA9PSBDVFJMX0lOKQorCQlyZWcgPSBHUElPX0lOX0NUUkxfQkFTRSArIGJhbms7CisJZWxzZQorCQlyZWcgPSBHUElPX09VVF9DVFJMX0JBU0UgKyBiYW5rOworCisJcmV0dXJuIHJlZzsKK30KKworc3RhdGljIHZvaWQgd2NvdmVfdXBkYXRlX2lycV9tYXNrKHN0cnVjdCB3Y292ZV9ncGlvICp3ZywgaW50IGdwaW8pCit7CisJdW5zaWduZWQgaW50IHJlZywgbWFzazsKKworCWlmIChncGlvIDwgR1JPVVAwX05SX0lSUVMpIHsKKwkJcmVnID0gSVJRX01BU0tfQkFTRTsKKwkJbWFzayA9IEJJVChncGlvICUgR1JPVVAwX05SX0lSUVMpOworCX0gZWxzZSB7CisJCXJlZyA9IElSUV9NQVNLX0JBU0UgKyAxOworCQltYXNrID0gQklUKChncGlvIC0gR1JPVVAwX05SX0lSUVMpICUgR1JPVVAxX05SX0lSUVMpOworCX0KKworCWlmICh3Zy0+c2V0X2lycV9tYXNrKQorCQlyZWdtYXBfdXBkYXRlX2JpdHMod2ctPnJlZ21hcCwgcmVnLCBtYXNrLCBtYXNrKTsKKwllbHNlCisJCXJlZ21hcF91cGRhdGVfYml0cyh3Zy0+cmVnbWFwLCByZWcsIG1hc2ssIDApOworfQorCitzdGF0aWMgdm9pZCB3Y292ZV91cGRhdGVfaXJxX2N0cmwoc3RydWN0IHdjb3ZlX2dwaW8gKndnLCBpbnQgZ3BpbykKK3sKKwl1bnNpZ25lZCBpbnQgcmVnID0gdG9fcmVnKGdwaW8sIENUUkxfSU4pOworCisJcmVnbWFwX3VwZGF0ZV9iaXRzKHdnLT5yZWdtYXAsIHJlZywgQ1RMSV9JTlRDTlRfQkUsIHdnLT5pbnRjbnQpOworfQorCitzdGF0aWMgaW50IHdjb3ZlX2dwaW9fZGlyX2luKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBncGlvKQoreworCXN0cnVjdCB3Y292ZV9ncGlvICp3ZyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCisJcmV0dXJuIHJlZ21hcF93cml0ZSh3Zy0+cmVnbWFwLCB0b19yZWcoZ3BpbywgQ1RSTF9PVVQpLAorCQkJICAgIENUTE9fSU5QVVRfU0VUKTsKK30KKworc3RhdGljIGludCB3Y292ZV9ncGlvX2Rpcl9vdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IGdwaW8sCisJCQkJICAgIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgd2NvdmVfZ3BpbyAqd2cgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKworCXJldHVybiByZWdtYXBfd3JpdGUod2ctPnJlZ21hcCwgdG9fcmVnKGdwaW8sIENUUkxfT1VUKSwKKwkJCSAgICBDVExPX09VVFBVVF9TRVQgfCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgd2NvdmVfZ3Bpb19nZXRfZGlyZWN0aW9uKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBncGlvKQoreworCXN0cnVjdCB3Y292ZV9ncGlvICp3ZyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IHJldDsKKworCXJldCA9IHJlZ21hcF9yZWFkKHdnLT5yZWdtYXAsIHRvX3JlZyhncGlvLCBDVFJMX09VVCksICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gISh2YWwgJiBDVExPX0RJUl9PVVQpOworfQorCitzdGF0aWMgaW50IHdjb3ZlX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBncGlvKQoreworCXN0cnVjdCB3Y292ZV9ncGlvICp3ZyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IHJldDsKKworCXJldCA9IHJlZ21hcF9yZWFkKHdnLT5yZWdtYXAsIHRvX3JlZyhncGlvLCBDVFJMX0lOKSwgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiB2YWwgJiAweDE7Cit9CisKK3N0YXRpYyB2b2lkIHdjb3ZlX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJIHVuc2lnbmVkIGludCBncGlvLCBpbnQgdmFsdWUpCit7CisJc3RydWN0IHdjb3ZlX2dwaW8gKndnID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisKKwlpZiAodmFsdWUpCisJCXJlZ21hcF91cGRhdGVfYml0cyh3Zy0+cmVnbWFwLCB0b19yZWcoZ3BpbywgQ1RSTF9PVVQpLCAxLCAxKTsKKwllbHNlCisJCXJlZ21hcF91cGRhdGVfYml0cyh3Zy0+cmVnbWFwLCB0b19yZWcoZ3BpbywgQ1RSTF9PVVQpLCAxLCAwKTsKK30KKworc3RhdGljIGludCB3Y292ZV9ncGlvX3NldF9zaW5nbGVfZW5kZWQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwkJCQkJdW5zaWduZWQgaW50IGdwaW8sCisJCQkJCWVudW0gc2luZ2xlX2VuZGVkX21vZGUgbW9kZSkKK3sKKwlzdHJ1Y3Qgd2NvdmVfZ3BpbyAqd2cgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgTElORV9NT0RFX09QRU5fRFJBSU46CisJCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMod2ctPnJlZ21hcCwgdG9fcmVnKGdwaW8sIENUUkxfT1VUKSwKKwkJCQkJCUNUTE9fRFJWX01BU0ssIENUTE9fRFJWX09EKTsKKwljYXNlIExJTkVfTU9ERV9QVVNIX1BVTEw6CisJCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMod2ctPnJlZ21hcCwgdG9fcmVnKGdwaW8sIENUUkxfT1VUKSwKKwkJCQkJCUNUTE9fRFJWX01BU0ssIENUTE9fRFJWX0NNT1MpOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAtRU5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbnQgd2NvdmVfaXJxX3R5cGUoc3RydWN0IGlycV9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisJc3RydWN0IHdjb3ZlX2dwaW8gKndnID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElSUV9UWVBFX05PTkU6CisJCXdnLT5pbnRjbnQgPSBDVExJX0lOVENOVF9ESVM7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfRURHRV9CT1RIOgorCQl3Zy0+aW50Y250ID0gQ1RMSV9JTlRDTlRfQkU7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfRURHRV9SSVNJTkc6CisJCXdnLT5pbnRjbnQgPSBDVExJX0lOVENOVF9QRTsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9FREdFX0ZBTExJTkc6CisJCXdnLT5pbnRjbnQgPSBDVExJX0lOVENOVF9ORTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd2ctPnVwZGF0ZSB8PSBVUERBVEVfSVJRX1RZUEU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgd2NvdmVfYnVzX2xvY2soc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBncGlvX2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwlzdHJ1Y3Qgd2NvdmVfZ3BpbyAqd2cgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKworCW11dGV4X2xvY2soJndnLT5idXNsb2NrKTsKK30KKworc3RhdGljIHZvaWQgd2NvdmVfYnVzX3N5bmNfdW5sb2NrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisJc3RydWN0IHdjb3ZlX2dwaW8gKndnID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisJaW50IGdwaW8gPSBkYXRhLT5od2lycTsKKworCWlmICh3Zy0+dXBkYXRlICYgVVBEQVRFX0lSUV9UWVBFKQorCQl3Y292ZV91cGRhdGVfaXJxX2N0cmwod2csIGdwaW8pOworCWlmICh3Zy0+dXBkYXRlICYgVVBEQVRFX0lSUV9NQVNLKQorCQl3Y292ZV91cGRhdGVfaXJxX21hc2sod2csIGdwaW8pOworCXdnLT51cGRhdGUgPSAwOworCisJbXV0ZXhfdW5sb2NrKCZ3Zy0+YnVzbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHdjb3ZlX2lycV91bm1hc2soc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBncGlvX2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwlzdHJ1Y3Qgd2NvdmVfZ3BpbyAqd2cgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKworCXdnLT5zZXRfaXJxX21hc2sgPSBmYWxzZTsKKwl3Zy0+dXBkYXRlIHw9IFVQREFURV9JUlFfTUFTSzsKK30KKworc3RhdGljIHZvaWQgd2NvdmVfaXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBncGlvX2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwlzdHJ1Y3Qgd2NvdmVfZ3BpbyAqd2cgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKworCXdnLT5zZXRfaXJxX21hc2sgPSB0cnVlOworCXdnLT51cGRhdGUgfD0gVVBEQVRFX0lSUV9NQVNLOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHdjb3ZlX2lycWNoaXAgPSB7CisJLm5hbWUJCQk9ICJXaGlza2V5IENvdmUiLAorCS5pcnFfbWFzawkJPSB3Y292ZV9pcnFfbWFzaywKKwkuaXJxX3VubWFzawkJPSB3Y292ZV9pcnFfdW5tYXNrLAorCS5pcnFfc2V0X3R5cGUJCT0gd2NvdmVfaXJxX3R5cGUsCisJLmlycV9idXNfbG9jawkJPSB3Y292ZV9idXNfbG9jaywKKwkuaXJxX2J1c19zeW5jX3VubG9jawk9IHdjb3ZlX2J1c19zeW5jX3VubG9jaywKK307CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3Y292ZV9ncGlvX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHdjb3ZlX2dwaW8gKndnID0gKHN0cnVjdCB3Y292ZV9ncGlvICopZGF0YTsKKwl1bnNpZ25lZCBpbnQgcGVuZGluZywgdmlycSwgZ3BpbywgbWFzaywgb2Zmc2V0OworCXU4IHBbMl07CisKKwlpZiAocmVnbWFwX2J1bGtfcmVhZCh3Zy0+cmVnbWFwLCBJUlFfU1RBVFVTX0JBU0UsIHAsIDIpKSB7CisJCWRldl9lcnIod2ctPmRldiwgIkZhaWxlZCB0byByZWFkIGlycSBzdGF0dXMgcmVnaXN0ZXJcbiIpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJcGVuZGluZyA9IHBbMF0gfCAocFsxXSA8PCA4KTsKKwlpZiAoIXBlbmRpbmcpCisJCXJldHVybiBJUlFfTk9ORTsKKworCS8qIEl0ZXJhdGUgdW50aWwgbm8gaW50ZXJydXB0IGlzIHBlbmRpbmcgKi8KKwl3aGlsZSAocGVuZGluZykgeworCQkvKiBPbmUgaXRlcmF0aW9uIGlzIGZvciBhbGwgcGVuZGluZyBiaXRzICovCisJCWZvcl9lYWNoX3NldF9iaXQoZ3BpbywgKGNvbnN0IHVuc2lnbmVkIGxvbmcgKikmcGVuZGluZywKKwkJCQkJCSBHUk9VUDBfTlJfSVJRUykgeworCQkJb2Zmc2V0ID0gKGdwaW8gPiBHUk9VUDBfTlJfSVJRUykgPyAxIDogMDsKKwkJCW1hc2sgPSAob2Zmc2V0ID09IDEpID8gQklUKGdwaW8gLSBHUk9VUDBfTlJfSVJRUykgOgorCQkJCQkJCQlCSVQoZ3Bpbyk7CisJCQl2aXJxID0gaXJxX2ZpbmRfbWFwcGluZyh3Zy0+Y2hpcC5pcnFkb21haW4sIGdwaW8pOworCQkJaGFuZGxlX25lc3RlZF9pcnEodmlycSk7CisJCQlyZWdtYXBfdXBkYXRlX2JpdHMod2ctPnJlZ21hcCwgSVJRX1NUQVRVU19CQVNFICsgb2Zmc2V0LAorCQkJCQkJCQltYXNrLCBtYXNrKTsKKwkJfQorCisJCS8qIE5leHQgaXRlcmF0aW9uICovCisJCWlmIChyZWdtYXBfYnVsa19yZWFkKHdnLT5yZWdtYXAsIElSUV9TVEFUVVNfQkFTRSwgcCwgMikpIHsKKwkJCWRldl9lcnIod2ctPmRldiwgIkZhaWxlZCB0byByZWFkIGlycSBzdGF0dXNcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQlwZW5kaW5nID0gcFswXSB8IChwWzFdIDw8IDgpOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgd2NvdmVfZ3Bpb19kYmdfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCisJCQkJICAgICAgc3RydWN0IGdwaW9fY2hpcCAqY2hpcCkKK3sKKwl1bnNpZ25lZCBpbnQgY3RsbywgY3RsaSwgaXJxX21hc2ssIGlycV9zdGF0dXM7CisJc3RydWN0IHdjb3ZlX2dwaW8gKndnID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisJaW50IGdwaW8sIG9mZnNldCwgZ3JvdXAsIHJldCA9IDA7CisKKwlmb3IgKGdwaW8gPSAwOyBncGlvIDwgV0NPVkVfR1BJT19OVU07IGdwaW8rKykgeworCQlncm91cCA9IGdwaW8gPCBHUk9VUDBfTlJfSVJRUyA/IDAgOiAxOworCQlyZXQgKz0gcmVnbWFwX3JlYWQod2ctPnJlZ21hcCwgdG9fcmVnKGdwaW8sIENUUkxfT1VUKSwgJmN0bG8pOworCQlyZXQgKz0gcmVnbWFwX3JlYWQod2ctPnJlZ21hcCwgdG9fcmVnKGdwaW8sIENUUkxfSU4pLCAmY3RsaSk7CisJCXJldCArPSByZWdtYXBfcmVhZCh3Zy0+cmVnbWFwLCBJUlFfTUFTS19CQVNFICsgZ3JvdXAsCisJCQkJCQkJJmlycV9tYXNrKTsKKwkJcmV0ICs9IHJlZ21hcF9yZWFkKHdnLT5yZWdtYXAsIElSUV9TVEFUVVNfQkFTRSArIGdyb3VwLAorCQkJCQkJCSZpcnFfc3RhdHVzKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCJGYWlsZWQgdG8gcmVhZCByZWdpc3RlcnM6IGN0cmwgb3V0L2luIG9yIGlycSBzdGF0dXMvbWFza1xuIik7CisJCQlicmVhazsKKwkJfQorCisJCW9mZnNldCA9IGdwaW8gJSA4OworCQlzZXFfcHJpbnRmKHMsICIgZ3Bpby0lLTJkICVzICVzICVzICVzIGN0bG89JTJ4LCVzICVzXG4iLAorCQkJICAgZ3BpbywgY3RsbyAmIENUTE9fRElSX09VVCA/ICJvdXQiIDogImluICIsCisJCQkgICBjdGxpICYgMHgxID8gImhpIiA6ICJsbyIsCisJCQkgICBjdGxpICYgQ1RMSV9JTlRDTlRfTkUgPyAiZmFsbCIgOiAiICAgICIsCisJCQkgICBjdGxpICYgQ1RMSV9JTlRDTlRfUEUgPyAicmlzZSIgOiAiICAgICIsCisJCQkgICBjdGxvLAorCQkJICAgaXJxX21hc2sgJiBCSVQob2Zmc2V0KSA/ICJtYXNrICAiIDogInVubWFzayIsCisJCQkgICBpcnFfc3RhdHVzICYgQklUKG9mZnNldCkgPyAicGVuZGluZyIgOiAiICAgICAgICIpOworCX0KK30KKworc3RhdGljIGludCB3Y292ZV9ncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGludGVsX3NvY19wbWljICpwbWljOworCXN0cnVjdCB3Y292ZV9ncGlvICp3ZzsKKwlpbnQgdmlycSwgcmV0LCBpcnE7CisJc3RydWN0IGRldmljZSAqZGV2OworCisJLyoKKwkgKiBUaGlzIGdwaW8gcGxhdGZvcm0gZGV2aWNlIGlzIGNyZWF0ZWQgYnkgYSBtZmQgZGV2aWNlIChzZWUKKwkgKiBkcml2ZXJzL21mZC9pbnRlbF9zb2NfcG1pY19ieHR3Yy5jIGZvciBkZXRhaWxzKS4gSW5mb3JtYXRpb24KKwkgKiBzaGFyZWQgYnkgYWxsIHN1Yi1kZXZpY2VzIGNyZWF0ZWQgYnkgdGhlIG1mZCBkZXZpY2UsIHRoZSByZWdtYXAKKwkgKiBwb2ludGVyIGZvciBpbnN0YW5jZSwgaXMgc3RvcmVkIGFzIGRyaXZlciBkYXRhIG9mIHRoZSBtZmQgZGV2aWNlCisJICogZHJpdmVyLgorCSAqLworCXBtaWMgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJaWYgKCFwbWljKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycSA8IDApCisJCXJldHVybiBpcnE7CisKKwlkZXYgPSAmcGRldi0+ZGV2OworCisJd2cgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKndnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF3ZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3Zy0+cmVnbWFwX2lycV9jaGlwID0gcG1pYy0+aXJxX2NoaXBfZGF0YV9sZXZlbDI7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB3Zyk7CisKKwltdXRleF9pbml0KCZ3Zy0+YnVzbG9jayk7CisJd2ctPmNoaXAubGFiZWwgPSBLQlVJTERfTU9ETkFNRTsKKwl3Zy0+Y2hpcC5kaXJlY3Rpb25faW5wdXQgPSB3Y292ZV9ncGlvX2Rpcl9pbjsKKwl3Zy0+Y2hpcC5kaXJlY3Rpb25fb3V0cHV0ID0gd2NvdmVfZ3Bpb19kaXJfb3V0OworCXdnLT5jaGlwLmdldF9kaXJlY3Rpb24gPSB3Y292ZV9ncGlvX2dldF9kaXJlY3Rpb247CisJd2ctPmNoaXAuZ2V0ID0gd2NvdmVfZ3Bpb19nZXQ7CisJd2ctPmNoaXAuc2V0ID0gd2NvdmVfZ3Bpb19zZXQ7CisJd2ctPmNoaXAuc2V0X3NpbmdsZV9lbmRlZCA9IHdjb3ZlX2dwaW9fc2V0X3NpbmdsZV9lbmRlZCwKKwl3Zy0+Y2hpcC5iYXNlID0gLTE7CisJd2ctPmNoaXAubmdwaW8gPSBXQ09WRV9WR1BJT19OVU07CisJd2ctPmNoaXAuY2FuX3NsZWVwID0gdHJ1ZTsKKwl3Zy0+Y2hpcC5wYXJlbnQgPSBwZGV2LT5kZXYucGFyZW50OworCXdnLT5jaGlwLmRiZ19zaG93ID0gd2NvdmVfZ3Bpb19kYmdfc2hvdzsKKwl3Zy0+ZGV2ID0gZGV2OworCXdnLT5yZWdtYXAgPSBwbWljLT5yZWdtYXA7CisKKwlyZXQgPSBkZXZtX2dwaW9jaGlwX2FkZF9kYXRhKGRldiwgJndnLT5jaGlwLCB3Zyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBhZGQgZ3Bpb2NoaXA6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGdwaW9jaGlwX2lycWNoaXBfYWRkKCZ3Zy0+Y2hpcCwgJndjb3ZlX2lycWNoaXAsIDAsCisJCQkgICAgIGhhbmRsZV9zaW1wbGVfaXJxLCBJUlFfVFlQRV9OT05FKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGFkZCBpcnFjaGlwOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl2aXJxID0gcmVnbWFwX2lycV9nZXRfdmlycSh3Zy0+cmVnbWFwX2lycV9jaGlwLCBpcnEpOworCWlmICh2aXJxIDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBnZXQgdmlycSBieSBpcnEgJWRcbiIsIGlycSk7CisJCXJldHVybiB2aXJxOworCX0KKworCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoZGV2LCB2aXJxLCBOVUxMLAorCQl3Y292ZV9ncGlvX2lycV9oYW5kbGVyLCBJUlFGX09ORVNIT1QsIHBkZXYtPm5hbWUsIHdnKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgaXJxICVkXG4iLCB2aXJxKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdoaXNrZXkgQ292ZSBQTUlDIGl0c2VsZiBpcyBhIGFuYWxvZyBkZXZpY2UoYnV0IHdpdGggZGlnaXRhbCBjb250cm9sCisgKiBpbnRlcmZhY2UpIHByb3ZpZGluZyBwb3dlciBtYW5hZ2VtZW50IHN1cHBvcnQgZm9yIG90aGVyIGRldmljZXMgaW4KKyAqIHRoZSBhY2NvbXBhbmllZCBTb0MsIHNvIHdlIGhhdmUgbm8gLnBtIGZvciBXaGlza2V5IENvdmUgR1BJTyBkcml2ZXIuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHdjb3ZlX2dwaW9fZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImJ4dF93Y292ZV9ncGlvIiwKKwl9LAorCS5wcm9iZSA9IHdjb3ZlX2dwaW9fcHJvYmUsCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHdjb3ZlX2dwaW9fZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiQWpheSBUaG9tYXMgPGFqYXkudGhvbWFzLmRhdmlkLnJhamFtYW5pY2thbUBpbnRlbC5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJCaW4gR2FvIDxiaW4uZ2FvQGludGVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgV2hpc2tleSBDb3ZlIEdQSU8gRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmJ4dF93Y292ZV9ncGlvIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby13bTgzMXguYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXdtODMxeC5jCmluZGV4IDIxZjk3YmMuLjUzMzcwN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXdtODMxeC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXdtODMxeC5jCkBAIC0yNDcsNyArMjQ3LDcgQEAKICNkZWZpbmUgd204MzF4X2dwaW9fZGJnX3Nob3cgTlVMTAogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0gewogCS5sYWJlbAkJCT0gIndtODMxeCIsCiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkuZGlyZWN0aW9uX2lucHV0CT0gd204MzF4X2dwaW9fZGlyZWN0aW9uX2luLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8td204MzUwLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby13bTgzNTAuYwppbmRleCBlOTc2NTcwLi5lNDY3NTJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby13bTgzNTAuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby13bTgzNTAuYwpAQCAtOTMsNyArOTMsNyBAQAogCXJldHVybiB3bTgzNTAtPmlycV9iYXNlICsgV004MzUwX0lSUV9HUElPKG9mZnNldCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0gewogCS5sYWJlbAkJCT0gIndtODM1MCIsCiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkuZGlyZWN0aW9uX2lucHV0CT0gd204MzUwX2dwaW9fZGlyZWN0aW9uX2luLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8td204OTk0LmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby13bTg5OTQuYwppbmRleCAyNDU3YWFjLi42ODQxMGZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby13bTg5OTQuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby13bTg5OTQuYwpAQCAtMjQ5LDcgKzI0OSw3IEBACiAjZGVmaW5lIHdtODk5NF9ncGlvX2RiZ19zaG93IE5VTEwKICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2NoaXAgdGVtcGxhdGVfY2hpcCA9IHsKIAkubGFiZWwJCQk9ICJ3bTg5OTQiLAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLnJlcXVlc3QJCT0gd204OTk0X2dwaW9fcmVxdWVzdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXp5bnEuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXp5bnEuYwppbmRleCBlNzI3OTRlLi42YjRkMTBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby16eW5xLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tenlucS5jCkBAIC05Niw2ICs5Niw5IEBACiAvKiBHUElPIHVwcGVyIDE2IGJpdCBtYXNrICovCiAjZGVmaW5lIFpZTlFfR1BJT19VUFBFUl9NQVNLIDB4RkZGRjAwMDAKIAorLyogRm9yIEdQSU8gcXVpcmtzICovCisjZGVmaW5lIFpZTlFfR1BJT19RVUlSS19GT08JQklUKDApCisKIC8qKgogICogc3RydWN0IHp5bnFfZ3BpbyAtIGdwaW8gZGV2aWNlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKICAqIEBjaGlwOglpbnN0YW5jZSBvZiB0aGUgZ3Bpb19jaGlwCkBAIC0xMjIsNiArMTI1LDcgQEAKICovCiBzdHJ1Y3QgenlucV9wbGF0Zm9ybV9kYXRhIHsKIAljb25zdCBjaGFyICpsYWJlbDsKKwl1MzIgcXVpcmtzOwogCXUxNiBuZ3BpbzsKIAlpbnQgbWF4X2Jhbms7CiAJaW50IGJhbmtfbWluW1pZTlFNUF9HUElPX01BWF9CQU5LXTsKQEAgLTIzOCwxMyArMjQyLDE5IEBACiBzdGF0aWMgaW50IHp5bnFfZ3Bpb19kaXJfaW4oc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IHBpbikKIHsKIAl1MzIgcmVnOworCWJvb2wgaXNfenlucV9ncGlvOwogCXVuc2lnbmVkIGludCBiYW5rX251bSwgYmFua19waW5fbnVtOwogCXN0cnVjdCB6eW5xX2dwaW8gKmdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKIAorCWlzX3p5bnFfZ3BpbyA9IGdwaW8tPnBfZGF0YS0+cXVpcmtzICYgWllOUV9HUElPX1FVSVJLX0ZPTzsKIAl6eW5xX2dwaW9fZ2V0X2JhbmtfcGluKHBpbiwgJmJhbmtfbnVtLCAmYmFua19waW5fbnVtLCBncGlvKTsKIAotCS8qIGJhbmsgMCBwaW5zIDcgYW5kIDggYXJlIHNwZWNpYWwgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIGlucHV0cyAqLwotCWlmIChiYW5rX251bSA9PSAwICYmIChiYW5rX3Bpbl9udW0gPT0gNyB8fCBiYW5rX3Bpbl9udW0gPT0gOCkpCisJLyoKKwkgKiBPbiB6eW5xIGJhbmsgMCBwaW5zIDcgYW5kIDggYXJlIHNwZWNpYWwgYW5kIGNhbm5vdCBiZSB1c2VkCisJICogYXMgaW5wdXRzLgorCSAqLworCWlmIChpc196eW5xX2dwaW8gJiYgYmFua19udW0gPT0gMCAmJgorCQkoYmFua19waW5fbnVtID09IDcgfHwgYmFua19waW5fbnVtID09IDgpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIGNsZWFyIHRoZSBiaXQgaW4gZGlyZWN0aW9uIG1vZGUgcmVnIHRvIHNldCB0aGUgcGluIGFzIGlucHV0ICovCkBAIC02MjcsNiArNjM3LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB6eW5xX3BsYXRmb3JtX2RhdGEgenlucV9ncGlvX2RlZiA9IHsKIAkubGFiZWwgPSAienlucV9ncGlvIiwKKwkucXVpcmtzID0gWllOUV9HUElPX1FVSVJLX0ZPTywKIAkubmdwaW8gPSBaWU5RX0dQSU9fTlJfR1BJT1MsCiAJLm1heF9iYW5rID0gWllOUV9HUElPX01BWF9CQU5LLAogCS5iYW5rX21pblswXSA9IFpZTlFfR1BJT19CQU5LMF9QSU5fTUlOKCksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi1hY3BpLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi1hY3BpLmMKaW5kZXggYWY1MTQ2MS4uNThlY2UyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW9saWItYWNwaS5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvbGliLWFjcGkuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvL21hY2hpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0zOTUsNyArMzk2LDcgQEAKIAlpbnQgbjsKIH07CiAKLXN0YXRpYyBpbnQgYWNwaV9maW5kX2dwaW8oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmFyZXMsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGFjcGlfcG9wdWxhdGVfZ3Bpb19sb29rdXAoc3RydWN0IGFjcGlfcmVzb3VyY2UgKmFyZXMsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGFjcGlfZ3Bpb19sb29rdXAgKmxvb2t1cCA9IGRhdGE7CiAKQEAgLTQ0MCw3ICs0NDEsOCBAQAogCiAJSU5JVF9MSVNUX0hFQUQoJnJlc19saXN0KTsKIAotCXJldCA9IGFjcGlfZGV2X2dldF9yZXNvdXJjZXMobG9va3VwLT5hZGV2LCAmcmVzX2xpc3QsIGFjcGlfZmluZF9ncGlvLAorCXJldCA9IGFjcGlfZGV2X2dldF9yZXNvdXJjZXMobG9va3VwLT5hZGV2LCAmcmVzX2xpc3QsCisJCQkJICAgICBhY3BpX3BvcHVsYXRlX2dwaW9fbG9va3VwLAogCQkJCSAgICAgbG9va3VwKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKQEAgLTUxMyw3ICs1MTUsNyBAQAogICogTm90ZTogaWYgdGhlIEdQSU8gcmVzb3VyY2UgaGFzIG11bHRpcGxlIGVudHJpZXMgaW4gdGhlIHBpbiBsaXN0LCB0aGlzCiAgKiBmdW5jdGlvbiBvbmx5IHJldHVybnMgdGhlIGZpcnN0LgogICovCi1zdHJ1Y3QgZ3Bpb19kZXNjICphY3BpX2dldF9ncGlvZF9ieV9pbmRleChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYsCitzdGF0aWMgc3RydWN0IGdwaW9fZGVzYyAqYWNwaV9nZXRfZ3Bpb2RfYnlfaW5kZXgoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2LAogCQkJCQkgIGNvbnN0IGNoYXIgKnByb3BuYW1lLCBpbnQgaW5kZXgsCiAJCQkJCSAgc3RydWN0IGFjcGlfZ3Bpb19pbmZvICppbmZvKQogewpAQCAtNTQ2LDYgKzU0OCw1NSBAQAogCXJldHVybiByZXQgPyBFUlJfUFRSKHJldCkgOiBsb29rdXAuZGVzYzsKIH0KIAorc3RydWN0IGdwaW9fZGVzYyAqYWNwaV9maW5kX2dwaW8oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBjb25zdCBjaGFyICpjb25faWQsCisJCQkJIHVuc2lnbmVkIGludCBpZHgsCisJCQkJIGVudW0gZ3Bpb2RfZmxhZ3MgZmxhZ3MsCisJCQkJIGVudW0gZ3Bpb19sb29rdXBfZmxhZ3MgKmxvb2t1cGZsYWdzKQoreworCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldiA9IEFDUElfQ09NUEFOSU9OKGRldik7CisJc3RydWN0IGFjcGlfZ3Bpb19pbmZvIGluZm87CisJc3RydWN0IGdwaW9fZGVzYyAqZGVzYzsKKwljaGFyIHByb3BuYW1lWzMyXTsKKwlpbnQgaTsKKworCS8qIFRyeSBmaXJzdCBmcm9tIF9EU0QgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShncGlvX3N1ZmZpeGVzKTsgaSsrKSB7CisJCWlmIChjb25faWQgJiYgc3RyY21wKGNvbl9pZCwgImdwaW9zIikpIHsKKwkJCXNucHJpbnRmKHByb3BuYW1lLCBzaXplb2YocHJvcG5hbWUpLCAiJXMtJXMiLAorCQkJCSBjb25faWQsIGdwaW9fc3VmZml4ZXNbaV0pOworCQl9IGVsc2UgeworCQkJc25wcmludGYocHJvcG5hbWUsIHNpemVvZihwcm9wbmFtZSksICIlcyIsCisJCQkJIGdwaW9fc3VmZml4ZXNbaV0pOworCQl9CisKKwkJZGVzYyA9IGFjcGlfZ2V0X2dwaW9kX2J5X2luZGV4KGFkZXYsIHByb3BuYW1lLCBpZHgsICZpbmZvKTsKKwkJaWYgKCFJU19FUlIoZGVzYykgfHwgKFBUUl9FUlIoZGVzYykgPT0gLUVQUk9CRV9ERUZFUikpCisJCQlicmVhazsKKwl9CisKKwkvKiBUaGVuIGZyb20gcGxhaW4gX0NSUyBHUElPcyAqLworCWlmIChJU19FUlIoZGVzYykpIHsKKwkJaWYgKCFhY3BpX2Nhbl9mYWxsYmFja190b19jcnMoYWRldiwgY29uX2lkKSkKKwkJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCisJCWRlc2MgPSBhY3BpX2dldF9ncGlvZF9ieV9pbmRleChhZGV2LCBOVUxMLCBpZHgsICZpbmZvKTsKKwkJaWYgKElTX0VSUihkZXNjKSkKKwkJCXJldHVybiBkZXNjOworCisJCWlmICgoZmxhZ3MgPT0gR1BJT0RfT1VUX0xPVyB8fCBmbGFncyA9PSBHUElPRF9PVVRfSElHSCkgJiYKKwkJICAgIGluZm8uZ3Bpb2ludCkgeworCQkJZGV2X2RiZyhkZXYsICJyZWZ1c2luZyBHcGlvSW50KCkgZW50cnkgd2hlbiBkb2luZyBHUElPRF9PVVRfKiBsb29rdXBcbiIpOworCQkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CisJCX0KKwl9CisKKwlpZiAoaW5mby5wb2xhcml0eSA9PSBHUElPX0FDVElWRV9MT1cpCisJCSpsb29rdXBmbGFncyB8PSBHUElPX0FDVElWRV9MT1c7CisKKwlyZXR1cm4gZGVzYzsKK30KKwogLyoqCiAgKiBhY3BpX25vZGVfZ2V0X2dwaW9kKCkgLSBnZXQgYSBHUElPIGRlc2NyaXB0b3IgZnJvbSBBQ1BJIHJlc291cmNlcwogICogQGZ3bm9kZTogcG9pbnRlciB0byBhbiBBQ1BJIGZpcm13YXJlIG5vZGUgdG8gZ2V0IHRoZSBHUElPIGluZm9ybWF0aW9uIGZyb20KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvbGliLW9mLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi1vZi5jCmluZGV4IDc1ZTdiMzkuLmVjYWQzZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvbGliLW9mLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW9saWItb2YuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pby1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby9jb25zdW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgpAQCAtMTE0LDYgKzExMyw0NSBAQAogfQogRVhQT1JUX1NZTUJPTChvZl9nZXRfbmFtZWRfZ3Bpb19mbGFncyk7CiAKK3N0cnVjdCBncGlvX2Rlc2MgKm9mX2ZpbmRfZ3BpbyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmNvbl9pZCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgaWR4LAorCQkJICAgICAgIGVudW0gZ3Bpb19sb29rdXBfZmxhZ3MgKmZsYWdzKQoreworCWNoYXIgcHJvcF9uYW1lWzMyXTsgLyogMzIgaXMgbWF4IHNpemUgb2YgcHJvcGVydHkgbmFtZSAqLworCWVudW0gb2ZfZ3Bpb19mbGFncyBvZl9mbGFnczsKKwlzdHJ1Y3QgZ3Bpb19kZXNjICpkZXNjOworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZ3Bpb19zdWZmaXhlcyk7IGkrKykgeworCQlpZiAoY29uX2lkKQorCQkJc25wcmludGYocHJvcF9uYW1lLCBzaXplb2YocHJvcF9uYW1lKSwgIiVzLSVzIiwgY29uX2lkLAorCQkJCSBncGlvX3N1ZmZpeGVzW2ldKTsKKwkJZWxzZQorCQkJc25wcmludGYocHJvcF9uYW1lLCBzaXplb2YocHJvcF9uYW1lKSwgIiVzIiwKKwkJCQkgZ3Bpb19zdWZmaXhlc1tpXSk7CisKKwkJZGVzYyA9IG9mX2dldF9uYW1lZF9ncGlvZF9mbGFncyhkZXYtPm9mX25vZGUsIHByb3BfbmFtZSwgaWR4LAorCQkJCQkJJm9mX2ZsYWdzKTsKKwkJaWYgKCFJU19FUlIoZGVzYykgfHwgKFBUUl9FUlIoZGVzYykgIT0gLUVOT0VOVCkpCisJCQlicmVhazsKKwl9CisKKwlpZiAoSVNfRVJSKGRlc2MpKQorCQlyZXR1cm4gZGVzYzsKKworCWlmIChvZl9mbGFncyAmIE9GX0dQSU9fQUNUSVZFX0xPVykKKwkJKmZsYWdzIHw9IEdQSU9fQUNUSVZFX0xPVzsKKworCWlmIChvZl9mbGFncyAmIE9GX0dQSU9fU0lOR0xFX0VOREVEKSB7CisJCWlmIChvZl9mbGFncyAmIE9GX0dQSU9fQUNUSVZFX0xPVykKKwkJCSpmbGFncyB8PSBHUElPX09QRU5fRFJBSU47CisJCWVsc2UKKwkJCSpmbGFncyB8PSBHUElPX09QRU5fU09VUkNFOworCX0KKworCXJldHVybiBkZXNjOworfQorCiAvKioKICAqIG9mX3BhcnNlX293bl9ncGlvKCkgLSBHZXQgYSBHUElPIGhvZyBkZXNjcmlwdG9yLCBuYW1lcyBhbmQgZmxhZ3MgZm9yIEdQSU8gQVBJCiAgKiBAbnA6CQlkZXZpY2Ugbm9kZSB0byBnZXQgR1BJTyBmcm9tCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi1zeXNmcy5jIGIvZHJpdmVycy9ncGlvL2dwaW9saWItc3lzZnMuYwppbmRleCA5MzJlNTEwLi40YjQ0ZGQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi1zeXNmcy5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvbGliLXN5c2ZzLmMKQEAgLTY3MCwxMCArNjcwLDEwIEBACiBFWFBPUlRfU1lNQk9MX0dQTChncGlvZF9leHBvcnRfbGluayk7CiAKIC8qKgotICogZ3Bpb2RfdW5leHBvcnQgLSByZXZlcnNlIGVmZmVjdCBvZiBncGlvX2V4cG9ydCgpCisgKiBncGlvZF91bmV4cG9ydCAtIHJldmVyc2UgZWZmZWN0IG9mIGdwaW9kX2V4cG9ydCgpCiAgKiBAZ3BpbzogZ3BpbyB0byBtYWtlIHVuYXZhaWxhYmxlCiAgKgotICogVGhpcyBpcyBpbXBsaWNpdCBvbiBncGlvX2ZyZWUoKS4KKyAqIFRoaXMgaXMgaW1wbGljaXQgb24gZ3Bpb2RfZnJlZSgpLgogICovCiB2b2lkIGdwaW9kX3VuZXhwb3J0KHN0cnVjdCBncGlvX2Rlc2MgKmRlc2MpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi5jIGIvZHJpdmVycy9ncGlvL2dwaW9saWIuYwppbmRleCA1M2ZmMjVhLi5mMGZjM2EwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvbGliLmMKQEAgLTcxLDYgKzcxLDggQEAKIAogc3RhdGljIHZvaWQgZ3Bpb2NoaXBfZnJlZV9ob2dzKHN0cnVjdCBncGlvX2NoaXAgKmNoaXApOwogc3RhdGljIHZvaWQgZ3Bpb2NoaXBfaXJxY2hpcF9yZW1vdmUoc3RydWN0IGdwaW9fY2hpcCAqZ3Bpb2NoaXApOworc3RhdGljIGludCBncGlvY2hpcF9pcnFjaGlwX2luaXRfdmFsaWRfbWFzayhzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvY2hpcCk7CitzdGF0aWMgdm9pZCBncGlvY2hpcF9pcnFjaGlwX2ZyZWVfdmFsaWRfbWFzayhzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvY2hpcCk7CiAKIHN0YXRpYyBib29sIGdwaW9saWJfaW5pdGlhbGl6ZWQ7CiAKQEAgLTExNjcsNiArMTE2OSwxMCBAQAogCWlmIChzdGF0dXMpCiAJCWdvdG8gZXJyX3JlbW92ZV9mcm9tX2xpc3Q7CiAKKwlzdGF0dXMgPSBncGlvY2hpcF9pcnFjaGlwX2luaXRfdmFsaWRfbWFzayhjaGlwKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGVycl9yZW1vdmVfZnJvbV9saXN0OworCiAJc3RhdHVzID0gb2ZfZ3Bpb2NoaXBfYWRkKGNoaXApOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gZXJyX3JlbW92ZV9jaGlwOwpAQCAtMTE5Miw2ICsxMTk4LDcgQEAKIAlhY3BpX2dwaW9jaGlwX3JlbW92ZShjaGlwKTsKIAlncGlvY2hpcF9mcmVlX2hvZ3MoY2hpcCk7CiAJb2ZfZ3Bpb2NoaXBfcmVtb3ZlKGNoaXApOworCWdwaW9jaGlwX2lycWNoaXBfZnJlZV92YWxpZF9tYXNrKGNoaXApOwogZXJyX3JlbW92ZV9mcm9tX2xpc3Q6CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOwogCWxpc3RfZGVsKCZnZGV2LT5saXN0KTsKQEAgLTEzNjMsMTkgKzEzNzAsMTUgQEAKIAkJCQkJICAgICB2b2lkICpkYXRhKSkKIHsKIAlzdHJ1Y3QgZ3Bpb19kZXZpY2UgKmdkZXY7Ci0Jc3RydWN0IGdwaW9fY2hpcCAqY2hpcDsKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZ2RldiwgJmdwaW9fZGV2aWNlcywgbGlzdCkKLQkJaWYgKGdkZXYtPmNoaXAgJiYgbWF0Y2goZ2Rldi0+Y2hpcCwgZGF0YSkpCisJCWlmIChnZGV2LT5jaGlwICYmIG1hdGNoKGdkZXYtPmNoaXAsIGRhdGEpKSB7CisJCQljaGlwID0gZ2Rldi0+Y2hpcDsKIAkJCWJyZWFrOwotCi0JLyogTm8gbWF0Y2g/ICovCi0JaWYgKCZnZGV2LT5saXN0ID09ICZncGlvX2RldmljZXMpCi0JCWNoaXAgPSBOVUxMOwotCWVsc2UKLQkJY2hpcCA9IGdkZXYtPmNoaXA7CisJCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOwogCkBAIC0xNDAxLDYgKzE0MDQsNDAgQEAKICAqIFRoZSBmb2xsb3dpbmcgaXMgaXJxY2hpcCBoZWxwZXIgY29kZSBmb3IgZ3Bpb2NoaXBzLgogICovCiAKK3N0YXRpYyBpbnQgZ3Bpb2NoaXBfaXJxY2hpcF9pbml0X3ZhbGlkX21hc2soc3RydWN0IGdwaW9fY2hpcCAqZ3Bpb2NoaXApCit7CisJaW50IGk7CisKKwlpZiAoIWdwaW9jaGlwLT5pcnFfbmVlZF92YWxpZF9tYXNrKQorCQlyZXR1cm4gMDsKKworCWdwaW9jaGlwLT5pcnFfdmFsaWRfbWFzayA9IGtjYWxsb2MoQklUU19UT19MT05HUyhncGlvY2hpcC0+bmdwaW8pLAorCQkJCQkgICBzaXplb2YobG9uZyksIEdGUF9LRVJORUwpOworCWlmICghZ3Bpb2NoaXAtPmlycV92YWxpZF9tYXNrKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEFzc3VtZSBieSBkZWZhdWx0IGFsbCBHUElPcyBhcmUgdmFsaWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZ3Bpb2NoaXAtPm5ncGlvOyBpKyspCisJCXNldF9iaXQoaSwgZ3Bpb2NoaXAtPmlycV92YWxpZF9tYXNrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBncGlvY2hpcF9pcnFjaGlwX2ZyZWVfdmFsaWRfbWFzayhzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvY2hpcCkKK3sKKwlrZnJlZShncGlvY2hpcC0+aXJxX3ZhbGlkX21hc2spOworCWdwaW9jaGlwLT5pcnFfdmFsaWRfbWFzayA9IE5VTEw7Cit9CisKK3N0YXRpYyBib29sIGdwaW9jaGlwX2lycWNoaXBfaXJxX3ZhbGlkKGNvbnN0IHN0cnVjdCBncGlvX2NoaXAgKmdwaW9jaGlwLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCS8qIE5vIG1hc2sgbWVhbnMgYWxsIHZhbGlkICovCisJaWYgKGxpa2VseSghZ3Bpb2NoaXAtPmlycV92YWxpZF9tYXNrKSkKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIHRlc3RfYml0KG9mZnNldCwgZ3Bpb2NoaXAtPmlycV92YWxpZF9tYXNrKTsKK30KKwogLyoqCiAgKiBncGlvY2hpcF9zZXRfY2hhaW5lZF9pcnFjaGlwKCkgLSBzZXRzIGEgY2hhaW5lZCBpcnFjaGlwIHRvIGEgZ3Bpb2NoaXAKICAqIEBncGlvY2hpcDogdGhlIGdwaW9jaGlwIHRvIHNldCB0aGUgaXJxY2hpcCBjaGFpbiB0bwpAQCAtMTQ0Miw5ICsxNDc5LDEyIEBACiAJfQogCiAJLyogU2V0IHRoZSBwYXJlbnQgSVJRIGZvciBhbGwgYWZmZWN0ZWQgSVJRcyAqLwotCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZ3Bpb2NoaXAtPm5ncGlvOyBvZmZzZXQrKykKKwlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGdwaW9jaGlwLT5uZ3Bpbzsgb2Zmc2V0KyspIHsKKwkJaWYgKCFncGlvY2hpcF9pcnFjaGlwX2lycV92YWxpZChncGlvY2hpcCwgb2Zmc2V0KSkKKwkJCWNvbnRpbnVlOwogCQlpcnFfc2V0X3BhcmVudChpcnFfZmluZF9tYXBwaW5nKGdwaW9jaGlwLT5pcnFkb21haW4sIG9mZnNldCksCiAJCQkgICAgICAgcGFyZW50X2lycSk7CisJfQogfQogRVhQT1JUX1NZTUJPTF9HUEwoZ3Bpb2NoaXBfc2V0X2NoYWluZWRfaXJxY2hpcCk7CiAKQEAgLTE1NTEsOSArMTU5MSwxMiBAQAogCiAJLyogUmVtb3ZlIGFsbCBJUlEgbWFwcGluZ3MgYW5kIGRlbGV0ZSB0aGUgZG9tYWluICovCiAJaWYgKGdwaW9jaGlwLT5pcnFkb21haW4pIHsKLQkJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBncGlvY2hpcC0+bmdwaW87IG9mZnNldCsrKQorCQlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGdwaW9jaGlwLT5uZ3Bpbzsgb2Zmc2V0KyspIHsKKwkJCWlmICghZ3Bpb2NoaXBfaXJxY2hpcF9pcnFfdmFsaWQoZ3Bpb2NoaXAsIG9mZnNldCkpCisJCQkJY29udGludWU7CiAJCQlpcnFfZGlzcG9zZV9tYXBwaW5nKAogCQkJCWlycV9maW5kX21hcHBpbmcoZ3Bpb2NoaXAtPmlycWRvbWFpbiwgb2Zmc2V0KSk7CisJCX0KIAkJaXJxX2RvbWFpbl9yZW1vdmUoZ3Bpb2NoaXAtPmlycWRvbWFpbik7CiAJfQogCkBAIC0xNTYyLDYgKzE2MDUsOCBAQAogCQlncGlvY2hpcC0+aXJxY2hpcC0+aXJxX3JlbGVhc2VfcmVzb3VyY2VzID0gTlVMTDsKIAkJZ3Bpb2NoaXAtPmlycWNoaXAgPSBOVUxMOwogCX0KKworCWdwaW9jaGlwX2lycWNoaXBfZnJlZV92YWxpZF9tYXNrKGdwaW9jaGlwKTsKIH0KIAogLyoqCkBAIC0xNTk3LDYgKzE2NDIsNyBAQAogCQkJICBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgKmxvY2tfa2V5KQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZTsKKwlib29sIGlycV9iYXNlX3NldCA9IGZhbHNlOwogCXVuc2lnbmVkIGludCBvZmZzZXQ7CiAJdW5zaWduZWQgaXJxX2Jhc2UgPSAwOwogCkBAIC0xNjE3LDYgKzE2NjMsMjAgQEAKIAlpZiAoZ3Bpb2NoaXAtPm9mX25vZGUpCiAJCW9mX25vZGUgPSBncGlvY2hpcC0+b2Zfbm9kZTsKICNlbmRpZgorCS8qCisJICogU3BlY2lmeWluZyBhIGRlZmF1bHQgdHJpZ2dlciBpcyBhIHRlcnJpYmxlIGlkZWEgaWYgRFQgb3IgQUNQSSBpcworCSAqIHVzZWQgdG8gY29uZmlndXJlIHRoZSBpbnRlcnJ1cHRzLCBhcyB5b3UgbWF5IGVuZC11cCB3aXRoCisJICogY29uZmxpY3RpbmcgdHJpZ2dlcnMuIFRlbGwgdGhlIHVzZXIsIGFuZCByZXNldCB0byBOT05FLgorCSAqLworCWlmIChXQVJOKG9mX25vZGUgJiYgdHlwZSAhPSBJUlFfVFlQRV9OT05FLAorCQkgIiVzOiBJZ25vcmluZyAlZCBkZWZhdWx0IHRyaWdnZXJcbiIsIG9mX25vZGUtPmZ1bGxfbmFtZSwgdHlwZSkpCisJCXR5cGUgPSBJUlFfVFlQRV9OT05FOworCWlmIChoYXNfYWNwaV9jb21wYW5pb24oZ3Bpb2NoaXAtPnBhcmVudCkgJiYgdHlwZSAhPSBJUlFfVFlQRV9OT05FKSB7CisJCWFjcGlfaGFuZGxlX3dhcm4oQUNQSV9IQU5ETEUoZ3Bpb2NoaXAtPnBhcmVudCksCisJCQkJICJJZ25vcmluZyAlZCBkZWZhdWx0IHRyaWdnZXJcbiIsIHR5cGUpOworCQl0eXBlID0gSVJRX1RZUEVfTk9ORTsKKwl9CisKIAlncGlvY2hpcC0+aXJxY2hpcCA9IGlycWNoaXA7CiAJZ3Bpb2NoaXAtPmlycV9oYW5kbGVyID0gaGFuZGxlcjsKIAlncGlvY2hpcC0+aXJxX2RlZmF1bHRfdHlwZSA9IHR5cGU7CkBAIC0xNjQ2LDEzICsxNzA2LDE3IEBACiAJICogbmVjZXNzYXJ5IHRvIGFsbG9jYXRlIGRlc2NyaXB0b3JzIGZvciBhbGwgSVJRcy4KIAkgKi8KIAlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGdwaW9jaGlwLT5uZ3Bpbzsgb2Zmc2V0KyspIHsKKwkJaWYgKCFncGlvY2hpcF9pcnFjaGlwX2lycV92YWxpZChncGlvY2hpcCwgb2Zmc2V0KSkKKwkJCWNvbnRpbnVlOwogCQlpcnFfYmFzZSA9IGlycV9jcmVhdGVfbWFwcGluZyhncGlvY2hpcC0+aXJxZG9tYWluLCBvZmZzZXQpOwotCQlpZiAob2Zmc2V0ID09IDApCisJCWlmICghaXJxX2Jhc2Vfc2V0KSB7CiAJCQkvKgogCQkJICogU3RvcmUgdGhlIGJhc2UgaW50byB0aGUgZ3Bpb2NoaXAgdG8gYmUgdXNlZCB3aGVuCiAJCQkgKiB1bm1hcHBpbmcgdGhlIGlycXMuCiAJCQkgKi8KIAkJCWdwaW9jaGlwLT5pcnFfYmFzZSA9IGlycV9iYXNlOworCQkJaXJxX2Jhc2Vfc2V0ID0gdHJ1ZTsKKwkJfQogCX0KIAogCWFjcGlfZ3Bpb2NoaXBfcmVxdWVzdF9pbnRlcnJ1cHRzKGdwaW9jaGlwKTsKQEAgLTE2NjQsNiArMTcyOCwxMiBAQAogI2Vsc2UgLyogQ09ORklHX0dQSU9MSUJfSVJRQ0hJUCAqLwogCiBzdGF0aWMgdm9pZCBncGlvY2hpcF9pcnFjaGlwX3JlbW92ZShzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvY2hpcCkge30KK3N0YXRpYyBpbmxpbmUgaW50IGdwaW9jaGlwX2lycWNoaXBfaW5pdF92YWxpZF9tYXNrKHN0cnVjdCBncGlvX2NoaXAgKmdwaW9jaGlwKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSB2b2lkIGdwaW9jaGlwX2lycWNoaXBfZnJlZV92YWxpZF9tYXNrKHN0cnVjdCBncGlvX2NoaXAgKmdwaW9jaGlwKQoreyB9CiAKICNlbmRpZiAvKiBDT05GSUdfR1BJT0xJQl9JUlFDSElQICovCiAKQEAgLTI4MTMsOTQgKzI4ODMsNiBAQAogCW11dGV4X3VubG9jaygmZ3Bpb19sb29rdXBfbG9jayk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19kZXNjICpvZl9maW5kX2dwaW8oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpjb25faWQsCi0JCQkJICAgICAgdW5zaWduZWQgaW50IGlkeCwKLQkJCQkgICAgICBlbnVtIGdwaW9fbG9va3VwX2ZsYWdzICpmbGFncykKLXsKLQljaGFyIHByb3BfbmFtZVszMl07IC8qIDMyIGlzIG1heCBzaXplIG9mIHByb3BlcnR5IG5hbWUgKi8KLQllbnVtIG9mX2dwaW9fZmxhZ3Mgb2ZfZmxhZ3M7Ci0Jc3RydWN0IGdwaW9fZGVzYyAqZGVzYzsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGdwaW9fc3VmZml4ZXMpOyBpKyspIHsKLQkJaWYgKGNvbl9pZCkKLQkJCXNucHJpbnRmKHByb3BfbmFtZSwgc2l6ZW9mKHByb3BfbmFtZSksICIlcy0lcyIsIGNvbl9pZCwKLQkJCQkgZ3Bpb19zdWZmaXhlc1tpXSk7Ci0JCWVsc2UKLQkJCXNucHJpbnRmKHByb3BfbmFtZSwgc2l6ZW9mKHByb3BfbmFtZSksICIlcyIsCi0JCQkJIGdwaW9fc3VmZml4ZXNbaV0pOwotCi0JCWRlc2MgPSBvZl9nZXRfbmFtZWRfZ3Bpb2RfZmxhZ3MoZGV2LT5vZl9ub2RlLCBwcm9wX25hbWUsIGlkeCwKLQkJCQkJCSZvZl9mbGFncyk7Ci0JCWlmICghSVNfRVJSKGRlc2MpIHx8IChQVFJfRVJSKGRlc2MpICE9IC1FTk9FTlQpKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKElTX0VSUihkZXNjKSkKLQkJcmV0dXJuIGRlc2M7Ci0KLQlpZiAob2ZfZmxhZ3MgJiBPRl9HUElPX0FDVElWRV9MT1cpCi0JCSpmbGFncyB8PSBHUElPX0FDVElWRV9MT1c7Ci0KLQlpZiAob2ZfZmxhZ3MgJiBPRl9HUElPX1NJTkdMRV9FTkRFRCkgewotCQlpZiAob2ZfZmxhZ3MgJiBPRl9HUElPX0FDVElWRV9MT1cpCi0JCQkqZmxhZ3MgfD0gR1BJT19PUEVOX0RSQUlOOwotCQllbHNlCi0JCQkqZmxhZ3MgfD0gR1BJT19PUEVOX1NPVVJDRTsKLQl9Ci0KLQlyZXR1cm4gZGVzYzsKLX0KLQotc3RhdGljIHN0cnVjdCBncGlvX2Rlc2MgKmFjcGlfZmluZF9ncGlvKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJY29uc3QgY2hhciAqY29uX2lkLAotCQkJCQl1bnNpZ25lZCBpbnQgaWR4LAotCQkJCQllbnVtIGdwaW9kX2ZsYWdzIGZsYWdzLAotCQkJCQllbnVtIGdwaW9fbG9va3VwX2ZsYWdzICpsb29rdXBmbGFncykKLXsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYgPSBBQ1BJX0NPTVBBTklPTihkZXYpOwotCXN0cnVjdCBhY3BpX2dwaW9faW5mbyBpbmZvOwotCXN0cnVjdCBncGlvX2Rlc2MgKmRlc2M7Ci0JY2hhciBwcm9wbmFtZVszMl07Ci0JaW50IGk7Ci0KLQkvKiBUcnkgZmlyc3QgZnJvbSBfRFNEICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZ3Bpb19zdWZmaXhlcyk7IGkrKykgewotCQlpZiAoY29uX2lkICYmIHN0cmNtcChjb25faWQsICJncGlvcyIpKSB7Ci0JCQlzbnByaW50Zihwcm9wbmFtZSwgc2l6ZW9mKHByb3BuYW1lKSwgIiVzLSVzIiwKLQkJCQkgY29uX2lkLCBncGlvX3N1ZmZpeGVzW2ldKTsKLQkJfSBlbHNlIHsKLQkJCXNucHJpbnRmKHByb3BuYW1lLCBzaXplb2YocHJvcG5hbWUpLCAiJXMiLAotCQkJCSBncGlvX3N1ZmZpeGVzW2ldKTsKLQkJfQotCi0JCWRlc2MgPSBhY3BpX2dldF9ncGlvZF9ieV9pbmRleChhZGV2LCBwcm9wbmFtZSwgaWR4LCAmaW5mbyk7Ci0JCWlmICghSVNfRVJSKGRlc2MpIHx8IChQVFJfRVJSKGRlc2MpID09IC1FUFJPQkVfREVGRVIpKQotCQkJYnJlYWs7Ci0JfQotCi0JLyogVGhlbiBmcm9tIHBsYWluIF9DUlMgR1BJT3MgKi8KLQlpZiAoSVNfRVJSKGRlc2MpKSB7Ci0JCWlmICghYWNwaV9jYW5fZmFsbGJhY2tfdG9fY3JzKGFkZXYsIGNvbl9pZCkpCi0JCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKLQotCQlkZXNjID0gYWNwaV9nZXRfZ3Bpb2RfYnlfaW5kZXgoYWRldiwgTlVMTCwgaWR4LCAmaW5mbyk7Ci0JCWlmIChJU19FUlIoZGVzYykpCi0JCQlyZXR1cm4gZGVzYzsKLQotCQlpZiAoKGZsYWdzID09IEdQSU9EX09VVF9MT1cgfHwgZmxhZ3MgPT0gR1BJT0RfT1VUX0hJR0gpICYmCi0JCSAgICBpbmZvLmdwaW9pbnQpIHsKLQkJCWRldl9kYmcoZGV2LCAicmVmdXNpbmcgR3Bpb0ludCgpIGVudHJ5IHdoZW4gZG9pbmcgR1BJT0RfT1VUXyogbG9va3VwXG4iKTsKLQkJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOwotCQl9Ci0JfQotCi0JaWYgKGluZm8ucG9sYXJpdHkgPT0gR1BJT19BQ1RJVkVfTE9XKQotCQkqbG9va3VwZmxhZ3MgfD0gR1BJT19BQ1RJVkVfTE9XOwotCi0JcmV0dXJuIGRlc2M7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgZ3Bpb2RfbG9va3VwX3RhYmxlICpncGlvZF9maW5kX2xvb2t1cF90YWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJY29uc3QgY2hhciAqZGV2X2lkID0gZGV2ID8gZGV2X25hbWUoZGV2KSA6IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi5oIGIvZHJpdmVycy9ncGlvL2dwaW9saWIuaAppbmRleCAyZDllYTVlLi4zNDZmYmRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi5oCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvbGliLmgKQEAgLTIwLDYgKzIwLDcgQEAKIAogZW51bSBvZl9ncGlvX2ZsYWdzOwogZW51bSBncGlvZF9mbGFnczsKK2VudW0gZ3Bpb19sb29rdXBfZmxhZ3M7CiBzdHJ1Y3QgYWNwaV9kZXZpY2U7CiAKIC8qKgpAQCAtODYsNiArODcsMzIgQEAKIC8qIGdwaW8gc3VmZml4ZXMgdXNlZCBmb3IgQUNQSSBhbmQgZGV2aWNlIHRyZWUgbG9va3VwICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdwaW9fc3VmZml4ZXNbXSA9IHsgImdwaW9zIiwgImdwaW8iIH07CiAKKyNpZmRlZiBDT05GSUdfT0ZfR1BJTworc3RydWN0IGdwaW9fZGVzYyAqb2ZfZmluZF9ncGlvKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgICBjb25zdCBjaGFyICpjb25faWQsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGlkeCwKKwkJCSAgICAgICBlbnVtIGdwaW9fbG9va3VwX2ZsYWdzICpmbGFncyk7CitzdHJ1Y3QgZ3Bpb19kZXNjICpvZl9nZXRfbmFtZWRfZ3Bpb2RfZmxhZ3Moc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJICAgY29uc3QgY2hhciAqbGlzdF9uYW1lLCBpbnQgaW5kZXgsIGVudW0gb2ZfZ3Bpb19mbGFncyAqZmxhZ3MpOworaW50IG9mX2dwaW9jaGlwX2FkZChzdHJ1Y3QgZ3Bpb19jaGlwICpnYyk7Cit2b2lkIG9mX2dwaW9jaGlwX3JlbW92ZShzdHJ1Y3QgZ3Bpb19jaGlwICpnYyk7CisjZWxzZQorc3RhdGljIGlubGluZSBzdHJ1Y3QgZ3Bpb19kZXNjICpvZl9maW5kX2dwaW8oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICAgIGNvbnN0IGNoYXIgKmNvbl9pZCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgaWR4LAorCQkJCQkgICAgIGVudW0gZ3Bpb19sb29rdXBfZmxhZ3MgKmZsYWdzKQoreworCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworfQorc3RhdGljIGlubGluZSBzdHJ1Y3QgZ3Bpb19kZXNjICpvZl9nZXRfbmFtZWRfZ3Bpb2RfZmxhZ3Moc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJICAgY29uc3QgY2hhciAqbGlzdF9uYW1lLCBpbnQgaW5kZXgsIGVudW0gb2ZfZ3Bpb19mbGFncyAqZmxhZ3MpCit7CisJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7Cit9CitzdGF0aWMgaW5saW5lIGludCBvZl9ncGlvY2hpcF9hZGQoc3RydWN0IGdwaW9fY2hpcCAqZ2MpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBvZl9ncGlvY2hpcF9yZW1vdmUoc3RydWN0IGdwaW9fY2hpcCAqZ2MpIHsgfQorI2VuZGlmIC8qIENPTkZJR19PRl9HUElPICovCisKICNpZmRlZiBDT05GSUdfQUNQSQogdm9pZCBhY3BpX2dwaW9jaGlwX2FkZChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwKTsKIHZvaWQgYWNwaV9ncGlvY2hpcF9yZW1vdmUoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCk7CkBAIC05Myw5ICsxMjAsMTEgQEAKIHZvaWQgYWNwaV9ncGlvY2hpcF9yZXF1ZXN0X2ludGVycnVwdHMoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCk7CiB2b2lkIGFjcGlfZ3Bpb2NoaXBfZnJlZV9pbnRlcnJ1cHRzKHN0cnVjdCBncGlvX2NoaXAgKmNoaXApOwogCi1zdHJ1Y3QgZ3Bpb19kZXNjICphY3BpX2dldF9ncGlvZF9ieV9pbmRleChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYsCi0JCQkJCSAgY29uc3QgY2hhciAqcHJvcG5hbWUsIGludCBpbmRleCwKLQkJCQkJICBzdHJ1Y3QgYWNwaV9ncGlvX2luZm8gKmluZm8pOworc3RydWN0IGdwaW9fZGVzYyAqYWNwaV9maW5kX2dwaW8oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBjb25zdCBjaGFyICpjb25faWQsCisJCQkJIHVuc2lnbmVkIGludCBpZHgsCisJCQkJIGVudW0gZ3Bpb2RfZmxhZ3MgZmxhZ3MsCisJCQkJIGVudW0gZ3Bpb19sb29rdXBfZmxhZ3MgKmxvb2t1cGZsYWdzKTsKIHN0cnVjdCBncGlvX2Rlc2MgKmFjcGlfbm9kZV9nZXRfZ3Bpb2Qoc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3bm9kZSwKIAkJCQkgICAgICBjb25zdCBjaGFyICpwcm9wbmFtZSwgaW50IGluZGV4LAogCQkJCSAgICAgIHN0cnVjdCBhY3BpX2dwaW9faW5mbyAqaW5mbyk7CkBAIC0xMTQsMTAgKzE0MywxMSBAQAogYWNwaV9ncGlvY2hpcF9mcmVlX2ludGVycnVwdHMoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCkgeyB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGdwaW9fZGVzYyAqCi1hY3BpX2dldF9ncGlvZF9ieV9pbmRleChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYsIGNvbnN0IGNoYXIgKnByb3BuYW1lLAotCQkJaW50IGluZGV4LCBzdHJ1Y3QgYWNwaV9ncGlvX2luZm8gKmluZm8pCithY3BpX2ZpbmRfZ3BpbyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmNvbl9pZCwKKwkgICAgICAgdW5zaWduZWQgaW50IGlkeCwgZW51bSBncGlvZF9mbGFncyBmbGFncywKKwkgICAgICAgZW51bSBncGlvX2xvb2t1cF9mbGFncyAqbG9va3VwZmxhZ3MpCiB7Ci0JcmV0dXJuIEVSUl9QVFIoLUVOT1NZUyk7CisJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CiB9CiBzdGF0aWMgaW5saW5lIHN0cnVjdCBncGlvX2Rlc2MgKgogYWNwaV9ub2RlX2dldF9ncGlvZChzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlLCBjb25zdCBjaGFyICpwcm9wbmFtZSwKQEAgLTEzNyw5ICsxNjcsNiBAQAogfQogI2VuZGlmCiAKLXN0cnVjdCBncGlvX2Rlc2MgKm9mX2dldF9uYW1lZF9ncGlvZF9mbGFncyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkgICBjb25zdCBjaGFyICpsaXN0X25hbWUsIGludCBpbmRleCwgZW51bSBvZl9ncGlvX2ZsYWdzICpmbGFncyk7Ci0KIHN0cnVjdCBncGlvX2Rlc2MgKmdwaW9jaGlwX2dldF9kZXNjKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHUxNiBod251bSk7CiB2b2lkIGdwaW9kX3NldF9hcnJheV92YWx1ZV9jb21wbGV4KGJvb2wgcmF3LCBib29sIGNhbl9zbGVlcCwKIAkJCQkgICB1bnNpZ25lZCBpbnQgYXJyYXlfc2l6ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdS5oIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1LmgKaW5kZXggOGViYzVmMS4uNzAwYzU2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1LmgKQEAgLTQyNiw2ICs0MjYsOCBAQAogCiAJLyogY3VzdG9tIExSVSBtYW5hZ2VtZW50ICovCiAJc3RydWN0IGFtZGdwdV9tbWFuX2xydQkJCWxvZzJfc2l6ZVtBTURHUFVfVFRNX0xSVV9TSVpFXTsKKwkvKiBndWFyZCBmb3IgbG9nMl9zaXplIGFycmF5LCBkb24ndCBhZGQgYW55dGhpbmcgaW4gYmV0d2VlbiAqLworCXN0cnVjdCBhbWRncHVfbW1hbl9scnUJCQlndWFyZDsKIH07CiAKIGludCBhbWRncHVfY29weV9idWZmZXIoc3RydWN0IGFtZGdwdV9yaW5nICpyaW5nLApAQCAtNjQ2LDkgKzY0OCw5IEBACiB2b2lkIGFtZGdwdV9nYXJ0X3RhYmxlX3ZyYW1fdW5waW4oc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpOwogaW50IGFtZGdwdV9nYXJ0X2luaXQoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpOwogdm9pZCBhbWRncHVfZ2FydF9maW5pKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KTsKLXZvaWQgYW1kZ3B1X2dhcnRfdW5iaW5kKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LCB1bnNpZ25lZCBvZmZzZXQsCit2b2lkIGFtZGdwdV9nYXJ0X3VuYmluZChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwgdWludDY0X3Qgb2Zmc2V0LAogCQkJaW50IHBhZ2VzKTsKLWludCBhbWRncHVfZ2FydF9iaW5kKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LCB1bnNpZ25lZCBvZmZzZXQsCitpbnQgYW1kZ3B1X2dhcnRfYmluZChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwgdWludDY0X3Qgb2Zmc2V0LAogCQkgICAgIGludCBwYWdlcywgc3RydWN0IHBhZ2UgKipwYWdlbGlzdCwKIAkJICAgICBkbWFfYWRkcl90ICpkbWFfYWRkciwgdWludDMyX3QgZmxhZ3MpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfYXRvbWJpb3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9hdG9tYmlvcy5jCmluZGV4IDk4MzE3NTMuLmZlODcyYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9hdG9tYmlvcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9hdG9tYmlvcy5jCkBAIC0zMjEsNiArMzIxLDE5IEBACiAJCQkgICAgKGxlMTZfdG9fY3B1KHBhdGgtPnVzQ29ubk9iamVjdElkKSAmCiAJCQkgICAgIE9CSkVDVF9UWVBFX01BU0spID4+IE9CSkVDVF9UWVBFX1NISUZUOwogCisJCQkvKiBTa2lwIFRWL0NWIHN1cHBvcnQgKi8KKwkJCWlmICgobGUxNl90b19jcHUocGF0aC0+dXNEZXZpY2VUYWcpID09CisJCQkgICAgIEFUT01fREVWSUNFX1RWMV9TVVBQT1JUKSB8fAorCQkJICAgIChsZTE2X3RvX2NwdShwYXRoLT51c0RldmljZVRhZykgPT0KKwkJCSAgICAgQVRPTV9ERVZJQ0VfQ1ZfU1VQUE9SVCkpCisJCQkJY29udGludWU7CisKKwkJCWlmIChjb25fb2JqX2lkID49IEFSUkFZX1NJWkUob2JqZWN0X2Nvbm5lY3Rvcl9jb252ZXJ0KSkgeworCQkJCURSTV9FUlJPUigiaW52YWxpZCBjb25fb2JqX2lkICVkIGZvciBkZXZpY2UgdGFnIDB4JTA0eFxuIiwKKwkJCQkJICBjb25fb2JqX2lkLCBsZTE2X3RvX2NwdShwYXRoLT51c0RldmljZVRhZykpOworCQkJCWNvbnRpbnVlOworCQkJfQorCiAJCQljb25uZWN0b3JfdHlwZSA9CiAJCQkJb2JqZWN0X2Nvbm5lY3Rvcl9jb252ZXJ0W2Nvbl9vYmpfaWRdOwogCQkJY29ubmVjdG9yX29iamVjdF9pZCA9IGNvbl9vYmpfaWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfYXRweF9oYW5kbGVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfYXRweF9oYW5kbGVyLmMKaW5kZXggNDlkZTkyNi4uMTBiNWRkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2F0cHhfaGFuZGxlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9hdHB4X2hhbmRsZXIuYwpAQCAtMjAwLDE2ICsyMDAsNyBAQAogCWF0cHgtPmlzX2h5YnJpZCA9IGZhbHNlOwogCWlmICh2YWxpZF9iaXRzICYgQVRQWF9NU19IWUJSSURfR0ZYX1NVUFBPUlRFRCkgewogCQlwcmludGsoIkFUUFggSHlicmlkIEdyYXBoaWNzXG4iKTsKLSNpZiAxCi0JCS8qIFRoaXMgaXMgYSB0ZW1wb3JhcnkgaGFjayB1bnRpbCB0aGUgRDMgY29sZCBzdXBwb3J0Ci0JCSAqIG1ha2VzIGl0IHVwc3RyZWFtLiAgVGhlIEFUUFggcG93ZXJfY29udHJvbCBtZXRob2Qgc2VlbXMKLQkJICogdG8gc3RpbGwgd29yayBvbiBldmVuIGlmIHRoZSBzeXN0ZW0gc2hvdWxkIGJlIHVzaW5nCi0JCSAqIHRoZSBuZXcgc3RhbmRhcmRpemVkIGh5YnJpZCBEMyBjb2xkIEFDUEkgaW50ZXJmYWNlLgotCQkgKi8KLQkJYXRweC0+ZnVuY3Rpb25zLnBvd2VyX2NudGwgPSB0cnVlOwotI2Vsc2UKIAkJYXRweC0+ZnVuY3Rpb25zLnBvd2VyX2NudGwgPSBmYWxzZTsKLSNlbmRpZgogCQlhdHB4LT5pc19oeWJyaWQgPSB0cnVlOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2RldmljZS5jIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2RldmljZS5jCmluZGV4IGRmN2FiMjQ1Li4zOWMwMWI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfZGV2aWNlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2RldmljZS5jCkBAIC0xNzA4LDExICsxNzA4LDExIEBACiAKIAlEUk1fSU5GTygiYW1kZ3B1OiBmaW5pc2hpbmcgZGV2aWNlLlxuIik7CiAJYWRldi0+c2h1dGRvd24gPSB0cnVlOworCWRybV9jcnRjX2ZvcmNlX2Rpc2FibGVfYWxsKGFkZXYtPmRkZXYpOwogCS8qIGV2aWN0IHZyYW0gbWVtb3J5ICovCiAJYW1kZ3B1X2JvX2V2aWN0X3ZyYW0oYWRldik7CiAJYW1kZ3B1X2liX3Bvb2xfZmluaShhZGV2KTsKIAlhbWRncHVfZmVuY2VfZHJpdmVyX2ZpbmkoYWRldik7Ci0JZHJtX2NydGNfZm9yY2VfZGlzYWJsZV9hbGwoYWRldi0+ZGRldik7CiAJYW1kZ3B1X2ZiZGV2X2ZpbmkoYWRldik7CiAJciA9IGFtZGdwdV9maW5pKGFkZXYpOwogCWtmcmVlKGFkZXYtPmlwX2Jsb2NrX3N0YXR1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfZ2FydC5jIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2dhcnQuYwppbmRleCA5MjFiY2UyLi4wZmVlYTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfZ2FydC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9nYXJ0LmMKQEAgLTIyMSw3ICsyMjEsNyBAQAogICogVW5iaW5kcyB0aGUgcmVxdWVzdGVkIHBhZ2VzIGZyb20gdGhlIGdhcnQgcGFnZSB0YWJsZSBhbmQKICAqIHJlcGxhY2VzIHRoZW0gd2l0aCB0aGUgZHVtbXkgcGFnZSAoYWxsIGFzaWNzKS4KICAqLwotdm9pZCBhbWRncHVfZ2FydF91bmJpbmQoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsIHVuc2lnbmVkIG9mZnNldCwKK3ZvaWQgYW1kZ3B1X2dhcnRfdW5iaW5kKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LCB1aW50NjRfdCBvZmZzZXQsCiAJCQlpbnQgcGFnZXMpCiB7CiAJdW5zaWduZWQgdDsKQEAgLTI2OCw3ICsyNjgsNyBAQAogICogKGFsbCBhc2ljcykuCiAgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIC1FSU5WQUwgZm9yIGZhaWx1cmUuCiAgKi8KLWludCBhbWRncHVfZ2FydF9iaW5kKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LCB1bnNpZ25lZCBvZmZzZXQsCitpbnQgYW1kZ3B1X2dhcnRfYmluZChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwgdWludDY0X3Qgb2Zmc2V0LAogCQkgICAgIGludCBwYWdlcywgc3RydWN0IHBhZ2UgKipwYWdlbGlzdCwgZG1hX2FkZHJfdCAqZG1hX2FkZHIsCiAJCSAgICAgdWludDMyX3QgZmxhZ3MpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfaWIuYyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9pYi5jCmluZGV4IGEzMWQ3ZWYuLmVjMTI4MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9pYi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9pYi5jCkBAIC0yODAsNyArMjgwLDcgQEAKIGludCBhbWRncHVfaWJfcmluZ190ZXN0cyhzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKIHsKIAl1bnNpZ25lZCBpOwotCWludCByOworCWludCByLCByZXQgPSAwOwogCiAJZm9yIChpID0gMDsgaSA8IEFNREdQVV9NQVhfUklOR1M7ICsraSkgewogCQlzdHJ1Y3QgYW1kZ3B1X3JpbmcgKnJpbmcgPSBhZGV2LT5yaW5nc1tpXTsKQEAgLTMwMSwxMCArMzAxLDExIEBACiAJCQl9IGVsc2UgewogCQkJCS8qIHN0aWxsIG5vdCBnb29kLCBidXQgd2UgY2FuIGxpdmUgd2l0aCBpdCAqLwogCQkJCURSTV9FUlJPUigiYW1kZ3B1OiBmYWlsZWQgdGVzdGluZyBJQiBvbiByaW5nICVkICglZCkuXG4iLCBpLCByKTsKKwkJCQlyZXQgPSByOwogCQkJfQogCQl9CiAJfQotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdHRtLmMgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdHRtLmMKaW5kZXggOWI2MWM4Yi4uNzE2ZjJhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3R0bS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV90dG0uYwpAQCAtMjUxLDggKzI1MSw4IEBACiAKIAlhZGV2ID0gYW1kZ3B1X2dldF9hZGV2KGJvLT5iZGV2KTsKIAlyaW5nID0gYWRldi0+bW1hbi5idWZmZXJfZnVuY3NfcmluZzsKLQlvbGRfc3RhcnQgPSBvbGRfbWVtLT5zdGFydCA8PCBQQUdFX1NISUZUOwotCW5ld19zdGFydCA9IG5ld19tZW0tPnN0YXJ0IDw8IFBBR0VfU0hJRlQ7CisJb2xkX3N0YXJ0ID0gKHU2NClvbGRfbWVtLT5zdGFydCA8PCBQQUdFX1NISUZUOworCW5ld19zdGFydCA9ICh1NjQpbmV3X21lbS0+c3RhcnQgPDwgUEFHRV9TSElGVDsKIAogCXN3aXRjaCAob2xkX21lbS0+bWVtX3R5cGUpIHsKIAljYXNlIFRUTV9QTF9WUkFNOgpAQCAtOTUwLDYgKzk1MCw4IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqcmVzID0gbHJ1LT5scnVbdGJvLT5tZW0ubWVtX3R5cGVdOwogCiAJbHJ1LT5scnVbdGJvLT5tZW0ubWVtX3R5cGVdID0gJnRiby0+bHJ1OworCXdoaWxlICgoKytscnUpLT5scnVbdGJvLT5tZW0ubWVtX3R5cGVdID09IHJlcykKKwkJbHJ1LT5scnVbdGJvLT5tZW0ubWVtX3R5cGVdID0gJnRiby0+bHJ1OwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTk2MCw2ICs5NjIsOCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKnJlcyA9IGxydS0+c3dhcF9scnU7CiAKIAlscnUtPnN3YXBfbHJ1ID0gJnRiby0+c3dhcDsKKwl3aGlsZSAoKCsrbHJ1KS0+c3dhcF9scnUgPT0gcmVzKQorCQlscnUtPnN3YXBfbHJ1ID0gJnRiby0+c3dhcDsKIAogCXJldHVybiByZXM7CiB9CkBAIC0xMDExLDYgKzEwMTUsMTAgQEAKIAkJbHJ1LT5zd2FwX2xydSA9ICZhZGV2LT5tbWFuLmJkZXYuZ2xvYi0+c3dhcF9scnU7CiAJfQogCisJZm9yIChqID0gMDsgaiA8IFRUTV9OVU1fTUVNX1RZUEVTOyArK2opCisJCWFkZXYtPm1tYW4uZ3VhcmQubHJ1W2pdID0gTlVMTDsKKwlhZGV2LT5tbWFuLmd1YXJkLnN3YXBfbHJ1ID0gTlVMTDsKKwogCWFkZXYtPm1tYW4uaW5pdGlhbGl6ZWQgPSB0cnVlOwogCXIgPSB0dG1fYm9faW5pdF9tbSgmYWRldi0+bW1hbi5iZGV2LCBUVE1fUExfVlJBTSwKIAkJCQlhZGV2LT5tYy5yZWFsX3ZyYW1fc2l6ZSA+PiBQQUdFX1NISUZUKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV91dmQuYyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV91dmQuYwppbmRleCBiMTFmNGU4Li40YWE5OTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdXZkLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3V2ZC5jCkBAIC0xMTg3LDcgKzExODcsOCBAQAogCQlyID0gMDsKIAl9CiAKLWVycm9yOgogCWZlbmNlX3B1dChmZW5jZSk7CisKK2Vycm9yOgogCXJldHVybiByOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3ZtLmMgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdm0uYwppbmRleCA4ZTY0MmZjLi44MDEyMGZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdm0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdm0uYwpAQCAtMTUzNSw3ICsxNTM1LDcgQEAKIAlyID0gYW1kX3NjaGVkX2VudGl0eV9pbml0KCZyaW5nLT5zY2hlZCwgJnZtLT5lbnRpdHksCiAJCQkJICBycSwgYW1kZ3B1X3NjaGVkX2pvYnMpOwogCWlmIChyKQotCQlyZXR1cm4gcjsKKwkJZ290byBlcnI7CiAKIAl2bS0+cGFnZV9kaXJlY3RvcnlfZmVuY2UgPSBOVUxMOwogCkBAIC0xNTY1LDYgKzE1NjUsOSBAQAogZXJyb3JfZnJlZV9zY2hlZF9lbnRpdHk6CiAJYW1kX3NjaGVkX2VudGl0eV9maW5pKCZyaW5nLT5zY2hlZCwgJnZtLT5lbnRpdHkpOwogCitlcnI6CisJZHJtX2ZyZWVfbGFyZ2Uodm0tPnBhZ2VfdGFibGVzKTsKKwogCXJldHVybiByOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9jaWtfc2RtYS5jIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvY2lrX3NkbWEuYwppbmRleCBlZTY0NjY5Li43N2ZkZDk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9jaWtfc2RtYS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2Npa19zZG1hLmMKQEAgLTUyLDYgKzUyLDcgQEAKIHN0YXRpYyB2b2lkIGNpa19zZG1hX3NldF9pcnFfZnVuY3Moc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpOwogc3RhdGljIHZvaWQgY2lrX3NkbWFfc2V0X2J1ZmZlcl9mdW5jcyhzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldik7CiBzdGF0aWMgdm9pZCBjaWtfc2RtYV9zZXRfdm1fcHRlX2Z1bmNzKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KTsKK3N0YXRpYyBpbnQgY2lrX3NkbWFfc29mdF9yZXNldCh2b2lkICpoYW5kbGUpOwogCiBNT0RVTEVfRklSTVdBUkUoInJhZGVvbi9ib25haXJlX3NkbWEuYmluIik7CiBNT0RVTEVfRklSTVdBUkUoInJhZGVvbi9ib25haXJlX3NkbWExLmJpbiIpOwpAQCAtMTAzNyw2ICsxMDM4LDggQEAKIHsKIAlzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiA9IChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqKWhhbmRsZTsKIAorCWNpa19zZG1hX3NvZnRfcmVzZXQoaGFuZGxlKTsKKwogCXJldHVybiBjaWtfc2RtYV9od19pbml0KGFkZXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9nZnhfdjdfMC5jIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvZ2Z4X3Y3XzAuYwppbmRleCBkODY5ZDA1Li40MjU0MTNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9nZnhfdjdfMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2dmeF92N18wLmMKQEAgLTI3NTUsOCArMjc1NSw3IEBACiAJdTY0IHdiX2dwdV9hZGRyOwogCXUzMiAqYnVmOwogCXN0cnVjdCBib25haXJlX21xZCAqbXFkOwotCi0JZ2Z4X3Y3XzBfY3BfY29tcHV0ZV9lbmFibGUoYWRldiwgdHJ1ZSk7CisJc3RydWN0IGFtZGdwdV9yaW5nICpyaW5nOwogCiAJLyogZml4IHVwIGNoaWNrZW4gYml0cyAqLwogCXRtcCA9IFJSRUczMihtbUNQX0NQRl9ERUJVRyk7CkBAIC0yNzkxLDcgKzI3OTAsNyBAQAogCiAJLyogaW5pdCB0aGUgcXVldWVzLiAgSnVzdCB0d28gZm9yIG5vdy4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgYWRldi0+Z2Z4Lm51bV9jb21wdXRlX3JpbmdzOyBpKyspIHsKLQkJc3RydWN0IGFtZGdwdV9yaW5nICpyaW5nID0gJmFkZXYtPmdmeC5jb21wdXRlX3JpbmdbaV07CisJCXJpbmcgPSAmYWRldi0+Z2Z4LmNvbXB1dGVfcmluZ1tpXTsKIAogCQlpZiAocmluZy0+bXFkX29iaiA9PSBOVUxMKSB7CiAJCQlyID0gYW1kZ3B1X2JvX2NyZWF0ZShhZGV2LApAQCAtMjk3MCw2ICsyOTY5LDEzIEBACiAJCWFtZGdwdV9ib191bnJlc2VydmUocmluZy0+bXFkX29iaik7CiAKIAkJcmluZy0+cmVhZHkgPSB0cnVlOworCX0KKworCWdmeF92N18wX2NwX2NvbXB1dGVfZW5hYmxlKGFkZXYsIHRydWUpOworCisJZm9yIChpID0gMDsgaSA8IGFkZXYtPmdmeC5udW1fY29tcHV0ZV9yaW5nczsgaSsrKSB7CisJCXJpbmcgPSAmYWRldi0+Z2Z4LmNvbXB1dGVfcmluZ1tpXTsKKwogCQlyID0gYW1kZ3B1X3JpbmdfdGVzdF9yaW5nKHJpbmcpOwogCQlpZiAocikKIAkJCXJpbmctPnJlYWR5ID0gZmFsc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9zZG1hX3YyXzQuYyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L3NkbWFfdjJfNC5jCmluZGV4IDEzNTFjN2UuLmE2NDcxNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L3NkbWFfdjJfNC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L3NkbWFfdjJfNC5jCkBAIC03MTQsNyArNzE0LDcgQEAKIAkJRFJNX0VSUk9SKCJhbWRncHU6IElCIHRlc3QgdGltZWQgb3V0XG4iKTsKIAkJciA9IC1FVElNRURPVVQ7CiAJCWdvdG8gZXJyMTsKLQl9IGVsc2UgaWYgKHIpIHsKKwl9IGVsc2UgaWYgKHIgPCAwKSB7CiAJCURSTV9FUlJPUigiYW1kZ3B1OiBmZW5jZSB3YWl0IGZhaWxlZCAoJWxkKS5cbiIsIHIpOwogCQlnb3RvIGVycjE7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRrZmQva2ZkX2Rvb3JiZWxsLmMgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGtmZC9rZmRfZG9vcmJlbGwuYwppbmRleCBlNjIxZWJhLi5hN2QzY2IzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGtmZC9rZmRfZG9vcmJlbGwuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGtmZC9rZmRfZG9vcmJlbGwuYwpAQCAtMTg0LDcgKzE4NCw3IEBACiAJCQkJCQkJc2l6ZW9mKHUzMikpICsgaW54OwogCiAJcHJfZGVidWcoImtmZDogZ2V0IGtlcm5lbCBxdWV1ZSBkb29yYmVsbFxuIgotCQkJICIgICAgIGRvb3JiZWxsIG9mZnNldCAgID09IDB4JTA4ZFxuIgorCQkJICIgICAgIGRvb3JiZWxsIG9mZnNldCAgID09IDB4JTA4WFxuIgogCQkJICIgICAgIGtlcm5lbCBhZGRyZXNzICAgID09IDB4JTA4bFhcbiIsCiAJCSpkb29yYmVsbF9vZmYsICh1aW50cHRyX3QpKGtmZC0+ZG9vcmJlbGxfa2VybmVsX3B0ciArIGlueCkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL3NjaGVkdWxlci9ncHVfc2NoZWR1bGVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL3NjaGVkdWxlci9ncHVfc2NoZWR1bGVyLmMKaW5kZXggZWYzMTJiYi4uOTYzYTI0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2FtZC9zY2hlZHVsZXIvZ3B1X3NjaGVkdWxlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvc2NoZWR1bGVyL2dwdV9zY2hlZHVsZXIuYwpAQCAtNDA1LDcgKzQwNSw3IEBACiAJc3Bpbl9sb2NrKCZzY2hlZC0+am9iX2xpc3RfbG9jayk7CiAJc19qb2IgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJnNjaGVkLT5yaW5nX21pcnJvcl9saXN0LAogCQkJCQkgc3RydWN0IGFtZF9zY2hlZF9qb2IsIG5vZGUpOwotCWlmIChzX2pvYikKKwlpZiAoc19qb2IgJiYgc2NoZWQtPnRpbWVvdXQgIT0gTUFYX1NDSEVEVUxFX1RJTUVPVVQpCiAJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmc19qb2ItPndvcmtfdGRyLCBzY2hlZC0+dGltZW91dCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc19qb2IsIHRtcCwgJnNjaGVkLT5yaW5nX21pcnJvcl9saXN0LCBub2RlKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYXRtZWwtaGxjZGMvYXRtZWxfaGxjZGNfY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL2F0bWVsLWhsY2RjL2F0bWVsX2hsY2RjX2NydGMuYwppbmRleCBhOTc4MzgxLi45YjE3YTY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYXRtZWwtaGxjZGMvYXRtZWxfaGxjZGNfY3J0Yy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hdG1lbC1obGNkYy9hdG1lbF9obGNkY19jcnRjLmMKQEAgLTM4Nyw3ICszODcsNyBAQAogCWF0bWVsX2hsY2RjX2NydGNfZmluaXNoX3BhZ2VfZmxpcChkcm1fY3J0Y190b19hdG1lbF9obGNkY19jcnRjKGMpKTsKIH0KIAotdm9pZCBhdG1lbF9obGNkY19jcnRjX3Jlc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3N0YXRpYyB2b2lkIGF0bWVsX2hsY2RjX2NydGNfcmVzZXQoc3RydWN0IGRybV9jcnRjICpjcnRjKQogewogCXN0cnVjdCBhdG1lbF9obGNkY19jcnRjX3N0YXRlICpzdGF0ZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2F0bWVsLWhsY2RjL2F0bWVsX2hsY2RjX3BsYW5lLmMgYi9kcml2ZXJzL2dwdS9kcm0vYXRtZWwtaGxjZGMvYXRtZWxfaGxjZGNfcGxhbmUuYwppbmRleCAwMTZjMTkxLi41MmM1MjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYXRtZWwtaGxjZGMvYXRtZWxfaGxjZGNfcGxhbmUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vYXRtZWwtaGxjZGMvYXRtZWxfaGxjZGNfcGxhbmUuYwpAQCAtMzIwLDE5ICszMjAsMTkgQEAKIAkJCXUzMiAqY29lZmZfdGFiID0gaGVvX3Vwc2NhbGluZ195Y29lZjsKIAkJCXUzMiBtYXhfbWVtc2l6ZTsKIAotCQkJaWYgKHN0YXRlLT5jcnRjX3cgPCBzdGF0ZS0+c3JjX3cpCisJCQlpZiAoc3RhdGUtPmNydGNfaCA8IHN0YXRlLT5zcmNfaCkKIAkJCQljb2VmZl90YWIgPSBoZW9fZG93bnNjYWxpbmdfeWNvZWY7CiAJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShoZW9fdXBzY2FsaW5nX3ljb2VmKTsgaSsrKQogCQkJCWF0bWVsX2hsY2RjX2xheWVyX3VwZGF0ZV9jZmcoJnBsYW5lLT5sYXllciwKIAkJCQkJCQkgICAgIDMzICsgaSwKIAkJCQkJCQkgICAgIDB4ZmZmZmZmZmYsCiAJCQkJCQkJICAgICBjb2VmZl90YWJbaV0pOwotCQkJZmFjdG9yID0gKCg4ICogMjU2ICogc3RhdGUtPnNyY193KSAtICgyNTYgKiA0KSkgLwotCQkJCSBzdGF0ZS0+Y3J0Y193OworCQkJZmFjdG9yID0gKCg4ICogMjU2ICogc3RhdGUtPnNyY19oKSAtICgyNTYgKiA0KSkgLworCQkJCSBzdGF0ZS0+Y3J0Y19oOwogCQkJZmFjdG9yKys7Ci0JCQltYXhfbWVtc2l6ZSA9ICgoZmFjdG9yICogc3RhdGUtPmNydGNfdykgKyAoMjU2ICogNCkpIC8KKwkJCW1heF9tZW1zaXplID0gKChmYWN0b3IgKiBzdGF0ZS0+Y3J0Y19oKSArICgyNTYgKiA0KSkgLwogCQkJCSAgICAgIDIwNDg7Ci0JCQlpZiAobWF4X21lbXNpemUgPiBzdGF0ZS0+c3JjX3cpCisJCQlpZiAobWF4X21lbXNpemUgPiBzdGF0ZS0+c3JjX2gpCiAJCQkJZmFjdG9yLS07CiAJCQlmYWN0b3JfcmVnIHw9IChmYWN0b3IgPDwgMTYpIHwgMHg4MDAwMDAwMDsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWMuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fYXRvbWljLmMKaW5kZXggZmEzOTMwNy4uMmEzZGVkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2F0b21pYy5jCkBAIC00NzUsNyArNDc1LDcgQEAKIAkJCQkJdmFsLAogCQkJCQktMSwKIAkJCQkJJnJlcGxhY2VkKTsKLQkJc3RhdGUtPmNvbG9yX21nbXRfY2hhbmdlZCA9IHJlcGxhY2VkOworCQlzdGF0ZS0+Y29sb3JfbWdtdF9jaGFuZ2VkIHw9IHJlcGxhY2VkOwogCQlyZXR1cm4gcmV0OwogCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gY29uZmlnLT5jdG1fcHJvcGVydHkpIHsKIAkJcmV0ID0gZHJtX2F0b21pY19yZXBsYWNlX3Byb3BlcnR5X2Jsb2JfZnJvbV9pZChjcnRjLApAQCAtNDgzLDcgKzQ4Myw3IEBACiAJCQkJCXZhbCwKIAkJCQkJc2l6ZW9mKHN0cnVjdCBkcm1fY29sb3JfY3RtKSwKIAkJCQkJJnJlcGxhY2VkKTsKLQkJc3RhdGUtPmNvbG9yX21nbXRfY2hhbmdlZCA9IHJlcGxhY2VkOworCQlzdGF0ZS0+Y29sb3JfbWdtdF9jaGFuZ2VkIHw9IHJlcGxhY2VkOwogCQlyZXR1cm4gcmV0OwogCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gY29uZmlnLT5nYW1tYV9sdXRfcHJvcGVydHkpIHsKIAkJcmV0ID0gZHJtX2F0b21pY19yZXBsYWNlX3Byb3BlcnR5X2Jsb2JfZnJvbV9pZChjcnRjLApAQCAtNDkxLDcgKzQ5MSw3IEBACiAJCQkJCXZhbCwKIAkJCQkJLTEsCiAJCQkJCSZyZXBsYWNlZCk7Ci0JCXN0YXRlLT5jb2xvcl9tZ210X2NoYW5nZWQgPSByZXBsYWNlZDsKKwkJc3RhdGUtPmNvbG9yX21nbXRfY2hhbmdlZCB8PSByZXBsYWNlZDsKIAkJcmV0dXJuIHJldDsKIAl9IGVsc2UgaWYgKGNydGMtPmZ1bmNzLT5hdG9taWNfc2V0X3Byb3BlcnR5KQogCQlyZXR1cm4gY3J0Yy0+ZnVuY3MtPmF0b21pY19zZXRfcHJvcGVydHkoY3J0Yywgc3RhdGUsIHByb3BlcnR5LCB2YWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGMuYwppbmRleCBiMWRiYjYwLi5kZGViZTU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGMuYwpAQCAtNTQwNCw2ICs1NDA0LDkgQEAKIAlzdHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50ICplID0gTlVMTDsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAorCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlpZiAocGFnZV9mbGlwLT5mbGFncyAmIH5EUk1fTU9ERV9QQUdFX0ZMSVBfRkxBR1MgfHwKIAkgICAgcGFnZV9mbGlwLT5yZXNlcnZlZCAhPSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jCmluZGV4IGNlNTRlOTguLjBhMDZmOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYwpAQCAtNDY0LDcgKzQ2NCw3IEBACiAKIAkvKiBTb21ldGltZXMgdXNlciBzcGFjZSB3YW50cyBldmVyeXRoaW5nIGRpc2FibGVkLCBzbyBkb24ndCBzdGVhbCB0aGUKIAkgKiBkaXNwbGF5IGlmIHRoZXJlJ3MgYSBtYXN0ZXIuICovCi0JaWYgKGxvY2tsZXNzX2RlcmVmZXJlbmNlKGRldi0+bWFzdGVyKSkKKwlpZiAoUkVBRF9PTkNFKGRldi0+bWFzdGVyKSkKIAkJcmV0dXJuIGZhbHNlOwogCiAJZHJtX2Zvcl9lYWNoX2NydGMoY3J0YywgZGV2KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2lvYzMyLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2lvYzMyLmMKaW5kZXggNTc2NzZmOC4uYTYyODk3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9pb2MzMi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1faW9jMzIuYwpAQCAtMTAxNSw2ICsxMDE1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmIGRlZmluZWQoQ09ORklHX1g4NikgfHwgZGVmaW5lZChDT05GSUdfSUE2NCkKIHR5cGVkZWYgc3RydWN0IGRybV9tb2RlX2ZiX2NtZDIzMiB7CiAJdTMyIGZiX2lkOwogCXUzMiB3aWR0aDsKQEAgLTEwNzEsNiArMTA3Miw3IEBACiAKIAlyZXR1cm4gMDsKIH0KKyNlbmRpZgogCiBzdGF0aWMgZHJtX2lvY3RsX2NvbXBhdF90ICpkcm1fY29tcGF0X2lvY3Rsc1tdID0gewogCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1ZFUlNJT04zMildID0gY29tcGF0X2RybV92ZXJzaW9uLApAQCAtMTEwNCw3ICsxMTA2LDkgQEAKIAlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9VUERBVEVfRFJBVzMyKV0gPSBjb21wYXRfZHJtX3VwZGF0ZV9kcmF3LAogI2VuZGlmCiAJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfV0FJVF9WQkxBTkszMildID0gY29tcGF0X2RybV93YWl0X3ZibGFuaywKKyNpZiBkZWZpbmVkKENPTkZJR19YODYpIHx8IGRlZmluZWQoQ09ORklHX0lBNjQpCiAJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfTU9ERV9BRERGQjIzMildID0gY29tcGF0X2RybV9tb2RlX2FkZGZiMiwKKyNlbmRpZgogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXRuYXZpdi9ldG5hdml2X2dwdS5jIGIvZHJpdmVycy9ncHUvZHJtL2V0bmF2aXYvZXRuYXZpdl9ncHUuYwppbmRleCA4N2VmMzQxLi5iMzgyY2Y1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXRuYXZpdi9ldG5hdml2X2dwdS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ldG5hdml2L2V0bmF2aXZfZ3B1LmMKQEAgLTEzMzMsOCArMTMzMyw2IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQltdXRleF9sb2NrKCZncHUtPmxvY2spOwotCiAJLyoKIAkgKiBUT0RPCiAJICoKQEAgLTEzNDgsMTYgKzEzNDYsMTggQEAKIAlpZiAodW5saWtlbHkoZXZlbnQgPT0gfjBVKSkgewogCQlEUk1fRVJST1IoIm5vIGZyZWUgZXZlbnRcbiIpOwogCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0X3VubG9jazsKKwkJZ290byBvdXRfcG1fcHV0OwogCX0KIAogCWZlbmNlID0gZXRuYXZpdl9ncHVfZmVuY2VfYWxsb2MoZ3B1KTsKIAlpZiAoIWZlbmNlKSB7CiAJCWV2ZW50X2ZyZWUoZ3B1LCBldmVudCk7CiAJCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X3VubG9jazsKKwkJZ290byBvdXRfcG1fcHV0OwogCX0KIAorCW11dGV4X2xvY2soJmdwdS0+bG9jayk7CisKIAlncHUtPmV2ZW50W2V2ZW50XS5mZW5jZSA9IGZlbmNlOwogCXN1Ym1pdC0+ZmVuY2UgPSBmZW5jZS0+c2Vxbm87CiAJZ3B1LT5hY3RpdmVfZmVuY2UgPSBzdWJtaXQtPmZlbmNlOwpAQCAtMTM5NSw5ICsxMzk1LDkgQEAKIAloYW5nY2hlY2tfdGltZXJfcmVzZXQoZ3B1KTsKIAlyZXQgPSAwOwogCi1vdXRfdW5sb2NrOgogCW11dGV4X3VubG9jaygmZ3B1LT5sb2NrKTsKIAorb3V0X3BtX3B1dDoKIAlldG5hdml2X2dwdV9wbV9wdXQoZ3B1KTsKIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZmIuYyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9mYi5jCmluZGV4IGUwMTY2NDAuLjQwY2U4NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9mYi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9mYi5jCkBAIC01NSwxMSArNTUsMTEgQEAKIAlmbGFncyA9IGV4eW5vc19nZW0tPmZsYWdzOwogCiAJLyoKLQkgKiB3aXRob3V0IGlvbW11IHN1cHBvcnQsIG5vdCBzdXBwb3J0IHBoeXNpY2FsbHkgbm9uLWNvbnRpbnVvdXMgbWVtb3J5Ci0JICogZm9yIGZyYW1lYnVmZmVyLgorCSAqIFBoeXNpY2FsbHkgbm9uLWNvbnRpZ3VvdXMgbWVtb3J5IHR5cGUgZm9yIGZyYW1lYnVmZmVyIGlzIG5vdAorCSAqIHN1cHBvcnRlZCB3aXRob3V0IElPTU1VLgogCSAqLwogCWlmIChJU19OT05DT05USUdfQlVGRkVSKGZsYWdzKSkgewotCQlEUk1fRVJST1IoImNhbm5vdCB1c2UgdGhpcyBnZW0gbWVtb3J5IHR5cGUgZm9yIGZiLlxuIik7CisJCURSTV9FUlJPUigiTm9uLWNvbnRpZ3VvdXMgR0VNIG1lbW9yeSBpcyBub3Qgc3VwcG9ydGVkLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2ZpbWMuYyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9maW1jLmMKaW5kZXggMDUyNWM1Ni4uMTQ3ZWYwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2ZpbWMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZmltYy5jCkBAIC0xNzUzLDMyICsxNzUzLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19QTV9TTEVFUAotc3RhdGljIGludCBmaW1jX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBmaW1jX2NvbnRleHQgKmN0eCA9IGdldF9maW1jX2NvbnRleHQoZGV2KTsKLQotCURSTV9ERUJVR19LTVMoImlkWyVkXVxuIiwgY3R4LT5pZCk7Ci0KLQlpZiAocG1fcnVudGltZV9zdXNwZW5kZWQoZGV2KSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gZmltY19jbGtfY3RybChjdHgsIGZhbHNlKTsKLX0KLQotc3RhdGljIGludCBmaW1jX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGZpbWNfY29udGV4dCAqY3R4ID0gZ2V0X2ZpbWNfY29udGV4dChkZXYpOwotCi0JRFJNX0RFQlVHX0tNUygiaWRbJWRdXG4iLCBjdHgtPmlkKTsKLQotCWlmICghcG1fcnVudGltZV9zdXNwZW5kZWQoZGV2KSkKLQkJcmV0dXJuIGZpbWNfY2xrX2N0cmwoY3R4LCB0cnVlKTsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KIHN0YXRpYyBpbnQgZmltY19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBmaW1jX2NvbnRleHQgKmN0eCA9IGdldF9maW1jX2NvbnRleHQoZGV2KTsKQEAgLTE3OTksNyArMTc3Myw4IEBACiAjZW5kaWYKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGZpbWNfcG1fb3BzID0gewotCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKGZpbWNfc3VzcGVuZCwgZmltY19yZXN1bWUpCisJU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMocG1fcnVudGltZV9mb3JjZV9zdXNwZW5kLAorCQkJCXBtX3J1bnRpbWVfZm9yY2VfcmVzdW1lKQogCVNFVF9SVU5USU1FX1BNX09QUyhmaW1jX3J1bnRpbWVfc3VzcGVuZCwgZmltY19ydW50aW1lX3Jlc3VtZSwgTlVMTCkKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9nMmQuYyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9nMmQuYwppbmRleCA0YmYwMGY1Li42ZWNhOGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZzJkLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2cyZC5jCkBAIC0xNDc1LDggKzE0NzUsOCBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BNX1NMRUVQCi1zdGF0aWMgaW50IGcyZF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgZzJkX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGcyZF9kYXRhICpnMmQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIApAQCAtMTQ5MCwyNSArMTQ5MCw2IEBACiAKIAlmbHVzaF93b3JrKCZnMmQtPnJ1bnF1ZXVlX3dvcmspOwogCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZzJkX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGcyZF9kYXRhICpnMmQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCWcyZC0+c3VzcGVuZGVkID0gZmFsc2U7Ci0JZzJkX2V4ZWNfcnVucXVldWUoZzJkKTsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgZzJkX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGcyZF9kYXRhICpnMmQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQogCWNsa19kaXNhYmxlX3VucHJlcGFyZShnMmQtPmdhdGVfY2xrKTsKIAogCXJldHVybiAwOwpAQCAtMTUyMywxMiArMTUwNCwxNiBAQAogCWlmIChyZXQgPCAwKQogCQlkZXZfd2FybihkZXYsICJmYWlsZWQgdG8gZW5hYmxlIGNsb2NrLlxuIik7CiAKKwlnMmQtPnN1c3BlbmRlZCA9IGZhbHNlOworCWcyZF9leGVjX3J1bnF1ZXVlKGcyZCk7CisKIAlyZXR1cm4gcmV0OwogfQogI2VuZGlmCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBnMmRfcG1fb3BzID0gewotCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKGcyZF9zdXNwZW5kLCBnMmRfcmVzdW1lKQorCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKHBtX3J1bnRpbWVfZm9yY2Vfc3VzcGVuZCwKKwkJCQlwbV9ydW50aW1lX2ZvcmNlX3Jlc3VtZSkKIAlTRVRfUlVOVElNRV9QTV9PUFMoZzJkX3J1bnRpbWVfc3VzcGVuZCwgZzJkX3J1bnRpbWVfcmVzdW1lLCBOVUxMKQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2dzYy5jIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2dzYy5jCmluZGV4IDVkMjBkYTguLjUyYTlkMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9nc2MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZ3NjLmMKQEAgLTE3NjAsMzQgKzE3NjAsNyBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BNX1NMRUVQCi1zdGF0aWMgaW50IGdzY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZ3NjX2NvbnRleHQgKmN0eCA9IGdldF9nc2NfY29udGV4dChkZXYpOwotCi0JRFJNX0RFQlVHX0tNUygiaWRbJWRdXG4iLCBjdHgtPmlkKTsKLQotCWlmIChwbV9ydW50aW1lX3N1c3BlbmRlZChkZXYpKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiBnc2NfY2xrX2N0cmwoY3R4LCBmYWxzZSk7Ci19Ci0KLXN0YXRpYyBpbnQgZ3NjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGdzY19jb250ZXh0ICpjdHggPSBnZXRfZ3NjX2NvbnRleHQoZGV2KTsKLQotCURSTV9ERUJVR19LTVMoImlkWyVkXVxuIiwgY3R4LT5pZCk7Ci0KLQlpZiAoIXBtX3J1bnRpbWVfc3VzcGVuZGVkKGRldikpCi0JCXJldHVybiBnc2NfY2xrX2N0cmwoY3R4LCB0cnVlKTsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgZ3NjX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIGdzY19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBnc2NfY29udGV4dCAqY3R4ID0gZ2V0X2dzY19jb250ZXh0KGRldik7CiAKQEAgLTE3OTYsNyArMTc2OSw3IEBACiAJcmV0dXJuICBnc2NfY2xrX2N0cmwoY3R4LCBmYWxzZSk7CiB9CiAKLXN0YXRpYyBpbnQgZ3NjX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgZ3NjX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZ3NjX2NvbnRleHQgKmN0eCA9IGdldF9nc2NfY29udGV4dChkZXYpOwogCkBAIC0xODA0LDEwICsxNzc3LDEwIEBACiAKIAlyZXR1cm4gIGdzY19jbGtfY3RybChjdHgsIHRydWUpOwogfQotI2VuZGlmCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBnc2NfcG1fb3BzID0gewotCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKGdzY19zdXNwZW5kLCBnc2NfcmVzdW1lKQorCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKHBtX3J1bnRpbWVfZm9yY2Vfc3VzcGVuZCwKKwkJCQlwbV9ydW50aW1lX2ZvcmNlX3Jlc3VtZSkKIAlTRVRfUlVOVElNRV9QTV9PUFMoZ3NjX3J1bnRpbWVfc3VzcGVuZCwgZ3NjX3J1bnRpbWVfcmVzdW1lLCBOVUxMKQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX3JvdGF0b3IuYyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9yb3RhdG9yLmMKaW5kZXggNDA0MzY3YS4uNjU5MWU0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX3JvdGF0b3IuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fcm90YXRvci5jCkBAIC03OTQsMjkgKzc5NCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQotI2lmZGVmIENPTkZJR19QTV9TTEVFUAotc3RhdGljIGludCByb3RhdG9yX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCByb3RfY29udGV4dCAqcm90ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlpZiAocG1fcnVudGltZV9zdXNwZW5kZWQoZGV2KSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gcm90YXRvcl9jbGtfY3J0bChyb3QsIGZhbHNlKTsKLX0KLQotc3RhdGljIGludCByb3RhdG9yX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHJvdF9jb250ZXh0ICpyb3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCWlmICghcG1fcnVudGltZV9zdXNwZW5kZWQoZGV2KSkKLQkJcmV0dXJuIHJvdGF0b3JfY2xrX2NydGwocm90LCB0cnVlKTsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KIHN0YXRpYyBpbnQgcm90YXRvcl9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCByb3RfY29udGV4dCAqcm90ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CkBAIC04MzMsNyArODEwLDggQEAKICNlbmRpZgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgcm90YXRvcl9wbV9vcHMgPSB7Ci0JU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMocm90YXRvcl9zdXNwZW5kLCByb3RhdG9yX3Jlc3VtZSkKKwlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhwbV9ydW50aW1lX2ZvcmNlX3N1c3BlbmQsCisJCQkJcG1fcnVudGltZV9mb3JjZV9yZXN1bWUpCiAJU0VUX1JVTlRJTUVfUE1fT1BTKHJvdGF0b3JfcnVudGltZV9zdXNwZW5kLCByb3RhdG9yX3J1bnRpbWVfcmVzdW1lLAogCQkJCQkJCQkJTlVMTCkKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYwppbmRleCA5NWRkZDU2Li41ZGUzNmQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMKQEAgLTEyODEsNiArMTI4MSwxMSBAQAogCiAJaW50ZWxfcnVudGltZV9wbV9lbmFibGUoZGV2X3ByaXYpOwogCisJLyogRXZlcnl0aGluZyBpcyBpbiBwbGFjZSwgd2UgY2FuIG5vdyByZWxheCEgKi8KKwlEUk1fSU5GTygiSW5pdGlhbGl6ZWQgJXMgJWQuJWQuJWQgJXMgZm9yICVzIG9uIG1pbm9yICVkXG4iLAorCQkgZHJpdmVyLm5hbWUsIGRyaXZlci5tYWpvciwgZHJpdmVyLm1pbm9yLCBkcml2ZXIucGF0Y2hsZXZlbCwKKwkJIGRyaXZlci5kYXRlLCBwY2lfbmFtZShwZGV2KSwgZGV2X3ByaXYtPmRybS5wcmltYXJ5LT5pbmRleCk7CisKIAlpbnRlbF9ydW50aW1lX3BtX3B1dChkZXZfcHJpdik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCmluZGV4IDIxZjkzOTAuLmY2OGM3ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaApAQCAtODgyLDExICs4ODIsMTIgQEAKIAogCXN0cnVjdCBpOTE1X2N0eF9oYW5nX3N0YXRzIGhhbmdfc3RhdHM7CiAKLQkvKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBjb250ZXh0LCB1c2VkIGJ5IHRoZSBodyBmb3IgdHJhY2tpbmcgKi8KIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogI2RlZmluZSBDT05URVhUX05PX1pFUk9NQVAJCUJJVCgwKQogI2RlZmluZSBDT05URVhUX05PX0VSUk9SX0NBUFRVUkUJQklUKDEpCi0JdW5zaWduZWQgaHdfaWQ7CisKKwkvKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBjb250ZXh0LCB1c2VkIGJ5IHRoZSBodyBmb3IgdHJhY2tpbmcgKi8KKwl1bnNpZ25lZCBpbnQgaHdfaWQ7CiAJdTMyIHVzZXJfaGFuZGxlOwogCiAJdTMyIGdndHRfYWxpZ25tZW50OwpAQCAtMTg1NCw2ICsxODU1LDcgQEAKIAllbnVtIG1vZGVzZXRfcmVzdG9yZSBtb2Rlc2V0X3Jlc3RvcmU7CiAJc3RydWN0IG11dGV4IG1vZGVzZXRfcmVzdG9yZV9sb2NrOwogCXN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICptb2Rlc2V0X3Jlc3RvcmVfc3RhdGU7CisJc3RydWN0IGRybV9tb2Rlc2V0X2FjcXVpcmVfY3R4IHJlc2V0X2N0eDsKIAogCXN0cnVjdCBsaXN0X2hlYWQgdm1fbGlzdDsgLyogR2xvYmFsIGxpc3Qgb2YgYWxsIGFkZHJlc3Mgc3BhY2VzICovCiAJc3RydWN0IGk5MTVfZ2d0dCBnZ3R0OyAvKiBWTSByZXByZXNlbnRpbmcgdGhlIGdsb2JhbCBhZGRyZXNzIHNwYWNlICovCkBAIC0xOTYyLDYgKzE5NjQsMTMgQEAKIAlzdHJ1Y3QgaTkxNV9zdXNwZW5kX3NhdmVkX3JlZ2lzdGVycyByZWdmaWxlOwogCXN0cnVjdCB2bHZfczBpeF9zdGF0ZSB2bHZfczBpeF9zdGF0ZTsKIAorCWVudW0geworCQlJOTE1X1NLTF9TQUdWX1VOS05PV04gPSAwLAorCQlJOTE1X1NLTF9TQUdWX0RJU0FCTEVELAorCQlJOTE1X1NLTF9TQUdWX0VOQUJMRUQsCisJCUk5MTVfU0tMX1NBR1ZfTk9UX0NPTlRST0xMRUQKKwl9IHNrbF9zYWd2X3N0YXR1czsKKwogCXN0cnVjdCB7CiAJCS8qCiAJCSAqIFJhdyB3YXRlcm1hcmsgbGF0ZW5jeSB2YWx1ZXM6CkBAIC0zNTkwLDYgKzM1OTksNyBAQAogLyogYmVsb25ncyBpbiBpOTE1X2dlbV9ndHQuaCAqLwogc3RhdGljIGlubGluZSB2b2lkIGk5MTVfZ2VtX2NoaXBzZXRfZmx1c2goc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQogeworCXdtYigpOwogCWlmIChJTlRFTF9HRU4oZGV2X3ByaXYpIDwgNikKIAkJaW50ZWxfZ3R0X2NoaXBzZXRfZmx1c2goKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCmluZGV4IDExNjgxNTAuLmE3N2NlOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYwpAQCAtODc5LDkgKzg3OSwxMiBAQAogCXJldCA9IGk5MTVfZ2VtX3NobWVtX3ByZWFkKGRldiwgb2JqLCBhcmdzLCBmaWxlKTsKIAogCS8qIHByZWFkIGZvciBub24gc2htZW0gYmFja2VkIG9iamVjdHMgKi8KLQlpZiAocmV0ID09IC1FRkFVTFQgfHwgcmV0ID09IC1FTk9ERVYpCisJaWYgKHJldCA9PSAtRUZBVUxUIHx8IHJldCA9PSAtRU5PREVWKSB7CisJCWludGVsX3J1bnRpbWVfcG1fZ2V0KHRvX2k5MTUoZGV2KSk7CiAJCXJldCA9IGk5MTVfZ2VtX2d0dF9wcmVhZChkZXYsIG9iaiwgYXJncy0+c2l6ZSwKIAkJCQkJYXJncy0+b2Zmc2V0LCBhcmdzLT5kYXRhX3B0cik7CisJCWludGVsX3J1bnRpbWVfcG1fcHV0KHRvX2k5MTUoZGV2KSk7CisJfQogCiBvdXQ6CiAJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9iai0+YmFzZSk7CkBAIC0xMzA2LDcgKzEzMDksNyBAQAogCQkgKiB0ZXh0dXJlcykuIEZhbGxiYWNrIHRvIHRoZSBzaG1lbSBwYXRoIGluIHRoYXQgY2FzZS4gKi8KIAl9CiAKLQlpZiAocmV0ID09IC1FRkFVTFQpIHsKKwlpZiAocmV0ID09IC1FRkFVTFQgfHwgcmV0ID09IC1FTk9TUEMpIHsKIAkJaWYgKG9iai0+cGh5c19oYW5kbGUpCiAJCQlyZXQgPSBpOTE1X2dlbV9waHlzX3B3cml0ZShvYmosIGFyZ3MsIGZpbGUpOwogCQllbHNlIGlmIChpOTE1X2dlbV9vYmplY3RfaGFzX3N0cnVjdF9wYWdlKG9iaikpCkBAIC0zMTY5LDYgKzMxNzIsOCBAQAogCX0KIAogCWludGVsX3JpbmdfaW5pdF9zZXFubyhlbmdpbmUsIGVuZ2luZS0+bGFzdF9zdWJtaXR0ZWRfc2Vxbm8pOworCisJZW5naW5lLT5pOTE1LT5ndC5hY3RpdmVfZW5naW5lcyAmPSB+aW50ZWxfZW5naW5lX2ZsYWcoZW5naW5lKTsKIH0KIAogdm9pZCBpOTE1X2dlbV9yZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQpAQCAtMzE4Niw2ICszMTkxLDcgQEAKIAogCWZvcl9lYWNoX2VuZ2luZShlbmdpbmUsIGRldl9wcml2KQogCQlpOTE1X2dlbV9yZXNldF9lbmdpbmVfY2xlYW51cChlbmdpbmUpOworCW1vZF9kZWxheWVkX3dvcmsoZGV2X3ByaXYtPndxLCAmZGV2X3ByaXYtPmd0LmlkbGVfd29yaywgMCk7CiAKIAlpOTE1X2dlbV9jb250ZXh0X3Jlc2V0KGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2V4ZWNidWZmZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2V4ZWNidWZmZXIuYwppbmRleCAxOTc4NjMzLi5iMzVlNWI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9leGVjYnVmZmVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZXhlY2J1ZmZlci5jCkBAIC05NDMsOCArOTQzLDYgQEAKIHsKIAljb25zdCB1bnNpZ25lZCBvdGhlcl9yaW5ncyA9IH5pbnRlbF9lbmdpbmVfZmxhZyhyZXEtPmVuZ2luZSk7CiAJc3RydWN0IGk5MTVfdm1hICp2bWE7Ci0JdWludDMyX3QgZmx1c2hfZG9tYWlucyA9IDA7Ci0JYm9vbCBmbHVzaF9jaGlwc2V0ID0gZmFsc2U7CiAJaW50IHJldDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkodm1hLCB2bWFzLCBleGVjX2xpc3QpIHsKQEAgLTk1NywxNiArOTU1LDExIEBACiAJCX0KIAogCQlpZiAob2JqLT5iYXNlLndyaXRlX2RvbWFpbiAmIEk5MTVfR0VNX0RPTUFJTl9DUFUpCi0JCQlmbHVzaF9jaGlwc2V0IHw9IGk5MTVfZ2VtX2NsZmx1c2hfb2JqZWN0KG9iaiwgZmFsc2UpOwotCi0JCWZsdXNoX2RvbWFpbnMgfD0gb2JqLT5iYXNlLndyaXRlX2RvbWFpbjsKKwkJCWk5MTVfZ2VtX2NsZmx1c2hfb2JqZWN0KG9iaiwgZmFsc2UpOwogCX0KIAotCWlmIChmbHVzaF9jaGlwc2V0KQotCQlpOTE1X2dlbV9jaGlwc2V0X2ZsdXNoKHJlcS0+ZW5naW5lLT5pOTE1KTsKLQotCWlmIChmbHVzaF9kb21haW5zICYgSTkxNV9HRU1fRE9NQUlOX0dUVCkKLQkJd21iKCk7CisJLyogVW5jb25kaXRpb25hbGx5IGZsdXNoIGFueSBjaGlwc2V0IGNhY2hlcyAoZm9yIHN0cmVhbWluZyB3cml0ZXMpLiAqLworCWk5MTVfZ2VtX2NoaXBzZXRfZmx1c2gocmVxLT5lbmdpbmUtPmk5MTUpOwogCiAJLyogVW5jb25kaXRpb25hbGx5IGludmFsaWRhdGUgZ3B1IGNhY2hlcyBhbmQgZW5zdXJlIHRoYXQgd2UgZG8gZmx1c2gKIAkgKiBhbnkgcmVzaWR1YWwgd3JpdGVzIGZyb20gdGhlIHByZXZpb3VzIGJhdGNoLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZ3R0LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYwppbmRleCAxMGYxZTMyLi5mMzhjZWZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYwpAQCAtMTIyLDggKzEyMiwxMSBAQAogCWhhc19mdWxsXzQ4Yml0X3BwZ3R0ID0KIAkgICAgICAgCUlTX0JST0FEV0VMTChkZXZfcHJpdikgfHwgSU5URUxfR0VOKGRldl9wcml2KSA+PSA5OwogCi0JaWYgKGludGVsX3ZncHVfYWN0aXZlKGRldl9wcml2KSkKLQkJaGFzX2Z1bGxfcHBndHQgPSBmYWxzZTsgLyogZW11bGF0aW9uIGlzIHRvbyBoYXJkICovCisJaWYgKGludGVsX3ZncHVfYWN0aXZlKGRldl9wcml2KSkgeworCQkvKiBlbXVsYXRpb24gaXMgdG9vIGhhcmQgKi8KKwkJaGFzX2Z1bGxfcHBndHQgPSBmYWxzZTsKKwkJaGFzX2Z1bGxfNDhiaXRfcHBndHQgPSBmYWxzZTsKKwl9CiAKIAlpZiAoIWhhc19hbGlhc2luZ19wcGd0dCkKIAkJcmV0dXJuIDA7CkBAIC0xNTgsNyArMTYxLDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKElOVEVMX0dFTihkZXZfcHJpdikgPj0gOCAmJiBpOTE1LmVuYWJsZV9leGVjbGlzdHMpCisJaWYgKElOVEVMX0dFTihkZXZfcHJpdikgPj0gOCAmJiBpOTE1LmVuYWJsZV9leGVjbGlzdHMgJiYgaGFzX2Z1bGxfcHBndHQpCiAJCXJldHVybiBoYXNfZnVsbF80OGJpdF9wcGd0dCA/IDMgOiAyOwogCWVsc2UKIAkJcmV0dXJuIGhhc19hbGlhc2luZ19wcGd0dCA/IDEgOiAwOwpAQCAtMjg3Myw2ICsyODc2LDcgQEAKIAkJc3RydWN0IGk5MTVfaHdfcHBndHQgKnBwZ3R0ID0gZGV2X3ByaXYtPm1tLmFsaWFzaW5nX3BwZ3R0OwogCiAJCXBwZ3R0LT5iYXNlLmNsZWFudXAoJnBwZ3R0LT5iYXNlKTsKKwkJa2ZyZWUocHBndHQpOwogCX0KIAogCWk5MTVfZ2VtX2NsZWFudXBfc3RvbGVuKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcuaAppbmRleCBjZTE0ZmUwLi5iZjJjYWQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmgKQEAgLTE1MzYsNiArMTUzNiw3IEBACiAjZGVmaW5lIEJBTEFOQ0VfTEVHX01BU0socG9ydCkJCSg3PDwoOCszKihwb3J0KSkpCiAvKiBCYWxhbmNlIGxlZyBkaXNhYmxlIGJpdHMgKi8KICNkZWZpbmUgQkFMQU5DRV9MRUdfRElTQUJMRV9TSElGVAkyMworI2RlZmluZSBCQUxBTkNFX0xFR19ESVNBQkxFKHBvcnQpCSgxIDw8ICgyMyArIChwb3J0KSkpCiAKIC8qCiAgKiBGZW5jZSByZWdpc3RlcnMKQEAgLTcxNDQsNiArNzE0NSwxNSBAQAogCiAjZGVmaW5lIEdFTjZfUENPREVfTUFJTEJPWAkJCV9NTUlPKDB4MTM4MTI0KQogI2RlZmluZSAgIEdFTjZfUENPREVfUkVBRFkJCQkoMTw8MzEpCisjZGVmaW5lICAgR0VONl9QQ09ERV9FUlJPUl9NQVNLCQkJMHhGRgorI2RlZmluZSAgICAgR0VONl9QQ09ERV9TVUNDRVNTCQkJMHgwCisjZGVmaW5lICAgICBHRU42X1BDT0RFX0lMTEVHQUxfQ01ECQkweDEKKyNkZWZpbmUgICAgIEdFTjZfUENPREVfTUlOX0ZSRVFfVEFCTEVfR1RfUkFUSU9fT1VUX09GX1JBTkdFIDB4MgorI2RlZmluZSAgICAgR0VONl9QQ09ERV9USU1FT1VUCQkJMHgzCisjZGVmaW5lICAgICBHRU42X1BDT0RFX1VOSU1QTEVNRU5URURfQ01ECTB4RkYKKyNkZWZpbmUgICAgIEdFTjdfUENPREVfVElNRU9VVAkJCTB4MgorI2RlZmluZSAgICAgR0VON19QQ09ERV9JTExFR0FMX0RBVEEJCTB4MworI2RlZmluZSAgICAgR0VON19QQ09ERV9NSU5fRlJFUV9UQUJMRV9HVF9SQVRJT19PVVRfT0ZfUkFOR0UgMHgxMAogI2RlZmluZQkgIEdFTjZfUENPREVfV1JJVEVfUkM2VklEUwkJMHg0CiAjZGVmaW5lCSAgR0VONl9QQ09ERV9SRUFEX1JDNlZJRFMJCTB4NQogI2RlZmluZSAgICAgR0VONl9FTkNPREVfUkM2X1ZJRChtdikJCSgoKG12KSAtIDI0NSkgLyA1KQpAQCAtNzE2NSw2ICs3MTc1LDEwIEBACiAjZGVmaW5lICAgSFNXX1BDT0RFX0RFX1dSSVRFX0ZSRVFfUkVRCQkweDE3CiAjZGVmaW5lICAgRElTUExBWV9JUFNfQ09OVFJPTAkJCTB4MTkKICNkZWZpbmUJICBIU1dfUENPREVfRFlOQU1JQ19EVVRZX0NZQ0xFX0NPTlRST0wJMHgxQQorI2RlZmluZSAgIEdFTjlfUENPREVfU0FHVl9DT05UUk9MCQkweDIxCisjZGVmaW5lICAgICBHRU45X1NBR1ZfRElTQUJMRQkJCTB4MAorI2RlZmluZSAgICAgR0VOOV9TQUdWX0lTX0RJU0FCTEVECQkweDEKKyNkZWZpbmUgICAgIEdFTjlfU0FHVl9FTkFCTEUJCQkweDMKICNkZWZpbmUgR0VONl9QQ09ERV9EQVRBCQkJCV9NTUlPKDB4MTM4MTI4KQogI2RlZmluZSAgIEdFTjZfUENPREVfRlJFUV9JQV9SQVRJT19TSElGVAk4CiAjZGVmaW5lICAgR0VONl9QQ09ERV9GUkVRX1JJTkdfUkFUSU9fU0hJRlQJMTYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdmdwdS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV92Z3B1LmMKaW5kZXggZjZhY2I1YS4uYjgxY2ZiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV92Z3B1LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV92Z3B1LmMKQEAgLTY1LDkgKzY1LDYgQEAKIAogCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IHZndF9pZikgIT0gVkdUX1BWSU5GT19TSVpFKTsKIAotCWlmICghSVNfSEFTV0VMTChkZXZfcHJpdikpCi0JCXJldHVybjsKLQogCW1hZ2ljID0gX19yYXdfaTkxNV9yZWFkNjQoZGV2X3ByaXYsIHZndGlmX3JlZyhtYWdpYykpOwogCWlmIChtYWdpYyAhPSBWR1RfTUFHSUMpCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2F1ZGlvLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9hdWRpby5jCmluZGV4IDY3MDBhN2IuLmQzMmY1ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2F1ZGlvLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfYXVkaW8uYwpAQCAtNjAwLDYgKzYwMCw4IEBACiAJaWYgKCFJU19TS1lMQUtFKGRldl9wcml2KSAmJiAhSVNfS0FCWUxBS0UoZGV2X3ByaXYpKQogCQlyZXR1cm47CiAKKwlpOTE1X2F1ZGlvX2NvbXBvbmVudF9nZXRfcG93ZXIoZGV2KTsKKwogCS8qCiAJICogRW5hYmxlL2Rpc2FibGUgZ2VuZXJhdGluZyB0aGUgY29kZWMgd2FrZSBzaWduYWwsIG92ZXJyaWRpbmcgdGhlCiAJICogaW50ZXJuYWwgbG9naWMgdG8gZ2VuZXJhdGUgdGhlIGNvZGVjIHdha2UgdG8gY29udHJvbGxlci4KQEAgLTYxNSw2ICs2MTcsOCBAQAogCQlJOTE1X1dSSVRFKEhTV19BVURfQ0hJQ0tFTkJJVCwgdG1wKTsKIAkJdXNsZWVwX3JhbmdlKDEwMDAsIDE1MDApOwogCX0KKworCWk5MTVfYXVkaW9fY29tcG9uZW50X3B1dF9wb3dlcihkZXYpOwogfQogCiAvKiBHZXQgQ0RDTEsgaW4ga0h6ICAqLwpAQCAtNjQ4LDYgKzY1Miw3IEBACiAJICAgICFJU19IQVNXRUxMKGRldl9wcml2KSkKIAkJcmV0dXJuIDA7CiAKKwlpOTE1X2F1ZGlvX2NvbXBvbmVudF9nZXRfcG93ZXIoZGV2KTsKIAltdXRleF9sb2NrKCZkZXZfcHJpdi0+YXZfbXV0ZXgpOwogCS8qIDEuIGdldCB0aGUgcGlwZSAqLwogCWludGVsX2VuY29kZXIgPSBkZXZfcHJpdi0+ZGlnX3BvcnRfbWFwW3BvcnRdOwpAQCAtNjk4LDYgKzcwMyw3IEBACiAKICB1bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+YXZfbXV0ZXgpOworCWk5MTVfYXVkaW9fY29tcG9uZW50X3B1dF9wb3dlcihkZXYpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Nzci5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfY3NyLmMKaW5kZXggM2VkYjk1OC4uYzNiMzNhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfY3NyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfY3NyLmMKQEAgLTQxLDE1ICs0MSwxNSBAQAogICogYmUgbW92ZWQgdG8gRldfRkFJTEVELgogICovCiAKLSNkZWZpbmUgSTkxNV9DU1JfS0JMICJpOTE1L2tibF9kbWNfdmVyMS5iaW4iCisjZGVmaW5lIEk5MTVfQ1NSX0tCTCAiaTkxNS9rYmxfZG1jX3ZlcjFfMDEuYmluIgogTU9EVUxFX0ZJUk1XQVJFKEk5MTVfQ1NSX0tCTCk7CiAjZGVmaW5lIEtCTF9DU1JfVkVSU0lPTl9SRVFVSVJFRAlDU1JfVkVSU0lPTigxLCAxKQogCi0jZGVmaW5lIEk5MTVfQ1NSX1NLTCAiaTkxNS9za2xfZG1jX3ZlcjEuYmluIgorI2RlZmluZSBJOTE1X0NTUl9TS0wgImk5MTUvc2tsX2RtY192ZXIxXzI2LmJpbiIKIE1PRFVMRV9GSVJNV0FSRShJOTE1X0NTUl9TS0wpOwotI2RlZmluZSBTS0xfQ1NSX1ZFUlNJT05fUkVRVUlSRUQJQ1NSX1ZFUlNJT04oMSwgMjMpCisjZGVmaW5lIFNLTF9DU1JfVkVSU0lPTl9SRVFVSVJFRAlDU1JfVkVSU0lPTigxLCAyNikKIAotI2RlZmluZSBJOTE1X0NTUl9CWFQgImk5MTUvYnh0X2RtY192ZXIxLmJpbiIKKyNkZWZpbmUgSTkxNV9DU1JfQlhUICJpOTE1L2J4dF9kbWNfdmVyMV8wNy5iaW4iCiBNT0RVTEVfRklSTVdBUkUoSTkxNV9DU1JfQlhUKTsKICNkZWZpbmUgQlhUX0NTUl9WRVJTSU9OX1JFUVVJUkVECUNTUl9WRVJTSU9OKDEsIDcpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RkaS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGRpLmMKaW5kZXggZGQxZDZmZS4uMWE3ZWZhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGRpLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGRpLmMKQEAgLTE0NSw3ICsxNDUsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBkZGlfYnVmX3RyYW5zIHNrbF91X2RkaV90cmFuc2xhdGlvbnNfZHBbXSA9IHsKIAl7IDB4MDAwMDIwMUIsIDB4MDAwMDAwQTIsIDB4MCB9LAogCXsgMHgwMDAwNTAxMiwgMHgwMDAwMDA4OCwgMHgwIH0sCi0JeyAweDgwMDA3MDExLCAweDAwMDAwMENELCAweDAgfSwKKwl7IDB4ODAwMDcwMTEsIDB4MDAwMDAwQ0QsIDB4MSB9LAogCXsgMHg4MDAwOTAxMCwgMHgwMDAwMDBDMCwgMHgxIH0sCiAJeyAweDAwMDAyMDFCLCAweDAwMDAwMDlELCAweDAgfSwKIAl7IDB4ODAwMDUwMTIsIDB4MDAwMDAwQzAsIDB4MSB9LApAQCAtMTU4LDcgKzE1OCw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGRkaV9idWZfdHJhbnMgc2tsX3lfZGRpX3RyYW5zbGF0aW9uc19kcFtdID0gewogCXsgMHgwMDAwMDAxOCwgMHgwMDAwMDBBMiwgMHgwIH0sCiAJeyAweDAwMDA1MDEyLCAweDAwMDAwMDg4LCAweDAgfSwKLQl7IDB4ODAwMDcwMTEsIDB4MDAwMDAwQ0QsIDB4MCB9LAorCXsgMHg4MDAwNzAxMSwgMHgwMDAwMDBDRCwgMHgzIH0sCiAJeyAweDgwMDA5MDEwLCAweDAwMDAwMEMwLCAweDMgfSwKIAl7IDB4MDAwMDAwMTgsIDB4MDAwMDAwOUQsIDB4MCB9LAogCXsgMHg4MDAwNTAxMiwgMHgwMDAwMDBDMCwgMHgzIH0sCkBAIC0zODgsNiArMzg4LDQwIEBACiAJfQogfQogCitzdGF0aWMgaW50IGludGVsX2RkaV9oZG1pX2xldmVsKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgZW51bSBwb3J0IHBvcnQpCit7CisJaW50IG5faGRtaV9lbnRyaWVzOworCWludCBoZG1pX2xldmVsOworCWludCBoZG1pX2RlZmF1bHRfZW50cnk7CisKKwloZG1pX2xldmVsID0gZGV2X3ByaXYtPnZidC5kZGlfcG9ydF9pbmZvW3BvcnRdLmhkbWlfbGV2ZWxfc2hpZnQ7CisKKwlpZiAoSVNfQlJPWFRPTihkZXZfcHJpdikpCisJCXJldHVybiBoZG1pX2xldmVsOworCisJaWYgKElTX1NLWUxBS0UoZGV2X3ByaXYpIHx8IElTX0tBQllMQUtFKGRldl9wcml2KSkgeworCQlza2xfZ2V0X2J1Zl90cmFuc19oZG1pKGRldl9wcml2LCAmbl9oZG1pX2VudHJpZXMpOworCQloZG1pX2RlZmF1bHRfZW50cnkgPSA4OworCX0gZWxzZSBpZiAoSVNfQlJPQURXRUxMKGRldl9wcml2KSkgeworCQluX2hkbWlfZW50cmllcyA9IEFSUkFZX1NJWkUoYmR3X2RkaV90cmFuc2xhdGlvbnNfaGRtaSk7CisJCWhkbWlfZGVmYXVsdF9lbnRyeSA9IDc7CisJfSBlbHNlIGlmIChJU19IQVNXRUxMKGRldl9wcml2KSkgeworCQluX2hkbWlfZW50cmllcyA9IEFSUkFZX1NJWkUoaHN3X2RkaV90cmFuc2xhdGlvbnNfaGRtaSk7CisJCWhkbWlfZGVmYXVsdF9lbnRyeSA9IDY7CisJfSBlbHNlIHsKKwkJV0FSTigxLCAiZGRpIHRyYW5zbGF0aW9uIHRhYmxlIG1pc3NpbmdcbiIpOworCQluX2hkbWlfZW50cmllcyA9IEFSUkFZX1NJWkUoYmR3X2RkaV90cmFuc2xhdGlvbnNfaGRtaSk7CisJCWhkbWlfZGVmYXVsdF9lbnRyeSA9IDc7CisJfQorCisJLyogQ2hvb3NlIGEgZ29vZCBkZWZhdWx0IGlmIFZCVCBpcyBiYWRseSBwb3B1bGF0ZWQgKi8KKwlpZiAoaGRtaV9sZXZlbCA9PSBIRE1JX0xFVkVMX1NISUZUX1VOS05PV04gfHwKKwkgICAgaGRtaV9sZXZlbCA+PSBuX2hkbWlfZW50cmllcykKKwkJaGRtaV9sZXZlbCA9IGhkbWlfZGVmYXVsdF9lbnRyeTsKKworCXJldHVybiBoZG1pX2xldmVsOworfQorCiAvKgogICogU3RhcnRpbmcgd2l0aCBIYXN3ZWxsLCBEREkgcG9ydCBidWZmZXJzIG11c3QgYmUgcHJvZ3JhbW1lZCB3aXRoIGNvcnJlY3QKICAqIHZhbHVlcyBpbiBhZHZhbmNlLiBUaGUgYnVmZmVyIHZhbHVlcyBhcmUgZGlmZmVyZW50IGZvciBGREkgYW5kIERQIG1vZGVzLApAQCAtMzk5LDcgKzQzMyw3IEBACiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkxNShlbmNvZGVyLT5iYXNlLmRldik7CiAJdTMyIGlib29zdF9iaXQgPSAwOwotCWludCBpLCBuX2hkbWlfZW50cmllcywgbl9kcF9lbnRyaWVzLCBuX2VkcF9lbnRyaWVzLCBoZG1pX2RlZmF1bHRfZW50cnksCisJaW50IGksIG5faGRtaV9lbnRyaWVzLCBuX2RwX2VudHJpZXMsIG5fZWRwX2VudHJpZXMsCiAJICAgIHNpemU7CiAJaW50IGhkbWlfbGV2ZWw7CiAJZW51bSBwb3J0IHBvcnQ7CkBAIC00MTAsNyArNDQ0LDcgQEAKIAljb25zdCBzdHJ1Y3QgZGRpX2J1Zl90cmFucyAqZGRpX3RyYW5zbGF0aW9uczsKIAogCXBvcnQgPSBpbnRlbF9kZGlfZ2V0X2VuY29kZXJfcG9ydChlbmNvZGVyKTsKLQloZG1pX2xldmVsID0gZGV2X3ByaXYtPnZidC5kZGlfcG9ydF9pbmZvW3BvcnRdLmhkbWlfbGV2ZWxfc2hpZnQ7CisJaGRtaV9sZXZlbCA9IGludGVsX2RkaV9oZG1pX2xldmVsKGRldl9wcml2LCBwb3J0KTsKIAogCWlmIChJU19CUk9YVE9OKGRldl9wcml2KSkgewogCQlpZiAoZW5jb2Rlci0+dHlwZSAhPSBJTlRFTF9PVVRQVVRfSERNSSkKQEAgLTQzMCw3ICs0NjQsNiBAQAogCQkJCXNrbF9nZXRfYnVmX3RyYW5zX2VkcChkZXZfcHJpdiwgJm5fZWRwX2VudHJpZXMpOwogCQlkZGlfdHJhbnNsYXRpb25zX2hkbWkgPQogCQkJCXNrbF9nZXRfYnVmX3RyYW5zX2hkbWkoZGV2X3ByaXYsICZuX2hkbWlfZW50cmllcyk7Ci0JCWhkbWlfZGVmYXVsdF9lbnRyeSA9IDg7CiAJCS8qIElmIHdlJ3JlIGJvb3N0aW5nIHRoZSBjdXJyZW50LCBzZXQgYml0IDMxIG9mIHRyYW5zMSAqLwogCQlpZiAoZGV2X3ByaXYtPnZidC5kZGlfcG9ydF9pbmZvW3BvcnRdLmhkbWlfYm9vc3RfbGV2ZWwgfHwKIAkJICAgIGRldl9wcml2LT52YnQuZGRpX3BvcnRfaW5mb1twb3J0XS5kcF9ib29zdF9sZXZlbCkKQEAgLTQ1Niw3ICs0ODksNiBAQAogCiAJCW5fZHBfZW50cmllcyA9IEFSUkFZX1NJWkUoYmR3X2RkaV90cmFuc2xhdGlvbnNfZHApOwogCQluX2hkbWlfZW50cmllcyA9IEFSUkFZX1NJWkUoYmR3X2RkaV90cmFuc2xhdGlvbnNfaGRtaSk7Ci0JCWhkbWlfZGVmYXVsdF9lbnRyeSA9IDc7CiAJfSBlbHNlIGlmIChJU19IQVNXRUxMKGRldl9wcml2KSkgewogCQlkZGlfdHJhbnNsYXRpb25zX2ZkaSA9IGhzd19kZGlfdHJhbnNsYXRpb25zX2ZkaTsKIAkJZGRpX3RyYW5zbGF0aW9uc19kcCA9IGhzd19kZGlfdHJhbnNsYXRpb25zX2RwOwpAQCAtNDY0LDcgKzQ5Niw2IEBACiAJCWRkaV90cmFuc2xhdGlvbnNfaGRtaSA9IGhzd19kZGlfdHJhbnNsYXRpb25zX2hkbWk7CiAJCW5fZHBfZW50cmllcyA9IG5fZWRwX2VudHJpZXMgPSBBUlJBWV9TSVpFKGhzd19kZGlfdHJhbnNsYXRpb25zX2RwKTsKIAkJbl9oZG1pX2VudHJpZXMgPSBBUlJBWV9TSVpFKGhzd19kZGlfdHJhbnNsYXRpb25zX2hkbWkpOwotCQloZG1pX2RlZmF1bHRfZW50cnkgPSA2OwogCX0gZWxzZSB7CiAJCVdBUk4oMSwgImRkaSB0cmFuc2xhdGlvbiB0YWJsZSBtaXNzaW5nXG4iKTsKIAkJZGRpX3RyYW5zbGF0aW9uc19lZHAgPSBiZHdfZGRpX3RyYW5zbGF0aW9uc19kcDsKQEAgLTQ3NCw3ICs1MDUsNiBAQAogCQluX2VkcF9lbnRyaWVzID0gQVJSQVlfU0laRShiZHdfZGRpX3RyYW5zbGF0aW9uc19lZHApOwogCQluX2RwX2VudHJpZXMgPSBBUlJBWV9TSVpFKGJkd19kZGlfdHJhbnNsYXRpb25zX2RwKTsKIAkJbl9oZG1pX2VudHJpZXMgPSBBUlJBWV9TSVpFKGJkd19kZGlfdHJhbnNsYXRpb25zX2hkbWkpOwotCQloZG1pX2RlZmF1bHRfZW50cnkgPSA3OwogCX0KIAogCXN3aXRjaCAoZW5jb2Rlci0+dHlwZSkgewpAQCAtNTA1LDExICs1MzUsNiBAQAogCWlmIChlbmNvZGVyLT50eXBlICE9IElOVEVMX09VVFBVVF9IRE1JKQogCQlyZXR1cm47CiAKLQkvKiBDaG9vc2UgYSBnb29kIGRlZmF1bHQgaWYgVkJUIGlzIGJhZGx5IHBvcHVsYXRlZCAqLwotCWlmIChoZG1pX2xldmVsID09IEhETUlfTEVWRUxfU0hJRlRfVU5LTk9XTiB8fAotCSAgICBoZG1pX2xldmVsID49IG5faGRtaV9lbnRyaWVzKQotCQloZG1pX2xldmVsID0gaGRtaV9kZWZhdWx0X2VudHJ5OwotCiAJLyogRW50cnkgOSBpcyBmb3IgSERNSTogKi8KIAlJOTE1X1dSSVRFKERESV9CVUZfVFJBTlNfTE8ocG9ydCwgaSksCiAJCSAgIGRkaV90cmFuc2xhdGlvbnNfaGRtaVtoZG1pX2xldmVsXS50cmFuczEgfCBpYm9vc3RfYml0KTsKQEAgLTEzNzksMTQgKzE0MDQsMzAgQEAKIAkJCSAgIFRSQU5TX0NMS19TRUxfRElTQUJMRUQpOwogfQogCi1zdGF0aWMgdm9pZCBza2xfZGRpX3NldF9pYm9vc3Qoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAotCQkJICAgICAgIHUzMiBsZXZlbCwgZW51bSBwb3J0IHBvcnQsIGludCB0eXBlKQorc3RhdGljIHZvaWQgX3NrbF9kZGlfc2V0X2lib29zdChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJZW51bSBwb3J0IHBvcnQsIHVpbnQ4X3QgaWJvb3N0KQogeworCXUzMiB0bXA7CisKKwl0bXAgPSBJOTE1X1JFQUQoRElTUElPX0NSX1RYX0JNVV9DUjApOworCXRtcCAmPSB+KEJBTEFOQ0VfTEVHX01BU0socG9ydCkgfCBCQUxBTkNFX0xFR19ESVNBQkxFKHBvcnQpKTsKKwlpZiAoaWJvb3N0KQorCQl0bXAgfD0gaWJvb3N0IDw8IEJBTEFOQ0VfTEVHX1NISUZUKHBvcnQpOworCWVsc2UKKwkJdG1wIHw9IEJBTEFOQ0VfTEVHX0RJU0FCTEUocG9ydCk7CisJSTkxNV9XUklURShESVNQSU9fQ1JfVFhfQk1VX0NSMCwgdG1wKTsKK30KKworc3RhdGljIHZvaWQgc2tsX2RkaV9zZXRfaWJvb3N0KHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyLCB1MzIgbGV2ZWwpCit7CisJc3RydWN0IGludGVsX2RpZ2l0YWxfcG9ydCAqaW50ZWxfZGlnX3BvcnQgPSBlbmNfdG9fZGlnX3BvcnQoJmVuY29kZXItPmJhc2UpOworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHRvX2k5MTUoaW50ZWxfZGlnX3BvcnQtPmJhc2UuYmFzZS5kZXYpOworCWVudW0gcG9ydCBwb3J0ID0gaW50ZWxfZGlnX3BvcnQtPnBvcnQ7CisJaW50IHR5cGUgPSBlbmNvZGVyLT50eXBlOwogCWNvbnN0IHN0cnVjdCBkZGlfYnVmX3RyYW5zICpkZGlfdHJhbnNsYXRpb25zOwogCXVpbnQ4X3QgaWJvb3N0OwogCXVpbnQ4X3QgZHBfaWJvb3N0LCBoZG1pX2lib29zdDsKIAlpbnQgbl9lbnRyaWVzOwotCXUzMiByZWc7CiAKIAkvKiBWQlQgbWF5IG92ZXJyaWRlIHN0YW5kYXJkIGJvb3N0IHZhbHVlcyAqLwogCWRwX2lib29zdCA9IGRldl9wcml2LT52YnQuZGRpX3BvcnRfaW5mb1twb3J0XS5kcF9ib29zdF9sZXZlbDsKQEAgLTE0MjgsMTYgKzE0NjksMTAgQEAKIAkJcmV0dXJuOwogCX0KIAotCXJlZyA9IEk5MTVfUkVBRChESVNQSU9fQ1JfVFhfQk1VX0NSMCk7Ci0JcmVnICY9IH5CQUxBTkNFX0xFR19NQVNLKHBvcnQpOwotCXJlZyAmPSB+KDEgPDwgKEJBTEFOQ0VfTEVHX0RJU0FCTEVfU0hJRlQgKyBwb3J0KSk7CisJX3NrbF9kZGlfc2V0X2lib29zdChkZXZfcHJpdiwgcG9ydCwgaWJvb3N0KTsKIAotCWlmIChpYm9vc3QpCi0JCXJlZyB8PSBpYm9vc3QgPDwgQkFMQU5DRV9MRUdfU0hJRlQocG9ydCk7Ci0JZWxzZQotCQlyZWcgfD0gMSA8PCAoQkFMQU5DRV9MRUdfRElTQUJMRV9TSElGVCArIHBvcnQpOwotCi0JSTkxNV9XUklURShESVNQSU9fQ1JfVFhfQk1VX0NSMCwgcmVnKTsKKwlpZiAocG9ydCA9PSBQT1JUX0EgJiYgaW50ZWxfZGlnX3BvcnQtPm1heF9sYW5lcyA9PSA0KQorCQlfc2tsX2RkaV9zZXRfaWJvb3N0KGRldl9wcml2LCBQT1JUX0UsIGlib29zdCk7CiB9CiAKIHN0YXRpYyB2b2lkIGJ4dF9kZGlfdnN3aW5nX3NlcXVlbmNlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKQEAgLTE1NjgsNyArMTYwMyw3IEBACiAJbGV2ZWwgPSB0cmFuc2xhdGVfc2lnbmFsX2xldmVsKHNpZ25hbF9sZXZlbHMpOwogCiAJaWYgKElTX1NLWUxBS0UoZGV2X3ByaXYpIHx8IElTX0tBQllMQUtFKGRldl9wcml2KSkKLQkJc2tsX2RkaV9zZXRfaWJvb3N0KGRldl9wcml2LCBsZXZlbCwgcG9ydCwgZW5jb2Rlci0+dHlwZSk7CisJCXNrbF9kZGlfc2V0X2lib29zdChlbmNvZGVyLCBsZXZlbCk7CiAJZWxzZSBpZiAoSVNfQlJPWFRPTihkZXZfcHJpdikpCiAJCWJ4dF9kZGlfdnN3aW5nX3NlcXVlbmNlKGRldl9wcml2LCBsZXZlbCwgcG9ydCwgZW5jb2Rlci0+dHlwZSk7CiAKQEAgLTE2MzcsNiArMTY3MiwxMCBAQAogCQkJaW50ZWxfZHBfc3RvcF9saW5rX3RyYWluKGludGVsX2RwKTsKIAl9IGVsc2UgaWYgKHR5cGUgPT0gSU5URUxfT1VUUFVUX0hETUkpIHsKIAkJc3RydWN0IGludGVsX2hkbWkgKmludGVsX2hkbWkgPSBlbmNfdG9faW50ZWxfaGRtaShlbmNvZGVyKTsKKwkJaW50IGxldmVsID0gaW50ZWxfZGRpX2hkbWlfbGV2ZWwoZGV2X3ByaXYsIHBvcnQpOworCisJCWlmIChJU19TS1lMQUtFKGRldl9wcml2KSB8fCBJU19LQUJZTEFLRShkZXZfcHJpdikpCisJCQlza2xfZGRpX3NldF9pYm9vc3QoaW50ZWxfZW5jb2RlciwgbGV2ZWwpOwogCiAJCWludGVsX2hkbWktPnNldF9pbmZvZnJhbWVzKGVuY29kZXIsCiAJCQkJCSAgIGNydGMtPmNvbmZpZy0+aGFzX2hkbWlfc2luaywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYwppbmRleCBkY2Y5M2IzLi4xNzU1OTVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jCkBAIC0zMDkzLDQwICszMDkzLDExMCBAQAogCiAJZm9yX2VhY2hfY3J0YyhkZXYsIGNydGMpIHsKIAkJc3RydWN0IGludGVsX3BsYW5lICpwbGFuZSA9IHRvX2ludGVsX3BsYW5lKGNydGMtPnByaW1hcnkpOwotCQlzdHJ1Y3QgaW50ZWxfcGxhbmVfc3RhdGUgKnBsYW5lX3N0YXRlOwotCi0JCWRybV9tb2Rlc2V0X2xvY2tfY3J0YyhjcnRjLCAmcGxhbmUtPmJhc2UpOwotCQlwbGFuZV9zdGF0ZSA9IHRvX2ludGVsX3BsYW5lX3N0YXRlKHBsYW5lLT5iYXNlLnN0YXRlKTsKKwkJc3RydWN0IGludGVsX3BsYW5lX3N0YXRlICpwbGFuZV9zdGF0ZSA9CisJCQl0b19pbnRlbF9wbGFuZV9zdGF0ZShwbGFuZS0+YmFzZS5zdGF0ZSk7CiAKIAkJaWYgKHBsYW5lX3N0YXRlLT52aXNpYmxlKQogCQkJcGxhbmUtPnVwZGF0ZV9wbGFuZSgmcGxhbmUtPmJhc2UsCiAJCQkJCSAgICB0b19pbnRlbF9jcnRjX3N0YXRlKGNydGMtPnN0YXRlKSwKIAkJCQkJICAgIHBsYW5lX3N0YXRlKTsKLQotCQlkcm1fbW9kZXNldF91bmxvY2tfY3J0YyhjcnRjKTsKIAl9CiB9CiAKK3N0YXRpYyBpbnQKK19faW50ZWxfZGlzcGxheV9yZXN1bWUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKmNydGNfc3RhdGU7CisJc3RydWN0IGRybV9jcnRjICpjcnRjOworCWludCBpLCByZXQ7CisKKwlpbnRlbF9tb2Rlc2V0X3NldHVwX2h3X3N0YXRlKGRldik7CisJaTkxNV9yZWRpc2FibGVfdmdhKGRldik7CisKKwlpZiAoIXN0YXRlKQorCQlyZXR1cm4gMDsKKworCWZvcl9lYWNoX2NydGNfaW5fc3RhdGUoc3RhdGUsIGNydGMsIGNydGNfc3RhdGUsIGkpIHsKKwkJLyoKKwkJICogRm9yY2UgcmVjYWxjdWxhdGlvbiBldmVuIGlmIHdlIHJlc3RvcmUKKwkJICogY3VycmVudCBzdGF0ZS4gV2l0aCBmYXN0IG1vZGVzZXQgdGhpcyBtYXkgbm90IHJlc3VsdAorCQkgKiBpbiBhIG1vZGVzZXQgd2hlbiB0aGUgc3RhdGUgaXMgY29tcGF0aWJsZS4KKwkJICovCisJCWNydGNfc3RhdGUtPm1vZGVfY2hhbmdlZCA9IHRydWU7CisJfQorCisJLyogaWdub3JlIGFueSByZXNldCB2YWx1ZXMvQklPUyBsZWZ0b3ZlcnMgaW4gdGhlIFdNIHJlZ2lzdGVycyAqLworCXRvX2ludGVsX2F0b21pY19zdGF0ZShzdGF0ZSktPnNraXBfaW50ZXJtZWRpYXRlX3dtID0gdHJ1ZTsKKworCXJldCA9IGRybV9hdG9taWNfY29tbWl0KHN0YXRlKTsKKworCVdBUk5fT04ocmV0ID09IC1FREVBRExLKTsKKwlyZXR1cm4gcmV0OworfQorCiB2b2lkIGludGVsX3ByZXBhcmVfcmVzZXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQogeworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSAmZGV2X3ByaXYtPmRybTsKKwlzdHJ1Y3QgZHJtX21vZGVzZXRfYWNxdWlyZV9jdHggKmN0eCA9ICZkZXZfcHJpdi0+cmVzZXRfY3R4OworCXN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZTsKKwlpbnQgcmV0OworCiAJLyogbm8gcmVzZXQgc3VwcG9ydCBmb3IgZ2VuMiAqLwogCWlmIChJU19HRU4yKGRldl9wcml2KSkKIAkJcmV0dXJuOwogCi0JLyogcmVzZXQgZG9lc24ndCB0b3VjaCB0aGUgZGlzcGxheSAqLworCS8qCisJICogTmVlZCBtb2RlX2NvbmZpZy5tdXRleCBzbyB0aGF0IHdlIGRvbid0CisJICogdHJhbXBsZSBvbmdvaW5nIC0+ZGV0ZWN0KCkgYW5kIHdoYXRub3QuCisJICovCisJbXV0ZXhfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CisJZHJtX21vZGVzZXRfYWNxdWlyZV9pbml0KGN0eCwgMCk7CisJd2hpbGUgKDEpIHsKKwkJcmV0ID0gZHJtX21vZGVzZXRfbG9ja19hbGxfY3R4KGRldiwgY3R4KTsKKwkJaWYgKHJldCAhPSAtRURFQURMSykKKwkJCWJyZWFrOworCisJCWRybV9tb2Rlc2V0X2JhY2tvZmYoY3R4KTsKKwl9CisKKwkvKiByZXNldCBkb2Vzbid0IHRvdWNoIHRoZSBkaXNwbGF5LCBidXQgZmxpcHMgbWlnaHQgZ2V0IG51a2VkIGFueXdheSwgKi8KIAlpZiAoSU5URUxfR0VOKGRldl9wcml2KSA+PSA1IHx8IElTX0c0WChkZXZfcHJpdikpCiAJCXJldHVybjsKIAotCWRybV9tb2Rlc2V0X2xvY2tfYWxsKCZkZXZfcHJpdi0+ZHJtKTsKIAkvKgogCSAqIERpc2FibGluZyB0aGUgY3J0Y3MgZ3JhY2VmdWxseSBzZWVtcyBuaWNlci4gQWxzbyB0aGUKIAkgKiBnMzMgZG9jcyBzYXkgd2Ugc2hvdWxkIGF0IGxlYXN0IGRpc2FibGUgYWxsIHRoZSBwbGFuZXMuCiAJICovCi0JaW50ZWxfZGlzcGxheV9zdXNwZW5kKCZkZXZfcHJpdi0+ZHJtKTsKKwlzdGF0ZSA9IGRybV9hdG9taWNfaGVscGVyX2R1cGxpY2F0ZV9zdGF0ZShkZXYsIGN0eCk7CisJaWYgKElTX0VSUihzdGF0ZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihzdGF0ZSk7CisJCXN0YXRlID0gTlVMTDsKKwkJRFJNX0VSUk9SKCJEdXBsaWNhdGluZyBzdGF0ZSBmYWlsZWQgd2l0aCAlaVxuIiwgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gZHJtX2F0b21pY19oZWxwZXJfZGlzYWJsZV9hbGwoZGV2LCBjdHgpOworCWlmIChyZXQpIHsKKwkJRFJNX0VSUk9SKCJTdXNwZW5kaW5nIGNydGMncyBmYWlsZWQgd2l0aCAlaVxuIiwgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJZGV2X3ByaXYtPm1vZGVzZXRfcmVzdG9yZV9zdGF0ZSA9IHN0YXRlOworCXN0YXRlLT5hY3F1aXJlX2N0eCA9IGN0eDsKKwlyZXR1cm47CisKK2VycjoKKwlkcm1fYXRvbWljX3N0YXRlX2ZyZWUoc3RhdGUpOwogfQogCiB2b2lkIGludGVsX2ZpbmlzaF9yZXNldChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCiB7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9ICZkZXZfcHJpdi0+ZHJtOworCXN0cnVjdCBkcm1fbW9kZXNldF9hY3F1aXJlX2N0eCAqY3R4ID0gJmRldl9wcml2LT5yZXNldF9jdHg7CisJc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlID0gZGV2X3ByaXYtPm1vZGVzZXRfcmVzdG9yZV9zdGF0ZTsKKwlpbnQgcmV0OworCiAJLyoKIAkgKiBGbGlwcyBpbiB0aGUgcmluZ3Mgd2lsbCBiZSBudWtlZCBieSB0aGUgcmVzZXQsCiAJICogc28gY29tcGxldGUgYWxsIHBlbmRpbmcgZmxpcHMgc28gdGhhdCB1c2VyIHNwYWNlCkBAIC0zMTM4LDYgKzMyMDgsOCBAQAogCWlmIChJU19HRU4yKGRldl9wcml2KSkKIAkJcmV0dXJuOwogCisJZGV2X3ByaXYtPm1vZGVzZXRfcmVzdG9yZV9zdGF0ZSA9IE5VTEw7CisKIAkvKiByZXNldCBkb2Vzbid0IHRvdWNoIHRoZSBkaXNwbGF5ICovCiAJaWYgKElOVEVMX0dFTihkZXZfcHJpdikgPj0gNSB8fCBJU19HNFgoZGV2X3ByaXYpKSB7CiAJCS8qCkBAIC0zMTQ5LDI5ICszMjIxLDMyIEBACiAJCSAqIEZJWE1FOiBBdG9taWMgd2lsbCBtYWtlIHRoaXMgb2Jzb2xldGUgc2luY2Ugd2Ugd29uJ3Qgc2NoZWR1bGUKIAkJICogQ1MtYmFzZWQgZmxpcHMgKHdoaWNoIG1pZ2h0IGdldCBsb3N0IGluIGdwdSByZXNldHMpIGFueSBtb3JlLgogCQkgKi8KLQkJaW50ZWxfdXBkYXRlX3ByaW1hcnlfcGxhbmVzKCZkZXZfcHJpdi0+ZHJtKTsKLQkJcmV0dXJuOworCQlpbnRlbF91cGRhdGVfcHJpbWFyeV9wbGFuZXMoZGV2KTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGUgZGlzcGxheSBoYXMgYmVlbiByZXNldCBhcyB3ZWxsLAorCQkgKiBzbyBuZWVkIGEgZnVsbCByZS1pbml0aWFsaXphdGlvbi4KKwkJICovCisJCWludGVsX3J1bnRpbWVfcG1fZGlzYWJsZV9pbnRlcnJ1cHRzKGRldl9wcml2KTsKKwkJaW50ZWxfcnVudGltZV9wbV9lbmFibGVfaW50ZXJydXB0cyhkZXZfcHJpdik7CisKKwkJaW50ZWxfbW9kZXNldF9pbml0X2h3KGRldik7CisKKwkJc3Bpbl9sb2NrX2lycSgmZGV2X3ByaXYtPmlycV9sb2NrKTsKKwkJaWYgKGRldl9wcml2LT5kaXNwbGF5LmhwZF9pcnFfc2V0dXApCisJCQlkZXZfcHJpdi0+ZGlzcGxheS5ocGRfaXJxX3NldHVwKGRldl9wcml2KTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZkZXZfcHJpdi0+aXJxX2xvY2spOworCisJCXJldCA9IF9faW50ZWxfZGlzcGxheV9yZXN1bWUoZGV2LCBzdGF0ZSk7CisJCWlmIChyZXQpCisJCQlEUk1fRVJST1IoIlJlc3RvcmluZyBvbGQgc3RhdGUgZmFpbGVkIHdpdGggJWlcbiIsIHJldCk7CisKKwkJaW50ZWxfaHBkX2luaXQoZGV2X3ByaXYpOwogCX0KIAotCS8qCi0JICogVGhlIGRpc3BsYXkgaGFzIGJlZW4gcmVzZXQgYXMgd2VsbCwKLQkgKiBzbyBuZWVkIGEgZnVsbCByZS1pbml0aWFsaXphdGlvbi4KLQkgKi8KLQlpbnRlbF9ydW50aW1lX3BtX2Rpc2FibGVfaW50ZXJydXB0cyhkZXZfcHJpdik7Ci0JaW50ZWxfcnVudGltZV9wbV9lbmFibGVfaW50ZXJydXB0cyhkZXZfcHJpdik7Ci0KLQlpbnRlbF9tb2Rlc2V0X2luaXRfaHcoJmRldl9wcml2LT5kcm0pOwotCi0Jc3Bpbl9sb2NrX2lycSgmZGV2X3ByaXYtPmlycV9sb2NrKTsKLQlpZiAoZGV2X3ByaXYtPmRpc3BsYXkuaHBkX2lycV9zZXR1cCkKLQkJZGV2X3ByaXYtPmRpc3BsYXkuaHBkX2lycV9zZXR1cChkZXZfcHJpdik7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZkZXZfcHJpdi0+aXJxX2xvY2spOwotCi0JaW50ZWxfZGlzcGxheV9yZXN1bWUoJmRldl9wcml2LT5kcm0pOwotCi0JaW50ZWxfaHBkX2luaXQoZGV2X3ByaXYpOwotCi0JZHJtX21vZGVzZXRfdW5sb2NrX2FsbCgmZGV2X3ByaXYtPmRybSk7CisJZHJtX21vZGVzZXRfZHJvcF9sb2NrcyhjdHgpOworCWRybV9tb2Rlc2V0X2FjcXVpcmVfZmluaShjdHgpOworCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CiB9CiAKIHN0YXRpYyBib29sIGludGVsX2NydGNfaGFzX3BlbmRpbmdfZmxpcChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCkBAIC0xMzY4NCw2ICsxMzc1OSwxMyBAQAogCQkgICAgIGludGVsX3N0YXRlLT5jZGNsa19wbGxfdmNvICE9IGRldl9wcml2LT5jZGNsa19wbGwudmNvKSkKIAkJCWRldl9wcml2LT5kaXNwbGF5Lm1vZGVzZXRfY29tbWl0X2NkY2xrKHN0YXRlKTsKIAorCQkvKgorCQkgKiBTS0wgd29ya2Fyb3VuZDogYnNwZWMgcmVjb21tZW5kcyB3ZSBkaXNhYmxlIHRoZSBTQUdWIHdoZW4gd2UKKwkJICogaGF2ZSBtb3JlIHRoZW4gb25lIHBpcGUgZW5hYmxlZAorCQkgKi8KKwkJaWYgKElTX1NLWUxBS0UoZGV2X3ByaXYpICYmICFza2xfY2FuX2VuYWJsZV9zYWd2KHN0YXRlKSkKKwkJCXNrbF9kaXNhYmxlX3NhZ3YoZGV2X3ByaXYpOworCiAJCWludGVsX21vZGVzZXRfdmVyaWZ5X2Rpc2FibGVkKGRldik7CiAJfQogCkBAIC0xMzc1Nyw2ICsxMzgzOSwxMCBAQAogCQlpbnRlbF9tb2Rlc2V0X3ZlcmlmeV9jcnRjKGNydGMsIG9sZF9jcnRjX3N0YXRlLCBjcnRjLT5zdGF0ZSk7CiAJfQogCisJaWYgKElTX1NLWUxBS0UoZGV2X3ByaXYpICYmIGludGVsX3N0YXRlLT5tb2Rlc2V0ICYmCisJICAgIHNrbF9jYW5fZW5hYmxlX3NhZ3Yoc3RhdGUpKQorCQlza2xfZW5hYmxlX3NhZ3YoZGV2X3ByaXYpOworCiAJZHJtX2F0b21pY19oZWxwZXJfY29tbWl0X2h3X2RvbmUoc3RhdGUpOwogCiAJaWYgKGludGVsX3N0YXRlLT5tb2Rlc2V0KQpAQCAtMTYxNTYsOSArMTYyNDIsMTAgQEAKIAlzdHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqc3RhdGUgPSBkZXZfcHJpdi0+bW9kZXNldF9yZXN0b3JlX3N0YXRlOwogCXN0cnVjdCBkcm1fbW9kZXNldF9hY3F1aXJlX2N0eCBjdHg7CiAJaW50IHJldDsKLQlib29sIHNldHVwID0gZmFsc2U7CiAKIAlkZXZfcHJpdi0+bW9kZXNldF9yZXN0b3JlX3N0YXRlID0gTlVMTDsKKwlpZiAoc3RhdGUpCisJCXN0YXRlLT5hY3F1aXJlX2N0eCA9ICZjdHg7CiAKIAkvKgogCSAqIFRoaXMgaXMgYSBjbHVkZ2UgYmVjYXVzZSB3aXRoIHJlYWwgYXRvbWljIG1vZGVzZXQgbW9kZV9jb25maWcubXV0ZXgKQEAgLTE2MTY5LDQzICsxNjI1NiwxNyBAQAogCW11dGV4X2xvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOwogCWRybV9tb2Rlc2V0X2FjcXVpcmVfaW5pdCgmY3R4LCAwKTsKIAotcmV0cnk6Ci0JcmV0ID0gZHJtX21vZGVzZXRfbG9ja19hbGxfY3R4KGRldiwgJmN0eCk7CisJd2hpbGUgKDEpIHsKKwkJcmV0ID0gZHJtX21vZGVzZXRfbG9ja19hbGxfY3R4KGRldiwgJmN0eCk7CisJCWlmIChyZXQgIT0gLUVERUFETEspCisJCQlicmVhazsKIAotCWlmIChyZXQgPT0gMCAmJiAhc2V0dXApIHsKLQkJc2V0dXAgPSB0cnVlOwotCi0JCWludGVsX21vZGVzZXRfc2V0dXBfaHdfc3RhdGUoZGV2KTsKLQkJaTkxNV9yZWRpc2FibGVfdmdhKGRldik7Ci0JfQotCi0JaWYgKHJldCA9PSAwICYmIHN0YXRlKSB7Ci0JCXN0cnVjdCBkcm1fY3J0Y19zdGF0ZSAqY3J0Y19zdGF0ZTsKLQkJc3RydWN0IGRybV9jcnRjICpjcnRjOwotCQlpbnQgaTsKLQotCQlzdGF0ZS0+YWNxdWlyZV9jdHggPSAmY3R4OwotCi0JCS8qIGlnbm9yZSBhbnkgcmVzZXQgdmFsdWVzL0JJT1MgbGVmdG92ZXJzIGluIHRoZSBXTSByZWdpc3RlcnMgKi8KLQkJdG9faW50ZWxfYXRvbWljX3N0YXRlKHN0YXRlKS0+c2tpcF9pbnRlcm1lZGlhdGVfd20gPSB0cnVlOwotCi0JCWZvcl9lYWNoX2NydGNfaW5fc3RhdGUoc3RhdGUsIGNydGMsIGNydGNfc3RhdGUsIGkpIHsKLQkJCS8qCi0JCQkgKiBGb3JjZSByZWNhbGN1bGF0aW9uIGV2ZW4gaWYgd2UgcmVzdG9yZQotCQkJICogY3VycmVudCBzdGF0ZS4gV2l0aCBmYXN0IG1vZGVzZXQgdGhpcyBtYXkgbm90IHJlc3VsdAotCQkJICogaW4gYSBtb2Rlc2V0IHdoZW4gdGhlIHN0YXRlIGlzIGNvbXBhdGlibGUuCi0JCQkgKi8KLQkJCWNydGNfc3RhdGUtPm1vZGVfY2hhbmdlZCA9IHRydWU7Ci0JCX0KLQotCQlyZXQgPSBkcm1fYXRvbWljX2NvbW1pdChzdGF0ZSk7Ci0JfQotCi0JaWYgKHJldCA9PSAtRURFQURMSykgewogCQlkcm1fbW9kZXNldF9iYWNrb2ZmKCZjdHgpOwotCQlnb3RvIHJldHJ5OwogCX0KIAorCWlmICghcmV0KQorCQlyZXQgPSBfX2ludGVsX2Rpc3BsYXlfcmVzdW1lKGRldiwgc3RhdGUpOworCiAJZHJtX21vZGVzZXRfZHJvcF9sb2NrcygmY3R4KTsKIAlkcm1fbW9kZXNldF9hY3F1aXJlX2ZpbmkoJmN0eCk7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLm11dGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKaW5kZXggY2M5MzdhMS4uZmYzOTliOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKQEAgLTE3MTYsNiArMTcxNiw5IEBACiB2b2lkIHNrbF93bV9nZXRfaHdfc3RhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiB2b2lkIHNrbF9kZGJfZ2V0X2h3X3N0YXRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKIAkJCSAgc3RydWN0IHNrbF9kZGJfYWxsb2NhdGlvbiAqZGRiIC8qIG91dCAqLyk7Citib29sIHNrbF9jYW5fZW5hYmxlX3NhZ3Yoc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlKTsKK2ludCBza2xfZW5hYmxlX3NhZ3Yoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKK2ludCBza2xfZGlzYWJsZV9zYWd2KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7CiB1aW50MzJfdCBpbGtfcGlwZV9waXhlbF9yYXRlKGNvbnN0IHN0cnVjdCBpbnRlbF9jcnRjX3N0YXRlICpwaXBlX2NvbmZpZyk7CiBib29sIGlsa19kaXNhYmxlX2xwX3dtKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogaW50IHNhbml0aXplX3JjNl9vcHRpb24oc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCBpbnQgZW5hYmxlX3JjNik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kdm8uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2R2by5jCmluZGV4IDQ3YmRmOWQuLmI5ZTVhNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2R2by5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2R2by5jCkBAIC01NTQsNyArNTU0LDYgQEAKIAkJcmV0dXJuOwogCX0KIAotCWRybV9lbmNvZGVyX2NsZWFudXAoJmludGVsX2VuY29kZXItPmJhc2UpOwogCWtmcmVlKGludGVsX2R2byk7CiAJa2ZyZWUoaW50ZWxfY29ubmVjdG9yKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2ZiYy5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZmJjLmMKaW5kZXggNmE3YWQzZS4uMzgzNmExYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZmJjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZmJjLmMKQEAgLTEyMzAsMTIgKzEyMzAsMjkgQEAKIAlpZiAoaTkxNS5lbmFibGVfZmJjID49IDApCiAJCXJldHVybiAhIWk5MTUuZW5hYmxlX2ZiYzsKIAorCWlmICghSEFTX0ZCQyhkZXZfcHJpdikpCisJCXJldHVybiAwOworCiAJaWYgKElTX0JST0FEV0VMTChkZXZfcHJpdikpCiAJCXJldHVybiAxOwogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBib29sIG5lZWRfZmJjX3Z0ZF93YShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisjaWZkZWYgQ09ORklHX0lOVEVMX0lPTU1VCisJLyogV2FGYmNUdXJuT2ZmRmJjV2hlbkh5cGVyVmlzb3JJc1VzZWQ6c2tsLGJ4dCAqLworCWlmIChpbnRlbF9pb21tdV9nZnhfbWFwcGVkICYmCisJICAgIChJU19TS1lMQUtFKGRldl9wcml2KSB8fCBJU19CUk9YVE9OKGRldl9wcml2KSkpIHsKKwkJRFJNX0lORk8oIkRpc2FibGluZyBmcmFtZWJ1ZmZlciBjb21wcmVzc2lvbiAoRkJDKSB0byBwcmV2ZW50IHNjcmVlbiBmbGlja2VyIHdpdGggVlQtZCBlbmFibGVkXG4iKTsKKwkJcmV0dXJuIHRydWU7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gZmFsc2U7Cit9CisKIC8qKgogICogaW50ZWxfZmJjX2luaXQgLSBJbml0aWFsaXplIEZCQwogICogQGRldl9wcml2OiB0aGUgaTkxNSBkZXZpY2UKQEAgLTEyNTMsNiArMTI3MCw5IEBACiAJZmJjLT5hY3RpdmUgPSBmYWxzZTsKIAlmYmMtPndvcmsuc2NoZWR1bGVkID0gZmFsc2U7CiAKKwlpZiAobmVlZF9mYmNfdnRkX3dhKGRldl9wcml2KSkKKwkJbWt3cml0ZV9kZXZpY2VfaW5mbyhkZXZfcHJpdiktPmhhc19mYmMgPSBmYWxzZTsKKwogCWk5MTUuZW5hYmxlX2ZiYyA9IGludGVsX3Nhbml0aXplX2ZiY19vcHRpb24oZGV2X3ByaXYpOwogCURSTV9ERUJVR19LTVMoIlNhbml0aXplZCBlbmFibGVfZmJjIHZhbHVlOiAlZFxuIiwgaTkxNS5lbmFibGVfZmJjKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ByZWdpb24uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX29wcmVnaW9uLmMKaW5kZXggYWRjYTI2Mi4uN2FjYmJiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ByZWdpb24uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9vcHJlZ2lvbi5jCkBAIC0xMDQ3LDYgKzEwNDcsMjMgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IGludGVsX3VzZV9vcHJlZ2lvbl9wYW5lbF90eXBlX2NhbGxiYWNrKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICppZCkKK3sKKwlEUk1fSU5GTygiVXNpbmcgcGFuZWwgdHlwZSBmcm9tIE9wUmVnaW9uIG9uICVzXG4iLCBpZC0+aWRlbnQpOworCXJldHVybiAxOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgaW50ZWxfdXNlX29wcmVnaW9uX3BhbmVsX3R5cGVbXSA9IHsKKwl7CisJCS5jYWxsYmFjayA9IGludGVsX3VzZV9vcHJlZ2lvbl9wYW5lbF90eXBlX2NhbGxiYWNrLAorCQkuaWRlbnQgPSAiQ29ucmFjIEdtYkggSVg0NUdNMiIsCisJCS5tYXRjaGVzID0ge0RNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkNvbnJhYyBHbWJIIiksCisJCQkgICAgRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJJWDQ1R00yIiksCisJCX0sCisJfSwKKwl7IH0KK307CisKIGludAogaW50ZWxfb3ByZWdpb25fZ2V0X3BhbmVsX3R5cGUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQogewpAQCAtMTA3Myw2ICsxMDkwLDE2IEBACiAJfQogCiAJLyoKKwkgKiBTbyBmYXIgd2Uga25vdyB0aGF0IHNvbWUgbWFjaGluZWQgbXVzdCB1c2UgaXQsIG90aGVycyBtdXN0IG5vdCB1c2UgaXQuCisJICogVGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGFueSB3YXkgdG8gZGV0ZXJtaW5lIHdoaWNoIHdheSB0byBnbywgZXhjZXB0CisJICogdmlhIGEgcXVpcmsgbGlzdCA6KAorCSAqLworCWlmICghZG1pX2NoZWNrX3N5c3RlbShpbnRlbF91c2Vfb3ByZWdpb25fcGFuZWxfdHlwZSkpIHsKKwkJRFJNX0RFQlVHX0tNUygiSWdub3JpbmcgT3BSZWdpb24gcGFuZWwgdHlwZSAoJWQpXG4iLCByZXQgLSAxKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyoKIAkgKiBGSVhNRSBPbiBEZWxsIFhQUyAxMyA5MzUwIHRoZSBPcFJlZ2lvbiBwYW5lbCB0eXBlICgwKSBnaXZlcyB1cwogCSAqIGxvdyB2c3dpbmcgZm9yIGVEUCwgd2hlcmVhcyB0aGUgVkJUIHBhbmVsIHR5cGUgKDIpIGdpdmVzIHVzIG5vcm1hbAogCSAqIHZzd2luZyBpbnN0ZWFkLiBMb3cgdnN3aW5nIHJlc3VsdHMgaW4gc29tZSBkaXNwbGF5IGZsaWNrZXJzLCBzbwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcG0uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3BtLmMKaW5kZXggOTdiYTZjOC4uMmQyNDgxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcG0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wbS5jCkBAIC0yODUyLDYgKzI4NTIsNyBAQAogCiAjZGVmaW5lIFNLTF9EREJfU0laRQkJODk2CS8qIGluIGJsb2NrcyAqLwogI2RlZmluZSBCWFRfRERCX1NJWkUJCTUxMgorI2RlZmluZSBTS0xfU0FHVl9CTE9DS19USU1FCTMwIC8qIMK1cyAqLwogCiAvKgogICogUmV0dXJuIHRoZSBpbmRleCBvZiBhIHBsYW5lIGluIHRoZSBTS0wgRERCIGFuZCB3bSByZXN1bHQgYXJyYXlzLiAgUHJpbWFyeQpAQCAtMjg3NSw2ICsyODc2LDE1MyBAQAogCX0KIH0KIAorLyoKKyAqIFNBR1YgZHluYW1pY2FsbHkgYWRqdXN0cyB0aGUgc3lzdGVtIGFnZW50IHZvbHRhZ2UgYW5kIGNsb2NrIGZyZXF1ZW5jaWVzCisgKiBkZXBlbmRpbmcgb24gcG93ZXIgYW5kIHBlcmZvcm1hbmNlIHJlcXVpcmVtZW50cy4gVGhlIGRpc3BsYXkgZW5naW5lIGFjY2VzcworICogdG8gc3lzdGVtIG1lbW9yeSBpcyBibG9ja2VkIGR1cmluZyB0aGUgYWRqdXN0bWVudCB0aW1lLiBCZWNhdXNlIG9mIHRoZQorICogYmxvY2tpbmcgdGltZSwgaGF2aW5nIHRoaXMgZW5hYmxlZCBjYW4gY2F1c2UgZnVsbCBzeXN0ZW0gaGFuZ3MgYW5kL29yIHBpcGUKKyAqIHVuZGVycnVucyBpZiB3ZSBkb24ndCBtZWV0IGFsbCBvZiB0aGUgZm9sbG93aW5nIHJlcXVpcmVtZW50czoKKyAqCisgKiAgLSA8PSAxIHBpcGUgZW5hYmxlZAorICogIC0gQWxsIHBsYW5lcyBjYW4gZW5hYmxlIHdhdGVybWFya3MgZm9yIGxhdGVuY2llcyA+PSBTQUdWIGVuZ2luZSBibG9jayB0aW1lCisgKiAgLSBXZSdyZSBub3QgdXNpbmcgYW4gaW50ZXJsYWNlZCBkaXNwbGF5IGNvbmZpZ3VyYXRpb24KKyAqLworaW50Citza2xfZW5hYmxlX3NhZ3Yoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCWludCByZXQ7CisKKwlpZiAoZGV2X3ByaXYtPnNrbF9zYWd2X3N0YXR1cyA9PSBJOTE1X1NLTF9TQUdWX05PVF9DT05UUk9MTEVEIHx8CisJICAgIGRldl9wcml2LT5za2xfc2Fndl9zdGF0dXMgPT0gSTkxNV9TS0xfU0FHVl9FTkFCTEVEKQorCQlyZXR1cm4gMDsKKworCURSTV9ERUJVR19LTVMoIkVuYWJsaW5nIHRoZSBTQUdWXG4iKTsKKwltdXRleF9sb2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOworCisJcmV0ID0gc2FuZHlicmlkZ2VfcGNvZGVfd3JpdGUoZGV2X3ByaXYsIEdFTjlfUENPREVfU0FHVl9DT05UUk9MLAorCQkJCSAgICAgIEdFTjlfU0FHVl9FTkFCTEUpOworCisJLyogV2UgZG9uJ3QgbmVlZCB0byB3YWl0IGZvciB0aGUgU0FHViB3aGVuIGVuYWJsaW5nICovCisJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOworCisJLyoKKwkgKiBTb21lIHNrbCBzeXN0ZW1zLCBwcmUtcmVsZWFzZSBtYWNoaW5lcyBpbiBwYXJ0aWN1bGFyLAorCSAqIGRvbid0IGFjdHVhbGx5IGhhdmUgYW4gU0FHVi4KKwkgKi8KKwlpZiAocmV0ID09IC1FTlhJTykgeworCQlEUk1fREVCVUdfRFJJVkVSKCJObyBTQUdWIGZvdW5kIG9uIHN5c3RlbSwgaWdub3JpbmdcbiIpOworCQlkZXZfcHJpdi0+c2tsX3NhZ3Zfc3RhdHVzID0gSTkxNV9TS0xfU0FHVl9OT1RfQ09OVFJPTExFRDsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChyZXQgPCAwKSB7CisJCURSTV9FUlJPUigiRmFpbGVkIHRvIGVuYWJsZSB0aGUgU0FHVlxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJZGV2X3ByaXYtPnNrbF9zYWd2X3N0YXR1cyA9IEk5MTVfU0tMX1NBR1ZfRU5BQkxFRDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc2tsX2RvX3NhZ3ZfZGlzYWJsZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJaW50IHJldDsKKwl1aW50MzJfdCB0ZW1wID0gR0VOOV9TQUdWX0RJU0FCTEU7CisKKwlyZXQgPSBzYW5keWJyaWRnZV9wY29kZV9yZWFkKGRldl9wcml2LCBHRU45X1BDT0RFX1NBR1ZfQ09OVFJPTCwKKwkJCQkgICAgICZ0ZW1wKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWVsc2UKKwkJcmV0dXJuIHRlbXAgJiBHRU45X1NBR1ZfSVNfRElTQUJMRUQ7Cit9CisKK2ludAorc2tsX2Rpc2FibGVfc2FndihzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJaW50IHJldCwgcmVzdWx0OworCisJaWYgKGRldl9wcml2LT5za2xfc2Fndl9zdGF0dXMgPT0gSTkxNV9TS0xfU0FHVl9OT1RfQ09OVFJPTExFRCB8fAorCSAgICBkZXZfcHJpdi0+c2tsX3NhZ3Zfc3RhdHVzID09IEk5MTVfU0tMX1NBR1ZfRElTQUJMRUQpCisJCXJldHVybiAwOworCisJRFJNX0RFQlVHX0tNUygiRGlzYWJsaW5nIHRoZSBTQUdWXG4iKTsKKwltdXRleF9sb2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOworCisJLyogYnNwZWMgc2F5cyB0byBrZWVwIHJldHJ5aW5nIGZvciBhdCBsZWFzdCAxIG1zICovCisJcmV0ID0gd2FpdF9mb3IocmVzdWx0ID0gc2tsX2RvX3NhZ3ZfZGlzYWJsZShkZXZfcHJpdiksIDEpOworCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKKworCWlmIChyZXQgPT0gLUVUSU1FRE9VVCkgeworCQlEUk1fRVJST1IoIlJlcXVlc3QgdG8gZGlzYWJsZSBTQUdWIHRpbWVkIG91dFxuIik7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCS8qCisJICogU29tZSBza2wgc3lzdGVtcywgcHJlLXJlbGVhc2UgbWFjaGluZXMgaW4gcGFydGljdWxhciwKKwkgKiBkb24ndCBhY3R1YWxseSBoYXZlIGFuIFNBR1YuCisJICovCisJaWYgKHJlc3VsdCA9PSAtRU5YSU8pIHsKKwkJRFJNX0RFQlVHX0RSSVZFUigiTm8gU0FHViBmb3VuZCBvbiBzeXN0ZW0sIGlnbm9yaW5nXG4iKTsKKwkJZGV2X3ByaXYtPnNrbF9zYWd2X3N0YXR1cyA9IEk5MTVfU0tMX1NBR1ZfTk9UX0NPTlRST0xMRUQ7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAocmVzdWx0IDwgMCkgeworCQlEUk1fRVJST1IoIkZhaWxlZCB0byBkaXNhYmxlIHRoZSBTQUdWXG4iKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlkZXZfcHJpdi0+c2tsX3NhZ3Zfc3RhdHVzID0gSTkxNV9TS0xfU0FHVl9ESVNBQkxFRDsKKwlyZXR1cm4gMDsKK30KKworYm9vbCBza2xfY2FuX2VuYWJsZV9zYWd2KHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gc3RhdGUtPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KGRldik7CisJc3RydWN0IGludGVsX2F0b21pY19zdGF0ZSAqaW50ZWxfc3RhdGUgPSB0b19pbnRlbF9hdG9taWNfc3RhdGUoc3RhdGUpOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKKwllbnVtIHBpcGUgcGlwZTsKKwlpbnQgbGV2ZWwsIHBsYW5lOworCisJLyoKKwkgKiBTS0wgd29ya2Fyb3VuZDogYnNwZWMgcmVjb21tZW5kcyB3ZSBkaXNhYmxlIHRoZSBTQUdWIHdoZW4gd2UgaGF2ZQorCSAqIG1vcmUgdGhlbiBvbmUgcGlwZSBlbmFibGVkCisJICoKKwkgKiBJZiB0aGVyZSBhcmUgbm8gYWN0aXZlIENSVENzLCBubyBhZGRpdGlvbmFsIGNoZWNrcyBuZWVkIGJlIHBlcmZvcm1lZAorCSAqLworCWlmIChod2VpZ2h0MzIoaW50ZWxfc3RhdGUtPmFjdGl2ZV9jcnRjcykgPT0gMCkKKwkJcmV0dXJuIHRydWU7CisJZWxzZSBpZiAoaHdlaWdodDMyKGludGVsX3N0YXRlLT5hY3RpdmVfY3J0Y3MpID4gMSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogU2luY2Ugd2UncmUgbm93IGd1YXJhbnRlZWQgdG8gb25seSBoYXZlIG9uZSBhY3RpdmUgQ1JUQy4uLiAqLworCXBpcGUgPSBmZnMoaW50ZWxfc3RhdGUtPmFjdGl2ZV9jcnRjcykgLSAxOworCWNydGMgPSBkZXZfcHJpdi0+cGlwZV90b19jcnRjX21hcHBpbmdbcGlwZV07CisKKwlpZiAoY3J0Yy0+c3RhdGUtPm1vZGUuZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkKKwkJcmV0dXJuIGZhbHNlOworCisJZm9yX2VhY2hfcGxhbmUoZGV2X3ByaXYsIHBpcGUsIHBsYW5lKSB7CisJCS8qIFNraXAgdGhpcyBwbGFuZSBpZiBpdCdzIG5vdCBlbmFibGVkICovCisJCWlmIChpbnRlbF9zdGF0ZS0+d21fcmVzdWx0cy5wbGFuZVtwaXBlXVtwbGFuZV1bMF0gPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIEZpbmQgdGhlIGhpZ2hlc3QgZW5hYmxlZCB3bSBsZXZlbCBmb3IgdGhpcyBwbGFuZSAqLworCQlmb3IgKGxldmVsID0gaWxrX3dtX21heF9sZXZlbChkZXYpOworCQkgICAgIGludGVsX3N0YXRlLT53bV9yZXN1bHRzLnBsYW5lW3BpcGVdW3BsYW5lXVtsZXZlbF0gPT0gMDsgLS1sZXZlbCkKKwkJICAgICB7IH0KKworCQkvKgorCQkgKiBJZiBhbnkgb2YgdGhlIHBsYW5lcyBvbiB0aGlzIHBpcGUgZG9uJ3QgZW5hYmxlIHdtIGxldmVscworCQkgKiB0aGF0IGluY3VyIG1lbW9yeSBsYXRlbmNpZXMgaGlnaGVyIHRoZW4gMzDCtXMgd2UgY2FuJ3QgZW5hYmxlCisJCSAqIHRoZSBTQUdWCisJCSAqLworCQlpZiAoZGV2X3ByaXYtPndtLnNrbF9sYXRlbmN5W2xldmVsXSA8IFNLTF9TQUdWX0JMT0NLX1RJTUUpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKIHN0YXRpYyB2b2lkCiBza2xfZGRiX2dldF9waXBlX2FsbG9jYXRpb25fbGltaXRzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJICAgY29uc3Qgc3RydWN0IGludGVsX2NydGNfc3RhdGUgKmNzdGF0ZSwKQEAgLTMxMDcsOCArMzI1NSw2IEBACiAJCXRvdGFsX2RhdGFfcmF0ZSArPSBpbnRlbF9jc3RhdGUtPndtLnNrbC5wbGFuZV95X2RhdGFfcmF0ZVtpZF07CiAJfQogCi0JV0FSTl9PTihjc3RhdGUtPnBsYW5lX21hc2sgJiYgdG90YWxfZGF0YV9yYXRlID09IDApOwotCiAJcmV0dXJuIHRvdGFsX2RhdGFfcmF0ZTsKIH0KIApAQCAtMzM0NCw2ICszNDkwLDggQEAKIAkJcGxhbmVfYnl0ZXNfcGVyX2xpbmUgKj0gNDsKIAkJcGxhbmVfYmxvY2tzX3Blcl9saW5lID0gRElWX1JPVU5EX1VQKHBsYW5lX2J5dGVzX3Blcl9saW5lLCA1MTIpOwogCQlwbGFuZV9ibG9ja3NfcGVyX2xpbmUgLz0gNDsKKwl9IGVsc2UgaWYgKHRpbGluZyA9PSBEUk1fRk9STUFUX01PRF9OT05FKSB7CisJCXBsYW5lX2Jsb2Nrc19wZXJfbGluZSA9IERJVl9ST1VORF9VUChwbGFuZV9ieXRlc19wZXJfbGluZSwgNTEyKSArIDE7CiAJfSBlbHNlIHsKIAkJcGxhbmVfYmxvY2tzX3Blcl9saW5lID0gRElWX1JPVU5EX1VQKHBsYW5lX2J5dGVzX3Blcl9saW5lLCA1MTIpOwogCX0KQEAgLTM5MTAsOSArNDA1OCwyNCBAQAogCSAqIHByZXRlbmQgdGhhdCBhbGwgcGlwZXMgc3dpdGNoZWQgYWN0aXZlIHN0YXR1cyBzbyB0aGF0IHdlJ2xsCiAJICogZW5zdXJlIGEgZnVsbCBEREIgcmVjb21wdXRlLgogCSAqLwotCWlmIChkZXZfcHJpdi0+d20uZGlzdHJ1c3RfYmlvc193bSkKKwlpZiAoZGV2X3ByaXYtPndtLmRpc3RydXN0X2Jpb3Nfd20pIHsKKwkJcmV0ID0gZHJtX21vZGVzZXRfbG9jaygmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0aW9uX211dGV4LAorCQkJCSAgICAgICBzdGF0ZS0+YWNxdWlyZV9jdHgpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwogCQlpbnRlbF9zdGF0ZS0+YWN0aXZlX3BpcGVfY2hhbmdlcyA9IH4wOwogCisJCS8qCisJCSAqIFdlIHVzdWFsbHkgb25seSBpbml0aWFsaXplIGludGVsX3N0YXRlLT5hY3RpdmVfY3J0Y3MgaWYgd2UKKwkJICogd2UncmUgZG9pbmcgYSBtb2Rlc2V0OyBtYWtlIHN1cmUgdGhpcyBmaWVsZCBpcyBhbHdheXMKKwkJICogaW5pdGlhbGl6ZWQgZHVyaW5nIHRoZSBzYW5pdGl6YXRpb24gcHJvY2VzcyB0aGF0IGhhcHBlbnMKKwkJICogb24gdGhlIGZpcnN0IGNvbW1pdCB0b28uCisJCSAqLworCQlpZiAoIWludGVsX3N0YXRlLT5tb2Rlc2V0KQorCQkJaW50ZWxfc3RhdGUtPmFjdGl2ZV9jcnRjcyA9IGRldl9wcml2LT5hY3RpdmVfY3J0Y3M7CisJfQorCiAJLyoKIAkgKiBJZiB0aGUgbW9kZXNldCBjaGFuZ2VzIHdoaWNoIENSVEMncyBhcmUgYWN0aXZlLCB3ZSBuZWVkIHRvCiAJICogcmVjb21wdXRlIHRoZSBEREIgYWxsb2NhdGlvbiBmb3IgKmFsbCogYWN0aXZlIHBpcGVzLCBldmVuCkBAIC0zOTQxLDExICs0MTA0LDMzIEBACiAJCXJldCA9IHNrbF9hbGxvY2F0ZV9waXBlX2RkYihjc3RhdGUsIGRkYik7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGRybV9hdG9taWNfYWRkX2FmZmVjdGVkX3BsYW5lcyhzdGF0ZSwgJmludGVsX2NydGMtPmJhc2UpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQKK3NrbF9jb3B5X3dtX2Zvcl9waXBlKHN0cnVjdCBza2xfd21fdmFsdWVzICpkc3QsCisJCSAgICAgc3RydWN0IHNrbF93bV92YWx1ZXMgKnNyYywKKwkJICAgICBlbnVtIHBpcGUgcGlwZSkKK3sKKwlkc3QtPndtX2xpbmV0aW1lW3BpcGVdID0gc3JjLT53bV9saW5ldGltZVtwaXBlXTsKKwltZW1jcHkoZHN0LT5wbGFuZVtwaXBlXSwgc3JjLT5wbGFuZVtwaXBlXSwKKwkgICAgICAgc2l6ZW9mKGRzdC0+cGxhbmVbcGlwZV0pKTsKKwltZW1jcHkoZHN0LT5wbGFuZV90cmFuc1twaXBlXSwgc3JjLT5wbGFuZV90cmFuc1twaXBlXSwKKwkgICAgICAgc2l6ZW9mKGRzdC0+cGxhbmVfdHJhbnNbcGlwZV0pKTsKKworCWRzdC0+ZGRiLnBpcGVbcGlwZV0gPSBzcmMtPmRkYi5waXBlW3BpcGVdOworCW1lbWNweShkc3QtPmRkYi55X3BsYW5lW3BpcGVdLCBzcmMtPmRkYi55X3BsYW5lW3BpcGVdLAorCSAgICAgICBzaXplb2YoZHN0LT5kZGIueV9wbGFuZVtwaXBlXSkpOworCW1lbWNweShkc3QtPmRkYi5wbGFuZVtwaXBlXSwgc3JjLT5kZGIucGxhbmVbcGlwZV0sCisJICAgICAgIHNpemVvZihkc3QtPmRkYi5wbGFuZVtwaXBlXSkpOworfQorCiBzdGF0aWMgaW50CiBza2xfY29tcHV0ZV93bShzdHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqc3RhdGUpCiB7CkBAIC00MDE4LDggKzQyMDMsMTAgQEAKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHRvX2k5MTUoZGV2KTsKIAlzdHJ1Y3Qgc2tsX3dtX3ZhbHVlcyAqcmVzdWx0cyA9ICZkZXZfcHJpdi0+d20uc2tsX3Jlc3VsdHM7CisJc3RydWN0IHNrbF93bV92YWx1ZXMgKmh3X3ZhbHMgPSAmZGV2X3ByaXYtPndtLnNrbF9odzsKIAlzdHJ1Y3QgaW50ZWxfY3J0Y19zdGF0ZSAqY3N0YXRlID0gdG9faW50ZWxfY3J0Y19zdGF0ZShjcnRjLT5zdGF0ZSk7CiAJc3RydWN0IHNrbF9waXBlX3dtICpwaXBlX3dtID0gJmNzdGF0ZS0+d20uc2tsLm9wdGltYWw7CisJaW50IHBpcGU7CiAKIAlpZiAoKHJlc3VsdHMtPmRpcnR5X3BpcGVzICYgZHJtX2NydGNfbWFzayhjcnRjKSkgPT0gMCkKIAkJcmV0dXJuOwpAQCAtNDAzMSw4ICs0MjE4LDEyIEBACiAJc2tsX3dyaXRlX3dtX3ZhbHVlcyhkZXZfcHJpdiwgcmVzdWx0cyk7CiAJc2tsX2ZsdXNoX3dtX3ZhbHVlcyhkZXZfcHJpdiwgcmVzdWx0cyk7CiAKLQkvKiBzdG9yZSB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gKi8KLQlkZXZfcHJpdi0+d20uc2tsX2h3ID0gKnJlc3VsdHM7CisJLyoKKwkgKiBTdG9yZSB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gKGJ1dCBvbmx5IGZvciB0aGUgcGlwZXMgdGhhdCBoYXZlCisJICogY2hhbmdlZDsgdGhlIG90aGVyIHZhbHVlcyB3ZXJlbid0IHJlY29tcHV0ZWQpLgorCSAqLworCWZvcl9lYWNoX3BpcGVfbWFza2VkKGRldl9wcml2LCBwaXBlLCByZXN1bHRzLT5kaXJ0eV9waXBlcykKKwkJc2tsX2NvcHlfd21fZm9yX3BpcGUoaHdfdmFscywgcmVzdWx0cywgcGlwZSk7CiAKIAltdXRleF91bmxvY2soJmRldl9wcml2LT53bS53bV9tdXRleCk7CiB9CkBAIC02NTc0LDkgKzY3NjUsNyBAQAogCiB2b2lkIGludGVsX2NsZWFudXBfZ3RfcG93ZXJzYXZlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKIHsKLQlpZiAoSVNfQ0hFUlJZVklFVyhkZXZfcHJpdikpCi0JCXJldHVybjsKLQllbHNlIGlmIChJU19WQUxMRVlWSUVXKGRldl9wcml2KSkKKwlpZiAoSVNfVkFMTEVZVklFVyhkZXZfcHJpdikpCiAJCXZhbGxleXZpZXdfY2xlYW51cF9ndF9wb3dlcnNhdmUoZGV2X3ByaXYpOwogCiAJaWYgKCFpOTE1LmVuYWJsZV9yYzYpCkBAIC03NjU4LDggKzc4NDcsNTQgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGdlbjZfY2hlY2tfbWFpbGJveF9zdGF0dXMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXVpbnQzMl90IGZsYWdzID0KKwkJSTkxNV9SRUFEX0ZXKEdFTjZfUENPREVfTUFJTEJPWCkgJiBHRU42X1BDT0RFX0VSUk9SX01BU0s7CisKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBHRU42X1BDT0RFX1NVQ0NFU1M6CisJCXJldHVybiAwOworCWNhc2UgR0VONl9QQ09ERV9VTklNUExFTUVOVEVEX0NNRDoKKwljYXNlIEdFTjZfUENPREVfSUxMRUdBTF9DTUQ6CisJCXJldHVybiAtRU5YSU87CisJY2FzZSBHRU42X1BDT0RFX01JTl9GUkVRX1RBQkxFX0dUX1JBVElPX09VVF9PRl9SQU5HRToKKwljYXNlIEdFTjdfUENPREVfTUlOX0ZSRVFfVEFCTEVfR1RfUkFUSU9fT1VUX09GX1JBTkdFOgorCQlyZXR1cm4gLUVPVkVSRkxPVzsKKwljYXNlIEdFTjZfUENPREVfVElNRU9VVDoKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJZGVmYXVsdDoKKwkJTUlTU0lOR19DQVNFKGZsYWdzKQorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdlbjdfY2hlY2tfbWFpbGJveF9zdGF0dXMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXVpbnQzMl90IGZsYWdzID0KKwkJSTkxNV9SRUFEX0ZXKEdFTjZfUENPREVfTUFJTEJPWCkgJiBHRU42X1BDT0RFX0VSUk9SX01BU0s7CisKKwlzd2l0Y2ggKGZsYWdzKSB7CisJY2FzZSBHRU42X1BDT0RFX1NVQ0NFU1M6CisJCXJldHVybiAwOworCWNhc2UgR0VONl9QQ09ERV9JTExFR0FMX0NNRDoKKwkJcmV0dXJuIC1FTlhJTzsKKwljYXNlIEdFTjdfUENPREVfVElNRU9VVDoKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJY2FzZSBHRU43X1BDT0RFX0lMTEVHQUxfREFUQToKKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBHRU43X1BDT0RFX01JTl9GUkVRX1RBQkxFX0dUX1JBVElPX09VVF9PRl9SQU5HRToKKwkJcmV0dXJuIC1FT1ZFUkZMT1c7CisJZGVmYXVsdDoKKwkJTUlTU0lOR19DQVNFKGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCiBpbnQgc2FuZHlicmlkZ2VfcGNvZGVfcmVhZChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHUzMiBtYm94LCB1MzIgKnZhbCkKIHsKKwlpbnQgc3RhdHVzOworCiAJV0FSTl9PTighbXV0ZXhfaXNfbG9ja2VkKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spKTsKIAogCS8qIEdFTjZfUENPREVfKiBhcmUgb3V0c2lkZSBvZiB0aGUgZm9yY2V3YWtlIGRvbWFpbiwgd2UgY2FuCkBAIC03Njg2LDEyICs3OTIxLDI1IEBACiAJKnZhbCA9IEk5MTVfUkVBRF9GVyhHRU42X1BDT0RFX0RBVEEpOwogCUk5MTVfV1JJVEVfRlcoR0VONl9QQ09ERV9EQVRBLCAwKTsKIAorCWlmIChJTlRFTF9HRU4oZGV2X3ByaXYpID4gNikKKwkJc3RhdHVzID0gZ2VuN19jaGVja19tYWlsYm94X3N0YXR1cyhkZXZfcHJpdik7CisJZWxzZQorCQlzdGF0dXMgPSBnZW42X2NoZWNrX21haWxib3hfc3RhdHVzKGRldl9wcml2KTsKKworCWlmIChzdGF0dXMpIHsKKwkJRFJNX0RFQlVHX0RSSVZFUigid2FybmluZzogcGNvZGUgKHJlYWQpIG1haWxib3ggYWNjZXNzIGZhaWxlZDogJWRcbiIsCisJCQkJIHN0YXR1cyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKIGludCBzYW5keWJyaWRnZV9wY29kZV93cml0ZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCi0JCQkgICAgICAgdTMyIG1ib3gsIHUzMiB2YWwpCisJCQkgICAgdTMyIG1ib3gsIHUzMiB2YWwpCiB7CisJaW50IHN0YXR1czsKKwogCVdBUk5fT04oIW11dGV4X2lzX2xvY2tlZCgmZGV2X3ByaXYtPnJwcy5od19sb2NrKSk7CiAKIAkvKiBHRU42X1BDT0RFXyogYXJlIG91dHNpZGUgb2YgdGhlIGZvcmNld2FrZSBkb21haW4sIHdlIGNhbgpAQCAtNzcxNiw2ICs3OTY0LDE3IEBACiAKIAlJOTE1X1dSSVRFX0ZXKEdFTjZfUENPREVfREFUQSwgMCk7CiAKKwlpZiAoSU5URUxfR0VOKGRldl9wcml2KSA+IDYpCisJCXN0YXR1cyA9IGdlbjdfY2hlY2tfbWFpbGJveF9zdGF0dXMoZGV2X3ByaXYpOworCWVsc2UKKwkJc3RhdHVzID0gZ2VuNl9jaGVja19tYWlsYm94X3N0YXR1cyhkZXZfcHJpdik7CisKKwlpZiAoc3RhdHVzKSB7CisJCURSTV9ERUJVR19EUklWRVIoIndhcm5pbmc6IHBjb2RlICh3cml0ZSkgbWFpbGJveCBhY2Nlc3MgZmFpbGVkOiAlZFxuIiwKKwkJCQkgc3RhdHVzKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcHNyLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wc3IuYwppbmRleCAyYjBkMWJhLi5jZjE3MWI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wc3IuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wc3IuYwpAQCAtMjU1LDE0ICsyNTUsMTQgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KGRldik7CiAKIAl1aW50MzJfdCBtYXhfc2xlZXBfdGltZSA9IDB4MWY7Ci0JLyogTGF0ZWx5IGl0IHdhcyBpZGVudGlmaWVkIHRoYXQgZGVwZW5kaW5nIG9uIHBhbmVsIGlkbGUgZnJhbWUgY291bnQKLQkgKiBjYWxjdWxhdGVkIGF0IEhXIGNhbiBiZSBvZmYgYnkgMS4gU28gbGV0J3MgdXNlIHdoYXQgY2FtZQotCSAqIGZyb20gVkJUICsgMS4KLQkgKiBUaGVyZSBhcmUgYWxzbyBvdGhlciBjYXNlcyB3aGVyZSBwYW5lbCBkZW1hbmRzIGF0IGxlYXN0IDQKLQkgKiBidXQgVkJUIGlzIG5vdCBiZWluZyBzZXQuIFRvIGNvdmVyIHRoZXNlIDIgY2FzZXMgbGV0cyB1c2UKLQkgKiBhdCBsZWFzdCA1IHdoZW4gVkJUIGlzbid0IHNldCB0byBiZSBvbiB0aGUgc2FmZXN0IHNpZGUuCisJLyoKKwkgKiBMZXQncyByZXNwZWN0IFZCVCBpbiBjYXNlIFZCVCBhc2tzIGEgaGlnaGVyIGlkbGVfZnJhbWUgdmFsdWUuCisJICogTGV0J3MgdXNlIDYgYXMgdGhlIG1pbmltdW0gdG8gY292ZXIgYWxsIGtub3duIGNhc2VzIGluY2x1ZGluZworCSAqIHRoZSBvZmYtYnktb25lIGlzc3VlIHRoYXQgSFcgaGFzIGluIHNvbWUgY2FzZXMuIEFsc28gdGhlcmUgYXJlCisJICogY2FzZXMgd2hlcmUgc2luayBzaG91bGQgYmUgYWJsZSB0byB0cmFpbgorCSAqIHdpdGggdGhlIDUgb3IgNiBpZGxlIHBhdHRlcm5zLgogCSAqLwotCXVpbnQzMl90IGlkbGVfZnJhbWVzID0gZGV2X3ByaXYtPnZidC5wc3IuaWRsZV9mcmFtZXMgKyAxOworCXVpbnQzMl90IGlkbGVfZnJhbWVzID0gbWF4KDYsIGRldl9wcml2LT52YnQucHNyLmlkbGVfZnJhbWVzKTsKIAl1aW50MzJfdCB2YWwgPSBFRFBfUFNSX0VOQUJMRTsKIAogCXZhbCB8PSBtYXhfc2xlZXBfdGltZSA8PCBFRFBfUFNSX01BWF9TTEVFUF9USU1FX1NISUZUOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5jCmluZGV4IGNjYTc3OTIuLjFkMzE2MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JpbmdidWZmZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmMKQEAgLTExNzgsOCArMTE3OCw4IEBACiAJCUk5MTVfV1JJVEUoR0VOOF9MM1NRQ1JFRzEsIEwzX0dFTkVSQUxfUFJJT19DUkVESVRTKDYyKSB8CiAJCQkJCSAgIEwzX0hJR0hfUFJJT19DUkVESVRTKDIpKTsKIAotCS8qIFdhSW5zZXJ0RHVtbXlQdXNoQ29uc3RQczpieHQgKi8KLQlpZiAoSVNfQlhUX1JFVklEKGRldl9wcml2LCAwLCBCWFRfUkVWSURfQjApKQorCS8qIFdhVG9FbmFibGVId0ZpeEZvclB1c2hDb25zdEhXQnVnOmJ4dCAqLworCWlmIChJU19CWFRfUkVWSUQoZGV2X3ByaXYsIEJYVF9SRVZJRF9DMCwgUkVWSURfRk9SRVZFUikpCiAJCVdBX1NFVF9CSVRfTUFTS0VEKENPTU1PTl9TTElDRV9DSElDS0VOMiwKIAkJCQkgIEdFTjhfU0JFX0RJU0FCTEVfUkVQTEFZX0JVRl9PUFRJTUlaQVRJT04pOwogCkBAIC0xMjIyLDggKzEyMjIsOCBAQAogCQlJOTE1X1dSSVRFKEdFTjhfTDNTUUNSRUc0LCBJOTE1X1JFQUQoR0VOOF9MM1NRQ1JFRzQpIHwKIAkJCSAgIEdFTjhfTFFTQ19ST19QRVJGX0RJUyk7CiAKLQkvKiBXYUluc2VydER1bW15UHVzaENvbnN0UHM6a2JsICovCi0JaWYgKElTX0tCTF9SRVZJRChkZXZfcHJpdiwgMCwgS0JMX1JFVklEX0IwKSkKKwkvKiBXYVRvRW5hYmxlSHdGaXhGb3JQdXNoQ29uc3RIV0J1ZzprYmwgKi8KKwlpZiAoSVNfS0JMX1JFVklEKGRldl9wcml2LCBLQkxfUkVWSURfQzAsIFJFVklEX0ZPUkVWRVIpKQogCQlXQV9TRVRfQklUX01BU0tFRChDT01NT05fU0xJQ0VfQ0hJQ0tFTjIsCiAJCQkJICBHRU44X1NCRV9ESVNBQkxFX1JFUExBWV9CVUZfT1BUSU1JWkFUSU9OKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2lteC9pbXgtZHJtLWNvcmUuYyBiL2RyaXZlcnMvZ3B1L2RybS9pbXgvaW14LWRybS1jb3JlLmMKaW5kZXggOWY3ZGFmYy4uN2JmOTBlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2lteC9pbXgtZHJtLWNvcmUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaW14L2lteC1kcm0tY29yZS5jCkBAIC0xNzEsMTAgKzE3MSwzNCBAQAogCWRybV9mYmRldl9jbWFfaG90cGx1Z19ldmVudChpbXhkcm0tPmZiaGVscGVyKTsKIH0KIAorc3RhdGljIGludCBpbXhfZHJtX2F0b21pY19jaGVjayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZHJtX2F0b21pY19oZWxwZXJfY2hlY2tfbW9kZXNldChkZXYsIHN0YXRlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZHJtX2F0b21pY19oZWxwZXJfY2hlY2tfcGxhbmVzKGRldiwgc3RhdGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIENoZWNrIG1vZGVzZXQgYWdhaW4gaW4gY2FzZSBjcnRjX3N0YXRlLT5tb2RlX2NoYW5nZWQgaXMKKwkgKiB1cGRhdGVkIGluIHBsYW5lJ3MgLT5hdG9taWNfY2hlY2sgY2FsbGJhY2suCisJICovCisJcmV0ID0gZHJtX2F0b21pY19oZWxwZXJfY2hlY2tfbW9kZXNldChkZXYsIHN0YXRlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fbW9kZV9jb25maWdfZnVuY3MgaW14X2RybV9tb2RlX2NvbmZpZ19mdW5jcyA9IHsKIAkuZmJfY3JlYXRlID0gZHJtX2ZiX2NtYV9jcmVhdGUsCiAJLm91dHB1dF9wb2xsX2NoYW5nZWQgPSBpbXhfZHJtX291dHB1dF9wb2xsX2NoYW5nZWQsCi0JLmF0b21pY19jaGVjayA9IGRybV9hdG9taWNfaGVscGVyX2NoZWNrLAorCS5hdG9taWNfY2hlY2sgPSBpbXhfZHJtX2F0b21pY19jaGVjaywKIAkuYXRvbWljX2NvbW1pdCA9IGRybV9hdG9taWNfaGVscGVyX2NvbW1pdCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pbXgvaXB1djMtY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL2lteC9pcHV2My1jcnRjLmMKaW5kZXggMDhlMTg4Yi4uNDYyMDU2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2lteC9pcHV2My1jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2lteC9pcHV2My1jcnRjLmMKQEAgLTc2LDYgKzc2LDggQEAKIAkJY3J0Yy0+c3RhdGUtPmV2ZW50ID0gTlVMTDsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxKCZjcnRjLT5kZXYtPmV2ZW50X2xvY2spOworCisJZHJtX2NydGNfdmJsYW5rX29mZihjcnRjKTsKIH0KIAogc3RhdGljIHZvaWQgaW14X2RybV9jcnRjX3Jlc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKQEAgLTE3NSw2ICsxNzcsOCBAQAogc3RhdGljIHZvaWQgaXB1X2NydGNfYXRvbWljX2JlZ2luKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKIAkJCQkgIHN0cnVjdCBkcm1fY3J0Y19zdGF0ZSAqb2xkX2NydGNfc3RhdGUpCiB7CisJZHJtX2NydGNfdmJsYW5rX29uKGNydGMpOworCiAJc3Bpbl9sb2NrX2lycSgmY3J0Yy0+ZGV2LT5ldmVudF9sb2NrKTsKIAlpZiAoY3J0Yy0+c3RhdGUtPmV2ZW50KSB7CiAJCVdBUk5fT04oZHJtX2NydGNfdmJsYW5rX2dldChjcnRjKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaW14L2lwdXYzLXBsYW5lLmMgYi9kcml2ZXJzL2dwdS9kcm0vaW14L2lwdXYzLXBsYW5lLmMKaW5kZXggNGFkNjdkMC4uMjk0MjNlNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pbXgvaXB1djMtcGxhbmUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaW14L2lwdXYzLXBsYW5lLmMKQEAgLTMxOSwxMyArMzE5LDE0IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyoKLQkgKiBzaW5jZSB3ZSBjYW5ub3QgdG91Y2ggYWN0aXZlIElETUFDIGNoYW5uZWxzLCB3ZSBkbyBub3Qgc3VwcG9ydAotCSAqIHJlc2l6aW5nIHRoZSBlbmFibGVkIHBsYW5lIG9yIGNoYW5naW5nIGl0cyBmb3JtYXQKKwkgKiBXZSBzdXBwb3J0IHJlc2l6aW5nIGFjdGl2ZSBwbGFuZSBvciBjaGFuZ2luZyBpdHMgZm9ybWF0IGJ5CisJICogZm9yY2luZyBDUlRDIG1vZGUgY2hhbmdlIGFuZCBkaXNhYmxpbmctZW5hYmxpbmcgcGxhbmUgaW4gcGxhbmUncworCSAqIC0+YXRvbWljX3VwZGF0ZSBjYWxsYmFjay4KIAkgKi8KIAlpZiAob2xkX2ZiICYmIChzdGF0ZS0+c3JjX3cgIT0gb2xkX3N0YXRlLT5zcmNfdyB8fAogCQkJICAgICAgc3RhdGUtPnNyY19oICE9IG9sZF9zdGF0ZS0+c3JjX2ggfHwKIAkJCSAgICAgIGZiLT5waXhlbF9mb3JtYXQgIT0gb2xkX2ZiLT5waXhlbF9mb3JtYXQpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJY3J0Y19zdGF0ZS0+bW9kZV9jaGFuZ2VkID0gdHJ1ZTsKIAogCWViYSA9IGRybV9wbGFuZV9zdGF0ZV90b19lYmEoc3RhdGUpOwogCkBAIC0zMzYsNyArMzM3LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAob2xkX2ZiICYmIGZiLT5waXRjaGVzWzBdICE9IG9sZF9mYi0+cGl0Y2hlc1swXSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWNydGNfc3RhdGUtPm1vZGVfY2hhbmdlZCA9IHRydWU7CiAKIAlzd2l0Y2ggKGZiLT5waXhlbF9mb3JtYXQpIHsKIAljYXNlIERSTV9GT1JNQVRfWVVWNDIwOgpAQCAtMzcyLDcgKzM3Myw3IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQlpZiAob2xkX2ZiICYmIG9sZF9mYi0+cGl0Y2hlc1sxXSAhPSBmYi0+cGl0Y2hlc1sxXSkKLQkJCXJldHVybiAtRUlOVkFMOworCQkJY3J0Y19zdGF0ZS0+bW9kZV9jaGFuZ2VkID0gdHJ1ZTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTM5Miw4ICszOTMsMTQgQEAKIAllbnVtIGlwdV9jb2xvcl9zcGFjZSBpY3M7CiAKIAlpZiAob2xkX3N0YXRlLT5mYikgewotCQlpcHVfcGxhbmVfYXRvbWljX3NldF9iYXNlKGlwdV9wbGFuZSwgb2xkX3N0YXRlKTsKLQkJcmV0dXJuOworCQlzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKmNydGNfc3RhdGUgPSBzdGF0ZS0+Y3J0Yy0+c3RhdGU7CisKKwkJaWYgKCFjcnRjX3N0YXRlLT5tb2RlX2NoYW5nZWQpIHsKKwkJCWlwdV9wbGFuZV9hdG9taWNfc2V0X2Jhc2UoaXB1X3BsYW5lLCBvbGRfc3RhdGUpOworCQkJcmV0dXJuOworCQl9CisKKwkJaXB1X2Rpc2FibGVfcGxhbmUocGxhbmUpOwogCX0KIAogCXN3aXRjaCAoaXB1X3BsYW5lLT5kcF9mbG93KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvS2NvbmZpZyBiL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9LY29uZmlnCmluZGV4IDIzYWM4MDQuLjI5NGRlNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9LY29uZmlnCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9LY29uZmlnCkBAIC0yLDYgKzIsOSBAQAogCXRyaXN0YXRlICJEUk0gU3VwcG9ydCBmb3IgTWVkaWF0ZWsgU29DcyIKIAlkZXBlbmRzIG9uIERSTQogCWRlcGVuZHMgb24gQVJDSF9NRURJQVRFSyB8fCAoQVJNICYmIENPTVBJTEVfVEVTVCkKKwlkZXBlbmRzIG9uIENPTU1PTl9DTEsKKwlkZXBlbmRzIG9uIEhBVkVfQVJNX1NNQ0NDCisJZGVwZW5kcyBvbiBPRgogCXNlbGVjdCBEUk1fR0VNX0NNQV9IRUxQRVIKIAlzZWxlY3QgRFJNX0tNU19IRUxQRVIKIAlzZWxlY3QgRFJNX01JUElfRFNJCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5oCmluZGV4IGI0YmM3ZjEuLmQwZGE1MmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5oCkBAIC0xNTcsNiArMTU3LDEyIEBACiAJc3RydWN0IHNocmlua2VyIHNocmlua2VyOwogCiAJc3RydWN0IG1zbV92YmxhbmtfY3RybCB2YmxhbmtfY3RybDsKKworCS8qIHRhc2sgaG9sZGluZyBzdHJ1Y3RfbXV0ZXguLiBjdXJyZW50bHkgb25seSB1c2VkIGluIHN1Ym1pdCBwYXRoCisJICogdG8gZGV0ZWN0IGFuZCByZWplY3QgZmF1bHRzIGZyb20gY29weV9mcm9tX3VzZXIoKSBmb3Igc3VibWl0CisJICogaW9jdGwuCisJICovCisJc3RydWN0IHRhc2tfc3RydWN0ICpzdHJ1Y3RfbXV0ZXhfdGFzazsKIH07CiAKIHN0cnVjdCBtc21fZm9ybWF0IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ2VtLmMKaW5kZXggNmNkNGFmNC4uODVmMzA0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ2VtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ2VtLmMKQEAgLTE5NiwxMSArMTk2LDIwIEBACiB7CiAJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmogPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7CisJc3RydWN0IG1zbV9kcm1fcHJpdmF0ZSAqcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IHBhZ2UgKipwYWdlczsKIAl1bnNpZ25lZCBsb25nIHBmbjsKIAlwZ29mZl90IHBnb2ZmOwogCWludCByZXQ7CiAKKwkvKiBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiB1c2Vyc3BhY2UgdHJpZXMgdG8gcGFzcyBhIG1tYXAnZAorCSAqIGJ1dCB1bmZhdWx0ZWQgZ2VtIGJvIHZhZGRyIGludG8gc3VibWl0IGlvY3RsLCB0cmlnZ2VyaW5nCisJICogYSBwYWdlIGZhdWx0IHdoaWxlIHN0cnVjdF9tdXRleCBpcyBhbHJlYWR5IGhlbGQuICBUaGlzIGlzCisJICogbm90IGEgdmFsaWQgdXNlLWNhc2Ugc28ganVzdCBiYWlsLgorCSAqLworCWlmIChwcml2LT5zdHJ1Y3RfbXV0ZXhfdGFzayA9PSBjdXJyZW50KQorCQlyZXR1cm4gVk1fRkFVTFRfU0lHQlVTOworCiAJLyogTWFrZSBzdXJlIHdlIGRvbid0IHBhcmFsbGVsIHVwZGF0ZSBvbiBhIGZhdWx0LCBub3IgbW92ZSBvciByZW1vdmUKIAkgKiBzb21ldGhpbmcgZnJvbSBiZW5lYXRoIG91ciBmZWV0CiAJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9nZW1fc3VibWl0LmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9nZW1fc3VibWl0LmMKaW5kZXggOTc2NmY5YS4uODgwZDZhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ2VtX3N1Ym1pdC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2dlbV9zdWJtaXQuYwpAQCAtNjQsNiArNjQsMTQgQEAKIAlrZnJlZShzdWJtaXQpOwogfQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCitjb3B5X2Zyb21fdXNlcl9pbmF0b21pYyh2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKK3sKKwlpZiAoYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcm9tLCBuKSkKKwkJcmV0dXJuIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWModG8sIGZyb20sIG4pOworCXJldHVybiAtRUZBVUxUOworfQorCiBzdGF0aWMgaW50IHN1Ym1pdF9sb29rdXBfb2JqZWN0cyhzdHJ1Y3QgbXNtX2dlbV9zdWJtaXQgKnN1Ym1pdCwKIAkJc3RydWN0IGRybV9tc21fZ2VtX3N1Ym1pdCAqYXJncywgc3RydWN0IGRybV9maWxlICpmaWxlKQogewpAQCAtNzEsNiArNzksNyBAQAogCWludCByZXQgPSAwOwogCiAJc3Bpbl9sb2NrKCZmaWxlLT50YWJsZV9sb2NrKTsKKwlwYWdlZmF1bHRfZGlzYWJsZSgpOwogCiAJZm9yIChpID0gMDsgaSA8IGFyZ3MtPm5yX2JvczsgaSsrKSB7CiAJCXN0cnVjdCBkcm1fbXNtX2dlbV9zdWJtaXRfYm8gc3VibWl0X2JvOwpAQCAtODQsMTAgKzkzLDE1IEBACiAJCSAqLwogCQlzdWJtaXQtPmJvc1tpXS5mbGFncyA9IDA7CiAKLQkJcmV0ID0gY29weV9mcm9tX3VzZXIoJnN1Ym1pdF9ibywgdXNlcnB0ciwgc2l6ZW9mKHN1Ym1pdF9ibykpOwotCQlpZiAocmV0KSB7Ci0JCQlyZXQgPSAtRUZBVUxUOwotCQkJZ290byBvdXRfdW5sb2NrOworCQlyZXQgPSBjb3B5X2Zyb21fdXNlcl9pbmF0b21pYygmc3VibWl0X2JvLCB1c2VycHRyLCBzaXplb2Yoc3VibWl0X2JvKSk7CisJCWlmICh1bmxpa2VseShyZXQpKSB7CisJCQlwYWdlZmF1bHRfZW5hYmxlKCk7CisJCQlzcGluX3VubG9jaygmZmlsZS0+dGFibGVfbG9jayk7CisJCQlyZXQgPSBjb3B5X2Zyb21fdXNlcigmc3VibWl0X2JvLCB1c2VycHRyLCBzaXplb2Yoc3VibWl0X2JvKSk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gb3V0OworCQkJc3Bpbl9sb2NrKCZmaWxlLT50YWJsZV9sb2NrKTsKKwkJCXBhZ2VmYXVsdF9kaXNhYmxlKCk7CiAJCX0KIAogCQlpZiAoc3VibWl0X2JvLmZsYWdzICYgfk1TTV9TVUJNSVRfQk9fRkxBR1MpIHsKQEAgLTEyNyw5ICsxNDEsMTIgQEAKIAl9CiAKIG91dF91bmxvY2s6Ci0Jc3VibWl0LT5ucl9ib3MgPSBpOworCXBhZ2VmYXVsdF9lbmFibGUoKTsKIAlzcGluX3VubG9jaygmZmlsZS0+dGFibGVfbG9jayk7CiAKK291dDoKKwlzdWJtaXQtPm5yX2JvcyA9IGk7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zNzcsNiArMzk0LDggQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJcHJpdi0+c3RydWN0X211dGV4X3Rhc2sgPSBjdXJyZW50OworCiAJc3VibWl0ID0gc3VibWl0X2NyZWF0ZShkZXYsIGdwdSwgYXJncy0+bnJfYm9zLCBhcmdzLT5ucl9jbWRzKTsKIAlpZiAoIXN1Ym1pdCkgewogCQlyZXQgPSAtRU5PTUVNOwpAQCAtNDY4LDYgKzQ4Nyw3IEBACiAJaWYgKHJldCkKIAkJbXNtX2dlbV9zdWJtaXRfZnJlZShzdWJtaXQpOwogb3V0X3VubG9jazoKKwlwcml2LT5zdHJ1Y3RfbXV0ZXhfdGFzayA9IE5VTEw7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2luY2x1ZGUvbnZrbS9jb3JlL2RldmljZS5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvaW5jbHVkZS9udmttL2NvcmUvZGV2aWNlLmgKaW5kZXggN2VhOGFhNy4uNmJjNzEyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvaW5jbHVkZS9udmttL2NvcmUvZGV2aWNlLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvaW5jbHVkZS9udmttL2NvcmUvZGV2aWNlLmgKQEAgLTE3NSw2ICsxNzUsNyBAQAogCXZvaWQgKCpmaW5pKShzdHJ1Y3QgbnZrbV9kZXZpY2UgKiwgYm9vbCBzdXNwZW5kKTsKIAlyZXNvdXJjZV9zaXplX3QgKCpyZXNvdXJjZV9hZGRyKShzdHJ1Y3QgbnZrbV9kZXZpY2UgKiwgdW5zaWduZWQgYmFyKTsKIAlyZXNvdXJjZV9zaXplX3QgKCpyZXNvdXJjZV9zaXplKShzdHJ1Y3QgbnZrbV9kZXZpY2UgKiwgdW5zaWduZWQgYmFyKTsKKwlib29sIGNwdV9jb2hlcmVudDsKIH07CiAKIHN0cnVjdCBudmttX2RldmljZV9xdWlyayB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2FjcGkuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYWNwaS5jCmluZGV4IGYyYWQxN2EuLmRjNTdiNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYWNwaS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYWNwaS5jCkBAIC0yMjUsNiArMjI1LDE3IEBACiAJaWYgKCFwYXJlbnRfcGRldikKIAkJcmV0dXJuIGZhbHNlOwogCisJaWYgKCFwYXJlbnRfcGRldi0+YnJpZGdlX2QzKSB7CisJCS8qCisJCSAqIFBhcmVudCBQQ0kgYnJpZGdlIGlzIGN1cnJlbnRseSBub3QgcG93ZXIgbWFuYWdlZC4KKwkJICogU2luY2UgdXNlcnNwYWNlIGNhbiBjaGFuZ2UgdGhlc2UgYWZ0ZXJ3YXJkcyB0byBiZSBvbgorCQkgKiB0aGUgc2FmZSBzaWRlIHdlIHN0aWNrIHdpdGggX0RTTSBhbmQgcHJldmVudCB1c2FnZSBvZgorCQkgKiBfUFIzIGZyb20gdGhlIGJyaWRnZS4KKwkJICovCisJCXBjaV9kM2NvbGRfZGlzYWJsZShwZGV2KTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwogCXBhcmVudF9hZGV2ID0gQUNQSV9DT01QQU5JT04oJnBhcmVudF9wZGV2LT5kZXYpOwogCWlmICghcGFyZW50X2FkZXYpCiAJCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYm8uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYm8uYwppbmRleCA2MTkwMDM1Li44NjQzMjNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2JvLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iby5jCkBAIC0yMDksNyArMjA5LDggQEAKIAludmJvLT50aWxlX2ZsYWdzID0gdGlsZV9mbGFnczsKIAludmJvLT5iby5iZGV2ID0gJmRybS0+dHRtLmJkZXY7CiAKLQludmJvLT5mb3JjZV9jb2hlcmVudCA9IGZsYWdzICYgVFRNX1BMX0ZMQUdfVU5DQUNIRUQ7CisJaWYgKCFudnh4X2RldmljZSgmZHJtLT5kZXZpY2UpLT5mdW5jLT5jcHVfY29oZXJlbnQpCisJCW52Ym8tPmZvcmNlX2NvaGVyZW50ID0gZmxhZ3MgJiBUVE1fUExfRkxBR19VTkNBQ0hFRDsKIAogCW52Ym8tPnBhZ2Vfc2hpZnQgPSAxMjsKIAlpZiAoZHJtLT5jbGllbnQudm0pIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vZW5naW5lL2RldmljZS9wY2kuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vZW5naW5lL2RldmljZS9wY2kuYwppbmRleCBiMWI2OTMyLi42MmFkMDMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL2VuZ2luZS9kZXZpY2UvcGNpLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZrbS9lbmdpbmUvZGV2aWNlL3BjaS5jCkBAIC0xNjE0LDYgKzE2MTQsNyBAQAogCS5maW5pID0gbnZrbV9kZXZpY2VfcGNpX2ZpbmksCiAJLnJlc291cmNlX2FkZHIgPSBudmttX2RldmljZV9wY2lfcmVzb3VyY2VfYWRkciwKIAkucmVzb3VyY2Vfc2l6ZSA9IG52a21fZGV2aWNlX3BjaV9yZXNvdXJjZV9zaXplLAorCS5jcHVfY29oZXJlbnQgPSAhSVNfRU5BQkxFRChDT05GSUdfQVJNKSwKIH07CiAKIGludApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZrbS9lbmdpbmUvZGV2aWNlL3RlZ3JhLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL2VuZ2luZS9kZXZpY2UvdGVncmEuYwppbmRleCA5Mzk2ODJmLi45YjYzOGJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL2VuZ2luZS9kZXZpY2UvdGVncmEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL2VuZ2luZS9kZXZpY2UvdGVncmEuYwpAQCAtMjQ1LDYgKzI0NSw3IEBACiAJLmZpbmkgPSBudmttX2RldmljZV90ZWdyYV9maW5pLAogCS5yZXNvdXJjZV9hZGRyID0gbnZrbV9kZXZpY2VfdGVncmFfcmVzb3VyY2VfYWRkciwKIAkucmVzb3VyY2Vfc2l6ZSA9IG52a21fZGV2aWNlX3RlZ3JhX3Jlc291cmNlX3NpemUsCisJLmNwdV9jb2hlcmVudCA9IGZhbHNlLAogfTsKIAogaW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL2VuZ2luZS9maWZvL2RtYW52MDQuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vZW5naW5lL2ZpZm8vZG1hbnYwNC5jCmluZGV4IGVkZWMzMGYuLjBhN2I2ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vZW5naW5lL2ZpZm8vZG1hbnYwNC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vZW5naW5lL2ZpZm8vZG1hbnYwNC5jCkBAIC0zNyw3ICszNywxMCBAQAogewogCXN0cnVjdCBudjA0X2ZpZm9fY2hhbiAqY2hhbiA9IG52MDRfZmlmb19jaGFuKGJhc2UpOwogCXN0cnVjdCBudmttX2luc3RtZW0gKmltZW0gPSBjaGFuLT5maWZvLT5iYXNlLmVuZ2luZS5zdWJkZXYuZGV2aWNlLT5pbWVtOworCisJbXV0ZXhfbG9jaygmY2hhbi0+Zmlmby0+YmFzZS5lbmdpbmUuc3ViZGV2Lm11dGV4KTsKIAludmttX3JhbWh0X3JlbW92ZShpbWVtLT5yYW1odCwgY29va2llKTsKKwltdXRleF91bmxvY2soJmNoYW4tPmZpZm8tPmJhc2UuZW5naW5lLnN1YmRldi5tdXRleCk7CiB9CiAKIHN0YXRpYyBpbnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9xeGwvcXhsX2ZiLmMgYi9kcml2ZXJzL2dwdS9kcm0vcXhsL3F4bF9mYi5jCmluZGV4IGRmMjY1NzAuLjI4YzE0MjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9xeGwvcXhsX2ZiLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3F4bC9xeGxfZmIuYwpAQCAtNzMsMTAgKzczLDEyIEBACiAJfQogfQogCisjaWZkZWYgQ09ORklHX0RSTV9GQkRFVl9FTVVMQVRJT04KIHN0YXRpYyBzdHJ1Y3QgZmJfZGVmZXJyZWRfaW8gcXhsX2RlZmlvID0gewogCS5kZWxheQkJPSBRWExfRElSVFlfREVMQVksCiAJLmRlZmVycmVkX2lvCT0gZHJtX2ZiX2hlbHBlcl9kZWZlcnJlZF9pbywKIH07CisjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBmYl9vcHMgcXhsZmJfb3BzID0gewogCS5vd25lciA9IFRISVNfTU9EVUxFLApAQCAtMzEzLDggKzMxNSwxMCBAQAogCQlnb3RvIG91dF9kZXN0cm95X2ZiaTsKIAl9CiAKKyNpZmRlZiBDT05GSUdfRFJNX0ZCREVWX0VNVUxBVElPTgogCWluZm8tPmZiZGVmaW8gPSAmcXhsX2RlZmlvOwogCWZiX2RlZmVycmVkX2lvX2luaXQoaW5mbyk7CisjZW5kaWYKIAogCXFkZXYtPmZiZGV2X2luZm8gPSBpbmZvOwogCXFkZXYtPmZiZGV2X3FmYiA9ICZxZmJkZXYtPnFmYjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMKaW5kZXggYTk3YWJjOC4uMWRjZjM5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9hdG9tYmlvc19jcnRjLmMKQEAgLTYyNyw3ICs2MjcsOSBAQAogCQkJaWYgKHJhZGVvbl9jcnRjLT5zcy5yZWZkaXYpIHsKIAkJCQlyYWRlb25fY3J0Yy0+cGxsX2ZsYWdzIHw9IFJBREVPTl9QTExfVVNFX1JFRl9ESVY7CiAJCQkJcmFkZW9uX2NydGMtPnBsbF9yZWZlcmVuY2VfZGl2ID0gcmFkZW9uX2NydGMtPnNzLnJlZmRpdjsKLQkJCQlpZiAocmRldi0+ZmFtaWx5ID49IENISVBfUlY3NzApCisJCQkJaWYgKEFTSUNfSVNfQVZJVk8ocmRldikgJiYKKwkJCQkgICAgcmRldi0+ZmFtaWx5ICE9IENISVBfUlM3ODAgJiYKKwkJCQkgICAgcmRldi0+ZmFtaWx5ICE9IENISVBfUlM4ODApCiAJCQkJCXJhZGVvbl9jcnRjLT5wbGxfZmxhZ3MgfD0gUkFERU9OX1BMTF9VU0VfRlJBQ19GQl9ESVY7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2F0cHhfaGFuZGxlci5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXRweF9oYW5kbGVyLmMKaW5kZXggNmRlMzQyOC4uZGRlZjBkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXRweF9oYW5kbGVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXRweF9oYW5kbGVyLmMKQEAgLTE5OCwxNiArMTk4LDcgQEAKIAlhdHB4LT5pc19oeWJyaWQgPSBmYWxzZTsKIAlpZiAodmFsaWRfYml0cyAmIEFUUFhfTVNfSFlCUklEX0dGWF9TVVBQT1JURUQpIHsKIAkJcHJpbnRrKCJBVFBYIEh5YnJpZCBHcmFwaGljc1xuIik7Ci0jaWYgMQotCQkvKiBUaGlzIGlzIGEgdGVtcG9yYXJ5IGhhY2sgdW50aWwgdGhlIEQzIGNvbGQgc3VwcG9ydAotCQkgKiBtYWtlcyBpdCB1cHN0cmVhbS4gIFRoZSBBVFBYIHBvd2VyX2NvbnRyb2wgbWV0aG9kIHNlZW1zCi0JCSAqIHRvIHN0aWxsIHdvcmsgb24gZXZlbiBpZiB0aGUgc3lzdGVtIHNob3VsZCBiZSB1c2luZwotCQkgKiB0aGUgbmV3IHN0YW5kYXJkaXplZCBoeWJyaWQgRDMgY29sZCBBQ1BJIGludGVyZmFjZS4KLQkJICovCi0JCWF0cHgtPmZ1bmN0aW9ucy5wb3dlcl9jbnRsID0gdHJ1ZTsKLSNlbHNlCiAJCWF0cHgtPmZ1bmN0aW9ucy5wb3dlcl9jbnRsID0gZmFsc2U7Ci0jZW5kaWYKIAkJYXRweC0+aXNfaHlicmlkID0gdHJ1ZTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3R0bS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHRtLmMKaW5kZXggMGMwMGUxOS4uYzJlMGExYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHRtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHRtLmMKQEAgLTI2Myw4ICsyNjMsOCBAQAogCiAJcmRldiA9IHJhZGVvbl9nZXRfcmRldihiby0+YmRldik7CiAJcmlkeCA9IHJhZGVvbl9jb3B5X3JpbmdfaW5kZXgocmRldik7Ci0Jb2xkX3N0YXJ0ID0gb2xkX21lbS0+c3RhcnQgPDwgUEFHRV9TSElGVDsKLQluZXdfc3RhcnQgPSBuZXdfbWVtLT5zdGFydCA8PCBQQUdFX1NISUZUOworCW9sZF9zdGFydCA9ICh1NjQpb2xkX21lbS0+c3RhcnQgPDwgUEFHRV9TSElGVDsKKwluZXdfc3RhcnQgPSAodTY0KW5ld19tZW0tPnN0YXJ0IDw8IFBBR0VfU0hJRlQ7CiAKIAlzd2l0Y2ggKG9sZF9tZW0tPm1lbV90eXBlKSB7CiAJY2FzZSBUVE1fUExfVlJBTToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vc2lfZHBtLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3NpX2RwbS5jCmluZGV4IGU2YWJjMDkuLjFmNzhlYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vc2lfZHBtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9zaV9kcG0uYwpAQCAtMzAxNSw2ICszMDE1LDEyIEBACiAJaWYgKHJkZXYtPnBkZXYtPmRldmljZSA9PSAweDY4MTEgJiYKIAkgICAgcmRldi0+cGRldi0+cmV2aXNpb24gPT0gMHg4MSkKIAkJbWF4X21jbGsgPSAxMjAwMDA7CisJLyogbGltaXQgc2Nsay9tY2xrIG9uIEpldCBwYXJ0cyBmb3Igc3RhYmlsaXR5ICovCisJaWYgKHJkZXYtPnBkZXYtPmRldmljZSA9PSAweDY2NjUgJiYKKwkgICAgcmRldi0+cGRldi0+cmV2aXNpb24gPT0gMHhjMykgeworCQltYXhfc2NsayA9IDc1MDAwOworCQltYXhfbWNsayA9IDgwMDAwOworCX0KIAogCWlmIChycHMtPnZjZV9hY3RpdmUpIHsKIAkJcnBzLT5ldmNsayA9IHJkZXYtPnBtLmRwbS52Y2Vfc3RhdGVzW3JkZXYtPnBtLmRwbS52Y2VfbGV2ZWxdLmV2Y2xrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2RzaS5jIGIvZHJpdmVycy9ncHUvZHJtL3RlZ3JhL2RzaS5jCmluZGV4IDNkMjI4YWQuLjNkZWExMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90ZWdyYS9kc2kuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdGVncmEvZHNpLmMKQEAgLTg0MCw2ICs4NDAsMjEgQEAKIAkuZGVzdHJveSA9IHRlZ3JhX291dHB1dF9lbmNvZGVyX2Rlc3Ryb3ksCiB9OwogCitzdGF0aWMgdm9pZCB0ZWdyYV9kc2lfdW5wcmVwYXJlKHN0cnVjdCB0ZWdyYV9kc2kgKmRzaSkKK3sKKwlpbnQgZXJyOworCisJaWYgKGRzaS0+c2xhdmUpCisJCXRlZ3JhX2RzaV91bnByZXBhcmUoZHNpLT5zbGF2ZSk7CisKKwllcnIgPSB0ZWdyYV9taXBpX2Rpc2FibGUoZHNpLT5taXBpKTsKKwlpZiAoZXJyIDwgMCkKKwkJZGV2X2Vycihkc2ktPmRldiwgImZhaWxlZCB0byBkaXNhYmxlIE1JUEkgY2FsaWJyYXRpb246ICVkXG4iLAorCQkJZXJyKTsKKworCXBtX3J1bnRpbWVfcHV0KGRzaS0+ZGV2KTsKK30KKwogc3RhdGljIHZvaWQgdGVncmFfZHNpX2VuY29kZXJfZGlzYWJsZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCiB7CiAJc3RydWN0IHRlZ3JhX291dHB1dCAqb3V0cHV0ID0gZW5jb2Rlcl90b19vdXRwdXQoZW5jb2Rlcik7CkBAIC04NzYsNyArODkxLDI2IEBACiAKIAl0ZWdyYV9kc2lfZGlzYWJsZShkc2kpOwogCi0JcG1fcnVudGltZV9wdXQoZHNpLT5kZXYpOworCXRlZ3JhX2RzaV91bnByZXBhcmUoZHNpKTsKK30KKworc3RhdGljIHZvaWQgdGVncmFfZHNpX3ByZXBhcmUoc3RydWN0IHRlZ3JhX2RzaSAqZHNpKQoreworCWludCBlcnI7CisKKwlwbV9ydW50aW1lX2dldF9zeW5jKGRzaS0+ZGV2KTsKKworCWVyciA9IHRlZ3JhX21pcGlfZW5hYmxlKGRzaS0+bWlwaSk7CisJaWYgKGVyciA8IDApCisJCWRldl9lcnIoZHNpLT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIE1JUEkgY2FsaWJyYXRpb246ICVkXG4iLAorCQkJZXJyKTsKKworCWVyciA9IHRlZ3JhX2RzaV9wYWRfY2FsaWJyYXRlKGRzaSk7CisJaWYgKGVyciA8IDApCisJCWRldl9lcnIoZHNpLT5kZXYsICJNSVBJIGNhbGlicmF0aW9uIGZhaWxlZDogJWRcbiIsIGVycik7CisKKwlpZiAoZHNpLT5zbGF2ZSkKKwkJdGVncmFfZHNpX3ByZXBhcmUoZHNpLT5zbGF2ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIHRlZ3JhX2RzaV9lbmNvZGVyX2VuYWJsZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCkBAIC04ODcsMTMgKzkyMSw4IEBACiAJc3RydWN0IHRlZ3JhX2RzaSAqZHNpID0gdG9fZHNpKG91dHB1dCk7CiAJc3RydWN0IHRlZ3JhX2RzaV9zdGF0ZSAqc3RhdGU7CiAJdTMyIHZhbHVlOwotCWludCBlcnI7CiAKLQlwbV9ydW50aW1lX2dldF9zeW5jKGRzaS0+ZGV2KTsKLQotCWVyciA9IHRlZ3JhX2RzaV9wYWRfY2FsaWJyYXRlKGRzaSk7Ci0JaWYgKGVyciA8IDApCi0JCWRldl9lcnIoZHNpLT5kZXYsICJNSVBJIGNhbGlicmF0aW9uIGZhaWxlZDogJWRcbiIsIGVycik7CisJdGVncmFfZHNpX3ByZXBhcmUoZHNpKTsKIAogCXN0YXRlID0gdGVncmFfZHNpX2dldF9zdGF0ZShkc2kpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdWRsL3VkbF9mYi5jIGIvZHJpdmVycy9ncHUvZHJtL3VkbC91ZGxfZmIuYwppbmRleCBkNWRmNTU1Li42MTFiNmI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdWRsL3VkbF9mYi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS91ZGwvdWRsX2ZiLmMKQEAgLTEyMiw3ICsxMjIsNyBAQAogCQlyZXR1cm4gMDsKIAljbWQgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAotCWZvciAoaSA9IHk7IGkgPCBoZWlnaHQgOyBpKyspIHsKKwlmb3IgKGkgPSB5OyBpIDwgeSArIGhlaWdodCA7IGkrKykgewogCQljb25zdCBpbnQgbGluZV9vZmZzZXQgPSBmYi0+YmFzZS5waXRjaGVzWzBdICogaTsKIAkJY29uc3QgaW50IGJ5dGVfb2Zmc2V0ID0gbGluZV9vZmZzZXQgKyAoeCAqIGJwcCk7CiAJCWNvbnN0IGludCBkZXZfYnl0ZV9vZmZzZXQgPSAoZmItPmJhc2Uud2lkdGggKiBicHAgKiBpKSArICh4ICogYnBwKTsKQEAgLTIwMyw2ICsyMDMsNyBAQAogCiAJdWZiZGV2LT5mYl9jb3VudCsrOwogCisjaWZkZWYgQ09ORklHX0RSTV9GQkRFVl9FTVVMQVRJT04KIAlpZiAoZmJfZGVmaW8gJiYgKGluZm8tPmZiZGVmaW8gPT0gTlVMTCkpIHsKIAkJLyogZW5hYmxlIGRlZmlvIGF0IGxhc3QgbW9tZW50IGlmIG5vdCBkaXNhYmxlZCBieSBjbGllbnQgKi8KIApAQCAtMjE4LDYgKzIxOSw3IEBACiAJCWluZm8tPmZiZGVmaW8gPSBmYmRlZmlvOwogCQlmYl9kZWZlcnJlZF9pb19pbml0KGluZm8pOwogCX0KKyNlbmRpZgogCiAJcHJfbm90aWNlKCJvcGVuIC9kZXYvZmIlZCB1c2VyPSVkIGZiX2luZm89JXAgY291bnQ9JWRcbiIsCiAJCSAgaW5mby0+bm9kZSwgdXNlciwgaW5mbywgdWZiZGV2LT5mYl9jb3VudCk7CkBAIC0yMzUsMTIgKzIzNywxNCBAQAogCiAJdWZiZGV2LT5mYl9jb3VudC0tOwogCisjaWZkZWYgQ09ORklHX0RSTV9GQkRFVl9FTVVMQVRJT04KIAlpZiAoKHVmYmRldi0+ZmJfY291bnQgPT0gMCkgJiYgKGluZm8tPmZiZGVmaW8pKSB7CiAJCWZiX2RlZmVycmVkX2lvX2NsZWFudXAoaW5mbyk7CiAJCWtmcmVlKGluZm8tPmZiZGVmaW8pOwogCQlpbmZvLT5mYmRlZmlvID0gTlVMTDsKIAkJaW5mby0+ZmJvcHMtPmZiX21tYXAgPSB1ZGxfZmJfbW1hcDsKIAl9CisjZW5kaWYKIAogCXByX3dhcm4oInJlbGVhc2VkIC9kZXYvZmIlZCB1c2VyPSVkIGNvdW50PSVkXG4iLAogCQlpbmZvLT5ub2RlLCB1c2VyLCB1ZmJkZXYtPmZiX2NvdW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92YzQvdmM0X2JvLmMgYi9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF9iby5jCmluZGV4IDU5YWRjZjguLjNmNjcwNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92YzQvdmM0X2JvLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfYm8uYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJcmV0dXJuICZ2YzQtPmJvX2NhY2hlLnNpemVfbGlzdFtwYWdlX2luZGV4XTsKIH0KIAotdm9pZCB2YzRfYm9fY2FjaGVfcHVyZ2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIHZjNF9ib19jYWNoZV9wdXJnZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCB2YzRfZGV2ICp2YzQgPSB0b192YzRfZGV2KGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92YzQvdmM0X2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfZHJ2LmMKaW5kZXggOGI0MmQzMS4uOWVjZWY5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfZHJ2LmMKQEAgLTU3LDIxICs1NywyMSBAQAogCXN3aXRjaCAoYXJncy0+cGFyYW0pIHsKIAljYXNlIERSTV9WQzRfUEFSQU1fVjNEX0lERU5UMDoKIAkJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYygmdmM0LT52M2QtPnBkZXYtPmRldik7Ci0JCWlmIChyZXQpCisJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAkJYXJncy0+dmFsdWUgPSBWM0RfUkVBRChWM0RfSURFTlQwKTsKIAkJcG1fcnVudGltZV9wdXQoJnZjNC0+djNkLT5wZGV2LT5kZXYpOwogCQlicmVhazsKIAljYXNlIERSTV9WQzRfUEFSQU1fVjNEX0lERU5UMToKIAkJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYygmdmM0LT52M2QtPnBkZXYtPmRldik7Ci0JCWlmIChyZXQpCisJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAkJYXJncy0+dmFsdWUgPSBWM0RfUkVBRChWM0RfSURFTlQxKTsKIAkJcG1fcnVudGltZV9wdXQoJnZjNC0+djNkLT5wZGV2LT5kZXYpOwogCQlicmVhazsKIAljYXNlIERSTV9WQzRfUEFSQU1fVjNEX0lERU5UMjoKIAkJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYygmdmM0LT52M2QtPnBkZXYtPmRldik7Ci0JCWlmIChyZXQpCisJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAkJYXJncy0+dmFsdWUgPSBWM0RfUkVBRChWM0RfSURFTlQyKTsKIAkJcG1fcnVudGltZV9wdXQoJnZjNC0+djNkLT5wZGV2LT5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfZHJ2LmggYi9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF9kcnYuaAppbmRleCA0ODllM2RlLi40MjhlMjQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF9kcnYuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF9kcnYuaApAQCAtMzIxLDYgKzMyMSwxNSBAQAogCQkJCXN0cnVjdCB2YzRfZXhlY19pbmZvLCBoZWFkKTsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgdmM0X2V4ZWNfaW5mbyAqCit2YzRfbGFzdF9yZW5kZXJfam9iKHN0cnVjdCB2YzRfZGV2ICp2YzQpCit7CisJaWYgKGxpc3RfZW1wdHkoJnZjNC0+cmVuZGVyX2pvYl9saXN0KSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGxpc3RfbGFzdF9lbnRyeSgmdmM0LT5yZW5kZXJfam9iX2xpc3QsCisJCQkgICAgICAgc3RydWN0IHZjNF9leGVjX2luZm8sIGhlYWQpOworfQorCiAvKioKICAqIHN0cnVjdCB2YzRfdGV4dHVyZV9zYW1wbGVfaW5mbyAtIHNhdmVzIHRoZSBvZmZzZXRzIGludG8gdGhlIFVCTyBmb3IgdGV4dHVyZQogICogc2V0dXAgcGFyYW1ldGVycy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92YzQvdmM0X2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfZ2VtLmMKaW5kZXggNjE1NWU4YS4uYjI2MmM1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfZ2VtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfZ2VtLmMKQEAgLTUzNCw4ICs1MzQsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlleGVjLT5ibyA9IGtjYWxsb2MoZXhlYy0+Ym9fY291bnQsIHNpemVvZihzdHJ1Y3QgZHJtX2dlbV9jbWFfb2JqZWN0ICopLAotCQkJICAgR0ZQX0tFUk5FTCk7CisJZXhlYy0+Ym8gPSBkcm1fY2FsbG9jX2xhcmdlKGV4ZWMtPmJvX2NvdW50LAorCQkJCSAgICBzaXplb2Yoc3RydWN0IGRybV9nZW1fY21hX29iamVjdCAqKSk7CiAJaWYgKCFleGVjLT5ibykgewogCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSB2YWxpZGF0ZWQgQk8gcG9pbnRlcnNcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTU3Miw4ICs1NzIsOCBAQAogCXNwaW5fdW5sb2NrKCZmaWxlX3ByaXYtPnRhYmxlX2xvY2spOwogCiBmYWlsOgotCWtmcmVlKGhhbmRsZXMpOwotCXJldHVybiAwOworCWRybV9mcmVlX2xhcmdlKGhhbmRsZXMpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTYwOCw3ICs2MDgsNyBAQAogCSAqIHJlYWQgdGhlIGNvbnRlbnRzIGJhY2sgZm9yIHZhbGlkYXRpb24sIGFuZCBJIHRoaW5rIHRoZQogCSAqIGJvLT52YWRkciBpcyB1bmNhY2hlZCBhY2Nlc3MuCiAJICovCi0JdGVtcCA9IGttYWxsb2ModGVtcF9zaXplLCBHRlBfS0VSTkVMKTsKKwl0ZW1wID0gZHJtX21hbGxvY19hYih0ZW1wX3NpemUsIDEpOwogCWlmICghdGVtcCkgewogCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBzdG9yYWdlIGZvciBjb3B5aW5nICIKIAkJCSAgImluIGJpbi9yZW5kZXIgQ0xzLlxuIik7CkBAIC02NzUsNyArNjc1LDcgQEAKIAlyZXQgPSB2YzRfdmFsaWRhdGVfc2hhZGVyX3JlY3MoZGV2LCBleGVjKTsKIAogZmFpbDoKLQlrZnJlZSh0ZW1wKTsKKwlkcm1fZnJlZV9sYXJnZSh0ZW1wKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC02ODgsNyArNjg4LDcgQEAKIAlpZiAoZXhlYy0+Ym8pIHsKIAkJZm9yIChpID0gMDsgaSA8IGV4ZWMtPmJvX2NvdW50OyBpKyspCiAJCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZCgmZXhlYy0+Ym9baV0tPmJhc2UpOwotCQlrZnJlZShleGVjLT5ibyk7CisJCWRybV9mcmVlX2xhcmdlKGV4ZWMtPmJvKTsKIAl9CiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmV4ZWMtPnVucmVmX2xpc3QpKSB7CkBAIC05NDIsOCArOTQyLDggQEAKIAkJdmM0LT5vdmVyZmxvd19tZW0gPSBOVUxMOwogCX0KIAotCXZjNF9ib19jYWNoZV9kZXN0cm95KGRldik7Ci0KIAlpZiAodmM0LT5oYW5nX3N0YXRlKQogCQl2YzRfZnJlZV9oYW5nX3N0YXRlKGRldiwgdmM0LT5oYW5nX3N0YXRlKTsKKworCXZjNF9ib19jYWNoZV9kZXN0cm95KGRldik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF9pcnEuYyBiL2RyaXZlcnMvZ3B1L2RybS92YzQvdmM0X2lycS5jCmluZGV4IGIwMTA0YTM0Li4wOTRiYzZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF9pcnEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF9pcnEuYwpAQCAtODMsOCArODMsMTAgQEAKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmdmM0LT5qb2JfbG9jaywgaXJxZmxhZ3MpOwogCQljdXJyZW50X2V4ZWMgPSB2YzRfZmlyc3RfYmluX2pvYih2YzQpOworCQlpZiAoIWN1cnJlbnRfZXhlYykKKwkJCWN1cnJlbnRfZXhlYyA9IHZjNF9sYXN0X3JlbmRlcl9qb2IodmM0KTsKIAkJaWYgKGN1cnJlbnRfZXhlYykgewotCQkJdmM0LT5vdmVyZmxvd19tZW0tPnNlcW5vID0gdmM0LT5maW5pc2hlZF9zZXFubyArIDE7CisJCQl2YzQtPm92ZXJmbG93X21lbS0+c2Vxbm8gPSBjdXJyZW50X2V4ZWMtPnNlcW5vOwogCQkJbGlzdF9hZGRfdGFpbCgmdmM0LT5vdmVyZmxvd19tZW0tPnVucmVmX2hlYWQsCiAJCQkJICAgICAgJmN1cnJlbnRfZXhlYy0+dW5yZWZfbGlzdCk7CiAJCQl2YzQtPm92ZXJmbG93X21lbSA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF92YWxpZGF0ZV9zaGFkZXJzLmMgYi9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF92YWxpZGF0ZV9zaGFkZXJzLmMKaW5kZXggNDY1MjdlOS4uMjU0M2NmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfdmFsaWRhdGVfc2hhZGVycy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92YzQvdmM0X3ZhbGlkYXRlX3NoYWRlcnMuYwpAQCAtMzA5LDggKzMwOSwxNCBAQAogCSAqIG9mIHVuaWZvcm1zIG9uIGVhY2ggc2lkZS4gIEhvd2V2ZXIsIHRoaXMgc2NoZW1lIGlzIGVhc3kgdG8KIAkgKiB2YWxpZGF0ZSBzbyBpdCdzIGFsbCB3ZSBhbGxvdyBmb3Igbm93LgogCSAqLwotCi0JaWYgKFFQVV9HRVRfRklFTEQoaW5zdCwgUVBVX1NJRykgIT0gUVBVX1NJR19OT05FKSB7CisJc3dpdGNoIChRUFVfR0VUX0ZJRUxEKGluc3QsIFFQVV9TSUcpKSB7CisJY2FzZSBRUFVfU0lHX05PTkU6CisJY2FzZSBRUFVfU0lHX1NDT1JFQk9BUkRfVU5MT0NLOgorCWNhc2UgUVBVX1NJR19DT0xPUl9MT0FEOgorCWNhc2UgUVBVX1NJR19MT0FEX1RNVTA6CisJY2FzZSBRUFVfU0lHX0xPQURfVE1VMToKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJRFJNX0VSUk9SKCJ1bmlmb3JtcyBhZGRyZXNzIGNoYW5nZSBtdXN0IGJlICIKIAkJCSAgIm5vcm1hbCBtYXRoXG4iKTsKIAkJcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvaG9zdDF4L21pcGkuYyBiL2RyaXZlcnMvZ3B1L2hvc3QxeC9taXBpLmMKaW5kZXggNTJhNmZkMi4uZTAwODA5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvaG9zdDF4L21pcGkuYworKysgYi9kcml2ZXJzL2dwdS9ob3N0MXgvbWlwaS5jCkBAIC0yNDIsMjAgKzI0Miw2IEBACiAJZGV2LT5wYWRzID0gYXJncy5hcmdzWzBdOwogCWRldi0+ZGV2aWNlID0gZGV2aWNlOwogCi0JbXV0ZXhfbG9jaygmZGV2LT5taXBpLT5sb2NrKTsKLQotCWlmIChkZXYtPm1pcGktPnVzYWdlX2NvdW50KysgPT0gMCkgewotCQllcnIgPSB0ZWdyYV9taXBpX3Bvd2VyX3VwKGRldi0+bWlwaSk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlkZXZfZXJyKGRldi0+bWlwaS0+ZGV2LAotCQkJCSJmYWlsZWQgdG8gcG93ZXIgdXAgTUlQSSBicmlja3M6ICVkXG4iLAotCQkJCWVycik7Ci0JCQlyZXR1cm4gRVJSX1BUUihlcnIpOwotCQl9Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZkZXYtPm1pcGktPmxvY2spOwotCiAJcmV0dXJuIGRldjsKIAogcHV0OgpAQCAtMjcwLDMwICsyNTYsNDMgQEAKIAogdm9pZCB0ZWdyYV9taXBpX2ZyZWUoc3RydWN0IHRlZ3JhX21pcGlfZGV2aWNlICpkZXZpY2UpCiB7Ci0JaW50IGVycjsKLQotCW11dGV4X2xvY2soJmRldmljZS0+bWlwaS0+bG9jayk7Ci0KLQlpZiAoLS1kZXZpY2UtPm1pcGktPnVzYWdlX2NvdW50ID09IDApIHsKLQkJZXJyID0gdGVncmFfbWlwaV9wb3dlcl9kb3duKGRldmljZS0+bWlwaSk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQkvKgotCQkJICogTm90IG11Y2ggdGhhdCBjYW4gYmUgZG9uZSBoZXJlLCBzbyBhbiBlcnJvciBtZXNzYWdlCi0JCQkgKiB3aWxsIGhhdmUgdG8gZG8uCi0JCQkgKi8KLQkJCWRldl9lcnIoZGV2aWNlLT5taXBpLT5kZXYsCi0JCQkJImZhaWxlZCB0byBwb3dlciBkb3duIE1JUEkgYnJpY2tzOiAlZFxuIiwKLQkJCQllcnIpOwotCQl9Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZkZXZpY2UtPm1pcGktPmxvY2spOwotCiAJcGxhdGZvcm1fZGV2aWNlX3B1dChkZXZpY2UtPnBkZXYpOwogCWtmcmVlKGRldmljZSk7CiB9CiBFWFBPUlRfU1lNQk9MKHRlZ3JhX21pcGlfZnJlZSk7CiAKK2ludCB0ZWdyYV9taXBpX2VuYWJsZShzdHJ1Y3QgdGVncmFfbWlwaV9kZXZpY2UgKmRldikKK3sKKwlpbnQgZXJyID0gMDsKKworCW11dGV4X2xvY2soJmRldi0+bWlwaS0+bG9jayk7CisKKwlpZiAoZGV2LT5taXBpLT51c2FnZV9jb3VudCsrID09IDApCisJCWVyciA9IHRlZ3JhX21pcGlfcG93ZXJfdXAoZGV2LT5taXBpKTsKKworCW11dGV4X3VubG9jaygmZGV2LT5taXBpLT5sb2NrKTsKKworCXJldHVybiBlcnI7CisKK30KK0VYUE9SVF9TWU1CT0wodGVncmFfbWlwaV9lbmFibGUpOworCitpbnQgdGVncmFfbWlwaV9kaXNhYmxlKHN0cnVjdCB0ZWdyYV9taXBpX2RldmljZSAqZGV2KQoreworCWludCBlcnIgPSAwOworCisJbXV0ZXhfbG9jaygmZGV2LT5taXBpLT5sb2NrKTsKKworCWlmICgtLWRldi0+bWlwaS0+dXNhZ2VfY291bnQgPT0gMCkKKwkJZXJyID0gdGVncmFfbWlwaV9wb3dlcl9kb3duKGRldi0+bWlwaSk7CisKKwltdXRleF91bmxvY2soJmRldi0+bWlwaS0+bG9jayk7CisKKwlyZXR1cm4gZXJyOworCit9CitFWFBPUlRfU1lNQk9MKHRlZ3JhX21pcGlfZGlzYWJsZSk7CisKIHN0YXRpYyBpbnQgdGVncmFfbWlwaV93YWl0KHN0cnVjdCB0ZWdyYV9taXBpICptaXBpKQogewogCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDI1MCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91aGlkLmMgYi9kcml2ZXJzL2hpZC91aGlkLmMKaW5kZXggOTllYzNmZi4uN2Y4ZmYzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdWhpZC5jCisrKyBiL2RyaXZlcnMvaGlkL3VoaWQuYwpAQCAtNzc5LDE5ICs3NzksOCBAQAogCS5taW5vcgkJPSBVSElEX01JTk9SLAogCS5uYW1lCQk9IFVISURfTkFNRSwKIH07Cittb2R1bGVfbWlzY19kZXZpY2UodWhpZF9taXNjKTsKIAotc3RhdGljIGludCBfX2luaXQgdWhpZF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJnVoaWRfbWlzYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB1aGlkX2V4aXQodm9pZCkKLXsKLQltaXNjX2RlcmVnaXN0ZXIoJnVoaWRfbWlzYyk7Ci19Ci0KLW1vZHVsZV9pbml0KHVoaWRfaW5pdCk7Ci1tb2R1bGVfZXhpdCh1aGlkX2V4aXQpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiRGF2aWQgSGVycm1hbm4gPGRoLmhlcnJtYW5uQGdtYWlsLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiVXNlci1zcGFjZSBJL08gZHJpdmVyIHN1cHBvcnQgZm9yIEhJRCBzdWJzeXN0ZW0iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHYvY2hhbm5lbC5jIGIvZHJpdmVycy9odi9jaGFubmVsLmMKaW5kZXggNTZkZDI2MS4uMTZmOTFjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9odi9jaGFubmVsLmMKKysrIGIvZHJpdmVycy9odi9jaGFubmVsLmMKQEAgLTQzLDcgKzQzLDEyIEBACiB7CiAJc3RydWN0IGh2X21vbml0b3JfcGFnZSAqbW9uaXRvcnBhZ2U7CiAKLQlpZiAoY2hhbm5lbC0+b2ZmZXJtc2cubW9uaXRvcl9hbGxvY2F0ZWQpIHsKKwkvKgorCSAqIEZvciBjaGFubmVscyBtYXJrZWQgYXMgaW4gImxvdyBsYXRlbmN5IiBtb2RlCisJICogYnlwYXNzIHRoZSBtb25pdG9yIHBhZ2UgbWVjaGFuaXNtLgorCSAqLworCWlmICgoY2hhbm5lbC0+b2ZmZXJtc2cubW9uaXRvcl9hbGxvY2F0ZWQpICYmCisJICAgICghY2hhbm5lbC0+bG93X2xhdGVuY3kpKSB7CiAJCS8qIEVhY2ggdTMyIHJlcHJlc2VudHMgMzIgY2hhbm5lbHMgKi8KIAkJc3luY19zZXRfYml0KGNoYW5uZWwtPm9mZmVybXNnLmNoaWxkX3JlbGlkICYgMzEsCiAJCQkodW5zaWduZWQgbG9uZyAqKSB2bWJ1c19jb25uZWN0aW9uLnNlbmRfaW50X3BhZ2UgKwpAQCAtNzAsMTIgKzc1LDE0IEBACiB7CiAJc3RydWN0IHZtYnVzX2NoYW5uZWxfb3Blbl9jaGFubmVsICpvcGVuX21zZzsKIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tc2dpbmZvICpvcGVuX2luZm8gPSBOVUxMOwotCXZvaWQgKmluLCAqb3V0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldCwgZXJyID0gMDsKLQl1bnNpZ25lZCBsb25nIHQ7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKKwlpZiAoc2VuZF9yaW5nYnVmZmVyX3NpemUgJSBQQUdFX1NJWkUgfHwKKwkgICAgcmVjdl9yaW5nYnVmZmVyX3NpemUgJSBQQUdFX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm5ld2NoYW5uZWwtPmxvY2ssIGZsYWdzKTsKIAlpZiAobmV3Y2hhbm5lbC0+c3RhdGUgPT0gQ0hBTk5FTF9PUEVOX1NUQVRFKSB7CiAJCW5ld2NoYW5uZWwtPnN0YXRlID0gQ0hBTk5FTF9PUEVOSU5HX1NUQVRFOwpAQCAtOTUsMzYgKzEwMiwzMyBAQAogCQkJCXJlY3ZfcmluZ2J1ZmZlcl9zaXplKSk7CiAKIAlpZiAoIXBhZ2UpCi0JCW91dCA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMfF9fR0ZQX1pFUk8sCi0JCQkJCSAgICAgICBnZXRfb3JkZXIoc2VuZF9yaW5nYnVmZmVyX3NpemUgKwotCQkJCQkgICAgICAgcmVjdl9yaW5nYnVmZmVyX3NpemUpKTsKLQllbHNlCi0JCW91dCA9ICh2b2lkICopcGFnZV9hZGRyZXNzKHBhZ2UpOworCQlwYWdlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTHxfX0dGUF9aRVJPLAorCQkJCSAgIGdldF9vcmRlcihzZW5kX3JpbmdidWZmZXJfc2l6ZSArCisJCQkJCSAgICAgcmVjdl9yaW5nYnVmZmVyX3NpemUpKTsKIAotCWlmICghb3V0KSB7CisJaWYgKCFwYWdlKSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3IwOworCQlnb3RvIGVycm9yX3NldF9jaG5zdGF0ZTsKIAl9CiAKLQlpbiA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKW91dCArIHNlbmRfcmluZ2J1ZmZlcl9zaXplKTsKLQotCW5ld2NoYW5uZWwtPnJpbmdidWZmZXJfcGFnZXMgPSBvdXQ7CisJbmV3Y2hhbm5lbC0+cmluZ2J1ZmZlcl9wYWdlcyA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKIAluZXdjaGFubmVsLT5yaW5nYnVmZmVyX3BhZ2Vjb3VudCA9IChzZW5kX3JpbmdidWZmZXJfc2l6ZSArCiAJCQkJCSAgIHJlY3ZfcmluZ2J1ZmZlcl9zaXplKSA+PiBQQUdFX1NISUZUOwogCi0JcmV0ID0gaHZfcmluZ2J1ZmZlcl9pbml0KAotCQkmbmV3Y2hhbm5lbC0+b3V0Ym91bmQsIG91dCwgc2VuZF9yaW5nYnVmZmVyX3NpemUpOworCXJldCA9IGh2X3JpbmdidWZmZXJfaW5pdCgmbmV3Y2hhbm5lbC0+b3V0Ym91bmQsIHBhZ2UsCisJCQkJIHNlbmRfcmluZ2J1ZmZlcl9zaXplID4+IFBBR0VfU0hJRlQpOwogCiAJaWYgKHJldCAhPSAwKSB7CiAJCWVyciA9IHJldDsKLQkJZ290byBlcnJvcjA7CisJCWdvdG8gZXJyb3JfZnJlZV9wYWdlczsKIAl9CiAKLQlyZXQgPSBodl9yaW5nYnVmZmVyX2luaXQoCi0JCSZuZXdjaGFubmVsLT5pbmJvdW5kLCBpbiwgcmVjdl9yaW5nYnVmZmVyX3NpemUpOworCXJldCA9IGh2X3JpbmdidWZmZXJfaW5pdCgmbmV3Y2hhbm5lbC0+aW5ib3VuZCwKKwkJCQkgJnBhZ2Vbc2VuZF9yaW5nYnVmZmVyX3NpemUgPj4gUEFHRV9TSElGVF0sCisJCQkJIHJlY3ZfcmluZ2J1ZmZlcl9zaXplID4+IFBBR0VfU0hJRlQpOwogCWlmIChyZXQgIT0gMCkgewogCQllcnIgPSByZXQ7Ci0JCWdvdG8gZXJyb3IwOworCQlnb3RvIGVycm9yX2ZyZWVfcGFnZXM7CiAJfQogCiAKQEAgLTEzMiwxNCArMTM2LDE0IEBACiAJbmV3Y2hhbm5lbC0+cmluZ2J1ZmZlcl9ncGFkbGhhbmRsZSA9IDA7CiAKIAlyZXQgPSB2bWJ1c19lc3RhYmxpc2hfZ3BhZGwobmV3Y2hhbm5lbCwKLQkJCQkJIG5ld2NoYW5uZWwtPm91dGJvdW5kLnJpbmdfYnVmZmVyLAotCQkJCQkgc2VuZF9yaW5nYnVmZmVyX3NpemUgKwotCQkJCQkgcmVjdl9yaW5nYnVmZmVyX3NpemUsCi0JCQkJCSAmbmV3Y2hhbm5lbC0+cmluZ2J1ZmZlcl9ncGFkbGhhbmRsZSk7CisJCQkJICAgIHBhZ2VfYWRkcmVzcyhwYWdlKSwKKwkJCQkgICAgc2VuZF9yaW5nYnVmZmVyX3NpemUgKworCQkJCSAgICByZWN2X3JpbmdidWZmZXJfc2l6ZSwKKwkJCQkgICAgJm5ld2NoYW5uZWwtPnJpbmdidWZmZXJfZ3BhZGxoYW5kbGUpOwogCiAJaWYgKHJldCAhPSAwKSB7CiAJCWVyciA9IHJldDsKLQkJZ290byBlcnJvcjA7CisJCWdvdG8gZXJyb3JfZnJlZV9wYWdlczsKIAl9CiAKIAkvKiBDcmVhdGUgYW5kIGluaXQgdGhlIGNoYW5uZWwgb3BlbiBtZXNzYWdlICovCkBAIC0xNDgsNyArMTUyLDcgQEAKIAkJCSAgIEdGUF9LRVJORUwpOwogCWlmICghb3Blbl9pbmZvKSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3JfZ3BhZGw7CisJCWdvdG8gZXJyb3JfZnJlZV9ncGFkbDsKIAl9CiAKIAlpbml0X2NvbXBsZXRpb24oJm9wZW5faW5mby0+d2FpdGV2ZW50KTsKQEAgLTE2NCw3ICsxNjgsNyBAQAogCiAJaWYgKHVzZXJkYXRhbGVuID4gTUFYX1VTRVJfREVGSU5FRF9CWVRFUykgewogCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIGVycm9yX2dwYWRsOworCQlnb3RvIGVycm9yX2ZyZWVfZ3BhZGw7CiAJfQogCiAJaWYgKHVzZXJkYXRhbGVuKQpAQCAtMTgwLDE0ICsxODQsMTAgQEAKIAogCWlmIChyZXQgIT0gMCkgewogCQllcnIgPSByZXQ7Ci0JCWdvdG8gZXJyb3IxOworCQlnb3RvIGVycm9yX2NsZWFuX21zZ2xpc3Q7CiAJfQogCi0JdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmb3Blbl9pbmZvLT53YWl0ZXZlbnQsIDUqSFopOwotCWlmICh0ID09IDApIHsKLQkJZXJyID0gLUVUSU1FRE9VVDsKLQkJZ290byBlcnJvcjE7Ci0JfQorCXdhaXRfZm9yX2NvbXBsZXRpb24oJm9wZW5faW5mby0+d2FpdGV2ZW50KTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ2bWJ1c19jb25uZWN0aW9uLmNoYW5uZWxtc2dfbG9jaywgZmxhZ3MpOwogCWxpc3RfZGVsKCZvcGVuX2luZm8tPm1zZ2xpc3RlbnRyeSk7CkBAIC0xOTUsMjUgKzE5NSwyNyBAQAogCiAJaWYgKG9wZW5faW5mby0+cmVzcG9uc2Uub3Blbl9yZXN1bHQuc3RhdHVzKSB7CiAJCWVyciA9IC1FQUdBSU47Ci0JCWdvdG8gZXJyb3JfZ3BhZGw7CisJCWdvdG8gZXJyb3JfZnJlZV9ncGFkbDsKIAl9CiAKIAluZXdjaGFubmVsLT5zdGF0ZSA9IENIQU5ORUxfT1BFTkVEX1NUQVRFOwogCWtmcmVlKG9wZW5faW5mbyk7CiAJcmV0dXJuIDA7CiAKLWVycm9yMToKK2Vycm9yX2NsZWFuX21zZ2xpc3Q6CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnZtYnVzX2Nvbm5lY3Rpb24uY2hhbm5lbG1zZ19sb2NrLCBmbGFncyk7CiAJbGlzdF9kZWwoJm9wZW5faW5mby0+bXNnbGlzdGVudHJ5KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2bWJ1c19jb25uZWN0aW9uLmNoYW5uZWxtc2dfbG9jaywgZmxhZ3MpOwogCi1lcnJvcl9ncGFkbDoKK2Vycm9yX2ZyZWVfZ3BhZGw6CiAJdm1idXNfdGVhcmRvd25fZ3BhZGwobmV3Y2hhbm5lbCwgbmV3Y2hhbm5lbC0+cmluZ2J1ZmZlcl9ncGFkbGhhbmRsZSk7Ci0KLWVycm9yMDoKLQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKW91dCwKLQkJZ2V0X29yZGVyKHNlbmRfcmluZ2J1ZmZlcl9zaXplICsgcmVjdl9yaW5nYnVmZmVyX3NpemUpKTsKIAlrZnJlZShvcGVuX2luZm8pOworZXJyb3JfZnJlZV9wYWdlczoKKwlodl9yaW5nYnVmZmVyX2NsZWFudXAoJm5ld2NoYW5uZWwtPm91dGJvdW5kKTsKKwlodl9yaW5nYnVmZmVyX2NsZWFudXAoJm5ld2NoYW5uZWwtPmluYm91bmQpOworCV9fZnJlZV9wYWdlcyhwYWdlLAorCQkgICAgIGdldF9vcmRlcihzZW5kX3JpbmdidWZmZXJfc2l6ZSArIHJlY3ZfcmluZ2J1ZmZlcl9zaXplKSk7CitlcnJvcl9zZXRfY2huc3RhdGU6CiAJbmV3Y2hhbm5lbC0+c3RhdGUgPSBDSEFOTkVMX09QRU5fU1RBVEU7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTIzOCw4ICsyNDAsNyBAQAogICogY3JlYXRlX2dwYWRsX2hlYWRlciAtIENyZWF0ZXMgYSBncGFkbCBmb3IgdGhlIHNwZWNpZmllZCBidWZmZXIKICAqLwogc3RhdGljIGludCBjcmVhdGVfZ3BhZGxfaGVhZGVyKHZvaWQgKmtidWZmZXIsIHUzMiBzaXplLAotCQkJCQkgc3RydWN0IHZtYnVzX2NoYW5uZWxfbXNnaW5mbyAqKm1zZ2luZm8sCi0JCQkJCSB1MzIgKm1lc3NhZ2Vjb3VudCkKKwkJCSAgICAgICBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tc2dpbmZvICoqbXNnaW5mbykKIHsKIAlpbnQgaTsKIAlpbnQgcGFnZWNvdW50OwpAQCAtMjgzLDcgKzI4NCw2IEBACiAJCQlncGFkbF9oZWFkZXItPnJhbmdlWzBdLnBmbl9hcnJheVtpXSA9IHNsb3dfdmlydF90b19waHlzKAogCQkJCWtidWZmZXIgKyBQQUdFX1NJWkUgKiBpKSA+PiBQQUdFX1NISUZUOwogCQkqbXNnaW5mbyA9IG1zZ2hlYWRlcjsKLQkJKm1lc3NhZ2Vjb3VudCA9IDE7CiAKIAkJcGZuc3VtID0gcGZuY291bnQ7CiAJCXBmbmxlZnQgPSBwYWdlY291bnQgLSBwZm5jb3VudDsKQEAgLTMyMyw3ICszMjMsNiBAQAogCQkJfQogCiAJCQltc2dib2R5LT5tc2dzaXplID0gbXNnc2l6ZTsKLQkJCSgqbWVzc2FnZWNvdW50KSsrOwogCQkJZ3BhZGxfYm9keSA9CiAJCQkJKHN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX2JvZHkgKiltc2dib2R5LT5tc2c7CiAKQEAgLTM1Miw2ICszNTEsOCBAQAogCQltc2doZWFkZXIgPSBremFsbG9jKG1zZ3NpemUsIEdGUF9LRVJORUwpOwogCQlpZiAobXNnaGVhZGVyID09IE5VTEwpCiAJCQlnb3RvIG5vbWVtOworCisJCUlOSVRfTElTVF9IRUFEKCZtc2doZWFkZXItPnN1Ym1zZ2xpc3QpOwogCQltc2doZWFkZXItPm1zZ3NpemUgPSBtc2dzaXplOwogCiAJCWdwYWRsX2hlYWRlciA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF9oZWFkZXIgKikKQEAgLTM2Niw3ICszNjcsNiBAQAogCQkJCWtidWZmZXIgKyBQQUdFX1NJWkUgKiBpKSA+PiBQQUdFX1NISUZUOwogCiAJCSptc2dpbmZvID0gbXNnaGVhZGVyOwotCQkqbWVzc2FnZWNvdW50ID0gMTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTM5MCw4ICszOTAsNyBAQAogCXN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX2hlYWRlciAqZ3BhZGxtc2c7CiAJc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfYm9keSAqZ3BhZGxfYm9keTsKIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tc2dpbmZvICptc2dpbmZvID0gTlVMTDsKLQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tc2dpbmZvICpzdWJtc2dpbmZvOwotCXUzMiBtc2djb3VudDsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tc2dpbmZvICpzdWJtc2dpbmZvLCAqdG1wOwogCXN0cnVjdCBsaXN0X2hlYWQgKmN1cnI7CiAJdTMyIG5leHRfZ3BhZGxfaGFuZGxlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC00MDAsNyArMzk5LDcgQEAKIAluZXh0X2dwYWRsX2hhbmRsZSA9CiAJCShhdG9taWNfaW5jX3JldHVybigmdm1idXNfY29ubmVjdGlvbi5uZXh0X2dwYWRsX2hhbmRsZSkgLSAxKTsKIAotCXJldCA9IGNyZWF0ZV9ncGFkbF9oZWFkZXIoa2J1ZmZlciwgc2l6ZSwgJm1zZ2luZm8sICZtc2djb3VudCk7CisJcmV0ID0gY3JlYXRlX2dwYWRsX2hlYWRlcihrYnVmZmVyLCBzaXplLCAmbXNnaW5mbyk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtNDIzLDI0ICs0MjIsMjEgQEAKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gY2xlYW51cDsKIAotCWlmIChtc2djb3VudCA+IDEpIHsKLQkJbGlzdF9mb3JfZWFjaChjdXJyLCAmbXNnaW5mby0+c3VibXNnbGlzdCkgeworCWxpc3RfZm9yX2VhY2goY3VyciwgJm1zZ2luZm8tPnN1Ym1zZ2xpc3QpIHsKKwkJc3VibXNnaW5mbyA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tc2dpbmZvICopY3VycjsKKwkJZ3BhZGxfYm9keSA9CisJCQkoc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfYm9keSAqKXN1Ym1zZ2luZm8tPm1zZzsKIAotCQkJc3VibXNnaW5mbyA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tc2dpbmZvICopY3VycjsKLQkJCWdwYWRsX2JvZHkgPQotCQkJICAgICAoc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfYm9keSAqKXN1Ym1zZ2luZm8tPm1zZzsKKwkJZ3BhZGxfYm9keS0+aGVhZGVyLm1zZ3R5cGUgPQorCQkJQ0hBTk5FTE1TR19HUEFETF9CT0RZOworCQlncGFkbF9ib2R5LT5ncGFkbCA9IG5leHRfZ3BhZGxfaGFuZGxlOwogCi0JCQlncGFkbF9ib2R5LT5oZWFkZXIubXNndHlwZSA9Ci0JCQkJQ0hBTk5FTE1TR19HUEFETF9CT0RZOwotCQkJZ3BhZGxfYm9keS0+Z3BhZGwgPSBuZXh0X2dwYWRsX2hhbmRsZTsKKwkJcmV0ID0gdm1idXNfcG9zdF9tc2coZ3BhZGxfYm9keSwKKwkJCQkgICAgIHN1Ym1zZ2luZm8tPm1zZ3NpemUgLQorCQkJCSAgICAgc2l6ZW9mKCpzdWJtc2dpbmZvKSk7CisJCWlmIChyZXQgIT0gMCkKKwkJCWdvdG8gY2xlYW51cDsKIAotCQkJcmV0ID0gdm1idXNfcG9zdF9tc2coZ3BhZGxfYm9keSwKLQkJCQkJICAgICAgIHN1Ym1zZ2luZm8tPm1zZ3NpemUgLQotCQkJCQkgICAgICAgc2l6ZW9mKCpzdWJtc2dpbmZvKSk7Ci0JCQlpZiAocmV0ICE9IDApCi0JCQkJZ290byBjbGVhbnVwOwotCi0JCX0KIAl9CiAJd2FpdF9mb3JfY29tcGxldGlvbigmbXNnaW5mby0+d2FpdGV2ZW50KTsKIApAQCAtNDUxLDYgKzQ0NywxMCBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZ2bWJ1c19jb25uZWN0aW9uLmNoYW5uZWxtc2dfbG9jaywgZmxhZ3MpOwogCWxpc3RfZGVsKCZtc2dpbmZvLT5tc2dsaXN0ZW50cnkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZtYnVzX2Nvbm5lY3Rpb24uY2hhbm5lbG1zZ19sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHN1Ym1zZ2luZm8sIHRtcCwgJm1zZ2luZm8tPnN1Ym1zZ2xpc3QsCisJCQkJIG1zZ2xpc3RlbnRyeSkgeworCQlrZnJlZShzdWJtc2dpbmZvKTsKKwl9CiAKIAlrZnJlZShtc2dpbmZvKTsKIAlyZXR1cm4gcmV0OwpAQCAtNTEyLDcgKzUxMiw2IEBACiBzdGF0aWMgaW50IHZtYnVzX2Nsb3NlX2ludGVybmFsKHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsKQogewogCXN0cnVjdCB2bWJ1c19jaGFubmVsX2Nsb3NlX2NoYW5uZWwgKm1zZzsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgKnRhc2tsZXQ7CiAJaW50IHJldDsKIAogCS8qCkBAIC01MjQsOCArNTIzLDcgQEAKIAkgKiBUbyByZXNvbHZlIHRoZSByYWNlLCB3ZSBjYW4gc2VyaWFsaXplIHRoZW0gYnkgZGlzYWJsaW5nIHRoZQogCSAqIHRhc2tsZXQgd2hlbiB0aGUgbGF0dGVyIGlzIHJ1bm5pbmcgaGVyZS4KIAkgKi8KLQl0YXNrbGV0ID0gaHZfY29udGV4dC5ldmVudF9kcGNbY2hhbm5lbC0+dGFyZ2V0X2NwdV07Ci0JdGFza2xldF9kaXNhYmxlKHRhc2tsZXQpOworCWh2X2V2ZW50X3Rhc2tsZXRfZGlzYWJsZShjaGFubmVsKTsKIAogCS8qCiAJICogSW4gY2FzZSBhIGRldmljZSBkcml2ZXIncyBwcm9iZSgpIGZhaWxzIChlLmcuLApAQCAtNTkxLDcgKzU4OSw3IEBACiAJCWdldF9vcmRlcihjaGFubmVsLT5yaW5nYnVmZmVyX3BhZ2Vjb3VudCAqIFBBR0VfU0laRSkpOwogCiBvdXQ6Ci0JdGFza2xldF9lbmFibGUodGFza2xldCk7CisJaHZfZXZlbnRfdGFza2xldF9lbmFibGUoY2hhbm5lbCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNjU5LDcgKzY1Nyw3IEBACiAJYnVmZmVybGlzdFsyXS5pb3ZfbGVuID0gKHBhY2tldGxlbl9hbGlnbmVkIC0gcGFja2V0bGVuKTsKIAogCXJldCA9IGh2X3JpbmdidWZmZXJfd3JpdGUoJmNoYW5uZWwtPm91dGJvdW5kLCBidWZmZXJsaXN0LCBudW1fdmVjcywKLQkJCQkgICZzaWduYWwsIGxvY2spOworCQkJCSAgJnNpZ25hbCwgbG9jaywgY2hhbm5lbC0+c2lnbmFsX3BvbGljeSk7CiAKIAkvKgogCSAqIFNpZ25hbGxpbmcgdGhlIGhvc3QgaXMgY29uZGl0aW9uYWwgb24gbWFueSBmYWN0b3JzOgpAQCAtNjgwLDExICs2NzgsNiBAQAogCSAqIG1lY2hhbmlzbSB3aGljaCBjYW4gaHVydCB0aGUgcGVyZm9ybWFuY2Ugb3RoZXJ3aXNlLgogCSAqLwogCi0JaWYgKGNoYW5uZWwtPnNpZ25hbF9wb2xpY3kpCi0JCXNpZ25hbCA9IHRydWU7Ci0JZWxzZQotCQlraWNrX3EgPSB0cnVlOwotCiAJaWYgKCgocmV0ID09IDApICYmIGtpY2tfcSAmJiBzaWduYWwpIHx8CiAJICAgIChyZXQgJiYgIWlzX2h2c29ja19jaGFubmVsKGNoYW5uZWwpKSkKIAkJdm1idXNfc2V0ZXZlbnQoY2hhbm5lbCk7CkBAIC03NzcsNyArNzcwLDcgQEAKIAlidWZmZXJsaXN0WzJdLmlvdl9sZW4gPSAocGFja2V0bGVuX2FsaWduZWQgLSBwYWNrZXRsZW4pOwogCiAJcmV0ID0gaHZfcmluZ2J1ZmZlcl93cml0ZSgmY2hhbm5lbC0+b3V0Ym91bmQsIGJ1ZmZlcmxpc3QsIDMsCi0JCQkJICAmc2lnbmFsLCBsb2NrKTsKKwkJCQkgICZzaWduYWwsIGxvY2ssIGNoYW5uZWwtPnNpZ25hbF9wb2xpY3kpOwogCiAJLyoKIAkgKiBTaWduYWxsaW5nIHRoZSBob3N0IGlzIGNvbmRpdGlvbmFsIG9uIG1hbnkgZmFjdG9yczoKQEAgLTc5NSwxMSArNzg4LDYgQEAKIAkgKiBlbm91Z2ggY29uZGl0aW9uIHRoYXQgaXQgc2hvdWxkIG5vdCBtYXR0ZXIuCiAJICovCiAKLQlpZiAoY2hhbm5lbC0+c2lnbmFsX3BvbGljeSkKLQkJc2lnbmFsID0gdHJ1ZTsKLQllbHNlCi0JCWtpY2tfcSA9IHRydWU7Ci0KIAlpZiAoKChyZXQgPT0gMCkgJiYga2lja19xICYmIHNpZ25hbCkgfHwgKHJldCkpCiAJCXZtYnVzX3NldGV2ZW50KGNoYW5uZWwpOwogCkBAIC04NjEsNyArODQ5LDcgQEAKIAlidWZmZXJsaXN0WzJdLmlvdl9sZW4gPSAocGFja2V0bGVuX2FsaWduZWQgLSBwYWNrZXRsZW4pOwogCiAJcmV0ID0gaHZfcmluZ2J1ZmZlcl93cml0ZSgmY2hhbm5lbC0+b3V0Ym91bmQsIGJ1ZmZlcmxpc3QsIDMsCi0JCQkJICAmc2lnbmFsLCBsb2NrKTsKKwkJCQkgICZzaWduYWwsIGxvY2ssIGNoYW5uZWwtPnNpZ25hbF9wb2xpY3kpOwogCiAJaWYgKHJldCA9PSAwICYmIHNpZ25hbCkKIAkJdm1idXNfc2V0ZXZlbnQoY2hhbm5lbCk7CkBAIC05MjYsNyArOTE0LDcgQEAKIAlidWZmZXJsaXN0WzJdLmlvdl9sZW4gPSAocGFja2V0bGVuX2FsaWduZWQgLSBwYWNrZXRsZW4pOwogCiAJcmV0ID0gaHZfcmluZ2J1ZmZlcl93cml0ZSgmY2hhbm5lbC0+b3V0Ym91bmQsIGJ1ZmZlcmxpc3QsIDMsCi0JCQkJICAmc2lnbmFsLCBsb2NrKTsKKwkJCQkgICZzaWduYWwsIGxvY2ssIGNoYW5uZWwtPnNpZ25hbF9wb2xpY3kpOwogCiAJaWYgKHJldCA9PSAwICYmIHNpZ25hbCkKIAkJdm1idXNfc2V0ZXZlbnQoY2hhbm5lbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h2L2NoYW5uZWxfbWdtdC5jIGIvZHJpdmVycy9odi9jaGFubmVsX21nbXQuYwppbmRleCBiNmMxMjExLi45NmE4NWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h2L2NoYW5uZWxfbWdtdC5jCisrKyBiL2RyaXZlcnMvaHYvY2hhbm5lbF9tZ210LmMKQEAgLTIxLDYgKzIxLDcgQEAKICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CkBAIC0xMzgsMTAgKzEzOSwzMiBAQAogCX0sCiB9OwogCi1zdGF0aWMgdTE2IGh2X2dldF9kZXZfdHlwZShjb25zdCB1dWlkX2xlICpndWlkKQorc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJdXVpZF9sZSBndWlkOworfSB2bWJ1c191bnN1cHBvcnRlZF9kZXZzW10gPSB7CisJeyBIVl9BVk1BMV9HVUlEIH0sCisJeyBIVl9BVk1BMl9HVUlEIH0sCisJeyBIVl9SRFZfR1VJRAl9LAorfTsKKworc3RhdGljIGJvb2wgaXNfdW5zdXBwb3J0ZWRfdm1idXNfZGV2cyhjb25zdCB1dWlkX2xlICpndWlkKQogeworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodm1idXNfdW5zdXBwb3J0ZWRfZGV2cyk7IGkrKykKKwkJaWYgKCF1dWlkX2xlX2NtcCgqZ3VpZCwgdm1idXNfdW5zdXBwb3J0ZWRfZGV2c1tpXS5ndWlkKSkKKwkJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHUxNiBodl9nZXRfZGV2X3R5cGUoY29uc3Qgc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJY29uc3QgdXVpZF9sZSAqZ3VpZCA9ICZjaGFubmVsLT5vZmZlcm1zZy5vZmZlci5pZl90eXBlOwogCXUxNiBpOwogCisJaWYgKGlzX2h2c29ja19jaGFubmVsKGNoYW5uZWwpIHx8IGlzX3Vuc3VwcG9ydGVkX3ZtYnVzX2RldnMoZ3VpZCkpCisJCXJldHVybiBIVl9VTktPV047CisKIAlmb3IgKGkgPSBIVl9JREU7IGkgPCBIVl9VTktPV047IGkrKykgewogCQlpZiAoIXV1aWRfbGVfY21wKCpndWlkLCB2bWJ1c19kZXZzW2ldLmd1aWQpKQogCQkJcmV0dXJuIGk7CkBAIC0yNTEsMTQgKzI3NCwxMiBAQAogICovCiBzdGF0aWMgc3RydWN0IHZtYnVzX2NoYW5uZWwgKmFsbG9jX2NoYW5uZWwodm9pZCkKIHsKLQlzdGF0aWMgYXRvbWljX3QgY2hhbl9udW0gPSBBVE9NSUNfSU5JVCgwKTsKIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbDsKIAogCWNoYW5uZWwgPSBremFsbG9jKHNpemVvZigqY2hhbm5lbCksIEdGUF9BVE9NSUMpOwogCWlmICghY2hhbm5lbCkKIAkJcmV0dXJuIE5VTEw7CiAKLQljaGFubmVsLT5pZCA9IGF0b21pY19pbmNfcmV0dXJuKCZjaGFuX251bSk7CiAJY2hhbm5lbC0+YWNxdWlyZV9yaW5nX2xvY2sgPSB0cnVlOwogCXNwaW5fbG9ja19pbml0KCZjaGFubmVsLT5pbmJvdW5kX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZjaGFubmVsLT5sb2NrKTsKQEAgLTMwMywxNiArMzI0LDMyIEBACiAJdm1idXNfcG9zdF9tc2coJm1zZywgc2l6ZW9mKHN0cnVjdCB2bWJ1c19jaGFubmVsX3JlbGlkX3JlbGVhc2VkKSk7CiB9CiAKK3ZvaWQgaHZfZXZlbnRfdGFza2xldF9kaXNhYmxlKHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAqdGFza2xldDsKKwl0YXNrbGV0ID0gaHZfY29udGV4dC5ldmVudF9kcGNbY2hhbm5lbC0+dGFyZ2V0X2NwdV07CisJdGFza2xldF9kaXNhYmxlKHRhc2tsZXQpOworfQorCit2b2lkIGh2X2V2ZW50X3Rhc2tsZXRfZW5hYmxlKHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAqdGFza2xldDsKKwl0YXNrbGV0ID0gaHZfY29udGV4dC5ldmVudF9kcGNbY2hhbm5lbC0+dGFyZ2V0X2NwdV07CisJdGFza2xldF9lbmFibGUodGFza2xldCk7CisKKwkvKiBJbiBjYXNlIHRoZXJlIGlzIGFueSBwZW5kaW5nIGV2ZW50ICovCisJdGFza2xldF9zY2hlZHVsZSh0YXNrbGV0KTsKK30KKwogdm9pZCBodl9wcm9jZXNzX2NoYW5uZWxfcmVtb3ZhbChzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHJlbGlkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IHZtYnVzX2NoYW5uZWwgKnByaW1hcnlfY2hhbm5lbDsKIAotCXZtYnVzX3JlbGVhc2VfcmVsaWQocmVsaWQpOwotCiAJQlVHX09OKCFjaGFubmVsLT5yZXNjaW5kKTsKIAlCVUdfT04oIW11dGV4X2lzX2xvY2tlZCgmdm1idXNfY29ubmVjdGlvbi5jaGFubmVsX211dGV4KSk7CiAKKwlodl9ldmVudF90YXNrbGV0X2Rpc2FibGUoY2hhbm5lbCk7CiAJaWYgKGNoYW5uZWwtPnRhcmdldF9jcHUgIT0gZ2V0X2NwdSgpKSB7CiAJCXB1dF9jcHUoKTsKIAkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNoYW5uZWwtPnRhcmdldF9jcHUsCkBAIC0zMjEsNiArMzU4LDcgQEAKIAkJcGVyY3B1X2NoYW5uZWxfZGVxKGNoYW5uZWwpOwogCQlwdXRfY3B1KCk7CiAJfQorCWh2X2V2ZW50X3Rhc2tsZXRfZW5hYmxlKGNoYW5uZWwpOwogCiAJaWYgKGNoYW5uZWwtPnByaW1hcnlfY2hhbm5lbCA9PSBOVUxMKSB7CiAJCWxpc3RfZGVsKCZjaGFubmVsLT5saXN0ZW50cnkpOwpAQCAtMzM4LDggKzM3NiwxMSBAQAogCSAqIFdlIG5lZWQgdG8gZnJlZSB0aGUgYml0IGZvciBpbml0X3ZwX2luZGV4KCkgdG8gd29yayBpbiB0aGUgY2FzZQogCSAqIG9mIHN1Yi1jaGFubmVsLCB3aGVuIHdlIHJlbG9hZCBkcml2ZXJzIGxpa2UgaHZfbmV0dnNjLgogCSAqLwotCWNwdW1hc2tfY2xlYXJfY3B1KGNoYW5uZWwtPnRhcmdldF9jcHUsCi0JCQkgICZwcmltYXJ5X2NoYW5uZWwtPmFsbG9jZWRfY3B1c19pbl9ub2RlKTsKKwlpZiAoY2hhbm5lbC0+YWZmaW5pdHlfcG9saWN5ID09IEhWX0xPQ0FMSVpFRCkKKwkJY3B1bWFza19jbGVhcl9jcHUoY2hhbm5lbC0+dGFyZ2V0X2NwdSwKKwkJCQkgICZwcmltYXJ5X2NoYW5uZWwtPmFsbG9jZWRfY3B1c19pbl9ub2RlKTsKKworCXZtYnVzX3JlbGVhc2VfcmVsaWQocmVsaWQpOwogCiAJZnJlZV9jaGFubmVsKGNoYW5uZWwpOwogfQpAQCAtNDA1LDEwICs0NDYsMTMgQEAKIAkJCWdvdG8gZXJyX2ZyZWVfY2hhbjsKIAl9CiAKLQlkZXZfdHlwZSA9IGh2X2dldF9kZXZfdHlwZSgmbmV3Y2hhbm5lbC0+b2ZmZXJtc2cub2ZmZXIuaWZfdHlwZSk7CisJZGV2X3R5cGUgPSBodl9nZXRfZGV2X3R5cGUobmV3Y2hhbm5lbCk7CisJaWYgKGRldl90eXBlID09IEhWX05JQykKKwkJc2V0X2NoYW5uZWxfc2lnbmFsX3N0YXRlKG5ld2NoYW5uZWwsIEhWX1NJR05BTF9QT0xJQ1lfRVhQTElDSVQpOwogCiAJaW5pdF92cF9pbmRleChuZXdjaGFubmVsLCBkZXZfdHlwZSk7CiAKKwlodl9ldmVudF90YXNrbGV0X2Rpc2FibGUobmV3Y2hhbm5lbCk7CiAJaWYgKG5ld2NoYW5uZWwtPnRhcmdldF9jcHUgIT0gZ2V0X2NwdSgpKSB7CiAJCXB1dF9jcHUoKTsKIAkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKG5ld2NoYW5uZWwtPnRhcmdldF9jcHUsCkBAIC00MTgsNiArNDYyLDcgQEAKIAkJcGVyY3B1X2NoYW5uZWxfZW5xKG5ld2NoYW5uZWwpOwogCQlwdXRfY3B1KCk7CiAJfQorCWh2X2V2ZW50X3Rhc2tsZXRfZW5hYmxlKG5ld2NoYW5uZWwpOwogCiAJLyoKIAkgKiBUaGlzIHN0YXRlIGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBzdWNjZXNzZnVsIG9wZW4KQEAgLTQ2MywxMiArNTA4LDExIEBACiAJcmV0dXJuOwogCiBlcnJfZGVxX2NoYW46Ci0Jdm1idXNfcmVsZWFzZV9yZWxpZChuZXdjaGFubmVsLT5vZmZlcm1zZy5jaGlsZF9yZWxpZCk7Ci0KIAltdXRleF9sb2NrKCZ2bWJ1c19jb25uZWN0aW9uLmNoYW5uZWxfbXV0ZXgpOwogCWxpc3RfZGVsKCZuZXdjaGFubmVsLT5saXN0ZW50cnkpOwogCW11dGV4X3VubG9jaygmdm1idXNfY29ubmVjdGlvbi5jaGFubmVsX211dGV4KTsKIAorCWh2X2V2ZW50X3Rhc2tsZXRfZGlzYWJsZShuZXdjaGFubmVsKTsKIAlpZiAobmV3Y2hhbm5lbC0+dGFyZ2V0X2NwdSAhPSBnZXRfY3B1KCkpIHsKIAkJcHV0X2NwdSgpOwogCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUobmV3Y2hhbm5lbC0+dGFyZ2V0X2NwdSwKQEAgLTQ3Nyw2ICs1MjEsOSBAQAogCQlwZXJjcHVfY2hhbm5lbF9kZXEobmV3Y2hhbm5lbCk7CiAJCXB1dF9jcHUoKTsKIAl9CisJaHZfZXZlbnRfdGFza2xldF9lbmFibGUobmV3Y2hhbm5lbCk7CisKKwl2bWJ1c19yZWxlYXNlX3JlbGlkKG5ld2NoYW5uZWwtPm9mZmVybXNnLmNoaWxkX3JlbGlkKTsKIAogZXJyX2ZyZWVfY2hhbjoKIAlmcmVlX2NoYW5uZWwobmV3Y2hhbm5lbCk7CkBAIC01MjIsMTcgKzU2OSwxNyBAQAogCX0KIAogCS8qCi0JICogV2UgZGlzdHJpYnV0ZSBwcmltYXJ5IGNoYW5uZWxzIGV2ZW5seSBhY3Jvc3MgYWxsIHRoZSBhdmFpbGFibGUKLQkgKiBOVU1BIG5vZGVzIGFuZCB3aXRoaW4gdGhlIGFzc2lnbmVkIE5VTUEgbm9kZSB3ZSB3aWxsIGFzc2lnbiB0aGUKLQkgKiBmaXJzdCBhdmFpbGFibGUgQ1BVIHRvIHRoZSBwcmltYXJ5IGNoYW5uZWwuCi0JICogVGhlIHN1Yi1jaGFubmVscyB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBDUFVzIGF2YWlsYWJsZSBpbiB0aGUKLQkgKiBOVU1BIG5vZGUgZXZlbmx5LgorCSAqIEJhc2VkIG9uIHRoZSBjaGFubmVsIGFmZmluaXR5IHBvbGljeSwgd2Ugd2lsbCBhc3NpZ24gdGhlIE5VTUEKKwkgKiBub2Rlcy4KIAkgKi8KLQlpZiAoIXByaW1hcnkpIHsKKworCWlmICgoY2hhbm5lbC0+YWZmaW5pdHlfcG9saWN5ID09IEhWX0JBTEFOQ0VEKSB8fCAoIXByaW1hcnkpKSB7CiAJCXdoaWxlICh0cnVlKSB7CiAJCQluZXh0X25vZGUgPSBuZXh0X251bWFfbm9kZV9pZCsrOwotCQkJaWYgKG5leHRfbm9kZSA9PSBucl9ub2RlX2lkcykKKwkJCWlmIChuZXh0X25vZGUgPT0gbnJfbm9kZV9pZHMpIHsKIAkJCQluZXh0X25vZGUgPSBuZXh0X251bWFfbm9kZV9pZCA9IDA7CisJCQkJY29udGludWU7CisJCQl9CiAJCQlpZiAoY3B1bWFza19lbXB0eShjcHVtYXNrX29mX25vZGUobmV4dF9ub2RlKSkpCiAJCQkJY29udGludWU7CiAJCQlicmVhazsKQEAgLTU1NiwxNSArNjAzLDE3IEBACiAKIAljdXJfY3B1ID0gLTE7CiAKLQkvKgotCSAqIE5vcm1hbGx5IEh5cGVyLVYgaG9zdCBkb2Vzbid0IGNyZWF0ZSBtb3JlIHN1YmNoYW5uZWxzIHRoYW4gdGhlcmUKLQkgKiBhcmUgVkNQVXMgb24gdGhlIG5vZGUgYnV0IGl0IGlzIHBvc3NpYmxlIHdoZW4gbm90IGFsbCBwcmVzZW50IFZDUFVzCi0JICogb24gdGhlIG5vZGUgYXJlIGluaXRpYWxpemVkIGJ5IGd1ZXN0LiBDbGVhciB0aGUgYWxsb2NlZF9jcHVzX2luX25vZGUKLQkgKiB0byBzdGFydCBvdmVyLgotCSAqLwotCWlmIChjcHVtYXNrX2VxdWFsKCZwcmltYXJ5LT5hbGxvY2VkX2NwdXNfaW5fbm9kZSwKLQkJCSAgY3B1bWFza19vZl9ub2RlKHByaW1hcnktPm51bWFfbm9kZSkpKQotCQljcHVtYXNrX2NsZWFyKCZwcmltYXJ5LT5hbGxvY2VkX2NwdXNfaW5fbm9kZSk7CisJaWYgKHByaW1hcnktPmFmZmluaXR5X3BvbGljeSA9PSBIVl9MT0NBTElaRUQpIHsKKwkJLyoKKwkJICogTm9ybWFsbHkgSHlwZXItViBob3N0IGRvZXNuJ3QgY3JlYXRlIG1vcmUgc3ViY2hhbm5lbHMKKwkJICogdGhhbiB0aGVyZSBhcmUgVkNQVXMgb24gdGhlIG5vZGUgYnV0IGl0IGlzIHBvc3NpYmxlIHdoZW4gbm90CisJCSAqIGFsbCBwcmVzZW50IFZDUFVzIG9uIHRoZSBub2RlIGFyZSBpbml0aWFsaXplZCBieSBndWVzdC4KKwkJICogQ2xlYXIgdGhlIGFsbG9jZWRfY3B1c19pbl9ub2RlIHRvIHN0YXJ0IG92ZXIuCisJCSAqLworCQlpZiAoY3B1bWFza19lcXVhbCgmcHJpbWFyeS0+YWxsb2NlZF9jcHVzX2luX25vZGUsCisJCQkJICBjcHVtYXNrX29mX25vZGUocHJpbWFyeS0+bnVtYV9ub2RlKSkpCisJCQljcHVtYXNrX2NsZWFyKCZwcmltYXJ5LT5hbGxvY2VkX2NwdXNfaW5fbm9kZSk7CisJfQogCiAJd2hpbGUgKHRydWUpIHsKIAkJY3VyX2NwdSA9IGNwdW1hc2tfbmV4dChjdXJfY3B1LCAmYXZhaWxhYmxlX21hc2spOwpAQCAtNTc1LDE3ICs2MjQsMjQgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJLyoKLQkJICogTk9URTogaW4gdGhlIGNhc2Ugb2Ygc3ViLWNoYW5uZWwsIHdlIGNsZWFyIHRoZSBzdWItY2hhbm5lbAotCQkgKiByZWxhdGVkIGJpdChzKSBpbiBwcmltYXJ5LT5hbGxvY2VkX2NwdXNfaW5fbm9kZSBpbgotCQkgKiBodl9wcm9jZXNzX2NoYW5uZWxfcmVtb3ZhbCgpLCBzbyB3aGVuIHdlIHJlbG9hZCBkcml2ZXJzCi0JCSAqIGxpa2UgaHZfbmV0dnNjIGluIFNNUCBndWVzdCwgaGVyZSB3ZSdyZSBhYmxlIHRvIHJlLWFsbG9jYXRlCi0JCSAqIGJpdCBmcm9tIHByaW1hcnktPmFsbG9jZWRfY3B1c19pbl9ub2RlLgotCQkgKi8KLQkJaWYgKCFjcHVtYXNrX3Rlc3RfY3B1KGN1cl9jcHUsCi0JCQkJJnByaW1hcnktPmFsbG9jZWRfY3B1c19pbl9ub2RlKSkgewotCQkJY3B1bWFza19zZXRfY3B1KGN1cl9jcHUsCi0JCQkJCSZwcmltYXJ5LT5hbGxvY2VkX2NwdXNfaW5fbm9kZSk7CisJCWlmIChwcmltYXJ5LT5hZmZpbml0eV9wb2xpY3kgPT0gSFZfTE9DQUxJWkVEKSB7CisJCQkvKgorCQkJICogTk9URTogaW4gdGhlIGNhc2Ugb2Ygc3ViLWNoYW5uZWwsIHdlIGNsZWFyIHRoZQorCQkJICogc3ViLWNoYW5uZWwgcmVsYXRlZCBiaXQocykgaW4KKwkJCSAqIHByaW1hcnktPmFsbG9jZWRfY3B1c19pbl9ub2RlIGluCisJCQkgKiBodl9wcm9jZXNzX2NoYW5uZWxfcmVtb3ZhbCgpLCBzbyB3aGVuIHdlCisJCQkgKiByZWxvYWQgZHJpdmVycyBsaWtlIGh2X25ldHZzYyBpbiBTTVAgZ3Vlc3QsIGhlcmUKKwkJCSAqIHdlJ3JlIGFibGUgdG8gcmUtYWxsb2NhdGUKKwkJCSAqIGJpdCBmcm9tIHByaW1hcnktPmFsbG9jZWRfY3B1c19pbl9ub2RlLgorCQkJICovCisJCQlpZiAoIWNwdW1hc2tfdGVzdF9jcHUoY3VyX2NwdSwKKwkJCQkJICAgICAgJnByaW1hcnktPmFsbG9jZWRfY3B1c19pbl9ub2RlKSkgeworCQkJCWNwdW1hc2tfc2V0X2NwdShjdXJfY3B1LAorCQkJCQkJJnByaW1hcnktPmFsbG9jZWRfY3B1c19pbl9ub2RlKTsKKwkJCQljcHVtYXNrX3NldF9jcHUoY3VyX2NwdSwgYWxsb2NlZF9tYXNrKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKIAkJCWNwdW1hc2tfc2V0X2NwdShjdXJfY3B1LCBhbGxvY2VkX21hc2spOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHYvY29ubmVjdGlvbi5jIGIvZHJpdmVycy9odi9jb25uZWN0aW9uLmMKaW5kZXggZmNmOGEwMi4uNzhlNjM2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9odi9jb25uZWN0aW9uLmMKKysrIGIvZHJpdmVycy9odi9jb25uZWN0aW9uLmMKQEAgLTQzOSw3ICs0MzksNyBAQAogCXVuaW9uIGh2X2Nvbm5lY3Rpb25faWQgY29ubl9pZDsKIAlpbnQgcmV0ID0gMDsKIAlpbnQgcmV0cmllcyA9IDA7Ci0JdTMyIG1zZWMgPSAxOworCXUzMiB1c2VjID0gMTsKIAogCWNvbm5faWQuYXN1MzIgPSAwOwogCWNvbm5faWQudS5pZCA9IFZNQlVTX01FU1NBR0VfQ09OTkVDVElPTl9JRDsKQEAgLTQ3Miw5ICs0NzIsOSBAQAogCQl9CiAKIAkJcmV0cmllcysrOwotCQltc2xlZXAobXNlYyk7Ci0JCWlmIChtc2VjIDwgMjA0OCkKLQkJCW1zZWMgKj0gMjsKKwkJdWRlbGF5KHVzZWMpOworCQlpZiAodXNlYyA8IDIwNDgpCisJCQl1c2VjICo9IDI7CiAJfQogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h2L2h2LmMgYi9kcml2ZXJzL2h2L2h2LmMKaW5kZXggYTFjMDg2Yi4uNjBkYmQ2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9odi9odi5jCisrKyBiL2RyaXZlcnMvaHYvaHYuYwpAQCAtMjc4LDcgKzI3OCw3IEBACiAgKgogICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBub3JtYWxseSBkdXJpbmcgZHJpdmVyIHVubG9hZGluZyBvciBleGl0aW5nLgogICovCi12b2lkIGh2X2NsZWFudXAodm9pZCkKK3ZvaWQgaHZfY2xlYW51cChib29sIGNyYXNoKQogewogCXVuaW9uIGh2X3g2NF9tc3JfaHlwZXJjYWxsX2NvbnRlbnRzIGh5cGVyY2FsbF9tc3I7CiAKQEAgLTI4OCw3ICsyODgsOCBAQAogCWlmIChodl9jb250ZXh0Lmh5cGVyY2FsbF9wYWdlKSB7CiAJCWh5cGVyY2FsbF9tc3IuYXNfdWludDY0ID0gMDsKIAkJd3Jtc3JsKEhWX1g2NF9NU1JfSFlQRVJDQUxMLCBoeXBlcmNhbGxfbXNyLmFzX3VpbnQ2NCk7Ci0JCXZmcmVlKGh2X2NvbnRleHQuaHlwZXJjYWxsX3BhZ2UpOworCQlpZiAoIWNyYXNoKQorCQkJdmZyZWUoaHZfY29udGV4dC5oeXBlcmNhbGxfcGFnZSk7CiAJCWh2X2NvbnRleHQuaHlwZXJjYWxsX3BhZ2UgPSBOVUxMOwogCX0KIApAQCAtMzA4LDcgKzMwOSw4IEBACiAKIAkJaHlwZXJjYWxsX21zci5hc191aW50NjQgPSAwOwogCQl3cm1zcmwoSFZfWDY0X01TUl9SRUZFUkVOQ0VfVFNDLCBoeXBlcmNhbGxfbXNyLmFzX3VpbnQ2NCk7Ci0JCXZmcmVlKGh2X2NvbnRleHQudHNjX3BhZ2UpOworCQlpZiAoIWNyYXNoKQorCQkJdmZyZWUoaHZfY29udGV4dC50c2NfcGFnZSk7CiAJCWh2X2NvbnRleHQudHNjX3BhZ2UgPSBOVUxMOwogCX0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9odi9odl9iYWxsb29uLmMgYi9kcml2ZXJzL2h2L2h2X2JhbGxvb24uYwppbmRleCBkZjM1ZmI3Li5mZGY4ZGE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h2L2h2X2JhbGxvb24uYworKysgYi9kcml2ZXJzL2h2L2h2X2JhbGxvb24uYwpAQCAtNDMwLDE2ICs0MzAsMjcgQEAKICAqIGN1cnJlbnRseSBob3QgYWRkZWQuIFdlIGhvdCBhZGQgaW4gbXVsdGlwbGVzIG9mIDEyOE0KICAqIGNodW5rczsgaXQgaXMgcG9zc2libGUgdGhhdCB3ZSBtYXkgbm90IGJlIGFibGUgdG8gYnJpbmcKICAqIG9ubGluZSBhbGwgdGhlIHBhZ2VzIGluIHRoZSByZWdpb24uIFRoZSByYW5nZQotICogY292ZXJlZF9lbmRfcGZuIGRlZmluZXMgdGhlIHBhZ2VzIHRoYXQgY2FuCisgKiBjb3ZlcmVkX3N0YXJ0X3Bmbjpjb3ZlcmVkX2VuZF9wZm4gZGVmaW5lcyB0aGUgcGFnZXMgdGhhdCBjYW4KICAqIGJlIGJyb3VnaCBvbmxpbmUuCiAgKi8KIAogc3RydWN0IGh2X2hvdGFkZF9zdGF0ZSB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuOworCXVuc2lnbmVkIGxvbmcgY292ZXJlZF9zdGFydF9wZm47CiAJdW5zaWduZWQgbG9uZyBjb3ZlcmVkX2VuZF9wZm47CiAJdW5zaWduZWQgbG9uZyBoYV9lbmRfcGZuOwogCXVuc2lnbmVkIGxvbmcgZW5kX3BmbjsKKwkvKgorCSAqIEEgbGlzdCBvZiBnYXBzLgorCSAqLworCXN0cnVjdCBsaXN0X2hlYWQgZ2FwX2xpc3Q7Cit9OworCitzdHJ1Y3QgaHZfaG90YWRkX2dhcCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuOworCXVuc2lnbmVkIGxvbmcgZW5kX3BmbjsKIH07CiAKIHN0cnVjdCBiYWxsb29uX3N0YXRlIHsKQEAgLTUzNiw3ICs1NDcsMTEgQEAKIAkgKi8KIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRocmVhZDsKIAotCXN0cnVjdCBtdXRleCBoYV9yZWdpb25fbXV0ZXg7CisJLyoKKwkgKiBQcm90ZWN0cyBoYV9yZWdpb25fbGlzdCwgbnVtX3BhZ2VzX29ubGluZWQgY291bnRlciBhbmQgaW5kaXZpZHVhbAorCSAqIHJlZ2lvbnMgZnJvbSBoYV9yZWdpb25fbGlzdC4KKwkgKi8KKwlzcGlubG9ja190IGhhX2xvY2s7CiAKIAkvKgogCSAqIEEgbGlzdCBvZiBob3QtYWRkIHJlZ2lvbnMuCkBAIC01NjAsMTggKzU3NSwxNCBAQAogCQkJICAgICAgdm9pZCAqdikKIHsKIAlzdHJ1Y3QgbWVtb3J5X25vdGlmeSAqbWVtID0gKHN0cnVjdCBtZW1vcnlfbm90aWZ5ICopdjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3dpdGNoICh2YWwpIHsKLQljYXNlIE1FTV9HT0lOR19PTkxJTkU6Ci0JCW11dGV4X2xvY2soJmRtX2RldmljZS5oYV9yZWdpb25fbXV0ZXgpOwotCQlicmVhazsKLQogCWNhc2UgTUVNX09OTElORToKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRtX2RldmljZS5oYV9sb2NrLCBmbGFncyk7CiAJCWRtX2RldmljZS5udW1fcGFnZXNfb25saW5lZCArPSBtZW0tPm5yX3BhZ2VzOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbV9kZXZpY2UuaGFfbG9jaywgZmxhZ3MpOwogCWNhc2UgTUVNX0NBTkNFTF9PTkxJTkU6Ci0JCWlmICh2YWwgPT0gTUVNX09OTElORSB8fAotCQkgICAgbXV0ZXhfaXNfbG9ja2VkKCZkbV9kZXZpY2UuaGFfcmVnaW9uX211dGV4KSkKLQkJCW11dGV4X3VubG9jaygmZG1fZGV2aWNlLmhhX3JlZ2lvbl9tdXRleCk7CiAJCWlmIChkbV9kZXZpY2UuaGFfd2FpdGluZykgewogCQkJZG1fZGV2aWNlLmhhX3dhaXRpbmcgPSBmYWxzZTsKIAkJCWNvbXBsZXRlKCZkbV9kZXZpY2Uub2xfd2FpdGV2ZW50KTsKQEAgLTU3OSwxMCArNTkwLDExIEBACiAJCWJyZWFrOwogCiAJY2FzZSBNRU1fT0ZGTElORToKLQkJbXV0ZXhfbG9jaygmZG1fZGV2aWNlLmhhX3JlZ2lvbl9tdXRleCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkbV9kZXZpY2UuaGFfbG9jaywgZmxhZ3MpOwogCQlkbV9kZXZpY2UubnVtX3BhZ2VzX29ubGluZWQgLT0gbWVtLT5ucl9wYWdlczsKLQkJbXV0ZXhfdW5sb2NrKCZkbV9kZXZpY2UuaGFfcmVnaW9uX211dGV4KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1fZGV2aWNlLmhhX2xvY2ssIGZsYWdzKTsKIAkJYnJlYWs7CisJY2FzZSBNRU1fR09JTkdfT05MSU5FOgogCWNhc2UgTUVNX0dPSU5HX09GRkxJTkU6CiAJY2FzZSBNRU1fQ0FOQ0VMX09GRkxJTkU6CiAJCWJyZWFrOwpAQCAtNTk1LDE4ICs2MDcsNDYgQEAKIAkucHJpb3JpdHkgPSAwCiB9OwogCisvKiBDaGVjayBpZiB0aGUgcGFydGljdWxhciBwYWdlIGlzIGJhY2tlZCBhbmQgY2FuIGJlIG9ubGluZWQgYW5kIG9ubGluZSBpdC4gKi8KK3N0YXRpYyB2b2lkIGh2X3BhZ2Vfb25saW5lX29uZShzdHJ1Y3QgaHZfaG90YWRkX3N0YXRlICpoYXMsIHN0cnVjdCBwYWdlICpwZykKK3sKKwl1bnNpZ25lZCBsb25nIGN1cl9zdGFydF9wZ3A7CisJdW5zaWduZWQgbG9uZyBjdXJfZW5kX3BncDsKKwlzdHJ1Y3QgaHZfaG90YWRkX2dhcCAqZ2FwOwogCi1zdGF0aWMgdm9pZCBodl9icmluZ19wZ3Nfb25saW5lKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIHNpemUpCisJY3VyX3N0YXJ0X3BncCA9ICh1bnNpZ25lZCBsb25nKXBmbl90b19wYWdlKGhhcy0+Y292ZXJlZF9zdGFydF9wZm4pOworCWN1cl9lbmRfcGdwID0gKHVuc2lnbmVkIGxvbmcpcGZuX3RvX3BhZ2UoaGFzLT5jb3ZlcmVkX2VuZF9wZm4pOworCisJLyogVGhlIHBhZ2UgaXMgbm90IGJhY2tlZC4gKi8KKwlpZiAoKCh1bnNpZ25lZCBsb25nKXBnIDwgY3VyX3N0YXJ0X3BncCkgfHwKKwkgICAgKCh1bnNpZ25lZCBsb25nKXBnID49IGN1cl9lbmRfcGdwKSkKKwkJcmV0dXJuOworCisJLyogQ2hlY2sgZm9yIGdhcHMuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShnYXAsICZoYXMtPmdhcF9saXN0LCBsaXN0KSB7CisJCWN1cl9zdGFydF9wZ3AgPSAodW5zaWduZWQgbG9uZykKKwkJCXBmbl90b19wYWdlKGdhcC0+c3RhcnRfcGZuKTsKKwkJY3VyX2VuZF9wZ3AgPSAodW5zaWduZWQgbG9uZykKKwkJCXBmbl90b19wYWdlKGdhcC0+ZW5kX3Bmbik7CisJCWlmICgoKHVuc2lnbmVkIGxvbmcpcGcgPj0gY3VyX3N0YXJ0X3BncCkgJiYKKwkJICAgICgodW5zaWduZWQgbG9uZylwZyA8IGN1cl9lbmRfcGdwKSkgeworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyogVGhpcyBmcmFtZSBpcyBjdXJyZW50bHkgYmFja2VkOyBvbmxpbmUgdGhlIHBhZ2UuICovCisJX19vbmxpbmVfcGFnZV9zZXRfbGltaXRzKHBnKTsKKwlfX29ubGluZV9wYWdlX2luY3JlbWVudF9jb3VudGVycyhwZyk7CisJX19vbmxpbmVfcGFnZV9mcmVlKHBnKTsKK30KKworc3RhdGljIHZvaWQgaHZfYnJpbmdfcGdzX29ubGluZShzdHJ1Y3QgaHZfaG90YWRkX3N0YXRlICpoYXMsCisJCQkJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJc3RydWN0IHBhZ2UgKnBnOwotCQlwZyA9IHBmbl90b19wYWdlKHN0YXJ0X3BmbiArIGkpOwotCQlfX29ubGluZV9wYWdlX3NldF9saW1pdHMocGcpOwotCQlfX29ubGluZV9wYWdlX2luY3JlbWVudF9jb3VudGVycyhwZyk7Ci0JCV9fb25saW5lX3BhZ2VfZnJlZShwZyk7Ci0JfQorCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCWh2X3BhZ2Vfb25saW5lX29uZShoYXMsIHBmbl90b19wYWdlKHN0YXJ0X3BmbiArIGkpKTsKIH0KIAogc3RhdGljIHZvaWQgaHZfbWVtX2hvdF9hZGQodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplLApAQCAtNjE4LDkgKzY1OCwxMiBAQAogCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuOwogCXVuc2lnbmVkIGxvbmcgcHJvY2Vzc2VkX3BmbjsKIAl1bnNpZ25lZCBsb25nIHRvdGFsX3BmbiA9IHBmbl9jb3VudDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJZm9yIChpID0gMDsgaSA8IChzaXplL0hBX0NIVU5LKTsgaSsrKSB7CiAJCXN0YXJ0X3BmbiA9IHN0YXJ0ICsgKGkgKiBIQV9DSFVOSyk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRtX2RldmljZS5oYV9sb2NrLCBmbGFncyk7CiAJCWhhcy0+aGFfZW5kX3BmbiArPSAgSEFfQ0hVTks7CiAKIAkJaWYgKHRvdGFsX3BmbiA+IEhBX0NIVU5LKSB7CkBAIC02MzIsMTEgKzY3NSwxMSBAQAogCQl9CiAKIAkJaGFzLT5jb3ZlcmVkX2VuZF9wZm4gKz0gIHByb2Nlc3NlZF9wZm47CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtX2RldmljZS5oYV9sb2NrLCBmbGFncyk7CiAKIAkJaW5pdF9jb21wbGV0aW9uKCZkbV9kZXZpY2Uub2xfd2FpdGV2ZW50KTsKLQkJZG1fZGV2aWNlLmhhX3dhaXRpbmcgPSB0cnVlOworCQlkbV9kZXZpY2UuaGFfd2FpdGluZyA9ICFtZW1ocF9hdXRvX29ubGluZTsKIAotCQltdXRleF91bmxvY2soJmRtX2RldmljZS5oYV9yZWdpb25fbXV0ZXgpOwogCQluaWQgPSBtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZChQRk5fUEhZUyhzdGFydF9wZm4pKTsKIAkJcmV0ID0gYWRkX21lbW9yeShuaWQsIFBGTl9QSFlTKChzdGFydF9wZm4pKSwKIAkJCQkoSEFfQ0hVTksgPDwgUEFHRV9TSElGVCkpOwpAQCAtNjUzLDIwICs2OTYsMjMgQEAKIAkJCQkgKi8KIAkJCQlkb19ob3RfYWRkID0gZmFsc2U7CiAJCQl9CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZG1fZGV2aWNlLmhhX2xvY2ssIGZsYWdzKTsKIAkJCWhhcy0+aGFfZW5kX3BmbiAtPSBIQV9DSFVOSzsKIAkJCWhhcy0+Y292ZXJlZF9lbmRfcGZuIC09ICBwcm9jZXNzZWRfcGZuOwotCQkJbXV0ZXhfbG9jaygmZG1fZGV2aWNlLmhhX3JlZ2lvbl9tdXRleCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbV9kZXZpY2UuaGFfbG9jaywgZmxhZ3MpOwogCQkJYnJlYWs7CiAJCX0KIAogCQkvKgotCQkgKiBXYWl0IGZvciB0aGUgbWVtb3J5IGJsb2NrIHRvIGJlIG9ubGluZWQuCi0JCSAqIFNpbmNlIHRoZSBob3QgYWRkIGhhcyBzdWNjZWVkZWQsIGl0IGlzIG9rIHRvCi0JCSAqIHByb2NlZWQgZXZlbiBpZiB0aGUgcGFnZXMgaW4gdGhlIGhvdCBhZGRlZCByZWdpb24KLQkJICogaGF2ZSBub3QgYmVlbiAib25saW5lZCIgd2l0aGluIHRoZSBhbGxvd2VkIHRpbWUuCisJCSAqIFdhaXQgZm9yIHRoZSBtZW1vcnkgYmxvY2sgdG8gYmUgb25saW5lZCB3aGVuIG1lbW9yeSBvbmxpbmluZworCQkgKiBpcyBkb25lIG91dHNpZGUgb2Yga2VybmVsIChtZW1ocF9hdXRvX29ubGluZSkuIFNpbmNlIHRoZSBob3QKKwkJICogYWRkIGhhcyBzdWNjZWVkZWQsIGl0IGlzIG9rIHRvIHByb2NlZWQgZXZlbiBpZiB0aGUgcGFnZXMgaW4KKwkJICogdGhlIGhvdCBhZGRlZCByZWdpb24gaGF2ZSBub3QgYmVlbiAib25saW5lZCIgd2l0aGluIHRoZQorCQkgKiBhbGxvd2VkIHRpbWUuCiAJCSAqLwotCQl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmRtX2RldmljZS5vbF93YWl0ZXZlbnQsIDUqSFopOwotCQltdXRleF9sb2NrKCZkbV9kZXZpY2UuaGFfcmVnaW9uX211dGV4KTsKKwkJaWYgKGRtX2RldmljZS5oYV93YWl0aW5nKQorCQkJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZkbV9kZXZpY2Uub2xfd2FpdGV2ZW50LAorCQkJCQkJICAgIDUqSFopOwogCQlwb3N0X3N0YXR1cygmZG1fZGV2aWNlKTsKIAl9CiAKQEAgLTY3NSw0NyArNzIxLDY0IEBACiAKIHN0YXRpYyB2b2lkIGh2X29ubGluZV9wYWdlKHN0cnVjdCBwYWdlICpwZykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpjdXI7CiAJc3RydWN0IGh2X2hvdGFkZF9zdGF0ZSAqaGFzOwogCXVuc2lnbmVkIGxvbmcgY3VyX3N0YXJ0X3BncDsKIAl1bnNpZ25lZCBsb25nIGN1cl9lbmRfcGdwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlsaXN0X2Zvcl9lYWNoKGN1ciwgJmRtX2RldmljZS5oYV9yZWdpb25fbGlzdCkgewotCQloYXMgPSBsaXN0X2VudHJ5KGN1ciwgc3RydWN0IGh2X2hvdGFkZF9zdGF0ZSwgbGlzdCk7Ci0JCWN1cl9zdGFydF9wZ3AgPSAodW5zaWduZWQgbG9uZylwZm5fdG9fcGFnZShoYXMtPnN0YXJ0X3Bmbik7Ci0JCWN1cl9lbmRfcGdwID0gKHVuc2lnbmVkIGxvbmcpcGZuX3RvX3BhZ2UoaGFzLT5jb3ZlcmVkX2VuZF9wZm4pOworCXNwaW5fbG9ja19pcnFzYXZlKCZkbV9kZXZpY2UuaGFfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoaGFzLCAmZG1fZGV2aWNlLmhhX3JlZ2lvbl9saXN0LCBsaXN0KSB7CisJCWN1cl9zdGFydF9wZ3AgPSAodW5zaWduZWQgbG9uZykKKwkJCXBmbl90b19wYWdlKGhhcy0+c3RhcnRfcGZuKTsKKwkJY3VyX2VuZF9wZ3AgPSAodW5zaWduZWQgbG9uZylwZm5fdG9fcGFnZShoYXMtPmVuZF9wZm4pOwogCi0JCWlmICgoKHVuc2lnbmVkIGxvbmcpcGcgPj0gY3VyX3N0YXJ0X3BncCkgJiYKLQkJCSgodW5zaWduZWQgbG9uZylwZyA8IGN1cl9lbmRfcGdwKSkgewotCQkJLyoKLQkJCSAqIFRoaXMgZnJhbWUgaXMgY3VycmVudGx5IGJhY2tlZDsgb25saW5lIHRoZQotCQkJICogcGFnZS4KLQkJCSAqLwotCQkJX19vbmxpbmVfcGFnZV9zZXRfbGltaXRzKHBnKTsKLQkJCV9fb25saW5lX3BhZ2VfaW5jcmVtZW50X2NvdW50ZXJzKHBnKTsKLQkJCV9fb25saW5lX3BhZ2VfZnJlZShwZyk7Ci0JCX0KKwkJLyogVGhlIHBhZ2UgYmVsb25ncyB0byBhIGRpZmZlcmVudCBIQVMuICovCisJCWlmICgoKHVuc2lnbmVkIGxvbmcpcGcgPCBjdXJfc3RhcnRfcGdwKSB8fAorCQkgICAgKCh1bnNpZ25lZCBsb25nKXBnID49IGN1cl9lbmRfcGdwKSkKKwkJCWNvbnRpbnVlOworCisJCWh2X3BhZ2Vfb25saW5lX29uZShoYXMsIHBnKTsKKwkJYnJlYWs7CiAJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtX2RldmljZS5oYV9sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBib29sIHBmbl9jb3ZlcmVkKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIHBmbl9jbnQpCitzdGF0aWMgaW50IHBmbl9jb3ZlcmVkKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIHBmbl9jbnQpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqY3VyOwogCXN0cnVjdCBodl9ob3RhZGRfc3RhdGUgKmhhczsKKwlzdHJ1Y3QgaHZfaG90YWRkX2dhcCAqZ2FwOwogCXVuc2lnbmVkIGxvbmcgcmVzaWR1YWwsIG5ld19pbmM7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmIChsaXN0X2VtcHR5KCZkbV9kZXZpY2UuaGFfcmVnaW9uX2xpc3QpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlsaXN0X2Zvcl9lYWNoKGN1ciwgJmRtX2RldmljZS5oYV9yZWdpb25fbGlzdCkgewotCQloYXMgPSBsaXN0X2VudHJ5KGN1ciwgc3RydWN0IGh2X2hvdGFkZF9zdGF0ZSwgbGlzdCk7Ci0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG1fZGV2aWNlLmhhX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhhcywgJmRtX2RldmljZS5oYV9yZWdpb25fbGlzdCwgbGlzdCkgewogCQkvKgogCQkgKiBJZiB0aGUgcGZuIHJhbmdlIHdlIGFyZSBkZWFsaW5nIHdpdGggaXMgbm90IGluIHRoZSBjdXJyZW50CiAJCSAqICJob3QgYWRkIGJsb2NrIiwgbW92ZSBvbi4KIAkJICovCiAJCWlmIChzdGFydF9wZm4gPCBoYXMtPnN0YXJ0X3BmbiB8fCBzdGFydF9wZm4gPj0gaGFzLT5lbmRfcGZuKQogCQkJY29udGludWU7CisKKwkJLyoKKwkJICogSWYgdGhlIGN1cnJlbnQgc3RhcnQgcGZuIGlzIG5vdCB3aGVyZSB0aGUgY292ZXJlZF9lbmQKKwkJICogaXMsIGNyZWF0ZSBhIGdhcCBhbmQgdXBkYXRlIGNvdmVyZWRfZW5kX3Bmbi4KKwkJICovCisJCWlmIChoYXMtPmNvdmVyZWRfZW5kX3BmbiAhPSBzdGFydF9wZm4pIHsKKwkJCWdhcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBodl9ob3RhZGRfZ2FwKSwgR0ZQX0FUT01JQyk7CisJCQlpZiAoIWdhcCkgeworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCUlOSVRfTElTVF9IRUFEKCZnYXAtPmxpc3QpOworCQkJZ2FwLT5zdGFydF9wZm4gPSBoYXMtPmNvdmVyZWRfZW5kX3BmbjsKKwkJCWdhcC0+ZW5kX3BmbiA9IHN0YXJ0X3BmbjsKKwkJCWxpc3RfYWRkX3RhaWwoJmdhcC0+bGlzdCwgJmhhcy0+Z2FwX2xpc3QpOworCisJCQloYXMtPmNvdmVyZWRfZW5kX3BmbiA9IHN0YXJ0X3BmbjsKKwkJfQorCiAJCS8qCiAJCSAqIElmIHRoZSBjdXJyZW50IGhvdCBhZGQtcmVxdWVzdCBleHRlbmRzIGJleW9uZAogCQkgKiBvdXIgY3VycmVudCBsaW1pdDsgZXh0ZW5kIGl0LgpAQCAtNzMyLDE5ICs3OTUsMTIgQEAKIAkJCWhhcy0+ZW5kX3BmbiArPSBuZXdfaW5jOwogCQl9CiAKLQkJLyoKLQkJICogSWYgdGhlIGN1cnJlbnQgc3RhcnQgcGZuIGlzIG5vdCB3aGVyZSB0aGUgY292ZXJlZF9lbmQKLQkJICogaXMsIHVwZGF0ZSBpdC4KLQkJICovCi0KLQkJaWYgKGhhcy0+Y292ZXJlZF9lbmRfcGZuICE9IHN0YXJ0X3BmbikKLQkJCWhhcy0+Y292ZXJlZF9lbmRfcGZuID0gc3RhcnRfcGZuOwotCi0JCXJldHVybiB0cnVlOwotCisJCXJldCA9IDE7CisJCWJyZWFrOwogCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbV9kZXZpY2UuaGFfbG9jaywgZmxhZ3MpOwogCi0JcmV0dXJuIGZhbHNlOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGhhbmRsZV9wZ19yYW5nZSh1bnNpZ25lZCBsb25nIHBnX3N0YXJ0LApAQCAtNzUzLDE3ICs4MDksMTMgQEAKIAl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiA9IHBnX3N0YXJ0OwogCXVuc2lnbmVkIGxvbmcgcGZuX2NudCA9IHBnX2NvdW50OwogCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpjdXI7CiAJc3RydWN0IGh2X2hvdGFkZF9zdGF0ZSAqaGFzOwogCXVuc2lnbmVkIGxvbmcgcGdzX29sID0gMDsKIAl1bnNpZ25lZCBsb25nIG9sZF9jb3ZlcmVkX3N0YXRlOworCXVuc2lnbmVkIGxvbmcgcmVzID0gMCwgZmxhZ3M7CiAKLQlpZiAobGlzdF9lbXB0eSgmZG1fZGV2aWNlLmhhX3JlZ2lvbl9saXN0KSkKLQkJcmV0dXJuIDA7Ci0KLQlsaXN0X2Zvcl9lYWNoKGN1ciwgJmRtX2RldmljZS5oYV9yZWdpb25fbGlzdCkgewotCQloYXMgPSBsaXN0X2VudHJ5KGN1ciwgc3RydWN0IGh2X2hvdGFkZF9zdGF0ZSwgbGlzdCk7Ci0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG1fZGV2aWNlLmhhX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhhcywgJmRtX2RldmljZS5oYV9yZWdpb25fbGlzdCwgbGlzdCkgewogCQkvKgogCQkgKiBJZiB0aGUgcGZuIHJhbmdlIHdlIGFyZSBkZWFsaW5nIHdpdGggaXMgbm90IGluIHRoZSBjdXJyZW50CiAJCSAqICJob3QgYWRkIGJsb2NrIiwgbW92ZSBvbi4KQEAgLTc4Myw2ICs4MzUsOCBAQAogCQkJaWYgKHBnc19vbCA+IHBmbl9jbnQpCiAJCQkJcGdzX29sID0gcGZuX2NudDsKIAorCQkJaGFzLT5jb3ZlcmVkX2VuZF9wZm4gKz0gIHBnc19vbDsKKwkJCXBmbl9jbnQgLT0gcGdzX29sOwogCQkJLyoKIAkJCSAqIENoZWNrIGlmIHRoZSBjb3JyZXNwb25kaW5nIG1lbW9yeSBibG9jayBpcyBhbHJlYWR5CiAJCQkgKiBvbmxpbmUgYnkgY2hlY2tpbmcgaXRzIGxhc3QgcHJldmlvdXNseSBiYWNrZWQgcGFnZS4KQEAgLTc5MSwxMCArODQ1LDggQEAKIAkJCSAqLwogCQkJaWYgKHN0YXJ0X3BmbiA+IGhhcy0+c3RhcnRfcGZuICYmCiAJCQkgICAgIVBhZ2VSZXNlcnZlZChwZm5fdG9fcGFnZShzdGFydF9wZm4gLSAxKSkpCi0JCQkJaHZfYnJpbmdfcGdzX29ubGluZShzdGFydF9wZm4sIHBnc19vbCk7CisJCQkJaHZfYnJpbmdfcGdzX29ubGluZShoYXMsIHN0YXJ0X3BmbiwgcGdzX29sKTsKIAotCQkJaGFzLT5jb3ZlcmVkX2VuZF9wZm4gKz0gIHBnc19vbDsKLQkJCXBmbl9jbnQgLT0gcGdzX29sOwogCQl9CiAKIAkJaWYgKChoYXMtPmhhX2VuZF9wZm4gPCBoYXMtPmVuZF9wZm4pICYmIChwZm5fY250ID4gMCkpIHsKQEAgLTgxMywxNyArODY1LDIwIEBACiAJCQl9IGVsc2UgewogCQkJCXBmbl9jbnQgPSBzaXplOwogCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1fZGV2aWNlLmhhX2xvY2ssIGZsYWdzKTsKIAkJCWh2X21lbV9ob3RfYWRkKGhhcy0+aGFfZW5kX3Bmbiwgc2l6ZSwgcGZuX2NudCwgaGFzKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZkbV9kZXZpY2UuaGFfbG9jaywgZmxhZ3MpOwogCQl9CiAJCS8qCiAJCSAqIElmIHdlIG1hbmFnZWQgdG8gb25saW5lIGFueSBwYWdlcyB0aGF0IHdlcmUgZ2l2ZW4gdG8gdXMsCiAJCSAqIHdlIGRlY2xhcmUgc3VjY2Vzcy4KIAkJICovCi0JCXJldHVybiBoYXMtPmNvdmVyZWRfZW5kX3BmbiAtIG9sZF9jb3ZlcmVkX3N0YXRlOwotCisJCXJlcyA9IGhhcy0+Y292ZXJlZF9lbmRfcGZuIC0gb2xkX2NvdmVyZWRfc3RhdGU7CisJCWJyZWFrOwogCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbV9kZXZpY2UuaGFfbG9jaywgZmxhZ3MpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJvY2Vzc19ob3RfYWRkKHVuc2lnbmVkIGxvbmcgcGdfc3RhcnQsCkBAIC04MzIsMTMgKzg4NywyMCBAQAogCQkJCQl1bnNpZ25lZCBsb25nIHJnX3NpemUpCiB7CiAJc3RydWN0IGh2X2hvdGFkZF9zdGF0ZSAqaGFfcmVnaW9uID0gTlVMTDsKKwlpbnQgY292ZXJlZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKHBmbl9jbnQgPT0gMCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoIWRtX2RldmljZS5ob3N0X3NwZWNpZmllZF9oYV9yZWdpb24pCi0JCWlmIChwZm5fY292ZXJlZChwZ19zdGFydCwgcGZuX2NudCkpCisJaWYgKCFkbV9kZXZpY2UuaG9zdF9zcGVjaWZpZWRfaGFfcmVnaW9uKSB7CisJCWNvdmVyZWQgPSBwZm5fY292ZXJlZChwZ19zdGFydCwgcGZuX2NudCk7CisJCWlmIChjb3ZlcmVkIDwgMCkKKwkJCXJldHVybiAwOworCisJCWlmIChjb3ZlcmVkKQogCQkJZ290byBkb19wZ19yYW5nZTsKKwl9CiAKIAkvKgogCSAqIElmIHRoZSBob3N0IGhhcyBzcGVjaWZpZWQgYSBob3QtYWRkIHJhbmdlOyBkZWFsIHdpdGggaXQgZmlyc3QuCkBAIC04NTAsMTIgKzkxMiwxNyBAQAogCQkJcmV0dXJuIDA7CiAKIAkJSU5JVF9MSVNUX0hFQUQoJmhhX3JlZ2lvbi0+bGlzdCk7CisJCUlOSVRfTElTVF9IRUFEKCZoYV9yZWdpb24tPmdhcF9saXN0KTsKIAotCQlsaXN0X2FkZF90YWlsKCZoYV9yZWdpb24tPmxpc3QsICZkbV9kZXZpY2UuaGFfcmVnaW9uX2xpc3QpOwogCQloYV9yZWdpb24tPnN0YXJ0X3BmbiA9IHJnX3N0YXJ0OwogCQloYV9yZWdpb24tPmhhX2VuZF9wZm4gPSByZ19zdGFydDsKKwkJaGFfcmVnaW9uLT5jb3ZlcmVkX3N0YXJ0X3BmbiA9IHBnX3N0YXJ0OwogCQloYV9yZWdpb24tPmNvdmVyZWRfZW5kX3BmbiA9IHBnX3N0YXJ0OwogCQloYV9yZWdpb24tPmVuZF9wZm4gPSByZ19zdGFydCArIHJnX3NpemU7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRtX2RldmljZS5oYV9sb2NrLCBmbGFncyk7CisJCWxpc3RfYWRkX3RhaWwoJmhhX3JlZ2lvbi0+bGlzdCwgJmRtX2RldmljZS5oYV9yZWdpb25fbGlzdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtX2RldmljZS5oYV9sb2NrLCBmbGFncyk7CiAJfQogCiBkb19wZ19yYW5nZToKQEAgLTg4Miw3ICs5NDksNiBAQAogCXJlc3AuaGRyLnNpemUgPSBzaXplb2Yoc3RydWN0IGRtX2hvdF9hZGRfcmVzcG9uc2UpOwogCiAjaWZkZWYgQ09ORklHX01FTU9SWV9IT1RQTFVHCi0JbXV0ZXhfbG9jaygmZG1fZGV2aWNlLmhhX3JlZ2lvbl9tdXRleCk7CiAJcGdfc3RhcnQgPSBkbS0+aGFfd3JrLmhhX3BhZ2VfcmFuZ2UuZmluZm8uc3RhcnRfcGFnZTsKIAlwZm5fY250ID0gZG0tPmhhX3dyay5oYV9wYWdlX3JhbmdlLmZpbmZvLnBhZ2VfY250OwogCkBAIC05MTYsNyArOTgyLDYgQEAKIAkJCQkJCXJnX3N0YXJ0LCByZ19zeik7CiAKIAlkbS0+bnVtX3BhZ2VzX2FkZGVkICs9IHJlc3AucGFnZV9jb3VudDsKLQltdXRleF91bmxvY2soJmRtX2RldmljZS5oYV9yZWdpb25fbXV0ZXgpOwogI2VuZGlmCiAJLyoKIAkgKiBUaGUgcmVzdWx0IGZpZWxkIG9mIHRoZSByZXNwb25zZSBzdHJ1Y3R1cmUgaGFzIHRoZQpAQCAtMTAxMCw3ICsxMDc1LDYgQEAKIHN0YXRpYyB2b2lkIHBvc3Rfc3RhdHVzKHN0cnVjdCBodl9keW5tZW1fZGV2aWNlICpkbSkKIHsKIAlzdHJ1Y3QgZG1fc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3Qgc3lzaW5mbyB2YWw7CiAJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOwogCXVuc2lnbmVkIGxvbmcgbGFzdF9wb3N0ID0gbGFzdF9wb3N0X3RpbWU7CiAKQEAgLTEwMjIsNyArMTA4Niw2IEBACiAJaWYgKCF0aW1lX2FmdGVyKG5vdywgKGxhc3RfcG9zdF90aW1lICsgSFopKSkKIAkJcmV0dXJuOwogCi0Jc2lfbWVtaW5mbygmdmFsKTsKIAltZW1zZXQoJnN0YXR1cywgMCwgc2l6ZW9mKHN0cnVjdCBkbV9zdGF0dXMpKTsKIAlzdGF0dXMuaGRyLnR5cGUgPSBETV9TVEFUVVNfUkVQT1JUOwogCXN0YXR1cy5oZHIuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZG1fc3RhdHVzKTsKQEAgLTEwMzgsNyArMTEwMSw3IEBACiAJICogbnVtX3BhZ2VzX29ubGluZWQpIGFzIGNvbW1pdHRlZCB0byB0aGUgaG9zdCwgb3RoZXJ3aXNlIGl0IGNhbiB0cnkKIAkgKiBhc2tpbmcgdXMgdG8gYmFsbG9vbiB0aGVtIG91dC4KIAkgKi8KLQlzdGF0dXMubnVtX2F2YWlsID0gdmFsLmZyZWVyYW07CisJc3RhdHVzLm51bV9hdmFpbCA9IHNpX21lbV9hdmFpbGFibGUoKTsKIAlzdGF0dXMubnVtX2NvbW1pdHRlZCA9IHZtX21lbW9yeV9jb21taXR0ZWQoKSArCiAJCWRtLT5udW1fcGFnZXNfYmFsbG9vbmVkICsKIAkJKGRtLT5udW1fcGFnZXNfYWRkZWQgPiBkbS0+bnVtX3BhZ2VzX29ubGluZWQgPwpAQCAtMTE0NCw3ICsxMjA3LDcgQEAKIAlpbnQgcmV0OwogCWJvb2wgZG9uZSA9IGZhbHNlOwogCWludCBpOwotCXN0cnVjdCBzeXNpbmZvIHZhbDsKKwlsb25nIGF2YWlsX3BhZ2VzOwogCXVuc2lnbmVkIGxvbmcgZmxvb3I7CiAKIAkvKiBUaGUgaG9zdCBiYWxsb29ucyBwYWdlcyBpbiAyTSBncmFudWxhcml0eS4gKi8KQEAgLTExNTYsMTIgKzEyMTksMTIgQEAKIAkgKi8KIAlhbGxvY191bml0ID0gNTEyOwogCi0Jc2lfbWVtaW5mbygmdmFsKTsKKwlhdmFpbF9wYWdlcyA9IHNpX21lbV9hdmFpbGFibGUoKTsKIAlmbG9vciA9IGNvbXB1dGVfYmFsbG9vbl9mbG9vcigpOwogCiAJLyogUmVmdXNlIHRvIGJhbGxvb24gYmVsb3cgdGhlIGZsb29yLCBrZWVwIHRoZSAyTSBncmFudWxhcml0eS4gKi8KLQlpZiAodmFsLmZyZWVyYW0gPCBudW1fcGFnZXMgfHwgdmFsLmZyZWVyYW0gLSBudW1fcGFnZXMgPCBmbG9vcikgewotCQludW1fcGFnZXMgPSB2YWwuZnJlZXJhbSA+IGZsb29yID8gKHZhbC5mcmVlcmFtIC0gZmxvb3IpIDogMDsKKwlpZiAoYXZhaWxfcGFnZXMgPCBudW1fcGFnZXMgfHwgYXZhaWxfcGFnZXMgLSBudW1fcGFnZXMgPCBmbG9vcikgeworCQludW1fcGFnZXMgPSBhdmFpbF9wYWdlcyA+IGZsb29yID8gKGF2YWlsX3BhZ2VzIC0gZmxvb3IpIDogMDsKIAkJbnVtX3BhZ2VzIC09IG51bV9wYWdlcyAlIFBBR0VTX0lOXzJNOwogCX0KIApAQCAtMTE3Miw3ICsxMjM1LDYgQEAKIAkJYmxfcmVzcC0+aGRyLnNpemUgPSBzaXplb2Yoc3RydWN0IGRtX2JhbGxvb25fcmVzcG9uc2UpOwogCQlibF9yZXNwLT5tb3JlX3BhZ2VzID0gMTsKIAotCiAJCW51bV9wYWdlcyAtPSBudW1fYmFsbG9vbmVkOwogCQludW1fYmFsbG9vbmVkID0gYWxsb2NfYmFsbG9vbl9wYWdlcygmZG1fZGV2aWNlLCBudW1fcGFnZXMsCiAJCQkJCQkgICAgYmxfcmVzcCwgYWxsb2NfdW5pdCk7CkBAIC0xNDYxLDcgKzE1MjMsNyBAQAogCWluaXRfY29tcGxldGlvbigmZG1fZGV2aWNlLmhvc3RfZXZlbnQpOwogCWluaXRfY29tcGxldGlvbigmZG1fZGV2aWNlLmNvbmZpZ19ldmVudCk7CiAJSU5JVF9MSVNUX0hFQUQoJmRtX2RldmljZS5oYV9yZWdpb25fbGlzdCk7Ci0JbXV0ZXhfaW5pdCgmZG1fZGV2aWNlLmhhX3JlZ2lvbl9tdXRleCk7CisJc3Bpbl9sb2NrX2luaXQoJmRtX2RldmljZS5oYV9sb2NrKTsKIAlJTklUX1dPUksoJmRtX2RldmljZS5iYWxsb29uX3dyay53cmssIGJhbGxvb25fdXApOwogCUlOSVRfV09SSygmZG1fZGV2aWNlLmhhX3dyay53cmssIGhvdF9hZGRfcmVxKTsKIAlkbV9kZXZpY2UuaG9zdF9zcGVjaWZpZWRfaGFfcmVnaW9uID0gZmFsc2U7CkBAIC0xNTgwLDggKzE2NDIsOSBAQAogc3RhdGljIGludCBiYWxsb29uX3JlbW92ZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGh2X2R5bm1lbV9kZXZpY2UgKmRtID0gaHZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpjdXIsICp0bXA7Ci0Jc3RydWN0IGh2X2hvdGFkZF9zdGF0ZSAqaGFzOworCXN0cnVjdCBodl9ob3RhZGRfc3RhdGUgKmhhcywgKnRtcDsKKwlzdHJ1Y3QgaHZfaG90YWRkX2dhcCAqZ2FwLCAqdG1wX2dhcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKGRtLT5udW1fcGFnZXNfYmFsbG9vbmVkICE9IDApCiAJCXByX3dhcm4oIkJhbGxvb25lZCBwYWdlczogJWRcbiIsIGRtLT5udW1fcGFnZXNfYmFsbG9vbmVkKTsKQEAgLTE1OTYsMTEgKzE2NTksMTYgQEAKIAlyZXN0b3JlX29ubGluZV9wYWdlX2NhbGxiYWNrKCZodl9vbmxpbmVfcGFnZSk7CiAJdW5yZWdpc3Rlcl9tZW1vcnlfbm90aWZpZXIoJmh2X21lbW9yeV9uYik7CiAjZW5kaWYKLQlsaXN0X2Zvcl9lYWNoX3NhZmUoY3VyLCB0bXAsICZkbS0+aGFfcmVnaW9uX2xpc3QpIHsKLQkJaGFzID0gbGlzdF9lbnRyeShjdXIsIHN0cnVjdCBodl9ob3RhZGRfc3RhdGUsIGxpc3QpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkbV9kZXZpY2UuaGFfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShoYXMsIHRtcCwgJmRtLT5oYV9yZWdpb25fbGlzdCwgbGlzdCkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZ2FwLCB0bXBfZ2FwLCAmaGFzLT5nYXBfbGlzdCwgbGlzdCkgeworCQkJbGlzdF9kZWwoJmdhcC0+bGlzdCk7CisJCQlrZnJlZShnYXApOworCQl9CiAJCWxpc3RfZGVsKCZoYXMtPmxpc3QpOwogCQlrZnJlZShoYXMpOwogCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbV9kZXZpY2UuaGFfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h2L2h2X2Zjb3B5LmMgYi9kcml2ZXJzL2h2L2h2X2Zjb3B5LmMKaW5kZXggMjNjNzA3OS4uOGIyYmE5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9odi9odl9mY29weS5jCisrKyBiL2RyaXZlcnMvaHYvaHZfZmNvcHkuYwpAQCAtODMsNiArODMsMTIgQEAKIAlodl9wb2xsX2NoYW5uZWwoZmNvcHlfdHJhbnNhY3Rpb24ucmVjdl9jaGFubmVsLCBmY29weV9wb2xsX3dyYXBwZXIpOwogfQogCitzdGF0aWMgdm9pZCBmY29weV9yZWdpc3Rlcl9kb25lKHZvaWQpCit7CisJcHJfZGVidWcoIkZDUDogdXNlcnNwYWNlIGRhZW1vbiByZWdpc3RlcmVkXG4iKTsKKwlodl9wb2xsX2NoYW5uZWwoZmNvcHlfdHJhbnNhY3Rpb24ucmVjdl9jaGFubmVsLCBmY29weV9wb2xsX3dyYXBwZXIpOworfQorCiBzdGF0aWMgaW50IGZjb3B5X2hhbmRsZV9oYW5kc2hha2UodTMyIHZlcnNpb24pCiB7CiAJdTMyIG91cl92ZXIgPSBGQ09QWV9DVVJSRU5UX1ZFUlNJT047CkBAIC05NCw3ICsxMDAsOCBAQAogCQlicmVhazsKIAljYXNlIEZDT1BZX1ZFUlNJT05fMToKIAkJLyogRGFlbW9uIGV4cGVjdHMgdXMgdG8gcmVwbHkgd2l0aCBvdXIgb3duIHZlcnNpb24gKi8KLQkJaWYgKGh2dXRpbF90cmFuc3BvcnRfc2VuZChodnQsICZvdXJfdmVyLCBzaXplb2Yob3VyX3ZlcikpKQorCQlpZiAoaHZ1dGlsX3RyYW5zcG9ydF9zZW5kKGh2dCwgJm91cl92ZXIsIHNpemVvZihvdXJfdmVyKSwKKwkJICAgIGZjb3B5X3JlZ2lzdGVyX2RvbmUpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCWRtX3JlZ192YWx1ZSA9IHZlcnNpb247CiAJCWJyZWFrOwpAQCAtMTA3LDggKzExNCw3IEBACiAJCSAqLwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JcHJfZGVidWcoIkZDUDogdXNlcnNwYWNlIGRhZW1vbiB2ZXIuICVkIHJlZ2lzdGVyZWRcbiIsIHZlcnNpb24pOwotCWh2X3BvbGxfY2hhbm5lbChmY29weV90cmFuc2FjdGlvbi5yZWN2X2NoYW5uZWwsIGZjb3B5X3BvbGxfd3JhcHBlcik7CisJcHJfZGVidWcoIkZDUDogdXNlcnNwYWNlIGRhZW1vbiB2ZXIuICVkIGNvbm5lY3RlZFxuIiwgdmVyc2lvbik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2MSw3ICsxNjcsNyBAQAogCX0KIAogCWZjb3B5X3RyYW5zYWN0aW9uLnN0YXRlID0gSFZVVElMX1VTRVJTUEFDRV9SRVE7Ci0JcmMgPSBodnV0aWxfdHJhbnNwb3J0X3NlbmQoaHZ0LCBvdXRfc3JjLCBvdXRfbGVuKTsKKwlyYyA9IGh2dXRpbF90cmFuc3BvcnRfc2VuZChodnQsIG91dF9zcmMsIG91dF9sZW4sIE5VTEwpOwogCWlmIChyYykgewogCQlwcl9kZWJ1ZygiRkNQOiBmYWlsZWQgdG8gY29tbXVuaWNhdGUgdG8gdGhlIGRhZW1vbjogJWRcbiIsIHJjKTsKIAkJaWYgKGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZmNvcHlfdGltZW91dF93b3JrKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9odi9odl9rdnAuYyBiL2RyaXZlcnMvaHYvaHZfa3ZwLmMKaW5kZXggY2IxYTkxNi4uNWUxZmRjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9odi9odl9rdnAuYworKysgYi9kcml2ZXJzL2h2L2h2X2t2cC5jCkBAIC0xMDIsNiArMTAyLDE3IEBACiAJaHZfa3ZwX29uY2hhbm5lbGNhbGxiYWNrKGNoYW5uZWwpOwogfQogCitzdGF0aWMgdm9pZCBrdnBfcmVnaXN0ZXJfZG9uZSh2b2lkKQoreworCS8qCisJICogSWYgd2UncmUgc3RpbGwgbmVnb3RpYXRpbmcgd2l0aCB0aGUgaG9zdCBjYW5jZWwgdGhlIHRpbWVvdXQKKwkgKiB3b3JrIHRvIG5vdCBwb2xsIHRoZSBjaGFubmVsIHR3aWNlLgorCSAqLworCXByX2RlYnVnKCJLVlA6IHVzZXJzcGFjZSBkYWVtb24gcmVnaXN0ZXJlZFxuIik7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZrdnBfaG9zdF9oYW5kc2hha2Vfd29yayk7CisJaHZfcG9sbF9jaGFubmVsKGt2cF90cmFuc2FjdGlvbi5yZWN2X2NoYW5uZWwsIGt2cF9wb2xsX3dyYXBwZXIpOworfQorCiBzdGF0aWMgdm9pZAoga3ZwX3JlZ2lzdGVyKGludCByZWdfdmFsdWUpCiB7CkBAIC0xMTYsNyArMTI3LDggQEAKIAkJa3ZwX21zZy0+a3ZwX2hkci5vcGVyYXRpb24gPSByZWdfdmFsdWU7CiAJCXN0cmNweSh2ZXJzaW9uLCBIVl9EUlZfVkVSU0lPTik7CiAKLQkJaHZ1dGlsX3RyYW5zcG9ydF9zZW5kKGh2dCwga3ZwX21zZywgc2l6ZW9mKCprdnBfbXNnKSk7CisJCWh2dXRpbF90cmFuc3BvcnRfc2VuZChodnQsIGt2cF9tc2csIHNpemVvZigqa3ZwX21zZyksCisJCQkJICAgICAga3ZwX3JlZ2lzdGVyX2RvbmUpOwogCQlrZnJlZShrdnBfbXNnKTsKIAl9CiB9CkBAIC0xNTgsMTcgKzE3MCwxMCBAQAogCS8qCiAJICogV2UgaGF2ZSBhIGNvbXBhdGlibGUgZGFlbW9uOyBjb21wbGV0ZSB0aGUgaGFuZHNoYWtlLgogCSAqLwotCXByX2RlYnVnKCJLVlA6IHVzZXJzcGFjZSBkYWVtb24gdmVyLiAlZCByZWdpc3RlcmVkXG4iLAotCQkgS1ZQX09QX1JFR0lTVEVSKTsKKwlwcl9kZWJ1ZygiS1ZQOiB1c2Vyc3BhY2UgZGFlbW9uIHZlci4gJWQgY29ubmVjdGVkXG4iLAorCQkgbXNnLT5rdnBfaGRyLm9wZXJhdGlvbik7CiAJa3ZwX3JlZ2lzdGVyKGRtX3JlZ192YWx1ZSk7CiAKLQkvKgotCSAqIElmIHdlJ3JlIHN0aWxsIG5lZ290aWF0aW5nIHdpdGggdGhlIGhvc3QgY2FuY2VsIHRoZSB0aW1lb3V0Ci0JICogd29yayB0byBub3QgcG9sbCB0aGUgY2hhbm5lbCB0d2ljZS4KLQkgKi8KLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmt2cF9ob3N0X2hhbmRzaGFrZV93b3JrKTsKLQlodl9wb2xsX2NoYW5uZWwoa3ZwX3RyYW5zYWN0aW9uLnJlY3ZfY2hhbm5lbCwga3ZwX3BvbGxfd3JhcHBlcik7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNDU1LDcgKzQ2MCw3IEBACiAJfQogCiAJa3ZwX3RyYW5zYWN0aW9uLnN0YXRlID0gSFZVVElMX1VTRVJTUEFDRV9SRVE7Ci0JcmMgPSBodnV0aWxfdHJhbnNwb3J0X3NlbmQoaHZ0LCBtZXNzYWdlLCBzaXplb2YoKm1lc3NhZ2UpKTsKKwlyYyA9IGh2dXRpbF90cmFuc3BvcnRfc2VuZChodnQsIG1lc3NhZ2UsIHNpemVvZigqbWVzc2FnZSksIE5VTEwpOwogCWlmIChyYykgewogCQlwcl9kZWJ1ZygiS1ZQOiBmYWlsZWQgdG8gY29tbXVuaWNhdGUgdG8gdGhlIGRhZW1vbjogJWRcbiIsIHJjKTsKIAkJaWYgKGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygma3ZwX3RpbWVvdXRfd29yaykpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHYvaHZfc25hcHNob3QuYyBiL2RyaXZlcnMvaHYvaHZfc25hcHNob3QuYwppbmRleCAzZmJhMTRlLi5hNjcwNzEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h2L2h2X3NuYXBzaG90LmMKKysrIGIvZHJpdmVycy9odi9odl9zbmFwc2hvdC5jCkBAIC02NywxMSArNjcsMTEgQEAKIHN0YXRpYyBfX3U4ICpyZWN2X2J1ZmZlcjsKIHN0YXRpYyBzdHJ1Y3QgaHZ1dGlsX3RyYW5zcG9ydCAqaHZ0OwogCi1zdGF0aWMgdm9pZCB2c3Nfc2VuZF9vcChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmR1bW15KTsKIHN0YXRpYyB2b2lkIHZzc190aW1lb3V0X2Z1bmMoc3RydWN0IHdvcmtfc3RydWN0ICpkdW1teSk7CitzdGF0aWMgdm9pZCB2c3NfaGFuZGxlX3JlcXVlc3Qoc3RydWN0IHdvcmtfc3RydWN0ICpkdW1teSk7CiAKIHN0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyh2c3NfdGltZW91dF93b3JrLCB2c3NfdGltZW91dF9mdW5jKTsKLXN0YXRpYyBERUNMQVJFX1dPUksodnNzX3NlbmRfb3Bfd29yaywgdnNzX3NlbmRfb3ApOworc3RhdGljIERFQ0xBUkVfV09SSyh2c3NfaGFuZGxlX3JlcXVlc3Rfd29yaywgdnNzX2hhbmRsZV9yZXF1ZXN0KTsKIAogc3RhdGljIHZvaWQgdnNzX3BvbGxfd3JhcHBlcih2b2lkICpjaGFubmVsKQogewpAQCAtOTUsNiArOTUsMTIgQEAKIAlodl9wb2xsX2NoYW5uZWwodnNzX3RyYW5zYWN0aW9uLnJlY3ZfY2hhbm5lbCwgdnNzX3BvbGxfd3JhcHBlcik7CiB9CiAKK3N0YXRpYyB2b2lkIHZzc19yZWdpc3Rlcl9kb25lKHZvaWQpCit7CisJaHZfcG9sbF9jaGFubmVsKHZzc190cmFuc2FjdGlvbi5yZWN2X2NoYW5uZWwsIHZzc19wb2xsX3dyYXBwZXIpOworCXByX2RlYnVnKCJWU1M6IHVzZXJzcGFjZSBkYWVtb24gcmVnaXN0ZXJlZFxuIik7Cit9CisKIHN0YXRpYyBpbnQgdnNzX2hhbmRsZV9oYW5kc2hha2Uoc3RydWN0IGh2X3Zzc19tc2cgKnZzc19tc2cpCiB7CiAJdTMyIG91cl92ZXIgPSBWU1NfT1BfUkVHSVNURVIxOwpAQCAtMTA1LDE2ICsxMTEsMTYgQEAKIAkJZG1fcmVnX3ZhbHVlID0gVlNTX09QX1JFR0lTVEVSOwogCQlicmVhazsKIAljYXNlIFZTU19PUF9SRUdJU1RFUjE6Ci0JCS8qIERhZW1vbiBleHBlY3RzIHVzIHRvIHJlcGx5IHdpdGggb3VyIG93biB2ZXJzaW9uKi8KLQkJaWYgKGh2dXRpbF90cmFuc3BvcnRfc2VuZChodnQsICZvdXJfdmVyLCBzaXplb2Yob3VyX3ZlcikpKQorCQkvKiBEYWVtb24gZXhwZWN0cyB1cyB0byByZXBseSB3aXRoIG91ciBvd24gdmVyc2lvbiAqLworCQlpZiAoaHZ1dGlsX3RyYW5zcG9ydF9zZW5kKGh2dCwgJm91cl92ZXIsIHNpemVvZihvdXJfdmVyKSwKKwkJCQkJICB2c3NfcmVnaXN0ZXJfZG9uZSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJZG1fcmVnX3ZhbHVlID0gVlNTX09QX1JFR0lTVEVSMTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWh2X3BvbGxfY2hhbm5lbCh2c3NfdHJhbnNhY3Rpb24ucmVjdl9jaGFubmVsLCB2c3NfcG9sbF93cmFwcGVyKTsKLQlwcl9kZWJ1ZygiVlNTOiB1c2Vyc3BhY2UgZGFlbW9uIHZlci4gJWQgcmVnaXN0ZXJlZFxuIiwgZG1fcmVnX3ZhbHVlKTsKKwlwcl9kZWJ1ZygiVlNTOiB1c2Vyc3BhY2UgZGFlbW9uIHZlci4gJWQgY29ubmVjdGVkXG4iLCBkbV9yZWdfdmFsdWUpOwogCXJldHVybiAwOwogfQogCkBAIC0xMzYsNiArMTQyLDExIEBACiAJCXJldHVybiB2c3NfaGFuZGxlX2hhbmRzaGFrZSh2c3NfbXNnKTsKIAl9IGVsc2UgaWYgKHZzc190cmFuc2FjdGlvbi5zdGF0ZSA9PSBIVlVUSUxfVVNFUlNQQUNFX1JFUSkgewogCQl2c3NfdHJhbnNhY3Rpb24uc3RhdGUgPSBIVlVUSUxfVVNFUlNQQUNFX1JFQ1Y7CisKKwkJaWYgKHZzc19tc2ctPnZzc19oZHIub3BlcmF0aW9uID09IFZTU19PUF9IT1RfQkFDS1VQKQorCQkJdnNzX3RyYW5zYWN0aW9uLm1zZy0+dnNzX2NmLmZsYWdzID0KKwkJCQlWU1NfSEJVX05PX0FVVE9fUkVDT1ZFUlk7CisKIAkJaWYgKGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmdnNzX3RpbWVvdXRfd29yaykpIHsKIAkJCXZzc19yZXNwb25kX3RvX2hvc3QodnNzX21zZy0+ZXJyb3IpOwogCQkJLyogVHJhbnNhY3Rpb24gaXMgZmluaXNoZWQsIHJlc2V0IHRoZSBzdGF0ZS4gKi8KQEAgLTE1MCw4ICsxNjEsNyBAQAogCXJldHVybiAwOwogfQogCi0KLXN0YXRpYyB2b2lkIHZzc19zZW5kX29wKHN0cnVjdCB3b3JrX3N0cnVjdCAqZHVtbXkpCitzdGF0aWMgdm9pZCB2c3Nfc2VuZF9vcCh2b2lkKQogewogCWludCBvcCA9IHZzc190cmFuc2FjdGlvbi5tc2ctPnZzc19oZHIub3BlcmF0aW9uOwogCWludCByYzsKQEAgLTE2OCw3ICsxNzgsMTAgQEAKIAl2c3NfbXNnLT52c3NfaGRyLm9wZXJhdGlvbiA9IG9wOwogCiAJdnNzX3RyYW5zYWN0aW9uLnN0YXRlID0gSFZVVElMX1VTRVJTUEFDRV9SRVE7Ci0JcmMgPSBodnV0aWxfdHJhbnNwb3J0X3NlbmQoaHZ0LCB2c3NfbXNnLCBzaXplb2YoKnZzc19tc2cpKTsKKworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdnNzX3RpbWVvdXRfd29yaywgVlNTX1VTRVJTUEFDRV9USU1FT1VUKTsKKworCXJjID0gaHZ1dGlsX3RyYW5zcG9ydF9zZW5kKGh2dCwgdnNzX21zZywgc2l6ZW9mKCp2c3NfbXNnKSwgTlVMTCk7CiAJaWYgKHJjKSB7CiAJCXByX3dhcm4oIlZTUzogZmFpbGVkIHRvIGNvbW11bmljYXRlIHRvIHRoZSBkYWVtb246ICVkXG4iLCByYyk7CiAJCWlmIChjYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnZzc190aW1lb3V0X3dvcmspKSB7CkBAIC0xODIsNiArMTk1LDM4IEBACiAJcmV0dXJuOwogfQogCitzdGF0aWMgdm9pZCB2c3NfaGFuZGxlX3JlcXVlc3Qoc3RydWN0IHdvcmtfc3RydWN0ICpkdW1teSkKK3sKKwlzd2l0Y2ggKHZzc190cmFuc2FjdGlvbi5tc2ctPnZzc19oZHIub3BlcmF0aW9uKSB7CisJLyoKKwkgKiBJbml0aWF0ZSBhICJmcmVlemUvdGhhdyIgb3BlcmF0aW9uIGluIHRoZSBndWVzdC4KKwkgKiBXZSByZXNwb25kIHRvIHRoZSBob3N0IG9uY2UgdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS4KKwkgKgorCSAqIFdlIHNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIHVzZXIgc3BhY2UgZGFlbW9uIGFuZCB0aGUgb3BlcmF0aW9uIGlzCisJICogcGVyZm9ybWVkIGluIHRoZSBkYWVtb24uCisJICovCisJY2FzZSBWU1NfT1BfVEhBVzoKKwljYXNlIFZTU19PUF9GUkVFWkU6CisJY2FzZSBWU1NfT1BfSE9UX0JBQ0tVUDoKKwkJaWYgKHZzc190cmFuc2FjdGlvbi5zdGF0ZSA8IEhWVVRJTF9SRUFEWSkgeworCQkJLyogVXNlcnNwYWNlIGlzIG5vdCByZWdpc3RlcmVkIHlldCAqLworCQkJdnNzX3Jlc3BvbmRfdG9faG9zdChIVl9FX0ZBSUwpOworCQkJcmV0dXJuOworCQl9CisJCXZzc190cmFuc2FjdGlvbi5zdGF0ZSA9IEhWVVRJTF9IT1NUTVNHX1JFQ0VJVkVEOworCQl2c3Nfc2VuZF9vcCgpOworCQlyZXR1cm47CisJY2FzZSBWU1NfT1BfR0VUX0RNX0lORk86CisJCXZzc190cmFuc2FjdGlvbi5tc2ctPmRtX2luZm8uZmxhZ3MgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwl2c3NfcmVzcG9uZF90b19ob3N0KDApOworCWh2X3BvbGxfY2hhbm5lbCh2c3NfdHJhbnNhY3Rpb24ucmVjdl9jaGFubmVsLCB2c3NfcG9sbF93cmFwcGVyKTsKK30KKwogLyoKICAqIFNlbmQgYSByZXNwb25zZSBiYWNrIHRvIHRoZSBob3N0LgogICovCkBAIC0yNjYsNDggKzMxMSw4IEBACiAJCQl2c3NfdHJhbnNhY3Rpb24ucmVjdl9yZXFfaWQgPSByZXF1ZXN0aWQ7CiAJCQl2c3NfdHJhbnNhY3Rpb24ubXNnID0gKHN0cnVjdCBodl92c3NfbXNnICopdnNzX21zZzsKIAotCQkJc3dpdGNoICh2c3NfbXNnLT52c3NfaGRyLm9wZXJhdGlvbikgewotCQkJCS8qCi0JCQkJICogSW5pdGlhdGUgYSAiZnJlZXplL3RoYXciCi0JCQkJICogb3BlcmF0aW9uIGluIHRoZSBndWVzdC4KLQkJCQkgKiBXZSByZXNwb25kIHRvIHRoZSBob3N0IG9uY2UKLQkJCQkgKiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLgotCQkJCSAqCi0JCQkJICogV2Ugc2VuZCB0aGUgbWVzc2FnZSB0byB0aGUKLQkJCQkgKiB1c2VyIHNwYWNlIGRhZW1vbiBhbmQgdGhlCi0JCQkJICogb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBpbgotCQkJCSAqIHRoZSBkYWVtb24uCi0JCQkJICovCi0JCQljYXNlIFZTU19PUF9GUkVFWkU6Ci0JCQljYXNlIFZTU19PUF9USEFXOgotCQkJCWlmICh2c3NfdHJhbnNhY3Rpb24uc3RhdGUgPCBIVlVUSUxfUkVBRFkpIHsKLQkJCQkJLyogVXNlcnNwYWNlIGlzIG5vdCByZWdpc3RlcmVkIHlldCAqLwotCQkJCQl2c3NfcmVzcG9uZF90b19ob3N0KEhWX0VfRkFJTCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJdnNzX3RyYW5zYWN0aW9uLnN0YXRlID0gSFZVVElMX0hPU1RNU0dfUkVDRUlWRUQ7Ci0JCQkJc2NoZWR1bGVfd29yaygmdnNzX3NlbmRfb3Bfd29yayk7Ci0JCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ2c3NfdGltZW91dF93b3JrLAotCQkJCQkJICAgICAgVlNTX1VTRVJTUEFDRV9USU1FT1VUKTsKLQkJCQlyZXR1cm47Ci0KLQkJCWNhc2UgVlNTX09QX0hPVF9CQUNLVVA6Ci0JCQkJdnNzX21zZy0+dnNzX2NmLmZsYWdzID0KLQkJCQkJIFZTU19IQlVfTk9fQVVUT19SRUNPVkVSWTsKLQkJCQl2c3NfcmVzcG9uZF90b19ob3N0KDApOwotCQkJCXJldHVybjsKLQotCQkJY2FzZSBWU1NfT1BfR0VUX0RNX0lORk86Ci0JCQkJdnNzX21zZy0+ZG1faW5mby5mbGFncyA9IDA7Ci0JCQkJdnNzX3Jlc3BvbmRfdG9faG9zdCgwKTsKLQkJCQlyZXR1cm47Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJdnNzX3Jlc3BvbmRfdG9faG9zdCgwKTsKLQkJCQlyZXR1cm47Ci0KLQkJCX0KLQorCQkJc2NoZWR1bGVfd29yaygmdnNzX2hhbmRsZV9yZXF1ZXN0X3dvcmspOworCQkJcmV0dXJuOwogCQl9CiAKIAkJaWNtc2doZHJwLT5pY2ZsYWdzID0gSUNNU0dIRFJGTEFHX1RSQU5TQUNUSU9OCkBAIC0zNTgsNiArMzYzLDYgQEAKIHsKIAl2c3NfdHJhbnNhY3Rpb24uc3RhdGUgPSBIVlVUSUxfREVWSUNFX0RZSU5HOwogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmdnNzX3RpbWVvdXRfd29yayk7Ci0JY2FuY2VsX3dvcmtfc3luYygmdnNzX3NlbmRfb3Bfd29yayk7CisJY2FuY2VsX3dvcmtfc3luYygmdnNzX2hhbmRsZV9yZXF1ZXN0X3dvcmspOwogCWh2dXRpbF90cmFuc3BvcnRfZGVzdHJveShodnQpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9odi9odl91dGlsLmMgYi9kcml2ZXJzL2h2L2h2X3V0aWwuYwppbmRleCBkNWFjYWEyLi40YWEzY2I2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h2L2h2X3V0aWwuYworKysgYi9kcml2ZXJzL2h2L2h2X3V0aWwuYwpAQCAtMzQsMjIgKzM0LDI1IEBACiAjZGVmaW5lIFNEX01JTk9SCTAKICNkZWZpbmUgU0RfVkVSU0lPTgkoU0RfTUFKT1IgPDwgMTYgfCBTRF9NSU5PUikKIAotI2RlZmluZSBTRF9XUzIwMDhfTUFKT1IJCTEKLSNkZWZpbmUgU0RfV1MyMDA4X1ZFUlNJT04JKFNEX1dTMjAwOF9NQUpPUiA8PCAxNiB8IFNEX01JTk9SKQorI2RlZmluZSBTRF9NQUpPUl8xCTEKKyNkZWZpbmUgU0RfVkVSU0lPTl8xCShTRF9NQUpPUl8xIDw8IDE2IHwgU0RfTUlOT1IpCiAKLSNkZWZpbmUgVFNfTUFKT1IJMworI2RlZmluZSBUU19NQUpPUgk0CiAjZGVmaW5lIFRTX01JTk9SCTAKICNkZWZpbmUgVFNfVkVSU0lPTgkoVFNfTUFKT1IgPDwgMTYgfCBUU19NSU5PUikKIAotI2RlZmluZSBUU19XUzIwMDhfTUFKT1IJCTEKLSNkZWZpbmUgVFNfV1MyMDA4X1ZFUlNJT04JKFRTX1dTMjAwOF9NQUpPUiA8PCAxNiB8IFRTX01JTk9SKQorI2RlZmluZSBUU19NQUpPUl8xCTEKKyNkZWZpbmUgVFNfVkVSU0lPTl8xCShUU19NQUpPUl8xIDw8IDE2IHwgVFNfTUlOT1IpCisKKyNkZWZpbmUgVFNfTUFKT1JfMwkzCisjZGVmaW5lIFRTX1ZFUlNJT05fMwkoVFNfTUFKT1JfMyA8PCAxNiB8IFRTX01JTk9SKQogCiAjZGVmaW5lIEhCX01BSk9SCTMKLSNkZWZpbmUgSEJfTUlOT1IgMAorI2RlZmluZSBIQl9NSU5PUgkwCiAjZGVmaW5lIEhCX1ZFUlNJT04JKEhCX01BSk9SIDw8IDE2IHwgSEJfTUlOT1IpCiAKLSNkZWZpbmUgSEJfV1MyMDA4X01BSk9SCTEKLSNkZWZpbmUgSEJfV1MyMDA4X1ZFUlNJT04JKEhCX1dTMjAwOF9NQUpPUiA8PCAxNiB8IEhCX01JTk9SKQorI2RlZmluZSBIQl9NQUpPUl8xCTEKKyNkZWZpbmUgSEJfVkVSU0lPTl8xCShIQl9NQUpPUl8xIDw8IDE2IHwgSEJfTUlOT1IpCiAKIHN0YXRpYyBpbnQgc2Rfc3J2X3ZlcnNpb247CiBzdGF0aWMgaW50IHRzX3Nydl92ZXJzaW9uOwpAQCAtNjEsOSArNjQsMTQgQEAKIAkudXRpbF9jYiA9IHNodXRkb3duX29uY2hhbm5lbGNhbGxiYWNrLAogfTsKIAorc3RhdGljIGludCBodl90aW1lc3luY19pbml0KHN0cnVjdCBodl91dGlsX3NlcnZpY2UgKnNydik7CitzdGF0aWMgdm9pZCBodl90aW1lc3luY19kZWluaXQodm9pZCk7CisKIHN0YXRpYyB2b2lkIHRpbWVzeW5jX29uY2hhbm5lbGNhbGxiYWNrKHZvaWQgKmNvbnRleHQpOwogc3RhdGljIHN0cnVjdCBodl91dGlsX3NlcnZpY2UgdXRpbF90aW1lc3luY2ggPSB7CiAJLnV0aWxfY2IgPSB0aW1lc3luY19vbmNoYW5uZWxjYWxsYmFjaywKKwkudXRpbF9pbml0ID0gaHZfdGltZXN5bmNfaW5pdCwKKwkudXRpbF9kZWluaXQgPSBodl90aW1lc3luY19kZWluaXQsCiB9OwogCiBzdGF0aWMgdm9pZCBoZWFydGJlYXRfb25jaGFubmVsY2FsbGJhY2sodm9pZCAqY29udGV4dCk7CkBAIC0xNjEsMzUgKzE2OSw0MyBAQAogfQogCiAvKgotICogU2V0IGd1ZXN0IHRpbWUgdG8gaG9zdCBVVEMgdGltZS4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGRvX2Fkal9ndWVzdHRpbWUodTY0IGhvc3R0aW1lKQotewotCXM2NCBob3N0X3RuczsKLQlzdHJ1Y3QgdGltZXNwZWMgaG9zdF90czsKLQotCWhvc3RfdG5zID0gKGhvc3R0aW1lIC0gV0xUSU1FREVMVEEpICogMTAwOwotCWhvc3RfdHMgPSBuc190b190aW1lc3BlYyhob3N0X3Rucyk7Ci0KLQlkb19zZXR0aW1lb2ZkYXkoJmhvc3RfdHMpOwotfQotCi0vKgogICogU2V0IHRoZSBob3N0IHRpbWUgaW4gYSBwcm9jZXNzIGNvbnRleHQuCiAgKi8KIAogc3RydWN0IGFkal90aW1lX3dvcmsgewogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogCXU2NAlob3N0X3RpbWU7CisJdTY0CXJlZl90aW1lOworCXU4CWZsYWdzOwogfTsKIAogc3RhdGljIHZvaWQgaHZfc2V0X2hvc3RfdGltZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGFkal90aW1lX3dvcmsJKndyazsKKwlzNjQgaG9zdF90bnM7CisJdTY0IG5ld3RpbWU7CisJc3RydWN0IHRpbWVzcGVjIGhvc3RfdHM7CiAKIAl3cmsgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFkal90aW1lX3dvcmssIHdvcmspOwotCWRvX2Fkal9ndWVzdHRpbWUod3JrLT5ob3N0X3RpbWUpOwotCWtmcmVlKHdyayk7CisKKwluZXd0aW1lID0gd3JrLT5ob3N0X3RpbWU7CisJaWYgKHRzX3Nydl92ZXJzaW9uID4gVFNfVkVSU0lPTl8zKSB7CisJCS8qCisJCSAqIFNvbWUgbGF0ZW5jeSBoYXMgYmVlbiBpbnRyb2R1Y2VkIHNpbmNlIEh5cGVyLVYgZ2VuZXJhdGVkCisJCSAqIGl0cyB0aW1lIHNhbXBsZS4gVGFrZSB0aGF0IGxhdGVuY3kgaW50byBhY2NvdW50IGJlZm9yZQorCQkgKiB1c2luZyBUU0MgcmVmZXJlbmNlIHRpbWUgc2FtcGxlIGZyb20gSHlwZXItVi4KKwkJICoKKwkJICogVGhpcyBzYW1wbGUgaXMgZ2l2ZW4gYnkgVGltZVN5bmMgdjQgYW5kIGFib3ZlIGhvc3RzLgorCQkgKi8KKwkJdTY0IGN1cnJlbnRfdGljazsKKworCQlyZG1zcmwoSFZfWDY0X01TUl9USU1FX1JFRl9DT1VOVCwgY3VycmVudF90aWNrKTsKKwkJbmV3dGltZSArPSAoY3VycmVudF90aWNrIC0gd3JrLT5yZWZfdGltZSk7CisJfQorCWhvc3RfdG5zID0gKG5ld3RpbWUgLSBXTFRJTUVERUxUQSkgKiAxMDA7CisJaG9zdF90cyA9IG5zX3RvX3RpbWVzcGVjKGhvc3RfdG5zKTsKKworCWRvX3NldHRpbWVvZmRheSgmaG9zdF90cyk7CiB9CiAKIC8qCkBAIC0xOTgsMzMgKzIxNCwzMSBAQAogICogSUNUSU1FU1lOQ0ZMQUdfU1lOQyBmbGFnIGJpdCBpbmRpY2F0ZXMgcmVib290LCByZXN0b3JlIGV2ZW50cyBvZiB0aGUgVk0uCiAgKiBBZnRlciByZWJvb3QgdGhlIGZsYWcgSUNUSU1FU1lOQ0ZMQUdfU1lOQyBpcyBpbmNsdWRlZCBpbiB0aGUgZmlyc3QgdGltZQogICogbWVzc2FnZSBhZnRlciB0aGUgdGltZXN5bmMgY2hhbm5lbCBpcyBvcGVuZWQuIFNpbmNlIHRoZSBodl91dGlscyBtb2R1bGUgaXMKLSAqIGxvYWRlZCBhZnRlciBodl92bWJ1cywgdGhlIGZpcnN0IG1lc3NhZ2UgaXMgdXN1YWxseSBtaXNzZWQuIFRoZSBvdGhlcgotICogdGhpbmcgaXMsIHN5c3RpbWUgaXMgYXV0b21hdGljYWxseSBzZXQgdG8gZW11bGF0ZWQgaGFyZHdhcmUgY2xvY2sgd2hpY2ggbWF5Ci0gKiBub3QgYmUgVVRDIHRpbWUgb3IgaW4gdGhlIHNhbWUgdGltZSB6b25lLiBTbywgdG8gb3ZlcnJpZGUgdGhlc2UgZWZmZWN0cywgd2UKLSAqIHVzZSB0aGUgZmlyc3QgNTAgdGltZSBzYW1wbGVzIGZvciBpbml0aWFsIHN5c3RlbSB0aW1lIHNldHRpbmcuCisgKiBsb2FkZWQgYWZ0ZXIgaHZfdm1idXMsIHRoZSBmaXJzdCBtZXNzYWdlIGlzIHVzdWFsbHkgbWlzc2VkLiBUaGlzIGJpdCBpcworICogY29uc2lkZXJlZCBhIGhhcmQgcmVxdWVzdCB0byBkaXNjaXBsaW5lIHRoZSBjbG9jay4KKyAqCisgKiBJQ1RJTUVTWU5DRkxBR19TQU1QTEUgYml0IGluZGljYXRlcyBhIHRpbWUgc2FtcGxlIGZyb20gaG9zdC4gVGhpcyBpcworICogdHlwaWNhbGx5IHVzZWQgYXMgYSBoaW50IHRvIHRoZSBndWVzdC4gVGhlIGd1ZXN0IGlzIHVuZGVyIG5vIG9ibGlnYXRpb24KKyAqIHRvIGRpc2NpcGxpbmUgdGhlIGNsb2NrLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYWRqX2d1ZXN0dGltZSh1NjQgaG9zdHRpbWUsIHU4IGZsYWdzKQorc3RhdGljIHN0cnVjdCBhZGpfdGltZV93b3JrICB3cms7CitzdGF0aWMgaW5saW5lIHZvaWQgYWRqX2d1ZXN0dGltZSh1NjQgaG9zdHRpbWUsIHU2NCByZWZ0aW1lLCB1OCBmbGFncykKIHsKLQlzdHJ1Y3QgYWRqX3RpbWVfd29yayAgICAqd3JrOwotCXN0YXRpYyBzMzIgc2NudCA9IDUwOwogCi0Jd3JrID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFkal90aW1lX3dvcmspLCBHRlBfQVRPTUlDKTsKLQlpZiAod3JrID09IE5VTEwpCisJLyoKKwkgKiBUaGlzIGNoZWNrIGlzIHNhZmUgc2luY2Ugd2UgYXJlIGV4ZWN1dGluZyBpbiB0aGUKKwkgKiBpbnRlcnJ1cHQgY29udGV4dCBhbmQgdGltZSBzeW5jaCBtZXNzYWdlcyBhcnJlIGFsd2F5cworCSAqIGRlbGl2ZXJlZCBvbiB0aGUgc2FtZSBDUFUuCisJICovCisJaWYgKHdvcmtfcGVuZGluZygmd3JrLndvcmspKQogCQlyZXR1cm47CiAKLQl3cmstPmhvc3RfdGltZSA9IGhvc3R0aW1lOwotCWlmICgoZmxhZ3MgJiBJQ1RJTUVTWU5DRkxBR19TWU5DKSAhPSAwKSB7Ci0JCUlOSVRfV09SSygmd3JrLT53b3JrLCBodl9zZXRfaG9zdF90aW1lKTsKLQkJc2NoZWR1bGVfd29yaygmd3JrLT53b3JrKTsKLQkJcmV0dXJuOworCXdyay5ob3N0X3RpbWUgPSBob3N0dGltZTsKKwl3cmsucmVmX3RpbWUgPSByZWZ0aW1lOworCXdyay5mbGFncyA9IGZsYWdzOworCWlmICgoZmxhZ3MgJiAoSUNUSU1FU1lOQ0ZMQUdfU1lOQyB8IElDVElNRVNZTkNGTEFHX1NBTVBMRSkpICE9IDApIHsKKwkJc2NoZWR1bGVfd29yaygmd3JrLndvcmspOwogCX0KLQotCWlmICgoZmxhZ3MgJiBJQ1RJTUVTWU5DRkxBR19TQU1QTEUpICE9IDAgJiYgc2NudCA+IDApIHsKLQkJc2NudC0tOwotCQlJTklUX1dPUksoJndyay0+d29yaywgaHZfc2V0X2hvc3RfdGltZSk7Ci0JCXNjaGVkdWxlX3dvcmsoJndyay0+d29yayk7Ci0JfSBlbHNlCi0JCWtmcmVlKHdyayk7CiB9CiAKIC8qCkBAIC0yMzcsNiArMjUxLDcgQEAKIAl1NjQgcmVxdWVzdGlkOwogCXN0cnVjdCBpY21zZ19oZHIgKmljbXNnaGRycDsKIAlzdHJ1Y3QgaWN0aW1lc3luY19kYXRhICp0aW1lZGF0YXA7CisJc3RydWN0IGljdGltZXN5bmNfcmVmX2RhdGEgKnJlZmRhdGE7CiAJdTggKnRpbWVfdHhmX2J1ZiA9IHV0aWxfdGltZXN5bmNoLnJlY3ZfYnVmZmVyOwogCXN0cnVjdCBpY21zZ19uZWdvdGlhdGUgKm5lZ29wID0gTlVMTDsKIApAQCAtMjUyLDExICsyNjcsMjcgQEAKIAkJCQkJCXRpbWVfdHhmX2J1ZiwKIAkJCQkJCXV0aWxfZndfdmVyc2lvbiwKIAkJCQkJCXRzX3Nydl92ZXJzaW9uKTsKKwkJCXByX2luZm8oIlVzaW5nIFRpbWVTeW5jIHZlcnNpb24gJWQuJWRcbiIsCisJCQkJdHNfc3J2X3ZlcnNpb24gPj4gMTYsIHRzX3Nydl92ZXJzaW9uICYgMHhGRkZGKTsKIAkJfSBlbHNlIHsKLQkJCXRpbWVkYXRhcCA9IChzdHJ1Y3QgaWN0aW1lc3luY19kYXRhICopJnRpbWVfdHhmX2J1ZlsKLQkJCQlzaXplb2Yoc3RydWN0IHZtYnVzcGlwZV9oZHIpICsKLQkJCQlzaXplb2Yoc3RydWN0IGljbXNnX2hkcildOwotCQkJYWRqX2d1ZXN0dGltZSh0aW1lZGF0YXAtPnBhcmVudHRpbWUsIHRpbWVkYXRhcC0+ZmxhZ3MpOworCQkJaWYgKHRzX3Nydl92ZXJzaW9uID4gVFNfVkVSU0lPTl8zKSB7CisJCQkJcmVmZGF0YSA9IChzdHJ1Y3QgaWN0aW1lc3luY19yZWZfZGF0YSAqKQorCQkJCQkmdGltZV90eGZfYnVmWworCQkJCQlzaXplb2Yoc3RydWN0IHZtYnVzcGlwZV9oZHIpICsKKwkJCQkJc2l6ZW9mKHN0cnVjdCBpY21zZ19oZHIpXTsKKworCQkJCWFkal9ndWVzdHRpbWUocmVmZGF0YS0+cGFyZW50dGltZSwKKwkJCQkJCXJlZmRhdGEtPnZtcmVmZXJlbmNldGltZSwKKwkJCQkJCXJlZmRhdGEtPmZsYWdzKTsKKwkJCX0gZWxzZSB7CisJCQkJdGltZWRhdGFwID0gKHN0cnVjdCBpY3RpbWVzeW5jX2RhdGEgKikKKwkJCQkJJnRpbWVfdHhmX2J1ZlsKKwkJCQkJc2l6ZW9mKHN0cnVjdCB2bWJ1c3BpcGVfaGRyKSArCisJCQkJCXNpemVvZihzdHJ1Y3QgaWNtc2dfaGRyKV07CisJCQkJYWRqX2d1ZXN0dGltZSh0aW1lZGF0YXAtPnBhcmVudHRpbWUsCisJCQkJCQkwLAorCQkJCQkJdGltZWRhdGFwLT5mbGFncyk7CisJCQl9CiAJCX0KIAogCQlpY21zZ2hkcnAtPmljZmxhZ3MgPSBJQ01TR0hEUkZMQUdfVFJBTlNBQ1RJT04KQEAgLTM1MCwxNiArMzgxLDIxIEBACiAJc3dpdGNoICh2bWJ1c19wcm90b192ZXJzaW9uKSB7CiAJY2FzZSAoVkVSU0lPTl9XUzIwMDgpOgogCQl1dGlsX2Z3X3ZlcnNpb24gPSBVVElMX1dTMks4X0ZXX1ZFUlNJT047Ci0JCXNkX3Nydl92ZXJzaW9uID0gU0RfV1MyMDA4X1ZFUlNJT047Ci0JCXRzX3Nydl92ZXJzaW9uID0gVFNfV1MyMDA4X1ZFUlNJT047Ci0JCWhiX3Nydl92ZXJzaW9uID0gSEJfV1MyMDA4X1ZFUlNJT047CisJCXNkX3Nydl92ZXJzaW9uID0gU0RfVkVSU0lPTl8xOworCQl0c19zcnZfdmVyc2lvbiA9IFRTX1ZFUlNJT05fMTsKKwkJaGJfc3J2X3ZlcnNpb24gPSBIQl9WRVJTSU9OXzE7CiAJCWJyZWFrOwotCi0JZGVmYXVsdDoKKwljYXNlKFZFUlNJT05fV0lOMTApOgogCQl1dGlsX2Z3X3ZlcnNpb24gPSBVVElMX0ZXX1ZFUlNJT047CiAJCXNkX3Nydl92ZXJzaW9uID0gU0RfVkVSU0lPTjsKIAkJdHNfc3J2X3ZlcnNpb24gPSBUU19WRVJTSU9OOwogCQloYl9zcnZfdmVyc2lvbiA9IEhCX1ZFUlNJT047CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXV0aWxfZndfdmVyc2lvbiA9IFVUSUxfRldfVkVSU0lPTjsKKwkJc2Rfc3J2X3ZlcnNpb24gPSBTRF9WRVJTSU9OOworCQl0c19zcnZfdmVyc2lvbiA9IFRTX1ZFUlNJT05fMzsKKwkJaGJfc3J2X3ZlcnNpb24gPSBIQl9WRVJTSU9OOwogCX0KIAogCXJldCA9IHZtYnVzX29wZW4oZGV2LT5jaGFubmVsLCA0ICogUEFHRV9TSVpFLCA0ICogUEFHRV9TSVpFLCBOVUxMLCAwLApAQCAtNDI3LDYgKzQ2MywxNyBAQAogCS5yZW1vdmUgPSAgdXRpbF9yZW1vdmUsCiB9OwogCitzdGF0aWMgaW50IGh2X3RpbWVzeW5jX2luaXQoc3RydWN0IGh2X3V0aWxfc2VydmljZSAqc3J2KQoreworCUlOSVRfV09SSygmd3JrLndvcmssIGh2X3NldF9ob3N0X3RpbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBodl90aW1lc3luY19kZWluaXQodm9pZCkKK3sKKwljYW5jZWxfd29ya19zeW5jKCZ3cmsud29yayk7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfaHlwZXJ2X3V0aWxzKHZvaWQpCiB7CiAJcHJfaW5mbygiUmVnaXN0ZXJpbmcgSHlwZXJWIFV0aWxpdHkgRHJpdmVyXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHYvaHZfdXRpbHNfdHJhbnNwb3J0LmMgYi9kcml2ZXJzL2h2L2h2X3V0aWxzX3RyYW5zcG9ydC5jCmluZGV4IDlhOTk4M2YuLmMyMzVhOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHYvaHZfdXRpbHNfdHJhbnNwb3J0LmMKKysrIGIvZHJpdmVycy9odi9odl91dGlsc190cmFuc3BvcnQuYwpAQCAtNzIsNiArNzIsMTAgQEAKIAlodnQtPm91dG1zZyA9IE5VTEw7CiAJaHZ0LT5vdXRtc2dfbGVuID0gMDsKIAorCWlmIChodnQtPm9uX3JlYWQpCisJCWh2dC0+b25fcmVhZCgpOworCWh2dC0+b25fcmVhZCA9IE5VTEw7CisKIG91dF91bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZodnQtPmxvY2spOwogCXJldHVybiByZXQ7CkBAIC0yMTksNyArMjIzLDggQEAKIAltdXRleF91bmxvY2soJmh2dC0+bG9jayk7CiB9CiAKLWludCBodnV0aWxfdHJhbnNwb3J0X3NlbmQoc3RydWN0IGh2dXRpbF90cmFuc3BvcnQgKmh2dCwgdm9pZCAqbXNnLCBpbnQgbGVuKQoraW50IGh2dXRpbF90cmFuc3BvcnRfc2VuZChzdHJ1Y3QgaHZ1dGlsX3RyYW5zcG9ydCAqaHZ0LCB2b2lkICptc2csIGludCBsZW4sCisJCQkgIHZvaWQgKCpvbl9yZWFkX2NiKSh2b2lkKSkKIHsKIAlzdHJ1Y3QgY25fbXNnICpjbl9tc2c7CiAJaW50IHJldCA9IDA7CkBAIC0yMzcsNiArMjQyLDEzIEBACiAJCW1lbWNweShjbl9tc2ctPmRhdGEsIG1zZywgbGVuKTsKIAkJcmV0ID0gY25fbmV0bGlua19zZW5kKGNuX21zZywgMCwgMCwgR0ZQX0FUT01JQyk7CiAJCWtmcmVlKGNuX21zZyk7CisJCS8qCisJCSAqIFdlIGRvbid0IGtub3cgd2hlbiBuZXRsaW5rIG1lc3NhZ2VzIGFyZSBkZWxpdmVyZWQgYnV0IHVubGlrZQorCQkgKiBpbiBDSEFSREVWIG1vZGUgd2UncmUgbm90IGJsb2NrZWQgYW5kIHdlIGNhbiBzZW5kIG5leHQKKwkJICogbWVzc2FnZXMgcmlnaHQgYXdheS4KKwkJICovCisJCWlmIChvbl9yZWFkX2NiKQorCQkJb25fcmVhZF9jYigpOwogCQlyZXR1cm4gcmV0OwogCX0KIAkvKiBIVlVUSUxfVFJBTlNQT1JUX0NIQVJERVYgKi8KQEAgLTI1NSw2ICsyNjcsNyBAQAogCWlmIChodnQtPm91dG1zZykgewogCQltZW1jcHkoaHZ0LT5vdXRtc2csIG1zZywgbGVuKTsKIAkJaHZ0LT5vdXRtc2dfbGVuID0gbGVuOworCQlodnQtPm9uX3JlYWQgPSBvbl9yZWFkX2NiOwogCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmh2dC0+b3V0bXNnX3EpOwogCX0gZWxzZQogCQlyZXQgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9odi9odl91dGlsc190cmFuc3BvcnQuaCBiL2RyaXZlcnMvaHYvaHZfdXRpbHNfdHJhbnNwb3J0LmgKaW5kZXggMDYyNTRhMS4uZDk4ZjUyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9odi9odl91dGlsc190cmFuc3BvcnQuaAorKysgYi9kcml2ZXJzL2h2L2h2X3V0aWxzX3RyYW5zcG9ydC5oCkBAIC0zNiw2ICszNiw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OyAgICAgICAgICAgICAgLyogaHZ0X2xpc3QgKi8KIAlpbnQgKCpvbl9tc2cpKHZvaWQgKiwgaW50KTsgICAgICAgICAvKiBjYWxsYmFjayBvbiBuZXcgdXNlciBtZXNzYWdlICovCiAJdm9pZCAoKm9uX3Jlc2V0KSh2b2lkKTsgICAgICAgICAgICAgLyogY2FsbGJhY2sgd2hlbiB1c2Vyc3BhY2UgZHJvcHMgKi8KKwl2b2lkICgqb25fcmVhZCkodm9pZCk7ICAgICAgICAgICAgICAvKiBjYWxsYmFjayBvbiBtZXNzYWdlIHJlYWQgKi8KIAl1OCAqb3V0bXNnOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtZXNzYWdlIHRvIHRoZSB1c2Vyc3BhY2UgKi8KIAlpbnQgb3V0bXNnX2xlbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdHMgbGVuZ3RoICovCiAJd2FpdF9xdWV1ZV9oZWFkX3Qgb3V0bXNnX3E7ICAgICAgICAgLyogcG9sbC9yZWFkIHdhaXQgcXVldWUgKi8KQEAgLTQ2LDcgKzQ3LDggQEAKIAkJCQkJICAgICAgIHUzMiBjbl9pZHgsIHUzMiBjbl92YWwsCiAJCQkJCSAgICAgICBpbnQgKCpvbl9tc2cpKHZvaWQgKiwgaW50KSwKIAkJCQkJICAgICAgIHZvaWQgKCpvbl9yZXNldCkodm9pZCkpOwotaW50IGh2dXRpbF90cmFuc3BvcnRfc2VuZChzdHJ1Y3QgaHZ1dGlsX3RyYW5zcG9ydCAqaHZ0LCB2b2lkICptc2csIGludCBsZW4pOworaW50IGh2dXRpbF90cmFuc3BvcnRfc2VuZChzdHJ1Y3QgaHZ1dGlsX3RyYW5zcG9ydCAqaHZ0LCB2b2lkICptc2csIGludCBsZW4sCisJCQkgIHZvaWQgKCpvbl9yZWFkX2NiKSh2b2lkKSk7CiB2b2lkIGh2dXRpbF90cmFuc3BvcnRfZGVzdHJveShzdHJ1Y3QgaHZ1dGlsX3RyYW5zcG9ydCAqaHZ0KTsKIAogI2VuZGlmIC8qIF9IVl9VVElMU19UUkFOU1BPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9odi9oeXBlcnZfdm1idXMuaCBiL2RyaXZlcnMvaHYvaHlwZXJ2X3ZtYnVzLmgKaW5kZXggNzE4YjVjNy4uYTViNDQ0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9odi9oeXBlcnZfdm1idXMuaAorKysgYi9kcml2ZXJzL2h2L2h5cGVydl92bWJ1cy5oCkBAIC00OTUsNyArNDk1LDcgQEAKIAogZXh0ZXJuIGludCBodl9pbml0KHZvaWQpOwogCi1leHRlcm4gdm9pZCBodl9jbGVhbnVwKHZvaWQpOworZXh0ZXJuIHZvaWQgaHZfY2xlYW51cChib29sIGNyYXNoKTsKIAogZXh0ZXJuIGludCBodl9wb3N0X21lc3NhZ2UodW5pb24gaHZfY29ubmVjdGlvbl9pZCBjb25uZWN0aW9uX2lkLAogCQkJIGVudW0gaHZfbWVzc2FnZV90eXBlIG1lc3NhZ2VfdHlwZSwKQEAgLTUyMiwxNCArNTIyLDE1IEBACiAvKiBJbnRlcmZhY2UgKi8KIAogCi1pbnQgaHZfcmluZ2J1ZmZlcl9pbml0KHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8sIHZvaWQgKmJ1ZmZlciwKLQkJICAgdTMyIGJ1Zmxlbik7CitpbnQgaHZfcmluZ2J1ZmZlcl9pbml0KHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8sCisJCSAgICAgICBzdHJ1Y3QgcGFnZSAqcGFnZXMsIHUzMiBwYWdlY250KTsKIAogdm9pZCBodl9yaW5nYnVmZmVyX2NsZWFudXAoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJpbmdfaW5mbyk7CiAKIGludCBodl9yaW5nYnVmZmVyX3dyaXRlKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8sCiAJCSAgICBzdHJ1Y3Qga3ZlYyAqa3ZfbGlzdCwKLQkJICAgIHUzMiBrdl9jb3VudCwgYm9vbCAqc2lnbmFsLCBib29sIGxvY2spOworCQkgICAgdTMyIGt2X2NvdW50LCBib29sICpzaWduYWwsIGJvb2wgbG9jaywKKwkJICAgIGVudW0gaHZfc2lnbmFsX3BvbGljeSBwb2xpY3kpOwogCiBpbnQgaHZfcmluZ2J1ZmZlcl9yZWFkKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICppbnJpbmdfaW5mbywKIAkJICAgICAgIHZvaWQgKmJ1ZmZlciwgdTMyIGJ1ZmxlbiwgdTMyICpidWZmZXJfYWN0dWFsX2xlbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHYvcmluZ19idWZmZXIuYyBiL2RyaXZlcnMvaHYvcmluZ19idWZmZXIuYwppbmRleCBmZTU4NmJmLi4wODA0M2RhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h2L3JpbmdfYnVmZmVyLmMKKysrIGIvZHJpdmVycy9odi9yaW5nX2J1ZmZlci5jCkBAIC0yNyw2ICsyNyw4IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9oeXBlcnYuaD4KICNpbmNsdWRlIDxsaW51eC91aW8uaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSAiaHlwZXJ2X3ZtYnVzLmgiCiAKQEAgLTY2LDEyICs2OCwyMCBAQAogICoJICAgYXJyaXZlZC4KICAqLwogCi1zdGF0aWMgYm9vbCBodl9uZWVkX3RvX3NpZ25hbCh1MzIgb2xkX3dyaXRlLCBzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmJpKQorc3RhdGljIGJvb2wgaHZfbmVlZF90b19zaWduYWwodTMyIG9sZF93cml0ZSwgc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJiaSwKKwkJCSAgICAgIGVudW0gaHZfc2lnbmFsX3BvbGljeSBwb2xpY3kpCiB7CiAJdmlydF9tYigpOwogCWlmIChSRUFEX09OQ0UocmJpLT5yaW5nX2J1ZmZlci0+aW50ZXJydXB0X21hc2spKQogCQlyZXR1cm4gZmFsc2U7CiAKKwkvKgorCSAqIFdoZW4gdGhlIGNsaWVudCB3YW50cyB0byBjb250cm9sIHNpZ25hbGluZywKKwkgKiB3ZSBvbmx5IGhvbm91ciB0aGUgaG9zdCBpbnRlcnJ1cHQgbWFzay4KKwkgKi8KKwlpZiAocG9saWN5ID09IEhWX1NJR05BTF9QT0xJQ1lfRVhQTElDSVQpCisJCXJldHVybiB0cnVlOworCiAJLyogY2hlY2sgaW50ZXJydXB0X21hc2sgYmVmb3JlIHJlYWRfaW5kZXggKi8KIAl2aXJ0X3JtYigpOwogCS8qCkBAIC0xNjIsMTggKzE3Miw3IEBACiAJdm9pZCAqcmluZ19idWZmZXIgPSBodl9nZXRfcmluZ19idWZmZXIocmluZ19pbmZvKTsKIAl1MzIgcmluZ19idWZmZXJfc2l6ZSA9IGh2X2dldF9yaW5nX2J1ZmZlcnNpemUocmluZ19pbmZvKTsKIAotCXUzMiBmcmFnX2xlbjsKLQotCS8qIHdyYXAtYXJvdW5kIGRldGVjdGVkIGF0IHRoZSBzcmMgKi8KLQlpZiAoZGVzdGxlbiA+IHJpbmdfYnVmZmVyX3NpemUgLSBzdGFydF9yZWFkX29mZnNldCkgewotCQlmcmFnX2xlbiA9IHJpbmdfYnVmZmVyX3NpemUgLSBzdGFydF9yZWFkX29mZnNldDsKLQotCQltZW1jcHkoZGVzdCwgcmluZ19idWZmZXIgKyBzdGFydF9yZWFkX29mZnNldCwgZnJhZ19sZW4pOwotCQltZW1jcHkoZGVzdCArIGZyYWdfbGVuLCByaW5nX2J1ZmZlciwgZGVzdGxlbiAtIGZyYWdfbGVuKTsKLQl9IGVsc2UKLQotCQltZW1jcHkoZGVzdCwgcmluZ19idWZmZXIgKyBzdGFydF9yZWFkX29mZnNldCwgZGVzdGxlbik7Ci0KKwltZW1jcHkoZGVzdCwgcmluZ19idWZmZXIgKyBzdGFydF9yZWFkX29mZnNldCwgZGVzdGxlbik7CiAKIAlzdGFydF9yZWFkX29mZnNldCArPSBkZXN0bGVuOwogCXN0YXJ0X3JlYWRfb2Zmc2V0ICU9IHJpbmdfYnVmZmVyX3NpemU7CkBAIC0xOTQsMTUgKzE5Myw4IEBACiB7CiAJdm9pZCAqcmluZ19idWZmZXIgPSBodl9nZXRfcmluZ19idWZmZXIocmluZ19pbmZvKTsKIAl1MzIgcmluZ19idWZmZXJfc2l6ZSA9IGh2X2dldF9yaW5nX2J1ZmZlcnNpemUocmluZ19pbmZvKTsKLQl1MzIgZnJhZ19sZW47CiAKLQkvKiB3cmFwLWFyb3VuZCBkZXRlY3RlZCEgKi8KLQlpZiAoc3JjbGVuID4gcmluZ19idWZmZXJfc2l6ZSAtIHN0YXJ0X3dyaXRlX29mZnNldCkgewotCQlmcmFnX2xlbiA9IHJpbmdfYnVmZmVyX3NpemUgLSBzdGFydF93cml0ZV9vZmZzZXQ7Ci0JCW1lbWNweShyaW5nX2J1ZmZlciArIHN0YXJ0X3dyaXRlX29mZnNldCwgc3JjLCBmcmFnX2xlbik7Ci0JCW1lbWNweShyaW5nX2J1ZmZlciwgc3JjICsgZnJhZ19sZW4sIHNyY2xlbiAtIGZyYWdfbGVuKTsKLQl9IGVsc2UKLQkJbWVtY3B5KHJpbmdfYnVmZmVyICsgc3RhcnRfd3JpdGVfb2Zmc2V0LCBzcmMsIHNyY2xlbik7CisJbWVtY3B5KHJpbmdfYnVmZmVyICsgc3RhcnRfd3JpdGVfb2Zmc2V0LCBzcmMsIHNyY2xlbik7CiAKIAlzdGFydF93cml0ZV9vZmZzZXQgKz0gc3JjbGVuOwogCXN0YXJ0X3dyaXRlX29mZnNldCAlPSByaW5nX2J1ZmZlcl9zaXplOwpAQCAtMjM1LDIyICsyMjcsNDYgQEAKIAogLyogSW5pdGlhbGl6ZSB0aGUgcmluZyBidWZmZXIuICovCiBpbnQgaHZfcmluZ2J1ZmZlcl9pbml0KHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8sCi0JCSAgIHZvaWQgKmJ1ZmZlciwgdTMyIGJ1ZmxlbikKKwkJICAgICAgIHN0cnVjdCBwYWdlICpwYWdlcywgdTMyIHBhZ2VfY250KQogewotCWlmIChzaXplb2Yoc3RydWN0IGh2X3JpbmdfYnVmZmVyKSAhPSBQQUdFX1NJWkUpCi0JCXJldHVybiAtRUlOVkFMOworCWludCBpOworCXN0cnVjdCBwYWdlICoqcGFnZXNfd3JhcGFyb3VuZDsKKworCUJVSUxEX0JVR19PTigoc2l6ZW9mKHN0cnVjdCBodl9yaW5nX2J1ZmZlcikgIT0gUEFHRV9TSVpFKSk7CiAKIAltZW1zZXQocmluZ19pbmZvLCAwLCBzaXplb2Yoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8pKTsKIAotCXJpbmdfaW5mby0+cmluZ19idWZmZXIgPSAoc3RydWN0IGh2X3JpbmdfYnVmZmVyICopYnVmZmVyOworCS8qCisJICogRmlyc3QgcGFnZSBob2xkcyBzdHJ1Y3QgaHZfcmluZ19idWZmZXIsIGRvIHdyYXBhcm91bmQgbWFwcGluZyBmb3IKKwkgKiB0aGUgcmVzdC4KKwkgKi8KKwlwYWdlc193cmFwYXJvdW5kID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiAocGFnZV9jbnQgKiAyIC0gMSksCisJCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYWdlc193cmFwYXJvdW5kKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBhZ2VzX3dyYXBhcm91bmRbMF0gPSBwYWdlczsKKwlmb3IgKGkgPSAwOyBpIDwgMiAqIChwYWdlX2NudCAtIDEpOyBpKyspCisJCXBhZ2VzX3dyYXBhcm91bmRbaSArIDFdID0gJnBhZ2VzW2kgJSAocGFnZV9jbnQgLSAxKSArIDFdOworCisJcmluZ19pbmZvLT5yaW5nX2J1ZmZlciA9IChzdHJ1Y3QgaHZfcmluZ19idWZmZXIgKikKKwkJdm1hcChwYWdlc193cmFwYXJvdW5kLCBwYWdlX2NudCAqIDIgLSAxLCBWTV9NQVAsIFBBR0VfS0VSTkVMKTsKKworCWtmcmVlKHBhZ2VzX3dyYXBhcm91bmQpOworCisKKwlpZiAoIXJpbmdfaW5mby0+cmluZ19idWZmZXIpCisJCXJldHVybiAtRU5PTUVNOworCiAJcmluZ19pbmZvLT5yaW5nX2J1ZmZlci0+cmVhZF9pbmRleCA9CiAJCXJpbmdfaW5mby0+cmluZ19idWZmZXItPndyaXRlX2luZGV4ID0gMDsKIAogCS8qIFNldCB0aGUgZmVhdHVyZSBiaXQgZm9yIGVuYWJsaW5nIGZsb3cgY29udHJvbC4gKi8KIAlyaW5nX2luZm8tPnJpbmdfYnVmZmVyLT5mZWF0dXJlX2JpdHMudmFsdWUgPSAxOwogCi0JcmluZ19pbmZvLT5yaW5nX3NpemUgPSBidWZsZW47Ci0JcmluZ19pbmZvLT5yaW5nX2RhdGFzaXplID0gYnVmbGVuIC0gc2l6ZW9mKHN0cnVjdCBodl9yaW5nX2J1ZmZlcik7CisJcmluZ19pbmZvLT5yaW5nX3NpemUgPSBwYWdlX2NudCA8PCBQQUdFX1NISUZUOworCXJpbmdfaW5mby0+cmluZ19kYXRhc2l6ZSA9IHJpbmdfaW5mby0+cmluZ19zaXplIC0KKwkJc2l6ZW9mKHN0cnVjdCBodl9yaW5nX2J1ZmZlcik7CiAKIAlzcGluX2xvY2tfaW5pdCgmcmluZ19pbmZvLT5yaW5nX2xvY2spOwogCkBAIC0yNjAsMTEgKzI3NiwxMyBAQAogLyogQ2xlYW51cCB0aGUgcmluZyBidWZmZXIuICovCiB2b2lkIGh2X3JpbmdidWZmZXJfY2xlYW51cChzdHJ1Y3QgaHZfcmluZ19idWZmZXJfaW5mbyAqcmluZ19pbmZvKQogeworCXZ1bm1hcChyaW5nX2luZm8tPnJpbmdfYnVmZmVyKTsKIH0KIAogLyogV3JpdGUgdG8gdGhlIHJpbmcgYnVmZmVyLiAqLwogaW50IGh2X3JpbmdidWZmZXJfd3JpdGUoc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKm91dHJpbmdfaW5mbywKLQkJICAgIHN0cnVjdCBrdmVjICprdl9saXN0LCB1MzIga3ZfY291bnQsIGJvb2wgKnNpZ25hbCwgYm9vbCBsb2NrKQorCQkgICAgc3RydWN0IGt2ZWMgKmt2X2xpc3QsIHUzMiBrdl9jb3VudCwgYm9vbCAqc2lnbmFsLCBib29sIGxvY2ssCisJCSAgICBlbnVtIGh2X3NpZ25hbF9wb2xpY3kgcG9saWN5KQogewogCWludCBpID0gMDsKIAl1MzIgYnl0ZXNfYXZhaWxfdG93cml0ZTsKQEAgLTMyNiw3ICszNDQsNyBAQAogCWlmIChsb2NrKQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvdXRyaW5nX2luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOwogCi0JKnNpZ25hbCA9IGh2X25lZWRfdG9fc2lnbmFsKG9sZF93cml0ZSwgb3V0cmluZ19pbmZvKTsKKwkqc2lnbmFsID0gaHZfbmVlZF90b19zaWduYWwob2xkX3dyaXRlLCBvdXRyaW5nX2luZm8sIHBvbGljeSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHYvdm1idXNfZHJ2LmMgYi9kcml2ZXJzL2h2L3ZtYnVzX2Rydi5jCmluZGV4IGU4MmY3ZTEuLmEyNTllMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHYvdm1idXNfZHJ2LmMKKysrIGIvZHJpdmVycy9odi92bWJ1c19kcnYuYwpAQCAtMTA1LDggKzEwNSw4IEBACiAKIHN0YXRpYyBjb25zdCBjaGFyICpmYl9tbWlvX25hbWUgPSAiZmJfcmFuZ2UiOwogc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqZmJfbW1pbzsKLXN0cnVjdCByZXNvdXJjZSAqaHlwZXJ2X21taW87Ci1ERUZJTkVfU0VNQVBIT1JFKGh5cGVydl9tbWlvX2xvY2spOworc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqaHlwZXJ2X21taW87CitzdGF0aWMgREVGSU5FX1NFTUFQSE9SRShoeXBlcnZfbW1pb19sb2NrKTsKIAogc3RhdGljIGludCB2bWJ1c19leGlzdHModm9pZCkKIHsKQEAgLTg3NCw3ICs4NzQsNyBAQAogCWJ1c191bnJlZ2lzdGVyKCZodl9idXMpOwogCiBlcnJfY2xlYW51cDoKLQlodl9jbGVhbnVwKCk7CisJaHZfY2xlYW51cChmYWxzZSk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtOTYxLDggKzk2MSw4IEBACiB7CiAJaW50IHJldCA9IDA7CiAKLQlkZXZfc2V0X25hbWUoJmNoaWxkX2RldmljZV9vYmotPmRldmljZSwgInZtYnVzXyVkIiwKLQkJICAgICBjaGlsZF9kZXZpY2Vfb2JqLT5jaGFubmVsLT5pZCk7CisJZGV2X3NldF9uYW1lKCZjaGlsZF9kZXZpY2Vfb2JqLT5kZXZpY2UsICJ2bWJ1cy0lcFVsIiwKKwkJICAgICBjaGlsZF9kZXZpY2Vfb2JqLT5jaGFubmVsLT5vZmZlcm1zZy5vZmZlci5pZl9pbnN0YW5jZS5iKTsKIAogCWNoaWxkX2RldmljZV9vYmotPmRldmljZS5idXMgPSAmaHZfYnVzOwogCWNoaWxkX2RldmljZV9vYmotPmRldmljZS5wYXJlbnQgPSAmaHZfYWNwaV9kZXYtPmRldjsKQEAgLTEzMjYsNyArMTMyNiw3IEBACiAJdm1idXNfaW5pdGlhdGVfdW5sb2FkKGZhbHNlKTsKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKIAkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgaHZfc3luaWNfY2xlYW51cCwgTlVMTCwgMSk7Ci0JaHZfY2xlYW51cCgpOworCWh2X2NsZWFudXAoZmFsc2UpOwogfTsKIAogc3RhdGljIHZvaWQgaHZfY3Jhc2hfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKQEAgLTEzMzgsNyArMTMzOCw3IEBACiAJICogZm9yIGtkdW1wLgogCSAqLwogCWh2X3N5bmljX2NsZWFudXAoTlVMTCk7Ci0JaHZfY2xlYW51cCgpOworCWh2X2NsZWFudXAodHJ1ZSk7CiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBodl9hY3BpX2luaXQodm9pZCkKQEAgLTEzOTgsNyArMTM5OCw3IEBACiAJCQkJCQkgJmh5cGVydl9wYW5pY19ibG9jayk7CiAJfQogCWJ1c191bnJlZ2lzdGVyKCZodl9idXMpOwotCWh2X2NsZWFudXAoKTsKKwlodl9jbGVhbnVwKGZhbHNlKTsKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewogCQl0YXNrbGV0X2tpbGwoaHZfY29udGV4dC5ldmVudF9kcGNbY3B1XSk7CiAJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIGh2X3N5bmljX2NsZWFudXAsIE5VTEwsIDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9LY29uZmlnIGIvZHJpdmVycy9od21vbi9LY29uZmlnCmluZGV4IGVhZjJmOTEuLjQ1Y2VmM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vS2NvbmZpZworKysgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcKQEAgLTk2OSw3ICs5NjksNiBAQAogY29uZmlnIFNFTlNPUlNfTE03NQogCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzUgYW5kIGNvbXBhdGlibGVzIgogCWRlcGVuZHMgb24gSTJDCi0JZGVwZW5kcyBvbiBUSEVSTUFMIHx8ICFUSEVSTUFMX09GCiAJc2VsZWN0IFJFR01BUF9JMkMKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3Igb25lIGNvbW1vbiB0eXBlIG9mCkBAIC0xMTE5LDYgKzExMTgsNyBAQAogY29uZmlnIFNFTlNPUlNfTE05NTI0NQogCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNOTUyNDUgYW5kIGNvbXBhdGlibGVzIgogCWRlcGVuZHMgb24gSTJDCisJc2VsZWN0IFJFR01BUF9JMkMKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTE05NTIzNSBhbmQgTE05NTI0NQogCSAgdGVtcGVyYXR1cmUgc2Vuc29yIGNoaXBzLgpAQCAtMTU3Miw3ICsxNTcyLDYgQEAKIGNvbmZpZyBTRU5TT1JTX1RNUDEwMgogCXRyaXN0YXRlICJUZXhhcyBJbnN0cnVtZW50cyBUTVAxMDIiCiAJZGVwZW5kcyBvbiBJMkMKLQlkZXBlbmRzIG9uIFRIRVJNQUwgfHwgIVRIRVJNQUxfT0YKIAlzZWxlY3QgUkVHTUFQX0kyQwogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBUZXhhcyBJbnN0cnVtZW50cyBUTVAxMDIKQEAgLTE4MjMsNiArMTgyMiwxMyBAQAogCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIFVsdHJhNDUgd29ya3N0YXRpb24gZW52aXJvbm1lbnRhbAogCSAgc2Vuc29ycy4KIAorY29uZmlnIFNFTlNPUlNfWEdFTkUKKwl0cmlzdGF0ZSAiQVBNIFgtR2VuZSBTb0MgaGFyZHdhcmUgbW9uaXRvcmluZyBkcml2ZXIiCisJZGVwZW5kcyBvbiBYR0VORV9TTElNUFJPX01CT1ggfHwgUENDCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSB0ZW1wZXJhdHVyZQorCSAgYW5kIHBvd2VyIHNlbnNvcnMgZm9yIEFQTSBYLUdlbmUgU29DLgorCiBpZiBBQ1BJCiAKIGNvbW1lbnQgIkFDUEkgZHJpdmVycyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCmluZGV4IGZlODdkMjguLmFlY2Y0YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9od21vbi9NYWtlZmlsZQpAQCAtMTY1LDYgKzE2NSw3IEBACiBvYmotJChDT05GSUdfU0VOU09SU19XODNMNzg2TkcpCSs9IHc4M2w3ODZuZy5vCiBvYmotJChDT05GSUdfU0VOU09SU19XTTgzMVgpCSs9IHdtODMxeC1od21vbi5vCiBvYmotJChDT05GSUdfU0VOU09SU19XTTgzNTApCSs9IHdtODM1MC1od21vbi5vCitvYmotJChDT05GSUdfU0VOU09SU19YR0VORSkJKz0geGdlbmUtaHdtb24ubwogCiBvYmotJChDT05GSUdfUE1CVVMpCQkrPSBwbWJ1cy8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZHQ3NDExLmMgYi9kcml2ZXJzL2h3bW9uL2FkdDc0MTEuYwppbmRleCBmYzFlNjVhLi44MTJmYmMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FkdDc0MTEuYworKysgYi9kcml2ZXJzL2h3bW9uL2FkdDc0MTEuYwpAQCAtNyw4ICs3LDcgQEAKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqICBUT0RPOiBTUEksIHN1cHBvcnQgZm9yIGV4dGVybmFsIHRlbXBlcmF0dXJlIHNlbnNvcgotICoJICB1c2UgcG93ZXItZG93biBtb2RlIGZvciBzdXNwZW5kPywgaW50ZXJydXB0IGhhbmRsaW5nPworICogIFRPRE86IFNQSSwgdXNlIHBvd2VyLWRvd24gbW9kZSBmb3Igc3VzcGVuZD8sIGludGVycnVwdCBoYW5kbGluZz8KICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0zMSw2ICszMCw3IEBACiAjZGVmaW5lIEFEVDc0MTFfUkVHX0NGRzEJCQkweDE4CiAjZGVmaW5lIEFEVDc0MTFfQ0ZHMV9TVEFSVF9NT05JVE9SCQkoMSA8PCAwKQogI2RlZmluZSBBRFQ3NDExX0NGRzFfUkVTRVJWRURfQklUMQkJKDEgPDwgMSkKKyNkZWZpbmUgQURUNzQxMV9DRkcxX0VYVF9URE0JCQkoMSA8PCAyKQogI2RlZmluZSBBRFQ3NDExX0NGRzFfUkVTRVJWRURfQklUMwkJKDEgPDwgMykKIAogI2RlZmluZSBBRFQ3NDExX1JFR19DRkcyCQkJMHgxOQpAQCAtNTcsNiArNTcsNyBAQAogCXVuc2lnbmVkIGxvbmcgbmV4dF91cGRhdGU7CiAJaW50IHZyZWZfY2FjaGVkOwogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJYm9vbCB1c2VfZXh0X3RlbXA7CiB9OwogCiAvKgpAQCAtMTI3LDExICsxMjgsMjAgQEAKIHN0YXRpYyBzc2l6ZV90IGFkdDc0MTFfc2hvd190ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CisJaW50IG5yID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKIAlzdHJ1Y3QgYWR0NzQxMV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKLQlpbnQgdmFsID0gYWR0NzQxMV9yZWFkXzEwX2JpdChjbGllbnQsIEFEVDc0MTFfUkVHX0lOVF9URU1QX1ZERF9MU0IsCi0JCQlBRFQ3NDExX1JFR19JTlRfVEVNUF9NU0IsIDApOworCWludCB2YWw7CisJc3RydWN0IHsKKwkJdTggbG93OworCQl1OCBoaWdoOworCX0gcmVnWzJdID0geworCQl7IEFEVDc0MTFfUkVHX0lOVF9URU1QX1ZERF9MU0IsIEFEVDc0MTFfUkVHX0lOVF9URU1QX01TQiB9LAorCQl7IEFEVDc0MTFfUkVHX0VYVF9URU1QX0FJTjE0X0xTQiwKKwkJICBBRFQ3NDExX1JFR19FWFRfVEVNUF9BSU4xX01TQiB9LAorCX07CiAKKwl2YWwgPSBhZHQ3NDExX3JlYWRfMTBfYml0KGNsaWVudCwgcmVnW25yXS5sb3csIHJlZ1tucl0uaGlnaCwgMCk7CiAJaWYgKHZhbCA8IDApCiAJCXJldHVybiB2YWw7CiAKQEAgLTIxOCwxMSArMjI4LDEzIEBACiAJcmV0dXJuIHJldCA8IDAgPyByZXQgOiBjb3VudDsKIH0KIAorCiAjZGVmaW5lIEFEVDc0MTFfQklUX0FUVFIoX19uYW1lLCBfX3JlZywgX19iaXQpIFwKIAlTRU5TT1JfREVWSUNFX0FUVFJfMihfX25hbWUsIFNfSVJVR08gfCBTX0lXVVNSLCBhZHQ3NDExX3Nob3dfYml0LCBcCiAJYWR0NzQxMV9zZXRfYml0LCBfX2JpdCwgX19yZWcpCiAKLXN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgYWR0NzQxMV9zaG93X3RlbXAsIE5VTEwpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgYWR0NzQxMV9zaG93X3RlbXAsIE5VTEwsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9pbnB1dCwgU19JUlVHTywgYWR0NzQxMV9zaG93X3RlbXAsIE5VTEwsIDEpOwogc3RhdGljIERFVklDRV9BVFRSKGluMF9pbnB1dCwgU19JUlVHTywgYWR0NzQxMV9zaG93X3ZkZCwgTlVMTCk7CiBzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMV9pbnB1dCwgU19JUlVHTywgYWR0NzQxMV9zaG93X2lucHV0LCBOVUxMLCAwKTsKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4yX2lucHV0LCBTX0lSVUdPLCBhZHQ3NDExX3Nob3dfaW5wdXQsIE5VTEwsIDEpOwpAQCAtMjM3LDcgKzI0OSw4IEBACiBzdGF0aWMgQURUNzQxMV9CSVRfQVRUUihhZGNfcmVmX3ZkZCwgQURUNzQxMV9SRUdfQ0ZHMywgQURUNzQxMV9DRkczX1JFRl9WREQpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWR0NzQxMV9hdHRyc1tdID0gewotCSZkZXZfYXR0cl90ZW1wMV9pbnB1dC5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJmRldl9hdHRyX2luMF9pbnB1dC5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfaW4xX2lucHV0LmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKQEAgLTI1Myw3ICsyNjYsMjcgQEAKIAlOVUxMCiB9OwogCi1BVFRSSUJVVEVfR1JPVVBTKGFkdDc0MTEpOworc3RhdGljIHVtb2RlX3QgYWR0NzQxMV9hdHRyc192aXNpYmxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgaW50IGluZGV4KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgYWR0NzQxMV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJYm9vbCB2aXNpYmxlID0gdHJ1ZTsKKworCWlmIChhdHRyID09ICZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfaW5wdXQuZGV2X2F0dHIuYXR0cikKKwkJdmlzaWJsZSA9IGRhdGEtPnVzZV9leHRfdGVtcDsKKwllbHNlIGlmIChhdHRyID09ICZzZW5zb3JfZGV2X2F0dHJfaW4xX2lucHV0LmRldl9hdHRyLmF0dHIgfHwKKwkJIGF0dHIgPT0gJnNlbnNvcl9kZXZfYXR0cl9pbjJfaW5wdXQuZGV2X2F0dHIuYXR0cikKKwkJdmlzaWJsZSA9ICFkYXRhLT51c2VfZXh0X3RlbXA7CisKKwlyZXR1cm4gdmlzaWJsZSA/IGF0dHItPm1vZGUgOiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZHQ3NDExX2dyb3VwID0geworCS5hdHRycyA9IGFkdDc0MTFfYXR0cnMsCisJLmlzX3Zpc2libGUgPSBhZHQ3NDExX2F0dHJzX3Zpc2libGUsCit9OworX19BVFRSSUJVVEVfR1JPVVBTKGFkdDc0MTEpOwogCiBzdGF0aWMgaW50IGFkdDc0MTFfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkgIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKQEAgLTMwOSw2ICszNDIsOCBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCisJZGF0YS0+dXNlX2V4dF90ZW1wID0gcmV0ICYgQURUNzQxMV9DRkcxX0VYVF9URE07CisKIAkvKgogCSAqIFdlIG11c3Qgb25seSB3cml0ZSB6ZXJvIHRvIGJpdCAxIGFuZCBvbmx5IG9uZSB0byBiaXQgMyBhY2NvcmRpbmcgdG8KIAkgKiB0aGUgZGF0YXNoZWV0LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZHQ3NDcwLmMgYi9kcml2ZXJzL2h3bW9uL2FkdDc0NzAuYwppbmRleCBmNWRhMzlhLi42ZTYwY2E1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FkdDc0NzAuYworKysgYi9kcml2ZXJzL2h3bW9uL2FkdDc0NzAuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3V0aWxfbWFjcm9zLmg+CiAKIC8qIEFkZHJlc3NlcyB0byBzY2FuICovCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDJDLCAweDJFLCAweDJGLCBJMkNfQ0xJRU5UX0VORCB9OwpAQCAtODMsNiArODQsNyBAQAogI2RlZmluZSBBRFQ3NDcwX1JFR19QV01fTUlOX01BWF9BRERSCQkweDZECiAjZGVmaW5lIEFEVDc0NzBfUkVHX1BXTV9URU1QX01JTl9CQVNFX0FERFIJMHg2RQogI2RlZmluZSBBRFQ3NDcwX1JFR19QV01fVEVNUF9NSU5fTUFYX0FERFIJMHg3MQorI2RlZmluZSBBRFQ3NDcwX1JFR19DRkdfMgkJCTB4NzQKICNkZWZpbmUgQURUNzQ3MF9SRUdfQUNPVVNUSUNTMTIJCQkweDc1CiAjZGVmaW5lIEFEVDc0NzBfUkVHX0FDT1VTVElDUzM0CQkJMHg3NgogI2RlZmluZSBBRFQ3NDcwX1JFR19ERVZJQ0UJCQkweDNECkBAIC0xNDIsNiArMTQ0LDExIEBACiAjZGVmaW5lIEZBTl9QRVJJT0RfSU5WQUxJRAk2NTUzNQogI2RlZmluZSBGQU5fREFUQV9WQUxJRCh4KQkoKHgpICYmICh4KSAhPSBGQU5fUEVSSU9EX0lOVkFMSUQpCiAKKy8qIENvbmZpZyByZWdpc3RlcnMgMSBhbmQgMiBpbmNsdWRlIGZpZWxkcyBmb3Igc2VsZWN0aW5nIHRoZSBQV00gZnJlcXVlbmN5ICovCisjZGVmaW5lIEFEVDc0NzBfQ0ZHX0xGCQkweDQwCisjZGVmaW5lIEFEVDc0NzBfRlJFUV9NQVNLCTB4NzAKKyNkZWZpbmUgQURUNzQ3MF9GUkVRX1NISUZUCTQKKwogc3RydWN0IGFkdDc0NzBfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudDsKIAlzdHJ1Y3QgbXV0ZXgJCWxvY2s7CkBAIC0xNzAsNyArMTc3LDYgQEAKIAl1OAkJCXB3bV9hdXRvX3RlbXBbQURUNzQ3MF9QV01fQ09VTlRdOwogCiAJc3RydWN0IHRhc2tfc3RydWN0CSphdXRvX3VwZGF0ZTsKLQlzdHJ1Y3QgY29tcGxldGlvbglhdXRvX3VwZGF0ZV9zdG9wOwogCXVuc2lnbmVkIGludAkJYXV0b191cGRhdGVfaW50ZXJ2YWw7CiB9OwogCkBAIC0yNjYsMTIgKzI3MiwxNCBAQAogCQltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKIAkJYWR0NzQ3MF9yZWFkX3RlbXBlcmF0dXJlcyhjbGllbnQsIGRhdGEpOwogCQltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOworCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCiAJCQlicmVhazsKLQkJbXNsZWVwX2ludGVycnVwdGlibGUoZGF0YS0+YXV0b191cGRhdGVfaW50ZXJ2YWwpOworCisJCXNjaGVkdWxlX3RpbWVvdXQobXNlY3NfdG9famlmZmllcyhkYXRhLT5hdXRvX3VwZGF0ZV9pbnRlcnZhbCkpOwogCX0KIAotCWNvbXBsZXRlX2FsbCgmZGF0YS0+YXV0b191cGRhdGVfc3RvcCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUzOCw2ICs1NDYsMjggQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIleFxuIiwgZGF0YS0+YWxhcm1zX21hc2spOwogfQogCitzdGF0aWMgc3NpemVfdCBzZXRfYWxhcm1fbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCSAgICAgIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgYWR0NzQ3MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJbG9uZyBtYXNrOworCisJaWYgKGtzdHJ0b3VsKGJ1ZiwgMCwgJm1hc2spKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChtYXNrICYgfjB4ZmZmZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKwlkYXRhLT5hbGFybXNfbWFzayA9IG1hc2s7CisJYWR0NzQ3MF93cml0ZV93b3JkX2RhdGEoZGF0YS0+Y2xpZW50LCBBRFQ3NDcwX1JFR19BTEFSTTFfTUFTSywgbWFzayk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKwogc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKIAkJCSAgICBjaGFyICpidWYpCkBAIC02ODgsNiArNzE4LDcwIEBACiAJcmV0dXJuIGNvdW50OwogfQogCisvKiBUaGVzZSBhcmUgdGhlIHZhbGlkIFBXTSBmcmVxdWVuY2llcyB0byB0aGUgbmVhcmVzdCBIeiAqLworc3RhdGljIGNvbnN0IGludCBhZHQ3NDcwX2ZyZXFfbWFwW10gPSB7CisJMTEsIDE1LCAyMiwgMjksIDM1LCA0NCwgNTksIDg4LCAxNDAwLCAyMjUwMAorfTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19wd21fZnJlcShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGFkdDc0NzBfZGF0YSAqZGF0YSA9IGFkdDc0NzBfdXBkYXRlX2RldmljZShkZXYpOworCXVuc2lnbmVkIGNoYXIgY2ZnX3JlZ18xOworCXVuc2lnbmVkIGNoYXIgY2ZnX3JlZ18yOworCWludCBpbmRleDsKKworCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCWNmZ19yZWdfMSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIEFEVDc0NzBfUkVHX0NGRyk7CisJY2ZnX3JlZ18yID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgQURUNzQ3MF9SRUdfQ0ZHXzIpOworCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisKKwlpbmRleCA9IChjZmdfcmVnXzIgJiBBRFQ3NDcwX0ZSRVFfTUFTSykgPj4gQURUNzQ3MF9GUkVRX1NISUZUOworCWlmICghKGNmZ19yZWdfMSAmIEFEVDc0NzBfQ0ZHX0xGKSkKKwkJaW5kZXggKz0gODsKKwlpZiAoaW5kZXggPj0gQVJSQVlfU0laRShhZHQ3NDcwX2ZyZXFfbWFwKSkKKwkJaW5kZXggPSBBUlJBWV9TSVpFKGFkdDc0NzBfZnJlcV9tYXApIC0gMTsKKworCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgYWR0NzQ3MF9mcmVxX21hcFtpbmRleF0pOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfcHdtX2ZyZXEoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBhZHQ3NDcwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OworCWxvbmcgZnJlcTsKKwlpbnQgaW5kZXg7CisJaW50IGxvd19mcmVxID0gQURUNzQ3MF9DRkdfTEY7CisJdW5zaWduZWQgY2hhciB2YWw7CisKKwlpZiAoa3N0cnRvbChidWYsIDEwLCAmZnJlcSkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogUm91bmQgdGhlIHVzZXIgdmFsdWUgZ2l2ZW4gdG8gdGhlIGNsb3Nlc3QgYXZhaWxhYmxlIGZyZXF1ZW5jeSAqLworCWluZGV4ID0gZmluZF9jbG9zZXN0KGZyZXEsIGFkdDc0NzBfZnJlcV9tYXAsCisJCQkgICAgIEFSUkFZX1NJWkUoYWR0NzQ3MF9mcmVxX21hcCkpOworCisJaWYgKGluZGV4ID49IDgpIHsKKwkJaW5kZXggLT0gODsKKwkJbG93X2ZyZXEgPSAwOworCX0KKworCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCS8qIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMSAqLworCXZhbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX0NGRyk7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX0NGRywKKwkJCQkgICh2YWwgJiB+QURUNzQ3MF9DRkdfTEYpIHwgbG93X2ZyZXEpOworCS8qIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgMiAqLworCXZhbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEVDc0NzBfUkVHX0NGR18yKTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURUNzQ3MF9SRUdfQ0ZHXzIsCisJCSh2YWwgJiB+QURUNzQ3MF9GUkVRX01BU0spIHwgKGluZGV4IDw8IEFEVDc0NzBfRlJFUV9TSElGVCkpOworCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKIHN0YXRpYyBzc2l6ZV90IHNob3dfcHdtX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCiAJCQkgICAgY2hhciAqYnVmKQpAQCAtOTE4LDcgKzEwMTIsOCBAQAogCQlyZXR1cm4gc3ByaW50ZihidWYsICIwXG4iKTsKIH0KIAotc3RhdGljIERFVklDRV9BVFRSKGFsYXJtX21hc2ssIFNfSVJVR08sIHNob3dfYWxhcm1fbWFzaywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoYWxhcm1fbWFzaywgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfYWxhcm1fbWFzaywKKwkJICAgc2V0X2FsYXJtX21hc2spOwogc3RhdGljIERFVklDRV9BVFRSKG51bV90ZW1wX3NlbnNvcnMsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X251bV90ZW1wX3NlbnNvcnMsCiAJCSAgIHNldF9udW1fdGVtcF9zZW5zb3JzKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihhdXRvX3VwZGF0ZV9pbnRlcnZhbCwgU19JV1VTUiB8IFNfSVJVR08sCkBAIC0xMDM4LDYgKzExMzMsOCBAQAogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd20zLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19wd20sIHNldF9wd20sIDIpOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd200LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19wd20sIHNldF9wd20sIDMpOwogCitzdGF0aWMgREVWSUNFX0FUVFIocHdtMV9mcmVxLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19wd21fZnJlcSwgc2V0X3B3bV9mcmVxKTsKKwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd20xX2F1dG9fcG9pbnQxX3B3bSwgU19JV1VTUiB8IFNfSVJVR08sCiAJCSAgICBzaG93X3B3bV9taW4sIHNldF9wd21fbWluLCAwKTsKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMl9hdXRvX3BvaW50MV9wd20sIFNfSVdVU1IgfCBTX0lSVUdPLApAQCAtMTE1NCw2ICsxMjUxLDcgQEAKIAkmc2Vuc29yX2Rldl9hdHRyX2ZhbjRfYWxhcm0uZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2ZvcmNlX3B3bV9tYXguZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3B3bTEuZGV2X2F0dHIuYXR0ciwKKwkmZGV2X2F0dHJfcHdtMV9mcmVxLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9wd20yLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9wd20zLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9wd200LmRldl9hdHRyLmF0dHIsCkBAIC0xMjU2LDcgKzEzNTQsNiBAQAogCWlmIChJU19FUlIoaHdtb25fZGV2KSkKIAkJcmV0dXJuIFBUUl9FUlIoaHdtb25fZGV2KTsKIAotCWluaXRfY29tcGxldGlvbigmZGF0YS0+YXV0b191cGRhdGVfc3RvcCk7CiAJZGF0YS0+YXV0b191cGRhdGUgPSBrdGhyZWFkX3J1bihhZHQ3NDcwX3VwZGF0ZV90aHJlYWQsIGNsaWVudCwgIiVzIiwKIAkJCQkJZGV2X25hbWUoaHdtb25fZGV2KSk7CiAJaWYgKElTX0VSUihkYXRhLT5hdXRvX3VwZGF0ZSkpIHsKQEAgLTEyNzEsNyArMTM2OCw2IEBACiAJc3RydWN0IGFkdDc0NzBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCiAJa3RocmVhZF9zdG9wKGRhdGEtPmF1dG9fdXBkYXRlKTsKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZkYXRhLT5hdXRvX3VwZGF0ZV9zdG9wKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9kZWxsLXNtbS1od21vbi5jIGIvZHJpdmVycy9od21vbi9kZWxsLXNtbS1od21vbi5jCmluZGV4IGFjZjljMDMuLjM0NzA0YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vZGVsbC1zbW0taHdtb24uYworKysgYi9kcml2ZXJzL2h3bW9uL2RlbGwtc21tLWh3bW9uLmMKQEAgLTIxLDYgKzIxLDcgQEAKIAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtMzYsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogCiAjaW5jbHVkZSA8bGludXgvaThrLmg+CiAKQEAgLTEzNCwxMSArMTM2LDExIEBACiAvKgogICogQ2FsbCB0aGUgU3lzdGVtIE1hbmFnZW1lbnQgTW9kZSBCSU9TLiBDb2RlIHByb3ZpZGVkIGJ5IEpvbmF0aGFuIEJ1enphcmQuCiAgKi8KLXN0YXRpYyBpbnQgaThrX3NtbShzdHJ1Y3Qgc21tX3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW50IGk4a19zbW1fZnVuYyh2b2lkICpwYXIpCiB7CiAJaW50IHJjOworCXN0cnVjdCBzbW1fcmVncyAqcmVncyA9IHBhcjsKIAlpbnQgZWF4ID0gcmVncy0+ZWF4OwotCWNwdW1hc2tfdmFyX3Qgb2xkX21hc2s7CiAKICNpZmRlZiBERUJVRwogCWludCBlYnggPSByZWdzLT5lYng7CkBAIC0xNDksMTYgKzE1MSw4IEBACiAjZW5kaWYKIAogCS8qIFNNTSByZXF1aXJlcyBDUFUgMCAqLwotCWlmICghYWxsb2NfY3B1bWFza192YXIoJm9sZF9tYXNrLCBHRlBfS0VSTkVMKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JY3B1bWFza19jb3B5KG9sZF9tYXNrLCAmY3VycmVudC0+Y3B1c19hbGxvd2VkKTsKLQlyYyA9IHNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsIGNwdW1hc2tfb2YoMCkpOwotCWlmIChyYykKLQkJZ290byBvdXQ7Ci0JaWYgKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSAwKSB7Ci0JCXJjID0gLUVCVVNZOwotCQlnb3RvIG91dDsKLQl9CisJaWYgKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOwogCiAjaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KQogCWFzbSB2b2xhdGlsZSgicHVzaHEgJSVyYXhcblx0IgpAQCAtMjE2LDEwICsyMTAsNiBAQAogCWlmIChyYyAhPSAwIHx8IChyZWdzLT5lYXggJiAweGZmZmYpID09IDB4ZmZmZiB8fCByZWdzLT5lYXggPT0gZWF4KQogCQlyYyA9IC1FSU5WQUw7CiAKLW91dDoKLQlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCBvbGRfbWFzayk7Ci0JZnJlZV9jcHVtYXNrX3ZhcihvbGRfbWFzayk7Ci0KICNpZmRlZiBERUJVRwogCXJldHRpbWUgPSBrdGltZV9nZXQoKTsKIAlkZWx0YSA9IGt0aW1lX3N1YihyZXR0aW1lLCBjYWxsdGltZSk7CkBAIC0yMzIsNiArMjIyLDIwIEBACiB9CiAKIC8qCisgKiBDYWxsIHRoZSBTeXN0ZW0gTWFuYWdlbWVudCBNb2RlIEJJT1MuCisgKi8KK3N0YXRpYyBpbnQgaThrX3NtbShzdHJ1Y3Qgc21tX3JlZ3MgKnJlZ3MpCit7CisJaW50IHJldDsKKworCWdldF9vbmxpbmVfY3B1cygpOworCXJldCA9IHNtcF9jYWxsX29uX2NwdSgwLCBpOGtfc21tX2Z1bmMsIHJlZ3MsIHRydWUpOworCXB1dF9vbmxpbmVfY3B1cygpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKICAqIFJlYWQgdGhlIGZhbiBzdGF0dXMuCiAgKi8KIHN0YXRpYyBpbnQgaThrX2dldF9mYW5fc3RhdHVzKGludCBmYW4pCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2Z0c3RldXRhdGVzLmMgYi9kcml2ZXJzL2h3bW9uL2Z0c3RldXRhdGVzLmMKaW5kZXggNDg2MzNlNS4uMGYwMjc3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9mdHN0ZXV0YXRlcy5jCisrKyBiL2RyaXZlcnMvaHdtb24vZnRzdGV1dGF0ZXMuYwpAQCAtMzYsNiArMzYsMTAgQEAKICNkZWZpbmUgRlRTX0VWRU5UX1NUQVRVU19SRUcJCTB4MDAwNgogI2RlZmluZSBGVFNfR0xPQkFMX0NPTlRST0xfUkVHCQkweDAwMDcKIAorI2RlZmluZSBGVFNfREVWSUNFX0RFVEVDVF9SRUdfMQkJMHgwQworI2RlZmluZSBGVFNfREVWSUNFX0RFVEVDVF9SRUdfMgkJMHgwRAorI2RlZmluZSBGVFNfREVWSUNFX0RFVEVDVF9SRUdfMwkJMHgwRQorCiAjZGVmaW5lIEZUU19TRU5TT1JfRVZFTlRfUkVHCQkweDAwMTAKIAogI2RlZmluZSBGVFNfRkFOX0VWRU5UX1JFRwkJMHgwMDE0CkBAIC01NCw2ICs1OCw4IEBACiAjZGVmaW5lIEZUU19OT19URU1QX1NFTlNPUlMJCTB4MTAKICNkZWZpbmUgRlRTX05PX1ZPTFRfU0VOU09SUwkJMHgwNAogCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDczLCBJMkNfQ0xJRU5UX0VORCB9OworCiBzdGF0aWMgc3RydWN0IGkyY19kZXZpY2VfaWQgZnRzX2lkW10gPSB7CiAJeyAiZnRzdGV1dGF0ZXMiLCAwIH0sCiAJeyB9CkBAIC03MzQsNiArNzQwLDQyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gLyByZW1vdmUgZnVuY3Rpb25zCQkJCSAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZnRzX2RldGVjdChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkgICAgICBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8pCit7CisJaW50IHZhbDsKKworCS8qIGRldGVjdGlvbiB3b3JrcyB3aXRoIHJldnNpb24gZ3JlYXRlciBvciBlcXVhbCB0byAweDJiICovCisJdmFsID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgRlRTX0RFVklDRV9SRVZJU0lPTl9SRUcpOworCWlmICh2YWwgPCAweDJiKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIERldmljZSBEZXRlY3QgUmVncyBtdXN0IGhhdmUgMHgxNyAweDM0IGFuZCAweDU0ICovCisJdmFsID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgRlRTX0RFVklDRV9ERVRFQ1RfUkVHXzEpOworCWlmICh2YWwgIT0gMHgxNykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl2YWwgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBGVFNfREVWSUNFX0RFVEVDVF9SRUdfMik7CisJaWYgKHZhbCAhPSAweDM0KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXZhbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEZUU19ERVZJQ0VfREVURUNUX1JFR18zKTsKKwlpZiAodmFsICE9IDB4NTQpCisJCXJldHVybiAtRU5PREVWOworCisJLyoKKwkgKiAweDEwID09IEJhc2Vib2FyZCBNYW5hZ2VtZW50IENvbnRyb2xsZXIsIDB4MDEgPT0gVGV1dGF0ZXMKKwkgKiBEZXZpY2UgSUQgUmVnIG5lZWRzIHRvIGJlIDB4MTEKKwkgKi8KKwl2YWwgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBGVFNfREVWSUNFX0lEX1JFRyk7CisJaWYgKHZhbCAhPSAweDExKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXN0cmxjcHkoaW5mby0+dHlwZSwgZnRzX2lkWzBdLm5hbWUsIEkyQ19OQU1FX1NJWkUpOworCWluZm8tPmZsYWdzID0gMDsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBmdHNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IGZ0c19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKCZjbGllbnQtPmRldik7CkBAIC04MDQsMTIgKzg0NiwxNSBAQAogLyogTW9kdWxlIERldGFpbHMJCQkJCQkJICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGZ0c19kcml2ZXIgPSB7CisJLmNsYXNzID0gSTJDX0NMQVNTX0hXTU9OLAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gImZ0c3RldXRhdGVzIiwKIAl9LAogCS5pZF90YWJsZSA9IGZ0c19pZCwKIAkucHJvYmUgPSBmdHNfcHJvYmUsCiAJLnJlbW92ZSA9IGZ0c19yZW1vdmUsCisJLmRldGVjdCA9IGZ0c19kZXRlY3QsCisJLmFkZHJlc3NfbGlzdCA9IG5vcm1hbF9pMmMsCiB9OwogCiBtb2R1bGVfaTJjX2RyaXZlcihmdHNfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaHdtb24uYyBiL2RyaXZlcnMvaHdtb24vaHdtb24uYwppbmRleCBhMjZjMzg1Li5hZGFlNjg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2h3bW9uLmMKKysrIGIvZHJpdmVycy9od21vbi9od21vbi5jCkBAIC0xMiwxNyArMTIsMTcgQEAKIAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lkci5oPgotI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aGVybWFsLmg+CiAKICNkZWZpbmUgSFdNT05fSURfUFJFRklYICJod21vbiIKICNkZWZpbmUgSFdNT05fSURfRk9STUFUIEhXTU9OX0lEX1BSRUZJWCAiJWQiCkBAIC0zMCw5ICszMCwzNSBAQAogc3RydWN0IGh3bW9uX2RldmljZSB7CiAJY29uc3QgY2hhciAqbmFtZTsKIAlzdHJ1Y3QgZGV2aWNlIGRldjsKKwljb25zdCBzdHJ1Y3QgaHdtb25fY2hpcF9pbmZvICpjaGlwOworCisJc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBncm91cDsKKwljb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICoqZ3JvdXBzOwogfTsKKwogI2RlZmluZSB0b19od21vbl9kZXZpY2UoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBod21vbl9kZXZpY2UsIGRldikKIAorc3RydWN0IGh3bW9uX2RldmljZV9hdHRyaWJ1dGUgeworCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyOworCWNvbnN0IHN0cnVjdCBod21vbl9vcHMgKm9wczsKKwllbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlOworCXUzMiBhdHRyOworCWludCBpbmRleDsKK307CisKKyNkZWZpbmUgdG9faHdtb25fYXR0cihkKSBcCisJY29udGFpbmVyX29mKGQsIHN0cnVjdCBod21vbl9kZXZpY2VfYXR0cmlidXRlLCBkZXZfYXR0cikKKworLyoKKyAqIFRoZXJtYWwgem9uZSBpbmZvcm1hdGlvbgorICogSW4gYWRkaXRpb24gdG8gdGhlIHJlZmVyZW5jZSB0byB0aGUgaHdtb24gZGV2aWNlLAorICogYWxzbyBwcm92aWRlcyB0aGUgc2Vuc29yIGluZGV4LgorICovCitzdHJ1Y3QgaHdtb25fdGhlcm1hbF9kYXRhIHsKKwlzdHJ1Y3QgaHdtb25fZGV2aWNlICpod2RldjsJLyogUmVmZXJlbmNlIHRvIGh3bW9uIGRldmljZSAqLworCWludCBpbmRleDsJCQkvKiBzZW5zb3IgaW5kZXggKi8KK307CisKIHN0YXRpYyBzc2l6ZV90CiBzaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewpAQCAtODAsNiArMTA2LDQ5OCBAQAogCiBzdGF0aWMgREVGSU5FX0lEQShod21vbl9pZGEpOwogCisvKiBUaGVybWFsIHpvbmUgaGFuZGxpbmcgKi8KKworLyoKKyAqIFRoZSBjb21wbGV4IGNvbmRpdGlvbmFsIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBhIGN5Y2xpYyBkZXBlbmRlbmN5CisgKiBiZXR3ZWVuIGh3bW9uIGFuZCB0aGVybWFsX3N5cyBtb2R1bGVzLgorICovCisjaWYgSVNfUkVBQ0hBQkxFKENPTkZJR19USEVSTUFMKSAmJiBkZWZpbmVkKENPTkZJR19USEVSTUFMX09GKSAmJiBcCisJKCFkZWZpbmVkKENPTkZJR19USEVSTUFMX0hXTU9OKSB8fCBcCisJICEoZGVmaW5lZChNT0RVTEUpICYmIElTX01PRFVMRShDT05GSUdfVEhFUk1BTCkpKQorc3RhdGljIGludCBod21vbl90aGVybWFsX2dldF90ZW1wKHZvaWQgKmRhdGEsIGludCAqdGVtcCkKK3sKKwlzdHJ1Y3QgaHdtb25fdGhlcm1hbF9kYXRhICp0ZGF0YSA9IGRhdGE7CisJc3RydWN0IGh3bW9uX2RldmljZSAqaHdkZXYgPSB0ZGF0YS0+aHdkZXY7CisJaW50IHJldDsKKwlsb25nIHQ7CisKKwlyZXQgPSBod2Rldi0+Y2hpcC0+b3BzLT5yZWFkKCZod2Rldi0+ZGV2LCBod21vbl90ZW1wLCBod21vbl90ZW1wX2lucHV0LAorCQkJCSAgICAgdGRhdGEtPmluZGV4LCAmdCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkqdGVtcCA9IHQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB0aGVybWFsX3pvbmVfb2ZfZGV2aWNlX29wcyBod21vbl90aGVybWFsX29wcyA9IHsKKwkuZ2V0X3RlbXAgPSBod21vbl90aGVybWFsX2dldF90ZW1wLAorfTsKKworc3RhdGljIGludCBod21vbl90aGVybWFsX2FkZF9zZW5zb3Ioc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgaHdtb25fZGV2aWNlICpod2RldiwgaW50IGluZGV4KQoreworCXN0cnVjdCBod21vbl90aGVybWFsX2RhdGEgKnRkYXRhOworCisJdGRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnRkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0ZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0ZGF0YS0+aHdkZXYgPSBod2RldjsKKwl0ZGF0YS0+aW5kZXggPSBpbmRleDsKKworCWRldm1fdGhlcm1hbF96b25lX29mX3NlbnNvcl9yZWdpc3RlcigmaHdkZXYtPmRldiwgaW5kZXgsIHRkYXRhLAorCQkJCQkgICAgICZod21vbl90aGVybWFsX29wcyk7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW50IGh3bW9uX3RoZXJtYWxfYWRkX3NlbnNvcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBod21vbl9kZXZpY2UgKmh3ZGV2LCBpbnQgaW5kZXgpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogSVNfUkVBQ0hBQkxFKENPTkZJR19USEVSTUFMKSAmJiAuLi4gKi8KKworLyogc3lzZnMgYXR0cmlidXRlIG1hbmFnZW1lbnQgKi8KKworc3RhdGljIHNzaXplX3QgaHdtb25fYXR0cl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBod21vbl9kZXZpY2VfYXR0cmlidXRlICpoYXR0ciA9IHRvX2h3bW9uX2F0dHIoZGV2YXR0cik7CisJbG9uZyB2YWw7CisJaW50IHJldDsKKworCXJldCA9IGhhdHRyLT5vcHMtPnJlYWQoZGV2LCBoYXR0ci0+dHlwZSwgaGF0dHItPmF0dHIsIGhhdHRyLT5pbmRleCwKKwkJCSAgICAgICAmdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgdmFsKTsKK30KKworc3RhdGljIHNzaXplX3QgaHdtb25fYXR0cl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGh3bW9uX2RldmljZV9hdHRyaWJ1dGUgKmhhdHRyID0gdG9faHdtb25fYXR0cihkZXZhdHRyKTsKKwlsb25nIHZhbDsKKwlpbnQgcmV0OworCisJcmV0ID0ga3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGhhdHRyLT5vcHMtPndyaXRlKGRldiwgaGF0dHItPnR5cGUsIGhhdHRyLT5hdHRyLCBoYXR0ci0+aW5kZXgsCisJCQkJdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBod21vbl9hdHRyX2Jhc2UoZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSkKK3sKKwlpZiAodHlwZSA9PSBod21vbl9pbikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpod21vbl9nZW5hdHRyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICAgY29uc3Qgdm9pZCAqZHJ2ZGF0YSwKKwkJCQkgICAgICAgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJCQkgICAgICAgdTMyIGF0dHIsCisJCQkJICAgICAgIGludCBpbmRleCwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqdGVtcGxhdGUsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBod21vbl9vcHMgKm9wcykKK3sKKwlzdHJ1Y3QgaHdtb25fZGV2aWNlX2F0dHJpYnV0ZSAqaGF0dHI7CisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhdHRyOworCXN0cnVjdCBhdHRyaWJ1dGUgKmE7CisJdW1vZGVfdCBtb2RlOworCWNoYXIgKm5hbWU7CisKKwkvKiBUaGUgYXR0cmlidXRlIGlzIGludmlzaWJsZSBpZiB0aGVyZSBpcyBubyB0ZW1wbGF0ZSBzdHJpbmcgKi8KKwlpZiAoIXRlbXBsYXRlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKworCW1vZGUgPSBvcHMtPmlzX3Zpc2libGUoZHJ2ZGF0YSwgdHlwZSwgYXR0ciwgaW5kZXgpOworCWlmICghbW9kZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CisKKwlpZiAoKG1vZGUgJiBTX0lSVUdPKSAmJiAhb3BzLT5yZWFkKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwlpZiAoKG1vZGUgJiBTX0lXVUdPKSAmJiAhb3BzLT53cml0ZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlpZiAodHlwZSA9PSBod21vbl9jaGlwKSB7CisJCW5hbWUgPSAoY2hhciAqKXRlbXBsYXRlOworCX0gZWxzZSB7CisJCW5hbWUgPSBkZXZtX2t6YWxsb2MoZGV2LCBzdHJsZW4odGVtcGxhdGUpICsgMTYsIEdGUF9LRVJORUwpOworCQlpZiAoIW5hbWUpCisJCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwkJc2NucHJpbnRmKG5hbWUsIHN0cmxlbih0ZW1wbGF0ZSkgKyAxNiwgdGVtcGxhdGUsCisJCQkgIGluZGV4ICsgaHdtb25fYXR0cl9iYXNlKHR5cGUpKTsKKwl9CisKKwloYXR0ciA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqaGF0dHIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhhdHRyKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWhhdHRyLT50eXBlID0gdHlwZTsKKwloYXR0ci0+YXR0ciA9IGF0dHI7CisJaGF0dHItPmluZGV4ID0gaW5kZXg7CisJaGF0dHItPm9wcyA9IG9wczsKKworCWRhdHRyID0gJmhhdHRyLT5kZXZfYXR0cjsKKwlkYXR0ci0+c2hvdyA9IGh3bW9uX2F0dHJfc2hvdzsKKwlkYXR0ci0+c3RvcmUgPSBod21vbl9hdHRyX3N0b3JlOworCisJYSA9ICZkYXR0ci0+YXR0cjsKKwlzeXNmc19hdHRyX2luaXQoYSk7CisJYS0+bmFtZSA9IG5hbWU7CisJYS0+bW9kZSA9IG1vZGU7CisKKwlyZXR1cm4gYTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBod21vbl9jaGlwX2F0dHJfdGVtcGxhdGVzW10gPSB7CisJW2h3bW9uX2NoaXBfdGVtcF9yZXNldF9oaXN0b3J5XSA9ICJ0ZW1wX3Jlc2V0X2hpc3RvcnkiLAorCVtod21vbl9jaGlwX2luX3Jlc2V0X2hpc3RvcnldID0gImluX3Jlc2V0X2hpc3RvcnkiLAorCVtod21vbl9jaGlwX2N1cnJfcmVzZXRfaGlzdG9yeV0gPSAiY3Vycl9yZXNldF9oaXN0b3J5IiwKKwlbaHdtb25fY2hpcF9wb3dlcl9yZXNldF9oaXN0b3J5XSA9ICJwb3dlcl9yZXNldF9oaXN0b3J5IiwKKwlbaHdtb25fY2hpcF91cGRhdGVfaW50ZXJ2YWxdID0gInVwZGF0ZV9pbnRlcnZhbCIsCisJW2h3bW9uX2NoaXBfYWxhcm1zXSA9ICJhbGFybXMiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBod21vbl90ZW1wX2F0dHJfdGVtcGxhdGVzW10gPSB7CisJW2h3bW9uX3RlbXBfaW5wdXRdID0gInRlbXAlZF9pbnB1dCIsCisJW2h3bW9uX3RlbXBfdHlwZV0gPSAidGVtcCVkX3R5cGUiLAorCVtod21vbl90ZW1wX2xjcml0XSA9ICJ0ZW1wJWRfbGNyaXQiLAorCVtod21vbl90ZW1wX2xjcml0X2h5c3RdID0gInRlbXAlZF9sY3JpdF9oeXN0IiwKKwlbaHdtb25fdGVtcF9taW5dID0gInRlbXAlZF9taW4iLAorCVtod21vbl90ZW1wX21pbl9oeXN0XSA9ICJ0ZW1wJWRfbWluX2h5c3QiLAorCVtod21vbl90ZW1wX21heF0gPSAidGVtcCVkX21heCIsCisJW2h3bW9uX3RlbXBfbWF4X2h5c3RdID0gInRlbXAlZF9tYXhfaHlzdCIsCisJW2h3bW9uX3RlbXBfY3JpdF0gPSAidGVtcCVkX2NyaXQiLAorCVtod21vbl90ZW1wX2NyaXRfaHlzdF0gPSAidGVtcCVkX2NyaXRfaHlzdCIsCisJW2h3bW9uX3RlbXBfZW1lcmdlbmN5XSA9ICJ0ZW1wJWRfZW1lcmdlbmN5IiwKKwlbaHdtb25fdGVtcF9lbWVyZ2VuY3lfaHlzdF0gPSAidGVtcCVkX2VtZXJnZW5jeV9oeXN0IiwKKwlbaHdtb25fdGVtcF9hbGFybV0gPSAidGVtcCVkX2FsYXJtIiwKKwlbaHdtb25fdGVtcF9sY3JpdF9hbGFybV0gPSAidGVtcCVkX2xjcml0X2FsYXJtIiwKKwlbaHdtb25fdGVtcF9taW5fYWxhcm1dID0gInRlbXAlZF9taW5fYWxhcm0iLAorCVtod21vbl90ZW1wX21heF9hbGFybV0gPSAidGVtcCVkX21heF9hbGFybSIsCisJW2h3bW9uX3RlbXBfY3JpdF9hbGFybV0gPSAidGVtcCVkX2NyaXRfYWxhcm0iLAorCVtod21vbl90ZW1wX2VtZXJnZW5jeV9hbGFybV0gPSAidGVtcCVkX2VtZXJnZW5jeV9hbGFybSIsCisJW2h3bW9uX3RlbXBfZmF1bHRdID0gInRlbXAlZF9mYXVsdCIsCisJW2h3bW9uX3RlbXBfb2Zmc2V0XSA9ICJ0ZW1wJWRfb2Zmc2V0IiwKKwlbaHdtb25fdGVtcF9sYWJlbF0gPSAidGVtcCVkX2xhYmVsIiwKKwlbaHdtb25fdGVtcF9sb3dlc3RdID0gInRlbXAlZF9sb3dlc3QiLAorCVtod21vbl90ZW1wX2hpZ2hlc3RdID0gInRlbXAlZF9oaWdoZXN0IiwKKwlbaHdtb25fdGVtcF9yZXNldF9oaXN0b3J5XSA9ICJ0ZW1wJWRfcmVzZXRfaGlzdG9yeSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGh3bW9uX2luX2F0dHJfdGVtcGxhdGVzW10gPSB7CisJW2h3bW9uX2luX2lucHV0XSA9ICJpbiVkX2lucHV0IiwKKwlbaHdtb25faW5fbWluXSA9ICJpbiVkX21pbiIsCisJW2h3bW9uX2luX21heF0gPSAiaW4lZF9tYXgiLAorCVtod21vbl9pbl9sY3JpdF0gPSAiaW4lZF9sY3JpdCIsCisJW2h3bW9uX2luX2NyaXRdID0gImluJWRfY3JpdCIsCisJW2h3bW9uX2luX2F2ZXJhZ2VdID0gImluJWRfYXZlcmFnZSIsCisJW2h3bW9uX2luX2xvd2VzdF0gPSAiaW4lZF9sb3dlc3QiLAorCVtod21vbl9pbl9oaWdoZXN0XSA9ICJpbiVkX2hpZ2hlc3QiLAorCVtod21vbl9pbl9yZXNldF9oaXN0b3J5XSA9ICJpbiVkX3Jlc2V0X2hpc3RvcnkiLAorCVtod21vbl9pbl9sYWJlbF0gPSAiaW4lZF9sYWJlbCIsCisJW2h3bW9uX2luX2FsYXJtXSA9ICJpbiVkX2FsYXJtIiwKKwlbaHdtb25faW5fbWluX2FsYXJtXSA9ICJpbiVkX21pbl9hbGFybSIsCisJW2h3bW9uX2luX21heF9hbGFybV0gPSAiaW4lZF9tYXhfYWxhcm0iLAorCVtod21vbl9pbl9sY3JpdF9hbGFybV0gPSAiaW4lZF9sY3JpdF9hbGFybSIsCisJW2h3bW9uX2luX2NyaXRfYWxhcm1dID0gImluJWRfY3JpdF9hbGFybSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGh3bW9uX2N1cnJfYXR0cl90ZW1wbGF0ZXNbXSA9IHsKKwlbaHdtb25fY3Vycl9pbnB1dF0gPSAiY3VyciVkX2lucHV0IiwKKwlbaHdtb25fY3Vycl9taW5dID0gImN1cnIlZF9taW4iLAorCVtod21vbl9jdXJyX21heF0gPSAiY3VyciVkX21heCIsCisJW2h3bW9uX2N1cnJfbGNyaXRdID0gImN1cnIlZF9sY3JpdCIsCisJW2h3bW9uX2N1cnJfY3JpdF0gPSAiY3VyciVkX2NyaXQiLAorCVtod21vbl9jdXJyX2F2ZXJhZ2VdID0gImN1cnIlZF9hdmVyYWdlIiwKKwlbaHdtb25fY3Vycl9sb3dlc3RdID0gImN1cnIlZF9sb3dlc3QiLAorCVtod21vbl9jdXJyX2hpZ2hlc3RdID0gImN1cnIlZF9oaWdoZXN0IiwKKwlbaHdtb25fY3Vycl9yZXNldF9oaXN0b3J5XSA9ICJjdXJyJWRfcmVzZXRfaGlzdG9yeSIsCisJW2h3bW9uX2N1cnJfbGFiZWxdID0gImN1cnIlZF9sYWJlbCIsCisJW2h3bW9uX2N1cnJfYWxhcm1dID0gImN1cnIlZF9hbGFybSIsCisJW2h3bW9uX2N1cnJfbWluX2FsYXJtXSA9ICJjdXJyJWRfbWluX2FsYXJtIiwKKwlbaHdtb25fY3Vycl9tYXhfYWxhcm1dID0gImN1cnIlZF9tYXhfYWxhcm0iLAorCVtod21vbl9jdXJyX2xjcml0X2FsYXJtXSA9ICJjdXJyJWRfbGNyaXRfYWxhcm0iLAorCVtod21vbl9jdXJyX2NyaXRfYWxhcm1dID0gImN1cnIlZF9jcml0X2FsYXJtIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaHdtb25fcG93ZXJfYXR0cl90ZW1wbGF0ZXNbXSA9IHsKKwlbaHdtb25fcG93ZXJfYXZlcmFnZV0gPSAicG93ZXIlZF9hdmVyYWdlIiwKKwlbaHdtb25fcG93ZXJfYXZlcmFnZV9pbnRlcnZhbF0gPSAicG93ZXIlZF9hdmVyYWdlX2ludGVydmFsIiwKKwlbaHdtb25fcG93ZXJfYXZlcmFnZV9pbnRlcnZhbF9tYXhdID0gInBvd2VyJWRfaW50ZXJ2YWxfbWF4IiwKKwlbaHdtb25fcG93ZXJfYXZlcmFnZV9pbnRlcnZhbF9taW5dID0gInBvd2VyJWRfaW50ZXJ2YWxfbWluIiwKKwlbaHdtb25fcG93ZXJfYXZlcmFnZV9oaWdoZXN0XSA9ICJwb3dlciVkX2F2ZXJhZ2VfaGlnaGVzdCIsCisJW2h3bW9uX3Bvd2VyX2F2ZXJhZ2VfbG93ZXN0XSA9ICJwb3dlciVkX2F2ZXJhZ2VfbG93ZXN0IiwKKwlbaHdtb25fcG93ZXJfYXZlcmFnZV9tYXhdID0gInBvd2VyJWRfYXZlcmFnZV9tYXgiLAorCVtod21vbl9wb3dlcl9hdmVyYWdlX21pbl0gPSAicG93ZXIlZF9hdmVyYWdlX21pbiIsCisJW2h3bW9uX3Bvd2VyX2lucHV0XSA9ICJwb3dlciVkX2lucHV0IiwKKwlbaHdtb25fcG93ZXJfaW5wdXRfaGlnaGVzdF0gPSAicG93ZXIlZF9pbnB1dF9oaWdoZXN0IiwKKwlbaHdtb25fcG93ZXJfaW5wdXRfbG93ZXN0XSA9ICJwb3dlciVkX2lucHV0X2xvd2VzdCIsCisJW2h3bW9uX3Bvd2VyX3Jlc2V0X2hpc3RvcnldID0gInBvd2VyJWRfcmVzZXRfaGlzdG9yeSIsCisJW2h3bW9uX3Bvd2VyX2FjY3VyYWN5XSA9ICJwb3dlciVkX2FjY3VyYWN5IiwKKwlbaHdtb25fcG93ZXJfY2FwXSA9ICJwb3dlciVkX2NhcCIsCisJW2h3bW9uX3Bvd2VyX2NhcF9oeXN0XSA9ICJwb3dlciVkX2NhcF9oeXN0IiwKKwlbaHdtb25fcG93ZXJfY2FwX21heF0gPSAicG93ZXIlZF9jYXBfbWF4IiwKKwlbaHdtb25fcG93ZXJfY2FwX21pbl0gPSAicG93ZXIlZF9jYXBfbWluIiwKKwlbaHdtb25fcG93ZXJfbWF4XSA9ICJwb3dlciVkX21heCIsCisJW2h3bW9uX3Bvd2VyX2NyaXRdID0gInBvd2VyJWRfY3JpdCIsCisJW2h3bW9uX3Bvd2VyX2xhYmVsXSA9ICJwb3dlciVkX2xhYmVsIiwKKwlbaHdtb25fcG93ZXJfYWxhcm1dID0gInBvd2VyJWRfYWxhcm0iLAorCVtod21vbl9wb3dlcl9jYXBfYWxhcm1dID0gInBvd2VyJWRfY2FwX2FsYXJtIiwKKwlbaHdtb25fcG93ZXJfbWF4X2FsYXJtXSA9ICJwb3dlciVkX21heF9hbGFybSIsCisJW2h3bW9uX3Bvd2VyX2NyaXRfYWxhcm1dID0gInBvd2VyJWRfY3JpdF9hbGFybSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGh3bW9uX2VuZXJneV9hdHRyX3RlbXBsYXRlc1tdID0geworCVtod21vbl9lbmVyZ3lfaW5wdXRdID0gImVuZXJneSVkX2lucHV0IiwKKwlbaHdtb25fZW5lcmd5X2xhYmVsXSA9ICJlbmVyZ3klZF9sYWJlbCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGh3bW9uX2h1bWlkaXR5X2F0dHJfdGVtcGxhdGVzW10gPSB7CisJW2h3bW9uX2h1bWlkaXR5X2lucHV0XSA9ICJodW1pZGl0eSVkX2lucHV0IiwKKwlbaHdtb25faHVtaWRpdHlfbGFiZWxdID0gImh1bWlkaXR5JWRfbGFiZWwiLAorCVtod21vbl9odW1pZGl0eV9taW5dID0gImh1bWlkaXR5JWRfbWluIiwKKwlbaHdtb25faHVtaWRpdHlfbWluX2h5c3RdID0gImh1bWlkaXR5JWRfbWluX2h5c3QiLAorCVtod21vbl9odW1pZGl0eV9tYXhdID0gImh1bWlkaXR5JWRfbWF4IiwKKwlbaHdtb25faHVtaWRpdHlfbWF4X2h5c3RdID0gImh1bWlkaXR5JWRfbWF4X2h5c3QiLAorCVtod21vbl9odW1pZGl0eV9hbGFybV0gPSAiaHVtaWRpdHklZF9hbGFybSIsCisJW2h3bW9uX2h1bWlkaXR5X2ZhdWx0XSA9ICJodW1pZGl0eSVkX2ZhdWx0IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaHdtb25fZmFuX2F0dHJfdGVtcGxhdGVzW10gPSB7CisJW2h3bW9uX2Zhbl9pbnB1dF0gPSAiZmFuJWRfaW5wdXQiLAorCVtod21vbl9mYW5fbGFiZWxdID0gImZhbiVkX2xhYmVsIiwKKwlbaHdtb25fZmFuX21pbl0gPSAiZmFuJWRfbWluIiwKKwlbaHdtb25fZmFuX21heF0gPSAiZmFuJWRfbWF4IiwKKwlbaHdtb25fZmFuX2Rpdl0gPSAiZmFuJWRfZGl2IiwKKwlbaHdtb25fZmFuX3B1bHNlc10gPSAiZmFuJWRfcHVsc2VzIiwKKwlbaHdtb25fZmFuX3RhcmdldF0gPSAiZmFuJWRfdGFyZ2V0IiwKKwlbaHdtb25fZmFuX2FsYXJtXSA9ICJmYW4lZF9hbGFybSIsCisJW2h3bW9uX2Zhbl9taW5fYWxhcm1dID0gImZhbiVkX21pbl9hbGFybSIsCisJW2h3bW9uX2Zhbl9tYXhfYWxhcm1dID0gImZhbiVkX21heF9hbGFybSIsCisJW2h3bW9uX2Zhbl9mYXVsdF0gPSAiZmFuJWRfZmF1bHQiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBod21vbl9wd21fYXR0cl90ZW1wbGF0ZXNbXSA9IHsKKwlbaHdtb25fcHdtX2lucHV0XSA9ICJwd20lZCIsCisJW2h3bW9uX3B3bV9lbmFibGVdID0gInB3bSVkX2VuYWJsZSIsCisJW2h3bW9uX3B3bV9tb2RlXSA9ICJwd20lZF9tb2RlIiwKKwlbaHdtb25fcHdtX2ZyZXFdID0gInB3bSVkX2ZyZXEiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCAqX190ZW1wbGF0ZXNbXSA9IHsKKwlbaHdtb25fY2hpcF0gPSBod21vbl9jaGlwX2F0dHJfdGVtcGxhdGVzLAorCVtod21vbl90ZW1wXSA9IGh3bW9uX3RlbXBfYXR0cl90ZW1wbGF0ZXMsCisJW2h3bW9uX2luXSA9IGh3bW9uX2luX2F0dHJfdGVtcGxhdGVzLAorCVtod21vbl9jdXJyXSA9IGh3bW9uX2N1cnJfYXR0cl90ZW1wbGF0ZXMsCisJW2h3bW9uX3Bvd2VyXSA9IGh3bW9uX3Bvd2VyX2F0dHJfdGVtcGxhdGVzLAorCVtod21vbl9lbmVyZ3ldID0gaHdtb25fZW5lcmd5X2F0dHJfdGVtcGxhdGVzLAorCVtod21vbl9odW1pZGl0eV0gPSBod21vbl9odW1pZGl0eV9hdHRyX3RlbXBsYXRlcywKKwlbaHdtb25fZmFuXSA9IGh3bW9uX2Zhbl9hdHRyX3RlbXBsYXRlcywKKwlbaHdtb25fcHdtXSA9IGh3bW9uX3B3bV9hdHRyX3RlbXBsYXRlcywKK307CisKK3N0YXRpYyBjb25zdCBpbnQgX190ZW1wbGF0ZXNfc2l6ZVtdID0geworCVtod21vbl9jaGlwXSA9IEFSUkFZX1NJWkUoaHdtb25fY2hpcF9hdHRyX3RlbXBsYXRlcyksCisJW2h3bW9uX3RlbXBdID0gQVJSQVlfU0laRShod21vbl90ZW1wX2F0dHJfdGVtcGxhdGVzKSwKKwlbaHdtb25faW5dID0gQVJSQVlfU0laRShod21vbl9pbl9hdHRyX3RlbXBsYXRlcyksCisJW2h3bW9uX2N1cnJdID0gQVJSQVlfU0laRShod21vbl9jdXJyX2F0dHJfdGVtcGxhdGVzKSwKKwlbaHdtb25fcG93ZXJdID0gQVJSQVlfU0laRShod21vbl9wb3dlcl9hdHRyX3RlbXBsYXRlcyksCisJW2h3bW9uX2VuZXJneV0gPSBBUlJBWV9TSVpFKGh3bW9uX2VuZXJneV9hdHRyX3RlbXBsYXRlcyksCisJW2h3bW9uX2h1bWlkaXR5XSA9IEFSUkFZX1NJWkUoaHdtb25faHVtaWRpdHlfYXR0cl90ZW1wbGF0ZXMpLAorCVtod21vbl9mYW5dID0gQVJSQVlfU0laRShod21vbl9mYW5fYXR0cl90ZW1wbGF0ZXMpLAorCVtod21vbl9wd21dID0gQVJSQVlfU0laRShod21vbl9wd21fYXR0cl90ZW1wbGF0ZXMpLAorfTsKKworc3RhdGljIGludCBod21vbl9udW1fY2hhbm5lbF9hdHRycyhjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvICppbmZvKQoreworCWludCBpLCBuOworCisJZm9yIChpID0gbiA9IDA7IGluZm8tPmNvbmZpZ1tpXTsgaSsrKQorCQluICs9IGh3ZWlnaHQzMihpbmZvLT5jb25maWdbaV0pOworCisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQgaHdtb25fZ2VuYXR0cnMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICBjb25zdCB2b2lkICpkcnZkYXRhLAorCQkJICBzdHJ1Y3QgYXR0cmlidXRlICoqYXR0cnMsCisJCQkgIGNvbnN0IHN0cnVjdCBod21vbl9vcHMgKm9wcywKKwkJCSAgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyAqaW5mbykKK3sKKwljb25zdCBjaGFyICogY29uc3QgKnRlbXBsYXRlczsKKwlpbnQgdGVtcGxhdGVfc2l6ZTsKKwlpbnQgaSwgYWluZGV4ID0gMDsKKworCWlmIChpbmZvLT50eXBlID49IEFSUkFZX1NJWkUoX190ZW1wbGF0ZXMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRlbXBsYXRlcyA9IF9fdGVtcGxhdGVzW2luZm8tPnR5cGVdOworCXRlbXBsYXRlX3NpemUgPSBfX3RlbXBsYXRlc19zaXplW2luZm8tPnR5cGVdOworCisJZm9yIChpID0gMDsgaW5mby0+Y29uZmlnW2ldOyBpKyspIHsKKwkJdTMyIGF0dHJfbWFzayA9IGluZm8tPmNvbmZpZ1tpXTsKKwkJdTMyIGF0dHI7CisKKwkJd2hpbGUgKGF0dHJfbWFzaykgeworCQkJc3RydWN0IGF0dHJpYnV0ZSAqYTsKKworCQkJYXR0ciA9IF9fZmZzKGF0dHJfbWFzayk7CisJCQlhdHRyX21hc2sgJj0gfkJJVChhdHRyKTsKKwkJCWlmIChhdHRyID49IHRlbXBsYXRlX3NpemUpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlhID0gaHdtb25fZ2VuYXR0cihkZXYsIGRydmRhdGEsIGluZm8tPnR5cGUsIGF0dHIsIGksCisJCQkJCSAgdGVtcGxhdGVzW2F0dHJdLCBvcHMpOworCQkJaWYgKElTX0VSUihhKSkgeworCQkJCWlmIChQVFJfRVJSKGEpICE9IC1FTk9FTlQpCisJCQkJCXJldHVybiBQVFJfRVJSKGEpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYXR0cnNbYWluZGV4KytdID0gYTsKKwkJfQorCX0KKwlyZXR1cm4gYWluZGV4OworfQorCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqKgorX19od21vbl9jcmVhdGVfYXR0cnMoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCB2b2lkICpkcnZkYXRhLAorCQkgICAgIGNvbnN0IHN0cnVjdCBod21vbl9jaGlwX2luZm8gKmNoaXApCit7CisJaW50IHJldCwgaSwgYWluZGV4ID0gMCwgbmF0dHJzID0gMDsKKwlzdHJ1Y3QgYXR0cmlidXRlICoqYXR0cnM7CisKKwlmb3IgKGkgPSAwOyBjaGlwLT5pbmZvW2ldOyBpKyspCisJCW5hdHRycyArPSBod21vbl9udW1fY2hhbm5lbF9hdHRycyhjaGlwLT5pbmZvW2ldKTsKKworCWlmIChuYXR0cnMgPT0gMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlhdHRycyA9IGRldm1fa2NhbGxvYyhkZXYsIG5hdHRycyArIDEsIHNpemVvZigqYXR0cnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWF0dHJzKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWZvciAoaSA9IDA7IGNoaXAtPmluZm9baV07IGkrKykgeworCQlyZXQgPSBod21vbl9nZW5hdHRycyhkZXYsIGRydmRhdGEsICZhdHRyc1thaW5kZXhdLCBjaGlwLT5vcHMsCisJCQkJICAgICBjaGlwLT5pbmZvW2ldKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCQlhaW5kZXggKz0gcmV0OworCX0KKworCXJldHVybiBhdHRyczsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2UgKgorX19od21vbl9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpkcnZkYXRhLAorCQkJY29uc3Qgc3RydWN0IGh3bW9uX2NoaXBfaW5mbyAqY2hpcCwKKwkJCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKipncm91cHMpCit7CisJc3RydWN0IGh3bW9uX2RldmljZSAqaHdkZXY7CisJc3RydWN0IGRldmljZSAqaGRldjsKKwlpbnQgaSwgaiwgZXJyLCBpZDsKKworCS8qIERvIG5vdCBhY2NlcHQgaW52YWxpZCBjaGFyYWN0ZXJzIGluIGh3bW9uIG5hbWUgYXR0cmlidXRlICovCisJaWYgKG5hbWUgJiYgKCFzdHJsZW4obmFtZSkgfHwgc3RycGJyayhuYW1lLCAiLSogXHRcbiIpKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlpZCA9IGlkYV9zaW1wbGVfZ2V0KCZod21vbl9pZGEsIDAsIDAsIEdGUF9LRVJORUwpOworCWlmIChpZCA8IDApCisJCXJldHVybiBFUlJfUFRSKGlkKTsKKworCWh3ZGV2ID0ga3phbGxvYyhzaXplb2YoKmh3ZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGh3ZGV2ID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBpZGFfcmVtb3ZlOworCX0KKworCWhkZXYgPSAmaHdkZXYtPmRldjsKKworCWlmIChjaGlwICYmIGNoaXAtPm9wcy0+aXNfdmlzaWJsZSkgeworCQlzdHJ1Y3QgYXR0cmlidXRlICoqYXR0cnM7CisJCWludCBuZ3JvdXBzID0gMjsKKworCQlpZiAoZ3JvdXBzKQorCQkJZm9yIChpID0gMDsgZ3JvdXBzW2ldOyBpKyspCisJCQkJbmdyb3VwcysrOworCisJCWh3ZGV2LT5ncm91cHMgPSBkZXZtX2tjYWxsb2MoZGV2LCBuZ3JvdXBzLCBzaXplb2YoKmdyb3VwcyksCisJCQkJCSAgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghaHdkZXYtPmdyb3VwcykKKwkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJCWF0dHJzID0gX19od21vbl9jcmVhdGVfYXR0cnMoZGV2LCBkcnZkYXRhLCBjaGlwKTsKKwkJaWYgKElTX0VSUihhdHRycykpIHsKKwkJCWVyciA9IFBUUl9FUlIoYXR0cnMpOworCQkJZ290byBmcmVlX2h3bW9uOworCQl9CisKKwkJaHdkZXYtPmdyb3VwLmF0dHJzID0gYXR0cnM7CisJCW5ncm91cHMgPSAwOworCQlod2Rldi0+Z3JvdXBzW25ncm91cHMrK10gPSAmaHdkZXYtPmdyb3VwOworCisJCWlmIChncm91cHMpIHsKKwkJCWZvciAoaSA9IDA7IGdyb3Vwc1tpXTsgaSsrKQorCQkJCWh3ZGV2LT5ncm91cHNbbmdyb3VwcysrXSA9IGdyb3Vwc1tpXTsKKwkJfQorCisJCWhkZXYtPmdyb3VwcyA9IGh3ZGV2LT5ncm91cHM7CisJfSBlbHNlIHsKKwkJaGRldi0+Z3JvdXBzID0gZ3JvdXBzOworCX0KKworCWh3ZGV2LT5uYW1lID0gbmFtZTsKKwloZGV2LT5jbGFzcyA9ICZod21vbl9jbGFzczsKKwloZGV2LT5wYXJlbnQgPSBkZXY7CisJaGRldi0+b2Zfbm9kZSA9IGRldiA/IGRldi0+b2Zfbm9kZSA6IE5VTEw7CisJaHdkZXYtPmNoaXAgPSBjaGlwOworCWRldl9zZXRfZHJ2ZGF0YShoZGV2LCBkcnZkYXRhKTsKKwlkZXZfc2V0X25hbWUoaGRldiwgSFdNT05fSURfRk9STUFULCBpZCk7CisJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKGhkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZnJlZV9od21vbjsKKworCWlmIChjaGlwICYmIGNoaXAtPm9wcy0+aXNfdmlzaWJsZSAmJiBjaGlwLT5vcHMtPnJlYWQgJiYKKwkgICAgY2hpcC0+aW5mb1swXS0+dHlwZSA9PSBod21vbl9jaGlwICYmCisJICAgIChjaGlwLT5pbmZvWzBdLT5jb25maWdbMF0gJiBIV01PTl9DX1JFR0lTVEVSX1RaKSkgeworCQljb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvICoqaW5mbyA9IGNoaXAtPmluZm87CisKKwkJZm9yIChpID0gMTsgaW5mb1tpXTsgaSsrKSB7CisJCQlpZiAoaW5mb1tpXS0+dHlwZSAhPSBod21vbl90ZW1wKQorCQkJCWNvbnRpbnVlOworCisJCQlmb3IgKGogPSAwOyBpbmZvW2ldLT5jb25maWdbal07IGorKykgeworCQkJCWlmICghY2hpcC0+b3BzLT5pc192aXNpYmxlKGRydmRhdGEsIGh3bW9uX3RlbXAsCisJCQkJCQkJICAgaHdtb25fdGVtcF9pbnB1dCwgaikpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChpbmZvW2ldLT5jb25maWdbal0gJiBIV01PTl9UX0lOUFVUKQorCQkJCQlod21vbl90aGVybWFsX2FkZF9zZW5zb3IoZGV2LCBod2Rldiwgaik7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gaGRldjsKKworZnJlZV9od21vbjoKKwlrZnJlZShod2Rldik7CitpZGFfcmVtb3ZlOgorCWlkYV9zaW1wbGVfcmVtb3ZlKCZod21vbl9pZGEsIGlkKTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCiAvKioKICAqIGh3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyAtIHJlZ2lzdGVyIHcvIGh3bW9uCiAgKiBAZGV2OiB0aGUgcGFyZW50IGRldmljZQpAQCAtOTcsNDUgKzYxNSwzNyBAQAogCQkJCSAgdm9pZCAqZHJ2ZGF0YSwKIAkJCQkgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKipncm91cHMpCiB7Ci0Jc3RydWN0IGh3bW9uX2RldmljZSAqaHdkZXY7Ci0JaW50IGVyciwgaWQ7Ci0KLQkvKiBEbyBub3QgYWNjZXB0IGludmFsaWQgY2hhcmFjdGVycyBpbiBod21vbiBuYW1lIGF0dHJpYnV0ZSAqLwotCWlmIChuYW1lICYmICghc3RybGVuKG5hbWUpIHx8IHN0cnBicmsobmFtZSwgIi0qIFx0XG4iKSkpCi0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCi0JaWQgPSBpZGFfc2ltcGxlX2dldCgmaHdtb25faWRhLCAwLCAwLCBHRlBfS0VSTkVMKTsKLQlpZiAoaWQgPCAwKQotCQlyZXR1cm4gRVJSX1BUUihpZCk7Ci0KLQlod2RldiA9IGt6YWxsb2Moc2l6ZW9mKCpod2RldiksIEdGUF9LRVJORUwpOwotCWlmIChod2RldiA9PSBOVUxMKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gaWRhX3JlbW92ZTsKLQl9Ci0KLQlod2Rldi0+bmFtZSA9IG5hbWU7Ci0JaHdkZXYtPmRldi5jbGFzcyA9ICZod21vbl9jbGFzczsKLQlod2Rldi0+ZGV2LnBhcmVudCA9IGRldjsKLQlod2Rldi0+ZGV2Lmdyb3VwcyA9IGdyb3VwczsKLQlod2Rldi0+ZGV2Lm9mX25vZGUgPSBkZXYgPyBkZXYtPm9mX25vZGUgOiBOVUxMOwotCWRldl9zZXRfZHJ2ZGF0YSgmaHdkZXYtPmRldiwgZHJ2ZGF0YSk7Ci0JZGV2X3NldF9uYW1lKCZod2Rldi0+ZGV2LCBIV01PTl9JRF9GT1JNQVQsIGlkKTsKLQllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJmh3ZGV2LT5kZXYpOwotCWlmIChlcnIpCi0JCWdvdG8gZnJlZTsKLQotCXJldHVybiAmaHdkZXYtPmRldjsKLQotZnJlZToKLQlrZnJlZShod2Rldik7Ci1pZGFfcmVtb3ZlOgotCWlkYV9zaW1wbGVfcmVtb3ZlKCZod21vbl9pZGEsIGlkKTsKLQlyZXR1cm4gRVJSX1BUUihlcnIpOworCXJldHVybiBfX2h3bW9uX2RldmljZV9yZWdpc3RlcihkZXYsIG5hbWUsIGRydmRhdGEsIE5VTEwsIGdyb3Vwcyk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChod21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMpOwogCiAvKioKKyAqIGh3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8gLSByZWdpc3RlciB3LyBod21vbgorICogQGRldjogdGhlIHBhcmVudCBkZXZpY2UKKyAqIEBuYW1lOiBod21vbiBuYW1lIGF0dHJpYnV0ZQorICogQGRydmRhdGE6IGRyaXZlciBkYXRhIHRvIGF0dGFjaCB0byBjcmVhdGVkIGRldmljZQorICogQGluZm86IFBvaW50ZXIgdG8gaHdtb24gY2hpcCBpbmZvcm1hdGlvbgorICogQGdyb3VwcyAtIHBvaW50ZXIgdG8gbGlzdCBvZiBkcml2ZXIgc3BlY2lmaWMgYXR0cmlidXRlIGdyb3VwcworICoKKyAqIGh3bW9uX2RldmljZV91bnJlZ2lzdGVyKCkgbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgZGV2aWNlIGlzIG5vCisgKiBsb25nZXIgbmVlZGVkLgorICoKKyAqIFJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIG5ldyBkZXZpY2UuCisgKi8KK3N0cnVjdCBkZXZpY2UgKgoraHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJdm9pZCAqZHJ2ZGF0YSwKKwkJCQljb25zdCBzdHJ1Y3QgaHdtb25fY2hpcF9pbmZvICpjaGlwLAorCQkJCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKipncm91cHMpCit7CisJaWYgKGNoaXAgJiYgKCFjaGlwLT5vcHMgfHwgIWNoaXAtPmluZm8pKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCXJldHVybiBfX2h3bW9uX2RldmljZV9yZWdpc3RlcihkZXYsIG5hbWUsIGRydmRhdGEsIGNoaXAsIGdyb3Vwcyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChod21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvKTsKKworLyoqCiAgKiBod21vbl9kZXZpY2VfcmVnaXN0ZXIgLSByZWdpc3RlciB3LyBod21vbgogICogQGRldjogdGhlIGRldmljZSB0byByZWdpc3RlcgogICoKQEAgLTIxMyw2ICs3MjMsNDggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKTsKIAorLyoqCisgKiBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8gLSByZWdpc3RlciB3LyBod21vbgorICogQGRldjogdGhlIHBhcmVudCBkZXZpY2UKKyAqIEBuYW1lOiBod21vbiBuYW1lIGF0dHJpYnV0ZQorICogQGRydmRhdGE6IGRyaXZlciBkYXRhIHRvIGF0dGFjaCB0byBjcmVhdGVkIGRldmljZQorICogQGluZm86IFBvaW50ZXIgdG8gaHdtb24gY2hpcCBpbmZvcm1hdGlvbgorICogQGdyb3VwcyAtIHBvaW50ZXIgdG8gbGlzdCBvZiBkcml2ZXIgc3BlY2lmaWMgYXR0cmlidXRlIGdyb3VwcworICoKKyAqIFJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIG5ldyBkZXZpY2UuIFRoZSBuZXcgZGV2aWNlIGlzIGF1dG9tYXRpY2FsbHkKKyAqIHVucmVnaXN0ZXJlZCB3aXRoIHRoZSBwYXJlbnQgZGV2aWNlLgorICovCitzdHJ1Y3QgZGV2aWNlICoKK2Rldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgICB2b2lkICpkcnZkYXRhLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGh3bW9uX2NoaXBfaW5mbyAqY2hpcCwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKipncm91cHMpCit7CisJc3RydWN0IGRldmljZSAqKnB0ciwgKmh3ZGV2OworCisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJcHRyID0gZGV2cmVzX2FsbG9jKGRldm1faHdtb25fcmVsZWFzZSwgc2l6ZW9mKCpwdHIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXB0cikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlod2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8oZGV2LCBuYW1lLCBkcnZkYXRhLCBjaGlwLAorCQkJCQkJZ3JvdXBzKTsKKwlpZiAoSVNfRVJSKGh3ZGV2KSkKKwkJZ290byBlcnJvcjsKKworCSpwdHIgPSBod2RldjsKKwlkZXZyZXNfYWRkKGRldiwgcHRyKTsKKworCXJldHVybiBod2RldjsKKworZXJyb3I6CisJZGV2cmVzX2ZyZWUocHRyKTsKKwlyZXR1cm4gaHdkZXY7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8pOworCiBzdGF0aWMgaW50IGRldm1faHdtb25fbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpyZXMsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGRldmljZSAqKmh3ZGV2ID0gcmVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9pYm1wb3dlcm52LmMgYi9kcml2ZXJzL2h3bW9uL2libXBvd2VybnYuYwppbmRleCA1NWI1YThmLi42ZDJlNjYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2libXBvd2VybnYuYworKysgYi9kcml2ZXJzL2h3bW9uL2libXBvd2VybnYuYwpAQCAtMTQzLDEzICsxNDMsMTEgQEAKIAkJaWYgKGNwdWlkID49IDApCiAJCQkvKgogCQkJICogVGhlIGRpZ2l0YWwgdGhlcm1hbCBzZW5zb3JzIGFyZSBhc3NvY2lhdGVkCi0JCQkgKiB3aXRoIGEgY29yZS4gTGV0J3MgcHJpbnQgb3V0IHRoZSByYW5nZSBvZgotCQkJICogY3B1IGlkcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBoYXJkd2FyZQotCQkJICogdGhyZWFkcyBvZiB0aGUgY29yZS4KKwkJCSAqIHdpdGggYSBjb3JlLgogCQkJICovCiAJCQluICs9IHNucHJpbnRmKHNkYXRhLT5sYWJlbCArIG4sCi0JCQkJICAgICAgc2l6ZW9mKHNkYXRhLT5sYWJlbCkgLSBuLCAiICVkLSVkIiwKLQkJCQkgICAgICBjcHVpZCwgY3B1aWQgKyB0aHJlYWRzX3Blcl9jb3JlIC0gMSk7CisJCQkJICAgICAgc2l6ZW9mKHNkYXRhLT5sYWJlbCkgLSBuLCAiICVkIiwKKwkJCQkgICAgICBjcHVpZCk7CiAJCWVsc2UKIAkJCW4gKz0gc25wcmludGYoc2RhdGEtPmxhYmVsICsgbiwKIAkJCQkgICAgICBzaXplb2Yoc2RhdGEtPmxhYmVsKSAtIG4sICIgcGh5JWQiLCBpZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2lpb19od21vbi5jIGIvZHJpdmVycy9od21vbi9paW9faHdtb24uYwppbmRleCA4OTQ0OTg3Li5mNmE3NjY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2lpb19od21vbi5jCisrKyBiL2RyaXZlcnMvaHdtb24vaWlvX2h3bW9uLmMKQEAgLTczLDggKzczLDExIEBACiAJCW5hbWUgPSBkZXYtPm9mX25vZGUtPm5hbWU7CiAKIAljaGFubmVscyA9IGlpb19jaGFubmVsX2dldF9hbGwoZGV2KTsKLQlpZiAoSVNfRVJSKGNoYW5uZWxzKSkKKwlpZiAoSVNfRVJSKGNoYW5uZWxzKSkgeworCQlpZiAoUFRSX0VSUihjaGFubmVscykgPT0gLUVOT0RFVikKKwkJCXJldHVybiAtRVBST0JFX0RFRkVSOwogCQlyZXR1cm4gUFRSX0VSUihjaGFubmVscyk7CisJfQogCiAJc3QgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnN0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHN0ID09IE5VTEwpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaXQ4Ny5jIGIvZHJpdmVycy9od21vbi9pdDg3LmMKaW5kZXggNzMwZDg0MC4uYWQ4MmNiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9pdDg3LmMKKysrIGIvZHJpdmVycy9od21vbi9pdDg3LmMKQEAgLTQ5MSw3ICs0OTEsNyBAQAogc3RydWN0IGl0ODdfZGF0YSB7CiAJY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqZ3JvdXBzWzddOwogCWVudW0gY2hpcHMgdHlwZTsKLQl1MTYgZmVhdHVyZXM7CisJdTMyIGZlYXR1cmVzOwogCXU4IHBlY2lfbWFzazsKIAl1OCBvbGRfcGVjaV9tYXNrOwogCkBAIC0yMDExLDEwICsyMDExLDExIEBACiAJJnNlbnNvcl9kZXZfYXR0cl9pbjdfYmVlcC5kZXZfYXR0ci5hdHRyLAkvKiAzOSAqLwogCiAJJnNlbnNvcl9kZXZfYXR0cl9pbjhfaW5wdXQuZGV2X2F0dHIuYXR0ciwJLyogNDAgKi8KLQkmc2Vuc29yX2Rldl9hdHRyX2luOV9pbnB1dC5kZXZfYXR0ci5hdHRyLAkvKiA0MSAqLwotCSZzZW5zb3JfZGV2X2F0dHJfaW4xMF9pbnB1dC5kZXZfYXR0ci5hdHRyLAkvKiA0MSAqLwotCSZzZW5zb3JfZGV2X2F0dHJfaW4xMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAkvKiA0MSAqLwotCSZzZW5zb3JfZGV2X2F0dHJfaW4xMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAkvKiA0MSAqLworCSZzZW5zb3JfZGV2X2F0dHJfaW45X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjEwX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjExX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjEyX2lucHV0LmRldl9hdHRyLmF0dHIsCisJTlVMTAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaXQ4N19ncm91cF9pbiA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vamM0Mi5jIGIvZHJpdmVycy9od21vbi9qYzQyLmMKaW5kZXggOWQ1Zjg1Zi4uMWJmMjJlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9qYzQyLmMKKysrIGIvZHJpdmVycy9od21vbi9qYzQyLmMKQEAgLTI4LDcgKzI4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KLSNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KQEAgLTI1NCwxNzAgKzI1MywxNDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBzeXNmcyBmdW5jdGlvbnMgKi8KLQotc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCi0JCQkgY2hhciAqYnVmKQorc3RhdGljIGludCBqYzQyX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkgICAgIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyAqdmFsKQogewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKLQlzdHJ1Y3QgamM0Ml9kYXRhICpkYXRhID0gamM0Ml91cGRhdGVfZGV2aWNlKGRldik7Ci0JaWYgKElTX0VSUihkYXRhKSkKLQkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCi0JCSAgICAgICBqYzQyX3RlbXBfZnJvbV9yZWcoZGF0YS0+dGVtcFthdHRyLT5pbmRleF0pKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7CiAJc3RydWN0IGpjNDJfZGF0YSAqZGF0YSA9IGpjNDJfdXBkYXRlX2RldmljZShkZXYpOwogCWludCB0ZW1wLCBoeXN0OwogCiAJaWYgKElTX0VSUihkYXRhKSkKIAkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7CiAKLQl0ZW1wID0gamM0Ml90ZW1wX2Zyb21fcmVnKGRhdGEtPnRlbXBbYXR0ci0+aW5kZXhdKTsKLQloeXN0ID0gamM0Ml9oeXN0ZXJlc2lzWyhkYXRhLT5jb25maWcgJiBKQzQyX0NGR19IWVNUX01BU0spCi0JCQkgICAgICAgPj4gSkM0Ml9DRkdfSFlTVF9TSElGVF07Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRlbXAgLSBoeXN0KTsKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9uX3RlbXBfaW5wdXQ6CisJCSp2YWwgPSBqYzQyX3RlbXBfZnJvbV9yZWcoZGF0YS0+dGVtcFt0X2lucHV0XSk7CisJCXJldHVybiAwOworCWNhc2UgaHdtb25fdGVtcF9taW46CisJCSp2YWwgPSBqYzQyX3RlbXBfZnJvbV9yZWcoZGF0YS0+dGVtcFt0X21pbl0pOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3RlbXBfbWF4OgorCQkqdmFsID0gamM0Ml90ZW1wX2Zyb21fcmVnKGRhdGEtPnRlbXBbdF9tYXhdKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBod21vbl90ZW1wX2NyaXQ6CisJCSp2YWwgPSBqYzQyX3RlbXBfZnJvbV9yZWcoZGF0YS0+dGVtcFt0X2NyaXRdKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBod21vbl90ZW1wX21heF9oeXN0OgorCQl0ZW1wID0gamM0Ml90ZW1wX2Zyb21fcmVnKGRhdGEtPnRlbXBbdF9tYXhdKTsKKwkJaHlzdCA9IGpjNDJfaHlzdGVyZXNpc1soZGF0YS0+Y29uZmlnICYgSkM0Ml9DRkdfSFlTVF9NQVNLKQorCQkJCQkJPj4gSkM0Ml9DRkdfSFlTVF9TSElGVF07CisJCSp2YWwgPSB0ZW1wIC0gaHlzdDsKKwkJcmV0dXJuIDA7CisJY2FzZSBod21vbl90ZW1wX2NyaXRfaHlzdDoKKwkJdGVtcCA9IGpjNDJfdGVtcF9mcm9tX3JlZyhkYXRhLT50ZW1wW3RfY3JpdF0pOworCQloeXN0ID0gamM0Ml9oeXN0ZXJlc2lzWyhkYXRhLT5jb25maWcgJiBKQzQyX0NGR19IWVNUX01BU0spCisJCQkJCQk+PiBKQzQyX0NGR19IWVNUX1NISUZUXTsKKwkJKnZhbCA9IHRlbXAgLSBoeXN0OworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3RlbXBfbWluX2FsYXJtOgorCQkqdmFsID0gKGRhdGEtPnRlbXBbdF9pbnB1dF0gPj4gSkM0Ml9BTEFSTV9NSU5fQklUKSAmIDE7CisJCXJldHVybiAwOworCWNhc2UgaHdtb25fdGVtcF9tYXhfYWxhcm06CisJCSp2YWwgPSAoZGF0YS0+dGVtcFt0X2lucHV0XSA+PiBKQzQyX0FMQVJNX01BWF9CSVQpICYgMTsKKwkJcmV0dXJuIDA7CisJY2FzZSBod21vbl90ZW1wX2NyaXRfYWxhcm06CisJCSp2YWwgPSAoZGF0YS0+dGVtcFt0X2lucHV0XSA+PiBKQzQyX0FMQVJNX0NSSVRfQklUKSAmIDE7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNldF90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCi0JCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7Ci0Jc3RydWN0IGpjNDJfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCBlcnIsIHJldCA9IGNvdW50OwotCWludCBuciA9IGF0dHItPmluZGV4OwotCWxvbmcgdmFsOwotCi0JaWYgKGtzdHJ0b2woYnVmLCAxMCwgJnZhbCkgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JZGF0YS0+dGVtcFtucl0gPSBqYzQyX3RlbXBfdG9fcmVnKHZhbCwgZGF0YS0+ZXh0ZW5kZWQpOwotCWVyciA9IGkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoZGF0YS0+Y2xpZW50LCB0ZW1wX3JlZ3NbbnJdLAotCQkJCQkgICBkYXRhLT50ZW1wW25yXSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldCA9IGVycjsKLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogSkM0Mi40IGNvbXBsaWFudCBjaGlwcyBvbmx5IHN1cHBvcnQgZm91ciBoeXN0ZXJlc2lzIHZhbHVlcy4KLSAqIFBpY2sgYmVzdCBjaG9pY2UgYW5kIGdvIGZyb20gdGhlcmUuCi0gKi8KLXN0YXRpYyBzc2l6ZV90IHNldF90ZW1wX2NyaXRfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIGludCBqYzQyX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJICAgICAgdTMyIGF0dHIsIGludCBjaGFubmVsLCBsb25nIHZhbCkKIHsKIAlzdHJ1Y3QgamM0Ml9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JbG9uZyB2YWw7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKIAlpbnQgZGlmZiwgaHlzdDsKLQlpbnQgZXJyOwotCWludCByZXQgPSBjb3VudDsKKwlpbnQgcmV0OwogCi0JaWYgKGtzdHJ0b2woYnVmLCAxMCwgJnZhbCkgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKLQl2YWwgPSBjbGFtcF92YWwodmFsLCAoZGF0YS0+ZXh0ZW5kZWQgPyBKQzQyX1RFTVBfTUlOX0VYVEVOREVEIDoKLQkJCSAgICAgIEpDNDJfVEVNUF9NSU4pIC0gNjAwMCwgSkM0Ml9URU1QX01BWCk7Ci0JZGlmZiA9IGpjNDJfdGVtcF9mcm9tX3JlZyhkYXRhLT50ZW1wW3RfY3JpdF0pIC0gdmFsOwotCi0JaHlzdCA9IDA7Ci0JaWYgKGRpZmYgPiAwKSB7Ci0JCWlmIChkaWZmIDwgMjI1MCkKLQkJCWh5c3QgPSAxOwkvKiAxLjUgZGVncmVlcyBDICovCi0JCWVsc2UgaWYgKGRpZmYgPCA0NTAwKQotCQkJaHlzdCA9IDI7CS8qIDMuMCBkZWdyZWVzIEMgKi8KLQkJZWxzZQotCQkJaHlzdCA9IDM7CS8qIDYuMCBkZWdyZWVzIEMgKi8KKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9uX3RlbXBfbWluOgorCQlkYXRhLT50ZW1wW3RfbWluXSA9IGpjNDJfdGVtcF90b19yZWcodmFsLCBkYXRhLT5leHRlbmRlZCk7CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2xpZW50LCB0ZW1wX3JlZ3NbdF9taW5dLAorCQkJCQkJICAgZGF0YS0+dGVtcFt0X21pbl0pOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfbWF4OgorCQlkYXRhLT50ZW1wW3RfbWF4XSA9IGpjNDJfdGVtcF90b19yZWcodmFsLCBkYXRhLT5leHRlbmRlZCk7CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2xpZW50LCB0ZW1wX3JlZ3NbdF9tYXhdLAorCQkJCQkJICAgZGF0YS0+dGVtcFt0X21heF0pOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfY3JpdDoKKwkJZGF0YS0+dGVtcFt0X2NyaXRdID0gamM0Ml90ZW1wX3RvX3JlZyh2YWwsIGRhdGEtPmV4dGVuZGVkKTsKKwkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChjbGllbnQsIHRlbXBfcmVnc1t0X2NyaXRdLAorCQkJCQkJICAgZGF0YS0+dGVtcFt0X2NyaXRdKTsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX2NyaXRfaHlzdDoKKwkJLyoKKwkJICogSkM0Mi40IGNvbXBsaWFudCBjaGlwcyBvbmx5IHN1cHBvcnQgZm91ciBoeXN0ZXJlc2lzIHZhbHVlcy4KKwkJICogUGljayBiZXN0IGNob2ljZSBhbmQgZ28gZnJvbSB0aGVyZS4KKwkJICovCisJCXZhbCA9IGNsYW1wX3ZhbCh2YWwsIChkYXRhLT5leHRlbmRlZCA/IEpDNDJfVEVNUF9NSU5fRVhURU5ERUQKKwkJCQkJCSAgICAgOiBKQzQyX1RFTVBfTUlOKSAtIDYwMDAsCisJCQkJSkM0Ml9URU1QX01BWCk7CisJCWRpZmYgPSBqYzQyX3RlbXBfZnJvbV9yZWcoZGF0YS0+dGVtcFt0X2NyaXRdKSAtIHZhbDsKKwkJaHlzdCA9IDA7CisJCWlmIChkaWZmID4gMCkgeworCQkJaWYgKGRpZmYgPCAyMjUwKQorCQkJCWh5c3QgPSAxOwkvKiAxLjUgZGVncmVlcyBDICovCisJCQllbHNlIGlmIChkaWZmIDwgNDUwMCkKKwkJCQloeXN0ID0gMjsJLyogMy4wIGRlZ3JlZXMgQyAqLworCQkJZWxzZQorCQkJCWh5c3QgPSAzOwkvKiA2LjAgZGVncmVlcyBDICovCisJCX0KKwkJZGF0YS0+Y29uZmlnID0gKGRhdGEtPmNvbmZpZyAmIH5KQzQyX0NGR19IWVNUX01BU0spIHwKKwkJCQkoaHlzdCA8PCBKQzQyX0NGR19IWVNUX1NISUZUKTsKKwkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChkYXRhLT5jbGllbnQsCisJCQkJCQkgICBKQzQyX1JFR19DT05GSUcsCisJCQkJCQkgICBkYXRhLT5jb25maWcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CiAJfQogCi0JbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCWRhdGEtPmNvbmZpZyA9IChkYXRhLT5jb25maWcgJiB+SkM0Ml9DRkdfSFlTVF9NQVNLKQotCSAgfCAoaHlzdCA8PCBKQzQyX0NGR19IWVNUX1NISUZUKTsKLQllcnIgPSBpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGRhdGEtPmNsaWVudCwgSkM0Ml9SRUdfQ09ORklHLAotCQkJCQkgICBkYXRhLT5jb25maWcpOwotCWlmIChlcnIgPCAwKQotCQlyZXQgPSBlcnI7CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyB1bW9kZV90IGpjNDJfaXNfdmlzaWJsZShjb25zdCB2b2lkICpfZGF0YSwgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJCSAgICAgICB1MzIgYXR0ciwgaW50IGNoYW5uZWwpCiB7Ci0JdTE2IGJpdCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7Ci0Jc3RydWN0IGpjNDJfZGF0YSAqZGF0YSA9IGpjNDJfdXBkYXRlX2RldmljZShkZXYpOwotCXUxNiB2YWw7Ci0KLQlpZiAoSVNfRVJSKGRhdGEpKQotCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKLQotCXZhbCA9IGRhdGEtPnRlbXBbdF9pbnB1dF07Ci0JaWYgKGJpdCAhPSBKQzQyX0FMQVJNX0NSSVRfQklUICYmIChkYXRhLT5jb25maWcgJiBKQzQyX0NGR19DUklUX09OTFkpKQotCQl2YWwgPSAwOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCAodmFsID4+IGJpdCkgJiAxKTsKLX0KLQotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCB0X2lucHV0KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfY3JpdCwgU19JUlVHTywgc2hvd190ZW1wLCBzZXRfdGVtcCwgdF9jcml0KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWluLCBTX0lSVUdPLCBzaG93X3RlbXAsIHNldF90ZW1wLCB0X21pbik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21heCwgU19JUlVHTywgc2hvd190ZW1wLCBzZXRfdGVtcCwgdF9tYXgpOwotCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2NyaXRfaHlzdCwgU19JUlVHTywgc2hvd190ZW1wX2h5c3QsCi0JCQkgIHNldF90ZW1wX2NyaXRfaHlzdCwgdF9jcml0KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWF4X2h5c3QsIFNfSVJVR08sIHNob3dfdGVtcF9oeXN0LCBOVUxMLCB0X21heCk7Ci0KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfY3JpdF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwKLQkJCSAgSkM0Ml9BTEFSTV9DUklUX0JJVCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21pbl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwKLQkJCSAgSkM0Ml9BTEFSTV9NSU5fQklUKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWF4X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLAotCQkJICBKQzQyX0FMQVJNX01BWF9CSVQpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqamM0Ml9hdHRyaWJ1dGVzW10gPSB7Ci0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWluLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXguZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2NyaXRfaHlzdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4X2h5c3QuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2NyaXRfYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4X2FsYXJtLmRldl9hdHRyLmF0dHIsCi0JTlVMTAotfTsKLQotc3RhdGljIHVtb2RlX3QgamM0Ml9hdHRyaWJ1dGVfbW9kZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGludCBpbmRleCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7Ci0Jc3RydWN0IGpjNDJfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWNvbnN0IHN0cnVjdCBqYzQyX2RhdGEgKmRhdGEgPSBfZGF0YTsKIAl1bnNpZ25lZCBpbnQgY29uZmlnID0gZGF0YS0+Y29uZmlnOwotCWJvb2wgcmVhZG9ubHk7CisJdW1vZGVfdCBtb2RlID0gU19JUlVHTzsKIAotCWlmIChhdHRyID09ICZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdC5kZXZfYXR0ci5hdHRyKQotCQlyZWFkb25seSA9IGNvbmZpZyAmIEpDNDJfQ0ZHX1RDUklUX0xPQ0s7Ci0JZWxzZSBpZiAoYXR0ciA9PSAmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21pbi5kZXZfYXR0ci5hdHRyIHx8Ci0JCSBhdHRyID09ICZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4LmRldl9hdHRyLmF0dHIpCi0JCXJlYWRvbmx5ID0gY29uZmlnICYgSkM0Ml9DRkdfRVZFTlRfTE9DSzsKLQllbHNlIGlmIChhdHRyID09ICZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdF9oeXN0LmRldl9hdHRyLmF0dHIpCi0JCXJlYWRvbmx5ID0gY29uZmlnICYgKEpDNDJfQ0ZHX0VWRU5UX0xPQ0sgfCBKQzQyX0NGR19UQ1JJVF9MT0NLKTsKLQllbHNlCi0JCXJlYWRvbmx5ID0gdHJ1ZTsKLQotCXJldHVybiBTX0lSVUdPIHwgKHJlYWRvbmx5ID8gMCA6IFNfSVdVU1IpOworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fdGVtcF9taW46CisJY2FzZSBod21vbl90ZW1wX21heDoKKwkJaWYgKCEoY29uZmlnICYgSkM0Ml9DRkdfRVZFTlRfTE9DSykpCisJCQltb2RlIHw9IFNfSVdVU1I7CisJCWJyZWFrOworCWNhc2UgaHdtb25fdGVtcF9jcml0OgorCQlpZiAoIShjb25maWcgJiBKQzQyX0NGR19UQ1JJVF9MT0NLKSkKKwkJCW1vZGUgfD0gU19JV1VTUjsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX2NyaXRfaHlzdDoKKwkJaWYgKCEoY29uZmlnICYgKEpDNDJfQ0ZHX0VWRU5UX0xPQ0sgfCBKQzQyX0NGR19UQ1JJVF9MT0NLKSkpCisJCQltb2RlIHw9IFNfSVdVU1I7CisJCWJyZWFrOworCWNhc2UgaHdtb25fdGVtcF9pbnB1dDoKKwljYXNlIGh3bW9uX3RlbXBfbWF4X2h5c3Q6CisJY2FzZSBod21vbl90ZW1wX21pbl9hbGFybToKKwljYXNlIGh3bW9uX3RlbXBfbWF4X2FsYXJtOgorCWNhc2UgaHdtb25fdGVtcF9jcml0X2FsYXJtOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQltb2RlID0gMDsKKwkJYnJlYWs7CisJfQorCXJldHVybiBtb2RlOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBqYzQyX2dyb3VwID0gewotCS5hdHRycyA9IGpjNDJfYXR0cmlidXRlcywKLQkuaXNfdmlzaWJsZSA9IGpjNDJfYXR0cmlidXRlX21vZGUsCi19OwotX19BVFRSSUJVVEVfR1JPVVBTKGpjNDIpOwotCiAvKiBSZXR1cm4gMCBpZiBkZXRlY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgLUVOT0RFViBvdGhlcndpc2UgKi8KIHN0YXRpYyBpbnQgamM0Ml9kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQogewpAQCAtNDUwLDYgKzQyNywzNCBAQAogCXJldHVybiAtRU5PREVWOwogfQogCitzdGF0aWMgY29uc3QgdTMyIGpjNDJfdGVtcF9jb25maWdbXSA9IHsKKwlIV01PTl9UX0lOUFVUIHwgSFdNT05fVF9NSU4gfCBIV01PTl9UX01BWCB8IEhXTU9OX1RfQ1JJVCB8CisJSFdNT05fVF9NQVhfSFlTVCB8IEhXTU9OX1RfQ1JJVF9IWVNUIHwKKwlIV01PTl9UX01JTl9BTEFSTSB8IEhXTU9OX1RfTUFYX0FMQVJNIHwgSFdNT05fVF9DUklUX0FMQVJNLAorCTAKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIGpjNDJfdGVtcCA9IHsKKwkudHlwZSA9IGh3bW9uX3RlbXAsCisJLmNvbmZpZyA9IGpjNDJfdGVtcF9jb25maWcsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyAqamM0Ml9pbmZvW10gPSB7CisJJmpjNDJfdGVtcCwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX29wcyBqYzQyX2h3bW9uX29wcyA9IHsKKwkuaXNfdmlzaWJsZSA9IGpjNDJfaXNfdmlzaWJsZSwKKwkucmVhZCA9IGpjNDJfcmVhZCwKKwkud3JpdGUgPSBqYzQyX3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGlwX2luZm8gamM0Ml9jaGlwX2luZm8gPSB7CisJLm9wcyA9ICZqYzQyX2h3bW9uX29wcywKKwkuaW5mbyA9IGpjNDJfaW5mbywKK307CisKIHN0YXRpYyBpbnQgamM0Ml9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OwpAQCAtNDgyLDkgKzQ4Nyw5IEBACiAJfQogCWRhdGEtPmNvbmZpZyA9IGNvbmZpZzsKIAotCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKGRldiwgY2xpZW50LT5uYW1lLAotCQkJCQkJCSAgIGRhdGEsCi0JCQkJCQkJICAgamM0Ml9ncm91cHMpOworCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfaW5mbyhkZXYsIGNsaWVudC0+bmFtZSwKKwkJCQkJCQkgZGF0YSwgJmpjNDJfY2hpcF9pbmZvLAorCQkJCQkJCSBOVUxMKTsKIAlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGh3bW9uX2Rldik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG03NS5jIGIvZHJpdmVycy9od21vbi9sbTc1LmMKaW5kZXggOTJmOWQ0Yi4uZWZmM2IyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTc1LmMKKysrIGIvZHJpdmVycy9od21vbi9sbTc1LmMKQEAgLTI4LDcgKzI4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L3RoZXJtYWwuaD4KICNpbmNsdWRlICJsbTc1LmgiCiAKIApAQCAtODgsNTYgKzg3LDc1IEBACiAJcmV0dXJuICgodGVtcCA+PiAoMTYgLSByZXNvbHV0aW9uKSkgKiAxMDAwKSA+PiAocmVzb2x1dGlvbiAtIDgpOwogfQogCi0vKiBzeXNmcyBhdHRyaWJ1dGVzIGZvciBod21vbiAqLwotCi1zdGF0aWMgaW50IGxtNzVfcmVhZF90ZW1wKHZvaWQgKmRldiwgaW50ICp0ZW1wKQorc3RhdGljIGludCBsbTc1X3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkgICAgIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyAqdmFsKQogewogCXN0cnVjdCBsbTc1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQl1bnNpZ25lZCBpbnQgX3RlbXA7Ci0JaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgcmVndmFsOworCWludCBlcnIsIHJlZzsKIAotCWVyciA9IHJlZ21hcF9yZWFkKGRhdGEtPnJlZ21hcCwgTE03NV9SRUdfVEVNUCwgJl90ZW1wKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIGh3bW9uX2NoaXA6CisJCXN3aXRjaCAoYXR0cikgeworCQljYXNlIGh3bW9uX2NoaXBfdXBkYXRlX2ludGVydmFsOgorCQkJKnZhbCA9IGRhdGEtPnNhbXBsZV90aW1lOworCQkJYnJlYWs7OworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wOgorCQlzd2l0Y2ggKGF0dHIpIHsKKwkJY2FzZSBod21vbl90ZW1wX2lucHV0OgorCQkJcmVnID0gTE03NV9SRUdfVEVNUDsKKwkJCWJyZWFrOworCQljYXNlIGh3bW9uX3RlbXBfbWF4OgorCQkJcmVnID0gTE03NV9SRUdfTUFYOworCQkJYnJlYWs7CisJCWNhc2UgaHdtb25fdGVtcF9tYXhfaHlzdDoKKwkJCXJlZyA9IExNNzVfUkVHX0hZU1Q7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWVyciA9IHJlZ21hcF9yZWFkKGRhdGEtPnJlZ21hcCwgcmVnLCAmcmVndmFsKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOwogCi0JKnRlbXAgPSBsbTc1X3JlZ190b19tYyhfdGVtcCwgZGF0YS0+cmVzb2x1dGlvbik7Ci0KKwkJKnZhbCA9IGxtNzVfcmVnX3RvX21jKHJlZ3ZhbCwgZGF0YS0+cmVzb2x1dGlvbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAotCQkJIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgbG03NV93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCSAgICAgIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyB0ZW1wKQogewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7CiAJc3RydWN0IGxtNzVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXVuc2lnbmVkIGludCB0ZW1wID0gMDsKLQlpbnQgZXJyOwotCi0JZXJyID0gcmVnbWFwX3JlYWQoZGF0YS0+cmVnbWFwLCBhdHRyLT5pbmRleCwgJnRlbXApOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBsbTc1X3JlZ190b19tYyh0ZW1wLCBkYXRhLT5yZXNvbHV0aW9uKSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNldF90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAotCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKLQlzdHJ1Y3QgbG03NV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JbG9uZyB0ZW1wOwotCWludCBlcnJvcjsKIAl1OCByZXNvbHV0aW9uOworCWludCByZWc7CiAKLQllcnJvciA9IGtzdHJ0b2woYnVmLCAxMCwgJnRlbXApOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOworCWlmICh0eXBlICE9IGh3bW9uX3RlbXApCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl90ZW1wX21heDoKKwkJcmVnID0gTE03NV9SRUdfTUFYOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfbWF4X2h5c3Q6CisJCXJlZyA9IExNNzVfUkVHX0hZU1Q7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCS8qCiAJICogUmVzb2x1dGlvbiBvZiBsaW1pdCByZWdpc3RlcnMgaXMgYXNzdW1lZCB0byBiZSB0aGUgc2FtZSBhcyB0aGUKIAkgKiB0ZW1wZXJhdHVyZSBpbnB1dCByZWdpc3RlciByZXNvbHV0aW9uIHVubGVzcyBnaXZlbiBleHBsaWNpdGx5LgogCSAqLwotCWlmIChhdHRyLT5pbmRleCAmJiBkYXRhLT5yZXNvbHV0aW9uX2xpbWl0cykKKwlpZiAoZGF0YS0+cmVzb2x1dGlvbl9saW1pdHMpCiAJCXJlc29sdXRpb24gPSBkYXRhLT5yZXNvbHV0aW9uX2xpbWl0czsKIAllbHNlCiAJCXJlc29sdXRpb24gPSBkYXRhLT5yZXNvbHV0aW9uOwpAQCAtMTQ1LDQ2ICsxNjMsNzggQEAKIAl0ZW1wID0gY2xhbXBfdmFsKHRlbXAsIExNNzVfVEVNUF9NSU4sIExNNzVfVEVNUF9NQVgpOwogCXRlbXAgPSBESVZfUk9VTkRfQ0xPU0VTVCh0ZW1wICA8PCAocmVzb2x1dGlvbiAtIDgpLAogCQkJCSAxMDAwKSA8PCAoMTYgLSByZXNvbHV0aW9uKTsKLQllcnJvciA9IHJlZ21hcF93cml0ZShkYXRhLT5yZWdtYXAsIGF0dHItPmluZGV4LCB0ZW1wKTsKLQlpZiAoZXJyb3IgPCAwKQotCQlyZXR1cm4gZXJyb3I7CiAKLQlyZXR1cm4gY291bnQ7CisJcmV0dXJuIHJlZ21hcF93cml0ZShkYXRhLT5yZWdtYXAsIHJlZywgdGVtcCk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfdXBkYXRlX2ludGVydmFsKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLCBjaGFyICpidWYpCitzdGF0aWMgdW1vZGVfdCBsbTc1X2lzX3Zpc2libGUoY29uc3Qgdm9pZCAqZGF0YSwgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJCSAgICAgICB1MzIgYXR0ciwgaW50IGNoYW5uZWwpCiB7Ci0Jc3RydWN0IGxtNzVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPnNhbXBsZV90aW1lKTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIGh3bW9uX2NoaXA6CisJCXN3aXRjaCAoYXR0cikgeworCQljYXNlIGh3bW9uX2NoaXBfdXBkYXRlX2ludGVydmFsOgorCQkJcmV0dXJuIFNfSVJVR087CisJCX0KKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wOgorCQlzd2l0Y2ggKGF0dHIpIHsKKwkJY2FzZSBod21vbl90ZW1wX2lucHV0OgorCQkJcmV0dXJuIFNfSVJVR087CisJCWNhc2UgaHdtb25fdGVtcF9tYXg6CisJCWNhc2UgaHdtb25fdGVtcF9tYXhfaHlzdDoKKwkJCXJldHVybiBTX0lSVUdPIHwgU19JV1VTUjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywKLQkJCXNob3dfdGVtcCwgc2V0X3RlbXAsIExNNzVfUkVHX01BWCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21heF9oeXN0LCBTX0lXVVNSIHwgU19JUlVHTywKLQkJCXNob3dfdGVtcCwgc2V0X3RlbXAsIExNNzVfUkVHX0hZU1QpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCBMTTc1X1JFR19URU1QKTsKLXN0YXRpYyBERVZJQ0VfQVRUUih1cGRhdGVfaW50ZXJ2YWwsIFNfSVJVR08sIHNob3dfdXBkYXRlX2ludGVydmFsLCBOVUxMKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmxtNzVfYXR0cnNbXSA9IHsKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXguZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21heF9oeXN0LmRldl9hdHRyLmF0dHIsCi0JJmRldl9hdHRyX3VwZGF0ZV9pbnRlcnZhbC5hdHRyLAotCi0JTlVMTAotfTsKLUFUVFJJQlVURV9HUk9VUFMobG03NSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGhlcm1hbF96b25lX29mX2RldmljZV9vcHMgbG03NV9vZl90aGVybWFsX29wcyA9IHsKLQkuZ2V0X3RlbXAgPSBsbTc1X3JlYWRfdGVtcCwKLX07Ci0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKiBkZXZpY2UgcHJvYmUgYW5kIHJlbW92YWwgKi8KIAorLyogY2hpcCBjb25maWd1cmF0aW9uICovCisKK3N0YXRpYyBjb25zdCB1MzIgbG03NV9jaGlwX2NvbmZpZ1tdID0geworCUhXTU9OX0NfUkVHSVNURVJfVFogfCBIV01PTl9DX1VQREFURV9JTlRFUlZBTCwKKwkwCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyBsbTc1X2NoaXAgPSB7CisJLnR5cGUgPSBod21vbl9jaGlwLAorCS5jb25maWcgPSBsbTc1X2NoaXBfY29uZmlnLAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBsbTc1X3RlbXBfY29uZmlnW10gPSB7CisJSFdNT05fVF9JTlBVVCB8IEhXTU9OX1RfTUFYIHwgSFdNT05fVF9NQVhfSFlTVCwKKwkwCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyBsbTc1X3RlbXAgPSB7CisJLnR5cGUgPSBod21vbl90ZW1wLAorCS5jb25maWcgPSBsbTc1X3RlbXBfY29uZmlnLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gKmxtNzVfaW5mb1tdID0geworCSZsbTc1X2NoaXAsCisJJmxtNzVfdGVtcCwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX29wcyBsbTc1X2h3bW9uX29wcyA9IHsKKwkuaXNfdmlzaWJsZSA9IGxtNzVfaXNfdmlzaWJsZSwKKwkucmVhZCA9IGxtNzVfcmVhZCwKKwkud3JpdGUgPSBsbTc1X3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGlwX2luZm8gbG03NV9jaGlwX2luZm8gPSB7CisJLm9wcyA9ICZsbTc1X2h3bW9uX29wcywKKwkuaW5mbyA9IGxtNzVfaW5mbywKK307CisKIHN0YXRpYyBib29sIGxtNzVfaXNfd3JpdGVhYmxlX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCiB7CiAJcmV0dXJuIHJlZyAhPSBMTTc1X1JFR19URU1QOwpAQCAtMzM3LDE1ICszODcsMTIgQEAKIAogCWRldl9kYmcoZGV2LCAiQ29uZmlnICUwMnhcbiIsIG5ldyk7CiAKLQlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsIGNsaWVudC0+bmFtZSwKLQkJCQkJCQkgICBkYXRhLCBsbTc1X2dyb3Vwcyk7CisJaHdtb25fZGV2ID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvKGRldiwgY2xpZW50LT5uYW1lLAorCQkJCQkJCSBkYXRhLCAmbG03NV9jaGlwX2luZm8sCisJCQkJCQkJIE5VTEwpOwogCWlmIChJU19FUlIoaHdtb25fZGV2KSkKIAkJcmV0dXJuIFBUUl9FUlIoaHdtb25fZGV2KTsKIAotCWRldm1fdGhlcm1hbF96b25lX29mX3NlbnNvcl9yZWdpc3Rlcihod21vbl9kZXYsIDAsCi0JCQkJCSAgICAgaHdtb25fZGV2LAotCQkJCQkgICAgICZsbTc1X29mX3RoZXJtYWxfb3BzKTsKLQogCWRldl9pbmZvKGRldiwgIiVzOiBzZW5zb3IgJyVzJ1xuIiwgZGV2X25hbWUoaHdtb25fZGV2KSwgY2xpZW50LT5uYW1lKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTkwLmMgYi9kcml2ZXJzL2h3bW9uL2xtOTAuYwppbmRleCA0OTZlNzcxLi4zMjJlZDkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtOTAuYworKysgYi9kcml2ZXJzL2h3bW9uL2xtOTAuYwpAQCAtODksNyArODksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9od21vbi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CkBAIC0zMjYsNyArMzI1LDcgQEAKIAkJLmFsZXJ0X2FsYXJtcyA9IDB4N2MsCiAJCS5tYXhfY29udnJhdGUgPSA5LAogCQkucmVnX2xvY2FsX2V4dCA9IFRNUDQ1MV9SRUdfUl9MT0NBTF9URU1QTCwKLQl9CisJfSwKIH07CiAKIC8qCkBAIC0zNjUsNyArMzY0LDEwIEBACiAKIHN0cnVjdCBsbTkwX2RhdGEgewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7Ci0JY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqZ3JvdXBzWzZdOworCXUzMiBjaGFubmVsX2NvbmZpZ1s0XTsKKwlzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIHRlbXBfaW5mbzsKKwljb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvICppbmZvWzNdOworCXN0cnVjdCBod21vbl9jaGlwX2luZm8gY2hpcDsKIAlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CiAJYm9vbCB2YWxpZDsJCS8qIHRydWUgaWYgcmVnaXN0ZXIgdmFsdWVzIGFyZSB2YWxpZCAqLwogCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOyAvKiBpbiBqaWZmaWVzICovCkBAIC00ODksMTEgKzQ5MSwxMSBAQAogICogY2xpZW50LT51cGRhdGVfbG9jayBtdXN0IGJlIGhlbGQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gKHVubGVzcyB3ZSBhcmUKICAqIGluIGRldGVjdGlvbiBvciBpbml0aWFsaXphdGlvbiBzdGVwcykuCiAgKi8KLXN0YXRpYyB2b2lkIGxtOTBfc2V0X2NvbnZyYXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBsbTkwX2RhdGEgKmRhdGEsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgaW50ZXJ2YWwpCitzdGF0aWMgaW50IGxtOTBfc2V0X2NvbnZyYXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBsbTkwX2RhdGEgKmRhdGEsCisJCQkgICAgIHVuc2lnbmVkIGludCBpbnRlcnZhbCkKIHsKLQlpbnQgaTsKIAl1bnNpZ25lZCBpbnQgdXBkYXRlX2ludGVydmFsOworCWludCBpLCBlcnI7CiAKIAkvKiBTaGlmdCBjYWxjdWxhdGlvbnMgdG8gYXZvaWQgcm91bmRpbmcgZXJyb3JzICovCiAJaW50ZXJ2YWwgPDw9IDY7CkBAIC01MDQsOCArNTA2LDkgQEAKIAkJaWYgKGludGVydmFsID49IHVwZGF0ZV9pbnRlcnZhbCAqIDMgLyA0KQogCQkJYnJlYWs7CiAKLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05MF9SRUdfV19DT05WUkFURSwgaSk7CisJZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTBfUkVHX1dfQ09OVlJBVEUsIGkpOwogCWRhdGEtPnVwZGF0ZV9pbnRlcnZhbCA9IERJVl9ST1VORF9DTE9TRVNUKHVwZGF0ZV9pbnRlcnZhbCwgNjQpOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgbG05MF91cGRhdGVfbGltaXRzKHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTYwNCwxOSArNjA3LDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbG05MF9kYXRhICpsbTkwX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBsbTkwX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCXVuc2lnbmVkIGxvbmcgbmV4dF91cGRhdGU7Ci0JaW50IHZhbCA9IDA7Ci0KLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJaW50IHZhbDsKIAogCWlmICghZGF0YS0+dmFsaWQpIHsKIAkJdmFsID0gbG05MF91cGRhdGVfbGltaXRzKGRldik7CiAJCWlmICh2YWwgPCAwKQotCQkJZ290byBlcnJvcjsKKwkJCXJldHVybiB2YWw7CiAJfQogCiAJbmV4dF91cGRhdGUgPSBkYXRhLT5sYXN0X3VwZGF0ZWQgKwpAQCAtNjI4LDUzICs2MjksNTUgQEAKIAogCQl2YWwgPSBsbTkwX3JlYWRfcmVnKGNsaWVudCwgTE05MF9SRUdfUl9MT0NBTF9MT1cpOwogCQlpZiAodmFsIDwgMCkKLQkJCWdvdG8gZXJyb3I7CisJCQlyZXR1cm4gdmFsOwogCQlkYXRhLT50ZW1wOFtMT0NBTF9MT1ddID0gdmFsOwogCiAJCXZhbCA9IGxtOTBfcmVhZF9yZWcoY2xpZW50LCBMTTkwX1JFR19SX0xPQ0FMX0hJR0gpOwogCQlpZiAodmFsIDwgMCkKLQkJCWdvdG8gZXJyb3I7CisJCQlyZXR1cm4gdmFsOwogCQlkYXRhLT50ZW1wOFtMT0NBTF9ISUdIXSA9IHZhbDsKIAogCQlpZiAoZGF0YS0+cmVnX2xvY2FsX2V4dCkgewogCQkJdmFsID0gbG05MF9yZWFkMTYoY2xpZW50LCBMTTkwX1JFR19SX0xPQ0FMX1RFTVAsCiAJCQkJCSAgZGF0YS0+cmVnX2xvY2FsX2V4dCk7CiAJCQlpZiAodmFsIDwgMCkKLQkJCQlnb3RvIGVycm9yOworCQkJCXJldHVybiB2YWw7CiAJCQlkYXRhLT50ZW1wMTFbTE9DQUxfVEVNUF0gPSB2YWw7CiAJCX0gZWxzZSB7CiAJCQl2YWwgPSBsbTkwX3JlYWRfcmVnKGNsaWVudCwgTE05MF9SRUdfUl9MT0NBTF9URU1QKTsKIAkJCWlmICh2YWwgPCAwKQotCQkJCWdvdG8gZXJyb3I7CisJCQkJcmV0dXJuIHZhbDsKIAkJCWRhdGEtPnRlbXAxMVtMT0NBTF9URU1QXSA9IHZhbCA8PCA4OwogCQl9CiAJCXZhbCA9IGxtOTBfcmVhZDE2KGNsaWVudCwgTE05MF9SRUdfUl9SRU1PVEVfVEVNUEgsCiAJCQkJICBMTTkwX1JFR19SX1JFTU9URV9URU1QTCk7CiAJCWlmICh2YWwgPCAwKQotCQkJZ290byBlcnJvcjsKKwkJCXJldHVybiB2YWw7CiAJCWRhdGEtPnRlbXAxMVtSRU1PVEVfVEVNUF0gPSB2YWw7CiAKIAkJdmFsID0gbG05MF9yZWFkX3JlZyhjbGllbnQsIExNOTBfUkVHX1JfU1RBVFVTKTsKIAkJaWYgKHZhbCA8IDApCi0JCQlnb3RvIGVycm9yOworCQkJcmV0dXJuIHZhbDsKIAkJZGF0YS0+YWxhcm1zID0gdmFsOwkvKiBsb3dlciA4IGJpdCBvZiBhbGFybXMgKi8KIAogCQlpZiAoZGF0YS0+a2luZCA9PSBtYXg2Njk2KSB7CiAJCQl2YWwgPSBsbTkwX3NlbGVjdF9yZW1vdGVfY2hhbm5lbChjbGllbnQsIGRhdGEsIDEpOwogCQkJaWYgKHZhbCA8IDApCi0JCQkJZ290byBlcnJvcjsKKwkJCQlyZXR1cm4gdmFsOwogCiAJCQl2YWwgPSBsbTkwX3JlYWQxNihjbGllbnQsIExNOTBfUkVHX1JfUkVNT1RFX1RFTVBILAogCQkJCQkgIExNOTBfUkVHX1JfUkVNT1RFX1RFTVBMKTsKLQkJCWlmICh2YWwgPCAwKQotCQkJCWdvdG8gZXJyb3I7CisJCQlpZiAodmFsIDwgMCkgeworCQkJCWxtOTBfc2VsZWN0X3JlbW90ZV9jaGFubmVsKGNsaWVudCwgZGF0YSwgMCk7CisJCQkJcmV0dXJuIHZhbDsKKwkJCX0KIAkJCWRhdGEtPnRlbXAxMVtSRU1PVEUyX1RFTVBdID0gdmFsOwogCiAJCQlsbTkwX3NlbGVjdF9yZW1vdGVfY2hhbm5lbChjbGllbnQsIGRhdGEsIDApOwogCiAJCQl2YWwgPSBsbTkwX3JlYWRfcmVnKGNsaWVudCwgTUFYNjY5Nl9SRUdfUl9TVEFUVVMyKTsKIAkJCWlmICh2YWwgPCAwKQotCQkJCWdvdG8gZXJyb3I7CisJCQkJcmV0dXJuIHZhbDsKIAkJCWRhdGEtPmFsYXJtcyB8PSB2YWwgPDwgODsKIAkJfQogCkBAIC02ODYsNyArNjg5LDcgQEAKIAkJICAgICEoZGF0YS0+YWxhcm1zICYgZGF0YS0+YWxlcnRfYWxhcm1zKSkgewogCQkJdmFsID0gbG05MF9yZWFkX3JlZyhjbGllbnQsIExNOTBfUkVHX1JfQ09ORklHMSk7CiAJCQlpZiAodmFsIDwgMCkKLQkJCQlnb3RvIGVycm9yOworCQkJCXJldHVybiB2YWw7CiAKIAkJCWlmICh2YWwgJiAweDgwKSB7CiAJCQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJSZS1lbmFibGluZyBBTEVSVCNcbiIpOwpAQCAtNzAwLDEzICs3MDMsNyBAQAogCQlkYXRhLT52YWxpZCA9IHRydWU7CiAJfQogCi1lcnJvcjoKLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQotCWlmICh2YWwgPCAwKQotCQlyZXR1cm4gRVJSX1BUUih2YWwpOwotCi0JcmV0dXJuIGRhdGE7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC04MzIsNDIyICs4MjksMTIgQEAKIAlyZXR1cm4gKHZhbCArIDEyNSkgLyAyNTAgKiA2NDsKIH0KIAotLyoKLSAqIFN5c2ZzIHN0dWZmCi0gKi8KLQotc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wOChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAotCQkJICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOwotCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGEgPSBsbTkwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgdGVtcDsKLQotCWlmIChJU19FUlIoZGF0YSkpCi0JCXJldHVybiBQVFJfRVJSKGRhdGEpOwotCi0JaWYgKGRhdGEtPmtpbmQgPT0gYWR0NzQ2MSB8fCBkYXRhLT5raW5kID09IHRtcDQ1MSkKLQkJdGVtcCA9IHRlbXBfZnJvbV91OF9hZHQ3NDYxKGRhdGEsIGRhdGEtPnRlbXA4W2F0dHItPmluZGV4XSk7Ci0JZWxzZSBpZiAoZGF0YS0+a2luZCA9PSBtYXg2NjQ2KQotCQl0ZW1wID0gdGVtcF9mcm9tX3U4KGRhdGEtPnRlbXA4W2F0dHItPmluZGV4XSk7Ci0JZWxzZQotCQl0ZW1wID0gdGVtcF9mcm9tX3M4KGRhdGEtPnRlbXA4W2F0dHItPmluZGV4XSk7Ci0KLQkvKiArMTYgZGVncmVlcyBvZmZzZXQgZm9yIHRlbXAyIGZvciB0aGUgTE05OSAqLwotCWlmIChkYXRhLT5raW5kID09IGxtOTkgJiYgYXR0ci0+aW5kZXggPT0gMykKLQkJdGVtcCArPSAxNjAwMDsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0ZW1wKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2V0X3RlbXA4KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCi0JCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RhdGljIGNvbnN0IHU4IHJlZ1tURU1QOF9SRUdfTlVNXSA9IHsKLQkJTE05MF9SRUdfV19MT0NBTF9MT1csCi0JCUxNOTBfUkVHX1dfTE9DQUxfSElHSCwKLQkJTE05MF9SRUdfV19MT0NBTF9DUklULAotCQlMTTkwX1JFR19XX1JFTU9URV9DUklULAotCQlNQVg2NjU5X1JFR19XX0xPQ0FMX0VNRVJHLAotCQlNQVg2NjU5X1JFR19XX1JFTU9URV9FTUVSRywKLQkJTE05MF9SRUdfV19SRU1PVEVfQ1JJVCwKLQkJTUFYNjY1OV9SRUdfV19SRU1PVEVfRU1FUkcsCi0JfTsKLQotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKLQlzdHJ1Y3QgbG05MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKLQlpbnQgbnIgPSBhdHRyLT5pbmRleDsKLQlsb25nIHZhbDsKLQlpbnQgZXJyOwotCi0JZXJyID0ga3N0cnRvbChidWYsIDEwLCAmdmFsKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCS8qICsxNiBkZWdyZWVzIG9mZnNldCBmb3IgdGVtcDIgZm9yIHRoZSBMTTk5ICovCi0JaWYgKGRhdGEtPmtpbmQgPT0gbG05OSAmJiBhdHRyLT5pbmRleCA9PSAzKQotCQl2YWwgLT0gMTYwMDA7Ci0KLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JaWYgKGRhdGEtPmtpbmQgPT0gYWR0NzQ2MSB8fCBkYXRhLT5raW5kID09IHRtcDQ1MSkKLQkJZGF0YS0+dGVtcDhbbnJdID0gdGVtcF90b191OF9hZHQ3NDYxKGRhdGEsIHZhbCk7Ci0JZWxzZSBpZiAoZGF0YS0+a2luZCA9PSBtYXg2NjQ2KQotCQlkYXRhLT50ZW1wOFtucl0gPSB0ZW1wX3RvX3U4KHZhbCk7Ci0JZWxzZQotCQlkYXRhLT50ZW1wOFtucl0gPSB0ZW1wX3RvX3M4KHZhbCk7Ci0KLQlsbTkwX3NlbGVjdF9yZW1vdGVfY2hhbm5lbChjbGllbnQsIGRhdGEsIG5yID49IDYpOwotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWdbbnJdLCBkYXRhLT50ZW1wOFtucl0pOwotCWxtOTBfc2VsZWN0X3JlbW90ZV9jaGFubmVsKGNsaWVudCwgZGF0YSwgMCk7Ci0KLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcDExKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCi0JCQkgICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKTsKLQlzdHJ1Y3QgbG05MF9kYXRhICpkYXRhID0gbG05MF91cGRhdGVfZGV2aWNlKGRldik7Ci0JaW50IHRlbXA7Ci0KLQlpZiAoSVNfRVJSKGRhdGEpKQotCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKLQotCWlmIChkYXRhLT5raW5kID09IGFkdDc0NjEgfHwgZGF0YS0+a2luZCA9PSB0bXA0NTEpCi0JCXRlbXAgPSB0ZW1wX2Zyb21fdTE2X2FkdDc0NjEoZGF0YSwgZGF0YS0+dGVtcDExW2F0dHItPmluZGV4XSk7Ci0JZWxzZSBpZiAoZGF0YS0+a2luZCA9PSBtYXg2NjQ2KQotCQl0ZW1wID0gdGVtcF9mcm9tX3UxNihkYXRhLT50ZW1wMTFbYXR0ci0+aW5kZXhdKTsKLQllbHNlCi0JCXRlbXAgPSB0ZW1wX2Zyb21fczE2KGRhdGEtPnRlbXAxMVthdHRyLT5pbmRleF0pOwotCi0JLyogKzE2IGRlZ3JlZXMgb2Zmc2V0IGZvciB0ZW1wMiBmb3IgdGhlIExNOTkgKi8KLQlpZiAoZGF0YS0+a2luZCA9PSBsbTk5ICYmICBhdHRyLT5pbmRleCA8PSAyKQotCQl0ZW1wICs9IDE2MDAwOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRlbXApOwotfQotCi1zdGF0aWMgc3NpemVfdCBzZXRfdGVtcDExKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCi0JCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCB7Ci0JCXU4IGhpZ2g7Ci0JCXU4IGxvdzsKLQkJaW50IGNoYW5uZWw7Ci0JfSByZWdbNV0gPSB7Ci0JCXsgTE05MF9SRUdfV19SRU1PVEVfTE9XSCwgTE05MF9SRUdfV19SRU1PVEVfTE9XTCwgMCB9LAotCQl7IExNOTBfUkVHX1dfUkVNT1RFX0hJR0hILCBMTTkwX1JFR19XX1JFTU9URV9ISUdITCwgMCB9LAotCQl7IExNOTBfUkVHX1dfUkVNT1RFX09GRlNILCBMTTkwX1JFR19XX1JFTU9URV9PRkZTTCwgMCB9LAotCQl7IExNOTBfUkVHX1dfUkVNT1RFX0xPV0gsIExNOTBfUkVHX1dfUkVNT1RFX0xPV0wsIDEgfSwKLQkJeyBMTTkwX1JFR19XX1JFTU9URV9ISUdISCwgTE05MF9SRUdfV19SRU1PVEVfSElHSEwsIDEgfQotCX07Ci0KLQlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpOwotCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwotCWludCBuciA9IGF0dHItPm5yOwotCWludCBpbmRleCA9IGF0dHItPmluZGV4OwotCWxvbmcgdmFsOwotCWludCBlcnI7Ci0KLQllcnIgPSBrc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JLyogKzE2IGRlZ3JlZXMgb2Zmc2V0IGZvciB0ZW1wMiBmb3IgdGhlIExNOTkgKi8KLQlpZiAoZGF0YS0+a2luZCA9PSBsbTk5ICYmIGluZGV4IDw9IDIpCi0JCXZhbCAtPSAxNjAwMDsKLQotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlpZiAoZGF0YS0+a2luZCA9PSBhZHQ3NDYxIHx8IGRhdGEtPmtpbmQgPT0gdG1wNDUxKQotCQlkYXRhLT50ZW1wMTFbaW5kZXhdID0gdGVtcF90b191MTZfYWR0NzQ2MShkYXRhLCB2YWwpOwotCWVsc2UgaWYgKGRhdGEtPmtpbmQgPT0gbWF4NjY0NikKLQkJZGF0YS0+dGVtcDExW2luZGV4XSA9IHRlbXBfdG9fdTgodmFsKSA8PCA4OwotCWVsc2UgaWYgKGRhdGEtPmZsYWdzICYgTE05MF9IQVZFX1JFTV9MSU1JVF9FWFQpCi0JCWRhdGEtPnRlbXAxMVtpbmRleF0gPSB0ZW1wX3RvX3MxNih2YWwpOwotCWVsc2UKLQkJZGF0YS0+dGVtcDExW2luZGV4XSA9IHRlbXBfdG9fczgodmFsKSA8PCA4OwotCi0JbG05MF9zZWxlY3RfcmVtb3RlX2NoYW5uZWwoY2xpZW50LCBkYXRhLCByZWdbbnJdLmNoYW5uZWwpOwotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWdbbnJdLmhpZ2gsCi0JCQkJICBkYXRhLT50ZW1wMTFbaW5kZXhdID4+IDgpOwotCWlmIChkYXRhLT5mbGFncyAmIExNOTBfSEFWRV9SRU1fTElNSVRfRVhUKQotCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnW25yXS5sb3csCi0JCQkJCSAgZGF0YS0+dGVtcDExW2luZGV4XSAmIDB4ZmYpOwotCWxtOTBfc2VsZWN0X3JlbW90ZV9jaGFubmVsKGNsaWVudCwgZGF0YSwgMCk7Ci0KLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcGh5c3Qoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKLQkJCSAgICAgY2hhciAqYnVmKQotewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKLQlzdHJ1Y3QgbG05MF9kYXRhICpkYXRhID0gbG05MF91cGRhdGVfZGV2aWNlKGRldik7Ci0JaW50IHRlbXA7Ci0KLQlpZiAoSVNfRVJSKGRhdGEpKQotCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKLQotCWlmIChkYXRhLT5raW5kID09IGFkdDc0NjEgfHwgZGF0YS0+a2luZCA9PSB0bXA0NTEpCi0JCXRlbXAgPSB0ZW1wX2Zyb21fdThfYWR0NzQ2MShkYXRhLCBkYXRhLT50ZW1wOFthdHRyLT5pbmRleF0pOwotCWVsc2UgaWYgKGRhdGEtPmtpbmQgPT0gbWF4NjY0NikKLQkJdGVtcCA9IHRlbXBfZnJvbV91OChkYXRhLT50ZW1wOFthdHRyLT5pbmRleF0pOwotCWVsc2UKLQkJdGVtcCA9IHRlbXBfZnJvbV9zOChkYXRhLT50ZW1wOFthdHRyLT5pbmRleF0pOwotCi0JLyogKzE2IGRlZ3JlZXMgb2Zmc2V0IGZvciB0ZW1wMiBmb3IgdGhlIExNOTkgKi8KLQlpZiAoZGF0YS0+a2luZCA9PSBsbTk5ICYmIGF0dHItPmluZGV4ID09IDMpCi0JCXRlbXAgKz0gMTYwMDA7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdGVtcCAtIHRlbXBfZnJvbV9zOChkYXRhLT50ZW1wX2h5c3QpKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBoeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmR1bW15LAotCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwotCWxvbmcgdmFsOwotCWludCBlcnI7Ci0JaW50IHRlbXA7Ci0KLQllcnIgPSBrc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCWlmIChkYXRhLT5raW5kID09IGFkdDc0NjEgfHwgZGF0YS0+a2luZCA9PSB0bXA0NTEpCi0JCXRlbXAgPSB0ZW1wX2Zyb21fdThfYWR0NzQ2MShkYXRhLCBkYXRhLT50ZW1wOFtMT0NBTF9DUklUXSk7Ci0JZWxzZSBpZiAoZGF0YS0+a2luZCA9PSBtYXg2NjQ2KQotCQl0ZW1wID0gdGVtcF9mcm9tX3U4KGRhdGEtPnRlbXA4W0xPQ0FMX0NSSVRdKTsKLQllbHNlCi0JCXRlbXAgPSB0ZW1wX2Zyb21fczgoZGF0YS0+dGVtcDhbTE9DQUxfQ1JJVF0pOwotCi0JZGF0YS0+dGVtcF9oeXN0ID0gaHlzdF90b19yZWcodGVtcCAtIHZhbCk7Ci0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTBfUkVHX1dfVENSSVRfSFlTVCwKLQkJCQkgIGRhdGEtPnRlbXBfaHlzdCk7Ci0JbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkdW1teSwKLQkJCSAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgbG05MF9kYXRhICpkYXRhID0gbG05MF91cGRhdGVfZGV2aWNlKGRldik7Ci0KLQlpZiAoSVNfRVJSKGRhdGEpKQotCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5hbGFybXMpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKLQkJCSAgKmRldmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7Ci0Jc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGxtOTBfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBiaXRuciA9IGF0dHItPmluZGV4OwotCi0JaWYgKElTX0VSUihkYXRhKSkKLQkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgKGRhdGEtPmFsYXJtcyA+PiBiaXRucikgJiAxKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd191cGRhdGVfaW50ZXJ2YWwoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhLT51cGRhdGVfaW50ZXJ2YWwpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzZXRfdXBkYXRlX2ludGVydmFsKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgbG05MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgZXJyOwotCi0JZXJyID0ga3N0cnRvdWwoYnVmLCAxMCwgJnZhbCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlsbTkwX3NldF9jb252cmF0ZShjbGllbnQsIGRhdGEsIGNsYW1wX3ZhbCh2YWwsIDAsIDEwMDAwMCkpOwotCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIodGVtcDFfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcDExLCBOVUxMLAotCTAsIExPQ0FMX1RFTVApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAyX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAxMSwgTlVMTCwKLQkwLCBSRU1PVEVfVEVNUCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcDgsCi0Jc2V0X3RlbXA4LCBMT0NBTF9MT1cpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAyX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcDExLAotCXNldF90ZW1wMTEsIDAsIFJFTU9URV9MT1cpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXA4LAotCXNldF90ZW1wOCwgTE9DQUxfSElHSCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIodGVtcDJfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wMTEsCi0Jc2V0X3RlbXAxMSwgMSwgUkVNT1RFX0hJR0gpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9jcml0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wOCwKLQlzZXRfdGVtcDgsIExPQ0FMX0NSSVQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9jcml0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wOCwKLQlzZXRfdGVtcDgsIFJFTU9URV9DUklUKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfY3JpdF9oeXN0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1waHlzdCwKLQlzZXRfdGVtcGh5c3QsIExPQ0FMX0NSSVQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9jcml0X2h5c3QsIFNfSVJVR08sIHNob3dfdGVtcGh5c3QsIE5VTEwsCi0JUkVNT1RFX0NSSVQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAyX29mZnNldCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcDExLAotCXNldF90ZW1wMTEsIDIsIFJFTU9URV9PRkZTRVQpOwotCi0vKiBJbmRpdmlkdWFsIGFsYXJtIGZpbGVzICovCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2NyaXRfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9jcml0X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfZmF1bHQsIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9taW5fYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDMpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9tYXhfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9taW5fYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDUpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9tYXhfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDYpOwotLyogUmF3IGFsYXJtIGZpbGUgZm9yIGNvbXBhdGliaWxpdHkgKi8KLXN0YXRpYyBERVZJQ0VfQVRUUihhbGFybXMsIFNfSVJVR08sIHNob3dfYWxhcm1zLCBOVUxMKTsKLQotc3RhdGljIERFVklDRV9BVFRSKHVwZGF0ZV9pbnRlcnZhbCwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdXBkYXRlX2ludGVydmFsLAotCQkgICBzZXRfdXBkYXRlX2ludGVydmFsKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmxtOTBfYXR0cmlidXRlc1tdID0gewotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9taW4uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX21pbi5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9tYXguZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2NyaXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2NyaXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2NyaXRfaHlzdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfY3JpdF9oeXN0LmRldl9hdHRyLmF0dHIsCi0KLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2NyaXRfYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2NyaXRfYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2ZhdWx0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmZGV2X2F0dHJfYWxhcm1zLmF0dHIsCi0JJmRldl9hdHRyX3VwZGF0ZV9pbnRlcnZhbC5hdHRyLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGxtOTBfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gbG05MF9hdHRyaWJ1dGVzLAotfTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmxtOTBfdGVtcDJfb2Zmc2V0X2F0dHJpYnV0ZXNbXSA9IHsKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX29mZnNldC5kZXZfYXR0ci5hdHRyLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGxtOTBfdGVtcDJfb2Zmc2V0X2dyb3VwID0gewotCS5hdHRycyA9IGxtOTBfdGVtcDJfb2Zmc2V0X2F0dHJpYnV0ZXMsCi19OwotCi0vKgotICogQWRkaXRpb25hbCBhdHRyaWJ1dGVzIGZvciBkZXZpY2VzIHdpdGggZW1lcmdlbmN5IHNlbnNvcnMKLSAqLwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9lbWVyZ2VuY3ksIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXA4LAotCXNldF90ZW1wOCwgTE9DQUxfRU1FUkcpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9lbWVyZ2VuY3ksIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXA4LAotCXNldF90ZW1wOCwgUkVNT1RFX0VNRVJHKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfZW1lcmdlbmN5X2h5c3QsIFNfSVJVR08sIHNob3dfdGVtcGh5c3QsCi0JCQkgIE5VTEwsIExPQ0FMX0VNRVJHKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfZW1lcmdlbmN5X2h5c3QsIFNfSVJVR08sIHNob3dfdGVtcGh5c3QsCi0JCQkgIE5VTEwsIFJFTU9URV9FTUVSRyk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsbTkwX2VtZXJnZW5jeV9hdHRyaWJ1dGVzW10gPSB7Ci0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9lbWVyZ2VuY3kuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2VtZXJnZW5jeS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfZW1lcmdlbmN5X2h5c3QuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2VtZXJnZW5jeV9oeXN0LmRldl9hdHRyLmF0dHIsCi0JTlVMTAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbG05MF9lbWVyZ2VuY3lfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gbG05MF9lbWVyZ2VuY3lfYXR0cmlidXRlcywKLX07Ci0KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfZW1lcmdlbmN5X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAxNSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2VtZXJnZW5jeV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTMpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbG05MF9lbWVyZ2VuY3lfYWxhcm1fYXR0cmlidXRlc1tdID0gewotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfZW1lcmdlbmN5X2FsYXJtLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9lbWVyZ2VuY3lfYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQlOVUxMCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBsbTkwX2VtZXJnZW5jeV9hbGFybV9ncm91cCA9IHsKLQkuYXR0cnMgPSBsbTkwX2VtZXJnZW5jeV9hbGFybV9hdHRyaWJ1dGVzLAotfTsKLQotLyoKLSAqIEFkZGl0aW9uYWwgYXR0cmlidXRlcyBmb3IgZGV2aWNlcyB3aXRoIDMgdGVtcGVyYXR1cmUgc2Vuc29ycwotICovCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIodGVtcDNfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcDExLCBOVUxMLAotCTAsIFJFTU9URTJfVEVNUCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIodGVtcDNfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wMTEsCi0Jc2V0X3RlbXAxMSwgMywgUkVNT1RFMl9MT1cpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAzX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcDExLAotCXNldF90ZW1wMTEsIDQsIFJFTU9URTJfSElHSCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2NyaXQsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXA4LAotCXNldF90ZW1wOCwgUkVNT1RFMl9DUklUKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfY3JpdF9oeXN0LCBTX0lSVUdPLCBzaG93X3RlbXBoeXN0LCBOVUxMLAotCVJFTU9URTJfQ1JJVCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2VtZXJnZW5jeSwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcDgsCi0Jc2V0X3RlbXA4LCBSRU1PVEUyX0VNRVJHKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfZW1lcmdlbmN5X2h5c3QsIFNfSVJVR08sIHNob3dfdGVtcGh5c3QsCi0JCQkgIE5VTEwsIFJFTU9URTJfRU1FUkcpOwotCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2NyaXRfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDkpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19mYXVsdCwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19taW5fYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDExKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfbWF4X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAxMik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2VtZXJnZW5jeV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTQpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbG05MF90ZW1wM19hdHRyaWJ1dGVzW10gPSB7Ci0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfbWluLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19tYXguZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2NyaXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2NyaXRfaHlzdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfZW1lcmdlbmN5LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19lbWVyZ2VuY3lfaHlzdC5kZXZfYXR0ci5hdHRyLAotCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19mYXVsdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2NyaXRfYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2VtZXJnZW5jeV9hbGFybS5kZXZfYXR0ci5hdHRyLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGxtOTBfdGVtcDNfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gbG05MF90ZW1wM19hdHRyaWJ1dGVzLAotfTsKLQogLyogcGVjIHVzZWQgZm9yIEFETTEwMzIgb25seSAqLwogc3RhdGljIHNzaXplX3Qgc2hvd19wZWMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZHVtbXksCiAJCQljaGFyICpidWYpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAhIShjbGllbnQtPmZsYWdzICYgSTJDX0NMSUVOVF9QRUMpKTsKIH0KIApAQCAtMTI3OCw5ICs4NjUsNDMxIEBACiAKIHN0YXRpYyBERVZJQ0VfQVRUUihwZWMsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3BlYywgc2V0X3BlYyk7CiAKLS8qCi0gKiBSZWFsIGNvZGUKLSAqLworc3RhdGljIGludCBsbTkwX2dldF90ZW1wMTEoc3RydWN0IGxtOTBfZGF0YSAqZGF0YSwgaW50IGluZGV4KQoreworCXMxNiB0ZW1wMTEgPSBkYXRhLT50ZW1wMTFbaW5kZXhdOworCWludCB0ZW1wOworCisJaWYgKGRhdGEtPmtpbmQgPT0gYWR0NzQ2MSB8fCBkYXRhLT5raW5kID09IHRtcDQ1MSkKKwkJdGVtcCA9IHRlbXBfZnJvbV91MTZfYWR0NzQ2MShkYXRhLCB0ZW1wMTEpOworCWVsc2UgaWYgKGRhdGEtPmtpbmQgPT0gbWF4NjY0NikKKwkJdGVtcCA9IHRlbXBfZnJvbV91MTYodGVtcDExKTsKKwllbHNlCisJCXRlbXAgPSB0ZW1wX2Zyb21fczE2KHRlbXAxMSk7CisKKwkvKiArMTYgZGVncmVlcyBvZmZzZXQgZm9yIHRlbXAyIGZvciB0aGUgTE05OSAqLworCWlmIChkYXRhLT5raW5kID09IGxtOTkgJiYgaW5kZXggPD0gMikKKwkJdGVtcCArPSAxNjAwMDsKKworCXJldHVybiB0ZW1wOworfQorCitzdGF0aWMgaW50IGxtOTBfc2V0X3RlbXAxMShzdHJ1Y3QgbG05MF9kYXRhICpkYXRhLCBpbnQgaW5kZXgsIGxvbmcgdmFsKQoreworCXN0YXRpYyBzdHJ1Y3QgcmVnIHsKKwkJdTggaGlnaDsKKwkJdTggbG93OworCX0gcmVnW10gPSB7CisJW1JFTU9URV9MT1ddID0geyBMTTkwX1JFR19XX1JFTU9URV9MT1dILCBMTTkwX1JFR19XX1JFTU9URV9MT1dMIH0sCisJW1JFTU9URV9ISUdIXSA9IHsgTE05MF9SRUdfV19SRU1PVEVfSElHSEgsIExNOTBfUkVHX1dfUkVNT1RFX0hJR0hMIH0sCisJW1JFTU9URV9PRkZTRVRdID0geyBMTTkwX1JFR19XX1JFTU9URV9PRkZTSCwgTE05MF9SRUdfV19SRU1PVEVfT0ZGU0wgfSwKKwlbUkVNT1RFMl9MT1ddID0geyBMTTkwX1JFR19XX1JFTU9URV9MT1dILCBMTTkwX1JFR19XX1JFTU9URV9MT1dMIH0sCisJW1JFTU9URTJfSElHSF0gPSB7IExNOTBfUkVHX1dfUkVNT1RFX0hJR0hILCBMTTkwX1JFR19XX1JFTU9URV9ISUdITCB9CisJfTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OworCXN0cnVjdCByZWcgKnJlZ3AgPSAmcmVnW2luZGV4XTsKKwlpbnQgZXJyOworCisJLyogKzE2IGRlZ3JlZXMgb2Zmc2V0IGZvciB0ZW1wMiBmb3IgdGhlIExNOTkgKi8KKwlpZiAoZGF0YS0+a2luZCA9PSBsbTk5ICYmIGluZGV4IDw9IDIpCisJCXZhbCAtPSAxNjAwMDsKKworCWlmIChkYXRhLT5raW5kID09IGFkdDc0NjEgfHwgZGF0YS0+a2luZCA9PSB0bXA0NTEpCisJCWRhdGEtPnRlbXAxMVtpbmRleF0gPSB0ZW1wX3RvX3UxNl9hZHQ3NDYxKGRhdGEsIHZhbCk7CisJZWxzZSBpZiAoZGF0YS0+a2luZCA9PSBtYXg2NjQ2KQorCQlkYXRhLT50ZW1wMTFbaW5kZXhdID0gdGVtcF90b191OCh2YWwpIDw8IDg7CisJZWxzZSBpZiAoZGF0YS0+ZmxhZ3MgJiBMTTkwX0hBVkVfUkVNX0xJTUlUX0VYVCkKKwkJZGF0YS0+dGVtcDExW2luZGV4XSA9IHRlbXBfdG9fczE2KHZhbCk7CisJZWxzZQorCQlkYXRhLT50ZW1wMTFbaW5kZXhdID0gdGVtcF90b19zOCh2YWwpIDw8IDg7CisKKwlsbTkwX3NlbGVjdF9yZW1vdGVfY2hhbm5lbChjbGllbnQsIGRhdGEsIGluZGV4ID49IDMpOworCWVyciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWdwLT5oaWdoLAorCQkJCSAgZGF0YS0+dGVtcDExW2luZGV4XSA+PiA4KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlpZiAoZGF0YS0+ZmxhZ3MgJiBMTTkwX0hBVkVfUkVNX0xJTUlUX0VYVCkKKwkJZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZ3AtPmxvdywKKwkJCQkJCWRhdGEtPnRlbXAxMVtpbmRleF0gJiAweGZmKTsKKworCWxtOTBfc2VsZWN0X3JlbW90ZV9jaGFubmVsKGNsaWVudCwgZGF0YSwgMCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBsbTkwX2dldF90ZW1wOChzdHJ1Y3QgbG05MF9kYXRhICpkYXRhLCBpbnQgaW5kZXgpCit7CisJczggdGVtcDggPSBkYXRhLT50ZW1wOFtpbmRleF07CisJaW50IHRlbXA7CisKKwlpZiAoZGF0YS0+a2luZCA9PSBhZHQ3NDYxIHx8IGRhdGEtPmtpbmQgPT0gdG1wNDUxKQorCQl0ZW1wID0gdGVtcF9mcm9tX3U4X2FkdDc0NjEoZGF0YSwgdGVtcDgpOworCWVsc2UgaWYgKGRhdGEtPmtpbmQgPT0gbWF4NjY0NikKKwkJdGVtcCA9IHRlbXBfZnJvbV91OCh0ZW1wOCk7CisJZWxzZQorCQl0ZW1wID0gdGVtcF9mcm9tX3M4KHRlbXA4KTsKKworCS8qICsxNiBkZWdyZWVzIG9mZnNldCBmb3IgdGVtcDIgZm9yIHRoZSBMTTk5ICovCisJaWYgKGRhdGEtPmtpbmQgPT0gbG05OSAmJiBpbmRleCA9PSAzKQorCQl0ZW1wICs9IDE2MDAwOworCisJcmV0dXJuIHRlbXA7Cit9CisKK3N0YXRpYyBpbnQgbG05MF9zZXRfdGVtcDgoc3RydWN0IGxtOTBfZGF0YSAqZGF0YSwgaW50IGluZGV4LCBsb25nIHZhbCkKK3sKKwlzdGF0aWMgY29uc3QgdTggcmVnW1RFTVA4X1JFR19OVU1dID0geworCQlMTTkwX1JFR19XX0xPQ0FMX0xPVywKKwkJTE05MF9SRUdfV19MT0NBTF9ISUdILAorCQlMTTkwX1JFR19XX0xPQ0FMX0NSSVQsCisJCUxNOTBfUkVHX1dfUkVNT1RFX0NSSVQsCisJCU1BWDY2NTlfUkVHX1dfTE9DQUxfRU1FUkcsCisJCU1BWDY2NTlfUkVHX1dfUkVNT1RFX0VNRVJHLAorCQlMTTkwX1JFR19XX1JFTU9URV9DUklULAorCQlNQVg2NjU5X1JFR19XX1JFTU9URV9FTUVSRywKKwl9OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CisJaW50IGVycjsKKworCS8qICsxNiBkZWdyZWVzIG9mZnNldCBmb3IgdGVtcDIgZm9yIHRoZSBMTTk5ICovCisJaWYgKGRhdGEtPmtpbmQgPT0gbG05OSAmJiBpbmRleCA9PSAzKQorCQl2YWwgLT0gMTYwMDA7CisKKwlpZiAoZGF0YS0+a2luZCA9PSBhZHQ3NDYxIHx8IGRhdGEtPmtpbmQgPT0gdG1wNDUxKQorCQlkYXRhLT50ZW1wOFtpbmRleF0gPSB0ZW1wX3RvX3U4X2FkdDc0NjEoZGF0YSwgdmFsKTsKKwllbHNlIGlmIChkYXRhLT5raW5kID09IG1heDY2NDYpCisJCWRhdGEtPnRlbXA4W2luZGV4XSA9IHRlbXBfdG9fdTgodmFsKTsKKwllbHNlCisJCWRhdGEtPnRlbXA4W2luZGV4XSA9IHRlbXBfdG9fczgodmFsKTsKKworCWxtOTBfc2VsZWN0X3JlbW90ZV9jaGFubmVsKGNsaWVudCwgZGF0YSwgaW5kZXggPj0gNik7CisJZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZ1tpbmRleF0sIGRhdGEtPnRlbXA4W2luZGV4XSk7CisJbG05MF9zZWxlY3RfcmVtb3RlX2NoYW5uZWwoY2xpZW50LCBkYXRhLCAwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbG05MF9nZXRfdGVtcGh5c3Qoc3RydWN0IGxtOTBfZGF0YSAqZGF0YSwgaW50IGluZGV4KQoreworCWludCB0ZW1wOworCisJaWYgKGRhdGEtPmtpbmQgPT0gYWR0NzQ2MSB8fCBkYXRhLT5raW5kID09IHRtcDQ1MSkKKwkJdGVtcCA9IHRlbXBfZnJvbV91OF9hZHQ3NDYxKGRhdGEsIGRhdGEtPnRlbXA4W2luZGV4XSk7CisJZWxzZSBpZiAoZGF0YS0+a2luZCA9PSBtYXg2NjQ2KQorCQl0ZW1wID0gdGVtcF9mcm9tX3U4KGRhdGEtPnRlbXA4W2luZGV4XSk7CisJZWxzZQorCQl0ZW1wID0gdGVtcF9mcm9tX3M4KGRhdGEtPnRlbXA4W2luZGV4XSk7CisKKwkvKiArMTYgZGVncmVlcyBvZmZzZXQgZm9yIHRlbXAyIGZvciB0aGUgTE05OSAqLworCWlmIChkYXRhLT5raW5kID09IGxtOTkgJiYgaW5kZXggPT0gMykKKwkJdGVtcCArPSAxNjAwMDsKKworCXJldHVybiB0ZW1wIC0gdGVtcF9mcm9tX3M4KGRhdGEtPnRlbXBfaHlzdCk7Cit9CisKK3N0YXRpYyBpbnQgbG05MF9zZXRfdGVtcGh5c3Qoc3RydWN0IGxtOTBfZGF0YSAqZGF0YSwgbG9uZyB2YWwpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKKwlpbnQgdGVtcDsKKwlpbnQgZXJyOworCisJaWYgKGRhdGEtPmtpbmQgPT0gYWR0NzQ2MSB8fCBkYXRhLT5raW5kID09IHRtcDQ1MSkKKwkJdGVtcCA9IHRlbXBfZnJvbV91OF9hZHQ3NDYxKGRhdGEsIGRhdGEtPnRlbXA4W0xPQ0FMX0NSSVRdKTsKKwllbHNlIGlmIChkYXRhLT5raW5kID09IG1heDY2NDYpCisJCXRlbXAgPSB0ZW1wX2Zyb21fdTgoZGF0YS0+dGVtcDhbTE9DQUxfQ1JJVF0pOworCWVsc2UKKwkJdGVtcCA9IHRlbXBfZnJvbV9zOChkYXRhLT50ZW1wOFtMT0NBTF9DUklUXSk7CisKKwlkYXRhLT50ZW1wX2h5c3QgPSBoeXN0X3RvX3JlZyh0ZW1wIC0gdmFsKTsKKwllcnIgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05MF9SRUdfV19UQ1JJVF9IWVNULAorCQkJCQlkYXRhLT50ZW1wX2h5c3QpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCB1OCBsbTkwX3RlbXBfaW5kZXhbM10gPSB7CisJTE9DQUxfVEVNUCwgUkVNT1RFX1RFTVAsIFJFTU9URTJfVEVNUAorfTsKKworc3RhdGljIGNvbnN0IHU4IGxtOTBfdGVtcF9taW5faW5kZXhbM10gPSB7CisJTE9DQUxfTE9XLCBSRU1PVEVfTE9XLCBSRU1PVEUyX0xPVworfTsKKworc3RhdGljIGNvbnN0IHU4IGxtOTBfdGVtcF9tYXhfaW5kZXhbM10gPSB7CisJTE9DQUxfSElHSCwgUkVNT1RFX0hJR0gsIFJFTU9URTJfSElHSAorfTsKKworc3RhdGljIGNvbnN0IHU4IGxtOTBfdGVtcF9jcml0X2luZGV4WzNdID0geworCUxPQ0FMX0NSSVQsIFJFTU9URV9DUklULCBSRU1PVEUyX0NSSVQKK307CisKK3N0YXRpYyBjb25zdCB1OCBsbTkwX3RlbXBfZW1lcmdfaW5kZXhbM10gPSB7CisJTE9DQUxfRU1FUkcsIFJFTU9URV9FTUVSRywgUkVNT1RFMl9FTUVSRworfTsKKworc3RhdGljIGNvbnN0IHU4IGxtOTBfbWluX2FsYXJtX2JpdHNbM10gPSB7IDUsIDMsIDExIH07CitzdGF0aWMgY29uc3QgdTggbG05MF9tYXhfYWxhcm1fYml0c1szXSA9IHsgMCwgNCwgMTIgfTsKK3N0YXRpYyBjb25zdCB1OCBsbTkwX2NyaXRfYWxhcm1fYml0c1szXSA9IHsgMCwgMSwgOSB9Oworc3RhdGljIGNvbnN0IHU4IGxtOTBfZW1lcmdlbmN5X2FsYXJtX2JpdHNbM10gPSB7IDE1LCAxMywgMTQgfTsKK3N0YXRpYyBjb25zdCB1OCBsbTkwX2ZhdWx0X2JpdHNbM10gPSB7IDAsIDIsIDEwIH07CisKK3N0YXRpYyBpbnQgbG05MF90ZW1wX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgYXR0ciwgaW50IGNoYW5uZWwsIGxvbmcgKnZhbCkKK3sKKwlzdHJ1Y3QgbG05MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IGVycjsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwllcnIgPSBsbTkwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl90ZW1wX2lucHV0OgorCQkqdmFsID0gbG05MF9nZXRfdGVtcDExKGRhdGEsIGxtOTBfdGVtcF9pbmRleFtjaGFubmVsXSk7CisJCWJyZWFrOworCWNhc2UgaHdtb25fdGVtcF9taW5fYWxhcm06CisJCSp2YWwgPSAoZGF0YS0+YWxhcm1zID4+IGxtOTBfbWluX2FsYXJtX2JpdHNbY2hhbm5lbF0pICYgMTsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX21heF9hbGFybToKKwkJKnZhbCA9IChkYXRhLT5hbGFybXMgPj4gbG05MF9tYXhfYWxhcm1fYml0c1tjaGFubmVsXSkgJiAxOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfY3JpdF9hbGFybToKKwkJKnZhbCA9IChkYXRhLT5hbGFybXMgPj4gbG05MF9jcml0X2FsYXJtX2JpdHNbY2hhbm5lbF0pICYgMTsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX2VtZXJnZW5jeV9hbGFybToKKwkJKnZhbCA9IChkYXRhLT5hbGFybXMgPj4gbG05MF9lbWVyZ2VuY3lfYWxhcm1fYml0c1tjaGFubmVsXSkgJiAxOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfZmF1bHQ6CisJCSp2YWwgPSAoZGF0YS0+YWxhcm1zID4+IGxtOTBfZmF1bHRfYml0c1tjaGFubmVsXSkgJiAxOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfbWluOgorCQlpZiAoY2hhbm5lbCA9PSAwKQorCQkJKnZhbCA9IGxtOTBfZ2V0X3RlbXA4KGRhdGEsCisJCQkJCSAgICAgIGxtOTBfdGVtcF9taW5faW5kZXhbY2hhbm5lbF0pOworCQllbHNlCisJCQkqdmFsID0gbG05MF9nZXRfdGVtcDExKGRhdGEsCisJCQkJCSAgICAgICBsbTkwX3RlbXBfbWluX2luZGV4W2NoYW5uZWxdKTsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX21heDoKKwkJaWYgKGNoYW5uZWwgPT0gMCkKKwkJCSp2YWwgPSBsbTkwX2dldF90ZW1wOChkYXRhLAorCQkJCQkgICAgICBsbTkwX3RlbXBfbWF4X2luZGV4W2NoYW5uZWxdKTsKKwkJZWxzZQorCQkJKnZhbCA9IGxtOTBfZ2V0X3RlbXAxMShkYXRhLAorCQkJCQkgICAgICAgbG05MF90ZW1wX21heF9pbmRleFtjaGFubmVsXSk7CisJCWJyZWFrOworCWNhc2UgaHdtb25fdGVtcF9jcml0OgorCQkqdmFsID0gbG05MF9nZXRfdGVtcDgoZGF0YSwgbG05MF90ZW1wX2NyaXRfaW5kZXhbY2hhbm5lbF0pOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfY3JpdF9oeXN0OgorCQkqdmFsID0gbG05MF9nZXRfdGVtcGh5c3QoZGF0YSwgbG05MF90ZW1wX2NyaXRfaW5kZXhbY2hhbm5lbF0pOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfZW1lcmdlbmN5OgorCQkqdmFsID0gbG05MF9nZXRfdGVtcDgoZGF0YSwgbG05MF90ZW1wX2VtZXJnX2luZGV4W2NoYW5uZWxdKTsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX2VtZXJnZW5jeV9oeXN0OgorCQkqdmFsID0gbG05MF9nZXRfdGVtcGh5c3QoZGF0YSwgbG05MF90ZW1wX2VtZXJnX2luZGV4W2NoYW5uZWxdKTsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX29mZnNldDoKKwkJKnZhbCA9IGxtOTBfZ2V0X3RlbXAxMShkYXRhLCBSRU1PVEVfT0ZGU0VUKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsbTkwX3RlbXBfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgYXR0ciwgaW50IGNoYW5uZWwsIGxvbmcgdmFsKQoreworCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZXJyOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJZXJyID0gbG05MF91cGRhdGVfZGV2aWNlKGRldik7CisJaWYgKGVycikKKwkJZ290byBlcnJvcjsKKworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fdGVtcF9taW46CisJCWlmIChjaGFubmVsID09IDApCisJCQllcnIgPSBsbTkwX3NldF90ZW1wOChkYXRhLAorCQkJCQkgICAgICBsbTkwX3RlbXBfbWluX2luZGV4W2NoYW5uZWxdLAorCQkJCQkgICAgICB2YWwpOworCQllbHNlCisJCQllcnIgPSBsbTkwX3NldF90ZW1wMTEoZGF0YSwKKwkJCQkJICAgICAgbG05MF90ZW1wX21pbl9pbmRleFtjaGFubmVsXSwKKwkJCQkJICAgICAgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX21heDoKKwkJaWYgKGNoYW5uZWwgPT0gMCkKKwkJCWVyciA9IGxtOTBfc2V0X3RlbXA4KGRhdGEsCisJCQkJCSAgICAgbG05MF90ZW1wX21heF9pbmRleFtjaGFubmVsXSwKKwkJCQkJICAgICB2YWwpOworCQllbHNlCisJCQllcnIgPSBsbTkwX3NldF90ZW1wMTEoZGF0YSwKKwkJCQkJICAgICAgbG05MF90ZW1wX21heF9pbmRleFtjaGFubmVsXSwKKwkJCQkJICAgICAgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX2NyaXQ6CisJCWVyciA9IGxtOTBfc2V0X3RlbXA4KGRhdGEsIGxtOTBfdGVtcF9jcml0X2luZGV4W2NoYW5uZWxdLCB2YWwpOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfY3JpdF9oeXN0OgorCQllcnIgPSBsbTkwX3NldF90ZW1waHlzdChkYXRhLCB2YWwpOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfZW1lcmdlbmN5OgorCQllcnIgPSBsbTkwX3NldF90ZW1wOChkYXRhLCBsbTkwX3RlbXBfZW1lcmdfaW5kZXhbY2hhbm5lbF0sIHZhbCk7CisJCWJyZWFrOworCWNhc2UgaHdtb25fdGVtcF9vZmZzZXQ6CisJCWVyciA9IGxtOTBfc2V0X3RlbXAxMShkYXRhLCBSRU1PVEVfT0ZGU0VULCB2YWwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisJfQorZXJyb3I6CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdW1vZGVfdCBsbTkwX3RlbXBfaXNfdmlzaWJsZShjb25zdCB2b2lkICpkYXRhLCB1MzIgYXR0ciwgaW50IGNoYW5uZWwpCit7CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl90ZW1wX2lucHV0OgorCWNhc2UgaHdtb25fdGVtcF9taW5fYWxhcm06CisJY2FzZSBod21vbl90ZW1wX21heF9hbGFybToKKwljYXNlIGh3bW9uX3RlbXBfY3JpdF9hbGFybToKKwljYXNlIGh3bW9uX3RlbXBfZW1lcmdlbmN5X2FsYXJtOgorCWNhc2UgaHdtb25fdGVtcF9lbWVyZ2VuY3lfaHlzdDoKKwljYXNlIGh3bW9uX3RlbXBfZmF1bHQ6CisJCXJldHVybiBTX0lSVUdPOworCWNhc2UgaHdtb25fdGVtcF9taW46CisJY2FzZSBod21vbl90ZW1wX21heDoKKwljYXNlIGh3bW9uX3RlbXBfY3JpdDoKKwljYXNlIGh3bW9uX3RlbXBfZW1lcmdlbmN5OgorCWNhc2UgaHdtb25fdGVtcF9vZmZzZXQ6CisJCXJldHVybiBTX0lSVUdPIHwgU19JV1VTUjsKKwljYXNlIGh3bW9uX3RlbXBfY3JpdF9oeXN0OgorCQlpZiAoY2hhbm5lbCA9PSAwKQorCQkJcmV0dXJuIFNfSVJVR08gfCBTX0lXVVNSOworCQlyZXR1cm4gU19JUlVHTzsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbG05MF9jaGlwX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgYXR0ciwgaW50IGNoYW5uZWwsIGxvbmcgKnZhbCkKK3sKKwlzdHJ1Y3QgbG05MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IGVycjsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwllcnIgPSBsbTkwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl9jaGlwX3VwZGF0ZV9pbnRlcnZhbDoKKwkJKnZhbCA9IGRhdGEtPnVwZGF0ZV9pbnRlcnZhbDsKKwkJYnJlYWs7CisJY2FzZSBod21vbl9jaGlwX2FsYXJtczoKKwkJKnZhbCA9IGRhdGEtPmFsYXJtczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxtOTBfY2hpcF93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyB2YWwpCit7CisJc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CisJaW50IGVycjsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWVyciA9IGxtOTBfdXBkYXRlX2RldmljZShkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3I7CisKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9uX2NoaXBfdXBkYXRlX2ludGVydmFsOgorCQllcnIgPSBsbTkwX3NldF9jb252cmF0ZShjbGllbnQsIGRhdGEsCisJCQkJCWNsYW1wX3ZhbCh2YWwsIDAsIDEwMDAwMCkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisJfQorZXJyb3I6CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdW1vZGVfdCBsbTkwX2NoaXBfaXNfdmlzaWJsZShjb25zdCB2b2lkICpkYXRhLCB1MzIgYXR0ciwgaW50IGNoYW5uZWwpCit7CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl9jaGlwX3VwZGF0ZV9pbnRlcnZhbDoKKwkJcmV0dXJuIFNfSVJVR08gfCBTX0lXVVNSOworCWNhc2UgaHdtb25fY2hpcF9hbGFybXM6CisJCXJldHVybiBTX0lSVUdPOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGludCBsbTkwX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkgICAgIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyAqdmFsKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgaHdtb25fY2hpcDoKKwkJcmV0dXJuIGxtOTBfY2hpcF9yZWFkKGRldiwgYXR0ciwgY2hhbm5lbCwgdmFsKTsKKwljYXNlIGh3bW9uX3RlbXA6CisJCXJldHVybiBsbTkwX3RlbXBfcmVhZChkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KKworc3RhdGljIGludCBsbTkwX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJICAgICAgdTMyIGF0dHIsIGludCBjaGFubmVsLCBsb25nIHZhbCkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIGh3bW9uX2NoaXA6CisJCXJldHVybiBsbTkwX2NoaXBfd3JpdGUoZGV2LCBhdHRyLCBjaGFubmVsLCB2YWwpOworCWNhc2UgaHdtb25fdGVtcDoKKwkJcmV0dXJuIGxtOTBfdGVtcF93cml0ZShkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KKworc3RhdGljIHVtb2RlX3QgbG05MF9pc192aXNpYmxlKGNvbnN0IHZvaWQgKmRhdGEsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQkgICAgICAgdTMyIGF0dHIsIGludCBjaGFubmVsKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgaHdtb25fY2hpcDoKKwkJcmV0dXJuIGxtOTBfY2hpcF9pc192aXNpYmxlKGRhdGEsIGF0dHIsIGNoYW5uZWwpOworCWNhc2UgaHdtb25fdGVtcDoKKwkJcmV0dXJuIGxtOTBfdGVtcF9pc192aXNpYmxlKGRhdGEsIGF0dHIsIGNoYW5uZWwpOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KIAogLyogUmV0dXJuIDAgaWYgZGV0ZWN0aW9uIGlzIHN1Y2Nlc3NmdWwsIC1FTk9ERVYgb3RoZXJ3aXNlICovCiBzdGF0aWMgaW50IGxtOTBfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCkBAIC0xNjE3LDE1ICsxNjI2LDMyIEBACiAJcmVndWxhdG9yX2Rpc2FibGUocmVndWxhdG9yKTsKIH0KIAorc3RhdGljIGNvbnN0IHUzMiBsbTkwX2NoaXBfY29uZmlnW10gPSB7CisJSFdNT05fQ19SRUdJU1RFUl9UWiB8IEhXTU9OX0NfVVBEQVRFX0lOVEVSVkFMIHwgSFdNT05fQ19BTEFSTVMsCisJMAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gbG05MF9jaGlwX2luZm8gPSB7CisJLnR5cGUgPSBod21vbl9jaGlwLAorCS5jb25maWcgPSBsbTkwX2NoaXBfY29uZmlnLAorfTsKKworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX29wcyBsbTkwX29wcyA9IHsKKwkuaXNfdmlzaWJsZSA9IGxtOTBfaXNfdmlzaWJsZSwKKwkucmVhZCA9IGxtOTBfcmVhZCwKKwkud3JpdGUgPSBsbTkwX3dyaXRlLAorfTsKKwogc3RhdGljIGludCBsbTkwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCSAgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gdG9faTJjX2FkYXB0ZXIoZGV2LT5wYXJlbnQpOwotCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGE7CisJc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyAqaW5mbzsKIAlzdHJ1Y3QgcmVndWxhdG9yICpyZWd1bGF0b3I7CiAJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OwotCWludCBncm91cHMgPSAwOworCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGE7CiAJaW50IGVycjsKIAogCXJlZ3VsYXRvciA9IGRldm1fcmVndWxhdG9yX2dldChkZXYsICJ2Y2MiKTsKQEAgLTE2NjUsNiArMTY5MSw0OSBAQAogCiAJLyogU2V0IGNoaXAgY2FwYWJpbGl0aWVzICovCiAJZGF0YS0+ZmxhZ3MgPSBsbTkwX3BhcmFtc1tkYXRhLT5raW5kXS5mbGFnczsKKworCWRhdGEtPmNoaXAub3BzID0gJmxtOTBfb3BzOworCWRhdGEtPmNoaXAuaW5mbyA9IGRhdGEtPmluZm87CisKKwlkYXRhLT5pbmZvWzBdID0gJmxtOTBfY2hpcF9pbmZvOworCWRhdGEtPmluZm9bMV0gPSAmZGF0YS0+dGVtcF9pbmZvOworCisJaW5mbyA9ICZkYXRhLT50ZW1wX2luZm87CisJaW5mby0+dHlwZSA9IGh3bW9uX3RlbXA7CisJaW5mby0+Y29uZmlnID0gZGF0YS0+Y2hhbm5lbF9jb25maWc7CisKKwlkYXRhLT5jaGFubmVsX2NvbmZpZ1swXSA9IEhXTU9OX1RfSU5QVVQgfCBIV01PTl9UX01JTiB8IEhXTU9OX1RfTUFYIHwKKwkJSFdNT05fVF9DUklUIHwgSFdNT05fVF9DUklUX0hZU1QgfCBIV01PTl9UX01JTl9BTEFSTSB8CisJCUhXTU9OX1RfTUFYX0FMQVJNIHwgSFdNT05fVF9DUklUX0FMQVJNOworCWRhdGEtPmNoYW5uZWxfY29uZmlnWzFdID0gSFdNT05fVF9JTlBVVCB8IEhXTU9OX1RfTUlOIHwgSFdNT05fVF9NQVggfAorCQlIV01PTl9UX0NSSVQgfCBIV01PTl9UX0NSSVRfSFlTVCB8IEhXTU9OX1RfTUlOX0FMQVJNIHwKKwkJSFdNT05fVF9NQVhfQUxBUk0gfCBIV01PTl9UX0NSSVRfQUxBUk0gfCBIV01PTl9UX0ZBVUxUOworCisJaWYgKGRhdGEtPmZsYWdzICYgTE05MF9IQVZFX09GRlNFVCkKKwkJZGF0YS0+Y2hhbm5lbF9jb25maWdbMV0gfD0gSFdNT05fVF9PRkZTRVQ7CisKKwlpZiAoZGF0YS0+ZmxhZ3MgJiBMTTkwX0hBVkVfRU1FUkdFTkNZKSB7CisJCWRhdGEtPmNoYW5uZWxfY29uZmlnWzBdIHw9IEhXTU9OX1RfRU1FUkdFTkNZIHwKKwkJCUhXTU9OX1RfRU1FUkdFTkNZX0hZU1Q7CisJCWRhdGEtPmNoYW5uZWxfY29uZmlnWzFdIHw9IEhXTU9OX1RfRU1FUkdFTkNZIHwKKwkJCUhXTU9OX1RfRU1FUkdFTkNZX0hZU1Q7CisJfQorCisJaWYgKGRhdGEtPmZsYWdzICYgTE05MF9IQVZFX0VNRVJHRU5DWV9BTEFSTSkgeworCQlkYXRhLT5jaGFubmVsX2NvbmZpZ1swXSB8PSBIV01PTl9UX0VNRVJHRU5DWV9BTEFSTTsKKwkJZGF0YS0+Y2hhbm5lbF9jb25maWdbMV0gfD0gSFdNT05fVF9FTUVSR0VOQ1lfQUxBUk07CisJfQorCisJaWYgKGRhdGEtPmZsYWdzICYgTE05MF9IQVZFX1RFTVAzKSB7CisJCWRhdGEtPmNoYW5uZWxfY29uZmlnWzJdID0gSFdNT05fVF9JTlBVVCB8CisJCQlIV01PTl9UX01JTiB8IEhXTU9OX1RfTUFYIHwKKwkJCUhXTU9OX1RfQ1JJVCB8IEhXTU9OX1RfQ1JJVF9IWVNUIHwKKwkJCUhXTU9OX1RfRU1FUkdFTkNZIHwgSFdNT05fVF9FTUVSR0VOQ1lfSFlTVCB8CisJCQlIV01PTl9UX01JTl9BTEFSTSB8IEhXTU9OX1RfTUFYX0FMQVJNIHwKKwkJCUhXTU9OX1RfQ1JJVF9BTEFSTSB8IEhXTU9OX1RfRU1FUkdFTkNZX0FMQVJNIHwKKwkJCUhXTU9OX1RfRkFVTFQ7CisJfQorCiAJZGF0YS0+cmVnX2xvY2FsX2V4dCA9IGxtOTBfcGFyYW1zW2RhdGEtPmtpbmRdLnJlZ19sb2NhbF9leHQ7CiAKIAkvKiBTZXQgbWF4aW11bSBjb252ZXJzaW9uIHJhdGUgKi8KQEAgLTE2NzcsMjEgKzE3NDYsMTAgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLwotCWRhdGEtPmdyb3Vwc1tncm91cHMrK10gPSAmbG05MF9ncm91cDsKLQotCWlmIChkYXRhLT5mbGFncyAmIExNOTBfSEFWRV9PRkZTRVQpCi0JCWRhdGEtPmdyb3Vwc1tncm91cHMrK10gPSAmbG05MF90ZW1wMl9vZmZzZXRfZ3JvdXA7Ci0KLQlpZiAoZGF0YS0+ZmxhZ3MgJiBMTTkwX0hBVkVfRU1FUkdFTkNZKQotCQlkYXRhLT5ncm91cHNbZ3JvdXBzKytdID0gJmxtOTBfZW1lcmdlbmN5X2dyb3VwOwotCi0JaWYgKGRhdGEtPmZsYWdzICYgTE05MF9IQVZFX0VNRVJHRU5DWV9BTEFSTSkKLQkJZGF0YS0+Z3JvdXBzW2dyb3VwcysrXSA9ICZsbTkwX2VtZXJnZW5jeV9hbGFybV9ncm91cDsKLQotCWlmIChkYXRhLT5mbGFncyAmIExNOTBfSEFWRV9URU1QMykKLQkJZGF0YS0+Z3JvdXBzW2dyb3VwcysrXSA9ICZsbTkwX3RlbXAzX2dyb3VwOwotCisJLyoKKwkgKiBUaGUgJ3BlYycgYXR0cmlidXRlIGlzIGF0dGFjaGVkIHRvIHRoZSBpMmMgZGV2aWNlIGFuZCB0aHVzIGNyZWF0ZWQKKwkgKiBzZXBhcmF0ZWx5LgorCSAqLwogCWlmIChjbGllbnQtPmZsYWdzICYgSTJDX0NMSUVOVF9QRUMpIHsKIAkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3BlYyk7CiAJCWlmIChlcnIpCkBAIC0xNzAxLDggKzE3NTksOSBAQAogCQkJcmV0dXJuIGVycjsKIAl9CiAKLQlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsIGNsaWVudC0+bmFtZSwKLQkJCQkJCQkgICBkYXRhLCBkYXRhLT5ncm91cHMpOworCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfaW5mbyhkZXYsIGNsaWVudC0+bmFtZSwKKwkJCQkJCQkgZGF0YSwgJmRhdGEtPmNoaXAsCisJCQkJCQkJIE5VTEwpOwogCWlmIChJU19FUlIoaHdtb25fZGV2KSkKIAkJcmV0dXJuIFBUUl9FUlIoaHdtb25fZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTk1MjQxLmMgYi9kcml2ZXJzL2h3bW9uL2xtOTUyNDEuYwppbmRleCBjZGYxOWFkLi44YzU3M2U2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtOTUyNDEuYworKysgYi9kcml2ZXJzL2h3bW9uL2xtOTUyNDEuYwpAQCAtMTUsMjIgKzE1LDE3IEBACiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9od21vbi5oPgotI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNkZWZpbmUgREVWTkFNRSAibG05NTI0MSIKIApAQCAtNTQsMjYgKzQ5LDI1IEBACiAjZGVmaW5lIExNOTUyNDFfUkVHX1JXX1JFTU9URV9NT0RFTAkweDMwCiAKIC8qIExNOTUyNDEgc3BlY2lmaWMgYml0ZmllbGRzICovCi0jZGVmaW5lIENGR19TVE9QIDB4NDAKLSNkZWZpbmUgQ0ZHX0NSMDA3NiAweDAwCi0jZGVmaW5lIENGR19DUjAxODIgMHgxMAotI2RlZmluZSBDRkdfQ1IxMDAwIDB4MjAKLSNkZWZpbmUgQ0ZHX0NSMjcwMCAweDMwCi0jZGVmaW5lIFIxTVNfU0hJRlQgMAotI2RlZmluZSBSMk1TX1NISUZUIDIKLSNkZWZpbmUgUjFNU19NQVNLICgweDAxIDw8IChSMU1TX1NISUZUKSkKLSNkZWZpbmUgUjJNU19NQVNLICgweDAxIDw8IChSMk1TX1NISUZUKSkKLSNkZWZpbmUgUjFERl9TSElGVCAxCi0jZGVmaW5lIFIyREZfU0hJRlQgMgotI2RlZmluZSBSMURGX01BU0sgKDB4MDEgPDwgKFIxREZfU0hJRlQpKQotI2RlZmluZSBSMkRGX01BU0sgKDB4MDEgPDwgKFIyREZfU0hJRlQpKQotI2RlZmluZSBSMUZFX01BU0sgMHgwMQotI2RlZmluZSBSMkZFX01BU0sgMHgwNQotI2RlZmluZSBUVDFfU0hJRlQgMAotI2RlZmluZSBUVDJfU0hJRlQgNAotI2RlZmluZSBUVF9PRkYgMAotI2RlZmluZSBUVF9PTiAxCi0jZGVmaW5lIFRUX01BU0sgNworI2RlZmluZSBDRkdfU1RPUAlCSVQoNikKKyNkZWZpbmUgQ0ZHX0NSMDA3NgkweDAwCisjZGVmaW5lIENGR19DUjAxODIJQklUKDQpCisjZGVmaW5lIENGR19DUjEwMDAJQklUKDUpCisjZGVmaW5lIENGR19DUjI3MDAJKEJJVCg0KSB8IEJJVCg1KSkKKyNkZWZpbmUgQ0ZHX0NSTUFTSwkoQklUKDQpIHwgQklUKDUpKQorI2RlZmluZSBSMU1TX01BU0sJQklUKDApCisjZGVmaW5lIFIyTVNfTUFTSwlCSVQoMikKKyNkZWZpbmUgUjFERl9NQVNLCUJJVCgxKQorI2RlZmluZSBSMkRGX01BU0sJQklUKDIpCisjZGVmaW5lIFIxRkVfTUFTSwlCSVQoMCkKKyNkZWZpbmUgUjJGRV9NQVNLCUJJVCgyKQorI2RlZmluZSBSMURNCQlCSVQoMCkKKyNkZWZpbmUgUjJETQkJQklUKDEpCisjZGVmaW5lIFRUMV9TSElGVAkwCisjZGVmaW5lIFRUMl9TSElGVAk0CisjZGVmaW5lIFRUX09GRgkJMAorI2RlZmluZSBUVF9PTgkJMQorI2RlZmluZSBUVF9NQVNLCQk3CiAjZGVmaW5lIE5BVFNFTUlfTUFOX0lECTB4MDEKICNkZWZpbmUgTE05NTIzMV9DSElQX0lECTB4QTEKICNkZWZpbmUgTE05NTI0MV9DSElQX0lECTB4QTQKQEAgLTkxLDExICs4NSwxMiBAQAogc3RydWN0IGxtOTUyNDFfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKIAlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7Ci0JdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQsIGludGVydmFsOwkvKiBpbiBqaWZmaWVzICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIGluIGppZmZpZXMgKi8KKwl1bnNpZ25lZCBsb25nIGludGVydmFsOwkJLyogaW4gbWlsbGktc2Vjb25kcyAqLwogCWNoYXIgdmFsaWQ7CQkvKiB6ZXJvIHVudGlsIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCiAJLyogcmVnaXN0ZXJzIHZhbHVlcyAqLwogCXU4IHRlbXBbQVJSQVlfU0laRShsbTk1MjQxX3JlZ19hZGRyZXNzKV07Ci0JdTggY29uZmlnLCBtb2RlbCwgdHJ1dGhlcm07CisJdTggc3RhdHVzLCBjb25maWcsIG1vZGVsLCB0cnV0aGVybTsKIH07CiAKIC8qIENvbnZlcnNpb25zICovCkBAIC0xMTgsNyArMTEzLDggQEAKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAotCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIGRhdGEtPmludGVydmFsKSB8fAorCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZAorCQkgICAgICAgKyBtc2Vjc190b19qaWZmaWVzKGRhdGEtPmludGVydmFsKSkgfHwKIAkgICAgIWRhdGEtPnZhbGlkKSB7CiAJCWludCBpOwogCkBAIC0xMjcsNiArMTIzLDkgQEAKIAkJCWRhdGEtPnRlbXBbaV0KIAkJCSAgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAogCQkJCQkJICAgICBsbTk1MjQxX3JlZ19hZGRyZXNzW2ldKTsKKworCQlkYXRhLT5zdGF0dXMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkJCUxNOTUyNDFfUkVHX1JfU1RBVFVTKTsKIAkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKIAkJZGF0YS0+dmFsaWQgPSAxOwogCX0KQEAgLTEzNiwxOTcgKzEzNSwyNDEgQEAKIAlyZXR1cm4gZGF0YTsKIH0KIAotLyogU3lzZnMgc3R1ZmYgKi8KLXN0YXRpYyBzc2l6ZV90IHNob3dfaW5wdXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgY2hhciAqYnVmKQotewotCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBsbTk1MjQxX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwgIiVkXG4iLAotCQkJaW5kZXggPT0gMCB8fCAoZGF0YS0+Y29uZmlnICYgKDEgPDwgKGluZGV4IC8gMikpKSA/Ci0JCXRlbXBfZnJvbV9yZWdfc2lnbmVkKGRhdGEtPnRlbXBbaW5kZXhdLCBkYXRhLT50ZW1wW2luZGV4ICsgMV0pIDoKLQkJdGVtcF9mcm9tX3JlZ191bnNpZ25lZChkYXRhLT50ZW1wW2luZGV4XSwKLQkJCQkgICAgICAgZGF0YS0+dGVtcFtpbmRleCArIDFdKSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfdHlwZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgbG05NTI0MV9yZWFkX2NoaXAoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgYXR0ciwgaW50IGNoYW5uZWwsCisJCQkgICAgIGxvbmcgKnZhbCkKIHsKIAlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUgLSAxLAotCQlkYXRhLT5tb2RlbCAmIHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXggPyAiMVxuIiA6ICIyXG4iKTsKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9uX2NoaXBfdXBkYXRlX2ludGVydmFsOgorCQkqdmFsID0gZGF0YS0+aW50ZXJ2YWw7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNldF90eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBpbnQgbG05NTI0MV9yZWFkX3RlbXAoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgYXR0ciwgaW50IGNoYW5uZWwsCisJCQkgICAgIGxvbmcgKnZhbCkKK3sKKwlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gbG05NTI0MV91cGRhdGVfZGV2aWNlKGRldik7CisKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9uX3RlbXBfaW5wdXQ6CisJCWlmICghY2hhbm5lbCB8fCAoZGF0YS0+Y29uZmlnICYgQklUKGNoYW5uZWwgLSAxKSkpCisJCQkqdmFsID0gdGVtcF9mcm9tX3JlZ19zaWduZWQoZGF0YS0+dGVtcFtjaGFubmVsICogMl0sCisJCQkJCQlkYXRhLT50ZW1wW2NoYW5uZWwgKiAyICsgMV0pOworCQllbHNlCisJCQkqdmFsID0gdGVtcF9mcm9tX3JlZ191bnNpZ25lZChkYXRhLT50ZW1wW2NoYW5uZWwgKiAyXSwKKwkJCQkJCWRhdGEtPnRlbXBbY2hhbm5lbCAqIDIgKyAxXSk7CisJCXJldHVybiAwOworCWNhc2UgaHdtb25fdGVtcF9taW46CisJCWlmIChjaGFubmVsID09IDEpCisJCQkqdmFsID0gKGRhdGEtPmNvbmZpZyAmIFIxREZfTUFTSykgPyAtMTI4MDAwIDogMDsKKwkJZWxzZQorCQkJKnZhbCA9IChkYXRhLT5jb25maWcgJiBSMkRGX01BU0spID8gLTEyODAwMCA6IDA7CisJCXJldHVybiAwOworCWNhc2UgaHdtb25fdGVtcF9tYXg6CisJCWlmIChjaGFubmVsID09IDEpCisJCQkqdmFsID0gKGRhdGEtPmNvbmZpZyAmIFIxREZfTUFTSykgPyAxMjc4NzUgOiAyNTU4NzU7CisJCWVsc2UKKwkJCSp2YWwgPSAoZGF0YS0+Y29uZmlnICYgUjJERl9NQVNLKSA/IDEyNzg3NSA6IDI1NTg3NTsKKwkJcmV0dXJuIDA7CisJY2FzZSBod21vbl90ZW1wX3R5cGU6CisJCWlmIChjaGFubmVsID09IDEpCisJCQkqdmFsID0gKGRhdGEtPm1vZGVsICYgUjFNU19NQVNLKSA/IDEgOiAyOworCQllbHNlCisJCQkqdmFsID0gKGRhdGEtPm1vZGVsICYgUjJNU19NQVNLKSA/IDEgOiAyOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3RlbXBfZmF1bHQ6CisJCWlmIChjaGFubmVsID09IDEpCisJCQkqdmFsID0gISEoZGF0YS0+c3RhdHVzICYgUjFETSk7CisJCWVsc2UKKwkJCSp2YWwgPSAhIShkYXRhLT5zdGF0dXMgJiBSMkRNKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KKworc3RhdGljIGludCBsbTk1MjQxX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkJdTMyIGF0dHIsIGludCBjaGFubmVsLCBsb25nICp2YWwpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBod21vbl9jaGlwOgorCQlyZXR1cm4gbG05NTI0MV9yZWFkX2NoaXAoZGV2LCBhdHRyLCBjaGFubmVsLCB2YWwpOworCWNhc2UgaHdtb25fdGVtcDoKKwkJcmV0dXJuIGxtOTUyNDFfcmVhZF90ZW1wKGRldiwgYXR0ciwgY2hhbm5lbCwgdmFsKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCitzdGF0aWMgaW50IGxtOTUyNDFfd3JpdGVfY2hpcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwKKwkJCSAgICAgIGxvbmcgdmFsKQoreworCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgY29udnJhdGU7CisJdTggY29uZmlnOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9uX2NoaXBfdXBkYXRlX2ludGVydmFsOgorCQljb25maWcgPSBkYXRhLT5jb25maWcgJiB+Q0ZHX0NSTUFTSzsKKwkJaWYgKHZhbCA8IDEzMCkgeworCQkJY29udnJhdGUgPSA3NjsKKwkJCWNvbmZpZyB8PSBDRkdfQ1IwMDc2OworCQl9IGVsc2UgaWYgKHZhbCA8IDU5MCkgeworCQkJY29udnJhdGUgPSAxODI7CisJCQljb25maWcgfD0gQ0ZHX0NSMDE4MjsKKwkJfSBlbHNlIGlmICh2YWwgPCAxODUwKSB7CisJCQljb252cmF0ZSA9IDEwMDA7CisJCQljb25maWcgfD0gQ0ZHX0NSMTAwMDsKKwkJfSBlbHNlIHsKKwkJCWNvbnZyYXRlID0gMjcwMDsKKwkJCWNvbmZpZyB8PSBDRkdfQ1IyNzAwOworCQl9CisJCWRhdGEtPmludGVydmFsID0gY29udnJhdGU7CisJCWRhdGEtPmNvbmZpZyA9IGNvbmZpZzsKKwkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCisJCQkJCQlMTTk1MjQxX1JFR19SV19DT05GSUcsIGNvbmZpZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FT1BOT1RTVVBQOworCQlicmVhazsKKwl9CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBsbTk1MjQxX3dyaXRlX3RlbXAoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgYXR0ciwgaW50IGNoYW5uZWwsCisJCQkgICAgICBsb25nIHZhbCkKIHsKIAlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgc2hpZnQ7Ci0JdTggbWFzayA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7Ci0KLQlpZiAoa3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAodmFsICE9IDEgJiYgdmFsICE9IDIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc2hpZnQgPSBtYXNrID09IFIxTVNfTUFTSyA/IFRUMV9TSElGVCA6IFRUMl9TSElGVDsKKwlpbnQgcmV0OwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCi0JZGF0YS0+dHJ1dGhlcm0gJj0gfihUVF9NQVNLIDw8IHNoaWZ0KTsKLQlpZiAodmFsID09IDEpIHsKLQkJZGF0YS0+bW9kZWwgfD0gbWFzazsKLQkJZGF0YS0+dHJ1dGhlcm0gfD0gKFRUX09OIDw8IHNoaWZ0KTsKLQl9IGVsc2UgewotCQlkYXRhLT5tb2RlbCAmPSB+bWFzazsKLQkJZGF0YS0+dHJ1dGhlcm0gfD0gKFRUX09GRiA8PCBzaGlmdCk7CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl90ZW1wX21pbjoKKwkJaWYgKGNoYW5uZWwgPT0gMSkgeworCQkJaWYgKHZhbCA8IDApCisJCQkJZGF0YS0+Y29uZmlnIHw9IFIxREZfTUFTSzsKKwkJCWVsc2UKKwkJCQlkYXRhLT5jb25maWcgJj0gflIxREZfTUFTSzsKKwkJfSBlbHNlIHsKKwkJCWlmICh2YWwgPCAwKQorCQkJCWRhdGEtPmNvbmZpZyB8PSBSMkRGX01BU0s7CisJCQllbHNlCisJCQkJZGF0YS0+Y29uZmlnICY9IH5SMkRGX01BU0s7CisJCX0KKwkJZGF0YS0+dmFsaWQgPSAwOworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfQ09ORklHLAorCQkJCQkJZGF0YS0+Y29uZmlnKTsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX21heDoKKwkJaWYgKGNoYW5uZWwgPT0gMSkgeworCQkJaWYgKHZhbCA8PSAxMjc4NzUpCisJCQkJZGF0YS0+Y29uZmlnIHw9IFIxREZfTUFTSzsKKwkJCWVsc2UKKwkJCQlkYXRhLT5jb25maWcgJj0gflIxREZfTUFTSzsKKwkJfSBlbHNlIHsKKwkJCWlmICh2YWwgPD0gMTI3ODc1KQorCQkJCWRhdGEtPmNvbmZpZyB8PSBSMkRGX01BU0s7CisJCQllbHNlCisJCQkJZGF0YS0+Y29uZmlnICY9IH5SMkRGX01BU0s7CisJCX0KKwkJZGF0YS0+dmFsaWQgPSAwOworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfQ09ORklHLAorCQkJCQkJZGF0YS0+Y29uZmlnKTsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX3R5cGU6CisJCWlmICh2YWwgIT0gMSAmJiB2YWwgIT0gMikgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjaGFubmVsID09IDEpIHsKKwkJCWRhdGEtPnRydXRoZXJtICY9IH4oVFRfTUFTSyA8PCBUVDFfU0hJRlQpOworCQkJaWYgKHZhbCA9PSAxKSB7CisJCQkJZGF0YS0+bW9kZWwgfD0gUjFNU19NQVNLOworCQkJCWRhdGEtPnRydXRoZXJtIHw9IChUVF9PTiA8PCBUVDFfU0hJRlQpOworCQkJfSBlbHNlIHsKKwkJCQlkYXRhLT5tb2RlbCAmPSB+UjFNU19NQVNLOworCQkJCWRhdGEtPnRydXRoZXJtIHw9IChUVF9PRkYgPDwgVFQxX1NISUZUKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWRhdGEtPnRydXRoZXJtICY9IH4oVFRfTUFTSyA8PCBUVDJfU0hJRlQpOworCQkJaWYgKHZhbCA9PSAxKSB7CisJCQkJZGF0YS0+bW9kZWwgfD0gUjJNU19NQVNLOworCQkJCWRhdGEtPnRydXRoZXJtIHw9IChUVF9PTiA8PCBUVDJfU0hJRlQpOworCQkJfSBlbHNlIHsKKwkJCQlkYXRhLT5tb2RlbCAmPSB+UjJNU19NQVNLOworCQkJCWRhdGEtPnRydXRoZXJtIHw9IChUVF9PRkYgPDwgVFQyX1NISUZUKTsKKwkJCX0KKwkJfQorCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCUxNOTUyNDFfUkVHX1JXX1JFTU9URV9NT0RFTCwKKwkJCQkJCWRhdGEtPm1vZGVsKTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKwkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDFfUkVHX1JXX1RSVVRIRVJNLAorCQkJCQkJZGF0YS0+dHJ1dGhlcm0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CiAJfQotCWRhdGEtPnZhbGlkID0gMDsKLQotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQxX1JFR19SV19SRU1PVEVfTU9ERUwsCi0JCQkJICBkYXRhLT5tb2RlbCk7Ci0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDFfUkVHX1JXX1RSVVRIRVJNLAotCQkJCSAgZGF0YS0+dHJ1dGhlcm0pOwogCiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKLQlyZXR1cm4gY291bnQ7CisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19taW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCWNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgbG05NTI0MV93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQkgdTMyIGF0dHIsIGludCBjaGFubmVsLCBsb25nIHZhbCkKIHsKLQlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUgLSAxLAotCQkJZGF0YS0+Y29uZmlnICYgdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleCA/Ci0JCQkiLTEyNzAwMFxuIiA6ICIwXG4iKTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIGh3bW9uX2NoaXA6CisJCXJldHVybiBsbTk1MjQxX3dyaXRlX2NoaXAoZGV2LCBhdHRyLCBjaGFubmVsLCB2YWwpOworCWNhc2UgaHdtb25fdGVtcDoKKwkJcmV0dXJuIGxtOTUyNDFfd3JpdGVfdGVtcChkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIH0KIAotc3RhdGljIHNzaXplX3Qgc2V0X21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgdW1vZGVfdCBsbTk1MjQxX2lzX3Zpc2libGUoY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQkJICB1MzIgYXR0ciwgaW50IGNoYW5uZWwpCiB7Ci0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWxvbmcgdmFsOwotCi0JaWYgKGtzdHJ0b2woYnVmLCAxMCwgJnZhbCkgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAodmFsIDwgLTEyODAwMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlpZiAodmFsIDwgMCkKLQkJZGF0YS0+Y29uZmlnIHw9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7Ci0JZWxzZQotCQlkYXRhLT5jb25maWcgJj0gfnRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7Ci0JZGF0YS0+dmFsaWQgPSAwOwotCi0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIExNOTUyNDFfUkVHX1JXX0NPTkZJRywKLQkJCQkgIGRhdGEtPmNvbmZpZyk7Ci0KLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQotCXJldHVybiBjb3VudDsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIGh3bW9uX2NoaXA6CisJCXN3aXRjaCAoYXR0cikgeworCQljYXNlIGh3bW9uX2NoaXBfdXBkYXRlX2ludGVydmFsOgorCQkJcmV0dXJuIFNfSVJVR08gfCBTX0lXVVNSOworCQl9CisJCWJyZWFrOworCWNhc2UgaHdtb25fdGVtcDoKKwkJc3dpdGNoIChhdHRyKSB7CisJCWNhc2UgaHdtb25fdGVtcF9pbnB1dDoKKwkJCXJldHVybiBTX0lSVUdPOworCQljYXNlIGh3bW9uX3RlbXBfZmF1bHQ6CisJCQlyZXR1cm4gU19JUlVHTzsKKwkJY2FzZSBod21vbl90ZW1wX21pbjoKKwkJY2FzZSBod21vbl90ZW1wX21heDoKKwkJY2FzZSBod21vbl90ZW1wX3R5cGU6CisJCQlyZXR1cm4gU19JUlVHTyB8IFNfSVdVU1I7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJY2hhciAqYnVmKQotewotCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsCi0JCQlkYXRhLT5jb25maWcgJiB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4ID8KLQkJCSIxMjcwMDBcbiIgOiAiMjU1MDAwXG4iKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2V0X21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWxvbmcgdmFsOwotCi0JaWYgKGtzdHJ0b2woYnVmLCAxMCwgJnZhbCkgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAodmFsID49IDI1NjAwMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlpZiAodmFsIDw9IDEyNzAwMCkKLQkJZGF0YS0+Y29uZmlnIHw9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7Ci0JZWxzZQotCQlkYXRhLT5jb25maWcgJj0gfnRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7Ci0JZGF0YS0+dmFsaWQgPSAwOwotCi0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIExNOTUyNDFfUkVHX1JXX0NPTkZJRywKLQkJCQkgIGRhdGEtPmNvbmZpZyk7Ci0KLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd19pbnRlcnZhbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGxtOTUyNDFfdXBkYXRlX2RldmljZShkZXYpOwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwgIiVsdVxuIiwgMTAwMCAqIGRhdGEtPmludGVydmFsCi0JCQkvIEhaKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2V0X2ludGVydmFsKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXVuc2lnbmVkIGxvbmcgdmFsOwotCi0JaWYgKGtzdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkYXRhLT5pbnRlcnZhbCA9IHZhbCAqIEhaIC8gMTAwMDsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd19pbnB1dCwgTlVMTCwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2lucHV0LCBTX0lSVUdPLCBzaG93X2lucHV0LCBOVUxMLCAyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfaW5wdXQsIFNfSVJVR08sIHNob3dfaW5wdXQsIE5VTEwsIDQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl90eXBlLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190eXBlLCBzZXRfdHlwZSwKLQkJCSAgUjFNU19NQVNLKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfdHlwZSwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdHlwZSwgc2V0X3R5cGUsCi0JCQkgIFIyTVNfTUFTSyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbWluLCBzZXRfbWluLAotCQkJICBSMURGX01BU0spOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X21pbiwgc2V0X21pbiwKLQkJCSAgUjJERl9NQVNLKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19tYXgsIHNldF9tYXgsCi0JCQkgIFIxREZfTUFTSyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbWF4LCBzZXRfbWF4LAotCQkJICBSMkRGX01BU0spOwotc3RhdGljIERFVklDRV9BVFRSKHVwZGF0ZV9pbnRlcnZhbCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW50ZXJ2YWwsCi0JCSAgIHNldF9pbnRlcnZhbCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsbTk1MjQxX2F0dHJzW10gPSB7Ci0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl90eXBlLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wM190eXBlLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9taW4uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX21pbi5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbWF4LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19tYXguZGV2X2F0dHIuYXR0ciwKLQkmZGV2X2F0dHJfdXBkYXRlX2ludGVydmFsLmF0dHIsCi0JTlVMTAotfTsKLUFUVFJJQlVURV9HUk9VUFMobG05NTI0MSk7Ci0KIC8qIFJldHVybiAwIGlmIGRldGVjdGlvbiBpcyBzdWNjZXNzZnVsLCAtRU5PREVWIG90aGVyd2lzZSAqLwogc3RhdGljIGludCBsbTk1MjQxX2RldGVjdChzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudCwKIAkJCSAgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQpAQCAtMzYyLDggKzQwNSw4IEBACiBzdGF0aWMgdm9pZCBsbTk1MjQxX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSkKIHsKLQlkYXRhLT5pbnRlcnZhbCA9IEhaOwkvKiAxIHNlYyBkZWZhdWx0ICovCi0JZGF0YS0+Y29uZmlnID0gQ0ZHX0NSMDA3NjsKKwlkYXRhLT5pbnRlcnZhbCA9IDEwMDA7CisJZGF0YS0+Y29uZmlnID0gQ0ZHX0NSMTAwMDsKIAlkYXRhLT50cnV0aGVybSA9IChUVF9PRkYgPDwgVFQxX1NISUZUKSB8IChUVF9PRkYgPDwgVFQyX1NISUZUKTsKIAogCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQxX1JFR19SV19DT05GSUcsIGRhdGEtPmNvbmZpZyk7CkBAIC0zNzUsNiArNDE4LDQ3IEBACiAJCQkJICBkYXRhLT5tb2RlbCk7CiB9CiAKK3N0YXRpYyBjb25zdCB1MzIgbG05NTI0MV9jaGlwX2NvbmZpZ1tdID0geworCUhXTU9OX0NfVVBEQVRFX0lOVEVSVkFMLAorCTAKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIGxtOTUyNDFfY2hpcCA9IHsKKwkudHlwZSA9IGh3bW9uX2NoaXAsCisJLmNvbmZpZyA9IGxtOTUyNDFfY2hpcF9jb25maWcsCit9OworCitzdGF0aWMgY29uc3QgdTMyIGxtOTUyNDFfdGVtcF9jb25maWdbXSA9IHsKKwlIV01PTl9UX0lOUFVULAorCUhXTU9OX1RfSU5QVVQgfCBIV01PTl9UX01BWCB8IEhXTU9OX1RfTUlOIHwgSFdNT05fVF9UWVBFIHwKKwkJSFdNT05fVF9GQVVMVCwKKwlIV01PTl9UX0lOUFVUIHwgSFdNT05fVF9NQVggfCBIV01PTl9UX01JTiB8IEhXTU9OX1RfVFlQRSB8CisJCUhXTU9OX1RfRkFVTFQsCisJMAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gbG05NTI0MV90ZW1wID0geworCS50eXBlID0gaHdtb25fdGVtcCwKKwkuY29uZmlnID0gbG05NTI0MV90ZW1wX2NvbmZpZywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvICpsbTk1MjQxX2luZm9bXSA9IHsKKwkmbG05NTI0MV9jaGlwLAorCSZsbTk1MjQxX3RlbXAsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9vcHMgbG05NTI0MV9od21vbl9vcHMgPSB7CisJLmlzX3Zpc2libGUgPSBsbTk1MjQxX2lzX3Zpc2libGUsCisJLnJlYWQgPSBsbTk1MjQxX3JlYWQsCisJLndyaXRlID0gbG05NTI0MV93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hpcF9pbmZvIGxtOTUyNDFfY2hpcF9pbmZvID0geworCS5vcHMgPSAmbG05NTI0MV9od21vbl9vcHMsCisJLmluZm8gPSBsbTk1MjQxX2luZm8sCit9OworCiBzdGF0aWMgaW50IGxtOTUyNDFfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CkBAIC0zOTIsOSArNDc2LDEwIEBACiAJLyogSW5pdGlhbGl6ZSB0aGUgTE05NTI0MSBjaGlwICovCiAJbG05NTI0MV9pbml0X2NsaWVudChjbGllbnQsIGRhdGEpOwogCi0JaHdtb25fZGV2ID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoZGV2LCBjbGllbnQtPm5hbWUsCisJaHdtb25fZGV2ID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvKGRldiwgY2xpZW50LT5uYW1lLAogCQkJCQkJCSAgIGRhdGEsCi0JCQkJCQkJICAgbG05NTI0MV9ncm91cHMpOworCQkJCQkJCSAgICZsbTk1MjQxX2NoaXBfaW5mbywKKwkJCQkJCQkgICBOVUxMKTsKIAlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGh3bW9uX2Rldik7CiB9CiAKQEAgLTQyMCw1ICs1MDUsNSBAQAogbW9kdWxlX2kyY19kcml2ZXIobG05NTI0MV9kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJEYXZpZGUgUml6em8gPGVscGEucml6em9AZ21haWwuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJMTTk1MjQxIHNlbnNvciBkcml2ZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTE05NTIzMS9MTTk1MjQxIHNlbnNvciBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG05NTI0NS5jIGIvZHJpdmVycy9od21vbi9sbTk1MjQ1LmMKaW5kZXggZTdhZWY0NS4uYTNiZmQ4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTk1MjQ1LmMKKysrIGIvZHJpdmVycy9od21vbi9sbTk1MjQ1LmMKQEAgLTE1LDIyICsxNSwxNiBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaHdtb24uaD4KLSNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7CiAJMHgxOCwgMHgxOSwgMHgyOSwgMHg0YywgMHg0ZCwgSTJDX0NMSUVOVF9FTkQgfTsKQEAgLTg5LDYgKzgzLDcgQEAKICNkZWZpbmUgUkFURV9DUjEwMDAJMHgwMgogI2RlZmluZSBSQVRFX0NSMjUwMAkweDAzCiAKKyNkZWZpbmUgU1RBVFVTMV9ST1MJCTB4MTAKICNkZWZpbmUgU1RBVFVTMV9ESU9ERV9GQVVMVAkweDA0CiAjZGVmaW5lIFNUQVRVUzFfUlRDUklUCQkweDAyCiAjZGVmaW5lIFNUQVRVUzFfTE9DCQkweDAxCkBAIC0xMTIsMTQgKzEwNyw5IEBACiAKIC8qIENsaWVudCBkYXRhIChlYWNoIGNsaWVudCBnZXRzIGl0cyBvd24pICovCiBzdHJ1Y3QgbG05NTI0NV9kYXRhIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKIAlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7Ci0JdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIGluIGppZmZpZXMgKi8KLQl1bnNpZ25lZCBsb25nIGludGVydmFsOwkvKiBpbiBtc2VjcyAqLwotCWJvb2wgdmFsaWQ7CQkvKiB6ZXJvIHVudGlsIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCi0JLyogcmVnaXN0ZXJzIHZhbHVlcyAqLwotCXU4IHJlZ3NbQVJSQVlfU0laRShsbTk1MjQ1X3JlZ19hZGRyZXNzKV07Ci0JdTggY29uZmlnMSwgY29uZmlnMjsKKwlpbnQgaW50ZXJ2YWw7CS8qIGluIG1zZWNzICovCiB9OwogCiAvKiBDb252ZXJzaW9ucyAqLwpAQCAtMTM1LDYwICsxMjUsMzYgQEAKIAlyZXR1cm4gdGVtcF9mcm9tX3JlZ191bnNpZ25lZCh2YWxfaCwgdmFsX2wpOwogfQogCi1zdGF0aWMgc3RydWN0IGxtOTUyNDVfZGF0YSAqbG05NTI0NV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgbG05NTI0NV9yZWFkX2NvbnZlcnNpb25fcmF0ZShzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhKQogewotCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OworCXVuc2lnbmVkIGludCByYXRlOworCWludCByZXQ7CiAKLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQKLQkJKyBtc2Vjc190b19qaWZmaWVzKGRhdGEtPmludGVydmFsKSkgfHwgIWRhdGEtPnZhbGlkKSB7Ci0JCWludCBpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxtOTUyNDVfcmVnX2FkZHJlc3MpOyBpKyspCi0JCQlkYXRhLT5yZWdzW2ldCi0JCQkgID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCQkJCSAgICAgbG05NTI0NV9yZWdfYWRkcmVzc1tpXSk7Ci0JCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7Ci0JCWRhdGEtPnZhbGlkID0gMTsKLQl9Ci0KLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQotCXJldHVybiBkYXRhOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBsbTk1MjQ1X3JlYWRfY29udmVyc2lvbl9yYXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0JaW50IHJhdGU7Ci0JdW5zaWduZWQgbG9uZyBpbnRlcnZhbDsKLQotCXJhdGUgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQ1X1JFR19SV19DT05WRVJTX1JBVEUpOworCXJldCA9IHJlZ21hcF9yZWFkKGRhdGEtPnJlZ21hcCwgTE05NTI0NV9SRUdfUldfQ09OVkVSU19SQVRFLCAmcmF0ZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAlzd2l0Y2ggKHJhdGUpIHsKIAljYXNlIFJBVEVfQ1IwMDYzOgotCQlpbnRlcnZhbCA9IDYzOworCQlkYXRhLT5pbnRlcnZhbCA9IDYzOwogCQlicmVhazsKIAljYXNlIFJBVEVfQ1IwMzY0OgotCQlpbnRlcnZhbCA9IDM2NDsKKwkJZGF0YS0+aW50ZXJ2YWwgPSAzNjQ7CiAJCWJyZWFrOwogCWNhc2UgUkFURV9DUjEwMDA6Ci0JCWludGVydmFsID0gMTAwMDsKKwkJZGF0YS0+aW50ZXJ2YWwgPSAxMDAwOwogCQlicmVhazsKIAljYXNlIFJBVEVfQ1IyNTAwOgogCWRlZmF1bHQ6Ci0JCWludGVydmFsID0gMjUwMDsKKwkJZGF0YS0+aW50ZXJ2YWwgPSAyNTAwOwogCQlicmVhazsKIAl9Ci0KLQlyZXR1cm4gaW50ZXJ2YWw7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxtOTUyNDVfc2V0X2NvbnZlcnNpb25fcmF0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJdW5zaWduZWQgbG9uZyBpbnRlcnZhbCkKK3N0YXRpYyBpbnQgbG05NTI0NV9zZXRfY29udmVyc2lvbl9yYXRlKHN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEsIGxvbmcgaW50ZXJ2YWwpCiB7Ci0JaW50IHJhdGU7CisJaW50IHJldCwgcmF0ZTsKIAogCWlmIChpbnRlcnZhbCA8PSA2MykgewogCQlpbnRlcnZhbCA9IDYzOwpAQCAtMjA0LDIyMCArMTcwLDI4OCBAQAogCQlyYXRlID0gUkFURV9DUjI1MDA7CiAJfQogCi0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDVfUkVHX1JXX0NPTlZFUlNfUkFURSwgcmF0ZSk7CisJcmV0ID0gcmVnbWFwX3dyaXRlKGRhdGEtPnJlZ21hcCwgTE05NTI0NV9SRUdfUldfQ09OVkVSU19SQVRFLCByYXRlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAotCXJldHVybiBpbnRlcnZhbDsKKwlkYXRhLT5pbnRlcnZhbCA9IGludGVydmFsOworCXJldHVybiAwOwogfQogCi0vKiBTeXNmcyBzdHVmZiAqLwotc3RhdGljIHNzaXplX3Qgc2hvd19pbnB1dChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGxtOTUyNDVfdXBkYXRlX2RldmljZShkZXYpOwotCWludCB0ZW1wOwotCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7Ci0KLQkvKgotCSAqIEluZGV4IDAgKExvY2FsIHRlbXApIGlzIGFsd2F5cyBzaWduZWQKLQkgKiBJbmRleCAyIChSZW1vdGUgdGVtcCkgaGFzIGJvdGggc2lnbmVkIGFuZCB1bnNpZ25lZCBkYXRhCi0JICogdXNlIHNpZ25lZCBjYWxjdWxhdGlvbiBmb3IgcmVtb3RlIGlmIHNpZ25lZCBiaXQgaXMgc2V0Ci0JICovCi0JaWYgKGluZGV4ID09IDAgfHwgZGF0YS0+cmVnc1tpbmRleF0gJiAweDgwKQotCQl0ZW1wID0gdGVtcF9mcm9tX3JlZ19zaWduZWQoZGF0YS0+cmVnc1tpbmRleF0sCi0JCQkgICAgZGF0YS0+cmVnc1tpbmRleCArIDFdKTsKLQllbHNlCi0JCXRlbXAgPSB0ZW1wX2Zyb21fcmVnX3Vuc2lnbmVkKGRhdGEtPnJlZ3NbaW5kZXggKyAyXSwKLQkJCSAgICBkYXRhLT5yZWdzW2luZGV4ICsgM10pOwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwgIiVkXG4iLCB0ZW1wKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd19saW1pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gbG05NTI0NV91cGRhdGVfZGV2aWNlKGRldik7Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKLQotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsICIlZFxuIiwKLQkJCWRhdGEtPnJlZ3NbaW5kZXhdICogMTAwMCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNldF9saW1pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgaW50IGxtOTUyNDVfcmVhZF90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGF0dHIsIGludCBjaGFubmVsLAorCQkJICAgICBsb25nICp2YWwpCiB7CiAJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKLQl1bnNpZ25lZCBsb25nIHZhbDsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBkYXRhLT5yZWdtYXA7CisJaW50IHJldCwgcmVnbCwgcmVnaCwgcmVndmFsbCwgcmVndmFsaDsKIAotCWlmIChrc3RydG91bChidWYsIDEwLCAmdmFsKSA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JdmFsIC89IDEwMDA7Ci0KLQl2YWwgPSBjbGFtcF92YWwodmFsLCAwLCAoaW5kZXggPT0gNiA/IDEyNyA6IDI1NSkpOwotCi0JbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCi0JZGF0YS0+dmFsaWQgPSAwOwotCi0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIGxtOTUyNDVfcmVnX2FkZHJlc3NbaW5kZXhdLCB2YWwpOwotCi0JbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlyZXR1cm4gY291bnQ7CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl90ZW1wX2lucHV0OgorCQlyZWdsID0gY2hhbm5lbCA/IExNOTUyNDVfUkVHX1JfUkVNT1RFX1RFTVBMX1MgOgorCQkJCSBMTTk1MjQ1X1JFR19SX0xPQ0FMX1RFTVBMX1M7CisJCXJlZ2ggPSBjaGFubmVsID8gTE05NTI0NV9SRUdfUl9SRU1PVEVfVEVNUEhfUyA6CisJCQkJIExNOTUyNDVfUkVHX1JfTE9DQUxfVEVNUEhfUzsKKwkJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCByZWdsLCAmcmVndmFsbCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCByZWdoLCAmcmVndmFsaCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJLyoKKwkJICogTG9jYWwgdGVtcCBpcyBhbHdheXMgc2lnbmVkLgorCQkgKiBSZW1vdGUgdGVtcCBoYXMgYm90aCBzaWduZWQgYW5kIHVuc2lnbmVkIGRhdGEuCisJCSAqIFVzZSBzaWduZWQgY2FsY3VsYXRpb24gZm9yIHJlbW90ZSBpZiBzaWduZWQgYml0IGlzIHNldAorCQkgKiBvciBpZiByZXBvcnRlZCB0ZW1wZXJhdHVyZSBpcyBiZWxvdyBzaWduZWQgbGltaXQuCisJCSAqLworCQlpZiAoIWNoYW5uZWwgfHwgKHJlZ3ZhbGggJiAweDgwKSB8fCByZWd2YWxoIDwgMHg3ZikgeworCQkJKnZhbCA9IHRlbXBfZnJvbV9yZWdfc2lnbmVkKHJlZ3ZhbGgsIHJlZ3ZhbGwpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBMTTk1MjQ1X1JFR19SX1JFTU9URV9URU1QTF9VLAorCQkJCSAgJnJlZ3ZhbGwpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTE05NTI0NV9SRUdfUl9SRU1PVEVfVEVNUEhfVSwKKwkJCQkgICZyZWd2YWxoKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQkqdmFsID0gdGVtcF9mcm9tX3JlZ191bnNpZ25lZChyZWd2YWxoLCByZWd2YWxsKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBod21vbl90ZW1wX21heDoKKwkJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBMTTk1MjQ1X1JFR19SV19SRU1PVEVfT1NfTElNSVQsCisJCQkJICAmcmVndmFsaCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJKnZhbCA9IHJlZ3ZhbGggKiAxMDAwOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3RlbXBfY3JpdDoKKwkJcmVnaCA9IGNoYW5uZWwgPyBMTTk1MjQ1X1JFR19SV19SRU1PVEVfVENSSVRfTElNSVQgOgorCQkJCSBMTTk1MjQ1X1JFR19SV19MT0NBTF9PU19UQ1JJVF9MSU1JVDsKKwkJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCByZWdoLCAmcmVndmFsaCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJKnZhbCA9IHJlZ3ZhbGggKiAxMDAwOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3RlbXBfbWF4X2h5c3Q6CisJCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTE05NTI0NV9SRUdfUldfUkVNT1RFX09TX0xJTUlULAorCQkJCSAgJnJlZ3ZhbGgpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTE05NTI0NV9SRUdfUldfQ09NTU9OX0hZU1RFUkVTSVMsCisJCQkJICAmcmVndmFsbCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJKnZhbCA9IChyZWd2YWxoIC0gcmVndmFsbCkgKiAxMDAwOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3RlbXBfY3JpdF9oeXN0OgorCQlyZWdoID0gY2hhbm5lbCA/IExNOTUyNDVfUkVHX1JXX1JFTU9URV9UQ1JJVF9MSU1JVCA6CisJCQkJIExNOTUyNDVfUkVHX1JXX0xPQ0FMX09TX1RDUklUX0xJTUlUOworCQlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIHJlZ2gsICZyZWd2YWxoKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIExNOTUyNDVfUkVHX1JXX0NPTU1PTl9IWVNURVJFU0lTLAorCQkJCSAgJnJlZ3ZhbGwpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCSp2YWwgPSAocmVndmFsaCAtIHJlZ3ZhbGwpICogMTAwMDsKKwkJcmV0dXJuIDA7CisJY2FzZSBod21vbl90ZW1wX3R5cGU6CisJCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTE05NTI0NV9SRUdfUldfQ09ORklHMiwgJnJlZ3ZhbGgpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCSp2YWwgPSAocmVndmFsaCAmIENGRzJfUkVNT1RFX1RUKSA/IDEgOiAyOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3RlbXBfb2Zmc2V0OgorCQlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIExNOTUyNDVfUkVHX1JXX1JFTU9URV9PRkZMLAorCQkJCSAgJnJlZ3ZhbGwpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTE05NTI0NV9SRUdfUldfUkVNT1RFX09GRkgsCisJCQkJICAmcmVndmFsaCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJKnZhbCA9IHRlbXBfZnJvbV9yZWdfc2lnbmVkKHJlZ3ZhbGgsIHJlZ3ZhbGwpOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3RlbXBfbWF4X2FsYXJtOgorCQlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIExNOTUyNDVfUkVHX1JfU1RBVFVTMSwgJnJlZ3ZhbGgpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCSp2YWwgPSAhIShyZWd2YWxoICYgU1RBVFVTMV9ST1MpOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3RlbXBfY3JpdF9hbGFybToKKwkJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBMTTk1MjQ1X1JFR19SX1NUQVRVUzEsICZyZWd2YWxoKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQkqdmFsID0gISEocmVndmFsaCAmIChjaGFubmVsID8gU1RBVFVTMV9SVENSSVQgOiBTVEFUVVMxX0xPQykpOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3RlbXBfZmF1bHQ6CisJCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTE05NTI0NV9SRUdfUl9TVEFUVVMxLCAmcmVndmFsaCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJKnZhbCA9ICEhKHJlZ3ZhbGggJiBTVEFUVVMxX0RJT0RFX0ZBVUxUKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19jcml0X2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gbG05NTI0NV91cGRhdGVfZGV2aWNlKGRldik7Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKLQlpbnQgaHlzdCA9IGRhdGEtPnJlZ3NbaW5kZXhdIC0gZGF0YS0+cmVnc1s4XTsKLQotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsICIlZFxuIiwgaHlzdCAqIDEwMDApOwotfQotCi1zdGF0aWMgc3NpemVfdCBzZXRfY3JpdF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBpbnQgbG05NTI0NV93cml0ZV90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGF0dHIsIGludCBjaGFubmVsLAorCQkJICAgICAgbG9uZyB2YWwpCiB7CiAJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgaHlzdCwgbGltaXQ7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gZGF0YS0+cmVnbWFwOworCXVuc2lnbmVkIGludCByZWd2YWw7CisJaW50IHJldCwgcmVnOwogCi0JaWYgKGtzdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlsaW1pdCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIGxtOTUyNDVfcmVnX2FkZHJlc3NbaW5kZXhdKTsKLQloeXN0ID0gbGltaXQgLSB2YWwgLyAxMDAwOwotCWh5c3QgPSBjbGFtcF92YWwoaHlzdCwgMCwgMzEpOwotCWRhdGEtPnJlZ3NbOF0gPSBoeXN0OwotCi0JLyogc2hhcmVkIGNyaXQgaHlzdGVyZXNpcyAqLwotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQ1X1JFR19SV19DT01NT05fSFlTVEVSRVNJUywKLQkJaHlzdCk7Ci0KLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQotCXJldHVybiBjb3VudDsKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9uX3RlbXBfbWF4OgorCQl2YWwgPSBjbGFtcF92YWwodmFsIC8gMTAwMCwgMCwgMjU1KTsKKwkJcmV0ID0gcmVnbWFwX3dyaXRlKHJlZ21hcCwgTE05NTI0NV9SRUdfUldfUkVNT1RFX09TX0xJTUlULCB2YWwpOworCQlyZXR1cm4gcmV0OworCWNhc2UgaHdtb25fdGVtcF9jcml0OgorCQlyZWcgPSBjaGFubmVsID8gTE05NTI0NV9SRUdfUldfUkVNT1RFX1RDUklUX0xJTUlUIDoKKwkJCQlMTTk1MjQ1X1JFR19SV19MT0NBTF9PU19UQ1JJVF9MSU1JVDsKKwkJdmFsID0gY2xhbXBfdmFsKHZhbCAvIDEwMDAsIDAsIGNoYW5uZWwgPyAyNTUgOiAxMjcpOworCQlyZXQgPSByZWdtYXBfd3JpdGUocmVnbWFwLCByZWcsIHZhbCk7CisJCXJldHVybiByZXQ7CisJY2FzZSBod21vbl90ZW1wX2NyaXRfaHlzdDoKKwkJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCQlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIExNOTUyNDVfUkVHX1JXX0xPQ0FMX09TX1RDUklUX0xJTUlULAorCQkJCSAgJnJlZ3ZhbCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJLyogQ2xhbXAgdG8gcmVhc29uYWJsZSByYW5nZSB0byBwcmV2ZW50IG92ZXJmbG93ICovCisJCXZhbCA9IGNsYW1wX3ZhbCh2YWwsIC0xMDAwMDAwLCAxMDAwMDAwKTsKKwkJdmFsID0gcmVndmFsIC0gdmFsIC8gMTAwMDsKKwkJdmFsID0gY2xhbXBfdmFsKHZhbCwgMCwgMzEpOworCQlyZXQgPSByZWdtYXBfd3JpdGUocmVnbWFwLCBMTTk1MjQ1X1JFR19SV19DT01NT05fSFlTVEVSRVNJUywKKwkJCQkgICB2YWwpOworCQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwkJcmV0dXJuIHJldDsKKwljYXNlIGh3bW9uX3RlbXBfb2Zmc2V0OgorCQl2YWwgPSBjbGFtcF92YWwodmFsLCAtMTI4MDAwLCAxMjc4NzUpOworCQl2YWwgPSB2YWwgKiAyNTYgLyAxMDAwOworCQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJCXJldCA9IHJlZ21hcF93cml0ZShyZWdtYXAsIExNOTUyNDVfUkVHX1JXX1JFTU9URV9PRkZMLAorCQkJCSAgIHZhbCAmIDB4ZTApOworCQlpZiAocmV0IDwgMCkgeworCQkJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXJldCA9IHJlZ21hcF93cml0ZShyZWdtYXAsIExNOTUyNDVfUkVHX1JXX1JFTU9URV9PRkZILAorCQkJCSAgICh2YWwgPj4gOCkgJiAweGZmKTsKKwkJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJCXJldHVybiByZXQ7CisJY2FzZSBod21vbl90ZW1wX3R5cGU6CisJCWlmICh2YWwgIT0gMSAmJiB2YWwgIT0gMikKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMocmVnbWFwLCBMTTk1MjQ1X1JFR19SV19DT05GSUcyLAorCQkJCQkgQ0ZHMl9SRU1PVEVfVFQsCisJCQkJCSB2YWwgPT0gMSA/IENGRzJfUkVNT1RFX1RUIDogMCk7CisJCXJldHVybiByZXQ7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd190eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgY2hhciAqYnVmKQorc3RhdGljIGludCBsbTk1MjQ1X3JlYWRfY2hpcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwKKwkJCSAgICAgbG9uZyAqdmFsKQogewogCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsCi0JCWRhdGEtPmNvbmZpZzIgJiBDRkcyX1JFTU9URV9UVCA/ICIxXG4iIDogIjJcbiIpOworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fY2hpcF91cGRhdGVfaW50ZXJ2YWw6CisJCSp2YWwgPSBkYXRhLT5pbnRlcnZhbDsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIH0KIAotc3RhdGljIHNzaXplX3Qgc2V0X3R5cGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIGludCBsbTk1MjQ1X3dyaXRlX2NoaXAoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgYXR0ciwgaW50IGNoYW5uZWwsCisJCQkgICAgICBsb25nIHZhbCkKIHsKIAlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKLQl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgcmV0OwogCi0JaWYgKGtzdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQotCWlmICh2YWwgPT0gMSkKLQkJZGF0YS0+Y29uZmlnMiB8PSBDRkcyX1JFTU9URV9UVDsKLQllbHNlCi0JCWRhdGEtPmNvbmZpZzIgJj0gfkNGRzJfUkVNT1RFX1RUOwotCi0JZGF0YS0+dmFsaWQgPSAwOwotCi0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDVfUkVHX1JXX0NPTkZJRzIsCi0JCQkJICBkYXRhLT5jb25maWcyKTsKLQotCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCi0JcmV0dXJuIGNvdW50OworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fY2hpcF91cGRhdGVfaW50ZXJ2YWw6CisJCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwkJcmV0ID0gbG05NTI0NV9zZXRfY29udmVyc2lvbl9yYXRlKGRhdGEsIHZhbCk7CisJCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCQlyZXR1cm4gcmV0OworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSBjaGFyICpidWYpCitzdGF0aWMgaW50IGxtOTUyNDVfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQl1MzIgYXR0ciwgaW50IGNoYW5uZWwsIGxvbmcgKnZhbCkKIHsKLQlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gbG05NTI0NV91cGRhdGVfZGV2aWNlKGRldik7Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKLQotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsICIlZFxuIiwKLQkJCSEhKGRhdGEtPnJlZ3NbOV0gJiBpbmRleCkpOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgaHdtb25fY2hpcDoKKwkJcmV0dXJuIGxtOTUyNDVfcmVhZF9jaGlwKGRldiwgYXR0ciwgY2hhbm5lbCwgdmFsKTsKKwljYXNlIGh3bW9uX3RlbXA6CisJCXJldHVybiBsbTk1MjQ1X3JlYWRfdGVtcChkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19pbnRlcnZhbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgICBjaGFyICpidWYpCitzdGF0aWMgaW50IGxtOTUyNDVfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkJIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyB2YWwpCiB7Ci0Jc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGxtOTUyNDVfdXBkYXRlX2RldmljZShkZXYpOwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwgIiVsdVxuIiwgZGF0YS0+aW50ZXJ2YWwpOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgaHdtb25fY2hpcDoKKwkJcmV0dXJuIGxtOTUyNDVfd3JpdGVfY2hpcChkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJY2FzZSBod21vbl90ZW1wOgorCQlyZXR1cm4gbG05NTI0NV93cml0ZV90ZW1wKGRldiwgYXR0ciwgY2hhbm5lbCwgdmFsKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQogfQogCi1zdGF0aWMgc3NpemVfdCBzZXRfaW50ZXJ2YWwoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyB1bW9kZV90IGxtOTUyNDVfdGVtcF9pc192aXNpYmxlKGNvbnN0IHZvaWQgKmRhdGEsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCkKIHsKLQlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQotCWlmIChrc3RydG91bChidWYsIDEwLCAmdmFsKSA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCi0JZGF0YS0+aW50ZXJ2YWwgPSBsbTk1MjQ1X3NldF9jb252ZXJzaW9uX3JhdGUoY2xpZW50LCB2YWwpOwotCi0JbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlyZXR1cm4gY291bnQ7CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl90ZW1wX2lucHV0OgorCWNhc2UgaHdtb25fdGVtcF9tYXhfYWxhcm06CisJY2FzZSBod21vbl90ZW1wX21heF9oeXN0OgorCWNhc2UgaHdtb25fdGVtcF9jcml0X2FsYXJtOgorCWNhc2UgaHdtb25fdGVtcF9mYXVsdDoKKwkJcmV0dXJuIFNfSVJVR087CisJY2FzZSBod21vbl90ZW1wX3R5cGU6CisJY2FzZSBod21vbl90ZW1wX21heDoKKwljYXNlIGh3bW9uX3RlbXBfY3JpdDoKKwljYXNlIGh3bW9uX3RlbXBfb2Zmc2V0OgorCQlyZXR1cm4gU19JUlVHTyB8IFNfSVdVU1I7CisJY2FzZSBod21vbl90ZW1wX2NyaXRfaHlzdDoKKwkJcmV0dXJuIChjaGFubmVsID09IDApID8gU19JUlVHTyB8IFNfSVdVU1IgOiBTX0lSVUdPOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KIH0KIAotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd19pbnB1dCwgTlVMTCwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2NyaXQsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2xpbWl0LAotCQlzZXRfbGltaXQsIDYpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9jcml0X2h5c3QsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2NyaXRfaHlzdCwKLQkJc2V0X2NyaXRfaHlzdCwgNik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2NyaXRfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsCi0JCVNUQVRVUzFfTE9DKTsKLQotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9pbnB1dCwgU19JUlVHTywgc2hvd19pbnB1dCwgTlVMTCwgMik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2NyaXQsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2xpbWl0LAotCQlzZXRfbGltaXQsIDcpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9jcml0X2h5c3QsIFNfSVJVR08sIHNob3dfY3JpdF9oeXN0LCBOVUxMLCA3KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfY3JpdF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwKLQkJU1RBVFVTMV9SVENSSVQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl90eXBlLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190eXBlLAotCQlzZXRfdHlwZSwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2ZhdWx0LCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLAotCQlTVEFUVVMxX0RJT0RFX0ZBVUxUKTsKLQotc3RhdGljIERFVklDRV9BVFRSKHVwZGF0ZV9pbnRlcnZhbCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW50ZXJ2YWwsCi0JCXNldF9pbnRlcnZhbCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsbTk1MjQ1X2F0dHJzW10gPSB7Ci0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdF9oeXN0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9jcml0X2FsYXJtLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfY3JpdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfY3JpdF9oeXN0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9jcml0X2FsYXJtLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl90eXBlLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9mYXVsdC5kZXZfYXR0ci5hdHRyLAotCSZkZXZfYXR0cl91cGRhdGVfaW50ZXJ2YWwuYXR0ciwKLQlOVUxMCi19OwotQVRUUklCVVRFX0dST1VQUyhsbTk1MjQ1KTsKK3N0YXRpYyB1bW9kZV90IGxtOTUyNDVfaXNfdmlzaWJsZShjb25zdCB2b2lkICpkYXRhLAorCQkJCSAgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJCQkgIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIGh3bW9uX2NoaXA6CisJCXN3aXRjaCAoYXR0cikgeworCQljYXNlIGh3bW9uX2NoaXBfdXBkYXRlX2ludGVydmFsOgorCQkJcmV0dXJuIFNfSVJVR08gfCBTX0lXVVNSOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIGh3bW9uX3RlbXA6CisJCXJldHVybiBsbTk1MjQ1X3RlbXBfaXNfdmlzaWJsZShkYXRhLCBhdHRyLCBjaGFubmVsKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CiAKIC8qIFJldHVybiAwIGlmIGRldGVjdGlvbiBpcyBzdWNjZXNzZnVsLCAtRU5PREVWIG90aGVyd2lzZSAqLwogc3RhdGljIGludCBsbTk1MjQ1X2RldGVjdChzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudCwKQEAgLTQ1Myw0NCArNDg3LDEzMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBsbTk1MjQ1X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSkKK3N0YXRpYyBpbnQgbG05NTI0NV9pbml0X2NsaWVudChzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhKQogewotCWRhdGEtPmludGVydmFsID0gbG05NTI0NV9yZWFkX2NvbnZlcnNpb25fcmF0ZShjbGllbnQpOworCWludCByZXQ7CiAKLQlkYXRhLT5jb25maWcxID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJTE05NTI0NV9SRUdfUldfQ09ORklHMSk7Ci0JZGF0YS0+Y29uZmlnMiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCi0JCUxNOTUyNDVfUkVHX1JXX0NPTkZJRzIpOworCXJldCA9IGxtOTUyNDVfcmVhZF9jb252ZXJzaW9uX3JhdGUoZGF0YSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKLQlpZiAoZGF0YS0+Y29uZmlnMSAmIENGR19TVE9QKSB7Ci0JCS8qIENsZWFyIHRoZSBzdGFuZGJ5IGJpdCAqLwotCQlkYXRhLT5jb25maWcxICY9IH5DRkdfU1RPUDsKLQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDVfUkVHX1JXX0NPTkZJRzEsCi0JCQlkYXRhLT5jb25maWcxKTsKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGRhdGEtPnJlZ21hcCwgTE05NTI0NV9SRUdfUldfQ09ORklHMSwKKwkJCQkgIENGR19TVE9QLCAwKTsKK30KKworc3RhdGljIGJvb2wgbG05NTI0NV9pc193cml0ZWFibGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgTE05NTI0NV9SRUdfUldfQ09ORklHMToKKwljYXNlIExNOTUyNDVfUkVHX1JXX0NPTlZFUlNfUkFURToKKwljYXNlIExNOTUyNDVfUkVHX1dfT05FX1NIT1Q6CisJY2FzZSBMTTk1MjQ1X1JFR19SV19DT05GSUcyOgorCWNhc2UgTE05NTI0NV9SRUdfUldfUkVNT1RFX09GRkg6CisJY2FzZSBMTTk1MjQ1X1JFR19SV19SRU1PVEVfT0ZGTDoKKwljYXNlIExNOTUyNDVfUkVHX1JXX1JFTU9URV9PU19MSU1JVDoKKwljYXNlIExNOTUyNDVfUkVHX1JXX0xPQ0FMX09TX1RDUklUX0xJTUlUOgorCWNhc2UgTE05NTI0NV9SRUdfUldfUkVNT1RFX1RDUklUX0xJTUlUOgorCWNhc2UgTE05NTI0NV9SRUdfUldfQ09NTU9OX0hZU1RFUkVTSVM6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKIAl9CiB9CiAKK3N0YXRpYyBib29sIGxtOTUyNDVfaXNfdm9sYXRpbGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgTE05NTI0NV9SRUdfUl9TVEFUVVMxOgorCWNhc2UgTE05NTI0NV9SRUdfUl9TVEFUVVMyOgorCWNhc2UgTE05NTI0NV9SRUdfUl9MT0NBTF9URU1QSF9TOgorCWNhc2UgTE05NTI0NV9SRUdfUl9MT0NBTF9URU1QTF9TOgorCWNhc2UgTE05NTI0NV9SRUdfUl9SRU1PVEVfVEVNUEhfUzoKKwljYXNlIExNOTUyNDVfUkVHX1JfUkVNT1RFX1RFTVBMX1M6CisJY2FzZSBMTTk1MjQ1X1JFR19SX1JFTU9URV9URU1QSF9VOgorCWNhc2UgTE05NTI0NV9SRUdfUl9SRU1PVEVfVEVNUExfVToKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGxtOTUyNDVfcmVnbWFwX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDgsCisJLndyaXRlYWJsZV9yZWcgPSBsbTk1MjQ1X2lzX3dyaXRlYWJsZV9yZWcsCisJLnZvbGF0aWxlX3JlZyA9IGxtOTUyNDVfaXNfdm9sYXRpbGVfcmVnLAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAorCS51c2Vfc2luZ2xlX3J3ID0gdHJ1ZSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgbG05NTI0NV9jaGlwX2NvbmZpZ1tdID0geworCUhXTU9OX0NfVVBEQVRFX0lOVEVSVkFMLAorCTAKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIGxtOTUyNDVfY2hpcCA9IHsKKwkudHlwZSA9IGh3bW9uX2NoaXAsCisJLmNvbmZpZyA9IGxtOTUyNDVfY2hpcF9jb25maWcsCit9OworCitzdGF0aWMgY29uc3QgdTMyIGxtOTUyNDVfdGVtcF9jb25maWdbXSA9IHsKKwlIV01PTl9UX0lOUFVUIHwgSFdNT05fVF9DUklUIHwgSFdNT05fVF9DUklUX0hZU1QgfCBIV01PTl9UX0NSSVRfQUxBUk0sCisJSFdNT05fVF9JTlBVVCB8IEhXTU9OX1RfTUFYIHwgSFdNT05fVF9NQVhfSFlTVCB8IEhXTU9OX1RfQ1JJVCB8CisJCUhXTU9OX1RfQ1JJVF9IWVNUIHwgSFdNT05fVF9GQVVMVCB8IEhXTU9OX1RfTUFYX0FMQVJNIHwKKwkJSFdNT05fVF9DUklUX0FMQVJNIHwgSFdNT05fVF9UWVBFIHwgSFdNT05fVF9PRkZTRVQsCisJMAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gbG05NTI0NV90ZW1wID0geworCS50eXBlID0gaHdtb25fdGVtcCwKKwkuY29uZmlnID0gbG05NTI0NV90ZW1wX2NvbmZpZywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvICpsbTk1MjQ1X2luZm9bXSA9IHsKKwkmbG05NTI0NV9jaGlwLAorCSZsbTk1MjQ1X3RlbXAsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9vcHMgbG05NTI0NV9od21vbl9vcHMgPSB7CisJLmlzX3Zpc2libGUgPSBsbTk1MjQ1X2lzX3Zpc2libGUsCisJLnJlYWQgPSBsbTk1MjQ1X3JlYWQsCisJLndyaXRlID0gbG05NTI0NV93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hpcF9pbmZvIGxtOTUyNDVfY2hpcF9pbmZvID0geworCS5vcHMgPSAmbG05NTI0NV9od21vbl9vcHMsCisJLmluZm8gPSBsbTk1MjQ1X2luZm8sCit9OworCiBzdGF0aWMgaW50IGxtOTUyNDVfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OwogCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGE7CiAJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OworCWludCByZXQ7CiAKIAlkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBsbTk1MjQ1X2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZGF0YS0+Y2xpZW50ID0gY2xpZW50OworCWRhdGEtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGNsaWVudCwgJmxtOTUyNDVfcmVnbWFwX2NvbmZpZyk7CisJaWYgKElTX0VSUihkYXRhLT5yZWdtYXApKQorCQlyZXR1cm4gUFRSX0VSUihkYXRhLT5yZWdtYXApOworCiAJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgTE05NTI0NSBjaGlwICovCi0JbG05NTI0NV9pbml0X2NsaWVudChjbGllbnQsIGRhdGEpOworCXJldCA9IGxtOTUyNDVfaW5pdF9jbGllbnQoZGF0YSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKLQlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsIGNsaWVudC0+bmFtZSwKLQkJCQkJCQkgICBkYXRhLAotCQkJCQkJCSAgIGxtOTUyNDVfZ3JvdXBzKTsKKwlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8oZGV2LCBjbGllbnQtPm5hbWUsCisJCQkJCQkJIGRhdGEsCisJCQkJCQkJICZsbTk1MjQ1X2NoaXBfaW5mbywKKwkJCQkJCQkgTlVMTCk7CiAJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhod21vbl9kZXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2x0YzQxNTEuYyBiL2RyaXZlcnMvaHdtb24vbHRjNDE1MS5jCmluZGV4IGM4NmExODQuLjg0NDVjOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbHRjNDE1MS5jCisrKyBiL2RyaXZlcnMvaHdtb24vbHRjNDE1MS5jCkBAIC0zMCw2ICszMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC01Miw2ICs1Myw3IEBACiAJc3RydWN0IG11dGV4IHVwZGF0ZV9sb2NrOwogCWJvb2wgdmFsaWQ7CiAJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7IC8qIGluIGppZmZpZXMgKi8KKwl1bnNpZ25lZCBpbnQgc2h1bnQ7IC8qIGluIG1pY3JvIG9obXMgKi8KIAogCS8qIFJlZ2lzdGVycyAqLwogCXU4IHJlZ3NbNl07CkBAIC0xMTEsOSArMTEzLDkgQEAKIAljYXNlIExUQzQxNTFfU0VOU0VfSDoKIAkJLyoKIAkJICogMjB1ViByZXNvbHV0aW9uLiBDb252ZXJ0IHRvIGN1cnJlbnQgYXMgbWVhc3VyZWQgd2l0aAotCQkgKiBhbiAxIG1PaG0gc2Vuc2UgcmVzaXN0b3IsIGluIG1BLgorCQkgKiBhIGdpdmVuIHNlbnNlIHJlc2lzdG9yLCBpbiBtQS4KIAkJICovCi0JCXZhbCA9IHZhbCAqIDIwOworCQl2YWwgPSB2YWwgKiAyMCAqIDEwMDAgLyBkYXRhLT5zaHVudDsKIAkJYnJlYWs7CiAJY2FzZSBMVEM0MTUxX1ZJTl9IOgogCQkvKiAyNSBtViBwZXIgaW5jcmVtZW50ICovCkBAIC0xNzYsNiArMTc4LDcgQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CiAJc3RydWN0IGx0YzQxNTFfZGF0YSAqZGF0YTsKIAlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CisJdTMyIHNodW50OwogCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTE4NCw2ICsxODcsMTUgQEAKIAlpZiAoIWRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKGNsaWVudC0+ZGV2Lm9mX25vZGUsCisJCQkJICJzaHVudC1yZXNpc3Rvci1taWNyby1vaG1zIiwgJnNodW50KSkKKwkJc2h1bnQgPSAxMDAwOyAvKiAxIG1PaG0gaWYgbm90IHNldCB2aWEgRFQgKi8KKworCWlmIChzaHVudCA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRhdGEtPnNodW50ID0gc2h1bnQ7CisKIAlkYXRhLT5jbGllbnQgPSBjbGllbnQ7CiAJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOwogCkBAIC0xOTksMTAgKzIxMSwxNiBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBsdGM0MTUxX2lkKTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbHRjNDE1MV9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAibGx0YyxsdGM0MTUxIiB9LAorCXt9LAorfTsKKwogLyogVGhpcyBpcyB0aGUgZHJpdmVyIHRoYXQgd2lsbCBiZSBpbnNlcnRlZCAqLwogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGx0YzQxNTFfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gImx0YzQxNTEiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIobHRjNDE1MV9tYXRjaCksCiAJfSwKIAkucHJvYmUJCT0gbHRjNDE1MV9wcm9iZSwKIAkuaWRfdGFibGUJPSBsdGM0MTUxX2lkLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sdGM0MjQ1LmMgYi9kcml2ZXJzL2h3bW9uL2x0YzQyNDUuYwppbmRleCA2ODFiNWI3Li40NjgwZDg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2x0YzQyNDUuYworKysgYi9kcml2ZXJzL2h3bW9uL2x0YzQyNDUuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CkBAIC01Myw4ICs1NCw2IEBACiBzdHJ1Y3QgbHRjNDI0NV9kYXRhIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCi0JY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqZ3JvdXBzWzNdOwotCiAJc3RydWN0IG11dGV4IHVwZGF0ZV9sb2NrOwogCWJvb2wgdmFsaWQ7CiAJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7IC8qIGluIGppZmZpZXMgKi8KQEAgLTE2Miw3ICsxNjEsNyBAQAogCQlsdGM0MjQ1X3VwZGF0ZV9ncGlvcyhkZXYpOwogCiAJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7Ci0JCWRhdGEtPnZhbGlkID0gMTsKKwkJZGF0YS0+dmFsaWQgPSB0cnVlOwogCX0KIAogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwpAQCAtMjU2LDIxNCArMjU1LDIwNSBAQAogCXJldHVybiBjdXJyOwogfQogCi1zdGF0aWMgc3NpemVfdCBsdGM0MjQ1X3Nob3dfdm9sdGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwKLQkJCQkgICAgY2hhciAqYnVmKQorLyogTWFwIGZyb20gdm9sdGFnZSBjaGFubmVsIGluZGV4IHRvIHZvbHRhZ2UgcmVnaXN0ZXIgKi8KKworc3RhdGljIGNvbnN0IHM4IGx0YzQyNDVfaW5fcmVnc1tdID0geworCUxUQzQyNDVfMTJWSU4sIExUQzQyNDVfNVZJTiwgTFRDNDI0NV8zVklOLCBMVEM0MjQ1X1ZFRUlOLAorCUxUQzQyNDVfMTJWT1VULCBMVEM0MjQ1XzVWT1VULCBMVEM0MjQ1XzNWT1VULCBMVEM0MjQ1X1ZFRU9VVCwKK307CisKKy8qIE1hcCBmcm9tIGN1cnJlbnQgY2hhbm5lbCBpbmRleCB0byBjdXJyZW50IHJlZ2lzdGVyICovCisKK3N0YXRpYyBjb25zdCBzOCBsdGM0MjQ1X2N1cnJfcmVnc1tdID0geworCUxUQzQyNDVfMTJWU0VOU0UsIExUQzQyNDVfNVZTRU5TRSwgTFRDNDI0NV8zVlNFTlNFLCBMVEM0MjQ1X1ZFRVNFTlNFLAorfTsKKworc3RhdGljIGludCBsdGM0MjQ1X3JlYWRfY3VycihzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwKKwkJCSAgICAgbG9uZyAqdmFsKQogewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7Ci0JY29uc3QgaW50IHZvbHRhZ2UgPSBsdGM0MjQ1X2dldF92b2x0YWdlKGRldiwgYXR0ci0+aW5kZXgpOwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHZvbHRhZ2UpOwotfQotCi1zdGF0aWMgc3NpemVfdCBsdGM0MjQ1X3Nob3dfY3VycmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwKLQkJCQkgICAgY2hhciAqYnVmKQotewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7Ci0JY29uc3QgdW5zaWduZWQgaW50IGN1cnIgPSBsdGM0MjQ1X2dldF9jdXJyZW50KGRldiwgYXR0ci0+aW5kZXgpOwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIGN1cnIpOwotfQotCi1zdGF0aWMgc3NpemVfdCBsdGM0MjQ1X3Nob3dfcG93ZXIoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAotCQkJCSAgY2hhciAqYnVmKQotewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7Ci0JY29uc3QgdW5zaWduZWQgaW50IGN1cnIgPSBsdGM0MjQ1X2dldF9jdXJyZW50KGRldiwgYXR0ci0+aW5kZXgpOwotCWNvbnN0IGludCBvdXRwdXRfdm9sdGFnZSA9IGx0YzQyNDVfZ2V0X3ZvbHRhZ2UoZGV2LCBhdHRyLT5pbmRleCsxKTsKLQotCS8qIGN1cnJlbnQgaW4gbUEgKiB2b2x0YWdlIGluIG1WID09IHBvd2VyIGluIHVXICovCi0JY29uc3QgdW5zaWduZWQgaW50IHBvd2VyID0gYWJzKG91dHB1dF92b2x0YWdlICogY3Vycik7Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgcG93ZXIpOwotfQotCi1zdGF0aWMgc3NpemVfdCBsdGM0MjQ1X3Nob3dfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwKLQkJCQkJICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkYSk7CiAJc3RydWN0IGx0YzQyNDVfZGF0YSAqZGF0YSA9IGx0YzQyNDVfdXBkYXRlX2RldmljZShkZXYpOwotCWNvbnN0IHU4IHJlZyA9IGRhdGEtPmNyZWdzW2F0dHItPmluZGV4XTsKLQljb25zdCB1MzIgbWFzayA9IGF0dHItPm5yOwogCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIChyZWcgJiBtYXNrKSA/IDEgOiAwKTsKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9uX2N1cnJfaW5wdXQ6CisJCSp2YWwgPSBsdGM0MjQ1X2dldF9jdXJyZW50KGRldiwgbHRjNDI0NV9jdXJyX3JlZ3NbY2hhbm5lbF0pOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX2N1cnJfbWF4X2FsYXJtOgorCQkqdmFsID0gISEoZGF0YS0+Y3JlZ3NbTFRDNDI0NV9GQVVMVDFdICYgQklUKGNoYW5uZWwgKyA0KSk7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGx0YzQyNDVfc2hvd19ncGlvKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAotCQkJCSBjaGFyICpidWYpCitzdGF0aWMgaW50IGx0YzQyNDVfcmVhZF9pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyAqdmFsKQogewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7CiAJc3RydWN0IGx0YzQyNDVfZGF0YSAqZGF0YSA9IGx0YzQyNDVfdXBkYXRlX2RldmljZShkZXYpOwotCWludCB2YWwgPSBkYXRhLT5ncGlvc1thdHRyLT5pbmRleF07CiAKLQkvKiBoYW5kbGUgc3RhbGUgR1BJTydzICovCi0JaWYgKHZhbCA8IDApCi0JCXJldHVybiB2YWw7CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl9pbl9pbnB1dDoKKwkJaWYgKGNoYW5uZWwgPCA4KSB7CisJCQkqdmFsID0gbHRjNDI0NV9nZXRfdm9sdGFnZShkZXYsCisJCQkJCQlsdGM0MjQ1X2luX3JlZ3NbY2hhbm5lbF0pOworCQl9IGVsc2UgeworCQkJaW50IHJlZ3ZhbCA9IGRhdGEtPmdwaW9zW2NoYW5uZWwgLSA4XTsKIAotCS8qIENvbnZlcnQgdG8gbWlsbGl2b2x0cyBhbmQgcHJpbnQgKi8KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgdmFsICogMTApOworCQkJaWYgKHJlZ3ZhbCA8IDApCisJCQkJcmV0dXJuIHJlZ3ZhbDsKKwkJCSp2YWwgPSByZWd2YWwgKiAxMDsKKwkJfQorCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX2luX21pbl9hbGFybToKKwkJaWYgKGNoYW5uZWwgPCA0KQorCQkJKnZhbCA9ICEhKGRhdGEtPmNyZWdzW0xUQzQyNDVfRkFVTFQxXSAmIEJJVChjaGFubmVsKSk7CisJCWVsc2UKKwkJCSp2YWwgPSAhIShkYXRhLT5jcmVnc1tMVEM0MjQ1X0ZBVUxUMl0gJgorCQkJCSAgQklUKGNoYW5uZWwgLSA0KSk7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CiB9CiAKLS8qIENvbnN0cnVjdCBhIHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlIHN0cnVjdHVyZSBmb3IgZWFjaCByZWdpc3RlciAqLwotCi0vKiBJbnB1dCB2b2x0YWdlcyAqLwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjFfaW5wdXQsIFNfSVJVR08sIGx0YzQyNDVfc2hvd192b2x0YWdlLCBOVUxMLAotCQkJICBMVEM0MjQ1XzEyVklOKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4yX2lucHV0LCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfdm9sdGFnZSwgTlVMTCwKLQkJCSAgTFRDNDI0NV81VklOKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4zX2lucHV0LCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfdm9sdGFnZSwgTlVMTCwKLQkJCSAgTFRDNDI0NV8zVklOKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW40X2lucHV0LCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfdm9sdGFnZSwgTlVMTCwKLQkJCSAgTFRDNDI0NV9WRUVJTik7Ci0KLS8qIElucHV0IHVuZGVydm9sdGFnZSBhbGFybXMgKi8KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjFfbWluX2FsYXJtLCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfYWxhcm0sIE5VTEwsCi0JCQkgICAgMSA8PCAwLCBMVEM0MjQ1X0ZBVUxUMSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4yX21pbl9hbGFybSwgU19JUlVHTywgbHRjNDI0NV9zaG93X2FsYXJtLCBOVUxMLAotCQkJICAgIDEgPDwgMSwgTFRDNDI0NV9GQVVMVDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluM19taW5fYWxhcm0sIFNfSVJVR08sIGx0YzQyNDVfc2hvd19hbGFybSwgTlVMTCwKLQkJCSAgICAxIDw8IDIsIExUQzQyNDVfRkFVTFQxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjRfbWluX2FsYXJtLCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfYWxhcm0sIE5VTEwsCi0JCQkgICAgMSA8PCAzLCBMVEM0MjQ1X0ZBVUxUMSk7Ci0KLS8qIEN1cnJlbnRzICh2aWEgc2Vuc2UgcmVzaXN0b3IpICovCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGN1cnIxX2lucHV0LCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfY3VycmVudCwgTlVMTCwKLQkJCSAgTFRDNDI0NV8xMlZTRU5TRSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGN1cnIyX2lucHV0LCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfY3VycmVudCwgTlVMTCwKLQkJCSAgTFRDNDI0NV81VlNFTlNFKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoY3VycjNfaW5wdXQsIFNfSVJVR08sIGx0YzQyNDVfc2hvd19jdXJyZW50LCBOVUxMLAotCQkJICBMVEM0MjQ1XzNWU0VOU0UpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihjdXJyNF9pbnB1dCwgU19JUlVHTywgbHRjNDI0NV9zaG93X2N1cnJlbnQsIE5VTEwsCi0JCQkgIExUQzQyNDVfVkVFU0VOU0UpOwotCi0vKiBPdmVyY3VycmVudCBhbGFybXMgKi8KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihjdXJyMV9tYXhfYWxhcm0sIFNfSVJVR08sIGx0YzQyNDVfc2hvd19hbGFybSwgTlVMTCwKLQkJCSAgICAxIDw8IDQsIExUQzQyNDVfRkFVTFQxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihjdXJyMl9tYXhfYWxhcm0sIFNfSVJVR08sIGx0YzQyNDVfc2hvd19hbGFybSwgTlVMTCwKLQkJCSAgICAxIDw8IDUsIExUQzQyNDVfRkFVTFQxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihjdXJyM19tYXhfYWxhcm0sIFNfSVJVR08sIGx0YzQyNDVfc2hvd19hbGFybSwgTlVMTCwKLQkJCSAgICAxIDw8IDYsIExUQzQyNDVfRkFVTFQxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihjdXJyNF9tYXhfYWxhcm0sIFNfSVJVR08sIGx0YzQyNDVfc2hvd19hbGFybSwgTlVMTCwKLQkJCSAgICAxIDw8IDcsIExUQzQyNDVfRkFVTFQxKTsKLQotLyogT3V0cHV0IHZvbHRhZ2VzICovCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluNV9pbnB1dCwgU19JUlVHTywgbHRjNDI0NV9zaG93X3ZvbHRhZ2UsIE5VTEwsCi0JCQkgIExUQzQyNDVfMTJWT1VUKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW42X2lucHV0LCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfdm9sdGFnZSwgTlVMTCwKLQkJCSAgTFRDNDI0NV81Vk9VVCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluN19pbnB1dCwgU19JUlVHTywgbHRjNDI0NV9zaG93X3ZvbHRhZ2UsIE5VTEwsCi0JCQkgIExUQzQyNDVfM1ZPVVQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjhfaW5wdXQsIFNfSVJVR08sIGx0YzQyNDVfc2hvd192b2x0YWdlLCBOVUxMLAotCQkJICBMVEM0MjQ1X1ZFRU9VVCk7Ci0KLS8qIFBvd2VyIEJhZCBhbGFybXMgKi8KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjVfbWluX2FsYXJtLCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfYWxhcm0sIE5VTEwsCi0JCQkgICAgMSA8PCAwLCBMVEM0MjQ1X0ZBVUxUMik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW42X21pbl9hbGFybSwgU19JUlVHTywgbHRjNDI0NV9zaG93X2FsYXJtLCBOVUxMLAotCQkJICAgIDEgPDwgMSwgTFRDNDI0NV9GQVVMVDIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluN19taW5fYWxhcm0sIFNfSVJVR08sIGx0YzQyNDVfc2hvd19hbGFybSwgTlVMTCwKLQkJCSAgICAxIDw8IDIsIExUQzQyNDVfRkFVTFQyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjhfbWluX2FsYXJtLCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfYWxhcm0sIE5VTEwsCi0JCQkgICAgMSA8PCAzLCBMVEM0MjQ1X0ZBVUxUMik7Ci0KLS8qIEdQSU8gdm9sdGFnZXMgKi8KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW45X2lucHV0LCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfZ3BpbywgTlVMTCwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMTBfaW5wdXQsIFNfSVJVR08sIGx0YzQyNDVfc2hvd19ncGlvLCBOVUxMLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xMV9pbnB1dCwgU19JUlVHTywgbHRjNDI0NV9zaG93X2dwaW8sIE5VTEwsIDIpOwotCi0vKiBQb3dlciBDb25zdW1wdGlvbiAodmlydHVhbCkgKi8KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocG93ZXIxX2lucHV0LCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfcG93ZXIsIE5VTEwsCi0JCQkgIExUQzQyNDVfMTJWU0VOU0UpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwb3dlcjJfaW5wdXQsIFNfSVJVR08sIGx0YzQyNDVfc2hvd19wb3dlciwgTlVMTCwKLQkJCSAgTFRDNDI0NV81VlNFTlNFKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocG93ZXIzX2lucHV0LCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfcG93ZXIsIE5VTEwsCi0JCQkgIExUQzQyNDVfM1ZTRU5TRSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHBvd2VyNF9pbnB1dCwgU19JUlVHTywgbHRjNDI0NV9zaG93X3Bvd2VyLCBOVUxMLAotCQkJICBMVEM0MjQ1X1ZFRVNFTlNFKTsKLQotLyoKLSAqIEZpbmFsbHksIGNvbnN0cnVjdCBhbiBhcnJheSBvZiBwb2ludGVycyB0byBtZW1iZXJzIG9mIHRoZSBhYm92ZSBvYmplY3RzLAotICogYXMgcmVxdWlyZWQgZm9yIHN5c2ZzX2NyZWF0ZV9ncm91cCgpCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsdGM0MjQ1X3N0ZF9hdHRyaWJ1dGVzW10gPSB7Ci0JJnNlbnNvcl9kZXZfYXR0cl9pbjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW4zX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjRfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQotCSZzZW5zb3JfZGV2X2F0dHJfaW4xX21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW4yX21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW4zX21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW40X21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAotCi0JJnNlbnNvcl9kZXZfYXR0cl9jdXJyMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfY3VycjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2N1cnIzX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9jdXJyNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCi0JJnNlbnNvcl9kZXZfYXR0cl9jdXJyMV9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2N1cnIyX21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfY3VycjNfbWF4X2FsYXJtLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9jdXJyNF9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQotCSZzZW5zb3JfZGV2X2F0dHJfaW41X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjZfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luN19pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW44X2lucHV0LmRldl9hdHRyLmF0dHIsCi0KLQkmc2Vuc29yX2Rldl9hdHRyX2luNV9taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luNl9taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luN19taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luOF9taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQotCSZzZW5zb3JfZGV2X2F0dHJfaW45X2lucHV0LmRldl9hdHRyLmF0dHIsCi0KLQkmc2Vuc29yX2Rldl9hdHRyX3Bvd2VyMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfcG93ZXIyX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9wb3dlcjNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3Bvd2VyNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCi0JTlVMTCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsdGM0MjQ1X2dwaW9fYXR0cmlidXRlc1tdID0gewotCSZzZW5zb3JfZGV2X2F0dHJfaW4xMF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW4xMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCU5VTEwsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBsdGM0MjQ1X3N0ZF9ncm91cCA9IHsKLQkuYXR0cnMgPSBsdGM0MjQ1X3N0ZF9hdHRyaWJ1dGVzLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbHRjNDI0NV9ncGlvX2dyb3VwID0gewotCS5hdHRycyA9IGx0YzQyNDVfZ3Bpb19hdHRyaWJ1dGVzLAotfTsKLQotc3RhdGljIHZvaWQgbHRjNDI0NV9zeXNmc19hZGRfZ3JvdXBzKHN0cnVjdCBsdGM0MjQ1X2RhdGEgKmRhdGEpCitzdGF0aWMgaW50IGx0YzQyNDVfcmVhZF9wb3dlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwKKwkJCSAgICAgIGxvbmcgKnZhbCkKIHsKLQkvKiBzdGFuZGFyZCBzeXNmcyBhdHRyaWJ1dGVzICovCi0JZGF0YS0+Z3JvdXBzWzBdID0gJmx0YzQyNDVfc3RkX2dyb3VwOworCXVuc2lnbmVkIGxvbmcgY3VycjsKKwlsb25nIHZvbHRhZ2U7CiAKLQkvKiBpZiB3ZSdyZSB1c2luZyB0aGUgZXh0cmEgZ3BpbyBzdXBwb3J0LCByZWdpc3RlciBpdCdzIGF0dHJpYnV0ZXMgKi8KLQlpZiAoZGF0YS0+dXNlX2V4dHJhX2dwaW9zKQotCQlkYXRhLT5ncm91cHNbMV0gPSAmbHRjNDI0NV9ncGlvX2dyb3VwOworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fcG93ZXJfaW5wdXQ6CisJCSh2b2lkKWx0YzQyNDVfdXBkYXRlX2RldmljZShkZXYpOworCQljdXJyID0gbHRjNDI0NV9nZXRfY3VycmVudChkZXYsIGx0YzQyNDVfY3Vycl9yZWdzW2NoYW5uZWxdKTsKKwkJdm9sdGFnZSA9IGx0YzQyNDVfZ2V0X3ZvbHRhZ2UoZGV2LCBsdGM0MjQ1X2luX3JlZ3NbY2hhbm5lbF0pOworCQkqdmFsID0gYWJzKGN1cnIgKiB2b2x0YWdlKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIH0KIAorc3RhdGljIGludCBsdGM0MjQ1X3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkJdTMyIGF0dHIsIGludCBjaGFubmVsLCBsb25nICp2YWwpCit7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIGh3bW9uX2N1cnI6CisJCXJldHVybiBsdGM0MjQ1X3JlYWRfY3VycihkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJY2FzZSBod21vbl9wb3dlcjoKKwkJcmV0dXJuIGx0YzQyNDVfcmVhZF9wb3dlcihkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJY2FzZSBod21vbl9pbjoKKwkJcmV0dXJuIGx0YzQyNDVfcmVhZF9pbihkZXYsIGF0dHIsIGNoYW5uZWwgLSAxLCB2YWwpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9Cit9CisKK3N0YXRpYyB1bW9kZV90IGx0YzQyNDVfaXNfdmlzaWJsZShjb25zdCB2b2lkICpfZGF0YSwKKwkJCQkgIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQkJICB1MzIgYXR0ciwgaW50IGNoYW5uZWwpCit7CisJY29uc3Qgc3RydWN0IGx0YzQyNDVfZGF0YSAqZGF0YSA9IF9kYXRhOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBod21vbl9pbjoKKwkJaWYgKGNoYW5uZWwgPT0gMCkKKwkJCXJldHVybiAwOworCQlzd2l0Y2ggKGF0dHIpIHsKKwkJY2FzZSBod21vbl9pbl9pbnB1dDoKKwkJCWlmIChjaGFubmVsID4gOSAmJiAhZGF0YS0+dXNlX2V4dHJhX2dwaW9zKQorCQkJCXJldHVybiAwOworCQkJcmV0dXJuIFNfSVJVR087CisJCWNhc2UgaHdtb25faW5fbWluX2FsYXJtOgorCQkJaWYgKGNoYW5uZWwgPiA4KQorCQkJCXJldHVybiAwOworCQkJcmV0dXJuIFNfSVJVR087CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgaHdtb25fY3VycjoKKwkJc3dpdGNoIChhdHRyKSB7CisJCWNhc2UgaHdtb25fY3Vycl9pbnB1dDoKKwkJY2FzZSBod21vbl9jdXJyX21heF9hbGFybToKKwkJCXJldHVybiBTX0lSVUdPOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIGh3bW9uX3Bvd2VyOgorCQlzd2l0Y2ggKGF0dHIpIHsKKwkJY2FzZSBod21vbl9wb3dlcl9pbnB1dDoKKwkJCXJldHVybiBTX0lSVUdPOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCB1MzIgbHRjNDI0NV9pbl9jb25maWdbXSA9IHsKKwlIV01PTl9JX0lOUFVULAkJCS8qIGR1bW15LCBza2lwcGVkIGluIGlzX3Zpc2libGUgKi8KKwlIV01PTl9JX0lOUFVUIHwgSFdNT05fSV9NSU5fQUxBUk0sCisJSFdNT05fSV9JTlBVVCB8IEhXTU9OX0lfTUlOX0FMQVJNLAorCUhXTU9OX0lfSU5QVVQgfCBIV01PTl9JX01JTl9BTEFSTSwKKwlIV01PTl9JX0lOUFVUIHwgSFdNT05fSV9NSU5fQUxBUk0sCisJSFdNT05fSV9JTlBVVCB8IEhXTU9OX0lfTUlOX0FMQVJNLAorCUhXTU9OX0lfSU5QVVQgfCBIV01PTl9JX01JTl9BTEFSTSwKKwlIV01PTl9JX0lOUFVUIHwgSFdNT05fSV9NSU5fQUxBUk0sCisJSFdNT05fSV9JTlBVVCB8IEhXTU9OX0lfTUlOX0FMQVJNLAorCUhXTU9OX0lfSU5QVVQsCisJSFdNT05fSV9JTlBVVCwKKwlIV01PTl9JX0lOUFVULAorCTAKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIGx0YzQyNDVfaW4gPSB7CisJLnR5cGUgPSBod21vbl9pbiwKKwkuY29uZmlnID0gbHRjNDI0NV9pbl9jb25maWcsCit9OworCitzdGF0aWMgY29uc3QgdTMyIGx0YzQyNDVfY3Vycl9jb25maWdbXSA9IHsKKwlIV01PTl9DX0lOUFVUIHwgSFdNT05fQ19NQVhfQUxBUk0sCisJSFdNT05fQ19JTlBVVCB8IEhXTU9OX0NfTUFYX0FMQVJNLAorCUhXTU9OX0NfSU5QVVQgfCBIV01PTl9DX01BWF9BTEFSTSwKKwlIV01PTl9DX0lOUFVUIHwgSFdNT05fQ19NQVhfQUxBUk0sCisJMAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gbHRjNDI0NV9jdXJyID0geworCS50eXBlID0gaHdtb25fY3VyciwKKwkuY29uZmlnID0gbHRjNDI0NV9jdXJyX2NvbmZpZywKK307CisKK3N0YXRpYyBjb25zdCB1MzIgbHRjNDI0NV9wb3dlcl9jb25maWdbXSA9IHsKKwlIV01PTl9QX0lOUFVULAorCUhXTU9OX1BfSU5QVVQsCisJSFdNT05fUF9JTlBVVCwKKwlIV01PTl9QX0lOUFVULAorCTAKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIGx0YzQyNDVfcG93ZXIgPSB7CisJLnR5cGUgPSBod21vbl9wb3dlciwKKwkuY29uZmlnID0gbHRjNDI0NV9wb3dlcl9jb25maWcsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyAqbHRjNDI0NV9pbmZvW10gPSB7CisJJmx0YzQyNDVfaW4sCisJJmx0YzQyNDVfY3VyciwKKwkmbHRjNDI0NV9wb3dlciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX29wcyBsdGM0MjQ1X2h3bW9uX29wcyA9IHsKKwkuaXNfdmlzaWJsZSA9IGx0YzQyNDVfaXNfdmlzaWJsZSwKKwkucmVhZCA9IGx0YzQyNDVfcmVhZCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hpcF9pbmZvIGx0YzQyNDVfY2hpcF9pbmZvID0geworCS5vcHMgPSAmbHRjNDI0NV9od21vbl9vcHMsCisJLmluZm8gPSBsdGM0MjQ1X2luZm8sCit9OworCiBzdGF0aWMgYm9vbCBsdGM0MjQ1X3VzZV9leHRyYV9ncGlvcyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBsdGM0MjQ1X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmY2xpZW50LT5kZXYpOwpAQCAtNTAyLDEyICs0OTIsMTAgQEAKIAlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTFRDNDI0NV9GQVVMVDEsIDB4MDApOwogCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMVEM0MjQ1X0ZBVUxUMiwgMHgwMCk7CiAKLQkvKiBBZGQgc3lzZnMgaG9va3MgKi8KLQlsdGM0MjQ1X3N5c2ZzX2FkZF9ncm91cHMoZGF0YSk7Ci0KLQlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcygmY2xpZW50LT5kZXYsCi0JCQkJCQkJICAgY2xpZW50LT5uYW1lLCBkYXRhLAotCQkJCQkJCSAgIGRhdGEtPmdyb3Vwcyk7CisJaHdtb25fZGV2ID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvKCZjbGllbnQtPmRldiwKKwkJCQkJCQkgY2xpZW50LT5uYW1lLCBkYXRhLAorCQkJCQkJCSAmbHRjNDI0NV9jaGlwX2luZm8sCisJCQkJCQkJIE5VTEwpOwogCXJldHVybiBQVFJfRVJSX09SX1pFUk8oaHdtb25fZGV2KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9tYXgzMTc5MC5jIGIvZHJpdmVycy9od21vbi9tYXgzMTc5MC5jCmluZGV4IDY5YzBhYzguLmJlZjg0ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbWF4MzE3OTAuYworKysgYi9kcml2ZXJzL2h3bW9uL21heDMxNzkwLmMKQEAgLTE3LDcgKzE3LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgpAQCAtMTY5LDM2MiArMTY4LDI4OCBAQAogCXJldHVybiBiaXRzOwogfQogCi1zdGF0aWMgc3NpemVfdCBnZXRfZmFuKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCitzdGF0aWMgaW50IG1heDMxNzkwX3JlYWRfZmFuKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGF0dHIsIGludCBjaGFubmVsLAorCQkJICAgICBsb25nICp2YWwpCiB7Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOwogCXN0cnVjdCBtYXgzMTc5MF9kYXRhICpkYXRhID0gbWF4MzE3OTBfdXBkYXRlX2RldmljZShkZXYpOwogCWludCBzciwgcnBtOwogCiAJaWYgKElTX0VSUihkYXRhKSkKIAkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7CiAKLQlzciA9IGdldF90YWNoX3BlcmlvZChkYXRhLT5mYW5fZHluYW1pY3NbYXR0ci0+aW5kZXhdKTsKLQlycG0gPSBSUE1fRlJPTV9SRUcoZGF0YS0+dGFjaFthdHRyLT5pbmRleF0sIHNyKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBycG0pOworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fZmFuX2lucHV0OgorCQlzciA9IGdldF90YWNoX3BlcmlvZChkYXRhLT5mYW5fZHluYW1pY3NbY2hhbm5lbF0pOworCQlycG0gPSBSUE1fRlJPTV9SRUcoZGF0YS0+dGFjaFtjaGFubmVsXSwgc3IpOworCQkqdmFsID0gcnBtOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX2Zhbl90YXJnZXQ6CisJCXNyID0gZ2V0X3RhY2hfcGVyaW9kKGRhdGEtPmZhbl9keW5hbWljc1tjaGFubmVsXSk7CisJCXJwbSA9IFJQTV9GUk9NX1JFRyhkYXRhLT50YXJnZXRfY291bnRbY2hhbm5lbF0sIHNyKTsKKwkJKnZhbCA9IHJwbTsKKwkJcmV0dXJuIDA7CisJY2FzZSBod21vbl9mYW5fZmF1bHQ6CisJCSp2YWwgPSAhIShkYXRhLT5mYXVsdF9zdGF0dXMgJiAoMSA8PCBjaGFubmVsKSk7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGdldF9mYW5fdGFyZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCitzdGF0aWMgaW50IG1heDMxNzkwX3dyaXRlX2ZhbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwKKwkJCSAgICAgIGxvbmcgdmFsKQogewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKLQlzdHJ1Y3QgbWF4MzE3OTBfZGF0YSAqZGF0YSA9IG1heDMxNzkwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgc3IsIHJwbTsKLQotCWlmIChJU19FUlIoZGF0YSkpCi0JCXJldHVybiBQVFJfRVJSKGRhdGEpOwotCi0Jc3IgPSBnZXRfdGFjaF9wZXJpb2QoZGF0YS0+ZmFuX2R5bmFtaWNzW2F0dHItPmluZGV4XSk7Ci0JcnBtID0gUlBNX0ZST01fUkVHKGRhdGEtPnRhcmdldF9jb3VudFthdHRyLT5pbmRleF0sIHNyKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBycG0pOwotfQotCi1zdGF0aWMgc3NpemVfdCBzZXRfZmFuX3RhcmdldChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKIAlzdHJ1Y3QgbWF4MzE3OTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CisJaW50IHRhcmdldF9jb3VudDsKKwlpbnQgZXJyID0gMDsKIAl1OCBiaXRzOwogCWludCBzcjsKLQlpbnQgdGFyZ2V0X2NvdW50OwotCXVuc2lnbmVkIGxvbmcgcnBtOwotCWludCBlcnI7Ci0KLQllcnIgPSBrc3RydG91bChidWYsIDEwLCAmcnBtKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCi0JcnBtID0gY2xhbXBfdmFsKHJwbSwgRkFOX1JQTV9NSU4sIEZBTl9SUE1fTUFYKTsKLQliaXRzID0gYml0c19mb3JfdGFjaF9wZXJpb2QocnBtKTsKLQlkYXRhLT5mYW5fZHluYW1pY3NbYXR0ci0+aW5kZXhdID0KLQkJCSgoZGF0YS0+ZmFuX2R5bmFtaWNzW2F0dHItPmluZGV4XQotCQkJICAmIH5NQVgzMTc5MF9GQU5fRFlOX1NSX01BU0spCi0JCQkgfCAoYml0cyA8PCBNQVgzMTc5MF9GQU5fRFlOX1NSX1NISUZUKSk7Ci0JZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCi0JCQlNQVgzMTc5MF9SRUdfRkFOX0RZTkFNSUNTKGF0dHItPmluZGV4KSwKLQkJCWRhdGEtPmZhbl9keW5hbWljc1thdHRyLT5pbmRleF0pOworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fZmFuX3RhcmdldDoKKwkJdmFsID0gY2xhbXBfdmFsKHZhbCwgRkFOX1JQTV9NSU4sIEZBTl9SUE1fTUFYKTsKKwkJYml0cyA9IGJpdHNfZm9yX3RhY2hfcGVyaW9kKHZhbCk7CisJCWRhdGEtPmZhbl9keW5hbWljc1tjaGFubmVsXSA9CisJCQkoKGRhdGEtPmZhbl9keW5hbWljc1tjaGFubmVsXSAmCisJCQkgIH5NQVgzMTc5MF9GQU5fRFlOX1NSX01BU0spIHwKKwkJCSAoYml0cyA8PCBNQVgzMTc5MF9GQU5fRFlOX1NSX1NISUZUKSk7CisJCWVyciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQlNQVgzMTc5MF9SRUdfRkFOX0RZTkFNSUNTKGNoYW5uZWwpLAorCQkJCQlkYXRhLT5mYW5fZHluYW1pY3NbY2hhbm5lbF0pOworCQlpZiAoZXJyIDwgMCkKKwkJCWJyZWFrOwogCi0JaWYgKGVyciA8IDApIHsKLQkJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JCXJldHVybiBlcnI7Ci0JfQorCQlzciA9IGdldF90YWNoX3BlcmlvZChkYXRhLT5mYW5fZHluYW1pY3NbY2hhbm5lbF0pOworCQl0YXJnZXRfY291bnQgPSBSUE1fVE9fUkVHKHZhbCwgc3IpOworCQl0YXJnZXRfY291bnQgPSBjbGFtcF92YWwodGFyZ2V0X2NvdW50LCAweDEsIDB4N0ZGKTsKIAotCXNyID0gZ2V0X3RhY2hfcGVyaW9kKGRhdGEtPmZhbl9keW5hbWljc1thdHRyLT5pbmRleF0pOwotCXRhcmdldF9jb3VudCA9IFJQTV9UT19SRUcocnBtLCBzcik7Ci0JdGFyZ2V0X2NvdW50ID0gY2xhbXBfdmFsKHRhcmdldF9jb3VudCwgMHgxLCAweDdGRik7CisJCWRhdGEtPnRhcmdldF9jb3VudFtjaGFubmVsXSA9IHRhcmdldF9jb3VudCA8PCA1OwogCi0JZGF0YS0+dGFyZ2V0X2NvdW50W2F0dHItPmluZGV4XSA9IHRhcmdldF9jb3VudCA8PCA1OwotCi0JZXJyID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChjbGllbnQsCi0JCQlNQVgzMTc5MF9SRUdfVEFSR0VUX0NPVU5UKGF0dHItPmluZGV4KSwKLQkJCWRhdGEtPnRhcmdldF9jb3VudFthdHRyLT5pbmRleF0pOwotCi0JbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3QgZ2V0X3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKLQlzdHJ1Y3QgbWF4MzE3OTBfZGF0YSAqZGF0YSA9IG1heDMxNzkwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgcHdtOwotCi0JaWYgKElTX0VSUihkYXRhKSkKLQkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7Ci0KLQlwd20gPSBkYXRhLT5wd21bYXR0ci0+aW5kZXhdID4+IDg7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcHdtKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2V0X3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKLQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKLQlzdHJ1Y3QgbWF4MzE3OTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7Ci0JdW5zaWduZWQgbG9uZyBwd207Ci0JaW50IGVycjsKLQotCWVyciA9IGtzdHJ0b3VsKGJ1ZiwgMTAsICZwd20pOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlpZiAocHdtID4gMjU1KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQotCWRhdGEtPnB3bVthdHRyLT5pbmRleF0gPSBwd20gPDwgODsKLQllcnIgPSBpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsaWVudCwKLQkJCU1BWDMxNzkwX1JFR19QV01PVVQoYXR0ci0+aW5kZXgpLAotCQkJZGF0YS0+cHdtW2F0dHItPmluZGV4XSk7Ci0KLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBnZXRfcHdtX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKLQlzdHJ1Y3QgbWF4MzE3OTBfZGF0YSAqZGF0YSA9IG1heDMxNzkwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgbW9kZTsKLQotCWlmIChJU19FUlIoZGF0YSkpCi0JCXJldHVybiBQVFJfRVJSKGRhdGEpOwotCi0JaWYgKGRhdGEtPmZhbl9jb25maWdbYXR0ci0+aW5kZXhdICYgTUFYMzE3OTBfRkFOX0NGR19SUE1fTU9ERSkKLQkJbW9kZSA9IDI7Ci0JZWxzZSBpZiAoZGF0YS0+ZmFuX2NvbmZpZ1thdHRyLT5pbmRleF0gJiBNQVgzMTc5MF9GQU5fQ0ZHX1RBQ0hfSU5QVVRfRU4pCi0JCW1vZGUgPSAxOwotCWVsc2UKLQkJbW9kZSA9IDA7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgbW9kZSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNldF9wd21fZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAotCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOwotCXN0cnVjdCBtYXgzMTc5MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKLQl1bnNpZ25lZCBsb25nIG1vZGU7Ci0JaW50IGVycjsKLQotCWVyciA9IGtzdHJ0b3VsKGJ1ZiwgMTAsICZtb2RlKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSAwOgotCQlkYXRhLT5mYW5fY29uZmlnW2F0dHItPmluZGV4XSA9Ci0JCQlkYXRhLT5mYW5fY29uZmlnW2F0dHItPmluZGV4XQotCQkJJiB+KE1BWDMxNzkwX0ZBTl9DRkdfVEFDSF9JTlBVVF9FTgotCQkJICAgIHwgTUFYMzE3OTBfRkFOX0NGR19SUE1fTU9ERSk7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJZGF0YS0+ZmFuX2NvbmZpZ1thdHRyLT5pbmRleF0gPQotCQkJKGRhdGEtPmZhbl9jb25maWdbYXR0ci0+aW5kZXhdCi0JCQkgfCBNQVgzMTc5MF9GQU5fQ0ZHX1RBQ0hfSU5QVVRfRU4pCi0JCQkmIH5NQVgzMTc5MF9GQU5fQ0ZHX1JQTV9NT0RFOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCWRhdGEtPmZhbl9jb25maWdbYXR0ci0+aW5kZXhdID0KLQkJCWRhdGEtPmZhbl9jb25maWdbYXR0ci0+aW5kZXhdCi0JCQl8IE1BWDMxNzkwX0ZBTl9DRkdfVEFDSF9JTlBVVF9FTgotCQkJfCBNQVgzMTc5MF9GQU5fQ0ZHX1JQTV9NT0RFOworCQllcnIgPSBpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsaWVudCwKKwkJCQkJTUFYMzE3OTBfUkVHX1RBUkdFVF9DT1VOVChjaGFubmVsKSwKKwkJCQkJZGF0YS0+dGFyZ2V0X2NvdW50W2NoYW5uZWxdKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlicmVhazsKIAl9CiAKLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQllcnIgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCU1BWDMxNzkwX1JFR19GQU5fQ09ORklHKGF0dHItPmluZGV4KSwKLQkJCWRhdGEtPmZhbl9jb25maWdbYXR0ci0+aW5kZXhdKTsKLQogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCi0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlyZXR1cm4gY291bnQ7CisJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHNzaXplX3QgZ2V0X2Zhbl9mYXVsdChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCitzdGF0aWMgdW1vZGVfdCBtYXgzMTc5MF9mYW5faXNfdmlzaWJsZShjb25zdCB2b2lkICpfZGF0YSwgdTMyIGF0dHIsIGludCBjaGFubmVsKQogewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwljb25zdCBzdHJ1Y3QgbWF4MzE3OTBfZGF0YSAqZGF0YSA9IF9kYXRhOworCXU4IGZhbl9jb25maWcgPSBkYXRhLT5mYW5fY29uZmlnW2NoYW5uZWwgJSBOUl9DSEFOTkVMXTsKKworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fZmFuX2lucHV0OgorCWNhc2UgaHdtb25fZmFuX2ZhdWx0OgorCQlpZiAoY2hhbm5lbCA8IE5SX0NIQU5ORUwgfHwKKwkJICAgIChmYW5fY29uZmlnICYgTUFYMzE3OTBfRkFOX0NGR19UQUNIX0lOUFVUKSkKKwkJCXJldHVybiBTX0lSVUdPOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX2Zhbl90YXJnZXQ6CisJCWlmIChjaGFubmVsIDwgTlJfQ0hBTk5FTCAmJgorCQkgICAgIShmYW5fY29uZmlnICYgTUFYMzE3OTBfRkFOX0NGR19UQUNIX0lOUFVUKSkKKwkJCXJldHVybiBTX0lSVUdPIHwgU19JV1VTUjsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IG1heDMxNzkwX3JlYWRfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGF0dHIsIGludCBjaGFubmVsLAorCQkJICAgICBsb25nICp2YWwpCit7CiAJc3RydWN0IG1heDMxNzkwX2RhdGEgKmRhdGEgPSBtYXgzMTc5MF91cGRhdGVfZGV2aWNlKGRldik7Ci0JaW50IGZhdWx0OworCXU4IGZhbl9jb25maWcgPSBkYXRhLT5mYW5fY29uZmlnW2NoYW5uZWxdOwogCiAJaWYgKElTX0VSUihkYXRhKSkKIAkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7CiAKLQlmYXVsdCA9ICEhKGRhdGEtPmZhdWx0X3N0YXR1cyAmICgxIDw8IGF0dHItPmluZGV4KSk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZmF1bHQpOworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fcHdtX2lucHV0OgorCQkqdmFsID0gZGF0YS0+cHdtW2NoYW5uZWxdID4+IDg7CisJCXJldHVybiAwOworCWNhc2UgaHdtb25fcHdtX2VuYWJsZToKKwkJaWYgKGZhbl9jb25maWcgJiBNQVgzMTc5MF9GQU5fQ0ZHX1JQTV9NT0RFKQorCQkJKnZhbCA9IDI7CisJCWVsc2UgaWYgKGZhbl9jb25maWcgJiBNQVgzMTc5MF9GQU5fQ0ZHX1RBQ0hfSU5QVVRfRU4pCisJCQkqdmFsID0gMTsKKwkJZWxzZQorCQkJKnZhbCA9IDA7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CiB9CiAKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMV9pbnB1dCwgU19JUlVHTywgZ2V0X2ZhbiwgTlVMTCwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjJfaW5wdXQsIFNfSVJVR08sIGdldF9mYW4sIE5VTEwsIDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4zX2lucHV0LCBTX0lSVUdPLCBnZXRfZmFuLCBOVUxMLCAyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuNF9pbnB1dCwgU19JUlVHTywgZ2V0X2ZhbiwgTlVMTCwgMyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjVfaW5wdXQsIFNfSVJVR08sIGdldF9mYW4sIE5VTEwsIDQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW42X2lucHV0LCBTX0lSVUdPLCBnZXRfZmFuLCBOVUxMLCA1KTsKK3N0YXRpYyBpbnQgbWF4MzE3OTBfd3JpdGVfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGF0dHIsIGludCBjaGFubmVsLAorCQkJICAgICAgbG9uZyB2YWwpCit7CisJc3RydWN0IG1heDMxNzkwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OworCXU4IGZhbl9jb25maWc7CisJaW50IGVyciA9IDA7CiAKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMV9mYXVsdCwgU19JUlVHTywgZ2V0X2Zhbl9mYXVsdCwgTlVMTCwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjJfZmF1bHQsIFNfSVJVR08sIGdldF9mYW5fZmF1bHQsIE5VTEwsIDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4zX2ZhdWx0LCBTX0lSVUdPLCBnZXRfZmFuX2ZhdWx0LCBOVUxMLCAyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuNF9mYXVsdCwgU19JUlVHTywgZ2V0X2Zhbl9mYXVsdCwgTlVMTCwgMyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjVfZmF1bHQsIFNfSVJVR08sIGdldF9mYW5fZmF1bHQsIE5VTEwsIDQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW42X2ZhdWx0LCBTX0lSVUdPLCBnZXRfZmFuX2ZhdWx0LCBOVUxMLCA1KTsKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuN19pbnB1dCwgU19JUlVHTywgZ2V0X2ZhbiwgTlVMTCwgNik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjhfaW5wdXQsIFNfSVJVR08sIGdldF9mYW4sIE5VTEwsIDcpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW45X2lucHV0LCBTX0lSVUdPLCBnZXRfZmFuLCBOVUxMLCA4KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMTBfaW5wdXQsIFNfSVJVR08sIGdldF9mYW4sIE5VTEwsIDkpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xMV9pbnB1dCwgU19JUlVHTywgZ2V0X2ZhbiwgTlVMTCwgMTApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xMl9pbnB1dCwgU19JUlVHTywgZ2V0X2ZhbiwgTlVMTCwgMTEpOworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fcHdtX2lucHV0OgorCQlpZiAodmFsIDwgMCB8fCB2YWwgPiAyNTUpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlkYXRhLT5wd21bY2hhbm5lbF0gPSB2YWwgPDwgODsKKwkJZXJyID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChjbGllbnQsCisJCQkJCQkgICBNQVgzMTc5MF9SRUdfUFdNT1VUKGNoYW5uZWwpLAorCQkJCQkJICAgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBod21vbl9wd21fZW5hYmxlOgorCQlmYW5fY29uZmlnID0gZGF0YS0+ZmFuX2NvbmZpZ1tjaGFubmVsXTsKKwkJaWYgKHZhbCA9PSAwKSB7CisJCQlmYW5fY29uZmlnICY9IH4oTUFYMzE3OTBfRkFOX0NGR19UQUNIX0lOUFVUX0VOIHwKKwkJCQkJTUFYMzE3OTBfRkFOX0NGR19SUE1fTU9ERSk7CisJCX0gZWxzZSBpZiAodmFsID09IDEpIHsKKwkJCWZhbl9jb25maWcgPSAoZmFuX2NvbmZpZyB8CisJCQkJICAgICAgTUFYMzE3OTBfRkFOX0NGR19UQUNIX0lOUFVUX0VOKSAmCisJCQkJICAgICB+TUFYMzE3OTBfRkFOX0NGR19SUE1fTU9ERTsKKwkJfSBlbHNlIGlmICh2YWwgPT0gMikgeworCQkJZmFuX2NvbmZpZyB8PSBNQVgzMTc5MF9GQU5fQ0ZHX1RBQ0hfSU5QVVRfRU4gfAorCQkJCSAgICAgIE1BWDMxNzkwX0ZBTl9DRkdfUlBNX01PREU7CisJCX0gZWxzZSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJZGF0YS0+ZmFuX2NvbmZpZ1tjaGFubmVsXSA9IGZhbl9jb25maWc7CisJCWVyciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQlNQVgzMTc5MF9SRUdfRkFOX0NPTkZJRyhjaGFubmVsKSwKKwkJCQkJZmFuX2NvbmZpZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlicmVhazsKKwl9CiAKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuN19mYXVsdCwgU19JUlVHTywgZ2V0X2Zhbl9mYXVsdCwgTlVMTCwgNik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjhfZmF1bHQsIFNfSVJVR08sIGdldF9mYW5fZmF1bHQsIE5VTEwsIDcpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW45X2ZhdWx0LCBTX0lSVUdPLCBnZXRfZmFuX2ZhdWx0LCBOVUxMLCA4KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMTBfZmF1bHQsIFNfSVJVR08sIGdldF9mYW5fZmF1bHQsIE5VTEwsIDkpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xMV9mYXVsdCwgU19JUlVHTywgZ2V0X2Zhbl9mYXVsdCwgTlVMTCwgMTApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xMl9mYXVsdCwgU19JUlVHTywgZ2V0X2Zhbl9mYXVsdCwgTlVMTCwgMTEpOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjFfdGFyZ2V0LCBTX0lXVVNSIHwgU19JUlVHTywKLQkJZ2V0X2Zhbl90YXJnZXQsIHNldF9mYW5fdGFyZ2V0LCAwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMl90YXJnZXQsIFNfSVdVU1IgfCBTX0lSVUdPLAotCQlnZXRfZmFuX3RhcmdldCwgc2V0X2Zhbl90YXJnZXQsIDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4zX3RhcmdldCwgU19JV1VTUiB8IFNfSVJVR08sCi0JCWdldF9mYW5fdGFyZ2V0LCBzZXRfZmFuX3RhcmdldCwgMik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjRfdGFyZ2V0LCBTX0lXVVNSIHwgU19JUlVHTywKLQkJZ2V0X2Zhbl90YXJnZXQsIHNldF9mYW5fdGFyZ2V0LCAzKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuNV90YXJnZXQsIFNfSVdVU1IgfCBTX0lSVUdPLAotCQlnZXRfZmFuX3RhcmdldCwgc2V0X2Zhbl90YXJnZXQsIDQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW42X3RhcmdldCwgU19JV1VTUiB8IFNfSVJVR08sCi0JCWdldF9mYW5fdGFyZ2V0LCBzZXRfZmFuX3RhcmdldCwgNSk7CisJcmV0dXJuIGVycjsKK30KIAotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd20xLCBTX0lXVVNSIHwgU19JUlVHTywgZ2V0X3B3bSwgc2V0X3B3bSwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTIsIFNfSVdVU1IgfCBTX0lSVUdPLCBnZXRfcHdtLCBzZXRfcHdtLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMywgU19JV1VTUiB8IFNfSVJVR08sIGdldF9wd20sIHNldF9wd20sIDIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd200LCBTX0lXVVNSIHwgU19JUlVHTywgZ2V0X3B3bSwgc2V0X3B3bSwgMyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTUsIFNfSVdVU1IgfCBTX0lSVUdPLCBnZXRfcHdtLCBzZXRfcHdtLCA0KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtNiwgU19JV1VTUiB8IFNfSVJVR08sIGdldF9wd20sIHNldF9wd20sIDUpOworc3RhdGljIHVtb2RlX3QgbWF4MzE3OTBfcHdtX2lzX3Zpc2libGUoY29uc3Qgdm9pZCAqX2RhdGEsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCkKK3sKKwljb25zdCBzdHJ1Y3QgbWF4MzE3OTBfZGF0YSAqZGF0YSA9IF9kYXRhOworCXU4IGZhbl9jb25maWcgPSBkYXRhLT5mYW5fY29uZmlnW2NoYW5uZWxdOwogCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTFfZW5hYmxlLCBTX0lXVVNSIHwgU19JUlVHTywKLQkJZ2V0X3B3bV9lbmFibGUsIHNldF9wd21fZW5hYmxlLCAwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMl9lbmFibGUsIFNfSVdVU1IgfCBTX0lSVUdPLAotCQlnZXRfcHdtX2VuYWJsZSwgc2V0X3B3bV9lbmFibGUsIDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd20zX2VuYWJsZSwgU19JV1VTUiB8IFNfSVJVR08sCi0JCWdldF9wd21fZW5hYmxlLCBzZXRfcHdtX2VuYWJsZSwgMik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTRfZW5hYmxlLCBTX0lXVVNSIHwgU19JUlVHTywKLQkJZ2V0X3B3bV9lbmFibGUsIHNldF9wd21fZW5hYmxlLCAzKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtNV9lbmFibGUsIFNfSVdVU1IgfCBTX0lSVUdPLAotCQlnZXRfcHdtX2VuYWJsZSwgc2V0X3B3bV9lbmFibGUsIDQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd202X2VuYWJsZSwgU19JV1VTUiB8IFNfSVJVR08sCi0JCWdldF9wd21fZW5hYmxlLCBzZXRfcHdtX2VuYWJsZSwgNSk7CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl9wd21faW5wdXQ6CisJY2FzZSBod21vbl9wd21fZW5hYmxlOgorCQlpZiAoIShmYW5fY29uZmlnICYgTUFYMzE3OTBfRkFOX0NGR19UQUNIX0lOUFVUKSkKKwkJCXJldHVybiBTX0lSVUdPIHwgU19JV1VTUjsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbWF4MzE3OTBfYXR0cnNbXSA9IHsKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjRfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjVfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjZfaW5wdXQuZGV2X2F0dHIuYXR0ciwKK3N0YXRpYyBpbnQgbWF4MzE3OTBfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQkgdTMyIGF0dHIsIGludCBjaGFubmVsLCBsb25nICp2YWwpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBod21vbl9mYW46CisJCXJldHVybiBtYXgzMTc5MF9yZWFkX2ZhbihkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJY2FzZSBod21vbl9wd206CisJCXJldHVybiBtYXgzMTc5MF9yZWFkX3B3bShkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KIAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuMV9mYXVsdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuMl9mYXVsdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuM19mYXVsdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuNF9mYXVsdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuNV9mYXVsdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuNl9mYXVsdC5kZXZfYXR0ci5hdHRyLAorc3RhdGljIGludCBtYXgzMTc5MF93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQkgIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyB2YWwpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBod21vbl9mYW46CisJCXJldHVybiBtYXgzMTc5MF93cml0ZV9mYW4oZGV2LCBhdHRyLCBjaGFubmVsLCB2YWwpOworCWNhc2UgaHdtb25fcHdtOgorCQlyZXR1cm4gbWF4MzE3OTBfd3JpdGVfcHdtKGRldiwgYXR0ciwgY2hhbm5lbCwgdmFsKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQogCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW43X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW44X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW45X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4xMF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuMTFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjEyX2lucHV0LmRldl9hdHRyLmF0dHIsCitzdGF0aWMgdW1vZGVfdCBtYXgzMTc5MF9pc192aXNpYmxlKGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICAgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJCQkgICB1MzIgYXR0ciwgaW50IGNoYW5uZWwpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBod21vbl9mYW46CisJCXJldHVybiBtYXgzMTc5MF9mYW5faXNfdmlzaWJsZShkYXRhLCBhdHRyLCBjaGFubmVsKTsKKwljYXNlIGh3bW9uX3B3bToKKwkJcmV0dXJuIG1heDMxNzkwX3B3bV9pc192aXNpYmxlKGRhdGEsIGF0dHIsIGNoYW5uZWwpOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KIAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuN19mYXVsdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuOF9mYXVsdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuOV9mYXVsdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuMTBfZmF1bHQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjExX2ZhdWx0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4xMl9mYXVsdC5kZXZfYXR0ci5hdHRyLAorc3RhdGljIGNvbnN0IHUzMiBtYXgzMTc5MF9mYW5fY29uZmlnW10gPSB7CisJSFdNT05fRl9JTlBVVCB8IEhXTU9OX0ZfVEFSR0VUIHwgSFdNT05fRl9GQVVMVCwKKwlIV01PTl9GX0lOUFVUIHwgSFdNT05fRl9UQVJHRVQgfCBIV01PTl9GX0ZBVUxULAorCUhXTU9OX0ZfSU5QVVQgfCBIV01PTl9GX1RBUkdFVCB8IEhXTU9OX0ZfRkFVTFQsCisJSFdNT05fRl9JTlBVVCB8IEhXTU9OX0ZfVEFSR0VUIHwgSFdNT05fRl9GQVVMVCwKKwlIV01PTl9GX0lOUFVUIHwgSFdNT05fRl9UQVJHRVQgfCBIV01PTl9GX0ZBVUxULAorCUhXTU9OX0ZfSU5QVVQgfCBIV01PTl9GX1RBUkdFVCB8IEhXTU9OX0ZfRkFVTFQsCisJSFdNT05fRl9JTlBVVCB8IEhXTU9OX0ZfRkFVTFQsCisJSFdNT05fRl9JTlBVVCB8IEhXTU9OX0ZfRkFVTFQsCisJSFdNT05fRl9JTlBVVCB8IEhXTU9OX0ZfRkFVTFQsCisJSFdNT05fRl9JTlBVVCB8IEhXTU9OX0ZfRkFVTFQsCisJSFdNT05fRl9JTlBVVCB8IEhXTU9OX0ZfRkFVTFQsCisJSFdNT05fRl9JTlBVVCB8IEhXTU9OX0ZfRkFVTFQsCisJMAorfTsKIAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuMV90YXJnZXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfdGFyZ2V0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4zX3RhcmdldC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuNF90YXJnZXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjVfdGFyZ2V0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW42X3RhcmdldC5kZXZfYXR0ci5hdHRyLAorc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gbWF4MzE3OTBfZmFuID0geworCS50eXBlID0gaHdtb25fZmFuLAorCS5jb25maWcgPSBtYXgzMTc5MF9mYW5fY29uZmlnLAorfTsKIAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtMS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtMi5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtMy5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtNC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtNS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtNi5kZXZfYXR0ci5hdHRyLAorc3RhdGljIGNvbnN0IHUzMiBtYXgzMTc5MF9wd21fY29uZmlnW10gPSB7CisJSFdNT05fUFdNX0lOUFVUIHwgSFdNT05fUFdNX0VOQUJMRSwKKwlIV01PTl9QV01fSU5QVVQgfCBIV01PTl9QV01fRU5BQkxFLAorCUhXTU9OX1BXTV9JTlBVVCB8IEhXTU9OX1BXTV9FTkFCTEUsCisJSFdNT05fUFdNX0lOUFVUIHwgSFdNT05fUFdNX0VOQUJMRSwKKwlIV01PTl9QV01fSU5QVVQgfCBIV01PTl9QV01fRU5BQkxFLAorCUhXTU9OX1BXTV9JTlBVVCB8IEhXTU9OX1BXTV9FTkFCTEUsCisJMAorfTsKIAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtMV9lbmFibGUuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3B3bTJfZW5hYmxlLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9wd20zX2VuYWJsZS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtNF9lbmFibGUuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3B3bTVfZW5hYmxlLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9wd202X2VuYWJsZS5kZXZfYXR0ci5hdHRyLAorc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gbWF4MzE3OTBfcHdtID0geworCS50eXBlID0gaHdtb25fcHdtLAorCS5jb25maWcgPSBtYXgzMTc5MF9wd21fY29uZmlnLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gKm1heDMxNzkwX2luZm9bXSA9IHsKKwkmbWF4MzE3OTBfZmFuLAorCSZtYXgzMTc5MF9wd20sCiAJTlVMTAogfTsKIAotc3RhdGljIHVtb2RlX3QgbWF4MzE3OTBfYXR0cnNfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkgICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmEsIGludCBuKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKLQlzdHJ1Y3QgbWF4MzE3OTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyID0KLQkJCWNvbnRhaW5lcl9vZihhLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSwgYXR0cik7Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleCAlIE5SX0NIQU5ORUw7Ci0JdTggZmFuX2NvbmZpZzsKLQotCWZhbl9jb25maWcgPSBkYXRhLT5mYW5fY29uZmlnW2luZGV4XTsKLQotCWlmIChuID49IE5SX0NIQU5ORUwgKiAyICYmIG4gPCBOUl9DSEFOTkVMICogNCAmJgotCSAgICAhKGZhbl9jb25maWcgJiBNQVgzMTc5MF9GQU5fQ0ZHX1RBQ0hfSU5QVVQpKQotCQlyZXR1cm4gMDsKLQlpZiAobiA+PSBOUl9DSEFOTkVMICogNCAmJiAoZmFuX2NvbmZpZyAmIE1BWDMxNzkwX0ZBTl9DRkdfVEFDSF9JTlBVVCkpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIGEtPm1vZGU7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG1heDMxNzkwX2dyb3VwID0gewotCS5hdHRycyA9IG1heDMxNzkwX2F0dHJzLAotCS5pc192aXNpYmxlID0gbWF4MzE3OTBfYXR0cnNfdmlzaWJsZSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fb3BzIG1heDMxNzkwX2h3bW9uX29wcyA9IHsKKwkuaXNfdmlzaWJsZSA9IG1heDMxNzkwX2lzX3Zpc2libGUsCisJLnJlYWQgPSBtYXgzMTc5MF9yZWFkLAorCS53cml0ZSA9IG1heDMxNzkwX3dyaXRlLAogfTsKLV9fQVRUUklCVVRFX0dST1VQUyhtYXgzMTc5MCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hpcF9pbmZvIG1heDMxNzkwX2NoaXBfaW5mbyA9IHsKKwkub3BzID0gJm1heDMxNzkwX2h3bW9uX29wcywKKwkuaW5mbyA9IG1heDMxNzkwX2luZm8sCit9OwogCiBzdGF0aWMgaW50IG1heDMxNzkwX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkJc3RydWN0IG1heDMxNzkwX2RhdGEgKmRhdGEpCkBAIC01NzUsOCArNTAwLDEwIEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKGRldiwKLQkJCWNsaWVudC0+bmFtZSwgZGF0YSwgbWF4MzE3OTBfZ3JvdXBzKTsKKwlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8oZGV2LCBjbGllbnQtPm5hbWUsCisJCQkJCQkJIGRhdGEsCisJCQkJCQkJICZtYXgzMTc5MF9jaGlwX2luZm8sCisJCQkJCQkJIE5VTEwpOwogCiAJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhod21vbl9kZXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9tYXg2NjUwLmMgYi9kcml2ZXJzL2h3bW9uL21heDY2NTAuYwppbmRleCAxNjJhNTIwLi5hOTkzYjQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL21heDY2NTAuYworKysgYi9kcml2ZXJzL2h3bW9uL21heDY2NTAuYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KIAogLyoKICAqIEluc21vZCBwYXJhbWV0ZXJzCkBAIC00OCw3ICs0OSw3IEBACiBzdGF0aWMgaW50IGZhbl92b2x0YWdlOwogLyogcHJlc2NhbGVyOiBQb3NzaWJsZSB2YWx1ZXMgYXJlIDEsIDIsIDQsIDgsIDE2IG9yIDAgZm9yIGRvbid0IGNoYW5nZSAqLwogc3RhdGljIGludCBwcmVzY2FsZXI7Ci0vKiBjbG9jazogVGhlIGNsb2NrIGZyZXF1ZW5jeSBvZiB0aGUgY2hpcCB0aGUgZHJpdmVyIHNob3VsZCBhc3N1bWUgKi8KKy8qIGNsb2NrOiBUaGUgY2xvY2sgZnJlcXVlbmN5IG9mIHRoZSBjaGlwIChtYXg2NjUxIGNhbiBiZSBjbG9ja2VkIGV4dGVybmFsbHkpICovCiBzdGF0aWMgaW50IGNsb2NrID0gMjU0MDAwOwogCiBtb2R1bGVfcGFyYW0oZmFuX3ZvbHRhZ2UsIGludCwgU19JUlVHTyk7CkBAIC0xMzMsNiArMTM0LDE5IEBACiAJTUFYNjY1MF9SRUdfVEFDSDMsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtYXg2NjUwX2R0X21hdGNoW10gPSB7CisJeworCQkuY29tcGF0aWJsZSA9ICJtYXhpbSxtYXg2NjUwIiwKKwkJLmRhdGEgPSAodm9pZCAqKTEKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAibWF4aW0sbWF4NjY1MSIsCisJCS5kYXRhID0gKHZvaWQgKik0CisJfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbWF4NjY1MF9kdF9tYXRjaCk7CisKIHN0YXRpYyBzdHJ1Y3QgbWF4NjY1MF9kYXRhICptYXg2NjUwX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBtYXg2NjUwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKQEAgLTE3MSw2ICsxODUsMzAgQEAKIAlyZXR1cm4gZGF0YTsKIH0KIAorLyoKKyAqIENoYW5nZSB0aGUgb3BlcmF0aW5nIG1vZGUgb2YgdGhlIGNoaXAgKGlmIG5lZWRlZCkuCisgKiBtb2RlIGlzIG9uZSBvZiB0aGUgTUFYNjY1MF9DRkdfTU9ERV8qIHZhbHVlcy4KKyAqLworc3RhdGljIGludCBtYXg2NjUwX3NldF9vcGVyYXRpbmdfbW9kZShzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhLCB1OCBtb2RlKQoreworCWludCByZXN1bHQ7CisJdTggY29uZmlnID0gZGF0YS0+Y29uZmlnOworCisJaWYgKG1vZGUgPT0gKGNvbmZpZyAmIE1BWDY2NTBfQ0ZHX01PREVfTUFTSykpCisJCXJldHVybiAwOworCisJY29uZmlnID0gKGNvbmZpZyAmIH5NQVg2NjUwX0NGR19NT0RFX01BU0spIHwgbW9kZTsKKworCXJlc3VsdCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBNQVg2NjUwX1JFR19DT05GSUcsCisJCQkJCSAgIGNvbmZpZyk7CisJaWYgKHJlc3VsdCA8IDApCisJCXJldHVybiByZXN1bHQ7CisKKwlkYXRhLT5jb25maWcgPSBjb25maWc7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHNzaXplX3QgZ2V0X2ZhbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAogCQkgICAgICAgY2hhciAqYnVmKQogewpAQCAtMjUyLDE4ICsyOTAsMTIgQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcnBtKTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2V0X3RhcmdldChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAotCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIGludCBtYXg2NjUwX3NldF90YXJnZXQoc3RydWN0IG1heDY2NTBfZGF0YSAqZGF0YSwgdW5zaWduZWQgbG9uZyBycG0pCiB7Ci0Jc3RydWN0IG1heDY2NTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAJaW50IGtzY2FsZSwga3RhY2g7Ci0JdW5zaWduZWQgbG9uZyBycG07Ci0JaW50IGVycjsKIAotCWVyciA9IGtzdHJ0b3VsKGJ1ZiwgMTAsICZycG0pOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7CisJaWYgKHJwbSA9PSAwKQorCQlyZXR1cm4gbWF4NjY1MF9zZXRfb3BlcmF0aW5nX21vZGUoZGF0YSwgTUFYNjY1MF9DRkdfTU9ERV9PRkYpOwogCiAJcnBtID0gY2xhbXBfdmFsKHJwbSwgRkFOX1JQTV9NSU4sIEZBTl9SUE1fTUFYKTsKIApAQCAtMjc0LDggKzMwNiw2IEBACiAJICogICAgIEtUQUNIID0gWyhmQ0xLIHggS1NDQUxFKSAvICgyNTYgeCBGYW5TcGVlZCldIC0gMQogCSAqLwogCi0JbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCiAJa3NjYWxlID0gRElWX0ZST01fUkVHKGRhdGEtPmNvbmZpZyk7CiAJa3RhY2ggPSAoKGNsb2NrICoga3NjYWxlKSAvICgyNTYgKiBycG0gLyA2MCkpIC0gMTsKIAlpZiAoa3RhY2ggPCAwKQpAQCAtMjg0LDEwICszMTQsMzAgQEAKIAkJa3RhY2ggPSAyNTU7CiAJZGF0YS0+c3BlZWQgPSBrdGFjaDsKIAotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBNQVg2NjUwX1JFR19TUEVFRCwgZGF0YS0+c3BlZWQpOworCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgTUFYNjY1MF9SRUdfU1BFRUQsCisJCQkJCSBkYXRhLT5zcGVlZCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF90YXJnZXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyBycG07CisJaW50IGVycjsKKworCWVyciA9IGtzdHJ0b3VsKGJ1ZiwgMTAsICZycG0pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwllcnIgPSBtYXg2NjUwX3NldF90YXJnZXQoZGF0YSwgcnBtKTsKIAogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTM0MSwxMiArMzkxLDExIEBACiAJCWRhdGEtPmRhYyA9IDE4MCAtICgxODAgKiBwd20pLzI1NTsKIAllbHNlCiAJCWRhdGEtPmRhYyA9IDc2IC0gKDc2ICogcHdtKS8yNTU7Ci0KLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTUFYNjY1MF9SRUdfREFDLCBkYXRhLT5kYWMpOworCWVyciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBNQVg2NjUwX1JFR19EQUMsIGRhdGEtPmRhYyk7CiAKIAltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAotCXJldHVybiBjb3VudDsKKwlyZXR1cm4gZXJyIDwgMCA/IGVyciA6IGNvdW50OwogfQogCiAvKgpAQCAtMzU1LDE0ICs0MDQsMTQgQEAKICAqIDAgPSBGYW4gYWx3YXlzIG9uCiAgKiAxID0gT3BlbiBsb29wLCBWb2x0YWdlIGlzIHNldCBhY2NvcmRpbmcgdG8gc3BlZWQsIG5vdCByZWd1bGF0ZWQuCiAgKiAyID0gQ2xvc2VkIGxvb3AsIFJQTSBmb3IgYWxsIGZhbnMgcmVndWxhdGVkIGJ5IGZhbjEgdGFjaG9tZXRlcgorICogMyA9IEZhbiBvZmYKICAqLwotCiBzdGF0aWMgc3NpemVfdCBnZXRfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCiAJCQkgIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhID0gbWF4NjY1MF91cGRhdGVfZGV2aWNlKGRldik7CiAJaW50IG1vZGUgPSAoZGF0YS0+Y29uZmlnICYgTUFYNjY1MF9DRkdfTU9ERV9NQVNLKSA+PiA0OwotCWludCBzeXNmc19tb2Rlc1s0XSA9IHswLCAxLCAyLCAxfTsKKwlpbnQgc3lzZnNfbW9kZXNbNF0gPSB7MCwgMywgMiwgMX07CiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgc3lzZnNfbW9kZXNbbW9kZV0pOwogfQpAQCAtMzcxLDI1ICs0MjAsMjUgQEAKIAkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IG1heDY2NTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7Ci0JaW50IG1heDY2NTBfbW9kZXNbM10gPSB7MCwgMywgMn07CiAJdW5zaWduZWQgbG9uZyBtb2RlOwogCWludCBlcnI7CisJY29uc3QgdTggbWF4NjY1MF9tb2Rlc1tdID0geworCQlNQVg2NjUwX0NGR19NT0RFX09OLAorCQlNQVg2NjUwX0NGR19NT0RFX09QRU5fTE9PUCwKKwkJTUFYNjY1MF9DRkdfTU9ERV9DTE9TRURfTE9PUCwKKwkJTUFYNjY1MF9DRkdfTU9ERV9PRkYsCisJCX07CiAKIAllcnIgPSBrc3RydG91bChidWYsIDEwLCAmbW9kZSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWlmIChtb2RlID4gMikKKwlpZiAobW9kZSA+PSBBUlJBWV9TSVpFKG1heDY2NTBfbW9kZXMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAotCWRhdGEtPmNvbmZpZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE1BWDY2NTBfUkVHX0NPTkZJRyk7Ci0JZGF0YS0+Y29uZmlnID0gKGRhdGEtPmNvbmZpZyAmIH5NQVg2NjUwX0NGR19NT0RFX01BU0spCi0JCSAgICAgICB8IChtYXg2NjUwX21vZGVzW21vZGVdIDw8IDQpOwotCi0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIE1BWDY2NTBfUkVHX0NPTkZJRywgZGF0YS0+Y29uZmlnKTsKKwltYXg2NjUwX3NldF9vcGVyYXRpbmdfbW9kZShkYXRhLCBtYXg2NjUwX21vZGVzW21vZGVdKTsKIAogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCkBAIC01NjYsNiArNjE1LDE4IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OwogCWludCBjb25maWc7CiAJaW50IGVyciA9IC1FSU87CisJdTMyIHZvbHRhZ2U7CisJdTMyIHByZXNjYWxlOworCXUzMiB0YXJnZXRfcnBtOworCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKGRldi0+b2Zfbm9kZSwgIm1heGltLGZhbi1taWNyb3ZvbHQiLAorCQkJCSAmdm9sdGFnZSkpCisJCXZvbHRhZ2UgPSBmYW5fdm9sdGFnZTsKKwllbHNlCisJCXZvbHRhZ2UgLz0gMTAwMDAwMDsgLyogTWljcm92b2x0cyB0byB2b2x0cyAqLworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihkZXYtPm9mX25vZGUsICJtYXhpbSxmYW4tcHJlc2NhbGUiLAorCQkJCSAmcHJlc2NhbGUpKQorCQlwcmVzY2FsZSA9IHByZXNjYWxlcjsKIAogCWNvbmZpZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE1BWDY2NTBfUkVHX0NPTkZJRyk7CiAKQEAgLTU3NCw3ICs2MzUsNyBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCXN3aXRjaCAoZmFuX3ZvbHRhZ2UpIHsKKwlzd2l0Y2ggKHZvbHRhZ2UpIHsKIAljYXNlIDA6CiAJCWJyZWFrOwogCWNhc2UgNToKQEAgLTU4NCwxNCArNjQ1LDEwIEBACiAJCWNvbmZpZyB8PSBNQVg2NjUwX0NGR19WMTI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9lcnIoZGV2LCAiaWxsZWdhbCB2YWx1ZSBmb3IgZmFuX3ZvbHRhZ2UgKCVkKVxuIiwKLQkJCWZhbl92b2x0YWdlKTsKKwkJZGV2X2VycihkZXYsICJpbGxlZ2FsIHZhbHVlIGZvciBmYW5fdm9sdGFnZSAoJWQpXG4iLCB2b2x0YWdlKTsKIAl9CiAKLQlkZXZfaW5mbyhkZXYsICJGYW4gdm9sdGFnZSBpcyBzZXQgdG8gJWRWLlxuIiwKLQkJIChjb25maWcgJiBNQVg2NjUwX0NGR19WMTIpID8gMTIgOiA1KTsKLQotCXN3aXRjaCAocHJlc2NhbGVyKSB7CisJc3dpdGNoIChwcmVzY2FsZSkgewogCWNhc2UgMDoKIAkJYnJlYWs7CiAJY2FzZSAxOgpAQCAtNjE0LDI4ICs2NzEsMTMgQEAKIAkJCSB8IE1BWDY2NTBfQ0ZHX1BSRVNDQUxFUl8xNjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2VycihkZXYsICJpbGxlZ2FsIHZhbHVlIGZvciBwcmVzY2FsZXIgKCVkKVxuIiwgcHJlc2NhbGVyKTsKKwkJZGV2X2VycihkZXYsICJpbGxlZ2FsIHZhbHVlIGZvciBwcmVzY2FsZXIgKCVkKVxuIiwgcHJlc2NhbGUpOwogCX0KIAotCWRldl9pbmZvKGRldiwgIlByZXNjYWxlciBpcyBzZXQgdG8gJWQuXG4iLAorCWRldl9pbmZvKGRldiwgIkZhbiB2b2x0YWdlOiAlZFYsIHByZXNjYWxlcjogJWQuXG4iLAorCQkgKGNvbmZpZyAmIE1BWDY2NTBfQ0ZHX1YxMikgPyAxMiA6IDUsCiAJCSAxIDw8IChjb25maWcgJiBNQVg2NjUwX0NGR19QUkVTQ0FMRVJfTUFTSykpOwogCi0JLyoKLQkgKiBJZiBtb2RlIGlzIHNldCB0byAiZnVsbCBvZmYiLCB3ZSBjaGFuZ2UgaXQgdG8gIm9wZW4gbG9vcCIgYW5kCi0JICogc2V0IERBQyB0byAyNTUsIHdoaWNoIGhhcyB0aGUgc2FtZSBlZmZlY3QuIFdlIGRvIHRoaXMgYmVjYXVzZQotCSAqIHRoZXJlJ3Mgbm8gImZ1bGwgb2ZmIiBtb2RlIGRlZmluZWQgaW4gaHdtb24gc3BlY2lmaWNhdGlvbnMuCi0JICovCi0KLQlpZiAoKGNvbmZpZyAmIE1BWDY2NTBfQ0ZHX01PREVfTUFTSykgPT0gTUFYNjY1MF9DRkdfTU9ERV9PRkYpIHsKLQkJZGV2X2RiZyhkZXYsICJDaGFuZ2UgbW9kZSB0byBvcGVuIGxvb3AsIGZ1bGwgb2ZmLlxuIik7Ci0JCWNvbmZpZyA9IChjb25maWcgJiB+TUFYNjY1MF9DRkdfTU9ERV9NQVNLKQotCQkJIHwgTUFYNjY1MF9DRkdfTU9ERV9PUEVOX0xPT1A7Ci0JCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTUFYNjY1MF9SRUdfREFDLCAyNTUpKSB7Ci0JCQlkZXZfZXJyKGRldiwgIkRBQyB3cml0ZSBlcnJvciwgYWJvcnRpbmcuXG4iKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KLQl9Ci0KIAlpZiAoaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIE1BWDY2NTBfUkVHX0NPTkZJRywgY29uZmlnKSkgewogCQlkZXZfZXJyKGRldiwgIkNvbmZpZyB3cml0ZSBlcnJvciwgYWJvcnRpbmcuXG4iKTsKIAkJcmV0dXJuIGVycjsKQEAgLTY0NCw2ICs2ODYsMTIgQEAKIAlkYXRhLT5jb25maWcgPSBjb25maWc7CiAJZGF0YS0+Y291bnQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNQVg2NjUwX1JFR19DT1VOVCk7CiAKKwlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKGNsaWVudC0+ZGV2Lm9mX25vZGUsICJtYXhpbSxmYW4tdGFyZ2V0LXJwbSIsCisJCQkJICAmdGFyZ2V0X3JwbSkpIHsKKwkJbWF4NjY1MF9zZXRfdGFyZ2V0KGRhdGEsIHRhcmdldF9ycG0pOworCQltYXg2NjUwX3NldF9vcGVyYXRpbmdfbW9kZShkYXRhLCBNQVg2NjUwX0NGR19NT0RFX0NMT1NFRF9MT09QKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjUxLDYgKzY5OSw4IEBACiAJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZCA9CisJCW9mX21hdGNoX2RldmljZShvZl9tYXRjaF9wdHIobWF4NjY1MF9kdF9tYXRjaCksIGRldik7CiAJc3RydWN0IG1heDY2NTBfZGF0YSAqZGF0YTsKIAlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CiAJaW50IGVycjsKQEAgLTY2MSw3ICs3MTEsNyBAQAogCiAJZGF0YS0+Y2xpZW50ID0gY2xpZW50OwogCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlkYXRhLT5ucl9mYW5zID0gaWQtPmRyaXZlcl9kYXRhOworCWRhdGEtPm5yX2ZhbnMgPSBvZl9pZCA/IChpbnQpKHVpbnRwdHJfdClvZl9pZC0+ZGF0YSA6IGlkLT5kcml2ZXJfZGF0YTsKIAogCS8qCiAJICogSW5pdGlhbGl6ZSB0aGUgbWF4NjY1MCBjaGlwCkBAIC02OTEsNiArNzQxLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtYXg2NjUwX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZQk9ICJtYXg2NjUwIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKG1heDY2NTBfZHRfbWF0Y2gpLAogCX0sCiAJLnByb2JlCQk9IG1heDY2NTBfcHJvYmUsCiAJLmlkX3RhYmxlCT0gbWF4NjY1MF9pZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbmN0Njc3NS5jIGIvZHJpdmVycy9od21vbi9uY3Q2Nzc1LmMKaW5kZXggZDA4N2E4ZS4uY2U3NWRkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9uY3Q2Nzc1LmMKKysrIGIvZHJpdmVycy9od21vbi9uY3Q2Nzc1LmMKQEAgLTE5NSw2ICsxOTUsOCBAQAogCiAjZGVmaW5lIE5VTV9GQU4JCTYKIAorI2RlZmluZSBURU1QX1NPVVJDRV9WSVJUVUFMCTB4MWYKKwogLyogQ29tbW9uIGFuZCBOQ1Q2Nzc1IHNwZWNpZmljIGRhdGEgKi8KIAogLyogVm9sdGFnZSBtaW4vbWF4IHJlZ2lzdGVycyBmb3IgbnI9Ny4uMTQgYXJlIGluIGJhbmsgNSAqLwpAQCAtMzk0MCw3ICszOTQyLDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCXNyYyA9IG5jdDY3NzVfcmVhZF92YWx1ZShkYXRhLCBkYXRhLT5SRUdfVEVNUF9TRUxbaV0pICYgMHgxZjsKLQkJaWYgKCFzcmMgfHwgKG1hc2sgJiAoMSA8PCBzcmMpKSkKKwkJaWYgKCFzcmMpCiAJCQljb250aW51ZTsKIAogCQlpZiAoc3JjID49IGRhdGEtPnRlbXBfbGFiZWxfbnVtIHx8CkBAIC0zOTUyLDcgKzM5NTQsMTYgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJbWFzayB8PSAxIDw8IHNyYzsKKwkJLyoKKwkJICogRm9yIHZpcnR1YWwgdGVtcGVyYXR1cmUgc291cmNlcywgdGhlICd2aXJ0dWFsJyB0ZW1wZXJhdHVyZQorCQkgKiBmb3IgZWFjaCBmYW4gcmVmbGVjdHMgYSBkaWZmZXJlbnQgdGVtcGVyYXR1cmUsIGFuZCB0aGVyZQorCQkgKiBhcmUgbm8gZHVwbGljYXRlcy4KKwkJICovCisJCWlmIChzcmMgIT0gVEVNUF9TT1VSQ0VfVklSVFVBTCkgeworCQkJaWYgKG1hc2sgJiAoMSA8PCBzcmMpKQorCQkJCWNvbnRpbnVlOworCQkJbWFzayB8PSAxIDw8IHNyYzsKKwkJfQogCiAJCS8qIFVzZSBmaXhlZCBpbmRleCBmb3IgU1lTVElOKDEpLCBDUFVUSU4oMiksIEFVWFRJTigzKSAqLwogCQlpZiAoc3JjIDw9IGRhdGEtPnRlbXBfZml4ZWRfbnVtKSB7CkBAIC00MjMyLDExICs0MjQzLDExIEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWlmIChmb3JjZV9pZCkKKwl2YWwgPSAoc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPX1JFR19ERVZJRCkgPDwgOCkgfAorCQlzdXBlcmlvX2luYihzaW9hZGRyLCBTSU9fUkVHX0RFVklEICsgMSk7CisJaWYgKGZvcmNlX2lkICYmIHZhbCAhPSAweGZmZmYpCiAJCXZhbCA9IGZvcmNlX2lkOwotCWVsc2UKLQkJdmFsID0gKHN1cGVyaW9faW5iKHNpb2FkZHIsIFNJT19SRUdfREVWSUQpIDw8IDgpCi0JCSAgICB8IHN1cGVyaW9faW5iKHNpb2FkZHIsIFNJT19SRUdfREVWSUQgKyAxKTsKKwogCXN3aXRjaCAodmFsICYgU0lPX0lEX01BU0spIHsKIAljYXNlIFNJT19OQ1Q2MTA2X0lEOgogCQlzaW9fZGF0YS0+a2luZCA9IG5jdDYxMDY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL25jdDc5MDQuYyBiL2RyaXZlcnMvaHdtb24vbmN0NzkwNC5jCmluZGV4IDA4ZmY4OWQuLjk1YTY4YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbmN0NzkwNC5jCisrKyBiL2RyaXZlcnMvaHdtb24vbmN0NzkwNC5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9od21vbi5oPgotI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CiAKICNkZWZpbmUgVkVORE9SX0lEX1JFRwkJMHg3QQkvKiBBbnkgYmFuayAqLwogI2RlZmluZSBOVVZPVE9OX0lECQkweDUwCkBAIC0xNTMsMzQxICsxNTIsMjMwIEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyogRkFOSU4gQVRUUiAqLwotc3RhdGljIHNzaXplX3Qgc2hvd19mYW4oc3RydWN0IGRldmljZSAqZGV2LAotCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgbmN0NzkwNF9yZWFkX2ZhbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwKKwkJCSAgICBsb25nICp2YWwpCiB7Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKIAlzdHJ1Y3QgbmN0NzkwNF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IGNudCwgcnBtOwogCWludCByZXQ7Ci0JdW5zaWduZWQgY250LCBycG07CiAKLQlyZXQgPSBuY3Q3OTA0X3JlYWRfcmVnMTYoZGF0YSwgQkFOS18wLCBGQU5JTjFfSFZfUkVHICsgaW5kZXggKiAyKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQljbnQgPSAoKHJldCAmIDB4ZmYwMCkgPj4gMykgfCAocmV0ICYgMHgxZik7Ci0JaWYgKGNudCA9PSAweDFmZmYpCi0JCXJwbSA9IDA7Ci0JZWxzZQotCQlycG0gPSAxMzUwMDAwIC8gY250OwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBycG0pOworCXN3aXRjaChhdHRyKSB7CisJY2FzZSBod21vbl9mYW5faW5wdXQ6CisJCXJldCA9IG5jdDc5MDRfcmVhZF9yZWcxNihkYXRhLCBCQU5LXzAsCisJCQkJCSBGQU5JTjFfSFZfUkVHICsgY2hhbm5lbCAqIDIpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCWNudCA9ICgocmV0ICYgMHhmZjAwKSA+PiAzKSB8IChyZXQgJiAweDFmKTsKKwkJaWYgKGNudCA9PSAweDFmZmYpCisJCQlycG0gPSAwOworCQllbHNlCisJCQlycG0gPSAxMzUwMDAwIC8gY250OworCQkqdmFsID0gcnBtOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQogfQogCi1zdGF0aWMgdW1vZGVfdCBuY3Q3OTA0X2ZhbmluX2lzX3Zpc2libGUoc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCQkJCXN0cnVjdCBhdHRyaWJ1dGUgKmEsIGludCBuKQorc3RhdGljIHVtb2RlX3QgbmN0NzkwNF9mYW5faXNfdmlzaWJsZShjb25zdCB2b2lkICpfZGF0YSwgdTMyIGF0dHIsIGludCBjaGFubmVsKQogewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKLQlzdHJ1Y3QgbmN0NzkwNF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJY29uc3Qgc3RydWN0IG5jdDc5MDRfZGF0YSAqZGF0YSA9IF9kYXRhOwogCi0JaWYgKGRhdGEtPmZhbmluX21hc2sgJiAoMSA8PCBuKSkKLQkJcmV0dXJuIGEtPm1vZGU7CisJaWYgKGF0dHIgPT0gaHdtb25fZmFuX2lucHV0ICYmIGRhdGEtPmZhbmluX21hc2sgJiAoMSA8PCBjaGFubmVsKSkKKwkJcmV0dXJuIFNfSVJVR087CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMV9pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4yX2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgMSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjNfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCAyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuNF9pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDMpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW41X2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgNCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjZfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCA1KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuN19pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDYpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW44X2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgNyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjlfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCA4KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMTBfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCA5KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMTFfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCAxMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjEyX2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgMTEpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbmN0NzkwNF9mYW5pbl9hdHRyc1tdID0gewotCSZzZW5zb3JfZGV2X2F0dHJfZmFuMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuM19pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuNV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuNl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuN19pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuOF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuOV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuMTBfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjExX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4xMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCU5VTEwKK3N0YXRpYyB1OCBuY3Q3OTA0X2NoYW5fdG9faW5kZXhbXSA9IHsKKwkwLAkvKiBOb3QgdXNlZCAqLworCTAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCisJMTgsIDE5LCAyMCwgMTYKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG5jdDc5MDRfZmFuaW5fZ3JvdXAgPSB7Ci0JLmF0dHJzID0gbmN0NzkwNF9mYW5pbl9hdHRycywKLQkuaXNfdmlzaWJsZSA9IG5jdDc5MDRfZmFuaW5faXNfdmlzaWJsZSwKLX07Ci0KLS8qIFZTRU4gQVRUUiAqLwotc3RhdGljIHNzaXplX3Qgc2hvd192b2x0YWdlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQorc3RhdGljIGludCBuY3Q3OTA0X3JlYWRfaW4oc3RydWN0IGRldmljZSAqZGV2LCB1MzIgYXR0ciwgaW50IGNoYW5uZWwsCisJCQkgICBsb25nICp2YWwpCiB7Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKIAlzdHJ1Y3QgbmN0NzkwNF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IHJldDsKLQlpbnQgdm9sdDsKKwlpbnQgcmV0LCB2b2x0LCBpbmRleDsKIAotCXJldCA9IG5jdDc5MDRfcmVhZF9yZWcxNihkYXRhLCBCQU5LXzAsIFZTRU4xX0hWX1JFRyArIGluZGV4ICogMik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0Jdm9sdCA9ICgocmV0ICYgMHhmZjAwKSA+PiA1KSB8IChyZXQgJiAweDcpOwotCWlmIChpbmRleCA8IDE0KQotCQl2b2x0ICo9IDI7IC8qIDAuMDAyViBzY2FsZSAqLwotCWVsc2UKLQkJdm9sdCAqPSA2OyAvKiAwLjAwNlYgc2NhbGUgKi8KKwlpbmRleCA9IG5jdDc5MDRfY2hhbl90b19pbmRleFtjaGFubmVsXTsKIAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2b2x0KTsKKwlzd2l0Y2goYXR0cikgeworCWNhc2UgaHdtb25faW5faW5wdXQ6CisJCXJldCA9IG5jdDc5MDRfcmVhZF9yZWcxNihkYXRhLCBCQU5LXzAsCisJCQkJCSBWU0VOMV9IVl9SRUcgKyBpbmRleCAqIDIpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXZvbHQgPSAoKHJldCAmIDB4ZmYwMCkgPj4gNSkgfCAocmV0ICYgMHg3KTsKKwkJaWYgKGluZGV4IDwgMTQpCisJCQl2b2x0ICo9IDI7IC8qIDAuMDAyViBzY2FsZSAqLworCQllbHNlCisJCQl2b2x0ICo9IDY7IC8qIDAuMDA2ViBzY2FsZSAqLworCQkqdmFsID0gdm9sdDsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19sdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCitzdGF0aWMgdW1vZGVfdCBuY3Q3OTA0X2luX2lzX3Zpc2libGUoY29uc3Qgdm9pZCAqX2RhdGEsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCkKIHsKLQlzdHJ1Y3QgbmN0NzkwNF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IHJldDsKLQlpbnQgdGVtcDsKKwljb25zdCBzdHJ1Y3QgbmN0NzkwNF9kYXRhICpkYXRhID0gX2RhdGE7CisJaW50IGluZGV4ID0gbmN0NzkwNF9jaGFuX3RvX2luZGV4W2NoYW5uZWxdOwogCi0JcmV0ID0gbmN0NzkwNF9yZWFkX3JlZzE2KGRhdGEsIEJBTktfMCwgTFREX0hWX1JFRyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JdGVtcCA9ICgocmV0ICYgMHhmZjAwKSA+PiA1KSB8IChyZXQgJiAweDcpOwotCXRlbXAgPSBzaWduX2V4dGVuZDMyKHRlbXAsIDEwKSAqIDEyNTsKKwlpZiAoY2hhbm5lbCA+IDAgJiYgYXR0ciA9PSBod21vbl9pbl9pbnB1dCAmJgorCSAgICAoZGF0YS0+dnNlbl9tYXNrICYgQklUKGluZGV4KSkpCisJCXJldHVybiBTX0lSVUdPOwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRlbXApOwotfQotCi1zdGF0aWMgdW1vZGVfdCBuY3Q3OTA0X3ZzZW5faXNfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkgICAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYSwgaW50IG4pCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOwotCXN0cnVjdCBuY3Q3OTA0X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCWlmIChkYXRhLT52c2VuX21hc2sgJiAoMSA8PCBuKSkKLQkJcmV0dXJuIGEtPm1vZGU7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xX2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIDApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjJfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgMSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluM19pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCAyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW40X2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIDMpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjVfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgNCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluNl9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCA1KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW43X2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIDYpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjhfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgNyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluOV9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCA4KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xMF9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCA5KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xMV9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCAxMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMTJfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgMTEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjEzX2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIDEyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xNF9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCAxMyk7Ci0vKgotICogTmV4dCAzIHZvbHRhZ2Ugc2Vuc29ycyBoYXZlIHNwZWNpZmljIG5hbWVzIGluIHRoZSBOdXZvdG9uIGRvYwotICogKDNWREQsIFZCQVQsIDNWU0IpIGJ1dCB3ZSB1c2UgdmFjYW50IG51bWJlcnMgZm9yIHRoZW0uCi0gKi8KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xNV9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCAxNCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMTZfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgMTUpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjIwX2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIDE2KTsKLS8qIFRoaXMgaXMgbm90IGEgdm9sdGFnZSwgYnV0IGEgbG9jYWwgdGVtcGVyYXR1cmUgc2Vuc29yLiAqLwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd19sdGVtcCwgTlVMTCwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMTdfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgMTgpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjE4X2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIDE5KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xOV9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCAyMCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpuY3Q3OTA0X3ZzZW5fYXR0cnNbXSA9IHsKLQkmc2Vuc29yX2Rldl9hdHRyX2luMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW4yX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW41X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjZfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luN19pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW44X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjlfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luMTBfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luMTFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luMTJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luMTNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luMTRfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luMTVfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luMTZfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luMjBfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjE3X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjE4X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjE5X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JTlVMTAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbmN0NzkwNF92c2VuX2dyb3VwID0gewotCS5hdHRycyA9IG5jdDc5MDRfdnNlbl9hdHRycywKLQkuaXNfdmlzaWJsZSA9IG5jdDc5MDRfdnNlbl9pc192aXNpYmxlLAotfTsKLQotLyogQ1BVX1RFTVAgQVRUUiAqLwotc3RhdGljIHNzaXplX3Qgc2hvd190Y3B1KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQorc3RhdGljIGludCBuY3Q3OTA0X3JlYWRfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwKKwkJCSAgICAgbG9uZyAqdmFsKQogewotCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CiAJc3RydWN0IG5jdDc5MDRfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCByZXQ7Ci0JaW50IHRlbXA7CisJaW50IHJldCwgdGVtcDsKIAotCXJldCA9IG5jdDc5MDRfcmVhZF9yZWcxNihkYXRhLCBCQU5LXzAsIFRfQ1BVMV9IVl9SRUcgKyBpbmRleCAqIDIpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JdGVtcCA9ICgocmV0ICYgMHhmZjAwKSA+PiA1KSB8IChyZXQgJiAweDcpOwotCXRlbXAgPSBzaWduX2V4dGVuZDMyKHRlbXAsIDEwKSAqIDEyNTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdGVtcCk7CisJc3dpdGNoKGF0dHIpIHsKKwljYXNlIGh3bW9uX3RlbXBfaW5wdXQ6CisJCWlmIChjaGFubmVsID09IDApCisJCQlyZXQgPSBuY3Q3OTA0X3JlYWRfcmVnMTYoZGF0YSwgQkFOS18wLCBMVERfSFZfUkVHKTsKKwkJZWxzZQorCQkJcmV0ID0gbmN0NzkwNF9yZWFkX3JlZzE2KGRhdGEsIEJBTktfMCwKKwkJCQkJVF9DUFUxX0hWX1JFRyArIChjaGFubmVsIC0gMSkgKiAyKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQl0ZW1wID0gKChyZXQgJiAweGZmMDApID4+IDUpIHwgKHJldCAmIDB4Nyk7CisJCSp2YWwgPSBzaWduX2V4dGVuZDMyKHRlbXAsIDEwKSAqIDEyNTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIH0KIAotc3RhdGljIHVtb2RlX3QgbmN0NzkwNF90Y3B1X2lzX3Zpc2libGUoc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCQkJICAgICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmEsIGludCBuKQorc3RhdGljIHVtb2RlX3QgbmN0NzkwNF90ZW1wX2lzX3Zpc2libGUoY29uc3Qgdm9pZCAqX2RhdGEsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCkKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7Ci0Jc3RydWN0IG5jdDc5MDRfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWNvbnN0IHN0cnVjdCBuY3Q3OTA0X2RhdGEgKmRhdGEgPSBfZGF0YTsKIAotCWlmIChkYXRhLT50Y3B1X21hc2sgJiAoMSA8PCBuKSkKLQkJcmV0dXJuIGEtPm1vZGU7CisJaWYgKGF0dHIgPT0gaHdtb25fdGVtcF9pbnB1dCkgeworCQlpZiAoY2hhbm5lbCA9PSAwKSB7CisJCQlpZiAoZGF0YS0+dnNlbl9tYXNrICYgQklUKDE3KSkKKwkJCQlyZXR1cm4gU19JUlVHTzsKKwkJfSBlbHNlIHsKKwkJCWlmIChkYXRhLT50Y3B1X21hc2sgJiBCSVQoY2hhbm5lbCAtIDEpKQorCQkJCXJldHVybiBTX0lSVUdPOworCQl9CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKLS8qICJ0ZW1wMV9pbnB1dCIgcmVzZXJ2ZWQgZm9yIGxvY2FsIHRlbXAgKi8KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfaW5wdXQsIFNfSVJVR08sIHNob3dfdGNwdSwgTlVMTCwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2lucHV0LCBTX0lSVUdPLCBzaG93X3RjcHUsIE5VTEwsIDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNF9pbnB1dCwgU19JUlVHTywgc2hvd190Y3B1LCBOVUxMLCAyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDVfaW5wdXQsIFNfSVJVR08sIHNob3dfdGNwdSwgTlVMTCwgMyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA2X2lucHV0LCBTX0lSVUdPLCBzaG93X3RjcHUsIE5VTEwsIDQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wN19pbnB1dCwgU19JUlVHTywgc2hvd190Y3B1LCBOVUxMLCA1KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDhfaW5wdXQsIFNfSVJVR08sIHNob3dfdGNwdSwgTlVMTCwgNik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA5X2lucHV0LCBTX0lSVUdPLCBzaG93X3RjcHUsIE5VTEwsIDcpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbmN0NzkwNF90Y3B1X2F0dHJzW10gPSB7Ci0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXA0X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wNV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDZfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXA3X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wOF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDlfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQlOVUxMCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBuY3Q3OTA0X3RjcHVfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gbmN0NzkwNF90Y3B1X2F0dHJzLAotCS5pc192aXNpYmxlID0gbmN0NzkwNF90Y3B1X2lzX3Zpc2libGUsCi19OwotCi0vKiBQV00gQVRUUiAqLwotc3RhdGljIHNzaXplX3Qgc3RvcmVfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCi0JCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgaW50IG5jdDc5MDRfcmVhZF9wd20oc3RydWN0IGRldmljZSAqZGV2LCB1MzIgYXR0ciwgaW50IGNoYW5uZWwsCisJCQkgICAgbG9uZyAqdmFsKQogewotCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CiAJc3RydWN0IG5jdDc5MDRfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXVuc2lnbmVkIGxvbmcgdmFsOwogCWludCByZXQ7CiAKLQlpZiAoa3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAodmFsID4gMjU1KQotCQlyZXR1cm4gLUVJTlZBTDsKKwlzd2l0Y2goYXR0cikgeworCWNhc2UgaHdtb25fcHdtX2lucHV0OgorCQlyZXQgPSBuY3Q3OTA0X3JlYWRfcmVnKGRhdGEsIEJBTktfMywgRkFOQ1RMMV9PVVRfUkVHICsgY2hhbm5lbCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJKnZhbCA9IHJldDsKKwkJcmV0dXJuIDA7CisJY2FzZSBod21vbl9wd21fZW5hYmxlOgorCQlyZXQgPSBuY3Q3OTA0X3JlYWRfcmVnKGRhdGEsIEJBTktfMywgRkFOQ1RMMV9GTVJfUkVHICsgY2hhbm5lbCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKIAotCXJldCA9IG5jdDc5MDRfd3JpdGVfcmVnKGRhdGEsIEJBTktfMywgRkFOQ1RMMV9PVVRfUkVHICsgaW5kZXgsIHZhbCk7Ci0KLQlyZXR1cm4gcmV0ID8gcmV0IDogY291bnQ7CisJCSp2YWwgPSByZXQgPyAyIDogMTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19wd20oc3RydWN0IGRldmljZSAqZGV2LAotCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgbmN0NzkwNF93cml0ZV9wd20oc3RydWN0IGRldmljZSAqZGV2LCB1MzIgYXR0ciwgaW50IGNoYW5uZWwsCisJCQkgICAgIGxvbmcgdmFsKQogewotCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CiAJc3RydWN0IG5jdDc5MDRfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCB2YWw7Ci0KLQl2YWwgPSBuY3Q3OTA0X3JlYWRfcmVnKGRhdGEsIEJBTktfMywgRkFOQ1RMMV9PVVRfUkVHICsgaW5kZXgpOwotCWlmICh2YWwgPCAwKQotCQlyZXR1cm4gdmFsOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHN0b3JlX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCi0JCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKLQlzdHJ1Y3QgbmN0NzkwNF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JdW5zaWduZWQgbG9uZyB2YWw7CiAJaW50IHJldDsKIAotCWlmIChrc3RydG91bChidWYsIDEwLCAmdmFsKSA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICh2YWwgPCAxIHx8IHZhbCA+IDIgfHwgKHZhbCA9PSAyICYmICFkYXRhLT5mYW5fbW9kZVtpbmRleF0pKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldCA9IG5jdDc5MDRfd3JpdGVfcmVnKGRhdGEsIEJBTktfMywgRkFOQ1RMMV9GTVJfUkVHICsgaW5kZXgsCi0JCQkJdmFsID09IDIgPyBkYXRhLT5mYW5fbW9kZVtpbmRleF0gOiAwKTsKLQotCXJldHVybiByZXQgPyByZXQgOiBjb3VudDsKKwlzd2l0Y2goYXR0cikgeworCWNhc2UgaHdtb25fcHdtX2lucHV0OgorCQlpZiAodmFsIDwgMCB8fCB2YWwgPiAyNTUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0ID0gbmN0NzkwNF93cml0ZV9yZWcoZGF0YSwgQkFOS18zLCBGQU5DVEwxX09VVF9SRUcgKyBjaGFubmVsLAorCQkJCQl2YWwpOworCQlyZXR1cm4gcmV0OworCWNhc2UgaHdtb25fcHdtX2VuYWJsZToKKwkJaWYgKHZhbCA8IDEgfHwgdmFsID4gMiB8fAorCQkgICAgKHZhbCA9PSAyICYmICFkYXRhLT5mYW5fbW9kZVtjaGFubmVsXSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0ID0gbmN0NzkwNF93cml0ZV9yZWcoZGF0YSwgQkFOS18zLCBGQU5DVEwxX0ZNUl9SRUcgKyBjaGFubmVsLAorCQkJCQl2YWwgPT0gMiA/IGRhdGEtPmZhbl9tb2RlW2NoYW5uZWxdIDogMCk7CisJCXJldHVybiByZXQ7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIH0KIAotLyogUmV0dXJuIDEgZm9yIG1hbnVhbCBtb2RlIG9yIDIgZm9yIFNtYXJ0RmFuIG1vZGUgKi8KLXN0YXRpYyBzc2l6ZV90IHNob3dfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCitzdGF0aWMgdW1vZGVfdCBuY3Q3OTA0X3B3bV9pc192aXNpYmxlKGNvbnN0IHZvaWQgKl9kYXRhLCB1MzIgYXR0ciwgaW50IGNoYW5uZWwpCiB7Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKLQlzdHJ1Y3QgbmN0NzkwNF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IHZhbDsKLQotCXZhbCA9IG5jdDc5MDRfcmVhZF9yZWcoZGF0YSwgQkFOS18zLCBGQU5DVEwxX0ZNUl9SRUcgKyBpbmRleCk7Ci0JaWYgKHZhbCA8IDApCi0JCXJldHVybiB2YWw7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsID8gMiA6IDEpOworCXN3aXRjaChhdHRyKSB7CisJY2FzZSBod21vbl9wd21faW5wdXQ6CisJY2FzZSBod21vbl9wd21fZW5hYmxlOgorCQlyZXR1cm4gU19JUlVHTyB8IFNfSVdVU1I7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQogfQogCi0vKiAyIGF0dHJpYnV0ZXMgcGVyIGNoYW5uZWw6IHB3bSBhbmQgbW9kZSAqLwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd20xLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJCXNob3dfcHdtLCBzdG9yZV9wd20sIDApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd20xX2VuYWJsZSwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCQlzaG93X2VuYWJsZSwgc3RvcmVfZW5hYmxlLCAwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMiwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCQlzaG93X3B3bSwgc3RvcmVfcHdtLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMl9lbmFibGUsIFNfSVJVR08gfCBTX0lXVVNSLAotCQkJc2hvd19lbmFibGUsIHN0b3JlX2VuYWJsZSwgMSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTMsIFNfSVJVR08gfCBTX0lXVVNSLAotCQkJc2hvd19wd20sIHN0b3JlX3B3bSwgMik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTNfZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJCXNob3dfZW5hYmxlLCBzdG9yZV9lbmFibGUsIDIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd200LCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJCXNob3dfcHdtLCBzdG9yZV9wd20sIDMpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd200X2VuYWJsZSwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCQlzaG93X2VuYWJsZSwgc3RvcmVfZW5hYmxlLCAzKTsKK3N0YXRpYyBpbnQgbmN0NzkwNF9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJCXUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyAqdmFsKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgaHdtb25faW46CisJCXJldHVybiBuY3Q3OTA0X3JlYWRfaW4oZGV2LCBhdHRyLCBjaGFubmVsLCB2YWwpOworCWNhc2UgaHdtb25fZmFuOgorCQlyZXR1cm4gbmN0NzkwNF9yZWFkX2ZhbihkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJY2FzZSBod21vbl9wd206CisJCXJldHVybiBuY3Q3OTA0X3JlYWRfcHdtKGRldiwgYXR0ciwgY2hhbm5lbCwgdmFsKTsKKwljYXNlIGh3bW9uX3RlbXA6CisJCXJldHVybiBuY3Q3OTA0X3JlYWRfdGVtcChkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KIAotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm5jdDc5MDRfZmFuY3RsX2F0dHJzW10gPSB7Ci0JJnNlbnNvcl9kZXZfYXR0cl9wd20xLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9wd20xX2VuYWJsZS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtMi5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtMl9lbmFibGUuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3B3bTMuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3B3bTNfZW5hYmxlLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9wd200LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9wd200X2VuYWJsZS5kZXZfYXR0ci5hdHRyLAotCU5VTEwKLX07CitzdGF0aWMgaW50IG5jdDc5MDRfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkJIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyB2YWwpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBod21vbl9wd206CisJCXJldHVybiBuY3Q3OTA0X3dyaXRlX3B3bShkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbmN0NzkwNF9mYW5jdGxfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gbmN0NzkwNF9mYW5jdGxfYXR0cnMsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqbmN0NzkwNF9ncm91cHNbXSA9IHsKLQkmbmN0NzkwNF9mYW5pbl9ncm91cCwKLQkmbmN0NzkwNF92c2VuX2dyb3VwLAotCSZuY3Q3OTA0X3RjcHVfZ3JvdXAsCi0JJm5jdDc5MDRfZmFuY3RsX2dyb3VwLAotCU5VTEwKLX07CitzdGF0aWMgdW1vZGVfdCBuY3Q3OTA0X2lzX3Zpc2libGUoY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQkJICB1MzIgYXR0ciwgaW50IGNoYW5uZWwpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBod21vbl9pbjoKKwkJcmV0dXJuIG5jdDc5MDRfaW5faXNfdmlzaWJsZShkYXRhLCBhdHRyLCBjaGFubmVsKTsKKwljYXNlIGh3bW9uX2ZhbjoKKwkJcmV0dXJuIG5jdDc5MDRfZmFuX2lzX3Zpc2libGUoZGF0YSwgYXR0ciwgY2hhbm5lbCk7CisJY2FzZSBod21vbl9wd206CisJCXJldHVybiBuY3Q3OTA0X3B3bV9pc192aXNpYmxlKGRhdGEsIGF0dHIsIGNoYW5uZWwpOworCWNhc2UgaHdtb25fdGVtcDoKKwkJcmV0dXJuIG5jdDc5MDRfdGVtcF9pc192aXNpYmxlKGRhdGEsIGF0dHIsIGNoYW5uZWwpOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KIAogLyogUmV0dXJuIDAgaWYgZGV0ZWN0aW9uIGlzIHN1Y2Nlc3NmdWwsIC1FTk9ERVYgb3RoZXJ3aXNlICovCiBzdGF0aWMgaW50IG5jdDc5MDRfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCkBAIC01MTIsNiArNDAwLDEwMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3QgdTMyIG5jdDc5MDRfaW5fY29uZmlnW10gPSB7CisJSFdNT05fSV9JTlBVVCwgICAgICAgICAgICAgICAgICAvKiBkdW1teSwgc2tpcHBlZCBpbiBpc192aXNpYmxlICovCisJSFdNT05fSV9JTlBVVCwKKwlIV01PTl9JX0lOUFVULAorCUhXTU9OX0lfSU5QVVQsCisJSFdNT05fSV9JTlBVVCwKKwlIV01PTl9JX0lOUFVULAorCUhXTU9OX0lfSU5QVVQsCisJSFdNT05fSV9JTlBVVCwKKwlIV01PTl9JX0lOUFVULAorCUhXTU9OX0lfSU5QVVQsCisJSFdNT05fSV9JTlBVVCwKKwlIV01PTl9JX0lOUFVULAorCUhXTU9OX0lfSU5QVVQsCisJSFdNT05fSV9JTlBVVCwKKwlIV01PTl9JX0lOUFVULAorCUhXTU9OX0lfSU5QVVQsCisJSFdNT05fSV9JTlBVVCwKKwlIV01PTl9JX0lOUFVULAorCUhXTU9OX0lfSU5QVVQsCisJSFdNT05fSV9JTlBVVCwKKwlIV01PTl9JX0lOUFVULAorCTAKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIG5jdDc5MDRfaW4gPSB7CisJLnR5cGUgPSBod21vbl9pbiwKKwkuY29uZmlnID0gbmN0NzkwNF9pbl9jb25maWcsCit9OworCitzdGF0aWMgY29uc3QgdTMyIG5jdDc5MDRfZmFuX2NvbmZpZ1tdID0geworICAgICAgICAgICAgSFdNT05fRl9JTlBVVCwKKyAgICAgICAgICAgIEhXTU9OX0ZfSU5QVVQsCisgICAgICAgICAgICBIV01PTl9GX0lOUFVULAorICAgICAgICAgICAgSFdNT05fRl9JTlBVVCwKKyAgICAgICAgICAgIEhXTU9OX0ZfSU5QVVQsCisgICAgICAgICAgICBIV01PTl9GX0lOUFVULAorICAgICAgICAgICAgSFdNT05fRl9JTlBVVCwKKyAgICAgICAgICAgIEhXTU9OX0ZfSU5QVVQsCisJICAgIDAKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIG5jdDc5MDRfZmFuID0geworCS50eXBlID0gaHdtb25fZmFuLAorCS5jb25maWcgPSBuY3Q3OTA0X2Zhbl9jb25maWcsCit9OworCitzdGF0aWMgY29uc3QgdTMyIG5jdDc5MDRfcHdtX2NvbmZpZ1tdID0geworICAgICAgICAgICAgSFdNT05fUFdNX0lOUFVUIHwgSFdNT05fUFdNX0VOQUJMRSwKKyAgICAgICAgICAgIEhXTU9OX1BXTV9JTlBVVCB8IEhXTU9OX1BXTV9FTkFCTEUsCisgICAgICAgICAgICBIV01PTl9QV01fSU5QVVQgfCBIV01PTl9QV01fRU5BQkxFLAorICAgICAgICAgICAgSFdNT05fUFdNX0lOUFVUIHwgSFdNT05fUFdNX0VOQUJMRSwKKwkgICAgMAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gbmN0NzkwNF9wd20gPSB7CisJLnR5cGUgPSBod21vbl9wd20sCisJLmNvbmZpZyA9IG5jdDc5MDRfcHdtX2NvbmZpZywKK307CisKK3N0YXRpYyBjb25zdCB1MzIgbmN0NzkwNF90ZW1wX2NvbmZpZ1tdID0geworICAgICAgICAgICAgSFdNT05fVF9JTlBVVCwKKyAgICAgICAgICAgIEhXTU9OX1RfSU5QVVQsCisgICAgICAgICAgICBIV01PTl9UX0lOUFVULAorICAgICAgICAgICAgSFdNT05fVF9JTlBVVCwKKyAgICAgICAgICAgIEhXTU9OX1RfSU5QVVQsCisgICAgICAgICAgICBIV01PTl9UX0lOUFVULAorICAgICAgICAgICAgSFdNT05fVF9JTlBVVCwKKyAgICAgICAgICAgIEhXTU9OX1RfSU5QVVQsCisgICAgICAgICAgICBIV01PTl9UX0lOUFVULAorCSAgICAwCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyBuY3Q3OTA0X3RlbXAgPSB7CisJLnR5cGUgPSBod21vbl90ZW1wLAorCS5jb25maWcgPSBuY3Q3OTA0X3RlbXBfY29uZmlnLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gKm5jdDc5MDRfaW5mb1tdID0geworCSZuY3Q3OTA0X2luLAorCSZuY3Q3OTA0X2ZhbiwKKwkmbmN0NzkwNF9wd20sCisJJm5jdDc5MDRfdGVtcCwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX29wcyBuY3Q3OTA0X2h3bW9uX29wcyA9IHsKKwkuaXNfdmlzaWJsZSA9IG5jdDc5MDRfaXNfdmlzaWJsZSwKKwkucmVhZCA9IG5jdDc5MDRfcmVhZCwKKwkud3JpdGUgPSBuY3Q3OTA0X3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGlwX2luZm8gbmN0NzkwNF9jaGlwX2luZm8gPSB7CisJLm9wcyA9ICZuY3Q3OTA0X2h3bW9uX29wcywKKwkuaW5mbyA9IG5jdDc5MDRfaW5mbywKK307CisKIHN0YXRpYyBpbnQgbmN0NzkwNF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKQEAgLTU2Niw4ICs1NTEsOCBAQAogCX0KIAogCWh3bW9uX2RldiA9Ci0JCWRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKGRldiwgY2xpZW50LT5uYW1lLCBkYXRhLAotCQkJCQkJICAgICAgIG5jdDc5MDRfZ3JvdXBzKTsKKwkJZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvKGRldiwgY2xpZW50LT5uYW1lLCBkYXRhLAorCQkJCQkJICAgICAmbmN0NzkwNF9jaGlwX2luZm8sIE5VTEwpOwogCXJldHVybiBQVFJfRVJSX09SX1pFUk8oaHdtb25fZGV2KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9udGNfdGhlcm1pc3Rvci5jIGIvZHJpdmVycy9od21vbi9udGNfdGhlcm1pc3Rvci5jCmluZGV4IDhlZjdiNzEuLmM1MmQwN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbnRjX3RoZXJtaXN0b3IuYworKysgYi9kcml2ZXJzL2h3bW9uL250Y190aGVybWlzdG9yLmMKQEAgLTI1MywxMiArMjUzLDkgQEAKIH07CiAKIHN0cnVjdCBudGNfZGF0YSB7Ci0Jc3RydWN0IGRldmljZSAqaHdtb25fZGV2OwogCXN0cnVjdCBudGNfdGhlcm1pc3Rvcl9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIAljb25zdCBzdHJ1Y3QgbnRjX2NvbXBlbnNhdGlvbiAqY29tcDsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJaW50IG5fY29tcDsKLQljaGFyIG5hbWVbUExBVEZPUk1fTkFNRV9TSVpFXTsKIH07CiAKICNpZiBkZWZpbmVkKENPTkZJR19PRikgJiYgSVNfRU5BQkxFRChDT05GSUdfSUlPKQpAQCAtMzE2LDIyICszMTMsMjIgQEAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG50Y19tYXRjaCk7CiAKIHN0YXRpYyBzdHJ1Y3QgbnRjX3RoZXJtaXN0b3JfcGxhdGZvcm1fZGF0YSAqCi1udGNfdGhlcm1pc3Rvcl9wYXJzZV9kdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorbnRjX3RoZXJtaXN0b3JfcGFyc2VfZHQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBpaW9fY2hhbm5lbCAqY2hhbjsKIAllbnVtIGlpb19jaGFuX3R5cGUgdHlwZTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKIAlzdHJ1Y3QgbnRjX3RoZXJtaXN0b3JfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAJaW50IHJldDsKIAogCWlmICghbnApCiAJCXJldHVybiBOVUxMOwogCi0JcGRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOworCXBkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghcGRhdGEpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCi0JY2hhbiA9IGlpb19jaGFubmVsX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKKwljaGFuID0gZGV2bV9paW9fY2hhbm5lbF9nZXQoZGV2LCBOVUxMKTsKIAlpZiAoSVNfRVJSKGNoYW4pKQogCQlyZXR1cm4gRVJSX0NBU1QoY2hhbik7CiAKQEAgLTM1OSwyMiArMzU2LDE1IEBACiAKIAlyZXR1cm4gcGRhdGE7CiB9Ci1zdGF0aWMgdm9pZCBudGNfaWlvX2NoYW5uZWxfcmVsZWFzZShzdHJ1Y3QgbnRjX3RoZXJtaXN0b3JfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCi17Ci0JaWYgKHBkYXRhLT5jaGFuKQotCQlpaW9fY2hhbm5lbF9yZWxlYXNlKHBkYXRhLT5jaGFuKTsKLX0KICNlbHNlCiBzdGF0aWMgc3RydWN0IG50Y190aGVybWlzdG9yX3BsYXRmb3JtX2RhdGEgKgotbnRjX3RoZXJtaXN0b3JfcGFyc2VfZHQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK250Y190aGVybWlzdG9yX3BhcnNlX2R0KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gTlVMTDsKIH0KIAogI2RlZmluZSBudGNfbWF0Y2gJTlVMTAogCi1zdGF0aWMgdm9pZCBudGNfaWlvX2NoYW5uZWxfcmVsZWFzZShzdHJ1Y3QgbnRjX3RoZXJtaXN0b3JfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCi17IH0KICNlbmRpZgogCiBzdGF0aWMgaW5saW5lIHU2NCBkaXY2NF91NjRfc2FmZSh1NjQgZGl2aWRlbmQsIHU2NCBkaXZpc29yKQpAQCAtNTE2LDkgKzUwNiw4IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBpbnQgbnRjX3JlYWRfdGVtcCh2b2lkICpkZXYsIGludCAqdGVtcCkKK3N0YXRpYyBpbnQgbnRjX3JlYWRfdGVtcCh2b2lkICpkYXRhLCBpbnQgKnRlbXApCiB7Ci0Jc3RydWN0IG50Y19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJaW50IG9obTsKIAogCW9obSA9IG50Y190aGVybWlzdG9yX2dldF9vaG0oZGF0YSk7CkBAIC01MzAsMTQgKzUxOSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IG50Y19zaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBudGNfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGRhdGEtPm5hbWUpOwotfQotCiBzdGF0aWMgc3NpemVfdCBudGNfc2hvd190eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKQEAgLTU1OSwxOCArNTQwLDEzIEBACiAKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfdHlwZSwgU19JUlVHTywgbnRjX3Nob3dfdHlwZSwgTlVMTCwgMCk7CiBzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBudGNfc2hvd190ZW1wLCBOVUxMLCAwKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBudGNfc2hvd19uYW1lLCBOVUxMKTsKIAotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm50Y19hdHRyaWJ1dGVzW10gPSB7Ci0JJmRldl9hdHRyX25hbWUuYXR0ciwKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpudGNfYXR0cnNbXSA9IHsKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX3R5cGUuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCiAJTlVMTCwKIH07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG50Y19hdHRyX2dyb3VwID0gewotCS5hdHRycyA9IG50Y19hdHRyaWJ1dGVzLAotfTsKK0FUVFJJQlVURV9HUk9VUFMobnRjKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB0aGVybWFsX3pvbmVfb2ZfZGV2aWNlX29wcyBudGNfb2ZfdGhlcm1hbF9vcHMgPSB7CiAJLmdldF90ZW1wID0gbnRjX3JlYWRfdGVtcCwKQEAgLTU3OSwzMyArNTU1LDM0IEBACiBzdGF0aWMgaW50IG50Y190aGVybWlzdG9yX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CiAJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQgPQotCQkJb2ZfbWF0Y2hfZGV2aWNlKG9mX21hdGNoX3B0cihudGNfbWF0Y2gpLCAmcGRldi0+ZGV2KTsKKwkJCW9mX21hdGNoX2RldmljZShvZl9tYXRjaF9wdHIobnRjX21hdGNoKSwgZGV2KTsKIAljb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkICpwZGV2X2lkOwogCXN0cnVjdCBudGNfdGhlcm1pc3Rvcl9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CiAJc3RydWN0IG50Y19kYXRhICpkYXRhOwotCWludCByZXQ7CiAKLQlwZGF0YSA9IG50Y190aGVybWlzdG9yX3BhcnNlX2R0KHBkZXYpOworCXBkYXRhID0gbnRjX3RoZXJtaXN0b3JfcGFyc2VfZHQoZGV2KTsKIAlpZiAoSVNfRVJSKHBkYXRhKSkKIAkJcmV0dXJuIFBUUl9FUlIocGRhdGEpOwogCWVsc2UgaWYgKHBkYXRhID09IE5VTEwpCi0JCXBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKKwkJcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7CiAKIAlpZiAoIXBkYXRhKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIHBsYXRmb3JtIGluaXQgZGF0YSBzdXBwbGllZC5cbiIpOworCQlkZXZfZXJyKGRldiwgIk5vIHBsYXRmb3JtIGluaXQgZGF0YSBzdXBwbGllZC5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAkvKiBFaXRoZXIgb25lIG9mIHRoZSB0d28gaXMgcmVxdWlyZWQuICovCiAJaWYgKCFwZGF0YS0+cmVhZF91diAmJiAhcGRhdGEtPnJlYWRfb2htKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJZGV2X2VycihkZXYsCiAJCQkiQm90aCByZWFkX3V2IGFuZCByZWFkX29obSBtaXNzaW5nLiBOZWVkIGVpdGhlciBvbmUgb2YgdGhlIHR3by5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAocGRhdGEtPnJlYWRfdXYgJiYgcGRhdGEtPnJlYWRfb2htKSB7Ci0JCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCWRldl93YXJuKGRldiwKIAkJCSAiT25seSBvbmUgb2YgcmVhZF91diBhbmQgcmVhZF9vaG0gaXMgbmVlZGVkOyBpZ25vcmluZyByZWFkX3V2LlxuIik7CiAJCXBkYXRhLT5yZWFkX3V2ID0gTlVMTDsKIAl9CkBAIC02MTcsMjAgKzU5NCwxNyBAQAogCQkJCSBOVENfQ09OTkVDVEVEX1BPU0lUSVZFKSB8fAogCQkJCShwZGF0YS0+Y29ubmVjdCAhPSBOVENfQ09OTkVDVEVEX1BPU0lUSVZFICYmCiAJCQkJIHBkYXRhLT5jb25uZWN0ICE9IE5UQ19DT05ORUNURURfR1JPVU5EKSkpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJIlJlcXVpcmVkIGRhdGEgdG8gdXNlIHJlYWRfdXYgbm90IHN1cHBsaWVkLlxuIik7CisJCWRldl9lcnIoZGV2LCAiUmVxdWlyZWQgZGF0YSB0byB1c2UgcmVhZF91diBub3Qgc3VwcGxpZWQuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IG50Y19kYXRhKSwgR0ZQX0tFUk5FTCk7CisJZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgbnRjX2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJcGRldl9pZCA9IG9mX2lkID8gb2ZfaWQtPmRhdGEgOiBwbGF0Zm9ybV9nZXRfZGV2aWNlX2lkKHBkZXYpOwogCi0JZGF0YS0+ZGV2ID0gJnBkZXYtPmRldjsKIAlkYXRhLT5wZGF0YSA9IHBkYXRhOwotCXN0cmxjcHkoZGF0YS0+bmFtZSwgcGRldl9pZC0+bmFtZSwgc2l6ZW9mKGRhdGEtPm5hbWUpKTsKIAogCXN3aXRjaCAocGRldl9pZC0+ZHJpdmVyX2RhdGEpIHsKIAljYXNlIFRZUEVfTkNQWFhXQjQ3MzoKQEAgLTY1NCw0OSArNjI4LDI1IEBACiAJCWRhdGEtPm5fY29tcCA9IEFSUkFZX1NJWkUobmNwWFh4aDEwMyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlVua25vd24gZGV2aWNlIHR5cGU6ICVsdSglcylcbiIsCisJCWRldl9lcnIoZGV2LCAiVW5rbm93biBkZXZpY2UgdHlwZTogJWx1KCVzKVxuIiwKIAkJCQlwZGV2X2lkLT5kcml2ZXJfZGF0YSwgcGRldl9pZC0+bmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRhdGEpOwotCi0JcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZkYXRhLT5kZXYtPmtvYmosICZudGNfYXR0cl9ncm91cCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRhdGEtPmRldiwgInVuYWJsZSB0byBjcmVhdGUgc3lzZnMgZmlsZXNcbiIpOwotCQlyZXR1cm4gcmV0OworCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKGRldiwgcGRldl9pZC0+bmFtZSwKKwkJCQkJCQkgICBkYXRhLCBudGNfZ3JvdXBzKTsKKwlpZiAoSVNfRVJSKGh3bW9uX2RldikpIHsKKwkJZGV2X2VycihkZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgYXMgaHdtb24gZGV2aWNlLlxuIik7CisJCXJldHVybiBQVFJfRVJSKGh3bW9uX2Rldik7CiAJfQogCi0JZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKGRhdGEtPmRldik7Ci0JaWYgKElTX0VSUihkYXRhLT5od21vbl9kZXYpKSB7Ci0JCWRldl9lcnIoZGF0YS0+ZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyIGFzIGh3bW9uIGRldmljZS5cbiIpOwotCQlyZXQgPSBQVFJfRVJSKGRhdGEtPmh3bW9uX2Rldik7Ci0JCWdvdG8gZXJyX2FmdGVyX3N5c2ZzOwotCX0KKwlkZXZfaW5mbyhkZXYsICJUaGVybWlzdG9yIHR5cGU6ICVzIHN1Y2Nlc3NmdWxseSBwcm9iZWQuXG4iLAorCQkgcGRldl9pZC0+bmFtZSk7CiAKLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiVGhlcm1pc3RvciB0eXBlOiAlcyBzdWNjZXNzZnVsbHkgcHJvYmVkLlxuIiwKLQkJCQkJCQkJcGRldl9pZC0+bmFtZSk7Ci0KLQl0eiA9IGRldm1fdGhlcm1hbF96b25lX29mX3NlbnNvcl9yZWdpc3RlcihkYXRhLT5kZXYsIDAsIGRhdGEtPmRldiwKKwl0eiA9IGRldm1fdGhlcm1hbF96b25lX29mX3NlbnNvcl9yZWdpc3RlcihkZXYsIDAsIGRhdGEsCiAJCQkJCQkgICZudGNfb2ZfdGhlcm1hbF9vcHMpOwogCWlmIChJU19FUlIodHopKQotCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgdG8gdGhlcm1hbCBmdy5cbiIpOwotCi0JcmV0dXJuIDA7Ci1lcnJfYWZ0ZXJfc3lzZnM6Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZkYXRhLT5kZXYtPmtvYmosICZudGNfYXR0cl9ncm91cCk7Ci0JbnRjX2lpb19jaGFubmVsX3JlbGVhc2UocGRhdGEpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbnRjX3RoZXJtaXN0b3JfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IG50Y19kYXRhICpkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IG50Y190aGVybWlzdG9yX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGF0YS0+cGRhdGE7Ci0KLQlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGF0YS0+ZGV2LT5rb2JqLCAmbnRjX2F0dHJfZ3JvdXApOwotCW50Y19paW9fY2hhbm5lbF9yZWxlYXNlKHBkYXRhKTsKKwkJZGV2X2RiZyhkZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgdG8gdGhlcm1hbCBmdy5cbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03MDcsNyArNjU3LDYgQEAKIAkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKG50Y19tYXRjaCksCiAJfSwKIAkucHJvYmUgPSBudGNfdGhlcm1pc3Rvcl9wcm9iZSwKLQkucmVtb3ZlID0gbnRjX3RoZXJtaXN0b3JfcmVtb3ZlLAogCS5pZF90YWJsZSA9IG50Y190aGVybWlzdG9yX2lkLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9wbWJ1cy9LY29uZmlnIGIvZHJpdmVycy9od21vbi9wbWJ1cy9LY29uZmlnCmluZGV4IDA1NGQzZDguLmNhZDEyMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vcG1idXMvS2NvbmZpZworKysgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL0tjb25maWcKQEAgLTEyNiwxMiArMTI2LDEyIEBACiAJICBiZSBjYWxsZWQgdHBzNDA0MjIuCiAKIGNvbmZpZyBTRU5TT1JTX1VDRDkwMDAKLQl0cmlzdGF0ZSAiVEkgVUNEOTAxMjAsIFVDRDkwMTI0LCBVQ0Q5MDkwLCBVQ0Q5MDkxMCIKKwl0cmlzdGF0ZSAiVEkgVUNEOTAxMjAsIFVDRDkwMTI0LCBVQ0Q5MDE2MCwgVUNEOTA5MCwgVUNEOTA5MTAiCiAJZGVmYXVsdCBuCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IGhhcmR3YXJlIG1vbml0b3Jpbmcgc3VwcG9ydCBmb3IgVEkKLQkgIFVDRDkwMTIwLCBVQ0Q5MDEyNCwgVUNEOTA5MCwgVUNEOTA5MTAgU2VxdWVuY2VyIGFuZCBTeXN0ZW0gSGVhbHRoCi0JICBDb250cm9sbGVycy4KKwkgIFVDRDkwMTIwLCBVQ0Q5MDEyNCwgVUNEOTAxNjAsIFVDRDkwOTAsIFVDRDkwOTEwLCBTZXF1ZW5jZXIgYW5kIFN5c3RlbQorCSAgSGVhbHRoIENvbnRyb2xsZXJzLgogCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAogCSAgYmUgY2FsbGVkIHVjZDkwMDAuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3BtYnVzL3BtYnVzLmMgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL3BtYnVzLmMKaW5kZXggMGE3NDk5MS4uNDRjYThhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9wbWJ1cy9wbWJ1cy5jCisrKyBiL2RyaXZlcnMvaHdtb24vcG1idXMvcG1idXMuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy9wbWJ1cy5oPgogI2luY2x1ZGUgInBtYnVzLmgiCiAKIC8qCkBAIC0xNjcsMTQgKzE2OCwyNiBAQAogCQkgICAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBwbWJ1c19kcml2ZXJfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgcG1idXNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBOVUxMOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKIAotCWluZm8gPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2Yoc3RydWN0IHBtYnVzX2RyaXZlcl9pbmZvKSwKLQkJCSAgICBHRlBfS0VSTkVMKTsKKwlpbmZvID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBwbWJ1c19kcml2ZXJfaW5mbyksIEdGUF9LRVJORUwpOwogCWlmICghaW5mbykKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlpZiAoIXN0cmNtcChpZC0+bmFtZSwgImRwczQ2MCIpIHx8ICFzdHJjbXAoaWQtPm5hbWUsICJkcHM4MDAiKSB8fAorCSAgICAhc3RyY21wKGlkLT5uYW1lLCAic2dkMDA5IikpIHsKKwkJcGRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IHBtYnVzX3BsYXRmb3JtX2RhdGEpLAorCQkJCSAgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghcGRhdGEpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlwZGF0YS0+ZmxhZ3MgPSBQTUJVU19TS0lQX1NUQVRVU19DSEVDSzsKKwl9CisKIAlpbmZvLT5wYWdlcyA9IGlkLT5kcml2ZXJfZGF0YTsKIAlpbmZvLT5pZGVudGlmeSA9IHBtYnVzX2lkZW50aWZ5OworCWRldi0+cGxhdGZvcm1fZGF0YSA9IHBkYXRhOwogCiAJcmV0dXJuIHBtYnVzX2RvX3Byb2JlKGNsaWVudCwgaWQsIGluZm8pOwogfQpAQCAtMTg2LDYgKzE5OSw4IEBACiAJeyJhZHA0MDAwIiwgMX0sCiAJeyJibXI0NTMiLCAxfSwKIAl7ImJtcjQ1NCIsIDF9LAorCXsiZHBzNDYwIiwgMX0sCisJeyJkcHM4MDAiLCAxfSwKIAl7Im1kdDA0MCIsIDF9LAogCXsibmNwNDIwMCIsIDF9LAogCXsibmNwNDIwOCIsIDF9LApAQCAtMTkzLDYgKzIwOCw3IEBACiAJeyJwZHQwMDYiLCAxfSwKIAl7InBkdDAxMiIsIDF9LAogCXsicG1idXMiLCAwfSwKKwl7InNnZDAwOSIsIDF9LAogCXsidHBzNDA0MDAiLCAxfSwKIAl7InRwczU0NGIyMCIsIDF9LAogCXsidHBzNTQ0YjI1IiwgMX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3BtYnVzL3VjZDkwMDAuYyBiL2RyaXZlcnMvaHdtb24vcG1idXMvdWNkOTAwMC5jCmluZGV4IGZiYjE0NzkuLjNlM2FhOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vcG1idXMvdWNkOTAwMC5jCisrKyBiL2RyaXZlcnMvaHdtb24vcG1idXMvdWNkOTAwMC5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjL3BtYnVzLmg+CiAjaW5jbHVkZSAicG1idXMuaCIKIAotZW51bSBjaGlwcyB7IHVjZDkwMDAsIHVjZDkwMTIwLCB1Y2Q5MDEyNCwgdWNkOTA5MCwgdWNkOTA5MTAgfTsKK2VudW0gY2hpcHMgeyB1Y2Q5MDAwLCB1Y2Q5MDEyMCwgdWNkOTAxMjQsIHVjZDkwMTYwLCB1Y2Q5MDkwLCB1Y2Q5MDkxMCB9OwogCiAjZGVmaW5lIFVDRDkwMDBfTU9OSVRPUl9DT05GSUcJCTB4ZDUKICNkZWZpbmUgVUNEOTAwMF9OVU1fUEFHRVMJCTB4ZDYKQEAgLTExMiw2ICsxMTIsNyBAQAogCXsidWNkOTAwMCIsIHVjZDkwMDB9LAogCXsidWNkOTAxMjAiLCB1Y2Q5MDEyMH0sCiAJeyJ1Y2Q5MDEyNCIsIHVjZDkwMTI0fSwKKwl7InVjZDkwMTYwIiwgdWNkOTAxNjB9LAogCXsidWNkOTA5MCIsIHVjZDkwOTB9LAogCXsidWNkOTA5MTAiLCB1Y2Q5MDkxMH0sCiAJe30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vc2NwaS1od21vbi5jIGIvZHJpdmVycy9od21vbi9zY3BpLWh3bW9uLmMKaW5kZXggMjViNDRlNi4uNTU5YTNkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9zY3BpLWh3bW9uLmMKKysrIGIvZHJpdmVycy9od21vbi9zY3BpLWh3bW9uLmMKQEAgLTI1NSw3ICsyNTUsNiBAQAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2NwaV9od21vbl9wbGF0ZHJ2ID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gInNjcGktaHdtb24iLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAkJLm9mX21hdGNoX3RhYmxlID0gc2NwaV9vZl9tYXRjaCwKIAl9LAogCS5wcm9iZQkJPSBzY3BpX2h3bW9uX3Byb2JlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi90bXAxMDIuYyBiL2RyaXZlcnMvaHdtb24vdG1wMTAyLmMKaW5kZXggODQ3OWFjNS4uMzZiYmEyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi90bXAxMDIuYworKysgYi9kcml2ZXJzL2h3bW9uL3RtcDEwMi5jCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L3RoZXJtYWwuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogCiAjZGVmaW5lCURSSVZFUl9OQU1FICJ0bXAxMDIiCkBAIC03OSw4NCArNzgsMTEzIEBACiAJcmV0dXJuICh2YWwgKiAxMjgpIC8gMTAwMDsKIH0KIAotc3RhdGljIGludCB0bXAxMDJfcmVhZF90ZW1wKHZvaWQgKmRldiwgaW50ICp0ZW1wKQorc3RhdGljIGludCB0bXAxMDJfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCSAgICAgICB1MzIgYXR0ciwgaW50IGNoYW5uZWwsIGxvbmcgKnRlbXApCiB7CiAJc3RydWN0IHRtcDEwMiAqdG1wMTAyID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JdW5zaWduZWQgaW50IHJlZzsKLQlpbnQgcmV0OworCXVuc2lnbmVkIGludCByZWd2YWw7CisJaW50IGVyciwgcmVnOwogCi0JaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRtcDEwMi0+cmVhZHlfdGltZSkpIHsKLQkJZGV2X2RiZyhkZXYsICIlczogQ29udmVyc2lvbiBub3QgcmVhZHkgeWV0Li5cbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FQUdBSU47CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl90ZW1wX2lucHV0OgorCQkvKiBJcyBpdCB0b28gZWFybHkgdG8gcmV0dXJuIGEgY29udmVyc2lvbiA/ICovCisJCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0bXAxMDItPnJlYWR5X3RpbWUpKSB7CisJCQlkZXZfZGJnKGRldiwgIiVzOiBDb252ZXJzaW9uIG5vdCByZWFkeSB5ZXQuLlxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwkJcmVnID0gVE1QMTAyX1RFTVBfUkVHOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfbWF4X2h5c3Q6CisJCXJlZyA9IFRNUDEwMl9UTE9XX1JFRzsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX21heDoKKwkJcmVnID0gVE1QMTAyX1RISUdIX1JFRzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIAotCXJldCA9IHJlZ21hcF9yZWFkKHRtcDEwMi0+cmVnbWFwLCBUTVAxMDJfVEVNUF9SRUcsICZyZWcpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JKnRlbXAgPSB0bXAxMDJfcmVnX3RvX21DKHJlZyk7CisJZXJyID0gcmVnbWFwX3JlYWQodG1wMTAyLT5yZWdtYXAsIHJlZywgJnJlZ3ZhbCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJKnRlbXAgPSB0bXAxMDJfcmVnX3RvX21DKHJlZ3ZhbCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHNzaXplX3QgdG1wMTAyX3Nob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJY2hhciAqYnVmKQorc3RhdGljIGludCB0bXAxMDJfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkJdTMyIGF0dHIsIGludCBjaGFubmVsLCBsb25nIHRlbXApCiB7Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZGEgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0cik7CiAJc3RydWN0IHRtcDEwMiAqdG1wMTAyID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IHJlZ2FkZHIgPSBzZGEtPmluZGV4OwotCXVuc2lnbmVkIGludCByZWc7Ci0JaW50IGVycjsKKwlpbnQgcmVnOwogCi0JaWYgKHJlZ2FkZHIgPT0gVE1QMTAyX1RFTVBfUkVHICYmCi0JICAgIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRtcDEwMi0+cmVhZHlfdGltZSkpCi0JCXJldHVybiAtRUFHQUlOOworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fdGVtcF9tYXhfaHlzdDoKKwkJcmVnID0gVE1QMTAyX1RMT1dfUkVHOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfbWF4OgorCQlyZWcgPSBUTVAxMDJfVEhJR0hfUkVHOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQogCi0JZXJyID0gcmVnbWFwX3JlYWQodG1wMTAyLT5yZWdtYXAsIHJlZ2FkZHIsICZyZWcpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRtcDEwMl9yZWdfdG9fbUMocmVnKSk7CisJdGVtcCA9IGNsYW1wX3ZhbCh0ZW1wLCAtMjU2MDAwLCAyNTUwMDApOworCXJldHVybiByZWdtYXBfd3JpdGUodG1wMTAyLT5yZWdtYXAsIHJlZywgdG1wMTAyX21DX3RvX3JlZyh0ZW1wKSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHRtcDEwMl9zZXRfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgdW1vZGVfdCB0bXAxMDJfaXNfdmlzaWJsZShjb25zdCB2b2lkICpkYXRhLCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkJCSB1MzIgYXR0ciwgaW50IGNoYW5uZWwpCiB7Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZGEgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0cik7Ci0Jc3RydWN0IHRtcDEwMiAqdG1wMTAyID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IHJlZyA9IHNkYS0+aW5kZXg7Ci0JbG9uZyB2YWw7Ci0JaW50IGVycjsKKwlpZiAodHlwZSAhPSBod21vbl90ZW1wKQorCQlyZXR1cm4gMDsKIAotCWlmIChrc3RydG9sKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JdmFsID0gY2xhbXBfdmFsKHZhbCwgLTI1NjAwMCwgMjU1MDAwKTsKLQotCWVyciA9IHJlZ21hcF93cml0ZSh0bXAxMDItPnJlZ21hcCwgcmVnLCB0bXAxMDJfbUNfdG9fcmVnKHZhbCkpOwotCXJldHVybiBlcnIgPyA6IGNvdW50OworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fdGVtcF9pbnB1dDoKKwkJcmV0dXJuIFNfSVJVR087CisJY2FzZSBod21vbl90ZW1wX21heF9oeXN0OgorCWNhc2UgaHdtb25fdGVtcF9tYXg6CisJCXJldHVybiBTX0lSVUdPIHwgU19JV1VTUjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CiB9CiAKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIHRtcDEwMl9zaG93X3RlbXAsIE5VTEwsCi0JCQkgIFRNUDEwMl9URU1QX1JFRyk7CitzdGF0aWMgdTMyIHRtcDEwMl9jaGlwX2NvbmZpZ1tdID0geworCUhXTU9OX0NfUkVHSVNURVJfVFosCisJMAorfTsKIAotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9tYXhfaHlzdCwgU19JV1VTUiB8IFNfSVJVR08sIHRtcDEwMl9zaG93X3RlbXAsCi0JCQkgIHRtcDEwMl9zZXRfdGVtcCwgVE1QMTAyX1RMT1dfUkVHKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIHRtcDEwMl9jaGlwID0geworCS50eXBlID0gaHdtb25fY2hpcCwKKwkuY29uZmlnID0gdG1wMTAyX2NoaXBfY29uZmlnLAorfTsKIAotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCB0bXAxMDJfc2hvd190ZW1wLAotCQkJICB0bXAxMDJfc2V0X3RlbXAsIFRNUDEwMl9USElHSF9SRUcpOworc3RhdGljIHUzMiB0bXAxMDJfdGVtcF9jb25maWdbXSA9IHsKKwlIV01PTl9UX0lOUFVUIHwgSFdNT05fVF9NQVggfCBIV01PTl9UX01BWF9IWVNULAorCTAKK307CiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp0bXAxMDJfYXR0cnNbXSA9IHsKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXhfaHlzdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4LmRldl9hdHRyLmF0dHIsCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyB0bXAxMDJfdGVtcCA9IHsKKwkudHlwZSA9IGh3bW9uX3RlbXAsCisJLmNvbmZpZyA9IHRtcDEwMl90ZW1wX2NvbmZpZywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvICp0bXAxMDJfaW5mb1tdID0geworCSZ0bXAxMDJfY2hpcCwKKwkmdG1wMTAyX3RlbXAsCiAJTlVMTAogfTsKLUFUVFJJQlVURV9HUk9VUFModG1wMTAyKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCB0aGVybWFsX3pvbmVfb2ZfZGV2aWNlX29wcyB0bXAxMDJfb2ZfdGhlcm1hbF9vcHMgPSB7Ci0JLmdldF90ZW1wID0gdG1wMTAyX3JlYWRfdGVtcCwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fb3BzIHRtcDEwMl9od21vbl9vcHMgPSB7CisJLmlzX3Zpc2libGUgPSB0bXAxMDJfaXNfdmlzaWJsZSwKKwkucmVhZCA9IHRtcDEwMl9yZWFkLAorCS53cml0ZSA9IHRtcDEwMl93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hpcF9pbmZvIHRtcDEwMl9jaGlwX2luZm8gPSB7CisJLm9wcyA9ICZ0bXAxMDJfaHdtb25fb3BzLAorCS5pbmZvID0gdG1wMTAyX2luZm8sCiB9OwogCiBzdGF0aWMgdm9pZCB0bXAxMDJfcmVzdG9yZV9jb25maWcodm9pZCAqZGF0YSkKQEAgLTE4OCw3ICsyMTYsNyBAQAogfTsKIAogc3RhdGljIGludCB0bXAxMDJfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJCQkgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKKwkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CiAJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OwpAQCAtMjQ5LDE2ICsyNzcsMTQgQEAKIAkJdG1wMTAyLT5yZWFkeV90aW1lICs9IG1zZWNzX3RvX2ppZmZpZXMoQ09OVkVSU0lPTl9USU1FX01TKTsKIAl9CiAKLQlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsIGNsaWVudC0+bmFtZSwKLQkJCQkJCQkgICB0bXAxMDIsCi0JCQkJCQkJICAgdG1wMTAyX2dyb3Vwcyk7CisJaHdtb25fZGV2ID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvKGRldiwgY2xpZW50LT5uYW1lLAorCQkJCQkJCSB0bXAxMDIsCisJCQkJCQkJICZ0bXAxMDJfY2hpcF9pbmZvLAorCQkJCQkJCSBOVUxMKTsKIAlpZiAoSVNfRVJSKGh3bW9uX2RldikpIHsKIAkJZGV2X2RiZyhkZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgaHdtb24gZGV2aWNlXG4iKTsKIAkJcmV0dXJuIFBUUl9FUlIoaHdtb25fZGV2KTsKIAl9Ci0JZGV2bV90aGVybWFsX3pvbmVfb2Zfc2Vuc29yX3JlZ2lzdGVyKGh3bW9uX2RldiwgMCwgaHdtb25fZGV2LAotCQkJCQkgICAgICZ0bXAxMDJfb2ZfdGhlcm1hbF9vcHMpOwotCiAJZGV2X2luZm8oZGV2LCAiaW5pdGlhbGl6ZWRcbiIpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3RtcDQyMS5jIGIvZHJpdmVycy9od21vbi90bXA0MjEuYwppbmRleCA4NWQ0OGQ4Li5iZmI5OGI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3RtcDQyMS5jCisrKyBiL2RyaXZlcnMvaHdtb24vdG1wNDIxLmMKQEAgLTcyLDYgKzcyLDEwIEBACiBzdHJ1Y3QgdG1wNDIxX2RhdGEgewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CiAJc3RydWN0IG11dGV4IHVwZGF0ZV9sb2NrOworCXUzMiB0ZW1wX2NvbmZpZ1s1XTsKKwlzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIHRlbXBfaW5mbzsKKwljb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvICppbmZvWzJdOworCXN0cnVjdCBod21vbl9jaGlwX2luZm8gY2hpcDsKIAljaGFyIHZhbGlkOwogCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOwogCWludCBjaGFubmVsczsKQEAgLTEyNSw4NSArMTI5LDQ2IEBACiAJcmV0dXJuIGRhdGE7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF92YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgdG1wNDIxX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkgICAgICAgdTMyIGF0dHIsIGludCBjaGFubmVsLCBsb25nICp2YWwpCiB7Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKLQlzdHJ1Y3QgdG1wNDIxX2RhdGEgKmRhdGEgPSB0bXA0MjFfdXBkYXRlX2RldmljZShkZXYpOwotCWludCB0ZW1wOworCXN0cnVjdCB0bXA0MjFfZGF0YSAqdG1wNDIxID0gdG1wNDIxX3VwZGF0ZV9kZXZpY2UoZGV2KTsKIAotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlpZiAoZGF0YS0+Y29uZmlnICYgVE1QNDIxX0NPTkZJR19SQU5HRSkKLQkJdGVtcCA9IHRlbXBfZnJvbV91MTYoZGF0YS0+dGVtcFtpbmRleF0pOwotCWVsc2UKLQkJdGVtcCA9IHRlbXBfZnJvbV9zMTYoZGF0YS0+dGVtcFtpbmRleF0pOwotCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fdGVtcF9pbnB1dDoKKwkJaWYgKHRtcDQyMS0+Y29uZmlnICYgVE1QNDIxX0NPTkZJR19SQU5HRSkKKwkJCSp2YWwgPSB0ZW1wX2Zyb21fdTE2KHRtcDQyMS0+dGVtcFtjaGFubmVsXSk7CisJCWVsc2UKKwkJCSp2YWwgPSB0ZW1wX2Zyb21fczE2KHRtcDQyMS0+dGVtcFtjaGFubmVsXSk7CisJCXJldHVybiAwOworCWNhc2UgaHdtb25fdGVtcF9mYXVsdDoKKwkJLyoKKwkJICogVGhlIE9QRU4gYml0IHNpZ25hbHMgYSBmYXVsdC4gVGhpcyBpcyBiaXQgMCBvZiB0aGUgdGVtcGVyYXR1cmUKKwkJICogcmVnaXN0ZXIgKGxvdyBieXRlKS4KKwkJICovCisJCSp2YWwgPSB0bXA0MjEtPnRlbXBbY2hhbm5lbF0gJiAweDAxOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRlbXApOwogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X2ZhdWx0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyB1bW9kZV90IHRtcDQyMV9pc192aXNpYmxlKGNvbnN0IHZvaWQgKmRhdGEsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQkJIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCkKIHsKLQlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OwotCXN0cnVjdCB0bXA0MjFfZGF0YSAqZGF0YSA9IHRtcDQyMV91cGRhdGVfZGV2aWNlKGRldik7Ci0KLQkvKgotCSAqIFRoZSBPUEVOIGJpdCBzaWduYWxzIGEgZmF1bHQuIFRoaXMgaXMgYml0IDAgb2YgdGhlIHRlbXBlcmF0dXJlCi0JICogcmVnaXN0ZXIgKGxvdyBieXRlKS4KLQkgKi8KLQlpZiAoZGF0YS0+dGVtcFtpbmRleF0gJiAweDAxKQotCQlyZXR1cm4gc3ByaW50ZihidWYsICIxXG4iKTsKLQllbHNlCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjBcbiIpOworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fdGVtcF9mYXVsdDoKKwkJaWYgKGNoYW5uZWwgPT0gMCkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gU19JUlVHTzsKKwljYXNlIGh3bW9uX3RlbXBfaW5wdXQ6CisJCXJldHVybiBTX0lSVUdPOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KIH0KIAotc3RhdGljIHVtb2RlX3QgdG1wNDIxX2lzX3Zpc2libGUoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmEsCi0JCQkJaW50IG4pCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOwotCXN0cnVjdCB0bXA0MjFfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyOwotCXVuc2lnbmVkIGludCBpbmRleDsKLQotCWRldmF0dHIgPSBjb250YWluZXJfb2YoYSwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUsIGF0dHIpOwotCWluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKLQotCWlmIChpbmRleCA8IGRhdGEtPmNoYW5uZWxzKQotCQlyZXR1cm4gYS0+bW9kZTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXBfdmFsdWUsIE5VTEwsIDApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wX3ZhbHVlLCBOVUxMLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfZmF1bHQsIFNfSVJVR08sIHNob3dfZmF1bHQsIE5VTEwsIDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wX3ZhbHVlLCBOVUxMLCAyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfZmF1bHQsIFNfSVJVR08sIHNob3dfZmF1bHQsIE5VTEwsIDIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNF9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wX3ZhbHVlLCBOVUxMLCAzKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDRfZmF1bHQsIFNfSVJVR08sIHNob3dfZmF1bHQsIE5VTEwsIDMpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdG1wNDIxX2F0dHJbXSA9IHsKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfZmF1bHQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19mYXVsdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDRfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXA0X2ZhdWx0LmRldl9hdHRyLmF0dHIsCi0JTlVMTAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgdG1wNDIxX2dyb3VwID0gewotCS5hdHRycyA9IHRtcDQyMV9hdHRyLAotCS5pc192aXNpYmxlID0gdG1wNDIxX2lzX3Zpc2libGUsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqdG1wNDIxX2dyb3Vwc1tdID0gewotCSZ0bXA0MjFfZ3JvdXAsCi0JTlVMTAotfTsKLQogc3RhdGljIGludCB0bXA0MjFfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlpbnQgY29uZmlnLCBjb25maWdfb3JpZzsKQEAgLTI4OSwxMyArMjU0LDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fb3BzIHRtcDQyMV9vcHMgPSB7CisJLmlzX3Zpc2libGUgPSB0bXA0MjFfaXNfdmlzaWJsZSwKKwkucmVhZCA9IHRtcDQyMV9yZWFkLAorfTsKKwogc3RhdGljIGludCB0bXA0MjFfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CiAJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OwogCXN0cnVjdCB0bXA0MjFfZGF0YSAqZGF0YTsKLQlpbnQgZXJyOworCWludCBpLCBlcnI7CiAKIAlkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCB0bXA0MjFfZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghZGF0YSkKQEAgLTMwOSw4ICsyNzksMjEgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JaHdtb25fZGV2ID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoZGV2LCBjbGllbnQtPm5hbWUsCi0JCQkJCQkJICAgZGF0YSwgdG1wNDIxX2dyb3Vwcyk7CisJZm9yIChpID0gMDsgaSA8IGRhdGEtPmNoYW5uZWxzOyBpKyspCisJCWRhdGEtPnRlbXBfY29uZmlnW2ldID0gSFdNT05fVF9JTlBVVCB8IEhXTU9OX1RfRkFVTFQ7CisKKwlkYXRhLT5jaGlwLm9wcyA9ICZ0bXA0MjFfb3BzOworCWRhdGEtPmNoaXAuaW5mbyA9IGRhdGEtPmluZm87CisKKwlkYXRhLT5pbmZvWzBdID0gJmRhdGEtPnRlbXBfaW5mbzsKKworCWRhdGEtPnRlbXBfaW5mby50eXBlID0gaHdtb25fdGVtcDsKKwlkYXRhLT50ZW1wX2luZm8uY29uZmlnID0gZGF0YS0+dGVtcF9jb25maWc7CisKKwlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8oZGV2LCBjbGllbnQtPm5hbWUsCisJCQkJCQkJIGRhdGEsCisJCQkJCQkJICZkYXRhLT5jaGlwLAorCQkJCQkJCSBOVUxMKTsKIAlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGh3bW9uX2Rldik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24veGdlbmUtaHdtb24uYyBiL2RyaXZlcnMvaHdtb24veGdlbmUtaHdtb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzBkYmI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi94Z2VuZS1od21vbi5jCkBAIC0wLDAgKzEsNzg3IEBACisvKgorICogQVBNIFgtR2VuZSBTb0MgSGFyZHdhcmUgTW9uaXRvcmluZyBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIEFwcGxpZWQgTWljcm8gQ2lyY3VpdHMgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogTG9jIEhvIDxsaG9AYXBtLmNvbT4KKyAqICAgICAgICAgSG9hbiBUcmFuIDxob3RyYW5AYXBtLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogVGhpcyBkcml2ZXIgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBmZWF0dXJlczoKKyAqICAtIFJldHJpZXZlIENQVSB0b3RhbCBwb3dlciAodVcpCisgKiAgLSBSZXRyaWV2ZSBJTyB0b3RhbCBwb3dlciAodVcpCisgKiAgLSBSZXRyaWV2ZSBTb0MgdGVtcGVyYXR1cmUgKG1pbGxpLWRlZ3JlZSBDKSBhbmQgYWxhcm0KKyAqLworI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CisjaW5jbHVkZSA8bGludXgvbWFpbGJveF9jb250cm9sbGVyLmg+CisjaW5jbHVkZSA8bGludXgvbWFpbGJveF9jbGllbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YWNwaS9wY2MuaD4KKworLyogU0xJTXBybyBtZXNzYWdlIGRlZmluZXMgKi8KKyNkZWZpbmUgTVNHX1RZUEVfREJHCQkJMAorI2RlZmluZSBNU0dfVFlQRV9FUlIJCQk3CisjZGVmaW5lIE1TR19UWVBFX1BXUk1HTVQJCTkKKworI2RlZmluZSBNU0dfVFlQRSh2KQkJCSgoKHYpICYgMHhGMDAwMDAwMCkgPj4gMjgpCisjZGVmaW5lIE1TR19UWVBFX1NFVCh2KQkJCSgoKHYpIDw8IDI4KSAmIDB4RjAwMDAwMDApCisjZGVmaW5lIE1TR19TVUJUWVBFKHYpCQkJKCgodikgJiAweDBGMDAwMDAwKSA+PiAyNCkKKyNkZWZpbmUgTVNHX1NVQlRZUEVfU0VUKHYpCQkoKCh2KSA8PCAyNCkgJiAweDBGMDAwMDAwKQorCisjZGVmaW5lIERCR19TVUJUWVBFX1NFTlNPUl9SRUFECQk0CisjZGVmaW5lIFNFTlNPUl9SRF9NU0cJCQkweDA0RkZFOTAyCisjZGVmaW5lIFNFTlNPUl9SRF9FTl9BRERSKGEpCQkoKGEpICYgMHgwMDBGRkZGRikKKyNkZWZpbmUgUE1EX1BXUl9SRUcJCQkweDIwCisjZGVmaW5lIFBNRF9QV1JfTVdfUkVHCQkJMHgyNgorI2RlZmluZSBTT0NfUFdSX1JFRwkJCTB4MjEKKyNkZWZpbmUgU09DX1BXUl9NV19SRUcJCQkweDI3CisjZGVmaW5lIFNPQ19URU1QX1JFRwkJCTB4MTAKKworI2RlZmluZSBURU1QX05FR0FUSVZFX0JJVAkJOAorI2RlZmluZSBTRU5TT1JfSU5WQUxJRF9EQVRBCQlCSVQoMTUpCisKKyNkZWZpbmUgUFdSTUdNVF9TVUJUWVBFX1RQQwkJMQorI2RlZmluZSBUUENfQUxBUk0JCQkyCisjZGVmaW5lIFRQQ19HRVRfQUxBUk0JCQkzCisjZGVmaW5lIFRQQ19DTUQodikJCQkoKCh2KSAmIDB4MDBGRjAwMDApID4+IDE2KQorI2RlZmluZSBUUENfQ01EX1NFVCh2KQkJCSgoKHYpIDw8IDE2KSAmIDB4MDBGRjAwMDApCisjZGVmaW5lIFRQQ19FTl9NU0coaG5kbCwgY21kLCB0eXBlKSBcCisJKE1TR19UWVBFX1NFVChNU0dfVFlQRV9QV1JNR01UKSB8IFwKKwlNU0dfU1VCVFlQRV9TRVQoaG5kbCkgfCBUUENfQ01EX1NFVChjbWQpIHwgdHlwZSkKKworLyogUENDIGRlZmluZXMgKi8KKyNkZWZpbmUgUENDX1NJR05BVFVSRV9NQVNLCQkweDUwNDI0MzAwCisjZGVmaW5lIFBDQ0NfR0VORVJBVEVfREJfSU5UCQlCSVQoMTUpCisjZGVmaW5lIFBDQ1NfQ01EX0NPTVBMRVRFCQlCSVQoMCkKKyNkZWZpbmUgUENDU19TQ0lfRE9PUkJFTAkJQklUKDEpCisjZGVmaW5lIFBDQ1NfUExBVEZPUk1fTk9USUZJQ0FUSU9OCUJJVCgzKQorLyoKKyAqIEFyYml0cmFyeSByZXRyaWVzIGluIGNhc2UgdGhlIHJlbW90ZSBwcm9jZXNzb3IgaXMgc2xvdyB0byByZXNwb25kCisgKiB0byBQQ0MgY29tbWFuZHMKKyAqLworI2RlZmluZSBQQ0NfTlVNX1JFVFJJRVMJCQk1MDAKKworI2RlZmluZSBBU1lOQ19NU0dfRklGT19TSVpFCQkxNgorI2RlZmluZSBNQk9YX09QX1RJTUVPVVRNUwkJMTAwMAorCisjZGVmaW5lIFdBVFRfVE9fbVdBVFQoeCkJCSgoeCkgKiAxMDAwKQorI2RlZmluZSBtV0FUVF9UT191V0FUVCh4KQkJKCh4KSAqIDEwMDApCisjZGVmaW5lIENFTFNJVVNfVE9fbUNFTFNJVVMoeCkJCSgoeCkgKiAxMDAwKQorCisjZGVmaW5lIHRvX3hnZW5lX2h3bW9uX2RldihjbCkJCVwKKwljb250YWluZXJfb2YoY2wsIHN0cnVjdCB4Z2VuZV9od21vbl9kZXYsIG1ib3hfY2xpZW50KQorCitzdHJ1Y3Qgc2xpbXByb19yZXNwX21zZyB7CisJdTMyIG1zZzsKKwl1MzIgcGFyYW0xOworCXUzMiBwYXJhbTI7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgeGdlbmVfaHdtb25fZGV2IHsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworCXN0cnVjdCBtYm94X2NoYW4JKm1ib3hfY2hhbjsKKwlzdHJ1Y3QgbWJveF9jbGllbnQJbWJveF9jbGllbnQ7CisJaW50CQkJbWJveF9pZHg7CisKKwlzcGlubG9ja190CQlrZmlmb19sb2NrOworCXN0cnVjdCBtdXRleAkJcmRfbXV0ZXg7CisJc3RydWN0IGNvbXBsZXRpb24JcmRfY29tcGxldGU7CisJaW50CQkJcmVzcF9wZW5kaW5nOworCXN0cnVjdCBzbGltcHJvX3Jlc3BfbXNnIHN5bmNfbXNnOworCisJc3RydWN0IHdvcmtfc3RydWN0CXdvcmtxOworCXN0cnVjdCBrZmlmb19yZWNfcHRyXzEJYXN5bmNfbXNnX2ZpZm87CisKKwlzdHJ1Y3QgZGV2aWNlCQkqaHdtb25fZGV2OworCWJvb2wJCQl0ZW1wX2NyaXRpY2FsX2FsYXJtOworCisJcGh5c19hZGRyX3QJCWNvbW1fYmFzZV9hZGRyOworCXZvaWQJCQkqcGNjX2NvbW1fYWRkcjsKKwl1NjQJCQl1c2Vjc19sYXQ7Cit9OworCisvKgorICogVGhpcyBmdW5jdGlvbiB0ZXN0cyBhbmQgY2xlYXJzIGEgYml0bWFzayB0aGVuIHJldHVybnMgaXRzIG9sZCB2YWx1ZQorICovCitzdGF0aWMgdTE2IHhnZW5lX3dvcmRfdHN0X2FuZF9jbHIodTE2ICphZGRyLCB1MTYgbWFzaykKK3sKKwl1MTYgcmV0LCB2YWw7CisKKwl2YWwgPSBsZTE2X3RvX2NwdShSRUFEX09OQ0UoKmFkZHIpKTsKKwlyZXQgPSB2YWwgJiBtYXNrOworCXZhbCAmPSB+bWFzazsKKwlXUklURV9PTkNFKCphZGRyLCBjcHVfdG9fbGUxNih2YWwpKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgeGdlbmVfaHdtb25fcGNjX3JkKHN0cnVjdCB4Z2VuZV9od21vbl9kZXYgKmN0eCwgdTMyICptc2cpCit7CisJc3RydWN0IGFjcGlfcGNjdF9zaGFyZWRfbWVtb3J5ICpnZW5lcmljX2NvbW1fYmFzZSA9IGN0eC0+cGNjX2NvbW1fYWRkcjsKKwl1MzIgKnB0ciA9ICh2b2lkICopKGdlbmVyaWNfY29tbV9iYXNlICsgMSk7CisJaW50IHJjLCBpOworCXUxNiB2YWw7CisKKwltdXRleF9sb2NrKCZjdHgtPnJkX211dGV4KTsKKwlpbml0X2NvbXBsZXRpb24oJmN0eC0+cmRfY29tcGxldGUpOworCWN0eC0+cmVzcF9wZW5kaW5nID0gdHJ1ZTsKKworCS8qIFdyaXRlIHNpZ25hdHVyZSBmb3Igc3Vic3BhY2UgKi8KKwlXUklURV9PTkNFKGdlbmVyaWNfY29tbV9iYXNlLT5zaWduYXR1cmUsCisJCSAgIGNwdV90b19sZTMyKFBDQ19TSUdOQVRVUkVfTUFTSyB8IGN0eC0+bWJveF9pZHgpKTsKKworCS8qIFdyaXRlIHRvIHRoZSBzaGFyZWQgY29tbWFuZCByZWdpb24gKi8KKwlXUklURV9PTkNFKGdlbmVyaWNfY29tbV9iYXNlLT5jb21tYW5kLAorCQkgICBjcHVfdG9fbGUxNihNU0dfVFlQRShtc2dbMF0pIHwgUENDQ19HRU5FUkFURV9EQl9JTlQpKTsKKworCS8qIEZsaXAgQ01EIENPTVBMRVRFIGJpdCAqLworCXZhbCA9IGxlMTZfdG9fY3B1KFJFQURfT05DRShnZW5lcmljX2NvbW1fYmFzZS0+c3RhdHVzKSk7CisJdmFsICY9IH5QQ0NTX0NNRF9DT01QTEVURTsKKwlXUklURV9PTkNFKGdlbmVyaWNfY29tbV9iYXNlLT5zdGF0dXMsIGNwdV90b19sZTE2KHZhbCkpOworCisJLyogQ29weSB0aGUgbWVzc2FnZSB0byB0aGUgUENDIGNvbW0gc3BhY2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHN0cnVjdCBzbGltcHJvX3Jlc3BfbXNnKSAvIDQ7IGkrKykKKwkJV1JJVEVfT05DRShwdHJbaV0sIGNwdV90b19sZTMyKG1zZ1tpXSkpOworCisJLyogUmluZyB0aGUgZG9vcmJlbGwgKi8KKwlyYyA9IG1ib3hfc2VuZF9tZXNzYWdlKGN0eC0+bWJveF9jaGFuLCBtc2cpOworCWlmIChyYyA8IDApIHsKKwkJZGV2X2VycihjdHgtPmRldiwgIk1haWxib3ggc2VuZCBlcnJvciAlZFxuIiwgcmMpOworCQlnb3RvIGVycjsKKwl9CisJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmN0eC0+cmRfY29tcGxldGUsCisJCQkJCSB1c2Vjc190b19qaWZmaWVzKGN0eC0+dXNlY3NfbGF0KSkpIHsKKwkJZGV2X2VycihjdHgtPmRldiwgIk1haWxib3ggb3BlcmF0aW9uIHRpbWVkIG91dFxuIik7CisJCXJjID0gLUVUSU1FRE9VVDsKKwkJZ290byBlcnI7CisJfQorCisJLyogQ2hlY2sgZm9yIGVycm9yIG1lc3NhZ2UgKi8KKwlpZiAoTVNHX1RZUEUoY3R4LT5zeW5jX21zZy5tc2cpID09IE1TR19UWVBFX0VSUikgeworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCW1zZ1swXSA9IGN0eC0+c3luY19tc2cubXNnOworCW1zZ1sxXSA9IGN0eC0+c3luY19tc2cucGFyYW0xOworCW1zZ1syXSA9IGN0eC0+c3luY19tc2cucGFyYW0yOworCitlcnI6CisJbWJveF9jaGFuX3R4ZG9uZShjdHgtPm1ib3hfY2hhbiwgMCk7CisJY3R4LT5yZXNwX3BlbmRpbmcgPSBmYWxzZTsKKwltdXRleF91bmxvY2soJmN0eC0+cmRfbXV0ZXgpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB4Z2VuZV9od21vbl9yZChzdHJ1Y3QgeGdlbmVfaHdtb25fZGV2ICpjdHgsIHUzMiAqbXNnKQoreworCWludCByYzsKKworCW11dGV4X2xvY2soJmN0eC0+cmRfbXV0ZXgpOworCWluaXRfY29tcGxldGlvbigmY3R4LT5yZF9jb21wbGV0ZSk7CisJY3R4LT5yZXNwX3BlbmRpbmcgPSB0cnVlOworCisJcmMgPSBtYm94X3NlbmRfbWVzc2FnZShjdHgtPm1ib3hfY2hhbiwgbXNnKTsKKwlpZiAocmMgPCAwKSB7CisJCWRldl9lcnIoY3R4LT5kZXYsICJNYWlsYm94IHNlbmQgZXJyb3IgJWRcbiIsIHJjKTsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmN0eC0+cmRfY29tcGxldGUsCisJCQkJCSBtc2Vjc190b19qaWZmaWVzKE1CT1hfT1BfVElNRU9VVE1TKSkpIHsKKwkJZGV2X2VycihjdHgtPmRldiwgIk1haWxib3ggb3BlcmF0aW9uIHRpbWVkIG91dFxuIik7CisJCXJjID0gLUVUSU1FRE9VVDsKKwkJZ290byBlcnI7CisJfQorCisJLyogQ2hlY2sgZm9yIGVycm9yIG1lc3NhZ2UgKi8KKwlpZiAoTVNHX1RZUEUoY3R4LT5zeW5jX21zZy5tc2cpID09IE1TR19UWVBFX0VSUikgeworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCW1zZ1swXSA9IGN0eC0+c3luY19tc2cubXNnOworCW1zZ1sxXSA9IGN0eC0+c3luY19tc2cucGFyYW0xOworCW1zZ1syXSA9IGN0eC0+c3luY19tc2cucGFyYW0yOworCitlcnI6CisJY3R4LT5yZXNwX3BlbmRpbmcgPSBmYWxzZTsKKwltdXRleF91bmxvY2soJmN0eC0+cmRfbXV0ZXgpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB4Z2VuZV9od21vbl9yZWdfbWFwX3JkKHN0cnVjdCB4Z2VuZV9od21vbl9kZXYgKmN0eCwgdTMyIGFkZHIsCisJCQkJICB1MzIgKmRhdGEpCit7CisJdTMyIG1zZ1szXTsKKwlpbnQgcmM7CisKKwltc2dbMF0gPSBTRU5TT1JfUkRfTVNHOworCW1zZ1sxXSA9IFNFTlNPUl9SRF9FTl9BRERSKGFkZHIpOworCW1zZ1syXSA9IDA7CisKKwlpZiAoYWNwaV9kaXNhYmxlZCkKKwkJcmMgPSB4Z2VuZV9od21vbl9yZChjdHgsIG1zZyk7CisJZWxzZQorCQlyYyA9IHhnZW5lX2h3bW9uX3BjY19yZChjdHgsIG1zZyk7CisKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwkvKgorCSAqIENoZWNrIGlmIHNlbnNvciBkYXRhIGlzIHZhbGlkLgorCSAqLworCWlmIChtc2dbMV0gJiBTRU5TT1JfSU5WQUxJRF9EQVRBKQorCQlyZXR1cm4gLUVOT0RBVEE7CisKKwkqZGF0YSA9IG1zZ1sxXTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB4Z2VuZV9od21vbl9nZXRfbm90aWZpY2F0aW9uX21zZyhzdHJ1Y3QgeGdlbmVfaHdtb25fZGV2ICpjdHgsCisJCQkJCSAgICB1MzIgKmFtc2cpCit7CisJdTMyIG1zZ1szXTsKKwlpbnQgcmM7CisKKwltc2dbMF0gPSBUUENfRU5fTVNHKFBXUk1HTVRfU1VCVFlQRV9UUEMsIFRQQ19HRVRfQUxBUk0sIDApOworCW1zZ1sxXSA9IDA7CisJbXNnWzJdID0gMDsKKworCXJjID0geGdlbmVfaHdtb25fcGNjX3JkKGN0eCwgbXNnKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlhbXNnWzBdID0gbXNnWzBdOworCWFtc2dbMV0gPSBtc2dbMV07CisJYW1zZ1syXSA9IG1zZ1syXTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB4Z2VuZV9od21vbl9nZXRfY3B1X3B3cihzdHJ1Y3QgeGdlbmVfaHdtb25fZGV2ICpjdHgsIHUzMiAqdmFsKQoreworCXUzMiB3YXR0LCBtd2F0dDsKKwlpbnQgcmM7CisKKwlyYyA9IHhnZW5lX2h3bW9uX3JlZ19tYXBfcmQoY3R4LCBQTURfUFdSX1JFRywgJndhdHQpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJjID0geGdlbmVfaHdtb25fcmVnX21hcF9yZChjdHgsIFBNRF9QV1JfTVdfUkVHLCAmbXdhdHQpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCSp2YWwgPSBXQVRUX1RPX21XQVRUKHdhdHQpICsgbXdhdHQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGdlbmVfaHdtb25fZ2V0X2lvX3B3cihzdHJ1Y3QgeGdlbmVfaHdtb25fZGV2ICpjdHgsIHUzMiAqdmFsKQoreworCXUzMiB3YXR0LCBtd2F0dDsKKwlpbnQgcmM7CisKKwlyYyA9IHhnZW5lX2h3bW9uX3JlZ19tYXBfcmQoY3R4LCBTT0NfUFdSX1JFRywgJndhdHQpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJjID0geGdlbmVfaHdtb25fcmVnX21hcF9yZChjdHgsIFNPQ19QV1JfTVdfUkVHLCAmbXdhdHQpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCSp2YWwgPSBXQVRUX1RPX21XQVRUKHdhdHQpICsgbXdhdHQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGdlbmVfaHdtb25fZ2V0X3RlbXAoc3RydWN0IHhnZW5lX2h3bW9uX2RldiAqY3R4LCB1MzIgKnZhbCkKK3sKKwlyZXR1cm4geGdlbmVfaHdtb25fcmVnX21hcF9yZChjdHgsIFNPQ19URU1QX1JFRywgdmFsKTsKK30KKworLyoKKyAqIFNlbnNvciB0ZW1wZXJhdHVyZS9wb3dlciBmdW5jdGlvbnMKKyAqLworc3RhdGljIHNzaXplX3QgdGVtcDFfaW5wdXRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCB4Z2VuZV9od21vbl9kZXYgKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByYywgdGVtcDsKKwl1MzIgdmFsOworCisJcmMgPSB4Z2VuZV9od21vbl9nZXRfdGVtcChjdHgsICZ2YWwpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXRlbXAgPSBzaWduX2V4dGVuZDMyKHZhbCwgVEVNUF9ORUdBVElWRV9CSVQpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIENFTFNJVVNfVE9fbUNFTFNJVVModGVtcCkpOworfQorCitzdGF0aWMgc3NpemVfdCB0ZW1wMV9sYWJlbF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiU29DIFRlbXBlcmF0dXJlXG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgdGVtcDFfY3JpdGljYWxfYWxhcm1fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkJIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgeGdlbmVfaHdtb25fZGV2ICpjdHggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBjdHgtPnRlbXBfY3JpdGljYWxfYWxhcm0pOworfQorCitzdGF0aWMgc3NpemVfdCBwb3dlcjFfbGFiZWxfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiQ1BVIHBvd2VyXG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgcG93ZXIyX2xhYmVsX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIklPIHBvd2VyXG4iKTsKK30KKworc3RhdGljIHNzaXplX3QgcG93ZXIxX2lucHV0X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgY2hhciAqYnVmKQoreworCXN0cnVjdCB4Z2VuZV9od21vbl9kZXYgKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXUzMiB2YWw7CisJaW50IHJjOworCisJcmMgPSB4Z2VuZV9od21vbl9nZXRfY3B1X3B3cihjdHgsICZ2YWwpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLCBtV0FUVF9UT191V0FUVCh2YWwpKTsKK30KKworc3RhdGljIHNzaXplX3QgcG93ZXIyX2lucHV0X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgY2hhciAqYnVmKQoreworCXN0cnVjdCB4Z2VuZV9od21vbl9kZXYgKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXUzMiB2YWw7CisJaW50IHJjOworCisJcmMgPSB4Z2VuZV9od21vbl9nZXRfaW9fcHdyKGN0eCwgJnZhbCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIG1XQVRUX1RPX3VXQVRUKHZhbCkpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFJfUk8odGVtcDFfbGFiZWwpOworc3RhdGljIERFVklDRV9BVFRSX1JPKHRlbXAxX2lucHV0KTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyh0ZW1wMV9jcml0aWNhbF9hbGFybSk7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8ocG93ZXIxX2xhYmVsKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhwb3dlcjFfaW5wdXQpOworc3RhdGljIERFVklDRV9BVFRSX1JPKHBvd2VyMl9sYWJlbCk7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8ocG93ZXIyX2lucHV0KTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnhnZW5lX2h3bW9uX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX3RlbXAxX2xhYmVsLmF0dHIsCisJJmRldl9hdHRyX3RlbXAxX2lucHV0LmF0dHIsCisJJmRldl9hdHRyX3RlbXAxX2NyaXRpY2FsX2FsYXJtLmF0dHIsCisJJmRldl9hdHRyX3Bvd2VyMV9sYWJlbC5hdHRyLAorCSZkZXZfYXR0cl9wb3dlcjFfaW5wdXQuYXR0ciwKKwkmZGV2X2F0dHJfcG93ZXIyX2xhYmVsLmF0dHIsCisJJmRldl9hdHRyX3Bvd2VyMl9pbnB1dC5hdHRyLAorCU5VTEwsCit9OworCitBVFRSSUJVVEVfR1JPVVBTKHhnZW5lX2h3bW9uKTsKKworc3RhdGljIGludCB4Z2VuZV9od21vbl90cGNfYWxhcm0oc3RydWN0IHhnZW5lX2h3bW9uX2RldiAqY3R4LAorCQkJCSBzdHJ1Y3Qgc2xpbXByb19yZXNwX21zZyAqYW1zZykKK3sKKwljdHgtPnRlbXBfY3JpdGljYWxfYWxhcm0gPSAhIWFtc2ctPnBhcmFtMjsKKwlzeXNmc19ub3RpZnkoJmN0eC0+ZGV2LT5rb2JqLCBOVUxMLCAidGVtcDFfY3JpdGljYWxfYWxhcm0iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB4Z2VuZV9od21vbl9wcm9jZXNzX3B3cm1zZyhzdHJ1Y3QgeGdlbmVfaHdtb25fZGV2ICpjdHgsCisJCQkJICAgICAgIHN0cnVjdCBzbGltcHJvX3Jlc3BfbXNnICphbXNnKQoreworCWlmICgoTVNHX1NVQlRZUEUoYW1zZy0+bXNnKSA9PSBQV1JNR01UX1NVQlRZUEVfVFBDKSAmJgorCSAgICAoVFBDX0NNRChhbXNnLT5tc2cpID09IFRQQ19BTEFSTSkpCisJCXhnZW5lX2h3bW9uX3RwY19hbGFybShjdHgsIGFtc2cpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBhc3luYyB3b3JrIHF1ZXVlCisgKi8KK3N0YXRpYyB2b2lkIHhnZW5lX2h3bW9uX2V2dF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgc2xpbXByb19yZXNwX21zZyBhbXNnOworCXN0cnVjdCB4Z2VuZV9od21vbl9kZXYgKmN0eDsKKwlpbnQgcmV0OworCisJY3R4ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB4Z2VuZV9od21vbl9kZXYsIHdvcmtxKTsKKwl3aGlsZSAoa2ZpZm9fb3V0X3NwaW5sb2NrZWQoJmN0eC0+YXN5bmNfbXNnX2ZpZm8sICZhbXNnLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHNsaW1wcm9fcmVzcF9tc2cpLAorCQkJCSAgICAmY3R4LT5rZmlmb19sb2NrKSkgeworCQkvKgorCQkgKiBJZiBQQ0MsIHNlbmQgYSBjb25zdW1lciBjb21tYW5kIHRvIFBsYXRmb3JtIHRvIGdldCBpbmZvCisJCSAqIElmIFNsaW1wcm8gTWFpbGJveCwgZ2V0IG1lc3NhZ2UgZnJvbSBzcGVjaWZpYyBGSUZPCisJCSAqLworCQlpZiAoIWFjcGlfZGlzYWJsZWQpIHsKKwkJCXJldCA9IHhnZW5lX2h3bW9uX2dldF9ub3RpZmljYXRpb25fbXNnKGN0eCwKKwkJCQkJCQkgICAgICAgKHUzMiAqKSZhbXNnKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKE1TR19UWVBFKGFtc2cubXNnKSA9PSBNU0dfVFlQRV9QV1JNR01UKQorCQkJeGdlbmVfaHdtb25fcHJvY2Vzc19wd3Jtc2coY3R4LCAmYW1zZyk7CisJfQorfQorCitzdGF0aWMgaW50IHhnZW5lX2h3bW9uX3J4X3JlYWR5KHN0cnVjdCB4Z2VuZV9od21vbl9kZXYgKmN0eCwgdm9pZCAqbXNnKQoreworCWlmIChJU19FUlJfT1JfTlVMTChjdHgtPmh3bW9uX2RldikgJiYgIWN0eC0+cmVzcF9wZW5kaW5nKSB7CisJCS8qIEVucXVldWUgdG8gdGhlIEZJRk8gKi8KKwkJa2ZpZm9faW5fc3BpbmxvY2tlZCgmY3R4LT5hc3luY19tc2dfZmlmbywgbXNnLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHNsaW1wcm9fcmVzcF9tc2cpLAorCQkJCSAgICAmY3R4LT5rZmlmb19sb2NrKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBTTElNcHJvIE1haWxib3ggcmVjZWl2ZWQgYSBtZXNzYWdlCisgKi8KK3N0YXRpYyB2b2lkIHhnZW5lX2h3bW9uX3J4X2NiKHN0cnVjdCBtYm94X2NsaWVudCAqY2wsIHZvaWQgKm1zZykKK3sKKwlzdHJ1Y3QgeGdlbmVfaHdtb25fZGV2ICpjdHggPSB0b194Z2VuZV9od21vbl9kZXYoY2wpOworCisJLyoKKwkgKiBXaGlsZSB0aGUgZHJpdmVyIHJlZ2lzdGVycyB3aXRoIHRoZSBtYWlsYm94IGZyYW1ld29yaywgYW4gaW50ZXJydXB0CisJICogY2FuIGJlIHBlbmRpbmcgYmVmb3JlIHRoZSBwcm9iZSBmdW5jdGlvbiBjb21wbGV0ZXMgaXRzCisJICogaW5pdGlhbGl6YXRpb24uIElmIHN1Y2ggY29uZGl0aW9uIG9jY3VycywganVzdCBxdWV1ZSB1cCB0aGUgbWVzc2FnZQorCSAqIGFzIHRoZSBkcml2ZXIgaXMgbm90IHJlYWR5IGZvciBzZXJ2aWNpbmcgdGhlIGNhbGxiYWNrLgorCSAqLworCWlmICh4Z2VuZV9od21vbl9yeF9yZWFkeShjdHgsIG1zZykgPCAwKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFJlc3BvbnNlIG1lc3NhZ2UgZm9ybWF0OgorCSAqIG1zZ1swXSBpcyB0aGUgcmV0dXJuIGNvZGUgb2YgdGhlIG9wZXJhdGlvbgorCSAqIG1zZ1sxXSBpcyB0aGUgZmlyc3QgcGFyYW1ldGVyIHdvcmQKKwkgKiBtc2dbMl0gaXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIgd29yZAorCSAqCisJICogQXMgbWVzc2FnZSBvbmx5IHN1cHBvcnRzIGR3b3JkIHNpemUsIGp1c3QgYXNzaWduIGl0LgorCSAqLworCisJLyogQ2hlY2sgZm9yIHN5bmMgcXVlcnkgKi8KKwlpZiAoY3R4LT5yZXNwX3BlbmRpbmcgJiYKKwkgICAgKChNU0dfVFlQRSgoKHUzMiAqKW1zZylbMF0pID09IE1TR19UWVBFX0VSUikgfHwKKwkgICAgIChNU0dfVFlQRSgoKHUzMiAqKW1zZylbMF0pID09IE1TR19UWVBFX0RCRyAmJgorCSAgICAgIE1TR19TVUJUWVBFKCgodTMyICopbXNnKVswXSkgPT0gREJHX1NVQlRZUEVfU0VOU09SX1JFQUQpIHx8CisJICAgICAoTVNHX1RZUEUoKCh1MzIgKiltc2cpWzBdKSA9PSBNU0dfVFlQRV9QV1JNR01UICYmCisJICAgICAgTVNHX1NVQlRZUEUoKCh1MzIgKiltc2cpWzBdKSA9PSBQV1JNR01UX1NVQlRZUEVfVFBDICYmCisJICAgICAgVFBDX0NNRCgoKHUzMiAqKW1zZylbMF0pID09IFRQQ19BTEFSTSkpKSB7CisJCWN0eC0+c3luY19tc2cubXNnID0gKCh1MzIgKiltc2cpWzBdOworCQljdHgtPnN5bmNfbXNnLnBhcmFtMSA9ICgodTMyICopbXNnKVsxXTsKKwkJY3R4LT5zeW5jX21zZy5wYXJhbTIgPSAoKHUzMiAqKW1zZylbMl07CisKKwkJLyogT3BlcmF0aW9uIHdhaXRpbmcgZm9yIHJlc3BvbnNlICovCisJCWNvbXBsZXRlKCZjdHgtPnJkX2NvbXBsZXRlKTsKKworCQlyZXR1cm47CisJfQorCisJLyogRW5xdWV1ZSB0byB0aGUgRklGTyAqLworCWtmaWZvX2luX3NwaW5sb2NrZWQoJmN0eC0+YXN5bmNfbXNnX2ZpZm8sIG1zZywKKwkJCSAgICBzaXplb2Yoc3RydWN0IHNsaW1wcm9fcmVzcF9tc2cpLCAmY3R4LT5rZmlmb19sb2NrKTsKKwkvKiBTY2hlZHVsZSB0aGUgYm90dG9tIGhhbmRsZXIgKi8KKwlzY2hlZHVsZV93b3JrKCZjdHgtPndvcmtxKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIFBDQyBNYWlsYm94IHJlY2VpdmVkIGEgbWVzc2FnZQorICovCitzdGF0aWMgdm9pZCB4Z2VuZV9od21vbl9wY2NfcnhfY2Ioc3RydWN0IG1ib3hfY2xpZW50ICpjbCwgdm9pZCAqbXNnKQoreworCXN0cnVjdCB4Z2VuZV9od21vbl9kZXYgKmN0eCA9IHRvX3hnZW5lX2h3bW9uX2RldihjbCk7CisJc3RydWN0IGFjcGlfcGNjdF9zaGFyZWRfbWVtb3J5ICpnZW5lcmljX2NvbW1fYmFzZSA9IGN0eC0+cGNjX2NvbW1fYWRkcjsKKwlzdHJ1Y3Qgc2xpbXByb19yZXNwX21zZyBhbXNnOworCisJLyoKKwkgKiBXaGlsZSB0aGUgZHJpdmVyIHJlZ2lzdGVycyB3aXRoIHRoZSBtYWlsYm94IGZyYW1ld29yaywgYW4gaW50ZXJydXB0CisJICogY2FuIGJlIHBlbmRpbmcgYmVmb3JlIHRoZSBwcm9iZSBmdW5jdGlvbiBjb21wbGV0ZXMgaXRzCisJICogaW5pdGlhbGl6YXRpb24uIElmIHN1Y2ggY29uZGl0aW9uIG9jY3VycywganVzdCBxdWV1ZSB1cCB0aGUgbWVzc2FnZQorCSAqIGFzIHRoZSBkcml2ZXIgaXMgbm90IHJlYWR5IGZvciBzZXJ2aWNpbmcgdGhlIGNhbGxiYWNrLgorCSAqLworCWlmICh4Z2VuZV9od21vbl9yeF9yZWFkeShjdHgsICZhbXNnKSA8IDApCisJCXJldHVybjsKKworCW1zZyA9IGdlbmVyaWNfY29tbV9iYXNlICsgMTsKKwkvKiBDaGVjayBpZiBwbGF0Zm9ybSBzZW5kcyBpbnRlcnJ1cHQgKi8KKwlpZiAoIXhnZW5lX3dvcmRfdHN0X2FuZF9jbHIoJmdlbmVyaWNfY29tbV9iYXNlLT5zdGF0dXMsCisJCQkJICAgIFBDQ1NfU0NJX0RPT1JCRUwpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFJlc3BvbnNlIG1lc3NhZ2UgZm9ybWF0OgorCSAqIG1zZ1swXSBpcyB0aGUgcmV0dXJuIGNvZGUgb2YgdGhlIG9wZXJhdGlvbgorCSAqIG1zZ1sxXSBpcyB0aGUgZmlyc3QgcGFyYW1ldGVyIHdvcmQKKwkgKiBtc2dbMl0gaXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIgd29yZAorCSAqCisJICogQXMgbWVzc2FnZSBvbmx5IHN1cHBvcnRzIGR3b3JkIHNpemUsIGp1c3QgYXNzaWduIGl0LgorCSAqLworCisJLyogQ2hlY2sgZm9yIHN5bmMgcXVlcnkgKi8KKwlpZiAoY3R4LT5yZXNwX3BlbmRpbmcgJiYKKwkgICAgKChNU0dfVFlQRSgoKHUzMiAqKW1zZylbMF0pID09IE1TR19UWVBFX0VSUikgfHwKKwkgICAgIChNU0dfVFlQRSgoKHUzMiAqKW1zZylbMF0pID09IE1TR19UWVBFX0RCRyAmJgorCSAgICAgIE1TR19TVUJUWVBFKCgodTMyICopbXNnKVswXSkgPT0gREJHX1NVQlRZUEVfU0VOU09SX1JFQUQpIHx8CisJICAgICAoTVNHX1RZUEUoKCh1MzIgKiltc2cpWzBdKSA9PSBNU0dfVFlQRV9QV1JNR01UICYmCisJICAgICAgTVNHX1NVQlRZUEUoKCh1MzIgKiltc2cpWzBdKSA9PSBQV1JNR01UX1NVQlRZUEVfVFBDICYmCisJICAgICAgVFBDX0NNRCgoKHUzMiAqKW1zZylbMF0pID09IFRQQ19BTEFSTSkpKSB7CisJCS8qIENoZWNrIGlmIHBsYXRmb3JtIGNvbXBsZXRlcyBjb21tYW5kICovCisJCWlmICh4Z2VuZV93b3JkX3RzdF9hbmRfY2xyKCZnZW5lcmljX2NvbW1fYmFzZS0+c3RhdHVzLAorCQkJCQkgICBQQ0NTX0NNRF9DT01QTEVURSkpIHsKKwkJCWN0eC0+c3luY19tc2cubXNnID0gKCh1MzIgKiltc2cpWzBdOworCQkJY3R4LT5zeW5jX21zZy5wYXJhbTEgPSAoKHUzMiAqKW1zZylbMV07CisJCQljdHgtPnN5bmNfbXNnLnBhcmFtMiA9ICgodTMyICopbXNnKVsyXTsKKworCQkJLyogT3BlcmF0aW9uIHdhaXRpbmcgZm9yIHJlc3BvbnNlICovCisJCQljb21wbGV0ZSgmY3R4LT5yZF9jb21wbGV0ZSk7CisKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qCisJICogUGxhdGZvcm0gbm90aWZpZXMgaW50ZXJydXB0IHRvIE9TUE0uCisJICogT1BTTSBzY2hlZHVsZXMgYSBjb25zdW1lciBjb21tYW5kIHRvIGdldCB0aGlzIGluZm9ybWF0aW9uCisJICogaW4gYSB3b3JrcXVldWUuIFBsYXRmb3JtIG11c3Qgd2FpdCB1bnRpbCBPU1BNIGhhcyBpc3N1ZWQKKwkgKiBhIGNvbnN1bWVyIGNvbW1hbmQgdGhhdCBzZXJ2ZXMgdGhpcyBub3RpZmljYXRpb24uCisJICovCisKKwkvKiBFbnF1ZXVlIHRvIHRoZSBGSUZPICovCisJa2ZpZm9faW5fc3BpbmxvY2tlZCgmY3R4LT5hc3luY19tc2dfZmlmbywgJmFtc2csCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBzbGltcHJvX3Jlc3BfbXNnKSwgJmN0eC0+a2ZpZm9fbG9jayk7CisJLyogU2NoZWR1bGUgdGhlIGJvdHRvbSBoYW5kbGVyICovCisJc2NoZWR1bGVfd29yaygmY3R4LT53b3JrcSk7Cit9CisKK3N0YXRpYyB2b2lkIHhnZW5lX2h3bW9uX3R4X2RvbmUoc3RydWN0IG1ib3hfY2xpZW50ICpjbCwgdm9pZCAqbXNnLCBpbnQgcmV0KQoreworCWlmIChyZXQpIHsKKwkJZGV2X2RiZyhjbC0+ZGV2LCAiVFggZGlkIG5vdCBjb21wbGV0ZTogQ01EIHNlbnQ6JXgsIHJldDolZFxuIiwKKwkJCSoodTE2ICopbXNnLCByZXQpOworCX0gZWxzZSB7CisJCWRldl9kYmcoY2wtPmRldiwgIlRYIGNvbXBsZXRlZC4gQ01EIHNlbnQ6JXgsIHJldDolZFxuIiwKKwkJCSoodTE2ICopbXNnLCByZXQpOworCX0KK30KKworc3RhdGljIGludCB4Z2VuZV9od21vbl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB4Z2VuZV9od21vbl9kZXYgKmN0eDsKKwlzdHJ1Y3QgbWJveF9jbGllbnQgKmNsOworCWludCByYzsKKworCWN0eCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmN0eCksIEdGUF9LRVJORUwpOworCWlmICghY3R4KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWN0eC0+ZGV2ID0gJnBkZXYtPmRldjsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjdHgpOworCWNsID0gJmN0eC0+bWJveF9jbGllbnQ7CisKKwlzcGluX2xvY2tfaW5pdCgmY3R4LT5rZmlmb19sb2NrKTsKKwltdXRleF9pbml0KCZjdHgtPnJkX211dGV4KTsKKworCXJjID0ga2ZpZm9fYWxsb2MoJmN0eC0+YXN5bmNfbXNnX2ZpZm8sCisJCQkgc2l6ZW9mKHN0cnVjdCBzbGltcHJvX3Jlc3BfbXNnKSAqIEFTWU5DX01TR19GSUZPX1NJWkUsCisJCQkgR0ZQX0tFUk5FTCk7CisJaWYgKHJjKQorCQlnb3RvIG91dF9tYm94X2ZyZWU7CisKKwlJTklUX1dPUksoJmN0eC0+d29ya3EsIHhnZW5lX2h3bW9uX2V2dF93b3JrKTsKKworCS8qIFJlcXVlc3QgbWFpbGJveCBjaGFubmVsICovCisJY2wtPmRldiA9ICZwZGV2LT5kZXY7CisJY2wtPnR4X2RvbmUgPSB4Z2VuZV9od21vbl90eF9kb25lOworCWNsLT50eF9ibG9jayA9IGZhbHNlOworCWNsLT50eF90b3V0ID0gTUJPWF9PUF9USU1FT1VUTVM7CisJY2wtPmtub3dzX3R4ZG9uZSA9IGZhbHNlOworCWlmIChhY3BpX2Rpc2FibGVkKSB7CisJCWNsLT5yeF9jYWxsYmFjayA9IHhnZW5lX2h3bW9uX3J4X2NiOworCQljdHgtPm1ib3hfY2hhbiA9IG1ib3hfcmVxdWVzdF9jaGFubmVsKGNsLCAwKTsKKwkJaWYgKElTX0VSUihjdHgtPm1ib3hfY2hhbikpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiU0xJTXBybyBtYWlsYm94IGNoYW5uZWwgcmVxdWVzdCBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1Y3QgYWNwaV9wY2N0X2h3X3JlZHVjZWQgKmNwcGNfc3M7CisKKwkJaWYgKGRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMigmcGRldi0+ZGV2LCAicGNjLWNoYW5uZWwiLAorCQkJCQkgICAgICZjdHgtPm1ib3hfaWR4KSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gcGNjLWNoYW5uZWwgcHJvcGVydHlcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQljbC0+cnhfY2FsbGJhY2sgPSB4Z2VuZV9od21vbl9wY2NfcnhfY2I7CisJCWN0eC0+bWJveF9jaGFuID0gcGNjX21ib3hfcmVxdWVzdF9jaGFubmVsKGNsLCBjdHgtPm1ib3hfaWR4KTsKKwkJaWYgKElTX0VSUihjdHgtPm1ib3hfY2hhbikpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiUFBDIGNoYW5uZWwgcmVxdWVzdCBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQkvKgorCQkgKiBUaGUgUENDIG1haWxib3ggY29udHJvbGxlciBkcml2ZXIgc2hvdWxkCisJCSAqIGhhdmUgcGFyc2VkIHRoZSBQQ0NUIChnbG9iYWwgdGFibGUgb2YgYWxsCisJCSAqIFBDQyBjaGFubmVscykgYW5kIHN0b3JlZCBwb2ludGVycyB0byB0aGUKKwkJICogc3Vic3BhY2UgY29tbXVuaWNhdGlvbiByZWdpb24gaW4gY29uX3ByaXYuCisJCSAqLworCQljcHBjX3NzID0gY3R4LT5tYm94X2NoYW4tPmNvbl9wcml2OworCQlpZiAoIWNwcGNfc3MpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIlBQQyBzdWJzcGFjZSBub3QgZm91bmRcbiIpOworCQkJcmMgPSAtRU5PREVWOworCQkJZ290byBvdXRfbWJveF9mcmVlOworCQl9CisKKwkJaWYgKCFjdHgtPm1ib3hfY2hhbi0+bWJveC0+dHhkb25lX2lycSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiUENDIElSUSBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJCXJjID0gLUVOT0RFVjsKKwkJCWdvdG8gb3V0X21ib3hfZnJlZTsKKwkJfQorCisJCS8qCisJCSAqIFRoaXMgaXMgdGhlIHNoYXJlZCBjb21tdW5pY2F0aW9uIHJlZ2lvbgorCQkgKiBmb3IgdGhlIE9TIGFuZCBQbGF0Zm9ybSB0byBjb21tdW5pY2F0ZSBvdmVyLgorCQkgKi8KKwkJY3R4LT5jb21tX2Jhc2VfYWRkciA9IGNwcGNfc3MtPmJhc2VfYWRkcmVzczsKKwkJaWYgKGN0eC0+Y29tbV9iYXNlX2FkZHIpIHsKKwkJCWN0eC0+cGNjX2NvbW1fYWRkciA9IG1lbXJlbWFwKGN0eC0+Y29tbV9iYXNlX2FkZHIsCisJCQkJCQkJY3BwY19zcy0+bGVuZ3RoLAorCQkJCQkJCU1FTVJFTUFQX1dCKTsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgUENDIGNvbW0gcmVnaW9uXG4iKTsKKwkJCXJjID0gLUVOT0RFVjsKKwkJCWdvdG8gb3V0X21ib3hfZnJlZTsKKwkJfQorCisJCWlmICghY3R4LT5wY2NfY29tbV9hZGRyKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIkZhaWxlZCB0byBpb3JlbWFwIFBDQyBjb21tIHJlZ2lvblxuIik7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIG91dF9tYm94X2ZyZWU7CisJCX0KKworCQkvKgorCQkgKiBjcHBjX3NzLT5sYXRlbmN5IGlzIGp1c3QgYSBOb21pbmFsIHZhbHVlLiBJbiByZWFsaXR5CisJCSAqIHRoZSByZW1vdGUgcHJvY2Vzc29yIGNvdWxkIGJlIG11Y2ggc2xvd2VyIHRvIHJlcGx5LgorCQkgKiBTbyBhZGQgYW4gYXJiaXRyYXJ5IGFtb3VudCBvZiB3YWl0IG9uIHRvcCBvZiBOb21pbmFsLgorCQkgKi8KKwkJY3R4LT51c2Vjc19sYXQgPSBQQ0NfTlVNX1JFVFJJRVMgKiBjcHBjX3NzLT5sYXRlbmN5OworCX0KKworCWN0eC0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKGN0eC0+ZGV2LAorCQkJCQkJCSAgICJhcG1feGdlbmUiLAorCQkJCQkJCSAgIGN0eCwKKwkJCQkJCQkgICB4Z2VuZV9od21vbl9ncm91cHMpOworCWlmIChJU19FUlIoY3R4LT5od21vbl9kZXYpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBIVyBtb25pdG9yIGRldmljZVxuIik7CisJCXJjID0gUFRSX0VSUihjdHgtPmh3bW9uX2Rldik7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogU2NoZWR1bGUgdGhlIGJvdHRvbSBoYW5kbGVyIGlmIHRoZXJlIGlzIGEgcGVuZGluZyBtZXNzYWdlLgorCSAqLworCXNjaGVkdWxlX3dvcmsoJmN0eC0+d29ya3EpOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIkFQTSBYLUdlbmUgU29DIEhXIG1vbml0b3IgZHJpdmVyIHJlZ2lzdGVyZWRcbiIpOworCisJcmV0dXJuIDA7CisKK291dDoKKwlpZiAoYWNwaV9kaXNhYmxlZCkKKwkJbWJveF9mcmVlX2NoYW5uZWwoY3R4LT5tYm94X2NoYW4pOworCWVsc2UKKwkJcGNjX21ib3hfZnJlZV9jaGFubmVsKGN0eC0+bWJveF9jaGFuKTsKK291dF9tYm94X2ZyZWU6CisJa2ZpZm9fZnJlZSgmY3R4LT5hc3luY19tc2dfZmlmbyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgeGdlbmVfaHdtb25fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHhnZW5lX2h3bW9uX2RldiAqY3R4ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihjdHgtPmh3bW9uX2Rldik7CisJa2ZpZm9fZnJlZSgmY3R4LT5hc3luY19tc2dfZmlmbyk7CisJaWYgKGFjcGlfZGlzYWJsZWQpCisJCW1ib3hfZnJlZV9jaGFubmVsKGN0eC0+bWJveF9jaGFuKTsKKwllbHNlCisJCXBjY19tYm94X2ZyZWVfY2hhbm5lbChjdHgtPm1ib3hfY2hhbik7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19BQ1BJCitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIHhnZW5lX2h3bW9uX2FjcGlfbWF0Y2hbXSA9IHsKKwl7IkFQTUMwRDI5IiwgMH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShhY3BpLCB4Z2VuZV9od21vbl9hY3BpX21hdGNoKTsKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB4Z2VuZV9od21vbl9vZl9tYXRjaFtdID0geworCXsuY29tcGF0aWJsZSA9ICJhcG0seGdlbmUtc2xpbXByby1od21vbiJ9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgeGdlbmVfaHdtb25fb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB4Z2VuZV9od21vbl9kcml2ZXIgX19yZWZkYXRhID0geworCS5wcm9iZSA9IHhnZW5lX2h3bW9uX3Byb2JlLAorCS5yZW1vdmUgPSB4Z2VuZV9od21vbl9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAieGdlbmUtc2xpbXByby1od21vbiIsCisJCS5vZl9tYXRjaF90YWJsZSA9IHhnZW5lX2h3bW9uX29mX21hdGNoLAorCQkuYWNwaV9tYXRjaF90YWJsZSA9IEFDUElfUFRSKHhnZW5lX2h3bW9uX2FjcGlfbWF0Y2gpLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih4Z2VuZV9od21vbl9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFQTSBYLUdlbmUgU29DIGhhcmR3YXJlIG1vbml0b3IiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRiMTAuYyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRiMTAuYwppbmRleCA0ZDIwYjBiLi5kNzMyNWM2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldGIxMC5jCisrKyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRiMTAuYwpAQCAtMTg0LDggKzE4NCw3IEBACiAKIAlpZiAoY29yZXNpZ2h0X3RpbWVvdXQoZHJ2ZGF0YS0+YmFzZSwgRVRCX0ZGQ1IsIEVUQl9GRkNSX0JJVCwgMCkpIHsKIAkJZGV2X2VycihkcnZkYXRhLT5kZXYsCi0JCQkidGltZW91dCBvYnNlcnZlZCB3aGVuIHByb2JpbmcgYXQgb2Zmc2V0ICUjeFxuIiwKLQkJCUVUQl9GRkNSKTsKKwkJInRpbWVvdXQgd2hpbGUgd2FpdGluZyBmb3IgY29tcGxldGlvbiBvZiBNYW51YWwgRmx1c2hcbiIpOwogCX0KIAogCS8qIGRpc2FibGUgdHJhY2UgY2FwdHVyZSAqLwpAQCAtMTkzLDggKzE5Miw3IEBACiAKIAlpZiAoY29yZXNpZ2h0X3RpbWVvdXQoZHJ2ZGF0YS0+YmFzZSwgRVRCX0ZGU1IsIEVUQl9GRlNSX0JJVCwgMSkpIHsKIAkJZGV2X2VycihkcnZkYXRhLT5kZXYsCi0JCQkidGltZW91dCBvYnNlcnZlZCB3aGVuIHByb2JpbmcgYXQgb2Zmc2V0ICUjeFxuIiwKLQkJCUVUQl9GRkNSKTsKKwkJCSJ0aW1lb3V0IHdoaWxlIHdhaXRpbmcgZm9yIEZvcm1hdHRlciB0byBTdG9wXG4iKTsKIAl9CiAKIAlDU19MT0NLKGRydmRhdGEtPmJhc2UpOwpAQCAtNTYxLDcgKzU1OSw3IEBACiB9OwogCiAjZGVmaW5lIGNvcmVzaWdodF9ldGIxMF9zaW1wbGVfZnVuYyhuYW1lLCBvZmZzZXQpICAgICAgICAgICAgICAgICAgICAgICBcCi0JY29yZXNpZ2h0X3NpbXBsZV9mdW5jKHN0cnVjdCBldGJfZHJ2ZGF0YSwgbmFtZSwgb2Zmc2V0KQorCWNvcmVzaWdodF9zaW1wbGVfZnVuYyhzdHJ1Y3QgZXRiX2RydmRhdGEsIE5VTEwsIG5hbWUsIG9mZnNldCkKIAogY29yZXNpZ2h0X2V0YjEwX3NpbXBsZV9mdW5jKHJkcCwgRVRCX1JBTV9ERVBUSF9SRUcpOwogY29yZXNpZ2h0X2V0YjEwX3NpbXBsZV9mdW5jKHN0cywgRVRCX1NUQVRVU19SRUcpOwpAQCAtNjM4LDcgKzYzNiw3IEBACiAJc3RydWN0IGNvcmVzaWdodF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IE5VTEw7CiAJc3RydWN0IGV0Yl9kcnZkYXRhICpkcnZkYXRhOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJmFkZXYtPnJlczsKLQlzdHJ1Y3QgY29yZXNpZ2h0X2Rlc2MgKmRlc2M7CisJc3RydWN0IGNvcmVzaWdodF9kZXNjIGRlc2MgPSB7IDAgfTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gYWRldi0+ZGV2Lm9mX25vZGU7CiAKIAlpZiAobnApIHsKQEAgLTY4NCwxNyArNjgyLDEzIEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCWRlc2MgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRlc2MpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRlc2MpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZGVzYy0+dHlwZSA9IENPUkVTSUdIVF9ERVZfVFlQRV9TSU5LOwotCWRlc2MtPnN1YnR5cGUuc2lua19zdWJ0eXBlID0gQ09SRVNJR0hUX0RFVl9TVUJUWVBFX1NJTktfQlVGRkVSOwotCWRlc2MtPm9wcyA9ICZldGJfY3Nfb3BzOwotCWRlc2MtPnBkYXRhID0gcGRhdGE7Ci0JZGVzYy0+ZGV2ID0gZGV2OwotCWRlc2MtPmdyb3VwcyA9IGNvcmVzaWdodF9ldGJfZ3JvdXBzOwotCWRydmRhdGEtPmNzZGV2ID0gY29yZXNpZ2h0X3JlZ2lzdGVyKGRlc2MpOworCWRlc2MudHlwZSA9IENPUkVTSUdIVF9ERVZfVFlQRV9TSU5LOworCWRlc2Muc3VidHlwZS5zaW5rX3N1YnR5cGUgPSBDT1JFU0lHSFRfREVWX1NVQlRZUEVfU0lOS19CVUZGRVI7CisJZGVzYy5vcHMgPSAmZXRiX2NzX29wczsKKwlkZXNjLnBkYXRhID0gcGRhdGE7CisJZGVzYy5kZXYgPSBkZXY7CisJZGVzYy5ncm91cHMgPSBjb3Jlc2lnaHRfZXRiX2dyb3VwczsKKwlkcnZkYXRhLT5jc2RldiA9IGNvcmVzaWdodF9yZWdpc3RlcigmZGVzYyk7CiAJaWYgKElTX0VSUihkcnZkYXRhLT5jc2RldikpCiAJCXJldHVybiBQVFJfRVJSKGRydmRhdGEtPmNzZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG0tcGVyZi5jIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG0tcGVyZi5jCmluZGV4IDc1NTEyNWYuLjJjZDdjNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtLXBlcmYuYworKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bS1wZXJmLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCisjaW5jbHVkZSAiY29yZXNpZ2h0LWV0bS1wZXJmLmgiCiAjaW5jbHVkZSAiY29yZXNpZ2h0LXByaXYuaCIKIAogc3RhdGljIHN0cnVjdCBwbXUgZXRtX3BtdTsKQEAgLTcxLDE0ICs3Miw0OCBAQAogCiBzdGF0aWMgdm9pZCBldG1fZXZlbnRfcmVhZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpIHt9CiAKLXN0YXRpYyBpbnQgZXRtX2V2ZW50X2luaXQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQorc3RhdGljIGludCBldG1fYWRkcl9maWx0ZXJzX2FsbG9jKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKLQlpZiAoZXZlbnQtPmF0dHIudHlwZSAhPSBldG1fcG11LnR5cGUpCi0JCXJldHVybiAtRU5PRU5UOworCXN0cnVjdCBldG1fZmlsdGVycyAqZmlsdGVyczsKKwlpbnQgbm9kZSA9IGV2ZW50LT5jcHUgPT0gLTEgPyAtMSA6IGNwdV90b19ub2RlKGV2ZW50LT5jcHUpOworCisJZmlsdGVycyA9IGt6YWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IGV0bV9maWx0ZXJzKSwgR0ZQX0tFUk5FTCwgbm9kZSk7CisJaWYgKCFmaWx0ZXJzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChldmVudC0+cGFyZW50KQorCQltZW1jcHkoZmlsdGVycywgZXZlbnQtPnBhcmVudC0+aHcuYWRkcl9maWx0ZXJzLAorCQkgICAgICAgc2l6ZW9mKCpmaWx0ZXJzKSk7CisKKwlldmVudC0+aHcuYWRkcl9maWx0ZXJzID0gZmlsdGVyczsKIAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBldG1fZXZlbnRfZGVzdHJveShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJa2ZyZWUoZXZlbnQtPmh3LmFkZHJfZmlsdGVycyk7CisJZXZlbnQtPmh3LmFkZHJfZmlsdGVycyA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZXRtX2V2ZW50X2luaXQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCWludCByZXQgPSAwOworCisJaWYgKGV2ZW50LT5hdHRyLnR5cGUgIT0gZXRtX3BtdS50eXBlKSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IGV0bV9hZGRyX2ZpbHRlcnNfYWxsb2MoZXZlbnQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJZXZlbnQtPmRlc3Ryb3kgPSBldG1fZXZlbnRfZGVzdHJveTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgdm9pZCBmcmVlX2V2ZW50X2RhdGEoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCWludCBjcHU7CkBAIC0xMDAsNyArMTM1LDcgQEAKIAl9CiAKIAlmb3JfZWFjaF9jcHUoY3B1LCBtYXNrKSB7Ci0JCWlmIChldmVudF9kYXRhLT5wYXRoW2NwdV0pCisJCWlmICghKElTX0VSUl9PUl9OVUxMKGV2ZW50X2RhdGEtPnBhdGhbY3B1XSkpKQogCQkJY29yZXNpZ2h0X3JlbGVhc2VfcGF0aChldmVudF9kYXRhLT5wYXRoW2NwdV0pOwogCX0KIApAQCAtMTg1LDcgKzIyMCw3IEBACiAJCSAqIHJlZmVyZW5jZWQgbGF0ZXIgd2hlbiB0aGUgcGF0aCBpcyBhY3R1YWxseSBuZWVkZWQuCiAJCSAqLwogCQlldmVudF9kYXRhLT5wYXRoW2NwdV0gPSBjb3Jlc2lnaHRfYnVpbGRfcGF0aChjc2Rldik7Ci0JCWlmICghZXZlbnRfZGF0YS0+cGF0aFtjcHVdKQorCQlpZiAoSVNfRVJSKGV2ZW50X2RhdGEtPnBhdGhbY3B1XSkpCiAJCQlnb3RvIGVycjsKIAl9CiAKQEAgLTI1OCw3ICsyOTMsNyBAQAogCWV2ZW50LT5ody5zdGF0ZSA9IDA7CiAKIAkvKiBGaW5hbGx5IGVuYWJsZSB0aGUgdHJhY2VyICovCi0JaWYgKHNvdXJjZV9vcHMoY3NkZXYpLT5lbmFibGUoY3NkZXYsICZldmVudC0+YXR0ciwgQ1NfTU9ERV9QRVJGKSkKKwlpZiAoc291cmNlX29wcyhjc2RldiktPmVuYWJsZShjc2RldiwgZXZlbnQsIENTX01PREVfUEVSRikpCiAJCWdvdG8gZmFpbF9lbmRfc3RvcDsKIAogb3V0OgpAQCAtMjkxLDcgKzMyNiw3IEBACiAJCXJldHVybjsKIAogCS8qIHN0b3AgdHJhY2VyICovCi0Jc291cmNlX29wcyhjc2RldiktPmRpc2FibGUoY3NkZXYpOworCXNvdXJjZV9vcHMoY3NkZXYpLT5kaXNhYmxlKGNzZGV2LCBldmVudCk7CiAKIAkvKiB0ZWxsIHRoZSBjb3JlICovCiAJZXZlbnQtPmh3LnN0YXRlID0gUEVSRl9IRVNfU1RPUFBFRDsKQEAgLTM0Miw2ICszNzcsODcgQEAKIAlldG1fZXZlbnRfc3RvcChldmVudCwgUEVSRl9FRl9VUERBVEUpOwogfQogCitzdGF0aWMgaW50IGV0bV9hZGRyX2ZpbHRlcnNfdmFsaWRhdGUoc3RydWN0IGxpc3RfaGVhZCAqZmlsdGVycykKK3sKKwlib29sIHJhbmdlID0gZmFsc2UsIGFkZHJlc3MgPSBmYWxzZTsKKwlpbnQgaW5kZXggPSAwOworCXN0cnVjdCBwZXJmX2FkZHJfZmlsdGVyICpmaWx0ZXI7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZpbHRlciwgZmlsdGVycywgZW50cnkpIHsKKwkJLyoKKwkJICogTm8gbmVlZCB0byBnbyBmdXJ0aGVyIGlmIHRoZXJlJ3Mgbm8gbW9yZQorCQkgKiByb29tIGZvciBmaWx0ZXJzLgorCQkgKi8KKwkJaWYgKCsraW5kZXggPiBFVE1fQUREUl9DTVBfTUFYKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJCS8qCisJCSAqIEFzIHRha2VuIGZyb20gdGhlIHN0cnVjdCBwZXJmX2FkZHJfZmlsdGVyIGRvY3VtZW50YXRpb246CisJCSAqCUByYW5nZToJMTogcmFuZ2UsIDA6IGFkZHJlc3MKKwkJICoKKwkJICogQXQgdGhpcyB0aW1lIHdlIGRvbid0IGFsbG93IHJhbmdlIGFuZCBzdGFydC9zdG9wIGZpbHRlcmluZworCQkgKiB0byBjb2hhYml0YXRlLCB0aGV5IGhhdmUgdG8gYmUgbXV0dWFsbHkgZXhjbHVzaXZlLgorCQkgKi8KKwkJaWYgKChmaWx0ZXItPnJhbmdlID09IDEpICYmIGFkZHJlc3MpCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkJaWYgKChmaWx0ZXItPnJhbmdlID09IDApICYmIHJhbmdlKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJCS8qCisJCSAqIEZvciByYW5nZSBmaWx0ZXJpbmcsIHRoZSBzZWNvbmQgYWRkcmVzcyBpbiB0aGUgYWRkcmVzcworCQkgKiByYW5nZSBjb21wYXJhdG9yIG5lZWRzIHRvIGJlIGhpZ2hlciB0aGFuIHRoZSBmaXJzdC4KKwkJICogSW52YWxpZCBvdGhlcndpc2UuCisJCSAqLworCQlpZiAoZmlsdGVyLT5yYW5nZSAmJiBmaWx0ZXItPnNpemUgPT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qCisJCSAqIEV2ZXJ5dGhpbmcgY2hlY2tzIG91dCB3aXRoIHRoaXMgZmlsdGVyLCByZWNvcmQgd2hhdCB3ZSd2ZQorCQkgKiByZWNlaXZlZCBiZWZvcmUgbW92aW5nIG9uIHRvIHRoZSBuZXh0IG9uZS4KKwkJICovCisJCWlmIChmaWx0ZXItPnJhbmdlKQorCQkJcmFuZ2UgPSB0cnVlOworCQllbHNlCisJCQlhZGRyZXNzID0gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZXRtX2FkZHJfZmlsdGVyc19zeW5jKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgcGVyZl9hZGRyX2ZpbHRlcnNfaGVhZCAqaGVhZCA9IHBlcmZfZXZlbnRfYWRkcl9maWx0ZXJzKGV2ZW50KTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0LCBzdG9wLCAqb2ZmcyA9IGV2ZW50LT5hZGRyX2ZpbHRlcnNfb2ZmczsKKwlzdHJ1Y3QgZXRtX2ZpbHRlcnMgKmZpbHRlcnMgPSBldmVudC0+aHcuYWRkcl9maWx0ZXJzOworCXN0cnVjdCBldG1fZmlsdGVyICpldG1fZmlsdGVyOworCXN0cnVjdCBwZXJmX2FkZHJfZmlsdGVyICpmaWx0ZXI7CisJaW50IGkgPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmaWx0ZXIsICZoZWFkLT5saXN0LCBlbnRyeSkgeworCQlzdGFydCA9IGZpbHRlci0+b2Zmc2V0ICsgb2Zmc1tpXTsKKwkJc3RvcCA9IHN0YXJ0ICsgZmlsdGVyLT5zaXplOworCQlldG1fZmlsdGVyID0gJmZpbHRlcnMtPmV0bV9maWx0ZXJbaV07CisKKwkJaWYgKGZpbHRlci0+cmFuZ2UgPT0gMSkgeworCQkJZXRtX2ZpbHRlci0+c3RhcnRfYWRkciA9IHN0YXJ0OworCQkJZXRtX2ZpbHRlci0+c3RvcF9hZGRyID0gc3RvcDsKKwkJCWV0bV9maWx0ZXItPnR5cGUgPSBFVE1fQUREUl9UWVBFX1JBTkdFOworCQl9IGVsc2UgeworCQkJaWYgKGZpbHRlci0+ZmlsdGVyID09IDEpIHsKKwkJCQlldG1fZmlsdGVyLT5zdGFydF9hZGRyID0gc3RhcnQ7CisJCQkJZXRtX2ZpbHRlci0+dHlwZSA9IEVUTV9BRERSX1RZUEVfU1RBUlQ7CisJCQl9IGVsc2UgeworCQkJCWV0bV9maWx0ZXItPnN0b3BfYWRkciA9IHN0b3A7CisJCQkJZXRtX2ZpbHRlci0+dHlwZSA9IEVUTV9BRERSX1RZUEVfU1RPUDsKKwkJCX0KKwkJfQorCQlpKys7CisJfQorCisJZmlsdGVycy0+bnJfZmlsdGVycyA9IGk7Cit9CisKIGludCBldG1fcGVyZl9zeW1saW5rKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2RldiwgYm9vbCBsaW5rKQogewogCWNoYXIgZW50cnlbc2l6ZW9mKCJjcHU5OTk5OTk5IildOwpAQCAtMzcxLDE4ICs0ODcsMjEgQEAKIHsKIAlpbnQgcmV0OwogCi0JZXRtX3BtdS5jYXBhYmlsaXRpZXMJPSBQRVJGX1BNVV9DQVBfRVhDTFVTSVZFOworCWV0bV9wbXUuY2FwYWJpbGl0aWVzCQk9IFBFUkZfUE1VX0NBUF9FWENMVVNJVkU7CiAKLQlldG1fcG11LmF0dHJfZ3JvdXBzCT0gZXRtX3BtdV9hdHRyX2dyb3VwczsKLQlldG1fcG11LnRhc2tfY3R4X25yCT0gcGVyZl9zd19jb250ZXh0OwotCWV0bV9wbXUucmVhZAkJPSBldG1fZXZlbnRfcmVhZDsKLQlldG1fcG11LmV2ZW50X2luaXQJPSBldG1fZXZlbnRfaW5pdDsKLQlldG1fcG11LnNldHVwX2F1eAk9IGV0bV9zZXR1cF9hdXg7Ci0JZXRtX3BtdS5mcmVlX2F1eAk9IGV0bV9mcmVlX2F1eDsKLQlldG1fcG11LnN0YXJ0CQk9IGV0bV9ldmVudF9zdGFydDsKLQlldG1fcG11LnN0b3AJCT0gZXRtX2V2ZW50X3N0b3A7Ci0JZXRtX3BtdS5hZGQJCT0gZXRtX2V2ZW50X2FkZDsKLQlldG1fcG11LmRlbAkJPSBldG1fZXZlbnRfZGVsOworCWV0bV9wbXUuYXR0cl9ncm91cHMJCT0gZXRtX3BtdV9hdHRyX2dyb3VwczsKKwlldG1fcG11LnRhc2tfY3R4X25yCQk9IHBlcmZfc3dfY29udGV4dDsKKwlldG1fcG11LnJlYWQJCQk9IGV0bV9ldmVudF9yZWFkOworCWV0bV9wbXUuZXZlbnRfaW5pdAkJPSBldG1fZXZlbnRfaW5pdDsKKwlldG1fcG11LnNldHVwX2F1eAkJPSBldG1fc2V0dXBfYXV4OworCWV0bV9wbXUuZnJlZV9hdXgJCT0gZXRtX2ZyZWVfYXV4OworCWV0bV9wbXUuc3RhcnQJCQk9IGV0bV9ldmVudF9zdGFydDsKKwlldG1fcG11LnN0b3AJCQk9IGV0bV9ldmVudF9zdG9wOworCWV0bV9wbXUuYWRkCQkJPSBldG1fZXZlbnRfYWRkOworCWV0bV9wbXUuZGVsCQkJPSBldG1fZXZlbnRfZGVsOworCWV0bV9wbXUuYWRkcl9maWx0ZXJzX3N5bmMJPSBldG1fYWRkcl9maWx0ZXJzX3N5bmM7CisJZXRtX3BtdS5hZGRyX2ZpbHRlcnNfdmFsaWRhdGUJPSBldG1fYWRkcl9maWx0ZXJzX3ZhbGlkYXRlOworCWV0bV9wbXUubnJfYWRkcl9maWx0ZXJzCQk9IEVUTV9BRERSX0NNUF9NQVg7CiAKIAlyZXQgPSBwZXJmX3BtdV9yZWdpc3RlcigmZXRtX3BtdSwgQ09SRVNJR0hUX0VUTV9QTVVfTkFNRSwgLTEpOwogCWlmIChyZXQgPT0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtLXBlcmYuaCBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtLXBlcmYuaAppbmRleCA4N2Y1YTEzLi4zZmZjOWZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bS1wZXJmLmgKKysrIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG0tcGVyZi5oCkBAIC0xOCw4ICsxOCw0MiBAQAogI2lmbmRlZiBfQ09SRVNJR0hUX0VUTV9QRVJGX0gKICNkZWZpbmUgX0NPUkVTSUdIVF9FVE1fUEVSRl9ICiAKKyNpbmNsdWRlICJjb3Jlc2lnaHQtcHJpdi5oIgorCiBzdHJ1Y3QgY29yZXNpZ2h0X2RldmljZTsKIAorLyoKKyAqIEluIGJvdGggRVRNdjMgYW5kIHY0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBhZGRyZXNzIGNvbXBhcmF0b3IgaW1wbGVudGFibGUKKyAqIGlzIDguICBUaGUgYWN0dWFsIG51bWJlciBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBhbmQgd2lsbCBiZSBjaGVja2VkCisgKiB3aGVuIGZpbHRlcnMgYXJlIGFwcGxpZWQuCisgKi8KKyNkZWZpbmUgRVRNX0FERFJfQ01QX01BWAk4CisKKy8qKgorICogc3RydWN0IGV0bV9maWx0ZXIgLSBzaW5nbGUgaW5zdHJ1Y3Rpb24gcmFuZ2Ugb3Igc3RhcnQvc3RvcCBjb25maWd1cmF0aW9uLgorICogQHN0YXJ0X2FkZHI6CVRoZSBhZGRyZXNzIHRvIHN0YXJ0IHRyYWNpbmcgb24uCisgKiBAc3RvcF9hZGRyOglUaGUgYWRkcmVzcyB0byBzdG9wIHRyYWNpbmcgb24uCisgKiBAdHlwZToJSXMgdGhpcyBhIHJhbmdlIG9yIHN0YXJ0L3N0b3AgZmlsdGVyLgorICovCitzdHJ1Y3QgZXRtX2ZpbHRlciB7CisJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyOworCXVuc2lnbmVkIGxvbmcgc3RvcF9hZGRyOworCWVudW0gZXRtX2FkZHJfdHlwZSB0eXBlOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZXRtX2ZpbHRlcnMgLSBzZXQgb2YgZmlsdGVycyBmb3IgYSBzZXNzaW9uCisgKiBAZXRtX2ZpbHRlcjoJQWxsIHRoZSBmaWx0ZXJzIGZvciB0aGlzIHNlc3Npb24uCisgKiBAbnJfZmlsdGVyczoJTnVtYmVyIG9mIGZpbHRlcnMKKyAqIEBzc3N0YXR1czoJU3RhdHVzIG9mIHRoZSBzdGFydC9zdG9wIGxvZ2ljLgorICovCitzdHJ1Y3QgZXRtX2ZpbHRlcnMgeworCXN0cnVjdCBldG1fZmlsdGVyCWV0bV9maWx0ZXJbRVRNX0FERFJfQ01QX01BWF07CisJdW5zaWduZWQgaW50CQlucl9maWx0ZXJzOworCWJvb2wJCQlzc3N0YXR1czsKK307CisKKwogI2lmZGVmIENPTkZJR19DT1JFU0lHSFQKIGludCBldG1fcGVyZl9zeW1saW5rKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2RldiwgYm9vbCBsaW5rKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG0uaCBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtLmgKaW5kZXggNTE1OTdjYi4uNGExOGVlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG0uaAorKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bS5oCkBAIC0yNTksMTQgKzI1OSw2IEBACiAJc3RydWN0IGV0bV9jb25maWcJCWNvbmZpZzsKIH07CiAKLWVudW0gZXRtX2FkZHJfdHlwZSB7Ci0JRVRNX0FERFJfVFlQRV9OT05FLAotCUVUTV9BRERSX1RZUEVfU0lOR0xFLAotCUVUTV9BRERSX1RZUEVfUkFOR0UsCi0JRVRNX0FERFJfVFlQRV9TVEFSVCwKLQlFVE1fQUREUl9UWVBFX1NUT1AsCi19OwotCiBzdGF0aWMgaW5saW5lIHZvaWQgZXRtX3dyaXRlbChzdHJ1Y3QgZXRtX2RydmRhdGEgKmRydmRhdGEsCiAJCQkgICAgICB1MzIgdmFsLCB1MzIgb2ZmKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG0zeC1zeXNmcy5jIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG0zeC1zeXNmcy5jCmluZGV4IDAyZDRiNjIuLmU5YjA3MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtM3gtc3lzZnMuYworKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bTN4LXN5c2ZzLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlICJjb3Jlc2lnaHQtZXRtLmgiCisjaW5jbHVkZSAiY29yZXNpZ2h0LXByaXYuaCIKIAogc3RhdGljIHNzaXplX3QgbnJfYWRkcl9jbXBfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKQEAgLTEyMjIsNyArMTIyMyw3IEBACiB9OwogCiAjZGVmaW5lIGNvcmVzaWdodF9ldG0zeF9zaW1wbGVfZnVuYyhuYW1lLCBvZmZzZXQpCQkJXAotCWNvcmVzaWdodF9zaW1wbGVfZnVuYyhzdHJ1Y3QgZXRtX2RydmRhdGEsIG5hbWUsIG9mZnNldCkKKwljb3Jlc2lnaHRfc2ltcGxlX2Z1bmMoc3RydWN0IGV0bV9kcnZkYXRhLCBOVUxMLCBuYW1lLCBvZmZzZXQpCiAKIGNvcmVzaWdodF9ldG0zeF9zaW1wbGVfZnVuYyhldG1jY3IsIEVUTUNDUik7CiBjb3Jlc2lnaHRfZXRtM3hfc2ltcGxlX2Z1bmMoZXRtY2NlciwgRVRNQ0NFUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bTN4LmMgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bTN4LmMKaW5kZXggMmRlNGNhZC4uM2ZlMzY4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG0zeC5jCisrKyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtM3guYwpAQCAtMzExLDkgKzMxMSwxMCBAQAogI2RlZmluZSBFVE0zWF9TVVBQT1JURURfT1BUSU9OUyAoRVRNQ1JfQ1lDX0FDQyB8IEVUTUNSX1RJTUVTVEFNUF9FTikKIAogc3RhdGljIGludCBldG1fcGFyc2VfZXZlbnRfY29uZmlnKHN0cnVjdCBldG1fZHJ2ZGF0YSAqZHJ2ZGF0YSwKLQkJCQkgIHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIpCisJCQkJICBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CiAJc3RydWN0IGV0bV9jb25maWcgKmNvbmZpZyA9ICZkcnZkYXRhLT5jb25maWc7CisJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciA9ICZldmVudC0+YXR0cjsKIAogCWlmICghYXR0cikKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC00NTksNyArNDYwLDcgQEAKIH0KIAogc3RhdGljIGludCBldG1fZW5hYmxlX3BlcmYoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2LAotCQkJICAgc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0cikKKwkJCSAgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKIAlzdHJ1Y3QgZXRtX2RydmRhdGEgKmRydmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoY3NkZXYtPmRldi5wYXJlbnQpOwogCkBAIC00NjcsNyArNDY4LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBDb25maWd1cmUgdGhlIHRyYWNlciBiYXNlZCBvbiB0aGUgc2Vzc2lvbidzIHNwZWNpZmljcyAqLwotCWV0bV9wYXJzZV9ldmVudF9jb25maWcoZHJ2ZGF0YSwgYXR0cik7CisJZXRtX3BhcnNlX2V2ZW50X2NvbmZpZyhkcnZkYXRhLCBldmVudCk7CiAJLyogQW5kIGVuYWJsZSBpdCAqLwogCWV0bV9lbmFibGVfaHcoZHJ2ZGF0YSk7CiAKQEAgLTUwNCw3ICs1MDUsNyBAQAogfQogCiBzdGF0aWMgaW50IGV0bV9lbmFibGUoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2LAotCQkgICAgICBzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyLCB1MzIgbW9kZSkKKwkJICAgICAgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCB1MzIgbW9kZSkKIHsKIAlpbnQgcmV0OwogCXUzMiB2YWw7CkBAIC01MjEsNyArNTIyLDcgQEAKIAkJcmV0ID0gZXRtX2VuYWJsZV9zeXNmcyhjc2Rldik7CiAJCWJyZWFrOwogCWNhc2UgQ1NfTU9ERV9QRVJGOgotCQlyZXQgPSBldG1fZW5hYmxlX3BlcmYoY3NkZXYsIGF0dHIpOworCQlyZXQgPSBldG1fZW5hYmxlX3BlcmYoY3NkZXYsIGV2ZW50KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVJTlZBTDsKQEAgLTYwMSw3ICs2MDIsOCBAQAogCWRldl9pbmZvKGRydmRhdGEtPmRldiwgIkVUTSB0cmFjaW5nIGRpc2FibGVkXG4iKTsKIH0KIAotc3RhdGljIHZvaWQgZXRtX2Rpc2FibGUoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2KQorc3RhdGljIHZvaWQgZXRtX2Rpc2FibGUoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2LAorCQkJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewogCXUzMiBtb2RlOwogCXN0cnVjdCBldG1fZHJ2ZGF0YSAqZHJ2ZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShjc2Rldi0+ZGV2LnBhcmVudCk7CkBAIC03NTYsMTMgKzc1OCw5IEBACiAJc3RydWN0IGNvcmVzaWdodF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IE5VTEw7CiAJc3RydWN0IGV0bV9kcnZkYXRhICpkcnZkYXRhOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJmFkZXYtPnJlczsKLQlzdHJ1Y3QgY29yZXNpZ2h0X2Rlc2MgKmRlc2M7CisJc3RydWN0IGNvcmVzaWdodF9kZXNjIGRlc2MgPSB7IDAgfTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gYWRldi0+ZGV2Lm9mX25vZGU7CiAKLQlkZXNjID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpkZXNjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXNjKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCWRydmRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRydmRhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRydmRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtODI1LDEzICs4MjMsMTMgQEAKIAlldG1faW5pdF90cmFjZV9pZChkcnZkYXRhKTsKIAlldG1fc2V0X2RlZmF1bHQoJmRydmRhdGEtPmNvbmZpZyk7CiAKLQlkZXNjLT50eXBlID0gQ09SRVNJR0hUX0RFVl9UWVBFX1NPVVJDRTsKLQlkZXNjLT5zdWJ0eXBlLnNvdXJjZV9zdWJ0eXBlID0gQ09SRVNJR0hUX0RFVl9TVUJUWVBFX1NPVVJDRV9QUk9DOwotCWRlc2MtPm9wcyA9ICZldG1fY3Nfb3BzOwotCWRlc2MtPnBkYXRhID0gcGRhdGE7Ci0JZGVzYy0+ZGV2ID0gZGV2OwotCWRlc2MtPmdyb3VwcyA9IGNvcmVzaWdodF9ldG1fZ3JvdXBzOwotCWRydmRhdGEtPmNzZGV2ID0gY29yZXNpZ2h0X3JlZ2lzdGVyKGRlc2MpOworCWRlc2MudHlwZSA9IENPUkVTSUdIVF9ERVZfVFlQRV9TT1VSQ0U7CisJZGVzYy5zdWJ0eXBlLnNvdXJjZV9zdWJ0eXBlID0gQ09SRVNJR0hUX0RFVl9TVUJUWVBFX1NPVVJDRV9QUk9DOworCWRlc2Mub3BzID0gJmV0bV9jc19vcHM7CisJZGVzYy5wZGF0YSA9IHBkYXRhOworCWRlc2MuZGV2ID0gZGV2OworCWRlc2MuZ3JvdXBzID0gY29yZXNpZ2h0X2V0bV9ncm91cHM7CisJZHJ2ZGF0YS0+Y3NkZXYgPSBjb3Jlc2lnaHRfcmVnaXN0ZXIoJmRlc2MpOwogCWlmIChJU19FUlIoZHJ2ZGF0YS0+Y3NkZXYpKSB7CiAJCXJldCA9IFBUUl9FUlIoZHJ2ZGF0YS0+Y3NkZXYpOwogCQlnb3RvIGVycl9hcmNoX3N1cHBvcnRlZDsKQEAgLTg5Myw2ICs4OTEsMTEgQEAKIAkJLm1hc2sJPSAweDAwMDNmZmZmLAogCQkuZGF0YQk9ICJFVE0gMy4zIiwKIAl9LAorCXsJLyogRVRNIDMuNSAtIENvcnRleC1BNSAqLworCQkuaWQJPSAweDAwMDNiOTU1LAorCQkubWFzawk9IDB4MDAwM2ZmZmYsCisJCS5kYXRhCT0gIkVUTSAzLjUiLAorCX0sCiAJewkvKiBFVE0gMy41ICovCiAJCS5pZAk9IDB4MDAwM2I5NTYsCiAJCS5tYXNrCT0gMHgwMDAzZmZmZiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtNHgtc3lzZnMuYyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtNHgtc3lzZnMuYwppbmRleCA3Yzg0MzA4Li5iOWIxZTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bTR4LXN5c2ZzLmMKKysrIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG00eC1zeXNmcy5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSAiY29yZXNpZ2h0LWV0bTR4LmgiCisjaW5jbHVkZSAiY29yZXNpZ2h0LXByaXYuaCIKIAogc3RhdGljIGludCBldG00X3NldF9tb2RlX2V4Y2x1ZGUoc3RydWN0IGV0bXY0X2RydmRhdGEgKmRydmRhdGEsIGJvb2wgZXhjbHVkZSkKIHsKQEAgLTIwMzksMTUgKzIwNDAsNDIgQEAKIAlOVUxMLAogfTsKIAotI2RlZmluZSBjb3Jlc2lnaHRfZXRtNHhfc2ltcGxlX2Z1bmMobmFtZSwgb2Zmc2V0KQkJCVwKLQljb3Jlc2lnaHRfc2ltcGxlX2Z1bmMoc3RydWN0IGV0bXY0X2RydmRhdGEsIG5hbWUsIG9mZnNldCkKK3N0cnVjdCBldG12NF9yZWcgeworCXZvaWQgX19pb21lbSAqYWRkcjsKKwl1MzIgZGF0YTsKK307CiAKLWNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNvc2xzciwgVFJDT1NMU1IpOworc3RhdGljIHZvaWQgZG9fc21wX2Nyb3NzX3JlYWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZXRtdjRfcmVnICpyZWcgPSBkYXRhOworCisJcmVnLT5kYXRhID0gcmVhZGxfcmVsYXhlZChyZWctPmFkZHIpOworfQorCitzdGF0aWMgdTMyIGV0bXY0X2Nyb3NzX3JlYWQoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCB1MzIgb2Zmc2V0KQoreworCXN0cnVjdCBldG12NF9kcnZkYXRhICpkcnZkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGV0bXY0X3JlZyByZWc7CisKKwlyZWcuYWRkciA9IGRydmRhdGEtPmJhc2UgKyBvZmZzZXQ7CisJLyoKKwkgKiBzbXAgY3Jvc3MgY2FsbCBlbnN1cmVzIHRoZSBDUFUgd2lsbCBiZSBwb3dlcmVkIHVwIGJlZm9yZQorCSAqIGFjY2Vzc2luZyB0aGUgRVRNdjQgdHJhY2UgY29yZSByZWdpc3RlcnMKKwkgKi8KKwlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoZHJ2ZGF0YS0+Y3B1LCBkb19zbXBfY3Jvc3NfcmVhZCwgJnJlZywgMSk7CisJcmV0dXJuIHJlZy5kYXRhOworfQorCisjZGVmaW5lIGNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyhuYW1lLCBvZmZzZXQpCQkJXAorCWNvcmVzaWdodF9zaW1wbGVfZnVuYyhzdHJ1Y3QgZXRtdjRfZHJ2ZGF0YSwgTlVMTCwgbmFtZSwgb2Zmc2V0KQorCisjZGVmaW5lIGNvcmVzaWdodF9ldG00eF9jcm9zc19yZWFkKG5hbWUsIG9mZnNldCkJCQlcCisJY29yZXNpZ2h0X3NpbXBsZV9mdW5jKHN0cnVjdCBldG12NF9kcnZkYXRhLCBldG12NF9jcm9zc19yZWFkLAlcCisJCQkgICAgICBuYW1lLCBvZmZzZXQpCisKIGNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNwZGNyLCBUUkNQRENSKTsKIGNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNwZHNyLCBUUkNQRFNSKTsKIGNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNsc3IsIFRSQ0xTUik7Ci1jb3Jlc2lnaHRfZXRtNHhfc2ltcGxlX2Z1bmModHJjY29uZmlnLCBUUkNDT05GSUdSKTsKLWNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmN0cmFjZWlkLCBUUkNUUkFDRUlEUik7CiBjb3Jlc2lnaHRfZXRtNHhfc2ltcGxlX2Z1bmModHJjYXV0aHN0YXR1cywgVFJDQVVUSFNUQVRVUyk7CiBjb3Jlc2lnaHRfZXRtNHhfc2ltcGxlX2Z1bmModHJjZGV2aWQsIFRSQ0RFVklEKTsKIGNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNkZXZ0eXBlLCBUUkNERVZUWVBFKTsKQEAgLTIwNTUsNiArMjA4Myw5IEBACiBjb3Jlc2lnaHRfZXRtNHhfc2ltcGxlX2Z1bmModHJjcGlkcjEsIFRSQ1BJRFIxKTsKIGNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNwaWRyMiwgVFJDUElEUjIpOwogY29yZXNpZ2h0X2V0bTR4X3NpbXBsZV9mdW5jKHRyY3BpZHIzLCBUUkNQSURSMyk7Citjb3Jlc2lnaHRfZXRtNHhfY3Jvc3NfcmVhZCh0cmNvc2xzciwgVFJDT1NMU1IpOworY29yZXNpZ2h0X2V0bTR4X2Nyb3NzX3JlYWQodHJjY29uZmlnLCBUUkNDT05GSUdSKTsKK2NvcmVzaWdodF9ldG00eF9jcm9zc19yZWFkKHRyY3RyYWNlaWQsIFRSQ1RSQUNFSURSKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmNvcmVzaWdodF9ldG12NF9tZ210X2F0dHJzW10gPSB7CiAJJmRldl9hdHRyX3RyY29zbHNyLmF0dHIsCkBAIC0yMDczLDE5ICsyMTA0LDE5IEBACiAJTlVMTCwKIH07CiAKLWNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNpZHIwLCBUUkNJRFIwKTsKLWNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNpZHIxLCBUUkNJRFIxKTsKLWNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNpZHIyLCBUUkNJRFIyKTsKLWNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNpZHIzLCBUUkNJRFIzKTsKLWNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNpZHI0LCBUUkNJRFI0KTsKLWNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNpZHI1LCBUUkNJRFI1KTsKK2NvcmVzaWdodF9ldG00eF9jcm9zc19yZWFkKHRyY2lkcjAsIFRSQ0lEUjApOworY29yZXNpZ2h0X2V0bTR4X2Nyb3NzX3JlYWQodHJjaWRyMSwgVFJDSURSMSk7Citjb3Jlc2lnaHRfZXRtNHhfY3Jvc3NfcmVhZCh0cmNpZHIyLCBUUkNJRFIyKTsKK2NvcmVzaWdodF9ldG00eF9jcm9zc19yZWFkKHRyY2lkcjMsIFRSQ0lEUjMpOworY29yZXNpZ2h0X2V0bTR4X2Nyb3NzX3JlYWQodHJjaWRyNCwgVFJDSURSNCk7Citjb3Jlc2lnaHRfZXRtNHhfY3Jvc3NfcmVhZCh0cmNpZHI1LCBUUkNJRFI1KTsKIC8qIHRyY2lkcls2LDddIGFyZSByZXNlcnZlZCAqLwotY29yZXNpZ2h0X2V0bTR4X3NpbXBsZV9mdW5jKHRyY2lkcjgsIFRSQ0lEUjgpOwotY29yZXNpZ2h0X2V0bTR4X3NpbXBsZV9mdW5jKHRyY2lkcjksIFRSQ0lEUjkpOwotY29yZXNpZ2h0X2V0bTR4X3NpbXBsZV9mdW5jKHRyY2lkcjEwLCBUUkNJRFIxMCk7Ci1jb3Jlc2lnaHRfZXRtNHhfc2ltcGxlX2Z1bmModHJjaWRyMTEsIFRSQ0lEUjExKTsKLWNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNpZHIxMiwgVFJDSURSMTIpOwotY29yZXNpZ2h0X2V0bTR4X3NpbXBsZV9mdW5jKHRyY2lkcjEzLCBUUkNJRFIxMyk7Citjb3Jlc2lnaHRfZXRtNHhfY3Jvc3NfcmVhZCh0cmNpZHI4LCBUUkNJRFI4KTsKK2NvcmVzaWdodF9ldG00eF9jcm9zc19yZWFkKHRyY2lkcjksIFRSQ0lEUjkpOworY29yZXNpZ2h0X2V0bTR4X2Nyb3NzX3JlYWQodHJjaWRyMTAsIFRSQ0lEUjEwKTsKK2NvcmVzaWdodF9ldG00eF9jcm9zc19yZWFkKHRyY2lkcjExLCBUUkNJRFIxMSk7Citjb3Jlc2lnaHRfZXRtNHhfY3Jvc3NfcmVhZCh0cmNpZHIxMiwgVFJDSURSMTIpOworY29yZXNpZ2h0X2V0bTR4X2Nyb3NzX3JlYWQodHJjaWRyMTMsIFRSQ0lEUjEzKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmNvcmVzaWdodF9ldG12NF90cmNpZHJfYXR0cnNbXSA9IHsKIAkmZGV2X2F0dHJfdHJjaWRyMC5hdHRyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG00eC5jIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG00eC5jCmluZGV4IDFhNWUwZDEuLjRkYjhkNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtNHguYworKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bTR4LmMKQEAgLTMzLDcgKzMzLDYgQEAKICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAjaW5jbHVkZSA8YXNtL2xvY2FsLmg+CiAKQEAgLTQ2LDcgKzQ1LDkgQEAKIC8qIFRoZSBudW1iZXIgb2YgRVRNdjQgY3VycmVudGx5IHJlZ2lzdGVyZWQgKi8KIHN0YXRpYyBpbnQgZXRtNF9jb3VudDsKIHN0YXRpYyBzdHJ1Y3QgZXRtdjRfZHJ2ZGF0YSAqZXRtZHJ2ZGF0YVtOUl9DUFVTXTsKLXN0YXRpYyB2b2lkIGV0bTRfc2V0X2RlZmF1bHQoc3RydWN0IGV0bXY0X2NvbmZpZyAqY29uZmlnKTsKK3N0YXRpYyB2b2lkIGV0bTRfc2V0X2RlZmF1bHRfY29uZmlnKHN0cnVjdCBldG12NF9jb25maWcgKmNvbmZpZyk7CitzdGF0aWMgaW50IGV0bTRfc2V0X2V2ZW50X2ZpbHRlcnMoc3RydWN0IGV0bXY0X2RydmRhdGEgKmRydmRhdGEsCisJCQkJICBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpOwogCiBzdGF0aWMgZW51bSBjcHVocF9zdGF0ZSBocF9vbmxpbmU7CiAKQEAgLTc5LDIyICs4MCw4IEBACiBzdGF0aWMgaW50IGV0bTRfdHJhY2VfaWQoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2KQogewogCXN0cnVjdCBldG12NF9kcnZkYXRhICpkcnZkYXRhID0gZGV2X2dldF9kcnZkYXRhKGNzZGV2LT5kZXYucGFyZW50KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCB0cmFjZV9pZCA9IC0xOwogCi0JaWYgKCFsb2NhbF9yZWFkKCZkcnZkYXRhLT5tb2RlKSkKLQkJcmV0dXJuIGRydmRhdGEtPnRyY2lkOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRydmRhdGEtPnNwaW5sb2NrLCBmbGFncyk7Ci0KLQlDU19VTkxPQ0soZHJ2ZGF0YS0+YmFzZSk7Ci0JdHJhY2VfaWQgPSByZWFkbF9yZWxheGVkKGRydmRhdGEtPmJhc2UgKyBUUkNUUkFDRUlEUik7Ci0JdHJhY2VfaWQgJj0gRVRNX1RSQUNFSURfTUFTSzsKLQlDU19MT0NLKGRydmRhdGEtPmJhc2UpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHJ2ZGF0YS0+c3BpbmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiB0cmFjZV9pZDsKKwlyZXR1cm4gZHJ2ZGF0YS0+dHJjaWQ7CiB9CiAKIHN0YXRpYyB2b2lkIGV0bTRfZW5hYmxlX2h3KHZvaWQgKmluZm8pCkBAIC0xMTMsOCArMTAwLDcgQEAKIAkvKiB3YWl0IGZvciBUUkNTVEFUUi5JRExFIHRvIGdvIHVwICovCiAJaWYgKGNvcmVzaWdodF90aW1lb3V0KGRydmRhdGEtPmJhc2UsIFRSQ1NUQVRSLCBUUkNTVEFUUl9JRExFX0JJVCwgMSkpCiAJCWRldl9lcnIoZHJ2ZGF0YS0+ZGV2LAotCQkJInRpbWVvdXQgb2JzZXJ2ZWQgd2hlbiBwcm9iaW5nIGF0IG9mZnNldCAlI3hcbiIsCi0JCQlUUkNTVEFUUik7CisJCQkidGltZW91dCB3aGlsZSB3YWl0aW5nIGZvciBJZGxlIFRyYWNlIFN0YXR1c1xuIik7CiAKIAl3cml0ZWxfcmVsYXhlZChjb25maWctPnBlX3NlbCwgZHJ2ZGF0YS0+YmFzZSArIFRSQ1BST0NTRUxSKTsKIAl3cml0ZWxfcmVsYXhlZChjb25maWctPmNmZywgZHJ2ZGF0YS0+YmFzZSArIFRSQ0NPTkZJR1IpOwpAQCAtMTgwLDE0ICsxNjYsMjAgQEAKIAl3cml0ZWxfcmVsYXhlZChjb25maWctPnZtaWRfbWFzazAsIGRydmRhdGEtPmJhc2UgKyBUUkNWTUlEQ0NUTFIwKTsKIAl3cml0ZWxfcmVsYXhlZChjb25maWctPnZtaWRfbWFzazEsIGRydmRhdGEtPmJhc2UgKyBUUkNWTUlEQ0NUTFIxKTsKIAorCS8qCisJICogUmVxdWVzdCB0byBrZWVwIHRoZSB0cmFjZSB1bml0IHBvd2VyZWQgYW5kIGFsc28KKwkgKiBlbXVsYXRpb24gb2YgcG93ZXJkb3duCisJICovCisJd3JpdGVsX3JlbGF4ZWQocmVhZGxfcmVsYXhlZChkcnZkYXRhLT5iYXNlICsgVFJDUERDUikgfCBUUkNQRENSX1BVLAorCQkgICAgICAgZHJ2ZGF0YS0+YmFzZSArIFRSQ1BEQ1IpOworCiAJLyogRW5hYmxlIHRoZSB0cmFjZSB1bml0ICovCiAJd3JpdGVsX3JlbGF4ZWQoMSwgZHJ2ZGF0YS0+YmFzZSArIFRSQ1BSR0NUTFIpOwogCiAJLyogd2FpdCBmb3IgVFJDU1RBVFIuSURMRSB0byBnbyBiYWNrIGRvd24gdG8gJzAnICovCiAJaWYgKGNvcmVzaWdodF90aW1lb3V0KGRydmRhdGEtPmJhc2UsIFRSQ1NUQVRSLCBUUkNTVEFUUl9JRExFX0JJVCwgMCkpCiAJCWRldl9lcnIoZHJ2ZGF0YS0+ZGV2LAotCQkJInRpbWVvdXQgb2JzZXJ2ZWQgd2hlbiBwcm9iaW5nIGF0IG9mZnNldCAlI3hcbiIsCi0JCQlUUkNTVEFUUik7CisJCQkidGltZW91dCB3aGlsZSB3YWl0aW5nIGZvciBJZGxlIFRyYWNlIFN0YXR1c1xuIik7CiAKIAlDU19MT0NLKGRydmRhdGEtPmJhc2UpOwogCkBAIC0xOTUsMTIgKzE4NywxNiBAQAogfQogCiBzdGF0aWMgaW50IGV0bTRfcGFyc2VfZXZlbnRfY29uZmlnKHN0cnVjdCBldG12NF9kcnZkYXRhICpkcnZkYXRhLAotCQkJCSAgIHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIpCisJCQkJICAgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogeworCWludCByZXQgPSAwOwogCXN0cnVjdCBldG12NF9jb25maWcgKmNvbmZpZyA9ICZkcnZkYXRhLT5jb25maWc7CisJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciA9ICZldmVudC0+YXR0cjsKIAotCWlmICghYXR0cikKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFhdHRyKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KIAogCS8qIENsZWFyIGNvbmZpZ3VyYXRpb24gZnJvbSBwcmV2aW91cyBydW4gKi8KIAltZW1zZXQoY29uZmlnLCAwLCBzaXplb2Yoc3RydWN0IGV0bXY0X2NvbmZpZykpOwpAQCAtMjEyLDE0ICsyMDgsMTIgQEAKIAkJY29uZmlnLT5tb2RlID0gRVRNX01PREVfRVhDTF9VU0VSOwogCiAJLyogQWx3YXlzIHN0YXJ0IGZyb20gdGhlIGRlZmF1bHQgY29uZmlnICovCi0JZXRtNF9zZXRfZGVmYXVsdChjb25maWcpOworCWV0bTRfc2V0X2RlZmF1bHRfY29uZmlnKGNvbmZpZyk7CiAKLQkvKgotCSAqIEJ5IGRlZmF1bHQgdGhlIHRyYWNlcnMgYXJlIGNvbmZpZ3VyZWQgdG8gdHJhY2UgdGhlIHdob2xlIGFkZHJlc3MKLQkgKiByYW5nZS4gIE5hcnJvdyB0aGUgZmllbGQgb25seSBpZiByZXF1ZXN0ZWQgYnkgdXNlciBzcGFjZS4KLQkgKi8KLQlpZiAoY29uZmlnLT5tb2RlKQotCQlldG00X2NvbmZpZ190cmFjZV9tb2RlKGNvbmZpZyk7CisJLyogQ29uZmlndXJlIGZpbHRlcnMgc3BlY2lmaWVkIG9uIHRoZSBwZXJmIGNtZCBsaW5lLCBpZiBhbnkuICovCisJcmV0ID0gZXRtNF9zZXRfZXZlbnRfZmlsdGVycyhkcnZkYXRhLCBldmVudCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CiAKIAkvKiBHbyBmcm9tIGdlbmVyaWMgb3B0aW9uIHRvIEVUTXY0IHNwZWNpZmljcyAqLwogCWlmIChhdHRyLT5jb25maWcgJiBCSVQoRVRNX09QVF9DWUNBQ0MpKQpAQCAtMjI3LDIzICsyMjEsMzAgQEAKIAlpZiAoYXR0ci0+Y29uZmlnICYgQklUKEVUTV9PUFRfVFMpKQogCQljb25maWctPmNmZyB8PSBFVE12NF9NT0RFX1RJTUVTVEFNUDsKIAotCXJldHVybiAwOworb3V0OgorCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZXRtNF9lbmFibGVfcGVyZihzdHJ1Y3QgY29yZXNpZ2h0X2RldmljZSAqY3NkZXYsCi0JCQkgICAgc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0cikKKwkJCSAgICBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CisJaW50IHJldCA9IDA7CiAJc3RydWN0IGV0bXY0X2RydmRhdGEgKmRydmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoY3NkZXYtPmRldi5wYXJlbnQpOwogCi0JaWYgKFdBUk5fT05fT05DRShkcnZkYXRhLT5jcHUgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKFdBUk5fT05fT05DRShkcnZkYXRhLT5jcHUgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpKSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CiAKIAkvKiBDb25maWd1cmUgdGhlIHRyYWNlciBiYXNlZCBvbiB0aGUgc2Vzc2lvbidzIHNwZWNpZmljcyAqLwotCWV0bTRfcGFyc2VfZXZlbnRfY29uZmlnKGRydmRhdGEsIGF0dHIpOworCXJldCA9IGV0bTRfcGFyc2VfZXZlbnRfY29uZmlnKGRydmRhdGEsIGV2ZW50KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKIAkvKiBBbmQgZW5hYmxlIGl0ICovCiAJZXRtNF9lbmFibGVfaHcoZHJ2ZGF0YSk7CiAKLQlyZXR1cm4gMDsKK291dDoKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGV0bTRfZW5hYmxlX3N5c2ZzKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2RldikKQEAgLTI3NCw3ICsyNzUsNyBAQAogfQogCiBzdGF0aWMgaW50IGV0bTRfZW5hYmxlKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2RldiwKLQkJICAgICAgIHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIsIHUzMiBtb2RlKQorCQkgICAgICAgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCB1MzIgbW9kZSkKIHsKIAlpbnQgcmV0OwogCXUzMiB2YWw7CkBAIC0yOTEsNyArMjkyLDcgQEAKIAkJcmV0ID0gZXRtNF9lbmFibGVfc3lzZnMoY3NkZXYpOwogCQlicmVhazsKIAljYXNlIENTX01PREVfUEVSRjoKLQkJcmV0ID0gZXRtNF9lbmFibGVfcGVyZihjc2RldiwgYXR0cik7CisJCXJldCA9IGV0bTRfZW5hYmxlX3BlcmYoY3NkZXYsIGV2ZW50KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVJTlZBTDsKQEAgLTMxMSw2ICszMTIsMTEgQEAKIAogCUNTX1VOTE9DSyhkcnZkYXRhLT5iYXNlKTsKIAorCS8qIHBvd2VyIGNhbiBiZSByZW1vdmVkIGZyb20gdGhlIHRyYWNlIHVuaXQgbm93ICovCisJY29udHJvbCA9IHJlYWRsX3JlbGF4ZWQoZHJ2ZGF0YS0+YmFzZSArIFRSQ1BEQ1IpOworCWNvbnRyb2wgJj0gflRSQ1BEQ1JfUFU7CisJd3JpdGVsX3JlbGF4ZWQoY29udHJvbCwgZHJ2ZGF0YS0+YmFzZSArIFRSQ1BEQ1IpOworCiAJY29udHJvbCA9IHJlYWRsX3JlbGF4ZWQoZHJ2ZGF0YS0+YmFzZSArIFRSQ1BSR0NUTFIpOwogCiAJLyogRU4sIGJpdFswXSBUcmFjZSB1bml0IGVuYWJsZSBiaXQgKi8KQEAgLTMyNiwxNCArMzMyLDI4IEBACiAJZGV2X2RiZyhkcnZkYXRhLT5kZXYsICJjcHU6ICVkIGRpc2FibGUgc21wIGNhbGwgZG9uZVxuIiwgZHJ2ZGF0YS0+Y3B1KTsKIH0KIAotc3RhdGljIGludCBldG00X2Rpc2FibGVfcGVyZihzdHJ1Y3QgY29yZXNpZ2h0X2RldmljZSAqY3NkZXYpCitzdGF0aWMgaW50IGV0bTRfZGlzYWJsZV9wZXJmKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2RldiwKKwkJCSAgICAgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogeworCXUzMiBjb250cm9sOworCXN0cnVjdCBldG1fZmlsdGVycyAqZmlsdGVycyA9IGV2ZW50LT5ody5hZGRyX2ZpbHRlcnM7CiAJc3RydWN0IGV0bXY0X2RydmRhdGEgKmRydmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoY3NkZXYtPmRldi5wYXJlbnQpOwogCiAJaWYgKFdBUk5fT05fT05DRShkcnZkYXRhLT5jcHUgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlldG00X2Rpc2FibGVfaHcoZHJ2ZGF0YSk7CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBzdGFydC9zdG9wIGxvZ2ljIHdhcyBhY3RpdmUgd2hlbiB0aGUgdW5pdCB3YXMgc3RvcHBlZC4KKwkgKiBUaGF0IHdheSB3ZSBjYW4gcmUtZW5hYmxlIHRoZSBzdGFydC9zdG9wIGxvZ2ljIHdoZW4gdGhlIHByb2Nlc3MgaXMKKwkgKiBzY2hlZHVsZWQgYWdhaW4uICBDb25maWd1cmF0aW9uIG9mIHRoZSBzdGFydC9zdG9wIGxvZ2ljIGhhcHBlbnMgaW4KKwkgKiBmdW5jdGlvbiBldG00X3NldF9ldmVudF9maWx0ZXJzKCkuCisJICovCisJY29udHJvbCA9IHJlYWRsX3JlbGF4ZWQoZHJ2ZGF0YS0+YmFzZSArIFRSQ1ZJQ1RMUik7CisJLyogVFJDVklDVExSOjpTU1NUQVRVUywgYml0WzldICovCisJZmlsdGVycy0+c3NzdGF0dXMgPSAoY29udHJvbCAmIEJJVCg5KSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzYyLDcgKzM4Miw4IEBACiAJZGV2X2luZm8oZHJ2ZGF0YS0+ZGV2LCAiRVRNIHRyYWNpbmcgZGlzYWJsZWRcbiIpOwogfQogCi1zdGF0aWMgdm9pZCBldG00X2Rpc2FibGUoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2KQorc3RhdGljIHZvaWQgZXRtNF9kaXNhYmxlKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2RldiwKKwkJCSBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CiAJdTMyIG1vZGU7CiAJc3RydWN0IGV0bXY0X2RydmRhdGEgKmRydmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoY3NkZXYtPmRldi5wYXJlbnQpOwpAQCAtMzgxLDcgKzQwMiw3IEBACiAJCWV0bTRfZGlzYWJsZV9zeXNmcyhjc2Rldik7CiAJCWJyZWFrOwogCWNhc2UgQ1NfTU9ERV9QRVJGOgotCQlldG00X2Rpc2FibGVfcGVyZihjc2Rldik7CisJCWV0bTRfZGlzYWJsZV9wZXJmKGNzZGV2LCBldmVudCk7CiAJCWJyZWFrOwogCX0KIApAQCAtNTY0LDIxICs1ODUsOCBAQAogCUNTX0xPQ0soZHJ2ZGF0YS0+YmFzZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGV0bTRfc2V0X2RlZmF1bHQoc3RydWN0IGV0bXY0X2NvbmZpZyAqY29uZmlnKQorc3RhdGljIHZvaWQgZXRtNF9zZXRfZGVmYXVsdF9jb25maWcoc3RydWN0IGV0bXY0X2NvbmZpZyAqY29uZmlnKQogewotCWlmIChXQVJOX09OX09OQ0UoIWNvbmZpZykpCi0JCXJldHVybjsKLQotCS8qCi0JICogTWFrZSBkZWZhdWx0IGluaXRpYWxpc2F0aW9uIHRyYWNlIGV2ZXJ5dGhpbmcKLQkgKgotCSAqIFNlbGVjdCB0aGUgImFsd2F5cyB0cnVlIiByZXNvdXJjZSBzZWxlY3RvciBvbiB0aGUKLQkgKiAiRW5hYmxpZ24gRXZlbnQiIGxpbmUgYW5kIGNvbmZpZ3VyZSBhZGRyZXNzIHJhbmdlIGNvbXBhcmF0b3IKLQkgKiAnMCcgdG8gdHJhY2UgYWxsIHRoZSBwb3NzaWJsZSBhZGRyZXNzIHJhbmdlLiAgRnJvbSB0aGVyZQotCSAqIGNvbmZpZ3VyZSB0aGUgImluY2x1ZGUvZXhjbHVkZSIgZW5naW5lIHRvIGluY2x1ZGUgYWRkcmVzcwotCSAqIHJhbmdlIGNvbXBhcmF0b3IgJzAnLgotCSAqLwotCiAJLyogZGlzYWJsZSBhbGwgZXZlbnRzIHRyYWNpbmcgKi8KIAljb25maWctPmV2ZW50Y3RybDAgPSAweDA7CiAJY29uZmlnLT5ldmVudGN0cmwxID0gMHgwOwpAQCAtNTk0LDYgKzYwMiwxMDggQEAKIAogCS8qIFRSQ1ZJQ1RMUjo6RVZFTlQgPSAweDAxLCBzZWxlY3QgdGhlIGFsd2F5cyBvbiBsb2dpYyAqLwogCWNvbmZpZy0+dmluc3RfY3RybCB8PSBCSVQoMCk7Cit9CisKK3N0YXRpYyB1NjQgZXRtNF9nZXRfYWNjZXNzX3R5cGUoc3RydWN0IGV0bXY0X2NvbmZpZyAqY29uZmlnKQoreworCXU2NCBhY2Nlc3NfdHlwZSA9IDA7CisKKwkvKgorCSAqIEVYTEVWRUxfTlMsIGJpdHNbMTU6MTJdCisJICogVGhlIEV4Y2VwdGlvbiBsZXZlbHMgYXJlOgorCSAqICAgQml0WzEyXSBFeGNlcHRpb24gbGV2ZWwgMCAtIEFwcGxpY2F0aW9uCisJICogICBCaXRbMTNdIEV4Y2VwdGlvbiBsZXZlbCAxIC0gT1MKKwkgKiAgIEJpdFsxNF0gRXhjZXB0aW9uIGxldmVsIDIgLSBIeXBlcnZpc29yCisJICogICBCaXRbMTVdIE5ldmVyIGltcGxlbWVudGVkCisJICoKKwkgKiBBbHdheXMgc3RheSBhd2F5IGZyb20gaHlwZXJ2aXNvciBtb2RlLgorCSAqLworCWFjY2Vzc190eXBlID0gRVRNX0VYTEVWRUxfTlNfSFlQOworCisJaWYgKGNvbmZpZy0+bW9kZSAmIEVUTV9NT0RFX0VYQ0xfS0VSTikKKwkJYWNjZXNzX3R5cGUgfD0gRVRNX0VYTEVWRUxfTlNfT1M7CisKKwlpZiAoY29uZmlnLT5tb2RlICYgRVRNX01PREVfRVhDTF9VU0VSKQorCQlhY2Nlc3NfdHlwZSB8PSBFVE1fRVhMRVZFTF9OU19BUFA7CisKKwkvKgorCSAqIEVYTEVWRUxfUywgYml0c1sxMTo4XSwgZG9uJ3QgdHJhY2UgYW55dGhpbmcgaGFwcGVuaW5nCisJICogaW4gc2VjdXJlIHN0YXRlLgorCSAqLworCWFjY2Vzc190eXBlIHw9IChFVE1fRVhMRVZFTF9TX0FQUAl8CisJCQlFVE1fRVhMRVZFTF9TX09TCXwKKwkJCUVUTV9FWExFVkVMX1NfSFlQKTsKKworCXJldHVybiBhY2Nlc3NfdHlwZTsKK30KKworc3RhdGljIHZvaWQgZXRtNF9zZXRfY29tcGFyYXRvcl9maWx0ZXIoc3RydWN0IGV0bXY0X2NvbmZpZyAqY29uZmlnLAorCQkJCSAgICAgICB1NjQgc3RhcnQsIHU2NCBzdG9wLCBpbnQgY29tcGFyYXRvcikKK3sKKwl1NjQgYWNjZXNzX3R5cGUgPSBldG00X2dldF9hY2Nlc3NfdHlwZShjb25maWcpOworCisJLyogRmlyc3QgaGFsZiBvZiBkZWZhdWx0IGFkZHJlc3MgY29tcGFyYXRvciAqLworCWNvbmZpZy0+YWRkcl92YWxbY29tcGFyYXRvcl0gPSBzdGFydDsKKwljb25maWctPmFkZHJfYWNjW2NvbXBhcmF0b3JdID0gYWNjZXNzX3R5cGU7CisJY29uZmlnLT5hZGRyX3R5cGVbY29tcGFyYXRvcl0gPSBFVE1fQUREUl9UWVBFX1JBTkdFOworCisJLyogU2Vjb25kIGhhbGYgb2YgZGVmYXVsdCBhZGRyZXNzIGNvbXBhcmF0b3IgKi8KKwljb25maWctPmFkZHJfdmFsW2NvbXBhcmF0b3IgKyAxXSA9IHN0b3A7CisJY29uZmlnLT5hZGRyX2FjY1tjb21wYXJhdG9yICsgMV0gPSBhY2Nlc3NfdHlwZTsKKwljb25maWctPmFkZHJfdHlwZVtjb21wYXJhdG9yICsgMV0gPSBFVE1fQUREUl9UWVBFX1JBTkdFOworCisJLyoKKwkgKiBDb25maWd1cmUgdGhlIFZpZXdJbnN0IGZ1bmN0aW9uIHRvIGluY2x1ZGUgdGhpcyBhZGRyZXNzIHJhbmdlCisJICogY29tcGFyYXRvci4KKwkgKgorCSAqIEBjb21wYXJhdG9yIGlzIGRpdmlkZWQgYnkgdHdvIHNpbmNlIGl0IGlzIHRoZSBpbmRleCBpbiB0aGUKKwkgKiBldG12NF9jb25maWc6OmFkZHJfdmFsIGFycmF5IGJ1dCByZWdpc3RlciBUUkNWSUlFQ1RMUiBkZWFscyB3aXRoCisJICogYWRkcmVzcyByYW5nZSBjb21wYXJhdG9yIF9wYWlyc18uCisJICoKKwkgKiBUaGVyZWZvcmU6CisJICoJaW5kZXggMCAtPiBjb21wYXRhdG9yIHBhaXIgMAorCSAqCWluZGV4IDIgLT4gY29tcGFyYXRvciBwYWlyIDEKKwkgKglpbmRleCA0IC0+IGNvbXBhcmF0b3IgcGFpciAyCisJICoJLi4uCisJICoJaW5kZXggMTQgLT4gY29tcGFyYXRvciBwYWlyIDcKKwkgKi8KKwljb25maWctPnZpaWVjdGxyIHw9IEJJVChjb21wYXJhdG9yIC8gMik7Cit9CisKK3N0YXRpYyB2b2lkIGV0bTRfc2V0X3N0YXJ0X3N0b3BfZmlsdGVyKHN0cnVjdCBldG12NF9jb25maWcgKmNvbmZpZywKKwkJCQkgICAgICAgdTY0IGFkZHJlc3MsIGludCBjb21wYXJhdG9yLAorCQkJCSAgICAgICBlbnVtIGV0bV9hZGRyX3R5cGUgdHlwZSkKK3sKKwlpbnQgc2hpZnQ7CisJdTY0IGFjY2Vzc190eXBlID0gZXRtNF9nZXRfYWNjZXNzX3R5cGUoY29uZmlnKTsKKworCS8qIENvbmZpZ3VyZSB0aGUgY29tcGFyYXRvciAqLworCWNvbmZpZy0+YWRkcl92YWxbY29tcGFyYXRvcl0gPSBhZGRyZXNzOworCWNvbmZpZy0+YWRkcl9hY2NbY29tcGFyYXRvcl0gPSBhY2Nlc3NfdHlwZTsKKwljb25maWctPmFkZHJfdHlwZVtjb21wYXJhdG9yXSA9IHR5cGU7CisKKwkvKgorCSAqIENvbmZpZ3VyZSBWaWV3SW5zdCBTdGFydC1TdG9wIGNvbnRyb2wgcmVnaXN0ZXIuCisJICogQWRkcmVzc2VzIGNvbmZpZ3VyZWQgdG8gc3RhcnQgdHJhY2luZyBnbyBmcm9tIGJpdCAwIHRvIG4tMSwKKwkgKiB3aGlsZSB0aG9zZSBjb25maWd1cmVkIHRvIHN0b3AgdHJhY2luZyBmcm9tIDE2IHRvIDE2ICsgbi0xLgorCSAqLworCXNoaWZ0ID0gKHR5cGUgPT0gRVRNX0FERFJfVFlQRV9TVEFSVCA/IDAgOiAxNik7CisJY29uZmlnLT52aXNzY3RsciB8PSBCSVQoc2hpZnQgKyBjb21wYXJhdG9yKTsKK30KKworc3RhdGljIHZvaWQgZXRtNF9zZXRfZGVmYXVsdF9maWx0ZXIoc3RydWN0IGV0bXY0X2NvbmZpZyAqY29uZmlnKQoreworCXU2NCBzdGFydCwgc3RvcDsKKworCS8qCisJICogQ29uZmlndXJlIGFkZHJlc3MgcmFuZ2UgY29tcGFyYXRvciAnMCcgdG8gZW5jb21wYXNzIGFsbAorCSAqIHBvc3NpYmxlIGFkZHJlc3Nlcy4KKwkgKi8KKwlzdGFydCA9IDB4MDsKKwlzdG9wID0gfjB4MDsKKworCWV0bTRfc2V0X2NvbXBhcmF0b3JfZmlsdGVyKGNvbmZpZywgc3RhcnQsIHN0b3AsCisJCQkJICAgRVRNX0RFRkFVTFRfQUREUl9DT01QKTsKIAogCS8qCiAJICogVFJDVklDVExSOjpTU1NUQVRVUyA9PSAxLCB0aGUgc3RhcnQtc3RvcCBsb2dpYyBpcwpAQCAtNjAxLDQ1ICs3MTEsMTU4IEBACiAJICovCiAJY29uZmlnLT52aW5zdF9jdHJsIHw9IEJJVCg5KTsKIAotCS8qCi0JICogQ29uZmlndXJlIGFkZHJlc3MgcmFuZ2UgY29tcGFyYXRvciAnMCcgdG8gZW5jb21wYXNzIGFsbAotCSAqIHBvc3NpYmxlIGFkZHJlc3Nlcy4KLQkgKi8KLQotCS8qIEZpcnN0IGhhbGYgb2YgZGVmYXVsdCBhZGRyZXNzIGNvbXBhcmF0b3I6IHN0YXJ0IGF0IGFkZHJlc3MgMCAqLwotCWNvbmZpZy0+YWRkcl92YWxbRVRNX0RFRkFVTFRfQUREUl9DT01QXSA9IDB4MDsKLQkvKiB0cmFjZSBpbnN0cnVjdGlvbiBhZGRyZXNzZXMgKi8KLQljb25maWctPmFkZHJfYWNjW0VUTV9ERUZBVUxUX0FERFJfQ09NUF0gJj0gfihCSVQoMCkgfCBCSVQoMSkpOwotCS8qIEVYTEVWRUxfTlMsIGJpdHNbMTI6MTVdLCBvbmx5IHRyYWNlIGFwcGxpY2F0aW9uIGFuZCBrZXJuZWwgc3BhY2UgKi8KLQljb25maWctPmFkZHJfYWNjW0VUTV9ERUZBVUxUX0FERFJfQ09NUF0gfD0gRVRNX0VYTEVWRUxfTlNfSFlQOwotCS8qIEVYTEVWRUxfUywgYml0c1sxMTo4XSwgZG9uJ3QgdHJhY2UgYW55dGhpbmcgaW4gc2VjdXJlIHN0YXRlICovCi0JY29uZmlnLT5hZGRyX2FjY1tFVE1fREVGQVVMVF9BRERSX0NPTVBdIHw9IChFVE1fRVhMRVZFTF9TX0FQUCB8Ci0JCQkJCQkgICAgRVRNX0VYTEVWRUxfU19PUyB8Ci0JCQkJCQkgICAgRVRNX0VYTEVWRUxfU19IWVApOwotCWNvbmZpZy0+YWRkcl90eXBlW0VUTV9ERUZBVUxUX0FERFJfQ09NUF0gPSBFVE1fQUREUl9UWVBFX1JBTkdFOwotCi0JLyoKLQkgKiBTZWNvbmQgaGFsZiBvZiBkZWZhdWx0IGFkZHJlc3MgY29tcGFyYXRvcjogZ28gYWxsCi0JICogdGhlIHdheSB0byB0aGUgdG9wLgotCSovCi0JY29uZmlnLT5hZGRyX3ZhbFtFVE1fREVGQVVMVF9BRERSX0NPTVAgKyAxXSA9IH4weDA7Ci0JLyogdHJhY2UgaW5zdHJ1Y3Rpb24gYWRkcmVzc2VzICovCi0JY29uZmlnLT5hZGRyX2FjY1tFVE1fREVGQVVMVF9BRERSX0NPTVAgKyAxXSAmPSB+KEJJVCgwKSB8IEJJVCgxKSk7Ci0JLyogQWRkcmVzcyBjb21wYXJhdG9yIHR5cGUgbXVzdCBiZSBlcXVhbCBmb3IgYm90aCBoYWx2ZXMgKi8KLQljb25maWctPmFkZHJfYWNjW0VUTV9ERUZBVUxUX0FERFJfQ09NUCArIDFdID0KLQkJCQkJY29uZmlnLT5hZGRyX2FjY1tFVE1fREVGQVVMVF9BRERSX0NPTVBdOwotCWNvbmZpZy0+YWRkcl90eXBlW0VUTV9ERUZBVUxUX0FERFJfQ09NUCArIDFdID0gRVRNX0FERFJfVFlQRV9SQU5HRTsKLQotCS8qCi0JICogQ29uZmlndXJlIHRoZSBWaWV3SW5zdCBmdW5jdGlvbiB0byBmaWx0ZXIgb24gYWRkcmVzcyByYW5nZQotCSAqIGNvbXBhcmF0b3IgJzAnLgotCSAqLwotCWNvbmZpZy0+dmlpZWN0bHIgPSBCSVQoMCk7Ci0KLQkvKiBubyBzdGFydC1zdG9wIGZpbHRlcmluZyBmb3IgVmlld0luc3QgKi8KKwkvKiBObyBzdGFydC1zdG9wIGZpbHRlcmluZyBmb3IgVmlld0luc3QgKi8KIAljb25maWctPnZpc3NjdGxyID0gMHgwOwogfQogCitzdGF0aWMgdm9pZCBldG00X3NldF9kZWZhdWx0KHN0cnVjdCBldG12NF9jb25maWcgKmNvbmZpZykKK3sKKwlpZiAoV0FSTl9PTl9PTkNFKCFjb25maWcpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIE1ha2UgZGVmYXVsdCBpbml0aWFsaXNhdGlvbiB0cmFjZSBldmVyeXRoaW5nCisJICoKKwkgKiBTZWxlY3QgdGhlICJhbHdheXMgdHJ1ZSIgcmVzb3VyY2Ugc2VsZWN0b3Igb24gdGhlCisJICogIkVuYWJsaWduIEV2ZW50IiBsaW5lIGFuZCBjb25maWd1cmUgYWRkcmVzcyByYW5nZSBjb21wYXJhdG9yCisJICogJzAnIHRvIHRyYWNlIGFsbCB0aGUgcG9zc2libGUgYWRkcmVzcyByYW5nZS4gIEZyb20gdGhlcmUKKwkgKiBjb25maWd1cmUgdGhlICJpbmNsdWRlL2V4Y2x1ZGUiIGVuZ2luZSB0byBpbmNsdWRlIGFkZHJlc3MKKwkgKiByYW5nZSBjb21wYXJhdG9yICcwJy4KKwkgKi8KKwlldG00X3NldF9kZWZhdWx0X2NvbmZpZyhjb25maWcpOworCWV0bTRfc2V0X2RlZmF1bHRfZmlsdGVyKGNvbmZpZyk7Cit9CisKK3N0YXRpYyBpbnQgZXRtNF9nZXRfbmV4dF9jb21wYXJhdG9yKHN0cnVjdCBldG12NF9kcnZkYXRhICpkcnZkYXRhLCB1MzIgdHlwZSkKK3sKKwlpbnQgbnJfY29tcGFyYXRvciwgaW5kZXggPSAwOworCXN0cnVjdCBldG12NF9jb25maWcgKmNvbmZpZyA9ICZkcnZkYXRhLT5jb25maWc7CisKKwkvKgorCSAqIG5yX2FkZHJfY21wIGhvbGRzIHRoZSBudW1iZXIgb2YgY29tcGFyYXRvciBfcGFpcl8sIHNvIHRpbWUgMgorCSAqIGZvciB0aGUgdG90YWwgbnVtYmVyIG9mIGNvbXBhcmF0b3JzLgorCSAqLworCW5yX2NvbXBhcmF0b3IgPSBkcnZkYXRhLT5ucl9hZGRyX2NtcCAqIDI7CisKKwkvKiBHbyB0aHJvdWdoIHRoZSB0YWxseSBvZiBjb21wYXJhdG9ycyBsb29raW5nIGZvciBhIGZyZWUgb25lLiAqLworCXdoaWxlIChpbmRleCA8IG5yX2NvbXBhcmF0b3IpIHsKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgRVRNX0FERFJfVFlQRV9SQU5HRToKKwkJCWlmIChjb25maWctPmFkZHJfdHlwZVtpbmRleF0gPT0gRVRNX0FERFJfVFlQRV9OT05FICYmCisJCQkgICAgY29uZmlnLT5hZGRyX3R5cGVbaW5kZXggKyAxXSA9PSBFVE1fQUREUl9UWVBFX05PTkUpCisJCQkJcmV0dXJuIGluZGV4OworCisJCQkvKiBBZGRyZXNzIHJhbmdlIGNvbXBhcmF0b3JzIGdvIGluIHBhaXJzICovCisJCQlpbmRleCArPSAyOworCQkJYnJlYWs7CisJCWNhc2UgRVRNX0FERFJfVFlQRV9TVEFSVDoKKwkJY2FzZSBFVE1fQUREUl9UWVBFX1NUT1A6CisJCQlpZiAoY29uZmlnLT5hZGRyX3R5cGVbaW5kZXhdID09IEVUTV9BRERSX1RZUEVfTk9ORSkKKwkJCQlyZXR1cm4gaW5kZXg7CisKKwkJCS8qIFN0YXJ0L3N0b3AgYWRkcmVzcyBjYW4gaGF2ZSBvZGQgaW5kZXhlcyAqLworCQkJaW5kZXggKz0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwkvKiBJZiB3ZSBhcmUgaGVyZSBhbGwgdGhlIGNvbXBhcmF0b3JzIGhhdmUgYmVlbiB1c2VkLiAqLworCXJldHVybiAtRU5PU1BDOworfQorCitzdGF0aWMgaW50IGV0bTRfc2V0X2V2ZW50X2ZpbHRlcnMoc3RydWN0IGV0bXY0X2RydmRhdGEgKmRydmRhdGEsCisJCQkJICBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJaW50IGksIGNvbXBhcmF0b3IsIHJldCA9IDA7CisJdTY0IGFkZHJlc3M7CisJc3RydWN0IGV0bXY0X2NvbmZpZyAqY29uZmlnID0gJmRydmRhdGEtPmNvbmZpZzsKKwlzdHJ1Y3QgZXRtX2ZpbHRlcnMgKmZpbHRlcnMgPSBldmVudC0+aHcuYWRkcl9maWx0ZXJzOworCisJaWYgKCFmaWx0ZXJzKQorCQlnb3RvIGRlZmF1bHRfZmlsdGVyOworCisJLyogU3luYyBldmVudHMgd2l0aCB3aGF0IFBlcmYgZ290ICovCisJcGVyZl9ldmVudF9hZGRyX2ZpbHRlcnNfc3luYyhldmVudCk7CisKKwkvKgorCSAqIElmIHRoZXJlIGFyZSBubyBmaWx0ZXJzIHRvIGRlYWwgd2l0aCBzaW1wbHkgZ28gYWhlYWQgd2l0aAorCSAqIHRoZSBkZWZhdWx0IGZpbHRlciwgaS5lIHRoZSBlbnRpcmUgYWRkcmVzcyByYW5nZS4KKwkgKi8KKwlpZiAoIWZpbHRlcnMtPm5yX2ZpbHRlcnMpCisJCWdvdG8gZGVmYXVsdF9maWx0ZXI7CisKKwlmb3IgKGkgPSAwOyBpIDwgZmlsdGVycy0+bnJfZmlsdGVyczsgaSsrKSB7CisJCXN0cnVjdCBldG1fZmlsdGVyICpmaWx0ZXIgPSAmZmlsdGVycy0+ZXRtX2ZpbHRlcltpXTsKKwkJZW51bSBldG1fYWRkcl90eXBlIHR5cGUgPSBmaWx0ZXItPnR5cGU7CisKKwkJLyogU2VlIGlmIGEgY29tcGFyYXRvciBpcyBmcmVlLiAqLworCQljb21wYXJhdG9yID0gZXRtNF9nZXRfbmV4dF9jb21wYXJhdG9yKGRydmRhdGEsIHR5cGUpOworCQlpZiAoY29tcGFyYXRvciA8IDApIHsKKwkJCXJldCA9IGNvbXBhcmF0b3I7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIEVUTV9BRERSX1RZUEVfUkFOR0U6CisJCQlldG00X3NldF9jb21wYXJhdG9yX2ZpbHRlcihjb25maWcsCisJCQkJCQkgICBmaWx0ZXItPnN0YXJ0X2FkZHIsCisJCQkJCQkgICBmaWx0ZXItPnN0b3BfYWRkciwKKwkJCQkJCSAgIGNvbXBhcmF0b3IpOworCQkJLyoKKwkJCSAqIFRSQ1ZJQ1RMUjo6U1NTVEFUVVMgPT0gMSwgdGhlIHN0YXJ0LXN0b3AgbG9naWMgaXMKKwkJCSAqIGluIHRoZSBzdGFydGVkIHN0YXRlCisJCQkgKi8KKwkJCWNvbmZpZy0+dmluc3RfY3RybCB8PSBCSVQoOSk7CisKKwkJCS8qIE5vIHN0YXJ0LXN0b3AgZmlsdGVyaW5nIGZvciBWaWV3SW5zdCAqLworCQkJY29uZmlnLT52aXNzY3RsciA9IDB4MDsKKwkJCWJyZWFrOworCQljYXNlIEVUTV9BRERSX1RZUEVfU1RBUlQ6CisJCWNhc2UgRVRNX0FERFJfVFlQRV9TVE9QOgorCQkJLyogR2V0IHRoZSByaWdodCBzdGFydCBvciBzdG9wIGFkZHJlc3MgKi8KKwkJCWFkZHJlc3MgPSAodHlwZSA9PSBFVE1fQUREUl9UWVBFX1NUQVJUID8KKwkJCQkgICBmaWx0ZXItPnN0YXJ0X2FkZHIgOgorCQkJCSAgIGZpbHRlci0+c3RvcF9hZGRyKTsKKworCQkJLyogQ29uZmlndXJlIGNvbXBhcmF0b3IgKi8KKwkJCWV0bTRfc2V0X3N0YXJ0X3N0b3BfZmlsdGVyKGNvbmZpZywgYWRkcmVzcywKKwkJCQkJCSAgIGNvbXBhcmF0b3IsIHR5cGUpOworCisJCQkvKgorCQkJICogSWYgZmlsdGVyczo6c3NzdGF0dXMgPT0gMSwgdHJhY2UgYWNxdWlzaXRpb24gd2FzCisJCQkgKiBzdGFydGVkIGJ1dCB0aGUgcHJvY2VzcyB3YXMgeWFua2VkIGF3YXkgYmVmb3JlIHRoZQorCQkJICogdGhlIHN0b3AgYWRkcmVzcyB3YXMgaGl0LiAgQXMgc3VjaCB0aGUgc3RhcnQvc3RvcAorCQkJICogbG9naWMgbmVlZHMgdG8gYmUgcmUtc3RhcnRlZCBzbyB0aGF0IHRyYWNpbmcgY2FuCisJCQkgKiByZXN1bWUgd2hlcmUgaXQgbGVmdC4KKwkJCSAqCisJCQkgKiBUaGUgc3RhcnQvc3RvcCBsb2dpYyBzdGF0dXMgd2hlbiBhIHByb2Nlc3MgaXMKKwkJCSAqIHNjaGVkdWxlZCBvdXQgaXMgY2hlY2tlZCBpbiBmdW5jdGlvbgorCQkJICogZXRtNF9kaXNhYmxlX3BlcmYoKS4KKwkJCSAqLworCQkJaWYgKGZpbHRlcnMtPnNzc3RhdHVzKQorCQkJCWNvbmZpZy0+dmluc3RfY3RybCB8PSBCSVQoOSk7CisKKwkJCS8qIE5vIGluY2x1ZGUvZXhjbHVkZSBmaWx0ZXJpbmcgZm9yIFZpZXdJbnN0ICovCisJCQljb25maWctPnZpaWVjdGxyID0gMHgwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlnb3RvIG91dDsKKworCitkZWZhdWx0X2ZpbHRlcjoKKwlldG00X3NldF9kZWZhdWx0X2ZpbHRlcihjb25maWcpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKwogdm9pZCBldG00X2NvbmZpZ190cmFjZV9tb2RlKHN0cnVjdCBldG12NF9jb25maWcgKmNvbmZpZykKIHsKIAl1MzIgYWRkcl9hY2MsIG1vZGU7CkBAIC03MjcsMTMgKzk1MCw5IEBACiAJc3RydWN0IGNvcmVzaWdodF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IE5VTEw7CiAJc3RydWN0IGV0bXY0X2RydmRhdGEgKmRydmRhdGE7CiAJc3RydWN0IHJlc291cmNlICpyZXMgPSAmYWRldi0+cmVzOwotCXN0cnVjdCBjb3Jlc2lnaHRfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgY29yZXNpZ2h0X2Rlc2MgZGVzYyA9IHsgMCB9OwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBhZGV2LT5kZXYub2Zfbm9kZTsKIAotCWRlc2MgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRlc2MpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRlc2MpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJZHJ2ZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZHJ2ZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghZHJ2ZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC03ODgsMTMgKzEwMDcsMTMgQEAKIAlldG00X2luaXRfdHJhY2VfaWQoZHJ2ZGF0YSk7CiAJZXRtNF9zZXRfZGVmYXVsdCgmZHJ2ZGF0YS0+Y29uZmlnKTsKIAotCWRlc2MtPnR5cGUgPSBDT1JFU0lHSFRfREVWX1RZUEVfU09VUkNFOwotCWRlc2MtPnN1YnR5cGUuc291cmNlX3N1YnR5cGUgPSBDT1JFU0lHSFRfREVWX1NVQlRZUEVfU09VUkNFX1BST0M7Ci0JZGVzYy0+b3BzID0gJmV0bTRfY3Nfb3BzOwotCWRlc2MtPnBkYXRhID0gcGRhdGE7Ci0JZGVzYy0+ZGV2ID0gZGV2OwotCWRlc2MtPmdyb3VwcyA9IGNvcmVzaWdodF9ldG12NF9ncm91cHM7Ci0JZHJ2ZGF0YS0+Y3NkZXYgPSBjb3Jlc2lnaHRfcmVnaXN0ZXIoZGVzYyk7CisJZGVzYy50eXBlID0gQ09SRVNJR0hUX0RFVl9UWVBFX1NPVVJDRTsKKwlkZXNjLnN1YnR5cGUuc291cmNlX3N1YnR5cGUgPSBDT1JFU0lHSFRfREVWX1NVQlRZUEVfU09VUkNFX1BST0M7CisJZGVzYy5vcHMgPSAmZXRtNF9jc19vcHM7CisJZGVzYy5wZGF0YSA9IHBkYXRhOworCWRlc2MuZGV2ID0gZGV2OworCWRlc2MuZ3JvdXBzID0gY29yZXNpZ2h0X2V0bXY0X2dyb3VwczsKKwlkcnZkYXRhLT5jc2RldiA9IGNvcmVzaWdodF9yZWdpc3RlcigmZGVzYyk7CiAJaWYgKElTX0VSUihkcnZkYXRhLT5jc2RldikpIHsKIAkJcmV0ID0gUFRSX0VSUihkcnZkYXRhLT5jc2Rldik7CiAJCWdvdG8gZXJyX2FyY2hfc3VwcG9ydGVkOwpAQCAtODI2LDEyICsxMDQ1LDEyIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYW1iYV9pZCBldG00X2lkc1tdID0gewotCXsgICAgICAgLyogRVRNIDQuMCAtIFF1YWxjb21tICovCi0JCS5pZAk9IDB4MDAwM2I5NWQsCi0JCS5tYXNrCT0gMHgwMDAzZmZmZiwKKwl7ICAgICAgIC8qIEVUTSA0LjAgLSBDb3J0ZXgtQTUzICAqLworCQkuaWQJPSAweDAwMGJiOTVkLAorCQkubWFzawk9IDB4MDAwZmZmZmYsCiAJCS5kYXRhCT0gIkVUTSA0LjAiLAogCX0sCi0JeyAgICAgICAvKiBFVE0gNC4wIC0gSnVubyBib2FyZCAqLworCXsgICAgICAgLyogRVRNIDQuMCAtIENvcnRleC1BNTcgKi8KIAkJLmlkCT0gMHgwMDBiYjk1ZSwKIAkJLm1hc2sJPSAweDAwMGZmZmZmLAogCQkuZGF0YQk9ICJFVE0gNC4wIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtNHguaCBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtNHguaAppbmRleCA1MzU5YzUxLi5iYThkM2Y4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bTR4LmgKKysrIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG00eC5oCkBAIC0xODMsNiArMTgzLDkgQEAKICNkZWZpbmUgVFJDU1RBVFJfSURMRV9CSVQJCTAKICNkZWZpbmUgRVRNX0RFRkFVTFRfQUREUl9DT01QCQkwCiAKKy8qIFBvd2VyRG93biBDb250cm9sIFJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgVFJDUERDUl9QVQkJCUJJVCgzKQorCiAvKiBzZWN1cmUgc3RhdGUgYWNjZXNzIGxldmVscyAqLwogI2RlZmluZSBFVE1fRVhMRVZFTF9TX0FQUAkJQklUKDgpCiAjZGVmaW5lIEVUTV9FWExFVkVMX1NfT1MJCUJJVCg5KQpAQCAtNDA3LDE0ICs0MTAsNiBAQAogCUVUTV9DVFhfQ1RYSURfVk1JRCwKIH07CiAKLWVudW0gZXRtX2FkZHJfdHlwZSB7Ci0JRVRNX0FERFJfVFlQRV9OT05FLAotCUVUTV9BRERSX1RZUEVfU0lOR0xFLAotCUVUTV9BRERSX1RZUEVfUkFOR0UsCi0JRVRNX0FERFJfVFlQRV9TVEFSVCwKLQlFVE1fQUREUl9UWVBFX1NUT1AsCi19OwotCiBleHRlcm4gY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqY29yZXNpZ2h0X2V0bXY0X2dyb3Vwc1tdOwogdm9pZCBldG00X2NvbmZpZ190cmFjZV9tb2RlKHN0cnVjdCBldG12NF9jb25maWcgKmNvbmZpZyk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZnVubmVsLmMgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWZ1bm5lbC5jCmluZGV4IDA1ZGY3ODkuLjg2MGZlNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZnVubmVsLmMKKysrIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1mdW5uZWwuYwpAQCAtMTc2LDcgKzE3Niw3IEBACiAJc3RydWN0IGNvcmVzaWdodF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IE5VTEw7CiAJc3RydWN0IGZ1bm5lbF9kcnZkYXRhICpkcnZkYXRhOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJmFkZXYtPnJlczsKLQlzdHJ1Y3QgY29yZXNpZ2h0X2Rlc2MgKmRlc2M7CisJc3RydWN0IGNvcmVzaWdodF9kZXNjIGRlc2MgPSB7IDAgfTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gYWRldi0+ZGV2Lm9mX25vZGU7CiAKIAlpZiAobnApIHsKQEAgLTIwNywxNyArMjA3LDEzIEBACiAJZHJ2ZGF0YS0+YmFzZSA9IGJhc2U7CiAJcG1fcnVudGltZV9wdXQoJmFkZXYtPmRldik7CiAKLQlkZXNjID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpkZXNjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXNjKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWRlc2MtPnR5cGUgPSBDT1JFU0lHSFRfREVWX1RZUEVfTElOSzsKLQlkZXNjLT5zdWJ0eXBlLmxpbmtfc3VidHlwZSA9IENPUkVTSUdIVF9ERVZfU1VCVFlQRV9MSU5LX01FUkc7Ci0JZGVzYy0+b3BzID0gJmZ1bm5lbF9jc19vcHM7Ci0JZGVzYy0+cGRhdGEgPSBwZGF0YTsKLQlkZXNjLT5kZXYgPSBkZXY7Ci0JZGVzYy0+Z3JvdXBzID0gY29yZXNpZ2h0X2Z1bm5lbF9ncm91cHM7Ci0JZHJ2ZGF0YS0+Y3NkZXYgPSBjb3Jlc2lnaHRfcmVnaXN0ZXIoZGVzYyk7CisJZGVzYy50eXBlID0gQ09SRVNJR0hUX0RFVl9UWVBFX0xJTks7CisJZGVzYy5zdWJ0eXBlLmxpbmtfc3VidHlwZSA9IENPUkVTSUdIVF9ERVZfU1VCVFlQRV9MSU5LX01FUkc7CisJZGVzYy5vcHMgPSAmZnVubmVsX2NzX29wczsKKwlkZXNjLnBkYXRhID0gcGRhdGE7CisJZGVzYy5kZXYgPSBkZXY7CisJZGVzYy5ncm91cHMgPSBjb3Jlc2lnaHRfZnVubmVsX2dyb3VwczsKKwlkcnZkYXRhLT5jc2RldiA9IGNvcmVzaWdodF9yZWdpc3RlcigmZGVzYyk7CiAJaWYgKElTX0VSUihkcnZkYXRhLT5jc2RldikpCiAJCXJldHVybiBQVFJfRVJSKGRydmRhdGEtPmNzZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1wcml2LmggYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXByaXYuaAppbmRleCBhZDk3NWM1Li4xOTZhMTRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXByaXYuaAorKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXByaXYuaApAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvY29yZXNpZ2h0Lmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogCiAvKgogICogQ29yZXNpZ2h0IG1hbmFnZW1lbnQgcmVnaXN0ZXJzICgweGYwMC0weGZjYykKQEAgLTM3LDE2ICszOCwzMiBAQAogI2RlZmluZSBFVE1fTU9ERV9FWENMX0tFUk4JQklUKDMwKQogI2RlZmluZSBFVE1fTU9ERV9FWENMX1VTRVIJQklUKDMxKQogCi0jZGVmaW5lIGNvcmVzaWdodF9zaW1wbGVfZnVuYyh0eXBlLCBuYW1lLCBvZmZzZXQpCQkJXAordHlwZWRlZiB1MzIgKCpjb3Jlc2lnaHRfcmVhZF9mbikoY29uc3Qgc3RydWN0IGRldmljZSAqLCB1MzIgb2Zmc2V0KTsKKyNkZWZpbmUgY29yZXNpZ2h0X3NpbXBsZV9mdW5jKHR5cGUsIGZ1bmMsIG5hbWUsIG9mZnNldCkJCQlcCiBzdGF0aWMgc3NpemVfdCBuYW1lIyNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpfZGV2LAkJCQlcCiAJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQlcCiB7CQkJCQkJCQkJXAogCXR5cGUgKmRydmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoX2Rldi0+cGFyZW50KTsJCQlcCi0JcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIjB4JXhcbiIsCQkJXAotCQkJIHJlYWRsX3JlbGF4ZWQoZHJ2ZGF0YS0+YmFzZSArIG9mZnNldCkpOwlcCisJY29yZXNpZ2h0X3JlYWRfZm4gZm4gPSBmdW5jOwkJCQkJXAorCXUzMiB2YWw7CQkJCQkJCVwKKwlwbV9ydW50aW1lX2dldF9zeW5jKF9kZXYtPnBhcmVudCk7CQkJCVwKKwlpZiAoZm4pCQkJCQkJCQlcCisJCXZhbCA9IGZuKF9kZXYtPnBhcmVudCwgb2Zmc2V0KTsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJdmFsID0gcmVhZGxfcmVsYXhlZChkcnZkYXRhLT5iYXNlICsgb2Zmc2V0KTsJCVwKKwlwbV9ydW50aW1lX3B1dF9zeW5jKF9kZXYtPnBhcmVudCk7CQkJCVwKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMHgleFxuIiwgdmFsKTsJCVwKIH0JCQkJCQkJCQlcCiBzdGF0aWMgREVWSUNFX0FUVFJfUk8obmFtZSkKIAorZW51bSBldG1fYWRkcl90eXBlIHsKKwlFVE1fQUREUl9UWVBFX05PTkUsCisJRVRNX0FERFJfVFlQRV9TSU5HTEUsCisJRVRNX0FERFJfVFlQRV9SQU5HRSwKKwlFVE1fQUREUl9UWVBFX1NUQVJULAorCUVUTV9BRERSX1RZUEVfU1RPUCwKK307CisKIGVudW0gY3NfbW9kZSB7CiAJQ1NfTU9ERV9ESVNBQkxFRCwKIAlDU19NT0RFX1NZU0ZTLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1yZXBsaWNhdG9yLXFjb20uYyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtcmVwbGljYXRvci1xY29tLmMKaW5kZXggNzAwZjcxMC4uMGEzZDE1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1yZXBsaWNhdG9yLXFjb20uYworKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXJlcGxpY2F0b3ItcWNvbS5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZhZGV2LT5yZXM7CiAJc3RydWN0IGNvcmVzaWdodF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IE5VTEw7CiAJc3RydWN0IHJlcGxpY2F0b3Jfc3RhdGUgKmRydmRhdGE7Ci0Jc3RydWN0IGNvcmVzaWdodF9kZXNjICpkZXNjOworCXN0cnVjdCBjb3Jlc2lnaHRfZGVzYyBkZXNjID0geyAwIH07CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGFkZXYtPmRldi5vZl9ub2RlOwogCXZvaWQgX19pb21lbSAqYmFzZTsKIApAQCAtMTM0LDE2ICsxMzQsMTIgQEAKIAlkZXZfc2V0X2RydmRhdGEoZGV2LCBkcnZkYXRhKTsKIAlwbV9ydW50aW1lX3B1dCgmYWRldi0+ZGV2KTsKIAotCWRlc2MgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRlc2MpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRlc2MpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZGVzYy0+dHlwZSA9IENPUkVTSUdIVF9ERVZfVFlQRV9MSU5LOwotCWRlc2MtPnN1YnR5cGUubGlua19zdWJ0eXBlID0gQ09SRVNJR0hUX0RFVl9TVUJUWVBFX0xJTktfU1BMSVQ7Ci0JZGVzYy0+b3BzID0gJnJlcGxpY2F0b3JfY3Nfb3BzOwotCWRlc2MtPnBkYXRhID0gYWRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JZGVzYy0+ZGV2ID0gJmFkZXYtPmRldjsKLQlkcnZkYXRhLT5jc2RldiA9IGNvcmVzaWdodF9yZWdpc3RlcihkZXNjKTsKKwlkZXNjLnR5cGUgPSBDT1JFU0lHSFRfREVWX1RZUEVfTElOSzsKKwlkZXNjLnN1YnR5cGUubGlua19zdWJ0eXBlID0gQ09SRVNJR0hUX0RFVl9TVUJUWVBFX0xJTktfU1BMSVQ7CisJZGVzYy5vcHMgPSAmcmVwbGljYXRvcl9jc19vcHM7CisJZGVzYy5wZGF0YSA9IGFkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWRlc2MuZGV2ID0gJmFkZXYtPmRldjsKKwlkcnZkYXRhLT5jc2RldiA9IGNvcmVzaWdodF9yZWdpc3RlcigmZGVzYyk7CiAJaWYgKElTX0VSUihkcnZkYXRhLT5jc2RldikpCiAJCXJldHVybiBQVFJfRVJSKGRydmRhdGEtPmNzZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1yZXBsaWNhdG9yLmMgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXJlcGxpY2F0b3IuYwppbmRleCBjNjk4MmUzLi4zNzU2ZTcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXJlcGxpY2F0b3IuYworKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXJlcGxpY2F0b3IuYwpAQCAtNjksNyArNjksNyBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CiAJc3RydWN0IGNvcmVzaWdodF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IE5VTEw7CiAJc3RydWN0IHJlcGxpY2F0b3JfZHJ2ZGF0YSAqZHJ2ZGF0YTsKLQlzdHJ1Y3QgY29yZXNpZ2h0X2Rlc2MgKmRlc2M7CisJc3RydWN0IGNvcmVzaWdodF9kZXNjIGRlc2MgPSB7IDAgfTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAKIAlpZiAobnApIHsKQEAgLTk1LDE4ICs5NSwxMiBAQAogCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRydmRhdGEpOwogCi0JZGVzYyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZGVzYyksIEdGUF9LRVJORUwpOwotCWlmICghZGVzYykgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dF9kaXNhYmxlX3BtOwotCX0KLQotCWRlc2MtPnR5cGUgPSBDT1JFU0lHSFRfREVWX1RZUEVfTElOSzsKLQlkZXNjLT5zdWJ0eXBlLmxpbmtfc3VidHlwZSA9IENPUkVTSUdIVF9ERVZfU1VCVFlQRV9MSU5LX1NQTElUOwotCWRlc2MtPm9wcyA9ICZyZXBsaWNhdG9yX2NzX29wczsKLQlkZXNjLT5wZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWRlc2MtPmRldiA9ICZwZGV2LT5kZXY7Ci0JZHJ2ZGF0YS0+Y3NkZXYgPSBjb3Jlc2lnaHRfcmVnaXN0ZXIoZGVzYyk7CisJZGVzYy50eXBlID0gQ09SRVNJR0hUX0RFVl9UWVBFX0xJTks7CisJZGVzYy5zdWJ0eXBlLmxpbmtfc3VidHlwZSA9IENPUkVTSUdIVF9ERVZfU1VCVFlQRV9MSU5LX1NQTElUOworCWRlc2Mub3BzID0gJnJlcGxpY2F0b3JfY3Nfb3BzOworCWRlc2MucGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlkZXNjLmRldiA9ICZwZGV2LT5kZXY7CisJZHJ2ZGF0YS0+Y3NkZXYgPSBjb3Jlc2lnaHRfcmVnaXN0ZXIoJmRlc2MpOwogCWlmIChJU19FUlIoZHJ2ZGF0YS0+Y3NkZXYpKSB7CiAJCXJldCA9IFBUUl9FUlIoZHJ2ZGF0YS0+Y3NkZXYpOwogCQlnb3RvIG91dF9kaXNhYmxlX3BtOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1zdG0uYyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtc3RtLmMKaW5kZXggNzNiZTU4YS4uNDllMGYxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1zdG0uYworKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXN0bS5jCkBAIC0xMDUsMTAgKzEwNSwxMiBAQAogLyoqCiAgKiBzdHJ1Y3QgY2hhbm5lbF9zcGFjZSAtIGNlbnRyYWwgbWFuYWdlbWVudCBlbnRpdHkgZm9yIGV4dGVuZGVkIHBvcnRzCiAgKiBAYmFzZToJCW1lbW9yeSBtYXBwZWQgYmFzZSBhZGRyZXNzIHdoZXJlIGNoYW5uZWxzIHN0YXJ0LgorICogQHBoeXM6CQlwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgY2hhbm5lbCByZWdpb24uCiAgKiBAZ3VhcmFuZWVkOgkJaXMgdGhlIGNoYW5uZWwgZGVsaXZlcnkgZ3VhcmFudGVlZC4KICAqLwogc3RydWN0IGNoYW5uZWxfc3BhY2UgewogCXZvaWQgX19pb21lbQkJKmJhc2U7CisJcGh5c19hZGRyX3QJCXBoeXM7CiAJdW5zaWduZWQgbG9uZwkJKmd1YXJhbnRlZWQ7CiB9OwogCkBAIC0xOTYsNyArMTk4LDcgQEAKIH0KIAogc3RhdGljIGludCBzdG1fZW5hYmxlKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2RldiwKLQkJICAgICAgc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciwgdTMyIG1vZGUpCisJCSAgICAgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgdTMyIG1vZGUpCiB7CiAJdTMyIHZhbDsKIAlzdHJ1Y3Qgc3RtX2RydmRhdGEgKmRydmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoY3NkZXYtPmRldi5wYXJlbnQpOwpAQCAtMjU4LDcgKzI2MCw4IEBACiAJCXN0bV9od2V2ZW50X2Rpc2FibGVfaHcoZHJ2ZGF0YSk7CiB9CiAKLXN0YXRpYyB2b2lkIHN0bV9kaXNhYmxlKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2RldikKK3N0YXRpYyB2b2lkIHN0bV9kaXNhYmxlKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2RldiwKKwkJCXN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKIAlzdHJ1Y3Qgc3RtX2RydmRhdGEgKmRydmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoY3NkZXYtPmRldi5wYXJlbnQpOwogCkBAIC0zNTMsNyArMzU2LDI0IEBACiAJaWYgKCFkcnZkYXRhIHx8ICFkcnZkYXRhLT5jc2RldikKIAkJcmV0dXJuOwogCi0Jc3RtX2Rpc2FibGUoZHJ2ZGF0YS0+Y3NkZXYpOworCXN0bV9kaXNhYmxlKGRydmRhdGEtPmNzZGV2LCBOVUxMKTsKK30KKworc3RhdGljIHBoeXNfYWRkcl90CitzdG1fbW1pb19hZGRyKHN0cnVjdCBzdG1fZGF0YSAqc3RtX2RhdGEsIHVuc2lnbmVkIGludCBtYXN0ZXIsCisJICAgICAgdW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBucl9jaGFucykKK3sKKwlzdHJ1Y3Qgc3RtX2RydmRhdGEgKmRydmRhdGEgPSBjb250YWluZXJfb2Yoc3RtX2RhdGEsCisJCQkJCQkgICBzdHJ1Y3Qgc3RtX2RydmRhdGEsIHN0bSk7CisJcGh5c19hZGRyX3QgYWRkcjsKKworCWFkZHIgPSBkcnZkYXRhLT5jaHMucGh5cyArIGNoYW5uZWwgKiBCWVRFU19QRVJfQ0hBTk5FTDsKKworCWlmIChvZmZzZXRfaW5fcGFnZShhZGRyKSB8fAorCSAgICBvZmZzZXRfaW5fcGFnZShucl9jaGFucyAqIEJZVEVTX1BFUl9DSEFOTkVMKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gYWRkcjsKIH0KIAogc3RhdGljIGxvbmcgc3RtX2dlbmVyaWNfc2V0X29wdGlvbnMoc3RydWN0IHN0bV9kYXRhICpzdG1fZGF0YSwKQEAgLTYxNiw3ICs2MzYsNyBAQAogc3RhdGljIERFVklDRV9BVFRSX1JXKHRyYWNlaWQpOwogCiAjZGVmaW5lIGNvcmVzaWdodF9zdG1fc2ltcGxlX2Z1bmMobmFtZSwgb2Zmc2V0KQlcCi0JY29yZXNpZ2h0X3NpbXBsZV9mdW5jKHN0cnVjdCBzdG1fZHJ2ZGF0YSwgbmFtZSwgb2Zmc2V0KQorCWNvcmVzaWdodF9zaW1wbGVfZnVuYyhzdHJ1Y3Qgc3RtX2RydmRhdGEsIE5VTEwsIG5hbWUsIG9mZnNldCkKIAogY29yZXNpZ2h0X3N0bV9zaW1wbGVfZnVuYyh0Y3NyLCBTVE1UQ1NSKTsKIGNvcmVzaWdodF9zdG1fc2ltcGxlX2Z1bmModHNmcmVxciwgU1RNVFNGUkVRUik7CkBAIC03NjEsNyArNzgxLDkgQEAKIAlkcnZkYXRhLT5zdG0uc3dfZW5kID0gMTsKIAlkcnZkYXRhLT5zdG0uaHdfb3ZlcnJpZGUgPSB0cnVlOwogCWRydmRhdGEtPnN0bS5zd19uY2hhbm5lbHMgPSBkcnZkYXRhLT5udW1zcDsKKwlkcnZkYXRhLT5zdG0uc3dfbW1pb3N6ID0gQllURVNfUEVSX0NIQU5ORUw7CiAJZHJ2ZGF0YS0+c3RtLnBhY2tldCA9IHN0bV9nZW5lcmljX3BhY2tldDsKKwlkcnZkYXRhLT5zdG0ubW1pb19hZGRyID0gc3RtX21taW9fYWRkcjsKIAlkcnZkYXRhLT5zdG0ubGluayA9IHN0bV9nZW5lcmljX2xpbms7CiAJZHJ2ZGF0YS0+c3RtLnVubGluayA9IHN0bV9nZW5lcmljX3VubGluazsKIAlkcnZkYXRhLT5zdG0uc2V0X29wdGlvbnMgPSBzdG1fZ2VuZXJpY19zZXRfb3B0aW9uczsKQEAgLTc3OCw3ICs4MDAsNyBAQAogCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJmFkZXYtPnJlczsKIAlzdHJ1Y3QgcmVzb3VyY2UgY2hfcmVzOwogCXNpemVfdCByZXNfc2l6ZSwgYml0bWFwX3NpemU7Ci0Jc3RydWN0IGNvcmVzaWdodF9kZXNjICpkZXNjOworCXN0cnVjdCBjb3Jlc2lnaHRfZGVzYyBkZXNjID0geyAwIH07CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGFkZXYtPmRldi5vZl9ub2RlOwogCiAJaWYgKG5wKSB7CkBAIC04MDgsNiArODMwLDcgQEAKIAlyZXQgPSBzdG1fZ2V0X3Jlc291cmNlX2J5bmFtZShucCwgInN0bS1zdGltdWx1cy1iYXNlIiwgJmNoX3Jlcyk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKKwlkcnZkYXRhLT5jaHMucGh5cyA9IGNoX3Jlcy5zdGFydDsKIAogCWJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCAmY2hfcmVzKTsKIAlpZiAoSVNfRVJSKGJhc2UpKQpAQCAtODQzLDE5ICs4NjYsMTMgQEAKIAkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CiAJfQogCi0JZGVzYyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZGVzYyksIEdGUF9LRVJORUwpOwotCWlmICghZGVzYykgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIHN0bV91bnJlZ2lzdGVyOwotCX0KLQotCWRlc2MtPnR5cGUgPSBDT1JFU0lHSFRfREVWX1RZUEVfU09VUkNFOwotCWRlc2MtPnN1YnR5cGUuc291cmNlX3N1YnR5cGUgPSBDT1JFU0lHSFRfREVWX1NVQlRZUEVfU09VUkNFX1NPRlRXQVJFOwotCWRlc2MtPm9wcyA9ICZzdG1fY3Nfb3BzOwotCWRlc2MtPnBkYXRhID0gcGRhdGE7Ci0JZGVzYy0+ZGV2ID0gZGV2OwotCWRlc2MtPmdyb3VwcyA9IGNvcmVzaWdodF9zdG1fZ3JvdXBzOwotCWRydmRhdGEtPmNzZGV2ID0gY29yZXNpZ2h0X3JlZ2lzdGVyKGRlc2MpOworCWRlc2MudHlwZSA9IENPUkVTSUdIVF9ERVZfVFlQRV9TT1VSQ0U7CisJZGVzYy5zdWJ0eXBlLnNvdXJjZV9zdWJ0eXBlID0gQ09SRVNJR0hUX0RFVl9TVUJUWVBFX1NPVVJDRV9TT0ZUV0FSRTsKKwlkZXNjLm9wcyA9ICZzdG1fY3Nfb3BzOworCWRlc2MucGRhdGEgPSBwZGF0YTsKKwlkZXNjLmRldiA9IGRldjsKKwlkZXNjLmdyb3VwcyA9IGNvcmVzaWdodF9zdG1fZ3JvdXBzOworCWRydmRhdGEtPmNzZGV2ID0gY29yZXNpZ2h0X3JlZ2lzdGVyKCZkZXNjKTsKIAlpZiAoSVNfRVJSKGRydmRhdGEtPmNzZGV2KSkgewogCQlyZXQgPSBQVFJfRVJSKGRydmRhdGEtPmNzZGV2KTsKIAkJZ290byBzdG1fdW5yZWdpc3RlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtdG1jLWV0Zi5jIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMtZXRmLmMKaW5kZXggNDY2YWY4Ni4uZDY5NDFlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMtZXRmLmMKKysrIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMtZXRmLmMKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlICJjb3Jlc2lnaHQtcHJpdi5oIgogI2luY2x1ZGUgImNvcmVzaWdodC10bWMuaCIKIAotdm9pZCB0bWNfZXRiX2VuYWJsZV9odyhzdHJ1Y3QgdG1jX2RydmRhdGEgKmRydmRhdGEpCitzdGF0aWMgdm9pZCB0bWNfZXRiX2VuYWJsZV9odyhzdHJ1Y3QgdG1jX2RydmRhdGEgKmRydmRhdGEpCiB7CiAJQ1NfVU5MT0NLKGRydmRhdGEtPmJhc2UpOwogCkBAIC00OCw2ICs0OCw3IEBACiAJaW50IGk7CiAKIAlidWZwID0gZHJ2ZGF0YS0+YnVmOworCWRydmRhdGEtPmxlbiA9IDA7CiAJd2hpbGUgKDEpIHsKIAkJZm9yIChpID0gMDsgaSA8IGRydmRhdGEtPm1lbXdpZHRoOyBpKyspIHsKIAkJCXJlYWRfZGF0YSA9IHJlYWRsX3JlbGF4ZWQoZHJ2ZGF0YS0+YmFzZSArIFRNQ19SUkQpOwpAQCAtNTUsNiArNTYsNyBAQAogCQkJCXJldHVybjsKIAkJCW1lbWNweShidWZwLCAmcmVhZF9kYXRhLCA0KTsKIAkJCWJ1ZnAgKz0gNDsKKwkJCWRydmRhdGEtPmxlbiArPSA0OwogCQl9CiAJfQogfQpAQCAtMTY2LDcgKzE2OCw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHJ2ZGF0YS0+c3BpbmxvY2ssIGZsYWdzKTsKIAogCS8qIEZyZWUgbWVtb3J5IG91dHNpZGUgdGhlIHNwaW5sb2NrIGlmIG5lZWQgYmUgKi8KLQlpZiAoIXVzZWQgJiYgYnVmKQorCWlmICghdXNlZCkKIAkJa2ZyZWUoYnVmKTsKIAogCWlmICghcmV0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMtZXRyLmMgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRtYy1ldHIuYwppbmRleCA2ODhiZTllLi44ODZlYTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRtYy1ldHIuYworKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRtYy1ldHIuYwpAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgImNvcmVzaWdodC1wcml2LmgiCiAjaW5jbHVkZSAiY29yZXNpZ2h0LXRtYy5oIgogCi12b2lkIHRtY19ldHJfZW5hYmxlX2h3KHN0cnVjdCB0bWNfZHJ2ZGF0YSAqZHJ2ZGF0YSkKK3N0YXRpYyB2b2lkIHRtY19ldHJfZW5hYmxlX2h3KHN0cnVjdCB0bWNfZHJ2ZGF0YSAqZHJ2ZGF0YSkKIHsKIAl1MzIgYXhpY3RsOwogCkBAIC02NCwxMSArNjQsMTcgQEAKIAlyd3AgPSByZWFkbF9yZWxheGVkKGRydmRhdGEtPmJhc2UgKyBUTUNfUldQKTsKIAl2YWwgPSByZWFkbF9yZWxheGVkKGRydmRhdGEtPmJhc2UgKyBUTUNfU1RTKTsKIAotCS8qIEhvdyBtdWNoIG1lbW9yeSBkbyB3ZSBzdGlsbCBoYXZlICovCi0JaWYgKHZhbCAmIEJJVCgwKSkKKwkvKgorCSAqIEFkanVzdCB0aGUgYnVmZmVyIHRvIHBvaW50IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRyYWNlIGRhdGEKKwkgKiBhbmQgdXBkYXRlIHRoZSBhdmFpbGFibGUgdHJhY2UgZGF0YS4KKwkgKi8KKwlpZiAodmFsICYgVE1DX1NUU19GVUxMKSB7CiAJCWRydmRhdGEtPmJ1ZiA9IGRydmRhdGEtPnZhZGRyICsgcndwIC0gZHJ2ZGF0YS0+cGFkZHI7Ci0JZWxzZQorCQlkcnZkYXRhLT5sZW4gPSBkcnZkYXRhLT5zaXplOworCX0gZWxzZSB7CiAJCWRydmRhdGEtPmJ1ZiA9IGRydmRhdGEtPnZhZGRyOworCQlkcnZkYXRhLT5sZW4gPSByd3AgLSBkcnZkYXRhLT5wYWRkcjsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHRtY19ldHJfZGlzYWJsZV9odyhzdHJ1Y3QgdG1jX2RydmRhdGEgKmRydmRhdGEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRtYy5jIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMuYwppbmRleCA5ZTAyYWM5Li5kODUxN2QyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRtYy5jCisrKyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtdG1jLmMKQEAgLTM4LDggKzM4LDcgQEAKIAlpZiAoY29yZXNpZ2h0X3RpbWVvdXQoZHJ2ZGF0YS0+YmFzZSwKIAkJCSAgICAgIFRNQ19TVFMsIFRNQ19TVFNfVE1DUkVBRFlfQklULCAxKSkgewogCQlkZXZfZXJyKGRydmRhdGEtPmRldiwKLQkJCSJ0aW1lb3V0IG9ic2VydmVkIHdoZW4gcHJvYmluZyBhdCBvZmZzZXQgJSN4XG4iLAotCQkJVE1DX1NUUyk7CisJCQkidGltZW91dCB3aGlsZSB3YWl0aW5nIGZvciBUTUMgdG8gYmUgUmVhZHlcbiIpOwogCX0KIH0KIApAQCAtNTYsOCArNTUsNyBAQAogCWlmIChjb3Jlc2lnaHRfdGltZW91dChkcnZkYXRhLT5iYXNlLAogCQkJICAgICAgVE1DX0ZGQ1IsIFRNQ19GRkNSX0ZMVVNITUFOX0JJVCwgMCkpIHsKIAkJZGV2X2VycihkcnZkYXRhLT5kZXYsCi0JCQkidGltZW91dCBvYnNlcnZlZCB3aGVuIHByb2JpbmcgYXQgb2Zmc2V0ICUjeFxuIiwKLQkJCVRNQ19GRkNSKTsKKwkJInRpbWVvdXQgd2hpbGUgd2FpdGluZyBmb3IgY29tcGxldGlvbiBvZiBNYW51YWwgRmx1c2hcbiIpOwogCX0KIAogCXRtY193YWl0X2Zvcl90bWNyZWFkeShkcnZkYXRhKTsKQEAgLTE0MCw4ICsxMzgsOCBAQAogCQkJCQkJICAgc3RydWN0IHRtY19kcnZkYXRhLCBtaXNjZGV2KTsKIAljaGFyICpidWZwID0gZHJ2ZGF0YS0+YnVmICsgKnBwb3M7CiAKLQlpZiAoKnBwb3MgKyBsZW4gPiBkcnZkYXRhLT5zaXplKQotCQlsZW4gPSBkcnZkYXRhLT5zaXplIC0gKnBwb3M7CisJaWYgKCpwcG9zICsgbGVuID4gZHJ2ZGF0YS0+bGVuKQorCQlsZW4gPSBkcnZkYXRhLT5sZW4gLSAqcHBvczsKIAogCWlmIChkcnZkYXRhLT5jb25maWdfdHlwZSA9PSBUTUNfQ09ORklHX1RZUEVfRVRSKSB7CiAJCWlmIChidWZwID09IChjaGFyICopKGRydmRhdGEtPnZhZGRyICsgZHJ2ZGF0YS0+c2l6ZSkpCkBAIC0xNjAsNyArMTU4LDcgQEAKIAkqcHBvcyArPSBsZW47CiAKIAlkZXZfZGJnKGRydmRhdGEtPmRldiwgIiVzOiAlenUgYnl0ZXMgY29waWVkLCAlZCBieXRlcyBsZWZ0XG4iLAotCQlfX2Z1bmNfXywgbGVuLCAoaW50KShkcnZkYXRhLT5zaXplIC0gKnBwb3MpKTsKKwkJX19mdW5jX18sIGxlbiwgKGludCkoZHJ2ZGF0YS0+bGVuIC0gKnBwb3MpKTsKIAlyZXR1cm4gbGVuOwogfQogCkBAIC0yMjAsNyArMjE4LDcgQEAKIH0KIAogI2RlZmluZSBjb3Jlc2lnaHRfdG1jX3NpbXBsZV9mdW5jKG5hbWUsIG9mZnNldCkJCQlcCi0JY29yZXNpZ2h0X3NpbXBsZV9mdW5jKHN0cnVjdCB0bWNfZHJ2ZGF0YSwgbmFtZSwgb2Zmc2V0KQorCWNvcmVzaWdodF9zaW1wbGVfZnVuYyhzdHJ1Y3QgdG1jX2RydmRhdGEsIE5VTEwsIG5hbWUsIG9mZnNldCkKIAogY29yZXNpZ2h0X3RtY19zaW1wbGVfZnVuYyhyc3osIFRNQ19SU1opOwogY29yZXNpZ2h0X3RtY19zaW1wbGVfZnVuYyhzdHMsIFRNQ19TVFMpOwpAQCAtMjQ5LDggKzI0Nyw4IEBACiAJTlVMTCwKIH07CiAKLXNzaXplX3QgdHJpZ2dlcl9jbnRyX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgdHJpZ2dlcl9jbnRyX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCB0bWNfZHJ2ZGF0YSAqZHJ2ZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7CiAJdW5zaWduZWQgbG9uZyB2YWwgPSBkcnZkYXRhLT50cmlnZ2VyX2NudHI7CkBAIC0zMDQsMjcgKzMwMiwzMiBAQAogCXN0cnVjdCBjb3Jlc2lnaHRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBOVUxMOwogCXN0cnVjdCB0bWNfZHJ2ZGF0YSAqZHJ2ZGF0YTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZhZGV2LT5yZXM7Ci0Jc3RydWN0IGNvcmVzaWdodF9kZXNjICpkZXNjOworCXN0cnVjdCBjb3Jlc2lnaHRfZGVzYyBkZXNjID0geyAwIH07CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGFkZXYtPmRldi5vZl9ub2RlOwogCiAJaWYgKG5wKSB7CiAJCXBkYXRhID0gb2ZfZ2V0X2NvcmVzaWdodF9wbGF0Zm9ybV9kYXRhKGRldiwgbnApOwotCQlpZiAoSVNfRVJSKHBkYXRhKSkKLQkJCXJldHVybiBQVFJfRVJSKHBkYXRhKTsKKwkJaWYgKElTX0VSUihwZGF0YSkpIHsKKwkJCXJldCA9IFBUUl9FUlIocGRhdGEpOworCQkJZ290byBvdXQ7CisJCX0KIAkJYWRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBwZGF0YTsKIAl9CiAKKwlyZXQgPSAtRU5PTUVNOwogCWRydmRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRydmRhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRydmRhdGEpCi0JCXJldHVybiAtRU5PTUVNOworCQlnb3RvIG91dDsKIAogCWRydmRhdGEtPmRldiA9ICZhZGV2LT5kZXY7CiAJZGV2X3NldF9kcnZkYXRhKGRldiwgZHJ2ZGF0YSk7CiAKIAkvKiBWYWxpZGl0eSBmb3IgdGhlIHJlc291cmNlIGlzIGFscmVhZHkgY2hlY2tlZCBieSB0aGUgQU1CQSBjb3JlICovCiAJYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7Ci0JaWYgKElTX0VSUihiYXNlKSkKLQkJcmV0dXJuIFBUUl9FUlIoYmFzZSk7CisJaWYgKElTX0VSUihiYXNlKSkgeworCQlyZXQgPSBQVFJfRVJSKGJhc2UpOworCQlnb3RvIG91dDsKKwl9CiAKIAlkcnZkYXRhLT5iYXNlID0gYmFzZTsKIApAQCAtMzQ3LDMzICszNTAsMjggQEAKIAogCXBtX3J1bnRpbWVfcHV0KCZhZGV2LT5kZXYpOwogCi0JZGVzYyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZGVzYyksIEdGUF9LRVJORUwpOwotCWlmICghZGVzYykgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9kZXZtX2t6YWxsb2M7Ci0JfQotCi0JZGVzYy0+cGRhdGEgPSBwZGF0YTsKLQlkZXNjLT5kZXYgPSBkZXY7Ci0JZGVzYy0+c3VidHlwZS5zaW5rX3N1YnR5cGUgPSBDT1JFU0lHSFRfREVWX1NVQlRZUEVfU0lOS19CVUZGRVI7Ci0JZGVzYy0+Z3JvdXBzID0gY29yZXNpZ2h0X3RtY19ncm91cHM7CisJZGVzYy5wZGF0YSA9IHBkYXRhOworCWRlc2MuZGV2ID0gZGV2OworCWRlc2MuZ3JvdXBzID0gY29yZXNpZ2h0X3RtY19ncm91cHM7CiAKIAlpZiAoZHJ2ZGF0YS0+Y29uZmlnX3R5cGUgPT0gVE1DX0NPTkZJR19UWVBFX0VUQikgewotCQlkZXNjLT50eXBlID0gQ09SRVNJR0hUX0RFVl9UWVBFX1NJTks7Ci0JCWRlc2MtPm9wcyA9ICZ0bWNfZXRiX2NzX29wczsKKwkJZGVzYy50eXBlID0gQ09SRVNJR0hUX0RFVl9UWVBFX1NJTks7CisJCWRlc2Muc3VidHlwZS5zaW5rX3N1YnR5cGUgPSBDT1JFU0lHSFRfREVWX1NVQlRZUEVfU0lOS19CVUZGRVI7CisJCWRlc2Mub3BzID0gJnRtY19ldGJfY3Nfb3BzOwogCX0gZWxzZSBpZiAoZHJ2ZGF0YS0+Y29uZmlnX3R5cGUgPT0gVE1DX0NPTkZJR19UWVBFX0VUUikgewotCQlkZXNjLT50eXBlID0gQ09SRVNJR0hUX0RFVl9UWVBFX1NJTks7Ci0JCWRlc2MtPm9wcyA9ICZ0bWNfZXRyX2NzX29wczsKKwkJZGVzYy50eXBlID0gQ09SRVNJR0hUX0RFVl9UWVBFX1NJTks7CisJCWRlc2Muc3VidHlwZS5zaW5rX3N1YnR5cGUgPSBDT1JFU0lHSFRfREVWX1NVQlRZUEVfU0lOS19CVUZGRVI7CisJCWRlc2Mub3BzID0gJnRtY19ldHJfY3Nfb3BzOwogCX0gZWxzZSB7Ci0JCWRlc2MtPnR5cGUgPSBDT1JFU0lHSFRfREVWX1RZUEVfTElOS1NJTks7Ci0JCWRlc2MtPnN1YnR5cGUubGlua19zdWJ0eXBlID0gQ09SRVNJR0hUX0RFVl9TVUJUWVBFX0xJTktfRklGTzsKLQkJZGVzYy0+b3BzID0gJnRtY19ldGZfY3Nfb3BzOworCQlkZXNjLnR5cGUgPSBDT1JFU0lHSFRfREVWX1RZUEVfTElOS1NJTks7CisJCWRlc2Muc3VidHlwZS5saW5rX3N1YnR5cGUgPSBDT1JFU0lHSFRfREVWX1NVQlRZUEVfTElOS19GSUZPOworCQlkZXNjLm9wcyA9ICZ0bWNfZXRmX2NzX29wczsKIAl9CiAKLQlkcnZkYXRhLT5jc2RldiA9IGNvcmVzaWdodF9yZWdpc3RlcihkZXNjKTsKKwlkcnZkYXRhLT5jc2RldiA9IGNvcmVzaWdodF9yZWdpc3RlcigmZGVzYyk7CiAJaWYgKElTX0VSUihkcnZkYXRhLT5jc2RldikpIHsKIAkJcmV0ID0gUFRSX0VSUihkcnZkYXRhLT5jc2Rldik7Ci0JCWdvdG8gZXJyX2Rldm1fa3phbGxvYzsKKwkJZ290byBvdXQ7CiAJfQogCiAJZHJ2ZGF0YS0+bWlzY2Rldi5uYW1lID0gcGRhdGEtPm5hbWU7CkBAIC0zODEsMTYgKzM3OSw4IEBACiAJZHJ2ZGF0YS0+bWlzY2Rldi5mb3BzID0gJnRtY19mb3BzOwogCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmRydmRhdGEtPm1pc2NkZXYpOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyX21pc2NfcmVnaXN0ZXI7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX21pc2NfcmVnaXN0ZXI6Ci0JY29yZXNpZ2h0X3VucmVnaXN0ZXIoZHJ2ZGF0YS0+Y3NkZXYpOwotZXJyX2Rldm1fa3phbGxvYzoKLQlpZiAoZHJ2ZGF0YS0+Y29uZmlnX3R5cGUgPT0gVE1DX0NPTkZJR19UWVBFX0VUUikKLQkJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBkcnZkYXRhLT5zaXplLAotCQkJCWRydmRhdGEtPnZhZGRyLCBkcnZkYXRhLT5wYWRkcik7CisJCWNvcmVzaWdodF91bnJlZ2lzdGVyKGRydmRhdGEtPmNzZGV2KTsKK291dDoKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRtYy5oIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMuaAppbmRleCA1YzVmZTJhLi40NGIzYWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRtYy5oCisrKyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtdG1jLmgKQEAgLTk4LDcgKzk4LDggQEAKICAqIEBidWY6CWFyZWEgb2YgbWVtb3J5IHdoZXJlIHRyYWNlIGRhdGEgZ2V0IHNlbnQuCiAgKiBAcGFkZHI6CURNQSBzdGFydCBsb2NhdGlvbiBpbiBSQU0uCiAgKiBAdmFkZHI6CXZpcnR1YWwgcmVwcmVzZW50YXRpb24gb2YgQHBhZGRyLgotICogQHNpemU6CUBidWYgc2l6ZS4KKyAqIEBzaXplOgl0cmFjZSBidWZmZXIgc2l6ZS4KKyAqIEBsZW46CXNpemUgb2YgdGhlIGF2YWlsYWJsZSB0cmFjZS4KICAqIEBtb2RlOglob3cgdGhpcyBUTUMgaXMgYmVpbmcgdXNlZC4KICAqIEBjb25maWdfdHlwZTogVE1DIHZhcmlhbnQsIG11c3QgYmUgb2YgdHlwZSBAdG1jX2NvbmZpZ190eXBlLgogICogQG1lbXdpZHRoOgl3aWR0aCBvZiB0aGUgbWVtb3J5IGludGVyZmFjZSBkYXRhYnVzLCBpbiBieXRlcy4KQEAgLTExNSw2ICsxMTYsNyBAQAogCWRtYV9hZGRyX3QJCXBhZGRyOwogCXZvaWQgX19pb21lbQkJKnZhZGRyOwogCXUzMgkJCXNpemU7CisJdTMyCQkJbGVuOwogCWxvY2FsX3QJCQltb2RlOwogCWVudW0gdG1jX2NvbmZpZ190eXBlCWNvbmZpZ190eXBlOwogCWVudW0gdG1jX21lbV9pbnRmX3dpZHRoCW1lbXdpZHRoOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10cGl1LmMgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRwaXUuYwppbmRleCA0ZTQ3MWUyLi4wNjczYmFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRwaXUuYworKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRwaXUuYwpAQCAtMTE5LDcgKzExOSw3IEBACiAJc3RydWN0IGNvcmVzaWdodF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IE5VTEw7CiAJc3RydWN0IHRwaXVfZHJ2ZGF0YSAqZHJ2ZGF0YTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZhZGV2LT5yZXM7Ci0Jc3RydWN0IGNvcmVzaWdodF9kZXNjICpkZXNjOworCXN0cnVjdCBjb3Jlc2lnaHRfZGVzYyBkZXNjID0geyAwIH07CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGFkZXYtPmRldi5vZl9ub2RlOwogCiAJaWYgKG5wKSB7CkBAIC0xNTQsMTYgKzE1NCwxMiBAQAogCiAJcG1fcnVudGltZV9wdXQoJmFkZXYtPmRldik7CiAKLQlkZXNjID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpkZXNjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXNjKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWRlc2MtPnR5cGUgPSBDT1JFU0lHSFRfREVWX1RZUEVfU0lOSzsKLQlkZXNjLT5zdWJ0eXBlLnNpbmtfc3VidHlwZSA9IENPUkVTSUdIVF9ERVZfU1VCVFlQRV9TSU5LX1BPUlQ7Ci0JZGVzYy0+b3BzID0gJnRwaXVfY3Nfb3BzOwotCWRlc2MtPnBkYXRhID0gcGRhdGE7Ci0JZGVzYy0+ZGV2ID0gZGV2OwotCWRydmRhdGEtPmNzZGV2ID0gY29yZXNpZ2h0X3JlZ2lzdGVyKGRlc2MpOworCWRlc2MudHlwZSA9IENPUkVTSUdIVF9ERVZfVFlQRV9TSU5LOworCWRlc2Muc3VidHlwZS5zaW5rX3N1YnR5cGUgPSBDT1JFU0lHSFRfREVWX1NVQlRZUEVfU0lOS19QT1JUOworCWRlc2Mub3BzID0gJnRwaXVfY3Nfb3BzOworCWRlc2MucGRhdGEgPSBwZGF0YTsKKwlkZXNjLmRldiA9IGRldjsKKwlkcnZkYXRhLT5jc2RldiA9IGNvcmVzaWdodF9yZWdpc3RlcigmZGVzYyk7CiAJaWYgKElTX0VSUihkcnZkYXRhLT5jc2RldikpCiAJCXJldHVybiBQVFJfRVJSKGRydmRhdGEtPmNzZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC5jIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC5jCmluZGV4IGQwOGQxYWIuLjdiZjAwYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQuYworKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LmMKQEAgLTI1Nyw3ICsyNTcsNyBAQAogewogCWlmIChhdG9taWNfZGVjX3JldHVybihjc2Rldi0+cmVmY250KSA9PSAwKSB7CiAJCWlmIChzb3VyY2Vfb3BzKGNzZGV2KS0+ZGlzYWJsZSkgewotCQkJc291cmNlX29wcyhjc2RldiktPmRpc2FibGUoY3NkZXYpOworCQkJc291cmNlX29wcyhjc2RldiktPmRpc2FibGUoY3NkZXYsIE5VTEwpOwogCQkJY3NkZXYtPmVuYWJsZSA9IGZhbHNlOwogCQl9CiAJfQpAQCAtNDI5LDcgKzQyOSw3IEBACiAKIAlwYXRoID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCksIEdGUF9LRVJORUwpOwogCWlmICghcGF0aCkKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJSU5JVF9MSVNUX0hFQUQocGF0aCk7CiAKQEAgLTcyNSw3ICs3MjUsOCBAQAogCQkvKiBXZSBoYXZlIGZvdW5kIGF0IGxlYXN0IG9uZSBvcnBoYW4gY29ubmVjdGlvbiAqLwogCQlpZiAoY29ubi0+Y2hpbGRfZGV2ID09IE5VTEwpIHsKIAkJCS8qIERvZXMgaXQgbWF0Y2ggdGhpcyBuZXdseSBhZGRlZCBkZXZpY2U/ICovCi0JCQlpZiAoIXN0cmNtcChkZXZfbmFtZSgmY3NkZXYtPmRldiksIGNvbm4tPmNoaWxkX25hbWUpKSB7CisJCQlpZiAoY29ubi0+Y2hpbGRfbmFtZSAmJgorCQkJICAgICFzdHJjbXAoZGV2X25hbWUoJmNzZGV2LT5kZXYpLCBjb25uLT5jaGlsZF9uYW1lKSkgewogCQkJCWNvbm4tPmNoaWxkX2RldiA9IGNzZGV2OwogCQkJfSBlbHNlIHsKIAkJCQkvKiBUaGlzIGNvbXBvbmVudCBzdGlsbCBoYXMgYW4gb3JwaGFuICovCkBAIC04OTMsNyArODk0LDcgQEAKIAlpbnQgbnJfcmVmY250cyA9IDE7CiAJYXRvbWljX3QgKnJlZmNudHMgPSBOVUxMOwogCXN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2RldjsKLQlzdHJ1Y3QgY29yZXNpZ2h0X2Nvbm5lY3Rpb24gKmNvbm5zOworCXN0cnVjdCBjb3Jlc2lnaHRfY29ubmVjdGlvbiAqY29ubnMgPSBOVUxMOwogCiAJY3NkZXYgPSBremFsbG9jKHNpemVvZigqY3NkZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNzZGV2KSB7CkBAIC05MjEsMTYgKzkyMiwyMCBAQAogCiAJY3NkZXYtPm5yX2lucG9ydCA9IGRlc2MtPnBkYXRhLT5ucl9pbnBvcnQ7CiAJY3NkZXYtPm5yX291dHBvcnQgPSBkZXNjLT5wZGF0YS0+bnJfb3V0cG9ydDsKLQljb25ucyA9IGtjYWxsb2MoY3NkZXYtPm5yX291dHBvcnQsIHNpemVvZigqY29ubnMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNvbm5zKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2t6YWxsb2NfY29ubnM7Ci0JfQogCi0JZm9yIChpID0gMDsgaSA8IGNzZGV2LT5ucl9vdXRwb3J0OyBpKyspIHsKLQkJY29ubnNbaV0ub3V0cG9ydCA9IGRlc2MtPnBkYXRhLT5vdXRwb3J0c1tpXTsKLQkJY29ubnNbaV0uY2hpbGRfbmFtZSA9IGRlc2MtPnBkYXRhLT5jaGlsZF9uYW1lc1tpXTsKLQkJY29ubnNbaV0uY2hpbGRfcG9ydCA9IGRlc2MtPnBkYXRhLT5jaGlsZF9wb3J0c1tpXTsKKwkvKiBJbml0aWFsaXNlIGNvbm5lY3Rpb25zIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBvdXRwb3J0ICovCisJaWYgKGNzZGV2LT5ucl9vdXRwb3J0KSB7CisJCWNvbm5zID0ga2NhbGxvYyhjc2Rldi0+bnJfb3V0cG9ydCwgc2l6ZW9mKCpjb25ucyksIEdGUF9LRVJORUwpOworCQlpZiAoIWNvbm5zKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBlcnJfa3phbGxvY19jb25uczsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBjc2Rldi0+bnJfb3V0cG9ydDsgaSsrKSB7CisJCQljb25uc1tpXS5vdXRwb3J0ID0gZGVzYy0+cGRhdGEtPm91dHBvcnRzW2ldOworCQkJY29ubnNbaV0uY2hpbGRfbmFtZSA9IGRlc2MtPnBkYXRhLT5jaGlsZF9uYW1lc1tpXTsKKwkJCWNvbm5zW2ldLmNoaWxkX3BvcnQgPSBkZXNjLT5wZGF0YS0+Y2hpbGRfcG9ydHNbaV07CisJCX0KIAl9CiAKIAljc2Rldi0+Y29ubnMgPSBjb25uczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9vZl9jb3Jlc2lnaHQuYyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9vZl9jb3Jlc2lnaHQuYwppbmRleCBiNjhkYTE4Li42MjllMDMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvb2ZfY29yZXNpZ2h0LmMKKysrIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L29mX2NvcmVzaWdodC5jCkBAIC0xNjYsNyArMTY2LDcgQEAKIAogCQkJcmRldiA9IG9mX2NvcmVzaWdodF9nZXRfZW5kcG9pbnRfZGV2aWNlKHJwYXJlbnQpOwogCQkJaWYgKCFyZGV2KQotCQkJCWNvbnRpbnVlOworCQkJCXJldHVybiBFUlJfUFRSKC1FUFJPQkVfREVGRVIpOwogCiAJCQlwZGF0YS0+Y2hpbGRfbmFtZXNbaV0gPSBkZXZfbmFtZShyZGV2KTsKIAkJCXBkYXRhLT5jaGlsZF9wb3J0c1tpXSA9IHJlbmRwb2ludC5pZDsKQEAgLTE4NCw2ICsxODQsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAl9CisJb2Zfbm9kZV9wdXQoZG4pOwogCiAJcmV0dXJuIHBkYXRhOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hdDkxLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWF0OTEuYwppbmRleCBmMjMzNzI2Li4xYmI5N2Y2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWF0OTEuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWF0OTEuYwpAQCAtMzgsNiArMzgsNyBAQAogI2RlZmluZSBBVDkxX0kyQ19USU1FT1VUCW1zZWNzX3RvX2ppZmZpZXMoMTAwKQkvKiB0cmFuc2ZlciB0aW1lb3V0ICovCiAjZGVmaW5lIEFUOTFfSTJDX0RNQV9USFJFU0hPTEQJOAkJCS8qIGVuYWJsZSBETUEgaWYgdHJhbnNmZXIgc2l6ZSBpcyBiaWdnZXIgdGhhbiB0aGlzIHRocmVzaG9sZCAqLwogI2RlZmluZSBBVVRPU1VTUEVORF9USU1FT1VUCQkyMDAwCisjZGVmaW5lIEFUOTFfSTJDX01BWF9BTFRfQ01EX0RBVEFfU0laRQkyNTYKIAogLyogQVQ5MSBUV0kgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUJQVQ5MV9UV0lfQ1IJCTB4MDAwMAkvKiBDb250cm9sIFJlZ2lzdGVyICovCkBAIC0xNDEsNiArMTQyLDcgQEAKIAl1bnNpZ25lZCB0d2lfY3dncl9yZWc7CiAJc3RydWN0IGF0OTFfdHdpX3BkYXRhICpwZGF0YTsKIAlib29sIHVzZV9kbWE7CisJYm9vbCB1c2VfYWx0X2NtZDsKIAlib29sIHJlY3ZfbGVuX2Fib3J0OwogCXUzMiBmaWZvX3NpemU7CiAJc3RydWN0IGF0OTFfdHdpX2RtYSBkbWE7CkBAIC0yNjksNyArMjcxLDcgQEAKIAogCS8qIHNlbmQgc3RvcCB3aGVuIGxhc3QgYnl0ZSBoYXMgYmVlbiB3cml0dGVuICovCiAJaWYgKC0tZGV2LT5idWZfbGVuID09IDApCi0JCWlmICghZGV2LT5wZGF0YS0+aGFzX2FsdF9jbWQpCisJCWlmICghZGV2LT51c2VfYWx0X2NtZCkKIAkJCWF0OTFfdHdpX3dyaXRlKGRldiwgQVQ5MV9UV0lfQ1IsIEFUOTFfVFdJX1NUT1ApOwogCiAJZGV2X2RiZyhkZXYtPmRldiwgIndyb3RlIDB4JXgsIHRvIGdvICVkXG4iLCAqZGV2LT5idWYsIGRldi0+YnVmX2xlbik7CkBAIC0yOTIsNyArMjk0LDcgQEAKIAkgKiB3ZSBqdXN0IGhhdmUgdG8gZW5hYmxlIFRYQ09NUCBvbmUuCiAJICovCiAJYXQ5MV90d2lfd3JpdGUoZGV2LCBBVDkxX1RXSV9JRVIsIEFUOTFfVFdJX1RYQ09NUCk7Ci0JaWYgKCFkZXYtPnBkYXRhLT5oYXNfYWx0X2NtZCkKKwlpZiAoIWRldi0+dXNlX2FsdF9jbWQpCiAJCWF0OTFfdHdpX3dyaXRlKGRldiwgQVQ5MV9UV0lfQ1IsIEFUOTFfVFdJX1NUT1ApOwogfQogCkBAIC00MTAsNyArNDEyLDcgQEAKIAl9CiAKIAkvKiBzZW5kIHN0b3AgaWYgc2Vjb25kIGJ1dCBsYXN0IGJ5dGUgaGFzIGJlZW4gcmVhZCAqLwotCWlmICghZGV2LT5wZGF0YS0+aGFzX2FsdF9jbWQgJiYgZGV2LT5idWZfbGVuID09IDEpCisJaWYgKCFkZXYtPnVzZV9hbHRfY21kICYmIGRldi0+YnVmX2xlbiA9PSAxKQogCQlhdDkxX3R3aV93cml0ZShkZXYsIEFUOTFfVFdJX0NSLCBBVDkxX1RXSV9TVE9QKTsKIAogCWRldl9kYmcoZGV2LT5kZXYsICJyZWFkIDB4JXgsIHRvIGdvICVkXG4iLCAqZGV2LT5idWYsIGRldi0+YnVmX2xlbik7CkBAIC00MjYsNyArNDI4LDcgQEAKIAlkbWFfdW5tYXBfc2luZ2xlKGRldi0+ZGV2LCBzZ19kbWFfYWRkcmVzcygmZGV2LT5kbWEuc2dbMF0pLAogCQkJIGRldi0+YnVmX2xlbiwgRE1BX0ZST01fREVWSUNFKTsKIAotCWlmICghZGV2LT5wZGF0YS0+aGFzX2FsdF9jbWQpIHsKKwlpZiAoIWRldi0+dXNlX2FsdF9jbWQpIHsKIAkJLyogVGhlIGxhc3QgdHdvIGJ5dGVzIGhhdmUgdG8gYmUgcmVhZCB3aXRob3V0IHVzaW5nIGRtYSAqLwogCQlkZXYtPmJ1ZiArPSBkZXYtPmJ1Zl9sZW4gLSAyOwogCQlkZXYtPmJ1Zl9sZW4gPSAyOwpAQCAtNDQzLDcgKzQ0NSw3IEBACiAJc3RydWN0IGRtYV9jaGFuICpjaGFuX3J4ID0gZG1hLT5jaGFuX3J4OwogCXNpemVfdCBidWZfbGVuOwogCi0JYnVmX2xlbiA9IChkZXYtPnBkYXRhLT5oYXNfYWx0X2NtZCkgPyBkZXYtPmJ1Zl9sZW4gOiBkZXYtPmJ1Zl9sZW4gLSAyOworCWJ1Zl9sZW4gPSAoZGV2LT51c2VfYWx0X2NtZCkgPyBkZXYtPmJ1Zl9sZW4gOiBkZXYtPmJ1Zl9sZW4gLSAyOwogCWRtYS0+ZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOwogCiAJLyogS2VlcCBpbiBtaW5kIHRoYXQgd2Ugd29uJ3QgdXNlIGRtYSB0byByZWFkIHRoZSBsYXN0IHR3byBieXRlcyAqLwpAQCAtNjUxLDcgKzY1Myw3IEBACiAJCXVuc2lnbmVkIHN0YXJ0X2ZsYWdzID0gQVQ5MV9UV0lfU1RBUlQ7CiAKIAkJLyogaWYgb25seSBvbmUgYnl0ZSBpcyB0byBiZSByZWFkLCBpbW1lZGlhdGVseSBzdG9wIHRyYW5zZmVyICovCi0JCWlmICghaGFzX2FsdF9jbWQgJiYgZGV2LT5idWZfbGVuIDw9IDEgJiYKKwkJaWYgKCFkZXYtPnVzZV9hbHRfY21kICYmIGRldi0+YnVmX2xlbiA8PSAxICYmCiAJCSAgICAhKGRldi0+bXNnLT5mbGFncyAmIEkyQ19NX1JFQ1ZfTEVOKSkKIAkJCXN0YXJ0X2ZsYWdzIHw9IEFUOTFfVFdJX1NUT1A7CiAJCWF0OTFfdHdpX3dyaXRlKGRldiwgQVQ5MV9UV0lfQ1IsIHN0YXJ0X2ZsYWdzKTsKQEAgLTc0NSw3ICs3NDcsNyBAQAogCWludCByZXQ7CiAJdW5zaWduZWQgaW50X2FkZHJfZmxhZyA9IDA7CiAJc3RydWN0IGkyY19tc2cgKm1fc3RhcnQgPSBtc2c7Ci0JYm9vbCBpc19yZWFkLCB1c2VfYWx0X2NtZCA9IGZhbHNlOworCWJvb2wgaXNfcmVhZDsKIAogCWRldl9kYmcoJmFkYXAtPmRldiwgImF0OTFfeGZlcjogcHJvY2Vzc2luZyAlZCBtZXNzYWdlczpcbiIsIG51bSk7CiAKQEAgLTc2OCwxNCArNzcwLDE2IEBACiAJCWF0OTFfdHdpX3dyaXRlKGRldiwgQVQ5MV9UV0lfSUFEUiwgaW50ZXJuYWxfYWRkcmVzcyk7CiAJfQogCisJZGV2LT51c2VfYWx0X2NtZCA9IGZhbHNlOwogCWlzX3JlYWQgPSAobV9zdGFydC0+ZmxhZ3MgJiBJMkNfTV9SRCk7CiAJaWYgKGRldi0+cGRhdGEtPmhhc19hbHRfY21kKSB7Ci0JCWlmIChtX3N0YXJ0LT5sZW4gPiAwKSB7CisJCWlmIChtX3N0YXJ0LT5sZW4gPiAwICYmCisJCSAgICBtX3N0YXJ0LT5sZW4gPCBBVDkxX0kyQ19NQVhfQUxUX0NNRF9EQVRBX1NJWkUpIHsKIAkJCWF0OTFfdHdpX3dyaXRlKGRldiwgQVQ5MV9UV0lfQ1IsIEFUOTFfVFdJX0FDTUVOKTsKIAkJCWF0OTFfdHdpX3dyaXRlKGRldiwgQVQ5MV9UV0lfQUNSLAogCQkJCSAgICAgICBBVDkxX1RXSV9BQ1JfREFUQUwobV9zdGFydC0+bGVuKSB8CiAJCQkJICAgICAgICgoaXNfcmVhZCkgPyBBVDkxX1RXSV9BQ1JfRElSIDogMCkpOwotCQkJdXNlX2FsdF9jbWQgPSB0cnVlOworCQkJZGV2LT51c2VfYWx0X2NtZCA9IHRydWU7CiAJCX0gZWxzZSB7CiAJCQlhdDkxX3R3aV93cml0ZShkZXYsIEFUOTFfVFdJX0NSLCBBVDkxX1RXSV9BQ01ESVMpOwogCQl9CkBAIC03ODQsNyArNzg4LDcgQEAKIAlhdDkxX3R3aV93cml0ZShkZXYsIEFUOTFfVFdJX01NUiwKIAkJICAgICAgIChtX3N0YXJ0LT5hZGRyIDw8IDE2KSB8CiAJCSAgICAgICBpbnRfYWRkcl9mbGFnIHwKLQkJICAgICAgICgoIXVzZV9hbHRfY21kICYmIGlzX3JlYWQpID8gQVQ5MV9UV0lfTVJFQUQgOiAwKSk7CisJCSAgICAgICAoKCFkZXYtPnVzZV9hbHRfY21kICYmIGlzX3JlYWQpID8gQVQ5MV9UV0lfTVJFQUQgOiAwKSk7CiAKIAlkZXYtPmJ1Zl9sZW4gPSBtX3N0YXJ0LT5sZW47CiAJZGV2LT5idWYgPSBtX3N0YXJ0LT5idWY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJjbS1pcHJvYy5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1iY20taXByb2MuYwppbmRleCAxOWM4NDM4Li45NWY3Y2FjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJjbS1pcHJvYy5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYmNtLWlwcm9jLmMKQEAgLTE1OCw3ICsxNTgsNyBAQAogCiAJaWYgKHN0YXR1cyAmIEJJVChJU19NX1NUQVJUX0JVU1lfU0hJRlQpKSB7CiAJCWlwcm9jX2kyYy0+eGZlcl9pc19kb25lID0gMTsKLQkJY29tcGxldGVfYWxsKCZpcHJvY19pMmMtPmRvbmUpOworCQljb21wbGV0ZSgmaXByb2NfaTJjLT5kb25lKTsKIAl9CiAKIAl3cml0ZWwoc3RhdHVzLCBpcHJvY19pMmMtPmJhc2UgKyBJU19PRkZTRVQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1iY20ta29uYS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1iY20ta29uYS5jCmluZGV4IGFjOWY0NzYuLjI1OGNiOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYmNtLWtvbmEuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJjbS1rb25hLmMKQEAgLTIyOSw3ICsyMjksNyBAQAogCQkgICAgICAgZGV2LT5iYXNlICsgVFhGQ1JfT0ZGU0VUKTsKIAogCXdyaXRlbChzdGF0dXMgJiB+SVNSX1JFU0VSVkVEX01BU0ssIGRldi0+YmFzZSArIElTUl9PRkZTRVQpOwotCWNvbXBsZXRlX2FsbCgmZGV2LT5kb25lKTsKKwljb21wbGV0ZSgmZGV2LT5kb25lKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTY0Myw3ICs2NDMsNyBAQAogCQkJaWYgKHJjIDwgMCkgewogCQkJCWRldl9lcnIoZGV2LT5kZXZpY2UsCiAJCQkJCSJyZXN0YXJ0IGNtZCBmYWlsZWQgcmMgPSAlZFxuIiwgcmMpOwotCQkJCQlnb3RvIHhmZXJfc2VuZF9zdG9wOworCQkJCWdvdG8geGZlcl9zZW5kX3N0b3A7CiAJCQl9CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1icmNtc3RiLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJyY21zdGIuYwppbmRleCAzZjVhNGQ3Li4zODViNTdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJyY21zdGIuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJyY21zdGIuYwpAQCAtMjI4LDcgKzIyOCw3IEBACiAJCXJldHVybiBJUlFfTk9ORTsKIAogCWJyY21zdGJfaTJjX2VuYWJsZV9kaXNhYmxlX2lycShkZXYsIElOVF9ESVNBQkxFKTsKLQljb21wbGV0ZV9hbGwoJmRldi0+ZG9uZSk7CisJY29tcGxldGUoJmRldi0+ZG9uZSk7CiAKIAlkZXZfZGJnKGRldi0+ZGV2aWNlLCAiaXNyIGhhbmRsZWQiKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWNhZGVuY2UuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY2FkZW5jZS5jCmluZGV4IDkwYmJkOWYuLjNjMTZhMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY2FkZW5jZS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY2FkZW5jZS5jCkBAIC03NjcsNyArNzY3LDcgQEAKICAqIGRlcGVuZGluZyBvbiB0aGUgc2NhbGluZyBkaXJlY3Rpb24uCiAgKgogICogUmV0dXJuOglOT1RJRllfU1RPUCBpZiB0aGUgcmF0ZSBjaGFuZ2Ugc2hvdWxkIGJlIGFib3J0ZWQsIE5PVElGWV9PSwotICoJCXRvIGFja25vd2VkZ2UgdGhlIGNoYW5nZSwgTk9USUZZX0RPTkUgaWYgdGhlIG5vdGlmaWNhdGlvbiBpcworICoJCXRvIGFja25vd2xlZGdlIHRoZSBjaGFuZ2UsIE5PVElGWV9ET05FIGlmIHRoZSBub3RpZmljYXRpb24gaXMKICAqCQljb25zaWRlcmVkIGlycmVsZXZhbnQuCiAgKi8KIHN0YXRpYyBpbnQgY2Ruc19pMmNfY2xrX25vdGlmaWVyX2NiKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY3Jvcy1lYy10dW5uZWwuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY3Jvcy1lYy10dW5uZWwuYwppbmRleCBhMGQ5NWZmLi4yZDVmZjg2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1jcm9zLWVjLXR1bm5lbC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY3Jvcy1lYy10dW5uZWwuYwpAQCAtMjE1LDcgKzIxNSw3IEBACiAJbXNnLT5vdXRzaXplID0gcmVxdWVzdF9sZW47CiAJbXNnLT5pbnNpemUgPSByZXNwb25zZV9sZW47CiAKLQlyZXN1bHQgPSBjcm9zX2VjX2NtZF94ZmVyKGJ1cy0+ZWMsIG1zZyk7CisJcmVzdWx0ID0gY3Jvc19lY19jbWRfeGZlcl9zdGF0dXMoYnVzLT5lYywgbXNnKTsKIAlpZiAocmVzdWx0IDwgMCkgewogCQlkZXZfZXJyKGRldiwgIkVycm9yIHRyYW5zZmVycmluZyBFQyBpMmMgbWVzc2FnZSAlZFxuIiwgcmVzdWx0KTsKIAkJZ290byBleGl0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kZXNpZ253YXJlLWNvcmUuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGVzaWdud2FyZS1jb3JlLmMKaW5kZXggYzY5MjJiOC4uZmNkOTczZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kZXNpZ253YXJlLWNvcmUuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWRlc2lnbndhcmUtY29yZS5jCkBAIC0zNjcsMTMgKzM2NywxNyBAQAogCWRldl9kYmcoZGV2LT5kZXYsICJGYXN0LW1vZGUgSENOVDpMQ05UID0gJWQ6JWRcbiIsIGhjbnQsIGxjbnQpOwogCiAJLyogQ29uZmlndXJlIFNEQSBIb2xkIFRpbWUgaWYgcmVxdWlyZWQgKi8KLQlpZiAoZGV2LT5zZGFfaG9sZF90aW1lKSB7Ci0JCXJlZyA9IGR3X3JlYWRsKGRldiwgRFdfSUNfQ09NUF9WRVJTSU9OKTsKLQkJaWYgKHJlZyA+PSBEV19JQ19TREFfSE9MRF9NSU5fVkVSUykKKwlyZWcgPSBkd19yZWFkbChkZXYsIERXX0lDX0NPTVBfVkVSU0lPTik7CisJaWYgKHJlZyA+PSBEV19JQ19TREFfSE9MRF9NSU5fVkVSUykgeworCQlpZiAoZGV2LT5zZGFfaG9sZF90aW1lKSB7CiAJCQlkd193cml0ZWwoZGV2LCBkZXYtPnNkYV9ob2xkX3RpbWUsIERXX0lDX1NEQV9IT0xEKTsKLQkJZWxzZQotCQkJZGV2X3dhcm4oZGV2LT5kZXYsCi0JCQkJIkhhcmR3YXJlIHRvbyBvbGQgdG8gYWRqdXN0IFNEQSBob2xkIHRpbWUuIik7CisJCX0gZWxzZSB7CisJCQkvKiBLZWVwIHByZXZpb3VzIGhvbGQgdGltZSBzZXR0aW5nIGlmIG5vIG9uZSBzZXQgaXQgKi8KKwkJCWRldi0+c2RhX2hvbGRfdGltZSA9IGR3X3JlYWRsKGRldiwgRFdfSUNfU0RBX0hPTEQpOworCQl9CisJfSBlbHNlIHsKKwkJZGV2X3dhcm4oZGV2LT5kZXYsCisJCQkiSGFyZHdhcmUgdG9vIG9sZCB0byBhZGp1c3QgU0RBIGhvbGQgdGltZS5cbiIpOwogCX0KIAogCS8qIENvbmZpZ3VyZSBUeC9SeCBGSUZPIHRocmVzaG9sZCBsZXZlbHMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZWcyMHQuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZWcyMHQuYwppbmRleCAxMzcxMjViLi41Y2U3MWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWVnMjB0LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1lZzIwdC5jCkBAIC03NzMsMTMgKzc3Myw2IEBACiAJLyogU2V0IHRoZSBudW1iZXIgb2YgSTJDIGNoYW5uZWwgaW5zdGFuY2UgKi8KIAlhZGFwX2luZm8tPmNoX251bSA9IGlkLT5kcml2ZXJfZGF0YTsKIAotCXJldCA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgcGNoX2kyY19oYW5kbGVyLCBJUlFGX1NIQVJFRCwKLQkJICBLQlVJTERfTU9ETkFNRSwgYWRhcF9pbmZvKTsKLQlpZiAocmV0KSB7Ci0JCXBjaF9wY2lfZXJyKHBkZXYsICJyZXF1ZXN0X2lycSBGQUlMRURcbiIpOwotCQlnb3RvIGVycl9yZXF1ZXN0X2lycTsKLQl9Ci0KIAlmb3IgKGkgPSAwOyBpIDwgYWRhcF9pbmZvLT5jaF9udW07IGkrKykgewogCQlwY2hfYWRhcCA9ICZhZGFwX2luZm8tPnBjaF9kYXRhW2ldLnBjaF9hZGFwdGVyOwogCQlhZGFwX2luZm8tPnBjaF9pMmNfc3VzcGVuZGVkID0gZmFsc2U7CkBAIC03OTcsNiArNzkwLDE3IEBACiAKIAkJcGNoX2FkYXAtPmRldi5vZl9ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAJCXBjaF9hZGFwLT5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIHBjaF9pMmNfaGFuZGxlciwgSVJRRl9TSEFSRUQsCisJCSAgS0JVSUxEX01PRE5BTUUsIGFkYXBfaW5mbyk7CisJaWYgKHJldCkgeworCQlwY2hfcGNpX2VycihwZGV2LCAicmVxdWVzdF9pcnEgRkFJTEVEXG4iKTsKKwkJZ290byBlcnJfcmVxdWVzdF9pcnE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGFkYXBfaW5mby0+Y2hfbnVtOyBpKyspIHsKKwkJcGNoX2FkYXAgPSAmYWRhcF9pbmZvLT5wY2hfZGF0YVtpXS5wY2hfYWRhcHRlcjsKIAogCQlwY2hfaTJjX2luaXQoJmFkYXBfaW5mby0+cGNoX2RhdGFbaV0pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgwMS5jCmluZGV4IDVlZjliNzMuLjI2Mjk4YWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgwMS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgwMS5jCkBAIC0xNDg2LDcgKzE0ODYsOSBAQAogCQlwcml2LT5mZWF0dXJlcyB8PSBGRUFUVVJFX0lSUTsKIAkJcHJpdi0+ZmVhdHVyZXMgfD0gRkVBVFVSRV9TTUJVU19QRUM7CiAJCXByaXYtPmZlYXR1cmVzIHw9IEZFQVRVUkVfQkxPQ0tfQlVGRkVSOwotCQlwcml2LT5mZWF0dXJlcyB8PSBGRUFUVVJFX1RDTzsKKwkJLyogSWYgd2UgaGF2ZSBBQ1BJIGJhc2VkIHdhdGNoZG9nIHVzZSB0aGF0IGluc3RlYWQgKi8KKwkJaWYgKCFhY3BpX2hhc193YXRjaGRvZygpKQorCQkJcHJpdi0+ZmVhdHVyZXMgfD0gRkVBVFVSRV9UQ087CiAJCXByaXYtPmZlYXR1cmVzIHw9IEZFQVRVUkVfSE9TVF9OT1RJRlk7CiAJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW1lc29uLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW1lc29uLmMKaW5kZXggNzFkMzkyOS4uNzZlMjg5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1tZXNvbi5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbWVzb24uYwpAQCAtMjExLDcgKzIxMSw3IEBACiAJCW1lc29uX2kyY19hZGRfdG9rZW4oaTJjLCBUT0tFTl9TVE9QKTsKIAl9IGVsc2UgewogCQlpMmMtPnN0YXRlID0gU1RBVEVfSURMRTsKLQkJY29tcGxldGVfYWxsKCZpMmMtPmRvbmUpOworCQljb21wbGV0ZSgmaTJjLT5kb25lKTsKIAl9CiB9CiAKQEAgLTIzOCw3ICsyMzgsNyBAQAogCQlkZXZfZGJnKGkyYy0+ZGV2LCAiZXJyb3IgYml0IHNldFxuIik7CiAJCWkyYy0+ZXJyb3IgPSAtRU5YSU87CiAJCWkyYy0+c3RhdGUgPSBTVEFURV9JRExFOwotCQljb21wbGV0ZV9hbGwoJmkyYy0+ZG9uZSk7CisJCWNvbXBsZXRlKCZpMmMtPmRvbmUpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTI2OSw3ICsyNjksNyBAQAogCQlicmVhazsKIAljYXNlIFNUQVRFX1NUT1A6CiAJCWkyYy0+c3RhdGUgPSBTVEFURV9JRExFOwotCQljb21wbGV0ZV9hbGwoJmkyYy0+ZG9uZSk7CisJCWNvbXBsZXRlKCZpMmMtPmRvbmUpOwogCQlicmVhazsKIAljYXNlIFNUQVRFX0lETEU6CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vY29yZXMuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb2NvcmVzLmMKaW5kZXggZGZhN2E0Yi4uYWM4OGE1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vY29yZXMuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9jb3Jlcy5jCkBAIC0zNzksNiArMzc5LDcgQEAKIAkJCWlmICghY2xvY2tfZnJlcXVlbmN5X3ByZXNlbnQpIHsKIAkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkJCSJNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciAnb3BlbmNvcmVzLGlwLWNsb2NrLWZyZXF1ZW5jeSdcbiIpOworCQkJCWNsa19kaXNhYmxlX3VucHJlcGFyZShpMmMtPmNsayk7CiAJCQkJcmV0dXJuIC1FTk9ERVY7CiAJCQl9CiAJCQlpMmMtPmlwX2Nsb2NrX2toeiA9IGNsb2NrX2ZyZXF1ZW5jeSAvIDEwMDA7CkBAIC00NjcsMjAgKzQ2OCwyMSBAQAogCQlkZWZhdWx0OgogCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5zdXBwb3J0ZWQgSS9PIHdpZHRoICglZClcbiIsCiAJCQkJaTJjLT5yZWdfaW9fd2lkdGgpOwotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJfY2xrOwogCQl9CiAJfQogCiAJcmV0ID0gb2NvcmVzX2luaXQoJnBkZXYtPmRldiwgaTJjKTsKIAlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCQlnb3RvIGVycl9jbGs7CiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpMmMtPndhaXQpOwogCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgaXJxLCBvY29yZXNfaXNyLCAwLAogCQkJICAgICAgIHBkZXYtPm5hbWUsIGkyYyk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgY2xhaW0gSVJRXG4iKTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnJfY2xrOwogCX0KIAogCS8qIGhvb2sgdXAgZHJpdmVyIHRvIHRyZWUgKi8KQEAgLTQ5NCw3ICs0OTYsNyBAQAogCXJldCA9IGkyY19hZGRfYWRhcHRlcigmaTJjLT5hZGFwKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhZGQgYWRhcHRlclxuIik7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gZXJyX2NsazsKIAl9CiAKIAkvKiBhZGQgaW4ga25vd24gZGV2aWNlcyB0byB0aGUgYnVzICovCkBAIC01MDQsNiArNTA2LDEwIEBACiAJfQogCiAJcmV0dXJuIDA7CisKK2Vycl9jbGs6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGkyYy0+Y2xrKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IG9jb3Jlc19pMmNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXF1cC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1xdXAuYwppbmRleCA1MDFiZDE1Li5hODQ5N2NmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXF1cC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcXVwLmMKQEAgLTE1OTksNyArMTU5OSw4IEBACiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiBzdGF0aWMgaW50IHF1cF9pMmNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCiB7Ci0JcXVwX2kyY19wbV9zdXNwZW5kX3J1bnRpbWUoZGV2aWNlKTsKKwlpZiAoIXBtX3J1bnRpbWVfc3VzcGVuZGVkKGRldmljZSkpCisJCXJldHVybiBxdXBfaTJjX3BtX3N1c3BlbmRfcnVudGltZShkZXZpY2UpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXJjYXIuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcmNhci5jCmluZGV4IDUyNDA3ZjMuLjliZDg0OWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcmNhci5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcmNhci5jCkBAIC0zNzgsNyArMzc4LDcgQEAKIAl9CiAKIAlkbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGNoYW4tPmRldmljZS0+ZGV2LCBidWYsIGxlbiwgZGlyKTsKLQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBkbWFfYWRkcikpIHsKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IoY2hhbi0+ZGV2aWNlLT5kZXYsIGRtYV9hZGRyKSkgewogCQlkZXZfZGJnKGRldiwgImRtYSBtYXAgZmFpbGVkLCB1c2luZyBQSU9cbiIpOwogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1yazN4LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXJrM3guYwppbmRleCAyYmM4YjAxLi41YzViN2NhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXJrM3guYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXJrM3guYwpAQCAtOTE4LDcgKzkxOCw3IEBACiAgKiBDb2RlIGFkYXB0ZWQgZnJvbSBpMmMtY2FkZW5jZS5jLgogICoKICAqIFJldHVybjoJTk9USUZZX1NUT1AgaWYgdGhlIHJhdGUgY2hhbmdlIHNob3VsZCBiZSBhYm9ydGVkLCBOT1RJRllfT0sKLSAqCQl0byBhY2tub3dlZGdlIHRoZSBjaGFuZ2UsIE5PVElGWV9ET05FIGlmIHRoZSBub3RpZmljYXRpb24gaXMKKyAqCQl0byBhY2tub3dsZWRnZSB0aGUgY2hhbmdlLCBOT1RJRllfRE9ORSBpZiB0aGUgbm90aWZpY2F0aW9uIGlzCiAgKgkJY29uc2lkZXJlZCBpcnJlbGV2YW50LgogICovCiBzdGF0aWMgaW50IHJrM3hfaTJjX2Nsa19ub3RpZmllcl9jYihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nCkBAIC0xMTExLDYgKzExMTEsMTUgQEAKIAlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IG51bTsKIH0KIAorc3RhdGljIF9fbWF5YmVfdW51c2VkIGludCByazN4X2kyY19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCByazN4X2kyYyAqaTJjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlyazN4X2kyY19hZGFwdF9kaXYoaTJjLCBjbGtfZ2V0X3JhdGUoaTJjLT5jbGspKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgdTMyIHJrM3hfaTJjX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQogewogCXJldHVybiBJMkNfRlVOQ19JMkMgfCBJMkNfRlVOQ19TTUJVU19FTVVMIHwgSTJDX0ZVTkNfUFJPVE9DT0xfTUFOR0xJTkc7CkBAIC0xMzM0LDEyICsxMzQzLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhyazN4X2kyY19wbV9vcHMsIE5VTEwsIHJrM3hfaTJjX3Jlc3VtZSk7CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHJrM3hfaTJjX2RyaXZlciA9IHsKIAkucHJvYmUgICA9IHJrM3hfaTJjX3Byb2JlLAogCS5yZW1vdmUgID0gcmszeF9pMmNfcmVtb3ZlLAogCS5kcml2ZXIgID0gewogCQkubmFtZSAgPSAicmszeC1pMmMiLAogCQkub2ZfbWF0Y2hfdGFibGUgPSByazN4X2kyY19tYXRjaCwKKwkJLnBtID0gJnJrM3hfaTJjX3BtX29wcywKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaF9tb2JpbGUuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2hfbW9iaWxlLmMKaW5kZXggNmZiM2UyNi4uMDViMWVlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaF9tb2JpbGUuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNoX21vYmlsZS5jCkBAIC02MTAsNyArNjEwLDcgQEAKIAkJcmV0dXJuOwogCiAJZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZShjaGFuLT5kZXZpY2UtPmRldiwgcGQtPm1zZy0+YnVmLCBwZC0+bXNnLT5sZW4sIGRpcik7Ci0JaWYgKGRtYV9tYXBwaW5nX2Vycm9yKHBkLT5kZXYsIGRtYV9hZGRyKSkgeworCWlmIChkbWFfbWFwcGluZ19lcnJvcihjaGFuLT5kZXZpY2UtPmRldiwgZG1hX2FkZHIpKSB7CiAJCWRldl9kYmcocGQtPmRldiwgImRtYSBtYXAgZmFpbGVkLCB1c2luZyBQSU9cbiIpOwogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvbXV4ZXMvaTJjLWRlbXV4LXBpbmN0cmwuYyBiL2RyaXZlcnMvaTJjL211eGVzL2kyYy1kZW11eC1waW5jdHJsLmMKaW5kZXggOGRlMDczYS4uYjM4OTNmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvbXV4ZXMvaTJjLWRlbXV4LXBpbmN0cmwuYworKysgYi9kcml2ZXJzL2kyYy9tdXhlcy9pMmMtZGVtdXgtcGluY3RybC5jCkBAIC0zNyw4ICszNyw2IEBACiAJc3RydWN0IGkyY19kZW11eF9waW5jdHJsX2NoYW4gY2hhbltdOwogfTsKIAotc3RhdGljIHN0cnVjdCBwcm9wZXJ0eSBzdGF0dXNfb2theSA9IHsgLm5hbWUgPSAic3RhdHVzIiwgLmxlbmd0aCA9IDMsIC52YWx1ZSA9ICJvayIgfTsKLQogc3RhdGljIGludCBpMmNfZGVtdXhfbWFzdGVyX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBzdHJ1Y3QgaTJjX21zZyBtc2dzW10sIGludCBudW0pCiB7CiAJc3RydWN0IGkyY19kZW11eF9waW5jdHJsX3ByaXYgKnByaXYgPSBhZGFwLT5hbGdvX2RhdGE7CkBAIC02OCw3ICs2Niw3IEBACiAJYWRhcCA9IG9mX2ZpbmRfaTJjX2FkYXB0ZXJfYnlfbm9kZShwcml2LT5jaGFuW25ld19jaGFuXS5wYXJlbnRfbnApOwogCWlmICghYWRhcCkgewogCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGVycjsKKwkJZ290byBlcnJfd2l0aF9yZXZlcnQ7CiAJfQogCiAJcCA9IGRldm1fcGluY3RybF9nZXRfc2VsZWN0KGFkYXAtPmRldi5wYXJlbnQsIHByaXYtPmJ1c19uYW1lKTsKQEAgLTEwMyw4ICsxMDEsMTEgQEAKIAogIGVycl93aXRoX3B1dDoKIAlpMmNfcHV0X2FkYXB0ZXIoYWRhcCk7CisgZXJyX3dpdGhfcmV2ZXJ0OgorCW9mX2NoYW5nZXNldF9yZXZlcnQoJnByaXYtPmNoYW5bbmV3X2NoYW5dLmNoZ3NldCk7CiAgZXJyOgogCWRldl9lcnIocHJpdi0+ZGV2LCAiZmFpbGVkIHRvIHNldHVwIGRlbXV4LWFkYXB0ZXIgJWQgKCVkKVxuIiwgbmV3X2NoYW4sIHJldCk7CisJcHJpdi0+Y3VyX2NoYW4gPSAtRUlOVkFMOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE5MCw2ICsxOTEsNyBAQAogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAlzdHJ1Y3QgaTJjX2RlbXV4X3BpbmN0cmxfcHJpdiAqcHJpdjsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3BzOwogCWludCBudW1fY2hhbiwgaSwgaiwgZXJyOwogCiAJbnVtX2NoYW4gPSBvZl9jb3VudF9waGFuZGxlX3dpdGhfYXJncyhucCwgImkyYy1wYXJlbnQiLCBOVUxMKTsKQEAgLTIwMCw3ICsyMDIsMTAgQEAKIAogCXByaXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwcml2KQogCQkJICAgKyBudW1fY2hhbiAqIHNpemVvZihzdHJ1Y3QgaTJjX2RlbXV4X3BpbmN0cmxfY2hhbiksIEdGUF9LRVJORUwpOwotCWlmICghcHJpdikKKworCXByb3BzID0gZGV2bV9rY2FsbG9jKCZwZGV2LT5kZXYsIG51bV9jaGFuLCBzaXplb2YoKnByb3BzKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXByaXYgfHwgIXByb3BzKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWVyciA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKG5wLCAiaTJjLWJ1cy1uYW1lIiwgJnByaXYtPmJ1c19uYW1lKTsKQEAgLTIxOCw4ICsyMjMsMTIgQEAKIAkJfQogCQlwcml2LT5jaGFuW2ldLnBhcmVudF9ucCA9IGFkYXBfbnA7CiAKKwkJcHJvcHNbaV0ubmFtZSA9IGRldm1fa3N0cmR1cCgmcGRldi0+ZGV2LCAic3RhdHVzIiwgR0ZQX0tFUk5FTCk7CisJCXByb3BzW2ldLnZhbHVlID0gZGV2bV9rc3RyZHVwKCZwZGV2LT5kZXYsICJvayIsIEdGUF9LRVJORUwpOworCQlwcm9wc1tpXS5sZW5ndGggPSAzOworCiAJCW9mX2NoYW5nZXNldF9pbml0KCZwcml2LT5jaGFuW2ldLmNoZ3NldCk7Ci0JCW9mX2NoYW5nZXNldF91cGRhdGVfcHJvcGVydHkoJnByaXYtPmNoYW5baV0uY2hnc2V0LCBhZGFwX25wLCAmc3RhdHVzX29rYXkpOworCQlvZl9jaGFuZ2VzZXRfdXBkYXRlX3Byb3BlcnR5KCZwcml2LT5jaGFuW2ldLmNoZ3NldCwgYWRhcF9ucCwgJnByb3BzW2ldKTsKIAl9CiAKIAlwcml2LT5udW1fY2hhbiA9IG51bV9jaGFuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvbXV4ZXMvaTJjLW11eC1wY2E5NTR4LmMgYi9kcml2ZXJzL2kyYy9tdXhlcy9pMmMtbXV4LXBjYTk1NHguYwppbmRleCA1MjhlNzU1Li4zMjc4ZWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9tdXhlcy9pMmMtbXV4LXBjYTk1NHguYworKysgYi9kcml2ZXJzL2kyYy9tdXhlcy9pMmMtbXV4LXBjYTk1NHguYwpAQCAtMTY0LDcgKzE2NCw3IEBACiAJLyogT25seSBzZWxlY3QgdGhlIGNoYW5uZWwgaWYgaXRzIGRpZmZlcmVudCBmcm9tIHRoZSBsYXN0IGNoYW5uZWwgKi8KIAlpZiAoZGF0YS0+bGFzdF9jaGFuICE9IHJlZ3ZhbCkgewogCQlyZXQgPSBwY2E5NTR4X3JlZ193cml0ZShtdXhjLT5wYXJlbnQsIGNsaWVudCwgcmVndmFsKTsKLQkJZGF0YS0+bGFzdF9jaGFuID0gcmVndmFsOworCQlkYXRhLT5sYXN0X2NoYW4gPSByZXQgPyAwIDogcmVndmFsOwogCX0KIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hY2NlbC9LY29uZmlnIGIvZHJpdmVycy9paW8vYWNjZWwvS2NvbmZpZwppbmRleCA4OWQ3ODIwLi4yYjc5MWZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hY2NlbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaWlvL2FjY2VsL0tjb25maWcKQEAgLTIwLDYgKzIwLDggQEAKIGNvbmZpZyBCTUEyMjAKICAgICB0cmlzdGF0ZSAiQm9zY2ggQk1BMjIwIDMtQXhpcyBBY2NlbGVyb21ldGVyIERyaXZlciIKIAlkZXBlbmRzIG9uIFNQSQorCXNlbGVjdCBJSU9fQlVGRkVSCisJc2VsZWN0IElJT19UUklHR0VSRURfQlVGRkVSCiAgICAgaGVscAogICAgICAgU2F5IHllcyBoZXJlIHRvIGFkZCBzdXBwb3J0IGZvciB0aGUgQm9zY2ggQk1BMjIwIHRyaWF4aWFsCiAgICAgICBhY2NlbGVyYXRpb24gc2Vuc29yLgpAQCAtNTAsNiArNTIsMjcgQEAKIAl0cmlzdGF0ZQogCXNlbGVjdCBSRUdNQVBfU1BJCiAKK2NvbmZpZyBETUFSRDA2CisJdHJpc3RhdGUgIkRvbWludGVjaCBETUFSRDA2IERpZ2l0YWwgQWNjZWxlcm9tZXRlciBEcml2ZXIiCisJZGVwZW5kcyBvbiBPRiB8fCBDT01QSUxFX1RFU1QKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgRG9taW50ZWNoIGxvdy1nIHRyaS1heGlhbAorCSAgZGlnaXRhbCBhY2NlbGVyb21ldGVyczogRE1BUkQwNSwgRE1BUkQwNiwgRE1BUkQwNy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZG1hcmQwNi4KKworY29uZmlnIERNQVJEMDkKKwl0cmlzdGF0ZSAiRG9taW50ZWNoIERNQVJEMDkgMy1heGlzIEFjY2VsZXJvbWV0ZXIgRHJpdmVyIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGdldCBzdXBwb3J0IGZvciB0aGUgRG9taW50ZWNoIERNQVJEMDkgMy1heGlzCisJICBhY2NlbGVyb21ldGVyLgorCisJICBDaG9vc2luZyBNIHdpbGwgYnVpbGQgdGhlIGRyaXZlciBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGRtYXJkMDkuCisKIGNvbmZpZyBISURfU0VOU09SX0FDQ0VMXzNECiAJZGVwZW5kcyBvbiBISURfU0VOU09SX0hVQgogCXNlbGVjdCBJSU9fQlVGRkVSCkBAIC05NiwxNCArMTE5LDM1IEBACiAKIGNvbmZpZyBLWFNEOQogCXRyaXN0YXRlICJLaW9uaXggS1hTRDkgQWNjZWxlcm9tZXRlciBEcml2ZXIiCi0JZGVwZW5kcyBvbiBTUEkKKwlzZWxlY3QgSUlPX0JVRkZFUgorCXNlbGVjdCBJSU9fVFJJR0dFUkVEX0JVRkZFUgogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgS2lvbml4IEtYU0Q5IGFjY2VsZXJvbWV0ZXIuCi0JICBDdXJyZW50bHkgdGhpcyBvbmx5IHN1cHBvcnRzIHRoZSBkZXZpY2UgdmlhIGFuIFNQSSBpbnRlcmZhY2UuCisJICBJdCBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgYW4gKG9wdGlvbmFsKSBTUEkgb3IgSTJDIGludGVyZmFjZS4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQga3hzZDkuCiAKK2NvbmZpZyBLWFNEOV9TUEkKKwl0cmlzdGF0ZSAiS2lvbml4IEtYU0Q5IFNQSSB0cmFuc3BvcnQiCisJZGVwZW5kcyBvbiBLWFNEOQorCWRlcGVuZHMgb24gU1BJCisJZGVmYXVsdCBLWFNEOQorCXNlbGVjdCBSRUdNQVBfU1BJCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGVuYWJsZSB0aGUgS2lvbml4IEtYU0Q5IGFjY2VsZXJvbWV0ZXIKKwkgIFNQSSB0cmFuc3BvcnQgY2hhbm5lbC4KKworY29uZmlnIEtYU0Q5X0kyQworCXRyaXN0YXRlICJLaW9uaXggS1hTRDkgSTJDIHRyYW5zcG9ydCIKKwlkZXBlbmRzIG9uIEtYU0Q5CisJZGVwZW5kcyBvbiBJMkMKKwlkZWZhdWx0IEtYU0Q5CisJc2VsZWN0IFJFR01BUF9JMkMKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gZW5hYmxlIHRoZSBLaW9uaXggS1hTRDkgYWNjZWxlcm9tZXRlcgorCSAgSTJDIHRyYW5zcG9ydCBjaGFubmVsLgorCiBjb25maWcgS1hDSksxMDEzCiAJdHJpc3RhdGUgIktpb25peCAzLUF4aXMgQWNjZWxlcm9tZXRlciBEcml2ZXIiCiAJZGVwZW5kcyBvbiBJMkMKQEAgLTExNyw2ICsxNjEsMTYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbAogCSAgYmUgY2FsbGVkIGt4Y2prLTEwMTMuCiAKK2NvbmZpZyBNQzMyMzAKKwl0cmlzdGF0ZSAibUN1YmUgTUMzMjMwIERpZ2l0YWwgQWNjZWxlcm9tZXRlciBEcml2ZXIiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIG1DdWJlIE1DMzIzMCBsb3ctZyB0cmktYXhpYWwKKwkgIGRpZ2l0YWwgYWNjZWxlcm9tZXRlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbWMzMjMwLgorCiBjb25maWcgTU1BNzQ1NQogCXRyaXN0YXRlCiAJc2VsZWN0IElJT19CVUZGRVIKQEAgLTIzNCw3ICsyODgsOCBAQAogY29uZmlnIFNUSzhCQTUwCiAJdHJpc3RhdGUgIlNlbnNvcnRlayBTVEs4QkE1MCAzLUF4aXMgQWNjZWxlcm9tZXRlciBEcml2ZXIiCiAJZGVwZW5kcyBvbiBJMkMKLQlkZXBlbmRzIG9uIElJT19UUklHR0VSCisJc2VsZWN0IElJT19CVUZGRVIKKwlzZWxlY3QgSUlPX1RSSUdHRVJFRF9CVUZGRVIKIAloZWxwCiAJICBTYXkgeWVzIGhlcmUgdG8gZ2V0IHN1cHBvcnQgZm9yIHRoZSBTZW5zb3J0ZWsgU1RLOEJBNTAgMy1heGlzCiAJICBhY2NlbGVyb21ldGVyLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWNjZWwvTWFrZWZpbGUgYi9kcml2ZXJzL2lpby9hY2NlbC9NYWtlZmlsZQppbmRleCA2Y2VkYmVjLi5mNWQzZGRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hY2NlbC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lpby9hY2NlbC9NYWtlZmlsZQpAQCAtOCw5ICs4LDE0IEBACiBvYmotJChDT05GSUdfQk1DMTUwX0FDQ0VMKSArPSBibWMxNTAtYWNjZWwtY29yZS5vCiBvYmotJChDT05GSUdfQk1DMTUwX0FDQ0VMX0kyQykgKz0gYm1jMTUwLWFjY2VsLWkyYy5vCiBvYmotJChDT05GSUdfQk1DMTUwX0FDQ0VMX1NQSSkgKz0gYm1jMTUwLWFjY2VsLXNwaS5vCitvYmotJChDT05GSUdfRE1BUkQwNikJKz0gZG1hcmQwNi5vCitvYmotJChDT05GSUdfRE1BUkQwOSkJKz0gZG1hcmQwOS5vCiBvYmotJChDT05GSUdfSElEX1NFTlNPUl9BQ0NFTF8zRCkgKz0gaGlkLXNlbnNvci1hY2NlbC0zZC5vCiBvYmotJChDT05GSUdfS1hDSksxMDEzKSArPSBreGNqay0xMDEzLm8KIG9iai0kKENPTkZJR19LWFNEOSkJKz0ga3hzZDkubworb2JqLSQoQ09ORklHX0tYU0Q5X1NQSSkJKz0ga3hzZDktc3BpLm8KK29iai0kKENPTkZJR19LWFNEOV9JMkMpCSs9IGt4c2Q5LWkyYy5vCitvYmotJChDT05GSUdfTUMzMjMwKQkrPSBtYzMyMzAubwogCiBvYmotJChDT05GSUdfTU1BNzQ1NSkJCSs9IG1tYTc0NTVfY29yZS5vCiBvYmotJChDT05GSUdfTU1BNzQ1NV9JMkMpCSs9IG1tYTc0NTVfaTJjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FjY2VsL2JtYTE4MC5jIGIvZHJpdmVycy9paW8vYWNjZWwvYm1hMTgwLmMKaW5kZXggZTNmODhiYS4uMDg5MDkzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWNjZWwvYm1hMTgwLmMKKysrIGIvZHJpdmVycy9paW8vYWNjZWwvYm1hMTgwLmMKQEAgLTQ2OSwxMyArNDY5LDE0IEBACiAKIAlzd2l0Y2ggKG1hc2spIHsKIAljYXNlIElJT19DSEFOX0lORk9fUkFXOgorCQlyZXQgPSBpaW9fZGV2aWNlX2NsYWltX2RpcmVjdF9tb2RlKGluZGlvX2Rldik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCiAJCW11dGV4X2xvY2soJmRhdGEtPm11dGV4KTsKLQkJaWYgKGlpb19idWZmZXJfZW5hYmxlZChpbmRpb19kZXYpKSB7Ci0JCQltdXRleF91bmxvY2soJmRhdGEtPm11dGV4KTsKLQkJCXJldHVybiAtRUJVU1k7Ci0JCX0KIAkJcmV0ID0gYm1hMTgwX2dldF9kYXRhX3JlZyhkYXRhLCBjaGFuLT5zY2FuX2luZGV4KTsKIAkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5tdXRleCk7CisJCWlpb19kZXZpY2VfcmVsZWFzZV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAJCSp2YWwgPSBzaWduX2V4dGVuZDMyKHJldCA+PiBjaGFuLT5zY2FuX3R5cGUuc2hpZnQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hY2NlbC9ibWEyMjBfc3BpLmMgYi9kcml2ZXJzL2lpby9hY2NlbC9ibWEyMjBfc3BpLmMKaW5kZXggMTA5OGQxMC4uNTA5OWYyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWNjZWwvYm1hMjIwX3NwaS5jCisrKyBiL2RyaXZlcnMvaWlvL2FjY2VsL2JtYTIyMF9zcGkuYwpAQCAtMjUzLDcgKzI1Myw3IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9zZXR1cChpbmRpb19kZXYsIE5VTEwsCisJcmV0ID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfc2V0dXAoaW5kaW9fZGV2LCBpaW9fcG9sbGZ1bmNfc3RvcmVfdGltZSwKIAkJCQkJIGJtYTIyMF90cmlnZ2VyX2hhbmRsZXIsIE5VTEwpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJnNwaS0+ZGV2LCAiaWlvIHRyaWdnZXJlZCBidWZmZXIgc2V0dXAgZmFpbGVkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FjY2VsL2JtYzE1MC1hY2NlbC1jb3JlLmMgYi9kcml2ZXJzL2lpby9hY2NlbC9ibWMxNTAtYWNjZWwtY29yZS5jCmluZGV4IGJmMTdhYWUuLjU5YjM4MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FjY2VsL2JtYzE1MC1hY2NlbC1jb3JlLmMKKysrIGIvZHJpdmVycy9paW8vYWNjZWwvYm1jMTUwLWFjY2VsLWNvcmUuYwpAQCAtNjcsNiArNjcsOSBAQAogI2RlZmluZSBCTUMxNTBfQUNDRUxfUkVHX1BNVV9CVwkJMHgxMAogI2RlZmluZSBCTUMxNTBfQUNDRUxfREVGX0JXCQkJMTI1CiAKKyNkZWZpbmUgQk1DMTUwX0FDQ0VMX1JFR19SRVNFVAkJCTB4MTQKKyNkZWZpbmUgQk1DMTUwX0FDQ0VMX1JFU0VUX1ZBTAkJCTB4QjYKKwogI2RlZmluZSBCTUMxNTBfQUNDRUxfUkVHX0lOVF9NQVBfMAkJMHgxOQogI2RlZmluZSBCTUMxNTBfQUNDRUxfSU5UX01BUF8wX0JJVF9TTE9QRQlCSVQoMikKIApAQCAtMTQ5Nyw2ICsxNTAwLDE0IEBACiAJaW50IHJldCwgaTsKIAl1bnNpZ25lZCBpbnQgdmFsOwogCisJLyoKKwkgKiBSZXNldCBjaGlwIHRvIGdldCBpdCBpbiBhIGtub3duIGdvb2Qgc3RhdGUuIEEgZGVsYXkgb2YgMS44bXMgYWZ0ZXIKKwkgKiByZXNldCBpcyByZXF1aXJlZCBhY2NvcmRpbmcgdG8gdGhlIGRhdGEgc2hlZXRzIG9mIHN1cHBvcnRlZCBjaGlwcy4KKwkgKi8KKwlyZWdtYXBfd3JpdGUoZGF0YS0+cmVnbWFwLCBCTUMxNTBfQUNDRUxfUkVHX1JFU0VULAorCQkgICAgIEJNQzE1MF9BQ0NFTF9SRVNFVF9WQUwpOworCXVzbGVlcF9yYW5nZSgxODAwLCAyNTAwKTsKKwogCXJldCA9IHJlZ21hcF9yZWFkKGRhdGEtPnJlZ21hcCwgQk1DMTUwX0FDQ0VMX1JFR19DSElQX0lELCAmdmFsKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGRldiwgIkVycm9yOiBSZWFkaW5nIGNoaXAgaWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWNjZWwvZG1hcmQwNi5jIGIvZHJpdmVycy9paW8vYWNjZWwvZG1hcmQwNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NmNhOGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9hY2NlbC9kbWFyZDA2LmMKQEAgLTAsMCArMSwyNDEgQEAKKy8qCisgKiBJSU8gZHJpdmVyIGZvciBEb21pbnRlY2ggRE1BUkQwNiBhY2NlbGVyb21ldGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFsZWtzZWkgTWFtbGluIDxtYW1saW5hdkBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisKKyNkZWZpbmUgRE1BUkQwNl9EUlZfTkFNRQkJImRtYXJkMDYiCisKKy8qIERldmljZSBkYXRhIHJlZ2lzdGVycyAqLworI2RlZmluZSBETUFSRDA2X0NISVBfSURfUkVHCQkweDBmCisjZGVmaW5lIERNQVJEMDZfVE9VVF9SRUcJCTB4NDAKKyNkZWZpbmUgRE1BUkQwNl9YT1VUX1JFRwkJMHg0MQorI2RlZmluZSBETUFSRDA2X1lPVVRfUkVHCQkweDQyCisjZGVmaW5lIERNQVJEMDZfWk9VVF9SRUcJCTB4NDMKKyNkZWZpbmUgRE1BUkQwNl9DVFJMMV9SRUcJCTB4NDQKKworLyogRGV2aWNlIElEIHZhbHVlICovCisjZGVmaW5lIERNQVJEMDVfQ0hJUF9JRAkJCTB4MDUKKyNkZWZpbmUgRE1BUkQwNl9DSElQX0lECQkJMHgwNgorI2RlZmluZSBETUFSRDA3X0NISVBfSUQJCQkweDA3CisKKy8qIERldmljZSB2YWx1ZXMgKi8KKyNkZWZpbmUgRE1BUkQwNV9BWElTX1NDQUxFX1ZBTAkJMTU2MjUKKyNkZWZpbmUgRE1BUkQwNl9BWElTX1NDQUxFX1ZBTAkJMzEyNTAKKyNkZWZpbmUgRE1BUkQwNl9URU1QX0NFTlRFUl9WQUwJCTI1CisjZGVmaW5lIERNQVJEMDZfU0lHTl9CSVQJCTcKKworLyogRGV2aWNlIHBvd2VyIG1vZGVzICovCisjZGVmaW5lIERNQVJEMDZfTU9ERV9OT1JNQUwJCTB4MjcKKyNkZWZpbmUgRE1BUkQwNl9NT0RFX1BPV0VSRE9XTgkJMHgwMAorCisvKiBEZXZpY2UgY2hhbm5lbHMgKi8KKyNkZWZpbmUgRE1BUkQwNl9BQ0NFTF9DSEFOTkVMKF9heGlzLCBfcmVnKSB7CQkJXAorCS50eXBlID0gSUlPX0FDQ0VMLAkJCQkJXAorCS5hZGRyZXNzID0gX3JlZywJCQkJCVwKKwkuY2hhbm5lbDIgPSBJSU9fTU9EXyMjX2F4aXMsCQkJCVwKKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwJCVwKKwkuaW5mb19tYXNrX3NoYXJlZF9ieV90eXBlID0gQklUKElJT19DSEFOX0lORk9fU0NBTEUpLAlcCisJLm1vZGlmaWVkID0gMSwJCQkJCQlcCit9CisKKyNkZWZpbmUgRE1BUkQwNl9URU1QX0NIQU5ORUwoX3JlZykgewkJCQlcCisJLnR5cGUgPSBJSU9fVEVNUCwJCQkJCVwKKwkuYWRkcmVzcyA9IF9yZWcsCQkJCQlcCisJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVykgfAkJXAorCQkJICAgICAgQklUKElJT19DSEFOX0lORk9fT0ZGU0VUKSwJXAorfQorCitzdHJ1Y3QgZG1hcmQwNl9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXU4IGNoaXBfaWQ7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgZG1hcmQwNl9jaGFubmVsc1tdID0geworCURNQVJEMDZfQUNDRUxfQ0hBTk5FTChYLCBETUFSRDA2X1hPVVRfUkVHKSwKKwlETUFSRDA2X0FDQ0VMX0NIQU5ORUwoWSwgRE1BUkQwNl9ZT1VUX1JFRyksCisJRE1BUkQwNl9BQ0NFTF9DSEFOTkVMKFosIERNQVJEMDZfWk9VVF9SRUcpLAorCURNQVJEMDZfVEVNUF9DSEFOTkVMKERNQVJEMDZfVE9VVF9SRUcpLAorfTsKKworc3RhdGljIGludCBkbWFyZDA2X3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICAgaW50ICp2YWwsIGludCAqdmFsMiwgbG9uZyBtYXNrKQoreworCXN0cnVjdCBkbWFyZDA2X2RhdGEgKmRtYXJkMDYgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQ7CisKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIElJT19DSEFOX0lORk9fUkFXOgorCQlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZG1hcmQwNi0+Y2xpZW50LAorCQkJCQkgICAgICAgY2hhbi0+YWRkcmVzcyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZkbWFyZDA2LT5jbGllbnQtPmRldiwKKwkJCQkiRXJyb3IgcmVhZGluZyBkYXRhOiAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQkqdmFsID0gc2lnbl9leHRlbmQzMihyZXQsIERNQVJEMDZfU0lHTl9CSVQpOworCisJCWlmIChkbWFyZDA2LT5jaGlwX2lkID09IERNQVJEMDZfQ0hJUF9JRCkKKwkJCSp2YWwgPSAqdmFsID4+IDE7CisKKwkJc3dpdGNoIChjaGFuLT50eXBlKSB7CisJCWNhc2UgSUlPX0FDQ0VMOgorCQkJcmV0dXJuIElJT19WQUxfSU5UOworCQljYXNlIElJT19URU1QOgorCQkJaWYgKGRtYXJkMDYtPmNoaXBfaWQgIT0gRE1BUkQwNl9DSElQX0lEKQorCQkJCSp2YWwgPSAqdmFsIC8gMjsKKwkJCXJldHVybiBJSU9fVkFMX0lOVDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJY2FzZSBJSU9fQ0hBTl9JTkZPX09GRlNFVDoKKwkJc3dpdGNoIChjaGFuLT50eXBlKSB7CisJCWNhc2UgSUlPX1RFTVA6CisJCQkqdmFsID0gRE1BUkQwNl9URU1QX0NFTlRFUl9WQUw7CisJCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCWNhc2UgSUlPX0NIQU5fSU5GT19TQ0FMRToKKwkJc3dpdGNoIChjaGFuLT50eXBlKSB7CisJCWNhc2UgSUlPX0FDQ0VMOgorCQkJKnZhbCA9IDA7CisJCQlpZiAoZG1hcmQwNi0+Y2hpcF9pZCA9PSBETUFSRDA2X0NISVBfSUQpCisJCQkJKnZhbDIgPSBETUFSRDA2X0FYSVNfU0NBTEVfVkFMOworCQkJZWxzZQorCQkJCSp2YWwyID0gRE1BUkQwNV9BWElTX1NDQUxFX1ZBTDsKKwkJCXJldHVybiBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gZG1hcmQwNl9pbmZvID0geworCS5kcml2ZXJfbW9kdWxlCT0gVEhJU19NT0RVTEUsCisJLnJlYWRfcmF3CT0gZG1hcmQwNl9yZWFkX3JhdywKK307CisKK3N0YXRpYyBpbnQgZG1hcmQwNl9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3QgZG1hcmQwNl9kYXRhICpkbWFyZDA2OworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgY2hlY2sgZnVuY3Rpb25hbGl0eSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqZG1hcmQwNikpOworCWlmICghaW5kaW9fZGV2KSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIGlpbyBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkbWFyZDA2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlkbWFyZDA2LT5jbGllbnQgPSBjbGllbnQ7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZG1hcmQwNi0+Y2xpZW50LCBETUFSRDA2X0NISVBfSURfUkVHKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkVycm9yIHJlYWRpbmcgY2hpcCBpZDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHJldCAhPSBETUFSRDA1X0NISVBfSUQgJiYgcmV0ICE9IERNQVJEMDZfQ0hJUF9JRCAmJgorCSAgICByZXQgIT0gRE1BUkQwN19DSElQX0lEKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSW52YWxpZCBjaGlwIGlkOiAlMDJkXG4iLCByZXQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkbWFyZDA2LT5jaGlwX2lkID0gcmV0OworCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgaW5kaW9fZGV2KTsKKwlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmY2xpZW50LT5kZXY7CisJaW5kaW9fZGV2LT5uYW1lID0gRE1BUkQwNl9EUlZfTkFNRTsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IGRtYXJkMDZfY2hhbm5lbHM7CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKGRtYXJkMDZfY2hhbm5lbHMpOworCWluZGlvX2Rldi0+aW5mbyA9ICZkbWFyZDA2X2luZm87CisKKwlyZXR1cm4gZGV2bV9paW9fZGV2aWNlX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgaW5kaW9fZGV2KTsKK30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBkbWFyZDA2X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBpMmNfZ2V0X2NsaWVudGRhdGEodG9faTJjX2NsaWVudChkZXYpKTsKKwlzdHJ1Y3QgZG1hcmQwNl9kYXRhICpkbWFyZDA2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkbWFyZDA2LT5jbGllbnQsIERNQVJEMDZfQ1RSTDFfUkVHLAorCQkJCQlETUFSRDA2X01PREVfUE9XRVJET1dOKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRtYXJkMDZfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaTJjX2dldF9jbGllbnRkYXRhKHRvX2kyY19jbGllbnQoZGV2KSk7CisJc3RydWN0IGRtYXJkMDZfZGF0YSAqZG1hcmQwNiA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldDsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZG1hcmQwNi0+Y2xpZW50LCBETUFSRDA2X0NUUkwxX1JFRywKKwkJCQkJRE1BUkQwNl9NT0RFX05PUk1BTCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGRtYXJkMDZfcG1fb3BzLCBkbWFyZDA2X3N1c3BlbmQsIGRtYXJkMDZfcmVzdW1lKTsKKyNkZWZpbmUgRE1BUkQwNl9QTV9PUFMgKCZkbWFyZDA2X3BtX29wcykKKyNlbHNlCisjZGVmaW5lIERNQVJEMDZfUE1fT1BTIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgZG1hcmQwNl9pZFtdID0geworCXsgImRtYXJkMDUiLCAwIH0sCisJeyAiZG1hcmQwNiIsIDAgfSwKKwl7ICJkbWFyZDA3IiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBkbWFyZDA2X2lkKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZG1hcmQwNl9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiZG9taW50ZWNoLGRtYXJkMDUiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJkb21pbnRlY2gsZG1hcmQwNiIgfSwKKwl7IC5jb21wYXRpYmxlID0gImRvbWludGVjaCxkbWFyZDA3IiB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGRtYXJkMDZfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZG1hcmQwNl9kcml2ZXIgPSB7CisJLnByb2JlID0gZG1hcmQwNl9wcm9iZSwKKwkuaWRfdGFibGUgPSBkbWFyZDA2X2lkLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRE1BUkQwNl9EUlZfTkFNRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKGRtYXJkMDZfb2ZfbWF0Y2gpLAorCQkucG0gPSBETUFSRDA2X1BNX09QUywKKwl9LAorfTsKK21vZHVsZV9pMmNfZHJpdmVyKGRtYXJkMDZfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiQWxla3NlaSBNYW1saW4gPG1hbWxpbmF2QGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRG9taW50ZWNoIERNQVJEMDYgYWNjZWxlcm9tZXRlciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FjY2VsL2RtYXJkMDkuYyBiL2RyaXZlcnMvaWlvL2FjY2VsL2RtYXJkMDkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2EyOGY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vYWNjZWwvZG1hcmQwOS5jCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogSUlPIGRyaXZlciBmb3IgdGhlIDMtYXhpcyBhY2NlbGVyb21ldGVyIERvbWludGVjaCBETUFSRDA5LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgSmVsbGUgdmFuIGRlciBXYWEgPGplbGxlQHZkd2FhLm5sPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KKworI2RlZmluZSBETUFSRDA5X0RSVl9OQU1FCSJkbWFyZDA5IgorCisjZGVmaW5lIERNQVJEMDlfUkVHX0NISVBJRCAgICAgIDB4MTgKKyNkZWZpbmUgRE1BUkQwOV9SRUdfU1RBVAkweDBBCisjZGVmaW5lIERNQVJEMDlfUkVHX1gJCTB4MEMKKyNkZWZpbmUgRE1BUkQwOV9SRUdfWQkJMHgwRQorI2RlZmluZSBETUFSRDA5X1JFR19aCQkweDEwCisjZGVmaW5lIERNQVJEMDlfQ0hJUElECQkweDk1CisKKyNkZWZpbmUgRE1BUkQwOV9CVUZfTEVOIDgKKyNkZWZpbmUgRE1BUkQwOV9BWElTX1ggMAorI2RlZmluZSBETUFSRDA5X0FYSVNfWSAxCisjZGVmaW5lIERNQVJEMDlfQVhJU19aIDIKKyNkZWZpbmUgRE1BUkQwOV9BWElTX1hfT0ZGU0VUICgoRE1BUkQwOV9BWElTX1ggKyAxKSAqIDIpCisjZGVmaW5lIERNQVJEMDlfQVhJU19ZX09GRlNFVCAoKERNQVJEMDlfQVhJU19ZICsgMSApKiAyKQorI2RlZmluZSBETUFSRDA5X0FYSVNfWl9PRkZTRVQgKChETUFSRDA5X0FYSVNfWiArIDEpICogMikKKworc3RydWN0IGRtYXJkMDlfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKK307CisKKyNkZWZpbmUgRE1BUkQwOV9DSEFOTkVMKF9heGlzLCBvZmZzZXQpIHsJCQlcCisJLnR5cGUgPSBJSU9fQUNDRUwsCQkJCQlcCisJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVyksCQlcCisJLmluZm9fbWFza19zaGFyZWRfYnlfdHlwZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSwJXAorCS5tb2RpZmllZCA9IDEsCQkJCQkJXAorCS5hZGRyZXNzID0gb2Zmc2V0LAkJCQkJXAorCS5jaGFubmVsMiA9IElJT19NT0RfIyNfYXhpcywJCQkJXAorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgZG1hcmQwOV9jaGFubmVsc1tdID0geworCURNQVJEMDlfQ0hBTk5FTChYLCBETUFSRDA5X0FYSVNfWF9PRkZTRVQpLAorCURNQVJEMDlfQ0hBTk5FTChZLCBETUFSRDA5X0FYSVNfWV9PRkZTRVQpLAorCURNQVJEMDlfQ0hBTk5FTChaLCBETUFSRDA5X0FYSVNfWl9PRkZTRVQpLAorfTsKKworc3RhdGljIGludCBkbWFyZDA5X3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICAgaW50ICp2YWwsIGludCAqdmFsMiwgbG9uZyBtYXNrKQoreworCXN0cnVjdCBkbWFyZDA5X2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXU4IGJ1ZltETUFSRDA5X0JVRl9MRU5dOworCWludCByZXQ7CisJczE2IGFjY2VsOworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJLyoKKwkJICogUmVhZCBmcm9tIHRoZSBETUFSMDlfUkVHX1NUQVQgcmVnaXN0ZXIsIHNpbmNlIHRoZSBjaGlwCisJCSAqIGNhY2hlcyByZWFkcyBmcm9tIHRoZSBpbmRpdmlkdWFsIFgsIFksIFogcmVnaXN0ZXJzLgorCQkgKi8KKwkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJCQkJICAgIERNQVJEMDlfUkVHX1NUQVQsCisJCQkJCQkgICAgRE1BUkQwOV9CVUZfTEVOLCBidWYpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycigmZGF0YS0+Y2xpZW50LT5kZXYsICJFcnJvciByZWFkaW5nIHJlZyAlZFxuIiwKKwkJCQlETUFSRDA5X1JFR19TVEFUKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlhY2NlbCA9IGdldF91bmFsaWduZWRfbGUxNigmYnVmW2NoYW4tPmFkZHJlc3NdKTsKKworCQkvKiBSZW1vdmUgbG93ZXIgMyBiaXRzIGFuZCBzaWduIGV4dGVuZCAqLworCQlhY2NlbCA8PD0gNDsKKwkJYWNjZWwgPj49IDc7CisKKwkJKnZhbCA9IGFjY2VsOworCisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gZG1hcmQwOV9pbmZvID0geworCS5kcml2ZXJfbW9kdWxlCT0gVEhJU19NT0RVTEUsCisJLnJlYWRfcmF3CT0gZG1hcmQwOV9yZWFkX3JhdywKK307CisKK3N0YXRpYyBpbnQgZG1hcmQwOV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3QgZG1hcmQwOV9kYXRhICpkYXRhOworCisJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKCpkYXRhKSk7CisJaWYgKCFpbmRpb19kZXYpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJpaW8gYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlkYXRhLT5jbGllbnQgPSBjbGllbnQ7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBETUFSRDA5X1JFR19DSElQSUQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRXJyb3IgcmVhZGluZyBjaGlwIGlkICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChyZXQgIT0gRE1BUkQwOV9DSElQSUQpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJbnZhbGlkIGNoaXAgaWQgJWRcbiIsIHJldCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGluZGlvX2Rldik7CisJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCWluZGlvX2Rldi0+bmFtZSA9IERNQVJEMDlfRFJWX05BTUU7CisJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBkbWFyZDA5X2NoYW5uZWxzOworCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShkbWFyZDA5X2NoYW5uZWxzKTsKKwlpbmRpb19kZXYtPmluZm8gPSAmZG1hcmQwOV9pbmZvOworCisJcmV0dXJuIGRldm1faWlvX2RldmljZV9yZWdpc3RlcigmY2xpZW50LT5kZXYsIGluZGlvX2Rldik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBkbWFyZDA5X2lkW10gPSB7CisJeyAiZG1hcmQwOSIsIDB9LAorCXsgfSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBkbWFyZDA5X2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRtYXJkMDlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRE1BUkQwOV9EUlZfTkFNRQorCX0sCisJLnByb2JlID0gZG1hcmQwOV9wcm9iZSwKKwkuaWRfdGFibGUgPSBkbWFyZDA5X2lkLAorfTsKKworbW9kdWxlX2kyY19kcml2ZXIoZG1hcmQwOV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJKZWxsZSB2YW4gZGVyIFdhYSA8amVsbGVAdmR3YWEubmw+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRNQVJEMDkgMy1heGlzIGFjY2VsZXJvbWV0ZXIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hY2NlbC9reGNqay0xMDEzLmMgYi9kcml2ZXJzL2lpby9hY2NlbC9reGNqay0xMDEzLmMKaW5kZXggNzY1YTcyMy4uM2Y5NjhjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWNjZWwva3hjamstMTAxMy5jCisrKyBiL2RyaXZlcnMvaWlvL2FjY2VsL2t4Y2prLTEwMTMuYwpAQCAtMTM5Miw2ICsxMzkyLDcgQEAKIAl7IktYQ0oxMDEzIiwgS1hDSksxMDEzfSwKIAl7IktYQ0oxMDA4IiwgS1hDSjkxMDA4fSwKIAl7IktYQ0o5MDAwIiwgS1hDSjkxMDA4fSwKKwl7IktJT1gwMDBBIiwgS1hDSjkxMDA4fSwKIAl7IktYVEoxMDA5IiwgS1hUSjIxMDA5fSwKIAl7IlNNTzg1MDAiLCAgS1hDSjkxMDA4fSwKIAl7IH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hY2NlbC9reHNkOS1pMmMuYyBiL2RyaXZlcnMvaWlvL2FjY2VsL2t4c2Q5LWkyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZTIwODUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9hY2NlbC9reHNkOS1pMmMuYwpAQCAtMCwwICsxLDY0IEBACisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKyNpbmNsdWRlICJreHNkOS5oIgorCitzdGF0aWMgaW50IGt4c2Q5X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkJICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBjb25maWcgPSB7CisJCS5yZWdfYml0cyA9IDgsCisJCS52YWxfYml0cyA9IDgsCisJCS5tYXhfcmVnaXN0ZXIgPSAweDBlLAorCX07CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCisJcmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoaTJjLCAmY29uZmlnKTsKKwlpZiAoSVNfRVJSKHJlZ21hcCkpIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgaTJjIHJlZ21hcCAlZFxuIiwKKwkJCShpbnQpUFRSX0VSUihyZWdtYXApKTsKKwkJcmV0dXJuIFBUUl9FUlIocmVnbWFwKTsKKwl9CisKKwlyZXR1cm4ga3hzZDlfY29tbW9uX3Byb2JlKCZpMmMtPmRldiwKKwkJCQkgIHJlZ21hcCwKKwkJCQkgIGkyYy0+bmFtZSk7Cit9CisKK3N0YXRpYyBpbnQga3hzZDlfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXJldHVybiBreHNkOV9jb21tb25fcmVtb3ZlKCZjbGllbnQtPmRldik7Cit9CisKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGt4c2Q5X29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJraW9uaXgsa3hzZDkiLCB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBreHNkOV9vZl9tYXRjaCk7CisjZWxzZQorI2RlZmluZSBreHNkOV9vZl9tYXRjaCBOVUxMCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGt4c2Q5X2kyY19pZFtdID0geworCXsia3hzZDkiLCAwfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGt4c2Q5X2kyY19pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBreHNkOV9pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gImt4c2Q5IiwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKGt4c2Q5X29mX21hdGNoKSwKKwkJLnBtID0gJmt4c2Q5X2Rldl9wbV9vcHMsCisJfSwKKwkucHJvYmUJCT0ga3hzZDlfaTJjX3Byb2JlLAorCS5yZW1vdmUJCT0ga3hzZDlfaTJjX3JlbW92ZSwKKwkuaWRfdGFibGUJPSBreHNkOV9pMmNfaWQsCit9OworbW9kdWxlX2kyY19kcml2ZXIoa3hzZDlfaTJjX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hY2NlbC9reHNkOS1zcGkuYyBiL2RyaXZlcnMvaWlvL2FjY2VsL2t4c2Q5LXNwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZDAwNzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9hY2NlbC9reHNkOS1zcGkuYwpAQCAtMCwwICsxLDU2IEBACisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworI2luY2x1ZGUgImt4c2Q5LmgiCisKK3N0YXRpYyBpbnQga3hzZDlfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGNvbmZpZyA9IHsKKwkJLnJlZ19iaXRzID0gOCwKKwkJLnZhbF9iaXRzID0gOCwKKwkJLm1heF9yZWdpc3RlciA9IDB4MGUsCisJfTsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisKKwlzcGktPm1vZGUgPSBTUElfTU9ERV8wOworCXJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfc3BpKHNwaSwgJmNvbmZpZyk7CisJaWYgKElTX0VSUihyZWdtYXApKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiJXM6IHJlZ21hcCBhbGxvY2F0aW9uIGZhaWxlZDogJWxkXG4iLAorCQkJX19mdW5jX18sIFBUUl9FUlIocmVnbWFwKSk7CisJCXJldHVybiBQVFJfRVJSKHJlZ21hcCk7CisJfQorCisJcmV0dXJuIGt4c2Q5X2NvbW1vbl9wcm9iZSgmc3BpLT5kZXYsCisJCQkJICByZWdtYXAsCisJCQkJICBzcGlfZ2V0X2RldmljZV9pZChzcGkpLT5uYW1lKTsKK30KKworc3RhdGljIGludCBreHNkOV9zcGlfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJcmV0dXJuIGt4c2Q5X2NvbW1vbl9yZW1vdmUoJnNwaS0+ZGV2KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGt4c2Q5X3NwaV9pZFtdID0geworCXsia3hzZDkiLCAwfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShzcGksIGt4c2Q5X3NwaV9pZCk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBreHNkOV9zcGlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImt4c2Q5IiwKKwkJLnBtID0gJmt4c2Q5X2Rldl9wbV9vcHMsCisJfSwKKwkucHJvYmUgPSBreHNkOV9zcGlfcHJvYmUsCisJLnJlbW92ZSA9IGt4c2Q5X3NwaV9yZW1vdmUsCisJLmlkX3RhYmxlID0ga3hzZDlfc3BpX2lkLAorfTsKK21vZHVsZV9zcGlfZHJpdmVyKGt4c2Q5X3NwaV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJKb25hdGhhbiBDYW1lcm9uIDxqaWMyM0BrZXJuZWwub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJLaW9uaXggS1hTRDkgU1BJIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWNjZWwva3hzZDkuYyBiL2RyaXZlcnMvaWlvL2FjY2VsL2t4c2Q5LmMKaW5kZXggM2E5ZjEwNi4uOWFmNjBhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWNjZWwva3hzZDkuYworKysgYi9kcml2ZXJzL2lpby9hY2NlbC9reHNkOS5jCkBAIC0xMiwxOSArMTIsMjUgQEAKICAqIEkgaGF2ZSBhIHN1aXRhYmxlIHdpcmUgbWFkZSB1cC4KICAqCiAgKiBUT0RPOglTdXBwb3J0IHRoZSBtb3Rpb24gZGV0ZWN0b3IKLSAqCQlVc2VzIHJlZ2lzdGVyIGFkZHJlc3MgaW5jcmVtZW50aW5nIHNvIGNvdWxkIGhhdmUgYQotICoJCWhlYXZpbHkgb3B0aW1pemVkIHJpbmcgYnVmZmVyIGFjY2VzcyBmdW5jdGlvbi4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgogI2luY2x1ZGUgPGxpbnV4L2lpby9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9idWZmZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcmVkX2J1ZmZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyX2NvbnN1bWVyLmg+CisKKyNpbmNsdWRlICJreHNkOS5oIgogCiAjZGVmaW5lIEtYU0Q5X1JFR19YCQkweDAwCiAjZGVmaW5lIEtYU0Q5X1JFR19ZCQkweDAyCkBAIC0zMywyOCArMzksNDUgQEAKICNkZWZpbmUgS1hTRDlfUkVHX1JFU0VUCQkweDBhCiAjZGVmaW5lIEtYU0Q5X1JFR19DVFJMX0MJMHgwYwogCi0jZGVmaW5lIEtYU0Q5X0ZTX01BU0sJCTB4MDMKKyNkZWZpbmUgS1hTRDlfQ1RSTF9DX0ZTX01BU0sJMHgwMworI2RlZmluZSBLWFNEOV9DVFJMX0NfRlNfOEcJMHgwMAorI2RlZmluZSBLWFNEOV9DVFJMX0NfRlNfNkcJMHgwMQorI2RlZmluZSBLWFNEOV9DVFJMX0NfRlNfNEcJMHgwMgorI2RlZmluZSBLWFNEOV9DVFJMX0NfRlNfMkcJMHgwMworI2RlZmluZSBLWFNEOV9DVFJMX0NfTU9UX0xBVAlCSVQoMykKKyNkZWZpbmUgS1hTRDlfQ1RSTF9DX01PVF9MRVYJQklUKDQpCisjZGVmaW5lIEtYU0Q5X0NUUkxfQ19MUF9NQVNLCTB4ZTAKKyNkZWZpbmUgS1hTRDlfQ1RSTF9DX0xQX05PTkUJMHgwMAorI2RlZmluZSBLWFNEOV9DVFJMX0NfTFBfMjAwMEhaQwlCSVQoNSkKKyNkZWZpbmUgS1hTRDlfQ1RSTF9DX0xQXzIwMDBIWkIJQklUKDYpCisjZGVmaW5lIEtYU0Q5X0NUUkxfQ19MUF8yMDAwSFpBCShCSVQoNSl8QklUKDYpKQorI2RlZmluZSBLWFNEOV9DVFJMX0NfTFBfMTAwMEhaCUJJVCg3KQorI2RlZmluZSBLWFNEOV9DVFJMX0NfTFBfNTAwSFoJKEJJVCg3KXxCSVQoNSkpCisjZGVmaW5lIEtYU0Q5X0NUUkxfQ19MUF8xMDBIWgkoQklUKDcpfEJJVCg2KSkKKyNkZWZpbmUgS1hTRDlfQ1RSTF9DX0xQXzUwSFoJKEJJVCg3KXxCSVQoNil8QklUKDUpKQogCiAjZGVmaW5lIEtYU0Q5X1JFR19DVFJMX0IJMHgwZAorCisjZGVmaW5lIEtYU0Q5X0NUUkxfQl9DTEtfSExECUJJVCg3KQorI2RlZmluZSBLWFNEOV9DVFJMX0JfRU5BQkxFCUJJVCg2KQorI2RlZmluZSBLWFNEOV9DVFJMX0JfU1QJCUJJVCg1KSAvKiBTZWxmLXRlc3QgKi8KKwogI2RlZmluZSBLWFNEOV9SRUdfQ1RSTF9BCTB4MGUKIAotI2RlZmluZSBLWFNEOV9SRUFEKGEpICgweDgwIHwgKGEpKQotI2RlZmluZSBLWFNEOV9XUklURShhKSAoYSkKLQotI2RlZmluZSBLWFNEOV9TVEFURV9SWF9TSVpFIDIKLSNkZWZpbmUgS1hTRDlfU1RBVEVfVFhfU0laRSAyCiAvKioKICAqIHN0cnVjdCBreHNkOV9zdGF0ZSAtIGRldmljZSByZWxhdGVkIHN0b3JhZ2UKLSAqIEBidWZfbG9jazoJcHJvdGVjdCB0aGUgcnggYW5kIHR4IGJ1ZmZlcnMuCi0gKiBAdXM6CQlzcGkgZGV2aWNlCi0gKiBAcng6CQlzaW5nbGUgcnggYnVmZmVyIHN0b3JhZ2UKLSAqIEB0eDoJCXNpbmdsZSB0eCBidWZmZXIgc3RvcmFnZQotICoqLworICogQGRldjogcG9pbnRlciB0byB0aGUgcGFyZW50IGRldmljZQorICogQG1hcDogcmVnbWFwIHRvIHRoZSBkZXZpY2UKKyAqIEBvcmllbnRhdGlvbjogbW91bnRpbmcgbWF0cml4LCBmbGlwcGVkIGF4aXMgZXRjCisgKiBAcmVnczogcmVndWxhdG9ycyBmb3IgdGhpcyBkZXZpY2UsIFZERCBhbmQgSU9WREQKKyAqIEBzY2FsZTogdGhlIGN1cnJlbnQgc2NhbGluZyBzZXR0aW5nCisgKi8KIHN0cnVjdCBreHNkOV9zdGF0ZSB7Ci0Jc3RydWN0IG11dGV4IGJ1Zl9sb2NrOwotCXN0cnVjdCBzcGlfZGV2aWNlICp1czsKLQl1OCByeFtLWFNEOV9TVEFURV9SWF9TSVpFXSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7Ci0JdTggdHhbS1hTRDlfU1RBVEVfVFhfU0laRV07CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCByZWdtYXAgKm1hcDsKKwlzdHJ1Y3QgaWlvX21vdW50X21hdHJpeCBvcmllbnRhdGlvbjsKKwlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSByZWdzWzJdOworCXU4IHNjYWxlOwogfTsKIAogI2RlZmluZSBLWFNEOV9TQ0FMRV8yRyAiMC4wMTE5NzgiCkBAIC02NSw2ICs4OCwxNCBAQAogLyogcmV2ZXJzZSBvcmRlciAqLwogc3RhdGljIGNvbnN0IGludCBreHNkOV9taWNyb19zY2FsZXNbNF0gPSB7IDQ3ODUzLCAzNTkzNCwgMjM5MjcsIDExOTc4IH07CiAKKyNkZWZpbmUgS1hTRDlfWkVST19HX09GRlNFVCAtMjA0OAorCisvKgorICogUmVndWxhdG9yIG5hbWVzCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGt4c2Q5X3JlZ192ZGRbXSA9ICJ2ZGQiOworc3RhdGljIGNvbnN0IGNoYXIga3hzZDlfcmVnX2lvdmRkW10gPSAiaW92ZGQiOworCiBzdGF0aWMgaW50IGt4c2Q5X3dyaXRlX3NjYWxlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIGludCBtaWNybykKIHsKIAlpbnQgcmV0LCBpOwpAQCAtNzksNDIgKzExMCwxNyBAQAogCWlmICghZm91bmRpdCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOwotCXJldCA9IHNwaV93OHI4KHN0LT51cywgS1hTRDlfUkVBRChLWFNEOV9SRUdfQ1RSTF9DKSk7CisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHN0LT5tYXAsCisJCQkJIEtYU0Q5X1JFR19DVFJMX0MsCisJCQkJIEtYU0Q5X0NUUkxfQ19GU19NQVNLLAorCQkJCSBpKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJvcl9yZXQ7Ci0Jc3QtPnR4WzBdID0gS1hTRDlfV1JJVEUoS1hTRDlfUkVHX0NUUkxfQyk7Ci0Jc3QtPnR4WzFdID0gKHJldCAmIH5LWFNEOV9GU19NQVNLKSB8IGk7CiAKLQlyZXQgPSBzcGlfd3JpdGUoc3QtPnVzLCBzdC0+dHgsIDIpOworCS8qIENhY2hlZCBzY2FsZSB3aGVuIHRoZSBzZW5zb3IgaXMgcG93ZXJlZCBkb3duICovCisJc3QtPnNjYWxlID0gaTsKKwogZXJyb3JfcmV0OgotCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGt4c2Q5X3JlYWQoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgdTggYWRkcmVzcykKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBreHNkOV9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKLQkJewotCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAotCQkJLmxlbiA9IDEsCi0JCQkuZGVsYXlfdXNlY3MgPSAyMDAsCi0JCQkudHhfYnVmID0gc3QtPnR4LAotCQl9LCB7Ci0JCQkuYml0c19wZXJfd29yZCA9IDgsCi0JCQkubGVuID0gMiwKLQkJCS5yeF9idWYgPSBzdC0+cngsCi0JCX0sCi0JfTsKLQotCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7Ci0Jc3QtPnR4WzBdID0gS1hTRDlfUkVBRChhZGRyZXNzKTsKLQlyZXQgPSBzcGlfc3luY190cmFuc2ZlcihzdC0+dXMsIHhmZXJzLCBBUlJBWV9TSVpFKHhmZXJzKSk7Ci0JaWYgKCFyZXQpCi0JCXJldCA9ICgoKHUxNikoc3QtPnJ4WzBdKSkgPDwgOCkgfCAoc3QtPnJ4WzFdICYgMHhGMCk7Ci0JbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEzNiw2ICsxNDIsOSBAQAogCQkJICAgbG9uZyBtYXNrKQogewogCWludCByZXQgPSAtRUlOVkFMOworCXN0cnVjdCBreHNkOV9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJcG1fcnVudGltZV9nZXRfc3luYyhzdC0+ZGV2KTsKIAogCWlmIChtYXNrID09IElJT19DSEFOX0lORk9fU0NBTEUpIHsKIAkJLyogQ2hlY2sgbm8gaW50ZWdlciBjb21wb25lbnQgKi8KQEAgLTE0NCw2ICsxNTMsOSBAQAogCQlyZXQgPSBreHNkOV93cml0ZV9zY2FsZShpbmRpb19kZXYsIHZhbDIpOwogCX0KIAorCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koc3QtPmRldik7CisJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoc3QtPmRldik7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNTMsNDQgKzE2NSwxNTQgQEAKIHsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAlzdHJ1Y3Qga3hzZDlfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1bnNpZ25lZCBpbnQgcmVndmFsOworCV9fYmUxNiByYXdfdmFsOworCXUxNiBudmFsOworCisJcG1fcnVudGltZV9nZXRfc3luYyhzdC0+ZGV2KTsKIAogCXN3aXRjaCAobWFzaykgewogCWNhc2UgSUlPX0NIQU5fSU5GT19SQVc6Ci0JCXJldCA9IGt4c2Q5X3JlYWQoaW5kaW9fZGV2LCBjaGFuLT5hZGRyZXNzKTsKLQkJaWYgKHJldCA8IDApCisJCXJldCA9IHJlZ21hcF9idWxrX3JlYWQoc3QtPm1hcCwgY2hhbi0+YWRkcmVzcywgJnJhd192YWwsCisJCQkJICAgICAgIHNpemVvZihyYXdfdmFsKSk7CisJCWlmIChyZXQpCiAJCQlnb3RvIGVycm9yX3JldDsKLQkJKnZhbCA9IHJldDsKKwkJbnZhbCA9IGJlMTZfdG9fY3B1KHJhd192YWwpOworCQkvKiBPbmx5IDEyIGJpdHMgYXJlIHZhbGlkICovCisJCW52YWwgPj49IDQ7CisJCSp2YWwgPSBudmFsOworCQlyZXQgPSBJSU9fVkFMX0lOVDsKKwkJYnJlYWs7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX09GRlNFVDoKKwkJLyogVGhpcyBoYXMgYSBiaWFzIG9mIC0yMDQ4ICovCisJCSp2YWwgPSBLWFNEOV9aRVJPX0dfT0ZGU0VUOworCQlyZXQgPSBJSU9fVkFMX0lOVDsKIAkJYnJlYWs7CiAJY2FzZSBJSU9fQ0hBTl9JTkZPX1NDQUxFOgotCQlyZXQgPSBzcGlfdzhyOChzdC0+dXMsIEtYU0Q5X1JFQUQoS1hTRDlfUkVHX0NUUkxfQykpOworCQlyZXQgPSByZWdtYXBfcmVhZChzdC0+bWFwLAorCQkJCSAgS1hTRDlfUkVHX0NUUkxfQywKKwkJCQkgICZyZWd2YWwpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gZXJyb3JfcmV0OwotCQkqdmFsMiA9IGt4c2Q5X21pY3JvX3NjYWxlc1tyZXQgJiBLWFNEOV9GU19NQVNLXTsKKwkJKnZhbCA9IDA7CisJCSp2YWwyID0ga3hzZDlfbWljcm9fc2NhbGVzW3JlZ3ZhbCAmIEtYU0Q5X0NUUkxfQ19GU19NQVNLXTsKIAkJcmV0ID0gSUlPX1ZBTF9JTlRfUExVU19NSUNSTzsKIAkJYnJlYWs7CiAJfQogCiBlcnJvcl9yZXQ6CisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShzdC0+ZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChzdC0+ZGV2KTsKKwogCXJldHVybiByZXQ7CiB9OwotI2RlZmluZSBLWFNEOV9BQ0NFTF9DSEFOKGF4aXMpCQkJCQkJXAorCitzdGF0aWMgaXJxcmV0dXJuX3Qga3hzZDlfdHJpZ2dlcl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnApCit7CisJY29uc3Qgc3RydWN0IGlpb19wb2xsX2Z1bmMgKnBmID0gcDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGYtPmluZGlvX2RldjsKKwlzdHJ1Y3Qga3hzZDlfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCS8qIDQgKiAxNmJpdCB2YWx1ZXMgQU5EIHRpbWVzdGFtcCAqLworCV9fYmUxNiBod192YWx1ZXNbOF07CisKKwlyZXQgPSByZWdtYXBfYnVsa19yZWFkKHN0LT5tYXAsCisJCQkgICAgICAgS1hTRDlfUkVHX1gsCisJCQkgICAgICAgJmh3X3ZhbHVlcywKKwkJCSAgICAgICA4KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoc3QtPmRldiwKKwkJCSJlcnJvciByZWFkaW5nIGRhdGFcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlpb19wdXNoX3RvX2J1ZmZlcnNfd2l0aF90aW1lc3RhbXAoaW5kaW9fZGV2LAorCQkJCQkgICBod192YWx1ZXMsCisJCQkJCSAgIGlpb19nZXRfdGltZV9ucyhpbmRpb19kZXYpKTsKKwlpaW9fdHJpZ2dlcl9ub3RpZnlfZG9uZShpbmRpb19kZXYtPnRyaWcpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGt4c2Q5X2J1ZmZlcl9wcmVlbmFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlzdHJ1Y3Qga3hzZDlfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoc3QtPmRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBreHNkOV9idWZmZXJfcG9zdGRpc2FibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlzdHJ1Y3Qga3hzZDlfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koc3QtPmRldik7CisJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoc3QtPmRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fYnVmZmVyX3NldHVwX29wcyBreHNkOV9idWZmZXJfc2V0dXBfb3BzID0geworCS5wcmVlbmFibGUgPSBreHNkOV9idWZmZXJfcHJlZW5hYmxlLAorCS5wb3N0ZW5hYmxlID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfcG9zdGVuYWJsZSwKKwkucHJlZGlzYWJsZSA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3ByZWRpc2FibGUsCisJLnBvc3RkaXNhYmxlID0ga3hzZDlfYnVmZmVyX3Bvc3RkaXNhYmxlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fbW91bnRfbWF0cml4ICoKK2t4c2Q5X2dldF9tb3VudF9tYXRyaXgoY29uc3Qgc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFuKQoreworCXN0cnVjdCBreHNkOV9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJcmV0dXJuICZzdC0+b3JpZW50YXRpb247Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlY19leHRfaW5mbyBreHNkOV9leHRfaW5mb1tdID0geworCUlJT19NT1VOVF9NQVRSSVgoSUlPX1NIQVJFRF9CWV9UWVBFLCBreHNkOV9nZXRfbW91bnRfbWF0cml4KSwKKwl7IH0sCit9OworCisjZGVmaW5lIEtYU0Q5X0FDQ0VMX0NIQU4oYXhpcywgaW5kZXgpCQkJCQkJXAogCXsJCQkJCQkJCVwKIAkJLnR5cGUgPSBJSU9fQUNDRUwsCQkJCQlcCiAJCS5tb2RpZmllZCA9IDEsCQkJCQkJXAogCQkuY2hhbm5lbDIgPSBJSU9fTU9EXyMjYXhpcywJCQkJXAogCQkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwJCVwKLQkJLmluZm9fbWFza19zaGFyZWRfYnlfdHlwZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSwJXAorCQkuaW5mb19tYXNrX3NoYXJlZF9ieV90eXBlID0gQklUKElJT19DSEFOX0lORk9fU0NBTEUpIHwJXAorCQkJCQlCSVQoSUlPX0NIQU5fSU5GT19PRkZTRVQpLAlcCisJCS5leHRfaW5mbyA9IGt4c2Q5X2V4dF9pbmZvLAkJCQlcCiAJCS5hZGRyZXNzID0gS1hTRDlfUkVHXyMjYXhpcywJCQkJXAorCQkuc2Nhbl9pbmRleCA9IGluZGV4LAkJCQkJXAorCQkuc2Nhbl90eXBlID0geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCS5zaWduID0gJ3UnLAkJCQkJXAorCQkJLnJlYWxiaXRzID0gMTIsCQkJCQlcCisJCQkuc3RvcmFnZWJpdHMgPSAxNiwJCQkJXAorCQkJLnNoaWZ0ID0gNCwJCQkJCVwKKwkJCS5lbmRpYW5uZXNzID0gSUlPX0JFLAkJCQlcCisJCX0sCQkJCQkJCVwKIAl9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBreHNkOV9jaGFubmVsc1tdID0gewotCUtYU0Q5X0FDQ0VMX0NIQU4oWCksIEtYU0Q5X0FDQ0VMX0NIQU4oWSksIEtYU0Q5X0FDQ0VMX0NIQU4oWiksCisJS1hTRDlfQUNDRUxfQ0hBTihYLCAwKSwKKwlLWFNEOV9BQ0NFTF9DSEFOKFksIDEpLAorCUtYU0Q5X0FDQ0VMX0NIQU4oWiwgMiksCiAJewogCQkudHlwZSA9IElJT19WT0xUQUdFLAogCQkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwKIAkJLmluZGV4ZWQgPSAxLAogCQkuYWRkcmVzcyA9IEtYU0Q5X1JFR19BVVgsCi0JfQorCQkuc2Nhbl9pbmRleCA9IDMsCisJCS5zY2FuX3R5cGUgPSB7CisJCQkuc2lnbiA9ICd1JywKKwkJCS5yZWFsYml0cyA9IDEyLAorCQkJLnN0b3JhZ2ViaXRzID0gMTYsCisJCQkuc2hpZnQgPSA0LAorCQkJLmVuZGlhbm5lc3MgPSBJSU9fQkUsCisJCX0sCisJfSwKKwlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCg0KSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGt4c2Q5X2F0dHJpYnV0ZV9ncm91cCA9IHsKQEAgLTIwMSwxNyArMzIzLDY5IEBACiB7CiAJaW50IHJldDsKIAotCXN0LT50eFswXSA9IDB4MGQ7Ci0Jc3QtPnR4WzFdID0gMHg0MDsKLQlyZXQgPSBzcGlfd3JpdGUoc3QtPnVzLCBzdC0+dHgsIDIpOworCS8qIEVuYWJsZSB0aGUgcmVndWxhdG9ycyAqLworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKHN0LT5yZWdzKSwgc3QtPnJlZ3MpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihzdC0+ZGV2LCAiQ2Fubm90IGVuYWJsZSByZWd1bGF0b3JzXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBQb3dlciB1cCAqLworCXJldCA9IHJlZ21hcF93cml0ZShzdC0+bWFwLAorCQkJICAgS1hTRDlfUkVHX0NUUkxfQiwKKwkJCSAgIEtYU0Q5X0NUUkxfQl9FTkFCTEUpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlzdC0+dHhbMF0gPSAweDBjOwotCXN0LT50eFsxXSA9IDB4OWI7Ci0JcmV0dXJuIHNwaV93cml0ZShzdC0+dXMsIHN0LT50eCwgMik7CisJLyoKKwkgKiBTZXQgMTAwMEh6IExQRiwgMmcgZnVsbHNjYWxlLCBtb3Rpb24gd2FrZXVwIHRocmVzaG9sZCAxZywKKwkgKiBsYXRjaGVkIHdha2V1cAorCSAqLworCXJldCA9IHJlZ21hcF93cml0ZShzdC0+bWFwLAorCQkJICAgS1hTRDlfUkVHX0NUUkxfQywKKwkJCSAgIEtYU0Q5X0NUUkxfQ19MUF8xMDAwSFogfAorCQkJICAgS1hTRDlfQ1RSTF9DX01PVF9MRVYJfAorCQkJICAgS1hTRDlfQ1RSTF9DX01PVF9MQVQgfAorCQkJICAgc3QtPnNjYWxlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBQb3dlci11cCB0aW1lIGRlcGVuZHMgb24gdGhlIExQRiBzZXR0aW5nLCBidXQgdHlwIDE1LjkgbXMsIGxldCdzCisJICogc2V0IDIwIG1zIHRvIGFsbG93IGZvciBzb21lIHNsYWNrLgorCSAqLworCW1zbGVlcCgyMCk7CisKKwlyZXR1cm4gMDsKIH07CiAKK3N0YXRpYyBpbnQga3hzZDlfcG93ZXJfZG93bihzdHJ1Y3Qga3hzZDlfc3RhdGUgKnN0KQoreworCWludCByZXQ7CisKKwkvKgorCSAqIFNldCBpbnRvIGxvdyBwb3dlciBtb2RlIC0gc2luY2UgdGhlcmUgbWF5IGJlIG1vcmUgdXNlcnMgb2YgdGhlCisJICogcmVndWxhdG9ycyB0aGlzIGlzIHRoZSBmaXJzdCBzdGVwIG9mIHRoZSBwb3dlciBzYXZpbmc6IGl0IHdpbGwKKwkgKiBtYWtlIHN1cmUgd2UgY29uc2VydmUgcG93ZXIgZXZlbiBpZiB0aGVyZSBhcmUgb3RoZXJzIHVzZXJzIG9uIHRoZQorCSAqIHJlZ3VsYXRvcnMuCisJICovCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHN0LT5tYXAsCisJCQkJIEtYU0Q5X1JFR19DVFJMX0IsCisJCQkJIEtYU0Q5X0NUUkxfQl9FTkFCTEUsCisJCQkJIDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBEaXNhYmxlIHRoZSByZWd1bGF0b3JzICovCisJcmV0ID0gcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKHN0LT5yZWdzKSwgc3QtPnJlZ3MpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihzdC0+ZGV2LCAiQ2Fubm90IGRpc2FibGUgcmVndWxhdG9yc1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8ga3hzZDlfaW5mbyA9IHsKIAkucmVhZF9yYXcgPSAma3hzZDlfcmVhZF9yYXcsCiAJLndyaXRlX3JhdyA9ICZreHNkOV93cml0ZV9yYXcsCkBAIC0yMTksNTcgKzM5MywxMzYgQEAKIAkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAogfTsKIAotc3RhdGljIGludCBreHNkOV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQorLyogRm91ciBjaGFubmVscyBhcGFydCBmcm9tIHRpbWVzdGFtcCwgc2NhbiBtYXNrID0gMHgwZiAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcga3hzZDlfc2Nhbl9tYXNrc1tdID0geyAweGYsIDAgfTsKKworaW50IGt4c2Q5X2NvbW1vbl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgcmVnbWFwICptYXAsCisJCSAgICAgICBjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CiAJc3RydWN0IGt4c2Q5X3N0YXRlICpzdDsKKwlpbnQgcmV0OwogCi0JaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZzcGktPmRldiwgc2l6ZW9mKCpzdCkpOworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYyhkZXYsIHNpemVvZigqc3QpKTsKIAlpZiAoIWluZGlvX2RldikKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlzdCA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0Jc3BpX3NldF9kcnZkYXRhKHNwaSwgaW5kaW9fZGV2KTsKKwlzdC0+ZGV2ID0gZGV2OworCXN0LT5tYXAgPSBtYXA7CiAKLQlzdC0+dXMgPSBzcGk7Ci0JbXV0ZXhfaW5pdCgmc3QtPmJ1Zl9sb2NrKTsKIAlpbmRpb19kZXYtPmNoYW5uZWxzID0ga3hzZDlfY2hhbm5lbHM7CiAJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKGt4c2Q5X2NoYW5uZWxzKTsKLQlpbmRpb19kZXYtPm5hbWUgPSBzcGlfZ2V0X2RldmljZV9pZChzcGkpLT5uYW1lOwotCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlpbmRpb19kZXYtPm5hbWUgPSBuYW1lOworCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9IGRldjsKIAlpbmRpb19kZXYtPmluZm8gPSAma3hzZDlfaW5mbzsKIAlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisJaW5kaW9fZGV2LT5hdmFpbGFibGVfc2Nhbl9tYXNrcyA9IGt4c2Q5X3NjYW5fbWFza3M7CiAKLQlzcGktPm1vZGUgPSBTUElfTU9ERV8wOwotCXNwaV9zZXR1cChzcGkpOworCS8qIFJlYWQgdGhlIG1vdW50aW5nIG1hdHJpeCwgaWYgcHJlc2VudCAqLworCXJldCA9IG9mX2lpb19yZWFkX21vdW50X21hdHJpeChkZXYsCisJCQkJICAgICAgICJtb3VudC1tYXRyaXgiLAorCQkJCSAgICAgICAmc3QtPm9yaWVudGF0aW9uKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogRmV0Y2ggYW5kIHR1cm4gb24gcmVndWxhdG9ycyAqLworCXN0LT5yZWdzWzBdLnN1cHBseSA9IGt4c2Q5X3JlZ192ZGQ7CisJc3QtPnJlZ3NbMV0uc3VwcGx5ID0ga3hzZDlfcmVnX2lvdmRkOworCXJldCA9IGRldm1fcmVndWxhdG9yX2J1bGtfZ2V0KGRldiwKKwkJCQkgICAgICBBUlJBWV9TSVpFKHN0LT5yZWdzKSwKKwkJCQkgICAgICBzdC0+cmVncyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIkNhbm5vdCBnZXQgcmVndWxhdG9yc1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCS8qIERlZmF1bHQgc2NhbGluZyAqLworCXN0LT5zY2FsZSA9IEtYU0Q5X0NUUkxfQ19GU18yRzsKKwogCWt4c2Q5X3Bvd2VyX3VwKHN0KTsKIAotCXJldHVybiBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7Ci19CisJcmV0ID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfc2V0dXAoaW5kaW9fZGV2LAorCQkJCQkgaWlvX3BvbGxmdW5jX3N0b3JlX3RpbWUsCisJCQkJCSBreHNkOV90cmlnZ2VyX2hhbmRsZXIsCisJCQkJCSAma3hzZDlfYnVmZmVyX3NldHVwX29wcyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgInRyaWdnZXJlZCBidWZmZXIgc2V0dXAgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfcG93ZXJfZG93bjsKKwl9CiAKLXN0YXRpYyBpbnQga3hzZDlfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2NsZWFudXBfYnVmZmVyOworCisJZGV2X3NldF9kcnZkYXRhKGRldiwgaW5kaW9fZGV2KTsKKworCS8qIEVuYWJsZSBydW50aW1lIFBNICovCisJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoZGV2KTsKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoZGV2KTsKKwlwbV9ydW50aW1lX2VuYWJsZShkZXYpOworCS8qCisJICogU2V0IGF1dG9zdXNwZW5kIHRvIHR3byBvcmRlcnMgb2YgbWFnbml0dWRlIGxhcmdlciB0aGFuIHRoZQorCSAqIHN0YXJ0LXVwIHRpbWUuIDIwbXMgc3RhcnQtdXAgdGltZSBtZWFucyAyMDAwbXMgYXV0b3N1c3BlbmQsCisJICogaS5lLiAyIHNlY29uZHMuCisJICovCisJcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXkoZGV2LCAyMDAwKTsKKwlwbV9ydW50aW1lX3VzZV9hdXRvc3VzcGVuZChkZXYpOworCXBtX3J1bnRpbWVfcHV0KGRldik7CisKKwlyZXR1cm4gMDsKKworZXJyX2NsZWFudXBfYnVmZmVyOgorCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoaW5kaW9fZGV2KTsKK2Vycl9wb3dlcl9kb3duOgorCWt4c2Q5X3Bvd2VyX2Rvd24oc3QpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woa3hzZDlfY29tbW9uX3Byb2JlKTsKKworaW50IGt4c2Q5X2NvbW1vbl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQogewotCWlpb19kZXZpY2VfdW5yZWdpc3RlcihzcGlfZ2V0X2RydmRhdGEoc3BpKSk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBreHNkOV9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChpbmRpb19kZXYpOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9ub2lkbGUoZGV2KTsKKwlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKKwlreHNkOV9wb3dlcl9kb3duKHN0KTsKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChreHNkOV9jb21tb25fcmVtb3ZlKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGt4c2Q5X2lkW10gPSB7Ci0JeyJreHNkOSIsIDB9LAotCXsgfSwKLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHNwaSwga3hzZDlfaWQpOworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBreHNkOV9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qga3hzZDlfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAotc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGt4c2Q5X2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJreHNkOSIsCi0JfSwKLQkucHJvYmUgPSBreHNkOV9wcm9iZSwKLQkucmVtb3ZlID0ga3hzZDlfcmVtb3ZlLAotCS5pZF90YWJsZSA9IGt4c2Q5X2lkLAorCXJldHVybiBreHNkOV9wb3dlcl9kb3duKHN0KTsKK30KKworc3RhdGljIGludCBreHNkOV9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBreHNkOV9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJcmV0dXJuIGt4c2Q5X3Bvd2VyX3VwKHN0KTsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworY29uc3Qgc3RydWN0IGRldl9wbV9vcHMga3hzZDlfZGV2X3BtX29wcyA9IHsKKwlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhwbV9ydW50aW1lX2ZvcmNlX3N1c3BlbmQsCisJCQkJcG1fcnVudGltZV9mb3JjZV9yZXN1bWUpCisJU0VUX1JVTlRJTUVfUE1fT1BTKGt4c2Q5X3J1bnRpbWVfc3VzcGVuZCwKKwkJCSAgIGt4c2Q5X3J1bnRpbWVfcmVzdW1lLCBOVUxMKQogfTsKLW1vZHVsZV9zcGlfZHJpdmVyKGt4c2Q5X2RyaXZlcik7CitFWFBPUlRfU1lNQk9MKGt4c2Q5X2Rldl9wbV9vcHMpOwogCiBNT0RVTEVfQVVUSE9SKCJKb25hdGhhbiBDYW1lcm9uIDxqaWMyM0BrZXJuZWwub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJLaW9uaXggS1hTRDkgU1BJIGRyaXZlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJLaW9uaXggS1hTRDkgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hY2NlbC9reHNkOS5oIGIvZHJpdmVycy9paW8vYWNjZWwva3hzZDkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZThhMjgxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vYWNjZWwva3hzZDkuaApAQCAtMCwwICsxLDEyIEBACisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNkZWZpbmUgS1hTRDlfU1RBVEVfUlhfU0laRSAyCisjZGVmaW5lIEtYU0Q5X1NUQVRFX1RYX1NJWkUgMgorCitpbnQga3hzZDlfY29tbW9uX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCByZWdtYXAgKm1hcCwKKwkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOworaW50IGt4c2Q5X2NvbW1vbl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGt4c2Q5X2Rldl9wbV9vcHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hY2NlbC9tYzMyMzAuYyBiL2RyaXZlcnMvaWlvL2FjY2VsL21jMzIzMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYTJmZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9hY2NlbC9tYzMyMzAuYwpAQCAtMCwwICsxLDIxMSBAQAorLyoqCisgKiBtQ3ViZSBNQzMyMzAgMy1BeGlzIEFjY2VsZXJvbWV0ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIElJTyBkcml2ZXIgZm9yIG1DdWJlIE1DMzIzMDsgNy1iaXQgSTJDIGFkZHJlc3M6IDB4NGMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vc3lzZnMuaD4KKworI2RlZmluZSBNQzMyMzBfUkVHX1hPVVQJCQkweDAwCisjZGVmaW5lIE1DMzIzMF9SRUdfWU9VVAkJCTB4MDEKKyNkZWZpbmUgTUMzMjMwX1JFR19aT1VUCQkJMHgwMgorCisjZGVmaW5lIE1DMzIzMF9SRUdfTU9ERQkJCTB4MDcKKyNkZWZpbmUgTUMzMjMwX01PREVfT1BDT05fTUFTSwkJMHgwMworI2RlZmluZSBNQzMyMzBfTU9ERV9PUENPTl9XQUtFCQkweDAxCisjZGVmaW5lIE1DMzIzMF9NT0RFX09QQ09OX1NUQU5EQlkJMHgwMworCisjZGVmaW5lIE1DMzIzMF9SRUdfQ0hJUF9JRAkJMHgxOAorI2RlZmluZSBNQzMyMzBfQ0hJUF9JRAkJCTB4MDEKKworI2RlZmluZSBNQzMyMzBfUkVHX1BST0RVQ1RfQ09ERQkJMHgzYgorI2RlZmluZSBNQzMyMzBfUFJPRFVDVF9DT0RFCQkweDE5CisKKy8qCisgKiBUaGUgYWNjZWxlcm9tZXRlciBoYXMgb25lIG1lYXN1cmVtZW50IHJhbmdlOgorICoKKyAqIC0xLjVnIC0gKzEuNWcgKDgtYml0LCBzaWduZWQpCisgKgorICogc2NhbGUgPSAoMS41ICsgMS41KSAqIDkuODEgLyAoMl44IC0gMSkJPSAwLjExNTQxMTc2NQorICovCisKK3N0YXRpYyBjb25zdCBpbnQgbWMzMjMwX25zY2FsZSA9IDExNTQxMTc2NTsKKworI2RlZmluZSBNQzMyMzBfQ0hBTk5FTChyZWcsIGF4aXMpIHsJXAorCS50eXBlID0gSUlPX0FDQ0VMLAlcCisJLmFkZHJlc3MgPSByZWcsCVwKKwkubW9kaWZpZWQgPSAxLAlcCisJLmNoYW5uZWwyID0gSUlPX01PRF8jI2F4aXMsCVwKKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwJXAorCS5pbmZvX21hc2tfc2hhcmVkX2J5X3R5cGUgPSBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSksCVwKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIG1jMzIzMF9jaGFubmVsc1tdID0geworCU1DMzIzMF9DSEFOTkVMKE1DMzIzMF9SRUdfWE9VVCwgWCksCisJTUMzMjMwX0NIQU5ORUwoTUMzMjMwX1JFR19ZT1VULCBZKSwKKwlNQzMyMzBfQ0hBTk5FTChNQzMyMzBfUkVHX1pPVVQsIFopLAorfTsKKworc3RydWN0IG1jMzIzMF9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworfTsKKworc3RhdGljIGludCBtYzMyMzBfc2V0X29wY29uKHN0cnVjdCBtYzMyMzBfZGF0YSAqZGF0YSwgaW50IG9wY29uKQoreworCWludCByZXQ7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKKworCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE1DMzIzMF9SRUdfTU9ERSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gcmVhZCBtb2RlIHJlZzogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ICY9IH5NQzMyMzBfTU9ERV9PUENPTl9NQVNLOworCXJldCB8PSBvcGNvbjsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBNQzMyMzBfUkVHX01PREUsIHJldCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gd3JpdGUgbW9kZSByZWc6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1jMzIzMF9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJCXN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJCWludCAqdmFsLCBpbnQgKnZhbDIsIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgbWMzMjMwX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQ7CisKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIElJT19DSEFOX0lORk9fUkFXOgorCQlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBjaGFuLT5hZGRyZXNzKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQkqdmFsID0gc2lnbl9leHRlbmQzMihyZXQsIDcpOworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1NDQUxFOgorCQkqdmFsID0gMDsKKwkJKnZhbDIgPSBtYzMyMzBfbnNjYWxlOworCQlyZXR1cm4gSUlPX1ZBTF9JTlRfUExVU19OQU5POworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBtYzMyMzBfaW5mbyA9IHsKKwkuZHJpdmVyX21vZHVsZQk9IFRISVNfTU9EVUxFLAorCS5yZWFkX3Jhdwk9IG1jMzIzMF9yZWFkX3JhdywKK307CisKK3N0YXRpYyBpbnQgbWMzMjMwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXN0cnVjdCBtYzMyMzBfZGF0YSAqZGF0YTsKKworCS8qIEZpcnN0IGNoZWNrIGNoaXAtaWQgYW5kIHByb2R1Y3QtaWQgKi8KKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNQzMyMzBfUkVHX0NISVBfSUQpOworCWlmIChyZXQgIT0gTUMzMjMwX0NISVBfSUQpCisJCXJldHVybiAocmV0IDwgMCkgPyByZXQgOiAtRU5PREVWOworCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTUMzMjMwX1JFR19QUk9EVUNUX0NPREUpOworCWlmIChyZXQgIT0gTUMzMjMwX1BST0RVQ1RfQ09ERSkKKwkJcmV0dXJuIChyZXQgPCAwKSA/IHJldCA6IC1FTk9ERVY7CisKKwlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKmRhdGEpKTsKKwlpZiAoIWluZGlvX2RldikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImlpbyBhbGxvY2F0aW9uIGZhaWxlZCFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlkYXRhLT5jbGllbnQgPSBjbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgaW5kaW9fZGV2KTsKKworCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKKwlpbmRpb19kZXYtPmluZm8gPSAmbWMzMjMwX2luZm87CisJaW5kaW9fZGV2LT5uYW1lID0gIm1jMzIzMCI7CisJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBtYzMyMzBfY2hhbm5lbHM7CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKG1jMzIzMF9jaGFubmVscyk7CisKKwlyZXQgPSBtYzMyMzBfc2V0X29wY29uKGRhdGEsIE1DMzIzMF9NT0RFX09QQ09OX1dBS0UpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZGV2aWNlX3JlZ2lzdGVyIGZhaWxlZFxuIik7CisJCW1jMzIzMF9zZXRfb3Bjb24oZGF0YSwgTUMzMjMwX01PREVfT1BDT05fU1RBTkRCWSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtYzMyMzBfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisKKwlyZXR1cm4gbWMzMjMwX3NldF9vcGNvbihpaW9fcHJpdihpbmRpb19kZXYpLCBNQzMyMzBfTU9ERV9PUENPTl9TVEFOREJZKTsKK30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBtYzMyMzBfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1jMzIzMF9kYXRhICpkYXRhOworCisJZGF0YSA9IGlpb19wcml2KGkyY19nZXRfY2xpZW50ZGF0YSh0b19pMmNfY2xpZW50KGRldikpKTsKKworCXJldHVybiBtYzMyMzBfc2V0X29wY29uKGRhdGEsIE1DMzIzMF9NT0RFX09QQ09OX1NUQU5EQlkpOworfQorCitzdGF0aWMgaW50IG1jMzIzMF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBtYzMyMzBfZGF0YSAqZGF0YTsKKworCWRhdGEgPSBpaW9fcHJpdihpMmNfZ2V0X2NsaWVudGRhdGEodG9faTJjX2NsaWVudChkZXYpKSk7CisKKwlyZXR1cm4gbWMzMjMwX3NldF9vcGNvbihkYXRhLCBNQzMyMzBfTU9ERV9PUENPTl9XQUtFKTsKK30KKyNlbmRpZgorCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMobWMzMjMwX3BtX29wcywgbWMzMjMwX3N1c3BlbmQsIG1jMzIzMF9yZXN1bWUpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbWMzMjMwX2kyY19pZFtdID0geworCXsibWMzMjMwIiwgMH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbWMzMjMwX2kyY19pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtYzMyMzBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm1jMzIzMCIsCisJCS5wbSA9ICZtYzMyMzBfcG1fb3BzLAorCX0sCisJLnByb2JlCQk9IG1jMzIzMF9wcm9iZSwKKwkucmVtb3ZlCQk9IG1jMzIzMF9yZW1vdmUsCisJLmlkX3RhYmxlCT0gbWMzMjMwX2kyY19pZCwKK307CisKK21vZHVsZV9pMmNfZHJpdmVyKG1jMzIzMF9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJtQ3ViZSBNQzMyMzAgMy1BeGlzIEFjY2VsZXJvbWV0ZXIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hY2NlbC9tbWE3NjYwLmMgYi9kcml2ZXJzL2lpby9hY2NlbC9tbWE3NjYwLmMKaW5kZXggMGFjZGVlNS4uMDNiZWFkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWNjZWwvbW1hNzY2MC5jCisrKyBiL2RyaXZlcnMvaWlvL2FjY2VsL21tYTc2NjAuYwpAQCAtMjUxLDYgKzI1MSw3IEBACiAJeyJtbWE3NjYwIiwgMH0sCiAJe30KIH07CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbW1hNzY2MF9pMmNfaWQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIG1tYTc2NjBfYWNwaV9pZFtdID0gewogCXsiTU1BNzY2MCIsIDB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWNjZWwvbXhjNjI1NS5jIGIvZHJpdmVycy9paW8vYWNjZWwvbXhjNjI1NS5jCmluZGV4IDk3Y2NkZTcuLjBhYmFkNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FjY2VsL214YzYyNTUuYworKysgYi9kcml2ZXJzL2lpby9hY2NlbC9teGM2MjU1LmMKQEAgLTE1NCw3ICsxNTQsNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCWlmIChjaGlwX2lkICE9IE1YQzYyNTVfQ0hJUF9JRCkgeworCWlmICgoY2hpcF9pZCAmIDB4MWYpICE9IE1YQzYyNTVfQ0hJUF9JRCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkludmFsaWQgY2hpcCBpZCAleFxuIiwgY2hpcF9pZCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTE3MSwxMiArMTcxLDE0IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgbXhjNjI1NV9hY3BpX21hdGNoW10gPSB7CisJeyJNWEM2MjI1IiwJMH0sCiAJeyJNWEM2MjU1IiwJMH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShhY3BpLCBteGM2MjU1X2FjcGlfbWF0Y2gpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbXhjNjI1NV9pZFtdID0geworCXsibXhjNjIyNSIsCTB9LAogCXsibXhjNjI1NSIsCTB9LAogCXsgfQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FjY2VsL3NzcF9hY2NlbF9zZW5zb3IuYyBiL2RyaXZlcnMvaWlvL2FjY2VsL3NzcF9hY2NlbF9zZW5zb3IuYwppbmRleCA0YWUwNWZjLi4zMWRiMDA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hY2NlbC9zc3BfYWNjZWxfc2Vuc29yLmMKKysrIGIvZHJpdmVycy9paW8vYWNjZWwvc3NwX2FjY2VsX3NlbnNvci5jCkBAIC03NCw3ICs3NCw3IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaWlvX2luZm8gc3NwX2FjY2VsX2lpb19pbmZvID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBzc3BfYWNjZWxfaWlvX2luZm8gPSB7CiAJLnJlYWRfcmF3ID0gJnNzcF9hY2NlbF9yZWFkX3JhdywKIAkud3JpdGVfcmF3ID0gJnNzcF9hY2NlbF93cml0ZV9yYXcsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL0tjb25maWcgYi9kcml2ZXJzL2lpby9hZGMvS2NvbmZpZwppbmRleCAxZGUzMWJkZC4uN2VkY2YzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWRjL0tjb25maWcKKysrIGIvZHJpdmVycy9paW8vYWRjL0tjb25maWcKQEAgLTI2NCw2ICsyNjQsMTUgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQogCSAgY2FsbGVkIGxwYzE4eHhfYWRjLgogCitjb25maWcgTFRDMjQ4NQorCXRyaXN0YXRlICJMaW5lYXIgVGVjaG5vbG9neSBMVEMyNDg1IEFEQyBkcml2ZXIiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgTGluZWFyIFRlY2hub2xvZ3kgTFRDMjQ4NSBBREMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIGx0YzI0ODUuCisKIGNvbmZpZyBNQVgxMDI3CiAJdHJpc3RhdGUgIk1heGltIG1heDEwMjcgQURDIGRyaXZlciIKIAlkZXBlbmRzIG9uIFNQSQpAQCAtMzE3LDYgKzMyNiwxOSBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwgYmUKIAkgIGNhbGxlZCBtY3AzNDIyLgogCitjb25maWcgTUVESUFURUtfTVQ2NTc3X0FVWEFEQworICAgICAgICB0cmlzdGF0ZSAiTWVkaWFUZWsgQVVYQURDIGRyaXZlciIKKyAgICAgICAgZGVwZW5kcyBvbiBBUkNIX01FRElBVEVLIHx8IENPTVBJTEVfVEVTVAorICAgICAgICBkZXBlbmRzIG9uIEhBU19JT01FTQorICAgICAgICBoZWxwCisgICAgICAgICAgU2F5IHllcyBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBNZWRpYVRlayBtdDY1eHggQVVYQURDLgorCisgICAgICAgICAgVGhlIGRyaXZlciBzdXBwb3J0cyBpbW1lZGlhdGUgbW9kZSBvcGVyYXRpb24gdG8gcmVhZCBmcm9tIG9uZSBvZiBzaXh0ZWVuCisgICAgICAgICAgY2hhbm5lbHMgKGV4dGVybmFsIG9yIGludGVybmFsKS4KKworICAgICAgICAgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsIGJlCisgICAgICAgICAgY2FsbGVkIG10NjU3N19hdXhhZGMuCisKIGNvbmZpZyBNRU5fWjE4OF9BREMKIAl0cmlzdGF0ZSAiTUVOIDE2ejE4OCBBREMgSVAgQ29yZSBzdXBwb3J0IgogCWRlcGVuZHMgb24gTUNCCkBAIC0zODksNiArNDExLDcgQEAKIGNvbmZpZyBST0NLQ0hJUF9TQVJBREMKIAl0cmlzdGF0ZSAiUm9ja2NoaXAgU0FSQURDIGRyaXZlciIKIAlkZXBlbmRzIG9uIEFSQ0hfUk9DS0NISVAgfHwgKEFSTSAmJiBDT01QSUxFX1RFU1QpCisJZGVwZW5kcyBvbiBSRVNFVF9DT05UUk9MTEVSCiAJaGVscAogCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBTQVJBREMgZm91bmQgaW4gU29DcyBmcm9tCiAJICBSb2NrY2hpcC4KQEAgLTM5Niw2ICs0MTksMjEgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHJvY2tjaGlwX3NhcmFkYy4KIAorY29uZmlnIFNUWDEwNAorCXRyaXN0YXRlICJBcGV4IEVtYmVkZGVkIFN5c3RlbXMgU1RYMTA0IGRyaXZlciIKKwlkZXBlbmRzIG9uIFg4NiAmJiBJU0FfQlVTX0FQSQorCXNlbGVjdCBHUElPTElCCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBBcGV4IEVtYmVkZGVkIFN5c3RlbXMgU1RYMTA0CisJICBpbnRlZ3JhdGVkIGFuYWxvZyBQQy8xMDQgY2FyZC4KKworCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIDE2IGNoYW5uZWxzIG9mIHNpbmdsZS1lbmRlZCAoOCBjaGFubmVscyBvZgorCSAgZGlmZmVyZW50aWFsKSBhbmFsb2cgaW5wdXRzLCAyIGNoYW5uZWxzIG9mIGFuYWxvZyBvdXRwdXQsIDQgZGlnaXRhbAorCSAgaW5wdXRzLCBhbmQgNCBkaWdpdGFsIG91dHB1dHMgcHJvdmlkZWQgYnkgdGhlIFNUWDEwNC4KKworCSAgVGhlIGJhc2UgcG9ydCBhZGRyZXNzZXMgZm9yIHRoZSBkZXZpY2VzIG1heSBiZSBjb25maWd1cmVkIHZpYSB0aGUgYmFzZQorCSAgYXJyYXkgbW9kdWxlIHBhcmFtZXRlci4KKwogY29uZmlnIFRJX0FEQzA4MUMKIAl0cmlzdGF0ZSAiVGV4YXMgSW5zdHJ1bWVudHMgQURDMDgxQy9BREMxMDFDL0FEQzEyMUMgZmFtaWx5IgogCWRlcGVuZHMgb24gSTJDCkBAIC00MTYsNiArNDU0LDE4IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbCBiZQogCSAgY2FsbGVkIHRpLWFkYzA4MzIuCiAKK2NvbmZpZyBUSV9BREMxMjEzOAorCXRyaXN0YXRlICJUZXhhcyBJbnN0cnVtZW50cyBBREMxMjEzMC9BREMxMjEzMi9BREMxMjEzOCIKKwlkZXBlbmRzIG9uIFNQSQorCXNlbGVjdCBJSU9fQlVGRkVSCisJc2VsZWN0IElJT19UUklHR0VSRURfQlVGRkVSCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIFRleGFzIEluc3RydW1lbnRzIEFEQzEyMTMwLAorCSAgQURDMTIxMzIgYW5kIEFEQzEyMTM4IGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIHRpLWFkYzEyMTM4LgorCiBjb25maWcgVElfQURDMTI4UzA1MgogCXRyaXN0YXRlICJUZXhhcyBJbnN0cnVtZW50cyBBREMxMjhTMDUyL0FEQzEyMlMwMjEvQURDMTI0UzAyMSIKIAlkZXBlbmRzIG9uIFNQSQpAQCAtNDI2LDYgKzQ3NiwxOCBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwgYmUKIAkgIGNhbGxlZCB0aS1hZGMxMjhzMDUyLgogCitjb25maWcgVElfQURDMTYxUzYyNgorCXRyaXN0YXRlICJUZXhhcyBJbnN0cnVtZW50cyBBREMxNjFTNjI2IDEtY2hhbm5lbCBkaWZmZXJlbnRpYWwgQURDIgorCWRlcGVuZHMgb24gU1BJCisJc2VsZWN0IElJT19CVUZGRVIKKwlzZWxlY3QgSUlPX1RSSUdHRVJFRF9CVUZGRVIKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgQURDMTQxUzYyNiwKKwkgIGFuZCBBREMxNjFTNjI2IGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIHRpLWFkYzE2MXM2MjYuCisKIGNvbmZpZyBUSV9BRFMxMDE1CiAJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIEFEUzEwMTUgQURDIgogCWRlcGVuZHMgb24gSTJDICYmICFTRU5TT1JTX0FEUzEwMTUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9NYWtlZmlsZSBiL2RyaXZlcnMvaWlvL2FkYy9NYWtlZmlsZQppbmRleCAwYmEwZDUwLi43YTQwYzA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9paW8vYWRjL01ha2VmaWxlCkBAIC0yNywxMCArMjcsMTIgQEAKIG9iai0kKENPTkZJR19JTkEyWFhfQURDKSArPSBpbmEyeHgtYWRjLm8KIG9iai0kKENPTkZJR19MUDg3ODhfQURDKSArPSBscDg3ODhfYWRjLm8KIG9iai0kKENPTkZJR19MUEMxOFhYX0FEQykgKz0gbHBjMTh4eF9hZGMubworb2JqLSQoQ09ORklHX0xUQzI0ODUpICs9IGx0YzI0ODUubwogb2JqLSQoQ09ORklHX01BWDEwMjcpICs9IG1heDEwMjcubwogb2JqLSQoQ09ORklHX01BWDEzNjMpICs9IG1heDEzNjMubwogb2JqLSQoQ09ORklHX01DUDMyMFgpICs9IG1jcDMyMHgubwogb2JqLSQoQ09ORklHX01DUDM0MjIpICs9IG1jcDM0MjIubworb2JqLSQoQ09ORklHX01FRElBVEVLX01UNjU3N19BVVhBREMpICs9IG10NjU3N19hdXhhZGMubwogb2JqLSQoQ09ORklHX01FTl9aMTg4X0FEQykgKz0gbWVuX3oxODhfYWRjLm8KIG9iai0kKENPTkZJR19NWFNfTFJBREMpICs9IG14cy1scmFkYy5vCiBvYmotJChDT05GSUdfTkFVNzgwMikgKz0gbmF1NzgwMi5vCkBAIC0zOCw5ICs0MCwxMiBAQAogb2JqLSQoQ09ORklHX1FDT01fU1BNSV9JQURDKSArPSBxY29tLXNwbWktaWFkYy5vCiBvYmotJChDT05GSUdfUUNPTV9TUE1JX1ZBREMpICs9IHFjb20tc3BtaS12YWRjLm8KIG9iai0kKENPTkZJR19ST0NLQ0hJUF9TQVJBREMpICs9IHJvY2tjaGlwX3NhcmFkYy5vCitvYmotJChDT05GSUdfU1RYMTA0KSArPSBzdHgxMDQubwogb2JqLSQoQ09ORklHX1RJX0FEQzA4MUMpICs9IHRpLWFkYzA4MWMubwogb2JqLSQoQ09ORklHX1RJX0FEQzA4MzIpICs9IHRpLWFkYzA4MzIubworb2JqLSQoQ09ORklHX1RJX0FEQzEyMTM4KSArPSB0aS1hZGMxMjEzOC5vCiBvYmotJChDT05GSUdfVElfQURDMTI4UzA1MikgKz0gdGktYWRjMTI4czA1Mi5vCitvYmotJChDT05GSUdfVElfQURDMTYxUzYyNikgKz0gdGktYWRjMTYxczYyNi5vCiBvYmotJChDT05GSUdfVElfQURTMTAxNSkgKz0gdGktYWRzMTAxNS5vCiBvYmotJChDT05GSUdfVElfQURTODY4OCkgKz0gdGktYWRzODY4OC5vCiBvYmotJChDT05GSUdfVElfQU0zMzVYX0FEQykgKz0gdGlfYW0zMzV4X2FkYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvYWQ3MjY2LmMgYi9kcml2ZXJzL2lpby9hZGMvYWQ3MjY2LmMKaW5kZXggYzBmNmE5OC4uYjhkNWNmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWRjL2FkNzI2Ni5jCisrKyBiL2RyaXZlcnMvaWlvL2FkYy9hZDcyNjYuYwpAQCAtNDgxLDcgKzQ4MSw3IEBACiAJaWYgKCFzdC0+Zml4ZWRfYWRkcikKIAkJZ3Bpb19mcmVlX2FycmF5KHN0LT5ncGlvcywgQVJSQVlfU0laRShzdC0+Z3Bpb3MpKTsKIGVycm9yX2Rpc2FibGVfcmVnOgotCWlmICghSVNfRVJSX09SX05VTEwoc3QtPnJlZykpCisJaWYgKCFJU19FUlIoc3QtPnJlZykpCiAJCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT5yZWcpOwogCiAJcmV0dXJuIHJldDsKQEAgLTQ5Niw3ICs0OTYsNyBAQAogCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoaW5kaW9fZGV2KTsKIAlpZiAoIXN0LT5maXhlZF9hZGRyKQogCQlncGlvX2ZyZWVfYXJyYXkoc3QtPmdwaW9zLCBBUlJBWV9TSVpFKHN0LT5ncGlvcykpOwotCWlmICghSVNfRVJSX09SX05VTEwoc3QtPnJlZykpCisJaWYgKCFJU19FUlIoc3QtPnJlZykpCiAJCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT5yZWcpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvYWQ3Mjk4LmMgYi9kcml2ZXJzL2lpby9hZGMvYWQ3Mjk4LmMKaW5kZXggMTBlYzhmYy4uZTM5OWJmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWRjL2FkNzI5OC5jCisrKyBiL2RyaXZlcnMvaWlvL2FkYy9hZDcyOTguYwpAQCAtMjM5LDE2ICsyMzksMTYgQEAKIAogCXN3aXRjaCAobSkgewogCWNhc2UgSUlPX0NIQU5fSU5GT19SQVc6Ci0JCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOwotCQlpZiAoaW5kaW9fZGV2LT5jdXJyZW50bW9kZSA9PSBJTkRJT19CVUZGRVJfVFJJR0dFUkVEKSB7Ci0JCQlyZXQgPSAtRUJVU1k7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoY2hhbi0+YWRkcmVzcyA9PSBBRDcyOThfQ0hfVEVNUCkKLQkJCQlyZXQgPSBhZDcyOThfc2Nhbl90ZW1wKHN0LCB2YWwpOwotCQkJZWxzZQotCQkJCXJldCA9IGFkNzI5OF9zY2FuX2RpcmVjdChzdCwgY2hhbi0+YWRkcmVzcyk7Ci0JCX0KLQkJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwkJcmV0ID0gaWlvX2RldmljZV9jbGFpbV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlpZiAoY2hhbi0+YWRkcmVzcyA9PSBBRDcyOThfQ0hfVEVNUCkKKwkJCXJldCA9IGFkNzI5OF9zY2FuX3RlbXAoc3QsIHZhbCk7CisJCWVsc2UKKwkJCXJldCA9IGFkNzI5OF9zY2FuX2RpcmVjdChzdCwgY2hhbi0+YWRkcmVzcyk7CisKKwkJaWlvX2RldmljZV9yZWxlYXNlX2RpcmVjdF9tb2RlKGluZGlvX2Rldik7CiAKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL2FkNzc5My5jIGIvZHJpdmVycy9paW8vYWRjL2FkNzc5My5jCmluZGV4IDg0Nzc4OWIuLmU2NzA2YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FkYy9hZDc3OTMuYworKysgYi9kcml2ZXJzL2lpby9hZGMvYWQ3NzkzLmMKQEAgLTUxOSwxMSArNTE5LDkgQEAKIAlpbnQgcmV0LCBpOwogCXVuc2lnbmVkIGludCB0bXA7CiAKLQltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKLQlpZiAoaWlvX2J1ZmZlcl9lbmFibGVkKGluZGlvX2RldikpIHsKLQkJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9CisJcmV0ID0gaWlvX2RldmljZV9jbGFpbV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlzd2l0Y2ggKG1hc2spIHsKIAljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6CkBAIC01NDgsNyArNTQ2LDcgQEAKIAkJcmV0ID0gLUVJTlZBTDsKIAl9CiAKLQltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCWlpb19kZXZpY2VfcmVsZWFzZV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9hZDc5OXguYyBiL2RyaXZlcnMvaWlvL2FkYy9hZDc5OXguYwppbmRleCBiNjE2Mzc2Li45NzA0MDkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvYWQ3OTl4LmMKKysrIGIvZHJpdmVycy9paW8vYWRjL2FkNzk5eC5jCkBAIC01MjcsNiArNTI3LDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gYWQ3OTkxX2luZm8gPSB7CiAJLnJlYWRfcmF3ID0gJmFkNzk5eF9yZWFkX3JhdywKIAkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorCS51cGRhdGVfc2Nhbl9tb2RlID0gYWQ3OTl4X3VwZGF0ZV9zY2FuX21vZGUsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGFkNzk5M180XzdfOF9ub2lycV9pbmZvID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL2F0OTFfYWRjLmMgYi9kcml2ZXJzL2lpby9hZGMvYXQ5MV9hZGMuYwppbmRleCA1MjQzMGJhLi5iYmRhYzA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvYXQ5MV9hZGMuYworKysgYi9kcml2ZXJzL2lpby9hZGMvYXQ5MV9hZGMuYwpAQCAtMTEzLDYgKzExMyw3IEBACiAjZGVmaW5lCQlBVDkxX0FEQ19UU01SX1RTQVYJKDMgPDwgNCkJLyogQXZlcmFnZXMgc2FtcGxlcyAqLwogI2RlZmluZQkJCUFUOTFfQURDX1RTTVJfVFNBVl8oeCkJCSgoeCkgPDwgNCkKICNkZWZpbmUJCUFUOTFfQURDX1RTTVJfU0NUSU0JKDB4MGYgPDwgMTYpCS8qIFN3aXRjaCBjbG9zdXJlIHRpbWUgKi8KKyNkZWZpbmUJCQlBVDkxX0FEQ19UU01SX1NDVElNXyh4KQkJKCh4KSA8PCAxNikKICNkZWZpbmUJCUFUOTFfQURDX1RTTVJfUEVOREJDCSgweDBmIDw8IDI4KQkvKiBQZW4gRGVib3VuY2UgdGltZSAqLwogI2RlZmluZQkJCUFUOTFfQURDX1RTTVJfUEVOREJDXyh4KQkoKHgpIDw8IDI4KQogI2RlZmluZQkJQVQ5MV9BRENfVFNNUl9OT1RTRE1BCSgxIDw8IDIyKQkvKiBObyBUb3VjaHNjcmVlbiBETUEgKi8KQEAgLTE1MCw2ICsxNTEsNyBAQAogI2RlZmluZSBNQVhfUkxQT1NfQklUUyAgICAgICAgIDEwCiAjZGVmaW5lIFRPVUNIX1NBTVBMRV9QRVJJT0RfVVNfUkwgICAgICAxMDAwMCAgIC8qIDEwbXMsIHRoZSBTb0MgY2FuJ3Qga2VlcCB1cCB3aXRoIDJtcyAqLwogI2RlZmluZSBUT1VDSF9TSFRJTSAgICAgICAgICAgICAgICAgICAgMHhhCisjZGVmaW5lIFRPVUNIX1NDVElNX1VTCQkxMAkJLyogMTB1cyBmb3IgdGhlIFRvdWNoc2NyZWVuIFN3aXRjaGVzIENsb3N1cmUgVGltZSAqLwogCiAvKioKICAqIHN0cnVjdCBhdDkxX2FkY19yZWdfZGVzYyAtIFZhcmlvdXMgaW5mb3JtYXRpb25zIHJlbGF0aXZlIHRvIHJlZ2lzdGVycwpAQCAtMzgxLDggKzM4Myw4IEBACiAJCXN0LT50c19idWZmZXJlZG1lYXN1cmUgPSBmYWxzZTsKIAkJaW5wdXRfcmVwb3J0X2tleShzdC0+dHNfaW5wdXQsIEJUTl9UT1VDSCwgMCk7CiAJCWlucHV0X3N5bmMoc3QtPnRzX2lucHV0KTsKLQl9IGVsc2UgaWYgKHN0YXR1cyAmIEFUOTFfQURDX0VPQygzKSkgewotCQkvKiBDb252ZXJzaW9uIGZpbmlzaGVkICovCisJfSBlbHNlIGlmIChzdGF0dXMgJiBBVDkxX0FEQ19FT0MoMykgJiYgc3QtPnRzX2lucHV0KSB7CisJCS8qIENvbnZlcnNpb24gZmluaXNoZWQgYW5kIHdlJ3ZlIGEgdG91Y2hzY3JlZW4gKi8KIAkJaWYgKHN0LT50c19idWZmZXJlZG1lYXN1cmUpIHsKIAkJCS8qCiAJCQkgKiBMYXN0IG1lYXN1cmVtZW50IGlzIGFsd2F5cyBkaXNjYXJkZWQsIHNpbmNlIGl0IGNhbgpAQCAtMTAwMSw3ICsxMDAzLDkgQEAKIAogc3RhdGljIGludCBhdDkxX3RzX2h3X2luaXQoc3RydWN0IGF0OTFfYWRjX3N0YXRlICpzdCwgdTMyIGFkY19jbGtfa2h6KQogeworCXN0cnVjdCBpaW9fZGV2ICppZGV2ID0gaWlvX3ByaXZfdG9fZGV2KHN0KTsKIAl1MzIgcmVnID0gMDsKKwl1MzIgdHNzY3RpbSA9IDA7CiAJaW50IGkgPSAwOwogCiAJLyogYSBQZW4gRGV0ZWN0IERlYm91bmNlIFRpbWUgaXMgbmVjZXNzYXJ5IGZvciB0aGUgQURDIFRvdWNoIHRvIGF2b2lkCkBAIC0xMDM0LDExICsxMDM4LDIwIEBACiAJCXJldHVybiAwOwogCX0KIAorCS8qIFRvdWNoc2NyZWVuIFN3aXRjaGVzIENsb3N1cmUgdGltZSBuZWVkZWQgZm9yIGFsbG93aW5nIHRoZSB2YWx1ZSB0bworCSAqIHN0YWJpbGl6ZS4KKwkgKiBTd2l0Y2ggQ2xvc3VyZSBUaW1lID0gKFRTU0NUSU0gKiA0KSBBRENDbG9jayBwZXJpb2RzCisJICovCisJdHNzY3RpbSA9IERJVl9ST1VORF9VUChUT1VDSF9TQ1RJTV9VUyAqIGFkY19jbGtfa2h6IC8gMTAwMCwgNCk7CisJZGV2X2RiZygmaWRldi0+ZGV2LCAiYWRjX2NsayBhdDogJWQgS0h6LCB0c3NjdGltIGF0OiAlZFxuIiwKKwkJYWRjX2Nsa19raHosIHRzc2N0aW0pOworCiAJaWYgKHN0LT50b3VjaHNjcmVlbl90eXBlID09IEFUTUVMX0FEQ19UT1VDSFNDUkVFTl80V0lSRSkKIAkJcmVnID0gQVQ5MV9BRENfVFNNUl9UU01PREVfNFdJUkVfUFJFU1M7CiAJZWxzZQogCQlyZWcgPSBBVDkxX0FEQ19UU01SX1RTTU9ERV81V0lSRTsKIAorCXJlZyB8PSBBVDkxX0FEQ19UU01SX1NDVElNXyh0c3NjdGltKSAmIEFUOTFfQURDX1RTTVJfU0NUSU07CiAJcmVnIHw9IEFUOTFfQURDX1RTTVJfVFNBVl8oc3QtPmNhcHMtPnRzX2ZpbHRlcl9hdmVyYWdlKQogCSAgICAgICAmIEFUOTFfQURDX1RTTVJfVFNBVjsKIAlyZWcgfD0gQVQ5MV9BRENfVFNNUl9QRU5EQkNfKHN0LT50c19wZW5kYmMpICYgQVQ5MV9BRENfVFNNUl9QRU5EQkM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvaW5hMnh4LWFkYy5jIGIvZHJpdmVycy9paW8vYWRjL2luYTJ4eC1hZGMuYwppbmRleCA5NTVmM2ZkLi41OWI3ZDc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvaW5hMnh4LWFkYy5jCisrKyBiL2RyaXZlcnMvaWlvL2FkYy9pbmEyeHgtYWRjLmMKQEAgLTExNCw3ICsxMTQsNiBAQAogCXN0cnVjdCBtdXRleCBzdGF0ZV9sb2NrOwogCXVuc2lnbmVkIGludCBzaHVudF9yZXNpc3RvcjsKIAlpbnQgYXZnOwotCXM2NCBwcmV2X25zOyAvKiB0cmFjayBidWZmZXIgY2FwdHVyZSB0aW1lLCBjaGVjayBmb3IgdW5kZXJydW5zICovCiAJaW50IGludF90aW1lX3ZidXM7IC8qIEJ1cyB2b2x0YWdlIGludGVncmF0aW9uIHRpbWUgdVMgKi8KIAlpbnQgaW50X3RpbWVfdnNodW50OyAvKiBTaHVudCB2b2x0YWdlIGludGVncmF0aW9uIHRpbWUgdVMgKi8KIAlib29sIGFsbG93X2FzeW5jX3JlYWRvdXQ7CkBAIC01MDksOCArNTA4LDYgQEAKIAlpaW9fcHVzaF90b19idWZmZXJzX3dpdGhfdGltZXN0YW1wKGluZGlvX2RldiwKIAkJCQkJICAgKHVuc2lnbmVkIGludCAqKWRhdGEsIHRpbWVfYSk7CiAKLQljaGlwLT5wcmV2X25zID0gdGltZV9hOwotCiAJcmV0dXJuICh1bnNpZ25lZCBsb25nKSh0aW1lX2IgLSB0aW1lX2EpIC8gMTAwMDsKIH07CiAKQEAgLTU1NCw4ICs1NTEsNiBAQAogCWRldl9kYmcoJmluZGlvX2Rldi0+ZGV2LCAiQXN5bmMgcmVhZG91dCBtb2RlOiAlZFxuIiwKIAkJY2hpcC0+YWxsb3dfYXN5bmNfcmVhZG91dCk7CiAKLQljaGlwLT5wcmV2X25zID0gaWlvX2dldF90aW1lX25zKGluZGlvX2Rldik7Ci0KIAljaGlwLT50YXNrID0ga3RocmVhZF9ydW4oaW5hMnh4X2NhcHR1cmVfdGhyZWFkLCAodm9pZCAqKWluZGlvX2RldiwKIAkJCQkgIiVzOiVkLSV1dXMiLCBpbmRpb19kZXYtPm5hbWUsIGluZGlvX2Rldi0+aWQsCiAJCQkJIHNhbXBsaW5nX3VzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9sdGMyNDg1LmMgYi9kcml2ZXJzL2lpby9hZGMvbHRjMjQ4NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYjkxZjEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vYWRjL2x0YzI0ODUuYwpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIGx0YzI0ODUuYyAtIERyaXZlciBmb3IgTGluZWFyIFRlY2hub2xvZ3kgTFRDMjQ4NSBBREMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQWxpc29uIFNjaG9maWVsZCA8YW1zZmllbGQyMkBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBEYXRhc2hlZXQ6IGh0dHA6Ly9jZHMubGluZWFyLmNvbS9kb2NzL2VuL2RhdGFzaGVldC8yNDg1ZmQucGRmCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3N5c2ZzLmg+CisKKy8qIFBvd2VyLW9uIGNvbmZpZ3VyYXRpb246IHJlamVjdHMgYm90aCA1MC82MEh6LCBvcGVyYXRlcyBhdCAxeCBzcGVlZCAqLworI2RlZmluZSBMVEMyNDg1X0NPTkZJR19ERUZBVUxUCQkwCisKK3N0cnVjdCBsdGMyNDg1X2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQ7CisJa3RpbWVfdAkJCXRpbWVfcHJldjsJLyogbGFzdCBjb252ZXJzaW9uICovCit9OworCitzdGF0aWMgdm9pZCBsdGMyNDg1X3dhaXRfY29udihzdHJ1Y3QgbHRjMjQ4NV9kYXRhICpkYXRhKQoreworCWNvbnN0IHVuc2lnbmVkIGludCBjb252X3RpbWUgPSAxNDc7CS8qIGNvbnZlcnNpb24gdGltZSBtcyAqLworCXVuc2lnbmVkIGludCB0aW1lX2VsYXBzZWQ7CisKKwkvKiBkZWxheSBpZiBjb252ZXJzaW9uIHRpbWUgbm90IHBhc3NlZCBzaW5jZSBsYXN0IHJlYWQgb3Igd3JpdGUgKi8KKwl0aW1lX2VsYXBzZWQgPSBrdGltZV9tc19kZWx0YShrdGltZV9nZXQoKSwgZGF0YS0+dGltZV9wcmV2KTsKKworCWlmICh0aW1lX2VsYXBzZWQgPCBjb252X3RpbWUpCisJCW1zbGVlcChjb252X3RpbWUgLSB0aW1lX2VsYXBzZWQpOworfQorCitzdGF0aWMgaW50IGx0YzI0ODVfcmVhZChzdHJ1Y3QgbHRjMjQ4NV9kYXRhICpkYXRhLCBpbnQgKnZhbCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OworCV9fYmUzMiBidWYgPSAwOworCWludCByZXQ7CisKKwlsdGMyNDg1X3dhaXRfY29udihkYXRhKTsKKworCXJldCA9IGkyY19tYXN0ZXJfcmVjdihjbGllbnQsIChjaGFyICopJmJ1ZiwgNCk7CisJaWYgKHJldCA8IDApICB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiaTJjX21hc3Rlcl9yZWN2IGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCWRhdGEtPnRpbWVfcHJldiA9IGt0aW1lX2dldCgpOworCSp2YWwgPSBzaWduX2V4dGVuZDMyKGJlMzJfdG9fY3B1KGJ1ZikgPj4gNiwgMjQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBsdGMyNDg1X3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICAgaW50ICp2YWwsIGludCAqdmFsMiwgbG9uZyBtYXNrKQoreworCXN0cnVjdCBsdGMyNDg1X2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQ7CisKKwlpZiAobWFzayA9PSBJSU9fQ0hBTl9JTkZPX1JBVykgeworCQlyZXQgPSBsdGMyNDg1X3JlYWQoZGF0YSwgdmFsKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXJldHVybiBJSU9fVkFMX0lOVDsKKworCX0gZWxzZSBpZiAobWFzayA9PSBJSU9fQ0hBTl9JTkZPX1NDQUxFKSB7CisJCSp2YWwgPSA1MDAwOwkJCS8qIG9uIGJvYXJkIHZyZWYgbWlsbGl2b2x0cyAqLworCQkqdmFsMiA9IDI1OwkJCS8qIDI1ICgyNCArIHNpZ24pIGRhdGEgYml0cyAqLworCQlyZXR1cm4gSUlPX1ZBTF9GUkFDVElPTkFMX0xPRzI7CisKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBsdGMyNDg1X2NoYW5uZWxbXSA9IHsKKwl7CisJCS50eXBlID0gSUlPX1ZPTFRBR0UsCisJCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLAorCQkuaW5mb19tYXNrX3NoYXJlZF9ieV90eXBlID0gQklUKElJT19DSEFOX0lORk9fU0NBTEUpCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gbHRjMjQ4NV9pbmZvID0geworCS5yZWFkX3JhdyA9IGx0YzI0ODVfcmVhZF9yYXcsCisJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgbHRjMjQ4NV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXN0cnVjdCBsdGMyNDg1X2RhdGEgKmRhdGE7CisJaW50IHJldDsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMgfAorCQkJCSAgICAgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqZGF0YSkpOworCWlmICghaW5kaW9fZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGluZGlvX2Rldik7CisJZGF0YS0+Y2xpZW50ID0gY2xpZW50OworCisJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCWluZGlvX2Rldi0+bmFtZSA9IGlkLT5uYW1lOworCWluZGlvX2Rldi0+aW5mbyA9ICZsdGMyNDg1X2luZm87CisJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBsdGMyNDg1X2NoYW5uZWw7CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKGx0YzI0ODVfY2hhbm5lbCk7CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZShkYXRhLT5jbGllbnQsIExUQzI0ODVfQ09ORklHX0RFRkFVTFQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZGF0YS0+dGltZV9wcmV2ID0ga3RpbWVfZ2V0KCk7CisKKwlyZXR1cm4gZGV2bV9paW9fZGV2aWNlX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgaW5kaW9fZGV2KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGx0YzI0ODVfaWRbXSA9IHsKKwl7ICJsdGMyNDg1IiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBsdGMyNDg1X2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGx0YzI0ODVfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImx0YzI0ODUiLAorCX0sCisJLnByb2JlID0gbHRjMjQ4NV9wcm9iZSwKKwkuaWRfdGFibGUgPSBsdGMyNDg1X2lkLAorfTsKK21vZHVsZV9pMmNfZHJpdmVyKGx0YzI0ODVfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiQWxpc29uIFNjaG9maWVsZCA8YW1zZmllbGQyMkBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxpbmVhciBUZWNobm9sb2d5IExUQzI0ODUgQURDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL21lbl96MTg4X2FkYy5jIGIvZHJpdmVycy9paW8vYWRjL21lbl96MTg4X2FkYy5jCmluZGV4IGQwOTVlZmUuLjhmMzYwNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FkYy9tZW5fejE4OF9hZGMuYworKysgYi9kcml2ZXJzL2lpby9hZGMvbWVuX3oxODhfYWRjLmMKQEAgLTc4LDcgKzc4LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IGlpb19pbmZvIHoxODhfYWRjX2luZm8gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIHoxODhfYWRjX2luZm8gPSB7CiAJLnJlYWRfcmF3ID0gJnoxODhfaWlvX3JlYWRfcmF3LAogCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL210NjU3N19hdXhhZGMuYyBiL2RyaXZlcnMvaWlvL2FkYy9tdDY1NzdfYXV4YWRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQxMDRjOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL2FkYy9tdDY1NzdfYXV4YWRjLmMKQEAgLTAsMCArMSwyOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgTWVkaWFUZWsgSW5jLgorICogQXV0aG9yOiBaaGl5b25nIFRhbyA8emhpeW9uZy50YW9AbWVkaWF0ZWsuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgorCisvKiBSZWdpc3RlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBNVDY1NzdfQVVYQURDX0NPTjAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgTVQ2NTc3X0FVWEFEQ19DT04xICAgICAgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIE1UNjU3N19BVVhBRENfQ09OMiAgICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBNVDY1NzdfQVVYQURDX1NUQSAgICAgICAgICAgICAgICAgICAgIEJJVCgwKQorCisjZGVmaW5lIE1UNjU3N19BVVhBRENfREFUMCAgICAgICAgICAgICAgICAgICAgMHgxNAorI2RlZmluZSBNVDY1NzdfQVVYQURDX1JEWTAgICAgICAgICAgICAgICAgICAgIEJJVCgxMikKKworI2RlZmluZSBNVDY1NzdfQVVYQURDX01JU0MgICAgICAgICAgICAgICAgICAgIDB4OTQKKyNkZWZpbmUgTVQ2NTc3X0FVWEFEQ19QRE5fRU4gICAgICAgICAgICAgICAgICBCSVQoMTQpCisKKyNkZWZpbmUgTVQ2NTc3X0FVWEFEQ19EQVRfTUFTSyAgICAgICAgICAgICAgICAweGZmZgorI2RlZmluZSBNVDY1NzdfQVVYQURDX1NMRUVQX1VTICAgICAgICAgICAgICAgIDEwMDAKKyNkZWZpbmUgTVQ2NTc3X0FVWEFEQ19USU1FT1VUX1VTICAgICAgICAgICAgICAxMDAwMAorI2RlZmluZSBNVDY1NzdfQVVYQURDX1BPV0VSX1JFQURZX01TICAgICAgICAgIDEKKyNkZWZpbmUgTVQ2NTc3X0FVWEFEQ19TQU1QTEVfUkVBRFlfVVMgICAgICAgICAyNQorCitzdHJ1Y3QgbXQ2NTc3X2F1eGFkY19kZXZpY2UgeworCXZvaWQgX19pb21lbSAqcmVnX2Jhc2U7CisJc3RydWN0IGNsayAqYWRjX2NsazsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKK307CisKKyNkZWZpbmUgTVQ2NTc3X0FVWEFEQ19DSEFOTkVMKGlkeCkgewkJCQkgICAgXAorCQkudHlwZSA9IElJT19WT0xUQUdFLAkJCQkgICAgXAorCQkuaW5kZXhlZCA9IDEsCQkJCQkgICAgXAorCQkuY2hhbm5lbCA9IChpZHgpLAkJCQkgICAgXAorCQkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUFJPQ0VTU0VEKSwgXAorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgbXQ2NTc3X2F1eGFkY19paW9fY2hhbm5lbHNbXSA9IHsKKwlNVDY1NzdfQVVYQURDX0NIQU5ORUwoMCksCisJTVQ2NTc3X0FVWEFEQ19DSEFOTkVMKDEpLAorCU1UNjU3N19BVVhBRENfQ0hBTk5FTCgyKSwKKwlNVDY1NzdfQVVYQURDX0NIQU5ORUwoMyksCisJTVQ2NTc3X0FVWEFEQ19DSEFOTkVMKDQpLAorCU1UNjU3N19BVVhBRENfQ0hBTk5FTCg1KSwKKwlNVDY1NzdfQVVYQURDX0NIQU5ORUwoNiksCisJTVQ2NTc3X0FVWEFEQ19DSEFOTkVMKDcpLAorCU1UNjU3N19BVVhBRENfQ0hBTk5FTCg4KSwKKwlNVDY1NzdfQVVYQURDX0NIQU5ORUwoOSksCisJTVQ2NTc3X0FVWEFEQ19DSEFOTkVMKDEwKSwKKwlNVDY1NzdfQVVYQURDX0NIQU5ORUwoMTEpLAorCU1UNjU3N19BVVhBRENfQ0hBTk5FTCgxMiksCisJTVQ2NTc3X0FVWEFEQ19DSEFOTkVMKDEzKSwKKwlNVDY1NzdfQVVYQURDX0NIQU5ORUwoMTQpLAorCU1UNjU3N19BVVhBRENfQ0hBTk5FTCgxNSksCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgbXQ2NTc3X2F1eGFkY19tb2RfcmVnKHZvaWQgX19pb21lbSAqcmVnLAorCQkJCQkgdTMyIG9yX21hc2ssIHUzMiBhbmRfbWFzaykKK3sKKwl1MzIgdmFsOworCisJdmFsID0gcmVhZGwocmVnKTsKKwl2YWwgfD0gb3JfbWFzazsKKwl2YWwgJj0gfmFuZF9tYXNrOworCXdyaXRlbCh2YWwsIHJlZyk7Cit9CisKK3N0YXRpYyBpbnQgbXQ2NTc3X2F1eGFkY19yZWFkKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbikKK3sKKwl1MzIgdmFsOworCXZvaWQgX19pb21lbSAqcmVnX2NoYW5uZWw7CisJaW50IHJldDsKKwlzdHJ1Y3QgbXQ2NTc3X2F1eGFkY19kZXZpY2UgKmFkY19kZXYgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJcmVnX2NoYW5uZWwgPSBhZGNfZGV2LT5yZWdfYmFzZSArIE1UNjU3N19BVVhBRENfREFUMCArCisJCSAgICAgIGNoYW4tPmNoYW5uZWwgKiAweDA0OworCisJbXV0ZXhfbG9jaygmYWRjX2Rldi0+bG9jayk7CisKKwltdDY1NzdfYXV4YWRjX21vZF9yZWcoYWRjX2Rldi0+cmVnX2Jhc2UgKyBNVDY1NzdfQVVYQURDX0NPTjEsCisJCQkgICAgICAwLCAxIDw8IGNoYW4tPmNoYW5uZWwpOworCisJLyogcmVhZCBjaGFubmVsIGFuZCBtYWtlIHN1cmUgb2xkIHJlYWR5IGJpdCA9PSAwICovCisJcmV0ID0gcmVhZGxfcG9sbF90aW1lb3V0KHJlZ19jaGFubmVsLCB2YWwsCisJCQkJICgodmFsICYgTVQ2NTc3X0FVWEFEQ19SRFkwKSA9PSAwKSwKKwkJCQkgTVQ2NTc3X0FVWEFEQ19TTEVFUF9VUywKKwkJCQkgTVQ2NTc3X0FVWEFEQ19USU1FT1VUX1VTKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGluZGlvX2Rldi0+ZGV2LnBhcmVudCwKKwkJCSJ3YWl0IGZvciBjaGFubmVsWyVkXSByZWFkeSBiaXQgY2xlYXIgdGltZSBvdXRcbiIsCisJCQljaGFuLT5jaGFubmVsKTsKKwkJZ290byBlcnJfdGltZW91dDsKKwl9CisKKwkvKiBzZXQgYml0IHRvIHRyaWdnZXIgc2FtcGxlICovCisJbXQ2NTc3X2F1eGFkY19tb2RfcmVnKGFkY19kZXYtPnJlZ19iYXNlICsgTVQ2NTc3X0FVWEFEQ19DT04xLAorCQkJICAgICAgMSA8PCBjaGFuLT5jaGFubmVsLCAwKTsKKworCS8qIHdlIG11c3QgZGVsYXkgaGVyZSBmb3IgaGFyZHdhcmUgc2FtcGxlIGNoYW5uZWwgZGF0YSAqLworCXVkZWxheShNVDY1NzdfQVVYQURDX1NBTVBMRV9SRUFEWV9VUyk7CisKKwkvKiBjaGVjayBNVEtfQVVYQURDX0NPTjIgaWYgYXV4YWRjIGlzIGlkbGUgKi8KKwlyZXQgPSByZWFkbF9wb2xsX3RpbWVvdXQoYWRjX2Rldi0+cmVnX2Jhc2UgKyBNVDY1NzdfQVVYQURDX0NPTjIsIHZhbCwKKwkJCQkgKCh2YWwgJiBNVDY1NzdfQVVYQURDX1NUQSkgPT0gMCksCisJCQkJIE1UNjU3N19BVVhBRENfU0xFRVBfVVMsCisJCQkJIE1UNjU3N19BVVhBRENfVElNRU9VVF9VUyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihpbmRpb19kZXYtPmRldi5wYXJlbnQsCisJCQkid2FpdCBmb3IgYXV4YWRjIGlkbGUgdGltZSBvdXRcbiIpOworCQlnb3RvIGVycl90aW1lb3V0OworCX0KKworCS8qIHJlYWQgY2hhbm5lbCBhbmQgbWFrZSBzdXJlIHJlYWR5IGJpdCA9PSAxICovCisJcmV0ID0gcmVhZGxfcG9sbF90aW1lb3V0KHJlZ19jaGFubmVsLCB2YWwsCisJCQkJICgodmFsICYgTVQ2NTc3X0FVWEFEQ19SRFkwKSAhPSAwKSwKKwkJCQkgTVQ2NTc3X0FVWEFEQ19TTEVFUF9VUywKKwkJCQkgTVQ2NTc3X0FVWEFEQ19USU1FT1VUX1VTKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGluZGlvX2Rldi0+ZGV2LnBhcmVudCwKKwkJCSJ3YWl0IGZvciBjaGFubmVsWyVkXSBkYXRhIHJlYWR5IHRpbWUgb3V0XG4iLAorCQkJY2hhbi0+Y2hhbm5lbCk7CisJCWdvdG8gZXJyX3RpbWVvdXQ7CisJfQorCisJLyogcmVhZCBkYXRhICovCisJdmFsID0gcmVhZGwocmVnX2NoYW5uZWwpICYgTVQ2NTc3X0FVWEFEQ19EQVRfTUFTSzsKKworCW11dGV4X3VubG9jaygmYWRjX2Rldi0+bG9jayk7CisKKwlyZXR1cm4gdmFsOworCitlcnJfdGltZW91dDoKKworCW11dGV4X3VubG9jaygmYWRjX2Rldi0+bG9jayk7CisKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworc3RhdGljIGludCBtdDY1NzdfYXV4YWRjX3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkJICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCQkgIGludCAqdmFsLAorCQkJCSAgaW50ICp2YWwyLAorCQkJCSAgbG9uZyBpbmZvKQoreworCXN3aXRjaCAoaW5mbykgeworCWNhc2UgSUlPX0NIQU5fSU5GT19QUk9DRVNTRUQ6CisJCSp2YWwgPSBtdDY1NzdfYXV4YWRjX3JlYWQoaW5kaW9fZGV2LCBjaGFuKTsKKwkJaWYgKCp2YWwgPCAwKSB7CisJCQlkZXZfZXJyKGluZGlvX2Rldi0+ZGV2LnBhcmVudCwKKwkJCQkiZmFpbGVkIHRvIHNhbXBsZSBkYXRhIG9uIGNoYW5uZWxbJWRdXG4iLAorCQkJCWNoYW4tPmNoYW5uZWwpOworCQkJcmV0dXJuICp2YWw7CisJCX0KKwkJcmV0dXJuIElJT19WQUxfSU5UOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIG10NjU3N19hdXhhZGNfaW5mbyA9IHsKKwkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorCS5yZWFkX3JhdyA9ICZtdDY1NzdfYXV4YWRjX3JlYWRfcmF3LAorfTsKKworc3RhdGljIGludCBtdDY1NzdfYXV4YWRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG10NjU3N19hdXhhZGNfZGV2aWNlICphZGNfZGV2OworCXVuc2lnbmVkIGxvbmcgYWRjX2Nsa19yYXRlOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJaW50IHJldDsKKworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmFkY19kZXYpKTsKKwlpZiAoIWluZGlvX2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlhZGNfZGV2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCWluZGlvX2Rldi0+bmFtZSA9IGRldl9uYW1lKCZwZGV2LT5kZXYpOworCWluZGlvX2Rldi0+aW5mbyA9ICZtdDY1NzdfYXV4YWRjX2luZm87CisJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBtdDY1NzdfYXV4YWRjX2lpb19jaGFubmVsczsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUobXQ2NTc3X2F1eGFkY19paW9fY2hhbm5lbHMpOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlhZGNfZGV2LT5yZWdfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIoYWRjX2Rldi0+cmVnX2Jhc2UpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgYXV4YWRjIGJhc2UgYWRkcmVzc1xuIik7CisJCXJldHVybiBQVFJfRVJSKGFkY19kZXYtPnJlZ19iYXNlKTsKKwl9CisKKwlhZGNfZGV2LT5hZGNfY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJtYWluIik7CisJaWYgKElTX0VSUihhZGNfZGV2LT5hZGNfY2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGF1eGFkYyBjbG9ja1xuIik7CisJCXJldHVybiBQVFJfRVJSKGFkY19kZXYtPmFkY19jbGspOworCX0KKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShhZGNfZGV2LT5hZGNfY2xrKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBlbmFibGUgYXV4YWRjIGNsb2NrXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlhZGNfY2xrX3JhdGUgPSBjbGtfZ2V0X3JhdGUoYWRjX2Rldi0+YWRjX2Nsayk7CisJaWYgKCFhZGNfY2xrX3JhdGUpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibnVsbCBjbG9jayByYXRlXG4iKTsKKwkJZ290byBlcnJfZGlzYWJsZV9jbGs7CisJfQorCisJbXV0ZXhfaW5pdCgmYWRjX2Rldi0+bG9jayk7CisKKwltdDY1NzdfYXV4YWRjX21vZF9yZWcoYWRjX2Rldi0+cmVnX2Jhc2UgKyBNVDY1NzdfQVVYQURDX01JU0MsCisJCQkgICAgICBNVDY1NzdfQVVYQURDX1BETl9FTiwgMCk7CisJbWRlbGF5KE1UNjU3N19BVVhBRENfUE9XRVJfUkVBRFlfTVMpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaW5kaW9fZGV2KTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgaWlvIGRldmljZVxuIik7CisJCWdvdG8gZXJyX3Bvd2VyX29mZjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX3Bvd2VyX29mZjoKKwltdDY1NzdfYXV4YWRjX21vZF9yZWcoYWRjX2Rldi0+cmVnX2Jhc2UgKyBNVDY1NzdfQVVYQURDX01JU0MsCisJCQkgICAgICAwLCBNVDY1NzdfQVVYQURDX1BETl9FTik7CitlcnJfZGlzYWJsZV9jbGs6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGFkY19kZXYtPmFkY19jbGspOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXQ2NTc3X2F1eGFkY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IG10NjU3N19hdXhhZGNfZGV2aWNlICphZGNfZGV2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCisJbXQ2NTc3X2F1eGFkY19tb2RfcmVnKGFkY19kZXYtPnJlZ19iYXNlICsgTVQ2NTc3X0FVWEFEQ19NSVNDLAorCQkJICAgICAgMCwgTVQ2NTc3X0FVWEFEQ19QRE5fRU4pOworCisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGFkY19kZXYtPmFkY19jbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG10NjU3N19hdXhhZGNfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIm1lZGlhdGVrLG10MjcwMS1hdXhhZGMiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAibWVkaWF0ZWssbXQ4MTczLWF1eGFkYyIsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXQ2NTc3X2F1eGFkY19vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG10NjU3N19hdXhhZGNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lICAgPSAibXQ2NTc3LWF1eGFkYyIsCisJCS5vZl9tYXRjaF90YWJsZSA9IG10NjU3N19hdXhhZGNfb2ZfbWF0Y2gsCisJfSwKKwkucHJvYmUJPSBtdDY1NzdfYXV4YWRjX3Byb2JlLAorCS5yZW1vdmUJPSBtdDY1NzdfYXV4YWRjX3JlbW92ZSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG10NjU3N19hdXhhZGNfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiWmhpeW9uZyBUYW8gPHpoaXlvbmcudGFvQG1lZGlhdGVrLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTVRLIEFVWEFEQyBEZXZpY2UgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvbmF1NzgwMi5jIGIvZHJpdmVycy9paW8vYWRjL25hdTc4MDIuYwppbmRleCBkYjliODI5Li4wOGY0NDY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvbmF1NzgwMi5jCisrKyBiL2RyaXZlcnMvaWlvL2FkYy9uYXU3ODAyLmMKQEAgLTE5Nyw3ICsxOTcsNyBAQAogCWlmIChzdC0+Y29udmVyc2lvbl9jb3VudCA8IE5BVTc4MDJfTUlOX0NPTlZFUlNJT05TKQogCQlzdC0+Y29udmVyc2lvbl9jb3VudCsrOwogCWlmIChzdC0+Y29udmVyc2lvbl9jb3VudCA+PSBOQVU3ODAyX01JTl9DT05WRVJTSU9OUykKLQkJY29tcGxldGVfYWxsKCZzdC0+dmFsdWVfb2spOworCQljb21wbGV0ZSgmc3QtPnZhbHVlX29rKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9yb2NrY2hpcF9zYXJhZGMuYyBiL2RyaXZlcnMvaWlvL2FkYy9yb2NrY2hpcF9zYXJhZGMuYwppbmRleCBmOWFkNmMyLi44NWQ3MDEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvcm9ja2NoaXBfc2FyYWRjLmMKKysrIGIvZHJpdmVycy9paW8vYWRjL3JvY2tjaGlwX3NhcmFkYy5jCkBAIC0yMSw2ICsyMSw4IEBACiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CiAKQEAgLTUzLDYgKzU1LDcgQEAKIAlzdHJ1Y3QgY2xrCQkqY2xrOwogCXN0cnVjdCBjb21wbGV0aW9uCWNvbXBsZXRpb247CiAJc3RydWN0IHJlZ3VsYXRvcgkqdnJlZjsKKwlzdHJ1Y3QgcmVzZXRfY29udHJvbAkqcmVzZXQ7CiAJY29uc3Qgc3RydWN0IHJvY2tjaGlwX3NhcmFkY19kYXRhICpkYXRhOwogCXUxNgkJCWxhc3RfdmFsOwogfTsKQEAgLTE5MCw2ICsxOTMsMTYgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCByb2NrY2hpcF9zYXJhZGNfbWF0Y2gpOwogCisvKioKKyAqIFJlc2V0IFNBUkFEQyBDb250cm9sbGVyLgorICovCitzdGF0aWMgdm9pZCByb2NrY2hpcF9zYXJhZGNfcmVzZXRfY29udHJvbGxlcihzdHJ1Y3QgcmVzZXRfY29udHJvbCAqcmVzZXQpCit7CisJcmVzZXRfY29udHJvbF9hc3NlcnQocmVzZXQpOworCXVzbGVlcF9yYW5nZSgxMCwgMjApOworCXJlc2V0X2NvbnRyb2xfZGVhc3NlcnQocmVzZXQpOworfQorCiBzdGF0aWMgaW50IHJvY2tjaGlwX3NhcmFkY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCByb2NrY2hpcF9zYXJhZGMgKmluZm8gPSBOVUxMOwpAQCAtMjE4LDYgKzIzMSwyMCBAQAogCWlmIChJU19FUlIoaW5mby0+cmVncykpCiAJCXJldHVybiBQVFJfRVJSKGluZm8tPnJlZ3MpOwogCisJLyoKKwkgKiBUaGUgcmVzZXQgc2hvdWxkIGJlIGFuIG9wdGlvbmFsIHByb3BlcnR5LCBhcyBpdCBzaG91bGQgd29yaworCSAqIHdpdGggb2xkIGRldmljZXRyZWVzIGFzIHdlbGwKKwkgKi8KKwlpbmZvLT5yZXNldCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoJnBkZXYtPmRldiwgInNhcmFkYy1hcGIiKTsKKwlpZiAoSVNfRVJSKGluZm8tPnJlc2V0KSkgeworCQlyZXQgPSBQVFJfRVJSKGluZm8tPnJlc2V0KTsKKwkJaWYgKHJldCAhPSAtRU5PRU5UKQorCQkJcmV0dXJuIHJldDsKKworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJubyByZXNldCBjb250cm9sIGZvdW5kXG4iKTsKKwkJaW5mby0+cmVzZXQgPSBOVUxMOworCX0KKwogCWluaXRfY29tcGxldGlvbigmaW5mby0+Y29tcGxldGlvbik7CiAKIAlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwpAQCAtMjUyLDYgKzI3OSw5IEBACiAJCXJldHVybiBQVFJfRVJSKGluZm8tPnZyZWYpOwogCX0KIAorCWlmIChpbmZvLT5yZXNldCkKKwkJcm9ja2NoaXBfc2FyYWRjX3Jlc2V0X2NvbnRyb2xsZXIoaW5mby0+cmVzZXQpOworCiAJLyoKIAkgKiBVc2UgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgY29udmVydGVyIGNsb2NrLgogCSAqIFRoaXMgbWF5IGJlY29tZSB1c2VyLWNvbmZpZ3VyYWJsZSBpbiB0aGUgZnV0dXJlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL3N0eDEwNC5jIGIvZHJpdmVycy9paW8vYWRjL3N0eDEwNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMzY0NTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9hZGMvc3R4MTA0LmMKQEAgLTAsMCArMSwzODAgQEAKKy8qCisgKiBJSU8gZHJpdmVyIGZvciB0aGUgQXBleCBFbWJlZGRlZCBTeXN0ZW1zIFNUWDEwNAorICogQ29weXJpZ2h0IChDKSAyMDE2IFdpbGxpYW0gQnJlYXRoaXR0IEdyYXkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pc2EuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNkZWZpbmUgU1RYMTA0X09VVF9DSEFOKGNoYW4pIHsJCQkJXAorCS50eXBlID0gSUlPX1ZPTFRBR0UsCQkJCVwKKwkuY2hhbm5lbCA9IGNoYW4sCQkJCVwKKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwJXAorCS5pbmRleGVkID0gMSwJCQkJCVwKKwkub3V0cHV0ID0gMQkJCQkJXAorfQorI2RlZmluZSBTVFgxMDRfSU5fQ0hBTihjaGFuLCBkaWZmKSB7CQkJCQlcCisJLnR5cGUgPSBJSU9fVk9MVEFHRSwJCQkJCQlcCisJLmNoYW5uZWwgPSBjaGFuLAkJCQkJCVwKKwkuY2hhbm5lbDIgPSBjaGFuLAkJCQkJCVwKKwkuaW5mb19tYXNrX3NoYXJlZF9ieV90eXBlID0gQklUKElJT19DSEFOX0lORk9fSEFSRFdBUkVHQUlOKSB8CVwKKwkJQklUKElJT19DSEFOX0lORk9fT0ZGU0VUKSB8IEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSwJXAorCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLAkJCVwKKwkuaW5kZXhlZCA9IDEsCQkJCQkJCVwKKwkuZGlmZmVyZW50aWFsID0gZGlmZgkJCQkJCVwKK30KKworI2RlZmluZSBTVFgxMDRfTlVNX09VVF9DSEFOIDIKKworI2RlZmluZSBTVFgxMDRfRVhURU5UIDE2CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYmFzZVttYXhfbnVtX2lzYV9kZXYoU1RYMTA0X0VYVEVOVCldOworc3RhdGljIHVuc2lnbmVkIGludCBudW1fc3R4MTA0OworbW9kdWxlX3BhcmFtX2FycmF5KGJhc2UsIHVpbnQsICZudW1fc3R4MTA0LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYmFzZSwgIkFwZXggRW1iZWRkZWQgU3lzdGVtcyBTVFgxMDQgYmFzZSBhZGRyZXNzZXMiKTsKKworLyoqCisgKiBzdHJ1Y3Qgc3R4MTA0X2lpbyAtIElJTyBkZXZpY2UgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQorICogQGNoYW5fb3V0X3N0YXRlczoJY2hhbm5lbHMnIG91dHB1dCBzdGF0ZXMKKyAqIEBiYXNlOgkJYmFzZSBwb3J0IGFkZHJlc3Mgb2YgdGhlIElJTyBkZXZpY2UKKyAqLworc3RydWN0IHN0eDEwNF9paW8geworCXVuc2lnbmVkIGludCBjaGFuX291dF9zdGF0ZXNbU1RYMTA0X05VTV9PVVRfQ0hBTl07CisJdW5zaWduZWQgaW50IGJhc2U7Cit9OworCisvKioKKyAqIHN0cnVjdCBzdHgxMDRfZ3BpbyAtIEdQSU8gZGV2aWNlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKKyAqIEBjaGlwOglpbnN0YW5jZSBvZiB0aGUgZ3Bpb19jaGlwCisgKiBAbG9jazoJc3luY2hyb25pemF0aW9uIGxvY2sgdG8gcHJldmVudCBJL08gcmFjZSBjb25kaXRpb25zCisgKiBAYmFzZToJYmFzZSBwb3J0IGFkZHJlc3Mgb2YgdGhlIEdQSU8gZGV2aWNlCisgKiBAb3V0X3N0YXRlOglvdXRwdXQgYml0cyBzdGF0ZQorICovCitzdHJ1Y3Qgc3R4MTA0X2dwaW8geworCXN0cnVjdCBncGlvX2NoaXAgY2hpcDsKKwlzcGlubG9ja190IGxvY2s7CisJdW5zaWduZWQgaW50IGJhc2U7CisJdW5zaWduZWQgaW50IG91dF9zdGF0ZTsKK307CisKKy8qKgorICogc3RydWN0IHN0eDEwNF9kZXYgLSBTVFgxMDQgZGV2aWNlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKKyAqIEBpbmRpb19kZXY6CUlJTyBkZXZpY2UKKyAqIEBjaGlwOglpbnN0YW5jZSBvZiB0aGUgZ3Bpb19jaGlwCisgKi8KK3N0cnVjdCBzdHgxMDRfZGV2IHsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXN0cnVjdCBncGlvX2NoaXAgKmNoaXA7Cit9OworCitzdGF0aWMgaW50IHN0eDEwNF9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCXN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLCBpbnQgKnZhbCwgaW50ICp2YWwyLCBsb25nIG1hc2spCit7CisJc3RydWN0IHN0eDEwNF9paW8gKmNvbnN0IHByaXYgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXVuc2lnbmVkIGludCBhZGNfY29uZmlnOworCWludCBhZGJ1OworCWludCBnYWluOworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX0hBUkRXQVJFR0FJTjoKKwkJLyogZ2V0IGdhaW4gY29uZmlndXJhdGlvbiAqLworCQlhZGNfY29uZmlnID0gaW5iKHByaXYtPmJhc2UgKyAxMSk7CisJCWdhaW4gPSBhZGNfY29uZmlnICYgMHgzOworCisJCSp2YWwgPSAxIDw8IGdhaW47CisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwljYXNlIElJT19DSEFOX0lORk9fUkFXOgorCQlpZiAoY2hhbi0+b3V0cHV0KSB7CisJCQkqdmFsID0gcHJpdi0+Y2hhbl9vdXRfc3RhdGVzW2NoYW4tPmNoYW5uZWxdOworCQkJcmV0dXJuIElJT19WQUxfSU5UOworCQl9CisKKwkJLyogc2VsZWN0IEFEQyBjaGFubmVsICovCisJCW91dGIoY2hhbi0+Y2hhbm5lbCB8IChjaGFuLT5jaGFubmVsIDw8IDQpLCBwcml2LT5iYXNlICsgMik7CisKKwkJLyogdHJpZ2dlciBBREMgc2FtcGxlIGNhcHR1cmUgYW5kIHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKwkJb3V0YigwLCBwcml2LT5iYXNlKTsKKwkJd2hpbGUgKGluYihwcml2LT5iYXNlICsgOCkgJiBCSVQoNykpOworCisJCSp2YWwgPSBpbncocHJpdi0+YmFzZSk7CisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwljYXNlIElJT19DSEFOX0lORk9fT0ZGU0VUOgorCQkvKiBnZXQgQURDIGJpcG9sYXIvdW5pcG9sYXIgY29uZmlndXJhdGlvbiAqLworCQlhZGNfY29uZmlnID0gaW5iKHByaXYtPmJhc2UgKyAxMSk7CisJCWFkYnUgPSAhKGFkY19jb25maWcgJiBCSVQoMikpOworCisJCSp2YWwgPSAtMzI3NjggKiBhZGJ1OworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1NDQUxFOgorCQkvKiBnZXQgQURDIGJpcG9sYXIvdW5pcG9sYXIgYW5kIGdhaW4gY29uZmlndXJhdGlvbiAqLworCQlhZGNfY29uZmlnID0gaW5iKHByaXYtPmJhc2UgKyAxMSk7CisJCWFkYnUgPSAhKGFkY19jb25maWcgJiBCSVQoMikpOworCQlnYWluID0gYWRjX2NvbmZpZyAmIDB4MzsKKworCQkqdmFsID0gNTsKKwkJKnZhbDIgPSAxNSAtIGFkYnUgKyBnYWluOworCQlyZXR1cm4gSUlPX1ZBTF9GUkFDVElPTkFMX0xPRzI7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgc3R4MTA0X3dyaXRlX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCXN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLCBpbnQgdmFsLCBpbnQgdmFsMiwgbG9uZyBtYXNrKQoreworCXN0cnVjdCBzdHgxMDRfaWlvICpjb25zdCBwcml2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXN3aXRjaCAobWFzaykgeworCWNhc2UgSUlPX0NIQU5fSU5GT19IQVJEV0FSRUdBSU46CisJCS8qIE9ubHkgZm91ciBnYWluIHN0YXRlcyAoeDEsIHgyLCB4NCwgeDgpICovCisJCXN3aXRjaCAodmFsKSB7CisJCWNhc2UgMToKKwkJCW91dGIoMCwgcHJpdi0+YmFzZSArIDExKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlvdXRiKDEsIHByaXYtPmJhc2UgKyAxMSk7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJb3V0YigyLCBwcml2LT5iYXNlICsgMTEpOworCQkJYnJlYWs7CisJCWNhc2UgODoKKwkJCW91dGIoMywgcHJpdi0+YmFzZSArIDExKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlyZXR1cm4gMDsKKwljYXNlIElJT19DSEFOX0lORk9fUkFXOgorCQlpZiAoY2hhbi0+b3V0cHV0KSB7CisJCQkvKiBEQUMgY2FuIG9ubHkgYWNjZXB0IHVwIHRvIGEgMTYtYml0IHZhbHVlICovCisJCQlpZiAoKHVuc2lnbmVkIGludCl2YWwgPiA2NTUzNSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJcHJpdi0+Y2hhbl9vdXRfc3RhdGVzW2NoYW4tPmNoYW5uZWxdID0gdmFsOworCQkJb3V0dyh2YWwsIHByaXYtPmJhc2UgKyA0ICsgMiAqIGNoYW4tPmNoYW5uZWwpOworCisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBzdHgxMDRfaW5mbyA9IHsKKwkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorCS5yZWFkX3JhdyA9IHN0eDEwNF9yZWFkX3JhdywKKwkud3JpdGVfcmF3ID0gc3R4MTA0X3dyaXRlX3JhdworfTsKKworLyogc2luZ2xlLWVuZGVkIGlucHV0IGNoYW5uZWxzIGNvbmZpZ3VyYXRpb24gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBzdHgxMDRfY2hhbm5lbHNfc2luZ1tdID0geworCVNUWDEwNF9PVVRfQ0hBTigwKSwgU1RYMTA0X09VVF9DSEFOKDEpLAorCVNUWDEwNF9JTl9DSEFOKDAsIDApLCBTVFgxMDRfSU5fQ0hBTigxLCAwKSwgU1RYMTA0X0lOX0NIQU4oMiwgMCksCisJU1RYMTA0X0lOX0NIQU4oMywgMCksIFNUWDEwNF9JTl9DSEFOKDQsIDApLCBTVFgxMDRfSU5fQ0hBTig1LCAwKSwKKwlTVFgxMDRfSU5fQ0hBTig2LCAwKSwgU1RYMTA0X0lOX0NIQU4oNywgMCksIFNUWDEwNF9JTl9DSEFOKDgsIDApLAorCVNUWDEwNF9JTl9DSEFOKDksIDApLCBTVFgxMDRfSU5fQ0hBTigxMCwgMCksIFNUWDEwNF9JTl9DSEFOKDExLCAwKSwKKwlTVFgxMDRfSU5fQ0hBTigxMiwgMCksIFNUWDEwNF9JTl9DSEFOKDEzLCAwKSwgU1RYMTA0X0lOX0NIQU4oMTQsIDApLAorCVNUWDEwNF9JTl9DSEFOKDE1LCAwKQorfTsKKy8qIGRpZmZlcmVudGlhbCBpbnB1dCBjaGFubmVscyBjb25maWd1cmF0aW9uICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgc3R4MTA0X2NoYW5uZWxzX2RpZmZbXSA9IHsKKwlTVFgxMDRfT1VUX0NIQU4oMCksIFNUWDEwNF9PVVRfQ0hBTigxKSwKKwlTVFgxMDRfSU5fQ0hBTigwLCAxKSwgU1RYMTA0X0lOX0NIQU4oMSwgMSksIFNUWDEwNF9JTl9DSEFOKDIsIDEpLAorCVNUWDEwNF9JTl9DSEFOKDMsIDEpLCBTVFgxMDRfSU5fQ0hBTig0LCAxKSwgU1RYMTA0X0lOX0NIQU4oNSwgMSksCisJU1RYMTA0X0lOX0NIQU4oNiwgMSksIFNUWDEwNF9JTl9DSEFOKDcsIDEpCit9OworCitzdGF0aWMgaW50IHN0eDEwNF9ncGlvX2dldF9kaXJlY3Rpb24oc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCS8qIEdQSU8gMC0zIGFyZSBpbnB1dCBvbmx5LCB3aGlsZSB0aGUgcmVzdCBhcmUgb3V0cHV0IG9ubHkgKi8KKwlpZiAob2Zmc2V0IDwgNCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdHgxMDRfZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCWlmIChvZmZzZXQgPj0gNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdHgxMDRfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJdW5zaWduZWQgaW50IG9mZnNldCwgaW50IHZhbHVlKQoreworCWlmIChvZmZzZXQgPCA0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNoaXAtPnNldChjaGlwLCBvZmZzZXQsIHZhbHVlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdHgxMDRfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3Qgc3R4MTA0X2dwaW8gKmNvbnN0IHN0eDEwNGdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKworCWlmIChvZmZzZXQgPj0gNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gISEoaW5iKHN0eDEwNGdwaW8tPmJhc2UpICYgQklUKG9mZnNldCkpOworfQorCitzdGF0aWMgdm9pZCBzdHgxMDRfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IG9mZnNldCwKKwlpbnQgdmFsdWUpCit7CisJc3RydWN0IHN0eDEwNF9ncGlvICpjb25zdCBzdHgxMDRncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisJY29uc3QgdW5zaWduZWQgaW50IG1hc2sgPSBCSVQob2Zmc2V0KSA+PiA0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob2Zmc2V0IDwgNCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN0eDEwNGdwaW8tPmxvY2ssIGZsYWdzKTsKKworCWlmICh2YWx1ZSkKKwkJc3R4MTA0Z3Bpby0+b3V0X3N0YXRlIHw9IG1hc2s7CisJZWxzZQorCQlzdHgxMDRncGlvLT5vdXRfc3RhdGUgJj0gfm1hc2s7CisKKwlvdXRiKHN0eDEwNGdwaW8tPm91dF9zdGF0ZSwgc3R4MTA0Z3Bpby0+YmFzZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdHgxMDRncGlvLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgc3R4MTA0X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGlkKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJc3RydWN0IHN0eDEwNF9paW8gKnByaXY7CisJc3RydWN0IHN0eDEwNF9ncGlvICpzdHgxMDRncGlvOworCXN0cnVjdCBzdHgxMDRfZGV2ICpzdHgxMDRkZXY7CisJaW50IGVycjsKKworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYyhkZXYsIHNpemVvZigqcHJpdikpOworCWlmICghaW5kaW9fZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0eDEwNGdwaW8gPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnN0eDEwNGdwaW8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0eDEwNGdwaW8pCisJCXJldHVybiAtRU5PTUVNOworCisJc3R4MTA0ZGV2ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpzdHgxMDRkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0eDEwNGRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoIWRldm1fcmVxdWVzdF9yZWdpb24oZGV2LCBiYXNlW2lkXSwgU1RYMTA0X0VYVEVOVCwKKwkJZGV2X25hbWUoZGV2KSkpIHsKKwkJZGV2X2VycihkZXYsICJVbmFibGUgdG8gbG9jayBwb3J0IGFkZHJlc3NlcyAoMHglWC0weCVYKVxuIiwKKwkJCWJhc2VbaWRdLCBiYXNlW2lkXSArIFNUWDEwNF9FWFRFTlQpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWluZGlvX2Rldi0+aW5mbyA9ICZzdHgxMDRfaW5mbzsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwkvKiBkZXRlcm1pbmUgaWYgZGlmZmVyZW50aWFsIGlucHV0cyAqLworCWlmIChpbmIoYmFzZVtpZF0gKyA4KSAmIEJJVCg1KSkgeworCQlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUoc3R4MTA0X2NoYW5uZWxzX2RpZmYpOworCQlpbmRpb19kZXYtPmNoYW5uZWxzID0gc3R4MTA0X2NoYW5uZWxzX2RpZmY7CisJfSBlbHNlIHsKKwkJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKHN0eDEwNF9jaGFubmVsc19zaW5nKTsKKwkJaW5kaW9fZGV2LT5jaGFubmVscyA9IHN0eDEwNF9jaGFubmVsc19zaW5nOworCX0KKworCWluZGlvX2Rldi0+bmFtZSA9IGRldl9uYW1lKGRldik7CisKKwlwcml2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlwcml2LT5iYXNlID0gYmFzZVtpZF07CisKKwkvKiBjb25maWd1cmUgZGV2aWNlIGZvciBzb2Z0d2FyZSB0cmlnZ2VyIG9wZXJhdGlvbiAqLworCW91dGIoMCwgYmFzZVtpZF0gKyA5KTsKKworCS8qIGluaXRpYWxpemUgZ2FpbiBzZXR0aW5nIHRvIHgxICovCisJb3V0YigwLCBiYXNlW2lkXSArIDExKTsKKworCS8qIGluaXRpYWxpemUgREFDIG91dHB1dCB0byAwViAqLworCW91dHcoMCwgYmFzZVtpZF0gKyA0KTsKKwlvdXR3KDAsIGJhc2VbaWRdICsgNik7CisKKwlzdHgxMDRncGlvLT5jaGlwLmxhYmVsID0gZGV2X25hbWUoZGV2KTsKKwlzdHgxMDRncGlvLT5jaGlwLnBhcmVudCA9IGRldjsKKwlzdHgxMDRncGlvLT5jaGlwLm93bmVyID0gVEhJU19NT0RVTEU7CisJc3R4MTA0Z3Bpby0+Y2hpcC5iYXNlID0gLTE7CisJc3R4MTA0Z3Bpby0+Y2hpcC5uZ3BpbyA9IDg7CisJc3R4MTA0Z3Bpby0+Y2hpcC5nZXRfZGlyZWN0aW9uID0gc3R4MTA0X2dwaW9fZ2V0X2RpcmVjdGlvbjsKKwlzdHgxMDRncGlvLT5jaGlwLmRpcmVjdGlvbl9pbnB1dCA9IHN0eDEwNF9ncGlvX2RpcmVjdGlvbl9pbnB1dDsKKwlzdHgxMDRncGlvLT5jaGlwLmRpcmVjdGlvbl9vdXRwdXQgPSBzdHgxMDRfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0OworCXN0eDEwNGdwaW8tPmNoaXAuZ2V0ID0gc3R4MTA0X2dwaW9fZ2V0OworCXN0eDEwNGdwaW8tPmNoaXAuc2V0ID0gc3R4MTA0X2dwaW9fc2V0OworCXN0eDEwNGdwaW8tPmJhc2UgPSBiYXNlW2lkXSArIDM7CisJc3R4MTA0Z3Bpby0+b3V0X3N0YXRlID0gMHgwOworCisJc3Bpbl9sb2NrX2luaXQoJnN0eDEwNGdwaW8tPmxvY2spOworCisJc3R4MTA0ZGV2LT5pbmRpb19kZXYgPSBpbmRpb19kZXY7CisJc3R4MTA0ZGV2LT5jaGlwID0gJnN0eDEwNGdwaW8tPmNoaXA7CisJZGV2X3NldF9kcnZkYXRhKGRldiwgc3R4MTA0ZGV2KTsKKworCWVyciA9IGdwaW9jaGlwX2FkZF9kYXRhKCZzdHgxMDRncGlvLT5jaGlwLCBzdHgxMDRncGlvKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoZGV2LCAiR1BJTyByZWdpc3RlcmluZyBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKGRldiwgIklJTyBkZXZpY2UgcmVnaXN0ZXJpbmcgZmFpbGVkICglZClcbiIsIGVycik7CisJCWdwaW9jaGlwX3JlbW92ZSgmc3R4MTA0Z3Bpby0+Y2hpcCk7CisJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3R4MTA0X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBpZCkKK3sKKwlzdHJ1Y3Qgc3R4MTA0X2RldiAqY29uc3Qgc3R4MTA0ZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3R4MTA0ZGV2LT5pbmRpb19kZXYpOworCWdwaW9jaGlwX3JlbW92ZShzdHgxMDRkZXYtPmNoaXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXNhX2RyaXZlciBzdHgxMDRfZHJpdmVyID0geworCS5wcm9iZSA9IHN0eDEwNF9wcm9iZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJzdHgxMDQiCisJfSwKKwkucmVtb3ZlID0gc3R4MTA0X3JlbW92ZQorfTsKKworbW9kdWxlX2lzYV9kcml2ZXIoc3R4MTA0X2RyaXZlciwgbnVtX3N0eDEwNCk7CisKK01PRFVMRV9BVVRIT1IoIldpbGxpYW0gQnJlYXRoaXR0IEdyYXkgPHZpbGhlbG0uZ3JheUBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFwZXggRW1iZWRkZWQgU3lzdGVtcyBTVFgxMDQgSUlPIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL3RpLWFkYzEyMTM4LmMgYi9kcml2ZXJzL2lpby9hZGMvdGktYWRjMTIxMzguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzJmMDNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vYWRjL3RpLWFkYzEyMTM4LmMKQEAgLTAsMCArMSw1NTIgQEAKKy8qCisgKiBBREMxMjEzMC9BREMxMjEzMi9BREMxMjEzOCAxMi1iaXQgcGx1cyBzaWduIEFEQyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQWtpbm9idSBNaXRhIDxha2lub2J1Lm1pdGFAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluCisgKiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogRGF0YXNoZWV0OiBodHRwOi8vd3d3LnRpLmNvbS9saXQvZHMvc3ltbGluay9hZGMxMjEzOC5wZGYKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2J1ZmZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXJlZF9idWZmZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcl9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorCisjZGVmaW5lIEFEQzEyMTM4X01PREVfQVVUT19DQUwJCQkweDA4CisjZGVmaW5lIEFEQzEyMTM4X01PREVfUkVBRF9TVEFUVVMJCTB4MGMKKyNkZWZpbmUgQURDMTIxMzhfTU9ERV9BQ1FVSVNJVElPTl9USU1FXzYJMHgwZQorI2RlZmluZSBBREMxMjEzOF9NT0RFX0FDUVVJU0lUSU9OX1RJTUVfMTAJMHg0ZQorI2RlZmluZSBBREMxMjEzOF9NT0RFX0FDUVVJU0lUSU9OX1RJTUVfMTgJMHg4ZQorI2RlZmluZSBBREMxMjEzOF9NT0RFX0FDUVVJU0lUSU9OX1RJTUVfMzQJMHhjZQorCisjZGVmaW5lIEFEQzEyMTM4X1NUQVRVU19DQUwJCQlCSVQoNikKKworZW51bSB7CisJYWRjMTIxMzAsCisJYWRjMTIxMzIsCisJYWRjMTIxMzgsCit9OworCitzdHJ1Y3QgYWRjMTIxMzggeworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGk7CisJdW5zaWduZWQgaW50IGlkOworCS8qIGNvbnZlcnNpb24gY2xvY2sgKi8KKwlzdHJ1Y3QgY2xrICpjY2xrOworCS8qIHBvc2l0aXZlIGFuYWxvZyB2b2x0YWdlIHJlZmVyZW5jZSAqLworCXN0cnVjdCByZWd1bGF0b3IgKnZyZWZfcDsKKwkvKiBuZWdhdGl2ZSBhbmFsb2cgdm9sdGFnZSByZWZlcmVuY2UgKi8KKwlzdHJ1Y3QgcmVndWxhdG9yICp2cmVmX247CisJc3RydWN0IG11dGV4IGxvY2s7CisJc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGU7CisJLyogVGhlIG51bWJlciBvZiBjY2xrIHBlcmlvZHMgZm9yIHRoZSBTL0gncyBhY3F1aXNpdGlvbiB0aW1lICovCisJdW5zaWduZWQgaW50IGFjcXVpc2l0aW9uX3RpbWU7CisKKwl1OCB0eF9idWZbMl0gX19fX2NhY2hlbGluZV9hbGlnbmVkOworCXU4IHJ4X2J1ZlsyXTsKK307CisKKyNkZWZpbmUgQURDMTIxMzhfVk9MVEFHRV9DSEFOTkVMKGNoYW4pCQkJCQlcCisJewkJCQkJCQkJXAorCQkudHlwZSA9IElJT19WT0xUQUdFLAkJCQkJXAorCQkuaW5kZXhlZCA9IDEsCQkJCQkJXAorCQkuY2hhbm5lbCA9IGNoYW4sCQkJCQlcCisJCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLAkJXAorCQkuaW5mb19tYXNrX3NoYXJlZF9ieV90eXBlID0gQklUKElJT19DSEFOX0lORk9fU0NBTEUpCVwKKwkJCQkJfCBCSVQoSUlPX0NIQU5fSU5GT19PRkZTRVQpLAlcCisJCS5zY2FuX2luZGV4ID0gY2hhbiwJCQkJCVwKKwkJLnNjYW5fdHlwZSA9IHsJCQkJCQlcCisJCQkuc2lnbiA9ICdzJywJCQkJCVwKKwkJCS5yZWFsYml0cyA9IDEzLAkJCQkJXAorCQkJLnN0b3JhZ2ViaXRzID0gMTYsCQkJCVwKKwkJCS5zaGlmdCA9IDMsCQkJCQlcCisJCQkuZW5kaWFubmVzcyA9IElJT19CRSwJCQkJXAorCQl9LAkJCQkJCQlcCisJfQorCisjZGVmaW5lIEFEQzEyMTM4X1ZPTFRBR0VfQ0hBTk5FTF9ESUZGKGNoYW4xLCBjaGFuMiwgc2kpCQkJXAorCXsJCQkJCQkJCVwKKwkJLnR5cGUgPSBJSU9fVk9MVEFHRSwJCQkJCVwKKwkJLmluZGV4ZWQgPSAxLAkJCQkJCVwKKwkJLmNoYW5uZWwgPSAoY2hhbjEpLAkJCQkJXAorCQkuY2hhbm5lbDIgPSAoY2hhbjIpLAkJCQkJXAorCQkuZGlmZmVyZW50aWFsID0gMSwJCQkJCVwKKwkJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVyksCQlcCisJCS5pbmZvX21hc2tfc2hhcmVkX2J5X3R5cGUgPSBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSkJXAorCQkJCQl8IEJJVChJSU9fQ0hBTl9JTkZPX09GRlNFVCksCVwKKwkJLnNjYW5faW5kZXggPSBzaSwJCQkJCVwKKwkJLnNjYW5fdHlwZSA9IHsJCQkJCQlcCisJCQkuc2lnbiA9ICdzJywJCQkJCVwKKwkJCS5yZWFsYml0cyA9IDEzLAkJCQkJXAorCQkJLnN0b3JhZ2ViaXRzID0gMTYsCQkJCVwKKwkJCS5zaGlmdCA9IDMsCQkJCQlcCisJCQkuZW5kaWFubmVzcyA9IElJT19CRSwJCQkJXAorCQl9LAkJCQkJCQlcCisJfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgYWRjMTIxMzJfY2hhbm5lbHNbXSA9IHsKKwlBREMxMjEzOF9WT0xUQUdFX0NIQU5ORUwoMCksCisJQURDMTIxMzhfVk9MVEFHRV9DSEFOTkVMKDEpLAorCUFEQzEyMTM4X1ZPTFRBR0VfQ0hBTk5FTF9ESUZGKDAsIDEsIDIpLAorCUFEQzEyMTM4X1ZPTFRBR0VfQ0hBTk5FTF9ESUZGKDEsIDAsIDMpLAorCUlJT19DSEFOX1NPRlRfVElNRVNUQU1QKDQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIGFkYzEyMTM4X2NoYW5uZWxzW10gPSB7CisJQURDMTIxMzhfVk9MVEFHRV9DSEFOTkVMKDApLAorCUFEQzEyMTM4X1ZPTFRBR0VfQ0hBTk5FTCgxKSwKKwlBREMxMjEzOF9WT0xUQUdFX0NIQU5ORUwoMiksCisJQURDMTIxMzhfVk9MVEFHRV9DSEFOTkVMKDMpLAorCUFEQzEyMTM4X1ZPTFRBR0VfQ0hBTk5FTCg0KSwKKwlBREMxMjEzOF9WT0xUQUdFX0NIQU5ORUwoNSksCisJQURDMTIxMzhfVk9MVEFHRV9DSEFOTkVMKDYpLAorCUFEQzEyMTM4X1ZPTFRBR0VfQ0hBTk5FTCg3KSwKKwlBREMxMjEzOF9WT0xUQUdFX0NIQU5ORUxfRElGRigwLCAxLCA4KSwKKwlBREMxMjEzOF9WT0xUQUdFX0NIQU5ORUxfRElGRigxLCAwLCA5KSwKKwlBREMxMjEzOF9WT0xUQUdFX0NIQU5ORUxfRElGRigyLCAzLCAxMCksCisJQURDMTIxMzhfVk9MVEFHRV9DSEFOTkVMX0RJRkYoMywgMiwgMTEpLAorCUFEQzEyMTM4X1ZPTFRBR0VfQ0hBTk5FTF9ESUZGKDQsIDUsIDEyKSwKKwlBREMxMjEzOF9WT0xUQUdFX0NIQU5ORUxfRElGRig1LCA0LCAxMyksCisJQURDMTIxMzhfVk9MVEFHRV9DSEFOTkVMX0RJRkYoNiwgNywgMTQpLAorCUFEQzEyMTM4X1ZPTFRBR0VfQ0hBTk5FTF9ESUZGKDcsIDYsIDE1KSwKKwlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCgxNiksCit9OworCitzdGF0aWMgaW50IGFkYzEyMTM4X21vZGVfcHJvZ3JhbW1pbmcoc3RydWN0IGFkYzEyMTM4ICphZGMsIHU4IG1vZGUsCisJCQkJICAgICB2b2lkICpyeF9idWYsIGludCBsZW4pCit7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyID0geworCQkudHhfYnVmID0gYWRjLT50eF9idWYsCisJCS5yeF9idWYgPSBhZGMtPnJ4X2J1ZiwKKwkJLmxlbiA9IGxlbiwKKwl9OworCWludCByZXQ7CisKKwkvKiBTa2lwIHVudXNlZCBiaXRzIGZvciBBREMxMjEzMCBhbmQgQURDMTIxMzIgKi8KKwlpZiAoYWRjLT5pZCAhPSBhZGMxMjEzOCkKKwkJbW9kZSA9IChtb2RlICYgMHhjMCkgfCAoKG1vZGUgJiAweDBmKSA8PCAyKTsKKworCWFkYy0+dHhfYnVmWzBdID0gbW9kZTsKKworCXJldCA9IHNwaV9zeW5jX3RyYW5zZmVyKGFkYy0+c3BpLCAmeGZlciwgMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW1lbWNweShyeF9idWYsIGFkYy0+cnhfYnVmLCBsZW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRjMTIxMzhfcmVhZF9zdGF0dXMoc3RydWN0IGFkYzEyMTM4ICphZGMpCit7CisJdTggcnhfYnVmWzJdOworCWludCByZXQ7CisKKwlyZXQgPSBhZGMxMjEzOF9tb2RlX3Byb2dyYW1taW5nKGFkYywgQURDMTIxMzhfTU9ERV9SRUFEX1NUQVRVUywKKwkJCQkJcnhfYnVmLCAyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIChyeF9idWZbMF0gPDwgMSkgfCAocnhfYnVmWzFdID4+IDcpOworfQorCitzdGF0aWMgaW50IF9fYWRjMTIxMzhfc3RhcnRfY29udihzdHJ1Y3QgYWRjMTIxMzggKmFkYywKKwkJCQkgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW5uZWwsCisJCQkJIHZvaWQgKmRhdGEsIGludCBsZW4pCisKK3sKKwljb25zdCB1OCBjaF90b19tdXhbXSA9IHsgMCwgNCwgMSwgNSwgMiwgNiwgMywgNyB9OworCXU4IG1vZGUgPSAoY2hfdG9fbXV4W2NoYW5uZWwtPmNoYW5uZWxdIDw8IDQpIHwKKwkJICAoY2hhbm5lbC0+ZGlmZmVyZW50aWFsID8gMCA6IDB4ODApOworCisJcmV0dXJuIGFkYzEyMTM4X21vZGVfcHJvZ3JhbW1pbmcoYWRjLCBtb2RlLCBkYXRhLCBsZW4pOworfQorCitzdGF0aWMgaW50IGFkYzEyMTM4X3N0YXJ0X2NvbnYoc3RydWN0IGFkYzEyMTM4ICphZGMsCisJCQkgICAgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW5uZWwpCit7CisJdTggdHJhc2g7CisKKwlyZXR1cm4gX19hZGMxMjEzOF9zdGFydF9jb252KGFkYywgY2hhbm5lbCwgJnRyYXNoLCAxKTsKK30KKworc3RhdGljIGludCBhZGMxMjEzOF9zdGFydF9hbmRfcmVhZF9jb252KHN0cnVjdCBhZGMxMjEzOCAqYWRjLAorCQkJCQlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbm5lbCwKKwkJCQkJX19iZTE2ICpkYXRhKQoreworCXJldHVybiBfX2FkYzEyMTM4X3N0YXJ0X2NvbnYoYWRjLCBjaGFubmVsLCBkYXRhLCAyKTsKK30KKworc3RhdGljIGludCBhZGMxMjEzOF9yZWFkX2NvbnZfZGF0YShzdHJ1Y3QgYWRjMTIxMzggKmFkYywgX19iZTE2ICp2YWx1ZSkKK3sKKwkvKiBJc3N1ZSBhIHJlYWQgc3RhdHVzIGluc3RydWN0aW9uIGFuZCByZWFkIHByZXZpb3VzIGNvbnZlcnNpb24gZGF0YSAqLworCXJldHVybiBhZGMxMjEzOF9tb2RlX3Byb2dyYW1taW5nKGFkYywgQURDMTIxMzhfTU9ERV9SRUFEX1NUQVRVUywKKwkJCQkJIHZhbHVlLCBzaXplb2YoKnZhbHVlKSk7Cit9CisKK3N0YXRpYyBpbnQgYWRjMTIxMzhfd2FpdF9lb2Moc3RydWN0IGFkYzEyMTM4ICphZGMsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmYWRjLT5jb21wbGV0ZSwgdGltZW91dCkpCisJCXJldHVybiAtRVRJTUVET1VUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRjMTIxMzhfYWRjX2NvbnZlcnNpb24oc3RydWN0IGFkYzEyMTM4ICphZGMsCisJCQkJICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW5uZWwsCisJCQkJICAgX19iZTE2ICp2YWx1ZSkKK3sKKwlpbnQgcmV0OworCisJcmVpbml0X2NvbXBsZXRpb24oJmFkYy0+Y29tcGxldGUpOworCisJcmV0ID0gYWRjMTIxMzhfc3RhcnRfY29udihhZGMsIGNoYW5uZWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhZGMxMjEzOF93YWl0X2VvYyhhZGMsIG1zZWNzX3RvX2ppZmZpZXMoMTAwKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBhZGMxMjEzOF9yZWFkX2NvbnZfZGF0YShhZGMsIHZhbHVlKTsKK30KKworc3RhdGljIGludCBhZGMxMjEzOF9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaWlvLAorCQkJICAgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbm5lbCwgaW50ICp2YWx1ZSwKKwkJCSAgICAgaW50ICpzaGlmdCwgbG9uZyBtYXNrKQoreworCXN0cnVjdCBhZGMxMjEzOCAqYWRjID0gaWlvX3ByaXYoaWlvKTsKKwlpbnQgcmV0OworCV9fYmUxNiBkYXRhOworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJbXV0ZXhfbG9jaygmYWRjLT5sb2NrKTsKKwkJcmV0ID0gYWRjMTIxMzhfYWRjX2NvbnZlcnNpb24oYWRjLCBjaGFubmVsLCAmZGF0YSk7CisJCW11dGV4X3VubG9jaygmYWRjLT5sb2NrKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJKnZhbHVlID0gc2lnbl9leHRlbmQzMihiZTE2X3RvX2NwdShkYXRhKSA+PiAzLCAxMik7CisKKwkJcmV0dXJuIElJT19WQUxfSU5UOworCWNhc2UgSUlPX0NIQU5fSU5GT19TQ0FMRToKKwkJcmV0ID0gcmVndWxhdG9yX2dldF92b2x0YWdlKGFkYy0+dnJlZl9wKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQkqdmFsdWUgPSByZXQ7CisKKwkJaWYgKCFJU19FUlIoYWRjLT52cmVmX24pKSB7CisJCQlyZXQgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2UoYWRjLT52cmVmX24pOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJCSp2YWx1ZSAtPSByZXQ7CisJCX0KKworCQkvKiBjb252ZXJ0IHJlZ3VsYXRvciBvdXRwdXQgdm9sdGFnZSB0byBtViAqLworCQkqdmFsdWUgLz0gMTAwMDsKKwkJKnNoaWZ0ID0gY2hhbm5lbC0+c2Nhbl90eXBlLnJlYWxiaXRzIC0gMTsKKworCQlyZXR1cm4gSUlPX1ZBTF9GUkFDVElPTkFMX0xPRzI7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX09GRlNFVDoKKwkJaWYgKCFJU19FUlIoYWRjLT52cmVmX24pKSB7CisJCQkqdmFsdWUgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2UoYWRjLT52cmVmX24pOworCQkJaWYgKCp2YWx1ZSA8IDApCisJCQkJcmV0dXJuICp2YWx1ZTsKKwkJfSBlbHNlIHsKKwkJCSp2YWx1ZSA9IDA7CisJCX0KKworCQkvKiBjb252ZXJ0IHJlZ3VsYXRvciBvdXRwdXQgdm9sdGFnZSB0byBtViAqLworCQkqdmFsdWUgLz0gMTAwMDsKKworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gYWRjMTIxMzhfaW5mbyA9IHsKKwkucmVhZF9yYXcgPSBhZGMxMjEzOF9yZWFkX3JhdywKKwkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBhZGMxMjEzOF9pbml0KHN0cnVjdCBhZGMxMjEzOCAqYWRjKQoreworCWludCByZXQ7CisJaW50IHN0YXR1czsKKwl1OCBtb2RlOworCXU4IHRyYXNoOworCisJcmVpbml0X2NvbXBsZXRpb24oJmFkYy0+Y29tcGxldGUpOworCisJcmV0ID0gYWRjMTIxMzhfbW9kZV9wcm9ncmFtbWluZyhhZGMsIEFEQzEyMTM4X01PREVfQVVUT19DQUwsICZ0cmFzaCwgMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIGRhdGEgb3V0cHV0IGF0IHRoaXMgdGltZSBoYXMgbm8gc2lnbmlmaWNhbmNlICovCisJc3RhdHVzID0gYWRjMTIxMzhfcmVhZF9zdGF0dXMoYWRjKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCWFkYzEyMTM4X3dhaXRfZW9jKGFkYywgbXNlY3NfdG9famlmZmllcygxMDApKTsKKworCXN0YXR1cyA9IGFkYzEyMTM4X3JlYWRfc3RhdHVzKGFkYyk7CisJaWYgKHN0YXR1cyAmIEFEQzEyMTM4X1NUQVRVU19DQUwpIHsKKwkJZGV2X3dhcm4oJmFkYy0+c3BpLT5kZXYsCisJCQkiQXV0byBDYWwgc2VxdWVuY2UgaXMgc3RpbGwgaW4gcHJvZ3Jlc3M6ICUjeFxuIiwKKwkJCXN0YXR1cyk7CisJCXJldHVybiAtRUlPOworCX0KKworCXN3aXRjaCAoYWRjLT5hY3F1aXNpdGlvbl90aW1lKSB7CisJY2FzZSA2OgorCQltb2RlID0gQURDMTIxMzhfTU9ERV9BQ1FVSVNJVElPTl9USU1FXzY7CisJCWJyZWFrOworCWNhc2UgMTA6CisJCW1vZGUgPSBBREMxMjEzOF9NT0RFX0FDUVVJU0lUSU9OX1RJTUVfMTA7CisJCWJyZWFrOworCWNhc2UgMTg6CisJCW1vZGUgPSBBREMxMjEzOF9NT0RFX0FDUVVJU0lUSU9OX1RJTUVfMTg7CisJCWJyZWFrOworCWNhc2UgMzQ6CisJCW1vZGUgPSBBREMxMjEzOF9NT0RFX0FDUVVJU0lUSU9OX1RJTUVfMzQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBhZGMxMjEzOF9tb2RlX3Byb2dyYW1taW5nKGFkYywgbW9kZSwgJnRyYXNoLCAxKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGFkYzEyMTM4X3RyaWdnZXJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwKQoreworCXN0cnVjdCBpaW9fcG9sbF9mdW5jICpwZiA9IHA7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBmLT5pbmRpb19kZXY7CisJc3RydWN0IGFkYzEyMTM4ICphZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCV9fYmUxNiBkYXRhWzIwXSA9IHsgfTsgLyogMTZ4IDIgYnl0ZXMgQURDIGRhdGEgKyA4IGJ5dGVzIHRpbWVzdGFtcCAqLworCV9fYmUxNiB0cmFzaDsKKwlpbnQgcmV0OworCWludCBzY2FuX2luZGV4OworCWludCBpID0gMDsKKworCW11dGV4X2xvY2soJmFkYy0+bG9jayk7CisKKwlmb3JfZWFjaF9zZXRfYml0KHNjYW5faW5kZXgsIGluZGlvX2Rldi0+YWN0aXZlX3NjYW5fbWFzaywKKwkJCSBpbmRpb19kZXYtPm1hc2tsZW5ndGgpIHsKKwkJY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgKnNjYW5fY2hhbiA9CisJCQkJJmluZGlvX2Rldi0+Y2hhbm5lbHNbc2Nhbl9pbmRleF07CisKKwkJcmVpbml0X2NvbXBsZXRpb24oJmFkYy0+Y29tcGxldGUpOworCisJCXJldCA9IGFkYzEyMTM4X3N0YXJ0X2FuZF9yZWFkX2NvbnYoYWRjLCBzY2FuX2NoYW4sCisJCQkJCQkgICBpID8gJmRhdGFbaSAtIDFdIDogJnRyYXNoKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X3dhcm4oJmFkYy0+c3BpLT5kZXYsCisJCQkJICJmYWlsZWQgdG8gc3RhcnQgY29udmVyc2lvblxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXJldCA9IGFkYzEyMTM4X3dhaXRfZW9jKGFkYywgbXNlY3NfdG9famlmZmllcygxMDApKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X3dhcm4oJmFkYy0+c3BpLT5kZXYsICJ3YWl0IGVvYyB0aW1lb3V0XG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaSsrOworCX0KKworCWlmIChpKSB7CisJCXJldCA9IGFkYzEyMTM4X3JlYWRfY29udl9kYXRhKGFkYywgJmRhdGFbaSAtIDFdKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X3dhcm4oJmFkYy0+c3BpLT5kZXYsCisJCQkJICJmYWlsZWQgdG8gZ2V0IGNvbnZlcnNpb24gZGF0YVxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlpb19wdXNoX3RvX2J1ZmZlcnNfd2l0aF90aW1lc3RhbXAoaW5kaW9fZGV2LCBkYXRhLAorCQkJCQkgICBpaW9fZ2V0X3RpbWVfbnMoaW5kaW9fZGV2KSk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZhZGMtPmxvY2spOworCisJaWlvX3RyaWdnZXJfbm90aWZ5X2RvbmUoaW5kaW9fZGV2LT50cmlnKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IGFkYzEyMTM4X2VvY19oYW5kbGVyKGludCBpcnEsIHZvaWQgKnApCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHA7CisJc3RydWN0IGFkYzEyMTM4ICphZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJY29tcGxldGUoJmFkYy0+Y29tcGxldGUpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGFkYzEyMTM4X3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3QgYWRjMTIxMzggKmFkYzsKKwlpbnQgcmV0OworCisJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZzcGktPmRldiwgc2l6ZW9mKCphZGMpKTsKKwlpZiAoIWluZGlvX2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlhZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWFkYy0+c3BpID0gc3BpOworCWFkYy0+aWQgPSBzcGlfZ2V0X2RldmljZV9pZChzcGkpLT5kcml2ZXJfZGF0YTsKKwltdXRleF9pbml0KCZhZGMtPmxvY2spOworCWluaXRfY29tcGxldGlvbigmYWRjLT5jb21wbGV0ZSk7CisKKwlpbmRpb19kZXYtPm5hbWUgPSBzcGlfZ2V0X2RldmljZV9pZChzcGkpLT5uYW1lOworCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlpbmRpb19kZXYtPmluZm8gPSAmYWRjMTIxMzhfaW5mbzsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlzd2l0Y2ggKGFkYy0+aWQpIHsKKwljYXNlIGFkYzEyMTMwOgorCWNhc2UgYWRjMTIxMzI6CisJCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBhZGMxMjEzMl9jaGFubmVsczsKKwkJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKGFkYzEyMTMyX2NoYW5uZWxzKTsKKwkJYnJlYWs7CisJY2FzZSBhZGMxMjEzODoKKwkJaW5kaW9fZGV2LT5jaGFubmVscyA9IGFkYzEyMTM4X2NoYW5uZWxzOworCQlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUoYWRjMTIxMzhfY2hhbm5lbHMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihzcGktPmRldi5vZl9ub2RlLCAidGksYWNxdWlzaXRpb24tdGltZSIsCisJCQkJICAgJmFkYy0+YWNxdWlzaXRpb25fdGltZSk7CisJaWYgKHJldCkKKwkJYWRjLT5hY3F1aXNpdGlvbl90aW1lID0gMTA7CisKKwlhZGMtPmNjbGsgPSBkZXZtX2Nsa19nZXQoJnNwaS0+ZGV2LCBOVUxMKTsKKwlpZiAoSVNfRVJSKGFkYy0+Y2NsaykpCisJCXJldHVybiBQVFJfRVJSKGFkYy0+Y2Nsayk7CisKKwlhZGMtPnZyZWZfcCA9IGRldm1fcmVndWxhdG9yX2dldCgmc3BpLT5kZXYsICJ2cmVmLXAiKTsKKwlpZiAoSVNfRVJSKGFkYy0+dnJlZl9wKSkKKwkJcmV0dXJuIFBUUl9FUlIoYWRjLT52cmVmX3ApOworCisJYWRjLT52cmVmX24gPSBkZXZtX3JlZ3VsYXRvcl9nZXRfb3B0aW9uYWwoJnNwaS0+ZGV2LCAidnJlZi1uIik7CisJaWYgKElTX0VSUihhZGMtPnZyZWZfbikpIHsKKwkJLyoKKwkJICogQXNzdW1lIHZyZWZfbiBpcyAwViBpZiBhbiBvcHRpb25hbCByZWd1bGF0b3IgaXMgbm90CisJCSAqIHNwZWNpZmllZCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgZXJyb3IgY29kZS4KKwkJICovCisJCXJldCA9IFBUUl9FUlIoYWRjLT52cmVmX24pOworCQlpZiAocmV0ICE9IC1FTk9ERVYpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnNwaS0+ZGV2LCBzcGktPmlycSwgYWRjMTIxMzhfZW9jX2hhbmRsZXIsCisJCQkgICAgICAgSVJRRl9UUklHR0VSX1JJU0lORywgaW5kaW9fZGV2LT5uYW1lLCBpbmRpb19kZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoYWRjLT5jY2xrKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShhZGMtPnZyZWZfcCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfY2xrX2Rpc2FibGU7CisKKwlpZiAoIUlTX0VSUihhZGMtPnZyZWZfbikpIHsKKwkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShhZGMtPnZyZWZfbik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl92cmVmX3BfZGlzYWJsZTsKKwl9CisKKwlyZXQgPSBhZGMxMjEzOF9pbml0KGFkYyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfdnJlZl9uX2Rpc2FibGU7CisKKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBpbmRpb19kZXYpOworCisJcmV0ID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfc2V0dXAoaW5kaW9fZGV2LCBOVUxMLAorCQkJCQkgYWRjMTIxMzhfdHJpZ2dlcl9oYW5kbGVyLCBOVUxMKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl92cmVmX25fZGlzYWJsZTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9idWZmZXJfY2xlYW51cDsKKworCXJldHVybiAwOworZXJyX2J1ZmZlcl9jbGVhbnVwOgorCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoaW5kaW9fZGV2KTsKK2Vycl92cmVmX25fZGlzYWJsZToKKwlpZiAoIUlTX0VSUihhZGMtPnZyZWZfbikpCisJCXJlZ3VsYXRvcl9kaXNhYmxlKGFkYy0+dnJlZl9uKTsKK2Vycl92cmVmX3BfZGlzYWJsZToKKwlyZWd1bGF0b3JfZGlzYWJsZShhZGMtPnZyZWZfcCk7CitlcnJfY2xrX2Rpc2FibGU6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGFkYy0+Y2Nsayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkYzEyMTM4X3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwlzdHJ1Y3QgYWRjMTIxMzggKmFkYyA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwKGluZGlvX2Rldik7CisJaWYgKCFJU19FUlIoYWRjLT52cmVmX24pKQorCQlyZWd1bGF0b3JfZGlzYWJsZShhZGMtPnZyZWZfbik7CisJcmVndWxhdG9yX2Rpc2FibGUoYWRjLT52cmVmX3ApOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShhZGMtPmNjbGspOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfT0YKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYWRjMTIxMzhfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJ0aSxhZGMxMjEzMCIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ0aSxhZGMxMjEzMiIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ0aSxhZGMxMjEzOCIsIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBhZGMxMjEzOF9kdF9pZHMpOworCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGFkYzEyMTM4X2lkW10gPSB7CisJeyAiYWRjMTIxMzAiLCBhZGMxMjEzMCB9LAorCXsgImFkYzEyMTMyIiwgYWRjMTIxMzIgfSwKKwl7ICJhZGMxMjEzOCIsIGFkYzEyMTM4IH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHNwaSwgYWRjMTIxMzhfaWQpOworCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWRjMTIxMzhfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkYzEyMTM4IiwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKGFkYzEyMTM4X2R0X2lkcyksCisJfSwKKwkucHJvYmUgPSBhZGMxMjEzOF9wcm9iZSwKKwkucmVtb3ZlID0gYWRjMTIxMzhfcmVtb3ZlLAorCS5pZF90YWJsZSA9IGFkYzEyMTM4X2lkLAorfTsKK21vZHVsZV9zcGlfZHJpdmVyKGFkYzEyMTM4X2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkFraW5vYnUgTWl0YSA8YWtpbm9idS5taXRhQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQURDMTIxMzAvQURDMTIxMzIvQURDMTIxMzggZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvdGktYWRjMTYxczYyNi5jIGIvZHJpdmVycy9paW8vYWRjL3RpLWFkYzE2MXM2MjYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTRiNjlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vYWRjL3RpLWFkYzE2MXM2MjYuYwpAQCAtMCwwICsxLDI0OCBAQAorLyoKKyAqIHRpLWFkYzE2MXM2MjYuYyAtIFRleGFzIEluc3RydW1lbnRzIEFEQzE2MVM2MjYgMS1jaGFubmVsIGRpZmZlcmVudGlhbCBBREMKKyAqCisgKiBBREMgRGV2aWNlcyBTdXBwb3J0ZWQ6CisgKiAgYWRjMTQxczYyNiAtIDE0LWJpdCBBREMKKyAqICBhZGMxNjFzNjI2IC0gMTYtYml0IEFEQworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBNYXR0IFJhbm9zdGF5IDxtcmFub3N0YXlAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9idWZmZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcl9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyZWRfYnVmZmVyLmg+CisKKyNkZWZpbmUgVElfQURDX0RSVl9OQU1FCSJ0aS1hZGMxNjFzNjI2IgorCitlbnVtIHsKKwlUSV9BREMxNDFTNjI2LAorCVRJX0FEQzE2MVM2MjYsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgdGlfYWRjMTQxczYyNl9jaGFubmVsc1tdID0geworCXsKKwkJLnR5cGUgPSBJSU9fVk9MVEFHRSwKKwkJLmNoYW5uZWwgPSAwLAorCQkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwKKwkJLnNjYW5faW5kZXggPSAwLAorCQkuc2Nhbl90eXBlID0geworCQkJLnNpZ24gPSAncycsCisJCQkucmVhbGJpdHMgPSAxNCwKKwkJCS5zdG9yYWdlYml0cyA9IDE2LAorCQl9LAorCX0sCisJSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoMSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgdGlfYWRjMTYxczYyNl9jaGFubmVsc1tdID0geworCXsKKwkJLnR5cGUgPSBJSU9fVk9MVEFHRSwKKwkJLmNoYW5uZWwgPSAwLAorCQkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwKKwkJLnNjYW5faW5kZXggPSAwLAorCQkuc2Nhbl90eXBlID0geworCQkJLnNpZ24gPSAncycsCisJCQkucmVhbGJpdHMgPSAxNiwKKwkJCS5zdG9yYWdlYml0cyA9IDE2LAorCQl9LAorCX0sCisJSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoMSksCit9OworCitzdHJ1Y3QgdGlfYWRjX2RhdGEgeworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaTsKKwl1OCByZWFkX3NpemU7CisJdTggc2hpZnQ7CisKKwl1OCBidWZmZXJbMTZdIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKK307CisKK3N0YXRpYyBpbnQgdGlfYWRjX3JlYWRfbWVhc3VyZW1lbnQoc3RydWN0IHRpX2FkY19kYXRhICpkYXRhLAorCQkJCSAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLCBpbnQgKnZhbCkKK3sKKwlpbnQgcmV0OworCisJc3dpdGNoIChkYXRhLT5yZWFkX3NpemUpIHsKKwljYXNlIDI6IHsKKwkJX19iZTE2IGJ1ZjsKKworCQlyZXQgPSBzcGlfcmVhZChkYXRhLT5zcGksICh2b2lkICopICZidWYsIDIpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQkqdmFsID0gYmUxNl90b19jcHUoYnVmKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgMzogeworCQlfX2JlMzIgYnVmOworCisJCXJldCA9IHNwaV9yZWFkKGRhdGEtPnNwaSwgKHZvaWQgKikgJmJ1ZiwgMyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCSp2YWwgPSBiZTMyX3RvX2NwdShidWYpID4+IDg7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkqdmFsID0gc2lnbl9leHRlbmQzMigqdmFsID4+IGRhdGEtPnNoaWZ0LCBjaGFuLT5zY2FuX3R5cGUucmVhbGJpdHMgLSAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgdGlfYWRjX3RyaWdnZXJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwcml2YXRlKQoreworCXN0cnVjdCBpaW9fcG9sbF9mdW5jICpwZiA9IHByaXZhdGU7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBmLT5pbmRpb19kZXY7CisJc3RydWN0IHRpX2FkY19kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCisJcmV0ID0gdGlfYWRjX3JlYWRfbWVhc3VyZW1lbnQoZGF0YSwgJmluZGlvX2Rldi0+Y2hhbm5lbHNbMF0sCisJCQkJICAgICAoaW50ICopICZkYXRhLT5idWZmZXIpOworCWlmICghcmV0KQorCQlpaW9fcHVzaF90b19idWZmZXJzX3dpdGhfdGltZXN0YW1wKGluZGlvX2RldiwKKwkJCQkJZGF0YS0+YnVmZmVyLAorCQkJCQlpaW9fZ2V0X3RpbWVfbnMoaW5kaW9fZGV2KSk7CisKKwlpaW9fdHJpZ2dlcl9ub3RpZnlfZG9uZShpbmRpb19kZXYtPnRyaWcpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHRpX2FkY19yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICBpbnQgKnZhbCwgaW50ICp2YWwyLCBsb25nIG1hc2spCit7CisJc3RydWN0IHRpX2FkY19kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCisJaWYgKG1hc2sgIT0gSUlPX0NIQU5fSU5GT19SQVcpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gaWlvX2RldmljZV9jbGFpbV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB0aV9hZGNfcmVhZF9tZWFzdXJlbWVudChkYXRhLCBjaGFuLCB2YWwpOworCWlpb19kZXZpY2VfcmVsZWFzZV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCisJaWYgKCFyZXQpCisJCXJldHVybiBJSU9fVkFMX0lOVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIHRpX2FkY19pbmZvID0geworCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCisJLnJlYWRfcmF3ID0gdGlfYWRjX3JlYWRfcmF3LAorfTsKKworc3RhdGljIGludCB0aV9hZGNfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXN0cnVjdCB0aV9hZGNfZGF0YSAqZGF0YTsKKwlpbnQgcmV0OworCisJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZzcGktPmRldiwgc2l6ZW9mKCpkYXRhKSk7CisJaWYgKCFpbmRpb19kZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJaW5kaW9fZGV2LT5pbmZvID0gJnRpX2FkY19pbmZvOworCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlpbmRpb19kZXYtPmRldi5vZl9ub2RlID0gc3BpLT5kZXYub2Zfbm9kZTsKKwlpbmRpb19kZXYtPm5hbWUgPSBUSV9BRENfRFJWX05BTUU7CisJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIGluZGlvX2Rldik7CisKKwlkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlkYXRhLT5zcGkgPSBzcGk7CisKKwlzd2l0Y2ggKHNwaV9nZXRfZGV2aWNlX2lkKHNwaSktPmRyaXZlcl9kYXRhKSB7CisJY2FzZSBUSV9BREMxNDFTNjI2OgorCQlpbmRpb19kZXYtPmNoYW5uZWxzID0gdGlfYWRjMTQxczYyNl9jaGFubmVsczsKKwkJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKHRpX2FkYzE0MXM2MjZfY2hhbm5lbHMpOworCQlkYXRhLT5zaGlmdCA9IDA7CisJCWRhdGEtPnJlYWRfc2l6ZSA9IDI7CisJCWJyZWFrOworCWNhc2UgVElfQURDMTYxUzYyNjoKKwkJaW5kaW9fZGV2LT5jaGFubmVscyA9IHRpX2FkYzE2MXM2MjZfY2hhbm5lbHM7CisJCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRSh0aV9hZGMxNjFzNjI2X2NoYW5uZWxzKTsKKwkJZGF0YS0+c2hpZnQgPSA2OworCQlkYXRhLT5yZWFkX3NpemUgPSAzOworCQlicmVhazsKKwl9CisKKwlyZXQgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9zZXR1cChpbmRpb19kZXYsIE5VTEwsCisJCQkJCSB0aV9hZGNfdHJpZ2dlcl9oYW5kbGVyLCBOVUxMKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfdW5yZWdfYnVmZmVyOworCisJcmV0dXJuIDA7CisKK2Vycm9yX3VucmVnX2J1ZmZlcjoKKwlpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwKGluZGlvX2Rldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRpX2FkY19yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwKGluZGlvX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdGlfYWRjX2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAidGksYWRjMTQxczYyNiIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ0aSxhZGMxNjFzNjI2IiwgfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHRpX2FkY19kdF9pZHMpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgdGlfYWRjX2lkW10gPSB7CisJeyJhZGMxNDFzNjI2IiwgVElfQURDMTQxUzYyNn0sCisJeyJhZGMxNjFzNjI2IiwgVElfQURDMTYxUzYyNn0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShzcGksIHRpX2FkY19pZCk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciB0aV9hZGNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gVElfQURDX0RSVl9OQU1FLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIodGlfYWRjX2R0X2lkcyksCisJfSwKKwkucHJvYmUJCT0gdGlfYWRjX3Byb2JlLAorCS5yZW1vdmUJCT0gdGlfYWRjX3JlbW92ZSwKKwkuaWRfdGFibGUJPSB0aV9hZGNfaWQsCit9OworbW9kdWxlX3NwaV9kcml2ZXIodGlfYWRjX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIk1hdHQgUmFub3N0YXkgPG1yYW5vc3RheUBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRleGFzIEluc3RydW1lbnRzIEFEQzF4MVMgMS1jaGFubmVsIGRpZmZlcmVudGlhbCBBREMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy90aS1hZHMxMDE1LmMgYi9kcml2ZXJzL2lpby9hZGMvdGktYWRzMTAxNS5jCmluZGV4IDFlZjM5ODc3Li5jZGU2ZjEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvdGktYWRzMTAxNS5jCisrKyBiL2RyaXZlcnMvaWlvL2FkYy90aS1hZHMxMDE1LmMKQEAgLTQ4OSw3ICs0ODksOCBAQAogI2lmZGVmIENPTkZJR19PRgogc3RhdGljIGludCBhZHMxMDE1X2dldF9jaGFubmVsc19jb25maWdfb2Yoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKLQlzdHJ1Y3QgYWRzMTAxNV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBhZHMxMDE1X2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKIAogCWlmICghY2xpZW50LT5kZXYub2Zfbm9kZSB8fApAQCAtNTIxLDYgKzUyMiw3IEBACiAJCQlpZiAocGdhID4gNikgewogCQkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiaW52YWxpZCBnYWluIG9uICVzXG4iLAogCQkJCQlub2RlLT5mdWxsX25hbWUpOworCQkJCW9mX25vZGVfcHV0KG5vZGUpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQl9CkBAIC01MzEsNiArNTMzLDcgQEAKIAkJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKIAkJCQkJImludmFsaWQgZGF0YV9yYXRlIG9uICVzXG4iLAogCQkJCQlub2RlLT5mdWxsX25hbWUpOworCQkJCW9mX25vZGVfcHV0KG5vZGUpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvdGktYWRzODY4OC5jIGIvZHJpdmVycy9paW8vYWRjL3RpLWFkczg2ODguYwppbmRleCBjNDAwNDM5Li40YTE2MzQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvdGktYWRzODY4OC5jCisrKyBiL2RyaXZlcnMvaWlvL2FkYy90aS1hZHM4Njg4LmMKQEAgLTQzOCw3ICs0MzgsNyBAQAogCXJldHVybiAwOwogCiBlcnJvcl9vdXQ6Ci0JaWYgKCFJU19FUlJfT1JfTlVMTChzdC0+cmVnKSkKKwlpZiAoIUlTX0VSUihzdC0+cmVnKSkKIAkJcmVndWxhdG9yX2Rpc2FibGUoc3QtPnJlZyk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtNDUxLDcgKzQ1MSw3IEBACiAKIAlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIAotCWlmICghSVNfRVJSX09SX05VTEwoc3QtPnJlZykpCisJaWYgKCFJU19FUlIoc3QtPnJlZykpCiAJCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT5yZWcpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvdGlfYW0zMzV4X2FkYy5jIGIvZHJpdmVycy9paW8vYWRjL3RpX2FtMzM1eF9hZGMuYwppbmRleCA4YTM2ODc1Li5jM2NmYWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvdGlfYW0zMzV4X2FkYy5jCisrKyBiL2RyaXZlcnMvaWlvL2FkYy90aV9hbTMzNXhfYWRjLmMKQEAgLTMyLDYgKzMyLDcgQEAKIAogc3RydWN0IHRpYWRjX2RldmljZSB7CiAJc3RydWN0IHRpX3RzY2FkY19kZXYgKm1mZF90c2NhZGM7CisJc3RydWN0IG11dGV4IGZpZm8xX2xvY2s7IC8qIHRvIHByb3RlY3QgZmlmbyBhY2Nlc3MgKi8KIAlpbnQgY2hhbm5lbHM7CiAJdTggY2hhbm5lbF9saW5lWzhdOwogCXU4IGNoYW5uZWxfc3RlcFs4XTsKQEAgLTM1OSw2ICszNjAsNyBAQAogCQlpbnQgKnZhbCwgaW50ICp2YWwyLCBsb25nIG1hc2spCiB7CiAJc3RydWN0IHRpYWRjX2RldmljZSAqYWRjX2RldiA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldCA9IElJT19WQUxfSU5UOwogCWludCBpLCBtYXBfdmFsOwogCXVuc2lnbmVkIGludCBmaWZvMWNvdW50LCByZWFkLCBzdGVwaWQ7CiAJYm9vbCBmb3VuZCA9IGZhbHNlOwpAQCAtMzcyLDEzICszNzQsMTQgQEAKIAlpZiAoIXN0ZXBfZW4pCiAJCXJldHVybiAtRUlOVkFMOwogCisJbXV0ZXhfbG9jaygmYWRjX2Rldi0+ZmlmbzFfbG9jayk7CiAJZmlmbzFjb3VudCA9IHRpYWRjX3JlYWRsKGFkY19kZXYsIFJFR19GSUZPMUNOVCk7CiAJd2hpbGUgKGZpZm8xY291bnQtLSkKIAkJdGlhZGNfcmVhZGwoYWRjX2RldiwgUkVHX0ZJRk8xKTsKIAogCWFtMzM1eF90c2Nfc2Vfc2V0X29uY2UoYWRjX2Rldi0+bWZkX3RzY2FkYywgc3RlcF9lbik7CiAKLQl0aW1lb3V0ID0gamlmZmllcyArIHVzZWNzX3RvX2ppZmZpZXMKKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMKIAkJCQkoSURMRV9USU1FT1VUICogYWRjX2Rldi0+Y2hhbm5lbHMpOwogCS8qIFdhaXQgZm9yIEZpZm8gdGhyZXNob2xkIGludGVycnVwdCAqLwogCXdoaWxlICgxKSB7CkBAIC0zODgsNyArMzkxLDggQEAKIAogCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgewogCQkJYW0zMzV4X3RzY19zZV9hZGNfZG9uZShhZGNfZGV2LT5tZmRfdHNjYWRjKTsKLQkJCXJldHVybiAtRUFHQUlOOworCQkJcmV0ID0gLUVBR0FJTjsKKwkJCWdvdG8gZXJyX3VubG9jazsKIAkJfQogCX0KIAltYXBfdmFsID0gYWRjX2Rldi0+Y2hhbm5lbF9zdGVwW2NoYW4tPnNjYW5faW5kZXhdOwpAQCAtNDE0LDggKzQxOCwxMSBAQAogCWFtMzM1eF90c2Nfc2VfYWRjX2RvbmUoYWRjX2Rldi0+bWZkX3RzY2FkYyk7CiAKIAlpZiAoZm91bmQgPT0gZmFsc2UpCi0JCXJldHVybiAtRUJVU1k7Ci0JcmV0dXJuIElJT19WQUxfSU5UOworCQlyZXQgPSAgLUVCVVNZOworCitlcnJfdW5sb2NrOgorCW11dGV4X3VubG9jaygmYWRjX2Rldi0+ZmlmbzFfbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyB0aWFkY19pbmZvID0gewpAQCAtNDgzLDYgKzQ5MCw3IEBACiAKIAl0aWFkY19zdGVwX2NvbmZpZyhpbmRpb19kZXYpOwogCXRpYWRjX3dyaXRlbChhZGNfZGV2LCBSRUdfRklGTzFUSFIsIEZJRk8xX1RIUkVTSE9MRCk7CisJbXV0ZXhfaW5pdCgmYWRjX2Rldi0+ZmlmbzFfbG9jayk7CiAKIAllcnIgPSB0aWFkY19jaGFubmVsX2luaXQoaW5kaW9fZGV2LCBhZGNfZGV2LT5jaGFubmVscyk7CiAJaWYgKGVyciA8IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9idWZmZXIvaW5kdXN0cmlhbGlvLWJ1ZmZlci1jYi5jIGIvZHJpdmVycy9paW8vYnVmZmVyL2luZHVzdHJpYWxpby1idWZmZXItY2IuYwppbmRleCAzMjMwNzljLi5iOGY1NTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9idWZmZXIvaW5kdXN0cmlhbGlvLWJ1ZmZlci1jYi5jCisrKyBiL2RyaXZlcnMvaWlvL2J1ZmZlci9pbmR1c3RyaWFsaW8tYnVmZmVyLWNiLmMKQEAgLTE4LDYgKzE4LDcgQEAKIAlpbnQgKCpjYikoY29uc3Qgdm9pZCAqZGF0YSwgdm9pZCAqcHJpdmF0ZSk7CiAJdm9pZCAqcHJpdmF0ZTsKIAlzdHJ1Y3QgaWlvX2NoYW5uZWwgKmNoYW5uZWxzOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CiB9OwogCiBzdGF0aWMgc3RydWN0IGlpb19jYl9idWZmZXIgKmJ1ZmZlcl90b19jYl9idWZmZXIoc3RydWN0IGlpb19idWZmZXIgKmJ1ZmZlcikKQEAgLTUyLDcgKzUzLDYgQEAKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBpaW9fY2JfYnVmZmVyICpjYl9idWZmOwotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CiAJc3RydWN0IGlpb19jaGFubmVsICpjaGFuOwogCiAJY2JfYnVmZiA9IGt6YWxsb2Moc2l6ZW9mKCpjYl9idWZmKSwgR0ZQX0tFUk5FTCk7CkBAIC03MiwxNyArNzIsMTcgQEAKIAkJZ290byBlcnJvcl9mcmVlX2NiX2J1ZmY7CiAJfQogCi0JaW5kaW9fZGV2ID0gY2JfYnVmZi0+Y2hhbm5lbHNbMF0uaW5kaW9fZGV2OworCWNiX2J1ZmYtPmluZGlvX2RldiA9IGNiX2J1ZmYtPmNoYW5uZWxzWzBdLmluZGlvX2RldjsKIAljYl9idWZmLT5idWZmZXIuc2Nhbl9tYXNrCi0JCT0ga2NhbGxvYyhCSVRTX1RPX0xPTkdTKGluZGlvX2Rldi0+bWFza2xlbmd0aCksIHNpemVvZihsb25nKSwKLQkJCSAgR0ZQX0tFUk5FTCk7CisJCT0ga2NhbGxvYyhCSVRTX1RPX0xPTkdTKGNiX2J1ZmYtPmluZGlvX2Rldi0+bWFza2xlbmd0aCksCisJCQkgIHNpemVvZihsb25nKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNiX2J1ZmYtPmJ1ZmZlci5zY2FuX21hc2sgPT0gTlVMTCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycm9yX3JlbGVhc2VfY2hhbm5lbHM7CiAJfQogCWNoYW4gPSAmY2JfYnVmZi0+Y2hhbm5lbHNbMF07CiAJd2hpbGUgKGNoYW4tPmluZGlvX2RldikgewotCQlpZiAoY2hhbi0+aW5kaW9fZGV2ICE9IGluZGlvX2RldikgeworCQlpZiAoY2hhbi0+aW5kaW9fZGV2ICE9IGNiX2J1ZmYtPmluZGlvX2RldikgewogCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWdvdG8gZXJyb3JfZnJlZV9zY2FuX21hc2s7CiAJCX0KQEAgLTEwNSwxNyArMTA1LDE0IEBACiAKIGludCBpaW9fY2hhbm5lbF9zdGFydF9hbGxfY2Ioc3RydWN0IGlpb19jYl9idWZmZXIgKmNiX2J1ZmYpCiB7Ci0JcmV0dXJuIGlpb191cGRhdGVfYnVmZmVycyhjYl9idWZmLT5jaGFubmVsc1swXS5pbmRpb19kZXYsCi0JCQkJICAmY2JfYnVmZi0+YnVmZmVyLAorCXJldHVybiBpaW9fdXBkYXRlX2J1ZmZlcnMoY2JfYnVmZi0+aW5kaW9fZGV2LCAmY2JfYnVmZi0+YnVmZmVyLAogCQkJCSAgTlVMTCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpaW9fY2hhbm5lbF9zdGFydF9hbGxfY2IpOwogCiB2b2lkIGlpb19jaGFubmVsX3N0b3BfYWxsX2NiKHN0cnVjdCBpaW9fY2JfYnVmZmVyICpjYl9idWZmKQogewotCWlpb191cGRhdGVfYnVmZmVycyhjYl9idWZmLT5jaGFubmVsc1swXS5pbmRpb19kZXYsCi0JCQkgICBOVUxMLAotCQkJICAgJmNiX2J1ZmYtPmJ1ZmZlcik7CisJaWlvX3VwZGF0ZV9idWZmZXJzKGNiX2J1ZmYtPmluZGlvX2RldiwgTlVMTCwgJmNiX2J1ZmYtPmJ1ZmZlcik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpaW9fY2hhbm5lbF9zdG9wX2FsbF9jYik7CiAKQEAgLTEzMyw2ICsxMzAsMTMgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlpb19jaGFubmVsX2NiX2dldF9jaGFubmVscyk7CiAKK3N0cnVjdCBpaW9fZGV2CisqaWlvX2NoYW5uZWxfY2JfZ2V0X2lpb19kZXYoY29uc3Qgc3RydWN0IGlpb19jYl9idWZmZXIgKmNiX2J1ZmZlcikKK3sKKwlyZXR1cm4gY2JfYnVmZmVyLT5pbmRpb19kZXY7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpaW9fY2hhbm5lbF9jYl9nZXRfaWlvX2Rldik7CisKIE1PRFVMRV9BVVRIT1IoIkpvbmF0aGFuIENhbWVyb24gPGppYzIzQGtlcm5lbC5vcmc+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkluZHVzdHJpYWwgSS9PIGNhbGxiYWNrIGJ1ZmZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYnVmZmVyL2luZHVzdHJpYWxpby10cmlnZ2VyZWQtYnVmZmVyLmMgYi9kcml2ZXJzL2lpby9idWZmZXIvaW5kdXN0cmlhbGlvLXRyaWdnZXJlZC1idWZmZXIuYwppbmRleCA0YjI4NThiLi5kM2RiMWZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9idWZmZXIvaW5kdXN0cmlhbGlvLXRyaWdnZXJlZC1idWZmZXIuYworKysgYi9kcml2ZXJzL2lpby9idWZmZXIvaW5kdXN0cmlhbGlvLXRyaWdnZXJlZC1idWZmZXIuYwpAQCAtOTgsNiArOTgsNDggQEAKIH0KIEVYUE9SVF9TWU1CT0woaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cCk7CiAKK3N0YXRpYyB2b2lkIGRldm1faWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW4oc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpyZXMpCit7CisJaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cCgqKHN0cnVjdCBpaW9fZGV2ICoqKXJlcyk7Cit9CisKK2ludCBkZXZtX2lpb190cmlnZ2VyZWRfYnVmZmVyX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCQkgICAgaXJxcmV0dXJuX3QgKCpoKShpbnQgaXJxLCB2b2lkICpwKSwKKwkJCQkgICAgaXJxcmV0dXJuX3QgKCp0aHJlYWQpKGludCBpcnEsIHZvaWQgKnApLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgaWlvX2J1ZmZlcl9zZXR1cF9vcHMgKm9wcykKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqKnB0cjsKKwlpbnQgcmV0OworCisJcHRyID0gZGV2cmVzX2FsbG9jKGRldm1faWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW4sIHNpemVvZigqcHRyKSwKKwkJCSAgIEdGUF9LRVJORUwpOworCWlmICghcHRyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCSpwdHIgPSBpbmRpb19kZXY7CisKKwlyZXQgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9zZXR1cChpbmRpb19kZXYsIGgsIHRocmVhZCwgb3BzKTsKKwlpZiAoIXJldCkKKwkJZGV2cmVzX2FkZChkZXYsIHB0cik7CisJZWxzZQorCQlkZXZyZXNfZnJlZShwdHIpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRldm1faWlvX3RyaWdnZXJlZF9idWZmZXJfc2V0dXApOworCit2b2lkIGRldm1faWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJaW50IHJjOworCisJcmMgPSBkZXZyZXNfcmVsZWFzZShkZXYsIGRldm1faWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW4sCisJCQkgICAgZGV2bV9paW9fZGV2aWNlX21hdGNoLCBpbmRpb19kZXYpOworCVdBUk5fT04ocmMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGV2bV9paW9fdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwKTsKKwogTU9EVUxFX0FVVEhPUigiTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIklJTyBoZWxwZXIgZnVuY3Rpb25zIGZvciBzZXR0aW5nIHVwIHRyaWdnZXJlZCBidWZmZXJzIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9jaGVtaWNhbC9LY29uZmlnIGIvZHJpdmVycy9paW8vY2hlbWljYWwvS2NvbmZpZwppbmRleCA0YmNjMDI1Li5jZWE3Zjk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9jaGVtaWNhbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaWlvL2NoZW1pY2FsL0tjb25maWcKQEAgLTE2LDYgKzE2LDcgQEAKIAkgQXRsYXMgU2NpZW50aWZpYyBPRU0gU00gc2Vuc29yczoKIAkgICAgKiBwSCBTTSBzZW5zb3IKIAkgICAgKiBFQyBTTSBzZW5zb3IKKwkgICAgKiBPUlAgU00gc2Vuc29yCiAKIAkgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYXRsYXMtcGgtc2Vuc29yLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vY2hlbWljYWwvYXRsYXMtcGgtc2Vuc29yLmMgYi9kcml2ZXJzL2lpby9jaGVtaWNhbC9hdGxhcy1waC1zZW5zb3IuYwppbmRleCBhZTAzOGE1Li5iZDMyMWIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9jaGVtaWNhbC9hdGxhcy1waC1zZW5zb3IuYworKysgYi9kcml2ZXJzL2lpby9jaGVtaWNhbC9hdGxhcy1waC1zZW5zb3IuYwpAQCAtNjYsMTIgKzY2LDE3IEBACiAjZGVmaW5lIEFUTEFTX1JFR19URFNfREFUQQkJMHgxYwogI2RlZmluZSBBVExBU19SRUdfUFNTX0RBVEEJCTB4MjAKIAorI2RlZmluZSBBVExBU19SRUdfT1JQX0NBTElCX1NUQVRVUwkweDBkCisjZGVmaW5lIEFUTEFTX1JFR19PUlBfREFUQQkJMHgwZQorCiAjZGVmaW5lIEFUTEFTX1BIX0lOVF9USU1FX0lOX1VTCQk0NTAwMDAKICNkZWZpbmUgQVRMQVNfRUNfSU5UX1RJTUVfSU5fVVMJCTY1MDAwMAorI2RlZmluZSBBVExBU19PUlBfSU5UX1RJTUVfSU5fVVMJNDUwMDAwCiAKIGVudW0gewogCUFUTEFTX1BIX1NNLAogCUFUTEFTX0VDX1NNLAorCUFUTEFTX09SUF9TTSwKIH07CiAKIHN0cnVjdCBhdGxhc19kYXRhIHsKQEAgLTg0LDI2ICs4OSwxMCBAQAogCV9fYmUzMiBidWZmZXJbNl07IC8qIDk2LWJpdCBkYXRhICsgMzItYml0IHBhZCArIDY0LWJpdCB0aW1lc3RhbXAgKi8KIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX3JhbmdlIGF0bGFzX3ZvbGF0aWxlX3Jhbmdlc1tdID0gewotCXJlZ21hcF9yZWdfcmFuZ2UoQVRMQVNfUkVHX0lOVF9DT05UUk9MLCBBVExBU19SRUdfSU5UX0NPTlRST0wpLAotCXJlZ21hcF9yZWdfcmFuZ2UoQVRMQVNfUkVHX1BIX0RBVEEsIEFUTEFTX1JFR19QSF9EQVRBICsgNCksCi0JcmVnbWFwX3JlZ19yYW5nZShBVExBU19SRUdfRUNfREFUQSwgQVRMQVNfUkVHX1BTU19EQVRBICsgNCksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9hY2Nlc3NfdGFibGUgYXRsYXNfdm9sYXRpbGVfdGFibGUgPSB7Ci0JLnllc19yYW5nZXMJPSBhdGxhc192b2xhdGlsZV9yYW5nZXMsCi0JLm5feWVzX3Jhbmdlcwk9IEFSUkFZX1NJWkUoYXRsYXNfdm9sYXRpbGVfcmFuZ2VzKSwKLX07Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBhdGxhc19yZWdtYXBfY29uZmlnID0gewogCS5uYW1lID0gQVRMQVNfUkVHTUFQX05BTUUsCi0KIAkucmVnX2JpdHMgPSA4LAogCS52YWxfYml0cyA9IDgsCi0KLQkudm9sYXRpbGVfdGFibGUgPSAmYXRsYXNfdm9sYXRpbGVfdGFibGUsCi0JLm1heF9yZWdpc3RlciA9IEFUTEFTX1JFR19QU1NfREFUQSArIDQsCi0JLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgYXRsYXNfcGhfY2hhbm5lbHNbXSA9IHsKQEAgLTE3NSw2ICsxNjQsMjMgQEAKIAl9LAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIGF0bGFzX29ycF9jaGFubmVsc1tdID0geworCXsKKwkJLnR5cGUgPSBJSU9fVk9MVEFHRSwKKwkJLmFkZHJlc3MgPSBBVExBU19SRUdfT1JQX0RBVEEsCisJCS5pbmZvX21hc2tfc2VwYXJhdGUgPQorCQkJQklUKElJT19DSEFOX0lORk9fUkFXKSB8IEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSwKKwkJLnNjYW5faW5kZXggPSAwLAorCQkuc2Nhbl90eXBlID0geworCQkJLnNpZ24gPSAncycsCisJCQkucmVhbGJpdHMgPSAzMiwKKwkJCS5zdG9yYWdlYml0cyA9IDMyLAorCQkJLmVuZGlhbm5lc3MgPSBJSU9fQkUsCisJCX0sCisJfSwKKwlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCgxKSwKK307CisKIHN0YXRpYyBpbnQgYXRsYXNfY2hlY2tfcGhfY2FsaWJyYXRpb24oc3RydWN0IGF0bGFzX2RhdGEgKmRhdGEpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmRhdGEtPmNsaWVudC0+ZGV2OwpAQCAtMjQwLDYgKzI0NiwyMiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGF0bGFzX2NoZWNrX29ycF9jYWxpYnJhdGlvbihzdHJ1Y3QgYXRsYXNfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZGF0YS0+Y2xpZW50LT5kZXY7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJcmV0ID0gcmVnbWFwX3JlYWQoZGF0YS0+cmVnbWFwLCBBVExBU19SRUdfT1JQX0NBTElCX1NUQVRVUywgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmICghdmFsKQorCQlkZXZfd2FybihkZXYsICJkZXZpY2UgaGFzIG5vdCBiZWVuIGNhbGlicmF0ZWRcbiIpOworCisJcmV0dXJuIDA7Cit9OworCiBzdHJ1Y3QgYXRsYXNfZGV2aWNlIHsKIAljb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbm5lbHM7CiAJaW50IG51bV9jaGFubmVsczsKQEAgLTI2NCw3ICsyODYsMTMgQEAKIAkJCQkuY2FsaWJyYXRpb24gPSAmYXRsYXNfY2hlY2tfZWNfY2FsaWJyYXRpb24sCiAJCQkJLmRlbGF5ID0gQVRMQVNfRUNfSU5UX1RJTUVfSU5fVVMsCiAJfSwKLQorCVtBVExBU19PUlBfU01dID0geworCQkJCS5jaGFubmVscyA9IGF0bGFzX29ycF9jaGFubmVscywKKwkJCQkubnVtX2NoYW5uZWxzID0gMiwKKwkJCQkuZGF0YV9yZWcgPSBBVExBU19SRUdfT1JQX0RBVEEsCisJCQkJLmNhbGlicmF0aW9uID0gJmF0bGFzX2NoZWNrX29ycF9jYWxpYnJhdGlvbiwKKwkJCQkuZGVsYXkgPSBBVExBU19PUlBfSU5UX1RJTUVfSU5fVVMsCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgYXRsYXNfc2V0X3Bvd2VybW9kZShzdHJ1Y3QgYXRsYXNfZGF0YSAqZGF0YSwgaW50IG9uKQpAQCAtNDAyLDE1ICs0MzAsMTQgQEAKIAkJY2FzZSBJSU9fUEg6CiAJCWNhc2UgSUlPX0NPTkNFTlRSQVRJT046CiAJCWNhc2UgSUlPX0VMRUNUUklDQUxDT05EVUNUSVZJVFk6Ci0JCQltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwkJY2FzZSBJSU9fVk9MVEFHRToKKwkJCXJldCA9IGlpb19kZXZpY2VfY2xhaW1fZGlyZWN0X21vZGUoaW5kaW9fZGV2KTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKIAotCQkJaWYgKGlpb19idWZmZXJfZW5hYmxlZChpbmRpb19kZXYpKQotCQkJCXJldCA9IC1FQlVTWTsKLQkJCWVsc2UKLQkJCQlyZXQgPSBhdGxhc19yZWFkX21lYXN1cmVtZW50KGRhdGEsCi0JCQkJCQkJY2hhbi0+YWRkcmVzcywgJnJlZyk7CisJCQlyZXQgPSBhdGxhc19yZWFkX21lYXN1cmVtZW50KGRhdGEsIGNoYW4tPmFkZHJlc3MsICZyZWcpOwogCi0JCQltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCQkJaWlvX2RldmljZV9yZWxlYXNlX2RpcmVjdF9tb2RlKGluZGlvX2Rldik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldCA9IC1FSU5WQUw7CkBAIC00MzQsMTIgKzQ2MSwxNiBAQAogCQkJYnJlYWs7CiAJCWNhc2UgSUlPX0VMRUNUUklDQUxDT05EVUNUSVZJVFk6CiAJCQkqdmFsID0gMTsgLyogMC4wMDAwMSAqLwotCQkJKnZhbCA9IDEwMDAwMDsKKwkJCSp2YWwyID0gMTAwMDAwOwogCQkJYnJlYWs7CiAJCWNhc2UgSUlPX0NPTkNFTlRSQVRJT046CiAJCQkqdmFsID0gMDsgLyogMC4wMDAwMDAwMDEgKi8KIAkJCSp2YWwyID0gMTAwMDsKIAkJCXJldHVybiBJSU9fVkFMX0lOVF9QTFVTX05BTk87CisJCWNhc2UgSUlPX1ZPTFRBR0U6CisJCQkqdmFsID0gMTsgLyogMC4xICovCisJCQkqdmFsMiA9IDEwOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtNDc1LDYgKzUwNiw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYXRsYXNfaWRbXSA9IHsKIAl7ICJhdGxhcy1waC1zbSIsIEFUTEFTX1BIX1NNfSwKIAl7ICJhdGxhcy1lYy1zbSIsIEFUTEFTX0VDX1NNfSwKKwl7ICJhdGxhcy1vcnAtc20iLCBBVExBU19PUlBfU019LAogCXt9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGF0bGFzX2lkKTsKQEAgLTQ4Miw2ICs1MTQsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYXRsYXNfZHRfaWRzW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJhdGxhcyxwaC1zbSIsIC5kYXRhID0gKHZvaWQgKilBVExBU19QSF9TTSwgfSwKIAl7IC5jb21wYXRpYmxlID0gImF0bGFzLGVjLXNtIiwgLmRhdGEgPSAodm9pZCAqKUFUTEFTX0VDX1NNLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiYXRsYXMsb3JwLXNtIiwgLmRhdGEgPSAodm9pZCAqKUFUTEFTX09SUF9TTSwgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBhdGxhc19kdF9pZHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vY2hlbWljYWwvdno4OXguYyBiL2RyaXZlcnMvaWlvL2NoZW1pY2FsL3Z6ODl4LmMKaW5kZXggNjUyNjQ5ZC4uOGUwZTQ0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vY2hlbWljYWwvdno4OXguYworKysgYi9kcml2ZXJzL2lpby9jaGVtaWNhbC92ejg5eC5jCkBAIC0xOSwyNSArMTksNTUgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogCiAjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgogI2luY2x1ZGUgPGxpbnV4L2lpby9zeXNmcy5oPgogCiAjZGVmaW5lIFZaODlYX1JFR19NRUFTVVJFTUVOVAkJMHgwOQotI2RlZmluZSBWWjg5WF9SRUdfTUVBU1VSRU1FTlRfU0laRQk2CisjZGVmaW5lIFZaODlYX1JFR19NRUFTVVJFTUVOVF9SRF9TSVpFCTYKKyNkZWZpbmUgVlo4OVhfUkVHX01FQVNVUkVNRU5UX1dSX1NJWkUJMwogCiAjZGVmaW5lIFZaODlYX1ZPQ19DTzJfSURYCQkwCiAjZGVmaW5lIFZaODlYX1ZPQ19TSE9SVF9JRFgJCTEKICNkZWZpbmUgVlo4OVhfVk9DX1RWT0NfSURYCQkyCiAjZGVmaW5lIFZaODlYX1ZPQ19SRVNJU1RBTkNFX0lEWAkzCiAKKyNkZWZpbmUgVlo4OVRFX1JFR19NRUFTVVJFTUVOVAkJMHgwYworI2RlZmluZSBWWjg5VEVfUkVHX01FQVNVUkVNRU5UX1JEX1NJWkUJNworI2RlZmluZSBWWjg5VEVfUkVHX01FQVNVUkVNRU5UX1dSX1NJWkUJNgorCisjZGVmaW5lIFZaODlURV9WT0NfVFZPQ19JRFgJCTAKKyNkZWZpbmUgVlo4OVRFX1ZPQ19DTzJfSURYCQkxCisjZGVmaW5lIFZaODlURV9WT0NfUkVTSVNUQU5DRV9JRFgJMgorCitlbnVtIHsKKwlWWjg5WCwKKwlWWjg5VEUsCit9OworCitzdHJ1Y3Qgdno4OXhfY2hpcF9kYXRhOworCiBzdHJ1Y3Qgdno4OXhfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwljb25zdCBzdHJ1Y3Qgdno4OXhfY2hpcF9kYXRhICpjaGlwOwogCXN0cnVjdCBtdXRleCBsb2NrOwogCWludCAoKnhmZXIpKHN0cnVjdCB2ejg5eF9kYXRhICpkYXRhLCB1OCBjbWQpOwogCisJYm9vbCBpc192YWxpZDsKIAl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlOwotCXU4IGJ1ZmZlcltWWjg5WF9SRUdfTUVBU1VSRU1FTlRfU0laRV07CisJdTggYnVmZmVyW1ZaODlURV9SRUdfTUVBU1VSRU1FTlRfUkRfU0laRV07Cit9OworCitzdHJ1Y3Qgdno4OXhfY2hpcF9kYXRhIHsKKwlib29sICgqdmFsaWQpKHN0cnVjdCB2ejg5eF9kYXRhICpkYXRhKTsKKwljb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbm5lbHM7CisJdTggbnVtX2NoYW5uZWxzOworCisJdTggY21kOworCXU4IHJlYWRfc2l6ZTsKKwl1OCB3cml0ZV9zaXplOwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHZ6ODl4X2NoYW5uZWxzW10gPSB7CkBAIC03MCw2ICsxMDAsNDAgQEAKIAkJLmluZm9fbWFza19zZXBhcmF0ZSA9CiAJCQlCSVQoSUlPX0NIQU5fSU5GT19SQVcpIHwgQklUKElJT19DSEFOX0lORk9fU0NBTEUpLAogCQkuYWRkcmVzcyA9IFZaODlYX1ZPQ19SRVNJU1RBTkNFX0lEWCwKKwkJLnNjYW5faW5kZXggPSAtMSwKKwkJLnNjYW5fdHlwZSA9IHsKKwkJCS5lbmRpYW5uZXNzID0gSUlPX0xFLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgdno4OXRlX2NoYW5uZWxzW10gPSB7CisJeworCQkudHlwZSA9IElJT19DT05DRU5UUkFUSU9OLAorCQkuY2hhbm5lbDIgPSBJSU9fTU9EX1ZPQywKKwkJLm1vZGlmaWVkID0gMSwKKwkJLmluZm9fbWFza19zZXBhcmF0ZSA9CisJCQlCSVQoSUlPX0NIQU5fSU5GT19PRkZTRVQpIHwgQklUKElJT19DSEFOX0lORk9fUkFXKSwKKwkJLmFkZHJlc3MgPSBWWjg5VEVfVk9DX1RWT0NfSURYLAorCX0sCisKKwl7CisJCS50eXBlID0gSUlPX0NPTkNFTlRSQVRJT04sCisJCS5jaGFubmVsMiA9IElJT19NT0RfQ08yLAorCQkubW9kaWZpZWQgPSAxLAorCQkuaW5mb19tYXNrX3NlcGFyYXRlID0KKwkJCUJJVChJSU9fQ0hBTl9JTkZPX09GRlNFVCkgfCBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLAorCQkuYWRkcmVzcyA9IFZaODlURV9WT0NfQ08yX0lEWCwKKwl9LAorCXsKKwkJLnR5cGUgPSBJSU9fUkVTSVNUQU5DRSwKKwkJLmluZm9fbWFza19zZXBhcmF0ZSA9CisJCQlCSVQoSUlPX0NIQU5fSU5GT19SQVcpIHwgQklUKElJT19DSEFOX0lORk9fU0NBTEUpLAorCQkuYWRkcmVzcyA9IFZaODlURV9WT0NfUkVTSVNUQU5DRV9JRFgsCisJCS5zY2FuX2luZGV4ID0gLTEsCisJCS5zY2FuX3R5cGUgPSB7CisJCQkuZW5kaWFubmVzcyA9IElJT19CRSwKKwkJfSwKIAl9LAogfTsKIApAQCAtOTMsMjkgKzE1Nyw0NSBAQAogICogYWx3YXlzIHplcm8sIGFuZCBieSBhbHNvIGNvbmZpcm1pbmcgdGhlIFZPQ19zaG9ydCBpc24ndCB6ZXJvLgogICovCiAKLXN0YXRpYyBpbnQgdno4OXhfbWVhc3VyZW1lbnRfaXNfdmFsaWQoc3RydWN0IHZ6ODl4X2RhdGEgKmRhdGEpCitzdGF0aWMgYm9vbCB2ejg5eF9tZWFzdXJlbWVudF9pc192YWxpZChzdHJ1Y3Qgdno4OXhfZGF0YSAqZGF0YSkKIHsKIAlpZiAoZGF0YS0+YnVmZmVyW1ZaODlYX1ZPQ19TSE9SVF9JRFhdID09IDApCi0JCXJldHVybiAxOworCQlyZXR1cm4gdHJ1ZTsKIAotCXJldHVybiAhIShkYXRhLT5idWZmZXJbVlo4OVhfUkVHX01FQVNVUkVNRU5UX1NJWkUgLSAxXSA+IDApOworCXJldHVybiAhIShkYXRhLT5idWZmZXJbZGF0YS0+Y2hpcC0+cmVhZF9zaXplIC0gMV0gPiAwKTsKK30KKworLyogVlo4OVRFIGRldmljZSBoYXMgYSBtb2RpZmllZCBDUkMtOCB0d28gY29tcGxlbWVudCBjaGVjayAqLworc3RhdGljIGJvb2wgdno4OXRlX21lYXN1cmVtZW50X2lzX3ZhbGlkKHN0cnVjdCB2ejg5eF9kYXRhICpkYXRhKQoreworCXU4IGNyYyA9IDA7CisJaW50IGksIHN1bSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgKGRhdGEtPmNoaXAtPnJlYWRfc2l6ZSAtIDEpOyBpKyspIHsKKwkJc3VtID0gY3JjICsgZGF0YS0+YnVmZmVyW2ldOworCQljcmMgPSBzdW07CisJCWNyYyArPSBzdW0gLyAyNTY7CisJfQorCisJcmV0dXJuICEoKDB4ZmYgLSBjcmMpID09IGRhdGEtPmJ1ZmZlcltkYXRhLT5jaGlwLT5yZWFkX3NpemUgLSAxXSk7CiB9CiAKIHN0YXRpYyBpbnQgdno4OXhfaTJjX3hmZXIoc3RydWN0IHZ6ODl4X2RhdGEgKmRhdGEsIHU4IGNtZCkKIHsKKwljb25zdCBzdHJ1Y3Qgdno4OXhfY2hpcF9kYXRhICpjaGlwID0gZGF0YS0+Y2hpcDsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCXN0cnVjdCBpMmNfbXNnIG1zZ1syXTsKIAlpbnQgcmV0OwotCXU4IGJ1ZlszXSA9IHsgY21kLCAwLCAwfTsKKwl1OCBidWZbNl0gPSB7IGNtZCwgMCwgMCwgMCwgMCwgMHhmMyB9OwogCiAJbXNnWzBdLmFkZHIgPSBjbGllbnQtPmFkZHI7CiAJbXNnWzBdLmZsYWdzID0gY2xpZW50LT5mbGFnczsKLQltc2dbMF0ubGVuID0gMzsKKwltc2dbMF0ubGVuID0gY2hpcC0+d3JpdGVfc2l6ZTsKIAltc2dbMF0uYnVmICA9IChjaGFyICopICZidWY7CiAKIAltc2dbMV0uYWRkciA9IGNsaWVudC0+YWRkcjsKIAltc2dbMV0uZmxhZ3MgPSBjbGllbnQtPmZsYWdzIHwgSTJDX01fUkQ7Ci0JbXNnWzFdLmxlbiA9IFZaODlYX1JFR19NRUFTVVJFTUVOVF9TSVpFOworCW1zZ1sxXS5sZW4gPSBjaGlwLT5yZWFkX3NpemU7CiAJbXNnWzFdLmJ1ZiA9IChjaGFyICopICZkYXRhLT5idWZmZXI7CiAKIAlyZXQgPSBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2csIDIpOwpAQCAtMTMzLDcgKzIxMyw3IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgVlo4OVhfUkVHX01FQVNVUkVNRU5UX1NJWkU7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5jaGlwLT5yZWFkX3NpemU7IGkrKykgewogCQlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlKGNsaWVudCk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKQEAgLTE0NSwzMCArMjI1LDQ3IEBACiAKIHN0YXRpYyBpbnQgdno4OXhfZ2V0X21lYXN1cmVtZW50KHN0cnVjdCB2ejg5eF9kYXRhICpkYXRhKQogeworCWNvbnN0IHN0cnVjdCB2ejg5eF9jaGlwX2RhdGEgKmNoaXAgPSBkYXRhLT5jaGlwOwogCWludCByZXQ7CiAKIAkvKiBzZW5zb3IgY2FuIG9ubHkgYmUgcG9sbGVkIG9uY2UgYSBzZWNvbmQgbWF4IHBlciBkYXRhc2hlZXQgKi8KIAlpZiAoIXRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGUgKyBIWikpCi0JCXJldHVybiAwOworCQlyZXR1cm4gZGF0YS0+aXNfdmFsaWQgPyAwIDogLUVBR0FJTjsKIAotCXJldCA9IGRhdGEtPnhmZXIoZGF0YSwgVlo4OVhfUkVHX01FQVNVUkVNRU5UKTsKKwlkYXRhLT5pc192YWxpZCA9IGZhbHNlOworCWRhdGEtPmxhc3RfdXBkYXRlID0gamlmZmllczsKKworCXJldCA9IGRhdGEtPnhmZXIoZGF0YSwgY2hpcC0+Y21kKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IHZ6ODl4X21lYXN1cmVtZW50X2lzX3ZhbGlkKGRhdGEpOworCXJldCA9IGNoaXAtPnZhbGlkKGRhdGEpOwogCWlmIChyZXQpCiAJCXJldHVybiAtRUFHQUlOOwogCi0JZGF0YS0+bGFzdF91cGRhdGUgPSBqaWZmaWVzOworCWRhdGEtPmlzX3ZhbGlkID0gdHJ1ZTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHZ6ODl4X2dldF9yZXNpc3RhbmNlX3JlYWRpbmcoc3RydWN0IHZ6ODl4X2RhdGEgKmRhdGEpCitzdGF0aWMgaW50IHZ6ODl4X2dldF9yZXNpc3RhbmNlX3JlYWRpbmcoc3RydWN0IHZ6ODl4X2RhdGEgKmRhdGEsCisJCQkJCXN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJCQlpbnQgKnZhbCkKIHsKLQl1OCAqYnVmID0gJmRhdGEtPmJ1ZmZlcltWWjg5WF9WT0NfUkVTSVNUQU5DRV9JRFhdOworCXU4ICp0bXAgPSAodTggKikgJmRhdGEtPmJ1ZmZlcltjaGFuLT5hZGRyZXNzXTsKIAotCXJldHVybiBidWZbMF0gfCAoYnVmWzFdIDw8IDgpOworCXN3aXRjaCAoY2hhbi0+c2Nhbl90eXBlLmVuZGlhbm5lc3MpIHsKKwljYXNlIElJT19MRToKKwkJKnZhbCA9IGxlMzJfdG9fY3B1cCgoX19sZTMyICopIHRtcCkgJiBHRU5NQVNLKDIzLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBJSU9fQkU6CisJCSp2YWwgPSBiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKSB0bXApID4+IDg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHZ6ODl4X3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCkBAIC0xODcsMTUgKzI4NCwxNSBAQAogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAotCQlzd2l0Y2ggKGNoYW4tPmFkZHJlc3MpIHsKLQkJY2FzZSBWWjg5WF9WT0NfQ08yX0lEWDoKLQkJY2FzZSBWWjg5WF9WT0NfU0hPUlRfSURYOgotCQljYXNlIFZaODlYX1ZPQ19UVk9DX0lEWDoKKwkJc3dpdGNoIChjaGFuLT50eXBlKSB7CisJCWNhc2UgSUlPX0NPTkNFTlRSQVRJT046CiAJCQkqdmFsID0gZGF0YS0+YnVmZmVyW2NoYW4tPmFkZHJlc3NdOwogCQkJcmV0dXJuIElJT19WQUxfSU5UOwotCQljYXNlIFZaODlYX1ZPQ19SRVNJU1RBTkNFX0lEWDoKLQkJCSp2YWwgPSB2ejg5eF9nZXRfcmVzaXN0YW5jZV9yZWFkaW5nKGRhdGEpOwotCQkJcmV0dXJuIElJT19WQUxfSU5UOworCQljYXNlIElJT19SRVNJU1RBTkNFOgorCQkJcmV0ID0gdno4OXhfZ2V0X3Jlc2lzdGFuY2VfcmVhZGluZyhkYXRhLCBjaGFuLCB2YWwpOworCQkJaWYgKCFyZXQpCisJCQkJcmV0dXJuIElJT19WQUxfSU5UOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMjEwLDEyICszMDcsMTIgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIElJT19DSEFOX0lORk9fT0ZGU0VUOgotCQlzd2l0Y2ggKGNoYW4tPmFkZHJlc3MpIHsKLQkJY2FzZSBWWjg5WF9WT0NfQ08yX0lEWDoKKwkJc3dpdGNoIChjaGFuLT5jaGFubmVsMikgeworCQljYXNlIElJT19NT0RfQ08yOgogCQkJKnZhbCA9IDQ0OwogCQkJKnZhbDIgPSAyNTAwMDA7CiAJCQlyZXR1cm4gSUlPX1ZBTF9JTlRfUExVU19NSUNSTzsKLQkJY2FzZSBWWjg5WF9WT0NfVFZPQ19JRFg6CisJCWNhc2UgSUlPX01PRF9WT0M6CiAJCQkqdmFsID0gLTEzOwogCQkJcmV0dXJuIElJT19WQUxfSU5UOwogCQlkZWZhdWx0OgpAQCAtMjMyLDExICszMjksNDMgQEAKIAkuZHJpdmVyX21vZHVsZQk9IFRISVNfTU9EVUxFLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCB2ejg5eF9jaGlwX2RhdGEgdno4OXhfY2hpcHNbXSA9IHsKKwl7CisJCS52YWxpZCA9IHZ6ODl4X21lYXN1cmVtZW50X2lzX3ZhbGlkLAorCisJCS5jbWQgPSBWWjg5WF9SRUdfTUVBU1VSRU1FTlQsCisJCS5yZWFkX3NpemUgPSBWWjg5WF9SRUdfTUVBU1VSRU1FTlRfUkRfU0laRSwKKwkJLndyaXRlX3NpemUgPSBWWjg5WF9SRUdfTUVBU1VSRU1FTlRfV1JfU0laRSwKKworCQkuY2hhbm5lbHMgPSB2ejg5eF9jaGFubmVscywKKwkJLm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUodno4OXhfY2hhbm5lbHMpLAorCX0sCisJeworCQkudmFsaWQgPSB2ejg5dGVfbWVhc3VyZW1lbnRfaXNfdmFsaWQsCisKKwkJLmNtZCA9IFZaODlURV9SRUdfTUVBU1VSRU1FTlQsCisJCS5yZWFkX3NpemUgPSBWWjg5VEVfUkVHX01FQVNVUkVNRU5UX1JEX1NJWkUsCisJCS53cml0ZV9zaXplID0gVlo4OVRFX1JFR19NRUFTVVJFTUVOVF9XUl9TSVpFLAorCisJCS5jaGFubmVscyA9IHZ6ODl0ZV9jaGFubmVscywKKwkJLm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUodno4OXRlX2NoYW5uZWxzKSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdno4OXhfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJzZ3gsdno4OXgiLCAuZGF0YSA9ICh2b2lkICopIFZaODlYIH0sCisJeyAuY29tcGF0aWJsZSA9ICJzZ3gsdno4OXRlIiwgLmRhdGEgPSAodm9pZCAqKSBWWjg5VEUgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB2ejg5eF9kdF9pZHMpOworCiBzdGF0aWMgaW50IHZ6ODl4X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCSAgICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKIAlzdHJ1Y3Qgdno4OXhfZGF0YSAqZGF0YTsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZDsKKwlpbnQgY2hpcF9pZDsKIAogCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqZGF0YSkpOwogCWlmICghaW5kaW9fZGV2KQpAQCAtMjUxLDggKzM4MCwxNSBAQAogCWVsc2UKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCisJb2ZfaWQgPSBvZl9tYXRjaF9kZXZpY2Uodno4OXhfZHRfaWRzLCAmY2xpZW50LT5kZXYpOworCWlmICghb2ZfaWQpCisJCWNoaXBfaWQgPSBpZC0+ZHJpdmVyX2RhdGE7CisJZWxzZQorCQljaGlwX2lkID0gKHVuc2lnbmVkIGxvbmcpb2ZfaWQtPmRhdGE7CisKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBpbmRpb19kZXYpOwogCWRhdGEtPmNsaWVudCA9IGNsaWVudDsKKwlkYXRhLT5jaGlwID0gJnZ6ODl4X2NoaXBzW2NoaXBfaWRdOwogCWRhdGEtPmxhc3RfdXBkYXRlID0gamlmZmllcyAtIEhaOwogCW11dGV4X2luaXQoJmRhdGEtPmxvY2spOwogCkBAIC0yNjEsMjQgKzM5NywxOSBAQAogCWluZGlvX2Rldi0+bmFtZSA9IGRldl9uYW1lKCZjbGllbnQtPmRldik7CiAJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOwogCi0JaW5kaW9fZGV2LT5jaGFubmVscyA9IHZ6ODl4X2NoYW5uZWxzOwotCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRSh2ejg5eF9jaGFubmVscyk7CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IGRhdGEtPmNoaXAtPmNoYW5uZWxzOworCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gZGF0YS0+Y2hpcC0+bnVtX2NoYW5uZWxzOwogCiAJcmV0dXJuIGRldm1faWlvX2RldmljZV9yZWdpc3RlcigmY2xpZW50LT5kZXYsIGluZGlvX2Rldik7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB2ejg5eF9pZFtdID0gewotCXsgInZ6ODl4IiwgMCB9LAorCXsgInZ6ODl4IiwgVlo4OVggfSwKKwl7ICJ2ejg5dGUiLCBWWjg5VEUgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgdno4OXhfaWQpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB2ejg5eF9kdF9pZHNbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInNneCx2ejg5eCIgfSwKLQl7IH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB2ejg5eF9kdF9pZHMpOwotCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdno4OXhfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gInZ6ODl4IiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2NvbW1vbi9oaWQtc2Vuc29ycy9oaWQtc2Vuc29yLWF0dHJpYnV0ZXMuYyBiL2RyaXZlcnMvaWlvL2NvbW1vbi9oaWQtc2Vuc29ycy9oaWQtc2Vuc29yLWF0dHJpYnV0ZXMuYwppbmRleCBlODFmNDM0Li5kYzMzYzFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9jb21tb24vaGlkLXNlbnNvcnMvaGlkLXNlbnNvci1hdHRyaWJ1dGVzLmMKKysrIGIvZHJpdmVycy9paW8vY29tbW9uL2hpZC1zZW5zb3JzL2hpZC1zZW5zb3ItYXR0cmlidXRlcy5jCkBAIC01Niw4ICs1Niw4IEBACiAJe0hJRF9VU0FHRV9TRU5TT1JfQUxTLCAwLCAxLCAwfSwKIAl7SElEX1VTQUdFX1NFTlNPUl9BTFMsIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfTFVYLCAxLCAwfSwKIAotCXtISURfVVNBR0VfU0VOU09SX1BSRVNTVVJFLCAwLCAxMDAwMDAsIDB9LAotCXtISURfVVNBR0VfU0VOU09SX1BSRVNTVVJFLCBISURfVVNBR0VfU0VOU09SX1VOSVRTX1BBU0NBTCwgMSwgMH0sCisJe0hJRF9VU0FHRV9TRU5TT1JfUFJFU1NVUkUsIDAsIDEwMCwgMH0sCisJe0hJRF9VU0FHRV9TRU5TT1JfUFJFU1NVUkUsIEhJRF9VU0FHRV9TRU5TT1JfVU5JVFNfUEFTQ0FMLCAwLCAxMDAwfSwKIH07CiAKIHN0YXRpYyBpbnQgcG93XzEwKHVuc2lnbmVkIHBvd2VyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vY29tbW9uL2hpZC1zZW5zb3JzL2hpZC1zZW5zb3ItdHJpZ2dlci5jIGIvZHJpdmVycy9paW8vY29tbW9uL2hpZC1zZW5zb3JzL2hpZC1zZW5zb3ItdHJpZ2dlci5jCmluZGV4IDViNDFmOWQuLmEzY2NlM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2NvbW1vbi9oaWQtc2Vuc29ycy9oaWQtc2Vuc29yLXRyaWdnZXIuYworKysgYi9kcml2ZXJzL2lpby9jb21tb24vaGlkLXNlbnNvcnMvaGlkLXNlbnNvci10cmlnZ2VyLmMKQEAgLTEyMiw2ICsxMjIsMTQgQEAKICNlbmRpZgogfQogCitzdGF0aWMgdm9pZCBoaWRfc2Vuc29yX3NldF9wb3dlcl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgaGlkX3NlbnNvcl9jb21tb24gKmF0dHJiID0gY29udGFpbmVyX29mKHdvcmssCisJCQkJCQkgICAgICAgc3RydWN0IGhpZF9zZW5zb3JfY29tbW9uLAorCQkJCQkJICAgICAgIHdvcmspOworCV9oaWRfc2Vuc29yX3Bvd2VyX3N0YXRlKGF0dHJiLCB0cnVlKTsKK30KKwogc3RhdGljIGludCBoaWRfc2Vuc29yX2RhdGFfcmR5X3RyaWdnZXJfc2V0X3N0YXRlKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZywKIAkJCQkJCWJvb2wgc3RhdGUpCiB7CkBAIC0xMzAsNiArMTM4LDcgQEAKIAogdm9pZCBoaWRfc2Vuc29yX3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBoaWRfc2Vuc29yX2NvbW1vbiAqYXR0cmIpCiB7CisJY2FuY2VsX3dvcmtfc3luYygmYXR0cmItPndvcmspOwogCWlpb190cmlnZ2VyX3VucmVnaXN0ZXIoYXR0cmItPnRyaWdnZXIpOwogCWlpb190cmlnZ2VyX2ZyZWUoYXR0cmItPnRyaWdnZXIpOwogfQpAQCAtMTcwLDYgKzE3OSw5IEBACiAJCWdvdG8gZXJyb3JfdW5yZWdfdHJpZ2dlcjsKIAogCWlpb19kZXZpY2Vfc2V0X2RydmRhdGEoaW5kaW9fZGV2LCBhdHRyYik7CisKKwlJTklUX1dPUksoJmF0dHJiLT53b3JrLCBoaWRfc2Vuc29yX3NldF9wb3dlcl93b3JrKTsKKwogCXBtX3N1c3BlbmRfaWdub3JlX2NoaWxkcmVuKCZhdHRyYi0+cGRldi0+ZGV2LCB0cnVlKTsKIAlwbV9ydW50aW1lX2VuYWJsZSgmYXR0cmItPnBkZXYtPmRldik7CiAJLyogRGVmYXVsdCB0byAzIHNlY29uZHMsIGJ1dCBjYW4gYmUgY2hhbmdlZCBmcm9tIHN5c2ZzICovCkBAIC0xODcsOCArMTk5LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woaGlkX3NlbnNvcl9zZXR1cF90cmlnZ2VyKTsKIAotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBoaWRfc2Vuc29yX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBfX21heWJlX3VudXNlZCBoaWRfc2Vuc29yX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CkBAIC0xOTcsMjEgKzIwOCwyNyBAQAogCXJldHVybiBfaGlkX3NlbnNvcl9wb3dlcl9zdGF0ZShhdHRyYiwgZmFsc2UpOwogfQogCi1zdGF0aWMgaW50IGhpZF9zZW5zb3JfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgaGlkX3NlbnNvcl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IGhpZF9zZW5zb3JfY29tbW9uICphdHRyYiA9IGlpb19kZXZpY2VfZ2V0X2RydmRhdGEoaW5kaW9fZGV2KTsKLQotCXJldHVybiBfaGlkX3NlbnNvcl9wb3dlcl9zdGF0ZShhdHRyYiwgdHJ1ZSk7CisJc2NoZWR1bGVfd29yaygmYXR0cmItPndvcmspOworCXJldHVybiAwOwogfQogCi0jZW5kaWYKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgaGlkX3NlbnNvcl9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgaGlkX3NlbnNvcl9jb21tb24gKmF0dHJiID0gaWlvX2RldmljZV9nZXRfZHJ2ZGF0YShpbmRpb19kZXYpOworCXJldHVybiBfaGlkX3NlbnNvcl9wb3dlcl9zdGF0ZShhdHRyYiwgdHJ1ZSk7Cit9CiAKIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGhpZF9zZW5zb3JfcG1fb3BzID0gewogCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKGhpZF9zZW5zb3Jfc3VzcGVuZCwgaGlkX3NlbnNvcl9yZXN1bWUpCiAJU0VUX1JVTlRJTUVfUE1fT1BTKGhpZF9zZW5zb3Jfc3VzcGVuZCwKLQkJCSAgIGhpZF9zZW5zb3JfcmVzdW1lLCBOVUxMKQorCQkJICAgaGlkX3NlbnNvcl9ydW50aW1lX3Jlc3VtZSwgTlVMTCkKIH07CiBFWFBPUlRfU1lNQk9MKGhpZF9zZW5zb3JfcG1fb3BzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vY29tbW9uL3N0X3NlbnNvcnMvc3Rfc2Vuc29yc19idWZmZXIuYyBiL2RyaXZlcnMvaWlvL2NvbW1vbi9zdF9zZW5zb3JzL3N0X3NlbnNvcnNfYnVmZmVyLmMKaW5kZXggZDA2ZTcyOC4uZmU3Nzc1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vY29tbW9uL3N0X3NlbnNvcnMvc3Rfc2Vuc29yc19idWZmZXIuYworKysgYi9kcml2ZXJzL2lpby9jb21tb24vc3Rfc2Vuc29ycy9zdF9zZW5zb3JzX2J1ZmZlci5jCkBAIC02Myw3ICs2Myw3IEBACiAJICogdGhlIGhhcmR3YXJlIHRyaWdnZXIpIGFuZCB0aGUgaHdfdGltZXN0YW1wIG1heSBnZXQgdXBkYXRlZC4KIAkgKiBCeSBzdG9yaW5nIGl0IGluIGEgbG9jYWwgdmFyaWFibGUgZmlyc3QsIHdlIGFyZSBzYWZlLgogCSAqLwotCWlmIChzZGF0YS0+aHdfaXJxX3RyaWdnZXIpCisJaWYgKGlpb190cmlnZ2VyX3VzaW5nX293bihpbmRpb19kZXYpKQogCQl0aW1lc3RhbXAgPSBzZGF0YS0+aHdfdGltZXN0YW1wOwogCWVsc2UKIAkJdGltZXN0YW1wID0gaWlvX2dldF90aW1lX25zKGluZGlvX2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9jb21tb24vc3Rfc2Vuc29ycy9zdF9zZW5zb3JzX2NvcmUuYyBiL2RyaXZlcnMvaWlvL2NvbW1vbi9zdF9zZW5zb3JzL3N0X3NlbnNvcnNfY29yZS5jCmluZGV4IDJkNTI4MmUuLjI4NWE2NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2NvbW1vbi9zdF9zZW5zb3JzL3N0X3NlbnNvcnNfY29yZS5jCisrKyBiL2RyaXZlcnMvaWlvL2NvbW1vbi9zdF9zZW5zb3JzL3N0X3NlbnNvcnNfY29yZS5jCkBAIC0yMzQsMzkgKzIzNCwzNSBAQAogCWludCBlcnI7CiAKIAkvKiBSZWd1bGF0b3JzIG5vdCBtYW5kYXRvcnksIGJ1dCBpZiByZXF1ZXN0ZWQgd2Ugc2hvdWxkIGVuYWJsZSB0aGVtLiAqLwotCXBkYXRhLT52ZGQgPSBkZXZtX3JlZ3VsYXRvcl9nZXRfb3B0aW9uYWwoaW5kaW9fZGV2LT5kZXYucGFyZW50LCAidmRkIik7Ci0JaWYgKCFJU19FUlIocGRhdGEtPnZkZCkpIHsKLQkJZXJyID0gcmVndWxhdG9yX2VuYWJsZShwZGF0YS0+dmRkKTsKLQkJaWYgKGVyciAhPSAwKSB7Ci0JCQlkZXZfd2FybigmaW5kaW9fZGV2LT5kZXYsCi0JCQkJICJGYWlsZWQgdG8gZW5hYmxlIHNwZWNpZmllZCBWZGQgc3VwcGx5XG4iKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KLQl9IGVsc2UgewotCQllcnIgPSBQVFJfRVJSKHBkYXRhLT52ZGQpOwotCQlpZiAoZXJyICE9IC1FTk9ERVYpCi0JCQlyZXR1cm4gZXJyOworCXBkYXRhLT52ZGQgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoaW5kaW9fZGV2LT5kZXYucGFyZW50LCAidmRkIik7CisJaWYgKElTX0VSUihwZGF0YS0+dmRkKSkgeworCQlkZXZfZXJyKCZpbmRpb19kZXYtPmRldiwgInVuYWJsZSB0byBnZXQgVmRkIHN1cHBseVxuIik7CisJCXJldHVybiBQVFJfRVJSKHBkYXRhLT52ZGQpOworCX0KKwllcnIgPSByZWd1bGF0b3JfZW5hYmxlKHBkYXRhLT52ZGQpOworCWlmIChlcnIgIT0gMCkgeworCQlkZXZfd2FybigmaW5kaW9fZGV2LT5kZXYsCisJCQkgIkZhaWxlZCB0byBlbmFibGUgc3BlY2lmaWVkIFZkZCBzdXBwbHlcbiIpOworCQlyZXR1cm4gZXJyOwogCX0KIAotCXBkYXRhLT52ZGRfaW8gPSBkZXZtX3JlZ3VsYXRvcl9nZXRfb3B0aW9uYWwoaW5kaW9fZGV2LT5kZXYucGFyZW50LCAidmRkaW8iKTsKLQlpZiAoIUlTX0VSUihwZGF0YS0+dmRkX2lvKSkgewotCQllcnIgPSByZWd1bGF0b3JfZW5hYmxlKHBkYXRhLT52ZGRfaW8pOwotCQlpZiAoZXJyICE9IDApIHsKLQkJCWRldl93YXJuKCZpbmRpb19kZXYtPmRldiwKLQkJCQkgIkZhaWxlZCB0byBlbmFibGUgc3BlY2lmaWVkIFZkZF9JTyBzdXBwbHlcbiIpOwotCQkJZ290byBzdF9zZW5zb3JzX2Rpc2FibGVfdmRkOwotCQl9Ci0JfSBlbHNlIHsKKwlwZGF0YS0+dmRkX2lvID0gZGV2bV9yZWd1bGF0b3JfZ2V0KGluZGlvX2Rldi0+ZGV2LnBhcmVudCwgInZkZGlvIik7CisJaWYgKElTX0VSUihwZGF0YS0+dmRkX2lvKSkgeworCQlkZXZfZXJyKCZpbmRpb19kZXYtPmRldiwgInVuYWJsZSB0byBnZXQgVmRkX0lPIHN1cHBseVxuIik7CiAJCWVyciA9IFBUUl9FUlIocGRhdGEtPnZkZF9pbyk7Ci0JCWlmIChlcnIgIT0gLUVOT0RFVikKLQkJCWdvdG8gc3Rfc2Vuc29yc19kaXNhYmxlX3ZkZDsKKwkJZ290byBzdF9zZW5zb3JzX2Rpc2FibGVfdmRkOworCX0KKwllcnIgPSByZWd1bGF0b3JfZW5hYmxlKHBkYXRhLT52ZGRfaW8pOworCWlmIChlcnIgIT0gMCkgeworCQlkZXZfd2FybigmaW5kaW9fZGV2LT5kZXYsCisJCQkgIkZhaWxlZCB0byBlbmFibGUgc3BlY2lmaWVkIFZkZF9JTyBzdXBwbHlcbiIpOworCQlnb3RvIHN0X3NlbnNvcnNfZGlzYWJsZV92ZGQ7CiAJfQogCiAJcmV0dXJuIDA7CiAKIHN0X3NlbnNvcnNfZGlzYWJsZV92ZGQ6Ci0JaWYgKCFJU19FUlJfT1JfTlVMTChwZGF0YS0+dmRkKSkKLQkJcmVndWxhdG9yX2Rpc2FibGUocGRhdGEtPnZkZCk7CisJcmVndWxhdG9yX2Rpc2FibGUocGRhdGEtPnZkZCk7CiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0woc3Rfc2Vuc29yc19wb3dlcl9lbmFibGUpOwpAQCAtMjc1LDExICsyNzEsOCBAQAogewogCXN0cnVjdCBzdF9zZW5zb3JfZGF0YSAqcGRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCi0JaWYgKCFJU19FUlJfT1JfTlVMTChwZGF0YS0+dmRkKSkKLQkJcmVndWxhdG9yX2Rpc2FibGUocGRhdGEtPnZkZCk7Ci0KLQlpZiAoIUlTX0VSUl9PUl9OVUxMKHBkYXRhLT52ZGRfaW8pKQotCQlyZWd1bGF0b3JfZGlzYWJsZShwZGF0YS0+dmRkX2lvKTsKKwlyZWd1bGF0b3JfZGlzYWJsZShwZGF0YS0+dmRkKTsKKwlyZWd1bGF0b3JfZGlzYWJsZShwZGF0YS0+dmRkX2lvKTsKIH0KIEVYUE9SVF9TWU1CT0woc3Rfc2Vuc29yc19wb3dlcl9kaXNhYmxlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vY29tbW9uL3N0X3NlbnNvcnMvc3Rfc2Vuc29yc190cmlnZ2VyLmMgYi9kcml2ZXJzL2lpby9jb21tb24vc3Rfc2Vuc29ycy9zdF9zZW5zb3JzX3RyaWdnZXIuYwppbmRleCBlNjZmMTJlLi5mYTczZTY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9jb21tb24vc3Rfc2Vuc29ycy9zdF9zZW5zb3JzX3RyaWdnZXIuYworKysgYi9kcml2ZXJzL2lpby9jb21tb24vc3Rfc2Vuc29ycy9zdF9zZW5zb3JzX3RyaWdnZXIuYwpAQCAtNjYsNyArNjYsNyBAQAogICogQGlycTogaXJxIG51bWJlcgogICogQHA6IHByaXZhdGUgaGFuZGxlciBkYXRhCiAgKi8KLWlycXJldHVybl90IHN0X3NlbnNvcnNfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqcCkKK3N0YXRpYyBpcnFyZXR1cm5fdCBzdF9zZW5zb3JzX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnApCiB7CiAJc3RydWN0IGlpb190cmlnZ2VyICp0cmlnID0gcDsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaWlvX3RyaWdnZXJfZ2V0X2RydmRhdGEodHJpZyk7CkBAIC04Miw3ICs4Miw3IEBACiAgKiBAaXJxOiBpcnEgbnVtYmVyCiAgKiBAcDogcHJpdmF0ZSBoYW5kbGVyIGRhdGEKICAqLwotaXJxcmV0dXJuX3Qgc3Rfc2Vuc29yc19pcnFfdGhyZWFkKGludCBpcnEsIHZvaWQgKnApCitzdGF0aWMgaXJxcmV0dXJuX3Qgc3Rfc2Vuc29yc19pcnFfdGhyZWFkKGludCBpcnEsIHZvaWQgKnApCiB7CiAJc3RydWN0IGlpb190cmlnZ2VyICp0cmlnID0gcDsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaWlvX3RyaWdnZXJfZ2V0X2RydmRhdGEodHJpZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9kYWMvS2NvbmZpZyBiL2RyaXZlcnMvaWlvL2RhYy9LY29uZmlnCmluZGV4IGNhODE0NDcuLjEyMGIyNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2RhYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaWlvL2RhYy9LY29uZmlnCkBAIC0xODEsNiArMTgxLDI1IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIG1vZHVsZSBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkCiAJICBhZDczMDMuCiAKK2NvbmZpZyBDSU9fREFDCisJdHJpc3RhdGUgIk1lYXN1cmVtZW50IENvbXB1dGluZyBDSU8tREFDIElJTyBkcml2ZXIiCisJZGVwZW5kcyBvbiBYODYgJiYgSVNBX0JVU19BUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIE1lYXN1cmVtZW50IENvbXB1dGluZyBDSU8tREFDCisJICBhbmFsb2cgb3V0cHV0IGRldmljZSBmYW1pbHkgKENJTy1EQUMxNiwgQ0lPLURBQzA4LCBQQzEwNC1EQUMwNikuIFRoZQorCSAgYmFzZSBwb3J0IGFkZHJlc3NlcyBmb3IgdGhlIGRldmljZXMgbWF5IGJlIGNvbmZpZ3VyZWQgdmlhIHRoZSBiYXNlCisJICBhcnJheSBtb2R1bGUgcGFyYW1ldGVyLgorCitjb25maWcgQUQ4ODAxCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFEODgwMS9BRDg4MDMgREFDIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSV9NQVNURVIKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQUQ4ODAxLCBBRDg4MDMgRGlnaXRhbCB0bworCSAgQW5hbG9nIENvbnZlcnRlcnMgKERBQykuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAgYWQ4ODAxLgorCiBjb25maWcgTFBDMThYWF9EQUMKIAl0cmlzdGF0ZSAiTlhQIExQQzE4eHggREFDIGRyaXZlciIKIAlkZXBlbmRzIG9uIEFSQ0hfTFBDMThYWCB8fCBDT01QSUxFX1RFU1QKQEAgLTI0NSwxNiArMjY0LDYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIG1jcDQ5MjIuCiAKLWNvbmZpZyBTVFgxMDQKLQl0cmlzdGF0ZSAiQXBleCBFbWJlZGRlZCBTeXN0ZW1zIFNUWDEwNCBEQUMgZHJpdmVyIgotCWRlcGVuZHMgb24gWDg2ICYmIElTQV9CVVNfQVBJCi0Jc2VsZWN0IEdQSU9MSUIKLQloZWxwCi0JICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIDItY2hhbm5lbCBEQUMgYW5kIEdQSU8gb24gdGhlCi0JICBBcGV4IEVtYmVkZGVkIFN5c3RlbXMgU1RYMTA0IGludGVncmF0ZWQgYW5hbG9nIFBDLzEwNCBjYXJkLiBUaGUgYmFzZQotCSAgcG9ydCBhZGRyZXNzZXMgZm9yIHRoZSBkZXZpY2VzIG1heSBiZSBjb25maWd1cmVkIHZpYSB0aGUgYmFzZSBhcnJheQotCSAgbW9kdWxlIHBhcmFtZXRlci4KLQogY29uZmlnIFZGNjEwX0RBQwogCXRyaXN0YXRlICJWeWJyaWQgdmY2MTAgREFDIGRyaXZlciIKIAlkZXBlbmRzIG9uIE9GCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9kYWMvTWFrZWZpbGUgYi9kcml2ZXJzL2lpby9kYWMvTWFrZWZpbGUKaW5kZXggOGI3OGQ1Yy4uMjc2NDJiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vZGFjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaWlvL2RhYy9NYWtlZmlsZQpAQCAtMjAsMTEgKzIwLDEyIEBACiBvYmotJChDT05GSUdfQUQ1NzkxKSArPSBhZDU3OTEubwogb2JqLSQoQ09ORklHX0FENTY4NikgKz0gYWQ1Njg2Lm8KIG9iai0kKENPTkZJR19BRDczMDMpICs9IGFkNzMwMy5vCitvYmotJChDT05GSUdfQUQ4ODAxKSArPSBhZDg4MDEubworb2JqLSQoQ09ORklHX0NJT19EQUMpICs9IGNpby1kYWMubwogb2JqLSQoQ09ORklHX0xQQzE4WFhfREFDKSArPSBscGMxOHh4X2RhYy5vCiBvYmotJChDT05GSUdfTTYyMzMyKSArPSBtNjIzMzIubwogb2JqLSQoQ09ORklHX01BWDUxNykgKz0gbWF4NTE3Lm8KIG9iai0kKENPTkZJR19NQVg1ODIxKSArPSBtYXg1ODIxLm8KIG9iai0kKENPTkZJR19NQ1A0NzI1KSArPSBtY3A0NzI1Lm8KIG9iai0kKENPTkZJR19NQ1A0OTIyKSArPSBtY3A0OTIyLm8KLW9iai0kKENPTkZJR19TVFgxMDQpICs9IHN0eDEwNC5vCiBvYmotJChDT05GSUdfVkY2MTBfREFDKSArPSB2ZjYxMF9kYWMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vZGFjL2FkNTc1NS5jIGIvZHJpdmVycy9paW8vZGFjL2FkNTc1NS5jCmluZGV4IDBmZGU1OTMuLjVmNzk2ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2RhYy9hZDU3NTUuYworKysgYi9kcml2ZXJzL2lpby9kYWMvYWQ1NzU1LmMKQEAgLTY1NSw3ICs2NTUsNyBAQAogCiAJZGV2bnIgPSAwOwogCWZvcl9lYWNoX2NoaWxkX29mX25vZGUobnAsIHBwKSB7Ci0JCWlmIChkZXZuciA+IEFENTc1NV9OVU1fQ0hBTk5FTFMpIHsKKwkJaWYgKGRldm5yID49IEFENTc1NV9OVU1fQ0hBTk5FTFMpIHsKIAkJCWRldl9lcnIoZGV2LAogCQkJCSJUaGVyZSBpcyB0byBtYW55IGNoYW5uZWxzIGRlZmluZWQgaW4gRFRcbiIpOwogCQkJZ290byBlcnJvcl9vdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9kYWMvYWQ4ODAxLmMgYi9kcml2ZXJzL2lpby9kYWMvYWQ4ODAxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA2ZmFhMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL2RhYy9hZDg4MDEuYwpAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAqIElJTyBEQUMgZHJpdmVyIGZvciBBbmFsb2cgRGV2aWNlcyBBRDg4MDEgREFDCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEd3ZW5oYWVsIEdvYXZlYy1NZXJvdQorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKworI2RlZmluZSBBRDg4MDFfQ0ZHX0FERFJfT0ZGU0VUIDgKKworZW51bSBhZDg4MDFfZGV2aWNlX2lkcyB7CisJSURfQUQ4ODAxLAorCUlEX0FEODgwMywKK307CisKK3N0cnVjdCBhZDg4MDFfc3RhdGUgeworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGk7CisJdW5zaWduZWQgY2hhciBkYWNfY2FjaGVbOF07IC8qIFZhbHVlIHdyaXRlIG9uIGVhY2ggY2hhbm5lbCAqLworCXVuc2lnbmVkIGludCB2cmVmaF9tdjsKKwl1bnNpZ25lZCBpbnQgdnJlZmxfbXY7CisJc3RydWN0IHJlZ3VsYXRvciAqdnJlZmhfcmVnOworCXN0cnVjdCByZWd1bGF0b3IgKnZyZWZsX3JlZzsKKworCV9fYmUxNiBkYXRhIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKK307CisKK3N0YXRpYyBpbnQgYWQ4ODAxX3NwaV93cml0ZShzdHJ1Y3QgYWQ4ODAxX3N0YXRlICpzdGF0ZSwKKwl1OCBjaGFubmVsLCB1bnNpZ25lZCBjaGFyIHZhbHVlKQoreworCXN0YXRlLT5kYXRhID0gY3B1X3RvX2JlMTYoKGNoYW5uZWwgPDwgQUQ4ODAxX0NGR19BRERSX09GRlNFVCkgfCB2YWx1ZSk7CisJcmV0dXJuIHNwaV93cml0ZShzdGF0ZS0+c3BpLCAmc3RhdGUtPmRhdGEsIHNpemVvZihzdGF0ZS0+ZGF0YSkpOworfQorCitzdGF0aWMgaW50IGFkODgwMV93cml0ZV9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwgaW50IHZhbCwgaW50IHZhbDIsIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgYWQ4ODAxX3N0YXRlICpzdGF0ZSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldDsKKworCXN3aXRjaCAobWFzaykgeworCWNhc2UgSUlPX0NIQU5fSU5GT19SQVc6CisJCWlmICh2YWwgPj0gMjU2IHx8IHZhbCA8IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlyZXQgPSBhZDg4MDFfc3BpX3dyaXRlKHN0YXRlLCBjaGFuLT5jaGFubmVsLCB2YWwpOworCQlpZiAocmV0ID09IDApCisJCQlzdGF0ZS0+ZGFjX2NhY2hlW2NoYW4tPmNoYW5uZWxdID0gdmFsOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWQ4ODAxX3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sIGludCAqdmFsLCBpbnQgKnZhbDIsIGxvbmcgaW5mbykKK3sKKwlzdHJ1Y3QgYWQ4ODAxX3N0YXRlICpzdGF0ZSA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlzd2l0Y2ggKGluZm8pIHsKKwljYXNlIElJT19DSEFOX0lORk9fUkFXOgorCQkqdmFsID0gc3RhdGUtPmRhY19jYWNoZVtjaGFuLT5jaGFubmVsXTsKKwkJcmV0dXJuIElJT19WQUxfSU5UOworCWNhc2UgSUlPX0NIQU5fSU5GT19TQ0FMRToKKwkJKnZhbCA9IHN0YXRlLT52cmVmaF9tdiAtIHN0YXRlLT52cmVmbF9tdjsKKwkJKnZhbDIgPSA4OworCQlyZXR1cm4gSUlPX1ZBTF9GUkFDVElPTkFMX0xPRzI7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX09GRlNFVDoKKwkJKnZhbCA9IHN0YXRlLT52cmVmbF9tdjsKKwkJcmV0dXJuIElJT19WQUxfSU5UOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGFkODgwMV9pbmZvID0geworCS5yZWFkX3JhdyA9IGFkODgwMV9yZWFkX3JhdywKKwkud3JpdGVfcmF3ID0gYWQ4ODAxX3dyaXRlX3JhdywKKwkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorfTsKKworI2RlZmluZSBBRDg4MDFfQ0hBTk5FTChjaGFuKSB7CQlcCisJLnR5cGUgPSBJSU9fVk9MVEFHRSwJCQlcCisJLmluZGV4ZWQgPSAxLAkJCQlcCisJLm91dHB1dCA9IDEsCQkJCVwKKwkuY2hhbm5lbCA9IGNoYW4sCQkJXAorCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLCBcCisJLmluZm9fbWFza19zaGFyZWRfYnlfdHlwZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSB8CVwKKwkJQklUKElJT19DSEFOX0lORk9fT0ZGU0VUKSwgXAorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgYWQ4ODAxX2NoYW5uZWxzW10gPSB7CisJQUQ4ODAxX0NIQU5ORUwoMCksCisJQUQ4ODAxX0NIQU5ORUwoMSksCisJQUQ4ODAxX0NIQU5ORUwoMiksCisJQUQ4ODAxX0NIQU5ORUwoMyksCisJQUQ4ODAxX0NIQU5ORUwoNCksCisJQUQ4ODAxX0NIQU5ORUwoNSksCisJQUQ4ODAxX0NIQU5ORUwoNiksCisJQUQ4ODAxX0NIQU5ORUwoNyksCit9OworCitzdGF0aWMgaW50IGFkODgwMV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJc3RydWN0IGFkODgwMV9zdGF0ZSAqc3RhdGU7CisJY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgKmlkOworCWludCByZXQ7CisKKwlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoJnNwaS0+ZGV2LCBzaXplb2YoKnN0YXRlKSk7CisJaWYgKGluZGlvX2RldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0YXRlID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlzdGF0ZS0+c3BpID0gc3BpOworCWlkID0gc3BpX2dldF9kZXZpY2VfaWQoc3BpKTsKKworCXN0YXRlLT52cmVmaF9yZWcgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoJnNwaS0+ZGV2LCAidnJlZmgiKTsKKwlpZiAoSVNfRVJSKHN0YXRlLT52cmVmaF9yZWcpKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiVnJlZmggcmVndWxhdG9yIG5vdCBzcGVjaWZpZWRcbiIpOworCQlyZXR1cm4gUFRSX0VSUihzdGF0ZS0+dnJlZmhfcmVnKTsKKwl9CisKKwlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKHN0YXRlLT52cmVmaF9yZWcpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIHZyZWZoIHJlZ3VsYXRvcjogJWRcbiIsCisJCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Uoc3RhdGUtPnZyZWZoX3JlZyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJGYWlsZWQgdG8gcmVhZCB2cmVmaCByZWd1bGF0b3I6ICVkXG4iLAorCQkJCXJldCk7CisJCWdvdG8gZXJyb3JfZGlzYWJsZV92cmVmaF9yZWc7CisJfQorCXN0YXRlLT52cmVmaF9tdiA9IHJldCAvIDEwMDA7CisKKwlpZiAoaWQtPmRyaXZlcl9kYXRhID09IElEX0FEODgwMykgeworCQlzdGF0ZS0+dnJlZmxfcmVnID0gZGV2bV9yZWd1bGF0b3JfZ2V0KCZzcGktPmRldiwgInZyZWZsIik7CisJCWlmIChJU19FUlIoc3RhdGUtPnZyZWZsX3JlZykpIHsKKwkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiVnJlZmwgcmVndWxhdG9yIG5vdCBzcGVjaWZpZWRcbiIpOworCQkJcmV0ID0gUFRSX0VSUihzdGF0ZS0+dnJlZmxfcmVnKTsKKwkJCWdvdG8gZXJyb3JfZGlzYWJsZV92cmVmaF9yZWc7CisJCX0KKworCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKHN0YXRlLT52cmVmbF9yZWcpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZzcGktPmRldiwgIkZhaWxlZCB0byBlbmFibGUgdnJlZmwgcmVndWxhdG9yOiAlZFxuIiwKKwkJCQkJcmV0KTsKKwkJCWdvdG8gZXJyb3JfZGlzYWJsZV92cmVmaF9yZWc7CisJCX0KKworCQlyZXQgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Uoc3RhdGUtPnZyZWZsX3JlZyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZzcGktPmRldiwgIkZhaWxlZCB0byByZWFkIHZyZWZsIHJlZ3VsYXRvcjogJWRcbiIsCisJCQkJCXJldCk7CisJCQlnb3RvIGVycm9yX2Rpc2FibGVfdnJlZmxfcmVnOworCQl9CisJCXN0YXRlLT52cmVmbF9tdiA9IHJldCAvIDEwMDA7CisJfSBlbHNlIHsKKwkJc3RhdGUtPnZyZWZsX212ID0gMDsKKwkJc3RhdGUtPnZyZWZsX3JlZyA9IE5VTEw7CisJfQorCisJc3BpX3NldF9kcnZkYXRhKHNwaSwgaW5kaW9fZGV2KTsKKwlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJaW5kaW9fZGV2LT5pbmZvID0gJmFkODgwMV9pbmZvOworCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0gYWQ4ODAxX2NoYW5uZWxzOworCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShhZDg4MDFfY2hhbm5lbHMpOworCWluZGlvX2Rldi0+bmFtZSA9IGlkLT5uYW1lOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgaWlvIGRldmljZTogJWRcbiIsCisJCQkJcmV0KTsKKwkJZ290byBlcnJvcl9kaXNhYmxlX3ZyZWZsX3JlZzsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZGlzYWJsZV92cmVmbF9yZWc6CisJaWYgKHN0YXRlLT52cmVmbF9yZWcpCisJCXJlZ3VsYXRvcl9kaXNhYmxlKHN0YXRlLT52cmVmbF9yZWcpOworZXJyb3JfZGlzYWJsZV92cmVmaF9yZWc6CisJcmVndWxhdG9yX2Rpc2FibGUoc3RhdGUtPnZyZWZoX3JlZyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZDg4MDFfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCXN0cnVjdCBhZDg4MDFfc3RhdGUgKnN0YXRlID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChzdGF0ZS0+dnJlZmxfcmVnKQorCQlyZWd1bGF0b3JfZGlzYWJsZShzdGF0ZS0+dnJlZmxfcmVnKTsKKwlyZWd1bGF0b3JfZGlzYWJsZShzdGF0ZS0+dnJlZmhfcmVnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgYWQ4ODAxX2lkc1tdID0geworCXsiYWQ4ODAxIiwgSURfQUQ4ODAxfSwKKwl7ImFkODgwMyIsIElEX0FEODgwM30sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHNwaSwgYWQ4ODAxX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZDg4MDFfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gImFkODgwMSIsCisJfSwKKwkucHJvYmUJCT0gYWQ4ODAxX3Byb2JlLAorCS5yZW1vdmUJCT0gYWQ4ODAxX3JlbW92ZSwKKwkuaWRfdGFibGUJPSBhZDg4MDFfaWRzLAorfTsKK21vZHVsZV9zcGlfZHJpdmVyKGFkODgwMV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJHd2VuaGFlbCBHb2F2ZWMtTWVyb3UgPGd3ZW5oYWVsLmdvYXZlYy1tZXJvdUB0cmFidWNheXJlLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQUQ4ODAxL0FEODgwMyBEQUMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2RhYy9jaW8tZGFjLmMgYi9kcml2ZXJzL2lpby9kYWMvY2lvLWRhYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNzQzZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9kYWMvY2lvLWRhYy5jCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogSUlPIGRyaXZlciBmb3IgdGhlIE1lYXN1cmVtZW50IENvbXB1dGluZyBDSU8tREFDCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgV2lsbGlhbSBCcmVhdGhpdHQgR3JheQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgTWVhc3VyZW1lbnQgQ29tcHV0aW5nIGRldmljZXM6IENJTy1EQUMxNiwKKyAqIENJTy1EQUMwNiwgYW5kIFBDMTA0LURBQzA2LgorICovCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pc2EuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorCisjZGVmaW5lIENJT19EQUNfTlVNX0NIQU4gMTYKKworI2RlZmluZSBDSU9fREFDX0NIQU4oY2hhbikgewkJCQlcCisJLnR5cGUgPSBJSU9fVk9MVEFHRSwJCQkJXAorCS5jaGFubmVsID0gY2hhbiwJCQkJXAorCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLAlcCisJLmluZGV4ZWQgPSAxLAkJCQkJXAorCS5vdXRwdXQgPSAxCQkJCQlcCit9CisKKyNkZWZpbmUgQ0lPX0RBQ19FWFRFTlQgMzIKKworc3RhdGljIHVuc2lnbmVkIGludCBiYXNlW21heF9udW1faXNhX2RldihDSU9fREFDX0VYVEVOVCldOworc3RhdGljIHVuc2lnbmVkIGludCBudW1fY2lvX2RhYzsKK21vZHVsZV9wYXJhbV9hcnJheShiYXNlLCB1aW50LCAmbnVtX2Npb19kYWMsIDApOworTU9EVUxFX1BBUk1fREVTQyhiYXNlLCAiTWVhc3VyZW1lbnQgQ29tcHV0aW5nIENJTy1EQUMgYmFzZSBhZGRyZXNzZXMiKTsKKworLyoqCisgKiBzdHJ1Y3QgY2lvX2RhY19paW8gLSBJSU8gZGV2aWNlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKKyAqIEBjaGFuX291dF9zdGF0ZXM6CWNoYW5uZWxzJyBvdXRwdXQgc3RhdGVzCisgKiBAYmFzZToJCWJhc2UgcG9ydCBhZGRyZXNzIG9mIHRoZSBJSU8gZGV2aWNlCisgKi8KK3N0cnVjdCBjaW9fZGFjX2lpbyB7CisJaW50IGNoYW5fb3V0X3N0YXRlc1tDSU9fREFDX05VTV9DSEFOXTsKKwl1bnNpZ25lZCBpbnQgYmFzZTsKK307CisKK3N0YXRpYyBpbnQgY2lvX2RhY19yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCXN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLCBpbnQgKnZhbCwgaW50ICp2YWwyLCBsb25nIG1hc2spCit7CisJc3RydWN0IGNpb19kYWNfaWlvICpjb25zdCBwcml2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCWlmIChtYXNrICE9IElJT19DSEFOX0lORk9fUkFXKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSp2YWwgPSBwcml2LT5jaGFuX291dF9zdGF0ZXNbY2hhbi0+Y2hhbm5lbF07CisKKwlyZXR1cm4gSUlPX1ZBTF9JTlQ7Cit9CisKK3N0YXRpYyBpbnQgY2lvX2RhY193cml0ZV9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwgaW50IHZhbCwgaW50IHZhbDIsIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgY2lvX2RhY19paW8gKmNvbnN0IHByaXYgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWNvbnN0IHVuc2lnbmVkIGludCBjaGFuX2FkZHJfb2Zmc2V0ID0gMiAqIGNoYW4tPmNoYW5uZWw7CisKKwlpZiAobWFzayAhPSBJSU9fQ0hBTl9JTkZPX1JBVykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBEQUMgY2FuIG9ubHkgYWNjZXB0IHVwIHRvIGEgMTYtYml0IHZhbHVlICovCisJaWYgKCh1bnNpZ25lZCBpbnQpdmFsID4gNjU1MzUpCisJCXJldHVybiAtRUlOVkFMOworCisJcHJpdi0+Y2hhbl9vdXRfc3RhdGVzW2NoYW4tPmNoYW5uZWxdID0gdmFsOworCW91dHcodmFsLCBwcml2LT5iYXNlICsgY2hhbl9hZGRyX29mZnNldCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBjaW9fZGFjX2luZm8gPSB7CisJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKKwkucmVhZF9yYXcgPSBjaW9fZGFjX3JlYWRfcmF3LAorCS53cml0ZV9yYXcgPSBjaW9fZGFjX3dyaXRlX3JhdworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNpb19kYWNfY2hhbm5lbHNbQ0lPX0RBQ19OVU1fQ0hBTl0gPSB7CisJQ0lPX0RBQ19DSEFOKDApLCBDSU9fREFDX0NIQU4oMSksIENJT19EQUNfQ0hBTigyKSwgQ0lPX0RBQ19DSEFOKDMpLAorCUNJT19EQUNfQ0hBTig0KSwgQ0lPX0RBQ19DSEFOKDUpLCBDSU9fREFDX0NIQU4oNiksIENJT19EQUNfQ0hBTig3KSwKKwlDSU9fREFDX0NIQU4oOCksIENJT19EQUNfQ0hBTig5KSwgQ0lPX0RBQ19DSEFOKDEwKSwgQ0lPX0RBQ19DSEFOKDExKSwKKwlDSU9fREFDX0NIQU4oMTIpLCBDSU9fREFDX0NIQU4oMTMpLCBDSU9fREFDX0NIQU4oMTQpLCBDSU9fREFDX0NIQU4oMTUpCit9OworCitzdGF0aWMgaW50IGNpb19kYWNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaWQpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3QgY2lvX2RhY19paW8gKnByaXY7CisJdW5zaWduZWQgaW50IGk7CisKKwlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoZGV2LCBzaXplb2YoKnByaXYpKTsKKwlpZiAoIWluZGlvX2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoIWRldm1fcmVxdWVzdF9yZWdpb24oZGV2LCBiYXNlW2lkXSwgQ0lPX0RBQ19FWFRFTlQsCisJCWRldl9uYW1lKGRldikpKSB7CisJCWRldl9lcnIoZGV2LCAiVW5hYmxlIHRvIHJlcXVlc3QgcG9ydCBhZGRyZXNzZXMgKDB4JVgtMHglWClcbiIsCisJCQliYXNlW2lkXSwgYmFzZVtpZF0gKyBDSU9fREFDX0VYVEVOVCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaW5kaW9fZGV2LT5pbmZvID0gJmNpb19kYWNfaW5mbzsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IGNpb19kYWNfY2hhbm5lbHM7CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBDSU9fREFDX05VTV9DSEFOOworCWluZGlvX2Rldi0+bmFtZSA9IGRldl9uYW1lKGRldik7CisKKwlwcml2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlwcml2LT5iYXNlID0gYmFzZVtpZF07CisKKwkvKiBpbml0aWFsaXplIERBQyBvdXRwdXRzIHRvIDBWICovCisJZm9yIChpID0gMDsgaSA8IDMyOyBpICs9IDIpCisJCW91dHcoMCwgYmFzZVtpZF0gKyBpKTsKKworCXJldHVybiBkZXZtX2lpb19kZXZpY2VfcmVnaXN0ZXIoZGV2LCBpbmRpb19kZXYpOworfQorCitzdGF0aWMgc3RydWN0IGlzYV9kcml2ZXIgY2lvX2RhY19kcml2ZXIgPSB7CisJLnByb2JlID0gY2lvX2RhY19wcm9iZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJjaW8tZGFjIgorCX0KK307CisKK21vZHVsZV9pc2FfZHJpdmVyKGNpb19kYWNfZHJpdmVyLCBudW1fY2lvX2RhYyk7CisKK01PRFVMRV9BVVRIT1IoIldpbGxpYW0gQnJlYXRoaXR0IEdyYXkgPHZpbGhlbG0uZ3JheUBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1lYXN1cmVtZW50IENvbXB1dGluZyBDSU8tREFDIElJTyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2RhYy9zdHgxMDQuYyBiL2RyaXZlcnMvaWlvL2RhYy9zdHgxMDQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkyYTk3MS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2lpby9kYWMvc3R4MTA0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoKLSAqIERBQyBkcml2ZXIgZm9yIHRoZSBBcGV4IEVtYmVkZGVkIFN5c3RlbXMgU1RYMTA0Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgV2lsbGlhbSBCcmVhdGhpdHQgR3JheQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvL2RyaXZlci5oPgotI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KLSNpbmNsdWRlIDxsaW51eC9paW8vdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2lzYS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLQotI2RlZmluZSBTVFgxMDRfTlVNX0NIQU4gMgotCi0jZGVmaW5lIFNUWDEwNF9DSEFOKGNoYW4pIHsJCQkJXAotCS50eXBlID0gSUlPX1ZPTFRBR0UsCQkJCVwKLQkuY2hhbm5lbCA9IGNoYW4sCQkJCVwKLQkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwJXAotCS5pbmRleGVkID0gMSwJCQkJCVwKLQkub3V0cHV0ID0gMQkJCQkJXAotfQotCi0jZGVmaW5lIFNUWDEwNF9FWFRFTlQgMTYKLQotc3RhdGljIHVuc2lnbmVkIGludCBiYXNlW21heF9udW1faXNhX2RldihTVFgxMDRfRVhURU5UKV07Ci1zdGF0aWMgdW5zaWduZWQgaW50IG51bV9zdHgxMDQ7Ci1tb2R1bGVfcGFyYW1fYXJyYXkoYmFzZSwgdWludCwgJm51bV9zdHgxMDQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhiYXNlLCAiQXBleCBFbWJlZGRlZCBTeXN0ZW1zIFNUWDEwNCBiYXNlIGFkZHJlc3NlcyIpOwotCi0vKioKLSAqIHN0cnVjdCBzdHgxMDRfaWlvIC0gSUlPIGRldmljZSBwcml2YXRlIGRhdGEgc3RydWN0dXJlCi0gKiBAY2hhbl9vdXRfc3RhdGVzOgljaGFubmVscycgb3V0cHV0IHN0YXRlcwotICogQGJhc2U6CQliYXNlIHBvcnQgYWRkcmVzcyBvZiB0aGUgSUlPIGRldmljZQotICovCi1zdHJ1Y3Qgc3R4MTA0X2lpbyB7Ci0JdW5zaWduZWQgY2hhbl9vdXRfc3RhdGVzW1NUWDEwNF9OVU1fQ0hBTl07Ci0JdW5zaWduZWQgYmFzZTsKLX07Ci0KLS8qKgotICogc3RydWN0IHN0eDEwNF9ncGlvIC0gR1BJTyBkZXZpY2UgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQotICogQGNoaXA6CWluc3RhbmNlIG9mIHRoZSBncGlvX2NoaXAKLSAqIEBsb2NrOglzeW5jaHJvbml6YXRpb24gbG9jayB0byBwcmV2ZW50IEkvTyByYWNlIGNvbmRpdGlvbnMKLSAqIEBiYXNlOgliYXNlIHBvcnQgYWRkcmVzcyBvZiB0aGUgR1BJTyBkZXZpY2UKLSAqIEBvdXRfc3RhdGU6CW91dHB1dCBiaXRzIHN0YXRlCi0gKi8KLXN0cnVjdCBzdHgxMDRfZ3BpbyB7Ci0Jc3RydWN0IGdwaW9fY2hpcCBjaGlwOwotCXNwaW5sb2NrX3QgbG9jazsKLQl1bnNpZ25lZCBpbnQgYmFzZTsKLQl1bnNpZ25lZCBpbnQgb3V0X3N0YXRlOwotfTsKLQotc3RhdGljIGludCBzdHgxMDRfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKLQlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwgaW50ICp2YWwsIGludCAqdmFsMiwgbG9uZyBtYXNrKQotewotCXN0cnVjdCBzdHgxMDRfaWlvICpjb25zdCBwcml2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKLQotCWlmIChtYXNrICE9IElJT19DSEFOX0lORk9fUkFXKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCSp2YWwgPSBwcml2LT5jaGFuX291dF9zdGF0ZXNbY2hhbi0+Y2hhbm5lbF07Ci0KLQlyZXR1cm4gSUlPX1ZBTF9JTlQ7Ci19Ci0KLXN0YXRpYyBpbnQgc3R4MTA0X3dyaXRlX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAotCXN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLCBpbnQgdmFsLCBpbnQgdmFsMiwgbG9uZyBtYXNrKQotewotCXN0cnVjdCBzdHgxMDRfaWlvICpjb25zdCBwcml2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKLQljb25zdCB1bnNpZ25lZCBjaGFuX2FkZHJfb2Zmc2V0ID0gMiAqIGNoYW4tPmNoYW5uZWw7Ci0KLQlpZiAobWFzayAhPSBJSU9fQ0hBTl9JTkZPX1JBVykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwcml2LT5jaGFuX291dF9zdGF0ZXNbY2hhbi0+Y2hhbm5lbF0gPSB2YWw7Ci0Jb3V0dyh2YWwsIHByaXYtPmJhc2UgKyA0ICsgY2hhbl9hZGRyX29mZnNldCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBzdHgxMDRfaW5mbyA9IHsKLQkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAotCS5yZWFkX3JhdyA9IHN0eDEwNF9yZWFkX3JhdywKLQkud3JpdGVfcmF3ID0gc3R4MTA0X3dyaXRlX3JhdwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHN0eDEwNF9jaGFubmVsc1tTVFgxMDRfTlVNX0NIQU5dID0gewotCVNUWDEwNF9DSEFOKDApLAotCVNUWDEwNF9DSEFOKDEpCi19OwotCi1zdGF0aWMgaW50IHN0eDEwNF9ncGlvX2dldF9kaXJlY3Rpb24oc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKLQl1bnNpZ25lZCBpbnQgb2Zmc2V0KQotewotCWlmIChvZmZzZXQgPCA0KQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHN0eDEwNF9ncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAotCXVuc2lnbmVkIGludCBvZmZzZXQpCi17Ci0JaWYgKG9mZnNldCA+PSA0KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHN0eDEwNF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKLQl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBpbnQgdmFsdWUpCi17Ci0JaWYgKG9mZnNldCA8IDQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JY2hpcC0+c2V0KGNoaXAsIG9mZnNldCwgdmFsdWUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHN0eDEwNF9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQotewotCXN0cnVjdCBzdHgxMDRfZ3BpbyAqY29uc3Qgc3R4MTA0Z3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOwotCi0JaWYgKG9mZnNldCA+PSA0KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiAhIShpbmIoc3R4MTA0Z3Bpby0+YmFzZSkgJiBCSVQob2Zmc2V0KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0eDEwNF9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAotCWludCB2YWx1ZSkKLXsKLQlzdHJ1Y3Qgc3R4MTA0X2dwaW8gKmNvbnN0IHN0eDEwNGdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKLQljb25zdCB1bnNpZ25lZCBpbnQgbWFzayA9IEJJVChvZmZzZXQpID4+IDQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChvZmZzZXQgPCA0KQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3R4MTA0Z3Bpby0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKHZhbHVlKQotCQlzdHgxMDRncGlvLT5vdXRfc3RhdGUgfD0gbWFzazsKLQllbHNlCi0JCXN0eDEwNGdwaW8tPm91dF9zdGF0ZSAmPSB+bWFzazsKLQotCW91dGIoc3R4MTA0Z3Bpby0+b3V0X3N0YXRlLCBzdHgxMDRncGlvLT5iYXNlKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0eDEwNGdwaW8tPmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGludCBzdHgxMDRfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaWQpCi17Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKLQlzdHJ1Y3Qgc3R4MTA0X2lpbyAqcHJpdjsKLQlzdHJ1Y3Qgc3R4MTA0X2dwaW8gKnN0eDEwNGdwaW87Ci0JaW50IGVycjsKLQotCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYyhkZXYsIHNpemVvZigqcHJpdikpOwotCWlmICghaW5kaW9fZGV2KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXN0eDEwNGdwaW8gPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnN0eDEwNGdwaW8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXN0eDEwNGdwaW8pCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKCFkZXZtX3JlcXVlc3RfcmVnaW9uKGRldiwgYmFzZVtpZF0sIFNUWDEwNF9FWFRFTlQsCi0JCWRldl9uYW1lKGRldikpKSB7Ci0JCWRldl9lcnIoZGV2LCAiVW5hYmxlIHRvIGxvY2sgcG9ydCBhZGRyZXNzZXMgKDB4JVgtMHglWClcbiIsCi0JCQliYXNlW2lkXSwgYmFzZVtpZF0gKyBTVFgxMDRfRVhURU5UKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlpbmRpb19kZXYtPmluZm8gPSAmc3R4MTA0X2luZm87Ci0JaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOwotCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBzdHgxMDRfY2hhbm5lbHM7Ci0JaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBTVFgxMDRfTlVNX0NIQU47Ci0JaW5kaW9fZGV2LT5uYW1lID0gZGV2X25hbWUoZGV2KTsKLQotCXByaXYgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCXByaXYtPmJhc2UgPSBiYXNlW2lkXTsKLQotCS8qIGluaXRpYWxpemUgREFDIG91dHB1dCB0byAwViAqLwotCW91dHcoMCwgYmFzZVtpZF0gKyA0KTsKLQlvdXR3KDAsIGJhc2VbaWRdICsgNik7Ci0KLQllcnIgPSBkZXZtX2lpb19kZXZpY2VfcmVnaXN0ZXIoZGV2LCBpbmRpb19kZXYpOwotCWlmIChlcnIpIHsKLQkJZGV2X2VycihkZXYsICJJSU8gZGV2aWNlIHJlZ2lzdGVyaW5nIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCXN0eDEwNGdwaW8tPmNoaXAubGFiZWwgPSBkZXZfbmFtZShkZXYpOwotCXN0eDEwNGdwaW8tPmNoaXAucGFyZW50ID0gZGV2OwotCXN0eDEwNGdwaW8tPmNoaXAub3duZXIgPSBUSElTX01PRFVMRTsKLQlzdHgxMDRncGlvLT5jaGlwLmJhc2UgPSAtMTsKLQlzdHgxMDRncGlvLT5jaGlwLm5ncGlvID0gODsKLQlzdHgxMDRncGlvLT5jaGlwLmdldF9kaXJlY3Rpb24gPSBzdHgxMDRfZ3Bpb19nZXRfZGlyZWN0aW9uOwotCXN0eDEwNGdwaW8tPmNoaXAuZGlyZWN0aW9uX2lucHV0ID0gc3R4MTA0X2dwaW9fZGlyZWN0aW9uX2lucHV0OwotCXN0eDEwNGdwaW8tPmNoaXAuZGlyZWN0aW9uX291dHB1dCA9IHN0eDEwNF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQ7Ci0Jc3R4MTA0Z3Bpby0+Y2hpcC5nZXQgPSBzdHgxMDRfZ3Bpb19nZXQ7Ci0Jc3R4MTA0Z3Bpby0+Y2hpcC5zZXQgPSBzdHgxMDRfZ3Bpb19zZXQ7Ci0Jc3R4MTA0Z3Bpby0+YmFzZSA9IGJhc2VbaWRdICsgMzsKLQlzdHgxMDRncGlvLT5vdXRfc3RhdGUgPSAweDA7Ci0KLQlzcGluX2xvY2tfaW5pdCgmc3R4MTA0Z3Bpby0+bG9jayk7Ci0KLQlkZXZfc2V0X2RydmRhdGEoZGV2LCBzdHgxMDRncGlvKTsKLQotCWVyciA9IGdwaW9jaGlwX2FkZF9kYXRhKCZzdHgxMDRncGlvLT5jaGlwLCBzdHgxMDRncGlvKTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoZGV2LCAiR1BJTyByZWdpc3RlcmluZyBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzdHgxMDRfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGlkKQotewotCXN0cnVjdCBzdHgxMDRfZ3BpbyAqY29uc3Qgc3R4MTA0Z3BpbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JZ3Bpb2NoaXBfcmVtb3ZlKCZzdHgxMDRncGlvLT5jaGlwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGlzYV9kcml2ZXIgc3R4MTA0X2RyaXZlciA9IHsKLQkucHJvYmUgPSBzdHgxMDRfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAic3R4MTA0IgotCX0sCi0JLnJlbW92ZSA9IHN0eDEwNF9yZW1vdmUKLX07Ci0KLW1vZHVsZV9pc2FfZHJpdmVyKHN0eDEwNF9kcml2ZXIsIG51bV9zdHgxMDQpOwotCi1NT0RVTEVfQVVUSE9SKCJXaWxsaWFtIEJyZWF0aGl0dCBHcmF5IDx2aWxoZWxtLmdyYXlAZ21haWwuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJBcGV4IEVtYmVkZGVkIFN5c3RlbXMgU1RYMTA0IERBQyBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2d5cm8vc3NwX2d5cm9fc2Vuc29yLmMgYi9kcml2ZXJzL2lpby9neXJvL3NzcF9neXJvX3NlbnNvci5jCmluZGV4IDBhOGFmZGQuLjFmMjVmNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2d5cm8vc3NwX2d5cm9fc2Vuc29yLmMKKysrIGIvZHJpdmVycy9paW8vZ3lyby9zc3BfZ3lyb19zZW5zb3IuYwpAQCAtNzQsNyArNzQsNyBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgc3RydWN0IGlpb19pbmZvIHNzcF9neXJvX2lpb19pbmZvID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBzc3BfZ3lyb19paW9faW5mbyA9IHsKIAkucmVhZF9yYXcgPSAmc3NwX2d5cm9fcmVhZF9yYXcsCiAJLndyaXRlX3JhdyA9ICZzc3BfZ3lyb193cml0ZV9yYXcsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaHVtaWRpdHkvS2NvbmZpZyBiL2RyaXZlcnMvaWlvL2h1bWlkaXR5L0tjb25maWcKaW5kZXggNzM4YTg2ZC4uYjE3ZTJlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vaHVtaWRpdHkvS2NvbmZpZworKysgYi9kcml2ZXJzL2lpby9odW1pZGl0eS9LY29uZmlnCkBAIC02LDYgKzYsOCBAQAogY29uZmlnIEFNMjMxNQogICAgIHRyaXN0YXRlICJBb3NvbmcgQU0yMzE1IHJlbGF0aXZlIGh1bWlkaXR5IGFuZCB0ZW1wZXJhdHVyZSBzZW5zb3IiCiAgICAgZGVwZW5kcyBvbiBJMkMKKyAgICBzZWxlY3QgSUlPX0JVRkZFUgorICAgIHNlbGVjdCBJSU9fVFJJR0dFUkVEX0JVRkZFUgogICAgIGhlbHAKICAgICAgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgQW9zb25nIEFNMjMxNQogICAgICAgcmVsYXRpdmUgaHVtaWRpdHkgYW5kIGFtYmllbnQgdGVtcGVyYXR1cmUgc2Vuc29yLgpAQCAtMjYsMTEgKzI4LDExIEBACiAJdHJpc3RhdGUgIlRJIEhEQzEwMHggcmVsYXRpdmUgaHVtaWRpdHkgYW5kIHRlbXBlcmF0dXJlIHNlbnNvciIKIAlkZXBlbmRzIG9uIEkyQwogCWhlbHAKLQkgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBUSSBIREMxMDB4IHNlcmllcyBvZgotCSByZWxhdGl2ZSBodW1pZGl0eSBhbmQgdGVtcGVyYXR1cmUgc2Vuc29ycy4KKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgVGV4YXMgSW5zdHJ1bWVudHMKKwkgIEhEQzEwMDAgYW5kIEhEQzEwMDggcmVsYXRpdmUgaHVtaWRpdHkgYW5kIHRlbXBlcmF0dXJlIHNlbnNvcnMuCiAKLQkgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQotCSB3aWxsIGJlIGNhbGxlZCBoZGMxMDB4LgorCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaGRjMTAweC4KIAogY29uZmlnIEhUVTIxCiAJdHJpc3RhdGUgIk1lYXN1cmVtZW50IFNwZWNpYWx0aWVzIEhUVTIxIGh1bWlkaXR5ICYgdGVtcGVyYXR1cmUgc2Vuc29yIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaHVtaWRpdHkvYW0yMzE1LmMgYi9kcml2ZXJzL2lpby9odW1pZGl0eS9hbTIzMTUuYwppbmRleCAzZTIwMGY2Li5mZjk2YjZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9odW1pZGl0eS9hbTIzMTUuYworKysgYi9kcml2ZXJzL2lpby9odW1pZGl0eS9hbTIzMTUuYwpAQCAtMjQ0LDcgKzI0NCw3IEBACiAJaW5kaW9fZGV2LT5jaGFubmVscyA9IGFtMjMxNV9jaGFubmVsczsKIAlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUoYW0yMzE1X2NoYW5uZWxzKTsKIAotCXJldCA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3NldHVwKGluZGlvX2RldiwgTlVMTCwKKwlyZXQgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9zZXR1cChpbmRpb19kZXYsIGlpb19wb2xsZnVuY19zdG9yZV90aW1lLAogCQkJCQkgYW0yMzE1X3RyaWdnZXJfaGFuZGxlciwgTlVMTCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJpaW8gdHJpZ2dlcmVkIGJ1ZmZlciBzZXR1cCBmYWlsZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaHVtaWRpdHkvaGRjMTAweC5jIGIvZHJpdmVycy9paW8vaHVtaWRpdHkvaGRjMTAweC5jCmluZGV4IGEwMzgzMmEuLmUwYzljNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2h1bWlkaXR5L2hkYzEwMHguYworKysgYi9kcml2ZXJzL2lpby9odW1pZGl0eS9oZGMxMDB4LmMKQEAgLTE0Miw3ICsxNDIsNyBAQAogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAJaW50IGRlbGF5ID0gZGF0YS0+YWRjX2ludF91c1tjaGFuLT5hZGRyZXNzXTsKIAlpbnQgcmV0OwotCWludCB2YWw7CisJX19iZTE2IHZhbDsKIAogCS8qIHN0YXJ0IG1lYXN1cmVtZW50ICovCiAJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2xpZW50LCBjaGFuLT5hZGRyZXNzKTsKQEAgLTE1NCwyNiArMTU0LDEzIEBACiAJLyogd2FpdCBmb3IgaW50ZWdyYXRpb24gdGltZSB0byBwYXNzICovCiAJdXNsZWVwX3JhbmdlKGRlbGF5LCBkZWxheSArIDEwMDApOwogCi0JLyoKLQkgKiBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEgY2Fubm90KCkgYmUgdXNlZCBoZXJlIGR1ZSB0byB0aGUgY29tbWFuZAotCSAqIHZhbHVlIG5vdCBiZWluZyB1bmRlcnN0b29kIGFuZCBjYXVzZXMgTkFLcyBwcmV2ZW50aW5nIGFueSByZWFkaW5nCi0JICogZnJvbSBiZWluZyBhY2Nlc3NlZC4KLQkgKi8KLQlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlKGNsaWVudCk7CisJLyogcmVhZCBtZWFzdXJlbWVudCAqLworCXJldCA9IGkyY19tYXN0ZXJfcmVjdihkYXRhLT5jbGllbnQsIChjaGFyICopJnZhbCwgc2l6ZW9mKHZhbCkpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiY2Fubm90IHJlYWQgaGlnaCBieXRlIG1lYXN1cmVtZW50Iik7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiY2Fubm90IHJlYWQgc2Vuc29yIGRhdGFcbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KLQl2YWwgPSByZXQgPDwgODsKLQotCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGUoY2xpZW50KTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImNhbm5vdCByZWFkIGxvdyBieXRlIG1lYXN1cmVtZW50Iik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXZhbCB8PSByZXQ7Ci0KLQlyZXR1cm4gdmFsOworCXJldHVybiBiZTE2X3RvX2NwdSh2YWwpOwogfQogCiBzdGF0aWMgaW50IGhkYzEwMHhfZ2V0X2hlYXRlcl9zdGF0dXMoc3RydWN0IGhkYzEwMHhfZGF0YSAqZGF0YSkKQEAgLTI3Miw4ICsyNTksOCBAQAogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CiAJc3RydWN0IGhkYzEwMHhfZGF0YSAqZGF0YTsKIAotCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLAotCQkJCUkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSB8IEkyQ19GVU5DX1NNQlVTX0JZVEUpKQorCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEgfAorCQkJCSAgICAgSTJDX0ZVTkNfU01CVVNfQllURSB8IEkyQ19GVU5DX0kyQykpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqZGF0YSkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWJ1ZmZlci5jIGIvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWJ1ZmZlci5jCmluZGV4IDkwNDYyZmMuLjE1OGFhZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby1idWZmZXIuYworKysgYi9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tYnVmZmVyLmMKQEAgLTEwNyw5ICsxMDcsMTAgQEAKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBpaW9fYnVmZmVyICpyYiA9IGluZGlvX2Rldi0+YnVmZmVyOworCURFRklORV9XQUlUX0ZVTkMod2FpdCwgd29rZW5fd2FrZV9mdW5jdGlvbik7CiAJc2l6ZV90IGRhdHVtX3NpemU7CiAJc2l6ZV90IHRvX3dhaXQ7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKIAogCWlmICghaW5kaW9fZGV2LT5pbmZvKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTEzMSwxOSArMTMyLDI5IEBACiAJZWxzZQogCQl0b193YWl0ID0gbWluX3Qoc2l6ZV90LCBuIC8gZGF0dW1fc2l6ZSwgcmItPndhdGVybWFyayk7CiAKKwlhZGRfd2FpdF9xdWV1ZSgmcmItPnBvbGxxLCAmd2FpdCk7CiAJZG8gewotCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocmItPnBvbGxxLAotCQkgICAgICBpaW9fYnVmZmVyX3JlYWR5KGluZGlvX2RldiwgcmIsIHRvX3dhaXQsIG4gLyBkYXR1bV9zaXplKSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCQlpZiAoIWluZGlvX2Rldi0+aW5mbykgeworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCWJyZWFrOworCQl9CiAKLQkJaWYgKCFpbmRpb19kZXYtPmluZm8pCi0JCQlyZXR1cm4gLUVOT0RFVjsKKwkJaWYgKCFpaW9fYnVmZmVyX3JlYWR5KGluZGlvX2RldiwgcmIsIHRvX3dhaXQsIG4gLyBkYXR1bV9zaXplKSkgeworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCisJCQl3YWl0X3dva2VuKCZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUsCisJCQkJICAgTUFYX1NDSEVEVUxFX1RJTUVPVVQpOworCQkJY29udGludWU7CisJCX0KIAogCQlyZXQgPSByYi0+YWNjZXNzLT5yZWFkX2ZpcnN0X24ocmIsIG4sIGJ1Zik7CiAJCWlmIChyZXQgPT0gMCAmJiAoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKQogCQkJcmV0ID0gLUVBR0FJTjsKLQkgfSB3aGlsZSAocmV0ID09IDApOworCX0gd2hpbGUgKHJldCA9PSAwKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmcmItPnBvbGxxLCAmd2FpdCk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWNvcmUuYyBiL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby1jb3JlLmMKaW5kZXggZjkxNGQ1ZC4uZmMzNDBlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWNvcmUuYworKysgYi9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tY29yZS5jCkBAIC02MTMsOSArNjEzLDggQEAKIAkJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkLiUwOXVcbiIsIHZhbHNbMF0sIHZhbHNbMV0pOwogCWNhc2UgSUlPX1ZBTF9GUkFDVElPTkFMOgogCQl0bXAgPSBkaXZfczY0KChzNjQpdmFsc1swXSAqIDEwMDAwMDAwMDBMTCwgdmFsc1sxXSk7Ci0JCXZhbHNbMV0gPSBkb19kaXYodG1wLCAxMDAwMDAwMDAwTEwpOwotCQl2YWxzWzBdID0gdG1wOwotCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZC4lMDl1XG4iLCB2YWxzWzBdLCB2YWxzWzFdKTsKKwkJdmFsc1swXSA9IChpbnQpZGl2X3M2NF9yZW0odG1wLCAxMDAwMDAwMDAwLCAmdmFsc1sxXSk7CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkLiUwOXVcbiIsIHZhbHNbMF0sIGFicyh2YWxzWzFdKSk7CiAJY2FzZSBJSU9fVkFMX0ZSQUNUSU9OQUxfTE9HMjoKIAkJdG1wID0gKHM2NCl2YWxzWzBdICogMTAwMDAwMDAwMExMID4+IHZhbHNbMV07CiAJCXZhbHNbMV0gPSBkb19kaXYodG1wLCAxMDAwMDAwMDAwTEwpOwpAQCAtMTMwOSw3ICsxMzA4LDcgQEAKIAlpaW9fZGV2aWNlX2ZyZWUoKihzdHJ1Y3QgaWlvX2RldiAqKilyZXMpOwogfQogCi1zdGF0aWMgaW50IGRldm1faWlvX2RldmljZV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnJlcywgdm9pZCAqZGF0YSkKK2ludCBkZXZtX2lpb19kZXZpY2VfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpyZXMsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGlpb19kZXYgKipyID0gcmVzOwogCWlmICghciB8fCAhKnIpIHsKQEAgLTEzMTgsNiArMTMxNyw3IEBACiAJfQogCXJldHVybiAqciA9PSBkYXRhOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoZGV2bV9paW9fZGV2aWNlX21hdGNoKTsKIAogLyoqCiAgKiBkZXZtX2lpb19kZXZpY2VfYWxsb2MgLSBSZXNvdXJjZS1tYW5hZ2VkIGlpb19kZXZpY2VfYWxsb2MoKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWV2ZW50LmMgYi9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tZXZlbnQuYwppbmRleCAwZWJmYzkyLi45MGZhYzhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tZXZlbnQuYworKysgYi9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tZXZlbnQuYwpAQCAtNTcsNiArNTcsMTEgQEAKICAqCiAgKiBOb3RlOiBUaGUgY2FsbGVyIG11c3QgbWFrZSBzdXJlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBub3QgcnVubmluZwogICogY29uY3VycmVudGx5IGZvciB0aGUgc2FtZSBpbmRpb19kZXYgbW9yZSB0aGFuIG9uY2UuCisgKgorICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgc2FmZWx5IHVzZWQgYXMgc29vbiBhcyBhIHZhbGlkIHJlZmVyZW5jZSB0byBpaW9fZGV2IGhhcworICogYmVlbiBvYnRhaW5lZCB2aWEgaWlvX2RldmljZV9hbGxvYygpLCBidXQgYW55IGV2ZW50cyB0aGF0IGFyZSBzdWJtaXR0ZWQKKyAqIGJlZm9yZSBpaW9fZGV2aWNlX3JlZ2lzdGVyKCkgaGFzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgd2lsbCBiZSBzaWxlbnRseQorICogZGlzY2FyZGVkLgogICoqLwogaW50IGlpb19wdXNoX2V2ZW50KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHU2NCBldl9jb2RlLCBzNjQgdGltZXN0YW1wKQogewpAQCAtNjQsNiArNjksOSBAQAogCXN0cnVjdCBpaW9fZXZlbnRfZGF0YSBldjsKIAlpbnQgY29waWVkOwogCisJaWYgKCFldl9pbnQpCisJCXJldHVybiAwOworCiAJLyogRG9lcyBhbnlvbmUgY2FyZT8gKi8KIAlpZiAoaWlvX2V2ZW50X2VuYWJsZWQoZXZfaW50KSkgewogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tdHJpZ2dlci5jIGIvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLXRyaWdnZXIuYwppbmRleCA3YWQ4MmZkLi5lMWUxMDQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tdHJpZ2dlci5jCisrKyBiL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby10cmlnZ2VyLmMKQEAgLTExOSw2ICsxMTksMjIgQEAKIH0KIEVYUE9SVF9TWU1CT0woaWlvX3RyaWdnZXJfdW5yZWdpc3Rlcik7CiAKK2ludCBpaW9fdHJpZ2dlcl9zZXRfaW1tdXRhYmxlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZykKK3sKKwlpZiAoIWluZGlvX2RldiB8fCAhdHJpZykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlXQVJOX09OKGluZGlvX2Rldi0+dHJpZ19yZWFkb25seSk7CisKKwlpbmRpb19kZXYtPnRyaWcgPSBpaW9fdHJpZ2dlcl9nZXQodHJpZyk7CisJaW5kaW9fZGV2LT50cmlnX3JlYWRvbmx5ID0gdHJ1ZTsKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlpb190cmlnZ2VyX3NldF9pbW11dGFibGUpOworCiAvKiBTZWFyY2ggZm9yIHRyaWdnZXIgYnkgbmFtZSwgYXNzdW1pbmcgaWlvX3RyaWdnZXJfbGlzdF9sb2NrIGhlbGQgKi8KIHN0YXRpYyBzdHJ1Y3QgaWlvX3RyaWdnZXIgKl9faWlvX3RyaWdnZXJfZmluZF9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpCiB7CkBAIC0yNTUsNiArMjcxLDE0IEBACiAJCQlnb3RvIG91dF9mcmVlX2lycTsKIAl9CiAKKwkvKgorCSAqIENoZWNrIGlmIHdlIGp1c3QgcmVnaXN0ZXJlZCB0byBvdXIgb3duIHRyaWdnZXI6IHdlIGRldGVybWluZSB0aGF0CisJICogdGhpcyBpcyB0aGUgY2FzZSBpZiB0aGUgSUlPIGRldmljZSBhbmQgdGhlIHRyaWdnZXIgZGV2aWNlIHNoYXJlIHRoZQorCSAqIHNhbWUgcGFyZW50IGRldmljZS4KKwkgKi8KKwlpZiAocGYtPmluZGlvX2Rldi0+ZGV2LnBhcmVudCA9PSB0cmlnLT5kZXYucGFyZW50KQorCQl0cmlnLT5hdHRhY2hlZF9vd25fZGV2aWNlID0gdHJ1ZTsKKwogCXJldHVybiByZXQ7CiAKIG91dF9mcmVlX2lycToKQEAgLTI3OSw2ICszMDMsOCBAQAogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAl9CisJaWYgKHBmLT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPT0gdHJpZy0+ZGV2LnBhcmVudCkKKwkJdHJpZy0+YXR0YWNoZWRfb3duX2RldmljZSA9IGZhbHNlOwogCWlpb190cmlnZ2VyX3B1dF9pcnEodHJpZywgcGYtPmlycSk7CiAJZnJlZV9pcnEocGYtPmlycSwgcGYpOwogCW1vZHVsZV9wdXQocGYtPmluZGlvX2Rldi0+aW5mby0+ZHJpdmVyX21vZHVsZSk7CkBAIC0zODQsNiArNDEwLDEwIEBACiAJCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQorCWlmIChpbmRpb19kZXYtPnRyaWdfcmVhZG9ubHkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CiAJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKIAogCXRyaWcgPSBpaW9fdHJpZ2dlcl9maW5kX2J5X25hbWUoYnVmLCBsZW4pOwpAQCAtNjIyLDYgKzY1Miw3MSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZGV2bV9paW9fdHJpZ2dlcl9mcmVlKTsKIAorc3RhdGljIHZvaWQgZGV2bV9paW9fdHJpZ2dlcl91bnJlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnJlcykKK3sKKwlpaW9fdHJpZ2dlcl91bnJlZ2lzdGVyKCooc3RydWN0IGlpb190cmlnZ2VyICoqKXJlcyk7Cit9CisKKy8qKgorICogZGV2bV9paW9fdHJpZ2dlcl9yZWdpc3RlciAtIFJlc291cmNlLW1hbmFnZWQgaWlvX3RyaWdnZXJfcmVnaXN0ZXIoKQorICogQGRldjoJZGV2aWNlIHRoaXMgdHJpZ2dlciB3YXMgYWxsb2NhdGVkIGZvcgorICogQHRyaWdfaW5mbzoJdHJpZ2dlciB0byByZWdpc3RlcgorICoKKyAqIE1hbmFnZWQgaWlvX3RyaWdnZXJfcmVnaXN0ZXIoKS4gIFRoZSBJSU8gdHJpZ2dlciByZWdpc3RlcmVkIHdpdGggdGhpcworICogZnVuY3Rpb24gaXMgYXV0b21hdGljYWxseSB1bnJlZ2lzdGVyZWQgb24gZHJpdmVyIGRldGFjaC4gVGhpcyBmdW5jdGlvbgorICogY2FsbHMgaWlvX3RyaWdnZXJfcmVnaXN0ZXIoKSBpbnRlcm5hbGx5LiBSZWZlciB0byB0aGF0IGZ1bmN0aW9uIGZvciBtb3JlCisgKiBpbmZvcm1hdGlvbi4KKyAqCisgKiBJZiBhbiBpaW9fdHJpZ2dlciByZWdpc3RlcmVkIHdpdGggdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSB1bnJlZ2lzdGVyZWQKKyAqIHNlcGFyYXRlbHksIGRldm1faWlvX3RyaWdnZXJfdW5yZWdpc3RlcigpIG11c3QgYmUgdXNlZC4KKyAqCisgKiBSRVRVUk5TOgorICogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBudW1iZXIgb24gZmFpbHVyZS4KKyAqLworaW50IGRldm1faWlvX3RyaWdnZXJfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWdfaW5mbykKK3sKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIgKipwdHI7CisJaW50IHJldDsKKworCXB0ciA9IGRldnJlc19hbGxvYyhkZXZtX2lpb190cmlnZ2VyX3VucmVnLCBzaXplb2YoKnB0ciksIEdGUF9LRVJORUwpOworCWlmICghcHRyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCSpwdHIgPSB0cmlnX2luZm87CisJcmV0ID0gaWlvX3RyaWdnZXJfcmVnaXN0ZXIodHJpZ19pbmZvKTsKKwlpZiAoIXJldCkKKwkJZGV2cmVzX2FkZChkZXYsIHB0cik7CisJZWxzZQorCQlkZXZyZXNfZnJlZShwdHIpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRldm1faWlvX3RyaWdnZXJfcmVnaXN0ZXIpOworCisvKioKKyAqIGRldm1faWlvX3RyaWdnZXJfdW5yZWdpc3RlciAtIFJlc291cmNlLW1hbmFnZWQgaWlvX3RyaWdnZXJfdW5yZWdpc3RlcigpCisgKiBAZGV2OglkZXZpY2UgdGhpcyBpaW9fdHJpZ2dlciBiZWxvbmdzIHRvCisgKiBAdHJpZ19pbmZvOgl0aGUgdHJpZ2dlciBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZQorICoKKyAqIFVucmVnaXN0ZXIgdHJpZ2dlciByZWdpc3RlcmVkIHdpdGggZGV2bV9paW9fdHJpZ2dlcl9yZWdpc3RlcigpLgorICovCit2b2lkIGRldm1faWlvX3RyaWdnZXJfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZ19pbmZvKQoreworCWludCByYzsKKworCXJjID0gZGV2cmVzX3JlbGVhc2UoZGV2LCBkZXZtX2lpb190cmlnZ2VyX3VucmVnLCBkZXZtX2lpb190cmlnZ2VyX21hdGNoLAorCQkJICAgIHRyaWdfaW5mbyk7CisJV0FSTl9PTihyYyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZXZtX2lpb190cmlnZ2VyX3VucmVnaXN0ZXIpOworCitib29sIGlpb190cmlnZ2VyX3VzaW5nX293bihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXJldHVybiBpbmRpb19kZXYtPnRyaWctPmF0dGFjaGVkX293bl9kZXZpY2U7Cit9CitFWFBPUlRfU1lNQk9MKGlpb190cmlnZ2VyX3VzaW5nX293bik7CisKIHZvaWQgaWlvX2RldmljZV9yZWdpc3Rlcl90cmlnZ2VyX2NvbnN1bWVyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CiAJaW5kaW9fZGV2LT5ncm91cHNbaW5kaW9fZGV2LT5ncm91cGNvdW50ZXIrK10gPQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vbGlnaHQvS2NvbmZpZyBiL2RyaXZlcnMvaWlvL2xpZ2h0L0tjb25maWcKaW5kZXggN2M1NjZmNS4uYmEyZTY0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vbGlnaHQvS2NvbmZpZworKysgYi9kcml2ZXJzL2lpby9saWdodC9LY29uZmlnCkBAIC03Niw3ICs3Niw2IEBACiBjb25maWcgQkgxNzgwCiAJdHJpc3RhdGUgIlJPSE0gQkgxNzgwIGFtYmllbnQgbGlnaHQgc2Vuc29yIgogCWRlcGVuZHMgb24gSTJDCi0JZGVwZW5kcyBvbiAhU0VOU09SU19CSDE3ODAKIAloZWxwCiAJIFNheSBZIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIFJPSE0gQkgxNzgwR0xJIGFtYmllbnQKIAkgbGlnaHQgc2Vuc29yLgpAQCAtMjM4LDYgKzIzNyw4IEBACiAJdHJpc3RhdGUgIk1BWDQ0MDAwIEFtYmllbnQgYW5kIEluZnJhcmVkIFByb3hpbWl0eSBTZW5zb3IiCiAJZGVwZW5kcyBvbiBJMkMKIAlzZWxlY3QgUkVHTUFQX0kyQworCXNlbGVjdCBJSU9fQlVGRkVSCisJc2VsZWN0IElJT19UUklHR0VSRURfQlVGRkVSCiAJaGVscAogCSBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIE1heGltIEludGVncmF0ZWQncwogCSBNQVg0NDAwMCBhbWJpZW50IGFuZCBpbmZyYXJlZCBwcm94aW1pdHkgc2Vuc29yIGRldmljZS4KQEAgLTI2Niw2ICsyNjcsMTkgQEAKICAgICAgICAgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKICAgICAgICAgIHdpbGwgYmUgY2FsbGVkIHBhMTIyMDMwMDEuCiAKK2NvbmZpZyBTSTExNDUKKwl0cmlzdGF0ZSAiU0kxMTMyIGFuZCBTSTExNDEvMi8zLzUvNi83IGNvbWJpbmVkIEFMUywgVVYgaW5kZXggYW5kIHByb3hpbWl0eSBzZW5zb3IiCisJZGVwZW5kcyBvbiBJMkMKKwlzZWxlY3QgSUlPX0JVRkZFUgorCXNlbGVjdCBJSU9fVFJJR0dFUkVEX0JVRkZFUgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgYSBkcml2ZXIgZm9yIHRoZSBTaWxpY29uIExhYnMgU0kxMTMyIG9yCisJICBTSTExNDEvMi8zLzUvNi83IGNvbWJpbmVkIGFtYmllbnQgbGlnaHQsIFVWIGluZGV4IGFuZCBwcm94aW1pdHkgc2Vuc29yCisJICBjaGlwcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgc2kxMTQ1LgorCiBjb25maWcgU1RLMzMxMAogCXRyaXN0YXRlICJTVEszMzEwIEFMUyBhbmQgcHJveGltaXR5IHNlbnNvciIKIAlkZXBlbmRzIG9uIEkyQwpAQCAtMzMzLDExICszNDcsMTEgQEAKIAkgd2lsbCBiZSBjYWxsZWQgdXM1MTgyZC4KIAogY29uZmlnIFZDTkw0MDAwCi0JdHJpc3RhdGUgIlZDTkw0MDAwIGNvbWJpbmVkIEFMUyBhbmQgcHJveGltaXR5IHNlbnNvciIKKwl0cmlzdGF0ZSAiVkNOTDQwMDAvNDAxMC80MDIwIGNvbWJpbmVkIEFMUyBhbmQgcHJveGltaXR5IHNlbnNvciIKIAlkZXBlbmRzIG9uIEkyQwogCWhlbHAKLQkgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBhIGRyaXZlciBmb3IgdGhlIFZpc2hheSBWQ05MNDAwMAotCSBjb21iaW5lZCBhbWJpZW50IGxpZ2h0IGFuZCBwcm94aW1pdHkgc2Vuc29yLgorCSBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIGEgZHJpdmVyIGZvciB0aGUgVmlzaGF5IFZDTkw0MDAwLAorCSBWQ05MNDAxMCwgVkNOTDQwMjAgY29tYmluZWQgYW1iaWVudCBsaWdodCBhbmQgcHJveGltaXR5IHNlbnNvci4KIAogCSBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHZjbmw0MDAwLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vbGlnaHQvTWFrZWZpbGUgYi9kcml2ZXJzL2lpby9saWdodC9NYWtlZmlsZQppbmRleCA2ZjJhM2M2Mi4uYzU3NjhkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vbGlnaHQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9paW8vbGlnaHQvTWFrZWZpbGUKQEAgLTI2LDYgKzI2LDcgQEAKIG9iai0kKENPTkZJR19QQTEyMjAzMDAxKQkrPSBwYTEyMjAzMDAxLm8KIG9iai0kKENPTkZJR19SUFIwNTIxKQkJKz0gcnByMDUyMS5vCiBvYmotJChDT05GSUdfU0VOU09SU19UU0wyNTYzKQkrPSB0c2wyNTYzLm8KK29iai0kKENPTkZJR19TSTExNDUpCQkrPSBzaTExNDUubwogb2JqLSQoQ09ORklHX1NUSzMzMTApICAgICAgICAgICs9IHN0azMzMTAubwogb2JqLSQoQ09ORklHX1RDUzM0MTQpCQkrPSB0Y3MzNDE0Lm8KIG9iai0kKENPTkZJR19UQ1MzNDcyKQkJKz0gdGNzMzQ3Mi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9saWdodC9zaTExNDUuYyBiL2RyaXZlcnMvaWlvL2xpZ2h0L3NpMTE0NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NjAzNGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9saWdodC9zaTExNDUuYwpAQCAtMCwwICsxLDE0MDQgQEAKKy8qCisgKiBzaTExNDUuYyAtIFN1cHBvcnQgZm9yIFNpbGFicyBTSTExMzIgYW5kIFNJMTE0MS8yLzMvNS82LzcgY29tYmluZWQgYW1iaWVudAorICogbGlnaHQsIFVWIGluZGV4IGFuZCBwcm94aW1pdHkgc2Vuc29ycworICoKKyAqIENvcHlyaWdodCAyMDE0LTE2IFBldGVyIE1lZXJ3YWxkLVN0YWRsZXIgPHBtZWVyd0BwbWVlcncubmV0PgorICogQ29weXJpZ2h0IDIwMTYgQ3Jlc3RleiBEYW4gTGVvbmFyZCA8bGVvbmFyZC5jcmVzdGV6QGludGVsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdmVyc2lvbiAyIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbgorICogZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFNJMTEzMiAoNy1iaXQgSTJDIHNsYXZlIGFkZHJlc3MgMHg2MCkKKyAqIFNJMTE0MS8yLzMgKDctYml0IEkyQyBzbGF2ZSBhZGRyZXNzIDB4NWEpCisgKiBTSTExNDUvNi82ICg3LWJpdCBJMkMgc2xhdmUgYWRkcmVzcyAweDYwKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcl9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyZWRfYnVmZmVyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2J1ZmZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3V0aWxfbWFjcm9zLmg+CisKKyNkZWZpbmUgU0kxMTQ1X1JFR19QQVJUX0lECQkweDAwCisjZGVmaW5lIFNJMTE0NV9SRUdfUkVWX0lECQkweDAxCisjZGVmaW5lIFNJMTE0NV9SRUdfU0VRX0lECQkweDAyCisjZGVmaW5lIFNJMTE0NV9SRUdfSU5UX0NGRwkJMHgwMworI2RlZmluZSBTSTExNDVfUkVHX0lSUV9FTkFCTEUJCTB4MDQKKyNkZWZpbmUgU0kxMTQ1X1JFR19JUlFfTU9ERQkJMHgwNQorI2RlZmluZSBTSTExNDVfUkVHX0hXX0tFWQkJMHgwNworI2RlZmluZSBTSTExNDVfUkVHX01FQVNfUkFURQkJMHgwOAorI2RlZmluZSBTSTExNDVfUkVHX1BTX0xFRDIxCQkweDBmCisjZGVmaW5lIFNJMTE0NV9SRUdfUFNfTEVEMwkJMHgxMAorI2RlZmluZSBTSTExNDVfUkVHX1VDT0VGMQkJMHgxMworI2RlZmluZSBTSTExNDVfUkVHX1VDT0VGMgkJMHgxNAorI2RlZmluZSBTSTExNDVfUkVHX1VDT0VGMwkJMHgxNQorI2RlZmluZSBTSTExNDVfUkVHX1VDT0VGNAkJMHgxNgorI2RlZmluZSBTSTExNDVfUkVHX1BBUkFNX1dSCQkweDE3CisjZGVmaW5lIFNJMTE0NV9SRUdfQ09NTUFORAkJMHgxOAorI2RlZmluZSBTSTExNDVfUkVHX1JFU1BPTlNFCQkweDIwCisjZGVmaW5lIFNJMTE0NV9SRUdfSVJRX1NUQVRVUwkJMHgyMQorI2RlZmluZSBTSTExNDVfUkVHX0FMU1ZJU19EQVRBCQkweDIyCisjZGVmaW5lIFNJMTE0NV9SRUdfQUxTSVJfREFUQQkJMHgyNAorI2RlZmluZSBTSTExNDVfUkVHX1BTMV9EQVRBCQkweDI2CisjZGVmaW5lIFNJMTE0NV9SRUdfUFMyX0RBVEEJCTB4MjgKKyNkZWZpbmUgU0kxMTQ1X1JFR19QUzNfREFUQQkJMHgyYQorI2RlZmluZSBTSTExNDVfUkVHX0FVWF9EQVRBCQkweDJjCisjZGVmaW5lIFNJMTE0NV9SRUdfUEFSQU1fUkQJCTB4MmUKKyNkZWZpbmUgU0kxMTQ1X1JFR19DSElQX1NUQVQJCTB4MzAKKworI2RlZmluZSBTSTExNDVfVUNPRUYxX0RFRkFVTFQJCTB4N2IKKyNkZWZpbmUgU0kxMTQ1X1VDT0VGMl9ERUZBVUxUCQkweDZiCisjZGVmaW5lIFNJMTE0NV9VQ09FRjNfREVGQVVMVAkJMHgwMQorI2RlZmluZSBTSTExNDVfVUNPRUY0X0RFRkFVTFQJCTB4MDAKKworLyogSGVscGVyIHRvIGZpZ3VyZSBvdXQgUFNfTEVEIHJlZ2lzdGVyIC8gc2hpZnQgcGVyIGNoYW5uZWwgKi8KKyNkZWZpbmUgU0kxMTQ1X1BTX0xFRF9SRUcoY2gpIFwKKwkoKChjaCkgPT0gMikgPyBTSTExNDVfUkVHX1BTX0xFRDMgOiBTSTExNDVfUkVHX1BTX0xFRDIxKQorI2RlZmluZSBTSTExNDVfUFNfTEVEX1NISUZUKGNoKSBcCisJKCgoY2gpID09IDEpID8gNCA6IDApCisKKy8qIFBhcmFtZXRlciBvZmZzZXRzICovCisjZGVmaW5lIFNJMTE0NV9QQVJBTV9DSExJU1QJCTB4MDEKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX1BTTEVEMTJfU0VMRUNUCTB4MDIKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX1BTTEVEM19TRUxFQ1QJMHgwMworI2RlZmluZSBTSTExNDVfUEFSQU1fUFNfRU5DT0RJTkcJMHgwNQorI2RlZmluZSBTSTExNDVfUEFSQU1fQUxTX0VOQ09ESU5HCTB4MDYKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX1BTMV9BRENfTVVYCTB4MDcKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX1BTMl9BRENfTVVYCTB4MDgKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX1BTM19BRENfTVVYCTB4MDkKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX1BTX0FEQ19DT1VOVEVSCTB4MGEKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX1BTX0FEQ19HQUlOCTB4MGIKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX1BTX0FEQ19NSVNDCTB4MGMKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX0FMU19BRENfTVVYCTB4MGQKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX0FMU0lSX0FEQ19NVVgJMHgwZQorI2RlZmluZSBTSTExNDVfUEFSQU1fQVVYX0FEQ19NVVgJMHgwZgorI2RlZmluZSBTSTExNDVfUEFSQU1fQUxTVklTX0FEQ19DT1VOVEVSCTB4MTAKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX0FMU1ZJU19BRENfR0FJTgkweDExCisjZGVmaW5lIFNJMTE0NV9QQVJBTV9BTFNWSVNfQURDX01JU0MJMHgxMgorI2RlZmluZSBTSTExNDVfUEFSQU1fTEVEX1JFQ09WRVJZCTB4MWMKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX0FMU0lSX0FEQ19DT1VOVEVSCTB4MWQKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX0FMU0lSX0FEQ19HQUlOCTB4MWUKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX0FMU0lSX0FEQ19NSVNDCTB4MWYKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX0FEQ19PRkZTRVQJCTB4MWEKKworLyogQ2hhbm5lbCBlbmFibGUgbWFza3MgZm9yIENITElTVCBwYXJhbWV0ZXIgKi8KKyNkZWZpbmUgU0kxMTQ1X0NITElTVF9FTl9QUzEJCUJJVCgwKQorI2RlZmluZSBTSTExNDVfQ0hMSVNUX0VOX1BTMgkJQklUKDEpCisjZGVmaW5lIFNJMTE0NV9DSExJU1RfRU5fUFMzCQlCSVQoMikKKyNkZWZpbmUgU0kxMTQ1X0NITElTVF9FTl9BTFNWSVMJCUJJVCg0KQorI2RlZmluZSBTSTExNDVfQ0hMSVNUX0VOX0FMU0lSCQlCSVQoNSkKKyNkZWZpbmUgU0kxMTQ1X0NITElTVF9FTl9BVVgJCUJJVCg2KQorI2RlZmluZSBTSTExNDVfQ0hMSVNUX0VOX1VWCQlCSVQoNykKKworLyogUHJveGltaXR5IG1lYXN1cmVtZW50IG1vZGUgZm9yIEFEQ19NSVNDIHBhcmFtZXRlciAqLworI2RlZmluZSBTSTExNDVfUFNfQURDX01PREVfTk9STUFMCUJJVCgyKQorLyogU2lnbmFsIHJhbmdlIG1hc2sgZm9yIEFEQ19NSVNDIHBhcmFtZXRlciAqLworI2RlZmluZSBTSTExNDVfQURDX01JU0NfUkFOR0UJCUJJVCg1KQorCisvKiBDb21tYW5kcyBmb3IgUkVHX0NPTU1BTkQgKi8KKyNkZWZpbmUgU0kxMTQ1X0NNRF9OT1AJCQkweDAwCisjZGVmaW5lIFNJMTE0NV9DTURfUkVTRVQJCTB4MDEKKyNkZWZpbmUgU0kxMTQ1X0NNRF9QU19GT1JDRQkJMHgwNQorI2RlZmluZSBTSTExNDVfQ01EX0FMU19GT1JDRQkJMHgwNgorI2RlZmluZSBTSTExNDVfQ01EX1BTQUxTX0ZPUkNFCQkweDA3CisjZGVmaW5lIFNJMTE0NV9DTURfUFNfUEFVU0UJCTB4MDkKKyNkZWZpbmUgU0kxMTQ1X0NNRF9BTFNfUEFVU0UJCTB4MGEKKyNkZWZpbmUgU0kxMTQ1X0NNRF9QU0FMU19QQVVTRQkJMHgwYgorI2RlZmluZSBTSTExNDVfQ01EX1BTX0FVVE8JCTB4MGQKKyNkZWZpbmUgU0kxMTQ1X0NNRF9BTFNfQVVUTwkJMHgwZQorI2RlZmluZSBTSTExNDVfQ01EX1BTQUxTX0FVVE8JCTB4MGYKKyNkZWZpbmUgU0kxMTQ1X0NNRF9QQVJBTV9RVUVSWQkJMHg4MAorI2RlZmluZSBTSTExNDVfQ01EX1BBUkFNX1NFVAkJMHhhMAorCisjZGVmaW5lIFNJMTE0NV9SU1BfSU5WQUxJRF9TRVRUSU5HCTB4ODAKKyNkZWZpbmUgU0kxMTQ1X1JTUF9DT1VOVEVSX01BU0sJCTB4MEYKKworLyogTWluaW11bSBzbGVlcCBhZnRlciBlYWNoIGNvbW1hbmQgdG8gZW5zdXJlIGl0J3MgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgU0kxMTQ1X0NPTU1BTkRfTUlOU0xFRVBfTVMJNQorLyogUmV0dXJuIC1FVElNRURPVVQgYWZ0ZXIgdGhpcyBsb25nICovCisjZGVmaW5lIFNJMTE0NV9DT01NQU5EX1RJTUVPVVRfTVMJMjUKKworLyogSW50ZXJydXB0IGNvbmZpZ3VyYXRpb24gbWFza3MgZm9yIElOVF9DRkcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0kxMTQ1X0lOVF9DRkdfT0UJCUJJVCgwKSAvKiBlbmFibGUgaW50ZXJydXB0ICovCisjZGVmaW5lIFNJMTE0NV9JTlRfQ0ZHX01PREUJCUJJVCgxKSAvKiBhdXRvIHJlc2V0IGludGVycnVwdCBwaW4gKi8KKworLyogSW50ZXJydXB0IGVuYWJsZSBtYXNrcyBmb3IgSVJRX0VOQUJMRSByZWdpc3RlciAqLworI2RlZmluZSBTSTExNDVfTUFTS19BTExfSUUJCShCSVQoNCkgfCBCSVQoMykgfCBCSVQoMikgfCBCSVQoMCkpCisKKyNkZWZpbmUgU0kxMTQ1X01VWF9URU1QCQkJMHg2NQorI2RlZmluZSBTSTExNDVfTVVYX1ZERAkJCTB4NzUKKworLyogUHJveGltaXR5IExFRCBjdXJyZW50OyBzZWUgVGFibGUgMiBpbiBkYXRhc2hlZXQgKi8KKyNkZWZpbmUgU0kxMTQ1X0xFRF9DVVJSRU5UXzQ1bUEJCTB4MDQKKworZW51bSB7CisJU0kxMTMyLAorCVNJMTE0MSwKKwlTSTExNDIsCisJU0kxMTQzLAorCVNJMTE0NSwKKwlTSTExNDYsCisJU0kxMTQ3LAorfTsKKworc3RydWN0IHNpMTE0NV9wYXJ0X2luZm8geworCXU4IHBhcnQ7CisJY29uc3Qgc3RydWN0IGlpb19pbmZvICppaW9faW5mbzsKKwljb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbm5lbHM7CisJdW5zaWduZWQgaW50IG51bV9jaGFubmVsczsKKwl1bnNpZ25lZCBpbnQgbnVtX2xlZHM7CisJYm9vbCB1bmNvbXByZXNzZWRfbWVhc19yYXRlOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc2kxMTQ1X2RhdGEgLSBzaTExNDUgY2hpcCBzdGF0ZSBkYXRhCisgKiBAY2xpZW50OglJMkMgY2xpZW50CisgKiBAbG9jazoJbXV0ZXggdG8gcHJvdGVjdCBzaGFyZWQgc3RhdGUuCisgKiBAY21kbG9jazoJTG93LWxldmVsIG11dGV4IHRvIHByb3RlY3QgY29tbWFuZCBleGVjdXRpb24gb25seQorICogQHJzcF9zZXE6CU5leHQgZXhwZWN0ZWQgcmVzcG9uc2UgbnVtYmVyIG9yIC0xIGlmIGNvdW50ZXIgcmVzZXQgcmVxdWlyZWQKKyAqIEBzY2FuX21hc2s6CVNhdmVkIHNjYW4gbWFzayB0byBhdm9pZCBkdXBsaWNhdGUgc2V0X2NobGlzdAorICogQGF1dG9ub21vdXM6IElmIGF1dG9tYXRpYyBtZWFzdXJlbWVudHMgYXJlIGFjdGl2ZSAoZm9yIGJ1ZmZlciBzdXBwb3J0KQorICogQHBhcnRfaW5mbzoJUGFydCBpbmZvcm1hdGlvbgorICogQHRyaWc6CVBvaW50ZXIgdG8gaWlvIHRyaWdnZXIKKyAqIEBtZWFzX3JhdGU6CVZhbHVlIG9mIE1FQVNfUkFURSByZWdpc3Rlci4gT25seSBzZXQgaW4gSFcgaW4gYXV0byBtb2RlCisgKi8KK3N0cnVjdCBzaTExNDVfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlzdHJ1Y3QgbXV0ZXggY21kbG9jazsKKwlpbnQgcnNwX3NlcTsKKwljb25zdCBzdHJ1Y3Qgc2kxMTQ1X3BhcnRfaW5mbyAqcGFydF9pbmZvOworCXVuc2lnbmVkIGxvbmcgc2Nhbl9tYXNrOworCWJvb2wgYXV0b25vbW91czsKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWc7CisJaW50IG1lYXNfcmF0ZTsKK307CisKKy8qKgorICogX19zaTExNDVfY29tbWFuZF9yZXNldCgpIC0gU2VuZCBDTURfTk9QIGFuZCB3YWl0IGZvciByZXNwb25zZSAwCisgKgorICogRG9lcyBub3QgbW9kaWZ5IGRhdGEtPnJzcF9zZXEKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLgorICovCitzdGF0aWMgaW50IF9fc2kxMTQ1X2NvbW1hbmRfcmVzZXQoc3RydWN0IHNpMTE0NV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZkYXRhLT5jbGllbnQtPmRldjsKKwl1bnNpZ25lZCBsb25nIHN0b3BfamlmZmllczsKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIFNJMTE0NV9SRUdfQ09NTUFORCwKKwkJCQkJCSAgICAgIFNJMTE0NV9DTURfTk9QKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwltc2xlZXAoU0kxMTQ1X0NPTU1BTkRfTUlOU0xFRVBfTVMpOworCisJc3RvcF9qaWZmaWVzID0gamlmZmllcyArIFNJMTE0NV9DT01NQU5EX1RJTUVPVVRfTVMgKiBIWiAvIDEwMDA7CisJd2hpbGUgKHRydWUpIHsKKwkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJCQkJICAgICAgIFNJMTE0NV9SRUdfUkVTUE9OU0UpOworCQlpZiAocmV0IDw9IDApCisJCQlyZXR1cm4gcmV0OworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBzdG9wX2ppZmZpZXMpKSB7CisJCQlkZXZfd2FybihkZXYsICJ0aW1lb3V0IG9uIHJlc2V0XG4iKTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisJCW1zbGVlcChTSTExNDVfQ09NTUFORF9NSU5TTEVFUF9NUyk7CisJCWNvbnRpbnVlOworCX0KK30KKworLyoqCisgKiBzaTExNDVfY29tbWFuZCgpIC0gRXhlY3V0ZSBhIGNvbW1hbmQgYW5kIHBvbGwgdGhlIHJlc3BvbnNlIHJlZ2lzdGVyCisgKgorICogQWxsIGNvbnZlcnNpb24gb3ZlcmZsb3dzIGFyZSByZXBvcnRlZCBhcyAtRU9WRVJGTE9XCisgKiBJTlZBTElEX1NFVFRJTkcgaXMgcmVwb3J0ZWQgYXMgLUVJTlZBTAorICogVGltZW91dHMgYXJlIHJlcG9ydGVkIGFzIC1FVElNRURPVVQKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciAtZXJybm8gb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IHNpMTE0NV9jb21tYW5kKHN0cnVjdCBzaTExNDVfZGF0YSAqZGF0YSwgdTggY21kKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZkYXRhLT5jbGllbnQtPmRldjsKKwl1bnNpZ25lZCBsb25nIHN0b3BfamlmZmllczsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmZGF0YS0+Y21kbG9jayk7CisKKwlpZiAoZGF0YS0+cnNwX3NlcSA8IDApIHsKKwkJcmV0ID0gX19zaTExNDVfY29tbWFuZF9yZXNldChkYXRhKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlc2V0IGNvbW1hbmQgY291bnRlciwgcmV0PSVkXG4iLAorCQkJCXJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlkYXRhLT5yc3Bfc2VxID0gMDsKKwl9CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgU0kxMTQ1X1JFR19DT01NQU5ELCBjbWQpOworCWlmIChyZXQpIHsKKwkJZGV2X3dhcm4oZGV2LCAiZmFpbGVkIHRvIHdyaXRlIGNvbW1hbmQsIHJldD0lZFxuIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCS8qIFNsZWVwIGEgbGl0dGxlIHRvIGVuc3VyZSB0aGUgY29tbWFuZCBpcyByZWNlaXZlZCAqLworCW1zbGVlcChTSTExNDVfQ09NTUFORF9NSU5TTEVFUF9NUyk7CisKKwlzdG9wX2ppZmZpZXMgPSBqaWZmaWVzICsgU0kxMTQ1X0NPTU1BTkRfVElNRU9VVF9NUyAqIEhaIC8gMTAwMDsKKwl3aGlsZSAodHJ1ZSkgeworCQlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJCQkgICAgICAgU0kxMTQ1X1JFR19SRVNQT05TRSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfd2FybihkZXYsICJmYWlsZWQgdG8gcmVhZCByZXNwb25zZSwgcmV0PSVkXG4iLCByZXQpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKHJldCAmIH5TSTExNDVfUlNQX0NPVU5URVJfTUFTSykgPT0gMCkgeworCQkJaWYgKHJldCA9PSBkYXRhLT5yc3Bfc2VxKSB7CisJCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RvcF9qaWZmaWVzKSkgeworCQkJCQlkZXZfd2FybihkZXYsICJ0aW1lb3V0IG9uIGNvbW1hbmQgJSMwMmhoeFxuIiwKKwkJCQkJCSBjbWQpOworCQkJCQlyZXQgPSAtRVRJTUVET1VUOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJbXNsZWVwKFNJMTE0NV9DT01NQU5EX01JTlNMRUVQX01TKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChyZXQgPT0gKChkYXRhLT5yc3Bfc2VxICsgMSkgJgorCQkJCVNJMTE0NV9SU1BfQ09VTlRFUl9NQVNLKSkgeworCQkJCWRhdGEtPnJzcF9zZXEgPSByZXQ7CisJCQkJcmV0ID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRldl93YXJuKGRldiwgInVuZXhwZWN0ZWQgcmVzcG9uc2UgY291bnRlciAlZCBpbnN0ZWFkIG9mICVkXG4iLAorCQkJCSByZXQsIChkYXRhLT5yc3Bfc2VxICsgMSkgJgorCQkJCQlTSTExNDVfUlNQX0NPVU5URVJfTUFTSyk7CisJCQlyZXQgPSAtRUlPOworCQl9IGVsc2UgeworCQkJaWYgKHJldCA9PSBTSTExNDVfUlNQX0lOVkFMSURfU0VUVElORykgeworCQkJCWRldl93YXJuKGRldiwgIklOVkFMSURfU0VUVElORyBlcnJvciBvbiBjb21tYW5kICUjMDJoaHhcbiIsCisJCQkJCSBjbWQpOworCQkJCXJldCA9IC1FSU5WQUw7CisJCQl9IGVsc2UgeworCQkJCS8qIEFsbCBvdmVyZmxvd3MgYXJlIHRyZWF0ZWQgaWRlbnRpY2FsbHkgKi8KKwkJCQlkZXZfZGJnKGRldiwgIm92ZXJmbG93LCByZXQ9JWQsIGNtZD0lIzAyaGh4XG4iLAorCQkJCQlyZXQsIGNtZCk7CisJCQkJcmV0ID0gLUVPVkVSRkxPVzsKKwkJCX0KKwkJfQorCisJCS8qIEZvcmNlIGEgY291bnRlciByZXNldCBuZXh0IHRpbWUgKi8KKwkJZGF0YS0+cnNwX3NlcSA9IC0xOworCQlicmVhazsKKwl9CisKK291dDoKKwltdXRleF91bmxvY2soJmRhdGEtPmNtZGxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzaTExNDVfcGFyYW1fdXBkYXRlKHN0cnVjdCBzaTExNDVfZGF0YSAqZGF0YSwgdTggb3AsIHU4IHBhcmFtLAorCQkJICAgICAgIHU4IHZhbHVlKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJU0kxMTQ1X1JFR19QQVJBTV9XUiwgdmFsdWUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNpMTE0NV9jb21tYW5kKGRhdGEsIG9wIHwgKHBhcmFtICYgMHgxRikpOworfQorCitzdGF0aWMgaW50IHNpMTE0NV9wYXJhbV9zZXQoc3RydWN0IHNpMTE0NV9kYXRhICpkYXRhLCB1OCBwYXJhbSwgdTggdmFsdWUpCit7CisJcmV0dXJuIHNpMTE0NV9wYXJhbV91cGRhdGUoZGF0YSwgU0kxMTQ1X0NNRF9QQVJBTV9TRVQsIHBhcmFtLCB2YWx1ZSk7Cit9CisKKy8qIFNldCBwYXJhbS4gUmV0dXJucyBuZWdhdGl2ZSBlcnJubyBvciBjdXJyZW50IHZhbHVlICovCitzdGF0aWMgaW50IHNpMTE0NV9wYXJhbV9xdWVyeShzdHJ1Y3Qgc2kxMTQ1X2RhdGEgKmRhdGEsIHU4IHBhcmFtKQoreworCWludCByZXQ7CisKKwlyZXQgPSBzaTExNDVfY29tbWFuZChkYXRhLCBTSTExNDVfQ01EX1BBUkFNX1FVRVJZIHwgKHBhcmFtICYgMHgxRikpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIFNJMTE0NV9SRUdfUEFSQU1fUkQpOworfQorCisvKiBFeHBhbmQgOCBiaXQgY29tcHJlc3NlZCB2YWx1ZSB0byAxNiBiaXQsIHNlZSBTaWxhYnMgQU40OTggKi8KK3N0YXRpYyB1MTYgc2kxMTQ1X3VuY29tcHJlc3ModTggeCkKK3sKKwl1MTYgcmVzdWx0ID0gMDsKKwl1OCBleHBvbmVudCA9IDA7CisKKwlpZiAoeCA8IDgpCisJCXJldHVybiAwOworCisJZXhwb25lbnQgPSAoeCAmIDB4ZjApID4+IDQ7CisJcmVzdWx0ID0gMHgxMCB8ICh4ICYgMHgwZik7CisKKwlpZiAoZXhwb25lbnQgPj0gNCkKKwkJcmV0dXJuIHJlc3VsdCA8PCAoZXhwb25lbnQgLSA0KTsKKwlyZXR1cm4gcmVzdWx0ID4+ICg0IC0gZXhwb25lbnQpOworfQorCisvKiBDb21wcmVzcyAxNiBiaXQgdmFsdWUgdG8gOCBiaXQsIHNlZSBTaWxhYnMgQU40OTggKi8KK3N0YXRpYyB1OCBzaTExNDVfY29tcHJlc3ModTE2IHgpCit7CisJdTMyIGV4cG9uZW50ID0gMDsKKwl1MzIgc2lnbmlmaWNhbmQgPSAwOworCXUzMiB0bXAgPSB4OworCisJaWYgKHggPT0gMHgwMDAwKQorCQlyZXR1cm4gMHgwMDsKKwlpZiAoeCA9PSAweDAwMDEpCisJCXJldHVybiAweDA4OworCisJd2hpbGUgKDEpIHsKKwkJdG1wID4+PSAxOworCQlleHBvbmVudCArPSAxOworCQlpZiAodG1wID09IDEpCisJCQlicmVhazsKKwl9CisKKwlpZiAoZXhwb25lbnQgPCA1KSB7CisJCXNpZ25pZmljYW5kID0geCA8PCAoNCAtIGV4cG9uZW50KTsKKwkJcmV0dXJuIChleHBvbmVudCA8PCA0KSB8IChzaWduaWZpY2FuZCAmIDB4Rik7CisJfQorCisJc2lnbmlmaWNhbmQgPSB4ID4+IChleHBvbmVudCAtIDUpOworCWlmIChzaWduaWZpY2FuZCAmIDEpIHsKKwkJc2lnbmlmaWNhbmQgKz0gMjsKKwkJaWYgKHNpZ25pZmljYW5kICYgMHgwMDQwKSB7CisJCQlleHBvbmVudCArPSAxOworCQkJc2lnbmlmaWNhbmQgPj49IDE7CisJCX0KKwl9CisKKwlyZXR1cm4gKGV4cG9uZW50IDw8IDQpIHwgKChzaWduaWZpY2FuZCA+PiAxKSAmIDB4Rik7Cit9CisKKy8qIFdyaXRlIG1lYXNfcmF0ZSBpbiBoYXJkd2FyZSAqLworc3RhdGljIGludCBzaTExNDVfc2V0X21lYXNfcmF0ZShzdHJ1Y3Qgc2kxMTQ1X2RhdGEgKmRhdGEsIGludCBpbnRlcnZhbCkKK3sKKwlpZiAoZGF0YS0+cGFydF9pbmZvLT51bmNvbXByZXNzZWRfbWVhc19yYXRlKQorCQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShkYXRhLT5jbGllbnQsCisJCQlTSTExNDVfUkVHX01FQVNfUkFURSwgaW50ZXJ2YWwpOworCWVsc2UKKwkJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJU0kxMTQ1X1JFR19NRUFTX1JBVEUsIGludGVydmFsKTsKK30KKworc3RhdGljIGludCBzaTExNDVfcmVhZF9zYW1wX2ZyZXEoc3RydWN0IHNpMTE0NV9kYXRhICpkYXRhLCBpbnQgKnZhbCwgaW50ICp2YWwyKQoreworCSp2YWwgPSAzMjAwMDsKKwlpZiAoZGF0YS0+cGFydF9pbmZvLT51bmNvbXByZXNzZWRfbWVhc19yYXRlKQorCQkqdmFsMiA9IGRhdGEtPm1lYXNfcmF0ZTsKKwllbHNlCisJCSp2YWwyID0gc2kxMTQ1X3VuY29tcHJlc3MoZGF0YS0+bWVhc19yYXRlKTsKKwlyZXR1cm4gSUlPX1ZBTF9GUkFDVElPTkFMOworfQorCisvKiBTZXQgdGhlIHNhbXAgZnJlcSBpbiBkcml2ZXIgcHJpdmF0ZSBkYXRhICovCitzdGF0aWMgaW50IHNpMTE0NV9zdG9yZV9zYW1wX2ZyZXEoc3RydWN0IHNpMTE0NV9kYXRhICpkYXRhLCBpbnQgdmFsKQoreworCWludCByZXQgPSAwOworCWludCBtZWFzX3JhdGU7CisKKwlpZiAodmFsIDw9IDAgfHwgdmFsID4gMzIwMDApCisJCXJldHVybiAtRVJBTkdFOworCW1lYXNfcmF0ZSA9IDMyMDAwIC8gdmFsOworCisJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CisJaWYgKGRhdGEtPmF1dG9ub21vdXMpIHsKKwkJcmV0ID0gc2kxMTQ1X3NldF9tZWFzX3JhdGUoZGF0YSwgbWVhc19yYXRlKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKwlpZiAoZGF0YS0+cGFydF9pbmZvLT51bmNvbXByZXNzZWRfbWVhc19yYXRlKQorCQlkYXRhLT5tZWFzX3JhdGUgPSBtZWFzX3JhdGU7CisJZWxzZQorCQlkYXRhLT5tZWFzX3JhdGUgPSBzaTExNDVfY29tcHJlc3MobWVhc19yYXRlKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2kxMTQ1X3RyaWdnZXJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwcml2YXRlKQoreworCXN0cnVjdCBpaW9fcG9sbF9mdW5jICpwZiA9IHByaXZhdGU7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBmLT5pbmRpb19kZXY7CisJc3RydWN0IHNpMTE0NV9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwkvKgorCSAqIE1heGltdW0gYnVmZmVyIHNpemU6CisJICogICA2KjIgYnl0ZXMgY2hhbm5lbHMgZGF0YSArIDQgYnl0ZXMgYWxpZ25tZW50ICsKKwkgKiAgIDggYnl0ZXMgdGltZXN0YW1wCisJICovCisJdTggYnVmZmVyWzI0XTsKKwlpbnQgaSwgaiA9IDA7CisJaW50IHJldDsKKwl1OCBpcnFfc3RhdHVzID0gMDsKKworCWlmICghZGF0YS0+YXV0b25vbW91cykgeworCQlyZXQgPSBzaTExNDVfY29tbWFuZChkYXRhLCBTSTExNDVfQ01EX1BTQUxTX0ZPUkNFKTsKKwkJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FT1ZFUkZMT1cpCisJCQlnb3RvIGRvbmU7CisJfSBlbHNlIHsKKwkJaXJxX3N0YXR1cyA9IHJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCisJCQkJU0kxMTQ1X1JFR19JUlFfU1RBVFVTKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGRvbmU7CisJCWlmICghKGlycV9zdGF0dXMgJiBTSTExNDVfTUFTS19BTExfSUUpKQorCQkJZ290byBkb25lOworCX0KKworCWZvcl9lYWNoX3NldF9iaXQoaSwgaW5kaW9fZGV2LT5hY3RpdmVfc2Nhbl9tYXNrLAorCQlpbmRpb19kZXYtPm1hc2tsZW5ndGgpIHsKKwkJaW50IHJ1biA9IDE7CisKKwkJd2hpbGUgKGkgKyBydW4gPCBpbmRpb19kZXYtPm1hc2tsZW5ndGgpIHsKKwkJCWlmICghdGVzdF9iaXQoaSArIHJ1biwgaW5kaW9fZGV2LT5hY3RpdmVfc2Nhbl9tYXNrKSkKKwkJCQlicmVhazsKKwkJCWlmIChpbmRpb19kZXYtPmNoYW5uZWxzW2kgKyBydW5dLmFkZHJlc3MgIT0KKwkJCQlpbmRpb19kZXYtPmNoYW5uZWxzW2ldLmFkZHJlc3MgKyAyICogcnVuKQorCQkJCWJyZWFrOworCQkJcnVuKys7CisJCX0KKworCQlyZXQgPSBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YV9vcl9lbXVsYXRlZCgKKwkJCQlkYXRhLT5jbGllbnQsIGluZGlvX2Rldi0+Y2hhbm5lbHNbaV0uYWRkcmVzcywKKwkJCQlzaXplb2YodTE2KSAqIHJ1biwgJmJ1ZmZlcltqXSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBkb25lOworCQlqICs9IHJ1biAqIHNpemVvZih1MTYpOworCQlpICs9IHJ1biAtIDE7CisJfQorCisJaWYgKGRhdGEtPmF1dG9ub21vdXMpIHsKKwkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCisJCQkJU0kxMTQ1X1JFR19JUlFfU1RBVFVTLAorCQkJCWlycV9zdGF0dXMgJiBTSTExNDVfTUFTS19BTExfSUUpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZG9uZTsKKwl9CisKKwlpaW9fcHVzaF90b19idWZmZXJzX3dpdGhfdGltZXN0YW1wKGluZGlvX2RldiwgYnVmZmVyLAorCQlpaW9fZ2V0X3RpbWVfbnMoaW5kaW9fZGV2KSk7CisKK2RvbmU6CisJaWlvX3RyaWdnZXJfbm90aWZ5X2RvbmUoaW5kaW9fZGV2LT50cmlnKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgc2kxMTQ1X3NldF9jaGxpc3Qoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgdW5zaWduZWQgbG9uZyBzY2FuX21hc2spCit7CisJc3RydWN0IHNpMTE0NV9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1OCByZWcgPSAwLCBtdXg7CisJaW50IHJldDsKKwlpbnQgaTsKKworCS8qIGNoYW5uZWwgbGlzdCBhbHJlYWR5IHNldCwgbm8gbmVlZCB0byByZXByb2dyYW0gKi8KKwlpZiAoZGF0YS0+c2Nhbl9tYXNrID09IHNjYW5fbWFzaykKKwkJcmV0dXJuIDA7CisKKwlmb3JfZWFjaF9zZXRfYml0KGksICZzY2FuX21hc2ssIGluZGlvX2Rldi0+bWFza2xlbmd0aCkgeworCQlzd2l0Y2ggKGluZGlvX2Rldi0+Y2hhbm5lbHNbaV0uYWRkcmVzcykgeworCQljYXNlIFNJMTE0NV9SRUdfQUxTVklTX0RBVEE6CisJCQlyZWcgfD0gU0kxMTQ1X0NITElTVF9FTl9BTFNWSVM7CisJCQlicmVhazsKKwkJY2FzZSBTSTExNDVfUkVHX0FMU0lSX0RBVEE6CisJCQlyZWcgfD0gU0kxMTQ1X0NITElTVF9FTl9BTFNJUjsKKwkJCWJyZWFrOworCQljYXNlIFNJMTE0NV9SRUdfUFMxX0RBVEE6CisJCQlyZWcgfD0gU0kxMTQ1X0NITElTVF9FTl9QUzE7CisJCQlicmVhazsKKwkJY2FzZSBTSTExNDVfUkVHX1BTMl9EQVRBOgorCQkJcmVnIHw9IFNJMTE0NV9DSExJU1RfRU5fUFMyOworCQkJYnJlYWs7CisJCWNhc2UgU0kxMTQ1X1JFR19QUzNfREFUQToKKwkJCXJlZyB8PSBTSTExNDVfQ0hMSVNUX0VOX1BTMzsKKwkJCWJyZWFrOworCQljYXNlIFNJMTE0NV9SRUdfQVVYX0RBVEE6CisJCQlzd2l0Y2ggKGluZGlvX2Rldi0+Y2hhbm5lbHNbaV0udHlwZSkgeworCQkJY2FzZSBJSU9fVVZJTkRFWDoKKwkJCQlyZWcgfD0gU0kxMTQ1X0NITElTVF9FTl9VVjsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmVnIHw9IFNJMTE0NV9DSExJU1RfRU5fQVVYOworCQkJCWlmIChpbmRpb19kZXYtPmNoYW5uZWxzW2ldLnR5cGUgPT0gSUlPX1RFTVApCisJCQkJCW11eCA9IFNJMTE0NV9NVVhfVEVNUDsKKwkJCQllbHNlCisJCQkJCW11eCA9IFNJMTE0NV9NVVhfVkREOworCQkJCXJldCA9IHNpMTE0NV9wYXJhbV9zZXQoZGF0YSwKKwkJCQkJU0kxMTQ1X1BBUkFNX0FVWF9BRENfTVVYLCBtdXgpOworCQkJCWlmIChyZXQgPCAwKQorCQkJCQlyZXR1cm4gcmV0OworCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlkYXRhLT5zY2FuX21hc2sgPSBzY2FuX21hc2s7CisJcmV0ID0gc2kxMTQ1X3BhcmFtX3NldChkYXRhLCBTSTExNDVfUEFSQU1fQ0hMSVNULCByZWcpOworCisJcmV0dXJuIHJldCA8IDAgPyByZXQgOiAwOworfQorCitzdGF0aWMgaW50IHNpMTE0NV9tZWFzdXJlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuKQoreworCXN0cnVjdCBzaTExNDVfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJdTggY21kOworCWludCByZXQ7CisKKwlyZXQgPSBzaTExNDVfc2V0X2NobGlzdChpbmRpb19kZXYsIEJJVChjaGFuLT5zY2FuX2luZGV4KSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwljbWQgPSAoY2hhbi0+dHlwZSA9PSBJSU9fUFJPWElNSVRZKSA/IFNJMTE0NV9DTURfUFNfRk9SQ0UgOgorCQlTSTExNDVfQ01EX0FMU19GT1JDRTsKKwlyZXQgPSBzaTExNDVfY29tbWFuZChkYXRhLCBjbWQpOworCWlmIChyZXQgPCAwICYmIHJldCAhPSAtRU9WRVJGTE9XKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShkYXRhLT5jbGllbnQsIGNoYW4tPmFkZHJlc3MpOworfQorCisvKgorICogQ29udmVyc2lvbiBiZXR3ZWVuIGlpbyBzY2FsZSBhbmQgQURDX0dBSU4gdmFsdWVzCisgKiBUaGVzZSBjb3VsZCBiZSBmdXJ0aGVyIGFkanVzdGVkIGJ1dCBwcm94aW1pdHkvaW50ZW5zaXR5IGFyZSBkaW1lbnNpb25sZXNzCisgKi8KK3N0YXRpYyBjb25zdCBpbnQgc2kxMTQ1X3Byb3hpbWl0eV9zY2FsZV9hdmFpbGFibGVbXSA9IHsKKwkxMjgsIDY0LCAzMiwgMTYsIDgsIDR9Oworc3RhdGljIGNvbnN0IGludCBzaTExNDVfaW50ZW5zaXR5X3NjYWxlX2F2YWlsYWJsZVtdID0geworCTEyOCwgNjQsIDMyLCAxNiwgOCwgNCwgMiwgMX07CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoaW5fcHJveGltaXR5X3NjYWxlX2F2YWlsYWJsZSwKKwkiMTI4IDY0IDMyIDE2IDggNCIpOworc3RhdGljIElJT19DT05TVF9BVFRSKGluX2ludGVuc2l0eV9zY2FsZV9hdmFpbGFibGUsCisJIjEyOCA2NCAzMiAxNiA4IDQgMiAxIik7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoaW5faW50ZW5zaXR5X2lyX3NjYWxlX2F2YWlsYWJsZSwKKwkiMTI4IDY0IDMyIDE2IDggNCAyIDEiKTsKKworc3RhdGljIGludCBzaTExNDVfc2NhbGVfZnJvbV9hZGNnYWluKGludCByZWd2YWwpCit7CisJcmV0dXJuIDEyOCA+PiByZWd2YWw7Cit9CisKK3N0YXRpYyBpbnQgc2kxMTQ1X3Byb3hpbWl0eV9hZGNnYWluX2Zyb21fc2NhbGUoaW50IHZhbCwgaW50IHZhbDIpCit7CisJdmFsID0gZmluZF9jbG9zZXN0X2Rlc2NlbmRpbmcodmFsLCBzaTExNDVfcHJveGltaXR5X3NjYWxlX2F2YWlsYWJsZSwKKwkJCQlBUlJBWV9TSVpFKHNpMTE0NV9wcm94aW1pdHlfc2NhbGVfYXZhaWxhYmxlKSk7CisJaWYgKHZhbCA8IDAgfHwgdmFsID4gNSB8fCB2YWwyICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludCBzaTExNDVfaW50ZW5zaXR5X2FkY2dhaW5fZnJvbV9zY2FsZShpbnQgdmFsLCBpbnQgdmFsMikKK3sKKwl2YWwgPSBmaW5kX2Nsb3Nlc3RfZGVzY2VuZGluZyh2YWwsIHNpMTE0NV9pbnRlbnNpdHlfc2NhbGVfYXZhaWxhYmxlLAorCQkJCUFSUkFZX1NJWkUoc2kxMTQ1X2ludGVuc2l0eV9zY2FsZV9hdmFpbGFibGUpKTsKKwlpZiAodmFsIDwgMCB8fCB2YWwgPiA3IHx8IHZhbDIgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW50IHNpMTE0NV9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJCXN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJCWludCAqdmFsLCBpbnQgKnZhbDIsIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3Qgc2kxMTQ1X2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQ7CisJdTggcmVnOworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJc3dpdGNoIChjaGFuLT50eXBlKSB7CisJCWNhc2UgSUlPX0lOVEVOU0lUWToKKwkJY2FzZSBJSU9fUFJPWElNSVRZOgorCQljYXNlIElJT19WT0xUQUdFOgorCQljYXNlIElJT19URU1QOgorCQljYXNlIElJT19VVklOREVYOgorCQkJcmV0ID0gaWlvX2RldmljZV9jbGFpbV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQkJcmV0ID0gc2kxMTQ1X21lYXN1cmUoaW5kaW9fZGV2LCBjaGFuKTsKKwkJCWlpb19kZXZpY2VfcmVsZWFzZV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCisJCQkqdmFsID0gcmV0OworCisJCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJCWNhc2UgSUlPX0NVUlJFTlQ6CisJCQlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJCVNJMTE0NV9QU19MRURfUkVHKGNoYW4tPmNoYW5uZWwpKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisKKwkJCSp2YWwgPSAocmV0ID4+IFNJMTE0NV9QU19MRURfU0hJRlQoY2hhbi0+Y2hhbm5lbCkpCisJCQkJJiAweDBmOworCisJCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCWNhc2UgSUlPX0NIQU5fSU5GT19TQ0FMRToKKwkJc3dpdGNoIChjaGFuLT50eXBlKSB7CisJCWNhc2UgSUlPX1BST1hJTUlUWToKKwkJCXJlZyA9IFNJMTE0NV9QQVJBTV9QU19BRENfR0FJTjsKKwkJCWJyZWFrOworCQljYXNlIElJT19JTlRFTlNJVFk6CisJCQlpZiAoY2hhbi0+Y2hhbm5lbDIgPT0gSUlPX01PRF9MSUdIVF9JUikKKwkJCQlyZWcgPSBTSTExNDVfUEFSQU1fQUxTSVJfQURDX0dBSU47CisJCQllbHNlCisJCQkJcmVnID0gU0kxMTQ1X1BBUkFNX0FMU1ZJU19BRENfR0FJTjsKKwkJCWJyZWFrOworCQljYXNlIElJT19URU1QOgorCQkJKnZhbCA9IDI4OworCQkJKnZhbDIgPSA1NzE0Mjk7CisJCQlyZXR1cm4gSUlPX1ZBTF9JTlRfUExVU19NSUNSTzsKKwkJY2FzZSBJSU9fVVZJTkRFWDoKKwkJCSp2YWwgPSAwOworCQkJKnZhbDIgPSAxMDAwMDsKKwkJCXJldHVybiBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlyZXQgPSBzaTExNDVfcGFyYW1fcXVlcnkoZGF0YSwgcmVnKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCSp2YWwgPSBzaTExNDVfc2NhbGVfZnJvbV9hZGNnYWluKHJldCAmIDB4MDcpOworCisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwljYXNlIElJT19DSEFOX0lORk9fT0ZGU0VUOgorCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBJSU9fVEVNUDoKKwkJCS8qCisJCQkgKiAtQURDIG9mZnNldCAtIEFEQyBjb3VudHMgQCAyNcKwQyAtCisJCQkgKiAgIDM1ICogQURDIGNvdW50cyAvIMKwQworCQkJICovCisJCQkqdmFsID0gLTI1NiAtIDExMTM2ICsgMjUgKiAzNTsKKwkJCXJldHVybiBJSU9fVkFMX0lOVDsKKwkJZGVmYXVsdDoKKwkJCS8qCisJCQkgKiBBbGwgQURDIG1lYXN1cmVtZW50cyBoYXZlIGFyZSBieSBkZWZhdWx0IG9mZnNldAorCQkJICogYnkgLTI1NgorCQkJICogU2VlIEFONDk4IDUuNi4zCisJCQkgKi8KKwkJCXJldCA9IHNpMTE0NV9wYXJhbV9xdWVyeShkYXRhLCBTSTExNDVfUEFSQU1fQURDX09GRlNFVCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQkJKnZhbCA9IC1zaTExNDVfdW5jb21wcmVzcyhyZXQpOworCQkJcmV0dXJuIElJT19WQUxfSU5UOworCQl9CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUToKKwkJcmV0dXJuIHNpMTE0NV9yZWFkX3NhbXBfZnJlcShkYXRhLCB2YWwsIHZhbDIpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludCBzaTExNDVfd3JpdGVfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICAgICAgaW50IHZhbCwgaW50IHZhbDIsIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3Qgc2kxMTQ1X2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXU4IHJlZzEsIHJlZzIsIHNoaWZ0OworCWludCByZXQ7CisKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6CisJCXN3aXRjaCAoY2hhbi0+dHlwZSkgeworCQljYXNlIElJT19QUk9YSU1JVFk6CisJCQl2YWwgPSBzaTExNDVfcHJveGltaXR5X2FkY2dhaW5fZnJvbV9zY2FsZSh2YWwsIHZhbDIpOworCQkJaWYgKHZhbCA8IDApCisJCQkJcmV0dXJuIHZhbDsKKwkJCXJlZzEgPSBTSTExNDVfUEFSQU1fUFNfQURDX0dBSU47CisJCQlyZWcyID0gU0kxMTQ1X1BBUkFNX1BTX0FEQ19DT1VOVEVSOworCQkJYnJlYWs7CisJCWNhc2UgSUlPX0lOVEVOU0lUWToKKwkJCXZhbCA9IHNpMTE0NV9pbnRlbnNpdHlfYWRjZ2Fpbl9mcm9tX3NjYWxlKHZhbCwgdmFsMik7CisJCQlpZiAodmFsIDwgMCkKKwkJCQlyZXR1cm4gdmFsOworCQkJaWYgKGNoYW4tPmNoYW5uZWwyID09IElJT19NT0RfTElHSFRfSVIpIHsKKwkJCQlyZWcxID0gU0kxMTQ1X1BBUkFNX0FMU0lSX0FEQ19HQUlOOworCQkJCXJlZzIgPSBTSTExNDVfUEFSQU1fQUxTSVJfQURDX0NPVU5URVI7CisJCQl9IGVsc2UgeworCQkJCXJlZzEgPSBTSTExNDVfUEFSQU1fQUxTVklTX0FEQ19HQUlOOworCQkJCXJlZzIgPSBTSTExNDVfUEFSQU1fQUxTVklTX0FEQ19DT1VOVEVSOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXJldCA9IGlpb19kZXZpY2VfY2xhaW1fZGlyZWN0X21vZGUoaW5kaW9fZGV2KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gc2kxMTQ1X3BhcmFtX3NldChkYXRhLCByZWcxLCB2YWwpOworCQlpZiAocmV0IDwgMCkgeworCQkJaWlvX2RldmljZV9yZWxlYXNlX2RpcmVjdF9tb2RlKGluZGlvX2Rldik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCS8qIFNldCByZWNvdmVyeSBwZXJpb2QgdG8gb25lJ3MgY29tcGxlbWVudCBvZiBnYWluICovCisJCXJldCA9IHNpMTE0NV9wYXJhbV9zZXQoZGF0YSwgcmVnMiwgKH52YWwgJiAweDA3KSA8PCA0KTsKKwkJaWlvX2RldmljZV9yZWxlYXNlX2RpcmVjdF9tb2RlKGluZGlvX2Rldik7CisJCXJldHVybiByZXQ7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJaWYgKGNoYW4tPnR5cGUgIT0gSUlPX0NVUlJFTlQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAodmFsIDwgMCB8fCB2YWwgPiAxNSB8fCB2YWwyICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlyZWcxID0gU0kxMTQ1X1BTX0xFRF9SRUcoY2hhbi0+Y2hhbm5lbCk7CisJCXNoaWZ0ID0gU0kxMTQ1X1BTX0xFRF9TSElGVChjaGFuLT5jaGFubmVsKTsKKworCQlyZXQgPSBpaW9fZGV2aWNlX2NsYWltX2RpcmVjdF9tb2RlKGluZGlvX2Rldik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIHJlZzEpOworCQlpZiAocmV0IDwgMCkgeworCQkJaWlvX2RldmljZV9yZWxlYXNlX2RpcmVjdF9tb2RlKGluZGlvX2Rldik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCByZWcxLAorCQkJKHJldCAmIH4oMHgwZiA8PCBzaGlmdCkpIHwKKwkJCSgodmFsICYgMHgwZikgPDwgc2hpZnQpKTsKKwkJaWlvX2RldmljZV9yZWxlYXNlX2RpcmVjdF9tb2RlKGluZGlvX2Rldik7CisJCXJldHVybiByZXQ7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUToKKwkJcmV0dXJuIHNpMTE0NV9zdG9yZV9zYW1wX2ZyZXEoZGF0YSwgdmFsKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKKyNkZWZpbmUgU0kxMTQ1X1NUIHsgXAorCS5zaWduID0gJ3UnLCBcCisJLnJlYWxiaXRzID0gMTYsIFwKKwkuc3RvcmFnZWJpdHMgPSAxNiwgXAorCS5lbmRpYW5uZXNzID0gSUlPX0xFLCBcCit9CisKKyNkZWZpbmUgU0kxMTQ1X0lOVEVOU0lUWV9DSEFOTkVMKF9zaSkgeyBcCisJLnR5cGUgPSBJSU9fSU5URU5TSVRZLCBcCisJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVykgfCBcCisJCQkgICAgICBCSVQoSUlPX0NIQU5fSU5GT19PRkZTRVQpIHwgXAorCQkJICAgICAgQklUKElJT19DSEFOX0lORk9fU0NBTEUpLCBcCisJLmluZm9fbWFza19zaGFyZWRfYnlfYWxsID0gQklUKElJT19DSEFOX0lORk9fU0FNUF9GUkVRKSwgXAorCS5zY2FuX3R5cGUgPSBTSTExNDVfU1QsIFwKKwkuc2Nhbl9pbmRleCA9IF9zaSwgXAorCS5hZGRyZXNzID0gU0kxMTQ1X1JFR19BTFNWSVNfREFUQSwgXAorfQorCisjZGVmaW5lIFNJMTE0NV9JTlRFTlNJVFlfSVJfQ0hBTk5FTChfc2kpIHsgXAorCS50eXBlID0gSUlPX0lOVEVOU0lUWSwgXAorCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpIHwgXAorCQkJICAgICAgQklUKElJT19DSEFOX0lORk9fT0ZGU0VUKSB8IFwKKwkJCSAgICAgIEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSwgXAorCS5pbmZvX21hc2tfc2hhcmVkX2J5X2FsbCA9IEJJVChJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUSksIFwKKwkubW9kaWZpZWQgPSAxLCBcCisJLmNoYW5uZWwyID0gSUlPX01PRF9MSUdIVF9JUiwgXAorCS5zY2FuX3R5cGUgPSBTSTExNDVfU1QsIFwKKwkuc2Nhbl9pbmRleCA9IF9zaSwgXAorCS5hZGRyZXNzID0gU0kxMTQ1X1JFR19BTFNJUl9EQVRBLCBcCit9CisKKyNkZWZpbmUgU0kxMTQ1X1RFTVBfQ0hBTk5FTChfc2kpIHsgXAorCS50eXBlID0gSUlPX1RFTVAsIFwKKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSB8IFwKKwkJCSAgICAgIEJJVChJSU9fQ0hBTl9JTkZPX09GRlNFVCkgfCBcCisJCQkgICAgICBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSksIFwKKwkuaW5mb19tYXNrX3NoYXJlZF9ieV9hbGwgPSBCSVQoSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVEpLCBcCisJLnNjYW5fdHlwZSA9IFNJMTE0NV9TVCwgXAorCS5zY2FuX2luZGV4ID0gX3NpLCBcCisJLmFkZHJlc3MgPSBTSTExNDVfUkVHX0FVWF9EQVRBLCBcCit9CisKKyNkZWZpbmUgU0kxMTQ1X1VWX0NIQU5ORUwoX3NpKSB7IFwKKwkudHlwZSA9IElJT19VVklOREVYLCBcCisJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVykgfCBcCisJCQkgICAgICBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSksIFwKKwkuaW5mb19tYXNrX3NoYXJlZF9ieV9hbGwgPSBCSVQoSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVEpLCBcCisJLnNjYW5fdHlwZSA9IFNJMTE0NV9TVCwgXAorCS5zY2FuX2luZGV4ID0gX3NpLCBcCisJLmFkZHJlc3MgPSBTSTExNDVfUkVHX0FVWF9EQVRBLCBcCit9CisKKyNkZWZpbmUgU0kxMTQ1X1BST1hJTUlUWV9DSEFOTkVMKF9zaSwgX2NoKSB7IFwKKwkudHlwZSA9IElJT19QUk9YSU1JVFksIFwKKwkuaW5kZXhlZCA9IDEsIFwKKwkuY2hhbm5lbCA9IF9jaCwgXAorCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLCBcCisJLmluZm9fbWFza19zaGFyZWRfYnlfdHlwZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSB8IFwKKwkJCQkgICAgQklUKElJT19DSEFOX0lORk9fT0ZGU0VUKSwgXAorCS5pbmZvX21hc2tfc2hhcmVkX2J5X2FsbCA9IEJJVChJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUSksIFwKKwkuc2Nhbl90eXBlID0gU0kxMTQ1X1NULCBcCisJLnNjYW5faW5kZXggPSBfc2ksIFwKKwkuYWRkcmVzcyA9IFNJMTE0NV9SRUdfUFMxX0RBVEEgKyBfY2ggKiAyLCBcCit9CisKKyNkZWZpbmUgU0kxMTQ1X1ZPTFRBR0VfQ0hBTk5FTChfc2kpIHsgXAorCS50eXBlID0gSUlPX1ZPTFRBR0UsIFwKKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwgXAorCS5pbmZvX21hc2tfc2hhcmVkX2J5X2FsbCA9IEJJVChJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUSksIFwKKwkuc2Nhbl90eXBlID0gU0kxMTQ1X1NULCBcCisJLnNjYW5faW5kZXggPSBfc2ksIFwKKwkuYWRkcmVzcyA9IFNJMTE0NV9SRUdfQVVYX0RBVEEsIFwKK30KKworI2RlZmluZSBTSTExNDVfQ1VSUkVOVF9DSEFOTkVMKF9jaCkgeyBcCisJLnR5cGUgPSBJSU9fQ1VSUkVOVCwgXAorCS5pbmRleGVkID0gMSwgXAorCS5jaGFubmVsID0gX2NoLCBcCisJLm91dHB1dCA9IDEsIFwKKwkuc2Nhbl9pbmRleCA9IC0xLCBcCisJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVyksIFwKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHNpMTEzMl9jaGFubmVsc1tdID0geworCVNJMTE0NV9JTlRFTlNJVFlfQ0hBTk5FTCgwKSwKKwlTSTExNDVfSU5URU5TSVRZX0lSX0NIQU5ORUwoMSksCisJU0kxMTQ1X1RFTVBfQ0hBTk5FTCgyKSwKKwlTSTExNDVfVk9MVEFHRV9DSEFOTkVMKDMpLAorCVNJMTE0NV9VVl9DSEFOTkVMKDQpLAorCUlJT19DSEFOX1NPRlRfVElNRVNUQU1QKDYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHNpMTE0MV9jaGFubmVsc1tdID0geworCVNJMTE0NV9JTlRFTlNJVFlfQ0hBTk5FTCgwKSwKKwlTSTExNDVfSU5URU5TSVRZX0lSX0NIQU5ORUwoMSksCisJU0kxMTQ1X1BST1hJTUlUWV9DSEFOTkVMKDIsIDApLAorCVNJMTE0NV9URU1QX0NIQU5ORUwoMyksCisJU0kxMTQ1X1ZPTFRBR0VfQ0hBTk5FTCg0KSwKKwlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCg1KSwKKwlTSTExNDVfQ1VSUkVOVF9DSEFOTkVMKDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHNpMTE0Ml9jaGFubmVsc1tdID0geworCVNJMTE0NV9JTlRFTlNJVFlfQ0hBTk5FTCgwKSwKKwlTSTExNDVfSU5URU5TSVRZX0lSX0NIQU5ORUwoMSksCisJU0kxMTQ1X1BST1hJTUlUWV9DSEFOTkVMKDIsIDApLAorCVNJMTE0NV9QUk9YSU1JVFlfQ0hBTk5FTCgzLCAxKSwKKwlTSTExNDVfVEVNUF9DSEFOTkVMKDQpLAorCVNJMTE0NV9WT0xUQUdFX0NIQU5ORUwoNSksCisJSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoNiksCisJU0kxMTQ1X0NVUlJFTlRfQ0hBTk5FTCgwKSwKKwlTSTExNDVfQ1VSUkVOVF9DSEFOTkVMKDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHNpMTE0M19jaGFubmVsc1tdID0geworCVNJMTE0NV9JTlRFTlNJVFlfQ0hBTk5FTCgwKSwKKwlTSTExNDVfSU5URU5TSVRZX0lSX0NIQU5ORUwoMSksCisJU0kxMTQ1X1BST1hJTUlUWV9DSEFOTkVMKDIsIDApLAorCVNJMTE0NV9QUk9YSU1JVFlfQ0hBTk5FTCgzLCAxKSwKKwlTSTExNDVfUFJPWElNSVRZX0NIQU5ORUwoNCwgMiksCisJU0kxMTQ1X1RFTVBfQ0hBTk5FTCg1KSwKKwlTSTExNDVfVk9MVEFHRV9DSEFOTkVMKDYpLAorCUlJT19DSEFOX1NPRlRfVElNRVNUQU1QKDcpLAorCVNJMTE0NV9DVVJSRU5UX0NIQU5ORUwoMCksCisJU0kxMTQ1X0NVUlJFTlRfQ0hBTk5FTCgxKSwKKwlTSTExNDVfQ1VSUkVOVF9DSEFOTkVMKDIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHNpMTE0NV9jaGFubmVsc1tdID0geworCVNJMTE0NV9JTlRFTlNJVFlfQ0hBTk5FTCgwKSwKKwlTSTExNDVfSU5URU5TSVRZX0lSX0NIQU5ORUwoMSksCisJU0kxMTQ1X1BST1hJTUlUWV9DSEFOTkVMKDIsIDApLAorCVNJMTE0NV9URU1QX0NIQU5ORUwoMyksCisJU0kxMTQ1X1ZPTFRBR0VfQ0hBTk5FTCg0KSwKKwlTSTExNDVfVVZfQ0hBTk5FTCg1KSwKKwlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCg2KSwKKwlTSTExNDVfQ1VSUkVOVF9DSEFOTkVMKDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHNpMTE0Nl9jaGFubmVsc1tdID0geworCVNJMTE0NV9JTlRFTlNJVFlfQ0hBTk5FTCgwKSwKKwlTSTExNDVfSU5URU5TSVRZX0lSX0NIQU5ORUwoMSksCisJU0kxMTQ1X1RFTVBfQ0hBTk5FTCgyKSwKKwlTSTExNDVfVk9MVEFHRV9DSEFOTkVMKDMpLAorCVNJMTE0NV9VVl9DSEFOTkVMKDQpLAorCVNJMTE0NV9QUk9YSU1JVFlfQ0hBTk5FTCg1LCAwKSwKKwlTSTExNDVfUFJPWElNSVRZX0NIQU5ORUwoNiwgMSksCisJSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoNyksCisJU0kxMTQ1X0NVUlJFTlRfQ0hBTk5FTCgwKSwKKwlTSTExNDVfQ1VSUkVOVF9DSEFOTkVMKDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHNpMTE0N19jaGFubmVsc1tdID0geworCVNJMTE0NV9JTlRFTlNJVFlfQ0hBTk5FTCgwKSwKKwlTSTExNDVfSU5URU5TSVRZX0lSX0NIQU5ORUwoMSksCisJU0kxMTQ1X1BST1hJTUlUWV9DSEFOTkVMKDIsIDApLAorCVNJMTE0NV9QUk9YSU1JVFlfQ0hBTk5FTCgzLCAxKSwKKwlTSTExNDVfUFJPWElNSVRZX0NIQU5ORUwoNCwgMiksCisJU0kxMTQ1X1RFTVBfQ0hBTk5FTCg1KSwKKwlTSTExNDVfVk9MVEFHRV9DSEFOTkVMKDYpLAorCVNJMTE0NV9VVl9DSEFOTkVMKDcpLAorCUlJT19DSEFOX1NPRlRfVElNRVNUQU1QKDgpLAorCVNJMTE0NV9DVVJSRU5UX0NIQU5ORUwoMCksCisJU0kxMTQ1X0NVUlJFTlRfQ0hBTk5FTCgxKSwKKwlTSTExNDVfQ1VSUkVOVF9DSEFOTkVMKDIpLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnNpMTEzMl9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19jb25zdF9hdHRyX2luX2ludGVuc2l0eV9zY2FsZV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW5faW50ZW5zaXR5X2lyX3NjYWxlX2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqc2kxMTR4X2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2NvbnN0X2F0dHJfaW5faW50ZW5zaXR5X3NjYWxlX2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbl9pbnRlbnNpdHlfaXJfc2NhbGVfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luX3Byb3hpbWl0eV9zY2FsZV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgc2kxMTMyX2F0dHJpYnV0ZV9ncm91cCA9IHsKKwkuYXR0cnMgPSBzaTExMzJfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHNpMTE0eF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gc2kxMTR4X2F0dHJpYnV0ZXMsCit9OworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gc2kxMTMyX2luZm8gPSB7CisJLnJlYWRfcmF3ID0gc2kxMTQ1X3JlYWRfcmF3LAorCS53cml0ZV9yYXcgPSBzaTExNDVfd3JpdGVfcmF3LAorCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCisJLmF0dHJzID0gJnNpMTEzMl9hdHRyaWJ1dGVfZ3JvdXAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIHNpMTE0eF9pbmZvID0geworCS5yZWFkX3JhdyA9IHNpMTE0NV9yZWFkX3JhdywKKwkud3JpdGVfcmF3ID0gc2kxMTQ1X3dyaXRlX3JhdywKKwkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorCS5hdHRycyA9ICZzaTExNHhfYXR0cmlidXRlX2dyb3VwLAorfTsKKworI2RlZmluZSBTSTExNDVfUEFSVChpZCwgaWlvX2luZm8sIGNoYW5zLCBsZWRzLCB1bmNvbXByZXNzZWRfbWVhc19yYXRlKSBcCisJe2lkLCBpaW9faW5mbywgY2hhbnMsIEFSUkFZX1NJWkUoY2hhbnMpLCBsZWRzLCB1bmNvbXByZXNzZWRfbWVhc19yYXRlfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNpMTE0NV9wYXJ0X2luZm8gc2kxMTQ1X3BhcnRfaW5mb1tdID0geworCVtTSTExMzJdID0gU0kxMTQ1X1BBUlQoMHgzMiwgJnNpMTEzMl9pbmZvLCBzaTExMzJfY2hhbm5lbHMsIDAsIHRydWUpLAorCVtTSTExNDFdID0gU0kxMTQ1X1BBUlQoMHg0MSwgJnNpMTE0eF9pbmZvLCBzaTExNDFfY2hhbm5lbHMsIDEsIGZhbHNlKSwKKwlbU0kxMTQyXSA9IFNJMTE0NV9QQVJUKDB4NDIsICZzaTExNHhfaW5mbywgc2kxMTQyX2NoYW5uZWxzLCAyLCBmYWxzZSksCisJW1NJMTE0M10gPSBTSTExNDVfUEFSVCgweDQzLCAmc2kxMTR4X2luZm8sIHNpMTE0M19jaGFubmVscywgMywgZmFsc2UpLAorCVtTSTExNDVdID0gU0kxMTQ1X1BBUlQoMHg0NSwgJnNpMTE0eF9pbmZvLCBzaTExNDVfY2hhbm5lbHMsIDEsIHRydWUpLAorCVtTSTExNDZdID0gU0kxMTQ1X1BBUlQoMHg0NiwgJnNpMTE0eF9pbmZvLCBzaTExNDZfY2hhbm5lbHMsIDIsIHRydWUpLAorCVtTSTExNDddID0gU0kxMTQ1X1BBUlQoMHg0NywgJnNpMTE0eF9pbmZvLCBzaTExNDdfY2hhbm5lbHMsIDMsIHRydWUpLAorfTsKKworc3RhdGljIGludCBzaTExNDVfaW5pdGlhbGl6ZShzdHJ1Y3Qgc2kxMTQ1X2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIFNJMTE0NV9SRUdfQ09NTUFORCwKKwkJCQkJU0kxMTQ1X0NNRF9SRVNFVCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJbXNsZWVwKFNJMTE0NV9DT01NQU5EX1RJTUVPVVRfTVMpOworCisJLyogSGFyZHdhcmUga2V5LCBtYWdpYyB2YWx1ZSAqLworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBTSTExNDVfUkVHX0hXX0tFWSwgMHgxNyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJbXNsZWVwKFNJMTE0NV9DT01NQU5EX1RJTUVPVVRfTVMpOworCisJLyogVHVybiBvZmYgYXV0b25vbW91cyBtb2RlICovCisJcmV0ID0gc2kxMTQ1X3NldF9tZWFzX3JhdGUoZGF0YSwgMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBJbml0aWFsaXplIHNhbXBsaW5nIGZyZXEgdG8gMTAgSHogKi8KKwlyZXQgPSBzaTExNDVfc3RvcmVfc2FtcF9mcmVxKGRhdGEsIDEwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFNldCBMRUQgY3VycmVudHMgdG8gNDUgbUE7IGhhdmUgNCBiaXRzLCBzZWUgVGFibGUgMiBpbiBkYXRhc2hlZXQgKi8KKwlzd2l0Y2ggKGRhdGEtPnBhcnRfaW5mby0+bnVtX2xlZHMpIHsKKwljYXNlIDM6CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkJU0kxMTQ1X1JFR19QU19MRUQzLAorCQkJCQkJU0kxMTQ1X0xFRF9DVVJSRU5UXzQ1bUEpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCS8qIGZhbGx0aHJvdWdoICovCisJY2FzZSAyOgorCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCVNJMTE0NV9SRUdfUFNfTEVEMjEsCisJCQkJCQkoU0kxMTQ1X0xFRF9DVVJSRU5UXzQ1bUEgPDwgNCkgfAorCQkJCQkJU0kxMTQ1X0xFRF9DVVJSRU5UXzQ1bUEpOworCQlicmVhazsKKwljYXNlIDE6CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkJU0kxMTQ1X1JFR19QU19MRUQyMSwKKwkJCQkJCVNJMTE0NV9MRURfQ1VSUkVOVF80NW1BKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJfQorCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogU2V0IG5vcm1hbCBwcm94aW1pdHkgbWVhc3VyZW1lbnQgbW9kZSAqLworCXJldCA9IHNpMTE0NV9wYXJhbV9zZXQoZGF0YSwgU0kxMTQ1X1BBUkFNX1BTX0FEQ19NSVNDLAorCQkJICAgICAgIFNJMTE0NV9QU19BRENfTU9ERV9OT1JNQUwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gc2kxMTQ1X3BhcmFtX3NldChkYXRhLCBTSTExNDVfUEFSQU1fUFNfQURDX0dBSU4sIDB4MDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogQURDX0NPVU5URVIgc2hvdWxkIGJlIG9uZSBjb21wbGVtZW50IG9mIEFEQ19HQUlOICovCisJcmV0ID0gc2kxMTQ1X3BhcmFtX3NldChkYXRhLCBTSTExNDVfUEFSQU1fUFNfQURDX0NPVU5URVIsIDB4MDYgPDwgNCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBTZXQgQUxTIHZpc2libGUgbWVhc3VyZW1lbnQgbW9kZSAqLworCXJldCA9IHNpMTE0NV9wYXJhbV9zZXQoZGF0YSwgU0kxMTQ1X1BBUkFNX0FMU1ZJU19BRENfTUlTQywKKwkJCSAgICAgICBTSTExNDVfQURDX01JU0NfUkFOR0UpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gc2kxMTQ1X3BhcmFtX3NldChkYXRhLCBTSTExNDVfUEFSQU1fQUxTVklTX0FEQ19HQUlOLCAweDAzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNpMTE0NV9wYXJhbV9zZXQoZGF0YSwgU0kxMTQ1X1BBUkFNX0FMU1ZJU19BRENfQ09VTlRFUiwKKwkJCSAgICAgICAweDA0IDw8IDQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogU2V0IEFMUyBJUiBtZWFzdXJlbWVudCBtb2RlICovCisJcmV0ID0gc2kxMTQ1X3BhcmFtX3NldChkYXRhLCBTSTExNDVfUEFSQU1fQUxTSVJfQURDX01JU0MsCisJCQkgICAgICAgU0kxMTQ1X0FEQ19NSVNDX1JBTkdFKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNpMTE0NV9wYXJhbV9zZXQoZGF0YSwgU0kxMTQ1X1BBUkFNX0FMU0lSX0FEQ19HQUlOLCAweDAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNpMTE0NV9wYXJhbV9zZXQoZGF0YSwgU0kxMTQ1X1BBUkFNX0FMU0lSX0FEQ19DT1VOVEVSLAorCQkJICAgICAgIDB4MDYgPDwgNCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIEluaXRpYWxpemUgVUNPRUYgdG8gZGVmYXVsdCB2YWx1ZXMgaW4gZGF0YXNoZWV0CisJICogVGhlc2UgcmVnaXN0ZXJzIGFyZSBub3JtYWxseSB6ZXJvIG9uIHJlc2V0CisJICovCisJaWYgKGRhdGEtPnBhcnRfaW5mbyA9PSAmc2kxMTQ1X3BhcnRfaW5mb1tTSTExMzJdIHx8CisJCWRhdGEtPnBhcnRfaW5mbyA9PSAmc2kxMTQ1X3BhcnRfaW5mb1tTSTExNDVdIHx8CisJCWRhdGEtPnBhcnRfaW5mbyA9PSAmc2kxMTQ1X3BhcnRfaW5mb1tTSTExNDZdIHx8CisJCWRhdGEtPnBhcnRfaW5mbyA9PSAmc2kxMTQ1X3BhcnRfaW5mb1tTSTExNDddKSB7CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJCQkJU0kxMTQ1X1JFR19VQ09FRjEsCisJCQkJCQlTSTExNDVfVUNPRUYxX0RFRkFVTFQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJCVNJMTE0NV9SRUdfVUNPRUYyLCBTSTExNDVfVUNPRUYyX0RFRkFVTFQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJCVNJMTE0NV9SRUdfVUNPRUYzLCBTSTExNDVfVUNPRUYzX0RFRkFVTFQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJCVNJMTE0NV9SRUdfVUNPRUY0LCBTSTExNDVfVUNPRUY0X0RFRkFVTFQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm9ncmFtIHRoZSBjaGFubmVscyB3ZSB3YW50IHRvIG1lYXN1cmUgd2l0aCBDTURfUFNBTFNfQVVUTy4gTm8gbmVlZCBmb3IKKyAqIF9wb3N0ZGlzYWJsZSBhcyB3ZSBzdG9wIHdpdGggQ01EX1BTQUxTX1BBVVNFOyBzaW5nbGUgbWVhc3VyZW1lbnQgKGRpcmVjdCkKKyAqIG1vZGUgcmVwcm9ncmFtcyB0aGUgY2hhbm5lbHMgbGlzdCBhbnl3YXkuLi4KKyAqLworc3RhdGljIGludCBzaTExNDVfYnVmZmVyX3ByZWVuYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXN0cnVjdCBzaTExNDVfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCXJldCA9IHNpMTE0NV9zZXRfY2hsaXN0KGluZGlvX2RldiwgKmluZGlvX2Rldi0+YWN0aXZlX3NjYW5fbWFzayk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBib29sIHNpMTE0NV92YWxpZGF0ZV9zY2FuX21hc2soc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nICpzY2FuX21hc2spCit7CisJc3RydWN0IHNpMTE0NV9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1bnNpZ25lZCBpbnQgY291bnQgPSAwOworCWludCBpOworCisJLyogQ2hlY2sgdGhhdCBhdCBtb3N0IG9uZSBBVVggY2hhbm5lbCBpcyBlbmFibGVkICovCisJZm9yX2VhY2hfc2V0X2JpdChpLCBzY2FuX21hc2ssIGRhdGEtPnBhcnRfaW5mby0+bnVtX2NoYW5uZWxzKSB7CisJCWlmIChpbmRpb19kZXYtPmNoYW5uZWxzW2ldLmFkZHJlc3MgPT0gU0kxMTQ1X1JFR19BVVhfREFUQSkKKwkJCWNvdW50Kys7CisJfQorCisJcmV0dXJuIGNvdW50IDw9IDE7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2J1ZmZlcl9zZXR1cF9vcHMgc2kxMTQ1X2J1ZmZlcl9zZXR1cF9vcHMgPSB7CisJLnByZWVuYWJsZSA9IHNpMTE0NV9idWZmZXJfcHJlZW5hYmxlLAorCS5wb3N0ZW5hYmxlID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfcG9zdGVuYWJsZSwKKwkucHJlZGlzYWJsZSA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3ByZWRpc2FibGUsCisJLnZhbGlkYXRlX3NjYW5fbWFzayA9IHNpMTE0NV92YWxpZGF0ZV9zY2FuX21hc2ssCit9OworCisvKioKKyAqIHNpMTE0NV90cmlnZ2VyX3NldF9zdGF0ZSgpIC0gU2V0IHRyaWdnZXIgc3RhdGUKKyAqCisgKiBXaGVuIG5vdCB1c2luZyB0cmlnZ2VycyBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBhbmQgbWVhc3VyZW1lbnQgcmF0ZSBpcworICogc2V0IHRvIHplcm8gaW4gb3JkZXIgdG8gbWluaW1pemUgcG93ZXIgY29uc3VtcHRpb24uCisgKi8KK3N0YXRpYyBpbnQgc2kxMTQ1X3RyaWdnZXJfc2V0X3N0YXRlKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZywgYm9vbCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaWlvX3RyaWdnZXJfZ2V0X2RydmRhdGEodHJpZyk7CisJc3RydWN0IHNpMTE0NV9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgZXJyID0gMCwgcmV0OworCisJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CisKKwlpZiAoc3RhdGUpIHsKKwkJZGF0YS0+YXV0b25vbW91cyA9IHRydWU7CisJCWVyciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJCVNJMTE0NV9SRUdfSU5UX0NGRywgU0kxMTQ1X0lOVF9DRkdfT0UpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZGlzYWJsZTsKKwkJZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCisJCQkJU0kxMTQ1X1JFR19JUlFfRU5BQkxFLCBTSTExNDVfTUFTS19BTExfSUUpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZGlzYWJsZTsKKwkJZXJyID0gc2kxMTQ1X3NldF9tZWFzX3JhdGUoZGF0YSwgZGF0YS0+bWVhc19yYXRlKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGRpc2FibGU7CisJCWVyciA9IHNpMTE0NV9jb21tYW5kKGRhdGEsIFNJMTE0NV9DTURfUFNBTFNfQVVUTyk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBkaXNhYmxlOworCX0gZWxzZSB7CitkaXNhYmxlOgorCQkvKiBEaXNhYmxlIGFzIG11Y2ggYXMgcG9zc2libGUgc2tpcHBpbmcgZXJyb3JzICovCisJCXJldCA9IHNpMTE0NV9jb21tYW5kKGRhdGEsIFNJMTE0NV9DTURfUFNBTFNfUEFVU0UpOworCQlpZiAocmV0IDwgMCAmJiAhZXJyKQorCQkJZXJyID0gcmV0OworCQlyZXQgPSBzaTExNDVfc2V0X21lYXNfcmF0ZShkYXRhLCAwKTsKKwkJaWYgKHJldCA8IDAgJiYgIWVycikKKwkJCWVyciA9IHJldDsKKwkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCisJCQkJCQlTSTExNDVfUkVHX0lSUV9FTkFCTEUsIDApOworCQlpZiAocmV0IDwgMCAmJiAhZXJyKQorCQkJZXJyID0gcmV0OworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJCQkJCVNJMTE0NV9SRUdfSU5UX0NGRywgMCk7CisJCWlmIChyZXQgPCAwICYmICFlcnIpCisJCQllcnIgPSByZXQ7CisJCWRhdGEtPmF1dG9ub21vdXMgPSBmYWxzZTsKKwl9CisKKwltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX3RyaWdnZXJfb3BzIHNpMTE0NV90cmlnZ2VyX29wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuc2V0X3RyaWdnZXJfc3RhdGUgPSBzaTExNDVfdHJpZ2dlcl9zZXRfc3RhdGUsCit9OworCitzdGF0aWMgaW50IHNpMTE0NV9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IHNpMTE0NV9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OworCXN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZzsKKwlpbnQgcmV0OworCisJdHJpZyA9IGRldm1faWlvX3RyaWdnZXJfYWxsb2MoJmNsaWVudC0+ZGV2LAorCQkJIiVzLWRldiVkIiwgaW5kaW9fZGV2LT5uYW1lLCBpbmRpb19kZXYtPmlkKTsKKwlpZiAoIXRyaWcpCisJCXJldHVybiAtRU5PTUVNOworCisJdHJpZy0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKKwl0cmlnLT5vcHMgPSAmc2kxMTQ1X3RyaWdnZXJfb3BzOworCWlpb190cmlnZ2VyX3NldF9kcnZkYXRhKHRyaWcsIGluZGlvX2Rldik7CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZjbGllbnQtPmRldiwgY2xpZW50LT5pcnEsCisJCQkgIGlpb190cmlnZ2VyX2dlbmVyaWNfZGF0YV9yZHlfcG9sbCwKKwkJCSAgSVJRRl9UUklHR0VSX0ZBTExJTkcsCisJCQkgICJzaTExNDVfaXJxIiwKKwkJCSAgdHJpZyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJpcnEgcmVxdWVzdCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGlpb190cmlnZ2VyX3JlZ2lzdGVyKHRyaWcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlkYXRhLT50cmlnID0gdHJpZzsKKwlpbmRpb19kZXYtPnRyaWcgPSBpaW9fdHJpZ2dlcl9nZXQoZGF0YS0+dHJpZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2kxMTQ1X3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IHNpMTE0NV9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCWlmIChkYXRhLT50cmlnKSB7CisJCWlpb190cmlnZ2VyX3VucmVnaXN0ZXIoZGF0YS0+dHJpZyk7CisJCWRhdGEtPnRyaWcgPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCBzaTExNDVfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3Qgc2kxMTQ1X2RhdGEgKmRhdGE7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwl1OCBwYXJ0X2lkLCByZXZfaWQsIHNlcV9pZDsKKwlpbnQgcmV0OworCisJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKCpkYXRhKSk7CisJaWYgKCFpbmRpb19kZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgaW5kaW9fZGV2KTsKKwlkYXRhLT5jbGllbnQgPSBjbGllbnQ7CisJZGF0YS0+cGFydF9pbmZvID0gJnNpMTE0NV9wYXJ0X2luZm9baWQtPmRyaXZlcl9kYXRhXTsKKworCXBhcnRfaWQgPSByZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJCQkJIFNJMTE0NV9SRUdfUEFSVF9JRCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV2X2lkID0gcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJCQkJCVNJMTE0NV9SRUdfUkVWX0lEKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlzZXFfaWQgPSByZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJCQkJU0kxMTQ1X1JFR19TRVFfSUQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWRldl9pbmZvKCZjbGllbnQtPmRldiwgImRldmljZSBJRCBwYXJ0ICUjMDJoaHggcmV2ICUjMDJoaHggc2VxICUjMDJoaHhcbiIsCisJCQlwYXJ0X2lkLCByZXZfaWQsIHNlcV9pZCk7CisJaWYgKHBhcnRfaWQgIT0gZGF0YS0+cGFydF9pbmZvLT5wYXJ0KSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAicGFydCBJRCBtaXNtYXRjaCBnb3QgJSMwMmhoeCwgZXhwZWN0ZWQgJSMwMnhcbiIsCisJCQkJcGFydF9pZCwgZGF0YS0+cGFydF9pbmZvLT5wYXJ0KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCWluZGlvX2Rldi0+bmFtZSA9IGlkLT5uYW1lOworCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBkYXRhLT5wYXJ0X2luZm8tPmNoYW5uZWxzOworCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gZGF0YS0+cGFydF9pbmZvLT5udW1fY2hhbm5lbHM7CisJaW5kaW9fZGV2LT5pbmZvID0gZGF0YS0+cGFydF9pbmZvLT5paW9faW5mbzsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwltdXRleF9pbml0KCZkYXRhLT5sb2NrKTsKKwltdXRleF9pbml0KCZkYXRhLT5jbWRsb2NrKTsKKworCXJldCA9IHNpMTE0NV9pbml0aWFsaXplKGRhdGEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfc2V0dXAoaW5kaW9fZGV2LCBOVUxMLAorCQlzaTExNDVfdHJpZ2dlcl9oYW5kbGVyLCAmc2kxMTQ1X2J1ZmZlcl9zZXR1cF9vcHMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGNsaWVudC0+aXJxKSB7CisJCXJldCA9IHNpMTE0NV9wcm9iZV90cmlnZ2VyKGluZGlvX2Rldik7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnJvcl9mcmVlX2J1ZmZlcjsKKwl9IGVsc2UgeworCQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJubyBpcnEsIHVzaW5nIHBvbGxpbmdcbiIpOworCX0KKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcl9mcmVlX3RyaWdnZXI7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZnJlZV90cmlnZ2VyOgorCXNpMTE0NV9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOworZXJyb3JfZnJlZV9idWZmZXI6CisJaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChpbmRpb19kZXYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHNpMTE0NV9pZHNbXSA9IHsKKwl7ICJzaTExMzIiLCBTSTExMzIgfSwKKwl7ICJzaTExNDEiLCBTSTExNDEgfSwKKwl7ICJzaTExNDIiLCBTSTExNDIgfSwKKwl7ICJzaTExNDMiLCBTSTExNDMgfSwKKwl7ICJzaTExNDUiLCBTSTExNDUgfSwKKwl7ICJzaTExNDYiLCBTSTExNDYgfSwKKwl7ICJzaTExNDciLCBTSTExNDcgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgc2kxMTQ1X2lkcyk7CisKK3N0YXRpYyBpbnQgc2kxMTQ1X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCXNpMTE0NV9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOworCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoaW5kaW9fZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgc2kxMTQ1X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSAgID0gInNpMTE0NSIsCisJfSwKKwkucHJvYmUgID0gc2kxMTQ1X3Byb2JlLAorCS5yZW1vdmUgPSBzaTExNDVfcmVtb3ZlLAorCS5pZF90YWJsZSA9IHNpMTE0NV9pZHMsCit9OworCittb2R1bGVfaTJjX2RyaXZlcihzaTExNDVfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiUGV0ZXIgTWVlcndhbGQtU3RhZGxlciA8cG1lZXJ3QHBtZWVydy5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNpbGFicyBTSTExMzIgYW5kIFNJMTE0MS8yLzMvNS82LzcgcHJveGltaXR5LCBhbWJpZW50IGxpZ2h0IGFuZCBVViBpbmRleCBzZW5zb3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9saWdodC91czUxODJkLmMgYi9kcml2ZXJzL2lpby9saWdodC91czUxODJkLmMKaW5kZXggMjBjNDBmNy4uMThjZjJlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vbGlnaHQvdXM1MTgyZC5jCisrKyBiL2RyaXZlcnMvaWlvL2xpZ2h0L3VzNTE4MmQuYwpAQCAtODk0LDcgKzg5NCw3IEBACiAJCWdvdG8gb3V0X2VycjsKIAogCWlmIChkYXRhLT5kZWZhdWx0X2NvbnRpbnVvdXMpIHsKLQkJcG1fcnVudGltZV9zZXRfYWN0aXZlKCZjbGllbnQtPmRldik7CisJCXJldCA9IHBtX3J1bnRpbWVfc2V0X2FjdGl2ZSgmY2xpZW50LT5kZXYpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gb3V0X2VycjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9saWdodC92Y25sNDAwMC5jIGIvZHJpdmVycy9paW8vbGlnaHQvdmNubDQwMDAuYwppbmRleCBjOWQ4NWJiLi4zNjBiNmU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9saWdodC92Y25sNDAwMC5jCisrKyBiL2RyaXZlcnMvaWlvL2xpZ2h0L3Zjbmw0MDAwLmMKQEAgLTEsNiArMSw2IEBACiAvKgotICogdmNubDQwMDAuYyAtIFN1cHBvcnQgZm9yIFZpc2hheSBWQ05MNDAwMCBjb21iaW5lZCBhbWJpZW50IGxpZ2h0IGFuZAotICogcHJveGltaXR5IHNlbnNvcgorICogdmNubDQwMDAuYyAtIFN1cHBvcnQgZm9yIFZpc2hheSBWQ05MNDAwMC80MDEwLzQwMjAgY29tYmluZWQgYW1iaWVudAorICogbGlnaHQgYW5kIHByb3hpbWl0eSBzZW5zb3IKICAqCiAgKiBDb3B5cmlnaHQgMjAxMiBQZXRlciBNZWVyd2FsZCA8cG1lZXJ3QHBtZWVydy5uZXQ+CiAgKgpAQCAtMTMsNiArMTMsOCBAQAogICogVE9ETzoKICAqICAgYWxsb3cgdG8gYWRqdXN0IElSIGN1cnJlbnQKICAqICAgcHJveGltaXR5IHRocmVzaG9sZCBhbmQgZXZlbnQgaGFuZGxpbmcKKyAqICAgcGVyaW9kaWMgQUxTL3Byb3hpbWl0eSBtZWFzdXJlbWVudCAoVkNOTDQwMTAvMjApCisgKiAgIGludGVycnVwdHMgKFZDTkw0MDEwLzIwKQogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTI0LDYgKzI2LDggQEAKICNpbmNsdWRlIDxsaW51eC9paW8vc3lzZnMuaD4KIAogI2RlZmluZSBWQ05MNDAwMF9EUlZfTkFNRSAidmNubDQwMDAiCisjZGVmaW5lIFZDTkw0MDAwX0lECQkweDAxCisjZGVmaW5lIFZDTkw0MDEwX0lECQkweDAyIC8qIGZvciBWQ05MNDAyMCwgVkNOTDQwMTAgKi8KIAogI2RlZmluZSBWQ05MNDAwMF9DT01NQU5ECTB4ODAgLyogQ29tbWFuZCByZWdpc3RlciAqLwogI2RlZmluZSBWQ05MNDAwMF9QUk9EX1JFVgkweDgxIC8qIFByb2R1Y3QgSUQgYW5kIFJldmlzaW9uIElEICovCkBAIC0zNywxMyArNDEsMTQgQEAKICNkZWZpbmUgVkNOTDQwMDBfUFNfTU9EX0FESgkweDhhIC8qIFByb3hpbWl0eSBtb2R1bGF0b3IgdGltaW5nIGFkanVzdG1lbnQgKi8KIAogLyogQml0IG1hc2tzIGZvciBDT01NQU5EIHJlZ2lzdGVyICovCi0jZGVmaW5lIFZDTkw0MDAwX0FMX1JEWQkJMHg0MCAvKiBBTFMgZGF0YSByZWFkeT8gKi8KLSNkZWZpbmUgVkNOTDQwMDBfUFNfUkRZCQkweDIwIC8qIHByb3hpbWl0eSBkYXRhIHJlYWR5PyAqLwotI2RlZmluZSBWQ05MNDAwMF9BTF9PRAkJMHgxMCAvKiBzdGFydCBvbi1kZW1hbmQgQUxTIG1lYXN1cmVtZW50ICovCi0jZGVmaW5lIFZDTkw0MDAwX1BTX09ECQkweDA4IC8qIHN0YXJ0IG9uLWRlbWFuZCBwcm94aW1pdHkgbWVhc3VyZW1lbnQgKi8KKyNkZWZpbmUgVkNOTDQwMDBfQUxfUkRZCQlCSVQoNikgLyogQUxTIGRhdGEgcmVhZHk/ICovCisjZGVmaW5lIFZDTkw0MDAwX1BTX1JEWQkJQklUKDUpIC8qIHByb3hpbWl0eSBkYXRhIHJlYWR5PyAqLworI2RlZmluZSBWQ05MNDAwMF9BTF9PRAkJQklUKDQpIC8qIHN0YXJ0IG9uLWRlbWFuZCBBTFMgbWVhc3VyZW1lbnQgKi8KKyNkZWZpbmUgVkNOTDQwMDBfUFNfT0QJCUJJVCgzKSAvKiBzdGFydCBvbi1kZW1hbmQgcHJveGltaXR5IG1lYXN1cmVtZW50ICovCiAKIHN0cnVjdCB2Y25sNDAwMF9kYXRhIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBtdXRleCBsb2NrOwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHZjbmw0MDAwX2lkW10gPSB7CkBAIC01OSwxNiArNjQsMTggQEAKIAlfX2JlMTYgYnVmOwogCWludCByZXQ7CiAKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKwogCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBWQ05MNDAwMF9DT01NQU5ELAogCQkJCQlyZXFfbWFzayk7CiAJaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJCWdvdG8gZmFpbDsKIAogCS8qIHdhaXQgZm9yIGRhdGEgdG8gYmVjb21lIHJlYWR5ICovCiAJd2hpbGUgKHRyaWVzLS0pIHsKIAkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgVkNOTDQwMDBfQ09NTUFORCk7CiAJCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gZmFpbDsKIAkJaWYgKHJldCAmIHJkeV9tYXNrKQogCQkJYnJlYWs7CiAJCW1zbGVlcCgyMCk7IC8qIG1lYXN1cmVtZW50IHRha2VzIHVwIHRvIDEwMCBtcyAqLwpAQCAtNzcsMTcgKzg0LDIzIEBACiAJaWYgKHRyaWVzIDwgMCkgewogCQlkZXZfZXJyKCZkYXRhLT5jbGllbnQtPmRldiwKIAkJCSJ2Y25sNDAwMF9tZWFzdXJlKCkgZmFpbGVkLCBkYXRhIG5vdCByZWFkeVxuIik7Ci0JCXJldHVybiAtRUlPOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGZhaWw7CiAJfQogCiAJcmV0ID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoZGF0YS0+Y2xpZW50LAogCQlkYXRhX3JlZywgc2l6ZW9mKGJ1ZiksICh1OCAqKSAmYnVmKTsKIAlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBmYWlsOwogCisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKIAkqdmFsID0gYmUxNl90b19jcHUoYnVmKTsKIAogCXJldHVybiAwOworCitmYWlsOgorCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHZjbmw0MDAwX2NoYW5uZWxzW10gPSB7CkBAIC0xMDUsNyArMTE4LDcgQEAKIAkJCQlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKIAkJCQlpbnQgKnZhbCwgaW50ICp2YWwyLCBsb25nIG1hc2spCiB7Ci0JaW50IHJldCA9IC1FSU5WQUw7CisJaW50IHJldDsKIAlzdHJ1Y3QgdmNubDQwMDBfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CiAKIAlzd2l0Y2ggKG1hc2spIHsKQEAgLTExNywzMiArMTMwLDI3IEBACiAJCQkJVkNOTDQwMDBfQUxfUkVTVUxUX0hJLCB2YWwpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJcmV0dXJuIHJldDsKLQkJCXJldCA9IElJT19WQUxfSU5UOwotCQkJYnJlYWs7CisJCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CiAJCWNhc2UgSUlPX1BST1hJTUlUWToKIAkJCXJldCA9IHZjbmw0MDAwX21lYXN1cmUoZGF0YSwKIAkJCQlWQ05MNDAwMF9QU19PRCwgVkNOTDQwMDBfUFNfUkRZLAogCQkJCVZDTkw0MDAwX1BTX1JFU1VMVF9ISSwgdmFsKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCXJldHVybiByZXQ7Ci0JCQlyZXQgPSBJSU9fVkFMX0lOVDsKLQkJCWJyZWFrOworCQkJcmV0dXJuIElJT19WQUxfSU5UOwogCQlkZWZhdWx0OgotCQkJYnJlYWs7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCQlicmVhazsKIAljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6Ci0JCWlmIChjaGFuLT50eXBlID09IElJT19MSUdIVCkgewotCQkJKnZhbCA9IDA7Ci0JCQkqdmFsMiA9IDI1MDAwMDsKLQkJCXJldCA9IElJT19WQUxfSU5UX1BMVVNfTUlDUk87Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQorCQlpZiAoY2hhbi0+dHlwZSAhPSBJSU9fTElHSFQpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldHVybiByZXQ7CisJCSp2YWwgPSAwOworCQkqdmFsMiA9IDI1MDAwMDsKKwkJcmV0dXJuIElJT19WQUxfSU5UX1BMVVNfTUlDUk87CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIHZjbmw0MDAwX2luZm8gPSB7CkBAIC0xNTUsNyArMTYzLDcgQEAKIHsKIAlzdHJ1Y3QgdmNubDQwMDBfZGF0YSAqZGF0YTsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OwotCWludCByZXQ7CisJaW50IHJldCwgcHJvZF9pZDsKIAogCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqZGF0YSkpOwogCWlmICghaW5kaW9fZGV2KQpAQCAtMTY0LDEzICsxNzIsMTkgQEAKIAlkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBpbmRpb19kZXYpOwogCWRhdGEtPmNsaWVudCA9IGNsaWVudDsKKwltdXRleF9pbml0KCZkYXRhLT5sb2NrKTsKIAogCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIFZDTkw0MDAwX1BST0RfUkVWKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIlZDTkw0MDAwIEFtYmllbnQgbGlnaHQvcHJveGltaXR5IHNlbnNvciwgUHJvZCAlMDJ4LCBSZXY6ICUwMnhcbiIsCi0JCXJldCA+PiA0LCByZXQgJiAweGYpOworCXByb2RfaWQgPSByZXQgPj4gNDsKKwlpZiAocHJvZF9pZCAhPSBWQ05MNDAxMF9JRCAmJiBwcm9kX2lkICE9IFZDTkw0MDAwX0lEKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiJXMgQW1iaWVudCBsaWdodC9wcm94aW1pdHkgc2Vuc29yLCBSZXY6ICUwMnhcbiIsCisJCShwcm9kX2lkID09IFZDTkw0MDEwX0lEKSA/ICJWQ05MNDAxMC80MDIwIiA6ICJWQ05MNDAwMCIsCisJCXJldCAmIDB4Zik7CiAKIAlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmY2xpZW50LT5kZXY7CiAJaW5kaW9fZGV2LT5pbmZvID0gJnZjbmw0MDAwX2luZm87CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvS2NvbmZpZyBiL2RyaXZlcnMvaWlvL21hZ25ldG9tZXRlci9LY29uZmlnCmluZGV4IDFmODQyYWIuLjQyMWFkOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL21hZ25ldG9tZXRlci9LY29uZmlnCisrKyBiL2RyaXZlcnMvaWlvL21hZ25ldG9tZXRlci9LY29uZmlnCkBAIC01LDggKzUsMjIgQEAKIAogbWVudSAiTWFnbmV0b21ldGVyIHNlbnNvcnMiCiAKK2NvbmZpZyBBSzg5NzQKKwl0cmlzdGF0ZSAiQXNhaGkgS2FzZWkgQUs4OTc0IDMtQXhpcyBNYWduZXRvbWV0ZXIiCisJZGVwZW5kcyBvbiBJMkMKKwlkZXBlbmRzIG9uIE9GCisJc2VsZWN0IFJFR01BUF9JMkMKKwlzZWxlY3QgSUlPX0JVRkZFUgorCXNlbGVjdCBJSU9fVFJJR0dFUkVEX0JVRkZFUgorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBc2FoaSBLYXNlaSBBSzg5NzQgb3IKKwkgIEFNSTMwNSBJMkMtYmFzZWQgMy1heGlzIG1hZ25ldG9tZXRlciBjaGlwcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYWs4OTc0LgorCiBjb25maWcgQUs4OTc1Ci0JdHJpc3RhdGUgIkFzYWhpIEthc2VpIEFLIDMtQXhpcyBNYWduZXRvbWV0ZXIiCisJdHJpc3RhdGUgIkFzYWhpIEthc2VpIEFLODk3NSAzLUF4aXMgTWFnbmV0b21ldGVyIgogCWRlcGVuZHMgb24gSTJDCiAJZGVwZW5kcyBvbiBHUElPTElCIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBJSU9fQlVGRkVSCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvTWFrZWZpbGUgYi9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvTWFrZWZpbGUKaW5kZXggOTJhNzQ1Yy4uYjg2ZDZjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vbWFnbmV0b21ldGVyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaWlvL21hZ25ldG9tZXRlci9NYWtlZmlsZQpAQCAtMyw2ICszLDcgQEAKICMKIAogIyBXaGVuIGFkZGluZyBuZXcgZW50cmllcyBrZWVwIHRoZSBsaXN0IGluIGFscGhhYmV0aWNhbCBvcmRlcgorb2JqLSQoQ09ORklHX0FLODk3NCkJKz0gYWs4OTc0Lm8KIG9iai0kKENPTkZJR19BSzg5NzUpCSs9IGFrODk3NS5vCiBvYmotJChDT05GSUdfQk1DMTUwX01BR04pICs9IGJtYzE1MF9tYWduLm8KIG9iai0kKENPTkZJR19CTUMxNTBfTUFHTl9JMkMpICs9IGJtYzE1MF9tYWduX2kyYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvYWs4OTc0LmMgYi9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvYWs4OTc0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE3MzUzMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL21hZ25ldG9tZXRlci9hazg5NzQuYwpAQCAtMCwwICsxLDg2MCBAQAorLyoKKyAqIERyaXZlciBmb3IgdGhlIEFzYWhpIEthc2VpIEVNRCBDb3Jwb3JhdGlvbiBBSzg5NzQKKyAqIGFuZCBBaWNoaSBTdGVlbCBBTUkzMDUgbWFnbmV0b21ldGVyIGNoaXBzLgorICogQmFzZWQgb24gYSBwYXRjaCBmcm9tIFNhbXUgT25rYWxvIGFuZCB0aGUgQUs4OTc1IElJTyBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KKyAqIENvcHlyaWdodCAoYykgMjAxMCBOVklESUEgQ29ycG9yYXRpb24uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgTGluYXJvIEx0ZC4KKyAqCisgKiBBdXRob3I6IFNhbXUgT25rYWxvIDxzYW11LnAub25rYWxvQG5va2lhLmNvbT4KKyAqIEF1dGhvcjogTGludXMgV2FsbGVpaiA8bGludXMud2FsbGVpakBsaW5hcm8ub3JnPgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+IC8qIEZvciBpcnFfZ2V0X2lycV9kYXRhKCkgKi8KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vYnVmZmVyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcl9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyZWRfYnVmZmVyLmg+CisKKy8qCisgKiAxNi1iaXQgcmVnaXN0ZXJzIGFyZSBsaXR0bGUtZW5kaWFuLiBMU0IgaXMgYXQgdGhlIGFkZHJlc3MgZGVmaW5lZCBiZWxvdworICogYW5kIE1TQiBpcyBhdCB0aGUgbmV4dCBoaWdoZXIgYWRkcmVzcy4KKyAqLworCisvKiBUaGVzZSByZWdpc3RlcnMgYXJlIGNvbW1vbiBmb3IgQUs4OTc0IGFuZCBBTUkzMDUgKi8KKyNkZWZpbmUgQUs4OTc0X1NFTEZURVNUCQkweDBDCisjZGVmaW5lIEFLODk3NF9TRUxGVEVTVF9JRExFCTB4NTUKKyNkZWZpbmUgQUs4OTc0X1NFTEZURVNUX09LCTB4QUEKKworI2RlZmluZSBBSzg5NzRfSU5GTwkJMHgwRAorCisjZGVmaW5lIEFLODk3NF9XSE9BTUkJCTB4MEYKKyNkZWZpbmUgQUs4OTc0X1dIT0FNSV9WQUxVRV9BTUkzMDUgMHg0NworI2RlZmluZSBBSzg5NzRfV0hPQU1JX1ZBTFVFX0FLODk3NCAweDQ4CisKKyNkZWZpbmUgQUs4OTc0X0RBVEFfWAkJMHgxMAorI2RlZmluZSBBSzg5NzRfREFUQV9ZCQkweDEyCisjZGVmaW5lIEFLODk3NF9EQVRBX1oJCTB4MTQKKyNkZWZpbmUgQUs4OTc0X0lOVF9TUkMJCTB4MTYKKyNkZWZpbmUgQUs4OTc0X1NUQVRVUwkJMHgxOAorI2RlZmluZSBBSzg5NzRfSU5UX0NMRUFSCTB4MUEKKyNkZWZpbmUgQUs4OTc0X0NUUkwxCQkweDFCCisjZGVmaW5lIEFLODk3NF9DVFJMMgkJMHgxQworI2RlZmluZSBBSzg5NzRfQ1RSTDMJCTB4MUQKKyNkZWZpbmUgQUs4OTc0X0lOVF9DVFJMCQkweDFFCisjZGVmaW5lIEFLODk3NF9JTlRfVEhSRVMJMHgyNiAgLyogQWJzb2x1dGUgYW55IGF4aXMgdmFsdWUgdGhyZXNob2xkICovCisjZGVmaW5lIEFLODk3NF9QUkVTRVQJCTB4MzAKKworLyogQUs4OTc0LXNwZWNpZmljIG9mZnNldHMgKi8KKyNkZWZpbmUgQUs4OTc0X09GRlNFVF9YCQkweDIwCisjZGVmaW5lIEFLODk3NF9PRkZTRVRfWQkJMHgyMgorI2RlZmluZSBBSzg5NzRfT0ZGU0VUX1oJCTB4MjQKKy8qIEFNSTMwNS1zcGVjaWZpYyBvZmZzZXRzICovCisjZGVmaW5lIEFNSTMwNV9PRkZTRVRfWAkJMHg2QworI2RlZmluZSBBTUkzMDVfT0ZGU0VUX1kJCTB4NzIKKyNkZWZpbmUgQU1JMzA1X09GRlNFVF9aCQkweDc4CisKKy8qIERpZmZlcmVudCB0ZW1wZXJhdHVyZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQUs4OTc0X1RFTVAJCTB4MzEKKyNkZWZpbmUgQU1JMzA1X1RFTVAJCTB4NjAKKworI2RlZmluZSBBSzg5NzRfSU5UX1hfSElHSAlCSVQoNykgLyogQXhpcyBvdmVyICt0aHJlc2hvbGQgICovCisjZGVmaW5lIEFLODk3NF9JTlRfWV9ISUdICUJJVCg2KQorI2RlZmluZSBBSzg5NzRfSU5UX1pfSElHSAlCSVQoNSkKKyNkZWZpbmUgQUs4OTc0X0lOVF9YX0xPVwlCSVQoNCkgLyogQXhpcyBiZWxvdyAtdGhyZXNob2xkCSovCisjZGVmaW5lIEFLODk3NF9JTlRfWV9MT1cJQklUKDMpCisjZGVmaW5lIEFLODk3NF9JTlRfWl9MT1cJQklUKDIpCisjZGVmaW5lIEFLODk3NF9JTlRfUkFOR0UJQklUKDEpIC8qIFJhbmdlIG92ZXJmbG93IChhbnkgYXhpcykgKi8KKworI2RlZmluZSBBSzg5NzRfU1RBVFVTX0RSRFkJQklUKDYpIC8qIERhdGEgcmVhZHkgKi8KKyNkZWZpbmUgQUs4OTc0X1NUQVRVU19PVkVSUlVOCUJJVCg1KSAvKiBEYXRhIG92ZXJydW4gKi8KKyNkZWZpbmUgQUs4OTc0X1NUQVRVU19JTlQJQklUKDQpIC8qIEludGVycnVwdCBvY2N1cnJlZCAqLworCisjZGVmaW5lIEFLODk3NF9DVFJMMV9QT1dFUglCSVQoNykgLyogMCA9IHN0YW5kYnk7IDEgPSBhY3RpdmUgKi8KKyNkZWZpbmUgQUs4OTc0X0NUUkwxX1JBVEUJQklUKDQpIC8qIDAgPSAxMCBIejsgMSA9IDIwIEh6CSAqLworI2RlZmluZSBBSzg5NzRfQ1RSTDFfRk9SQ0VfRU4JQklUKDEpIC8qIDAgPSBub3JtYWw7IDEgPSBmb3JjZQkgKi8KKyNkZWZpbmUgQUs4OTc0X0NUUkwxX01PREUyCUJJVCgwKSAvKiAwICovCisKKyNkZWZpbmUgQUs4OTc0X0NUUkwyX0lOVF9FTglCSVQoNCkgIC8qIDEgPSBlbmFibGUgaW50ZXJydXB0cwkgICAgICAqLworI2RlZmluZSBBSzg5NzRfQ1RSTDJfRFJEWV9FTglCSVQoMykgIC8qIDEgPSBlbmFibGUgZGF0YSByZWFkeSBzaWduYWwgKi8KKyNkZWZpbmUgQUs4OTc0X0NUUkwyX0RSRFlfUE9MCUJJVCgyKSAgLyogMSA9IGRhdGEgcmVhZHkgYWN0aXZlIGhpZ2ggICAqLworI2RlZmluZSBBSzg5NzRfQ1RSTDJfUkVTREVGCShBSzg5NzRfQ1RSTDJfRFJEWV9QT0wpCisKKyNkZWZpbmUgQUs4OTc0X0NUUkwzX1JFU0VUCUJJVCg3KSAvKiBTb2Z0d2FyZSByZXNldAkJICAqLworI2RlZmluZSBBSzg5NzRfQ1RSTDNfRk9SQ0UJQklUKDYpIC8qIFN0YXJ0IGZvcmNlZCBtZWFzdXJlbWVudCAqLworI2RlZmluZSBBSzg5NzRfQ1RSTDNfU0VMRlRFU1QJQklUKDQpIC8qIFNldCBzZWxmdGVzdCByZWdpc3RlcgkgICovCisjZGVmaW5lIEFLODk3NF9DVFJMM19SRVNERUYJMHgwMAorCisjZGVmaW5lIEFLODk3NF9JTlRfQ1RSTF9YRU4JQklUKDcpIC8qIEVuYWJsZSBpbnRlcnJ1cHQgZm9yIHRoaXMgYXhpcyAqLworI2RlZmluZSBBSzg5NzRfSU5UX0NUUkxfWUVOCUJJVCg2KQorI2RlZmluZSBBSzg5NzRfSU5UX0NUUkxfWkVOCUJJVCg1KQorI2RlZmluZSBBSzg5NzRfSU5UX0NUUkxfWFlaRU4JKEJJVCg3KXxCSVQoNil8QklUKDUpKQorI2RlZmluZSBBSzg5NzRfSU5UX0NUUkxfUE9MCUJJVCgzKSAvKiAwID0gYWN0aXZlIGxvdzsgMSA9IGFjdGl2ZSBoaWdoICovCisjZGVmaW5lIEFLODk3NF9JTlRfQ1RSTF9QVUxTRQlCSVQoMSkgLyogMCA9IGxhdGNoZWQ7IDEgPSBwdWxzZSAoNTAgdXNlYykgKi8KKyNkZWZpbmUgQUs4OTc0X0lOVF9DVFJMX1JFU0RFRgkoQUs4OTc0X0lOVF9DVFJMX1hZWkVOIHwgQUs4OTc0X0lOVF9DVFJMX1BPTCkKKworLyogVGhlIEFNSTMwNSBoYXMgZWxhYm9yYXRlIEZXIHZlcnNpb24gYW5kIHNlcmlhbCBudW1iZXIgcmVnaXN0ZXJzICovCisjZGVmaW5lIEFNSTMwNV9WRVIJCTB4RTgKKyNkZWZpbmUgQU1JMzA1X1NOCQkweEVBCisKKyNkZWZpbmUgQUs4OTc0X01BWF9SQU5HRQkyMDQ4CisKKyNkZWZpbmUgQUs4OTc0X1BPV0VST05fREVMQVkJNTAKKyNkZWZpbmUgQUs4OTc0X0FDVElWQVRFX0RFTEFZCTEKKyNkZWZpbmUgQUs4OTc0X1NFTEZURVNUX0RFTEFZCTEKKy8qCisgKiBTZXQgdGhlIGF1dG9zdXNwZW5kIHRvIHR3byBvcmRlcnMgb2YgbWFnbml0dWRlIGxhcmdlciB0aGFuIHRoZSBwb3dlcm9uCisgKiBkZWxheSB0byBtYWtlIHNhbmUgcmVhc29uYWJsZSBwb3dlciB0cmFkZW9mZiBzYXZpbmdzICg1IHNlY29uZHMgaW4KKyAqIHRoaXMgY2FzZSkuCisgKi8KKyNkZWZpbmUgQUs4OTc0X0FVVE9TVVNQRU5EX0RFTEFZIDUwMDAKKworI2RlZmluZSBBSzg5NzRfTUVBU1RJTUUJCTMKKworI2RlZmluZSBBSzg5NzRfUFdSX09OCQkxCisjZGVmaW5lIEFLODk3NF9QV1JfT0ZGCQkwCisKKy8qKgorICogc3RydWN0IGFrODk3NCAtIHN0YXRlIGNvbnRhaW5lciBmb3IgdGhlIEFLODk3NCBkcml2ZXIKKyAqIEBpMmM6IHBhcmVudCBJMkMgY2xpZW50CisgKiBAb3JpZW50YXRpb246IG1vdW50aW5nIG1hdHJpeCwgZmxpcHBlZCBheGlzIGV0YworICogQG1hcDogcmVnbWFwIHRvIGFjY2VzcyB0aGUgQUs4OTc0IHJlZ2lzdGVycyBvdmVyIEkyQworICogQHJlZ3M6IHRoZSBhdmRkIGFuZCBkdmRkIHBvd2VyIHJlZ3VsYXRvcnMKKyAqIEBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgcGFydAorICogQHZhcmlhbnQ6IHRoZSB3aG9hbWkgSUQgdmFsdWUgKGZvciBzZWxlY3RpbmcgY29kZSBwYXRocykKKyAqIEBsb2NrOiBsb2NrcyB0aGUgbWFnbmV0b21ldGVyIGZvciBleGNsdXNpdmUgdXNlIGR1cmluZyBhIG1lYXN1cmVtZW50CisgKiBAZHJkeV9pcnE6IHVzZXMgdGhlIERSRFkgSVJRIGxpbmUKKyAqIEBkcmR5X2NvbXBsZXRlOiBjb21wbGV0aW9uIGZvciBEUkRZCisgKiBAZHJkeV9hY3RpdmVfbG93OiB0aGUgRFJEWSBJUlEgaXMgYWN0aXZlIGxvdworICovCitzdHJ1Y3QgYWs4OTc0IHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjOworCXN0cnVjdCBpaW9fbW91bnRfbWF0cml4IG9yaWVudGF0aW9uOworCXN0cnVjdCByZWdtYXAgKm1hcDsKKwlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSByZWdzWzJdOworCWNvbnN0IGNoYXIgKm5hbWU7CisJdTggdmFyaWFudDsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlib29sIGRyZHlfaXJxOworCXN0cnVjdCBjb21wbGV0aW9uIGRyZHlfY29tcGxldGU7CisJYm9vbCBkcmR5X2FjdGl2ZV9sb3c7Cit9OworCitzdGF0aWMgY29uc3QgY2hhciBhazg5NzRfcmVnX2F2ZGRbXSA9ICJhdmRkIjsKK3N0YXRpYyBjb25zdCBjaGFyIGFrODk3NF9yZWdfZHZkZFtdID0gImR2ZGQiOworCitzdGF0aWMgaW50IGFrODk3NF9zZXRfcG93ZXIoc3RydWN0IGFrODk3NCAqYWs4OTc0LCBib29sIG1vZGUpCit7CisJaW50IHJldDsKKwl1OCB2YWw7CisKKwl2YWwgPSBtb2RlID8gQUs4OTc0X0NUUkwxX1BPV0VSIDogMDsKKwl2YWwgfD0gQUs4OTc0X0NUUkwxX0ZPUkNFX0VOOworCXJldCA9IHJlZ21hcF93cml0ZShhazg5NzQtPm1hcCwgQUs4OTc0X0NUUkwxLCB2YWwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKG1vZGUpCisJCW1zbGVlcChBSzg5NzRfQUNUSVZBVEVfREVMQVkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWs4OTc0X3Jlc2V0KHN0cnVjdCBhazg5NzQgKmFrODk3NCkKK3sKKwlpbnQgcmV0OworCisJLyogUG93ZXIgb24gdG8gZ2V0IHJlZ2lzdGVyIGFjY2Vzcy4gU2V0cyBDVFJMMSByZWcgdG8gcmVzZXQgc3RhdGUgKi8KKwlyZXQgPSBhazg5NzRfc2V0X3Bvd2VyKGFrODk3NCwgQUs4OTc0X1BXUl9PTik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSByZWdtYXBfd3JpdGUoYWs4OTc0LT5tYXAsIEFLODk3NF9DVFJMMiwgQUs4OTc0X0NUUkwyX1JFU0RFRik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSByZWdtYXBfd3JpdGUoYWs4OTc0LT5tYXAsIEFLODk3NF9DVFJMMywgQUs4OTc0X0NUUkwzX1JFU0RFRik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSByZWdtYXBfd3JpdGUoYWs4OTc0LT5tYXAsIEFLODk3NF9JTlRfQ1RSTCwKKwkJCSAgIEFLODk3NF9JTlRfQ1RSTF9SRVNERUYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBBZnRlciByZXNldCwgcG93ZXIgb2ZmIGlzIGRlZmF1bHQgc3RhdGUgKi8KKwlyZXR1cm4gYWs4OTc0X3NldF9wb3dlcihhazg5NzQsIEFLODk3NF9QV1JfT0ZGKTsKK30KKworc3RhdGljIGludCBhazg5NzRfY29uZmlndXJlKHN0cnVjdCBhazg5NzQgKmFrODk3NCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcmVnbWFwX3dyaXRlKGFrODk3NC0+bWFwLCBBSzg5NzRfQ1RSTDIsIEFLODk3NF9DVFJMMl9EUkRZX0VOIHwKKwkJCSAgIEFLODk3NF9DVFJMMl9JTlRfRU4pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gcmVnbWFwX3dyaXRlKGFrODk3NC0+bWFwLCBBSzg5NzRfQ1RSTDMsIDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gcmVnbWFwX3dyaXRlKGFrODk3NC0+bWFwLCBBSzg5NzRfSU5UX0NUUkwsIEFLODk3NF9JTlRfQ1RSTF9QT0wpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gcmVnbWFwX3dyaXRlKGFrODk3NC0+bWFwLCBBSzg5NzRfUFJFU0VULCAwKTsKK30KKworc3RhdGljIGludCBhazg5NzRfdHJpZ21lYXMoc3RydWN0IGFrODk3NCAqYWs4OTc0KQoreworCXVuc2lnbmVkIGludCBjbGVhcjsKKwl1OCBtYXNrOworCXU4IHZhbDsKKwlpbnQgcmV0OworCisJLyogQ2xlYXIgYW55IHByZXZpb3VzIG1lYXN1cmVtZW50IG92ZXJmbG93IHN0YXR1cyAqLworCXJldCA9IHJlZ21hcF9yZWFkKGFrODk3NC0+bWFwLCBBSzg5NzRfSU5UX0NMRUFSLCAmY2xlYXIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBJZiB3ZSBoYXZlIGEgRFJEWSBJUlEgbGluZSwgdXNlIGl0ICovCisJaWYgKGFrODk3NC0+ZHJkeV9pcnEpIHsKKwkJbWFzayA9IEFLODk3NF9DVFJMMl9JTlRfRU4gfAorCQkJQUs4OTc0X0NUUkwyX0RSRFlfRU4gfAorCQkJQUs4OTc0X0NUUkwyX0RSRFlfUE9MOworCQl2YWwgPSBBSzg5NzRfQ1RSTDJfRFJEWV9FTjsKKworCQlpZiAoIWFrODk3NC0+ZHJkeV9hY3RpdmVfbG93KQorCQkJdmFsIHw9IEFLODk3NF9DVFJMMl9EUkRZX1BPTDsKKworCQlpbml0X2NvbXBsZXRpb24oJmFrODk3NC0+ZHJkeV9jb21wbGV0ZSk7CisJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhhazg5NzQtPm1hcCwgQUs4OTc0X0NUUkwyLAorCQkJCQkgbWFzaywgdmFsKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJLyogRm9yY2UgYSBtZWFzdXJlbWVudCAqLworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoYWs4OTc0LT5tYXAsCisJCQkJICBBSzg5NzRfQ1RSTDMsCisJCQkJICBBSzg5NzRfQ1RSTDNfRk9SQ0UsCisJCQkJICBBSzg5NzRfQ1RSTDNfRk9SQ0UpOworfQorCitzdGF0aWMgaW50IGFrODk3NF9hd2FpdF9kcmR5KHN0cnVjdCBhazg5NzQgKmFrODk3NCkKK3sKKwlpbnQgdGltZW91dCA9IDI7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgcmV0OworCisJaWYgKGFrODk3NC0+ZHJkeV9pcnEpIHsKKwkJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZhazg5NzQtPmRyZHlfY29tcGxldGUsCisJCQkJCTEgKyBtc2Vjc190b19qaWZmaWVzKDEwMDApKTsKKwkJaWYgKCFyZXQpIHsKKwkJCWRldl9lcnIoJmFrODk3NC0+aTJjLT5kZXYsCisJCQkJInRpbWVvdXQgd2FpdGluZyBmb3IgRFJEWSBJUlFcbiIpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJLyogRGVmYXVsdCBkZWxheS1iYXNlZCBwb2xsIGxvb3AgKi8KKwlkbyB7CisJCW1zbGVlcChBSzg5NzRfTUVBU1RJTUUpOworCQlyZXQgPSByZWdtYXBfcmVhZChhazg5NzQtPm1hcCwgQUs4OTc0X1NUQVRVUywgJnZhbCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKHZhbCAmIEFLODk3NF9TVEFUVVNfRFJEWSkKKwkJCXJldHVybiAwOworCX0gd2hpbGUgKC0tdGltZW91dCk7CisJaWYgKCF0aW1lb3V0KSB7CisJCWRldl9lcnIoJmFrODk3NC0+aTJjLT5kZXYsCisJCQkidGltZW91dCB3YWl0aW5nIGZvciBEUkRZXG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWs4OTc0X2dldHJlc3VsdChzdHJ1Y3QgYWs4OTc0ICphazg5NzQsIHMxNiAqcmVzdWx0KQoreworCXVuc2lnbmVkIGludCBzcmM7CisJaW50IHJldDsKKworCXJldCA9IGFrODk3NF9hd2FpdF9kcmR5KGFrODk3NCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSByZWdtYXBfcmVhZChhazg5NzQtPm1hcCwgQUs4OTc0X0lOVF9TUkMsICZzcmMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogT3V0IG9mIHJhbmdlIG92ZXJmbG93ISBTdHJvbmcgbWFnbmV0IGNsb3NlPyAqLworCWlmIChzcmMgJiBBSzg5NzRfSU5UX1JBTkdFKSB7CisJCWRldl9lcnIoJmFrODk3NC0+aTJjLT5kZXYsCisJCQkicmFuZ2Ugb3ZlcmZsb3cgaW4gc2Vuc29yXG4iKTsKKwkJcmV0dXJuIC1FUkFOR0U7CisJfQorCisJcmV0ID0gcmVnbWFwX2J1bGtfcmVhZChhazg5NzQtPm1hcCwgQUs4OTc0X0RBVEFfWCwgcmVzdWx0LCA2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlycXJldHVybl90IGFrODk3NF9kcmR5X2lycShpbnQgaXJxLCB2b2lkICpkKQoreworCXN0cnVjdCBhazg5NzQgKmFrODk3NCA9IGQ7CisKKwlpZiAoIWFrODk3NC0+ZHJkeV9pcnEpCisJCXJldHVybiBJUlFfTk9ORTsKKworCS8qIFRPRE86IHRpbWVzdGFtcCBoZXJlIHRvIGdldCBnb29kIG1lYXN1cmVtZW50IHN0YW1wcyAqLworCXJldHVybiBJUlFfV0FLRV9USFJFQUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhazg5NzRfZHJkeV9pcnFfdGhyZWFkKGludCBpcnEsIHZvaWQgKmQpCit7CisJc3RydWN0IGFrODk3NCAqYWs4OTc0ID0gZDsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCByZXQ7CisKKwkvKiBDaGVjayBpZiB0aGlzIHdhcyBhIERSRFkgZnJvbSB1cyAqLworCXJldCA9IHJlZ21hcF9yZWFkKGFrODk3NC0+bWFwLCBBSzg5NzRfU1RBVFVTLCAmdmFsKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZhazg5NzQtPmkyYy0+ZGV2LCAiZXJyb3IgcmVhZGluZyBEUkRZIHN0YXR1c1xuIik7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisJaWYgKHZhbCAmIEFLODk3NF9TVEFUVVNfRFJEWSkgeworCQkvKiBZZXMgdGhpcyB3YXMgb3VyIElSUSAqLworCQljb21wbGV0ZSgmYWs4OTc0LT5kcmR5X2NvbXBsZXRlKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCS8qIFdlIG1heSBiZSBvbiBhIHNoYXJlZCBJUlEsIGxldCB0aGUgbmV4dCBjbGllbnQgY2hlY2sgKi8KKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKK3N0YXRpYyBpbnQgYWs4OTc0X3NlbGZ0ZXN0KHN0cnVjdCBhazg5NzQgKmFrODk3NCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYWs4OTc0LT5pMmMtPmRldjsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCByZXQ7CisKKwlyZXQgPSByZWdtYXBfcmVhZChhazg5NzQtPm1hcCwgQUs4OTc0X1NFTEZURVNULCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWlmICh2YWwgIT0gQUs4OTc0X1NFTEZURVNUX0lETEUpIHsKKwkJZGV2X2VycihkZXYsICJzZWxmdGVzdCBub3QgaWRsZSBiZWZvcmUgdGVzdFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIFRyaWdnZXIgc2VsZi10ZXN0ICovCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGFrODk3NC0+bWFwLAorCQkJQUs4OTc0X0NUUkwzLAorCQkJQUs4OTc0X0NUUkwzX1NFTEZURVNULAorCQkJQUs4OTc0X0NUUkwzX1NFTEZURVNUKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiY291bGQgbm90IHdyaXRlIENUUkwzXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwltc2xlZXAoQUs4OTc0X1NFTEZURVNUX0RFTEFZKTsKKworCXJldCA9IHJlZ21hcF9yZWFkKGFrODk3NC0+bWFwLCBBSzg5NzRfU0VMRlRFU1QsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJaWYgKHZhbCAhPSBBSzg5NzRfU0VMRlRFU1RfT0spIHsKKwkJZGV2X2VycihkZXYsICJzZWxmdGVzdCByZXN1bHQgTk9UIE9LICglMDJ4KVxuIiwgdmFsKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0ID0gcmVnbWFwX3JlYWQoYWs4OTc0LT5tYXAsIEFLODk3NF9TRUxGVEVTVCwgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlpZiAodmFsICE9IEFLODk3NF9TRUxGVEVTVF9JRExFKSB7CisJCWRldl9lcnIoZGV2LCAic2VsZnRlc3Qgbm90IGlkbGUgYWZ0ZXIgdGVzdCAoJTAyeClcbiIsIHZhbCk7CisJCXJldHVybiAtRUlPOworCX0KKwlkZXZfZGJnKGRldiwgInBhc3NlZCBzZWxmLXRlc3RcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWs4OTc0X2dldF91MTZfdmFsKHN0cnVjdCBhazg5NzQgKmFrODk3NCwgdTggcmVnLCB1MTYgKnZhbCkKK3sKKwlpbnQgcmV0OworCXUxNiBidWxrOworCisJcmV0ID0gcmVnbWFwX2J1bGtfcmVhZChhazg5NzQtPm1hcCwgcmVnLCAmYnVsaywgMik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwkqdmFsID0gbGUxNl90b19jcHUoYnVsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhazg5NzRfZGV0ZWN0KHN0cnVjdCBhazg5NzQgKmFrODk3NCkKK3sKKwl1bnNpZ25lZCBpbnQgd2hvYW1pOworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgZnc7CisJdTE2IHNuOworCisJcmV0ID0gcmVnbWFwX3JlYWQoYWs4OTc0LT5tYXAsIEFLODk3NF9XSE9BTUksICZ3aG9hbWkpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzd2l0Y2ggKHdob2FtaSkgeworCWNhc2UgQUs4OTc0X1dIT0FNSV9WQUxVRV9BTUkzMDU6CisJCW5hbWUgPSAiYW1pMzA1IjsKKwkJcmV0ID0gcmVnbWFwX3JlYWQoYWs4OTc0LT5tYXAsIEFNSTMwNV9WRVIsICZmdyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlmdyAmPSAweDdmOyAvKiBvbmx5IGJpdHMgMCB0aHJ1IDYgdmFsaWQgKi8KKwkJcmV0ID0gYWs4OTc0X2dldF91MTZfdmFsKGFrODk3NCwgQU1JMzA1X1NOLCAmc24pOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJZGV2X2luZm8oJmFrODk3NC0+aTJjLT5kZXYsCisJCQkgImRldGVjdGVkICVzLCBGVyB2ZXIgJTAyeCwgUy9OOiAlMDR4XG4iLAorCQkJIG5hbWUsIGZ3LCBzbik7CisJCWJyZWFrOworCWNhc2UgQUs4OTc0X1dIT0FNSV9WQUxVRV9BSzg5NzQ6CisJCW5hbWUgPSAiYWs4OTc0IjsKKwkJZGV2X2luZm8oJmFrODk3NC0+aTJjLT5kZXYsICJkZXRlY3RlZCBBSzg5NzRcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZhazg5NzQtPmkyYy0+ZGV2LCAidW5zdXBwb3J0ZWQgZGV2aWNlICglMDJ4KSAiLAorCQkJd2hvYW1pKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJYWs4OTc0LT5uYW1lID0gbmFtZTsKKwlhazg5NzQtPnZhcmlhbnQgPSB3aG9hbWk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhazg5NzRfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCSAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJICAgaW50ICp2YWwsIGludCAqdmFsMiwKKwkJCSAgIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgYWs4OTc0ICphazg5NzQgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXMxNiBod192YWx1ZXNbM107CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlwbV9ydW50aW1lX2dldF9zeW5jKCZhazg5NzQtPmkyYy0+ZGV2KTsKKwltdXRleF9sb2NrKCZhazg5NzQtPmxvY2spOworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJaWYgKGNoYW4tPmFkZHJlc3MgPiAyKSB7CisJCQlkZXZfZXJyKCZhazg5NzQtPmkyYy0+ZGV2LCAiZmF1bHR5IGNoYW5uZWwgYWRkcmVzc1xuIik7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisJCXJldCA9IGFrODk3NF90cmlnbWVhcyhhazg5NzQpOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfdW5sb2NrOworCQlyZXQgPSBhazg5NzRfZ2V0cmVzdWx0KGFrODk3NCwgaHdfdmFsdWVzKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X3VubG9jazsKKworCQkvKgorCQkgKiBXZSByZWFkIGFsbCBheGVzIGFuZCBkaXNjYXJkIGFsbCBidXQgb25lLCBmb3Igb3B0aW1pemVkCisJCSAqIHJlYWRpbmcsIHVzZSB0aGUgdHJpZ2dlcmVkIGJ1ZmZlci4KKwkJICovCisJCSp2YWwgPSBsZTE2X3RvX2NwdShod192YWx1ZXNbY2hhbi0+YWRkcmVzc10pOworCisJCXJldCA9IElJT19WQUxfSU5UOworCX0KKworIG91dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZhazg5NzQtPmxvY2spOworCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koJmFrODk3NC0+aTJjLT5kZXYpOworCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKCZhazg5NzQtPmkyYy0+ZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGFrODk3NF9maWxsX2J1ZmZlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXN0cnVjdCBhazg5NzQgKmFrODk3NCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldDsKKwlzMTYgaHdfdmFsdWVzWzhdOyAvKiBUaHJlZSBheGVzICsgNjRiaXQgcGFkZGluZyAqLworCisJcG1fcnVudGltZV9nZXRfc3luYygmYWs4OTc0LT5pMmMtPmRldik7CisJbXV0ZXhfbG9jaygmYWs4OTc0LT5sb2NrKTsKKworCXJldCA9IGFrODk3NF90cmlnbWVhcyhhazg5NzQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmYWs4OTc0LT5pMmMtPmRldiwgImVycm9yIHRyaWdnZXJpbmcgbWVhc3VyZVxuIik7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJcmV0ID0gYWs4OTc0X2dldHJlc3VsdChhazg5NzQsIGh3X3ZhbHVlcyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZhazg5NzQtPmkyYy0+ZGV2LCAiZXJyb3IgZ2V0dGluZyBtZWFzdXJlc1xuIik7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlpaW9fcHVzaF90b19idWZmZXJzX3dpdGhfdGltZXN0YW1wKGluZGlvX2RldiwgaHdfdmFsdWVzLAorCQkJCQkgICBpaW9fZ2V0X3RpbWVfbnMoaW5kaW9fZGV2KSk7CisKKyBvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmYWs4OTc0LT5sb2NrKTsKKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KCZhazg5NzQtPmkyYy0+ZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZCgmYWs4OTc0LT5pMmMtPmRldik7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhazg5NzRfaGFuZGxlX3RyaWdnZXIoaW50IGlycSwgdm9pZCAqcCkKK3sKKwljb25zdCBzdHJ1Y3QgaWlvX3BvbGxfZnVuYyAqcGYgPSBwOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwZi0+aW5kaW9fZGV2OworCisJYWs4OTc0X2ZpbGxfYnVmZmVyKGluZGlvX2Rldik7CisJaWlvX3RyaWdnZXJfbm90aWZ5X2RvbmUoaW5kaW9fZGV2LT50cmlnKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fbW91bnRfbWF0cml4ICoKK2FrODk3NF9nZXRfbW91bnRfbWF0cml4KGNvbnN0IHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQljb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbikKK3sKKwlzdHJ1Y3QgYWs4OTc0ICphazg5NzQgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJcmV0dXJuICZhazg5NzQtPm9yaWVudGF0aW9uOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWNfZXh0X2luZm8gYWs4OTc0X2V4dF9pbmZvW10gPSB7CisJSUlPX01PVU5UX01BVFJJWChJSU9fU0hBUkVEX0JZX0RJUiwgYWs4OTc0X2dldF9tb3VudF9tYXRyaXgpLAorCXsgfSwKK307CisKKyNkZWZpbmUgQUs4OTc0X0FYSVNfQ0hBTk5FTChheGlzLCBpbmRleCkJCQkJXAorCXsJCQkJCQkJCVwKKwkJLnR5cGUgPSBJSU9fTUFHTiwJCQkJCVwKKwkJLm1vZGlmaWVkID0gMSwJCQkJCQlcCisJCS5jaGFubmVsMiA9IElJT19NT0RfIyNheGlzLAkJCQlcCisJCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLAkJXAorCQkuZXh0X2luZm8gPSBhazg5NzRfZXh0X2luZm8sCQkJCVwKKwkJLmFkZHJlc3MgPSBpbmRleCwJCQkJCVwKKwkJLnNjYW5faW5kZXggPSBpbmRleCwJCQkJCVwKKwkJLnNjYW5fdHlwZSA9IHsJCQkJCQlcCisJCQkuc2lnbiA9ICdzJywJCQkJCVwKKwkJCS5yZWFsYml0cyA9IDE2LAkJCQkJXAorCQkJLnN0b3JhZ2ViaXRzID0gMTYsCQkJCVwKKwkJCS5lbmRpYW5uZXNzID0gSUlPX0xFCQkJCVwKKwkJfSwJCQkJCQkJXAorCX0KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIGFrODk3NF9jaGFubmVsc1tdID0geworCUFLODk3NF9BWElTX0NIQU5ORUwoWCwgMCksCisJQUs4OTc0X0FYSVNfQ0hBTk5FTChZLCAxKSwKKwlBSzg5NzRfQVhJU19DSEFOTkVMKFosIDIpLAorCUlJT19DSEFOX1NPRlRfVElNRVNUQU1QKDMpLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgYWs4OTc0X3NjYW5fbWFza3NbXSA9IHsgMHg3LCAwIH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gYWs4OTc0X2luZm8gPSB7CisJLnJlYWRfcmF3ID0gJmFrODk3NF9yZWFkX3JhdywKKwkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGJvb2wgYWs4OTc0X3dyaXRlYWJsZV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICppMmMgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGkyY19nZXRfY2xpZW50ZGF0YShpMmMpOworCXN0cnVjdCBhazg5NzQgKmFrODk3NCA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgQUs4OTc0X0NUUkwxOgorCWNhc2UgQUs4OTc0X0NUUkwyOgorCWNhc2UgQUs4OTc0X0NUUkwzOgorCWNhc2UgQUs4OTc0X0lOVF9DVFJMOgorCWNhc2UgQUs4OTc0X0lOVF9USFJFUzoKKwljYXNlIEFLODk3NF9JTlRfVEhSRVMgKyAxOgorCWNhc2UgQUs4OTc0X1BSRVNFVDoKKwljYXNlIEFLODk3NF9QUkVTRVQgKyAxOgorCQlyZXR1cm4gdHJ1ZTsKKwljYXNlIEFLODk3NF9PRkZTRVRfWDoKKwljYXNlIEFLODk3NF9PRkZTRVRfWCArIDE6CisJY2FzZSBBSzg5NzRfT0ZGU0VUX1k6CisJY2FzZSBBSzg5NzRfT0ZGU0VUX1kgKyAxOgorCWNhc2UgQUs4OTc0X09GRlNFVF9aOgorCWNhc2UgQUs4OTc0X09GRlNFVF9aICsgMToKKwkJaWYgKGFrODk3NC0+dmFyaWFudCA9PSBBSzg5NzRfV0hPQU1JX1ZBTFVFX0FLODk3NCkKKwkJCXJldHVybiB0cnVlOworCQlyZXR1cm4gZmFsc2U7CisJY2FzZSBBTUkzMDVfT0ZGU0VUX1g6CisJY2FzZSBBTUkzMDVfT0ZGU0VUX1ggKyAxOgorCWNhc2UgQU1JMzA1X09GRlNFVF9ZOgorCWNhc2UgQU1JMzA1X09GRlNFVF9ZICsgMToKKwljYXNlIEFNSTMwNV9PRkZTRVRfWjoKKwljYXNlIEFNSTMwNV9PRkZTRVRfWiArIDE6CisJCWlmIChhazg5NzQtPnZhcmlhbnQgPT0gQUs4OTc0X1dIT0FNSV9WQUxVRV9BTUkzMDUpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIGZhbHNlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBhazg5NzRfcmVnbWFwX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDgsCisJLm1heF9yZWdpc3RlciA9IDB4ZmYsCisJLndyaXRlYWJsZV9yZWcgPSBhazg5NzRfd3JpdGVhYmxlX3JlZywKK307CisKK3N0YXRpYyBpbnQgYWs4OTc0X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3QgYWs4OTc0ICphazg5NzQ7CisJdW5zaWduZWQgbG9uZyBpcnFfdHJpZzsKKwlpbnQgaXJxID0gaTJjLT5pcnE7CisJaW50IHJldDsKKworCS8qIFJlZ2lzdGVyIHdpdGggSUlPICovCisJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZpMmMtPmRldiwgc2l6ZW9mKCphazg5NzQpKTsKKwlpZiAoaW5kaW9fZGV2ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJYWs4OTc0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBpbmRpb19kZXYpOworCWFrODk3NC0+aTJjID0gaTJjOworCW11dGV4X2luaXQoJmFrODk3NC0+bG9jayk7CisKKwlyZXQgPSBvZl9paW9fcmVhZF9tb3VudF9tYXRyaXgoJmkyYy0+ZGV2LAorCQkJCSAgICAgICAibW91bnQtbWF0cml4IiwKKwkJCQkgICAgICAgJmFrODk3NC0+b3JpZW50YXRpb24pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlhazg5NzQtPnJlZ3NbMF0uc3VwcGx5ID0gYWs4OTc0X3JlZ19hdmRkOworCWFrODk3NC0+cmVnc1sxXS5zdXBwbHkgPSBhazg5NzRfcmVnX2R2ZGQ7CisKKwlyZXQgPSBkZXZtX3JlZ3VsYXRvcl9idWxrX2dldCgmaTJjLT5kZXYsCisJCQkJICAgICAgQVJSQVlfU0laRShhazg5NzQtPnJlZ3MpLAorCQkJCSAgICAgIGFrODk3NC0+cmVncyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJjYW5ub3QgZ2V0IHJlZ3VsYXRvcnNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKGFrODk3NC0+cmVncyksIGFrODk3NC0+cmVncyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJjYW5ub3QgZW5hYmxlIHJlZ3VsYXRvcnNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFRha2UgcnVudGltZSBQTSBvbmxpbmUgKi8KKwlwbV9ydW50aW1lX2dldF9ub3Jlc3VtZSgmaTJjLT5kZXYpOworCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZSgmaTJjLT5kZXYpOworCXBtX3J1bnRpbWVfZW5hYmxlKCZpMmMtPmRldik7CisKKwlhazg5NzQtPm1hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGkyYywgJmFrODk3NF9yZWdtYXBfY29uZmlnKTsKKwlpZiAoSVNfRVJSKGFrODk3NC0+bWFwKSkgeworCQlkZXZfZXJyKCZpMmMtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSByZWdpc3RlciBtYXBcbiIpOworCQlyZXR1cm4gUFRSX0VSUihhazg5NzQtPm1hcCk7CisJfQorCisJcmV0ID0gYWs4OTc0X3NldF9wb3dlcihhazg5NzQsIEFLODk3NF9QV1JfT04pOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJjb3VsZCBub3QgcG93ZXIgb25cbiIpOworCQlnb3RvIHBvd2VyX29mZjsKKwl9CisKKwlyZXQgPSBhazg5NzRfZGV0ZWN0KGFrODk3NCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZpMmMtPmRldiwgIm5laXRoZXIgQUs4OTc0IG5vciBBTUkzMDUgZm91bmRcbiIpOworCQlnb3RvIHBvd2VyX29mZjsKKwl9CisKKwlyZXQgPSBhazg5NzRfc2VsZnRlc3QoYWs4OTc0KTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKCZpMmMtPmRldiwgInNlbGZ0ZXN0IGZhaWxlZCAoY29udGludWluZyBhbnl3YXkpXG4iKTsKKworCXJldCA9IGFrODk3NF9yZXNldChhazg5NzQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJBSzg5NzQgcmVzZXQgZmFpbGVkXG4iKTsKKwkJZ290byBwb3dlcl9vZmY7CisJfQorCisJcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXkoJmkyYy0+ZGV2LAorCQkJCQkgQUs4OTc0X0FVVE9TVVNQRU5EX0RFTEFZKTsKKwlwbV9ydW50aW1lX3VzZV9hdXRvc3VzcGVuZCgmaTJjLT5kZXYpOworCXBtX3J1bnRpbWVfcHV0KCZpMmMtPmRldik7CisKKwlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmaTJjLT5kZXY7CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IGFrODk3NF9jaGFubmVsczsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUoYWs4OTc0X2NoYW5uZWxzKTsKKwlpbmRpb19kZXYtPmluZm8gPSAmYWs4OTc0X2luZm87CisJaW5kaW9fZGV2LT5hdmFpbGFibGVfc2Nhbl9tYXNrcyA9IGFrODk3NF9zY2FuX21hc2tzOworCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKwlpbmRpb19kZXYtPm5hbWUgPSBhazg5NzQtPm5hbWU7CisKKwlyZXQgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9zZXR1cChpbmRpb19kZXYsIE5VTEwsCisJCQkJCSBhazg5NzRfaGFuZGxlX3RyaWdnZXIsCisJCQkJCSBOVUxMKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAidHJpZ2dlcmVkIGJ1ZmZlciBzZXR1cCBmYWlsZWRcbiIpOworCQlnb3RvIGRpc2FibGVfcG07CisJfQorCisJLyogSWYgd2UgaGF2ZSBhIHZhbGlkIERSRFkgSVJRLCBtYWtlIHVzZSBvZiBpdCAqLworCWlmIChpcnEgPiAwKSB7CisJCWlycV90cmlnID0gaXJxZF9nZXRfdHJpZ2dlcl90eXBlKGlycV9nZXRfaXJxX2RhdGEoaXJxKSk7CisJCWlmIChpcnFfdHJpZyA9PSBJUlFGX1RSSUdHRVJfUklTSU5HKSB7CisJCQlkZXZfaW5mbygmaTJjLT5kZXYsICJlbmFibGUgcmlzaW5nIGVkZ2UgRFJEWSBJUlFcbiIpOworCQl9IGVsc2UgaWYgKGlycV90cmlnID09IElSUUZfVFJJR0dFUl9GQUxMSU5HKSB7CisJCQlhazg5NzQtPmRyZHlfYWN0aXZlX2xvdyA9IHRydWU7CisJCQlkZXZfaW5mbygmaTJjLT5kZXYsICJlbmFibGUgZmFsbGluZyBlZGdlIERSRFkgSVJRXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWlycV90cmlnID0gSVJRRl9UUklHR0VSX1JJU0lORzsKKwkJfQorCQlpcnFfdHJpZyB8PSBJUlFGX09ORVNIT1Q7CisJCWlycV90cmlnIHw9IElSUUZfU0hBUkVEOworCisJCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoJmkyYy0+ZGV2LAorCQkJCQkJaXJxLAorCQkJCQkJYWs4OTc0X2RyZHlfaXJxLAorCQkJCQkJYWs4OTc0X2RyZHlfaXJxX3RocmVhZCwKKwkJCQkJCWlycV90cmlnLAorCQkJCQkJYWs4OTc0LT5uYW1lLAorCQkJCQkJYWs4OTc0KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmaTJjLT5kZXYsICJ1bmFibGUgdG8gcmVxdWVzdCBEUkRZIElSUSAiCisJCQkJIi0gcHJvY2VlZGluZyB3aXRob3V0IElSUVxuIik7CisJCQlnb3RvIG5vX2lycTsKKwkJfQorCQlhazg5NzQtPmRyZHlfaXJxID0gdHJ1ZTsKKwl9CisKK25vX2lycToKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZpMmMtPmRldiwgImRldmljZSByZWdpc3RlciBmYWlsZWRcbiIpOworCQlnb3RvIGNsZWFudXBfYnVmZmVyOworCX0KKworCXJldHVybiAwOworCitjbGVhbnVwX2J1ZmZlcjoKKwlpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwKGluZGlvX2Rldik7CitkaXNhYmxlX3BtOgorCXBtX3J1bnRpbWVfcHV0X25vaWRsZSgmaTJjLT5kZXYpOworCXBtX3J1bnRpbWVfZGlzYWJsZSgmaTJjLT5kZXYpOworCWFrODk3NF9zZXRfcG93ZXIoYWs4OTc0LCBBSzg5NzRfUFdSX09GRik7Citwb3dlcl9vZmY6CisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKGFrODk3NC0+cmVncyksIGFrODk3NC0+cmVncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZXhpdCBhazg5NzRfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGkyY19nZXRfY2xpZW50ZGF0YShpMmMpOworCXN0cnVjdCBhazg5NzQgKmFrODk3NCA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwKGluZGlvX2Rldik7CisJcG1fcnVudGltZV9nZXRfc3luYygmaTJjLT5kZXYpOworCXBtX3J1bnRpbWVfcHV0X25vaWRsZSgmaTJjLT5kZXYpOworCXBtX3J1bnRpbWVfZGlzYWJsZSgmaTJjLT5kZXYpOworCWFrODk3NF9zZXRfcG93ZXIoYWs4OTc0LCBBSzg5NzRfUFdSX09GRik7CisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKGFrODk3NC0+cmVncyksIGFrODk3NC0+cmVncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX21heWJlX3VudXNlZCBhazg5NzRfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWs4OTc0ICphazg5NzQgPQorCQlpaW9fcHJpdihpMmNfZ2V0X2NsaWVudGRhdGEodG9faTJjX2NsaWVudChkZXYpKSk7CisKKwlhazg5NzRfc2V0X3Bvd2VyKGFrODk3NCwgQUs4OTc0X1BXUl9PRkYpOworCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRShhazg5NzQtPnJlZ3MpLCBhazg5NzQtPnJlZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgYWs4OTc0X3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWs4OTc0ICphazg5NzQgPQorCQlpaW9fcHJpdihpMmNfZ2V0X2NsaWVudGRhdGEodG9faTJjX2NsaWVudChkZXYpKSk7CisJaW50IHJldDsKKworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKGFrODk3NC0+cmVncyksIGFrODk3NC0+cmVncyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwltc2xlZXAoQUs4OTc0X1BPV0VST05fREVMQVkpOworCXJldCA9IGFrODk3NF9zZXRfcG93ZXIoYWs4OTc0LCBBSzg5NzRfUFdSX09OKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9yZWd1bGF0b3JfZGlzYWJsZTsKKworCXJldCA9IGFrODk3NF9jb25maWd1cmUoYWs4OTc0KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9kaXNhYmxlX3Bvd2VyOworCisJcmV0dXJuIDA7CisKK291dF9kaXNhYmxlX3Bvd2VyOgorCWFrODk3NF9zZXRfcG93ZXIoYWs4OTc0LCBBSzg5NzRfUFdSX09GRik7CitvdXRfcmVndWxhdG9yX2Rpc2FibGU6CisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKGFrODk3NC0+cmVncyksIGFrODk3NC0+cmVncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgYWs4OTc0X2Rldl9wbV9vcHMgPSB7CisJU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMocG1fcnVudGltZV9mb3JjZV9zdXNwZW5kLAorCQkJCXBtX3J1bnRpbWVfZm9yY2VfcmVzdW1lKQorCVNFVF9SVU5USU1FX1BNX09QUyhhazg5NzRfcnVudGltZV9zdXNwZW5kLAorCQkJICAgYWs4OTc0X3J1bnRpbWVfcmVzdW1lLCBOVUxMKQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFrODk3NF9pZFtdID0geworCXsiYW1pMzA1IiwgMCB9LAorCXsiYWs4OTc0IiwgMCB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGFrODk3NF9pZCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFrODk3NF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiYXNhaGkta2FzZWksYWs4OTc0IiwgfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGFrODk3NF9vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhazg5NzRfZHJpdmVyID0geworCS5kcml2ZXIJID0geworCQkubmFtZQk9ICJhazg5NzQiLAorCQkucG0gPSAmYWs4OTc0X2Rldl9wbV9vcHMsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihhazg5NzRfb2ZfbWF0Y2gpLAorCX0sCisJLnByb2JlCSAgPSBhazg5NzRfcHJvYmUsCisJLnJlbW92ZQkgID0gX19leGl0X3AoYWs4OTc0X3JlbW92ZSksCisJLmlkX3RhYmxlID0gYWs4OTc0X2lkLAorfTsKK21vZHVsZV9pMmNfZHJpdmVyKGFrODk3NF9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFLODk3NCBhbmQgQU1JMzA1IDMtYXhpcyBtYWduZXRvbWV0ZXIgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJTYW11IE9ua2FsbyIpOworTU9EVUxFX0FVVEhPUigiTGludXMgV2FsbGVpaiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vbWFnbmV0b21ldGVyL21hZzMxMTAuYyBiL2RyaXZlcnMvaWlvL21hZ25ldG9tZXRlci9tYWczMTEwLmMKaW5kZXggZjJiZTRhMC4uZjJiM2JkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vbWFnbmV0b21ldGVyL21hZzMxMTAuYworKysgYi9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvbWFnMzExMC5jCkBAIC0xNTQsMzQgKzE1NCw0MSBAQAogCiAJc3dpdGNoIChtYXNrKSB7CiAJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKLQkJaWYgKGlpb19idWZmZXJfZW5hYmxlZChpbmRpb19kZXYpKQotCQkJcmV0dXJuIC1FQlVTWTsKKwkJcmV0ID0gaWlvX2RldmljZV9jbGFpbV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAogCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKIAkJY2FzZSBJSU9fTUFHTjogLyogaW4gMC4xIHVUIC8gTFNCICovCiAJCQlyZXQgPSBtYWczMTEwX3JlYWQoZGF0YSwgYnVmZmVyKTsKIAkJCWlmIChyZXQgPCAwKQotCQkJCXJldHVybiByZXQ7CisJCQkJZ290byByZWxlYXNlOwogCQkJKnZhbCA9IHNpZ25fZXh0ZW5kMzIoCiAJCQkJYmUxNl90b19jcHUoYnVmZmVyW2NoYW4tPnNjYW5faW5kZXhdKSwgMTUpOwotCQkJcmV0dXJuIElJT19WQUxfSU5UOworCQkJcmV0ID0gSUlPX1ZBTF9JTlQ7CisJCQlicmVhazsKIAkJY2FzZSBJSU9fVEVNUDogLyogaW4gMSBDIC8gTFNCICovCiAJCQltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKIAkJCXJldCA9IG1hZzMxMTBfcmVxdWVzdChkYXRhKTsKIAkJCWlmIChyZXQgPCAwKSB7CiAJCQkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKLQkJCQlyZXR1cm4gcmV0OworCQkJCWdvdG8gcmVsZWFzZTsKIAkJCX0KIAkJCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCiAJCQkJTUFHMzExMF9ESUVfVEVNUCk7CiAJCQltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOwogCQkJaWYgKHJldCA8IDApCi0JCQkJcmV0dXJuIHJldDsKKwkJCQlnb3RvIHJlbGVhc2U7CiAJCQkqdmFsID0gc2lnbl9leHRlbmQzMihyZXQsIDcpOwotCQkJcmV0dXJuIElJT19WQUxfSU5UOworCQkJcmV0ID0gSUlPX1ZBTF9JTlQ7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOworCQkJcmV0ID0gLUVJTlZBTDsKIAkJfQorcmVsZWFzZToKKwkJaWlvX2RldmljZV9yZWxlYXNlX2RpcmVjdF9tb2RlKGluZGlvX2Rldik7CisJCXJldHVybiByZXQ7CisKIAljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6CiAJCXN3aXRjaCAoY2hhbi0+dHlwZSkgewogCQljYXNlIElJT19NQUdOOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vcHJlc3N1cmUvS2NvbmZpZyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL0tjb25maWcKaW5kZXggZDEzMGNkYy4uMTVjZDQxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vcHJlc3N1cmUvS2NvbmZpZworKysgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9LY29uZmlnCkBAIC04LDggKzgsNiBAQAogY29uZmlnIEJNUDI4MAogCXRyaXN0YXRlICJCb3NjaCBTZW5zb3J0ZWMgQk1QMTgwL0JNUDI4MCBwcmVzc3VyZSBzZW5zb3IgSTJDIGRyaXZlciIKIAlkZXBlbmRzIG9uIChJMkMgfHwgU1BJX01BU1RFUikKLQlkZXBlbmRzIG9uICEoQk1QMDg1X0kyQz15IHx8IEJNUDA4NV9JMkM9bSkKLQlkZXBlbmRzIG9uICEoQk1QMDg1X1NQST15IHx8IEJNUDA4NV9TUEk9bSkKIAlzZWxlY3QgUkVHTUFQCiAJc2VsZWN0IEJNUDI4MF9JMkMgaWYgKEkyQykKIAlzZWxlY3QgQk1QMjgwX1NQSSBpZiAoU1BJX01BU1RFUikKQEAgLTE4Nyw0ICsxODUsMjYgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCiAJICBiZSBjYWxsZWQgaHAyMDZjLgogCitjb25maWcgWlBBMjMyNgorCXRyaXN0YXRlICJNdXJhdGEgWlBBMjMyNiBwcmVzc3VyZSBzZW5zb3IgZHJpdmVyIgorCXNlbGVjdCBJSU9fQlVGRkVSCisJc2VsZWN0IElJT19UUklHR0VSRURfQlVGRkVSCisJc2VsZWN0IFJFR01BUAorCXNlbGVjdCBaUEEyMzI2X0kyQyBpZiBJMkMKKwlzZWxlY3QgWlBBMjMyNl9TUEkgaWYgU1BJX01BU1RFUgorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIE11cmF0YSBaUEEyMzI2IHByZXNzdXJlIGFuZAorCSAgdGVtcGVyYXR1cmUgc2Vuc29yLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCB6cGEyMzI2LgorCitjb25maWcgWlBBMjMyNl9JMkMKKwl0cmlzdGF0ZQorCXNlbGVjdCBSRUdNQVBfSTJDCisKK2NvbmZpZyBaUEEyMzI2X1NQSQorCXRyaXN0YXRlCisJc2VsZWN0IFJFR01BUF9TUEkKKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vcHJlc3N1cmUvTWFrZWZpbGUgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9NYWtlZmlsZQppbmRleCA3ZjM5NWJlLi5mZmY3NzE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9wcmVzc3VyZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9NYWtlZmlsZQpAQCAtMjIsNiArMjIsOSBAQAogc3RfcHJlc3N1cmUtJChDT05GSUdfSUlPX0JVRkZFUikgKz0gc3RfcHJlc3N1cmVfYnVmZmVyLm8KIG9iai0kKENPTkZJR19UNTQwMykgKz0gdDU0MDMubwogb2JqLSQoQ09ORklHX0hQMjA2QykgKz0gaHAyMDZjLm8KK29iai0kKENPTkZJR19aUEEyMzI2KSArPSB6cGEyMzI2Lm8KK29iai0kKENPTkZJR19aUEEyMzI2X0kyQykgKz0genBhMjMyNl9pMmMubworb2JqLSQoQ09ORklHX1pQQTIzMjZfU1BJKSArPSB6cGEyMzI2X3NwaS5vCiAKIG9iai0kKENPTkZJR19JSU9fU1RfUFJFU1NfSTJDKSArPSBzdF9wcmVzc3VyZV9pMmMubwogb2JqLSQoQ09ORklHX0lJT19TVF9QUkVTU19TUEkpICs9IHN0X3ByZXNzdXJlX3NwaS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9wcmVzc3VyZS9ibXAyODAtY29yZS5jIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvYm1wMjgwLWNvcmUuYwppbmRleCA2OTQzNjg4Li5lNWE1MzNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9wcmVzc3VyZS9ibXAyODAtY29yZS5jCisrKyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL2JtcDI4MC1jb3JlLmMKQEAgLTk3MCw3ICs5NzAsNyBAQAogCWRhdGEtPnZkZGEgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoZGV2LCAidmRkYSIpOwogCWlmIChJU19FUlIoZGF0YS0+dmRkYSkpIHsKIAkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IFZEREEgcmVndWxhdG9yXG4iKTsKLQkJcmV0ID0gUFRSX0VSUihkYXRhLT52ZGRkKTsKKwkJcmV0ID0gUFRSX0VSUihkYXRhLT52ZGRhKTsKIAkJZ290byBvdXRfZGlzYWJsZV92ZGRkOwogCX0KIAlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKGRhdGEtPnZkZGEpOwpAQCAtMTA3OSw3ICsxMDc5LDggQEAKICNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbnQgYm1wMjgwX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGJtcDI4MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBibXAyODBfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJaW50IHJldDsKIAogCXJldCA9IHJlZ3VsYXRvcl9kaXNhYmxlKGRhdGEtPnZkZGEpOwpAQCAtMTA5MCw3ICsxMDkxLDggQEAKIAogc3RhdGljIGludCBibXAyODBfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBibXAyODBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYm1wMjgwX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCWludCByZXQ7CiAKIAlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKGRhdGEtPnZkZGQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vcHJlc3N1cmUvbXM1NjExX2NvcmUuYyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL21zNTYxMV9jb3JlLmMKaW5kZXggZmViNDFmOC4uYTc0ZWQxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vcHJlc3N1cmUvbXM1NjExX2NvcmUuYworKysgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9tczU2MTFfY29yZS5jCkBAIC00MTYsOCArNDE2LDcgQEAKIAlyZXR1cm4gMDsKIAogZXJyX3JlZ3VsYXRvcl9kaXNhYmxlOgotCWlmICghSVNfRVJSX09SX05VTEwoc3QtPnZkZCkpCi0JCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT52ZGQpOworCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT52ZGQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQyNSw4ICs0MjQsNyBAQAogewogCWNvbnN0IHN0cnVjdCBtczU2MTFfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAotCWlmICghSVNfRVJSX09SX05VTEwoc3QtPnZkZCkpCi0JCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT52ZGQpOworCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT52ZGQpOwogfQogCiBpbnQgbXM1NjExX3Byb2JlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHN0cnVjdCBkZXZpY2UgKmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3pwYTIzMjYuYyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3pwYTIzMjYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWQyZWI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvenBhMjMyNi5jCkBAIC0wLDAgKzEsMTczNSBAQAorLyoKKyAqIE11cmF0YSBaUEEyMzI2IHByZXNzdXJlIGFuZCB0ZW1wZXJhdHVyZSBzZW5zb3IgSUlPIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBQYXJyb3QgUy5BLgorICoKKyAqIEF1dGhvcjogR3JlZ29yIEJvaXJpZSA8Z3JlZ29yLmJvaXJpZUBwYXJyb3QuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisvKioKKyAqIERPQzogWlBBMjMyNiB0aGVvcnkgb2Ygb3BlcmF0aW9ucworICoKKyAqIFRoaXMgZHJpdmVyIHN1cHBvcnRzICVJTkRJT19ESVJFQ1RfTU9ERSBhbmQgJUlORElPX0JVRkZFUl9UUklHR0VSRUQgSUlPCisgKiBtb2Rlcy4KKyAqIEEgaW50ZXJuYWwgaGFyZHdhcmUgdHJpZ2dlciBpcyBhbHNvIGltcGxlbWVudGVkIHRvIGRpc3BhdGNoIHJlZ2lzdGVyZWQgSUlPCisgKiB0cmlnZ2VyIGNvbnN1bWVycyB1cG9uICJzYW1wbGUgcmVhZHkiIGludGVycnVwdHMuCisgKgorICogWlBBMjMyNiBoYXJkd2FyZSBzdXBwb3J0cyAyIHNhbXBsaW5nIG1vZGU6IG9uZSBzaG90IGFuZCBjb250aW51b3VzLgorICoKKyAqIEEgY29tcGxldGUgb25lIHNob3Qgc2FtcGxpbmcgY3ljbGUgZ2V0cyBkZXZpY2Ugb3V0IG9mIGxvdyBwb3dlciBtb2RlLAorICogcGVyZm9ybXMgcHJlc3N1cmUgYW5kIHRlbXBlcmF0dXJlIG1lYXN1cmVtZW50cywgdGhlbiBhdXRvbWF0aWNhbGx5IHN3aXRjaGVzCisgKiBiYWNrIHRvIGxvdyBwb3dlciBtb2RlLiBJdCBpcyBtZWFudCBmb3Igb24gZGVtYW5kIHNhbXBsaW5nIHdpdGggb3B0aW1hbCBwb3dlcgorICogc2F2aW5nIGF0IHRoZSBjb3N0IG9mIGxvd2VyIHNhbXBsaW5nIHJhdGUgYW5kIGhpZ2hlciBzb2Z0d2FyZSBvdmVyaGVhZC4KKyAqIFRoaXMgaXMgYSBuYXR1cmFsIGNhbmRpZGF0ZSBmb3IgSUlPIHJlYWRfcmF3IGhvb2sgaW1wbGVtZW50YXRpb24KKyAqICglSU5ESU9fRElSRUNUX01PREUpLiBJdCBpcyBhbHNvIHVzZWQgZm9yIHRyaWdnZXJlZCBidWZmZXJpbmcgc3VwcG9ydCB0bworICogZW5zdXJlIGV4cGxpY2l0IHN5bmNocm9uaXphdGlvbiB3aXRoIGV4dGVybmFsIHRyaWdnZXIgZXZlbnRzCisgKiAoJUlORElPX0JVRkZFUl9UUklHR0VSRUQpLgorICoKKyAqIFRoZSBjb250aW51b3VzIG1vZGUgd29ya3MgYWNjb3JkaW5nIHRvIGEgcGVyaW9kaWMgaGFyZHdhcmUgbWVhc3VyZW1lbnQKKyAqIHByb2Nlc3MgY29udGludW91c2x5IHB1c2hpbmcgc2FtcGxlcyBpbnRvIGFuIGludGVybmFsIGhhcmR3YXJlIEZJRk8gKGZvcgorICogcHJlc3N1cmUgc2FtcGxlcyBvbmx5KS4gTWVhc3VyZW1lbnQgY3ljbGUgY29tcGxldGlvbiBtYXkgYmUgc2lnbmFsZWQgYnkgYQorICogInNhbXBsZSByZWFkeSIgaW50ZXJydXB0LgorICogVHlwaWNhbCBzb2Z0d2FyZSBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIDoKKyAqIC0gZ2V0IGRldmljZSBvdXQgb2YgbG93IHBvd2VyIG1vZGUsCisgKiAtIHNldHVwIGhhcmR3YXJlIHNhbXBsaW5nIHBlcmlvZCwKKyAqIC0gYXQgZW5kIG9mIHBlcmlvZCwgdXBvbiBkYXRhIHJlYWR5IGludGVycnVwdDogcG9wIHByZXNzdXJlIHNhbXBsZXMgb3V0IG9mCisgKiAgIGhhcmR3YXJlIEZJRk8gYW5kIGZldGNoIHRlbXBlcmF0dXJlIHNhbXBsZQorICogLSB3aGVuIG5vIGxvbmdlciBuZWVkZWQsIHN0b3Agc2FtcGxpbmcgcHJvY2VzcyBieSBwdXR0aW5nIGRldmljZSBpbnRvCisgKiAgIGxvdyBwb3dlciBtb2RlLgorICogVGhpcyBtb2RlIGlzIHVzZWQgdG8gaW1wbGVtZW50ICVJTkRJT19CVUZGRVJfVFJJR0dFUkVEIG1vZGUgaWYgZGV2aWNlIHRyZWUKKyAqIGRlY2xhcmVzIGEgdmFsaWQgaW50ZXJydXB0IGxpbmUuIEluIHRoaXMgY2FzZSwgdGhlIGludGVybmFsIGhhcmR3YXJlIHRyaWdnZXIKKyAqIGRyaXZlcyBhY3F1aXNpdGlvbi4KKyAqCisgKiBOb3RlIHRoYXQgaGFyZHdhcmUgc2FtcGxpbmcgZnJlcXVlbmN5IGlzIHRha2VuIGludG8gYWNjb3VudCBvbmx5IHdoZW4KKyAqIGludGVybmFsIGhhcmR3YXJlIHRyaWdnZXIgaXMgYXR0YWNoZWQgYXMgdGhlIGhpZ2hlc3Qgc2FtcGxpbmcgcmF0ZSBzZWVtcyB0bworICogYmUgdGhlIG1vc3QgZW5lcmd5IGVmZmljaWVudC4KKyAqCisgKiBUT0RPOgorICogICBwcmVzZXQgcHJlc3N1cmUgdGhyZXNob2xkIGNyb3NzaW5nIC8gSUlPIGV2ZW50cyA7CisgKiAgIGRpZmZlcmVudGlhbCBwcmVzc3VyZSBzYW1wbGluZyA7CisgKiAgIGhhcmR3YXJlIHNhbXBsZXMgYXZlcmFnaW5nLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2J1ZmZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXJfY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcmVkX2J1ZmZlci5oPgorI2luY2x1ZGUgInpwYTIzMjYuaCIKKworLyogMjAwIG1zIHNob3VsZCBiZSBlbm91Z2ggZm9yIHRoZSBsb25nZXN0IGNvbnZlcnNpb24gdGltZSBpbiBvbmUtc2hvdCBtb2RlLiAqLworI2RlZmluZSBaUEEyMzI2X0NPTlZFUlNJT05fSklGRklFUyAoSFogLyA1KQorCisvKiBUaGVyZSBzaG91bGQgYmUgYSAxIG1zIGRlbGF5IChUcHVwKSBhZnRlciBnZXR0aW5nIG91dCBvZiByZXNldC4gKi8KKyNkZWZpbmUgWlBBMjMyNl9UUFVQX1VTRUNfTUlOICAgICAgKDEwMDApCisjZGVmaW5lIFpQQTIzMjZfVFBVUF9VU0VDX01BWCAgICAgICgyMDAwKQorCisvKioKKyAqIHN0cnVjdCB6cGEyMzI2X2ZyZXF1ZW5jeSAtIEhhcmR3YXJlIHNhbXBsaW5nIGZyZXF1ZW5jeSBkZXNjcmlwdG9yCisgKiBAaHogOiBGcmVxdWVuY3kgaW4gSGVydHouCisgKiBAb2RyOiBPdXRwdXQgRGF0YSBSYXRlIHdvcmQgYXMgZXhwZWN0ZWQgYnkgJVpQQTIzMjZfQ1RSTF9SRUczX1JFRy4KKyAqLworc3RydWN0IHpwYTIzMjZfZnJlcXVlbmN5IHsKKwlpbnQgaHo7CisJdTE2IG9kcjsKK307CisKKy8qCisgKiBLZWVwIHRoZXNlIGluIHN0cmljdCBhc2NlbmRpbmcgb3JkZXI6IGxhc3QgYXJyYXkgZW50cnkgaXMgZXhwZWN0ZWQgdG8KKyAqIGNvcnJlc3BvbmQgdG8gdGhlIGhpZ2hlc3Qgc2FtcGxpbmcgZnJlcXVlbmN5LgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHpwYTIzMjZfZnJlcXVlbmN5IHpwYTIzMjZfc2FtcGxpbmdfZnJlcXVlbmNpZXNbXSA9IHsKKwl7IC5oeiA9IDEsICAub2RyID0gMSA8PCBaUEEyMzI2X0NUUkxfUkVHM19PRFJfU0hJRlQgfSwKKwl7IC5oeiA9IDUsICAub2RyID0gNSA8PCBaUEEyMzI2X0NUUkxfUkVHM19PRFJfU0hJRlQgfSwKKwl7IC5oeiA9IDExLCAub2RyID0gNiA8PCBaUEEyMzI2X0NUUkxfUkVHM19PRFJfU0hJRlQgfSwKKwl7IC5oeiA9IDIzLCAub2RyID0gNyA8PCBaUEEyMzI2X0NUUkxfUkVHM19PRFJfU0hJRlQgfSwKK307CisKKy8qIFJldHVybiB0aGUgaGlnaGVzdCBoYXJkd2FyZSBzYW1wbGluZyBmcmVxdWVuY3kgYXZhaWxhYmxlLiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB6cGEyMzI2X2ZyZXF1ZW5jeSAqenBhMjMyNl9oaWdoZXN0X2ZyZXF1ZW5jeSh2b2lkKQoreworCXJldHVybiAmenBhMjMyNl9zYW1wbGluZ19mcmVxdWVuY2llc1sKKwkJQVJSQVlfU0laRSh6cGEyMzI2X3NhbXBsaW5nX2ZyZXF1ZW5jaWVzKSAtIDFdOworfQorCisvKioKKyAqIHN0cnVjdCB6cGFfcHJpdmF0ZSAtIFBlci1kZXZpY2UgaW50ZXJuYWwgcHJpdmF0ZSBzdGF0ZQorICogQHRpbWVzdGFtcDogIEJ1ZmZlcmVkIHNhbXBsZXMgcmVhZHkgZGF0dW0uCisgKiBAcmVnbWFwOiAgICAgVW5kZXJseWluZyBJMkMgLyBTUEkgYnVzIGFkYXB0ZXIgdXNlZCB0byBhYnN0cmFjdCBzbGF2ZSByZWdpc3RlcgorICogICAgICAgICAgICAgIGFjY2Vzc2VzLgorICogQHJlc3VsdDogICAgIEFsbG93cyBzYW1wbGluZyBsb2dpYyB0byBnZXQgY29tcGxldGlvbiBzdGF0dXMgb2Ygb3BlcmF0aW9ucworICogICAgICAgICAgICAgIHRoYXQgaW50ZXJydXB0IGhhbmRsZXJzIHBlcmZvcm0gYXN5bmNocm9ub3VzbHkuCisgKiBAZGF0YV9yZWFkeTogSW50ZXJydXB0IGhhbmRsZXIgdXNlcyB0aGlzIHRvIHdha2UgdXNlciBjb250ZXh0IHVwIGF0IHNhbXBsaW5nCisgKiAgICAgICAgICAgICAgb3BlcmF0aW9uIGNvbXBsZXRpb24uCisgKiBAdHJpZ2dlcjogICAgT3B0aW9uYWwgaGFyZHdhcmUgLyBpbnRlcnJ1cHQgZHJpdmVuIHRyaWdnZXIgdXNlZCB0byBub3RpZnkKKyAqICAgICAgICAgICAgICBleHRlcm5hbCBkZXZpY2VzIGEgbmV3IHNhbXBsZSBpcyByZWFkeS4KKyAqIEB3YWtlbjogICAgICBGbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgZGV2aWNlIGhhcyBqdXN0IGJlZW4gcG93ZXJlZCBvbi4KKyAqIEBpcnE6ICAgICAgICBPcHRpb25hbCBpbnRlcnJ1cHQgbGluZTogbmVnYXRpdmUgb3IgemVybyBpZiBub3QgZGVjbGFyZWQgaW50bworICogICAgICAgICAgICAgIERULCBpbiB3aGljaCBjYXNlIHNhbXBsaW5nIGxvZ2ljIGtlZXBzIHBvbGxpbmcgc3RhdHVzIHJlZ2lzdGVyCisgKiAgICAgICAgICAgICAgdG8gZGV0ZWN0IGNvbXBsZXRpb24uCisgKiBAZnJlcXVlbmN5OiAgQ3VycmVudCBoYXJkd2FyZSBzYW1wbGluZyBmcmVxdWVuY3kuCisgKiBAdnJlZjogICAgICAgUG93ZXIgLyB2b2x0YWdlIHJlZmVyZW5jZS4KKyAqIEB2ZGQ6ICAgICAgICBQb3dlciBzdXBwbHkuCisgKi8KK3N0cnVjdCB6cGEyMzI2X3ByaXZhdGUgeworCXM2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOworCXN0cnVjdCByZWdtYXAgICAgICAgICAgICAgICAgICAqcmVnbWFwOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OworCXN0cnVjdCBjb21wbGV0aW9uICAgICAgICAgICAgICAgZGF0YV9yZWFkeTsKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIgICAgICAgICAgICAgKnRyaWdnZXI7CisJYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWtlbjsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlycTsKKwljb25zdCBzdHJ1Y3QgenBhMjMyNl9mcmVxdWVuY3kgKmZyZXF1ZW5jeTsKKwlzdHJ1Y3QgcmVndWxhdG9yICAgICAgICAgICAgICAgKnZyZWY7CisJc3RydWN0IHJlZ3VsYXRvciAgICAgICAgICAgICAgICp2ZGQ7Cit9OworCisjZGVmaW5lIHpwYTIzMjZfZXJyKF9pZGV2LCBfZm9ybWF0LCBfYXJnLi4uKSBcCisJZGV2X2VycihfaWRldi0+ZGV2LnBhcmVudCwgX2Zvcm1hdCwgIyNfYXJnKQorCisjZGVmaW5lIHpwYTIzMjZfd2FybihfaWRldiwgX2Zvcm1hdCwgX2FyZy4uLikgXAorCWRldl93YXJuKF9pZGV2LT5kZXYucGFyZW50LCBfZm9ybWF0LCAjI19hcmcpCisKKyNpZmRlZiBERUJVRworI2RlZmluZSB6cGEyMzI2X2RiZyhfaWRldiwgX2Zvcm1hdCwgX2FyZy4uLikgXAorCWRldl9kYmcoX2lkZXYtPmRldi5wYXJlbnQsIF9mb3JtYXQsICMjX2FyZykKKyNlbHNlCisjZGVmaW5lIHpwYTIzMjZfZGJnKF9pZGV2LCBfZm9ybWF0LCBfYXJnLi4uKQorI2VuZGlmCisKK2Jvb2wgenBhMjMyNl9pc3JlZ193cml0ZWFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBaUEEyMzI2X1JFRl9QX1hMX1JFRzoKKwljYXNlIFpQQTIzMjZfUkVGX1BfTF9SRUc6CisJY2FzZSBaUEEyMzI2X1JFRl9QX0hfUkVHOgorCWNhc2UgWlBBMjMyNl9SRVNfQ09ORl9SRUc6CisJY2FzZSBaUEEyMzI2X0NUUkxfUkVHMF9SRUc6CisJY2FzZSBaUEEyMzI2X0NUUkxfUkVHMV9SRUc6CisJY2FzZSBaUEEyMzI2X0NUUkxfUkVHMl9SRUc6CisJY2FzZSBaUEEyMzI2X0NUUkxfUkVHM19SRUc6CisJY2FzZSBaUEEyMzI2X1RIU19QX0xPV19SRUc6CisJY2FzZSBaUEEyMzI2X1RIU19QX0hJR0hfUkVHOgorCQlyZXR1cm4gdHJ1ZTsKKworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh6cGEyMzI2X2lzcmVnX3dyaXRlYWJsZSk7CisKK2Jvb2wgenBhMjMyNl9pc3JlZ19yZWFkYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFpQQTIzMjZfUkVGX1BfWExfUkVHOgorCWNhc2UgWlBBMjMyNl9SRUZfUF9MX1JFRzoKKwljYXNlIFpQQTIzMjZfUkVGX1BfSF9SRUc6CisJY2FzZSBaUEEyMzI2X0RFVklDRV9JRF9SRUc6CisJY2FzZSBaUEEyMzI2X1JFU19DT05GX1JFRzoKKwljYXNlIFpQQTIzMjZfQ1RSTF9SRUcwX1JFRzoKKwljYXNlIFpQQTIzMjZfQ1RSTF9SRUcxX1JFRzoKKwljYXNlIFpQQTIzMjZfQ1RSTF9SRUcyX1JFRzoKKwljYXNlIFpQQTIzMjZfQ1RSTF9SRUczX1JFRzoKKwljYXNlIFpQQTIzMjZfSU5UX1NPVVJDRV9SRUc6CisJY2FzZSBaUEEyMzI2X1RIU19QX0xPV19SRUc6CisJY2FzZSBaUEEyMzI2X1RIU19QX0hJR0hfUkVHOgorCWNhc2UgWlBBMjMyNl9TVEFUVVNfUkVHOgorCWNhc2UgWlBBMjMyNl9QUkVTU19PVVRfWExfUkVHOgorCWNhc2UgWlBBMjMyNl9QUkVTU19PVVRfTF9SRUc6CisJY2FzZSBaUEEyMzI2X1BSRVNTX09VVF9IX1JFRzoKKwljYXNlIFpQQTIzMjZfVEVNUF9PVVRfTF9SRUc6CisJY2FzZSBaUEEyMzI2X1RFTVBfT1VUX0hfUkVHOgorCQlyZXR1cm4gdHJ1ZTsKKworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh6cGEyMzI2X2lzcmVnX3JlYWRhYmxlKTsKKworYm9vbCB6cGEyMzI2X2lzcmVnX3ByZWNpb3VzKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgWlBBMjMyNl9JTlRfU09VUkNFX1JFRzoKKwljYXNlIFpQQTIzMjZfUFJFU1NfT1VUX0hfUkVHOgorCQlyZXR1cm4gdHJ1ZTsKKworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh6cGEyMzI2X2lzcmVnX3ByZWNpb3VzKTsKKworLyoqCisgKiB6cGEyMzI2X2VuYWJsZV9kZXZpY2UoKSAtIEVuYWJsZSBkZXZpY2UsIGkuZS4gZ2V0IG91dCBvZiBsb3cgcG93ZXIgbW9kZS4KKyAqIEBpbmRpb19kZXY6IFRoZSBJSU8gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaGFyZHdhcmUgdG8gZW5hYmxlLgorICoKKyAqIFJlcXVpcmVkIHRvIGFjY2VzcyBjb21wbGV0ZSByZWdpc3RlciBzcGFjZSBhbmQgdG8gcGVyZm9ybSBhbnkgc2FtcGxpbmcKKyAqIG9yIGNvbnRyb2wgb3BlcmF0aW9ucy4KKyAqCisgKiBSZXR1cm46IFplcm8gd2hlbiBzdWNjZXNzZnVsLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IHpwYTIzMjZfZW5hYmxlX2RldmljZShjb25zdCBzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCWludCBlcnI7CisKKwllcnIgPSByZWdtYXBfd3JpdGUoKChzdHJ1Y3QgenBhMjMyNl9wcml2YXRlICopCisJCQkgICAgaWlvX3ByaXYoaW5kaW9fZGV2KSktPnJlZ21hcCwKKwkJCSAgICBaUEEyMzI2X0NUUkxfUkVHMF9SRUcsIFpQQTIzMjZfQ1RSTF9SRUcwX0VOQUJMRSk7CisJaWYgKGVycikgeworCQl6cGEyMzI2X2VycihpbmRpb19kZXYsICJmYWlsZWQgdG8gZW5hYmxlIGRldmljZSAoJWQpIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwl6cGEyMzI2X2RiZyhpbmRpb19kZXYsICJlbmFibGVkIik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB6cGEyMzI2X3NsZWVwKCkgLSBEaXNhYmxlIGRldmljZSwgaS5lLiBzd2l0Y2ggdG8gbG93IHBvd2VyIG1vZGUuCisgKiBAaW5kaW9fZGV2OiBUaGUgSUlPIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIGhhcmR3YXJlIHRvIGRpc2FibGUuCisgKgorICogT25seSAlWlBBMjMyNl9ERVZJQ0VfSURfUkVHIGFuZCAlWlBBMjMyNl9DVFJMX1JFRzBfUkVHIHJlZ2lzdGVycyBtYXkgYmUKKyAqIGFjY2Vzc2VkIG9uY2UgZGV2aWNlIGlzIGluIHRoZSBkaXNhYmxlZCBzdGF0ZS4KKyAqCisgKiBSZXR1cm46IFplcm8gd2hlbiBzdWNjZXNzZnVsLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IHpwYTIzMjZfc2xlZXAoY29uc3Qgc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcmVnbWFwX3dyaXRlKCgoc3RydWN0IHpwYTIzMjZfcHJpdmF0ZSAqKQorCQkJICAgIGlpb19wcml2KGluZGlvX2RldikpLT5yZWdtYXAsCisJCQkgICAgWlBBMjMyNl9DVFJMX1JFRzBfUkVHLCAwKTsKKwlpZiAoZXJyKSB7CisJCXpwYTIzMjZfZXJyKGluZGlvX2RldiwgImZhaWxlZCB0byBzbGVlcCAoJWQpIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwl6cGEyMzI2X2RiZyhpbmRpb19kZXYsICJzbGVlcGluZyIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogenBhMjMyNl9yZXNldF9kZXZpY2UoKSAtIFJlc2V0IGRldmljZSB0byBkZWZhdWx0IGhhcmR3YXJlIHN0YXRlLgorICogQGluZGlvX2RldjogVGhlIElJTyBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBoYXJkd2FyZSB0byByZXNldC4KKyAqCisgKiBEaXNhYmxlIHNhbXBsaW5nIGFuZCBlbXB0eSBoYXJkd2FyZSBGSUZPLgorICogRGV2aWNlIG11c3QgYmUgZW5hYmxlZCBiZWZvcmUgcmVzZXQsIGkuZS4gbm90IGluIGxvdyBwb3dlciBtb2RlLgorICoKKyAqIFJldHVybjogWmVybyB3aGVuIHN1Y2Nlc3NmdWwsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgenBhMjMyNl9yZXNldF9kZXZpY2UoY29uc3Qgc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcmVnbWFwX3dyaXRlKCgoc3RydWN0IHpwYTIzMjZfcHJpdmF0ZSAqKQorCQkJICAgIGlpb19wcml2KGluZGlvX2RldikpLT5yZWdtYXAsCisJCQkgICAgWlBBMjMyNl9DVFJMX1JFRzJfUkVHLCBaUEEyMzI2X0NUUkxfUkVHMl9TV1JFU0VUKTsKKwlpZiAoZXJyKSB7CisJCXpwYTIzMjZfZXJyKGluZGlvX2RldiwgImZhaWxlZCB0byByZXNldCBkZXZpY2UgKCVkKSIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJdXNsZWVwX3JhbmdlKFpQQTIzMjZfVFBVUF9VU0VDX01JTiwgWlBBMjMyNl9UUFVQX1VTRUNfTUFYKTsKKworCXpwYTIzMjZfZGJnKGluZGlvX2RldiwgInJlc2V0Iik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB6cGEyMzI2X3N0YXJ0X29uZXNob3QoKSAtIFN0YXJ0IGEgc2luZ2xlIHNhbXBsaW5nIGN5Y2xlLCBpLmUuIGluIG9uZSBzaG90CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUuCisgKiBAaW5kaW9fZGV2OiBUaGUgSUlPIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbXBsaW5nIGhhcmR3YXJlLgorICoKKyAqIERldmljZSBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IGVuYWJsZWQgYW5kIGNvbmZpZ3VyZWQgZm9yIG9uZSBzaG90IG1vZGUuCisgKiBEZXZpY2Ugd2lsbCBiZSBzd2l0Y2hlZCBiYWNrIHRvIGxvdyBwb3dlciBtb2RlIGF0IGVuZCBvZiBjeWNsZS4KKyAqCisgKiBSZXR1cm46IFplcm8gd2hlbiBzdWNjZXNzZnVsLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IHpwYTIzMjZfc3RhcnRfb25lc2hvdChjb25zdCBzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCWludCBlcnI7CisKKwllcnIgPSByZWdtYXBfd3JpdGUoKChzdHJ1Y3QgenBhMjMyNl9wcml2YXRlICopCisJCQkgICAgaWlvX3ByaXYoaW5kaW9fZGV2KSktPnJlZ21hcCwKKwkJCSAgICBaUEEyMzI2X0NUUkxfUkVHMF9SRUcsCisJCQkgICAgWlBBMjMyNl9DVFJMX1JFRzBfRU5BQkxFIHwKKwkJCSAgICBaUEEyMzI2X0NUUkxfUkVHMF9PTkVfU0hPVCk7CisJaWYgKGVycikgeworCQl6cGEyMzI2X2VycihpbmRpb19kZXYsICJmYWlsZWQgdG8gc3RhcnQgb25lIHNob3QgY3ljbGUgKCVkKSIsCisJCQkgICAgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwl6cGEyMzI2X2RiZyhpbmRpb19kZXYsICJvbmUgc2hvdCBjeWNsZSBzdGFydGVkIik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB6cGEyMzI2X3Bvd2VyX29uKCkgLSBQb3dlciBvbiBkZXZpY2UgdG8gYWxsb3cgc3Vic2VxdWVudCBjb25maWd1cmF0aW9uLgorICogQGluZGlvX2RldjogVGhlIElJTyBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1wbGluZyBoYXJkd2FyZS4KKyAqIEBwcml2YXRlOiAgIEludGVybmFsIHByaXZhdGUgc3RhdGUgcmVsYXRlZCB0byBAaW5kaW9fZGV2LgorICoKKyAqIFNhbXBsaW5nIHdpbGwgYmUgZGlzYWJsZWQsIHByZXZlbnRpbmcgc3RyYW5nZSB0aGluZ3MgZnJvbSBoYXBwZW5pbmcgaW4gb3VyCisgKiBiYWNrLiBIYXJkd2FyZSBGSUZPIGNvbnRlbnQgd2lsbCBiZSBjbGVhcmVkLgorICogV2hlbiBzdWNjZXNzZnVsLCBkZXZpY2Ugd2lsbCBiZSBsZWZ0IGluIHRoZSBlbmFibGVkIHN0YXRlIHRvIGFsbG93IGZ1cnRoZXIKKyAqIGNvbmZpZ3VyYXRpb24uCisgKgorICogUmV0dXJuOiBaZXJvIHdoZW4gc3VjY2Vzc2Z1bCwgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCB6cGEyMzI2X3Bvd2VyX29uKGNvbnN0IHN0cnVjdCBpaW9fZGV2ICAgICAgICAgKmluZGlvX2RldiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgenBhMjMyNl9wcml2YXRlICpwcml2YXRlKQoreworCWludCBlcnI7CisKKwllcnIgPSByZWd1bGF0b3JfZW5hYmxlKHByaXZhdGUtPnZyZWYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSByZWd1bGF0b3JfZW5hYmxlKHByaXZhdGUtPnZkZCk7CisJaWYgKGVycikKKwkJZ290byB2cmVmOworCisJenBhMjMyNl9kYmcoaW5kaW9fZGV2LCAicG93ZXJlZCBvbiIpOworCisJZXJyID0genBhMjMyNl9lbmFibGVfZGV2aWNlKGluZGlvX2Rldik7CisJaWYgKGVycikKKwkJZ290byB2ZGQ7CisKKwllcnIgPSB6cGEyMzI2X3Jlc2V0X2RldmljZShpbmRpb19kZXYpOworCWlmIChlcnIpCisJCWdvdG8gc2xlZXA7CisKKwlyZXR1cm4gMDsKKworc2xlZXA6CisJenBhMjMyNl9zbGVlcChpbmRpb19kZXYpOwordmRkOgorCXJlZ3VsYXRvcl9kaXNhYmxlKHByaXZhdGUtPnZkZCk7Cit2cmVmOgorCXJlZ3VsYXRvcl9kaXNhYmxlKHByaXZhdGUtPnZyZWYpOworCisJenBhMjMyNl9kYmcoaW5kaW9fZGV2LCAicG93ZXJlZCBvZmYiKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogenBhMjMyNl9wb3dlcl9vZmYoKSAtIFBvd2VyIG9mZiBkZXZpY2UsIGkuZS4gZGlzYWJsZSBhdHRhY2hlZCBwb3dlcgorICogICAgICAgICAgICAgICAgICAgICAgIHJlZ3VsYXRvcnMuCisgKiBAaW5kaW9fZGV2OiBUaGUgSUlPIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbXBsaW5nIGhhcmR3YXJlLgorICogQHByaXZhdGU6ICAgSW50ZXJuYWwgcHJpdmF0ZSBzdGF0ZSByZWxhdGVkIHRvIEBpbmRpb19kZXYuCisgKgorICogUmV0dXJuOiBaZXJvIHdoZW4gc3VjY2Vzc2Z1bCwgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIHZvaWQgenBhMjMyNl9wb3dlcl9vZmYoY29uc3Qgc3RydWN0IGlpb19kZXYgICAgICAgICAqaW5kaW9fZGV2LAorCQkJICAgICAgY29uc3Qgc3RydWN0IHpwYTIzMjZfcHJpdmF0ZSAqcHJpdmF0ZSkKK3sKKwlyZWd1bGF0b3JfZGlzYWJsZShwcml2YXRlLT52ZGQpOworCXJlZ3VsYXRvcl9kaXNhYmxlKHByaXZhdGUtPnZyZWYpOworCisJenBhMjMyNl9kYmcoaW5kaW9fZGV2LCAicG93ZXJlZCBvZmYiKTsKK30KKworLyoqCisgKiB6cGEyMzI2X2NvbmZpZ19vbmVzaG90KCkgLSBTZXR1cCBkZXZpY2UgZm9yIG9uZSBzaG90IC8gb24gZGVtYW5kIG1vZGUuCisgKiBAaW5kaW9fZGV2OiBUaGUgSUlPIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbXBsaW5nIGhhcmR3YXJlLgorICogQGlycTogICAgICAgT3B0aW9uYWwgaW50ZXJydXB0IGxpbmUgdGhlIGhhcmR3YXJlIHVzZXMgdG8gbm90aWZ5IG5ldyBkYXRhCisgKiAgICAgICAgICAgICBzYW1wbGVzIGFyZSByZWFkeS4gTmVnYXRpdmUgb3IgemVybyB2YWx1ZXMgaW5kaWNhdGUgbm8gaW50ZXJydXB0cworICogICAgICAgICAgICAgYXJlIGF2YWlsYWJsZSwgbWVhbmluZyBwb2xsaW5nIGlzIHJlcXVpcmVkLgorICoKKyAqIE91dHB1dCBEYXRhIFJhdGUgaXMgY29uZmlndXJlZCBmb3IgdGhlIGhpZ2hlc3QgcG9zc2libGUgcmF0ZSBzbyB0aGF0CisgKiBjb252ZXJzaW9uIHRpbWUgYW5kIHBvd2VyIGNvbnN1bXB0aW9uIGFyZSByZWR1Y2VkIHRvIGEgbWluaW11bS4KKyAqIE5vdGUgdGhhdCBoYXJkd2FyZSBpbnRlcm5hbCBhdmVyYWdpbmcgbWFjaGluZXJ5IChub3QgaW1wbGVtZW50ZWQgaW4gdGhpcworICogZHJpdmVyKSBpcyBub3QgYXBwbGljYWJsZSBpbiB0aGlzIG1vZGUuCisgKgorICogRGV2aWNlIG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgZW5hYmxlZCBiZWZvcmUgY2FsbGluZworICogenBhMjMyNl9jb25maWdfb25lc2hvdCgpLgorICoKKyAqIFJldHVybjogWmVybyB3aGVuIHN1Y2Nlc3NmdWwsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgenBhMjMyNl9jb25maWdfb25lc2hvdChjb25zdCBzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJCSAgaW50ICAgICAgICAgICAgICAgICAgIGlycSkKK3sKKwlzdHJ1Y3QgcmVnbWFwICAgICAgICAgICAgICAgICAgKnJlZ3MgPSAoKHN0cnVjdCB6cGEyMzI2X3ByaXZhdGUgKikKKwkJCQkJCWlpb19wcml2KGluZGlvX2RldikpLT5yZWdtYXA7CisJY29uc3Qgc3RydWN0IHpwYTIzMjZfZnJlcXVlbmN5ICpmcmVxID0genBhMjMyNl9oaWdoZXN0X2ZyZXF1ZW5jeSgpOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyOworCisJLyogU2V0dXAgaGlnaGVzdCBhdmFpbGFibGUgT3V0cHV0IERhdGEgUmF0ZSBmb3Igb25lIHNob3QgbW9kZS4gKi8KKwllcnIgPSByZWdtYXBfd3JpdGUocmVncywgWlBBMjMyNl9DVFJMX1JFRzNfUkVHLCBmcmVxLT5vZHIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoaXJxID4gMCkgeworCQkvKiBSZXF1ZXN0IGludGVycnVwdCB3aGVuIG5ldyBzYW1wbGUgaXMgYXZhaWxhYmxlLiAqLworCQllcnIgPSByZWdtYXBfd3JpdGUocmVncywgWlBBMjMyNl9DVFJMX1JFRzFfUkVHLAorCQkJCSAgICh1OCl+WlBBMjMyNl9DVFJMX1JFRzFfTUFTS19EQVRBX1JFQURZKTsKKworCQlpZiAoZXJyKSB7CisJCQlkZXZfZXJyKGluZGlvX2Rldi0+ZGV2LnBhcmVudCwKKwkJCQkiZmFpbGVkIHRvIHNldHVwIG9uZSBzaG90IG1vZGUgKCVkKSIsIGVycik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJenBhMjMyNl9kYmcoaW5kaW9fZGV2LCAib25lIHNob3QgbW9kZSBzZXR1cCBAJWRIeiIsIGZyZXEtPmh6KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHpwYTIzMjZfY2xlYXJfZmlmbygpIC0gQ2xlYXIgcmVtYWluaW5nIGVudHJpZXMgaW4gaGFyZHdhcmUgRklGTy4KKyAqIEBpbmRpb19kZXY6IFRoZSBJSU8gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtcGxpbmcgaGFyZHdhcmUuCisgKiBAbWluX2NvdW50OiBOdW1iZXIgb2Ygc2FtcGxlcyBwcmVzZW50IHdpdGhpbiBoYXJkd2FyZSBGSUZPLgorICoKKyAqIEBtaW5fY291bnQgYXJndW1lbnQgaXMgYSBoaW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGtub3duIG1pbmltdW0gbnVtYmVyIG9mCisgKiBzYW1wbGVzIGN1cnJlbnRseSBsaXZpbmcgaW4gdGhlIEZJRk8uIFRoaXMgYWxsb3dzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGJ1cworICogYWNjZXNzZXMgYnkgc2tpcHBpbmcgc3RhdHVzIHJlZ2lzdGVyIHJlYWQgb3BlcmF0aW9uIGFzIGxvbmcgYXMgd2Uga25vdyBmb3IKKyAqIHN1cmUgdGhlcmUgYXJlIHN0aWxsIGVudHJpZXMgbGVmdC4KKyAqCisgKiBSZXR1cm46IFplcm8gd2hlbiBzdWNjZXNzZnVsLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IHpwYTIzMjZfY2xlYXJfZmlmbyhjb25zdCBzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgIG1pbl9jb3VudCkKK3sKKwlzdHJ1Y3QgcmVnbWFwICpyZWdzID0gKChzdHJ1Y3QgenBhMjMyNl9wcml2YXRlICopCisJCQkgICAgICAgaWlvX3ByaXYoaW5kaW9fZGV2KSktPnJlZ21hcDsKKwlpbnQgICAgICAgICAgICBlcnI7CisJdW5zaWduZWQgaW50ICAgdmFsOworCisJaWYgKCFtaW5fY291bnQpIHsKKwkJLyoKKwkJICogTm8gaGludDogcmVhZCBzdGF0dXMgcmVnaXN0ZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgRklGTyBpcworCQkgKiBlbXB0eSBvciBub3QuCisJCSAqLworCQllcnIgPSByZWdtYXBfcmVhZChyZWdzLCBaUEEyMzI2X1NUQVRVU19SRUcsICZ2YWwpOworCisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnI7CisKKwkJaWYgKHZhbCAmIFpQQTIzMjZfU1RBVFVTX0ZJRk9fRSkKKwkJCS8qIEZpZm8gaXMgZW1wdHk6IG5vdGhpbmcgdG8gdHJhc2guICovCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDbGVhciBGSUZPLiAqLworCWRvIHsKKwkJLyoKKwkJICogQSBzaW5nbGUgZmV0Y2ggZnJvbSBwcmVzc3VyZSBNU0IgcmVnaXN0ZXIgaXMgZW5vdWdoIHRvIHBvcAorCQkgKiB2YWx1ZXMgb3V0IG9mIEZJRk8uCisJCSAqLworCQllcnIgPSByZWdtYXBfcmVhZChyZWdzLCBaUEEyMzI2X1BSRVNTX09VVF9IX1JFRywgJnZhbCk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnI7CisKKwkJaWYgKG1pbl9jb3VudCkgeworCQkJLyoKKwkJCSAqIFdlIGtub3cgZm9yIHN1cmUgdGhlcmUgYXJlIGF0IGxlYXN0IG1pbl9jb3VudCBlbnRyaWVzCisJCQkgKiBsZWZ0IGluIEZJRk8uIFNraXAgc3RhdHVzIHJlZ2lzdGVyIHJlYWQuCisJCQkgKi8KKwkJCW1pbl9jb3VudC0tOworCQkJY29udGludWU7CisJCX0KKworCQllcnIgPSByZWdtYXBfcmVhZChyZWdzLCBaUEEyMzI2X1NUQVRVU19SRUcsICZ2YWwpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXJyOworCisJfSB3aGlsZSAoISh2YWwgJiBaUEEyMzI2X1NUQVRVU19GSUZPX0UpKTsKKworCXpwYTIzMjZfZGJnKGluZGlvX2RldiwgIkZJRk8gY2xlYXJlZCIpOworCisJcmV0dXJuIDA7CisKK2VycjoKKwl6cGEyMzI2X2VycihpbmRpb19kZXYsICJmYWlsZWQgdG8gY2xlYXIgRklGTyAoJWQpIiwgZXJyKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogenBhMjMyNl9kZXF1ZXVlX3ByZXNzdXJlKCkgLSBSZXRyaWV2ZSB0aGUgbW9zdCByZWNlbnQgcHJlc3N1cmUgc2FtcGxlIGZyb20KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmUgRklGTy4KKyAqIEBpbmRpb19kZXY6IFRoZSBJSU8gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtcGxpbmcgaGFyZHdhcmUuCisgKiBAcHJlc3N1cmU6ICBTYW1wbGVkIHByZXNzdXJlIG91dHB1dC4KKyAqCisgKiBOb3RlIHRoYXQgWlBBMjMyNiBoYXJkd2FyZSBGSUZPIHN0b3JlcyBwcmVzc3VyZSBzYW1wbGVzIG9ubHkuCisgKgorICogUmV0dXJuOiBaZXJvIHdoZW4gc3VjY2Vzc2Z1bCwgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCB6cGEyMzI2X2RlcXVldWVfcHJlc3N1cmUoY29uc3Qgc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCQkgICAgdTMyICAgICAgICAgICAgICAgICAgKnByZXNzdXJlKQoreworCXN0cnVjdCByZWdtYXAgKnJlZ3MgPSAoKHN0cnVjdCB6cGEyMzI2X3ByaXZhdGUgKikKKwkJCSAgICAgICBpaW9fcHJpdihpbmRpb19kZXYpKS0+cmVnbWFwOworCXVuc2lnbmVkIGludCAgIHZhbDsKKwlpbnQgICAgICAgICAgICBlcnI7CisJaW50ICAgICAgICAgICAgY2xlYXJlZCA9IC0xOworCisJZXJyID0gcmVnbWFwX3JlYWQocmVncywgWlBBMjMyNl9TVEFUVVNfUkVHLCAmdmFsKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCSpwcmVzc3VyZSA9IDA7CisKKwlpZiAodmFsICYgWlBBMjMyNl9TVEFUVVNfUF9PUikgeworCQkvKgorCQkgKiBGaWZvIG92ZXJydW4gOiBmaXJzdCBzYW1wbGUgZGVxdWV1ZWQgZnJvbSBGSUZPIGlzIHRoZQorCQkgKiBuZXdlc3QuCisJCSAqLworCQl6cGEyMzI2X3dhcm4oaW5kaW9fZGV2LCAiRklGTyBvdmVyZmxvdyIpOworCisJCWVyciA9IHJlZ21hcF9idWxrX3JlYWQocmVncywgWlBBMjMyNl9QUkVTU19PVVRfWExfUkVHLCBwcmVzc3VyZSwKKwkJCQkgICAgICAgMyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisjZGVmaW5lIFpQQTIzMjZfRklGT19ERVBUSCAoMTZVKQorCQkvKiBIYXJkd2FyZSBGSUZPIG1heSBob2xkIG5vIG1vcmUgdGhhbiAxNiBwcmVzc3VyZSBzYW1wbGVzLiAqLworCQlyZXR1cm4genBhMjMyNl9jbGVhcl9maWZvKGluZGlvX2RldiwgWlBBMjMyNl9GSUZPX0RFUFRIIC0gMSk7CisJfQorCisJLyoKKwkgKiBGaWZvIGhhcyBub3Qgb3ZlcmZsb3duIDogcmV0cmlldmUgbmV3ZXN0IHNhbXBsZS4gV2UgbmVlZCB0byBwb3AKKwkgKiB2YWx1ZXMgb3V0IHVudGlsIEZJRk8gaXMgZW1wdHkgOiBsYXN0IGZldGNoZWQgcHJlc3N1cmUgaXMgdGhlIG5ld2VzdC4KKwkgKiBJbiBub21pbmFsIGNhc2VzLCB3ZSBzaG91bGQgZmluZCBhIHNpbmdsZSBxdWV1ZWQgc2FtcGxlIG9ubHkuCisJICovCisJZG8geworCQllcnIgPSByZWdtYXBfYnVsa19yZWFkKHJlZ3MsIFpQQTIzMjZfUFJFU1NfT1VUX1hMX1JFRywgcHJlc3N1cmUsCisJCQkJICAgICAgIDMpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQllcnIgPSByZWdtYXBfcmVhZChyZWdzLCBaUEEyMzI2X1NUQVRVU19SRUcsICZ2YWwpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisKKwkJY2xlYXJlZCsrOworCX0gd2hpbGUgKCEodmFsICYgWlBBMjMyNl9TVEFUVVNfRklGT19FKSk7CisKKwlpZiAoY2xlYXJlZCkKKwkJLyoKKwkJICogU2FtcGxlcyB3ZXJlIHB1c2hlZCBieSBoYXJkd2FyZSBkdXJpbmcgcHJldmlvdXMgcm91bmRzIGJ1dCB3ZQorCQkgKiBkaWRuJ3QgY29uc3VtZSB0aGVtIGZhc3QgZW5vdWdoOiBpbmZvcm0gdXNlci4KKwkJICovCisJCXpwYTIzMjZfZGJnKGluZGlvX2RldiwgImNsZWFyZWQgJWQgRklGTyBlbnRyaWVzIiwgY2xlYXJlZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB6cGEyMzI2X2ZpbGxfc2FtcGxlX2J1ZmZlcigpIC0gRW5xdWV1ZSBuZXcgY2hhbm5lbCBzYW1wbGVzIHRvIElJTyBidWZmZXIuCisgKiBAaW5kaW9fZGV2OiBUaGUgSUlPIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbXBsaW5nIGhhcmR3YXJlLgorICogQHByaXZhdGU6ICAgSW50ZXJuYWwgcHJpdmF0ZSBzdGF0ZSByZWxhdGVkIHRvIEBpbmRpb19kZXYuCisgKgorICogUmV0dXJuOiBaZXJvIHdoZW4gc3VjY2Vzc2Z1bCwgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCB6cGEyMzI2X2ZpbGxfc2FtcGxlX2J1ZmZlcihzdHJ1Y3QgaWlvX2RldiAgICAgICAgICAgICAgICppbmRpb19kZXYsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IHpwYTIzMjZfcHJpdmF0ZSAqcHJpdmF0ZSkKK3sKKwlzdHJ1Y3QgeworCQl1MzIgcHJlc3N1cmU7CisJCXUxNiB0ZW1wZXJhdHVyZTsKKwkJdTY0IHRpbWVzdGFtcDsKKwl9ICAgc2FtcGxlOworCWludCBlcnI7CisKKwlpZiAodGVzdF9iaXQoMCwgaW5kaW9fZGV2LT5hY3RpdmVfc2Nhbl9tYXNrKSkgeworCQkvKiBHZXQgY3VycmVudCBwcmVzc3VyZSBmcm9tIGhhcmR3YXJlIEZJRk8uICovCisJCWVyciA9IHpwYTIzMjZfZGVxdWV1ZV9wcmVzc3VyZShpbmRpb19kZXYsICZzYW1wbGUucHJlc3N1cmUpOworCQlpZiAoZXJyKSB7CisJCQl6cGEyMzI2X3dhcm4oaW5kaW9fZGV2LCAiZmFpbGVkIHRvIGZldGNoIHByZXNzdXJlICglZCkiLAorCQkJCSAgICAgZXJyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwlpZiAodGVzdF9iaXQoMSwgaW5kaW9fZGV2LT5hY3RpdmVfc2Nhbl9tYXNrKSkgeworCQkvKiBHZXQgY3VycmVudCB0ZW1wZXJhdHVyZS4gKi8KKwkJZXJyID0gcmVnbWFwX2J1bGtfcmVhZChwcml2YXRlLT5yZWdtYXAsIFpQQTIzMjZfVEVNUF9PVVRfTF9SRUcsCisJCQkJICAgICAgICZzYW1wbGUudGVtcGVyYXR1cmUsIDIpOworCQlpZiAoZXJyKSB7CisJCQl6cGEyMzI2X3dhcm4oaW5kaW9fZGV2LAorCQkJCSAgICAgImZhaWxlZCB0byBmZXRjaCB0ZW1wZXJhdHVyZSAoJWQpIiwgZXJyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwkvKgorCSAqIE5vdyBwdXNoIHNhbXBsZXMgdXNpbmcgdGltZXN0YW1wIHN0b3JlZCBlaXRoZXIgOgorCSAqICAgLSBieSBoYXJkd2FyZSBpbnRlcnJ1cHQgaGFuZGxlciBpZiBpbnRlcnJ1cHQgaXMgYXZhaWxhYmxlOiBzZWUKKwkgKiAgICAgenBhMjMyNl9oYW5kbGVfaXJxKCksCisJICogICAtIG9yIG9uZXNob3QgY29tcGxldGlvbiBwb2xsaW5nIG1hY2hpbmVyeSA6IHNlZQorCSAqICAgICB6cGEyMzI2X3RyaWdnZXJfaGFuZGxlcigpLgorCSAqLworCXpwYTIzMjZfZGJnKGluZGlvX2RldiwgImZpbGxpbmcgcmF3IHNhbXBsZXMgYnVmZmVyIik7CisKKwlpaW9fcHVzaF90b19idWZmZXJzX3dpdGhfdGltZXN0YW1wKGluZGlvX2RldiwgJnNhbXBsZSwKKwkJCQkJICAgcHJpdmF0ZS0+dGltZXN0YW1wKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHpwYTIzMjZfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKK3sKKwljb25zdCBzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKHBhcmVudCk7CisKKwlpZiAocG1fcnVudGltZV9hdXRvc3VzcGVuZF9leHBpcmF0aW9uKHBhcmVudCkpCisJCS8qIFVzZXJzcGFjZSBjaGFuZ2VkIGF1dG9zdXNwZW5kIGRlbGF5LiAqLworCQlyZXR1cm4gLUVBR0FJTjsKKworCXpwYTIzMjZfcG93ZXJfb2ZmKGluZGlvX2RldiwgaWlvX3ByaXYoaW5kaW9fZGV2KSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB6cGEyMzI2X3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKK3sKKwljb25zdCBzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKHBhcmVudCk7CisKKwlyZXR1cm4genBhMjMyNl9wb3dlcl9vbihpbmRpb19kZXYsIGlpb19wcml2KGluZGlvX2RldikpOworfQorCitjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyB6cGEyMzI2X3BtX29wcyA9IHsKKwlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhwbV9ydW50aW1lX2ZvcmNlX3N1c3BlbmQsCisJCQkJcG1fcnVudGltZV9mb3JjZV9yZXN1bWUpCisJU0VUX1JVTlRJTUVfUE1fT1BTKHpwYTIzMjZfcnVudGltZV9zdXNwZW5kLCB6cGEyMzI2X3J1bnRpbWVfcmVzdW1lLAorCQkJICAgTlVMTCkKK307CitFWFBPUlRfU1lNQk9MX0dQTCh6cGEyMzI2X3BtX29wcyk7CisKKy8qKgorICogenBhMjMyNl9yZXN1bWUoKSAtIFJlcXVlc3QgdGhlIFBNIGxheWVyIHRvIHBvd2VyIHN1cHBseSB0aGUgZGV2aWNlLgorICogQGluZGlvX2RldjogVGhlIElJTyBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1wbGluZyBoYXJkd2FyZS4KKyAqCisgKiBSZXR1cm46CisgKiAgPCAwIC0gYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG1lYW5pbmcgZmFpbHVyZSA7CisgKiAgICAwIC0gc3VjY2VzcywgZGV2aWNlIGhhcyBqdXN0IGJlZW4gcG93ZXJlZCB1cCA7CisgKiAgICAxIC0gc3VjY2VzcywgZGV2aWNlIHdhcyBhbHJlYWR5IHBvd2VyZWQuCisgKi8KK3N0YXRpYyBpbnQgenBhMjMyNl9yZXN1bWUoY29uc3Qgc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcG1fcnVudGltZV9nZXRfc3luYyhpbmRpb19kZXYtPmRldi5wYXJlbnQpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGVyciA+IDApIHsKKwkJLyoKKwkJICogRGV2aWNlIHdhcyBhbHJlYWR5IHBvd2VyIHN1cHBsaWVkOiBnZXQgaXQgb3V0IG9mIGxvdyBwb3dlcgorCQkgKiBtb2RlIGFuZCBpbmZvcm0gY2FsbGVyLgorCQkgKi8KKwkJenBhMjMyNl9lbmFibGVfZGV2aWNlKGluZGlvX2Rldik7CisJCXJldHVybiAxOworCX0KKworCS8qIEluZm9ybSBjYWxsZXIgZGV2aWNlIGhhcyBqdXN0IGJlZW4gYnJvdWdodCBiYWNrIHRvIGxpZmUuICovCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogenBhMjMyNl9zdXNwZW5kKCkgLSBTY2hlZHVsZSBhIHBvd2VyIGRvd24gdXNpbmcgYXV0b3N1c3BlbmQgZmVhdHVyZSBvZiBQTQorICogICAgICAgICAgICAgICAgICAgICBsYXllci4KKyAqIEBpbmRpb19kZXY6IFRoZSBJSU8gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtcGxpbmcgaGFyZHdhcmUuCisgKgorICogRGV2aWNlIGlzIHN3aXRjaGVkIHRvIGxvdyBwb3dlciBtb2RlIGF0IGZpcnN0IHRvIHNhdmUgcG93ZXIgZXZlbiB3aGVuCisgKiBhdHRhY2hlZCByZWd1bGF0b3IgaXMgYSAiZHVtbXkiIG9uZS4KKyAqLworc3RhdGljIHZvaWQgenBhMjMyNl9zdXNwZW5kKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IGRldmljZSAqcGFyZW50ID0gaW5kaW9fZGV2LT5kZXYucGFyZW50OworCisJenBhMjMyNl9zbGVlcChpbmRpb19kZXYpOworCisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShwYXJlbnQpOworCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKHBhcmVudCk7Cit9CisKK3N0YXRpYyB2b2lkIHpwYTIzMjZfaW5pdF9ydW50aW1lKHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKK3sKKwlwbV9ydW50aW1lX2dldF9ub3Jlc3VtZShwYXJlbnQpOworCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZShwYXJlbnQpOworCXBtX3J1bnRpbWVfZW5hYmxlKHBhcmVudCk7CisJcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXkocGFyZW50LCAxMDAwKTsKKwlwbV9ydW50aW1lX3VzZV9hdXRvc3VzcGVuZChwYXJlbnQpOworCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3kocGFyZW50KTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChwYXJlbnQpOworfQorCitzdGF0aWMgdm9pZCB6cGEyMzI2X2ZpbmlfcnVudGltZShzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCit7CisJcG1fcnVudGltZV9kaXNhYmxlKHBhcmVudCk7CisJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKHBhcmVudCk7Cit9CisjZWxzZSAvKiAhQ09ORklHX1BNICovCitzdGF0aWMgaW50IHpwYTIzMjZfcmVzdW1lKGNvbnN0IHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJenBhMjMyNl9lbmFibGVfZGV2aWNlKGluZGlvX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgenBhMjMyNl9zdXNwZW5kKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJenBhMjMyNl9zbGVlcChpbmRpb19kZXYpOworfQorCisjZGVmaW5lIHpwYTIzMjZfaW5pdF9ydW50aW1lKF9wYXJlbnQpCisjZGVmaW5lIHpwYTIzMjZfZmluaV9ydW50aW1lKF9wYXJlbnQpCisjZW5kaWYgLyogIUNPTkZJR19QTSAqLworCisvKioKKyAqIHpwYTIzMjZfaGFuZGxlX2lycSgpIC0gUHJvY2VzcyBoYXJkd2FyZSBpbnRlcnJ1cHRzLgorICogQGlycTogIEludGVycnVwdCBsaW5lIHRoZSBoYXJkd2FyZSB1c2VzIHRvIG5vdGlmeSBuZXcgZGF0YSBoYXMgYXJyaXZlZC4KKyAqIEBkYXRhOiBUaGUgSUlPIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbXBsaW5nIGhhcmR3YXJlLgorICoKKyAqIFRpbWVzdGFtcCBidWZmZXJlZCBzYW1wbGVzIGFzIHNvb24gYXMgcG9zc2libGUgdGhlbiBzY2hlZHVsZSB0aHJlYWRlZCBib3R0b20KKyAqIGhhbGYuCisgKgorICogUmV0dXJuOiBBbHdheXMgc3VjY2Vzc2Z1bC4KKyAqLworc3RhdGljIGlycXJldHVybl90IHpwYTIzMjZfaGFuZGxlX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSAoc3RydWN0IGlpb19kZXYgKilkYXRhOworCisJaWYgKGlpb19idWZmZXJfZW5hYmxlZChpbmRpb19kZXYpKSB7CisJCS8qIFRpbWVzdGFtcGluZyBuZWVkZWQgZm9yIGJ1ZmZlcmVkIHNhbXBsaW5nIG9ubHkuICovCisJCSgoc3RydWN0IHpwYTIzMjZfcHJpdmF0ZSAqKQorCQkgaWlvX3ByaXYoaW5kaW9fZGV2KSktPnRpbWVzdGFtcCA9IGlpb19nZXRfdGltZV9ucyhpbmRpb19kZXYpOworCX0KKworCXJldHVybiBJUlFfV0FLRV9USFJFQUQ7Cit9CisKKy8qKgorICogenBhMjMyNl9oYW5kbGVfdGhyZWFkZWRfaXJxKCkgLSBJbnRlcnJ1cHQgYm90dG9tLWhhbGYgaGFuZGxlci4KKyAqIEBpcnE6ICBJbnRlcnJ1cHQgbGluZSB0aGUgaGFyZHdhcmUgdXNlcyB0byBub3RpZnkgbmV3IGRhdGEgaGFzIGFycml2ZWQuCisgKiBAZGF0YTogVGhlIElJTyBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1wbGluZyBoYXJkd2FyZS4KKyAqCisgKiBNYWlubHkgZW5zdXJlcyBpbnRlcnJ1cHQgaXMgY2F1c2VkIGJ5IGEgcmVhbCAibmV3IHNhbXBsZSBhdmFpbGFibGUiCisgKiBjb25kaXRpb24uIFRoaXMgcmVsaWVzIHVwb24gdGhlIGFiaWxpdHkgdG8gcGVyZm9ybSBibG9ja2luZyAvIHNsZWVwaW5nIGJ1cworICogYWNjZXNzZXMgdG8gc2xhdmUncyByZWdpc3RlcnMuIFRoaXMgaXMgd2h5IHpwYTIzMjZfaGFuZGxlX3RocmVhZGVkX2lycSgpIGlzCisgKiBjYWxsZWQgZnJvbSB3aXRoaW4gYSB0aHJlYWQsIGkuZS4gbm90IGNhbGxlZCBmcm9tIGhhcmQgaW50ZXJydXB0IGNvbnRleHQuCisgKgorICogV2hlbiBkZXZpY2UgaXMgdXNpbmcgaXRzIG93biBpbnRlcm5hbCBoYXJkd2FyZSB0cmlnZ2VyIGluIGNvbnRpbnVvdXMgc2FtcGxpbmcKKyAqIG1vZGUsIGRhdGEgYXJlIGF2YWlsYWJsZSBpbnRvIGhhcmR3YXJlIEZJRk8gb25jZSBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkLiBBbGwKKyAqIHdlIGhhdmUgdG8gZG8gaXMgdG8gZGlzcGF0Y2ggdGhlIHRyaWdnZXIsIHdoaWNoIGluIHR1cm4gd2lsbCBmZXRjaCBkYXRhIGFuZAorICogZmlsbCBJSU8gYnVmZmVyLgorICoKKyAqIFdoZW4gbm90IHVzaW5nIGl0cyBvd24gaW50ZXJuYWwgaGFyZHdhcmUgdHJpZ2dlciwgdGhlIGRldmljZSBoYXMgYmVlbgorICogY29uZmlndXJlZCBpbiBvbmUtc2hvdCBtb2RlIGVpdGhlciBieSBhbiBleHRlcm5hbCB0cmlnZ2VyIG9yIHRoZSBJSU8gcmVhZF9yYXcKKyAqIGhvb2suIFRoaXMgbWVhbnMgb25lIG9mIHRoZSBsYXR0ZXIgaXMgY3VycmVudGx5IHdhaXRpbmcgZm9yIHNhbXBsaW5nCisgKiBjb21wbGV0aW9uLCBpbiB3aGljaCBjYXNlIHdlIG11c3Qgc2ltcGx5IHdha2UgaXQgdXAuCisgKgorICogU2VlIHpwYTIzMjZfdHJpZ2dlcl9oYW5kbGVyKCkuCisgKgorICogUmV0dXJuOgorICogICAlSVJRX05PTkUgLSBubyBjb25zaXN0ZW50IGludGVycnVwdCBoYXBwZW5lZCA7CisgKiAgICVJUlFfSEFORExFRCAtIHRoZXJlIHdhcyBuZXcgc2FtcGxlcyBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB6cGEyMzI2X2hhbmRsZV90aHJlYWRlZF9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAgICAgICAgICppbmRpb19kZXYgPSAoc3RydWN0IGlpb19kZXYgKilkYXRhOworCXN0cnVjdCB6cGEyMzI2X3ByaXZhdGUgKnByaXYgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXVuc2lnbmVkIGludCAgICAgICAgICAgIHZhbDsKKwlib29sICAgICAgICAgICAgICAgICAgICBjb250OworCWlycXJldHVybl90ICAgICAgICAgICAgIHJldCA9IElSUV9OT05FOworCisJLyoKKwkgKiBBcmUgd2UgdXNpbmcgb3VyIG93biBpbnRlcm5hbCB0cmlnZ2VyIGluIHRyaWdnZXJlZCBidWZmZXIgbW9kZSwgaS5lLiwKKwkgKiBjdXJyZW50bHkgd29ya2luZyBpbiBjb250aW51b3VzIHNhbXBsaW5nIG1vZGUgPworCSAqLworCWNvbnQgPSAoaWlvX2J1ZmZlcl9lbmFibGVkKGluZGlvX2RldikgJiYKKwkJaWlvX3RyaWdnZXJfdXNpbmdfb3duKGluZGlvX2RldikpOworCisJLyoKKwkgKiBEZXZpY2Ugd29ya3MgYWNjb3JkaW5nIHRvIGEgbGV2ZWwgaW50ZXJydXB0IHNjaGVtZTogcmVhZGluZyBpbnRlcnJ1cHQKKwkgKiBzdGF0dXMgZGUtYXNzZXJ0cyBpbnRlcnJ1cHQgbGluZS4KKwkgKi8KKwlwcml2LT5yZXN1bHQgPSByZWdtYXBfcmVhZChwcml2LT5yZWdtYXAsIFpQQTIzMjZfSU5UX1NPVVJDRV9SRUcsICZ2YWwpOworCWlmIChwcml2LT5yZXN1bHQgPCAwKSB7CisJCWlmIChjb250KQorCQkJcmV0dXJuIElSUV9OT05FOworCisJCWdvdG8gY29tcGxldGU7CisJfQorCisJLyogRGF0YSByZWFkeSBpcyB0aGUgb25seSBpbnRlcnJ1cHQgc291cmNlIHdlIHJlcXVlc3RlZC4gKi8KKwlpZiAoISh2YWwgJiBaUEEyMzI2X0lOVF9TT1VSQ0VfREFUQV9SRUFEWSkpIHsKKwkJLyoKKwkJICogSW50ZXJydXB0IGhhcHBlbmVkIGJ1dCBubyBuZXcgc2FtcGxlIGF2YWlsYWJsZTogbGlrZWx5IGNhdXNlZAorCQkgKiBieSBzcHVyaW91cyBpbnRlcnJ1cHRzLCBpbiB3aGljaCBjYXNlLCByZXR1cm5pbmcgSVJRX05PTkUKKwkJICogYWxsb3dzIHRvIGJlbmVmaXQgZnJvbSB0aGUgZ2VuZXJpYyBzcHVyaW91cyBpbnRlcnJ1cHRzCisJCSAqIGhhbmRsaW5nLgorCQkgKi8KKwkJenBhMjMyNl93YXJuKGluZGlvX2RldiwgInVuZXhwZWN0ZWQgaW50ZXJydXB0IHN0YXR1cyAlMDJ4IiwKKwkJCSAgICAgdmFsKTsKKworCQlpZiAoY29udCkKKwkJCXJldHVybiBJUlFfTk9ORTsKKworCQlwcml2LT5yZXN1bHQgPSAtRU5PREFUQTsKKwkJZ290byBjb21wbGV0ZTsKKwl9CisKKwkvKiBOZXcgc2FtcGxlIGF2YWlsYWJsZTogZGlzcGF0Y2ggaW50ZXJuYWwgdHJpZ2dlciBjb25zdW1lcnMuICovCisJaWlvX3RyaWdnZXJfcG9sbF9jaGFpbmVkKHByaXYtPnRyaWdnZXIpOworCisJaWYgKGNvbnQpCisJCS8qCisJCSAqIEludGVybmFsIGhhcmR3YXJlIHRyaWdnZXIgaGFzIGJlZW4gc2NoZWR1bGVkIGFib3ZlIDogaXQgd2lsbAorCQkgKiBmZXRjaCBkYXRhIG9uIGl0cyBvd24uCisJCSAqLworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwlyZXQgPSBJUlFfSEFORExFRDsKKworY29tcGxldGU6CisJLyoKKwkgKiBXYWtlIHVwIGRpcmVjdCBvciBleHRlcm5hbHkgdHJpZ2dlcmVkIGJ1ZmZlciBtb2RlIHdhaXRlcnM6IHNlZQorCSAqIHpwYTIzMjZfc2FtcGxlX29uZXNob3QoKSBhbmQgenBhMjMyNl90cmlnZ2VyX2hhbmRsZXIoKS4KKwkgKi8KKwljb21wbGV0ZSgmcHJpdi0+ZGF0YV9yZWFkeSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHpwYTIzMjZfd2FpdF9vbmVzaG90X2NvbXBsZXRpb24oKSAtIFdhaXQgZm9yIG9uZXNob3QgZGF0YSByZWFkeSBpbnRlcnJ1cHQuCisgKiBAaW5kaW9fZGV2OiBUaGUgSUlPIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbXBsaW5nIGhhcmR3YXJlLgorICogQHByaXZhdGU6ICAgSW50ZXJuYWwgcHJpdmF0ZSBzdGF0ZSByZWxhdGVkIHRvIEBpbmRpb19kZXYuCisgKgorICogUmV0dXJuOiBaZXJvIHdoZW4gc3VjY2Vzc2Z1bCwgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCB6cGEyMzI2X3dhaXRfb25lc2hvdF9jb21wbGV0aW9uKGNvbnN0IHN0cnVjdCBpaW9fZGV2ICAgKmluZGlvX2RldiwKKwkJCQkJICAgc3RydWN0IHpwYTIzMjZfcHJpdmF0ZSAqcHJpdmF0ZSkKK3sKKwlpbnQgICAgICAgICAgcmV0OworCXVuc2lnbmVkIGludCB2YWw7CisKKwl6cGEyMzI2X2RiZyhpbmRpb19kZXYsICJ3YWl0aW5nIGZvciBvbmUgc2hvdCBjb21wbGV0aW9uIGludGVycnVwdCIpOworCisJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCisJCSZwcml2YXRlLT5kYXRhX3JlYWR5LCBaUEEyMzI2X0NPTlZFUlNJT05fSklGRklFUyk7CisJaWYgKHJldCA+IDApCisJCS8qCisJCSAqIEludGVycnVwdCBoYW5kbGVyIGNvbXBsZXRlZCBiZWZvcmUgdGltZW91dDogcmV0dXJuIG9wZXJhdGlvbgorCQkgKiBzdGF0dXMuCisJCSAqLworCQlyZXR1cm4gcHJpdmF0ZS0+cmVzdWx0OworCisJLyogQ2xlYXIgYWxsIGludGVycnVwdHMganVzdCB0byBiZSBzdXJlLiAqLworCXJlZ21hcF9yZWFkKHByaXZhdGUtPnJlZ21hcCwgWlBBMjMyNl9JTlRfU09VUkNFX1JFRywgJnZhbCk7CisKKwlpZiAoIXJldCkKKwkJLyogVGltZWQgb3V0LiAqLworCQlyZXQgPSAtRVRJTUU7CisKKwlpZiAocmV0ICE9IC1FUkVTVEFSVFNZUykKKwkJenBhMjMyNl93YXJuKGluZGlvX2RldiwgIm5vIG9uZSBzaG90IGludGVycnVwdCBvY2N1cnJlZCAoJWQpIiwKKwkJCSAgICAgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgenBhMjMyNl9pbml0X21hbmFnZWRfaXJxKHN0cnVjdCBkZXZpY2UgICAgICAgICAgKnBhcmVudCwKKwkJCQkgICAgc3RydWN0IGlpb19kZXYgICAgICAgICAqaW5kaW9fZGV2LAorCQkJCSAgICBzdHJ1Y3QgenBhMjMyNl9wcml2YXRlICpwcml2YXRlLAorCQkJCSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBpcnEpCit7CisJaW50IGVycjsKKworCXByaXZhdGUtPmlycSA9IGlycTsKKworCWlmIChpcnEgPD0gMCkgeworCQkvKgorCQkgKiBQbGF0Zm9ybSBkZWNsYXJlZCBubyBpbnRlcnJ1cHQgbGluZTogZGV2aWNlIHdpbGwgYmUgcG9sbGVkCisJCSAqIGZvciBkYXRhIGF2YWlsYWJpbGl0eS4KKwkJICovCisJCWRldl9pbmZvKHBhcmVudCwgIm5vIGludGVycnVwdCBmb3VuZCwgcnVubmluZyBpbiBwb2xsaW5nIG1vZGUiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaW5pdF9jb21wbGV0aW9uKCZwcml2YXRlLT5kYXRhX3JlYWR5KTsKKworCS8qIFJlcXVlc3QgaGFuZGxlciB0byBiZSBzY2hlZHVsZWQgaW50byB0aHJlYWRlZCBpbnRlcnJ1cHQgY29udGV4dC4gKi8KKwllcnIgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKHBhcmVudCwgaXJxLCB6cGEyMzI2X2hhbmRsZV9pcnEsCisJCQkJCXpwYTIzMjZfaGFuZGxlX3RocmVhZGVkX2lycSwKKwkJCQkJSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfT05FU0hPVCwKKwkJCQkJZGV2X25hbWUocGFyZW50KSwgaW5kaW9fZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIocGFyZW50LCAiZmFpbGVkIHRvIHJlcXVlc3QgaW50ZXJydXB0ICVkICglZCkiLCBpcnEsCisJCQllcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWRldl9pbmZvKHBhcmVudCwgInVzaW5nIGludGVycnVwdCAlZCIsIGlycSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB6cGEyMzI2X3BvbGxfb25lc2hvdF9jb21wbGV0aW9uKCkgLSBBY3RpdmVseSBwb2xsIGZvciBvbmUgc2hvdCBkYXRhIHJlYWR5LgorICogQGluZGlvX2RldjogVGhlIElJTyBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1wbGluZyBoYXJkd2FyZS4KKyAqCisgKiBMb29wIG92ZXIgcmVnaXN0ZXJzIGNvbnRlbnQgdG8gZGV0ZWN0IGVuZCBvZiBzYW1wbGluZyBjeWNsZS4gVXNlZCB3aGVuIERUCisgKiBkZWNsYXJlZCBubyB2YWxpZCBpbnRlcnJ1cHQgbGluZXMuCisgKgorICogUmV0dXJuOiBaZXJvIHdoZW4gc3VjY2Vzc2Z1bCwgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCB6cGEyMzI2X3BvbGxfb25lc2hvdF9jb21wbGV0aW9uKGNvbnN0IHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJdW5zaWduZWQgbG9uZyAgdG1vdXQgPSBqaWZmaWVzICsgWlBBMjMyNl9DT05WRVJTSU9OX0pJRkZJRVM7CisJc3RydWN0IHJlZ21hcCAqcmVncyA9ICgoc3RydWN0IHpwYTIzMjZfcHJpdmF0ZSAqKQorCQkJICAgICAgIGlpb19wcml2KGluZGlvX2RldikpLT5yZWdtYXA7CisJdW5zaWduZWQgaW50ICAgdmFsOworCWludCAgICAgICAgICAgIGVycjsKKworCXpwYTIzMjZfZGJnKGluZGlvX2RldiwgInBvbGxpbmcgZm9yIG9uZSBzaG90IGNvbXBsZXRpb24iKTsKKworCS8qCisJICogQXQgbGVhc3QsIDEwMCBtcyBpcyBuZWVkZWQgZm9yIHRoZSBkZXZpY2UgdG8gY29tcGxldGUgaXRzIG9uZS1zaG90CisJICogY3ljbGUuCisJICovCisJaWYgKG1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMCkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwkvKiBQb2xsIGZvciBjb252ZXJzaW9uIGNvbXBsZXRpb24gaW4gaGFyZHdhcmUuICovCisJd2hpbGUgKHRydWUpIHsKKwkJZXJyID0gcmVnbWFwX3JlYWQocmVncywgWlBBMjMyNl9DVFJMX1JFRzBfUkVHLCAmdmFsKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGVycjsKKworCQlpZiAoISh2YWwgJiBaUEEyMzI2X0NUUkxfUkVHMF9PTkVfU0hPVCkpCisJCQkvKiBPbmUtc2hvdCBiaXQgc2VsZiBjbGVhcnMgYXQgY29udmVyc2lvbiBlbmQuICovCisJCQlicmVhazsKKworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0bW91dCkpIHsKKwkJCS8qIFByZXZlbnQgZnJvbSB3YWl0aW5nIGZvcmV2ZXIgOiBsZXQncyB0aW1lIG91dC4gKi8KKwkJCWVyciA9IC1FVElNRTsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJdXNsZWVwX3JhbmdlKDEwMDAwLCAyMDAwMCk7CisJfQorCisJLyoKKwkgKiBJbiBvbmVzaG90IG1vZGUsIHByZXNzdXJlIHNhbXBsZSBhdmFpbGFiaWxpdHkgZ3VhcmFudGVlcyB0aGF0CisJICogdGVtcGVyYXR1cmUgY29udmVyc2lvbiBoYXMgYWxzbyBjb21wbGV0ZWQgOiBqdXN0IGNoZWNrIHByZXNzdXJlCisJICogc3RhdHVzIGJpdCB0byBrZWVwIHRoaW5ncyBzaW1wbGUuCisJICovCisJZXJyID0gcmVnbWFwX3JlYWQocmVncywgWlBBMjMyNl9TVEFUVVNfUkVHLCAmdmFsKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnI7CisKKwlpZiAoISh2YWwgJiBaUEEyMzI2X1NUQVRVU19QX0RBKSkgeworCQkvKiBObyBzYW1wbGUgYXZhaWxhYmxlLiAqLworCQllcnIgPSAtRU5PREFUQTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0dXJuIDA7CisKK2VycjoKKwl6cGEyMzI2X3dhcm4oaW5kaW9fZGV2LCAiZmFpbGVkIHRvIHBvbGwgb25lIHNob3QgY29tcGxldGlvbiAoJWQpIiwgZXJyKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogenBhMjMyNl9mZXRjaF9yYXdfc2FtcGxlKCkgLSBSZXRyaWV2ZSBhIHJhdyBzYW1wbGUgYW5kIGNvbnZlcnQgaXQgdG8gQ1BVCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZGlhbm5lc3MuCisgKiBAaW5kaW9fZGV2OiBUaGUgSUlPIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbXBsaW5nIGhhcmR3YXJlLgorICogQHR5cGU6ICAgICAgVHlwZSBvZiBtZWFzdXJlbWVudCAvIGNoYW5uZWwgdG8gZmV0Y2ggZnJvbS4KKyAqIEB2YWx1ZTogICAgIFNhbXBsZSBvdXRwdXQuCisgKgorICogUmV0dXJuOiBaZXJvIHdoZW4gc3VjY2Vzc2Z1bCwgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCB6cGEyMzI2X2ZldGNoX3Jhd19zYW1wbGUoY29uc3Qgc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCQkgICAgZW51bSBpaW9fY2hhbl90eXBlICAgIHR5cGUsCisJCQkJICAgIGludCAgICAgICAgICAgICAgICAgICp2YWx1ZSkKK3sKKwlzdHJ1Y3QgcmVnbWFwICpyZWdzID0gKChzdHJ1Y3QgenBhMjMyNl9wcml2YXRlICopCisJCQkgICAgICAgaWlvX3ByaXYoaW5kaW9fZGV2KSktPnJlZ21hcDsKKwlpbnQgICAgICAgICAgICBlcnI7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElJT19QUkVTU1VSRToKKwkJenBhMjMyNl9kYmcoaW5kaW9fZGV2LCAiZmV0Y2hpbmcgcmF3IHByZXNzdXJlIHNhbXBsZSIpOworCisJCWVyciA9IHJlZ21hcF9idWxrX3JlYWQocmVncywgWlBBMjMyNl9QUkVTU19PVVRfWExfUkVHLCB2YWx1ZSwKKwkJCQkgICAgICAgMyk7CisJCWlmIChlcnIpIHsKKwkJCXpwYTIzMjZfd2FybihpbmRpb19kZXYsICJmYWlsZWQgdG8gZmV0Y2ggcHJlc3N1cmUgKCVkKSIsCisJCQkJICAgICBlcnIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCS8qIFByZXNzdXJlIGlzIGEgMjQgYml0cyB3aWRlIGxpdHRsZS1lbmRpYW4gdW5zaWduZWQgaW50LiAqLworCQkqdmFsdWUgPSAoKCh1OCAqKXZhbHVlKVsyXSA8PCAxNikgfCAoKCh1OCAqKXZhbHVlKVsxXSA8PCA4KSB8CisJCQkgKCh1OCAqKXZhbHVlKVswXTsKKworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisKKwljYXNlIElJT19URU1QOgorCQl6cGEyMzI2X2RiZyhpbmRpb19kZXYsICJmZXRjaGluZyByYXcgdGVtcGVyYXR1cmUgc2FtcGxlIik7CisKKwkJZXJyID0gcmVnbWFwX2J1bGtfcmVhZChyZWdzLCBaUEEyMzI2X1RFTVBfT1VUX0xfUkVHLCB2YWx1ZSwgMik7CisJCWlmIChlcnIpIHsKKwkJCXpwYTIzMjZfd2FybihpbmRpb19kZXYsCisJCQkJICAgICAiZmFpbGVkIHRvIGZldGNoIHRlbXBlcmF0dXJlICglZCkiLCBlcnIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCS8qIFRlbXBlcmF0dXJlIGlzIGEgMTYgYml0cyB3aWRlIGxpdHRsZS1lbmRpYW4gc2lnbmVkIGludC4gKi8KKwkJKnZhbHVlID0gKGludClsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKXZhbHVlKTsKKworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKKy8qKgorICogenBhMjMyNl9zYW1wbGVfb25lc2hvdCgpIC0gUGVyZm9ybSBhIGNvbXBsZXRlIG9uZSBzaG90IHNhbXBsaW5nIGN5Y2xlLgorICogQGluZGlvX2RldjogVGhlIElJTyBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1wbGluZyBoYXJkd2FyZS4KKyAqIEB0eXBlOiAgICAgIFR5cGUgb2YgbWVhc3VyZW1lbnQgLyBjaGFubmVsIHRvIGZldGNoIGZyb20uCisgKiBAdmFsdWU6ICAgICBTYW1wbGUgb3V0cHV0LgorICoKKyAqIFJldHVybjogWmVybyB3aGVuIHN1Y2Nlc3NmdWwsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgenBhMjMyNl9zYW1wbGVfb25lc2hvdChzdHJ1Y3QgaWlvX2RldiAgICAgKmluZGlvX2RldiwKKwkJCQkgIGVudW0gaWlvX2NoYW5fdHlwZSAgdHlwZSwKKwkJCQkgIGludCAgICAgICAgICAgICAgICAqdmFsdWUpCit7CisJaW50ICAgICAgICAgICAgICAgICAgICAgcmV0OworCXN0cnVjdCB6cGEyMzI2X3ByaXZhdGUgKnByaXY7CisKKwlyZXQgPSBpaW9fZGV2aWNlX2NsYWltX2RpcmVjdF9tb2RlKGluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHpwYTIzMjZfcmVzdW1lKGluZGlvX2Rldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gcmVsZWFzZTsKKworCXByaXYgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJaWYgKHJldCA+IDApIHsKKwkJLyoKKwkJICogV2Ugd2VyZSBhbHJlYWR5IHBvd2VyIHN1cHBsaWVkLiBKdXN0IGNsZWFyIGhhcmR3YXJlIEZJRk8gdG8KKwkJICogZ2V0IHJpZCBvZiBzYW1wbGVzIGFjcXVpcmVkIGR1cmluZyBwcmV2aW91cyByb3VuZHMgKGlmIGFueSkuCisJCSAqIFNhbXBsaW5nIG9wZXJhdGlvbiBhbHdheXMgZ2VuZXJhdGVzIGJvdGggdGVtcGVyYXR1cmUgYW5kCisJCSAqIHByZXNzdXJlIHNhbXBsZXMuIFRoZSBsYXR0ZXIgYXJlIGFsd2F5cyBlbnF1ZXVlZCBpbnRvCisJCSAqIGhhcmR3YXJlIEZJRk8uIFRoaXMgbWF5IGxlYWQgdG8gc2l0dWF0aW9ucyB3ZXJlIHByZXNzdXJlCisJCSAqIHNhbXBsZXMgc3RpbGwgc2l0IGludG8gRklGTyB3aGVuIHByZXZpb3VzIGN5Y2xlKHMpIGZldGNoZWQKKwkJICogdGVtcGVyYXR1cmUgZGF0YSBvbmx5LgorCQkgKiBIZW5jZSwgd2UgbmVlZCB0byBjbGVhciBoYXJkd2FyZSBGSUZPIGNvbnRlbnQgdG8gcHJldmVudCBmcm9tCisJCSAqIGdldHRpbmcgb3V0ZGF0ZWQgdmFsdWVzIGF0IHRoZSBlbmQgb2YgY3VycmVudCBjeWNsZS4KKwkJICovCisJCWlmICh0eXBlID09IElJT19QUkVTU1VSRSkgeworCQkJcmV0ID0genBhMjMyNl9jbGVhcl9maWZvKGluZGlvX2RldiwgMCk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gc3VzcGVuZDsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIFdlIGhhdmUganVzdCBiZWVuIHBvd2VyIHN1cHBsaWVkLCBpLmUuIGRldmljZSBpcyBpbiBkZWZhdWx0CisJCSAqICJvdXQgb2YgcmVzZXQiIHN0YXRlLCBtZWFuaW5nIHdlIG5lZWQgdG8gcmVjb25maWd1cmUgaXQKKwkJICogZW50aXJlbHkuCisJCSAqLworCQlyZXQgPSB6cGEyMzI2X2NvbmZpZ19vbmVzaG90KGluZGlvX2RldiwgcHJpdi0+aXJxKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gc3VzcGVuZDsKKwl9CisKKwkvKiBTdGFydCBhIHNhbXBsaW5nIGN5Y2xlIGluIG9uZXNob3QgbW9kZS4gKi8KKwlyZXQgPSB6cGEyMzI2X3N0YXJ0X29uZXNob3QoaW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIHN1c3BlbmQ7CisKKwkvKiBXYWl0IGZvciBzYW1wbGluZyBjeWNsZSB0byBjb21wbGV0ZS4gKi8KKwlpZiAocHJpdi0+aXJxID4gMCkKKwkJcmV0ID0genBhMjMyNl93YWl0X29uZXNob3RfY29tcGxldGlvbihpbmRpb19kZXYsIHByaXYpOworCWVsc2UKKwkJcmV0ID0genBhMjMyNl9wb2xsX29uZXNob3RfY29tcGxldGlvbihpbmRpb19kZXYpOworCisJaWYgKHJldCkKKwkJZ290byBzdXNwZW5kOworCisJLyogUmV0cmlldmUgcmF3IHNhbXBsZSB2YWx1ZSBhbmQgY29udmVydCBpdCB0byBDUFUgZW5kaWFubmVzcy4gKi8KKwlyZXQgPSB6cGEyMzI2X2ZldGNoX3Jhd19zYW1wbGUoaW5kaW9fZGV2LCB0eXBlLCB2YWx1ZSk7CisKK3N1c3BlbmQ6CisJenBhMjMyNl9zdXNwZW5kKGluZGlvX2Rldik7CityZWxlYXNlOgorCWlpb19kZXZpY2VfcmVsZWFzZV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB6cGEyMzI2X3RyaWdnZXJfaGFuZGxlcigpIC0gUGVyZm9ybSBhbiBJSU8gYnVmZmVyZWQgc2FtcGxpbmcgcm91bmQgaW4gb25lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdCBtb2RlLgorICogQGlycTogIFRoZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgYXNzaWduZWQgdG8gQGRhdGEKKyAqIEBkYXRhOiBUaGUgSUlPIHBvbGwgZnVuY3Rpb24gZGlzcGF0Y2hlZCBieSBleHRlcm5hbCB0cmlnZ2VyIG91ciBkZXZpY2UgaXMKKyAqICAgICAgICBhdHRhY2hlZCB0by4KKyAqCisgKiBCb3R0b20taGFsZiBoYW5kbGVyIGNhbGxlZCBieSB0aGUgSUlPIHRyaWdnZXIgdG8gd2hpY2ggb3VyIGRldmljZSBpcworICogY3VycmVudGx5IGF0dGFjaGVkLiBBbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhpcyBkZXZpY2UgYnVmZmVyZWQgc2FtcGxpbmcKKyAqIGVpdGhlciB3aXRoIGV4dGVybmFsIGV2ZW50cyAoc3VjaCBhcyB0aW1lciBleHBpcmF0aW9uLCBleHRlcm5hbCBkZXZpY2Ugc2FtcGxlCisgKiByZWFkeSwgZXRjLi4uKSBvciB3aXRoIGl0cyBvd24gaW50ZXJydXB0IChpbnRlcm5hbCBoYXJkd2FyZSB0cmlnZ2VyKS4KKyAqCisgKiBXaGVuIHVzaW5nIGFuIGV4dGVybmFsIHRyaWdnZXIsIGJhc2ljYWxseSBydW4gdGhlIHNhbWUgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucworICogYXMgZm9yIHpwYTIzMjZfc2FtcGxlX29uZXNob3QoKSB3aXRoIHRoZSBmb2xsb3dpbmcgaGVyZWFmdGVyLiBIYXJkd2FyZSBGSUZPCisgKiBpcyBub3QgY2xlYXJlZCBzaW5jZSBhbHJlYWR5IGRvbmUgYXQgYnVmZmVyaW5nIGVuYWJsZSB0aW1lIGFuZCBzYW1wbGVzCisgKiBkZXF1ZXVlaW5nIGFsd2F5cyByZXRyaWV2ZXMgdGhlIG1vc3QgcmVjZW50IHZhbHVlLgorICoKKyAqIE90aGVyd2lzZSwgd2hlbiBpbnRlcm5hbCBoYXJkd2FyZSB0cmlnZ2VyIGhhcyBkaXNwYXRjaGVkIHVzLCBqdXN0IGZldGNoIGRhdGEKKyAqIGZyb20gaGFyZHdhcmUgRklGTy4KKyAqCisgKiBGZXRjaGVkIGRhdGEgd2lsbCBwdXNoZWQgdW5wcm9jZXNzZWQgdG8gSUlPIGJ1ZmZlciBzaW5jZSBzYW1wbGVzIGNvbnZlcnNpb24KKyAqIGlzIGRlbGVnYXRlZCB0byB1c2Vyc3BhY2UgaW4gYnVmZmVyZWQgbW9kZSAoZW5kaWFubmVzcywgZXRjLi4uKS4KKyAqCisgKiBSZXR1cm46CisgKiAgICVJUlFfTk9ORSAtIG5vIGNvbnNpc3RlbnQgaW50ZXJydXB0IGhhcHBlbmVkIDsKKyAqICAgJUlSUV9IQU5ETEVEIC0gdGhlcmUgd2FzIG5ldyBzYW1wbGVzIGF2YWlsYWJsZS4KKyAqLworc3RhdGljIGlycXJldHVybl90IHpwYTIzMjZfdHJpZ2dlcl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlpb19kZXYgICAgICAgICAqaW5kaW9fZGV2ID0gKChzdHJ1Y3QgaWlvX3BvbGxfZnVuYyAqKQorCQkJCQkgICAgIGRhdGEpLT5pbmRpb19kZXY7CisJc3RydWN0IHpwYTIzMjZfcHJpdmF0ZSAqcHJpdiA9IGlpb19wcml2KGluZGlvX2Rldik7CisJYm9vbCAgICAgICAgICAgICAgICAgICAgY29udDsKKworCS8qCisJICogV2UgaGF2ZSBiZWVuIGRpc3BhdGNoZWQsIG1lYW5pbmcgd2UgYXJlIGluIHRyaWdnZXJlZCBidWZmZXIgbW9kZS4KKwkgKiBVc2luZyBvdXIgb3duIGludGVybmFsIHRyaWdnZXIgaW1wbGllcyB3ZSBhcmUgY3VycmVudGx5IGluIGNvbnRpbnVvdXMKKwkgKiBoYXJkd2FyZSBzYW1wbGluZyBtb2RlLgorCSAqLworCWNvbnQgPSBpaW9fdHJpZ2dlcl91c2luZ19vd24oaW5kaW9fZGV2KTsKKworCWlmICghY29udCkgeworCQkvKiBPbiBkZW1hbmQgc2FtcGxpbmcgOiBzdGFydCBhIG9uZSBzaG90IGN5Y2xlLiAqLworCQlpZiAoenBhMjMyNl9zdGFydF9vbmVzaG90KGluZGlvX2RldikpCisJCQlnb3RvIG91dDsKKworCQkvKiBXYWl0IGZvciBzYW1wbGluZyBjeWNsZSB0byBjb21wbGV0ZS4gKi8KKwkJaWYgKHByaXYtPmlycSA8PSAwKSB7CisJCQkvKiBObyBpbnRlcnJ1cHQgYXZhaWxhYmxlOiBwb2xsIGZvciBjb21wbGV0aW9uLiAqLworCQkJaWYgKHpwYTIzMjZfcG9sbF9vbmVzaG90X2NvbXBsZXRpb24oaW5kaW9fZGV2KSkKKwkJCQlnb3RvIG91dDsKKworCQkJLyogT25seSB0aW1lc3RhbXAgc2FtcGxlIG9uY2UgaXQgaXMgcmVhZHkuICovCisJCQlwcml2LT50aW1lc3RhbXAgPSBpaW9fZ2V0X3RpbWVfbnMoaW5kaW9fZGV2KTsKKwkJfSBlbHNlIHsKKwkJCS8qIEludGVycnVwdCBoYW5kbGVycyB3aWxsIHRpbWVzdGFtcCBmb3IgdXMuICovCisJCQlpZiAoenBhMjMyNl93YWl0X29uZXNob3RfY29tcGxldGlvbihpbmRpb19kZXYsIHByaXYpKQorCQkJCWdvdG8gb3V0OworCQl9CisJfQorCisJLyogRW5xdWV1ZSB0byBJSU8gYnVmZmVyIC8gdXNlcnNwYWNlLiAqLworCXpwYTIzMjZfZmlsbF9zYW1wbGVfYnVmZmVyKGluZGlvX2RldiwgcHJpdik7CisKK291dDoKKwlpZiAoIWNvbnQpCisJCS8qIERvbid0IHN3aXRjaCB0byBsb3cgcG93ZXIgaWYgc2FtcGxpbmcgY29udGludW91c2x5LiAqLworCQl6cGEyMzI2X3NsZWVwKGluZGlvX2Rldik7CisKKwkvKiBJbmZvcm0gYXR0YWNoZWQgdHJpZ2dlciB3ZSBhcmUgZG9uZS4gKi8KKwlpaW9fdHJpZ2dlcl9ub3RpZnlfZG9uZShpbmRpb19kZXYtPnRyaWcpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioKKyAqIHpwYTIzMjZfcHJlZW5hYmxlX2J1ZmZlcigpIC0gUHJlcGFyZSBkZXZpY2UgZm9yIGNvbmZpZ3VyaW5nIHRyaWdnZXJlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZworICogbW9kZXMuCisgKiBAaW5kaW9fZGV2OiBUaGUgSUlPIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbXBsaW5nIGhhcmR3YXJlLgorICoKKyAqIEJhc2ljYWxseSBwb3dlciB1cCBkZXZpY2UuCisgKiBDYWxsZWQgd2l0aCBJSU8gZGV2aWNlJ3MgbG9jayBoZWxkLgorICoKKyAqIFJldHVybjogWmVybyB3aGVuIHN1Y2Nlc3NmdWwsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgenBhMjMyNl9wcmVlbmFibGVfYnVmZmVyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJaW50IHJldCA9IHpwYTIzMjZfcmVzdW1lKGluZGlvX2Rldik7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFRlbGwgenBhMjMyNl9wb3N0ZW5hYmxlX2J1ZmZlcigpIGlmIHdlIGhhdmUganVzdCBiZWVuIHBvd2VyZWQgb24uICovCisJKChzdHJ1Y3QgenBhMjMyNl9wcml2YXRlICopCisJIGlpb19wcml2KGluZGlvX2RldikpLT53YWtlbiA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB6cGEyMzI2X3Bvc3RlbmFibGVfYnVmZmVyKCkgLSBDb25maWd1cmUgZGV2aWNlIGZvciB0cmlnZ2VyZWQgc2FtcGxpbmcuCisgKiBAaW5kaW9fZGV2OiBUaGUgSUlPIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbXBsaW5nIGhhcmR3YXJlLgorICoKKyAqIEJhc2ljYWxseSBzZXR1cCBvbmUtc2hvdCBtb2RlIGlmIHBsdWdnaW5nIGV4dGVybmFsIHRyaWdnZXIuCisgKiBPdGhlcndpc2UsIGxldCBpbnRlcm5hbCB0cmlnZ2VyIGNvbmZpZ3VyZSBjb250aW51b3VzIHNhbXBsaW5nIDoKKyAqIHNlZSB6cGEyMzI2X3NldF90cmlnZ2VyX3N0YXRlKCkuCisgKgorICogSWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQsIElJTyBsYXllciB3aWxsIGNhbGwgb3VyIHBvc3RkaXNhYmxlIGhvb2sgZm9yIHVzLAorICogaS5lLiBubyBuZWVkIHRvIGV4cGxpY2l0bHkgcG93ZXIgZGV2aWNlIG9mZiBoZXJlLgorICogQ2FsbGVkIHdpdGggSUlPIGRldmljZSdzIGxvY2sgaGVsZC4KKyAqCisgKiBDYWxsZWQgd2l0aCBJSU8gZGV2aWNlJ3MgbG9jayBoZWxkLgorICoKKyAqIFJldHVybjogWmVybyB3aGVuIHN1Y2Nlc3NmdWwsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgenBhMjMyNl9wb3N0ZW5hYmxlX2J1ZmZlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCWNvbnN0IHN0cnVjdCB6cGEyMzI2X3ByaXZhdGUgKnByaXYgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycjsKKworCWlmICghcHJpdi0+d2FrZW4pIHsKKwkJLyoKKwkJICogV2Ugd2VyZSBhbHJlYWR5IHBvd2VyIHN1cHBsaWVkLiBKdXN0IGNsZWFyIGhhcmR3YXJlIEZJRk8gdG8KKwkJICogZ2V0IHJpZCBvZiBzYW1wbGVzIGFjcXVpcmVkIGR1cmluZyBwcmV2aW91cyByb3VuZHMgKGlmIGFueSkuCisJCSAqLworCQllcnIgPSB6cGEyMzI2X2NsZWFyX2ZpZm8oaW5kaW9fZGV2LCAwKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyOworCX0KKworCWlmICghaWlvX3RyaWdnZXJfdXNpbmdfb3duKGluZGlvX2RldikgJiYgcHJpdi0+d2FrZW4pIHsKKwkJLyoKKwkJICogV2UgYXJlIHVzaW5nIGFuIGV4dGVybmFsIHRyaWdnZXIgYW5kIHdlIGhhdmUganVzdCBiZWVuCisJCSAqIHBvd2VyZWQgdXA6IHJlY29uZmlndXJlIG9uZS1zaG90IG1vZGUuCisJCSAqLworCQllcnIgPSB6cGEyMzI2X2NvbmZpZ19vbmVzaG90KGluZGlvX2RldiwgcHJpdi0+aXJxKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyOworCX0KKworCS8qIFBsdWcgb3VyIG93biB0cmlnZ2VyIGV2ZW50IGhhbmRsZXIuICovCisJZXJyID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfcG9zdGVuYWJsZShpbmRpb19kZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyOworCisJcmV0dXJuIDA7CisKK2VycjoKKwl6cGEyMzI2X2VycihpbmRpb19kZXYsICJmYWlsZWQgdG8gZW5hYmxlIGJ1ZmZlcmluZyAoJWQpIiwgZXJyKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgenBhMjMyNl9wb3N0ZGlzYWJsZV9idWZmZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwl6cGEyMzI2X3N1c3BlbmQoaW5kaW9fZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19idWZmZXJfc2V0dXBfb3BzIHpwYTIzMjZfYnVmZmVyX3NldHVwX29wcyA9IHsKKwkucHJlZW5hYmxlICAgPSB6cGEyMzI2X3ByZWVuYWJsZV9idWZmZXIsCisJLnBvc3RlbmFibGUgID0genBhMjMyNl9wb3N0ZW5hYmxlX2J1ZmZlciwKKwkucHJlZGlzYWJsZSAgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wcmVkaXNhYmxlLAorCS5wb3N0ZGlzYWJsZSA9IHpwYTIzMjZfcG9zdGRpc2FibGVfYnVmZmVyCit9OworCisvKioKKyAqIHpwYTIzMjZfc2V0X3RyaWdnZXJfc3RhdGUoKSAtIFN0YXJ0IC8gc3RvcCBjb250aW51b3VzIHNhbXBsaW5nLgorICogQHRyaWc6ICBUaGUgdHJpZ2dlciBiZWluZyBhdHRhY2hlZCB0byBJSU8gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtcGxpbmcKKyAqICAgICAgICAgaGFyZHdhcmUuCisgKiBAc3RhdGU6IFRlbGwgd2hldGhlciB0byBzdGFydCAodHJ1ZSkgb3Igc3RvcCAoZmFsc2UpCisgKgorICogQmFzaWNhbGx5IGVuYWJsZSAvIGRpc2FibGUgaGFyZHdhcmUgY29udGludW91cyBzYW1wbGluZyBtb2RlLgorICoKKyAqIENhbGxlZCB3aXRoIElJTyBkZXZpY2UncyBsb2NrIGhlbGQgYXQgcG9zdGVuYWJsZSgpIG9yIHByZWRpc2FibGUoKSB0aW1lLgorICoKKyAqIFJldHVybjogWmVybyB3aGVuIHN1Y2Nlc3NmdWwsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgenBhMjMyNl9zZXRfdHJpZ2dlcl9zdGF0ZShzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcsIGJvb2wgc3RhdGUpCit7CisJY29uc3Qgc3RydWN0IGlpb19kZXYgICAgICAgICAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKAorCQkJCQkJCXRyaWctPmRldi5wYXJlbnQpOworCWNvbnN0IHN0cnVjdCB6cGEyMzI2X3ByaXZhdGUgKnByaXYgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycjsKKworCWlmICghc3RhdGUpIHsKKwkJLyoKKwkJICogU3dpdGNoIHRyaWdnZXIgb2ZmIDogaW4gY2FzZSBvZiBmYWlsdXJlLCBpbnRlcnJ1cHQgaXMgbGVmdAorCQkgKiBkaXNhYmxlZCBpbiBvcmRlciB0byBwcmV2ZW50IGhhbmRsZXIgZnJvbSBhY2Nlc3NpbmcgcmVsZWFzZWQKKwkJICogcmVzb3VyY2VzLgorCQkgKi8KKwkJdW5zaWduZWQgaW50IHZhbDsKKworCQkvKgorCQkgKiBBcyBkZXZpY2UgaXMgd29ya2luZyBpbiBjb250aW51b3VzIG1vZGUsIGhhbmRsZXJzIG1heSBiZQorCQkgKiBhY2Nlc3NpbmcgcmVzb3VyY2VzIHdlIGFyZSBjdXJyZW50bHkgZnJlZWluZy4uLgorCQkgKiBQcmV2ZW50IHRoaXMgYnkgZGlzYWJsaW5nIGludGVycnVwdCBoYW5kbGVycyBhbmQgZW5zdXJlCisJCSAqIHRoZSBkZXZpY2Ugd2lsbCBnZW5lcmF0ZSBubyBtb3JlIGludGVycnVwdHMgdW5sZXNzIGV4cGxpY2l0bHkKKwkJICogcmVxdWlyZWQgdG8sIGkuZS4gYnkgcmVzdG9yaW5nIGJhY2sgdG8gZGVmYXVsdCBvbmUgc2hvdCBtb2RlLgorCQkgKi8KKwkJZGlzYWJsZV9pcnEocHJpdi0+aXJxKTsKKworCQkvKgorCQkgKiBEaXNhYmxlIGNvbnRpbnVvdXMgc2FtcGxpbmcgbW9kZSB0byByZXN0b3JlIHNldHRpbmdzIGZvcgorCQkgKiBvbmUgc2hvdCAvIGRpcmVjdCBzYW1wbGluZyBvcGVyYXRpb25zLgorCQkgKi8KKwkJZXJyID0gcmVnbWFwX3dyaXRlKHByaXYtPnJlZ21hcCwgWlBBMjMyNl9DVFJMX1JFRzNfUkVHLAorCQkJCSAgIHpwYTIzMjZfaGlnaGVzdF9mcmVxdWVuY3koKS0+b2RyKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJLyoKKwkJICogTm93IHRoYXQgZGV2aWNlIHdvbid0IGdlbmVyYXRlIGludGVycnVwdHMgb24gaXRzIG93biwKKwkJICogYWNrbm93bGVkZ2UgYW55IGN1cnJlbnRseSBhY3RpdmUgaW50ZXJydXB0cyAobWF5IGhhcHBlbiBvbgorCQkgKiByYXJlIG9jY2FzaW9ucyB3aGlsZSBzdG9wcGluZyBjb250aW51b3VzIG1vZGUpLgorCQkgKi8KKwkJZXJyID0gcmVnbWFwX3JlYWQocHJpdi0+cmVnbWFwLCBaUEEyMzI2X0lOVF9TT1VSQ0VfUkVHLCAmdmFsKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCisJCS8qCisJCSAqIFJlLWVuYWJsZSBpbnRlcnJ1cHRzIG9ubHkgaWYgd2UgY2FuIGd1YXJhbnRlZSB0aGUgZGV2aWNlIHdpbGwKKwkJICogZ2VuZXJhdGUgbm8gbW9yZSBpbnRlcnJ1cHRzIHRvIHByZXZlbnQgaGFuZGxlcnMgZnJvbQorCQkgKiBhY2Nlc3NpbmcgcmVsZWFzZWQgcmVzb3VyY2VzLgorCQkgKi8KKwkJZW5hYmxlX2lycShwcml2LT5pcnEpOworCisJCXpwYTIzMjZfZGJnKGluZGlvX2RldiwgImNvbnRpbnVvdXMgbW9kZSBzdG9wcGVkIik7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogU3dpdGNoIHRyaWdnZXIgb24gOiBzdGFydCBjb250aW51b3VzIHNhbXBsaW5nIGF0IHJlcXVpcmVkCisJCSAqIGZyZXF1ZW5jeS4KKwkJICovCisKKwkJaWYgKHByaXYtPndha2VuKSB7CisJCQkvKiBFbmFibGUgaW50ZXJydXB0IGlmIGdldHRpbmcgb3V0IG9mIHJlc2V0LiAqLworCQkJZXJyID0gcmVnbWFwX3dyaXRlKHByaXYtPnJlZ21hcCwgWlBBMjMyNl9DVFJMX1JFRzFfUkVHLAorCQkJCQkgICAodTgpCisJCQkJCSAgIH5aUEEyMzI2X0NUUkxfUkVHMV9NQVNLX0RBVEFfUkVBRFkpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJLyogRW5hYmxlIGNvbnRpbnVvdXMgc2FtcGxpbmcgYXQgc3BlY2lmaWVkIGZyZXF1ZW5jeS4gKi8KKwkJZXJyID0gcmVnbWFwX3dyaXRlKHByaXYtPnJlZ21hcCwgWlBBMjMyNl9DVFJMX1JFRzNfUkVHLAorCQkJCSAgIFpQQTIzMjZfQ1RSTF9SRUczX0VOQUJMRV9NRUFTIHwKKwkJCQkgICBwcml2LT5mcmVxdWVuY3ktPm9kcik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCXpwYTIzMjZfZGJnKGluZGlvX2RldiwgImNvbnRpbnVvdXMgbW9kZSBzZXR1cCBAJWRIeiIsCisJCQkgICAgcHJpdi0+ZnJlcXVlbmN5LT5oeik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX3RyaWdnZXJfb3BzIHpwYTIzMjZfdHJpZ2dlcl9vcHMgPSB7CisJLm93bmVyICAgICAgICAgICAgID0gVEhJU19NT0RVTEUsCisJLnNldF90cmlnZ2VyX3N0YXRlID0genBhMjMyNl9zZXRfdHJpZ2dlcl9zdGF0ZSwKK307CisKKy8qKgorICogenBhMjMyNl9pbml0X3RyaWdnZXIoKSAtIENyZWF0ZSBhbiBpbnRlcnJ1cHQgZHJpdmVuIC8gaGFyZHdhcmUgdHJpZ2dlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93aW5nIHRvIG5vdGlmeSBleHRlcm5hbCBkZXZpY2VzIGEgbmV3IHNhbXBsZSBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5LgorICogQHBhcmVudDogICAgSGFyZHdhcmUgc2FtcGxpbmcgZGV2aWNlIEBpbmRpb19kZXYgaXMgYSBjaGlsZCBvZi4KKyAqIEBpbmRpb19kZXY6IFRoZSBJSU8gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtcGxpbmcgaGFyZHdhcmUuCisgKiBAcHJpdmF0ZTogICBJbnRlcm5hbCBwcml2YXRlIHN0YXRlIHJlbGF0ZWQgdG8gQGluZGlvX2Rldi4KKyAqIEBpcnE6ICAgICAgIE9wdGlvbmFsIGludGVycnVwdCBsaW5lIHRoZSBoYXJkd2FyZSB1c2VzIHRvIG5vdGlmeSBuZXcgZGF0YQorICogICAgICAgICAgICAgc2FtcGxlcyBhcmUgcmVhZHkuIE5lZ2F0aXZlIG9yIHplcm8gdmFsdWVzIGluZGljYXRlIG5vIGludGVycnVwdHMKKyAqICAgICAgICAgICAgIGFyZSBhdmFpbGFibGUsIG1lYW5pbmcgcG9sbGluZyBpcyByZXF1aXJlZC4KKyAqCisgKiBPbmx5IHJlbGV2YW50IHdoZW4gRFQgZGVjbGFyZXMgYSB2YWxpZCBpbnRlcnJ1cHQgbGluZS4KKyAqCisgKiBSZXR1cm46IFplcm8gd2hlbiBzdWNjZXNzZnVsLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IHpwYTIzMjZfaW5pdF9tYW5hZ2VkX3RyaWdnZXIoc3RydWN0IGRldmljZSAgICAgICAgICAqcGFyZW50LAorCQkJCQlzdHJ1Y3QgaWlvX2RldiAgICAgICAgICppbmRpb19kZXYsCisJCQkJCXN0cnVjdCB6cGEyMzI2X3ByaXZhdGUgKnByaXZhdGUsCisJCQkJCWludCAgICAgICAgICAgICAgICAgICAgIGlycSkKK3sKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWdnZXI7CisJaW50ICAgICAgICAgICAgICAgICByZXQ7CisKKwlpZiAoaXJxIDw9IDApCisJCXJldHVybiAwOworCisJdHJpZ2dlciA9IGRldm1faWlvX3RyaWdnZXJfYWxsb2MocGFyZW50LCAiJXMtZGV2JWQiLAorCQkJCQkgaW5kaW9fZGV2LT5uYW1lLCBpbmRpb19kZXYtPmlkKTsKKwlpZiAoIXRyaWdnZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogQmFzaWMgc2V0dXAuICovCisJdHJpZ2dlci0+ZGV2LnBhcmVudCA9IHBhcmVudDsKKwl0cmlnZ2VyLT5vcHMgPSAmenBhMjMyNl90cmlnZ2VyX29wczsKKworCXByaXZhdGUtPnRyaWdnZXIgPSB0cmlnZ2VyOworCisJLyogUmVnaXN0ZXIgdG8gdHJpZ2dlcnMgc3BhY2UuICovCisJcmV0ID0gZGV2bV9paW9fdHJpZ2dlcl9yZWdpc3RlcihwYXJlbnQsIHRyaWdnZXIpOworCWlmIChyZXQpCisJCWRldl9lcnIocGFyZW50LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGhhcmR3YXJlIHRyaWdnZXIgKCVkKSIsCisJCQlyZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB6cGEyMzI2X2dldF9mcmVxdWVuY3koY29uc3Qgc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gKChzdHJ1Y3QgenBhMjMyNl9wcml2YXRlICopaWlvX3ByaXYoaW5kaW9fZGV2KSktPmZyZXF1ZW5jeS0+aHo7Cit9CisKK3N0YXRpYyBpbnQgenBhMjMyNl9zZXRfZnJlcXVlbmN5KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIGludCBoeikKK3sKKwlzdHJ1Y3QgenBhMjMyNl9wcml2YXRlICpwcml2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBmcmVxOworCWludCAgICAgICAgICAgICAgICAgICAgIGVycjsKKworCS8qIENoZWNrIGlmIHJlcXVlc3RlZCBmcmVxdWVuY3kgaXMgc3VwcG9ydGVkLiAqLworCWZvciAoZnJlcSA9IDA7IGZyZXEgPCBBUlJBWV9TSVpFKHpwYTIzMjZfc2FtcGxpbmdfZnJlcXVlbmNpZXMpOyBmcmVxKyspCisJCWlmICh6cGEyMzI2X3NhbXBsaW5nX2ZyZXF1ZW5jaWVzW2ZyZXFdLmh6ID09IGh6KQorCQkJYnJlYWs7CisJaWYgKGZyZXEgPT0gQVJSQVlfU0laRSh6cGEyMzI2X3NhbXBsaW5nX2ZyZXF1ZW5jaWVzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBEb24ndCBhbGxvdyBjaGFuZ2luZyBmcmVxdWVuY3kgaWYgYnVmZmVyZWQgc2FtcGxpbmcgaXMgb25nb2luZy4gKi8KKwllcnIgPSBpaW9fZGV2aWNlX2NsYWltX2RpcmVjdF9tb2RlKGluZGlvX2Rldik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXByaXYtPmZyZXF1ZW5jeSA9ICZ6cGEyMzI2X3NhbXBsaW5nX2ZyZXF1ZW5jaWVzW2ZyZXFdOworCisJaWlvX2RldmljZV9yZWxlYXNlX2RpcmVjdF9tb2RlKGluZGlvX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworLyogRXhwb3NlIHN1cHBvcnRlZCBoYXJkd2FyZSBzYW1wbGluZyBmcmVxdWVuY2llcyAoSHopIHRocm91Z2ggc3lzZnMuICovCitzdGF0aWMgSUlPX0NPTlNUX0FUVFJfU0FNUF9GUkVRX0FWQUlMKCIxIDUgMTEgMjMiKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnpwYTIzMjZfYXR0cmlidXRlc1tdID0geworCSZpaW9fY29uc3RfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3lfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgenBhMjMyNl9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0genBhMjMyNl9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCB6cGEyMzI2X3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICAgICAgICAgICAgICppbmRpb19kZXYsCisJCQkgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgKnZhbCwKKwkJCSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAqdmFsMiwKKwkJCSAgICBsb25nICAgICAgICAgICAgICAgICAgICAgICAgbWFzaykKK3sKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIElJT19DSEFOX0lORk9fUkFXOgorCQlyZXR1cm4genBhMjMyNl9zYW1wbGVfb25lc2hvdChpbmRpb19kZXYsIGNoYW4tPnR5cGUsIHZhbCk7CisKKwljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6CisJCXN3aXRjaCAoY2hhbi0+dHlwZSkgeworCQljYXNlIElJT19QUkVTU1VSRToKKwkJCS8qCisJCQkgKiBQcmVzc3VyZSByZXNvbHV0aW9uIGlzIDEvNjQgUGFzY2FsLiBTY2FsZSB0byBrUGFzY2FsCisJCQkgKiBhcyByZXF1aXJlZCBieSBJSU8gQUJJLgorCQkJICovCisJCQkqdmFsID0gMTsKKwkJCSp2YWwyID0gNjQwMDA7CisJCQlyZXR1cm4gSUlPX1ZBTF9GUkFDVElPTkFMOworCisJCWNhc2UgSUlPX1RFTVA6CisJCQkvKgorCQkJICogVGVtcGVyYXR1cmUgZm9sbG93cyB0aGUgZXF1YXRpb246CisJCQkgKiAgICAgVGVtcFtkZWdDXSA9IFRlbXBjb2RlICogMC4wMDY0OSAtIDE3Ni44MworCQkJICogd2hlcmU6CisJCQkgKiAgICAgVGVtcGNvZGUgaXMgY29tcG9zZWQgdGhlIHJhdyBzYW1wbGVkIDE2IGJpdHMuCisJCQkgKgorCQkJICogSGVuY2UsIHRvIHByb2R1Y2UgYSB0ZW1wZXJhdHVyZSBpbiBtaWxsaS1kZWdyZWVzCisJCQkgKiBDZWxzaXVzIGFjY29yZGluZyB0byBJSU8gQUJJLCB3ZSBuZWVkIHRvIGFwcGx5IHRoZQorCQkJICogZm9sbG93aW5nIGVxdWF0aW9uIHRvIHJhdyBzYW1wbGVzOgorCQkJICogICAgIFRlbXBbbWlsbGkgZGVnQ10gPSAoVGVtcGNvZGUgKyBPZmZzZXQpICogU2NhbGUKKwkJCSAqIHdoZXJlOgorCQkJICogICAgIE9mZnNldCA9IC0xNzYuODMgLyAwLjAwNjQ5CisJCQkgKiAgICAgU2NhbGUgPSAwLjAwNjQ5ICogMTAwMAorCQkJICovCisJCQkqdmFsID0gNjsKKwkJCSp2YWwyID0gNDkwMDAwOworCQkJcmV0dXJuIElJT19WQUxfSU5UX1BMVVNfTUlDUk87CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwljYXNlIElJT19DSEFOX0lORk9fT0ZGU0VUOgorCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBJSU9fVEVNUDoKKwkJCSp2YWwgPSAtMTc2ODMwMDA7CisJCQkqdmFsMiA9IDY0OTsKKwkJCXJldHVybiBJSU9fVkFMX0ZSQUNUSU9OQUw7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwljYXNlIElJT19DSEFOX0lORk9fU0FNUF9GUkVROgorCQkqdmFsID0genBhMjMyNl9nZXRfZnJlcXVlbmN5KGluZGlvX2Rldik7CisJCXJldHVybiBJSU9fVkFMX0lOVDsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludCB6cGEyMzI2X3dyaXRlX3JhdyhzdHJ1Y3QgaWlvX2RldiAgICAgICAgICAgICAqaW5kaW9fZGV2LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbiwKKwkJCSAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCwKKwkJCSAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHZhbDIsCisJCQkgICAgIGxvbmcgICAgICAgICAgICAgICAgICAgICAgICBtYXNrKQoreworCWlmICgobWFzayAhPSBJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUSkgfHwgdmFsMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4genBhMjMyNl9zZXRfZnJlcXVlbmN5KGluZGlvX2RldiwgdmFsKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHpwYTIzMjZfY2hhbm5lbHNbXSA9IHsKKwlbMF0gPSB7CisJCS50eXBlICAgICAgICAgICAgICAgICAgICA9IElJT19QUkVTU1VSRSwKKwkJLnNjYW5faW5kZXggICAgICAgICAgICAgID0gMCwKKwkJLnNjYW5fdHlwZSAgICAgICAgICAgICAgID0geworCQkJLnNpZ24gICAgICAgICAgICAgICAgICAgPSAndScsCisJCQkucmVhbGJpdHMgICAgICAgICAgICAgICA9IDI0LAorCQkJLnN0b3JhZ2ViaXRzICAgICAgICAgICAgPSAzMiwKKwkJCS5lbmRpYW5uZXNzICAgICAgICAgICAgID0gSUlPX0xFLAorCQl9LAorCQkuaW5mb19tYXNrX3NlcGFyYXRlICAgICAgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpIHwKKwkJCQkJICAgQklUKElJT19DSEFOX0lORk9fU0NBTEUpLAorCQkuaW5mb19tYXNrX3NoYXJlZF9ieV9hbGwgPSBCSVQoSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVEpLAorCX0sCisJWzFdID0geworCQkudHlwZSAgICAgICAgICAgICAgICAgICAgPSBJSU9fVEVNUCwKKwkJLnNjYW5faW5kZXggICAgICAgICAgICAgID0gMSwKKwkJLnNjYW5fdHlwZSAgICAgICAgICAgICAgID0geworCQkJLnNpZ24gICAgICAgICAgICAgICAgICAgPSAncycsCisJCQkucmVhbGJpdHMgICAgICAgICAgICAgICA9IDE2LAorCQkJLnN0b3JhZ2ViaXRzICAgICAgICAgICAgPSAxNiwKKwkJCS5lbmRpYW5uZXNzICAgICAgICAgICAgID0gSUlPX0xFLAorCQl9LAorCQkuaW5mb19tYXNrX3NlcGFyYXRlICAgICAgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpIHwKKwkJCQkJICAgQklUKElJT19DSEFOX0lORk9fU0NBTEUpIHwKKwkJCQkJICAgQklUKElJT19DSEFOX0lORk9fT0ZGU0VUKSwKKwkJLmluZm9fbWFza19zaGFyZWRfYnlfYWxsID0gQklUKElJT19DSEFOX0lORk9fU0FNUF9GUkVRKSwKKwl9LAorCVsyXSA9IElJT19DSEFOX1NPRlRfVElNRVNUQU1QKDIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyB6cGEyMzI2X2luZm8gPSB7CisJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKKwkuYXR0cnMgICAgICAgICA9ICZ6cGEyMzI2X2F0dHJpYnV0ZV9ncm91cCwKKwkucmVhZF9yYXcgICAgICA9IHpwYTIzMjZfcmVhZF9yYXcsCisJLndyaXRlX3JhdyAgICAgPSB6cGEyMzI2X3dyaXRlX3JhdywKK307CisKK3N0YXRpYyBzdHJ1Y3QgaWlvX2RldiAqenBhMjMyNl9jcmVhdGVfbWFuYWdlZF9paW9kZXYoc3RydWN0IGRldmljZSAqZGV2aWNlLAorCQkJCQkJICAgICBjb25zdCBjaGFyICAgICpuYW1lLAorCQkJCQkJICAgICBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKworCS8qIEFsbG9jYXRlIHNwYWNlIHRvIGhvbGQgSUlPIGRldmljZSBpbnRlcm5hbCBzdGF0ZS4gKi8KKwlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoZGV2aWNlLAorCQkJCQkgIHNpemVvZihzdHJ1Y3QgenBhMjMyNl9wcml2YXRlKSk7CisJaWYgKCFpbmRpb19kZXYpCisJCXJldHVybiBOVUxMOworCisJLyogU2V0dXAgZm9yIHVzZXJzcGFjZSBzeW5jaHJvbm91cyBvbiBkZW1hbmQgc2FtcGxpbmcuICovCisJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9IGRldmljZTsKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0genBhMjMyNl9jaGFubmVsczsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUoenBhMjMyNl9jaGFubmVscyk7CisJaW5kaW9fZGV2LT5uYW1lID0gbmFtZTsKKwlpbmRpb19kZXYtPmluZm8gPSAmenBhMjMyNl9pbmZvOworCisJcmV0dXJuIGluZGlvX2RldjsKK30KKworaW50IHpwYTIzMjZfcHJvYmUoc3RydWN0IGRldmljZSAqcGFyZW50LAorCQkgIGNvbnN0IGNoYXIgICAgKm5hbWUsCisJCSAgaW50ICAgICAgICAgICAgaXJxLAorCQkgIHVuc2lnbmVkIGludCAgIGh3aWQsCisJCSAgc3RydWN0IHJlZ21hcCAqcmVnbWFwKQoreworCXN0cnVjdCBpaW9fZGV2ICAgICAgICAgKmluZGlvX2RldjsKKwlzdHJ1Y3QgenBhMjMyNl9wcml2YXRlICpwcml2OworCWludCAgICAgICAgICAgICAgICAgICAgIGVycjsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBpZDsKKworCWluZGlvX2RldiA9IHpwYTIzMjZfY3JlYXRlX21hbmFnZWRfaWlvZGV2KHBhcmVudCwgbmFtZSwgcmVnbWFwKTsKKwlpZiAoIWluZGlvX2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcml2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXByaXYtPnZyZWYgPSBkZXZtX3JlZ3VsYXRvcl9nZXQocGFyZW50LCAidnJlZiIpOworCWlmIChJU19FUlIocHJpdi0+dnJlZikpCisJCXJldHVybiBQVFJfRVJSKHByaXYtPnZyZWYpOworCisJcHJpdi0+dmRkID0gZGV2bV9yZWd1bGF0b3JfZ2V0KHBhcmVudCwgInZkZCIpOworCWlmIChJU19FUlIocHJpdi0+dmRkKSkKKwkJcmV0dXJuIFBUUl9FUlIocHJpdi0+dmRkKTsKKworCS8qIFNldCBkZWZhdWx0IGhhcmR3YXJlIHNhbXBsaW5nIGZyZXF1ZW5jeSB0byBoaWdoZXN0IHJhdGUgc3VwcG9ydGVkLiAqLworCXByaXYtPmZyZXF1ZW5jeSA9IHpwYTIzMjZfaGlnaGVzdF9mcmVxdWVuY3koKTsKKworCS8qCisJICogUGx1ZyBkZXZpY2UncyB1bmRlcmx5aW5nIGJ1cyBhYnN0cmFjdGlvbiA6IHRoaXMgTVVTVCBiZSBzZXQgYmVmb3JlCisJICogcmVnaXN0ZXJpbmcgaW50ZXJydXB0IGhhbmRsZXJzIHNpbmNlIGFuIGludGVycnVwdCBtaWdodCBoYXBwZW4gaWYKKwkgKiBwb3dlciB1cCBzZXF1ZW5jZSBpcyBub3QgcHJvcGVybHkgYXBwbGllZC4KKwkgKi8KKwlwcml2LT5yZWdtYXAgPSByZWdtYXA7CisKKwllcnIgPSBkZXZtX2lpb190cmlnZ2VyZWRfYnVmZmVyX3NldHVwKHBhcmVudCwgaW5kaW9fZGV2LCBOVUxMLAorCQkJCQkgICAgICB6cGEyMzI2X3RyaWdnZXJfaGFuZGxlciwKKwkJCQkJICAgICAgJnpwYTIzMjZfYnVmZmVyX3NldHVwX29wcyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHpwYTIzMjZfaW5pdF9tYW5hZ2VkX3RyaWdnZXIocGFyZW50LCBpbmRpb19kZXYsIHByaXYsIGlycSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHpwYTIzMjZfaW5pdF9tYW5hZ2VkX2lycShwYXJlbnQsIGluZGlvX2RldiwgcHJpdiwgaXJxKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogUG93ZXIgdXAgdG8gY2hlY2sgZGV2aWNlIElEIGFuZCBwZXJmb3JtIGluaXRpYWwgaGFyZHdhcmUgc2V0dXAuICovCisJZXJyID0genBhMjMyNl9wb3dlcl9vbihpbmRpb19kZXYsIHByaXYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBSZWFkIGlkIHJlZ2lzdGVyIHRvIGNoZWNrIHdlIGFyZSB0YWxraW5nIHRvIHRoZSByaWdodCBzbGF2ZS4gKi8KKwllcnIgPSByZWdtYXBfcmVhZChyZWdtYXAsIFpQQTIzMjZfREVWSUNFX0lEX1JFRywgJmlkKTsKKwlpZiAoZXJyKQorCQlnb3RvIHNsZWVwOworCisJaWYgKGlkICE9IGh3aWQpIHsKKwkJZGV2X2VycihwYXJlbnQsICJmb3VuZCBkZXZpY2Ugd2l0aCB1bmV4cGVjdGVkIGlkICUwMngiLCBpZCk7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gc2xlZXA7CisJfQorCisJZXJyID0genBhMjMyNl9jb25maWdfb25lc2hvdChpbmRpb19kZXYsIGlycSk7CisJaWYgKGVycikKKwkJZ290byBzbGVlcDsKKworCS8qIFNldHVwIGRvbmUgOiBnbyBzbGVlcGluZy4gRGV2aWNlIHdpbGwgYmUgYXdha2VuIHVwb24gdXNlciByZXF1ZXN0LiAqLworCWVyciA9IHpwYTIzMjZfc2xlZXAoaW5kaW9fZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIHBvd2Vyb2ZmOworCisJZGV2X3NldF9kcnZkYXRhKHBhcmVudCwgaW5kaW9fZGV2KTsKKworCXpwYTIzMjZfaW5pdF9ydW50aW1lKHBhcmVudCk7CisKKwllcnIgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKGVycikgeworCQl6cGEyMzI2X2ZpbmlfcnVudGltZShwYXJlbnQpOworCQlnb3RvIHBvd2Vyb2ZmOworCX0KKworCXJldHVybiAwOworCitzbGVlcDoKKwkvKiBQdXQgdG8gc2xlZXAganVzdCBpbiBjYXNlIHBvd2VyIHJlZ3VsYXRvcnMgYXJlICJkdW1teSIgb25lcy4gKi8KKwl6cGEyMzI2X3NsZWVwKGluZGlvX2Rldik7Citwb3dlcm9mZjoKKwl6cGEyMzI2X3Bvd2VyX29mZihpbmRpb19kZXYsIHByaXYpOworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHpwYTIzMjZfcHJvYmUpOworCit2b2lkIHpwYTIzMjZfcmVtb3ZlKGNvbnN0IHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKHBhcmVudCk7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwl6cGEyMzI2X2ZpbmlfcnVudGltZShpbmRpb19kZXYtPmRldi5wYXJlbnQpOworCXpwYTIzMjZfc2xlZXAoaW5kaW9fZGV2KTsKKwl6cGEyMzI2X3Bvd2VyX29mZihpbmRpb19kZXYsIGlpb19wcml2KGluZGlvX2RldikpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoenBhMjMyNl9yZW1vdmUpOworCitNT0RVTEVfQVVUSE9SKCJHcmVnb3IgQm9pcmllIDxncmVnb3IuYm9pcmllQHBhcnJvdC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvcmUgZHJpdmVyIGZvciBNdXJhdGEgWlBBMjMyNiBwcmVzc3VyZSBzZW5zb3IiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3pwYTIzMjYuaCBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3pwYTIzMjYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWQzZTFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvenBhMjMyNi5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBNdXJhdGEgWlBBMjMyNiBwcmVzc3VyZSBhbmQgdGVtcGVyYXR1cmUgc2Vuc29yIElJTyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgUGFycm90IFMuQS4KKyAqCisgKiBBdXRob3I6IEdyZWdvciBCb2lyaWUgPGdyZWdvci5ib2lyaWVAcGFycm90LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfWlBBMjMyNl9ICisjZGVmaW5lIF9aUEEyMzI2X0gKKworLyogUmVnaXN0ZXIgbWFwLiAqLworI2RlZmluZSBaUEEyMzI2X1JFRl9QX1hMX1JFRyAgICAgICAgICAgICAgKDB4OCkKKyNkZWZpbmUgWlBBMjMyNl9SRUZfUF9MX1JFRyAgICAgICAgICAgICAgICgweDkpCisjZGVmaW5lIFpQQTIzMjZfUkVGX1BfSF9SRUcgICAgICAgICAgICAgICAoMHhhKQorI2RlZmluZSBaUEEyMzI2X0RFVklDRV9JRF9SRUcgICAgICAgICAgICAgKDB4ZikKKyNkZWZpbmUgWlBBMjMyNl9ERVZJQ0VfSUQgICAgICAgICAgICAgICAgICgweGI5KQorI2RlZmluZSBaUEEyMzI2X1JFU19DT05GX1JFRyAgICAgICAgICAgICAgKDB4MTApCisjZGVmaW5lIFpQQTIzMjZfQ1RSTF9SRUcwX1JFRyAgICAgICAgICAgICAoMHgyMCkKKyNkZWZpbmUgWlBBMjMyNl9DVFJMX1JFRzBfT05FX1NIT1QgICAgICAgIEJJVCgwKQorI2RlZmluZSBaUEEyMzI2X0NUUkxfUkVHMF9FTkFCTEUgICAgICAgICAgQklUKDEpCisjZGVmaW5lIFpQQTIzMjZfQ1RSTF9SRUcxX1JFRyAgICAgICAgICAgICAoMHgyMSkKKyNkZWZpbmUgWlBBMjMyNl9DVFJMX1JFRzFfTUFTS19EQVRBX1JFQURZIEJJVCgyKQorI2RlZmluZSBaUEEyMzI2X0NUUkxfUkVHMl9SRUcgICAgICAgICAgICAgKDB4MjIpCisjZGVmaW5lIFpQQTIzMjZfQ1RSTF9SRUcyX1NXUkVTRVQgICAgICAgICBCSVQoMikKKyNkZWZpbmUgWlBBMjMyNl9DVFJMX1JFRzNfUkVHICAgICAgICAgICAgICgweDIzKQorI2RlZmluZSBaUEEyMzI2X0NUUkxfUkVHM19PRFJfU0hJRlQgICAgICAgKDQpCisjZGVmaW5lIFpQQTIzMjZfQ1RSTF9SRUczX0VOQUJMRV9NRUFTICAgICBCSVQoNykKKyNkZWZpbmUgWlBBMjMyNl9JTlRfU09VUkNFX1JFRyAgICAgICAgICAgICgweDI0KQorI2RlZmluZSBaUEEyMzI2X0lOVF9TT1VSQ0VfREFUQV9SRUFEWSAgICAgQklUKDIpCisjZGVmaW5lIFpQQTIzMjZfVEhTX1BfTE9XX1JFRyAgICAgICAgICAgICAoMHgyNSkKKyNkZWZpbmUgWlBBMjMyNl9USFNfUF9ISUdIX1JFRyAgICAgICAgICAgICgweDI2KQorI2RlZmluZSBaUEEyMzI2X1NUQVRVU19SRUcgICAgICAgICAgICAgICAgKDB4MjcpCisjZGVmaW5lIFpQQTIzMjZfU1RBVFVTX1BfREEgICAgICAgICAgICAgICBCSVQoMSkKKyNkZWZpbmUgWlBBMjMyNl9TVEFUVVNfRklGT19FICAgICAgICAgICAgIEJJVCgyKQorI2RlZmluZSBaUEEyMzI2X1NUQVRVU19QX09SICAgICAgICAgICAgICAgQklUKDUpCisjZGVmaW5lIFpQQTIzMjZfUFJFU1NfT1VUX1hMX1JFRyAgICAgICAgICAoMHgyOCkKKyNkZWZpbmUgWlBBMjMyNl9QUkVTU19PVVRfTF9SRUcgICAgICAgICAgICgweDI5KQorI2RlZmluZSBaUEEyMzI2X1BSRVNTX09VVF9IX1JFRyAgICAgICAgICAgKDB4MmEpCisjZGVmaW5lIFpQQTIzMjZfVEVNUF9PVVRfTF9SRUcgICAgICAgICAgICAoMHgyYikKKyNkZWZpbmUgWlBBMjMyNl9URU1QX09VVF9IX1JFRyAgICAgICAgICAgICgweDJjKQorCitzdHJ1Y3QgZGV2aWNlOworc3RydWN0IHJlZ21hcDsKKworYm9vbCB6cGEyMzI2X2lzcmVnX3dyaXRlYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpOworYm9vbCB6cGEyMzI2X2lzcmVnX3JlYWRhYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZyk7Citib29sIHpwYTIzMjZfaXNyZWdfcHJlY2lvdXMoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKTsKKworLyoqCisgKiB6cGEyMzI2X3Byb2JlKCkgLSBJbnN0YW50aWF0ZSBhbmQgcmVnaXN0ZXIgY29yZSBaUEEyMzI2IElJTyBkZXZpY2UKKyAqIEBwYXJlbnQ6IEhhcmR3YXJlIHNhbXBsaW5nIGRldmljZSB0aGUgY3JlYXRlZCBJSU8gZGV2aWNlIHdpbGwgYmUgYSBjaGlsZCBvZi4KKyAqIEBuYW1lOiAgIEFyYml0cmFyeSBuYW1lIHRvIGlkZW50aWZ5IHRoZSBkZXZpY2UuCisgKiBAaXJxOiAgICBJbnRlcnJ1cHQgbGluZSwgbmVnYXRpdmUgaWYgbm9uZS4KKyAqIEBod2lkOiAgIEV4cGVjdGVkIGRldmljZSBoYXJkd2FyZSBpZC4KKyAqIEByZWdtYXA6IFJlZ2lzdGVycyBtYXAgdXNlZCB0byBhYnN0cmFjdCB1bmRlcmx5aW5nIGJ1cyBhY2Nlc3Nlcy4KKyAqCisgKiBSZXR1cm46IFplcm8gd2hlbiBzdWNjZXNzZnVsLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgenBhMjMyNl9wcm9iZShzdHJ1Y3QgZGV2aWNlICAgICAgICAqcGFyZW50LAorCQkgIGNvbnN0IGNoYXIgICAgICAgICAgICpuYW1lLAorCQkgIGludCAgICAgICAgICAgICAgICAgICBpcnEsCisJCSAgdW5zaWduZWQgaW50ICAgICAgICAgIGh3aWQsCisJCSAgc3RydWN0IHJlZ21hcCAgICAgICAgKnJlZ21hcCk7CisKKy8qKgorICogenBhMjMyNl9yZW1vdmUoKSAtIFVucmVnaXN0ZXIgYW5kIGRlc3Ryb3kgY29yZSBaUEEyMzI2IElJTyBkZXZpY2UuCisgKiBAcGFyZW50OiBIYXJkd2FyZSBzYW1wbGluZyBkZXZpY2UgdGhlIElJTyBkZXZpY2UgdG8gcmVtb3ZlIGlzIGEgY2hpbGQgb2YuCisgKi8KK3ZvaWQgenBhMjMyNl9yZW1vdmUoY29uc3Qgc3RydWN0IGRldmljZSAqcGFyZW50KTsKKworI2lmZGVmIENPTkZJR19QTQorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CitleHRlcm4gY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgenBhMjMyNl9wbV9vcHM7CisjZGVmaW5lIFpQQTIzMjZfUE1fT1BTICgmenBhMjMyNl9wbV9vcHMpCisjZWxzZQorI2RlZmluZSBaUEEyMzI2X1BNX09QUyAoTlVMTCkKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3pwYTIzMjZfaTJjLmMgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS96cGEyMzI2X2kyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZDI3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS96cGEyMzI2X2kyYy5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBNdXJhdGEgWlBBMjMyNiBJMkMgcHJlc3N1cmUgYW5kIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgUGFycm90IFMuQS4KKyAqCisgKiBBdXRob3I6IEdyZWdvciBCb2lyaWUgPGdyZWdvci5ib2lyaWVAcGFycm90LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgInpwYTIzMjYuaCIKKworLyoKKyAqIHJlYWRfZmxhZ19tYXNrOgorICogICAtIGFkZHJlc3MgYml0IDcgbXVzdCBiZSBzZXQgdG8gcmVxdWVzdCBhIHJlZ2lzdGVyIHJlYWQgb3BlcmF0aW9uCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB6cGEyMzI2X3JlZ21hcF9pMmNfY29uZmlnID0geworCS5yZWdfYml0cyAgICAgICA9IDgsCisJLnZhbF9iaXRzICAgICAgID0gOCwKKwkud3JpdGVhYmxlX3JlZyAgPSB6cGEyMzI2X2lzcmVnX3dyaXRlYWJsZSwKKwkucmVhZGFibGVfcmVnICAgPSB6cGEyMzI2X2lzcmVnX3JlYWRhYmxlLAorCS5wcmVjaW91c19yZWcgICA9IHpwYTIzMjZfaXNyZWdfcHJlY2lvdXMsCisJLm1heF9yZWdpc3RlciAgID0gWlBBMjMyNl9URU1QX09VVF9IX1JFRywKKwkucmVhZF9mbGFnX21hc2sgPSBCSVQoNyksCisJLmNhY2hlX3R5cGUgICAgID0gUkVHQ0FDSEVfTk9ORSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgenBhMjMyNl9pMmNfaHdpZChjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworI2RlZmluZSBaUEEyMzI2X1NBMChfYWRkcikgICAgICAgICAgKF9hZGRyICYgQklUKDApKQorI2RlZmluZSBaUEEyMzI2X0RFVklDRV9JRF9TQTBfU0hJRlQgKDEpCisKKwkvKiBJZGVudGlmaWNhdGlvbiByZWdpc3RlciBiaXQgMSBtaXJyb3JzIGRldmljZSBhZGRyZXNzIGJpdCAwLiAqLworCXJldHVybiAoWlBBMjMyNl9ERVZJQ0VfSUQgfAorCQkoWlBBMjMyNl9TQTAoY2xpZW50LT5hZGRyKSA8PCBaUEEyMzI2X0RFVklDRV9JRF9TQTBfU0hJRlQpKTsKK30KKworc3RhdGljIGludCB6cGEyMzI2X3Byb2JlX2kyYyhzdHJ1Y3QgaTJjX2NsaWVudCAgICAgICAgICAqY2xpZW50LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaTJjX2lkKQoreworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKworCXJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGNsaWVudCwgJnpwYTIzMjZfcmVnbWFwX2kyY19jb25maWcpOworCWlmIChJU19FUlIocmVnbWFwKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZCB0byBpbml0IHJlZ2lzdGVycyBtYXAiKTsKKwkJcmV0dXJuIFBUUl9FUlIocmVnbWFwKTsKKwl9CisKKwlyZXR1cm4genBhMjMyNl9wcm9iZSgmY2xpZW50LT5kZXYsIGkyY19pZC0+bmFtZSwgY2xpZW50LT5pcnEsCisJCQkgICAgIHpwYTIzMjZfaTJjX2h3aWQoY2xpZW50KSwgcmVnbWFwKTsKK30KKworc3RhdGljIGludCB6cGEyMzI2X3JlbW92ZV9pMmMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwl6cGEyMzI2X3JlbW92ZSgmY2xpZW50LT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB6cGEyMzI2X2kyY19pZHNbXSA9IHsKKwl7ICJ6cGEyMzI2IiwgMCB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgenBhMjMyNl9pMmNfaWRzKTsKKworI2lmIGRlZmluZWQoQ09ORklHX09GKQorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgenBhMjMyNl9pMmNfbWF0Y2hlc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAibXVyYXRhLHpwYTIzMjYiIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgenBhMjMyNl9pMmNfbWF0Y2hlcyk7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHpwYTIzMjZfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSAgICAgICAgICAgPSAienBhMjMyNi1pMmMiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoenBhMjMyNl9pMmNfbWF0Y2hlcyksCisJCS5wbSAgICAgICAgICAgICA9IFpQQTIzMjZfUE1fT1BTLAorCX0sCisJLnByb2JlICAgID0genBhMjMyNl9wcm9iZV9pMmMsCisJLnJlbW92ZSAgID0genBhMjMyNl9yZW1vdmVfaTJjLAorCS5pZF90YWJsZSA9IHpwYTIzMjZfaTJjX2lkcywKK307Cittb2R1bGVfaTJjX2RyaXZlcih6cGEyMzI2X2kyY19kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJHcmVnb3IgQm9pcmllIDxncmVnb3IuYm9pcmllQHBhcnJvdC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkkyQyBkcml2ZXIgZm9yIE11cmF0YSBaUEEyMzI2IHByZXNzdXJlIHNlbnNvciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vcHJlc3N1cmUvenBhMjMyNl9zcGkuYyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3pwYTIzMjZfc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQyYzFjMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3pwYTIzMjZfc3BpLmMKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBNdXJhdGEgWlBBMjMyNiBTUEkgcHJlc3N1cmUgYW5kIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgUGFycm90IFMuQS4KKyAqCisgKiBBdXRob3I6IEdyZWdvciBCb2lyaWUgPGdyZWdvci5ib2lyaWVAcGFycm90LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlICJ6cGEyMzI2LmgiCisKKy8qCisgKiByZWFkX2ZsYWdfbWFzazoKKyAqICAgLSBhZGRyZXNzIGJpdCA3IG11c3QgYmUgc2V0IHRvIHJlcXVlc3QgYSByZWdpc3RlciByZWFkIG9wZXJhdGlvbgorICogICAtIGFkZHJlc3MgYml0IDYgbXVzdCBiZSBzZXQgdG8gcmVxdWVzdCByZWdpc3RlciBhZGRyZXNzIGF1dG8gaW5jcmVtZW50CisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB6cGEyMzI2X3JlZ21hcF9zcGlfY29uZmlnID0geworCS5yZWdfYml0cyAgICAgICA9IDgsCisJLnZhbF9iaXRzICAgICAgID0gOCwKKwkud3JpdGVhYmxlX3JlZyAgPSB6cGEyMzI2X2lzcmVnX3dyaXRlYWJsZSwKKwkucmVhZGFibGVfcmVnICAgPSB6cGEyMzI2X2lzcmVnX3JlYWRhYmxlLAorCS5wcmVjaW91c19yZWcgICA9IHpwYTIzMjZfaXNyZWdfcHJlY2lvdXMsCisJLm1heF9yZWdpc3RlciAgID0gWlBBMjMyNl9URU1QX09VVF9IX1JFRywKKwkucmVhZF9mbGFnX21hc2sgPSBCSVQoNykgfCBCSVQoNiksCisJLmNhY2hlX3R5cGUgICAgID0gUkVHQ0FDSEVfTk9ORSwKK307CisKK3N0YXRpYyBpbnQgenBhMjMyNl9wcm9iZV9zcGkoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJaW50ICAgICAgICAgICAgZXJyOworCisJcmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9zcGkoc3BpLCAmenBhMjMyNl9yZWdtYXBfc3BpX2NvbmZpZyk7CisJaWYgKElTX0VSUihyZWdtYXApKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiZmFpbGVkIHRvIGluaXQgcmVnaXN0ZXJzIG1hcCIpOworCQlyZXR1cm4gUFRSX0VSUihyZWdtYXApOworCX0KKworCS8qCisJICogRW5mb3JjZSBTUEkgc2xhdmUgc2V0dGluZ3MgdG8gcHJldmVudCBmcm9tIERUIG1pc2NvbmZpZ3VyYXRpb24uCisJICoKKwkgKiBDbG9jayBpcyBpZGxlIGhpZ2guIFNhbXBsaW5nIGhhcHBlbnMgb24gdHJhaWxpbmcgZWRnZSwgaS5lLiwgcmlzaW5nCisJICogZWRnZS4gTWF4aW11bSBidXMgZnJlcXVlbmN5IGlzIDEgTUh6LiBSZWdpc3RlcnMgYXJlIDggYml0cyB3aWRlLgorCSAqLworCXNwaS0+bW9kZSA9IFNQSV9NT0RFXzM7CisJc3BpLT5tYXhfc3BlZWRfaHogPSBtaW4oc3BpLT5tYXhfc3BlZWRfaHosIDEwMDAwMDBVKTsKKwlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OworCWVyciA9IHNwaV9zZXR1cChzcGkpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIHpwYTIzMjZfcHJvYmUoJnNwaS0+ZGV2LCBzcGlfZ2V0X2RldmljZV9pZChzcGkpLT5uYW1lLAorCQkJICAgICBzcGktPmlycSwgWlBBMjMyNl9ERVZJQ0VfSUQsIHJlZ21hcCk7Cit9CisKK3N0YXRpYyBpbnQgenBhMjMyNl9yZW1vdmVfc3BpKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJenBhMjMyNl9yZW1vdmUoJnNwaS0+ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgenBhMjMyNl9zcGlfaWRzW10gPSB7CisJeyAienBhMjMyNiIsIDAgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShzcGksIHpwYTIzMjZfc3BpX2lkcyk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19PRikKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHpwYTIzMjZfc3BpX21hdGNoZXNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIm11cmF0YSx6cGEyMzI2IiB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHpwYTIzMjZfc3BpX21hdGNoZXMpOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciB6cGEyMzI2X3NwaV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gInpwYTIzMjYtc3BpIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHpwYTIzMjZfc3BpX21hdGNoZXMpLAorCQkucG0gICAgICAgICAgICAgPSBaUEEyMzI2X1BNX09QUywKKwl9LAorCS5wcm9iZSAgICA9IHpwYTIzMjZfcHJvYmVfc3BpLAorCS5yZW1vdmUgICA9IHpwYTIzMjZfcmVtb3ZlX3NwaSwKKwkuaWRfdGFibGUgPSB6cGEyMzI2X3NwaV9pZHMsCit9OworbW9kdWxlX3NwaV9kcml2ZXIoenBhMjMyNl9zcGlfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiR3JlZ29yIEJvaXJpZSA8Z3JlZ29yLmJvaXJpZUBwYXJyb3QuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTUEkgZHJpdmVyIGZvciBNdXJhdGEgWlBBMjMyNiBwcmVzc3VyZSBzZW5zb3IiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3Byb3hpbWl0eS9hczM5MzUuYyBiL2RyaXZlcnMvaWlvL3Byb3hpbWl0eS9hczM5MzUuYwppbmRleCAyZTNhNzBlLi41NjU2ZGViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9wcm94aW1pdHkvYXMzOTM1LmMKKysrIGIvZHJpdmVycy9paW8vcHJveGltaXR5L2FzMzkzNS5jCkBAIC0zOTcsNyArMzk3LDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9zZXR1cChpbmRpb19kZXYsIE5VTEwsCisJcmV0ID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfc2V0dXAoaW5kaW9fZGV2LCBpaW9fcG9sbGZ1bmNfc3RvcmVfdGltZSwKIAkJJmFzMzkzNV90cmlnZ2VyX2hhbmRsZXIsIE5VTEwpOwogCiAJaWYgKHJldCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vcHJveGltaXR5L3N4OTUwMC5jIGIvZHJpdmVycy9paW8vcHJveGltaXR5L3N4OTUwMC5jCmluZGV4IDFkNzRiM2EuLjFmMDYyODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL3Byb3hpbWl0eS9zeDk1MDAuYworKysgYi9kcml2ZXJzL2lpby9wcm94aW1pdHkvc3g5NTAwLmMKQEAgLTUxNiw3ICs1MTYsNyBAQAogCQlzeDk1MDBfcHVzaF9ldmVudHMoaW5kaW9fZGV2KTsKIAogCWlmICh2YWwgJiBTWDk1MDBfQ09OVkRPTkVfSVJRKQotCQljb21wbGV0ZV9hbGwoJmRhdGEtPmNvbXBsZXRpb24pOworCQljb21wbGV0ZSgmZGF0YS0+Y29tcGxldGlvbik7CiAKIG91dDoKIAltdXRleF91bmxvY2soJmRhdGEtPm11dGV4KTsKQEAgLTEwMjUsNiArMTAyNSwxMiBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoYWNwaSwgc3g5NTAwX2FjcGlfbWF0Y2gpOwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzeDk1MDBfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInNlbXRlY2gsc3g5NTAwIiwgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzeDk1MDBfb2ZfbWF0Y2gpOworCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgc3g5NTAwX2lkW10gPSB7CiAJeyJzeDk1MDAiLCAwfSwKIAl7IH0sCkBAIC0xMDM1LDYgKzEwNDEsNyBAQAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gU1g5NTAwX0RSSVZFUl9OQU1FLAogCQkuYWNwaV9tYXRjaF90YWJsZSA9IEFDUElfUFRSKHN4OTUwMF9hY3BpX21hdGNoKSwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHN4OTUwMF9vZl9tYXRjaCksCiAJCS5wbSA9ICZzeDk1MDBfcG1fb3BzLAogCX0sCiAJLnByb2JlCQk9IHN4OTUwMF9wcm9iZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3RlbXBlcmF0dXJlL0tjb25maWcgYi9kcml2ZXJzL2lpby90ZW1wZXJhdHVyZS9LY29uZmlnCmluZGV4IGM0NjY0ZTUuLjVlYTc3YTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL3RlbXBlcmF0dXJlL0tjb25maWcKKysrIGIvZHJpdmVycy9paW8vdGVtcGVyYXR1cmUvS2NvbmZpZwpAQCAtMyw2ICszLDIyIEBACiAjCiBtZW51ICJUZW1wZXJhdHVyZSBzZW5zb3JzIgogCitjb25maWcgTUFYSU1fVEhFUk1PQ09VUExFCisJdHJpc3RhdGUgIk1heGltIHRoZXJtb2NvdXBsZSBzZW5zb3JzIgorCWRlcGVuZHMgb24gU1BJCisJc2VsZWN0IElJT19CVUZGRVIKKwlzZWxlY3QgSUlPX1RSSUdHRVJFRF9CVUZGRVIKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIE1heGltIHNlcmllcyBvZgorCSAgdGhlcm1vY291cGxlIHNlbnNvcnMgY29ubmVjdGVkIHZpYSBTUEkuCisKKwkgIFN1cHBvcnRlZCBzZW5zb3JzOgorCSAgICogTUFYNjY3NQorCSAgICogTUFYMzE4NTUKKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBtYXhpbV90aGVybW9jb3VwbGUuCisKIGNvbmZpZyBNTFg5MDYxNAogCXRyaXN0YXRlICJNTFg5MDYxNCBjb250YWN0LWxlc3MgaW5mcmFyZWQgc2Vuc29yIgogCWRlcGVuZHMgb24gSTJDCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby90ZW1wZXJhdHVyZS9NYWtlZmlsZSBiL2RyaXZlcnMvaWlvL3RlbXBlcmF0dXJlL01ha2VmaWxlCmluZGV4IDAyYmM3OWQuLjc4YzNkZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL3RlbXBlcmF0dXJlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaWlvL3RlbXBlcmF0dXJlL01ha2VmaWxlCkBAIC0yLDYgKzIsNyBAQAogIyBNYWtlZmlsZSBmb3IgaW5kdXN0cmlhbCBJL08gdGVtcGVyYXR1cmUgZHJpdmVycwogIwogCitvYmotJChDT05GSUdfTUFYSU1fVEhFUk1PQ09VUExFKSArPSBtYXhpbV90aGVybW9jb3VwbGUubwogb2JqLSQoQ09ORklHX01MWDkwNjE0KSArPSBtbHg5MDYxNC5vCiBvYmotJChDT05GSUdfVE1QMDA2KSArPSB0bXAwMDYubwogb2JqLSQoQ09ORklHX1RTWVMwMSkgKz0gdHN5czAxLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3RlbXBlcmF0dXJlL21heGltX3RoZXJtb2NvdXBsZS5jIGIvZHJpdmVycy9paW8vdGVtcGVyYXR1cmUvbWF4aW1fdGhlcm1vY291cGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlkZDIwMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL3RlbXBlcmF0dXJlL21heGltX3RoZXJtb2NvdXBsZS5jCkBAIC0wLDAgKzEsMjgxIEBACisvKgorICogbWF4aW1fdGhlcm1vY291cGxlLmMgIC0gU3VwcG9ydCBmb3IgTWF4aW0gdGhlcm1vY291cGxlIGNoaXBzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IE1hdHQgUmFub3N0YXkgPG1yYW5vc3RheUBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vYnVmZmVyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXJlZF9idWZmZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcl9jb25zdW1lci5oPgorCisjZGVmaW5lIE1BWElNX1RIRVJNT0NPVVBMRV9EUlZfTkFNRQkibWF4aW1fdGhlcm1vY291cGxlIgorCitlbnVtIHsKKwlNQVg2Njc1LAorCU1BWDMxODU1LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIG1heDY2NzVfY2hhbm5lbHNbXSA9IHsKKwl7CS8qIHRoZXJtb2NvdXBsZSB0ZW1wZXJhdHVyZSAqLworCQkudHlwZSA9IElJT19URU1QLAorCQkuaW5mb19tYXNrX3NlcGFyYXRlID0KKwkJCUJJVChJSU9fQ0hBTl9JTkZPX1JBVykgfCBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSksCisJCS5zY2FuX2luZGV4ID0gMCwKKwkJLnNjYW5fdHlwZSA9IHsKKwkJCS5zaWduID0gJ3MnLAorCQkJLnJlYWxiaXRzID0gMTMsCisJCQkuc3RvcmFnZWJpdHMgPSAxNiwKKwkJCS5zaGlmdCA9IDMsCisJCQkuZW5kaWFubmVzcyA9IElJT19CRSwKKwkJfSwKKwl9LAorCUlJT19DSEFOX1NPRlRfVElNRVNUQU1QKDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIG1heDMxODU1X2NoYW5uZWxzW10gPSB7CisJewkvKiB0aGVybW9jb3VwbGUgdGVtcGVyYXR1cmUgKi8KKwkJLnR5cGUgPSBJSU9fVEVNUCwKKwkJLmFkZHJlc3MgPSAyLAorCQkuaW5mb19tYXNrX3NlcGFyYXRlID0KKwkJCUJJVChJSU9fQ0hBTl9JTkZPX1JBVykgfCBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSksCisJCS5zY2FuX2luZGV4ID0gMCwKKwkJLnNjYW5fdHlwZSA9IHsKKwkJCS5zaWduID0gJ3MnLAorCQkJLnJlYWxiaXRzID0gMTQsCisJCQkuc3RvcmFnZWJpdHMgPSAxNiwKKwkJCS5zaGlmdCA9IDIsCisJCQkuZW5kaWFubmVzcyA9IElJT19CRSwKKwkJfSwKKwl9LAorCXsJLyogY29sZCBqdW5jdGlvbiB0ZW1wZXJhdHVyZSAqLworCQkudHlwZSA9IElJT19URU1QLAorCQkuYWRkcmVzcyA9IDAsCisJCS5jaGFubmVsMiA9IElJT19NT0RfVEVNUF9BTUJJRU5ULAorCQkubW9kaWZpZWQgPSAxLAorCQkuaW5mb19tYXNrX3NlcGFyYXRlID0KKwkJCUJJVChJSU9fQ0hBTl9JTkZPX1JBVykgfCBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSksCisJCS5zY2FuX2luZGV4ID0gMSwKKwkJLnNjYW5fdHlwZSA9IHsKKwkJCS5zaWduID0gJ3MnLAorCQkJLnJlYWxiaXRzID0gMTIsCisJCQkuc3RvcmFnZWJpdHMgPSAxNiwKKwkJCS5zaGlmdCA9IDQsCisJCQkuZW5kaWFubmVzcyA9IElJT19CRSwKKwkJfSwKKwl9LAorCUlJT19DSEFOX1NPRlRfVElNRVNUQU1QKDIpLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbWF4MzE4NTVfc2Nhbl9tYXNrc1tdID0gezB4MywgMH07CisKK3N0cnVjdCBtYXhpbV90aGVybW9jb3VwbGVfY2hpcCB7CisJY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW5uZWxzOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgKnNjYW5fbWFza3M7CisJdTggbnVtX2NoYW5uZWxzOworCXU4IHJlYWRfc2l6ZTsKKworCS8qIGJpdC1jaGVjayBmb3IgdmFsaWQgaW5wdXQgKi8KKwl1MzIgc3RhdHVzX2JpdDsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWF4aW1fdGhlcm1vY291cGxlX2NoaXAgbWF4aW1fdGhlcm1vY291cGxlX2NoaXBzW10gPSB7CisJW01BWDY2NzVdID0geworCQkJLmNoYW5uZWxzID0gbWF4NjY3NV9jaGFubmVscywKKwkJCS5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKG1heDY2NzVfY2hhbm5lbHMpLAorCQkJLnJlYWRfc2l6ZSA9IDIsCisJCQkuc3RhdHVzX2JpdCA9IEJJVCgyKSwKKwkJfSwKKwlbTUFYMzE4NTVdID0geworCQkJLmNoYW5uZWxzID0gbWF4MzE4NTVfY2hhbm5lbHMsCisJCQkubnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShtYXgzMTg1NV9jaGFubmVscyksCisJCQkucmVhZF9zaXplID0gNCwKKwkJCS5zY2FuX21hc2tzID0gbWF4MzE4NTVfc2Nhbl9tYXNrcywKKwkJCS5zdGF0dXNfYml0ID0gQklUKDE2KSwKKwkJfSwKK307CisKK3N0cnVjdCBtYXhpbV90aGVybW9jb3VwbGVfZGF0YSB7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaTsKKwljb25zdCBzdHJ1Y3QgbWF4aW1fdGhlcm1vY291cGxlX2NoaXAgKmNoaXA7CisKKwl1OCBidWZmZXJbMTZdIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKK307CisKK3N0YXRpYyBpbnQgbWF4aW1fdGhlcm1vY291cGxlX3JlYWQoc3RydWN0IG1heGltX3RoZXJtb2NvdXBsZV9kYXRhICpkYXRhLAorCQkJCSAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLCBpbnQgKnZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgc3RvcmFnZV9ieXRlcyA9IGRhdGEtPmNoaXAtPnJlYWRfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgc2hpZnQgPSBjaGFuLT5zY2FuX3R5cGUuc2hpZnQgKyAoY2hhbi0+YWRkcmVzcyAqIDgpOworCXVuc2lnbmVkIGludCBidWY7CisJaW50IHJldDsKKworCXJldCA9IHNwaV9yZWFkKGRhdGEtPnNwaSwgKHZvaWQgKikgJmJ1Ziwgc3RvcmFnZV9ieXRlcyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXN3aXRjaCAoc3RvcmFnZV9ieXRlcykgeworCWNhc2UgMjoKKwkJKnZhbCA9IGJlMTZfdG9fY3B1KGJ1Zik7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJKnZhbCA9IGJlMzJfdG9fY3B1KGJ1Zik7CisJCWJyZWFrOworCX0KKworCS8qIGNoZWNrIHRvIGJlIHN1cmUgdGhpcyBpcyBhIHZhbGlkIHJlYWRpbmcgKi8KKwlpZiAoKnZhbCAmIGRhdGEtPmNoaXAtPnN0YXR1c19iaXQpCisJCXJldHVybiAtRUlOVkFMOworCisJKnZhbCA9IHNpZ25fZXh0ZW5kMzIoKnZhbCA+PiBzaGlmdCwgY2hhbi0+c2Nhbl90eXBlLnJlYWxiaXRzIC0gMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IG1heGltX3RoZXJtb2NvdXBsZV90cmlnZ2VyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwlzdHJ1Y3QgaWlvX3BvbGxfZnVuYyAqcGYgPSBwcml2YXRlOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwZi0+aW5kaW9fZGV2OworCXN0cnVjdCBtYXhpbV90aGVybW9jb3VwbGVfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldDsKKworCXJldCA9IHNwaV9yZWFkKGRhdGEtPnNwaSwgZGF0YS0+YnVmZmVyLCBkYXRhLT5jaGlwLT5yZWFkX3NpemUpOworCWlmICghcmV0KSB7CisJCWlpb19wdXNoX3RvX2J1ZmZlcnNfd2l0aF90aW1lc3RhbXAoaW5kaW9fZGV2LCBkYXRhLT5idWZmZXIsCisJCQkJCQkgICBpaW9fZ2V0X3RpbWVfbnMoaW5kaW9fZGV2KSk7CisJfQorCisJaWlvX3RyaWdnZXJfbm90aWZ5X2RvbmUoaW5kaW9fZGV2LT50cmlnKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBtYXhpbV90aGVybW9jb3VwbGVfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCQkgICAgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkJICAgICAgIGludCAqdmFsLCBpbnQgKnZhbDIsIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgbWF4aW1fdGhlcm1vY291cGxlX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQgPSAtRUlOVkFMOworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJcmV0ID0gaWlvX2RldmljZV9jbGFpbV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBtYXhpbV90aGVybW9jb3VwbGVfcmVhZChkYXRhLCBjaGFuLCB2YWwpOworCQlpaW9fZGV2aWNlX3JlbGVhc2VfZGlyZWN0X21vZGUoaW5kaW9fZGV2KTsKKworCQlpZiAoIXJldCkKKwkJCXJldHVybiBJSU9fVkFMX0lOVDsKKworCQlicmVhazsKKwljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6CisJCXN3aXRjaCAoY2hhbi0+Y2hhbm5lbDIpIHsKKwkJY2FzZSBJSU9fTU9EX1RFTVBfQU1CSUVOVDoKKwkJCSp2YWwgPSA2MjsKKwkJCSp2YWwyID0gNTAwMDAwOyAvKiAxMDAwICogMC4wNjI1ICovCisJCQlyZXQgPSBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkqdmFsID0gMjUwOyAvKiAxMDAwICogMC4yNSAqLworCQkJcmV0ID0gSUlPX1ZBTF9JTlQ7CisJCX07CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gbWF4aW1fdGhlcm1vY291cGxlX2luZm8gPSB7CisJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKKwkucmVhZF9yYXcgPSBtYXhpbV90aGVybW9jb3VwbGVfcmVhZF9yYXcsCit9OworCitzdGF0aWMgaW50IG1heGltX3RoZXJtb2NvdXBsZV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkICppZCA9IHNwaV9nZXRfZGV2aWNlX2lkKHNwaSk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3QgbWF4aW1fdGhlcm1vY291cGxlX2RhdGEgKmRhdGE7CisJY29uc3Qgc3RydWN0IG1heGltX3RoZXJtb2NvdXBsZV9jaGlwICpjaGlwID0KKwkJCSZtYXhpbV90aGVybW9jb3VwbGVfY2hpcHNbaWQtPmRyaXZlcl9kYXRhXTsKKwlpbnQgcmV0OworCisJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZzcGktPmRldiwgc2l6ZW9mKCpkYXRhKSk7CisJaWYgKCFpbmRpb19kZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJaW5kaW9fZGV2LT5pbmZvID0gJm1heGltX3RoZXJtb2NvdXBsZV9pbmZvOworCWluZGlvX2Rldi0+bmFtZSA9IE1BWElNX1RIRVJNT0NPVVBMRV9EUlZfTkFNRTsKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0gY2hpcC0+Y2hhbm5lbHM7CisJaW5kaW9fZGV2LT5hdmFpbGFibGVfc2Nhbl9tYXNrcyA9IGNoaXAtPnNjYW5fbWFza3M7CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBjaGlwLT5udW1fY2hhbm5lbHM7CisJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJZGF0YS0+c3BpID0gc3BpOworCWRhdGEtPmNoaXAgPSBjaGlwOworCisJcmV0ID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfc2V0dXAoaW5kaW9fZGV2LCBOVUxMLAorCQkJCW1heGltX3RoZXJtb2NvdXBsZV90cmlnZ2VyX2hhbmRsZXIsIE5VTEwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl91bnJlZ19idWZmZXI7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfdW5yZWdfYnVmZmVyOgorCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoaW5kaW9fZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWF4aW1fdGhlcm1vY291cGxlX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoaW5kaW9fZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgbWF4aW1fdGhlcm1vY291cGxlX2lkW10gPSB7CisJeyJtYXg2Njc1IiwgTUFYNjY3NX0sCisJeyJtYXgzMTg1NSIsIE1BWDMxODU1fSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHNwaSwgbWF4aW1fdGhlcm1vY291cGxlX2lkKTsKKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIG1heGltX3RoZXJtb2NvdXBsZV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSBNQVhJTV9USEVSTU9DT1VQTEVfRFJWX05BTUUsCisJfSwKKwkucHJvYmUJCT0gbWF4aW1fdGhlcm1vY291cGxlX3Byb2JlLAorCS5yZW1vdmUJCT0gbWF4aW1fdGhlcm1vY291cGxlX3JlbW92ZSwKKwkuaWRfdGFibGUJPSBtYXhpbV90aGVybW9jb3VwbGVfaWQsCit9OworbW9kdWxlX3NwaV9kcml2ZXIobWF4aW1fdGhlcm1vY291cGxlX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIk1hdHQgUmFub3N0YXkgPG1yYW5vc3RheUBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1heGltIHRoZXJtb2NvdXBsZSBzZW5zb3JzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbWEuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NtYS5jCmluZGV4IGU2ZGZhMWIuLjVmNjVhNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NtYS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2NtYS5jCkBAIC0yNDYyLDE4ICsyNDYyLDI0IEBACiAKIAlpZiAoYWRkci0+ZGV2X2FkZHIuYm91bmRfZGV2X2lmKSB7CiAJCW5kZXYgPSBkZXZfZ2V0X2J5X2luZGV4KCZpbml0X25ldCwgYWRkci0+ZGV2X2FkZHIuYm91bmRfZGV2X2lmKTsKLQkJaWYgKCFuZGV2KQotCQkJcmV0dXJuIC1FTk9ERVY7CisJCWlmICghbmRldikgeworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCWdvdG8gZXJyMjsKKwkJfQogCiAJCWlmIChuZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykgewogCQkJZGV2X3B1dChuZGV2KTsKLQkJCWlmICghaWRfcHJpdi0+aWQuZGV2aWNlLT5nZXRfbmV0ZGV2KQotCQkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJCWlmICghaWRfcHJpdi0+aWQuZGV2aWNlLT5nZXRfbmV0ZGV2KSB7CisJCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCQkJZ290byBlcnIyOworCQkJfQogCiAJCQluZGV2ID0gaWRfcHJpdi0+aWQuZGV2aWNlLT5nZXRfbmV0ZGV2KGlkX3ByaXYtPmlkLmRldmljZSwKIAkJCQkJCQkgICAgICBpZF9wcml2LT5pZC5wb3J0X251bSk7Ci0JCQlpZiAoIW5kZXYpCi0JCQkJcmV0dXJuIC1FTk9ERVY7CisJCQlpZiAoIW5kZXYpIHsKKwkJCQlyZXQgPSAtRU5PREVWOworCQkJCWdvdG8gZXJyMjsKKwkJCX0KIAkJfQogCiAJCXJvdXRlLT5wYXRoX3JlYy0+bmV0ID0gJmluaXRfbmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvbXVsdGljYXN0LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tdWx0aWNhc3QuYwppbmRleCAzYTNjNWQ3Li41MWM3OWIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tdWx0aWNhc3QuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tdWx0aWNhc3QuYwpAQCAtMTA2LDcgKzEwNiw2IEBACiAJYXRvbWljX3QJCXJlZmNvdW50OwogCWVudW0gbWNhc3RfZ3JvdXBfc3RhdGUJc3RhdGU7CiAJc3RydWN0IGliX3NhX3F1ZXJ5CSpxdWVyeTsKLQlpbnQJCQlxdWVyeV9pZDsKIAl1MTYJCQlwa2V5X2luZGV4OwogCXU4CQkJbGVhdmVfc3RhdGU7CiAJaW50CQkJcmV0cmllczsKQEAgLTM0MCwxMSArMzM5LDcgQEAKIAkJCQkgICAgICAgbWVtYmVyLT5tdWx0aWNhc3QuY29tcF9tYXNrLAogCQkJCSAgICAgICAzMDAwLCBHRlBfS0VSTkVMLCBqb2luX2hhbmRsZXIsIGdyb3VwLAogCQkJCSAgICAgICAmZ3JvdXAtPnF1ZXJ5KTsKLQlpZiAocmV0ID49IDApIHsKLQkJZ3JvdXAtPnF1ZXJ5X2lkID0gcmV0OwotCQlyZXQgPSAwOwotCX0KLQlyZXR1cm4gcmV0OworCXJldHVybiAocmV0ID4gMCkgPyAwIDogcmV0OwogfQogCiBzdGF0aWMgaW50IHNlbmRfbGVhdmUoc3RydWN0IG1jYXN0X2dyb3VwICpncm91cCwgdTggbGVhdmVfc3RhdGUpCkBAIC0zNjQsMTEgKzM1OSw3IEBACiAJCQkJICAgICAgIElCX1NBX01DTUVNQkVSX1JFQ19KT0lOX1NUQVRFLAogCQkJCSAgICAgICAzMDAwLCBHRlBfS0VSTkVMLCBsZWF2ZV9oYW5kbGVyLAogCQkJCSAgICAgICBncm91cCwgJmdyb3VwLT5xdWVyeSk7Ci0JaWYgKHJldCA+PSAwKSB7Ci0JCWdyb3VwLT5xdWVyeV9pZCA9IHJldDsKLQkJcmV0ID0gMDsKLQl9Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gKHJldCA+IDApID8gMCA6IHJldDsKIH0KIAogc3RhdGljIHZvaWQgam9pbl9ncm91cChzdHJ1Y3QgbWNhc3RfZ3JvdXAgKmdyb3VwLCBzdHJ1Y3QgbWNhc3RfbWVtYmVyICptZW1iZXIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvS2NvbmZpZyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9LY29uZmlnCmluZGV4IDIzZjM4Y2YuLmFmZThiMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9LY29uZmlnCkBAIC0xLDYgKzEsNyBAQAogY29uZmlnIElORklOSUJBTkRfQ1hHQjQKIAl0cmlzdGF0ZSAiQ2hlbHNpbyBUNC9UNSBSRE1BIERyaXZlciIKIAlkZXBlbmRzIG9uIENIRUxTSU9fVDQgJiYgSU5FVCAmJiAoSVBWNiB8fCBJUFY2PW4pCisJc2VsZWN0IENIRUxTSU9fTElCCiAJc2VsZWN0IEdFTkVSSUNfQUxMT0NBVE9SCiAJLS0taGVscC0tLQogCSAgVGhpcyBpcyBhbiBpV0FSUC9SRE1BIGRyaXZlciBmb3IgdGhlIENoZWxzaW8gVDQgYW5kIFQ1CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvTWFrZWZpbGUgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvTWFrZWZpbGUKaW5kZXggZTExY2Y3Mi4uZmE0MGI2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9NYWtlZmlsZQpAQCAtMSw0ICsxLDUgQEAKIGNjZmxhZ3MteSA6PSAtSWRyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vbGliY3hnYgogCiBvYmotJChDT05GSUdfSU5GSU5JQkFORF9DWEdCNCkgKz0gaXdfY3hnYjQubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jbS5jCmluZGV4IDNhY2E3ZjYuLjcxYzg4NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jbS5jCkBAIC00OSw2ICs0OSw3IEBACiAKICNpbmNsdWRlIDxyZG1hL2liX2FkZHIuaD4KIAorI2luY2x1ZGUgPGxpYmN4Z2JfY20uaD4KICNpbmNsdWRlICJpd19jeGdiNC5oIgogI2luY2x1ZGUgImNsaXBfdGJsLmgiCiAKQEAgLTIzOSwxNSArMjQwLDEzIEBACiAKIHN0YXRpYyB2b2lkIHJlbGVhc2VfdGlkKHN0cnVjdCBjNGl3X3JkZXYgKnJkZXYsIHUzMiBod3RpZCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgY3BsX3RpZF9yZWxlYXNlICpyZXE7CisJdTMyIGxlbiA9IHJvdW5kdXAoc2l6ZW9mKHN0cnVjdCBjcGxfdGlkX3JlbGVhc2UpLCAxNik7CiAKLQlza2IgPSBnZXRfc2tiKHNrYiwgc2l6ZW9mICpyZXEsIEdGUF9LRVJORUwpOworCXNrYiA9IGdldF9za2Ioc2tiLCBsZW4sIEdGUF9LRVJORUwpOwogCWlmICghc2tiKQogCQlyZXR1cm47Ci0JcmVxID0gKHN0cnVjdCBjcGxfdGlkX3JlbGVhc2UgKikgc2tiX3B1dChza2IsIHNpemVvZigqcmVxKSk7Ci0JSU5JVF9UUF9XUihyZXEsIGh3dGlkKTsKLQlPUENPREVfVElEKHJlcSkgPSBjcHVfdG9fYmUzMihNS19PUENPREVfVElEKENQTF9USURfUkVMRUFTRSwgaHd0aWQpKTsKLQlzZXRfd3JfdHhxKHNrYiwgQ1BMX1BSSU9SSVRZX1NFVFVQLCAwKTsKKworCWN4Z2JfbWtfdGlkX3JlbGVhc2Uoc2tiLCBsZW4sIGh3dGlkLCAwKTsKIAljNGl3X29mbGRfc2VuZChyZGV2LCBza2IpOwogCXJldHVybjsKIH0KQEAgLTMzMyw2ICszMzIsOCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmVwLT5jb20uZGV2LT5sb2NrLCBmbGFncyk7CiAJX3JlbW92ZV9oYW5kbGUoZXAtPmNvbS5kZXYsICZlcC0+Y29tLmRldi0+aHd0aWRfaWRyLCBlcC0+aHd0aWQsIDApOworCWlmIChpZHJfaXNfZW1wdHkoJmVwLT5jb20uZGV2LT5od3RpZF9pZHIpKQorCQl3YWtlX3VwKCZlcC0+Y29tLmRldi0+d2FpdCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXAtPmNvbS5kZXYtPmxvY2ssIGZsYWdzKTsKIH0KIApAQCAtNDY0LDcyICs0NjUsNiBAQAogCXJldHVybiByZG1hX3ZsYW5fZGV2X3JlYWxfZGV2KGVncmVzc19kZXYpID8gOiBlZ3Jlc3NfZGV2OwogfQogCi1zdGF0aWMgaW50IG91cl9pbnRlcmZhY2Uoc3RydWN0IGM0aXdfZGV2ICpkZXYsIHN0cnVjdCBuZXRfZGV2aWNlICplZ3Jlc3NfZGV2KQotewotCWludCBpOwotCi0JZWdyZXNzX2RldiA9IGdldF9yZWFsX2RldihlZ3Jlc3NfZGV2KTsKLQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5yZGV2LmxsZGkubnBvcnRzOyBpKyspCi0JCWlmIChkZXYtPnJkZXYubGxkaS5wb3J0c1tpXSA9PSBlZ3Jlc3NfZGV2KQotCQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZHN0X2VudHJ5ICpmaW5kX3JvdXRlNihzdHJ1Y3QgYzRpd19kZXYgKmRldiwgX191OCAqbG9jYWxfaXAsCi0JCQkJICAgICBfX3U4ICpwZWVyX2lwLCBfX2JlMTYgbG9jYWxfcG9ydCwKLQkJCQkgICAgIF9fYmUxNiBwZWVyX3BvcnQsIHU4IHRvcywKLQkJCQkgICAgIF9fdTMyIHNpbjZfc2NvcGVfaWQpCi17Ci0Jc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gTlVMTDsKLQotCWlmIChJU19FTkFCTEVEKENPTkZJR19JUFY2KSkgewotCQlzdHJ1Y3QgZmxvd2k2IGZsNjsKLQotCQltZW1zZXQoJmZsNiwgMCwgc2l6ZW9mKGZsNikpOwotCQltZW1jcHkoJmZsNi5kYWRkciwgcGVlcl9pcCwgMTYpOwotCQltZW1jcHkoJmZsNi5zYWRkciwgbG9jYWxfaXAsIDE2KTsKLQkJaWYgKGlwdjZfYWRkcl90eXBlKCZmbDYuZGFkZHIpICYgSVBWNl9BRERSX0xJTktMT0NBTCkKLQkJCWZsNi5mbG93aTZfb2lmID0gc2luNl9zY29wZV9pZDsKLQkJZHN0ID0gaXA2X3JvdXRlX291dHB1dCgmaW5pdF9uZXQsIE5VTEwsICZmbDYpOwotCQlpZiAoIWRzdCkKLQkJCWdvdG8gb3V0OwotCQlpZiAoIW91cl9pbnRlcmZhY2UoZGV2LCBpcDZfZHN0X2lkZXYoZHN0KS0+ZGV2KSAmJgotCQkgICAgIShpcDZfZHN0X2lkZXYoZHN0KS0+ZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykpIHsKLQkJCWRzdF9yZWxlYXNlKGRzdCk7Ci0JCQlkc3QgPSBOVUxMOwotCQl9Ci0JfQotCi1vdXQ6Ci0JcmV0dXJuIGRzdDsKLX0KLQotc3RhdGljIHN0cnVjdCBkc3RfZW50cnkgKmZpbmRfcm91dGUoc3RydWN0IGM0aXdfZGV2ICpkZXYsIF9fYmUzMiBsb2NhbF9pcCwKLQkJCQkgX19iZTMyIHBlZXJfaXAsIF9fYmUxNiBsb2NhbF9wb3J0LAotCQkJCSBfX2JlMTYgcGVlcl9wb3J0LCB1OCB0b3MpCi17Ci0Jc3RydWN0IHJ0YWJsZSAqcnQ7Ci0Jc3RydWN0IGZsb3dpNCBmbDQ7Ci0Jc3RydWN0IG5laWdoYm91ciAqbjsKLQotCXJ0ID0gaXBfcm91dGVfb3V0cHV0X3BvcnRzKCZpbml0X25ldCwgJmZsNCwgTlVMTCwgcGVlcl9pcCwgbG9jYWxfaXAsCi0JCQkJICAgcGVlcl9wb3J0LCBsb2NhbF9wb3J0LCBJUFBST1RPX1RDUCwKLQkJCQkgICB0b3MsIDApOwotCWlmIChJU19FUlIocnQpKQotCQlyZXR1cm4gTlVMTDsKLQluID0gZHN0X25laWdoX2xvb2t1cCgmcnQtPmRzdCwgJnBlZXJfaXApOwotCWlmICghbikKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFvdXJfaW50ZXJmYWNlKGRldiwgbi0+ZGV2KSAmJgotCSAgICAhKG4tPmRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spKSB7Ci0JCW5laWdoX3JlbGVhc2Uobik7Ci0JCWRzdF9yZWxlYXNlKCZydC0+ZHN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW5laWdoX3JlbGVhc2Uobik7Ci0JcmV0dXJuICZydC0+ZHN0OwotfQotCiBzdGF0aWMgdm9pZCBhcnBfZmFpbHVyZV9kaXNjYXJkKHZvaWQgKmhhbmRsZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlwcl9lcnIoTU9EICJBUlAgZmFpbHVyZVxuIik7CkBAIC03MDQsNTggKzYzOSwzNCBAQAogCiBzdGF0aWMgaW50IHNlbmRfaGFsZmNsb3NlKHN0cnVjdCBjNGl3X2VwICplcCkKIHsKLQlzdHJ1Y3QgY3BsX2Nsb3NlX2Nvbl9yZXEgKnJlcTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2tiX2RlcXVldWUoJmVwLT5jb20uZXBfc2tiX2xpc3QpOwotCWludCB3cmxlbiA9IHJvdW5kdXAoc2l6ZW9mICpyZXEsIDE2KTsKKwl1MzIgd3JsZW4gPSByb3VuZHVwKHNpemVvZihzdHJ1Y3QgY3BsX2Nsb3NlX2Nvbl9yZXEpLCAxNik7CiAKIAlQREJHKCIlcyBlcCAlcCB0aWQgJXVcbiIsIF9fZnVuY19fLCBlcCwgZXAtPmh3dGlkKTsKIAlpZiAoV0FSTl9PTighc2tiKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzZXRfd3JfdHhxKHNrYiwgQ1BMX1BSSU9SSVRZX0RBVEEsIGVwLT50eHFfaWR4KTsKLQl0NF9zZXRfYXJwX2Vycl9oYW5kbGVyKHNrYiwgTlVMTCwgYXJwX2ZhaWx1cmVfZGlzY2FyZCk7Ci0JcmVxID0gKHN0cnVjdCBjcGxfY2xvc2VfY29uX3JlcSAqKSBza2JfcHV0KHNrYiwgd3JsZW4pOwotCW1lbXNldChyZXEsIDAsIHdybGVuKTsKLQlJTklUX1RQX1dSKHJlcSwgZXAtPmh3dGlkKTsKLQlPUENPREVfVElEKHJlcSkgPSBjcHVfdG9fYmUzMihNS19PUENPREVfVElEKENQTF9DTE9TRV9DT05fUkVRLAotCQkJCQkJICAgIGVwLT5od3RpZCkpOworCWN4Z2JfbWtfY2xvc2VfY29uX3JlcShza2IsIHdybGVuLCBlcC0+aHd0aWQsIGVwLT50eHFfaWR4LAorCQkJICAgICAgTlVMTCwgYXJwX2ZhaWx1cmVfZGlzY2FyZCk7CisKIAlyZXR1cm4gYzRpd19sMnRfc2VuZCgmZXAtPmNvbS5kZXYtPnJkZXYsIHNrYiwgZXAtPmwydCk7CiB9CiAKIHN0YXRpYyBpbnQgc2VuZF9hYm9ydChzdHJ1Y3QgYzRpd19lcCAqZXApCiB7Ci0Jc3RydWN0IGNwbF9hYm9ydF9yZXEgKnJlcTsKLQlpbnQgd3JsZW4gPSByb3VuZHVwKHNpemVvZiAqcmVxLCAxNik7CisJdTMyIHdybGVuID0gcm91bmR1cChzaXplb2Yoc3RydWN0IGNwbF9hYm9ydF9yZXEpLCAxNik7CiAJc3RydWN0IHNrX2J1ZmYgKnJlcV9za2IgPSBza2JfZGVxdWV1ZSgmZXAtPmNvbS5lcF9za2JfbGlzdCk7CiAKIAlQREJHKCIlcyBlcCAlcCB0aWQgJXVcbiIsIF9fZnVuY19fLCBlcCwgZXAtPmh3dGlkKTsKIAlpZiAoV0FSTl9PTighcmVxX3NrYikpCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jc2V0X3dyX3R4cShyZXFfc2tiLCBDUExfUFJJT1JJVFlfREFUQSwgZXAtPnR4cV9pZHgpOwotCXQ0X3NldF9hcnBfZXJyX2hhbmRsZXIocmVxX3NrYiwgZXAsIGFib3J0X2FycF9mYWlsdXJlKTsKLQlyZXEgPSAoc3RydWN0IGNwbF9hYm9ydF9yZXEgKilza2JfcHV0KHJlcV9za2IsIHdybGVuKTsKLQltZW1zZXQocmVxLCAwLCB3cmxlbik7Ci0JSU5JVF9UUF9XUihyZXEsIGVwLT5od3RpZCk7Ci0JT1BDT0RFX1RJRChyZXEpID0gY3B1X3RvX2JlMzIoTUtfT1BDT0RFX1RJRChDUExfQUJPUlRfUkVRLCBlcC0+aHd0aWQpKTsKLQlyZXEtPmNtZCA9IENQTF9BQk9SVF9TRU5EX1JTVDsKKwljeGdiX21rX2Fib3J0X3JlcShyZXFfc2tiLCB3cmxlbiwgZXAtPmh3dGlkLCBlcC0+dHhxX2lkeCwKKwkJCSAgZXAsIGFib3J0X2FycF9mYWlsdXJlKTsKKwogCXJldHVybiBjNGl3X2wydF9zZW5kKCZlcC0+Y29tLmRldi0+cmRldiwgcmVxX3NrYiwgZXAtPmwydCk7CiB9CiAKLXN0YXRpYyB2b2lkIGJlc3RfbXR1KGNvbnN0IHVuc2lnbmVkIHNob3J0ICptdHVzLCB1bnNpZ25lZCBzaG9ydCBtdHUsCi0JCSAgICAgdW5zaWduZWQgaW50ICppZHgsIGludCB1c2VfdHMsIGludCBpcHY2KQotewotCXVuc2lnbmVkIHNob3J0IGhkcl9zaXplID0gKGlwdjYgPwotCQkJCSAgIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgOgotCQkJCSAgIHNpemVvZihzdHJ1Y3QgaXBoZHIpKSArCi0JCQkJICBzaXplb2Yoc3RydWN0IHRjcGhkcikgKwotCQkJCSAgKHVzZV90cyA/Ci0JCQkJICAgcm91bmRfdXAoVENQT0xFTl9USU1FU1RBTVAsIDQpIDogMCk7Ci0JdW5zaWduZWQgc2hvcnQgZGF0YV9zaXplID0gbXR1IC0gaGRyX3NpemU7Ci0KLQljeGdiNF9iZXN0X2FsaWduZWRfbXR1KG10dXMsIGhkcl9zaXplLCBkYXRhX3NpemUsIDgsIGlkeCk7Ci19Ci0KIHN0YXRpYyBpbnQgc2VuZF9jb25uZWN0KHN0cnVjdCBjNGl3X2VwICplcCkKIHsKIAlzdHJ1Y3QgY3BsX2FjdF9vcGVuX3JlcSAqcmVxID0gTlVMTDsKQEAgLTc2OCw3ICs2NzksNyBAQAogCXU2NCBvcHQwOwogCXUzMiBvcHQyOwogCXVuc2lnbmVkIGludCBtdHVfaWR4OwotCWludCB3c2NhbGU7CisJdTMyIHdzY2FsZTsKIAlpbnQgd2luLCBzaXpldjQsIHNpemV2Niwgd3JsZW47CiAJc3RydWN0IHNvY2thZGRyX2luICpsYSA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikKIAkJCQkgJmVwLT5jb20ubG9jYWxfYWRkcjsKQEAgLTgxNSwxMCArNzI2LDEwIEBACiAJfQogCXNldF93cl90eHEoc2tiLCBDUExfUFJJT1JJVFlfU0VUVVAsIGVwLT5jdHJscV9pZHgpOwogCi0JYmVzdF9tdHUoZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5tdHVzLCBlcC0+bXR1LCAmbXR1X2lkeCwKLQkJIGVuYWJsZV90Y3BfdGltZXN0YW1wcywKLQkJIChBRl9JTkVUID09IGVwLT5jb20ucmVtb3RlX2FkZHIuc3NfZmFtaWx5KSA/IDAgOiAxKTsKLQl3c2NhbGUgPSBjb21wdXRlX3dzY2FsZShyY3Zfd2luKTsKKwljeGdiX2Jlc3RfbXR1KGVwLT5jb20uZGV2LT5yZGV2LmxsZGkubXR1cywgZXAtPm10dSwgJm10dV9pZHgsCisJCSAgICAgIGVuYWJsZV90Y3BfdGltZXN0YW1wcywKKwkJICAgICAgKGVwLT5jb20ucmVtb3RlX2FkZHIuc3NfZmFtaWx5ID09IEFGX0lORVQpID8gMCA6IDEpOworCXdzY2FsZSA9IGN4Z2JfY29tcHV0ZV93c2NhbGUocmN2X3dpbik7CiAKIAkvKgogCSAqIFNwZWNpZnkgdGhlIGxhcmdlc3Qgd2luZG93IHRoYXQgd2lsbCBmaXQgaW4gb3B0MC4gVGhlCkBAIC0xNDQ1LDkgKzEzNTYsOSBAQAogCiBzdGF0aWMgaW50IHVwZGF0ZV9yeF9jcmVkaXRzKHN0cnVjdCBjNGl3X2VwICplcCwgdTMyIGNyZWRpdHMpCiB7Ci0Jc3RydWN0IGNwbF9yeF9kYXRhX2FjayAqcmVxOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0JaW50IHdybGVuID0gcm91bmR1cChzaXplb2YgKnJlcSwgMTYpOworCXUzMiB3cmxlbiA9IHJvdW5kdXAoc2l6ZW9mKHN0cnVjdCBjcGxfcnhfZGF0YV9hY2spLCAxNik7CisJdTMyIGNyZWRpdF9kYWNrOwogCiAJUERCRygiJXMgZXAgJXAgdGlkICV1IGNyZWRpdHMgJXVcbiIsIF9fZnVuY19fLCBlcCwgZXAtPmh3dGlkLCBjcmVkaXRzKTsKIAlza2IgPSBnZXRfc2tiKE5VTEwsIHdybGVuLCBHRlBfS0VSTkVMKTsKQEAgLTE0NjQsMTUgKzEzNzUsMTIgQEAKIAlpZiAoZXAtPnJjdl93aW4gPiBSQ1ZfQlVGU0laX00gKiAxMDI0KQogCQljcmVkaXRzICs9IGVwLT5yY3Zfd2luIC0gUkNWX0JVRlNJWl9NICogMTAyNDsKIAotCXJlcSA9IChzdHJ1Y3QgY3BsX3J4X2RhdGFfYWNrICopIHNrYl9wdXQoc2tiLCB3cmxlbik7Ci0JbWVtc2V0KHJlcSwgMCwgd3JsZW4pOwotCUlOSVRfVFBfV1IocmVxLCBlcC0+aHd0aWQpOwotCU9QQ09ERV9USUQocmVxKSA9IGNwdV90b19iZTMyKE1LX09QQ09ERV9USUQoQ1BMX1JYX0RBVEFfQUNLLAotCQkJCQkJICAgIGVwLT5od3RpZCkpOwotCXJlcS0+Y3JlZGl0X2RhY2sgPSBjcHVfdG9fYmUzMihjcmVkaXRzIHwgUlhfRk9SQ0VfQUNLX0YgfAotCQkJCSAgICAgICBSWF9EQUNLX0NIQU5HRV9GIHwKLQkJCQkgICAgICAgUlhfREFDS19NT0RFX1YoZGFja19tb2RlKSk7Ci0Jc2V0X3dyX3R4cShza2IsIENQTF9QUklPUklUWV9BQ0ssIGVwLT5jdHJscV9pZHgpOworCWNyZWRpdF9kYWNrID0gY3JlZGl0cyB8IFJYX0ZPUkNFX0FDS19GIHwgUlhfREFDS19DSEFOR0VfRiB8CisJCSAgICAgIFJYX0RBQ0tfTU9ERV9WKGRhY2tfbW9kZSk7CisKKwljeGdiX21rX3J4X2RhdGFfYWNrKHNrYiwgd3JsZW4sIGVwLT5od3RpZCwgZXAtPmN0cmxxX2lkeCwKKwkJCSAgICBjcmVkaXRfZGFjayk7CisKIAljNGl3X29mbGRfc2VuZCgmZXAtPmNvbS5kZXYtPnJkZXYsIHNrYik7CiAJcmV0dXJuIGNyZWRpdHM7CiB9CkBAIC0xODI3LDggKzE3MzUsMTIgQEAKIAkJCQkoZXAtPm1wYV9wa3QgKyBzaXplb2YoKm1wYSkpOwogCQkJZXAtPmlyZCA9IG50b2hzKG1wYV92Ml9wYXJhbXMtPmlyZCkgJgogCQkJCU1QQV9WMl9JUkRfT1JEX01BU0s7CisJCQllcC0+aXJkID0gbWluX3QodTMyLCBlcC0+aXJkLAorCQkJCQljdXJfbWF4X3JlYWRfZGVwdGgoZXAtPmNvbS5kZXYpKTsKIAkJCWVwLT5vcmQgPSBudG9ocyhtcGFfdjJfcGFyYW1zLT5vcmQpICYKIAkJCQlNUEFfVjJfSVJEX09SRF9NQVNLOworCQkJZXAtPm9yZCA9IG1pbl90KHUzMiwgZXAtPm9yZCwKKwkJCQkJY3VyX21heF9yZWFkX2RlcHRoKGVwLT5jb20uZGV2KSk7CiAJCQlQREJHKCIlcyBpbml0aWF0b3IgaXJkICV1IG9yZCAldVxuIiwgX19mdW5jX18sIGVwLT5pcmQsCiAJCQkgICAgIGVwLT5vcmQpOwogCQkJaWYgKG50b2hzKG1wYV92Ml9wYXJhbXMtPmlyZCkgJiBNUEFfVjJfUEVFUjJQRUVSX01PREVMKQpAQCAtMTk2Niw3ICsxODc4LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBmd19vZmxkX2Nvbm5lY3Rpb25fd3IgKnJlcTsKIAl1bnNpZ25lZCBpbnQgbXR1X2lkeDsKLQlpbnQgd3NjYWxlOworCXUzMiB3c2NhbGU7CiAJc3RydWN0IHNvY2thZGRyX2luICpzaW47CiAJaW50IHdpbjsKIApAQCAtMTk5MSwxMCArMTkwMywxMCBAQAogCQkJaHRvbnMoRldfT0ZMRF9DT05ORUNUSU9OX1dSX0NQTFJYREFUQUFDS19GKTsKIAlyZXEtPnRjYi50eF9tYXggPSAoX19mb3JjZSBfX2JlMzIpIGppZmZpZXM7CiAJcmVxLT50Y2IucmN2X2FkdiA9IGh0b25zKDEpOwotCWJlc3RfbXR1KGVwLT5jb20uZGV2LT5yZGV2LmxsZGkubXR1cywgZXAtPm10dSwgJm10dV9pZHgsCi0JCSBlbmFibGVfdGNwX3RpbWVzdGFtcHMsCi0JCSAoQUZfSU5FVCA9PSBlcC0+Y29tLnJlbW90ZV9hZGRyLnNzX2ZhbWlseSkgPyAwIDogMSk7Ci0Jd3NjYWxlID0gY29tcHV0ZV93c2NhbGUocmN2X3dpbik7CisJY3hnYl9iZXN0X210dShlcC0+Y29tLmRldi0+cmRldi5sbGRpLm10dXMsIGVwLT5tdHUsICZtdHVfaWR4LAorCQkgICAgICBlbmFibGVfdGNwX3RpbWVzdGFtcHMsCisJCSAgICAgIChlcC0+Y29tLnJlbW90ZV9hZGRyLnNzX2ZhbWlseSA9PSBBRl9JTkVUKSA/IDAgOiAxKTsKKwl3c2NhbGUgPSBjeGdiX2NvbXB1dGVfd3NjYWxlKHJjdl93aW4pOwogCiAJLyoKIAkgKiBTcGVjaWZ5IHRoZSBsYXJnZXN0IHdpbmRvdyB0aGF0IHdpbGwgZml0IGluIG9wdDAuIFRoZQpAQCAtMjA0OCwxNSArMTk2MCw2IEBACiAJCXN0YXR1cyAhPSBDUExfRVJSX0NPTk5fRVhJU1QpOwogfQogCi0vKiBSZXR1cm5zIHdoZXRoZXIgYSBDUEwgc3RhdHVzIGNvbnZleXMgbmVnYXRpdmUgYWR2aWNlLgotICovCi1zdGF0aWMgaW50IGlzX25lZ19hZHYodW5zaWduZWQgaW50IHN0YXR1cykKLXsKLQlyZXR1cm4gc3RhdHVzID09IENQTF9FUlJfUlRYX05FR19BRFZJQ0UgfHwKLQkgICAgICAgc3RhdHVzID09IENQTF9FUlJfUEVSU0lTVF9ORUdfQURWSUNFIHx8Ci0JICAgICAgIHN0YXR1cyA9PSBDUExfRVJSX0tFRVBBTFZfTkVHX0FEVklDRTsKLX0KLQogc3RhdGljIGNoYXIgKm5lZ19hZHZfc3RyKHVuc2lnbmVkIGludCBzdGF0dXMpCiB7CiAJc3dpdGNoIChzdGF0dXMpIHsKQEAgLTIxMTMsOCArMjAxNiwxMCBAQAogCQl9CiAJCWVwLT5sMnQgPSBjeGdiNF9sMnRfZ2V0KGNkZXYtPnJkZXYubGxkaS5sMnQsCiAJCQkJCW4sIHBkZXYsIHJ0X3RvczJwcmlvcml0eSh0b3MpKTsKLQkJaWYgKCFlcC0+bDJ0KQorCQlpZiAoIWVwLT5sMnQpIHsKKwkJCWRldl9wdXQocGRldik7CiAJCQlnb3RvIG91dDsKKwkJfQogCQllcC0+bXR1ID0gcGRldi0+bXR1OwogCQllcC0+dHhfY2hhbiA9IGN4Z2I0X3BvcnRfY2hhbihwZGV2KTsKIAkJZXAtPnNtYWNfaWR4ID0gY3hnYjRfdHBfc210X2lkeChhZGFwdGVyX3R5cGUsCkBAIC0yMjEwLDE2ICsyMTE1LDIxIEBACiAKIAkvKiBmaW5kIGEgcm91dGUgKi8KIAlpZiAoZXAtPmNvbS5jbV9pZC0+bV9sb2NhbF9hZGRyLnNzX2ZhbWlseSA9PSBBRl9JTkVUKSB7Ci0JCWVwLT5kc3QgPSBmaW5kX3JvdXRlKGVwLT5jb20uZGV2LCBsYWRkci0+c2luX2FkZHIuc19hZGRyLAotCQkJCSAgICAgcmFkZHItPnNpbl9hZGRyLnNfYWRkciwgbGFkZHItPnNpbl9wb3J0LAotCQkJCSAgICAgcmFkZHItPnNpbl9wb3J0LCBlcC0+Y29tLmNtX2lkLT50b3MpOworCQllcC0+ZHN0ID0gY3hnYl9maW5kX3JvdXRlKCZlcC0+Y29tLmRldi0+cmRldi5sbGRpLCBnZXRfcmVhbF9kZXYsCisJCQkJCSAgbGFkZHItPnNpbl9hZGRyLnNfYWRkciwKKwkJCQkJICByYWRkci0+c2luX2FkZHIuc19hZGRyLAorCQkJCQkgIGxhZGRyLT5zaW5fcG9ydCwKKwkJCQkJICByYWRkci0+c2luX3BvcnQsIGVwLT5jb20uY21faWQtPnRvcyk7CiAJCWlwdHlwZSA9IDQ7CiAJCXJhID0gKF9fdTggKikmcmFkZHItPnNpbl9hZGRyOwogCX0gZWxzZSB7Ci0JCWVwLT5kc3QgPSBmaW5kX3JvdXRlNihlcC0+Y29tLmRldiwgbGFkZHI2LT5zaW42X2FkZHIuczZfYWRkciwKLQkJCQkgICAgICByYWRkcjYtPnNpbjZfYWRkci5zNl9hZGRyLAotCQkJCSAgICAgIGxhZGRyNi0+c2luNl9wb3J0LCByYWRkcjYtPnNpbjZfcG9ydCwgMCwKLQkJCQkgICAgICByYWRkcjYtPnNpbjZfc2NvcGVfaWQpOworCQllcC0+ZHN0ID0gY3hnYl9maW5kX3JvdXRlNigmZXAtPmNvbS5kZXYtPnJkZXYubGxkaSwKKwkJCQkJICAgZ2V0X3JlYWxfZGV2LAorCQkJCQkgICBsYWRkcjYtPnNpbjZfYWRkci5zNl9hZGRyLAorCQkJCQkgICByYWRkcjYtPnNpbjZfYWRkci5zNl9hZGRyLAorCQkJCQkgICBsYWRkcjYtPnNpbjZfcG9ydCwKKwkJCQkJICAgcmFkZHI2LT5zaW42X3BvcnQsIDAsCisJCQkJCSAgIHJhZGRyNi0+c2luNl9zY29wZV9pZCk7CiAJCWlwdHlwZSA9IDY7CiAJCXJhID0gKF9fdTggKikmcmFkZHI2LT5zaW42X2FkZHI7CiAJfQpAQCAtMjI5MSw3ICsyMjAxLDcgQEAKIAlQREJHKCIlcyBlcCAlcCBhdGlkICV1IHN0YXR1cyAldSBlcnJubyAlZFxuIiwgX19mdW5jX18sIGVwLCBhdGlkLAogCSAgICAgc3RhdHVzLCBzdGF0dXMyZXJybm8oc3RhdHVzKSk7CiAKLQlpZiAoaXNfbmVnX2FkdihzdGF0dXMpKSB7CisJaWYgKGN4Z2JfaXNfbmVnX2FkdihzdGF0dXMpKSB7CiAJCVBEQkcoIiVzIENvbm5lY3Rpb24gcHJvYmxlbXMgZm9yIGF0aWQgJXUgc3RhdHVzICV1ICglcylcbiIsCiAJCSAgICAgX19mdW5jX18sIGF0aWQsIHN0YXR1cywgbmVnX2Fkdl9zdHIoc3RhdHVzKSk7CiAJCWVwLT5zdGF0cy5jb25uZWN0X25lZ19hZHYrKzsKQEAgLTI0MTgsNyArMjMyOCw3IEBACiAJdW5zaWduZWQgaW50IG10dV9pZHg7CiAJdTY0IG9wdDA7CiAJdTMyIG9wdDI7Ci0JaW50IHdzY2FsZTsKKwl1MzIgd3NjYWxlOwogCXN0cnVjdCBjcGxfdDVfcGFzc19hY2NlcHRfcnBsICpycGw1ID0gTlVMTDsKIAlpbnQgd2luOwogCWVudW0gY2hpcF90eXBlIGFkYXB0ZXJfdHlwZSA9IGVwLT5jb20uZGV2LT5yZGV2LmxsZGkuYWRhcHRlcl90eXBlOwpAQCAtMjQzOSwxMCArMjM0OSwxMCBAQAogCU9QQ09ERV9USUQocnBsKSA9IGNwdV90b19iZTMyKE1LX09QQ09ERV9USUQoQ1BMX1BBU1NfQUNDRVBUX1JQTCwKIAkJCQkJCSAgICBlcC0+aHd0aWQpKTsKIAotCWJlc3RfbXR1KGVwLT5jb20uZGV2LT5yZGV2LmxsZGkubXR1cywgZXAtPm10dSwgJm10dV9pZHgsCi0JCSBlbmFibGVfdGNwX3RpbWVzdGFtcHMgJiYgcmVxLT50Y3BvcHQudHN0YW1wLAotCQkgKEFGX0lORVQgPT0gZXAtPmNvbS5yZW1vdGVfYWRkci5zc19mYW1pbHkpID8gMCA6IDEpOwotCXdzY2FsZSA9IGNvbXB1dGVfd3NjYWxlKHJjdl93aW4pOworCWN4Z2JfYmVzdF9tdHUoZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5tdHVzLCBlcC0+bXR1LCAmbXR1X2lkeCwKKwkJICAgICAgZW5hYmxlX3RjcF90aW1lc3RhbXBzICYmIHJlcS0+dGNwb3B0LnRzdGFtcCwKKwkJICAgICAgKGVwLT5jb20ucmVtb3RlX2FkZHIuc3NfZmFtaWx5ID09IEFGX0lORVQpID8gMCA6IDEpOworCXdzY2FsZSA9IGN4Z2JfY29tcHV0ZV93c2NhbGUocmN2X3dpbik7CiAKIAkvKgogCSAqIFNwZWNpZnkgdGhlIGxhcmdlc3Qgd2luZG93IHRoYXQgd2lsbCBmaXQgaW4gb3B0MC4gVGhlCkBAIC0yNTE0LDQyICsyNDI0LDYgQEAKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyB2b2lkIGdldF80dHVwbGUoc3RydWN0IGNwbF9wYXNzX2FjY2VwdF9yZXEgKnJlcSwgZW51bSBjaGlwX3R5cGUgdHlwZSwKLQkJICAgICAgIGludCAqaXB0eXBlLCBfX3U4ICpsb2NhbF9pcCwgX191OCAqcGVlcl9pcCwKLQkJICAgICAgIF9fYmUxNiAqbG9jYWxfcG9ydCwgX19iZTE2ICpwZWVyX3BvcnQpCi17Ci0JaW50IGV0aF9sZW4gPSAoQ0hFTFNJT19DSElQX1ZFUlNJT04odHlwZSkgPD0gQ0hFTFNJT19UNSkgPwotCQkgICAgICBFVEhfSERSX0xFTl9HKGJlMzJfdG9fY3B1KHJlcS0+aGRyX2xlbikpIDoKLQkJICAgICAgVDZfRVRIX0hEUl9MRU5fRyhiZTMyX3RvX2NwdShyZXEtPmhkcl9sZW4pKTsKLQlpbnQgaXBfbGVuID0gKENIRUxTSU9fQ0hJUF9WRVJTSU9OKHR5cGUpIDw9IENIRUxTSU9fVDUpID8KLQkJICAgICBJUF9IRFJfTEVOX0coYmUzMl90b19jcHUocmVxLT5oZHJfbGVuKSkgOgotCQkgICAgIFQ2X0lQX0hEUl9MRU5fRyhiZTMyX3RvX2NwdShyZXEtPmhkcl9sZW4pKTsKLQlzdHJ1Y3QgaXBoZHIgKmlwID0gKHN0cnVjdCBpcGhkciAqKSgodTggKikocmVxICsgMSkgKyBldGhfbGVuKTsKLQlzdHJ1Y3QgaXB2NmhkciAqaXA2ID0gKHN0cnVjdCBpcHY2aGRyICopKCh1OCAqKShyZXEgKyAxKSArIGV0aF9sZW4pOwotCXN0cnVjdCB0Y3BoZHIgKnRjcCA9IChzdHJ1Y3QgdGNwaGRyICopCi0JCQkgICAgICgodTggKikocmVxICsgMSkgKyBldGhfbGVuICsgaXBfbGVuKTsKLQotCWlmIChpcC0+dmVyc2lvbiA9PSA0KSB7Ci0JCVBEQkcoIiVzIHNhZGRyIDB4JXggZGFkZHIgMHgleCBzcG9ydCAldSBkcG9ydCAldVxuIiwgX19mdW5jX18sCi0JCSAgICAgbnRvaGwoaXAtPnNhZGRyKSwgbnRvaGwoaXAtPmRhZGRyKSwgbnRvaHModGNwLT5zb3VyY2UpLAotCQkgICAgIG50b2hzKHRjcC0+ZGVzdCkpOwotCQkqaXB0eXBlID0gNDsKLQkJbWVtY3B5KHBlZXJfaXAsICZpcC0+c2FkZHIsIDQpOwotCQltZW1jcHkobG9jYWxfaXAsICZpcC0+ZGFkZHIsIDQpOwotCX0gZWxzZSB7Ci0JCVBEQkcoIiVzIHNhZGRyICVwSTYgZGFkZHIgJXBJNiBzcG9ydCAldSBkcG9ydCAldVxuIiwgX19mdW5jX18sCi0JCSAgICAgaXA2LT5zYWRkci5zNl9hZGRyLCBpcDYtPmRhZGRyLnM2X2FkZHIsIG50b2hzKHRjcC0+c291cmNlKSwKLQkJICAgICBudG9ocyh0Y3AtPmRlc3QpKTsKLQkJKmlwdHlwZSA9IDY7Ci0JCW1lbWNweShwZWVyX2lwLCBpcDYtPnNhZGRyLnM2X2FkZHIsIDE2KTsKLQkJbWVtY3B5KGxvY2FsX2lwLCBpcDYtPmRhZGRyLnM2X2FkZHIsIDE2KTsKLQl9Ci0JKnBlZXJfcG9ydCA9IHRjcC0+c291cmNlOwotCSpsb2NhbF9wb3J0ID0gdGNwLT5kZXN0OwotCi0JcmV0dXJuOwotfQotCiBzdGF0aWMgaW50IHBhc3NfYWNjZXB0X3JlcShzdHJ1Y3QgYzRpd19kZXYgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgYzRpd19lcCAqY2hpbGRfZXAgPSBOVUxMLCAqcGFyZW50X2VwOwpAQCAtMjU3OCw4ICsyNDUyLDggQEAKIAkJZ290byByZWplY3Q7CiAJfQogCi0JZ2V0XzR0dXBsZShyZXEsIHBhcmVudF9lcC0+Y29tLmRldi0+cmRldi5sbGRpLmFkYXB0ZXJfdHlwZSwgJmlwdHlwZSwKLQkJICAgbG9jYWxfaXAsIHBlZXJfaXAsICZsb2NhbF9wb3J0LCAmcGVlcl9wb3J0KTsKKwljeGdiX2dldF80dHVwbGUocmVxLCBwYXJlbnRfZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5hZGFwdGVyX3R5cGUsCisJCQkmaXB0eXBlLCBsb2NhbF9pcCwgcGVlcl9pcCwgJmxvY2FsX3BvcnQsICZwZWVyX3BvcnQpOwogCiAJLyogRmluZCBvdXRwdXQgcm91dGUgKi8KIAlpZiAoaXB0eXBlID09IDQpICB7CkBAIC0yNTg3LDE4ICsyNDYxLDE5IEBACiAJCSAgICAgLCBfX2Z1bmNfXywgcGFyZW50X2VwLCBod3RpZCwKIAkJICAgICBsb2NhbF9pcCwgcGVlcl9pcCwgbnRvaHMobG9jYWxfcG9ydCksCiAJCSAgICAgbnRvaHMocGVlcl9wb3J0KSwgcGVlcl9tc3MpOwotCQlkc3QgPSBmaW5kX3JvdXRlKGRldiwgKihfX2JlMzIgKilsb2NhbF9pcCwgKihfX2JlMzIgKilwZWVyX2lwLAotCQkJCSBsb2NhbF9wb3J0LCBwZWVyX3BvcnQsCi0JCQkJIHRvcyk7CisJCWRzdCA9IGN4Z2JfZmluZF9yb3V0ZSgmZGV2LT5yZGV2LmxsZGksIGdldF9yZWFsX2RldiwKKwkJCQkgICAgICAqKF9fYmUzMiAqKWxvY2FsX2lwLCAqKF9fYmUzMiAqKXBlZXJfaXAsCisJCQkJICAgICAgbG9jYWxfcG9ydCwgcGVlcl9wb3J0LCB0b3MpOwogCX0gZWxzZSB7CiAJCVBEQkcoIiVzIHBhcmVudCBlcCAlcCBod3RpZCAldSBsYWRkciAlcEk2IHJhZGRyICVwSTYgbHBvcnQgJWQgcnBvcnQgJWQgcGVlcl9tc3MgJWRcbiIKIAkJICAgICAsIF9fZnVuY19fLCBwYXJlbnRfZXAsIGh3dGlkLAogCQkgICAgIGxvY2FsX2lwLCBwZWVyX2lwLCBudG9ocyhsb2NhbF9wb3J0KSwKIAkJICAgICBudG9ocyhwZWVyX3BvcnQpLCBwZWVyX21zcyk7Ci0JCWRzdCA9IGZpbmRfcm91dGU2KGRldiwgbG9jYWxfaXAsIHBlZXJfaXAsIGxvY2FsX3BvcnQsIHBlZXJfcG9ydCwKLQkJCQkgIFBBU1NfT1BFTl9UT1NfRyhudG9obChyZXEtPnRvc19zdGlkKSksCi0JCQkJICAoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikKLQkJCQkgICZwYXJlbnRfZXAtPmNvbS5sb2NhbF9hZGRyKS0+c2luNl9zY29wZV9pZCk7CisJCWRzdCA9IGN4Z2JfZmluZF9yb3V0ZTYoJmRldi0+cmRldi5sbGRpLCBnZXRfcmVhbF9kZXYsCisJCQkJbG9jYWxfaXAsIHBlZXJfaXAsIGxvY2FsX3BvcnQsIHBlZXJfcG9ydCwKKwkJCQlQQVNTX09QRU5fVE9TX0cobnRvaGwocmVxLT50b3Nfc3RpZCkpLAorCQkJCSgoc3RydWN0IHNvY2thZGRyX2luNiAqKQorCQkJCSAmcGFyZW50X2VwLT5jb20ubG9jYWxfYWRkciktPnNpbjZfc2NvcGVfaWQpOwogCX0KIAlpZiAoIWRzdCkgewogCQlwcmludGsoS0VSTl9FUlIgTU9EICIlcyAtIGZhaWxlZCB0byBmaW5kIGRzdCBlbnRyeSFcbiIsCkBAIC0yODMxLDE4ICsyNzA2LDE4IEBACiB7CiAJc3RydWN0IGNwbF9hYm9ydF9yZXFfcnNzICpyZXEgPSBjcGxoZHIoc2tiKTsKIAlzdHJ1Y3QgYzRpd19lcCAqZXA7Ci0Jc3RydWN0IGNwbF9hYm9ydF9ycGwgKnJwbDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqcnBsX3NrYjsKIAlzdHJ1Y3QgYzRpd19xcF9hdHRyaWJ1dGVzIGF0dHJzOwogCWludCByZXQ7CiAJaW50IHJlbGVhc2UgPSAwOwogCXVuc2lnbmVkIGludCB0aWQgPSBHRVRfVElEKHJlcSk7CisJdTMyIGxlbiA9IHJvdW5kdXAoc2l6ZW9mKHN0cnVjdCBjcGxfYWJvcnRfcnBsKSwgMTYpOwogCiAJZXAgPSBnZXRfZXBfZnJvbV90aWQoZGV2LCB0aWQpOwogCWlmICghZXApCiAJCXJldHVybiAwOwogCi0JaWYgKGlzX25lZ19hZHYocmVxLT5zdGF0dXMpKSB7CisJaWYgKGN4Z2JfaXNfbmVnX2FkdihyZXEtPnN0YXR1cykpIHsKIAkJUERCRygiJXMgTmVnYXRpdmUgYWR2aWNlIG9uIGFib3J0LSB0aWQgJXUgc3RhdHVzICVkICglcylcbiIsCiAJCSAgICAgX19mdW5jX18sIGVwLT5od3RpZCwgcmVxLT5zdGF0dXMsCiAJCSAgICAgbmVnX2Fkdl9zdHIocmVxLT5zdGF0dXMpKTsKQEAgLTI5MzUsMTEgKzI4MTAsOSBAQAogCQlyZWxlYXNlID0gMTsKIAkJZ290byBvdXQ7CiAJfQotCXNldF93cl90eHEoc2tiLCBDUExfUFJJT1JJVFlfREFUQSwgZXAtPnR4cV9pZHgpOwotCXJwbCA9IChzdHJ1Y3QgY3BsX2Fib3J0X3JwbCAqKSBza2JfcHV0KHJwbF9za2IsIHNpemVvZigqcnBsKSk7Ci0JSU5JVF9UUF9XUihycGwsIGVwLT5od3RpZCk7Ci0JT1BDT0RFX1RJRChycGwpID0gY3B1X3RvX2JlMzIoTUtfT1BDT0RFX1RJRChDUExfQUJPUlRfUlBMLCBlcC0+aHd0aWQpKTsKLQlycGwtPmNtZCA9IENQTF9BQk9SVF9OT19SU1Q7CisKKwljeGdiX21rX2Fib3J0X3JwbChycGxfc2tiLCBsZW4sIGVwLT5od3RpZCwgZXAtPnR4cV9pZHgpOworCiAJYzRpd19vZmxkX3NlbmQoJmVwLT5jb20uZGV2LT5yZGV2LCBycGxfc2tiKTsKIG91dDoKIAlpZiAocmVsZWFzZSkKQEAgLTMxMzYsNyArMzAwOSw3IEBACiAJaWYgKGVwLT5tcGFfYXR0ci52ZXJzaW9uID09IDIgJiYgZXAtPm1wYV9hdHRyLmVuaGFuY2VkX3JkbWFfY29ubikgewogCQlpZiAoY29ubl9wYXJhbS0+b3JkID4gZXAtPmlyZCkgewogCQkJaWYgKFJFTEFYRURfSVJEX05FR09USUFUSU9OKSB7Ci0JCQkJZXAtPm9yZCA9IGVwLT5pcmQ7CisJCQkJY29ubl9wYXJhbS0+b3JkID0gZXAtPmlyZDsKIAkJCX0gZWxzZSB7CiAJCQkJZXAtPmlyZCA9IGNvbm5fcGFyYW0tPmlyZDsKIAkJCQllcC0+b3JkID0gY29ubl9wYXJhbS0+b3JkOwpAQCAtMzM3MSw5ICszMjQ0LDExIEBACiAJCVBEQkcoIiVzIHNhZGRyICVwSTQgc3BvcnQgMHgleCByYWRkciAlcEk0IHJwb3J0IDB4JXhcbiIsCiAJCSAgICAgX19mdW5jX18sICZsYWRkci0+c2luX2FkZHIsIG50b2hzKGxhZGRyLT5zaW5fcG9ydCksCiAJCSAgICAgcmEsIG50b2hzKHJhZGRyLT5zaW5fcG9ydCkpOwotCQllcC0+ZHN0ID0gZmluZF9yb3V0ZShkZXYsIGxhZGRyLT5zaW5fYWRkci5zX2FkZHIsCi0JCQkJICAgICByYWRkci0+c2luX2FkZHIuc19hZGRyLCBsYWRkci0+c2luX3BvcnQsCi0JCQkJICAgICByYWRkci0+c2luX3BvcnQsIGNtX2lkLT50b3MpOworCQllcC0+ZHN0ID0gY3hnYl9maW5kX3JvdXRlKCZkZXYtPnJkZXYubGxkaSwgZ2V0X3JlYWxfZGV2LAorCQkJCQkgIGxhZGRyLT5zaW5fYWRkci5zX2FkZHIsCisJCQkJCSAgcmFkZHItPnNpbl9hZGRyLnNfYWRkciwKKwkJCQkJICBsYWRkci0+c2luX3BvcnQsCisJCQkJCSAgcmFkZHItPnNpbl9wb3J0LCBjbV9pZC0+dG9zKTsKIAl9IGVsc2UgewogCQlpcHR5cGUgPSA2OwogCQlyYSA9IChfX3U4ICopJnJhZGRyNi0+c2luNl9hZGRyOwpAQCAtMzM5MiwxMCArMzI2NywxMiBAQAogCQkgICAgIF9fZnVuY19fLCBsYWRkcjYtPnNpbjZfYWRkci5zNl9hZGRyLAogCQkgICAgIG50b2hzKGxhZGRyNi0+c2luNl9wb3J0KSwKIAkJICAgICByYWRkcjYtPnNpbjZfYWRkci5zNl9hZGRyLCBudG9ocyhyYWRkcjYtPnNpbjZfcG9ydCkpOwotCQllcC0+ZHN0ID0gZmluZF9yb3V0ZTYoZGV2LCBsYWRkcjYtPnNpbjZfYWRkci5zNl9hZGRyLAotCQkJCSAgICAgIHJhZGRyNi0+c2luNl9hZGRyLnM2X2FkZHIsCi0JCQkJICAgICAgbGFkZHI2LT5zaW42X3BvcnQsIHJhZGRyNi0+c2luNl9wb3J0LCAwLAotCQkJCSAgICAgIHJhZGRyNi0+c2luNl9zY29wZV9pZCk7CisJCWVwLT5kc3QgPSBjeGdiX2ZpbmRfcm91dGU2KCZkZXYtPnJkZXYubGxkaSwgZ2V0X3JlYWxfZGV2LAorCQkJCQkgICBsYWRkcjYtPnNpbjZfYWRkci5zNl9hZGRyLAorCQkJCQkgICByYWRkcjYtPnNpbjZfYWRkci5zNl9hZGRyLAorCQkJCQkgICBsYWRkcjYtPnNpbjZfcG9ydCwKKwkJCQkJICAgcmFkZHI2LT5zaW42X3BvcnQsIDAsCisJCQkJCSAgIHJhZGRyNi0+c2luNl9zY29wZV9pZCk7CiAJfQogCWlmICghZXAtPmRzdCkgewogCQlwcmludGsoS0VSTl9FUlIgTU9EICIlcyAtIGNhbm5vdCBmaW5kIHJvdXRlLlxuIiwgX19mdW5jX18pOwpAQCAtNDAzNyw4ICszOTE0LDkgQEAKIAkgICAgIG50b2hsKGlwaC0+ZGFkZHIpLCBudG9ocyh0Y3BoLT5kZXN0KSwgbnRvaGwoaXBoLT5zYWRkciksCiAJICAgICBudG9ocyh0Y3BoLT5zb3VyY2UpLCBpcGgtPnRvcyk7CiAKLQlkc3QgPSBmaW5kX3JvdXRlKGRldiwgaXBoLT5kYWRkciwgaXBoLT5zYWRkciwgdGNwaC0+ZGVzdCwgdGNwaC0+c291cmNlLAotCQkJIGlwaC0+dG9zKTsKKwlkc3QgPSBjeGdiX2ZpbmRfcm91dGUoJmRldi0+cmRldi5sbGRpLCBnZXRfcmVhbF9kZXYsCisJCQkgICAgICBpcGgtPmRhZGRyLCBpcGgtPnNhZGRyLCB0Y3BoLT5kZXN0LAorCQkJICAgICAgdGNwaC0+c291cmNlLCBpcGgtPnRvcyk7CiAJaWYgKCFkc3QpIHsKIAkJcHJfZXJyKCIlcyAtIGZhaWxlZCB0byBmaW5kIGRzdCBlbnRyeSFcbiIsCiAJCSAgICAgICBfX2Z1bmNfXyk7CkBAIC00MzEzLDcgKzQxOTEsNyBAQAogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIDA7CiAJfQotCWlmIChpc19uZWdfYWR2KHJlcS0+c3RhdHVzKSkgeworCWlmIChjeGdiX2lzX25lZ19hZHYocmVxLT5zdGF0dXMpKSB7CiAJCVBEQkcoIiVzIE5lZ2F0aXZlIGFkdmljZSBvbiBhYm9ydC0gdGlkICV1IHN0YXR1cyAlZCAoJXMpXG4iLAogCQkgICAgIF9fZnVuY19fLCBlcC0+aHd0aWQsIHJlcS0+c3RhdHVzLAogCQkgICAgIG5lZ19hZHZfc3RyKHJlcS0+c3RhdHVzKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY3EuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jcS5jCmluZGV4IDgxMmFiNzIuLmFjOTI2YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jcS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jcS5jCkBAIC0xMDE2LDE1ICsxMDE2LDE1IEBACiBpbnQgYzRpd19hcm1fY3Eoc3RydWN0IGliX2NxICppYmNxLCBlbnVtIGliX2NxX25vdGlmeV9mbGFncyBmbGFncykKIHsKIAlzdHJ1Y3QgYzRpd19jcSAqY2hwOwotCWludCByZXQ7CisJaW50IHJldCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnOwogCiAJY2hwID0gdG9fYzRpd19jcShpYmNxKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2hwLT5sb2NrLCBmbGFnKTsKLQlyZXQgPSB0NF9hcm1fY3EoJmNocC0+Y3EsCi0JCQkoZmxhZ3MgJiBJQl9DUV9TT0xJQ0lURURfTUFTSykgPT0gSUJfQ1FfU09MSUNJVEVEKTsKKwl0NF9hcm1fY3EoJmNocC0+Y3EsCisJCSAgKGZsYWdzICYgSUJfQ1FfU09MSUNJVEVEX01BU0spID09IElCX0NRX1NPTElDSVRFRCk7CisJaWYgKGZsYWdzICYgSUJfQ1FfUkVQT1JUX01JU1NFRF9FVkVOVFMpCisJCXJldCA9IHQ0X2NxX25vdGVtcHR5KCZjaHAtPmNxKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaHAtPmxvY2ssIGZsYWcpOwotCWlmIChyZXQgJiYgIShmbGFncyAmIElCX0NRX1JFUE9SVF9NSVNTRURfRVZFTlRTKSkKLQkJcmV0ID0gMDsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2RldmljZS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2RldmljZS5jCmluZGV4IDA3MWQ3MzMuLjkzZTNkMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9kZXZpY2UuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvZGV2aWNlLmMKQEAgLTg3Miw5ICs4NzIsMTMgQEAKIHN0YXRpYyB2b2lkIGM0aXdfZGVhbGxvYyhzdHJ1Y3QgdWxkX2N0eCAqY3R4KQogewogCWM0aXdfcmRldl9jbG9zZSgmY3R4LT5kZXYtPnJkZXYpOworCVdBUk5fT05fT05DRSghaWRyX2lzX2VtcHR5KCZjdHgtPmRldi0+Y3FpZHIpKTsKIAlpZHJfZGVzdHJveSgmY3R4LT5kZXYtPmNxaWRyKTsKKwlXQVJOX09OX09OQ0UoIWlkcl9pc19lbXB0eSgmY3R4LT5kZXYtPnFwaWRyKSk7CiAJaWRyX2Rlc3Ryb3koJmN0eC0+ZGV2LT5xcGlkcik7CisJV0FSTl9PTl9PTkNFKCFpZHJfaXNfZW1wdHkoJmN0eC0+ZGV2LT5tbWlkcikpOwogCWlkcl9kZXN0cm95KCZjdHgtPmRldi0+bW1pZHIpOworCXdhaXRfZXZlbnQoY3R4LT5kZXYtPndhaXQsIGlkcl9pc19lbXB0eSgmY3R4LT5kZXYtPmh3dGlkX2lkcikpOwogCWlkcl9kZXN0cm95KCZjdHgtPmRldi0+aHd0aWRfaWRyKTsKIAlpZHJfZGVzdHJveSgmY3R4LT5kZXYtPnN0aWRfaWRyKTsKIAlpZHJfZGVzdHJveSgmY3R4LT5kZXYtPmF0aWRfaWRyKTsKQEAgLTk5Miw2ICs5OTYsNyBAQAogCW11dGV4X2luaXQoJmRldnAtPnJkZXYuc3RhdHMubG9jayk7CiAJbXV0ZXhfaW5pdCgmZGV2cC0+ZGJfbXV0ZXgpOwogCUlOSVRfTElTVF9IRUFEKCZkZXZwLT5kYl9mY19saXN0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXZwLT53YWl0KTsKIAlkZXZwLT5hdmFpbF9pcmQgPSBkZXZwLT5yZGV2LmxsZGkubWF4X2lyZF9hZGFwdGVyOwogCiAJaWYgKGM0aXdfZGVidWdmc19yb290KSB7CkBAIC0xNDc1LDYgKzE0ODAsMTAgQEAKIAogc3RhdGljIHN0cnVjdCBjeGdiNF91bGRfaW5mbyBjNGl3X3VsZF9pbmZvID0gewogCS5uYW1lID0gRFJWX05BTUUsCisJLm5yeHEgPSBNQVhfVUxEX1FTRVRTLAorCS5yeHFfc2l6ZSA9IDUxMSwKKwkuY2lxID0gdHJ1ZSwKKwkubHJvID0gZmFsc2UsCiAJLmFkZCA9IGM0aXdfdWxkX2FkZCwKIAkucnhfaGFuZGxlciA9IGM0aXdfdWxkX3J4X2hhbmRsZXIsCiAJLnN0YXRlX2NoYW5nZSA9IGM0aXdfdWxkX3N0YXRlX2NoYW5nZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9pd19jeGdiNC5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2l3X2N4Z2I0LmgKaW5kZXggYWE0N2UwYS4uY2RjZjNlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2l3X2N4Z2I0LmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2l3X2N4Z2I0LmgKQEAgLTI2Myw2ICsyNjMsNyBAQAogCXN0cnVjdCBpZHIgc3RpZF9pZHI7CiAJc3RydWN0IGxpc3RfaGVhZCBkYl9mY19saXN0OwogCXUzMiBhdmFpbF9pcmQ7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGM0aXdfZGV2ICp0b19jNGl3X2RldihzdHJ1Y3QgaWJfZGV2aWNlICppYmRldikKQEAgLTg4MSwxNSArODgyLDYgQEAKIAlyZXR1cm4gY21faWQtPnByb3ZpZGVyX2RhdGE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGNvbXB1dGVfd3NjYWxlKGludCB3aW4pCi17Ci0JaW50IHdzY2FsZSA9IDA7Ci0KLQl3aGlsZSAod3NjYWxlIDwgMTQgJiYgKDY1NTM1PDx3c2NhbGUpIDwgd2luKQotCQl3c2NhbGUrKzsKLQlyZXR1cm4gd3NjYWxlOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBvY3FwX3N1cHBvcnRlZChjb25zdCBzdHJ1Y3QgY3hnYjRfbGxkX2luZm8gKmluZm9wKQogewogI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChDT05GSUdfUFBDNjQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvcXAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9xcC5jCmluZGV4IGVkYjExNzIuLjY5MDQzNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9xcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9xcC5jCkBAIC02ODMsNyArNjgzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBfZnJlZV9xcChzdHJ1Y3Qga3JlZiAqa3JlZikKK3N0YXRpYyB2b2lkIF9mcmVlX3FwKHN0cnVjdCBrcmVmICprcmVmKQogewogCXN0cnVjdCBjNGl3X3FwICpxaHA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC90NC5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L3Q0LmgKaW5kZXggNjEyNmJiZS4uMDIxNzNmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L3Q0LmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L3Q0LmgKQEAgLTYzNCw2ICs2MzQsMTEgQEAKIAlyZXR1cm4gKENRRV9HRU5CSVQoY3FlKSA9PSBjcS0+Z2VuKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgdDRfY3Ffbm90ZW1wdHkoc3RydWN0IHQ0X2NxICpjcSkKK3sKKwlyZXR1cm4gY3EtPnN3X2luX3VzZSB8fCB0NF92YWxpZF9jcWUoY3EsICZjcS0+cXVldWVbY3EtPmNpZHhdKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgdDRfbmV4dF9od19jcWUoc3RydWN0IHQ0X2NxICpjcSwgc3RydWN0IHQ0X2NxZSAqKmNxZSkKIHsKIAlpbnQgcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvYWZmaW5pdHkuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2FmZmluaXR5LmMKaW5kZXggNzk1NzVlZS4uYTI2YTlhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvYWZmaW5pdHkuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9hZmZpbml0eS5jCkBAIC00Nyw3ICs0Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvdG9wb2xvZ3kuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCiAjaW5jbHVkZSAiaGZpLmgiCiAjaW5jbHVkZSAiYWZmaW5pdHkuaCIKQEAgLTU2LDcgKzU2LDcgQEAKIAogc3RydWN0IGhmaTFfYWZmaW5pdHlfbm9kZV9saXN0IG5vZGVfYWZmaW5pdHkgPSB7CiAJLmxpc3QgPSBMSVNUX0hFQURfSU5JVChub2RlX2FmZmluaXR5Lmxpc3QpLAotCS5sb2NrID0gX19TUElOX0xPQ0tfVU5MT0NLRUQoJm5vZGVfYWZmaW5pdHkubG9jayksCisJLmxvY2sgPSBfX01VVEVYX0lOSVRJQUxJWkVSKG5vZGVfYWZmaW5pdHkubG9jaykKIH07CiAKIC8qIE5hbWUgb2YgSVJRIHR5cGVzLCBpbmRleGVkIGJ5IGVudW0gaXJxX3R5cGUgKi8KQEAgLTE2MCwxNCArMTYwLDE0IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqcTsKIAlzdHJ1Y3QgaGZpMV9hZmZpbml0eV9ub2RlICplbnRyeTsKIAotCXNwaW5fbG9jaygmbm9kZV9hZmZpbml0eS5sb2NrKTsKKwltdXRleF9sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHEsICZub2RlX2FmZmluaXR5Lmxpc3QpIHsKIAkJZW50cnkgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IGhmaTFfYWZmaW5pdHlfbm9kZSwKIAkJCQkgICBsaXN0KTsKIAkJbGlzdF9kZWwocG9zKTsKIAkJa2ZyZWUoZW50cnkpOwogCX0KLQlzcGluX3VubG9jaygmbm9kZV9hZmZpbml0eS5sb2NrKTsKKwltdXRleF91bmxvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAJa2ZyZWUoaGZpMV9wZXJfbm9kZV9jbnRyKTsKIH0KIApAQCAtMjM0LDkgKzIzNCw4IEBACiAJaWYgKGNwdW1hc2tfZmlyc3QobG9jYWxfbWFzaykgPj0gbnJfY3B1X2lkcykKIAkJbG9jYWxfbWFzayA9IHRvcG9sb2d5X2NvcmVfY3B1bWFzaygwKTsKIAotCXNwaW5fbG9jaygmbm9kZV9hZmZpbml0eS5sb2NrKTsKKwltdXRleF9sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogCWVudHJ5ID0gbm9kZV9hZmZpbml0eV9sb29rdXAoZGQtPm5vZGUpOwotCXNwaW5fdW5sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogCiAJLyoKIAkgKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRoaXMgTlVNQSBub2RlJ3MgYWZmaW5pdHkgaXMgdXNlZCwKQEAgLTI0Nyw2ICsyNDYsNyBAQAogCQlpZiAoIWVudHJ5KSB7CiAJCQlkZF9kZXZfZXJyKGRkLAogCQkJCSAgICJVbmFibGUgdG8gYWxsb2NhdGUgZ2xvYmFsIGFmZmluaXR5IG5vZGVcbiIpOworCQkJbXV0ZXhfdW5sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAkJaW5pdF9jcHVfbWFza19zZXQoJmVudHJ5LT5kZWZfaW50cik7CkBAIC0zMDMsMTUgKzMwMywxMTMgQEAKIAkJCQkJICAgICAmZW50cnktPmdlbmVyYWxfaW50cl9tYXNrKTsKIAkJfQogCi0JCXNwaW5fbG9jaygmbm9kZV9hZmZpbml0eS5sb2NrKTsKIAkJbm9kZV9hZmZpbml0eV9hZGRfdGFpbChlbnRyeSk7Ci0JCXNwaW5fdW5sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogCX0KLQorCW11dGV4X3VubG9jaygmbm9kZV9hZmZpbml0eS5sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIAotaW50IGhmaTFfZ2V0X2lycV9hZmZpbml0eShzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCwgc3RydWN0IGhmaTFfbXNpeF9lbnRyeSAqbXNpeCkKKy8qCisgKiBGdW5jdGlvbiB1cGRhdGVzIHRoZSBpcnEgYWZmaW5pdHkgaGludCBmb3IgbXNpeCBhZnRlciBpdCBoYXMgYmVlbiBjaGFuZ2VkCisgKiBieSB0aGUgdXNlciB1c2luZyB0aGUgL3Byb2MvaXJxIGludGVyZmFjZS4gVGhpcyBmdW5jdGlvbiBvbmx5IGFjY2VwdHMKKyAqIG9uZSBjcHUgaW4gdGhlIG1hc2suCisgKi8KK3N0YXRpYyB2b2lkIGhmaTFfdXBkYXRlX3NkbWFfYWZmaW5pdHkoc3RydWN0IGhmaTFfbXNpeF9lbnRyeSAqbXNpeCwgaW50IGNwdSkKK3sKKwlzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkZSA9IG1zaXgtPmFyZzsKKwlzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCA9IHNkZS0+ZGQ7CisJc3RydWN0IGhmaTFfYWZmaW5pdHlfbm9kZSAqZW50cnk7CisJc3RydWN0IGNwdV9tYXNrX3NldCAqc2V0OworCWludCBpLCBvbGRfY3B1OworCisJaWYgKGNwdSA+IG51bV9vbmxpbmVfY3B1cygpIHx8IGNwdSA9PSBzZGUtPmNwdSkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmbm9kZV9hZmZpbml0eS5sb2NrKTsKKwllbnRyeSA9IG5vZGVfYWZmaW5pdHlfbG9va3VwKGRkLT5ub2RlKTsKKwlpZiAoIWVudHJ5KQorCQlnb3RvIHVubG9jazsKKworCW9sZF9jcHUgPSBzZGUtPmNwdTsKKwlzZGUtPmNwdSA9IGNwdTsKKwljcHVtYXNrX2NsZWFyKCZtc2l4LT5tYXNrKTsKKwljcHVtYXNrX3NldF9jcHUoY3B1LCAmbXNpeC0+bWFzayk7CisJZGRfZGV2X2RiZyhkZCwgIklSUSB2ZWN0b3I6ICV1LCB0eXBlICVzIGVuZ2luZSAldSAtPiBjcHU6ICVkXG4iLAorCQkgICBtc2l4LT5tc2l4LnZlY3RvciwgaXJxX3R5cGVfbmFtZXNbbXNpeC0+dHlwZV0sCisJCSAgIHNkZS0+dGhpc19pZHgsIGNwdSk7CisJaXJxX3NldF9hZmZpbml0eV9oaW50KG1zaXgtPm1zaXgudmVjdG9yLCAmbXNpeC0+bWFzayk7CisKKwkvKgorCSAqIFNldCB0aGUgbmV3IGNwdSBpbiB0aGUgaGZpMV9hZmZpbml0eV9ub2RlIGFuZCBjbGVhbgorCSAqIHRoZSBvbGQgY3B1IGlmIGl0IGlzIG5vdCB1c2VkIGJ5IGFueSBvdGhlciBJUlEKKwkgKi8KKwlzZXQgPSAmZW50cnktPmRlZl9pbnRyOworCWNwdW1hc2tfc2V0X2NwdShjcHUsICZzZXQtPm1hc2spOworCWNwdW1hc2tfc2V0X2NwdShjcHUsICZzZXQtPnVzZWQpOworCWZvciAoaSA9IDA7IGkgPCBkZC0+bnVtX21zaXhfZW50cmllczsgaSsrKSB7CisJCXN0cnVjdCBoZmkxX21zaXhfZW50cnkgKm90aGVyX21zaXg7CisKKwkJb3RoZXJfbXNpeCA9ICZkZC0+bXNpeF9lbnRyaWVzW2ldOworCQlpZiAob3RoZXJfbXNpeC0+dHlwZSAhPSBJUlFfU0RNQSB8fCBvdGhlcl9tc2l4ID09IG1zaXgpCisJCQljb250aW51ZTsKKworCQlpZiAoY3B1bWFza190ZXN0X2NwdShvbGRfY3B1LCAmb3RoZXJfbXNpeC0+bWFzaykpCisJCQlnb3RvIHVubG9jazsKKwl9CisJY3B1bWFza19jbGVhcl9jcHUob2xkX2NwdSwgJnNldC0+bWFzayk7CisJY3B1bWFza19jbGVhcl9jcHUob2xkX2NwdSwgJnNldC0+dXNlZCk7Cit1bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOworfQorCitzdGF0aWMgdm9pZCBoZmkxX2lycV9ub3RpZmllcl9ub3RpZnkoc3RydWN0IGlycV9hZmZpbml0eV9ub3RpZnkgKm5vdGlmeSwKKwkJCQkgICAgIGNvbnN0IGNwdW1hc2tfdCAqbWFzaykKK3sKKwlpbnQgY3B1ID0gY3B1bWFza19maXJzdChtYXNrKTsKKwlzdHJ1Y3QgaGZpMV9tc2l4X2VudHJ5ICptc2l4ID0gY29udGFpbmVyX29mKG5vdGlmeSwKKwkJCQkJCSAgICBzdHJ1Y3QgaGZpMV9tc2l4X2VudHJ5LAorCQkJCQkJICAgIG5vdGlmeSk7CisKKwkvKiBPbmx5IG9uZSBDUFUgY29uZmlndXJhdGlvbiBzdXBwb3J0ZWQgY3VycmVudGx5ICovCisJaGZpMV91cGRhdGVfc2RtYV9hZmZpbml0eShtc2l4LCBjcHUpOworfQorCitzdGF0aWMgdm9pZCBoZmkxX2lycV9ub3RpZmllcl9yZWxlYXNlKHN0cnVjdCBrcmVmICpyZWYpCit7CisJLyoKKwkgKiBUaGlzIGlzIHJlcXVpcmVkIGJ5IGFmZmluaXR5IG5vdGlmaWVyLiBXZSBkb24ndCBoYXZlIGFueXRoaW5nIHRvCisJICogZnJlZSBoZXJlLgorCSAqLworfQorCitzdGF0aWMgdm9pZCBoZmkxX3NldHVwX3NkbWFfbm90aWZpZXIoc3RydWN0IGhmaTFfbXNpeF9lbnRyeSAqbXNpeCkKK3sKKwlzdHJ1Y3QgaXJxX2FmZmluaXR5X25vdGlmeSAqbm90aWZ5ID0gJm1zaXgtPm5vdGlmeTsKKworCW5vdGlmeS0+aXJxID0gbXNpeC0+bXNpeC52ZWN0b3I7CisJbm90aWZ5LT5ub3RpZnkgPSBoZmkxX2lycV9ub3RpZmllcl9ub3RpZnk7CisJbm90aWZ5LT5yZWxlYXNlID0gaGZpMV9pcnFfbm90aWZpZXJfcmVsZWFzZTsKKworCWlmIChpcnFfc2V0X2FmZmluaXR5X25vdGlmaWVyKG5vdGlmeS0+aXJxLCBub3RpZnkpKQorCQlwcl9lcnIoIkZhaWxlZCB0byByZWdpc3RlciBzZG1hIGlycSBhZmZpbml0eSBub3RpZmllciBmb3IgaXJxICVkXG4iLAorCQkgICAgICAgbm90aWZ5LT5pcnEpOworfQorCitzdGF0aWMgdm9pZCBoZmkxX2NsZWFudXBfc2RtYV9ub3RpZmllcihzdHJ1Y3QgaGZpMV9tc2l4X2VudHJ5ICptc2l4KQoreworCXN0cnVjdCBpcnFfYWZmaW5pdHlfbm90aWZ5ICpub3RpZnkgPSAmbXNpeC0+bm90aWZ5OworCisJaWYgKGlycV9zZXRfYWZmaW5pdHlfbm90aWZpZXIobm90aWZ5LT5pcnEsIE5VTEwpKQorCQlwcl9lcnIoIkZhaWxlZCB0byBjbGVhbnVwIHNkbWEgaXJxIGFmZmluaXR5IG5vdGlmaWVyIGZvciBpcnEgJWRcbiIsCisJCSAgICAgICBub3RpZnktPmlycSk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBzZXRzIHRoZSBpcnEgYWZmaW5pdHkgZm9yIG1zaXguCisgKiBJdCAqbXVzdCogYmUgY2FsbGVkIHdpdGggbm9kZV9hZmZpbml0eS5sb2NrIGhlbGQuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2lycV9hZmZpbml0eShzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCwKKwkJCSAgICBzdHJ1Y3QgaGZpMV9tc2l4X2VudHJ5ICptc2l4KQogewogCWludCByZXQ7CiAJY3B1bWFza192YXJfdCBkaWZmOwpAQCAtMzI5LDkgKzQyNyw3IEBACiAJaWYgKCFyZXQpCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jc3Bpbl9sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogCWVudHJ5ID0gbm9kZV9hZmZpbml0eV9sb29rdXAoZGQtPm5vZGUpOwotCXNwaW5fdW5sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogCiAJc3dpdGNoIChtc2l4LT50eXBlKSB7CiAJY2FzZSBJUlFfU0RNQToKQEAgLTM2MSw3ICs0NTcsNiBAQAogCSAqIGZpbmRzIGl0cyBDUFUgaGVyZS4KIAkgKi8KIAlpZiAoY3B1ID09IC0xICYmIHNldCkgewotCQlzcGluX2xvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAJCWlmIChjcHVtYXNrX2VxdWFsKCZzZXQtPm1hc2ssICZzZXQtPnVzZWQpKSB7CiAJCQkvKgogCQkJICogV2UndmUgdXNlZCB1cCBhbGwgdGhlIENQVXMsIGJ1bXAgdXAgdGhlIGdlbmVyYXRpb24KQEAgLTM3MywxNyArNDY4LDYgQEAKIAkJY3B1bWFza19hbmRub3QoZGlmZiwgJnNldC0+bWFzaywgJnNldC0+dXNlZCk7CiAJCWNwdSA9IGNwdW1hc2tfZmlyc3QoZGlmZik7CiAJCWNwdW1hc2tfc2V0X2NwdShjcHUsICZzZXQtPnVzZWQpOwotCQlzcGluX3VubG9jaygmbm9kZV9hZmZpbml0eS5sb2NrKTsKLQl9Ci0KLQlzd2l0Y2ggKG1zaXgtPnR5cGUpIHsKLQljYXNlIElSUV9TRE1BOgotCQlzZGUtPmNwdSA9IGNwdTsKLQkJYnJlYWs7Ci0JY2FzZSBJUlFfR0VORVJBTDoKLQljYXNlIElSUV9SQ1ZDVFhUOgotCWNhc2UgSVJRX09USEVSOgotCQlicmVhazsKIAl9CiAKIAljcHVtYXNrX3NldF9jcHUoY3B1LCAmbXNpeC0+bWFzayk7CkBAIC0zOTIsMTAgKzQ3NiwyNSBAQAogCQkgICAgZXh0cmEsIGNwdSk7CiAJaXJxX3NldF9hZmZpbml0eV9oaW50KG1zaXgtPm1zaXgudmVjdG9yLCAmbXNpeC0+bWFzayk7CiAKKwlpZiAobXNpeC0+dHlwZSA9PSBJUlFfU0RNQSkgeworCQlzZGUtPmNwdSA9IGNwdTsKKwkJaGZpMV9zZXR1cF9zZG1hX25vdGlmaWVyKG1zaXgpOworCX0KKwogCWZyZWVfY3B1bWFza192YXIoZGlmZik7CiAJcmV0dXJuIDA7CiB9CiAKK2ludCBoZmkxX2dldF9pcnFfYWZmaW5pdHkoc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsIHN0cnVjdCBoZmkxX21zaXhfZW50cnkgKm1zaXgpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CisJcmV0ID0gZ2V0X2lycV9hZmZpbml0eShkZCwgbXNpeCk7CisJbXV0ZXhfdW5sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOworCXJldHVybiByZXQ7Cit9CisKIHZvaWQgaGZpMV9wdXRfaXJxX2FmZmluaXR5KHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLAogCQkJICAgc3RydWN0IGhmaTFfbXNpeF9lbnRyeSAqbXNpeCkKIHsKQEAgLTQwMywxMyArNTAyLDEzIEBACiAJc3RydWN0IGhmaTFfY3R4dGRhdGEgKnJjZDsKIAlzdHJ1Y3QgaGZpMV9hZmZpbml0eV9ub2RlICplbnRyeTsKIAotCXNwaW5fbG9jaygmbm9kZV9hZmZpbml0eS5sb2NrKTsKKwltdXRleF9sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogCWVudHJ5ID0gbm9kZV9hZmZpbml0eV9sb29rdXAoZGQtPm5vZGUpOwotCXNwaW5fdW5sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogCiAJc3dpdGNoIChtc2l4LT50eXBlKSB7CiAJY2FzZSBJUlFfU0RNQToKIAkJc2V0ID0gJmVudHJ5LT5kZWZfaW50cjsKKwkJaGZpMV9jbGVhbnVwX3NkbWFfbm90aWZpZXIobXNpeCk7CiAJCWJyZWFrOwogCWNhc2UgSVJRX0dFTkVSQUw6CiAJCS8qIERvbid0IGRvIGFjY291bnRpbmcgZm9yIGdlbmVyYWwgY29udGV4dHMgKi8KQEAgLTQyMSwyMSArNTIwLDIxIEBACiAJCQlzZXQgPSAmZW50cnktPnJjdl9pbnRyOwogCQlicmVhazsKIAlkZWZhdWx0OgorCQltdXRleF91bmxvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAoc2V0KSB7Ci0JCXNwaW5fbG9jaygmbm9kZV9hZmZpbml0eS5sb2NrKTsKIAkJY3B1bWFza19hbmRub3QoJnNldC0+dXNlZCwgJnNldC0+dXNlZCwgJm1zaXgtPm1hc2spOwogCQlpZiAoY3B1bWFza19lbXB0eSgmc2V0LT51c2VkKSAmJiBzZXQtPmdlbikgewogCQkJc2V0LT5nZW4tLTsKIAkJCWNwdW1hc2tfY29weSgmc2V0LT51c2VkLCAmc2V0LT5tYXNrKTsKIAkJfQotCQlzcGluX3VubG9jaygmbm9kZV9hZmZpbml0eS5sb2NrKTsKIAl9CiAKIAlpcnFfc2V0X2FmZmluaXR5X2hpbnQobXNpeC0+bXNpeC52ZWN0b3IsIE5VTEwpOwogCWNwdW1hc2tfY2xlYXIoJm1zaXgtPm1hc2spOworCW11dGV4X3VubG9jaygmbm9kZV9hZmZpbml0eS5sb2NrKTsKIH0KIAogLyogVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdpdGggbm9kZV9hZmZpbml0eS5sb2NrIGhlbGQgKi8KQEAgLTUzNiw3ICs2MzUsNyBAQAogCWlmICghcmV0KQogCQlnb3RvIGZyZWVfYXZhaWxhYmxlX21hc2s7CiAKLQlzcGluX2xvY2soJmFmZmluaXR5LT5sb2NrKTsKKwltdXRleF9sb2NrKCZhZmZpbml0eS0+bG9jayk7CiAJLyoKIAkgKiBJZiB3ZSd2ZSB1c2VkIGFsbCBhdmFpbGFibGUgSFcgdGhyZWFkcywgY2xlYXIgdGhlIG1hc2sgYW5kIHN0YXJ0CiAJICogb3ZlcmxvYWRpbmcuCkBAIC02NDQsNyArNzQzLDggQEAKIAkJY3B1ID0gLTE7CiAJZWxzZQogCQljcHVtYXNrX3NldF9jcHUoY3B1LCAmc2V0LT51c2VkKTsKLQlzcGluX3VubG9jaygmYWZmaW5pdHktPmxvY2spOworCisJbXV0ZXhfdW5sb2NrKCZhZmZpbml0eS0+bG9jayk7CiAJaGZpMV9jZGJnKFBST0MsICJQcm9jZXNzIGFzc2lnbmVkIHRvIENQVSAlZCIsIGNwdSk7CiAKIAlmcmVlX2NwdW1hc2tfdmFyKGludHJzX21hc2spOwpAQCAtNjY1LDQ5ICs3NjUsNTMgQEAKIAogCWlmIChjcHUgPCAwKQogCQlyZXR1cm47Ci0Jc3Bpbl9sb2NrKCZhZmZpbml0eS0+bG9jayk7CisKKwltdXRleF9sb2NrKCZhZmZpbml0eS0+bG9jayk7CiAJY3B1bWFza19jbGVhcl9jcHUoY3B1LCAmc2V0LT51c2VkKTsKIAloZmkxX2NkYmcoUFJPQywgIlJldHVybmluZyBDUFUgJWQgZm9yIGZ1dHVyZSBwcm9jZXNzIGFzc2lnbm1lbnQiLCBjcHUpOwogCWlmIChjcHVtYXNrX2VtcHR5KCZzZXQtPnVzZWQpICYmIHNldC0+Z2VuKSB7CiAJCXNldC0+Z2VuLS07CiAJCWNwdW1hc2tfY29weSgmc2V0LT51c2VkLCAmc2V0LT5tYXNrKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJmFmZmluaXR5LT5sb2NrKTsKKwltdXRleF91bmxvY2soJmFmZmluaXR5LT5sb2NrKTsKIH0KIAotLyogUHJldmVudHMgY29uY3VycmVudCByZWFkcyBhbmQgd3JpdGVzIG9mIHRoZSBzZG1hX2FmZmluaXR5IGF0dHJpYiAqLwotc3RhdGljIERFRklORV9NVVRFWChzZG1hX2FmZmluaXR5X211dGV4KTsKLQogaW50IGhmaTFfc2V0X3NkbWFfYWZmaW5pdHkoc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsIGNvbnN0IGNoYXIgKmJ1ZiwKIAkJCSAgIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgaGZpMV9hZmZpbml0eV9ub2RlICplbnRyeTsKLQlzdHJ1Y3QgY3B1bWFzayBtYXNrOworCWNwdW1hc2tfdmFyX3QgbWFzazsKIAlpbnQgcmV0LCBpOwogCi0Jc3Bpbl9sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOworCW11dGV4X2xvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAJZW50cnkgPSBub2RlX2FmZmluaXR5X2xvb2t1cChkZC0+bm9kZSk7Ci0Jc3Bpbl91bmxvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAKLQlpZiAoIWVudHJ5KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldCA9IGNwdWxpc3RfcGFyc2UoYnVmLCAmbWFzayk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWlmICghY3B1bWFza19zdWJzZXQoJm1hc2ssIGNwdV9vbmxpbmVfbWFzaykgfHwgY3B1bWFza19lbXB0eSgmbWFzaykpIHsKLQkJZGRfZGV2X3dhcm4oZGQsICJJbnZhbGlkIENQVSBtYXNrXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFlbnRyeSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIHVubG9jazsKIAl9CiAKLQltdXRleF9sb2NrKCZzZG1hX2FmZmluaXR5X211dGV4KTsKKwlyZXQgPSB6YWxsb2NfY3B1bWFza192YXIoJm1hc2ssIEdGUF9LRVJORUwpOworCWlmICghcmV0KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gdW5sb2NrOworCX0KKworCXJldCA9IGNwdWxpc3RfcGFyc2UoYnVmLCBtYXNrKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWlmICghY3B1bWFza19zdWJzZXQobWFzaywgY3B1X29ubGluZV9tYXNrKSB8fCBjcHVtYXNrX2VtcHR5KG1hc2spKSB7CisJCWRkX2Rldl93YXJuKGRkLCAiSW52YWxpZCBDUFUgbWFza1xuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwogCS8qIHJlc2V0IHRoZSBTRE1BIGludGVycnVwdCBhZmZpbml0eSBkZXRhaWxzICovCiAJaW5pdF9jcHVfbWFza19zZXQoJmVudHJ5LT5kZWZfaW50cik7Ci0JY3B1bWFza19jb3B5KCZlbnRyeS0+ZGVmX2ludHIubWFzaywgJm1hc2spOwotCS8qCi0JICogUmVhc3NpZ24gdGhlIGFmZmluaXR5IGZvciBlYWNoIFNETUEgaW50ZXJydXB0LgotCSAqLworCWNwdW1hc2tfY29weSgmZW50cnktPmRlZl9pbnRyLm1hc2ssIG1hc2spOworCisJLyogUmVhc3NpZ24gdGhlIGFmZmluaXR5IGZvciBlYWNoIFNETUEgaW50ZXJydXB0LiAqLwogCWZvciAoaSA9IDA7IGkgPCBkZC0+bnVtX21zaXhfZW50cmllczsgaSsrKSB7CiAJCXN0cnVjdCBoZmkxX21zaXhfZW50cnkgKm1zaXg7CiAKQEAgLTcxNSwxMyArODE5LDE1IEBACiAJCWlmIChtc2l4LT50eXBlICE9IElSUV9TRE1BKQogCQkJY29udGludWU7CiAKLQkJcmV0ID0gaGZpMV9nZXRfaXJxX2FmZmluaXR5KGRkLCBtc2l4KTsKKwkJcmV0ID0gZ2V0X2lycV9hZmZpbml0eShkZCwgbXNpeCk7CiAKIAkJaWYgKHJldCkKIAkJCWJyZWFrOwogCX0KLQotCW11dGV4X3VubG9jaygmc2RtYV9hZmZpbml0eV9tdXRleCk7CitvdXQ6CisJZnJlZV9jcHVtYXNrX3ZhcihtYXNrKTsKK3VubG9jazoKKwltdXRleF91bmxvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAJcmV0dXJuIHJldCA/IHJldCA6IHN0cm5sZW4oYnVmLCBQQUdFX1NJWkUpOwogfQogCkBAIC03MjksMTUgKzgzNSwxNSBAQAogewogCXN0cnVjdCBoZmkxX2FmZmluaXR5X25vZGUgKmVudHJ5OwogCi0Jc3Bpbl9sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOworCW11dGV4X2xvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAJZW50cnkgPSBub2RlX2FmZmluaXR5X2xvb2t1cChkZC0+bm9kZSk7Ci0Jc3Bpbl91bmxvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAKLQlpZiAoIWVudHJ5KQorCWlmICghZW50cnkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKLQltdXRleF9sb2NrKCZzZG1hX2FmZmluaXR5X211dGV4KTsKIAljcHVtYXBfcHJpbnRfdG9fcGFnZWJ1Zih0cnVlLCBidWYsICZlbnRyeS0+ZGVmX2ludHIubWFzayk7Ci0JbXV0ZXhfdW5sb2NrKCZzZG1hX2FmZmluaXR5X211dGV4KTsKKwltdXRleF91bmxvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAJcmV0dXJuIHN0cm5sZW4oYnVmLCBQQUdFX1NJWkUpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvYWZmaW5pdHkuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2FmZmluaXR5LmgKaW5kZXggODg3OWNmNy4uYjg5ZWEzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvYWZmaW5pdHkuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9hZmZpbml0eS5oCkBAIC0xMjEsOCArMTIxLDcgQEAKIAlpbnQgbnVtX2NvcmVfc2libGluZ3M7CiAJaW50IG51bV9vbmxpbmVfbm9kZXM7CiAJaW50IG51bV9vbmxpbmVfY3B1czsKLQkvKiBwcm90ZWN0IGFmZmluaXR5IG5vZGUgbGlzdCAqLwotCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsgLyogcHJvdGVjdHMgYWZmaW5pdHkgbm9kZXMgKi8KIH07CiAKIGludCBub2RlX2FmZmluaXR5X2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9jaGlwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9jaGlwLmMKaW5kZXggYjMyNjM4ZC4uOWJmNWYyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvY2hpcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2NoaXAuYwpAQCAtOTcxLDcgKzk3MSw5IEBACiAJRkxBR19FTlRSWTAoIkZhaWxlZCBMTkkoVmVyaWZ5Q2FwXzEpIiwgRkFJTEVEX0xOSV9WRVJJRllfQ0FQMSksCiAJRkxBR19FTlRSWTAoIkZhaWxlZCBMTkkoVmVyaWZ5Q2FwXzIpIiwgRkFJTEVEX0xOSV9WRVJJRllfQ0FQMiksCiAJRkxBR19FTlRSWTAoIkZhaWxlZCBMTkkoQ29uZmlnTFQpIiwgICAgRkFJTEVEX0xOSV9DT05GSUdMVCksCi0JRkxBR19FTlRSWTAoIkhvc3QgSGFuZHNoYWtlIFRpbWVvdXQiLCAgSE9TVF9IQU5EU0hBS0VfVElNRU9VVCkKKwlGTEFHX0VOVFJZMCgiSG9zdCBIYW5kc2hha2UgVGltZW91dCIsICBIT1NUX0hBTkRTSEFLRV9USU1FT1VUKSwKKwlGTEFHX0VOVFJZMCgiRXh0ZXJuYWwgRGV2aWNlIFJlcXVlc3QgVGltZW91dCIsCisJCSAgICBFWFRFUk5BTF9ERVZJQ0VfUkVRX1RJTUVPVVQpLAogfTsKIAogLyoKQEAgLTY4MjUsNyArNjgyNyw2IEBACiAJCXNldF9saW5rX2Rvd25fcmVhc29uKHBwZCwgT1BBX0xJTktET1dOX1JFQVNPTl9TUEVFRF9QT0xJQ1ksIDAsCiAJCQkJICAgICBPUEFfTElOS0RPV05fUkVBU09OX1NQRUVEX1BPTElDWSk7CiAJCXNldF9saW5rX3N0YXRlKHBwZCwgSExTX0ROX09GRkxJTkUpOwotCQl0dW5lX3NlcmRlcyhwcGQpOwogCQlzdGFydF9saW5rKHBwZCk7CiAJfQogfQpAQCAtNjk5OCwxMiArNjk5OSwxMCBAQAogCSAqIElmIHRoZXJlIGlzIG5vIGNhYmxlIGF0dGFjaGVkLCB0dXJuIHRoZSBEQyBvZmYuIE90aGVyd2lzZSwKIAkgKiBzdGFydCB0aGUgbGluayBicmluZyB1cC4KIAkgKi8KLQlpZiAocHBkLT5wb3J0X3R5cGUgPT0gUE9SVF9UWVBFX1FTRlAgJiYgIXFzZnBfbW9kX3ByZXNlbnQocHBkKSkgeworCWlmIChwcGQtPnBvcnRfdHlwZSA9PSBQT1JUX1RZUEVfUVNGUCAmJiAhcXNmcF9tb2RfcHJlc2VudChwcGQpKQogCQlkY19zaHV0ZG93bihwcGQtPmRkKTsKLQl9IGVsc2UgewotCQl0dW5lX3NlcmRlcyhwcGQpOworCWVsc2UKIAkJc3RhcnRfbGluayhwcGQpOwotCX0KIH0KIAogdm9pZCBoYW5kbGVfbGlua19ib3VuY2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtNzAxNiw3ICs3MDE1LDYgQEAKIAkgKi8KIAlpZiAocHBkLT5ob3N0X2xpbmtfc3RhdGUgJiBITFNfVVApIHsKIAkJc2V0X2xpbmtfc3RhdGUocHBkLCBITFNfRE5fT0ZGTElORSk7Ci0JCXR1bmVfc2VyZGVzKHBwZCk7CiAJCXN0YXJ0X2xpbmsocHBkKTsKIAl9IGVsc2UgewogCQlkZF9kZXZfaW5mbyhwcGQtPmRkLCAiJXM6IGxpbmsgbm90IHVwICglcyksIG5vdGhpbmcgdG8gZG9cbiIsCkBAIC03NTMxLDcgKzc1MjksNiBAQAogCQlzZXRfbGlua19kb3duX3JlYXNvbihwcGQsIE9QQV9MSU5LRE9XTl9SRUFTT05fV0lEVEhfUE9MSUNZLCAwLAogCQkJCSAgICAgT1BBX0xJTktET1dOX1JFQVNPTl9XSURUSF9QT0xJQ1kpOwogCQlzZXRfbGlua19zdGF0ZShwcGQsIEhMU19ETl9PRkZMSU5FKTsKLQkJdHVuZV9zZXJkZXMocHBkKTsKIAkJc3RhcnRfbGluayhwcGQpOwogCX0KIH0KQEAgLTkxNjEsNiArOTE1OCwxMiBAQAogICovCiBpbnQgc3RhcnRfbGluayhzdHJ1Y3QgaGZpMV9wcG9ydGRhdGEgKnBwZCkKIHsKKwkvKgorCSAqIFR1bmUgdGhlIFNlckRlcyB0byBhIGJhbGxwYXJrIHNldHRpbmcgZm9yIG9wdGltYWwgc2lnbmFsIGFuZCBiaXQKKwkgKiBlcnJvciByYXRlLiAgTmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUgc3RhcnRpbmcgdGhlIGxpbmsuCisJICovCisJdHVuZV9zZXJkZXMocHBkKTsKKwogCWlmICghcHBkLT5saW5rX2VuYWJsZWQpIHsKIAkJZGRfZGV2X2luZm8ocHBkLT5kZCwKIAkJCSAgICAiJXM6IHN0b3BwaW5nIGxpbmsgc3RhcnQgYmVjYXVzZSBsaW5rIGlzIGRpc2FibGVkXG4iLApAQCAtOTQwMSw4ICs5NDA0LDYgQEAKIAkJICovCiAJCXNldF9xc2ZwX2ludF9uKHBwZCwgMSk7CiAKLQkJdHVuZV9zZXJkZXMocHBkKTsKLQogCQlzdGFydF9saW5rKHBwZCk7CiAJfQogCkBAIC05NDkwLDYgKzk0OTEsNzMgQEAKIAl3cml0ZV9jc3IoZGQsIERDX0xDQl9DRkdfVFhfRklGT1NfUkVTRVQsIDB4MDApOwogfQogCisvKgorICogUGVyZm9ybSBhIHRlc3QgcmVhZCBvbiB0aGUgUVNGUC4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC1FUlJOTworICogb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgdGVzdF9xc2ZwX3JlYWQoc3RydWN0IGhmaTFfcHBvcnRkYXRhICpwcGQpCit7CisJaW50IHJldDsKKwl1OCBzdGF0dXM7CisKKwkvKiByZXBvcnQgc3VjY2VzcyBpZiBub3QgYSBRU0ZQICovCisJaWYgKHBwZC0+cG9ydF90eXBlICE9IFBPUlRfVFlQRV9RU0ZQKQorCQlyZXR1cm4gMDsKKworCS8qIHJlYWQgYnl0ZSAyLCB0aGUgc3RhdHVzIGJ5dGUgKi8KKwlyZXQgPSBvbmVfcXNmcF9yZWFkKHBwZCwgcHBkLT5kZC0+aGZpMV9pZCwgMiwgJnN0YXR1cywgMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJaWYgKHJldCAhPSAxKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOyAvKiBzdWNjZXNzICovCit9CisKKy8qCisgKiBWYWx1ZXMgZm9yIFFTRlAgcmV0cnkuCisgKgorICogR2l2ZSB1cCBhZnRlciAxMHMgKDIwIHggNTAwbXMpLiAgVGhlIG92ZXJhbGwgdGltZW91dCB3YXMgZW1waXJpY2FsbHkKKyAqIGFycml2ZWQgYXQgZnJvbSBleHBlcmllbmNlIG9uIGEgbGFyZ2UgY2x1c3Rlci4KKyAqLworI2RlZmluZSBNQVhfUVNGUF9SRVRSSUVTIDIwCisjZGVmaW5lIFFTRlBfUkVUUllfV0FJVCA1MDAgLyogbXNlYyAqLworCisvKgorICogVHJ5IGEgUVNGUCByZWFkLiAgSWYgaXQgZmFpbHMsIHNjaGVkdWxlIGEgcmV0cnkgZm9yIGxhdGVyLgorICogQ2FsbGVkIG9uIGZpcnN0IGxpbmsgYWN0aXZhdGlvbiBhZnRlciBkcml2ZXIgbG9hZC4KKyAqLworc3RhdGljIHZvaWQgdHJ5X3N0YXJ0X2xpbmsoc3RydWN0IGhmaTFfcHBvcnRkYXRhICpwcGQpCit7CisJaWYgKHRlc3RfcXNmcF9yZWFkKHBwZCkpIHsKKwkJLyogcmVhZCBmYWlsZWQgKi8KKwkJaWYgKHBwZC0+cXNmcF9yZXRyeV9jb3VudCA+PSBNQVhfUVNGUF9SRVRSSUVTKSB7CisJCQlkZF9kZXZfZXJyKHBwZC0+ZGQsICJRU0ZQIG5vdCByZXNwb25kaW5nLCBnaXZpbmcgdXBcbiIpOworCQkJcmV0dXJuOworCQl9CisJCWRkX2Rldl9pbmZvKHBwZC0+ZGQsCisJCQkgICAgIlFTRlAgbm90IHJlc3BvbmRpbmcsIHdhaXRpbmcgYW5kIHJldHJ5aW5nICVkXG4iLAorCQkJICAgIChpbnQpcHBkLT5xc2ZwX3JldHJ5X2NvdW50KTsKKwkJcHBkLT5xc2ZwX3JldHJ5X2NvdW50Kys7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcGQtPmhmaTFfd3EsICZwcGQtPnN0YXJ0X2xpbmtfd29yaywKKwkJCQkgICBtc2Vjc190b19qaWZmaWVzKFFTRlBfUkVUUllfV0FJVCkpOworCQlyZXR1cm47CisJfQorCXBwZC0+cXNmcF9yZXRyeV9jb3VudCA9IDA7CisKKwlzdGFydF9saW5rKHBwZCk7Cit9CisKKy8qCisgKiBXb3JrcXVldWUgZnVuY3Rpb24gdG8gc3RhcnQgdGhlIGxpbmsgYWZ0ZXIgYSBkZWxheS4KKyAqLwordm9pZCBoYW5kbGVfc3RhcnRfbGluayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGhmaTFfcHBvcnRkYXRhICpwcGQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGhmaTFfcHBvcnRkYXRhLAorCQkJCQkJICBzdGFydF9saW5rX3dvcmsud29yayk7CisJdHJ5X3N0YXJ0X2xpbmsocHBkKTsKK30KKwogaW50IGJyaW5ndXBfc2VyZGVzKHN0cnVjdCBoZmkxX3Bwb3J0ZGF0YSAqcHBkKQogewogCXN0cnVjdCBoZmkxX2RldmRhdGEgKmRkID0gcHBkLT5kZDsKQEAgLTk1MjUsMTQgKzk1OTMsOCBAQAogCQlzZXRfcXNmcF9pbnRfbihwcGQsIDEpOwogCX0KIAotCS8qCi0JICogVHVuZSB0aGUgU2VyRGVzIHRvIGEgYmFsbHBhcmsgc2V0dGluZyBmb3IKLQkgKiBvcHRpbWFsIHNpZ25hbCBhbmQgYml0IGVycm9yIHJhdGUKLQkgKiBOZWVkcyB0byBiZSBkb25lIGJlZm9yZSBzdGFydGluZyB0aGUgbGluawotCSAqLwotCXR1bmVfc2VyZGVzKHBwZCk7Ci0KLQlyZXR1cm4gc3RhcnRfbGluayhwcGQpOworCXRyeV9zdGFydF9saW5rKHBwZCk7CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgaGZpMV9xdWlldF9zZXJkZXMoc3RydWN0IGhmaTFfcHBvcnRkYXRhICpwcGQpCkBAIC05NTQ5LDYgKzk2MTEsMTAgQEAKIAlwcGQtPmRyaXZlcl9saW5rX3JlYWR5ID0gMDsKIAlwcGQtPmxpbmtfZW5hYmxlZCA9IDA7CiAKKwlwcGQtPnFzZnBfcmV0cnlfY291bnQgPSBNQVhfUVNGUF9SRVRSSUVTOyAvKiBwcmV2ZW50IG1vcmUgcmV0cmllcyAqLworCWZsdXNoX2RlbGF5ZWRfd29yaygmcHBkLT5zdGFydF9saW5rX3dvcmspOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHBkLT5zdGFydF9saW5rX3dvcmspOworCiAJcHBkLT5vZmZsaW5lX2Rpc2FibGVkX3JlYXNvbiA9CiAJCQlIRkkxX09EUl9NQVNLKE9QQV9MSU5LRE9XTl9SRUFTT05fU01BX0RJU0FCTEVEKTsKIAlzZXRfbGlua19kb3duX3JlYXNvbihwcGQsIE9QQV9MSU5LRE9XTl9SRUFTT05fU01BX0RJU0FCTEVELCAwLApAQCAtOTY0OCwxMiArOTcxNCwxMiBAQAogCQloZmkxX3B1dF90aWQoZGQsIGksIFBUX0lOVkFMSUQsIDAsIDApOwogfQogCi1zdHJ1Y3QgaGZpMV9tZXNzYWdlX2hlYWRlciAqaGZpMV9nZXRfbXNnaGVhZGVyKAotCQkJCXN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLCBfX2xlMzIgKnJoZl9hZGRyKQorc3RydWN0IGliX2hlYWRlciAqaGZpMV9nZXRfbXNnaGVhZGVyKAorCXN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLCBfX2xlMzIgKnJoZl9hZGRyKQogewogCXUzMiBvZmZzZXQgPSByaGZfaGRycV9vZmZzZXQocmhmX3RvX2NwdShyaGZfYWRkcikpOwogCi0JcmV0dXJuIChzdHJ1Y3QgaGZpMV9tZXNzYWdlX2hlYWRlciAqKQorCXJldHVybiAoc3RydWN0IGliX2hlYWRlciAqKQogCQkocmhmX2FkZHIgLSBkZC0+cmhmX29mZnNldCArIG9mZnNldCk7CiB9CiAKQEAgLTExNDg5LDEwICsxMTU1NSwxMCBAQAogCSAgICAhKHJjdmN0cmwgJiBSQ1ZfQ1RYVF9DVFJMX0VOQUJMRV9TTUFTSykpIHsKIAkJLyogcmVzZXQgdGhlIHRhaWwgYW5kIGhkciBhZGRyZXNzZXMsIGFuZCBzZXF1ZW5jZSBjb3VudCAqLwogCQl3cml0ZV9rY3R4dF9jc3IoZGQsIGN0eHQsIFJDVl9IRFJfQUREUiwKLQkJCQlyY2QtPnJjdmhkcnFfcGh5cyk7CisJCQkJcmNkLT5yY3ZoZHJxX2RtYSk7CiAJCWlmIChIRkkxX0NBUF9LR0VUX01BU0socmNkLT5mbGFncywgRE1BX1JUQUlMKSkKIAkJCXdyaXRlX2tjdHh0X2NzcihkZCwgY3R4dCwgUkNWX0hEUl9UQUlMX0FERFIsCi0JCQkJCXJjZC0+cmN2aGRycXRhaWxhZGRyX3BoeXMpOworCQkJCQlyY2QtPnJjdmhkcnF0YWlsYWRkcl9kbWEpOwogCQlyY2QtPnNlcV9jbnQgPSAxOwogCiAJCS8qIHJlc2V0IHRoZSBjYWNoZWQgcmVjZWl2ZSBoZWFkZXIgcXVldWUgaGVhZCB2YWx1ZSAqLwpAQCAtMTE1NTcsOSArMTE2MjMsOSBAQAogCQkgKiB1cGRhdGUgd2l0aCBhIGR1bW15IHRhaWwgYWRkcmVzcyBhbmQgdGhlbiBkaXNhYmxlCiAJCSAqIHJlY2VpdmUgY29udGV4dC4KIAkJICovCi0JCWlmIChkZC0+cmN2aGRydGFpbF9kdW1teV9waHlzYWRkcikgeworCQlpZiAoZGQtPnJjdmhkcnRhaWxfZHVtbXlfZG1hKSB7CiAJCQl3cml0ZV9rY3R4dF9jc3IoZGQsIGN0eHQsIFJDVl9IRFJfVEFJTF9BRERSLAotCQkJCQlkZC0+cmN2aGRydGFpbF9kdW1teV9waHlzYWRkcik7CisJCQkJCWRkLT5yY3ZoZHJ0YWlsX2R1bW15X2RtYSk7CiAJCQkvKiBFbmFibGluZyBSY3ZDdHh0Q3RybC5UYWlsVXBkIGlzIGludGVudGlvbmFsLiAqLwogCQkJcmN2Y3RybCB8PSBSQ1ZfQ1RYVF9DVFJMX1RBSUxfVVBEX1NNQVNLOwogCQl9CkBAIC0xMTU3MCw3ICsxMTYzNiw3IEBACiAJCXJjdmN0cmwgfD0gUkNWX0NUWFRfQ1RSTF9JTlRSX0FWQUlMX1NNQVNLOwogCWlmIChvcCAmIEhGSTFfUkNWQ1RSTF9JTlRSQVZBSUxfRElTKQogCQlyY3ZjdHJsICY9IH5SQ1ZfQ1RYVF9DVFJMX0lOVFJfQVZBSUxfU01BU0s7Ci0JaWYgKG9wICYgSEZJMV9SQ1ZDVFJMX1RBSUxVUERfRU5CICYmIHJjZC0+cmN2aGRycXRhaWxhZGRyX3BoeXMpCisJaWYgKG9wICYgSEZJMV9SQ1ZDVFJMX1RBSUxVUERfRU5CICYmIHJjZC0+cmN2aGRycXRhaWxhZGRyX2RtYSkKIAkJcmN2Y3RybCB8PSBSQ1ZfQ1RYVF9DVFJMX1RBSUxfVVBEX1NNQVNLOwogCWlmIChvcCAmIEhGSTFfUkNWQ1RSTF9UQUlMVVBEX0RJUykgewogCQkvKiBTZWUgY29tbWVudCBvbiBSY3ZDdHh0Q3RybC5UYWlsVXBkIGFib3ZlICovCkBAIC0xMTY0Miw3ICsxMTcwOCw3IEBACiAJCSAqIHNvIGl0IGRvZXNuJ3QgY29udGFpbiBhbiBhZGRyZXNzIHRoYXQgaXMgaW52YWxpZC4KIAkJICovCiAJCXdyaXRlX2tjdHh0X2NzcihkZCwgY3R4dCwgUkNWX0hEUl9UQUlMX0FERFIsCi0JCQkJZGQtPnJjdmhkcnRhaWxfZHVtbXlfcGh5c2FkZHIpOworCQkJCWRkLT5yY3ZoZHJ0YWlsX2R1bW15X2RtYSk7CiB9CiAKIHUzMiBoZmkxX3JlYWRfY250cnMoc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsIGNoYXIgKipuYW1lcCwgdTY0ICoqY250cnApCkBAIC0xMjg2NSw3ICsxMjkzMSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgc2V0X3VwX2NvbnRleHRfdmFyaWFibGVzKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkKQogewotCWludCBudW1fa2VybmVsX2NvbnRleHRzOworCXVuc2lnbmVkIGxvbmcgbnVtX2tlcm5lbF9jb250ZXh0czsKIAlpbnQgdG90YWxfY29udGV4dHM7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBuZ3JvdXBzOwpAQCAtMTI4OTQsOSArMTI5NjAsOSBAQAogCSAqLwogCWlmIChudW1fa2VybmVsX2NvbnRleHRzID4gKGRkLT5jaGlwX3NlbmRfY29udGV4dHMgLSBudW1fdmxzIC0gMSkpIHsKIAkJZGRfZGV2X2VycihkZCwKLQkJCSAgICJSZWR1Y2luZyAjIGtlcm5lbCByY3YgY29udGV4dHMgdG86ICVkLCBmcm9tICVkXG4iLAorCQkJICAgIlJlZHVjaW5nICMga2VybmVsIHJjdiBjb250ZXh0cyB0bzogJWQsIGZyb20gJWx1XG4iLAogCQkJICAgKGludCkoZGQtPmNoaXBfc2VuZF9jb250ZXh0cyAtIG51bV92bHMgLSAxKSwKLQkJCSAgIChpbnQpbnVtX2tlcm5lbF9jb250ZXh0cyk7CisJCQkgICBudW1fa2VybmVsX2NvbnRleHRzKTsKIAkJbnVtX2tlcm5lbF9jb250ZXh0cyA9IGRkLT5jaGlwX3NlbmRfY29udGV4dHMgLSBudW1fdmxzIC0gMTsKIAl9CiAJLyoKQEAgLTEzMzE5LDkgKzEzMzg1LDkgQEAKIAkJLyoKIAkJICogR2l2ZSB1cCBhZnRlciAxbXMgLSBtYXhpbXVtIHdhaXQgdGltZS4KIAkJICoKLQkJICogUkJ1ZiBzaXplIGlzIDE0OEtpQi4gIFNsb3dlc3QgcG9zc2libGUgaXMgUENJZSBHZW4xIHgxIGF0CisJCSAqIFJCdWYgc2l6ZSBpcyAxMzZLaUIuICBTbG93ZXN0IHBvc3NpYmxlIGlzIFBDSWUgR2VuMSB4MSBhdAogCQkgKiAyNTBNQi9zIGJhbmR3aWR0aC4gIExvd2VyIHJhdGUgdG8gNjYlIGZvciBvdmVyaGVhZCB0byBnZXQ6Ci0JCSAqCTE0OCBLQiAvICg2NiUgKiAyNTBNQi9zKSA9IDkyMHVzCisJCSAqCTEzNiBLQiAvICg2NiUgKiAyNTBNQi9zKSA9IDg0NHVzCiAJCSAqLwogCQlpZiAoY291bnQrKyA+IDUwMCkgewogCQkJZGRfZGV2X2VycihkZCwKQEAgLTE0NTAwLDYgKzE0NTY2LDExIEBACiAJaWYgKHJldCkKIAkJZ290byBiYWlsX2NsZWFudXA7CiAKKwkvKiBjYWxsIGJlZm9yZSBnZXRfcGxhdGZvcm1fY29uZmlnKCksIGFmdGVyIGluaXRfY2hpcF9yZXNvdXJjZXMoKSAqLworCXJldCA9IGVwcm9tX2luaXQoZGQpOworCWlmIChyZXQpCisJCWdvdG8gYmFpbF9mcmVlX3JjdmVycjsKKwogCS8qIE5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgaGZpMV9maXJtd2FyZV9pbml0ICovCiAJZ2V0X3BsYXRmb3JtX2NvbmZpZyhkZCk7CiAKQEAgLTE0NjIwLDEwICsxNDY5MSw2IEBACiAJaWYgKHJldCkKIAkJZ290byBiYWlsX2ZyZWVfY250cnM7CiAKLQlyZXQgPSBlcHJvbV9pbml0KGRkKTsKLQlpZiAocmV0KQotCQlnb3RvIGJhaWxfZnJlZV9yY3ZlcnI7Ci0KIAlnb3RvIGJhaWw7CiAKIGJhaWxfZnJlZV9yY3ZlcnI6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9jaGlwLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9jaGlwLmgKaW5kZXggZWQxMTEwNy4uOTIzNDUyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvY2hpcC5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2NoaXAuaApAQCAtODIsNyArODIsNyBAQAogICovCiAjZGVmaW5lIENNX1ZBVSAzCiAvKiBIRkkgbGluayBjcmVkaXQgY291bnQsIEFLQSByZWNlaXZlIGJ1ZmZlciBkZXB0aCAoUkJVRl9ERVBUSCkgKi8KLSNkZWZpbmUgQ01fR0xPQkFMX0NSRURJVFMgMHg5NDAKKyNkZWZpbmUgQ01fR0xPQkFMX0NSRURJVFMgMHg4ODAKIC8qIE51bWJlciBvZiBQS2V5IGVudHJpZXMgaW4gdGhlIEhXICovCiAjZGVmaW5lIE1BWF9QS0VZX1ZBTFVFUyAxNgogCkBAIC0yNTQsMTIgKzI1NCwxNCBAQAogI2RlZmluZSBGQUlMRURfTE5JX1ZFUklGWV9DQVAyCQlCSVQoMTApCiAjZGVmaW5lIEZBSUxFRF9MTklfQ09ORklHTFQJCUJJVCgxMSkKICNkZWZpbmUgSE9TVF9IQU5EU0hBS0VfVElNRU9VVAkJQklUKDEyKQorI2RlZmluZSBFWFRFUk5BTF9ERVZJQ0VfUkVRX1RJTUVPVVQJQklUKDEzKQogCiAjZGVmaW5lIEZBSUxFRF9MTkkgKEZBSUxFRF9MTklfUE9MTElORyB8IEZBSUxFRF9MTklfREVCT1VOQ0UgXAogCQkJfCBGQUlMRURfTE5JX0VTVEJDT01NIHwgRkFJTEVEX0xOSV9PUFRFUSBcCiAJCQl8IEZBSUxFRF9MTklfVkVSSUZZX0NBUDEgXAogCQkJfCBGQUlMRURfTE5JX1ZFUklGWV9DQVAyIFwKLQkJCXwgRkFJTEVEX0xOSV9DT05GSUdMVCB8IEhPU1RfSEFORFNIQUtFX1RJTUVPVVQpCisJCQl8IEZBSUxFRF9MTklfQ09ORklHTFQgfCBIT1NUX0hBTkRTSEFLRV9USU1FT1VUIFwKKwkJCXwgRVhURVJOQUxfREVWSUNFX1JFUV9USU1FT1VUKQogCiAvKiBEQ19EQzgwNTFfREJHX0VSUl9JTkZPX1NFVF9CWV84MDUxLkhPU1RfTVNHIC0gaG9zdCBtZXNzYWdlIGZsYWdzICovCiAjZGVmaW5lIEhPU1RfUkVRX0RPTkUJCUJJVCgwKQpAQCAtNzA2LDYgKzcwOCw3IEBACiB2b2lkIGhhbmRsZV9saW5rX2Rvd24oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHZvaWQgaGFuZGxlX2xpbmtfZG93bmdyYWRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiB2b2lkIGhhbmRsZV9saW5rX2JvdW5jZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwordm9pZCBoYW5kbGVfc3RhcnRfbGluayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogdm9pZCBoYW5kbGVfc21hX21lc3NhZ2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHZvaWQgcmVzZXRfcXNmcChzdHJ1Y3QgaGZpMV9wcG9ydGRhdGEgKnBwZCk7CiB2b2lkIHFzZnBfZXZlbnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKQEAgLTEzMzUsNyArMTMzOCw3IEBACiB1NjQgZ2V0X2FsbF9jcHVfdG90YWwodTY0IF9fcGVyY3B1ICpjbnRyKTsKIHZvaWQgaGZpMV9zdGFydF9jbGVhbnVwKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkKTsKIHZvaWQgaGZpMV9jbGVhcl90aWRzKHN0cnVjdCBoZmkxX2N0eHRkYXRhICpyY2QpOwotc3RydWN0IGhmaTFfbWVzc2FnZV9oZWFkZXIgKmhmaTFfZ2V0X21zZ2hlYWRlcigKK3N0cnVjdCBpYl9oZWFkZXIgKmhmaTFfZ2V0X21zZ2hlYWRlcigKIAkJCQlzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCwgX19sZTMyICpyaGZfYWRkcik7CiBpbnQgaGZpMV9pbml0X2N0eHQoc3RydWN0IHNlbmRfY29udGV4dCAqc2MpOwogdm9pZCBoZmkxX3B1dF90aWQoc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsIHUzMiBpbmRleCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2NvbW1vbi5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvY29tbW9uLmgKaW5kZXggZmNjOWMyMS4uZGE3YmUyMWJlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvY29tbW9uLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvY29tbW9uLmgKQEAgLTMyMCwxNCArMzIwLDYgQEAKIC8qIFJIRiByZWNlaXZlIHR5cGUgZXJyb3IgLSBieXBhc3MgcGFja2V0IGVycm9ycyAqLwogI2RlZmluZSBSSEZfUlRFX0JZUEFTU19OT19FUlIJCTB4MAogCi0vKgotICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGZpcnN0IGZpZWxkIGNvbW1vbiB0byBhbGwgcHJvdG9jb2xzCi0gKiB0aGF0IGVtcGxveSB0aGlzIGNoaXAuCi0gKi8KLXN0cnVjdCBoZmkxX21lc3NhZ2VfaGVhZGVyIHsKLQlfX2JlMTYgbHJoWzRdOwotfTsKLQogLyogSUIgLSBMUkggaGVhZGVyIGNvbnN0YW50cyAqLwogI2RlZmluZSBIRkkxX0xSSF9HUkggMHgwMDAzICAgICAgLyogMS4gd29yZCBvZiBJQiBMUkggLSBuZXh0IGhlYWRlcjogR1JIICovCiAjZGVmaW5lIEhGSTFfTFJIX0JUSCAweDAwMDIgICAgICAvKiAxLiB3b3JkIG9mIElCIExSSCAtIG5leHQgaGVhZGVyOiBCVEggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2RlYnVnZnMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2RlYnVnZnMuYwppbmRleCBkYmFiOWQ5Li42MzJiYTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvZGVidWdmcy5jCkBAIC01OSw2ICs1OSw0MCBAQAogCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqaGZpMV9kYmdfcm9vdDsKIAorLyogd3JhcHBlcnMgdG8gZW5mb3JjZSBzcmN1IGluIHNlcSBmaWxlICovCitzdGF0aWMgc3NpemVfdCBoZmkxX3NlcV9yZWFkKAorCXN0cnVjdCBmaWxlICpmaWxlLAorCWNoYXIgX191c2VyICpidWYsCisJc2l6ZV90IHNpemUsCisJbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBkZW50cnkgKmQgPSBmaWxlLT5mX3BhdGguZGVudHJ5OworCWludCBzcmN1X2lkeDsKKwlzc2l6ZV90IHI7CisKKwlyID0gZGVidWdmc191c2VfZmlsZV9zdGFydChkLCAmc3JjdV9pZHgpOworCWlmIChsaWtlbHkoIXIpKQorCQlyID0gc2VxX3JlYWQoZmlsZSwgYnVmLCBzaXplLCBwcG9zKTsKKwlkZWJ1Z2ZzX3VzZV9maWxlX2ZpbmlzaChzcmN1X2lkeCk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBsb2ZmX3QgaGZpMV9zZXFfbHNlZWsoCisJc3RydWN0IGZpbGUgKmZpbGUsCisJbG9mZl90IG9mZnNldCwKKwlpbnQgd2hlbmNlKQoreworCXN0cnVjdCBkZW50cnkgKmQgPSBmaWxlLT5mX3BhdGguZGVudHJ5OworCWludCBzcmN1X2lkeDsKKwlsb2ZmX3QgcjsKKworCXIgPSBkZWJ1Z2ZzX3VzZV9maWxlX3N0YXJ0KGQsICZzcmN1X2lkeCk7CisJaWYgKGxpa2VseSghcikpCisJCXIgPSBzZXFfbHNlZWsoZmlsZSwgb2Zmc2V0LCB3aGVuY2UpOworCWRlYnVnZnNfdXNlX2ZpbGVfZmluaXNoKHNyY3VfaWR4KTsKKwlyZXR1cm4gcjsKK30KKwogI2RlZmluZSBwcml2YXRlMmRkKGZpbGUpIChmaWxlX2lub2RlKGZpbGUpLT5pX3ByaXZhdGUpCiAjZGVmaW5lIHByaXZhdGUycHBkKGZpbGUpIChmaWxlX2lub2RlKGZpbGUpLT5pX3ByaXZhdGUpCiAKQEAgLTg3LDggKzEyMSw4IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBfIyNuYW1lIyNfZmlsZV9vcHMgPSB7IFwKIAkub3duZXIgICA9IFRISVNfTU9EVUxFLCBcCiAJLm9wZW4gICAgPSBfIyNuYW1lIyNfb3BlbiwgXAotCS5yZWFkICAgID0gc2VxX3JlYWQsIFwKLQkubGxzZWVrICA9IHNlcV9sc2VlaywgXAorCS5yZWFkICAgID0gaGZpMV9zZXFfcmVhZCwgXAorCS5sbHNlZWsgID0gaGZpMV9zZXFfbHNlZWssIFwKIAkucmVsZWFzZSA9IHNlcV9yZWxlYXNlIFwKIH0KIApAQCAtMTA1LDExICsxMzksOSBAQAogCURFQlVHRlNfRklMRV9DUkVBVEUoI25hbWUsIHBhcmVudCwgZGF0YSwgJl8jI25hbWUjI19maWxlX29wcywgU19JUlVHTykKIAogc3RhdGljIHZvaWQgKl9vcGNvZGVfc3RhdHNfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcywgbG9mZl90ICpwb3MpCi1fX2FjcXVpcmVzKFJDVSkKIHsKIAlzdHJ1Y3QgaGZpMV9vcGNvZGVfc3RhdHNfcGVyY3R4ICpvcHN0YXRzOwogCi0JcmN1X3JlYWRfbG9jaygpOwogCWlmICgqcG9zID49IEFSUkFZX1NJWkUob3BzdGF0cy0+c3RhdHMpKQogCQlyZXR1cm4gTlVMTDsKIAlyZXR1cm4gcG9zOwpAQCAtMTI2LDkgKzE1OCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIF9vcGNvZGVfc3RhdHNfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQotX19yZWxlYXNlcyhSQ1UpCiB7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKIHN0YXRpYyBpbnQgX29wY29kZV9zdGF0c19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCkBAIC0yMjMsMjggKzI1MywzMiBAQAogREVCVUdGU19GSUxFX09QUyhjdHhfc3RhdHMpOwogCiBzdGF0aWMgdm9pZCAqX3FwX3N0YXRzX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIGxvZmZfdCAqcG9zKQotX19hY3F1aXJlcyhSQ1UpCisJX19hY3F1aXJlcyhSQ1UpCiB7CiAJc3RydWN0IHFwX2l0ZXIgKml0ZXI7CiAJbG9mZl90IG4gPSAqcG9zOwogCi0JcmN1X3JlYWRfbG9jaygpOwogCWl0ZXIgPSBxcF9pdGVyX2luaXQocy0+cHJpdmF0ZSk7CisKKwkvKiBzdG9wIGNhbGxzIHJjdV9yZWFkX3VubG9jayAqLworCXJjdV9yZWFkX2xvY2soKTsKKwogCWlmICghaXRlcikKIAkJcmV0dXJuIE5VTEw7CiAKLQl3aGlsZSAobi0tKSB7CisJZG8gewogCQlpZiAocXBfaXRlcl9uZXh0KGl0ZXIpKSB7CiAJCQlrZnJlZShpdGVyKTsKIAkJCXJldHVybiBOVUxMOwogCQl9Ci0JfQorCX0gd2hpbGUgKG4tLSk7CiAKIAlyZXR1cm4gaXRlcjsKIH0KIAogc3RhdGljIHZvaWQgKl9xcF9zdGF0c19zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKml0ZXJfcHRyLAogCQkJCWxvZmZfdCAqcG9zKQorCV9fbXVzdF9ob2xkKFJDVSkKIHsKIAlzdHJ1Y3QgcXBfaXRlciAqaXRlciA9IGl0ZXJfcHRyOwogCkBAIC0yNTksNyArMjkzLDcgQEAKIH0KIAogc3RhdGljIHZvaWQgX3FwX3N0YXRzX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqaXRlcl9wdHIpCi1fX3JlbGVhc2VzKFJDVSkKKwlfX3JlbGVhc2VzKFJDVSkKIHsKIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KQEAgLTI4MSwxMiArMzE1LDEwIEBACiBERUJVR0ZTX0ZJTEVfT1BTKHFwX3N0YXRzKTsKIAogc3RhdGljIHZvaWQgKl9zZGVzX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIGxvZmZfdCAqcG9zKQotX19hY3F1aXJlcyhSQ1UpCiB7CiAJc3RydWN0IGhmaTFfaWJkZXYgKmliZDsKIAlzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZDsKIAotCXJjdV9yZWFkX2xvY2soKTsKIAlpYmQgPSAoc3RydWN0IGhmaTFfaWJkZXYgKilzLT5wcml2YXRlOwogCWRkID0gZGRfZnJvbV9kZXYoaWJkKTsKIAlpZiAoIWRkLT5wZXJfc2RtYSB8fCAqcG9zID49IGRkLT5udW1fc2RtYSkKQEAgLTMwNiw5ICszMzgsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBfc2Rlc19zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCi1fX3JlbGVhc2VzKFJDVSkKIHsKLQlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAogc3RhdGljIGludCBfc2Rlc19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCkBAIC0zMzUsMTEgKzM2NSw5IEBACiAJc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQ7CiAJc3NpemVfdCBydmFsOwogCi0JcmN1X3JlYWRfbG9jaygpOwogCWRkID0gcHJpdmF0ZTJkZChmaWxlKTsKIAlhdmFpbCA9IGhmaTFfcmVhZF9jbnRycyhkZCwgTlVMTCwgJmNvdW50ZXJzKTsKIAlydmFsID0gIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIGNvdW50ZXJzLCBhdmFpbCk7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIHJ2YWw7CiB9CiAKQEAgLTM1MiwxMSArMzgwLDkgQEAKIAlzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZDsKIAlzc2l6ZV90IHJ2YWw7CiAKLQlyY3VfcmVhZF9sb2NrKCk7CiAJZGQgPSBwcml2YXRlMmRkKGZpbGUpOwogCWF2YWlsID0gaGZpMV9yZWFkX2NudHJzKGRkLCAmbmFtZXMsIE5VTEwpOwogCXJ2YWwgPSAgc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgbmFtZXMsIGF2YWlsKTsKLQlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gcnZhbDsKIH0KIApAQCAtMzc5LDExICs0MDUsOSBAQAogCXN0cnVjdCBoZmkxX2RldmRhdGEgKmRkOwogCXNzaXplX3QgcnZhbDsKIAotCXJjdV9yZWFkX2xvY2soKTsKIAlkZCA9IHByaXZhdGUyZGQoZmlsZSk7CiAJYXZhaWwgPSBoZmkxX3JlYWRfcG9ydGNudHJzKGRkLT5wcG9ydCwgJm5hbWVzLCBOVUxMKTsKIAlydmFsID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgbmFtZXMsIGF2YWlsKTsKLQlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gcnZhbDsKIH0KIApAQCAtMzk2LDExICs0MjAsOSBAQAogCXN0cnVjdCBoZmkxX3Bwb3J0ZGF0YSAqcHBkOwogCXNzaXplX3QgcnZhbDsKIAotCXJjdV9yZWFkX2xvY2soKTsKIAlwcGQgPSBwcml2YXRlMnBwZChmaWxlKTsKIAlhdmFpbCA9IGhmaTFfcmVhZF9wb3J0Y250cnMocHBkLCBOVUxMLCAmY291bnRlcnMpOwogCXJ2YWwgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCBwcG9zLCBjb3VudGVycywgYXZhaWwpOwotCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiBydmFsOwogfQogCkBAIC00MzAsMTYgKzQ1MiwxMyBAQAogCWludCB1c2VkOwogCWludCBpOwogCi0JcmN1X3JlYWRfbG9jaygpOwogCXBwZCA9IHByaXZhdGUycHBkKGZpbGUpOwogCWRkID0gcHBkLT5kZDsKIAlzaXplID0gUEFHRV9TSVpFOwogCXVzZWQgPSAwOwogCXRtcCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0bXApIHsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJaWYgKCF0bXApCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXNjcmF0Y2gwID0gcmVhZF9jc3IoZGQsIEFTSUNfQ0ZHX1NDUkFUQ0gpOwogCXVzZWQgKz0gc2NucHJpbnRmKHRtcCArIHVzZWQsIHNpemUgLSB1c2VkLApAQCAtNDY2LDcgKzQ4NSw2IEBACiAJdXNlZCArPSBzY25wcmludGYodG1wICsgdXNlZCwgc2l6ZSAtIHVzZWQsICJXcml0ZSBiaXRzIHRvIGNsZWFyXG4iKTsKIAogCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIHRtcCwgdXNlZCk7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CiAJa2ZyZWUodG1wKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtNDgyLDE1ICs1MDAsMTIgQEAKIAl1NjQgc2NyYXRjaDA7CiAJdTY0IGNsZWFyOwogCi0JcmN1X3JlYWRfbG9jaygpOwogCXBwZCA9IHByaXZhdGUycHBkKGZpbGUpOwogCWRkID0gcHBkLT5kZDsKIAogCWJ1ZmYgPSBrbWFsbG9jKGNvdW50ICsgMSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWZmKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZG9fcmV0dXJuOwotCX0KKwlpZiAoIWJ1ZmYpCisJCXJldHVybiAtRU5PTUVNOwogCiAJcmV0ID0gY29weV9mcm9tX3VzZXIoYnVmZiwgYnVmLCBjb3VudCk7CiAJaWYgKHJldCA+IDApIHsKQEAgLTUyMyw4ICs1MzgsNiBAQAogCiAgZG9fZnJlZToKIAlrZnJlZShidWZmKTsKLSBkb19yZXR1cm46Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTM4LDE4ICs1NTEsMTQgQEAKIAljaGFyICp0bXA7CiAJaW50IHJldDsKIAotCXJjdV9yZWFkX2xvY2soKTsKIAlwcGQgPSBwcml2YXRlMnBwZChmaWxlKTsKIAl0bXAgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0bXApIHsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJaWYgKCF0bXApCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXJldCA9IHFzZnBfZHVtcChwcGQsIHRtcCwgUEFHRV9TSVpFKTsKIAlpZiAocmV0ID4gMCkKIAkJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgdG1wLCByZXQpOwotCXJjdV9yZWFkX3VubG9jaygpOwogCWtmcmVlKHRtcCk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTU2NSw3ICs1NzQsNiBAQAogCWludCBvZmZzZXQ7CiAJaW50IHRvdGFsX3dyaXR0ZW47CiAKLQlyY3VfcmVhZF9sb2NrKCk7CiAJcHBkID0gcHJpdmF0ZTJwcGQoZmlsZSk7CiAKIAkvKiBieXRlIG9mZnNldCBmb3JtYXQ6IFtvZmZzZXRTaXplXVtpMmNBZGRyXVtvZmZzZXRIaWdoXVtvZmZzZXRMb3ddICovCkBAIC01NzMsMTYgKzU4MSwxMiBAQAogCW9mZnNldCA9ICpwcG9zICYgMHhmZmZmOwogCiAJLyogZXhwbGljaXRseSByZWplY3QgaW52YWxpZCBhZGRyZXNzIDAgdG8gY2F0Y2ggY3AgYW5kIGNhdCAqLwotCWlmIChpMmNfYWRkciA9PSAwKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gX3JldHVybjsKLQl9CisJaWYgKGkyY19hZGRyID09IDApCisJCXJldHVybiAtRUlOVkFMOwogCiAJYnVmZiA9IGttYWxsb2MoY291bnQsIEdGUF9LRVJORUwpOwotCWlmICghYnVmZikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIF9yZXR1cm47Ci0JfQorCWlmICghYnVmZikKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlyZXQgPSBjb3B5X2Zyb21fdXNlcihidWZmLCBidWYsIGNvdW50KTsKIAlpZiAocmV0ID4gMCkgewpAQCAtNjAyLDggKzYwNiw2IEBACiAKICBfZnJlZToKIAlrZnJlZShidWZmKTsKLSBfcmV0dXJuOgotCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTYzMiw3ICs2MzQsNiBAQAogCWludCBvZmZzZXQ7CiAJaW50IHRvdGFsX3JlYWQ7CiAKLQlyY3VfcmVhZF9sb2NrKCk7CiAJcHBkID0gcHJpdmF0ZTJwcGQoZmlsZSk7CiAKIAkvKiBieXRlIG9mZnNldCBmb3JtYXQ6IFtvZmZzZXRTaXplXVtpMmNBZGRyXVtvZmZzZXRIaWdoXVtvZmZzZXRMb3ddICovCkBAIC02NDAsMTYgKzY0MSwxMiBAQAogCW9mZnNldCA9ICpwcG9zICYgMHhmZmZmOwogCiAJLyogZXhwbGljaXRseSByZWplY3QgaW52YWxpZCBhZGRyZXNzIDAgdG8gY2F0Y2ggY3AgYW5kIGNhdCAqLwotCWlmIChpMmNfYWRkciA9PSAwKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gX3JldHVybjsKLQl9CisJaWYgKGkyY19hZGRyID09IDApCisJCXJldHVybiAtRUlOVkFMOwogCiAJYnVmZiA9IGttYWxsb2MoY291bnQsIEdGUF9LRVJORUwpOwotCWlmICghYnVmZikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIF9yZXR1cm47Ci0JfQorCWlmICghYnVmZikKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAl0b3RhbF9yZWFkID0gaTJjX3JlYWQocHBkLCB0YXJnZXQsIGkyY19hZGRyLCBvZmZzZXQsIGJ1ZmYsIGNvdW50KTsKIAlpZiAodG90YWxfcmVhZCA8IDApIHsKQEAgLTY2OSw4ICs2NjYsNiBAQAogCiAgX2ZyZWU6CiAJa2ZyZWUoYnVmZik7Ci0gX3JldHVybjoKLQlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC02OTcsMjYgKzY5MiwyMCBAQAogCWludCByZXQ7CiAJaW50IHRvdGFsX3dyaXR0ZW47CiAKLQlyY3VfcmVhZF9sb2NrKCk7Ci0JaWYgKCpwcG9zICsgY291bnQgPiBRU0ZQX1BBR0VTSVpFICogNCkgeyAvKiBiYXNlIHBhZ2UgKyBwYWdlMDAtcGFnZTAzICovCi0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gX3JldHVybjsKLQl9CisJaWYgKCpwcG9zICsgY291bnQgPiBRU0ZQX1BBR0VTSVpFICogNCkgLyogYmFzZSBwYWdlICsgcGFnZTAwLXBhZ2UwMyAqLworCQlyZXR1cm4gLUVJTlZBTDsKIAogCXBwZCA9IHByaXZhdGUycHBkKGZpbGUpOwogCiAJYnVmZiA9IGttYWxsb2MoY291bnQsIEdGUF9LRVJORUwpOwotCWlmICghYnVmZikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIF9yZXR1cm47Ci0JfQorCWlmICghYnVmZikKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlyZXQgPSBjb3B5X2Zyb21fdXNlcihidWZmLCBidWYsIGNvdW50KTsKIAlpZiAocmV0ID4gMCkgewogCQlyZXQgPSAtRUZBVUxUOwogCQlnb3RvIF9mcmVlOwogCX0KLQogCXRvdGFsX3dyaXR0ZW4gPSBxc2ZwX3dyaXRlKHBwZCwgdGFyZ2V0LCAqcHBvcywgYnVmZiwgY291bnQpOwogCWlmICh0b3RhbF93cml0dGVuIDwgMCkgewogCQlyZXQgPSB0b3RhbF93cml0dGVuOwpAQCAtNzI5LDggKzcxOCw2IEBACiAKICBfZnJlZToKIAlrZnJlZShidWZmKTsKLSBfcmV0dXJuOgotCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTc1Nyw3ICs3NDQsNiBAQAogCWludCByZXQ7CiAJaW50IHRvdGFsX3JlYWQ7CiAKLQlyY3VfcmVhZF9sb2NrKCk7CiAJaWYgKCpwcG9zICsgY291bnQgPiBRU0ZQX1BBR0VTSVpFICogNCkgeyAvKiBiYXNlIHBhZ2UgKyBwYWdlMDAtcGFnZTAzICovCiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gX3JldHVybjsKQEAgLTc5MCw3ICs3NzYsNiBAQAogIF9mcmVlOgogCWtmcmVlKGJ1ZmYpOwogIF9yZXR1cm46Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtOTQ4LDYgKzkzMyw0MyBAQAogCURFQlVHRlNfT1BTKCJhc2ljX2ZsYWdzIiwgYXNpY19mbGFnc19yZWFkLCBhc2ljX2ZsYWdzX3dyaXRlKSwKIH07CiAKK3N0YXRpYyB2b2lkICpfc2RtYV9jcHVfbGlzdF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzLCBsb2ZmX3QgKnBvcykKK3sKKwlpZiAoKnBvcyA+PSBudW1fb25saW5lX2NwdXMoKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gcG9zOworfQorCitzdGF0aWMgdm9pZCAqX3NkbWFfY3B1X2xpc3Rfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwkrKypwb3M7CisJaWYgKCpwb3MgPj0gbnVtX29ubGluZV9jcHVzKCkpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIHBvczsKK30KKworc3RhdGljIHZvaWQgX3NkbWFfY3B1X2xpc3Rfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQoreworCS8qIG5vdGhpbmcgYWxsb2NhdGVkICovCit9CisKK3N0YXRpYyBpbnQgX3NkbWFfY3B1X2xpc3Rfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQoreworCXN0cnVjdCBoZmkxX2liZGV2ICppYmQgPSAoc3RydWN0IGhmaTFfaWJkZXYgKilzLT5wcml2YXRlOworCXN0cnVjdCBoZmkxX2RldmRhdGEgKmRkID0gZGRfZnJvbV9kZXYoaWJkKTsKKwlsb2ZmX3QgKnNwb3MgPSB2OworCWxvZmZfdCBpID0gKnNwb3M7CisKKwlzZG1hX3NlcWZpbGVfZHVtcF9jcHVfbGlzdChzLCBkZCwgKHVuc2lnbmVkIGxvbmcpaSk7CisJcmV0dXJuIDA7Cit9CisKK0RFQlVHRlNfU0VRX0ZJTEVfT1BTKHNkbWFfY3B1X2xpc3QpOworREVCVUdGU19TRVFfRklMRV9PUEVOKHNkbWFfY3B1X2xpc3QpCitERUJVR0ZTX0ZJTEVfT1BTKHNkbWFfY3B1X2xpc3QpOworCiB2b2lkIGhmaTFfZGJnX2liZGV2X2luaXQoc3RydWN0IGhmaTFfaWJkZXYgKmliZCkKIHsKIAljaGFyIG5hbWVbc2l6ZW9mKCJwb3J0MGNvdW50ZXJzIikgKyAxXTsKQEAgLTk3Niw2ICs5OTgsNyBAQAogCURFQlVHRlNfU0VRX0ZJTEVfQ1JFQVRFKGN0eF9zdGF0cywgaWJkLT5oZmkxX2liZGV2X2RiZywgaWJkKTsKIAlERUJVR0ZTX1NFUV9GSUxFX0NSRUFURShxcF9zdGF0cywgaWJkLT5oZmkxX2liZGV2X2RiZywgaWJkKTsKIAlERUJVR0ZTX1NFUV9GSUxFX0NSRUFURShzZGVzLCBpYmQtPmhmaTFfaWJkZXZfZGJnLCBpYmQpOworCURFQlVHRlNfU0VRX0ZJTEVfQ1JFQVRFKHNkbWFfY3B1X2xpc3QsIGliZC0+aGZpMV9pYmRldl9kYmcsIGliZCk7CiAJLyogZGV2IGNvdW50ZXIgZmlsZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjbnRyX29wcyk7IGkrKykKIAkJREVCVUdGU19GSUxFX0NSRUFURShjbnRyX29wc1tpXS5uYW1lLApAQCAtMTAwNiw3ICsxMDI5LDYgQEAKIAlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoaWJkLT5oZmkxX2liZGV2X2RiZyk7CiBvdXQ6CiAJaWJkLT5oZmkxX2liZGV2X2RiZyA9IE5VTEw7Ci0Jc3luY2hyb25pemVfcmN1KCk7CiB9CiAKIC8qCkBAIC0xMDMxLDkgKzEwNTMsNyBAQAogfTsKIAogc3RhdGljIHZvaWQgKl9kcml2ZXJfc3RhdHNfbmFtZXNfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcywgbG9mZl90ICpwb3MpCi1fX2FjcXVpcmVzKFJDVSkKIHsKLQlyY3VfcmVhZF9sb2NrKCk7CiAJaWYgKCpwb3MgPj0gQVJSQVlfU0laRShoZmkxX3N0YXRuYW1lcykpCiAJCXJldHVybiBOVUxMOwogCXJldHVybiBwb3M7CkBAIC0xMDUxLDkgKzEwNzEsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBfZHJpdmVyX3N0YXRzX25hbWVzX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKLV9fcmVsZWFzZXMoUkNVKQogewotCXJjdV9yZWFkX3VubG9jaygpOwogfQogCiBzdGF0aWMgaW50IF9kcml2ZXJfc3RhdHNfbmFtZXNfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQpAQCAtMTA2OSw5ICsxMDg3LDcgQEAKIERFQlVHRlNfRklMRV9PUFMoZHJpdmVyX3N0YXRzX25hbWVzKTsKIAogc3RhdGljIHZvaWQgKl9kcml2ZXJfc3RhdHNfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcywgbG9mZl90ICpwb3MpCi1fX2FjcXVpcmVzKFJDVSkKIHsKLQlyY3VfcmVhZF9sb2NrKCk7CiAJaWYgKCpwb3MgPj0gQVJSQVlfU0laRShoZmkxX3N0YXRuYW1lcykpCiAJCXJldHVybiBOVUxMOwogCXJldHVybiBwb3M7CkBAIC0xMDg2LDkgKzExMDIsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBfZHJpdmVyX3N0YXRzX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKLV9fcmVsZWFzZXMoUkNVKQogewotCXJjdV9yZWFkX3VubG9jaygpOwogfQogCiBzdGF0aWMgdTY0IGhmaTFfc3BzX2ludHModm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2RyaXZlci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvZHJpdmVyLmMKaW5kZXggODI0NmRjNy4uNjU2M2U0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvZHJpdmVyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvZHJpdmVyLmMKQEAgLTI3Niw3ICsyNzYsNyBAQAogc3RhdGljIHZvaWQgcmN2X2hkcmVycihzdHJ1Y3QgaGZpMV9jdHh0ZGF0YSAqcmNkLCBzdHJ1Y3QgaGZpMV9wcG9ydGRhdGEgKnBwZCwKIAkJICAgICAgIHN0cnVjdCBoZmkxX3BhY2tldCAqcGFja2V0KQogewotCXN0cnVjdCBoZmkxX21lc3NhZ2VfaGVhZGVyICpyaGRyID0gcGFja2V0LT5oZHI7CisJc3RydWN0IGliX2hlYWRlciAqcmhkciA9IHBhY2tldC0+aGRyOwogCXUzMiBydGUgPSByaGZfcmN2X3R5cGVfZXJyKHBhY2tldC0+cmhmKTsKIAlpbnQgbG5oID0gYmUxNl90b19jcHUocmhkci0+bHJoWzBdKSAmIDM7CiAJc3RydWN0IGhmaTFfaWJwb3J0ICppYnAgPSAmcHBkLT5pYnBvcnRfZGF0YTsKQEAgLTI4OCwxMCArMjg4LDkgQEAKIAogCWlmIChwYWNrZXQtPnJoZiAmIFJIRl9USURfRVJSKSB7CiAJCS8qIEZvciBUSURFUlIgYW5kIFJDIFFQcyBwcmVlbXB0aXZlbHkgc2NoZWR1bGUgYSBOQUsgKi8KLQkJc3RydWN0IGhmaTFfaWJfaGVhZGVyICpoZHIgPSAoc3RydWN0IGhmaTFfaWJfaGVhZGVyICopcmhkcjsKLQkJc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyAqb2hkciA9IE5VTEw7CisJCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyID0gTlVMTDsKIAkJdTMyIHRsZW4gPSByaGZfcGt0X2xlbihwYWNrZXQtPnJoZik7IC8qIGluIGJ5dGVzICovCi0JCXUxNiBsaWQgID0gYmUxNl90b19jcHUoaGRyLT5scmhbMV0pOworCQl1MTYgbGlkICA9IGJlMTZfdG9fY3B1KHJoZHItPmxyaFsxXSk7CiAJCXUzMiBxcF9udW07CiAJCXUzMiByY3ZfZmxhZ3MgPSAwOwogCkBAIC0zMDEsMTQgKzMwMCwxNCBAQAogCiAJCS8qIENoZWNrIGZvciBHUkggKi8KIAkJaWYgKGxuaCA9PSBIRkkxX0xSSF9CVEgpIHsKLQkJCW9oZHIgPSAmaGRyLT51Lm90aDsKKwkJCW9oZHIgPSAmcmhkci0+dS5vdGg7CiAJCX0gZWxzZSBpZiAobG5oID09IEhGSTFfTFJIX0dSSCkgewogCQkJdTMyIHZ0ZjsKIAotCQkJb2hkciA9ICZoZHItPnUubC5vdGg7Ci0JCQlpZiAoaGRyLT51LmwuZ3JoLm5leHRfaGRyICE9IElCX0dSSF9ORVhUX0hEUikKKwkJCW9oZHIgPSAmcmhkci0+dS5sLm90aDsKKwkJCWlmIChyaGRyLT51LmwuZ3JoLm5leHRfaGRyICE9IElCX0dSSF9ORVhUX0hEUikKIAkJCQlnb3RvIGRyb3A7Ci0JCQl2dGYgPSBiZTMyX3RvX2NwdShoZHItPnUubC5ncmgudmVyc2lvbl90Y2xhc3NfZmxvdyk7CisJCQl2dGYgPSBiZTMyX3RvX2NwdShyaGRyLT51LmwuZ3JoLnZlcnNpb25fdGNsYXNzX2Zsb3cpOwogCQkJaWYgKCh2dGYgPj4gSUJfR1JIX1ZFUlNJT05fU0hJRlQpICE9IElCX0dSSF9WRVJTSU9OKQogCQkJCWdvdG8gZHJvcDsKIAkJCXJjdl9mbGFncyB8PSBIRkkxX0hBU19HUkg7CkBAIC0zNDQsNyArMzQzLDcgQEAKIAkJCWNhc2UgSUJfUVBUX1JDOgogCQkJCWhmaTFfcmNfaGRyZXJyKAogCQkJCQlyY2QsCi0JCQkJCWhkciwKKwkJCQkJcmhkciwKIAkJCQkJcmN2X2ZsYWdzLAogCQkJCQlxcCk7CiAJCQkJYnJlYWs7CkBAIC00NTIsOCArNDUxLDggQEAKIAkJCSAgICAgICBib29sIGRvX2NucCkKIHsKIAlzdHJ1Y3QgaGZpMV9pYnBvcnQgKmlicCA9IHRvX2lwb3J0KHFwLT5pYnFwLmRldmljZSwgcXAtPnBvcnRfbnVtKTsKLQlzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgKmhkciA9IHBrdC0+aGRyOwotCXN0cnVjdCBoZmkxX290aGVyX2hlYWRlcnMgKm9oZHIgPSBwa3QtPm9oZHI7CisJc3RydWN0IGliX2hlYWRlciAqaGRyID0gcGt0LT5oZHI7CisJc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHIgPSBwa3QtPm9oZHI7CiAJc3RydWN0IGliX2dyaCAqZ3JoID0gTlVMTDsKIAl1MzIgcnFwbiA9IDAsIGJ0aDE7CiAJdTE2IHJsaWQsIGRsaWQgPSBiZTE2X3RvX2NwdShoZHItPmxyaFsxXSk7CkBAIC00ODcsNyArNDg2LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCXNjID0gaGRyMnNjKChzdHJ1Y3QgaGZpMV9tZXNzYWdlX2hlYWRlciAqKWhkciwgcGt0LT5yaGYpOworCXNjID0gaGRyMnNjKGhkciwgcGt0LT5yaGYpOwogCiAJYnRoMSA9IGJlMzJfdG9fY3B1KG9oZHItPmJ0aFsxXSk7CiAJaWYgKGRvX2NucCAmJiAoYnRoMSAmIEhGSTFfRkVDTl9TTUFTSykpIHsKQEAgLTU5OSw4ICs1OTgsOCBAQAogCQlfX2xlMzIgKnJoZl9hZGRyID0gKF9fbGUzMiAqKXJjZC0+cmN2aGRycSArIG1kYXRhLnBzX2hlYWQgKwogCQkJCQkgZGQtPnJoZl9vZmZzZXQ7CiAJCXN0cnVjdCBydnRfcXAgKnFwOwotCQlzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgKmhkcjsKLQkJc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyAqb2hkcjsKKwkJc3RydWN0IGliX2hlYWRlciAqaGRyOworCQlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKIAkJc3RydWN0IHJ2dF9kZXZfaW5mbyAqcmRpID0gJmRkLT52ZXJic19kZXYucmRpOwogCQl1NjQgcmhmID0gcmhmX3RvX2NwdShyaGZfYWRkcik7CiAJCXUzMiBldHlwZSA9IHJoZl9yY3ZfdHlwZShyaGYpLCBxcG4sIGJ0aDE7CkBAIC02MTYsOCArNjE1LDggQEAKIAkJaWYgKGV0eXBlICE9IFJIRl9SQ1ZfVFlQRV9JQikKIAkJCWdvdG8gbmV4dDsKIAotCQloZHIgPSAoc3RydWN0IGhmaTFfaWJfaGVhZGVyICopCi0JCQloZmkxX2dldF9tc2doZWFkZXIoZGQsIHJoZl9hZGRyKTsKKwkJaGRyID0gaGZpMV9nZXRfbXNnaGVhZGVyKGRkLCByaGZfYWRkcik7CisKIAkJbG5oID0gYmUxNl90b19jcHUoaGRyLT5scmhbMF0pICYgMzsKIAogCQlpZiAobG5oID09IEhGSTFfTFJIX0JUSCkKQEAgLTg4OCwxNCArODg3LDE1IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHNldF9hcm1lZF90b19hY3RpdmUoc3RydWN0IGhmaTFfY3R4dGRhdGEgKnJjZCwKLQkJCQkgICAgICBzdHJ1Y3QgaGZpMV9wYWNrZXQgcGFja2V0LAorCQkJCSAgICAgIHN0cnVjdCBoZmkxX3BhY2tldCAqcGFja2V0LAogCQkJCSAgICAgIHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkKQogewogCXN0cnVjdCB3b3JrX3N0cnVjdCAqbHNhdyA9ICZyY2QtPnBwZC0+bGlua3N0YXRlX2FjdGl2ZV93b3JrOwotCXN0cnVjdCBoZmkxX21lc3NhZ2VfaGVhZGVyICpoZHIgPSBoZmkxX2dldF9tc2doZWFkZXIocGFja2V0LnJjZC0+ZGQsCi0JCQkJCQkJICAgICBwYWNrZXQucmhmX2FkZHIpOworCXN0cnVjdCBpYl9oZWFkZXIgKmhkciA9IGhmaTFfZ2V0X21zZ2hlYWRlcihwYWNrZXQtPnJjZC0+ZGQsCisJCQkJCQkgICBwYWNrZXQtPnJoZl9hZGRyKTsKKwl1OCBldHlwZSA9IHJoZl9yY3ZfdHlwZShwYWNrZXQtPnJoZik7CiAKLQlpZiAoaGRyMnNjKGhkciwgcGFja2V0LnJoZikgIT0gMHhmKSB7CisJaWYgKGV0eXBlID09IFJIRl9SQ1ZfVFlQRV9JQiAmJiBoZHIyc2MoaGRyLCBwYWNrZXQtPnJoZikgIT0gMHhmKSB7CiAJCWludCBod3N0YXRlID0gcmVhZF9sb2dpY2FsX3N0YXRlKGRkKTsKIAogCQlpZiAoaHdzdGF0ZSAhPSBMU1RBVEVfQUNUSVZFKSB7CkBAIC05NzksNyArOTc5LDcgQEAKIAkJCS8qIEF1dG8gYWN0aXZhdGUgbGluayBvbiBub24tU0MxNSBwYWNrZXQgcmVjZWl2ZSAqLwogCQkJaWYgKHVubGlrZWx5KHJjZC0+cHBkLT5ob3N0X2xpbmtfc3RhdGUgPT0KIAkJCQkgICAgIEhMU19VUF9BUk1FRCkgJiYKLQkJCSAgICBzZXRfYXJtZWRfdG9fYWN0aXZlKHJjZCwgcGFja2V0LCBkZCkpCisJCQkgICAgc2V0X2FybWVkX3RvX2FjdGl2ZShyY2QsICZwYWNrZXQsIGRkKSkKIAkJCQlnb3RvIGJhaWw7CiAJCQlsYXN0ID0gcHJvY2Vzc19yY3ZfcGFja2V0KCZwYWNrZXQsIHRocmVhZCk7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2Vwcm9tLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9lcHJvbS5jCmluZGV4IDM2Yjc3OTQuLmU3MGMyMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2Vwcm9tLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvZXByb20uYwpAQCAtNDksNyArNDksMjYgQEAKICNpbmNsdWRlICJjb21tb24uaCIKICNpbmNsdWRlICJlcHJvbS5oIgogCisvKgorICogVGhlIEVQUk9NIGlzIGxvZ2ljYWxseSBkaXZpZGVkIGludG8gdGhyZWUgcGFydGl0aW9uczoKKyAqCXBhcnRpdGlvbiAwOiB0aGUgZmlyc3QgMTI4SywgdmlzaWJsZSBmcm9tIFBDSSBST00gQkFSCisgKglwYXJ0aXRpb24gMTogNEsgY29uZmlnIGZpbGUgKHNlY3RvciBzaXplKQorICoJcGFydGl0aW9uIDI6IHRoZSByZXN0CisgKi8KKyNkZWZpbmUgUDBfU0laRSAoMTI4ICogMTAyNCkKKyNkZWZpbmUgUDFfU0laRSAgICg0ICogMTAyNCkKKyNkZWZpbmUgUDFfU1RBUlQgUDBfU0laRQorI2RlZmluZSBQMl9TVEFSVCAoUDBfU0laRSArIFAxX1NJWkUpCisKKy8qIGNvbnRyb2xsZXIgcGFnZSBzaXplLCBpbiBieXRlcyAqLworI2RlZmluZSBFUF9QQUdFX1NJWkUgMjU2CisjZGVmaW5lIEVQX1BBR0VfTUFTSyAoRVBfUEFHRV9TSVpFIC0gMSkKKyNkZWZpbmUgRVBfUEFHRV9EV09SRFMgKEVQX1BBR0VfU0laRSAvIHNpemVvZih1MzIpKQorCisvKiBjb250cm9sbGVyIGNvbW1hbmRzICovCiAjZGVmaW5lIENNRF9TSElGVCAyNAorI2RlZmluZSBDTURfTk9QCQkJICAgICgwKQorI2RlZmluZSBDTURfUkVBRF9EQVRBKGFkZHIpCSAgICAoKDB4MDMgPDwgQ01EX1NISUZUKSB8IGFkZHIpCiAjZGVmaW5lIENNRF9SRUxFQVNFX1BPV0VSRE9XTl9OT0lEICAoKDB4YWIgPDwgQ01EX1NISUZUKSkKIAogLyogY29udHJvbGxlciBpbnRlcmZhY2Ugc3BlZWRzICovCkBAIC02MSw2ICs4MCw5MCBAQAogICogRG91YmxlIGl0IGZvciBzYWZldHkuCiAgKi8KICNkZWZpbmUgRVBST01fVElNRU9VVCA4MDAwMCAvKiBtcyAqLworCisvKgorICogUmVhZCBhIDI1NiBieXRlICg2NCBkd29yZCkgRVBST00gcGFnZS4KKyAqIEFsbCBjYWxsZXJzIGhhdmUgdmVyaWZpZWQgdGhlIG9mZnNldCBpcyBhdCBhIHBhZ2UgYm91bmRhcnkuCisgKi8KK3N0YXRpYyB2b2lkIHJlYWRfcGFnZShzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCwgdTMyIG9mZnNldCwgdTMyICpyZXN1bHQpCit7CisJaW50IGk7CisKKwl3cml0ZV9jc3IoZGQsIEFTSUNfRUVQX0FERFJfQ01ELCBDTURfUkVBRF9EQVRBKG9mZnNldCkpOworCWZvciAoaSA9IDA7IGkgPCBFUF9QQUdFX0RXT1JEUzsgaSsrKQorCQlyZXN1bHRbaV0gPSAodTMyKXJlYWRfY3NyKGRkLCBBU0lDX0VFUF9EQVRBKTsKKwl3cml0ZV9jc3IoZGQsIEFTSUNfRUVQX0FERFJfQ01ELCBDTURfTk9QKTsgLyogY2xvc2Ugb3BlbiBwYWdlICovCit9CisKKy8qCisgKiBSZWFkIGxlbmd0aCBieXRlcyBzdGFydGluZyBhdCBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIEVQUk9NLgorICovCitzdGF0aWMgaW50IHJlYWRfbGVuZ3RoKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLCB1MzIgc3RhcnQsIHUzMiBsZW4sIHZvaWQgKmRlc3QpCit7CisJdTMyIGJ1ZmZlcltFUF9QQUdFX0RXT1JEU107CisJdTMyIGVuZDsKKwl1MzIgc3RhcnRfb2Zmc2V0OworCXUzMiByZWFkX3N0YXJ0OworCXUzMiBieXRlczsKKworCWlmIChsZW4gPT0gMCkKKwkJcmV0dXJuIDA7CisKKwllbmQgPSBzdGFydCArIGxlbjsKKworCS8qCisJICogTWFrZSBzdXJlIHRoZSByZWFkIHJhbmdlIGlzIG5vdCBvdXRzaWRlIG9mIHRoZSBjb250cm9sbGVyIHJlYWQKKwkgKiBjb21tYW5kIGFkZHJlc3MgcmFuZ2UuICBOb3RlIHRoYXQgJz4nIGlzIGNvcnJlY3QgYmVsb3cgLSB0aGUgZW5kCisJICogb2YgdGhlIHJhbmdlIGlzIE9LIGlmIGl0IHN0b3BzIGF0IHRoZSBsaW1pdCwgYnV0IG5vIGhpZ2hlci4KKwkgKi8KKwlpZiAoZW5kID4gKDEgPDwgQ01EX1NISUZUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiByZWFkIHRoZSBmaXJzdCBwYXJ0aWFsIHBhZ2UgKi8KKwlzdGFydF9vZmZzZXQgPSBzdGFydCAmIEVQX1BBR0VfTUFTSzsKKwlpZiAoc3RhcnRfb2Zmc2V0KSB7CisJCS8qIHBhcnRpYWwgc3RhcnRpbmcgcGFnZSAqLworCisJCS8qIGFsaWduIGFuZCByZWFkIHRoZSBwYWdlIHRoYXQgY29udGFpbnMgdGhlIHN0YXJ0ICovCisJCXJlYWRfc3RhcnQgPSBzdGFydCAmIH5FUF9QQUdFX01BU0s7CisJCXJlYWRfcGFnZShkZCwgcmVhZF9zdGFydCwgYnVmZmVyKTsKKworCQkvKiB0aGUgcmVzdCBvZiB0aGUgcGFnZSBpcyBhdmFpbGFibGUgZGF0YSAqLworCQlieXRlcyA9IEVQX1BBR0VfU0laRSAtIHN0YXJ0X29mZnNldDsKKworCQlpZiAobGVuIDw9IGJ5dGVzKSB7CisJCQkvKiBlbmQgaXMgd2l0aGluIHRoaXMgcGFnZSAqLworCQkJbWVtY3B5KGRlc3QsICh1OCAqKWJ1ZmZlciArIHN0YXJ0X29mZnNldCwgbGVuKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJbWVtY3B5KGRlc3QsICh1OCAqKWJ1ZmZlciArIHN0YXJ0X29mZnNldCwgYnl0ZXMpOworCisJCXN0YXJ0ICs9IGJ5dGVzOworCQlsZW4gLT0gYnl0ZXM7CisJCWRlc3QgKz0gYnl0ZXM7CisJfQorCS8qIHN0YXJ0IGlzIG5vdyBwYWdlIGFsaWduZWQgKi8KKworCS8qIHJlYWQgd2hvbGUgcGFnZXMgKi8KKwl3aGlsZSAobGVuID49IEVQX1BBR0VfU0laRSkgeworCQlyZWFkX3BhZ2UoZGQsIHN0YXJ0LCBidWZmZXIpOworCQltZW1jcHkoZGVzdCwgYnVmZmVyLCBFUF9QQUdFX1NJWkUpOworCisJCXN0YXJ0ICs9IEVQX1BBR0VfU0laRTsKKwkJbGVuIC09IEVQX1BBR0VfU0laRTsKKwkJZGVzdCArPSBFUF9QQUdFX1NJWkU7CisJfQorCisJLyogcmVhZCB0aGUgbGFzdCBwYXJ0aWFsIHBhZ2UgKi8KKwlpZiAobGVuKSB7CisJCXJlYWRfcGFnZShkZCwgc3RhcnQsIGJ1ZmZlcik7CisJCW1lbWNweShkZXN0LCBidWZmZXIsIGxlbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBJbml0aWFsaXplIHRoZSBFUFJPTSBoYW5kbGVyLgogICovCkBAIC0xMDAsMyArMjAzLDg1IEBACiBkb25lX2FzaWM6CiAJcmV0dXJuIHJldDsKIH0KKworLyogbWFnaWMgY2hhcmFjdGVyIHNlcXVlbmNlIHRoYXQgdHJhaWxzIGFuIGltYWdlICovCisjZGVmaW5lIElNQUdFX1RSQUlMX01BR0lDICJlZ2FtaUFQTyIKKworLyoKKyAqIFJlYWQgYWxsIG9mIHBhcnRpdGlvbiAxLiAgVGhlIGFjdHVhbCBmaWxlIGlzIGF0IHRoZSBmcm9udC4gIEFkanVzdAorICogdGhlIHJldHVybmVkIHNpemUgaWYgYSB0cmFpbGluZyBpbWFnZSBtYWdpYyBpcyBmb3VuZC4KKyAqLworc3RhdGljIGludCByZWFkX3BhcnRpdGlvbl9wbGF0Zm9ybV9jb25maWcoc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsIHZvaWQgKipkYXRhLAorCQkJCQkgIHUzMiAqc2l6ZSkKK3sKKwl2b2lkICpidWZmZXI7CisJdm9pZCAqcDsKKwl1MzIgbGVuZ3RoOworCWludCByZXQ7CisKKwlidWZmZXIgPSBrbWFsbG9jKFAxX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghYnVmZmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IHJlYWRfbGVuZ3RoKGRkLCBQMV9TVEFSVCwgUDFfU0laRSwgYnVmZmVyKTsKKwlpZiAocmV0KSB7CisJCWtmcmVlKGJ1ZmZlcik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogc2NhbiBmb3IgaW1hZ2UgbWFnaWMgdGhhdCBtYXkgdHJhaWwgdGhlIGFjdHVhbCBkYXRhICovCisJcCA9IHN0cm5zdHIoYnVmZmVyLCBJTUFHRV9UUkFJTF9NQUdJQywgUDFfU0laRSk7CisJaWYgKHApCisJCWxlbmd0aCA9IHAgLSBidWZmZXI7CisJZWxzZQorCQlsZW5ndGggPSBQMV9TSVpFOworCisJKmRhdGEgPSBidWZmZXI7CisJKnNpemUgPSBsZW5ndGg7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBwbGF0Zm9ybSBjb25maWd1cmF0aW9uIGZpbGUgZnJvbSB0aGUgRVBST00uCisgKgorICogT24gc3VjY2VzcywgYW4gYWxsb2NhdGVkIGJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhIGFuZCBpdHMgc2l6ZSBhcmUKKyAqIHJldHVybmVkLiAgSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBmcmVlIHRoaXMgYnVmZmVyLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqICAgMAkgICAgICAtIHN1Y2Nlc3MKKyAqICAgLUVOWElPICAgLSBubyBFUFJPTSBpcyBhdmFpbGFibGUKKyAqICAgLUVCVVNZICAgLSBub3QgYWJsZSB0byBhY3F1aXJlIGFjY2VzcyB0byB0aGUgRVBST00KKyAqICAgLUVOT0VOVCAgLSBubyByZWNvZ25pemFibGUgZmlsZSB3cml0dGVuCisgKiAgIC1FTk9NRU0gIC0gYnVmZmVyIGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQKKyAqLworaW50IGVwcm9tX3JlYWRfcGxhdGZvcm1fY29uZmlnKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLCB2b2lkICoqZGF0YSwgdTMyICpzaXplKQoreworCXUzMiBkaXJlY3RvcnlbRVBfUEFHRV9EV09SRFNdOyAvKiBhbGlnbmVkIGJ1ZmZlciAqLworCWludCByZXQ7CisKKwlpZiAoIWRkLT5lcHJvbV9hdmFpbGFibGUpCisJCXJldHVybiAtRU5YSU87CisKKwlyZXQgPSBhY3F1aXJlX2NoaXBfcmVzb3VyY2UoZGQsIENSX0VQUk9NLCBFUFJPTV9USU1FT1VUKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogcmVhZCB0aGUgbGFzdCBwYWdlIG9mIFAwIGZvciB0aGUgRVBST00gZm9ybWF0IG1hZ2ljICovCisJcmV0ID0gcmVhZF9sZW5ndGgoZGQsIFAxX1NUQVJUIC0gRVBfUEFHRV9TSVpFLCBFUF9QQUdFX1NJWkUsIGRpcmVjdG9yeSk7CisJaWYgKHJldCkKKwkJZ290byBkb25lOworCisJLyogbGFzdCBkd29yZCBvZiBQMCBjb250YWlucyBhIG1hZ2ljIGluZGljYXRvciAqLworCWlmIChkaXJlY3RvcnlbRVBfUEFHRV9EV09SRFMgLSAxXSA9PSAwKSB7CisJCS8qIHBhcnRpdGlvbiBmb3JtYXQgKi8KKwkJcmV0ID0gcmVhZF9wYXJ0aXRpb25fcGxhdGZvcm1fY29uZmlnKGRkLCBkYXRhLCBzaXplKTsKKwkJZ290byBkb25lOworCX0KKworCS8qIG5vdGhpbmcgcmVjb2duaXplZCAqLworCXJldCA9IC1FTk9FTlQ7CisKK2RvbmU6CisJcmVsZWFzZV9jaGlwX3Jlc291cmNlKGRkLCBDUl9FUFJPTSk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2Vwcm9tLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9lcHJvbS5oCmluZGV4IGQ0MWYwYjEuLmU3NzQxODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2Vwcm9tLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvZXByb20uaApAQCAtNDUsOCArNDUsOCBAQAogICoKICAqLwogCi1zdHJ1Y3QgaGZpMV9jbWQ7CiBzdHJ1Y3QgaGZpMV9kZXZkYXRhOwogCiBpbnQgZXByb21faW5pdChzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCk7Ci1pbnQgaGFuZGxlX2Vwcm9tX2NvbW1hbmQoc3RydWN0IGZpbGUgKmZwLCBjb25zdCBzdHJ1Y3QgaGZpMV9jbWQgKmNtZCk7CitpbnQgZXByb21fcmVhZF9wbGF0Zm9ybV9jb25maWcoc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsIHZvaWQgKipidWZfcmV0LAorCQkJICAgICAgIHUzMiAqc2l6ZV9yZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvZmlsZV9vcHMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2ZpbGVfb3BzLmMKaW5kZXggMWVjYmVjMS4uNjc3ZWZhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvZmlsZV9vcHMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9maWxlX29wcy5jCkBAIC01OCw3ICs1OCw2IEBACiAjaW5jbHVkZSAidHJhY2UuaCIKICNpbmNsdWRlICJ1c2VyX3NkbWEuaCIKICNpbmNsdWRlICJ1c2VyX2V4cF9yY3YuaCIKLSNpbmNsdWRlICJlcHJvbS5oIgogI2luY2x1ZGUgImFzcG0uaCIKICNpbmNsdWRlICJtbXVfcmIuaCIKIApAQCAtMTgzLDYgKzE4Miw3IEBACiAJaWYgKGZkKSB7CiAJCWZkLT5yZWNfY3B1X251bSA9IC0xOyAvKiBubyBjcHUgYWZmaW5pdHkgYnkgZGVmYXVsdCAqLwogCQlmZC0+bW0gPSBjdXJyZW50LT5tbTsKKwkJYXRvbWljX2luYygmZmQtPm1tLT5tbV9jb3VudCk7CiAJfQogCiAJZnAtPnByaXZhdGVfZGF0YSA9IGZkOwpAQCAtMjIyLDcgKzIyMiw3IEBACiAJCXJldCA9IGFzc2lnbl9jdHh0KGZwLCAmdWluZm8pOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7Ci0JCXNldHVwX2N0eHQoZnApOworCQlyZXQgPSBzZXR1cF9jdHh0KGZwKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJCXJldCA9IHVzZXJfaW5pdChmcCk7CkBAIC00MzksOSArNDM5LDEwIEBACiAJc3RydWN0IGhmaTFfZmlsZWRhdGEgKmZkID0gZnAtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgaGZpMV9jdHh0ZGF0YSAqdWN0eHQgPSBmZC0+dWN0eHQ7CiAJc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgcGZuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTY0IHRva2VuID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZULAogCQltZW1hZGRyID0gMDsKKwl2b2lkICptZW12aXJ0ID0gTlVMTDsKIAl1OCBzdWJjdHh0LCBtYXBpbyA9IDAsIHZtZiA9IDAsIHR5cGU7CiAJc3NpemVfdCBtZW1sZW4gPSAwOwogCWludCByZXQgPSAwOwpAQCAtNDkyLDcgKzQ5Myw4IEBACiAJCSAqIHNlY29uZCBvciB0aGlyZCBwYWdlIGFsbG9jYXRlZCBmb3IgY3JlZGl0IHJldHVybnMgKGlmIG51bWJlcgogCQkgKiBvZiBlbmFibGVkIGNvbnRleHRzID4gNjQgYW5kIDEyOCByZXNwZWN0aXZlbHkpLgogCQkgKi8KLQkJbWVtYWRkciA9IGRkLT5jcl9iYXNlW3VjdHh0LT5udW1hX2lkXS5wYSArCisJCW1lbXZpcnQgPSBkZC0+Y3JfYmFzZVt1Y3R4dC0+bnVtYV9pZF0udmE7CisJCW1lbWFkZHIgPSB2aXJ0X3RvX3BoeXMobWVtdmlydCkgKwogCQkJKCgodTY0KXVjdHh0LT5zYy0+aHdfZnJlZSAtCiAJCQkgICh1NjQpZGQtPmNyX2Jhc2VbdWN0eHQtPm51bWFfaWRdLnZhKSAmIFBBR0VfTUFTSyk7CiAJCW1lbWxlbiA9IFBBR0VfU0laRTsKQEAgLTUwNyw4ICs1MDksOCBAQAogCQltYXBpbyA9IDE7CiAJCWJyZWFrOwogCWNhc2UgUkNWX0hEUlE6Ci0JCW1lbWFkZHIgPSB1Y3R4dC0+cmN2aGRycV9waHlzOwogCQltZW1sZW4gPSB1Y3R4dC0+cmN2aGRycV9zaXplOworCQltZW12aXJ0ID0gdWN0eHQtPnJjdmhkcnE7CiAJCWJyZWFrOwogCWNhc2UgUkNWX0VHUkJVRjogewogCQl1bnNpZ25lZCBsb25nIGFkZHI7CkBAIC01MzIsMTQgKzUzNCwyMSBAQAogCQl2bWEtPnZtX2ZsYWdzICY9IH5WTV9NQVlXUklURTsKIAkJYWRkciA9IHZtYS0+dm1fc3RhcnQ7CiAJCWZvciAoaSA9IDAgOyBpIDwgdWN0eHQtPmVncmJ1ZnMubnVtYnVmczsgaSsrKSB7CisJCQltZW1sZW4gPSB1Y3R4dC0+ZWdyYnVmcy5idWZmZXJzW2ldLmxlbjsKKwkJCW1lbXZpcnQgPSB1Y3R4dC0+ZWdyYnVmcy5idWZmZXJzW2ldLmFkZHI7CiAJCQlyZXQgPSByZW1hcF9wZm5fcmFuZ2UoCiAJCQkJdm1hLCBhZGRyLAotCQkJCXVjdHh0LT5lZ3JidWZzLmJ1ZmZlcnNbaV0ucGh5cyA+PiBQQUdFX1NISUZULAotCQkJCXVjdHh0LT5lZ3JidWZzLmJ1ZmZlcnNbaV0ubGVuLAorCQkJCS8qCisJCQkJICogdmlydF90b19wZm4oKSBkb2VzIHRoZSBzYW1lLCBidXQKKwkJCQkgKiBpdCdzIG5vdCBhdmFpbGFibGUgb24geDg2XzY0CisJCQkJICogd2hlbiBDT05GSUdfTU1VIGlzIGVuYWJsZWQuCisJCQkJICovCisJCQkJUEZOX0RPV04oX19wYShtZW12aXJ0KSksCisJCQkJbWVtbGVuLAogCQkJCXZtYS0+dm1fcGFnZV9wcm90KTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCWdvdG8gZG9uZTsKLQkJCWFkZHIgKz0gdWN0eHQtPmVncmJ1ZnMuYnVmZmVyc1tpXS5sZW47CisJCQlhZGRyICs9IG1lbWxlbjsKIAkJfQogCQlyZXQgPSAwOwogCQlnb3RvIGRvbmU7CkBAIC01OTUsOCArNjA0LDggQEAKIAkJCXJldCA9IC1FUEVSTTsKIAkJCWdvdG8gZG9uZTsKIAkJfQotCQltZW1hZGRyID0gdWN0eHQtPnJjdmhkcnF0YWlsYWRkcl9waHlzOwogCQltZW1sZW4gPSBQQUdFX1NJWkU7CisJCW1lbXZpcnQgPSAodm9pZCAqKXVjdHh0LT5yY3ZoZHJ0YWlsX2t2YWRkcjsKIAkJZmxhZ3MgJj0gflZNX01BWVdSSVRFOwogCQlicmVhazsKIAljYXNlIFNVQkNUWFRfVVJFR1M6CkBAIC02NDksMTYgKzY1OCwyNCBAQAogCQkgICIldToldSB0eXBlOiV1IGlvL3ZmOiVkLyVkLCBhZGRyOjB4JWxseCwgbGVuOiVsdSglbHUpLCBmbGFnczoweCVseFxuIiwKIAkJICAgIGN0eHQsIHN1YmN0eHQsIHR5cGUsIG1hcGlvLCB2bWYsIG1lbWFkZHIsIG1lbWxlbiwKIAkJICAgIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwgdm1hLT52bV9mbGFncyk7Ci0JcGZuID0gKHVuc2lnbmVkIGxvbmcpKG1lbWFkZHIgPj4gUEFHRV9TSElGVCk7CiAJaWYgKHZtZikgewotCQl2bWEtPnZtX3Bnb2ZmID0gcGZuOworCQl2bWEtPnZtX3Bnb2ZmID0gUEZOX0RPV04obWVtYWRkcik7CiAJCXZtYS0+dm1fb3BzID0gJnZtX29wczsKIAkJcmV0ID0gMDsKIAl9IGVsc2UgaWYgKG1hcGlvKSB7Ci0JCXJldCA9IGlvX3JlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIHBmbiwgbWVtbGVuLAorCQlyZXQgPSBpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAorCQkJCQkgUEZOX0RPV04obWVtYWRkciksCisJCQkJCSBtZW1sZW4sCiAJCQkJCSB2bWEtPnZtX3BhZ2VfcHJvdCk7CisJfSBlbHNlIGlmIChtZW12aXJ0KSB7CisJCXJldCA9IHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQkJICAgICAgUEZOX0RPV04oX19wYShtZW12aXJ0KSksCisJCQkJICAgICAgbWVtbGVuLAorCQkJCSAgICAgIHZtYS0+dm1fcGFnZV9wcm90KTsKIAl9IGVsc2UgewotCQlyZXQgPSByZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCBwZm4sIG1lbWxlbiwKKwkJcmV0ID0gcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKKwkJCQkgICAgICBQRk5fRE9XTihtZW1hZGRyKSwKKwkJCQkgICAgICBtZW1sZW4sCiAJCQkJICAgICAgdm1hLT52bV9wYWdlX3Byb3QpOwogCX0KIGRvbmU6CkBAIC03NzksNiArNzk2LDcgQEAKIAltdXRleF91bmxvY2soJmhmaTFfbXV0ZXgpOwogCWhmaTFfZnJlZV9jdHh0ZGF0YShkZCwgdWN0eHQpOwogZG9uZToKKwltbWRyb3AoZmRhdGEtPm1tKTsKIAlrb2JqZWN0X3B1dCgmZGQtPmtvYmopOwogCWtmcmVlKGZkYXRhKTsKIAlyZXR1cm4gMDsKQEAgLTk1OSwxNCArOTc3LDE2IEBACiAJICovCiAJdWN0eHQtPnNjID0gc2NfYWxsb2MoZGQsIFNDX1VTRVIsIHVjdHh0LT5yY3ZoZHJxZW50c2l6ZSwKIAkJCSAgICAgdWN0eHQtPmRkLT5ub2RlKTsKLQlpZiAoIXVjdHh0LT5zYykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KKwlpZiAoIXVjdHh0LT5zYykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGN0eGRhdGFfZnJlZTsKKwl9CiAJaGZpMV9jZGJnKFBST0MsICJhbGxvY2F0ZWQgc2VuZCBjb250ZXh0ICV1KCV1KVxuIiwgdWN0eHQtPnNjLT5zd19pbmRleCwKIAkJICB1Y3R4dC0+c2MtPmh3X2NvbnRleHQpOwogCXJldCA9IHNjX2VuYWJsZSh1Y3R4dC0+c2MpOwogCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJCWdvdG8gY3R4ZGF0YV9mcmVlOworCiAJLyoKIAkgKiBTZXR1cCBzaGFyZWQgY29udGV4dCByZXNvdXJjZXMgaWYgdGhlIHVzZXItbGV2ZWwgaGFzIHJlcXVlc3RlZAogCSAqIHNoYXJlZCBjb250ZXh0cyBhbmQgdGhpcyBpcyB0aGUgJ21hc3RlcicgcHJvY2Vzcy4KQEAgLTk4MCw3ICsxMDAwLDcgQEAKIAkJICogc2VuZCBjb250ZXh0IGJlY2F1c2UgaXQgd2lsbCBiZSBkb25lIGR1cmluZyBmaWxlIGNsb3NlCiAJCSAqLwogCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gY3R4ZGF0YV9mcmVlOwogCX0KIAl1Y3R4dC0+dXNlcnZlcnNpb24gPSB1aW5mby0+dXNlcnZlcnNpb247CiAJdWN0eHQtPmZsYWdzID0gaGZpMV9jYXBfbWFzazsgLyogc2F2ZSBjdXJyZW50IGZsYWcgc3RhdGUgKi8KQEAgLTEwMDAsNiArMTAyMCwxMSBAQAogCWZkLT51Y3R4dCA9IHVjdHh0OwogCiAJcmV0dXJuIDA7CisKK2N0eGRhdGFfZnJlZToKKwlkZC0+cmNkW2N0eHRdID0gTlVMTDsKKwloZmkxX2ZyZWVfY3R4dGRhdGEoZGQsIHVjdHh0KTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGluaXRfc3ViY3R4dHMoc3RydWN0IGhmaTFfY3R4dGRhdGEgKnVjdHh0LApAQCAtMTI1OCw3ICsxMjgzLDcgQEAKIAkJCQkJICAgICAgIHVjdHh0LT5yY3ZoZHJxKTsKIAliaW5mby5yY3ZlZ3JfYnVmYmFzZSA9IEhGSTFfTU1BUF9UT0tFTihSQ1ZfRUdSQlVGLCB1Y3R4dC0+Y3R4dCwKIAkJCQkJICAgICAgIGZkLT5zdWJjdHh0LAotCQkJCQkgICAgICAgdWN0eHQtPmVncmJ1ZnMucmN2dGlkc1swXS5waHlzKTsKKwkJCQkJICAgICAgIHVjdHh0LT5lZ3JidWZzLnJjdnRpZHNbMF0uZG1hKTsKIAliaW5mby5zZG1hX2NvbXBfYnVmYmFzZSA9IEhGSTFfTU1BUF9UT0tFTihTRE1BX0NPTVAsIHVjdHh0LT5jdHh0LAogCQkJCQkJIGZkLT5zdWJjdHh0LCAwKTsKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvaGZpLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9oZmkuaAppbmRleCAxMDAwZTBmLi43ZWVmMTFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9oZmkuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9oZmkuaApAQCAtNjQsNiArNjQsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KKyNpbmNsdWRlIDxyZG1hL2liX2hkcnMuaD4KKyNpbmNsdWRlIDxsaW51eC9yaGFzaHRhYmxlLmg+CiAjaW5jbHVkZSA8cmRtYS9yZG1hX3Z0Lmg+CiAKICNpbmNsdWRlICJjaGlwX3JlZ2lzdGVycy5oIgpAQCAtMTcxLDEyICsxNzMsMTIgQEAKIAl1MzIgdGhyZXNob2xkOyAgICAgICAgICAgLyogaGVhZCB1cGRhdGUgdGhyZXNob2xkICovCiAJc3RydWN0IGVhZ2VyX2J1ZmZlciB7CiAJCXZvaWQgKmFkZHI7Ci0JCWRtYV9hZGRyX3QgcGh5czsKKwkJZG1hX2FkZHJfdCBkbWE7CiAJCXNzaXplX3QgbGVuOwogCX0gKmJ1ZmZlcnM7CiAJc3RydWN0IHsKIAkJdm9pZCAqYWRkcjsKLQkJZG1hX2FkZHJfdCBwaHlzOworCQlkbWFfYWRkcl90IGRtYTsKIAl9ICpyY3Z0aWRzOwogfTsKIApAQCAtMjA3LDggKzIwOSw4IEBACiAJLyogc2l6ZSBvZiBlYWNoIG9mIHRoZSByY3ZoZHJxIGVudHJpZXMgKi8KIAl1MTYgcmN2aGRycWVudHNpemU7CiAJLyogbW1hcCBvZiBoZHJxLCBtdXN0IGZpdCBpbiA0NCBiaXRzICovCi0JZG1hX2FkZHJfdCByY3ZoZHJxX3BoeXM7Ci0JZG1hX2FkZHJfdCByY3ZoZHJxdGFpbGFkZHJfcGh5czsKKwlkbWFfYWRkcl90IHJjdmhkcnFfZG1hOworCWRtYV9hZGRyX3QgcmN2aGRycXRhaWxhZGRyX2RtYTsKIAlzdHJ1Y3QgY3R4dF9lYWdlcl9idWZzIGVncmJ1ZnM7CiAJLyogdGhpcyByZWNlaXZlIGNvbnRleHQncyBhc3NpZ25lZCBQSU8gQUNLIHNlbmQgY29udGV4dCAqLwogCXN0cnVjdCBzZW5kX2NvbnRleHQgKnNjOwpAQCAtMzUwLDcgKzM1Miw3IEBACiAJc3RydWN0IGhmaTFfY3R4dGRhdGEgKnJjZDsKIAlfX2xlMzIgKnJoZl9hZGRyOwogCXN0cnVjdCBydnRfcXAgKnFwOwotCXN0cnVjdCBoZmkxX290aGVyX2hlYWRlcnMgKm9oZHI7CisJc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHI7CiAJdTY0IHJoZjsKIAl1MzIgbWF4Y250OwogCXUzMiByaHFvZmY7CkBAIC01MjksNiArNTMxLDcgQEAKIAl2b2lkICphcmc7CiAJY2hhciBuYW1lW01BWF9OQU1FX1NJWkVdOwogCWNwdW1hc2tfdCBtYXNrOworCXN0cnVjdCBpcnFfYWZmaW5pdHlfbm90aWZ5IG5vdGlmeTsKIH07CiAKIC8qIHBlci1TTCBDQ0EgaW5mb3JtYXRpb24gKi8KQEAgLTYwNSw2ICs2MDgsNyBAQAogCXN0cnVjdCB3b3JrX3N0cnVjdCBmcmVlemVfd29yazsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbGlua19kb3duZ3JhZGVfd29yazsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbGlua19ib3VuY2Vfd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHN0YXJ0X2xpbmtfd29yazsKIAkvKiBob3N0IGxpbmsgc3RhdGUgdmFyaWFibGVzICovCiAJc3RydWN0IG11dGV4IGhsc19sb2NrOwogCXUzMiBob3N0X2xpbmtfc3RhdGU7CkBAIC02NTksNiArNjYzLDcgQEAKIAl1OCBsaW5raW5pdF9yZWFzb247CiAJdTggbG9jYWxfdHhfcmF0ZTsJLyogcmF0ZSBnaXZlbiB0byA4MDUxIGZpcm13YXJlICovCiAJdTggbGFzdF9wc3RhdGU7CQkvKiBpbmZvIG9ubHkgKi8KKwl1OCBxc2ZwX3JldHJ5X2NvdW50OwogCiAJLyogcGxhY2Vob2xkZXJzIGZvciBJQiBNQUQgcGFja2V0IHNldHRpbmdzICovCiAJdTggb3ZlcnJ1bl90aHJlc2hvbGQ7CkBAIC0xMDU4LDggKzEwNjMsNiBAQAogCXU4IHBzeG1pdHdhaXRfc3VwcG9ydGVkOwogCS8qIGN5Y2xlIGxlbmd0aCBvZiBQUyogY291bnRlcnMgaW4gSFcgKGluIHBpY29zZWNvbmRzKSAqLwogCXUxNiBwc3htaXR3YWl0X2NoZWNrX3JhdGU7Ci0JLyogaGlnaCB2b2x1bWUgb3ZlcmZsb3cgZXJyb3JzIGRlZmVycmVkIHRvIHRhc2tsZXQgKi8KLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgZXJyb3JfdGFza2xldDsKIAogCS8qIE1TSS1YIGluZm9ybWF0aW9uICovCiAJc3RydWN0IGhmaTFfbXNpeF9lbnRyeSAqbXNpeF9lbnRyaWVzOwpAQCAtMTE2Miw3ICsxMTY1LDcgQEAKIAogCS8qIHJlY2VpdmUgY29udGV4dCB0YWlsIGR1bW15IGFkZHJlc3MgKi8KIAlfX2xlNjQgKnJjdmhkcnRhaWxfZHVtbXlfa3ZhZGRyOwotCWRtYV9hZGRyX3QgcmN2aGRydGFpbF9kdW1teV9waHlzYWRkcjsKKwlkbWFfYWRkcl90IHJjdmhkcnRhaWxfZHVtbXlfZG1hOwogCiAJYm9vbCBlcHJvbV9hdmFpbGFibGU7CS8qIHRydWUgaWYgRVBST00gaXMgYXZhaWxhYmxlIGZvciB0aGlzIGRldmljZSAqLwogCWJvb2wgYXNwbV9zdXBwb3J0ZWQ7CS8qIERvZXMgSFcgc3VwcG9ydCBBU1BNICovCkBAIC0xMTczLDYgKzExNzYsNyBAQAogCWF0b21pY190IGFzcG1fZGlzYWJsZWRfY250OwogCiAJc3RydWN0IGhmaTFfYWZmaW5pdHkgKmFmZmluaXR5OworCXN0cnVjdCByaGFzaHRhYmxlIHNkbWFfcmh0OwogCXN0cnVjdCBrb2JqZWN0IGtvYmo7CiB9OwogCkBAIC0xMjY2LDE1ICsxMjcwLDMyIEBACiB2b2lkIHJlY2VpdmVfaW50ZXJydXB0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogLyogZXh0cmFjdCBzZXJ2aWNlIGNoYW5uZWwgZnJvbSBoZWFkZXIgYW5kIHJoZiAqLwotc3RhdGljIGlubGluZSBpbnQgaGRyMnNjKHN0cnVjdCBoZmkxX21lc3NhZ2VfaGVhZGVyICpoZHIsIHU2NCByaGYpCitzdGF0aWMgaW5saW5lIGludCBoZHIyc2Moc3RydWN0IGliX2hlYWRlciAqaGRyLCB1NjQgcmhmKQogewogCXJldHVybiAoKGJlMTZfdG9fY3B1KGhkci0+bHJoWzBdKSA+PiAxMikgJiAweGYpIHwKIAkgICAgICAgKCghIShyaGZfZGNfaW5mbyhyaGYpKSkgPDwgNCk7CiB9CiAKKyNkZWZpbmUgSEZJMV9KS0VZX1dJRFRIICAgICAgIDE2CisjZGVmaW5lIEhGSTFfSktFWV9NQVNLICAgICAgICAoQklUKDE2KSAtIDEpCisjZGVmaW5lIEhGSTFfQURNSU5fSktFWV9SQU5HRSAzMgorCisvKgorICogSl9LRVlzIGFyZSBzcGxpdCBhbmQgYWxsb2NhdGVkIGluIHRoZSBmb2xsb3dpbmcgZ3JvdXBzOgorICogICAwIC0gMzEgICAgLSB1c2VycyB3aXRoIGFkbWluaXN0cmF0b3IgcHJpdmlsZWdlcworICogIDMyIC0gNjMgICAgLSBrZXJuZWwgcHJvdG9jb2xzIHVzaW5nIEtERVRIIHBhY2tldHMKKyAqICA2NCAtIDY1NTM1IC0gYWxsIG90aGVyIHVzZXJzIHVzaW5nIEtERVRIIHBhY2tldHMKKyAqLwogc3RhdGljIGlubGluZSB1MTYgZ2VuZXJhdGVfamtleShrdWlkX3QgdWlkKQogewotCXJldHVybiBmcm9tX2t1aWQoY3VycmVudF91c2VyX25zKCksIHVpZCkgJiAweGZmZmY7CisJdTE2IGprZXkgPSBmcm9tX2t1aWQoY3VycmVudF91c2VyX25zKCksIHVpZCkgJiBIRkkxX0pLRVlfTUFTSzsKKworCWlmIChjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlqa2V5ICY9IEhGSTFfQURNSU5fSktFWV9SQU5HRSAtIDE7CisJZWxzZSBpZiAoamtleSA8IDY0KQorCQlqa2V5IHw9IEJJVChIRkkxX0pLRVlfV0lEVEggLSAxKTsKKworCXJldHVybiBqa2V5OwogfQogCiAvKgpAQCAtMTU4NCw3ICsxNjA1LDcgQEAKIHN0YXRpYyBpbmxpbmUgYm9vbCBwcm9jZXNzX2VjbihzdHJ1Y3QgcnZ0X3FwICpxcCwgc3RydWN0IGhmaTFfcGFja2V0ICpwa3QsCiAJCQkgICAgICAgYm9vbCBkb19jbnApCiB7Ci0Jc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyAqb2hkciA9IHBrdC0+b2hkcjsKKwlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkciA9IHBrdC0+b2hkcjsKIAl1MzIgYnRoMTsKIAogCWJ0aDEgPSBiZTMyX3RvX2NwdShvaGRyLT5idGhbMV0pOwpAQCAtMTY1Niw3ICsxNjc3LDYgQEAKIHN0cnVjdCBoZmkxX2RldmRhdGEgKmhmaTFfaW5pdF9kZChzdHJ1Y3QgcGNpX2RldiAqLAogCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKik7CiB2b2lkIGhmaTFfZnJlZV9kZXZkYXRhKHN0cnVjdCBoZmkxX2RldmRhdGEgKik7Ci12b2lkIGNjX3N0YXRlX3JlY2xhaW0oc3RydWN0IHJjdV9oZWFkICpyY3UpOwogc3RydWN0IGhmaTFfZGV2ZGF0YSAqaGZpMV9hbGxvY19kZXZkYXRhKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzaXplX3QgZXh0cmEpOwogCiAvKiBMRUQgYmVhY29uaW5nIGZ1bmN0aW9ucyAqLwpAQCAtMTc4OCw3ICsxODA4LDcgQEAKIGV4dGVybiB1bnNpZ25lZCBpbnQgaGZpMV9jdTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgdXNlcl9jcmVkaXRfcmV0dXJuX3RocmVzaG9sZDsKIGV4dGVybiBpbnQgbnVtX3VzZXJfY29udGV4dHM7Ci1leHRlcm4gdW5zaWduZWQgbl9rcmN2cXM7CitleHRlcm4gdW5zaWduZWQgbG9uZyBuX2tyY3ZxczsKIGV4dGVybiB1aW50IGtyY3Zxc1tdOwogZXh0ZXJuIGludCBrcmN2cXNzZXQ7CiBleHRlcm4gdWludCBrZGV0aF9xcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2luaXQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2luaXQuYwppbmRleCBhMzU4ZDIzLi42MGRiNjE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9pbml0LmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvaW5pdC5jCkBAIC05NCw3ICs5NCw3IEBACiBNT0RVTEVfUEFSTV9ERVNDKGtyY3ZxcywgIkFycmF5IG9mIHRoZSBudW1iZXIgb2Ygbm9uLWNvbnRyb2wga2VybmVsIHJlY2VpdmUgcXVldWVzIGJ5IFZMIik7CiAKIC8qIGNvbXB1dGVkIGJhc2VkIG9uIGFib3ZlIGFycmF5ICovCi11bnNpZ25lZCBuX2tyY3ZxczsKK3Vuc2lnbmVkIGxvbmcgbl9rcmN2cXM7CiAKIHN0YXRpYyB1bnNpZ25lZCBoZmkxX3JjdmFycl9zcGxpdCA9IDI1OwogbW9kdWxlX3BhcmFtX25hbWVkKHJjdmFycl9zcGxpdCwgaGZpMV9yY3ZhcnJfc3BsaXQsIHVpbnQsIFNfSVJVR08pOwpAQCAtMzM2LDYgKzMzNiw3IEBACiAJfQogCXJldHVybiByY2Q7CiBiYWlsOgorCWRkLT5yY2RbY3R4dF0gPSBOVUxMOwogCWtmcmVlKHJjZC0+ZWdyYnVmcy5yY3Z0aWRzKTsKIAlrZnJlZShyY2QtPmVncmJ1ZnMuYnVmZmVycyk7CiAJa2ZyZWUocmNkKTsKQEAgLTUwMCw2ICs1MDEsNyBAQAogCUlOSVRfV09SSygmcHBkLT5saW5rX2Rvd25ncmFkZV93b3JrLCBoYW5kbGVfbGlua19kb3duZ3JhZGUpOwogCUlOSVRfV09SSygmcHBkLT5zbWFfbWVzc2FnZV93b3JrLCBoYW5kbGVfc21hX21lc3NhZ2UpOwogCUlOSVRfV09SSygmcHBkLT5saW5rX2JvdW5jZV93b3JrLCBoYW5kbGVfbGlua19ib3VuY2UpOworCUlOSVRfREVMQVlFRF9XT1JLKCZwcGQtPnN0YXJ0X2xpbmtfd29yaywgaGFuZGxlX3N0YXJ0X2xpbmspOwogCUlOSVRfV09SSygmcHBkLT5saW5rc3RhdGVfYWN0aXZlX3dvcmssIHJlY2VpdmVfaW50ZXJydXB0X3dvcmspOwogCUlOSVRfV09SSygmcHBkLT5xc2ZwX2luZm8ucXNmcF93b3JrLCBxc2ZwX2V2ZW50KTsKIApAQCAtNzA4LDcgKzcxMCw3IEBACiAJLyogYWxsb2NhdGUgZHVtbXkgdGFpbCBtZW1vcnkgZm9yIGFsbCByZWNlaXZlIGNvbnRleHRzICovCiAJZGQtPnJjdmhkcnRhaWxfZHVtbXlfa3ZhZGRyID0gZG1hX3phbGxvY19jb2hlcmVudCgKIAkJJmRkLT5wY2lkZXYtPmRldiwgc2l6ZW9mKHU2NCksCi0JCSZkZC0+cmN2aGRydGFpbF9kdW1teV9waHlzYWRkciwKKwkJJmRkLT5yY3ZoZHJ0YWlsX2R1bW15X2RtYSwKIAkJR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIWRkLT5yY3ZoZHJ0YWlsX2R1bW15X2t2YWRkcikgewpAQCAtOTQxLDEyICs5NDMsMTIgQEAKIAogCWlmIChyY2QtPnJjdmhkcnEpIHsKIAkJZG1hX2ZyZWVfY29oZXJlbnQoJmRkLT5wY2lkZXYtPmRldiwgcmNkLT5yY3ZoZHJxX3NpemUsCi0JCQkJICByY2QtPnJjdmhkcnEsIHJjZC0+cmN2aGRycV9waHlzKTsKKwkJCQkgIHJjZC0+cmN2aGRycSwgcmNkLT5yY3ZoZHJxX2RtYSk7CiAJCXJjZC0+cmN2aGRycSA9IE5VTEw7CiAJCWlmIChyY2QtPnJjdmhkcnRhaWxfa3ZhZGRyKSB7CiAJCQlkbWFfZnJlZV9jb2hlcmVudCgmZGQtPnBjaWRldi0+ZGV2LCBQQUdFX1NJWkUsCiAJCQkJCSAgKHZvaWQgKilyY2QtPnJjdmhkcnRhaWxfa3ZhZGRyLAotCQkJCQkgIHJjZC0+cmN2aGRycXRhaWxhZGRyX3BoeXMpOworCQkJCQkgIHJjZC0+cmN2aGRycXRhaWxhZGRyX2RtYSk7CiAJCQlyY2QtPnJjdmhkcnRhaWxfa3ZhZGRyID0gTlVMTDsKIAkJfQogCX0KQEAgLTk1NSwxMSArOTU3LDExIEBACiAJa2ZyZWUocmNkLT5lZ3JidWZzLnJjdnRpZHMpOwogCiAJZm9yIChlID0gMDsgZSA8IHJjZC0+ZWdyYnVmcy5hbGxvY2VkOyBlKyspIHsKLQkJaWYgKHJjZC0+ZWdyYnVmcy5idWZmZXJzW2VdLnBoeXMpCisJCWlmIChyY2QtPmVncmJ1ZnMuYnVmZmVyc1tlXS5kbWEpCiAJCQlkbWFfZnJlZV9jb2hlcmVudCgmZGQtPnBjaWRldi0+ZGV2LAogCQkJCQkgIHJjZC0+ZWdyYnVmcy5idWZmZXJzW2VdLmxlbiwKIAkJCQkJICByY2QtPmVncmJ1ZnMuYnVmZmVyc1tlXS5hZGRyLAotCQkJCQkgIHJjZC0+ZWdyYnVmcy5idWZmZXJzW2VdLnBoeXMpOworCQkJCQkgIHJjZC0+ZWdyYnVmcy5idWZmZXJzW2VdLmRtYSk7CiAJfQogCWtmcmVlKHJjZC0+ZWdyYnVmcy5idWZmZXJzKTsKIApAQCAtMTMzMyw3ICsxMzM1LDcgQEAKIAkJc3Bpbl91bmxvY2soJnBwZC0+Y2Nfc3RhdGVfbG9jayk7CiAKIAkJaWYgKGNjX3N0YXRlKQotCQkJY2FsbF9yY3UoJmNjX3N0YXRlLT5yY3UsIGNjX3N0YXRlX3JlY2xhaW0pOworCQkJa2ZyZWVfcmN1KGNjX3N0YXRlLCByY3UpOwogCX0KIAogCWZyZWVfY3JlZGl0X3JldHVybihkZCk7CkBAIC0xMzUzLDcgKzEzNTUsNyBAQAogCWlmIChkZC0+cmN2aGRydGFpbF9kdW1teV9rdmFkZHIpIHsKIAkJZG1hX2ZyZWVfY29oZXJlbnQoJmRkLT5wY2lkZXYtPmRldiwgc2l6ZW9mKHU2NCksCiAJCQkJICAodm9pZCAqKWRkLT5yY3ZoZHJ0YWlsX2R1bW15X2t2YWRkciwKLQkJCQkgIGRkLT5yY3ZoZHJ0YWlsX2R1bW15X3BoeXNhZGRyKTsKKwkJCQkgIGRkLT5yY3ZoZHJ0YWlsX2R1bW15X2RtYSk7CiAJCWRkLT5yY3ZoZHJ0YWlsX2R1bW15X2t2YWRkciA9IE5VTEw7CiAJfQogCkBAIC0xNTc2LDcgKzE1NzgsNyBAQAogCXU2NCByZWc7CiAKIAlpZiAoIXJjZC0+cmN2aGRycSkgewotCQlkbWFfYWRkcl90IHBoeXNfaGRycXRhaWw7CisJCWRtYV9hZGRyX3QgZG1hX2hkcnF0YWlsOwogCQlnZnBfdCBnZnBfZmxhZ3M7CiAKIAkJLyoKQEAgLTE1ODksNyArMTU5MSw3IEBACiAJCWdmcF9mbGFncyA9IChyY2QtPmN0eHQgPj0gZGQtPmZpcnN0X3VzZXJfY3R4dCkgPwogCQkJR0ZQX1VTRVIgOiBHRlBfS0VSTkVMOwogCQlyY2QtPnJjdmhkcnEgPSBkbWFfemFsbG9jX2NvaGVyZW50KAotCQkJJmRkLT5wY2lkZXYtPmRldiwgYW10LCAmcmNkLT5yY3ZoZHJxX3BoeXMsCisJCQkmZGQtPnBjaWRldi0+ZGV2LCBhbXQsICZyY2QtPnJjdmhkcnFfZG1hLAogCQkJZ2ZwX2ZsYWdzIHwgX19HRlBfQ09NUCk7CiAKIAkJaWYgKCFyY2QtPnJjdmhkcnEpIHsKQEAgLTE2MDEsMTEgKzE2MDMsMTEgQEAKIAogCQlpZiAoSEZJMV9DQVBfS0dFVF9NQVNLKHJjZC0+ZmxhZ3MsIERNQV9SVEFJTCkpIHsKIAkJCXJjZC0+cmN2aGRydGFpbF9rdmFkZHIgPSBkbWFfemFsbG9jX2NvaGVyZW50KAotCQkJCSZkZC0+cGNpZGV2LT5kZXYsIFBBR0VfU0laRSwgJnBoeXNfaGRycXRhaWwsCisJCQkJJmRkLT5wY2lkZXYtPmRldiwgUEFHRV9TSVpFLCAmZG1hX2hkcnF0YWlsLAogCQkJCWdmcF9mbGFncyk7CiAJCQlpZiAoIXJjZC0+cmN2aGRydGFpbF9rdmFkZHIpCiAJCQkJZ290byBiYWlsX2ZyZWU7Ci0JCQlyY2QtPnJjdmhkcnF0YWlsYWRkcl9waHlzID0gcGh5c19oZHJxdGFpbDsKKwkJCXJjZC0+cmN2aGRycXRhaWxhZGRyX2RtYSA9IGRtYV9oZHJxdGFpbDsKIAkJfQogCiAJCXJjZC0+cmN2aGRycV9zaXplID0gYW10OwpAQCAtMTYzMyw3ICsxNjM1LDcgQEAKIAkgKiBiZWZvcmUgZW5hYmxpbmcgYW55IHJlY2VpdmUgY29udGV4dAogCSAqLwogCXdyaXRlX2tjdHh0X2NzcihkZCwgcmNkLT5jdHh0LCBSQ1ZfSERSX1RBSUxfQUREUiwKLQkJCWRkLT5yY3ZoZHJ0YWlsX2R1bW15X3BoeXNhZGRyKTsKKwkJCWRkLT5yY3ZoZHJ0YWlsX2R1bW15X2RtYSk7CiAKIAlyZXR1cm4gMDsKIApAQCAtMTY0NCw3ICsxNjQ2LDcgQEAKIAl2ZnJlZShyY2QtPnVzZXJfZXZlbnRfbWFzayk7CiAJcmNkLT51c2VyX2V2ZW50X21hc2sgPSBOVUxMOwogCWRtYV9mcmVlX2NvaGVyZW50KCZkZC0+cGNpZGV2LT5kZXYsIGFtdCwgcmNkLT5yY3ZoZHJxLAotCQkJICByY2QtPnJjdmhkcnFfcGh5cyk7CisJCQkgIHJjZC0+cmN2aGRycV9kbWEpOwogCXJjZC0+cmN2aGRycSA9IE5VTEw7CiBiYWlsOgogCXJldHVybiAtRU5PTUVNOwpAQCAtMTcwNSwxNSArMTcwNywxNSBAQAogCQlyY2QtPmVncmJ1ZnMuYnVmZmVyc1tpZHhdLmFkZHIgPQogCQkJZG1hX3phbGxvY19jb2hlcmVudCgmZGQtPnBjaWRldi0+ZGV2LAogCQkJCQkgICAgcmNkLT5lZ3JidWZzLnJjdnRpZF9zaXplLAotCQkJCQkgICAgJnJjZC0+ZWdyYnVmcy5idWZmZXJzW2lkeF0ucGh5cywKKwkJCQkJICAgICZyY2QtPmVncmJ1ZnMuYnVmZmVyc1tpZHhdLmRtYSwKIAkJCQkJICAgIGdmcF9mbGFncyk7CiAJCWlmIChyY2QtPmVncmJ1ZnMuYnVmZmVyc1tpZHhdLmFkZHIpIHsKIAkJCXJjZC0+ZWdyYnVmcy5idWZmZXJzW2lkeF0ubGVuID0KIAkJCQlyY2QtPmVncmJ1ZnMucmN2dGlkX3NpemU7CiAJCQlyY2QtPmVncmJ1ZnMucmN2dGlkc1tyY2QtPmVncmJ1ZnMuYWxsb2NlZF0uYWRkciA9CiAJCQkJcmNkLT5lZ3JidWZzLmJ1ZmZlcnNbaWR4XS5hZGRyOwotCQkJcmNkLT5lZ3JidWZzLnJjdnRpZHNbcmNkLT5lZ3JidWZzLmFsbG9jZWRdLnBoeXMgPQotCQkJCXJjZC0+ZWdyYnVmcy5idWZmZXJzW2lkeF0ucGh5czsKKwkJCXJjZC0+ZWdyYnVmcy5yY3Z0aWRzW3JjZC0+ZWdyYnVmcy5hbGxvY2VkXS5kbWEgPQorCQkJCXJjZC0+ZWdyYnVmcy5idWZmZXJzW2lkeF0uZG1hOwogCQkJcmNkLT5lZ3JidWZzLmFsbG9jZWQrKzsKIAkJCWFsbG9jZWRfYnl0ZXMgKz0gcmNkLT5lZ3JidWZzLnJjdnRpZF9zaXplOwogCQkJaWR4Kys7CkBAIC0xNzU0LDE0ICsxNzU2LDE0IEBACiAJCQlmb3IgKGkgPSAwLCBqID0gMCwgb2Zmc2V0ID0gMDsgaiA8IGlkeDsgaSsrKSB7CiAJCQkJaWYgKGkgPj0gcmNkLT5lZ3JidWZzLmNvdW50KQogCQkJCQlicmVhazsKLQkJCQlyY2QtPmVncmJ1ZnMucmN2dGlkc1tpXS5waHlzID0KLQkJCQkJcmNkLT5lZ3JidWZzLmJ1ZmZlcnNbal0ucGh5cyArIG9mZnNldDsKKwkJCQlyY2QtPmVncmJ1ZnMucmN2dGlkc1tpXS5kbWEgPQorCQkJCQlyY2QtPmVncmJ1ZnMuYnVmZmVyc1tqXS5kbWEgKyBvZmZzZXQ7CiAJCQkJcmNkLT5lZ3JidWZzLnJjdnRpZHNbaV0uYWRkciA9CiAJCQkJCXJjZC0+ZWdyYnVmcy5idWZmZXJzW2pdLmFkZHIgKyBvZmZzZXQ7CiAJCQkJcmNkLT5lZ3JidWZzLmFsbG9jZWQrKzsKLQkJCQlpZiAoKHJjZC0+ZWdyYnVmcy5idWZmZXJzW2pdLnBoeXMgKyBvZmZzZXQgKworCQkJCWlmICgocmNkLT5lZ3JidWZzLmJ1ZmZlcnNbal0uZG1hICsgb2Zmc2V0ICsKIAkJCQkgICAgIG5ld19zaXplKSA9PQotCQkJCSAgICAocmNkLT5lZ3JidWZzLmJ1ZmZlcnNbal0ucGh5cyArCisJCQkJICAgIChyY2QtPmVncmJ1ZnMuYnVmZmVyc1tqXS5kbWEgKwogCQkJCSAgICAgcmNkLT5lZ3JidWZzLmJ1ZmZlcnNbal0ubGVuKSkgewogCQkJCQlqKys7CiAJCQkJCW9mZnNldCA9IDA7CkBAIC0xODEzLDcgKzE4MTUsNyBAQAogCiAJZm9yIChpZHggPSAwOyBpZHggPCByY2QtPmVncmJ1ZnMuYWxsb2NlZDsgaWR4KyspIHsKIAkJaGZpMV9wdXRfdGlkKGRkLCByY2QtPmVhZ2VyX2Jhc2UgKyBpZHgsIFBUX0VBR0VSLAotCQkJICAgICByY2QtPmVncmJ1ZnMucmN2dGlkc1tpZHhdLnBoeXMsIG9yZGVyKTsKKwkJCSAgICAgcmNkLT5lZ3JidWZzLnJjdnRpZHNbaWR4XS5kbWEsIG9yZGVyKTsKIAkJY29uZF9yZXNjaGVkKCk7CiAJfQogCWdvdG8gYmFpbDsKQEAgLTE4MjUsOSArMTgyNyw5IEBACiAJCWRtYV9mcmVlX2NvaGVyZW50KCZkZC0+cGNpZGV2LT5kZXYsCiAJCQkJICByY2QtPmVncmJ1ZnMuYnVmZmVyc1tpZHhdLmxlbiwKIAkJCQkgIHJjZC0+ZWdyYnVmcy5idWZmZXJzW2lkeF0uYWRkciwKLQkJCQkgIHJjZC0+ZWdyYnVmcy5idWZmZXJzW2lkeF0ucGh5cyk7CisJCQkJICByY2QtPmVncmJ1ZnMuYnVmZmVyc1tpZHhdLmRtYSk7CiAJCXJjZC0+ZWdyYnVmcy5idWZmZXJzW2lkeF0uYWRkciA9IE5VTEw7Ci0JCXJjZC0+ZWdyYnVmcy5idWZmZXJzW2lkeF0ucGh5cyA9IDA7CisJCXJjZC0+ZWdyYnVmcy5idWZmZXJzW2lkeF0uZG1hID0gMDsKIAkJcmNkLT5lZ3JidWZzLmJ1ZmZlcnNbaWR4XS5sZW4gPSAwOwogCX0KIGJhaWw6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9tYWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL21hZC5jCmluZGV4IDEyNjNhYmUuLjk0ODdjOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL21hZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL21hZC5jCkBAIC0xMDEzLDcgKzEwMTMsNiBAQAogCQkJICogb2ZmbGluZS4KIAkJCSAqLwogCQkJc2V0X2xpbmtfc3RhdGUocHBkLCBITFNfRE5fT0ZGTElORSk7Ci0JCQl0dW5lX3NlcmRlcyhwcGQpOwogCQkJc3RhcnRfbGluayhwcGQpOwogCQl9IGVsc2UgewogCQkJc2V0X2xpbmtfc3RhdGUocHBkLCBsaW5rX3N0YXRlKTsKQEAgLTE0MDcsMTIgKzE0MDYsNiBAQAogCQlpZiAoa2V5ID09IG9rZXkpCiAJCQljb250aW51ZTsKIAkJLyoKLQkJICogRG9uJ3QgdXBkYXRlIHBrZXlzWzJdLCBpZiBhbiBIRkkgcG9ydCB3aXRob3V0IE1nbXRBbGxvd2VkCi0JCSAqIGJ5IG5laWdoYm9yIGlzIGEgc3dpdGNoLgotCQkgKi8KLQkJaWYgKGkgPT0gMiAmJiAhcHBkLT5tZ210X2FsbG93ZWQgJiYgcHBkLT5uZWlnaGJvcl90eXBlID09IDEpCi0JCQljb250aW51ZTsKLQkJLyoKIAkJICogVGhlIFNNIGdpdmVzIHVzIHRoZSBjb21wbGV0ZSBQS2V5IHRhYmxlLiBXZSBoYXZlCiAJCSAqIHRvIGVuc3VyZSB0aGF0IHdlIHB1dCB0aGUgUEtleXMgaW4gdGhlIG1hdGNoaW5nCiAJCSAqIHNsb3RzLgpAQCAtMTgxOSw2ICsxODEyLDExIEBACiAJdTMyIGxlbiA9IE9QQV9BTV9DSV9MRU4oYW0pICsgMTsKIAlpbnQgcmV0OwogCisJaWYgKGRkLT5wcG9ydC0+cG9ydF90eXBlICE9IFBPUlRfVFlQRV9RU0ZQKSB7CisJCXNtcC0+c3RhdHVzIHw9IElCX1NNUF9JTlZBTElEX0ZJRUxEOworCQlyZXR1cm4gcmVwbHkoKHN0cnVjdCBpYl9tYWRfaGRyICopc21wKTsKKwl9CisKICNkZWZpbmUgX19DSV9QQUdFX1NJWkUgQklUKDcpIC8qIDEyOCBieXRlcyAqLwogI2RlZmluZSBfX0NJX1BBR0VfTUFTSyB+KF9fQ0lfUEFHRV9TSVpFIC0gMSkKICNkZWZpbmUgX19DSV9QQUdFX05VTShhKSAoKGEpICYgX19DSV9QQUdFX01BU0spCkBAIC0yNTk5LDcgKzI1OTcsNyBAQAogCXU4IGxxLCBudW1fdmxzOwogCXU4IHJlc19sbGksIHJlc19sZXI7CiAJdTY0IHBvcnRfbWFzazsKLQl1bnNpZ25lZCBsb25nIHBvcnRfbnVtOworCXU4IHBvcnRfbnVtOwogCXVuc2lnbmVkIGxvbmcgdmw7CiAJdTMyIHZsX3NlbGVjdF9tYXNrOwogCWludCB2Zmk7CkBAIC0yNjMzLDkgKzI2MzEsOSBAQAogCSAqLwogCXBvcnRfbWFzayA9IGJlNjRfdG9fY3B1KHJlcS0+cG9ydF9zZWxlY3RfbWFza1szXSk7CiAJcG9ydF9udW0gPSBmaW5kX2ZpcnN0X2JpdCgodW5zaWduZWQgbG9uZyAqKSZwb3J0X21hc2ssCi0JCQkJICBzaXplb2YocG9ydF9tYXNrKSk7CisJCQkJICBzaXplb2YocG9ydF9tYXNrKSAqIDgpOwogCi0JaWYgKCh1OClwb3J0X251bSAhPSBwb3J0KSB7CisJaWYgKHBvcnRfbnVtICE9IHBvcnQpIHsKIAkJcG1wLT5tYWRfaGRyLnN0YXR1cyB8PSBJQl9TTVBfSU5WQUxJRF9GSUVMRDsKIAkJcmV0dXJuIHJlcGx5KChzdHJ1Y3QgaWJfbWFkX2hkciAqKXBtcCk7CiAJfQpAQCAtMjgzNyw3ICsyODM1LDcgQEAKIAkgKi8KIAlwb3J0X21hc2sgPSBiZTY0X3RvX2NwdShyZXEtPnBvcnRfc2VsZWN0X21hc2tbM10pOwogCXBvcnRfbnVtID0gZmluZF9maXJzdF9iaXQoKHVuc2lnbmVkIGxvbmcgKikmcG9ydF9tYXNrLAotCQkJCSAgc2l6ZW9mKHBvcnRfbWFzaykpOworCQkJCSAgc2l6ZW9mKHBvcnRfbWFzaykgKiA4KTsKIAogCWlmIChwb3J0X251bSAhPSBwb3J0KSB7CiAJCXBtcC0+bWFkX2hkci5zdGF0dXMgfD0gSUJfU01QX0lOVkFMSURfRklFTEQ7CkBAIC0zMDEwLDcgKzMwMDgsNyBAQAogCSAqLwogCXBvcnRfbWFzayA9IGJlNjRfdG9fY3B1KHJlcS0+cG9ydF9zZWxlY3RfbWFza1szXSk7CiAJcG9ydF9udW0gPSBmaW5kX2ZpcnN0X2JpdCgodW5zaWduZWQgbG9uZyAqKSZwb3J0X21hc2ssCi0JCQkJICBzaXplb2YocG9ydF9tYXNrKSk7CisJCQkJICBzaXplb2YocG9ydF9tYXNrKSAqIDgpOwogCiAJaWYgKHBvcnRfbnVtICE9IHBvcnQpIHsKIAkJcG1wLT5tYWRfaGRyLnN0YXR1cyB8PSBJQl9TTVBfSU5WQUxJRF9GSUVMRDsKQEAgLTMyNDcsNyArMzI0NSw3IEBACiAJICovCiAJcG9ydF9tYXNrID0gYmU2NF90b19jcHUocmVxLT5wb3J0X3NlbGVjdF9tYXNrWzNdKTsKIAlwb3J0X251bSA9IGZpbmRfZmlyc3RfYml0KCh1bnNpZ25lZCBsb25nICopJnBvcnRfbWFzaywKLQkJCQkgIHNpemVvZihwb3J0X21hc2spKTsKKwkJCQkgIHNpemVvZihwb3J0X21hc2spICogOCk7CiAKIAlpZiAocG9ydF9udW0gIT0gcG9ydCkgewogCQlwbXAtPm1hZF9oZHIuc3RhdHVzIHw9IElCX1NNUF9JTlZBTElEX0ZJRUxEOwpAQCAtMzM5OCw3ICszMzk2LDcgQEAKIAogCXNwaW5fdW5sb2NrKCZwcGQtPmNjX3N0YXRlX2xvY2spOwogCi0JY2FsbF9yY3UoJm9sZF9jY19zdGF0ZS0+cmN1LCBjY19zdGF0ZV9yZWNsYWltKTsKKwlrZnJlZV9yY3Uob2xkX2NjX3N0YXRlLCByY3UpOwogfQogCiBzdGF0aWMgaW50IF9fc3Vibl9zZXRfb3BhX2Nvbmdfc2V0dGluZyhzdHJ1Y3Qgb3BhX3NtcCAqc21wLCB1MzIgYW0sIHU4ICpkYXRhLApAQCAtMzU1MywxMyArMzU1MSw2IEBACiAJcmV0dXJuIHJlcGx5KChzdHJ1Y3QgaWJfbWFkX2hkciAqKXNtcCk7CiB9CiAKLXZvaWQgY2Nfc3RhdGVfcmVjbGFpbShzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKLXsKLQlzdHJ1Y3QgY2Nfc3RhdGUgKmNjX3N0YXRlID0gY29udGFpbmVyX29mKHJjdSwgc3RydWN0IGNjX3N0YXRlLCByY3UpOwotCi0Ja2ZyZWUoY2Nfc3RhdGUpOwotfQotCiBzdGF0aWMgaW50IF9fc3Vibl9zZXRfb3BhX2NjX3RhYmxlKHN0cnVjdCBvcGFfc21wICpzbXAsIHUzMiBhbSwgdTggKmRhdGEsCiAJCQkJICAgc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHU4IHBvcnQsCiAJCQkJICAgdTMyICpyZXNwX2xlbikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3Bpby5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcGlvLmMKaW5kZXggYWMxYmY0YS4uNTBhM2EzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcGlvLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcGlvLmMKQEAgLTU1MSwxMSArNTUxLDExIEBACiB9CiAKIC8qCi0gKiBPYnRhaW4gdGhlIGNyZWRpdCByZXR1cm4gYWRkcmVzc2VzLCBrZXJuZWwgdmlydHVhbCBhbmQgcGh5c2ljYWwsIGZvciB0aGUKKyAqIE9idGFpbiB0aGUgY3JlZGl0IHJldHVybiBhZGRyZXNzZXMsIGtlcm5lbCB2aXJ0dWFsIGFuZCBidXMsIGZvciB0aGUKICAqIGdpdmVuIHNjLgogICoKICAqIFRvIHVuZGVyc3RhbmQgdGhpcyByb3V0aW5lOgotICogbyB2YSBhbmQgcGEgYXJlIGFycmF5cyBvZiBzdHJ1Y3QgY3JlZGl0X3JldHVybi4gIE9uZSBmb3IgZWFjaCBwaHlzaWNhbAorICogbyB2YSBhbmQgZG1hIGFyZSBhcnJheXMgb2Ygc3RydWN0IGNyZWRpdF9yZXR1cm4uICBPbmUgZm9yIGVhY2ggcGh5c2ljYWwKICAqICAgc2VuZCBjb250ZXh0LCBwZXIgTlVNQS4KICAqIG8gRWFjaCBzZW5kIGNvbnRleHQgYWx3YXlzIGxvb2tzIGluIGl0cyByZWxhdGl2ZSBsb2NhdGlvbiBpbiBhIHN0cnVjdAogICogICBjcmVkaXRfcmV0dXJuIGZvciBpdHMgY3JlZGl0IHJldHVybi4KQEAgLTU2MywxNCArNTYzLDE0IEBACiAgKiAgIHdpdGggdGhlIHNhbWUgdmFsdWUuICBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHNlbmQgY29udGV4dCBpbiB0aGUKICAqICAgZ3JvdXAuCiAgKi8KLXN0YXRpYyB2b2lkIGNyX2dyb3VwX2FkZHJlc3NlcyhzdHJ1Y3Qgc2VuZF9jb250ZXh0ICpzYywgZG1hX2FkZHJfdCAqcGEpCitzdGF0aWMgdm9pZCBjcl9ncm91cF9hZGRyZXNzZXMoc3RydWN0IHNlbmRfY29udGV4dCAqc2MsIGRtYV9hZGRyX3QgKmRtYSkKIHsKIAl1MzIgZ2MgPSBncm91cF9jb250ZXh0KHNjLT5od19jb250ZXh0LCBzYy0+Z3JvdXApOwogCXUzMiBpbmRleCA9IHNjLT5od19jb250ZXh0ICYgMHg3OwogCiAJc2MtPmh3X2ZyZWUgPSAmc2MtPmRkLT5jcl9iYXNlW3NjLT5ub2RlXS52YVtnY10uY3JbaW5kZXhdOwotCSpwYSA9ICh1bnNpZ25lZCBsb25nKQotCSAgICAgICAmKChzdHJ1Y3QgY3JlZGl0X3JldHVybiAqKXNjLT5kZC0+Y3JfYmFzZVtzYy0+bm9kZV0ucGEpW2djXTsKKwkqZG1hID0gKHVuc2lnbmVkIGxvbmcpCisJICAgICAgICYoKHN0cnVjdCBjcmVkaXRfcmV0dXJuICopc2MtPmRkLT5jcl9iYXNlW3NjLT5ub2RlXS5kbWEpW2djXTsKIH0KIAogLyoKQEAgLTcxMCw3ICs3MTAsNyBAQAogewogCXN0cnVjdCBzZW5kX2NvbnRleHRfaW5mbyAqc2NpOwogCXN0cnVjdCBzZW5kX2NvbnRleHQgKnNjID0gTlVMTDsKLQlkbWFfYWRkcl90IHBhOworCWRtYV9hZGRyX3QgZG1hOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTY0IHJlZzsKIAl1MzIgdGhyZXNoOwpAQCAtNzYzLDcgKzc2Myw3IEBACiAKIAlzYy0+c3dfaW5kZXggPSBzd19pbmRleDsKIAlzYy0+aHdfY29udGV4dCA9IGh3X2NvbnRleHQ7Ci0JY3JfZ3JvdXBfYWRkcmVzc2VzKHNjLCAmcGEpOworCWNyX2dyb3VwX2FkZHJlc3NlcyhzYywgJmRtYSk7CiAJc2MtPmNyZWRpdHMgPSBzY2ktPmNyZWRpdHM7CiAKIC8qIFBJTyBTZW5kIE1lbW9yeSBBZGRyZXNzIGRldGFpbHMgKi8KQEAgLTgwNSw3ICs4MDUsNyBAQAogCQkJKCh1NjQpb3B2YWwgPDwgU0MoQ0hFQ0tfT1BDT0RFX1ZBTFVFX1NISUZUKSkpOwogCiAJLyogc2V0IHVwIGNyZWRpdCByZXR1cm4gKi8KLQlyZWcgPSBwYSAmIFNDKENSRURJVF9SRVRVUk5fQUREUl9BRERSRVNTX1NNQVNLKTsKKwlyZWcgPSBkbWEgJiBTQyhDUkVESVRfUkVUVVJOX0FERFJfQUREUkVTU19TTUFTSyk7CiAJd3JpdGVfa2N0eHRfY3NyKGRkLCBod19jb250ZXh0LCBTQyhDUkVESVRfUkVUVVJOX0FERFIpLCByZWcpOwogCiAJLyoKQEAgLTIwNjQsNyArMjA2NCw3IEBACiAJCWRkLT5jcl9iYXNlW2ldLnZhID0gZG1hX3phbGxvY19jb2hlcmVudCgKIAkJCQkJJmRkLT5wY2lkZXYtPmRldiwKIAkJCQkJYnl0ZXMsCi0JCQkJCSZkZC0+Y3JfYmFzZVtpXS5wYSwKKwkJCQkJJmRkLT5jcl9iYXNlW2ldLmRtYSwKIAkJCQkJR0ZQX0tFUk5FTCk7CiAJCWlmICghZGQtPmNyX2Jhc2VbaV0udmEpIHsKIAkJCXNldF9kZXZfbm9kZSgmZGQtPnBjaWRldi0+ZGV2LCBkZC0+bm9kZSk7CkBAIC0yMDk3LDcgKzIwOTcsNyBAQAogCQkJCQkgIFRYRV9OVU1fQ09OVEVYVFMgKgogCQkJCQkgIHNpemVvZihzdHJ1Y3QgY3JlZGl0X3JldHVybiksCiAJCQkJCSAgZGQtPmNyX2Jhc2VbaV0udmEsCi0JCQkJCSAgZGQtPmNyX2Jhc2VbaV0ucGEpOworCQkJCQkgIGRkLT5jcl9iYXNlW2ldLmRtYSk7CiAJCX0KIAl9CiAJa2ZyZWUoZGQtPmNyX2Jhc2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcGlvLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9waW8uaAppbmRleCA0NjRjYmQyLi5lNzA5ZWFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9waW8uaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9waW8uaApAQCAtMTU0LDcgKzE1NCw3IEBACiAvKiBOVU1BIGluZGV4ZWQgY3JlZGl0IHJldHVybiBhcnJheSAqLwogc3RydWN0IGNyZWRpdF9yZXR1cm5fYmFzZSB7CiAJc3RydWN0IGNyZWRpdF9yZXR1cm4gKnZhOwotCWRtYV9hZGRyX3QgcGE7CisJZG1hX2FkZHJfdCBkbWE7CiB9OwogCiAvKiBzZW5kIGNvbnRleHQgY29uZmlndXJhdGlvbiBzaXplcyAob25lIHBlciB0eXBlKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcGlvX2NvcHkuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3Bpb19jb3B5LmMKaW5kZXggOGMyNWUxYi4uYWE3NzczNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcGlvX2NvcHkuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9waW9fY29weS5jCkBAIC0xNjUsOSArMTY1LDYgQEAKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQogCi0vKiBVU0VfU0hJRlRTIGlzIGZhc3RlciBpbiB1c2VyLXNwYWNlIHRlc3RzIG9uIGEgWGVvbiBYNTU3MCBAIDIuOTNHSHogKi8KLSNkZWZpbmUgVVNFX1NISUZUUyAxCi0jaWZkZWYgVVNFX1NISUZUUwogLyoKICAqIEhhbmRsZSBjYXJyeSBieXRlcyB1c2luZyBzaGlmdHMgYW5kIG1hc2tzLgogICoKQEAgLTE4NywzNyArMTg0LDU1IEBACiAjZGVmaW5lIG1zaGlmdCh4KSAoOCAqICh4KSkKIAogLyoKLSAqIFJlYWQgbmJ5dGVzIGJ5dGVzIGZyb20gImZyb20iIGFuZCByZXR1cm4gdGhlbSBpbiB0aGUgTFNCIGJ5dGVzCi0gKiBvZiBwYnVmLT5jYXJyeS4gIE90aGVyIGJ5dGVzIGFyZSB6ZXJvZWQuICBBbnkgcHJldmlvdXMgdmFsdWUKLSAqIHBidWYtPmNhcnJ5IGlzIGxvc3QuCisgKiBKdW1wIGNvcHkgLSBuby1sb29wIGNvcHkgZm9yIDwgOCBieXRlcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGpjb3B5KHU4ICpkZXN0LCBjb25zdCB1OCAqc3JjLCB1MzIgbikKK3sKKwlzd2l0Y2ggKG4pIHsKKwljYXNlIDc6CisJCSpkZXN0KysgPSAqc3JjKys7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgNjoKKwkJKmRlc3QrKyA9ICpzcmMrKzsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSA1OgorCQkqZGVzdCsrID0gKnNyYysrOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIDQ6CisJCSpkZXN0KysgPSAqc3JjKys7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgMzoKKwkJKmRlc3QrKyA9ICpzcmMrKzsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSAyOgorCQkqZGVzdCsrID0gKnNyYysrOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIDE6CisJCSpkZXN0KysgPSAqc3JjKys7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCX0KK30KKworLyoKKyAqIFJlYWQgbmJ5dGVzIGZyb20gImZyb20iIGFuZCBhbmQgcGxhY2UgdGhlbSBpbiB0aGUgbG93IGJ5dGVzCisgKiBvZiBwYnVmLT5jYXJyeS4gIE90aGVyIGJ5dGVzIGFyZSBsZWZ0IGFzLWlzLiAgQW55IHByZXZpb3VzCisgKiB2YWx1ZSBpbiBwYnVmLT5jYXJyeSBpcyBsb3N0LgogICoKICAqIE5PVEVTOgogICogbyBkbyBub3QgcmVhZCBmcm9tIGZyb20gaWYgbmJ5dGVzIGlzIHplcm8KLSAqIG8gZnJvbSBtYXkgX25vdF8gYmUgdTY0IGFsaWduZWQKLSAqIG8gbmJ5dGVzIG11c3Qgbm90IHNwYW4gYSBRVyBib3VuZGFyeQorICogbyBmcm9tIG1heSBfbm90XyBiZSB1NjQgYWxpZ25lZC4KICAqLwogc3RhdGljIGlubGluZSB2b2lkIHJlYWRfbG93X2J5dGVzKHN0cnVjdCBwaW9fYnVmICpwYnVmLCBjb25zdCB2b2lkICpmcm9tLAogCQkJCSAgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKLQl1bnNpZ25lZCBsb25nIG9mZjsKLQotCWlmIChuYnl0ZXMgPT0gMCkgewotCQlwYnVmLT5jYXJyeS52YWw2NCA9IDA7Ci0JfSBlbHNlIHsKLQkJLyogYWxpZ24gb3VyIHBvaW50ZXIgKi8KLQkJb2ZmID0gKHVuc2lnbmVkIGxvbmcpZnJvbSAmIDB4NzsKLQkJZnJvbSA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKWZyb20gJiB+MHg3bCk7Ci0JCXBidWYtPmNhcnJ5LnZhbDY0ID0gKCgqKHU2NCAqKWZyb20pCi0JCQkJPDwgenNoaWZ0KG5ieXRlcyArIG9mZikpLyogemVybyB1cHBlciBieXRlcyAqLwotCQkJCT4+IHpzaGlmdChuYnl0ZXMpOwkvKiBwbGFjZSBhdCBib3R0b20gKi8KLQl9CisJcGJ1Zi0+Y2FycnkudmFsNjQgPSAwOworCWpjb3B5KCZwYnVmLT5jYXJyeS52YWw4WzBdLCBmcm9tLCBuYnl0ZXMpOwogCXBidWYtPmNhcnJ5X2J5dGVzID0gbmJ5dGVzOwogfQogCiAvKgotICogUmVhZCBuYnl0ZXMgYnl0ZXMgZnJvbSAiZnJvbSIgYW5kIHB1dCB0aGVtIGF0IHRoZSBuZXh0IHNpZ25pZmljYW50IGJ5dGVzCi0gKiBvZiBwYnVmLT5jYXJyeS4gIFVudXNlZCBieXRlcyBhcmUgemVyb2VkLiAgSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgZXh0cmEKLSAqIHJlYWQgZG9lcyBub3Qgb3ZlcmZpbGwgY2FycnkuCisgKiBSZWFkIG5ieXRlcyBieXRlcyBmcm9tICJmcm9tIiBhbmQgcHV0IHRoZW0gYXQgdGhlIGVuZCBvZiBwYnVmLT5jYXJyeS4KKyAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIGV4dHJhIHJlYWQgZG9lcyBub3Qgb3ZlcmZpbGwgY2FycnkuCiAgKgogICogTk9URVM6CiAgKiBvIGZyb20gbWF5IF9ub3RfIGJlIHU2NCBhbGlnbmVkCkBAIC0yMjYsNTUgKzI0MSw4IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgcmVhZF9leHRyYV9ieXRlcyhzdHJ1Y3QgcGlvX2J1ZiAqcGJ1ZiwKIAkJCQkgICAgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKLQl1bnNpZ25lZCBsb25nIG9mZiA9ICh1bnNpZ25lZCBsb25nKWZyb20gJiAweDc7Ci0JdW5zaWduZWQgaW50IHJvb20sIHhieXRlczsKLQotCS8qIGFsaWduIG91ciBwb2ludGVyICovCi0JZnJvbSA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKWZyb20gJiB+MHg3bCk7Ci0KLQkvKiBjaGVjayBjb3VudCBmaXJzdCAtIGRvbid0IHJlYWQgYW55dGhpbmcgaWYgY291bnQgaXMgemVybyAqLwotCXdoaWxlIChuYnl0ZXMpIHsKLQkJLyogZmluZCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoaXMgdTY0ICovCi0JCXJvb20gPSA4IC0gb2ZmOwkvKiB0aGlzIHU2NCBoYXMgcm9vbSBmb3IgdGhpcyBtYW55IGJ5dGVzICovCi0JCXhieXRlcyA9IG1pbihyb29tLCBuYnl0ZXMpOwotCi0JCS8qCi0JCSAqIHNoaWZ0IGRvd24gdG8gemVybyBsb3dlciBieXRlcywgc2hpZnQgdXAgdG8gemVybyB1cHBlcgotCQkgKiBieXRlcywgc2hpZnQgYmFjayBkb3duIHRvIG1vdmUgaW50byBwbGFjZQotCQkgKi8KLQkJcGJ1Zi0+Y2FycnkudmFsNjQgfD0gKCgoKih1NjQgKilmcm9tKQotCQkJCQk+PiBtc2hpZnQob2ZmKSkKLQkJCQkJPDwgenNoaWZ0KHhieXRlcykpCi0JCQkJCT4+IHpzaGlmdCh4Ynl0ZXMgKyBwYnVmLT5jYXJyeV9ieXRlcyk7Ci0JCW9mZiA9IDA7Ci0JCXBidWYtPmNhcnJ5X2J5dGVzICs9IHhieXRlczsKLQkJbmJ5dGVzIC09IHhieXRlczsKLQkJZnJvbSArPSBzaXplb2YodTY0KTsKLQl9Ci19Ci0KLS8qCi0gKiBaZXJvIGV4dHJhIGJ5dGVzIGZyb20gdGhlIGVuZCBvZiBwYnVmLT5jYXJyeS4KLSAqCi0gKiBOT1RFUzoKLSAqIG8gemJ5dGVzIDw9IG9sZF9ieXRlcwotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgemVyb19leHRyYV9ieXRlcyhzdHJ1Y3QgcGlvX2J1ZiAqcGJ1ZiwgdW5zaWduZWQgaW50IHpieXRlcykKLXsKLQl1bnNpZ25lZCBpbnQgcmVtYWluaW5nOwotCi0JaWYgKHpieXRlcyA9PSAwKQkvKiBub3RoaW5nIHRvIGRvICovCi0JCXJldHVybjsKLQotCXJlbWFpbmluZyA9IHBidWYtPmNhcnJ5X2J5dGVzIC0gemJ5dGVzOwkvKiByZW1haW5pbmcgYnl0ZXMgKi8KLQotCS8qIE5PVEU6IHpzaGlmdCBvbmx5IGd1YXJhbnRlZWQgdG8gd29yayBpZiByZW1haW5pbmcgIT0gMCAqLwotCWlmIChyZW1haW5pbmcpCi0JCXBidWYtPmNhcnJ5LnZhbDY0ID0gKHBidWYtPmNhcnJ5LnZhbDY0IDw8IHpzaGlmdChyZW1haW5pbmcpKQotCQkJCQk+PiB6c2hpZnQocmVtYWluaW5nKTsKLQllbHNlCi0JCXBidWYtPmNhcnJ5LnZhbDY0ID0gMDsKLQlwYnVmLT5jYXJyeV9ieXRlcyA9IHJlbWFpbmluZzsKKwlqY29weSgmcGJ1Zi0+Y2FycnkudmFsOFtwYnVmLT5jYXJyeV9ieXRlc10sIGZyb20sIG5ieXRlcyk7CisJcGJ1Zi0+Y2FycnlfYnl0ZXMgKz0gbmJ5dGVzOwogfQogCiAvKgpAQCAtMzIzLDEyNiArMjkxLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2Vsc2UgLyogVVNFX1NISUZUUyAqLwotLyoKLSAqIEhhbmRsZSBjYXJyeSBieXRlcyB1c2luZyBieXRlIGNvcGllcy4KLSAqCi0gKiBOT1RFOiB0aGUgdmFsdWUgdGhlIHVudXNlZCBwb3J0aW9uIG9mIGNhcnJ5IGlzIGxlZnQgdW5pbml0aWFsaXplZC4KLSAqLwotCi0vKgotICogSnVtcCBjb3B5IC0gbm8tbG9vcCBjb3B5IGZvciA8IDggYnl0ZXMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBqY29weSh1OCAqZGVzdCwgY29uc3QgdTggKnNyYywgdTMyIG4pCi17Ci0Jc3dpdGNoIChuKSB7Ci0JY2FzZSA3OgotCQkqZGVzdCsrID0gKnNyYysrOwotCWNhc2UgNjoKLQkJKmRlc3QrKyA9ICpzcmMrKzsKLQljYXNlIDU6Ci0JCSpkZXN0KysgPSAqc3JjKys7Ci0JY2FzZSA0OgotCQkqZGVzdCsrID0gKnNyYysrOwotCWNhc2UgMzoKLQkJKmRlc3QrKyA9ICpzcmMrKzsKLQljYXNlIDI6Ci0JCSpkZXN0KysgPSAqc3JjKys7Ci0JY2FzZSAxOgotCQkqZGVzdCsrID0gKnNyYysrOwotCX0KLX0KLQotLyoKLSAqIFJlYWQgbmJ5dGVzIGZyb20gImZyb20iIGFuZCBhbmQgcGxhY2UgdGhlbSBpbiB0aGUgbG93IGJ5dGVzCi0gKiBvZiBwYnVmLT5jYXJyeS4gIE90aGVyIGJ5dGVzIGFyZSBsZWZ0IGFzLWlzLiAgQW55IHByZXZpb3VzCi0gKiB2YWx1ZSBpbiBwYnVmLT5jYXJyeSBpcyBsb3N0LgotICoKLSAqIE5PVEVTOgotICogbyBkbyBub3QgcmVhZCBmcm9tIGZyb20gaWYgbmJ5dGVzIGlzIHplcm8KLSAqIG8gZnJvbSBtYXkgX25vdF8gYmUgdTY0IGFsaWduZWQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCByZWFkX2xvd19ieXRlcyhzdHJ1Y3QgcGlvX2J1ZiAqcGJ1ZiwgY29uc3Qgdm9pZCAqZnJvbSwKLQkJCQkgIHVuc2lnbmVkIGludCBuYnl0ZXMpCi17Ci0JamNvcHkoJnBidWYtPmNhcnJ5LnZhbDhbMF0sIGZyb20sIG5ieXRlcyk7Ci0JcGJ1Zi0+Y2FycnlfYnl0ZXMgPSBuYnl0ZXM7Ci19Ci0KLS8qCi0gKiBSZWFkIG5ieXRlcyBieXRlcyBmcm9tICJmcm9tIiBhbmQgcHV0IHRoZW0gYXQgdGhlIGVuZCBvZiBwYnVmLT5jYXJyeS4KLSAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIGV4dHJhIHJlYWQgZG9lcyBub3Qgb3ZlcmZpbGwgY2FycnkuCi0gKgotICogTk9URVM6Ci0gKiBvIGZyb20gbWF5IF9ub3RfIGJlIHU2NCBhbGlnbmVkCi0gKiBvIG5ieXRlcyBtYXkgc3BhbiBhIFFXIGJvdW5kYXJ5Ci0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCByZWFkX2V4dHJhX2J5dGVzKHN0cnVjdCBwaW9fYnVmICpwYnVmLAotCQkJCSAgICBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQotewotCWpjb3B5KCZwYnVmLT5jYXJyeS52YWw4W3BidWYtPmNhcnJ5X2J5dGVzXSwgZnJvbSwgbmJ5dGVzKTsKLQlwYnVmLT5jYXJyeV9ieXRlcyArPSBuYnl0ZXM7Ci19Ci0KLS8qCi0gKiBaZXJvIGV4dHJhIGJ5dGVzIGZyb20gdGhlIGVuZCBvZiBwYnVmLT5jYXJyeS4KLSAqCi0gKiBXZSBkbyBub3QgY2FyZSBhYm91dCB0aGUgdmFsdWUgb2YgdW51c2VkIGJ5dGVzIGluIGNhcnJ5LCBzbyBqdXN0Ci0gKiByZWR1Y2UgdGhlIGJ5dGUgY291bnQuCi0gKgotICogTk9URVM6Ci0gKiBvIHpieXRlcyA8PSBvbGRfYnl0ZXMKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHplcm9fZXh0cmFfYnl0ZXMoc3RydWN0IHBpb19idWYgKnBidWYsIHVuc2lnbmVkIGludCB6Ynl0ZXMpCi17Ci0JcGJ1Zi0+Y2FycnlfYnl0ZXMgLT0gemJ5dGVzOwotfQotCi0vKgotICogV3JpdGUgYSBxdWFkIHdvcmQgdXNpbmcgcGFydHMgb2YgcGJ1Zi0+Y2FycnkgYW5kIHRoZSBuZXh0IDggYnl0ZXMgb2Ygc3JjLgotICogUHV0IHRoZSB1bnVzZWQgcGFydCBvZiB0aGUgbmV4dCA4IGJ5dGVzIG9mIHNyYyBpbnRvIHRoZSBsb3cgYnl0ZXMgb2YKLSAqIHBidWYtPmNhcnJ5LgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgbWVyZ2Vfd3JpdGU4KAotCXN0cnVjdCBwaW9fYnVmICpwYnVmLAotCXZvaWQgKmRlc3QsCi0JY29uc3Qgdm9pZCAqc3JjKQotewotCXUzMiByZW1haW5kZXIgPSA4IC0gcGJ1Zi0+Y2FycnlfYnl0ZXM7Ci0KLQlqY29weSgmcGJ1Zi0+Y2FycnkudmFsOFtwYnVmLT5jYXJyeV9ieXRlc10sIHNyYywgcmVtYWluZGVyKTsKLQl3cml0ZXEocGJ1Zi0+Y2FycnkudmFsNjQsIGRlc3QpOwotCWpjb3B5KCZwYnVmLT5jYXJyeS52YWw4WzBdLCBzcmMgKyByZW1haW5kZXIsIHBidWYtPmNhcnJ5X2J5dGVzKTsKLX0KLQotLyoKLSAqIFdyaXRlIGEgcXVhZCB3b3JkIHVzaW5nIGFsbCBieXRlcyBvZiBjYXJyeS4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGNhcnJ5OF93cml0ZTgodW5pb24gbWl4IGNhcnJ5LCB2b2lkICpkZXN0KQotewotCXdyaXRlcShjYXJyeS52YWw2NCwgZGVzdCk7Ci19Ci0KLS8qCi0gKiBXcml0ZSBhIHF1YWQgd29yZCB1c2luZyBhbGwgdGhlIHZhbGlkIGJ5dGVzIG9mIGNhcnJ5LiAgSWYgY2FycnkKLSAqIGhhcyB6ZXJvIHZhbGlkIGJ5dGVzLCBub3RoaW5nIGlzIHdyaXR0ZW4uCi0gKiBSZXR1cm5zIDAgb24gbm90aGluZyB3cml0dGVuLCBub24temVybyBvbiBxdWFkIHdvcmQgd3JpdHRlbi4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgY2Fycnlfd3JpdGU4KHN0cnVjdCBwaW9fYnVmICpwYnVmLCB2b2lkICpkZXN0KQotewotCWlmIChwYnVmLT5jYXJyeV9ieXRlcykgewotCQl1NjQgemVybyA9IDA7Ci0KLQkJamNvcHkoJnBidWYtPmNhcnJ5LnZhbDhbcGJ1Zi0+Y2FycnlfYnl0ZXNdLCAodTggKikmemVybywKLQkJICAgICAgOCAtIHBidWYtPmNhcnJ5X2J5dGVzKTsKLQkJd3JpdGVxKHBidWYtPmNhcnJ5LnZhbDY0LCBkZXN0KTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogVVNFX1NISUZUUyAqLwotCiAvKgogICogU2VnbWVudGVkIFBJTyBDb3B5IC0gc3RhcnQKICAqCkBAIC01NTAsOCArMzk4LDggQEAKIHsKIAl2b2lkIF9faW9tZW0gKmRlc3QgPSBwYnVmLT5zdGFydCArIChwYnVmLT5xd193cml0dGVuICogc2l6ZW9mKHU2NCkpOwogCXZvaWQgX19pb21lbSAqZGVuZDsJCQkvKiA4LWJ5dGUgZGF0YSBlbmQgKi8KLQl1bnNpZ25lZCBsb25nIHF3X3RvX3dyaXRlID0gKHBidWYtPmNhcnJ5X2J5dGVzICsgbmJ5dGVzKSA+PiAzOwotCXVuc2lnbmVkIGxvbmcgYnl0ZXNfbGVmdCA9IChwYnVmLT5jYXJyeV9ieXRlcyArIG5ieXRlcykgJiAweDc7CisJdW5zaWduZWQgbG9uZyBxd190b193cml0ZSA9IG5ieXRlcyA+PiAzOworCXVuc2lnbmVkIGxvbmcgYnl0ZXNfbGVmdCA9IG5ieXRlcyAmIDB4NzsKIAogCS8qIGNhbGN1bGF0ZSA4LWJ5dGUgZGF0YSBlbmQgKi8KIAlkZW5kID0gZGVzdCArIChxd190b193cml0ZSAqIHNpemVvZih1NjQpKTsKQEAgLTYyMSwxNiArNDY5LDQ2IEBACiAJCWRlc3QgKz0gc2l6ZW9mKHU2NCk7CiAJfQogCi0JLyogYWRqdXN0IGNhcnJ5ICovCi0JaWYgKHBidWYtPmNhcnJ5X2J5dGVzIDwgYnl0ZXNfbGVmdCkgewotCQkvKiBuZWVkIHRvIHJlYWQgbW9yZSAqLwotCQlyZWFkX2V4dHJhX2J5dGVzKHBidWYsIGZyb20sIGJ5dGVzX2xlZnQgLSBwYnVmLT5jYXJyeV9ieXRlcyk7Ci0JfSBlbHNlIHsKLQkJLyogcmVtb3ZlIGludmFsaWQgYnl0ZXMgKi8KLQkJemVyb19leHRyYV9ieXRlcyhwYnVmLCBwYnVmLT5jYXJyeV9ieXRlcyAtIGJ5dGVzX2xlZnQpOwotCX0KLQogCXBidWYtPnF3X3dyaXR0ZW4gKz0gcXdfdG9fd3JpdGU7CisKKwkvKiBoYW5kbGUgY2FycnkgYW5kIGxlZnQtb3ZlciBieXRlcyAqLworCWlmIChwYnVmLT5jYXJyeV9ieXRlcyArIGJ5dGVzX2xlZnQgPj0gOCkgeworCQl1bnNpZ25lZCBsb25nIG5yZWFkOworCisJCS8qIHRoZXJlIGlzIGVub3VnaCB0byBmaWxsIGFub3RoZXIgcXcgLSBmaWxsIGNhcnJ5ICovCisJCW5yZWFkID0gOCAtIHBidWYtPmNhcnJ5X2J5dGVzOworCQlyZWFkX2V4dHJhX2J5dGVzKHBidWYsIGZyb20sIG5yZWFkKTsKKworCQkvKgorCQkgKiBPbmUgbW9yZSB3cml0ZSAtIGJ1dCBuZWVkIHRvIG1ha2Ugc3VyZSBkZXN0IGlzIGNvcnJlY3QuCisJCSAqIENoZWNrIGZvciB3cmFwIGFuZCB0aGUgcG9zc2liaWxpdHkgdGhlIHdyaXRlCisJCSAqIHNob3VsZCBiZSBpbiBTT1Agc3BhY2UuCisJCSAqCisJCSAqIFRoZSB0d28gY2hlY2tzIGltbWVkaWF0ZWx5IGJlbG93IGNhbm5vdCBib3RoIGJlIHRydWUsIGhlbmNlCisJCSAqIHRoZSBlbHNlLiBJZiB3ZSBoYXZlIHdyYXBwZWQsIHdlIGNhbm5vdCBzdGlsbCBiZSB3aXRoaW4gdGhlCisJCSAqIGZpcnN0IGJsb2NrLiBDb252ZXJzZWx5LCBpZiB3ZSBhcmUgc3RpbGwgaW4gdGhlIGZpcnN0IGJsb2NrLAorCQkgKiB3ZSBjYW5ub3QgaGF2ZSB3cmFwcGVkLiBXZSBkbyB0aGUgd3JhcCBjaGVjayBmaXJzdCBhcyB0aGF0CisJCSAqIGlzIG1vcmUgbGlrZWx5LgorCQkgKi8KKwkJLyogYWRqdXN0IGlmIHdlIGhhdmUgd3JhcHBlZCAqLworCQlpZiAoZGVzdCA+PSBwYnVmLT5lbmQpCisJCQlkZXN0IC09IHBidWYtPnNpemU7CisJCS8qIGp1bXAgdG8gdGhlIFNPUCByYW5nZSBpZiB3aXRoaW4gdGhlIGZpcnN0IGJsb2NrICovCisJCWVsc2UgaWYgKHBidWYtPnF3X3dyaXR0ZW4gPCBQSU9fQkxPQ0tfUVdTKQorCQkJZGVzdCArPSBTT1BfRElTVEFOQ0U7CisKKwkJLyogZmx1c2ggb3V0IGZ1bGwgY2FycnkgKi8KKwkJY2Fycnk4X3dyaXRlOChwYnVmLT5jYXJyeSwgZGVzdCk7CisJCXBidWYtPnF3X3dyaXR0ZW4rKzsKKworCQkvKiBub3cgYWRqdXN0IGFuZCByZWFkIHRoZSByZXN0IG9mIHRoZSBieXRlcyBpbnRvIGNhcnJ5ICovCisJCWJ5dGVzX2xlZnQgLT0gbnJlYWQ7CisJCWZyb20gKz0gbnJlYWQ7IC8qIGZyb20gaXMgbm93IG5vdCBhbGlnbmVkICovCisJCXJlYWRfbG93X2J5dGVzKHBidWYsIGZyb20sIGJ5dGVzX2xlZnQpOworCX0gZWxzZSB7CisJCS8qIG5vdCBlbm91Z2ggdG8gZmlsbCBhbm90aGVyIHF3LCBhcHBlbmQgdGhlIHJlc3QgdG8gY2FycnkgKi8KKwkJcmVhZF9leHRyYV9ieXRlcyhwYnVmLCBmcm9tLCBieXRlc19sZWZ0KTsKKwl9CiB9CiAKIC8qCkBAIC03NzEsNiArNjQ5LDkgQEAKIAkJCXJlYWRfZXh0cmFfYnl0ZXMocGJ1ZiwgZnJvbSwgdG9fZmlsbCk7CiAJCQlmcm9tICs9IHRvX2ZpbGw7CiAJCQluYnl0ZXMgLT0gdG9fZmlsbDsKKwkJCS8qIG1heSBub3QgYmUgZW5vdWdoIHZhbGlkIGJ5dGVzIGxlZnQgdG8gYWxpZ24gKi8KKwkJCWlmIChleHRyYSA+IG5ieXRlcykKKwkJCQlleHRyYSA9IG5ieXRlczsKIAogCQkJLyogLi4ubm93IHdyaXRlIGNhcnJ5ICovCiAJCQlkZXN0ID0gcGJ1Zi0+c3RhcnQgKyAocGJ1Zi0+cXdfd3JpdHRlbiAqIHNpemVvZih1NjQpKTsKQEAgLTc5OCw2ICs2NzksMTUgQEAKIAkJCXJlYWRfbG93X2J5dGVzKHBidWYsIGZyb20sIGV4dHJhKTsKIAkJCWZyb20gKz0gZXh0cmE7CiAJCQluYnl0ZXMgLT0gZXh0cmE7CisJCQkvKgorCQkJICogSWYgbm8gYnl0ZXMgYXJlIGxlZnQsIHJldHVybiBlYXJseSAtIHdlIGFyZSBkb25lLgorCQkJICogTk9URTogVGhpcyBzaG9ydC1jaXJjdWl0IGlzICpyZXF1aXJlZCogYmVjYXVzZQorCQkJICogImV4dHJhIiBtYXkgaGF2ZSBiZWVuIHJlZHVjZWQgaW4gc2l6ZSBhbmQgImZyb20iCisJCQkgKiBpcyBub3QgYWxpZ25lZCwgYXMgcmVxdWlyZWQgd2hlbiBsZWF2aW5nIHRoaXMKKwkJCSAqIGlmIGJsb2NrLgorCQkJICovCisJCQlpZiAobmJ5dGVzID09IDApCisJCQkJcmV0dXJuOwogCQl9CiAKIAkJLyogYXQgdGhpcyBwb2ludCwgZnJvbSBpcyBRVyBhbGlnbmVkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9wbGF0Zm9ybS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcGxhdGZvcm0uYwppbmRleCA5NjVjOGFlLi4yMDI0MzMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3BsYXRmb3JtLmMKQEAgLTQ3LDI5ICs0NywzOSBAQAogCiAjaW5jbHVkZSAiaGZpLmgiCiAjaW5jbHVkZSAiZWZpdmFyLmgiCisjaW5jbHVkZSAiZXByb20uaCIKIAogdm9pZCBnZXRfcGxhdGZvcm1fY29uZmlnKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkKQogewogCWludCByZXQgPSAwOwogCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IDA7CiAJdTggKnRlbXBfcGxhdGZvcm1fY29uZmlnID0gTlVMTDsKKwl1MzIgZXNpemU7CisKKwlyZXQgPSBlcHJvbV9yZWFkX3BsYXRmb3JtX2NvbmZpZyhkZCwgKHZvaWQgKiopJnRlbXBfcGxhdGZvcm1fY29uZmlnLAorCQkJCQkgJmVzaXplKTsKKwlpZiAoIXJldCkgeworCQkvKiBzdWNjZXNzICovCisJCXNpemUgPSBlc2l6ZTsKKwkJZ290byBzdWNjZXNzOworCX0KKwkvKiBmYWlsLCB0cnkgRUZJIHZhcmlhYmxlICovCiAKIAlyZXQgPSByZWFkX2hmaTFfZWZpX3ZhcihkZCwgImNvbmZpZ3VyYXRpb24iLCAmc2l6ZSwKIAkJCQkodm9pZCAqKikmdGVtcF9wbGF0Zm9ybV9jb25maWcpOwotCWlmIChyZXQpIHsKLQkJZGRfZGV2X2luZm8oZGQsCi0JCQkgICAgIiVzOiBGYWlsZWQgdG8gZ2V0IHBsYXRmb3JtIGNvbmZpZyBmcm9tIFVFRkksIGZhbGxpbmcgYmFjayB0byByZXF1ZXN0IGZpcm13YXJlXG4iLAotCQkJICAgIF9fZnVuY19fKTsKLQkJLyogZmFsbCBiYWNrIHRvIHJlcXVlc3QgZmlybXdhcmUgKi8KLQkJcGxhdGZvcm1fY29uZmlnX2xvYWQgPSAxOwotCQlnb3RvIGJhaWw7Ci0JfQorCWlmICghcmV0KQorCQlnb3RvIHN1Y2Nlc3M7CiAKKwlkZF9kZXZfaW5mbyhkZCwKKwkJICAgICIlczogRmFpbGVkIHRvIGdldCBwbGF0Zm9ybSBjb25maWcgZnJvbSBVRUZJLCBmYWxsaW5nIGJhY2sgdG8gcmVxdWVzdCBmaXJtd2FyZVxuIiwKKwkJICAgIF9fZnVuY19fKTsKKwkvKiBmYWxsIGJhY2sgdG8gcmVxdWVzdCBmaXJtd2FyZSAqLworCXBsYXRmb3JtX2NvbmZpZ19sb2FkID0gMTsKKwlyZXR1cm47CisKK3N1Y2Nlc3M6CiAJZGQtPnBsYXRmb3JtX2NvbmZpZy5kYXRhID0gdGVtcF9wbGF0Zm9ybV9jb25maWc7CiAJZGQtPnBsYXRmb3JtX2NvbmZpZy5zaXplID0gc2l6ZTsKLQotYmFpbDoKLQkvKiBleGl0ICovOwogfQogCiB2b2lkIGZyZWVfcGxhdGZvcm1fY29uZmlnKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcXAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3FwLmMKaW5kZXggYTVhYTM1MS4uOWZjNzVlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcXAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9xcC5jCkBAIC0yMDIsOCArMjAyLDcgQEAKIAl3cml0ZV9zZXFsb2NrX2lycXNhdmUoJmRldi0+aW93YWl0X2xvY2ssIGZsYWdzKTsKIAlpZiAoIWxpc3RfZW1wdHkoJnByaXYtPnNfaW93YWl0Lmxpc3QpKSB7CiAJCWxpc3RfZGVsX2luaXQoJnByaXYtPnNfaW93YWl0Lmxpc3QpOwotCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcXAtPnJlZmNvdW50KSkKLQkJCXdha2VfdXAoJnFwLT53YWl0KTsKKwkJcnZ0X3B1dF9xcChxcCk7CiAJfQogCXdyaXRlX3NlcXVubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlvd2FpdF9sb2NrLCBmbGFncyk7CiB9CkBAIC00NTAsMTMgKzQ0OSwxNCBAQAogICovCiB2b2lkIGhmaTFfc2NoZWR1bGVfc2VuZChzdHJ1Y3QgcnZ0X3FwICpxcCkKIHsKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAlpZiAoaGZpMV9zZW5kX29rKHFwKSkKIAkJX2hmaTFfc2NoZWR1bGVfc2VuZChxcCk7CiB9CiAKIC8qKgotICogaGZpMV9nZXRfY3JlZGl0IC0gZmx1c2ggdGhlIHNlbmQgd29yayBxdWV1ZSBvZiBhIFFQCi0gKiBAcXA6IHRoZSBxcCB3aG8ncyBzZW5kIHdvcmsgcXVldWUgdG8gZmx1c2gKKyAqIGhmaTFfZ2V0X2NyZWRpdCAtIGhhbmRsZSBjcmVkaXQgaW4gYWV0aAorICogQHFwOiB0aGUgcXAKICAqIEBhZXRoOiB0aGUgQWNrbm93bGVkZ2UgRXh0ZW5kZWQgVHJhbnNwb3J0IEhlYWRlcgogICoKICAqIFRoZSBRUCBzX2xvY2sgc2hvdWxkIGJlIGhlbGQuCkBAIC00NjUsNiArNDY1LDcgQEAKIHsKIAl1MzIgY3JlZGl0ID0gKGFldGggPj4gSEZJMV9BRVRIX0NSRURJVF9TSElGVCkgJiBIRkkxX0FFVEhfQ1JFRElUX01BU0s7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAkvKgogCSAqIElmIHRoZSBjcmVkaXQgaXMgaW52YWxpZCwgd2UgY2FuIHNlbmQKIAkgKiBhcyBtYW55IHBhY2tldHMgYXMgd2UgbGlrZS4gIE90aGVyd2lzZSwgd2UgaGF2ZSB0bwpAQCAtNTAzLDggKzUwNCw3IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFwLT5zX2xvY2ssIGZsYWdzKTsKIAkvKiBOb3RpZnkgaGZpMV9kZXN0cm95X3FwKCkgaWYgaXQgaXMgd2FpdGluZy4gKi8KLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcXAtPnJlZmNvdW50KSkKLQkJd2FrZV91cCgmcXAtPndhaXQpOworCXJ2dF9wdXRfcXAocXApOwogfQogCiBzdGF0aWMgaW50IGlvd2FpdF9zbGVlcCgKQEAgLTU0NCw3ICs1NDQsNyBAQAogCQkJcXAtPnNfZmxhZ3MgfD0gUlZUX1NfV0FJVF9ETUFfREVTQzsKIAkJCWxpc3RfYWRkX3RhaWwoJnByaXYtPnNfaW93YWl0Lmxpc3QsICZzZGUtPmRtYXdhaXQpOwogCQkJdHJhY2VfaGZpMV9xcHNsZWVwKHFwLCBSVlRfU19XQUlUX0RNQV9ERVNDKTsKLQkJCWF0b21pY19pbmMoJnFwLT5yZWZjb3VudCk7CisJCQlydnRfZ2V0X3FwKHFwKTsKIAkJfQogCQl3cml0ZV9zZXF1bmxvY2soJmRldi0+aW93YWl0X2xvY2spOwogCQlxcC0+c19mbGFncyAmPSB+UlZUX1NfQlVTWTsKQEAgLTY1NiwxMCArNjU2LDYgQEAKIAogCWl0ZXItPmRldiA9IGRldjsKIAlpdGVyLT5zcGVjaWFscyA9IGRldi0+cmRpLmliZGV2LnBoeXNfcG9ydF9jbnQgKiAyOwotCWlmIChxcF9pdGVyX25leHQoaXRlcikpIHsKLQkJa2ZyZWUoaXRlcik7Ci0JCXJldHVybiBOVUxMOwotCX0KIAogCXJldHVybiBpdGVyOwogfQpAQCAtODEyLDYgKzgwOCwxMyBAQAogCQlrZnJlZShwcml2KTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQorCWlvd2FpdF9pbml0KAorCQkmcHJpdi0+c19pb3dhaXQsCisJCTEsCisJCV9oZmkxX2RvX3NlbmQsCisJCWlvd2FpdF9zbGVlcCwKKwkJaW93YWl0X3dha2V1cCwKKwkJaW93YWl0X3NkbWFfZHJhaW5lZCk7CiAJc2V0dXBfdGltZXIoJnByaXYtPnNfcm5yX3RpbWVyLCBoZmkxX3JjX3Jucl9yZXRyeSwgKHVuc2lnbmVkIGxvbmcpcXApOwogCXFwLT5zX3RpbWVyLmZ1bmN0aW9uID0gaGZpMV9yY190aW1lb3V0OwogCXJldHVybiBwcml2OwpAQCAtODUyLDYgKzg1NSw3IEBACiAKIHZvaWQgZmx1c2hfcXBfd2FpdGVycyhzdHJ1Y3QgcnZ0X3FwICpxcCkKIHsKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAlmbHVzaF9pb3dhaXQocXApOwogCWhmaTFfc3RvcF9yY190aW1lcnMocXApOwogfQpAQCAtODc3LDEzICs4ODEsNiBAQAogewogCXN0cnVjdCBoZmkxX3FwX3ByaXYgKnByaXYgPSBxcC0+cHJpdjsKIAotCWlvd2FpdF9pbml0KAotCQkmcHJpdi0+c19pb3dhaXQsCi0JCTEsCi0JCV9oZmkxX2RvX3NlbmQsCi0JCWlvd2FpdF9zbGVlcCwKLQkJaW93YWl0X3dha2V1cCwKLQkJaW93YWl0X3NkbWFfZHJhaW5lZCk7CiAJcHJpdi0+cl9hZGVmZXJlZCA9IDA7CiAJY2xlYXJfYWhnKHFwKTsKIH0KQEAgLTk2Nyw4ICs5NjQsNyBAQAogCWlmICghbGlzdF9lbXB0eSgmcHJpdi0+c19pb3dhaXQubGlzdCkgJiYgIShxcC0+c19mbGFncyAmIFJWVF9TX0JVU1kpKSB7CiAJCXFwLT5zX2ZsYWdzICY9IH5SVlRfU19BTllfV0FJVF9JTzsKIAkJbGlzdF9kZWxfaW5pdCgmcHJpdi0+c19pb3dhaXQubGlzdCk7Ci0JCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZxcC0+cmVmY291bnQpKQotCQkJd2FrZV91cCgmcXAtPndhaXQpOworCQlydnRfcHV0X3FwKHFwKTsKIAl9CiAJd3JpdGVfc2VxdW5sb2NrKCZkZXYtPmlvd2FpdF9sb2NrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcXNmcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcXNmcC5jCmluZGV4IGEyMDc3MTcuLjE4NjlmNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3FzZnAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9xc2ZwLmMKQEAgLTE2MSw3ICsxNjEsNyBAQAogCWJ1cy0+YWxnby5nZXRzZGEgPSBoZmkxX2dldHNkYTsKIAlidXMtPmFsZ28uZ2V0c2NsID0gaGZpMV9nZXRzY2w7CiAJYnVzLT5hbGdvLnVkZWxheSA9IDU7Ci0JYnVzLT5hbGdvLnRpbWVvdXQgPSB1c2Vjc190b19qaWZmaWVzKDUwKTsKKwlidXMtPmFsZ28udGltZW91dCA9IHVzZWNzX3RvX2ppZmZpZXMoMTAwMDAwKTsKIAlidXMtPmFsZ28uZGF0YSA9IGJ1czsKIAogCWJ1cy0+YWRhcHRlci5vd25lciA9IFRISVNfTU9EVUxFOwpAQCAtNzA2LDggKzcwNiw4IEBACiAJCSAgIHU4ICpkYXRhKQogewogCXN0cnVjdCBoZmkxX3Bwb3J0ZGF0YSAqcHBkOwotCXUzMiBleGNlc3NfbGVuID0gMDsKLQlpbnQgcmV0ID0gMDsKKwl1MzIgZXhjZXNzX2xlbiA9IGxlbjsKKwlpbnQgcmV0ID0gMCwgb2Zmc2V0ID0gMDsKIAogCWlmIChwb3J0X251bSA+IGRkLT5udW1fcHBvcnRzIHx8IHBvcnRfbnVtIDwgMSkgewogCQlkZF9kZXZfaW5mbyhkZCwgIiVzOiBJbnZhbGlkIHBvcnQgbnVtYmVyICVkXG4iLApAQCAtNzQwLDYgKzc0MCwzNCBAQAogCX0KIAogCW1lbWNweShkYXRhLCAmcHBkLT5xc2ZwX2luZm8uY2FjaGVbYWRkcl0sIGxlbik7CisKKwlpZiAoYWRkciA8PSBRU0ZQX01PTklUT1JfVkFMX0VORCAmJgorCSAgICAoYWRkciArIGxlbikgPj0gUVNGUF9NT05JVE9SX1ZBTF9TVEFSVCkgeworCQkvKiBPdmVybGFwIHdpdGggdGhlIGR5bmFtaWMgY2hhbm5lbCBtb25pdG9yIHJhbmdlICovCisJCWlmIChhZGRyIDwgUVNGUF9NT05JVE9SX1ZBTF9TVEFSVCkgeworCQkJaWYgKGFkZHIgKyBsZW4gPD0gUVNGUF9NT05JVE9SX1ZBTF9FTkQpCisJCQkJbGVuID0gYWRkciArIGxlbiAtIFFTRlBfTU9OSVRPUl9WQUxfU1RBUlQ7CisJCQllbHNlCisJCQkJbGVuID0gUVNGUF9NT05JVE9SX1JBTkdFOworCQkJb2Zmc2V0ID0gUVNGUF9NT05JVE9SX1ZBTF9TVEFSVCAtIGFkZHI7CisJCQlhZGRyID0gUVNGUF9NT05JVE9SX1ZBTF9TVEFSVDsKKwkJfSBlbHNlIGlmIChhZGRyID09IFFTRlBfTU9OSVRPUl9WQUxfU1RBUlQpIHsKKwkJCW9mZnNldCA9IDA7CisJCQlpZiAoYWRkciArIGxlbiA+IFFTRlBfTU9OSVRPUl9WQUxfRU5EKQorCQkJCWxlbiA9IFFTRlBfTU9OSVRPUl9SQU5HRTsKKwkJfSBlbHNlIHsKKwkJCW9mZnNldCA9IDA7CisJCQlpZiAoYWRkciArIGxlbiA+IFFTRlBfTU9OSVRPUl9WQUxfRU5EKQorCQkJCWxlbiA9IFFTRlBfTU9OSVRPUl9WQUxfRU5EIC0gYWRkciArIDE7CisJCX0KKwkJLyogUmVmcmVzaCB0aGUgdmFsdWVzIG9mIHRoZSBkeW5hbWljIG1vbml0b3JzIGZyb20gdGhlIGNhYmxlICovCisJCXJldCA9IG9uZV9xc2ZwX3JlYWQocHBkLCBkZC0+aGZpMV9pZCwgYWRkciwgZGF0YSArIG9mZnNldCwgbGVuKTsKKwkJaWYgKHJldCAhPSBsZW4pIHsKKwkJCXJldCA9IC1FQUdBSU47CisJCQlnb3RvIHNldF96ZXJvZXM7CisJCX0KKwl9CisKIAlyZXR1cm4gMDsKIAogc2V0X3plcm9lczoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3FzZnAuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3FzZnAuaAppbmRleCA2OTI3NWViLi4zNmNmNTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9xc2ZwLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcXNmcC5oCkBAIC03NCw2ICs3NCw5IEBACiAvKiBEZWZpbmVkIGZpZWxkcyB0aGF0IEludGVsIHJlcXVpcmVzIG9mIHF1YWxpZmllZCBjYWJsZXMgKi8KIC8qIEJ5dGUgMCBpcyBJZGVudGlmaWVyLCBub3QgY2hlY2tlZCAqLwogLyogQnl0ZSAxIGlzIHJlc2VydmVkICJzdGF0dXMgTVNCIiAqLworI2RlZmluZSBRU0ZQX01PTklUT1JfVkFMX1NUQVJUIDIyCisjZGVmaW5lIFFTRlBfTU9OSVRPUl9WQUxfRU5EIDgxCisjZGVmaW5lIFFTRlBfTU9OSVRPUl9SQU5HRSAoUVNGUF9NT05JVE9SX1ZBTF9FTkQgLSBRU0ZQX01PTklUT1JfVkFMX1NUQVJUICsgMSkKICNkZWZpbmUgUVNGUF9UWF9DVFJMX0JZVEVfT0ZGUyA4NgogI2RlZmluZSBRU0ZQX1BXUl9DVFJMX0JZVEVfT0ZGUyA5MwogI2RlZmluZSBRU0ZQX0NEUl9DVFJMX0JZVEVfT0ZGUyA5OApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcmMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3JjLmMKaW5kZXggNWRhMTkwZS4uOGJjNTAxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcmMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9yYy5jCkBAIC01NSw3ICs1NSw3IEBACiAjaW5jbHVkZSAidHJhY2UuaCIKIAogLyogY3V0IGRvd24gcmlkaWN1bG91c2x5IGxvbmcgSUIgbWFjcm8gbmFtZXMgKi8KLSNkZWZpbmUgT1AoeCkgSUJfT1BDT0RFX1JDXyMjeAorI2RlZmluZSBPUCh4KSBSQ19PUCh4KQogCiAvKioKICAqIGhmaTFfYWRkX3JldHJ5X3RpbWVyIC0gYWRkL3N0YXJ0IGEgcmV0cnkgdGltZXIKQEAgLTY4LDYgKzY4LDcgQEAKIAlzdHJ1Y3QgaWJfcXAgKmlicXAgPSAmcXAtPmlicXA7CiAJc3RydWN0IHJ2dF9kZXZfaW5mbyAqcmRpID0gaWJfdG9fcnZ0KGlicXAtPmRldmljZSk7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAlxcC0+c19mbGFncyB8PSBSVlRfU19USU1FUjsKIAkvKiA0LjA5NiB1c2VjLiAqICgxIDw8IHFwLT50aW1lb3V0KSAqLwogCXFwLT5zX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgcXAtPnRpbWVvdXRfamlmZmllcyArCkBAIC04Niw2ICs4Nyw3IEBACiB7CiAJc3RydWN0IGhmaTFfcXBfcHJpdiAqcHJpdiA9IHFwLT5wcml2OwogCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcXAtPnNfbG9jayk7CiAJcXAtPnNfZmxhZ3MgfD0gUlZUX1NfV0FJVF9STlI7CiAJcXAtPnNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyB1c2Vjc190b19qaWZmaWVzKHRvKTsKIAlhZGRfdGltZXIoJnByaXYtPnNfcm5yX3RpbWVyKTsKQEAgLTEwMyw2ICsxMDUsNyBAQAogCXN0cnVjdCBpYl9xcCAqaWJxcCA9ICZxcC0+aWJxcDsKIAlzdHJ1Y3QgcnZ0X2Rldl9pbmZvICpyZGkgPSBpYl90b19ydnQoaWJxcC0+ZGV2aWNlKTsKIAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnFwLT5zX2xvY2spOwogCXFwLT5zX2ZsYWdzIHw9IFJWVF9TX1RJTUVSOwogCS8qIDQuMDk2IHVzZWMuICogKDEgPDwgcXAtPnRpbWVvdXQpICovCiAJbW9kX3RpbWVyKCZxcC0+c190aW1lciwgamlmZmllcyArIHFwLT50aW1lb3V0X2ppZmZpZXMgKwpAQCAtMTIwLDYgKzEyMyw3IEBACiB7CiAJaW50IHJ2YWwgPSAwOwogCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcXAtPnNfbG9jayk7CiAJLyogUmVtb3ZlIFFQIGZyb20gcmV0cnkgKi8KIAlpZiAocXAtPnNfZmxhZ3MgJiBSVlRfU19USU1FUikgewogCQlxcC0+c19mbGFncyAmPSB+UlZUX1NfVElNRVI7CkBAIC0xMzgsNiArMTQyLDcgQEAKIHsKIAlzdHJ1Y3QgaGZpMV9xcF9wcml2ICpwcml2ID0gcXAtPnByaXY7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAkvKiBSZW1vdmUgUVAgZnJvbSBhbGwgdGltZXJzICovCiAJaWYgKHFwLT5zX2ZsYWdzICYgKFJWVF9TX1RJTUVSIHwgUlZUX1NfV0FJVF9STlIpKSB7CiAJCXFwLT5zX2ZsYWdzICY9IH4oUlZUX1NfVElNRVIgfCBSVlRfU19XQUlUX1JOUik7CkBAIC0xNTgsNiArMTYzLDcgQEAKIAlpbnQgcnZhbCA9IDA7CiAJc3RydWN0IGhmaTFfcXBfcHJpdiAqcHJpdiA9IHFwLT5wcml2OwogCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcXAtPnNfbG9jayk7CiAJLyogUmVtb3ZlIFFQIGZyb20gcm5yIHRpbWVyICovCiAJaWYgKHFwLT5zX2ZsYWdzICYgUlZUX1NfV0FJVF9STlIpIHsKIAkJcXAtPnNfZmxhZ3MgJj0gflJWVF9TX1dBSVRfUk5SOwpAQCAtMTc4LDE4ICsxODQsNiBAQAogCWRlbF90aW1lcl9zeW5jKCZwcml2LT5zX3Jucl90aW1lcik7CiB9CiAKLS8qIG9ubHkgb3Bjb2RlIG1hc2sgZm9yIGFkYXB0aXZlIHBpbyAqLwotY29uc3QgdTMyIHJjX29ubHlfb3Bjb2RlID0KLQlCSVQoT1AoU0VORF9PTkxZKSAmIDB4MWYpIHwKLQlCSVQoT1AoU0VORF9PTkxZX1dJVEhfSU1NRURJQVRFICYgMHgxZikpIHwKLQlCSVQoT1AoUkRNQV9XUklURV9PTkxZICYgMHgxZikpIHwKLQlCSVQoT1AoUkRNQV9XUklURV9PTkxZX1dJVEhfSU1NRURJQVRFICYgMHgxZikpIHwKLQlCSVQoT1AoUkRNQV9SRUFEX1JFUVVFU1QgJiAweDFmKSkgfAotCUJJVChPUChBQ0tOT1dMRURHRSAmIDB4MWYpKSB8Ci0JQklUKE9QKEFUT01JQ19BQ0tOT1dMRURHRSAmIDB4MWYpKSB8Ci0JQklUKE9QKENPTVBBUkVfU1dBUCAmIDB4MWYpKSB8Ci0JQklUKE9QKEZFVENIX0FERCAmIDB4MWYpKTsKLQogc3RhdGljIHUzMiByZXN0YXJ0X3NnZShzdHJ1Y3QgcnZ0X3NnZV9zdGF0ZSAqc3MsIHN0cnVjdCBydnRfc3dxZSAqd3FlLAogCQkgICAgICAgdTMyIHBzbiwgdTMyIHBtdHUpCiB7CkBAIC0yMTYsNyArMjEwLDcgQEAKICAqIE5vdGUgdGhlIFFQIHNfbG9jayBtdXN0IGJlIGhlbGQuCiAgKi8KIHN0YXRpYyBpbnQgbWFrZV9yY19hY2soc3RydWN0IGhmaTFfaWJkZXYgKmRldiwgc3RydWN0IHJ2dF9xcCAqcXAsCi0JCSAgICAgICBzdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzICpvaGRyLAorCQkgICAgICAgc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHIsCiAJCSAgICAgICBzdHJ1Y3QgaGZpMV9wa3Rfc3RhdGUgKnBzKQogewogCXN0cnVjdCBydnRfYWNrX2VudHJ5ICplOwpAQCAtMjI4LDYgKzIyMiw3IEBACiAJdTMyIHBtdHUgPSBxcC0+cG10dTsKIAlzdHJ1Y3QgaGZpMV9xcF9wcml2ICpwcml2ID0gcXAtPnByaXY7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAkvKiBEb24ndCBzZW5kIGFuIEFDSyBpZiB3ZSBhcmVuJ3Qgc3VwcG9zZWQgdG8uICovCiAJaWYgKCEoaWJfcnZ0X3N0YXRlX29wc1txcC0+c3RhdGVdICYgUlZUX1BST0NFU1NfUkVDVl9PSykpCiAJCWdvdG8gYmFpbDsKQEAgLTI5OSwxMCArMjk0LDcgQEAKIAkJCWxlbiA9IDA7CiAJCQlxcC0+c19hY2tfc3RhdGUgPSBPUChBVE9NSUNfQUNLTk9XTEVER0UpOwogCQkJb2hkci0+dS5hdC5hZXRoID0gaGZpMV9jb21wdXRlX2FldGgocXApOwotCQkJb2hkci0+dS5hdC5hdG9taWNfYWNrX2V0aFswXSA9Ci0JCQkJY3B1X3RvX2JlMzIoZS0+YXRvbWljX2RhdGEgPj4gMzIpOwotCQkJb2hkci0+dS5hdC5hdG9taWNfYWNrX2V0aFsxXSA9Ci0JCQkJY3B1X3RvX2JlMzIoZS0+YXRvbWljX2RhdGEpOworCQkJaWJfdTY0X3B1dChlLT5hdG9taWNfZGF0YSwgJm9oZHItPnUuYXQuYXRvbWljX2Fja19ldGgpOwogCQkJaHdvcmRzICs9IHNpemVvZihvaGRyLT51LmF0KSAvIHNpemVvZih1MzIpOwogCQkJYnRoMiA9IG1hc2tfcHNuKGUtPnBzbik7CiAJCQllLT5zZW50ID0gMTsKQEAgLTM5MCw3ICszODIsNyBAQAogewogCXN0cnVjdCBoZmkxX3FwX3ByaXYgKnByaXYgPSBxcC0+cHJpdjsKIAlzdHJ1Y3QgaGZpMV9pYmRldiAqZGV2ID0gdG9faWRldihxcC0+aWJxcC5kZXZpY2UpOwotCXN0cnVjdCBoZmkxX290aGVyX2hlYWRlcnMgKm9oZHI7CisJc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHI7CiAJc3RydWN0IHJ2dF9zZ2Vfc3RhdGUgKnNzOwogCXN0cnVjdCBydnRfc3dxZSAqd3FlOwogCS8qIGhlYWRlciBzaXplIGluIDMyLWJpdCB3b3JkcyBMUkgrQlRIID0gKDgrMTIpLzQuICovCkBAIC00MDMsNiArMzk1LDcgQEAKIAlpbnQgbWlkZGxlID0gMDsKIAlpbnQgZGVsdGE7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAlwcy0+c190eHJlcSA9IGdldF90eHJlcShwcy0+ZGV2LCBxcCk7CiAJaWYgKElTX0VSUihwcy0+c190eHJlcSkpCiAJCWdvdG8gYmFpbF9ub190eDsKQEAgLTU2Niw4ICs1NTksOSBAQAogCQkJCXFwLT5zX2ZsYWdzIHw9IFJWVF9TX1dBSVRfU1NOX0NSRURJVDsKIAkJCQlnb3RvIGJhaWw7CiAJCQl9Ci0JCQlvaGRyLT51LnJjLnJldGgudmFkZHIgPQotCQkJCWNwdV90b19iZTY0KHdxZS0+cmRtYV93ci5yZW1vdGVfYWRkcik7CisJCQlwdXRfaWJfcmV0aF92YWRkcigKKwkJCQl3cWUtPnJkbWFfd3IucmVtb3RlX2FkZHIsCisJCQkJJm9oZHItPnUucmMucmV0aCk7CiAJCQlvaGRyLT51LnJjLnJldGgucmtleSA9CiAJCQkJY3B1X3RvX2JlMzIod3FlLT5yZG1hX3dyLnJrZXkpOwogCQkJb2hkci0+dS5yYy5yZXRoLmxlbmd0aCA9IGNwdV90b19iZTMyKGxlbik7CkBAIC02MDgsOCArNjAyLDkgQEAKIAkJCQlpZiAoIShxcC0+c19mbGFncyAmIFJWVF9TX1VOTElNSVRFRF9DUkVESVQpKQogCQkJCQlxcC0+c19sc24rKzsKIAkJCX0KLQkJCW9oZHItPnUucmMucmV0aC52YWRkciA9Ci0JCQkJY3B1X3RvX2JlNjQod3FlLT5yZG1hX3dyLnJlbW90ZV9hZGRyKTsKKwkJCXB1dF9pYl9yZXRoX3ZhZGRyKAorCQkJCXdxZS0+cmRtYV93ci5yZW1vdGVfYWRkciwKKwkJCQkmb2hkci0+dS5yYy5yZXRoKTsKIAkJCW9oZHItPnUucmMucmV0aC5ya2V5ID0KIAkJCQljcHVfdG9fYmUzMih3cWUtPnJkbWFfd3IucmtleSk7CiAJCQlvaGRyLT51LnJjLnJldGgubGVuZ3RoID0gY3B1X3RvX2JlMzIobGVuKTsKQEAgLTY0MCwyMCArNjM1LDE4IEBACiAJCQl9CiAJCQlpZiAod3FlLT53ci5vcGNvZGUgPT0gSUJfV1JfQVRPTUlDX0NNUF9BTkRfU1dQKSB7CiAJCQkJcXAtPnNfc3RhdGUgPSBPUChDT01QQVJFX1NXQVApOwotCQkJCW9oZHItPnUuYXRvbWljX2V0aC5zd2FwX2RhdGEgPSBjcHVfdG9fYmU2NCgKLQkJCQkJd3FlLT5hdG9taWNfd3Iuc3dhcCk7Ci0JCQkJb2hkci0+dS5hdG9taWNfZXRoLmNvbXBhcmVfZGF0YSA9IGNwdV90b19iZTY0KAotCQkJCQl3cWUtPmF0b21pY193ci5jb21wYXJlX2FkZCk7CisJCQkJcHV0X2liX2F0ZXRoX3N3YXAod3FlLT5hdG9taWNfd3Iuc3dhcCwKKwkJCQkJCSAgJm9oZHItPnUuYXRvbWljX2V0aCk7CisJCQkJcHV0X2liX2F0ZXRoX2NvbXBhcmUod3FlLT5hdG9taWNfd3IuY29tcGFyZV9hZGQsCisJCQkJCQkgICAgICZvaGRyLT51LmF0b21pY19ldGgpOwogCQkJfSBlbHNlIHsKIAkJCQlxcC0+c19zdGF0ZSA9IE9QKEZFVENIX0FERCk7Ci0JCQkJb2hkci0+dS5hdG9taWNfZXRoLnN3YXBfZGF0YSA9IGNwdV90b19iZTY0KAotCQkJCQl3cWUtPmF0b21pY193ci5jb21wYXJlX2FkZCk7Ci0JCQkJb2hkci0+dS5hdG9taWNfZXRoLmNvbXBhcmVfZGF0YSA9IDA7CisJCQkJcHV0X2liX2F0ZXRoX3N3YXAod3FlLT5hdG9taWNfd3IuY29tcGFyZV9hZGQsCisJCQkJCQkgICZvaGRyLT51LmF0b21pY19ldGgpOworCQkJCXB1dF9pYl9hdGV0aF9jb21wYXJlKDAsICZvaGRyLT51LmF0b21pY19ldGgpOwogCQkJfQotCQkJb2hkci0+dS5hdG9taWNfZXRoLnZhZGRyWzBdID0gY3B1X3RvX2JlMzIoCi0JCQkJd3FlLT5hdG9taWNfd3IucmVtb3RlX2FkZHIgPj4gMzIpOwotCQkJb2hkci0+dS5hdG9taWNfZXRoLnZhZGRyWzFdID0gY3B1X3RvX2JlMzIoCi0JCQkJd3FlLT5hdG9taWNfd3IucmVtb3RlX2FkZHIpOworCQkJcHV0X2liX2F0ZXRoX3ZhZGRyKHdxZS0+YXRvbWljX3dyLnJlbW90ZV9hZGRyLAorCQkJCQkgICAmb2hkci0+dS5hdG9taWNfZXRoKTsKIAkJCW9oZHItPnUuYXRvbWljX2V0aC5ya2V5ID0gY3B1X3RvX2JlMzIoCiAJCQkJd3FlLT5hdG9taWNfd3IucmtleSk7CiAJCQlod29yZHMgKz0gc2l6ZW9mKHN0cnVjdCBpYl9hdG9taWNfZXRoKSAvIHNpemVvZih1MzIpOwpAQCAtNzc5LDggKzc3Miw5IEBACiAJCSAqIFNlZSByZXN0YXJ0X3JjKCkuCiAJCSAqLwogCQlsZW4gPSAoZGVsdGFfcHNuKHFwLT5zX3Bzbiwgd3FlLT5wc24pKSAqIHBtdHU7Ci0JCW9oZHItPnUucmMucmV0aC52YWRkciA9Ci0JCQljcHVfdG9fYmU2NCh3cWUtPnJkbWFfd3IucmVtb3RlX2FkZHIgKyBsZW4pOworCQlwdXRfaWJfcmV0aF92YWRkcigKKwkJCXdxZS0+cmRtYV93ci5yZW1vdGVfYWRkciArIGxlbiwKKwkJCSZvaGRyLT51LnJjLnJldGgpOwogCQlvaGRyLT51LnJjLnJldGgucmtleSA9CiAJCQljcHVfdG9fYmUzMih3cWUtPnJkbWFfd3IucmtleSk7CiAJCW9oZHItPnUucmMucmV0aC5sZW5ndGggPSBjcHVfdG9fYmUzMih3cWUtPmxlbmd0aCAtIGxlbik7CkBAIC04NDEsNyArODM1LDcgQEAKICAqCiAgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIGhmaTFfcmNfcmN2KCkgYW5kIGhhbmRsZV9yZWNlaXZlX2ludGVycnVwdCgpLgogICogTm90ZSB0aGF0IFJETUEgcmVhZHMgYW5kIGF0b21pY3MgYXJlIGhhbmRsZWQgaW4gdGhlCi0gKiBzZW5kIHNpZGUgUVAgc3RhdGUgYW5kIHRhc2tsZXQuCisgKiBzZW5kIHNpZGUgUVAgc3RhdGUgYW5kIHNlbmQgZW5naW5lLgogICovCiB2b2lkIGhmaTFfc2VuZF9yY19hY2soc3RydWN0IGhmaTFfY3R4dGRhdGEgKnJjZCwgc3RydWN0IHJ2dF9xcCAqcXAsCiAJCSAgICAgIGludCBpc19mZWNuKQpAQCAtODU2LDggKzg1MCw4IEBACiAJdTMyIHZsLCBwbGVuOwogCXN0cnVjdCBzZW5kX2NvbnRleHQgKnNjOwogCXN0cnVjdCBwaW9fYnVmICpwYnVmOwotCXN0cnVjdCBoZmkxX2liX2hlYWRlciBoZHI7Ci0Jc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyAqb2hkcjsKKwlzdHJ1Y3QgaWJfaGVhZGVyIGhkcjsKKwlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogRG9uJ3Qgc2VuZCBBQ0sgb3IgTkFLIGlmIGEgUkRNQSByZWFkIG9yIGF0b21pYyBpcyBwZW5kaW5nLiAqLwpAQCAtOTE3LDcgKzkxMSw3IEBACiAJaWYgKCFwYnVmKSB7CiAJCS8qCiAJCSAqIFdlIGhhdmUgbm8gcm9vbSB0byBzZW5kIGF0IHRoZSBtb21lbnQuICBQYXNzCi0JCSAqIHJlc3BvbnNpYmlsaXR5IGZvciBzZW5kaW5nIHRoZSBBQ0sgdG8gdGhlIHNlbmQgdGFza2xldAorCQkgKiByZXNwb25zaWJpbGl0eSBmb3Igc2VuZGluZyB0aGUgQUNLIHRvIHRoZSBzZW5kIGVuZ2luZQogCQkgKiBzbyB0aGF0IHdoZW4gZW5vdWdoIGJ1ZmZlciBzcGFjZSBiZWNvbWVzIGF2YWlsYWJsZSwKIAkJICogdGhlIEFDSyBpcyBzZW50IGFoZWFkIG9mIG90aGVyIG91dGdvaW5nIHBhY2tldHMuCiAJCSAqLwpAQCAtOTMyLDE2ICs5MjYsMTkgQEAKIAlyZXR1cm47CiAKIHF1ZXVlX2FjazoKLQl0aGlzX2NwdV9pbmMoKmlicC0+cnZwLnJjX3FhY2tzKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcXAtPnNfbG9jaywgZmxhZ3MpOworCWlmICghKGliX3J2dF9zdGF0ZV9vcHNbcXAtPnN0YXRlXSAmIFJWVF9QUk9DRVNTX1JFQ1ZfT0spKQorCQlnb3RvIHVubG9jazsKKwl0aGlzX2NwdV9pbmMoKmlicC0+cnZwLnJjX3FhY2tzKTsKIAlxcC0+c19mbGFncyB8PSBSVlRfU19BQ0tfUEVORElORyB8IFJWVF9TX1JFU1BfUEVORElORzsKIAlxcC0+c19uYWtfc3RhdGUgPSBxcC0+cl9uYWtfc3RhdGU7CiAJcXAtPnNfYWNrX3BzbiA9IHFwLT5yX2Fja19wc247CiAJaWYgKGlzX2ZlY24pCiAJCXFwLT5zX2ZsYWdzIHw9IFJWVF9TX0VDTjsKIAotCS8qIFNjaGVkdWxlIHRoZSBzZW5kIHRhc2tsZXQuICovCisJLyogU2NoZWR1bGUgdGhlIHNlbmQgZW5naW5lLiAqLwogCWhmaTFfc2NoZWR1bGVfc2VuZChxcCk7Cit1bmxvY2s6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXAtPnNfbG9jaywgZmxhZ3MpOwogfQogCkBAIC05NjAsNiArOTU3LDcgQEAKIAlzdHJ1Y3QgcnZ0X3N3cWUgKndxZSA9IHJ2dF9nZXRfc3dxZV9wdHIocXAsIG4pOwogCXUzMiBvcGNvZGU7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAlxcC0+c19jdXIgPSBuOwogCiAJLyoKQEAgLTEwMjcsNyArMTAyNSw3IEBACiAJcXAtPnNfcHNuID0gcHNuOwogCS8qCiAJICogU2V0IFJWVF9TX1dBSVRfUFNOIGFzIHJjX2NvbXBsZXRlKCkgbWF5IHN0YXJ0IHRoZSB0aW1lcgotCSAqIGFzeW5jaHJvbm91c2x5IGJlZm9yZSB0aGUgc2VuZCB0YXNrbGV0IGNhbiBnZXQgc2NoZWR1bGVkLgorCSAqIGFzeW5jaHJvbm91c2x5IGJlZm9yZSB0aGUgc2VuZCBlbmdpbmUgY2FuIGdldCBzY2hlZHVsZWQuCiAJICogRG9pbmcgaXQgaW4gaGZpMV9tYWtlX3JjX3JlcSgpIGlzIHRvbyBsYXRlLgogCSAqLwogCWlmICgoY21wX3BzbihxcC0+c19wc24sIHFwLT5zX3NlbmRpbmdfaHBzbikgPD0gMCkgJiYKQEAgLTEwNDUsNiArMTA0Myw4IEBACiAJc3RydWN0IHJ2dF9zd3FlICp3cWUgPSBydnRfZ2V0X3N3cWVfcHRyKHFwLCBxcC0+c19hY2tlZCk7CiAJc3RydWN0IGhmaTFfaWJwb3J0ICppYnA7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+cl9sb2NrKTsKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAlpZiAocXAtPnNfcmV0cnkgPT0gMCkgewogCQlpZiAocXAtPnNfbWlnX3N0YXRlID09IElCX01JR19BUk1FRCkgewogCQkJaGZpMV9taWdyYXRlX3FwKHFwKTsKQEAgLTExMjEsNiArMTEyMSw3IEBACiAJc3RydWN0IHJ2dF9zd3FlICp3cWU7CiAJdTMyIG4gPSBxcC0+c19sYXN0OwogCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcXAtPnNfbG9jayk7CiAJLyogRmluZCB0aGUgd29yayByZXF1ZXN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIFBTTi4gKi8KIAlmb3IgKDs7KSB7CiAJCXdxZSA9IHJ2dF9nZXRfc3dxZV9wdHIocXAsIG4pOwpAQCAtMTE0MSwxNSArMTE0MiwxNiBAQAogLyoKICAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHRoZSBRUCBzX2xvY2sgaGVsZCBhbmQgaW50ZXJydXB0cyBkaXNhYmxlZC4KICAqLwotdm9pZCBoZmkxX3JjX3NlbmRfY29tcGxldGUoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBoZmkxX2liX2hlYWRlciAqaGRyKQordm9pZCBoZmkxX3JjX3NlbmRfY29tcGxldGUoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBpYl9oZWFkZXIgKmhkcikKIHsKLQlzdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzICpvaGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyOwogCXN0cnVjdCBydnRfc3dxZSAqd3FlOwogCXN0cnVjdCBpYl93YyB3YzsKIAl1bnNpZ25lZCBpOwogCXUzMiBvcGNvZGU7CiAJdTMyIHBzbjsKIAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnFwLT5zX2xvY2spOwogCWlmICghKGliX3J2dF9zdGF0ZV9vcHNbcXAtPnN0YXRlXSAmIFJWVF9QUk9DRVNTX09SX0ZMVVNIX1NFTkQpKQogCQlyZXR1cm47CiAKQEAgLTEyNDEsNiArMTI0Myw3IEBACiAJc3RydWN0IGliX3djIHdjOwogCXVuc2lnbmVkIGk7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAkvKgogCSAqIERvbid0IGRlY3JlbWVudCByZWZjb3VudCBhbmQgZG9uJ3QgZ2VuZXJhdGUgYQogCSAqIGNvbXBsZXRpb24gaWYgdGhlIFNXUUUgaXMgYmVpbmcgcmVzZW50IHVudGlsIHRoZSBzZW5kCkBAIC0xMzQwLDYgKzEzNDMsNyBAQAogCWludCBkaWZmOwogCXVuc2lnbmVkIGxvbmcgdG87CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAkvKgogCSAqIE5vdGUgdGhhdCBOQUtzIGltcGxpY2l0bHkgQUNLIG91dHN0YW5kaW5nIFNFTkQgYW5kIFJETUEgd3JpdGUKIAkgKiByZXF1ZXN0cyBhbmQgaW1wbGljaXRseSBOQUsgUkRNQSByZWFkIGFuZCBhdG9taWMgcmVxdWVzdHMgaXNzdWVkCkBAIC0xMzg5LDcgKzEzOTMsNyBAQAogCQkJCXJlc3RhcnRfcmMocXAsIHFwLT5zX2xhc3RfcHNuICsgMSwgMCk7CiAJCQkJaWYgKGxpc3RfZW1wdHkoJnFwLT5yc3B3YWl0KSkgewogCQkJCQlxcC0+cl9mbGFncyB8PSBSVlRfUl9SU1BfU0VORDsKLQkJCQkJYXRvbWljX2luYygmcXAtPnJlZmNvdW50KTsKKwkJCQkJcnZ0X2dldF9xcChxcCk7CiAJCQkJCWxpc3RfYWRkX3RhaWwoJnFwLT5yc3B3YWl0LAogCQkJCQkJICAgICAgJnJjZC0+cXBfd2FpdF9saXN0KTsKIAkJCQl9CkBAIC0xNTU1LDYgKzE1NTksNyBAQAogewogCXN0cnVjdCBydnRfc3dxZSAqd3FlOwogCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcXAtPnNfbG9jayk7CiAJLyogUmVtb3ZlIFFQIGZyb20gcmV0cnkgdGltZXIgKi8KIAloZmkxX3N0b3BfcmNfdGltZXJzKHFwKTsKIApAQCAtMTU3Myw3ICsxNTc4LDcgQEAKIAlyZXN0YXJ0X3JjKHFwLCBxcC0+c19sYXN0X3BzbiArIDEsIDApOwogCWlmIChsaXN0X2VtcHR5KCZxcC0+cnNwd2FpdCkpIHsKIAkJcXAtPnJfZmxhZ3MgfD0gUlZUX1JfUlNQX1NFTkQ7Ci0JCWF0b21pY19pbmMoJnFwLT5yZWZjb3VudCk7CisJCXJ2dF9nZXRfcXAocXApOwogCQlsaXN0X2FkZF90YWlsKCZxcC0+cnNwd2FpdCwgJnJjZC0+cXBfd2FpdF9saXN0KTsKIAl9CiB9CkBAIC0xNTk1LDcgKzE2MDAsNyBAQAogICogQ2FsbGVkIGF0IGludGVycnVwdCBsZXZlbC4KICAqLwogc3RhdGljIHZvaWQgcmNfcmN2X3Jlc3Aoc3RydWN0IGhmaTFfaWJwb3J0ICppYnAsCi0JCQlzdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzICpvaGRyLAorCQkJc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHIsCiAJCQl2b2lkICpkYXRhLCB1MzIgdGxlbiwgc3RydWN0IHJ2dF9xcCAqcXAsCiAJCQl1MzIgb3Bjb2RlLCB1MzIgcHNuLCB1MzIgaGRyc2l6ZSwgdTMyIHBtdHUsCiAJCQlzdHJ1Y3QgaGZpMV9jdHh0ZGF0YSAqcmNkKQpAQCAtMTY0OSwxNCArMTY1NCwxMCBAQAogCWNhc2UgT1AoQVRPTUlDX0FDS05PV0xFREdFKToKIAljYXNlIE9QKFJETUFfUkVBRF9SRVNQT05TRV9GSVJTVCk6CiAJCWFldGggPSBiZTMyX3RvX2NwdShvaGRyLT51LmFldGgpOwotCQlpZiAob3Bjb2RlID09IE9QKEFUT01JQ19BQ0tOT1dMRURHRSkpIHsKLQkJCV9fYmUzMiAqcCA9IG9oZHItPnUuYXQuYXRvbWljX2Fja19ldGg7Ci0KLQkJCXZhbCA9ICgodTY0KWJlMzJfdG9fY3B1KHBbMF0pIDw8IDMyKSB8Ci0JCQkJYmUzMl90b19jcHUocFsxXSk7Ci0JCX0gZWxzZSB7CisJCWlmIChvcGNvZGUgPT0gT1AoQVRPTUlDX0FDS05PV0xFREdFKSkKKwkJCXZhbCA9IGliX3U2NF9nZXQoJm9oZHItPnUuYXQuYXRvbWljX2Fja19ldGgpOworCQllbHNlCiAJCQl2YWwgPSAwOwotCQl9CiAJCWlmICghZG9fcmNfYWNrKHFwLCBhZXRoLCBwc24sIG9wY29kZSwgdmFsLCByY2QpIHx8CiAJCSAgICBvcGNvZGUgIT0gT1AoUkRNQV9SRUFEX1JFU1BPTlNFX0ZJUlNUKSkKIAkJCWdvdG8gYWNrX2RvbmU7CkBAIC0xNzgyLDcgKzE3ODMsNyBAQAogewogCWlmIChsaXN0X2VtcHR5KCZxcC0+cnNwd2FpdCkpIHsKIAkJcXAtPnJfZmxhZ3MgfD0gUlZUX1JfUlNQX05BSzsKLQkJYXRvbWljX2luYygmcXAtPnJlZmNvdW50KTsKKwkJcnZ0X2dldF9xcChxcCk7CiAJCWxpc3RfYWRkX3RhaWwoJnFwLT5yc3B3YWl0LCAmcmNkLT5xcF93YWl0X2xpc3QpOwogCX0KIH0KQEAgLTE3OTYsOCArMTc5Nyw3IEBACiAJCXJldHVybjsKIAlsaXN0X2RlbF9pbml0KCZxcC0+cnNwd2FpdCk7CiAJcXAtPnJfZmxhZ3MgJj0gflJWVF9SX1JTUF9OQUs7Ci0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnFwLT5yZWZjb3VudCkpCi0JCXdha2VfdXAoJnFwLT53YWl0KTsKKwlydnRfcHV0X3FwKHFwKTsKIH0KIAogLyoqCkBAIC0xODE1LDcgKzE4MTUsNyBAQAogICogUmV0dXJuIDEgaWYgbm8gbW9yZSBwcm9jZXNzaW5nIGlzIG5lZWRlZDsgb3RoZXJ3aXNlIHJldHVybiAwIHRvCiAgKiBzY2hlZHVsZSBhIHJlc3BvbnNlIHRvIGJlIHNlbnQuCiAgKi8KLXN0YXRpYyBub2lubGluZSBpbnQgcmNfcmN2X2Vycm9yKHN0cnVjdCBoZmkxX290aGVyX2hlYWRlcnMgKm9oZHIsIHZvaWQgKmRhdGEsCitzdGF0aWMgbm9pbmxpbmUgaW50IHJjX3Jjdl9lcnJvcihzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkciwgdm9pZCAqZGF0YSwKIAkJCQkgc3RydWN0IHJ2dF9xcCAqcXAsIHUzMiBvcGNvZGUsIHUzMiBwc24sCiAJCQkJIGludCBkaWZmLCBzdHJ1Y3QgaGZpMV9jdHh0ZGF0YSAqcmNkKQogewpAQCAtMTkyMyw3ICsxOTIzLDcgQEAKIAkJfQogCQlpZiAobGVuICE9IDApIHsKIAkJCXUzMiBya2V5ID0gYmUzMl90b19jcHUocmV0aC0+cmtleSk7Ci0JCQl1NjQgdmFkZHIgPSBiZTY0X3RvX2NwdShyZXRoLT52YWRkcik7CisJCQl1NjQgdmFkZHIgPSBnZXRfaWJfcmV0aF92YWRkcihyZXRoKTsKIAkJCWludCBvazsKIAogCQkJb2sgPSBydnRfcmtleV9vayhxcCwgJmUtPnJkbWFfc2dlLCBsZW4sIHZhZGRyLCBya2V5LApAQCAtMTk0Niw3ICsxOTQ2LDcgQEAKIAljYXNlIE9QKEZFVENIX0FERCk6IHsKIAkJLyoKIAkJICogSWYgd2UgZGlkbid0IGZpbmQgdGhlIGF0b21pYyByZXF1ZXN0IGluIHRoZSBhY2sgcXVldWUKLQkJICogb3IgdGhlIHNlbmQgdGFza2xldCBpcyBhbHJlYWR5IGJhY2tlZCB1cCB0byBzZW5kIGFuCisJCSAqIG9yIHRoZSBzZW5kIGVuZ2luZSBpcyBhbHJlYWR5IGJhY2tlZCB1cCB0byBzZW5kIGFuCiAJCSAqIGVhcmxpZXIgZW50cnksIHdlIGNhbiBpZ25vcmUgdGhpcyByZXF1ZXN0LgogCQkgKi8KIAkJaWYgKCFlIHx8IGUtPm9wY29kZSAhPSAodTgpb3Bjb2RlIHx8IG9sZF9yZXEpCkBAIC0yMTIzLDEzICsyMTIzLDEzIEBACiB2b2lkIGhmaTFfcmNfcmN2KHN0cnVjdCBoZmkxX3BhY2tldCAqcGFja2V0KQogewogCXN0cnVjdCBoZmkxX2N0eHRkYXRhICpyY2QgPSBwYWNrZXQtPnJjZDsKLQlzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgKmhkciA9IHBhY2tldC0+aGRyOworCXN0cnVjdCBpYl9oZWFkZXIgKmhkciA9IHBhY2tldC0+aGRyOwogCXUzMiByY3ZfZmxhZ3MgPSBwYWNrZXQtPnJjdl9mbGFnczsKIAl2b2lkICpkYXRhID0gcGFja2V0LT5lYnVmOwogCXUzMiB0bGVuID0gcGFja2V0LT50bGVuOwogCXN0cnVjdCBydnRfcXAgKnFwID0gcGFja2V0LT5xcDsKIAlzdHJ1Y3QgaGZpMV9pYnBvcnQgKmlicCA9IHRvX2lwb3J0KHFwLT5pYnFwLmRldmljZSwgcXAtPnBvcnRfbnVtKTsKLQlzdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzICpvaGRyID0gcGFja2V0LT5vaGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyID0gcGFja2V0LT5vaGRyOwogCXUzMiBidGgwLCBvcGNvZGU7CiAJdTMyIGhkcnNpemUgPSBwYWNrZXQtPmhsZW47CiAJdTMyIHBzbjsKQEAgLTIxNDMsNiArMjE0Myw3IEBACiAJaW50IGNvcHlfbGFzdCA9IDA7CiAJdTMyIHJrZXk7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+cl9sb2NrKTsKIAlidGgwID0gYmUzMl90b19jcHUob2hkci0+YnRoWzBdKTsKIAlpZiAoaGZpMV9ydWNfY2hlY2tfaGRyKGlicCwgaGRyLCByY3ZfZmxhZ3MgJiBIRkkxX0hBU19HUkgsIHFwLCBidGgwKSkKIAkJcmV0dXJuOwpAQCAtMjM0Miw3ICsyMzQzLDcgQEAKIAkJcXAtPnJfc2dlLnNnX2xpc3QgPSBOVUxMOwogCQlpZiAocXAtPnJfbGVuICE9IDApIHsKIAkJCXUzMiBya2V5ID0gYmUzMl90b19jcHUocmV0aC0+cmtleSk7Ci0JCQl1NjQgdmFkZHIgPSBiZTY0X3RvX2NwdShyZXRoLT52YWRkcik7CisJCQl1NjQgdmFkZHIgPSBnZXRfaWJfcmV0aF92YWRkcihyZXRoKTsKIAkJCWludCBvazsKIAogCQkJLyogQ2hlY2sgcmtleSAmIE5BSyAqLwpAQCAtMjM5Nyw3ICsyMzk4LDcgQEAKIAkJbGVuID0gYmUzMl90b19jcHUocmV0aC0+bGVuZ3RoKTsKIAkJaWYgKGxlbikgewogCQkJdTMyIHJrZXkgPSBiZTMyX3RvX2NwdShyZXRoLT5ya2V5KTsKLQkJCXU2NCB2YWRkciA9IGJlNjRfdG9fY3B1KHJldGgtPnZhZGRyKTsKKwkJCXU2NCB2YWRkciA9IGdldF9pYl9yZXRoX3ZhZGRyKHJldGgpOwogCQkJaW50IG9rOwogCiAJCQkvKiBDaGVjayBya2V5ICYgTkFLICovCkBAIC0yNDMyLDcgKzI0MzMsNyBAQAogCQlxcC0+cl9uYWtfc3RhdGUgPSAwOwogCQlxcC0+cl9oZWFkX2Fja19xdWV1ZSA9IG5leHQ7CiAKLQkJLyogU2NoZWR1bGUgdGhlIHNlbmQgdGFza2xldC4gKi8KKwkJLyogU2NoZWR1bGUgdGhlIHNlbmQgZW5naW5lLiAqLwogCQlxcC0+c19mbGFncyB8PSBSVlRfU19SRVNQX1BFTkRJTkc7CiAJCWhmaTFfc2NoZWR1bGVfc2VuZChxcCk7CiAKQEAgLTI0NjksOCArMjQ3MCw3IEBACiAJCQllLT5yZG1hX3NnZS5tciA9IE5VTEw7CiAJCX0KIAkJYXRldGggPSAmb2hkci0+dS5hdG9taWNfZXRoOwotCQl2YWRkciA9ICgodTY0KWJlMzJfdG9fY3B1KGF0ZXRoLT52YWRkclswXSkgPDwgMzIpIHwKLQkJCWJlMzJfdG9fY3B1KGF0ZXRoLT52YWRkclsxXSk7CisJCXZhZGRyID0gZ2V0X2liX2F0ZXRoX3ZhZGRyKGF0ZXRoKTsKIAkJaWYgKHVubGlrZWx5KHZhZGRyICYgKHNpemVvZih1NjQpIC0gMSkpKQogCQkJZ290byBuYWNrX2ludl91bmxjazsKIAkJcmtleSA9IGJlMzJfdG9fY3B1KGF0ZXRoLT5ya2V5KTsKQEAgLTI0ODEsMTEgKzI0ODEsMTEgQEAKIAkJCWdvdG8gbmFja19hY2NfdW5sY2s7CiAJCS8qIFBlcmZvcm0gYXRvbWljIE9QIGFuZCBzYXZlIHJlc3VsdC4gKi8KIAkJbWFkZHIgPSAoYXRvbWljNjRfdCAqKXFwLT5yX3NnZS5zZ2UudmFkZHI7Ci0JCXNkYXRhID0gYmU2NF90b19jcHUoYXRldGgtPnN3YXBfZGF0YSk7CisJCXNkYXRhID0gZ2V0X2liX2F0ZXRoX3N3YXAoYXRldGgpOwogCQllLT5hdG9taWNfZGF0YSA9IChvcGNvZGUgPT0gT1AoRkVUQ0hfQUREKSkgPwogCQkJKHU2NClhdG9taWM2NF9hZGRfcmV0dXJuKHNkYXRhLCBtYWRkcikgLSBzZGF0YSA6CiAJCQkodTY0KWNtcHhjaGcoKHU2NCAqKXFwLT5yX3NnZS5zZ2UudmFkZHIsCi0JCQkJICAgICAgYmU2NF90b19jcHUoYXRldGgtPmNvbXBhcmVfZGF0YSksCisJCQkJICAgICAgZ2V0X2liX2F0ZXRoX2NvbXBhcmUoYXRldGgpLAogCQkJCSAgICAgIHNkYXRhKTsKIAkJcnZ0X3B1dF9tcihxcC0+cl9zZ2Uuc2dlLm1yKTsKIAkJcXAtPnJfc2dlLm51bV9zZ2UgPSAwOwpAQCAtMjQ5OSw3ICsyNDk5LDcgQEAKIAkJcXAtPnJfbmFrX3N0YXRlID0gMDsKIAkJcXAtPnJfaGVhZF9hY2tfcXVldWUgPSBuZXh0OwogCi0JCS8qIFNjaGVkdWxlIHRoZSBzZW5kIHRhc2tsZXQuICovCisJCS8qIFNjaGVkdWxlIHRoZSBzZW5kIGVuZ2luZS4gKi8KIAkJcXAtPnNfZmxhZ3MgfD0gUlZUX1NfUkVTUF9QRU5ESU5HOwogCQloZmkxX3NjaGVkdWxlX3NlbmQocXApOwogCkBAIC0yNTc1LDEyICsyNTc1LDEyIEBACiAKIHZvaWQgaGZpMV9yY19oZHJlcnIoCiAJc3RydWN0IGhmaTFfY3R4dGRhdGEgKnJjZCwKLQlzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgKmhkciwKKwlzdHJ1Y3QgaWJfaGVhZGVyICpoZHIsCiAJdTMyIHJjdl9mbGFncywKIAlzdHJ1Y3QgcnZ0X3FwICpxcCkKIHsKIAlpbnQgaGFzX2dyaCA9IHJjdl9mbGFncyAmIEhGSTFfSEFTX0dSSDsKLQlzdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzICpvaGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyOwogCXN0cnVjdCBoZmkxX2licG9ydCAqaWJwID0gdG9faXBvcnQocXAtPmlicXAuZGV2aWNlLCBxcC0+cG9ydF9udW0pOwogCWludCBkaWZmOwogCXUzMiBvcGNvZGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9ydWMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3J1Yy5jCmluZGV4IDQ4ZDUwOTQuLmExNTc2YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3J1Yy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3J1Yy5jCkBAIC0yNjIsNyArMjYyLDcgQEAKICAqCiAgKiBUaGUgc19sb2NrIHdpbGwgYmUgYWNxdWlyZWQgYXJvdW5kIHRoZSBoZmkxX21pZ3JhdGVfcXAoKSBjYWxsLgogICovCi1pbnQgaGZpMV9ydWNfY2hlY2tfaGRyKHN0cnVjdCBoZmkxX2licG9ydCAqaWJwLCBzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgKmhkciwKK2ludCBoZmkxX3J1Y19jaGVja19oZHIoc3RydWN0IGhmaTFfaWJwb3J0ICppYnAsIHN0cnVjdCBpYl9oZWFkZXIgKmhkciwKIAkJICAgICAgIGludCBoYXNfZ3JoLCBzdHJ1Y3QgcnZ0X3FwICpxcCwgdTMyIGJ0aDApCiB7CiAJX19iZTY0IGd1aWQ7CkBAIC0zNTIsNyArMzUyLDcgQEAKICAqCiAgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIGhmaTFfZG9fc2VuZCgpIHRvCiAgKiBmb3J3YXJkIGEgV1FFIGFkZHJlc3NlZCB0byB0aGUgc2FtZSBIRkkuCi0gKiBOb3RlIHRoYXQgYWx0aG91Z2ggd2UgYXJlIHNpbmdsZSB0aHJlYWRlZCBkdWUgdG8gdGhlIHRhc2tsZXQsIHdlIHN0aWxsCisgKiBOb3RlIHRoYXQgYWx0aG91Z2ggd2UgYXJlIHNpbmdsZSB0aHJlYWRlZCBkdWUgdG8gdGhlIHNlbmQgZW5naW5lLCB3ZSBzdGlsbAogICogaGF2ZSB0byBwcm90ZWN0IGFnYWluc3QgcG9zdF9zZW5kKCkuICBXZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0CiAgKiByZWNlaXZlIGludGVycnVwdHMgc2luY2UgdGhpcyBpcyBhIGNvbm5lY3RlZCBwcm90b2NvbCBhbmQgYWxsIHBhY2tldHMKICAqIHdpbGwgcGFzcyB0aHJvdWdoIGhlcmUuCkBAIC03NjUsNyArNzY1LDcgQEAKIAl9CiB9CiAKLXZvaWQgaGZpMV9tYWtlX3J1Y19oZWFkZXIoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBoZmkxX290aGVyX2hlYWRlcnMgKm9oZHIsCit2b2lkIGhmaTFfbWFrZV9ydWNfaGVhZGVyKHN0cnVjdCBydnRfcXAgKnFwLCBzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkciwKIAkJCSAgdTMyIGJ0aDAsIHUzMiBidGgyLCBpbnQgbWlkZGxlLAogCQkJICBzdHJ1Y3QgaGZpMV9wa3Rfc3RhdGUgKnBzKQogewpAQCAtODQ2LDcgKzg0Niw3IEBACiAgKiBAd29yazogY29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSBRUAogICoKICAqIFByb2Nlc3MgZW50cmllcyBpbiB0aGUgc2VuZCB3b3JrIHF1ZXVlIHVudGlsIGNyZWRpdCBvciBxdWV1ZSBpcwotICogZXhoYXVzdGVkLiAgT25seSBhbGxvdyBvbmUgQ1BVIHRvIHNlbmQgYSBwYWNrZXQgcGVyIFFQICh0YXNrbGV0KS4KKyAqIGV4aGF1c3RlZC4gIE9ubHkgYWxsb3cgb25lIENQVSB0byBzZW5kIGEgcGFja2V0IHBlciBRUC4KICAqIE90aGVyd2lzZSwgdHdvIHRocmVhZHMgY291bGQgc2VuZCBwYWNrZXRzIG91dCBvZiBvcmRlci4KICAqLwogdm9pZCBoZmkxX2RvX3NlbmQoc3RydWN0IHJ2dF9xcCAqcXApCkBAIC05MDksNyArOTA5LDcgQEAKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFwLT5zX2xvY2ssIHBzLmZsYWdzKTsKIAkJCS8qCiAJCQkgKiBJZiB0aGUgcGFja2V0IGNhbm5vdCBiZSBzZW50IG5vdywgcmV0dXJuIGFuZAotCQkJICogdGhlIHNlbmQgdGFza2xldCB3aWxsIGJlIHdva2VuIHVwIGxhdGVyLgorCQkJICogdGhlIHNlbmQgZW5naW5lIHdpbGwgYmUgd29rZW4gdXAgbGF0ZXIuCiAJCQkgKi8KIAkJCWlmIChoZmkxX3ZlcmJzX3NlbmQocXAsICZwcykpCiAJCQkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvc2RtYS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvc2RtYS5jCmluZGV4IGY5YmVmYzAuLmZkMzliY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3NkbWEuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9zZG1hLmMKQEAgLTcyNiw2ICs3MjYsMzQgQEAKIH0KIAogLyoqCisgKiBzZG1hX2VuZ2luZV9nZXRfdmwoKSAtIHJldHVybiB2bCBmb3IgYSBnaXZlbiBzZG1hIGVuZ2luZQorICogQHNkZTogc2RtYSBlbmdpbmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHZsIG1hcHBlZCB0byBhIGdpdmVuIGVuZ2luZSwgb3IgYW4gZXJyb3IgaWYKKyAqIHRoZSBtYXBwaW5nIGNhbid0IGJlIGZvdW5kLiBUaGUgbWFwcGluZyBmaWVsZHMgYXJlIHByb3RlY3RlZCBieSBSQ1UuCisgKi8KK2ludCBzZG1hX2VuZ2luZV9nZXRfdmwoc3RydWN0IHNkbWFfZW5naW5lICpzZGUpCit7CisJc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQgPSBzZGUtPmRkOworCXN0cnVjdCBzZG1hX3ZsX21hcCAqbTsKKwl1OCB2bDsKKworCWlmIChzZGUtPnRoaXNfaWR4ID49IFRYRV9OVU1fU0RNQV9FTkdJTkVTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwltID0gcmN1X2RlcmVmZXJlbmNlKGRkLT5zZG1hX21hcCk7CisJaWYgKHVubGlrZWx5KCFtKSkgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXZsID0gbS0+ZW5naW5lX3RvX3ZsW3NkZS0+dGhpc19pZHhdOworCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIHZsOworfQorCisvKioKICAqIHNkbWFfc2VsZWN0X2VuZ2luZV92bCgpIC0gc2VsZWN0IHNkbWEgZW5naW5lCiAgKiBAZGQ6IGRldmRhdGEKICAqIEBzZWxlY3RvcjogYSBzcHJlYWRpbmcgZmFjdG9yCkBAIC03ODgsNiArODE2LDMyNiBAQAogCXJldHVybiBzZG1hX3NlbGVjdF9lbmdpbmVfdmwoZGQsIHNlbGVjdG9yLCB2bCk7CiB9CiAKK3N0cnVjdCBzZG1hX3JodF9tYXBfZWxlbSB7CisJdTMyIG1hc2s7CisJdTggY3RyOworCXN0cnVjdCBzZG1hX2VuZ2luZSAqc2RlWzBdOworfTsKKworc3RydWN0IHNkbWFfcmh0X25vZGUgeworCXVuc2lnbmVkIGxvbmcgY3B1X2lkOworCXN0cnVjdCBzZG1hX3JodF9tYXBfZWxlbSAqbWFwW0hGSTFfTUFYX1ZMU19TVVBQT1JURURdOworCXN0cnVjdCByaGFzaF9oZWFkIG5vZGU7Cit9OworCisjZGVmaW5lIE5SX0NQVVNfSElOVCAxOTIKKworc3RhdGljIGNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBzZG1hX3JodF9wYXJhbXMgPSB7CisJLm5lbGVtX2hpbnQgPSBOUl9DUFVTX0hJTlQsCisJLmhlYWRfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNkbWFfcmh0X25vZGUsIG5vZGUpLAorCS5rZXlfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNkbWFfcmh0X25vZGUsIGNwdV9pZCksCisJLmtleV9sZW4gPSBGSUVMRF9TSVpFT0Yoc3RydWN0IHNkbWFfcmh0X25vZGUsIGNwdV9pZCksCisJLm1heF9zaXplID0gTlJfQ1BVUywKKwkubWluX3NpemUgPSA4LAorCS5hdXRvbWF0aWNfc2hyaW5raW5nID0gdHJ1ZSwKK307CisKKy8qCisgKiBzZG1hX3NlbGVjdF91c2VyX2VuZ2luZSgpIC0gc2VsZWN0IHNkbWEgZW5naW5lIGJhc2VkIG9uIHVzZXIgc2V0dXAKKyAqIEBkZDogZGV2ZGF0YQorICogQHNlbGVjdG9yOiBhIHNwcmVhZGluZyBmYWN0b3IKKyAqIEB2bDogdGhpcyB2bAorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBzZG1hIGVuZ2luZSBmb3IgYSB1c2VyIHNkbWEgcmVxdWVzdC4KKyAqIFVzZXIgZGVmaW5lZCBzZG1hIGVuZ2luZSBhZmZpbml0eSBzZXR0aW5nIGlzIGhvbm9yZWQgd2hlbiBhcHBsaWNhYmxlLAorICogb3RoZXJ3aXNlIHN5c3RlbSBkZWZhdWx0IHNkbWEgZW5naW5lIG1hcHBpbmcgaXMgdXNlZC4gVG8gZW5zdXJlIGNvcnJlY3QKKyAqIG9yZGVyaW5nLCB0aGUgbWFwcGluZyBmcm9tIDxzZWxlY3Rvciwgdmw+IHRvIHNkZSBtdXN0IHJlbWFpbiB1bmNoYW5nZWQuCisgKi8KK3N0cnVjdCBzZG1hX2VuZ2luZSAqc2RtYV9zZWxlY3RfdXNlcl9lbmdpbmUoc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsCisJCQkJCSAgICB1MzIgc2VsZWN0b3IsIHU4IHZsKQoreworCXN0cnVjdCBzZG1hX3JodF9ub2RlICpyaHRfbm9kZTsKKwlzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkZSA9IE5VTEw7CisJY29uc3Qgc3RydWN0IGNwdW1hc2sgKmN1cnJlbnRfbWFzayA9IHRza19jcHVzX2FsbG93ZWQoY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBjcHVfaWQ7CisKKwkvKgorCSAqIFRvIGVuc3VyZSB0aGF0IGFsd2F5cyB0aGUgc2FtZSBzZG1hIGVuZ2luZShzKSB3aWxsIGJlCisJICogc2VsZWN0ZWQgbWFrZSBzdXJlIHRoZSBwcm9jZXNzIGlzIHBpbm5lZCB0byB0aGlzIENQVSBvbmx5LgorCSAqLworCWlmIChjcHVtYXNrX3dlaWdodChjdXJyZW50X21hc2spICE9IDEpCisJCWdvdG8gb3V0OworCisJY3B1X2lkID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXJjdV9yZWFkX2xvY2soKTsKKwlyaHRfbm9kZSA9IHJoYXNodGFibGVfbG9va3VwX2Zhc3QoJmRkLT5zZG1hX3JodCwgJmNwdV9pZCwKKwkJCQkJICBzZG1hX3JodF9wYXJhbXMpOworCisJaWYgKHJodF9ub2RlICYmIHJodF9ub2RlLT5tYXBbdmxdKSB7CisJCXN0cnVjdCBzZG1hX3JodF9tYXBfZWxlbSAqbWFwID0gcmh0X25vZGUtPm1hcFt2bF07CisKKwkJc2RlID0gbWFwLT5zZGVbc2VsZWN0b3IgJiBtYXAtPm1hc2tdOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCWlmIChzZGUpCisJCXJldHVybiBzZGU7CisKK291dDoKKwlyZXR1cm4gc2RtYV9zZWxlY3RfZW5naW5lX3ZsKGRkLCBzZWxlY3RvciwgdmwpOworfQorCitzdGF0aWMgdm9pZCBzZG1hX3BvcHVsYXRlX3NkZV9tYXAoc3RydWN0IHNkbWFfcmh0X21hcF9lbGVtICptYXApCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcm91bmR1cF9wb3dfb2ZfdHdvKG1hcC0+Y3RyID8gOiAxKSAtIG1hcC0+Y3RyOyBpKyspCisJCW1hcC0+c2RlW21hcC0+Y3RyICsgaV0gPSBtYXAtPnNkZVtpXTsKK30KKworc3RhdGljIHZvaWQgc2RtYV9jbGVhbnVwX3NkZV9tYXAoc3RydWN0IHNkbWFfcmh0X21hcF9lbGVtICptYXAsCisJCQkJIHN0cnVjdCBzZG1hX2VuZ2luZSAqc2RlKQoreworCXVuc2lnbmVkIGludCBpLCBwb3c7CisKKwkvKiBvbmx5IG5lZWQgdG8gY2hlY2sgdGhlIGZpcnN0IGN0ciBlbnRyaWVzIGZvciBhIG1hdGNoICovCisJZm9yIChpID0gMDsgaSA8IG1hcC0+Y3RyOyBpKyspIHsKKwkJaWYgKG1hcC0+c2RlW2ldID09IHNkZSkgeworCQkJbWVtbW92ZSgmbWFwLT5zZGVbaV0sICZtYXAtPnNkZVtpICsgMV0sCisJCQkJKG1hcC0+Y3RyIC0gaSAtIDEpICogc2l6ZW9mKG1hcC0+c2RlWzBdKSk7CisJCQltYXAtPmN0ci0tOworCQkJcG93ID0gcm91bmR1cF9wb3dfb2ZfdHdvKG1hcC0+Y3RyID8gOiAxKTsKKwkJCW1hcC0+bWFzayA9IHBvdyAtIDE7CisJCQlzZG1hX3BvcHVsYXRlX3NkZV9tYXAobWFwKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKgorICogUHJldmVudHMgY29uY3VycmVudCByZWFkcyBhbmQgd3JpdGVzIG9mIHRoZSBzZG1hIGVuZ2luZSBjcHVfbWFzaworICovCitzdGF0aWMgREVGSU5FX01VVEVYKHByb2Nlc3NfdG9fc2RlX211dGV4KTsKKworc3NpemVfdCBzZG1hX3NldF9jcHVfdG9fc2RlX21hcChzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkZSwgY29uc3QgY2hhciAqYnVmLAorCQkJCXNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCA9IHNkZS0+ZGQ7CisJY3B1bWFza192YXJfdCBtYXNrLCBuZXdfbWFzazsKKwl1bnNpZ25lZCBsb25nIGNwdTsKKwlpbnQgcmV0LCB2bCwgc3o7CisKKwl2bCA9IHNkbWFfZW5naW5lX2dldF92bChzZGUpOworCWlmICh1bmxpa2VseSh2bCA8IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IHphbGxvY19jcHVtYXNrX3ZhcigmbWFzaywgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXQpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gemFsbG9jX2NwdW1hc2tfdmFyKCZuZXdfbWFzaywgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXQpIHsKKwkJZnJlZV9jcHVtYXNrX3ZhcihtYXNrKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldCA9IGNwdWxpc3RfcGFyc2UoYnVmLCBtYXNrKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9mcmVlOworCisJaWYgKCFjcHVtYXNrX3N1YnNldChtYXNrLCBjcHVfb25saW5lX21hc2spKSB7CisJCWRkX2Rldl93YXJuKHNkZS0+ZGQsICJJbnZhbGlkIENQVSBtYXNrXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlzeiA9IHNpemVvZihzdHJ1Y3Qgc2RtYV9yaHRfbWFwX2VsZW0pICsKKwkJCShUWEVfTlVNX1NETUFfRU5HSU5FUyAqIHNpemVvZihzdHJ1Y3Qgc2RtYV9lbmdpbmUgKikpOworCisJbXV0ZXhfbG9jaygmcHJvY2Vzc190b19zZGVfbXV0ZXgpOworCisJZm9yX2VhY2hfY3B1KGNwdSwgbWFzaykgeworCQlzdHJ1Y3Qgc2RtYV9yaHRfbm9kZSAqcmh0X25vZGU7CisKKwkJLyogQ2hlY2sgaWYgd2UgaGF2ZSB0aGlzIGFscmVhZHkgbWFwcGVkICovCisJCWlmIChjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgJnNkZS0+Y3B1X21hc2spKSB7CisJCQljcHVtYXNrX3NldF9jcHUoY3B1LCBuZXdfbWFzayk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJodF9ub2RlID0gcmhhc2h0YWJsZV9sb29rdXBfZmFzdCgmZGQtPnNkbWFfcmh0LCAmY3B1LAorCQkJCQkJICBzZG1hX3JodF9wYXJhbXMpOworCQlpZiAoIXJodF9ub2RlKSB7CisJCQlyaHRfbm9kZSA9IGt6YWxsb2Moc2l6ZW9mKCpyaHRfbm9kZSksIEdGUF9LRVJORUwpOworCQkJaWYgKCFyaHRfbm9kZSkgeworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCXJodF9ub2RlLT5tYXBbdmxdID0ga3phbGxvYyhzeiwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIXJodF9ub2RlLT5tYXBbdmxdKSB7CisJCQkJa2ZyZWUocmh0X25vZGUpOworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlyaHRfbm9kZS0+Y3B1X2lkID0gY3B1OworCQkJcmh0X25vZGUtPm1hcFt2bF0tPm1hc2sgPSAwOworCQkJcmh0X25vZGUtPm1hcFt2bF0tPmN0ciA9IDE7CisJCQlyaHRfbm9kZS0+bWFwW3ZsXS0+c2RlWzBdID0gc2RlOworCisJCQlyZXQgPSByaGFzaHRhYmxlX2luc2VydF9mYXN0KCZkZC0+c2RtYV9yaHQsCisJCQkJCQkgICAgICZyaHRfbm9kZS0+bm9kZSwKKwkJCQkJCSAgICAgc2RtYV9yaHRfcGFyYW1zKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlrZnJlZShyaHRfbm9kZS0+bWFwW3ZsXSk7CisJCQkJa2ZyZWUocmh0X25vZGUpOworCQkJCWRkX2Rldl9lcnIoc2RlLT5kZCwgIkZhaWxlZCB0byBzZXQgcHJvY2VzcyB0byBzZGUgYWZmaW5pdHkgZm9yIGNwdSAlbHVcbiIsCisJCQkJCSAgIGNwdSk7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJfSBlbHNlIHsKKwkJCWludCBjdHIsIHBvdzsKKworCQkJLyogQWRkIG5ldyB1c2VyIG1hcHBpbmdzICovCisJCQlpZiAoIXJodF9ub2RlLT5tYXBbdmxdKQorCQkJCXJodF9ub2RlLT5tYXBbdmxdID0ga3phbGxvYyhzeiwgR0ZQX0tFUk5FTCk7CisKKwkJCWlmICghcmh0X25vZGUtPm1hcFt2bF0pIHsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlyaHRfbm9kZS0+bWFwW3ZsXS0+Y3RyKys7CisJCQljdHIgPSByaHRfbm9kZS0+bWFwW3ZsXS0+Y3RyOworCQkJcmh0X25vZGUtPm1hcFt2bF0tPnNkZVtjdHIgLSAxXSA9IHNkZTsKKwkJCXBvdyA9IHJvdW5kdXBfcG93X29mX3R3byhjdHIpOworCQkJcmh0X25vZGUtPm1hcFt2bF0tPm1hc2sgPSBwb3cgLSAxOworCisJCQkvKiBQb3B1bGF0ZSB0aGUgc2RlIG1hcCB0YWJsZSAqLworCQkJc2RtYV9wb3B1bGF0ZV9zZGVfbWFwKHJodF9ub2RlLT5tYXBbdmxdKTsKKwkJfQorCQljcHVtYXNrX3NldF9jcHUoY3B1LCBuZXdfbWFzayk7CisJfQorCisJLyogQ2xlYW4gdXAgb2xkIG1hcHBpbmdzICovCisJZm9yX2VhY2hfY3B1KGNwdSwgY3B1X29ubGluZV9tYXNrKSB7CisJCXN0cnVjdCBzZG1hX3JodF9ub2RlICpyaHRfbm9kZTsKKworCQkvKiBEb24ndCBjbGVhbnVwIHNkZXMgdGhhdCBhcmUgc2V0IGluIHRoZSBuZXcgbWFzayAqLworCQlpZiAoY3B1bWFza190ZXN0X2NwdShjcHUsIG1hc2spKQorCQkJY29udGludWU7CisKKwkJcmh0X25vZGUgPSByaGFzaHRhYmxlX2xvb2t1cF9mYXN0KCZkZC0+c2RtYV9yaHQsICZjcHUsCisJCQkJCQkgIHNkbWFfcmh0X3BhcmFtcyk7CisJCWlmIChyaHRfbm9kZSkgeworCQkJYm9vbCBlbXB0eSA9IHRydWU7CisJCQlpbnQgaTsKKworCQkJLyogUmVtb3ZlIG1hcHBpbmdzIGZvciBvbGQgc2RlICovCisJCQlmb3IgKGkgPSAwOyBpIDwgSEZJMV9NQVhfVkxTX1NVUFBPUlRFRDsgaSsrKQorCQkJCWlmIChyaHRfbm9kZS0+bWFwW2ldKQorCQkJCQlzZG1hX2NsZWFudXBfc2RlX21hcChyaHRfbm9kZS0+bWFwW2ldLAorCQkJCQkJCSAgICAgc2RlKTsKKworCQkJLyogRnJlZSBlbXB0eSBoYXNoIHRhYmxlIGVudHJpZXMgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBIRkkxX01BWF9WTFNfU1VQUE9SVEVEOyBpKyspIHsKKwkJCQlpZiAoIXJodF9ub2RlLT5tYXBbaV0pCisJCQkJCWNvbnRpbnVlOworCisJCQkJaWYgKHJodF9ub2RlLT5tYXBbaV0tPmN0cikgeworCQkJCQllbXB0eSA9IGZhbHNlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChlbXB0eSkgeworCQkJCXJldCA9IHJoYXNodGFibGVfcmVtb3ZlX2Zhc3QoJmRkLT5zZG1hX3JodCwKKwkJCQkJCQkgICAgICZyaHRfbm9kZS0+bm9kZSwKKwkJCQkJCQkgICAgIHNkbWFfcmh0X3BhcmFtcyk7CisJCQkJV0FSTl9PTihyZXQpOworCisJCQkJZm9yIChpID0gMDsgaSA8IEhGSTFfTUFYX1ZMU19TVVBQT1JURUQ7IGkrKykKKwkJCQkJa2ZyZWUocmh0X25vZGUtPm1hcFtpXSk7CisKKwkJCQlrZnJlZShyaHRfbm9kZSk7CisJCQl9CisJCX0KKwl9CisKKwljcHVtYXNrX2NvcHkoJnNkZS0+Y3B1X21hc2ssIG5ld19tYXNrKTsKK291dDoKKwltdXRleF91bmxvY2soJnByb2Nlc3NfdG9fc2RlX211dGV4KTsKK291dF9mcmVlOgorCWZyZWVfY3B1bWFza192YXIobWFzayk7CisJZnJlZV9jcHVtYXNrX3ZhcihuZXdfbWFzayk7CisJcmV0dXJuIHJldCA/IDogc3RybmxlbihidWYsIFBBR0VfU0laRSk7Cit9CisKK3NzaXplX3Qgc2RtYV9nZXRfY3B1X3RvX3NkZV9tYXAoc3RydWN0IHNkbWFfZW5naW5lICpzZGUsIGNoYXIgKmJ1ZikKK3sKKwltdXRleF9sb2NrKCZwcm9jZXNzX3RvX3NkZV9tdXRleCk7CisJaWYgKGNwdW1hc2tfZW1wdHkoJnNkZS0+Y3B1X21hc2spKQorCQlzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCAiZW1wdHkiKTsKKwllbHNlCisJCWNwdW1hcF9wcmludF90b19wYWdlYnVmKHRydWUsIGJ1ZiwgJnNkZS0+Y3B1X21hc2spOworCW11dGV4X3VubG9jaygmcHJvY2Vzc190b19zZGVfbXV0ZXgpOworCXJldHVybiBzdHJubGVuKGJ1ZiwgUEFHRV9TSVpFKTsKK30KKworc3RhdGljIHZvaWQgc2RtYV9yaHRfZnJlZSh2b2lkICpwdHIsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qgc2RtYV9yaHRfbm9kZSAqcmh0X25vZGUgPSBwdHI7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSEZJMV9NQVhfVkxTX1NVUFBPUlRFRDsgaSsrKQorCQlrZnJlZShyaHRfbm9kZS0+bWFwW2ldKTsKKworCWtmcmVlKHJodF9ub2RlKTsKK30KKworLyoqCisgKiBzZG1hX3NlcWZpbGVfZHVtcF9jcHVfbGlzdCgpIC0gZGVidWdmcyBkdW1wIHRoZSBjcHUgdG8gc2RtYSBtYXBwaW5ncworICogQHM6IHNlcSBmaWxlCisgKiBAZGQ6IGhmaTFfZGV2ZGF0YQorICogQGNwdWlkOiBjcHUgaWQKKyAqCisgKiBUaGlzIHJvdXRpbmUgZHVtcHMgdGhlIHByb2Nlc3MgdG8gc2RlIG1hcHBpbmdzIHBlciBjcHUKKyAqLwordm9pZCBzZG1hX3NlcWZpbGVfZHVtcF9jcHVfbGlzdChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCisJCQkJc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsCisJCQkJdW5zaWduZWQgbG9uZyBjcHVpZCkKK3sKKwlzdHJ1Y3Qgc2RtYV9yaHRfbm9kZSAqcmh0X25vZGU7CisJaW50IGksIGo7CisKKwlyaHRfbm9kZSA9IHJoYXNodGFibGVfbG9va3VwX2Zhc3QoJmRkLT5zZG1hX3JodCwgJmNwdWlkLAorCQkJCQkgIHNkbWFfcmh0X3BhcmFtcyk7CisJaWYgKCFyaHRfbm9kZSkKKwkJcmV0dXJuOworCisJc2VxX3ByaW50ZihzLCAiY3B1JTNsdTogIiwgY3B1aWQpOworCWZvciAoaSA9IDA7IGkgPCBIRkkxX01BWF9WTFNfU1VQUE9SVEVEOyBpKyspIHsKKwkJaWYgKCFyaHRfbm9kZS0+bWFwW2ldIHx8ICFyaHRfbm9kZS0+bWFwW2ldLT5jdHIpCisJCQljb250aW51ZTsKKworCQlzZXFfcHJpbnRmKHMsICIgdmwlZDogWyIsIGkpOworCisJCWZvciAoaiA9IDA7IGogPCByaHRfbm9kZS0+bWFwW2ldLT5jdHI7IGorKykgeworCQkJaWYgKCFyaHRfbm9kZS0+bWFwW2ldLT5zZGVbal0pCisJCQkJY29udGludWU7CisKKwkJCWlmIChqID4gMCkKKwkJCQlzZXFfcHV0cyhzLCAiLCIpOworCisJCQlzZXFfcHJpbnRmKHMsICIgc2RtYSUyZCIsCisJCQkJICAgcmh0X25vZGUtPm1hcFtpXS0+c2RlW2pdLT50aGlzX2lkeCk7CisJCX0KKwkJc2VxX3B1dHMocywgIiBdIik7CisJfQorCisJc2VxX3B1dHMocywgIlxuIik7Cit9CisKIC8qCiAgKiBGcmVlIHRoZSBpbmRpY2F0ZWQgbWFwIHN0cnVjdAogICovCkBAIC0xMTYxLDYgKzE1MDksMTAgQEAKIAlkZC0+bnVtX3NkbWEgPSBudW1fZW5naW5lczsKIAlpZiAoc2RtYV9tYXBfaW5pdChkZCwgcG9ydCwgcHBkLT52bHNfb3BlcmF0aW9uYWwsIE5VTEwpKQogCQlnb3RvIGJhaWw7CisKKwlpZiAocmhhc2h0YWJsZV9pbml0KCZkZC0+c2RtYV9yaHQsICZzZG1hX3JodF9wYXJhbXMpKQorCQlnb3RvIGJhaWw7CisKIAlkZF9kZXZfaW5mbyhkZCwgIlNETUEgbnVtX3NkbWE6ICV1XG4iLCBkZC0+bnVtX3NkbWEpOwogCXJldHVybiAwOwogCkBAIC0xMjUyLDYgKzE2MDQsNyBAQAogCQlzZG1hX2ZpbmFscHV0KCZzZGUtPnN0YXRlKTsKIAl9CiAJc2RtYV9jbGVhbihkZCwgZGQtPm51bV9zZG1hKTsKKwlyaGFzaHRhYmxlX2ZyZWVfYW5kX2Rlc3Ryb3koJmRkLT5zZG1hX3JodCwgc2RtYV9yaHRfZnJlZSwgTlVMTCk7CiB9CiAKIC8qCkBAIC0yMDg2LDYgKzI0MzksMTEgQEAKICAqIEBzZGU6IHNkbWEgZW5naW5lIHRvIHVzZQogICogQHdhaXQ6IHdhaXQgc3RydWN0dXJlIHRvIHVzZSB3aGVuIGZ1bGwgKG1heSBiZSBOVUxMKQogICogQHR4X2xpc3Q6IGxpc3Qgb2Ygc2RtYV90eHJlcXMgdG8gc3VibWl0CisgKiBAY291bnQ6IHBvaW50ZXIgdG8gYSB1MzIgd2hpY2gsIGFmdGVyIHJldHVybiB3aWxsIGNvbnRhaW4gdGhlIHRvdGFsIG51bWJlciBvZgorICogICAgICAgICBzZG1hX3R4cmVxcyByZW1vdmVkIGZyb20gdGhlIHR4X2xpc3QuIFRoaXMgd2lsbCBpbmNsdWRlIHNkbWFfdHhyZXFzCisgKiAgICAgICAgIHdob3NlIFNETUEgZGVzY3JpcHRvcnMgYXJlIHN1Ym1pdHRlZCB0byB0aGUgcmluZyBhbmQgdGhlIHNkbWFfdHhyZXFzCisgKiAgICAgICAgIHdoaWNoIGFyZSBhZGRlZCB0byBTRE1BIGVuZ2luZSBmbHVzaCBsaXN0IGlmIHRoZSBTRE1BIGVuZ2luZSBzdGF0ZSBpcworICogICAgICAgICBub3QgcnVubmluZy4KICAqCiAgKiBUaGUgY2FsbCBzdWJtaXRzIHRoZSBsaXN0IGludG8gdGhlIHJpbmcuCiAgKgpAQCAtMjEwMCwxOCArMjQ1OCwxOCBAQAogICogc2lkZSBsb2NraW5nLgogICoKICAqIFJldHVybjoKLSAqID4gMCAtIFN1Y2Nlc3MgKHZhbHVlIGlzIG51bWJlciBvZiBzZG1hX3R4cmVxJ3Mgc3VibWl0dGVkKSwKKyAqIDAgLSBTdWNjZXNzLAogICogLUVJTlZBTCAtIHNkbWFfdHhyZXEgaW5jb21wbGV0ZSwgLUVCVVNZIC0gbm8gc3BhY2UgaW4gcmluZyAod2FpdCA9PSBOVUxMKQogICogLUVJT0NCUVVFVUVEIC0gdHggcXVldWVkIHRvIGlvd2FpdCwgLUVDT01NIGJhZCBzZG1hIHN0YXRlCiAgKi8KIGludCBzZG1hX3NlbmRfdHhsaXN0KHN0cnVjdCBzZG1hX2VuZ2luZSAqc2RlLCBzdHJ1Y3QgaW93YWl0ICp3YWl0LAotCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKnR4X2xpc3QpCisJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqdHhfbGlzdCwgdTMyICpjb3VudF9vdXQpCiB7CiAJc3RydWN0IHNkbWFfdHhyZXEgKnR4LCAqdHhfbmV4dDsKIAlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUxNiB0YWlsID0gSU5WQUxJRF9UQUlMOwotCWludCBjb3VudCA9IDA7CisJdTMyIHN1Ym1pdF9jb3VudCA9IDAsIGZsdXNoX2NvdW50ID0gMCwgdG90YWxfY291bnQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc2RlLT50YWlsX2xvY2ssIGZsYWdzKTsKIHJldHJ5OgpAQCAtMjEyNywzMyArMjQ4NSwzNCBAQAogCQl9CiAJCWxpc3RfZGVsX2luaXQoJnR4LT5saXN0KTsKIAkJdGFpbCA9IHN1Ym1pdF90eChzZGUsIHR4KTsKLQkJY291bnQrKzsKKwkJc3VibWl0X2NvdW50Kys7CiAJCWlmICh0YWlsICE9IElOVkFMSURfVEFJTCAmJgotCQkgICAgKGNvdW50ICYgU0RNQV9UQUlMX1VQREFURV9USFJFU0gpID09IDApIHsKKwkJICAgIChzdWJtaXRfY291bnQgJiBTRE1BX1RBSUxfVVBEQVRFX1RIUkVTSCkgPT0gMCkgewogCQkJc2RtYV91cGRhdGVfdGFpbChzZGUsIHRhaWwpOwogCQkJdGFpbCA9IElOVkFMSURfVEFJTDsKIAkJfQogCX0KIHVwZGF0ZV90YWlsOgorCXRvdGFsX2NvdW50ID0gc3VibWl0X2NvdW50ICsgZmx1c2hfY291bnQ7CiAJaWYgKHdhaXQpCi0JCWlvd2FpdF9zZG1hX2FkZCh3YWl0LCBjb3VudCk7CisJCWlvd2FpdF9zZG1hX2FkZCh3YWl0LCB0b3RhbF9jb3VudCk7CiAJaWYgKHRhaWwgIT0gSU5WQUxJRF9UQUlMKQogCQlzZG1hX3VwZGF0ZV90YWlsKHNkZSwgdGFpbCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2RlLT50YWlsX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gcmV0ID09IDAgPyBjb3VudCA6IHJldDsKKwkqY291bnRfb3V0ID0gdG90YWxfY291bnQ7CisJcmV0dXJuIHJldDsKIHVubG9ja19ub2Nvbm46CiAJc3Bpbl9sb2NrKCZzZGUtPmZsdXNobGlzdF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodHgsIHR4X25leHQsIHR4X2xpc3QsIGxpc3QpIHsKIAkJdHgtPndhaXQgPSB3YWl0OwogCQlsaXN0X2RlbF9pbml0KCZ0eC0+bGlzdCk7Ci0JCWlmICh3YWl0KQotCQkJaW93YWl0X3NkbWFfaW5jKHdhaXQpOwogCQl0eC0+bmV4dF9kZXNjcV9pZHggPSAwOwogI2lmZGVmIENPTkZJR19IRkkxX0RFQlVHX1NETUFfT1JERVIKIAkJdHgtPnNuID0gc2RlLT50YWlsX3NuKys7CiAJCXRyYWNlX2hmaTFfc2RtYV9pbl9zbihzZGUsIHR4LT5zbik7CiAjZW5kaWYKIAkJbGlzdF9hZGRfdGFpbCgmdHgtPmxpc3QsICZzZGUtPmZsdXNobGlzdCk7CisJCWZsdXNoX2NvdW50Kys7CiAJCWlmICh3YWl0KSB7CiAJCQl3YWl0LT50eF9jb3VudCsrOwogCQkJd2FpdC0+Y291bnQgKz0gdHgtPm51bV9kZXNjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvc2RtYS5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvc2RtYS5oCmluZGV4IDhmNTBjOTkuLjU2MjU3ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3NkbWEuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9zZG1hLmgKQEAgLTQxMyw2ICs0MTMsOCBAQAogCXNwaW5sb2NrX3QgZmx1c2hsaXN0X2xvY2s7CiAJLyogcHJpdmF0ZTogKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGZsdXNobGlzdDsKKwlzdHJ1Y3QgY3B1bWFzayBjcHVfbWFzazsKKwlzdHJ1Y3Qga29iamVjdCBrb2JqOwogfTsKIAogaW50IHNkbWFfaW5pdChzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCwgdTggcG9ydCk7CkBAIC04NDcsNyArODQ5LDggQEAKIAkJICAgIHN0cnVjdCBzZG1hX3R4cmVxICp0eCk7CiBpbnQgc2RtYV9zZW5kX3R4bGlzdChzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkZSwKIAkJICAgICBzdHJ1Y3QgaW93YWl0ICp3YWl0LAotCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKnR4X2xpc3QpOworCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKnR4X2xpc3QsCisJCSAgICAgdTMyICpjb3VudCk7CiAKIGludCBzZG1hX2FoZ19hbGxvYyhzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkZSk7CiB2b2lkIHNkbWFfYWhnX2ZyZWUoc3RydWN0IHNkbWFfZW5naW5lICpzZGUsIGludCBhaGdfaW5kZXgpOwpAQCAtMTA1OCw3ICsxMDYxLDE1IEBACiAJdTMyIHNlbGVjdG9yLAogCXU4IHZsKTsKIAorc3RydWN0IHNkbWFfZW5naW5lICpzZG1hX3NlbGVjdF91c2VyX2VuZ2luZShzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCwKKwkJCQkJICAgIHUzMiBzZWxlY3RvciwgdTggdmwpOworc3NpemVfdCBzZG1hX2dldF9jcHVfdG9fc2RlX21hcChzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkZSwgY2hhciAqYnVmKTsKK3NzaXplX3Qgc2RtYV9zZXRfY3B1X3RvX3NkZV9tYXAoc3RydWN0IHNkbWFfZW5naW5lICpzZGUsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQlzaXplX3QgY291bnQpOworaW50IHNkbWFfZW5naW5lX2dldF92bChzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkZSk7CiB2b2lkIHNkbWFfc2VxZmlsZV9kdW1wX3NkZShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHN0cnVjdCBzZG1hX2VuZ2luZSAqKTsKK3ZvaWQgc2RtYV9zZXFmaWxlX2R1bXBfY3B1X2xpc3Qoc3RydWN0IHNlcV9maWxlICpzLCBzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCwKKwkJCQl1bnNpZ25lZCBsb25nIGNwdWlkKTsKIAogI2lmZGVmIENPTkZJR19TRE1BX1ZFUkJPU0lUWQogdm9pZCBzZG1hX2R1bXBzdGF0ZShzdHJ1Y3Qgc2RtYV9lbmdpbmUgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9zeXNmcy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvc3lzZnMuYwppbmRleCA3NGM4NGM2Li5lZGJhMjI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9zeXNmcy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3N5c2ZzLmMKQEAgLTc2NiwxMyArNzY2LDk1IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RydWN0IHNkZV9hdHRyaWJ1dGUgeworCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKKwlzc2l6ZV90ICgqc2hvdykoc3RydWN0IHNkbWFfZW5naW5lICpzZGUsIGNoYXIgKmJ1Zik7CisJc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkZSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY250KTsKK307CisKK3N0YXRpYyBzc2l6ZV90IHNkZV9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNkZV9hdHRyaWJ1dGUgKnNkZV9hdHRyID0KKwkJY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBzZGVfYXR0cmlidXRlLCBhdHRyKTsKKwlzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkZSA9CisJCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3Qgc2RtYV9lbmdpbmUsIGtvYmopOworCisJaWYgKCFzZGVfYXR0ci0+c2hvdykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gc2RlX2F0dHItPnNob3coc2RlLCBidWYpOworfQorCitzdGF0aWMgc3NpemVfdCBzZGVfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNkZV9hdHRyaWJ1dGUgKnNkZV9hdHRyID0KKwkJY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBzZGVfYXR0cmlidXRlLCBhdHRyKTsKKwlzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkZSA9CisJCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3Qgc2RtYV9lbmdpbmUsIGtvYmopOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKCFzZGVfYXR0ci0+c3RvcmUpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHNkZV9hdHRyLT5zdG9yZShzZGUsIGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHN5c2ZzX29wcyBzZGVfc3lzZnNfb3BzID0geworCS5zaG93ID0gc2RlX3Nob3csCisJLnN0b3JlID0gc2RlX3N0b3JlLAorfTsKKworc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgc2RlX2t0eXBlID0geworCS5zeXNmc19vcHMgPSAmc2RlX3N5c2ZzX29wcywKK307CisKKyNkZWZpbmUgU0RFX0FUVFIoX25hbWUsIF9tb2RlLCBfc2hvdywgX3N0b3JlKSBcCisJc3RydWN0IHNkZV9hdHRyaWJ1dGUgc2RlX2F0dHJfIyNfbmFtZSA9IFwKKwkJX19BVFRSKF9uYW1lLCBfbW9kZSwgX3Nob3csIF9zdG9yZSkKKworc3RhdGljIHNzaXplX3Qgc2RlX3Nob3dfY3B1X3RvX3NkZV9tYXAoc3RydWN0IHNkbWFfZW5naW5lICpzZGUsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc2RtYV9nZXRfY3B1X3RvX3NkZV9tYXAoc2RlLCBidWYpOworfQorCitzdGF0aWMgc3NpemVfdCBzZGVfc3RvcmVfY3B1X3RvX3NkZV9tYXAoc3RydWN0IHNkbWFfZW5naW5lICpzZGUsCisJCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBzZG1hX3NldF9jcHVfdG9fc2RlX21hcChzZGUsIGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgc3NpemVfdCBzZGVfc2hvd192bChzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkZSwgY2hhciAqYnVmKQoreworCWludCB2bDsKKworCXZsID0gc2RtYV9lbmdpbmVfZ2V0X3ZsKHNkZSk7CisJaWYgKHZsIDwgMCkKKwkJcmV0dXJuIHZsOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHZsKTsKK30KKworc3RhdGljIFNERV9BVFRSKGNwdV9saXN0LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJc2RlX3Nob3dfY3B1X3RvX3NkZV9tYXAsCisJCXNkZV9zdG9yZV9jcHVfdG9fc2RlX21hcCk7CitzdGF0aWMgU0RFX0FUVFIodmwsIFNfSVJVR08sIHNkZV9zaG93X3ZsLCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBzZGVfYXR0cmlidXRlICpzZGVfYXR0cmlic1tdID0geworCSZzZGVfYXR0cl9jcHVfbGlzdCwKKwkmc2RlX2F0dHJfdmwKK307CisKIC8qCiAgKiBSZWdpc3RlciBhbmQgY3JlYXRlIG91ciBmaWxlcyBpbiAvc3lzL2NsYXNzL2luZmluaWJhbmQuCiAgKi8KIGludCBoZmkxX3ZlcmJzX3JlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkKQogewogCXN0cnVjdCBpYl9kZXZpY2UgKmRldiA9ICZkZC0+dmVyYnNfZGV2LnJkaS5pYmRldjsKLQlpbnQgaSwgcmV0OworCXN0cnVjdCBkZXZpY2UgKmNsYXNzX2RldiA9ICZkZXYtPmRldjsKKwlpbnQgaSwgaiwgcmV0OwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaGZpMV9hdHRyaWJ1dGVzKTsgKytpKSB7CiAJCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsIGhmaTFfYXR0cmlidXRlc1tpXSk7CkBAIC03ODAsMTAgKzg2MiwyOSBAQAogCQkJZ290byBiYWlsOwogCX0KIAorCWZvciAoaSA9IDA7IGkgPCBkZC0+bnVtX3NkbWE7IGkrKykgeworCQlyZXQgPSBrb2JqZWN0X2luaXRfYW5kX2FkZCgmZGQtPnBlcl9zZG1hW2ldLmtvYmosCisJCQkJCSAgICZzZGVfa3R5cGUsICZjbGFzc19kZXYtPmtvYmosCisJCQkJCSAgICJzZG1hJWQiLCBpKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gYmFpbDsKKworCQlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShzZGVfYXR0cmlicyk7IGorKykgeworCQkJcmV0ID0gc3lzZnNfY3JlYXRlX2ZpbGUoJmRkLT5wZXJfc2RtYVtpXS5rb2JqLAorCQkJCQkJJnNkZV9hdHRyaWJzW2pdLT5hdHRyKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBiYWlsOworCQl9CisJfQorCiAJcmV0dXJuIDA7CiBiYWlsOgogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGhmaTFfYXR0cmlidXRlcyk7ICsraSkKIAkJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmRldiwgaGZpMV9hdHRyaWJ1dGVzW2ldKTsKKworCWZvciAoaSA9IDA7IGkgPCBkZC0+bnVtX3NkbWE7IGkrKykKKwkJa29iamVjdF9kZWwoJmRkLT5wZXJfc2RtYVtpXS5rb2JqKTsKKwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3RyYWNlLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS90cmFjZS5jCmluZGV4IDRjZmIxMzcuLjAxZjUyNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3RyYWNlLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdHJhY2UuYwpAQCAtNDcsOSArNDcsOSBAQAogI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCiAjaW5jbHVkZSAidHJhY2UuaCIKIAotdTggaWJoZHJfZXhoZHJfbGVuKHN0cnVjdCBoZmkxX2liX2hlYWRlciAqaGRyKQordTggaWJoZHJfZXhoZHJfbGVuKHN0cnVjdCBpYl9oZWFkZXIgKmhkcikKIHsKLQlzdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzICpvaGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyOwogCXU4IG9wY29kZTsKIAl1OCBsbmggPSAodTgpKGJlMTZfdG9fY3B1KGhkci0+bHJoWzBdKSAmIDMpOwogCkBAIC02NywxNiArNjcsMTEgQEAKICNkZWZpbmUgQUVUSF9QUk4gImFldGggc3luIDB4JS4yeCAlcyBtc24gMHglLjh4IgogI2RlZmluZSBERVRIX1BSTiAiZGV0aCBxa2V5IDB4JS44eCBzcXBuIDB4JS42eCIKICNkZWZpbmUgSUVUSF9QUk4gImlldGggcmtleSAweCUuOHgiCi0jZGVmaW5lIEFUT01JQ0FDS0VUSF9QUk4gIm9yaWdkYXRhICVsbGQiCi0jZGVmaW5lIEFUT01JQ0VUSF9QUk4gInZhZGRyIDB4JWxseCBya2V5IDB4JS44eCBzZGF0YSAlbGxkIGNkYXRhICVsbGQiCisjZGVmaW5lIEFUT01JQ0FDS0VUSF9QUk4gIm9yaWdkYXRhICVsbHgiCisjZGVmaW5lIEFUT01JQ0VUSF9QUk4gInZhZGRyIDB4JWxseCBya2V5IDB4JS44eCBzZGF0YSAlbGx4IGNkYXRhICVsbHgiCiAKICNkZWZpbmUgT1AodHJhbnNwb3J0LCBvcCkgSUJfT1BDT0RFXyMjIHRyYW5zcG9ydCAjIyBfICMjIG9wCiAKLXN0YXRpYyB1NjQgaWJfdTY0X2dldChfX2JlMzIgKnApCi17Ci0JcmV0dXJuICgodTY0KWJlMzJfdG9fY3B1KHBbMF0pIDw8IDMyKSB8IGJlMzJfdG9fY3B1KHBbMV0pOwotfQotCiBzdGF0aWMgY29uc3QgY2hhciAqcGFyc2Vfc3luZHJvbWUodTggc3luZHJvbWUpCiB7CiAJc3dpdGNoIChzeW5kcm9tZSA+PiA1KSB7CkBAIC0xMTMsOCArMTA4LDcgQEAKIAljYXNlIE9QKFJDLCBSRE1BX1dSSVRFX09OTFlfV0lUSF9JTU1FRElBVEUpOgogCWNhc2UgT1AoVUMsIFJETUFfV1JJVEVfT05MWV9XSVRIX0lNTUVESUFURSk6CiAJCXRyYWNlX3NlcV9wcmludGYocCwgUkVUSF9QUk4gIiAiIElNTV9QUk4sCi0JCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpaWJfdTY0X2dldCgKLQkJCQkgKF9fYmUzMiAqKSZlaC0+cmMucmV0aC52YWRkciksCisJCQkJIGdldF9pYl9yZXRoX3ZhZGRyKCZlaC0+cmMucmV0aCksCiAJCQkJIGJlMzJfdG9fY3B1KGVoLT5yYy5yZXRoLnJrZXkpLAogCQkJCSBiZTMyX3RvX2NwdShlaC0+cmMucmV0aC5sZW5ndGgpLAogCQkJCSBiZTMyX3RvX2NwdShlaC0+cmMuaW1tX2RhdGEpKTsKQEAgLTEyNiw4ICsxMjAsNyBAQAogCWNhc2UgT1AoUkMsIFJETUFfV1JJVEVfT05MWSk6CiAJY2FzZSBPUChVQywgUkRNQV9XUklURV9PTkxZKToKIAkJdHJhY2Vfc2VxX3ByaW50ZihwLCBSRVRIX1BSTiwKLQkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylpYl91NjRfZ2V0KAotCQkJCSAoX19iZTMyICopJmVoLT5yYy5yZXRoLnZhZGRyKSwKKwkJCQkgZ2V0X2liX3JldGhfdmFkZHIoJmVoLT5yYy5yZXRoKSwKIAkJCQkgYmUzMl90b19jcHUoZWgtPnJjLnJldGgucmtleSksCiAJCQkJIGJlMzJfdG9fY3B1KGVoLT5yYy5yZXRoLmxlbmd0aCkpOwogCQlicmVhazsKQEAgLTE0NSwyMCArMTM4LDE2IEBACiAJCQkJIGJlMzJfdG9fY3B1KGVoLT5hdC5hZXRoKSA+PiAyNCwKIAkJCQkgcGFyc2Vfc3luZHJvbWUoYmUzMl90b19jcHUoZWgtPmF0LmFldGgpID4+IDI0KSwKIAkJCQkgYmUzMl90b19jcHUoZWgtPmF0LmFldGgpICYgSEZJMV9NU05fTUFTSywKLQkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykKLQkJCQkgaWJfdTY0X2dldChlaC0+YXQuYXRvbWljX2Fja19ldGgpKTsKKwkJCQkgaWJfdTY0X2dldCgmZWgtPmF0LmF0b21pY19hY2tfZXRoKSk7CiAJCWJyZWFrOwogCS8qIGF0b21pY2V0aCAqLwogCWNhc2UgT1AoUkMsIENPTVBBUkVfU1dBUCk6CiAJY2FzZSBPUChSQywgRkVUQ0hfQUREKToKIAkJdHJhY2Vfc2VxX3ByaW50ZihwLCBBVE9NSUNFVEhfUFJOLAotCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKWliX3U2NF9nZXQoCi0JCQkJIGVoLT5hdG9taWNfZXRoLnZhZGRyKSwKKwkJCQkgZ2V0X2liX2F0ZXRoX3ZhZGRyKCZlaC0+YXRvbWljX2V0aCksCiAJCQkJIGVoLT5hdG9taWNfZXRoLnJrZXksCi0JCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpaWJfdTY0X2dldCgKLQkJCQkgKF9fYmUzMiAqKSZlaC0+YXRvbWljX2V0aC5zd2FwX2RhdGEpLAotCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKWliX3U2NF9nZXQoCi0JCQkJIChfX2JlMzIgKikmZWgtPmF0b21pY19ldGguY29tcGFyZV9kYXRhKSk7CisJCQkJIGdldF9pYl9hdGV0aF9zd2FwKCZlaC0+YXRvbWljX2V0aCksCisJCQkJIGdldF9pYl9hdGV0aF9jb21wYXJlKCZlaC0+YXRvbWljX2V0aCkpOwogCQlicmVhazsKIAkvKiBkZXRoICovCiAJY2FzZSBPUChVRCwgU0VORF9PTkxZKToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3RyYWNlX2N0eHRzLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS90cmFjZV9jdHh0cy5oCmluZGV4IDMxNjU0YmIuLjI2YWU3ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3RyYWNlX2N0eHRzLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdHJhY2VfY3R4dHMuaApAQCAtNjcsOSArNjcsOSBAQAogCQkJICAgICBfX2ZpZWxkKHU2NCwgaHdfZnJlZSkKIAkJCSAgICAgX19maWVsZCh2b2lkIF9faW9tZW0gKiwgcGlvYmFzZSkKIAkJCSAgICAgX19maWVsZCh1MTYsIHJjdmhkcnFfY250KQotCQkJICAgICBfX2ZpZWxkKHU2NCwgcmN2aGRycV9waHlzKQorCQkJICAgICBfX2ZpZWxkKHU2NCwgcmN2aGRycV9kbWEpCiAJCQkgICAgIF9fZmllbGQodTMyLCBlYWdlcl9jbnQpCi0JCQkgICAgIF9fZmllbGQodTY0LCByY3ZlZ3JfcGh5cykKKwkJCSAgICAgX19maWVsZCh1NjQsIHJjdmVncl9kbWEpCiAJCQkgICAgICksCiAJICAgIFRQX2Zhc3RfYXNzaWduKEREX0RFVl9BU1NJR04oZGQpOwogCQkJICAgX19lbnRyeS0+Y3R4dCA9IHVjdHh0LT5jdHh0OwpAQCAtNzcsMTAgKzc3LDkgQEAKIAkJCSAgIF9fZW50cnktPmh3X2ZyZWUgPSBsZTY0X3RvX2NwdSgqdWN0eHQtPnNjLT5od19mcmVlKTsKIAkJCSAgIF9fZW50cnktPnBpb2Jhc2UgPSB1Y3R4dC0+c2MtPmJhc2VfYWRkcjsKIAkJCSAgIF9fZW50cnktPnJjdmhkcnFfY250ID0gdWN0eHQtPnJjdmhkcnFfY250OwotCQkJICAgX19lbnRyeS0+cmN2aGRycV9waHlzID0gdWN0eHQtPnJjdmhkcnFfcGh5czsKKwkJCSAgIF9fZW50cnktPnJjdmhkcnFfZG1hID0gdWN0eHQtPnJjdmhkcnFfZG1hOwogCQkJICAgX19lbnRyeS0+ZWFnZXJfY250ID0gdWN0eHQtPmVncmJ1ZnMuYWxsb2NlZDsKLQkJCSAgIF9fZW50cnktPnJjdmVncl9waHlzID0KLQkJCSAgIHVjdHh0LT5lZ3JidWZzLnJjdnRpZHNbMF0ucGh5czsKKwkJCSAgIF9fZW50cnktPnJjdmVncl9kbWEgPSB1Y3R4dC0+ZWdyYnVmcy5yY3Z0aWRzWzBdLmRtYTsKIAkJCSAgICksCiAJICAgIFRQX3ByaW50aygiWyVzXSBjdHh0ICV1ICIgVUNUWFRfRk1ULAogCQkgICAgICBfX2dldF9zdHIoZGV2KSwKQEAgLTg5LDkgKzg4LDkgQEAKIAkJICAgICAgX19lbnRyeS0+aHdfZnJlZSwKIAkJICAgICAgX19lbnRyeS0+cGlvYmFzZSwKIAkJICAgICAgX19lbnRyeS0+cmN2aGRycV9jbnQsCi0JCSAgICAgIF9fZW50cnktPnJjdmhkcnFfcGh5cywKKwkJICAgICAgX19lbnRyeS0+cmN2aGRycV9kbWEsCiAJCSAgICAgIF9fZW50cnktPmVhZ2VyX2NudCwKLQkJICAgICAgX19lbnRyeS0+cmN2ZWdyX3BoeXMKKwkJICAgICAgX19lbnRyeS0+cmN2ZWdyX2RtYQogCQkgICAgICApCiApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS90cmFjZV9pYmhkcnMuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3RyYWNlX2liaGRycy5oCmluZGV4IGMzZTQxYWUuLjM4MmZjZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3RyYWNlX2liaGRycy5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3RyYWNlX2liaGRycy5oCkBAIC01NSw3ICs1NSw3IEBACiAjdW5kZWYgVFJBQ0VfU1lTVEVNCiAjZGVmaW5lIFRSQUNFX1NZU1RFTSBoZmkxX2liaGRycwogCi11OCBpYmhkcl9leGhkcl9sZW4oc3RydWN0IGhmaTFfaWJfaGVhZGVyICpoZHIpOwordTggaWJoZHJfZXhoZHJfbGVuKHN0cnVjdCBpYl9oZWFkZXIgKmhkcik7CiBjb25zdCBjaGFyICpwYXJzZV9ldmVyYnNfaGRycyhzdHJ1Y3QgdHJhY2Vfc2VxICpwLCB1OCBvcGNvZGUsIHZvaWQgKmVoZHJzKTsKIAogI2RlZmluZSBfX3BhcnNlX2liX2VoZHJzKG9wLCBlaGRycykgcGFyc2VfZXZlcmJzX2hkcnMocCwgb3AsIGVoZHJzKQpAQCAtNzQsNyArNzQsNyBAQAogCiBERUNMQVJFX0VWRU5UX0NMQVNTKGhmaTFfaWJoZHJfdGVtcGxhdGUsCiAJCSAgICBUUF9QUk9UTyhzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCwKLQkJCSAgICAgc3RydWN0IGhmaTFfaWJfaGVhZGVyICpoZHIpLAorCQkJICAgICBzdHJ1Y3QgaWJfaGVhZGVyICpoZHIpLAogCQkgICAgVFBfQVJHUyhkZCwgaGRyKSwKIAkJICAgIFRQX1NUUlVDVF9fZW50cnkoCiAJCQlERF9ERVZfRU5UUlkoZGQpCkBAIC0xMDIsNyArMTAyLDcgQEAKIAkJCV9fZHluYW1pY19hcnJheSh1OCwgZWhkcnMsIGliaGRyX2V4aGRyX2xlbihoZHIpKQogCQkJKSwKIAkJICAgICAgVFBfZmFzdF9hc3NpZ24oCi0JCQlzdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzICpvaGRyOworCQkJc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHI7CiAKIAkJCUREX0RFVl9BU1NJR04oZGQpOwogCQkJLyogTFJIICovCkBAIC0xODUsMTkgKzE4NSwxOSBAQAogKTsKIAogREVGSU5FX0VWRU5UKGhmaTFfaWJoZHJfdGVtcGxhdGUsIGlucHV0X2liaGRyLAotCSAgICAgVFBfUFJPVE8oc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsIHN0cnVjdCBoZmkxX2liX2hlYWRlciAqaGRyKSwKKwkgICAgIFRQX1BST1RPKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLCBzdHJ1Y3QgaWJfaGVhZGVyICpoZHIpLAogCSAgICAgVFBfQVJHUyhkZCwgaGRyKSk7CiAKIERFRklORV9FVkVOVChoZmkxX2liaGRyX3RlbXBsYXRlLCBwaW9fb3V0cHV0X2liaGRyLAotCSAgICAgVFBfUFJPVE8oc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsIHN0cnVjdCBoZmkxX2liX2hlYWRlciAqaGRyKSwKKwkgICAgIFRQX1BST1RPKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLCBzdHJ1Y3QgaWJfaGVhZGVyICpoZHIpLAogCSAgICAgVFBfQVJHUyhkZCwgaGRyKSk7CiAKIERFRklORV9FVkVOVChoZmkxX2liaGRyX3RlbXBsYXRlLCBhY2tfb3V0cHV0X2liaGRyLAotCSAgICAgVFBfUFJPVE8oc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsIHN0cnVjdCBoZmkxX2liX2hlYWRlciAqaGRyKSwKKwkgICAgIFRQX1BST1RPKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLCBzdHJ1Y3QgaWJfaGVhZGVyICpoZHIpLAogCSAgICAgVFBfQVJHUyhkZCwgaGRyKSk7CiAKIERFRklORV9FVkVOVChoZmkxX2liaGRyX3RlbXBsYXRlLCBzZG1hX291dHB1dF9pYmhkciwKLQkgICAgIFRQX1BST1RPKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLCBzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgKmhkciksCisJICAgICBUUF9QUk9UTyhzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCwgc3RydWN0IGliX2hlYWRlciAqaGRyKSwKIAkgICAgIFRQX0FSR1MoZGQsIGhkcikpOwogCiAjZW5kaWYgLyogX19IRkkxX1RSQUNFX0lCSERSU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS90cmFjZV9yeC5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdHJhY2VfcnguaAppbmRleCA5YmExZjYxLi4xMWUwMmIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS90cmFjZV9yeC5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3RyYWNlX3J4LmgKQEAgLTI2MCw3ICsyNjAsNyBAQAogVFJBQ0VfRVZFTlQoc25vb3BfY2FwdHVyZSwKIAkgICAgVFBfUFJPVE8oc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsCiAJCSAgICAgaW50IGhkcl9sZW4sCi0JCSAgICAgc3RydWN0IGhmaTFfaWJfaGVhZGVyICpoZHIsCisJCSAgICAgc3RydWN0IGliX2hlYWRlciAqaGRyLAogCQkgICAgIGludCBkYXRhX2xlbiwKIAkJICAgICB2b2lkICpkYXRhKSwKIAkgICAgVFBfQVJHUyhkZCwgaGRyX2xlbiwgaGRyLCBkYXRhX2xlbiwgZGF0YSksCkBAIC0yNzksNyArMjc5LDcgQEAKIAkJCSAgICAgX19keW5hbWljX2FycmF5KHU4LCByYXdfcGt0LCBkYXRhX2xlbikKIAkJCSAgICAgKSwKIAkgICAgVFBfZmFzdF9hc3NpZ24oCi0JCXN0cnVjdCBoZmkxX290aGVyX2hlYWRlcnMgKm9oZHI7CisJCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyOwogCiAJCV9fZW50cnktPmxuaCA9ICh1OCkoYmUxNl90b19jcHUoaGRyLT5scmhbMF0pICYgMyk7CiAJCWlmIChfX2VudHJ5LT5sbmggPT0gSEZJMV9MUkhfQlRIKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdWMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3VjLmMKaW5kZXggYTcyNmQ5Ni4uNWU2ZDFiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdWMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS91Yy5jCkBAIC01MCwxNCArNTAsNyBAQAogI2luY2x1ZGUgInFwLmgiCiAKIC8qIGN1dCBkb3duIHJpZGljdWxvdXNseSBsb25nIElCIG1hY3JvIG5hbWVzICovCi0jZGVmaW5lIE9QKHgpIElCX09QQ09ERV9VQ18jI3gKLQotLyogb25seSBvcGNvZGUgbWFzayBmb3IgYWRhcHRpdmUgcGlvICovCi1jb25zdCB1MzIgdWNfb25seV9vcGNvZGUgPQotCUJJVChPUChTRU5EX09OTFkpICYgMHgxZikgfAotCUJJVChPUChTRU5EX09OTFlfV0lUSF9JTU1FRElBVEUgJiAweDFmKSkgfAotCUJJVChPUChSRE1BX1dSSVRFX09OTFkgJiAweDFmKSkgfAotCUJJVChPUChSRE1BX1dSSVRFX09OTFlfV0lUSF9JTU1FRElBVEUgJiAweDFmKSk7CisjZGVmaW5lIE9QKHgpIFVDX09QKHgpCiAKIC8qKgogICogaGZpMV9tYWtlX3VjX3JlcSAtIGNvbnN0cnVjdCBhIHJlcXVlc3QgcGFja2V0IChTRU5ELCBSRE1BIHdyaXRlKQpAQCAtNzAsNyArNjMsNyBAQAogaW50IGhmaTFfbWFrZV91Y19yZXEoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBoZmkxX3BrdF9zdGF0ZSAqcHMpCiB7CiAJc3RydWN0IGhmaTFfcXBfcHJpdiAqcHJpdiA9IHFwLT5wcml2OwotCXN0cnVjdCBoZmkxX290aGVyX2hlYWRlcnMgKm9oZHI7CisJc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHI7CiAJc3RydWN0IHJ2dF9zd3FlICp3cWU7CiAJdTMyIGh3b3JkcyA9IDU7CiAJdTMyIGJ0aDAgPSAwOwpAQCAtMzA0LDEyICsyOTcsMTIgQEAKIHZvaWQgaGZpMV91Y19yY3Yoc3RydWN0IGhmaTFfcGFja2V0ICpwYWNrZXQpCiB7CiAJc3RydWN0IGhmaTFfaWJwb3J0ICppYnAgPSAmcGFja2V0LT5yY2QtPnBwZC0+aWJwb3J0X2RhdGE7Ci0Jc3RydWN0IGhmaTFfaWJfaGVhZGVyICpoZHIgPSBwYWNrZXQtPmhkcjsKKwlzdHJ1Y3QgaWJfaGVhZGVyICpoZHIgPSBwYWNrZXQtPmhkcjsKIAl1MzIgcmN2X2ZsYWdzID0gcGFja2V0LT5yY3ZfZmxhZ3M7CiAJdm9pZCAqZGF0YSA9IHBhY2tldC0+ZWJ1ZjsKIAl1MzIgdGxlbiA9IHBhY2tldC0+dGxlbjsKIAlzdHJ1Y3QgcnZ0X3FwICpxcCA9IHBhY2tldC0+cXA7Ci0Jc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyAqb2hkciA9IHBhY2tldC0+b2hkcjsKKwlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkciA9IHBhY2tldC0+b2hkcjsKIAl1MzIgYnRoMCwgb3Bjb2RlOwogCXUzMiBoZHJzaXplID0gcGFja2V0LT5obGVuOwogCXUzMiBwc247CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS91ZC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdWQuYwppbmRleCBmMDFlOGUxLi45N2FlMjRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS91ZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3VkLmMKQEAgLTI3MSw3ICsyNzEsNyBAQAogaW50IGhmaTFfbWFrZV91ZF9yZXEoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBoZmkxX3BrdF9zdGF0ZSAqcHMpCiB7CiAJc3RydWN0IGhmaTFfcXBfcHJpdiAqcHJpdiA9IHFwLT5wcml2OwotCXN0cnVjdCBoZmkxX290aGVyX2hlYWRlcnMgKm9oZHI7CisJc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHI7CiAJc3RydWN0IGliX2FoX2F0dHIgKmFoX2F0dHI7CiAJc3RydWN0IGhmaTFfcHBvcnRkYXRhICpwcGQ7CiAJc3RydWN0IGhmaTFfaWJwb3J0ICppYnA7CkBAIC01MTAsOCArNTEwLDggQEAKIAl1MzIgYnRoMCwgcGxlbiwgdmwsIGh3b3JkcyA9IDU7CiAJdTE2IGxyaDA7CiAJdTggc2wgPSBpYnAtPnNjX3RvX3NsW3NjNV07Ci0Jc3RydWN0IGhmaTFfaWJfaGVhZGVyIGhkcjsKLQlzdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzICpvaGRyOworCXN0cnVjdCBpYl9oZWFkZXIgaGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyOwogCXN0cnVjdCBwaW9fYnVmICpwYnVmOwogCXN0cnVjdCBzZW5kX2NvbnRleHQgKmN0eHQgPSBxcF90b19zZW5kX2NvbnRleHQocXAsIHNjNSk7CiAJc3RydWN0IGhmaTFfcHBvcnRkYXRhICpwcGQgPSBwcGRfZnJvbV9pYnAoaWJwKTsKQEAgLTU1OSw4ICs1NTksOCBAQAogCiAvKgogICogb3BhX3NtcF9jaGVjaygpIC0gRG8gdGhlIHJlZ3VsYXIgcGtleSBjaGVja2luZywgYW5kIHRoZSBhZGRpdGlvbmFsCi0gKiBjaGVja3MgZm9yIFNNUHMgc3BlY2lmaWVkIGluIE9QQXYxIHJldiAwLjkwLCBzZWN0aW9uIDkuMTAuMjYKLSAqICgiU01BIFBhY2tldCBDaGVja3MiKS4KKyAqIGNoZWNrcyBmb3IgU01QcyBzcGVjaWZpZWQgaW4gT1BBdjEgcmV2IDEuMCwgOS8xOS8yMDE2IHVwZGF0ZSwgc2VjdGlvbgorICogOS4xMC4yNSAoIlNNQSBQYWNrZXQgQ2hlY2tzIikuCiAgKgogICogTm90ZSB0aGF0OgogICogICAtIENoZWNrcyBhcmUgZG9uZSB1c2luZyB0aGUgcGtleSBkaXJlY3RseSBmcm9tIHRoZSBwYWNrZXQncyBCVEgsCkBAIC02MDMsMjMgKzYwMywyOCBAQAogCiAJLyoKIAkgKiBTTVBzIGZhbGwgaW50byBvbmUgb2YgZm91ciAoZGlzam9pbnQpIGNhdGVnb3JpZXM6Ci0JICogU01BIHJlcXVlc3QsIFNNQSByZXNwb25zZSwgdHJhcCwgb3IgdHJhcCByZXByZXNzLgotCSAqIE91ciByZXNwb25zZSBkZXBlbmRzLCBpbiBwYXJ0LCBvbiB3aGljaCB0eXBlIG9mCi0JICogU01QIHdlJ3JlIHByb2Nlc3NpbmcuCisJICogU01BIHJlcXVlc3QsIFNNQSByZXNwb25zZSwgU01BIHRyYXAsIG9yIFNNQSB0cmFwIHJlcHJlc3MuCisJICogT3VyIHJlc3BvbnNlIGRlcGVuZHMsIGluIHBhcnQsIG9uIHdoaWNoIHR5cGUgb2YgU01QIHdlJ3JlCisJICogcHJvY2Vzc2luZy4KIAkgKgotCSAqIElmIHRoaXMgaXMgbm90IGFuIFNNQSByZXF1ZXN0LCBvciB0cmFwIHJlcHJlc3M6Ci0JICogICAtIGFjY2VwdCBNQUQgaWYgdGhlIHBvcnQgaXMgcnVubmluZyBhbiBTTQotCSAqICAgLSBwa2V5ID09IEZVTExfTUdNVF9QX0tFWSA9PgotCSAqICAgICAgIHJlcGx5IHdpdGggdW5zdXBwb3J0ZWQgbWV0aG9kIChpLmUuLCBqdXN0IG1hcmsKLQkgKiAgICAgICB0aGUgc21wJ3Mgc3RhdHVzIGZpZWxkIGhlcmUsIGFuZCBsZXQgaXQgYmUKLQkgKiAgICAgICBwcm9jZXNzZWQgbm9ybWFsbHkpCi0JICogICAtIHBrZXkgIT0gTElNX01HTVRfUF9LRVkgPT4KLQkgKiAgICAgICBpbmNyZW1lbnQgcG9ydCByZWN2IGNvbnN0cmFpbnQgZXJyb3JzLCBkcm9wIE1BRAotCSAqIElmIHRoaXMgaXMgYW4gU01BIHJlcXVlc3Qgb3IgdHJhcCByZXByZXNzOgorCSAqIElmIHRoaXMgaXMgYW4gU01BIHJlc3BvbnNlLCBza2lwIHRoZSBjaGVjayBoZXJlLgorCSAqCisJICogSWYgdGhpcyBpcyBhbiBTTUEgcmVxdWVzdCBvciBTTUEgdHJhcCByZXByZXNzOgogCSAqICAgLSBwa2V5ICE9IEZVTExfTUdNVF9QX0tFWSA9PgogCSAqICAgICAgIGluY3JlbWVudCBwb3J0IHJlY3YgY29uc3RyYWludCBlcnJvcnMsIGRyb3AgTUFECisJICoKKwkgKiBPdGhlcndpc2U6CisJICogICAgLSBhY2NlcHQgaWYgdGhlIHBvcnQgaXMgcnVubmluZyBhbiBTTQorCSAqICAgIC0gZHJvcCBNQUQgaWYgaXQncyBhbiBTTUEgdHJhcAorCSAqICAgIC0gcGtleSA9PSBGVUxMX01HTVRfUF9LRVkgPT4KKwkgKiAgICAgICAgcmVwbHkgd2l0aCB1bnN1cHBvcnRlZCBtZXRob2QKKwkgKiAgICAtIHBrZXkgIT0gRlVMTF9NR01UX1BfS0VZID0+CisJICoJICBpbmNyZW1lbnQgcG9ydCByZWN2IGNvbnN0cmFpbnQgZXJyb3JzLCBkcm9wIE1BRAogCSAqLwogCXN3aXRjaCAoc21wLT5tZXRob2QpIHsKKwljYXNlIElCX01HTVRfTUVUSE9EX0dFVF9SRVNQOgorCWNhc2UgSUJfTUdNVF9NRVRIT0RfUkVQT1JUX1JFU1A6CisJCWJyZWFrOwogCWNhc2UgSUJfTUdNVF9NRVRIT0RfR0VUOgogCWNhc2UgSUJfTUdNVF9NRVRIT0RfU0VUOgogCWNhc2UgSUJfTUdNVF9NRVRIT0RfUkVQT1JUOgpAQCAtNjI5LDIzICs2MzQsMTcgQEAKIAkJCXJldHVybiAxOwogCQl9CiAJCWJyZWFrOwotCWNhc2UgSUJfTUdNVF9NRVRIT0RfU0VORDoKLQljYXNlIElCX01HTVRfTUVUSE9EX1RSQVA6Ci0JY2FzZSBJQl9NR01UX01FVEhPRF9HRVRfUkVTUDoKLQljYXNlIElCX01HTVRfTUVUSE9EX1JFUE9SVF9SRVNQOgorCWRlZmF1bHQ6CiAJCWlmIChpYnAtPnJ2cC5wb3J0X2NhcF9mbGFncyAmIElCX1BPUlRfU00pCiAJCQlyZXR1cm4gMDsKKwkJaWYgKHNtcC0+bWV0aG9kID09IElCX01HTVRfTUVUSE9EX1RSQVApCisJCQlyZXR1cm4gMTsKIAkJaWYgKHBrZXkgPT0gRlVMTF9NR01UX1BfS0VZKSB7CiAJCQlzbXAtPnN0YXR1cyB8PSBJQl9TTVBfVU5TVVBfTUVUSE9EOwogCQkJcmV0dXJuIDA7CiAJCX0KLQkJaWYgKHBrZXkgIT0gTElNX01HTVRfUF9LRVkpIHsKLQkJCWluZ3Jlc3NfcGtleV90YWJsZV9mYWlsKHBwZCwgcGtleSwgc2xpZCk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKKwkJaW5ncmVzc19wa2V5X3RhYmxlX2ZhaWwocHBkLCBwa2V5LCBzbGlkKTsKKwkJcmV0dXJuIDE7CiAJfQogCXJldHVybiAwOwogfQpAQCAtNjY1LDcgKzY2NCw3IEBACiAgKi8KIHZvaWQgaGZpMV91ZF9yY3Yoc3RydWN0IGhmaTFfcGFja2V0ICpwYWNrZXQpCiB7Ci0Jc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyAqb2hkciA9IHBhY2tldC0+b2hkcjsKKwlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkciA9IHBhY2tldC0+b2hkcjsKIAlpbnQgb3Bjb2RlOwogCXUzMiBoZHJzaXplID0gcGFja2V0LT5obGVuOwogCXN0cnVjdCBpYl93YyB3YzsKQEAgLTY3NSwxMyArNjc0LDEzIEBACiAJaW50IG1nbXRfcGtleV9pZHggPSAtMTsKIAlzdHJ1Y3QgaGZpMV9pYnBvcnQgKmlicCA9ICZwYWNrZXQtPnJjZC0+cHBkLT5pYnBvcnRfZGF0YTsKIAlzdHJ1Y3QgaGZpMV9wcG9ydGRhdGEgKnBwZCA9IHBwZF9mcm9tX2licChpYnApOwotCXN0cnVjdCBoZmkxX2liX2hlYWRlciAqaGRyID0gcGFja2V0LT5oZHI7CisJc3RydWN0IGliX2hlYWRlciAqaGRyID0gcGFja2V0LT5oZHI7CiAJdTMyIHJjdl9mbGFncyA9IHBhY2tldC0+cmN2X2ZsYWdzOwogCXZvaWQgKmRhdGEgPSBwYWNrZXQtPmVidWY7CiAJdTMyIHRsZW4gPSBwYWNrZXQtPnRsZW47CiAJc3RydWN0IHJ2dF9xcCAqcXAgPSBwYWNrZXQtPnFwOwogCWJvb2wgaGFzX2dyaCA9IHJjdl9mbGFncyAmIEhGSTFfSEFTX0dSSDsKLQl1OCBzYzUgPSBoZHIyc2MoKHN0cnVjdCBoZmkxX21lc3NhZ2VfaGVhZGVyICopaGRyLCBwYWNrZXQtPnJoZik7CisJdTggc2M1ID0gaGRyMnNjKGhkciwgcGFja2V0LT5yaGYpOwogCXUzMiBidGgxOwogCXU4IHNsX2Zyb21fc2MsIHNsOwogCXUxNiBzbGlkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdXNlcl9zZG1hLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS91c2VyX3NkbWEuYwppbmRleCAwZWNmMjc5Li5hNzYxZjgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS91c2VyX3NkbWEuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS91c2VyX3NkbWEuYwpAQCAtMTE0LDYgKzExNCw4IEBACiAjZGVmaW5lIEtERVRIX0hDUkNfTE9XRVJfU0hJRlQgICAgMjQKICNkZWZpbmUgS0RFVEhfSENSQ19MT1dFUl9NQVNLICAgICAweGZmCiAKKyNkZWZpbmUgQUhHX0tERVRIX0lOVFJfU0hJRlQgMTIKKwogI2RlZmluZSBQQkMyTFJIKHgpICgoKCh4KSAmIDB4ZmZmKSA8PCAyKSAtIDQpCiAjZGVmaW5lIExSSDJQQkMoeCkgKCgoKHgpID4+IDIpICsgMSkgJiAweGZmZikKIApAQCAtNTQ2LDcgKzU0OCw3IEBACiAJdTggb3Bjb2RlLCBzYywgdmw7CiAJaW50IHJlcV9xdWV1ZWQgPSAwOwogCXUxNiBkbGlkOwotCXU4IHNlbGVjdG9yOworCXUzMiBzZWxlY3RvcjsKIAogCWlmIChpb3ZlY1tpZHhdLmlvdl9sZW4gPCBzaXplb2YoaW5mbykgKyBzaXplb2YocmVxLT5oZHIpKSB7CiAJCWhmaTFfY2RiZygKQEAgLTc1MSwxMiArNzUzLDkgQEAKIAogCWRsaWQgPSBiZTE2X3RvX2NwdShyZXEtPmhkci5scmhbMV0pOwogCXNlbGVjdG9yID0gZGxpZF90b19zZWxlY3RvcihkbGlkKTsKKwlzZWxlY3RvciArPSB1Y3R4dC0+Y3R4dCArIGZkLT5zdWJjdHh0OworCXJlcS0+c2RlID0gc2RtYV9zZWxlY3RfdXNlcl9lbmdpbmUoZGQsIHNlbGVjdG9yLCB2bCk7CiAKLQkvKiBIYXZlIHRvIHNlbGVjdCB0aGUgZW5naW5lICovCi0JcmVxLT5zZGUgPSBzZG1hX3NlbGVjdF9lbmdpbmVfdmwoZGQsCi0JCQkJCSAodTMyKSh1Y3R4dC0+Y3R4dCArIGZkLT5zdWJjdHh0ICsKLQkJCQkJICAgICAgIHNlbGVjdG9yKSwKLQkJCQkJIHZsKTsKIAlpZiAoIXJlcS0+c2RlIHx8ICFzZG1hX3J1bm5pbmcocmVxLT5zZGUpKSB7CiAJCXJldCA9IC1FQ09NTTsKIAkJZ290byBmcmVlX3JlcTsKQEAgLTg5Miw3ICs4OTEsNyBAQAogCiBzdGF0aWMgaW50IHVzZXJfc2RtYV9zZW5kX3BrdHMoc3RydWN0IHVzZXJfc2RtYV9yZXF1ZXN0ICpyZXEsIHVuc2lnbmVkIG1heHBrdHMpCiB7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldCA9IDAsIGNvdW50OwogCXVuc2lnbmVkIG5wa3RzID0gMDsKIAlzdHJ1Y3QgdXNlcl9zZG1hX3R4cmVxICp0eCA9IE5VTEw7CiAJc3RydWN0IGhmaTFfdXNlcl9zZG1hX3BrdF9xICpwcSA9IE5VTEw7CkBAIC0xMDg4LDIzICsxMDg3LDE4IEBACiAJCW5wa3RzKys7CiAJfQogZG9zZW5kOgotCXJldCA9IHNkbWFfc2VuZF90eGxpc3QocmVxLT5zZGUsICZwcS0+YnVzeSwgJnJlcS0+dHhwcyk7Ci0JaWYgKGxpc3RfZW1wdHkoJnJlcS0+dHhwcykpIHsKLQkJcmVxLT5zZXFzdWJtaXR0ZWQgPSByZXEtPnNlcW51bTsKLQkJaWYgKHJlcS0+c2VxbnVtID09IHJlcS0+aW5mby5ucGt0cykgewotCQkJc2V0X2JpdChTRE1BX1JFUV9TRU5EX0RPTkUsICZyZXEtPmZsYWdzKTsKLQkJCS8qCi0JCQkgKiBUaGUgdHhyZXEgaGFzIGFscmVhZHkgYmVlbiBzdWJtaXR0ZWQgdG8gdGhlIEhXIHF1ZXVlCi0JCQkgKiBzbyB3ZSBjYW4gZnJlZSB0aGUgQUhHIGVudHJ5IG5vdy4gQ29ycnVwdGlvbiB3aWxsIG5vdAotCQkJICogaGFwcGVuIGR1ZSB0byB0aGUgc2VxdWVudGlhbCBtYW5uZXIgaW4gd2hpY2gKLQkJCSAqIGRlc2NyaXB0b3JzIGFyZSBwcm9jZXNzZWQuCi0JCQkgKi8KLQkJCWlmICh0ZXN0X2JpdChTRE1BX1JFUV9IQVZFX0FIRywgJnJlcS0+ZmxhZ3MpKQotCQkJCXNkbWFfYWhnX2ZyZWUocmVxLT5zZGUsIHJlcS0+YWhnX2lkeCk7Ci0JCX0KLQl9IGVsc2UgaWYgKHJldCA+IDApIHsKLQkJcmVxLT5zZXFzdWJtaXR0ZWQgKz0gcmV0OwotCQlyZXQgPSAwOworCXJldCA9IHNkbWFfc2VuZF90eGxpc3QocmVxLT5zZGUsICZwcS0+YnVzeSwgJnJlcS0+dHhwcywgJmNvdW50KTsKKwlyZXEtPnNlcXN1Ym1pdHRlZCArPSBjb3VudDsKKwlpZiAocmVxLT5zZXFzdWJtaXR0ZWQgPT0gcmVxLT5pbmZvLm5wa3RzKSB7CisJCXNldF9iaXQoU0RNQV9SRVFfU0VORF9ET05FLCAmcmVxLT5mbGFncyk7CisJCS8qCisJCSAqIFRoZSB0eHJlcSBoYXMgYWxyZWFkeSBiZWVuIHN1Ym1pdHRlZCB0byB0aGUgSFcgcXVldWUKKwkJICogc28gd2UgY2FuIGZyZWUgdGhlIEFIRyBlbnRyeSBub3cuIENvcnJ1cHRpb24gd2lsbCBub3QKKwkJICogaGFwcGVuIGR1ZSB0byB0aGUgc2VxdWVudGlhbCBtYW5uZXIgaW4gd2hpY2gKKwkJICogZGVzY3JpcHRvcnMgYXJlIHByb2Nlc3NlZC4KKwkJICovCisJCWlmICh0ZXN0X2JpdChTRE1BX1JFUV9IQVZFX0FIRywgJnJlcS0+ZmxhZ3MpKQorCQkJc2RtYV9haGdfZnJlZShyZXEtPnNkZSwgcmVxLT5haGdfaWR4KTsKIAl9CiAJcmV0dXJuIHJldDsKIApAQCAtMTQ4MCw3ICsxNDc0LDggQEAKIAkJLyogQ2xlYXIgS0RFVEguU0ggb24gbGFzdCBwYWNrZXQgKi8KIAkJaWYgKHVubGlrZWx5KHR4LT5mbGFncyAmIFRYUkVRX0ZMQUdTX1JFUV9MQVNUX1BLVCkpIHsKIAkJCXZhbCB8PSBjcHVfdG9fbGUxNihLREVUSF9HRVQoaGRyLT5rZGV0aC52ZXJfdGlkX29mZnNldCwKLQkJCQkJCQkJSU5UUikgPj4gMTYpOworCQkJCQkJICAgICBJTlRSKSA8PAorCQkJCQkgICBBSEdfS0RFVEhfSU5UUl9TSElGVCk7CiAJCQl2YWwgJj0gY3B1X3RvX2xlMTYofigxVSA8PCAxMykpOwogCQkJQUhHX0hFQURFUl9TRVQocmVxLT5haGcsIGRpZmYsIDcsIDE2LCAxNCwgdmFsKTsKIAkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3ZlcmJzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS92ZXJicy5jCmluZGV4IDJiMzU5NTQuLmYyZjZiNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3ZlcmJzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdmVyYnMuYwpAQCAtNzYsNyArNzYsNyBAQAogbW9kdWxlX3BhcmFtX25hbWVkKG1heF9haHMsIGhmaTFfbWF4X2FocywgdWludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKG1heF9haHMsICJNYXhpbXVtIG51bWJlciBvZiBhZGRyZXNzIGhhbmRsZXMgdG8gc3VwcG9ydCIpOwogCi11bnNpZ25lZCBpbnQgaGZpMV9tYXhfY3FlcyA9IDB4MkZGRkY7Cit1bnNpZ25lZCBpbnQgaGZpMV9tYXhfY3FlcyA9IDB4MkZGRkZGOwogbW9kdWxlX3BhcmFtX25hbWVkKG1heF9jcWVzLCBoZmkxX21heF9jcWVzLCB1aW50LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MobWF4X2NxZXMsCiAJCSAiTWF4aW11bSBudW1iZXIgb2YgY29tcGxldGlvbiBxdWV1ZSBlbnRyaWVzIHRvIHN1cHBvcnQiKTsKQEAgLTg5LDcgKzg5LDcgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChtYXhfcXBfd3JzLCBoZmkxX21heF9xcF93cnMsIHVpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhtYXhfcXBfd3JzLCAiTWF4aW11bSBudW1iZXIgb2YgUVAgV1JzIHRvIHN1cHBvcnQiKTsKIAotdW5zaWduZWQgaW50IGhmaTFfbWF4X3FwcyA9IDE2Mzg0OwordW5zaWduZWQgaW50IGhmaTFfbWF4X3FwcyA9IDMyNzY4OwogbW9kdWxlX3BhcmFtX25hbWVkKG1heF9xcHMsIGhmaTFfbWF4X3FwcywgdWludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKG1heF9xcHMsICJNYXhpbXVtIG51bWJlciBvZiBRUHMgdG8gc3VwcG9ydCIpOwogCkBAIC0zMzUsNyArMzM1LDcgQEAKIAlbSUJfT1BDT0RFX1JDX1JETUFfUkVBRF9SRVNQT05TRV9MQVNUXSAgICAgICAgPSAxMiArIDggKyA0LAogCVtJQl9PUENPREVfUkNfUkRNQV9SRUFEX1JFU1BPTlNFX09OTFldICAgICAgICA9IDEyICsgOCArIDQsCiAJW0lCX09QQ09ERV9SQ19BQ0tOT1dMRURHRV0gICAgICAgICAgICAgICAgICAgID0gMTIgKyA4ICsgNCwKLQlbSUJfT1BDT0RFX1JDX0FUT01JQ19BQ0tOT1dMRURHRV0gICAgICAgICAgICAgPSAxMiArIDggKyA0LAorCVtJQl9PUENPREVfUkNfQVRPTUlDX0FDS05PV0xFREdFXSAgICAgICAgICAgICA9IDEyICsgOCArIDQgKyA4LAogCVtJQl9PUENPREVfUkNfQ09NUEFSRV9TV0FQXSAgICAgICAgICAgICAgICAgICA9IDEyICsgOCArIDI4LAogCVtJQl9PUENPREVfUkNfRkVUQ0hfQUREXSAgICAgICAgICAgICAgICAgICAgICA9IDEyICsgOCArIDI4LAogCVtJQl9PUENPREVfUkNfU0VORF9MQVNUX1dJVEhfSU5WQUxJREFURV0gICAgICA9IDEyICsgOCArIDQsCkBAIC00MDMsNiArNDAzLDI4IEBACiAJW0lCX09QQ09ERV9DTlBdCQkJCSAgICAgID0gJmhmaTFfY25wX3JjdgogfTsKIAorI2RlZmluZSBPUE1BU0sgMHgxZgorCitzdGF0aWMgY29uc3QgdTMyIHBpb19vcG1hc2tbQklUKDMpXSA9IHsKKwkvKiBSQyAqLworCVtJQl9PUENPREVfUkMgPj4gNV0gPQorCQlCSVQoUkNfT1AoU0VORF9PTkxZKSAmIE9QTUFTSykgfAorCQlCSVQoUkNfT1AoU0VORF9PTkxZX1dJVEhfSU1NRURJQVRFKSAmIE9QTUFTSykgfAorCQlCSVQoUkNfT1AoUkRNQV9XUklURV9PTkxZKSAmIE9QTUFTSykgfAorCQlCSVQoUkNfT1AoUkRNQV9XUklURV9PTkxZX1dJVEhfSU1NRURJQVRFKSAmIE9QTUFTSykgfAorCQlCSVQoUkNfT1AoUkRNQV9SRUFEX1JFUVVFU1QpICYgT1BNQVNLKSB8CisJCUJJVChSQ19PUChBQ0tOT1dMRURHRSkgJiBPUE1BU0spIHwKKwkJQklUKFJDX09QKEFUT01JQ19BQ0tOT1dMRURHRSkgJiBPUE1BU0spIHwKKwkJQklUKFJDX09QKENPTVBBUkVfU1dBUCkgJiBPUE1BU0spIHwKKwkJQklUKFJDX09QKEZFVENIX0FERCkgJiBPUE1BU0spLAorCS8qIFVDICovCisJW0lCX09QQ09ERV9VQyA+PiA1XSA9CisJCUJJVChVQ19PUChTRU5EX09OTFkpICYgT1BNQVNLKSB8CisJCUJJVChVQ19PUChTRU5EX09OTFlfV0lUSF9JTU1FRElBVEUpICYgT1BNQVNLKSB8CisJCUJJVChVQ19PUChSRE1BX1dSSVRFX09OTFkpICYgT1BNQVNLKSB8CisJCUJJVChVQ19PUChSRE1BX1dSSVRFX09OTFlfV0lUSF9JTU1FRElBVEUpICYgT1BNQVNLKSwKK307CisKIC8qCiAgKiBTeXN0ZW0gaW1hZ2UgR1VJRC4KICAqLwpAQCAtNTY3LDcgKzU4OSw3IEBACiB2b2lkIGhmaTFfaWJfcmN2KHN0cnVjdCBoZmkxX3BhY2tldCAqcGFja2V0KQogewogCXN0cnVjdCBoZmkxX2N0eHRkYXRhICpyY2QgPSBwYWNrZXQtPnJjZDsKLQlzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgKmhkciA9IHBhY2tldC0+aGRyOworCXN0cnVjdCBpYl9oZWFkZXIgKmhkciA9IHBhY2tldC0+aGRyOwogCXUzMiB0bGVuID0gcGFja2V0LT50bGVuOwogCXN0cnVjdCBoZmkxX3Bwb3J0ZGF0YSAqcHBkID0gcmNkLT5wcGQ7CiAJc3RydWN0IGhmaTFfaWJwb3J0ICppYnAgPSAmcHBkLT5pYnBvcnRfZGF0YTsKQEAgLTcxOSw3ICs3NDEsNyBAQAogCWlmICh0eC0+d3FlKSB7CiAJCWhmaTFfc2VuZF9jb21wbGV0ZShxcCwgdHgtPndxZSwgSUJfV0NfU1VDQ0VTUyk7CiAJfSBlbHNlIGlmIChxcC0+aWJxcC5xcF90eXBlID09IElCX1FQVF9SQykgewotCQlzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgKmhkcjsKKwkJc3RydWN0IGliX2hlYWRlciAqaGRyOwogCiAJCWhkciA9ICZ0eC0+cGhkci5oZHI7CiAJCWhmaTFfcmNfc2VuZF9jb21wbGV0ZShxcCwgaGRyKTsKQEAgLTc0OCw3ICs3NzAsNyBAQAogCQkJcXAtPnNfZmxhZ3MgfD0gUlZUX1NfV0FJVF9LTUVNOwogCQkJbGlzdF9hZGRfdGFpbCgmcHJpdi0+c19pb3dhaXQubGlzdCwgJmRldi0+bWVtd2FpdCk7CiAJCQl0cmFjZV9oZmkxX3Fwc2xlZXAocXAsIFJWVF9TX1dBSVRfS01FTSk7Ci0JCQlhdG9taWNfaW5jKCZxcC0+cmVmY291bnQpOworCQkJcnZ0X2dldF9xcChxcCk7CiAJCX0KIAkJd3JpdGVfc2VxdW5sb2NrKCZkZXYtPmlvd2FpdF9sb2NrKTsKIAkJcXAtPnNfZmxhZ3MgJj0gflJWVF9TX0JVU1k7CkBAIC05NTksNyArOTgxLDcgQEAKIAkJCXdhc19lbXB0eSA9IGxpc3RfZW1wdHkoJnNjLT5waW93YWl0KTsKIAkJCWxpc3RfYWRkX3RhaWwoJnByaXYtPnNfaW93YWl0Lmxpc3QsICZzYy0+cGlvd2FpdCk7CiAJCQl0cmFjZV9oZmkxX3Fwc2xlZXAocXAsIFJWVF9TX1dBSVRfUElPKTsKLQkJCWF0b21pY19pbmMoJnFwLT5yZWZjb3VudCk7CisJCQlydnRfZ2V0X3FwKHFwKTsKIAkJCS8qIGNvdW50aW5nOiBvbmx5IGNhbGwgd2FudHBpb2J1Zl9pbnRyIGlmIGZpcnN0IHVzZXIgKi8KIAkJCWlmICh3YXNfZW1wdHkpCiAJCQkJaGZpMV9zY193YW50cGlvYnVmX2ludHIoc2MsIDEpOwpAQCAtMTIwMCw3ICsxMjIyLDcgQEAKIHsKIAlzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCA9IGRkX2Zyb21faWJkZXYocXAtPmlicXAuZGV2aWNlKTsKIAlzdHJ1Y3QgaGZpMV9xcF9wcml2ICpwcml2ID0gcXAtPnByaXY7Ci0Jc3RydWN0IGhmaTFfaWJfaGVhZGVyICpoID0gJnR4LT5waGRyLmhkcjsKKwlzdHJ1Y3QgaWJfaGVhZGVyICpoID0gJnR4LT5waGRyLmhkcjsKIAogCWlmICh1bmxpa2VseSghKGRkLT5mbGFncyAmIEhGSTFfSEFTX1NFTkRfRE1BKSkpCiAJCXJldHVybiBkZC0+cHJvY2Vzc19waW9fc2VuZDsKQEAgLTEyMTAsMjIgKzEyMzIsMTggQEAKIAljYXNlIElCX1FQVF9HU0k6CiAJY2FzZSBJQl9RUFRfVUQ6CiAJCWJyZWFrOwotCWNhc2UgSUJfUVBUX1JDOgotCQlpZiAocGlvdGhyZXNob2xkICYmCi0JCSAgICBxcC0+c19jdXJfc2l6ZSA8PSBtaW4ocGlvdGhyZXNob2xkLCBxcC0+cG10dSkgJiYKLQkJICAgIChCSVQoZ2V0X29wY29kZShoKSAmIDB4MWYpICYgcmNfb25seV9vcGNvZGUpICYmCi0JCSAgICBpb3dhaXRfc2RtYV9wZW5kaW5nKCZwcml2LT5zX2lvd2FpdCkgPT0gMCAmJgotCQkgICAgIXNkbWFfdHhyZXFfYnVpbHQoJnR4LT50eHJlcSkpCi0JCQlyZXR1cm4gZGQtPnByb2Nlc3NfcGlvX3NlbmQ7Ci0JCWJyZWFrOwogCWNhc2UgSUJfUVBUX1VDOgorCWNhc2UgSUJfUVBUX1JDOiB7CisJCXU4IG9wID0gZ2V0X29wY29kZShoKTsKKwogCQlpZiAocGlvdGhyZXNob2xkICYmCiAJCSAgICBxcC0+c19jdXJfc2l6ZSA8PSBtaW4ocGlvdGhyZXNob2xkLCBxcC0+cG10dSkgJiYKLQkJICAgIChCSVQoZ2V0X29wY29kZShoKSAmIDB4MWYpICYgdWNfb25seV9vcGNvZGUpICYmCisJCSAgICAoQklUKG9wICYgT1BNQVNLKSAmIHBpb19vcG1hc2tbb3AgPj4gNV0pICYmCiAJCSAgICBpb3dhaXRfc2RtYV9wZW5kaW5nKCZwcml2LT5zX2lvd2FpdCkgPT0gMCAmJgogCQkgICAgIXNkbWFfdHhyZXFfYnVpbHQoJnR4LT50eHJlcSkpCiAJCQlyZXR1cm4gZGQtPnByb2Nlc3NfcGlvX3NlbmQ7CiAJCWJyZWFrOworCX0KIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CkBAIC0xMjQ0LDggKzEyNjIsOCBAQAogewogCXN0cnVjdCBoZmkxX2RldmRhdGEgKmRkID0gZGRfZnJvbV9pYmRldihxcC0+aWJxcC5kZXZpY2UpOwogCXN0cnVjdCBoZmkxX3FwX3ByaXYgKnByaXYgPSBxcC0+cHJpdjsKLQlzdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzICpvaGRyOwotCXN0cnVjdCBoZmkxX2liX2hlYWRlciAqaGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyOworCXN0cnVjdCBpYl9oZWFkZXIgKmhkcjsKIAlzZW5kX3JvdXRpbmUgc3I7CiAJaW50IHJldDsKIAl1OCBsbmg7CkBAIC0xNzU0LDcgKzE3NzIsNyBAQAogewogCXN0cnVjdCBoZmkxX2licG9ydCAqaWJwID0gJnBhY2tldC0+cmNkLT5wcGQtPmlicG9ydF9kYXRhOwogCXN0cnVjdCBoZmkxX3Bwb3J0ZGF0YSAqcHBkID0gcHBkX2Zyb21faWJwKGlicCk7Ci0Jc3RydWN0IGhmaTFfaWJfaGVhZGVyICpoZHIgPSBwYWNrZXQtPmhkcjsKKwlzdHJ1Y3QgaWJfaGVhZGVyICpoZHIgPSBwYWNrZXQtPmhkcjsKIAlzdHJ1Y3QgcnZ0X3FwICpxcCA9IHBhY2tldC0+cXA7CiAJdTMyIGxxcG4sIHJxcG4gPSAwOwogCXUxNiBybGlkID0gMDsKQEAgLTE3ODEsNyArMTc5OSw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlzYzUgPSBoZHIyc2MoKHN0cnVjdCBoZmkxX21lc3NhZ2VfaGVhZGVyICopaGRyLCBwYWNrZXQtPnJoZik7CisJc2M1ID0gaGRyMnNjKGhkciwgcGFja2V0LT5yaGYpOwogCXNsID0gaWJwLT5zY190b19zbFtzYzVdOwogCWxxcG4gPSBxcC0+aWJxcC5xcF9udW07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3ZlcmJzLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS92ZXJicy5oCmluZGV4IGQxYjEwMWMuLjFjMzgxNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3ZlcmJzLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdmVyYnMuaApAQCAtNjAsNiArNjAsNyBAQAogI2luY2x1ZGUgPHJkbWEvaWJfcGFjay5oPgogI2luY2x1ZGUgPHJkbWEvaWJfdXNlcl92ZXJicy5oPgogI2luY2x1ZGUgPHJkbWEvaWJfbWFkLmg+CisjaW5jbHVkZSA8cmRtYS9pYl9oZHJzLmg+CiAjaW5jbHVkZSA8cmRtYS9yZG1hX3Z0Lmg+CiAjaW5jbHVkZSA8cmRtYS9yZG1hdnRfcXAuaD4KICNpbmNsdWRlIDxyZG1hL3JkbWF2dF9jcS5oPgpAQCAtODAsMTYgKzgxLDYgQEAKICAqLwogI2RlZmluZSBIRkkxX1VWRVJCU19BQklfVkVSU0lPTiAgICAgICAyCiAKLSNkZWZpbmUgSUJfU0VRX05BSwkoMyA8PCAyOSkKLQotLyogQUVUSCBOQUsgb3Bjb2RlIHZhbHVlcyAqLwotI2RlZmluZSBJQl9STlJfTkFLICAgICAgICAgICAgICAgICAgICAgIDB4MjAKLSNkZWZpbmUgSUJfTkFLX1BTTl9FUlJPUiAgICAgICAgICAgICAgICAweDYwCi0jZGVmaW5lIElCX05BS19JTlZBTElEX1JFUVVFU1QgICAgICAgICAgMHg2MQotI2RlZmluZSBJQl9OQUtfUkVNT1RFX0FDQ0VTU19FUlJPUiAgICAgIDB4NjIKLSNkZWZpbmUgSUJfTkFLX1JFTU9URV9PUEVSQVRJT05BTF9FUlJPUiAweDYzCi0jZGVmaW5lIElCX05BS19JTlZBTElEX1JEX1JFUVVFU1QgICAgICAgMHg2NAotCiAvKiBJQiBQZXJmb3JtYW5jZSBNYW5hZ2VyIHN0YXR1cyB2YWx1ZXMgKi8KICNkZWZpbmUgSUJfUE1BX1NBTVBMRV9TVEFUVVNfRE9ORSAgICAgICAweDAwCiAjZGVmaW5lIElCX1BNQV9TQU1QTEVfU1RBVFVTX1NUQVJURUQgICAgMHgwMQpAQCAtMTA0LDgwICs5NSwxNiBAQAogCiAjZGVmaW5lIEhGSTFfVkVORE9SX0lQRwkJY3B1X3RvX2JlMTYoMHhGRkEwKQogCi0jZGVmaW5lIElCX0JUSF9SRVFfQUNLCQlCSVQoMzEpCi0jZGVmaW5lIElCX0JUSF9TT0xJQ0lURUQJQklUKDIzKQotI2RlZmluZSBJQl9CVEhfTUlHX1JFUQkJQklUKDIyKQotCi0jZGVmaW5lIElCX0dSSF9WRVJTSU9OCQk2Ci0jZGVmaW5lIElCX0dSSF9WRVJTSU9OX01BU0sJMHhGCi0jZGVmaW5lIElCX0dSSF9WRVJTSU9OX1NISUZUCTI4Ci0jZGVmaW5lIElCX0dSSF9UQ0xBU1NfTUFTSwkweEZGCi0jZGVmaW5lIElCX0dSSF9UQ0xBU1NfU0hJRlQJMjAKLSNkZWZpbmUgSUJfR1JIX0ZMT1dfTUFTSwkweEZGRkZGCi0jZGVmaW5lIElCX0dSSF9GTE9XX1NISUZUCTAKLSNkZWZpbmUgSUJfR1JIX05FWFRfSERSCQkweDFCCi0KICNkZWZpbmUgSUJfREVGQVVMVF9HSURfUFJFRklYCWNwdV90b19iZTY0KDB4ZmU4MDAwMDAwMDAwMDAwMFVMTCkKIAorI2RlZmluZSBSQ19PUCh4KSBJQl9PUENPREVfUkNfIyN4CisjZGVmaW5lIFVDX09QKHgpIElCX09QQ09ERV9VQ18jI3gKKwogLyogZmxhZ3MgcGFzc2VkIGJ5IGhmaTFfaWJfcmN2KCkgKi8KIGVudW0gewogCUhGSTFfSEFTX0dSSCA9ICgxIDw8IDApLAogfTsKIAotc3RydWN0IGliX3JldGggewotCV9fYmU2NCB2YWRkcjsKLQlfX2JlMzIgcmtleTsKLQlfX2JlMzIgbGVuZ3RoOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGliX2F0b21pY19ldGggewotCV9fYmUzMiB2YWRkclsyXTsgICAgICAgIC8qIHVuYWxpZ25lZCBzbyBhY2Nlc3MgYXMgMiAzMi1iaXQgd29yZHMgKi8KLQlfX2JlMzIgcmtleTsKLQlfX2JlNjQgc3dhcF9kYXRhOwotCV9fYmU2NCBjb21wYXJlX2RhdGE7Ci19IF9fcGFja2VkOwotCi11bmlvbiBpYl9laGRycyB7Ci0Jc3RydWN0IHsKLQkJX19iZTMyIGRldGhbMl07Ci0JCV9fYmUzMiBpbW1fZGF0YTsKLQl9IHVkOwotCXN0cnVjdCB7Ci0JCXN0cnVjdCBpYl9yZXRoIHJldGg7Ci0JCV9fYmUzMiBpbW1fZGF0YTsKLQl9IHJjOwotCXN0cnVjdCB7Ci0JCV9fYmUzMiBhZXRoOwotCQlfX2JlMzIgYXRvbWljX2Fja19ldGhbMl07Ci0JfSBhdDsKLQlfX2JlMzIgaW1tX2RhdGE7Ci0JX19iZTMyIGFldGg7Ci0JX19iZTMyIGlldGg7Ci0Jc3RydWN0IGliX2F0b21pY19ldGggYXRvbWljX2V0aDsKLX0gIF9fcGFja2VkOwotCi1zdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzIHsKLQlfX2JlMzIgYnRoWzNdOwotCXVuaW9uIGliX2VoZHJzIHU7Ci19IF9fcGFja2VkOwotCi0vKgotICogTm90ZSB0aGF0IFVEIHBhY2tldHMgd2l0aCBhIEdSSCBoZWFkZXIgYXJlIDgrNDArMTIrOCA9IDY4IGJ5dGVzCi0gKiBsb25nICg3MiB3LyBpbW1fZGF0YSkuICBPbmx5IHRoZSBmaXJzdCA1NiBieXRlcyBvZiB0aGUgSUIgaGVhZGVyCi0gKiB3aWxsIGJlIGluIHRoZSBlYWdlciBoZWFkZXIgYnVmZmVyLiAgVGhlIHJlbWFpbmluZyAxMiBvciAxNiBieXRlcwotICogYXJlIGluIHRoZSBkYXRhIGJ1ZmZlci4KLSAqLwotc3RydWN0IGhmaTFfaWJfaGVhZGVyIHsKLQlfX2JlMTYgbHJoWzRdOwotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCXN0cnVjdCBpYl9ncmggZ3JoOwotCQkJc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyBvdGg7Ci0JCX0gbDsKLQkJc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyBvdGg7Ci0JfSB1OwotfSBfX3BhY2tlZDsKLQogc3RydWN0IGhmaTFfYWhnX2luZm8gewogCXUzMiBhaGdkZXNjWzJdOwogCXUxNiB0eF9mbGFnczsKQEAgLTE4Nyw3ICsxMTQsNyBAQAogCiBzdHJ1Y3QgaGZpMV9zZG1hX2hlYWRlciB7CiAJX19sZTY0IHBiYzsKLQlzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgaGRyOworCXN0cnVjdCBpYl9oZWFkZXIgaGRyOwogfSBfX3BhY2tlZDsKIAogLyoKQEAgLTM4Niw3ICszMTMsNyBAQAogCiB2b2lkIGhmaTFfcmNfaGRyZXJyKAogCXN0cnVjdCBoZmkxX2N0eHRkYXRhICpyY2QsCi0Jc3RydWN0IGhmaTFfaWJfaGVhZGVyICpoZHIsCisJc3RydWN0IGliX2hlYWRlciAqaGRyLAogCXUzMiByY3ZfZmxhZ3MsCiAJc3RydWN0IHJ2dF9xcCAqcXApOwogCkBAIC00MDAsNyArMzI3LDcgQEAKIHZvaWQgaGZpMV9kZWxfdGltZXJzX3N5bmMoc3RydWN0IHJ2dF9xcCAqcXApOwogdm9pZCBoZmkxX3N0b3BfcmNfdGltZXJzKHN0cnVjdCBydnRfcXAgKnFwKTsKIAotdm9pZCBoZmkxX3JjX3NlbmRfY29tcGxldGUoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBoZmkxX2liX2hlYWRlciAqaGRyKTsKK3ZvaWQgaGZpMV9yY19zZW5kX2NvbXBsZXRlKHN0cnVjdCBydnRfcXAgKnFwLCBzdHJ1Y3QgaWJfaGVhZGVyICpoZHIpOwogCiB2b2lkIGhmaTFfcmNfZXJyb3Ioc3RydWN0IHJ2dF9xcCAqcXAsIGVudW0gaWJfd2Nfc3RhdHVzIGVycik7CiAKQEAgLTQyMyw3ICszNTAsNyBAQAogZXh0ZXJuIGNvbnN0IHUzMiByY19vbmx5X29wY29kZTsKIGV4dGVybiBjb25zdCB1MzIgdWNfb25seV9vcGNvZGU7CiAKLXN0YXRpYyBpbmxpbmUgdTggZ2V0X29wY29kZShzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgKmgpCitzdGF0aWMgaW5saW5lIHU4IGdldF9vcGNvZGUoc3RydWN0IGliX2hlYWRlciAqaCkKIHsKIAl1MTYgbG5oID0gYmUxNl90b19jcHUoaC0+bHJoWzBdKSAmIDM7CiAKQEAgLTQzMywxMyArMzYwLDEzIEBACiAJCXJldHVybiBiZTMyX3RvX2NwdShoLT51Lmwub3RoLmJ0aFswXSkgPj4gMjQ7CiB9CiAKLWludCBoZmkxX3J1Y19jaGVja19oZHIoc3RydWN0IGhmaTFfaWJwb3J0ICppYnAsIHN0cnVjdCBoZmkxX2liX2hlYWRlciAqaGRyLAoraW50IGhmaTFfcnVjX2NoZWNrX2hkcihzdHJ1Y3QgaGZpMV9pYnBvcnQgKmlicCwgc3RydWN0IGliX2hlYWRlciAqaGRyLAogCQkgICAgICAgaW50IGhhc19ncmgsIHN0cnVjdCBydnRfcXAgKnFwLCB1MzIgYnRoMCk7CiAKIHUzMiBoZmkxX21ha2VfZ3JoKHN0cnVjdCBoZmkxX2licG9ydCAqaWJwLCBzdHJ1Y3QgaWJfZ3JoICpoZHIsCiAJCSAgc3RydWN0IGliX2dsb2JhbF9yb3V0ZSAqZ3JoLCB1MzIgaHdvcmRzLCB1MzIgbndvcmRzKTsKIAotdm9pZCBoZmkxX21ha2VfcnVjX2hlYWRlcihzdHJ1Y3QgcnZ0X3FwICpxcCwgc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyAqb2hkciwKK3ZvaWQgaGZpMV9tYWtlX3J1Y19oZWFkZXIoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyLAogCQkJICB1MzIgYnRoMCwgdTMyIGJ0aDIsIGludCBtaWRkbGUsCiAJCQkgIHN0cnVjdCBoZmkxX3BrdF9zdGF0ZSAqcHMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS92ZXJic190eHJlcS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdmVyYnNfdHhyZXEuYwppbmRleCBkOGZiMDU2Li4wOTRhYjgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS92ZXJic190eHJlcS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3ZlcmJzX3R4cmVxLmMKQEAgLTEwOSw3ICsxMDksNyBAQAogCQkJcXAtPnNfZmxhZ3MgfD0gUlZUX1NfV0FJVF9UWDsKIAkJCWxpc3RfYWRkX3RhaWwoJnByaXYtPnNfaW93YWl0Lmxpc3QsICZkZXYtPnR4d2FpdCk7CiAJCQl0cmFjZV9oZmkxX3Fwc2xlZXAocXAsIFJWVF9TX1dBSVRfVFgpOwotCQkJYXRvbWljX2luYygmcXAtPnJlZmNvdW50KTsKKwkJCXJ2dF9nZXRfcXAocXApOwogCQl9CiAJCXFwLT5zX2ZsYWdzICY9IH5SVlRfU19CVVNZOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pNDBpdy9pNDBpdy5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3LmgKaW5kZXggYjczOGFjZC4uOGVjMDllNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3LmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3LmgKQEAgLTIzMiw3ICsyMzIsNyBAQAogCXN0cnVjdCBpNDBlX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCBpNDBpd19odyBodzsKIAlzdHJ1Y3QgaTQwaXdfY21fY29yZSBjbV9jb3JlOwotCXVuc2lnbmVkIGxvbmcgKm1lbV9yZXNvdXJjZXM7CisJdTggKm1lbV9yZXNvdXJjZXM7CiAJdW5zaWduZWQgbG9uZyAqYWxsb2NhdGVkX3FwczsKIAl1bnNpZ25lZCBsb25nICphbGxvY2F0ZWRfY3FzOwogCXVuc2lnbmVkIGxvbmcgKmFsbG9jYXRlZF9tcnM7CkBAIC00MzUsOCArNDM1LDggQEAKIAkqbmV4dCA9IHJlc291cmNlX251bSArIDE7CiAJaWYgKCpuZXh0ID09IG1heF9yZXNvdXJjZXMpCiAJCSpuZXh0ID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpd2Rldi0+cmVzb3VyY2VfbG9jaywgZmxhZ3MpOwogCSpyZXFfcmVzb3VyY2VfbnVtID0gcmVzb3VyY2VfbnVtOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJml3ZGV2LT5yZXNvdXJjZV9sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pNDBpdy9pNDBpd19jbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3X2NtLmMKaW5kZXggNTAyNmRjNy4uN2NhMDYzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3X2NtLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3X2NtLmMKQEAgLTUzNSw4ICs1MzUsOCBAQAogCQlidWYgKz0gaGRyX2xlbjsKIAl9CiAKLQlpZiAocGRfbGVuKQotCQltZW1jcHkoYnVmLCBwZGF0YS0+YWRkciwgcGRfbGVuKTsKKwlpZiAocGRhdGEgJiYgcGRhdGEtPmFkZHIpCisJCW1lbWNweShidWYsIHBkYXRhLT5hZGRyLCBwZGF0YS0+c2l6ZSk7CiAKIAlhdG9taWNfc2V0KCZzcWJ1Zi0+cmVmY291bnQsIDEpOwogCkBAIC0zMzQ3LDI2ICszMzQ3LDYgQEAKIH0KIAogLyoqCi0gKiBpNDBpd19sb29wYmFja19ub3AgLSBTZW5kIGEgbm9wCi0gKiBAcXA6IGFzc29jaWF0ZWQgaHcgcXAKLSAqLwotc3RhdGljIHZvaWQgaTQwaXdfbG9vcGJhY2tfbm9wKHN0cnVjdCBpNDBpd19zY19xcCAqcXApCi17Ci0JdTY0ICp3cWU7Ci0JdTY0IGhlYWRlcjsKLQotCXdxZSA9IHFwLT5xcF91ay5zcV9iYXNlLT5lbGVtOwotCXNldF82NGJpdF92YWwod3FlLCAwLCAwKTsKLQlzZXRfNjRiaXRfdmFsKHdxZSwgOCwgMCk7Ci0Jc2V0XzY0Yml0X3ZhbCh3cWUsIDE2LCAwKTsKLQotCWhlYWRlciA9IExTXzY0KEk0MElXUVBfT1BfTk9QLCBJNDBJV1FQU1FfT1BDT0RFKSB8Ci0JICAgIExTXzY0KDAsIEk0MElXUVBTUV9TSUdDT01QTCkgfAotCSAgICBMU182NChxcC0+cXBfdWsuc3dxZV9wb2xhcml0eSwgSTQwSVdRUFNRX1ZBTElEKTsKLQlzZXRfNjRiaXRfdmFsKHdxZSwgMjQsIGhlYWRlcik7Ci19Ci0KLS8qKgogICogaTQwaXdfcXBfZGlzY29ubmVjdCAtIGZyZWUgcXAgYW5kIGNsb3NlIGNtCiAgKiBAaXdxcDogYXNzb2NpYXRlIHFwIGZvciB0aGUgY29ubmVjdGlvbgogICovCkBAIC0zNjM4LDcgKzM2MTgsNyBAQAogCX0gZWxzZSB7CiAJCWlmIChpd3FwLT5wYWdlKQogCQkJaXdxcC0+c2NfcXAucXBfdWsuc3FfYmFzZSA9IGttYXAoaXdxcC0+cGFnZSk7Ci0JCWk0MGl3X2xvb3BiYWNrX25vcCgmaXdxcC0+c2NfcXApOworCQlkZXYtPml3X3ByaXZfcXBfb3BzLT5xcF9zZW5kX2xzbW0oJml3cXAtPnNjX3FwLCBOVUxMLCAwLCAwKTsKIAl9CiAKIAlpZiAoaXdxcC0+cGFnZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pNDBpdy9pNDBpd19ody5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3X2h3LmMKaW5kZXggM2VlMGNhZC4uMGM5MmE0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3X2h3LmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3X2h3LmMKQEAgLTI2NSw2ICsyNjUsNyBAQAogCQlpbmZvLmRvbnRfc2VuZF9maW4gPSBmYWxzZTsKIAlpZiAoaXdxcC0+c2NfcXAudGVybV9mbGFncyAmJiAoc3RhdGUgPT0gSTQwSVdfUVBfU1RBVEVfRVJST1IpKQogCQlpbmZvLnJlc2V0X3RjcF9jb25uID0gdHJ1ZTsKKwlpd3FwLT5od19pd2FycF9zdGF0ZSA9IHN0YXRlOwogCWk0MGl3X2h3X21vZGlmeV9xcChpd3FwLT5pd2RldiwgaXdxcCwgJmluZm8sIDApOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaTQwaXcvaTQwaXdfbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3X21haW4uYwppbmRleCA2ZTkwODEzLi40NDVlMjMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaTQwaXcvaTQwaXdfbWFpbi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pNDBpdy9pNDBpd19tYWluLmMKQEAgLTEwMCw3ICsxMDAsNyBAQAogCS5ub3RpZmllcl9jYWxsID0gaTQwaXdfbmV0X2V2ZW50CiB9OwogCi1zdGF0aWMgaW50IGk0MGl3X25vdGlmaWVyc19yZWdpc3RlcmVkOworc3RhdGljIGF0b21pY190IGk0MGl3X25vdGlmaWVyc19yZWdpc3RlcmVkOwogCiAvKioKICAqIGk0MGl3X2ZpbmRfaTQwZV9oYW5kbGVyIC0gZmluZCBhIGhhbmRsZXIgZ2l2ZW4gYSBjbGllbnQgaW5mbwpAQCAtMTM0MiwxMiArMTM0MiwxMSBAQAogICovCiBzdGF0aWMgdm9pZCBpNDBpd19yZWdpc3Rlcl9ub3RpZmllcnModm9pZCkKIHsKLQlpZiAoIWk0MGl3X25vdGlmaWVyc19yZWdpc3RlcmVkKSB7CisJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZpNDBpd19ub3RpZmllcnNfcmVnaXN0ZXJlZCkgPT0gMSkgewogCQlyZWdpc3Rlcl9pbmV0YWRkcl9ub3RpZmllcigmaTQwaXdfaW5ldGFkZHJfbm90aWZpZXIpOwogCQlyZWdpc3Rlcl9pbmV0NmFkZHJfbm90aWZpZXIoJmk0MGl3X2luZXRhZGRyNl9ub3RpZmllcik7CiAJCXJlZ2lzdGVyX25ldGV2ZW50X25vdGlmaWVyKCZpNDBpd19uZXRfbm90aWZpZXIpOwogCX0KLQlpNDBpd19ub3RpZmllcnNfcmVnaXN0ZXJlZCsrOwogfQogCiAvKioKQEAgLTE0MjksOCArMTQyOCw3IEBACiAJCQlpNDBpd19kZWxfbWFjaXBfZW50cnkoaXdkZXYsICh1OClpd2Rldi0+bWFjX2lwX3RhYmxlX2lkeCk7CiAJCS8qIGZhbGx0aHJvdWdoICovCiAJY2FzZSBJTkVUX05PVElGSUVSOgotCQlpZiAoaTQwaXdfbm90aWZpZXJzX3JlZ2lzdGVyZWQgPiAwKSB7Ci0JCQlpNDBpd19ub3RpZmllcnNfcmVnaXN0ZXJlZC0tOworCQlpZiAoIWF0b21pY19kZWNfcmV0dXJuKCZpNDBpd19ub3RpZmllcnNfcmVnaXN0ZXJlZCkpIHsKIAkJCXVucmVnaXN0ZXJfbmV0ZXZlbnRfbm90aWZpZXIoJmk0MGl3X25ldF9ub3RpZmllcik7CiAJCQl1bnJlZ2lzdGVyX2luZXRhZGRyX25vdGlmaWVyKCZpNDBpd19pbmV0YWRkcl9ub3RpZmllcik7CiAJCQl1bnJlZ2lzdGVyX2luZXQ2YWRkcl9ub3RpZmllcigmaTQwaXdfaW5ldGFkZHI2X25vdGlmaWVyKTsKQEAgLTE1NTgsNiArMTU1NiwxMCBAQAogCWVudW0gaTQwaXdfc3RhdHVzX2NvZGUgc3RhdHVzOwogCXN0cnVjdCBpNDBpd19oYW5kbGVyICpoZGw7CiAKKwloZGwgPSBpNDBpd19maW5kX25ldGRldihsZGV2LT5uZXRkZXYpOworCWlmIChoZGwpCisJCXJldHVybiAwOworCiAJaGRsID0ga3phbGxvYyhzaXplb2YoKmhkbCksIEdGUF9LRVJORUwpOwogCWlmICghaGRsKQogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pNDBpdy9pNDBpd191dGlscy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3X3V0aWxzLmMKaW5kZXggMGU4ZGIwYS4uNmZkMDQzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3X3V0aWxzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3X3V0aWxzLmMKQEAgLTY3Myw4ICs2NzMsMTEgQEAKIHsKIAlpZiAoIW1lbSkKIAkJcmV0dXJuIEk0MElXX0VSUl9QQVJBTTsKKwkvKgorCSAqIG1lbS0+dmEgcG9pbnRzIHRvIHRoZSBwYXJlbnQgb2YgbWVtLCBzbyBib3RoIG1lbSBhbmQgbWVtLT52YQorCSAqIGNhbiBub3QgYmUgdG91Y2hlZCBvbmNlIG1lbS0+dmEgaXMgZnJlZWQKKwkgKi8KIAlrZnJlZShtZW0tPnZhKTsKLQltZW0tPnZhID0gTlVMTDsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3X3ZlcmJzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaTQwaXcvaTQwaXdfdmVyYnMuYwppbmRleCAyMzYwMzM4Li42MzI5Yzk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaTQwaXcvaTQwaXdfdmVyYnMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaTQwaXcvaTQwaXdfdmVyYnMuYwpAQCAtNzk0LDcgKzc5NCw2IEBACiAJcmV0dXJuICZpd3FwLT5pYnFwOwogZXJyb3I6CiAJaTQwaXdfZnJlZV9xcF9yZXNvdXJjZXMoaXdkZXYsIGl3cXAsIHFwX251bSk7Ci0Ja2ZyZWUobWVtKTsKIAlyZXR1cm4gRVJSX1BUUihlcnJfY29kZSk7CiB9CiAKQEAgLTE5MjYsOCArMTkyNSw3IEBACiAJCX0KIAkJaWYgKGl3cGJsLT5wYmxfYWxsb2NhdGVkKQogCQkJaTQwaXdfZnJlZV9wYmxlKGl3ZGV2LT5wYmxlX3JzcmMsIHBhbGxvYyk7Ci0JCWtmcmVlKGl3cGJsLT5pd21yKTsKLQkJaXdwYmwtPml3bXIgPSBOVUxMOworCQlrZnJlZShpd21yKTsKIAkJcmV0dXJuIDA7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9jcS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvY3EuYwppbmRleCBkNmZjOGE2Li41ZGY2M2RhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9jcS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L2NxLmMKQEAgLTU3Niw4ICs1NzYsOCBAQAogCQljaGVja3N1bSA9PSBjcHVfdG9fYmUxNigweGZmZmYpOwogfQogCi1zdGF0aWMgaW50IHVzZV90dW5uZWxfZGF0YShzdHJ1Y3QgbWx4NF9pYl9xcCAqcXAsIHN0cnVjdCBtbHg0X2liX2NxICpjcSwgc3RydWN0IGliX3djICp3YywKLQkJCSAgIHVuc2lnbmVkIHRhaWwsIHN0cnVjdCBtbHg0X2NxZSAqY3FlLCBpbnQgaXNfZXRoKQorc3RhdGljIHZvaWQgdXNlX3R1bm5lbF9kYXRhKHN0cnVjdCBtbHg0X2liX3FwICpxcCwgc3RydWN0IG1seDRfaWJfY3EgKmNxLCBzdHJ1Y3QgaWJfd2MgKndjLAorCQkJICAgIHVuc2lnbmVkIHRhaWwsIHN0cnVjdCBtbHg0X2NxZSAqY3FlLCBpbnQgaXNfZXRoKQogewogCXN0cnVjdCBtbHg0X2liX3Byb3h5X3NxcF9oZHIgKmhkcjsKIApAQCAtNjAwLDggKzYwMCw2IEBACiAJCXdjLT5zbGlkICAgICAgICA9IGJlMTZfdG9fY3B1KGhkci0+dHVuLnNsaWRfbWFjXzQ3XzMyKTsKIAkJd2MtPnNsICAgICAgICAgID0gKHU4KSAoYmUxNl90b19jcHUoaGRyLT50dW4uc2xfdmlkKSA+PiAxMik7CiAJfQotCi0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIG1seDRfaWJfcXBfc3dfY29tcChzdHJ1Y3QgbWx4NF9pYl9xcCAqcXAsIGludCBudW1fZW50cmllcywKQEAgLTY4OSwxMiArNjg3LDYgQEAKIAlpc19lcnJvciA9IChjcWUtPm93bmVyX3NyX29wY29kZSAmIE1MWDRfQ1FFX09QQ09ERV9NQVNLKSA9PQogCQlNTFg0X0NRRV9PUENPREVfRVJST1I7CiAKLQlpZiAodW5saWtlbHkoKGNxZS0+b3duZXJfc3Jfb3Bjb2RlICYgTUxYNF9DUUVfT1BDT0RFX01BU0spID09IE1MWDRfT1BDT0RFX05PUCAmJgotCQkgICAgIGlzX3NlbmQpKSB7Ci0JCXByX3dhcm4oIkNvbXBsZXRpb24gZm9yIE5PUCBvcGNvZGUgZGV0ZWN0ZWQhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJLyogUmVzaXplIENRIGluIHByb2dyZXNzICovCiAJaWYgKHVubGlrZWx5KChjcWUtPm93bmVyX3NyX29wY29kZSAmIE1MWDRfQ1FFX09QQ09ERV9NQVNLKSA9PSBNTFg0X0NRRV9PUENPREVfUkVTSVpFKSkgewogCQlpZiAoY3EtPnJlc2l6ZV9idWYpIHsKQEAgLTcyMCwxMiArNzEyLDYgQEAKIAkJICovCiAJCW1xcCA9IF9fbWx4NF9xcF9sb29rdXAodG9fbWRldihjcS0+aWJjcS5kZXZpY2UpLT5kZXYsCiAJCQkJICAgICAgIGJlMzJfdG9fY3B1KGNxZS0+dmxhbl9teV9xcG4pKTsKLQkJaWYgKHVubGlrZWx5KCFtcXApKSB7Ci0JCQlwcl93YXJuKCJDUSAlMDZ4IHdpdGggZW50cnkgZm9yIHVua25vd24gUVBOICUwNnhcbiIsCi0JCQkgICAgICAgY3EtPm1jcS5jcW4sIGJlMzJfdG9fY3B1KGNxZS0+dmxhbl9teV9xcG4pICYgTUxYNF9DUUVfUVBOX01BU0spOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQogCQkqY3VyX3FwID0gdG9fbWlicXAobXFwKTsKIAl9CiAKQEAgLTczOCwxMSArNzI0LDYgQEAKIAkJLyogU1JRIGlzIGFsc28gaW4gdGhlIHJhZGl4IHRyZWUgKi8KIAkJbXNycSA9IG1seDRfc3JxX2xvb2t1cCh0b19tZGV2KGNxLT5pYmNxLmRldmljZSktPmRldiwKIAkJCQkgICAgICAgc3JxX251bSk7Ci0JCWlmICh1bmxpa2VseSghbXNycSkpIHsKLQkJCXByX3dhcm4oIkNRICUwNnggd2l0aCBlbnRyeSBmb3IgdW5rbm93biBTUlFOICUwNnhcbiIsCi0JCQkJY3EtPm1jcS5jcW4sIHNycV9udW0pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KIAl9CiAKIAlpZiAoaXNfc2VuZCkgewpAQCAtODUyLDkgKzgzMywxMSBAQAogCQlpZiAobWx4NF9pc19tZnVuYyh0b19tZGV2KGNxLT5pYmNxLmRldmljZSktPmRldikpIHsKIAkJCWlmICgoKmN1cl9xcCktPm1seDRfaWJfcXBfdHlwZSAmCiAJCQkgICAgKE1MWDRfSUJfUVBUX1BST1hZX1NNSV9PV05FUiB8Ci0JCQkgICAgIE1MWDRfSUJfUVBUX1BST1hZX1NNSSB8IE1MWDRfSUJfUVBUX1BST1hZX0dTSSkpCi0JCQkJcmV0dXJuIHVzZV90dW5uZWxfZGF0YSgqY3VyX3FwLCBjcSwgd2MsIHRhaWwsCi0JCQkJCQkgICAgICAgY3FlLCBpc19ldGgpOworCQkJICAgICBNTFg0X0lCX1FQVF9QUk9YWV9TTUkgfCBNTFg0X0lCX1FQVF9QUk9YWV9HU0kpKSB7CisJCQkJdXNlX3R1bm5lbF9kYXRhKCpjdXJfcXAsIGNxLCB3YywgdGFpbCwgY3FlLAorCQkJCQkJaXNfZXRoKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KIAkJfQogCiAJCXdjLT5zbGlkCSAgID0gYmUxNl90b19jcHUoY3FlLT5ybGlkKTsKQEAgLTg5MSw3ICs4NzQsNiBAQAogCXN0cnVjdCBtbHg0X2liX3FwICpjdXJfcXAgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IG5wb2xsZWQ7Ci0JaW50IGVyciA9IDA7CiAJc3RydWN0IG1seDRfaWJfZGV2ICptZGV2ID0gdG9fbWRldihjcS0+aWJjcS5kZXZpY2UpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNxLT5sb2NrLCBmbGFncyk7CkBAIC05MDEsOCArODgzLDcgQEAKIAl9CiAKIAlmb3IgKG5wb2xsZWQgPSAwOyBucG9sbGVkIDwgbnVtX2VudHJpZXM7ICsrbnBvbGxlZCkgewotCQllcnIgPSBtbHg0X2liX3BvbGxfb25lKGNxLCAmY3VyX3FwLCB3YyArIG5wb2xsZWQpOwotCQlpZiAoZXJyKQorCQlpZiAobWx4NF9pYl9wb2xsX29uZShjcSwgJmN1cl9xcCwgd2MgKyBucG9sbGVkKSkKIAkJCWJyZWFrOwogCX0KIApAQCAtOTExLDEwICs4OTIsNyBAQAogb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNxLT5sb2NrLCBmbGFncyk7CiAKLQlpZiAoZXJyID09IDAgfHwgZXJyID09IC1FQUdBSU4pCi0JCXJldHVybiBucG9sbGVkOwotCWVsc2UKLQkJcmV0dXJuIGVycjsKKwlyZXR1cm4gbnBvbGxlZDsKIH0KIAogaW50IG1seDRfaWJfYXJtX2NxKHN0cnVjdCBpYl9jcSAqaWJjcSwgZW51bSBpYl9jcV9ub3RpZnlfZmxhZ3MgZmxhZ3MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tYWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21hZC5jCmluZGV4IDljMmU1M2QuLjBmMjFjM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21hZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21hZC5jCkBAIC0xMTI4LDYgKzExMjgsMjcgQEAKIAogCQkvKiBHZW5lcmF0ZSBHVUlEIGNoYW5nZWQgZXZlbnQgKi8KIAkJaWYgKGNoYW5nZWRfYXR0ciAmIE1MWDRfRVFfUE9SVF9JTkZPX0dJRF9QRlhfQ0hBTkdFX01BU0spIHsKKwkJCWlmIChtbHg0X2lzX21hc3RlcihkZXYtPmRldikpIHsKKwkJCQl1bmlvbiBpYl9naWQgZ2lkOworCQkJCWludCBlcnIgPSAwOworCisJCQkJaWYgKCFlcWUtPmV2ZW50LnBvcnRfbWdtdF9jaGFuZ2UucGFyYW1zLnBvcnRfaW5mby5naWRfcHJlZml4KQorCQkJCQllcnIgPSBfX21seDRfaWJfcXVlcnlfZ2lkKCZkZXYtPmliX2RldiwgcG9ydCwgMCwgJmdpZCwgMSk7CisJCQkJZWxzZQorCQkJCQlnaWQuZ2xvYmFsLnN1Ym5ldF9wcmVmaXggPQorCQkJCQkJZXFlLT5ldmVudC5wb3J0X21nbXRfY2hhbmdlLnBhcmFtcy5wb3J0X2luZm8uZ2lkX3ByZWZpeDsKKwkJCQlpZiAoZXJyKSB7CisJCQkJCXByX3dhcm4oIkNvdWxkIG5vdCBjaGFuZ2UgUVAxIHN1Ym5ldCBwcmVmaXggZm9yIHBvcnQgJWQ6IHF1ZXJ5X2dpZCBlcnJvciAoJWQpXG4iLAorCQkJCQkJcG9ydCwgZXJyKTsKKwkJCQl9IGVsc2UgeworCQkJCQlwcl9kZWJ1ZygiQ2hhbmdpbmcgUVAxIHN1Ym5ldCBwcmVmaXggZm9yIHBvcnQgJWQuIG9sZD0weCVsbHguIG5ldz0weCVsbHhcbiIsCisJCQkJCQkgcG9ydCwKKwkJCQkJCSAodTY0KWF0b21pYzY0X3JlYWQoJmRldi0+c3Jpb3YuZGVtdXhbcG9ydCAtIDFdLnN1Ym5ldF9wcmVmaXgpLAorCQkJCQkJIGJlNjRfdG9fY3B1KGdpZC5nbG9iYWwuc3VibmV0X3ByZWZpeCkpOworCQkJCQlhdG9taWM2NF9zZXQoJmRldi0+c3Jpb3YuZGVtdXhbcG9ydCAtIDFdLnN1Ym5ldF9wcmVmaXgsCisJCQkJCQkgICAgIGJlNjRfdG9fY3B1KGdpZC5nbG9iYWwuc3VibmV0X3ByZWZpeCkpOworCQkJCX0KKwkJCX0KIAkJCW1seDRfaWJfZGlzcGF0Y2hfZXZlbnQoZGV2LCBwb3J0LCBJQl9FVkVOVF9HSURfQ0hBTkdFKTsKIAkJCS8qaWYgbWFzdGVyLCBub3RpZnkgYWxsIHNsYXZlcyovCiAJCQlpZiAobWx4NF9pc19tYXN0ZXIoZGV2LT5kZXYpKQpAQCAtMjIwMiw2ICsyMjIzLDggQEAKIAkJaWYgKGVycikKIAkJCWdvdG8gZGVtdXhfZXJyOwogCQlkZXYtPnNyaW92LmRlbXV4W2ldLmd1aWRfY2FjaGVbMF0gPSBnaWQuZ2xvYmFsLmludGVyZmFjZV9pZDsKKwkJYXRvbWljNjRfc2V0KCZkZXYtPnNyaW92LmRlbXV4W2ldLnN1Ym5ldF9wcmVmaXgsCisJCQkgICAgIGJlNjRfdG9fY3B1KGdpZC5nbG9iYWwuc3VibmV0X3ByZWZpeCkpOwogCQllcnIgPSBhbGxvY19wdl9vYmplY3QoZGV2LCBtbHg0X21hc3Rlcl9mdW5jX251bShkZXYtPmRldiksIGkgKyAxLAogCQkJCSAgICAgICZkZXYtPnNyaW92LnNxcHNbaV0pOwogCQlpZiAoZXJyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWFpbi5jCmluZGV4IDJhZjQ0YzIuLjg3YmE5YmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21haW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tYWluLmMKQEAgLTIyMDIsNiArMjIwMiw5IEBACiAJYm9vbCBwZXJfcG9ydCA9ICEhKGliZGV2LT5kZXYtPmNhcHMuZmxhZ3MyICYKIAkJTUxYNF9ERVZfQ0FQX0ZMQUcyX0RJQUdfUEVSX1BPUlQpOwogCisJaWYgKG1seDRfaXNfc2xhdmUoaWJkZXYtPmRldikpCisJCXJldHVybiAwOworCiAJZm9yIChpID0gMDsgaSA8IE1MWDRfRElBR19DT1VOVEVSU19UWVBFUzsgaSsrKSB7CiAJCS8qIGkgPT0gMSBtZWFucyB3ZSBhcmUgYnVpbGRpbmcgcG9ydCBjb3VudGVycyAqLwogCQlpZiAoaSAmJiAhcGVyX3BvcnQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tY2cuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21jZy5jCmluZGV4IDhmN2FkMDcuLjA5N2JmY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21jZy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21jZy5jCkBAIC00ODksNyArNDg5LDcgQEAKIAkJaWYgKCFncm91cC0+bWVtYmVyc1tpXSkKIAkJCWxlYXZlX3N0YXRlIHw9ICgxIDw8IGkpOwogCi0JcmV0dXJuIGxlYXZlX3N0YXRlICYgKGdyb3VwLT5yZWMuc2NvcGVfam9pbl9zdGF0ZSAmIDcpOworCXJldHVybiBsZWF2ZV9zdGF0ZSAmIChncm91cC0+cmVjLnNjb3BlX2pvaW5fc3RhdGUgJiAweGYpOwogfQogCiBzdGF0aWMgaW50IGpvaW5fZ3JvdXAoc3RydWN0IG1jYXN0X2dyb3VwICpncm91cCwgaW50IHNsYXZlLCB1OCBqb2luX21hc2spCkBAIC01NjQsOCArNTY0LDggQEAKIAkJfSBlbHNlCiAJCQltY2dfd2Fybl9ncm91cChncm91cCwgIkRSSVZFUiBCVUdcbiIpOwogCX0gZWxzZSBpZiAoZ3JvdXAtPnN0YXRlID09IE1DQVNUX0xFQVZFX1NFTlQpIHsKLQkJaWYgKGdyb3VwLT5yZWMuc2NvcGVfam9pbl9zdGF0ZSAmIDcpCi0JCQlncm91cC0+cmVjLnNjb3BlX2pvaW5fc3RhdGUgJj0gMHhmODsKKwkJaWYgKGdyb3VwLT5yZWMuc2NvcGVfam9pbl9zdGF0ZSAmIDB4ZikKKwkJCWdyb3VwLT5yZWMuc2NvcGVfam9pbl9zdGF0ZSAmPSAweGYwOwogCQlncm91cC0+c3RhdGUgPSBNQ0FTVF9JRExFOwogCQltdXRleF91bmxvY2soJmdyb3VwLT5sb2NrKTsKIAkJaWYgKHJlbGVhc2VfZ3JvdXAoZ3JvdXAsIDEpKQpAQCAtNjA1LDcgKzYwNSw3IEBACiBzdGF0aWMgaW50IGhhbmRsZV9qb2luX3JlcShzdHJ1Y3QgbWNhc3RfZ3JvdXAgKmdyb3VwLCB1OCBqb2luX21hc2ssCiAJCQkgICBzdHJ1Y3QgbWNhc3RfcmVxICpyZXEpCiB7Ci0JdTggZ3JvdXBfam9pbl9zdGF0ZSA9IGdyb3VwLT5yZWMuc2NvcGVfam9pbl9zdGF0ZSAmIDc7CisJdTggZ3JvdXBfam9pbl9zdGF0ZSA9IGdyb3VwLT5yZWMuc2NvcGVfam9pbl9zdGF0ZSAmIDB4ZjsKIAlpbnQgcmVmID0gMDsKIAl1MTYgc3RhdHVzOwogCXN0cnVjdCBpYl9zYV9tY21lbWJlcl9kYXRhICpzYV9kYXRhID0gKHN0cnVjdCBpYl9zYV9tY21lbWJlcl9kYXRhICopcmVxLT5zYV9tYWQuZGF0YTsKQEAgLTY5MCw4ICs2OTAsOCBAQAogCQkJdTggY3VyX2pvaW5fc3RhdGU7CiAKIAkJCXJlc3Bfam9pbl9zdGF0ZSA9ICgoc3RydWN0IGliX3NhX21jbWVtYmVyX2RhdGEgKikKLQkJCQkJCWdyb3VwLT5yZXNwb25zZV9zYV9tYWQuZGF0YSktPnNjb3BlX2pvaW5fc3RhdGUgJiA3OwotCQkJY3VyX2pvaW5fc3RhdGUgPSBncm91cC0+cmVjLnNjb3BlX2pvaW5fc3RhdGUgJiA3OworCQkJCQkJZ3JvdXAtPnJlc3BvbnNlX3NhX21hZC5kYXRhKS0+c2NvcGVfam9pbl9zdGF0ZSAmIDB4ZjsKKwkJCWN1cl9qb2luX3N0YXRlID0gZ3JvdXAtPnJlYy5zY29wZV9qb2luX3N0YXRlICYgMHhmOwogCiAJCQlpZiAobWV0aG9kID09IElCX01HTVRfTUVUSE9EX0dFVF9SRVNQKSB7CiAJCQkJLyogc3VjY2Vzc2Z1bGwgam9pbiAqLwpAQCAtNzEwLDcgKzcxMCw3IEBACiAJCXJlcSA9IGxpc3RfZmlyc3RfZW50cnkoJmdyb3VwLT5wZW5kaW5nX2xpc3QsIHN0cnVjdCBtY2FzdF9yZXEsCiAJCQkJICAgICAgIGdyb3VwX2xpc3QpOwogCQlzYV9kYXRhID0gKHN0cnVjdCBpYl9zYV9tY21lbWJlcl9kYXRhICopcmVxLT5zYV9tYWQuZGF0YTsKLQkJcmVxX2pvaW5fc3RhdGUgPSBzYV9kYXRhLT5zY29wZV9qb2luX3N0YXRlICYgMHg3OworCQlyZXFfam9pbl9zdGF0ZSA9IHNhX2RhdGEtPnNjb3BlX2pvaW5fc3RhdGUgJiAweGY7CiAKIAkJLyogRm9yIGEgbGVhdmUgcmVxdWVzdCwgd2Ugd2lsbCBpbW1lZGlhdGVseSBhbnN3ZXIgdGhlIFZGLCBhbmQKIAkJICogdXBkYXRlIG91ciBpbnRlcm5hbCBjb3VudGVycy4gVGhlIGFjdHVhbCBsZWF2ZSB3aWxsIGJlIHNlbnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21seDRfaWIuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21seDRfaWIuaAppbmRleCA3YzU4MzJlLi42ODZhYjQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tbHg0X2liLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWx4NF9pYi5oCkBAIC00NDgsNyArNDQ4LDcgQEAKIAlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7CiAJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnVkX3dxOwogCXNwaW5sb2NrX3QgdWRfbG9jazsKLQlfX2JlNjQgc3VibmV0X3ByZWZpeDsKKwlhdG9taWM2NF90IHN1Ym5ldF9wcmVmaXg7CiAJX19iZTY0IGd1aWRfY2FjaGVbMTI4XTsKIAlzdHJ1Y3QgbWx4NF9pYl9kZXYgKmRldjsKIAkvKiB0aGUgZm9sbG93aW5nIGxvY2sgcHJvdGVjdHMgYm90aCBtY2dfdGFibGUgYW5kIG1jZ19tZ2lkMF9saXN0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9xcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvcXAuYwppbmRleCA3NjgwODVmLi43ZmI5NjI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9xcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L3FwLmMKQEAgLTI0OTMsMjQgKzI0OTMsMjcgQEAKIAkJc3FwLT51ZF9oZWFkZXIuZ3JoLmZsb3dfbGFiZWwgICAgPQogCQkJYWgtPmF2LmliLnNsX3RjbGFzc19mbG93bGFiZWwgJiBjcHVfdG9fYmUzMigweGZmZmZmKTsKIAkJc3FwLT51ZF9oZWFkZXIuZ3JoLmhvcF9saW1pdCAgICAgPSBhaC0+YXYuaWIuaG9wX2xpbWl0OwotCQlpZiAoaXNfZXRoKQorCQlpZiAoaXNfZXRoKSB7CiAJCQltZW1jcHkoc3FwLT51ZF9oZWFkZXIuZ3JoLnNvdXJjZV9naWQucmF3LCBzZ2lkLnJhdywgMTYpOwotCQllbHNlIHsKLQkJaWYgKG1seDRfaXNfbWZ1bmModG9fbWRldihpYl9kZXYpLT5kZXYpKSB7Ci0JCQkvKiBXaGVuIG11bHRpLWZ1bmN0aW9uIGlzIGVuYWJsZWQsIHRoZSBpYl9jb3JlIGdpZAotCQkJICogaW5kZXhlcyBkb24ndCBuZWNlc3NhcmlseSBtYXRjaCB0aGUgaHcgb25lcywgc28KLQkJCSAqIHdlIG11c3QgdXNlIG91ciBvd24gY2FjaGUgKi8KLQkJCXNxcC0+dWRfaGVhZGVyLmdyaC5zb3VyY2VfZ2lkLmdsb2JhbC5zdWJuZXRfcHJlZml4ID0KLQkJCQl0b19tZGV2KGliX2RldiktPnNyaW92LmRlbXV4W3NxcC0+cXAucG9ydCAtIDFdLgotCQkJCQkJICAgICAgIHN1Ym5ldF9wcmVmaXg7Ci0JCQlzcXAtPnVkX2hlYWRlci5ncmguc291cmNlX2dpZC5nbG9iYWwuaW50ZXJmYWNlX2lkID0KLQkJCQl0b19tZGV2KGliX2RldiktPnNyaW92LmRlbXV4W3NxcC0+cXAucG9ydCAtIDFdLgotCQkJCQkgICAgICAgZ3VpZF9jYWNoZVthaC0+YXYuaWIuZ2lkX2luZGV4XTsKLQkJfSBlbHNlCi0JCQlpYl9nZXRfY2FjaGVkX2dpZChpYl9kZXYsCi0JCQkJCSAgYmUzMl90b19jcHUoYWgtPmF2LmliLnBvcnRfcGQpID4+IDI0LAotCQkJCQkgIGFoLT5hdi5pYi5naWRfaW5kZXgsCi0JCQkJCSAgJnNxcC0+dWRfaGVhZGVyLmdyaC5zb3VyY2VfZ2lkLCBOVUxMKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChtbHg0X2lzX21mdW5jKHRvX21kZXYoaWJfZGV2KS0+ZGV2KSkgeworCQkJCS8qIFdoZW4gbXVsdGktZnVuY3Rpb24gaXMgZW5hYmxlZCwgdGhlIGliX2NvcmUgZ2lkCisJCQkJICogaW5kZXhlcyBkb24ndCBuZWNlc3NhcmlseSBtYXRjaCB0aGUgaHcgb25lcywgc28KKwkJCQkgKiB3ZSBtdXN0IHVzZSBvdXIgb3duIGNhY2hlCisJCQkJICovCisJCQkJc3FwLT51ZF9oZWFkZXIuZ3JoLnNvdXJjZV9naWQuZ2xvYmFsLnN1Ym5ldF9wcmVmaXggPQorCQkJCQljcHVfdG9fYmU2NChhdG9taWM2NF9yZWFkKCYodG9fbWRldihpYl9kZXYpLT5zcmlvdi4KKwkJCQkJCQkJICAgIGRlbXV4W3NxcC0+cXAucG9ydCAtIDFdLgorCQkJCQkJCQkgICAgc3VibmV0X3ByZWZpeCkpKTsKKwkJCQlzcXAtPnVkX2hlYWRlci5ncmguc291cmNlX2dpZC5nbG9iYWwuaW50ZXJmYWNlX2lkID0KKwkJCQkJdG9fbWRldihpYl9kZXYpLT5zcmlvdi5kZW11eFtzcXAtPnFwLnBvcnQgLSAxXS4KKwkJCQkJCSAgICAgICBndWlkX2NhY2hlW2FoLT5hdi5pYi5naWRfaW5kZXhdOworCQkJfSBlbHNlIHsKKwkJCQlpYl9nZXRfY2FjaGVkX2dpZChpYl9kZXYsCisJCQkJCQkgIGJlMzJfdG9fY3B1KGFoLT5hdi5pYi5wb3J0X3BkKSA+PiAyNCwKKwkJCQkJCSAgYWgtPmF2LmliLmdpZF9pbmRleCwKKwkJCQkJCSAgJnNxcC0+dWRfaGVhZGVyLmdyaC5zb3VyY2VfZ2lkLCBOVUxMKTsKKwkJCX0KIAkJfQogCQltZW1jcHkoc3FwLT51ZF9oZWFkZXIuZ3JoLmRlc3RpbmF0aW9uX2dpZC5yYXcsCiAJCSAgICAgICBhaC0+YXYuaWIuZGdpZCwgMTYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvY3EuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L2NxLmMKaW5kZXggMzA4YTM1OC4uNWRlOWE2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvY3EuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9jcS5jCkBAIC01NTMsMTIgKzU1Myw2IEBACiAJCSAqIGZyb20gdGhlIHRhYmxlLgogCQkgKi8KIAkJbXFwID0gX19tbHg1X3FwX2xvb2t1cChkZXYtPm1kZXYsIHFwbik7Ci0JCWlmICh1bmxpa2VseSghbXFwKSkgewotCQkJbWx4NV9pYl93YXJuKGRldiwgIkNRRUBDUSAlMDZ4IGZvciB1bmtub3duIFFQTiAlNnhcbiIsCi0JCQkJICAgICBjcS0+bWNxLmNxbiwgcXBuKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KIAkJKmN1cl9xcCA9IHRvX21pYnFwKG1xcCk7CiAJfQogCkBAIC02MTksMTMgKzYxMyw2IEBACiAJCXJlYWRfbG9jaygmZGV2LT5tZGV2LT5wcml2Lm1rZXlfdGFibGUubG9jayk7CiAJCW1ta2V5ID0gX19tbHg1X21yX2xvb2t1cChkZXYtPm1kZXYsCiAJCQkJCSBtbHg1X2Jhc2VfbWtleShiZTMyX3RvX2NwdShzaWdfZXJyX2NxZS0+bWtleSkpKTsKLQkJaWYgKHVubGlrZWx5KCFtbWtleSkpIHsKLQkJCXJlYWRfdW5sb2NrKCZkZXYtPm1kZXYtPnByaXYubWtleV90YWJsZS5sb2NrKTsKLQkJCW1seDVfaWJfd2FybihkZXYsICJDUUVAQ1EgJTA2eCBmb3IgdW5rbm93biBNUiAlNnhcbiIsCi0JCQkJICAgICBjcS0+bWNxLmNxbiwgYmUzMl90b19jcHUoc2lnX2Vycl9jcWUtPm1rZXkpKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KIAkJbXIgPSB0b19taWJtcihtbWtleSk7CiAJCWdldF9zaWdfZXJyX2l0ZW0oc2lnX2Vycl9jcWUsICZtci0+c2lnLT5lcnJfaXRlbSk7CiAJCW1yLT5zaWctPnNpZ19lcnJfZXhpc3RzID0gdHJ1ZTsKQEAgLTY3Niw3ICs2NjMsNiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHNvZnRfcG9sbGVkID0gMDsKIAlpbnQgbnBvbGxlZDsKLQlpbnQgZXJyID0gMDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjcS0+bG9jaywgZmxhZ3MpOwogCWlmIChtZGV2LT5zdGF0ZSA9PSBNTFg1X0RFVklDRV9TVEFURV9JTlRFUk5BTF9FUlJPUikgewpAQCAtNjg4LDggKzY3NCw3IEBACiAJCXNvZnRfcG9sbGVkID0gcG9sbF9zb2Z0X3djKGNxLCBudW1fZW50cmllcywgd2MpOwogCiAJZm9yIChucG9sbGVkID0gMDsgbnBvbGxlZCA8IG51bV9lbnRyaWVzIC0gc29mdF9wb2xsZWQ7IG5wb2xsZWQrKykgewotCQllcnIgPSBtbHg1X3BvbGxfb25lKGNxLCAmY3VyX3FwLCB3YyArIHNvZnRfcG9sbGVkICsgbnBvbGxlZCk7Ci0JCWlmIChlcnIpCisJCWlmIChtbHg1X3BvbGxfb25lKGNxLCAmY3VyX3FwLCB3YyArIHNvZnRfcG9sbGVkICsgbnBvbGxlZCkpCiAJCQlicmVhazsKIAl9CiAKQEAgLTY5OCwxMCArNjgzLDcgQEAKIG91dDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcS0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKGVyciA9PSAwIHx8IGVyciA9PSAtRUFHQUlOKQotCQlyZXR1cm4gc29mdF9wb2xsZWQgKyBucG9sbGVkOwotCWVsc2UKLQkJcmV0dXJuIGVycjsKKwlyZXR1cm4gc29mdF9wb2xsZWQgKyBucG9sbGVkOwogfQogCiBpbnQgbWx4NV9pYl9hcm1fY3Eoc3RydWN0IGliX2NxICppYmNxLCBlbnVtIGliX2NxX25vdGlmeV9mbGFncyBmbGFncykKQEAgLTc0NywxNCArNzI5LDE2IEBACiAKIHN0YXRpYyBpbnQgY3JlYXRlX2NxX3VzZXIoc3RydWN0IG1seDVfaWJfZGV2ICpkZXYsIHN0cnVjdCBpYl91ZGF0YSAqdWRhdGEsCiAJCQkgIHN0cnVjdCBpYl91Y29udGV4dCAqY29udGV4dCwgc3RydWN0IG1seDVfaWJfY3EgKmNxLAotCQkJICBpbnQgZW50cmllcywgc3RydWN0IG1seDVfY3JlYXRlX2NxX21ib3hfaW4gKipjcWIsCisJCQkgIGludCBlbnRyaWVzLCB1MzIgKipjcWIsCiAJCQkgIGludCAqY3FlX3NpemUsIGludCAqaW5kZXgsIGludCAqaW5sZW4pCiB7CiAJc3RydWN0IG1seDVfaWJfY3JlYXRlX2NxIHVjbWQ7CiAJc2l6ZV90IHVjbWRsZW47CiAJaW50IHBhZ2Vfc2hpZnQ7CisJX19iZTY0ICpwYXM7CiAJaW50IG5wYWdlczsKIAlpbnQgbmNvbnQ7CisJdm9pZCAqY3FjOwogCWludCBlcnI7CiAKIAl1Y21kbGVuID0KQEAgLTc5MiwxNCArNzc2LDIwIEBACiAJbWx4NV9pYl9kYmcoZGV2LCAiYWRkciAweCVsbHgsIHNpemUgJXUsIG5wYWdlcyAlZCwgcGFnZV9zaGlmdCAlZCwgbmNvbnQgJWRcbiIsCiAJCSAgICB1Y21kLmJ1Zl9hZGRyLCBlbnRyaWVzICogdWNtZC5jcWVfc2l6ZSwgbnBhZ2VzLCBwYWdlX3NoaWZ0LCBuY29udCk7CiAKLQkqaW5sZW4gPSBzaXplb2YoKipjcWIpICsgc2l6ZW9mKCooKmNxYiktPnBhcykgKiBuY29udDsKKwkqaW5sZW4gPSBNTFg1X1NUX1NaX0JZVEVTKGNyZWF0ZV9jcV9pbikgKworCQkgTUxYNV9GTERfU1pfQllURVMoY3JlYXRlX2NxX2luLCBwYXNbMF0pICogbmNvbnQ7CiAJKmNxYiA9IG1seDVfdnphbGxvYygqaW5sZW4pOwogCWlmICghKmNxYikgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9kYjsKIAl9Ci0JbWx4NV9pYl9wb3B1bGF0ZV9wYXMoZGV2LCBjcS0+YnVmLnVtZW0sIHBhZ2Vfc2hpZnQsICgqY3FiKS0+cGFzLCAwKTsKLQkoKmNxYiktPmN0eC5sb2dfcGdfc3ogPSBwYWdlX3NoaWZ0IC0gTUxYNV9BREFQVEVSX1BBR0VfU0hJRlQ7CisKKwlwYXMgPSAoX19iZTY0ICopTUxYNV9BRERSX09GKGNyZWF0ZV9jcV9pbiwgKmNxYiwgcGFzKTsKKwltbHg1X2liX3BvcHVsYXRlX3BhcyhkZXYsIGNxLT5idWYudW1lbSwgcGFnZV9zaGlmdCwgcGFzLCAwKTsKKworCWNxYyA9IE1MWDVfQUREUl9PRihjcmVhdGVfY3FfaW4sICpjcWIsIGNxX2NvbnRleHQpOworCU1MWDVfU0VUKGNxYywgY3FjLCBsb2dfcGFnZV9zaXplLAorCQkgcGFnZV9zaGlmdCAtIE1MWDVfQURBUFRFUl9QQUdFX1NISUZUKTsKIAogCSppbmRleCA9IHRvX211Y29udGV4dChjb250ZXh0KS0+dXVhcmkudWFyc1swXS5pbmRleDsKIApAQCAtODM0LDkgKzgyNCwxMCBAQAogCiBzdGF0aWMgaW50IGNyZWF0ZV9jcV9rZXJuZWwoc3RydWN0IG1seDVfaWJfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X2liX2NxICpjcSwKIAkJCSAgICBpbnQgZW50cmllcywgaW50IGNxZV9zaXplLAotCQkJICAgIHN0cnVjdCBtbHg1X2NyZWF0ZV9jcV9tYm94X2luICoqY3FiLAotCQkJICAgIGludCAqaW5kZXgsIGludCAqaW5sZW4pCisJCQkgICAgdTMyICoqY3FiLCBpbnQgKmluZGV4LCBpbnQgKmlubGVuKQogeworCV9fYmU2NCAqcGFzOworCXZvaWQgKmNxYzsKIAlpbnQgZXJyOwogCiAJZXJyID0gbWx4NV9kYl9hbGxvYyhkZXYtPm1kZXYsICZjcS0+ZGIpOwpAQCAtODUzLDE1ICs4NDQsMjEgQEAKIAogCWluaXRfY3FfYnVmKGNxLCAmY3EtPmJ1Zik7CiAKLQkqaW5sZW4gPSBzaXplb2YoKipjcWIpICsgc2l6ZW9mKCooKmNxYiktPnBhcykgKiBjcS0+YnVmLmJ1Zi5ucGFnZXM7CisJKmlubGVuID0gTUxYNV9TVF9TWl9CWVRFUyhjcmVhdGVfY3FfaW4pICsKKwkJIE1MWDVfRkxEX1NaX0JZVEVTKGNyZWF0ZV9jcV9pbiwgcGFzWzBdKSAqIGNxLT5idWYuYnVmLm5wYWdlczsKIAkqY3FiID0gbWx4NV92emFsbG9jKCppbmxlbik7CiAJaWYgKCEqY3FiKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX2J1ZjsKIAl9Ci0JbWx4NV9maWxsX3BhZ2VfYXJyYXkoJmNxLT5idWYuYnVmLCAoKmNxYiktPnBhcyk7CiAKLQkoKmNxYiktPmN0eC5sb2dfcGdfc3ogPSBjcS0+YnVmLmJ1Zi5wYWdlX3NoaWZ0IC0gTUxYNV9BREFQVEVSX1BBR0VfU0hJRlQ7CisJcGFzID0gKF9fYmU2NCAqKU1MWDVfQUREUl9PRihjcmVhdGVfY3FfaW4sICpjcWIsIHBhcyk7CisJbWx4NV9maWxsX3BhZ2VfYXJyYXkoJmNxLT5idWYuYnVmLCBwYXMpOworCisJY3FjID0gTUxYNV9BRERSX09GKGNyZWF0ZV9jcV9pbiwgKmNxYiwgY3FfY29udGV4dCk7CisJTUxYNV9TRVQoY3FjLCBjcWMsIGxvZ19wYWdlX3NpemUsCisJCSBjcS0+YnVmLmJ1Zi5wYWdlX3NoaWZ0IC0gTUxYNV9BREFQVEVSX1BBR0VfU0hJRlQpOworCiAJKmluZGV4ID0gZGV2LT5tZGV2LT5wcml2LnV1YXJpLnVhcnNbMF0uaW5kZXg7CiAKIAlyZXR1cm4gMDsKQEAgLTg5NSwxMSArODkyLDEyIEBACiB7CiAJaW50IGVudHJpZXMgPSBhdHRyLT5jcWU7CiAJaW50IHZlY3RvciA9IGF0dHItPmNvbXBfdmVjdG9yOwotCXN0cnVjdCBtbHg1X2NyZWF0ZV9jcV9tYm94X2luICpjcWIgPSBOVUxMOwogCXN0cnVjdCBtbHg1X2liX2RldiAqZGV2ID0gdG9fbWRldihpYmRldik7CiAJc3RydWN0IG1seDVfaWJfY3EgKmNxOwogCWludCB1bmluaXRpYWxpemVkX3ZhcihpbmRleCk7CiAJaW50IHVuaW5pdGlhbGl6ZWRfdmFyKGlubGVuKTsKKwl1MzIgKmNxYiA9IE5VTEw7CisJdm9pZCAqY3FjOwogCWludCBjcWVfc2l6ZTsKIAl1bnNpZ25lZCBpbnQgaXJxbjsKIAlpbnQgZXFuOwpAQCAtOTQ1LDE5ICs5NDMsMjAgQEAKIAkJSU5JVF9XT1JLKCZjcS0+bm90aWZ5X3dvcmssIG5vdGlmeV9zb2Z0X3djX2hhbmRsZXIpOwogCX0KIAotCWNxLT5jcWVfc2l6ZSA9IGNxZV9zaXplOwotCWNxYi0+Y3R4LmNxZV9zel9mbGFncyA9IGNxZV9zel90b19tbHhfc3ooY3FlX3NpemUpIDw8IDU7Ci0KLQlpZiAoY3EtPmNyZWF0ZV9mbGFncyAmIElCX0NRX0ZMQUdTX0lHTk9SRV9PVkVSUlVOKQotCQljcWItPmN0eC5jcWVfc3pfZmxhZ3MgfD0gKDEgPDwgMSk7Ci0KLQljcWItPmN0eC5sb2dfc3pfdXNyX3BhZ2UgPSBjcHVfdG9fYmUzMigoaWxvZzIoZW50cmllcykgPDwgMjQpIHwgaW5kZXgpOwogCWVyciA9IG1seDVfdmVjdG9yMmVxbihkZXYtPm1kZXYsIHZlY3RvciwgJmVxbiwgJmlycW4pOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX2NxYjsKIAotCWNxYi0+Y3R4LmNfZXFuID0gY3B1X3RvX2JlMTYoZXFuKTsKLQljcWItPmN0eC5kYl9yZWNvcmRfYWRkciA9IGNwdV90b19iZTY0KGNxLT5kYi5kbWEpOworCWNxLT5jcWVfc2l6ZSA9IGNxZV9zaXplOworCisJY3FjID0gTUxYNV9BRERSX09GKGNyZWF0ZV9jcV9pbiwgY3FiLCBjcV9jb250ZXh0KTsKKwlNTFg1X1NFVChjcWMsIGNxYywgY3FlX3N6LCBjcWVfc3pfdG9fbWx4X3N6KGNxZV9zaXplKSk7CisJTUxYNV9TRVQoY3FjLCBjcWMsIGxvZ19jcV9zaXplLCBpbG9nMihlbnRyaWVzKSk7CisJTUxYNV9TRVQoY3FjLCBjcWMsIHVhcl9wYWdlLCBpbmRleCk7CisJTUxYNV9TRVQoY3FjLCBjcWMsIGNfZXFuLCBlcW4pOworCU1MWDVfU0VUNjQoY3FjLCBjcWMsIGRicl9hZGRyLCBjcS0+ZGIuZG1hKTsKKwlpZiAoY3EtPmNyZWF0ZV9mbGFncyAmIElCX0NRX0ZMQUdTX0lHTk9SRV9PVkVSUlVOKQorCQlNTFg1X1NFVChjcWMsIGNxYywgb2ksIDEpOwogCiAJZXJyID0gbWx4NV9jb3JlX2NyZWF0ZV9jcShkZXYtPm1kZXYsICZjcS0+bWNxLCBjcWIsIGlubGVuKTsKIAlpZiAoZXJyKQpAQCAtMTA4OCwyNyArMTA4NywxNSBAQAogCiBpbnQgbWx4NV9pYl9tb2RpZnlfY3Eoc3RydWN0IGliX2NxICpjcSwgdTE2IGNxX2NvdW50LCB1MTYgY3FfcGVyaW9kKQogewotCXN0cnVjdCBtbHg1X21vZGlmeV9jcV9tYm94X2luICppbjsKIAlzdHJ1Y3QgbWx4NV9pYl9kZXYgKmRldiA9IHRvX21kZXYoY3EtPmRldmljZSk7CiAJc3RydWN0IG1seDVfaWJfY3EgKm1jcSA9IHRvX21jcShjcSk7CiAJaW50IGVycjsKLQl1MzIgZnNlbDsKIAogCWlmICghTUxYNV9DQVBfR0VOKGRldi0+bWRldiwgY3FfbW9kZXJhdGlvbikpCiAJCXJldHVybiAtRU5PU1lTOwogCi0JaW4gPSBremFsbG9jKHNpemVvZigqaW4pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWluKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWluLT5jcW4gPSBjcHVfdG9fYmUzMihtY3EtPm1jcS5jcW4pOwotCWZzZWwgPSAoTUxYNV9DUV9NT0RJRllfUEVSSU9EIHwgTUxYNV9DUV9NT0RJRllfQ09VTlQpOwotCWluLT5jdHguY3FfcGVyaW9kID0gY3B1X3RvX2JlMTYoY3FfcGVyaW9kKTsKLQlpbi0+Y3R4LmNxX21heF9jb3VudCA9IGNwdV90b19iZTE2KGNxX2NvdW50KTsKLQlpbi0+ZmllbGRfc2VsZWN0ID0gY3B1X3RvX2JlMzIoZnNlbCk7Ci0JZXJyID0gbWx4NV9jb3JlX21vZGlmeV9jcShkZXYtPm1kZXYsICZtY3EtPm1jcSwgaW4sIHNpemVvZigqaW4pKTsKLQlrZnJlZShpbik7Ci0KKwllcnIgPSBtbHg1X2NvcmVfbW9kaWZ5X2NxX21vZGVyYXRpb24oZGV2LT5tZGV2LCAmbWNxLT5tY3EsCisJCQkJCSAgICAgY3FfcGVyaW9kLCBjcV9jb3VudCk7CiAJaWYgKGVycikKIAkJbWx4NV9pYl93YXJuKGRldiwgIm1vZGlmeSBjcSAweCV4IGZhaWxlZFxuIiwgbWNxLT5tY3EuY3FuKTsKIApAQCAtMTI0MSw5ICsxMjI4LDExIEBACiB7CiAJc3RydWN0IG1seDVfaWJfZGV2ICpkZXYgPSB0b19tZGV2KGliY3EtPmRldmljZSk7CiAJc3RydWN0IG1seDVfaWJfY3EgKmNxID0gdG9fbWNxKGliY3EpOwotCXN0cnVjdCBtbHg1X21vZGlmeV9jcV9tYm94X2luICppbjsKKwl2b2lkICpjcWM7CisJdTMyICppbjsKIAlpbnQgZXJyOwogCWludCBucGFzOworCV9fYmU2NCAqcGFzOwogCWludCBwYWdlX3NoaWZ0OwogCWludCBpbmxlbjsKIAlpbnQgdW5pbml0aWFsaXplZF92YXIoY3FlX3NpemUpOwpAQCAtMTI4NSwyOCArMTI3NCwzNyBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXg7CiAKLQlpbmxlbiA9IHNpemVvZigqaW4pICsgbnBhcyAqIHNpemVvZihpbi0+cGFzWzBdKTsKKwlpbmxlbiA9IE1MWDVfU1RfU1pfQllURVMobW9kaWZ5X2NxX2luKSArCisJCU1MWDVfRkxEX1NaX0JZVEVTKG1vZGlmeV9jcV9pbiwgcGFzWzBdKSAqIG5wYXM7CisKIAlpbiA9IG1seDVfdnphbGxvYyhpbmxlbik7CiAJaWYgKCFpbikgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGV4X3Jlc2l6ZTsKIAl9CiAKKwlwYXMgPSAoX19iZTY0ICopTUxYNV9BRERSX09GKG1vZGlmeV9jcV9pbiwgaW4sIHBhcyk7CiAJaWYgKHVkYXRhKQogCQltbHg1X2liX3BvcHVsYXRlX3BhcyhkZXYsIGNxLT5yZXNpemVfdW1lbSwgcGFnZV9zaGlmdCwKLQkJCQkgICAgIGluLT5wYXMsIDApOworCQkJCSAgICAgcGFzLCAwKTsKIAllbHNlCi0JCW1seDVfZmlsbF9wYWdlX2FycmF5KCZjcS0+cmVzaXplX2J1Zi0+YnVmLCBpbi0+cGFzKTsKKwkJbWx4NV9maWxsX3BhZ2VfYXJyYXkoJmNxLT5yZXNpemVfYnVmLT5idWYsIHBhcyk7CiAKLQlpbi0+ZmllbGRfc2VsZWN0ID0gY3B1X3RvX2JlMzIoTUxYNV9NT0RJRllfQ1FfTUFTS19MT0dfU0laRSAgfAotCQkJCSAgICAgICBNTFg1X01PRElGWV9DUV9NQVNLX1BHX09GRlNFVCB8Ci0JCQkJICAgICAgIE1MWDVfTU9ESUZZX0NRX01BU0tfUEdfU0laRSk7Ci0JaW4tPmN0eC5sb2dfcGdfc3ogPSBwYWdlX3NoaWZ0IC0gTUxYNV9BREFQVEVSX1BBR0VfU0hJRlQ7Ci0JaW4tPmN0eC5jcWVfc3pfZmxhZ3MgPSBjcWVfc3pfdG9fbWx4X3N6KGNxZV9zaXplKSA8PCA1OwotCWluLT5jdHgucGFnZV9vZmZzZXQgPSAwOwotCWluLT5jdHgubG9nX3N6X3Vzcl9wYWdlID0gY3B1X3RvX2JlMzIoaWxvZzIoZW50cmllcykgPDwgMjQpOwotCWluLT5oZHIub3Btb2QgPSBjcHVfdG9fYmUxNihNTFg1X0NRX09QTU9EX1JFU0laRSk7Ci0JaW4tPmNxbiA9IGNwdV90b19iZTMyKGNxLT5tY3EuY3FuKTsKKwlNTFg1X1NFVChtb2RpZnlfY3FfaW4sIGluLAorCQkgbW9kaWZ5X2ZpZWxkX3NlbGVjdF9yZXNpemVfZmllbGRfc2VsZWN0LnJlc2l6ZV9maWVsZF9zZWxlY3QucmVzaXplX2ZpZWxkX3NlbGVjdCwKKwkJIE1MWDVfTU9ESUZZX0NRX01BU0tfTE9HX1NJWkUgIHwKKwkJIE1MWDVfTU9ESUZZX0NRX01BU0tfUEdfT0ZGU0VUIHwKKwkJIE1MWDVfTU9ESUZZX0NRX01BU0tfUEdfU0laRSk7CisKKwljcWMgPSBNTFg1X0FERFJfT0YobW9kaWZ5X2NxX2luLCBpbiwgY3FfY29udGV4dCk7CisKKwlNTFg1X1NFVChjcWMsIGNxYywgbG9nX3BhZ2Vfc2l6ZSwKKwkJIHBhZ2Vfc2hpZnQgLSBNTFg1X0FEQVBURVJfUEFHRV9TSElGVCk7CisJTUxYNV9TRVQoY3FjLCBjcWMsIGNxZV9zeiwgY3FlX3N6X3RvX21seF9zeihjcWVfc2l6ZSkpOworCU1MWDVfU0VUKGNxYywgY3FjLCBsb2dfY3Ffc2l6ZSwgaWxvZzIoZW50cmllcykpOworCisJTUxYNV9TRVQobW9kaWZ5X2NxX2luLCBpbiwgb3BfbW9kLCBNTFg1X0NRX09QTU9EX1JFU0laRSk7CisJTUxYNV9TRVQobW9kaWZ5X2NxX2luLCBpbiwgY3FuLCBjcS0+bWNxLmNxbik7CiAKIAllcnIgPSBtbHg1X2NvcmVfbW9kaWZ5X2NxKGRldi0+bWRldiwgJmNxLT5tY3EsIGluLCBpbmxlbik7CiAJaWYgKGVycikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L21haW4uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L21haW4uYwppbmRleCBhODRiYjc2Li41NTFhYTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9tYWluLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvbWFpbi5jCkBAIC0zNyw3ICszNyw2IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8tbWFwcGluZy5oPgogI2lmIGRlZmluZWQoQ09ORklHX1g4NikKICNpbmNsdWRlIDxhc20vcGF0Lmg+CiAjZW5kaWYKQEAgLTIzMywyMyArMjMyLDE5IEBACiAJCQkgY29uc3QgdW5pb24gaWJfZ2lkICpnaWQsCiAJCQkgY29uc3Qgc3RydWN0IGliX2dpZF9hdHRyICphdHRyKQogewotCXN0cnVjdCBtbHg1X2liX2RldiAqZGV2CT0gdG9fbWRldihkZXZpY2UpOwotCXUzMiAgaW5bTUxYNV9TVF9TWl9EVyhzZXRfcm9jZV9hZGRyZXNzX2luKV07Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKHNldF9yb2NlX2FkZHJlc3Nfb3V0KV07CisJc3RydWN0IG1seDVfaWJfZGV2ICpkZXYgPSB0b19tZGV2KGRldmljZSk7CisJdTMyICBpbltNTFg1X1NUX1NaX0RXKHNldF9yb2NlX2FkZHJlc3NfaW4pXSAgPSB7MH07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKHNldF9yb2NlX2FkZHJlc3Nfb3V0KV0gPSB7MH07CiAJdm9pZCAqaW5fYWRkciA9IE1MWDVfQUREUl9PRihzZXRfcm9jZV9hZGRyZXNzX2luLCBpbiwgcm9jZV9hZGRyZXNzKTsKIAllbnVtIHJkbWFfbGlua19sYXllciBsbCA9IG1seDVfaWJfcG9ydF9saW5rX2xheWVyKGRldmljZSwgcG9ydF9udW0pOwogCiAJaWYgKGxsICE9IElCX0xJTktfTEFZRVJfRVRIRVJORVQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKLQogCWliX2dpZF90b19tbHg1X3JvY2VfYWRkcihnaWQsIGF0dHIsIGluX2FkZHIpOwogCiAJTUxYNV9TRVQoc2V0X3JvY2VfYWRkcmVzc19pbiwgaW4sIHJvY2VfYWRkcmVzc19pbmRleCwgaW5kZXgpOwogCU1MWDVfU0VUKHNldF9yb2NlX2FkZHJlc3NfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX1NFVF9ST0NFX0FERFJFU1MpOwotCi0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOwogCXJldHVybiBtbHg1X2NtZF9leGVjKGRldi0+bWRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQogCkBAIC0yODksNyArMjg0LDkgQEAKIAogc3RhdGljIGludCBtbHg1X3VzZV9tYWRfaWZjKHN0cnVjdCBtbHg1X2liX2RldiAqZGV2KQogewotCXJldHVybiAhTUxYNV9DQVBfR0VOKGRldi0+bWRldiwgaWJfdmlydCk7CisJaWYgKE1MWDVfQ0FQX0dFTihkZXYtPm1kZXYsIHBvcnRfdHlwZSkgPT0gTUxYNV9DQVBfUE9SVF9UWVBFX0lCKQorCQlyZXR1cm4gIU1MWDVfQ0FQX0dFTihkZXYtPm1kZXYsIGliX3ZpcnQpOworCXJldHVybiAwOwogfQogCiBlbnVtIHsKQEAgLTc1Miw4ICs3NDksNyBAQAogCQkJCSAgICAgJnByb3BzLT5hY3RpdmVfd2lkdGgpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwotCWVyciA9IG1seDVfcXVlcnlfcG9ydF9wcm90b19vcGVyKG1kZXYsICZwcm9wcy0+YWN0aXZlX3NwZWVkLCBNTFg1X1BUWVNfSUIsCi0JCQkJCSBwb3J0KTsKKwllcnIgPSBtbHg1X3F1ZXJ5X3BvcnRfaWJfcHJvdG9fb3BlcihtZGV2LCAmcHJvcHMtPmFjdGl2ZV9zcGVlZCwgcG9ydCk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKQEAgLTE0MjksNiArMTQyNSwxMyBAQAogCQkJCQkgICAgIGRtYWNfNDdfMTYpLAogCQkJCWliX3NwZWMtPmV0aC52YWwuZHN0X21hYyk7CiAKKwkJZXRoZXJfYWRkcl9jb3B5KE1MWDVfQUREUl9PRihmdGVfbWF0Y2hfc2V0X2x5cl8yXzQsIG91dGVyX2hlYWRlcnNfYywKKwkJCQkJICAgICBzbWFjXzQ3XzE2KSwKKwkJCQlpYl9zcGVjLT5ldGgubWFzay5zcmNfbWFjKTsKKwkJZXRoZXJfYWRkcl9jb3B5KE1MWDVfQUREUl9PRihmdGVfbWF0Y2hfc2V0X2x5cl8yXzQsIG91dGVyX2hlYWRlcnNfdiwKKwkJCQkJICAgICBzbWFjXzQ3XzE2KSwKKwkJCQlpYl9zcGVjLT5ldGgudmFsLnNyY19tYWMpOworCiAJCWlmIChpYl9zcGVjLT5ldGgubWFzay52bGFuX3RhZykgewogCQkJTUxYNV9TRVQoZnRlX21hdGNoX3NldF9seXJfMl80LCBvdXRlcl9oZWFkZXJzX2MsCiAJCQkJIHZsYW5fdGFnLCAxKTsKQEAgLTE4NTAsNiArMTg1Myw3IEBACiAJCQkJCSAgIGludCBkb21haW4pCiB7CiAJc3RydWN0IG1seDVfaWJfZGV2ICpkZXYgPSB0b19tZGV2KHFwLT5kZXZpY2UpOworCXN0cnVjdCBtbHg1X2liX3FwICptcXAgPSB0b19tcXAocXApOwogCXN0cnVjdCBtbHg1X2liX2Zsb3dfaGFuZGxlciAqaGFuZGxlciA9IE5VTEw7CiAJc3RydWN0IG1seDVfZmxvd19kZXN0aW5hdGlvbiAqZHN0ID0gTlVMTDsKIAlzdHJ1Y3QgbWx4NV9pYl9mbG93X3ByaW8gKmZ0X3ByaW87CkBAIC0xODc2LDcgKzE4ODAsMTAgQEAKIAl9CiAKIAlkc3QtPnR5cGUgPSBNTFg1X0ZMT1dfREVTVElOQVRJT05fVFlQRV9USVI7Ci0JZHN0LT50aXJfbnVtID0gdG9fbXFwKHFwKS0+cmF3X3BhY2tldF9xcC5ycS50aXJuOworCWlmIChtcXAtPmZsYWdzICYgTUxYNV9JQl9RUF9SU1MpCisJCWRzdC0+dGlyX251bSA9IG1xcC0+cnNzX3FwLnRpcm47CisJZWxzZQorCQlkc3QtPnRpcl9udW0gPSBtcXAtPnJhd19wYWNrZXRfcXAucnEudGlybjsKIAogCWlmIChmbG93X2F0dHItPnR5cGUgPT0gSUJfRkxPV19BVFRSX05PUk1BTCkgewogCQlpZiAoZmxvd19hdHRyLT5mbGFncyAmIElCX0ZMT1dfQVRUUl9GTEFHU19ET05UX1RSQVApICB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9tZW0uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L21lbS5jCmluZGV4IDQwZGYyY2MuLjk5NmI1NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L21lbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L21lbS5jCkBAIC03MSw3ICs3MSw3IEBACiAKIAlhZGRyID0gYWRkciA+PiBwYWdlX3NoaWZ0OwogCXRtcCA9ICh1bnNpZ25lZCBsb25nKWFkZHI7Ci0JbSA9IGZpbmRfZmlyc3RfYml0KCZ0bXAsIHNpemVvZih0bXApKTsKKwltID0gZmluZF9maXJzdF9iaXQoJnRtcCwgQklUU19QRVJfTE9ORyk7CiAJc2tpcCA9IDEgPDwgbTsKIAltYXNrID0gc2tpcCAtIDE7CiAJaSA9IDA7CkBAIC04MSw3ICs4MSw3IEBACiAJCWZvciAoayA9IDA7IGsgPCBsZW47IGsrKykgewogCQkJaWYgKCEoaSAmIG1hc2spKSB7CiAJCQkJdG1wID0gKHVuc2lnbmVkIGxvbmcpcGZuOwotCQkJCW0gPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBtLCBmaW5kX2ZpcnN0X2JpdCgmdG1wLCBzaXplb2YodG1wKSkpOworCQkJCW0gPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBtLCBmaW5kX2ZpcnN0X2JpdCgmdG1wLCBCSVRTX1BFUl9MT05HKSk7CiAJCQkJc2tpcCA9IDEgPDwgbTsKIAkJCQltYXNrID0gc2tpcCAtIDE7CiAJCQkJYmFzZSA9IHBmbjsKQEAgLTg5LDcgKzg5LDcgQEAKIAkJCX0gZWxzZSB7CiAJCQkJaWYgKGJhc2UgKyBwICE9IHBmbikgewogCQkJCQl0bXAgPSAodW5zaWduZWQgbG9uZylwOwotCQkJCQltID0gZmluZF9maXJzdF9iaXQoJnRtcCwgc2l6ZW9mKHRtcCkpOworCQkJCQltID0gZmluZF9maXJzdF9iaXQoJnRtcCwgQklUU19QRVJfTE9ORyk7CiAJCQkJCXNraXAgPSAxIDw8IG07CiAJCQkJCW1hc2sgPSBza2lwIC0gMTsKIAkJCQkJYmFzZSA9IHBmbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L21seDVfaWIuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L21seDVfaWIuaAppbmRleCAzNzIzODVkLi42N2NjNzQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9tbHg1X2liLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvbWx4NV9pYi5oCkBAIC00MDIsNiArNDAyLDcgQEAKIAkvKiBRUCB1c2VzIDEgYXMgaXRzIHNvdXJjZSBRUCBudW1iZXIgKi8KIAlNTFg1X0lCX1FQX1NRUE5fUVAxCQkJPSAxIDw8IDYsCiAJTUxYNV9JQl9RUF9DQVBfU0NBVFRFUl9GQ1MJCT0gMSA8PCA3LAorCU1MWDVfSUJfUVBfUlNTCQkJCT0gMSA8PCA4LAogfTsKIAogc3RydWN0IG1seDVfdW1yX3dyIHsKQEAgLTUwNCw3ICs1MDUsNyBAQAogCWludAkJCXVtcmVkOwogCWludAkJCW5wYWdlczsKIAlzdHJ1Y3QgbWx4NV9pYl9kZXYgICAgICpkZXY7Ci0Jc3RydWN0IG1seDVfY3JlYXRlX21rZXlfbWJveF9vdXQgb3V0OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhjcmVhdGVfbWtleV9vdXQpXTsKIAlzdHJ1Y3QgbWx4NV9jb3JlX3NpZ19jdHggICAgKnNpZzsKIAlpbnQJCQlsaXZlOwogCXZvaWQJCQkqZGVzY3NfYWxsb2M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9tci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvbXIuYwppbmRleCA0YjAyMTMwLi42ZjdlMzQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9tci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L21yLmMKQEAgLTEzNSwyMCArMTM1LDEwIEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAobXItPm91dC5oZHIuc3RhdHVzKSB7Ci0JCW1seDVfaWJfd2FybihkZXYsICJmYWlsZWQgLSBzdGF0dXMgJWQsIHN5bmRvcm1lIDB4JXhcbiIsCi0JCQkgICAgIG1yLT5vdXQuaGRyLnN0YXR1cywKLQkJCSAgICAgYmUzMl90b19jcHUobXItPm91dC5oZHIuc3luZHJvbWUpKTsKLQkJa2ZyZWUobXIpOwotCQlkZXYtPmZpbGxfZGVsYXkgPSAxOwotCQltb2RfdGltZXIoJmRldi0+ZGVsYXlfdGltZXIsIGppZmZpZXMgKyBIWik7Ci0JCXJldHVybjsKLQl9Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5tZGV2LT5wcml2Lm1rZXlfbG9jaywgZmxhZ3MpOwogCWtleSA9IGRldi0+bWRldi0+cHJpdi5ta2V5X2tleSsrOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bWRldi0+cHJpdi5ta2V5X2xvY2ssIGZsYWdzKTsKLQltci0+bW1rZXkua2V5ID0gbWx4NV9pZHhfdG9fbWtleShiZTMyX3RvX2NwdShtci0+b3V0Lm1rZXkpICYgMHhmZmZmZmYpIHwga2V5OworCW1yLT5tbWtleS5rZXkgPSBtbHg1X2lkeF90b19ta2V5KE1MWDVfR0VUKGNyZWF0ZV9ta2V5X291dCwgbXItPm91dCwgbWtleV9pbmRleCkpIHwga2V5OwogCiAJY2FjaGUtPmxhc3RfYWRkID0gamlmZmllczsKIApAQCAtMTcwLDE2ICsxNjAsMTkgQEAKIHsKIAlzdHJ1Y3QgbWx4NV9tcl9jYWNoZSAqY2FjaGUgPSAmZGV2LT5jYWNoZTsKIAlzdHJ1Y3QgbWx4NV9jYWNoZV9lbnQgKmVudCA9ICZjYWNoZS0+ZW50W2NdOwotCXN0cnVjdCBtbHg1X2NyZWF0ZV9ta2V5X21ib3hfaW4gKmluOworCWludCBpbmxlbiA9IE1MWDVfU1RfU1pfQllURVMoY3JlYXRlX21rZXlfaW4pOwogCXN0cnVjdCBtbHg1X2liX21yICptcjsKIAlpbnQgbnBhZ2VzID0gMSA8PCBlbnQtPm9yZGVyOworCXZvaWQgKm1rYzsKKwl1MzIgKmluOwogCWludCBlcnIgPSAwOwogCWludCBpOwogCi0JaW4gPSBremFsbG9jKHNpemVvZigqaW4pLCBHRlBfS0VSTkVMKTsKKwlpbiA9IGt6YWxsb2MoaW5sZW4sIEdGUF9LRVJORUwpOwogCWlmICghaW4pCiAJCXJldHVybiAtRU5PTUVNOwogCisJbWtjID0gTUxYNV9BRERSX09GKGNyZWF0ZV9ta2V5X2luLCBpbiwgbWVtb3J5X2tleV9ta2V5X2VudHJ5KTsKIAlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKIAkJaWYgKGVudC0+cGVuZGluZyA+PSBNQVhfUEVORElOR19SRUdfTVIpIHsKIAkJCWVyciA9IC1FQUdBSU47CkBAIC0xOTQsMTggKzE4NywyMiBAQAogCQltci0+b3JkZXIgPSBlbnQtPm9yZGVyOwogCQltci0+dW1yZWQgPSAxOwogCQltci0+ZGV2ID0gZGV2OwotCQlpbi0+c2VnLnN0YXR1cyA9IE1MWDVfTUtFWV9TVEFUVVNfRlJFRTsKLQkJaW4tPnNlZy54bHRfb2N0X3NpemUgPSBjcHVfdG9fYmUzMigobnBhZ2VzICsgMSkgLyAyKTsKLQkJaW4tPnNlZy5xcG5fbWtleTdfMCA9IGNwdV90b19iZTMyKDB4ZmZmZmZmIDw8IDgpOwotCQlpbi0+c2VnLmZsYWdzID0gTUxYNV9BQ0NFU1NfTU9ERV9NVFQgfCBNTFg1X1BFUk1fVU1SX0VOOwotCQlpbi0+c2VnLmxvZzJfcGFnZV9zaXplID0gMTI7CisKKwkJTUxYNV9TRVQobWtjLCBta2MsIGZyZWUsIDEpOworCQlNTFg1X1NFVChta2MsIG1rYywgdW1yX2VuLCAxKTsKKwkJTUxYNV9TRVQobWtjLCBta2MsIGFjY2Vzc19tb2RlLCBNTFg1X01LQ19BQ0NFU1NfTU9ERV9NVFQpOworCisJCU1MWDVfU0VUKG1rYywgbWtjLCBxcG4sIDB4ZmZmZmZmKTsKKwkJTUxYNV9TRVQobWtjLCBta2MsIHRyYW5zbGF0aW9uc19vY3R3b3JkX3NpemUsIChucGFnZXMgKyAxKSAvIDIpOworCQlNTFg1X1NFVChta2MsIG1rYywgbG9nX3BhZ2Vfc2l6ZSwgMTIpOwogCiAJCXNwaW5fbG9ja19pcnEoJmVudC0+bG9jayk7CiAJCWVudC0+cGVuZGluZysrOwogCQlzcGluX3VubG9ja19pcnEoJmVudC0+bG9jayk7Ci0JCWVyciA9IG1seDVfY29yZV9jcmVhdGVfbWtleShkZXYtPm1kZXYsICZtci0+bW1rZXksIGluLAotCQkJCQkgICAgc2l6ZW9mKCppbiksIHJlZ19tcl9jYWxsYmFjaywKLQkJCQkJICAgIG1yLCAmbXItPm91dCk7CisJCWVyciA9IG1seDVfY29yZV9jcmVhdGVfbWtleV9jYihkZXYtPm1kZXYsICZtci0+bW1rZXksCisJCQkJCSAgICAgICBpbiwgaW5sZW4sCisJCQkJCSAgICAgICBtci0+b3V0LCBzaXplb2YobXItPm91dCksCisJCQkJCSAgICAgICByZWdfbXJfY2FsbGJhY2ssIG1yKTsKIAkJaWYgKGVycikgewogCQkJc3Bpbl9sb2NrX2lycSgmZW50LT5sb2NrKTsKIAkJCWVudC0+cGVuZGluZy0tOwpAQCAtNjcwLDMwICs2NjcsMzggQEAKIHN0cnVjdCBpYl9tciAqbWx4NV9pYl9nZXRfZG1hX21yKHN0cnVjdCBpYl9wZCAqcGQsIGludCBhY2MpCiB7CiAJc3RydWN0IG1seDVfaWJfZGV2ICpkZXYgPSB0b19tZGV2KHBkLT5kZXZpY2UpOworCWludCBpbmxlbiA9IE1MWDVfU1RfU1pfQllURVMoY3JlYXRlX21rZXlfaW4pOwogCXN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2ID0gZGV2LT5tZGV2OwotCXN0cnVjdCBtbHg1X2NyZWF0ZV9ta2V5X21ib3hfaW4gKmluOwotCXN0cnVjdCBtbHg1X21rZXlfc2VnICpzZWc7CiAJc3RydWN0IG1seDVfaWJfbXIgKm1yOworCXZvaWQgKm1rYzsKKwl1MzIgKmluOwogCWludCBlcnI7CiAKIAltciA9IGt6YWxsb2Moc2l6ZW9mKCptciksIEdGUF9LRVJORUwpOwogCWlmICghbXIpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCi0JaW4gPSBremFsbG9jKHNpemVvZigqaW4pLCBHRlBfS0VSTkVMKTsKKwlpbiA9IGt6YWxsb2MoaW5sZW4sIEdGUF9LRVJORUwpOwogCWlmICghaW4pIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKLQlzZWcgPSAmaW4tPnNlZzsKLQlzZWctPmZsYWdzID0gY29udmVydF9hY2Nlc3MoYWNjKSB8IE1MWDVfQUNDRVNTX01PREVfUEE7Ci0Jc2VnLT5mbGFnc19wZCA9IGNwdV90b19iZTMyKHRvX21wZChwZCktPnBkbiB8IE1MWDVfTUtFWV9MRU42NCk7Ci0Jc2VnLT5xcG5fbWtleTdfMCA9IGNwdV90b19iZTMyKDB4ZmZmZmZmIDw8IDgpOwotCXNlZy0+c3RhcnRfYWRkciA9IDA7CisJbWtjID0gTUxYNV9BRERSX09GKGNyZWF0ZV9ta2V5X2luLCBpbiwgbWVtb3J5X2tleV9ta2V5X2VudHJ5KTsKIAotCWVyciA9IG1seDVfY29yZV9jcmVhdGVfbWtleShtZGV2LCAmbXItPm1ta2V5LCBpbiwgc2l6ZW9mKCppbiksIE5VTEwsIE5VTEwsCi0JCQkJICAgIE5VTEwpOworCU1MWDVfU0VUKG1rYywgbWtjLCBhY2Nlc3NfbW9kZSwgTUxYNV9NS0NfQUNDRVNTX01PREVfUEEpOworCU1MWDVfU0VUKG1rYywgbWtjLCBhLCAhIShhY2MgJiBJQl9BQ0NFU1NfUkVNT1RFX0FUT01JQykpOworCU1MWDVfU0VUKG1rYywgbWtjLCBydywgISEoYWNjICYgSUJfQUNDRVNTX1JFTU9URV9XUklURSkpOworCU1MWDVfU0VUKG1rYywgbWtjLCByciwgISEoYWNjICYgSUJfQUNDRVNTX1JFTU9URV9SRUFEKSk7CisJTUxYNV9TRVQobWtjLCBta2MsIGx3LCAhIShhY2MgJiBJQl9BQ0NFU1NfTE9DQUxfV1JJVEUpKTsKKwlNTFg1X1NFVChta2MsIG1rYywgbHIsIDEpOworCisJTUxYNV9TRVQobWtjLCBta2MsIGxlbmd0aDY0LCAxKTsKKwlNTFg1X1NFVChta2MsIG1rYywgcGQsIHRvX21wZChwZCktPnBkbik7CisJTUxYNV9TRVQobWtjLCBta2MsIHFwbiwgMHhmZmZmZmYpOworCU1MWDVfU0VUNjQobWtjLCBta2MsIHN0YXJ0X2FkZHIsIDApOworCisJZXJyID0gbWx4NV9jb3JlX2NyZWF0ZV9ta2V5KG1kZXYsICZtci0+bW1rZXksIGluLCBpbmxlbik7CiAJaWYgKGVycikKIAkJZ290byBlcnJfaW47CiAKQEAgLTEwNjMsOSArMTA2OCwxMSBAQAogCQkJCSAgICAgaW50IHBhZ2Vfc2hpZnQsIGludCBhY2Nlc3NfZmxhZ3MpCiB7CiAJc3RydWN0IG1seDVfaWJfZGV2ICpkZXYgPSB0b19tZGV2KHBkLT5kZXZpY2UpOwotCXN0cnVjdCBtbHg1X2NyZWF0ZV9ta2V5X21ib3hfaW4gKmluOwogCXN0cnVjdCBtbHg1X2liX21yICptcjsKKwlfX2JlNjQgKnBhczsKKwl2b2lkICpta2M7CiAJaW50IGlubGVuOworCXUzMiAqaW47CiAJaW50IGVycjsKIAlib29sIHBnX2NhcCA9ICEhKE1MWDVfQ0FQX0dFTihkZXYtPm1kZXYsIHBnKSk7CiAKQEAgLTEwNzMsMzEgKzEwODAsNDEgQEAKIAlpZiAoIW1yKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCWlubGVuID0gc2l6ZW9mKCppbikgKyBzaXplb2YoKmluLT5wYXMpICogKChucGFnZXMgKyAxKSAvIDIpICogMjsKKwlpbmxlbiA9IE1MWDVfU1RfU1pfQllURVMoY3JlYXRlX21rZXlfaW4pICsKKwkJc2l6ZW9mKCpwYXMpICogKChucGFnZXMgKyAxKSAvIDIpICogMjsKIAlpbiA9IG1seDVfdnphbGxvYyhpbmxlbik7CiAJaWYgKCFpbikgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGVycl8xOwogCX0KLQltbHg1X2liX3BvcHVsYXRlX3BhcyhkZXYsIHVtZW0sIHBhZ2Vfc2hpZnQsIGluLT5wYXMsCisJcGFzID0gKF9fYmU2NCAqKU1MWDVfQUREUl9PRihjcmVhdGVfbWtleV9pbiwgaW4sIGtsbV9wYXNfbXR0KTsKKwltbHg1X2liX3BvcHVsYXRlX3BhcyhkZXYsIHVtZW0sIHBhZ2Vfc2hpZnQsIHBhcywKIAkJCSAgICAgcGdfY2FwID8gTUxYNV9JQl9NVFRfUFJFU0VOVCA6IDApOwogCi0JLyogVGhlIE1MWDVfTUtFWV9JTkJPWF9QR19BQ0NFU1MgYml0IGFsbG93cyBzZXR0aW5nIHRoZSBhY2Nlc3MgZmxhZ3MKKwkvKiBUaGUgcGdfYWNjZXNzIGJpdCBhbGxvd3Mgc2V0dGluZyB0aGUgYWNjZXNzIGZsYWdzCiAJICogaW4gdGhlIHBhZ2UgbGlzdCBzdWJtaXR0ZWQgd2l0aCB0aGUgY29tbWFuZC4gKi8KLQlpbi0+ZmxhZ3MgPSBwZ19jYXAgPyBjcHVfdG9fYmUzMihNTFg1X01LRVlfSU5CT1hfUEdfQUNDRVNTKSA6IDA7Ci0JaW4tPnNlZy5mbGFncyA9IGNvbnZlcnRfYWNjZXNzKGFjY2Vzc19mbGFncykgfAotCQlNTFg1X0FDQ0VTU19NT0RFX01UVDsKLQlpbi0+c2VnLmZsYWdzX3BkID0gY3B1X3RvX2JlMzIodG9fbXBkKHBkKS0+cGRuKTsKLQlpbi0+c2VnLnN0YXJ0X2FkZHIgPSBjcHVfdG9fYmU2NCh2aXJ0X2FkZHIpOwotCWluLT5zZWcubGVuID0gY3B1X3RvX2JlNjQobGVuZ3RoKTsKLQlpbi0+c2VnLmJzZnNfb2N0b19zaXplID0gMDsKLQlpbi0+c2VnLnhsdF9vY3Rfc2l6ZSA9IGNwdV90b19iZTMyKGdldF9vY3RvX2xlbih2aXJ0X2FkZHIsIGxlbmd0aCwgMSA8PCBwYWdlX3NoaWZ0KSk7Ci0JaW4tPnNlZy5sb2cyX3BhZ2Vfc2l6ZSA9IHBhZ2Vfc2hpZnQ7Ci0JaW4tPnNlZy5xcG5fbWtleTdfMCA9IGNwdV90b19iZTMyKDB4ZmZmZmZmIDw8IDgpOwotCWluLT54bGF0X29jdF9hY3Rfc2l6ZSA9IGNwdV90b19iZTMyKGdldF9vY3RvX2xlbih2aXJ0X2FkZHIsIGxlbmd0aCwKLQkJCQkJCQkgMSA8PCBwYWdlX3NoaWZ0KSk7Ci0JZXJyID0gbWx4NV9jb3JlX2NyZWF0ZV9ta2V5KGRldi0+bWRldiwgJm1yLT5tbWtleSwgaW4sIGlubGVuLCBOVUxMLAotCQkJCSAgICBOVUxMLCBOVUxMKTsKKwlNTFg1X1NFVChjcmVhdGVfbWtleV9pbiwgaW4sIHBnX2FjY2VzcywgISEocGdfY2FwKSk7CisKKwlta2MgPSBNTFg1X0FERFJfT0YoY3JlYXRlX21rZXlfaW4sIGluLCBtZW1vcnlfa2V5X21rZXlfZW50cnkpOworCU1MWDVfU0VUKG1rYywgbWtjLCBhY2Nlc3NfbW9kZSwgTUxYNV9NS0NfQUNDRVNTX01PREVfTVRUKTsKKwlNTFg1X1NFVChta2MsIG1rYywgYSwgISEoYWNjZXNzX2ZsYWdzICYgSUJfQUNDRVNTX1JFTU9URV9BVE9NSUMpKTsKKwlNTFg1X1NFVChta2MsIG1rYywgcncsICEhKGFjY2Vzc19mbGFncyAmIElCX0FDQ0VTU19SRU1PVEVfV1JJVEUpKTsKKwlNTFg1X1NFVChta2MsIG1rYywgcnIsICEhKGFjY2Vzc19mbGFncyAmIElCX0FDQ0VTU19SRU1PVEVfUkVBRCkpOworCU1MWDVfU0VUKG1rYywgbWtjLCBsdywgISEoYWNjZXNzX2ZsYWdzICYgSUJfQUNDRVNTX0xPQ0FMX1dSSVRFKSk7CisJTUxYNV9TRVQobWtjLCBta2MsIGxyLCAxKTsKKworCU1MWDVfU0VUNjQobWtjLCBta2MsIHN0YXJ0X2FkZHIsIHZpcnRfYWRkcik7CisJTUxYNV9TRVQ2NChta2MsIG1rYywgbGVuLCBsZW5ndGgpOworCU1MWDVfU0VUKG1rYywgbWtjLCBwZCwgdG9fbXBkKHBkKS0+cGRuKTsKKwlNTFg1X1NFVChta2MsIG1rYywgYnNmX29jdHdvcmRfc2l6ZSwgMCk7CisJTUxYNV9TRVQobWtjLCBta2MsIHRyYW5zbGF0aW9uc19vY3R3b3JkX3NpemUsCisJCSBnZXRfb2N0b19sZW4odmlydF9hZGRyLCBsZW5ndGgsIDEgPDwgcGFnZV9zaGlmdCkpOworCU1MWDVfU0VUKG1rYywgbWtjLCBsb2dfcGFnZV9zaXplLCBwYWdlX3NoaWZ0KTsKKwlNTFg1X1NFVChta2MsIG1rYywgcXBuLCAweGZmZmZmZik7CisJTUxYNV9TRVQoY3JlYXRlX21rZXlfaW4sIGluLCB0cmFuc2xhdGlvbnNfb2N0d29yZF9hY3R1YWxfc2l6ZSwKKwkJIGdldF9vY3RvX2xlbih2aXJ0X2FkZHIsIGxlbmd0aCwgMSA8PCBwYWdlX3NoaWZ0KSk7CisKKwllcnIgPSBtbHg1X2NvcmVfY3JlYXRlX21rZXkoZGV2LT5tZGV2LCAmbXItPm1ta2V5LCBpbiwgaW5sZW4pOwogCWlmIChlcnIpIHsKIAkJbWx4NV9pYl93YXJuKGRldiwgImNyZWF0ZSBta2V5IGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyXzI7CkBAIC0xNTIzLDMwICsxNTQwLDMyIEBACiAJCQkgICAgICAgdTMyIG1heF9udW1fc2cpCiB7CiAJc3RydWN0IG1seDVfaWJfZGV2ICpkZXYgPSB0b19tZGV2KHBkLT5kZXZpY2UpOwotCXN0cnVjdCBtbHg1X2NyZWF0ZV9ta2V5X21ib3hfaW4gKmluOwotCXN0cnVjdCBtbHg1X2liX21yICptcjsKKwlpbnQgaW5sZW4gPSBNTFg1X1NUX1NaX0JZVEVTKGNyZWF0ZV9ta2V5X2luKTsKIAlpbnQgbmRlc2NzID0gQUxJR04obWF4X251bV9zZywgNCk7CisJc3RydWN0IG1seDVfaWJfbXIgKm1yOworCXZvaWQgKm1rYzsKKwl1MzIgKmluOwogCWludCBlcnI7CiAKIAltciA9IGt6YWxsb2Moc2l6ZW9mKCptciksIEdGUF9LRVJORUwpOwogCWlmICghbXIpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCi0JaW4gPSBremFsbG9jKHNpemVvZigqaW4pLCBHRlBfS0VSTkVMKTsKKwlpbiA9IGt6YWxsb2MoaW5sZW4sIEdGUF9LRVJORUwpOwogCWlmICghaW4pIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKLQlpbi0+c2VnLnN0YXR1cyA9IE1MWDVfTUtFWV9TVEFUVVNfRlJFRTsKLQlpbi0+c2VnLnhsdF9vY3Rfc2l6ZSA9IGNwdV90b19iZTMyKG5kZXNjcyk7Ci0JaW4tPnNlZy5xcG5fbWtleTdfMCA9IGNwdV90b19iZTMyKDB4ZmZmZmZmIDw8IDgpOwotCWluLT5zZWcuZmxhZ3NfcGQgPSBjcHVfdG9fYmUzMih0b19tcGQocGQpLT5wZG4pOworCW1rYyA9IE1MWDVfQUREUl9PRihjcmVhdGVfbWtleV9pbiwgaW4sIG1lbW9yeV9rZXlfbWtleV9lbnRyeSk7CisJTUxYNV9TRVQobWtjLCBta2MsIGZyZWUsIDEpOworCU1MWDVfU0VUKG1rYywgbWtjLCB0cmFuc2xhdGlvbnNfb2N0d29yZF9zaXplLCBuZGVzY3MpOworCU1MWDVfU0VUKG1rYywgbWtjLCBxcG4sIDB4ZmZmZmZmKTsKKwlNTFg1X1NFVChta2MsIG1rYywgcGQsIHRvX21wZChwZCktPnBkbik7CiAKIAlpZiAobXJfdHlwZSA9PSBJQl9NUl9UWVBFX01FTV9SRUcpIHsKLQkJbXItPmFjY2Vzc19tb2RlID0gTUxYNV9BQ0NFU1NfTU9ERV9NVFQ7Ci0JCWluLT5zZWcubG9nMl9wYWdlX3NpemUgPSBQQUdFX1NISUZUOwotCisJCW1yLT5hY2Nlc3NfbW9kZSA9IE1MWDVfTUtDX0FDQ0VTU19NT0RFX01UVDsKKwkJTUxYNV9TRVQobWtjLCBta2MsIGxvZ19wYWdlX3NpemUsIFBBR0VfU0hJRlQpOwogCQllcnIgPSBtbHg1X2FsbG9jX3ByaXZfZGVzY3MocGQtPmRldmljZSwgbXIsCiAJCQkJCSAgICBuZGVzY3MsIHNpemVvZih1NjQpKTsKIAkJaWYgKGVycikKQEAgLTE1NTUsNyArMTU3NCw3IEBACiAJCW1yLT5kZXNjX3NpemUgPSBzaXplb2YodTY0KTsKIAkJbXItPm1heF9kZXNjcyA9IG5kZXNjczsKIAl9IGVsc2UgaWYgKG1yX3R5cGUgPT0gSUJfTVJfVFlQRV9TR19HQVBTKSB7Ci0JCW1yLT5hY2Nlc3NfbW9kZSA9IE1MWDVfQUNDRVNTX01PREVfS0xNOworCQltci0+YWNjZXNzX21vZGUgPSBNTFg1X01LQ19BQ0NFU1NfTU9ERV9LTE1TOwogCiAJCWVyciA9IG1seDVfYWxsb2NfcHJpdl9kZXNjcyhwZC0+ZGV2aWNlLCBtciwKIAkJCQkJICAgIG5kZXNjcywgc2l6ZW9mKHN0cnVjdCBtbHg1X2tsbSkpOwpAQCAtMTU2Niw5ICsxNTg1LDggQEAKIAl9IGVsc2UgaWYgKG1yX3R5cGUgPT0gSUJfTVJfVFlQRV9TSUdOQVRVUkUpIHsKIAkJdTMyIHBzdl9pbmRleFsyXTsKIAotCQlpbi0+c2VnLmZsYWdzX3BkID0gY3B1X3RvX2JlMzIoYmUzMl90b19jcHUoaW4tPnNlZy5mbGFnc19wZCkgfAotCQkJCQkJCSAgIE1MWDVfTUtFWV9CU0ZfRU4pOwotCQlpbi0+c2VnLmJzZnNfb2N0b19zaXplID0gY3B1X3RvX2JlMzIoTUxYNV9NS0VZX0JTRl9PQ1RPX1NJWkUpOworCQlNTFg1X1NFVChta2MsIG1rYywgYnNmX2VuLCAxKTsKKwkJTUxYNV9TRVQobWtjLCBta2MsIGJzZl9vY3R3b3JkX3NpemUsIE1MWDVfTUtFWV9CU0ZfT0NUT19TSVpFKTsKIAkJbXItPnNpZyA9IGt6YWxsb2Moc2l6ZW9mKCptci0+c2lnKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghbXItPnNpZykgewogCQkJZXJyID0gLUVOT01FTTsKQEAgLTE1ODEsNyArMTU5OSw3IEBACiAJCWlmIChlcnIpCiAJCQlnb3RvIGVycl9mcmVlX3NpZzsKIAotCQltci0+YWNjZXNzX21vZGUgPSBNTFg1X0FDQ0VTU19NT0RFX0tMTTsKKwkJbXItPmFjY2Vzc19tb2RlID0gTUxYNV9NS0NfQUNDRVNTX01PREVfS0xNUzsKIAkJbXItPnNpZy0+cHN2X21lbW9yeS5wc3ZfaWR4ID0gcHN2X2luZGV4WzBdOwogCQltci0+c2lnLT5wc3Zfd2lyZS5wc3ZfaWR4ID0gcHN2X2luZGV4WzFdOwogCkBAIC0xNTk1LDkgKzE2MTMsMTAgQEAKIAkJZ290byBlcnJfZnJlZV9pbjsKIAl9CiAKLQlpbi0+c2VnLmZsYWdzID0gTUxYNV9QRVJNX1VNUl9FTiB8IG1yLT5hY2Nlc3NfbW9kZTsKLQllcnIgPSBtbHg1X2NvcmVfY3JlYXRlX21rZXkoZGV2LT5tZGV2LCAmbXItPm1ta2V5LCBpbiwgc2l6ZW9mKCppbiksCi0JCQkJICAgIE5VTEwsIE5VTEwsIE5VTEwpOworCU1MWDVfU0VUKG1rYywgbWtjLCBhY2Nlc3NfbW9kZSwgbXItPmFjY2Vzc19tb2RlKTsKKwlNTFg1X1NFVChta2MsIG1rYywgdW1yX2VuLCAxKTsKKworCWVyciA9IG1seDVfY29yZV9jcmVhdGVfbWtleShkZXYtPm1kZXYsICZtci0+bW1rZXksIGluLCBpbmxlbik7CiAJaWYgKGVycikKIAkJZ290byBlcnJfZGVzdHJveV9wc3Y7CiAKQEAgLTE2MzMsOCArMTY1MiwxMCBAQAogCQkJICAgICAgIHN0cnVjdCBpYl91ZGF0YSAqdWRhdGEpCiB7CiAJc3RydWN0IG1seDVfaWJfZGV2ICpkZXYgPSB0b19tZGV2KHBkLT5kZXZpY2UpOwotCXN0cnVjdCBtbHg1X2NyZWF0ZV9ta2V5X21ib3hfaW4gKmluID0gTlVMTDsKKwlpbnQgaW5sZW4gPSBNTFg1X1NUX1NaX0JZVEVTKGNyZWF0ZV9ta2V5X2luKTsKIAlzdHJ1Y3QgbWx4NV9pYl9tdyAqbXcgPSBOVUxMOworCXUzMiAqaW4gPSBOVUxMOworCXZvaWQgKm1rYzsKIAlpbnQgbmRlc2NzOwogCWludCBlcnI7CiAJc3RydWN0IG1seDVfaWJfYWxsb2NfbXcgcmVxID0ge307CkBAIC0xNjU4LDIzICsxNjc5LDI0IEBACiAJbmRlc2NzID0gcmVxLm51bV9rbG1zID8gcm91bmR1cChyZXEubnVtX2tsbXMsIDQpIDogcm91bmR1cCgxLCA0KTsKIAogCW13ID0ga3phbGxvYyhzaXplb2YoKm13KSwgR0ZQX0tFUk5FTCk7Ci0JaW4gPSBremFsbG9jKHNpemVvZigqaW4pLCBHRlBfS0VSTkVMKTsKKwlpbiA9IGt6YWxsb2MoaW5sZW4sIEdGUF9LRVJORUwpOwogCWlmICghbXcgfHwgIWluKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZnJlZTsKIAl9CiAKLQlpbi0+c2VnLnN0YXR1cyA9IE1MWDVfTUtFWV9TVEFUVVNfRlJFRTsKLQlpbi0+c2VnLnhsdF9vY3Rfc2l6ZSA9IGNwdV90b19iZTMyKG5kZXNjcyk7Ci0JaW4tPnNlZy5mbGFnc19wZCA9IGNwdV90b19iZTMyKHRvX21wZChwZCktPnBkbik7Ci0JaW4tPnNlZy5mbGFncyA9IE1MWDVfUEVSTV9VTVJfRU4gfCBNTFg1X0FDQ0VTU19NT0RFX0tMTSB8Ci0JCU1MWDVfUEVSTV9MT0NBTF9SRUFEOwotCWlmICh0eXBlID09IElCX01XX1RZUEVfMikKLQkJaW4tPnNlZy5mbGFnc19wZCB8PSBjcHVfdG9fYmUzMihNTFg1X01LRVlfUkVNT1RFX0lOVkFMKTsKLQlpbi0+c2VnLnFwbl9ta2V5N18wID0gY3B1X3RvX2JlMzIoMHhmZmZmZmYgPDwgOCk7CisJbWtjID0gTUxYNV9BRERSX09GKGNyZWF0ZV9ta2V5X2luLCBpbiwgbWVtb3J5X2tleV9ta2V5X2VudHJ5KTsKIAotCWVyciA9IG1seDVfY29yZV9jcmVhdGVfbWtleShkZXYtPm1kZXYsICZtdy0+bW1rZXksIGluLCBzaXplb2YoKmluKSwKLQkJCQkgICAgTlVMTCwgTlVMTCwgTlVMTCk7CisJTUxYNV9TRVQobWtjLCBta2MsIGZyZWUsIDEpOworCU1MWDVfU0VUKG1rYywgbWtjLCB0cmFuc2xhdGlvbnNfb2N0d29yZF9zaXplLCBuZGVzY3MpOworCU1MWDVfU0VUKG1rYywgbWtjLCBwZCwgdG9fbXBkKHBkKS0+cGRuKTsKKwlNTFg1X1NFVChta2MsIG1rYywgdW1yX2VuLCAxKTsKKwlNTFg1X1NFVChta2MsIG1rYywgbHIsIDEpOworCU1MWDVfU0VUKG1rYywgbWtjLCBhY2Nlc3NfbW9kZSwgTUxYNV9NS0NfQUNDRVNTX01PREVfS0xNUyk7CisJTUxYNV9TRVQobWtjLCBta2MsIGVuX3JpbnZhbCwgISEoKHR5cGUgPT0gSUJfTVdfVFlQRV8yKSkpOworCU1MWDVfU0VUKG1rYywgbWtjLCBxcG4sIDB4ZmZmZmZmKTsKKworCWVyciA9IG1seDVfY29yZV9jcmVhdGVfbWtleShkZXYtPm1kZXYsICZtdy0+bW1rZXksIGluLCBpbmxlbik7CiAJaWYgKGVycikKIAkJZ290byBmcmVlOwogCkBAIC0xODExLDcgKzE4MzMsNyBAQAogCQkJCSAgIG1yLT5kZXNjX3NpemUgKiBtci0+bWF4X2Rlc2NzLAogCQkJCSAgIERNQV9UT19ERVZJQ0UpOwogCi0JaWYgKG1yLT5hY2Nlc3NfbW9kZSA9PSBNTFg1X0FDQ0VTU19NT0RFX0tMTSkKKwlpZiAobXItPmFjY2Vzc19tb2RlID09IE1MWDVfTUtDX0FDQ0VTU19NT0RFX0tMTVMpCiAJCW4gPSBtbHg1X2liX3NnX3RvX2tsbXMobXIsIHNnLCBzZ19uZW50cywgc2dfb2Zmc2V0KTsKIAllbHNlCiAJCW4gPSBpYl9zZ190b19wYWdlcyhpYm1yLCBzZywgc2dfbmVudHMsIHNnX29mZnNldCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L3FwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9xcC5jCmluZGV4IDBkZDdkOTMuLjk1MjliNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvcXAuYwpAQCAtNzI2LDcgKzcyNiw3IEBACiBzdGF0aWMgaW50IGNyZWF0ZV91c2VyX3FwKHN0cnVjdCBtbHg1X2liX2RldiAqZGV2LCBzdHJ1Y3QgaWJfcGQgKnBkLAogCQkJICBzdHJ1Y3QgbWx4NV9pYl9xcCAqcXAsIHN0cnVjdCBpYl91ZGF0YSAqdWRhdGEsCiAJCQkgIHN0cnVjdCBpYl9xcF9pbml0X2F0dHIgKmF0dHIsCi0JCQkgIHN0cnVjdCBtbHg1X2NyZWF0ZV9xcF9tYm94X2luICoqaW4sCisJCQkgIHUzMiAqKmluLAogCQkJICBzdHJ1Y3QgbWx4NV9pYl9jcmVhdGVfcXBfcmVzcCAqcmVzcCwgaW50ICppbmxlbiwKIAkJCSAgc3RydWN0IG1seDVfaWJfcXBfYmFzZSAqYmFzZSkKIHsKQEAgLTczOSw2ICs3MzksOCBAQAogCXUzMiBvZmZzZXQgPSAwOwogCWludCB1dWFybjsKIAlpbnQgbmNvbnQgPSAwOworCV9fYmU2NCAqcGFzOworCXZvaWQgKnFwYzsKIAlpbnQgZXJyOwogCiAJZXJyID0gaWJfY29weV9mcm9tX3VkYXRhKCZ1Y21kLCB1ZGF0YSwgc2l6ZW9mKHVjbWQpKTsKQEAgLTc5NSwyMCArNzk3LDI0IEBACiAJCXVidWZmZXItPnVtZW0gPSBOVUxMOwogCX0KIAotCSppbmxlbiA9IHNpemVvZigqKmluKSArIHNpemVvZigqKCppbiktPnBhcykgKiBuY29udDsKKwkqaW5sZW4gPSBNTFg1X1NUX1NaX0JZVEVTKGNyZWF0ZV9xcF9pbikgKworCQkgTUxYNV9GTERfU1pfQllURVMoY3JlYXRlX3FwX2luLCBwYXNbMF0pICogbmNvbnQ7CiAJKmluID0gbWx4NV92emFsbG9jKCppbmxlbik7CiAJaWYgKCEqaW4pIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnJfdW1lbTsKIAl9Ci0JaWYgKHVidWZmZXItPnVtZW0pCi0JCW1seDVfaWJfcG9wdWxhdGVfcGFzKGRldiwgdWJ1ZmZlci0+dW1lbSwgcGFnZV9zaGlmdCwKLQkJCQkgICAgICgqaW4pLT5wYXMsIDApOwotCSgqaW4pLT5jdHgubG9nX3BnX3N6X3JlbW90ZV9xcG4gPQotCQljcHVfdG9fYmUzMigocGFnZV9zaGlmdCAtIE1MWDVfQURBUFRFUl9QQUdFX1NISUZUKSA8PCAyNCk7Ci0JKCppbiktPmN0eC5wYXJhbXMyID0gY3B1X3RvX2JlMzIob2Zmc2V0IDw8IDYpOwogCi0JKCppbiktPmN0eC5xcF9jb3VudGVyX3NldF91c3JfcGFnZSA9IGNwdV90b19iZTMyKHVhcl9pbmRleCk7CisJcGFzID0gKF9fYmU2NCAqKU1MWDVfQUREUl9PRihjcmVhdGVfcXBfaW4sICppbiwgcGFzKTsKKwlpZiAodWJ1ZmZlci0+dW1lbSkKKwkJbWx4NV9pYl9wb3B1bGF0ZV9wYXMoZGV2LCB1YnVmZmVyLT51bWVtLCBwYWdlX3NoaWZ0LCBwYXMsIDApOworCisJcXBjID0gTUxYNV9BRERSX09GKGNyZWF0ZV9xcF9pbiwgKmluLCBxcGMpOworCisJTUxYNV9TRVQocXBjLCBxcGMsIGxvZ19wYWdlX3NpemUsIHBhZ2Vfc2hpZnQgLSBNTFg1X0FEQVBURVJfUEFHRV9TSElGVCk7CisJTUxYNV9TRVQocXBjLCBxcGMsIHBhZ2Vfb2Zmc2V0LCBvZmZzZXQpOworCisJTUxYNV9TRVQocXBjLCBxcGMsIHVhcl9wYWdlLCB1YXJfaW5kZXgpOwogCXJlc3AtPnV1YXJfaW5kZXggPSB1dWFybjsKIAlxcC0+dXVhcm4gPSB1dWFybjsKIApAQCAtODU3LDEyICs4NjMsMTMgQEAKIHN0YXRpYyBpbnQgY3JlYXRlX2tlcm5lbF9xcChzdHJ1Y3QgbWx4NV9pYl9kZXYgKmRldiwKIAkJCSAgICBzdHJ1Y3QgaWJfcXBfaW5pdF9hdHRyICppbml0X2F0dHIsCiAJCQkgICAgc3RydWN0IG1seDVfaWJfcXAgKnFwLAotCQkJICAgIHN0cnVjdCBtbHg1X2NyZWF0ZV9xcF9tYm94X2luICoqaW4sIGludCAqaW5sZW4sCisJCQkgICAgdTMyICoqaW4sIGludCAqaW5sZW4sCiAJCQkgICAgc3RydWN0IG1seDVfaWJfcXBfYmFzZSAqYmFzZSkKIHsKIAllbnVtIG1seDVfaWJfbGF0ZW5jeV9jbGFzcyBsYyA9IE1MWDVfSUJfTEFURU5DWV9DTEFTU19MT1c7CiAJc3RydWN0IG1seDVfdXVhcl9pbmZvICp1dWFyaTsKIAlpbnQgdWFyX2luZGV4OworCXZvaWQgKnFwYzsKIAlpbnQgdXVhcm47CiAJaW50IGVycjsKIApAQCAtOTAyLDI1ICs5MDksMjkgQEAKIAl9CiAKIAlxcC0+c3EucWVuZCA9IG1seDVfZ2V0X3NlbmRfd3FlKHFwLCBxcC0+c3Eud3FlX2NudCk7Ci0JKmlubGVuID0gc2l6ZW9mKCoqaW4pICsgc2l6ZW9mKCooKmluKS0+cGFzKSAqIHFwLT5idWYubnBhZ2VzOworCSppbmxlbiA9IE1MWDVfU1RfU1pfQllURVMoY3JlYXRlX3FwX2luKSArCisJCSBNTFg1X0ZMRF9TWl9CWVRFUyhjcmVhdGVfcXBfaW4sIHBhc1swXSkgKiBxcC0+YnVmLm5wYWdlczsKIAkqaW4gPSBtbHg1X3Z6YWxsb2MoKmlubGVuKTsKIAlpZiAoISppbikgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9idWY7CiAJfQotCSgqaW4pLT5jdHgucXBfY291bnRlcl9zZXRfdXNyX3BhZ2UgPSBjcHVfdG9fYmUzMih1YXJfaW5kZXgpOwotCSgqaW4pLT5jdHgubG9nX3BnX3N6X3JlbW90ZV9xcG4gPQotCQljcHVfdG9fYmUzMigocXAtPmJ1Zi5wYWdlX3NoaWZ0IC0gTUxYNV9BREFQVEVSX1BBR0VfU0hJRlQpIDw8IDI0KTsKKworCXFwYyA9IE1MWDVfQUREUl9PRihjcmVhdGVfcXBfaW4sICppbiwgcXBjKTsKKwlNTFg1X1NFVChxcGMsIHFwYywgdWFyX3BhZ2UsIHVhcl9pbmRleCk7CisJTUxYNV9TRVQocXBjLCBxcGMsIGxvZ19wYWdlX3NpemUsIHFwLT5idWYucGFnZV9zaGlmdCAtIE1MWDVfQURBUFRFUl9QQUdFX1NISUZUKTsKKwogCS8qIFNldCAiZmFzdCByZWdpc3RyYXRpb24gZW5hYmxlZCIgZm9yIGFsbCBrZXJuZWwgUVBzICovCi0JKCppbiktPmN0eC5wYXJhbXMxIHw9IGNwdV90b19iZTMyKDEgPDwgMTEpOwotCSgqaW4pLT5jdHguc3FfY3JxX3NpemUgfD0gY3B1X3RvX2JlMTYoMSA8PCA0KTsKKwlNTFg1X1NFVChxcGMsIHFwYywgZnJlLCAxKTsKKwlNTFg1X1NFVChxcGMsIHFwYywgcmxreSwgMSk7CiAKIAlpZiAoaW5pdF9hdHRyLT5jcmVhdGVfZmxhZ3MgJiBtbHg1X2liX2NyZWF0ZV9xcF9zcXBuX3FwMSgpKSB7Ci0JCSgqaW4pLT5jdHguZGV0aF9zcXBuID0gY3B1X3RvX2JlMzIoMSk7CisJCU1MWDVfU0VUKHFwYywgcXBjLCBkZXRoX3NxcG4sIDEpOwogCQlxcC0+ZmxhZ3MgfD0gTUxYNV9JQl9RUF9TUVBOX1FQMTsKIAl9CiAKLQltbHg1X2ZpbGxfcGFnZV9hcnJheSgmcXAtPmJ1ZiwgKCppbiktPnBhcyk7CisJbWx4NV9maWxsX3BhZ2VfYXJyYXkoJnFwLT5idWYsCisJCQkgICAgIChfX2JlNjQgKilNTFg1X0FERFJfT0YoY3JlYXRlX3FwX2luLCAqaW4sIHBhcykpOwogCiAJZXJyID0gbWx4NV9kYl9hbGxvYyhkZXYtPm1kZXYsICZxcC0+ZGIpOwogCWlmIChlcnIpIHsKQEAgLTk3NCwxNSArOTg1LDE1IEBACiAJZnJlZV91dWFyKCZkZXYtPm1kZXYtPnByaXYudXVhcmksIHFwLT5iZi0+dXVhcm4pOwogfQogCi1zdGF0aWMgX19iZTMyIGdldF9yeF90eXBlKHN0cnVjdCBtbHg1X2liX3FwICpxcCwgc3RydWN0IGliX3FwX2luaXRfYXR0ciAqYXR0cikKK3N0YXRpYyB1MzIgZ2V0X3J4X3R5cGUoc3RydWN0IG1seDVfaWJfcXAgKnFwLCBzdHJ1Y3QgaWJfcXBfaW5pdF9hdHRyICphdHRyKQogewogCWlmIChhdHRyLT5zcnEgfHwgKGF0dHItPnFwX3R5cGUgPT0gSUJfUVBUX1hSQ19UR1QpIHx8CiAJICAgIChhdHRyLT5xcF90eXBlID09IElCX1FQVF9YUkNfSU5JKSkKLQkJcmV0dXJuIGNwdV90b19iZTMyKE1MWDVfU1JRX1JRKTsKKwkJcmV0dXJuIE1MWDVfU1JRX1JROwogCWVsc2UgaWYgKCFxcC0+aGFzX3JxKQotCQlyZXR1cm4gY3B1X3RvX2JlMzIoTUxYNV9aRVJPX0xFTl9SUSk7CisJCXJldHVybiBNTFg1X1pFUk9fTEVOX1JROwogCWVsc2UKLQkJcmV0dXJuIGNwdV90b19iZTMyKE1MWDVfTk9OX1pFUk9fUlEpOworCQlyZXR1cm4gTUxYNV9OT05fWkVST19SUTsKIH0KIAogc3RhdGljIGludCBpc19jb25uZWN0ZWQoZW51bSBpYl9xcF90eXBlIHFwX3R5cGUpCkBAIC05OTYsMTMgKzEwMDcsMTAgQEAKIHN0YXRpYyBpbnQgY3JlYXRlX3Jhd19wYWNrZXRfcXBfdGlzKHN0cnVjdCBtbHg1X2liX2RldiAqZGV2LAogCQkJCSAgICBzdHJ1Y3QgbWx4NV9pYl9zcSAqc3EsIHUzMiB0ZG4pCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcoY3JlYXRlX3Rpc19pbildOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGNyZWF0ZV90aXNfaW4pXSA9IHswfTsKIAl2b2lkICp0aXNjID0gTUxYNV9BRERSX09GKGNyZWF0ZV90aXNfaW4sIGluLCBjdHgpOwogCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKLQogCU1MWDVfU0VUKHRpc2MsIHRpc2MsIHRyYW5zcG9ydF9kb21haW4sIHRkbik7Ci0KIAlyZXR1cm4gbWx4NV9jb3JlX2NyZWF0ZV90aXMoZGV2LT5tZGV2LCBpbiwgc2l6ZW9mKGluKSwgJnNxLT50aXNuKTsKIH0KIApAQCAtMTE5MSw3ICsxMTk5LDcgQEAKIH0KIAogc3RhdGljIGludCBjcmVhdGVfcmF3X3BhY2tldF9xcChzdHJ1Y3QgbWx4NV9pYl9kZXYgKmRldiwgc3RydWN0IG1seDVfaWJfcXAgKnFwLAotCQkJCXN0cnVjdCBtbHg1X2NyZWF0ZV9xcF9tYm94X2luICppbiwKKwkJCQl1MzIgKmluLAogCQkJCXN0cnVjdCBpYl9wZCAqcGQpCiB7CiAJc3RydWN0IG1seDVfaWJfcmF3X3BhY2tldF9xcCAqcmF3X3BhY2tldF9xcCA9ICZxcC0+cmF3X3BhY2tldF9xcDsKQEAgLTE0NDksNiArMTQ1Nyw3IEBACiAJa3ZmcmVlKGluKTsKIAkvKiBxcG4gaXMgcmVzZXJ2ZWQgZm9yIHRoYXQgUVAgKi8KIAlxcC0+dHJhbnNfcXAuYmFzZS5tcXAucXBuID0gMDsKKwlxcC0+ZmxhZ3MgfD0gTUxYNV9JQl9RUF9SU1M7CiAJcmV0dXJuIDA7CiAKIGVycjoKQEAgLTE0NjEsMTggKzE0NzAsMTggQEAKIAkJCSAgICBzdHJ1Y3QgaWJfdWRhdGEgKnVkYXRhLCBzdHJ1Y3QgbWx4NV9pYl9xcCAqcXApCiB7CiAJc3RydWN0IG1seDVfaWJfcmVzb3VyY2VzICpkZXZyID0gJmRldi0+ZGV2cjsKKwlpbnQgaW5sZW4gPSBNTFg1X1NUX1NaX0JZVEVTKGNyZWF0ZV9xcF9pbik7CiAJc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYgPSBkZXYtPm1kZXY7Ci0Jc3RydWN0IG1seDVfaWJfcXBfYmFzZSAqYmFzZTsKIAlzdHJ1Y3QgbWx4NV9pYl9jcmVhdGVfcXBfcmVzcCByZXNwOwotCXN0cnVjdCBtbHg1X2NyZWF0ZV9xcF9tYm94X2luICppbjsKLQlzdHJ1Y3QgbWx4NV9pYl9jcmVhdGVfcXAgdWNtZDsKIAlzdHJ1Y3QgbWx4NV9pYl9jcSAqc2VuZF9jcTsKIAlzdHJ1Y3QgbWx4NV9pYl9jcSAqcmVjdl9jcTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBpbmxlbiA9IHNpemVvZigqaW4pOwotCWludCBlcnI7CiAJdTMyIHVpZHggPSBNTFg1X0lCX0RFRkFVTFRfVUlEWDsKKwlzdHJ1Y3QgbWx4NV9pYl9jcmVhdGVfcXAgdWNtZDsKKwlzdHJ1Y3QgbWx4NV9pYl9xcF9iYXNlICpiYXNlOwogCXZvaWQgKnFwYzsKKwl1MzIgKmluOworCWludCBlcnI7CiAKIAliYXNlID0gaW5pdF9hdHRyLT5xcF90eXBlID09IElCX1FQVF9SQVdfUEFDS0VUID8KIAkgICAgICAgJnFwLT5yYXdfcGFja2V0X3FwLnJxLmJhc2UgOgpAQCAtMTYwMCw3ICsxNjA5LDcgQEAKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CiAJfSBlbHNlIHsKLQkJaW4gPSBtbHg1X3Z6YWxsb2Moc2l6ZW9mKCppbikpOworCQlpbiA9IG1seDVfdnphbGxvYyhpbmxlbik7CiAJCWlmICghaW4pCiAJCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTYxMCwyNiArMTYxOSwyOSBAQAogCWlmIChpc19zcXAoaW5pdF9hdHRyLT5xcF90eXBlKSkKIAkJcXAtPnBvcnQgPSBpbml0X2F0dHItPnBvcnRfbnVtOwogCi0JaW4tPmN0eC5mbGFncyA9IGNwdV90b19iZTMyKHRvX21seDVfc3QoaW5pdF9hdHRyLT5xcF90eXBlKSA8PCAxNiB8Ci0JCQkJICAgIE1MWDVfUVBfUE1fTUlHUkFURUQgPDwgMTEpOworCXFwYyA9IE1MWDVfQUREUl9PRihjcmVhdGVfcXBfaW4sIGluLCBxcGMpOworCisJTUxYNV9TRVQocXBjLCBxcGMsIHN0LCB0b19tbHg1X3N0KGluaXRfYXR0ci0+cXBfdHlwZSkpOworCU1MWDVfU0VUKHFwYywgcXBjLCBwbV9zdGF0ZSwgTUxYNV9RUF9QTV9NSUdSQVRFRCk7CiAKIAlpZiAoaW5pdF9hdHRyLT5xcF90eXBlICE9IE1MWDVfSUJfUVBUX1JFR19VTVIpCi0JCWluLT5jdHguZmxhZ3NfcGQgPSBjcHVfdG9fYmUzMih0b19tcGQocGQgPyBwZCA6IGRldnItPnAwKS0+cGRuKTsKKwkJTUxYNV9TRVQocXBjLCBxcGMsIHBkLCB0b19tcGQocGQgPyBwZCA6IGRldnItPnAwKS0+cGRuKTsKIAllbHNlCi0JCWluLT5jdHguZmxhZ3NfcGQgPSBjcHVfdG9fYmUzMihNTFg1X1FQX0xBVF9TRU5TSVRJVkUpOworCQlNTFg1X1NFVChxcGMsIHFwYywgbGF0ZW5jeV9zZW5zaXRpdmUsIDEpOworCiAKIAlpZiAocXAtPndxX3NpZykKLQkJaW4tPmN0eC5mbGFnc19wZCB8PSBjcHVfdG9fYmUzMihNTFg1X1FQX0VOQUJMRV9TSUcpOworCQlNTFg1X1NFVChxcGMsIHFwYywgd3Ffc2lnbmF0dXJlLCAxKTsKIAogCWlmIChxcC0+ZmxhZ3MgJiBNTFg1X0lCX1FQX0JMT0NLX01VTFRJQ0FTVF9MT09QQkFDSykKLQkJaW4tPmN0eC5mbGFnc19wZCB8PSBjcHVfdG9fYmUzMihNTFg1X1FQX0JMT0NLX01DQVNUKTsKKwkJTUxYNV9TRVQocXBjLCBxcGMsIGJsb2NrX2xiX21jLCAxKTsKIAogCWlmIChxcC0+ZmxhZ3MgJiBNTFg1X0lCX1FQX0NST1NTX0NIQU5ORUwpCi0JCWluLT5jdHgucGFyYW1zMiB8PSBjcHVfdG9fYmUzMihNTFg1X1FQX0JJVF9DQ19NQVNURVIpOworCQlNTFg1X1NFVChxcGMsIHFwYywgY2RfbWFzdGVyLCAxKTsKIAlpZiAocXAtPmZsYWdzICYgTUxYNV9JQl9RUF9NQU5BR0VEX1NFTkQpCi0JCWluLT5jdHgucGFyYW1zMiB8PSBjcHVfdG9fYmUzMihNTFg1X1FQX0JJVF9DQ19TTEFWRV9TRU5EKTsKKwkJTUxYNV9TRVQocXBjLCBxcGMsIGNkX3NsYXZlX3NlbmQsIDEpOwogCWlmIChxcC0+ZmxhZ3MgJiBNTFg1X0lCX1FQX01BTkFHRURfUkVDVikKLQkJaW4tPmN0eC5wYXJhbXMyIHw9IGNwdV90b19iZTMyKE1MWDVfUVBfQklUX0NDX1NMQVZFX1JFQ1YpOworCQlNTFg1X1NFVChxcGMsIHFwYywgY2Rfc2xhdmVfcmVjZWl2ZSwgMSk7CiAKIAlpZiAocXAtPnNjYXRfY3FlICYmIGlzX2Nvbm5lY3RlZChpbml0X2F0dHItPnFwX3R5cGUpKSB7CiAJCWludCByY3FlX3N6OwpAQCAtMTYzOSw3MSArMTY1MSw2OCBAQAogCQlzY3FlX3N6ID0gbWx4NV9pYl9nZXRfY3FlX3NpemUoZGV2LCBpbml0X2F0dHItPnNlbmRfY3EpOwogCiAJCWlmIChyY3FlX3N6ID09IDEyOCkKLQkJCWluLT5jdHguY3NfcmVzID0gTUxYNV9SRVNfU0NBVF9EQVRBNjRfQ1FFOworCQkJTUxYNV9TRVQocXBjLCBxcGMsIGNzX3JlcywgTUxYNV9SRVNfU0NBVF9EQVRBNjRfQ1FFKTsKIAkJZWxzZQotCQkJaW4tPmN0eC5jc19yZXMgPSBNTFg1X1JFU19TQ0FUX0RBVEEzMl9DUUU7CisJCQlNTFg1X1NFVChxcGMsIHFwYywgY3NfcmVzLCBNTFg1X1JFU19TQ0FUX0RBVEEzMl9DUUUpOwogCiAJCWlmIChpbml0X2F0dHItPnNxX3NpZ190eXBlID09IElCX1NJR05BTF9BTExfV1IpIHsKIAkJCWlmIChzY3FlX3N6ID09IDEyOCkKLQkJCQlpbi0+Y3R4LmNzX3JlcSA9IE1MWDVfUkVRX1NDQVRfREFUQTY0X0NRRTsKKwkJCQlNTFg1X1NFVChxcGMsIHFwYywgY3NfcmVxLCBNTFg1X1JFUV9TQ0FUX0RBVEE2NF9DUUUpOwogCQkJZWxzZQotCQkJCWluLT5jdHguY3NfcmVxID0gTUxYNV9SRVFfU0NBVF9EQVRBMzJfQ1FFOworCQkJCU1MWDVfU0VUKHFwYywgcXBjLCBjc19yZXEsIE1MWDVfUkVRX1NDQVRfREFUQTMyX0NRRSk7CiAJCX0KIAl9CiAKIAlpZiAocXAtPnJxLndxZV9jbnQpIHsKLQkJaW4tPmN0eC5ycV9zaXplX3N0cmlkZSA9IChxcC0+cnEud3FlX3NoaWZ0IC0gNCk7Ci0JCWluLT5jdHgucnFfc2l6ZV9zdHJpZGUgfD0gaWxvZzIocXAtPnJxLndxZV9jbnQpIDw8IDM7CisJCU1MWDVfU0VUKHFwYywgcXBjLCBsb2dfcnFfc3RyaWRlLCBxcC0+cnEud3FlX3NoaWZ0IC0gNCk7CisJCU1MWDVfU0VUKHFwYywgcXBjLCBsb2dfcnFfc2l6ZSwgaWxvZzIocXAtPnJxLndxZV9jbnQpKTsKIAl9CiAKLQlpbi0+Y3R4LnJxX3R5cGVfc3JxbiA9IGdldF9yeF90eXBlKHFwLCBpbml0X2F0dHIpOworCU1MWDVfU0VUKHFwYywgcXBjLCBycV90eXBlLCBnZXRfcnhfdHlwZShxcCwgaW5pdF9hdHRyKSk7CiAKIAlpZiAocXAtPnNxLndxZV9jbnQpCi0JCWluLT5jdHguc3FfY3JxX3NpemUgfD0gY3B1X3RvX2JlMTYoaWxvZzIocXAtPnNxLndxZV9jbnQpIDw8IDExKTsKKwkJTUxYNV9TRVQocXBjLCBxcGMsIGxvZ19zcV9zaXplLCBpbG9nMihxcC0+c3Eud3FlX2NudCkpOwogCWVsc2UKLQkJaW4tPmN0eC5zcV9jcnFfc2l6ZSB8PSBjcHVfdG9fYmUxNigweDgwMDApOworCQlNTFg1X1NFVChxcGMsIHFwYywgbm9fc3EsIDEpOwogCiAJLyogU2V0IGRlZmF1bHQgcmVzb3VyY2VzICovCiAJc3dpdGNoIChpbml0X2F0dHItPnFwX3R5cGUpIHsKIAljYXNlIElCX1FQVF9YUkNfVEdUOgotCQlpbi0+Y3R4LmNxbl9yZWN2ID0gY3B1X3RvX2JlMzIodG9fbWNxKGRldnItPmMwKS0+bWNxLmNxbik7Ci0JCWluLT5jdHguY3FuX3NlbmQgPSBjcHVfdG9fYmUzMih0b19tY3EoZGV2ci0+YzApLT5tY3EuY3FuKTsKLQkJaW4tPmN0eC5ycV90eXBlX3NycW4gfD0gY3B1X3RvX2JlMzIodG9fbXNycShkZXZyLT5zMCktPm1zcnEuc3Jxbik7Ci0JCWluLT5jdHgueHJjZCA9IGNwdV90b19iZTMyKHRvX214cmNkKGluaXRfYXR0ci0+eHJjZCktPnhyY2RuKTsKKwkJTUxYNV9TRVQocXBjLCBxcGMsIGNxbl9yY3YsIHRvX21jcShkZXZyLT5jMCktPm1jcS5jcW4pOworCQlNTFg1X1NFVChxcGMsIHFwYywgY3FuX3NuZCwgdG9fbWNxKGRldnItPmMwKS0+bWNxLmNxbik7CisJCU1MWDVfU0VUKHFwYywgcXBjLCBzcnFuX3JtcG5feHJxbiwgdG9fbXNycShkZXZyLT5zMCktPm1zcnEuc3Jxbik7CisJCU1MWDVfU0VUKHFwYywgcXBjLCB4cmNkLCB0b19teHJjZChpbml0X2F0dHItPnhyY2QpLT54cmNkbik7CiAJCWJyZWFrOwogCWNhc2UgSUJfUVBUX1hSQ19JTkk6Ci0JCWluLT5jdHguY3FuX3JlY3YgPSBjcHVfdG9fYmUzMih0b19tY3EoZGV2ci0+YzApLT5tY3EuY3FuKTsKLQkJaW4tPmN0eC54cmNkID0gY3B1X3RvX2JlMzIodG9fbXhyY2QoZGV2ci0+eDEpLT54cmNkbik7Ci0JCWluLT5jdHgucnFfdHlwZV9zcnFuIHw9IGNwdV90b19iZTMyKHRvX21zcnEoZGV2ci0+czApLT5tc3JxLnNycW4pOworCQlNTFg1X1NFVChxcGMsIHFwYywgY3FuX3JjdiwgdG9fbWNxKGRldnItPmMwKS0+bWNxLmNxbik7CisJCU1MWDVfU0VUKHFwYywgcXBjLCB4cmNkLCB0b19teHJjZChkZXZyLT54MSktPnhyY2RuKTsKKwkJTUxYNV9TRVQocXBjLCBxcGMsIHNycW5fcm1wbl94cnFuLCB0b19tc3JxKGRldnItPnMwKS0+bXNycS5zcnFuKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJaWYgKGluaXRfYXR0ci0+c3JxKSB7Ci0JCQlpbi0+Y3R4LnhyY2QgPSBjcHVfdG9fYmUzMih0b19teHJjZChkZXZyLT54MCktPnhyY2RuKTsKLQkJCWluLT5jdHgucnFfdHlwZV9zcnFuIHw9IGNwdV90b19iZTMyKHRvX21zcnEoaW5pdF9hdHRyLT5zcnEpLT5tc3JxLnNycW4pOworCQkJTUxYNV9TRVQocXBjLCBxcGMsIHhyY2QsIHRvX214cmNkKGRldnItPngwKS0+eHJjZG4pOworCQkJTUxYNV9TRVQocXBjLCBxcGMsIHNycW5fcm1wbl94cnFuLCB0b19tc3JxKGluaXRfYXR0ci0+c3JxKS0+bXNycS5zcnFuKTsKIAkJfSBlbHNlIHsKLQkJCWluLT5jdHgueHJjZCA9IGNwdV90b19iZTMyKHRvX214cmNkKGRldnItPngxKS0+eHJjZG4pOwotCQkJaW4tPmN0eC5ycV90eXBlX3NycW4gfD0KLQkJCQljcHVfdG9fYmUzMih0b19tc3JxKGRldnItPnMxKS0+bXNycS5zcnFuKTsKKwkJCU1MWDVfU0VUKHFwYywgcXBjLCB4cmNkLCB0b19teHJjZChkZXZyLT54MSktPnhyY2RuKTsKKwkJCU1MWDVfU0VUKHFwYywgcXBjLCBzcnFuX3JtcG5feHJxbiwgdG9fbXNycShkZXZyLT5zMSktPm1zcnEuc3Jxbik7CiAJCX0KIAl9CiAKIAlpZiAoaW5pdF9hdHRyLT5zZW5kX2NxKQotCQlpbi0+Y3R4LmNxbl9zZW5kID0gY3B1X3RvX2JlMzIodG9fbWNxKGluaXRfYXR0ci0+c2VuZF9jcSktPm1jcS5jcW4pOworCQlNTFg1X1NFVChxcGMsIHFwYywgY3FuX3NuZCwgdG9fbWNxKGluaXRfYXR0ci0+c2VuZF9jcSktPm1jcS5jcW4pOwogCiAJaWYgKGluaXRfYXR0ci0+cmVjdl9jcSkKLQkJaW4tPmN0eC5jcW5fcmVjdiA9IGNwdV90b19iZTMyKHRvX21jcShpbml0X2F0dHItPnJlY3ZfY3EpLT5tY3EuY3FuKTsKKwkJTUxYNV9TRVQocXBjLCBxcGMsIGNxbl9yY3YsIHRvX21jcShpbml0X2F0dHItPnJlY3ZfY3EpLT5tY3EuY3FuKTsKIAotCWluLT5jdHguZGJfcmVjX2FkZHIgPSBjcHVfdG9fYmU2NChxcC0+ZGIuZG1hKTsKKwlNTFg1X1NFVDY0KHFwYywgcXBjLCBkYnJfYWRkciwgcXAtPmRiLmRtYSk7CiAKLQlpZiAoTUxYNV9DQVBfR0VOKG1kZXYsIGNxZV92ZXJzaW9uKSA9PSBNTFg1X0NRRV9WRVJTSU9OX1YxKSB7Ci0JCXFwYyA9IE1MWDVfQUREUl9PRihjcmVhdGVfcXBfaW4sIGluLCBxcGMpOwotCQkvKiAweGZmZmZmZiBtZWFucyB3ZSBhc2sgdG8gd29yayB3aXRoIGNxZSB2ZXJzaW9uIDAgKi8KKwkvKiAweGZmZmZmZiBtZWFucyB3ZSBhc2sgdG8gd29yayB3aXRoIGNxZSB2ZXJzaW9uIDAgKi8KKwlpZiAoTUxYNV9DQVBfR0VOKG1kZXYsIGNxZV92ZXJzaW9uKSA9PSBNTFg1X0NRRV9WRVJTSU9OX1YxKQogCQlNTFg1X1NFVChxcGMsIHFwYywgdXNlcl9pbmRleCwgdWlkeCk7Ci0JfQorCiAJLyogd2UgdXNlIElCX1FQX0NSRUFURV9JUE9JQl9VRF9MU08gdG8gaW5kaWNhdGVzIGlwb2liIHFwICovCiAJaWYgKGluaXRfYXR0ci0+cXBfdHlwZSA9PSBJQl9RUFRfVUQgJiYKIAkgICAgKGluaXRfYXR0ci0+Y3JlYXRlX2ZsYWdzICYgSUJfUVBfQ1JFQVRFX0lQT0lCX1VEX0xTTykpIHsKLQkJcXBjID0gTUxYNV9BRERSX09GKGNyZWF0ZV9xcF9pbiwgaW4sIHFwYyk7CiAJCU1MWDVfU0VUKHFwYywgcXBjLCB1bHBfc3RhdGVsZXNzX29mZmxvYWRfbW9kZSwgMSk7CiAJCXFwLT5mbGFncyB8PSBNTFg1X0lCX1FQX0xTTzsKIAl9CkBAIC0xODYwLDcgKzE4NjksNiBAQAogewogCXN0cnVjdCBtbHg1X2liX2NxICpzZW5kX2NxLCAqcmVjdl9jcTsKIAlzdHJ1Y3QgbWx4NV9pYl9xcF9iYXNlICpiYXNlID0gJnFwLT50cmFuc19xcC5iYXNlOwotCXN0cnVjdCBtbHg1X21vZGlmeV9xcF9tYm94X2luICppbjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBlcnI7CiAKQEAgLTE4NzMsMTYgKzE4ODEsMTIgQEAKIAkgICAgICAgJnFwLT5yYXdfcGFja2V0X3FwLnJxLmJhc2UgOgogCSAgICAgICAmcXAtPnRyYW5zX3FwLmJhc2U7CiAKLQlpbiA9IGt6YWxsb2Moc2l6ZW9mKCppbiksIEdGUF9LRVJORUwpOwotCWlmICghaW4pCi0JCXJldHVybjsKLQogCWlmIChxcC0+c3RhdGUgIT0gSUJfUVBTX1JFU0VUKSB7CiAJCWlmIChxcC0+aWJxcC5xcF90eXBlICE9IElCX1FQVF9SQVdfUEFDS0VUKSB7CiAJCQltbHg1X2liX3FwX2Rpc2FibGVfcGFnZWZhdWx0cyhxcCk7CiAJCQllcnIgPSBtbHg1X2NvcmVfcXBfbW9kaWZ5KGRldi0+bWRldiwKLQkJCQkJCSAgTUxYNV9DTURfT1BfMlJTVF9RUCwgaW4sIDAsCi0JCQkJCQkgICZiYXNlLT5tcXApOworCQkJCQkJICBNTFg1X0NNRF9PUF8yUlNUX1FQLCAwLAorCQkJCQkJICBOVUxMLCAmYmFzZS0+bXFwKTsKIAkJfSBlbHNlIHsKIAkJCWVyciA9IG1vZGlmeV9yYXdfcGFja2V0X3FwKGRldiwgcXAsCiAJCQkJCQkgICBNTFg1X0NNRF9PUF8yUlNUX1FQKTsKQEAgLTE5MjQsOCArMTkyOCw2IEBACiAJCQkJICAgICBiYXNlLT5tcXAucXBuKTsKIAl9CiAKLQlrZnJlZShpbik7Ci0KIAlpZiAocXAtPmNyZWF0ZV90eXBlID09IE1MWDVfUVBfS0VSTkVMKQogCQlkZXN0cm95X3FwX2tlcm5lbChkZXYsIHFwKTsKIAllbHNlIGlmIChxcC0+Y3JlYXRlX3R5cGUgPT0gTUxYNV9RUF9VU0VSKQpAQCAtMjUxMSw3ICsyNTEzLDYgQEAKIAlzdHJ1Y3QgbWx4NV9pYl9xcF9iYXNlICpiYXNlID0gJnFwLT50cmFuc19xcC5iYXNlOwogCXN0cnVjdCBtbHg1X2liX2NxICpzZW5kX2NxLCAqcmVjdl9jcTsKIAlzdHJ1Y3QgbWx4NV9xcF9jb250ZXh0ICpjb250ZXh0OwotCXN0cnVjdCBtbHg1X21vZGlmeV9xcF9tYm94X2luICppbjsKIAlzdHJ1Y3QgbWx4NV9pYl9wZCAqcGQ7CiAJZW51bSBtbHg1X3FwX3N0YXRlIG1seDVfY3VyLCBtbHg1X25ldzsKIAllbnVtIG1seDVfcXBfb3B0cGFyIG9wdHBhcjsKQEAgLTI1MjAsMTEgKzI1MjEsMTAgQEAKIAlpbnQgZXJyOwogCXUxNiBvcDsKIAotCWluID0ga3phbGxvYyhzaXplb2YoKmluKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpbikKKwljb250ZXh0ID0ga3phbGxvYyhzaXplb2YoKmNvbnRleHQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNvbnRleHQpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JY29udGV4dCA9ICZpbi0+Y3R4OwogCWVyciA9IHRvX21seDVfc3QoaWJxcC0+cXBfdHlwZSk7CiAJaWYgKGVyciA8IDApIHsKIAkJbWx4NV9pYl9kYmcoZGV2LCAidW5zdXBwb3J0ZWQgcXAgdHlwZSAlZFxuIiwgaWJxcC0+cXBfdHlwZSk7CkBAIC0yNjg5LDEyICsyNjg5LDExIEBACiAJb3AgPSBvcHRhYlttbHg1X2N1cl1bbWx4NV9uZXddOwogCW9wdHBhciA9IGliX21hc2tfdG9fbWx4NV9vcHQoYXR0cl9tYXNrKTsKIAlvcHRwYXIgJj0gb3B0X21hc2tbbWx4NV9jdXJdW21seDVfbmV3XVttbHg1X3N0XTsKLQlpbi0+b3B0cGFyYW0gPSBjcHVfdG9fYmUzMihvcHRwYXIpOwogCiAJaWYgKHFwLT5pYnFwLnFwX3R5cGUgPT0gSUJfUVBUX1JBV19QQUNLRVQpCiAJCWVyciA9IG1vZGlmeV9yYXdfcGFja2V0X3FwKGRldiwgcXAsIG9wKTsKIAllbHNlCi0JCWVyciA9IG1seDVfY29yZV9xcF9tb2RpZnkoZGV2LT5tZGV2LCBvcCwgaW4sIHNxZF9ldmVudCwKKwkJZXJyID0gbWx4NV9jb3JlX3FwX21vZGlmeShkZXYtPm1kZXYsIG9wLCBvcHRwYXIsIGNvbnRleHQsCiAJCQkJCSAgJmJhc2UtPm1xcCk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CkBAIC0yNzM1LDcgKzI3MzQsNyBAQAogCX0KIAogb3V0OgotCWtmcmVlKGluKTsKKwlrZnJlZShjb250ZXh0KTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yOTY4LDcgKzI5NjcsNyBAQAogCiAJbWVtc2V0KHVtciwgMCwgc2l6ZW9mKCp1bXIpKTsKIAotCWlmIChtci0+YWNjZXNzX21vZGUgPT0gTUxYNV9BQ0NFU1NfTU9ERV9LTE0pCisJaWYgKG1yLT5hY2Nlc3NfbW9kZSA9PSBNTFg1X01LQ19BQ0NFU1NfTU9ERV9LTE1TKQogCQkvKiBLTE1zIHRha2UgdHdpY2UgdGhlIHNpemUgb2YgTVRUcyAqLwogCQluZGVzY3MgKj0gMjsKIApAQCAtMzExMSw5ICszMTEwLDkgQEAKIAogCW1lbXNldChzZWcsIDAsIHNpemVvZigqc2VnKSk7CiAKLQlpZiAobXItPmFjY2Vzc19tb2RlID09IE1MWDVfQUNDRVNTX01PREVfTVRUKQorCWlmIChtci0+YWNjZXNzX21vZGUgPT0gTUxYNV9NS0NfQUNDRVNTX01PREVfTVRUKQogCQlzZWctPmxvZzJfcGFnZV9zaXplID0gaWxvZzIobXItPmlibXIucGFnZV9zaXplKTsKLQllbHNlIGlmIChtci0+YWNjZXNzX21vZGUgPT0gTUxYNV9BQ0NFU1NfTU9ERV9LTE0pCisJZWxzZSBpZiAobXItPmFjY2Vzc19tb2RlID09IE1MWDVfTUtDX0FDQ0VTU19NT0RFX0tMTVMpCiAJCS8qIEtMTXMgdGFrZSB0d2ljZSB0aGUgc2l6ZSBvZiBNVFRzICovCiAJCW5kZXNjcyAqPSAyOwogCkBAIC0zNDU0LDcgKzM0NTMsNyBAQAogCW1lbXNldChzZWcsIDAsIHNpemVvZigqc2VnKSk7CiAKIAlzZWctPmZsYWdzID0gZ2V0X3Vtcl9mbGFncyh3ci0+YWNjZXNzX2ZsYWdzKSB8Ci0JCQkJICAgTUxYNV9BQ0NFU1NfTU9ERV9LTE07CisJCQkJICAgTUxYNV9NS0NfQUNDRVNTX01PREVfS0xNUzsKIAlzZWctPnFwbl9ta2V5N18wID0gY3B1X3RvX2JlMzIoKHNpZ19rZXkgJiAweGZmKSB8IDB4ZmZmZmZmMDApOwogCXNlZy0+ZmxhZ3NfcGQgPSBjcHVfdG9fYmUzMihNTFg1X01LRVlfUkVNT1RFX0lOVkFMIHwgc2lnZXJyIDw8IDI2IHwKIAkJCQkgICAgTUxYNV9NS0VZX0JTRl9FTiB8IHBkbik7CkBAIC0zNjU4LDEyICszNjU3LDggQEAKIAkJICAgICBzdHJ1Y3QgaWJfc2VuZF93ciAqd3IsIHVuc2lnbmVkICppZHgsCiAJCSAgICAgaW50ICpzaXplLCBpbnQgbnJlcSkKIHsKLQlpbnQgZXJyID0gMDsKLQotCWlmICh1bmxpa2VseShtbHg1X3dxX292ZXJmbG93KCZxcC0+c3EsIG5yZXEsIHFwLT5pYnFwLnNlbmRfY3EpKSkgewotCQllcnIgPSAtRU5PTUVNOwotCQlyZXR1cm4gZXJyOwotCX0KKwlpZiAodW5saWtlbHkobWx4NV93cV9vdmVyZmxvdygmcXAtPnNxLCBucmVxLCBxcC0+aWJxcC5zZW5kX2NxKSkpCisJCXJldHVybiAtRU5PTUVNOwogCiAJKmlkeCA9IHFwLT5zcS5jdXJfcG9zdCAmIChxcC0+c3Eud3FlX2NudCAtIDEpOwogCSpzZWcgPSBtbHg1X2dldF9zZW5kX3dxZShxcCwgKmlkeCk7CkBAIC0zNjc5LDcgKzM2NzQsNyBAQAogCSpzZWcgKz0gc2l6ZW9mKCoqY3RybCk7CiAJKnNpemUgPSBzaXplb2YoKipjdHJsKSAvIDE2OwogCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgZmluaXNoX3dxZShzdHJ1Y3QgbWx4NV9pYl9xcCAqcXAsCkBAIC0zNzU4LDcgKzM3NTMsNyBAQAogCQludW1fc2dlID0gd3ItPm51bV9zZ2U7CiAJCWlmICh1bmxpa2VseShudW1fc2dlID4gcXAtPnNxLm1heF9ncykpIHsKIAkJCW1seDVfaWJfd2FybihkZXYsICJcbiIpOwotCQkJZXJyID0gLUVOT01FTTsKKwkJCWVyciA9IC1FSU5WQUw7CiAJCQkqYmFkX3dyID0gd3I7CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtNDMyMCwyMSArNDMxNSwyNCBAQAogc3RhdGljIGludCBxdWVyeV9xcF9hdHRyKHN0cnVjdCBtbHg1X2liX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9pYl9xcCAqcXAsCiAJCQkgc3RydWN0IGliX3FwX2F0dHIgKnFwX2F0dHIpCiB7Ci0Jc3RydWN0IG1seDVfcXVlcnlfcXBfbWJveF9vdXQgKm91dGI7CisJaW50IG91dGxlbiA9IE1MWDVfU1RfU1pfQllURVMocXVlcnlfcXBfb3V0KTsKIAlzdHJ1Y3QgbWx4NV9xcF9jb250ZXh0ICpjb250ZXh0OwogCWludCBtbHg1X3N0YXRlOworCXUzMiAqb3V0YjsKIAlpbnQgZXJyID0gMDsKIAotCW91dGIgPSBremFsbG9jKHNpemVvZigqb3V0YiksIEdGUF9LRVJORUwpOworCW91dGIgPSBremFsbG9jKG91dGxlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFvdXRiKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWNvbnRleHQgPSAmb3V0Yi0+Y3R4OwogCWVyciA9IG1seDVfY29yZV9xcF9xdWVyeShkZXYtPm1kZXYsICZxcC0+dHJhbnNfcXAuYmFzZS5tcXAsIG91dGIsCi0JCQkJIHNpemVvZigqb3V0YikpOworCQkJCSBvdXRsZW4pOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCisJLyogRklYTUU6IHVzZSBNTFg1X0dFVCByYXRoZXIgdGhhbiBtbHg1X3FwX2NvbnRleHQgbWFudWFsIHN0cnVjdCAqLworCWNvbnRleHQgPSAoc3RydWN0IG1seDVfcXBfY29udGV4dCAqKU1MWDVfQUREUl9PRihxdWVyeV9xcF9vdXQsIG91dGIsIHFwYyk7CisKIAltbHg1X3N0YXRlID0gYmUzMl90b19jcHUoY29udGV4dC0+ZmxhZ3MpID4+IDI4OwogCiAJcXAtPnN0YXRlCQkgICAgID0gdG9faWJfcXBfc3RhdGUobWx4NV9zdGF0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvb2NyZG1hL29jcmRtYV9ody5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L29jcmRtYS9vY3JkbWFfaHcuYwppbmRleCAxNjc0MGRjLi42N2ZjMGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvb2NyZG1hL29jcmRtYV9ody5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9vY3JkbWEvb2NyZG1hX2h3LmMKQEAgLTExNTYsMTggKzExNTYsMTggQEAKIAlhdHRyLT5tYXhfc3JxID0KIAkJKHJzcC0+bWF4X3NycV9ycGlyX3FwcyAmIE9DUkRNQV9NQlhfUVVFUllfQ0ZHX01BWF9TUlFfTUFTSykgPj4KIAkJT0NSRE1BX01CWF9RVUVSWV9DRkdfTUFYX1NSUV9PRkZTRVQ7Ci0JYXR0ci0+bWF4X3NlbmRfc2dlID0gKChyc3AtPm1heF93cml0ZV9zZW5kX3NnZSAmCisJYXR0ci0+bWF4X3NlbmRfc2dlID0gKChyc3AtPm1heF9yZWN2X3NlbmRfc2dlICYKIAkJCSAgICAgICBPQ1JETUFfTUJYX1FVRVJZX0NGR19NQVhfU0VORF9TR0VfTUFTSykgPj4KIAkJCSAgICAgIE9DUkRNQV9NQlhfUVVFUllfQ0ZHX01BWF9TRU5EX1NHRV9TSElGVCk7Ci0JYXR0ci0+bWF4X3JlY3Zfc2dlID0gKHJzcC0+bWF4X3dyaXRlX3NlbmRfc2dlICYKLQkJCSAgICAgIE9DUkRNQV9NQlhfUVVFUllfQ0ZHX01BWF9TRU5EX1NHRV9NQVNLKSA+PgotCSAgICBPQ1JETUFfTUJYX1FVRVJZX0NGR19NQVhfU0VORF9TR0VfU0hJRlQ7CisJYXR0ci0+bWF4X3JlY3Zfc2dlID0gKHJzcC0+bWF4X3JlY3Zfc2VuZF9zZ2UgJgorCQkJICAgICAgT0NSRE1BX01CWF9RVUVSWV9DRkdfTUFYX1JFQ1ZfU0dFX01BU0spID4+CisJICAgIE9DUkRNQV9NQlhfUVVFUllfQ0ZHX01BWF9SRUNWX1NHRV9TSElGVDsKIAlhdHRyLT5tYXhfc3JxX3NnZSA9IChyc3AtPm1heF9zcnFfcnFlX3NnZSAmCiAJCQkgICAgICBPQ1JETUFfTUJYX1FVRVJZX0NGR19NQVhfU1JRX1NHRV9NQVNLKSA+PgogCSAgICBPQ1JETUFfTUJYX1FVRVJZX0NGR19NQVhfU1JRX1NHRV9PRkZTRVQ7Ci0JYXR0ci0+bWF4X3JkbWFfc2dlID0gKHJzcC0+bWF4X3dyaXRlX3NlbmRfc2dlICYKLQkJCSAgICAgIE9DUkRNQV9NQlhfUVVFUllfQ0ZHX01BWF9XUklURV9TR0VfTUFTSykgPj4KLQkgICAgT0NSRE1BX01CWF9RVUVSWV9DRkdfTUFYX1dSSVRFX1NHRV9TSElGVDsKKwlhdHRyLT5tYXhfcmRtYV9zZ2UgPSAocnNwLT5tYXhfd3JfcmRfc2dlICYKKwkJCSAgICAgIE9DUkRNQV9NQlhfUVVFUllfQ0ZHX01BWF9SRF9TR0VfTUFTSykgPj4KKwkgICAgT0NSRE1BX01CWF9RVUVSWV9DRkdfTUFYX1JEX1NHRV9TSElGVDsKIAlhdHRyLT5tYXhfb3JkX3Blcl9xcCA9IChyc3AtPm1heF9pcmRfb3JkX3Blcl9xcCAmCiAJCQkJT0NSRE1BX01CWF9RVUVSWV9DRkdfTUFYX09SRF9QRVJfUVBfTUFTSykgPj4KIAkgICAgT0NSRE1BX01CWF9RVUVSWV9DRkdfTUFYX09SRF9QRVJfUVBfU0hJRlQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvb2NyZG1hL29jcmRtYV9zbGkuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9vY3JkbWEvb2NyZG1hX3NsaS5oCmluZGV4IDBlZmM5NjYuLjM3ZGY0NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9vY3JkbWEvb2NyZG1hX3NsaS5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9vY3JkbWEvb2NyZG1hX3NsaS5oCkBAIC01NTQsOSArNTU0LDkgQEAKIAlPQ1JETUFfTUJYX1FVRVJZX0NGR19MM19UWVBFX01BU0sJCT0gMHgxOCwKIAlPQ1JETUFfTUJYX1FVRVJZX0NGR19NQVhfU0VORF9TR0VfU0hJRlQJCT0gMCwKIAlPQ1JETUFfTUJYX1FVRVJZX0NGR19NQVhfU0VORF9TR0VfTUFTSwkJPSAweEZGRkYsCi0JT0NSRE1BX01CWF9RVUVSWV9DRkdfTUFYX1dSSVRFX1NHRV9TSElGVAk9IDE2LAotCU9DUkRNQV9NQlhfUVVFUllfQ0ZHX01BWF9XUklURV9TR0VfTUFTSwkJPSAweEZGRkYgPDwKLQkJCQlPQ1JETUFfTUJYX1FVRVJZX0NGR19NQVhfV1JJVEVfU0dFX1NISUZULAorCU9DUkRNQV9NQlhfUVVFUllfQ0ZHX01BWF9SRUNWX1NHRV9TSElGVAk9IDE2LAorCU9DUkRNQV9NQlhfUVVFUllfQ0ZHX01BWF9SRUNWX1NHRV9NQVNLCQk9IDB4RkZGRiA8PAorCQkJCU9DUkRNQV9NQlhfUVVFUllfQ0ZHX01BWF9SRUNWX1NHRV9TSElGVCwKIAogCU9DUkRNQV9NQlhfUVVFUllfQ0ZHX01BWF9PUkRfUEVSX1FQX1NISUZUCT0gMCwKIAlPQ1JETUFfTUJYX1FVRVJZX0NGR19NQVhfT1JEX1BFUl9RUF9NQVNLCT0gMHhGRkZGLApAQCAtNjEyLDYgKzYxMiw4IEBACiAJT0NSRE1BX01CWF9RVUVSWV9DRkdfTUFYX1NSUV9TR0VfT0ZGU0VUCQk9IDAsCiAJT0NSRE1BX01CWF9RVUVSWV9DRkdfTUFYX1NSUV9TR0VfTUFTSwkJPSAweEZGRkYgPDwKIAkJCQlPQ1JETUFfTUJYX1FVRVJZX0NGR19NQVhfU1JRX1NHRV9PRkZTRVQsCisJT0NSRE1BX01CWF9RVUVSWV9DRkdfTUFYX1JEX1NHRV9TSElGVAkJPSAwLAorCU9DUkRNQV9NQlhfUVVFUllfQ0ZHX01BWF9SRF9TR0VfTUFTSwkJPSAweEZGRkYsCiB9OwogCiBzdHJ1Y3Qgb2NyZG1hX21ieF9xdWVyeV9jb25maWcgewpAQCAtNjE5LDcgKzYyMSw3IEBACiAJc3RydWN0IG9jcmRtYV9tYnhfcnNwIHJzcDsKIAl1MzIgcXBfc3JxX2NxX2lyZF9vcmQ7CiAJdTMyIG1heF9wZF9jYV9hY2tfZGVsYXk7Ci0JdTMyIG1heF93cml0ZV9zZW5kX3NnZTsKKwl1MzIgbWF4X3JlY3Zfc2VuZF9zZ2U7CiAJdTMyIG1heF9pcmRfb3JkX3Blcl9xcDsKIAl1MzIgbWF4X3NoYXJlZF9pcmRfb3JkOwogCXUzMiBtYXhfbXI7CkBAIC02MzksNiArNjQxLDggQEAKIAl1MzIgbWF4X3dxZXNfcnFlc19wZXJfcTsKIAl1MzIgbWF4X2NxX2NxZXNfcGVyX2NxOwogCXUzMiBtYXhfc3JxX3JxZV9zZ2U7CisJdTMyIG1heF93cl9yZF9zZ2U7CisJdTMyIGlyZF9wZ3N6X251bV9wYWdlczsKIH07CiAKIHN0cnVjdCBvY3JkbWFfZndfdmVyX3JzcCB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvb2NyZG1hL29jcmRtYV92ZXJicy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L29jcmRtYS9vY3JkbWFfdmVyYnMuYwppbmRleCBiMWEzZDkxLi4wYWE4NTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvb2NyZG1hL29jcmRtYV92ZXJicy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9vY3JkbWEvb2NyZG1hX3ZlcmJzLmMKQEAgLTEyNSw4ICsxMjUsOCBAQAogCQkJCQlJQl9ERVZJQ0VfU1lTX0lNQUdFX0dVSUQgfAogCQkJCQlJQl9ERVZJQ0VfTE9DQUxfRE1BX0xLRVkgfAogCQkJCQlJQl9ERVZJQ0VfTUVNX01HVF9FWFRFTlNJT05TOwotCWF0dHItPm1heF9zZ2UgPSBkZXYtPmF0dHIubWF4X3NlbmRfc2dlOwotCWF0dHItPm1heF9zZ2VfcmQgPSBhdHRyLT5tYXhfc2dlOworCWF0dHItPm1heF9zZ2UgPSBtaW4oZGV2LT5hdHRyLm1heF9zZW5kX3NnZSwgZGV2LT5hdHRyLm1heF9yZWN2X3NnZSk7CisJYXR0ci0+bWF4X3NnZV9yZCA9IGRldi0+YXR0ci5tYXhfcmRtYV9zZ2U7CiAJYXR0ci0+bWF4X2NxID0gZGV2LT5hdHRyLm1heF9jcTsKIAlhdHRyLT5tYXhfY3FlID0gZGV2LT5hdHRyLm1heF9jcWU7CiAJYXR0ci0+bWF4X21yID0gZGV2LT5hdHRyLm1heF9tcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYi5oCmluZGV4IGJiZjBhMTYuLmEzZTIxYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWIuaApAQCAtNTIsNiArNTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxyZG1hL2liX2hkcnMuaD4KICNpbmNsdWRlIDxyZG1hL3JkbWFfdnQuaD4KIAogI2luY2x1ZGUgInFpYl9jb21tb24uaCIKQEAgLTExMzEsNyArMTEzMiw2IEBACiBleHRlcm4gc3RydWN0IHFpYl9kZXZkYXRhICpxaWJfbG9va3VwKGludCB1bml0KTsKIGV4dGVybiB1MzIgcWliX2NwdWxpc3RfY291bnQ7CiBleHRlcm4gdW5zaWduZWQgbG9uZyAqcWliX2NwdWxpc3Q7Ci1leHRlcm4gdTE2IHFwdF9tYXNrOwogZXh0ZXJuIHVuc2lnbmVkIHFpYl9jY190YWJsZV9zaXplOwogCiBpbnQgcWliX2luaXQoc3RydWN0IHFpYl9kZXZkYXRhICosIGludCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9kZWJ1Z2ZzLmMKaW5kZXggNWU3NWI0My4uNWJhZDhlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2RlYnVnZnMuYwpAQCAtMTg5LDI3ICsxODksMzIgQEAKIERFQlVHRlNfRklMRShjdHhfc3RhdHMpCiAKIHN0YXRpYyB2b2lkICpfcXBfc3RhdHNfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcywgbG9mZl90ICpwb3MpCisJX19hY3F1aXJlcyhSQ1UpCiB7CiAJc3RydWN0IHFpYl9xcF9pdGVyICppdGVyOwogCWxvZmZfdCBuID0gKnBvczsKIAotCXJjdV9yZWFkX2xvY2soKTsKIAlpdGVyID0gcWliX3FwX2l0ZXJfaW5pdChzLT5wcml2YXRlKTsKKworCS8qIHN0b3AgY2FsbHMgcmN1X3JlYWRfdW5sb2NrICovCisJcmN1X3JlYWRfbG9jaygpOworCiAJaWYgKCFpdGVyKQogCQlyZXR1cm4gTlVMTDsKIAotCXdoaWxlIChuLS0pIHsKKwlkbyB7CiAJCWlmIChxaWJfcXBfaXRlcl9uZXh0KGl0ZXIpKSB7CiAJCQlrZnJlZShpdGVyKTsKIAkJCXJldHVybiBOVUxMOwogCQl9Ci0JfQorCX0gd2hpbGUgKG4tLSk7CiAKIAlyZXR1cm4gaXRlcjsKIH0KIAogc3RhdGljIHZvaWQgKl9xcF9zdGF0c19zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKml0ZXJfcHRyLAogCQkJCSAgIGxvZmZfdCAqcG9zKQorCV9fbXVzdF9ob2xkKFJDVSkKIHsKIAlzdHJ1Y3QgcWliX3FwX2l0ZXIgKml0ZXIgPSBpdGVyX3B0cjsKIApAQCAtMjI0LDYgKzIyOSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIF9xcF9zdGF0c19zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKml0ZXJfcHRyKQorCV9fcmVsZWFzZXMoUkNVKQogewogCXJjdV9yZWFkX3VubG9jaygpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZHJpdmVyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9kcml2ZXIuYwppbmRleCA2N2VlNjQzLi43MjhlMGEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9kcml2ZXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9kcml2ZXIuYwpAQCAtMzE5LDggKzMxOSw4IEBACiAJCXJldCA9IDE7CiAJZWxzZSBpZiAoZWZsYWdzID09IFFMT0dJQ19JQl9SSEZfSF9USURFUlIpIHsKIAkJLyogRm9yIFRJREVSUiBhbmQgUkMgUVBzIHByZW1wdGl2ZWx5IHNjaGVkdWxlIGEgTkFLICovCi0JCXN0cnVjdCBxaWJfaWJfaGVhZGVyICpoZHIgPSAoc3RydWN0IHFpYl9pYl9oZWFkZXIgKikgcmhkcjsKLQkJc3RydWN0IHFpYl9vdGhlcl9oZWFkZXJzICpvaGRyID0gTlVMTDsKKwkJc3RydWN0IGliX2hlYWRlciAqaGRyID0gKHN0cnVjdCBpYl9oZWFkZXIgKilyaGRyOworCQlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkciA9IE5VTEw7CiAJCXN0cnVjdCBxaWJfaWJwb3J0ICppYnAgPSAmcHBkLT5pYnBvcnRfZGF0YTsKIAkJc3RydWN0IHFpYl9kZXZkYXRhICpkZCA9IHBwZC0+ZGQ7CiAJCXN0cnVjdCBydnRfZGV2X2luZm8gKnJkaSA9ICZkZC0+dmVyYnNfZGV2LnJkaTsKQEAgLTU4OCw4ICs1ODgsNyBAQAogCQkJCXFpYl9zY2hlZHVsZV9zZW5kKHFwKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFwLT5zX2xvY2ssIGZsYWdzKTsKIAkJfQotCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcXAtPnJlZmNvdW50KSkKLQkJCXdha2VfdXAoJnFwLT53YWl0KTsKKwkJcnZ0X3B1dF9xcChxcCk7CiAJfQogCiBiYWlsOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZnMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2ZzLmMKaW5kZXggZmNkZjM3OTEuLmMzZWRjMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2ZzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZnMuYwpAQCAtMzI4LDI2ICszMjgsMTIgQEAKIAogCXBvcyA9ICpwcG9zOwogCi0JaWYgKHBvcyAhPSAwKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gYmFpbDsKLQl9CisJaWYgKHBvcyAhPSAwIHx8IGNvdW50ICE9IHNpemVvZihzdHJ1Y3QgcWliX2ZsYXNoKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoY291bnQgIT0gc2l6ZW9mKHN0cnVjdCBxaWJfZmxhc2gpKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gYmFpbDsKLQl9Ci0KLQl0bXAgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKLQlpZiAoIXRtcCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGJhaWw7Ci0JfQotCi0JaWYgKGNvcHlfZnJvbV91c2VyKHRtcCwgYnVmLCBjb3VudCkpIHsKLQkJcmV0ID0gLUVGQVVMVDsKLQkJZ290byBiYWlsX3RtcDsKLQl9CisJdG1wID0gbWVtZHVwX3VzZXIoYnVmLCBjb3VudCk7CisJaWYgKElTX0VSUih0bXApKQorCQlyZXR1cm4gUFRSX0VSUih0bXApOwogCiAJZGQgPSBwcml2YXRlMmRkKGZpbGUpOwogCWlmIChxaWJfZWVwcm9tX3dyaXRlKGRkLCBwb3MsIHRtcCwgY291bnQpKSB7CkBAIC0zNjEsOCArMzQ3LDYgQEAKIAogYmFpbF90bXA6CiAJa2ZyZWUodG1wKTsKLQotYmFpbDoKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pYmE3MzIyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pYmE3MzIyLmMKaW5kZXggY2U0MDM0MC4uZGVkMjcxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaWJhNzMyMi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2liYTczMjIuYwpAQCAtMTQxNSw3ICsxNDE1LDcgQEAKIAl1MzIgKmhkcjsKIAl1NjQgcGJjOwogCWNvbnN0IHVuc2lnbmVkIGhkcndvcmRzID0gNzsKLQlzdGF0aWMgc3RydWN0IHFpYl9pYl9oZWFkZXIgaWJoZHIgPSB7CisJc3RhdGljIHN0cnVjdCBpYl9oZWFkZXIgaWJoZHIgPSB7CiAJCS5scmhbMF0gPSBjcHVfdG9fYmUxNigweEYwMDAgfCBRSUJfTFJIX0JUSCksCiAJCS5scmhbMV0gPSBJQl9MSURfUEVSTUlTU0lWRSwKIAkJLmxyaFsyXSA9IGNwdV90b19iZTE2KGhkcndvcmRzICsgU0laRV9PRl9DUkMpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcXAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3FwLmMKaW5kZXggOWNjMGFhZS4uOTlkMzFlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcXAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9xcC5jCkBAIC00MSwxNCArNDEsNiBAQAogCiAjaW5jbHVkZSAicWliLmgiCiAKLS8qCi0gKiBtYXNrIGZpZWxkIHdoaWNoIHdhcyBwcmVzZW50IGluIG5vdyBkZWxldGVkIHFpYl9xcG5fdGFibGUKLSAqIGlzIG5vdCBwcmVzZW50IGluIHJ2dF9xcG5fdGFibGUuIERlZmluaW5nIHRoZSBzYW1lIGZpZWxkCi0gKiBhcyBxcHRfbWFzayBoZXJlIGluc3RlYWQgb2YgYWRkaW5nIHRoZSBtYXNrIGZpZWxkIHRvCi0gKiBydnRfcXBuX3RhYmxlLgotICovCi11MTYgcXB0X21hc2s7Ci0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbWtfcXBuKHN0cnVjdCBydnRfcXBuX3RhYmxlICpxcHQsCiAJCQkgICAgICBzdHJ1Y3QgcnZ0X3Fwbl9tYXAgKm1hcCwgdW5zaWduZWQgb2ZmKQogewpAQCAtNTcsNyArNDksNyBAQAogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGZpbmRfbmV4dF9vZmZzZXQoc3RydWN0IHJ2dF9xcG5fdGFibGUgKnFwdCwKIAkJCQkJc3RydWN0IHJ2dF9xcG5fbWFwICptYXAsIHVuc2lnbmVkIG9mZiwKLQkJCQkJdW5zaWduZWQgbikKKwkJCQkJdW5zaWduZWQgbiwgdTE2IHFwdF9tYXNrKQogewogCWlmIChxcHRfbWFzaykgewogCQlvZmYrKzsKQEAgLTE3OSw2ICsxNzEsNyBAQAogCXN0cnVjdCBxaWJfaWJkZXYgKnZlcmJzX2RldiA9IGNvbnRhaW5lcl9vZihyZGksIHN0cnVjdCBxaWJfaWJkZXYsIHJkaSk7CiAJc3RydWN0IHFpYl9kZXZkYXRhICpkZCA9IGNvbnRhaW5lcl9vZih2ZXJic19kZXYsIHN0cnVjdCBxaWJfZGV2ZGF0YSwKIAkJCQkJICAgICAgdmVyYnNfZGV2KTsKKwl1MTYgcXB0X21hc2sgPSBkZC0+cXBuX21hc2s7CiAKIAlpZiAodHlwZSA9PSBJQl9RUFRfU01JIHx8IHR5cGUgPT0gSUJfUVBUX0dTSSkgewogCQl1bnNpZ25lZCBuOwpAQCAtMjE1LDcgKzIwOCw3IEBACiAJCQkJZ290byBiYWlsOwogCQkJfQogCQkJb2Zmc2V0ID0gZmluZF9uZXh0X29mZnNldChxcHQsIG1hcCwgb2Zmc2V0LAotCQkJCWRkLT5uX2tyY3ZfcXVldWVzKTsKKwkJCQlkZC0+bl9rcmN2X3F1ZXVlcywgcXB0X21hc2spOwogCQkJcXBuID0gbWtfcXBuKHFwdCwgbWFwLCBvZmZzZXQpOwogCQkJLyoKIAkJCSAqIFRoaXMgdGVzdCBkaWZmZXJzIGZyb20gYWxsb2NfcGlkbWFwKCkuCkBAIC01NzMsMTAgKzU2Niw2IEBACiAJCXJldHVybiBOVUxMOwogCiAJaXRlci0+ZGV2ID0gZGV2OwotCWlmIChxaWJfcXBfaXRlcl9uZXh0KGl0ZXIpKSB7Ci0JCWtmcmVlKGl0ZXIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAlyZXR1cm4gaXRlcjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3JjLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9yYy5jCmluZGV4IDQ0NDAyOGEuLjIwOTc1MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3JjLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcmMuYwpAQCAtNzUsNyArNzUsNyBAQAogICogTm90ZSB0aGUgUVAgc19sb2NrIG11c3QgYmUgaGVsZC4KICAqLwogc3RhdGljIGludCBxaWJfbWFrZV9yY19hY2soc3RydWN0IHFpYl9pYmRldiAqZGV2LCBzdHJ1Y3QgcnZ0X3FwICpxcCwKLQkJCSAgIHN0cnVjdCBxaWJfb3RoZXJfaGVhZGVycyAqb2hkciwgdTMyIHBtdHUpCisJCQkgICBzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkciwgdTMyIHBtdHUpCiB7CiAJc3RydWN0IHJ2dF9hY2tfZW50cnkgKmU7CiAJdTMyIGh3b3JkczsKQEAgLTE1NCwxMCArMTU0LDcgQEAKIAkJCWxlbiA9IDA7CiAJCQlxcC0+c19hY2tfc3RhdGUgPSBPUChBVE9NSUNfQUNLTk9XTEVER0UpOwogCQkJb2hkci0+dS5hdC5hZXRoID0gcWliX2NvbXB1dGVfYWV0aChxcCk7Ci0JCQlvaGRyLT51LmF0LmF0b21pY19hY2tfZXRoWzBdID0KLQkJCQljcHVfdG9fYmUzMihlLT5hdG9taWNfZGF0YSA+PiAzMik7Ci0JCQlvaGRyLT51LmF0LmF0b21pY19hY2tfZXRoWzFdID0KLQkJCQljcHVfdG9fYmUzMihlLT5hdG9taWNfZGF0YSk7CisJCQlpYl91NjRfcHV0KGUtPmF0b21pY19kYXRhLCAmb2hkci0+dS5hdC5hdG9taWNfYWNrX2V0aCk7CiAJCQlod29yZHMgKz0gc2l6ZW9mKG9oZHItPnUuYXQpIC8gc2l6ZW9mKHUzMik7CiAJCQlidGgyID0gZS0+cHNuICYgUUlCX1BTTl9NQVNLOwogCQkJZS0+c2VudCA9IDE7CkBAIC0yMzQsNyArMjMxLDcgQEAKIHsKIAlzdHJ1Y3QgcWliX3FwX3ByaXYgKnByaXYgPSBxcC0+cHJpdjsKIAlzdHJ1Y3QgcWliX2liZGV2ICpkZXYgPSB0b19pZGV2KHFwLT5pYnFwLmRldmljZSk7Ci0Jc3RydWN0IHFpYl9vdGhlcl9oZWFkZXJzICpvaGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyOwogCXN0cnVjdCBydnRfc2dlX3N0YXRlICpzczsKIAlzdHJ1Y3QgcnZ0X3N3cWUgKndxZTsKIAl1MzIgaHdvcmRzOwpAQCAtNDQ0LDIwICs0NDEsMTggQEAKIAkJCX0KIAkJCWlmICh3cWUtPmF0b21pY193ci53ci5vcGNvZGUgPT0gSUJfV1JfQVRPTUlDX0NNUF9BTkRfU1dQKSB7CiAJCQkJcXAtPnNfc3RhdGUgPSBPUChDT01QQVJFX1NXQVApOwotCQkJCW9oZHItPnUuYXRvbWljX2V0aC5zd2FwX2RhdGEgPSBjcHVfdG9fYmU2NCgKLQkJCQkJd3FlLT5hdG9taWNfd3Iuc3dhcCk7Ci0JCQkJb2hkci0+dS5hdG9taWNfZXRoLmNvbXBhcmVfZGF0YSA9IGNwdV90b19iZTY0KAotCQkJCQl3cWUtPmF0b21pY193ci5jb21wYXJlX2FkZCk7CisJCQkJcHV0X2liX2F0ZXRoX3N3YXAod3FlLT5hdG9taWNfd3Iuc3dhcCwKKwkJCQkJCSAgJm9oZHItPnUuYXRvbWljX2V0aCk7CisJCQkJcHV0X2liX2F0ZXRoX3N3YXAod3FlLT5hdG9taWNfd3IuY29tcGFyZV9hZGQsCisJCQkJCQkgICZvaGRyLT51LmF0b21pY19ldGgpOwogCQkJfSBlbHNlIHsKIAkJCQlxcC0+c19zdGF0ZSA9IE9QKEZFVENIX0FERCk7Ci0JCQkJb2hkci0+dS5hdG9taWNfZXRoLnN3YXBfZGF0YSA9IGNwdV90b19iZTY0KAotCQkJCQl3cWUtPmF0b21pY193ci5jb21wYXJlX2FkZCk7Ci0JCQkJb2hkci0+dS5hdG9taWNfZXRoLmNvbXBhcmVfZGF0YSA9IDA7CisJCQkJcHV0X2liX2F0ZXRoX3N3YXAod3FlLT5hdG9taWNfd3IuY29tcGFyZV9hZGQsCisJCQkJCQkgICZvaGRyLT51LmF0b21pY19ldGgpOworCQkJCXB1dF9pYl9hdGV0aF9zd2FwKDAsICZvaGRyLT51LmF0b21pY19ldGgpOwogCQkJfQotCQkJb2hkci0+dS5hdG9taWNfZXRoLnZhZGRyWzBdID0gY3B1X3RvX2JlMzIoCi0JCQkJd3FlLT5hdG9taWNfd3IucmVtb3RlX2FkZHIgPj4gMzIpOwotCQkJb2hkci0+dS5hdG9taWNfZXRoLnZhZGRyWzFdID0gY3B1X3RvX2JlMzIoCi0JCQkJd3FlLT5hdG9taWNfd3IucmVtb3RlX2FkZHIpOworCQkJcHV0X2liX2F0ZXRoX3ZhZGRyKHdxZS0+YXRvbWljX3dyLnJlbW90ZV9hZGRyLAorCQkJCQkgICAmb2hkci0+dS5hdG9taWNfZXRoKTsKIAkJCW9oZHItPnUuYXRvbWljX2V0aC5ya2V5ID0gY3B1X3RvX2JlMzIoCiAJCQkJd3FlLT5hdG9taWNfd3IucmtleSk7CiAJCQlod29yZHMgKz0gc2l6ZW9mKHN0cnVjdCBpYl9hdG9taWNfZXRoKSAvIHNpemVvZih1MzIpOwpAQCAtNjMyLDggKzYyNyw4IEBACiAJdTMyIGh3b3JkczsKIAl1MzIgcGJ1Zm47CiAJdTMyIF9faW9tZW0gKnBpb2J1ZjsKLQlzdHJ1Y3QgcWliX2liX2hlYWRlciBoZHI7Ci0Jc3RydWN0IHFpYl9vdGhlcl9oZWFkZXJzICpvaGRyOworCXN0cnVjdCBpYl9oZWFkZXIgaGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyOwogCXUzMiBjb250cm9sOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTk0Miw5ICs5MzcsOSBAQAogLyoKICAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHRoZSBRUCBzX2xvY2sgaGVsZCBhbmQgaW50ZXJydXB0cyBkaXNhYmxlZC4KICAqLwotdm9pZCBxaWJfcmNfc2VuZF9jb21wbGV0ZShzdHJ1Y3QgcnZ0X3FwICpxcCwgc3RydWN0IHFpYl9pYl9oZWFkZXIgKmhkcikKK3ZvaWQgcWliX3JjX3NlbmRfY29tcGxldGUoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBpYl9oZWFkZXIgKmhkcikKIHsKLQlzdHJ1Y3QgcWliX290aGVyX2hlYWRlcnMgKm9oZHI7CisJc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHI7CiAJc3RydWN0IHJ2dF9zd3FlICp3cWU7CiAJc3RydWN0IGliX3djIHdjOwogCXVuc2lnbmVkIGk7CkBAIC0xMTc3LDcgKzExNzIsNyBAQAogCQkJCXFpYl9yZXN0YXJ0X3JjKHFwLCBxcC0+c19sYXN0X3BzbiArIDEsIDApOwogCQkJCWlmIChsaXN0X2VtcHR5KCZxcC0+cnNwd2FpdCkpIHsKIAkJCQkJcXAtPnJfZmxhZ3MgfD0gUlZUX1JfUlNQX1NFTkQ7Ci0JCQkJCWF0b21pY19pbmMoJnFwLT5yZWZjb3VudCk7CisJCQkJCXJ2dF9nZXRfcXAocXApOwogCQkJCQlsaXN0X2FkZF90YWlsKCZxcC0+cnNwd2FpdCwKIAkJCQkJCSAgICAgICZyY2QtPnFwX3dhaXRfbGlzdCk7CiAJCQkJfQpAQCAtMTM2MSw3ICsxMzU2LDcgQEAKIAlxaWJfcmVzdGFydF9yYyhxcCwgcXAtPnNfbGFzdF9wc24gKyAxLCAwKTsKIAlpZiAobGlzdF9lbXB0eSgmcXAtPnJzcHdhaXQpKSB7CiAJCXFwLT5yX2ZsYWdzIHw9IFJWVF9SX1JTUF9TRU5EOwotCQlhdG9taWNfaW5jKCZxcC0+cmVmY291bnQpOworCQlydnRfZ2V0X3FwKHFwKTsKIAkJbGlzdF9hZGRfdGFpbCgmcXAtPnJzcHdhaXQsICZyY2QtPnFwX3dhaXRfbGlzdCk7CiAJfQogfQpAQCAtMTM4Myw3ICsxMzc4LDcgQEAKICAqIENhbGxlZCBhdCBpbnRlcnJ1cHQgbGV2ZWwuCiAgKi8KIHN0YXRpYyB2b2lkIHFpYl9yY19yY3ZfcmVzcChzdHJ1Y3QgcWliX2licG9ydCAqaWJwLAotCQkJICAgIHN0cnVjdCBxaWJfb3RoZXJfaGVhZGVycyAqb2hkciwKKwkJCSAgICBzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkciwKIAkJCSAgICB2b2lkICpkYXRhLCB1MzIgdGxlbiwKIAkJCSAgICBzdHJ1Y3QgcnZ0X3FwICpxcCwKIAkJCSAgICB1MzIgb3Bjb2RlLApAQCAtMTQ2MywxMiArMTQ1OCw5IEBACiAJY2FzZSBPUChBVE9NSUNfQUNLTk9XTEVER0UpOgogCWNhc2UgT1AoUkRNQV9SRUFEX1JFU1BPTlNFX0ZJUlNUKToKIAkJYWV0aCA9IGJlMzJfdG9fY3B1KG9oZHItPnUuYWV0aCk7Ci0JCWlmIChvcGNvZGUgPT0gT1AoQVRPTUlDX0FDS05PV0xFREdFKSkgewotCQkJX19iZTMyICpwID0gb2hkci0+dS5hdC5hdG9taWNfYWNrX2V0aDsKLQotCQkJdmFsID0gKCh1NjQpIGJlMzJfdG9fY3B1KHBbMF0pIDw8IDMyKSB8Ci0JCQkJYmUzMl90b19jcHUocFsxXSk7Ci0JCX0gZWxzZQorCQlpZiAob3Bjb2RlID09IE9QKEFUT01JQ19BQ0tOT1dMRURHRSkpCisJCQl2YWwgPSBpYl91NjRfZ2V0KCZvaGRyLT51LmF0LmF0b21pY19hY2tfZXRoKTsKKwkJZWxzZQogCQkJdmFsID0gMDsKIAkJaWYgKCFkb19yY19hY2socXAsIGFldGgsIHBzbiwgb3Bjb2RlLCB2YWwsIHJjZCkgfHwKIAkJICAgIG9wY29kZSAhPSBPUChSRE1BX1JFQURfUkVTUE9OU0VfRklSU1QpKQpAQCAtMTYwOCw3ICsxNjAwLDcgQEAKICAqIFJldHVybiAxIGlmIG5vIG1vcmUgcHJvY2Vzc2luZyBpcyBuZWVkZWQ7IG90aGVyd2lzZSByZXR1cm4gMCB0bwogICogc2NoZWR1bGUgYSByZXNwb25zZSB0byBiZSBzZW50LgogICovCi1zdGF0aWMgaW50IHFpYl9yY19yY3ZfZXJyb3Ioc3RydWN0IHFpYl9vdGhlcl9oZWFkZXJzICpvaGRyLAorc3RhdGljIGludCBxaWJfcmNfcmN2X2Vycm9yKHN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyLAogCQkJICAgIHZvaWQgKmRhdGEsCiAJCQkgICAgc3RydWN0IHJ2dF9xcCAqcXAsCiAJCQkgICAgdTMyIG9wY29kZSwKQEAgLTE2NDAsNyArMTYzMiw3IEBACiAJCQkgKi8KIAkJCWlmIChsaXN0X2VtcHR5KCZxcC0+cnNwd2FpdCkpIHsKIAkJCQlxcC0+cl9mbGFncyB8PSBSVlRfUl9SU1BfTkFLOwotCQkJCWF0b21pY19pbmMoJnFwLT5yZWZjb3VudCk7CisJCQkJcnZ0X2dldF9xcChxcCk7CiAJCQkJbGlzdF9hZGRfdGFpbCgmcXAtPnJzcHdhaXQsICZyY2QtPnFwX3dhaXRfbGlzdCk7CiAJCQl9CiAJCX0KQEAgLTE4NDgsMTEgKzE4NDAsMTEgQEAKICAqIGZvciB0aGUgZ2l2ZW4gUVAuCiAgKiBDYWxsZWQgYXQgaW50ZXJydXB0IGxldmVsLgogICovCi12b2lkIHFpYl9yY19yY3Yoc3RydWN0IHFpYl9jdHh0ZGF0YSAqcmNkLCBzdHJ1Y3QgcWliX2liX2hlYWRlciAqaGRyLAordm9pZCBxaWJfcmNfcmN2KHN0cnVjdCBxaWJfY3R4dGRhdGEgKnJjZCwgc3RydWN0IGliX2hlYWRlciAqaGRyLAogCQlpbnQgaGFzX2dyaCwgdm9pZCAqZGF0YSwgdTMyIHRsZW4sIHN0cnVjdCBydnRfcXAgKnFwKQogewogCXN0cnVjdCBxaWJfaWJwb3J0ICppYnAgPSAmcmNkLT5wcGQtPmlicG9ydF9kYXRhOwotCXN0cnVjdCBxaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKKwlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKIAl1MzIgb3Bjb2RlOwogCXUzMiBoZHJzaXplOwogCXUzMiBwc247CkBAIC0yMTc3LDggKzIxNjksNyBAQAogCQkJZS0+cmRtYV9zZ2UubXIgPSBOVUxMOwogCQl9CiAJCWF0ZXRoID0gJm9oZHItPnUuYXRvbWljX2V0aDsKLQkJdmFkZHIgPSAoKHU2NCkgYmUzMl90b19jcHUoYXRldGgtPnZhZGRyWzBdKSA8PCAzMikgfAotCQkJYmUzMl90b19jcHUoYXRldGgtPnZhZGRyWzFdKTsKKwkJdmFkZHIgPSBnZXRfaWJfYXRldGhfdmFkZHIoYXRldGgpOwogCQlpZiAodW5saWtlbHkodmFkZHIgJiAoc2l6ZW9mKHU2NCkgLSAxKSkpCiAJCQlnb3RvIG5hY2tfaW52X3VubGNrOwogCQlya2V5ID0gYmUzMl90b19jcHUoYXRldGgtPnJrZXkpOwpAQCAtMjE4OSwxMSArMjE4MCwxMSBAQAogCQkJZ290byBuYWNrX2FjY191bmxjazsKIAkJLyogUGVyZm9ybSBhdG9taWMgT1AgYW5kIHNhdmUgcmVzdWx0LiAqLwogCQltYWRkciA9IChhdG9taWM2NF90ICopIHFwLT5yX3NnZS5zZ2UudmFkZHI7Ci0JCXNkYXRhID0gYmU2NF90b19jcHUoYXRldGgtPnN3YXBfZGF0YSk7CisJCXNkYXRhID0gZ2V0X2liX2F0ZXRoX3N3YXAoYXRldGgpOwogCQllLT5hdG9taWNfZGF0YSA9IChvcGNvZGUgPT0gT1AoRkVUQ0hfQUREKSkgPwogCQkJKHU2NCkgYXRvbWljNjRfYWRkX3JldHVybihzZGF0YSwgbWFkZHIpIC0gc2RhdGEgOgogCQkJKHU2NCkgY21weGNoZygodTY0ICopIHFwLT5yX3NnZS5zZ2UudmFkZHIsCi0JCQkJICAgICAgYmU2NF90b19jcHUoYXRldGgtPmNvbXBhcmVfZGF0YSksCisJCQkJICAgICAgZ2V0X2liX2F0ZXRoX2NvbXBhcmUoYXRldGgpLAogCQkJCSAgICAgIHNkYXRhKTsKIAkJcnZ0X3B1dF9tcihxcC0+cl9zZ2Uuc2dlLm1yKTsKIAkJcXAtPnJfc2dlLm51bV9zZ2UgPSAwOwpAQCAtMjIzMyw3ICsyMjI0LDcgQEAKIAkvKiBRdWV1ZSBSTlIgTkFLIGZvciBsYXRlciAqLwogCWlmIChsaXN0X2VtcHR5KCZxcC0+cnNwd2FpdCkpIHsKIAkJcXAtPnJfZmxhZ3MgfD0gUlZUX1JfUlNQX05BSzsKLQkJYXRvbWljX2luYygmcXAtPnJlZmNvdW50KTsKKwkJcnZ0X2dldF9xcChxcCk7CiAJCWxpc3RfYWRkX3RhaWwoJnFwLT5yc3B3YWl0LCAmcmNkLT5xcF93YWl0X2xpc3QpOwogCX0KIAlyZXR1cm47CkBAIC0yMjQ1LDcgKzIyMzYsNyBAQAogCS8qIFF1ZXVlIE5BSyBmb3IgbGF0ZXIgKi8KIAlpZiAobGlzdF9lbXB0eSgmcXAtPnJzcHdhaXQpKSB7CiAJCXFwLT5yX2ZsYWdzIHw9IFJWVF9SX1JTUF9OQUs7Ci0JCWF0b21pY19pbmMoJnFwLT5yZWZjb3VudCk7CisJCXJ2dF9nZXRfcXAocXApOwogCQlsaXN0X2FkZF90YWlsKCZxcC0+cnNwd2FpdCwgJnJjZC0+cXBfd2FpdF9saXN0KTsKIAl9CiAJcmV0dXJuOwpAQCAtMjI1OSw3ICsyMjUwLDcgQEAKIAkvKiBRdWV1ZSBOQUsgZm9yIGxhdGVyICovCiAJaWYgKGxpc3RfZW1wdHkoJnFwLT5yc3B3YWl0KSkgewogCQlxcC0+cl9mbGFncyB8PSBSVlRfUl9SU1BfTkFLOwotCQlhdG9taWNfaW5jKCZxcC0+cmVmY291bnQpOworCQlydnRfZ2V0X3FwKHFwKTsKIAkJbGlzdF9hZGRfdGFpbCgmcXAtPnJzcHdhaXQsICZyY2QtPnFwX3dhaXRfbGlzdCk7CiAJfQogCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3J1Yy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcnVjLmMKaW5kZXggYjY3Nzc5Mi4uZGUxYmRlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcnVjLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcnVjLmMKQEAgLTI2NSw3ICsyNjUsNyBAQAogICoKICAqIFRoZSBzX2xvY2sgd2lsbCBiZSBhY3F1aXJlZCBhcm91bmQgdGhlIHFpYl9taWdyYXRlX3FwKCkgY2FsbC4KICAqLwotaW50IHFpYl9ydWNfY2hlY2tfaGRyKHN0cnVjdCBxaWJfaWJwb3J0ICppYnAsIHN0cnVjdCBxaWJfaWJfaGVhZGVyICpoZHIsCitpbnQgcWliX3J1Y19jaGVja19oZHIoc3RydWN0IHFpYl9pYnBvcnQgKmlicCwgc3RydWN0IGliX2hlYWRlciAqaGRyLAogCQkgICAgICBpbnQgaGFzX2dyaCwgc3RydWN0IHJ2dF9xcCAqcXAsIHUzMiBidGgwKQogewogCV9fYmU2NCBndWlkOwpAQCAtNjgwLDcgKzY4MCw3IEBACiAJcmV0dXJuIHNpemVvZihzdHJ1Y3QgaWJfZ3JoKSAvIHNpemVvZih1MzIpOwogfQogCi12b2lkIHFpYl9tYWtlX3J1Y19oZWFkZXIoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBxaWJfb3RoZXJfaGVhZGVycyAqb2hkciwKK3ZvaWQgcWliX21ha2VfcnVjX2hlYWRlcihzdHJ1Y3QgcnZ0X3FwICpxcCwgc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHIsCiAJCQkgdTMyIGJ0aDAsIHUzMiBidGgyKQogewogCXN0cnVjdCBxaWJfcXBfcHJpdiAqcHJpdiA9IHFwLT5wcml2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdWMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3VjLmMKaW5kZXggMWQ2MWJkMC4uNWIyZDQ4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdWMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl91Yy5jCkBAIC00OCw3ICs0OCw3IEBACiBpbnQgcWliX21ha2VfdWNfcmVxKHN0cnVjdCBydnRfcXAgKnFwLCB1bnNpZ25lZCBsb25nICpmbGFncykKIHsKIAlzdHJ1Y3QgcWliX3FwX3ByaXYgKnByaXYgPSBxcC0+cHJpdjsKLQlzdHJ1Y3QgcWliX290aGVyX2hlYWRlcnMgKm9oZHI7CisJc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHI7CiAJc3RydWN0IHJ2dF9zd3FlICp3cWU7CiAJdTMyIGh3b3JkczsKIAl1MzIgYnRoMDsKQEAgLTIzNiwxMCArMjM2LDEwIEBACiAgKiBmb3IgdGhlIGdpdmVuIFFQLgogICogQ2FsbGVkIGF0IGludGVycnVwdCBsZXZlbC4KICAqLwotdm9pZCBxaWJfdWNfcmN2KHN0cnVjdCBxaWJfaWJwb3J0ICppYnAsIHN0cnVjdCBxaWJfaWJfaGVhZGVyICpoZHIsCit2b2lkIHFpYl91Y19yY3Yoc3RydWN0IHFpYl9pYnBvcnQgKmlicCwgc3RydWN0IGliX2hlYWRlciAqaGRyLAogCQlpbnQgaGFzX2dyaCwgdm9pZCAqZGF0YSwgdTMyIHRsZW4sIHN0cnVjdCBydnRfcXAgKnFwKQogewotCXN0cnVjdCBxaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKKwlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKIAl1MzIgb3Bjb2RlOwogCXUzMiBoZHJzaXplOwogCXUzMiBwc247CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl91ZC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdWQuYwppbmRleCAxMGQwNjI1Li5mNDVjYWQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl91ZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3VkLmMKQEAgLTI0NSw3ICsyNDUsNyBAQAogaW50IHFpYl9tYWtlX3VkX3JlcShzdHJ1Y3QgcnZ0X3FwICpxcCwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCiB7CiAJc3RydWN0IHFpYl9xcF9wcml2ICpwcml2ID0gcXAtPnByaXY7Ci0Jc3RydWN0IHFpYl9vdGhlcl9oZWFkZXJzICpvaGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyOwogCXN0cnVjdCBpYl9haF9hdHRyICphaF9hdHRyOwogCXN0cnVjdCBxaWJfcHBvcnRkYXRhICpwcGQ7CiAJc3RydWN0IHFpYl9pYnBvcnQgKmlicDsKQEAgLTQzNSwxMCArNDM1LDEwIEBACiAgKiBmb3IgdGhlIGdpdmVuIFFQLgogICogQ2FsbGVkIGF0IGludGVycnVwdCBsZXZlbC4KICAqLwotdm9pZCBxaWJfdWRfcmN2KHN0cnVjdCBxaWJfaWJwb3J0ICppYnAsIHN0cnVjdCBxaWJfaWJfaGVhZGVyICpoZHIsCit2b2lkIHFpYl91ZF9yY3Yoc3RydWN0IHFpYl9pYnBvcnQgKmlicCwgc3RydWN0IGliX2hlYWRlciAqaGRyLAogCQlpbnQgaGFzX2dyaCwgdm9pZCAqZGF0YSwgdTMyIHRsZW4sIHN0cnVjdCBydnRfcXAgKnFwKQogewotCXN0cnVjdCBxaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKKwlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKIAlpbnQgb3Bjb2RlOwogCXUzMiBoZHJzaXplOwogCXUzMiBwYWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl92ZXJicy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdmVyYnMuYwppbmRleCBmZDFkZmJjLi44NzZlYmI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl92ZXJicy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3ZlcmJzLmMKQEAgLTMxMyw3ICszMTMsNyBAQAogICogZm9yIHRoZSBnaXZlbiBRUC4KICAqIENhbGxlZCBhdCBpbnRlcnJ1cHQgbGV2ZWwuCiAgKi8KLXN0YXRpYyB2b2lkIHFpYl9xcF9yY3Yoc3RydWN0IHFpYl9jdHh0ZGF0YSAqcmNkLCBzdHJ1Y3QgcWliX2liX2hlYWRlciAqaGRyLAorc3RhdGljIHZvaWQgcWliX3FwX3JjdihzdHJ1Y3QgcWliX2N0eHRkYXRhICpyY2QsIHN0cnVjdCBpYl9oZWFkZXIgKmhkciwKIAkJICAgICAgIGludCBoYXNfZ3JoLCB2b2lkICpkYXRhLCB1MzIgdGxlbiwgc3RydWN0IHJ2dF9xcCAqcXApCiB7CiAJc3RydWN0IHFpYl9pYnBvcnQgKmlicCA9ICZyY2QtPnBwZC0+aWJwb3J0X2RhdGE7CkBAIC0zNjYsMTAgKzM2NiwxMCBAQAogewogCXN0cnVjdCBxaWJfcHBvcnRkYXRhICpwcGQgPSByY2QtPnBwZDsKIAlzdHJ1Y3QgcWliX2licG9ydCAqaWJwID0gJnBwZC0+aWJwb3J0X2RhdGE7Ci0Jc3RydWN0IHFpYl9pYl9oZWFkZXIgKmhkciA9IHJoZHI7CisJc3RydWN0IGliX2hlYWRlciAqaGRyID0gcmhkcjsKIAlzdHJ1Y3QgcWliX2RldmRhdGEgKmRkID0gcHBkLT5kZDsKIAlzdHJ1Y3QgcnZ0X2Rldl9pbmZvICpyZGkgPSAmZGQtPnZlcmJzX2Rldi5yZGk7Ci0Jc3RydWN0IHFpYl9vdGhlcl9oZWFkZXJzICpvaGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyOwogCXN0cnVjdCBydnRfcXAgKnFwOwogCXUzMiBxcF9udW07CiAJaW50IGxuaDsKQEAgLTg0MSw3ICs4NDEsNyBAQAogCWlmICh0eC0+d3FlKQogCQlxaWJfc2VuZF9jb21wbGV0ZShxcCwgdHgtPndxZSwgSUJfV0NfU1VDQ0VTUyk7CiAJZWxzZSBpZiAocXAtPmlicXAucXBfdHlwZSA9PSBJQl9RUFRfUkMpIHsKLQkJc3RydWN0IHFpYl9pYl9oZWFkZXIgKmhkcjsKKwkJc3RydWN0IGliX2hlYWRlciAqaGRyOwogCiAJCWlmICh0eC0+dHhyZXEuZmxhZ3MgJiBRSUJfU0RNQV9UWFJFUV9GX0ZSRUVCVUYpCiAJCQloZHIgPSAmdHgtPmFsaWduX2J1Zi0+aGRyOwpAQCAtODg5LDcgKzg4OSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBxaWJfdmVyYnNfc2VuZF9kbWEoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBxaWJfaWJfaGVhZGVyICpoZHIsCitzdGF0aWMgaW50IHFpYl92ZXJic19zZW5kX2RtYShzdHJ1Y3QgcnZ0X3FwICpxcCwgc3RydWN0IGliX2hlYWRlciAqaGRyLAogCQkJICAgICAgdTMyIGhkcndvcmRzLCBzdHJ1Y3QgcnZ0X3NnZV9zdGF0ZSAqc3MsIHUzMiBsZW4sCiAJCQkgICAgICB1MzIgcGxlbiwgdTMyIGR3b3JkcykKIHsKQEAgLTEwMjUsNyArMTAyNSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBxaWJfdmVyYnNfc2VuZF9waW8oc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBxaWJfaWJfaGVhZGVyICppYmhkciwKK3N0YXRpYyBpbnQgcWliX3ZlcmJzX3NlbmRfcGlvKHN0cnVjdCBydnRfcXAgKnFwLCBzdHJ1Y3QgaWJfaGVhZGVyICppYmhkciwKIAkJCSAgICAgIHUzMiBoZHJ3b3Jkcywgc3RydWN0IHJ2dF9zZ2Vfc3RhdGUgKnNzLCB1MzIgbGVuLAogCQkJICAgICAgdTMyIHBsZW4sIHUzMiBkd29yZHMpCiB7CkBAIC0xMTMzLDcgKzExMzMsNyBAQAogICogUmV0dXJuIHplcm8gaWYgcGFja2V0IGlzIHNlbnQgb3IgcXVldWVkIE9LLgogICogUmV0dXJuIG5vbi16ZXJvIGFuZCBjbGVhciBxcC0+c19mbGFncyBSVlRfU19CVVNZIG90aGVyd2lzZS4KICAqLwotaW50IHFpYl92ZXJic19zZW5kKHN0cnVjdCBydnRfcXAgKnFwLCBzdHJ1Y3QgcWliX2liX2hlYWRlciAqaGRyLAoraW50IHFpYl92ZXJic19zZW5kKHN0cnVjdCBydnRfcXAgKnFwLCBzdHJ1Y3QgaWJfaGVhZGVyICpoZHIsCiAJCSAgIHUzMiBoZHJ3b3Jkcywgc3RydWN0IHJ2dF9zZ2Vfc3RhdGUgKnNzLCB1MzIgbGVuKQogewogCXN0cnVjdCBxaWJfZGV2ZGF0YSAqZGQgPSBkZF9mcm9tX2liZGV2KHFwLT5pYnFwLmRldmljZSk7CkBAIC0xNjA2LDggKzE2MDYsNiBAQAogCS8qIE9ubHkgbmVlZCB0byBpbml0aWFsaXplIG5vbi16ZXJvIGZpZWxkcy4gKi8KIAlzZXR1cF90aW1lcigmZGV2LT5tZW1fdGltZXIsIG1lbV90aW1lciwgKHVuc2lnbmVkIGxvbmcpZGV2KTsKIAotCXFwdF9tYXNrID0gZGQtPnFwbl9tYXNrOwotCiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+cGlvd2FpdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+ZG1hd2FpdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+dHh3YWl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3ZlcmJzLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl92ZXJicy5oCmluZGV4IDczNmNlZDYuLjk0ZmQzMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3ZlcmJzLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdmVyYnMuaApAQCAtNDUsNiArNDUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxyZG1hL2liX3BhY2suaD4KICNpbmNsdWRlIDxyZG1hL2liX3VzZXJfdmVyYnMuaD4KKyNpbmNsdWRlIDxyZG1hL2liX2hkcnMuaD4KICNpbmNsdWRlIDxyZG1hL3JkbWFfdnQuaD4KICNpbmNsdWRlIDxyZG1hL3JkbWF2dF9jcS5oPgogCkBAIC02MywxNiArNjQsNiBAQAogICovCiAjZGVmaW5lIFFJQl9VVkVSQlNfQUJJX1ZFUlNJT04gICAgICAgMgogCi0jZGVmaW5lIElCX1NFUV9OQUsJKDMgPDwgMjkpCi0KLS8qIEFFVEggTkFLIG9wY29kZSB2YWx1ZXMgKi8KLSNkZWZpbmUgSUJfUk5SX05BSyAgICAgICAgICAgICAgICAgICAgICAweDIwCi0jZGVmaW5lIElCX05BS19QU05fRVJST1IgICAgICAgICAgICAgICAgMHg2MAotI2RlZmluZSBJQl9OQUtfSU5WQUxJRF9SRVFVRVNUICAgICAgICAgIDB4NjEKLSNkZWZpbmUgSUJfTkFLX1JFTU9URV9BQ0NFU1NfRVJST1IgICAgICAweDYyCi0jZGVmaW5lIElCX05BS19SRU1PVEVfT1BFUkFUSU9OQUxfRVJST1IgMHg2MwotI2RlZmluZSBJQl9OQUtfSU5WQUxJRF9SRF9SRVFVRVNUICAgICAgIDB4NjQKLQogLyogSUIgUGVyZm9ybWFuY2UgTWFuYWdlciBzdGF0dXMgdmFsdWVzICovCiAjZGVmaW5lIElCX1BNQV9TQU1QTEVfU1RBVFVTX0RPTkUgICAgICAgMHgwMAogI2RlZmluZSBJQl9QTUFfU0FNUExFX1NUQVRVU19TVEFSVEVEICAgIDB4MDEKQEAgLTg3LDIyICs3OCw5IEBACiAKICNkZWZpbmUgUUlCX1ZFTkRPUl9JUEcJCWNwdV90b19iZTE2KDB4RkZBMCkKIAotI2RlZmluZSBJQl9CVEhfUkVRX0FDSwkJKDEgPDwgMzEpCi0jZGVmaW5lIElCX0JUSF9TT0xJQ0lURUQJKDEgPDwgMjMpCi0jZGVmaW5lIElCX0JUSF9NSUdfUkVRCQkoMSA8PCAyMikKLQogLyogWFhYIFNob3VsZCBiZSBkZWZpbmVkIGluIGliX3ZlcmJzLmggZW51bSBpYl9wb3J0X2NhcF9mbGFncyAqLwogI2RlZmluZSBJQl9QT1JUX09USEVSX0xPQ0FMX0NIQU5HRVNfU1VQICgxIDw8IDI2KQogCi0jZGVmaW5lIElCX0dSSF9WRVJTSU9OCQk2Ci0jZGVmaW5lIElCX0dSSF9WRVJTSU9OX01BU0sJMHhGCi0jZGVmaW5lIElCX0dSSF9WRVJTSU9OX1NISUZUCTI4Ci0jZGVmaW5lIElCX0dSSF9UQ0xBU1NfTUFTSwkweEZGCi0jZGVmaW5lIElCX0dSSF9UQ0xBU1NfU0hJRlQJMjAKLSNkZWZpbmUgSUJfR1JIX0ZMT1dfTUFTSwkweEZGRkZGCi0jZGVmaW5lIElCX0dSSF9GTE9XX1NISUZUCTAKLSNkZWZpbmUgSUJfR1JIX05FWFRfSERSCQkweDFCCi0KICNkZWZpbmUgSUJfREVGQVVMVF9HSURfUFJFRklYCWNwdV90b19iZTY0KDB4ZmU4MDAwMDAwMDAwMDAwMFVMTCkKIAogLyogVmFsdWVzIGZvciBzZXQvZ2V0IHBvcnRpbmZvIFZMQ2FwIE9wZXJhdGlvbmFsVkxzICovCkBAIC0xMjksNjEgKzEwNyw5IEBACiAJfQogfQogCi1zdHJ1Y3QgaWJfcmV0aCB7Ci0JX19iZTY0IHZhZGRyOwotCV9fYmUzMiBya2V5OwotCV9fYmUzMiBsZW5ndGg7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgaWJfYXRvbWljX2V0aCB7Ci0JX19iZTMyIHZhZGRyWzJdOyAgICAgICAgLyogdW5hbGlnbmVkIHNvIGFjY2VzcyBhcyAyIDMyLWJpdCB3b3JkcyAqLwotCV9fYmUzMiBya2V5OwotCV9fYmU2NCBzd2FwX2RhdGE7Ci0JX19iZTY0IGNvbXBhcmVfZGF0YTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBxaWJfb3RoZXJfaGVhZGVycyB7Ci0JX19iZTMyIGJ0aFszXTsKLQl1bmlvbiB7Ci0JCXN0cnVjdCB7Ci0JCQlfX2JlMzIgZGV0aFsyXTsKLQkJCV9fYmUzMiBpbW1fZGF0YTsKLQkJfSB1ZDsKLQkJc3RydWN0IHsKLQkJCXN0cnVjdCBpYl9yZXRoIHJldGg7Ci0JCQlfX2JlMzIgaW1tX2RhdGE7Ci0JCX0gcmM7Ci0JCXN0cnVjdCB7Ci0JCQlfX2JlMzIgYWV0aDsKLQkJCV9fYmUzMiBhdG9taWNfYWNrX2V0aFsyXTsKLQkJfSBhdDsKLQkJX19iZTMyIGltbV9kYXRhOwotCQlfX2JlMzIgYWV0aDsKLQkJX19iZTMyIGlldGg7Ci0JCXN0cnVjdCBpYl9hdG9taWNfZXRoIGF0b21pY19ldGg7Ci0JfSB1OwotfSBfX3BhY2tlZDsKLQotLyoKLSAqIE5vdGUgdGhhdCBVRCBwYWNrZXRzIHdpdGggYSBHUkggaGVhZGVyIGFyZSA4KzQwKzEyKzggPSA2OCBieXRlcwotICogbG9uZyAoNzIgdy8gaW1tX2RhdGEpLiAgT25seSB0aGUgZmlyc3QgNTYgYnl0ZXMgb2YgdGhlIElCIGhlYWRlcgotICogd2lsbCBiZSBpbiB0aGUgZWFnZXIgaGVhZGVyIGJ1ZmZlci4gIFRoZSByZW1haW5pbmcgMTIgb3IgMTYgYnl0ZXMKLSAqIGFyZSBpbiB0aGUgZGF0YSBidWZmZXIuCi0gKi8KLXN0cnVjdCBxaWJfaWJfaGVhZGVyIHsKLQlfX2JlMTYgbHJoWzRdOwotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCXN0cnVjdCBpYl9ncmggZ3JoOwotCQkJc3RydWN0IHFpYl9vdGhlcl9oZWFkZXJzIG90aDsKLQkJfSBsOwotCQlzdHJ1Y3QgcWliX290aGVyX2hlYWRlcnMgb3RoOwotCX0gdTsKLX0gX19wYWNrZWQ7Ci0KIHN0cnVjdCBxaWJfcGlvX2hlYWRlciB7CiAJX19sZTMyIHBiY1syXTsKLQlzdHJ1Y3QgcWliX2liX2hlYWRlciBoZHI7CisJc3RydWN0IGliX2hlYWRlciBoZHI7CiB9IF9fcGFja2VkOwogCiAvKgpAQCAtMTkxLDcgKzExNyw3IEBACiAgKiBpcyBtYWRlIGNvbW1vbi4KICAqLwogc3RydWN0IHFpYl9xcF9wcml2IHsKLQlzdHJ1Y3QgcWliX2liX2hlYWRlciAqc19oZHI7ICAgIC8qIG5leHQgcGFja2V0IGhlYWRlciB0byBzZW5kICovCisJc3RydWN0IGliX2hlYWRlciAqc19oZHI7ICAgICAgICAvKiBuZXh0IHBhY2tldCBoZWFkZXIgdG8gc2VuZCAqLwogCXN0cnVjdCBsaXN0X2hlYWQgaW93YWl0OyAgICAgICAgLyogbGluayBmb3Igd2FpdCBQSU8gYnVmICovCiAJYXRvbWljX3Qgc19kbWFfYnVzeTsKIAlzdHJ1Y3QgcWliX3ZlcmJzX3R4cmVxICpzX3R4OwpAQCAtMzc2LDcgKzMwMiw3IEBACiAKIHZvaWQgcWliX3B1dF90eHJlcShzdHJ1Y3QgcWliX3ZlcmJzX3R4cmVxICp0eCk7CiAKLWludCBxaWJfdmVyYnNfc2VuZChzdHJ1Y3QgcnZ0X3FwICpxcCwgc3RydWN0IHFpYl9pYl9oZWFkZXIgKmhkciwKK2ludCBxaWJfdmVyYnNfc2VuZChzdHJ1Y3QgcnZ0X3FwICpxcCwgc3RydWN0IGliX2hlYWRlciAqaGRyLAogCQkgICB1MzIgaGRyd29yZHMsIHN0cnVjdCBydnRfc2dlX3N0YXRlICpzcywgdTMyIGxlbik7CiAKIHZvaWQgcWliX2NvcHlfc2dlKHN0cnVjdCBydnRfc2dlX3N0YXRlICpzcywgdm9pZCAqZGF0YSwgdTMyIGxlbmd0aCwKQEAgLTM4NCwxMCArMzEwLDEwIEBACiAKIHZvaWQgcWliX3NraXBfc2dlKHN0cnVjdCBydnRfc2dlX3N0YXRlICpzcywgdTMyIGxlbmd0aCwgaW50IHJlbGVhc2UpOwogCi12b2lkIHFpYl91Y19yY3Yoc3RydWN0IHFpYl9pYnBvcnQgKmlicCwgc3RydWN0IHFpYl9pYl9oZWFkZXIgKmhkciwKK3ZvaWQgcWliX3VjX3JjdihzdHJ1Y3QgcWliX2licG9ydCAqaWJwLCBzdHJ1Y3QgaWJfaGVhZGVyICpoZHIsCiAJCWludCBoYXNfZ3JoLCB2b2lkICpkYXRhLCB1MzIgdGxlbiwgc3RydWN0IHJ2dF9xcCAqcXApOwogCi12b2lkIHFpYl9yY19yY3Yoc3RydWN0IHFpYl9jdHh0ZGF0YSAqcmNkLCBzdHJ1Y3QgcWliX2liX2hlYWRlciAqaGRyLAordm9pZCBxaWJfcmNfcmN2KHN0cnVjdCBxaWJfY3R4dGRhdGEgKnJjZCwgc3RydWN0IGliX2hlYWRlciAqaGRyLAogCQlpbnQgaGFzX2dyaCwgdm9pZCAqZGF0YSwgdTMyIHRsZW4sIHN0cnVjdCBydnRfcXAgKnFwKTsKIAogaW50IHFpYl9jaGVja19haChzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgc3RydWN0IGliX2FoX2F0dHIgKmFoX2F0dHIpOwpAQCAtMzk4LDEzICszMjQsMTMgQEAKIAogdm9pZCBxaWJfcmNfcm5yX3JldHJ5KHVuc2lnbmVkIGxvbmcgYXJnKTsKIAotdm9pZCBxaWJfcmNfc2VuZF9jb21wbGV0ZShzdHJ1Y3QgcnZ0X3FwICpxcCwgc3RydWN0IHFpYl9pYl9oZWFkZXIgKmhkcik7Cit2b2lkIHFpYl9yY19zZW5kX2NvbXBsZXRlKHN0cnVjdCBydnRfcXAgKnFwLCBzdHJ1Y3QgaWJfaGVhZGVyICpoZHIpOwogCiB2b2lkIHFpYl9yY19lcnJvcihzdHJ1Y3QgcnZ0X3FwICpxcCwgZW51bSBpYl93Y19zdGF0dXMgZXJyKTsKIAogaW50IHFpYl9wb3N0X3VkX3NlbmQoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBpYl9zZW5kX3dyICp3cik7CiAKLXZvaWQgcWliX3VkX3JjdihzdHJ1Y3QgcWliX2licG9ydCAqaWJwLCBzdHJ1Y3QgcWliX2liX2hlYWRlciAqaGRyLAordm9pZCBxaWJfdWRfcmN2KHN0cnVjdCBxaWJfaWJwb3J0ICppYnAsIHN0cnVjdCBpYl9oZWFkZXIgKmhkciwKIAkJaW50IGhhc19ncmgsIHZvaWQgKmRhdGEsIHUzMiB0bGVuLCBzdHJ1Y3QgcnZ0X3FwICpxcCk7CiAKIHZvaWQgbXJfcmN1X2NhbGxiYWNrKHN0cnVjdCByY3VfaGVhZCAqbGlzdCk7CkBAIC00MTMsMTMgKzMzOSwxMyBAQAogCiB2b2lkIHFpYl9taWdyYXRlX3FwKHN0cnVjdCBydnRfcXAgKnFwKTsKIAotaW50IHFpYl9ydWNfY2hlY2tfaGRyKHN0cnVjdCBxaWJfaWJwb3J0ICppYnAsIHN0cnVjdCBxaWJfaWJfaGVhZGVyICpoZHIsCitpbnQgcWliX3J1Y19jaGVja19oZHIoc3RydWN0IHFpYl9pYnBvcnQgKmlicCwgc3RydWN0IGliX2hlYWRlciAqaGRyLAogCQkgICAgICBpbnQgaGFzX2dyaCwgc3RydWN0IHJ2dF9xcCAqcXAsIHUzMiBidGgwKTsKIAogdTMyIHFpYl9tYWtlX2dyaChzdHJ1Y3QgcWliX2licG9ydCAqaWJwLCBzdHJ1Y3QgaWJfZ3JoICpoZHIsCiAJCSBzdHJ1Y3QgaWJfZ2xvYmFsX3JvdXRlICpncmgsIHUzMiBod29yZHMsIHUzMiBud29yZHMpOwogCi12b2lkIHFpYl9tYWtlX3J1Y19oZWFkZXIoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBxaWJfb3RoZXJfaGVhZGVycyAqb2hkciwKK3ZvaWQgcWliX21ha2VfcnVjX2hlYWRlcihzdHJ1Y3QgcnZ0X3FwICpxcCwgc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHIsCiAJCQkgdTMyIGJ0aDAsIHUzMiBidGgyKTsKIAogdm9pZCBfcWliX2RvX3NlbmQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody91c25pYy91c25pY19pYl9tYWluLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvdXNuaWMvdXNuaWNfaWJfbWFpbi5jCmluZGV4IGMyMjliOWYuLjBhODlhOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody91c25pYy91c25pY19pYl9tYWluLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3VzbmljL3VzbmljX2liX21haW4uYwpAQCAtNjY0LDcgKzY2NCw4IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0JaWYgKHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnVzbmljX2liX3BjaV9kcml2ZXIpKSB7CisJZXJyID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmdXNuaWNfaWJfcGNpX2RyaXZlcik7CisJaWYgKGVycikgewogCQl1c25pY19lcnIoIlVuYWJsZSB0byByZWdpc3RlciB3aXRoIFBDSVxuIik7CiAJCWdvdG8gb3V0X3VtZW1fZmluaTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvc3cvcmRtYXZ0L21yLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvc3cvcmRtYXZ0L21yLmMKaW5kZXggODBjNGI2Yi4uNDZiNjQ5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3N3L3JkbWF2dC9tci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yZG1hdnQvbXIuYwpAQCAtMjk0LDcgKzI5NCw3IEBACiB7CiAJcnZ0X2RlaW5pdF9tcmVnaW9uKCZtci0+bXIpOwogCXJ2dF9mcmVlX2xrZXkoJm1yLT5tcik7Ci0JdmZyZWUobXIpOworCWtmcmVlKG1yKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvc3cvcmRtYXZ0L3FwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvc3cvcmRtYXZ0L3FwLmMKaW5kZXggYmRiNTQwZi4uNjUwMGMzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3N3L3JkbWF2dC9xcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yZG1hdnQvcXAuYwpAQCAtNDg4LDYwICs0ODgsMjMgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZGktPnFwX2Rldi0+cXB0X2xvY2ssIGZsYWdzKTsKIAlpZiAocmVtb3ZlZCkgewogCQlzeW5jaHJvbml6ZV9yY3UoKTsKLQkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnFwLT5yZWZjb3VudCkpCi0JCQl3YWtlX3VwKCZxcC0+d2FpdCk7CisJCXJ2dF9wdXRfcXAocXApOwogCX0KIH0KIAogLyoqCi0gKiByZXNldF9xcCAtIGluaXRpYWxpemUgdGhlIFFQIHN0YXRlIHRvIHRoZSByZXNldCBzdGF0ZQotICogQHFwOiB0aGUgUVAgdG8gcmVzZXQKKyAqIHJ2dF9pbml0X3FwIC0gaW5pdGlhbGl6ZSB0aGUgUVAgc3RhdGUgdG8gdGhlIHJlc2V0IHN0YXRlCisgKiBAcXA6IHRoZSBRUCB0byBpbml0IG9yIHJlaW5pdAogICogQHR5cGU6IHRoZSBRUCB0eXBlCi0gKiByIGFuZCBzIGxvY2sgYXJlIHJlcXVpcmVkIHRvIGJlIGhlbGQgYnkgdGhlIGNhbGxlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gYm90aCBydnRfY3JlYXRlX3FwKCkgYW5kCisgKiBydnRfcmVzZXRfcXAoKS4gICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSByZXNldAorICogcGF0Y2ggdGhlIG5lY2Vzc2FyeSBsb2NrcyB0byBwcm90ZWN0IGFnYWluc3QgY29uY3VyZW50CisgKiBhY2Nlc3MuCiAgKi8KLXN0YXRpYyB2b2lkIHJ2dF9yZXNldF9xcChzdHJ1Y3QgcnZ0X2Rldl9pbmZvICpyZGksIHN0cnVjdCBydnRfcXAgKnFwLAotCQkgIGVudW0gaWJfcXBfdHlwZSB0eXBlKQotCV9fcmVsZWFzZXMoJnFwLT5zX2xvY2spCi0JX19yZWxlYXNlcygmcXAtPnNfaGxvY2spCi0JX19yZWxlYXNlcygmcXAtPnJfbG9jaykKLQlfX2FjcXVpcmVzKCZxcC0+cl9sb2NrKQotCV9fYWNxdWlyZXMoJnFwLT5zX2hsb2NrKQotCV9fYWNxdWlyZXMoJnFwLT5zX2xvY2spCitzdGF0aWMgdm9pZCBydnRfaW5pdF9xcChzdHJ1Y3QgcnZ0X2Rldl9pbmZvICpyZGksIHN0cnVjdCBydnRfcXAgKnFwLAorCQkJZW51bSBpYl9xcF90eXBlIHR5cGUpCiB7Ci0JaWYgKHFwLT5zdGF0ZSAhPSBJQl9RUFNfUkVTRVQpIHsKLQkJcXAtPnN0YXRlID0gSUJfUVBTX1JFU0VUOwotCi0JCS8qIExldCBkcml2ZXJzIGZsdXNoIHRoZWlyIHdhaXRsaXN0ICovCi0JCXJkaS0+ZHJpdmVyX2YuZmx1c2hfcXBfd2FpdGVycyhxcCk7Ci0JCXFwLT5zX2ZsYWdzICY9IH4oUlZUX1NfVElNRVIgfCBSVlRfU19BTllfV0FJVCk7Ci0JCXNwaW5fdW5sb2NrKCZxcC0+c19sb2NrKTsKLQkJc3Bpbl91bmxvY2soJnFwLT5zX2hsb2NrKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZxcC0+cl9sb2NrKTsKLQotCQkvKiBTdG9wIHRoZSBzZW5kIHF1ZXVlIGFuZCB0aGUgcmV0cnkgdGltZXIgKi8KLQkJcmRpLT5kcml2ZXJfZi5zdG9wX3NlbmRfcXVldWUocXApOwotCi0JCS8qIFdhaXQgZm9yIHRoaW5ncyB0byBzdG9wICovCi0JCXJkaS0+ZHJpdmVyX2YucXVpZXNjZV9xcChxcCk7Ci0KLQkJLyogdGFrZSBxcCBvdXQgdGhlIGhhc2ggYW5kIHdhaXQgZm9yIGl0IHRvIGJlIHVudXNlZCAqLwotCQlydnRfcmVtb3ZlX3FwKHJkaSwgcXApOwotCQl3YWl0X2V2ZW50KHFwLT53YWl0LCAhYXRvbWljX3JlYWQoJnFwLT5yZWZjb3VudCkpOwotCi0JCS8qIGdyYWIgdGhlIGxvY2sgYi9jIGl0IHdhcyBsb2NrZWQgYXQgY2FsbCB0aW1lICovCi0JCXNwaW5fbG9ja19pcnEoJnFwLT5yX2xvY2spOwotCQlzcGluX2xvY2soJnFwLT5zX2hsb2NrKTsKLQkJc3Bpbl9sb2NrKCZxcC0+c19sb2NrKTsKLQotCQlydnRfY2xlYXJfbXJfcmVmcyhxcCwgMSk7Ci0JfQotCi0JLyoKLQkgKiBMZXQgdGhlIGRyaXZlciBkbyBhbnkgdGVhciBkb3duIGl0IG5lZWRzIHRvIGZvciBhIHFwCi0JICogdGhhdCBoYXMgYmVlbiByZXNldAotCSAqLwotCXJkaS0+ZHJpdmVyX2Yubm90aWZ5X3FwX3Jlc2V0KHFwKTsKLQogCXFwLT5yZW1vdGVfcXBuID0gMDsKIAlxcC0+cWtleSA9IDA7CiAJcXAtPnFwX2FjY2Vzc19mbGFncyA9IDA7CkBAIC01ODcsNiArNTUwLDYwIEBACiB9CiAKIC8qKgorICogcnZ0X3Jlc2V0X3FwIC0gaW5pdGlhbGl6ZSB0aGUgUVAgc3RhdGUgdG8gdGhlIHJlc2V0IHN0YXRlCisgKiBAcXA6IHRoZSBRUCB0byByZXNldAorICogQHR5cGU6IHRoZSBRUCB0eXBlCisgKgorICogcl9sb2NrLCBzX2hsb2NrLCBhbmQgc19sb2NrIGFyZSByZXF1aXJlZCB0byBiZSBoZWxkIGJ5IHRoZSBjYWxsZXIKKyAqLworc3RhdGljIHZvaWQgcnZ0X3Jlc2V0X3FwKHN0cnVjdCBydnRfZGV2X2luZm8gKnJkaSwgc3RydWN0IHJ2dF9xcCAqcXAsCisJCQkgZW51bSBpYl9xcF90eXBlIHR5cGUpCisJX19tdXN0X2hvbGQoJnFwLT5zX2xvY2spCisJX19tdXN0X2hvbGQoJnFwLT5zX2hsb2NrKQorCV9fbXVzdF9ob2xkKCZxcC0+cl9sb2NrKQoreworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnFwLT5yX2xvY2spOworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnFwLT5zX2hsb2NrKTsKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKKwlpZiAocXAtPnN0YXRlICE9IElCX1FQU19SRVNFVCkgeworCQlxcC0+c3RhdGUgPSBJQl9RUFNfUkVTRVQ7CisKKwkJLyogTGV0IGRyaXZlcnMgZmx1c2ggdGhlaXIgd2FpdGxpc3QgKi8KKwkJcmRpLT5kcml2ZXJfZi5mbHVzaF9xcF93YWl0ZXJzKHFwKTsKKwkJcXAtPnNfZmxhZ3MgJj0gfihSVlRfU19USU1FUiB8IFJWVF9TX0FOWV9XQUlUKTsKKwkJc3Bpbl91bmxvY2soJnFwLT5zX2xvY2spOworCQlzcGluX3VubG9jaygmcXAtPnNfaGxvY2spOworCQlzcGluX3VubG9ja19pcnEoJnFwLT5yX2xvY2spOworCisJCS8qIFN0b3AgdGhlIHNlbmQgcXVldWUgYW5kIHRoZSByZXRyeSB0aW1lciAqLworCQlyZGktPmRyaXZlcl9mLnN0b3Bfc2VuZF9xdWV1ZShxcCk7CisKKwkJLyogV2FpdCBmb3IgdGhpbmdzIHRvIHN0b3AgKi8KKwkJcmRpLT5kcml2ZXJfZi5xdWllc2NlX3FwKHFwKTsKKworCQkvKiB0YWtlIHFwIG91dCB0aGUgaGFzaCBhbmQgd2FpdCBmb3IgaXQgdG8gYmUgdW51c2VkICovCisJCXJ2dF9yZW1vdmVfcXAocmRpLCBxcCk7CisJCXdhaXRfZXZlbnQocXAtPndhaXQsICFhdG9taWNfcmVhZCgmcXAtPnJlZmNvdW50KSk7CisKKwkJLyogZ3JhYiB0aGUgbG9jayBiL2MgaXQgd2FzIGxvY2tlZCBhdCBjYWxsIHRpbWUgKi8KKwkJc3Bpbl9sb2NrX2lycSgmcXAtPnJfbG9jayk7CisJCXNwaW5fbG9jaygmcXAtPnNfaGxvY2spOworCQlzcGluX2xvY2soJnFwLT5zX2xvY2spOworCisJCXJ2dF9jbGVhcl9tcl9yZWZzKHFwLCAxKTsKKwkJLyoKKwkJICogTGV0IHRoZSBkcml2ZXIgZG8gYW55IHRlYXIgZG93biBvciByZS1pbml0IGl0IG5lZWRzIHRvIGZvcgorCQkgKiBhIHFwIHRoYXQgaGFzIGJlZW4gcmVzZXQKKwkJICovCisJCXJkaS0+ZHJpdmVyX2Yubm90aWZ5X3FwX3Jlc2V0KHFwKTsKKwl9CisJcnZ0X2luaXRfcXAocmRpLCBxcCwgdHlwZSk7CisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcXAtPnJfbG9jayk7CisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcXAtPnNfaGxvY2spOworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnFwLT5zX2xvY2spOworfQorCisvKioKICAqIHJ2dF9jcmVhdGVfcXAgLSBjcmVhdGUgYSBxdWV1ZSBwYWlyIGZvciBhIGRldmljZQogICogQGlicGQ6IHRoZSBwcm90ZWN0aW9uIGRvbWFpbiB3aG8ncyBkZXZpY2Ugd2UgY3JlYXRlIHRoZSBxdWV1ZSBwYWlyIGZvcgogICogQGluaXRfYXR0cjogdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHF1ZXVlIHBhaXIKQEAgLTc2Niw3ICs3ODMsNyBAQAogCQl9CiAJCXFwLT5pYnFwLnFwX251bSA9IGVycjsKIAkJcXAtPnBvcnRfbnVtID0gaW5pdF9hdHRyLT5wb3J0X251bTsKLQkJcnZ0X3Jlc2V0X3FwKHJkaSwgcXAsIGluaXRfYXR0ci0+cXBfdHlwZSk7CisJCXJ2dF9pbml0X3FwKHJkaSwgcXAsIGluaXRfYXR0ci0+cXBfdHlwZSk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTg3Myw3ICs4OTAsOCBAQAogCWZyZWVfcXBuKCZyZGktPnFwX2Rldi0+cXBuX3RhYmxlLCBxcC0+aWJxcC5xcF9udW0pOwogCiBiYWlsX3JxX3dxOgotCXZmcmVlKHFwLT5yX3JxLndxKTsKKwlpZiAoIXFwLT5pcCkKKwkJdmZyZWUocXAtPnJfcnEud3EpOwogCiBiYWlsX2RyaXZlcl9wcml2OgogCXJkaS0+ZHJpdmVyX2YucXBfcHJpdl9mcmVlKHJkaSwgcXApOwpAQCAtOTA1LDYgKzkyMyw4IEBACiAJaW50IHJldCA9IDA7CiAJc3RydWN0IHJ2dF9kZXZfaW5mbyAqcmRpID0gaWJfdG9fcnZ0KHFwLT5pYnFwLmRldmljZSk7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+cl9sb2NrKTsKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAlpZiAocXAtPnN0YXRlID09IElCX1FQU19FUlIgfHwgcXAtPnN0YXRlID09IElCX1FQU19SRVNFVCkKIAkJZ290byBiYWlsOwogCkBAIC05NzksNyArOTk5LDcgQEAKIAlzdHJ1Y3QgcnZ0X2licG9ydCAqcnZwID0gcmRpLT5wb3J0c1txcC0+cG9ydF9udW0gLSAxXTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JYXRvbWljX2luYygmcXAtPnJlZmNvdW50KTsKKwlydnRfZ2V0X3FwKHFwKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcmRpLT5xcF9kZXYtPnFwdF9sb2NrLCBmbGFncyk7CiAKIAlpZiAocXAtPmlicXAucXBfbnVtIDw9IDEpIHsKQEAgLTk5Niw3ICsxMDE2LDcgQEAKIH0KIAogLyoqCi0gKiBxaWJfbW9kaWZ5X3FwIC0gbW9kaWZ5IHRoZSBhdHRyaWJ1dGVzIG9mIGEgcXVldWUgcGFpcgorICogcnZ0X21vZGlmeV9xcCAtIG1vZGlmeSB0aGUgYXR0cmlidXRlcyBvZiBhIHF1ZXVlIHBhaXIKICAqIEBpYnFwOiB0aGUgcXVldWUgcGFpciB3aG8ncyBhdHRyaWJ1dGVzIHdlJ3JlIG1vZGlmeWluZwogICogQGF0dHI6IHRoZSBuZXcgYXR0cmlidXRlcwogICogQGF0dHJfbWFzazogdGhlIG1hc2sgb2YgYXR0cmlidXRlcyB0byBtb2RpZnkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZS5jCmluZGV4IDU1ZjBlOGYuLmRkZDU5MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGUuYwpAQCAtMzYyLDE1ICszNjIsMzQgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQllcnIgPSByeGVfbmV0X2luaXQoKTsKKwllcnIgPSByeGVfbmV0X2lwdjRfaW5pdCgpOwogCWlmIChlcnIpIHsKLQkJcHJfZXJyKCJyeGU6IHVuYWJsZSB0byBpbml0XG4iKTsKKwkJcHJfZXJyKCJyeGU6IHVuYWJsZSB0byBpbml0IGlwdjQgdHVubmVsXG4iKTsKIAkJcnhlX2NhY2hlX2V4aXQoKTsKLQkJcmV0dXJuIGVycjsKKwkJZ290byBleGl0OwogCX0KKworCWVyciA9IHJ4ZV9uZXRfaXB2Nl9pbml0KCk7CisJaWYgKGVycikgeworCQlwcl9lcnIoInJ4ZTogdW5hYmxlIHRvIGluaXQgaXB2NiB0dW5uZWxcbiIpOworCQlyeGVfY2FjaGVfZXhpdCgpOworCQlnb3RvIGV4aXQ7CisJfQorCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZyeGVfbmV0X25vdGlmaWVyKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigicnhlOiBGYWlsZWQgdG8gcmlnaXN0ZXIgbmV0ZGV2IG5vdGlmaWVyXG4iKTsKKwkJZ290byBleGl0OworCX0KKwogCXByX2luZm8oInJ4ZTogbG9hZGVkXG4iKTsKIAogCXJldHVybiAwOworCitleGl0OgorCXJ4ZV9yZWxlYXNlX3VkcF90dW5uZWwocmVjdl9zb2NrZXRzLnNrNCk7CisJcnhlX3JlbGVhc2VfdWRwX3R1bm5lbChyZWN2X3NvY2tldHMuc2s2KTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcnhlX21vZHVsZV9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV9jb21wLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV9jb21wLmMKaW5kZXggMzZmNjdkZS4uMWM1OWVmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGVfY29tcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX2NvbXAuYwpAQCAtNjg5LDcgKzY4OSwxNCBAQAogCQkJCQlxcC0+cmVxLm5lZWRfcmV0cnkgPSAxOwogCQkJCQlyeGVfcnVuX3Rhc2soJnFwLT5yZXEudGFzaywgMSk7CiAJCQkJfQorCisJCQkJaWYgKHBrdCkgeworCQkJCQlyeGVfZHJvcF9yZWYocGt0LT5xcCk7CisJCQkJCWtmcmVlX3NrYihza2IpOworCQkJCX0KKwogCQkJCWdvdG8gZXhpdDsKKwogCQkJfSBlbHNlIHsKIAkJCQl3cWUtPnN0YXR1cyA9IElCX1dDX1JFVFJZX0VYQ19FUlI7CiAJCQkJc3RhdGUgPSBDT01QU1RfRVJST1I7CkBAIC03MTYsNiArNzIzLDEyIEBACiAJCWNhc2UgQ09NUFNUX0VSUk9SOgogCQkJZG9fY29tcGxldGUocXAsIHdxZSk7CiAJCQlyeGVfcXBfZXJyb3IocXApOworCisJCQlpZiAocGt0KSB7CisJCQkJcnhlX2Ryb3BfcmVmKHBrdC0+cXApOworCQkJCWtmcmVlX3NrYihza2IpOworCQkJfQorCiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV9uZXQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX25ldC5jCmluZGV4IDBiOGQyZWEuLmVlZGYyZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX25ldC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX25ldC5jCkBAIC0yNzUsOSArMjc1LDEwIEBACiAJcmV0dXJuIHNvY2s7CiB9CiAKLXN0YXRpYyB2b2lkIHJ4ZV9yZWxlYXNlX3VkcF90dW5uZWwoc3RydWN0IHNvY2tldCAqc2spCit2b2lkIHJ4ZV9yZWxlYXNlX3VkcF90dW5uZWwoc3RydWN0IHNvY2tldCAqc2spCiB7Ci0JdWRwX3R1bm5lbF9zb2NrX3JlbGVhc2Uoc2spOworCWlmIChzaykKKwkJdWRwX3R1bm5lbF9zb2NrX3JlbGVhc2Uoc2spOwogfQogCiBzdGF0aWMgdm9pZCBwcmVwYXJlX3VkcF9oZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgX19iZTE2IHNyY19wb3J0LApAQCAtNjU4LDUxICs2NTksNDUgQEAKIAlyZXR1cm4gTk9USUZZX09LOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHJ4ZV9uZXRfbm90aWZpZXIgPSB7CitzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcnhlX25ldF9ub3RpZmllciA9IHsKIAkubm90aWZpZXJfY2FsbCA9IHJ4ZV9ub3RpZnksCiB9OwogCi1pbnQgcnhlX25ldF9pbml0KHZvaWQpCitpbnQgcnhlX25ldF9pcHY0X2luaXQodm9pZCkKIHsKLQlpbnQgZXJyOworCXNwaW5fbG9ja19pbml0KCZkZXZfbGlzdF9sb2NrKTsKKworCXJlY3Zfc29ja2V0cy5zazQgPSByeGVfc2V0dXBfdWRwX3R1bm5lbCgmaW5pdF9uZXQsCisJCQkJaHRvbnMoUk9DRV9WMl9VRFBfRFBPUlQpLCBmYWxzZSk7CisJaWYgKElTX0VSUihyZWN2X3NvY2tldHMuc2s0KSkgeworCQlyZWN2X3NvY2tldHMuc2s0ID0gTlVMTDsKKwkJcHJfZXJyKCJyeGU6IEZhaWxlZCB0byBjcmVhdGUgSVB2NCBVRFAgdHVubmVsXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgcnhlX25ldF9pcHY2X2luaXQodm9pZCkKK3sKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCiAJc3Bpbl9sb2NrX2luaXQoJmRldl9saXN0X2xvY2spOwogCiAJcmVjdl9zb2NrZXRzLnNrNiA9IHJ4ZV9zZXR1cF91ZHBfdHVubmVsKCZpbml0X25ldCwKLQkJCWh0b25zKFJPQ0VfVjJfVURQX0RQT1JUKSwgdHJ1ZSk7CisJCQkJCQlodG9ucyhST0NFX1YyX1VEUF9EUE9SVCksIHRydWUpOwogCWlmIChJU19FUlIocmVjdl9zb2NrZXRzLnNrNikpIHsKIAkJcmVjdl9zb2NrZXRzLnNrNiA9IE5VTEw7CiAJCXByX2VycigicnhlOiBGYWlsZWQgdG8gY3JlYXRlIElQdjYgVURQIHR1bm5lbFxuIik7CiAJCXJldHVybiAtMTsKIAl9Ci0KLQlyZWN2X3NvY2tldHMuc2s0ID0gcnhlX3NldHVwX3VkcF90dW5uZWwoJmluaXRfbmV0LAotCQkJaHRvbnMoUk9DRV9WMl9VRFBfRFBPUlQpLCBmYWxzZSk7Ci0JaWYgKElTX0VSUihyZWN2X3NvY2tldHMuc2s0KSkgewotCQlyeGVfcmVsZWFzZV91ZHBfdHVubmVsKHJlY3Zfc29ja2V0cy5zazYpOwotCQlyZWN2X3NvY2tldHMuc2s0ID0gTlVMTDsKLQkJcmVjdl9zb2NrZXRzLnNrNiA9IE5VTEw7Ci0JCXByX2VycigicnhlOiBGYWlsZWQgdG8gY3JlYXRlIElQdjQgVURQIHR1bm5lbFxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQllcnIgPSByZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJnJ4ZV9uZXRfbm90aWZpZXIpOwotCWlmIChlcnIpIHsKLQkJcnhlX3JlbGVhc2VfdWRwX3R1bm5lbChyZWN2X3NvY2tldHMuc2s2KTsKLQkJcnhlX3JlbGVhc2VfdWRwX3R1bm5lbChyZWN2X3NvY2tldHMuc2s0KTsKLQkJcHJfZXJyKCJyeGU6IEZhaWxlZCB0byByaWdpc3RlciBuZXRkZXYgbm90aWZpZXJcbiIpOwotCX0KLQotCXJldHVybiBlcnI7CisjZW5kaWYKKwlyZXR1cm4gMDsKIH0KIAogdm9pZCByeGVfbmV0X2V4aXQodm9pZCkKIHsKLQlpZiAocmVjdl9zb2NrZXRzLnNrNikKLQkJcnhlX3JlbGVhc2VfdWRwX3R1bm5lbChyZWN2X3NvY2tldHMuc2s2KTsKLQotCWlmIChyZWN2X3NvY2tldHMuc2s0KQotCQlyeGVfcmVsZWFzZV91ZHBfdHVubmVsKHJlY3Zfc29ja2V0cy5zazQpOwotCisJcnhlX3JlbGVhc2VfdWRwX3R1bm5lbChyZWN2X3NvY2tldHMuc2s2KTsKKwlyeGVfcmVsZWFzZV91ZHBfdHVubmVsKHJlY3Zfc29ja2V0cy5zazQpOwogCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZyeGVfbmV0X25vdGlmaWVyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX25ldC5oIGIvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGVfbmV0LmgKaW5kZXggN2IwNmY3Ni4uMGRhZjdmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGVfbmV0LmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGVfbmV0LmgKQEAgLTQ0LDEwICs0NCwxMyBAQAogfTsKIAogZXh0ZXJuIHN0cnVjdCByeGVfcmVjdl9zb2NrZXRzIHJlY3Zfc29ja2V0czsKK2V4dGVybiBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcnhlX25ldF9ub3RpZmllcjsKK3ZvaWQgcnhlX3JlbGVhc2VfdWRwX3R1bm5lbChzdHJ1Y3Qgc29ja2V0ICpzayk7CiAKIHN0cnVjdCByeGVfZGV2ICpyeGVfbmV0X2FkZChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldik7CiAKLWludCByeGVfbmV0X2luaXQodm9pZCk7CitpbnQgcnhlX25ldF9pcHY0X2luaXQodm9pZCk7CitpbnQgcnhlX25ldF9pcHY2X2luaXQodm9pZCk7CiB2b2lkIHJ4ZV9uZXRfZXhpdCh2b2lkKTsKIAogI2VuZGlmIC8qIFJYRV9ORVRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGVfcmVjdi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGVfcmVjdi5jCmluZGV4IDNkNDY0YzIuLjE0NGQyZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX3JlY3YuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV9yZWN2LmMKQEAgLTMxMiw3ICszMTIsNyBAQAogCQkgKiBtYWtlIGEgY29weSBvZiB0aGUgc2tiIHRvIHBvc3QgdG8gdGhlIG5leHQgcXAKIAkJICovCiAJCXNrYl9jb3B5ID0gKG1jZS0+cXBfbGlzdC5uZXh0ICE9ICZtY2ctPnFwX2xpc3QpID8KLQkJCQlza2JfY2xvbmUoc2tiLCBHRlBfS0VSTkVMKSA6IE5VTEw7CisJCQkJc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQykgOiBOVUxMOwogCiAJCXBrdC0+cXAgPSBxcDsKIAkJcnhlX2FkZF9yZWYocXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGVfcmVxLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV9yZXEuYwppbmRleCAzM2IyZDlkLi4xM2E4NDhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV9yZXEuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV9yZXEuYwpAQCAtNTExLDI0ICs1MTEsMjEgQEAKIH0KIAogc3RhdGljIHZvaWQgdXBkYXRlX3dxZV9zdGF0ZShzdHJ1Y3QgcnhlX3FwICpxcCwKLQkJCSAgICAgc3RydWN0IHJ4ZV9zZW5kX3dxZSAqd3FlLAotCQkJICAgICBzdHJ1Y3QgcnhlX3BrdF9pbmZvICpwa3QsCi0JCQkgICAgIGVudW0gd3FlX3N0YXRlICpwcmV2X3N0YXRlKQorCQlzdHJ1Y3QgcnhlX3NlbmRfd3FlICp3cWUsCisJCXN0cnVjdCByeGVfcGt0X2luZm8gKnBrdCkKIHsKLQllbnVtIHdxZV9zdGF0ZSBwcmV2X3N0YXRlXyA9IHdxZS0+c3RhdGU7Ci0KIAlpZiAocGt0LT5tYXNrICYgUlhFX0VORF9NQVNLKSB7CiAJCWlmIChxcF90eXBlKHFwKSA9PSBJQl9RUFRfUkMpCiAJCQl3cWUtPnN0YXRlID0gd3FlX3N0YXRlX3BlbmRpbmc7CiAJfSBlbHNlIHsKIAkJd3FlLT5zdGF0ZSA9IHdxZV9zdGF0ZV9wcm9jZXNzaW5nOwogCX0KLQotCSpwcmV2X3N0YXRlID0gcHJldl9zdGF0ZV87CiB9CiAKLXN0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0ZShzdHJ1Y3QgcnhlX3FwICpxcCwgc3RydWN0IHJ4ZV9zZW5kX3dxZSAqd3FlLAotCQkJIHN0cnVjdCByeGVfcGt0X2luZm8gKnBrdCwgaW50IHBheWxvYWQpCitzdGF0aWMgdm9pZCB1cGRhdGVfd3FlX3BzbihzdHJ1Y3QgcnhlX3FwICpxcCwKKwkJCSAgIHN0cnVjdCByeGVfc2VuZF93cWUgKndxZSwKKwkJCSAgIHN0cnVjdCByeGVfcGt0X2luZm8gKnBrdCwKKwkJCSAgIGludCBwYXlsb2FkKQogewogCS8qIG51bWJlciBvZiBwYWNrZXRzIGxlZnQgdG8gc2VuZCBpbmNsdWRpbmcgY3VycmVudCBvbmUgKi8KIAlpbnQgbnVtX3BrdCA9ICh3cWUtPmRtYS5yZXNpZCArIHBheWxvYWQgKyBxcC0+bXR1IC0gMSkgLyBxcC0+bXR1OwpAQCAtNTQ2LDEwICs1NDMsMzUgQEAKIAkJcXAtPnJlcS5wc24gPSAod3FlLT5maXJzdF9wc24gKyBudW1fcGt0KSAmIEJUSF9QU05fTUFTSzsKIAllbHNlCiAJCXFwLT5yZXEucHNuID0gKHFwLT5yZXEucHNuICsgMSkgJiBCVEhfUFNOX01BU0s7Cit9CiAKK3N0YXRpYyB2b2lkIHNhdmVfc3RhdGUoc3RydWN0IHJ4ZV9zZW5kX3dxZSAqd3FlLAorCQkgICAgICAgc3RydWN0IHJ4ZV9xcCAqcXAsCisJCSAgICAgICBzdHJ1Y3QgcnhlX3NlbmRfd3FlICpyb2xsYmFja193cWUsCisJCSAgICAgICBzdHJ1Y3QgcnhlX3FwICpyb2xsYmFja19xcCkKK3sKKwlyb2xsYmFja193cWUtPnN0YXRlICAgICA9IHdxZS0+c3RhdGU7CisJcm9sbGJhY2tfd3FlLT5maXJzdF9wc24gPSB3cWUtPmZpcnN0X3BzbjsKKwlyb2xsYmFja193cWUtPmxhc3RfcHNuICA9IHdxZS0+bGFzdF9wc247CisJcm9sbGJhY2tfcXAtPnJlcS5wc24gICAgPSBxcC0+cmVxLnBzbjsKK30KKworc3RhdGljIHZvaWQgcm9sbGJhY2tfc3RhdGUoc3RydWN0IHJ4ZV9zZW5kX3dxZSAqd3FlLAorCQkJICAgc3RydWN0IHJ4ZV9xcCAqcXAsCisJCQkgICBzdHJ1Y3QgcnhlX3NlbmRfd3FlICpyb2xsYmFja193cWUsCisJCQkgICBzdHJ1Y3QgcnhlX3FwICpyb2xsYmFja19xcCkKK3sKKwl3cWUtPnN0YXRlICAgICA9IHJvbGxiYWNrX3dxZS0+c3RhdGU7CisJd3FlLT5maXJzdF9wc24gPSByb2xsYmFja193cWUtPmZpcnN0X3BzbjsKKwl3cWUtPmxhc3RfcHNuICA9IHJvbGxiYWNrX3dxZS0+bGFzdF9wc247CisJcXAtPnJlcS5wc24gICAgPSByb2xsYmFja19xcC0+cmVxLnBzbjsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX3N0YXRlKHN0cnVjdCByeGVfcXAgKnFwLCBzdHJ1Y3QgcnhlX3NlbmRfd3FlICp3cWUsCisJCQkgc3RydWN0IHJ4ZV9wa3RfaW5mbyAqcGt0LCBpbnQgcGF5bG9hZCkKK3sKIAlxcC0+cmVxLm9wY29kZSA9IHBrdC0+b3Bjb2RlOwogCi0KIAlpZiAocGt0LT5tYXNrICYgUlhFX0VORF9NQVNLKQogCQlxcC0+cmVxLndxZV9pbmRleCA9IG5leHRfaW5kZXgocXAtPnNxLnF1ZXVlLCBxcC0+cmVxLndxZV9pbmRleCk7CiAKQEAgLTU3MSw3ICs1OTMsOCBAQAogCWludCBtdHU7CiAJaW50IG9wY29kZTsKIAlpbnQgcmV0OwotCWVudW0gd3FlX3N0YXRlIHByZXZfc3RhdGU7CisJc3RydWN0IHJ4ZV9xcCByb2xsYmFja19xcDsKKwlzdHJ1Y3QgcnhlX3NlbmRfd3FlIHJvbGxiYWNrX3dxZTsKIAogbmV4dF93cWU6CiAJaWYgKHVubGlrZWx5KCFxcC0+dmFsaWQgfHwgcXAtPnJlcS5zdGF0ZSA9PSBRUF9TVEFURV9FUlJPUikpCkBAIC02ODgsMTMgKzcxMSwyMSBAQAogCQlnb3RvIGVycjsKIAl9CiAKLQl1cGRhdGVfd3FlX3N0YXRlKHFwLCB3cWUsICZwa3QsICZwcmV2X3N0YXRlKTsKKwkvKgorCSAqIFRvIHByZXZlbnQgYSByYWNlIG9uIHdxZSBhY2Nlc3MgYmV0d2VlbiByZXF1ZXN0ZXIgYW5kIGNvbXBsZXRlciwKKwkgKiB3cWUgbWVtYmVycyBzdGF0ZSBhbmQgcHNuIG5lZWQgdG8gYmUgc2V0IGJlZm9yZSBjYWxsaW5nCisJICogcnhlX3htaXRfcGFja2V0KCkuCisJICogT3RoZXJ3aXNlLCBjb21wbGV0ZXIgbWlnaHQgaW5pdGlhdGUgYW4gdW5qdXN0aWZpZWQgcmV0cnkgZmxvdy4KKwkgKi8KKwlzYXZlX3N0YXRlKHdxZSwgcXAsICZyb2xsYmFja193cWUsICZyb2xsYmFja19xcCk7CisJdXBkYXRlX3dxZV9zdGF0ZShxcCwgd3FlLCAmcGt0KTsKKwl1cGRhdGVfd3FlX3BzbihxcCwgd3FlLCAmcGt0LCBwYXlsb2FkKTsKIAlyZXQgPSByeGVfeG1pdF9wYWNrZXQodG9fcmRldihxcC0+aWJxcC5kZXZpY2UpLCBxcCwgJnBrdCwgc2tiKTsKIAlpZiAocmV0KSB7CiAJCXFwLT5uZWVkX3JlcV9za2IgPSAxOwogCQlrZnJlZV9za2Ioc2tiKTsKIAotCQl3cWUtPnN0YXRlID0gcHJldl9zdGF0ZTsKKwkJcm9sbGJhY2tfc3RhdGUod3FlLCBxcCwgJnJvbGxiYWNrX3dxZSwgJnJvbGxiYWNrX3FwKTsKIAogCQlpZiAocmV0ID09IC1FQUdBSU4pIHsKIAkJCXJ4ZV9ydW5fdGFzaygmcXAtPnJlcS50YXNrLCAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX3Jlc3AuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX3Jlc3AuYwppbmRleCBlYmIwM2I0Li4zZTBmMGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV9yZXNwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGVfcmVzcC5jCkBAIC05NzIsMTEgKzk3MiwxMyBAQAogCWZyZWVfcmRfYXRvbWljX3Jlc291cmNlKHFwLCByZXMpOwogCXJ4ZV9hZHZhbmNlX3Jlc3BfcmVzb3VyY2UocXApOwogCisJbWVtY3B5KFNLQl9UT19QS1Qoc2tiKSwgJmFja19wa3QsIHNpemVvZihza2ItPmNiKSk7CisKIAlyZXMtPnR5cGUgPSBSWEVfQVRPTUlDX01BU0s7CiAJcmVzLT5hdG9taWMuc2tiID0gc2tiOwotCXJlcy0+Zmlyc3RfcHNuID0gcXAtPnJlc3AucHNuOwotCXJlcy0+bGFzdF9wc24gPSBxcC0+cmVzcC5wc247Ci0JcmVzLT5jdXJfcHNuID0gcXAtPnJlc3AucHNuOworCXJlcy0+Zmlyc3RfcHNuID0gYWNrX3BrdC5wc247CisJcmVzLT5sYXN0X3BzbiAgPSBhY2tfcGt0LnBzbjsKKwlyZXMtPmN1cl9wc24gICA9IGFja19wa3QucHNuOwogCiAJcmMgPSByeGVfeG1pdF9wYWNrZXQocnhlLCBxcCwgJmFja19wa3QsIHNrYl9jb3B5KTsKIAlpZiAocmMpIHsKQEAgLTExMTYsOCArMTExOCw3IEBACiAJCQkJcmMgPSBSRVNQU1RfQ0xFQU5VUDsKIAkJCQlnb3RvIG91dDsKIAkJCX0KLQkJCWJ0aF9zZXRfcHNuKFNLQl9UT19QS1Qoc2tiX2NvcHkpLAotCQkJCSAgICBxcC0+cmVzcC5wc24gLSAxKTsKKwogCQkJLyogUmVzZW5kIHRoZSByZXN1bHQuICovCiAJCQlyYyA9IHJ4ZV94bWl0X3BhY2tldCh0b19yZGV2KHFwLT5pYnFwLmRldmljZSksIHFwLAogCQkJCQkgICAgIHBrdCwgc2tiX2NvcHkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYi5oIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYi5oCmluZGV4IDRmN2Q5YjQuLjlkYmZjYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWIuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liLmgKQEAgLTQ3OCw2ICs0NzgsNyBAQAogCQlzdHJ1Y3QgaXBvaWJfYWggKmFkZHJlc3MsIHUzMiBxcG4pOwogdm9pZCBpcG9pYl9yZWFwX2FoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKK3N0cnVjdCBpcG9pYl9wYXRoICpfX3BhdGhfZmluZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpnaWQpOwogdm9pZCBpcG9pYl9tYXJrX3BhdGhzX2ludmFsaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiB2b2lkIGlwb2liX2ZsdXNoX3BhdGhzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogaW50IGlwb2liX2NoZWNrX3NtX3NlbmRvbmx5X2Z1bGxtZW1iZXJfc3VwcG9ydChzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKnByaXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9jbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9jbS5jCmluZGV4IDk1MWQ5YWIuLjRhZDI5N2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfY20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2NtLmMKQEAgLTEzMTgsNiArMTMxOCw4IEBACiAJfQogfQogCisjZGVmaW5lIFFQTl9BTkRfT1BUSU9OU19PRkZTRVQJNAorCiBzdGF0aWMgdm9pZCBpcG9pYl9jbV90eF9zdGFydChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGlwb2liX2Rldl9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpcG9pYl9kZXZfcHJpdiwKQEAgLTEzMjYsNiArMTMyOCw3IEBACiAJc3RydWN0IGlwb2liX25laWdoICpuZWlnaDsKIAlzdHJ1Y3QgaXBvaWJfY21fdHggKnA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaXBvaWJfcGF0aCAqcGF0aDsKIAlpbnQgcmV0OwogCiAJc3RydWN0IGliX3NhX3BhdGhfcmVjIHBhdGhyZWM7CkBAIC0xMzM4LDcgKzEzNDEsMTkgQEAKIAkJcCA9IGxpc3RfZW50cnkocHJpdi0+Y20uc3RhcnRfbGlzdC5uZXh0LCB0eXBlb2YoKnApLCBsaXN0KTsKIAkJbGlzdF9kZWxfaW5pdCgmcC0+bGlzdCk7CiAJCW5laWdoID0gcC0+bmVpZ2g7CisKIAkJcXBuID0gSVBPSUJfUVBOKG5laWdoLT5kYWRkcik7CisJCS8qCisJCSAqIEFzIGxvbmcgYXMgdGhlIHNlYXJjaCBpcyB3aXRoIHRoZXNlIDIgbG9ja3MsCisJCSAqIHBhdGggZXhpc3RlbmNlIGluZGljYXRlcyBpdHMgdmFsaWRpdHkuCisJCSAqLworCQlwYXRoID0gX19wYXRoX2ZpbmQoZGV2LCBuZWlnaC0+ZGFkZHIgKyBRUE5fQU5EX09QVElPTlNfT0ZGU0VUKTsKKwkJaWYgKCFwYXRoKSB7CisJCQlwcl9pbmZvKCIlcyBpZ25vcmUgbm90IHZhbGlkIHBhdGggJXBJNlxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQluZWlnaC0+ZGFkZHIgKyBRUE5fQU5EX09QVElPTlNfT0ZGU0VUKTsKKwkJCWdvdG8gZnJlZV9uZWlnaDsKKwkJfQogCQltZW1jcHkoJnBhdGhyZWMsICZwLT5wYXRoLT5wYXRocmVjLCBzaXplb2YgcGF0aHJlYyk7CiAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwpAQCAtMTM1MCw2ICsxMzY1LDcgQEAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAogCQlpZiAocmV0KSB7CitmcmVlX25laWdoOgogCQkJbmVpZ2ggPSBwLT5uZWlnaDsKIAkJCWlmIChuZWlnaCkgewogCQkJCW5laWdoLT5jbSA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2liLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2liLmMKaW5kZXggZGM2ZDI0MS4uYmUxMWQ1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9pYi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfaWIuYwpAQCAtMTE2MSw4ICsxMTYxLDE3IEBACiAJfQogCiAJaWYgKGxldmVsID09IElQT0lCX0ZMVVNIX0xJR0hUKSB7CisJCWludCBvcGVyX3VwOwogCQlpcG9pYl9tYXJrX3BhdGhzX2ludmFsaWQoZGV2KTsKKwkJLyogU2V0IElQb0lCIG9wZXJhdGlvbiBhcyBkb3duIHRvIHByZXZlbnQgcmFjZXMgYmV0d2VlbjoKKwkJICogdGhlIGZsdXNoIGZsb3cgd2hpY2ggbGVhdmVzIE1DRyBhbmQgb24gdGhlIGZseSBqb2lucworCQkgKiB3aGljaCBjYW4gaGFwcGVuIGR1cmluZyB0aGF0IHRpbWUuIG1jYXN0IHJlc3RhcnQgdGFzaworCQkgKiBzaG91bGQgZGVhbCB3aXRoIGpvaW4gcmVxdWVzdHMgd2UgbWlzc2VkLgorCQkgKi8KKwkJb3Blcl91cCA9IHRlc3RfYW5kX2NsZWFyX2JpdChJUE9JQl9GTEFHX09QRVJfVVAsICZwcml2LT5mbGFncyk7CiAJCWlwb2liX21jYXN0X2Rldl9mbHVzaChkZXYpOworCQlpZiAob3Blcl91cCkKKwkJCXNldF9iaXQoSVBPSUJfRkxBR19PUEVSX1VQLCAmcHJpdi0+ZmxhZ3MpOwogCQlpcG9pYl9mbHVzaF9haChkZXYpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYwppbmRleCA3NGJjYWEwLi5jYzFjMWIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYwpAQCAtNDg1LDcgKzQ4NSw3IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXBvaWJfcGF0aCAqX19wYXRoX2ZpbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqZ2lkKQorc3RydWN0IGlwb2liX3BhdGggKl9fcGF0aF9maW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmdpZCkKIHsKIAlzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCByYl9ub2RlICpuID0gcHJpdi0+cGF0aF90cmVlLnJiX25vZGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXJ0L2liX2lzZXJ0LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXJ0L2liX2lzZXJ0LmMKaW5kZXggYmE2YmUwNi4uY2FlOWJiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VydC9pYl9pc2VydC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlcnQvaWJfaXNlcnQuYwpAQCAtNDAzLDYgKzQwMyw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJmlzZXJ0X2Nvbm4tPm5vZGUpOwogCWluaXRfY29tcGxldGlvbigmaXNlcnRfY29ubi0+bG9naW5fY29tcCk7CiAJaW5pdF9jb21wbGV0aW9uKCZpc2VydF9jb25uLT5sb2dpbl9yZXFfY29tcCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaXNlcnRfY29ubi0+cmVtX3dhaXQpOwogCWtyZWZfaW5pdCgmaXNlcnRfY29ubi0+a3JlZik7CiAJbXV0ZXhfaW5pdCgmaXNlcnRfY29ubi0+bXV0ZXgpOwogCUlOSVRfV09SSygmaXNlcnRfY29ubi0+cmVsZWFzZV93b3JrLCBpc2VydF9yZWxlYXNlX3dvcmspOwpAQCAtNDQ4LDcgKzQ0OSw3IEBACiAKIAlpc2VydF9jb25uLT5sb2dpbl9yc3BfYnVmID0ga3phbGxvYyhJU0VSX1JYX1BBWUxPQURfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpc2VydF9jb25uLT5sb2dpbl9yc3BfYnVmKSB7Ci0JCWlzZXJ0X2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIGlzZXJ0X2Nvbm4tPmxvZ2luX3JzcGJ1ZlxuIik7CisJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X3VubWFwX2xvZ2luX3JlcV9idWY7CiAJfQogCkBAIC01NzgsNyArNTc5LDggQEAKIAlCVUdfT04oIWRldmljZSk7CiAKIAlpc2VydF9mcmVlX3J4X2Rlc2NyaXB0b3JzKGlzZXJ0X2Nvbm4pOwotCWlmIChpc2VydF9jb25uLT5jbV9pZCkKKwlpZiAoaXNlcnRfY29ubi0+Y21faWQgJiYKKwkgICAgIWlzZXJ0X2Nvbm4tPmRldl9yZW1vdmVkKQogCQlyZG1hX2Rlc3Ryb3lfaWQoaXNlcnRfY29ubi0+Y21faWQpOwogCiAJaWYgKGlzZXJ0X2Nvbm4tPnFwKSB7CkBAIC01OTMsNyArNTk1LDEwIEBACiAKIAlpc2VydF9kZXZpY2VfcHV0KGRldmljZSk7CiAKLQlrZnJlZShpc2VydF9jb25uKTsKKwlpZiAoaXNlcnRfY29ubi0+ZGV2X3JlbW92ZWQpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaXNlcnRfY29ubi0+cmVtX3dhaXQpOworCWVsc2UKKwkJa2ZyZWUoaXNlcnRfY29ubik7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC03NTMsNiArNzU4LDcgQEAKIGlzZXJ0X2NtYV9oYW5kbGVyKHN0cnVjdCByZG1hX2NtX2lkICpjbWFfaWQsIHN0cnVjdCByZG1hX2NtX2V2ZW50ICpldmVudCkKIHsKIAlzdHJ1Y3QgaXNlcnRfbnAgKmlzZXJ0X25wID0gY21hX2lkLT5jb250ZXh0OworCXN0cnVjdCBpc2VydF9jb25uICppc2VydF9jb25uOwogCWludCByZXQgPSAwOwogCiAJaXNlcnRfaW5mbygiJXMgKCVkKTogc3RhdHVzICVkIGlkICVwIG5wICVwXG4iLApAQCAtNzczLDEwICs3NzksMjEgQEAKIAkJYnJlYWs7CiAJY2FzZSBSRE1BX0NNX0VWRU5UX0FERFJfQ0hBTkdFOiAgICAvKiBGQUxMVEhSVSAqLwogCWNhc2UgUkRNQV9DTV9FVkVOVF9ESVNDT05ORUNURUQ6ICAgLyogRkFMTFRIUlUgKi8KLQljYXNlIFJETUFfQ01fRVZFTlRfREVWSUNFX1JFTU9WQUw6IC8qIEZBTExUSFJVICovCiAJY2FzZSBSRE1BX0NNX0VWRU5UX1RJTUVXQUlUX0VYSVQ6ICAvKiBGQUxMVEhSVSAqLwogCQlyZXQgPSBpc2VydF9kaXNjb25uZWN0ZWRfaGFuZGxlcihjbWFfaWQsIGV2ZW50LT5ldmVudCk7CiAJCWJyZWFrOworCWNhc2UgUkRNQV9DTV9FVkVOVF9ERVZJQ0VfUkVNT1ZBTDoKKwkJaXNlcnRfY29ubiA9IGNtYV9pZC0+cXAtPnFwX2NvbnRleHQ7CisJCWlzZXJ0X2Nvbm4tPmRldl9yZW1vdmVkID0gdHJ1ZTsKKwkJaXNlcnRfZGlzY29ubmVjdGVkX2hhbmRsZXIoY21hX2lkLCBldmVudC0+ZXZlbnQpOworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoaXNlcnRfY29ubi0+cmVtX3dhaXQsCisJCQkJCSBpc2VydF9jb25uLT5zdGF0ZSA9PSBJU0VSX0NPTk5fRE9XTik7CisJCWtmcmVlKGlzZXJ0X2Nvbm4pOworCQkvKgorCQkgKiByZXR1cm4gbm9uLXplcm8gZnJvbSB0aGUgY2FsbGJhY2sgdG8gZGVzdHJveQorCQkgKiB0aGUgcmRtYSBjbSBpZAorCQkgKi8KKwkJcmV0dXJuIDE7CiAJY2FzZSBSRE1BX0NNX0VWRU5UX1JFSkVDVEVEOiAgICAgICAvKiBGQUxMVEhSVSAqLwogCWNhc2UgUkRNQV9DTV9FVkVOVF9VTlJFQUNIQUJMRTogICAgLyogRkFMTFRIUlUgKi8KIAljYXNlIFJETUFfQ01fRVZFTlRfQ09OTkVDVF9FUlJPUjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlcnQvaWJfaXNlcnQuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlcnQvaWJfaXNlcnQuaAppbmRleCBmYzc5MWVmLi5jMDJhZGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXJ0L2liX2lzZXJ0LmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VydC9pYl9pc2VydC5oCkBAIC0xNTgsNiArMTU4LDggQEAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJcmVsZWFzZV93b3JrOwogCWJvb2wgICAgICAgICAgICAgICAgICAgIGxvZ291dF9wb3N0ZWQ7CiAJYm9vbCAgICAgICAgICAgICAgICAgICAgc25kX3dfaW52OworCXdhaXRfcXVldWVfaGVhZF90CXJlbV93YWl0OworCWJvb2wJCQlkZXZfcmVtb3ZlZDsKIH07CiAKICNkZWZpbmUgSVNFUlRfTUFYX0NRIDY0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycHQvaWJfc3JwdC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9zcnB0L2liX3NycHQuYwppbmRleCBkZmEyM2IwLi44ODNiYmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL3NycHQvaWJfc3JwdC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvc3JwdC9pYl9zcnB0LmMKQEAgLTUyMiw2ICs1MjIsMTEgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycl9xdWVyeV9wb3J0OwogCisJc25wcmludGYoc3BvcnQtPnBvcnRfZ3VpZCwgc2l6ZW9mKHNwb3J0LT5wb3J0X2d1aWQpLAorCQkiMHglMDE2bGx4JTAxNmxseCIsCisJCWJlNjRfdG9fY3B1KHNwb3J0LT5naWQuZ2xvYmFsLnN1Ym5ldF9wcmVmaXgpLAorCQliZTY0X3RvX2NwdShzcG9ydC0+Z2lkLmdsb2JhbC5pbnRlcmZhY2VfaWQpKTsKKwogCWlmICghc3BvcnQtPm1hZF9hZ2VudCkgewogCQltZW1zZXQoJnJlZ19yZXEsIDAsIHNpemVvZihyZWdfcmVxKSk7CiAJCXJlZ19yZXEubWdtdF9jbGFzcyA9IElCX01HTVRfQ0xBU1NfREVWSUNFX01HTVQ7CkBAIC0yNTQ4LDEwICsyNTUzLDYgQEAKIAkJCSAgICAgICBzZGV2LT5kZXZpY2UtPm5hbWUsIGkpOwogCQkJZ290byBlcnJfcmluZzsKIAkJfQotCQlzbnByaW50ZihzcG9ydC0+cG9ydF9ndWlkLCBzaXplb2Yoc3BvcnQtPnBvcnRfZ3VpZCksCi0JCQkiMHglMDE2bGx4JTAxNmxseCIsCi0JCQliZTY0X3RvX2NwdShzcG9ydC0+Z2lkLmdsb2JhbC5zdWJuZXRfcHJlZml4KSwKLQkJCWJlNjRfdG9fY3B1KHNwb3J0LT5naWQuZ2xvYmFsLmludGVyZmFjZV9pZCkpOwogCX0KIAogCXNwaW5fbG9jaygmc3JwdF9kZXZfbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveWRldi5jIGIvZHJpdmVycy9pbnB1dC9qb3lkZXYuYwppbmRleCA1ZDExZmVhLi5mMzEzNWFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveWRldi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95ZGV2LmMKQEAgLTk1MCw2ICs5NTAsMTIgQEAKIAkJLmZsYWdzID0gSU5QVVRfREVWSUNFX0lEX01BVENIX0VWQklUIHwKIAkJCQlJTlBVVF9ERVZJQ0VfSURfTUFUQ0hfQUJTQklULAogCQkuZXZiaXQgPSB7IEJJVF9NQVNLKEVWX0FCUykgfSwKKwkJLmFic2JpdCA9IHsgQklUX01BU0soQUJTX1opIH0sCisJfSwKKwl7CisJCS5mbGFncyA9IElOUFVUX0RFVklDRV9JRF9NQVRDSF9FVkJJVCB8CisJCQkJSU5QVVRfREVWSUNFX0lEX01BVENIX0FCU0JJVCwKKwkJLmV2Yml0ID0geyBCSVRfTUFTSyhFVl9BQlMpIH0sCiAJCS5hYnNiaXQgPSB7IEJJVF9NQVNLKEFCU19XSEVFTCkgfSwKIAl9LAogCXsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvdGVncmEta2JjLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3RlZ3JhLWtiYy5jCmluZGV4IDdkNjE0MzkuLjBjMDdlMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvdGVncmEta2JjLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC90ZWdyYS1rYmMuYwpAQCAtMzc2LDcgKzM3Niw3IEBACiAJLyogUmVzZXQgdGhlIEtCQyBjb250cm9sbGVyIHRvIGNsZWFyIGFsbCBwcmV2aW91cyBzdGF0dXMuKi8KIAlyZXNldF9jb250cm9sX2Fzc2VydChrYmMtPnJzdCk7CiAJdWRlbGF5KDEwMCk7Ci0JcmVzZXRfY29udHJvbF9hc3NlcnQoa2JjLT5yc3QpOworCXJlc2V0X2NvbnRyb2xfZGVhc3NlcnQoa2JjLT5yc3QpOwogCXVkZWxheSgxMDApOwogCiAJdGVncmFfa2JjX2NvbmZpZ19waW5zKGtiYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvdWlucHV0LmMgYi9kcml2ZXJzL2lucHV0L21pc2MvdWlucHV0LmMKaW5kZXggNjVlYmJkMS4uOTI1OTViOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL3VpbnB1dC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy91aW5wdXQuYwpAQCAtMTAxMywyMyArMTAxMywxMiBAQAogCS5taW5vcgkJPSBVSU5QVVRfTUlOT1IsCiAJLm5hbWUJCT0gVUlOUFVUX05BTUUsCiB9OworbW9kdWxlX21pc2NfZGV2aWNlKHVpbnB1dF9taXNjKTsKKwogTU9EVUxFX0FMSUFTX01JU0NERVYoVUlOUFVUX01JTk9SKTsKIE1PRFVMRV9BTElBUygiZGV2bmFtZToiIFVJTlBVVF9OQU1FKTsKIAotc3RhdGljIGludCBfX2luaXQgdWlucHV0X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmdWlucHV0X21pc2MpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdWlucHV0X2V4aXQodm9pZCkKLXsKLQltaXNjX2RlcmVnaXN0ZXIoJnVpbnB1dF9taXNjKTsKLX0KLQogTU9EVUxFX0FVVEhPUigiQXJpc3RldSBTZXJnaW8gUm96YW5za2kgRmlsaG8iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiVXNlciBsZXZlbCBkcml2ZXIgc3VwcG9ydCBmb3IgaW5wdXQgc3Vic3lzdGVtIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfVkVSU0lPTigiMC4zIik7Ci0KLW1vZHVsZV9pbml0KHVpbnB1dF9pbml0KTsKLW1vZHVsZV9leGl0KHVpbnB1dF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvcm1pNC9ybWlfZHJpdmVyLmMgYi9kcml2ZXJzL2lucHV0L3JtaTQvcm1pX2RyaXZlci5jCmluZGV4IGZhYTI5NWUuLmM4M2JjZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvcm1pNC9ybWlfZHJpdmVyLmMKKysrIGIvZHJpdmVycy9pbnB1dC9ybWk0L3JtaV9kcml2ZXIuYwpAQCAtNTUzLDcgKzU1Myw2IEBACiAJCWdvdG8gZnJlZV9zdHJ1Y3RfYnVmZjsKIAogCXJlZyA9IGZpbmRfZmlyc3RfYml0KHJkZXNjLT5wcmVzZW5zZV9tYXAsIFJNSV9SRUdfREVTQ19QUkVTRU5TRV9CSVRTKTsKLQltYXBfb2Zmc2V0ID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgcmRlc2MtPm51bV9yZWdpc3RlcnM7IGkrKykgewogCQlzdHJ1Y3Qgcm1pX3JlZ2lzdGVyX2Rlc2NfaXRlbSAqaXRlbSA9ICZyZGVzYy0+cmVnaXN0ZXJzW2ldOwogCQlpbnQgcmVnX3NpemUgPSBzdHJ1Y3RfYnVmW29mZnNldF07CkBAIC01NzYsNiArNTc1LDggQEAKIAkJaXRlbS0+cmVnID0gcmVnOwogCQlpdGVtLT5yZWdfc2l6ZSA9IHJlZ19zaXplOwogCisJCW1hcF9vZmZzZXQgPSAwOworCiAJCWRvIHsKIAkJCWZvciAoYiA9IDA7IGIgPCA3OyBiKyspIHsKIAkJCQlpZiAoc3RydWN0X2J1ZltvZmZzZXRdICYgKDB4MSA8PCBiKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIuYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIuYwppbmRleCBiNGQzNDA4Li40MDUyNTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi5jCkBAIC0xMzA1LDYgKzEzMDUsNyBAQAogCXNlcmlvLT53cml0ZQkJPSBpODA0Ml9hdXhfd3JpdGU7CiAJc2VyaW8tPnN0YXJ0CQk9IGk4MDQyX3N0YXJ0OwogCXNlcmlvLT5zdG9wCQk9IGk4MDQyX3N0b3A7CisJc2VyaW8tPnBzMl9jbWRfbXV0ZXgJPSAmaTgwNDJfbXV0ZXg7CiAJc2VyaW8tPnBvcnRfZGF0YQk9IHBvcnQ7CiAJc2VyaW8tPmRldi5wYXJlbnQJPSAmaTgwNDJfcGxhdGZvcm1fZGV2aWNlLT5kZXY7CiAJaWYgKGlkeCA8IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMKaW5kZXggYTYxYjIxNS4uMWNlM2VjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMKQEAgLTE0NzMsNyArMTQ3Myw2IEBACiAKIAlhZHM3ODR4X2h3bW9uX3VucmVnaXN0ZXIoc3BpLCB0cyk7CiAKLQlyZWd1bGF0b3JfZGlzYWJsZSh0cy0+cmVnKTsKIAlyZWd1bGF0b3JfcHV0KHRzLT5yZWcpOwogCiAJaWYgKCF0cy0+Z2V0X3BlbmRvd25fc3RhdGUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vc2lsZWFkLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3NpbGVhZC5jCmluZGV4IDczNzlmZTEuLmY1MDJjODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vc2lsZWFkLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9zaWxlYWQuYwpAQCAtMzkwLDkgKzM5MCwxMCBAQAogCQlkYXRhLT5tYXhfZmluZ2VycyA9IDU7IC8qIE1vc3QgZGV2aWNlcyBoYW5kbGUgdXAtdG8gNSBmaW5nZXJzICovCiAJfQogCi0JZXJyb3IgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF9zdHJpbmcoZGV2LCAidG91Y2hzY3JlZW4tZnctbmFtZSIsICZzdHIpOworCWVycm9yID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfc3RyaW5nKGRldiwgImZpcm13YXJlLW5hbWUiLCAmc3RyKTsKIAlpZiAoIWVycm9yKQotCQlzbnByaW50ZihkYXRhLT5md19uYW1lLCBzaXplb2YoZGF0YS0+ZndfbmFtZSksICIlcyIsIHN0cik7CisJCXNucHJpbnRmKGRhdGEtPmZ3X25hbWUsIHNpemVvZihkYXRhLT5md19uYW1lKSwKKwkJCSAic2lsZWFkLyVzIiwgc3RyKTsKIAllbHNlCiAJCWRldl9kYmcoZGV2LCAiRmlybXdhcmUgZmlsZSBuYW1lIHJlYWQgZXJyb3IuIFVzaW5nIGRlZmF1bHQuIik7CiB9CkBAIC00MTAsMTQgKzQxMSwxNCBAQAogCQlpZiAoIWFjcGlfaWQpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAotCQlzbnByaW50ZihkYXRhLT5md19uYW1lLCBzaXplb2YoZGF0YS0+ZndfbmFtZSksICIlcy5mdyIsCi0JCQlhY3BpX2lkLT5pZCk7CisJCXNucHJpbnRmKGRhdGEtPmZ3X25hbWUsIHNpemVvZihkYXRhLT5md19uYW1lKSwKKwkJCSAic2lsZWFkLyVzLmZ3IiwgYWNwaV9pZC0+aWQpOwogCiAJCWZvciAoaSA9IDA7IGkgPCBzdHJsZW4oZGF0YS0+ZndfbmFtZSk7IGkrKykKIAkJCWRhdGEtPmZ3X25hbWVbaV0gPSB0b2xvd2VyKGRhdGEtPmZ3X25hbWVbaV0pOwogCX0gZWxzZSB7Ci0JCXNucHJpbnRmKGRhdGEtPmZ3X25hbWUsIHNpemVvZihkYXRhLT5md19uYW1lKSwgIiVzLmZ3IiwKLQkJCWlkLT5uYW1lKTsKKwkJc25wcmludGYoZGF0YS0+ZndfbmFtZSwgc2l6ZW9mKGRhdGEtPmZ3X25hbWUpLAorCQkJICJzaWxlYWQvJXMuZnciLCBpZC0+bmFtZSk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC00MjYsNyArNDI3LDggQEAKIHN0YXRpYyBpbnQgc2lsZWFkX3RzX3NldF9kZWZhdWx0X2Z3X25hbWUoc3RydWN0IHNpbGVhZF90c19kYXRhICpkYXRhLAogCQkJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewotCXNucHJpbnRmKGRhdGEtPmZ3X25hbWUsIHNpemVvZihkYXRhLT5md19uYW1lKSwgIiVzLmZ3IiwgaWQtPm5hbWUpOworCXNucHJpbnRmKGRhdGEtPmZ3X25hbWUsIHNpemVvZihkYXRhLT5md19uYW1lKSwKKwkJICJzaWxlYWQvJXMuZnciLCBpZC0+bmFtZSk7CiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYKQEAgLTQ2NCw3ICs0NjYsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIFBvd2VyIEdQSU8gcGluICovCi0JZGF0YS0+Z3Bpb19wb3dlciA9IGdwaW9kX2dldF9vcHRpb25hbChkZXYsICJwb3dlciIsIEdQSU9EX09VVF9MT1cpOworCWRhdGEtPmdwaW9fcG93ZXIgPSBkZXZtX2dwaW9kX2dldF9vcHRpb25hbChkZXYsICJwb3dlciIsIEdQSU9EX09VVF9MT1cpOwogCWlmIChJU19FUlIoZGF0YS0+Z3Bpb19wb3dlcikpIHsKIAkJaWYgKFBUUl9FUlIoZGF0YS0+Z3Bpb19wb3dlcikgIT0gLUVQUk9CRV9ERUZFUikKIAkJCWRldl9lcnIoZGV2LCAiU2h1dGRvd24gR1BJTyByZXF1ZXN0IGZhaWxlZFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2FtZF9pb21tdS5jIGIvZHJpdmVycy9pb21tdS9hbWRfaW9tbXUuYwppbmRleCA5NmRlOTdhLi41OGZhOGNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lvbW11L2FtZF9pb21tdS5jCisrKyBiL2RyaXZlcnMvaW9tbXUvYW1kX2lvbW11LmMKQEAgLTEzNyw2ICsxMzcsNyBAQAogCWJvb2wgcHJpX3RscDsJCQkgIC8qIFBBU0lEIFRMQiByZXF1aXJlZCBmb3IKIAkJCQkJICAgICBQUFIgY29tcGxldGlvbnMgKi8KIAl1MzIgZXJyYXRhOwkJCSAgLyogQml0bWFwIGZvciBlcnJhdGEgdG8gYXBwbHkgKi8KKwlib29sIHVzZV92YXBpYzsJCQkgIC8qIEVuYWJsZSBkZXZpY2UgdG8gdXNlIHZhcGljIG1vZGUgKi8KIH07CiAKIC8qCkBAIC03MDcsMTQgKzcwOCw3NCBAQAogCX0KIH0KIAorI2lmZGVmIENPTkZJR19JUlFfUkVNQVAKK3N0YXRpYyBpbnQgKCppb21tdV9nYV9sb2dfbm90aWZpZXIpKHUzMik7CisKK2ludCBhbWRfaW9tbXVfcmVnaXN0ZXJfZ2FfbG9nX25vdGlmaWVyKGludCAoKm5vdGlmaWVyKSh1MzIpKQoreworCWlvbW11X2dhX2xvZ19ub3RpZmllciA9IG5vdGlmaWVyOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGFtZF9pb21tdV9yZWdpc3Rlcl9nYV9sb2dfbm90aWZpZXIpOworCitzdGF0aWMgdm9pZCBpb21tdV9wb2xsX2dhX2xvZyhzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKK3sKKwl1MzIgaGVhZCwgdGFpbCwgY250ID0gMDsKKworCWlmIChpb21tdS0+Z2FfbG9nID09IE5VTEwpCisJCXJldHVybjsKKworCWhlYWQgPSByZWFkbChpb21tdS0+bW1pb19iYXNlICsgTU1JT19HQV9IRUFEX09GRlNFVCk7CisJdGFpbCA9IHJlYWRsKGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0dBX1RBSUxfT0ZGU0VUKTsKKworCXdoaWxlIChoZWFkICE9IHRhaWwpIHsKKwkJdm9sYXRpbGUgdTY0ICpyYXc7CisJCXU2NCBsb2dfZW50cnk7CisKKwkJcmF3ID0gKHU2NCAqKShpb21tdS0+Z2FfbG9nICsgaGVhZCk7CisJCWNudCsrOworCisJCS8qIEF2b2lkIG1lbWNweSBmdW5jdGlvbi1jYWxsIG92ZXJoZWFkICovCisJCWxvZ19lbnRyeSA9ICpyYXc7CisKKwkJLyogVXBkYXRlIGhlYWQgcG9pbnRlciBvZiBoYXJkd2FyZSByaW5nLWJ1ZmZlciAqLworCQloZWFkID0gKGhlYWQgKyBHQV9FTlRSWV9TSVpFKSAlIEdBX0xPR19TSVpFOworCQl3cml0ZWwoaGVhZCwgaW9tbXUtPm1taW9fYmFzZSArIE1NSU9fR0FfSEVBRF9PRkZTRVQpOworCisJCS8qIEhhbmRsZSBHQSBlbnRyeSAqLworCQlzd2l0Y2ggKEdBX1JFUV9UWVBFKGxvZ19lbnRyeSkpIHsKKwkJY2FzZSBHQV9HVUVTVF9OUjoKKwkJCWlmICghaW9tbXVfZ2FfbG9nX25vdGlmaWVyKQorCQkJCWJyZWFrOworCisJCQlwcl9kZWJ1ZygiQU1ELVZpOiAlczogZGV2aWQ9JSN4LCBnYV90YWc9JSN4XG4iLAorCQkJCSBfX2Z1bmNfXywgR0FfREVWSUQobG9nX2VudHJ5KSwKKwkJCQkgR0FfVEFHKGxvZ19lbnRyeSkpOworCisJCQlpZiAoaW9tbXVfZ2FfbG9nX25vdGlmaWVyKEdBX1RBRyhsb2dfZW50cnkpKSAhPSAwKQorCQkJCXByX2VycigiQU1ELVZpOiBHQSBsb2cgbm90aWZpZXIgZmFpbGVkLlxuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorfQorI2VuZGlmIC8qIENPTkZJR19JUlFfUkVNQVAgKi8KKworI2RlZmluZSBBTURfSU9NTVVfSU5UX01BU0sJXAorCShNTUlPX1NUQVRVU19FVlRfSU5UX01BU0sgfCBcCisJIE1NSU9fU1RBVFVTX1BQUl9JTlRfTUFTSyB8IFwKKwkgTU1JT19TVEFUVVNfR0FMT0dfSU5UX01BU0spCisKIGlycXJldHVybl90IGFtZF9pb21tdV9pbnRfdGhyZWFkKGludCBpcnEsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGFtZF9pb21tdSAqaW9tbXUgPSAoc3RydWN0IGFtZF9pb21tdSAqKSBkYXRhOwogCXUzMiBzdGF0dXMgPSByZWFkbChpb21tdS0+bW1pb19iYXNlICsgTU1JT19TVEFUVVNfT0ZGU0VUKTsKIAotCXdoaWxlIChzdGF0dXMgJiAoTU1JT19TVEFUVVNfRVZUX0lOVF9NQVNLIHwgTU1JT19TVEFUVVNfUFBSX0lOVF9NQVNLKSkgewotCQkvKiBFbmFibGUgRVZUIGFuZCBQUFIgaW50ZXJydXB0cyBhZ2FpbiAqLwotCQl3cml0ZWwoKE1NSU9fU1RBVFVTX0VWVF9JTlRfTUFTSyB8IE1NSU9fU1RBVFVTX1BQUl9JTlRfTUFTSyksCisJd2hpbGUgKHN0YXR1cyAmIEFNRF9JT01NVV9JTlRfTUFTSykgeworCQkvKiBFbmFibGUgRVZUIGFuZCBQUFIgYW5kIEdBIGludGVycnVwdHMgYWdhaW4gKi8KKwkJd3JpdGVsKEFNRF9JT01NVV9JTlRfTUFTSywKIAkJCWlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX1NUQVRVU19PRkZTRVQpOwogCiAJCWlmIChzdGF0dXMgJiBNTUlPX1NUQVRVU19FVlRfSU5UX01BU0spIHsKQEAgLTcyNyw2ICs3ODgsMTMgQEAKIAkJCWlvbW11X3BvbGxfcHByX2xvZyhpb21tdSk7CiAJCX0KIAorI2lmZGVmIENPTkZJR19JUlFfUkVNQVAKKwkJaWYgKHN0YXR1cyAmIE1NSU9fU1RBVFVTX0dBTE9HX0lOVF9NQVNLKSB7CisJCQlwcl9kZXZlbCgiQU1ELVZpOiBQcm9jZXNzaW5nIElPTU1VIEdBIExvZ1xuIik7CisJCQlpb21tdV9wb2xsX2dhX2xvZyhpb21tdSk7CisJCX0KKyNlbmRpZgorCiAJCS8qCiAJCSAqIEhhcmR3YXJlIGJ1ZzogRVJCVDEzMTIKIAkJICogV2hlbiByZS1lbmFibGluZyBpbnRlcnJ1cHQgKGJ5IHdyaXRpbmcgMQpAQCAtOTQwLDE1ICsxMDA4LDEzIEBACiAgKiBXcml0ZXMgdGhlIGNvbW1hbmQgdG8gdGhlIElPTU1VcyBjb21tYW5kIGJ1ZmZlciBhbmQgaW5mb3JtcyB0aGUKICAqIGhhcmR3YXJlIGFib3V0IHRoZSBuZXcgY29tbWFuZC4KICAqLwotc3RhdGljIGludCBpb21tdV9xdWV1ZV9jb21tYW5kX3N5bmMoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUsCi0JCQkJICAgIHN0cnVjdCBpb21tdV9jbWQgKmNtZCwKLQkJCQkgICAgYm9vbCBzeW5jKQorc3RhdGljIGludCBfX2lvbW11X3F1ZXVlX2NvbW1hbmRfc3luYyhzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSwKKwkJCQkgICAgICBzdHJ1Y3QgaW9tbXVfY21kICpjbWQsCisJCQkJICAgICAgYm9vbCBzeW5jKQogewogCXUzMiBsZWZ0LCB0YWlsLCBoZWFkLCBuZXh0X3RhaWw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogYWdhaW46Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CiAKIAloZWFkICAgICAgPSByZWFkbChpb21tdS0+bW1pb19iYXNlICsgTU1JT19DTURfSEVBRF9PRkZTRVQpOwogCXRhaWwgICAgICA9IHJlYWRsKGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0NNRF9UQUlMX09GRlNFVCk7CkBAIC05NTcsMTUgKzEwMjMsMTQgQEAKIAogCWlmIChsZWZ0IDw9IDIpIHsKIAkJc3RydWN0IGlvbW11X2NtZCBzeW5jX2NtZDsKLQkJdm9sYXRpbGUgdTY0IHNlbSA9IDA7CiAJCWludCByZXQ7CiAKLQkJYnVpbGRfY29tcGxldGlvbl93YWl0KCZzeW5jX2NtZCwgKHU2NCkmc2VtKTsKKwkJaW9tbXUtPmNtZF9zZW0gPSAwOworCisJCWJ1aWxkX2NvbXBsZXRpb25fd2FpdCgmc3luY19jbWQsICh1NjQpJmlvbW11LT5jbWRfc2VtKTsKIAkJY29weV9jbWRfdG9fYnVmZmVyKGlvbW11LCAmc3luY19jbWQsIHRhaWwpOwogCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKChyZXQgPSB3YWl0X29uX3NlbSgmc2VtKSkgIT0gMCkKKwkJaWYgKChyZXQgPSB3YWl0X29uX3NlbSgmaW9tbXUtPmNtZF9zZW0pKSAhPSAwKQogCQkJcmV0dXJuIHJldDsKIAogCQlnb3RvIGFnYWluOwpAQCAtOTc2LDkgKzEwNDEsMjEgQEAKIAkvKiBXZSBuZWVkIHRvIHN5bmMgbm93IHRvIG1ha2Ugc3VyZSBhbGwgY29tbWFuZHMgYXJlIHByb2Nlc3NlZCAqLwogCWlvbW11LT5uZWVkX3N5bmMgPSBzeW5jOwogCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW9tbXVfcXVldWVfY29tbWFuZF9zeW5jKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11LAorCQkJCSAgICBzdHJ1Y3QgaW9tbXVfY21kICpjbWQsCisJCQkJICAgIGJvb2wgc3luYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKKwlyZXQgPSBfX2lvbW11X3F1ZXVlX2NvbW1hbmRfc3luYyhpb21tdSwgY21kLCBzeW5jKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBpb21tdV9xdWV1ZV9jb21tYW5kKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11LCBzdHJ1Y3QgaW9tbXVfY21kICpjbWQpCkBAIC05OTMsMTkgKzEwNzAsMjkgQEAKIHN0YXRpYyBpbnQgaW9tbXVfY29tcGxldGlvbl93YWl0KHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQogewogCXN0cnVjdCBpb21tdV9jbWQgY21kOwotCXZvbGF0aWxlIHU2NCBzZW0gPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKIAogCWlmICghaW9tbXUtPm5lZWRfc3luYykKIAkJcmV0dXJuIDA7CiAKLQlidWlsZF9jb21wbGV0aW9uX3dhaXQoJmNtZCwgKHU2NCkmc2VtKTsKIAotCXJldCA9IGlvbW11X3F1ZXVlX2NvbW1hbmRfc3luYyhpb21tdSwgJmNtZCwgZmFsc2UpOworCWJ1aWxkX2NvbXBsZXRpb25fd2FpdCgmY21kLCAodTY0KSZpb21tdS0+Y21kX3NlbSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKKworCWlvbW11LT5jbWRfc2VtID0gMDsKKworCXJldCA9IF9faW9tbXVfcXVldWVfY29tbWFuZF9zeW5jKGlvbW11LCAmY21kLCBmYWxzZSk7CiAJaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBvdXRfdW5sb2NrOwogCi0JcmV0dXJuIHdhaXRfb25fc2VtKCZzZW0pOworCXJldCA9IHdhaXRfb25fc2VtKCZpb21tdS0+Y21kX3NlbSk7CisKK291dF91bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgaW9tbXVfZmx1c2hfZHRlKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11LCB1MTYgZGV2aWQpCkBAIC0yOTQ4LDYgKzMwMzUsMTIgQEAKIAlpZiAoIWlvbW11KQogCQlyZXR1cm47CiAKKyNpZmRlZiBDT05GSUdfSVJRX1JFTUFQCisJaWYgKEFNRF9JT01NVV9HVUVTVF9JUl9WQVBJQyhhbWRfaW9tbXVfZ3Vlc3RfaXIpICYmCisJICAgIChkb20tPnR5cGUgPT0gSU9NTVVfRE9NQUlOX1VOTUFOQUdFRCkpCisJCWRldl9kYXRhLT51c2VfdmFwaWMgPSAwOworI2VuZGlmCisKIAlpb21tdV9jb21wbGV0aW9uX3dhaXQoaW9tbXUpOwogfQogCkBAIC0yOTczLDYgKzMwNjYsMTUgQEAKIAogCXJldCA9IGF0dGFjaF9kZXZpY2UoZGV2LCBkb21haW4pOwogCisjaWZkZWYgQ09ORklHX0lSUV9SRU1BUAorCWlmIChBTURfSU9NTVVfR1VFU1RfSVJfVkFQSUMoYW1kX2lvbW11X2d1ZXN0X2lyKSkgeworCQlpZiAoZG9tLT50eXBlID09IElPTU1VX0RPTUFJTl9VTk1BTkFHRUQpCisJCQlkZXZfZGF0YS0+dXNlX3ZhcGljID0gMTsKKwkJZWxzZQorCQkJZGV2X2RhdGEtPnVzZV92YXBpYyA9IDA7CisJfQorI2VuZGlmCisKIAlpb21tdV9jb21wbGV0aW9uX3dhaXQoaW9tbXUpOwogCiAJcmV0dXJuIHJldDsKQEAgLTM1MTEsMzQgKzM2MTMsNiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdW5pb24gaXJ0ZSB7Ci0JdTMyIHZhbDsKLQlzdHJ1Y3QgewotCQl1MzIgdmFsaWQJOiAxLAotCQkgICAgbm9fZmF1bHQJOiAxLAotCQkgICAgaW50X3R5cGUJOiAzLAotCQkgICAgcnFfZW9pCTogMSwKLQkJICAgIGRtCQk6IDEsCi0JCSAgICByc3ZkXzEJOiAxLAotCQkgICAgZGVzdGluYXRpb24JOiA4LAotCQkgICAgdmVjdG9yCTogOCwKLQkJICAgIHJzdmRfMgk6IDg7Ci0JfSBmaWVsZHM7Ci19OwotCi1zdHJ1Y3QgaXJxXzJfaXJ0ZSB7Ci0JdTE2IGRldmlkOyAvKiBEZXZpY2UgSUQgZm9yIElSVEUgdGFibGUgKi8KLQl1MTYgaW5kZXg7IC8qIEluZGV4IGludG8gSVJURSB0YWJsZSovCi19OwotCi1zdHJ1Y3QgYW1kX2lyX2RhdGEgewotCXN0cnVjdCBpcnFfMl9pcnRlCQkJaXJxXzJfaXJ0ZTsKLQl1bmlvbiBpcnRlCQkJCWlydGVfZW50cnk7Ci0JdW5pb24gewotCQlzdHJ1Y3QgbXNpX21zZwkJCW1zaV9lbnRyeTsKLQl9OwotfTsKLQogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBhbWRfaXJfY2hpcDsKIAogI2RlZmluZSBEVEVfSVJRX1BIWVNfQUREUl9NQVNLCSgoKDFVTEwgPDwgNDUpLTEpIDw8IDYpCkBAIC0zNTYwLDggKzM2MzQsNiBAQAogCWFtZF9pb21tdV9kZXZfdGFibGVbZGV2aWRdLmRhdGFbMl0gPSBkdGU7CiB9CiAKLSNkZWZpbmUgSVJURV9BTExPQ0FURUQgKH4xVSkKLQogc3RhdGljIHN0cnVjdCBpcnFfcmVtYXBfdGFibGUgKmdldF9pcnFfdGFibGUodTE2IGRldmlkLCBib29sIGlvYXBpYykKIHsKIAlzdHJ1Y3QgaXJxX3JlbWFwX3RhYmxlICp0YWJsZSA9IE5VTEw7CkBAIC0zNjA3LDEzICszNjc5LDE4IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCW1lbXNldCh0YWJsZS0+dGFibGUsIDAsIE1BWF9JUlFTX1BFUl9UQUJMRSAqIHNpemVvZih1MzIpKTsKKwlpZiAoIUFNRF9JT01NVV9HVUVTVF9JUl9HQShhbWRfaW9tbXVfZ3Vlc3RfaXIpKQorCQltZW1zZXQodGFibGUtPnRhYmxlLCAwLAorCQkgICAgICAgTUFYX0lSUVNfUEVSX1RBQkxFICogc2l6ZW9mKHUzMikpOworCWVsc2UKKwkJbWVtc2V0KHRhYmxlLT50YWJsZSwgMCwKKwkJICAgICAgIChNQVhfSVJRU19QRVJfVEFCTEUgKiAoc2l6ZW9mKHU2NCkgKiAyKSkpOwogCiAJaWYgKGlvYXBpYykgewogCQlpbnQgaTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgMzI7ICsraSkKLQkJCXRhYmxlLT50YWJsZVtpXSA9IElSVEVfQUxMT0NBVEVEOworCQkJaW9tbXUtPmlydGVfb3BzLT5zZXRfYWxsb2NhdGVkKHRhYmxlLCBpKTsKIAl9CiAKIAlpcnFfbG9va3VwX3RhYmxlW2RldmlkXSA9IHRhYmxlOwpAQCAtMzYzOSw2ICszNzE2LDEwIEBACiAJc3RydWN0IGlycV9yZW1hcF90YWJsZSAqdGFibGU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgaW5kZXgsIGM7CisJc3RydWN0IGFtZF9pb21tdSAqaW9tbXUgPSBhbWRfaW9tbXVfcmxvb2t1cF90YWJsZVtkZXZpZF07CisKKwlpZiAoIWlvbW11KQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCXRhYmxlID0gZ2V0X2lycV90YWJsZShkZXZpZCwgZmFsc2UpOwogCWlmICghdGFibGUpCkBAIC0zNjUwLDE0ICszNzMxLDE0IEBACiAJZm9yIChjID0gMCwgaW5kZXggPSB0YWJsZS0+bWluX2luZGV4OwogCSAgICAgaW5kZXggPCBNQVhfSVJRU19QRVJfVEFCTEU7CiAJICAgICArK2luZGV4KSB7Ci0JCWlmICh0YWJsZS0+dGFibGVbaW5kZXhdID09IDApCisJCWlmICghaW9tbXUtPmlydGVfb3BzLT5pc19hbGxvY2F0ZWQodGFibGUsIGluZGV4KSkKIAkJCWMgKz0gMTsKIAkJZWxzZQogCQkJYyA9IDA7CiAKIAkJaWYgKGMgPT0gY291bnQpCXsKIAkJCWZvciAoOyBjICE9IDA7IC0tYykKLQkJCQl0YWJsZS0+dGFibGVbaW5kZXggLSBjICsgMV0gPSBJUlRFX0FMTE9DQVRFRDsKKwkJCQlpb21tdS0+aXJ0ZV9vcHMtPnNldF9hbGxvY2F0ZWQodGFibGUsIGluZGV4IC0gYyArIDEpOwogCiAJCQlpbmRleCAtPSBjb3VudCAtIDE7CiAJCQlnb3RvIG91dDsKQEAgLTM2NzIsNyArMzc1Myw0MiBAQAogCXJldHVybiBpbmRleDsKIH0KIAotc3RhdGljIGludCBtb2RpZnlfaXJ0ZSh1MTYgZGV2aWQsIGludCBpbmRleCwgdW5pb24gaXJ0ZSBpcnRlKQorc3RhdGljIGludCBtb2RpZnlfaXJ0ZV9nYSh1MTYgZGV2aWQsIGludCBpbmRleCwgc3RydWN0IGlydGVfZ2EgKmlydGUsCisJCQkgIHN0cnVjdCBhbWRfaXJfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXJxX3JlbWFwX3RhYmxlICp0YWJsZTsKKwlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpcnRlX2dhICplbnRyeTsKKworCWlvbW11ID0gYW1kX2lvbW11X3Jsb29rdXBfdGFibGVbZGV2aWRdOworCWlmIChpb21tdSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRhYmxlID0gZ2V0X2lycV90YWJsZShkZXZpZCwgZmFsc2UpOworCWlmICghdGFibGUpCisJCXJldHVybiAtRU5PTUVNOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRhYmxlLT5sb2NrLCBmbGFncyk7CisKKwllbnRyeSA9IChzdHJ1Y3QgaXJ0ZV9nYSAqKXRhYmxlLT50YWJsZTsKKwllbnRyeSA9ICZlbnRyeVtpbmRleF07CisJZW50cnktPmxvLmZpZWxkc19yZW1hcC52YWxpZCA9IDA7CisJZW50cnktPmhpLnZhbCA9IGlydGUtPmhpLnZhbDsKKwllbnRyeS0+bG8udmFsID0gaXJ0ZS0+bG8udmFsOworCWVudHJ5LT5sby5maWVsZHNfcmVtYXAudmFsaWQgPSAxOworCWlmIChkYXRhKQorCQlkYXRhLT5yZWYgPSBlbnRyeTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhYmxlLT5sb2NrLCBmbGFncyk7CisKKwlpb21tdV9mbHVzaF9pcnQoaW9tbXUsIGRldmlkKTsKKwlpb21tdV9jb21wbGV0aW9uX3dhaXQoaW9tbXUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW9kaWZ5X2lydGUodTE2IGRldmlkLCBpbnQgaW5kZXgsIHVuaW9uIGlydGUgKmlydGUpCiB7CiAJc3RydWN0IGlycV9yZW1hcF90YWJsZSAqdGFibGU7CiAJc3RydWN0IGFtZF9pb21tdSAqaW9tbXU7CkBAIC0zNjg3LDcgKzM4MDMsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ0YWJsZS0+bG9jaywgZmxhZ3MpOwotCXRhYmxlLT50YWJsZVtpbmRleF0gPSBpcnRlLnZhbDsKKwl0YWJsZS0+dGFibGVbaW5kZXhdID0gaXJ0ZS0+dmFsOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRhYmxlLT5sb2NrLCBmbGFncyk7CiAKIAlpb21tdV9mbHVzaF9pcnQoaW9tbXUsIGRldmlkKTsKQEAgLTM3MTEsMTMgKzM4MjcsMTQ2IEBACiAJCXJldHVybjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ0YWJsZS0+bG9jaywgZmxhZ3MpOwotCXRhYmxlLT50YWJsZVtpbmRleF0gPSAwOworCWlvbW11LT5pcnRlX29wcy0+Y2xlYXJfYWxsb2NhdGVkKHRhYmxlLCBpbmRleCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFibGUtPmxvY2ssIGZsYWdzKTsKIAogCWlvbW11X2ZsdXNoX2lydChpb21tdSwgZGV2aWQpOwogCWlvbW11X2NvbXBsZXRpb25fd2FpdChpb21tdSk7CiB9CiAKK3N0YXRpYyB2b2lkIGlydGVfcHJlcGFyZSh2b2lkICplbnRyeSwKKwkJCSB1MzIgZGVsaXZlcnlfbW9kZSwgdTMyIGRlc3RfbW9kZSwKKwkJCSB1OCB2ZWN0b3IsIHUzMiBkZXN0X2FwaWNpZCwgaW50IGRldmlkKQoreworCXVuaW9uIGlydGUgKmlydGUgPSAodW5pb24gaXJ0ZSAqKSBlbnRyeTsKKworCWlydGUtPnZhbCAgICAgICAgICAgICAgICA9IDA7CisJaXJ0ZS0+ZmllbGRzLnZlY3RvciAgICAgID0gdmVjdG9yOworCWlydGUtPmZpZWxkcy5pbnRfdHlwZSAgICA9IGRlbGl2ZXJ5X21vZGU7CisJaXJ0ZS0+ZmllbGRzLmRlc3RpbmF0aW9uID0gZGVzdF9hcGljaWQ7CisJaXJ0ZS0+ZmllbGRzLmRtICAgICAgICAgID0gZGVzdF9tb2RlOworCWlydGUtPmZpZWxkcy52YWxpZCAgICAgICA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGlydGVfZ2FfcHJlcGFyZSh2b2lkICplbnRyeSwKKwkJCSAgICB1MzIgZGVsaXZlcnlfbW9kZSwgdTMyIGRlc3RfbW9kZSwKKwkJCSAgICB1OCB2ZWN0b3IsIHUzMiBkZXN0X2FwaWNpZCwgaW50IGRldmlkKQoreworCXN0cnVjdCBpcnRlX2dhICppcnRlID0gKHN0cnVjdCBpcnRlX2dhICopIGVudHJ5OworCXN0cnVjdCBpb21tdV9kZXZfZGF0YSAqZGV2X2RhdGEgPSBzZWFyY2hfZGV2X2RhdGEoZGV2aWQpOworCisJaXJ0ZS0+bG8udmFsICAgICAgICAgICAgICAgICAgICAgID0gMDsKKwlpcnRlLT5oaS52YWwgICAgICAgICAgICAgICAgICAgICAgPSAwOworCWlydGUtPmxvLmZpZWxkc19yZW1hcC5ndWVzdF9tb2RlICA9IGRldl9kYXRhID8gZGV2X2RhdGEtPnVzZV92YXBpYyA6IDA7CisJaXJ0ZS0+bG8uZmllbGRzX3JlbWFwLmludF90eXBlICAgID0gZGVsaXZlcnlfbW9kZTsKKwlpcnRlLT5sby5maWVsZHNfcmVtYXAuZG0gICAgICAgICAgPSBkZXN0X21vZGU7CisJaXJ0ZS0+aGkuZmllbGRzLnZlY3RvciAgICAgICAgICAgID0gdmVjdG9yOworCWlydGUtPmxvLmZpZWxkc19yZW1hcC5kZXN0aW5hdGlvbiA9IGRlc3RfYXBpY2lkOworCWlydGUtPmxvLmZpZWxkc19yZW1hcC52YWxpZCAgICAgICA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGlydGVfYWN0aXZhdGUodm9pZCAqZW50cnksIHUxNiBkZXZpZCwgdTE2IGluZGV4KQoreworCXVuaW9uIGlydGUgKmlydGUgPSAodW5pb24gaXJ0ZSAqKSBlbnRyeTsKKworCWlydGUtPmZpZWxkcy52YWxpZCA9IDE7CisJbW9kaWZ5X2lydGUoZGV2aWQsIGluZGV4LCBpcnRlKTsKK30KKworc3RhdGljIHZvaWQgaXJ0ZV9nYV9hY3RpdmF0ZSh2b2lkICplbnRyeSwgdTE2IGRldmlkLCB1MTYgaW5kZXgpCit7CisJc3RydWN0IGlydGVfZ2EgKmlydGUgPSAoc3RydWN0IGlydGVfZ2EgKikgZW50cnk7CisKKwlpcnRlLT5sby5maWVsZHNfcmVtYXAudmFsaWQgPSAxOworCW1vZGlmeV9pcnRlX2dhKGRldmlkLCBpbmRleCwgaXJ0ZSwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGlydGVfZGVhY3RpdmF0ZSh2b2lkICplbnRyeSwgdTE2IGRldmlkLCB1MTYgaW5kZXgpCit7CisJdW5pb24gaXJ0ZSAqaXJ0ZSA9ICh1bmlvbiBpcnRlICopIGVudHJ5OworCisJaXJ0ZS0+ZmllbGRzLnZhbGlkID0gMDsKKwltb2RpZnlfaXJ0ZShkZXZpZCwgaW5kZXgsIGlydGUpOworfQorCitzdGF0aWMgdm9pZCBpcnRlX2dhX2RlYWN0aXZhdGUodm9pZCAqZW50cnksIHUxNiBkZXZpZCwgdTE2IGluZGV4KQoreworCXN0cnVjdCBpcnRlX2dhICppcnRlID0gKHN0cnVjdCBpcnRlX2dhICopIGVudHJ5OworCisJaXJ0ZS0+bG8uZmllbGRzX3JlbWFwLnZhbGlkID0gMDsKKwltb2RpZnlfaXJ0ZV9nYShkZXZpZCwgaW5kZXgsIGlydGUsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBpcnRlX3NldF9hZmZpbml0eSh2b2lkICplbnRyeSwgdTE2IGRldmlkLCB1MTYgaW5kZXgsCisJCQkgICAgICB1OCB2ZWN0b3IsIHUzMiBkZXN0X2FwaWNpZCkKK3sKKwl1bmlvbiBpcnRlICppcnRlID0gKHVuaW9uIGlydGUgKikgZW50cnk7CisKKwlpcnRlLT5maWVsZHMudmVjdG9yID0gdmVjdG9yOworCWlydGUtPmZpZWxkcy5kZXN0aW5hdGlvbiA9IGRlc3RfYXBpY2lkOworCW1vZGlmeV9pcnRlKGRldmlkLCBpbmRleCwgaXJ0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGlydGVfZ2Ffc2V0X2FmZmluaXR5KHZvaWQgKmVudHJ5LCB1MTYgZGV2aWQsIHUxNiBpbmRleCwKKwkJCQkgdTggdmVjdG9yLCB1MzIgZGVzdF9hcGljaWQpCit7CisJc3RydWN0IGlydGVfZ2EgKmlydGUgPSAoc3RydWN0IGlydGVfZ2EgKikgZW50cnk7CisJc3RydWN0IGlvbW11X2Rldl9kYXRhICpkZXZfZGF0YSA9IHNlYXJjaF9kZXZfZGF0YShkZXZpZCk7CisKKwlpZiAoIWRldl9kYXRhIHx8ICFkZXZfZGF0YS0+dXNlX3ZhcGljKSB7CisJCWlydGUtPmhpLmZpZWxkcy52ZWN0b3IgPSB2ZWN0b3I7CisJCWlydGUtPmxvLmZpZWxkc19yZW1hcC5kZXN0aW5hdGlvbiA9IGRlc3RfYXBpY2lkOworCQlpcnRlLT5sby5maWVsZHNfcmVtYXAuZ3Vlc3RfbW9kZSA9IDA7CisJCW1vZGlmeV9pcnRlX2dhKGRldmlkLCBpbmRleCwgaXJ0ZSwgTlVMTCk7CisJfQorfQorCisjZGVmaW5lIElSVEVfQUxMT0NBVEVEICh+MVUpCitzdGF0aWMgdm9pZCBpcnRlX3NldF9hbGxvY2F0ZWQoc3RydWN0IGlycV9yZW1hcF90YWJsZSAqdGFibGUsIGludCBpbmRleCkKK3sKKwl0YWJsZS0+dGFibGVbaW5kZXhdID0gSVJURV9BTExPQ0FURUQ7Cit9CisKK3N0YXRpYyB2b2lkIGlydGVfZ2Ffc2V0X2FsbG9jYXRlZChzdHJ1Y3QgaXJxX3JlbWFwX3RhYmxlICp0YWJsZSwgaW50IGluZGV4KQoreworCXN0cnVjdCBpcnRlX2dhICpwdHIgPSAoc3RydWN0IGlydGVfZ2EgKil0YWJsZS0+dGFibGU7CisJc3RydWN0IGlydGVfZ2EgKmlydGUgPSAmcHRyW2luZGV4XTsKKworCW1lbXNldCgmaXJ0ZS0+bG8udmFsLCAwLCBzaXplb2YodTY0KSk7CisJbWVtc2V0KCZpcnRlLT5oaS52YWwsIDAsIHNpemVvZih1NjQpKTsKKwlpcnRlLT5oaS5maWVsZHMudmVjdG9yID0gMHhmZjsKK30KKworc3RhdGljIGJvb2wgaXJ0ZV9pc19hbGxvY2F0ZWQoc3RydWN0IGlycV9yZW1hcF90YWJsZSAqdGFibGUsIGludCBpbmRleCkKK3sKKwl1bmlvbiBpcnRlICpwdHIgPSAodW5pb24gaXJ0ZSAqKXRhYmxlLT50YWJsZTsKKwl1bmlvbiBpcnRlICppcnRlID0gJnB0cltpbmRleF07CisKKwlyZXR1cm4gaXJ0ZS0+dmFsICE9IDA7Cit9CisKK3N0YXRpYyBib29sIGlydGVfZ2FfaXNfYWxsb2NhdGVkKHN0cnVjdCBpcnFfcmVtYXBfdGFibGUgKnRhYmxlLCBpbnQgaW5kZXgpCit7CisJc3RydWN0IGlydGVfZ2EgKnB0ciA9IChzdHJ1Y3QgaXJ0ZV9nYSAqKXRhYmxlLT50YWJsZTsKKwlzdHJ1Y3QgaXJ0ZV9nYSAqaXJ0ZSA9ICZwdHJbaW5kZXhdOworCisJcmV0dXJuIGlydGUtPmhpLmZpZWxkcy52ZWN0b3IgIT0gMDsKK30KKworc3RhdGljIHZvaWQgaXJ0ZV9jbGVhcl9hbGxvY2F0ZWQoc3RydWN0IGlycV9yZW1hcF90YWJsZSAqdGFibGUsIGludCBpbmRleCkKK3sKKwl0YWJsZS0+dGFibGVbaW5kZXhdID0gMDsKK30KKworc3RhdGljIHZvaWQgaXJ0ZV9nYV9jbGVhcl9hbGxvY2F0ZWQoc3RydWN0IGlycV9yZW1hcF90YWJsZSAqdGFibGUsIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgaXJ0ZV9nYSAqcHRyID0gKHN0cnVjdCBpcnRlX2dhICopdGFibGUtPnRhYmxlOworCXN0cnVjdCBpcnRlX2dhICppcnRlID0gJnB0cltpbmRleF07CisKKwltZW1zZXQoJmlydGUtPmxvLnZhbCwgMCwgc2l6ZW9mKHU2NCkpOworCW1lbXNldCgmaXJ0ZS0+aGkudmFsLCAwLCBzaXplb2YodTY0KSk7Cit9CisKIHN0YXRpYyBpbnQgZ2V0X2RldmlkKHN0cnVjdCBpcnFfYWxsb2NfaW5mbyAqaW5mbykKIHsKIAlpbnQgZGV2aWQgPSAtMTsKQEAgLTM4MDIsMTkgKzQwNTEsMTcgQEAKIHsKIAlzdHJ1Y3QgaXJxXzJfaXJ0ZSAqaXJ0ZV9pbmZvID0gJmRhdGEtPmlycV8yX2lydGU7CiAJc3RydWN0IG1zaV9tc2cgKm1zZyA9ICZkYXRhLT5tc2lfZW50cnk7Ci0JdW5pb24gaXJ0ZSAqaXJ0ZSA9ICZkYXRhLT5pcnRlX2VudHJ5OwogCXN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSA9IGFtZF9pb21tdV9ybG9va3VwX3RhYmxlW2RldmlkXTsKKworCWlmICghaW9tbXUpCisJCXJldHVybjsKIAogCWRhdGEtPmlycV8yX2lydGUuZGV2aWQgPSBkZXZpZDsKIAlkYXRhLT5pcnFfMl9pcnRlLmluZGV4ID0gaW5kZXggKyBzdWJfaGFuZGxlOwotCi0JLyogU2V0dXAgSVJURSBmb3IgSU9NTVUgKi8KLQlpcnRlLT52YWwgPSAwOwotCWlydGUtPmZpZWxkcy52ZWN0b3IgICAgICA9IGlycV9jZmctPnZlY3RvcjsKLQlpcnRlLT5maWVsZHMuaW50X3R5cGUgICAgPSBhcGljLT5pcnFfZGVsaXZlcnlfbW9kZTsKLQlpcnRlLT5maWVsZHMuZGVzdGluYXRpb24gPSBpcnFfY2ZnLT5kZXN0X2FwaWNpZDsKLQlpcnRlLT5maWVsZHMuZG0gICAgICAgICAgPSBhcGljLT5pcnFfZGVzdF9tb2RlOwotCWlydGUtPmZpZWxkcy52YWxpZCAgICAgICA9IDE7CisJaW9tbXUtPmlydGVfb3BzLT5wcmVwYXJlKGRhdGEtPmVudHJ5LCBhcGljLT5pcnFfZGVsaXZlcnlfbW9kZSwKKwkJCQkgYXBpYy0+aXJxX2Rlc3RfbW9kZSwgaXJxX2NmZy0+dmVjdG9yLAorCQkJCSBpcnFfY2ZnLT5kZXN0X2FwaWNpZCwgZGV2aWQpOwogCiAJc3dpdGNoIChpbmZvLT50eXBlKSB7CiAJY2FzZSBYODZfSVJRX0FMTE9DX1RZUEVfSU9BUElDOgpAQCAtMzg0NSwxMiArNDA5MiwzMiBAQAogCX0KIH0KIAorc3RydWN0IGFtZF9pcnRlX29wcyBpcnRlXzMyX29wcyA9IHsKKwkucHJlcGFyZSA9IGlydGVfcHJlcGFyZSwKKwkuYWN0aXZhdGUgPSBpcnRlX2FjdGl2YXRlLAorCS5kZWFjdGl2YXRlID0gaXJ0ZV9kZWFjdGl2YXRlLAorCS5zZXRfYWZmaW5pdHkgPSBpcnRlX3NldF9hZmZpbml0eSwKKwkuc2V0X2FsbG9jYXRlZCA9IGlydGVfc2V0X2FsbG9jYXRlZCwKKwkuaXNfYWxsb2NhdGVkID0gaXJ0ZV9pc19hbGxvY2F0ZWQsCisJLmNsZWFyX2FsbG9jYXRlZCA9IGlydGVfY2xlYXJfYWxsb2NhdGVkLAorfTsKKworc3RydWN0IGFtZF9pcnRlX29wcyBpcnRlXzEyOF9vcHMgPSB7CisJLnByZXBhcmUgPSBpcnRlX2dhX3ByZXBhcmUsCisJLmFjdGl2YXRlID0gaXJ0ZV9nYV9hY3RpdmF0ZSwKKwkuZGVhY3RpdmF0ZSA9IGlydGVfZ2FfZGVhY3RpdmF0ZSwKKwkuc2V0X2FmZmluaXR5ID0gaXJ0ZV9nYV9zZXRfYWZmaW5pdHksCisJLnNldF9hbGxvY2F0ZWQgPSBpcnRlX2dhX3NldF9hbGxvY2F0ZWQsCisJLmlzX2FsbG9jYXRlZCA9IGlydGVfZ2FfaXNfYWxsb2NhdGVkLAorCS5jbGVhcl9hbGxvY2F0ZWQgPSBpcnRlX2dhX2NsZWFyX2FsbG9jYXRlZCwKK307CisKIHN0YXRpYyBpbnQgaXJxX3JlbWFwcGluZ19hbGxvYyhzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluLCB1bnNpZ25lZCBpbnQgdmlycSwKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgbnJfaXJxcywgdm9pZCAqYXJnKQogewogCXN0cnVjdCBpcnFfYWxsb2NfaW5mbyAqaW5mbyA9IGFyZzsKIAlzdHJ1Y3QgaXJxX2RhdGEgKmlycV9kYXRhOwotCXN0cnVjdCBhbWRfaXJfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgYW1kX2lyX2RhdGEgKmRhdGEgPSBOVUxMOwogCXN0cnVjdCBpcnFfY2ZnICpjZmc7CiAJaW50IGksIHJldCwgZGV2aWQ7CiAJaW50IGluZGV4ID0gLTE7CkBAIC0zOTAyLDYgKzQxNjksMTYgQEAKIAkJaWYgKCFkYXRhKQogCQkJZ290byBvdXRfZnJlZV9kYXRhOwogCisJCWlmICghQU1EX0lPTU1VX0dVRVNUX0lSX0dBKGFtZF9pb21tdV9ndWVzdF9pcikpCisJCQlkYXRhLT5lbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKHVuaW9uIGlydGUpLCBHRlBfS0VSTkVMKTsKKwkJZWxzZQorCQkJZGF0YS0+ZW50cnkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXJ0ZV9nYSksCisJCQkJCQkgICAgIEdGUF9LRVJORUwpOworCQlpZiAoIWRhdGEtPmVudHJ5KSB7CisJCQlrZnJlZShkYXRhKTsKKwkJCWdvdG8gb3V0X2ZyZWVfZGF0YTsKKwkJfQorCiAJCWlycV9kYXRhLT5od2lycSA9IChkZXZpZCA8PCAxNikgKyBpOwogCQlpcnFfZGF0YS0+Y2hpcF9kYXRhID0gZGF0YTsKIAkJaXJxX2RhdGEtPmNoaXAgPSAmYW1kX2lyX2NoaXA7CkBAIC0zOTM4LDYgKzQyMTUsNyBAQAogCQkJZGF0YSA9IGlycV9kYXRhLT5jaGlwX2RhdGE7CiAJCQlpcnRlX2luZm8gPSAmZGF0YS0+aXJxXzJfaXJ0ZTsKIAkJCWZyZWVfaXJ0ZShpcnRlX2luZm8tPmRldmlkLCBpcnRlX2luZm8tPmluZGV4KTsKKwkJCWtmcmVlKGRhdGEtPmVudHJ5KTsKIAkJCWtmcmVlKGRhdGEpOwogCQl9CiAJfQpAQCAtMzk0OSw4ICs0MjI3LDExIEBACiB7CiAJc3RydWN0IGFtZF9pcl9kYXRhICpkYXRhID0gaXJxX2RhdGEtPmNoaXBfZGF0YTsKIAlzdHJ1Y3QgaXJxXzJfaXJ0ZSAqaXJ0ZV9pbmZvID0gJmRhdGEtPmlycV8yX2lydGU7CisJc3RydWN0IGFtZF9pb21tdSAqaW9tbXUgPSBhbWRfaW9tbXVfcmxvb2t1cF90YWJsZVtpcnRlX2luZm8tPmRldmlkXTsKIAotCW1vZGlmeV9pcnRlKGlydGVfaW5mby0+ZGV2aWQsIGlydGVfaW5mby0+aW5kZXgsIGRhdGEtPmlydGVfZW50cnkpOworCWlmIChpb21tdSkKKwkJaW9tbXUtPmlydGVfb3BzLT5hY3RpdmF0ZShkYXRhLT5lbnRyeSwgaXJ0ZV9pbmZvLT5kZXZpZCwKKwkJCQkJICBpcnRlX2luZm8tPmluZGV4KTsKIH0KIAogc3RhdGljIHZvaWQgaXJxX3JlbWFwcGluZ19kZWFjdGl2YXRlKHN0cnVjdCBpcnFfZG9tYWluICpkb21haW4sCkBAIC0zOTU4LDEwICs0MjM5LDExIEBACiB7CiAJc3RydWN0IGFtZF9pcl9kYXRhICpkYXRhID0gaXJxX2RhdGEtPmNoaXBfZGF0YTsKIAlzdHJ1Y3QgaXJxXzJfaXJ0ZSAqaXJ0ZV9pbmZvID0gJmRhdGEtPmlycV8yX2lydGU7Ci0JdW5pb24gaXJ0ZSBlbnRyeTsKKwlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSA9IGFtZF9pb21tdV9ybG9va3VwX3RhYmxlW2lydGVfaW5mby0+ZGV2aWRdOwogCi0JZW50cnkudmFsID0gMDsKLQltb2RpZnlfaXJ0ZShpcnRlX2luZm8tPmRldmlkLCBpcnRlX2luZm8tPmluZGV4LCBkYXRhLT5pcnRlX2VudHJ5KTsKKwlpZiAoaW9tbXUpCisJCWlvbW11LT5pcnRlX29wcy0+ZGVhY3RpdmF0ZShkYXRhLT5lbnRyeSwgaXJ0ZV9pbmZvLT5kZXZpZCwKKwkJCQkJICAgIGlydGVfaW5mby0+aW5kZXgpOwogfQogCiBzdGF0aWMgc3RydWN0IGlycV9kb21haW5fb3BzIGFtZF9pcl9kb21haW5fb3BzID0gewpAQCAtMzk3MSw2ICs0MjUzLDcwIEBACiAJLmRlYWN0aXZhdGUgPSBpcnFfcmVtYXBwaW5nX2RlYWN0aXZhdGUsCiB9OwogCitzdGF0aWMgaW50IGFtZF9pcl9zZXRfdmNwdV9hZmZpbml0eShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIHZvaWQgKnZjcHVfaW5mbykKK3sKKwlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdTsKKwlzdHJ1Y3QgYW1kX2lvbW11X3BpX2RhdGEgKnBpX2RhdGEgPSB2Y3B1X2luZm87CisJc3RydWN0IHZjcHVfZGF0YSAqdmNwdV9waV9pbmZvID0gcGlfZGF0YS0+dmNwdV9kYXRhOworCXN0cnVjdCBhbWRfaXJfZGF0YSAqaXJfZGF0YSA9IGRhdGEtPmNoaXBfZGF0YTsKKwlzdHJ1Y3QgaXJ0ZV9nYSAqaXJ0ZSA9IChzdHJ1Y3QgaXJ0ZV9nYSAqKSBpcl9kYXRhLT5lbnRyeTsKKwlzdHJ1Y3QgaXJxXzJfaXJ0ZSAqaXJ0ZV9pbmZvID0gJmlyX2RhdGEtPmlycV8yX2lydGU7CisJc3RydWN0IGlvbW11X2Rldl9kYXRhICpkZXZfZGF0YSA9IHNlYXJjaF9kZXZfZGF0YShpcnRlX2luZm8tPmRldmlkKTsKKworCS8qIE5vdGU6CisJICogVGhpcyBkZXZpY2UgaGFzIG5ldmVyIGJlZW4gc2V0IHVwIGZvciBndWVzdCBtb2RlLgorCSAqIHdlIHNob3VsZCBub3QgbW9kaWZ5IHRoZSBJUlRFCisJICovCisJaWYgKCFkZXZfZGF0YSB8fCAhZGV2X2RhdGEtPnVzZV92YXBpYykKKwkJcmV0dXJuIDA7CisKKwlwaV9kYXRhLT5pcl9kYXRhID0gaXJfZGF0YTsKKworCS8qIE5vdGU6CisJICogU1ZNIHRyaWVzIHRvIHNldCB1cCBmb3IgVkFQSUMgbW9kZSwgYnV0IHdlIGFyZSBpbgorCSAqIGxlZ2FjeSBtb2RlLiBTbywgd2UgZm9yY2UgbGVnYWN5IG1vZGUgaW5zdGVhZC4KKwkgKi8KKwlpZiAoIUFNRF9JT01NVV9HVUVTVF9JUl9WQVBJQyhhbWRfaW9tbXVfZ3Vlc3RfaXIpKSB7CisJCXByX2RlYnVnKCJBTUQtVmk6ICVzOiBGYWxsIGJhY2sgdG8gdXNpbmcgaW50ciBsZWdhY3kgcmVtYXBcbiIsCisJCQkgX19mdW5jX18pOworCQlwaV9kYXRhLT5pc19ndWVzdF9tb2RlID0gZmFsc2U7CisJfQorCisJaW9tbXUgPSBhbWRfaW9tbXVfcmxvb2t1cF90YWJsZVtpcnRlX2luZm8tPmRldmlkXTsKKwlpZiAoaW9tbXUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwaV9kYXRhLT5wcmV2X2dhX3RhZyA9IGlyX2RhdGEtPmNhY2hlZF9nYV90YWc7CisJaWYgKHBpX2RhdGEtPmlzX2d1ZXN0X21vZGUpIHsKKwkJLyogU2V0dGluZyAqLworCQlpcnRlLT5oaS5maWVsZHMuZ2Ffcm9vdF9wdHIgPSAocGlfZGF0YS0+YmFzZSA+PiAxMik7CisJCWlydGUtPmhpLmZpZWxkcy52ZWN0b3IgPSB2Y3B1X3BpX2luZm8tPnZlY3RvcjsKKwkJaXJ0ZS0+bG8uZmllbGRzX3ZhcGljLmd1ZXN0X21vZGUgPSAxOworCQlpcnRlLT5sby5maWVsZHNfdmFwaWMuZ2FfdGFnID0gcGlfZGF0YS0+Z2FfdGFnOworCisJCWlyX2RhdGEtPmNhY2hlZF9nYV90YWcgPSBwaV9kYXRhLT5nYV90YWc7CisJfSBlbHNlIHsKKwkJLyogVW4tU2V0dGluZyAqLworCQlzdHJ1Y3QgaXJxX2NmZyAqY2ZnID0gaXJxZF9jZmcoZGF0YSk7CisKKwkJaXJ0ZS0+aGkudmFsID0gMDsKKwkJaXJ0ZS0+bG8udmFsID0gMDsKKwkJaXJ0ZS0+aGkuZmllbGRzLnZlY3RvciA9IGNmZy0+dmVjdG9yOworCQlpcnRlLT5sby5maWVsZHNfcmVtYXAuZ3Vlc3RfbW9kZSA9IDA7CisJCWlydGUtPmxvLmZpZWxkc19yZW1hcC5kZXN0aW5hdGlvbiA9IGNmZy0+ZGVzdF9hcGljaWQ7CisJCWlydGUtPmxvLmZpZWxkc19yZW1hcC5pbnRfdHlwZSA9IGFwaWMtPmlycV9kZWxpdmVyeV9tb2RlOworCQlpcnRlLT5sby5maWVsZHNfcmVtYXAuZG0gPSBhcGljLT5pcnFfZGVzdF9tb2RlOworCisJCS8qCisJCSAqIFRoaXMgY29tbXVuaWNhdGVzIHRoZSBnYV90YWcgYmFjayB0byB0aGUgY2FsbGVyCisJCSAqIHNvIHRoYXQgaXQgY2FuIGRvIGFsbCB0aGUgbmVjZXNzYXJ5IGNsZWFuIHVwLgorCQkgKi8KKwkJaXJfZGF0YS0+Y2FjaGVkX2dhX3RhZyA9IDA7CisJfQorCisJcmV0dXJuIG1vZGlmeV9pcnRlX2dhKGlydGVfaW5mby0+ZGV2aWQsIGlydGVfaW5mby0+aW5kZXgsIGlydGUsIGlyX2RhdGEpOworfQorCiBzdGF0aWMgaW50IGFtZF9pcl9zZXRfYWZmaW5pdHkoc3RydWN0IGlycV9kYXRhICpkYXRhLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrLCBib29sIGZvcmNlKQogewpAQCAtMzk3OCw4ICs0MzI0LDEyIEBACiAJc3RydWN0IGlycV8yX2lydGUgKmlydGVfaW5mbyA9ICZpcl9kYXRhLT5pcnFfMl9pcnRlOwogCXN0cnVjdCBpcnFfY2ZnICpjZmcgPSBpcnFkX2NmZyhkYXRhKTsKIAlzdHJ1Y3QgaXJxX2RhdGEgKnBhcmVudCA9IGRhdGEtPnBhcmVudF9kYXRhOworCXN0cnVjdCBhbWRfaW9tbXUgKmlvbW11ID0gYW1kX2lvbW11X3Jsb29rdXBfdGFibGVbaXJ0ZV9pbmZvLT5kZXZpZF07CiAJaW50IHJldDsKIAorCWlmICghaW9tbXUpCisJCXJldHVybiAtRU5PREVWOworCiAJcmV0ID0gcGFyZW50LT5jaGlwLT5pcnFfc2V0X2FmZmluaXR5KHBhcmVudCwgbWFzaywgZm9yY2UpOwogCWlmIChyZXQgPCAwIHx8IHJldCA9PSBJUlFfU0VUX01BU0tfT0tfRE9ORSkKIAkJcmV0dXJuIHJldDsKQEAgLTM5ODgsOSArNDMzOCw4IEBACiAJICogQXRvbWljYWxseSB1cGRhdGVzIHRoZSBJUlRFIHdpdGggdGhlIG5ldyBkZXN0aW5hdGlvbiwgdmVjdG9yCiAJICogYW5kIGZsdXNoZXMgdGhlIGludGVycnVwdCBlbnRyeSBjYWNoZS4KIAkgKi8KLQlpcl9kYXRhLT5pcnRlX2VudHJ5LmZpZWxkcy52ZWN0b3IgPSBjZmctPnZlY3RvcjsKLQlpcl9kYXRhLT5pcnRlX2VudHJ5LmZpZWxkcy5kZXN0aW5hdGlvbiA9IGNmZy0+ZGVzdF9hcGljaWQ7Ci0JbW9kaWZ5X2lydGUoaXJ0ZV9pbmZvLT5kZXZpZCwgaXJ0ZV9pbmZvLT5pbmRleCwgaXJfZGF0YS0+aXJ0ZV9lbnRyeSk7CisJaW9tbXUtPmlydGVfb3BzLT5zZXRfYWZmaW5pdHkoaXJfZGF0YS0+ZW50cnksIGlydGVfaW5mby0+ZGV2aWQsCisJCQkgICAgaXJ0ZV9pbmZvLT5pbmRleCwgY2ZnLT52ZWN0b3IsIGNmZy0+ZGVzdF9hcGljaWQpOwogCiAJLyoKIAkgKiBBZnRlciB0aGlzIHBvaW50LCBhbGwgdGhlIGludGVycnVwdHMgd2lsbCBzdGFydCBhcnJpdmluZwpAQCAtNDAxMiw2ICs0MzYxLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgYW1kX2lyX2NoaXAgPSB7CiAJLmlycV9hY2sgPSBpcl9hY2tfYXBpY19lZGdlLAogCS5pcnFfc2V0X2FmZmluaXR5ID0gYW1kX2lyX3NldF9hZmZpbml0eSwKKwkuaXJxX3NldF92Y3B1X2FmZmluaXR5ID0gYW1kX2lyX3NldF92Y3B1X2FmZmluaXR5LAogCS5pcnFfY29tcG9zZV9tc2lfbXNnID0gaXJfY29tcG9zZV9tc2lfbXNnLAogfTsKIApAQCAtNDAyNiw0ICs0Mzc2LDQzIEBACiAKIAlyZXR1cm4gMDsKIH0KKworaW50IGFtZF9pb21tdV91cGRhdGVfZ2EoaW50IGNwdSwgYm9vbCBpc19ydW4sIHZvaWQgKmRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdTsKKwlzdHJ1Y3QgaXJxX3JlbWFwX3RhYmxlICppcnQ7CisJc3RydWN0IGFtZF9pcl9kYXRhICppcl9kYXRhID0gKHN0cnVjdCBhbWRfaXJfZGF0YSAqKWRhdGE7CisJaW50IGRldmlkID0gaXJfZGF0YS0+aXJxXzJfaXJ0ZS5kZXZpZDsKKwlzdHJ1Y3QgaXJ0ZV9nYSAqZW50cnkgPSAoc3RydWN0IGlydGVfZ2EgKikgaXJfZGF0YS0+ZW50cnk7CisJc3RydWN0IGlydGVfZ2EgKnJlZiA9IChzdHJ1Y3QgaXJ0ZV9nYSAqKSBpcl9kYXRhLT5yZWY7CisKKwlpZiAoIUFNRF9JT01NVV9HVUVTVF9JUl9WQVBJQyhhbWRfaW9tbXVfZ3Vlc3RfaXIpIHx8CisJICAgICFyZWYgfHwgIWVudHJ5IHx8ICFlbnRyeS0+bG8uZmllbGRzX3ZhcGljLmd1ZXN0X21vZGUpCisJCXJldHVybiAwOworCisJaW9tbXUgPSBhbWRfaW9tbXVfcmxvb2t1cF90YWJsZVtkZXZpZF07CisJaWYgKCFpb21tdSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpcnQgPSBnZXRfaXJxX3RhYmxlKGRldmlkLCBmYWxzZSk7CisJaWYgKCFpcnQpCisJCXJldHVybiAtRU5PREVWOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlydC0+bG9jaywgZmxhZ3MpOworCisJaWYgKHJlZi0+bG8uZmllbGRzX3ZhcGljLmd1ZXN0X21vZGUpIHsKKwkJaWYgKGNwdSA+PSAwKQorCQkJcmVmLT5sby5maWVsZHNfdmFwaWMuZGVzdGluYXRpb24gPSBjcHU7CisJCXJlZi0+bG8uZmllbGRzX3ZhcGljLmlzX3J1biA9IGlzX3J1bjsKKwkJYmFycmllcigpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlydC0+bG9jaywgZmxhZ3MpOworCisJaW9tbXVfZmx1c2hfaXJ0KGlvbW11LCBkZXZpZCk7CisJaW9tbXVfY29tcGxldGlvbl93YWl0KGlvbW11KTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYW1kX2lvbW11X3VwZGF0ZV9nYSk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvYW1kX2lvbW11X2luaXQuYyBiL2RyaXZlcnMvaW9tbXUvYW1kX2lvbW11X2luaXQuYwppbmRleCA1OTc0MWVhLi5jZDE3MTM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lvbW11L2FtZF9pb21tdV9pbml0LmMKKysrIGIvZHJpdmVycy9pb21tdS9hbWRfaW9tbXVfaW5pdC5jCkBAIC04NCw2ICs4NCw3IEBACiAjZGVmaW5lIEFDUElfREVWRkxBR19MSU5UMSAgICAgICAgICAgICAgMHg4MAogI2RlZmluZSBBQ1BJX0RFVkZMQUdfQVRTRElTICAgICAgICAgICAgIDB4MTAwMDAwMDAKIAorI2RlZmluZSBMT09QX1RJTUVPVVQJMTAwMDAwCiAvKgogICogQUNQSSB0YWJsZSBkZWZpbml0aW9ucwogICoKQEAgLTE0NSw2ICsxNDYsOCBAQAogYm9vbCBhbWRfaW9tbXVfZHVtcDsKIGJvb2wgYW1kX2lvbW11X2lycV9yZW1hcCBfX3JlYWRfbW9zdGx5OwogCitpbnQgYW1kX2lvbW11X2d1ZXN0X2lyID0gQU1EX0lPTU1VX0dVRVNUX0lSX1ZBUElDOworCiBzdGF0aWMgYm9vbCBhbWRfaW9tbXVfZGV0ZWN0ZWQ7CiBzdGF0aWMgYm9vbCBfX2luaXRkYXRhIGFtZF9pb21tdV9kaXNhYmxlZDsKIHN0YXRpYyBpbnQgYW1kX2lvbW11X3RhcmdldF9pdmhkX3R5cGU7CkBAIC0zODYsNiArMzg5LDEwIEBACiAJaW9tbXVfZmVhdHVyZV9kaXNhYmxlKGlvbW11LCBDT05UUk9MX0VWVF9JTlRfRU4pOwogCWlvbW11X2ZlYXR1cmVfZGlzYWJsZShpb21tdSwgQ09OVFJPTF9FVlRfTE9HX0VOKTsKIAorCS8qIERpc2FibGUgSU9NTVUgR0FfTE9HICovCisJaW9tbXVfZmVhdHVyZV9kaXNhYmxlKGlvbW11LCBDT05UUk9MX0dBTE9HX0VOKTsKKwlpb21tdV9mZWF0dXJlX2Rpc2FibGUoaW9tbXUsIENPTlRST0xfR0FJTlRfRU4pOworCiAJLyogRGlzYWJsZSBJT01NVSBoYXJkd2FyZSBpdHNlbGYgKi8KIAlpb21tdV9mZWF0dXJlX2Rpc2FibGUoaW9tbXUsIENPTlRST0xfSU9NTVVfRU4pOwogfQpAQCAtNjcxLDYgKzY3OCw5OSBAQAogCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpaW9tbXUtPnBwcl9sb2csIGdldF9vcmRlcihQUFJfTE9HX1NJWkUpKTsKIH0KIAorc3RhdGljIHZvaWQgZnJlZV9nYV9sb2coc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCit7CisjaWZkZWYgQ09ORklHX0lSUV9SRU1BUAorCWlmIChpb21tdS0+Z2FfbG9nKQorCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWlvbW11LT5nYV9sb2csCisJCQkgICAgZ2V0X29yZGVyKEdBX0xPR19TSVpFKSk7CisJaWYgKGlvbW11LT5nYV9sb2dfdGFpbCkKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylpb21tdS0+Z2FfbG9nX3RhaWwsCisJCQkgICAgZ2V0X29yZGVyKDgpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IGlvbW11X2dhX2xvZ19lbmFibGUoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCit7CisjaWZkZWYgQ09ORklHX0lSUV9SRU1BUAorCXUzMiBzdGF0dXMsIGk7CisKKwlpZiAoIWlvbW11LT5nYV9sb2cpCisJCXJldHVybiAtRUlOVkFMOworCisJc3RhdHVzID0gcmVhZGwoaW9tbXUtPm1taW9fYmFzZSArIE1NSU9fU1RBVFVTX09GRlNFVCk7CisKKwkvKiBDaGVjayBpZiBhbHJlYWR5IHJ1bm5pbmcgKi8KKwlpZiAoc3RhdHVzICYgKE1NSU9fU1RBVFVTX0dBTE9HX1JVTl9NQVNLKSkKKwkJcmV0dXJuIDA7CisKKwlpb21tdV9mZWF0dXJlX2VuYWJsZShpb21tdSwgQ09OVFJPTF9HQUlOVF9FTik7CisJaW9tbXVfZmVhdHVyZV9lbmFibGUoaW9tbXUsIENPTlRST0xfR0FMT0dfRU4pOworCisJZm9yIChpID0gMDsgaSA8IExPT1BfVElNRU9VVDsgKytpKSB7CisJCXN0YXR1cyA9IHJlYWRsKGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX1NUQVRVU19PRkZTRVQpOworCQlpZiAoc3RhdHVzICYgKE1NSU9fU1RBVFVTX0dBTE9HX1JVTl9NQVNLKSkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID49IExPT1BfVElNRU9VVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisjZW5kaWYgLyogQ09ORklHX0lSUV9SRU1BUCAqLworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0lSUV9SRU1BUAorc3RhdGljIGludCBpb21tdV9pbml0X2dhX2xvZyhzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKK3sKKwl1NjQgZW50cnk7CisKKwlpZiAoIUFNRF9JT01NVV9HVUVTVF9JUl9WQVBJQyhhbWRfaW9tbXVfZ3Vlc3RfaXIpKQorCQlyZXR1cm4gMDsKKworCWlvbW11LT5nYV9sb2cgPSAodTggKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPLAorCQkJCQlnZXRfb3JkZXIoR0FfTE9HX1NJWkUpKTsKKwlpZiAoIWlvbW11LT5nYV9sb2cpCisJCWdvdG8gZXJyX291dDsKKworCWlvbW11LT5nYV9sb2dfdGFpbCA9ICh1OCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sCisJCQkJCWdldF9vcmRlcig4KSk7CisJaWYgKCFpb21tdS0+Z2FfbG9nX3RhaWwpCisJCWdvdG8gZXJyX291dDsKKworCWVudHJ5ID0gKHU2NCl2aXJ0X3RvX3BoeXMoaW9tbXUtPmdhX2xvZykgfCBHQV9MT0dfU0laRV81MTI7CisJbWVtY3B5X3RvaW8oaW9tbXUtPm1taW9fYmFzZSArIE1NSU9fR0FfTE9HX0JBU0VfT0ZGU0VULAorCQkgICAgJmVudHJ5LCBzaXplb2YoZW50cnkpKTsKKwllbnRyeSA9ICgodTY0KXZpcnRfdG9fcGh5cyhpb21tdS0+Z2FfbG9nKSAmIDB4RkZGRkZGRkZGRkZGRlVMTCkgJiB+N1VMTDsKKwltZW1jcHlfdG9pbyhpb21tdS0+bW1pb19iYXNlICsgTU1JT19HQV9MT0dfVEFJTF9PRkZTRVQsCisJCSAgICAmZW50cnksIHNpemVvZihlbnRyeSkpOworCXdyaXRlbCgweDAwLCBpb21tdS0+bW1pb19iYXNlICsgTU1JT19HQV9IRUFEX09GRlNFVCk7CisJd3JpdGVsKDB4MDAsIGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0dBX1RBSUxfT0ZGU0VUKTsKKworCXJldHVybiAwOworZXJyX291dDoKKwlmcmVlX2dhX2xvZyhpb21tdSk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisjZW5kaWYgLyogQ09ORklHX0lSUV9SRU1BUCAqLworCitzdGF0aWMgaW50IGlvbW11X2luaXRfZ2Eoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCit7CisJaW50IHJldCA9IDA7CisKKyNpZmRlZiBDT05GSUdfSVJRX1JFTUFQCisJLyogTm90ZTogV2UgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgR0FTdXAgZnJvbSBJVlJTIHRhYmxlLgorCSAqICAgICAgIE5vdywgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBHQU1TdXAgaXMgc2V0LgorCSAqLworCWlmIChBTURfSU9NTVVfR1VFU1RfSVJfVkFQSUMoYW1kX2lvbW11X2d1ZXN0X2lyKSAmJgorCSAgICAhaW9tbXVfZmVhdHVyZShpb21tdSwgRkVBVFVSRV9HQU1fVkFQSUMpKQorCQlhbWRfaW9tbXVfZ3Vlc3RfaXIgPSBBTURfSU9NTVVfR1VFU1RfSVJfTEVHQUNZX0dBOworCisJcmV0ID0gaW9tbXVfaW5pdF9nYV9sb2coaW9tbXUpOworI2VuZGlmIC8qIENPTkZJR19JUlFfUkVNQVAgKi8KKworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyB2b2lkIGlvbW11X2VuYWJsZV9ndChzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKIHsKIAlpZiAoIWlvbW11X2ZlYXR1cmUoaW9tbXUsIEZFQVRVUkVfR1QpKQpAQCAtMTE0NCw2ICsxMjQ0LDcgQEAKIAlmcmVlX2NvbW1hbmRfYnVmZmVyKGlvbW11KTsKIAlmcmVlX2V2ZW50X2J1ZmZlcihpb21tdSk7CiAJZnJlZV9wcHJfbG9nKGlvbW11KTsKKwlmcmVlX2dhX2xvZyhpb21tdSk7CiAJaW9tbXVfdW5tYXBfbW1pb19zcGFjZShpb21tdSk7CiB9CiAKQEAgLTEyNTgsNiArMTM1OSw4IEBACiAJCQlpb21tdS0+bW1pb19waHlzX2VuZCA9IE1NSU9fUkVHX0VORF9PRkZTRVQ7CiAJCWVsc2UKIAkJCWlvbW11LT5tbWlvX3BoeXNfZW5kID0gTU1JT19DTlRSX0NPTkZfT0ZGU0VUOworCQlpZiAoKChoLT5lZnJfYXR0ciAmICgweDEgPDwgSU9NTVVfRkVBVF9HQVNVUF9TSElGVCkpID09IDApKQorCQkJYW1kX2lvbW11X2d1ZXN0X2lyID0gQU1EX0lPTU1VX0dVRVNUX0lSX0xFR0FDWTsKIAkJYnJlYWs7CiAJY2FzZSAweDExOgogCWNhc2UgMHg0MDoKQEAgLTEyNjUsNiArMTM2OCw4IEBACiAJCQlpb21tdS0+bW1pb19waHlzX2VuZCA9IE1NSU9fUkVHX0VORF9PRkZTRVQ7CiAJCWVsc2UKIAkJCWlvbW11LT5tbWlvX3BoeXNfZW5kID0gTU1JT19DTlRSX0NPTkZfT0ZGU0VUOworCQlpZiAoKChoLT5lZnJfcmVnICYgKDB4MSA8PCBJT01NVV9FRlJfR0FTVVBfU0hJRlQpKSA9PSAwKSkKKwkJCWFtZF9pb21tdV9ndWVzdF9pciA9IEFNRF9JT01NVV9HVUVTVF9JUl9MRUdBQ1k7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTQzMiw2ICsxNTM3LDcgQEAKIHsKIAlpbnQgY2FwX3B0ciA9IGlvbW11LT5jYXBfcHRyOwogCXUzMiByYW5nZSwgbWlzYywgbG93LCBoaWdoOworCWludCByZXQ7CiAKIAlpb21tdS0+ZGV2ID0gcGNpX2dldF9idXNfYW5kX3Nsb3QoUENJX0JVU19OVU0oaW9tbXUtPmRldmlkKSwKIAkJCQkJICBpb21tdS0+ZGV2aWQgJiAweGZmKTsKQEAgLTE0ODgsNiArMTU5NCwxMCBAQAogCWlmIChpb21tdV9mZWF0dXJlKGlvbW11LCBGRUFUVVJFX1BQUikgJiYgYWxsb2NfcHByX2xvZyhpb21tdSkpCiAJCXJldHVybiAtRU5PTUVNOwogCisJcmV0ID0gaW9tbXVfaW5pdF9nYShpb21tdSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCWlmIChpb21tdS0+Y2FwICYgKDFVTCA8PCBJT01NVV9DQVBfTlBDQUNIRSkpCiAJCWFtZF9pb21tdV9ucF9jYWNoZSA9IHRydWU7CiAKQEAgLTE1NDUsMTYgKzE2NTUsMjQgQEAKIAkJCWRldl9uYW1lKCZpb21tdS0+ZGV2LT5kZXYpLCBpb21tdS0+Y2FwX3B0cik7CiAKIAkJaWYgKGlvbW11LT5jYXAgJiAoMSA8PCBJT01NVV9DQVBfRUZSKSkgewotCQkJcHJfaW5mbygiQU1ELVZpOiAgRXh0ZW5kZWQgZmVhdHVyZXM6ICIpOworCQkJcHJfaW5mbygiQU1ELVZpOiBFeHRlbmRlZCBmZWF0dXJlcyAoJSNsbHgpOlxuIiwKKwkJCQlpb21tdS0+ZmVhdHVyZXMpOwogCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZmVhdF9zdHIpOyArK2kpIHsKIAkJCQlpZiAoaW9tbXVfZmVhdHVyZShpb21tdSwgKDFVTEwgPDwgaSkpKQogCQkJCQlwcl9jb250KCIgJXMiLCBmZWF0X3N0cltpXSk7CiAJCQl9CisKKwkJCWlmIChpb21tdS0+ZmVhdHVyZXMgJiBGRUFUVVJFX0dBTV9WQVBJQykKKwkJCQlwcl9jb250KCIgR0FfdkFQSUMiKTsKKwogCQkJcHJfY29udCgiXG4iKTsKIAkJfQogCX0KLQlpZiAoaXJxX3JlbWFwcGluZ19lbmFibGVkKQorCWlmIChpcnFfcmVtYXBwaW5nX2VuYWJsZWQpIHsKIAkJcHJfaW5mbygiQU1ELVZpOiBJbnRlcnJ1cHQgcmVtYXBwaW5nIGVuYWJsZWRcbiIpOworCQlpZiAoQU1EX0lPTU1VX0dVRVNUX0lSX1ZBUElDKGFtZF9pb21tdV9ndWVzdF9pcikpCisJCQlwcl9pbmZvKCJBTUQtVmk6IHZpcnR1YWwgQVBJQyBlbmFibGVkXG4iKTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGFtZF9pb21tdV9pbml0X3BjaSh2b2lkKQpAQCAtMTY0NSw2ICsxNzYzLDggQEAKIAlpZiAoaW9tbXUtPnBwcl9sb2cgIT0gTlVMTCkKIAkJaW9tbXVfZmVhdHVyZV9lbmFibGUoaW9tbXUsIENPTlRST0xfUFBGSU5UX0VOKTsKIAorCWlvbW11X2dhX2xvZ19lbmFibGUoaW9tbXUpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE4NjIsNiArMTk4MiwyNCBAQAogCQkJICAgICAgIGlvbW11LT5zdG9yZWRfYWRkcl9sbyB8IDEpOwogfQogCitzdGF0aWMgdm9pZCBpb21tdV9lbmFibGVfZ2Eoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCit7CisjaWZkZWYgQ09ORklHX0lSUV9SRU1BUAorCXN3aXRjaCAoYW1kX2lvbW11X2d1ZXN0X2lyKSB7CisJY2FzZSBBTURfSU9NTVVfR1VFU1RfSVJfVkFQSUM6CisJCWlvbW11X2ZlYXR1cmVfZW5hYmxlKGlvbW11LCBDT05UUk9MX0dBTV9FTik7CisJCS8qIEZhbGwgdGhyb3VnaCAqLworCWNhc2UgQU1EX0lPTU1VX0dVRVNUX0lSX0xFR0FDWV9HQToKKwkJaW9tbXVfZmVhdHVyZV9lbmFibGUoaW9tbXUsIENPTlRST0xfR0FfRU4pOworCQlpb21tdS0+aXJ0ZV9vcHMgPSAmaXJ0ZV8xMjhfb3BzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpb21tdS0+aXJ0ZV9vcHMgPSAmaXJ0ZV8zMl9vcHM7CisJCWJyZWFrOworCX0KKyNlbmRpZgorfQorCiAvKgogICogVGhpcyBmdW5jdGlvbiBmaW5hbGx5IGVuYWJsZXMgYWxsIElPTU1VcyBmb3VuZCBpbiB0aGUgc3lzdGVtIGFmdGVyCiAgKiB0aGV5IGhhdmUgYmVlbiBpbml0aWFsaXplZApAQCAtMTg3Nyw5ICsyMDE1LDE1IEBACiAJCWlvbW11X2VuYWJsZV9jb21tYW5kX2J1ZmZlcihpb21tdSk7CiAJCWlvbW11X2VuYWJsZV9ldmVudF9idWZmZXIoaW9tbXUpOwogCQlpb21tdV9zZXRfZXhjbHVzaW9uX3JhbmdlKGlvbW11KTsKKwkJaW9tbXVfZW5hYmxlX2dhKGlvbW11KTsKIAkJaW9tbXVfZW5hYmxlKGlvbW11KTsKIAkJaW9tbXVfZmx1c2hfYWxsX2NhY2hlcyhpb21tdSk7CiAJfQorCisjaWZkZWYgQ09ORklHX0lSUV9SRU1BUAorCWlmIChBTURfSU9NTVVfR1VFU1RfSVJfVkFQSUMoYW1kX2lvbW11X2d1ZXN0X2lyKSkKKwkJYW1kX2lvbW11X2lycV9vcHMuY2FwYWJpbGl0eSB8PSAoMSA8PCBJUlFfUE9TVElOR19DQVApOworI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIGVuYWJsZV9pb21tdXNfdjIodm9pZCkKQEAgLTE5MDUsNiArMjA0OSwxMSBAQAogCiAJZm9yX2VhY2hfaW9tbXUoaW9tbXUpCiAJCWlvbW11X2Rpc2FibGUoaW9tbXUpOworCisjaWZkZWYgQ09ORklHX0lSUV9SRU1BUAorCWlmIChBTURfSU9NTVVfR1VFU1RfSVJfVkFQSUMoYW1kX2lvbW11X2d1ZXN0X2lyKSkKKwkJYW1kX2lvbW11X2lycV9vcHMuY2FwYWJpbGl0eSAmPSB+KDEgPDwgSVJRX1BPU1RJTkdfQ0FQKTsKKyNlbmRpZgogfQogCiAvKgpAQCAtMjA1OSw3ICsyMjA4LDcgQEAKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKml2cnNfYmFzZTsKIAlhY3BpX3NpemUgaXZyc19zaXplOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlpbnQgaSwgcmV0ID0gMDsKKwlpbnQgaSwgcmVtYXBfY2FjaGVfc3osIHJldCA9IDA7CiAKIAlpZiAoIWFtZF9pb21tdV9kZXRlY3RlZCkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0yMTU3LDEwICsyMzA2LDE0IEBACiAJCSAqIHJlbWFwcGluZyB0YWJsZXMuCiAJCSAqLwogCQlyZXQgPSAtRU5PTUVNOworCQlpZiAoIUFNRF9JT01NVV9HVUVTVF9JUl9HQShhbWRfaW9tbXVfZ3Vlc3RfaXIpKQorCQkJcmVtYXBfY2FjaGVfc3ogPSBNQVhfSVJRU19QRVJfVEFCTEUgKiBzaXplb2YodTMyKTsKKwkJZWxzZQorCQkJcmVtYXBfY2FjaGVfc3ogPSBNQVhfSVJRU19QRVJfVEFCTEUgKiAoc2l6ZW9mKHU2NCkgKiAyKTsKIAkJYW1kX2lvbW11X2lycV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJpcnFfcmVtYXBfY2FjaGUiLAotCQkJCU1BWF9JUlFTX1BFUl9UQUJMRSAqIHNpemVvZih1MzIpLAotCQkJCUlSUV9UQUJMRV9BTElHTk1FTlQsCi0JCQkJMCwgTlVMTCk7CisJCQkJCQkJcmVtYXBfY2FjaGVfc3osCisJCQkJCQkJSVJRX1RBQkxFX0FMSUdOTUVOVCwKKwkJCQkJCQkwLCBOVUxMKTsKIAkJaWYgKCFhbWRfaW9tbXVfaXJxX2NhY2hlKQogCQkJZ290byBvdXQ7CiAKQEAgLTI0MTMsNiArMjU2NiwyMSBAQAogCXJldHVybiAxOwogfQogCitzdGF0aWMgaW50IF9faW5pdCBwYXJzZV9hbWRfaW9tbXVfaW50cihjaGFyICpzdHIpCit7CisJZm9yICg7ICpzdHI7ICsrc3RyKSB7CisJCWlmIChzdHJuY21wKHN0ciwgImxlZ2FjeSIsIDYpID09IDApIHsKKwkJCWFtZF9pb21tdV9ndWVzdF9pciA9IEFNRF9JT01NVV9HVUVTVF9JUl9MRUdBQ1k7CisJCQlicmVhazsKKwkJfQorCQlpZiAoc3RybmNtcChzdHIsICJ2YXBpYyIsIDUpID09IDApIHsKKwkJCWFtZF9pb21tdV9ndWVzdF9pciA9IEFNRF9JT01NVV9HVUVTVF9JUl9WQVBJQzsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAxOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBwYXJzZV9hbWRfaW9tbXVfb3B0aW9ucyhjaGFyICpzdHIpCiB7CiAJZm9yICg7ICpzdHI7ICsrc3RyKSB7CkBAIC0yNTIxLDYgKzI2ODksNyBAQAogCiBfX3NldHVwKCJhbWRfaW9tbXVfZHVtcCIsCXBhcnNlX2FtZF9pb21tdV9kdW1wKTsKIF9fc2V0dXAoImFtZF9pb21tdT0iLAkJcGFyc2VfYW1kX2lvbW11X29wdGlvbnMpOworX19zZXR1cCgiYW1kX2lvbW11X2ludHI9IiwJcGFyc2VfYW1kX2lvbW11X2ludHIpOwogX19zZXR1cCgiaXZyc19pb2FwaWMiLAkJcGFyc2VfaXZyc19pb2FwaWMpOwogX19zZXR1cCgiaXZyc19ocGV0IiwJCXBhcnNlX2l2cnNfaHBldCk7CiBfX3NldHVwKCJpdnJzX2FjcGloaWQiLAkJcGFyc2VfaXZyc19hY3BpaGlkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvYW1kX2lvbW11X3Byb3RvLmggYi9kcml2ZXJzL2lvbW11L2FtZF9pb21tdV9wcm90by5oCmluZGV4IDBiZDllYjMuLmZhYTNiNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW9tbXUvYW1kX2lvbW11X3Byb3RvLmgKKysrIGIvZHJpdmVycy9pb21tdS9hbWRfaW9tbXVfcHJvdG8uaApAQCAtMzgsNiArMzgsNyBAQAogZXh0ZXJuIHZvaWQgYW1kX2lvbW11X2Rpc2FibGUodm9pZCk7CiBleHRlcm4gaW50IGFtZF9pb21tdV9yZWVuYWJsZShpbnQpOwogZXh0ZXJuIGludCBhbWRfaW9tbXVfZW5hYmxlX2ZhdWx0aW5nKHZvaWQpOworZXh0ZXJuIGludCBhbWRfaW9tbXVfZ3Vlc3RfaXI7CiAKIC8qIElPTU1VdjIgc3BlY2lmaWMgZnVuY3Rpb25zICovCiBzdHJ1Y3QgaW9tbXVfZG9tYWluOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9hbWRfaW9tbXVfdHlwZXMuaCBiL2RyaXZlcnMvaW9tbXUvYW1kX2lvbW11X3R5cGVzLmgKaW5kZXggY2FmNWUzOC4uMGQ5MTc4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9hbWRfaW9tbXVfdHlwZXMuaAorKysgYi9kcml2ZXJzL2lvbW11L2FtZF9pb21tdV90eXBlcy5oCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvbXNpLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CkBAIC02OSw2ICs3MCw4IEBACiAjZGVmaW5lIE1NSU9fRVhDTF9MSU1JVF9PRkZTRVQgIDB4MDAyOAogI2RlZmluZSBNTUlPX0VYVF9GRUFUVVJFUwkweDAwMzAKICNkZWZpbmUgTU1JT19QUFJfTE9HX09GRlNFVAkweDAwMzgKKyNkZWZpbmUgTU1JT19HQV9MT0dfQkFTRV9PRkZTRVQJMHgwMGUwCisjZGVmaW5lIE1NSU9fR0FfTE9HX1RBSUxfT0ZGU0VUCTB4MDBlOAogI2RlZmluZSBNTUlPX0NNRF9IRUFEX09GRlNFVAkweDIwMDAKICNkZWZpbmUgTU1JT19DTURfVEFJTF9PRkZTRVQJMHgyMDA4CiAjZGVmaW5lIE1NSU9fRVZUX0hFQURfT0ZGU0VUCTB4MjAxMApAQCAtNzYsNiArNzksOCBAQAogI2RlZmluZSBNTUlPX1NUQVRVU19PRkZTRVQJMHgyMDIwCiAjZGVmaW5lIE1NSU9fUFBSX0hFQURfT0ZGU0VUCTB4MjAzMAogI2RlZmluZSBNTUlPX1BQUl9UQUlMX09GRlNFVAkweDIwMzgKKyNkZWZpbmUgTU1JT19HQV9IRUFEX09GRlNFVAkweDIwNDAKKyNkZWZpbmUgTU1JT19HQV9UQUlMX09GRlNFVAkweDIwNDgKICNkZWZpbmUgTU1JT19DTlRSX0NPTkZfT0ZGU0VUCTB4NDAwMAogI2RlZmluZSBNTUlPX0NOVFJfUkVHX09GRlNFVAkweDQwMDAwCiAjZGVmaW5lIE1NSU9fUkVHX0VORF9PRkZTRVQJMHg4MDAwMApAQCAtOTIsNiArOTcsNyBAQAogI2RlZmluZSBGRUFUVVJFX0dBCQkoMVVMTDw8NykKICNkZWZpbmUgRkVBVFVSRV9IRQkJKDFVTEw8PDgpCiAjZGVmaW5lIEZFQVRVUkVfUEMJCSgxVUxMPDw5KQorI2RlZmluZSBGRUFUVVJFX0dBTV9WQVBJQwkoMVVMTDw8MjEpCiAKICNkZWZpbmUgRkVBVFVSRV9QQVNJRF9TSElGVAkzMgogI2RlZmluZSBGRUFUVVJFX1BBU0lEX01BU0sJKDB4MWZVTEwgPDwgRkVBVFVSRV9QQVNJRF9TSElGVCkKQEAgLTExMCw2ICsxMTYsOSBAQAogI2RlZmluZSBNTUlPX1NUQVRVU19FVlRfSU5UX01BU0sJKDEgPDwgMSkKICNkZWZpbmUgTU1JT19TVEFUVVNfQ09NX1dBSVRfSU5UX01BU0sJKDEgPDwgMikKICNkZWZpbmUgTU1JT19TVEFUVVNfUFBSX0lOVF9NQVNLCSgxIDw8IDYpCisjZGVmaW5lIE1NSU9fU1RBVFVTX0dBTE9HX1JVTl9NQVNLCSgxIDw8IDgpCisjZGVmaW5lIE1NSU9fU1RBVFVTX0dBTE9HX09WRVJGTE9XX01BU0sJKDEgPDwgOSkKKyNkZWZpbmUgTU1JT19TVEFUVVNfR0FMT0dfSU5UX01BU0sJKDEgPDwgMTApCiAKIC8qIGV2ZW50IGxvZ2dpbmcgY29uc3RhbnRzICovCiAjZGVmaW5lIEVWRU5UX0VOVFJZX1NJWkUJMHgxMApAQCAtMTQ2LDYgKzE1NSwxMCBAQAogI2RlZmluZSBDT05UUk9MX1BQRklOVF9FTiAgICAgICAweDBlVUxMCiAjZGVmaW5lIENPTlRST0xfUFBSX0VOICAgICAgICAgIDB4MGZVTEwKICNkZWZpbmUgQ09OVFJPTF9HVF9FTiAgICAgICAgICAgMHgxMFVMTAorI2RlZmluZSBDT05UUk9MX0dBX0VOICAgICAgICAgICAweDExVUxMCisjZGVmaW5lIENPTlRST0xfR0FNX0VOICAgICAgICAgIDB4MTlVTEwKKyNkZWZpbmUgQ09OVFJPTF9HQUxPR19FTiAgICAgICAgMHgxQ1VMTAorI2RlZmluZSBDT05UUk9MX0dBSU5UX0VOICAgICAgICAweDFEVUxMCiAKICNkZWZpbmUgQ1RSTF9JTlZfVE9fTUFTSwkoNyA8PCBDT05UUk9MX0lOVl9USU1FT1VUKQogI2RlZmluZSBDVFJMX0lOVl9UT19OT05FCTAKQEAgLTIyNCw2ICsyMzcsMTkgQEAKIAogI2RlZmluZSBQUFJfUkVRX0ZBVUxUCQkweDAxCiAKKy8qIENvbnN0YW50cyBmb3IgR0EgTG9nIGhhbmRsaW5nICovCisjZGVmaW5lIEdBX0xPR19FTlRSSUVTCQk1MTIKKyNkZWZpbmUgR0FfTE9HX1NJWkVfU0hJRlQJNTYKKyNkZWZpbmUgR0FfTE9HX1NJWkVfNTEyCQkoMHg4VUxMIDw8IEdBX0xPR19TSVpFX1NISUZUKQorI2RlZmluZSBHQV9FTlRSWV9TSVpFCQk4CisjZGVmaW5lIEdBX0xPR19TSVpFCQkoR0FfRU5UUllfU0laRSAqIEdBX0xPR19FTlRSSUVTKQorCisjZGVmaW5lIEdBX1RBRyh4KQkJKHUzMikoeCAmIDB4ZmZmZmZmZmZVTEwpCisjZGVmaW5lIEdBX0RFVklEKHgpCQkodTE2KSgoKHgpID4+IDMyKSAmIDB4ZmZmZlVMTCkKKyNkZWZpbmUgR0FfUkVRX1RZUEUoeCkJCSgoKHgpID4+IDYwKSAmIDB4ZlVMTCkKKworI2RlZmluZSBHQV9HVUVTVF9OUgkJMHgxCisKICNkZWZpbmUgUEFHRV9NT0RFX05PTkUgICAgMHgwMAogI2RlZmluZSBQQUdFX01PREVfMV9MRVZFTCAweDAxCiAjZGVmaW5lIFBBR0VfTU9ERV8yX0xFVkVMIDB4MDIKQEAgLTMyOSw2ICszNTUsMTIgQEAKICNkZWZpbmUgSU9NTVVfQ0FQX05QQ0FDSEUgMjYKICNkZWZpbmUgSU9NTVVfQ0FQX0VGUiAgICAgMjcKIAorLyogSU9NTVUgRmVhdHVyZSBSZXBvcnRpbmcgRmllbGQgKGZvciBJVkhEIHR5cGUgMTBoICovCisjZGVmaW5lIElPTU1VX0ZFQVRfR0FTVVBfU0hJRlQJNgorCisvKiBJT01NVSBFeHRlbmRlZCBGZWF0dXJlIFJlZ2lzdGVyIChFRlIpICovCisjZGVmaW5lIElPTU1VX0VGUl9HQVNVUF9TSElGVAk3CisKICNkZWZpbmUgTUFYX0RPTUFJTl9JRCA2NTUzNgogCiAvKiBQcm90ZWN0aW9uIGRvbWFpbiBmbGFncyAqLwpAQCAtNDAwLDYgKzQzMiw3IEBACiAKIHN0cnVjdCBpb21tdV9kb21haW47CiBzdHJ1Y3QgaXJxX2RvbWFpbjsKK3N0cnVjdCBhbWRfaXJ0ZV9vcHM7CiAKIC8qCiAgKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBnZW5lcmljIGRhdGEgZm9yICBJT01NVSBwcm90ZWN0aW9uIGRvbWFpbnMKQEAgLTQ5MCw2ICs1MjMsMTIgQEAKIAkvKiBCYXNlIG9mIHRoZSBQUFIgbG9nLCBpZiBwcmVzZW50ICovCiAJdTggKnBwcl9sb2c7CiAKKwkvKiBCYXNlIG9mIHRoZSBHQSBsb2csIGlmIHByZXNlbnQgKi8KKwl1OCAqZ2FfbG9nOworCisJLyogVGFpbCBvZiB0aGUgR0EgbG9nLCBpZiBwcmVzZW50ICovCisJdTggKmdhX2xvZ190YWlsOworCiAJLyogdHJ1ZSBpZiBpbnRlcnJ1cHRzIGZvciB0aGlzIElPTU1VIGFyZSBhbHJlYWR5IGVuYWJsZWQgKi8KIAlib29sIGludF9lbmFibGVkOwogCkBAIC01MjMsNyArNTYyLDExIEBACiAjaWZkZWYgQ09ORklHX0lSUV9SRU1BUAogCXN0cnVjdCBpcnFfZG9tYWluICppcl9kb21haW47CiAJc3RydWN0IGlycV9kb21haW4gKm1zaV9kb21haW47CisKKwlzdHJ1Y3QgYW1kX2lydGVfb3BzICppcnRlX29wczsKICNlbmRpZgorCisJdm9sYXRpbGUgdTY0IF9fYWxpZ25lZCg4KSBjbWRfc2VtOwogfTsKIAogI2RlZmluZSBBQ1BJSElEX1VJRF9MRU4gMjU2CkBAIC02ODEsNCArNzI0LDExMiBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCitlbnVtIGFtZF9pb21tdV9pbnRyX21vZGVfdHlwZSB7CisJQU1EX0lPTU1VX0dVRVNUX0lSX0xFR0FDWSwKKworCS8qIFRoaXMgbW9kZSBpcyBub3QgdmlzaWJsZSB0byB1c2Vycy4gSXQgaXMgdXNlZCB3aGVuCisJICogd2UgY2Fubm90IGZ1bGx5IGVuYWJsZSB2QVBJQyBhbmQgZmFsbGJhY2sgdG8gb25seSBzdXBwb3J0CisJICogbGVnYWN5IGludGVycnVwdCByZW1hcHBpbmcgdmlhIDEyOC1iaXQgSVJURS4KKwkgKi8KKwlBTURfSU9NTVVfR1VFU1RfSVJfTEVHQUNZX0dBLAorCUFNRF9JT01NVV9HVUVTVF9JUl9WQVBJQywKK307CisKKyNkZWZpbmUgQU1EX0lPTU1VX0dVRVNUX0lSX0dBKHgpCSh4ID09IEFNRF9JT01NVV9HVUVTVF9JUl9WQVBJQyB8fCBcCisJCQkJCSB4ID09IEFNRF9JT01NVV9HVUVTVF9JUl9MRUdBQ1lfR0EpCisKKyNkZWZpbmUgQU1EX0lPTU1VX0dVRVNUX0lSX1ZBUElDKHgpCSh4ID09IEFNRF9JT01NVV9HVUVTVF9JUl9WQVBJQykKKwordW5pb24gaXJ0ZSB7CisJdTMyIHZhbDsKKwlzdHJ1Y3QgeworCQl1MzIgdmFsaWQJOiAxLAorCQkgICAgbm9fZmF1bHQJOiAxLAorCQkgICAgaW50X3R5cGUJOiAzLAorCQkgICAgcnFfZW9pCTogMSwKKwkJICAgIGRtCQk6IDEsCisJCSAgICByc3ZkXzEJOiAxLAorCQkgICAgZGVzdGluYXRpb24JOiA4LAorCQkgICAgdmVjdG9yCTogOCwKKwkJICAgIHJzdmRfMgk6IDg7CisJfSBmaWVsZHM7Cit9OworCit1bmlvbiBpcnRlX2dhX2xvIHsKKwl1NjQgdmFsOworCisJLyogRm9yIGludCByZW1hcHBpbmcgKi8KKwlzdHJ1Y3QgeworCQl1NjQgdmFsaWQJOiAxLAorCQkgICAgbm9fZmF1bHQJOiAxLAorCQkgICAgLyogLS0tLS0tICovCisJCSAgICBpbnRfdHlwZQk6IDMsCisJCSAgICBycV9lb2kJOiAxLAorCQkgICAgZG0JCTogMSwKKwkJICAgIC8qIC0tLS0tLSAqLworCQkgICAgZ3Vlc3RfbW9kZQk6IDEsCisJCSAgICBkZXN0aW5hdGlvbgk6IDgsCisJCSAgICByc3ZkCTogNDg7CisJfSBmaWVsZHNfcmVtYXA7CisKKwkvKiBGb3IgZ3Vlc3QgdkFQSUMgKi8KKwlzdHJ1Y3QgeworCQl1NjQgdmFsaWQJOiAxLAorCQkgICAgbm9fZmF1bHQJOiAxLAorCQkgICAgLyogLS0tLS0tICovCisJCSAgICBnYV9sb2dfaW50cgk6IDEsCisJCSAgICByc3ZkMQk6IDMsCisJCSAgICBpc19ydW4JOiAxLAorCQkgICAgLyogLS0tLS0tICovCisJCSAgICBndWVzdF9tb2RlCTogMSwKKwkJICAgIGRlc3RpbmF0aW9uCTogOCwKKwkJICAgIHJzdmQyCTogMTYsCisJCSAgICBnYV90YWcJOiAzMjsKKwl9IGZpZWxkc192YXBpYzsKK307CisKK3VuaW9uIGlydGVfZ2FfaGkgeworCXU2NCB2YWw7CisJc3RydWN0IHsKKwkJdTY0IHZlY3Rvcgk6IDgsCisJCSAgICByc3ZkXzEJOiA0LAorCQkgICAgZ2Ffcm9vdF9wdHIJOiA0MCwKKwkJICAgIHJzdmRfMgk6IDEyOworCX0gZmllbGRzOworfTsKKworc3RydWN0IGlydGVfZ2EgeworCXVuaW9uIGlydGVfZ2FfbG8gbG87CisJdW5pb24gaXJ0ZV9nYV9oaSBoaTsKK307CisKK3N0cnVjdCBpcnFfMl9pcnRlIHsKKwl1MTYgZGV2aWQ7IC8qIERldmljZSBJRCBmb3IgSVJURSB0YWJsZSAqLworCXUxNiBpbmRleDsgLyogSW5kZXggaW50byBJUlRFIHRhYmxlKi8KK307CisKK3N0cnVjdCBhbWRfaXJfZGF0YSB7CisJdTMyIGNhY2hlZF9nYV90YWc7CisJc3RydWN0IGlycV8yX2lydGUgaXJxXzJfaXJ0ZTsKKwlzdHJ1Y3QgbXNpX21zZyBtc2lfZW50cnk7CisJdm9pZCAqZW50cnk7ICAgIC8qIFBvaW50ZXIgdG8gdW5pb24gaXJ0ZSBvciBzdHJ1Y3QgaXJ0ZV9nYSAqLworCXZvaWQgKnJlZjsgICAgICAvKiBQb2ludGVyIHRvIHRoZSBhY3R1YWwgaXJ0ZSAqLworfTsKKworc3RydWN0IGFtZF9pcnRlX29wcyB7CisJdm9pZCAoKnByZXBhcmUpKHZvaWQgKiwgdTMyLCB1MzIsIHU4LCB1MzIsIGludCk7CisJdm9pZCAoKmFjdGl2YXRlKSh2b2lkICosIHUxNiwgdTE2KTsKKwl2b2lkICgqZGVhY3RpdmF0ZSkodm9pZCAqLCB1MTYsIHUxNik7CisJdm9pZCAoKnNldF9hZmZpbml0eSkodm9pZCAqLCB1MTYsIHUxNiwgdTgsIHUzMik7CisJdm9pZCAqKCpnZXQpKHN0cnVjdCBpcnFfcmVtYXBfdGFibGUgKiwgaW50KTsKKwl2b2lkICgqc2V0X2FsbG9jYXRlZCkoc3RydWN0IGlycV9yZW1hcF90YWJsZSAqLCBpbnQpOworCWJvb2wgKCppc19hbGxvY2F0ZWQpKHN0cnVjdCBpcnFfcmVtYXBfdGFibGUgKiwgaW50KTsKKwl2b2lkICgqY2xlYXJfYWxsb2NhdGVkKShzdHJ1Y3QgaXJxX3JlbWFwX3RhYmxlICosIGludCk7Cit9OworCisjaWZkZWYgQ09ORklHX0lSUV9SRU1BUAorZXh0ZXJuIHN0cnVjdCBhbWRfaXJ0ZV9vcHMgaXJ0ZV8zMl9vcHM7CitleHRlcm4gc3RydWN0IGFtZF9pcnRlX29wcyBpcnRlXzEyOF9vcHM7CisjZW5kaWYKKwogI2VuZGlmIC8qIF9BU01fWDg2X0FNRF9JT01NVV9UWVBFU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2FybS1zbW11LXYzLmMgYi9kcml2ZXJzL2lvbW11L2FybS1zbW11LXYzLmMKaW5kZXggY2U4MDExNy4uNjQxZTg4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9hcm0tc21tdS12My5jCisrKyBiL2RyaXZlcnMvaW9tbXUvYXJtLXNtbXUtdjMuYwpAQCAtODc5LDcgKzg3OSw3IEBACiAJICogV2UgbWF5IGhhdmUgY29uY3VycmVudCBwcm9kdWNlcnMsIHNvIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bAogCSAqIG5vdCB0byB0b3VjaCBhbnkgb2YgdGhlIHNoYWRvdyBjbWRxIHN0YXRlLgogCSAqLwotCXF1ZXVlX3JlYWQoY21kLCBRX0VOVChxLCBpZHgpLCBxLT5lbnRfZHdvcmRzKTsKKwlxdWV1ZV9yZWFkKGNtZCwgUV9FTlQocSwgY29ucyksIHEtPmVudF9kd29yZHMpOwogCWRldl9lcnIoc21tdS0+ZGV2LCAic2tpcHBpbmcgY29tbWFuZCBpbiBlcnJvciBzdGF0ZTpcbiIpOwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNtZCk7ICsraSkKIAkJZGV2X2VycihzbW11LT5kZXYsICJcdDB4JTAxNmxseFxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyljbWRbaV0pOwpAQCAtODkwLDcgKzg5MCw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlxdWV1ZV93cml0ZShjbWQsIFFfRU5UKHEsIGlkeCksIHEtPmVudF9kd29yZHMpOworCXF1ZXVlX3dyaXRlKFFfRU5UKHEsIGNvbnMpLCBjbWQsIHEtPmVudF9kd29yZHMpOwogfQogCiBzdGF0aWMgdm9pZCBhcm1fc21tdV9jbWRxX2lzc3VlX2NtZChzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11LApAQCAtMTAzNCw2ICsxMDM0LDkgQEAKIAkJY2FzZSBTVFJUQUJfU1RFXzBfQ0ZHX1MyX1RSQU5TOgogCQkJc3RlX2xpdmUgPSB0cnVlOwogCQkJYnJlYWs7CisJCWNhc2UgU1RSVEFCX1NURV8wX0NGR19BQk9SVDoKKwkJCWlmIChkaXNhYmxlX2J5cGFzcykKKwkJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCUJVRygpOyAvKiBTVEUgY29ycnVwdGlvbiAqLwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2FybS1zbW11LmMgYi9kcml2ZXJzL2lvbW11L2FybS1zbW11LmMKaW5kZXggNGY0OWZlMi4uMmRiNzRlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9hcm0tc21tdS5jCisrKyBiL2RyaXZlcnMvaW9tbXUvYXJtLXNtbXUuYwpAQCAtNjg2LDggKzY4Niw3IEBACiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBhcm1fc21tdV9jb250ZXh0X2ZhdWx0KGludCBpcnEsIHZvaWQgKmRldikKIHsKLQlpbnQgZmxhZ3MsIHJldDsKLQl1MzIgZnNyLCBmc3luciwgcmVzdW1lOworCXUzMiBmc3IsIGZzeW5yOwogCXVuc2lnbmVkIGxvbmcgaW92YTsKIAlzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4gPSBkZXY7CiAJc3RydWN0IGFybV9zbW11X2RvbWFpbiAqc21tdV9kb21haW4gPSB0b19zbW11X2RvbWFpbihkb21haW4pOwpAQCAtNzAxLDM0ICs3MDAsMTUgQEAKIAlpZiAoIShmc3IgJiBGU1JfRkFVTFQpKQogCQlyZXR1cm4gSVJRX05PTkU7CiAKLQlpZiAoZnNyICYgRlNSX0lHTikKLQkJZGV2X2Vycl9yYXRlbGltaXRlZChzbW11LT5kZXYsCi0JCQkJICAgICJVbmV4cGVjdGVkIGNvbnRleHQgZmF1bHQgKGZzciAweCV4KVxuIiwKLQkJCQkgICAgZnNyKTsKLQogCWZzeW5yID0gcmVhZGxfcmVsYXhlZChjYl9iYXNlICsgQVJNX1NNTVVfQ0JfRlNZTlIwKTsKLQlmbGFncyA9IGZzeW5yICYgRlNZTlIwX1dOUiA/IElPTU1VX0ZBVUxUX1dSSVRFIDogSU9NTVVfRkFVTFRfUkVBRDsKLQogCWlvdmEgPSByZWFkcV9yZWxheGVkKGNiX2Jhc2UgKyBBUk1fU01NVV9DQl9GQVIpOwotCWlmICghcmVwb3J0X2lvbW11X2ZhdWx0KGRvbWFpbiwgc21tdS0+ZGV2LCBpb3ZhLCBmbGFncykpIHsKLQkJcmV0ID0gSVJRX0hBTkRMRUQ7Ci0JCXJlc3VtZSA9IFJFU1VNRV9SRVRSWTsKLQl9IGVsc2UgewotCQlkZXZfZXJyX3JhdGVsaW1pdGVkKHNtbXUtPmRldiwKLQkJICAgICJVbmhhbmRsZWQgY29udGV4dCBmYXVsdDogaW92YT0weCUwOGx4LCBmc3lucj0weCV4LCBjYj0lZFxuIiwKLQkJICAgIGlvdmEsIGZzeW5yLCBjZmctPmNibmR4KTsKLQkJcmV0ID0gSVJRX05PTkU7Ci0JCXJlc3VtZSA9IFJFU1VNRV9URVJNSU5BVEU7Ci0JfQogCi0JLyogQ2xlYXIgdGhlIGZhdWx0aW5nIEZTUiAqLworCWRldl9lcnJfcmF0ZWxpbWl0ZWQoc21tdS0+ZGV2LAorCSJVbmhhbmRsZWQgY29udGV4dCBmYXVsdDogZnNyPTB4JXgsIGlvdmE9MHglMDhseCwgZnN5bnI9MHgleCwgY2I9JWRcbiIsCisJCQkgICAgZnNyLCBpb3ZhLCBmc3luciwgY2ZnLT5jYm5keCk7CisKIAl3cml0ZWwoZnNyLCBjYl9iYXNlICsgQVJNX1NNTVVfQ0JfRlNSKTsKLQotCS8qIFJldHJ5IG9yIHRlcm1pbmF0ZSBhbnkgc3RhbGxlZCB0cmFuc2FjdGlvbnMgKi8KLQlpZiAoZnNyICYgRlNSX1NTKQotCQl3cml0ZWxfcmVsYXhlZChyZXN1bWUsIGNiX2Jhc2UgKyBBUk1fU01NVV9DQl9SRVNVTUUpOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBhcm1fc21tdV9nbG9iYWxfZmF1bHQoaW50IGlycSwgdm9pZCAqZGV2KQpAQCAtODM3LDcgKzgxNyw3IEBACiAJfQogCiAJLyogU0NUTFIgKi8KLQlyZWcgPSBTQ1RMUl9DRkNGRyB8IFNDVExSX0NGSUUgfCBTQ1RMUl9DRlJFIHwgU0NUTFJfTSB8IFNDVExSX0VBRV9TQk9QOworCXJlZyA9IFNDVExSX0NGSUUgfCBTQ1RMUl9DRlJFIHwgU0NUTFJfTSB8IFNDVExSX0VBRV9TQk9QOwogCWlmIChzdGFnZTEpCiAJCXJlZyB8PSBTQ1RMUl9TMV9BU0lEUE5FOwogI2lmZGVmIF9fQklHX0VORElBTgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9kbWEtaW9tbXUuYyBiL2RyaXZlcnMvaW9tbXUvZG1hLWlvbW11LmMKaW5kZXggMDhhMWUyZi4uMDBjOGEwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9kbWEtaW9tbXUuYworKysgYi9kcml2ZXJzL2lvbW11L2RtYS1pb21tdS5jCkBAIC02OCw3ICs2OCw4IEBACiAJaWYgKCFpb3ZhZCkKIAkJcmV0dXJuOwogCi0JcHV0X2lvdmFfZG9tYWluKGlvdmFkKTsKKwlpZiAoaW92YWQtPmdyYW51bGUpCisJCXB1dF9pb3ZhX2RvbWFpbihpb3ZhZCk7CiAJa2ZyZWUoaW92YWQpOwogCWRvbWFpbi0+aW92YV9jb29raWUgPSBOVUxMOwogfQpAQCAtMTUxLDEyICsxNTIsMTUgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaW92YSAqX19hbGxvY19pb3ZhKHN0cnVjdCBpb3ZhX2RvbWFpbiAqaW92YWQsIHNpemVfdCBzaXplLAorc3RhdGljIHN0cnVjdCBpb3ZhICpfX2FsbG9jX2lvdmEoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLCBzaXplX3Qgc2l6ZSwKIAkJZG1hX2FkZHJfdCBkbWFfbGltaXQpCiB7CisJc3RydWN0IGlvdmFfZG9tYWluICppb3ZhZCA9IGRvbWFpbi0+aW92YV9jb29raWU7CiAJdW5zaWduZWQgbG9uZyBzaGlmdCA9IGlvdmFfc2hpZnQoaW92YWQpOwogCXVuc2lnbmVkIGxvbmcgbGVuZ3RoID0gaW92YV9hbGlnbihpb3ZhZCwgc2l6ZSkgPj4gc2hpZnQ7CiAKKwlpZiAoZG9tYWluLT5nZW9tZXRyeS5mb3JjZV9hcGVydHVyZSkKKwkJZG1hX2xpbWl0ID0gbWluKGRtYV9saW1pdCwgZG9tYWluLT5nZW9tZXRyeS5hcGVydHVyZV9lbmQpOwogCS8qCiAJICogRW5mb3JjZSBzaXplLWFsaWdubWVudCB0byBiZSBzYWZlIC0gdGhlcmUgY291bGQgcGVyaGFwcyBiZSBhbgogCSAqIGF0dHJpYnV0ZSB0byBjb250cm9sIHRoaXMgcGVyLWRldmljZSwgb3IgYXQgbGVhc3QgcGVyLWRvbWFpbi4uLgpAQCAtMzE0LDcgKzMxOCw3IEBACiAJaWYgKCFwYWdlcykKIAkJcmV0dXJuIE5VTEw7CiAKLQlpb3ZhID0gX19hbGxvY19pb3ZhKGlvdmFkLCBzaXplLCBkZXYtPmNvaGVyZW50X2RtYV9tYXNrKTsKKwlpb3ZhID0gX19hbGxvY19pb3ZhKGRvbWFpbiwgc2l6ZSwgZGV2LT5jb2hlcmVudF9kbWFfbWFzayk7CiAJaWYgKCFpb3ZhKQogCQlnb3RvIG91dF9mcmVlX3BhZ2VzOwogCkBAIC0zODYsNyArMzkwLDcgQEAKIAlwaHlzX2FkZHJfdCBwaHlzID0gcGFnZV90b19waHlzKHBhZ2UpICsgb2Zmc2V0OwogCXNpemVfdCBpb3ZhX29mZiA9IGlvdmFfb2Zmc2V0KGlvdmFkLCBwaHlzKTsKIAlzaXplX3QgbGVuID0gaW92YV9hbGlnbihpb3ZhZCwgc2l6ZSArIGlvdmFfb2ZmKTsKLQlzdHJ1Y3QgaW92YSAqaW92YSA9IF9fYWxsb2NfaW92YShpb3ZhZCwgbGVuLCBkbWFfZ2V0X21hc2soZGV2KSk7CisJc3RydWN0IGlvdmEgKmlvdmEgPSBfX2FsbG9jX2lvdmEoZG9tYWluLCBsZW4sIGRtYV9nZXRfbWFzayhkZXYpKTsKIAogCWlmICghaW92YSkKIAkJcmV0dXJuIERNQV9FUlJPUl9DT0RFOwpAQCAtNTM4LDcgKzU0Miw3IEBACiAJCXByZXYgPSBzOwogCX0KIAotCWlvdmEgPSBfX2FsbG9jX2lvdmEoaW92YWQsIGlvdmFfbGVuLCBkbWFfZ2V0X21hc2soZGV2KSk7CisJaW92YSA9IF9fYWxsb2NfaW92YShkb21haW4sIGlvdmFfbGVuLCBkbWFfZ2V0X21hc2soZGV2KSk7CiAJaWYgKCFpb3ZhKQogCQlnb3RvIG91dF9yZXN0b3JlX3NnOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2lvLXBndGFibGUtYXJtLXY3cy5jIGIvZHJpdmVycy9pb21tdS9pby1wZ3RhYmxlLWFybS12N3MuYwppbmRleCA4YzYxMzk5Li5kZWY4Y2ExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lvbW11L2lvLXBndGFibGUtYXJtLXY3cy5jCisrKyBiL2RyaXZlcnMvaW9tbXUvaW8tcGd0YWJsZS1hcm0tdjdzLmMKQEAgLTI4NiwxMiArMjg2LDE0IEBACiAJaW50IHByb3QgPSBJT01NVV9SRUFEOwogCWFybV92N3NfaW9wdGUgYXR0ciA9IHB0ZSA+PiBBUk1fVjdTX0FUVFJfU0hJRlQobHZsKTsKIAotCWlmIChhdHRyICYgQVJNX1Y3U19QVEVfQVBfUkRPTkxZKQorCWlmICghKGF0dHIgJiBBUk1fVjdTX1BURV9BUF9SRE9OTFkpKQogCQlwcm90IHw9IElPTU1VX1dSSVRFOwogCWlmICgoYXR0ciAmIChBUk1fVjdTX1RFWF9NQVNLIDw8IEFSTV9WN1NfVEVYX1NISUZUKSkgPT0gMCkKIAkJcHJvdCB8PSBJT01NVV9NTUlPOwogCWVsc2UgaWYgKHB0ZSAmIEFSTV9WN1NfQVRUUl9DKQogCQlwcm90IHw9IElPTU1VX0NBQ0hFOworCWlmIChwdGUgJiBBUk1fVjdTX0FUVFJfWE4obHZsKSkKKwkJcHJvdCB8PSBJT01NVV9OT0VYRUM7CiAKIAlyZXR1cm4gcHJvdDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvbXRrX2lvbW11LmggYi9kcml2ZXJzL2lvbW11L210a19pb21tdS5oCmluZGV4IDllZDBhODQuLjNkYWIxM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW9tbXUvbXRrX2lvbW11LmgKKysrIGIvZHJpdmVycy9pb21tdS9tdGtfaW9tbXUuaApAQCAtNTUsMTkgKzU1LDE5IEBACiAJYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVfNEdCOwogfTsKIAotc3RhdGljIGludCBjb21wYXJlX29mKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbmxpbmUgaW50IGNvbXBhcmVfb2Yoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQogewogCXJldHVybiBkZXYtPm9mX25vZGUgPT0gZGF0YTsKIH0KIAotc3RhdGljIGludCBtdGtfaW9tbXVfYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW5saW5lIGludCBtdGtfaW9tbXVfYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG10a19pb21tdV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAlyZXR1cm4gY29tcG9uZW50X2JpbmRfYWxsKGRldiwgJmRhdGEtPnNtaV9pbXUpOwogfQogCi1zdGF0aWMgdm9pZCBtdGtfaW9tbXVfdW5iaW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdGtfaW9tbXVfdW5iaW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbXRrX2lvbW11X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9zMzkwLWlvbW11LmMgYi9kcml2ZXJzL2lvbW11L3MzOTAtaW9tbXUuYwppbmRleCBhMDRkNDkxLi4zYjQ0YjFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lvbW11L3MzOTAtaW9tbXUuYworKysgYi9kcml2ZXJzL2lvbW11L3MzOTAtaW9tbXUuYwpAQCAtMTAxLDggKzEwMSw3IEBACiAJCXpwY2lfZG1hX2V4aXRfZGV2aWNlKHpkZXYpOwogCiAJemRldi0+ZG1hX3RhYmxlID0gczM5MF9kb21haW4tPmRtYV90YWJsZTsKLQlyYyA9IHpwY2lfcmVnaXN0ZXJfaW9hdCh6ZGV2LCAwLCB6ZGV2LT5zdGFydF9kbWEgKyBQQUdFX09GRlNFVCwKLQkJCQl6ZGV2LT5zdGFydF9kbWEgKyB6ZGV2LT5pb21tdV9zaXplIC0gMSwKKwlyYyA9IHpwY2lfcmVnaXN0ZXJfaW9hdCh6ZGV2LCAwLCB6ZGV2LT5zdGFydF9kbWEsIHpkZXYtPmVuZF9kbWEsCiAJCQkJKHU2NCkgemRldi0+ZG1hX3RhYmxlKTsKIAlpZiAocmMpCiAJCWdvdG8gb3V0X3Jlc3RvcmU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvS2NvbmZpZyBiL2RyaXZlcnMvaXJxY2hpcC9LY29uZmlnCmluZGV4IDdmODcyODkuLjgyYjBiNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9LY29uZmlnCkBAIC0zOSw2ICszOSw3IEBACiAJYm9vbAogCWRlcGVuZHMgb24gUENJCiAJZGVwZW5kcyBvbiBQQ0lfTVNJCisJc2VsZWN0IEFDUElfSU9SVCBpZiBBQ1BJCiAKIGNvbmZpZyBBUk1fTlZJQwogCWJvb2wKQEAgLTE1Niw2ICsxNTcsMTMgQEAKIAlzZWxlY3QgR0VORVJJQ19JUlFfQ0hJUAogCXNlbGVjdCBJUlFfRE9NQUlOCiAKK2NvbmZpZyBKQ09SRV9BSUMKKwlib29sICJKLUNvcmUgaW50ZWdyYXRlZCBBSUMiCisJZGVwZW5kcyBvbiBPRiAmJiAoU1VQRVJIIHx8IENPTVBJTEVfVEVTVCkKKwlzZWxlY3QgSVJRX0RPTUFJTgorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIHRoZSBKLUNvcmUgaW50ZWdyYXRlZCBBSUMuCisKIGNvbmZpZyBSRU5FU0FTX0lOVENfSVJRUElOCiAJYm9vbAogCXNlbGVjdCBJUlFfRE9NQUlOCkBAIC0yNTEsNiArMjU5LDkgQEAKIGNvbmZpZyBNVkVCVV9PRE1JCiAJYm9vbAogCitjb25maWcgTVZFQlVfUElDCisJYm9vbAorCiBjb25maWcgTFNfU0NGR19NU0kKIAlkZWZfYm9vbCB5IGlmIFNPQ19MUzEwMjFBIHx8IEFSQ0hfTEFZRVJTQ0FQRQogCWRlcGVuZHMgb24gUENJICYmIFBDSV9NU0kKQEAgLTI2NCwzICsyNzUsNyBAQAogCXNlbGVjdCBJUlFfRE9NQUlOCiAJaGVscAogCSAgU3VwcG9ydCB0aGUgRVpjaGlwIE5QUzQwMCBnbG9iYWwgaW50ZXJydXB0IGNvbnRyb2xsZXIKKworY29uZmlnIFNUTTMyX0VYVEkKKwlib29sCisJc2VsZWN0IElSUV9ET01BSU4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9NYWtlZmlsZSBiL2RyaXZlcnMvaXJxY2hpcC9NYWtlZmlsZQppbmRleCA0YzIwM2I2Li5iMzcyZTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lycWNoaXAvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pcnFjaGlwL01ha2VmaWxlCkBAIC00MCw2ICs0MCw3IEBACiBvYmotJChDT05GSUdfSU1HUERDX0lSUSkJCSs9IGlycS1pbWdwZGMubwogb2JqLSQoQ09ORklHX0lSUV9NSVBTX0NQVSkJCSs9IGlycS1taXBzLWNwdS5vCiBvYmotJChDT05GSUdfU0lSRl9JUlEpCQkJKz0gaXJxLXNpcmZzb2Mubworb2JqLSQoQ09ORklHX0pDT1JFX0FJQykJCQkrPSBpcnEtamNvcmUtYWljLm8KIG9iai0kKENPTkZJR19SRU5FU0FTX0lOVENfSVJRUElOKQkrPSBpcnEtcmVuZXNhcy1pbnRjLWlycXBpbi5vCiBvYmotJChDT05GSUdfUkVORVNBU19JUlFDKQkJKz0gaXJxLXJlbmVzYXMtaXJxYy5vCiBvYmotJChDT05GSUdfVkVSU0FUSUxFX0ZQR0FfSVJRKQkrPSBpcnEtdmVyc2F0aWxlLWZwZ2EubwpAQCAtNjgsNiArNjksOCBAQAogb2JqLSQoQ09ORklHX0lNWF9HUENWMikJCQkrPSBpcnEtaW14LWdwY3YyLm8KIG9iai0kKENPTkZJR19QSUMzMl9FVklDKQkJKz0gaXJxLXBpYzMyLWV2aWMubwogb2JqLSQoQ09ORklHX01WRUJVX09ETUkpCQkrPSBpcnEtbXZlYnUtb2RtaS5vCitvYmotJChDT05GSUdfTVZFQlVfUElDKQkJCSs9IGlycS1tdmVidS1waWMubwogb2JqLSQoQ09ORklHX0xTX1NDRkdfTVNJKQkJKz0gaXJxLWxzLXNjZmctbXNpLm8KIG9iai0kKENPTkZJR19FWk5QU19HSUMpCQkJKz0gaXJxLWV6bnBzLm8KIG9iai0kKENPTkZJR19BUkNIX0FTUEVFRCkJCSs9IGlycS1hc3BlZWQtdmljLm8KK29iai0kKENPTkZJR19TVE0zMl9FWFRJKSAJCSs9IGlycS1zdG0zMi1leHRpLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtYXRtZWwtYWljLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWF0bWVsLWFpYy5jCmluZGV4IDExMmUxN2MuLjM3Zjk1MmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtYXRtZWwtYWljLmMKKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycS1hdG1lbC1haWMuYwpAQCAtMTc2LDYgKzE3Niw3IEBACiB7CiAJc3RydWN0IGlycV9kb21haW5fY2hpcF9nZW5lcmljICpkZ2MgPSBkLT5nYzsKIAlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBzbXI7CiAJaW50IGlkeDsKIAlpbnQgcmV0OwpAQCAtMTk0LDExICsxOTUsMTEgQEAKIAogCWdjID0gZGdjLT5nY1tpZHhdOwogCi0JaXJxX2djX2xvY2soZ2MpOworCWlycV9nY19sb2NrX2lycXNhdmUoZ2MsIGZsYWdzKTsKIAlzbXIgPSBpcnFfcmVnX3JlYWRsKGdjLCBBVDkxX0FJQ19TTVIoKm91dF9od2lycSkpOwogCWFpY19jb21tb25fc2V0X3ByaW9yaXR5KGludHNwZWNbMl0sICZzbXIpOwogCWlycV9yZWdfd3JpdGVsKGdjLCBzbXIsIEFUOTFfQUlDX1NNUigqb3V0X2h3aXJxKSk7Ci0JaXJxX2djX3VubG9jayhnYyk7CisJaXJxX2djX3VubG9ja19pcnFyZXN0b3JlKGdjLCBmbGFncyk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1hdG1lbC1haWM1LmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWF0bWVsLWFpYzUuYwppbmRleCA0ZjBkMDY4Li4yYTYyNGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lycWNoaXAvaXJxLWF0bWVsLWFpYzUuYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWF0bWVsLWFpYzUuYwpAQCAtMjU4LDYgKzI1OCw3IEBACiAJCQkJIHVuc2lnbmVkIGludCAqb3V0X3R5cGUpCiB7CiAJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmJnYyA9IGlycV9nZXRfZG9tYWluX2dlbmVyaWNfY2hpcChkLCAwKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIHNtcjsKIAlpbnQgcmV0OwogCkBAIC0yNjksMTIgKzI3MCwxMiBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlpcnFfZ2NfbG9jayhiZ2MpOworCWlycV9nY19sb2NrX2lycXNhdmUoYmdjLCBmbGFncyk7CiAJaXJxX3JlZ193cml0ZWwoYmdjLCAqb3V0X2h3aXJxLCBBVDkxX0FJQzVfU1NSKTsKIAlzbXIgPSBpcnFfcmVnX3JlYWRsKGJnYywgQVQ5MV9BSUM1X1NNUik7CiAJYWljX2NvbW1vbl9zZXRfcHJpb3JpdHkoaW50c3BlY1syXSwgJnNtcik7CiAJaXJxX3JlZ193cml0ZWwoYmdjLCBzbXIsIEFUOTFfQUlDNV9TTVIpOwotCWlycV9nY191bmxvY2soYmdjKTsKKwlpcnFfZ2NfdW5sb2NrX2lycXJlc3RvcmUoYmdjLCBmbGFncyk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1naWMtcG0uYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLXBtLmMKaW5kZXggNGNiZmZiYS4uZWNhZmQyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1naWMtcG0uYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy1wbS5jCkBAIC02NCw3ICs2NCw2IEBACiAKIHN0YXRpYyBpbnQgZ2ljX2dldF9jbG9ja3Moc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3QgZ2ljX2Nsa19kYXRhICpkYXRhKQogewotCXN0cnVjdCBjbGsgKmNsazsKIAl1bnNpZ25lZCBpbnQgaTsKIAlpbnQgcmV0OwogCkBAIC03NiwyOCArNzUsMTYgQEAKIAkJcmV0dXJuIHJldDsKIAogCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5udW1fY2xvY2tzOyBpKyspIHsKLQkJY2xrID0gb2ZfY2xrX2dldF9ieV9uYW1lKGRldi0+b2Zfbm9kZSwgZGF0YS0+Y2xvY2tzW2ldKTsKLQkJaWYgKElTX0VSUihjbGspKSB7Ci0JCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgY2xvY2sgJXNcbiIsCi0JCQkJZGF0YS0+Y2xvY2tzW2ldKTsKLQkJCXJldCA9IFBUUl9FUlIoY2xrKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQotCQlyZXQgPSBwbV9jbGtfYWRkX2NsayhkZXYsIGNsayk7CisJCXJldCA9IG9mX3BtX2Nsa19hZGRfY2xrKGRldiwgZGF0YS0+Y2xvY2tzW2ldKTsKIAkJaWYgKHJldCkgewotCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gYWRkIGNsb2NrIGF0IGluZGV4ICVkXG4iLCBpKTsKLQkJCWNsa19wdXQoY2xrKTsKLQkJCWdvdG8gZXJyb3I7CisJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBhZGQgY2xvY2sgJXNcbiIsCisJCQkJZGF0YS0+Y2xvY2tzW2ldKTsKKwkJCXBtX2Nsa19kZXN0cm95KGRldik7CisJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQogCiAJcmV0dXJuIDA7Ci0KLWVycm9yOgotCXBtX2Nsa19kZXN0cm95KGRldik7Ci0KLQlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGdpY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1naWMtdjMtaXRzLXBjaS1tc2kuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLXYzLWl0cy1wY2ktbXNpLmMKaW5kZXggYWVlNjBlZC4uYWVlMWM2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1naWMtdjMtaXRzLXBjaS1tc2kuYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy12My1pdHMtcGNpLW1zaS5jCkBAIC0xNSw2ICsxNSw3IEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvYWNwaV9pb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXNpLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KQEAgLTEwNiwzNCArMTA3LDkxIEBACiAJe30sCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBpdHNfcGNpX21zaV9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpdHNfcGNpX21zaV9pbml0X29uZShzdHJ1Y3QgZndub2RlX2hhbmRsZSAqaGFuZGxlLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBpcnFfZG9tYWluICpwYXJlbnQ7CisKKwlwYXJlbnQgPSBpcnFfZmluZF9tYXRjaGluZ19md25vZGUoaGFuZGxlLCBET01BSU5fQlVTX05FWFVTKTsKKwlpZiAoIXBhcmVudCB8fCAhbXNpX2dldF9kb21haW5faW5mbyhwYXJlbnQpKSB7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBsb2NhdGUgSVRTIGRvbWFpblxuIiwgbmFtZSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJaWYgKCFwY2lfbXNpX2NyZWF0ZV9pcnFfZG9tYWluKGhhbmRsZSwgJml0c19wY2lfbXNpX2RvbWFpbl9pbmZvLAorCQkJCSAgICAgICBwYXJlbnQpKSB7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBjcmVhdGUgUENJIGRvbWFpblxuIiwgbmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpdHNfcGNpX29mX21zaV9pbml0KHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKLQlzdHJ1Y3QgaXJxX2RvbWFpbiAqcGFyZW50OwogCiAJZm9yIChucCA9IG9mX2ZpbmRfbWF0Y2hpbmdfbm9kZShOVUxMLCBpdHNfZGV2aWNlX2lkKTsgbnA7CiAJICAgICBucCA9IG9mX2ZpbmRfbWF0Y2hpbmdfbm9kZShucCwgaXRzX2RldmljZV9pZCkpIHsKIAkJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJtc2ktY29udHJvbGxlciIpKQogCQkJY29udGludWU7CiAKLQkJcGFyZW50ID0gaXJxX2ZpbmRfbWF0Y2hpbmdfaG9zdChucCwgRE9NQUlOX0JVU19ORVhVUyk7Ci0JCWlmICghcGFyZW50IHx8ICFtc2lfZ2V0X2RvbWFpbl9pbmZvKHBhcmVudCkpIHsKLQkJCXByX2VycigiJXM6IHVuYWJsZSB0byBsb2NhdGUgSVRTIGRvbWFpblxuIiwKLQkJCSAgICAgICBucC0+ZnVsbF9uYW1lKTsKKwkJaWYgKGl0c19wY2lfbXNpX2luaXRfb25lKG9mX25vZGVfdG9fZndub2RlKG5wKSwgbnAtPmZ1bGxfbmFtZSkpCiAJCQljb250aW51ZTsKLQkJfQotCi0JCWlmICghcGNpX21zaV9jcmVhdGVfaXJxX2RvbWFpbihvZl9ub2RlX3RvX2Z3bm9kZShucCksCi0JCQkJCSAgICAgICAmaXRzX3BjaV9tc2lfZG9tYWluX2luZm8sCi0JCQkJCSAgICAgICBwYXJlbnQpKSB7Ci0JCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gY3JlYXRlIFBDSSBkb21haW5cbiIsCi0JCQkgICAgICAgbnAtPmZ1bGxfbmFtZSk7Ci0JCQljb250aW51ZTsKLQkJfQogCiAJCXByX2luZm8oIlBDSS9NU0k6ICVzIGRvbWFpbiBjcmVhdGVkXG4iLCBucC0+ZnVsbF9uYW1lKTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KKworI2lmZGVmIENPTkZJR19BQ1BJCisKK3N0YXRpYyBpbnQgX19pbml0CitpdHNfcGNpX21zaV9wYXJzZV9tYWR0KHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqaGVhZGVyLAorCQkgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJc3RydWN0IGFjcGlfbWFkdF9nZW5lcmljX3RyYW5zbGF0b3IgKml0c19lbnRyeTsKKwlzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZG9tX2hhbmRsZTsKKwljb25zdCBjaGFyICpub2RlX25hbWU7CisJaW50IGVyciA9IC1FTlhJTzsKKworCWl0c19lbnRyeSA9IChzdHJ1Y3QgYWNwaV9tYWR0X2dlbmVyaWNfdHJhbnNsYXRvciAqKWhlYWRlcjsKKwlub2RlX25hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIklUU0AweCVseCIsCisJCQkgICAgICAobG9uZylpdHNfZW50cnktPmJhc2VfYWRkcmVzcyk7CisJZG9tX2hhbmRsZSA9IGlvcnRfZmluZF9kb21haW5fdG9rZW4oaXRzX2VudHJ5LT50cmFuc2xhdGlvbl9pZCk7CisJaWYgKCFkb21faGFuZGxlKSB7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBsb2NhdGUgSVRTIGRvbWFpbiBoYW5kbGVcbiIsIG5vZGVfbmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IGl0c19wY2lfbXNpX2luaXRfb25lKGRvbV9oYW5kbGUsIG5vZGVfbmFtZSk7CisJaWYgKCFlcnIpCisJCXByX2luZm8oIlBDSS9NU0k6ICVzIGRvbWFpbiBjcmVhdGVkXG4iLCBub2RlX25hbWUpOworCitvdXQ6CisJa2ZyZWUobm9kZV9uYW1lKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpdHNfcGNpX2FjcGlfbXNpX2luaXQodm9pZCkKK3sKKwlhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX1RZUEVfR0VORVJJQ19UUkFOU0xBVE9SLAorCQkJICAgICAgaXRzX3BjaV9tc2lfcGFyc2VfbWFkdCwgMCk7CisJcmV0dXJuIDA7Cit9CisjZWxzZQorc3RhdGljIGludCBfX2luaXQgaXRzX3BjaV9hY3BpX21zaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgaXRzX3BjaV9tc2lfaW5pdCh2b2lkKQoreworCWl0c19wY2lfb2ZfbXNpX2luaXQoKTsKKwlpdHNfcGNpX2FjcGlfbXNpX2luaXQoKTsKKworCXJldHVybiAwOworfQogZWFybHlfaW5pdGNhbGwoaXRzX3BjaV9tc2lfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy12My1pdHMuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLXYzLWl0cy5jCmluZGV4IDdjZWFiYTguLjM1Yzg1MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLXYzLWl0cy5jCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLXYzLWl0cy5jCkBAIC0xNSwxMCArMTUsMTMgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpX2lvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tc2kuaD4KQEAgLTc1LDcgKzc4LDcgQEAKIAlyYXdfc3BpbmxvY2tfdAkJbG9jazsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWVudHJ5OwogCXZvaWQgX19pb21lbQkJKmJhc2U7Ci0JdW5zaWduZWQgbG9uZwkJcGh5c19iYXNlOworCXBoeXNfYWRkcl90CQlwaHlzX2Jhc2U7CiAJc3RydWN0IGl0c19jbWRfYmxvY2sJKmNtZF9iYXNlOwogCXN0cnVjdCBpdHNfY21kX2Jsb2NrCSpjbWRfd3JpdGU7CiAJc3RydWN0IGl0c19iYXNlcgl0YWJsZXNbR0lUU19CQVNFUl9OUl9SRUdTXTsKQEAgLTExNSw2ICsxMTgsNyBAQAogc3RhdGljIExJU1RfSEVBRChpdHNfbm9kZXMpOwogc3RhdGljIERFRklORV9TUElOTE9DSyhpdHNfbG9jayk7CiBzdGF0aWMgc3RydWN0IHJkaXN0cyAqZ2ljX3JkaXN0czsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2RvbWFpbiAqaXRzX3BhcmVudDsKIAogI2RlZmluZSBnaWNfZGF0YV9yZGlzdCgpCQkocmF3X2NwdV9wdHIoZ2ljX3JkaXN0cy0+cmRpc3QpKQogI2RlZmluZSBnaWNfZGF0YV9yZGlzdF9yZF9iYXNlKCkJKGdpY19kYXRhX3JkaXN0KCktPnJkX2Jhc2UpCkBAIC0xNDM3LDYgKzE0NDEsMTEgQEAKIAkJZndzcGVjLnBhcmFtWzBdID0gR0lDX0lSUV9UWVBFX0xQSTsKIAkJZndzcGVjLnBhcmFtWzFdID0gaHdpcnE7CiAJCWZ3c3BlYy5wYXJhbVsyXSA9IElSUV9UWVBFX0VER0VfUklTSU5HOworCX0gZWxzZSBpZiAoaXNfZndub2RlX2lycWNoaXAoZG9tYWluLT5wYXJlbnQtPmZ3bm9kZSkpIHsKKwkJZndzcGVjLmZ3bm9kZSA9IGRvbWFpbi0+cGFyZW50LT5md25vZGU7CisJCWZ3c3BlYy5wYXJhbV9jb3VudCA9IDI7CisJCWZ3c3BlYy5wYXJhbVswXSA9IGh3aXJxOworCQlmd3NwZWMucGFyYW1bMV0gPSBJUlFfVFlQRV9FREdFX1JJU0lORzsKIAl9IGVsc2UgewogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xNTQ1LDcgKzE1NTQsMTIgQEAKIAl1MzIgdmFsOwogCiAJdmFsID0gcmVhZGxfcmVsYXhlZChiYXNlICsgR0lUU19DVExSKTsKLQlpZiAodmFsICYgR0lUU19DVExSX1FVSUVTQ0VOVCkKKwkvKgorCSAqIEdJQyBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyB0aGUgSVRTIHRvIGJlIGJvdGgKKwkgKiBkaXNhYmxlZCBhbmQgcXVpZXNjZW50IGZvciB3cml0ZXMgdG8gR0lUU19CQVNFUjxuPiBvcgorCSAqIEdJVFNfQ0JBU0VSIHRvIG5vdCBoYXZlIFVOUFJFRElDVEFCTEUgcmVzdWx0cy4KKwkgKi8KKwlpZiAoKHZhbCAmIEdJVFNfQ1RMUl9RVUlFU0NFTlQpICYmICEodmFsICYgR0lUU19DVExSX0VOQUJMRSkpCiAJCXJldHVybiAwOwogCiAJLyogRGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiBhbGwgaW50ZXJydXB0cyB0byB0aGlzIElUUyAqLwpAQCAtMTYwOSw0NCArMTYyMyw1OSBAQAogCWdpY19lbmFibGVfcXVpcmtzKGlpZHIsIGl0c19xdWlya3MsIGl0cyk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGl0c19wcm9iZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCi0JCQkgICAgc3RydWN0IGlycV9kb21haW4gKnBhcmVudCkKK3N0YXRpYyBpbnQgaXRzX2luaXRfZG9tYWluKHN0cnVjdCBmd25vZGVfaGFuZGxlICpoYW5kbGUsIHN0cnVjdCBpdHNfbm9kZSAqaXRzKQogewotCXN0cnVjdCByZXNvdXJjZSByZXM7CisJc3RydWN0IGlycV9kb21haW4gKmlubmVyX2RvbWFpbjsKKwlzdHJ1Y3QgbXNpX2RvbWFpbl9pbmZvICppbmZvOworCisJaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlubmVyX2RvbWFpbiA9IGlycV9kb21haW5fY3JlYXRlX3RyZWUoaGFuZGxlLCAmaXRzX2RvbWFpbl9vcHMsIGl0cyk7CisJaWYgKCFpbm5lcl9kb21haW4pIHsKKwkJa2ZyZWUoaW5mbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlubmVyX2RvbWFpbi0+cGFyZW50ID0gaXRzX3BhcmVudDsKKwlpbm5lcl9kb21haW4tPmJ1c190b2tlbiA9IERPTUFJTl9CVVNfTkVYVVM7CisJaW5mby0+b3BzID0gJml0c19tc2lfZG9tYWluX29wczsKKwlpbmZvLT5kYXRhID0gaXRzOworCWlubmVyX2RvbWFpbi0+aG9zdF9kYXRhID0gaW5mbzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpdHNfcHJvYmVfb25lKHN0cnVjdCByZXNvdXJjZSAqcmVzLAorCQkJCXN0cnVjdCBmd25vZGVfaGFuZGxlICpoYW5kbGUsIGludCBudW1hX25vZGUpCit7CiAJc3RydWN0IGl0c19ub2RlICppdHM7CiAJdm9pZCBfX2lvbWVtICppdHNfYmFzZTsKLQlzdHJ1Y3QgaXJxX2RvbWFpbiAqaW5uZXJfZG9tYWluOwogCXUzMiB2YWw7CiAJdTY0IGJhc2VyLCB0bXA7CiAJaW50IGVycjsKIAotCWVyciA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uobm9kZSwgMCwgJnJlcyk7Ci0JaWYgKGVycikgewotCQlwcl93YXJuKCIlczogbm8gcmVncz9cbiIsIG5vZGUtPmZ1bGxfbmFtZSk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0JaXRzX2Jhc2UgPSBpb3JlbWFwKHJlcy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcmVzKSk7CisJaXRzX2Jhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CiAJaWYgKCFpdHNfYmFzZSkgewotCQlwcl93YXJuKCIlczogdW5hYmxlIHRvIG1hcCByZWdpc3RlcnNcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CisJCXByX3dhcm4oIklUU0AlcGE6IFVuYWJsZSB0byBtYXAgSVRTIHJlZ2lzdGVyc1xuIiwgJnJlcy0+c3RhcnQpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAl2YWwgPSByZWFkbF9yZWxheGVkKGl0c19iYXNlICsgR0lUU19QSURSMikgJiBHSUNfUElEUjJfQVJDSF9NQVNLOwogCWlmICh2YWwgIT0gMHgzMCAmJiB2YWwgIT0gMHg0MCkgewotCQlwcl93YXJuKCIlczogbm8gSVRTIGRldGVjdGVkLCBnaXZpbmcgdXBcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CisJCXByX3dhcm4oIklUU0AlcGE6IE5vIElUUyBkZXRlY3RlZCwgZ2l2aW5nIHVwXG4iLCAmcmVzLT5zdGFydCk7CiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gb3V0X3VubWFwOwogCX0KIAogCWVyciA9IGl0c19mb3JjZV9xdWllc2NlbnQoaXRzX2Jhc2UpOwogCWlmIChlcnIpIHsKLQkJcHJfd2FybigiJXM6IGZhaWxlZCB0byBxdWllc2NlLCBnaXZpbmcgdXBcbiIsCi0JCQlub2RlLT5mdWxsX25hbWUpOworCQlwcl93YXJuKCJJVFNAJXBhOiBGYWlsZWQgdG8gcXVpZXNjZSwgZ2l2aW5nIHVwXG4iLCAmcmVzLT5zdGFydCk7CiAJCWdvdG8gb3V0X3VubWFwOwogCX0KIAotCXByX2luZm8oIklUUzogJXNcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CisJcHJfaW5mbygiSVRTICVwUlxuIiwgcmVzKTsKIAogCWl0cyA9IGt6YWxsb2Moc2l6ZW9mKCppdHMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWl0cykgewpAQCAtMTY1OCw5ICsxNjg3LDkgQEAKIAlJTklUX0xJU1RfSEVBRCgmaXRzLT5lbnRyeSk7CiAJSU5JVF9MSVNUX0hFQUQoJml0cy0+aXRzX2RldmljZV9saXN0KTsKIAlpdHMtPmJhc2UgPSBpdHNfYmFzZTsKLQlpdHMtPnBoeXNfYmFzZSA9IHJlcy5zdGFydDsKKwlpdHMtPnBoeXNfYmFzZSA9IHJlcy0+c3RhcnQ7CiAJaXRzLT5pdGVfc2l6ZSA9ICgocmVhZGxfcmVsYXhlZChpdHNfYmFzZSArIEdJVFNfVFlQRVIpID4+IDQpICYgMHhmKSArIDE7Ci0JaXRzLT5udW1hX25vZGUgPSBvZl9ub2RlX3RvX25pZChub2RlKTsKKwlpdHMtPm51bWFfbm9kZSA9IG51bWFfbm9kZTsKIAogCWl0cy0+Y21kX2Jhc2UgPSBremFsbG9jKElUU19DTURfUVVFVUVfU1osIEdGUF9LRVJORUwpOwogCWlmICghaXRzLT5jbWRfYmFzZSkgewpAQCAtMTcwNywyOCArMTczNiw5IEBACiAJd3JpdGVxX3JlbGF4ZWQoMCwgaXRzLT5iYXNlICsgR0lUU19DV1JJVEVSKTsKIAl3cml0ZWxfcmVsYXhlZChHSVRTX0NUTFJfRU5BQkxFLCBpdHMtPmJhc2UgKyBHSVRTX0NUTFIpOwogCi0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChub2RlLCAibXNpLWNvbnRyb2xsZXIiKSkgewotCQlzdHJ1Y3QgbXNpX2RvbWFpbl9pbmZvICppbmZvOwotCi0JCWluZm8gPSBremFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOwotCQlpZiAoIWluZm8pIHsKLQkJCWVyciA9IC1FTk9NRU07Ci0JCQlnb3RvIG91dF9mcmVlX3RhYmxlczsKLQkJfQotCi0JCWlubmVyX2RvbWFpbiA9IGlycV9kb21haW5fYWRkX3RyZWUobm9kZSwgJml0c19kb21haW5fb3BzLCBpdHMpOwotCQlpZiAoIWlubmVyX2RvbWFpbikgewotCQkJZXJyID0gLUVOT01FTTsKLQkJCWtmcmVlKGluZm8pOwotCQkJZ290byBvdXRfZnJlZV90YWJsZXM7Ci0JCX0KLQotCQlpbm5lcl9kb21haW4tPnBhcmVudCA9IHBhcmVudDsKLQkJaW5uZXJfZG9tYWluLT5idXNfdG9rZW4gPSBET01BSU5fQlVTX05FWFVTOwotCQlpbmZvLT5vcHMgPSAmaXRzX21zaV9kb21haW5fb3BzOwotCQlpbmZvLT5kYXRhID0gaXRzOwotCQlpbm5lcl9kb21haW4tPmhvc3RfZGF0YSA9IGluZm87Ci0JfQorCWVyciA9IGl0c19pbml0X2RvbWFpbihoYW5kbGUsIGl0cyk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV90YWJsZXM7CiAKIAlzcGluX2xvY2soJml0c19sb2NrKTsKIAlsaXN0X2FkZCgmaXRzLT5lbnRyeSwgJml0c19ub2Rlcyk7CkBAIC0xNzQ0LDcgKzE3NTQsNyBAQAogCWtmcmVlKGl0cyk7CiBvdXRfdW5tYXA6CiAJaW91bm1hcChpdHNfYmFzZSk7Ci0JcHJfZXJyKCJJVFM6IGZhaWxlZCBwcm9iaW5nICVzICglZClcbiIsIG5vZGUtPmZ1bGxfbmFtZSwgZXJyKTsKKwlwcl9lcnIoIklUU0AlcGE6IGZhaWxlZCBwcm9iaW5nICglZClcbiIsICZyZXMtPnN0YXJ0LCBlcnIpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTE3NzIsMTUgKzE3ODIsOTEgQEAKIAl7fSwKIH07CiAKLWludCBfX2luaXQgaXRzX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlLCBzdHJ1Y3QgcmRpc3RzICpyZGlzdHMsCi0JICAgICBzdHJ1Y3QgaXJxX2RvbWFpbiAqcGFyZW50X2RvbWFpbikKK3N0YXRpYyBpbnQgX19pbml0IGl0c19vZl9wcm9iZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzOwogCiAJZm9yIChucCA9IG9mX2ZpbmRfbWF0Y2hpbmdfbm9kZShub2RlLCBpdHNfZGV2aWNlX2lkKTsgbnA7CiAJICAgICBucCA9IG9mX2ZpbmRfbWF0Y2hpbmdfbm9kZShucCwgaXRzX2RldmljZV9pZCkpIHsKLQkJaXRzX3Byb2JlKG5wLCBwYXJlbnRfZG9tYWluKTsKKwkJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJtc2ktY29udHJvbGxlciIpKSB7CisJCQlwcl93YXJuKCIlczogbm8gbXNpLWNvbnRyb2xsZXIgcHJvcGVydHksIElUUyBpZ25vcmVkXG4iLAorCQkJCW5wLT5mdWxsX25hbWUpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJlcykpIHsKKwkJCXByX3dhcm4oIiVzOiBubyByZWdzP1xuIiwgbnAtPmZ1bGxfbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWl0c19wcm9iZV9vbmUoJnJlcywgJm5wLT5md25vZGUsIG9mX25vZGVfdG9fbmlkKG5wKSk7CiAJfQorCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0FDUEkKKworI2RlZmluZSBBQ1BJX0dJQ1YzX0lUU19NRU1fU0laRSAoU1pfMTI4SykKKworc3RhdGljIGludCBfX2luaXQgZ2ljX2FjcGlfcGFyc2VfbWFkdF9pdHMoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICpoZWFkZXIsCisJCQkJCSAgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJc3RydWN0IGFjcGlfbWFkdF9nZW5lcmljX3RyYW5zbGF0b3IgKml0c19lbnRyeTsKKwlzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZG9tX2hhbmRsZTsKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzOworCWludCBlcnI7CisKKwlpdHNfZW50cnkgPSAoc3RydWN0IGFjcGlfbWFkdF9nZW5lcmljX3RyYW5zbGF0b3IgKiloZWFkZXI7CisJbWVtc2V0KCZyZXMsIDAsIHNpemVvZihyZXMpKTsKKwlyZXMuc3RhcnQgPSBpdHNfZW50cnktPmJhc2VfYWRkcmVzczsKKwlyZXMuZW5kID0gaXRzX2VudHJ5LT5iYXNlX2FkZHJlc3MgKyBBQ1BJX0dJQ1YzX0lUU19NRU1fU0laRSAtIDE7CisJcmVzLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CisKKwlkb21faGFuZGxlID0gaXJxX2RvbWFpbl9hbGxvY19md25vZGUoKHZvaWQgKilpdHNfZW50cnktPmJhc2VfYWRkcmVzcyk7CisJaWYgKCFkb21faGFuZGxlKSB7CisJCXByX2VycigiSVRTQCVwYTogVW5hYmxlIHRvIGFsbG9jYXRlIEdJQ3YzIElUUyBkb21haW4gdG9rZW5cbiIsCisJCSAgICAgICAmcmVzLnN0YXJ0KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZXJyID0gaW9ydF9yZWdpc3Rlcl9kb21haW5fdG9rZW4oaXRzX2VudHJ5LT50cmFuc2xhdGlvbl9pZCwgZG9tX2hhbmRsZSk7CisJaWYgKGVycikgeworCQlwcl9lcnIoIklUU0AlcGE6IFVuYWJsZSB0byByZWdpc3RlciBHSUN2MyBJVFMgZG9tYWluIHRva2VuIChJVFMgSUQgJWQpIHRvIElPUlRcbiIsCisJCSAgICAgICAmcmVzLnN0YXJ0LCBpdHNfZW50cnktPnRyYW5zbGF0aW9uX2lkKTsKKwkJZ290byBkb21fZXJyOworCX0KKworCWVyciA9IGl0c19wcm9iZV9vbmUoJnJlcywgZG9tX2hhbmRsZSwgTlVNQV9OT19OT0RFKTsKKwlpZiAoIWVycikKKwkJcmV0dXJuIDA7CisKKwlpb3J0X2RlcmVnaXN0ZXJfZG9tYWluX3Rva2VuKGl0c19lbnRyeS0+dHJhbnNsYXRpb25faWQpOworZG9tX2VycjoKKwlpcnFfZG9tYWluX2ZyZWVfZndub2RlKGRvbV9oYW5kbGUpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpdHNfYWNwaV9wcm9iZSh2b2lkKQoreworCWFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfVFlQRV9HRU5FUklDX1RSQU5TTEFUT1IsCisJCQkgICAgICBnaWNfYWNwaV9wYXJzZV9tYWR0X2l0cywgMCk7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgX19pbml0IGl0c19hY3BpX3Byb2JlKHZvaWQpIHsgfQorI2VuZGlmCisKK2ludCBfX2luaXQgaXRzX2luaXQoc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmhhbmRsZSwgc3RydWN0IHJkaXN0cyAqcmRpc3RzLAorCQkgICAgc3RydWN0IGlycV9kb21haW4gKnBhcmVudF9kb21haW4pCit7CisJc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlOworCisJaXRzX3BhcmVudCA9IHBhcmVudF9kb21haW47CisJb2Zfbm9kZSA9IHRvX29mX25vZGUoaGFuZGxlKTsKKwlpZiAob2Zfbm9kZSkKKwkJaXRzX29mX3Byb2JlKG9mX25vZGUpOworCWVsc2UKKwkJaXRzX2FjcGlfcHJvYmUoKTsKIAogCWlmIChsaXN0X2VtcHR5KCZpdHNfbm9kZXMpKSB7CiAJCXByX3dhcm4oIklUUzogTm8gSVRTIGF2YWlsYWJsZSwgbm90IGVuYWJsaW5nIExQSXNcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1naWMtdjMuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLXYzLmMKaW5kZXggNmZjNTZjMy4uOWI4MWJkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1naWMtdjMuYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy12My5jCkBAIC00OTUsNiArNDk1LDE0IEBACiAJLyogU2V0IHByaW9yaXR5IG1hc2sgcmVnaXN0ZXIgKi8KIAlnaWNfd3JpdGVfcG1yKERFRkFVTFRfUE1SX1ZBTFVFKTsKIAorCS8qCisJICogU29tZSBmaXJtd2FyZXMgaGFuZCBvdmVyIHRvIHRoZSBrZXJuZWwgd2l0aCB0aGUgQlBSIGNoYW5nZWQgZnJvbQorCSAqIGl0cyByZXNldCB2YWx1ZSAoYW5kIHdpdGggYSB2YWx1ZSBsYXJnZSBlbm91Z2ggdG8gcHJldmVudAorCSAqIGFueSBwcmUtZW1wdGl2ZSBpbnRlcnJ1cHRzIGZyb20gd29ya2luZyBhdCBhbGwpLiBXcml0aW5nIGEgemVybworCSAqIHRvIEJQUiByZXN0b3JlcyBpcyByZXNldCB2YWx1ZS4KKwkgKi8KKwlnaWNfd3JpdGVfYnByMSgwKTsKKwogCWlmIChzdGF0aWNfa2V5X3RydWUoJnN1cHBvcnRzX2RlYWN0aXZhdGUpKSB7CiAJCS8qIEVPSSBkcm9wcyBwcmlvcml0eSBvbmx5IChtb2RlIDEpICovCiAJCWdpY193cml0ZV9jdGxyKElDQ19DVExSX0VMMV9FT0ltb2RlX2Ryb3ApOwpAQCAtNTQ4LDcgKzU1Niw3IEBACiBzdGF0aWMgdTE2IGdpY19jb21wdXRlX3RhcmdldF9saXN0KGludCAqYmFzZV9jcHUsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrLAogCQkJCSAgIHVuc2lnbmVkIGxvbmcgY2x1c3Rlcl9pZCkKIHsKLQlpbnQgY3B1ID0gKmJhc2VfY3B1OworCWludCBuZXh0X2NwdSwgY3B1ID0gKmJhc2VfY3B1OwogCXVuc2lnbmVkIGxvbmcgbXBpZHIgPSBjcHVfbG9naWNhbF9tYXAoY3B1KTsKIAl1MTYgdGxpc3QgPSAwOwogCkBAIC01NjIsOSArNTcwLDEwIEBACiAKIAkJdGxpc3QgfD0gMSA8PCAobXBpZHIgJiAweGYpOwogCi0JCWNwdSA9IGNwdW1hc2tfbmV4dChjcHUsIG1hc2spOwotCQlpZiAoY3B1ID49IG5yX2NwdV9pZHMpCisJCW5leHRfY3B1ID0gY3B1bWFza19uZXh0KGNwdSwgbWFzayk7CisJCWlmIChuZXh0X2NwdSA+PSBucl9jcHVfaWRzKQogCQkJZ290byBvdXQ7CisJCWNwdSA9IG5leHRfY3B1OwogCiAJCW1waWRyID0gY3B1X2xvZ2ljYWxfbWFwKGNwdSk7CiAKQEAgLTY2NywxMyArNjc2LDIwIEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19DUFVfUE0KKy8qIENoZWNrIHdoZXRoZXIgaXQncyBzaW5nbGUgc2VjdXJpdHkgc3RhdGUgdmlldyAqLworc3RhdGljIGJvb2wgZ2ljX2Rpc3Rfc2VjdXJpdHlfZGlzYWJsZWQodm9pZCkKK3sKKwlyZXR1cm4gcmVhZGxfcmVsYXhlZChnaWNfZGF0YS5kaXN0X2Jhc2UgKyBHSUNEX0NUTFIpICYgR0lDRF9DVExSX0RTOworfQorCiBzdGF0aWMgaW50IGdpY19jcHVfcG1fbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgY21kLCB2b2lkICp2KQogewogCWlmIChjbWQgPT0gQ1BVX1BNX0VYSVQpIHsKLQkJZ2ljX2VuYWJsZV9yZWRpc3QodHJ1ZSk7CisJCWlmIChnaWNfZGlzdF9zZWN1cml0eV9kaXNhYmxlZCgpKQorCQkJZ2ljX2VuYWJsZV9yZWRpc3QodHJ1ZSk7CiAJCWdpY19jcHVfc3lzX3JlZ19pbml0KCk7Ci0JfSBlbHNlIGlmIChjbWQgPT0gQ1BVX1BNX0VOVEVSKSB7CisJfSBlbHNlIGlmIChjbWQgPT0gQ1BVX1BNX0VOVEVSICYmIGdpY19kaXN0X3NlY3VyaXR5X2Rpc2FibGVkKCkpIHsKIAkJZ2ljX3dyaXRlX2dycGVuMSgwKTsKIAkJZ2ljX2VuYWJsZV9yZWRpc3QoZmFsc2UpOwogCX0KQEAgLTkwMyw3ICs5MTksNiBAQAogCQkJCSB1NjQgcmVkaXN0X3N0cmlkZSwKIAkJCQkgc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmhhbmRsZSkKIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CiAJdTMyIHR5cGVyOwogCWludCBnaWNfaXJxczsKIAlpbnQgZXJyOwpAQCAtOTQ0LDEwICs5NTksOCBAQAogCiAJc2V0X2hhbmRsZV9pcnEoZ2ljX2hhbmRsZV9pcnEpOwogCi0Jbm9kZSA9IHRvX29mX25vZGUoaGFuZGxlKTsKLQlpZiAoSVNfRU5BQkxFRChDT05GSUdfQVJNX0dJQ19WM19JVFMpICYmIGdpY19kaXN0X3N1cHBvcnRzX2xwaXMoKSAmJgotCSAgICBub2RlKSAvKiBUZW1wIGhhY2sgdG8gcHJldmVudCBJVFMgaW5pdCBmb3IgQUNQSSAqLwotCQlpdHNfaW5pdChub2RlLCAmZ2ljX2RhdGEucmRpc3RzLCBnaWNfZGF0YS5kb21haW4pOworCWlmIChJU19FTkFCTEVEKENPTkZJR19BUk1fR0lDX1YzX0lUUykgJiYgZ2ljX2Rpc3Rfc3VwcG9ydHNfbHBpcygpKQorCQlpdHNfaW5pdChoYW5kbGUsICZnaWNfZGF0YS5yZGlzdHMsIGdpY19kYXRhLmRvbWFpbik7CiAKIAlnaWNfc21wX2luaXQoKTsKIAlnaWNfZGlzdF9pbml0KCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS1naWMuYwppbmRleCBjMmNhYjU3Li41OGU1YjRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy5jCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLmMKQEAgLTkxLDcgKzkxLDI3IEBACiAjZW5kaWYKIH07CiAKLXN0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKGlycV9jb250cm9sbGVyX2xvY2spOworI2lmZGVmIENPTkZJR19CTF9TV0lUQ0hFUgorCitzdGF0aWMgREVGSU5FX1JBV19TUElOTE9DSyhjcHVfbWFwX2xvY2spOworCisjZGVmaW5lIGdpY19sb2NrX2lycXNhdmUoZikJCVwKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmNwdV9tYXBfbG9jaywgKGYpKQorI2RlZmluZSBnaWNfdW5sb2NrX2lycXJlc3RvcmUoZikJXAorCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcHVfbWFwX2xvY2ssIChmKSkKKworI2RlZmluZSBnaWNfbG9jaygpCQkJcmF3X3NwaW5fbG9jaygmY3B1X21hcF9sb2NrKQorI2RlZmluZSBnaWNfdW5sb2NrKCkJCQlyYXdfc3Bpbl91bmxvY2soJmNwdV9tYXBfbG9jaykKKworI2Vsc2UKKworI2RlZmluZSBnaWNfbG9ja19pcnFzYXZlKGYpCQlkbyB7ICh2b2lkKShmKTsgfSB3aGlsZSgwKQorI2RlZmluZSBnaWNfdW5sb2NrX2lycXJlc3RvcmUoZikJZG8geyAodm9pZCkoZik7IH0gd2hpbGUoMCkKKworI2RlZmluZSBnaWNfbG9jaygpCQkJZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIGdpY191bmxvY2soKQkJCWRvIHsgfSB3aGlsZSgwKQorCisjZW5kaWYKIAogLyoKICAqIFRoZSBHSUMgbWFwcGluZyBvZiBDUFUgaW50ZXJmYWNlcyBkb2VzIG5vdCBuZWNlc3NhcmlseSBtYXRjaApAQCAtMzE3LDEyICszMzcsMTIgQEAKIAlpZiAoY3B1ID49IE5SX0dJQ19DUFVfSUYgfHwgY3B1ID49IG5yX2NwdV9pZHMpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZpcnFfY29udHJvbGxlcl9sb2NrLCBmbGFncyk7CisJZ2ljX2xvY2tfaXJxc2F2ZShmbGFncyk7CiAJbWFzayA9IDB4ZmYgPDwgc2hpZnQ7CiAJYml0ID0gZ2ljX2NwdV9tYXBbY3B1XSA8PCBzaGlmdDsKIAl2YWwgPSByZWFkbF9yZWxheGVkKHJlZykgJiB+bWFzazsKIAl3cml0ZWxfcmVsYXhlZCh2YWwgfCBiaXQsIHJlZyk7Ci0JcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9jb250cm9sbGVyX2xvY2ssIGZsYWdzKTsKKwlnaWNfdW5sb2NrX2lycXJlc3RvcmUoZmxhZ3MpOwogCiAJcmV0dXJuIElSUV9TRVRfTUFTS19PS19ET05FOwogfQpAQCAtMzc0LDkgKzM5NCw3IEBACiAKIAljaGFpbmVkX2lycV9lbnRlcihjaGlwLCBkZXNjKTsKIAotCXJhd19zcGluX2xvY2soJmlycV9jb250cm9sbGVyX2xvY2spOwogCXN0YXR1cyA9IHJlYWRsX3JlbGF4ZWQoZ2ljX2RhdGFfY3B1X2Jhc2UoY2hpcF9kYXRhKSArIEdJQ19DUFVfSU5UQUNLKTsKLQlyYXdfc3Bpbl91bmxvY2soJmlycV9jb250cm9sbGVyX2xvY2spOwogCiAJZ2ljX2lycSA9IChzdGF0dXMgJiBHSUNDX0lBUl9JTlRfSURfTUFTSyk7CiAJaWYgKGdpY19pcnEgPT0gR0lDQ19JTlRfU1BVUklPVVMpCkBAIC03NjksNyArNzg3LDE0IEBACiAJaW50IGNwdTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBtYXAgPSAwOwogCi0JcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZpcnFfY29udHJvbGxlcl9sb2NrLCBmbGFncyk7CisJaWYgKHVubGlrZWx5KG5yX2NwdV9pZHMgPT0gMSkpIHsKKwkJLyogT25seSBvbmUgQ1BVPyBsZXQncyBkbyBhIHNlbGYtSVBJLi4uICovCisJCXdyaXRlbF9yZWxheGVkKDIgPDwgMjQgfCBpcnEsCisJCQkgICAgICAgZ2ljX2RhdGFfZGlzdF9iYXNlKCZnaWNfZGF0YVswXSkgKyBHSUNfRElTVF9TT0ZUSU5UKTsKKwkJcmV0dXJuOworCX0KKworCWdpY19sb2NrX2lycXNhdmUoZmxhZ3MpOwogCiAJLyogQ29udmVydCBvdXIgbG9naWNhbCBDUFUgbWFzayBpbnRvIGEgcGh5c2ljYWwgb25lLiAqLwogCWZvcl9lYWNoX2NwdShjcHUsIG1hc2spCkBAIC03ODQsNyArODA5LDcgQEAKIAkvKiB0aGlzIGFsd2F5cyBoYXBwZW5zIG9uIEdJQzAgKi8KIAl3cml0ZWxfcmVsYXhlZChtYXAgPDwgMTYgfCBpcnEsIGdpY19kYXRhX2Rpc3RfYmFzZSgmZ2ljX2RhdGFbMF0pICsgR0lDX0RJU1RfU09GVElOVCk7CiAKLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2NvbnRyb2xsZXJfbG9jaywgZmxhZ3MpOworCWdpY191bmxvY2tfaXJxcmVzdG9yZShmbGFncyk7CiB9CiAjZW5kaWYKIApAQCAtODUyLDcgKzg3Nyw3IEBACiAJY3VyX3RhcmdldF9tYXNrID0gMHgwMTAxMDEwMSA8PCBjdXJfY3B1X2lkOwogCXJvcl92YWwgPSAoY3VyX2NwdV9pZCAtIG5ld19jcHVfaWQpICYgMzE7CiAKLQlyYXdfc3Bpbl9sb2NrKCZpcnFfY29udHJvbGxlcl9sb2NrKTsKKwlnaWNfbG9jaygpOwogCiAJLyogVXBkYXRlIHRoZSB0YXJnZXQgaW50ZXJmYWNlIGZvciB0aGlzIGxvZ2ljYWwgQ1BVICovCiAJZ2ljX2NwdV9tYXBbY3B1XSA9IDEgPDwgbmV3X2NwdV9pZDsKQEAgLTg3Miw3ICs4OTcsNyBAQAogCQl9CiAJfQogCi0JcmF3X3NwaW5fdW5sb2NrKCZpcnFfY29udHJvbGxlcl9sb2NrKTsKKwlnaWNfdW5sb2NrKCk7CiAKIAkvKgogCSAqIE5vdyBsZXQncyBtaWdyYXRlIGFuZCBjbGVhciBhbnkgcG90ZW50aWFsIFNHSXMgdGhhdCBtaWdodCBiZQpAQCAtOTE0LDcgKzkzOSw3IEBACiAJcmV0dXJuIGdpY19kaXN0X3BoeXNhZGRyICsgR0lDX0RJU1RfU09GVElOVDsKIH0KIAotdm9pZCBfX2luaXQgZ2ljX2luaXRfcGh5c2FkZHIoc3RydWN0IGRldmljZV9ub2RlICpub2RlKQorc3RhdGljIHZvaWQgX19pbml0IGdpY19pbml0X3BoeXNhZGRyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgcmVzOwogCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5vZGUsIDAsICZyZXMpID09IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtamNvcmUtYWljLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWpjb3JlLWFpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YjAxZGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWpjb3JlLWFpYy5jCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBKLUNvcmUgU29DIEFJQyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBTbWFydCBFbmVyZ3kgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFjaGlwLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisKKyNkZWZpbmUgSkNPUkVfQUlDX01BWF9IV0lSUQkxMjcKKyNkZWZpbmUgSkNPUkVfQUlDMV9NSU5fSFdJUlEJMTYKKyNkZWZpbmUgSkNPUkVfQUlDMl9NSU5fSFdJUlEJNjQKKworI2RlZmluZSBKQ09SRV9BSUMxX0lOVFBSSV9SRUcJOAorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGpjb3JlX2FpYzsKKworc3RhdGljIGludCBqY29yZV9haWNfaXJxZG9tYWluX21hcChzdHJ1Y3QgaXJxX2RvbWFpbiAqZCwgdW5zaWduZWQgaW50IGlycSwKKwkJCQkgICBpcnFfaHdfbnVtYmVyX3QgaHdpcnEpCit7CisJc3RydWN0IGlycV9jaGlwICphaWMgPSBkLT5ob3N0X2RhdGE7CisKKwlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaXJxLCBhaWMsIGhhbmRsZV9zaW1wbGVfaXJxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlycV9kb21haW5fb3BzIGpjb3JlX2FpY19pcnFkb21haW5fb3BzID0geworCS5tYXAgPSBqY29yZV9haWNfaXJxZG9tYWluX21hcCwKKwkueGxhdGUgPSBpcnFfZG9tYWluX3hsYXRlX29uZWNlbGwsCit9OworCitzdGF0aWMgdm9pZCBub29wKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKK30KKworc3RhdGljIGludCBfX2luaXQgYWljX2lycV9vZl9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCQkgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50KQoreworCXVuc2lnbmVkIG1pbl9pcnEgPSBKQ09SRV9BSUMyX01JTl9IV0lSUTsKKwl1bnNpZ25lZCBkb21fc3ogPSBKQ09SRV9BSUNfTUFYX0hXSVJRKzE7CisJc3RydWN0IGlycV9kb21haW4gKmRvbWFpbjsKKworCXByX2luZm8oIkluaXRpYWxpemluZyBKLUNvcmUgQUlDXG4iKTsKKworCS8qIEFJQzEgbmVlZHMgcHJpb3JpdHkgaW5pdGlhbGl6YXRpb24gdG8gcmVjZWl2ZSBpbnRlcnJ1cHRzLiAqLworCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShub2RlLCAiamNvcmUsYWljMSIpKSB7CisJCXVuc2lnbmVkIGNwdTsKKworCQlmb3JfZWFjaF9wcmVzZW50X2NwdShjcHUpIHsKKwkJCXZvaWQgX19pb21lbSAqYmFzZSA9IG9mX2lvbWFwKG5vZGUsIGNwdSk7CisKKwkJCWlmICghYmFzZSkgeworCQkJCXByX2VycigiVW5hYmxlIHRvIG1hcCBBSUMgZm9yIGNwdSAldVxuIiwgY3B1KTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCV9fcmF3X3dyaXRlbCgweGZmZmZmZmZmLCBiYXNlICsgSkNPUkVfQUlDMV9JTlRQUklfUkVHKTsKKwkJCWlvdW5tYXAoYmFzZSk7CisJCX0KKwkJbWluX2lycSA9IEpDT1JFX0FJQzFfTUlOX0hXSVJROworCX0KKworCS8qCisJICogVGhlIGlycSBjaGlwIGZyYW1ld29yayByZXF1aXJlcyBlaXRoZXIgbWFzay91bm1hc2sgb3IgZW5hYmxlL2Rpc2FibGUKKwkgKiBmdW5jdGlvbiBwb2ludGVycyB0byBiZSBwcm92aWRlZCwgYnV0IHRoZSBoYXJkd2FyZSBkb2VzIG5vdCBoYXZlIGFueQorCSAqIHN1Y2ggbWVjaGFuaXNtOyB0aGUgb25seSBpbnRlcnJ1cHQgbWFza2luZyBpcyBhdCB0aGUgY3B1IGxldmVsIGFuZAorCSAqIGl0IGFmZmVjdHMgYWxsIGludGVycnVwdHMuIFdlIHByb3ZpZGUgZHVtbXkgbWFzay91bm1hc2suIFRoZSBoYXJkd2FyZQorCSAqIGhhbmRsZXMgYWxsIGludGVycnVwdCBjb250cm9sIGFuZCBjbGVhcnMgcGVuZGluZyBzdGF0dXMgd2hlbiB0aGUgY3B1CisJICogYWNjZXB0cyB0aGUgaW50ZXJydXB0LgorCSAqLworCWpjb3JlX2FpYy5pcnFfbWFzayA9IG5vb3A7CisJamNvcmVfYWljLmlycV91bm1hc2sgPSBub29wOworCWpjb3JlX2FpYy5uYW1lID0gIkFJQyI7CisKKwlkb21haW4gPSBpcnFfZG9tYWluX2FkZF9saW5lYXIobm9kZSwgZG9tX3N6LCAmamNvcmVfYWljX2lycWRvbWFpbl9vcHMsCisJCQkJICAgICAgICZqY29yZV9haWMpOworCWlmICghZG9tYWluKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpcnFfY3JlYXRlX3N0cmljdF9tYXBwaW5ncyhkb21haW4sIG1pbl9pcnEsIG1pbl9pcnEsIGRvbV9zeiAtIG1pbl9pcnEpOworCisJcmV0dXJuIDA7Cit9CisKK0lSUUNISVBfREVDTEFSRShqY29yZV9haWMyLCAiamNvcmUsYWljMiIsIGFpY19pcnFfb2ZfaW5pdCk7CitJUlFDSElQX0RFQ0xBUkUoamNvcmVfYWljMSwgImpjb3JlLGFpYzEiLCBhaWNfaXJxX29mX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1rZXlzdG9uZS5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS1rZXlzdG9uZS5jCmluZGV4IGRlYjg5ZDYuLjU0YTVlODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnEta2V5c3RvbmUuYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWtleXN0b25lLmMKQEAgLTEwOSw3ICsxMDksNyBAQAogCQkJZGV2X2RiZyhraXJxLT5kZXYsICJkaXNwYXRjaCBiaXQgJWQsIHZpcnEgJWRcbiIsCiAJCQkJc3JjLCB2aXJxKTsKIAkJCWlmICghdmlycSkKLQkJCQlkZXZfd2FybihraXJxLT5kZXYsICJzcG9yaW91cyBpcnEgZGV0ZWN0ZWQgaHdpcnEgJWQsIHZpcnEgJWRcbiIsCisJCQkJZGV2X3dhcm4oa2lycS0+ZGV2LCAic3B1cmlvdXMgaXJxIGRldGVjdGVkIGh3aXJxICVkLCB2aXJxICVkXG4iLAogCQkJCQkgc3JjLCB2aXJxKTsKIAkJCWdlbmVyaWNfaGFuZGxlX2lycSh2aXJxKTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1taXBzLWdpYy5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS1taXBzLWdpYy5jCmluZGV4IGM1ZjMzYzMuLmMwMTc4YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtbWlwcy1naWMuYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLW1pcHMtZ2ljLmMKQEAgLTM3MSwxOCArMzcxLDEzIEBACiAJYml0bWFwX2FuZChwZW5kaW5nLCBwZW5kaW5nLCBpbnRybWFzaywgZ2ljX3NoYXJlZF9pbnRycyk7CiAJYml0bWFwX2FuZChwZW5kaW5nLCBwZW5kaW5nLCBwY3B1X21hc2ssIGdpY19zaGFyZWRfaW50cnMpOwogCi0JaW50ciA9IGZpbmRfZmlyc3RfYml0KHBlbmRpbmcsIGdpY19zaGFyZWRfaW50cnMpOwotCXdoaWxlIChpbnRyICE9IGdpY19zaGFyZWRfaW50cnMpIHsKKwlmb3JfZWFjaF9zZXRfYml0KGludHIsIHBlbmRpbmcsIGdpY19zaGFyZWRfaW50cnMpIHsKIAkJdmlycSA9IGlycV9saW5lYXJfcmV2bWFwKGdpY19pcnFfZG9tYWluLAogCQkJCQkgR0lDX1NIQVJFRF9UT19IV0lSUShpbnRyKSk7CiAJCWlmIChjaGFpbmVkKQogCQkJZ2VuZXJpY19oYW5kbGVfaXJxKHZpcnEpOwogCQllbHNlCiAJCQlkb19JUlEodmlycSk7Ci0KLQkJLyogZ28gdG8gbmV4dCBwZW5kaW5nIGJpdCAqLwotCQliaXRtYXBfY2xlYXIocGVuZGluZywgaW50ciwgMSk7Ci0JCWludHIgPSBmaW5kX2ZpcnN0X2JpdChwZW5kaW5nLCBnaWNfc2hhcmVkX2ludHJzKTsKIAl9CiB9CiAKQEAgLTUxOCwxOCArNTEzLDEzIEBACiAKIAliaXRtYXBfYW5kKCZwZW5kaW5nLCAmcGVuZGluZywgJm1hc2tlZCwgR0lDX05VTV9MT0NBTF9JTlRSUyk7CiAKLQlpbnRyID0gZmluZF9maXJzdF9iaXQoJnBlbmRpbmcsIEdJQ19OVU1fTE9DQUxfSU5UUlMpOwotCXdoaWxlIChpbnRyICE9IEdJQ19OVU1fTE9DQUxfSU5UUlMpIHsKKwlmb3JfZWFjaF9zZXRfYml0KGludHIsICZwZW5kaW5nLCBHSUNfTlVNX0xPQ0FMX0lOVFJTKSB7CiAJCXZpcnEgPSBpcnFfbGluZWFyX3Jldm1hcChnaWNfaXJxX2RvbWFpbiwKIAkJCQkJIEdJQ19MT0NBTF9UT19IV0lSUShpbnRyKSk7CiAJCWlmIChjaGFpbmVkKQogCQkJZ2VuZXJpY19oYW5kbGVfaXJxKHZpcnEpOwogCQllbHNlCiAJCQlkb19JUlEodmlycSk7Ci0KLQkJLyogZ28gdG8gbmV4dCBwZW5kaW5nIGJpdCAqLwotCQliaXRtYXBfY2xlYXIoJnBlbmRpbmcsIGludHIsIDEpOwotCQlpbnRyID0gZmluZF9maXJzdF9iaXQoJnBlbmRpbmcsIEdJQ19OVU1fTE9DQUxfSU5UUlMpOwogCX0KIH0KIApAQCAtNjM4LDI3ICs2MjgsNiBAQAogCWlmICghZ2ljX2xvY2FsX2lycV9pc19yb3V0YWJsZShpbnRyKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCS8qCi0JICogSEFDSzogVGhlc2UgYXJlIGFsbCByZWFsbHkgcGVyY3B1IGludGVycnVwdHMsIGJ1dCB0aGUgcmVzdAotCSAqIG9mIHRoZSBNSVBTIGtlcm5lbCBjb2RlIGRvZXMgbm90IHVzZSB0aGUgcGVyY3B1IElSUSBBUEkgZm9yCi0JICogdGhlIENQMCB0aW1lciBhbmQgcGVyZm9ybWFuY2UgY291bnRlciBpbnRlcnJ1cHRzLgotCSAqLwotCXN3aXRjaCAoaW50cikgewotCWNhc2UgR0lDX0xPQ0FMX0lOVF9USU1FUjoKLQljYXNlIEdJQ19MT0NBTF9JTlRfUEVSRkNUUjoKLQljYXNlIEdJQ19MT0NBTF9JTlRfRkRDOgotCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIodmlycSwKLQkJCQkJICZnaWNfYWxsX3ZwZXNfbG9jYWxfaXJxX2NvbnRyb2xsZXIsCi0JCQkJCSBoYW5kbGVfcGVyY3B1X2lycSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcih2aXJxLAotCQkJCQkgJmdpY19sb2NhbF9pcnFfY29udHJvbGxlciwKLQkJCQkJIGhhbmRsZV9wZXJjcHVfZGV2aWRfaXJxKTsKLQkJaXJxX3NldF9wZXJjcHVfZGV2aWQodmlycSk7Ci0JCWJyZWFrOwotCX0KLQogCXNwaW5fbG9ja19pcnFzYXZlKCZnaWNfbG9jaywgZmxhZ3MpOwogCWZvciAoaSA9IDA7IGkgPCBnaWNfdnBlczsgaSsrKSB7CiAJCXUzMiB2YWwgPSBHSUNfTUFQX1RPX1BJTl9NU0sgfCBnaWNfY3B1X3BpbjsKQEAgLTcxMyw5ICs2ODIsNiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGk7CiAKLQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIodmlycSwgJmdpY19sZXZlbF9pcnFfY29udHJvbGxlciwKLQkJCQkgaGFuZGxlX2xldmVsX2lycSk7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZ2ljX2xvY2ssIGZsYWdzKTsKIAlnaWNfbWFwX3RvX3BpbihpbnRyLCBnaWNfY3B1X3Bpbik7CiAJZ2ljX21hcF90b192cGUoaW50ciwgbWlwc19jbV92cF9pZCh2cGUpKTsKQEAgLTcyNywxMiArNjkzLDQyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZ2ljX2lycV9kb21haW5fbWFwKHN0cnVjdCBpcnFfZG9tYWluICpkLCB1bnNpZ25lZCBpbnQgdmlycSwKLQkJCSAgICAgIGlycV9od19udW1iZXJfdCBodykKK3N0YXRpYyBpbnQgZ2ljX3NldHVwX2Rldl9jaGlwKHN0cnVjdCBpcnFfZG9tYWluICpkLCB1bnNpZ25lZCBpbnQgdmlycSwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBod2lycSkKIHsKLQlpZiAoR0lDX0hXSVJRX1RPX0xPQ0FMKGh3KSA8IEdJQ19OVU1fTE9DQUxfSU5UUlMpCi0JCXJldHVybiBnaWNfbG9jYWxfaXJxX2RvbWFpbl9tYXAoZCwgdmlycSwgaHcpOwotCXJldHVybiBnaWNfc2hhcmVkX2lycV9kb21haW5fbWFwKGQsIHZpcnEsIGh3LCAwKTsKKwlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXA7CisJaW50IGVycjsKKworCWlmIChod2lycSA+PSBHSUNfU0hBUkVEX0hXSVJRX0JBU0UpIHsKKwkJZXJyID0gaXJxX2RvbWFpbl9zZXRfaHdpcnFfYW5kX2NoaXAoZCwgdmlycSwgaHdpcnEsCisJCQkJCQkgICAgJmdpY19sZXZlbF9pcnFfY29udHJvbGxlciwKKwkJCQkJCSAgICBOVUxMKTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKEdJQ19IV0lSUV9UT19MT0NBTChod2lycSkpIHsKKwkJY2FzZSBHSUNfTE9DQUxfSU5UX1RJTUVSOgorCQljYXNlIEdJQ19MT0NBTF9JTlRfUEVSRkNUUjoKKwkJY2FzZSBHSUNfTE9DQUxfSU5UX0ZEQzoKKwkJCS8qCisJCQkgKiBIQUNLOiBUaGVzZSBhcmUgYWxsIHJlYWxseSBwZXJjcHUgaW50ZXJydXB0cywgYnV0CisJCQkgKiB0aGUgcmVzdCBvZiB0aGUgTUlQUyBrZXJuZWwgY29kZSBkb2VzIG5vdCB1c2UgdGhlCisJCQkgKiBwZXJjcHUgSVJRIEFQSSBmb3IgdGhlbS4KKwkJCSAqLworCQkJY2hpcCA9ICZnaWNfYWxsX3ZwZXNfbG9jYWxfaXJxX2NvbnRyb2xsZXI7CisJCQlpcnFfc2V0X2hhbmRsZXIodmlycSwgaGFuZGxlX3BlcmNwdV9pcnEpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWNoaXAgPSAmZ2ljX2xvY2FsX2lycV9jb250cm9sbGVyOworCQkJaXJxX3NldF9oYW5kbGVyKHZpcnEsIGhhbmRsZV9wZXJjcHVfZGV2aWRfaXJxKTsKKwkJCWlycV9zZXRfcGVyY3B1X2RldmlkKHZpcnEpOworCQkJYnJlYWs7CisJCX0KKworCQllcnIgPSBpcnFfZG9tYWluX3NldF9od2lycV9hbmRfY2hpcChkLCB2aXJxLCBod2lycSwKKwkJCQkJCSAgICBjaGlwLCBOVUxMKTsKKwl9CisKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IGdpY19pcnFfZG9tYWluX2FsbG9jKHN0cnVjdCBpcnFfZG9tYWluICpkLCB1bnNpZ25lZCBpbnQgdmlycSwKQEAgLTc0MywxNSArNzM5LDEyIEBACiAJaW50IGNwdSwgcmV0LCBpOwogCiAJaWYgKHNwZWMtPnR5cGUgPT0gR0lDX0RFVklDRSkgewotCQkvKiB2ZXJpZnkgdGhhdCBpdCBkb2Vzbid0IGNvbmZsaWN0IHdpdGggYW4gSVBJIGlycSAqLwotCQlpZiAodGVzdF9iaXQoc3BlYy0+aHdpcnEsIGlwaV9yZXNydikpCisJCS8qIHZlcmlmeSB0aGF0IHNoYXJlZCBpcnFzIGRvbid0IGNvbmZsaWN0IHdpdGggYW4gSVBJIGlycSAqLworCQlpZiAoKHNwZWMtPmh3aXJxID49IEdJQ19TSEFSRURfSFdJUlFfQkFTRSkgJiYKKwkJICAgIHRlc3RfYml0KEdJQ19IV0lSUV9UT19TSEFSRUQoc3BlYy0+aHdpcnEpLCBpcGlfcmVzcnYpKQogCQkJcmV0dXJuIC1FQlVTWTsKIAotCQlod2lycSA9IEdJQ19TSEFSRURfVE9fSFdJUlEoc3BlYy0+aHdpcnEpOwotCi0JCXJldHVybiBpcnFfZG9tYWluX3NldF9od2lycV9hbmRfY2hpcChkLCB2aXJxLCBod2lycSwKLQkJCQkJCSAgICAgJmdpY19sZXZlbF9pcnFfY29udHJvbGxlciwKLQkJCQkJCSAgICAgTlVMTCk7CisJCXJldHVybiBnaWNfc2V0dXBfZGV2X2NoaXAoZCwgdmlycSwgc3BlYy0+aHdpcnEpOwogCX0gZWxzZSB7CiAJCWJhc2VfaHdpcnEgPSBmaW5kX2ZpcnN0X2JpdChpcGlfcmVzcnYsIGdpY19zaGFyZWRfaW50cnMpOwogCQlpZiAoYmFzZV9od2lycSA9PSBnaWNfc2hhcmVkX2ludHJzKSB7CkBAIC03NzEsMTEgKzc2NCwxMyBAQAogCQkJaHdpcnEgPSBHSUNfU0hBUkVEX1RPX0hXSVJRKGJhc2VfaHdpcnEgKyBpKTsKIAogCQkJcmV0ID0gaXJxX2RvbWFpbl9zZXRfaHdpcnFfYW5kX2NoaXAoZCwgdmlycSArIGksIGh3aXJxLAotCQkJCQkJCSAgICAmZ2ljX2VkZ2VfaXJxX2NvbnRyb2xsZXIsCisJCQkJCQkJICAgICZnaWNfbGV2ZWxfaXJxX2NvbnRyb2xsZXIsCiAJCQkJCQkJICAgIE5VTEwpOwogCQkJaWYgKHJldCkKIAkJCQlnb3RvIGVycm9yOwogCisJCQlpcnFfc2V0X2hhbmRsZXIodmlycSArIGksIGhhbmRsZV9sZXZlbF9pcnEpOworCiAJCQlyZXQgPSBnaWNfc2hhcmVkX2lycV9kb21haW5fbWFwKGQsIHZpcnEgKyBpLCBod2lycSwgY3B1KTsKIAkJCWlmIChyZXQpCiAJCQkJZ290byBlcnJvcjsKQEAgLTgxOCw3ICs4MTMsNiBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlycV9kb21haW5fb3BzIGdpY19pcnFfZG9tYWluX29wcyA9IHsKLQkubWFwID0gZ2ljX2lycV9kb21haW5fbWFwLAogCS5hbGxvYyA9IGdpY19pcnFfZG9tYWluX2FsbG9jLAogCS5mcmVlID0gZ2ljX2lycV9kb21haW5fZnJlZSwKIAkubWF0Y2ggPSBnaWNfaXJxX2RvbWFpbl9tYXRjaCwKQEAgLTg0OSwyOSArODQzLDIwIEBACiAJc3RydWN0IGlycV9md3NwZWMgKmZ3c3BlYyA9IGFyZzsKIAlzdHJ1Y3QgZ2ljX2lycV9zcGVjIHNwZWMgPSB7CiAJCS50eXBlID0gR0lDX0RFVklDRSwKLQkJLmh3aXJxID0gZndzcGVjLT5wYXJhbVsxXSwKIAl9OwogCWludCBpLCByZXQ7Ci0JYm9vbCBpc19zaGFyZWQgPSBmd3NwZWMtPnBhcmFtWzBdID09IEdJQ19TSEFSRUQ7CiAKLQlpZiAoaXNfc2hhcmVkKSB7Ci0JCXJldCA9IGlycV9kb21haW5fYWxsb2NfaXJxc19wYXJlbnQoZCwgdmlycSwgbnJfaXJxcywgJnNwZWMpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9CisJaWYgKGZ3c3BlYy0+cGFyYW1bMF0gPT0gR0lDX1NIQVJFRCkKKwkJc3BlYy5od2lycSA9IEdJQ19TSEFSRURfVE9fSFdJUlEoZndzcGVjLT5wYXJhbVsxXSk7CisJZWxzZQorCQlzcGVjLmh3aXJxID0gR0lDX0xPQ0FMX1RPX0hXSVJRKGZ3c3BlYy0+cGFyYW1bMV0pOworCisJcmV0ID0gaXJxX2RvbWFpbl9hbGxvY19pcnFzX3BhcmVudChkLCB2aXJxLCBucl9pcnFzLCAmc3BlYyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWZvciAoaSA9IDA7IGkgPCBucl9pcnFzOyBpKyspIHsKLQkJaXJxX2h3X251bWJlcl90IGh3aXJxOwotCi0JCWlmIChpc19zaGFyZWQpCi0JCQlod2lycSA9IEdJQ19TSEFSRURfVE9fSFdJUlEoc3BlYy5od2lycSArIGkpOwotCQllbHNlCi0JCQlod2lycSA9IEdJQ19MT0NBTF9UT19IV0lSUShzcGVjLmh3aXJxICsgaSk7Ci0KLQkJcmV0ID0gaXJxX2RvbWFpbl9zZXRfaHdpcnFfYW5kX2NoaXAoZCwgdmlycSArIGksCi0JCQkJCQkgICAgaHdpcnEsCi0JCQkJCQkgICAgJmdpY19sZXZlbF9pcnFfY29udHJvbGxlciwKLQkJCQkJCSAgICBOVUxMKTsKKwkJcmV0ID0gZ2ljX3NldHVwX2Rldl9jaGlwKGQsIHZpcnEgKyBpLCBzcGVjLmh3aXJxICsgaSk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGVycm9yOwogCX0KQEAgLTg5MCwxMCArODc1LDIwIEBACiAJcmV0dXJuOwogfQogCitzdGF0aWMgdm9pZCBnaWNfZGV2X2RvbWFpbl9hY3RpdmF0ZShzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluLAorCQkJCSAgICBzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJaWYgKEdJQ19IV0lSUV9UT19MT0NBTChkLT5od2lycSkgPCBHSUNfTlVNX0xPQ0FMX0lOVFJTKQorCQlnaWNfbG9jYWxfaXJxX2RvbWFpbl9tYXAoZG9tYWluLCBkLT5pcnEsIGQtPmh3aXJxKTsKKwllbHNlCisJCWdpY19zaGFyZWRfaXJxX2RvbWFpbl9tYXAoZG9tYWluLCBkLT5pcnEsIGQtPmh3aXJxLCAwKTsKK30KKwogc3RhdGljIHN0cnVjdCBpcnFfZG9tYWluX29wcyBnaWNfZGV2X2RvbWFpbl9vcHMgPSB7CiAJLnhsYXRlID0gZ2ljX2Rldl9kb21haW5feGxhdGUsCiAJLmFsbG9jID0gZ2ljX2Rldl9kb21haW5fYWxsb2MsCiAJLmZyZWUgPSBnaWNfZGV2X2RvbWFpbl9mcmVlLAorCS5hY3RpdmF0ZSA9IGdpY19kZXZfZG9tYWluX2FjdGl2YXRlLAogfTsKIAogc3RhdGljIGludCBnaWNfaXBpX2RvbWFpbl94bGF0ZShzdHJ1Y3QgaXJxX2RvbWFpbiAqZCwgc3RydWN0IGRldmljZV9ub2RlICpjdHJsciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtbXZlYnUtcGljLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLW12ZWJ1LXBpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYzYzOTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLW12ZWJ1LXBpYy5jCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IE1hcnZlbGwKKyAqCisgKiBZZWh1ZGEgWWl0c2NoYWsgPHllaHVkYXlAbWFydmVsbC5jb20+CisgKiBUaG9tYXMgUGV0YXp6b25pIDx0aG9tYXMucGV0YXp6b25pQGZyZWUtZWxlY3Ryb25zLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFjaGlwLmg+CisjaW5jbHVkZSA8bGludXgvaXJxY2hpcC9jaGFpbmVkX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjZGVmaW5lIFBJQ19DQVVTRQkgICAgICAgMHgwCisjZGVmaW5lIFBJQ19NQVNLCSAgICAgICAweDQKKworI2RlZmluZSBQSUNfTUFYX0lSUVMJCTMyCisjZGVmaW5lIFBJQ19NQVhfSVJRX01BU0sJKCgxVUwgPDwgUElDX01BWF9JUlFTKSAtIDEpCisKK3N0cnVjdCBtdmVidV9waWMgeworCXZvaWQgX19pb21lbSAqYmFzZTsKKwl1MzIgcGFyZW50X2lycTsKKwlzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluOworCXN0cnVjdCBpcnFfY2hpcCBpcnFfY2hpcDsKK307CisKK3N0YXRpYyB2b2lkIG12ZWJ1X3BpY19yZXNldChzdHJ1Y3QgbXZlYnVfcGljICpwaWMpCit7CisJLyogQUNLIGFuZCBtYXNrIGFsbCBpbnRlcnJ1cHRzICovCisJd3JpdGVsKDAsIHBpYy0+YmFzZSArIFBJQ19NQVNLKTsKKwl3cml0ZWwoUElDX01BWF9JUlFfTUFTSywgcGljLT5iYXNlICsgUElDX0NBVVNFKTsKK30KKworc3RhdGljIHZvaWQgbXZlYnVfcGljX2VvaV9pcnEoc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBtdmVidV9waWMgKnBpYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCisJd3JpdGVsKDEgPDwgZC0+aHdpcnEsIHBpYy0+YmFzZSArIFBJQ19DQVVTRSk7Cit9CisKK3N0YXRpYyB2b2lkIG12ZWJ1X3BpY19tYXNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IG12ZWJ1X3BpYyAqcGljID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJdTMyIHJlZzsKKworCXJlZyA9ICByZWFkbChwaWMtPmJhc2UgKyBQSUNfTUFTSyk7CisJcmVnIHw9ICgxIDw8IGQtPmh3aXJxKTsKKwl3cml0ZWwocmVnLCBwaWMtPmJhc2UgKyBQSUNfTUFTSyk7Cit9CisKK3N0YXRpYyB2b2lkIG12ZWJ1X3BpY191bm1hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgbXZlYnVfcGljICpwaWMgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwl1MzIgcmVnOworCisJcmVnID0gcmVhZGwocGljLT5iYXNlICsgUElDX01BU0spOworCXJlZyAmPSB+KDEgPDwgZC0+aHdpcnEpOworCXdyaXRlbChyZWcsIHBpYy0+YmFzZSArIFBJQ19NQVNLKTsKK30KKworc3RhdGljIGludCBtdmVidV9waWNfaXJxX21hcChzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluLCB1bnNpZ25lZCBpbnQgdmlycSwKKwkJCSAgICAgaXJxX2h3X251bWJlcl90IGh3aXJxKQoreworCXN0cnVjdCBtdmVidV9waWMgKnBpYyA9IGRvbWFpbi0+aG9zdF9kYXRhOworCisJaXJxX3NldF9wZXJjcHVfZGV2aWQodmlycSk7CisJaXJxX3NldF9jaGlwX2RhdGEodmlycSwgcGljKTsKKwlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIodmlycSwgJnBpYy0+aXJxX2NoaXAsCisJCQkJIGhhbmRsZV9wZXJjcHVfZGV2aWRfaXJxKTsKKwlpcnFfc2V0X3N0YXR1c19mbGFncyh2aXJxLCBJUlFfTEVWRUwpOworCWlycV9zZXRfcHJvYmUodmlycSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpcnFfZG9tYWluX29wcyBtdmVidV9waWNfZG9tYWluX29wcyA9IHsKKwkubWFwID0gbXZlYnVfcGljX2lycV9tYXAsCisJLnhsYXRlID0gaXJxX2RvbWFpbl94bGF0ZV9vbmVjZWxsLAorfTsKKworc3RhdGljIHZvaWQgbXZlYnVfcGljX2hhbmRsZV9jYXNjYWRlX2lycShzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IG12ZWJ1X3BpYyAqcGljID0gaXJxX2Rlc2NfZ2V0X2hhbmRsZXJfZGF0YShkZXNjKTsKKwlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBpcnFfZGVzY19nZXRfY2hpcChkZXNjKTsKKwl1bnNpZ25lZCBsb25nIGlycW1hcCwgaXJxbjsKKwl1bnNpZ25lZCBpbnQgY2FzY2FkZV9pcnE7CisKKwlpcnFtYXAgPSByZWFkbF9yZWxheGVkKHBpYy0+YmFzZSArIFBJQ19DQVVTRSk7CisJY2hhaW5lZF9pcnFfZW50ZXIoY2hpcCwgZGVzYyk7CisKKwlmb3JfZWFjaF9zZXRfYml0KGlycW4sICZpcnFtYXAsIEJJVFNfUEVSX0xPTkcpIHsKKwkJY2FzY2FkZV9pcnEgPSBpcnFfZmluZF9tYXBwaW5nKHBpYy0+ZG9tYWluLCBpcnFuKTsKKwkJZ2VuZXJpY19oYW5kbGVfaXJxKGNhc2NhZGVfaXJxKTsKKwl9CisKKwljaGFpbmVkX2lycV9leGl0KGNoaXAsIGRlc2MpOworfQorCitzdGF0aWMgdm9pZCBtdmVidV9waWNfZW5hYmxlX3BlcmNwdV9pcnEodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbXZlYnVfcGljICpwaWMgPSBkYXRhOworCisJbXZlYnVfcGljX3Jlc2V0KHBpYyk7CisJZW5hYmxlX3BlcmNwdV9pcnEocGljLT5wYXJlbnRfaXJxLCBJUlFfVFlQRV9OT05FKTsKK30KKworc3RhdGljIHZvaWQgbXZlYnVfcGljX2Rpc2FibGVfcGVyY3B1X2lycSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBtdmVidV9waWMgKnBpYyA9IGRhdGE7CisKKwlkaXNhYmxlX3BlcmNwdV9pcnEocGljLT5wYXJlbnRfaXJxKTsKK30KKworc3RhdGljIGludCBtdmVidV9waWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlzdHJ1Y3QgbXZlYnVfcGljICpwaWM7CisJc3RydWN0IGlycV9jaGlwICppcnFfY2hpcDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCXBpYyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IG12ZWJ1X3BpYyksIEdGUF9LRVJORUwpOworCWlmICghcGljKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJcGljLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihwaWMtPmJhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihwaWMtPmJhc2UpOworCisJaXJxX2NoaXAgPSAmcGljLT5pcnFfY2hpcDsKKwlpcnFfY2hpcC0+bmFtZSA9IGRldl9uYW1lKCZwZGV2LT5kZXYpOworCWlycV9jaGlwLT5pcnFfbWFzayA9IG12ZWJ1X3BpY19tYXNrX2lycTsKKwlpcnFfY2hpcC0+aXJxX3VubWFzayA9IG12ZWJ1X3BpY191bm1hc2tfaXJxOworCWlycV9jaGlwLT5pcnFfZW9pID0gbXZlYnVfcGljX2VvaV9pcnE7CisKKwlwaWMtPnBhcmVudF9pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChub2RlLCAwKTsKKwlpZiAocGljLT5wYXJlbnRfaXJxIDw9IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHBhcnNlIHBhcmVudCBpbnRlcnJ1cHRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwaWMtPmRvbWFpbiA9IGlycV9kb21haW5fYWRkX2xpbmVhcihub2RlLCBQSUNfTUFYX0lSUVMsCisJCQkJCSAgICAmbXZlYnVfcGljX2RvbWFpbl9vcHMsIHBpYyk7CisJaWYgKCFwaWMtPmRvbWFpbikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgaXJxIGRvbWFpblxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKHBpYy0+cGFyZW50X2lycSwgbXZlYnVfcGljX2hhbmRsZV9jYXNjYWRlX2lycSk7CisJaXJxX3NldF9oYW5kbGVyX2RhdGEocGljLT5wYXJlbnRfaXJxLCBwaWMpOworCisJb25fZWFjaF9jcHUobXZlYnVfcGljX2VuYWJsZV9wZXJjcHVfaXJxLCBwaWMsIDEpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGljKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG12ZWJ1X3BpY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbXZlYnVfcGljICpwaWMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCW9uX2VhY2hfY3B1KG12ZWJ1X3BpY19kaXNhYmxlX3BlcmNwdV9pcnEsIHBpYywgMSk7CisJaXJxX2RvbWFpbl9yZW1vdmUocGljLT5kb21haW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG12ZWJ1X3BpY19vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAibWFydmVsbCxhcm1hZGEtOGstcGljIiwgfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtdmVidV9waWNfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtdmVidV9waWNfZHJpdmVyID0geworCS5wcm9iZSAgPSBtdmVidV9waWNfcHJvYmUsCisJLnJlbW92ZSA9IG12ZWJ1X3BpY19yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibXZlYnUtcGljIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gbXZlYnVfcGljX29mX21hdGNoLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihtdmVidV9waWNfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiWWVodWRhIFlpdHNjaGFrIDx5ZWh1ZGF5QG1hcnZlbGwuY29tPiIpOworTU9EVUxFX0FVVEhPUigiVGhvbWFzIFBldGF6em9uaSA8dGhvbWFzLnBldGF6em9uaUBmcmVlLWVsZWN0cm9ucy5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOm12ZWJ1X3BpYyIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLXN0bTMyLWV4dGkuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtc3RtMzItZXh0aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MTU2OGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLXN0bTMyLWV4dGkuYwpAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgTWF4aW1lIENvcXVlbGluIDIwMTUKKyAqIEF1dGhvcjogIE1heGltZSBDb3F1ZWxpbiA8bWNvcXVlbGluLnN0bTMyQGdtYWlsLmNvbT4KKyAqIExpY2Vuc2UgdGVybXM6ICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgdmVyc2lvbiAyCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaXJxY2hpcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAvY2hhaW5lZF9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisKKyNkZWZpbmUgRVhUSV9JTVIJMHgwCisjZGVmaW5lIEVYVElfRU1SCTB4NAorI2RlZmluZSBFWFRJX1JUU1IJMHg4CisjZGVmaW5lIEVYVElfRlRTUgkweGMKKyNkZWZpbmUgRVhUSV9TV0lFUgkweDEwCisjZGVmaW5lIEVYVElfUFIJCTB4MTQKKworc3RhdGljIHZvaWQgc3RtMzJfaXJxX2hhbmRsZXIoc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXN0cnVjdCBpcnFfZG9tYWluICpkb21haW4gPSBpcnFfZGVzY19nZXRfaGFuZGxlcl9kYXRhKGRlc2MpOworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYyA9IGRvbWFpbi0+Z2MtPmdjWzBdOworCXN0cnVjdCBpcnFfY2hpcCAqY2hpcCA9IGlycV9kZXNjX2dldF9jaGlwKGRlc2MpOworCXVuc2lnbmVkIGxvbmcgcGVuZGluZzsKKwlpbnQgbjsKKworCWNoYWluZWRfaXJxX2VudGVyKGNoaXAsIGRlc2MpOworCisJd2hpbGUgKChwZW5kaW5nID0gaXJxX3JlZ19yZWFkbChnYywgRVhUSV9QUikpKSB7CisJCWZvcl9lYWNoX3NldF9iaXQobiwgJnBlbmRpbmcsIEJJVFNfUEVSX0xPTkcpIHsKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShpcnFfZmluZF9tYXBwaW5nKGRvbWFpbiwgbikpOworCQkJaXJxX3JlZ193cml0ZWwoZ2MsIEJJVChuKSwgRVhUSV9QUik7CisJCX0KKwl9CisKKwljaGFpbmVkX2lycV9leGl0KGNoaXAsIGRlc2MpOworfQorCitzdGF0aWMgaW50IHN0bTMyX2lycV9zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCB0eXBlKQoreworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOworCWludCBwaW4gPSBkYXRhLT5od2lycTsKKwl1MzIgcnRzciwgZnRzcjsKKworCWlycV9nY19sb2NrKGdjKTsKKworCXJ0c3IgPSBpcnFfcmVnX3JlYWRsKGdjLCBFWFRJX1JUU1IpOworCWZ0c3IgPSBpcnFfcmVnX3JlYWRsKGdjLCBFWFRJX0ZUU1IpOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJUlFfVFlQRV9FREdFX1JJU0lORzoKKwkJcnRzciB8PSBCSVQocGluKTsKKwkJZnRzciAmPSB+QklUKHBpbik7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfRURHRV9GQUxMSU5HOgorCQlydHNyICY9IH5CSVQocGluKTsKKwkJZnRzciB8PSBCSVQocGluKTsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9FREdFX0JPVEg6CisJCXJ0c3IgfD0gQklUKHBpbik7CisJCWZ0c3IgfD0gQklUKHBpbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlycV9nY191bmxvY2soZ2MpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpcnFfcmVnX3dyaXRlbChnYywgcnRzciwgRVhUSV9SVFNSKTsKKwlpcnFfcmVnX3dyaXRlbChnYywgZnRzciwgRVhUSV9GVFNSKTsKKworCWlycV9nY191bmxvY2soZ2MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RtMzJfaXJxX3NldF93YWtlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IG9uKQoreworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOworCWludCBwaW4gPSBkYXRhLT5od2lycTsKKwl1MzIgZW1yOworCisJaXJxX2djX2xvY2soZ2MpOworCisJZW1yID0gaXJxX3JlZ19yZWFkbChnYywgRVhUSV9FTVIpOworCWlmIChvbikKKwkJZW1yIHw9IEJJVChwaW4pOworCWVsc2UKKwkJZW1yICY9IH5CSVQocGluKTsKKwlpcnFfcmVnX3dyaXRlbChnYywgZW1yLCBFWFRJX0VNUik7CisKKwlpcnFfZ2NfdW5sb2NrKGdjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0bTMyX2V4dGlfYWxsb2Moc3RydWN0IGlycV9kb21haW4gKmQsIHVuc2lnbmVkIGludCB2aXJxLAorCQkJICAgIHVuc2lnbmVkIGludCBucl9pcnFzLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYyA9IGQtPmdjLT5nY1swXTsKKwlzdHJ1Y3QgaXJxX2Z3c3BlYyAqZndzcGVjID0gZGF0YTsKKwlpcnFfaHdfbnVtYmVyX3QgaHdpcnE7CisKKwlod2lycSA9IGZ3c3BlYy0+cGFyYW1bMF07CisKKwlpcnFfbWFwX2dlbmVyaWNfY2hpcChkLCB2aXJxLCBod2lycSk7CisJaXJxX2RvbWFpbl9zZXRfaW5mbyhkLCB2aXJxLCBod2lycSwgJmdjLT5jaGlwX3R5cGVzLT5jaGlwLCBnYywKKwkJCSAgICBoYW5kbGVfc2ltcGxlX2lycSwgTlVMTCwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3RtMzJfZXh0aV9mcmVlKHN0cnVjdCBpcnFfZG9tYWluICpkLCB1bnNpZ25lZCBpbnQgdmlycSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgbnJfaXJxcykKK3sKKwlzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEgPSBpcnFfZG9tYWluX2dldF9pcnFfZGF0YShkLCB2aXJxKTsKKworCWlycV9kb21haW5fcmVzZXRfaXJxX2RhdGEoZGF0YSk7Cit9CisKK3N0cnVjdCBpcnFfZG9tYWluX29wcyBpcnFfZXh0aV9kb21haW5fb3BzID0geworCS5tYXAJPSBpcnFfbWFwX2dlbmVyaWNfY2hpcCwKKwkueGxhdGUJPSBpcnFfZG9tYWluX3hsYXRlX29uZXR3b2NlbGwsCisJLmFsbG9jICA9IHN0bTMyX2V4dGlfYWxsb2MsCisJLmZyZWUJPSBzdG0zMl9leHRpX2ZyZWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzdG0zMl9leHRpX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJCSAgc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQpCit7CisJdW5zaWduZWQgaW50IGNsciA9IElSUV9OT1JFUVVFU1QgfCBJUlFfTk9QUk9CRSB8IElSUV9OT0FVVE9FTjsKKwlpbnQgbnJfaXJxcywgbnJfZXh0aSwgcmV0LCBpOworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYzsKKwlzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluOworCXZvaWQgKmJhc2U7CisKKwliYXNlID0gb2ZfaW9tYXAobm9kZSwgMCk7CisJaWYgKCFiYXNlKSB7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBtYXAgcmVnaXN0ZXJzXG4iLCBub2RlLT5mdWxsX25hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBEZXRlcm1pbmUgbnVtYmVyIG9mIGlycXMgc3VwcG9ydGVkICovCisJd3JpdGVsX3JlbGF4ZWQofjBVTCwgYmFzZSArIEVYVElfUlRTUik7CisJbnJfZXh0aSA9IGZscyhyZWFkbF9yZWxheGVkKGJhc2UgKyBFWFRJX1JUU1IpKTsKKwl3cml0ZWxfcmVsYXhlZCgwLCBiYXNlICsgRVhUSV9SVFNSKTsKKworCXByX2luZm8oIiVzOiAlZCBFeHRlcm5hbCBJUlFzIGRldGVjdGVkXG4iLCBub2RlLT5mdWxsX25hbWUsIG5yX2V4dGkpOworCisJZG9tYWluID0gaXJxX2RvbWFpbl9hZGRfbGluZWFyKG5vZGUsIG5yX2V4dGksCisJCQkJICAgICAgICZpcnFfZXh0aV9kb21haW5fb3BzLCBOVUxMKTsKKwlpZiAoIWRvbWFpbikgeworCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgcmVnaXN0ZXIgaW50ZXJydXB0IGRvbWFpbi5cbiIsCisJCQkJbm9kZS0+bmFtZSk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3VubWFwOworCX0KKworCXJldCA9IGlycV9hbGxvY19kb21haW5fZ2VuZXJpY19jaGlwcyhkb21haW4sIG5yX2V4dGksIDEsICJleHRpIiwKKwkJCQkJICAgICBoYW5kbGVfZWRnZV9pcnEsIGNsciwgMCwgMCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgZ2VuZXJpYyBpbnRlcnJ1cHQgY2hpcC5cbiIsCisJCQlub2RlLT5mdWxsX25hbWUpOworCQlnb3RvIG91dF9mcmVlX2RvbWFpbjsKKwl9CisKKwlnYyA9IGRvbWFpbi0+Z2MtPmdjWzBdOworCWdjLT5yZWdfYmFzZSAgICAgICAgICAgICAgICAgICAgICAgICA9IGJhc2U7CisJZ2MtPmNoaXBfdHlwZXMtPnR5cGUgICAgICAgICAgICAgICA9IElSUV9UWVBFX0VER0VfQk9USDsKKwlnYy0+Y2hpcF90eXBlcy0+Y2hpcC5uYW1lICAgICAgICAgID0gZ2MtPmNoaXBfdHlwZXNbMF0uY2hpcC5uYW1lOworCWdjLT5jaGlwX3R5cGVzLT5jaGlwLmlycV9hY2sgICAgICAgPSBpcnFfZ2NfYWNrX3NldF9iaXQ7CisJZ2MtPmNoaXBfdHlwZXMtPmNoaXAuaXJxX21hc2sgICAgICA9IGlycV9nY19tYXNrX2Nscl9iaXQ7CisJZ2MtPmNoaXBfdHlwZXMtPmNoaXAuaXJxX3VubWFzayAgICA9IGlycV9nY19tYXNrX3NldF9iaXQ7CisJZ2MtPmNoaXBfdHlwZXMtPmNoaXAuaXJxX3NldF90eXBlICA9IHN0bTMyX2lycV9zZXRfdHlwZTsKKwlnYy0+Y2hpcF90eXBlcy0+Y2hpcC5pcnFfc2V0X3dha2UgID0gc3RtMzJfaXJxX3NldF93YWtlOworCWdjLT5jaGlwX3R5cGVzLT5yZWdzLmFjayAgICAgICAgICAgPSBFWFRJX1BSOworCWdjLT5jaGlwX3R5cGVzLT5yZWdzLm1hc2sgICAgICAgICAgPSBFWFRJX0lNUjsKKwlnYy0+Y2hpcF90eXBlcy0+aGFuZGxlciAgICAgICAgICAgID0gaGFuZGxlX2VkZ2VfaXJxOworCisJbnJfaXJxcyA9IG9mX2lycV9jb3VudChub2RlKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnJfaXJxczsgaSsrKSB7CisJCXVuc2lnbmVkIGludCBpcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChub2RlLCBpKTsKKworCQlpcnFfc2V0X2hhbmRsZXJfZGF0YShpcnEsIGRvbWFpbik7CisJCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKGlycSwgc3RtMzJfaXJxX2hhbmRsZXIpOworCX0KKworCXJldHVybiAwOworCitvdXRfZnJlZV9kb21haW46CisJaXJxX2RvbWFpbl9yZW1vdmUoZG9tYWluKTsKK291dF91bm1hcDoKKwlpb3VubWFwKGJhc2UpOworCXJldHVybiByZXQ7Cit9CisKK0lSUUNISVBfREVDTEFSRShzdG0zMl9leHRpLCAic3Qsc3RtMzItZXh0aSIsIHN0bTMyX2V4dGlfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vYXZtZnJpdHouYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9hdm1mcml0ei5jCmluZGV4IDI5Mjk5MWMuLmUzZmExY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9hdm1mcml0ei5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9hdm1mcml0ei5jCkBAIC0yODQsNyArMjg0LDcgQEAKIAkJCQkJICBBVk1fSERMQ19TVEFUVVNfMSkpOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogd3JpdGVfY3RybChzdHJ1Y3QgYmNoYW5uZWwgKmJjaCwgaW50IHdoaWNoKSB7CiAJc3RydWN0IGZyaXR6Y2FyZCAqZmMgPSBiY2gtPmh3OwogCXN0cnVjdCBoZGxjX2h3ICpoZGxjOwpAQCAtNzQxLDcgKzc0MSw3IEBACiAJbW9kZWhkbGMoJmZjLT5iY2hbMV0sIC0xKTsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIGNsZWFyX3BlbmRpbmdfaGRsY19pbnRzKHN0cnVjdCBmcml0emNhcmQgKmZjKQogewogCXUzMiB2YWw7CkBAIC05NjIsNyArOTYyLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIHNldHVwX2ZyaXR6KHN0cnVjdCBmcml0emNhcmQgKmZjKQogewogCXUzMiB2YWwsIHZlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNtdWx0aS5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY211bHRpLmMKaW5kZXggMjg1NDNkNy4uNDgwYzJkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY211bHRpLmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY211bHRpLmMKQEAgLTU2NCwxOSArNTY0LDE5IEBACiAjZGVmaW5lCU1BWF9URE1fQ0hBTiAzMgogCiAKLWlubGluZSB2b2lkCitzdGF0aWMgaW5saW5lIHZvaWQKIGVuYWJsZXBjaWJyaWRnZShzdHJ1Y3QgaGZjX211bHRpICpjKQogewogCUhGQ19vdXRiKGMsIFJfQlJHX1BDTV9DRkcsICgweDAgPDwgNikgfCAweDMpOyAvKiB3YXMgX2lvIGJlZm9yZSAqLwogfQogCi1pbmxpbmUgdm9pZAorc3RhdGljIGlubGluZSB2b2lkCiBkaXNhYmxlcGNpYnJpZGdlKHN0cnVjdCBoZmNfbXVsdGkgKmMpCiB7CiAJSEZDX291dGIoYywgUl9CUkdfUENNX0NGRywgKDB4MCA8PCA2KSB8IDB4Mik7IC8qIHdhcyBfaW8gYmVmb3JlICovCiB9CiAKLWlubGluZSB1bnNpZ25lZCBjaGFyCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIKIHJlYWRwY2licmlkZ2Uoc3RydWN0IGhmY19tdWx0aSAqaGMsIHVuc2lnbmVkIGNoYXIgYWRkcmVzcykKIHsKIAl1bnNpZ25lZCBzaG9ydCBjaXB2OwpAQCAtNjA0LDcgKzYwNCw3IEBACiAJcmV0dXJuIGRhdGE7CiB9CiAKLWlubGluZSB2b2lkCitzdGF0aWMgaW5saW5lIHZvaWQKIHdyaXRlcGNpYnJpZGdlKHN0cnVjdCBoZmNfbXVsdGkgKmhjLCB1bnNpZ25lZCBjaGFyIGFkZHJlc3MsIHVuc2lnbmVkIGNoYXIgZGF0YSkKIHsKIAl1bnNpZ25lZCBzaG9ydCBjaXB2OwpAQCAtNjM0LDE0ICs2MzQsMTQgQEAKIAlvdXRsKGRhdGF2LCBoYy0+cGNpX2lvYmFzZSk7CiB9CiAKLWlubGluZSB2b2lkCitzdGF0aWMgaW5saW5lIHZvaWQKIGNwbGRfc2V0X3JlZyhzdHJ1Y3QgaGZjX211bHRpICpoYywgdW5zaWduZWQgY2hhciByZWcpCiB7CiAJLyogRG8gZGF0YSBwaW4gcmVhZCBsb3cgYnl0ZSAqLwogCUhGQ19vdXRiKGhjLCBSX0dQSU9fT1VUMSwgcmVnKTsKIH0KIAotaW5saW5lIHZvaWQKK3N0YXRpYyBpbmxpbmUgdm9pZAogY3BsZF93cml0ZV9yZWcoc3RydWN0IGhmY19tdWx0aSAqaGMsIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIHZhbCkKIHsKIAljcGxkX3NldF9yZWcoaGMsIHJlZyk7CkBAIC02NTMsNyArNjUzLDcgQEAKIAlyZXR1cm47CiB9CiAKLWlubGluZSB1bnNpZ25lZCBjaGFyCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIKIGNwbGRfcmVhZF9yZWcoc3RydWN0IGhmY19tdWx0aSAqaGMsIHVuc2lnbmVkIGNoYXIgcmVnKQogewogCXVuc2lnbmVkIGNoYXIgYnl0ZWluOwpAQCAtNjcwLDE0ICs2NzAsMTQgQEAKIAlyZXR1cm4gYnl0ZWluOwogfQogCi1pbmxpbmUgdm9pZAorc3RhdGljIGlubGluZSB2b2lkCiB2cG1fd3JpdGVfYWRkcmVzcyhzdHJ1Y3QgaGZjX211bHRpICpoYywgdW5zaWduZWQgc2hvcnQgYWRkcikKIHsKIAljcGxkX3dyaXRlX3JlZyhoYywgMCwgMHhmZiAmIGFkZHIpOwogCWNwbGRfd3JpdGVfcmVnKGhjLCAxLCAweDAxICYgKGFkZHIgPj4gOCkpOwogfQogCi1pbmxpbmUgdW5zaWduZWQgc2hvcnQKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQKIHZwbV9yZWFkX2FkZHJlc3Moc3RydWN0IGhmY19tdWx0aSAqYykKIHsKIAl1bnNpZ25lZCBzaG9ydCBhZGRyOwpAQCAtNjkxLDcgKzY5MSw3IEBACiAJcmV0dXJuIGFkZHIgJiAweDFmZjsKIH0KIAotaW5saW5lIHVuc2lnbmVkIGNoYXIKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhcgogdnBtX2luKHN0cnVjdCBoZmNfbXVsdGkgKmMsIGludCB3aGljaCwgdW5zaWduZWQgc2hvcnQgYWRkcikKIHsKIAl1bnNpZ25lZCBjaGFyIHJlczsKQEAgLTcxMiw3ICs3MTIsNyBAQAogCXJldHVybiByZXM7CiB9CiAKLWlubGluZSB2b2lkCitzdGF0aWMgaW5saW5lIHZvaWQKIHZwbV9vdXQoc3RydWN0IGhmY19tdWx0aSAqYywgaW50IHdoaWNoLCB1bnNpZ25lZCBzaG9ydCBhZGRyLAogCXVuc2lnbmVkIGNoYXIgZGF0YSkKIHsKQEAgLTEwMjQsNyArMTAyNCw3IEBACiB9CiAKIC8qIFRoaXMgbXVzdCBiZSBjYWxsZWQgQU5EIGhjIG11c3QgYmUgbG9ja2VkIGlycXNhdmUhISEgKi8KLWlubGluZSB2b2lkCitzdGF0aWMgaW5saW5lIHZvaWQKIHBseHNkX2NoZWNrc3luYyhzdHJ1Y3QgaGZjX211bHRpICpoYywgaW50IHJtKQogewogCWlmIChoYy0+c3luY3Jvbml6ZWQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9tSVNETmlwYWMuYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9tSVNETmlwYWMuYwppbmRleCBhYTliNmMzLi44ZDMzOGJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vbUlTRE5pcGFjLmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL21JU0ROaXBhYy5jCkBAIC0xMTMsNyArMTEzLDcgQEAKIAlwcl9kZWJ1ZygiJXM6IFRFIG5ld3N0YXRlICV4XG4iLCBpc2FjLT5uYW1lLCBkY2gtPnN0YXRlKTsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIGlzYWNfZW1wdHlfZmlmbyhzdHJ1Y3QgaXNhY19odyAqaXNhYywgaW50IGNvdW50KQogewogCXU4ICpwdHI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vdzY2OTIuYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi93NjY5Mi5jCmluZGV4IDc0MTY3NTUuLjNiMDY3ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi93NjY5Mi5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi93NjY5Mi5jCkBAIC04NDgsNyArODQ4LDcgQEAKIAl9CiB9CiAKLXZvaWQgaW5pdFc2NjkyKHN0cnVjdCB3NjY5Ml9odyAqY2FyZCkKK3N0YXRpYyB2b2lkIGluaXRXNjY5MihzdHJ1Y3QgdzY2OTJfaHcgKmNhcmQpCiB7CiAJdTgJdmFsOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvS2NvbmZpZyBiL2RyaXZlcnMvbGVkcy9LY29uZmlnCmluZGV4IDlkY2M5YjEuLjdhNjI4YzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbGVkcy9LY29uZmlnCkBAIC01ODQsNiArNTg0LDE4IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28gdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgbGVkcy1zZWFkMy4KIAorY29uZmlnIExFRFNfSVMzMUZMMzE5WAorCXRyaXN0YXRlICJMRUQgU3VwcG9ydCBmb3IgSVNTSSBJUzMxRkwzMTl4IEkyQyBMRUQgY29udHJvbGxlciBmYW1pbHkiCisJZGVwZW5kcyBvbiBMRURTX0NMQVNTICYmIEkyQyAmJiBPRgorCXNlbGVjdCBSRUdNQVBfSTJDCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBMRURzIGNvbm5lY3RlZCB0byBJU1NJIElTMzFGTDMxOXgKKwkgIGZhbmN5IExFRCBkcml2ZXIgY2hpcHMgYWNjZXNzZWQgdmlhIHRoZSBJMkMgYnVzLgorCSAgRHJpdmVyIHN1cHBvcnRzIGluZGl2aWR1YWwgUFdNIGJyaWdodG5lc3MgY29udHJvbCBmb3IgZWFjaCBjaGFubmVsLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28gdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgbGVkcy1pczMxZmwzMTl4LgorCiBjb25maWcgTEVEU19JUzMxRkwzMlhYCiAJdHJpc3RhdGUgIkxFRCBzdXBwb3J0IGZvciBJU1NJIElTMzFGTDMyWFggSTJDIExFRCBjb250cm9sbGVyIGZhbWlseSIKIAlkZXBlbmRzIG9uIExFRFNfQ0xBU1MgJiYgSTJDICYmIE9GCkBAIC02MzEsNiArNjQzLDIyIEBACiAJICBUaGlzIG9wdGlvbiBlbmFibGVkIHN1cHBvcnQgZm9yIHRoZSBMRURzIG9uIHRoZSBBUk0gVmVyc2F0aWxlCiAJICBhbmQgUmVhbFZpZXcgYm9hcmRzLiBTYXkgWSB0byBlbmFibGVkIHRoZXNlLgogCitjb25maWcgTEVEU19QTTgwNTgKKwl0cmlzdGF0ZSAiTEVEIFN1cHBvcnQgZm9yIHRoZSBRdWFsY29tbSBQTTgwNTggUE1JQyIKKwlkZXBlbmRzIG9uIE1GRF9QTTg5MjFfQ09SRQorCWRlcGVuZHMgb24gTEVEU19DTEFTUworCWhlbHAKKwkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIExFRCBkcml2ZXJzIGluCisJICB0aGUgUXVhbGNvbW0gUE04MDU4IFBNSUMuCisKK2NvbmZpZyBMRURTX01MWENQTEQKKwl0cmlzdGF0ZSAiTEVEIHN1cHBvcnQgZm9yIHRoZSBNZWxsYW5veCBib2FyZHMiCisJZGVwZW5kcyBvbiBYODZfNjQgJiYgRE1JCisJZGVwZW5kcyBvbiBMRURTX0NMQVNTCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlZCBzdXBwb3J0IGZvciB0aGUgTEVEcyBvbiB0aGUgTWVsbGFub3gKKwkgIGJvYXJkcy4gU2F5IFkgdG8gZW5hYmxlZCB0aGVzZS4KKwogY29tbWVudCAiTEVEIFRyaWdnZXJzIgogc291cmNlICJkcml2ZXJzL2xlZHMvdHJpZ2dlci9LY29uZmlnIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvTWFrZWZpbGUgYi9kcml2ZXJzL2xlZHMvTWFrZWZpbGUKaW5kZXggMDY4NGM4Ni4uMzk2NTA3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbGVkcy9NYWtlZmlsZQpAQCAtNjcsNyArNjcsMTAgQEAKIG9iai0kKENPTkZJR19MRURTX0tURDI2OTIpCQkrPSBsZWRzLWt0ZDI2OTIubwogb2JqLSQoQ09ORklHX0xFRFNfUE9XRVJOVikJCSs9IGxlZHMtcG93ZXJudi5vCiBvYmotJChDT05GSUdfTEVEU19TRUFEMykJCSs9IGxlZHMtc2VhZDMubworb2JqLSQoQ09ORklHX0xFRFNfSVMzMUZMMzE5WCkJCSs9IGxlZHMtaXMzMWZsMzE5eC5vCiBvYmotJChDT05GSUdfTEVEU19JUzMxRkwzMlhYKQkJKz0gbGVkcy1pczMxZmwzMnh4Lm8KK29iai0kKENPTkZJR19MRURTX1BNODA1OCkJCSs9IGxlZHMtcG04MDU4Lm8KK29iai0kKENPTkZJR19MRURTX01MWENQTEQpCQkrPSBsZWRzLW1seGNwbGQubwogCiAjIExFRCBTUEkgRHJpdmVycwogb2JqLSQoQ09ORklHX0xFRFNfREFDMTI0UzA4NSkJCSs9IGxlZHMtZGFjMTI0czA4NS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkLXRyaWdnZXJzLmMgYi9kcml2ZXJzL2xlZHMvbGVkLXRyaWdnZXJzLmMKaW5kZXggYzkyNzAyYS4uNDMxMTIzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZC10cmlnZ2Vycy5jCisrKyBiL2RyaXZlcnMvbGVkcy9sZWQtdHJpZ2dlcnMuYwpAQCAtMTEsNyArMTEsNyBAQAogICoKICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CkBAIC04MSwyMSArODEsMjMgQEAKIAlkb3duX3JlYWQoJmxlZF9jZGV2LT50cmlnZ2VyX2xvY2spOwogCiAJaWYgKCFsZWRfY2Rldi0+dHJpZ2dlcikKLQkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIltub25lXSAiKTsKKwkJbGVuICs9IHNjbnByaW50ZihidWYrbGVuLCBQQUdFX1NJWkUgLSBsZW4sICJbbm9uZV0gIik7CiAJZWxzZQotCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAibm9uZSAiKTsKKwkJbGVuICs9IHNjbnByaW50ZihidWYrbGVuLCBQQUdFX1NJWkUgLSBsZW4sICJub25lICIpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0cmlnLCAmdHJpZ2dlcl9saXN0LCBuZXh0X3RyaWcpIHsKIAkJaWYgKGxlZF9jZGV2LT50cmlnZ2VyICYmICFzdHJjbXAobGVkX2NkZXYtPnRyaWdnZXItPm5hbWUsCiAJCQkJCQkJdHJpZy0+bmFtZSkpCi0JCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiWyVzXSAiLCB0cmlnLT5uYW1lKTsKKwkJCWxlbiArPSBzY25wcmludGYoYnVmK2xlbiwgUEFHRV9TSVpFIC0gbGVuLCAiWyVzXSAiLAorCQkJCQkgdHJpZy0+bmFtZSk7CiAJCWVsc2UKLQkJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICIlcyAiLCB0cmlnLT5uYW1lKTsKKwkJCWxlbiArPSBzY25wcmludGYoYnVmK2xlbiwgUEFHRV9TSVpFIC0gbGVuLCAiJXMgIiwKKwkJCQkJIHRyaWctPm5hbWUpOwogCX0KIAl1cF9yZWFkKCZsZWRfY2Rldi0+dHJpZ2dlcl9sb2NrKTsKIAl1cF9yZWFkKCZ0cmlnZ2Vyc19saXN0X2xvY2spOwogCi0JbGVuICs9IHNwcmludGYobGVuK2J1ZiwgIlxuIik7CisJbGVuICs9IHNjbnByaW50ZihsZW4rYnVmLCBQQUdFX1NJWkUgLSBsZW4sICJcbiIpOwogCXJldHVybiBsZW47CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChsZWRfdHJpZ2dlcl9zaG93KTsKQEAgLTEwOCw2ICsxMTAsOSBAQAogCWNoYXIgKmVudnBbMl07CiAJY29uc3QgY2hhciAqbmFtZTsKIAorCWlmICghbGVkX2NkZXYtPnRyaWdnZXIgJiYgIXRyaWcpCisJCXJldHVybjsKKwogCW5hbWUgPSB0cmlnID8gdHJpZy0+bmFtZSA6ICJub25lIjsKIAlldmVudCA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiVFJJR0dFUj0lcyIsIG5hbWUpOwogCkBAIC0xMzYsNyArMTQxLDkgQEAKIAlpZiAoZXZlbnQpIHsKIAkJZW52cFswXSA9IGV2ZW50OwogCQllbnZwWzFdID0gTlVMTDsKLQkJa29iamVjdF91ZXZlbnRfZW52KCZsZWRfY2Rldi0+ZGV2LT5rb2JqLCBLT0JKX0NIQU5HRSwgZW52cCk7CisJCWlmIChrb2JqZWN0X3VldmVudF9lbnYoJmxlZF9jZGV2LT5kZXYtPmtvYmosIEtPQkpfQ0hBTkdFLCBlbnZwKSkKKwkJCWRldl9lcnIobGVkX2NkZXYtPmRldiwKKwkJCQkiJXM6IEVycm9yIHNlbmRpbmcgdWV2ZW50XG4iLCBfX2Z1bmNfXyk7CiAJCWtmcmVlKGV2ZW50KTsKIAl9CiB9CkBAIC0zNTcsNyArMzY0LDMgQEAKIAlrZnJlZSh0cmlnKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGxlZF90cmlnZ2VyX3VucmVnaXN0ZXJfc2ltcGxlKTsKLQotTU9EVUxFX0FVVEhPUigiUmljaGFyZCBQdXJkaWUiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTEVEIFRyaWdnZXJzIENvcmUiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLWdwaW8uYyBiL2RyaXZlcnMvbGVkcy9sZWRzLWdwaW8uYwppbmRleCA5Yjk5MWQ0Li5kNDAwZGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1ncGlvLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtZ3Bpby5jCkBAIC0yNiwxNSArMjYsMTkgQEAKIAlzdHJ1Y3QgZ3Bpb19kZXNjICpncGlvZDsKIAl1OCBjYW5fc2xlZXA7CiAJdTggYmxpbmtpbmc7Ci0JaW50ICgqcGxhdGZvcm1fZ3Bpb19ibGlua19zZXQpKHN0cnVjdCBncGlvX2Rlc2MgKmRlc2MsIGludCBzdGF0ZSwKLQkJCXVuc2lnbmVkIGxvbmcgKmRlbGF5X29uLCB1bnNpZ25lZCBsb25nICpkZWxheV9vZmYpOworCWdwaW9fYmxpbmtfc2V0X3QgcGxhdGZvcm1fZ3Bpb19ibGlua19zZXQ7CiB9OwogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBncGlvX2xlZF9kYXRhICoKKwkJCWNkZXZfdG9fZ3Bpb19sZWRfZGF0YShzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGxlZF9jZGV2LCBzdHJ1Y3QgZ3Bpb19sZWRfZGF0YSwgY2Rldik7Cit9CisKIHN0YXRpYyB2b2lkIGdwaW9fbGVkX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwKIAllbnVtIGxlZF9icmlnaHRuZXNzIHZhbHVlKQogewotCXN0cnVjdCBncGlvX2xlZF9kYXRhICpsZWRfZGF0ID0KLQkJY29udGFpbmVyX29mKGxlZF9jZGV2LCBzdHJ1Y3QgZ3Bpb19sZWRfZGF0YSwgY2Rldik7CisJc3RydWN0IGdwaW9fbGVkX2RhdGEgKmxlZF9kYXQgPSBjZGV2X3RvX2dwaW9fbGVkX2RhdGEobGVkX2NkZXYpOwogCWludCBsZXZlbDsKIAogCWlmICh2YWx1ZSA9PSBMRURfT0ZGKQpAQCAtNjQsOCArNjgsNyBAQAogc3RhdGljIGludCBncGlvX2JsaW5rX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwKIAl1bnNpZ25lZCBsb25nICpkZWxheV9vbiwgdW5zaWduZWQgbG9uZyAqZGVsYXlfb2ZmKQogewotCXN0cnVjdCBncGlvX2xlZF9kYXRhICpsZWRfZGF0ID0KLQkJY29udGFpbmVyX29mKGxlZF9jZGV2LCBzdHJ1Y3QgZ3Bpb19sZWRfZGF0YSwgY2Rldik7CisJc3RydWN0IGdwaW9fbGVkX2RhdGEgKmxlZF9kYXQgPSBjZGV2X3RvX2dwaW9fbGVkX2RhdGEobGVkX2NkZXYpOwogCiAJbGVkX2RhdC0+YmxpbmtpbmcgPSAxOwogCXJldHVybiBsZWRfZGF0LT5wbGF0Zm9ybV9ncGlvX2JsaW5rX3NldChsZWRfZGF0LT5ncGlvZCwgR1BJT19MRURfQkxJTkssCkBAIC03NCw4ICs3Nyw3IEBACiAKIHN0YXRpYyBpbnQgY3JlYXRlX2dwaW9fbGVkKGNvbnN0IHN0cnVjdCBncGlvX2xlZCAqdGVtcGxhdGUsCiAJc3RydWN0IGdwaW9fbGVkX2RhdGEgKmxlZF9kYXQsIHN0cnVjdCBkZXZpY2UgKnBhcmVudCwKLQlpbnQgKCpibGlua19zZXQpKHN0cnVjdCBncGlvX2Rlc2MgKiwgaW50LCB1bnNpZ25lZCBsb25nICosCi0JCQkgdW5zaWduZWQgbG9uZyAqKSkKKwlncGlvX2JsaW5rX3NldF90IGJsaW5rX3NldCkKIHsKIAlpbnQgcmV0LCBzdGF0ZTsKIApAQCAtMTIwLDEwICsxMjIsMTMgQEAKIAkJbGVkX2RhdC0+cGxhdGZvcm1fZ3Bpb19ibGlua19zZXQgPSBibGlua19zZXQ7CiAJCWxlZF9kYXQtPmNkZXYuYmxpbmtfc2V0ID0gZ3Bpb19ibGlua19zZXQ7CiAJfQotCWlmICh0ZW1wbGF0ZS0+ZGVmYXVsdF9zdGF0ZSA9PSBMRURTX0dQSU9fREVGU1RBVEVfS0VFUCkKLQkJc3RhdGUgPSAhIWdwaW9kX2dldF92YWx1ZV9jYW5zbGVlcChsZWRfZGF0LT5ncGlvZCk7Ci0JZWxzZQorCWlmICh0ZW1wbGF0ZS0+ZGVmYXVsdF9zdGF0ZSA9PSBMRURTX0dQSU9fREVGU1RBVEVfS0VFUCkgeworCQlzdGF0ZSA9IGdwaW9kX2dldF92YWx1ZV9jYW5zbGVlcChsZWRfZGF0LT5ncGlvZCk7CisJCWlmIChzdGF0ZSA8IDApCisJCQlyZXR1cm4gc3RhdGU7CisJfSBlbHNlIHsKIAkJc3RhdGUgPSAodGVtcGxhdGUtPmRlZmF1bHRfc3RhdGUgPT0gTEVEU19HUElPX0RFRlNUQVRFX09OKTsKKwl9CiAJbGVkX2RhdC0+Y2Rldi5icmlnaHRuZXNzID0gc3RhdGUgPyBMRURfRlVMTCA6IExFRF9PRkY7CiAJaWYgKCF0ZW1wbGF0ZS0+cmV0YWluX3N0YXRlX3N1c3BlbmRlZCkKIAkJbGVkX2RhdC0+Y2Rldi5mbGFncyB8PSBMRURfQ09SRV9TVVNQRU5EUkVTVU1FOwpAQCAtMTM0LDcgKzEzOSw3IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlyZXR1cm4gbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKHBhcmVudCwgJmxlZF9kYXQtPmNkZXYpOworCXJldHVybiBkZXZtX2xlZF9jbGFzc2Rldl9yZWdpc3RlcihwYXJlbnQsICZsZWRfZGF0LT5jZGV2KTsKIH0KIAogc3RydWN0IGdwaW9fbGVkc19wcml2IHsKQEAgLTE1NCw3ICsxNTksNiBAQAogCXN0cnVjdCBmd25vZGVfaGFuZGxlICpjaGlsZDsKIAlzdHJ1Y3QgZ3Bpb19sZWRzX3ByaXYgKnByaXY7CiAJaW50IGNvdW50LCByZXQ7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKIAogCWNvdW50ID0gZGV2aWNlX2dldF9jaGlsZF9ub2RlX2NvdW50KGRldik7CiAJaWYgKCFjb3VudCkKQEAgLTE2OCwyNiArMTcyLDIyIEBACiAJCXN0cnVjdCBncGlvX2xlZF9kYXRhICpsZWRfZGF0ID0gJnByaXYtPmxlZHNbcHJpdi0+bnVtX2xlZHNdOwogCQlzdHJ1Y3QgZ3Bpb19sZWQgbGVkID0ge307CiAJCWNvbnN0IGNoYXIgKnN0YXRlID0gTlVMTDsKKwkJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHRvX29mX25vZGUoY2hpbGQpOwogCiAJCWxlZC5ncGlvZCA9IGRldm1fZ2V0X2dwaW9kX2Zyb21fY2hpbGQoZGV2LCBOVUxMLCBjaGlsZCk7CiAJCWlmIChJU19FUlIobGVkLmdwaW9kKSkgewogCQkJZndub2RlX2hhbmRsZV9wdXQoY2hpbGQpOwotCQkJcmV0ID0gUFRSX0VSUihsZWQuZ3Bpb2QpOwotCQkJZ290byBlcnI7CisJCQlyZXR1cm4gRVJSX0NBU1QobGVkLmdwaW9kKTsKIAkJfQogCi0JCW5wID0gdG9fb2Zfbm9kZShjaGlsZCk7Ci0KLQkJaWYgKGZ3bm9kZV9wcm9wZXJ0eV9wcmVzZW50KGNoaWxkLCAibGFiZWwiKSkgewotCQkJZndub2RlX3Byb3BlcnR5X3JlYWRfc3RyaW5nKGNoaWxkLCAibGFiZWwiLCAmbGVkLm5hbWUpOwotCQl9IGVsc2UgewotCQkJaWYgKElTX0VOQUJMRUQoQ09ORklHX09GKSAmJiAhbGVkLm5hbWUgJiYgbnApCi0JCQkJbGVkLm5hbWUgPSBucC0+bmFtZTsKLQkJCWlmICghbGVkLm5hbWUpIHsKLQkJCQlyZXQgPSAtRUlOVkFMOwotCQkJCWdvdG8gZXJyOwotCQkJfQorCQlyZXQgPSBmd25vZGVfcHJvcGVydHlfcmVhZF9zdHJpbmcoY2hpbGQsICJsYWJlbCIsICZsZWQubmFtZSk7CisJCWlmIChyZXQgJiYgSVNfRU5BQkxFRChDT05GSUdfT0YpICYmIG5wKQorCQkJbGVkLm5hbWUgPSBucC0+bmFtZTsKKwkJaWYgKCFsZWQubmFtZSkgeworCQkJZndub2RlX2hhbmRsZV9wdXQoY2hpbGQpOworCQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJCX0KKwogCQlmd25vZGVfcHJvcGVydHlfcmVhZF9zdHJpbmcoY2hpbGQsICJsaW51eCxkZWZhdWx0LXRyaWdnZXIiLAogCQkJCQkgICAgJmxlZC5kZWZhdWx0X3RyaWdnZXIpOwogCkBAIC0yMDksMTggKzIwOSwxMyBAQAogCQlyZXQgPSBjcmVhdGVfZ3Bpb19sZWQoJmxlZCwgbGVkX2RhdCwgZGV2LCBOVUxMKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWZ3bm9kZV9oYW5kbGVfcHV0KGNoaWxkKTsKLQkJCWdvdG8gZXJyOworCQkJcmV0dXJuIEVSUl9QVFIocmV0KTsKIAkJfQogCQlsZWRfZGF0LT5jZGV2LmRldi0+b2Zfbm9kZSA9IG5wOwogCQlwcml2LT5udW1fbGVkcysrOwogCX0KIAogCXJldHVybiBwcml2OwotCi1lcnI6Ci0JZm9yIChjb3VudCA9IHByaXYtPm51bV9sZWRzIC0gMTsgY291bnQgPj0gMDsgY291bnQtLSkKLQkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJnByaXYtPmxlZHNbY291bnRdLmNkZXYpOwotCXJldHVybiBFUlJfUFRSKHJldCk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX2dwaW9fbGVkc19tYXRjaFtdID0gewpAQCAtMjQ4LDEzICsyNDMsOCBAQAogCQkJcmV0ID0gY3JlYXRlX2dwaW9fbGVkKCZwZGF0YS0+bGVkc1tpXSwKIAkJCQkJICAgICAgJnByaXYtPmxlZHNbaV0sCiAJCQkJCSAgICAgICZwZGV2LT5kZXYsIHBkYXRhLT5ncGlvX2JsaW5rX3NldCk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCS8qIE9uIGZhaWx1cmU6IHVud2luZCB0aGUgbGVkIGNyZWF0aW9ucyAqLwotCQkJCWZvciAoaSA9IGkgLSAxOyBpID49IDA7IGktLSkKLQkJCQkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoCi0JCQkJCQkJJnByaXYtPmxlZHNbaV0uY2Rldik7CisJCQlpZiAocmV0IDwgMCkKIAkJCQlyZXR1cm4gcmV0OwotCQkJfQogCQl9CiAJfSBlbHNlIHsKIAkJcHJpdiA9IGdwaW9fbGVkc19jcmVhdGUocGRldik7CkBAIC0yNjcsMTcgKzI1Nyw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZ3Bpb19sZWRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGdwaW9fbGVkc19wcml2ICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+bnVtX2xlZHM7IGkrKykKLQkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJnByaXYtPmxlZHNbaV0uY2Rldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHZvaWQgZ3Bpb19sZWRfc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZ3Bpb19sZWRzX3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKQEAgLTI5Miw3ICsyNzEsNiBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBncGlvX2xlZF9kcml2ZXIgPSB7CiAJLnByb2JlCQk9IGdwaW9fbGVkX3Byb2JlLAotCS5yZW1vdmUJCT0gZ3Bpb19sZWRfcmVtb3ZlLAogCS5zaHV0ZG93bgk9IGdwaW9fbGVkX3NodXRkb3duLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJsZWRzLWdwaW8iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtaXMzMWZsMzE5eC5jIGIvZHJpdmVycy9sZWRzL2xlZHMtaXMzMWZsMzE5eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMjMzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1pczMxZmwzMTl4LmMKQEAgLTAsMCArMSw0NTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNS0xNiBHb2xkZW4gRGVsaWNpb3VzIENvbXB1dGVycworICoKKyAqIEF1dGhvcjogTmlrb2xhdXMgU2NoYWxsZXIgPGhuc0Bnb2xkZWxpY28uY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluCisgKiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogTEVEIGRyaXZlciBmb3IgdGhlIElTMzFGTDMxOXswLDEsMyw2LDl9IHRvIGRyaXZlIDEsIDMsIDYgb3IgOSBsaWdodAorICogZWZmZWN0IExFRHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKy8qIHJlZ2lzdGVyIG51bWJlcnMgKi8KKyNkZWZpbmUgSVMzMUZMMzE5WF9TSFVURE9XTgkJMHgwMAorI2RlZmluZSBJUzMxRkwzMTlYX0NUUkwxCQkweDAxCisjZGVmaW5lIElTMzFGTDMxOVhfQ1RSTDIJCTB4MDIKKyNkZWZpbmUgSVMzMUZMMzE5WF9DT05GSUcxCQkweDAzCisjZGVmaW5lIElTMzFGTDMxOVhfQ09ORklHMgkJMHgwNAorI2RlZmluZSBJUzMxRkwzMTlYX1JBTVBfTU9ERQkJMHgwNQorI2RlZmluZSBJUzMxRkwzMTlYX0JSRUFUSF9NQVNLCQkweDA2CisjZGVmaW5lIElTMzFGTDMxOVhfUFdNKGNoYW5uZWwpCQkoMHgwNyArIGNoYW5uZWwpCisjZGVmaW5lIElTMzFGTDMxOVhfREFUQV9VUERBVEUJCTB4MTAKKyNkZWZpbmUgSVMzMUZMMzE5WF9UMChjaGFubmVsKQkJKDB4MTEgKyBjaGFubmVsKQorI2RlZmluZSBJUzMxRkwzMTlYX1QxMjNfMQkJMHgxYQorI2RlZmluZSBJUzMxRkwzMTlYX1QxMjNfMgkJMHgxYgorI2RlZmluZSBJUzMxRkwzMTlYX1QxMjNfMwkJMHgxYworI2RlZmluZSBJUzMxRkwzMTlYX1Q0KGNoYW5uZWwpCQkoMHgxZCArIGNoYW5uZWwpCisjZGVmaW5lIElTMzFGTDMxOVhfVElNRV9VUERBVEUJCTB4MjYKKyNkZWZpbmUgSVMzMUZMMzE5WF9SRVNFVAkJMHhmZgorCisjZGVmaW5lIElTMzFGTDMxOVhfUkVHX0NOVAkJKElTMzFGTDMxOVhfUkVTRVQgKyAxKQorCisjZGVmaW5lIElTMzFGTDMxOVhfTUFYX0xFRFMJCTkKKworLyogQ1MgKEN1cnJlbnQgU2V0dGluZykgaW4gQ09ORklHMiByZWdpc3RlciAqLworI2RlZmluZSBJUzMxRkwzMTlYX0NPTkZJRzJfQ1NfU0hJRlQJNAorI2RlZmluZSBJUzMxRkwzMTlYX0NPTkZJRzJfQ1NfTUFTSwkweDcKKyNkZWZpbmUgSVMzMUZMMzE5WF9DT05GSUcyX0NTX1NURVBfUkVGCTEyCisKKyNkZWZpbmUgSVMzMUZMMzE5WF9DVVJSRU5UX01JTgkJKCh1MzIpNTAwMCkKKyNkZWZpbmUgSVMzMUZMMzE5WF9DVVJSRU5UX01BWAkJKCh1MzIpNDAwMDApCisjZGVmaW5lIElTMzFGTDMxOVhfQ1VSUkVOVF9TVEVQCQkoKHUzMik1MDAwKQorI2RlZmluZSBJUzMxRkwzMTlYX0NVUlJFTlRfREVGQVVMVAkoKHUzMikyMDAwMCkKKworLyogQXVkaW8gZ2FpbiBpbiBDT05GSUcyIHJlZ2lzdGVyICovCisjZGVmaW5lIElTMzFGTDMxOVhfQVVESU9fR0FJTl9EQl9NQVgJKCh1MzIpMjEpCisjZGVmaW5lIElTMzFGTDMxOVhfQVVESU9fR0FJTl9EQl9TVEVQCSgodTMyKTMpCisKKy8qCisgKiByZWdtYXAgaXMgdXNlZCBhcyBhIGNhY2hlIG9mIGNoaXAncyByZWdpc3RlciBzcGFjZSwKKyAqIHRvIGF2b2lkIHJlYWRpbmcgYmFjayBicmlnaHRuZXNzIHZhbHVlcyBmcm9tIGNoaXAsCisgKiB3aGljaCBpcyBrbm93biB0byBoYW5nLgorICovCitzdHJ1Y3QgaXMzMWZsMzE5eF9jaGlwIHsKKwljb25zdCBzdHJ1Y3QgaXMzMWZsMzE5eF9jaGlwZGVmICpjZGVmOworCXN0cnVjdCBpMmNfY2xpZW50ICAgICAgICAgICAgICAgKmNsaWVudDsKKwlzdHJ1Y3QgcmVnbWFwICAgICAgICAgICAgICAgICAgICpyZWdtYXA7CisJc3RydWN0IG11dGV4ICAgICAgICAgICAgICAgICAgICBsb2NrOworCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZ2Fpbl9kYjsKKworCXN0cnVjdCBpczMxZmwzMTl4X2xlZCB7CisJCXN0cnVjdCBpczMxZmwzMTl4X2NoaXAgICpjaGlwOworCQlzdHJ1Y3QgbGVkX2NsYXNzZGV2ICAgICBjZGV2OworCQl1MzIgICAgICAgICAgICAgICAgICAgICBtYXhfbWljcm9hbXA7CisJCWJvb2wgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQ7CisJfSBsZWRzW0lTMzFGTDMxOVhfTUFYX0xFRFNdOworfTsKKworc3RydWN0IGlzMzFmbDMxOXhfY2hpcGRlZiB7CisJaW50IG51bV9sZWRzOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpczMxZmwzMTl4X2NoaXBkZWYgaXMzMWZsMzE5MF9jZGVmID0geworCS5udW1fbGVkcyA9IDEsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlzMzFmbDMxOXhfY2hpcGRlZiBpczMxZmwzMTkzX2NkZWYgPSB7CisJLm51bV9sZWRzID0gMywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXMzMWZsMzE5eF9jaGlwZGVmIGlzMzFmbDMxOTZfY2RlZiA9IHsKKwkubnVtX2xlZHMgPSA2LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpczMxZmwzMTl4X2NoaXBkZWYgaXMzMWZsMzE5OV9jZGVmID0geworCS5udW1fbGVkcyA9IDksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvZl9pczMxZmwzMTl4X21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJpc3NpLGlzMzFmbDMxOTAiLCAuZGF0YSA9ICZpczMxZmwzMTkwX2NkZWYsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJpc3NpLGlzMzFmbDMxOTEiLCAuZGF0YSA9ICZpczMxZmwzMTkwX2NkZWYsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJpc3NpLGlzMzFmbDMxOTMiLCAuZGF0YSA9ICZpczMxZmwzMTkzX2NkZWYsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJpc3NpLGlzMzFmbDMxOTYiLCAuZGF0YSA9ICZpczMxZmwzMTk2X2NkZWYsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJpc3NpLGlzMzFmbDMxOTkiLCAuZGF0YSA9ICZpczMxZmwzMTk5X2NkZWYsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJzaS1lbixzbjMxOTkiLCAgICAuZGF0YSA9ICZpczMxZmwzMTk5X2NkZWYsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgb2ZfaXMzMWZsMzE5eF9tYXRjaCk7CisKK3N0YXRpYyBpbnQgaXMzMWZsMzE5eF9icmlnaHRuZXNzX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpjZGV2LAorCQkJCSAgICAgZW51bSBsZWRfYnJpZ2h0bmVzcyBicmlnaHRuZXNzKQoreworCXN0cnVjdCBpczMxZmwzMTl4X2xlZCAqbGVkID0gY29udGFpbmVyX29mKGNkZXYsIHN0cnVjdCBpczMxZmwzMTl4X2xlZCwKKwkJCQkJCSAgY2Rldik7CisJc3RydWN0IGlzMzFmbDMxOXhfY2hpcCAqaXMzMSA9IGxlZC0+Y2hpcDsKKwlpbnQgY2hhbiA9IGxlZCAtIGlzMzEtPmxlZHM7CisJaW50IHJldDsKKwlpbnQgaTsKKwl1OCBjdHJsMSA9IDAsIGN0cmwyID0gMDsKKworCWRldl9kYmcoJmlzMzEtPmNsaWVudC0+ZGV2LCAiJXMgJWQ6ICVkXG4iLCBfX2Z1bmNfXywgY2hhbiwgYnJpZ2h0bmVzcyk7CisKKwltdXRleF9sb2NrKCZpczMxLT5sb2NrKTsKKworCS8qIHVwZGF0ZSBQV00gcmVnaXN0ZXIgKi8KKwlyZXQgPSByZWdtYXBfd3JpdGUoaXMzMS0+cmVnbWFwLCBJUzMxRkwzMTlYX1BXTShjaGFuKSwgYnJpZ2h0bmVzcyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJLyogcmVhZCBjdXJyZW50IGJyaWdodG5lc3Mgb2YgYWxsIFBXTSBjaGFubmVscyAqLworCWZvciAoaSA9IDA7IGkgPCBpczMxLT5jZGVmLT5udW1fbGVkczsgaSsrKSB7CisJCXVuc2lnbmVkIGludCBwd21fdmFsdWU7CisJCWJvb2wgb247CisKKwkJLyoKKwkJICogc2luY2UgbmVpdGhlciBjZGV2IG5vciB0aGUgY2hpcCBjYW4gcHJvdmlkZQorCQkgKiB0aGUgY3VycmVudCBzZXR0aW5nLCB3ZSByZWFkIGZyb20gdGhlIHJlZ21hcCBjYWNoZQorCQkgKi8KKworCQlyZXQgPSByZWdtYXBfcmVhZChpczMxLT5yZWdtYXAsIElTMzFGTDMxOVhfUFdNKGkpLCAmcHdtX3ZhbHVlKTsKKwkJZGV2X2RiZygmaXMzMS0+Y2xpZW50LT5kZXYsICIlcyByZWFkICVkOiByZXQ9JWQ6ICVkXG4iLAorCQkJX19mdW5jX18sIGksIHJldCwgcHdtX3ZhbHVlKTsKKwkJb24gPSByZXQgPj0gMCAmJiBwd21fdmFsdWUgPiBMRURfT0ZGOworCisJCWlmIChpIDwgMykKKwkJCWN0cmwxIHw9IG9uIDw8IGk7ICAgICAgIC8qIDAuLjIgPT4gYml0IDAuLjIgKi8KKwkJZWxzZSBpZiAoaSA8IDYpCisJCQljdHJsMSB8PSBvbiA8PCAoaSArIDEpOyAvKiAzLi41ID0+IGJpdCA0Li42ICovCisJCWVsc2UKKwkJCWN0cmwyIHw9IG9uIDw8IChpIC0gNik7IC8qIDYuLjggPT4gYml0IDAuLjIgKi8KKwl9CisKKwlpZiAoY3RybDEgPiAwIHx8IGN0cmwyID4gMCkgeworCQlkZXZfZGJnKCZpczMxLT5jbGllbnQtPmRldiwgInBvd2VyIHVwICUwMnggJTAyeFxuIiwKKwkJCWN0cmwxLCBjdHJsMik7CisJCXJlZ21hcF93cml0ZShpczMxLT5yZWdtYXAsIElTMzFGTDMxOVhfQ1RSTDEsIGN0cmwxKTsKKwkJcmVnbWFwX3dyaXRlKGlzMzEtPnJlZ21hcCwgSVMzMUZMMzE5WF9DVFJMMiwgY3RybDIpOworCQkvKiB1cGRhdGUgUFdNcyAqLworCQlyZWdtYXBfd3JpdGUoaXMzMS0+cmVnbWFwLCBJUzMxRkwzMTlYX0RBVEFfVVBEQVRFLCAweDAwKTsKKwkJLyogZW5hYmxlIGNoaXAgZnJvbSBzaHV0IGRvd24gKi8KKwkJcmV0ID0gcmVnbWFwX3dyaXRlKGlzMzEtPnJlZ21hcCwgSVMzMUZMMzE5WF9TSFVURE9XTiwgMHgwMSk7CisJfSBlbHNlIHsKKwkJZGV2X2RiZygmaXMzMS0+Y2xpZW50LT5kZXYsICJwb3dlciBkb3duXG4iKTsKKwkJLyogc2h1dCBkb3duIChubyBuZWVkIHRvIGNsZWFyIENUUkwxLzIpICovCisJCXJldCA9IHJlZ21hcF93cml0ZShpczMxLT5yZWdtYXAsIElTMzFGTDMxOVhfU0hVVERPV04sIDB4MDApOworCX0KKworb3V0OgorCW11dGV4X3VubG9jaygmaXMzMS0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGlzMzFmbDMxOXhfcGFyc2VfY2hpbGRfZHQoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpjaGlsZCwKKwkJCQkgICAgIHN0cnVjdCBpczMxZmwzMTl4X2xlZCAqbGVkKQoreworCXN0cnVjdCBsZWRfY2xhc3NkZXYgKmNkZXYgPSAmbGVkLT5jZGV2OworCWludCByZXQ7CisKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcoY2hpbGQsICJsYWJlbCIsICZjZGV2LT5uYW1lKSkKKwkJY2Rldi0+bmFtZSA9IGNoaWxkLT5uYW1lOworCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcoY2hpbGQsICJsaW51eCxkZWZhdWx0LXRyaWdnZXIiLAorCQkJCSAgICAgICZjZGV2LT5kZWZhdWx0X3RyaWdnZXIpOworCWlmIChyZXQgPCAwICYmIHJldCAhPSAtRUlOVkFMKSAvKiBpcyBvcHRpb25hbCAqLworCQlyZXR1cm4gcmV0OworCisJbGVkLT5tYXhfbWljcm9hbXAgPSBJUzMxRkwzMTlYX0NVUlJFTlRfREVGQVVMVDsKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihjaGlsZCwgImxlZC1tYXgtbWljcm9hbXAiLAorCQkJCSAgICZsZWQtPm1heF9taWNyb2FtcCk7CisJaWYgKCFyZXQpIHsKKwkJaWYgKGxlZC0+bWF4X21pY3JvYW1wIDwgSVMzMUZMMzE5WF9DVVJSRU5UX01JTikKKwkJCXJldHVybiAtRUlOVkFMOwkvKiBub3Qgc3VwcG9ydGVkICovCisJCWxlZC0+bWF4X21pY3JvYW1wID0gbWluKGxlZC0+bWF4X21pY3JvYW1wLAorCQkJCQkgIElTMzFGTDMxOVhfQ1VSUkVOVF9NQVgpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlzMzFmbDMxOXhfcGFyc2VfZHQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpczMxZmwzMTl4X2NoaXAgKmlzMzEpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZSwgKmNoaWxkOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2Rldl9pZDsKKwlpbnQgY291bnQ7CisJaW50IHJldDsKKworCWlmICghbnApCisJCXJldHVybiAtRU5PREVWOworCisJb2ZfZGV2X2lkID0gb2ZfbWF0Y2hfZGV2aWNlKG9mX2lzMzFmbDMxOXhfbWF0Y2gsIGRldik7CisJaWYgKCFvZl9kZXZfaWQpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gbWF0Y2ggZGV2aWNlIHdpdGggc3VwcG9ydGVkIGNoaXBzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaXMzMS0+Y2RlZiA9IG9mX2Rldl9pZC0+ZGF0YTsKKworCWNvdW50ID0gb2ZfZ2V0X2NoaWxkX2NvdW50KG5wKTsKKworCWRldl9kYmcoZGV2LCAicHJvYmUgJXMgd2l0aCAlZCBsZWRzIGRlZmluZWQgaW4gRFRcbiIsCisJCW9mX2Rldl9pZC0+Y29tcGF0aWJsZSwgY291bnQpOworCisJaWYgKCFjb3VudCB8fCBjb3VudCA+IGlzMzEtPmNkZWYtPm51bV9sZWRzKSB7CisJCWRldl9lcnIoZGV2LCAiTnVtYmVyIG9mIGxlZHMgZGVmaW5lZCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgJXVcbiIsCisJCQlpczMxLT5jZGVmLT5udW1fbGVkcyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWZvcl9lYWNoX2NoaWxkX29mX25vZGUobnAsIGNoaWxkKSB7CisJCXN0cnVjdCBpczMxZmwzMTl4X2xlZCAqbGVkOworCQl1MzIgcmVnOworCisJCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGNoaWxkLCAicmVnIiwgJnJlZyk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlYWQgbGVkICdyZWcnIHByb3BlcnR5XG4iKTsKKwkJCWdvdG8gcHV0X2NoaWxkX25vZGU7CisJCX0KKworCQlpZiAocmVnIDwgMSB8fCByZWcgPiBpczMxLT5jZGVmLT5udW1fbGVkcykgeworCQkJZGV2X2VycihkZXYsICJpbnZhbGlkIGxlZCByZWcgJXVcbiIsIHJlZyk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBwdXRfY2hpbGRfbm9kZTsKKwkJfQorCisJCWxlZCA9ICZpczMxLT5sZWRzW3JlZyAtIDFdOworCisJCWlmIChsZWQtPmNvbmZpZ3VyZWQpIHsKKwkJCWRldl9lcnIoZGV2LCAibGVkICV1IGlzIGFscmVhZHkgY29uZmlndXJlZFxuIiwgcmVnKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIHB1dF9jaGlsZF9ub2RlOworCQl9CisKKwkJcmV0ID0gaXMzMWZsMzE5eF9wYXJzZV9jaGlsZF9kdChkZXYsIGNoaWxkLCBsZWQpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldiwgImxlZCAldSBEVCBwYXJzaW5nIGZhaWxlZFxuIiwgcmVnKTsKKwkJCWdvdG8gcHV0X2NoaWxkX25vZGU7CisJCX0KKworCQlsZWQtPmNvbmZpZ3VyZWQgPSB0cnVlOworCX0KKworCWlzMzEtPmF1ZGlvX2dhaW5fZGIgPSAwOworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiYXVkaW8tZ2Fpbi1kYiIsICZpczMxLT5hdWRpb19nYWluX2RiKTsKKwlpZiAoIXJldCkKKwkJaXMzMS0+YXVkaW9fZ2Fpbl9kYiA9IG1pbihpczMxLT5hdWRpb19nYWluX2RiLAorCQkJCQkgIElTMzFGTDMxOVhfQVVESU9fR0FJTl9EQl9NQVgpOworCisJcmV0dXJuIDA7CisKK3B1dF9jaGlsZF9ub2RlOgorCW9mX25vZGVfcHV0KGNoaWxkKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgYm9vbCBpczMxZmwzMTl4X3JlYWRhYmxlX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7IC8qIHdlIGhhdmUgbm8gcmVhZGFibGUgcmVnaXN0ZXJzICovCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBpczMxZmwzMTl4X3ZvbGF0aWxlX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7IC8qIHZvbGF0aWxlIHJlZ2lzdGVycyBhcmUgbm90IGNhY2hlZCAqLworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBJUzMxRkwzMTlYX0RBVEFfVVBEQVRFOgorCWNhc2UgSVMzMUZMMzE5WF9USU1FX1VQREFURToKKwljYXNlIElTMzFGTDMxOVhfUkVTRVQ6CisJCXJldHVybiB0cnVlOyAvKiBhbHdheXMgd3JpdGUtdGhyb3VnaCAqLworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX2RlZmF1bHQgaXMzMWZsMzE5eF9yZWdfZGVmYXVsdHNbXSA9IHsKKwl7IElTMzFGTDMxOVhfQ09ORklHMSwgMHgwMH0sCisJeyBJUzMxRkwzMTlYX0NPTkZJRzIsIDB4MDB9LAorCXsgSVMzMUZMMzE5WF9QV00oMCksIDB4MDB9LAorCXsgSVMzMUZMMzE5WF9QV00oMSksIDB4MDB9LAorCXsgSVMzMUZMMzE5WF9QV00oMiksIDB4MDB9LAorCXsgSVMzMUZMMzE5WF9QV00oMyksIDB4MDB9LAorCXsgSVMzMUZMMzE5WF9QV00oNCksIDB4MDB9LAorCXsgSVMzMUZMMzE5WF9QV00oNSksIDB4MDB9LAorCXsgSVMzMUZMMzE5WF9QV00oNiksIDB4MDB9LAorCXsgSVMzMUZMMzE5WF9QV00oNyksIDB4MDB9LAorCXsgSVMzMUZMMzE5WF9QV00oOCksIDB4MDB9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWdtYXBfY29uZmlnIHJlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzID0gOCwKKwkudmFsX2JpdHMgPSA4LAorCS5tYXhfcmVnaXN0ZXIgPSBJUzMxRkwzMTlYX1JFR19DTlQsCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9GTEFULAorCS5yZWFkYWJsZV9yZWcgPSBpczMxZmwzMTl4X3JlYWRhYmxlX3JlZywKKwkudm9sYXRpbGVfcmVnID0gaXMzMWZsMzE5eF92b2xhdGlsZV9yZWcsCisJLnJlZ19kZWZhdWx0cyA9IGlzMzFmbDMxOXhfcmVnX2RlZmF1bHRzLAorCS5udW1fcmVnX2RlZmF1bHRzID0gQVJSQVlfU0laRShpczMxZmwzMTl4X3JlZ19kZWZhdWx0cyksCit9OworCitzdGF0aWMgaW5saW5lIGludCBpczMxZmwzMTl4X21pY3JvYW1wX3RvX2NzKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIG1pY3JvYW1wKQoreyAvKiByb3VuZCBkb3duIHRvIG5lYXJlc3Qgc3VwcG9ydGVkIHZhbHVlIChyYW5nZSBjaGVjayBkb25lIGJ5IGNhbGxlcikgKi8KKwl1MzIgc3RlcCA9IG1pY3JvYW1wIC8gSVMzMUZMMzE5WF9DVVJSRU5UX1NURVA7CisKKwlyZXR1cm4gKChJUzMxRkwzMTlYX0NPTkZJRzJfQ1NfU1RFUF9SRUYgLSBzdGVwKSAmCisJCUlTMzFGTDMxOVhfQ09ORklHMl9DU19NQVNLKSA8PAorCQlJUzMxRkwzMTlYX0NPTkZJRzJfQ1NfU0hJRlQ7IC8qIENTIGVuY29kaW5nICovCit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzMzFmbDMxOXhfZGJfdG9fZ2Fpbih1MzIgZGV6aWJlbCkKK3sgLyogcm91bmQgZG93biB0byBuZWFyZXN0IHN1cHBvcnRlZCB2YWx1ZSAocmFuZ2UgY2hlY2sgZG9uZSBieSBjYWxsZXIpICovCisJcmV0dXJuIGRlemliZWwgLyBJUzMxRkwzMTlYX0FVRElPX0dBSU5fREJfU1RFUDsKK30KKworc3RhdGljIGludCBpczMxZmwzMTl4X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBpczMxZmwzMTl4X2NoaXAgKmlzMzE7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IHRvX2kyY19hZGFwdGVyKGRldi0+cGFyZW50KTsKKwlpbnQgZXJyOworCWludCBpID0gMDsKKwl1MzIgYWdncmVnYXRlZF9sZWRfbWljcm9hbXAgPSBJUzMxRkwzMTlYX0NVUlJFTlRfTUFYOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19JMkMpKQorCQlyZXR1cm4gLUVJTzsKKworCWlzMzEgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKmlzMzEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlzMzEpCisJCXJldHVybiAtRU5PTUVNOworCisJbXV0ZXhfaW5pdCgmaXMzMS0+bG9jayk7CisKKwllcnIgPSBpczMxZmwzMTl4X3BhcnNlX2R0KCZjbGllbnQtPmRldiwgaXMzMSk7CisJaWYgKGVycikKKwkJZ290byBmcmVlX211dGV4OworCisJaXMzMS0+Y2xpZW50ID0gY2xpZW50OworCWlzMzEtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGNsaWVudCwgJnJlZ21hcF9jb25maWcpOworCWlmIChJU19FUlIoaXMzMS0+cmVnbWFwKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSByZWdpc3RlciBtYXBcbiIpOworCQllcnIgPSBQVFJfRVJSKGlzMzEtPnJlZ21hcCk7CisJCWdvdG8gZnJlZV9tdXRleDsKKwl9CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBpczMxKTsKKworCS8qIGNoZWNrIGZvciB3cml0ZS1yZXBseSBmcm9tIGNoaXAgKHdlIGNhbid0IHJlYWQgYW55IHJlZ2lzdGVycykgKi8KKwllcnIgPSByZWdtYXBfd3JpdGUoaXMzMS0+cmVnbWFwLCBJUzMxRkwzMTlYX1JFU0VULCAweDAwKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIm5vIHJlc3BvbnNlIGZyb20gY2hpcCB3cml0ZTogZXJyID0gJWRcbiIsCisJCQllcnIpOworCQllcnIgPSAtRUlPOyAvKiBkb2VzIG5vdCBhbnN3ZXIgKi8KKwkJZ290byBmcmVlX211dGV4OworCX0KKworCS8qCisJICogS2VybmVsIGNvbnZlbnRpb25zIHJlcXVpcmUgcGVyLUxFRCBsZWQtbWF4LW1pY3JvYW1wIHByb3BlcnR5LgorCSAqIEJ1dCB0aGUgY2hpcCBkb2VzIG5vdCBhbGxvdyB0byBsaW1pdCBpbmRpdmlkdWFsIExFRHMuCisJICogU28gd2UgdGFrZSBtaW5pbXVtIGZyb20gYWxsIHN1Ym5vZGVzIGZvciBzYWZldHkgb2YgaGFyZHdhcmUuCisJICovCisJZm9yIChpID0gMDsgaSA8IGlzMzEtPmNkZWYtPm51bV9sZWRzOyBpKyspCisJCWlmIChpczMxLT5sZWRzW2ldLmNvbmZpZ3VyZWQgJiYKKwkJICAgIGlzMzEtPmxlZHNbaV0ubWF4X21pY3JvYW1wIDwgYWdncmVnYXRlZF9sZWRfbWljcm9hbXApCisJCQlhZ2dyZWdhdGVkX2xlZF9taWNyb2FtcCA9IGlzMzEtPmxlZHNbaV0ubWF4X21pY3JvYW1wOworCisJcmVnbWFwX3dyaXRlKGlzMzEtPnJlZ21hcCwgSVMzMUZMMzE5WF9DT05GSUcyLAorCQkgICAgIGlzMzFmbDMxOXhfbWljcm9hbXBfdG9fY3MoZGV2LCBhZ2dyZWdhdGVkX2xlZF9taWNyb2FtcCkgfAorCQkgICAgIGlzMzFmbDMxOXhfZGJfdG9fZ2FpbihpczMxLT5hdWRpb19nYWluX2RiKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaXMzMS0+Y2RlZi0+bnVtX2xlZHM7IGkrKykgeworCQlzdHJ1Y3QgaXMzMWZsMzE5eF9sZWQgKmxlZCA9ICZpczMxLT5sZWRzW2ldOworCisJCWlmICghbGVkLT5jb25maWd1cmVkKQorCQkJY29udGludWU7CisKKwkJbGVkLT5jaGlwID0gaXMzMTsKKwkJbGVkLT5jZGV2LmJyaWdodG5lc3Nfc2V0X2Jsb2NraW5nID0gaXMzMWZsMzE5eF9icmlnaHRuZXNzX3NldDsKKworCQllcnIgPSBkZXZtX2xlZF9jbGFzc2Rldl9yZWdpc3RlcigmY2xpZW50LT5kZXYsICZsZWQtPmNkZXYpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZnJlZV9tdXRleDsKKwl9CisKKwlyZXR1cm4gMDsKKworZnJlZV9tdXRleDoKKwltdXRleF9kZXN0cm95KCZpczMxLT5sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGlzMzFmbDMxOXhfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGlzMzFmbDMxOXhfY2hpcCAqaXMzMSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJbXV0ZXhfZGVzdHJveSgmaXMzMS0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBpMmMtY29yZSAoYW5kIG1vZGFsaWFzKSByZXF1aXJlcyB0aGF0IGlkX3RhYmxlIGJlIHByb3Blcmx5IGZpbGxlZCwKKyAqIGV2ZW4gdGhvdWdoIGl0IGlzIG5vdCB1c2VkIGZvciBEZXZpY2VUcmVlIGJhc2VkIGluc3RhbnRpYXRpb24uCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBpczMxZmwzMTl4X2lkW10gPSB7CisJeyAiaXMzMWZsMzE5MCIgfSwKKwl7ICJpczMxZmwzMTkxIiB9LAorCXsgImlzMzFmbDMxOTMiIH0sCisJeyAiaXMzMWZsMzE5NiIgfSwKKwl7ICJpczMxZmwzMTk5IiB9LAorCXsgInNuMzE5OSIgfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgaXMzMWZsMzE5eF9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpczMxZmwzMTl4X2RyaXZlciA9IHsKKwkuZHJpdmVyICAgPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJsZWRzLWlzMzFmbDMxOXgiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIob2ZfaXMzMWZsMzE5eF9tYXRjaCksCisJfSwKKwkucHJvYmUgICAgPSBpczMxZmwzMTl4X3Byb2JlLAorCS5yZW1vdmUgICA9IGlzMzFmbDMxOXhfcmVtb3ZlLAorCS5pZF90YWJsZSA9IGlzMzFmbDMxOXhfaWQsCit9OworCittb2R1bGVfaTJjX2RyaXZlcihpczMxZmwzMTl4X2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkguIE5pa29sYXVzIFNjaGFsbGVyIDxobnNAZ29sZGVsaWNvLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIkFuZHJleSBVdGtpbiA8YW5kcmV5X3V0a2luQGZhc3RtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSVMzMUZMMzE5WCBMRUQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1tbHhjcGxkLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1tbHhjcGxkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk3YWI5YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLW1seGNwbGQuYwpAQCAtMCwwICsxLDQzMCBAQAorLyoKKyAqIGRyaXZlcnMvbGVkcy9sZWRzLW1seGNwbGQuYworICogQ29weXJpZ2h0IChjKSAyMDE2IE1lbGxhbm94IFRlY2hub2xvZ2llcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxNiBWYWRpbSBQYXN0ZXJuYWsgPHZhZGltcEBtZWxsYW5veC5jb20+CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbGVkcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2RlZmluZSBNTFhQTEFUX0NQTERfTFBDX1JFR19CQVNFX0FEUlIgICAgIDB4MjUwMCAvKiBMUEMgYnVzIGFjY2VzcyAqLworCisvKiBDb2xvciBjb2RlcyBmb3IgTEVEcyAqLworI2RlZmluZSBNTFhDUExEX0xFRF9PRkZTRVRfSEFMRgkJMHgwMSAvKiBPZmZzZXQgZnJvbSBzb2xpZDogM0h6IGJsaW5rICovCisjZGVmaW5lIE1MWENQTERfTEVEX09GRlNFVF9GVUxMCQkweDAyIC8qIE9mZnNldCBmcm9tIHNvbGlkOiA2SHogYmxpbmsgKi8KKyNkZWZpbmUgTUxYQ1BMRF9MRURfSVNfT0ZGCQkweDAwIC8qIE9mZiAqLworI2RlZmluZSBNTFhDUExEX0xFRF9SRURfU1RBVElDX09OCTB4MDUgLyogU29saWQgcmVkICovCisjZGVmaW5lIE1MWENQTERfTEVEX1JFRF9CTElOS19IQUxGCShNTFhDUExEX0xFRF9SRURfU1RBVElDX09OICsgXAorCQkJCQkgTUxYQ1BMRF9MRURfT0ZGU0VUX0hBTEYpCisjZGVmaW5lIE1MWENQTERfTEVEX1JFRF9CTElOS19GVUxMCShNTFhDUExEX0xFRF9SRURfU1RBVElDX09OICsgXAorCQkJCQkgTUxYQ1BMRF9MRURfT0ZGU0VUX0ZVTEwpCisjZGVmaW5lIE1MWENQTERfTEVEX0dSRUVOX1NUQVRJQ19PTgkweDBEIC8qIFNvbGlkIGdyZWVuICovCisjZGVmaW5lIE1MWENQTERfTEVEX0dSRUVOX0JMSU5LX0hBTEYJKE1MWENQTERfTEVEX0dSRUVOX1NUQVRJQ19PTiArIFwKKwkJCQkJIE1MWENQTERfTEVEX09GRlNFVF9IQUxGKQorI2RlZmluZSBNTFhDUExEX0xFRF9HUkVFTl9CTElOS19GVUxMCShNTFhDUExEX0xFRF9HUkVFTl9TVEFUSUNfT04gKyBcCisJCQkJCSBNTFhDUExEX0xFRF9PRkZTRVRfRlVMTCkKKyNkZWZpbmUgTUxYQ1BMRF9MRURfQkxJTktfM0haCQkxNjcgLyogfjE2NyBtc2VjIG9mZi9vbiAqLworI2RlZmluZSBNTFhDUExEX0xFRF9CTElOS182SFoJCTgzIC8qIH44MyBtc2VjIG9mZi9vbiAqLworCisvKioKKyAqIG1seGNwbGRfcGFyYW0gLSBMRUQgYWNjZXNzIHBhcmFtZXRlcnM6CisgKiBAb2Zmc2V0IC0gb2Zmc2V0IGZvciBMRUQgYWNjZXNzIGluIENQTEQgZGV2aWNlCisgKiBAbWFzayAtIG1hc2sgZm9yIExFRCBhY2Nlc3MgaW4gQ1BMRCBkZXZpY2UKKyAqIEBiYXNlX2NvbG9yIC0gYmFzZSBjb2xvciBjb2RlIGZvciBMRUQKKyoqLworc3RydWN0IG1seGNwbGRfcGFyYW0geworCXU4IG9mZnNldDsKKwl1OCBtYXNrOworCXU4IGJhc2VfY29sb3I7Cit9OworCisvKioKKyAqIG1seGNwbGRfbGVkX3ByaXYgLSBMRUQgcHJpdmF0ZSBkYXRhOgorICogQGNsZWQgLSBMRUQgY2xhc3MgZGV2aWNlIGluc3RhbmNlCisgKiBAcGFyYW0gLSBMRUQgQ1BMRCBhY2Nlc3MgcGFyYW1ldGVycworKiovCitzdHJ1Y3QgbWx4Y3BsZF9sZWRfcHJpdiB7CisJc3RydWN0IGxlZF9jbGFzc2RldiBjZGV2OworCXN0cnVjdCBtbHhjcGxkX3BhcmFtIHBhcmFtOworfTsKKworI2RlZmluZSBjZGV2X3RvX3ByaXYoYykJCWNvbnRhaW5lcl9vZihjLCBzdHJ1Y3QgbWx4Y3BsZF9sZWRfcHJpdiwgY2RldikKKworLyoqCisgKiBtbHhjcGxkX2xlZF9wcm9maWxlIC0gc3lzdGVtIExFRCBwcm9maWxlIChkZWZpbmVkIHBlciBzeXN0ZW0gY2xhc3MpOgorICogQG9mZnNldCAtIG9mZnNldCBmb3IgTEVEIGFjY2VzcyBpbiBDUExEIGRldmljZQorICogQG1hc2sgLSBtYXNrIGZvciBMRUQgYWNjZXNzIGluIENQTEQgZGV2aWNlCisgKiBAYmFzZV9jb2xvciAtIGJhc2UgY29sb3IgY29kZQorICogQGJyaWdodG5lc3MgLSBkZWZhdWx0IGJyaWdodG5lc3Mgc2V0dGluZyAob24vb2ZmKQorICogQG5hbWUgLSBMRUQgbmFtZQorKiovCitzdHJ1Y3QgbWx4Y3BsZF9sZWRfcHJvZmlsZSB7CisJdTggb2Zmc2V0OworCXU4IG1hc2s7CisJdTggYmFzZV9jb2xvcjsKKwllbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3M7CisJY29uc3QgY2hhciAqbmFtZTsKK307CisKKy8qKgorICogbWx4Y3BsZF9sZWRfcGRhdGEgLSBzeXN0ZW0gTEVEIHByaXZhdGUgZGF0YQorICogQHBkZXYgLSBwbGF0Zm9ybSBkZXZpY2UgcG9pbnRlcgorICogQHBsZWQgLSBMRUQgY2xhc3MgZGV2aWNlIGluc3RhbmNlCisgKiBAcHJvZmlsZSAtIHN5c3RlbSBjb25maWd1cmF0aW9uIHByb2ZpbGUKKyAqIEBudW1fbGVkX2luc3RhbmNlcyAtIG51bWJlciBvZiBMRUQgaW5zdGFuY2VzCisgKiBAbG9jayAtIGRldmljZSBhY2Nlc3MgbG9jaworKiovCitzdHJ1Y3QgbWx4Y3BsZF9sZWRfcGRhdGEgeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IG1seGNwbGRfbGVkX3ByaXYgKnBsZWQ7CisJc3RydWN0IG1seGNwbGRfbGVkX3Byb2ZpbGUgKnByb2ZpbGU7CisJaW50IG51bV9sZWRfaW5zdGFuY2VzOworCXNwaW5sb2NrX3QgbG9jazsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWx4Y3BsZF9sZWRfcGRhdGEgKm1seGNwbGRfbGVkOworCisvKiBEZWZhdWx0IHByb2ZpbGUgZml0IHRoZSBuZXh0IE1lbGxhbm94IHN5c3RlbXM6CisgKiAibXN4NjcxMCIsICJtc3g2NzIwIiwgIm1zYjc3MDAiLCAibXNuMjcwMCIsICJtc3gxNDEwIiwKKyAqICJtc24yNDEwIiwgIm1zYjc4MDAiLCAibXNuMjc0MCIKKyAqLworc3RhdGljIHN0cnVjdCBtbHhjcGxkX2xlZF9wcm9maWxlIG1seGNwbGRfbGVkX2RlZmF1bHRfcHJvZmlsZVtdID0geworCXsKKwkJMHgyMSwgMHhmMCwgTUxYQ1BMRF9MRURfR1JFRU5fU1RBVElDX09OLCAxLAorCQkibWx4Y3BsZDpmYW4xOmdyZWVuIiwKKwl9LAorCXsKKwkJMHgyMSwgMHhmMCwgTUxYQ1BMRF9MRURfUkVEX1NUQVRJQ19PTiwgTEVEX09GRiwKKwkJIm1seGNwbGQ6ZmFuMTpyZWQiLAorCX0sCisJeworCQkweDIxLCAweDBmLCBNTFhDUExEX0xFRF9HUkVFTl9TVEFUSUNfT04sIDEsCisJCSJtbHhjcGxkOmZhbjI6Z3JlZW4iLAorCX0sCisJeworCQkweDIxLCAweDBmLCBNTFhDUExEX0xFRF9SRURfU1RBVElDX09OLCBMRURfT0ZGLAorCQkibWx4Y3BsZDpmYW4yOnJlZCIsCisJfSwKKwl7CisJCTB4MjIsIDB4ZjAsIE1MWENQTERfTEVEX0dSRUVOX1NUQVRJQ19PTiwgMSwKKwkJIm1seGNwbGQ6ZmFuMzpncmVlbiIsCisJfSwKKwl7CisJCTB4MjIsIDB4ZjAsIE1MWENQTERfTEVEX1JFRF9TVEFUSUNfT04sIExFRF9PRkYsCisJCSJtbHhjcGxkOmZhbjM6cmVkIiwKKwl9LAorCXsKKwkJMHgyMiwgMHgwZiwgTUxYQ1BMRF9MRURfR1JFRU5fU1RBVElDX09OLCAxLAorCQkibWx4Y3BsZDpmYW40OmdyZWVuIiwKKwl9LAorCXsKKwkJMHgyMiwgMHgwZiwgTUxYQ1BMRF9MRURfUkVEX1NUQVRJQ19PTiwgTEVEX09GRiwKKwkJIm1seGNwbGQ6ZmFuNDpyZWQiLAorCX0sCisJeworCQkweDIwLCAweDBmLCBNTFhDUExEX0xFRF9HUkVFTl9TVEFUSUNfT04sIDEsCisJCSJtbHhjcGxkOnBzdTpncmVlbiIsCisJfSwKKwl7CisJCTB4MjAsIDB4MGYsIE1MWENQTERfTEVEX1JFRF9TVEFUSUNfT04sIExFRF9PRkYsCisJCSJtbHhjcGxkOnBzdTpyZWQiLAorCX0sCisJeworCQkweDIwLCAweGYwLCBNTFhDUExEX0xFRF9HUkVFTl9TVEFUSUNfT04sIDEsCisJCSJtbHhjcGxkOnN0YXR1czpncmVlbiIsCisJfSwKKwl7CisJCTB4MjAsIDB4ZjAsIE1MWENQTERfTEVEX1JFRF9TVEFUSUNfT04sIExFRF9PRkYsCisJCSJtbHhjcGxkOnN0YXR1czpyZWQiLAorCX0sCit9OworCisvKiBQcm9maWxlIGZpdCB0aGUgTWVsbGFub3ggc3lzdGVtcyBiYXNlZCBvbiAibXNuMjEwMCIgKi8KK3N0YXRpYyBzdHJ1Y3QgbWx4Y3BsZF9sZWRfcHJvZmlsZSBtbHhjcGxkX2xlZF9tc24yMTAwX3Byb2ZpbGVbXSA9IHsKKwl7CisJCTB4MjEsIDB4ZjAsIE1MWENQTERfTEVEX0dSRUVOX1NUQVRJQ19PTiwgMSwKKwkJIm1seGNwbGQ6ZmFuOmdyZWVuIiwKKwl9LAorCXsKKwkJMHgyMSwgMHhmMCwgTUxYQ1BMRF9MRURfUkVEX1NUQVRJQ19PTiwgTEVEX09GRiwKKwkJIm1seGNwbGQ6ZmFuOnJlZCIsCisJfSwKKwl7CisJCTB4MjMsIDB4ZjAsIE1MWENQTERfTEVEX0dSRUVOX1NUQVRJQ19PTiwgMSwKKwkJIm1seGNwbGQ6cHN1MTpncmVlbiIsCisJfSwKKwl7CisJCTB4MjMsIDB4ZjAsIE1MWENQTERfTEVEX1JFRF9TVEFUSUNfT04sIExFRF9PRkYsCisJCSJtbHhjcGxkOnBzdTE6cmVkIiwKKwl9LAorCXsKKwkJMHgyMywgMHgwZiwgTUxYQ1BMRF9MRURfR1JFRU5fU1RBVElDX09OLCAxLAorCQkibWx4Y3BsZDpwc3UyOmdyZWVuIiwKKwl9LAorCXsKKwkJMHgyMywgMHgwZiwgTUxYQ1BMRF9MRURfUkVEX1NUQVRJQ19PTiwgTEVEX09GRiwKKwkJIm1seGNwbGQ6cHN1MjpyZWQiLAorCX0sCisJeworCQkweDIwLCAweGYwLCBNTFhDUExEX0xFRF9HUkVFTl9TVEFUSUNfT04sIDEsCisJCSJtbHhjcGxkOnN0YXR1czpncmVlbiIsCisJfSwKKwl7CisJCTB4MjAsIDB4ZjAsIE1MWENQTERfTEVEX1JFRF9TVEFUSUNfT04sIExFRF9PRkYsCisJCSJtbHhjcGxkOnN0YXR1czpyZWQiLAorCX0sCisJeworCQkweDI0LCAweGYwLCBNTFhDUExEX0xFRF9HUkVFTl9TVEFUSUNfT04sIExFRF9PRkYsCisJCSJtbHhjcGxkOnVpZDpibHVlIiwKKwl9LAorfTsKKworZW51bSBtbHhjcGxkX2xlZF9wbGF0Zm9ybV90eXBlcyB7CisJTUxYQ1BMRF9MRURfUExBVEZPUk1fREVGQVVMVCwKKwlNTFhDUExEX0xFRF9QTEFURk9STV9NU04yMTAwLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKm1seF9wcm9kdWN0X25hbWVzW10gPSB7CisJIkRFRkFVTFQiLAorCSJNU04yMTAwIiwKK307CisKK3N0YXRpYyBlbnVtCittbHhjcGxkX2xlZF9wbGF0Zm9ybV90eXBlcyBtbHhjcGxkX2xlZF9wbGF0Zm9ybV9jaGVja19zeXNfdHlwZSh2b2lkKQoreworCWNvbnN0IGNoYXIgKm1seF9wcm9kdWN0X25hbWU7CisJaW50IGk7CisKKwltbHhfcHJvZHVjdF9uYW1lID0gZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfUFJPRFVDVF9OQU1FKTsKKwlpZiAoIW1seF9wcm9kdWN0X25hbWUpCisJCXJldHVybiBNTFhDUExEX0xFRF9QTEFURk9STV9ERUZBVUxUOworCisJZm9yIChpID0gMTsgIGkgPCBBUlJBWV9TSVpFKG1seF9wcm9kdWN0X25hbWVzKTsgaSsrKSB7CisJCWlmIChzdHJzdHIobWx4X3Byb2R1Y3RfbmFtZSwgbWx4X3Byb2R1Y3RfbmFtZXNbaV0pKQorCQkJcmV0dXJuIGk7CisJfQorCisJcmV0dXJuIE1MWENQTERfTEVEX1BMQVRGT1JNX0RFRkFVTFQ7Cit9CisKK3N0YXRpYyB2b2lkIG1seGNwbGRfbGVkX2J1c19hY2Nlc3NfZnVuYyh1MTYgYmFzZSwgdTggb2Zmc2V0LCB1OCByd19mbGFnLAorCQkJCQl1OCAqZGF0YSkKK3sKKwl1MzIgYWRkciA9IGJhc2UgKyBvZmZzZXQ7CisKKwlpZiAocndfZmxhZyA9PSAwKQorCQlvdXRiKCpkYXRhLCBhZGRyKTsKKwllbHNlCisJCSpkYXRhID0gaW5iKGFkZHIpOworfQorCitzdGF0aWMgdm9pZCBtbHhjcGxkX2xlZF9zdG9yZV9odyh1OCBtYXNrLCB1OCBvZmYsIHU4IHZzZXQpCit7CisJdTggbmliLCB2YWw7CisKKwkvKgorCSAqIEVhY2ggTEVEIGlzIGNvbnRyb2xsZWQgdGhyb3VnaCBsb3cgb3IgaGlnaCBuaWJibGUgb2YgdGhlIHJlbGV2YW50CisJICogQ1BMRCByZWdpc3Rlci4gUmVnaXN0ZXIgb2Zmc2V0IGlzIHNwZWNpZmllZCBieSBvZmYgcGFyYW1ldGVyLgorCSAqIFBhcmFtZXRlciB2c2V0IHByb3ZpZGVzIGNvbG9yIGNvZGU6IDB4MCBmb3Igb2ZmLCAweDUgZm9yIHNvbGlkIHJlZCwKKwkgKiAweDYgZm9yIDNIeiBibGluayByZWQsIDB4ZCBmb3Igc29saWQgZ3JlZW4sIDB4ZSBmb3IgM0h6IGJsaW5rCisJICogZ3JlZW4uCisJICogUGFyYW1ldGVyIG1hc2sgc3BlY2lmaWVzIHdoaWNoIG5pYmJsZSBpcyB1c2VkIGZvciBzcGVjaWZpYyBMRUQ6IG1hc2sKKwkgKiAweGYwIC0gbG93ZXIgbmliYmxlIGlzIHRvIGJlIHVzZWQgKGJpdHMgZnJvbSAwIHRvIDMpLCBtYXNrIDB4MGYgLQorCSAqIGhpZ2hlciBuaWJibGUgKGJpdHMgZnJvbSA0IHRvIDcpLgorCSAqLworCXNwaW5fbG9jaygmbWx4Y3BsZF9sZWQtPmxvY2spOworCW1seGNwbGRfbGVkX2J1c19hY2Nlc3NfZnVuYyhNTFhQTEFUX0NQTERfTFBDX1JFR19CQVNFX0FEUlIsIG9mZiwgMSwKKwkJCQkgICAgJnZhbCk7CisJbmliID0gKG1hc2sgPT0gMHhmMCkgPyB2c2V0IDogKHZzZXQgPDwgNCk7CisJdmFsID0gKHZhbCAmIG1hc2spIHwgbmliOworCW1seGNwbGRfbGVkX2J1c19hY2Nlc3NfZnVuYyhNTFhQTEFUX0NQTERfTFBDX1JFR19CQVNFX0FEUlIsIG9mZiwgMCwKKwkJCQkgICAgJnZhbCk7CisJc3Bpbl91bmxvY2soJm1seGNwbGRfbGVkLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgbWx4Y3BsZF9sZWRfYnJpZ2h0bmVzc19zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkLAorCQkJCSAgICAgICBlbnVtIGxlZF9icmlnaHRuZXNzIHZhbHVlKQoreworCXN0cnVjdCBtbHhjcGxkX2xlZF9wcml2ICpwbGVkID0gY2Rldl90b19wcml2KGxlZCk7CisKKwlpZiAodmFsdWUpIHsKKwkJbWx4Y3BsZF9sZWRfc3RvcmVfaHcocGxlZC0+cGFyYW0ubWFzaywgcGxlZC0+cGFyYW0ub2Zmc2V0LAorCQkJCSAgICAgcGxlZC0+cGFyYW0uYmFzZV9jb2xvcik7CisJCXJldHVybjsKKwl9CisKKwltbHhjcGxkX2xlZF9zdG9yZV9odyhwbGVkLT5wYXJhbS5tYXNrLCBwbGVkLT5wYXJhbS5vZmZzZXQsCisJCQkgICAgIE1MWENQTERfTEVEX0lTX09GRik7Cit9CisKK3N0YXRpYyBpbnQgbWx4Y3BsZF9sZWRfYmxpbmtfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZCwKKwkJCQkgdW5zaWduZWQgbG9uZyAqZGVsYXlfb24sCisJCQkJIHVuc2lnbmVkIGxvbmcgKmRlbGF5X29mZikKK3sKKwlzdHJ1Y3QgbWx4Y3BsZF9sZWRfcHJpdiAqcGxlZCA9IGNkZXZfdG9fcHJpdihsZWQpOworCisJLyoKKwkgKiBIVyBzdXBwb3J0cyB0d28gdHlwZXMgb2YgYmxpbmtpbmc6IGZ1bGwgKDZIeikgYW5kIGhhbGYgKDNIeikuCisJICogRm9yIGRlbGF5IG9uL29mZiB6ZXJvIGRlZmF1bHQgc2V0dGluZyAzSHogaXMgdXNlZC4KKwkgKi8KKwlpZiAoISgqZGVsYXlfb24gPT0gMCAmJiAqZGVsYXlfb2ZmID09IDApICYmCisJICAgICEoKmRlbGF5X29uID09IE1MWENQTERfTEVEX0JMSU5LXzNIWiAmJgorCSAgICAgICpkZWxheV9vZmYgPT0gTUxYQ1BMRF9MRURfQkxJTktfM0haKSAmJgorCSAgICAhKCpkZWxheV9vbiA9PSBNTFhDUExEX0xFRF9CTElOS182SFogJiYKKwkgICAgICAqZGVsYXlfb2ZmID09IE1MWENQTERfTEVEX0JMSU5LXzZIWikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCpkZWxheV9vbiA9PSBNTFhDUExEX0xFRF9CTElOS182SFopCisJCW1seGNwbGRfbGVkX3N0b3JlX2h3KHBsZWQtPnBhcmFtLm1hc2ssIHBsZWQtPnBhcmFtLm9mZnNldCwKKwkJCQkgICAgIHBsZWQtPnBhcmFtLmJhc2VfY29sb3IgKworCQkJCSAgICAgTUxYQ1BMRF9MRURfT0ZGU0VUX0ZVTEwpOworCWVsc2UKKwkJbWx4Y3BsZF9sZWRfc3RvcmVfaHcocGxlZC0+cGFyYW0ubWFzaywgcGxlZC0+cGFyYW0ub2Zmc2V0LAorCQkJCSAgICAgcGxlZC0+cGFyYW0uYmFzZV9jb2xvciArCisJCQkJICAgICBNTFhDUExEX0xFRF9PRkZTRVRfSEFMRik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtbHhjcGxkX2xlZF9jb25maWcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IG1seGNwbGRfbGVkX3BkYXRhICpjcGxkKQoreworCWludCBpOworCWludCBlcnI7CisKKwljcGxkLT5wbGVkID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBtbHhjcGxkX2xlZF9wcml2KSAqCisJCQkJICBjcGxkLT5udW1fbGVkX2luc3RhbmNlcywgR0ZQX0tFUk5FTCk7CisJaWYgKCFjcGxkLT5wbGVkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBjcGxkLT5udW1fbGVkX2luc3RhbmNlczsgaSsrKSB7CisJCWNwbGQtPnBsZWRbaV0uY2Rldi5uYW1lID0gY3BsZC0+cHJvZmlsZVtpXS5uYW1lOworCQljcGxkLT5wbGVkW2ldLmNkZXYuYnJpZ2h0bmVzcyA9IGNwbGQtPnByb2ZpbGVbaV0uYnJpZ2h0bmVzczsKKwkJY3BsZC0+cGxlZFtpXS5jZGV2Lm1heF9icmlnaHRuZXNzID0gMTsKKwkJY3BsZC0+cGxlZFtpXS5jZGV2LmJyaWdodG5lc3Nfc2V0ID0gbWx4Y3BsZF9sZWRfYnJpZ2h0bmVzc19zZXQ7CisJCWNwbGQtPnBsZWRbaV0uY2Rldi5ibGlua19zZXQgPSBtbHhjcGxkX2xlZF9ibGlua19zZXQ7CisJCWNwbGQtPnBsZWRbaV0uY2Rldi5mbGFncyA9IExFRF9DT1JFX1NVU1BFTkRSRVNVTUU7CisJCWVyciA9IGRldm1fbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKGRldiwgJmNwbGQtPnBsZWRbaV0uY2Rldik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCWNwbGQtPnBsZWRbaV0ucGFyYW0ub2Zmc2V0ID0gbWx4Y3BsZF9sZWQtPnByb2ZpbGVbaV0ub2Zmc2V0OworCQljcGxkLT5wbGVkW2ldLnBhcmFtLm1hc2sgPSBtbHhjcGxkX2xlZC0+cHJvZmlsZVtpXS5tYXNrOworCQljcGxkLT5wbGVkW2ldLnBhcmFtLmJhc2VfY29sb3IgPQorCQkJCQltbHhjcGxkX2xlZC0+cHJvZmlsZVtpXS5iYXNlX2NvbG9yOworCisJCWlmIChtbHhjcGxkX2xlZC0+cHJvZmlsZVtpXS5icmlnaHRuZXNzKQorCQkJbWx4Y3BsZF9sZWRfYnJpZ2h0bmVzc19zZXQoJmNwbGQtPnBsZWRbaV0uY2RldiwKKwkJCQkJbWx4Y3BsZF9sZWQtPnByb2ZpbGVbaV0uYnJpZ2h0bmVzcyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG1seGNwbGRfbGVkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJZW51bSBtbHhjcGxkX2xlZF9wbGF0Zm9ybV90eXBlcyBtbHhjcGxkX2xlZF9wbGF0ID0KKwkJCQkJbWx4Y3BsZF9sZWRfcGxhdGZvcm1fY2hlY2tfc3lzX3R5cGUoKTsKKworCW1seGNwbGRfbGVkID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqbWx4Y3BsZF9sZWQpLAorCQkJCSAgIEdGUF9LRVJORUwpOworCWlmICghbWx4Y3BsZF9sZWQpCisJCXJldHVybiAtRU5PTUVNOworCisJbWx4Y3BsZF9sZWQtPnBkZXYgPSBwZGV2OworCisJc3dpdGNoIChtbHhjcGxkX2xlZF9wbGF0KSB7CisJY2FzZSBNTFhDUExEX0xFRF9QTEFURk9STV9NU04yMTAwOgorCQltbHhjcGxkX2xlZC0+cHJvZmlsZSA9IG1seGNwbGRfbGVkX21zbjIxMDBfcHJvZmlsZTsKKwkJbWx4Y3BsZF9sZWQtPm51bV9sZWRfaW5zdGFuY2VzID0KKwkJCQlBUlJBWV9TSVpFKG1seGNwbGRfbGVkX21zbjIxMDBfcHJvZmlsZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJbWx4Y3BsZF9sZWQtPnByb2ZpbGUgPSBtbHhjcGxkX2xlZF9kZWZhdWx0X3Byb2ZpbGU7CisJCW1seGNwbGRfbGVkLT5udW1fbGVkX2luc3RhbmNlcyA9CisJCQkJQVJSQVlfU0laRShtbHhjcGxkX2xlZF9kZWZhdWx0X3Byb2ZpbGUpOworCQlicmVhazsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmbWx4Y3BsZF9sZWQtPmxvY2spOworCisJcmV0dXJuIG1seGNwbGRfbGVkX2NvbmZpZygmcGRldi0+ZGV2LCBtbHhjcGxkX2xlZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1seGNwbGRfbGVkX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9IEtCVUlMRF9NT0ROQU1FLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtbHhjcGxkX2xlZF9pbml0KHZvaWQpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlpbnQgZXJyOworCisJcGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoS0JVSUxEX01PRE5BTUUsIC0xLCBOVUxMLCAwKTsKKwlpZiAoSVNfRVJSKHBkZXYpKSB7CisJCXByX2VycigiRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIocGRldik7CisJfQorCisJZXJyID0gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZtbHhjcGxkX2xlZF9kcml2ZXIsIG1seGNwbGRfbGVkX3Byb2JlKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiUHJvYmUgcGxhdGZvcm0gZHJpdmVyIGZhaWxlZFxuIik7CisJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkZXYpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtbHhjcGxkX2xlZF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIobWx4Y3BsZF9sZWQtPnBkZXYpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtbHhjcGxkX2xlZF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChtbHhjcGxkX2xlZF9pbml0KTsKK21vZHVsZV9leGl0KG1seGNwbGRfbGVkX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJWYWRpbSBQYXN0ZXJuYWsgPHZhZGltcEBtZWxsYW5veC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1lbGxhbm94IGJvYXJkIExFRCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06bGVkc19tbHhjcGxkIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1wbTgwNTguYyBiL2RyaXZlcnMvbGVkcy9sZWRzLXBtODA1OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MjY3NDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1wbTgwNTguYwpAQCAtMCwwICsxLDE5MSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExLCAyMDE2IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorCisjZGVmaW5lIFBNODA1OF9MRURfVFlQRV9DT01NT04JMHgwMAorI2RlZmluZSBQTTgwNThfTEVEX1RZUEVfS0VZUEFECTB4MDEKKyNkZWZpbmUgUE04MDU4X0xFRF9UWVBFX0ZMQVNICTB4MDIKKworI2RlZmluZSBQTTgwNThfTEVEX1RZUEVfQ09NTU9OX01BU0sJMHhmOAorI2RlZmluZSBQTTgwNThfTEVEX1RZUEVfS0VZUEFEX01BU0sJMHhmMAorI2RlZmluZSBQTTgwNThfTEVEX1RZUEVfQ09NTU9OX1NISUZUCTMKKyNkZWZpbmUgUE04MDU4X0xFRF9UWVBFX0tFWVBBRF9TSElGVAk0CisKK3N0cnVjdCBwbTgwNThfbGVkIHsKKwlzdHJ1Y3QgcmVnbWFwICptYXA7CisJdTMyIHJlZzsKKwl1MzIgbGVkdHlwZTsKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2IGNkZXY7Cit9OworCitzdGF0aWMgdm9pZCBwbTgwNThfbGVkX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpjbGVkLAorCWVudW0gbGVkX2JyaWdodG5lc3MgdmFsdWUpCit7CisJc3RydWN0IHBtODA1OF9sZWQgKmxlZDsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisJdW5zaWduZWQgaW50IHZhbCA9IDA7CisKKwlsZWQgPSBjb250YWluZXJfb2YoY2xlZCwgc3RydWN0IHBtODA1OF9sZWQsIGNkZXYpOworCXN3aXRjaCAobGVkLT5sZWR0eXBlKSB7CisJY2FzZSBQTTgwNThfTEVEX1RZUEVfQ09NTU9OOgorCQltYXNrID0gUE04MDU4X0xFRF9UWVBFX0NPTU1PTl9NQVNLOworCQl2YWwgPSB2YWx1ZSA8PCBQTTgwNThfTEVEX1RZUEVfQ09NTU9OX1NISUZUOworCQlicmVhazsKKwljYXNlIFBNODA1OF9MRURfVFlQRV9LRVlQQUQ6CisJY2FzZSBQTTgwNThfTEVEX1RZUEVfRkxBU0g6CisJCW1hc2sgPSBQTTgwNThfTEVEX1RZUEVfS0VZUEFEX01BU0s7CisJCXZhbCA9IHZhbHVlIDw8IFBNODA1OF9MRURfVFlQRV9LRVlQQURfU0hJRlQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhsZWQtPm1hcCwgbGVkLT5yZWcsIG1hc2ssIHZhbCk7CisJaWYgKHJldCkKKwkJcHJfZXJyKCJGYWlsZWQgdG8gc2V0IExFRCBicmlnaHRuZXNzXG4iKTsKK30KKworc3RhdGljIGVudW0gbGVkX2JyaWdodG5lc3MgcG04MDU4X2xlZF9nZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqY2xlZCkKK3sKKwlzdHJ1Y3QgcG04MDU4X2xlZCAqbGVkOworCWludCByZXQ7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWxlZCA9IGNvbnRhaW5lcl9vZihjbGVkLCBzdHJ1Y3QgcG04MDU4X2xlZCwgY2Rldik7CisKKwlyZXQgPSByZWdtYXBfcmVhZChsZWQtPm1hcCwgbGVkLT5yZWcsICZ2YWwpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gZ2V0IExFRCBicmlnaHRuZXNzXG4iKTsKKwkJcmV0dXJuIExFRF9PRkY7CisJfQorCisJc3dpdGNoIChsZWQtPmxlZHR5cGUpIHsKKwljYXNlIFBNODA1OF9MRURfVFlQRV9DT01NT046CisJCXZhbCAmPSBQTTgwNThfTEVEX1RZUEVfQ09NTU9OX01BU0s7CisJCXZhbCA+Pj0gUE04MDU4X0xFRF9UWVBFX0NPTU1PTl9TSElGVDsKKwkJYnJlYWs7CisJY2FzZSBQTTgwNThfTEVEX1RZUEVfS0VZUEFEOgorCWNhc2UgUE04MDU4X0xFRF9UWVBFX0ZMQVNIOgorCQl2YWwgJj0gUE04MDU4X0xFRF9UWVBFX0tFWVBBRF9NQVNLOworCQl2YWwgPj49IFBNODA1OF9MRURfVFlQRV9LRVlQQURfU0hJRlQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZhbCA9IExFRF9PRkY7CisJCWJyZWFrOworCX0KKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbnQgcG04MDU4X2xlZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwbTgwNThfbGVkICpsZWQ7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCWludCByZXQ7CisJc3RydWN0IHJlZ21hcCAqbWFwOworCWNvbnN0IGNoYXIgKnN0YXRlOworCWVudW0gbGVkX2JyaWdodG5lc3MgbWF4YnJpZ2h0OworCisJbGVkID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqbGVkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsZWQpCisJCXJldHVybiAtRU5PTUVNOworCisJbGVkLT5sZWR0eXBlID0gKHUzMilvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGEoJnBkZXYtPmRldik7CisKKwltYXAgPSBkZXZfZ2V0X3JlZ21hcChwZGV2LT5kZXYucGFyZW50LCBOVUxMKTsKKwlpZiAoIW1hcCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJQYXJlbnQgcmVnbWFwIHVuYXZhaWxhYmxlLlxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCWxlZC0+bWFwID0gbWFwOworCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyZWciLCAmbGVkLT5yZWcpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gcmVnaXN0ZXIgb2Zmc2V0IHNwZWNpZmllZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFVzZSBsYWJlbCBlbHNlIG5vZGUgbmFtZSAqLworCWxlZC0+Y2Rldi5uYW1lID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAibGFiZWwiLCBOVUxMKSA/IDogbnAtPm5hbWU7CisJbGVkLT5jZGV2LmRlZmF1bHRfdHJpZ2dlciA9CisJCW9mX2dldF9wcm9wZXJ0eShucCwgImxpbnV4LGRlZmF1bHQtdHJpZ2dlciIsIE5VTEwpOworCWxlZC0+Y2Rldi5icmlnaHRuZXNzX3NldCA9IHBtODA1OF9sZWRfc2V0OworCWxlZC0+Y2Rldi5icmlnaHRuZXNzX2dldCA9IHBtODA1OF9sZWRfZ2V0OworCWlmIChsZWQtPmxlZHR5cGUgPT0gUE04MDU4X0xFRF9UWVBFX0NPTU1PTikKKwkJbWF4YnJpZ2h0ID0gMzE7IC8qIDUgYml0cyAqLworCWVsc2UKKwkJbWF4YnJpZ2h0ID0gMTU7IC8qIDQgYml0cyAqLworCWxlZC0+Y2Rldi5tYXhfYnJpZ2h0bmVzcyA9IG1heGJyaWdodDsKKworCXN0YXRlID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZGVmYXVsdC1zdGF0ZSIsIE5VTEwpOworCWlmIChzdGF0ZSkgeworCQlpZiAoIXN0cmNtcChzdGF0ZSwgImtlZXAiKSkgeworCQkJbGVkLT5jZGV2LmJyaWdodG5lc3MgPSBwbTgwNThfbGVkX2dldCgmbGVkLT5jZGV2KTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHN0YXRlLCAib24iKSkgeworCQkJbGVkLT5jZGV2LmJyaWdodG5lc3MgPSBtYXhicmlnaHQ7CisJCQlwbTgwNThfbGVkX3NldCgmbGVkLT5jZGV2LCBtYXhicmlnaHQpOworCQl9IGVsc2UgeworCQkJbGVkLT5jZGV2LmJyaWdodG5lc3MgPSBMRURfT0ZGOworCQkJcG04MDU4X2xlZF9zZXQoJmxlZC0+Y2RldiwgTEVEX09GRik7CisJCX0KKwl9CisKKwlpZiAobGVkLT5sZWR0eXBlID09IFBNODA1OF9MRURfVFlQRV9LRVlQQUQgfHwKKwkgICAgbGVkLT5sZWR0eXBlID09IFBNODA1OF9MRURfVFlQRV9GTEFTSCkKKwkJbGVkLT5jZGV2LmZsYWdzCT0gTEVEX0NPUkVfU1VTUEVORFJFU1VNRTsKKworCXJldCA9IGRldm1fbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZsZWQtPmNkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyIGxlZCBcIiVzXCJcbiIsCisJCQlsZWQtPmNkZXYubmFtZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBtODA1OF9sZWRzX2lkX3RhYmxlW10gPSB7CisJeworCQkuY29tcGF0aWJsZSA9ICJxY29tLHBtODA1OC1sZWQiLAorCQkuZGF0YSA9ICh2b2lkICopUE04MDU4X0xFRF9UWVBFX0NPTU1PTgorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJxY29tLHBtODA1OC1rZXlwYWQtbGVkIiwKKwkJLmRhdGEgPSAodm9pZCAqKVBNODA1OF9MRURfVFlQRV9LRVlQQUQKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAicWNvbSxwbTgwNTgtZmxhc2gtbGVkIiwKKwkJLmRhdGEgPSAodm9pZCAqKVBNODA1OF9MRURfVFlQRV9GTEFTSAorCX0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHBtODA1OF9sZWRzX2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcG04MDU4X2xlZF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHBtODA1OF9sZWRfcHJvYmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInBtODA1OC1sZWRzIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gcG04MDU4X2xlZHNfaWRfdGFibGUsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHBtODA1OF9sZWRfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJQTTgwNTggTEVEcyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06cG04MDU4LWxlZHMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGlnaHRudm0vY29yZS5jIGIvZHJpdmVycy9saWdodG52bS9jb3JlLmMKaW5kZXggOWViZDJjZi4uYzc4NGRkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9saWdodG52bS9jb3JlLmMKKysrIGIvZHJpdmVycy9saWdodG52bS9jb3JlLmMKQEAgLTExNzEsMjcgKzExNzEsMTAgQEAKIAkubm9kZW5hbWUJPSAibGlnaHRudm0vY29udHJvbCIsCiAJLmZvcHMJCT0gJl9jdGxfZm9wcywKIH07Cittb2R1bGVfbWlzY19kZXZpY2UoX252bV9taXNjKTsKIAogTU9EVUxFX0FMSUFTX01JU0NERVYoTUlTQ19EWU5BTUlDX01JTk9SKTsKIAotc3RhdGljIGludCBfX2luaXQgbnZtX21vZF9pbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IG1pc2NfcmVnaXN0ZXIoJl9udm1fbWlzYyk7Ci0JaWYgKHJldCkKLQkJcHJfZXJyKCJudm06IG1pc2NfcmVnaXN0ZXIgZmFpbGVkIGZvciBjb250cm9sIGRldmljZSIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IG52bV9tb2RfZXhpdCh2b2lkKQotewotCW1pc2NfZGVyZWdpc3RlcigmX252bV9taXNjKTsKLX0KLQogTU9EVUxFX0FVVEhPUigiTWF0aWFzIEJqb3JsaW5nIDxtQGJqb3JsaW5nLm1lPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwogTU9EVUxFX1ZFUlNJT04oIjAuMSIpOwotbW9kdWxlX2luaXQobnZtX21vZF9pbml0KTsKLW1vZHVsZV9leGl0KG52bV9tb2RfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9hbXMvYW1zLWkyYy5jIGIvZHJpdmVycy9tYWNpbnRvc2gvYW1zL2Ftcy1pMmMuYwppbmRleCA5NzhlZGE4Li44YTNiYTU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9hbXMvYW1zLWkyYy5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL2Ftcy9hbXMtaTJjLmMKQEAgLTczLDcgKzczLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhbXNfaTJjX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZSAgID0gImFtcyIsCi0JCS5vd25lciAgPSBUSElTX01PRFVMRSwKIAl9LAogCS5wcm9iZSAgICAgICAgICA9IGFtc19pMmNfcHJvYmUsCiAJLnJlbW92ZSAgICAgICAgID0gYW1zX2kyY19yZW1vdmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9wbTExMi5jIGIvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fcG0xMTIuYwppbmRleCAzMDI0Njg1Li45NmQxNmZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9wbTExMi5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3BtMTEyLmMKQEAgLTY2OCw3ICs2NjgsNiBAQAogCS5yZW1vdmUgPSB3Zl9wbTExMl9yZW1vdmUsCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAid2luZGZhcm0iLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fcG03Mi5jIGIvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fcG03Mi5jCmluZGV4IDJmNTA2YjkuLmU4OGNmYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3BtNzIuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9wbTcyLmMKQEAgLTc4OSw3ICs3ODksNiBAQAogCS5yZW1vdmUJPSB3Zl9wbTcyX3JlbW92ZSwKIAkuZHJpdmVyCT0gewogCQkubmFtZSA9ICJ3aW5kZmFybSIsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9ybTMxLmMgYi9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9ybTMxLmMKaW5kZXggODJmYzg2YS4uYmRmY2I4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fcm0zMS5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3JtMzEuYwpAQCAtNjgyLDcgKzY4Miw2IEBACiAJLnJlbW92ZQk9IHdmX3JtMzFfcmVtb3ZlLAogCS5kcml2ZXIJPSB7CiAJCS5uYW1lID0gIndpbmRmYXJtIiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFpbGJveC9LY29uZmlnIGIvZHJpdmVycy9tYWlsYm94L0tjb25maWcKaW5kZXggOTdjMzcyOS4uMTFlZWJmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWlsYm94L0tjb25maWcKKysrIGIvZHJpdmVycy9tYWlsYm94L0tjb25maWcKQEAgLTE1LDYgKzE1LDE2IEBACiAJICBUaGUgY29udHJvbGxlciBoYXMgMyBtYWlsYm94IGNoYW5uZWxzLCB0aGUgbGFzdCBvZiB3aGljaCBjYW4gYmUKIAkgIHVzZWQgaW4gU2VjdXJlIG1vZGUgb25seS4KIAorY29uZmlnIFBMQVRGT1JNX01IVQorCXRyaXN0YXRlICJQbGF0Zm9ybSBNSFUgTWFpbGJveCIKKwlkZXBlbmRzIG9uIE9GCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0KKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIGEgcGxhdGZvcm0gc3BlY2lmaWMgdmFyaWFudCBNSFUKKwkgIGNvbnRyb2xsZXIgZHJpdmVyLgorCSAgVGhlIGNvbnRyb2xsZXIgaGFzIGEgbWF4aW11bSBvZiAzIG1haWxib3ggY2hhbm5lbHMsIHRoZSBsYXN0IG9mCisJICB3aGljaCBjYW4gYmUgdXNlZCBpbiBTZWN1cmUgbW9kZSBvbmx5LgorCiBjb25maWcgUEwzMjBfTUJPWAogCWJvb2wgIkFSTSBQTDMyMCBNYWlsYm94IgogCWRlcGVuZHMgb24gQVJNX0FNQkEKQEAgLTEyNyw2ICsxMzcsNyBAQAogY29uZmlnIEJDTV9QRENfTUJPWAogCXRyaXN0YXRlICJCcm9hZGNvbSBQREMgTWFpbGJveCIKIAlkZXBlbmRzIG9uIEFSTTY0IHx8IENPTVBJTEVfVEVTVAorCWRlcGVuZHMgb24gSEFTX0RNQQogCWRlZmF1bHQgQVJDSF9CQ01fSVBST0MKIAloZWxwCiAJICBNYWlsYm94IGltcGxlbWVudGF0aW9uIGZvciB0aGUgQnJvYWRjb20gUERDIHJpbmcgbWFuYWdlciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFpbGJveC9NYWtlZmlsZSBiL2RyaXZlcnMvbWFpbGJveC9NYWtlZmlsZQppbmRleCA2NmMzOGUzLi5hY2U2ZmVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21haWxib3gvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tYWlsYm94L01ha2VmaWxlCkBAIC02LDYgKzYsOCBAQAogCiBvYmotJChDT05GSUdfQVJNX01IVSkJKz0gYXJtX21odS5vCiAKK29iai0kKENPTkZJR19QTEFURk9STV9NSFUpCSs9IHBsYXRmb3JtX21odS5vCisKIG9iai0kKENPTkZJR19QTDMyMF9NQk9YKQkrPSBwbDMyMC1pcGMubwogCiBvYmotJChDT05GSUdfT01BUDJQTFVTX01CT1gpCSs9IG9tYXAtbWFpbGJveC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21haWxib3gvYmNtLXBkYy1tYWlsYm94LmMgYi9kcml2ZXJzL21haWxib3gvYmNtLXBkYy1tYWlsYm94LmMKaW5kZXggY2JlMGMxZS4uYzE5ZGQ4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWlsYm94L2JjbS1wZGMtbWFpbGJveC5jCisrKyBiL2RyaXZlcnMvbWFpbGJveC9iY20tcGRjLW1haWxib3guYwpAQCAtNDY5LDcgKzQ2OSw3IEBACiAgKiB0aGlzIGRpcmVjdG9yeSBmb3IgYSBTUFUuCiAgKiBAcGRjczogUERDIHN0YXRlIHN0cnVjdHVyZQogICovCi12b2lkIHBkY19zZXR1cF9kZWJ1Z2ZzKHN0cnVjdCBwZGNfc3RhdGUgKnBkY3MpCitzdGF0aWMgdm9pZCBwZGNfc2V0dXBfZGVidWdmcyhzdHJ1Y3QgcGRjX3N0YXRlICpwZGNzKQogewogCWNoYXIgc3B1X3N0YXRzX25hbWVbMTZdOwogCkBAIC00ODUsNyArNDg1LDcgQEAKIAkJCQkJCSAgJnBkY19kZWJ1Z2ZzX3N0YXRzKTsKIH0KIAotdm9pZCBwZGNfZnJlZV9kZWJ1Z2ZzKHZvaWQpCitzdGF0aWMgdm9pZCBwZGNfZnJlZV9kZWJ1Z2ZzKHZvaWQpCiB7CiAJaWYgKGRlYnVnZnNfZGlyICYmIHNpbXBsZV9lbXB0eShkZWJ1Z2ZzX2RpcikpIHsKIAkJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGRlYnVnZnNfZGlyKTsKQEAgLTExOTEsMTAgKzExOTEsMTEgQEAKIHsKIAlzdHJ1Y3QgcGRjX3N0YXRlICpwZGNzID0gY2hhbi0+Y29uX3ByaXY7CiAKLQlpZiAocGRjcykKLQkJZGV2X2RiZygmcGRjcy0+cGRldi0+ZGV2LAotCQkJIlNodXRkb3duIG1haWxib3ggY2hhbm5lbCBmb3IgUERDICV1IiwgcGRjcy0+cGRjX2lkeCk7CisJaWYgKCFwZGNzKQorCQlyZXR1cm47CiAKKwlkZXZfZGJnKCZwZGNzLT5wZGV2LT5kZXYsCisJCSJTaHV0ZG93biBtYWlsYm94IGNoYW5uZWwgZm9yIFBEQyAldSIsIHBkY3MtPnBkY19pZHgpOwogCXBkY19yaW5nX2ZyZWUocGRjcyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFpbGJveC9wY2MuYyBiL2RyaXZlcnMvbWFpbGJveC9wY2MuYwppbmRleCAwNDM4MjhkLi4wOGM4N2ZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21haWxib3gvcGNjLmMKKysrIGIvZHJpdmVycy9tYWlsYm94L3BjYy5jCkBAIC01OSw2ICs1OSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbWFpbGJveF9jb250cm9sbGVyLmg+CkBAIC02OCwxMSArNjksMTYgQEAKICNpbmNsdWRlICJtYWlsYm94LmgiCiAKICNkZWZpbmUgTUFYX1BDQ19TVUJTUEFDRVMJMjU2CisjZGVmaW5lIE1CT1hfSVJRX05BTUUJCSJwY2MtbWJveCIKIAogc3RhdGljIHN0cnVjdCBtYm94X2NoYW4gKnBjY19tYm94X2NoYW5uZWxzOwogCiAvKiBBcnJheSBvZiBjYWNoZWQgdmlydHVhbCBhZGRyZXNzIGZvciBkb29yYmVsbCByZWdpc3RlcnMgKi8KIHN0YXRpYyB2b2lkIF9faW9tZW0gKipwY2NfZG9vcmJlbGxfdmFkZHI7CisvKiBBcnJheSBvZiBjYWNoZWQgdmlydHVhbCBhZGRyZXNzIGZvciBkb29yYmVsbCBhY2sgcmVnaXN0ZXJzICovCitzdGF0aWMgdm9pZCBfX2lvbWVtICoqcGNjX2Rvb3JiZWxsX2Fja192YWRkcjsKKy8qIEFycmF5IG9mIGRvb3JiZWxsIGludGVycnVwdHMgKi8KK3N0YXRpYyBpbnQgKnBjY19kb29yYmVsbF9pcnE7CiAKIHN0YXRpYyBzdHJ1Y3QgbWJveF9jb250cm9sbGVyIHBjY19tYm94X2N0cmwgPSB7fTsKIC8qKgpAQCAtOTEsNzkgKzk3LDYgQEAKIAlyZXR1cm4gJnBjY19tYm94X2NoYW5uZWxzW2lkXTsKIH0KIAotLyoqCi0gKiBwY2NfbWJveF9yZXF1ZXN0X2NoYW5uZWwgLSBQQ0MgY2xpZW50cyBjYWxsIHRoaXMgZnVuY3Rpb24gdG8KLSAqCQlyZXF1ZXN0IGEgcG9pbnRlciB0byB0aGVpciBQQ0Mgc3Vic3BhY2UsIGZyb20gd2hpY2ggdGhleQotICoJCWNhbiBnZXQgdGhlIGRldGFpbHMgb2YgY29tbXVuaWNhdGluZyB3aXRoIHRoZSByZW1vdGUuCi0gKiBAY2w6IFBvaW50ZXIgdG8gTWFpbGJveCBjbGllbnQsIHNvIHdlIGtub3cgd2hlcmUgdG8gYmluZCB0aGUKLSAqCQlDaGFubmVsLgotICogQHN1YnNwYWNlX2lkOiBUaGUgUENDIFN1YnNwYWNlIGluZGV4IGFzIHBhcnNlZCBpbiB0aGUgUENDIGNsaWVudAotICoJCUFDUEkgcGFja2FnZS4gVGhpcyBpcyB1c2VkIHRvIGxvb2t1cCB0aGUgYXJyYXkgb2YgUENDCi0gKgkJc3Vic3BhY2VzIGFzIHBhcnNlZCBieSB0aGUgUENDIE1haWxib3ggY29udHJvbGxlci4KLSAqCi0gKiBSZXR1cm46IFBvaW50ZXIgdG8gdGhlIE1haWxib3ggQ2hhbm5lbCBpZiBzdWNjZXNzZnVsIG9yCi0gKgkJRVJSX1BUUi4KLSAqLwotc3RydWN0IG1ib3hfY2hhbiAqcGNjX21ib3hfcmVxdWVzdF9jaGFubmVsKHN0cnVjdCBtYm94X2NsaWVudCAqY2wsCi0JCWludCBzdWJzcGFjZV9pZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBwY2NfbWJveF9jdHJsLmRldjsKLQlzdHJ1Y3QgbWJveF9jaGFuICpjaGFuOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKgotCSAqIEVhY2ggUENDIFN1YnNwYWNlIGlzIGEgTWFpbGJveCBDaGFubmVsLgotCSAqIFRoZSBQQ0MgQ2xpZW50cyBnZXQgdGhlaXIgUENDIFN1YnNwYWNlIElECi0JICogZnJvbSB0aGVpciBvd24gdGFibGVzIGFuZCBwYXNzIGl0IGhlcmUuCi0JICogVGhpcyByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgUENDIHN1YnNwYWNlCi0JICogZm9yIHRoZSBDbGllbnQgdG8gb3BlcmF0ZSBvbi4KLQkgKi8KLQljaGFuID0gZ2V0X3BjY19jaGFubmVsKHN1YnNwYWNlX2lkKTsKLQotCWlmIChJU19FUlIoY2hhbikgfHwgY2hhbi0+Y2wpIHsKLQkJZGV2X2VycihkZXYsICJDaGFubmVsIG5vdCBmb3VuZCBmb3IgaWR4OiAlZFxuIiwgc3Vic3BhY2VfaWQpOwotCQlyZXR1cm4gRVJSX1BUUigtRUJVU1kpOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFuLT5sb2NrLCBmbGFncyk7Ci0JY2hhbi0+bXNnX2ZyZWUgPSAwOwotCWNoYW4tPm1zZ19jb3VudCA9IDA7Ci0JY2hhbi0+YWN0aXZlX3JlcSA9IE5VTEw7Ci0JY2hhbi0+Y2wgPSBjbDsKLQlpbml0X2NvbXBsZXRpb24oJmNoYW4tPnR4X2NvbXBsZXRlKTsKLQotCWlmIChjaGFuLT50eGRvbmVfbWV0aG9kID09IFRYRE9ORV9CWV9QT0xMICYmIGNsLT5rbm93c190eGRvbmUpCi0JCWNoYW4tPnR4ZG9uZV9tZXRob2QgfD0gVFhET05FX0JZX0FDSzsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiBjaGFuOwotfQotRVhQT1JUX1NZTUJPTF9HUEwocGNjX21ib3hfcmVxdWVzdF9jaGFubmVsKTsKLQotLyoqCi0gKiBwY2NfbWJveF9mcmVlX2NoYW5uZWwgLSBDbGllbnRzIGNhbGwgdGhpcyB0byBmcmVlIHRoZWlyIENoYW5uZWwuCi0gKgotICogQGNoYW46IFBvaW50ZXIgdG8gdGhlIG1haWxib3ggY2hhbm5lbCBhcyByZXR1cm5lZCBieQotICoJCXBjY19tYm94X3JlcXVlc3RfY2hhbm5lbCgpCi0gKi8KLXZvaWQgcGNjX21ib3hfZnJlZV9jaGFubmVsKHN0cnVjdCBtYm94X2NoYW4gKmNoYW4pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghY2hhbiB8fCAhY2hhbi0+Y2wpCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFuLT5sb2NrLCBmbGFncyk7Ci0JY2hhbi0+Y2wgPSBOVUxMOwotCWNoYW4tPmFjdGl2ZV9yZXEgPSBOVUxMOwotCWlmIChjaGFuLT50eGRvbmVfbWV0aG9kID09IChUWERPTkVfQllfUE9MTCB8IFRYRE9ORV9CWV9BQ0spKQotCQljaGFuLT50eGRvbmVfbWV0aG9kID0gVFhET05FX0JZX1BPTEw7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFuLT5sb2NrLCBmbGFncyk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChwY2NfbWJveF9mcmVlX2NoYW5uZWwpOwotCiAvKgogICogUENDIGNhbiBiZSB1c2VkIHdpdGggcGVyZiBjcml0aWNhbCBkcml2ZXJzIHN1Y2ggYXMgQ1BQQwogICogU28gaXQgbWFrZXMgc2Vuc2UgdG8gbG9jYWxseSBjYWNoZSB0aGUgdmlydHVhbCBhZGRyZXNzIGFuZApAQCAtMjI1LDYgKzE1OCwxNjcgQEAKIH0KIAogLyoqCisgKiBwY2NfbWFwX2ludGVycnVwdCAtIE1hcCBhIFBDQyBzdWJzcGFjZSBHU0kgdG8gYSBsaW51eCBJUlEgbnVtYmVyCisgKiBAaW50ZXJydXB0OiBHU0kgbnVtYmVyLgorICogQGZsYWdzOiBpbnRlcnJ1cHQgZmxhZ3MKKyAqCisgKiBSZXR1cm5zOiBhIHZhbGlkIGxpbnV4IElSUSBudW1iZXIgb24gc3VjY2VzcworICoJCTAgb3IgLUVJTlZBTCBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgcGNjX21hcF9pbnRlcnJ1cHQodTMyIGludGVycnVwdCwgdTMyIGZsYWdzKQoreworCWludCB0cmlnZ2VyLCBwb2xhcml0eTsKKworCWlmICghaW50ZXJydXB0KQorCQlyZXR1cm4gMDsKKworCXRyaWdnZXIgPSAoZmxhZ3MgJiBBQ1BJX1BDQ1RfSU5URVJSVVBUX01PREUpID8gQUNQSV9FREdFX1NFTlNJVElWRQorCQkJOiBBQ1BJX0xFVkVMX1NFTlNJVElWRTsKKworCXBvbGFyaXR5ID0gKGZsYWdzICYgQUNQSV9QQ0NUX0lOVEVSUlVQVF9QT0xBUklUWSkgPyBBQ1BJX0FDVElWRV9MT1cKKwkJCTogQUNQSV9BQ1RJVkVfSElHSDsKKworCXJldHVybiBhY3BpX3JlZ2lzdGVyX2dzaShOVUxMLCBpbnRlcnJ1cHQsIHRyaWdnZXIsIHBvbGFyaXR5KTsKK30KKworLyoqCisgKiBwY2NfbWJveF9pcnEgLSBQQ0MgbWFpbGJveCBpbnRlcnJ1cHQgaGFuZGxlcgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgcGNjX21ib3hfaXJxKGludCBpcnEsIHZvaWQgKnApCit7CisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICpkb29yYmVsbF9hY2s7CisJc3RydWN0IGFjcGlfcGNjdF9od19yZWR1Y2VkICpwY2N0X3NzOworCXN0cnVjdCBtYm94X2NoYW4gKmNoYW4gPSBwOworCXU2NCBkb29yYmVsbF9hY2tfcHJlc2VydmU7CisJdTY0IGRvb3JiZWxsX2Fja193cml0ZTsKKwl1NjQgZG9vcmJlbGxfYWNrX3ZhbDsKKwlpbnQgcmV0OworCisJcGNjdF9zcyA9IGNoYW4tPmNvbl9wcml2OworCisJbWJveF9jaGFuX3JlY2VpdmVkX2RhdGEoY2hhbiwgTlVMTCk7CisKKwlpZiAocGNjdF9zcy0+aGVhZGVyLnR5cGUgPT0gQUNQSV9QQ0NUX1RZUEVfSFdfUkVEVUNFRF9TVUJTUEFDRV9UWVBFMikgeworCQlzdHJ1Y3QgYWNwaV9wY2N0X2h3X3JlZHVjZWRfdHlwZTIgKnBjY3QyX3NzID0gY2hhbi0+Y29uX3ByaXY7CisJCXUzMiBpZCA9IGNoYW4gLSBwY2NfbWJveF9jaGFubmVsczsKKworCQlkb29yYmVsbF9hY2sgPSAmcGNjdDJfc3MtPmRvb3JiZWxsX2Fja19yZWdpc3RlcjsKKwkJZG9vcmJlbGxfYWNrX3ByZXNlcnZlID0gcGNjdDJfc3MtPmFja19wcmVzZXJ2ZV9tYXNrOworCQlkb29yYmVsbF9hY2tfd3JpdGUgPSBwY2N0Ml9zcy0+YWNrX3dyaXRlX21hc2s7CisKKwkJcmV0ID0gcmVhZF9yZWdpc3RlcihwY2NfZG9vcmJlbGxfYWNrX3ZhZGRyW2lkXSwKKwkJCQkgICAgJmRvb3JiZWxsX2Fja192YWwsCisJCQkJICAgIGRvb3JiZWxsX2Fjay0+Yml0X3dpZHRoKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiBJUlFfTk9ORTsKKworCQlyZXQgPSB3cml0ZV9yZWdpc3RlcihwY2NfZG9vcmJlbGxfYWNrX3ZhZGRyW2lkXSwKKwkJCQkgICAgIChkb29yYmVsbF9hY2tfdmFsICYgZG9vcmJlbGxfYWNrX3ByZXNlcnZlKQorCQkJCQl8IGRvb3JiZWxsX2Fja193cml0ZSwKKwkJCQkgICAgIGRvb3JiZWxsX2Fjay0+Yml0X3dpZHRoKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKgorICogcGNjX21ib3hfcmVxdWVzdF9jaGFubmVsIC0gUENDIGNsaWVudHMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvCisgKgkJcmVxdWVzdCBhIHBvaW50ZXIgdG8gdGhlaXIgUENDIHN1YnNwYWNlLCBmcm9tIHdoaWNoIHRoZXkKKyAqCQljYW4gZ2V0IHRoZSBkZXRhaWxzIG9mIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgcmVtb3RlLgorICogQGNsOiBQb2ludGVyIHRvIE1haWxib3ggY2xpZW50LCBzbyB3ZSBrbm93IHdoZXJlIHRvIGJpbmQgdGhlCisgKgkJQ2hhbm5lbC4KKyAqIEBzdWJzcGFjZV9pZDogVGhlIFBDQyBTdWJzcGFjZSBpbmRleCBhcyBwYXJzZWQgaW4gdGhlIFBDQyBjbGllbnQKKyAqCQlBQ1BJIHBhY2thZ2UuIFRoaXMgaXMgdXNlZCB0byBsb29rdXAgdGhlIGFycmF5IG9mIFBDQworICoJCXN1YnNwYWNlcyBhcyBwYXJzZWQgYnkgdGhlIFBDQyBNYWlsYm94IGNvbnRyb2xsZXIuCisgKgorICogUmV0dXJuOiBQb2ludGVyIHRvIHRoZSBNYWlsYm94IENoYW5uZWwgaWYgc3VjY2Vzc2Z1bCBvcgorICoJCUVSUl9QVFIuCisgKi8KK3N0cnVjdCBtYm94X2NoYW4gKnBjY19tYm94X3JlcXVlc3RfY2hhbm5lbChzdHJ1Y3QgbWJveF9jbGllbnQgKmNsLAorCQlpbnQgc3Vic3BhY2VfaWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcGNjX21ib3hfY3RybC5kZXY7CisJc3RydWN0IG1ib3hfY2hhbiAqY2hhbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBFYWNoIFBDQyBTdWJzcGFjZSBpcyBhIE1haWxib3ggQ2hhbm5lbC4KKwkgKiBUaGUgUENDIENsaWVudHMgZ2V0IHRoZWlyIFBDQyBTdWJzcGFjZSBJRAorCSAqIGZyb20gdGhlaXIgb3duIHRhYmxlcyBhbmQgcGFzcyBpdCBoZXJlLgorCSAqIFRoaXMgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIFBDQyBzdWJzcGFjZQorCSAqIGZvciB0aGUgQ2xpZW50IHRvIG9wZXJhdGUgb24uCisJICovCisJY2hhbiA9IGdldF9wY2NfY2hhbm5lbChzdWJzcGFjZV9pZCk7CisKKwlpZiAoSVNfRVJSKGNoYW4pIHx8IGNoYW4tPmNsKSB7CisJCWRldl9lcnIoZGV2LCAiQ2hhbm5lbCBub3QgZm91bmQgZm9yIGlkeDogJWRcbiIsIHN1YnNwYWNlX2lkKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVCVVNZKTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+bG9jaywgZmxhZ3MpOworCWNoYW4tPm1zZ19mcmVlID0gMDsKKwljaGFuLT5tc2dfY291bnQgPSAwOworCWNoYW4tPmFjdGl2ZV9yZXEgPSBOVUxMOworCWNoYW4tPmNsID0gY2w7CisJaW5pdF9jb21wbGV0aW9uKCZjaGFuLT50eF9jb21wbGV0ZSk7CisKKwlpZiAoY2hhbi0+dHhkb25lX21ldGhvZCA9PSBUWERPTkVfQllfUE9MTCAmJiBjbC0+a25vd3NfdHhkb25lKQorCQljaGFuLT50eGRvbmVfbWV0aG9kIHw9IFRYRE9ORV9CWV9BQ0s7CisKKwlpZiAocGNjX2Rvb3JiZWxsX2lycVtzdWJzcGFjZV9pZF0gPiAwKSB7CisJCWludCByYzsKKworCQlyYyA9IGRldm1fcmVxdWVzdF9pcnEoZGV2LCBwY2NfZG9vcmJlbGxfaXJxW3N1YnNwYWNlX2lkXSwKKwkJCQkgICAgICBwY2NfbWJveF9pcnEsIDAsIE1CT1hfSVJRX05BTUUsIGNoYW4pOworCQlpZiAodW5saWtlbHkocmMpKSB7CisJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZWdpc3RlciBQQ0MgaW50ZXJydXB0ICVkXG4iLAorCQkJCXBjY19kb29yYmVsbF9pcnFbc3Vic3BhY2VfaWRdKTsKKwkJCWNoYW4gPSBFUlJfUFRSKHJjKTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBjaGFuOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNjX21ib3hfcmVxdWVzdF9jaGFubmVsKTsKKworLyoqCisgKiBwY2NfbWJveF9mcmVlX2NoYW5uZWwgLSBDbGllbnRzIGNhbGwgdGhpcyB0byBmcmVlIHRoZWlyIENoYW5uZWwuCisgKgorICogQGNoYW46IFBvaW50ZXIgdG8gdGhlIG1haWxib3ggY2hhbm5lbCBhcyByZXR1cm5lZCBieQorICoJCXBjY19tYm94X3JlcXVlc3RfY2hhbm5lbCgpCisgKi8KK3ZvaWQgcGNjX21ib3hfZnJlZV9jaGFubmVsKHN0cnVjdCBtYm94X2NoYW4gKmNoYW4pCit7CisJdTMyIGlkID0gY2hhbiAtIHBjY19tYm94X2NoYW5uZWxzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWNoYW4gfHwgIWNoYW4tPmNsKQorCQlyZXR1cm47CisKKwlpZiAoaWQgPj0gcGNjX21ib3hfY3RybC5udW1fY2hhbnMpIHsKKwkJcHJfZGVidWcoInBjY19tYm94X2ZyZWVfY2hhbm5lbDogSW52YWxpZCBtYm94X2NoYW4gcGFzc2VkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFuLT5sb2NrLCBmbGFncyk7CisJY2hhbi0+Y2wgPSBOVUxMOworCWNoYW4tPmFjdGl2ZV9yZXEgPSBOVUxMOworCWlmIChjaGFuLT50eGRvbmVfbWV0aG9kID09IChUWERPTkVfQllfUE9MTCB8IFRYRE9ORV9CWV9BQ0spKQorCQljaGFuLT50eGRvbmVfbWV0aG9kID0gVFhET05FX0JZX1BPTEw7CisKKwlpZiAocGNjX2Rvb3JiZWxsX2lycVtpZF0gPiAwKQorCQlkZXZtX2ZyZWVfaXJxKGNoYW4tPm1ib3gtPmRldiwgcGNjX2Rvb3JiZWxsX2lycVtpZF0sIGNoYW4pOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbi0+bG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNjX21ib3hfZnJlZV9jaGFubmVsKTsKKworCisvKioKICAqIHBjY19zZW5kX2RhdGEgLSBDYWxsZWQgZnJvbSBNYWlsYm94IENvbnRyb2xsZXIgY29kZS4gVXNlZAogICoJCWhlcmUgb25seSB0byByaW5nIHRoZSBjaGFubmVsIGRvb3JiZWxsLiBUaGUgUENDIGNsaWVudAogICoJCXNwZWNpZmljIHJlYWQvd3JpdGUgaXMgZG9uZSBpbiB0aGUgY2xpZW50IGRyaXZlciBpbgpAQCAtMjk2LDggKzM5MCwxMCBAQAogCWlmIChwY2NfbWJveF9jdHJsLm51bV9jaGFucyA8PSBNQVhfUENDX1NVQlNQQUNFUykgewogCQlwY2N0X3NzID0gKHN0cnVjdCBhY3BpX3BjY3RfaHdfcmVkdWNlZCAqKSBoZWFkZXI7CiAKLQkJaWYgKHBjY3Rfc3MtPmhlYWRlci50eXBlICE9Ci0JCQkJQUNQSV9QQ0NUX1RZUEVfSFdfUkVEVUNFRF9TVUJTUEFDRSkgeworCQlpZiAoKHBjY3Rfc3MtPmhlYWRlci50eXBlICE9CisJCQkJQUNQSV9QQ0NUX1RZUEVfSFdfUkVEVUNFRF9TVUJTUEFDRSkKKwkJICAgICYmIChwY2N0X3NzLT5oZWFkZXIudHlwZSAhPQorCQkJCUFDUElfUENDVF9UWVBFX0hXX1JFRFVDRURfU1VCU1BBQ0VfVFlQRTIpKSB7CiAJCQlwcl9lcnIoIkluY29ycmVjdCBQQ0MgU3Vic3BhY2UgdHlwZSBkZXRlY3RlZFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMzA3LDYgKzQwMyw0MyBAQAogfQogCiAvKioKKyAqIHBjY19wYXJzZV9zdWJzcGFjZV9pcnEgLSBQYXJzZSB0aGUgUENDIElSUSBhbmQgUENDIEFDSyByZWdpc3RlcgorICoJCVRoZXJlIHNob3VsZCBiZSBvbmUgZW50cnkgcGVyIFBDQyBjbGllbnQuCisgKiBAaWQ6IFBDQyBzdWJzcGFjZSBpbmRleC4KKyAqIEBwY2N0X3NzOiBQb2ludGVyIHRvIHRoZSBBQ1BJIHN1YnRhYmxlIGhlYWRlciB1bmRlciB0aGUgUENDVC4KKyAqCisgKiBSZXR1cm46IDAgZm9yIFN1Y2Nlc3MsIGVsc2UgZXJybm8uCisgKgorICogVGhpcyBnZXRzIGNhbGxlZCBmb3IgZWFjaCBlbnRyeSBpbiB0aGUgUENDIHRhYmxlLgorICovCitzdGF0aWMgaW50IHBjY19wYXJzZV9zdWJzcGFjZV9pcnEoaW50IGlkLAorCQkJCSAgc3RydWN0IGFjcGlfcGNjdF9od19yZWR1Y2VkICpwY2N0X3NzKQoreworCXBjY19kb29yYmVsbF9pcnFbaWRdID0gcGNjX21hcF9pbnRlcnJ1cHQocGNjdF9zcy0+ZG9vcmJlbGxfaW50ZXJydXB0LAorCQkJCQkJICh1MzIpcGNjdF9zcy0+ZmxhZ3MpOworCWlmIChwY2NfZG9vcmJlbGxfaXJxW2lkXSA8PSAwKSB7CisJCXByX2VycigiUENDIEdTSSAlZCBub3QgcmVnaXN0ZXJlZFxuIiwKKwkJICAgICAgIHBjY3Rfc3MtPmRvb3JiZWxsX2ludGVycnVwdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChwY2N0X3NzLT5oZWFkZXIudHlwZQorCQk9PSBBQ1BJX1BDQ1RfVFlQRV9IV19SRURVQ0VEX1NVQlNQQUNFX1RZUEUyKSB7CisJCXN0cnVjdCBhY3BpX3BjY3RfaHdfcmVkdWNlZF90eXBlMiAqcGNjdDJfc3MgPSAodm9pZCAqKXBjY3Rfc3M7CisKKwkJcGNjX2Rvb3JiZWxsX2Fja192YWRkcltpZF0gPSBhY3BpX29zX2lvcmVtYXAoCisJCQkJcGNjdDJfc3MtPmRvb3JiZWxsX2Fja19yZWdpc3Rlci5hZGRyZXNzLAorCQkJCXBjY3QyX3NzLT5kb29yYmVsbF9hY2tfcmVnaXN0ZXIuYml0X3dpZHRoIC8gOCk7CisJCWlmICghcGNjX2Rvb3JiZWxsX2Fja192YWRkcltpZF0pIHsKKwkJCXByX2VycigiRmFpbGVkIHRvIGlvcmVtYXAgUENDIEFDSyByZWdpc3RlclxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioKICAqIGFjcGlfcGNjX3Byb2JlIC0gUGFyc2UgdGhlIEFDUEkgdHJlZSBmb3IgdGhlIFBDQ1QuCiAgKgogICogUmV0dXJuOiAwIGZvciBTdWNjZXNzLCBlbHNlIGVycm5vLgpAQCAtMzE2LDcgKzQ0OSw5IEBACiAJYWNwaV9zaXplIHBjY3RfdGJsX2hlYWRlcl9zaXplOwogCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqcGNjdF90Ymw7CiAJc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICpwY2N0X2VudHJ5OwotCWludCBjb3VudCwgaTsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9wY2N0ICphY3BpX3BjY3RfdGJsOworCWludCBjb3VudCwgaSwgcmM7CisJaW50IHN1bSA9IDA7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKIAkvKiBTZWFyY2ggZm9yIFBDQ1QgKi8KQEAgLTMzMywzNyArNDY4LDY2IEBACiAJCQlzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfcGNjdCksCiAJCQlBQ1BJX1BDQ1RfVFlQRV9IV19SRURVQ0VEX1NVQlNQQUNFLAogCQkJcGFyc2VfcGNjX3N1YnNwYWNlLCBNQVhfUENDX1NVQlNQQUNFUyk7CisJc3VtICs9IChjb3VudCA+IDApID8gY291bnQgOiAwOwogCi0JaWYgKGNvdW50IDw9IDApIHsKKwljb3VudCA9IGFjcGlfdGFibGVfcGFyc2VfZW50cmllcyhBQ1BJX1NJR19QQ0NULAorCQkJc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX3BjY3QpLAorCQkJQUNQSV9QQ0NUX1RZUEVfSFdfUkVEVUNFRF9TVUJTUEFDRV9UWVBFMiwKKwkJCXBhcnNlX3BjY19zdWJzcGFjZSwgTUFYX1BDQ19TVUJTUEFDRVMpOworCXN1bSArPSAoY291bnQgPiAwKSA/IGNvdW50IDogMDsKKworCWlmIChzdW0gPT0gMCB8fCBzdW0gPj0gTUFYX1BDQ19TVUJTUEFDRVMpIHsKIAkJcHJfZXJyKCJFcnJvciBwYXJzaW5nIFBDQyBzdWJzcGFjZXMgZnJvbSBQQ0NUXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJcGNjX21ib3hfY2hhbm5lbHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWJveF9jaGFuKSAqCi0JCQljb3VudCwgR0ZQX0tFUk5FTCk7Ci0KKwkJCXN1bSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwY2NfbWJveF9jaGFubmVscykgewogCQlwcl9lcnIoIkNvdWxkIG5vdCBhbGxvY2F0ZSBzcGFjZSBmb3IgUENDIG1ib3ggY2hhbm5lbHNcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlwY2NfZG9vcmJlbGxfdmFkZHIgPSBrY2FsbG9jKGNvdW50LCBzaXplb2Yodm9pZCAqKSwgR0ZQX0tFUk5FTCk7CisJcGNjX2Rvb3JiZWxsX3ZhZGRyID0ga2NhbGxvYyhzdW0sIHNpemVvZih2b2lkICopLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBjY19kb29yYmVsbF92YWRkcikgewotCQlrZnJlZShwY2NfbWJveF9jaGFubmVscyk7Ci0JCXJldHVybiAtRU5PTUVNOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2ZyZWVfbWJveDsKKwl9CisKKwlwY2NfZG9vcmJlbGxfYWNrX3ZhZGRyID0ga2NhbGxvYyhzdW0sIHNpemVvZih2b2lkICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBjY19kb29yYmVsbF9hY2tfdmFkZHIpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlX2RiX3ZhZGRyOworCX0KKworCXBjY19kb29yYmVsbF9pcnEgPSBrY2FsbG9jKHN1bSwgc2l6ZW9mKGludCksIEdGUF9LRVJORUwpOworCWlmICghcGNjX2Rvb3JiZWxsX2lycSkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2ZyZWVfZGJfYWNrX3ZhZGRyOwogCX0KIAogCS8qIFBvaW50IHRvIHRoZSBmaXJzdCBQQ0Mgc3Vic3BhY2UgZW50cnkgKi8KIAlwY2N0X2VudHJ5ID0gKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqKSAoCiAJCSh1bnNpZ25lZCBsb25nKSBwY2N0X3RibCArIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9wY2N0KSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCWFjcGlfcGNjdF90YmwgPSAoc3RydWN0IGFjcGlfdGFibGVfcGNjdCAqKSBwY2N0X3RibDsKKwlpZiAoYWNwaV9wY2N0X3RibC0+ZmxhZ3MgJiBBQ1BJX1BDQ1RfRE9PUkJFTEwpCisJCXBjY19tYm94X2N0cmwudHhkb25lX2lycSA9IHRydWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3VtOyBpKyspIHsKIAkJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICpkYl9yZWc7CiAJCXN0cnVjdCBhY3BpX3BjY3RfaHdfcmVkdWNlZCAqcGNjdF9zczsKIAkJcGNjX21ib3hfY2hhbm5lbHNbaV0uY29uX3ByaXYgPSBwY2N0X2VudHJ5OwogCisJCXBjY3Rfc3MgPSAoc3RydWN0IGFjcGlfcGNjdF9od19yZWR1Y2VkICopIHBjY3RfZW50cnk7CisKKwkJaWYgKHBjY19tYm94X2N0cmwudHhkb25lX2lycSkgeworCQkJcmMgPSBwY2NfcGFyc2Vfc3Vic3BhY2VfaXJxKGksIHBjY3Rfc3MpOworCQkJaWYgKHJjIDwgMCkKKwkJCQlnb3RvIGVycjsKKwkJfQorCiAJCS8qIElmIGRvb3JiZWxsIGlzIGluIHN5c3RlbSBtZW1vcnkgY2FjaGUgdGhlIHZpcnQgYWRkcmVzcyAqLwotCQlwY2N0X3NzID0gKHN0cnVjdCBhY3BpX3BjY3RfaHdfcmVkdWNlZCAqKXBjY3RfZW50cnk7CiAJCWRiX3JlZyA9ICZwY2N0X3NzLT5kb29yYmVsbF9yZWdpc3RlcjsKIAkJaWYgKGRiX3JlZy0+c3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX01FTU9SWSkKIAkJCXBjY19kb29yYmVsbF92YWRkcltpXSA9IGFjcGlfb3NfaW9yZW1hcChkYl9yZWctPmFkZHJlc3MsCkBAIC0zNzIsMTEgKzUzNiwyMSBAQAogCQkJKCh1bnNpZ25lZCBsb25nKSBwY2N0X2VudHJ5ICsgcGNjdF9lbnRyeS0+bGVuZ3RoKTsKIAl9CiAKLQlwY2NfbWJveF9jdHJsLm51bV9jaGFucyA9IGNvdW50OworCXBjY19tYm94X2N0cmwubnVtX2NoYW5zID0gc3VtOwogCiAJcHJfaW5mbygiRGV0ZWN0ZWQgJWQgUENDIFN1YnNwYWNlc1xuIiwgcGNjX21ib3hfY3RybC5udW1fY2hhbnMpOwogCiAJcmV0dXJuIDA7CisKK2VycjoKKwlrZnJlZShwY2NfZG9vcmJlbGxfaXJxKTsKK2Vycl9mcmVlX2RiX2Fja192YWRkcjoKKwlrZnJlZShwY2NfZG9vcmJlbGxfYWNrX3ZhZGRyKTsKK2Vycl9mcmVlX2RiX3ZhZGRyOgorCWtmcmVlKHBjY19kb29yYmVsbF92YWRkcik7CitlcnJfZnJlZV9tYm94OgorCWtmcmVlKHBjY19tYm94X2NoYW5uZWxzKTsKKwlyZXR1cm4gcmM7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWlsYm94L3BsYXRmb3JtX21odS5jIGIvZHJpdmVycy9tYWlsYm94L3BsYXRmb3JtX21odS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMzIwMWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21haWxib3gvcGxhdGZvcm1fbWh1LmMKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQmF5TGlicmUgU0FTLgorICogQXV0aG9yOiBOZWlsIEFybXN0cm9uZyA8bmFybXN0cm9uZ0BiYXlsaWJyZS5jb20+CisgKiBTeW5jaHJvbmlzZWQgd2l0aCBhcm1fbWh1LmMgZnJvbSA6CisgKiBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNSBGdWppdHN1IFNlbWljb25kdWN0b3IgTHRkLgorICogQ29weXJpZ2h0IChDKSAyMDE1IExpbmFybyBMdGQuCisgKiBBdXRob3I6IEphc3NpIEJyYXIgPGphc3dpbmRlci5zaW5naEBsaW5hcm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21haWxib3hfY29udHJvbGxlci5oPgorCisjZGVmaW5lIElOVFJfU0VUX09GUwkweDAKKyNkZWZpbmUgSU5UUl9TVEFUX09GUwkweDQKKyNkZWZpbmUgSU5UUl9DTFJfT0ZTCTB4OAorCisjZGVmaW5lIE1IVV9TRUNfT0ZGU0VUCTB4MAorI2RlZmluZSBNSFVfTFBfT0ZGU0VUCTB4YworI2RlZmluZSBNSFVfSFBfT0ZGU0VUCTB4MTgKKyNkZWZpbmUgVFhfUkVHX09GRlNFVAkweDI0CisKKyNkZWZpbmUgTUhVX0NIQU5TCTMKKworc3RydWN0IHBsYXRmb3JtX21odV9saW5rIHsKKwlpbnQgaXJxOworCXZvaWQgX19pb21lbSAqdHhfcmVnOworCXZvaWQgX19pb21lbSAqcnhfcmVnOworfTsKKworc3RydWN0IHBsYXRmb3JtX21odSB7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXN0cnVjdCBwbGF0Zm9ybV9taHVfbGluayBtbGlua1tNSFVfQ0hBTlNdOworCXN0cnVjdCBtYm94X2NoYW4gY2hhbltNSFVfQ0hBTlNdOworCXN0cnVjdCBtYm94X2NvbnRyb2xsZXIgbWJveDsKK307CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBwbGF0Zm9ybV9taHVfcnhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKnApCit7CisJc3RydWN0IG1ib3hfY2hhbiAqY2hhbiA9IHA7CisJc3RydWN0IHBsYXRmb3JtX21odV9saW5rICptbGluayA9IGNoYW4tPmNvbl9wcml2OworCXUzMiB2YWw7CisKKwl2YWwgPSByZWFkbF9yZWxheGVkKG1saW5rLT5yeF9yZWcgKyBJTlRSX1NUQVRfT0ZTKTsKKwlpZiAoIXZhbCkKKwkJcmV0dXJuIElSUV9OT05FOworCisJbWJveF9jaGFuX3JlY2VpdmVkX2RhdGEoY2hhbiwgKHZvaWQgKikmdmFsKTsKKworCXdyaXRlbF9yZWxheGVkKHZhbCwgbWxpbmstPnJ4X3JlZyArIElOVFJfQ0xSX09GUyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBib29sIHBsYXRmb3JtX21odV9sYXN0X3R4X2RvbmUoc3RydWN0IG1ib3hfY2hhbiAqY2hhbikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fbWh1X2xpbmsgKm1saW5rID0gY2hhbi0+Y29uX3ByaXY7CisJdTMyIHZhbCA9IHJlYWRsX3JlbGF4ZWQobWxpbmstPnR4X3JlZyArIElOVFJfU1RBVF9PRlMpOworCisJcmV0dXJuICh2YWwgPT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgcGxhdGZvcm1fbWh1X3NlbmRfZGF0YShzdHJ1Y3QgbWJveF9jaGFuICpjaGFuLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBwbGF0Zm9ybV9taHVfbGluayAqbWxpbmsgPSBjaGFuLT5jb25fcHJpdjsKKwl1MzIgKmFyZyA9IGRhdGE7CisKKwl3cml0ZWxfcmVsYXhlZCgqYXJnLCBtbGluay0+dHhfcmVnICsgSU5UUl9TRVRfT0ZTKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBsYXRmb3JtX21odV9zdGFydHVwKHN0cnVjdCBtYm94X2NoYW4gKmNoYW4pCit7CisJc3RydWN0IHBsYXRmb3JtX21odV9saW5rICptbGluayA9IGNoYW4tPmNvbl9wcml2OworCXUzMiB2YWw7CisJaW50IHJldDsKKworCXZhbCA9IHJlYWRsX3JlbGF4ZWQobWxpbmstPnR4X3JlZyArIElOVFJfU1RBVF9PRlMpOworCXdyaXRlbF9yZWxheGVkKHZhbCwgbWxpbmstPnR4X3JlZyArIElOVFJfQ0xSX09GUyk7CisKKwlyZXQgPSByZXF1ZXN0X2lycShtbGluay0+aXJxLCBwbGF0Zm9ybV9taHVfcnhfaW50ZXJydXB0LAorCQkJICBJUlFGX1NIQVJFRCwgInBsYXRmb3JtX21odV9saW5rIiwgY2hhbik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGNoYW4tPm1ib3gtPmRldiwKKwkJCSJVbmFibGUgdG8gYWNxdWlyZSBJUlEgJWRcbiIsIG1saW5rLT5pcnEpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwbGF0Zm9ybV9taHVfc2h1dGRvd24oc3RydWN0IG1ib3hfY2hhbiAqY2hhbikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fbWh1X2xpbmsgKm1saW5rID0gY2hhbi0+Y29uX3ByaXY7CisKKwlmcmVlX2lycShtbGluay0+aXJxLCBjaGFuKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBtYm94X2NoYW5fb3BzIHBsYXRmb3JtX21odV9vcHMgPSB7CisJLnNlbmRfZGF0YSA9IHBsYXRmb3JtX21odV9zZW5kX2RhdGEsCisJLnN0YXJ0dXAgPSBwbGF0Zm9ybV9taHVfc3RhcnR1cCwKKwkuc2h1dGRvd24gPSBwbGF0Zm9ybV9taHVfc2h1dGRvd24sCisJLmxhc3RfdHhfZG9uZSA9IHBsYXRmb3JtX21odV9sYXN0X3R4X2RvbmUsCit9OworCitzdGF0aWMgaW50IHBsYXRmb3JtX21odV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCBpLCBlcnI7CisJc3RydWN0IHBsYXRmb3JtX21odSAqbWh1OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IHBsYXRmb3JtX21odV9yZWdbTUhVX0NIQU5TXSA9IHsKKwkJTUhVX1NFQ19PRkZTRVQsIE1IVV9MUF9PRkZTRVQsIE1IVV9IUF9PRkZTRVQKKwl9OworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBkZXZpY2UgKi8KKwltaHUgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKm1odSksIEdGUF9LRVJORUwpOworCWlmICghbWh1KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJbWh1LT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKG1odS0+YmFzZSkpIHsKKwkJZGV2X2VycihkZXYsICJpb3JlbWFwIGZhaWxlZFxuIik7CisJCXJldHVybiBQVFJfRVJSKG1odS0+YmFzZSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE1IVV9DSEFOUzsgaSsrKSB7CisJCW1odS0+Y2hhbltpXS5jb25fcHJpdiA9ICZtaHUtPm1saW5rW2ldOworCQltaHUtPm1saW5rW2ldLmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgaSk7CisJCWlmIChtaHUtPm1saW5rW2ldLmlycSA8IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBpcnElZFxuIiwgaSk7CisJCQlyZXR1cm4gbWh1LT5tbGlua1tpXS5pcnE7CisJCX0KKwkJbWh1LT5tbGlua1tpXS5yeF9yZWcgPSBtaHUtPmJhc2UgKyBwbGF0Zm9ybV9taHVfcmVnW2ldOworCQltaHUtPm1saW5rW2ldLnR4X3JlZyA9IG1odS0+bWxpbmtbaV0ucnhfcmVnICsgVFhfUkVHX09GRlNFVDsKKwl9CisKKwltaHUtPm1ib3guZGV2ID0gZGV2OworCW1odS0+bWJveC5jaGFucyA9ICZtaHUtPmNoYW5bMF07CisJbWh1LT5tYm94Lm51bV9jaGFucyA9IE1IVV9DSEFOUzsKKwltaHUtPm1ib3gub3BzID0gJnBsYXRmb3JtX21odV9vcHM7CisJbWh1LT5tYm94LnR4ZG9uZV9pcnEgPSBmYWxzZTsKKwltaHUtPm1ib3gudHhkb25lX3BvbGwgPSB0cnVlOworCW1odS0+bWJveC50eHBvbGxfcGVyaW9kID0gMTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1odSk7CisKKwllcnIgPSBtYm94X2NvbnRyb2xsZXJfcmVnaXN0ZXIoJm1odS0+bWJveCk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWdpc3RlciBtYWlsYm94ZXMgJWRcbiIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJZGV2X2luZm8oZGV2LCAiUGxhdGZvcm0gTUhVIE1haWxib3ggcmVnaXN0ZXJlZFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGxhdGZvcm1fbWh1X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9taHUgKm1odSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJbWJveF9jb250cm9sbGVyX3VucmVnaXN0ZXIoJm1odS0+bWJveCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcGxhdGZvcm1fbWh1X2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAiYW1sb2dpYyxtZXNvbi1neGJiLW1odSIsIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHBsYXRmb3JtX21odV9kdF9pZHMpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwbGF0Zm9ybV9taHVfZHJpdmVyID0geworCS5wcm9iZQk9IHBsYXRmb3JtX21odV9wcm9iZSwKKwkucmVtb3ZlCT0gcGxhdGZvcm1fbWh1X3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJwbGF0Zm9ybS1taHUiLAorCQkub2ZfbWF0Y2hfdGFibGUJPSBwbGF0Zm9ybV9taHVfZHRfaWRzLAorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHBsYXRmb3JtX21odV9kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnBsYXRmb3JtLW1odSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQbGF0Zm9ybSBNSFUgRHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJOZWlsIEFybXN0cm9uZyA8bmFybXN0cm9uZ0BiYXlsaWJyZS5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21jYi9LY29uZmlnIGIvZHJpdmVycy9tY2IvS2NvbmZpZwppbmRleCBlOWE2OTc2Li43NmQ5YzUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21jYi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWNiL0tjb25maWcKQEAgLTI4LDQgKzI4LDEzIEBACiAKIAkgICBJZiBidWlsZCBhcyBhIG1vZHVsZSwgdGhlIG1vZHVsZSBpcyBjYWxsZWQgbWNiLXBjaS5rbwogCitjb25maWcgTUNCX0xQQworCSAgIHRyaXN0YXRlICJMUEMgKG5vbiBQQ0kpIGJhc2VkIE1DQiBjYXJyaWVyIgorCSAgIGRlZmF1bHQgbgorCSAgIGhlbHAKKworCSAgIFRoaXMgaXMgYSBNQ0IgY2FycmllciBvbiBhIExQQyBvciBub24gUENJIGRldmljZS4KKworCSAgIElmIGJ1aWxkIGFzIGEgbW9kdWxlLCB0aGUgbW9kdWxlIGlzIGNhbGxlZCBtY2ItbHBjLmtvCisKIGVuZGlmICMgTUNCCmRpZmYgLS1naXQgYS9kcml2ZXJzL21jYi9NYWtlZmlsZSBiL2RyaXZlcnMvbWNiL01ha2VmaWxlCmluZGV4IDFhZTE0MTMuLmJjYzc3NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWNiL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWNiL01ha2VmaWxlCkBAIC01LDMgKzUsNCBAQAogbWNiLXkgKz0gbWNiLXBhcnNlLm8KIAogb2JqLSQoQ09ORklHX01DQl9QQ0kpICs9IG1jYi1wY2kubworb2JqLSQoQ09ORklHX01DQl9MUEMpICs9IG1jYi1scGMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tY2IvbWNiLWNvcmUuYyBiL2RyaXZlcnMvbWNiL21jYi1jb3JlLmMKaW5kZXggNmYyYzg1Mi4uOTIxYTVkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tY2IvbWNiLWNvcmUuYworKysgYi9kcml2ZXJzL21jYi9tY2ItY29yZS5jCkBAIC0yMzMsNiArMjMzLDcgQEAKIAlkZXYtPmRldi5idXMgPSAmbWNiX2J1c190eXBlOwogCWRldi0+ZGV2LnBhcmVudCA9IGJ1cy0+ZGV2LnBhcmVudDsKIAlkZXYtPmRldi5yZWxlYXNlID0gbWNiX3JlbGVhc2VfZGV2OworCWRldi0+ZG1hX2RldiA9IGJ1cy0+Y2FycmllcjsKIAogCWRldmljZV9pZCA9IGRldi0+aWQ7CiAJZGV2X3NldF9uYW1lKCZkZXYtPmRldiwgIm1jYiVkLTE2eiUwM2QtJWQ6JWQ6JWQiLApAQCAtMzY5LDcgKzM3MCw2IEBACiAJaWYgKCFkZXYpCiAJCXJldHVybiBOVUxMOwogCi0JSU5JVF9MSVNUX0hFQUQoJmRldi0+YnVzX2xpc3QpOwogCWRldi0+YnVzID0gYnVzOwogCiAJcmV0dXJuIGRldjsKQEAgLTQwNSwyMCArNDA1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX21jYl9idXNfYWRkX2NoaWxkKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbWNiX2RldmljZSAqbWRldiA9IHRvX21jYl9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3QgbWNiX2J1cyAqY2hpbGQ7Ci0KLQlCVUdfT04oIW1kZXYtPmlzX2FkZGVkKTsKLQljaGlsZCA9IG1kZXYtPnN1Ym9yZGluYXRlOwotCi0JaWYgKGNoaWxkKQotCQltY2JfYnVzX2FkZF9kZXZpY2VzKGNoaWxkKTsKLQotCXJldHVybiAwOwotfQotCiAvKioKICAqIG1jYl9idXNfYWRkX2RldmljZXMoKSAtIEFkZCBkZXZpY2VzIGluIHRoZSBidXMnIGludGVybmFsIGRldmljZSBsaXN0CiAgKiBAYnVzOiBUaGUgQG1jYl9idXMgd2UgYWRkIHRoZSBkZXZpY2VzCkBAIC00MjgsOCArNDE0LDYgQEAKIHZvaWQgbWNiX2J1c19hZGRfZGV2aWNlcyhjb25zdCBzdHJ1Y3QgbWNiX2J1cyAqYnVzKQogewogCWJ1c19mb3JfZWFjaF9kZXYoJm1jYl9idXNfdHlwZSwgTlVMTCwgTlVMTCwgX19tY2JfYnVzX2FkZF9kZXZpY2VzKTsKLQlidXNfZm9yX2VhY2hfZGV2KCZtY2JfYnVzX3R5cGUsIE5VTEwsIE5VTEwsIF9fbWNiX2J1c19hZGRfY2hpbGQpOwotCiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtY2JfYnVzX2FkZF9kZXZpY2VzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tY2IvbWNiLWludGVybmFsLmggYi9kcml2ZXJzL21jYi9tY2ItaW50ZXJuYWwuaAppbmRleCA1MjU0ZTAyLi5kNmU2OTMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21jYi9tY2ItaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL21jYi9tY2ItaW50ZXJuYWwuaApAQCAtMTEyLDYgKzExMiwxNSBAQAogCXUzMiBzaXplOwogfSBfX3BhY2tlZDsKIAorc3RydWN0IGNoYW1lbGVvbl9iYXIgeworCXUzMiBhZGRyOworCXUzMiBzaXplOworfTsKKworI2RlZmluZSBCQVJfQ05UKHgpICgoeCkgJiAweDA3KQorI2RlZmluZSBDSEFNRUxFT05fQkFSX01BWAk2CisjZGVmaW5lIEJBUl9ERVNDX1NJWkUoeCkJKCh4KSAqIHNpemVvZihzdHJ1Y3QgY2hhbWVsZW9uX2JhcikgKyBzaXplb2YoX19sZTMyKSkKKwogaW50IGNoYW1lbGVvbl9wYXJzZV9jZWxscyhzdHJ1Y3QgbWNiX2J1cyAqYnVzLCBwaHlzX2FkZHJfdCBtYXBiYXNlLAogCQkJICB2b2lkIF9faW9tZW0gKmJhc2UpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21jYi9tY2ItbHBjLmMgYi9kcml2ZXJzL21jYi9tY2ItbHBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA3MmMwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWNiL21jYi1scGMuYwpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIE1FTiBDaGFtZWxlb24gQnVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBNRU4gTWlrcm9lbGVrdHJvbmlrIEdtYkggKHd3dy5tZW4uZGUpCisgKiBBdXRob3I6IEFuZHJlYXMgV2VybmVyIDxhbmRyZWFzLndlcm5lckBtZW4uZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorI2luY2x1ZGUgPGxpbnV4L21jYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSAibWNiLWludGVybmFsLmgiCisKK3N0cnVjdCBwcml2IHsKKwlzdHJ1Y3QgbWNiX2J1cyAqYnVzOworCXN0cnVjdCByZXNvdXJjZSAqbWVtOworCXZvaWQgX19pb21lbSAqYmFzZTsKK307CisKK3N0YXRpYyBpbnQgbWNiX2xwY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBwcml2ICpwcml2OworCWludCByZXQgPSAwOworCisJcHJpdiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJpdi0+bWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXByaXYtPm1lbSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBNZW1vcnkgcmVzb3VyY2VcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXMgPSBkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LCBwcml2LT5tZW0tPnN0YXJ0LAorCQkJCSAgICAgIHJlc291cmNlX3NpemUocHJpdi0+bWVtKSwKKwkJCQkgICAgICBLQlVJTERfTU9ETkFNRSk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgSU8gbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlwcml2LT5iYXNlID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHByaXYtPm1lbS0+c3RhcnQsCisJCQkJICByZXNvdXJjZV9zaXplKHByaXYtPm1lbSkpOworCWlmICghcHJpdi0+YmFzZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgaW9yZW1hcFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHByaXYpOworCisJcHJpdi0+YnVzID0gbWNiX2FsbG9jX2J1cygmcGRldi0+ZGV2KTsKKwlpZiAoSVNfRVJSKHByaXYtPmJ1cykpCisJCXJldHVybiBQVFJfRVJSKHByaXYtPmJ1cyk7CisKKwlyZXQgPSBjaGFtZWxlb25fcGFyc2VfY2VsbHMocHJpdi0+YnVzLCBwcml2LT5tZW0tPnN0YXJ0LCBwcml2LT5iYXNlKTsKKwlpZiAocmV0IDwgMCkgeworCQltY2JfcmVsZWFzZV9idXMocHJpdi0+YnVzKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJGb3VuZCAlZCBjZWxsc1xuIiwgcmV0KTsKKworCW1jYl9idXNfYWRkX2RldmljZXMocHJpdi0+YnVzKTsKKworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQgbWNiX2xwY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJbWNiX3JlbGVhc2VfYnVzKHByaXYtPmJ1cyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm1jYl9scGNfcGRldjsKKworc3RhdGljIGludCBtY2JfbHBjX2NyZWF0ZV9wbGF0Zm9ybV9kZXZpY2UoY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmlkKQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gaWQtPmRyaXZlcl9kYXRhOworCWludCByZXQ7CisKKwltY2JfbHBjX3BkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoIm1jYi1scGMiLCAtMSk7CisJaWYgKCFtY2JfbHBjX3BkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMobWNiX2xwY19wZGV2LCByZXMsIDEpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3B1dDsKKworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQobWNiX2xwY19wZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9wdXQ7CisKKwlyZXR1cm4gMDsKKworb3V0X3B1dDoKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KG1jYl9scGNfcGRldik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzYzI0X2ZwZ2FfcmVzb3VyY2UgPSB7CisJLnN0YXJ0ID0gMHhlMDAwZTAwMCwKKwkuZW5kID0gMHhlMDAwZTAwMCArIENIQU1fSEVBREVSX1NJWkUsCisJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtY2JfbHBjX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUgPSAibWNiLWxwYyIsCisJfSwKKwkucHJvYmUJCT0gbWNiX2xwY19wcm9iZSwKKwkucmVtb3ZlCQk9IG1jYl9scGNfcmVtb3ZlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkIG1jYl9scGNfZG1pX3RhYmxlW10gPSB7CisJeworCQkuaWRlbnQgPSAiU0MyNCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiTUVOIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfVkVSU0lPTiwgIjE0U0MyNCIpLAorCQl9LAorCQkuZHJpdmVyX2RhdGEgPSAodm9pZCAqKSZzYzI0X2ZwZ2FfcmVzb3VyY2UsCisJCS5jYWxsYmFjayA9IG1jYl9scGNfY3JlYXRlX3BsYXRmb3JtX2RldmljZSwKKwl9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShkbWksIG1jYl9scGNfZG1pX3RhYmxlKTsKKworc3RhdGljIGludCBfX2luaXQgbWNiX2xwY19pbml0KHZvaWQpCit7CisJaWYgKCFkbWlfY2hlY2tfc3lzdGVtKG1jYl9scGNfZG1pX3RhYmxlKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtY2JfbHBjX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtY2JfbHBjX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihtY2JfbHBjX3BkZXYpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtY2JfbHBjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG1jYl9scGNfaW5pdCk7Cittb2R1bGVfZXhpdChtY2JfbHBjX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJBbmRyZWFzIFdlcm5lciA8YW5kcmVhcy53ZXJuZXJAbWVuLmRlPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNQ0Igb3ZlciBMUEMgc3VwcG9ydCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tY2IvbWNiLXBhcnNlLmMgYi9kcml2ZXJzL21jYi9tY2ItcGFyc2UuYwppbmRleCBkYmVjYmVkLi40Y2EyNzM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21jYi9tY2ItcGFyc2UuYworKysgYi9kcml2ZXJzL21jYi9tY2ItcGFyc2UuYwpAQCAtMjYsMTkgKzI2LDIwIEBACiB9CiAKIHN0YXRpYyBpbnQgY2hhbWVsZW9uX3BhcnNlX2JkZChzdHJ1Y3QgbWNiX2J1cyAqYnVzLAotCQkJcGh5c19hZGRyX3QgbWFwYmFzZSwKKwkJCXN0cnVjdCBjaGFtZWxlb25fYmFyICpjYiwKIAkJCXZvaWQgX19pb21lbSAqYmFzZSkKIHsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBjaGFtZWxlb25fcGFyc2VfZ2RkKHN0cnVjdCBtY2JfYnVzICpidXMsCi0JCQlwaHlzX2FkZHJfdCBtYXBiYXNlLAotCQkJdm9pZCBfX2lvbWVtICpiYXNlKQorCQkJc3RydWN0IGNoYW1lbGVvbl9iYXIgKmNiLAorCQkJdm9pZCBfX2lvbWVtICpiYXNlLCBpbnQgYmFyX2NvdW50KQogewogCXN0cnVjdCBjaGFtZWxlb25fZ2RkIF9faW9tZW0gKmdkZCA9CiAJCShzdHJ1Y3QgY2hhbWVsZW9uX2dkZCBfX2lvbWVtICopIGJhc2U7CiAJc3RydWN0IG1jYl9kZXZpY2UgKm1kZXY7CisJdTMyIGRldl9tYXBiYXNlOwogCXUzMiBvZmZzZXQ7CiAJdTMyIHNpemU7CiAJaW50IHJldDsKQEAgLTYxLDEzICs2MiwzOSBAQAogCW1kZXYtPmdyb3VwID0gR0REX0dSUChyZWcyKTsKIAltZGV2LT5pbnN0ID0gR0REX0lOUyhyZWcyKTsKIAorCS8qCisJICogSWYgdGhlIEJBUiBpcyBtaXNzaW5nLCBkZXZfbWFwYmFzZSBpcyB6ZXJvLCBvciBpZiB0aGUKKwkgKiBkZXZpY2UgaXMgSU8gbWFwcGVkIHdlIGp1c3QgcHJpbnQgYSB3YXJuaW5nIGFuZCBnbyBvbiB3aXRoIHRoZQorCSAqIG5leHQgZGV2aWNlLCBpbnN0ZWFkIG9mIGNvbXBsZXRlbHkgc3RvcCB0aGUgZ2RkIHBhcnNlcgorCSAqLworCWlmIChtZGV2LT5iYXIgPiBiYXJfY291bnQgLSAxKSB7CisJCXByX2luZm8oIk5vIEJBUiBmb3IgMTZ6JTAzZFxuIiwgbWRldi0+aWQpOworCQlyZXQgPSAwOworCQlnb3RvIGVycjsKKwl9CisKKwlkZXZfbWFwYmFzZSA9IGNiW21kZXYtPmJhcl0uYWRkcjsKKwlpZiAoIWRldl9tYXBiYXNlKSB7CisJCXByX2luZm8oIkJBUiBub3QgYXNzaWduZWQgZm9yIDE2eiUwM2RcbiIsIG1kZXYtPmlkKTsKKwkJcmV0ID0gMDsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKGRldl9tYXBiYXNlICYgMHgwMSkgeworCQlwcl9pbmZvKCJJTyBtYXBwZWQgRGV2aWNlICgxNnolMDNkKSBub3QgeWV0IHN1cHBvcnRlZFxuIiwKKwkJCW1kZXYtPmlkKTsKKwkJcmV0ID0gMDsKKwkJZ290byBlcnI7CisJfQorCiAJcHJfZGVidWcoIkZvdW5kIGEgMTZ6JTAzZFxuIiwgbWRldi0+aWQpOwogCiAJbWRldi0+aXJxLnN0YXJ0ID0gR0REX0lSUShyZWcxKTsKIAltZGV2LT5pcnEuZW5kID0gR0REX0lSUShyZWcxKTsKIAltZGV2LT5pcnEuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsKIAotCW1kZXYtPm1lbS5zdGFydCA9IG1hcGJhc2UgKyBvZmZzZXQ7CisJbWRldi0+bWVtLnN0YXJ0ID0gZGV2X21hcGJhc2UgKyBvZmZzZXQ7CisKIAltZGV2LT5tZW0uZW5kID0gbWRldi0+bWVtLnN0YXJ0ICsgc2l6ZSAtIDE7CiAJbWRldi0+bWVtLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CiAKQEAgLTg1LDEzICsxMTIsNzYgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCBjaGFtZWxlb25fcGFyc2VfYmFyKHZvaWQgX19pb21lbSAqYmFzZSwKKwkJCQlzdHJ1Y3QgY2hhbWVsZW9uX2JhciAqY2IsIGludCBiYXJfY291bnQpCit7CisJY2hhciBfX2lvbWVtICpwID0gYmFzZTsKKwlpbnQgaTsKKworCS8qIHNraXAgcmVnMSAqLworCXAgKz0gc2l6ZW9mKF9fbGUzMik7CisKKwlmb3IgKGkgPSAwOyBpIDwgYmFyX2NvdW50OyBpKyspIHsKKwkJY2JbaV0uYWRkciA9IHJlYWRsKHApOworCQljYltpXS5zaXplID0gcmVhZGwocCArIDQpOworCisJCXAgKz0gc2l6ZW9mKHN0cnVjdCBjaGFtZWxlb25fYmFyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY2hhbWVsZW9uX2dldF9iYXIoY2hhciBfX2lvbWVtICoqYmFzZSwgcGh5c19hZGRyX3QgbWFwYmFzZSwKKwkJCSAgICAgc3RydWN0IGNoYW1lbGVvbl9iYXIgKipjYikKK3sKKwlzdHJ1Y3QgY2hhbWVsZW9uX2JhciAqYzsKKwlpbnQgYmFyX2NvdW50OworCV9fbGUzMiByZWc7CisJdTMyIGR0eXBlOworCisJLyoKKwkgKiBGb3IgdGhvc2UgZGV2aWNlcyB3aGljaCBhcmUgbm90IGNvbm5lY3RlZAorCSAqIHRvIHRoZSBQQ0kgQnVzIChlLmcuIExQQykgdGhlcmUgaXMgYSBiYXIKKwkgKiBkZXNjcmlwdG9yIGxvY2F0ZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlCisJICogY2hhbWVsZW9uIGhlYWRlci4gVGhpcyBoZWFkZXIgaXMgY29tcGFyYWJsZQorCSAqIHRvIGEgUENJIGhlYWRlci4KKwkgKi8KKwlkdHlwZSA9IGdldF9uZXh0X2R0eXBlKCpiYXNlKTsKKwlpZiAoZHR5cGUgPT0gQ0hBTUVMRU9OX0RUWVBFX0JBUikgeworCQlyZWcgPSByZWFkbCgqYmFzZSk7CisKKwkJYmFyX2NvdW50ID0gQkFSX0NOVChyZWcpOworCQlpZiAoYmFyX2NvdW50IDw9IDAgJiYgYmFyX2NvdW50ID4gQ0hBTUVMRU9OX0JBUl9NQVgpCisJCQlyZXR1cm4gLUVOT0RFVjsKKworCQljID0ga2NhbGxvYyhiYXJfY291bnQsIHNpemVvZihzdHJ1Y3QgY2hhbWVsZW9uX2JhciksCisJCQkgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghYykKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWNoYW1lbGVvbl9wYXJzZV9iYXIoKmJhc2UsIGMsIGJhcl9jb3VudCk7CisJCSpiYXNlICs9IEJBUl9ERVNDX1NJWkUoYmFyX2NvdW50KTsKKwl9IGVsc2UgeworCQljID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNoYW1lbGVvbl9iYXIpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFjKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJYmFyX2NvdW50ID0gMTsKKwkJYy0+YWRkciA9IG1hcGJhc2U7CisJfQorCisJKmNiID0gYzsKKworCXJldHVybiBiYXJfY291bnQ7Cit9CisKIGludCBjaGFtZWxlb25fcGFyc2VfY2VsbHMoc3RydWN0IG1jYl9idXMgKmJ1cywgcGh5c19hZGRyX3QgbWFwYmFzZSwKIAkJCXZvaWQgX19pb21lbSAqYmFzZSkKIHsKLQljaGFyIF9faW9tZW0gKnAgPSBiYXNlOwogCXN0cnVjdCBjaGFtZWxlb25fZnBnYV9oZWFkZXIgKmhlYWRlcjsKLQl1aW50MzJfdCBkdHlwZTsKKwlzdHJ1Y3QgY2hhbWVsZW9uX2JhciAqY2I7CisJY2hhciBfX2lvbWVtICpwID0gYmFzZTsKIAlpbnQgbnVtX2NlbGxzID0gMDsKKwl1aW50MzJfdCBkdHlwZTsKKwlpbnQgYmFyX2NvdW50OwogCWludCByZXQgPSAwOwogCXUzMiBoc2l6ZTsKIApAQCAtMTA4LDggKzE5OCw4IEBACiAJaWYgKGhlYWRlci0+bWFnaWMgIT0gQ0hBTUVMRU9OVjJfTUFHSUMpIHsKIAkJcHJfZXJyKCJVbnN1cHBvcnRlZCBjaGFtZWxlb24gdmVyc2lvbiAweCV4XG4iLAogCQkJCWhlYWRlci0+bWFnaWMpOwotCQlrZnJlZShoZWFkZXIpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBmcmVlX2hlYWRlcjsKIAl9CiAJcCArPSBoc2l6ZTsKIApAQCAtMTE5LDE2ICsyMDksMjAgQEAKIAlzbnByaW50ZihidXMtPm5hbWUsIENIQU1FTEVPTl9GSUxFTkFNRV9MRU4gKyAxLCAiJXMiLAogCQkgaGVhZGVyLT5maWxlbmFtZSk7CiAKKwliYXJfY291bnQgPSBjaGFtZWxlb25fZ2V0X2JhcigmcCwgbWFwYmFzZSwgJmNiKTsKKwlpZiAoYmFyX2NvdW50IDwgMCkKKwkJZ290byBmcmVlX2hlYWRlcjsKKwogCWZvcl9lYWNoX2NoYW1lbGVvbl9jZWxsKGR0eXBlLCBwKSB7CiAJCXN3aXRjaCAoZHR5cGUpIHsKIAkJY2FzZSBDSEFNRUxFT05fRFRZUEVfR0VORVJBTDoKLQkJCXJldCA9IGNoYW1lbGVvbl9wYXJzZV9nZGQoYnVzLCBtYXBiYXNlLCBwKTsKKwkJCXJldCA9IGNoYW1lbGVvbl9wYXJzZV9nZGQoYnVzLCBjYiwgcCwgYmFyX2NvdW50KTsKIAkJCWlmIChyZXQgPCAwKQotCQkJCWdvdG8gb3V0OworCQkJCWdvdG8gZnJlZV9iYXI7CiAJCQlwICs9IHNpemVvZihzdHJ1Y3QgY2hhbWVsZW9uX2dkZCk7CiAJCQlicmVhazsKIAkJY2FzZSBDSEFNRUxFT05fRFRZUEVfQlJJREdFOgotCQkJY2hhbWVsZW9uX3BhcnNlX2JkZChidXMsIG1hcGJhc2UsIHApOworCQkJY2hhbWVsZW9uX3BhcnNlX2JkZChidXMsIGNiLCBwKTsKIAkJCXAgKz0gc2l6ZW9mKHN0cnVjdCBjaGFtZWxlb25fYmRkKTsKIAkJCWJyZWFrOwogCQljYXNlIENIQU1FTEVPTl9EVFlQRV9FTkQ6CkBAIC0xMzYsOCArMjMwLDggQEAKIAkJZGVmYXVsdDoKIAkJCXByX2VycigiSW52YWxpZCBjaGFtZWxlb24gZGVzY3JpcHRvciB0eXBlIDB4JXhcbiIsCiAJCQkJZHR5cGUpOwotCQkJa2ZyZWUoaGVhZGVyKTsKLQkJCXJldHVybiAtRUlOVkFMOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZnJlZV9iYXI7CiAJCX0KIAkJbnVtX2NlbGxzKys7CiAJfQpAQCAtMTQ1LDExICsyMzksMTUgQEAKIAlpZiAobnVtX2NlbGxzID09IDApCiAJCW51bV9jZWxscyA9IC1FSU5WQUw7CiAKKwlrZnJlZShjYik7CiAJa2ZyZWUoaGVhZGVyKTsKIAlyZXR1cm4gbnVtX2NlbGxzOwogCi1vdXQ6CitmcmVlX2JhcjoKKwlrZnJlZShjYik7CitmcmVlX2hlYWRlcjoKIAlrZnJlZShoZWFkZXIpOworCiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNoYW1lbGVvbl9wYXJzZV9jZWxscyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21jYi9tY2ItcGNpLmMgYi9kcml2ZXJzL21jYi9tY2ItcGNpLmMKaW5kZXggYjE1YTAzNC4uYWY0ZDJmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tY2IvbWNiLXBjaS5jCisrKyBiL2RyaXZlcnMvbWNiL21jYi1wY2kuYwpAQCAtNDYsNiArNDYsNyBAQAogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIFBDSSBkZXZpY2VcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CisJcGNpX3NldF9tYXN0ZXIocGRldik7CiAKIAlwcml2LT5tYXBiYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOwogCWlmICghcHJpdi0+bWFwYmFzZSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvc3VwZXIuYyBiL2RyaXZlcnMvbWQvYmNhY2hlL3N1cGVyLmMKaW5kZXggOTVhNGNhNi4uODQ5YWQ0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvc3VwZXIuYworKysgYi9kcml2ZXJzL21kL2JjYWNoZS9zdXBlci5jCkBAIC03NjAsNyArNzYwLDggQEAKIAlpZiAoIWQtPm5yX3N0cmlwZXMgfHwKIAkgICAgZC0+bnJfc3RyaXBlcyA+IElOVF9NQVggfHwKIAkgICAgZC0+bnJfc3RyaXBlcyA+IFNJWkVfTUFYIC8gc2l6ZW9mKGF0b21pY190KSkgewotCQlwcl9lcnIoIm5yX3N0cmlwZXMgdG9vIGxhcmdlIik7CisJCXByX2VycigibnJfc3RyaXBlcyB0b28gbGFyZ2Ugb3IgaW52YWxpZDogJXUgKHN0YXJ0IHNlY3RvciBiZXlvbmQgZW5kIG9mIGRpc2s/KSIsCisJCQkodW5zaWduZWQpZC0+bnJfc3RyaXBlcyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTgyMCw3ICsxODIxLDcgQEAKIAlmcmVlID0gcm91bmR1cF9wb3dfb2ZfdHdvKGNhLT5zYi5uYnVja2V0cykgPj4gMTA7CiAKIAlpZiAoIWluaXRfZmlmbygmY2EtPmZyZWVbUkVTRVJWRV9CVFJFRV0sIDgsIEdGUF9LRVJORUwpIHx8Ci0JICAgICFpbml0X2ZpZm8oJmNhLT5mcmVlW1JFU0VSVkVfUFJJT10sIHByaW9fYnVja2V0cyhjYSksIEdGUF9LRVJORUwpIHx8CisJICAgICFpbml0X2ZpZm9fZXhhY3QoJmNhLT5mcmVlW1JFU0VSVkVfUFJJT10sIHByaW9fYnVja2V0cyhjYSksIEdGUF9LRVJORUwpIHx8CiAJICAgICFpbml0X2ZpZm8oJmNhLT5mcmVlW1JFU0VSVkVfTU9WSU5HR0NdLCBmcmVlLCBHRlBfS0VSTkVMKSB8fAogCSAgICAhaW5pdF9maWZvKCZjYS0+ZnJlZVtSRVNFUlZFX05PTkVdLCBmcmVlLCBHRlBfS0VSTkVMKSB8fAogCSAgICAhaW5pdF9maWZvKCZjYS0+ZnJlZV9pbmMsCWZyZWUgPDwgMiwgR0ZQX0tFUk5FTCkgfHwKQEAgLTE4NDQsNyArMTg0NSw3IEBACiAJCQkJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc3RydWN0IGNhY2hlICpjYSkKIHsKIAljaGFyIG5hbWVbQkRFVk5BTUVfU0laRV07Ci0JY29uc3QgY2hhciAqZXJyID0gTlVMTDsKKwljb25zdCBjaGFyICplcnIgPSBOVUxMOyAvKiBtdXN0IGJlIHNldCBmb3IgYW55IGVycm9yIGNhc2UgKi8KIAlpbnQgcmV0ID0gMDsKIAogCW1lbWNweSgmY2EtPnNiLCBzYiwgc2l6ZW9mKHN0cnVjdCBjYWNoZV9zYikpOwpAQCAtMTg2MSw4ICsxODYyLDEzIEBACiAJCWNhLT5kaXNjYXJkID0gQ0FDSEVfRElTQ0FSRCgmY2EtPnNiKTsKIAogCXJldCA9IGNhY2hlX2FsbG9jKGNhKTsKLQlpZiAocmV0ICE9IDApCisJaWYgKHJldCAhPSAwKSB7CisJCWlmIChyZXQgPT0gLUVOT01FTSkKKwkJCWVyciA9ICJjYWNoZV9hbGxvYygpOiAtRU5PTUVNIjsKKwkJZWxzZQorCQkJZXJyID0gImNhY2hlX2FsbG9jKCk6IHVua25vd24gZXJyb3IiOwogCQlnb3RvIGVycjsKKwl9CiAKIAlpZiAoa29iamVjdF9hZGQoJmNhLT5rb2JqLCAmcGFydF90b19kZXYoYmRldi0+YmRfcGFydCktPmtvYmosICJiY2FjaGUiKSkgewogCQllcnIgPSAiZXJyb3IgY2FsbGluZyBrb2JqZWN0X2FkZCI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2JpdG1hcC5jIGIvZHJpdmVycy9tZC9iaXRtYXAuYwppbmRleCA2ZmZmNzk0Li4xMzA0MWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JpdG1hcC5jCisrKyBiL2RyaXZlcnMvbWQvYml0bWFwLmMKQEAgLTIxODMsMTkgKzIxODMsMjkgQEAKIHN0YXRpYyBzc2l6ZV90CiBsb2NhdGlvbl9zdG9yZShzdHJ1Y3QgbWRkZXYgKm1kZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCiB7CisJaW50IHJ2OwogCisJcnYgPSBtZGRldl9sb2NrKG1kZGV2KTsKKwlpZiAocnYpCisJCXJldHVybiBydjsKIAlpZiAobWRkZXYtPnBlcnMpIHsKLQkJaWYgKCFtZGRldi0+cGVycy0+cXVpZXNjZSkKLQkJCXJldHVybiAtRUJVU1k7Ci0JCWlmIChtZGRldi0+cmVjb3ZlcnkgfHwgbWRkZXYtPnN5bmNfdGhyZWFkKQotCQkJcmV0dXJuIC1FQlVTWTsKKwkJaWYgKCFtZGRldi0+cGVycy0+cXVpZXNjZSkgeworCQkJcnYgPSAtRUJVU1k7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAobWRkZXYtPnJlY292ZXJ5IHx8IG1kZGV2LT5zeW5jX3RocmVhZCkgeworCQkJcnYgPSAtRUJVU1k7CisJCQlnb3RvIG91dDsKKwkJfQogCX0KIAogCWlmIChtZGRldi0+Yml0bWFwIHx8IG1kZGV2LT5iaXRtYXBfaW5mby5maWxlIHx8CiAJICAgIG1kZGV2LT5iaXRtYXBfaW5mby5vZmZzZXQpIHsKIAkJLyogYml0bWFwIGFscmVhZHkgY29uZmlndXJlZC4gIE9ubHkgb3B0aW9uIGlzIHRvIGNsZWFyIGl0ICovCi0JCWlmIChzdHJuY21wKGJ1ZiwgIm5vbmUiLCA0KSAhPSAwKQotCQkJcmV0dXJuIC1FQlVTWTsKKwkJaWYgKHN0cm5jbXAoYnVmLCAibm9uZSIsIDQpICE9IDApIHsKKwkJCXJ2ID0gLUVCVVNZOworCQkJZ290byBvdXQ7CisJCX0KIAkJaWYgKG1kZGV2LT5wZXJzKSB7CiAJCQltZGRldi0+cGVycy0+cXVpZXNjZShtZGRldiwgMSk7CiAJCQliaXRtYXBfZGVzdHJveShtZGRldik7CkBAIC0yMjE0LDIxICsyMjI0LDI1IEBACiAJCQkvKiBub3RoaW5nIHRvIGJlIGRvbmUgKi87CiAJCWVsc2UgaWYgKHN0cm5jbXAoYnVmLCAiZmlsZToiLCA1KSA9PSAwKSB7CiAJCQkvKiBOb3Qgc3VwcG9ydGVkIHlldCAqLwotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlydiA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKIAkJfSBlbHNlIHsKLQkJCWludCBydjsKIAkJCWlmIChidWZbMF0gPT0gJysnKQogCQkJCXJ2ID0ga3N0cnRvbGwoYnVmKzEsIDEwLCAmb2Zmc2V0KTsKIAkJCWVsc2UKIAkJCQlydiA9IGtzdHJ0b2xsKGJ1ZiwgMTAsICZvZmZzZXQpOwogCQkJaWYgKHJ2KQotCQkJCXJldHVybiBydjsKLQkJCWlmIChvZmZzZXQgPT0gMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCWlmIChvZmZzZXQgPT0gMCkgeworCQkJCXJ2ID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KIAkJCWlmIChtZGRldi0+Yml0bWFwX2luZm8uZXh0ZXJuYWwgPT0gMCAmJgogCQkJICAgIG1kZGV2LT5tYWpvcl92ZXJzaW9uID09IDAgJiYKLQkJCSAgICBvZmZzZXQgIT0gbWRkZXYtPmJpdG1hcF9pbmZvLmRlZmF1bHRfb2Zmc2V0KQotCQkJCXJldHVybiAtRUlOVkFMOworCQkJICAgIG9mZnNldCAhPSBtZGRldi0+Yml0bWFwX2luZm8uZGVmYXVsdF9vZmZzZXQpIHsKKwkJCQlydiA9IC1FSU5WQUw7CisJCQkJZ290byBvdXQ7CisJCQl9CiAJCQltZGRldi0+Yml0bWFwX2luZm8ub2Zmc2V0ID0gb2Zmc2V0OwogCQkJaWYgKG1kZGV2LT5wZXJzKSB7CiAJCQkJc3RydWN0IGJpdG1hcCAqYml0bWFwOwpAQCAtMjI0NSw3ICsyMjU5LDcgQEAKIAkJCQltZGRldi0+cGVycy0+cXVpZXNjZShtZGRldiwgMCk7CiAJCQkJaWYgKHJ2KSB7CiAJCQkJCWJpdG1hcF9kZXN0cm95KG1kZGV2KTsKLQkJCQkJcmV0dXJuIHJ2OworCQkJCQlnb3RvIG91dDsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTIyNTcsNiArMjI3MSwxMSBAQAogCQlzZXRfYml0KE1EX0NIQU5HRV9ERVZTLCAmbWRkZXYtPmZsYWdzKTsKIAkJbWRfd2FrZXVwX3RocmVhZChtZGRldi0+dGhyZWFkKTsKIAl9CisJcnYgPSAwOworb3V0OgorCW1kZGV2X3VubG9jayhtZGRldik7CisJaWYgKHJ2KQorCQlyZXR1cm4gcnY7CiAJcmV0dXJuIGxlbjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1idWZpby5jIGIvZHJpdmVycy9tZC9kbS1idWZpby5jCmluZGV4IDY1NzFjODEuLjg2MjUwNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tYnVmaW8uYworKysgYi9kcml2ZXJzL21kL2RtLWJ1ZmlvLmMKQEAgLTE4NzksNyArMTg3OSw3IEBACiAJX19jYWNoZV9zaXplX3JlZnJlc2goKTsKIAltdXRleF91bmxvY2soJmRtX2J1ZmlvX2NsaWVudHNfbG9jayk7CiAKLQlkbV9idWZpb193cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJkbV9idWZpb19jYWNoZSIpOworCWRtX2J1ZmlvX3dxID0gYWxsb2Nfd29ya3F1ZXVlKCJkbV9idWZpb19jYWNoZSIsIFdRX01FTV9SRUNMQUlNLCAwKTsKIAlpZiAoIWRtX2J1ZmlvX3dxKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1jcnlwdC5jIGIvZHJpdmVycy9tZC9kbS1jcnlwdC5jCmluZGV4IDRlOTc4NGIuLjg3NDI5NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tY3J5cHQuYworKysgYi9kcml2ZXJzL21kL2RtLWNyeXB0LmMKQEAgLTE4MSw3ICsxODEsNyBAQAogCXU4IGtleVswXTsKIH07CiAKLSNkZWZpbmUgTUlOX0lPUyAgICAgICAgMTYKKyNkZWZpbmUgTUlOX0lPUyAgICAgICAgNjQKIAogc3RhdGljIHZvaWQgY2xvbmVfaW5pdChzdHJ1Y3QgZG1fY3J5cHRfaW8gKiwgc3RydWN0IGJpbyAqKTsKIHN0YXRpYyB2b2lkIGtjcnlwdGRfcXVldWVfY3J5cHQoc3RydWN0IGRtX2NyeXB0X2lvICppbyk7CkBAIC0xNDUzLDcgKzE0NTMsNyBAQAogCXVuc2lnbmVkIGk7CiAJaW50IGVycjsKIAotCWNjLT50Zm1zID0ga21hbGxvYyhjYy0+dGZtc19jb3VudCAqIHNpemVvZihzdHJ1Y3QgY3J5cHRvX3NrY2lwaGVyICopLAorCWNjLT50Zm1zID0ga3phbGxvYyhjYy0+dGZtc19jb3VudCAqIHNpemVvZihzdHJ1Y3QgY3J5cHRvX3NrY2lwaGVyICopLAogCQkJICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjYy0+dGZtcykKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xOTI0LDYgKzE5MjQsMTMgQEAKIAkJcmV0dXJuIERNX01BUElPX1JFTUFQUEVEOwogCX0KIAorCS8qCisJICogQ2hlY2sgaWYgYmlvIGlzIHRvbyBsYXJnZSwgc3BsaXQgYXMgbmVlZGVkLgorCSAqLworCWlmICh1bmxpa2VseShiaW8tPmJpX2l0ZXIuYmlfc2l6ZSA+IChCSU9fTUFYX1BBR0VTIDw8IFBBR0VfU0hJRlQpKSAmJgorCSAgICBiaW9fZGF0YV9kaXIoYmlvKSA9PSBXUklURSkKKwkJZG1fYWNjZXB0X3BhcnRpYWxfYmlvKGJpbywgKChCSU9fTUFYX1BBR0VTIDw8IFBBR0VfU0hJRlQpID4+IFNFQ1RPUl9TSElGVCkpOworCiAJaW8gPSBkbV9wZXJfYmlvX2RhdGEoYmlvLCBjYy0+cGVyX2Jpb19kYXRhX3NpemUpOwogCWNyeXB0X2lvX2luaXQoaW8sIGNjLCBiaW8sIGRtX3RhcmdldF9vZmZzZXQodGksIGJpby0+YmlfaXRlci5iaV9zZWN0b3IpKTsKIAlpby0+Y3R4LnJlcSA9IChzdHJ1Y3Qgc2tjaXBoZXJfcmVxdWVzdCAqKShpbyArIDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1mbGFrZXkuYyBiL2RyaXZlcnMvbWQvZG0tZmxha2V5LmMKaW5kZXggOTdlNDQ2ZC4uNmEyZThkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1mbGFrZXkuYworKysgYi9kcml2ZXJzL21kL2RtLWZsYWtleS5jCkBAIC0yODksMTUgKzI4OSwxMyBAQAogCQlwYi0+YmlvX3N1Ym1pdHRlZCA9IHRydWU7CiAKIAkJLyoKLQkJICogTWFwIHJlYWRzIGFzIG5vcm1hbCBvbmx5IGlmIGNvcnJ1cHRfYmlvX2J5dGUgc2V0LgorCQkgKiBFcnJvciByZWFkcyBpZiBuZWl0aGVyIGNvcnJ1cHRfYmlvX2J5dGUgb3IgZHJvcF93cml0ZXMgYXJlIHNldC4KKwkJICogT3RoZXJ3aXNlLCBmbGFrZXlfZW5kX2lvKCkgd2lsbCBkZWNpZGUgaWYgdGhlIHJlYWRzIHNob3VsZCBiZSBtb2RpZmllZC4KIAkJICovCiAJCWlmIChiaW9fZGF0YV9kaXIoYmlvKSA9PSBSRUFEKSB7Ci0JCQkvKiBJZiBmbGFncyB3ZXJlIHNwZWNpZmllZCwgb25seSBjb3JydXB0IHRob3NlIHRoYXQgbWF0Y2guICovCi0JCQlpZiAoZmMtPmNvcnJ1cHRfYmlvX2J5dGUgJiYgKGZjLT5jb3JydXB0X2Jpb19ydyA9PSBSRUFEKSAmJgotCQkJICAgIGFsbF9jb3JydXB0X2Jpb19mbGFnc19tYXRjaChiaW8sIGZjKSkKLQkJCQlnb3RvIG1hcF9iaW87Ci0JCQllbHNlCisJCQlpZiAoIWZjLT5jb3JydXB0X2Jpb19ieXRlICYmICF0ZXN0X2JpdChEUk9QX1dSSVRFUywgJmZjLT5mbGFncykpCiAJCQkJcmV0dXJuIC1FSU87CisJCQlnb3RvIG1hcF9iaW87CiAJCX0KIAogCQkvKgpAQCAtMzM0LDE0ICszMzIsMjEgQEAKIAlzdHJ1Y3QgZmxha2V5X2MgKmZjID0gdGktPnByaXZhdGU7CiAJc3RydWN0IHBlcl9iaW9fZGF0YSAqcGIgPSBkbV9wZXJfYmlvX2RhdGEoYmlvLCBzaXplb2Yoc3RydWN0IHBlcl9iaW9fZGF0YSkpOwogCi0JLyoKLQkgKiBDb3JydXB0IHN1Y2Nlc3NmdWwgUkVBRHMgd2hpbGUgaW4gZG93biBzdGF0ZS4KLQkgKi8KIAlpZiAoIWVycm9yICYmIHBiLT5iaW9fc3VibWl0dGVkICYmIChiaW9fZGF0YV9kaXIoYmlvKSA9PSBSRUFEKSkgewotCQlpZiAoZmMtPmNvcnJ1cHRfYmlvX2J5dGUpCisJCWlmIChmYy0+Y29ycnVwdF9iaW9fYnl0ZSAmJiAoZmMtPmNvcnJ1cHRfYmlvX3J3ID09IFJFQUQpICYmCisJCSAgICBhbGxfY29ycnVwdF9iaW9fZmxhZ3NfbWF0Y2goYmlvLCBmYykpIHsKKwkJCS8qCisJCQkgKiBDb3JydXB0IHN1Y2Nlc3NmdWwgbWF0Y2hpbmcgUkVBRHMgd2hpbGUgaW4gZG93biBzdGF0ZS4KKwkJCSAqLwogCQkJY29ycnVwdF9iaW9fZGF0YShiaW8sIGZjKTsKLQkJZWxzZQorCisJCX0gZWxzZSBpZiAoIXRlc3RfYml0KERST1BfV1JJVEVTLCAmZmMtPmZsYWdzKSkgeworCQkJLyoKKwkJCSAqIEVycm9yIHJlYWQgZHVyaW5nIHRoZSBkb3duX2ludGVydmFsIGlmIGRyb3Bfd3JpdGVzCisJCQkgKiB3YXNuJ3QgY29uZmlndXJlZC4KKwkJCSAqLwogCQkJcmV0dXJuIC1FSU87CisJCX0KIAl9CiAKIAlyZXR1cm4gZXJyb3I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWxvZy13cml0ZXMuYyBiL2RyaXZlcnMvbWQvZG0tbG9nLXdyaXRlcy5jCmluZGV4IDRhYjY4MDMuLjQ5ZTRkOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tbG9nLXdyaXRlcy5jCisrKyBiL2RyaXZlcnMvbWQvZG0tbG9nLXdyaXRlcy5jCkBAIC0yNTksMTIgKzI1OSwxMiBAQAogCQlnb3RvIG91dDsKIAlzZWN0b3IrKzsKIAotCWJpbyA9IGJpb19hbGxvYyhHRlBfS0VSTkVMLCBibG9jay0+dmVjX2NudCk7CisJYXRvbWljX2luYygmbGMtPmlvX2Jsb2Nrcyk7CisJYmlvID0gYmlvX2FsbG9jKEdGUF9LRVJORUwsIG1pbihibG9jay0+dmVjX2NudCwgQklPX01BWF9QQUdFUykpOwogCWlmICghYmlvKSB7CiAJCURNRVJSKCJDb3VsZG4ndCBhbGxvYyBsb2cgYmlvIik7CiAJCWdvdG8gZXJyb3I7CiAJfQotCWF0b21pY19pbmMoJmxjLT5pb19ibG9ja3MpOwogCWJpby0+YmlfaXRlci5iaV9zaXplID0gMDsKIAliaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gc2VjdG9yOwogCWJpby0+YmlfYmRldiA9IGxjLT5sb2dkZXYtPmJkZXY7CkBAIC0yODIsNyArMjgyLDcgQEAKIAkJaWYgKHJldCAhPSBibG9jay0+dmVjc1tpXS5idl9sZW4pIHsKIAkJCWF0b21pY19pbmMoJmxjLT5pb19ibG9ja3MpOwogCQkJc3VibWl0X2JpbyhiaW8pOwotCQkJYmlvID0gYmlvX2FsbG9jKEdGUF9LRVJORUwsIGJsb2NrLT52ZWNfY250IC0gaSk7CisJCQliaW8gPSBiaW9fYWxsb2MoR0ZQX0tFUk5FTCwgbWluKGJsb2NrLT52ZWNfY250IC0gaSwgQklPX01BWF9QQUdFUykpOwogCQkJaWYgKCFiaW8pIHsKIAkJCQlETUVSUigiQ291bGRuJ3QgYWxsb2MgbG9nIGJpbyIpOwogCQkJCWdvdG8gZXJyb3I7CkBAIC00NTksOSArNDU5LDkgQEAKIAkJZ290byBiYWQ7CiAJfQogCi0JcmV0ID0gLUVJTlZBTDsKIAlsYy0+bG9nX2t0aHJlYWQgPSBrdGhyZWFkX3J1bihsb2dfd3JpdGVzX2t0aHJlYWQsIGxjLCAibG9nLXdyaXRlIik7Ci0JaWYgKCFsYy0+bG9nX2t0aHJlYWQpIHsKKwlpZiAoSVNfRVJSKGxjLT5sb2dfa3RocmVhZCkpIHsKKwkJcmV0ID0gUFRSX0VSUihsYy0+bG9nX2t0aHJlYWQpOwogCQl0aS0+ZXJyb3IgPSAiQ291bGRuJ3QgYWxsb2Mga3RocmVhZCI7CiAJCWRtX3B1dF9kZXZpY2UodGksIGxjLT5kZXYpOwogCQlkbV9wdXRfZGV2aWNlKHRpLCBsYy0+bG9nZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tbG9nLmMgYi9kcml2ZXJzL21kL2RtLWxvZy5jCmluZGV4IDRjYTJkMWQuLjA3ZmMxYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tbG9nLmMKKysrIGIvZHJpdmVycy9tZC9kbS1sb2cuYwpAQCAtMjkxLDkgKzI5MSwxMCBAQAogCWNvcmUtPm5yX3JlZ2lvbnMgPSBsZTY0X3RvX2NwdShkaXNrLT5ucl9yZWdpb25zKTsKIH0KIAotc3RhdGljIGludCByd19oZWFkZXIoc3RydWN0IGxvZ19jICpsYywgaW50IHJ3KQorc3RhdGljIGludCByd19oZWFkZXIoc3RydWN0IGxvZ19jICpsYywgaW50IG9wKQogewotCWxjLT5pb19yZXEuYmlfb3AgPSBydzsKKwlsYy0+aW9fcmVxLmJpX29wID0gb3A7CisJbGMtPmlvX3JlcS5iaV9vcF9mbGFncyA9IDA7CiAKIAlyZXR1cm4gZG1faW8oJmxjLT5pb19yZXEsIDEsICZsYy0+aGVhZGVyX2xvY2F0aW9uLCBOVUxMKTsKIH0KQEAgLTMxNiw3ICszMTcsNyBAQAogewogCWludCByOwogCi0JciA9IHJ3X2hlYWRlcihsb2csIFJFQUQpOworCXIgPSByd19oZWFkZXIobG9nLCBSRVFfT1BfUkVBRCk7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCkBAIC02MzAsNyArNjMxLDcgQEAKIAloZWFkZXJfdG9fZGlzaygmbGMtPmhlYWRlciwgbGMtPmRpc2tfaGVhZGVyKTsKIAogCS8qIHdyaXRlIHRoZSBuZXcgaGVhZGVyICovCi0JciA9IHJ3X2hlYWRlcihsYywgV1JJVEUpOworCXIgPSByd19oZWFkZXIobGMsIFJFUV9PUF9XUklURSk7CiAJaWYgKCFyKSB7CiAJCXIgPSBmbHVzaF9oZWFkZXIobGMpOwogCQlpZiAocikKQEAgLTY5OCw3ICs2OTksNyBAQAogCQkJbG9nX2NsZWFyX2JpdChsYywgbGMtPmNsZWFuX2JpdHMsIGkpOwogCX0KIAotCXIgPSByd19oZWFkZXIobGMsIFdSSVRFKTsKKwlyID0gcndfaGVhZGVyKGxjLCBSRVFfT1BfV1JJVEUpOwogCWlmIChyKQogCQlmYWlsX2xvZ19kZXZpY2UobGMpOwogCWVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1yYWlkLmMgYi9kcml2ZXJzL21kL2RtLXJhaWQuYwppbmRleCAxYjk3OTVkLi44YWJkZTZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLXJhaWQuYworKysgYi9kcml2ZXJzL21kL2RtLXJhaWQuYwpAQCAtMTkxLDcgKzE5MSw2IEBACiAjZGVmaW5lIFJUX0ZMQUdfUlNfQklUTUFQX0xPQURFRAkyCiAjZGVmaW5lIFJUX0ZMQUdfVVBEQVRFX1NCUwkJMwogI2RlZmluZSBSVF9GTEFHX1JFU0hBUEVfUlMJCTQKLSNkZWZpbmUgUlRfRkxBR19LRUVQX1JTX0ZST1pFTgkJNQogCiAvKiBBcnJheSBlbGVtZW50cyBvZiA2NCBiaXQgbmVlZGVkIGZvciByZWJ1aWxkL2ZhaWxlZCBkaXNrIGJpdHMgKi8KICNkZWZpbmUgRElTS1NfQVJSQVlfRUxFTVMgKChNQVhfUkFJRF9ERVZJQ0VTICsgKHNpemVvZih1aW50NjRfdCkgKiA4IC0gMSkpIC8gc2l6ZW9mKHVpbnQ2NF90KSAvIDgpCkBAIC04NjEsNiArODYwLDkgQEAKIHsKIAl1bnNpZ25lZCBsb25nIG1pbl9yZWdpb25fc2l6ZSA9IHJzLT50aS0+bGVuIC8gKDEgPDwgMjEpOwogCisJaWYgKHJzX2lzX3JhaWQwKHJzKSkKKwkJcmV0dXJuIDA7CisKIAlpZiAoIXJlZ2lvbl9zaXplKSB7CiAJCS8qCiAJCSAqIENob29zZSBhIHJlYXNvbmFibGUgZGVmYXVsdC4JIEFsbCBmaWd1cmVzIGluIHNlY3RvcnMuCkBAIC05MzAsNiArOTMyLDggQEAKIAkJCXJlYnVpbGRfY250Kys7CiAKIAlzd2l0Y2ggKHJzLT5yYWlkX3R5cGUtPmxldmVsKSB7CisJY2FzZSAwOgorCQlicmVhazsKIAljYXNlIDE6CiAJCWlmIChyZWJ1aWxkX2NudCA+PSBycy0+bWQucmFpZF9kaXNrcykKIAkJCWdvdG8gdG9vX21hbnk7CkBAIC0yMzM1LDYgKzIzMzksMTMgQEAKIAkJY2FzZSAwOgogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CisJCQkvKgorCQkJICogV2UgaGF2ZSB0byBrZWVwIGFueSByYWlkMCBkYXRhL21ldGFkYXRhIGRldmljZSBwYWlycyBvcgorCQkJICogdGhlIE1EIHJhaWQwIHBlcnNvbmFsaXR5IHdpbGwgZmFpbCB0byBzdGFydCB0aGUgYXJyYXkuCisJCQkgKi8KKwkJCWlmIChyc19pc19yYWlkMChycykpCisJCQkJY29udGludWU7CisKIAkJCWRldiA9IGNvbnRhaW5lcl9vZihyZGV2LCBzdHJ1Y3QgcmFpZF9kZXYsIHJkZXYpOwogCQkJaWYgKGRldi0+bWV0YV9kZXYpCiAJCQkJZG1fcHV0X2RldmljZSh0aSwgZGV2LT5tZXRhX2Rldik7CkBAIC0yNTc5LDcgKzI1OTAsNiBAQAogCQl9IGVsc2UgewogCQkJLyogUHJvY2VzcyByYWlkMSB3aXRob3V0IGRlbHRhX2Rpc2tzICovCiAJCQltZGRldi0+cmFpZF9kaXNrcyA9IHJzLT5yYWlkX2Rpc2tzOwotCQkJc2V0X2JpdChSVF9GTEFHX0tFRVBfUlNfRlJPWkVOLCAmcnMtPnJ1bnRpbWVfZmxhZ3MpOwogCQkJcmVzaGFwZSA9IGZhbHNlOwogCQl9CiAJfSBlbHNlIHsKQEAgLTI1OTAsNyArMjYwMCw2IEBACiAJaWYgKHJlc2hhcGUpIHsKIAkJc2V0X2JpdChSVF9GTEFHX1JFU0hBUEVfUlMsICZycy0+cnVudGltZV9mbGFncyk7CiAJCXNldF9iaXQoUlRfRkxBR19VUERBVEVfU0JTLCAmcnMtPnJ1bnRpbWVfZmxhZ3MpOwotCQlzZXRfYml0KFJUX0ZMQUdfS0VFUF9SU19GUk9aRU4sICZycy0+cnVudGltZV9mbGFncyk7CiAJfSBlbHNlIGlmIChtZGRldi0+cmFpZF9kaXNrcyA8IHJzLT5yYWlkX2Rpc2tzKQogCQkvKiBDcmVhdGUgbmV3IHN1cGVyYmxvY2tzIGFuZCBiaXRtYXBzLCBpZiBhbnkgbmV3IGRpc2tzICovCiAJCXNldF9iaXQoUlRfRkxBR19VUERBVEVfU0JTLCAmcnMtPnJ1bnRpbWVfZmxhZ3MpOwpAQCAtMjkwMiw3ICsyOTExLDYgQEAKIAkJCWdvdG8gYmFkOwogCiAJCXNldF9iaXQoUlRfRkxBR19VUERBVEVfU0JTLCAmcnMtPnJ1bnRpbWVfZmxhZ3MpOwotCQlzZXRfYml0KFJUX0ZMQUdfS0VFUF9SU19GUk9aRU4sICZycy0+cnVudGltZV9mbGFncyk7CiAJCS8qIFRha2VvdmVyIGFpbid0IHJlY292ZXJ5LCBzbyBkaXNhYmxlIHJlY292ZXJ5ICovCiAJCXJzX3NldHVwX3JlY292ZXJ5KHJzLCBNYXhTZWN0b3IpOwogCQlyc19zZXRfbmV3KHJzKTsKQEAgLTMzODYsMjEgKzMzOTQsMjggQEAKIHsKIAlzdHJ1Y3QgcmFpZF9zZXQgKnJzID0gdGktPnByaXZhdGU7CiAKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJUX0ZMQUdfUlNfUkVTVU1FRCwgJnJzLT5ydW50aW1lX2ZsYWdzKSkgewotCQlpZiAoIXJzLT5tZC5zdXNwZW5kZWQpCi0JCQltZGRldl9zdXNwZW5kKCZycy0+bWQpOwotCQlycy0+bWQucm8gPSAxOwotCX0KKwlpZiAoIXJzLT5tZC5zdXNwZW5kZWQpCisJCW1kZGV2X3N1c3BlbmQoJnJzLT5tZCk7CisKKwlycy0+bWQucm8gPSAxOwogfQogCiBzdGF0aWMgdm9pZCBhdHRlbXB0X3Jlc3RvcmVfb2ZfZmF1bHR5X2RldmljZXMoc3RydWN0IHJhaWRfc2V0ICpycykKIHsKIAlpbnQgaTsKLQl1aW50NjRfdCBmYWlsZWRfZGV2aWNlcywgY2xlYXJlZF9mYWlsZWRfZGV2aWNlcyA9IDA7CisJdWludDY0X3QgY2xlYXJlZF9mYWlsZWRfZGV2aWNlc1tESVNLU19BUlJBWV9FTEVNU107CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlib29sIGNsZWFyZWQgPSBmYWxzZTsKIAlzdHJ1Y3QgZG1fcmFpZF9zdXBlcmJsb2NrICpzYjsKKwlzdHJ1Y3QgbWRkZXYgKm1kZGV2ID0gJnJzLT5tZDsKIAlzdHJ1Y3QgbWRfcmRldiAqcjsKIAorCS8qIFJBSUQgcGVyc29uYWxpdGllcyBoYXZlIHRvIHByb3ZpZGUgaG90IGFkZC9yZW1vdmUgbWV0aG9kcyBvciB3ZSBuZWVkIHRvIGJhaWwgb3V0LiAqLworCWlmICghbWRkZXYtPnBlcnMgfHwgIW1kZGV2LT5wZXJzLT5ob3RfYWRkX2Rpc2sgfHwgIW1kZGV2LT5wZXJzLT5ob3RfcmVtb3ZlX2Rpc2spCisJCXJldHVybjsKKworCW1lbXNldChjbGVhcmVkX2ZhaWxlZF9kZXZpY2VzLCAwLCBzaXplb2YoY2xlYXJlZF9mYWlsZWRfZGV2aWNlcykpOworCiAJZm9yIChpID0gMDsgaSA8IHJzLT5tZC5yYWlkX2Rpc2tzOyBpKyspIHsKIAkJciA9ICZycy0+ZGV2W2ldLnJkZXY7CiAJCWlmICh0ZXN0X2JpdChGYXVsdHksICZyLT5mbGFncykgJiYgci0+c2JfcGFnZSAmJgpAQCAtMzQyMCw3ICszNDM1LDcgQEAKIAkJCSAqIG91cnNlbHZlcy4KIAkJCSAqLwogCQkJaWYgKChyLT5yYWlkX2Rpc2sgPj0gMCkgJiYKLQkJCSAgICAoci0+bWRkZXYtPnBlcnMtPmhvdF9yZW1vdmVfZGlzayhyLT5tZGRldiwgcikgIT0gMCkpCisJCQkgICAgKG1kZGV2LT5wZXJzLT5ob3RfcmVtb3ZlX2Rpc2sobWRkZXYsIHIpICE9IDApKQogCQkJCS8qIEZhaWxlZCB0byByZXZpdmUgdGhpcyBkZXZpY2UsIHRyeSBuZXh0ICovCiAJCQkJY29udGludWU7CiAKQEAgLTM0MzAsMjIgKzM0NDUsMzAgQEAKIAkJCWNsZWFyX2JpdChGYXVsdHksICZyLT5mbGFncyk7CiAJCQljbGVhcl9iaXQoV3JpdGVFcnJvclNlZW4sICZyLT5mbGFncyk7CiAJCQljbGVhcl9iaXQoSW5fc3luYywgJnItPmZsYWdzKTsKLQkJCWlmIChyLT5tZGRldi0+cGVycy0+aG90X2FkZF9kaXNrKHItPm1kZGV2LCByKSkgeworCQkJaWYgKG1kZGV2LT5wZXJzLT5ob3RfYWRkX2Rpc2sobWRkZXYsIHIpKSB7CiAJCQkJci0+cmFpZF9kaXNrID0gLTE7CiAJCQkJci0+c2F2ZWRfcmFpZF9kaXNrID0gLTE7CiAJCQkJci0+ZmxhZ3MgPSBmbGFnczsKIAkJCX0gZWxzZSB7CiAJCQkJci0+cmVjb3Zlcnlfb2Zmc2V0ID0gMDsKLQkJCQljbGVhcmVkX2ZhaWxlZF9kZXZpY2VzIHw9IDEgPDwgaTsKKwkJCQlzZXRfYml0KGksICh2b2lkICopIGNsZWFyZWRfZmFpbGVkX2RldmljZXMpOworCQkJCWNsZWFyZWQgPSB0cnVlOwogCQkJfQogCQl9CiAJfQotCWlmIChjbGVhcmVkX2ZhaWxlZF9kZXZpY2VzKSB7CisKKwkvKiBJZiBhbnkgZmFpbGVkIGRldmljZXMgY291bGQgYmUgY2xlYXJlZCwgdXBkYXRlIGFsbCBzYnMgZmFpbGVkX2RldmljZXMgYml0cyAqLworCWlmIChjbGVhcmVkKSB7CisJCXVpbnQ2NF90IGZhaWxlZF9kZXZpY2VzW0RJU0tTX0FSUkFZX0VMRU1TXTsKKwogCQlyZGV2X2Zvcl9lYWNoKHIsICZycy0+bWQpIHsKIAkJCXNiID0gcGFnZV9hZGRyZXNzKHItPnNiX3BhZ2UpOwotCQkJZmFpbGVkX2RldmljZXMgPSBsZTY0X3RvX2NwdShzYi0+ZmFpbGVkX2RldmljZXMpOwotCQkJZmFpbGVkX2RldmljZXMgJj0gfmNsZWFyZWRfZmFpbGVkX2RldmljZXM7Ci0JCQlzYi0+ZmFpbGVkX2RldmljZXMgPSBjcHVfdG9fbGU2NChmYWlsZWRfZGV2aWNlcyk7CisJCQlzYl9yZXRyaWV2ZV9mYWlsZWRfZGV2aWNlcyhzYiwgZmFpbGVkX2RldmljZXMpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgRElTS1NfQVJSQVlfRUxFTVM7IGkrKykKKwkJCQlmYWlsZWRfZGV2aWNlc1tpXSAmPSB+Y2xlYXJlZF9mYWlsZWRfZGV2aWNlc1tpXTsKKworCQkJc2JfdXBkYXRlX2ZhaWxlZF9kZXZpY2VzKHNiLCBmYWlsZWRfZGV2aWNlcyk7CiAJCX0KIAl9CiB9CkBAIC0zNjEwLDI2ICszNjMzLDE1IEBACiAJCSAqIGRldmljZXMgYXJlIHJlYWNoYWJsZSBhZ2Fpbi4KIAkJICovCiAJCWF0dGVtcHRfcmVzdG9yZV9vZl9mYXVsdHlfZGV2aWNlcyhycyk7Ci0JfSBlbHNlIHsKLQkJbWRkZXYtPnJvID0gMDsKLQkJbWRkZXYtPmluX3N5bmMgPSAwOwotCi0JCS8qCi0JCSAqIFdoZW4gcGFzc2luZyBpbiBmbGFncyB0byB0aGUgY3RyLCB3ZSBleHBlY3QgdXNlcnNwYWNlCi0JCSAqIHRvIHJlc2V0IHRoZW0gYmVjYXVzZSB0aGV5IG1hZGUgaXQgdG8gdGhlIHN1cGVyYmxvY2tzCi0JCSAqIGFuZCByZWxvYWQgdGhlIG1hcHBpbmcgYW55d2F5LgotCQkgKgotCQkgKiAtPiBvbmx5IHVuZnJlZXplIHJlY292ZXJ5IGluIGNhc2Ugb2YgYSB0YWJsZSByZWxvYWQgb3IKLQkJICogICAgd2UnbGwgaGF2ZSBhIGJvZ3VzIHJlY292ZXJ5L3Jlc2hhcGUgcG9zaXRpb24KLQkJICogICAgcmV0cmlldmVkIGZyb20gdGhlIHN1cGVyYmxvY2sgYnkgdGhlIGN0ciBiZWNhdXNlCi0JCSAqICAgIHRoZSBvbmdvaW5nIHJlY292ZXJ5L3Jlc2hhcGUgd2lsbCBjaGFuZ2UgaXQgYWZ0ZXIgcmVhZC4KLQkJICovCi0JCWlmICghdGVzdF9iaXQoUlRfRkxBR19LRUVQX1JTX0ZST1pFTiwgJnJzLT5ydW50aW1lX2ZsYWdzKSkKLQkJCWNsZWFyX2JpdChNRF9SRUNPVkVSWV9GUk9aRU4sICZtZGRldi0+cmVjb3ZlcnkpOwotCi0JCWlmIChtZGRldi0+c3VzcGVuZGVkKQotCQkJbWRkZXZfcmVzdW1lKG1kZGV2KTsKIAl9CisKKwltZGRldi0+cm8gPSAwOworCW1kZGV2LT5pbl9zeW5jID0gMDsKKworCWNsZWFyX2JpdChNRF9SRUNPVkVSWV9GUk9aRU4sICZtZGRldi0+cmVjb3ZlcnkpOworCisJaWYgKG1kZGV2LT5zdXNwZW5kZWQpCisJCW1kZGV2X3Jlc3VtZShtZGRldik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdGFyZ2V0X3R5cGUgcmFpZF90YXJnZXQgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXJvdW5kLXJvYmluLmMgYi9kcml2ZXJzL21kL2RtLXJvdW5kLXJvYmluLmMKaW5kZXggNGFjZTFkYS4uNmMyNTIxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1yb3VuZC1yb2Jpbi5jCisrKyBiL2RyaXZlcnMvbWQvZG0tcm91bmQtcm9iaW4uYwpAQCAtMjEwLDE0ICsyMTAsMTcgQEAKIAlzdHJ1Y3QgcGF0aF9pbmZvICpwaSA9IE5VTEw7CiAJc3RydWN0IGRtX3BhdGggKmN1cnJlbnRfcGF0aCA9IE5VTEw7CiAKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJY3VycmVudF9wYXRoID0gKnRoaXNfY3B1X3B0cihzLT5jdXJyZW50X3BhdGgpOwogCWlmIChjdXJyZW50X3BhdGgpIHsKIAkJcGVyY3B1X2NvdW50ZXJfZGVjKCZzLT5yZXBlYXRfY291bnQpOwotCQlpZiAocGVyY3B1X2NvdW50ZXJfcmVhZF9wb3NpdGl2ZSgmcy0+cmVwZWF0X2NvdW50KSA+IDApCisJCWlmIChwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKCZzLT5yZXBlYXRfY291bnQpID4gMCkgeworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCQkJcmV0dXJuIGN1cnJlbnRfcGF0aDsKKwkJfQogCX0KIAotCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrKCZzLT5sb2NrKTsKIAlpZiAoIWxpc3RfZW1wdHkoJnMtPnZhbGlkX3BhdGhzKSkgewogCQlwaSA9IGxpc3RfZW50cnkocy0+dmFsaWRfcGF0aHMubmV4dCwgc3RydWN0IHBhdGhfaW5mbywgbGlzdCk7CiAJCWxpc3RfbW92ZV90YWlsKCZwaS0+bGlzdCwgJnMtPnZhbGlkX3BhdGhzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbWQtY2x1c3Rlci5jIGIvZHJpdmVycy9tZC9tZC1jbHVzdGVyLmMKaW5kZXggNDE1NzNmMS4uMzRhODQwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9tZC1jbHVzdGVyLmMKKysrIGIvZHJpdmVycy9tZC9tZC1jbHVzdGVyLmMKQEAgLTgzNCw4ICs4MzQsMTAgQEAKIAkJZ290byBlcnI7CiAJfQogCWNpbmZvLT5hY2tfbG9ja3JlcyA9IGxvY2tyZXNfaW5pdChtZGRldiwgImFjayIsIGFja19iYXN0LCAwKTsKLQlpZiAoIWNpbmZvLT5hY2tfbG9ja3JlcykKKwlpZiAoIWNpbmZvLT5hY2tfbG9ja3JlcykgeworCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycjsKKwl9CiAJLyogZ2V0IHN5bmMgQ1IgbG9jayBvbiBBQ0suICovCiAJaWYgKGRsbV9sb2NrX3N5bmMoY2luZm8tPmFja19sb2NrcmVzLCBETE1fTE9DS19DUikpCiAJCXByX2VycigibWQtY2x1c3RlcjogZmFpbGVkIHRvIGdldCBhIHN5bmMgQ1IgbG9jayBvbiBBQ0shKCVkKVxuIiwKQEAgLTg0OSw4ICs4NTEsMTAgQEAKIAlwcl9pbmZvKCJtZC1jbHVzdGVyOiBKb2luZWQgY2x1c3RlciAlcyBzbG90ICVkXG4iLCBzdHIsIGNpbmZvLT5zbG90X251bWJlcik7CiAJc25wcmludGYoc3RyLCA2NCwgImJpdG1hcCUwNGQiLCBjaW5mby0+c2xvdF9udW1iZXIgLSAxKTsKIAljaW5mby0+Yml0bWFwX2xvY2tyZXMgPSBsb2NrcmVzX2luaXQobWRkZXYsIHN0ciwgTlVMTCwgMSk7Ci0JaWYgKCFjaW5mby0+Yml0bWFwX2xvY2tyZXMpCisJaWYgKCFjaW5mby0+Yml0bWFwX2xvY2tyZXMpIHsKKwkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnI7CisJfQogCWlmIChkbG1fbG9ja19zeW5jKGNpbmZvLT5iaXRtYXBfbG9ja3JlcywgRExNX0xPQ0tfUFcpKSB7CiAJCXByX2VycigiRmFpbGVkIHRvIGdldCBiaXRtYXAgbG9ja1xuIik7CiAJCXJldCA9IC1FSU5WQUw7CkBAIC04NTgsOCArODYyLDEwIEBACiAJfQogCiAJY2luZm8tPnJlc3luY19sb2NrcmVzID0gbG9ja3Jlc19pbml0KG1kZGV2LCAicmVzeW5jIiwgTlVMTCwgMCk7Ci0JaWYgKCFjaW5mby0+cmVzeW5jX2xvY2tyZXMpCisJaWYgKCFjaW5mby0+cmVzeW5jX2xvY2tyZXMpIHsKKwkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnI7CisJfQogCiAJcmV0dXJuIDA7CiBlcnI6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL21kLmMgYi9kcml2ZXJzL21kL21kLmMKaW5kZXggZDY0NmY2ZS4uOTE1ZTg0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9tZC5jCisrKyBiL2RyaXZlcnMvbWQvbWQuYwpAQCAtMTYwNCwxMSArMTYwNCw4IEBACiAJCQltZGRldi0+bmV3X2NodW5rX3NlY3RvcnMgPSBtZGRldi0+Y2h1bmtfc2VjdG9yczsKIAkJfQogCi0JCWlmIChsZTMyX3RvX2NwdShzYi0+ZmVhdHVyZV9tYXApICYgTURfRkVBVFVSRV9KT1VSTkFMKSB7CisJCWlmIChsZTMyX3RvX2NwdShzYi0+ZmVhdHVyZV9tYXApICYgTURfRkVBVFVSRV9KT1VSTkFMKQogCQkJc2V0X2JpdChNRF9IQVNfSk9VUk5BTCwgJm1kZGV2LT5mbGFncyk7Ci0JCQlpZiAobWRkZXYtPnJlY292ZXJ5X2NwID09IE1heFNlY3RvcikKLQkJCQlzZXRfYml0KE1EX0pPVVJOQUxfQ0xFQU4sICZtZGRldi0+ZmxhZ3MpOwotCQl9CiAJfSBlbHNlIGlmIChtZGRldi0+cGVycyA9PSBOVUxMKSB7CiAJCS8qIEluc2lzdCBvZiBnb29kIGV2ZW50IGNvdW50ZXIgd2hpbGUgYXNzZW1ibGluZywgZXhjZXB0IGZvcgogCQkgKiBzcGFyZXMgKHdoaWNoIGRvbid0IG5lZWQgYW4gZXZlbnQgY291bnQpICovCkBAIC01ODUxLDYgKzU4NDgsOSBAQAogCQkJd29ya2luZysrOwogCQkJaWYgKHRlc3RfYml0KEluX3N5bmMsICZyZGV2LT5mbGFncykpCiAJCQkJaW5zeW5jKys7CisJCQllbHNlIGlmICh0ZXN0X2JpdChKb3VybmFsLCAmcmRldi0+ZmxhZ3MpKQorCQkJCS8qIFRPRE86IGFkZCBqb3VybmFsIGNvdW50IHRvIG1kX3UuaCAqLworCQkJCTsKIAkJCWVsc2UKIAkJCQlzcGFyZSsrOwogCQl9CkBAIC03NjEwLDE2ICs3NjEwLDEyIEBACiAKIGludCBtZF9zZXR1cF9jbHVzdGVyKHN0cnVjdCBtZGRldiAqbWRkZXYsIGludCBub2RlcykKIHsKLQlpbnQgZXJyOwotCi0JZXJyID0gcmVxdWVzdF9tb2R1bGUoIm1kLWNsdXN0ZXIiKTsKLQlpZiAoZXJyKSB7Ci0JCXByX2VycigibWQtY2x1c3RlciBtb2R1bGUgbm90IGZvdW5kLlxuIik7Ci0JCXJldHVybiAtRU5PRU5UOwotCX0KLQorCWlmICghbWRfY2x1c3Rlcl9vcHMpCisJCXJlcXVlc3RfbW9kdWxlKCJtZC1jbHVzdGVyIik7CiAJc3Bpbl9sb2NrKCZwZXJzX2xvY2spOworCS8qIGVuc3VyZSBtb2R1bGUgd29uJ3QgYmUgdW5sb2FkZWQgKi8KIAlpZiAoIW1kX2NsdXN0ZXJfb3BzIHx8ICF0cnlfbW9kdWxlX2dldChtZF9jbHVzdGVyX21vZCkpIHsKKwkJcHJfZXJyKCJjYW4ndCBmaW5kIG1kLWNsdXN0ZXIgbW9kdWxlIG9yIGdldCBpdCdzIHJlZmVyZW5jZS5cbiIpOwogCQlzcGluX3VubG9jaygmcGVyc19sb2NrKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQpAQCAtNzg2Miw2ICs3ODU4LDcgQEAKIAkgKi8KIAogCWRvIHsKKwkJaW50IG1kZGV2Ml9taW5vciA9IC0xOwogCQltZGRldi0+Y3Vycl9yZXN5bmMgPSAyOwogCiAJdHJ5X2FnYWluOgpAQCAtNzg5MSwxMCArNzg4OCwxNCBAQAogCQkJCXByZXBhcmVfdG9fd2FpdCgmcmVzeW5jX3dhaXQsICZ3cSwgVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJCQlpZiAoIXRlc3RfYml0KE1EX1JFQ09WRVJZX0lOVFIsICZtZGRldi0+cmVjb3ZlcnkpICYmCiAJCQkJICAgIG1kZGV2Mi0+Y3Vycl9yZXN5bmMgPj0gbWRkZXYtPmN1cnJfcmVzeW5jKSB7Ci0JCQkJCXByaW50ayhLRVJOX0lORk8gIm1kOiBkZWxheWluZyAlcyBvZiAlcyIKLQkJCQkJICAgICAgICIgdW50aWwgJXMgaGFzIGZpbmlzaGVkICh0aGV5IgotCQkJCQkgICAgICAgIiBzaGFyZSBvbmUgb3IgbW9yZSBwaHlzaWNhbCB1bml0cylcbiIsCi0JCQkJCSAgICAgICBkZXNjLCBtZG5hbWUobWRkZXYpLCBtZG5hbWUobWRkZXYyKSk7CisJCQkJCWlmIChtZGRldjJfbWlub3IgIT0gbWRkZXYyLT5tZF9taW5vcikgeworCQkJCQkJbWRkZXYyX21pbm9yID0gbWRkZXYyLT5tZF9taW5vcjsKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gIm1kOiBkZWxheWluZyAlcyBvZiAlcyIKKwkJCQkJCSAgICAgICAiIHVudGlsICVzIGhhcyBmaW5pc2hlZCAodGhleSIKKwkJCQkJCSAgICAgICAiIHNoYXJlIG9uZSBvciBtb3JlIHBoeXNpY2FsIHVuaXRzKVxuIiwKKwkJCQkJCSAgICAgICBkZXNjLCBtZG5hbWUobWRkZXYpLAorCQkJCQkJICAgICAgIG1kbmFtZShtZGRldjIpKTsKKwkJCQkJfQogCQkJCQltZGRldl9wdXQobWRkZXYyKTsKIAkJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQkJCQkJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKQEAgLTgyNzUsMTYgKzgyNzYsMTMgQEAKIHN0YXRpYyB2b2lkIG1kX3N0YXJ0X3N5bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3cykKIHsKIAlzdHJ1Y3QgbWRkZXYgKm1kZGV2ID0gY29udGFpbmVyX29mKHdzLCBzdHJ1Y3QgbWRkZXYsIGRlbF93b3JrKTsKLQlpbnQgcmV0ID0gMDsKIAogCW1kZGV2LT5zeW5jX3RocmVhZCA9IG1kX3JlZ2lzdGVyX3RocmVhZChtZF9kb19zeW5jLAogCQkJCQkJbWRkZXYsCiAJCQkJCQkicmVzeW5jIik7CiAJaWYgKCFtZGRldi0+c3luY190aHJlYWQpIHsKLQkJaWYgKCEobWRkZXZfaXNfY2x1c3RlcmVkKG1kZGV2KSAmJiByZXQgPT0gLUVBR0FJTikpCi0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb3VsZCBub3Qgc3RhcnQgcmVzeW5jIgotCQkJICAgICAgICIgdGhyZWFkLi4uXG4iLAotCQkJICAgICAgIG1kbmFtZShtZGRldikpOworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb3VsZCBub3Qgc3RhcnQgcmVzeW5jIHRocmVhZC4uLlxuIiwKKwkJICAgICAgIG1kbmFtZShtZGRldikpOwogCQkvKiBsZWF2ZSB0aGUgc3BhcmVzIHdoZXJlIHRoZXkgYXJlLCBpdCBzaG91bGRuJ3QgaHVydCAqLwogCQljbGVhcl9iaXQoTURfUkVDT1ZFUllfU1lOQywgJm1kZGV2LT5yZWNvdmVyeSk7CiAJCWNsZWFyX2JpdChNRF9SRUNPVkVSWV9SRVNIQVBFLCAmbWRkZXYtPnJlY292ZXJ5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDEwLmMgYi9kcml2ZXJzL21kL3JhaWQxMC5jCmluZGV4IDBlNGVmY2QuLmJlMWE5ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDEwLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkMTAuYwpAQCAtMTA2NCw2ICsxMDY0LDggQEAKIAlpbnQgbWF4X3NlY3RvcnM7CiAJaW50IHNlY3RvcnM7CiAKKwltZF93cml0ZV9zdGFydChtZGRldiwgYmlvKTsKKwogCS8qCiAJICogUmVnaXN0ZXIgdGhlIG5ldyByZXF1ZXN0IGFuZCB3YWl0IGlmIHRoZSByZWNvbnN0cnVjdGlvbgogCSAqIHRocmVhZCBoYXMgcHV0IHVwIGEgYmFyIGZvciBuZXcgcmVxdWVzdHMuCkBAIC0xNDQ1LDggKzE0NDcsNiBAQAogCQlyZXR1cm47CiAJfQogCi0JbWRfd3JpdGVfc3RhcnQobWRkZXYsIGJpbyk7Ci0KIAlkbyB7CiAKIAkJLyoKQEAgLTI0NjUsMjAgKzI0NjUsMjEgQEAKIAogCXdoaWxlIChzZWN0X3RvX3dyaXRlKSB7CiAJCXN0cnVjdCBiaW8gKndiaW87CisJCXNlY3Rvcl90IHdzZWN0b3I7CiAJCWlmIChzZWN0b3JzID4gc2VjdF90b193cml0ZSkKIAkJCXNlY3RvcnMgPSBzZWN0X3RvX3dyaXRlOwogCQkvKiBXcml0ZSBhdCAnc2VjdG9yJyBmb3IgJ3NlY3RvcnMnICovCiAJCXdiaW8gPSBiaW9fY2xvbmVfbWRkZXYoYmlvLCBHRlBfTk9JTywgbWRkZXYpOwogCQliaW9fdHJpbSh3YmlvLCBzZWN0b3IgLSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yLCBzZWN0b3JzKTsKLQkJd2Jpby0+YmlfaXRlci5iaV9zZWN0b3IgPSAocjEwX2Jpby0+ZGV2c1tpXS5hZGRyKwotCQkJCSAgIGNob29zZV9kYXRhX29mZnNldChyMTBfYmlvLCByZGV2KSArCi0JCQkJICAgKHNlY3RvciAtIHIxMF9iaW8tPnNlY3RvcikpOworCQl3c2VjdG9yID0gcjEwX2Jpby0+ZGV2c1tpXS5hZGRyICsgKHNlY3RvciAtIHIxMF9iaW8tPnNlY3Rvcik7CisJCXdiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gd3NlY3RvciArCisJCQkJICAgY2hvb3NlX2RhdGFfb2Zmc2V0KHIxMF9iaW8sIHJkZXYpOwogCQl3YmlvLT5iaV9iZGV2ID0gcmRldi0+YmRldjsKIAkJYmlvX3NldF9vcF9hdHRycyh3YmlvLCBSRVFfT1BfV1JJVEUsIDApOwogCiAJCWlmIChzdWJtaXRfYmlvX3dhaXQod2JpbykgPCAwKQogCQkJLyogRmFpbHVyZSEgKi8KLQkJCW9rID0gcmRldl9zZXRfYmFkYmxvY2tzKHJkZXYsIHNlY3RvciwKKwkJCW9rID0gcmRldl9zZXRfYmFkYmxvY2tzKHJkZXYsIHdzZWN0b3IsCiAJCQkJCQlzZWN0b3JzLCAwKQogCQkJCSYmIG9rOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQ1LWNhY2hlLmMgYi9kcml2ZXJzL21kL3JhaWQ1LWNhY2hlLmMKaW5kZXggNTFmNzZkZC4uMWIxYWI0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkNS1jYWNoZS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDUtY2FjaGUuYwpAQCAtOTYsNyArOTYsNiBAQAogCXNwaW5sb2NrX3Qgbm9fc3BhY2Vfc3RyaXBlc19sb2NrOwogCiAJYm9vbCBuZWVkX2NhY2hlX2ZsdXNoOwotCWJvb2wgaW5fdGVhcmRvd247CiB9OwogCiAvKgpAQCAtNzA0LDMxICs3MDMsMjIgQEAKIAogCW1kZGV2ID0gbG9nLT5yZGV2LT5tZGRldjsKIAkvKgotCSAqIFRoaXMgaXMgdG8gYXZvaWQgYSBkZWFkbG9jay4gcjVsX3F1aWVzY2UgaG9sZHMgcmVjb25maWdfbXV0ZXggYW5kCi0JICogd2FpdCBmb3IgdGhpcyB0aHJlYWQgdG8gZmluaXNoLiBUaGlzIHRocmVhZCB3YWl0cyBmb3IKLQkgKiBNRF9DSEFOR0VfUEVORElORyBjbGVhciwgd2hpY2ggaXMgc3VwcG9zZWQgdG8gYmUgZG9uZSBpbgotCSAqIG1kX2NoZWNrX3JlY292ZXJ5KCkuIG1kX2NoZWNrX3JlY292ZXJ5KCkgdHJpZXMgdG8gZ2V0Ci0JICogcmVjb25maWdfbXV0ZXguIFNpbmNlIHI1bF9xdWllc2NlIGFscmVhZHkgaG9sZHMgdGhlIG11dGV4LAotCSAqIG1kX2NoZWNrX3JlY292ZXJ5KCkgZmFpbHMsIHNvIHRoZSBQRU5ESU5HIG5ldmVyIGdldCBjbGVhcmVkLiBUaGUKLQkgKiBpbl90ZWFyZG93biBjaGVjayB3b3JrYXJvdW5kIHRoaXMgaXNzdWUuCisJICogRGlzY2FyZCBjb3VsZCB6ZXJvIGRhdGEsIHNvIGJlZm9yZSBkaXNjYXJkIHdlIG11c3QgbWFrZSBzdXJlCisJICogc3VwZXJibG9jayBpcyB1cGRhdGVkIHRvIG5ldyBsb2cgdGFpbC4gVXBkYXRpbmcgc3VwZXJibG9jayAoZWl0aGVyCisJICogZGlyZWN0bHkgY2FsbCBtZF91cGRhdGVfc2IoKSBvciBkZXBlbmQgb24gbWQgdGhyZWFkKSBtdXN0IGhvbGQKKwkgKiByZWNvbmZpZyBtdXRleC4gT24gdGhlIG90aGVyIGhhbmQsIHJhaWQ1X3F1aWVzY2UgaXMgY2FsbGVkIHdpdGgKKwkgKiByZWNvbmZpZ19tdXRleCBob2xkLiBUaGUgZmlyc3Qgc3RlcCBvZiByYWlkNV9xdWllc2NlKCkgaXMgd2FpdHRpbmcKKwkgKiBmb3IgYWxsIElPIGZpbmlzaCwgaGVuY2Ugd2FpdHRpbmcgZm9yIHJlY2xhaW0gdGhyZWFkLCB3aGlsZSByZWNsYWltCisJICogdGhyZWFkIGlzIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBhbmQgd2FpdHRpbmcgZm9yIHJlY29uZmlnIG11dGV4LiBTbworCSAqIHRoZXJlIGlzIGEgZGVhZGxvY2suIFdlIHdvcmthcm91bmQgdGhpcyBpc3N1ZSB3aXRoIGEgdHJ5bG9jay4KKwkgKiBGSVhNRTogd2UgY291bGQgbWlzcyBkaXNjYXJkIGlmIHdlIGNhbid0IHRha2UgcmVjb25maWcgbXV0ZXgKIAkgKi8KLQlpZiAoIWxvZy0+aW5fdGVhcmRvd24pIHsKLQkJc2V0X21hc2tfYml0cygmbWRkZXYtPmZsYWdzLCAwLAotCQkJICAgICAgQklUKE1EX0NIQU5HRV9ERVZTKSB8IEJJVChNRF9DSEFOR0VfUEVORElORykpOwotCQltZF93YWtldXBfdGhyZWFkKG1kZGV2LT50aHJlYWQpOwotCQl3YWl0X2V2ZW50KG1kZGV2LT5zYl93YWl0LAotCQkJIXRlc3RfYml0KE1EX0NIQU5HRV9QRU5ESU5HLCAmbWRkZXYtPmZsYWdzKSB8fAotCQkJbG9nLT5pbl90ZWFyZG93bik7Ci0JCS8qCi0JCSAqIHI1bF9xdWllc2NlIGNvdWxkIHJ1biBhZnRlciBpbl90ZWFyZG93biBjaGVjayBhbmQgaG9sZAotCQkgKiBtdXRleCBmaXJzdC4gU3VwZXJibG9jayBtaWdodCBnZXQgdXBkYXRlZCB0d2ljZS4KLQkJICovCi0JCWlmIChsb2ctPmluX3RlYXJkb3duKQotCQkJbWRfdXBkYXRlX3NiKG1kZGV2LCAxKTsKLQl9IGVsc2UgewotCQlXQVJOX09OKCFtZGRldl9pc19sb2NrZWQobWRkZXYpKTsKLQkJbWRfdXBkYXRlX3NiKG1kZGV2LCAxKTsKLQl9CisJc2V0X21hc2tfYml0cygmbWRkZXYtPmZsYWdzLCAwLAorCQlCSVQoTURfQ0hBTkdFX0RFVlMpIHwgQklUKE1EX0NIQU5HRV9QRU5ESU5HKSk7CisJaWYgKCFtZGRldl90cnlsb2NrKG1kZGV2KSkKKwkJcmV0dXJuOworCW1kX3VwZGF0ZV9zYihtZGRldiwgMSk7CisJbWRkZXZfdW5sb2NrKG1kZGV2KTsKIAogCS8qIGRpc2NhcmQgSU8gZXJyb3IgcmVhbGx5IGRvZXNuJ3QgbWF0dGVyLCBpZ25vcmUgaXQgKi8KIAlpZiAobG9nLT5sYXN0X2NoZWNrcG9pbnQgPCBlbmQpIHsKQEAgLTgyNyw3ICs4MTcsNiBAQAogCWlmICghbG9nIHx8IHN0YXRlID09IDIpCiAJCXJldHVybjsKIAlpZiAoc3RhdGUgPT0gMCkgewotCQlsb2ctPmluX3RlYXJkb3duID0gMDsKIAkJLyoKIAkJICogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBmb3IgaG90YWRkLiBJbiBzdXNwZW5kLCB0aGUgYXJyYXkgaGFzCiAJCSAqIG5vIGpvdXJuYWwuIEluIHJlc3VtZSwgam91cm5hbCBpcyBpbml0aWFsaXplZCBhcyB3ZWxsIGFzIHRoZQpAQCAtODM4LDExICs4MjcsNiBAQAogCQlsb2ctPnJlY2xhaW1fdGhyZWFkID0gbWRfcmVnaXN0ZXJfdGhyZWFkKHI1bF9yZWNsYWltX3RocmVhZCwKIAkJCQkJbG9nLT5yZGV2LT5tZGRldiwgInJlY2xhaW0iKTsKIAl9IGVsc2UgaWYgKHN0YXRlID09IDEpIHsKLQkJLyoKLQkJICogYXQgdGhpcyBwb2ludCBhbGwgc3RyaXBlcyBhcmUgZmluaXNoZWQsIHNvIGlvX3VuaXQgaXMgYXQKLQkJICogbGVhc3QgaW4gU1RSSVBFX0VORCBzdGF0ZQotCQkgKi8KLQkJbG9nLT5pbl90ZWFyZG93biA9IDE7CiAJCS8qIG1ha2Ugc3VyZSByNWxfd3JpdGVfc3VwZXJfYW5kX2Rpc2NhcmRfc3BhY2UgZXhpdHMgKi8KIAkJbWRkZXYgPSBsb2ctPnJkZXYtPm1kZGV2OwogCQl3YWtlX3VwKCZtZGRldi0+c2Jfd2FpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQ1LmMgYi9kcml2ZXJzL21kL3JhaWQ1LmMKaW5kZXggODkxMjQwNy4uNTI4N2U3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkNS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDUuYwpAQCAtNjU5LDYgKzY1OSw3IEBACiB7CiAJc3RydWN0IHN0cmlwZV9oZWFkICpzaDsKIAlpbnQgaGFzaCA9IHN0cmlwZV9oYXNoX2xvY2tzX2hhc2goc2VjdG9yKTsKKwlpbnQgaW5jX2VtcHR5X2luYWN0aXZlX2xpc3RfZmxhZzsKIAogCXByX2RlYnVnKCJnZXRfc3RyaXBlLCBzZWN0b3IgJWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylzZWN0b3IpOwogCkBAIC03MDMsNyArNzA0LDEyIEBACiAJCQkJCWF0b21pY19pbmMoJmNvbmYtPmFjdGl2ZV9zdHJpcGVzKTsKIAkJCQlCVUdfT04obGlzdF9lbXB0eSgmc2gtPmxydSkgJiYKIAkJCQkgICAgICAgIXRlc3RfYml0KFNUUklQRV9FWFBBTkRJTkcsICZzaC0+c3RhdGUpKTsKKwkJCQlpbmNfZW1wdHlfaW5hY3RpdmVfbGlzdF9mbGFnID0gMDsKKwkJCQlpZiAoIWxpc3RfZW1wdHkoY29uZi0+aW5hY3RpdmVfbGlzdCArIGhhc2gpKQorCQkJCQlpbmNfZW1wdHlfaW5hY3RpdmVfbGlzdF9mbGFnID0gMTsKIAkJCQlsaXN0X2RlbF9pbml0KCZzaC0+bHJ1KTsKKwkJCQlpZiAobGlzdF9lbXB0eShjb25mLT5pbmFjdGl2ZV9saXN0ICsgaGFzaCkgJiYgaW5jX2VtcHR5X2luYWN0aXZlX2xpc3RfZmxhZykKKwkJCQkJYXRvbWljX2luYygmY29uZi0+ZW1wdHlfaW5hY3RpdmVfbGlzdF9ucik7CiAJCQkJaWYgKHNoLT5ncm91cCkgewogCQkJCQlzaC0+Z3JvdXAtPnN0cmlwZXNfY250LS07CiAJCQkJCXNoLT5ncm91cCA9IE5VTEw7CkBAIC03NjIsNiArNzY4LDcgQEAKIAlzZWN0b3JfdCBoZWFkX3NlY3RvciwgdG1wX3NlYzsKIAlpbnQgaGFzaDsKIAlpbnQgZGRfaWR4OworCWludCBpbmNfZW1wdHlfaW5hY3RpdmVfbGlzdF9mbGFnOwogCiAJLyogRG9uJ3QgY3Jvc3MgY2h1bmtzLCBzbyBzdHJpcGUgcGRfaWR4L3FkX2lkeCBpcyB0aGUgc2FtZSAqLwogCXRtcF9zZWMgPSBzaC0+c2VjdG9yOwpAQCAtNzc5LDcgKzc4NiwxMiBAQAogCQkJCWF0b21pY19pbmMoJmNvbmYtPmFjdGl2ZV9zdHJpcGVzKTsKIAkJCUJVR19PTihsaXN0X2VtcHR5KCZoZWFkLT5scnUpICYmCiAJCQkgICAgICAgIXRlc3RfYml0KFNUUklQRV9FWFBBTkRJTkcsICZoZWFkLT5zdGF0ZSkpOworCQkJaW5jX2VtcHR5X2luYWN0aXZlX2xpc3RfZmxhZyA9IDA7CisJCQlpZiAoIWxpc3RfZW1wdHkoY29uZi0+aW5hY3RpdmVfbGlzdCArIGhhc2gpKQorCQkJCWluY19lbXB0eV9pbmFjdGl2ZV9saXN0X2ZsYWcgPSAxOwogCQkJbGlzdF9kZWxfaW5pdCgmaGVhZC0+bHJ1KTsKKwkJCWlmIChsaXN0X2VtcHR5KGNvbmYtPmluYWN0aXZlX2xpc3QgKyBoYXNoKSAmJiBpbmNfZW1wdHlfaW5hY3RpdmVfbGlzdF9mbGFnKQorCQkJCWF0b21pY19pbmMoJmNvbmYtPmVtcHR5X2luYWN0aXZlX2xpc3RfbnIpOwogCQkJaWYgKGhlYWQtPmdyb3VwKSB7CiAJCQkJaGVhZC0+Z3JvdXAtPnN0cmlwZXNfY250LS07CiAJCQkJaGVhZC0+Z3JvdXAgPSBOVUxMOwpAQCAtOTkzLDcgKzEwMDUsNiBAQAogCiAJCQlzZXRfYml0KFNUUklQRV9JT19TVEFSVEVELCAmc2gtPnN0YXRlKTsKIAotCQkJYmlvX3Jlc2V0KGJpKTsKIAkJCWJpLT5iaV9iZGV2ID0gcmRldi0+YmRldjsKIAkJCWJpb19zZXRfb3BfYXR0cnMoYmksIG9wLCBvcF9mbGFncyk7CiAJCQliaS0+YmlfZW5kX2lvID0gb3BfaXNfd3JpdGUob3ApCkBAIC0xMDQ1LDcgKzEwNTYsNiBAQAogCiAJCQlzZXRfYml0KFNUUklQRV9JT19TVEFSVEVELCAmc2gtPnN0YXRlKTsKIAotCQkJYmlvX3Jlc2V0KHJiaSk7CiAJCQlyYmktPmJpX2JkZXYgPSBycmRldi0+YmRldjsKIAkJCWJpb19zZXRfb3BfYXR0cnMocmJpLCBvcCwgb3BfZmxhZ3MpOwogCQkJQlVHX09OKCFvcF9pc193cml0ZShvcCkpOwpAQCAtMTk3OCw5ICsxOTg4LDExIEBACiAJcHV0X2NwdSgpOwogfQogCi1zdGF0aWMgc3RydWN0IHN0cmlwZV9oZWFkICphbGxvY19zdHJpcGUoc3RydWN0IGttZW1fY2FjaGUgKnNjLCBnZnBfdCBnZnApCitzdGF0aWMgc3RydWN0IHN0cmlwZV9oZWFkICphbGxvY19zdHJpcGUoc3RydWN0IGttZW1fY2FjaGUgKnNjLCBnZnBfdCBnZnAsCisJaW50IGRpc2tzKQogewogCXN0cnVjdCBzdHJpcGVfaGVhZCAqc2g7CisJaW50IGk7CiAKIAlzaCA9IGttZW1fY2FjaGVfemFsbG9jKHNjLCBnZnApOwogCWlmIChzaCkgewpAQCAtMTk4OSw2ICsyMDAxLDE3IEBACiAJCUlOSVRfTElTVF9IRUFEKCZzaC0+YmF0Y2hfbGlzdCk7CiAJCUlOSVRfTElTVF9IRUFEKCZzaC0+bHJ1KTsKIAkJYXRvbWljX3NldCgmc2gtPmNvdW50LCAxKTsKKwkJZm9yIChpID0gMDsgaSA8IGRpc2tzOyBpKyspIHsKKwkJCXN0cnVjdCByNWRldiAqZGV2ID0gJnNoLT5kZXZbaV07CisKKwkJCWJpb19pbml0KCZkZXYtPnJlcSk7CisJCQlkZXYtPnJlcS5iaV9pb192ZWMgPSAmZGV2LT52ZWM7CisJCQlkZXYtPnJlcS5iaV9tYXhfdmVjcyA9IDE7CisKKwkJCWJpb19pbml0KCZkZXYtPnJyZXEpOworCQkJZGV2LT5ycmVxLmJpX2lvX3ZlYyA9ICZkZXYtPnJ2ZWM7CisJCQlkZXYtPnJyZXEuYmlfbWF4X3ZlY3MgPSAxOworCQl9CiAJfQogCXJldHVybiBzaDsKIH0KQEAgLTE5OTYsNyArMjAxOSw3IEBACiB7CiAJc3RydWN0IHN0cmlwZV9oZWFkICpzaDsKIAotCXNoID0gYWxsb2Nfc3RyaXBlKGNvbmYtPnNsYWJfY2FjaGUsIGdmcCk7CisJc2ggPSBhbGxvY19zdHJpcGUoY29uZi0+c2xhYl9jYWNoZSwgZ2ZwLCBjb25mLT5wb29sX3NpemUpOwogCWlmICghc2gpCiAJCXJldHVybiAwOwogCkBAIC0yMTY3LDcgKzIxOTAsNyBAQAogCW11dGV4X2xvY2soJmNvbmYtPmNhY2hlX3NpemVfbXV0ZXgpOwogCiAJZm9yIChpID0gY29uZi0+bWF4X25yX3N0cmlwZXM7IGk7IGktLSkgewotCQluc2ggPSBhbGxvY19zdHJpcGUoc2MsIEdGUF9LRVJORUwpOworCQluc2ggPSBhbGxvY19zdHJpcGUoc2MsIEdGUF9LRVJORUwsIG5ld3NpemUpOwogCQlpZiAoIW5zaCkKIAkJCWJyZWFrOwogCkBAIC0yMjk5LDYgKzIzMjIsNyBAQAogCQkodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IsIGksIGF0b21pY19yZWFkKCZzaC0+Y291bnQpLAogCQliaS0+YmlfZXJyb3IpOwogCWlmIChpID09IGRpc2tzKSB7CisJCWJpb19yZXNldChiaSk7CiAJCUJVRygpOwogCQlyZXR1cm47CiAJfQpAQCAtMjM5OSw2ICsyNDIzLDcgQEAKIAkJfQogCX0KIAlyZGV2X2RlY19wZW5kaW5nKHJkZXYsIGNvbmYtPm1kZGV2KTsKKwliaW9fcmVzZXQoYmkpOwogCWNsZWFyX2JpdChSNV9MT0NLRUQsICZzaC0+ZGV2W2ldLmZsYWdzKTsKIAlzZXRfYml0KFNUUklQRV9IQU5ETEUsICZzaC0+c3RhdGUpOwogCXJhaWQ1X3JlbGVhc2Vfc3RyaXBlKHNoKTsKQEAgLTI0MzYsNiArMjQ2MSw3IEBACiAJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3RvciwgaSwgYXRvbWljX3JlYWQoJnNoLT5jb3VudCksCiAJCWJpLT5iaV9lcnJvcik7CiAJaWYgKGkgPT0gZGlza3MpIHsKKwkJYmlvX3Jlc2V0KGJpKTsKIAkJQlVHKCk7CiAJCXJldHVybjsKIAl9CkBAIC0yNDcyLDYgKzI0OTgsNyBAQAogCWlmIChzaC0+YmF0Y2hfaGVhZCAmJiBiaS0+YmlfZXJyb3IgJiYgIXJlcGxhY2VtZW50KQogCQlzZXRfYml0KFNUUklQRV9CQVRDSF9FUlIsICZzaC0+YmF0Y2hfaGVhZC0+c3RhdGUpOwogCisJYmlvX3Jlc2V0KGJpKTsKIAlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChSNV9ET1VCTEVfTE9DS0VELCAmc2gtPmRldltpXS5mbGFncykpCiAJCWNsZWFyX2JpdChSNV9MT0NLRUQsICZzaC0+ZGV2W2ldLmZsYWdzKTsKIAlzZXRfYml0KFNUUklQRV9IQU5ETEUsICZzaC0+c3RhdGUpOwpAQCAtMjQ4NSwxNiArMjUxMiw2IEBACiB7CiAJc3RydWN0IHI1ZGV2ICpkZXYgPSAmc2gtPmRldltpXTsKIAotCWJpb19pbml0KCZkZXYtPnJlcSk7Ci0JZGV2LT5yZXEuYmlfaW9fdmVjID0gJmRldi0+dmVjOwotCWRldi0+cmVxLmJpX21heF92ZWNzID0gMTsKLQlkZXYtPnJlcS5iaV9wcml2YXRlID0gc2g7Ci0KLQliaW9faW5pdCgmZGV2LT5ycmVxKTsKLQlkZXYtPnJyZXEuYmlfaW9fdmVjID0gJmRldi0+cnZlYzsKLQlkZXYtPnJyZXEuYmlfbWF4X3ZlY3MgPSAxOwotCWRldi0+cnJlcS5iaV9wcml2YXRlID0gc2g7Ci0KIAlkZXYtPmZsYWdzID0gMDsKIAlkZXYtPnNlY3RvciA9IHJhaWQ1X2NvbXB1dGVfYmxvY2tucihzaCwgaSwgcHJldmlvdXMpOwogfQpAQCAtNDYyOCw3ICs0NjQ1LDkgQEAKIAl9CiAKIAlpZiAoIWJpb19saXN0X2VtcHR5KCZzLnJldHVybl9iaSkpIHsKLQkJaWYgKHRlc3RfYml0KE1EX0NIQU5HRV9QRU5ESU5HLCAmY29uZi0+bWRkZXYtPmZsYWdzKSkgeworCQlpZiAodGVzdF9iaXQoTURfQ0hBTkdFX1BFTkRJTkcsICZjb25mLT5tZGRldi0+ZmxhZ3MpICYmCisJCQkJKHMuZmFpbGVkIDw9IGNvbmYtPm1heF9kZWdyYWRlZCB8fAorCQkJCQljb25mLT5tZGRldi0+ZXh0ZXJuYWwgPT0gMCkpIHsKIAkJCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKIAkJCWJpb19saXN0X21lcmdlKCZjb25mLT5yZXR1cm5fYmksICZzLnJldHVybl9iaSk7CiAJCQlzcGluX3VubG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKQEAgLTYzMzAsMjIgKzYzNDksMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCByYWlkNDU2X2NwdV9kZWFkKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKQoreworCXN0cnVjdCByNWNvbmYgKmNvbmYgPSBobGlzdF9lbnRyeV9zYWZlKG5vZGUsIHN0cnVjdCByNWNvbmYsIG5vZGUpOworCisJZnJlZV9zY3JhdGNoX2J1ZmZlcihjb25mLCBwZXJfY3B1X3B0cihjb25mLT5wZXJjcHUsIGNwdSkpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCByYWlkNV9mcmVlX3BlcmNwdShzdHJ1Y3QgcjVjb25mICpjb25mKQogewotCXVuc2lnbmVkIGxvbmcgY3B1OwotCiAJaWYgKCFjb25mLT5wZXJjcHUpCiAJCXJldHVybjsKIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCXVucmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZjb25mLT5jcHVfbm90aWZ5KTsKLSNlbmRpZgotCi0JZ2V0X29ubGluZV9jcHVzKCk7Ci0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkKLQkJZnJlZV9zY3JhdGNoX2J1ZmZlcihjb25mLCBwZXJfY3B1X3B0cihjb25mLT5wZXJjcHUsIGNwdSkpOwotCXB1dF9vbmxpbmVfY3B1cygpOwotCisJY3B1aHBfc3RhdGVfcmVtb3ZlX2luc3RhbmNlKENQVUhQX01EX1JBSUQ1X1BSRVBBUkUsICZjb25mLT5ub2RlKTsKIAlmcmVlX3BlcmNwdShjb25mLT5wZXJjcHUpOwogfQogCkBAIC02MzY0LDY0ICs2MzgxLDI4IEBACiAJa2ZyZWUoY29uZik7CiB9CiAKLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLXN0YXRpYyBpbnQgcmFpZDQ1Nl9jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwKLQkJCSAgICAgIHZvaWQgKmhjcHUpCitzdGF0aWMgaW50IHJhaWQ0NTZfY3B1X3VwX3ByZXBhcmUodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUpCiB7Ci0Jc3RydWN0IHI1Y29uZiAqY29uZiA9IGNvbnRhaW5lcl9vZihuZmIsIHN0cnVjdCByNWNvbmYsIGNwdV9ub3RpZnkpOwotCWxvbmcgY3B1ID0gKGxvbmcpaGNwdTsKKwlzdHJ1Y3QgcjVjb25mICpjb25mID0gaGxpc3RfZW50cnlfc2FmZShub2RlLCBzdHJ1Y3QgcjVjb25mLCBub2RlKTsKIAlzdHJ1Y3QgcmFpZDVfcGVyY3B1ICpwZXJjcHUgPSBwZXJfY3B1X3B0cihjb25mLT5wZXJjcHUsIGNwdSk7CiAKLQlzd2l0Y2ggKGFjdGlvbikgewotCWNhc2UgQ1BVX1VQX1BSRVBBUkU6Ci0JY2FzZSBDUFVfVVBfUFJFUEFSRV9GUk9aRU46Ci0JCWlmIChhbGxvY19zY3JhdGNoX2J1ZmZlcihjb25mLCBwZXJjcHUpKSB7Ci0JCQlwcl9lcnIoIiVzOiBmYWlsZWQgbWVtb3J5IGFsbG9jYXRpb24gZm9yIGNwdSVsZFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgY3B1KTsKLQkJCXJldHVybiBub3RpZmllcl9mcm9tX2Vycm5vKC1FTk9NRU0pOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQ1BVX0RFQUQ6Ci0JY2FzZSBDUFVfREVBRF9GUk9aRU46Ci0JY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6Ci0JY2FzZSBDUFVfVVBfQ0FOQ0VMRURfRlJPWkVOOgotCQlmcmVlX3NjcmF0Y2hfYnVmZmVyKGNvbmYsIHBlcl9jcHVfcHRyKGNvbmYtPnBlcmNwdSwgY3B1KSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOworCWlmIChhbGxvY19zY3JhdGNoX2J1ZmZlcihjb25mLCBwZXJjcHUpKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgY3B1JXVcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgY3B1KTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQotCXJldHVybiBOT1RJRllfT0s7CisJcmV0dXJuIDA7CiB9Ci0jZW5kaWYKIAogc3RhdGljIGludCByYWlkNV9hbGxvY19wZXJjcHUoc3RydWN0IHI1Y29uZiAqY29uZikKIHsKLQl1bnNpZ25lZCBsb25nIGNwdTsKIAlpbnQgZXJyID0gMDsKIAogCWNvbmYtPnBlcmNwdSA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgcmFpZDVfcGVyY3B1KTsKIAlpZiAoIWNvbmYtPnBlcmNwdSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLQljb25mLT5jcHVfbm90aWZ5Lm5vdGlmaWVyX2NhbGwgPSByYWlkNDU2X2NwdV9ub3RpZnk7Ci0JY29uZi0+Y3B1X25vdGlmeS5wcmlvcml0eSA9IDA7Ci0JZXJyID0gcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZjb25mLT5jcHVfbm90aWZ5KTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotI2VuZGlmCi0KLQlnZXRfb25saW5lX2NwdXMoKTsKLQlmb3JfZWFjaF9wcmVzZW50X2NwdShjcHUpIHsKLQkJZXJyID0gYWxsb2Nfc2NyYXRjaF9idWZmZXIoY29uZiwgcGVyX2NwdV9wdHIoY29uZi0+cGVyY3B1LCBjcHUpKTsKLQkJaWYgKGVycikgewotCQkJcHJfZXJyKCIlczogZmFpbGVkIG1lbW9yeSBhbGxvY2F0aW9uIGZvciBjcHUlbGRcbiIsCi0JCQkgICAgICAgX19mdW5jX18sIGNwdSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlwdXRfb25saW5lX2NwdXMoKTsKLQorCWVyciA9IGNwdWhwX3N0YXRlX2FkZF9pbnN0YW5jZShDUFVIUF9NRF9SQUlENV9QUkVQQVJFLCAmY29uZi0+bm9kZSk7CiAJaWYgKCFlcnIpIHsKIAkJY29uZi0+c2NyaWJibGVfZGlza3MgPSBtYXgoY29uZi0+cmFpZF9kaXNrcywKIAkJCWNvbmYtPnByZXZpb3VzX3JhaWRfZGlza3MpOwpAQCAtNjYyMCw2ICs2NjAxLDE2IEBACiAJfQogCiAJY29uZi0+bWluX25yX3N0cmlwZXMgPSBOUl9TVFJJUEVTOworCWlmIChtZGRldi0+cmVzaGFwZV9wb3NpdGlvbiAhPSBNYXhTZWN0b3IpIHsKKwkJaW50IHN0cmlwZXMgPSBtYXhfdChpbnQsCisJCQkoKG1kZGV2LT5jaHVua19zZWN0b3JzIDw8IDkpIC8gU1RSSVBFX1NJWkUpICogNCwKKwkJCSgobWRkZXYtPm5ld19jaHVua19zZWN0b3JzIDw8IDkpIC8gU1RSSVBFX1NJWkUpICogNCk7CisJCWNvbmYtPm1pbl9ucl9zdHJpcGVzID0gbWF4KE5SX1NUUklQRVMsIHN0cmlwZXMpOworCQlpZiAoY29uZi0+bWluX25yX3N0cmlwZXMgIT0gTlJfU1RSSVBFUykKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkibWQvcmFpZDolczogZm9yY2Ugc3RyaXBlIHNpemUgJWQgZm9yIHJlc2hhcGVcbiIsCisJCQkJbWRuYW1lKG1kZGV2KSwgY29uZi0+bWluX25yX3N0cmlwZXMpOworCX0KIAltZW1vcnkgPSBjb25mLT5taW5fbnJfc3RyaXBlcyAqIChzaXplb2Yoc3RydWN0IHN0cmlwZV9oZWFkKSArCiAJCSBtYXhfZGlza3MgKiAoKHNpemVvZihzdHJ1Y3QgYmlvKSArIFBBR0VfU0laRSkpKSAvIDEwMjQ7CiAJYXRvbWljX3NldCgmY29uZi0+ZW1wdHlfaW5hY3RpdmVfbGlzdF9uciwgTlJfU1RSSVBFX0hBU0hfTE9DS1MpOwpAQCAtNjgyNiwxMSArNjgxNywxNCBAQAogCWlmIChJU19FUlIoY29uZikpCiAJCXJldHVybiBQVFJfRVJSKGNvbmYpOwogCi0JaWYgKHRlc3RfYml0KE1EX0hBU19KT1VSTkFMLCAmbWRkZXYtPmZsYWdzKSAmJiAham91cm5hbF9kZXYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtZC9yYWlkOiVzOiBqb3VybmFsIGRpc2sgaXMgbWlzc2luZywgZm9yY2UgYXJyYXkgcmVhZG9ubHlcbiIsCi0JCSAgICAgICBtZG5hbWUobWRkZXYpKTsKLQkJbWRkZXYtPnJvID0gMTsKLQkJc2V0X2Rpc2tfcm8obWRkZXYtPmdlbmRpc2ssIDEpOworCWlmICh0ZXN0X2JpdChNRF9IQVNfSk9VUk5BTCwgJm1kZGV2LT5mbGFncykpIHsKKwkJaWYgKCFqb3VybmFsX2RldikgeworCQkJcHJfZXJyKCJtZC9yYWlkOiVzOiBqb3VybmFsIGRpc2sgaXMgbWlzc2luZywgZm9yY2UgYXJyYXkgcmVhZG9ubHlcbiIsCisJCQkgICAgICAgbWRuYW1lKG1kZGV2KSk7CisJCQltZGRldi0+cm8gPSAxOworCQkJc2V0X2Rpc2tfcm8obWRkZXYtPmdlbmRpc2ssIDEpOworCQl9IGVsc2UgaWYgKG1kZGV2LT5yZWNvdmVyeV9jcCA9PSBNYXhTZWN0b3IpCisJCQlzZXRfYml0KE1EX0pPVVJOQUxfQ0xFQU4sICZtZGRldi0+ZmxhZ3MpOwogCX0KIAogCWNvbmYtPm1pbl9vZmZzZXRfZGlmZiA9IG1pbl9vZmZzZXRfZGlmZjsKQEAgLTc5NTMsMTAgKzc5NDcsMjEgQEAKIAogc3RhdGljIGludCBfX2luaXQgcmFpZDVfaW5pdCh2b2lkKQogeworCWludCByZXQ7CisKIAlyYWlkNV93cSA9IGFsbG9jX3dvcmtxdWV1ZSgicmFpZDV3cSIsCiAJCVdRX1VOQk9VTkR8V1FfTUVNX1JFQ0xBSU18V1FfQ1BVX0lOVEVOU0lWRXxXUV9TWVNGUywgMCk7CiAJaWYgKCFyYWlkNV93cSkKIAkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBjcHVocF9zZXR1cF9zdGF0ZV9tdWx0aShDUFVIUF9NRF9SQUlENV9QUkVQQVJFLAorCQkJCSAgICAgICJtZC9yYWlkNTpwcmVwYXJlIiwKKwkJCQkgICAgICByYWlkNDU2X2NwdV91cF9wcmVwYXJlLAorCQkJCSAgICAgIHJhaWQ0NTZfY3B1X2RlYWQpOworCWlmIChyZXQpIHsKKwkJZGVzdHJveV93b3JrcXVldWUocmFpZDVfd3EpOworCQlyZXR1cm4gcmV0OworCX0KIAlyZWdpc3Rlcl9tZF9wZXJzb25hbGl0eSgmcmFpZDZfcGVyc29uYWxpdHkpOwogCXJlZ2lzdGVyX21kX3BlcnNvbmFsaXR5KCZyYWlkNV9wZXJzb25hbGl0eSk7CiAJcmVnaXN0ZXJfbWRfcGVyc29uYWxpdHkoJnJhaWQ0X3BlcnNvbmFsaXR5KTsKQEAgLTc5NjgsNiArNzk3Myw3IEBACiAJdW5yZWdpc3Rlcl9tZF9wZXJzb25hbGl0eSgmcmFpZDZfcGVyc29uYWxpdHkpOwogCXVucmVnaXN0ZXJfbWRfcGVyc29uYWxpdHkoJnJhaWQ1X3BlcnNvbmFsaXR5KTsKIAl1bnJlZ2lzdGVyX21kX3BlcnNvbmFsaXR5KCZyYWlkNF9wZXJzb25hbGl0eSk7CisJY3B1aHBfcmVtb3ZlX211bHRpX3N0YXRlKENQVUhQX01EX1JBSUQ1X1BSRVBBUkUpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKHJhaWQ1X3dxKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkNS5oIGIvZHJpdmVycy9tZC9yYWlkNS5oCmluZGV4IDUxN2Q0YjYuLjU3ZWM0OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDUuaAorKysgYi9kcml2ZXJzL21kL3JhaWQ1LmgKQEAgLTUxMiw5ICs1MTIsNyBAQAogCX0gX19wZXJjcHUgKnBlcmNwdTsKIAlpbnQgc2NyaWJibGVfZGlza3M7CiAJaW50IHNjcmliYmxlX3NlY3RvcnM7Ci0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi0Jc3RydWN0IG5vdGlmaWVyX2Jsb2NrCWNwdV9ub3RpZnk7Ci0jZW5kaWYKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlOwogCiAJLyoKIAkgKiBGcmVlIHN0cmlwZXMgcG9vbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jZWMtZWRpZC5jIGIvZHJpdmVycy9tZWRpYS9jZWMtZWRpZC5jCmluZGV4IDcwMDE4MjQuLjU3MTliOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY2VjLWVkaWQuYworKysgYi9kcml2ZXJzL21lZGlhL2NlYy1lZGlkLmMKQEAgLTcwLDcgKzcwLDEwIEBACiAJCQkJdTggdGFnID0gZWRpZFtpXSA+PiA1OwogCQkJCXU4IGxlbiA9IGVkaWRbaV0gJiAweDFmOwogCi0JCQkJaWYgKHRhZyA9PSAzICYmIGxlbiA+PSA1ICYmIGkgKyBsZW4gPD0gZW5kKQorCQkJCWlmICh0YWcgPT0gMyAmJiBsZW4gPj0gNSAmJiBpICsgbGVuIDw9IGVuZCAmJgorCQkJCSAgICBlZGlkW2kgKyAxXSA9PSAweDAzICYmCisJCQkJICAgIGVkaWRbaSArIDJdID09IDB4MGMgJiYKKwkJCQkgICAgZWRpZFtpICsgM10gPT0gMHgwMCkKIAkJCQkJcmV0dXJuIGkgKyA0OwogCQkJCWkgKz0gbGVuICsgMTsKIAkJCX0gd2hpbGUgKGkgPCBlbmQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmItZnJvbnRlbmRzL3J0bDI4MzJfc2RyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvcnRsMjgzMl9zZHIuYwppbmRleCA2ZTIyYWYzLi5lMDM4ZTg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvcnRsMjgzMl9zZHIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvcnRsMjgzMl9zZHIuYwpAQCAtMzkyLDcgKzM5Miw2IEBACiAJCWRldl9kYmcoJnBkZXYtPmRldiwgImFsbG9jIHVyYj0lZFxuIiwgaSk7CiAJCWRldi0+dXJiX2xpc3RbaV0gPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOwogCQlpZiAoIWRldi0+dXJiX2xpc3RbaV0pIHsKLQkJCWRldl9kYmcoJnBkZXYtPmRldiwgImZhaWxlZFxuIik7CiAJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQogCQkJCXVzYl9mcmVlX3VyYihkZXYtPnVyYl9saXN0W2pdKTsKIAkJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wY2kvY3gyMzg4NS9jeDIzODg1LTQxNy5jIGIvZHJpdmVycy9tZWRpYS9wY2kvY3gyMzg4NS9jeDIzODg1LTQxNy5jCmluZGV4IGVmZWMyZDEuLjRkMDgwZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGNpL2N4MjM4ODUvY3gyMzg4NS00MTcuYworKysgYi9kcml2ZXJzL21lZGlhL3BjaS9jeDIzODg1L2N4MjM4ODUtNDE3LmMKQEAgLTE1NTIsNiArMTU1Miw3IEBACiAJcS0+bWVtX29wcyA9ICZ2YjJfZG1hX3NnX21lbW9wczsKIAlxLT50aW1lc3RhbXBfZmxhZ3MgPSBWNEwyX0JVRl9GTEFHX1RJTUVTVEFNUF9NT05PVE9OSUM7CiAJcS0+bG9jayA9ICZkZXYtPmxvY2s7CisJcS0+ZGV2ID0gJmRldi0+cGNpLT5kZXY7CiAKIAllcnIgPSB2YjJfcXVldWVfaW5pdChxKTsKIAlpZiAoZXJyIDwgMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGNpL3NhYTcxMzQvc2FhNzEzNC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvcGNpL3NhYTcxMzQvc2FhNzEzNC1kdmIuYwppbmRleCBkYjk4N2U1Li41OWE0YjVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BjaS9zYWE3MTM0L3NhYTcxMzQtZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wY2kvc2FhNzEzNC9zYWE3MTM0LWR2Yi5jCkBAIC0xMjM4LDYgKzEyMzgsNyBAQAogCXEtPmJ1Zl9zdHJ1Y3Rfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2FhNzEzNF9idWYpOwogCXEtPnRpbWVzdGFtcF9mbGFncyA9IFY0TDJfQlVGX0ZMQUdfVElNRVNUQU1QX01PTk9UT05JQzsKIAlxLT5sb2NrID0gJmRldi0+bG9jazsKKwlxLT5kZXYgPSAmZGV2LT5wY2ktPmRldjsKIAlyZXQgPSB2YjJfcXVldWVfaW5pdChxKTsKIAlpZiAocmV0KSB7CiAJCXZiMl9kdmJfZGVhbGxvY19mcm9udGVuZHMoJmRldi0+ZnJvbnRlbmRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGNpL3NhYTcxMzQvc2FhNzEzNC1lbXByZXNzLmMgYi9kcml2ZXJzL21lZGlhL3BjaS9zYWE3MTM0L3NhYTcxMzQtZW1wcmVzcy5jCmluZGV4IGNhNDE3YTQuLjc5MWE1MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGNpL3NhYTcxMzQvc2FhNzEzNC1lbXByZXNzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wY2kvc2FhNzEzNC9zYWE3MTM0LWVtcHJlc3MuYwpAQCAtMjk1LDYgKzI5NSw3IEBACiAJcS0+YnVmX3N0cnVjdF9zaXplID0gc2l6ZW9mKHN0cnVjdCBzYWE3MTM0X2J1Zik7CiAJcS0+dGltZXN0YW1wX2ZsYWdzID0gVjRMMl9CVUZfRkxBR19USU1FU1RBTVBfTU9OT1RPTklDOwogCXEtPmxvY2sgPSAmZGV2LT5sb2NrOworCXEtPmRldiA9ICZkZXYtPnBjaS0+ZGV2OwogCWVyciA9IHZiMl9xdWV1ZV9pbml0KHEpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL0tjb25maWcKaW5kZXggZjI1MzQ0Yi4uNTUyYjYzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vS2NvbmZpZwpAQCAtMTY5LDcgKzE2OSw3IEBACiBjb25maWcgVklERU9fTUVESUFURUtfVkNPREVDCiAJdHJpc3RhdGUgIk1lZGlhdGVrIFZpZGVvIENvZGVjIGRyaXZlciIKIAlkZXBlbmRzIG9uIE1US19JT01NVSB8fCBDT01QSUxFX1RFU1QKLQlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBWSURFT19WNEwyCisJZGVwZW5kcyBvbiBWSURFT19ERVYgJiYgVklERU9fVjRMMiAmJiBIQVNfRE1BCiAJZGVwZW5kcyBvbiBBUkNIX01FRElBVEVLIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBWSURFT0JVRjJfRE1BX0NPTlRJRwogCXNlbGVjdCBWNEwyX01FTTJNRU1fREVWCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvbXRrX3Zjb2RlY19kcnYuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2Rydi5oCmluZGV4IDk0ZjBhNDIuLjNhOGU2OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2Rydi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2Rydi5oCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgogI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1jb3JlLmg+CiAKLSNpbmNsdWRlICJtdGtfdmNvZGVjX3V0aWwuaCIKIAogI2RlZmluZSBNVEtfVkNPREVDX0RSVl9OQU1FCSJtdGtfdmNvZGVjX2RydiIKICNkZWZpbmUgTVRLX1ZDT0RFQ19FTkNfTkFNRQkibXRrLXZjb2RlYy1lbmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvbXRrX3Zjb2RlY19lbmMuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2VuYy5jCmluZGV4IDNlZDNmMmQuLjJjNTcxOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2VuYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2VuYy5jCkBAIC00ODcsNyArNDg3LDYgQEAKIAlzdHJ1Y3QgbXRrX3FfZGF0YSAqcV9kYXRhOwogCWludCByZXQsIGk7CiAJc3RydWN0IG10a192aWRlb19mbXQgKmZtdDsKLQl1bnNpZ25lZCBpbnQgcGl0Y2hfd19kaXYxNjsKIAlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0X21wbGFuZSAqcGl4X2ZtdF9tcCA9ICZmLT5mbXQucGl4X21wOwogCiAJdnEgPSB2NGwyX20ybV9nZXRfdnEoY3R4LT5tMm1fY3R4LCBmLT50eXBlKTsKQEAgLTUzMCwxNSArNTI5LDYgQEAKIAlxX2RhdGEtPmNvZGVkX3dpZHRoID0gZi0+Zm10LnBpeF9tcC53aWR0aDsKIAlxX2RhdGEtPmNvZGVkX2hlaWdodCA9IGYtPmZtdC5waXhfbXAuaGVpZ2h0OwogCi0JcGl0Y2hfd19kaXYxNiA9IERJVl9ST1VORF9VUChxX2RhdGEtPnZpc2libGVfd2lkdGgsIDE2KTsKLQlpZiAocGl0Y2hfd19kaXYxNiAlIDggIT0gMCkgewotCQkvKiBBZGp1c3QgcmV0dXJuZWQgd2lkdGgvaGVpZ2h0LCBzbyBhcHBsaWNhdGlvbiBjb3VsZCBjb3JyZWN0bHkKLQkJICogYWxsb2NhdGUgaHcgcmVxdWlyZWQgbWVtb3J5Ci0JCSAqLwotCQlxX2RhdGEtPnZpc2libGVfaGVpZ2h0ICs9IDMyOwotCQl2aWRpb2NfdHJ5X2ZtdChmLCBxX2RhdGEtPmZtdCk7Ci0JfQotCiAJcV9kYXRhLT5maWVsZCA9IGYtPmZtdC5waXhfbXAuZmllbGQ7CiAJY3R4LT5jb2xvcnNwYWNlID0gZi0+Zm10LnBpeF9tcC5jb2xvcnNwYWNlOwogCWN0eC0+eWNiY3JfZW5jID0gZi0+Zm10LnBpeF9tcC55Y2Jjcl9lbmM7CkBAIC04NzgsNyArODY4LDggQEAKIHsKIAlzdHJ1Y3QgbXRrX3Zjb2RlY19jdHggKmN0eCA9IHByaXY7CiAJaW50IHJldDsKLQlzdHJ1Y3QgdmIyX2J1ZmZlciAqZHN0X2J1ZjsKKwlzdHJ1Y3QgdmIyX2J1ZmZlciAqc3JjX2J1ZiwgKmRzdF9idWY7CisJc3RydWN0IHZiMl92NGwyX2J1ZmZlciAqZHN0X3ZiMl92NGwyLCAqc3JjX3ZiMl92NGwyOwogCXN0cnVjdCBtdGtfdmNvZGVjX21lbSBic19idWY7CiAJc3RydWN0IHZlbmNfZG9uZV9yZXN1bHQgZW5jX3Jlc3VsdDsKIApAQCAtOTExLDYgKzkwMiwxNSBAQAogCQltdGtfdjRsMl9lcnIoInZlbmNfaWZfZW5jb2RlIGZhaWxlZD0lZCIsIHJldCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KKwlzcmNfYnVmID0gdjRsMl9tMm1fbmV4dF9zcmNfYnVmKGN0eC0+bTJtX2N0eCk7CisJaWYgKHNyY19idWYpIHsKKwkJc3JjX3ZiMl92NGwyID0gdG9fdmIyX3Y0bDJfYnVmZmVyKHNyY19idWYpOworCQlkc3RfdmIyX3Y0bDIgPSB0b192YjJfdjRsMl9idWZmZXIoZHN0X2J1Zik7CisJCWRzdF9idWYtPnRpbWVzdGFtcCA9IHNyY19idWYtPnRpbWVzdGFtcDsKKwkJZHN0X3ZiMl92NGwyLT50aW1lY29kZSA9IHNyY192YjJfdjRsMi0+dGltZWNvZGU7CisJfSBlbHNlIHsKKwkJbXRrX3Y0bDJfZXJyKCJObyB0aW1lc3RhbXAgZm9yIHRoZSBoZWFkZXIgYnVmZmVyLiIpOworCX0KIAogCWN0eC0+c3RhdGUgPSBNVEtfU1RBVEVfSEVBREVSOwogCWRzdF9idWYtPnBsYW5lc1swXS5ieXRlc3VzZWQgPSBlbmNfcmVzdWx0LmJzX3NpemU7CkBAIC0xMDAzLDcgKzEwMDMsNyBAQAogCXN0cnVjdCBtdGtfdmNvZGVjX21lbSBic19idWY7CiAJc3RydWN0IHZlbmNfZG9uZV9yZXN1bHQgZW5jX3Jlc3VsdDsKIAlpbnQgcmV0LCBpOwotCXN0cnVjdCB2YjJfdjRsMl9idWZmZXIgKnZiMl92NGwyOworCXN0cnVjdCB2YjJfdjRsMl9idWZmZXIgKmRzdF92YjJfdjRsMiwgKnNyY192YjJfdjRsMjsKIAogCS8qIGNoZWNrIGRzdF9idWYsIGRzdF9idWYgbWF5IGJlIHJlbW92ZWQgaW4gZGV2aWNlX3J1bgogCSAqIHRvIHN0b3JlZCBlbmNkb2UgaGVhZGVyIHNvIHdlIG5lZWQgY2hlY2sgZHN0X2J1ZiBhbmQKQEAgLTEwNDMsOSArMTA0MywxNCBAQAogCXJldCA9IHZlbmNfaWZfZW5jb2RlKGN0eCwgVkVOQ19TVEFSVF9PUFRfRU5DT0RFX0ZSQU1FLAogCQkJICAgICAmZnJtX2J1ZiwgJmJzX2J1ZiwgJmVuY19yZXN1bHQpOwogCi0JdmIyX3Y0bDIgPSBjb250YWluZXJfb2YoZHN0X2J1Ziwgc3RydWN0IHZiMl92NGwyX2J1ZmZlciwgdmIyX2J1Zik7CisJc3JjX3ZiMl92NGwyID0gdG9fdmIyX3Y0bDJfYnVmZmVyKHNyY19idWYpOworCWRzdF92YjJfdjRsMiA9IHRvX3ZiMl92NGwyX2J1ZmZlcihkc3RfYnVmKTsKKworCWRzdF9idWYtPnRpbWVzdGFtcCA9IHNyY19idWYtPnRpbWVzdGFtcDsKKwlkc3RfdmIyX3Y0bDItPnRpbWVjb2RlID0gc3JjX3ZiMl92NGwyLT50aW1lY29kZTsKKwogCWlmIChlbmNfcmVzdWx0LmlzX2tleV9mcm0pCi0JCXZiMl92NGwyLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX0tFWUZSQU1FOworCQlkc3RfdmIyX3Y0bDItPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfS0VZRlJBTUU7CiAKIAlpZiAocmV0KSB7CiAJCXY0bDJfbTJtX2J1Zl9kb25lKHRvX3ZiMl92NGwyX2J1ZmZlcihzcmNfYnVmKSwKQEAgLTEyMTcsNyArMTIyMiw3IEBACiAJCQkwLCBWNEwyX01QRUdfVklERU9fSEVBREVSX01PREVfU0VQQVJBVEUpOwogCXY0bDJfY3RybF9uZXdfc3RkX21lbnUoaGFuZGxlciwgb3BzLCBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRSwKIAkJCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSCwKLQkJCTAsIFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfTUFJTik7CisJCQkwLCBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0gpOwogCXY0bDJfY3RybF9uZXdfc3RkX21lbnUoaGFuZGxlciwgb3BzLCBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTEVWRUwsCiAJCQlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF80XzIsCiAJCQkwLCBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF80XzApOwpAQCAtMTI4OCw1ICsxMjkzLDEwIEBACiAKIHZvaWQgbXRrX3Zjb2RlY19lbmNfcmVsZWFzZShzdHJ1Y3QgbXRrX3Zjb2RlY19jdHggKmN0eCkKIHsKLQl2ZW5jX2lmX2RlaW5pdChjdHgpOworCWludCByZXQgPSB2ZW5jX2lmX2RlaW5pdChjdHgpOworCisJaWYgKHJldCkKKwkJbXRrX3Y0bDJfZXJyKCJ2ZW5jX2lmX2RlaW5pdCBmYWlsZWQ9JWQiLCByZXQpOworCisJY3R4LT5zdGF0ZSA9IE1US19TVEFURV9GUkVFOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZW5jX2Rydi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZW5jX2Rydi5jCmluZGV4IGM3ODA2ZWMuLjVjZDIxNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2VuY19kcnYuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvbXRrX3Zjb2RlY19lbmNfZHJ2LmMKQEAgLTIxOCwxMSArMjE4LDE1IEBACiAJbXRrX3Y0bDJfZGVidWcoMSwgIlslZF0gZW5jb2RlciIsIGN0eC0+aWQpOwogCW11dGV4X2xvY2soJmRldi0+ZGV2X211dGV4KTsKIAorCS8qCisJICogQ2FsbCB2NGwyX20ybV9jdHhfcmVsZWFzZSB0byBtYWtlIHN1cmUgdGhlIHdvcmtlciB0aHJlYWQgaXMgbm90CisJICogcnVubmluZyBhZnRlciB2ZW5jX2lmX2RlaW5pdC4KKwkgKi8KKwl2NGwyX20ybV9jdHhfcmVsZWFzZShjdHgtPm0ybV9jdHgpOwogCW10a192Y29kZWNfZW5jX3JlbGVhc2UoY3R4KTsKIAl2NGwyX2ZoX2RlbCgmY3R4LT5maCk7CiAJdjRsMl9maF9leGl0KCZjdHgtPmZoKTsKIAl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZjdHgtPmN0cmxfaGRsKTsKLQl2NGwyX20ybV9jdHhfcmVsZWFzZShjdHgtPm0ybV9jdHgpOwogCiAJbGlzdF9kZWxfaW5pdCgmY3R4LT5saXN0KTsKIAlkZXYtPm51bV9pbnN0YW5jZXMtLTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2ludHIuaCBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2ludHIuaAppbmRleCAzM2U4OTBmLi4xMjEzMTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvbXRrX3Zjb2RlY19pbnRyLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfaW50ci5oCkBAIC0xNiw3ICsxNiw2IEBACiAjZGVmaW5lIF9NVEtfVkNPREVDX0lOVFJfSF8KIAogI2RlZmluZSBNVEtfSU5TVF9JUlFfUkVDRUlWRUQJCTB4MQotI2RlZmluZSBNVEtfSU5TVF9XT1JLX1RIUkVBRF9BQk9SVF9ET05FCTB4MgogCiBzdHJ1Y3QgbXRrX3Zjb2RlY19jdHg7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy92ZW5jL3ZlbmNfaDI2NF9pZi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL3ZlbmMvdmVuY19oMjY0X2lmLmMKaW5kZXggOWE2MDA1Mi4uNjNkNGJlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL3ZlbmMvdmVuY19oMjY0X2lmLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL3ZlbmMvdmVuY19oMjY0X2lmLmMKQEAgLTYxLDYgKzYxLDggQEAKIAogLyoKICAqIHN0cnVjdCB2ZW5jX2gyNjRfdnB1X2NvbmZpZyAtIFN0cnVjdHVyZSBmb3IgaDI2NCBlbmNvZGVyIGNvbmZpZ3VyYXRpb24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQLVcvUiA6IEFQIGlzIHdyaXRlci9yZWFkZXIgb24gdGhpcyBpdGVtCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUFUtVy9SOiBWUFUgaXMgd3JpdGUvcmVhZGVyIG9uIHRoaXMgaXRlbQogICogQGlucHV0X2ZvdXJjYzogaW5wdXQgZm91cmNjCiAgKiBAYml0cmF0ZTogdGFyZ2V0IGJpdHJhdGUgKGluIGJwcykKICAqIEBwaWNfdzogcGljdHVyZSB3aWR0aC4gUGljdHVyZSBzaXplIGlzIHZpc2libGUgc3RyZWFtIHJlc29sdXRpb24sIGluIHBpeGVscywKQEAgLTk0LDEzICs5NiwxMyBAQAogCiAvKgogICogc3RydWN0IHZlbmNfaDI2NF92cHVfYnVmIC0gU3RydWN0dXJlIGZvciBidWZmZXIgaW5mb3JtYXRpb24KLSAqIEBhbGlnbjogYnVmZmVyIGFsaWdubWVudCAoaW4gYnl0ZXMpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUC1XL1IgOiBBUCBpcyB3cml0ZXIvcmVhZGVyIG9uIHRoaXMgaXRlbQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgVlBVLVcvUjogVlBVIGlzIHdyaXRlL3JlYWRlciBvbiB0aGlzIGl0ZW0KICAqIEBpb3ZhOiBJTyB2aXJ0dWFsIGFkZHJlc3MKICAqIEB2cHVhOiBWUFUgc2lkZSBtZW1vcnkgYWRkciB3aGljaCBpcyB1c2VkIGJ5IFJDX0NPREUKICAqIEBzaXplOiBidWZmZXIgc2l6ZSAoaW4gYnl0ZXMpCiAgKi8KIHN0cnVjdCB2ZW5jX2gyNjRfdnB1X2J1ZiB7Ci0JdTMyIGFsaWduOwogCXUzMiBpb3ZhOwogCXUzMiB2cHVhOwogCXUzMiBzaXplOwpAQCAtMTA4LDYgKzExMCw4IEBACiAKIC8qCiAgKiBzdHJ1Y3QgdmVuY19oMjY0X3ZzaSAtIFN0cnVjdHVyZSBmb3IgVlBVIGRyaXZlciBjb250cm9sIGFuZCBpbmZvIHNoYXJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIEFQLVcvUiA6IEFQIGlzIHdyaXRlci9yZWFkZXIgb24gdGhpcyBpdGVtCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFZQVS1XL1I6IFZQVSBpcyB3cml0ZS9yZWFkZXIgb24gdGhpcyBpdGVtCiAgKiBUaGlzIHN0cnVjdHVyZSBpcyBhbGxvY2F0ZWQgaW4gVlBVIHNpZGUgYW5kIHNoYXJlZCB0byBBUCBzaWRlLgogICogQGNvbmZpZzogaDI2NCBlbmNvZGVyIGNvbmZpZ3VyYXRpb24KICAqIEB3b3JrX2J1ZnM6IHdvcmtpbmcgYnVmZmVyIGluZm9ybWF0aW9uIGluIFZQVSBzaWRlCkBAIC0xNTAsMTIgKzE1NCw2IEBACiAJc3RydWN0IG10a192Y29kZWNfY3R4ICpjdHg7CiB9OwogCi1zdGF0aWMgaW5saW5lIHZvaWQgaDI2NF93cml0ZV9yZWcoc3RydWN0IHZlbmNfaDI2NF9pbnN0ICppbnN0LCB1MzIgYWRkciwKLQkJCQkgIHUzMiB2YWwpCi17Ci0Jd3JpdGVsKHZhbCwgaW5zdC0+aHdfYmFzZSArIGFkZHIpOwotfQotCiBzdGF0aWMgaW5saW5lIHUzMiBoMjY0X3JlYWRfcmVnKHN0cnVjdCB2ZW5jX2gyNjRfaW5zdCAqaW5zdCwgdTMyIGFkZHIpCiB7CiAJcmV0dXJuIHJlYWRsKGluc3QtPmh3X2Jhc2UgKyBhZGRyKTsKQEAgLTIxNCw2ICsyMTIsOCBAQAogCQlyZXR1cm4gNDA7CiAJY2FzZSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF80XzE6CiAJCXJldHVybiA0MTsKKwljYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMjoKKwkJcmV0dXJuIDQyOwogCWRlZmF1bHQ6CiAJCW10a192Y29kZWNfZGVidWcoaW5zdCwgInVuc3VwcG9ydGVkIGxldmVsICVkIiwgbGV2ZWwpOwogCQlyZXR1cm4gMzE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvdmVuYy92ZW5jX3ZwOF9pZi5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL3ZlbmMvdmVuY192cDhfaWYuYwppbmRleCA2MGJiY2QyLi42ZDk3NTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvdmVuYy92ZW5jX3ZwOF9pZi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy92ZW5jL3ZlbmNfdnA4X2lmLmMKQEAgLTU2LDYgKzU2LDggQEAKIAogLyoKICAqIHN0cnVjdCB2ZW5jX3ZwOF92cHVfY29uZmlnIC0gU3RydWN0dXJlIGZvciB2cDggZW5jb2RlciBjb25maWd1cmF0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQLVcvUiA6IEFQIGlzIHdyaXRlci9yZWFkZXIgb24gdGhpcyBpdGVtCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQVS1XL1I6IFZQVSBpcyB3cml0ZS9yZWFkZXIgb24gdGhpcyBpdGVtCiAgKiBAaW5wdXRfZm91cmNjOiBpbnB1dCBmb3VyY2MKICAqIEBiaXRyYXRlOiB0YXJnZXQgYml0cmF0ZSAoaW4gYnBzKQogICogQHBpY193OiBwaWN0dXJlIHdpZHRoLiBQaWN0dXJlIHNpemUgaXMgdmlzaWJsZSBzdHJlYW0gcmVzb2x1dGlvbiwgaW4gcGl4ZWxzLApAQCAtODMsMTQgKzg1LDE0IEBACiB9OwogCiAvKgotICogc3RydWN0IHZlbmNfdnA4X3ZwdV9idWYgLVN0cnVjdHVyZSBmb3IgYnVmZmVyIGluZm9ybWF0aW9uCi0gKiBAYWxpZ246IGJ1ZmZlciBhbGlnbm1lbnQgKGluIGJ5dGVzKQorICogc3RydWN0IHZlbmNfdnA4X3ZwdV9idWYgLSBTdHJ1Y3R1cmUgZm9yIGJ1ZmZlciBpbmZvcm1hdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICBBUC1XL1IgOiBBUCBpcyB3cml0ZXIvcmVhZGVyIG9uIHRoaXMgaXRlbQorICogICAgICAgICAgICAgICAgICAgICAgICAgICBWUFUtVy9SOiBWUFUgaXMgd3JpdGUvcmVhZGVyIG9uIHRoaXMgaXRlbQogICogQGlvdmE6IElPIHZpcnR1YWwgYWRkcmVzcwogICogQHZwdWE6IFZQVSBzaWRlIG1lbW9yeSBhZGRyIHdoaWNoIGlzIHVzZWQgYnkgUkNfQ09ERQogICogQHNpemU6IGJ1ZmZlciBzaXplIChpbiBieXRlcykKICAqLwogc3RydWN0IHZlbmNfdnA4X3ZwdV9idWYgewotCXUzMiBhbGlnbjsKIAl1MzIgaW92YTsKIAl1MzIgdnB1YTsKIAl1MzIgc2l6ZTsKQEAgLTk4LDYgKzEwMCw4IEBACiAKIC8qCiAgKiBzdHJ1Y3QgdmVuY192cDhfdnNpIC0gU3RydWN0dXJlIGZvciBWUFUgZHJpdmVyIGNvbnRyb2wgYW5kIGluZm8gc2hhcmUKKyAqICAgICAgICAgICAgICAgICAgICAgICBBUC1XL1IgOiBBUCBpcyB3cml0ZXIvcmVhZGVyIG9uIHRoaXMgaXRlbQorICogICAgICAgICAgICAgICAgICAgICAgIFZQVS1XL1I6IFZQVSBpcyB3cml0ZS9yZWFkZXIgb24gdGhpcyBpdGVtCiAgKiBUaGlzIHN0cnVjdHVyZSBpcyBhbGxvY2F0ZWQgaW4gVlBVIHNpZGUgYW5kIHNoYXJlZCB0byBBUCBzaWRlLgogICogQGNvbmZpZzogdnA4IGVuY29kZXIgY29uZmlndXJhdGlvbgogICogQHdvcmtfYnVmczogd29ya2luZyBidWZmZXIgaW5mb3JtYXRpb24gaW4gVlBVIHNpZGUKQEAgLTEzOCwxMiArMTQyLDYgQEAKIAlzdHJ1Y3QgbXRrX3Zjb2RlY19jdHggKmN0eDsKIH07CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB2cDhfZW5jX3dyaXRlX3JlZyhzdHJ1Y3QgdmVuY192cDhfaW5zdCAqaW5zdCwgdTMyIGFkZHIsCi0JCQkJICAgICB1MzIgdmFsKQotewotCXdyaXRlbCh2YWwsIGluc3QtPmh3X2Jhc2UgKyBhZGRyKTsKLX0KLQogc3RhdGljIGlubGluZSB1MzIgdnA4X2VuY19yZWFkX3JlZyhzdHJ1Y3QgdmVuY192cDhfaW5zdCAqaW5zdCwgdTMyIGFkZHIpCiB7CiAJcmV0dXJuIHJlYWRsKGluc3QtPmh3X2Jhc2UgKyBhZGRyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vcmNhci1mY3AuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vcmNhci1mY3AuYwppbmRleCA2YTdiY2MzLi5iYzUwYzY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3JjYXItZmNwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9yY2FyLWZjcC5jCkBAIC05OSwxMCArOTksMTYgQEAKICAqLwogaW50IHJjYXJfZmNwX2VuYWJsZShzdHJ1Y3QgcmNhcl9mY3BfZGV2aWNlICpmY3ApCiB7CisJaW50IGVycm9yOworCiAJaWYgKCFmY3ApCiAJCXJldHVybiAwOwogCi0JcmV0dXJuIHBtX3J1bnRpbWVfZ2V0X3N5bmMoZmNwLT5kZXYpOworCWVycm9yID0gcG1fcnVudGltZV9nZXRfc3luYyhmY3AtPmRldik7CisJaWYgKGVycm9yIDwgMCkKKwkJcmV0dXJuIGVycm9yOworCisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyY2FyX2ZjcF9lbmFibGUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcweC9yYWRpby1zaTQ3MHgtdXNiLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcweC9yYWRpby1zaTQ3MHgtdXNiLmMKaW5kZXggMDkxZDc5My4uNGIxMzJjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MHgvcmFkaW8tc2k0NzB4LXVzYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzB4L3JhZGlvLXNpNDcweC11c2IuYwpAQCAtNjI3LDcgKzYyNyw2IEBACiAKIAlyYWRpby0+aW50X2luX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyYWRpby0+aW50X2luX3VyYikgewotCQlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiY291bGQgbm90IGFsbG9jYXRlIGludF9pbl91cmIiKTsKIAkJcmV0dmFsID0gLUVOT01FTTsKIAkJZ290byBlcnJfaW50YnVmZmVyOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvaW1vbi5jIGIvZHJpdmVycy9tZWRpYS9yYy9pbW9uLmMKaW5kZXggNjVmODBiOC4uODZjYzcwZmUyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9pbW9uLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9pbW9uLmMKQEAgLTIyMTEsMTYgKzIyMTEsMTEgQEAKIAkJZ290byBleGl0OwogCX0KIAlyeF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghcnhfdXJiKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IHVzYl9hbGxvY191cmIgZmFpbGVkIGZvciBJUiB1cmIiLCBfX2Z1bmNfXyk7CisJaWYgKCFyeF91cmIpCiAJCWdvdG8gcnhfdXJiX2FsbG9jX2ZhaWxlZDsKLQl9CiAJdHhfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXR4X3VyYikgewotCQlkZXZfZXJyKGRldiwgIiVzOiB1c2JfYWxsb2NfdXJiIGZhaWxlZCBmb3IgZGlzcGxheSB1cmIiLAotCQkJX19mdW5jX18pOworCWlmICghdHhfdXJiKQogCQlnb3RvIHR4X3VyYl9hbGxvY19mYWlsZWQ7Ci0JfQogCiAJbXV0ZXhfaW5pdCgmaWN0eC0+bG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmljdHgtPmtjX2xvY2spOwpAQCAtMjMwNSwxMCArMjMwMCw4IEBACiAJaW50IHJldCA9IC1FTk9NRU07CiAKIAlyeF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghcnhfdXJiKSB7Ci0JCXByX2VycigidXNiX2FsbG9jX3VyYiBmYWlsZWQgZm9yIElSIHVyYlxuIik7CisJaWYgKCFyeF91cmIpCiAJCWdvdG8gcnhfdXJiX2FsbG9jX2ZhaWxlZDsKLQl9CiAKIAltdXRleF9sb2NrKCZpY3R4LT5sb2NrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9yZWRyYXQzLmMgYi9kcml2ZXJzL21lZGlhL3JjL3JlZHJhdDMuYwppbmRleCAzOTlmNDRkLi5lYzgwMTZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL3JlZHJhdDMuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL3JlZHJhdDMuYwpAQCAtOTcwLDEwICs5NzAsOCBAQAogCiAJLyogc2V0IHVwIGJ1bGstaW4gZW5kcG9pbnQgKi8KIAlycjMtPnJlYWRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJyMy0+cmVhZF91cmIpIHsKLQkJZGV2X2VycihkZXYsICJSZWFkIHVyYiBhbGxvY2F0aW9uIGZhaWx1cmVcbiIpOworCWlmICghcnIzLT5yZWFkX3VyYikKIAkJZ290byBlcnJvcjsKLQl9CiAKIAlycjMtPmVwX2luID0gZXBfaW47CiAJcnIzLT5idWxrX2luX2J1ZiA9IHVzYl9hbGxvY19jb2hlcmVudCh1ZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvYWlyc3B5L2FpcnNweS5jIGIvZHJpdmVycy9tZWRpYS91c2IvYWlyc3B5L2FpcnNweS5jCmluZGV4IGZlMDMxYjAuLjNjNTU2ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2FpcnNweS9haXJzcHkuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9haXJzcHkvYWlyc3B5LmMKQEAgLTQyNiw3ICs0MjYsNiBAQAogCQlkZXZfZGJnKHMtPmRldiwgImFsbG9jIHVyYj0lZFxuIiwgaSk7CiAJCXMtPnVyYl9saXN0W2ldID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCFzLT51cmJfbGlzdFtpXSkgewotCQkJZGV2X2RiZyhzLT5kZXYsICJmYWlsZWRcbiIpOwogCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykKIAkJCQl1c2JfZnJlZV91cmIocy0+dXJiX2xpc3Rbal0pOwogCQkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9hczEwMi9hczEwMl91c2JfZHJ2LmMgYi9kcml2ZXJzL21lZGlhL3VzYi9hczEwMi9hczEwMl91c2JfZHJ2LmMKaW5kZXggMGU4MDMwYy4uNjhjM2E4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvYXMxMDIvYXMxMDJfdXNiX2Rydi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2FzMTAyL2FzMTAyX3VzYl9kcnYuYwpAQCAtMjcwLDggKzI3MCw2IEBACiAKIAkJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHVyYiA9PSBOVUxMKSB7Ci0JCQlkZXZfZGJnKCZkZXYtPmJ1c19hZGFwLnVzYl9kZXYtPmRldiwKLQkJCQkiJXM6IHVzYl9hbGxvY191cmIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiAJCQlhczEwMl9mcmVlX3VzYl9zdHJlYW1fYnVmZmVyKGRldik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvYXUwODI4L2F1MDgyOC12aWRlby5jIGIvZHJpdmVycy9tZWRpYS91c2IvYXUwODI4L2F1MDgyOC12aWRlby5jCmluZGV4IDgyYjAyNjkuLjEzYjgzODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2F1MDgyOC9hdTA4MjgtdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9hdTA4MjgvYXUwODI4LXZpZGVvLmMKQEAgLTI0NSw3ICsyNDUsNiBAQAogCWZvciAoaSA9IDA7IGkgPCBkZXYtPmlzb2NfY3RsLm51bV9idWZzOyBpKyspIHsKIAkJdXJiID0gdXNiX2FsbG9jX3VyYihtYXhfcGFja2V0cywgR0ZQX0tFUk5FTCk7CiAJCWlmICghdXJiKSB7Ci0JCQlhdTA4MjhfaXNvY2RiZygiY2Fubm90IGFsbG9jIGlzb2NfY3RsLnVyYiAlaVxuIiwgaSk7CiAJCQlhdTA4MjhfdW5pbml0X2lzb2MoZGV2KTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9jcGlhMi9jcGlhMl91c2IuYyBiL2RyaXZlcnMvbWVkaWEvdXNiL2NwaWEyL2NwaWEyX3VzYi5jCmluZGV4IGMxYWExYWIuLjEzNjIwY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2NwaWEyL2NwaWEyX3VzYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2NwaWEyL2NwaWEyX3VzYi5jCkBAIC02NjIsNyArNjYyLDYgQEAKIAkJfQogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKEZSQU1FU19QRVJfREVTQywgR0ZQX0tFUk5FTCk7CiAJCWlmICghdXJiKSB7Ci0JCQlFUlIoIiVzOiB1c2JfYWxsb2NfdXJiIGVycm9yIVxuIiwgX19mdW5jX18pOwogCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykKIAkJCQl1c2JfZnJlZV91cmIoY2FtLT5zYnVmW2pdLnVyYik7CiAJCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL2N4MjMxeHgvY3gyMzF4eC1hdWRpby5jIGIvZHJpdmVycy9tZWRpYS91c2IvY3gyMzF4eC9jeDIzMXh4LWF1ZGlvLmMKaW5kZXggYTZhOTUwOC4uNGNkNWZhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvY3gyMzF4eC9jeDIzMXh4LWF1ZGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvY3gyMzF4eC9jeDIzMXh4LWF1ZGlvLmMKQEAgLTI5Myw3ICsyOTMsNiBAQAogCQltZW1zZXQoZGV2LT5hZGV2LnRyYW5zZmVyX2J1ZmZlcltpXSwgMHg4MCwgc2Jfc2l6ZSk7CiAJCXVyYiA9IHVzYl9hbGxvY191cmIoQ1gyMzFYWF9JU09fTlVNX0FVRElPX1BBQ0tFVFMsIEdGUF9BVE9NSUMpOwogCQlpZiAoIXVyYikgewotCQkJZGV2X2VycihkZXYtPmRldiwgInVzYl9hbGxvY191cmIgZmFpbGVkIVxuIik7CiAJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CiAJCQkJdXNiX2ZyZWVfdXJiKGRldi0+YWRldi51cmJbal0pOwogCQkJCWtmcmVlKGRldi0+YWRldi50cmFuc2Zlcl9idWZmZXJbal0pOwpAQCAtMzU1LDcgKzM1NCw2IEBACiAJCW1lbXNldChkZXYtPmFkZXYudHJhbnNmZXJfYnVmZmVyW2ldLCAweDgwLCBzYl9zaXplKTsKIAkJdXJiID0gdXNiX2FsbG9jX3VyYihDWDIzMVhYX05VTV9BVURJT19QQUNLRVRTLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCF1cmIpIHsKLQkJCWRldl9lcnIoZGV2LT5kZXYsICJ1c2JfYWxsb2NfdXJiIGZhaWxlZCFcbiIpOwogCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykgewogCQkJCXVzYl9mcmVlX3VyYihkZXYtPmFkZXYudXJiW2pdKTsKIAkJCQlrZnJlZShkZXYtPmFkZXYudHJhbnNmZXJfYnVmZmVyW2pdKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL2N4MjMxeHgvY3gyMzF4eC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3VzYi9jeDIzMXh4L2N4MjMxeHgtY29yZS5jCmluZGV4IDYzMGY0ZmMuLjhlYzA1Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2N4MjMxeHgvY3gyMzF4eC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvY3gyMzF4eC9jeDIzMXh4LWNvcmUuYwpAQCAtMTAzNSw4ICsxMDM1LDYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgZGV2LT52aWRlb19tb2RlLmlzb2NfY3RsLm51bV9idWZzOyBpKyspIHsKIAkJdXJiID0gdXNiX2FsbG9jX3VyYihtYXhfcGFja2V0cywgR0ZQX0tFUk5FTCk7CiAJCWlmICghdXJiKSB7Ci0JCQlkZXZfZXJyKGRldi0+ZGV2LAotCQkJCSJjYW5ub3QgYWxsb2MgaXNvY19jdGwudXJiICVpXG4iLCBpKTsKIAkJCWN4MjMxeHhfdW5pbml0X2lzb2MoZGV2KTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CkBAIC0xMTcyLDggKzExNzAsNiBAQAogCWZvciAoaSA9IDA7IGkgPCBkZXYtPnZpZGVvX21vZGUuYnVsa19jdGwubnVtX2J1ZnM7IGkrKykgewogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCQlpZiAoIXVyYikgewotCQkJZGV2X2VycihkZXYtPmRldiwKLQkJCQkiY2Fubm90IGFsbG9jIGJ1bGtfY3RsLnVyYiAlaVxuIiwgaSk7CiAJCQljeDIzMXh4X3VuaW5pdF9idWxrKGRldik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvY3gyMzF4eC9jeDIzMXh4LXZiaS5jIGIvZHJpdmVycy9tZWRpYS91c2IvY3gyMzF4eC9jeDIzMXh4LXZiaS5jCmluZGV4IDE1YmI1NzMuLjc2ZTkwMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2N4MjMxeHgvY3gyMzF4eC12YmkuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9jeDIzMXh4L2N4MjMxeHgtdmJpLmMKQEAgLTQ0Miw4ICs0NDIsNiBAQAogCiAJCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdXJiKSB7Ci0JCQlkZXZfZXJyKGRldi0+ZGV2LAotCQkJCSJjYW5ub3QgYWxsb2MgYnVsa19jdGwudXJiICVpXG4iLCBpKTsKIAkJCWN4MjMxeHhfdW5pbml0X3ZiaV9pc29jKGRldik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi9kaWIwNzAwX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2IvZGliMDcwMF9jb3JlLmMKaW5kZXggYmY4OTBjMy4uMjY3OTc5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi9kaWIwNzAwX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiL2RpYjA3MDBfY29yZS5jCkBAIC03ODMsMTAgKzc4Myw4IEBACiAJLyogU3RhcnRpbmcgaW4gZmlybXdhcmUgMS4yMCwgdGhlIFJDIGluZm8gaXMgcHJvdmlkZWQgb24gYSBidWxrIHBpcGUgKi8KIAogCXB1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmIChwdXJiID09IE5VTEwpIHsKLQkJZXJyKCJyYyB1c2IgYWxsb2MgdXJiIGZhaWxlZCIpOworCWlmIChwdXJiID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXB1cmItPnRyYW5zZmVyX2J1ZmZlciA9IGt6YWxsb2MoUkNfTVNHX1NJWkVfVjFfMjAsIEdGUF9LRVJORUwpOwogCWlmIChwdXJiLT50cmFuc2Zlcl9idWZmZXIgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC1hdWRpby5jIGIvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC1hdWRpby5jCmluZGV4IDQ5YTVmOTUuLjc4ZjM2ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2VtMjh4eC9lbTI4eHgtYXVkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LWF1ZGlvLmMKQEAgLTg1MCw3ICs4NTAsNiBAQAogCiAJCXVyYiA9IHVzYl9hbGxvY191cmIobnBhY2tldHMsIEdGUF9BVE9NSUMpOwogCQlpZiAoIXVyYikgewotCQkJZW0yOHh4X2VycmRldigidXNiX2FsbG9jX3VyYiBmYWlsZWQhXG4iKTsKIAkJCWVtMjh4eF9hdWRpb19mcmVlX3VyYihkZXYpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL2VtMjh4eC9lbTI4eHgtY29yZS5jIGIvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC1jb3JlLmMKaW5kZXggMzc0NTYwNy4uZWViZDVkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC1jb3JlLmMKQEAgLTkzNCw3ICs5MzQsNiBAQAogCWZvciAoaSA9IDA7IGkgPCB1c2JfYnVmcy0+bnVtX2J1ZnM7IGkrKykgewogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKHVzYl9idWZzLT5udW1fcGFja2V0cywgR0ZQX0tFUk5FTCk7CiAJCWlmICghdXJiKSB7Ci0JCQllbTI4eHhfZXJyKCJjYW5ub3QgYWxsb2MgdXNiX2N0bC51cmIgJWlcbiIsIGkpOwogCQkJZW0yOHh4X3VuaW5pdF91c2JfeGZlcihkZXYsIG1vZGUpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL2dzcGNhL2JlbnEuYyBiL2RyaXZlcnMvbWVkaWEvdXNiL2dzcGNhL2JlbnEuYwppbmRleCA3OTBiYWVkLi41ZmE2N2I3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9nc3BjYS9iZW5xLmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvZ3NwY2EvYmVucS5jCkBAIC05NSwxMCArOTUsOCBAQAogI2RlZmluZSBTRF9OUEtUIDMyCiAJZm9yIChuID0gMDsgbiA8IDQ7IG4rKykgewogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKFNEX05QS1QsIEdGUF9LRVJORUwpOwotCQlpZiAoIXVyYikgewotCQkJcHJfZXJyKCJ1c2JfYWxsb2NfdXJiIGZhaWxlZFxuIik7CisJCWlmICghdXJiKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KIAkJZ3NwY2FfZGV2LT51cmJbbl0gPSB1cmI7CiAJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gdXNiX2FsbG9jX2NvaGVyZW50KGdzcGNhX2Rldi0+ZGV2LAogCQkJCQkJU0RfUEtUX1NaICogU0RfTlBLVCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL2dzcGNhL2dzcGNhLmMgYi9kcml2ZXJzL21lZGlhL3VzYi9nc3BjYS9nc3BjYS5jCmluZGV4IGIxN2JkN2UuLmFmMjM5NWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2dzcGNhL2dzcGNhLmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvZ3NwY2EvZ3NwY2EuYwpAQCAtNzk1LDEwICs3OTUsOCBAQAogCiAJZm9yIChuID0gMDsgbiA8IG51cmJzOyBuKyspIHsKIAkJdXJiID0gdXNiX2FsbG9jX3VyYihucGt0LCBHRlBfS0VSTkVMKTsKLQkJaWYgKCF1cmIpIHsKLQkJCXByX2VycigidXNiX2FsbG9jX3VyYiBmYWlsZWRcbiIpOworCQlpZiAoIXVyYikKIAkJCXJldHVybiAtRU5PTUVNOwotCQl9CiAJCWdzcGNhX2Rldi0+dXJiW25dID0gdXJiOwogCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IHVzYl9hbGxvY19jb2hlcmVudChnc3BjYV9kZXYtPmRldiwKIAkJCQkJCWJzaXplLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvZ3NwY2Eva29uaWNhLmMgYi9kcml2ZXJzL21lZGlhL3VzYi9nc3BjYS9rb25pY2EuYwppbmRleCAwNzEyYjFiLi40MGFhYWE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9nc3BjYS9rb25pY2EuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9nc3BjYS9rb25pY2EuYwpAQCAtMjA4LDEwICsyMDgsOCBAQAogCQlwYWNrZXRfc2l6ZSA9CiAJCQlsZTE2X3RvX2NwdShhbHQtPmVuZHBvaW50W2ldLmRlc2Mud01heFBhY2tldFNpemUpOwogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKFNEX05QS1QsIEdGUF9LRVJORUwpOwotCQlpZiAoIXVyYikgewotCQkJcHJfZXJyKCJ1c2JfYWxsb2NfdXJiIGZhaWxlZFxuIik7CisJCWlmICghdXJiKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KIAkJZ3NwY2FfZGV2LT51cmJbbl0gPSB1cmI7CiAJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gdXNiX2FsbG9jX2NvaGVyZW50KGdzcGNhX2Rldi0+ZGV2LAogCQkJCQkJcGFja2V0X3NpemUgKiBTRF9OUEtULApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvaGFja3JmL2hhY2tyZi5jIGIvZHJpdmVycy9tZWRpYS91c2IvaGFja3JmL2hhY2tyZi5jCmluZGV4IGIxZTIyOWEuLmMyYzhkMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2hhY2tyZi9oYWNrcmYuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9oYWNrcmYvaGFja3JmLmMKQEAgLTY5MSw3ICs2OTEsNiBAQAogCQlkZXZfZGJnKGRldi0+ZGV2LCAiYWxsb2MgdXJiPSVkXG4iLCBpKTsKIAkJZGV2LT51cmJfbGlzdFtpXSA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CiAJCWlmICghZGV2LT51cmJfbGlzdFtpXSkgewotCQkJZGV2X2RiZyhkZXYtPmRldiwgImZhaWxlZFxuIik7CiAJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQogCQkJCXVzYl9mcmVlX3VyYihkZXYtPnVyYl9saXN0W2pdKTsKIAkJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvaGRwdnIvaGRwdnItdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdXNiL2hkcHZyL2hkcHZyLXZpZGVvLmMKaW5kZXggMmEzYThiNC4uNmQ0M2Q3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvaGRwdnIvaGRwdnItdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9oZHB2ci9oZHB2ci12aWRlby5jCkBAIC0xNTUsMTAgKzE1NSw4IEBACiAJCWJ1Zi0+ZGV2ID0gZGV2OwogCiAJCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghdXJiKSB7Ci0JCQl2NGwyX2VycigmZGV2LT52NGwyX2RldiwgImNhbm5vdCBhbGxvY2F0ZSB1cmJcbiIpOworCQlpZiAoIXVyYikKIAkJCWdvdG8gZXhpdF91cmI7Ci0JCX0KIAkJYnVmLT51cmIgPSB1cmI7CiAKIAkJbWVtID0gdXNiX2FsbG9jX2NvaGVyZW50KGRldi0+dWRldiwgZGV2LT5idWxrX2luX3NpemUsIEdGUF9LRVJORUwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9tc2kyNTAwL21zaTI1MDAuYyBiL2RyaXZlcnMvbWVkaWEvdXNiL21zaTI1MDAvbXNpMjUwMC5jCmluZGV4IGU3ZjE2N2QuLjM2N2ViN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL21zaTI1MDAvbXNpMjUwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL21zaTI1MDAvbXNpMjUwMC5jCkBAIC01MDksNyArNTA5LDYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0lTT19CVUZTOyBpKyspIHsKIAkJdXJiID0gdXNiX2FsbG9jX3VyYihJU09fRlJBTUVTX1BFUl9ERVNDLCBHRlBfS0VSTkVMKTsKIAkJaWYgKHVyYiA9PSBOVUxMKSB7Ci0JCQlkZXZfZXJyKGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIHVyYiAlZFxuIiwgaSk7CiAJCQltc2kyNTAwX2lzb2NfY2xlYW51cChkZXYpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL3B3Yy9wd2MtaWYuYyBiL2RyaXZlcnMvbWVkaWEvdXNiL3B3Yy9wd2MtaWYuYwppbmRleCBiNTFiMjdhLi5jNDQ1NGM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9wd2MvcHdjLWlmLmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvcHdjL3B3Yy1pZi5jCkBAIC00MTAsNyArNDEwLDYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0lTT19CVUZTOyBpKyspIHsKIAkJdXJiID0gdXNiX2FsbG9jX3VyYihJU09fRlJBTUVTX1BFUl9ERVNDLCBHRlBfS0VSTkVMKTsKIAkJaWYgKHVyYiA9PSBOVUxMKSB7Ci0JCQlQV0NfRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSB1cmIgJWRcbiIsIGkpOwogCQkJcHdjX2lzb2NfY2xlYW51cChwZGV2KTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9zMjI1NS9zMjI1NWRydi5jIGIvZHJpdmVycy9tZWRpYS91c2IvczIyNTUvczIyNTVkcnYuYwppbmRleCA0M2JhNzFhLi45NDU4ZWIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9zMjI1NS9zMjI1NWRydi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL3MyMjU1L3MyMjU1ZHJ2LmMKQEAgLTIxMTMsMTEgKzIxMTMsOCBAQAogCXBpcGVfaW5mby0+c3RhdGUgPSAxOwogCXBpcGVfaW5mby0+ZXJyX2NvdW50ID0gMDsKIAlwaXBlX2luZm8tPnN0cmVhbV91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghcGlwZV9pbmZvLT5zdHJlYW1fdXJiKSB7Ci0JCWRldl9lcnIoJmRldi0+dWRldi0+ZGV2LAotCQkJIlJlYWRTdHJlYW06IFVuYWJsZSB0byBhbGxvYyBVUkJcbiIpOworCWlmICghcGlwZV9pbmZvLT5zdHJlYW1fdXJiKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAJLyogdHJhbnNmZXIgYnVmZmVyIGFsbG9jYXRlZCBpbiBib2FyZF9pbml0ICovCiAJdXNiX2ZpbGxfYnVsa191cmIocGlwZV9pbmZvLT5zdHJlYW1fdXJiLCBkZXYtPnVkZXYsCiAJCQkgIHBpcGUsCkBAIC0yMjkwLDEwICsyMjg3LDggQEAKIAl9CiAKIAlkZXYtPmZ3X2RhdGEtPmZ3X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYtPmZ3X2RhdGEtPmZ3X3VyYikgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIm91dCBvZiBtZW1vcnkhXG4iKTsKKwlpZiAoIWRldi0+ZndfZGF0YS0+ZndfdXJiKQogCQlnb3RvIGVycm9yRldVUkI7Ci0JfQogCiAJZGV2LT5md19kYXRhLT5wZndfZGF0YSA9IGt6YWxsb2MoQ0hVTktfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkZXYtPmZ3X2RhdGEtPnBmd19kYXRhKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9zdGsxMTYwL3N0azExNjAtdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdXNiL3N0azExNjAvc3RrMTE2MC12aWRlby5jCmluZGV4IDZlY2IwYjQuLmNlOGViYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL3N0azExNjAvc3RrMTE2MC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL3N0azExNjAvc3RrMTE2MC12aWRlby5jCkBAIC00NTcsMTAgKzQ1Nyw4IEBACiAJZm9yIChpID0gMDsgaSA8IG51bV9idWZzOyBpKyspIHsKIAogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKG1heF9wYWNrZXRzLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCF1cmIpIHsKLQkJCXN0azExNjBfZXJyKCJjYW5ub3QgYWxsb2MgdXJiWyVkXVxuIiwgaSk7CisJCWlmICghdXJiKQogCQkJZ290byBmcmVlX2lfYnVmczsKLQkJfQogCQlkZXYtPmlzb2NfY3RsLnVyYltpXSA9IHVyYjsKIAogI2lmbmRlZiBDT05GSUdfRE1BX05PTkNPSEVSRU5UCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9zdGt3ZWJjYW0vc3RrLXdlYmNhbS5jIGIvZHJpdmVycy9tZWRpYS91c2Ivc3Rrd2ViY2FtL3N0ay13ZWJjYW0uYwppbmRleCBjMjFjNGMwLi5kYjIwMGM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9zdGt3ZWJjYW0vc3RrLXdlYmNhbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL3N0a3dlYmNhbS9zdGstd2ViY2FtLmMKQEAgLTQ1MiwxMCArNDUyLDggQEAKIAkJCVNUS19FUlJPUigiaXNvYnVmIGRhdGEgYWxyZWFkeSBhbGxvY2F0ZWRcbiIpOwogCQlpZiAoZGV2LT5pc29idWZzW2ldLnVyYiA9PSBOVUxMKSB7CiAJCQl1cmIgPSB1c2JfYWxsb2NfdXJiKElTT19GUkFNRVNfUEVSX0RFU0MsIEdGUF9LRVJORUwpOwotCQkJaWYgKHVyYiA9PSBOVUxMKSB7Ci0JCQkJU1RLX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgVVJCICVkXG4iLCBpKTsKKwkJCWlmICh1cmIgPT0gTlVMTCkKIAkJCQlnb3RvIGlzb2J1ZnNfb3V0OwotCQkJfQogCQkJZGV2LT5pc29idWZzW2ldLnVyYiA9IHVyYjsKIAkJfSBlbHNlIHsKIAkJCVNUS19FUlJPUigiS2lsbGluZyBVUkJcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvdG02MDAwL3RtNjAwMC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdXNiL3RtNjAwMC90bTYwMDAtZHZiLmMKaW5kZXggMDk1ZjVkYi4uMDQyNmIyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvdG02MDAwL3RtNjAwMC1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi90bTYwMDAvdG02MDAwLWR2Yi5jCkBAIC0xMjksMTAgKzEyOSw4IEBACiAJfQogCiAJZHZiLT5idWxrX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGR2Yi0+YnVsa191cmIgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgInRtNjAwMDogY291bGRuJ3QgYWxsb2NhdGUgdXJiXG4iKTsKKwlpZiAoZHZiLT5idWxrX3VyYiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlwaXBlID0gdXNiX3JjdmJ1bGtwaXBlKGRldi0+dWRldiwgZGV2LT5idWxrX2luLmVuZHAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcwogCQkJCQkJCSAgJiBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvdG02MDAwL3RtNjAwMC12aWRlby5jIGIvZHJpdmVycy9tZWRpYS91c2IvdG02MDAwL3RtNjAwMC12aWRlby5jCmluZGV4IGZhNWU4YmQuLmRlZTdlN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL3RtNjAwMC90bTYwMDAtdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi90bTYwMDAvdG02MDAwLXZpZGVvLmMKQEAgLTYzNSw3ICs2MzUsNiBAQAogCWZvciAoaSA9IDA7IGkgPCBkZXYtPmlzb2NfY3RsLm51bV9idWZzOyBpKyspIHsKIAkJdXJiID0gdXNiX2FsbG9jX3VyYihtYXhfcGFja2V0cywgR0ZQX0tFUk5FTCk7CiAJCWlmICghdXJiKSB7Ci0JCQl0bTYwMDBfZXJyKCJjYW5ub3QgYWxsb2MgaXNvY19jdGwudXJiICVpXG4iLCBpKTsKIAkJCXRtNjAwMF91bmluaXRfaXNvYyhkZXYpOwogCQkJdXNiX2ZyZWVfdXJiKHVyYik7CiAJCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL3VzYnZpc2lvbi91c2J2aXNpb24tY29yZS5jIGIvZHJpdmVycy9tZWRpYS91c2IvdXNidmlzaW9uL3VzYnZpc2lvbi1jb3JlLmMKaW5kZXggNTJhYzQzOS4uYzIzYmY3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvdXNidmlzaW9uL3VzYnZpc2lvbi1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvdXNidmlzaW9uL3VzYnZpc2lvbi1jb3JlLmMKQEAgLTIzMDMsMTEgKzIzMDMsOCBAQAogCQlzdHJ1Y3QgdXJiICp1cmI7CiAKIAkJdXJiID0gdXNiX2FsbG9jX3VyYihVU0JWSVNJT05fVVJCX0ZSQU1FUywgR0ZQX0tFUk5FTCk7Ci0JCWlmICh1cmIgPT0gTlVMTCkgewotCQkJZGV2X2VycigmdXNidmlzaW9uLT5kZXYtPmRldiwKLQkJCQkiJXM6IHVzYl9hbGxvY191cmIoKSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJaWYgKHVyYiA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KIAkJdXNidmlzaW9uLT5zYnVmW2J1Zl9pZHhdLnVyYiA9IHVyYjsKIAkJdXNidmlzaW9uLT5zYnVmW2J1Zl9pZHhdLmRhdGEgPQogCQkJdXNiX2FsbG9jX2NvaGVyZW50KHVzYnZpc2lvbi0+ZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvenIzNjR4eC96cjM2NHh4LmMgYi9kcml2ZXJzL21lZGlhL3VzYi96cjM2NHh4L3pyMzY0eHguYwppbmRleCA3NDMzYmE1Li5jYzEyOGRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi96cjM2NHh4L3pyMzY0eHguYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi96cjM2NHh4L3pyMzY0eHguYwpAQCAtMTA0NSwxMCArMTA0NSw4IEBACiAJcGlwZV9pbmZvLT5zdGF0ZSA9IDE7CiAJcGlwZV9pbmZvLT5lcnJfY291bnQgPSAwOwogCXBpcGVfaW5mby0+c3RyZWFtX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwaXBlX2luZm8tPnN0cmVhbV91cmIpIHsKLQkJZGV2X2VycigmY2FtLT51ZGV2LT5kZXYsICJSZWFkU3RyZWFtOiBVbmFibGUgdG8gYWxsb2MgVVJCXG4iKTsKKwlpZiAoIXBpcGVfaW5mby0+c3RyZWFtX3VyYikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCS8qIHRyYW5zZmVyIGJ1ZmZlciBhbGxvY2F0ZWQgaW4gYm9hcmRfaW5pdCAqLwogCXVzYl9maWxsX2J1bGtfdXJiKHBpcGVfaW5mby0+c3RyZWFtX3VyYiwgY2FtLT51ZGV2LAogCQkJICBwaXBlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZW1vcnkvb2ZfbWVtb3J5LmMgYi9kcml2ZXJzL21lbW9yeS9vZl9tZW1vcnkuYwppbmRleCA5ZGFmOTRiLi41NjhmMDVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lbW9yeS9vZl9tZW1vcnkuYworKysgYi9kcml2ZXJzL21lbW9yeS9vZl9tZW1vcnkuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPG1lbW9yeS9qZWRlY19kZHIuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlICJvZl9tZW1vcnkuaCIKIAogLyoqCiAgKiBvZl9nZXRfbWluX3RjaygpIC0gZXh0cmFjdCBtaW4gdGltaW5nIHZhbHVlcyBmb3IgZGRyCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lbW9yeS9vbWFwLWdwbWMuYyBiL2RyaXZlcnMvbWVtb3J5L29tYXAtZ3BtYy5jCmluZGV4IDg2OWM4M2YuLmYwMGYzZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVtb3J5L29tYXAtZ3BtYy5jCisrKyBiL2RyaXZlcnMvbWVtb3J5L29tYXAtZ3BtYy5jCkBAIC0yMTg1LDcgKzIxODUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGdwbWNfcHJvYmVfZHRfY2hpbGRyZW4oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyB2b2lkIGdwbWNfcHJvYmVfZHRfY2hpbGRyZW4oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQ7CkBAIC0yMjAwLDExICsyMjAwLDExIEBACiAJCWVsc2UKIAkJCXJldCA9IGdwbWNfcHJvYmVfZ2VuZXJpY19jaGlsZChwZGV2LCBjaGlsZCk7CiAKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBwcm9iZSBEVCBjaGlsZCAnJXMnOiAlZFxuIiwKKwkJCQljaGlsZC0+bmFtZSwgcmV0KTsKKwkJfQogCX0KLQotCXJldHVybiAwOwogfQogI2Vsc2UKIHN0YXRpYyBpbnQgZ3BtY19wcm9iZV9kdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpAQCAtMjIxMiw5ICsyMjEyLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBncG1jX3Byb2JlX2R0X2NoaWxkcmVuKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgdm9pZCBncG1jX3Byb2JlX2R0X2NoaWxkcmVuKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0JcmV0dXJuIDA7CiB9CiAjZW5kaWYgLyogQ09ORklHX09GICovCiAKQEAgLTIzNjksMTYgKzIzNjgsMTAgQEAKIAkJZ290byBzZXR1cF9pcnFfZmFpbGVkOwogCX0KIAotCXJjID0gZ3BtY19wcm9iZV9kdF9jaGlsZHJlbihwZGV2KTsKLQlpZiAocmMgPCAwKSB7Ci0JCWRldl9lcnIoZ3BtYy0+ZGV2LCAiZmFpbGVkIHRvIHByb2JlIERUIGNoaWxkcmVuXG4iKTsKLQkJZ290byBkdF9jaGlsZHJlbl9mYWlsZWQ7Ci0JfQorCWdwbWNfcHJvYmVfZHRfY2hpbGRyZW4ocGRldik7CiAKIAlyZXR1cm4gMDsKIAotZHRfY2hpbGRyZW5fZmFpbGVkOgotCWdwbWNfZnJlZV9pcnEoZ3BtYyk7CiBzZXR1cF9pcnFfZmFpbGVkOgogCWdwbWNfZ3Bpb19leGl0KGdwbWMpOwogZ3Bpb19pbml0X2ZhaWxlZDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL0tjb25maWcgYi9kcml2ZXJzL21mZC9LY29uZmlnCmluZGV4IGNlYjI5ZjMuLmM2ZGY2NDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL0tjb25maWcKKysrIGIvZHJpdmVycy9tZmQvS2NvbmZpZwpAQCAtMzU4LDE0ICszNTgsNiBAQAogCWhlbHAKIAkgIFNlbGVjdCB0aGlzIG9wdGlvbiB0byBlbmFibGUgSGlzaWxpY29uIGhpNjU1eCBzZXJpZXMgcG1pYyBkcml2ZXIuCiAKLWNvbmZpZyBIVENfRUdQSU8KLQlib29sICJIVEMgRUdQSU8gc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEdQSU9MSUIgJiYgQVJNCi0JaGVscAotCSAgICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgQ1BMRCBlZ3BpbyBjaGlwIHByZXNlbnQgb24KLQkgICAgc2V2ZXJhbCBIVEMgcGhvbmVzLiAgSXQgcHJvdmlkZXMgYmFzaWMgc3VwcG9ydCBmb3IgaW5wdXQKLQkgICAgcGlucywgb3V0cHV0IHBpbnMsIGFuZCBpcnFzLgotCiBjb25maWcgSFRDX1BBU0lDMwogCXRyaXN0YXRlICJIVEMgUEFTSUMzIExFRC9EUzFXTSBjaGlwIHN1cHBvcnQiCiAJc2VsZWN0IE1GRF9DT1JFCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9NYWtlZmlsZSBiL2RyaXZlcnMvbWZkL01ha2VmaWxlCmluZGV4IGYxOGRjZTEuLjk4MzRlNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWZkL01ha2VmaWxlCkBAIC0xOSw3ICsxOSw2IEBACiBvYmotJChDT05GSUdfTUZEX1JUU1hfUENJKQkrPSBydHN4X3BjaS5vCiBvYmotJChDT05GSUdfTUZEX1JUU1hfVVNCKQkrPSBydHN4X3VzYi5vCiAKLW9iai0kKENPTkZJR19IVENfRUdQSU8pCQkrPSBodGMtZWdwaW8ubwogb2JqLSQoQ09ORklHX0hUQ19QQVNJQzMpCSs9IGh0Yy1wYXNpYzMubwogb2JqLSQoQ09ORklHX0hUQ19JMkNQTEQpCSs9IGh0Yy1pMmNwbGQubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9odGMtZWdwaW8uYyBiL2RyaXZlcnMvbWZkL2h0Yy1lZ3Bpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTNjZmM1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWZkL2h0Yy1lZ3Bpby5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQwICswLDAgQEAKLS8qCi0gKiBTdXBwb3J0IGZvciB0aGUgR1BJTy9JUlEgZXhwYW5kZXIgY2hpcHMgcHJlc2VudCBvbiBzZXZlcmFsIEhUQyBwaG9uZXMuCi0gKiBUaGVzZSBhcmUgaW1wbGVtZW50ZWQgaW4gQ1BMRCBjaGlwcyBwcmVzZW50IG9uIHRoZSBib2FyZC4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgS2V2aW4gTydDb25ub3IgPGtldmluQGtvY29ubm9yLm5ldD4KLSAqIENvcHlyaWdodCAoYykgMjAwNyBQaGlsaXBwIFphYmVsIDxwaGlsaXBwLnphYmVsQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBsaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL2h0Yy1lZ3Bpby5oPgotCi1zdHJ1Y3QgZWdwaW9fY2hpcCB7Ci0JaW50ICAgICAgICAgICAgICByZWdfc3RhcnQ7Ci0JaW50ICAgICAgICAgICAgICBjYWNoZWRfdmFsdWVzOwotCXVuc2lnbmVkIGxvbmcgICAgaXNfb3V0OwotCXN0cnVjdCBkZXZpY2UgICAgKmRldjsKLQlzdHJ1Y3QgZ3Bpb19jaGlwIGNoaXA7Ci19OwotCi1zdHJ1Y3QgZWdwaW9faW5mbyB7Ci0Jc3BpbmxvY2tfdCAgICAgICAgbG9jazsKLQotCS8qIGlvbWVtIGluZm8gKi8KLQl2b2lkIF9faW9tZW0gICAgICAqYmFzZV9hZGRyOwotCWludCAgICAgICAgICAgICAgIGJ1c19zaGlmdDsJLyogYnl0ZSBzaGlmdCAqLwotCWludCAgICAgICAgICAgICAgIHJlZ19zaGlmdDsJLyogYml0IHNoaWZ0ICovCi0JaW50ICAgICAgICAgICAgICAgcmVnX21hc2s7Ci0KLQkvKiBpcnEgaW5mbyAqLwotCWludCAgICAgICAgICAgICAgIGFja19yZWdpc3RlcjsKLQlpbnQgICAgICAgICAgICAgICBhY2tfd3JpdGU7Ci0JdTE2ICAgICAgICAgICAgICAgaXJxc19lbmFibGVkOwotCXVpbnQgICAgICAgICAgICAgIGlycV9zdGFydDsKLQlpbnQgICAgICAgICAgICAgICBuaXJxczsKLQl1aW50ICAgICAgICAgICAgICBjaGFpbmVkX2lycTsKLQotCS8qIGVncGlvIGluZm8gKi8KLQlzdHJ1Y3QgZWdwaW9fY2hpcCAqY2hpcDsKLQlpbnQgICAgICAgICAgICAgICBuY2hpcHM7Ci19OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgZWdwaW9fd3JpdGV3KHUxNiB2YWx1ZSwgc3RydWN0IGVncGlvX2luZm8gKmVpLCBpbnQgcmVnKQotewotCXdyaXRldyh2YWx1ZSwgZWktPmJhc2VfYWRkciArIChyZWcgPDwgZWktPmJ1c19zaGlmdCkpOwotfQotCi1zdGF0aWMgaW5saW5lIHUxNiBlZ3Bpb19yZWFkdyhzdHJ1Y3QgZWdwaW9faW5mbyAqZWksIGludCByZWcpCi17Ci0JcmV0dXJuIHJlYWR3KGVpLT5iYXNlX2FkZHIgKyAocmVnIDw8IGVpLT5idXNfc2hpZnQpKTsKLX0KLQotLyoKLSAqIElSUXMKLSAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgYWNrX2lycXMoc3RydWN0IGVncGlvX2luZm8gKmVpKQotewotCWVncGlvX3dyaXRldyhlaS0+YWNrX3dyaXRlLCBlaSwgZWktPmFja19yZWdpc3Rlcik7Ci0JcHJfZGVidWcoIkVHUElPIGFjayAtIHdyaXRlICV4IHRvIGJhc2UrJXhcbiIsCi0JCQllaS0+YWNrX3dyaXRlLCBlaS0+YWNrX3JlZ2lzdGVyIDw8IGVpLT5idXNfc2hpZnQpOwotfQotCi1zdGF0aWMgdm9pZCBlZ3Bpb19hY2soc3RydWN0IGlycV9kYXRhICpkYXRhKQotewotfQotCi0vKiBUaGVyZSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJvYWN0aXZlbHkgbWFzayBpbnRlcnJ1cHRzCi0gKiBvbiB0aGUgZWdwaW8gY2hpcCBpdHNlbGYuICBTbywgd2Ugc2ltcGx5IGlnbm9yZSBpbnRlcnJ1cHRzIHRoYXQKLSAqIGFyZW4ndCBkZXNpcmVkLiAqLwotc3RhdGljIHZvaWQgZWdwaW9fbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCi17Ci0Jc3RydWN0IGVncGlvX2luZm8gKmVpID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7Ci0JZWktPmlycXNfZW5hYmxlZCAmPSB+KDEgPDwgKGRhdGEtPmlycSAtIGVpLT5pcnFfc3RhcnQpKTsKLQlwcl9kZWJ1ZygiRUdQSU8gbWFzayAlZCAlMDR4XG4iLCBkYXRhLT5pcnEsIGVpLT5pcnFzX2VuYWJsZWQpOwotfQotCi1zdGF0aWMgdm9pZCBlZ3Bpb191bm1hc2soc3RydWN0IGlycV9kYXRhICpkYXRhKQotewotCXN0cnVjdCBlZ3Bpb19pbmZvICplaSA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOwotCWVpLT5pcnFzX2VuYWJsZWQgfD0gMSA8PCAoZGF0YS0+aXJxIC0gZWktPmlycV9zdGFydCk7Ci0JcHJfZGVidWcoIkVHUElPIHVubWFzayAlZCAlMDR4XG4iLCBkYXRhLT5pcnEsIGVpLT5pcnFzX2VuYWJsZWQpOwotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIGVncGlvX211eGVkX2NoaXAgPSB7Ci0JLm5hbWUJCT0gImh0Yy1lZ3BpbyIsCi0JLmlycV9hY2sJPSBlZ3Bpb19hY2ssCi0JLmlycV9tYXNrCT0gZWdwaW9fbWFzaywKLQkuaXJxX3VubWFzawk9IGVncGlvX3VubWFzaywKLX07Ci0KLXN0YXRpYyB2b2lkIGVncGlvX2hhbmRsZXIoc3RydWN0IGlycV9kZXNjICpkZXNjKQotewotCXN0cnVjdCBlZ3Bpb19pbmZvICplaSA9IGlycV9kZXNjX2dldF9oYW5kbGVyX2RhdGEoZGVzYyk7Ci0JaW50IGlycXBpbjsKLQotCS8qIFJlYWQgY3VycmVudCBwaW5zLiAqLwotCXVuc2lnbmVkIGxvbmcgcmVhZHZhbCA9IGVncGlvX3JlYWR3KGVpLCBlaS0+YWNrX3JlZ2lzdGVyKTsKLQlwcl9kZWJ1ZygiSVJRIHJlZzogJXhcbiIsICh1bnNpZ25lZCBpbnQpcmVhZHZhbCk7Ci0JLyogQWNrL3VubWFzayBpbnRlcnJ1cHRzLiAqLwotCWFja19pcnFzKGVpKTsKLQkvKiBQcm9jZXNzIGFsbCBzZXQgcGlucy4gKi8KLQlyZWFkdmFsICY9IGVpLT5pcnFzX2VuYWJsZWQ7Ci0JZm9yX2VhY2hfc2V0X2JpdChpcnFwaW4sICZyZWFkdmFsLCBlaS0+bmlycXMpIHsKLQkJLyogUnVuIGlycSBoYW5kbGVyICovCi0JCXByX2RlYnVnKCJnb3QgSVJRICVkXG4iLCBpcnFwaW4pOwotCQlnZW5lcmljX2hhbmRsZV9pcnEoZWktPmlycV9zdGFydCArIGlycXBpbik7Ci0JfQotfQotCi1pbnQgaHRjX2VncGlvX2dldF93YWtldXBfaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZWdwaW9faW5mbyAqZWkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCS8qIFJlYWQgY3VycmVudCBwaW5zLiAqLwotCXUxNiByZWFkdmFsID0gZWdwaW9fcmVhZHcoZWksIGVpLT5hY2tfcmVnaXN0ZXIpOwotCS8qIEFjay91bm1hc2sgaW50ZXJydXB0cy4gKi8KLQlhY2tfaXJxcyhlaSk7Ci0JLyogUmV0dXJuIGZpcnN0IHNldCBwaW4uICovCi0JcmVhZHZhbCAmPSBlaS0+aXJxc19lbmFibGVkOwotCXJldHVybiBlaS0+aXJxX3N0YXJ0ICsgZmZzKHJlYWR2YWwpIC0gMTsKLX0KLUVYUE9SVF9TWU1CT0woaHRjX2VncGlvX2dldF93YWtldXBfaXJxKTsKLQotc3RhdGljIGlubGluZSBpbnQgZWdwaW9fcG9zKHN0cnVjdCBlZ3Bpb19pbmZvICplaSwgaW50IGJpdCkKLXsKLQlyZXR1cm4gYml0ID4+IGVpLT5yZWdfc2hpZnQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGVncGlvX2JpdChzdHJ1Y3QgZWdwaW9faW5mbyAqZWksIGludCBiaXQpCi17Ci0JcmV0dXJuIDEgPDwgKGJpdCAmICgoMSA8PCBlaS0+cmVnX3NoaWZ0KS0xKSk7Ci19Ci0KLS8qCi0gKiBJbnB1dCBwaW5zCi0gKi8KLQotc3RhdGljIGludCBlZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXN0cnVjdCBlZ3Bpb19jaGlwICplZ3BpbzsKLQlzdHJ1Y3QgZWdwaW9faW5mbyAqZWk7Ci0JdW5zaWduZWQgICAgICAgICAgIGJpdDsKLQlpbnQgICAgICAgICAgICAgICAgcmVnOwotCWludCAgICAgICAgICAgICAgICB2YWx1ZTsKLQotCXByX2RlYnVnKCJlZ3Bpb19nZXRfdmFsdWUoJWQpXG4iLCBjaGlwLT5iYXNlICsgb2Zmc2V0KTsKLQotCWVncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7Ci0JZWkgICAgPSBkZXZfZ2V0X2RydmRhdGEoZWdwaW8tPmRldik7Ci0JYml0ICAgPSBlZ3Bpb19iaXQoZWksIG9mZnNldCk7Ci0JcmVnICAgPSBlZ3Bpby0+cmVnX3N0YXJ0ICsgZWdwaW9fcG9zKGVpLCBvZmZzZXQpOwotCi0JdmFsdWUgPSBlZ3Bpb19yZWFkdyhlaSwgcmVnKTsKLQlwcl9kZWJ1ZygicmVhZHcoJXAgKyAleCkgPSAleFxuIiwKLQkJCWVpLT5iYXNlX2FkZHIsIHJlZyA8PCBlaS0+YnVzX3NoaWZ0LCB2YWx1ZSk7Ci0JcmV0dXJuICEhKHZhbHVlICYgYml0KTsKLX0KLQotc3RhdGljIGludCBlZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXN0cnVjdCBlZ3Bpb19jaGlwICplZ3BpbzsKLQotCWVncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7Ci0JcmV0dXJuIHRlc3RfYml0KG9mZnNldCwgJmVncGlvLT5pc19vdXQpID8gLUVJTlZBTCA6IDA7Ci19Ci0KLQotLyoKLSAqIE91dHB1dCBwaW5zCi0gKi8KLQotc3RhdGljIHZvaWQgZWdwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQotewotCXVuc2lnbmVkIGxvbmcgICAgIGZsYWc7Ci0Jc3RydWN0IGVncGlvX2NoaXAgKmVncGlvOwotCXN0cnVjdCBlZ3Bpb19pbmZvICplaTsKLQl1bnNpZ25lZCAgICAgICAgICBiaXQ7Ci0JaW50ICAgICAgICAgICAgICAgcG9zOwotCWludCAgICAgICAgICAgICAgIHJlZzsKLQlpbnQgICAgICAgICAgICAgICBzaGlmdDsKLQotCXByX2RlYnVnKCJlZ3Bpb19zZXQoJXMsICVkKCVkKSwgJWQpXG4iLAotCQkJY2hpcC0+bGFiZWwsIG9mZnNldCwgb2Zmc2V0K2NoaXAtPmJhc2UsIHZhbHVlKTsKLQotCWVncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7Ci0JZWkgICAgPSBkZXZfZ2V0X2RydmRhdGEoZWdwaW8tPmRldik7Ci0JYml0ICAgPSBlZ3Bpb19iaXQoZWksIG9mZnNldCk7Ci0JcG9zICAgPSBlZ3Bpb19wb3MoZWksIG9mZnNldCk7Ci0JcmVnICAgPSBlZ3Bpby0+cmVnX3N0YXJ0ICsgcG9zOwotCXNoaWZ0ID0gcG9zIDw8IGVpLT5yZWdfc2hpZnQ7Ci0KLQlwcl9kZWJ1ZygiZWdwaW8gJXM6IHJlZyAlZCA9IDB4JTA0eFxuIiwgdmFsdWUgPyAic2V0IiA6ICJjbGVhciIsCi0JCQlyZWcsIChlZ3Bpby0+Y2FjaGVkX3ZhbHVlcyA+PiBzaGlmdCkgJiBlaS0+cmVnX21hc2spOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmVpLT5sb2NrLCBmbGFnKTsKLQlpZiAodmFsdWUpCi0JCWVncGlvLT5jYWNoZWRfdmFsdWVzIHw9ICgxIDw8IG9mZnNldCk7Ci0JZWxzZQotCQllZ3Bpby0+Y2FjaGVkX3ZhbHVlcyAmPSB+KDEgPDwgb2Zmc2V0KTsKLQllZ3Bpb193cml0ZXcoKGVncGlvLT5jYWNoZWRfdmFsdWVzID4+IHNoaWZ0KSAmIGVpLT5yZWdfbWFzaywgZWksIHJlZyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWktPmxvY2ssIGZsYWcpOwotfQotCi1zdGF0aWMgaW50IGVncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKLQkJCQkJdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCi17Ci0Jc3RydWN0IGVncGlvX2NoaXAgKmVncGlvOwotCi0JZWdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKLQlpZiAodGVzdF9iaXQob2Zmc2V0LCAmZWdwaW8tPmlzX291dCkpIHsKLQkJZWdwaW9fc2V0KGNoaXAsIG9mZnNldCwgdmFsdWUpOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGVncGlvX3dyaXRlX2NhY2hlKHN0cnVjdCBlZ3Bpb19pbmZvICplaSkKLXsKLQlpbnQgICAgICAgICAgICAgICBpOwotCXN0cnVjdCBlZ3Bpb19jaGlwICplZ3BpbzsKLQlpbnQgICAgICAgICAgICAgICBzaGlmdDsKLQotCWZvciAoaSA9IDA7IGkgPCBlaS0+bmNoaXBzOyBpKyspIHsKLQkJZWdwaW8gPSAmKGVpLT5jaGlwW2ldKTsKLQkJaWYgKCFlZ3Bpby0+aXNfb3V0KQotCQkJY29udGludWU7Ci0KLQkJZm9yIChzaGlmdCA9IDA7IHNoaWZ0IDwgZWdwaW8tPmNoaXAubmdwaW87Ci0JCQkJc2hpZnQgKz0gKDE8PGVpLT5yZWdfc2hpZnQpKSB7Ci0KLQkJCWludCByZWcgPSBlZ3Bpby0+cmVnX3N0YXJ0ICsgZWdwaW9fcG9zKGVpLCBzaGlmdCk7Ci0KLQkJCWlmICghKChlZ3Bpby0+aXNfb3V0ID4+IHNoaWZ0KSAmIGVpLT5yZWdfbWFzaykpCi0JCQkJY29udGludWU7Ci0KLQkJCXByX2RlYnVnKCJFR1BJTzogc2V0dGluZyAleCB0byAleCwgd2FzICV4XG4iLCByZWcsCi0JCQkJKGVncGlvLT5jYWNoZWRfdmFsdWVzID4+IHNoaWZ0KSAmIGVpLT5yZWdfbWFzaywKLQkJCQllZ3Bpb19yZWFkdyhlaSwgcmVnKSk7Ci0KLQkJCWVncGlvX3dyaXRldygoZWdwaW8tPmNhY2hlZF92YWx1ZXMgPj4gc2hpZnQpCi0JCQkJCSYgZWktPnJlZ19tYXNrLCBlaSwgcmVnKTsKLQkJfQotCX0KLX0KLQotCi0vKgotICogU2V0dXAKLSAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBlZ3Bpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBodGNfZWdwaW9fcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwotCXN0cnVjdCByZXNvdXJjZSAgICpyZXM7Ci0Jc3RydWN0IGVncGlvX2luZm8gKmVpOwotCXN0cnVjdCBncGlvX2NoaXAgICpjaGlwOwotCXVuc2lnbmVkIGludCAgICAgIGlycSwgaXJxX2VuZDsKLQlpbnQgICAgICAgICAgICAgICBpOwotCWludCAgICAgICAgICAgICAgIHJldDsKLQotCS8qIEluaXRpYWxpemUgZWkgZGF0YSBzdHJ1Y3R1cmUuICovCi0JZWkgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCplaSksIEdGUF9LRVJORUwpOwotCWlmICghZWkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc3Bpbl9sb2NrX2luaXQoJmVpLT5sb2NrKTsKLQotCS8qIEZpbmQgY2hhaW5lZCBpcnEgKi8KLQlyZXQgPSAtRUlOVkFMOwotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lSUSwgMCk7Ci0JaWYgKHJlcykKLQkJZWktPmNoYWluZWRfaXJxID0gcmVzLT5zdGFydDsKLQotCS8qIE1hcCBlZ3BpbyBjaGlwIGludG8gdmlydHVhbCBhZGRyZXNzIHNwYWNlLiAqLwotCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKCFyZXMpCi0JCWdvdG8gZmFpbDsKLQllaS0+YmFzZV9hZGRyID0gZGV2bV9pb3JlbWFwX25vY2FjaGUoJnBkZXYtPmRldiwgcmVzLT5zdGFydCwKLQkJCQkJICAgICByZXNvdXJjZV9zaXplKHJlcykpOwotCWlmICghZWktPmJhc2VfYWRkcikKLQkJZ290byBmYWlsOwotCXByX2RlYnVnKCJFR1BJTyBwaHlzPSUwOHggdmlydD0lcFxuIiwgKHUzMilyZXMtPnN0YXJ0LCBlaS0+YmFzZV9hZGRyKTsKLQotCWlmICgocGRhdGEtPmJ1c193aWR0aCAhPSAxNikgJiYgKHBkYXRhLT5idXNfd2lkdGggIT0gMzIpKQotCQlnb3RvIGZhaWw7Ci0JZWktPmJ1c19zaGlmdCA9IGZscyhwZGF0YS0+YnVzX3dpZHRoIC0gMSkgLSAzOwotCXByX2RlYnVnKCJidXNfc2hpZnQgPSAlZFxuIiwgZWktPmJ1c19zaGlmdCk7Ci0KLQlpZiAoKHBkYXRhLT5yZWdfd2lkdGggIT0gOCkgJiYgKHBkYXRhLT5yZWdfd2lkdGggIT0gMTYpKQotCQlnb3RvIGZhaWw7Ci0JZWktPnJlZ19zaGlmdCA9IGZscyhwZGF0YS0+cmVnX3dpZHRoIC0gMSk7Ci0JcHJfZGVidWcoInJlZ19zaGlmdCA9ICVkXG4iLCBlaS0+cmVnX3NoaWZ0KTsKLQotCWVpLT5yZWdfbWFzayA9ICgxIDw8IHBkYXRhLT5yZWdfd2lkdGgpIC0gMTsKLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGVpKTsKLQotCWVpLT5uY2hpcHMgPSBwZGF0YS0+bnVtX2NoaXBzOwotCWVpLT5jaGlwID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCi0JCQkJc2l6ZW9mKHN0cnVjdCBlZ3Bpb19jaGlwKSAqIGVpLT5uY2hpcHMsCi0JCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFlaS0+Y2hpcCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWw7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBlaS0+bmNoaXBzOyBpKyspIHsKLQkJZWktPmNoaXBbaV0ucmVnX3N0YXJ0ID0gcGRhdGEtPmNoaXBbaV0ucmVnX3N0YXJ0OwotCQllaS0+Y2hpcFtpXS5jYWNoZWRfdmFsdWVzID0gcGRhdGEtPmNoaXBbaV0uaW5pdGlhbF92YWx1ZXM7Ci0JCWVpLT5jaGlwW2ldLmlzX291dCA9IHBkYXRhLT5jaGlwW2ldLmRpcmVjdGlvbjsKLQkJZWktPmNoaXBbaV0uZGV2ID0gJihwZGV2LT5kZXYpOwotCQljaGlwID0gJihlaS0+Y2hpcFtpXS5jaGlwKTsKLQkJY2hpcC0+bGFiZWwgICAgICAgICAgID0gImh0Yy1lZ3BpbyI7Ci0JCWNoaXAtPnBhcmVudCAgICAgICAgICA9ICZwZGV2LT5kZXY7Ci0JCWNoaXAtPm93bmVyICAgICAgICAgICA9IFRISVNfTU9EVUxFOwotCQljaGlwLT5nZXQgICAgICAgICAgICAgPSBlZ3Bpb19nZXQ7Ci0JCWNoaXAtPnNldCAgICAgICAgICAgICA9IGVncGlvX3NldDsKLQkJY2hpcC0+ZGlyZWN0aW9uX2lucHV0ID0gZWdwaW9fZGlyZWN0aW9uX2lucHV0OwotCQljaGlwLT5kaXJlY3Rpb25fb3V0cHV0ID0gZWdwaW9fZGlyZWN0aW9uX291dHB1dDsKLQkJY2hpcC0+YmFzZSAgICAgICAgICAgID0gcGRhdGEtPmNoaXBbaV0uZ3Bpb19iYXNlOwotCQljaGlwLT5uZ3BpbyAgICAgICAgICAgPSBwZGF0YS0+Y2hpcFtpXS5udW1fZ3Bpb3M7Ci0KLQkJZ3Bpb2NoaXBfYWRkX2RhdGEoY2hpcCwgJmVpLT5jaGlwW2ldKTsKLQl9Ci0KLQkvKiBTZXQgaW5pdGlhbCBwaW4gdmFsdWVzICovCi0JZWdwaW9fd3JpdGVfY2FjaGUoZWkpOwotCi0JZWktPmlycV9zdGFydCA9IHBkYXRhLT5pcnFfYmFzZTsKLQllaS0+bmlycXMgPSBwZGF0YS0+bnVtX2lycXM7Ci0JZWktPmFja19yZWdpc3RlciA9IHBkYXRhLT5hY2tfcmVnaXN0ZXI7Ci0KLQlpZiAoZWktPmNoYWluZWRfaXJxKSB7Ci0JCS8qIFNldHVwIGlycSBoYW5kbGVycyAqLwotCQllaS0+YWNrX3dyaXRlID0gMHhGRkZGOwotCQlpZiAocGRhdGEtPmludmVydF9hY2tzKQotCQkJZWktPmFja193cml0ZSA9IDA7Ci0JCWlycV9lbmQgPSBlaS0+aXJxX3N0YXJ0ICsgZWktPm5pcnFzOwotCQlmb3IgKGlycSA9IGVpLT5pcnFfc3RhcnQ7IGlycSA8IGlycV9lbmQ7IGlycSsrKSB7Ci0JCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmZWdwaW9fbXV4ZWRfY2hpcCwKLQkJCQkJCSBoYW5kbGVfc2ltcGxlX2lycSk7Ci0JCQlpcnFfc2V0X2NoaXBfZGF0YShpcnEsIGVpKTsKLQkJCWlycV9jbGVhcl9zdGF0dXNfZmxhZ3MoaXJxLCBJUlFfTk9SRVFVRVNUIHwgSVJRX05PUFJPQkUpOwotCQl9Ci0JCWlycV9zZXRfaXJxX3R5cGUoZWktPmNoYWluZWRfaXJxLCBJUlFfVFlQRV9FREdFX1JJU0lORyk7Ci0JCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyX2FuZF9kYXRhKGVpLT5jaGFpbmVkX2lycSwKLQkJCQkJCSBlZ3Bpb19oYW5kbGVyLCBlaSk7Ci0JCWFja19pcnFzKGVpKTsKLQotCQlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWZhaWw6Ci0JcHJpbnRrKEtFUk5fRVJSICJFR1BJTyBmYWlsZWQgdG8gc2V0dXBcbiIpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgX19leGl0IGVncGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBlZ3Bpb19pbmZvICplaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXVuc2lnbmVkIGludCAgICAgIGlycSwgaXJxX2VuZDsKLQotCWlmIChlaS0+Y2hhaW5lZF9pcnEpIHsKLQkJaXJxX2VuZCA9IGVpLT5pcnFfc3RhcnQgKyBlaS0+bmlycXM7Ci0JCWZvciAoaXJxID0gZWktPmlycV9zdGFydDsgaXJxIDwgaXJxX2VuZDsgaXJxKyspIHsKLQkJCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpcnEsIE5VTEwsIE5VTEwpOwotCQkJaXJxX3NldF9zdGF0dXNfZmxhZ3MoaXJxLCBJUlFfTk9SRVFVRVNUIHwgSVJRX05PUFJPQkUpOwotCQl9Ci0JCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKGVpLT5jaGFpbmVkX2lycSwgTlVMTCk7Ci0JCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAwKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBlZ3Bpb19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlzdHJ1Y3QgZWdwaW9faW5mbyAqZWkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWlmIChlaS0+Y2hhaW5lZF9pcnEgJiYgZGV2aWNlX21heV93YWtldXAoJnBkZXYtPmRldikpCi0JCWVuYWJsZV9pcnFfd2FrZShlaS0+Y2hhaW5lZF9pcnEpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGVncGlvX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBlZ3Bpb19pbmZvICplaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JaWYgKGVpLT5jaGFpbmVkX2lycSAmJiBkZXZpY2VfbWF5X3dha2V1cCgmcGRldi0+ZGV2KSkKLQkJZGlzYWJsZV9pcnFfd2FrZShlaS0+Y2hhaW5lZF9pcnEpOwotCi0JLyogVXBkYXRlIHJlZ2lzdGVycyBmcm9tIHRoZSBjYWNoZSwgaW4gY2FzZQotCSAgIHRoZSBDUExEIHdhcyBwb3dlcmVkIG9mZiBkdXJpbmcgc3VzcGVuZCAqLwotCWVncGlvX3dyaXRlX2NhY2hlKGVpKTsKLQlyZXR1cm4gMDsKLX0KLSNlbHNlCi0jZGVmaW5lIGVncGlvX3N1c3BlbmQgTlVMTAotI2RlZmluZSBlZ3Bpb19yZXN1bWUgTlVMTAotI2VuZGlmCi0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZWdwaW9fZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImh0Yy1lZ3BpbyIsCi0JfSwKLQkucmVtb3ZlICAgICAgID0gX19leGl0X3AoZWdwaW9fcmVtb3ZlKSwKLQkuc3VzcGVuZCAgICAgID0gZWdwaW9fc3VzcGVuZCwKLQkucmVzdW1lICAgICAgID0gZWdwaW9fcmVzdW1lLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgZWdwaW9faW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmVncGlvX2RyaXZlciwgZWdwaW9fcHJvYmUpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZWdwaW9fZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZlZ3Bpb19kcml2ZXIpOwotfQotCi0vKiBzdGFydCBlYXJseSBmb3IgZGVwZW5kZW5jaWVzICovCi1zdWJzeXNfaW5pdGNhbGwoZWdwaW9faW5pdCk7Ci1tb2R1bGVfZXhpdChlZ3Bpb19leGl0KQotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJLZXZpbiBPJ0Nvbm5vciA8a2V2aW5Aa29jb25ub3IubmV0PiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvbHBjX2ljaC5jIGIvZHJpdmVycy9tZmQvbHBjX2ljaC5jCmluZGV4IGJkM2FhNDUuLmM4ZGVlNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2xwY19pY2guYworKysgYi9kcml2ZXJzL21mZC9scGNfaWNoLmMKQEAgLTk4NCw2ICs5ODQsMTAgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCisJLyogSWYgd2UgaGF2ZSBBQ1BJIGJhc2VkIHdhdGNoZG9nIHVzZSB0aGF0IGluc3RlYWQgKi8KKwlpZiAoYWNwaV9oYXNfd2F0Y2hkb2coKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAkvKiBTZXR1cCBwb3dlciBtYW5hZ2VtZW50IGJhc2UgcmVnaXN0ZXIgKi8KIAlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBwcml2LT5hYmFzZSwgJmJhc2VfYWRkcl9jZmcpOwogCWJhc2VfYWRkciA9IGJhc2VfYWRkcl9jZmcgJiAweDAwMDBmZjgwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdHBzNjUyMTguYyBiL2RyaXZlcnMvbWZkL3RwczY1MjE4LmMKaW5kZXggODBiOWRjMy4uYmE2MTBhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdHBzNjUyMTguYworKysgYi9kcml2ZXJzL21mZC90cHM2NTIxOC5jCkBAIC0yMTksNiArMjE5LDcgQEAKIAlzdHJ1Y3QgdHBzNjUyMTggKnRwczsKIAljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKIAlpbnQgcmV0OworCXVuc2lnbmVkIGludCBjaGlwaWQ7CiAKIAltYXRjaCA9IG9mX21hdGNoX2RldmljZShvZl90cHM2NTIxOF9tYXRjaF90YWJsZSwgJmNsaWVudC0+ZGV2KTsKIAlpZiAoIW1hdGNoKSB7CkBAIC0yNTAsNiArMjUxLDE0IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKKwlyZXQgPSB0cHM2NTIxOF9yZWdfcmVhZCh0cHMsIFRQUzY1MjE4X1JFR19DSElQSUQsICZjaGlwaWQpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycih0cHMtPmRldiwgIkZhaWxlZCB0byByZWFkIGNoaXBpZDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJdHBzLT5yZXYgPSBjaGlwaWQgJiBUUFM2NTIxOF9DSElQSURfUkVWX01BU0s7CisKIAlyZXQgPSBvZl9wbGF0Zm9ybV9wb3B1bGF0ZShjbGllbnQtPmRldi5vZl9ub2RlLCBOVUxMLCBOVUxMLAogCQkJCSAgICZjbGllbnQtPmRldik7CiAJaWYgKHJldCA8IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvS2NvbmZpZyBiL2RyaXZlcnMvbWlzYy9LY29uZmlnCmluZGV4IGEyMTZiNDYuLjY0OTcxYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWlzYy9LY29uZmlnCkBAIC0zNDUsMTYgKzM0NSw2IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCB0c2wyNTUwLgogCi1jb25maWcgU0VOU09SU19CSDE3ODAKLQl0cmlzdGF0ZSAiUk9ITSBCSDE3ODBHTEkgYW1iaWVudCBsaWdodCBzZW5zb3IiCi0JZGVwZW5kcyBvbiBJMkMgJiYgU1lTRlMKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFJPSE0gQkgxNzgwR0xJCi0JICBhbWJpZW50IGxpZ2h0IHNlbnNvci4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgYmgxNzgwZ2xpLgotCiBjb25maWcgU0VOU09SU19CSDE3NzAKICAgICAgICAgIHRyaXN0YXRlICJCSDE3NzBHTEMgLyBTRkg3NzcwIGNvbWJpbmVkIEFMUyAtIFByb3hpbWl0eSBzZW5zb3IiCiAgICAgICAgICBkZXBlbmRzIG9uIEkyQwpAQCAtNDM5LDM0ICs0MjksNiBAQAogCSAgbGluZSBhbmQgdGhlIExpbnV4IHZlcnNpb24gb24gdGhlIHNlY29uZCBsaW5lLCBidXQgdGhhdCdzCiAJICBzdGlsbCB1c2VmdWwuCiAKLWNvbmZpZyBCTVAwODUKLQl0cmlzdGF0ZQotCWRlcGVuZHMgb24gU1lTRlMKLQotY29uZmlnIEJNUDA4NV9JMkMKLQl0cmlzdGF0ZSAiQk1QMDg1IGRpZ2l0YWwgcHJlc3N1cmUgc2Vuc29yIG9uIEkyQyIKLQlzZWxlY3QgQk1QMDg1Ci0Jc2VsZWN0IFJFR01BUF9JMkMKLQlkZXBlbmRzIG9uIEkyQyAmJiBTWVNGUwotCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gc3VwcG9ydCBCb3NjaCBTZW5zb3J0ZWMncyBkaWdpdGFsIHByZXNzdXJlCi0JICBzZW5zb3IgaG9va2VkIHRvIGFuIEkyQyBidXMuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGJtcDA4NS1pMmMuCi0KLWNvbmZpZyBCTVAwODVfU1BJCi0JdHJpc3RhdGUgIkJNUDA4NSBkaWdpdGFsIHByZXNzdXJlIHNlbnNvciBvbiBTUEkiCi0Jc2VsZWN0IEJNUDA4NQotCXNlbGVjdCBSRUdNQVBfU1BJCi0JZGVwZW5kcyBvbiBTUElfTUFTVEVSICYmIFNZU0ZTCi0JaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBzdXBwb3J0IEJvc2NoIFNlbnNvcnRlYydzIGRpZ2l0YWwgcHJlc3N1cmUKLQkgIHNlbnNvciBob29rZWQgdG8gYW4gU1BJIGJ1cy4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYm1wMDg1LXNwaS4KLQogY29uZmlnIFBDSF9QSFVCCiAJdHJpc3RhdGUgIkludGVsIEVHMjBUIFBDSC9MQVBJUyBTZW1pY29uIElPSChNTDcyMTMvTUw3MjIzL01MNzgzMSkgUEhVQiIKIAlzZWxlY3QgR0VORVJJQ19ORVRfVVRJTFMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9NYWtlZmlsZSBiL2RyaXZlcnMvbWlzYy9NYWtlZmlsZQppbmRleCA3NDEwYzZkLi4zMTk4MzM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9taXNjL01ha2VmaWxlCkBAIC05LDkgKzksNiBAQAogb2JqLSQoQ09ORklHX0lOVEVMX01JRF9QVEkpCSs9IHB0aS5vCiBvYmotJChDT05GSUdfQVRNRUxfU1NDKQkJKz0gYXRtZWwtc3NjLm8KIG9iai0kKENPTkZJR19BVE1FTF9UQ0xJQikJKz0gYXRtZWxfdGNsaWIubwotb2JqLSQoQ09ORklHX0JNUDA4NSkJCSs9IGJtcDA4NS5vCi1vYmotJChDT05GSUdfQk1QMDg1X0kyQykJKz0gYm1wMDg1LWkyYy5vCi1vYmotJChDT05GSUdfQk1QMDg1X1NQSSkJKz0gYm1wMDg1LXNwaS5vCiBvYmotJChDT05GSUdfRFVNTVlfSVJRKQkJKz0gZHVtbXktaXJxLm8KIG9iai0kKENPTkZJR19JQ1M5MzJTNDAxKQkrPSBpY3M5MzJzNDAxLm8KIG9iai0kKENPTkZJR19MS0RUTSkJCSs9IGxrZHRtLm8KQEAgLTE5LDcgKzE2LDYgQEAKIG9iai0kKENPTkZJR19USUZNXzdYWDEpICAgICAgIAkrPSB0aWZtXzd4eDEubwogb2JqLSQoQ09ORklHX1BIQU5UT00pCQkrPSBwaGFudG9tLm8KIG9iai0kKENPTkZJR19RQ09NX0NPSU5DRUxMKQkrPSBxY29tLWNvaW5jZWxsLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0JIMTc4MCkJKz0gYmgxNzgwZ2xpLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0JIMTc3MCkJKz0gYmgxNzcwZ2xjLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0FQRFM5OTBYKQkrPSBhcGRzOTkweC5vCiBvYmotJChDT05GSUdfU0dJX0lPQzQpCQkrPSBpb2M0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9iaDE3ODBnbGkuYyBiL2RyaXZlcnMvbWlzYy9iaDE3ODBnbGkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y5MGNlNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21pc2MvYmgxNzgwZ2xpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoKLSAqIGJoMTc4MGdsaS5jCi0gKiBST0hNIEFtYmllbnQgTGlnaHQgU2Vuc29yIERyaXZlcgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUZXhhcyBJbnN0cnVtZW50cwotICogQXV0aG9yOiBIZW1hbnRoIFYgPGhlbWFudGh2QHRpLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotICovCi0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotCi0jZGVmaW5lIEJIMTc4MF9SRUdfQ09OVFJPTAkweDgwCi0jZGVmaW5lIEJIMTc4MF9SRUdfUEFSVElECTB4OEEKLSNkZWZpbmUgQkgxNzgwX1JFR19NQU5GSUQJMHg4QgotI2RlZmluZSBCSDE3ODBfUkVHX0RMT1cJMHg4QwotI2RlZmluZSBCSDE3ODBfUkVHX0RISUdICTB4OEQKLQotI2RlZmluZSBCSDE3ODBfUkVWTUFTSwkJKDB4ZikKLSNkZWZpbmUgQkgxNzgwX1BPV01BU0sJCSgweDMpCi0jZGVmaW5lIEJIMTc4MF9QT0ZGCQkoMHgwKQotI2RlZmluZSBCSDE3ODBfUE9OCQkoMHgzKQotCi0vKiBwb3dlciBvbiBzZXR0bGluZyB0aW1lIGluIG1zICovCi0jZGVmaW5lIEJIMTc4MF9QT05fREVMQVkJMgotCi1zdHJ1Y3QgYmgxNzgwX2RhdGEgewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7Ci0JaW50IHBvd2VyX3N0YXRlOwotCS8qIGxvY2sgZm9yIHN5c2ZzIG9wZXJhdGlvbnMgKi8KLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLX07Ci0KLXN0YXRpYyBpbnQgYmgxNzgwX3dyaXRlKHN0cnVjdCBiaDE3ODBfZGF0YSAqZGRhdGEsIHU4IHJlZywgdTggdmFsLCBjaGFyICptc2cpCi17Ci0JaW50IHJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGRhdGEtPmNsaWVudCwgcmVnLCB2YWwpOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKCZkZGF0YS0+Y2xpZW50LT5kZXYsCi0JCQkiaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YSBmYWlsZWQgZXJyb3IgJWQgUmVnaXN0ZXIgKCVzKVxuIiwKLQkJCXJldCwgbXNnKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGJoMTc4MF9yZWFkKHN0cnVjdCBiaDE3ODBfZGF0YSAqZGRhdGEsIHU4IHJlZywgY2hhciAqbXNnKQotewotCWludCByZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZGRhdGEtPmNsaWVudCwgcmVnKTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X2VycigmZGRhdGEtPmNsaWVudC0+ZGV2LAotCQkJImkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YSBmYWlsZWQgZXJyb3IgJWQgUmVnaXN0ZXIgKCVzKVxuIiwKLQkJCXJldCwgbXNnKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCBiaDE3ODBfc2hvd19sdXgoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwotCXN0cnVjdCBiaDE3ODBfZGF0YSAqZGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlpbnQgbHNiLCBtc2I7Ci0KLQlsc2IgPSBiaDE3ODBfcmVhZChkZGF0YSwgQkgxNzgwX1JFR19ETE9XLCAiRExPVyIpOwotCWlmIChsc2IgPCAwKQotCQlyZXR1cm4gbHNiOwotCi0JbXNiID0gYmgxNzgwX3JlYWQoZGRhdGEsIEJIMTc4MF9SRUdfREhJR0gsICJESElHSCIpOwotCWlmIChtc2IgPCAwKQotCQlyZXR1cm4gbXNiOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIChtc2IgPDwgOCkgfCBsc2IpOwotfQotCi1zdGF0aWMgc3NpemVfdCBiaDE3ODBfc2hvd19wb3dlcl9zdGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCQljaGFyICpidWYpCi17Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwotCXN0cnVjdCBiaDE3ODBfZGF0YSAqZGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlpbnQgc3RhdGU7Ci0KLQlzdGF0ZSA9IGJoMTc4MF9yZWFkKGRkYXRhLCBCSDE3ODBfUkVHX0NPTlRST0wsICJDT05UUk9MIik7Ci0JaWYgKHN0YXRlIDwgMCkKLQkJcmV0dXJuIHN0YXRlOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHN0YXRlICYgQkgxNzgwX1BPV01BU0spOwotfQotCi1zdGF0aWMgc3NpemVfdCBiaDE3ODBfc3RvcmVfcG93ZXJfc3RhdGUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwotCXN0cnVjdCBiaDE3ODBfZGF0YSAqZGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgZXJyb3I7Ci0KLQllcnJvciA9IGtzdHJ0b3VsKGJ1ZiwgMCwgJnZhbCk7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7Ci0KLQlpZiAodmFsIDwgQkgxNzgwX1BPRkYgfHwgdmFsID4gQkgxNzgwX1BPTikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKCZkZGF0YS0+bG9jayk7Ci0KLQllcnJvciA9IGJoMTc4MF93cml0ZShkZGF0YSwgQkgxNzgwX1JFR19DT05UUk9MLCB2YWwsICJDT05UUk9MIik7Ci0JaWYgKGVycm9yIDwgMCkgewotCQltdXRleF91bmxvY2soJmRkYXRhLT5sb2NrKTsKLQkJcmV0dXJuIGVycm9yOwotCX0KLQotCW1zbGVlcChCSDE3ODBfUE9OX0RFTEFZKTsKLQlkZGF0YS0+cG93ZXJfc3RhdGUgPSB2YWw7Ci0JbXV0ZXhfdW5sb2NrKCZkZGF0YS0+bG9jayk7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihsdXgsIFNfSVJVR08sIGJoMTc4MF9zaG93X2x1eCwgTlVMTCk7Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihwb3dlcl9zdGF0ZSwgU19JV1VTUiB8IFNfSVJVR08sCi0JCWJoMTc4MF9zaG93X3Bvd2VyX3N0YXRlLCBiaDE3ODBfc3RvcmVfcG93ZXJfc3RhdGUpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYmgxNzgwX2F0dHJpYnV0ZXNbXSA9IHsKLQkmZGV2X2F0dHJfcG93ZXJfc3RhdGUuYXR0ciwKLQkmZGV2X2F0dHJfbHV4LmF0dHIsCi0JTlVMTAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYmgxNzgwX2F0dHJfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gYmgxNzgwX2F0dHJpYnV0ZXMsCi19OwotCi1zdGF0aWMgaW50IGJoMTc4MF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCWludCByZXQ7Ci0Jc3RydWN0IGJoMTc4MF9kYXRhICpkZGF0YTsKLQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSB0b19pMmNfYWRhcHRlcihjbGllbnQtPmRldi5wYXJlbnQpOwotCi0JaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlkZGF0YSA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZihzdHJ1Y3QgYmgxNzgwX2RhdGEpLAotCQkJICAgICBHRlBfS0VSTkVMKTsKLQlpZiAoZGRhdGEgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlkZGF0YS0+Y2xpZW50ID0gY2xpZW50OwotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRkYXRhKTsKLQotCXJldCA9IGJoMTc4MF9yZWFkKGRkYXRhLCBCSDE3ODBfUkVHX1BBUlRJRCwgIlBBUlQgSUQiKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIkFtYmllbnQgTGlnaHQgU2Vuc29yLCBSZXYgOiAlZFxuIiwKLQkJCShyZXQgJiBCSDE3ODBfUkVWTUFTSykpOwotCi0JbXV0ZXhfaW5pdCgmZGRhdGEtPmxvY2spOwotCi0JcmV0dXJuIHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmJoMTc4MF9hdHRyX2dyb3VwKTsKLX0KLQotc3RhdGljIGludCBiaDE3ODBfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmYmgxNzgwX2F0dHJfZ3JvdXApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfUE1fU0xFRVAKLXN0YXRpYyBpbnQgYmgxNzgwX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBiaDE3ODBfZGF0YSAqZGRhdGE7Ci0JaW50IHN0YXRlLCByZXQ7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQotCWRkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0Jc3RhdGUgPSBiaDE3ODBfcmVhZChkZGF0YSwgQkgxNzgwX1JFR19DT05UUk9MLCAiQ09OVFJPTCIpOwotCWlmIChzdGF0ZSA8IDApCi0JCXJldHVybiBzdGF0ZTsKLQotCWRkYXRhLT5wb3dlcl9zdGF0ZSA9IHN0YXRlICYgQkgxNzgwX1BPV01BU0s7Ci0KLQlyZXQgPSBiaDE3ODBfd3JpdGUoZGRhdGEsIEJIMTc4MF9SRUdfQ09OVFJPTCwgQkgxNzgwX1BPRkYsCi0JCQkJIkNPTlRST0wiKTsKLQotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYmgxNzgwX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGJoMTc4MF9kYXRhICpkZGF0YTsKLQlpbnQgc3RhdGUsIHJldDsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCi0JZGRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlzdGF0ZSA9IGRkYXRhLT5wb3dlcl9zdGF0ZTsKLQlyZXQgPSBiaDE3ODBfd3JpdGUoZGRhdGEsIEJIMTc4MF9SRUdfQ09OVFJPTCwgc3RhdGUsCi0JCQkJIkNPTlRST0wiKTsKLQotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCi0KLXN0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhiaDE3ODBfcG0sIGJoMTc4MF9zdXNwZW5kLCBiaDE3ODBfcmVzdW1lKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGJoMTc4MF9pZFtdID0gewotCXsgImJoMTc4MCIsIDAgfSwKLQl7IH0sCi19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYmgxNzgwX2lkKTsKLQotI2lmZGVmIENPTkZJR19PRgotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfYmgxNzgwX21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJyb2htLGJoMTc4MGdsaSIsIH0sCi0Je30sCi19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBvZl9iaDE3ODBfbWF0Y2gpOwotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBiaDE3ODBfZHJpdmVyID0gewotCS5wcm9iZQkJPSBiaDE3ODBfcHJvYmUsCi0JLnJlbW92ZQkJPSBiaDE3ODBfcmVtb3ZlLAotCS5pZF90YWJsZQk9IGJoMTc4MF9pZCwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJiaDE3ODAiLAotCQkucG0JPSAmYmgxNzgwX3BtLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIob2ZfYmgxNzgwX21hdGNoKSwKLQl9LAotfTsKLQotbW9kdWxlX2kyY19kcml2ZXIoYmgxNzgwX2RyaXZlcik7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiQkgxNzgwR0xJIEFtYmllbnQgTGlnaHQgU2Vuc29yIERyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiSGVtYW50aCBWIDxoZW1hbnRodkB0aS5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvYm1wMDg1LWkyYy5jIGIvZHJpdmVycy9taXNjL2JtcDA4NS1pMmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM1YzIxOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21pc2MvYm1wMDg1LWkyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMiAgQm9zY2ggU2Vuc29ydGVjIEdtYkgKLSAqIENvcHlyaWdodCAoYykgMjAxMiAgVW5peHBoZXJlIEFCCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgImJtcDA4NS5oIgotCi0jZGVmaW5lIEJNUDA4NV9JMkNfQUREUkVTUwkweDc3Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IEJNUDA4NV9JMkNfQUREUkVTUywKLQkJCQkJCQlJMkNfQ0xJRU5UX0VORCB9OwotCi1zdGF0aWMgaW50IGJtcDA4NV9pMmNfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkgICAgIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKLXsKLQlpZiAoY2xpZW50LT5hZGRyICE9IEJNUDA4NV9JMkNfQUREUkVTUykKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlyZXR1cm4gYm1wMDg1X2RldGVjdCgmY2xpZW50LT5kZXYpOwotfQotCi1zdGF0aWMgaW50IGJtcDA4NV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCi17Ci0JaW50IGVycjsKLQlzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsCi0JCQkJCQkgICAgICZibXAwODVfcmVnbWFwX2NvbmZpZyk7Ci0KLQlpZiAoSVNfRVJSKHJlZ21hcCkpIHsKLQkJZXJyID0gUFRSX0VSUihyZWdtYXApOwotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byBpbml0IHJlZ21hcDogJWRcbiIsIGVycik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JcmV0dXJuIGJtcDA4NV9wcm9iZSgmY2xpZW50LT5kZXYsIHJlZ21hcCwgY2xpZW50LT5pcnEpOwotfQotCi1zdGF0aWMgaW50IGJtcDA4NV9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0JcmV0dXJuIGJtcDA4NV9yZW1vdmUoJmNsaWVudC0+ZGV2KTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGJtcDA4NV9pZFtdID0gewotCXsgQk1QMDg1X05BTUUsIDAgfSwKLQl7ICJibXAxODAiLCAwIH0sCi0JeyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGJtcDA4NV9pZCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBibXAwODVfaTJjX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZQk9IEJNUDA4NV9OQU1FLAotCX0sCi0JLmlkX3RhYmxlCT0gYm1wMDg1X2lkLAotCS5wcm9iZQkJPSBibXAwODVfaTJjX3Byb2JlLAotCS5yZW1vdmUJCT0gYm1wMDg1X2kyY19yZW1vdmUsCi0KLQkuZGV0ZWN0CQk9IGJtcDA4NV9pMmNfZGV0ZWN0LAotCS5hZGRyZXNzX2xpc3QJPSBub3JtYWxfaTJjCi19OwotCi1tb2R1bGVfaTJjX2RyaXZlcihibXAwODVfaTJjX2RyaXZlcik7Ci0KLU1PRFVMRV9BVVRIT1IoIkVyaWMgQW5kZXJzc29uIDxlcmljLmFuZGVyc3NvbkB1bml4cGhlcmUuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJCTVAwODUgSTJDIGJ1cyBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9ibXAwODUtc3BpLmMgYi9kcml2ZXJzL21pc2MvYm1wMDg1LXNwaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2VjYmY5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWlzYy9ibXAwODUtc3BpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEyICBCb3NjaCBTZW5zb3J0ZWMgR21iSAotICogQ29weXJpZ2h0IChjKSAyMDEyICBVbml4cGhlcmUgQUIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgImJtcDA4NS5oIgotCi1zdGF0aWMgaW50IGJtcDA4NV9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKmNsaWVudCkKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKLQotCWNsaWVudC0+Yml0c19wZXJfd29yZCA9IDg7Ci0JZXJyID0gc3BpX3NldHVwKGNsaWVudCk7Ci0JaWYgKGVyciA8IDApIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJzcGlfc2V0dXAgZmFpbGVkIVxuIik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JcmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9zcGkoY2xpZW50LCAmYm1wMDg1X3JlZ21hcF9jb25maWcpOwotCWlmIChJU19FUlIocmVnbWFwKSkgewotCQllcnIgPSBQVFJfRVJSKHJlZ21hcCk7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGluaXQgcmVnbWFwOiAlZFxuIiwgZXJyKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlyZXR1cm4gYm1wMDg1X3Byb2JlKCZjbGllbnQtPmRldiwgcmVnbWFwLCBjbGllbnQtPmlycSk7Ci19Ci0KLXN0YXRpYyBpbnQgYm1wMDg1X3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKmNsaWVudCkKLXsKLQlyZXR1cm4gYm1wMDg1X3JlbW92ZSgmY2xpZW50LT5kZXYpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBibXAwODVfb2ZfbWF0Y2hbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gImJvc2NoLGJtcDA4NSIsIH0sCi0JeyB9LAotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGJtcDA4NV9vZl9tYXRjaCk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCBibXAwODVfaWRbXSA9IHsKLQl7ICJibXAxODAiLCAwIH0sCi0JeyAiYm1wMTgxIiwgMCB9LAotCXsgfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUoc3BpLCBibXAwODVfaWQpOwotCi1zdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYm1wMDg1X3NwaV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUJPSBCTVAwODVfTkFNRSwKLQkJLm9mX21hdGNoX3RhYmxlID0gYm1wMDg1X29mX21hdGNoCi0JfSwKLQkuaWRfdGFibGUJPSBibXAwODVfaWQsCi0JLnByb2JlCQk9IGJtcDA4NV9zcGlfcHJvYmUsCi0JLnJlbW92ZQkJPSBibXAwODVfc3BpX3JlbW92ZQotfTsKLQotbW9kdWxlX3NwaV9kcml2ZXIoYm1wMDg1X3NwaV9kcml2ZXIpOwotCi1NT0RVTEVfQVVUSE9SKCJFcmljIEFuZGVyc3NvbiA8ZXJpYy5hbmRlcnNzb25AdW5peHBoZXJlLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQk1QMDg1IFNQSSBidXMgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvYm1wMDg1LmMgYi9kcml2ZXJzL21pc2MvYm1wMDg1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMzEzZjcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9taXNjL2JtcDA4NS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTA2ICswLDAgQEAKLS8qICBDb3B5cmlnaHQgKGMpIDIwMTAgIENocmlzdG9waCBNYWlyIDxjaHJpc3RvcGgubWFpckBnbWFpbC5jb20+Ci0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBCb3NjaCBTZW5zb3J0ZWMgR21iSAotICogIENvcHlyaWdodCAoYykgMjAxMiAgVW5peHBoZXJlIEFCCi0gKgotICogIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBibXAwODUgYW5kIGJtcDE4eCBkaWdpdGFsIGJhcm9tZXRyaWMgcHJlc3N1cmUKLSAqICBhbmQgdGVtcGVyYXR1cmUgc2Vuc29ycyBmcm9tIEJvc2NoIFNlbnNvcnRlYy4gVGhlIGRhdGFzaGVldHMKLSAqICBhcmUgYXZhaWxhYmxlIGZyb20gdGhlaXIgd2Vic2l0ZToKLSAqICBodHRwOi8vd3d3LmJvc2NoLXNlbnNvcnRlYy5jb20vY29udGVudC9sYW5ndWFnZTEvZG93bmxvYWRzL0JTVC1CTVAwODUtRFMwMDAtMDUucGRmCi0gKiAgaHR0cDovL3d3dy5ib3NjaC1zZW5zb3J0ZWMuY29tL2NvbnRlbnQvbGFuZ3VhZ2UxL2Rvd25sb2Fkcy9CU1QtQk1QMTgwLURTMDAwLTA3LnBkZgotICoKLSAqICBBIHByZXNzdXJlIG1lYXN1cmVtZW50IGlzIGlzc3VlZCBieSByZWFkaW5nIGZyb20gcHJlc3N1cmUwX2lucHV0LgotICogIFRoZSByZXR1cm4gdmFsdWUgcmFuZ2VzIGZyb20gMzAwMDAgdG8gMTEwMDAwIHBhc2NhbCB3aXRoIGEgcmVzdWx1dGlvbgotICogIG9mIDEgcGFzY2FsICgwLjAxIG1pbGxpYmFyKSB3aGljaCBlbmFibGVzIG1lYXN1cmVtZW50cyBmcm9tIDkwMDBtIGFib3ZlCi0gKiAgdG8gNTAwbSBiZWxvdyBzZWEgbGV2ZWwuCi0gKgotICogIFRoZSB0ZW1wZXJhdHVyZSBjYW4gYmUgcmVhZCBmcm9tIHRlbXAwX2lucHV0LiBWYWx1ZXMgcmFuZ2UgZnJvbQotICogIC00MDAgdG8gODUwIHJlcHJlc2VudGluZyB0aGUgYW1iaWVudCB0ZW1wZXJhdHVyZSBpbiBkZWdyZWUgY2Vsc2l1cwotICogIG11bHRpcGxpZWQgYnkgMTAuVGhlIHJlc29sdXRpb24gaXMgMC4xIGNlbHNpdXMuCi0gKgotICogIEJlY2F1c2UgYW1iaWVudCBwcmVzc3VyZSBpcyB0ZW1wZXJhdHVyZSBkZXBlbmRlbnQsIGEgdGVtcGVyYXR1cmUKLSAqICBtZWFzdXJlbWVudCB3aWxsIGJlIGV4ZWN1dGVkIGF1dG9tYXRpY2FsbHkgZXZlbiBpZiB0aGUgdXNlciBpcyByZWFkaW5nCi0gKiAgZnJvbSBwcmVzc3VyZTBfaW5wdXQuIFRoaXMgaGFwcGVucyBpZiB0aGUgbGFzdCB0ZW1wZXJhdHVyZSBtZWFzdXJlbWVudAotICogIGhhcyBiZWVuIGV4ZWN1dGVkIG1vcmUgdGhlbiBvbmUgc2Vjb25kIGFnby4KLSAqCi0gKiAgVG8gZGVjcmVhc2UgUk1TIG5vaXNlIGZyb20gcHJlc3N1cmUgbWVhc3VyZW1lbnRzLCB0aGUgYm1wMDg1IGNhbgotICogIGF1dG9ub21vdXNseSBjYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugb2YgdXAgdG8gZWlnaHQgc2FtcGxlcy4gVGhpcyBpcwotICogIHNldCB1cCBieSB3cml0aW5nIHRvIHRoZSBvdmVyc2FtcGxpbmcgc3lzZnMgZmlsZS4gQWNjZXB0ZWQgdmFsdWVzCi0gKiAgYXJlIDAsIDEsIDIgYW5kIDMuIDJeeCB3aGVuIHggaXMgdGhlIHZhbHVlIHdyaXR0ZW4gdG8gdGhpcyBmaWxlCi0gKiAgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgYW1iaWVudCBwcmVzc3VyZS4KLSAqICBSTVMgbm9pc2UgaXMgc3BlY2lmaWVkIHdpdGggc2l4IHBhc2NhbCAod2l0aG91dCBhdmVyYWdpbmcpIGFuZCBkZWNyZWFzZXMKLSAqICBkb3duIHRvIDMgcGFzY2FsIHdoZW4gdXNpbmcgYW4gb3ZlcnNhbXBsaW5nIHNldHRpbmcgb2YgMy4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRlICJibXAwODUuaCIKLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotCi0jZGVmaW5lIEJNUDA4NV9DSElQX0lECQkJMHg1NQotI2RlZmluZSBCTVAwODVfQ0FMSUJSQVRJT05fREFUQV9TVEFSVAkweEFBCi0jZGVmaW5lIEJNUDA4NV9DQUxJQlJBVElPTl9EQVRBX0xFTkdUSAkxMQkvKiAxNiBiaXQgdmFsdWVzICovCi0jZGVmaW5lIEJNUDA4NV9DSElQX0lEX1JFRwkJMHhEMAotI2RlZmluZSBCTVAwODVfQ1RSTF9SRUcJCQkweEY0Ci0jZGVmaW5lIEJNUDA4NV9URU1QX01FQVNVUkVNRU5UCQkweDJFCi0jZGVmaW5lIEJNUDA4NV9QUkVTU1VSRV9NRUFTVVJFTUVOVAkweDM0Ci0jZGVmaW5lIEJNUDA4NV9DT05WRVJTSU9OX1JFR0lTVEVSX01TQgkweEY2Ci0jZGVmaW5lIEJNUDA4NV9DT05WRVJTSU9OX1JFR0lTVEVSX0xTQgkweEY3Ci0jZGVmaW5lIEJNUDA4NV9DT05WRVJTSU9OX1JFR0lTVEVSX1hMU0IJMHhGOAotI2RlZmluZSBCTVAwODVfVEVNUF9DT05WRVJTSU9OX1RJTUUJNQotCi1zdHJ1Y3QgYm1wMDg1X2NhbGlicmF0aW9uX2RhdGEgewotCXMxNiBBQzEsIEFDMiwgQUMzOwotCXUxNiBBQzQsIEFDNSwgQUM2OwotCXMxNiBCMSwgQjI7Ci0JczE2IE1CLCBNQywgTUQ7Ci19OwotCi1zdHJ1Y3QgYm1wMDg1X2RhdGEgewotCXN0cnVjdAlkZXZpY2UgKmRldjsKLQlzdHJ1Y3QgIHJlZ21hcCAqcmVnbWFwOwotCXN0cnVjdAltdXRleCBsb2NrOwotCXN0cnVjdAlibXAwODVfY2FsaWJyYXRpb25fZGF0YSBjYWxpYnJhdGlvbjsKLQl1OAlvdmVyc2FtcGxpbmdfc2V0dGluZzsKLQl1MzIJcmF3X3RlbXBlcmF0dXJlOwotCXUzMglyYXdfcHJlc3N1cmU7Ci0JdTMyCXRlbXBfbWVhc3VyZW1lbnRfcGVyaW9kOwotCXVuc2lnbmVkIGxvbmcgbGFzdF90ZW1wX21lYXN1cmVtZW50OwotCXU4CWNoaXBfaWQ7Ci0JczMyCWI2OyAvKiBjYWxjdWxhdGVkIHRlbXBlcmF0dXJlIGNvcnJlY3Rpb24gY29lZmZpY2llbnQgKi8KLQlpbnQJaXJxOwotCXN0cnVjdAljb21wbGV0aW9uIGRvbmU7Ci19OwotCi1zdGF0aWMgaXJxcmV0dXJuX3QgYm1wMDg1X2VvY19pc3IoaW50IGlycSwgdm9pZCAqZGV2aWQpCi17Ci0Jc3RydWN0IGJtcDA4NV9kYXRhICpkYXRhID0gZGV2aWQ7Ci0KLQljb21wbGV0ZSgmZGF0YS0+ZG9uZSk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBzMzIgYm1wMDg1X3JlYWRfY2FsaWJyYXRpb25fZGF0YShzdHJ1Y3QgYm1wMDg1X2RhdGEgKmRhdGEpCi17Ci0JdTE2IHRtcFtCTVAwODVfQ0FMSUJSQVRJT05fREFUQV9MRU5HVEhdOwotCXN0cnVjdCBibXAwODVfY2FsaWJyYXRpb25fZGF0YSAqY2FsaSA9ICYoZGF0YS0+Y2FsaWJyYXRpb24pOwotCXMzMiBzdGF0dXMgPSByZWdtYXBfYnVsa19yZWFkKGRhdGEtPnJlZ21hcCwKLQkJCQlCTVAwODVfQ0FMSUJSQVRJT05fREFUQV9TVEFSVCwgKHU4ICopdG1wLAotCQkJCShCTVAwODVfQ0FMSUJSQVRJT05fREFUQV9MRU5HVEggPDwgMSkpOwotCWlmIChzdGF0dXMgPCAwKQotCQlyZXR1cm4gc3RhdHVzOwotCi0JY2FsaS0+QUMxID0gIGJlMTZfdG9fY3B1KHRtcFswXSk7Ci0JY2FsaS0+QUMyID0gIGJlMTZfdG9fY3B1KHRtcFsxXSk7Ci0JY2FsaS0+QUMzID0gIGJlMTZfdG9fY3B1KHRtcFsyXSk7Ci0JY2FsaS0+QUM0ID0gIGJlMTZfdG9fY3B1KHRtcFszXSk7Ci0JY2FsaS0+QUM1ID0gIGJlMTZfdG9fY3B1KHRtcFs0XSk7Ci0JY2FsaS0+QUM2ID0gYmUxNl90b19jcHUodG1wWzVdKTsKLQljYWxpLT5CMSA9IGJlMTZfdG9fY3B1KHRtcFs2XSk7Ci0JY2FsaS0+QjIgPSBiZTE2X3RvX2NwdSh0bXBbN10pOwotCWNhbGktPk1CID0gYmUxNl90b19jcHUodG1wWzhdKTsKLQljYWxpLT5NQyA9IGJlMTZfdG9fY3B1KHRtcFs5XSk7Ci0JY2FsaS0+TUQgPSBiZTE2X3RvX2NwdSh0bXBbMTBdKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHMzMiBibXAwODVfdXBkYXRlX3Jhd190ZW1wZXJhdHVyZShzdHJ1Y3QgYm1wMDg1X2RhdGEgKmRhdGEpCi17Ci0JdTE2IHRtcDsKLQlzMzIgc3RhdHVzOwotCi0JbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7Ci0KLQlpbml0X2NvbXBsZXRpb24oJmRhdGEtPmRvbmUpOwotCi0Jc3RhdHVzID0gcmVnbWFwX3dyaXRlKGRhdGEtPnJlZ21hcCwgQk1QMDg1X0NUUkxfUkVHLAotCQkJICAgICAgQk1QMDg1X1RFTVBfTUVBU1VSRU1FTlQpOwotCWlmIChzdGF0dXMgPCAwKSB7Ci0JCWRldl9lcnIoZGF0YS0+ZGV2LAotCQkJIkVycm9yIHdoaWxlIHJlcXVlc3RpbmcgdGVtcGVyYXR1cmUgbWVhc3VyZW1lbnQuXG4iKTsKLQkJZ290byBleGl0OwotCX0KLQl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmRhdGEtPmRvbmUsIDEgKyBtc2Vjc190b19qaWZmaWVzKAotCQkJCQkgICAgQk1QMDg1X1RFTVBfQ09OVkVSU0lPTl9USU1FKSk7Ci0KLQlzdGF0dXMgPSByZWdtYXBfYnVsa19yZWFkKGRhdGEtPnJlZ21hcCwgQk1QMDg1X0NPTlZFUlNJT05fUkVHSVNURVJfTVNCLAotCQkJCSAmdG1wLCBzaXplb2YodG1wKSk7Ci0JaWYgKHN0YXR1cyA8IDApIHsKLQkJZGV2X2VycihkYXRhLT5kZXYsCi0JCQkiRXJyb3Igd2hpbGUgcmVhZGluZyB0ZW1wZXJhdHVyZSBtZWFzdXJlbWVudCByZXN1bHRcbiIpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCWRhdGEtPnJhd190ZW1wZXJhdHVyZSA9IGJlMTZfdG9fY3B1KHRtcCk7Ci0JZGF0YS0+bGFzdF90ZW1wX21lYXN1cmVtZW50ID0gamlmZmllczsKLQlzdGF0dXMgPSAwOwkvKiBldmVyeXRoaW5nIG9rLCByZXR1cm4gMCAqLwotCi1leGl0OgotCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIHMzMiBibXAwODVfdXBkYXRlX3Jhd19wcmVzc3VyZShzdHJ1Y3QgYm1wMDg1X2RhdGEgKmRhdGEpCi17Ci0JdTMyIHRtcCA9IDA7Ci0JczMyIHN0YXR1czsKLQotCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwotCi0JaW5pdF9jb21wbGV0aW9uKCZkYXRhLT5kb25lKTsKLQotCXN0YXR1cyA9IHJlZ21hcF93cml0ZShkYXRhLT5yZWdtYXAsIEJNUDA4NV9DVFJMX1JFRywKLQkJCUJNUDA4NV9QUkVTU1VSRV9NRUFTVVJFTUVOVCArCi0JCQkoZGF0YS0+b3ZlcnNhbXBsaW5nX3NldHRpbmcgPDwgNikpOwotCWlmIChzdGF0dXMgPCAwKSB7Ci0JCWRldl9lcnIoZGF0YS0+ZGV2LAotCQkJIkVycm9yIHdoaWxlIHJlcXVlc3RpbmcgcHJlc3N1cmUgbWVhc3VyZW1lbnQuXG4iKTsKLQkJZ290byBleGl0OwotCX0KLQotCS8qIHdhaXQgZm9yIHRoZSBlbmQgb2YgY29udmVyc2lvbiAqLwotCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZGF0YS0+ZG9uZSwgMSArIG1zZWNzX3RvX2ppZmZpZXMoCi0JCQkJCTIrKDMgPDwgZGF0YS0+b3ZlcnNhbXBsaW5nX3NldHRpbmcpKSk7Ci0JLyogY29weSBkYXRhIGludG8gYSB1MzIgKDQgYnl0ZXMpLCBidXQgc2tpcCB0aGUgZmlyc3QgYnl0ZS4gKi8KLQlzdGF0dXMgPSByZWdtYXBfYnVsa19yZWFkKGRhdGEtPnJlZ21hcCwgQk1QMDg1X0NPTlZFUlNJT05fUkVHSVNURVJfTVNCLAotCQkJCSAoKHU4ICopJnRtcCkrMSwgMyk7Ci0JaWYgKHN0YXR1cyA8IDApIHsKLQkJZGV2X2VycihkYXRhLT5kZXYsCi0JCQkiRXJyb3Igd2hpbGUgcmVhZGluZyBwcmVzc3VyZSBtZWFzdXJlbWVudCByZXN1bHRzXG4iKTsKLQkJZ290byBleGl0OwotCX0KLQlkYXRhLT5yYXdfcHJlc3N1cmUgPSBiZTMyX3RvX2NwdSgodG1wKSk7Ci0JZGF0YS0+cmF3X3ByZXNzdXJlID4+PSAoOC1kYXRhLT5vdmVyc2FtcGxpbmdfc2V0dGluZyk7Ci0Jc3RhdHVzID0gMDsJLyogZXZlcnl0aGluZyBvaywgcmV0dXJuIDAgKi8KLQotZXhpdDoKLQltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHN0YXJ0cyB0aGUgdGVtcGVyYXR1cmUgbWVhc3VyZW1lbnQgYW5kIHJldHVybnMgdGhlIHZhbHVlCi0gKiBpbiB0ZW50aCBvZiBhIGRlZ3JlZSBjZWxzaXVzLgotICovCi1zdGF0aWMgczMyIGJtcDA4NV9nZXRfdGVtcGVyYXR1cmUoc3RydWN0IGJtcDA4NV9kYXRhICpkYXRhLCBpbnQgKnRlbXBlcmF0dXJlKQotewotCXN0cnVjdCBibXAwODVfY2FsaWJyYXRpb25fZGF0YSAqY2FsaSA9ICZkYXRhLT5jYWxpYnJhdGlvbjsKLQlsb25nIHgxLCB4MjsKLQlpbnQgc3RhdHVzOwotCi0Jc3RhdHVzID0gYm1wMDg1X3VwZGF0ZV9yYXdfdGVtcGVyYXR1cmUoZGF0YSk7Ci0JaWYgKHN0YXR1cyA8IDApCi0JCWdvdG8gZXhpdDsKLQotCXgxID0gKChkYXRhLT5yYXdfdGVtcGVyYXR1cmUgLSBjYWxpLT5BQzYpICogY2FsaS0+QUM1KSA+PiAxNTsKLQl4MiA9IChjYWxpLT5NQyA8PCAxMSkgLyAoeDEgKyBjYWxpLT5NRCk7Ci0JZGF0YS0+YjYgPSB4MSArIHgyIC0gNDAwMDsKLQkvKiBpZiBOVUxMIGp1c3QgdXBkYXRlIGI2LiBVc2VkIGZvciBwcmVzc3VyZSBvbmx5IG1lYXN1cmVtZW50cyAqLwotCWlmICh0ZW1wZXJhdHVyZSAhPSBOVUxMKQotCQkqdGVtcGVyYXR1cmUgPSAoeDEreDIrOCkgPj4gNDsKLQotZXhpdDoKLQlyZXR1cm4gc3RhdHVzOwotfQotCi0vKgotICogVGhpcyBmdW5jdGlvbiBzdGFydHMgdGhlIHByZXNzdXJlIG1lYXN1cmVtZW50IGFuZCByZXR1cm5zIHRoZSB2YWx1ZQotICogaW4gbWlsbGliYXIuIFNpbmNlIHRoZSBwcmVzc3VyZSBkZXBlbmRzIG9uIHRoZSBhbWJpZW50IHRlbXBlcmF0dXJlLAotICogYSB0ZW1wZXJhdHVyZSBtZWFzdXJlbWVudCBpcyBleGVjdXRlZCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHRlbXBlcmF0dXJlCi0gKiBtZWFzdXJlbWVudCBwZXJpb2QgKGRlZmF1bHQgaXMgMSBzZWMgYm91bmRhcnkpLiBUaGlzIHBlcmlvZCBjb3VsZCB2YXJ5Ci0gKiBhbmQgbmVlZHMgdG8gYmUgYWRqdXN0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzZW5zb3IgZW52aXJvbm1lbnQsIGkuZS4gaWYgYmlnCi0gKiB0ZW1wZXJhdHVyZSB2YXJpYXRpb25zIHRoZW4gdGhlIHRlbXBlcmF0dXJlIG5lZWRzIHRvIGJlIHJlYWQgb3V0IG9mdGVuLgotICovCi1zdGF0aWMgczMyIGJtcDA4NV9nZXRfcHJlc3N1cmUoc3RydWN0IGJtcDA4NV9kYXRhICpkYXRhLCBpbnQgKnByZXNzdXJlKQotewotCXN0cnVjdCBibXAwODVfY2FsaWJyYXRpb25fZGF0YSAqY2FsaSA9ICZkYXRhLT5jYWxpYnJhdGlvbjsKLQlzMzIgeDEsIHgyLCB4MywgYjM7Ci0JdTMyIGI0LCBiNzsKLQlzMzIgcDsKLQlpbnQgc3RhdHVzOwotCi0JLyogYWx0IGxlYXN0IGV2ZXJ5IHNlY29uZCBmb3JjZSBhbiB1cGRhdGUgb2YgdGhlIGFtYmllbnQgdGVtcGVyYXR1cmUgKi8KLQlpZiAoKGRhdGEtPmxhc3RfdGVtcF9tZWFzdXJlbWVudCA9PSAwKSB8fAotCSAgICB0aW1lX2lzX2JlZm9yZV9qaWZmaWVzKGRhdGEtPmxhc3RfdGVtcF9tZWFzdXJlbWVudCArIDEqSFopKSB7Ci0JCXN0YXR1cyA9IGJtcDA4NV9nZXRfdGVtcGVyYXR1cmUoZGF0YSwgTlVMTCk7Ci0JCWlmIChzdGF0dXMgPCAwKQotCQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlzdGF0dXMgPSBibXAwODVfdXBkYXRlX3Jhd19wcmVzc3VyZShkYXRhKTsKLQlpZiAoc3RhdHVzIDwgMCkKLQkJcmV0dXJuIHN0YXR1czsKLQotCXgxID0gKGRhdGEtPmI2ICogZGF0YS0+YjYpID4+IDEyOwotCXgxICo9IGNhbGktPkIyOwotCXgxID4+PSAxMTsKLQotCXgyID0gY2FsaS0+QUMyICogZGF0YS0+YjY7Ci0JeDIgPj49IDExOwotCi0JeDMgPSB4MSArIHgyOwotCi0JYjMgPSAoKCgoKHMzMiljYWxpLT5BQzEpICogNCArIHgzKSA8PCBkYXRhLT5vdmVyc2FtcGxpbmdfc2V0dGluZykgKyAyKTsKLQliMyA+Pj0gMjsKLQotCXgxID0gKGNhbGktPkFDMyAqIGRhdGEtPmI2KSA+PiAxMzsKLQl4MiA9IChjYWxpLT5CMSAqICgoZGF0YS0+YjYgKiBkYXRhLT5iNikgPj4gMTIpKSA+PiAxNjsKLQl4MyA9ICh4MSArIHgyICsgMikgPj4gMjsKLQliNCA9IChjYWxpLT5BQzQgKiAodTMyKSh4MyArIDMyNzY4KSkgPj4gMTU7Ci0KLQliNyA9ICgodTMyKWRhdGEtPnJhd19wcmVzc3VyZSAtIGIzKSAqCi0JCQkJCSg1MDAwMCA+PiBkYXRhLT5vdmVyc2FtcGxpbmdfc2V0dGluZyk7Ci0JcCA9ICgoYjcgPCAweDgwMDAwMDAwKSA/ICgoYjcgPDwgMSkgLyBiNCkgOiAoKGI3IC8gYjQpICogMikpOwotCi0JeDEgPSBwID4+IDg7Ci0JeDEgKj0geDE7Ci0JeDEgPSAoeDEgKiAzMDM4KSA+PiAxNjsKLQl4MiA9ICgtNzM1NyAqIHApID4+IDE2OwotCXAgKz0gKHgxICsgeDIgKyAzNzkxKSA+PiA0OwotCi0JKnByZXNzdXJlID0gcDsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBjaGlwLWludGVybmFsIG92ZXJzYW1wbGluZy4gVmFsaWQgdmFsdWVzIGFyZSAwLi4zLgotICogVGhlIGNoaXAgd2lsbCB1c2UgMl5vdmVyc2FtcGxpbmcgc2FtcGxlcyBmb3IgaW50ZXJuYWwgYXZlcmFnaW5nLgotICogVGhpcyBpbmZsdWVuY2VzIHRoZSBtZWFzdXJlbWVudCB0aW1lIGFuZCB0aGUgYWNjdXJhY3k7IGxhcmdlciB2YWx1ZXMKLSAqIGluY3JlYXNlIGJvdGguIFRoZSBkYXRhc2hlZXQgZ2l2ZXMgYW4gb3ZlcnZpZXcgb24gaG93IG1lYXN1cmVtZW50IHRpbWUsCi0gKiBhY2N1cmFjeSBhbmQgbm9pc2UgY29ycmVsYXRlLgotICovCi1zdGF0aWMgdm9pZCBibXAwODVfc2V0X292ZXJzYW1wbGluZyhzdHJ1Y3QgYm1wMDg1X2RhdGEgKmRhdGEsCi0JCQkJCQl1bnNpZ25lZCBjaGFyIG92ZXJzYW1wbGluZykKLXsKLQlpZiAob3ZlcnNhbXBsaW5nID4gMykKLQkJb3ZlcnNhbXBsaW5nID0gMzsKLQlkYXRhLT5vdmVyc2FtcGxpbmdfc2V0dGluZyA9IG92ZXJzYW1wbGluZzsKLX0KLQotLyoKLSAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvdmVyc2FtcGxpbmcuIFJhbmdlOiAwLi4zCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGJtcDA4NV9nZXRfb3ZlcnNhbXBsaW5nKHN0cnVjdCBibXAwODVfZGF0YSAqZGF0YSkKLXsKLQlyZXR1cm4gZGF0YS0+b3ZlcnNhbXBsaW5nX3NldHRpbmc7Ci19Ci0KLS8qIHN5c2ZzIGNhbGxiYWNrcyAqLwotc3RhdGljIHNzaXplX3Qgc2V0X292ZXJzYW1wbGluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGJtcDA4NV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JdW5zaWduZWQgbG9uZyBvdmVyc2FtcGxpbmc7Ci0JaW50IGVyciA9IGtzdHJ0b3VsKGJ1ZiwgMTAsICZvdmVyc2FtcGxpbmcpOwotCi0JaWYgKGVyciA9PSAwKSB7Ci0JCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwotCQlibXAwODVfc2V0X292ZXJzYW1wbGluZyhkYXRhLCBvdmVyc2FtcGxpbmcpOwotCQltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOwotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd19vdmVyc2FtcGxpbmcoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBibXAwODVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGJtcDA4NV9nZXRfb3ZlcnNhbXBsaW5nKGRhdGEpKTsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihvdmVyc2FtcGxpbmcsIFNfSVdVU1IgfCBTX0lSVUdPLAotCQkJCQlzaG93X292ZXJzYW1wbGluZywgc2V0X292ZXJzYW1wbGluZyk7Ci0KLQotc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wZXJhdHVyZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlpbnQgdGVtcGVyYXR1cmU7Ci0JaW50IHN0YXR1czsKLQlzdHJ1Y3QgYm1wMDg1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCXN0YXR1cyA9IGJtcDA4NV9nZXRfdGVtcGVyYXR1cmUoZGF0YSwgJnRlbXBlcmF0dXJlKTsKLQlpZiAoc3RhdHVzIDwgMCkKLQkJcmV0dXJuIHN0YXR1czsKLQllbHNlCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0ZW1wZXJhdHVyZSk7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFIodGVtcDBfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcGVyYXR1cmUsIE5VTEwpOwotCi0KLXN0YXRpYyBzc2l6ZV90IHNob3dfcHJlc3N1cmUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCWludCBwcmVzc3VyZTsKLQlpbnQgc3RhdHVzOwotCXN0cnVjdCBibXAwODVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0Jc3RhdHVzID0gYm1wMDg1X2dldF9wcmVzc3VyZShkYXRhLCAmcHJlc3N1cmUpOwotCWlmIChzdGF0dXMgPCAwKQotCQlyZXR1cm4gc3RhdHVzOwotCWVsc2UKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHByZXNzdXJlKTsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihwcmVzc3VyZTBfaW5wdXQsIFNfSVJVR08sIHNob3dfcHJlc3N1cmUsIE5VTEwpOwotCi0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpibXAwODVfYXR0cmlidXRlc1tdID0gewotCSZkZXZfYXR0cl90ZW1wMF9pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl9wcmVzc3VyZTBfaW5wdXQuYXR0ciwKLQkmZGV2X2F0dHJfb3ZlcnNhbXBsaW5nLmF0dHIsCi0JTlVMTAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYm1wMDg1X2F0dHJfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gYm1wMDg1X2F0dHJpYnV0ZXMsCi19OwotCi1pbnQgYm1wMDg1X2RldGVjdChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGJtcDA4NV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JdW5zaWduZWQgaW50IGlkOwotCWludCByZXQ7Ci0KLQlyZXQgPSByZWdtYXBfcmVhZChkYXRhLT5yZWdtYXAsIEJNUDA4NV9DSElQX0lEX1JFRywgJmlkKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWlmIChpZCAhPSBkYXRhLT5jaGlwX2lkKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoYm1wMDg1X2RldGVjdCk7Ci0KLXN0YXRpYyB2b2lkIGJtcDA4NV9nZXRfb2ZfcHJvcGVydGllcyhzdHJ1Y3QgYm1wMDg1X2RhdGEgKmRhdGEpCi17Ci0jaWZkZWYgQ09ORklHX09GCi0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRhdGEtPmRldi0+b2Zfbm9kZTsKLQl1MzIgcHJvcDsKLQotCWlmICghbnApCi0JCXJldHVybjsKLQotCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJjaGlwLWlkIiwgJnByb3ApKQotCQlkYXRhLT5jaGlwX2lkID0gcHJvcCAmIDB4ZmY7Ci0KLQlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidGVtcC1tZWFzdXJlbWVudC1wZXJpb2QiLCAmcHJvcCkpCi0JCWRhdGEtPnRlbXBfbWVhc3VyZW1lbnRfcGVyaW9kID0gKHByb3AvMTAwKSpIWjsKLQotCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJkZWZhdWx0LW92ZXJzYW1wbGluZyIsICZwcm9wKSkKLQkJZGF0YS0+b3ZlcnNhbXBsaW5nX3NldHRpbmcgPSBwcm9wICYgMHhmZjsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW50IGJtcDA4NV9pbml0X2NsaWVudChzdHJ1Y3QgYm1wMDg1X2RhdGEgKmRhdGEpCi17Ci0JaW50IHN0YXR1cyA9IGJtcDA4NV9yZWFkX2NhbGlicmF0aW9uX2RhdGEoZGF0YSk7Ci0KLQlpZiAoc3RhdHVzIDwgMCkKLQkJcmV0dXJuIHN0YXR1czsKLQotCS8qIGRlZmF1bHQgc2V0dGluZ3MgKi8KLQlkYXRhLT5jaGlwX2lkID0gQk1QMDg1X0NISVBfSUQ7Ci0JZGF0YS0+bGFzdF90ZW1wX21lYXN1cmVtZW50ID0gMDsKLQlkYXRhLT50ZW1wX21lYXN1cmVtZW50X3BlcmlvZCA9IDEqSFo7Ci0JZGF0YS0+b3ZlcnNhbXBsaW5nX3NldHRpbmcgPSAzOwotCi0JYm1wMDg1X2dldF9vZl9wcm9wZXJ0aWVzKGRhdGEpOwotCi0JbXV0ZXhfaW5pdCgmZGF0YS0+bG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IHJlZ21hcF9jb25maWcgYm1wMDg1X3JlZ21hcF9jb25maWcgPSB7Ci0JLnJlZ19iaXRzID0gOCwKLQkudmFsX2JpdHMgPSA4Ci19OwotRVhQT1JUX1NZTUJPTF9HUEwoYm1wMDg1X3JlZ21hcF9jb25maWcpOwotCi1pbnQgYm1wMDg1X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJlZ21hcCAqcmVnbWFwLCBpbnQgaXJxKQotewotCXN0cnVjdCBibXAwODVfZGF0YSAqZGF0YTsKLQlpbnQgZXJyID0gMDsKLQotCWRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYm1wMDg1X2RhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRhdGEpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBleGl0OwotCX0KLQotCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGRhdGEpOwotCWRhdGEtPmRldiA9IGRldjsKLQlkYXRhLT5yZWdtYXAgPSByZWdtYXA7Ci0JZGF0YS0+aXJxID0gaXJxOwotCi0JaWYgKGRhdGEtPmlycSA+IDApIHsKLQkJZXJyID0gZGV2bV9yZXF1ZXN0X2lycShkZXYsIGRhdGEtPmlycSwgYm1wMDg1X2VvY19pc3IsCi0JCQkJCSAgICAgIElSUUZfVFJJR0dFUl9SSVNJTkcsICJibXAwODUiLAotCQkJCQkgICAgICBkYXRhKTsKLQkJaWYgKGVyciA8IDApCi0JCQlnb3RvIGV4aXRfZnJlZTsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBCTVAwODUgY2hpcCAqLwotCWVyciA9IGJtcDA4NV9pbml0X2NsaWVudChkYXRhKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBleGl0X2ZyZWU7Ci0KLQllcnIgPSBibXAwODVfZGV0ZWN0KGRldik7Ci0JaWYgKGVyciA8IDApIHsKLQkJZGV2X2VycihkZXYsICIlczogY2hpcF9pZCBmYWlsZWQhXG4iLCBCTVAwODVfTkFNRSk7Ci0JCWdvdG8gZXhpdF9mcmVlOwotCX0KLQotCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCi0JZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXYtPmtvYmosICZibXAwODVfYXR0cl9ncm91cCk7Ci0JaWYgKGVycikKLQkJZ290byBleGl0X2ZyZWU7Ci0KLQlkZXZfaW5mbyhkZXYsICJTdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgJXMhXG4iLCBCTVAwODVfTkFNRSk7Ci0KLQlyZXR1cm4gMDsKLQotZXhpdF9mcmVlOgotCWtmcmVlKGRhdGEpOwotZXhpdDoKLQlyZXR1cm4gZXJyOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoYm1wMDg1X3Byb2JlKTsKLQotaW50IGJtcDA4NV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBibXAwODVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZkYXRhLT5kZXYtPmtvYmosICZibXAwODVfYXR0cl9ncm91cCk7Ci0Ja2ZyZWUoZGF0YSk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGJtcDA4NV9yZW1vdmUpOwotCi1NT0RVTEVfQVVUSE9SKCJDaHJpc3RvcGggTWFpciA8Y2hyaXN0b3BoLm1haXJAZ21haWwuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJCTVAwODUgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvYm1wMDg1LmggYi9kcml2ZXJzL21pc2MvYm1wMDg1LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiOGUzYjEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9taXNjL2JtcDA4NS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMiAgQm9zY2ggU2Vuc29ydGVjIEdtYkgKLSAqIENvcHlyaWdodCAoYykgMjAxMiAgVW5peHBoZXJlIEFCCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2lmbmRlZiBfQk1QMDg1X0gKLSNkZWZpbmUgX0JNUDA4NV9ICi0KLSNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KLQotI2RlZmluZSBCTVAwODVfTkFNRQkJImJtcDA4NSIKLQotZXh0ZXJuIHN0cnVjdCByZWdtYXBfY29uZmlnIGJtcDA4NV9yZWdtYXBfY29uZmlnOwotCi1pbnQgYm1wMDg1X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJlZ21hcCAqcmVnbWFwLCBpbnQgaXJxKTsKLWludCBibXAwODVfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldik7Ci1pbnQgYm1wMDg1X2RldGVjdChzdHJ1Y3QgZGV2aWNlICpkZXYpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9jeGwvdnBoYi5jIGIvZHJpdmVycy9taXNjL2N4bC92cGhiLmMKaW5kZXggN2FkYTVmMS4uMzUxOWFjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2N4bC92cGhiLmMKKysrIGIvZHJpdmVycy9taXNjL2N4bC92cGhiLmMKQEAgLTIzMCw2ICsyMzAsMTEgQEAKIAlpZiAocGhiLT5idXMgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTlhJTzsKIAorCS8qIFNldCByZWxlYXNlIGhvb2sgb24gcm9vdCBidXMgKi8KKwlwY2lfc2V0X2hvc3RfYnJpZGdlX3JlbGVhc2UodG9fcGNpX2hvc3RfYnJpZGdlKHBoYi0+YnVzLT5icmlkZ2UpLAorCQkJCSAgICBwY2liaW9zX2ZyZWVfY29udHJvbGxlcl9kZWZlcnJlZCwKKwkJCQkgICAgKHZvaWQgKikgcGhiKTsKKwogCS8qIENsYWltIHJlc291cmNlcy4gVGhpcyBtaWdodCBuZWVkIHNvbWUgcmV3b3JrIGFzIHdlbGwgZGVwZW5kaW5nCiAJICogd2hldGhlciB3ZSBhcmUgZG9pbmcgcHJvYmUtb25seSBvciBub3QsIGxpa2UgYXNzaWduaW5nIHVuYXNzaWduZWQKIAkgKiByZXNvdXJjZXMgZXRjLi4uCkBAIC0yNTYsNyArMjYxLDEwIEBACiAJYWZ1LT5waGIgPSBOVUxMOwogCiAJcGNpX3JlbW92ZV9yb290X2J1cyhwaGItPmJ1cyk7Ci0JcGNpYmlvc19mcmVlX2NvbnRyb2xsZXIocGhiKTsKKwkvKgorCSAqIFdlIGRvbid0IGZyZWUgcGhiIGhlcmUgLSB0aGF0J3MgaGFuZGxlZCBieQorCSAqIHBjaWJpb3NfZnJlZV9jb250cm9sbGVyX2RlZmVycmVkKCkKKwkgKi8KIH0KIAogc3RhdGljIGJvb2wgX2N4bF9wY2lfaXNfdnBoYl9kZXZpY2Uoc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvZWVwcm9tL2F0MjUuYyBiL2RyaXZlcnMvbWlzYy9lZXByb20vYXQyNS5jCmluZGV4IDJjNmM3YzguLjVhZmU0Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9lZXByb20vYXQyNS5jCisrKyBiL2RyaXZlcnMvbWlzYy9lZXByb20vYXQyNS5jCkBAIC0xMjEsOSArMTIxLDggQEAKIAkgKiB0aGlzIGNoaXAgaXMgY2xvY2tlZCB2ZXJ5IHNsb3dseQogCSAqLwogCXN0YXR1cyA9IHNwaV9zeW5jKGF0MjUtPnNwaSwgJm0pOwotCWRldl9kYmcoJmF0MjUtPnNwaS0+ZGV2LAotCQkicmVhZCAlWmQgYnl0ZXMgYXQgJWQgLS0+ICVkXG4iLAotCQljb3VudCwgb2Zmc2V0LCAoaW50KSBzdGF0dXMpOworCWRldl9kYmcoJmF0MjUtPnNwaS0+ZGV2LCAicmVhZCAlenUgYnl0ZXMgYXQgJWQgLS0+ICV6ZFxuIiwKKwkJY291bnQsIG9mZnNldCwgc3RhdHVzKTsKIAogCW11dGV4X3VubG9jaygmYXQyNS0+bG9jayk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTE2Nyw4ICsxNjYsNyBAQAogCQkqY3AgPSBBVDI1X1dSRU47CiAJCXN0YXR1cyA9IHNwaV93cml0ZShhdDI1LT5zcGksIGNwLCAxKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCWRldl9kYmcoJmF0MjUtPnNwaS0+ZGV2LCAiV1JFTiAtLT4gJWRcbiIsCi0JCQkJCShpbnQpIHN0YXR1cyk7CisJCQlkZXZfZGJnKCZhdDI1LT5zcGktPmRldiwgIldSRU4gLS0+ICVkXG4iLCBzdGF0dXMpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMTk2LDkgKzE5NCw4IEBACiAJCW1lbWNweShjcCwgYnVmLCBzZWdtZW50KTsKIAkJc3RhdHVzID0gc3BpX3dyaXRlKGF0MjUtPnNwaSwgYm91bmNlLAogCQkJCXNlZ21lbnQgKyBhdDI1LT5hZGRybGVuICsgMSk7Ci0JCWRldl9kYmcoJmF0MjUtPnNwaS0+ZGV2LAotCQkJCSJ3cml0ZSAldSBieXRlcyBhdCAldSAtLT4gJWRcbiIsCi0JCQkJc2VnbWVudCwgb2Zmc2V0LCAoaW50KSBzdGF0dXMpOworCQlkZXZfZGJnKCZhdDI1LT5zcGktPmRldiwgIndyaXRlICV1IGJ5dGVzIGF0ICV1IC0tPiAlZFxuIiwKKwkJCXNlZ21lbnQsIG9mZnNldCwgc3RhdHVzKTsKIAkJaWYgKHN0YXR1cyA8IDApCiAJCQlicmVhazsKIApAQCAtMjI1LDggKzIyMiw3IEBACiAKIAkJaWYgKChzciA8IDApIHx8IChzciAmIEFUMjVfU1JfblJEWSkpIHsKIAkJCWRldl9lcnIoJmF0MjUtPnNwaS0+ZGV2LAotCQkJCSJ3cml0ZSAlZCBieXRlcyBvZmZzZXQgJWQsICIKLQkJCQkidGltZW91dCBhZnRlciAldSBtc2Vjc1xuIiwKKwkJCQkid3JpdGUgJXUgYnl0ZXMgb2Zmc2V0ICV1LCB0aW1lb3V0IGFmdGVyICV1IG1zZWNzXG4iLAogCQkJCXNlZ21lbnQsIG9mZnNldCwKIAkJCQlqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLQogCQkJCQkodGltZW91dCAtIEVFX1RJTUVPVVQpKSk7CkBAIC0zNjgsOSArMzY0LDcgQEAKIAkJcmV0dXJuIFBUUl9FUlIoYXQyNS0+bnZtZW0pOwogCiAJZGV2X2luZm8oJnNwaS0+ZGV2LCAiJWQgJXMgJXMgZWVwcm9tJXMsIHBhZ2VzaXplICV1XG4iLAotCQkoY2hpcC5ieXRlX2xlbiA8IDEwMjQpCi0JCQk/IGNoaXAuYnl0ZV9sZW4KLQkJCTogKGNoaXAuYnl0ZV9sZW4gLyAxMDI0KSwKKwkJKGNoaXAuYnl0ZV9sZW4gPCAxMDI0KSA/IGNoaXAuYnl0ZV9sZW4gOiAoY2hpcC5ieXRlX2xlbiAvIDEwMjQpLAogCQkoY2hpcC5ieXRlX2xlbiA8IDEwMjQpID8gIkJ5dGUiIDogIktCeXRlIiwKIAkJYXQyNS0+Y2hpcC5uYW1lLAogCQkoY2hpcC5mbGFncyAmIEVFX1JFQURPTkxZKSA/ICIgKHJlYWRvbmx5KSIgOiAiIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9nZW53cWUvY2FyZF9iYXNlLmMgYi9kcml2ZXJzL21pc2MvZ2Vud3FlL2NhcmRfYmFzZS5jCmluZGV4IGE3MGI4NTMuLjZjMWY0OWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9nZW53cWUvY2FyZF9iYXNlLmMKKysrIGIvZHJpdmVycy9taXNjL2dlbndxZS9jYXJkX2Jhc2UuYwpAQCAtMTM1MSw2ICsxMzUxLDE5IEBACiB9OwogCiAvKioKKyAqIGdlbndxZV9kZXZub2RlKCkgLSBTZXQgZGVmYXVsdCBhY2Nlc3MgbW9kZSBmb3IgZ2Vud3FlIGRldmljZXMuCisgKgorICogRGVmYXVsdCBtb2RlIHNob3VsZCBiZSBydyBmb3IgZXZlcnlib2R5LiBEbyBub3QgY2hhbmdlIGRlZmF1bHQKKyAqIGRldmljZSBuYW1lLgorICovCitzdGF0aWMgY2hhciAqZ2Vud3FlX2Rldm5vZGUoc3RydWN0IGRldmljZSAqZGV2LCB1bW9kZV90ICptb2RlKQoreworCWlmIChtb2RlKQorCQkqbW9kZSA9IDA2NjY7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgogICogZ2Vud3FlX2luaXRfbW9kdWxlKCkgLSBEcml2ZXIgcmVnaXN0cmF0aW9uIGFuZCBpbml0aWFsaXphdGlvbgogICovCiBzdGF0aWMgaW50IF9faW5pdCBnZW53cWVfaW5pdF9tb2R1bGUodm9pZCkKQEAgLTEzNjMsNiArMTM3Niw4IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCWNsYXNzX2dlbndxZS0+ZGV2bm9kZSA9IGdlbndxZV9kZXZub2RlOworCiAJZGVidWdmc19nZW53cWUgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoR0VOV1FFX0RFVk5BTUUsIE5VTEwpOwogCWlmICghZGVidWdmc19nZW53cWUpIHsKIAkJcmMgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2dlbndxZS9jYXJkX2RkY2IuYyBiL2RyaXZlcnMvbWlzYy9nZW53cWUvY2FyZF9kZGNiLmMKaW5kZXggMzUzZWUwYy4uZGRmZWVmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2dlbndxZS9jYXJkX2RkY2IuYworKysgYi9kcml2ZXJzL21pc2MvZ2Vud3FlL2NhcmRfZGRjYi5jCkBAIC0xMDQ4LDggKzEwNDgsNiBAQAogCQkJIlslc10gKiplcnI6IGNvdWxkIG5vdCBhbGxvY2F0ZSBERENCICoqXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltZW1zZXQocXVldWUtPmRkY2JfdmFkZHIsIDAsIHF1ZXVlX3NpemUpOwotCiAJcXVldWUtPmRkY2JfcmVxID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRkY2JfcmVxdSAqKSAqCiAJCQkJICBxdWV1ZS0+ZGRjYl9tYXgsIEdGUF9LRVJORUwpOwogCWlmICghcXVldWUtPmRkY2JfcmVxKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvZ2Vud3FlL2NhcmRfdXRpbHMuYyBiL2RyaXZlcnMvbWlzYy9nZW53cWUvY2FyZF91dGlscy5jCmluZGV4IDIyMjM2N2MuLjhhNjc5ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9nZW53cWUvY2FyZF91dGlscy5jCisrKyBiL2RyaXZlcnMvbWlzYy9nZW53cWUvY2FyZF91dGlscy5jCkBAIC0yMjAsOCArMjIwLDggQEAKIAlpZiAoZ2V0X29yZGVyKHNpemUpID4gTUFYX09SREVSKQogCQlyZXR1cm4gTlVMTDsKIAotCXJldHVybiBkbWFfYWxsb2NfY29oZXJlbnQoJmNkLT5wY2lfZGV2LT5kZXYsIHNpemUsIGRtYV9oYW5kbGUsCi0JCQkJICBHRlBfS0VSTkVMKTsKKwlyZXR1cm4gZG1hX3phbGxvY19jb2hlcmVudCgmY2QtPnBjaV9kZXYtPmRldiwgc2l6ZSwgZG1hX2hhbmRsZSwKKwkJCQkgICBHRlBfS0VSTkVMKTsKIH0KIAogdm9pZCBfX2dlbndxZV9mcmVlX2NvbnNpc3RlbnQoc3RydWN0IGdlbndxZV9kZXYgKmNkLCBzaXplX3Qgc2l6ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9ocGlsby5jIGIvZHJpdmVycy9taXNjL2hwaWxvLmMKaW5kZXggZDZhOTAxYy4uZmVhOGZmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2hwaWxvLmMKKysrIGIvZHJpdmVycy9taXNjL2hwaWxvLmMKQEAgLTY4OCw3ICs2ODgsOCBAQAogCiBzdGF0aWMgaW50IGlsb19tYXBfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgaWxvX2h3aW5mbyAqaHcpCiB7Ci0JaW50IGVycm9yID0gLUVOT01FTTsKKwlpbnQgYmFyOworCXVuc2lnbmVkIGxvbmcgb2ZmOwogCiAJLyogbWFwIHRoZSBtZW1vcnkgbWFwcGVkIGkvbyByZWdpc3RlcnMgKi8KIAlody0+bW1pb192YWRkciA9IHBjaV9pb21hcChwZGV2LCAxLCAwKTsKQEAgLTY5OCw3ICs2OTksMTUgQEAKIAl9CiAKIAkvKiBtYXAgdGhlIGFkYXB0ZXIgc2hhcmVkIG1lbW9yeSByZWdpb24gKi8KLQlody0+cmFtX3ZhZGRyID0gcGNpX2lvbWFwKHBkZXYsIDIsIG1heF9jY2IgKiBJTE9IV19DQ0JfU1opOworCWlmIChwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4MDBFNCkgeworCQliYXIgPSA1OworCQkvKiBMYXN0IDhrIGlzIHJlc2VydmVkIGZvciBDQ0JzICovCisJCW9mZiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgYmFyKSAtIDB4MjAwMDsKKwl9IGVsc2UgeworCQliYXIgPSAyOworCQlvZmYgPSAwOworCX0KKwlody0+cmFtX3ZhZGRyID0gcGNpX2lvbWFwX3JhbmdlKHBkZXYsIGJhciwgb2ZmLCBtYXhfY2NiICogSUxPSFdfQ0NCX1NaKTsKIAlpZiAoaHctPnJhbV92YWRkciA9PSBOVUxMKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkVycm9yIG1hcHBpbmcgc2hhcmVkIG1lbVxuIik7CiAJCWdvdG8gbW1pb19mcmVlOwpAQCAtNzE3LDcgKzcyNiw3IEBACiBtbWlvX2ZyZWU6CiAJcGNpX2lvdW5tYXAocGRldiwgaHctPm1taW9fdmFkZHIpOwogb3V0OgotCXJldHVybiBlcnJvcjsKKwlyZXR1cm4gLUVOT01FTTsKIH0KIAogc3RhdGljIHZvaWQgaWxvX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKQEAgLTg5OSw3ICs5MDgsNyBAQAogCWNsYXNzX2Rlc3Ryb3koaWxvX2NsYXNzKTsKIH0KIAotTU9EVUxFX1ZFUlNJT04oIjEuNC4xIik7CitNT0RVTEVfVkVSU0lPTigiMS41LjAiKTsKIE1PRFVMRV9BTElBUyhJTE9fTkFNRSk7CiBNT0RVTEVfREVTQ1JJUFRJT04oSUxPX05BTUUpOwogTU9EVUxFX0FVVEhPUigiRGF2aWQgQWx0b2JlbGxpIDxkYXZpZC5hbHRvYmVsbGlAaHBlLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9sa2R0bV9yb2RhdGEuYyBiL2RyaXZlcnMvbWlzYy9sa2R0bV9yb2RhdGEuYwppbmRleCAxNjZiMWRiLi4zNTY0NDc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbGtkdG1fcm9kYXRhLmMKKysrIGIvZHJpdmVycy9taXNjL2xrZHRtX3JvZGF0YS5jCkBAIC00LDcgKzQsNyBAQAogICovCiAjaW5jbHVkZSAibGtkdG0uaCIKIAotdm9pZCBsa2R0bV9yb2RhdGFfZG9fbm90aGluZyh2b2lkKQordm9pZCBub3RyYWNlIGxrZHRtX3JvZGF0YV9kb19ub3RoaW5nKHZvaWQpCiB7CiAJLyogRG9lcyBub3RoaW5nLiBXZSBqdXN0IHdhbnQgYW4gYXJjaGl0ZWN0dXJlIGFnbm9zdGljICJyZXR1cm4iLiAqLwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2xrZHRtX3VzZXJjb3B5LmMgYi9kcml2ZXJzL21pc2MvbGtkdG1fdXNlcmNvcHkuYwppbmRleCA1NTI1YTIwLi4xZGQ2MTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbGtkdG1fdXNlcmNvcHkuYworKysgYi9kcml2ZXJzL21pc2MvbGtkdG1fdXNlcmNvcHkuYwpAQCAtOSw3ICs5LDE1IEBACiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAKLXN0YXRpYyBzaXplX3QgY2FjaGVfc2l6ZSA9IDEwMjQ7CisvKgorICogTWFueSBvZiB0aGUgdGVzdHMgaGVyZSBlbmQgdXAgdXNpbmcgY29uc3Qgc2l6ZXMsIGJ1dCB0aG9zZSB3b3VsZAorICogbm9ybWFsbHkgYmUgaWdub3JlZCBieSBoYXJkZW5lZCB1c2VyY29weSwgc28gZm9yY2UgdGhlIGNvbXBpbGVyCisgKiBpbnRvIGNob29zaW5nIHRoZSBub24tY29uc3QgcGF0aCB0byBtYWtlIHN1cmUgd2UgdHJpZ2dlciB0aGUKKyAqIGhhcmRlbmVkIHVzZXJjb3B5IGNoZWNrcyBieSBhZGRlZCAidW5jb25zdCIgdG8gYWxsIHRoZSBjb25zdCBjb3BpZXMsCisgKiBhbmQgbWFraW5nIHN1cmUgImNhY2hlX3NpemUiIGlzbid0IG9wdGltaXplZCBpbnRvIGEgY29uc3QuCisgKi8KK3N0YXRpYyB2b2xhdGlsZSBzaXplX3QgdW5jb25zdCA9IDA7CitzdGF0aWMgdm9sYXRpbGUgc2l6ZV90IGNhY2hlX3NpemUgPSAxMDI0Owogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpiYWRfY2FjaGU7CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRlc3RfdGV4dFtdID0gIlRoaXMgaXMgYSB0ZXN0LlxuIjsKQEAgLTY3LDE0ICs3NSwxNCBAQAogCWlmICh0b191c2VyKSB7CiAJCXByX2luZm8oImF0dGVtcHRpbmcgZ29vZCBjb3B5X3RvX3VzZXIgb2YgbG9jYWwgc3RhY2tcbiIpOwogCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKXVzZXJfYWRkciwgZ29vZF9zdGFjaywKLQkJCQkgc2l6ZW9mKGdvb2Rfc3RhY2spKSkgeworCQkJCSB1bmNvbnN0ICsgc2l6ZW9mKGdvb2Rfc3RhY2spKSkgewogCQkJcHJfd2FybigiY29weV90b191c2VyIGZhaWxlZCB1bmV4cGVjdGVkbHk/IVxuIik7CiAJCQlnb3RvIGZyZWVfdXNlcjsKIAkJfQogCiAJCXByX2luZm8oImF0dGVtcHRpbmcgYmFkIGNvcHlfdG9fdXNlciBvZiBkaXN0YW50IHN0YWNrXG4iKTsKIAkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKil1c2VyX2FkZHIsIGJhZF9zdGFjaywKLQkJCQkgc2l6ZW9mKGdvb2Rfc3RhY2spKSkgeworCQkJCSB1bmNvbnN0ICsgc2l6ZW9mKGdvb2Rfc3RhY2spKSkgewogCQkJcHJfd2FybigiY29weV90b191c2VyIGZhaWxlZCwgYnV0IGxhY2tlZCBPb3BzXG4iKTsKIAkJCWdvdG8gZnJlZV91c2VyOwogCQl9CkBAIC04OCwxNCArOTYsMTQgQEAKIAogCQlwcl9pbmZvKCJhdHRlbXB0aW5nIGdvb2QgY29weV9mcm9tX3VzZXIgb2YgbG9jYWwgc3RhY2tcbiIpOwogCQlpZiAoY29weV9mcm9tX3VzZXIoZ29vZF9zdGFjaywgKHZvaWQgX191c2VyICopdXNlcl9hZGRyLAotCQkJCSAgIHNpemVvZihnb29kX3N0YWNrKSkpIHsKKwkJCQkgICB1bmNvbnN0ICsgc2l6ZW9mKGdvb2Rfc3RhY2spKSkgewogCQkJcHJfd2FybigiY29weV9mcm9tX3VzZXIgZmFpbGVkIHVuZXhwZWN0ZWRseT8hXG4iKTsKIAkJCWdvdG8gZnJlZV91c2VyOwogCQl9CiAKIAkJcHJfaW5mbygiYXR0ZW1wdGluZyBiYWQgY29weV9mcm9tX3VzZXIgb2YgZGlzdGFudCBzdGFja1xuIik7CiAJCWlmIChjb3B5X2Zyb21fdXNlcihiYWRfc3RhY2ssICh2b2lkIF9fdXNlciAqKXVzZXJfYWRkciwKLQkJCQkgICBzaXplb2YoZ29vZF9zdGFjaykpKSB7CisJCQkJICAgdW5jb25zdCArIHNpemVvZihnb29kX3N0YWNrKSkpIHsKIAkJCXByX3dhcm4oImNvcHlfZnJvbV91c2VyIGZhaWxlZCwgYnV0IGxhY2tlZCBPb3BzXG4iKTsKIAkJCWdvdG8gZnJlZV91c2VyOwogCQl9CkBAIC0xMDksNyArMTE3LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHVzZXJfYWRkcjsKIAl1bnNpZ25lZCBjaGFyICpvbmUsICp0d287Ci0JY29uc3Qgc2l6ZV90IHNpemUgPSAxMDI0OworCXNpemVfdCBzaXplID0gdW5jb25zdCArIDEwMjQ7CiAKIAlvbmUgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCXR3byA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CkBAIC0yODUsMTMgKzI5MywxNCBAQAogCiAJcHJfaW5mbygiYXR0ZW1wdGluZyBnb29kIGNvcHlfdG9fdXNlciBmcm9tIGtlcm5lbCByb2RhdGFcbiIpOwogCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopdXNlcl9hZGRyLCB0ZXN0X3RleHQsCi0JCQkgc2l6ZW9mKHRlc3RfdGV4dCkpKSB7CisJCQkgdW5jb25zdCArIHNpemVvZih0ZXN0X3RleHQpKSkgewogCQlwcl93YXJuKCJjb3B5X3RvX3VzZXIgZmFpbGVkIHVuZXhwZWN0ZWRseT8hXG4iKTsKIAkJZ290byBmcmVlX3VzZXI7CiAJfQogCiAJcHJfaW5mbygiYXR0ZW1wdGluZyBiYWQgY29weV90b191c2VyIGZyb20ga2VybmVsIHRleHRcbiIpOwotCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopdXNlcl9hZGRyLCB2bV9tbWFwLCBQQUdFX1NJWkUpKSB7CisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKil1c2VyX2FkZHIsIHZtX21tYXAsCisJCQkgdW5jb25zdCArIFBBR0VfU0laRSkpIHsKIAkJcHJfd2FybigiY29weV90b191c2VyIGZhaWxlZCwgYnV0IGxhY2tlZCBPb3BzXG4iKTsKIAkJZ290byBmcmVlX3VzZXI7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9hbXRoaWYuYyBiL2RyaXZlcnMvbWlzYy9tZWkvYW10aGlmLmMKaW5kZXggYTAzOWE1ZC4uN2FlODliNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9hbXRoaWYuYworKysgYi9kcml2ZXJzL21pc2MvbWVpL2FtdGhpZi5jCkBAIC00Nyw3ICs0Nyw2IEBACiB2b2lkIG1laV9hbXRoaWZfcmVzZXRfcGFyYW1zKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCiB7CiAJLyogcmVzZXQgaWFtdGhpZiBwYXJhbWV0ZXJzLiAqLwotCWRldi0+aWFtdGhpZl9jdXJyZW50X2NiID0gTlVMTDsKIAlkZXYtPmlhbXRoaWZfY2FuY2VsZWQgPSBmYWxzZTsKIAlkZXYtPmlhbXRoaWZfc3RhdGUgPSBNRUlfSUFNVEhJRl9JRExFOwogCWRldi0+aWFtdGhpZl9zdGFsbF90aW1lciA9IDA7CkBAIC02Nyw4ICs2NiwxMiBAQAogCXN0cnVjdCBtZWlfY2wgKmNsID0gJmRldi0+aWFtdGhpZl9jbDsKIAlpbnQgcmV0OwogCi0JaWYgKG1laV9jbF9pc19jb25uZWN0ZWQoY2wpKQotCQlyZXR1cm4gMDsKKwltdXRleF9sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKKworCWlmIChtZWlfY2xfaXNfY29ubmVjdGVkKGNsKSkgeworCQlyZXQgPSAwOworCQlnb3RvIG91dDsKKwl9CiAKIAlkZXYtPmlhbXRoaWZfc3RhdGUgPSBNRUlfSUFNVEhJRl9JRExFOwogCkBAIC03NywxNzkgKzgwLDM3IEBACiAJcmV0ID0gbWVpX2NsX2xpbmsoY2wpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoZGV2LT5kZXYsICJhbXRoaWY6IGZhaWxlZCBjbF9saW5rICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OworCQlnb3RvIG91dDsKIAl9CiAKIAlyZXQgPSBtZWlfY2xfY29ubmVjdChjbCwgbWVfY2wsIE5VTEwpOwogCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBtZWlfYW10aGlmX3JlYWQgLSByZWFkIGRhdGEgZnJvbSBBTVRISUYgY2xpZW50Ci0gKgotICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBmaWxlOiBwb2ludGVyIHRvIGZpbGUgb2JqZWN0Ci0gKiBAdWJ1ZjogcG9pbnRlciB0byB1c2VyIGRhdGEgaW4gdXNlciBzcGFjZQotICogQGxlbmd0aDogZGF0YSBsZW5ndGggdG8gcmVhZAotICogQG9mZnNldDogZGF0YSByZWFkIG9mZnNldAotICoKLSAqIExvY2tpbmc6IGNhbGxlZCB1bmRlciAiZGV2LT5kZXZpY2VfbG9jayIgbG9jawotICoKLSAqIFJldHVybjoKLSAqICByZXR1cm5lZCBkYXRhIGxlbmd0aCBvbiBzdWNjZXNzLAotICogIHplcm8gaWYgbm8gZGF0YSB0byByZWFkLAotICogIG5lZ2F0aXZlIG9uIGZhaWx1cmUuCi0gKi8KLWludCBtZWlfYW10aGlmX3JlYWQoc3RydWN0IG1laV9kZXZpY2UgKmRldiwgc3RydWN0IGZpbGUgKmZpbGUsCi0JICAgICAgIGNoYXIgX191c2VyICp1YnVmLCBzaXplX3QgbGVuZ3RoLCBsb2ZmX3QgKm9mZnNldCkKLXsKLQlzdHJ1Y3QgbWVpX2NsICpjbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgbWVpX2NsX2NiICpjYjsKLQlpbnQgcmV0czsKLQlpbnQgd2FpdF9yZXQ7Ci0KLQlkZXZfZGJnKGRldi0+ZGV2LCAiY2hlY2tpbmcgYW10aGlmIGRhdGFcbiIpOwotCWNiID0gbWVpX2NsX3JlYWRfY2IoY2wsIGZpbGUpOwotCi0JLyogQ2hlY2sgZm9yIGlmIHdlIGNhbiBibG9jayBvciBub3QqLwotCWlmIChjYiA9PSBOVUxMICYmIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCi0JZGV2X2RiZyhkZXYtPmRldiwgIndhaXRpbmcgZm9yIGFtdGhpZiBkYXRhXG4iKTsKLQl3aGlsZSAoY2IgPT0gTlVMTCkgewotCQkvKiB1bmxvY2sgdGhlIE11dGV4ICovCi0JCW11dGV4X3VubG9jaygmZGV2LT5kZXZpY2VfbG9jayk7Ci0KLQkJd2FpdF9yZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoY2wtPnJ4X3dhaXQsCi0JCQkJCSFsaXN0X2VtcHR5KCZjbC0+cmRfY29tcGxldGVkKSB8fAotCQkJCQkhbWVpX2NsX2lzX2Nvbm5lY3RlZChjbCkpOwotCi0JCS8qIExvY2tpbmcgYWdhaW4gdGhlIE11dGV4ICovCi0JCW11dGV4X2xvY2soJmRldi0+ZGV2aWNlX2xvY2spOwotCi0JCWlmICh3YWl0X3JldCkKLQkJCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0KLQkJaWYgKCFtZWlfY2xfaXNfY29ubmVjdGVkKGNsKSkgewotCQkJcmV0cyA9IC1FQlVTWTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJY2IgPSBtZWlfY2xfcmVhZF9jYihjbCwgZmlsZSk7Ci0JfQotCi0JaWYgKGNiLT5zdGF0dXMpIHsKLQkJcmV0cyA9IGNiLT5zdGF0dXM7Ci0JCWRldl9kYmcoZGV2LT5kZXYsICJyZWFkIG9wZXJhdGlvbiBmYWlsZWQgJWRcbiIsIHJldHMpOwotCQlnb3RvIGZyZWU7Ci0JfQotCi0JZGV2X2RiZyhkZXYtPmRldiwgIkdvdCBhbXRoaWYgZGF0YVxuIik7Ci0JLyogaWYgdGhlIHdob2xlIG1lc3NhZ2Ugd2lsbCBmaXQgcmVtb3ZlIGl0IGZyb20gdGhlIGxpc3QgKi8KLQlpZiAoY2ItPmJ1Zl9pZHggPj0gKm9mZnNldCAmJiBsZW5ndGggPj0gKGNiLT5idWZfaWR4IC0gKm9mZnNldCkpCi0JCWxpc3RfZGVsX2luaXQoJmNiLT5saXN0KTsKLQllbHNlIGlmIChjYi0+YnVmX2lkeCA8PSAqb2Zmc2V0KSB7Ci0JCS8qIGVuZCBvZiB0aGUgbWVzc2FnZSBoYXMgYmVlbiByZWFjaGVkICovCi0JCWxpc3RfZGVsX2luaXQoJmNiLT5saXN0KTsKLQkJcmV0cyA9IDA7Ci0JCWdvdG8gZnJlZTsKLQl9Ci0JCS8qIGVsc2UgbWVhbnMgdGhhdCBub3QgZnVsbCBidWZmZXIgd2lsbCBiZSByZWFkIGFuZCBkbyBub3QKLQkJICogcmVtb3ZlIG1lc3NhZ2UgZnJvbSBkZWxldGlvbiBsaXN0Ci0JCSAqLwotCi0JZGV2X2RiZyhkZXYtPmRldiwgImFtdGhpZiBjYi0+YnVmLnNpemUgLSAlenUgY2ItPmJ1Zl9pZHggLSAlenVcbiIsCi0JCWNiLT5idWYuc2l6ZSwgY2ItPmJ1Zl9pZHgpOwotCi0JLyogbGVuZ3RoIGlzIGJlaW5nIHRydW5jYXRlZCB0byBQQUdFX1NJWkUsIGhvd2V2ZXIsCi0JICogdGhlIGJ1Zl9pZHggbWF5IHBvaW50IGJleW9uZCAqLwotCWxlbmd0aCA9IG1pbl90KHNpemVfdCwgbGVuZ3RoLCAoY2ItPmJ1Zl9pZHggLSAqb2Zmc2V0KSk7Ci0KLQlpZiAoY29weV90b191c2VyKHVidWYsIGNiLT5idWYuZGF0YSArICpvZmZzZXQsIGxlbmd0aCkpIHsKLQkJZGV2X2RiZyhkZXYtPmRldiwgImZhaWxlZCB0byBjb3B5IGRhdGEgdG8gdXNlcmxhbmRcbiIpOwotCQlyZXRzID0gLUVGQVVMVDsKLQl9IGVsc2UgewotCQlyZXRzID0gbGVuZ3RoOwotCQlpZiAoKCpvZmZzZXQgKyBsZW5ndGgpIDwgY2ItPmJ1Zl9pZHgpIHsKLQkJCSpvZmZzZXQgKz0gbGVuZ3RoOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci1mcmVlOgotCWRldl9kYmcoZGV2LT5kZXYsICJmcmVlIGFtdGhpZiBjYiBtZW1vcnkuXG4iKTsKLQkqb2Zmc2V0ID0gMDsKLQltZWlfaW9fY2JfZnJlZShjYik7CiBvdXQ6Ci0JcmV0dXJuIHJldHM7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKKwlyZXR1cm4gcmV0OwogfQogCiAvKioKICAqIG1laV9hbXRoaWZfcmVhZF9zdGFydCAtIHF1ZXVlIG1lc3NhZ2UgZm9yIHNlbmRpbmcgcmVhZCBjcmVkZW50aWFsCiAgKgogICogQGNsOiBob3N0IGNsaWVudAotICogQGZpbGU6IGZpbGUgcG9pbnRlciBvZiBtZXNzYWdlIHJlY2lwaWVudAorICogQGZwOiBmaWxlIHBvaW50ZXIgb2YgbWVzc2FnZSByZWNpcGllbnQKICAqCiAgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgPDAgb24gZmFpbHVyZS4KICAqLwotc3RhdGljIGludCBtZWlfYW10aGlmX3JlYWRfc3RhcnQoc3RydWN0IG1laV9jbCAqY2wsIGNvbnN0IHN0cnVjdCBmaWxlICpmaWxlKQorc3RhdGljIGludCBtZWlfYW10aGlmX3JlYWRfc3RhcnQoc3RydWN0IG1laV9jbCAqY2wsIGNvbnN0IHN0cnVjdCBmaWxlICpmcCkKIHsKIAlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2ID0gY2wtPmRldjsKIAlzdHJ1Y3QgbWVpX2NsX2NiICpjYjsKLQlpbnQgcmV0czsKIAotCWNiID0gbWVpX2lvX2NiX2luaXQoY2wsIE1FSV9GT1BfUkVBRCwgZmlsZSk7Ci0JaWYgKCFjYikgewotCQlyZXRzID0gLUVOT01FTTsKLQkJZ290byBlcnI7Ci0JfQorCWNiID0gbWVpX2NsX2VucXVldWVfY3RybF93cl9jYihjbCwgbWVpX2NsX210dShjbCksIE1FSV9GT1BfUkVBRCwgZnApOworCWlmICghY2IpCisJCXJldHVybiAtRU5PTUVNOwogCi0JcmV0cyA9IG1laV9pb19jYl9hbGxvY19idWYoY2IsIG1laV9jbF9tdHUoY2wpKTsKLQlpZiAocmV0cykKLQkJZ290byBlcnI7Ci0KLQlsaXN0X2FkZF90YWlsKCZjYi0+bGlzdCwgJmRldi0+Y3RybF93cl9saXN0Lmxpc3QpOworCWNsLT5yeF9mbG93X2N0cmxfY3JlZHMrKzsKIAogCWRldi0+aWFtdGhpZl9zdGF0ZSA9IE1FSV9JQU1USElGX1JFQURJTkc7Ci0JZGV2LT5pYW10aGlmX2ZwID0gY2ItPmZwOwotCWRldi0+aWFtdGhpZl9jdXJyZW50X2NiID0gY2I7Ci0KLQlyZXR1cm4gMDsKLWVycjoKLQltZWlfaW9fY2JfZnJlZShjYik7Ci0JcmV0dXJuIHJldHM7Ci19Ci0KLS8qKgotICogbWVpX2FtdGhpZl9zZW5kX2NtZCAtIHNlbmQgYW10aGlmIGNvbW1hbmQgdG8gdGhlIE1FCi0gKgotICogQGNsOiB0aGUgaG9zdCBjbGllbnQKLSAqIEBjYjogbWVpIGNhbGwgYmFjayBzdHJ1Y3QKLSAqCi0gKiBSZXR1cm46IDAgb24gc3VjY2VzcywgPDAgb24gZmFpbHVyZS4KLSAqLwotc3RhdGljIGludCBtZWlfYW10aGlmX3NlbmRfY21kKHN0cnVjdCBtZWlfY2wgKmNsLCBzdHJ1Y3QgbWVpX2NsX2NiICpjYikKLXsKLQlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2OwotCWludCByZXQ7Ci0KLQlpZiAoIWNsLT5kZXYgfHwgIWNiKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWRldiA9IGNsLT5kZXY7Ci0KLQlkZXYtPmlhbXRoaWZfc3RhdGUgPSBNRUlfSUFNVEhJRl9XUklUSU5HOwotCWRldi0+aWFtdGhpZl9jdXJyZW50X2NiID0gY2I7Ci0JZGV2LT5pYW10aGlmX2ZwID0gY2ItPmZwOwotCWRldi0+aWFtdGhpZl9jYW5jZWxlZCA9IGZhbHNlOwotCi0JcmV0ID0gbWVpX2NsX3dyaXRlKGNsLCBjYiwgZmFsc2UpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKGNiLT5jb21wbGV0ZWQpCi0JCWNiLT5zdGF0dXMgPSBtZWlfYW10aGlmX3JlYWRfc3RhcnQoY2wsIGNiLT5mcCk7CisJY2wtPmZwID0gY2ItPmZwOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNjUsMjAgKzEyNiwzMiBAQAogewogCXN0cnVjdCBtZWlfY2wgKmNsID0gJmRldi0+aWFtdGhpZl9jbDsKIAlzdHJ1Y3QgbWVpX2NsX2NiICpjYjsKKwlpbnQgcmV0OwogCiAJZGV2LT5pYW10aGlmX2NhbmNlbGVkID0gZmFsc2U7Ci0JZGV2LT5pYW10aGlmX3N0YXRlID0gTUVJX0lBTVRISUZfSURMRTsKLQlkZXYtPmlhbXRoaWZfZnAgPSBOVUxMOwogCiAJZGV2X2RiZyhkZXYtPmRldiwgImNvbXBsZXRlIGFtdGhpZiBjbWRfbGlzdCBjYi5cbiIpOwogCiAJY2IgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmRldi0+YW10aGlmX2NtZF9saXN0Lmxpc3QsCiAJCQkJCXR5cGVvZigqY2IpLCBsaXN0KTsKLQlpZiAoIWNiKQorCWlmICghY2IpIHsKKwkJZGV2LT5pYW10aGlmX3N0YXRlID0gTUVJX0lBTVRISUZfSURMRTsKKwkJY2wtPmZwID0gTlVMTDsKIAkJcmV0dXJuIDA7CisJfQogCiAJbGlzdF9kZWxfaW5pdCgmY2ItPmxpc3QpOwotCXJldHVybiBtZWlfYW10aGlmX3NlbmRfY21kKGNsLCBjYik7CisJZGV2LT5pYW10aGlmX3N0YXRlID0gTUVJX0lBTVRISUZfV1JJVElORzsKKwljbC0+ZnAgPSBjYi0+ZnA7CisKKwlyZXQgPSBtZWlfY2xfd3JpdGUoY2wsIGNiLCBmYWxzZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoY2ItPmNvbXBsZXRlZCkKKwkJY2ItPnN0YXR1cyA9IG1laV9hbXRoaWZfcmVhZF9zdGFydChjbCwgY2ItPmZwKTsKKworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTI5OSw4ICsxNzIsNyBAQAogCS8qCiAJICogVGhlIHByZXZpb3VzIHJlcXVlc3QgaXMgc3RpbGwgaW4gcHJvY2Vzc2luZywgcXVldWUgdGhpcyBvbmUuCiAJICovCi0JaWYgKGRldi0+aWFtdGhpZl9zdGF0ZSA+IE1FSV9JQU1USElGX0lETEUgJiYKLQkgICAgZGV2LT5pYW10aGlmX3N0YXRlIDwgTUVJX0lBTVRISUZfUkVBRF9DT01QTEVURSkKKwlpZiAoZGV2LT5pYW10aGlmX3N0YXRlICE9IE1FSV9JQU1USElGX0lETEUpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIG1laV9hbXRoaWZfcnVuX25leHRfY21kKGRldik7CkBAIC0zMDksNyArMTgxLDYgQEAKIC8qKgogICogbWVpX2FtdGhpZl9wb2xsIC0gdGhlIGFtdGhpZiBwb2xsIGZ1bmN0aW9uCiAgKgotICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKICAqIEBmaWxlOiBwb2ludGVyIHRvIGZpbGUgc3RydWN0dXJlCiAgKiBAd2FpdDogcG9pbnRlciB0byBwb2xsX3RhYmxlIHN0cnVjdHVyZQogICoKQEAgLTMxNywyNiArMTg4LDE5IEBACiAgKgogICogTG9ja2luZzogY2FsbGVkIHVuZGVyICJkZXYtPmRldmljZV9sb2NrIiBsb2NrCiAgKi8KLQotdW5zaWduZWQgaW50IG1laV9hbXRoaWZfcG9sbChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LAotCQlzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3Vuc2lnbmVkIGludCBtZWlfYW10aGlmX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCiB7CisJc3RydWN0IG1laV9jbCAqY2wgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IG1laV9jbF9jYiAqY2IgPSBtZWlfY2xfcmVhZF9jYihjbCwgZmlsZSk7CiAJdW5zaWduZWQgaW50IG1hc2sgPSAwOwogCi0JcG9sbF93YWl0KGZpbGUsICZkZXYtPmlhbXRoaWZfY2wucnhfd2FpdCwgd2FpdCk7Ci0KLQlpZiAoZGV2LT5pYW10aGlmX3N0YXRlID09IE1FSV9JQU1USElGX1JFQURfQ09NUExFVEUgJiYKLQkgICAgZGV2LT5pYW10aGlmX2ZwID09IGZpbGUpIHsKLQorCXBvbGxfd2FpdChmaWxlLCAmY2wtPnJ4X3dhaXQsIHdhaXQpOworCWlmIChjYikKIAkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOwotCQltZWlfYW10aGlmX3J1bl9uZXh0X2NtZChkZXYpOwotCX0KIAogCXJldHVybiBtYXNrOwogfQogCi0KLQogLyoqCiAgKiBtZWlfYW10aGlmX2lycV93cml0ZSAtIHdyaXRlIGlhbXRoaWYgY29tbWFuZCBpbiBpcnEgdGhyZWFkIGNvbnRleHQuCiAgKgpAQCAtMzkzLDcgKzI1Nyw2IEBACiAJCXJldHVybiAwOwogCiAJZGV2X2RiZyhkZXYtPmRldiwgImNvbXBsZXRlZCBhbXRoaWYgcmVhZC5cbiAiKTsKLQlkZXYtPmlhbXRoaWZfY3VycmVudF9jYiA9IE5VTEw7CiAJZGV2LT5pYW10aGlmX3N0YWxsX3RpbWVyID0gMDsKIAogCXJldHVybiAwOwpAQCAtNDA5LDExNSArMjcyLDYzIEBACiB7CiAJc3RydWN0IG1laV9kZXZpY2UgKmRldiA9IGNsLT5kZXY7CiAKLQlpZiAoY2ItPmZvcF90eXBlID09IE1FSV9GT1BfV1JJVEUpIHsKKwlkZXZfZGJnKGRldi0+ZGV2LCAiY29tcGxldGluZyBhbXRoaWYgY2FsbCBiYWNrLlxuIik7CisJc3dpdGNoIChjYi0+Zm9wX3R5cGUpIHsKKwljYXNlIE1FSV9GT1BfV1JJVEU6CiAJCWlmICghY2ItPnN0YXR1cykgewogCQkJZGV2LT5pYW10aGlmX3N0YWxsX3RpbWVyID0gTUVJX0lBTVRISUZfU1RBTExfVElNRVI7CisJCQltZWlfc2NoZWR1bGVfc3RhbGxfdGltZXIoZGV2KTsKIAkJCW1laV9pb19jYl9mcmVlKGNiKTsKIAkJCXJldHVybjsKIAkJfQotCQkvKgotCQkgKiBpbiBjYXNlIG9mIGVycm9yIGVucXVldWUgdGhlIHdyaXRlIGNiIHRvIGNvbXBsZXRlIHJlYWQgbGlzdAotCQkgKiBzbyBpdCBjYW4gYmUgcHJvcGFnYXRlZCB0byB0aGUgcmVhZGVyCi0JCSAqLwotCQlsaXN0X2FkZF90YWlsKCZjYi0+bGlzdCwgJmNsLT5yZF9jb21wbGV0ZWQpOwotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNsLT5yeF93YWl0KTsKLQkJcmV0dXJuOwotCX0KKwkJZGV2LT5pYW10aGlmX3N0YXRlID0gTUVJX0lBTVRISUZfSURMRTsKKwkJY2wtPmZwID0gTlVMTDsKKwkJaWYgKCFkZXYtPmlhbXRoaWZfY2FuY2VsZWQpIHsKKwkJCS8qCisJCQkgKiBpbiBjYXNlIG9mIGVycm9yIGVucXVldWUgdGhlIHdyaXRlIGNiIHRvIGNvbXBsZXRlCisJCQkgKiByZWFkIGxpc3Qgc28gaXQgY2FuIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIHJlYWRlcgorCQkJICovCisJCQlsaXN0X2FkZF90YWlsKCZjYi0+bGlzdCwgJmNsLT5yZF9jb21wbGV0ZWQpOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjbC0+cnhfd2FpdCk7CisJCX0gZWxzZSB7CisJCQltZWlfaW9fY2JfZnJlZShjYik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBNRUlfRk9QX1JFQUQ6CisJCWlmICghZGV2LT5pYW10aGlmX2NhbmNlbGVkKSB7CisJCQlsaXN0X2FkZF90YWlsKCZjYi0+bGlzdCwgJmNsLT5yZF9jb21wbGV0ZWQpOworCQkJZGV2X2RiZyhkZXYtPmRldiwgImFtdGhpZiByZWFkIGNvbXBsZXRlZFxuIik7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNsLT5yeF93YWl0KTsKKwkJfSBlbHNlIHsKKwkJCW1laV9pb19jYl9mcmVlKGNiKTsKKwkJfQogCi0JaWYgKCFkZXYtPmlhbXRoaWZfY2FuY2VsZWQpIHsKLQkJZGV2LT5pYW10aGlmX3N0YXRlID0gTUVJX0lBTVRISUZfUkVBRF9DT01QTEVURTsKIAkJZGV2LT5pYW10aGlmX3N0YWxsX3RpbWVyID0gMDsKLQkJbGlzdF9hZGRfdGFpbCgmY2ItPmxpc3QsICZjbC0+cmRfY29tcGxldGVkKTsKLQkJZGV2X2RiZyhkZXYtPmRldiwgImFtdGhpZiByZWFkIGNvbXBsZXRlZFxuIik7Ci0JfSBlbHNlIHsKIAkJbWVpX2FtdGhpZl9ydW5fbmV4dF9jbWQoZGV2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTl9PTigxKTsKIAl9Ci0KLQlkZXZfZGJnKGRldi0+ZGV2LCAiY29tcGxldGluZyBhbXRoaWYgY2FsbCBiYWNrLlxuIik7Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjbC0+cnhfd2FpdCk7CiB9CiAKIC8qKgogICogbWVpX2NsZWFyX2xpc3QgLSByZW1vdmVzIGFsbCBjYWxsYmFja3MgYXNzb2NpYXRlZCB3aXRoIGZpbGUKICAqCQlmcm9tIG1laV9jYl9saXN0CiAgKgotICogQGRldjogZGV2aWNlIHN0cnVjdHVyZS4KICAqIEBmaWxlOiBmaWxlIHN0cnVjdHVyZQogICogQG1laV9jYl9saXN0OiBjYWxsYmFja3MgbGlzdAogICoKICAqIG1laV9jbGVhcl9saXN0IGlzIGNhbGxlZCB0byBjbGVhciByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGZpbGUKICAqIHdoZW4gYXBwbGljYXRpb24gY2FsbHMgY2xvc2UgZnVuY3Rpb24gb3IgQ3RybC1DIHdhcyBwcmVzc2VkCi0gKgotICogUmV0dXJuOiB0cnVlIGlmIGNhbGxiYWNrIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCwgZmFsc2Ugb3RoZXJ3aXNlCiAgKi8KLXN0YXRpYyBib29sIG1laV9jbGVhcl9saXN0KHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsCi0JCWNvbnN0IHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgbGlzdF9oZWFkICptZWlfY2JfbGlzdCkKK3N0YXRpYyB2b2lkIG1laV9jbGVhcl9saXN0KGNvbnN0IHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgc3RydWN0IGxpc3RfaGVhZCAqbWVpX2NiX2xpc3QpCiB7Ci0Jc3RydWN0IG1laV9jbCAqY2wgPSAmZGV2LT5pYW10aGlmX2NsOwogCXN0cnVjdCBtZWlfY2xfY2IgKmNiLCAqbmV4dDsKLQlib29sIHJlbW92ZWQgPSBmYWxzZTsKIAotCS8qIGxpc3QgYWxsIGxpc3QgbWVtYmVyICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNiLCBuZXh0LCBtZWlfY2JfbGlzdCwgbGlzdCkgewotCQkvKiBjaGVjayBpZiBsaXN0IG1lbWJlciBhc3NvY2lhdGVkIHdpdGggYSBmaWxlICovCi0JCWlmIChmaWxlID09IGNiLT5mcCkgewotCQkJLyogY2hlY2sgaWYgY2IgZXF1YWwgdG8gY3VycmVudCBpYW10aGlmIGNiICovCi0JCQlpZiAoZGV2LT5pYW10aGlmX2N1cnJlbnRfY2IgPT0gY2IpIHsKLQkJCQlkZXYtPmlhbXRoaWZfY3VycmVudF9jYiA9IE5VTEw7Ci0JCQkJLyogc2VuZCBmbG93IGNvbnRyb2wgdG8gaWFtdGhpZiBjbGllbnQgKi8KLQkJCQltZWlfaGJtX2NsX2Zsb3dfY29udHJvbF9yZXEoZGV2LCBjbCk7Ci0JCQl9Ci0JCQkvKiBmcmVlIGFsbCBhbGxvY2F0ZWQgYnVmZmVycyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjYiwgbmV4dCwgbWVpX2NiX2xpc3QsIGxpc3QpCisJCWlmIChmaWxlID09IGNiLT5mcCkKIAkJCW1laV9pb19jYl9mcmVlKGNiKTsKLQkJCXJlbW92ZWQgPSB0cnVlOwotCQl9Ci0JfQotCXJldHVybiByZW1vdmVkOwotfQotCi0vKioKLSAqIG1laV9jbGVhcl9saXN0cyAtIHJlbW92ZXMgYWxsIGNhbGxiYWNrcyBhc3NvY2lhdGVkIHdpdGggZmlsZQotICoKLSAqIEBkZXY6IGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBmaWxlOiBmaWxlIHN0cnVjdHVyZQotICoKLSAqIG1laV9jbGVhcl9saXN0cyBpcyBjYWxsZWQgdG8gY2xlYXIgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBmaWxlCi0gKiB3aGVuIGFwcGxpY2F0aW9uIGNhbGxzIGNsb3NlIGZ1bmN0aW9uIG9yIEN0cmwtQyB3YXMgcHJlc3NlZAotICoKLSAqIFJldHVybjogdHJ1ZSBpZiBjYWxsYmFjayByZW1vdmVkIGZyb20gdGhlIGxpc3QsIGZhbHNlIG90aGVyd2lzZQotICovCi1zdGF0aWMgYm9vbCBtZWlfY2xlYXJfbGlzdHMoc3RydWN0IG1laV9kZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JYm9vbCByZW1vdmVkID0gZmFsc2U7Ci0Jc3RydWN0IG1laV9jbCAqY2wgPSAmZGV2LT5pYW10aGlmX2NsOwotCi0JLyogcmVtb3ZlIGNhbGxiYWNrcyBhc3NvY2lhdGVkIHdpdGggYSBmaWxlICovCi0JbWVpX2NsZWFyX2xpc3QoZGV2LCBmaWxlLCAmZGV2LT5hbXRoaWZfY21kX2xpc3QubGlzdCk7Ci0JaWYgKG1laV9jbGVhcl9saXN0KGRldiwgZmlsZSwgJmNsLT5yZF9jb21wbGV0ZWQpKQotCQlyZW1vdmVkID0gdHJ1ZTsKLQotCW1laV9jbGVhcl9saXN0KGRldiwgZmlsZSwgJmRldi0+Y3RybF9yZF9saXN0Lmxpc3QpOwotCi0JaWYgKG1laV9jbGVhcl9saXN0KGRldiwgZmlsZSwgJmRldi0+Y3RybF93cl9saXN0Lmxpc3QpKQotCQlyZW1vdmVkID0gdHJ1ZTsKLQotCWlmIChtZWlfY2xlYXJfbGlzdChkZXYsIGZpbGUsICZkZXYtPndyaXRlX3dhaXRpbmdfbGlzdC5saXN0KSkKLQkJcmVtb3ZlZCA9IHRydWU7Ci0KLQlpZiAobWVpX2NsZWFyX2xpc3QoZGV2LCBmaWxlLCAmZGV2LT53cml0ZV9saXN0Lmxpc3QpKQotCQlyZW1vdmVkID0gdHJ1ZTsKLQotCS8qIGNoZWNrIGlmIGlhbXRoaWZfY3VycmVudF9jYiBub3QgTlVMTCAqLwotCWlmIChkZXYtPmlhbXRoaWZfY3VycmVudF9jYiAmJiAhcmVtb3ZlZCkgewotCQkvKiBjaGVjayBmaWxlIGFuZCBpYW10aGlmIGN1cnJlbnQgY2IgYXNzb2NpYXRpb24gKi8KLQkJaWYgKGRldi0+aWFtdGhpZl9jdXJyZW50X2NiLT5mcCA9PSBmaWxlKSB7Ci0JCQkvKiByZW1vdmUgY2IgKi8KLQkJCW1laV9pb19jYl9mcmVlKGRldi0+aWFtdGhpZl9jdXJyZW50X2NiKTsKLQkJCWRldi0+aWFtdGhpZl9jdXJyZW50X2NiID0gTlVMTDsKLQkJCXJlbW92ZWQgPSB0cnVlOwotCQl9Ci0JfQotCXJldHVybiByZW1vdmVkOwogfQogCiAvKioKQEAgLTUzMCwyMyArMzQxLDIxIEBACiAqLwogaW50IG1laV9hbXRoaWZfcmVsZWFzZShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKKwlzdHJ1Y3QgbWVpX2NsICpjbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwogCWlmIChkZXYtPmlhbXRoaWZfb3Blbl9jb3VudCA+IDApCiAJCWRldi0+aWFtdGhpZl9vcGVuX2NvdW50LS07CiAKLQlpZiAoZGV2LT5pYW10aGlmX2ZwID09IGZpbGUgJiYKLQkgICAgZGV2LT5pYW10aGlmX3N0YXRlICE9IE1FSV9JQU1USElGX0lETEUpIHsKKwlpZiAoY2wtPmZwID09IGZpbGUgJiYgZGV2LT5pYW10aGlmX3N0YXRlICE9IE1FSV9JQU1USElGX0lETEUpIHsKIAogCQlkZXZfZGJnKGRldi0+ZGV2LCAiYW10aGlmIGNhbmNlbGVkIGlhbXRoaWYgc3RhdGUgJWRcbiIsCiAJCSAgICBkZXYtPmlhbXRoaWZfc3RhdGUpOwogCQlkZXYtPmlhbXRoaWZfY2FuY2VsZWQgPSB0cnVlOwotCQlpZiAoZGV2LT5pYW10aGlmX3N0YXRlID09IE1FSV9JQU1USElGX1JFQURfQ09NUExFVEUpIHsKLQkJCWRldl9kYmcoZGV2LT5kZXYsICJydW4gbmV4dCBhbXRoaWYgaWFtdGhpZiBjYlxuIik7Ci0JCQltZWlfYW10aGlmX3J1bl9uZXh0X2NtZChkZXYpOwotCQl9CiAJfQogCi0JaWYgKG1laV9jbGVhcl9saXN0cyhkZXYsIGZpbGUpKQotCQlkZXYtPmlhbXRoaWZfc3RhdGUgPSBNRUlfSUFNVEhJRl9JRExFOworCW1laV9jbGVhcl9saXN0KGZpbGUsICZkZXYtPmFtdGhpZl9jbWRfbGlzdC5saXN0KTsKKwltZWlfY2xlYXJfbGlzdChmaWxlLCAmY2wtPnJkX2NvbXBsZXRlZCk7CisJbWVpX2NsZWFyX2xpc3QoZmlsZSwgJmRldi0+Y3RybF9yZF9saXN0Lmxpc3QpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL2J1cy5jIGIvZHJpdmVycy9taXNjL21laS9idXMuYwppbmRleCAxZjMzZmVhLi44Y2FjN2VmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL2J1cy5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvYnVzLmMKQEAgLTEyNiw3ICsxMjYsOCBAQAogCQlnb3RvIG91dDsKIAogCS8qIHdhaXQgb24gZXZlbnQgb25seSBpZiB0aGVyZSBpcyBubyBvdGhlciB3YWl0ZXIgKi8KLQlpZiAobGlzdF9lbXB0eSgmY2wtPnJkX2NvbXBsZXRlZCkgJiYgIXdhaXRxdWV1ZV9hY3RpdmUoJmNsLT5yeF93YWl0KSkgeworCS8qIHN5bmNocm9uaXplZCB1bmRlciBkZXZpY2UgbXV0ZXggKi8KKwlpZiAoIXdhaXRxdWV1ZV9hY3RpdmUoJmNsLT5yeF93YWl0KSkgewogCiAJCW11dGV4X3VubG9jaygmYnVzLT5kZXZpY2VfbG9jayk7CiAKQEAgLTE0Miw3ICsxNDMsNyBAQAogCQltdXRleF9sb2NrKCZidXMtPmRldmljZV9sb2NrKTsKIAogCQlpZiAoIW1laV9jbF9pc19jb25uZWN0ZWQoY2wpKSB7Ci0JCQlyZXRzID0gLUVCVVNZOworCQkJcmV0cyA9IC1FTk9ERVY7CiAJCQlnb3RvIG91dDsKIAkJfQogCX0KQEAgLTIzNCw3ICsyMzUsNyBAQAogCS8qIFByZXBhcmUgZm9yIHRoZSBuZXh0IHJlYWQgKi8KIAlpZiAoY2xkZXYtPmV2ZW50c19tYXNrICYgQklUKE1FSV9DTF9FVkVOVF9SWCkpIHsKIAkJbXV0ZXhfbG9jaygmYnVzLT5kZXZpY2VfbG9jayk7Ci0JCW1laV9jbF9yZWFkX3N0YXJ0KGNsZGV2LT5jbCwgMCwgTlVMTCk7CisJCW1laV9jbF9yZWFkX3N0YXJ0KGNsZGV2LT5jbCwgbWVpX2NsX210dShjbGRldi0+Y2wpLCBOVUxMKTsKIAkJbXV0ZXhfdW5sb2NrKCZidXMtPmRldmljZV9sb2NrKTsKIAl9CiB9CkBAIC0zMjQsNyArMzI1LDcgQEAKIAogCWlmIChjbGRldi0+ZXZlbnRzX21hc2sgJiBCSVQoTUVJX0NMX0VWRU5UX1JYKSkgewogCQltdXRleF9sb2NrKCZidXMtPmRldmljZV9sb2NrKTsKLQkJcmV0ID0gbWVpX2NsX3JlYWRfc3RhcnQoY2xkZXYtPmNsLCAwLCBOVUxMKTsKKwkJcmV0ID0gbWVpX2NsX3JlYWRfc3RhcnQoY2xkZXYtPmNsLCBtZWlfY2xfbXR1KGNsZGV2LT5jbCksIE5VTEwpOwogCQltdXRleF91bmxvY2soJmJ1cy0+ZGV2aWNlX2xvY2spOwogCQlpZiAocmV0ICYmIHJldCAhPSAtRUJVU1kpCiAJCQlyZXR1cm4gcmV0OwpAQCAtOTgzLDEyICs5ODQsMTAgQEAKIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBtZWlfZGV2aWNlLCBidXNfcmVzY2FuX3dvcmspOwogCXN0cnVjdCBtZWlfbWVfY2xpZW50ICptZV9jbDsKIAotCW11dGV4X2xvY2soJmJ1cy0+ZGV2aWNlX2xvY2spOwogCW1lX2NsID0gbWVpX21lX2NsX2J5X3V1aWQoYnVzLCAmbWVpX2FtdGhpZl9ndWlkKTsKIAlpZiAobWVfY2wpCiAJCW1laV9hbXRoaWZfaG9zdF9pbml0KGJ1cywgbWVfY2wpOwogCW1laV9tZV9jbF9wdXQobWVfY2wpOwotCW11dGV4X3VubG9jaygmYnVzLT5kZXZpY2VfbG9jayk7CiAKIAltZWlfY2xfYnVzX3Jlc2NhbihidXMpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9jbGllbnQuYyBiL2RyaXZlcnMvbWlzYy9tZWkvY2xpZW50LmMKaW5kZXggNjQxYzFhNS4uNmZlMDIzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9jbGllbnQuYworKysgYi9kcml2ZXJzL21pc2MvbWVpL2NsaWVudC5jCkBAIC0zNTgsOCArMzU4LDkgQEAKICAqCiAgKiBSZXR1cm46IG1laV9jbF9jYiBwb2ludGVyIG9yIE5VTEw7CiAgKi8KLXN0cnVjdCBtZWlfY2xfY2IgKm1laV9pb19jYl9pbml0KHN0cnVjdCBtZWlfY2wgKmNsLCBlbnVtIG1laV9jYl9maWxlX29wcyB0eXBlLAotCQkJCSBjb25zdCBzdHJ1Y3QgZmlsZSAqZnApCitzdGF0aWMgc3RydWN0IG1laV9jbF9jYiAqbWVpX2lvX2NiX2luaXQoc3RydWN0IG1laV9jbCAqY2wsCisJCQkJCWVudW0gbWVpX2NiX2ZpbGVfb3BzIHR5cGUsCisJCQkJCWNvbnN0IHN0cnVjdCBmaWxlICpmcCkKIHsKIAlzdHJ1Y3QgbWVpX2NsX2NiICpjYjsKIApAQCAtNDIwLDMxICs0MjEsNiBAQAogfQogCiAvKioKLSAqIG1laV9pb19jYl9hbGxvY19idWYgLSBhbGxvY2F0ZSBjYWxsYmFjayBidWZmZXIKLSAqCi0gKiBAY2I6IGlvIGNhbGxiYWNrIHN0cnVjdHVyZQotICogQGxlbmd0aDogc2l6ZSBvZiB0aGUgYnVmZmVyCi0gKgotICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MKLSAqICAgICAgICAgLUVJTlZBTCBpZiBjYiBpcyBOVUxMCi0gKiAgICAgICAgIC1FTk9NRU0gaWYgYWxsb2NhdGlvbiBmYWlsZWQKLSAqLwotaW50IG1laV9pb19jYl9hbGxvY19idWYoc3RydWN0IG1laV9jbF9jYiAqY2IsIHNpemVfdCBsZW5ndGgpCi17Ci0JaWYgKCFjYikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAobGVuZ3RoID09IDApCi0JCXJldHVybiAwOwotCi0JY2ItPmJ1Zi5kYXRhID0ga21hbGxvYyhsZW5ndGgsIEdGUF9LRVJORUwpOwotCWlmICghY2ItPmJ1Zi5kYXRhKQotCQlyZXR1cm4gLUVOT01FTTsKLQljYi0+YnVmLnNpemUgPSBsZW5ndGg7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgogICogbWVpX2NsX2FsbG9jX2NiIC0gYSBjb252ZW5pZW50IHdyYXBwZXIgZm9yIGFsbG9jYXRpbmcgcmVhZCBjYgogICoKICAqIEBjbDogaG9zdCBjbGllbnQKQEAgLTQ1NSwyNCArNDMxLDU5IEBACiAgKiBSZXR1cm46IGNiIG9uIHN1Y2Nlc3MgYW5kIE5VTEwgb24gZmFpbHVyZQogICovCiBzdHJ1Y3QgbWVpX2NsX2NiICptZWlfY2xfYWxsb2NfY2Ioc3RydWN0IG1laV9jbCAqY2wsIHNpemVfdCBsZW5ndGgsCi0JCQkJICBlbnVtIG1laV9jYl9maWxlX29wcyB0eXBlLAorCQkJCSAgZW51bSBtZWlfY2JfZmlsZV9vcHMgZm9wX3R5cGUsCiAJCQkJICBjb25zdCBzdHJ1Y3QgZmlsZSAqZnApCiB7CiAJc3RydWN0IG1laV9jbF9jYiAqY2I7CiAKLQljYiA9IG1laV9pb19jYl9pbml0KGNsLCB0eXBlLCBmcCk7CisJY2IgPSBtZWlfaW9fY2JfaW5pdChjbCwgZm9wX3R5cGUsIGZwKTsKIAlpZiAoIWNiKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmIChtZWlfaW9fY2JfYWxsb2NfYnVmKGNiLCBsZW5ndGgpKSB7CisJaWYgKGxlbmd0aCA9PSAwKQorCQlyZXR1cm4gY2I7CisKKwljYi0+YnVmLmRhdGEgPSBrbWFsbG9jKGxlbmd0aCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjYi0+YnVmLmRhdGEpIHsKIAkJbWVpX2lvX2NiX2ZyZWUoY2IpOwogCQlyZXR1cm4gTlVMTDsKIAl9CisJY2ItPmJ1Zi5zaXplID0gbGVuZ3RoOwogCiAJcmV0dXJuIGNiOwogfQogCiAvKioKKyAqIG1laV9jbF9lbnF1ZXVlX2N0cmxfd3JfY2IgLSBhIGNvbnZlbmllbnQgd3JhcHBlciBmb3IgYWxsb2NhdGluZworICogICAgIGFuZCBlbnF1ZXVpbmcgb2YgdGhlIGNvbnRyb2wgY29tbWFuZHMgY2IKKyAqCisgKiBAY2w6IGhvc3QgY2xpZW50CisgKiBAbGVuZ3RoOiBzaXplIG9mIHRoZSBidWZmZXIKKyAqIEB0eXBlOiBvcGVyYXRpb24gdHlwZQorICogQGZwOiBhc3NvY2lhdGVkIGZpbGUgcG9pbnRlciAobWlnaHQgYmUgTlVMTCkKKyAqCisgKiBSZXR1cm46IGNiIG9uIHN1Y2Nlc3MgYW5kIE5VTEwgb24gZmFpbHVyZQorICogTG9ja2luZzogY2FsbGVkIHVuZGVyICJkZXYtPmRldmljZV9sb2NrIiBsb2NrCisgKi8KK3N0cnVjdCBtZWlfY2xfY2IgKm1laV9jbF9lbnF1ZXVlX2N0cmxfd3JfY2Ioc3RydWN0IG1laV9jbCAqY2wsIHNpemVfdCBsZW5ndGgsCisJCQkJCSAgICBlbnVtIG1laV9jYl9maWxlX29wcyBmb3BfdHlwZSwKKwkJCQkJICAgIGNvbnN0IHN0cnVjdCBmaWxlICpmcCkKK3sKKwlzdHJ1Y3QgbWVpX2NsX2NiICpjYjsKKworCS8qIGZvciBSWCBhbHdheXMgYWxsb2NhdGUgYXQgbGVhc3QgY2xpZW50J3MgbXR1ICovCisJaWYgKGxlbmd0aCkKKwkJbGVuZ3RoID0gbWF4X3Qoc2l6ZV90LCBsZW5ndGgsIG1laV9jbF9tdHUoY2wpKTsKKworCWNiID0gbWVpX2NsX2FsbG9jX2NiKGNsLCBsZW5ndGgsIGZvcF90eXBlLCBmcCk7CisJaWYgKCFjYikKKwkJcmV0dXJuIE5VTEw7CisKKwlsaXN0X2FkZF90YWlsKCZjYi0+bGlzdCwgJmNsLT5kZXYtPmN0cmxfd3JfbGlzdC5saXN0KTsKKwlyZXR1cm4gY2I7Cit9CisKKy8qKgogICogbWVpX2NsX3JlYWRfY2IgLSBmaW5kIHRoaXMgY2wncyBjYWxsYmFjayBpbiB0aGUgcmVhZCBsaXN0CiAgKiAgICAgZm9yIGEgc3BlY2lmaWMgZmlsZQogICoKQEAgLTc1NCw3ICs3NjUsOCBAQAogCW1laV9pb19saXN0X2ZsdXNoKCZkZXYtPmN0cmxfcmRfbGlzdCwgY2wpOwogCW1laV9pb19saXN0X2ZsdXNoKCZkZXYtPmN0cmxfd3JfbGlzdCwgY2wpOwogCW1laV9jbF93YWtlX2FsbChjbCk7Ci0JY2wtPm1laV9mbG93X2N0cmxfY3JlZHMgPSAwOworCWNsLT5yeF9mbG93X2N0cmxfY3JlZHMgPSAwOworCWNsLT50eF9mbG93X2N0cmxfY3JlZHMgPSAwOwogCWNsLT50aW1lcl9jb3VudCA9IDA7CiAKIAlpZiAoIWNsLT5tZV9jbCkKQEAgLTc2NCw3ICs3NzYsNyBAQAogCQljbC0+bWVfY2wtPmNvbm5lY3RfY291bnQtLTsKIAogCWlmIChjbC0+bWVfY2wtPmNvbm5lY3RfY291bnQgPT0gMCkKLQkJY2wtPm1lX2NsLT5tZWlfZmxvd19jdHJsX2NyZWRzID0gMDsKKwkJY2wtPm1lX2NsLT50eF9mbG93X2N0cmxfY3JlZHMgPSAwOwogCiAJbWVpX21lX2NsX3B1dChjbC0+bWVfY2wpOwogCWNsLT5tZV9jbCA9IE5VTEw7CkBAIC04MTQsNiArODI2LDcgQEAKIAogCWxpc3RfbW92ZV90YWlsKCZjYi0+bGlzdCwgJmRldi0+Y3RybF9yZF9saXN0Lmxpc3QpOwogCWNsLT50aW1lcl9jb3VudCA9IE1FSV9DT05ORUNUX1RJTUVPVVQ7CisJbWVpX3NjaGVkdWxlX3N0YWxsX3RpbWVyKGRldik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTg2NywxMyArODgwLDExIEBACiAKIAljbC0+c3RhdGUgPSBNRUlfRklMRV9ESVNDT05ORUNUSU5HOwogCi0JY2IgPSBtZWlfaW9fY2JfaW5pdChjbCwgTUVJX0ZPUF9ESVNDT05ORUNULCBOVUxMKTsKLQlyZXRzID0gY2IgPyAwIDogLUVOT01FTTsKLQlpZiAocmV0cykKKwljYiA9IG1laV9jbF9lbnF1ZXVlX2N0cmxfd3JfY2IoY2wsIDAsIE1FSV9GT1BfRElTQ09OTkVDVCwgTlVMTCk7CisJaWYgKCFjYikgeworCQlyZXRzID0gLUVOT01FTTsKIAkJZ290byBvdXQ7Ci0KLQljbF9kYmcoZGV2LCBjbCwgImFkZCBkaXNjb25uZWN0IGNiIHRvIGNvbnRyb2wgd3JpdGUgbGlzdFxuIik7Ci0JbGlzdF9hZGRfdGFpbCgmY2ItPmxpc3QsICZkZXYtPmN0cmxfd3JfbGlzdC5saXN0KTsKKwl9CiAKIAlpZiAobWVpX2hidWZfYWNxdWlyZShkZXYpKSB7CiAJCXJldHMgPSBtZWlfY2xfc2VuZF9kaXNjb25uZWN0KGNsLCBjYik7CkBAIC0xMDAxLDYgKzEwMTIsNyBAQAogCiAJbGlzdF9tb3ZlX3RhaWwoJmNiLT5saXN0LCAmZGV2LT5jdHJsX3JkX2xpc3QubGlzdCk7CiAJY2wtPnRpbWVyX2NvdW50ID0gTUVJX0NPTk5FQ1RfVElNRU9VVDsKKwltZWlfc2NoZWR1bGVfc3RhbGxfdGltZXIoZGV2KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTA0MiwxNCArMTA1NCwxNCBAQAogICoKICAqIEBjbDogaG9zdCBjbGllbnQKICAqIEBtZV9jbDogbWUgY2xpZW50Ci0gKiBAZmlsZTogcG9pbnRlciB0byBmaWxlIHN0cnVjdHVyZQorICogQGZwOiBwb2ludGVyIHRvIGZpbGUgc3RydWN0dXJlCiAgKgogICogTG9ja2luZzogY2FsbGVkIHVuZGVyICJkZXYtPmRldmljZV9sb2NrIiBsb2NrCiAgKgogICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGZhaWx1cmUuCiAgKi8KIGludCBtZWlfY2xfY29ubmVjdChzdHJ1Y3QgbWVpX2NsICpjbCwgc3RydWN0IG1laV9tZV9jbGllbnQgKm1lX2NsLAotCQkgIGNvbnN0IHN0cnVjdCBmaWxlICpmaWxlKQorCQkgICBjb25zdCBzdHJ1Y3QgZmlsZSAqZnApCiB7CiAJc3RydWN0IG1laV9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgbWVpX2NsX2NiICpjYjsKQEAgLTEwNzYsMTIgKzEwODgsMTEgQEAKIAkJZ290byBub3J0cG07CiAJfQogCi0JY2IgPSBtZWlfaW9fY2JfaW5pdChjbCwgTUVJX0ZPUF9DT05ORUNULCBmaWxlKTsKLQlyZXRzID0gY2IgPyAwIDogLUVOT01FTTsKLQlpZiAocmV0cykKKwljYiA9IG1laV9jbF9lbnF1ZXVlX2N0cmxfd3JfY2IoY2wsIDAsIE1FSV9GT1BfQ09OTkVDVCwgZnApOworCWlmICghY2IpIHsKKwkJcmV0cyA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwotCi0JbGlzdF9hZGRfdGFpbCgmY2ItPmxpc3QsICZkZXYtPmN0cmxfd3JfbGlzdC5saXN0KTsKKwl9CiAKIAkvKiBydW4gaGJ1ZiBhY3F1aXJlIGxhc3Qgc28gd2UgZG9uJ3QgaGF2ZSB0byB1bmRvICovCiAJaWYgKCFtZWlfY2xfaXNfb3RoZXJfY29ubmVjdGluZyhjbCkgJiYgbWVpX2hidWZfYWNxdWlyZShkZXYpKSB7CkBAIC0xMTU5LDUwICsxMTcwLDQyIEBACiAJcmV0dXJuIEVSUl9QVFIocmV0KTsKIH0KIAotCi0KIC8qKgotICogbWVpX2NsX2Zsb3dfY3RybF9jcmVkcyAtIGNoZWNrcyBmbG93X2NvbnRyb2wgY3JlZGl0cyBmb3IgY2wuCisgKiBtZWlfY2xfdHhfZmxvd19jdHJsX2NyZWRzIC0gY2hlY2tzIGZsb3dfY29udHJvbCBjcmVkaXRzIGZvciBjbC4KICAqCiAgKiBAY2w6IGhvc3QgY2xpZW50Ci0gKiBAZnA6IHRoZSBmaWxlIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb2ludGVyCiAgKgotICogUmV0dXJuOiAxIGlmIG1laV9mbG93X2N0cmxfY3JlZHMgPjAsIDAgLSBvdGhlcndpc2UuCisgKiBSZXR1cm46IDEgaWYgdHhfZmxvd19jdHJsX2NyZWRzID4wLCAwIC0gb3RoZXJ3aXNlLgogICovCi1zdGF0aWMgaW50IG1laV9jbF9mbG93X2N0cmxfY3JlZHMoc3RydWN0IG1laV9jbCAqY2wsIGNvbnN0IHN0cnVjdCBmaWxlICpmcCkKK3N0YXRpYyBpbnQgbWVpX2NsX3R4X2Zsb3dfY3RybF9jcmVkcyhzdHJ1Y3QgbWVpX2NsICpjbCkKIHsKLQlpbnQgcmV0czsKLQogCWlmIChXQVJOX09OKCFjbCB8fCAhY2wtPm1lX2NsKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoY2wtPm1laV9mbG93X2N0cmxfY3JlZHMgPiAwKQorCWlmIChjbC0+dHhfZmxvd19jdHJsX2NyZWRzID4gMCkKIAkJcmV0dXJuIDE7CiAKLQlpZiAobWVpX2NsX2lzX2ZpeGVkX2FkZHJlc3MoY2wpKSB7Ci0JCXJldHMgPSBtZWlfY2xfcmVhZF9zdGFydChjbCwgbWVpX2NsX210dShjbCksIGZwKTsKLQkJaWYgKHJldHMgJiYgcmV0cyAhPSAtRUJVU1kpCi0JCQlyZXR1cm4gcmV0czsKKwlpZiAobWVpX2NsX2lzX2ZpeGVkX2FkZHJlc3MoY2wpKQogCQlyZXR1cm4gMTsKLQl9CiAKIAlpZiAobWVpX2NsX2lzX3NpbmdsZV9yZWN2X2J1ZihjbCkpIHsKLQkJaWYgKGNsLT5tZV9jbC0+bWVpX2Zsb3dfY3RybF9jcmVkcyA+IDApCisJCWlmIChjbC0+bWVfY2wtPnR4X2Zsb3dfY3RybF9jcmVkcyA+IDApCiAJCQlyZXR1cm4gMTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKIC8qKgotICogbWVpX2NsX2Zsb3dfY3RybF9yZWR1Y2UgLSByZWR1Y2VzIGZsb3dfY29udHJvbC4KKyAqIG1laV9jbF90eF9mbG93X2N0cmxfY3JlZHNfcmVkdWNlIC0gcmVkdWNlcyB0cmFuc21pdCBmbG93IGNvbnRyb2wgY3JlZGl0cworICogICBmb3IgYSBjbGllbnQKICAqCi0gKiBAY2w6IHByaXZhdGUgZGF0YSBvZiB0aGUgZmlsZSBvYmplY3QKKyAqIEBjbDogaG9zdCBjbGllbnQKICAqCiAgKiBSZXR1cm46CiAgKgkwIG9uIHN1Y2Nlc3MKICAqCS1FSU5WQUwgd2hlbiBjdHJsIGNyZWRpdHMgYXJlIDw9IDAKICAqLwotc3RhdGljIGludCBtZWlfY2xfZmxvd19jdHJsX3JlZHVjZShzdHJ1Y3QgbWVpX2NsICpjbCkKK3N0YXRpYyBpbnQgbWVpX2NsX3R4X2Zsb3dfY3RybF9jcmVkc19yZWR1Y2Uoc3RydWN0IG1laV9jbCAqY2wpCiB7CiAJaWYgKFdBUk5fT04oIWNsIHx8ICFjbC0+bWVfY2wpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEyMTEsMTMgKzEyMTQsMTMgQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAobWVpX2NsX2lzX3NpbmdsZV9yZWN2X2J1ZihjbCkpIHsKLQkJaWYgKFdBUk5fT04oY2wtPm1lX2NsLT5tZWlfZmxvd19jdHJsX2NyZWRzIDw9IDApKQorCQlpZiAoV0FSTl9PTihjbC0+bWVfY2wtPnR4X2Zsb3dfY3RybF9jcmVkcyA8PSAwKSkKIAkJCXJldHVybiAtRUlOVkFMOwotCQljbC0+bWVfY2wtPm1laV9mbG93X2N0cmxfY3JlZHMtLTsKKwkJY2wtPm1lX2NsLT50eF9mbG93X2N0cmxfY3JlZHMtLTsKIAl9IGVsc2UgewotCQlpZiAoV0FSTl9PTihjbC0+bWVpX2Zsb3dfY3RybF9jcmVkcyA8PSAwKSkKKwkJaWYgKFdBUk5fT04oY2wtPnR4X2Zsb3dfY3RybF9jcmVkcyA8PSAwKSkKIAkJCXJldHVybiAtRUlOVkFMOwotCQljbC0+bWVpX2Zsb3dfY3RybF9jcmVkcy0tOworCQljbC0+dHhfZmxvd19jdHJsX2NyZWRzLS07CiAJfQogCXJldHVybiAwOwogfQpAQCAtMTI5Miw3ICsxMjk1LDcgQEAKICAqIG1laV9jbF9ub3RpZnlfcmVxdWVzdCAtIHNlbmQgbm90aWZpY2F0aW9uIHN0b3Avc3RhcnQgcmVxdWVzdAogICoKICAqIEBjbDogaG9zdCBjbGllbnQKLSAqIEBmaWxlOiBhc3NvY2lhdGUgcmVxdWVzdCB3aXRoIGZpbGUKKyAqIEBmcDogYXNzb2NpYXRlIHJlcXVlc3Qgd2l0aCBmaWxlCiAgKiBAcmVxdWVzdDogMSBmb3Igc3RhcnQgb3IgMCBmb3Igc3RvcAogICoKICAqIExvY2tpbmc6IGNhbGxlZCB1bmRlciAiZGV2LT5kZXZpY2VfbG9jayIgbG9jawpAQCAtMTMwMCw3ICsxMzAzLDcgQEAKICAqIFJldHVybjogMCBvbiBzdWNoIGFuZCBlcnJvciBvdGhlcndpc2UuCiAgKi8KIGludCBtZWlfY2xfbm90aWZ5X3JlcXVlc3Qoc3RydWN0IG1laV9jbCAqY2wsCi0JCQkgIGNvbnN0IHN0cnVjdCBmaWxlICpmaWxlLCB1OCByZXF1ZXN0KQorCQkJICBjb25zdCBzdHJ1Y3QgZmlsZSAqZnAsIHU4IHJlcXVlc3QpCiB7CiAJc3RydWN0IG1laV9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgbWVpX2NsX2NiICpjYjsKQEAgLTEzMjUsNyArMTMyOCw3IEBACiAJfQogCiAJZm9wX3R5cGUgPSBtZWlfY2xfbm90aWZ5X3JlcTJmb3AocmVxdWVzdCk7Ci0JY2IgPSBtZWlfaW9fY2JfaW5pdChjbCwgZm9wX3R5cGUsIGZpbGUpOworCWNiID0gbWVpX2NsX2VucXVldWVfY3RybF93cl9jYihjbCwgMCwgZm9wX3R5cGUsIGZwKTsKIAlpZiAoIWNiKSB7CiAJCXJldHMgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKQEAgLTEzMzYsOSArMTMzOSw3IEBACiAJCQlyZXRzID0gLUVOT0RFVjsKIAkJCWdvdG8gb3V0OwogCQl9Ci0JCWxpc3RfYWRkX3RhaWwoJmNiLT5saXN0LCAmZGV2LT5jdHJsX3JkX2xpc3QubGlzdCk7Ci0JfSBlbHNlIHsKLQkJbGlzdF9hZGRfdGFpbCgmY2ItPmxpc3QsICZkZXYtPmN0cmxfd3JfbGlzdC5saXN0KTsKKwkJbGlzdF9tb3ZlX3RhaWwoJmNiLT5saXN0LCAmZGV2LT5jdHJsX3JkX2xpc3QubGlzdCk7CiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKQEAgLTE0MzYsMjUgKzE0MzcsNiBAQAogfQogCiAvKioKLSAqIG1laV9jbF9pc19yZWFkX2ZjX2NiIC0gY2hlY2sgaWYgcmVhZCBjYiBpcyB3YWl0aW5nIGZvciBmbG93IGNvbnRyb2wKLSAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGdpdmVuIGhvc3QgY2xpZW50Ci0gKgotICogQGNsOiBob3N0IGNsaWVudAotICoKLSAqIFJldHVybjogdHJ1ZSwgaWYgZm91bmQgYXQgbGVhc3Qgb25lIGNiLgotICovCi1zdGF0aWMgYm9vbCBtZWlfY2xfaXNfcmVhZF9mY19jYihzdHJ1Y3QgbWVpX2NsICpjbCkKLXsKLQlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2ID0gY2wtPmRldjsKLQlzdHJ1Y3QgbWVpX2NsX2NiICpjYjsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2IsICZkZXYtPmN0cmxfd3JfbGlzdC5saXN0LCBsaXN0KQotCQlpZiAoY2ItPmZvcF90eXBlID09IE1FSV9GT1BfUkVBRCAmJiBjYi0+Y2wgPT0gY2wpCi0JCQlyZXR1cm4gdHJ1ZTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKgogICogbWVpX2NsX3JlYWRfc3RhcnQgLSB0aGUgc3RhcnQgcmVhZCBjbGllbnQgbWVzc2FnZSBmdW5jdGlvbi4KICAqCiAgKiBAY2w6IGhvc3QgY2xpZW50CkBAIC0xNDc3LDI2ICsxNDU5LDIyIEBACiAJaWYgKCFtZWlfY2xfaXNfY29ubmVjdGVkKGNsKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQkvKiBIVyBjdXJyZW50bHkgc3VwcG9ydHMgb25seSBvbmUgcGVuZGluZyByZWFkICovCi0JaWYgKCFsaXN0X2VtcHR5KCZjbC0+cmRfcGVuZGluZykgfHwgbWVpX2NsX2lzX3JlYWRfZmNfY2IoY2wpKQotCQlyZXR1cm4gLUVCVVNZOwotCiAJaWYgKCFtZWlfbWVfY2xfaXNfYWN0aXZlKGNsLT5tZV9jbCkpIHsKIAkJY2xfZXJyKGRldiwgY2wsICJubyBzdWNoIG1lIGNsaWVudFxuIik7CiAJCXJldHVybiAgLUVOT1RUWTsKIAl9CiAKLQkvKiBhbHdheXMgYWxsb2NhdGUgYXQgbGVhc3QgY2xpZW50IG1heCBtZXNzYWdlICovCi0JbGVuZ3RoID0gbWF4X3Qoc2l6ZV90LCBsZW5ndGgsIG1laV9jbF9tdHUoY2wpKTsKLQljYiA9IG1laV9jbF9hbGxvY19jYihjbCwgbGVuZ3RoLCBNRUlfRk9QX1JFQUQsIGZwKTsKKwlpZiAobWVpX2NsX2lzX2ZpeGVkX2FkZHJlc3MoY2wpIHx8IGNsID09ICZkZXYtPmlhbXRoaWZfY2wpCisJCXJldHVybiAwOworCisJLyogSFcgY3VycmVudGx5IHN1cHBvcnRzIG9ubHkgb25lIHBlbmRpbmcgcmVhZCAqLworCWlmIChjbC0+cnhfZmxvd19jdHJsX2NyZWRzKQorCQlyZXR1cm4gLUVCVVNZOworCisJY2IgPSBtZWlfY2xfZW5xdWV1ZV9jdHJsX3dyX2NiKGNsLCBsZW5ndGgsIE1FSV9GT1BfUkVBRCwgZnApOwogCWlmICghY2IpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaWYgKG1laV9jbF9pc19maXhlZF9hZGRyZXNzKGNsKSkgewotCQlsaXN0X2FkZF90YWlsKCZjYi0+bGlzdCwgJmNsLT5yZF9wZW5kaW5nKTsKLQkJcmV0dXJuIDA7Ci0JfQotCiAJcmV0cyA9IHBtX3J1bnRpbWVfZ2V0KGRldi0+ZGV2KTsKIAlpZiAocmV0cyA8IDAgJiYgcmV0cyAhPSAtRUlOUFJPR1JFU1MpIHsKIAkJcG1fcnVudGltZV9wdXRfbm9pZGxlKGRldi0+ZGV2KTsKQEAgLTE1MDQsMTYgKzE0ODIsMTUgQEAKIAkJZ290byBub3J0cG07CiAJfQogCisJcmV0cyA9IDA7CiAJaWYgKG1laV9oYnVmX2FjcXVpcmUoZGV2KSkgewogCQlyZXRzID0gbWVpX2hibV9jbF9mbG93X2NvbnRyb2xfcmVxKGRldiwgY2wpOwogCQlpZiAocmV0cyA8IDApCiAJCQlnb3RvIG91dDsKIAotCQlsaXN0X2FkZF90YWlsKCZjYi0+bGlzdCwgJmNsLT5yZF9wZW5kaW5nKTsKLQl9IGVsc2UgewotCQlyZXRzID0gMDsKLQkJbGlzdF9hZGRfdGFpbCgmY2ItPmxpc3QsICZkZXYtPmN0cmxfd3JfbGlzdC5saXN0KTsKKwkJbGlzdF9tb3ZlX3RhaWwoJmNiLT5saXN0LCAmY2wtPnJkX3BlbmRpbmcpOwogCX0KKwljbC0+cnhfZmxvd19jdHJsX2NyZWRzKys7CiAKIG91dDoKIAljbF9kYmcoZGV2LCBjbCwgInJwbTogYXV0b3N1c3BlbmRcbiIpOwpAQCAtMTU1Nyw3ICsxNTM0LDcgQEAKIAogCWZpcnN0X2NodW5rID0gY2ItPmJ1Zl9pZHggPT0gMDsKIAotCXJldHMgPSBmaXJzdF9jaHVuayA/IG1laV9jbF9mbG93X2N0cmxfY3JlZHMoY2wsIGNiLT5mcCkgOiAxOworCXJldHMgPSBmaXJzdF9jaHVuayA/IG1laV9jbF90eF9mbG93X2N0cmxfY3JlZHMoY2wpIDogMTsKIAlpZiAocmV0cyA8IDApCiAJCXJldHVybiByZXRzOwogCkBAIC0xNjA1LDcgKzE1ODIsNyBAQAogCWNiLT5jb21wbGV0ZWQgPSBtZWlfaGRyLm1zZ19jb21wbGV0ZSA9PSAxOwogCiAJaWYgKGZpcnN0X2NodW5rKSB7Ci0JCWlmIChtZWlfY2xfZmxvd19jdHJsX3JlZHVjZShjbCkpCisJCWlmIChtZWlfY2xfdHhfZmxvd19jdHJsX2NyZWRzX3JlZHVjZShjbCkpCiAJCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTE2NjMsNyArMTY0MCw3IEBACiAJbWVpX2hkci5tc2dfY29tcGxldGUgPSAwOwogCW1laV9oZHIuaW50ZXJuYWwgPSBjYi0+aW50ZXJuYWw7CiAKLQlyZXRzID0gbWVpX2NsX2Zsb3dfY3RybF9jcmVkcyhjbCwgY2ItPmZwKTsKKwlyZXRzID0gbWVpX2NsX3R4X2Zsb3dfY3RybF9jcmVkcyhjbCk7CiAJaWYgKHJldHMgPCAwKQogCQlnb3RvIGVycjsKIApAQCAtMTY5MSw3ICsxNjY4LDcgQEAKIAlpZiAocmV0cykKIAkJZ290byBlcnI7CiAKLQlyZXRzID0gbWVpX2NsX2Zsb3dfY3RybF9yZWR1Y2UoY2wpOworCXJldHMgPSBtZWlfY2xfdHhfZmxvd19jdHJsX2NyZWRzX3JlZHVjZShjbCk7CiAJaWYgKHJldHMpCiAJCWdvdG8gZXJyOwogCkBAIC0xNzYxLDYgKzE3MzgsOSBAQAogCiAJY2FzZSBNRUlfRk9QX1JFQUQ6CiAJCWxpc3RfYWRkX3RhaWwoJmNiLT5saXN0LCAmY2wtPnJkX2NvbXBsZXRlZCk7CisJCWlmICghbWVpX2NsX2lzX2ZpeGVkX2FkZHJlc3MoY2wpICYmCisJCSAgICAhV0FSTl9PTighY2wtPnJ4X2Zsb3dfY3RybF9jcmVkcykpCisJCQljbC0+cnhfZmxvd19jdHJsX2NyZWRzLS07CiAJCWlmICghbWVpX2NsX2J1c19yeF9ldmVudChjbCkpCiAJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNsLT5yeF93YWl0KTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL2NsaWVudC5oIGIvZHJpdmVycy9taXNjL21laS9jbGllbnQuaAppbmRleCAwZDdhM2ExLi5kMmJmYWJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL2NsaWVudC5oCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvY2xpZW50LmgKQEAgLTgyLDExICs4Miw3IEBACiAvKgogICogTUVJIElPIEZ1bmN0aW9ucwogICovCi1zdHJ1Y3QgbWVpX2NsX2NiICptZWlfaW9fY2JfaW5pdChzdHJ1Y3QgbWVpX2NsICpjbCwgZW51bSBtZWlfY2JfZmlsZV9vcHMgdHlwZSwKLQkJCQkgY29uc3Qgc3RydWN0IGZpbGUgKmZwKTsKIHZvaWQgbWVpX2lvX2NiX2ZyZWUoc3RydWN0IG1laV9jbF9jYiAqcHJpdl9jYik7Ci1pbnQgbWVpX2lvX2NiX2FsbG9jX2J1ZihzdHJ1Y3QgbWVpX2NsX2NiICpjYiwgc2l6ZV90IGxlbmd0aCk7Ci0KIAogLyoqCiAgKiBtZWlfaW9fbGlzdF9pbml0IC0gU2V0cyB1cCBhIHF1ZXVlIGxpc3QuCkBAIC0xMTgsNiArMTE0LDkgQEAKIHN0cnVjdCBtZWlfY2xfY2IgKm1laV9jbF9hbGxvY19jYihzdHJ1Y3QgbWVpX2NsICpjbCwgc2l6ZV90IGxlbmd0aCwKIAkJCQkgIGVudW0gbWVpX2NiX2ZpbGVfb3BzIHR5cGUsCiAJCQkJICBjb25zdCBzdHJ1Y3QgZmlsZSAqZnApOworc3RydWN0IG1laV9jbF9jYiAqbWVpX2NsX2VucXVldWVfY3RybF93cl9jYihzdHJ1Y3QgbWVpX2NsICpjbCwgc2l6ZV90IGxlbmd0aCwKKwkJCQkJICAgIGVudW0gbWVpX2NiX2ZpbGVfb3BzIHR5cGUsCisJCQkJCSAgICBjb25zdCBzdHJ1Y3QgZmlsZSAqZnApOwogaW50IG1laV9jbF9mbHVzaF9xdWV1ZXMoc3RydWN0IG1laV9jbCAqY2wsIGNvbnN0IHN0cnVjdCBmaWxlICpmcCk7CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL2hibS5jIGIvZHJpdmVycy9taXNjL21laS9oYm0uYwppbmRleCAwODVmM2FhLi5kZDdmMTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL2hibS5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvaGJtLmMKQEAgLTE2MSw2ICsxNjEsNyBAQAogICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKICAqIEBjbDogY2xpZW50CiAgKiBAaGJtX2NtZDogaG9zdCBidXMgbWVzc2FnZSBjb21tYW5kCisgKiBAYnVmOiBtZXNzYWdlIGJ1ZmZlcgogICogQGxlbjogYnVmZmVyIGxlbmd0aAogICoKICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCA8MCBvbiBmYWlsdXJlLgpAQCAtMjc2LDYgKzI3Nyw3IEBACiAKIAlkZXYtPmhibV9zdGF0ZSA9IE1FSV9IQk1fU1RBUlRJTkc7CiAJZGV2LT5pbml0X2NsaWVudHNfdGltZXIgPSBNRUlfQ0xJRU5UU19JTklUX1RJTUVPVVQ7CisJbWVpX3NjaGVkdWxlX3N0YWxsX3RpbWVyKGRldik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMxMSw2ICszMTMsNyBAQAogCX0KIAlkZXYtPmhibV9zdGF0ZSA9IE1FSV9IQk1fRU5VTV9DTElFTlRTOwogCWRldi0+aW5pdF9jbGllbnRzX3RpbWVyID0gTUVJX0NMSUVOVFNfSU5JVF9USU1FT1VUOworCW1laV9zY2hlZHVsZV9zdGFsbF90aW1lcihkZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0zMzksNyArMzQyLDcgQEAKIAogCW1lX2NsLT5wcm9wcyA9IHJlcy0+Y2xpZW50X3Byb3BlcnRpZXM7CiAJbWVfY2wtPmNsaWVudF9pZCA9IHJlcy0+bWVfYWRkcjsKLQltZV9jbC0+bWVpX2Zsb3dfY3RybF9jcmVkcyA9IDA7CisJbWVfY2wtPnR4X2Zsb3dfY3RybF9jcmVkcyA9IDA7CiAKIAltZWlfbWVfY2xfYWRkKGRldiwgbWVfY2wpOwogCkBAIC01NjEsNiArNTY0LDcgQEAKIAl9CiAKIAlkZXYtPmluaXRfY2xpZW50c190aW1lciA9IE1FSV9DTElFTlRTX0lOSVRfVElNRU9VVDsKKwltZWlfc2NoZWR1bGVfc3RhbGxfdGltZXIoZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtNjM2LDIzICs2NDAsMjIgQEAKIH0KIAogLyoqCi0gKiBtZWlfaGJtX2FkZF9zaW5nbGVfZmxvd19jcmVkcyAtIGFkZHMgc2luZ2xlIGJ1ZmZlciBjcmVkZW50aWFscy4KKyAqIG1laV9oYm1fYWRkX3NpbmdsZV90eF9mbG93X2N0cmxfY3JlZHMgLSBhZGRzIHNpbmdsZSBidWZmZXIgY3JlZGVudGlhbHMuCiAgKgogICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBmbG93OiBmbG93IGNvbnRyb2wuCisgKiBAZmN0cmw6IGZsb3cgY29udHJvbCByZXNwb25zZSBidXMgbWVzc2FnZQogICoKICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCA8IDAgb3RoZXJ3aXNlCiAgKi8KLXN0YXRpYyBpbnQgbWVpX2hibV9hZGRfc2luZ2xlX2Zsb3dfY3JlZHMoc3RydWN0IG1laV9kZXZpY2UgKmRldiwKLQkJCQkgIHN0cnVjdCBoYm1fZmxvd19jb250cm9sICpmbG93KQorc3RhdGljIGludCBtZWlfaGJtX2FkZF9zaW5nbGVfdHhfZmxvd19jdHJsX2NyZWRzKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsCisJCQkJCQkgc3RydWN0IGhibV9mbG93X2NvbnRyb2wgKmZjdHJsKQogewogCXN0cnVjdCBtZWlfbWVfY2xpZW50ICptZV9jbDsKIAlpbnQgcmV0czsKIAotCW1lX2NsID0gbWVpX21lX2NsX2J5X2lkKGRldiwgZmxvdy0+bWVfYWRkcik7CisJbWVfY2wgPSBtZWlfbWVfY2xfYnlfaWQoZGV2LCBmY3RybC0+bWVfYWRkcik7CiAJaWYgKCFtZV9jbCkgewotCQlkZXZfZXJyKGRldi0+ZGV2LCAibm8gc3VjaCBtZSBjbGllbnQgJWRcbiIsCi0JCQlmbG93LT5tZV9hZGRyKTsKKwkJZGV2X2VycihkZXYtPmRldiwgIm5vIHN1Y2ggbWUgY2xpZW50ICVkXG4iLCBmY3RybC0+bWVfYWRkcik7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KIApAQCAtNjYxLDkgKzY2NCw5IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCW1lX2NsLT5tZWlfZmxvd19jdHJsX2NyZWRzKys7CisJbWVfY2wtPnR4X2Zsb3dfY3RybF9jcmVkcysrOwogCWRldl9kYmcoZGV2LT5kZXYsICJyZWN2IGZsb3cgY3RybCBtc2cgTUUgJWQgKHNpbmdsZSkgY3JlZHMgPSAlZC5cbiIsCi0JICAgIGZsb3ctPm1lX2FkZHIsIG1lX2NsLT5tZWlfZmxvd19jdHJsX2NyZWRzKTsKKwkJZmN0cmwtPm1lX2FkZHIsIG1lX2NsLT50eF9mbG93X2N0cmxfY3JlZHMpOwogCiAJcmV0cyA9IDA7CiBvdXQ6CkBAIC02NzUsMjQgKzY3OCwyNCBAQAogICogbWVpX2hibV9jbF9mbG93X2NvbnRyb2xfcmVzIC0gZmxvdyBjb250cm9sIHJlc3BvbnNlIGZyb20gbWUKICAqCiAgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQotICogQGZsb3dfY29udHJvbDogZmxvdyBjb250cm9sIHJlc3BvbnNlIGJ1cyBtZXNzYWdlCisgKiBAZmN0cmw6IGZsb3cgY29udHJvbCByZXNwb25zZSBidXMgbWVzc2FnZQogICovCi1zdGF0aWMgdm9pZCBtZWlfaGJtX2NsX2Zsb3dfY29udHJvbF9yZXMoc3RydWN0IG1laV9kZXZpY2UgKmRldiwKLQkJCQkJc3RydWN0IGhibV9mbG93X2NvbnRyb2wgKmZsb3dfY29udHJvbCkKK3N0YXRpYyB2b2lkIG1laV9oYm1fY2xfdHhfZmxvd19jdHJsX2NyZWRzX3JlcyhzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LAorCQkJCQkgICAgICAgc3RydWN0IGhibV9mbG93X2NvbnRyb2wgKmZjdHJsKQogewogCXN0cnVjdCBtZWlfY2wgKmNsOwogCi0JaWYgKCFmbG93X2NvbnRyb2wtPmhvc3RfYWRkcikgeworCWlmICghZmN0cmwtPmhvc3RfYWRkcikgewogCQkvKiBzaW5nbGUgcmVjZWl2ZSBidWZmZXIgKi8KLQkJbWVpX2hibV9hZGRfc2luZ2xlX2Zsb3dfY3JlZHMoZGV2LCBmbG93X2NvbnRyb2wpOworCQltZWlfaGJtX2FkZF9zaW5nbGVfdHhfZmxvd19jdHJsX2NyZWRzKGRldiwgZmN0cmwpOwogCQlyZXR1cm47CiAJfQogCi0JY2wgPSBtZWlfaGJtX2NsX2ZpbmRfYnlfY21kKGRldiwgZmxvd19jb250cm9sKTsKKwljbCA9IG1laV9oYm1fY2xfZmluZF9ieV9jbWQoZGV2LCBmY3RybCk7CiAJaWYgKGNsKSB7Ci0JCWNsLT5tZWlfZmxvd19jdHJsX2NyZWRzKys7CisJCWNsLT50eF9mbG93X2N0cmxfY3JlZHMrKzsKIAkJY2xfZGJnKGRldiwgY2wsICJmbG93IGNvbnRyb2wgY3JlZHMgPSAlZC5cbiIsCi0JCQkJY2wtPm1laV9mbG93X2N0cmxfY3JlZHMpOworCQkJCWNsLT50eF9mbG93X2N0cmxfY3JlZHMpOwogCX0KIH0KIApAQCAtODcxLDEwICs4NzQsMTAgQEAKIAkJY2wtPnN0YXRlID0gTUVJX0ZJTEVfRElTQ09OTkVDVElORzsKIAkJY2wtPnRpbWVyX2NvdW50ID0gMDsKIAotCQljYiA9IG1laV9pb19jYl9pbml0KGNsLCBNRUlfRk9QX0RJU0NPTk5FQ1RfUlNQLCBOVUxMKTsKKwkJY2IgPSBtZWlfY2xfZW5xdWV1ZV9jdHJsX3dyX2NiKGNsLCAwLCBNRUlfRk9QX0RJU0NPTk5FQ1RfUlNQLAorCQkJCQkgICAgICAgTlVMTCk7CiAJCWlmICghY2IpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJbGlzdF9hZGRfdGFpbCgmY2ItPmxpc3QsICZkZXYtPmN0cmxfd3JfbGlzdC5saXN0KTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0xMDIyLDcgKzEwMjUsNyBAQAogCiAJc3RydWN0IG1laV9oYm1fY2xfY21kICpjbF9jbWQ7CiAJc3RydWN0IGhibV9jbGllbnRfY29ubmVjdF9yZXF1ZXN0ICpkaXNjb25uZWN0X3JlcTsKLQlzdHJ1Y3QgaGJtX2Zsb3dfY29udHJvbCAqZmxvd19jb250cm9sOworCXN0cnVjdCBoYm1fZmxvd19jb250cm9sICpmY3RybDsKIAogCS8qIHJlYWQgdGhlIG1lc3NhZ2UgdG8gb3VyIGJ1ZmZlciAqLwogCUJVR19PTihoZHItPmxlbmd0aCA+PSBzaXplb2YoZGV2LT5yZF9tc2dfYnVmKSk7CkBAIC0xMTAyLDggKzExMDUsOCBAQAogCWNhc2UgTUVJX0ZMT1dfQ09OVFJPTF9DTUQ6CiAJCWRldl9kYmcoZGV2LT5kZXYsICJoYm06IGNsaWVudCBmbG93IGNvbnRyb2wgcmVzcG9uc2U6IG1lc3NhZ2UgcmVjZWl2ZWQuXG4iKTsKIAotCQlmbG93X2NvbnRyb2wgPSAoc3RydWN0IGhibV9mbG93X2NvbnRyb2wgKikgbWVpX21zZzsKLQkJbWVpX2hibV9jbF9mbG93X2NvbnRyb2xfcmVzKGRldiwgZmxvd19jb250cm9sKTsKKwkJZmN0cmwgPSAoc3RydWN0IGhibV9mbG93X2NvbnRyb2wgKiltZWlfbXNnOworCQltZWlfaGJtX2NsX3R4X2Zsb3dfY3RybF9jcmVkc19yZXMoZGV2LCBmY3RybCk7CiAJCWJyZWFrOwogCiAJY2FzZSBNRUlfUEdfSVNPTEFUSU9OX0VOVFJZX1JFU19DTUQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL2h3LW1lLXJlZ3MuaCBiL2RyaXZlcnMvbWlzYy9tZWkvaHctbWUtcmVncy5oCmluZGV4IDBkY2I4NTQuLjdhZDE1ZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvaHctbWUtcmVncy5oCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvaHctbWUtcmVncy5oCkBAIC0xMjUsNiArMTI1LDkgQEAKICNkZWZpbmUgTUVJX0RFVl9JRF9CWFRfTSAgICAgIDB4MUE5QSAgLyogQnJveHRvbiBNICovCiAjZGVmaW5lIE1FSV9ERVZfSURfQVBMX0kgICAgICAweDVBOUEgIC8qIEFwb2xsbyBMYWtlIEkgKi8KIAorI2RlZmluZSBNRUlfREVWX0lEX0tCUCAgICAgICAgMHhBMkJBICAvKiBLYWJ5IFBvaW50ICovCisjZGVmaW5lIE1FSV9ERVZfSURfS0JQXzIgICAgICAweEEyQkIgIC8qIEthYnkgUG9pbnQgMiAqLworCiAvKgogICogTUVJIEhXIFNlY3Rpb24KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9ody1tZS5jIGIvZHJpdmVycy9taXNjL21laS9ody1tZS5jCmluZGV4IGUyZmI0NGMuLjU2YzIxMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvaHctbWUuYworKysgYi9kcml2ZXJzL21pc2MvbWVpL2h3LW1lLmMKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAKICNpbmNsdWRlICJtZWlfZGV2LmgiCiAjaW5jbHVkZSAiaGJtLmgiCkBAIC0xMDYzLDYgKzEwNjQsOCBAQAogCQl9CiAJfQogCisJcG1fcnVudGltZV9zZXRfYWN0aXZlKGRldi0+ZGV2KTsKKwogCWhjc3IgPSBtZWlfaGNzcl9yZWFkKGRldik7CiAJLyogSF9SU1QgbWF5IGJlIGZvdW5kIGxpdCBiZWZvcmUgcmVzZXQgaXMgc3RhcnRlZCwKIAkgKiBmb3IgZXhhbXBsZSBpZiBwcmVjZWRpbmcgcmVzZXQgZmxvdyBoYXNuJ3QgY29tcGxldGVkLgpAQCAtMTI2Myw4ICsxMjY2LDE0IEBACiBzdGF0aWMgYm9vbCBtZWlfbWVfZndfdHlwZV9zcHMoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJdTMyIHJlZzsKLQkvKiBSZWFkIE1FIEZXIFN0YXR1cyBjaGVjayBmb3IgU1BTIEZpcm13YXJlICovCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9DRkdfSEZTXzEsICZyZWcpOworCXVuc2lnbmVkIGludCBkZXZmbjsKKworCS8qCisJICogUmVhZCBNRSBGVyBTdGF0dXMgcmVnaXN0ZXIgdG8gY2hlY2sgZm9yIFNQUyBGaXJtd2FyZQorCSAqIFRoZSBTUFMgRlcgaXMgb25seSBzaWduYWxlZCBpbiBwY2kgZnVuY3Rpb24gMAorCSAqLworCWRldmZuID0gUENJX0RFVkZOKFBDSV9TTE9UKHBkZXYtPmRldmZuKSwgMCk7CisJcGNpX2J1c19yZWFkX2NvbmZpZ19kd29yZChwZGV2LT5idXMsIGRldmZuLCBQQ0lfQ0ZHX0hGU18xLCAmcmVnKTsKIAl0cmFjZV9tZWlfcGNpX2NmZ19yZWFkKCZwZGV2LT5kZXYsICJQQ0lfQ0ZHX0hGU18xIiwgUENJX0NGR19IRlNfMSwgcmVnKTsKIAkvKiBpZiBiaXRzIFsxOToxNl0gPSAxNSwgcnVubmluZyBTUFMgRmlybXdhcmUgKi8KIAlyZXR1cm4gKHJlZyAmIDB4ZjAwMDApID09IDB4ZjAwMDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL2h3LXR4ZS5jIGIvZHJpdmVycy9taXNjL21laS9ody10eGUuYwppbmRleCA0YTZjMWI4Li5lNmU1ZTU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL2h3LXR4ZS5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvaHctdHhlLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnFyZXR1cm4uaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tZWkuaD4KIApAQCAtOTM1LDYgKzkzNiw4IEBACiAJCXJldHVybiByZXQ7CiAJfQogCisJcG1fcnVudGltZV9zZXRfYWN0aXZlKGRldi0+ZGV2KTsKKwogCS8qIGVuYWJsZSBpbnB1dCByZWFkeSBpbnRlcnJ1cHRzOgogCSAqIFNFQ19JUENfSE9TVF9JTlRfTUFTSy5JUENfSU5QVVRfUkVBRFlfSU5UX01BU0sKIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvaW5pdC5jIGIvZHJpdmVycy9taXNjL21laS9pbml0LmMKaW5kZXggZjdjOGRmZC4uOWE5YzI0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9pbml0LmMKKysrIGIvZHJpdmVycy9taXNjL21laS9pbml0LmMKQEAgLTk0LDcgKzk0LDcgQEAKIAljYW5jZWxfd29ya19zeW5jKCZkZXYtPnJlc2V0X3dvcmspOwogCWNhbmNlbF93b3JrX3N5bmMoJmRldi0+YnVzX3Jlc2Nhbl93b3JrKTsKIAotCWNhbmNlbF9kZWxheWVkX3dvcmsoJmRldi0+dGltZXJfd29yayk7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZkZXYtPnRpbWVyX3dvcmspOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobWVpX2NhbmNlbF93b3JrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9pbnRlcnJ1cHQuYyBiL2RyaXZlcnMvbWlzYy9tZWkvaW50ZXJydXB0LmMKaW5kZXggMzgzMWE3Yi4uNWE0ODkzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9pbnRlcnJ1cHQuYworKysgYi9kcml2ZXJzL21pc2MvbWVpL2ludGVycnVwdC5jCkBAIC0xMDIsMjYgKzEwMiwyNSBAQAogewogCXN0cnVjdCBtZWlfZGV2aWNlICpkZXYgPSBjbC0+ZGV2OwogCXN0cnVjdCBtZWlfY2xfY2IgKmNiOwotCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9IE5VTEw7CiAJc2l6ZV90IGJ1Zl9zejsKIAogCWNiID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZjbC0+cmRfcGVuZGluZywgc3RydWN0IG1laV9jbF9jYiwgbGlzdCk7CiAJaWYgKCFjYikgewotCQljbF9lcnIoZGV2LCBjbCwgInBlbmRpbmcgcmVhZCBjYiBub3QgZm91bmRcbiIpOwotCQlnb3RvIG91dDsKKwkJaWYgKCFtZWlfY2xfaXNfZml4ZWRfYWRkcmVzcyhjbCkpIHsKKwkJCWNsX2VycihkZXYsIGNsLCAicGVuZGluZyByZWFkIGNiIG5vdCBmb3VuZFxuIik7CisJCQlnb3RvIGRpc2NhcmQ7CisJCX0KKwkJY2IgPSBtZWlfY2xfYWxsb2NfY2IoY2wsIG1laV9jbF9tdHUoY2wpLCBNRUlfRk9QX1JFQUQsIGNsLT5mcCk7CisJCWlmICghY2IpCisJCQlnb3RvIGRpc2NhcmQ7CisJCWxpc3RfYWRkX3RhaWwoJmNiLT5saXN0LCAmY2wtPnJkX3BlbmRpbmcpOwogCX0KIAogCWlmICghbWVpX2NsX2lzX2Nvbm5lY3RlZChjbCkpIHsKIAkJY2xfZGJnKGRldiwgY2wsICJub3QgY29ubmVjdGVkXG4iKTsKLQkJY2ItPnN0YXR1cyA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmIChjYi0+YnVmLnNpemUgPT0gMCB8fCBjYi0+YnVmLmRhdGEgPT0gTlVMTCkgewotCQljbF9lcnIoZGV2LCBjbCwgInJlc3BvbnNlIGJ1ZmZlciBpcyBub3QgYWxsb2NhdGVkLlxuIik7CiAJCWxpc3RfbW92ZV90YWlsKCZjYi0+bGlzdCwgJmNvbXBsZXRlX2xpc3QtPmxpc3QpOwotCQljYi0+c3RhdHVzID0gLUVOT01FTTsKLQkJZ290byBvdXQ7CisJCWNiLT5zdGF0dXMgPSAtRU5PREVWOworCQlnb3RvIGRpc2NhcmQ7CiAJfQogCiAJYnVmX3N6ID0gbWVpX2hkci0+bGVuZ3RoICsgY2ItPmJ1Zl9pZHg7CkBAIC0xMzIsMjUgKzEzMSwxOSBAQAogCiAJCWxpc3RfbW92ZV90YWlsKCZjYi0+bGlzdCwgJmNvbXBsZXRlX2xpc3QtPmxpc3QpOwogCQljYi0+c3RhdHVzID0gLUVNU0dTSVpFOwotCQlnb3RvIG91dDsKKwkJZ290byBkaXNjYXJkOwogCX0KIAogCWlmIChjYi0+YnVmLnNpemUgPCBidWZfc3opIHsKIAkJY2xfZGJnKGRldiwgY2wsICJtZXNzYWdlIG92ZXJmbG93LiBzaXplICV6dSBsZW4gJWQgaWR4ICV6dVxuIiwKIAkJCWNiLT5idWYuc2l6ZSwgbWVpX2hkci0+bGVuZ3RoLCBjYi0+YnVmX2lkeCk7Ci0JCWJ1ZmZlciA9IGtyZWFsbG9jKGNiLT5idWYuZGF0YSwgYnVmX3N6LCBHRlBfS0VSTkVMKTsKIAotCQlpZiAoIWJ1ZmZlcikgewotCQkJY2ItPnN0YXR1cyA9IC1FTk9NRU07Ci0JCQlsaXN0X21vdmVfdGFpbCgmY2ItPmxpc3QsICZjb21wbGV0ZV9saXN0LT5saXN0KTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCWNiLT5idWYuZGF0YSA9IGJ1ZmZlcjsKLQkJY2ItPmJ1Zi5zaXplID0gYnVmX3N6OworCQlsaXN0X21vdmVfdGFpbCgmY2ItPmxpc3QsICZjb21wbGV0ZV9saXN0LT5saXN0KTsKKwkJY2ItPnN0YXR1cyA9IC1FTVNHU0laRTsKKwkJZ290byBkaXNjYXJkOwogCX0KIAotCWJ1ZmZlciA9IGNiLT5idWYuZGF0YSArIGNiLT5idWZfaWR4OwotCW1laV9yZWFkX3Nsb3RzKGRldiwgYnVmZmVyLCBtZWlfaGRyLT5sZW5ndGgpOworCW1laV9yZWFkX3Nsb3RzKGRldiwgY2ItPmJ1Zi5kYXRhICsgY2ItPmJ1Zl9pZHgsIG1laV9oZHItPmxlbmd0aCk7CiAKIAljYi0+YnVmX2lkeCArPSBtZWlfaGRyLT5sZW5ndGg7CiAKQEAgLTE2MiwxMCArMTU1LDEwIEBACiAJCXBtX3JlcXVlc3RfYXV0b3N1c3BlbmQoZGV2LT5kZXYpOwogCX0KIAotb3V0OgotCWlmICghYnVmZmVyKQotCQltZWlfaXJxX2Rpc2NhcmRfbXNnKGRldiwgbWVpX2hkcik7CisJcmV0dXJuIDA7CiAKK2Rpc2NhcmQ6CisJbWVpX2lycV9kaXNjYXJkX21zZyhkZXYsIG1laV9oZHIpOwogCXJldHVybiAwOwogfQogCkBAIC0yMTYsNiArMjA5LDkgQEAKIAlpbnQgc2xvdHM7CiAJaW50IHJldDsKIAorCWlmICghbGlzdF9lbXB0eSgmY2wtPnJkX3BlbmRpbmcpKQorCQlyZXR1cm4gMDsKKwogCW1zZ19zbG90cyA9IG1laV9kYXRhMnNsb3RzKHNpemVvZihzdHJ1Y3QgaGJtX2Zsb3dfY29udHJvbCkpOwogCXNsb3RzID0gbWVpX2hidWZfZW1wdHlfc2xvdHMoZGV2KTsKIApAQCAtNDYzLDYgKzQ1OSwxOSBAQAogCW1laV9yZXNldChkZXYpOwogfQogCisjZGVmaW5lIE1FSV9TVEFMTF9USU1FUl9GUkVRICgyICogSFopCisvKioKKyAqIG1laV9zY2hlZHVsZV9zdGFsbF90aW1lciAtIHJlLWFybSBzdGFsbF90aW1lciB3b3JrCisgKgorICogU2NoZWR1bGUgc3RhbGwgdGltZXIKKyAqCisgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICovCit2b2lkIG1laV9zY2hlZHVsZV9zdGFsbF90aW1lcihzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQoreworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZGV2LT50aW1lcl93b3JrLCBNRUlfU1RBTExfVElNRVJfRlJFUSk7Cit9CisKIC8qKgogICogbWVpX3RpbWVyIC0gdGltZXIgZnVuY3Rpb24uCiAgKgpAQCAtNDcyLDEwICs0ODEsOSBAQAogdm9pZCBtZWlfdGltZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBtZWlfY2wgKmNsOwotCiAJc3RydWN0IG1laV9kZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZih3b3JrLAogCQkJCQlzdHJ1Y3QgbWVpX2RldmljZSwgdGltZXJfd29yay53b3JrKTsKLQorCWJvb2wgcmVzY2hlZHVsZV90aW1lciA9IGZhbHNlOwogCiAJbXV0ZXhfbG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CiAKQEAgLTQ5MCw2ICs0OTgsNyBAQAogCQkJCW1laV9yZXNldChkZXYpOwogCQkJCWdvdG8gb3V0OwogCQkJfQorCQkJcmVzY2hlZHVsZV90aW1lciA9IHRydWU7CiAJCX0KIAl9CiAKQEAgLTUwNCw2ICs1MTMsNyBAQAogCQkJCW1laV9jb25uZWN0X3RpbWVvdXQoY2wpOwogCQkJCWdvdG8gb3V0OwogCQkJfQorCQkJcmVzY2hlZHVsZV90aW1lciA9IHRydWU7CiAJCX0KIAl9CiAKQEAgLTUxNCwxOSArNTI0LDE2IEBACiAJCWlmICgtLWRldi0+aWFtdGhpZl9zdGFsbF90aW1lciA9PSAwKSB7CiAJCQlkZXZfZXJyKGRldi0+ZGV2LCAidGltZXI6IGFtdGhpZiAgaGFuZ2VkLlxuIik7CiAJCQltZWlfcmVzZXQoZGV2KTsKLQkJCWRldi0+aWFtdGhpZl9jYW5jZWxlZCA9IGZhbHNlOwotCQkJZGV2LT5pYW10aGlmX3N0YXRlID0gTUVJX0lBTVRISUZfSURMRTsKIAotCQkJbWVpX2lvX2NiX2ZyZWUoZGV2LT5pYW10aGlmX2N1cnJlbnRfY2IpOwotCQkJZGV2LT5pYW10aGlmX2N1cnJlbnRfY2IgPSBOVUxMOwotCi0JCQlkZXYtPmlhbXRoaWZfZnAgPSBOVUxMOwogCQkJbWVpX2FtdGhpZl9ydW5fbmV4dF9jbWQoZGV2KTsKKwkJCWdvdG8gb3V0OwogCQl9CisJCXJlc2NoZWR1bGVfdGltZXIgPSB0cnVlOwogCX0KIAogb3V0OgotCWlmIChkZXYtPmRldl9zdGF0ZSAhPSBNRUlfREVWX0RJU0FCTEVEKQotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRldi0+dGltZXJfd29yaywgMiAqIEhaKTsKKwlpZiAoZGV2LT5kZXZfc3RhdGUgIT0gTUVJX0RFVl9ESVNBQkxFRCAmJiByZXNjaGVkdWxlX3RpbWVyKQorCQltZWlfc2NoZWR1bGVfc3RhbGxfdGltZXIoZGV2KTsKKwogCW11dGV4X3VubG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL21haW4uYyBiL2RyaXZlcnMvbWlzYy9tZWkvbWFpbi5jCmluZGV4IDUyNjM1YjAuLmZhNTA2MzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvbWFpbi5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvbWFpbi5jCkBAIC03MSw2ICs3MSw3IEBACiAJCWdvdG8gZXJyX3VubG9jazsKIAl9CiAKKwljbC0+ZnAgPSBmaWxlOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGNsOwogCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKQEAgLTEzOCw5ICsxMzksOCBAQAogCXN0cnVjdCBtZWlfY2wgKmNsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBtZWlfZGV2aWNlICpkZXY7CiAJc3RydWN0IG1laV9jbF9jYiAqY2IgPSBOVUxMOworCWJvb2wgbm9uYmxvY2sgPSAhIShmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CiAJaW50IHJldHM7Ci0JaW50IGVycjsKLQogCiAJaWYgKFdBUk5fT04oIWNsIHx8ICFjbC0+ZGV2KSkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0xNjQsMTEgKzE2NCw2IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWlmIChjbCA9PSAmZGV2LT5pYW10aGlmX2NsKSB7Ci0JCXJldHMgPSBtZWlfYW10aGlmX3JlYWQoZGV2LCBmaWxlLCB1YnVmLCBsZW5ndGgsIG9mZnNldCk7Ci0JCWdvdG8gb3V0OwotCX0KLQogCWNiID0gbWVpX2NsX3JlYWRfY2IoY2wsIGZpbGUpOwogCWlmIChjYikKIAkJZ290byBjb3B5X2J1ZmZlcjsKQEAgLTE3NiwyNCArMTcxLDI5IEBACiAJaWYgKCpvZmZzZXQgPiAwKQogCQkqb2Zmc2V0ID0gMDsKIAotCWVyciA9IG1laV9jbF9yZWFkX3N0YXJ0KGNsLCBsZW5ndGgsIGZpbGUpOwotCWlmIChlcnIgJiYgZXJyICE9IC1FQlVTWSkgewotCQljbF9kYmcoZGV2LCBjbCwgIm1laSBzdGFydCByZWFkIGZhaWx1cmUgc3RhdHVzID0gJWRcbiIsIGVycik7Ci0JCXJldHMgPSBlcnI7CisJcmV0cyA9IG1laV9jbF9yZWFkX3N0YXJ0KGNsLCBsZW5ndGgsIGZpbGUpOworCWlmIChyZXRzICYmIHJldHMgIT0gLUVCVVNZKSB7CisJCWNsX2RiZyhkZXYsIGNsLCAibWVpIHN0YXJ0IHJlYWQgZmFpbHVyZSBzdGF0dXMgPSAlZFxuIiwgcmV0cyk7CiAJCWdvdG8gb3V0OwogCX0KIAotCWlmIChsaXN0X2VtcHR5KCZjbC0+cmRfY29tcGxldGVkKSAmJiAhd2FpdHF1ZXVlX2FjdGl2ZSgmY2wtPnJ4X3dhaXQpKSB7Ci0JCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewotCQkJcmV0cyA9IC1FQUdBSU47Ci0JCQlnb3RvIG91dDsKLQkJfQorCWlmIChub25ibG9jaykgeworCQlyZXRzID0gLUVBR0FJTjsKKwkJZ290byBvdXQ7CisJfQogCisJaWYgKHJldHMgPT0gLUVCVVNZICYmCisJICAgICFtZWlfY2xfZW5xdWV1ZV9jdHJsX3dyX2NiKGNsLCBsZW5ndGgsIE1FSV9GT1BfUkVBRCwgZmlsZSkpIHsKKwkJcmV0cyA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWRvIHsKIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKIAogCQlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGNsLT5yeF93YWl0LAotCQkJCSghbGlzdF9lbXB0eSgmY2wtPnJkX2NvbXBsZXRlZCkpIHx8Ci0JCQkJKCFtZWlfY2xfaXNfY29ubmVjdGVkKGNsKSkpKSB7CisJCQkJCSAgICAgKCFsaXN0X2VtcHR5KCZjbC0+cmRfY29tcGxldGVkKSkgfHwKKwkJCQkJICAgICAoIW1laV9jbF9pc19jb25uZWN0ZWQoY2wpKSkpIHsKIAogCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQkJCXJldHVybiAtRUlOVFI7CkBAIC0yMDIsMTYgKzIwMiwxMiBAQAogCiAJCW11dGV4X2xvY2soJmRldi0+ZGV2aWNlX2xvY2spOwogCQlpZiAoIW1laV9jbF9pc19jb25uZWN0ZWQoY2wpKSB7Ci0JCQlyZXRzID0gLUVCVVNZOworCQkJcmV0cyA9IC1FTk9ERVY7CiAJCQlnb3RvIG91dDsKIAkJfQotCX0KIAotCWNiID0gbWVpX2NsX3JlYWRfY2IoY2wsIGZpbGUpOwotCWlmICghY2IpIHsKLQkJcmV0cyA9IDA7Ci0JCWdvdG8gb3V0OwotCX0KKwkJY2IgPSBtZWlfY2xfcmVhZF9jYihjbCwgZmlsZSk7CisJfSB3aGlsZSAoIWNiKTsKIAogY29weV9idWZmZXI6CiAJLyogbm93IGNvcHkgdGhlIGRhdGEgdG8gdXNlciBzcGFjZSAqLwpAQCAtNjA5LDI0ICs2MDUsMjQgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKGNsID09ICZkZXYtPmlhbXRoaWZfY2wpIHsKLQkJbWFzayA9IG1laV9hbXRoaWZfcG9sbChkZXYsIGZpbGUsIHdhaXQpOwotCQlnb3RvIG91dDsKLQl9Ci0KIAlpZiAobm90aWZ5X2VuKSB7CiAJCXBvbGxfd2FpdChmaWxlLCAmY2wtPmV2X3dhaXQsIHdhaXQpOwogCQlpZiAoY2wtPm5vdGlmeV9ldikKIAkJCW1hc2sgfD0gUE9MTFBSSTsKIAl9CiAKKwlpZiAoY2wgPT0gJmRldi0+aWFtdGhpZl9jbCkgeworCQltYXNrIHw9IG1laV9hbXRoaWZfcG9sbChmaWxlLCB3YWl0KTsKKwkJZ290byBvdXQ7CisJfQorCiAJaWYgKHJlcV9ldmVudHMgJiAoUE9MTElOIHwgUE9MTFJETk9STSkpIHsKIAkJcG9sbF93YWl0KGZpbGUsICZjbC0+cnhfd2FpdCwgd2FpdCk7CiAKIAkJaWYgKCFsaXN0X2VtcHR5KCZjbC0+cmRfY29tcGxldGVkKSkKIAkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKIAkJZWxzZQotCQkJbWVpX2NsX3JlYWRfc3RhcnQoY2wsIDAsIGZpbGUpOworCQkJbWVpX2NsX3JlYWRfc3RhcnQoY2wsIG1laV9jbF9tdHUoY2wpLCBmaWxlKTsKIAl9CiAKIG91dDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvbWVpX2Rldi5oIGIvZHJpdmVycy9taXNjL21laS9tZWlfZGV2LmgKaW5kZXggZTVlMzI1MC4uMTE2OWZkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9tZWlfZGV2LmgKKysrIGIvZHJpdmVycy9taXNjL21laS9tZWlfZGV2LmgKQEAgLTgwLDE4ICs4MCwxMyBAQAogZW51bSBpYW10aGlmX3N0YXRlcyB7CiAJTUVJX0lBTVRISUZfSURMRSwKIAlNRUlfSUFNVEhJRl9XUklUSU5HLAotCU1FSV9JQU1USElGX0ZMT1dfQ09OVFJPTCwKIAlNRUlfSUFNVEhJRl9SRUFESU5HLAotCU1FSV9JQU1USElGX1JFQURfQ09NUExFVEUKIH07CiAKIGVudW0gbWVpX2ZpbGVfdHJhbnNhY3Rpb25fc3RhdGVzIHsKIAlNRUlfSURMRSwKIAlNRUlfV1JJVElORywKIAlNRUlfV1JJVEVfQ09NUExFVEUsCi0JTUVJX0ZMT1dfQ09OVFJPTCwKLQlNRUlfUkVBRElORywKLQlNRUlfUkVBRF9DT01QTEVURQogfTsKIAogLyoqCkBAIC0xNDYsNyArMTQxLDcgQEAKICAqIEByZWZjbnQ6IHN0cnVjdCByZWZlcmVuY2UgY291bnQKICAqIEBwcm9wczogY2xpZW50IHByb3BlcnRpZXMKICAqIEBjbGllbnRfaWQ6IG1lIGNsaWVudCBpZAotICogQG1laV9mbG93X2N0cmxfY3JlZHM6IGZsb3cgY29udHJvbCBjcmVkaXRzCisgKiBAdHhfZmxvd19jdHJsX2NyZWRzOiBmbG93IGNvbnRyb2wgY3JlZGl0cwogICogQGNvbm5lY3RfY291bnQ6IG51bWJlciBjb25uZWN0aW9ucyB0byB0aGlzIGNsaWVudAogICogQGJ1c19hZGRlZDogYWRkZWQgdG8gYnVzCiAgKi8KQEAgLTE1NSw3ICsxNTAsNyBAQAogCXN0cnVjdCBrcmVmIHJlZmNudDsKIAlzdHJ1Y3QgbWVpX2NsaWVudF9wcm9wZXJ0aWVzIHByb3BzOwogCXU4IGNsaWVudF9pZDsKLQl1OCBtZWlfZmxvd19jdHJsX2NyZWRzOworCXU4IHR4X2Zsb3dfY3RybF9jcmVkczsKIAl1OCBjb25uZWN0X2NvdW50OwogCXU4IGJ1c19hZGRlZDsKIH07CkBAIC0yMDIsMTAgKzE5NywxMSBAQAogICogQGV2X2FzeW5jOiBldmVudCBhc3luYyBub3RpZmljYXRpb24KICAqIEBzdGF0dXM6IGNvbm5lY3Rpb24gc3RhdHVzCiAgKiBAbWVfY2w6IGZ3IGNsaWVudCBjb25uZWN0ZWQKKyAqIEBmcDogZmlsZSBhc3NvY2lhdGVkIHdpdGggY2xpZW50CiAgKiBAaG9zdF9jbGllbnRfaWQ6IGhvc3QgaWQKLSAqIEBtZWlfZmxvd19jdHJsX2NyZWRzOiB0cmFuc21pdCBmbG93IGNyZWRlbnRpYWxzCisgKiBAdHhfZmxvd19jdHJsX2NyZWRzOiB0cmFuc21pdCBmbG93IGNyZWRlbnRpYWxzCisgKiBAcnhfZmxvd19jdHJsX2NyZWRzOiByZWNlaXZlIGZsb3cgY3JlZGVudGlhbHMKICAqIEB0aW1lcl9jb3VudDogIHdhdGNoZG9nIHRpbWVyIGZvciBvcGVyYXRpb24gY29tcGxldGlvbgotICogQHJlc2VydmVkOiByZXNlcnZlZCBmb3IgYWxpZ25tZW50CiAgKiBAbm90aWZ5X2VuOiBub3RpZmljYXRpb24gLSBlbmFibGVkL2Rpc2FibGVkCiAgKiBAbm90aWZ5X2V2OiBwZW5kaW5nIG5vdGlmaWNhdGlvbiBldmVudAogICogQHdyaXRpbmdfc3RhdGU6IHN0YXRlIG9mIHRoZSB0eApAQCAtMjI1LDEwICsyMjEsMTEgQEAKIAlzdHJ1Y3QgZmFzeW5jX3N0cnVjdCAqZXZfYXN5bmM7CiAJaW50IHN0YXR1czsKIAlzdHJ1Y3QgbWVpX21lX2NsaWVudCAqbWVfY2w7CisJY29uc3Qgc3RydWN0IGZpbGUgKmZwOwogCXU4IGhvc3RfY2xpZW50X2lkOwotCXU4IG1laV9mbG93X2N0cmxfY3JlZHM7CisJdTggdHhfZmxvd19jdHJsX2NyZWRzOworCXU4IHJ4X2Zsb3dfY3RybF9jcmVkczsKIAl1OCB0aW1lcl9jb3VudDsKLQl1OCByZXNlcnZlZDsKIAl1OCBub3RpZnlfZW47CiAJdTggbm90aWZ5X2V2OwogCWVudW0gbWVpX2ZpbGVfdHJhbnNhY3Rpb25fc3RhdGVzIHdyaXRpbmdfc3RhdGU7CkBAIC00MDAsOSArMzk3LDcgQEAKICAqIEBvdmVycmlkZV9maXhlZF9hZGRyZXNzOiBmb3JjZSBhbGxvdyBmaXhlZCBhZGRyZXNzIGJlaGF2aW9yCiAgKgogICogQGFtdGhpZl9jbWRfbGlzdCA6IGFtdGhpZiBsaXN0IGZvciBjbWQgd2FpdGluZwotICogQGlhbXRoaWZfZnAgOiBmaWxlIGZvciBjdXJyZW50IGFtdGhpZiBvcGVyYXRpb24KICAqIEBpYW10aGlmX2NsICA6IGFtdGhpZiBob3N0IGNsaWVudAotICogQGlhbXRoaWZfY3VycmVudF9jYiA6IGFtdGhpZiBjdXJyZW50IG9wZXJhdGlvbiBjYWxsYmFjawogICogQGlhbXRoaWZfb3Blbl9jb3VudCA6IG51bWJlciBvZiBvcGVuZWQgYW10aGlmIGNvbm5lY3Rpb25zCiAgKiBAaWFtdGhpZl9zdGFsbF90aW1lciA6IHRpbWVyIHRvIGRldGVjdCBhbXRoaWYgaGFuZwogICogQGlhbXRoaWZfc3RhdGUgOiBhbXRoaWYgcHJvY2Vzc29yIHN0YXRlCkBAIC00ODQsMTAgKzQ3OSw3IEBACiAKIAkvKiBhbXRoaWYgbGlzdCBmb3IgY21kIHdhaXRpbmcgKi8KIAlzdHJ1Y3QgbWVpX2NsX2NiIGFtdGhpZl9jbWRfbGlzdDsKLQkvKiBkcml2ZXIgbWFuYWdlZCBhbXRoaWYgbGlzdCBmb3IgcmVhZGluZyBjb21wbGV0ZWQgYW10aGlmIGNtZCBkYXRhICovCi0JY29uc3Qgc3RydWN0IGZpbGUgKmlhbXRoaWZfZnA7CiAJc3RydWN0IG1laV9jbCBpYW10aGlmX2NsOwotCXN0cnVjdCBtZWlfY2xfY2IgKmlhbXRoaWZfY3VycmVudF9jYjsKIAlsb25nIGlhbXRoaWZfb3Blbl9jb3VudDsKIAl1MzIgaWFtdGhpZl9zdGFsbF90aW1lcjsKIAllbnVtIGlhbXRoaWZfc3RhdGVzIGlhbXRoaWZfc3RhdGU7CkBAIC01NTYsNiArNTQ4LDcgQEAKICAqLwogCiB2b2lkIG1laV90aW1lcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwordm9pZCBtZWlfc2NoZWR1bGVfc3RhbGxfdGltZXIoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CiBpbnQgbWVpX2lycV9yZWFkX2hhbmRsZXIoc3RydWN0IG1laV9kZXZpY2UgKmRldiwKIAkJc3RydWN0IG1laV9jbF9jYiAqY21wbF9saXN0LCBzMzIgKnNsb3RzKTsKIApAQCAtNTY5LDExICs1NjIsNyBAQAogCiBpbnQgbWVpX2FtdGhpZl9ob3N0X2luaXQoc3RydWN0IG1laV9kZXZpY2UgKmRldiwgc3RydWN0IG1laV9tZV9jbGllbnQgKm1lX2NsKTsKIAotaW50IG1laV9hbXRoaWZfcmVhZChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJY2hhciBfX3VzZXIgKnVidWYsIHNpemVfdCBsZW5ndGgsIGxvZmZfdCAqb2Zmc2V0KTsKLQotdW5zaWduZWQgaW50IG1laV9hbXRoaWZfcG9sbChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LAotCQlzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCk7Cit1bnNpZ25lZCBpbnQgbWVpX2FtdGhpZl9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KTsKIAogaW50IG1laV9hbXRoaWZfcmVsZWFzZShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvcGNpLW1lLmMgYi9kcml2ZXJzL21pc2MvbWVpL3BjaS1tZS5jCmluZGV4IDY0ZTY0ZGEuLmYzZmZkODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvcGNpLW1lLmMKKysrIGIvZHJpdmVycy9taXNjL21laS9wY2ktbWUuYwpAQCAtODUsMTIgKzg1LDE1IEBACiAKIAl7TUVJX1BDSV9ERVZJQ0UoTUVJX0RFVl9JRF9TUFQsIG1laV9tZV9wY2g4X2NmZyl9LAogCXtNRUlfUENJX0RFVklDRShNRUlfREVWX0lEX1NQVF8yLCBtZWlfbWVfcGNoOF9jZmcpfSwKLQl7TUVJX1BDSV9ERVZJQ0UoTUVJX0RFVl9JRF9TUFRfSCwgbWVpX21lX3BjaDhfY2ZnKX0sCi0Je01FSV9QQ0lfREVWSUNFKE1FSV9ERVZfSURfU1BUX0hfMiwgbWVpX21lX3BjaDhfY2ZnKX0sCisJe01FSV9QQ0lfREVWSUNFKE1FSV9ERVZfSURfU1BUX0gsIG1laV9tZV9wY2g4X3Nwc19jZmcpfSwKKwl7TUVJX1BDSV9ERVZJQ0UoTUVJX0RFVl9JRF9TUFRfSF8yLCBtZWlfbWVfcGNoOF9zcHNfY2ZnKX0sCiAKIAl7TUVJX1BDSV9ERVZJQ0UoTUVJX0RFVl9JRF9CWFRfTSwgbWVpX21lX3BjaDhfY2ZnKX0sCiAJe01FSV9QQ0lfREVWSUNFKE1FSV9ERVZfSURfQVBMX0ksIG1laV9tZV9wY2g4X2NmZyl9LAogCisJe01FSV9QQ0lfREVWSUNFKE1FSV9ERVZfSURfS0JQLCBtZWlfbWVfcGNoOF9jZmcpfSwKKwl7TUVJX1BDSV9ERVZJQ0UoTUVJX0RFVl9JRF9LQlBfMiwgbWVpX21lX3BjaDhfY2ZnKX0sCisKIAkvKiByZXF1aXJlZCBsYXN0IGVudHJ5ICovCiAJezAsIH0KIH07CkBAIC0yMTcsOCArMjIwLDYgQEAKIAogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOwogCi0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkZXYtPnRpbWVyX3dvcmssIEhaKTsKLQogCS8qCiAJKiBGb3Igbm90IHdha2UtYWJsZSBIVyBydW50aW1lIHBtIGZyYW1ld29yawogCSogY2FuJ3QgYmUgdXNlZCBvbiBwY2kgZGV2aWNlIGxldmVsLgpAQCAtNDAwLDYgKzQwMSw5IEBACiAKIAlkZXZfZGJnKCZwZGV2LT5kZXYsICJycG06IG1lOiBydW50aW1lIHN1c3BlbmQgcmV0PSVkXG4iLCByZXQpOwogCisJaWYgKHJldCAmJiByZXQgIT0gLUVBR0FJTikKKwkJc2NoZWR1bGVfd29yaygmZGV2LT5yZXNldF93b3JrKTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQyMyw2ICs0MjcsOSBAQAogCiAJZGV2X2RiZygmcGRldi0+ZGV2LCAicnBtOiBtZTogcnVudGltZSByZXN1bWUgcmV0ID0gJWRcbiIsIHJldCk7CiAKKwlpZiAocmV0KQorCQlzY2hlZHVsZV93b3JrKCZkZXYtPnJlc2V0X3dvcmspOworCiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9wY2ktdHhlLmMgYi9kcml2ZXJzL21pc2MvbWVpL3BjaS10eGUuYwppbmRleCAzMGNjMzA2Li41OGZmZDMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL3BjaS10eGUuYworKysgYi9kcml2ZXJzL21pc2MvbWVpL3BjaS10eGUuYwpAQCAtMzQ3LDYgKzM0NywxMCBAQAogCWRldl9kYmcoJnBkZXYtPmRldiwgInJwbTogdHhlOiBydW50aW1lIHN1c3BlbmQgcmV0PSVkXG4iLCByZXQpOwogCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKKworCWlmIChyZXQgJiYgcmV0ICE9IC1FQUdBSU4pCisJCXNjaGVkdWxlX3dvcmsoJmRldi0+cmVzZXRfd29yayk7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zNzIsNiArMzc2LDkgQEAKIAogCWRldl9kYmcoJnBkZXYtPmRldiwgInJwbTogdHhlOiBydW50aW1lIHJlc3VtZSByZXQgPSAlZFxuIiwgcmV0KTsKIAorCWlmIChyZXQpCisJCXNjaGVkdWxlX3dvcmsoJmRldi0+cmVzZXRfd29yayk7CisKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWljL3NjaWYvc2NpZl9kbWEuYyBiL2RyaXZlcnMvbWlzYy9taWMvc2NpZi9zY2lmX2RtYS5jCmluZGV4IGNkMDFhMGUuLjY0ZDU3NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9taWMvc2NpZi9zY2lmX2RtYS5jCisrKyBiL2RyaXZlcnMvbWlzYy9taWMvc2NpZi9zY2lmX2RtYS5jCkBAIC0xMTUsNyArMTE1LDYgQEAKICAqLwogc3RhdGljCiB2b2lkIF9fc2NpZl9ybWFfZGVzdHJveV90Y3coc3RydWN0IHNjaWZfbW11X25vdGlmICptbW4sCi0JCQkgICAgc3RydWN0IHNjaWZfZW5kcHQgKmVwLAogCQkJICAgIHU2NCBzdGFydCwgdTY0IGxlbikKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICppdGVtLCAqdG1wOwpAQCAtMTI4LDcgKzEyNyw2IEBACiAKIAlsaXN0X2Zvcl9lYWNoX3NhZmUoaXRlbSwgdG1wLCAmbW1uLT50Y19yZWdfbGlzdCkgewogCQl3aW5kb3cgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBzY2lmX3dpbmRvdywgbGlzdCk7Ci0JCWVwID0gKHN0cnVjdCBzY2lmX2VuZHB0ICopd2luZG93LT5lcDsKIAkJaWYgKCFsZW4pCiAJCQlicmVhazsKIAkJc3RhcnRfdmEgPSB3aW5kb3ctPnZhX2Zvcl90ZW1wOwpAQCAtMTQ2LDcgKzE0NCw3IEBACiAJc3RydWN0IHNjaWZfZW5kcHQgKmVwID0gbW1uLT5lcDsKIAogCXNwaW5fbG9jaygmZXAtPnJtYV9pbmZvLnRjX2xvY2spOwotCV9fc2NpZl9ybWFfZGVzdHJveV90Y3cobW1uLCBlcCwgc3RhcnQsIGxlbik7CisJX19zY2lmX3JtYV9kZXN0cm95X3RjdyhtbW4sIHN0YXJ0LCBsZW4pOwogCXNwaW5fdW5sb2NrKCZlcC0+cm1hX2luZm8udGNfbG9jayk7CiB9CiAKQEAgLTE2OSw3ICsxNjcsNyBAQAogCXNwaW5fbG9jaygmZXAtPnJtYV9pbmZvLnRjX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVtLCB0bXAsICZlcC0+cm1hX2luZm8ubW1uX2xpc3QpIHsKIAkJbW1uID0gbGlzdF9lbnRyeShpdGVtLCBzdHJ1Y3Qgc2NpZl9tbXVfbm90aWYsIGxpc3QpOwotCQlfX3NjaWZfcm1hX2Rlc3Ryb3lfdGN3KG1tbiwgZXAsIDAsIFVMT05HX01BWCk7CisJCV9fc2NpZl9ybWFfZGVzdHJveV90Y3cobW1uLCAwLCBVTE9OR19NQVgpOwogCX0KIAlzcGluX3VubG9jaygmZXAtPnJtYV9pbmZvLnRjX2xvY2spOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21pYy9zY2lmL3NjaWZfbW1hcC5jIGIvZHJpdmVycy9taXNjL21pYy9zY2lmL3NjaWZfbW1hcC5jCmluZGV4IDQ5Y2I4ZjcuLjkyODIxMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9taWMvc2NpZi9zY2lmX21tYXAuYworKysgYi9kcml2ZXJzL21pc2MvbWljL3NjaWYvc2NpZl9tbWFwLmMKQEAgLTU1Miw3ICs1NTIsNyBAQAogewogCXN0cnVjdCBzY2lmX2VuZHB0ICplcDsKIAlzdHJ1Y3Qgdm1hX3B2dCAqdm1hcHZ0ID0gdm1hLT52bV9wcml2YXRlX2RhdGE7Ci0JaW50IG5yX3BhZ2VzID0gKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVDsKKwlpbnQgbnJfcGFnZXMgPSB2bWFfcGFnZXModm1hKTsKIAlzNjQgb2Zmc2V0OwogCXN0cnVjdCBzY2lmX3JtYV9yZXEgcmVxOwogCXN0cnVjdCBzY2lmX3dpbmRvdyAqd2luZG93ID0gTlVMTDsKQEAgLTYxNCw3ICs2MTQsNyBAQAogCXN0cnVjdCBzY2lmX3dpbmRvdyAqd2luZG93ID0gTlVMTDsKIAlzdHJ1Y3Qgc2NpZl9lbmRwdCAqZXAgPSAoc3RydWN0IHNjaWZfZW5kcHQgKillcGQ7CiAJczY0IHN0YXJ0X29mZnNldCA9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKLQlpbnQgbnJfcGFnZXMgPSAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSA+PiBQQUdFX1NISUZUOworCWludCBucl9wYWdlcyA9IHZtYV9wYWdlcyh2bWEpOwogCWludCBlcnI7CiAJc3RydWN0IHZtYV9wdnQgKnZtYXB2dDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3BjaF9waHViLmMgYi9kcml2ZXJzL21pc2MvcGNoX3BodWIuYwppbmRleCA0ODEwZTAzLi5lNDJiZGM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvcGNoX3BodWIuYworKysgYi9kcml2ZXJzL21pc2MvcGNoX3BodWIuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgogCiAjZGVmaW5lIFBIVUJfU1RBVFVTIDB4MDAJCS8qIFN0YXR1cyBSZWdpc3RlciBvZmZzZXQgKi8KICNkZWZpbmUgUEhVQl9DT05UUk9MIDB4MDQJCS8qIENvbnRyb2wgUmVnaXN0ZXIgb2Zmc2V0ICovCkBAIC01Nyw2ICs1OCw3IEBACiAKIC8qIENNLWlUQyAqLwogI2RlZmluZSBDTEtDRkdfVUFSVF80OE1IWgkJCSgxIDw8IDE2KQorI2RlZmluZSBDTEtDRkdfVUFSVF8yNU1IWgkJCSgyIDw8IDE2KQogI2RlZmluZSBDTEtDRkdfQkFVRERJVgkJCQkoMiA8PCAyMCkKICNkZWZpbmUgQ0xLQ0ZHX1BMTDJWQ08JCQkJKDggPDwgOSkKICNkZWZpbmUgQ0xLQ0ZHX1VBUlRDTEtTRUwJCQkoMSA8PCAxOCkKQEAgLTcxMSw2ICs3MTMsMTIgQEAKIAogCWlmIChpZC0+ZHJpdmVyX2RhdGEgPT0gMSkgeyAvKiBFRzIwVCBQQ0ggKi8KIAkJY29uc3QgY2hhciAqYm9hcmRfbmFtZTsKKwkJdW5zaWduZWQgaW50IHByZWZldGNoID0gMHgwMDBhZmZhYTsKKworCQlpZiAocGRldi0+ZGV2Lm9mX25vZGUpCisJCQlvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJCSAgImludGVsLGVnMjB0LXByZWZldGNoIiwKKwkJCQkJCSAgJnByZWZldGNoKTsKIAogCQlyZXQgPSBzeXNmc19jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LmtvYmosCiAJCQkJCSZkZXZfYXR0cl9wY2hfbWFjLmF0dHIpOwpAQCAtNzM2LDExICs3NDQsMjEgQEAKIAkJCQkJCUNMS0NGR19VQVJUX01BU0spOwogCiAJCS8qIHNldCB0aGUgcHJlZmVjaCB2YWx1ZSAqLwotCQlpb3dyaXRlMzIoMHgwMDBhZmZhYSwgY2hpcC0+cGNoX3BodWJfYmFzZV9hZGRyZXNzICsgMHgxNCk7CisJCWlvd3JpdGUzMihwcmVmZXRjaCwgY2hpcC0+cGNoX3BodWJfYmFzZV9hZGRyZXNzICsgMHgxNCk7CiAJCS8qIHNldCB0aGUgaW50ZXJydXB0IGRlbGF5IHZhbHVlICovCiAJCWlvd3JpdGUzMigweDI1LCBjaGlwLT5wY2hfcGh1Yl9iYXNlX2FkZHJlc3MgKyAweDQ0KTsKIAkJY2hpcC0+cGNoX29wdF9yb21fc3RhcnRfYWRkcmVzcyA9IFBDSF9QSFVCX1JPTV9TVEFSVF9BRERSX0VHMjBUOwogCQljaGlwLT5wY2hfbWFjX3N0YXJ0X2FkZHJlc3MgPSBQQ0hfUEhVQl9NQUNfU1RBUlRfQUREUl9FRzIwVDsKKworCQkvKiBxdWlyayBmb3IgTUlQUyBCb3N0b24gcGxhdGZvcm0gKi8KKwkJaWYgKHBkZXYtPmRldi5vZl9ub2RlKSB7CisJCQlpZiAob2ZfbWFjaGluZV9pc19jb21wYXRpYmxlKCJpbWcsYm9zdG9uIikpIHsKKwkJCQlwY2hfcGh1Yl9yZWFkX21vZGlmeV93cml0ZV9yZWcoY2hpcCwKKwkJCQkJKHVuc2lnbmVkIGludClDTEtDRkdfUkVHX09GRlNFVCwKKwkJCQkJQ0xLQ0ZHX1VBUlRfMjVNSFosCisJCQkJCUNMS0NGR19VQVJUX01BU0spOworCQkJfQorCQl9CiAJfSBlbHNlIGlmIChpZC0+ZHJpdmVyX2RhdGEgPT0gMikgeyAvKiBNTDcyMTMgSU9IICovCiAJCXJldCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmcGRldi0+ZGV2LmtvYmosICZwY2hfYmluX2F0dHIpOwogCQlpZiAocmV0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL3Ztd192bWNpL3ZtY2lfaG9zdC5jIGIvZHJpdmVycy9taXNjL3Ztd192bWNpL3ZtY2lfaG9zdC5jCmluZGV4IDllYzI2MmEuLmVjMDkwMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy92bXdfdm1jaS92bWNpX2hvc3QuYworKysgYi9kcml2ZXJzL21pc2Mvdm13X3ZtY2kvdm1jaV9ob3N0LmMKQEAgLTM4MSwxOCArMzgxLDEyIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWRnID0ga21hbGxvYyhzZW5kX2luZm8ubGVuLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRnKSB7CisJZGcgPSBtZW1kdXBfdXNlcigodm9pZCBfX3VzZXIgKikodWludHB0cl90KXNlbmRfaW5mby5hZGRyLAorCQkJIHNlbmRfaW5mby5sZW4pOworCWlmIChJU19FUlIoZGcpKSB7CiAJCXZtY2lfaW9jdGxfZXJyKAogCQkJImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgdG8gZGlzcGF0Y2ggZGF0YWdyYW1cbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoZGcsICh2b2lkIF9fdXNlciAqKSh1aW50cHRyX3Qpc2VuZF9pbmZvLmFkZHIsCi0JCQkgICBzZW5kX2luZm8ubGVuKSkgewotCQl2bWNpX2lvY3RsX2VycigiZXJyb3IgZ2V0dGluZyBkYXRhZ3JhbVxuIik7Ci0JCWtmcmVlKGRnKTsKLQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiBQVFJfRVJSKGRnKTsKIAl9CiAKIAlpZiAoVk1DSV9ER19TSVpFKGRnKSAhPSBzZW5kX2luZm8ubGVuKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jYXJkL2Jsb2NrLmMgYi9kcml2ZXJzL21tYy9jYXJkL2Jsb2NrLmMKaW5kZXggNDhhNWRkNy4uYzMzMzUxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY2FyZC9ibG9jay5jCisrKyBiL2RyaXZlcnMvbW1jL2NhcmQvYmxvY2suYwpAQCAtMTQyLDggKzE0Miw2IEBACiB7CiAJc3RydWN0IG1tY19wYWNrZWQgKnBhY2tlZCA9IG1xcnEtPnBhY2tlZDsKIAotCUJVR19PTighcGFja2VkKTsKLQogCW1xcnEtPmNtZF90eXBlID0gTU1DX1BBQ0tFRF9OT05FOwogCXBhY2tlZC0+bnJfZW50cmllcyA9IE1NQ19QQUNLRURfTlJfWkVSTzsKIAlwYWNrZWQtPmlkeF9mYWlsdXJlID0gTU1DX1BBQ0tFRF9OUl9JRFg7CkBAIC0xNDQzLDggKzE0NDEsNiBAQAogCWludCBlcnIsIGNoZWNrLCBzdGF0dXM7CiAJdTggKmV4dF9jc2Q7CiAKLQlCVUdfT04oIXBhY2tlZCk7Ci0KIAlwYWNrZWQtPnJldHJpZXMtLTsKIAljaGVjayA9IG1tY19ibGtfZXJyX2NoZWNrKGNhcmQsIGFyZXEpOwogCWVyciA9IGdldF9jYXJkX3N0YXR1cyhjYXJkLCAmc3RhdHVzLCAwKTsKQEAgLTE2NzMsNiArMTY2OSwxOCBAQAogCXU4IG1heF9wYWNrZWRfcncgPSAwOwogCXU4IHJlcXMgPSAwOwogCisJLyoKKwkgKiBXZSBkb24ndCBuZWVkIHRvIGNoZWNrIHBhY2tlZCBmb3IgYW55IGZ1cnRoZXIKKwkgKiBvcGVyYXRpb24gb2YgcGFja2VkIHN0dWZmIGFzIHdlIHNldCBNTUNfUEFDS0VEX05PTkUKKwkgKiBhbmQgcmV0dXJuIHplcm8gZm9yIHJlcXMgaWYgZ2V0aW5nIG51bGwgcGFja2VkLiBBbHNvCisJICogd2UgY2xlYW4gdGhlIGZsYWcgb2YgTU1DX0JMS19QQUNLRURfQ01EIHRvIGF2b2lkIGRvaW5nCisJICogaXQgYWdhaW4gd2hlbiByZW1vdmluZyBibGsgcmVxLgorCSAqLworCWlmICghbXFycS0+cGFja2VkKSB7CisJCW1kLT5mbGFncyAmPSAofk1NQ19CTEtfUEFDS0VEX0NNRCk7CisJCWdvdG8gbm9fcGFja2VkOworCX0KKwogCWlmICghKG1kLT5mbGFncyAmIE1NQ19CTEtfUEFDS0VEX0NNRCkpCiAJCWdvdG8gbm9fcGFja2VkOwogCkBAIC0xNzI2LDYgKzE3MzQsNyBAQAogCQkJYnJlYWs7CiAKIAkJaWYgKHJlcV9vcChuZXh0KSA9PSBSRVFfT1BfRElTQ0FSRCB8fAorCQkgICAgcmVxX29wKG5leHQpID09IFJFUV9PUF9TRUNVUkVfRVJBU0UgfHwKIAkJICAgIHJlcV9vcChuZXh0KSA9PSBSRVFfT1BfRkxVU0gpCiAJCQlicmVhazsKIApAQCAtMTc4MSw4ICsxNzkwLDYgQEAKIAl1OCBoZHJfYmxvY2tzOwogCXU4IGkgPSAxOwogCi0JQlVHX09OKCFwYWNrZWQpOwotCiAJbXFycS0+Y21kX3R5cGUgPSBNTUNfUEFDS0VEX1dSSVRFOwogCXBhY2tlZC0+YmxvY2tzID0gMDsKIAlwYWNrZWQtPmlkeF9mYWlsdXJlID0gTU1DX1BBQ0tFRF9OUl9JRFg7CkBAIC0xODg2LDggKzE4OTMsNiBAQAogCWludCBpZHggPSBwYWNrZWQtPmlkeF9mYWlsdXJlLCBpID0gMDsKIAlpbnQgcmV0ID0gMDsKIAotCUJVR19PTighcGFja2VkKTsKLQogCXdoaWxlICghbGlzdF9lbXB0eSgmcGFja2VkLT5saXN0KSkgewogCQlwcnEgPSBsaXN0X2VudHJ5X3JxKHBhY2tlZC0+bGlzdC5uZXh0KTsKIAkJaWYgKGlkeCA9PSBpKSB7CkBAIC0xOTE2LDggKzE5MjEsNiBAQAogCXN0cnVjdCByZXF1ZXN0ICpwcnE7CiAJc3RydWN0IG1tY19wYWNrZWQgKnBhY2tlZCA9IG1xX3JxLT5wYWNrZWQ7CiAKLQlCVUdfT04oIXBhY2tlZCk7Ci0KIAl3aGlsZSAoIWxpc3RfZW1wdHkoJnBhY2tlZC0+bGlzdCkpIHsKIAkJcHJxID0gbGlzdF9lbnRyeV9ycShwYWNrZWQtPmxpc3QubmV4dCk7CiAJCWxpc3RfZGVsX2luaXQoJnBycS0+cXVldWVsaXN0KTsKQEAgLTE5MzQsOCArMTkzNyw2IEBACiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBtcS0+cXVldWU7CiAJc3RydWN0IG1tY19wYWNrZWQgKnBhY2tlZCA9IG1xX3JxLT5wYWNrZWQ7CiAKLQlCVUdfT04oIXBhY2tlZCk7Ci0KIAl3aGlsZSAoIWxpc3RfZW1wdHkoJnBhY2tlZC0+bGlzdCkpIHsKIAkJcHJxID0gbGlzdF9lbnRyeV9ycShwYWNrZWQtPmxpc3QucHJldik7CiAJCWlmIChwcnEtPnF1ZXVlbGlzdC5wcmV2ICE9ICZwYWNrZWQtPmxpc3QpIHsKQEAgLTIxNDMsMTMgKzIxNDQsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtbWNfYmxrX2lzc3VlX3JxKHN0cnVjdCBtbWNfcXVldWUgKm1xLCBzdHJ1Y3QgcmVxdWVzdCAqcmVxKQoraW50IG1tY19ibGtfaXNzdWVfcnEoc3RydWN0IG1tY19xdWV1ZSAqbXEsIHN0cnVjdCByZXF1ZXN0ICpyZXEpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgbW1jX2Jsa19kYXRhICptZCA9IG1xLT5kYXRhOwogCXN0cnVjdCBtbWNfY2FyZCAqY2FyZCA9IG1kLT5xdWV1ZS5jYXJkOwogCXN0cnVjdCBtbWNfaG9zdCAqaG9zdCA9IGNhcmQtPmhvc3Q7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlib29sIHJlcV9pc19zcGVjaWFsID0gbW1jX3JlcV9pc19zcGVjaWFsKHJlcSk7CiAKIAlpZiAocmVxICYmICFtcS0+bXFycV9wcmV2LT5yZXEpCiAJCS8qIGNsYWltIGhvc3Qgb25seSBmb3IgdGhlIGZpcnN0IHJlcXVlc3QgKi8KQEAgLTIxOTAsOCArMjE5Miw3IEBACiAJfQogCiBvdXQ6Ci0JaWYgKCghcmVxICYmICEobXEtPmZsYWdzICYgTU1DX1FVRVVFX05FV19SRVFVRVNUKSkgfHwKLQkgICAgbW1jX3JlcV9pc19zcGVjaWFsKHJlcSkpCisJaWYgKCghcmVxICYmICEobXEtPmZsYWdzICYgTU1DX1FVRVVFX05FV19SRVFVRVNUKSkgfHwgcmVxX2lzX3NwZWNpYWwpCiAJCS8qCiAJCSAqIFJlbGVhc2UgaG9zdCB3aGVuIHRoZXJlIGFyZSBubyBtb3JlIHJlcXVlc3RzCiAJCSAqIGFuZCBhZnRlciBzcGVjaWFsIHJlcXVlc3QoZGlzY2FyZCwgZmx1c2gpIGlzIGRvbmUuCkBAIC0yMjY0LDcgKzIyNjUsNiBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyX3B1dGRpc2s7CiAKLQltZC0+cXVldWUuaXNzdWVfZm4gPSBtbWNfYmxrX2lzc3VlX3JxOwogCW1kLT5xdWV1ZS5kYXRhID0gbWQ7CiAKIAltZC0+ZGlzay0+bWFqb3IJPSBNTUNfQkxPQ0tfTUFKT1I7CkBAIC0yMzAyLDcgKzIzMDIsOCBAQAogCXNldF9jYXBhY2l0eShtZC0+ZGlzaywgc2l6ZSk7CiAKIAlpZiAobW1jX2hvc3RfY21kMjMoY2FyZC0+aG9zdCkpIHsKLQkJaWYgKG1tY19jYXJkX21tYyhjYXJkKSB8fAorCQlpZiAoKG1tY19jYXJkX21tYyhjYXJkKSAmJgorCQkgICAgIGNhcmQtPmNzZC5tbWNhX3ZzbiA+PSBDU0RfU1BFQ19WRVJfMykgfHwKIAkJICAgIChtbWNfY2FyZF9zZChjYXJkKSAmJgogCQkgICAgIGNhcmQtPnNjci5jbWRzICYgU0RfU0NSX0NNRDIzX1NVUFBPUlQpKQogCQkJbWQtPmZsYWdzIHw9IE1NQ19CTEtfQ01EMjM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jYXJkL2Jsb2NrLmggYi9kcml2ZXJzL21tYy9jYXJkL2Jsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RhYmIyZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbW1jL2NhcmQvYmxvY2suaApAQCAtMCwwICsxIEBACitpbnQgbW1jX2Jsa19pc3N1ZV9ycShzdHJ1Y3QgbW1jX3F1ZXVlICptcSwgc3RydWN0IHJlcXVlc3QgKnJlcSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jYXJkL21tY190ZXN0LmMgYi9kcml2ZXJzL21tYy9jYXJkL21tY190ZXN0LmMKaW5kZXggYzAzMmVlZi4uNWE4ZGM1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY2FyZC9tbWNfdGVzdC5jCisrKyBiL2RyaXZlcnMvbW1jL2NhcmQvbW1jX3Rlc3QuYwpAQCAtMTg0LDYgKzE4NCwyOSBAQAogCXJldHVybiBtbWNfc2V0X2Jsb2NrbGVuKHRlc3QtPmNhcmQsIHNpemUpOwogfQogCitzdGF0aWMgYm9vbCBtbWNfdGVzdF9jYXJkX2NtZDIzKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCkKK3sKKwlyZXR1cm4gbW1jX2NhcmRfbW1jKGNhcmQpIHx8CisJICAgICAgIChtbWNfY2FyZF9zZChjYXJkKSAmJiBjYXJkLT5zY3IuY21kcyAmIFNEX1NDUl9DTUQyM19TVVBQT1JUKTsKK30KKworc3RhdGljIHZvaWQgbW1jX3Rlc3RfcHJlcGFyZV9zYmMoc3RydWN0IG1tY190ZXN0X2NhcmQgKnRlc3QsCisJCQkJIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxLCB1bnNpZ25lZCBpbnQgYmxvY2tzKQoreworCXN0cnVjdCBtbWNfY2FyZCAqY2FyZCA9IHRlc3QtPmNhcmQ7CisKKwlpZiAoIW1ycS0+c2JjIHx8ICFtbWNfaG9zdF9jbWQyMyhjYXJkLT5ob3N0KSB8fAorCSAgICAhbW1jX3Rlc3RfY2FyZF9jbWQyMyhjYXJkKSB8fCAhbW1jX29wX211bHRpKG1ycS0+Y21kLT5vcGNvZGUpIHx8CisJICAgIChjYXJkLT5xdWlya3MgJiBNTUNfUVVJUktfQkxLX05PX0NNRDIzKSkgeworCQltcnEtPnNiYyA9IE5VTEw7CisJCXJldHVybjsKKwl9CisKKwltcnEtPnNiYy0+b3Bjb2RlID0gTU1DX1NFVF9CTE9DS19DT1VOVDsKKwltcnEtPnNiYy0+YXJnID0gYmxvY2tzOworCW1ycS0+c2JjLT5mbGFncyA9IE1NQ19SU1BfUjEgfCBNTUNfQ01EX0FDOworfQorCiAvKgogICogRmlsbCBpbiB0aGUgbW1jX3JlcXVlc3Qgc3RydWN0dXJlIGdpdmVuIGEgc2V0IG9mIHRyYW5zZmVyIHBhcmFtZXRlcnMuCiAgKi8KQEAgLTIyMSw2ICsyNDQsOCBAQAogCW1ycS0+ZGF0YS0+c2cgPSBzZzsKIAltcnEtPmRhdGEtPnNnX2xlbiA9IHNnX2xlbjsKIAorCW1tY190ZXN0X3ByZXBhcmVfc2JjKHRlc3QsIG1ycSwgYmxvY2tzKTsKKwogCW1tY19zZXRfZGF0YV90aW1lb3V0KG1ycS0+ZGF0YSwgdGVzdC0+Y2FyZCk7CiB9CiAKQEAgLTY5Myw2ICs3MTgsOCBAQAogCiAJcmV0ID0gMDsKIAorCWlmIChtcnEtPnNiYyAmJiBtcnEtPnNiYy0+ZXJyb3IpCisJCXJldCA9IG1ycS0+c2JjLT5lcnJvcjsKIAlpZiAoIXJldCAmJiBtcnEtPmNtZC0+ZXJyb3IpCiAJCXJldCA9IG1ycS0+Y21kLT5lcnJvcjsKIAlpZiAoIXJldCAmJiBtcnEtPmRhdGEtPmVycm9yKQpAQCAtMjI3OCw2ICsyMzA1LDI0NSBAQAogCXJldHVybiBSRVNVTFRfRkFJTDsKIH0KIAorc3RydWN0IG1tY190ZXN0X3JlcSB7CisJc3RydWN0IG1tY19yZXF1ZXN0IG1ycTsKKwlzdHJ1Y3QgbW1jX2NvbW1hbmQgc2JjOworCXN0cnVjdCBtbWNfY29tbWFuZCBjbWQ7CisJc3RydWN0IG1tY19jb21tYW5kIHN0b3A7CisJc3RydWN0IG1tY19jb21tYW5kIHN0YXR1czsKKwlzdHJ1Y3QgbW1jX2RhdGEgZGF0YTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbW1jX3Rlc3RfcmVxICptbWNfdGVzdF9yZXFfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgbW1jX3Rlc3RfcmVxICpycSA9IGt6YWxsb2Moc2l6ZW9mKCpycSksIEdGUF9LRVJORUwpOworCisJaWYgKHJxKSB7CisJCXJxLT5tcnEuY21kID0gJnJxLT5jbWQ7CisJCXJxLT5tcnEuZGF0YSA9ICZycS0+ZGF0YTsKKwkJcnEtPm1ycS5zdG9wID0gJnJxLT5zdG9wOworCX0KKworCXJldHVybiBycTsKK30KKworc3RhdGljIGludCBtbWNfdGVzdF9zZW5kX3N0YXR1cyhzdHJ1Y3QgbW1jX3Rlc3RfY2FyZCAqdGVzdCwKKwkJCQlzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZCkKK3sKKwltZW1zZXQoY21kLCAwLCBzaXplb2YoKmNtZCkpOworCisJY21kLT5vcGNvZGUgPSBNTUNfU0VORF9TVEFUVVM7CisJaWYgKCFtbWNfaG9zdF9pc19zcGkodGVzdC0+Y2FyZC0+aG9zdCkpCisJCWNtZC0+YXJnID0gdGVzdC0+Y2FyZC0+cmNhIDw8IDE2OworCWNtZC0+ZmxhZ3MgPSBNTUNfUlNQX1NQSV9SMiB8IE1NQ19SU1BfUjEgfCBNTUNfQ01EX0FDOworCisJcmV0dXJuIG1tY193YWl0X2Zvcl9jbWQodGVzdC0+Y2FyZC0+aG9zdCwgY21kLCAwKTsKK30KKworc3RhdGljIGludCBtbWNfdGVzdF9vbmdvaW5nX3RyYW5zZmVyKHN0cnVjdCBtbWNfdGVzdF9jYXJkICp0ZXN0LAorCQkJCSAgICAgdW5zaWduZWQgaW50IGRldl9hZGRyLCBpbnQgdXNlX3NiYywKKwkJCQkgICAgIGludCByZXBlYXRfY21kLCBpbnQgd3JpdGUsIGludCB1c2VfYXJlcSkKK3sKKwlzdHJ1Y3QgbW1jX3Rlc3RfcmVxICpycSA9IG1tY190ZXN0X3JlcV9hbGxvYygpOworCXN0cnVjdCBtbWNfaG9zdCAqaG9zdCA9IHRlc3QtPmNhcmQtPmhvc3Q7CisJc3RydWN0IG1tY190ZXN0X2FyZWEgKnQgPSAmdGVzdC0+YXJlYTsKKwlzdHJ1Y3QgbW1jX2FzeW5jX3JlcSBhcmVxOworCXN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlib29sIGV4cGlyZWQgPSBmYWxzZTsKKwlpbnQgcmV0ID0gMCwgY21kX3JldDsKKwl1MzIgc3RhdHVzID0gMDsKKwlpbnQgY291bnQgPSAwOworCisJaWYgKCFycSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltcnEgPSAmcnEtPm1ycTsKKwlpZiAodXNlX3NiYykKKwkJbXJxLT5zYmMgPSAmcnEtPnNiYzsKKwltcnEtPmNhcF9jbWRfZHVyaW5nX3RmciA9IHRydWU7CisKKwlhcmVxLm1ycSA9IG1ycTsKKwlhcmVxLmVycl9jaGVjayA9IG1tY190ZXN0X2NoZWNrX3Jlc3VsdF9hc3luYzsKKworCW1tY190ZXN0X3ByZXBhcmVfbXJxKHRlc3QsIG1ycSwgdC0+c2csIHQtPnNnX2xlbiwgZGV2X2FkZHIsIHQtPmJsb2NrcywKKwkJCSAgICAgNTEyLCB3cml0ZSk7CisKKwlpZiAodXNlX3NiYyAmJiB0LT5ibG9ja3MgPiAxICYmICFtcnEtPnNiYykgeworCQlyZXQgPSAgbW1jX2hvc3RfY21kMjMoaG9zdCkgPworCQkgICAgICAgUkVTVUxUX1VOU1VQX0NBUkQgOgorCQkgICAgICAgUkVTVUxUX1VOU1VQX0hPU1Q7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJLyogU3RhcnQgb25nb2luZyBkYXRhIHJlcXVlc3QgKi8KKwlpZiAodXNlX2FyZXEpIHsKKwkJbW1jX3N0YXJ0X3JlcShob3N0LCAmYXJlcSwgJnJldCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dF9mcmVlOworCX0gZWxzZSB7CisJCW1tY193YWl0X2Zvcl9yZXEoaG9zdCwgbXJxKTsKKwl9CisKKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMzAwMCk7CisJZG8geworCQljb3VudCArPSAxOworCisJCS8qIFNlbmQgc3RhdHVzIGNvbW1hbmQgd2hpbGUgZGF0YSB0cmFuc2ZlciBpbiBwcm9ncmVzcyAqLworCQljbWRfcmV0ID0gbW1jX3Rlc3Rfc2VuZF9zdGF0dXModGVzdCwgJnJxLT5zdGF0dXMpOworCQlpZiAoY21kX3JldCkKKwkJCWJyZWFrOworCisJCXN0YXR1cyA9IHJxLT5zdGF0dXMucmVzcFswXTsKKwkJaWYgKHN0YXR1cyAmIFIxX0VSUk9SKSB7CisJCQljbWRfcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG1tY19pc19yZXFfZG9uZShob3N0LCBtcnEpKQorCQkJYnJlYWs7CisKKwkJZXhwaXJlZCA9IHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCk7CisJCWlmIChleHBpcmVkKSB7CisJCQlwcl9pbmZvKCIlczogdGltZW91dCB3YWl0aW5nIGZvciBUcmFuIHN0YXRlIHN0YXR1cyAlI3hcbiIsCisJCQkJbW1jX2hvc3RuYW1lKGhvc3QpLCBzdGF0dXMpOworCQkJY21kX3JldCA9IC1FVElNRURPVVQ7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKHJlcGVhdF9jbWQgJiYgUjFfQ1VSUkVOVF9TVEFURShzdGF0dXMpICE9IFIxX1NUQVRFX1RSQU4pOworCisJLyogV2FpdCBmb3IgZGF0YSByZXF1ZXN0IHRvIGNvbXBsZXRlICovCisJaWYgKHVzZV9hcmVxKQorCQltbWNfc3RhcnRfcmVxKGhvc3QsIE5VTEwsICZyZXQpOworCWVsc2UKKwkJbW1jX3dhaXRfZm9yX3JlcV9kb25lKHRlc3QtPmNhcmQtPmhvc3QsIG1ycSk7CisKKwkvKgorCSAqIEZvciBjYXBfY21kX2R1cmluZ190ZnIgcmVxdWVzdCwgdXBwZXIgbGF5ZXIgbXVzdCBzZW5kIHN0b3AgaWYKKwkgKiByZXF1aXJlZC4KKwkgKi8KKwlpZiAobXJxLT5kYXRhLT5zdG9wICYmIChtcnEtPmRhdGEtPmVycm9yIHx8ICFtcnEtPnNiYykpIHsKKwkJaWYgKHJldCkKKwkJCW1tY193YWl0X2Zvcl9jbWQoaG9zdCwgbXJxLT5kYXRhLT5zdG9wLCAwKTsKKwkJZWxzZQorCQkJcmV0ID0gbW1jX3dhaXRfZm9yX2NtZChob3N0LCBtcnEtPmRhdGEtPnN0b3AsIDApOworCX0KKworCWlmIChyZXQpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlpZiAoY21kX3JldCkgeworCQlwcl9pbmZvKCIlczogU2VuZCBTdGF0dXMgZmFpbGVkOiBzdGF0dXMgJSN4LCBlcnJvciAlZFxuIiwKKwkJCW1tY19ob3N0bmFtZSh0ZXN0LT5jYXJkLT5ob3N0KSwgc3RhdHVzLCBjbWRfcmV0KTsKKwl9CisKKwlyZXQgPSBtbWNfdGVzdF9jaGVja19yZXN1bHQodGVzdCwgbXJxKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9mcmVlOworCisJcmV0ID0gbW1jX3Rlc3Rfd2FpdF9idXN5KHRlc3QpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlpZiAocmVwZWF0X2NtZCAmJiAodC0+YmxvY2tzICsgMSkgPDwgOSA+IHQtPm1heF90ZnIpCisJCXByX2luZm8oIiVzOiAlZCBjb21tYW5kcyBjb21wbGV0ZWQgZHVyaW5nIHRyYW5zZmVyIG9mICV1IGJsb2Nrc1xuIiwKKwkJCW1tY19ob3N0bmFtZSh0ZXN0LT5jYXJkLT5ob3N0KSwgY291bnQsIHQtPmJsb2Nrcyk7CisKKwlpZiAoY21kX3JldCkKKwkJcmV0ID0gY21kX3JldDsKK291dF9mcmVlOgorCWtmcmVlKHJxKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19tbWNfdGVzdF9jbWRzX2R1cmluZ190ZnIoc3RydWN0IG1tY190ZXN0X2NhcmQgKnRlc3QsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBzeiwgaW50IHVzZV9zYmMsIGludCB3cml0ZSwKKwkJCQkgICAgICBpbnQgdXNlX2FyZXEpCit7CisJc3RydWN0IG1tY190ZXN0X2FyZWEgKnQgPSAmdGVzdC0+YXJlYTsKKwlpbnQgcmV0OworCisJaWYgKCEodGVzdC0+Y2FyZC0+aG9zdC0+Y2FwcyAmIE1NQ19DQVBfQ01EX0RVUklOR19URlIpKQorCQlyZXR1cm4gUkVTVUxUX1VOU1VQX0hPU1Q7CisKKwlyZXQgPSBtbWNfdGVzdF9hcmVhX21hcCh0ZXN0LCBzeiwgMCwgMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG1tY190ZXN0X29uZ29pbmdfdHJhbnNmZXIodGVzdCwgdC0+ZGV2X2FkZHIsIHVzZV9zYmMsIDAsIHdyaXRlLAorCQkJCQl1c2VfYXJlcSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBtbWNfdGVzdF9vbmdvaW5nX3RyYW5zZmVyKHRlc3QsIHQtPmRldl9hZGRyLCB1c2Vfc2JjLCAxLCB3cml0ZSwKKwkJCQkJIHVzZV9hcmVxKTsKK30KKworc3RhdGljIGludCBtbWNfdGVzdF9jbWRzX2R1cmluZ190ZnIoc3RydWN0IG1tY190ZXN0X2NhcmQgKnRlc3QsIGludCB1c2Vfc2JjLAorCQkJCSAgICBpbnQgd3JpdGUsIGludCB1c2VfYXJlcSkKK3sKKwlzdHJ1Y3QgbW1jX3Rlc3RfYXJlYSAqdCA9ICZ0ZXN0LT5hcmVhOworCXVuc2lnbmVkIGxvbmcgc3o7CisJaW50IHJldDsKKworCWZvciAoc3ogPSA1MTI7IHN6IDw9IHQtPm1heF90ZnI7IHN6ICs9IDUxMikgeworCQlyZXQgPSBfX21tY190ZXN0X2NtZHNfZHVyaW5nX3Rmcih0ZXN0LCBzeiwgdXNlX3NiYywgd3JpdGUsCisJCQkJCQkgdXNlX2FyZXEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDb21tYW5kcyBkdXJpbmcgcmVhZCAtIG5vIFNldCBCbG9jayBDb3VudCAoQ01EMjMpLgorICovCitzdGF0aWMgaW50IG1tY190ZXN0X2NtZHNfZHVyaW5nX3JlYWQoc3RydWN0IG1tY190ZXN0X2NhcmQgKnRlc3QpCit7CisJcmV0dXJuIG1tY190ZXN0X2NtZHNfZHVyaW5nX3Rmcih0ZXN0LCAwLCAwLCAwKTsKK30KKworLyoKKyAqIENvbW1hbmRzIGR1cmluZyB3cml0ZSAtIG5vIFNldCBCbG9jayBDb3VudCAoQ01EMjMpLgorICovCitzdGF0aWMgaW50IG1tY190ZXN0X2NtZHNfZHVyaW5nX3dyaXRlKHN0cnVjdCBtbWNfdGVzdF9jYXJkICp0ZXN0KQoreworCXJldHVybiBtbWNfdGVzdF9jbWRzX2R1cmluZ190ZnIodGVzdCwgMCwgMSwgMCk7Cit9CisKKy8qCisgKiBDb21tYW5kcyBkdXJpbmcgcmVhZCAtIHVzZSBTZXQgQmxvY2sgQ291bnQgKENNRDIzKS4KKyAqLworc3RhdGljIGludCBtbWNfdGVzdF9jbWRzX2R1cmluZ19yZWFkX2NtZDIzKHN0cnVjdCBtbWNfdGVzdF9jYXJkICp0ZXN0KQoreworCXJldHVybiBtbWNfdGVzdF9jbWRzX2R1cmluZ190ZnIodGVzdCwgMSwgMCwgMCk7Cit9CisKKy8qCisgKiBDb21tYW5kcyBkdXJpbmcgd3JpdGUgLSB1c2UgU2V0IEJsb2NrIENvdW50IChDTUQyMykuCisgKi8KK3N0YXRpYyBpbnQgbW1jX3Rlc3RfY21kc19kdXJpbmdfd3JpdGVfY21kMjMoc3RydWN0IG1tY190ZXN0X2NhcmQgKnRlc3QpCit7CisJcmV0dXJuIG1tY190ZXN0X2NtZHNfZHVyaW5nX3Rmcih0ZXN0LCAxLCAxLCAwKTsKK30KKworLyoKKyAqIENvbW1hbmRzIGR1cmluZyBub24tYmxvY2tpbmcgcmVhZCAtIHVzZSBTZXQgQmxvY2sgQ291bnQgKENNRDIzKS4KKyAqLworc3RhdGljIGludCBtbWNfdGVzdF9jbWRzX2R1cmluZ19yZWFkX2NtZDIzX25vbmJsb2NrKHN0cnVjdCBtbWNfdGVzdF9jYXJkICp0ZXN0KQoreworCXJldHVybiBtbWNfdGVzdF9jbWRzX2R1cmluZ190ZnIodGVzdCwgMSwgMCwgMSk7Cit9CisKKy8qCisgKiBDb21tYW5kcyBkdXJpbmcgbm9uLWJsb2NraW5nIHdyaXRlIC0gdXNlIFNldCBCbG9jayBDb3VudCAoQ01EMjMpLgorICovCitzdGF0aWMgaW50IG1tY190ZXN0X2NtZHNfZHVyaW5nX3dyaXRlX2NtZDIzX25vbmJsb2NrKHN0cnVjdCBtbWNfdGVzdF9jYXJkICp0ZXN0KQoreworCXJldHVybiBtbWNfdGVzdF9jbWRzX2R1cmluZ190ZnIodGVzdCwgMSwgMSwgMSk7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbW1jX3Rlc3RfY2FzZSBtbWNfdGVzdF9jYXNlc1tdID0gewogCXsKIAkJLm5hbWUgPSAiQmFzaWMgd3JpdGUgKG5vIGRhdGEgdmVyaWZpY2F0aW9uKSIsCkBAIC0yNjA1LDYgKzI4NzEsNDggQEAKIAkJLm5hbWUgPSAiUmVzZXQgdGVzdCIsCiAJCS5ydW4gPSBtbWNfdGVzdF9yZXNldCwKIAl9LAorCisJeworCQkubmFtZSA9ICJDb21tYW5kcyBkdXJpbmcgcmVhZCAtIG5vIFNldCBCbG9jayBDb3VudCAoQ01EMjMpIiwKKwkJLnByZXBhcmUgPSBtbWNfdGVzdF9hcmVhX3ByZXBhcmUsCisJCS5ydW4gPSBtbWNfdGVzdF9jbWRzX2R1cmluZ19yZWFkLAorCQkuY2xlYW51cCA9IG1tY190ZXN0X2FyZWFfY2xlYW51cCwKKwl9LAorCisJeworCQkubmFtZSA9ICJDb21tYW5kcyBkdXJpbmcgd3JpdGUgLSBubyBTZXQgQmxvY2sgQ291bnQgKENNRDIzKSIsCisJCS5wcmVwYXJlID0gbW1jX3Rlc3RfYXJlYV9wcmVwYXJlLAorCQkucnVuID0gbW1jX3Rlc3RfY21kc19kdXJpbmdfd3JpdGUsCisJCS5jbGVhbnVwID0gbW1jX3Rlc3RfYXJlYV9jbGVhbnVwLAorCX0sCisKKwl7CisJCS5uYW1lID0gIkNvbW1hbmRzIGR1cmluZyByZWFkIC0gdXNlIFNldCBCbG9jayBDb3VudCAoQ01EMjMpIiwKKwkJLnByZXBhcmUgPSBtbWNfdGVzdF9hcmVhX3ByZXBhcmUsCisJCS5ydW4gPSBtbWNfdGVzdF9jbWRzX2R1cmluZ19yZWFkX2NtZDIzLAorCQkuY2xlYW51cCA9IG1tY190ZXN0X2FyZWFfY2xlYW51cCwKKwl9LAorCisJeworCQkubmFtZSA9ICJDb21tYW5kcyBkdXJpbmcgd3JpdGUgLSB1c2UgU2V0IEJsb2NrIENvdW50IChDTUQyMykiLAorCQkucHJlcGFyZSA9IG1tY190ZXN0X2FyZWFfcHJlcGFyZSwKKwkJLnJ1biA9IG1tY190ZXN0X2NtZHNfZHVyaW5nX3dyaXRlX2NtZDIzLAorCQkuY2xlYW51cCA9IG1tY190ZXN0X2FyZWFfY2xlYW51cCwKKwl9LAorCisJeworCQkubmFtZSA9ICJDb21tYW5kcyBkdXJpbmcgbm9uLWJsb2NraW5nIHJlYWQgLSB1c2UgU2V0IEJsb2NrIENvdW50IChDTUQyMykiLAorCQkucHJlcGFyZSA9IG1tY190ZXN0X2FyZWFfcHJlcGFyZSwKKwkJLnJ1biA9IG1tY190ZXN0X2NtZHNfZHVyaW5nX3JlYWRfY21kMjNfbm9uYmxvY2ssCisJCS5jbGVhbnVwID0gbW1jX3Rlc3RfYXJlYV9jbGVhbnVwLAorCX0sCisKKwl7CisJCS5uYW1lID0gIkNvbW1hbmRzIGR1cmluZyBub24tYmxvY2tpbmcgd3JpdGUgLSB1c2UgU2V0IEJsb2NrIENvdW50IChDTUQyMykiLAorCQkucHJlcGFyZSA9IG1tY190ZXN0X2FyZWFfcHJlcGFyZSwKKwkJLnJ1biA9IG1tY190ZXN0X2NtZHNfZHVyaW5nX3dyaXRlX2NtZDIzX25vbmJsb2NrLAorCQkuY2xlYW51cCA9IG1tY190ZXN0X2FyZWFfY2xlYW51cCwKKwl9LAogfTsKIAogc3RhdGljIERFRklORV9NVVRFWChtbWNfdGVzdF9sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuYyBiL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuYwppbmRleCBiZjE0NjQyLi44MDM3ZjczIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jYXJkL3F1ZXVlLmMKKysrIGIvZHJpdmVycy9tbWMvY2FyZC9xdWV1ZS5jCkBAIC0xOSw3ICsxOSw5IEBACiAKICNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CisKICNpbmNsdWRlICJxdWV1ZS5oIgorI2luY2x1ZGUgImJsb2NrLmgiCiAKICNkZWZpbmUgTU1DX1FVRVVFX0JPVU5DRVNaCTY1NTM2CiAKQEAgLTMzLDcgKzM1LDggQEAKIAkvKgogCSAqIFdlIG9ubHkgbGlrZSBub3JtYWwgYmxvY2sgcmVxdWVzdHMgYW5kIGRpc2NhcmRzLgogCSAqLwotCWlmIChyZXEtPmNtZF90eXBlICE9IFJFUV9UWVBFX0ZTICYmIHJlcV9vcChyZXEpICE9IFJFUV9PUF9ESVNDQVJEKSB7CisJaWYgKHJlcS0+Y21kX3R5cGUgIT0gUkVRX1RZUEVfRlMgJiYgcmVxX29wKHJlcSkgIT0gUkVRX09QX0RJU0NBUkQgJiYKKwkgICAgcmVxX29wKHJlcSkgIT0gUkVRX09QX1NFQ1VSRV9FUkFTRSkgewogCQlibGtfZHVtcF9ycV9mbGFncyhyZXEsICJNTUMgYmFkIHJlcXVlc3QiKTsKIAkJcmV0dXJuIEJMS1BSRVBfS0lMTDsKIAl9CkBAIC02NCw4ICs2NywxMCBAQAogCQlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAKIAkJaWYgKHJlcSB8fCBtcS0+bXFycV9wcmV2LT5yZXEpIHsKKwkJCWJvb2wgcmVxX2lzX3NwZWNpYWwgPSBtbWNfcmVxX2lzX3NwZWNpYWwocmVxKTsKKwogCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQkJCW1xLT5pc3N1ZV9mbihtcSwgcmVxKTsKKwkJCW1tY19ibGtfaXNzdWVfcnEobXEsIHJlcSk7CiAJCQljb25kX3Jlc2NoZWQoKTsKIAkJCWlmIChtcS0+ZmxhZ3MgJiBNTUNfUVVFVUVfTkVXX1JFUVVFU1QpIHsKIAkJCQltcS0+ZmxhZ3MgJj0gfk1NQ19RVUVVRV9ORVdfUkVRVUVTVDsKQEAgLTc5LDcgKzg0LDcgQEAKIAkJCSAqIGhhcyBiZWVuIGZpbmlzaGVkLiBEbyBub3QgYXNzaWduIGl0IHRvIHByZXZpb3VzCiAJCQkgKiByZXF1ZXN0LgogCQkJICovCi0JCQlpZiAobW1jX3JlcV9pc19zcGVjaWFsKHJlcSkpCisJCQlpZiAocmVxX2lzX3NwZWNpYWwpCiAJCQkJbXEtPm1xcnFfY3VyLT5yZXEgPSBOVUxMOwogCiAJCQltcS0+bXFycV9wcmV2LT5icnEubXJxLmRhdGEgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY2FyZC9xdWV1ZS5oIGIvZHJpdmVycy9tbWMvY2FyZC9xdWV1ZS5oCmluZGV4IGQ2MjUzMTEuLjNjMTVhNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuaAorKysgYi9kcml2ZXJzL21tYy9jYXJkL3F1ZXVlLmgKQEAgLTQsNyArNCw5IEBACiBzdGF0aWMgaW5saW5lIGJvb2wgbW1jX3JlcV9pc19zcGVjaWFsKHN0cnVjdCByZXF1ZXN0ICpyZXEpCiB7CiAJcmV0dXJuIHJlcSAmJgotCQkocmVxX29wKHJlcSkgPT0gUkVRX09QX0ZMVVNIIHx8IHJlcV9vcChyZXEpID09IFJFUV9PUF9ESVNDQVJEKTsKKwkJKHJlcV9vcChyZXEpID09IFJFUV9PUF9GTFVTSCB8fAorCQkgcmVxX29wKHJlcSkgPT0gUkVRX09QX0RJU0NBUkQgfHwKKwkJIHJlcV9vcChyZXEpID09IFJFUV9PUF9TRUNVUkVfRVJBU0UpOwogfQogCiBzdHJ1Y3QgcmVxdWVzdDsKQEAgLTU1LDggKzU3LDYgQEAKIAl1bnNpZ25lZCBpbnQJCWZsYWdzOwogI2RlZmluZSBNTUNfUVVFVUVfU1VTUEVOREVECSgxIDw8IDApCiAjZGVmaW5lIE1NQ19RVUVVRV9ORVdfUkVRVUVTVAkoMSA8PCAxKQotCi0JaW50CQkJKCppc3N1ZV9mbikoc3RydWN0IG1tY19xdWV1ZSAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKIAl2b2lkCQkJKmRhdGE7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUJKnF1ZXVlOwogCXN0cnVjdCBtbWNfcXVldWVfcmVxCW1xcnFbMl07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL2NvcmUuYyBiL2RyaXZlcnMvbW1jL2NvcmUvY29yZS5jCmluZGV4IGU1NWNkZTYuLjI1NTNkOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvY29yZS5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvY29yZS5jCkBAIC01OCw2ICs1OCw5IEBACiAgKi8KICNkZWZpbmUgTU1DX0JLT1BTX01BWF9USU1FT1VUCSg0ICogNjAgKiAxMDAwKSAvKiBtYXggdGltZSB0byB3YWl0IGluIG1zICovCiAKKy8qIFRoZSBtYXggZXJhc2UgdGltZW91dCwgdXNlZCB3aGVuIGhvc3QtPm1heF9idXN5X3RpbWVvdXQgaXNuJ3Qgc3BlY2lmaWVkICovCisjZGVmaW5lIE1NQ19FUkFTRV9USU1FT1VUX01TCSg2MCAqIDEwMDApIC8qIDYwIHMgKi8KKwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGZyZXFzW10gPSB7IDQwMDAwMCwgMzAwMDAwLCAyMDAwMDAsIDEwMDAwMCB9OwogCiAvKgpAQCAtMTE3LDYgKzEyMCwyNCBAQAogCiAjZW5kaWYgLyogQ09ORklHX0ZBSUxfTU1DX1JFUVVFU1QgKi8KIAorc3RhdGljIGlubGluZSB2b2lkIG1tY19jb21wbGV0ZV9jbWQoc3RydWN0IG1tY19yZXF1ZXN0ICptcnEpCit7CisJaWYgKG1ycS0+Y2FwX2NtZF9kdXJpbmdfdGZyICYmICFjb21wbGV0aW9uX2RvbmUoJm1ycS0+Y21kX2NvbXBsZXRpb24pKQorCQljb21wbGV0ZV9hbGwoJm1ycS0+Y21kX2NvbXBsZXRpb24pOworfQorCit2b2lkIG1tY19jb21tYW5kX2RvbmUoc3RydWN0IG1tY19ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSkKK3sKKwlpZiAoIW1ycS0+Y2FwX2NtZF9kdXJpbmdfdGZyKQorCQlyZXR1cm47CisKKwltbWNfY29tcGxldGVfY21kKG1ycSk7CisKKwlwcl9kZWJ1ZygiJXM6IGNtZCBkb25lLCB0ZnIgb25nb2luZyAoQ01EJXUpXG4iLAorCQkgbW1jX2hvc3RuYW1lKGhvc3QpLCBtcnEtPmNtZC0+b3Bjb2RlKTsKK30KK0VYUE9SVF9TWU1CT0wobW1jX2NvbW1hbmRfZG9uZSk7CisKIC8qKgogICoJbW1jX3JlcXVlc3RfZG9uZSAtIGZpbmlzaCBwcm9jZXNzaW5nIGFuIE1NQyByZXF1ZXN0CiAgKglAaG9zdDogTU1DIGhvc3Qgd2hpY2ggY29tcGxldGVkIHJlcXVlc3QKQEAgLTE0Myw2ICsxNjQsMTEgQEAKIAkJCWNtZC0+cmV0cmllcyA9IDA7CiAJfQogCisJaWYgKGhvc3QtPm9uZ29pbmdfbXJxID09IG1ycSkKKwkJaG9zdC0+b25nb2luZ19tcnEgPSBOVUxMOworCisJbW1jX2NvbXBsZXRlX2NtZChtcnEpOworCiAJdHJhY2VfbW1jX3JlcXVlc3RfZG9uZShob3N0LCBtcnEpOwogCiAJaWYgKGVyciAmJiBjbWQtPnJldHJpZXMgJiYgIW1tY19jYXJkX3JlbW92ZWQoaG9zdC0+Y2FyZCkpIHsKQEAgLTE1NSw3ICsxODEsOCBAQAogCX0gZWxzZSB7CiAJCW1tY19zaG91bGRfZmFpbF9yZXF1ZXN0KGhvc3QsIG1ycSk7CiAKLQkJbGVkX3RyaWdnZXJfZXZlbnQoaG9zdC0+bGVkLCBMRURfT0ZGKTsKKwkJaWYgKCFob3N0LT5vbmdvaW5nX21ycSkKKwkJCWxlZF90cmlnZ2VyX2V2ZW50KGhvc3QtPmxlZCwgTEVEX09GRik7CiAKIAkJaWYgKG1ycS0+c2JjKSB7CiAJCQlwcl9kZWJ1ZygiJXM6IHJlcSBkb25lIDxDTUQldT46ICVkOiAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLApAQCAtMjIwLDYgKzI0NywxNSBAQAogCQl9CiAJfQogCisJaWYgKG1ycS0+Y2FwX2NtZF9kdXJpbmdfdGZyKSB7CisJCWhvc3QtPm9uZ29pbmdfbXJxID0gbXJxOworCQkvKgorCQkgKiBSZXRyeSBwYXRoIGNvdWxkIGNvbWUgdGhyb3VnaCBoZXJlIHdpdGhvdXQgaGF2aW5nIHdhaXRpbmcgb24KKwkJICogY21kX2NvbXBsZXRpb24sIHNvIGVuc3VyZSBpdCBpcyByZWluaXRpYWxpc2VkLgorCQkgKi8KKwkJcmVpbml0X2NvbXBsZXRpb24oJm1ycS0+Y21kX2NvbXBsZXRpb24pOworCX0KKwogCXRyYWNlX21tY19yZXF1ZXN0X3N0YXJ0KGhvc3QsIG1ycSk7CiAKIAlob3N0LT5vcHMtPnJlcXVlc3QoaG9zdCwgbXJxKTsKQEAgLTM4Niw2ICs0MjIsMTggQEAKIAljb21wbGV0ZSgmbXJxLT5jb21wbGV0aW9uKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIG1tY193YWl0X29uZ29pbmdfdGZyX2NtZChzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IG1tY19yZXF1ZXN0ICpvbmdvaW5nX21ycSA9IFJFQURfT05DRShob3N0LT5vbmdvaW5nX21ycSk7CisKKwkvKgorCSAqIElmIHRoZXJlIGlzIGFuIG9uZ29pbmcgdHJhbnNmZXIsIHdhaXQgZm9yIHRoZSBjb21tYW5kIGxpbmUgdG8gYmVjb21lCisJICogYXZhaWxhYmxlLgorCSAqLworCWlmIChvbmdvaW5nX21ycSAmJiAhY29tcGxldGlvbl9kb25lKCZvbmdvaW5nX21ycS0+Y21kX2NvbXBsZXRpb24pKQorCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZvbmdvaW5nX21ycS0+Y21kX2NvbXBsZXRpb24pOworfQorCiAvKgogICpfX21tY19zdGFydF9kYXRhX3JlcSgpIC0gc3RhcnRzIGRhdGEgcmVxdWVzdAogICogQGhvc3Q6IE1NQyBob3N0IHRvIHN0YXJ0IHRoZSByZXF1ZXN0CkBAIC0zOTMsMTcgKzQ0MSwyNCBAQAogICoKICAqIFNldHMgdGhlIGRvbmUgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gcmVxdWVzdCBpcyBjb21wbGV0ZWQgYnkgdGhlIGNhcmQuCiAgKiBTdGFydHMgZGF0YSBtbWMgcmVxdWVzdCBleGVjdXRpb24KKyAqIElmIGFuIG9uZ29pbmcgdHJhbnNmZXIgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2FpdCBmb3IgdGhlIGNvbW1hbmQgbGluZQorICogdG8gYmVjb21lIGF2YWlsYWJsZSBiZWZvcmUgc2VuZGluZyBhbm90aGVyIGNvbW1hbmQuCiAgKi8KIHN0YXRpYyBpbnQgX19tbWNfc3RhcnRfZGF0YV9yZXEoc3RydWN0IG1tY19ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSkKIHsKIAlpbnQgZXJyOwogCisJbW1jX3dhaXRfb25nb2luZ190ZnJfY21kKGhvc3QpOworCiAJbXJxLT5kb25lID0gbW1jX3dhaXRfZGF0YV9kb25lOwogCW1ycS0+aG9zdCA9IGhvc3Q7CiAKKwlpbml0X2NvbXBsZXRpb24oJm1ycS0+Y21kX2NvbXBsZXRpb24pOworCiAJZXJyID0gbW1jX3N0YXJ0X3JlcXVlc3QoaG9zdCwgbXJxKTsKIAlpZiAoZXJyKSB7CiAJCW1ycS0+Y21kLT5lcnJvciA9IGVycjsKKwkJbW1jX2NvbXBsZXRlX2NtZChtcnEpOwogCQltbWNfd2FpdF9kYXRhX2RvbmUobXJxKTsKIAl9CiAKQEAgLTQxNCwxMiArNDY5LDE3IEBACiB7CiAJaW50IGVycjsKIAorCW1tY193YWl0X29uZ29pbmdfdGZyX2NtZChob3N0KTsKKwogCWluaXRfY29tcGxldGlvbigmbXJxLT5jb21wbGV0aW9uKTsKIAltcnEtPmRvbmUgPSBtbWNfd2FpdF9kb25lOwogCisJaW5pdF9jb21wbGV0aW9uKCZtcnEtPmNtZF9jb21wbGV0aW9uKTsKKwogCWVyciA9IG1tY19zdGFydF9yZXF1ZXN0KGhvc3QsIG1ycSk7CiAJaWYgKGVycikgewogCQltcnEtPmNtZC0+ZXJyb3IgPSBlcnI7CisJCW1tY19jb21wbGV0ZV9jbWQobXJxKTsKIAkJY29tcGxldGUoJm1ycS0+Y29tcGxldGlvbik7CiAJfQogCkBAIC00ODMsOCArNTQzLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCBtbWNfd2FpdF9mb3JfcmVxX2RvbmUoc3RydWN0IG1tY19ob3N0ICpob3N0LAotCQkJCSAgc3RydWN0IG1tY19yZXF1ZXN0ICptcnEpCit2b2lkIG1tY193YWl0X2Zvcl9yZXFfZG9uZShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQogewogCXN0cnVjdCBtbWNfY29tbWFuZCAqY21kOwogCkBAIC01MjUsNiArNTg0LDI4IEBACiAKIAltbWNfcmV0dW5lX3JlbGVhc2UoaG9zdCk7CiB9CitFWFBPUlRfU1lNQk9MKG1tY193YWl0X2Zvcl9yZXFfZG9uZSk7CisKKy8qKgorICoJbW1jX2lzX3JlcV9kb25lIC0gRGV0ZXJtaW5lIGlmIGEgJ2NhcF9jbWRfZHVyaW5nX3RmcicgcmVxdWVzdCBpcyBkb25lCisgKglAaG9zdDogTU1DIGhvc3QKKyAqCUBtcnE6IE1NQyByZXF1ZXN0CisgKgorICoJbW1jX2lzX3JlcV9kb25lKCkgaXMgdXNlZCB3aXRoIHJlcXVlc3RzIHRoYXQgaGF2ZQorICoJbXJxLT5jYXBfY21kX2R1cmluZ190ZnIgPSB0cnVlLiBtbWNfaXNfcmVxX2RvbmUoKSBtdXN0IGJlIGNhbGxlZCBhZnRlcgorICoJc3RhcnRpbmcgYSByZXF1ZXN0IGFuZCBiZWZvcmUgd2FpdGluZyBmb3IgaXQgdG8gY29tcGxldGUuIFRoYXQgaXMsCisgKgllaXRoZXIgaW4gYmV0d2VlbiBjYWxscyB0byBtbWNfc3RhcnRfcmVxKCksIG9yIGFmdGVyIG1tY193YWl0X2Zvcl9yZXEoKQorICoJYW5kIGJlZm9yZSBtbWNfd2FpdF9mb3JfcmVxX2RvbmUoKS4gSWYgaXQgaXMgY2FsbGVkIGF0IG90aGVyIHRpbWVzIHRoZQorICoJcmVzdWx0IGlzIG5vdCBtZWFuaW5nZnVsLgorICovCitib29sIG1tY19pc19yZXFfZG9uZShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQoreworCWlmIChob3N0LT5hcmVxKQorCQlyZXR1cm4gaG9zdC0+Y29udGV4dF9pbmZvLmlzX2RvbmVfcmN2OworCWVsc2UKKwkJcmV0dXJuIGNvbXBsZXRpb25fZG9uZSgmbXJxLT5jb21wbGV0aW9uKTsKK30KK0VYUE9SVF9TWU1CT0wobW1jX2lzX3JlcV9kb25lKTsKIAogLyoqCiAgKgltbWNfcHJlX3JlcSAtIFByZXBhcmUgZm9yIGEgbmV3IHJlcXVlc3QKQEAgLTY0NSwxMyArNzI2LDE4IEBACiAgKglAbXJxOiBNTUMgcmVxdWVzdCB0byBzdGFydAogICoKICAqCVN0YXJ0IGEgbmV3IE1NQyBjdXN0b20gY29tbWFuZCByZXF1ZXN0IGZvciBhIGhvc3QsIGFuZCB3YWl0Ci0gKglmb3IgdGhlIGNvbW1hbmQgdG8gY29tcGxldGUuIERvZXMgbm90IGF0dGVtcHQgdG8gcGFyc2UgdGhlCi0gKglyZXNwb25zZS4KKyAqCWZvciB0aGUgY29tbWFuZCB0byBjb21wbGV0ZS4gSW4gdGhlIGNhc2Ugb2YgJ2NhcF9jbWRfZHVyaW5nX3RmcicKKyAqCXJlcXVlc3RzLCB0aGUgdHJhbnNmZXIgaXMgb25nb2luZyBhbmQgdGhlIGNhbGxlciBjYW4gaXNzdWUgZnVydGhlcgorICoJY29tbWFuZHMgdGhhdCBkbyBub3QgdXNlIHRoZSBkYXRhIGxpbmVzLCBhbmQgdGhlbiB3YWl0IGJ5IGNhbGxpbmcKKyAqCW1tY193YWl0X2Zvcl9yZXFfZG9uZSgpLgorICoJRG9lcyBub3QgYXR0ZW1wdCB0byBwYXJzZSB0aGUgcmVzcG9uc2UuCiAgKi8KIHZvaWQgbW1jX3dhaXRfZm9yX3JlcShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQogewogCV9fbW1jX3N0YXJ0X3JlcShob3N0LCBtcnEpOwotCW1tY193YWl0X2Zvcl9yZXFfZG9uZShob3N0LCBtcnEpOworCisJaWYgKCFtcnEtPmNhcF9jbWRfZHVyaW5nX3RmcikKKwkJbW1jX3dhaXRfZm9yX3JlcV9kb25lKGhvc3QsIG1ycSk7CiB9CiBFWFBPUlRfU1lNQk9MKG1tY193YWl0X2Zvcl9yZXEpOwogCkBAIC0yMjAyLDYgKzIyODgsNTQgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgdW5zaWduZWQgaW50IG1tY19hbGlnbl9lcmFzZV9zaXplKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwKKwkJCQkJIHVuc2lnbmVkIGludCAqZnJvbSwKKwkJCQkJIHVuc2lnbmVkIGludCAqdG8sCisJCQkJCSB1bnNpZ25lZCBpbnQgbnIpCit7CisJdW5zaWduZWQgaW50IGZyb21fbmV3ID0gKmZyb20sIG5yX25ldyA9IG5yLCByZW07CisKKwkvKgorCSAqIFdoZW4gdGhlICdjYXJkLT5lcmFzZV9zaXplJyBpcyBwb3dlciBvZiAyLCB3ZSBjYW4gdXNlIHJvdW5kX3VwL2Rvd24oKQorCSAqIHRvIGFsaWduIHRoZSBlcmFzZSBzaXplIGVmZmljaWVudGx5LgorCSAqLworCWlmIChpc19wb3dlcl9vZl8yKGNhcmQtPmVyYXNlX3NpemUpKSB7CisJCXVuc2lnbmVkIGludCB0ZW1wID0gZnJvbV9uZXc7CisKKwkJZnJvbV9uZXcgPSByb3VuZF91cCh0ZW1wLCBjYXJkLT5lcmFzZV9zaXplKTsKKwkJcmVtID0gZnJvbV9uZXcgLSB0ZW1wOworCisJCWlmIChucl9uZXcgPiByZW0pCisJCQlucl9uZXcgLT0gcmVtOworCQllbHNlCisJCQlyZXR1cm4gMDsKKworCQlucl9uZXcgPSByb3VuZF9kb3duKG5yX25ldywgY2FyZC0+ZXJhc2Vfc2l6ZSk7CisJfSBlbHNlIHsKKwkJcmVtID0gZnJvbV9uZXcgJSBjYXJkLT5lcmFzZV9zaXplOworCQlpZiAocmVtKSB7CisJCQlyZW0gPSBjYXJkLT5lcmFzZV9zaXplIC0gcmVtOworCQkJZnJvbV9uZXcgKz0gcmVtOworCQkJaWYgKG5yX25ldyA+IHJlbSkKKwkJCQlucl9uZXcgLT0gcmVtOworCQkJZWxzZQorCQkJCXJldHVybiAwOworCQl9CisKKwkJcmVtID0gbnJfbmV3ICUgY2FyZC0+ZXJhc2Vfc2l6ZTsKKwkJaWYgKHJlbSkKKwkJCW5yX25ldyAtPSByZW07CisJfQorCisJaWYgKG5yX25ldyA9PSAwKQorCQlyZXR1cm4gMDsKKworCSp0byA9IGZyb21fbmV3ICsgbnJfbmV3OworCSpmcm9tID0gZnJvbV9uZXc7CisKKwlyZXR1cm4gbnJfbmV3OworfQorCiAvKioKICAqIG1tY19lcmFzZSAtIGVyYXNlIHNlY3RvcnMuCiAgKiBAY2FyZDogY2FyZCB0byBlcmFzZQpAQCAtMjI0MCwyNiArMjM3NCwxMiBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKGFyZyA9PSBNTUNfRVJBU0VfQVJHKSB7Ci0JCXJlbSA9IGZyb20gJSBjYXJkLT5lcmFzZV9zaXplOwotCQlpZiAocmVtKSB7Ci0JCQlyZW0gPSBjYXJkLT5lcmFzZV9zaXplIC0gcmVtOwotCQkJZnJvbSArPSByZW07Ci0JCQlpZiAobnIgPiByZW0pCi0JCQkJbnIgLT0gcmVtOwotCQkJZWxzZQotCQkJCXJldHVybiAwOwotCQl9Ci0JCXJlbSA9IG5yICUgY2FyZC0+ZXJhc2Vfc2l6ZTsKLQkJaWYgKHJlbSkKLQkJCW5yIC09IHJlbTsKLQl9CisJaWYgKGFyZyA9PSBNTUNfRVJBU0VfQVJHKQorCQluciA9IG1tY19hbGlnbl9lcmFzZV9zaXplKGNhcmQsICZmcm9tLCAmdG8sIG5yKTsKIAogCWlmIChuciA9PSAwKQogCQlyZXR1cm4gMDsKIAotCXRvID0gZnJvbSArIG5yOwotCiAJaWYgKHRvIDw9IGZyb20pCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0yMzUyLDYgKzI0NzIsOCBAQAogCXN0cnVjdCBtbWNfaG9zdCAqaG9zdCA9IGNhcmQtPmhvc3Q7CiAJdW5zaWduZWQgaW50IG1heF9kaXNjYXJkLCB4LCB5LCBxdHkgPSAwLCBtYXhfcXR5LCBtaW5fcXR5LCB0aW1lb3V0OwogCXVuc2lnbmVkIGludCBsYXN0X3RpbWVvdXQgPSAwOworCXVuc2lnbmVkIGludCBtYXhfYnVzeV90aW1lb3V0ID0gaG9zdC0+bWF4X2J1c3lfdGltZW91dCA/CisJCQlob3N0LT5tYXhfYnVzeV90aW1lb3V0IDogTU1DX0VSQVNFX1RJTUVPVVRfTVM7CiAKIAlpZiAoY2FyZC0+ZXJhc2Vfc2hpZnQpIHsKIAkJbWF4X3F0eSA9IFVJTlRfTUFYID4+IGNhcmQtPmVyYXNlX3NoaWZ0OwpAQCAtMjM3NCwxNSArMjQ5NiwxNSBAQAogCSAqIG1hdHRlciB3aGF0IHNpemUgb2YgJ2hvc3QtPm1heF9idXN5X3RpbWVvdXQnLCBidXQgaWYgdGhlCiAJICogJ2hvc3QtPm1heF9idXN5X3RpbWVvdXQnIGlzIGxhcmdlIGVub3VnaCBmb3IgbW9yZSBkaXNjYXJkIHNlY3RvcnMsCiAJICogdGhlbiB3ZSBjYW4gY29udGludWUgdG8gaW5jcmVhc2UgdGhlIG1heCBkaXNjYXJkIHNlY3RvcnMgdW50aWwgd2UKLQkgKiBnZXQgYSBiYWxhbmNlIHZhbHVlLgorCSAqIGdldCBhIGJhbGFuY2UgdmFsdWUuIEluIGNhc2VzIHdoZW4gdGhlICdob3N0LT5tYXhfYnVzeV90aW1lb3V0JworCSAqIGlzbid0IHNwZWNpZmllZCwgdXNlIHRoZSBkZWZhdWx0IG1heCBlcmFzZSB0aW1lb3V0LgogCSAqLwogCWRvIHsKIAkJeSA9IDA7CiAJCWZvciAoeCA9IDE7IHggJiYgeCA8PSBtYXhfcXR5ICYmIG1heF9xdHkgLSB4ID49IHF0eTsgeCA8PD0gMSkgewogCQkJdGltZW91dCA9IG1tY19lcmFzZV90aW1lb3V0KGNhcmQsIGFyZywgcXR5ICsgeCk7CiAKLQkJCWlmIChxdHkgKyB4ID4gbWluX3F0eSAmJgotCQkJICAgIHRpbWVvdXQgPiBob3N0LT5tYXhfYnVzeV90aW1lb3V0KQorCQkJaWYgKHF0eSArIHggPiBtaW5fcXR5ICYmIHRpbWVvdXQgPiBtYXhfYnVzeV90aW1lb3V0KQogCQkJCWJyZWFrOwogCiAJCQlpZiAodGltZW91dCA8IGxhc3RfdGltZW91dCkKQEAgLTI0MjcsOSArMjU0OSw2IEBACiAJc3RydWN0IG1tY19ob3N0ICpob3N0ID0gY2FyZC0+aG9zdDsKIAl1bnNpZ25lZCBpbnQgbWF4X2Rpc2NhcmQsIG1heF90cmltOwogCi0JaWYgKCFob3N0LT5tYXhfYnVzeV90aW1lb3V0KQotCQlyZXR1cm4gVUlOVF9NQVg7Ci0KIAkvKgogCSAqIFdpdGhvdXQgZXJhc2VfZ3JvdXBfZGVmIHNldCwgTU1DIGVyYXNlIHRpbWVvdXQgZGVwZW5kcyBvbiBjbG9jawogCSAqIGZyZXF1ZW5jZSB3aGljaCBjYW4gY2hhbmdlLiAgSW4gdGhhdCBjYXNlLCB0aGUgYmVzdCBjaG9pY2UgaXMKQEAgLTI0NDcsNyArMjU2Niw4IEBACiAJCW1heF9kaXNjYXJkID0gMDsKIAl9CiAJcHJfZGVidWcoIiVzOiBjYWxjdWxhdGVkIG1heC4gZGlzY2FyZCBzZWN0b3JzICV1IGZvciB0aW1lb3V0ICV1IG1zXG4iLAotCQkgbW1jX2hvc3RuYW1lKGhvc3QpLCBtYXhfZGlzY2FyZCwgaG9zdC0+bWF4X2J1c3lfdGltZW91dCk7CisJCW1tY19ob3N0bmFtZShob3N0KSwgbWF4X2Rpc2NhcmQsIGhvc3QtPm1heF9idXN5X3RpbWVvdXQgPworCQlob3N0LT5tYXhfYnVzeV90aW1lb3V0IDogTU1DX0VSQVNFX1RJTUVPVVRfTVMpOwogCXJldHVybiBtYXhfZGlzY2FyZDsKIH0KIEVYUE9SVF9TWU1CT0wobW1jX2NhbGNfbWF4X2Rpc2NhcmQpOwpAQCAtMjQ1Niw3ICsyNTc2LDggQEAKIHsKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kID0gezB9OwogCi0JaWYgKG1tY19jYXJkX2Jsb2NrYWRkcihjYXJkKSB8fCBtbWNfY2FyZF9kZHI1MihjYXJkKSkKKwlpZiAobW1jX2NhcmRfYmxvY2thZGRyKGNhcmQpIHx8IG1tY19jYXJkX2RkcjUyKGNhcmQpIHx8CisJICAgIG1tY19jYXJkX2hzNDAwKGNhcmQpIHx8IG1tY19jYXJkX2hzNDAwZXMoY2FyZCkpCiAJCXJldHVybiAwOwogCiAJY21kLm9wY29kZSA9IE1NQ19TRVRfQkxPQ0tMRU47CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL21tYy5jIGIvZHJpdmVycy9tbWMvY29yZS9tbWMuYwppbmRleCBmMmQxODVjLi4zNDg2YmM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL21tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvbW1jLmMKQEAgLTEwMjksNiArMTAyOSwxMCBAQAogCQllcnIgPSBtbWNfc3dpdGNoX3N0YXR1cyhjYXJkKTsKIAl9CiAKKwlpZiAoZXJyKQorCQlwcl93YXJuKCIlczogc3dpdGNoIHRvIGhpZ2gtc3BlZWQgZmFpbGVkLCBlcnI6JWRcbiIsCisJCQltbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCksIGVycik7CisKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xMjY1LDExICsxMjY5LDggQEAKIAogCS8qIFN3aXRjaCBjYXJkIHRvIEhTIG1vZGUgKi8KIAllcnIgPSBtbWNfc2VsZWN0X2hzKGNhcmQpOwotCWlmIChlcnIpIHsKLQkJcHJfZXJyKCIlczogc3dpdGNoIHRvIGhpZ2gtc3BlZWQgZmFpbGVkLCBlcnI6JWRcbiIsCi0JCQltbWNfaG9zdG5hbWUoaG9zdCksIGVycik7CisJaWYgKGVycikKIAkJZ290byBvdXRfZXJyOwotCX0KIAogCWVyciA9IG1tY19zd2l0Y2hfc3RhdHVzKGNhcmQpOwogCWlmIChlcnIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL3B3cnNlcV9zaW1wbGUuYyBiL2RyaXZlcnMvbW1jL2NvcmUvcHdyc2VxX3NpbXBsZS5jCmluZGV4IDQ1MGQ5MDcuLjEzMDQxNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvcHdyc2VxX3NpbXBsZS5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvcHdyc2VxX3NpbXBsZS5jCkBAIC0xNiw2ICsxNiw4IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvcGVydHkuaD4KIAogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CiAKQEAgLTI0LDYgKzI2LDcgQEAKIHN0cnVjdCBtbWNfcHdyc2VxX3NpbXBsZSB7CiAJc3RydWN0IG1tY19wd3JzZXEgcHdyc2VxOwogCWJvb2wgY2xrX2VuYWJsZWQ7CisJdTMyIHBvc3RfcG93ZXJfb25fZGVsYXlfbXM7CiAJc3RydWN0IGNsayAqZXh0X2NsazsKIAlzdHJ1Y3QgZ3Bpb19kZXNjcyAqcmVzZXRfZ3Bpb3M7CiB9OwpAQCAtNjQsNiArNjcsOSBAQAogCXN0cnVjdCBtbWNfcHdyc2VxX3NpbXBsZSAqcHdyc2VxID0gdG9fcHdyc2VxX3NpbXBsZShob3N0LT5wd3JzZXEpOwogCiAJbW1jX3B3cnNlcV9zaW1wbGVfc2V0X2dwaW9zX3ZhbHVlKHB3cnNlcSwgMCk7CisKKwlpZiAocHdyc2VxLT5wb3N0X3Bvd2VyX29uX2RlbGF5X21zKQorCQltc2xlZXAocHdyc2VxLT5wb3N0X3Bvd2VyX29uX2RlbGF5X21zKTsKIH0KIAogc3RhdGljIHZvaWQgbW1jX3B3cnNlcV9zaW1wbGVfcG93ZXJfb2ZmKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKQEAgLTExMSw2ICsxMTcsOSBAQAogCQlyZXR1cm4gUFRSX0VSUihwd3JzZXEtPnJlc2V0X2dwaW9zKTsKIAl9CiAKKwlkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIoZGV2LCAicG9zdC1wb3dlci1vbi1kZWxheS1tcyIsCisJCQkJICZwd3JzZXEtPnBvc3RfcG93ZXJfb25fZGVsYXlfbXMpOworCiAJcHdyc2VxLT5wd3JzZXEuZGV2ID0gZGV2OwogCXB3cnNlcS0+cHdyc2VxLm9wcyA9ICZtbWNfcHdyc2VxX3NpbXBsZV9vcHM7CiAJcHdyc2VxLT5wd3JzZXEub3duZXIgPSBUSElTX01PRFVMRTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvc2QuYyBiL2RyaXZlcnMvbW1jL2NvcmUvc2QuYwppbmRleCAwMTIzOTM2Li43M2M3NjJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL3NkLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9zZC5jCkBAIC0yMjMsOCArMjIzLDcgQEAKIHN0YXRpYyBpbnQgbW1jX3JlYWRfc3NyKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCkKIHsKIAl1bnNpZ25lZCBpbnQgYXUsIGVzLCBldCwgZW87Ci0JaW50IGVyciwgaTsKLQl1MzIgKnNzcjsKKwlpbnQgaTsKIAogCWlmICghKGNhcmQtPmNzZC5jbWRjbGFzcyAmIENDQ19BUFBfU1BFQykpIHsKIAkJcHJfd2FybigiJXM6IGNhcmQgbGFja3MgbWFuZGF0b3J5IFNEIFN0YXR1cyBmdW5jdGlvblxuIiwKQEAgLTIzMiwzMyArMjMxLDI3IEBACiAJCXJldHVybiAwOwogCX0KIAotCXNzciA9IGttYWxsb2MoNjQsIEdGUF9LRVJORUwpOwotCWlmICghc3NyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWVyciA9IG1tY19hcHBfc2Rfc3RhdHVzKGNhcmQsIHNzcik7Ci0JaWYgKGVycikgeworCWlmIChtbWNfYXBwX3NkX3N0YXR1cyhjYXJkLCBjYXJkLT5yYXdfc3NyKSkgewogCQlwcl93YXJuKCIlczogcHJvYmxlbSByZWFkaW5nIFNEIFN0YXR1cyByZWdpc3RlclxuIiwKIAkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7Ci0JCWVyciA9IDA7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm4gMDsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJc3NyW2ldID0gYmUzMl90b19jcHUoc3NyW2ldKTsKKwkJY2FyZC0+cmF3X3NzcltpXSA9IGJlMzJfdG9fY3B1KGNhcmQtPnJhd19zc3JbaV0pOwogCiAJLyoKIAkgKiBVTlNUVUZGX0JJVFMgb25seSB3b3JrcyB3aXRoIGZvdXIgdTMycyBzbyB3ZSBoYXZlIHRvIG9mZnNldCB0aGUKIAkgKiBiaXRmaWVsZCBwb3NpdGlvbnMgYWNjb3JkaW5nbHkuCiAJICovCi0JYXUgPSBVTlNUVUZGX0JJVFMoc3NyLCA0MjggLSAzODQsIDQpOworCWF1ID0gVU5TVFVGRl9CSVRTKGNhcmQtPnJhd19zc3IsIDQyOCAtIDM4NCwgNCk7CiAJaWYgKGF1KSB7CiAJCWlmIChhdSA8PSA5IHx8IGNhcmQtPnNjci5zZGFfc3BlYzMpIHsKIAkJCWNhcmQtPnNzci5hdSA9IHNkX2F1X3NpemVbYXVdOwotCQkJZXMgPSBVTlNUVUZGX0JJVFMoc3NyLCA0MDggLSAzODQsIDE2KTsKLQkJCWV0ID0gVU5TVFVGRl9CSVRTKHNzciwgNDAyIC0gMzg0LCA2KTsKKwkJCWVzID0gVU5TVFVGRl9CSVRTKGNhcmQtPnJhd19zc3IsIDQwOCAtIDM4NCwgMTYpOworCQkJZXQgPSBVTlNUVUZGX0JJVFMoY2FyZC0+cmF3X3NzciwgNDAyIC0gMzg0LCA2KTsKIAkJCWlmIChlcyAmJiBldCkgewotCQkJCWVvID0gVU5TVFVGRl9CSVRTKHNzciwgNDAwIC0gMzg0LCAyKTsKKwkJCQllbyA9IFVOU1RVRkZfQklUUyhjYXJkLT5yYXdfc3NyLCA0MDAgLSAzODQsIDIpOwogCQkJCWNhcmQtPnNzci5lcmFzZV90aW1lb3V0ID0gKGV0ICogMTAwMCkgLyBlczsKIAkJCQljYXJkLT5zc3IuZXJhc2Vfb2Zmc2V0ID0gZW8gKiAxMDAwOwogCQkJfQpAQCAtMjY3LDkgKzI2MCw4IEBACiAJCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpKTsKIAkJfQogCX0KLW91dDoKLQlrZnJlZShzc3IpOwotCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTY2Niw2ICs2NTgsMTQgQEAKIE1NQ19ERVZfQVRUUihjc2QsICIlMDh4JTA4eCUwOHglMDh4XG4iLCBjYXJkLT5yYXdfY3NkWzBdLCBjYXJkLT5yYXdfY3NkWzFdLAogCWNhcmQtPnJhd19jc2RbMl0sIGNhcmQtPnJhd19jc2RbM10pOwogTU1DX0RFVl9BVFRSKHNjciwgIiUwOHglMDh4XG4iLCBjYXJkLT5yYXdfc2NyWzBdLCBjYXJkLT5yYXdfc2NyWzFdKTsKK01NQ19ERVZfQVRUUihzc3IsCisJIiUwOHglMDh4JTA4eCUwOHglMDh4JTA4eCUwOHglMDh4JTA4eCUwOHglMDh4JTA4eCUwOHglMDh4JTA4eCUwOHhcbiIsCisJCWNhcmQtPnJhd19zc3JbMF0sIGNhcmQtPnJhd19zc3JbMV0sIGNhcmQtPnJhd19zc3JbMl0sCisJCWNhcmQtPnJhd19zc3JbM10sIGNhcmQtPnJhd19zc3JbNF0sIGNhcmQtPnJhd19zc3JbNV0sCisJCWNhcmQtPnJhd19zc3JbNl0sIGNhcmQtPnJhd19zc3JbN10sIGNhcmQtPnJhd19zc3JbOF0sCisJCWNhcmQtPnJhd19zc3JbOV0sIGNhcmQtPnJhd19zc3JbMTBdLCBjYXJkLT5yYXdfc3NyWzExXSwKKwkJY2FyZC0+cmF3X3NzclsxMl0sIGNhcmQtPnJhd19zc3JbMTNdLCBjYXJkLT5yYXdfc3NyWzE0XSwKKwkJY2FyZC0+cmF3X3NzclsxNV0pOwogTU1DX0RFVl9BVFRSKGRhdGUsICIlMDJkLyUwNGRcbiIsIGNhcmQtPmNpZC5tb250aCwgY2FyZC0+Y2lkLnllYXIpOwogTU1DX0RFVl9BVFRSKGVyYXNlX3NpemUsICIldVxuIiwgY2FyZC0+ZXJhc2Vfc2l6ZSA8PCA5KTsKIE1NQ19ERVZfQVRUUihwcmVmZXJyZWRfZXJhc2Vfc2l6ZSwgIiV1XG4iLCBjYXJkLT5wcmVmX2VyYXNlIDw8IDkpOwpAQCAtNjk4LDYgKzY5OCw3IEBACiAJJmRldl9hdHRyX2NpZC5hdHRyLAogCSZkZXZfYXR0cl9jc2QuYXR0ciwKIAkmZGV2X2F0dHJfc2NyLmF0dHIsCisJJmRldl9hdHRyX3Nzci5hdHRyLAogCSZkZXZfYXR0cl9kYXRlLmF0dHIsCiAJJmRldl9hdHRyX2VyYXNlX3NpemUuYXR0ciwKIAkmZGV2X2F0dHJfcHJlZmVycmVkX2VyYXNlX3NpemUuYXR0ciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19pby5jIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvX2lvLmMKaW5kZXggNzhjYjRkNS4uNDA2ZTVmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9zZGlvX2lvLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvX2lvLmMKQEAgLTI2LDggKzI2LDggQEAKICAqLwogdm9pZCBzZGlvX2NsYWltX2hvc3Qoc3RydWN0IHNkaW9fZnVuYyAqZnVuYykKIHsKLQlCVUdfT04oIWZ1bmMpOwotCUJVR19PTighZnVuYy0+Y2FyZCk7CisJaWYgKFdBUk5fT04oIWZ1bmMpKQorCQlyZXR1cm47CiAKIAltbWNfY2xhaW1faG9zdChmdW5jLT5jYXJkLT5ob3N0KTsKIH0KQEAgLTQyLDggKzQyLDggQEAKICAqLwogdm9pZCBzZGlvX3JlbGVhc2VfaG9zdChzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jKQogewotCUJVR19PTighZnVuYyk7Ci0JQlVHX09OKCFmdW5jLT5jYXJkKTsKKwlpZiAoV0FSTl9PTighZnVuYykpCisJCXJldHVybjsKIAogCW1tY19yZWxlYXNlX2hvc3QoZnVuYy0+Y2FyZC0+aG9zdCk7CiB9CkBAIC02Miw4ICs2Miw4IEBACiAJdW5zaWduZWQgY2hhciByZWc7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCi0JQlVHX09OKCFmdW5jKTsKLQlCVUdfT04oIWZ1bmMtPmNhcmQpOworCWlmICghZnVuYykKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwcl9kZWJ1ZygiU0RJTzogRW5hYmxpbmcgZGV2aWNlICVzLi4uXG4iLCBzZGlvX2Z1bmNfaWQoZnVuYykpOwogCkBAIC0xMTIsOCArMTEyLDggQEAKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGNoYXIgcmVnOwogCi0JQlVHX09OKCFmdW5jKTsKLQlCVUdfT04oIWZ1bmMtPmNhcmQpOworCWlmICghZnVuYykKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwcl9kZWJ1ZygiU0RJTzogRGlzYWJsaW5nIGRldmljZSAlcy4uLlxuIiwgc2Rpb19mdW5jX2lkKGZ1bmMpKTsKIApAQCAtMzA3LDYgKzMwNyw5IEBACiAJdW5zaWduZWQgbWF4X2Jsb2NrczsKIAlpbnQgcmV0OwogCisJaWYgKCFmdW5jIHx8IChmdW5jLT5udW0gPiA3KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAkvKiBEbyB0aGUgYnVsayBvZiB0aGUgdHJhbnNmZXIgdXNpbmcgYmxvY2sgbW9kZSAoaWYgc3VwcG9ydGVkKS4gKi8KIAlpZiAoZnVuYy0+Y2FyZC0+Y2Njci5tdWx0aV9ibG9jayAmJiAoc2l6ZSA+IHNkaW9fbWF4X2J5dGVfc2l6ZShmdW5jKSkpIHsKIAkJLyogQmxvY2tzIHBlciBjb21tYW5kIGlzIGxpbWl0ZWQgYnkgaG9zdCBjb3VudCwgaG9zdCB0cmFuc2ZlcgpAQCAtMzY3LDcgKzM3MCwxMCBAQAogCWludCByZXQ7CiAJdTggdmFsOwogCi0JQlVHX09OKCFmdW5jKTsKKwlpZiAoIWZ1bmMpIHsKKwkJKmVycl9yZXQgPSAtRUlOVkFMOworCQlyZXR1cm4gMHhGRjsKKwl9CiAKIAlpZiAoZXJyX3JldCkKIAkJKmVycl9yZXQgPSAwOwpAQCAtMzk4LDcgKzQwNCwxMCBAQAogewogCWludCByZXQ7CiAKLQlCVUdfT04oIWZ1bmMpOworCWlmICghZnVuYykgeworCQkqZXJyX3JldCA9IC1FSU5WQUw7CisJCXJldHVybjsKKwl9CiAKIAlyZXQgPSBtbWNfaW9fcndfZGlyZWN0KGZ1bmMtPmNhcmQsIDEsIGZ1bmMtPm51bSwgYWRkciwgYiwgTlVMTCk7CiAJaWYgKGVycl9yZXQpCkBAIC02MjMsNyArNjMyLDEwIEBACiAJaW50IHJldDsKIAl1bnNpZ25lZCBjaGFyIHZhbDsKIAotCUJVR19PTighZnVuYyk7CisJaWYgKCFmdW5jKSB7CisJCSplcnJfcmV0ID0gLUVJTlZBTDsKKwkJcmV0dXJuIDB4RkY7CisJfQogCiAJaWYgKGVycl9yZXQpCiAJCSplcnJfcmV0ID0gMDsKQEAgLTY1OCw3ICs2NzAsMTAgQEAKIHsKIAlpbnQgcmV0OwogCi0JQlVHX09OKCFmdW5jKTsKKwlpZiAoIWZ1bmMpIHsKKwkJKmVycl9yZXQgPSAtRUlOVkFMOworCQlyZXR1cm47CisJfQogCiAJaWYgKChhZGRyIDwgMHhGMCB8fCBhZGRyID4gMHhGRikgJiYgKCFtbWNfY2FyZF9sZW5pZW50X2ZuMChmdW5jLT5jYXJkKSkpIHsKIAkJaWYgKGVycl9yZXQpCkBAIC02ODQsOCArNjk5LDggQEAKICAqLwogbW1jX3BtX2ZsYWdfdCBzZGlvX2dldF9ob3N0X3BtX2NhcHMoc3RydWN0IHNkaW9fZnVuYyAqZnVuYykKIHsKLQlCVUdfT04oIWZ1bmMpOwotCUJVR19PTighZnVuYy0+Y2FyZCk7CisJaWYgKCFmdW5jKQorCQlyZXR1cm4gMDsKIAogCXJldHVybiBmdW5jLT5jYXJkLT5ob3N0LT5wbV9jYXBzOwogfQpAQCAtNzA3LDggKzcyMiw4IEBACiB7CiAJc3RydWN0IG1tY19ob3N0ICpob3N0OwogCi0JQlVHX09OKCFmdW5jKTsKLQlCVUdfT04oIWZ1bmMtPmNhcmQpOworCWlmICghZnVuYykKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlob3N0ID0gZnVuYy0+Y2FyZC0+aG9zdDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9zZGlvX29wcy5jIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvX29wcy5jCmluZGV4IDM0ZjZlODAuLjkwZmU1NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19vcHMuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL3NkaW9fb3BzLmMKQEAgLTI0LDggKzI0LDYgQEAKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kID0gezB9OwogCWludCBpLCBlcnIgPSAwOwogCi0JQlVHX09OKCFob3N0KTsKLQogCWNtZC5vcGNvZGUgPSBTRF9JT19TRU5EX09QX0NPTkQ7CiAJY21kLmFyZyA9IG9jcjsKIAljbWQuZmxhZ3MgPSBNTUNfUlNQX1NQSV9SNCB8IE1NQ19SU1BfUjQgfCBNTUNfQ01EX0JDUjsKQEAgLTcxLDggKzY5LDggQEAKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQgY21kID0gezB9OwogCWludCBlcnI7CiAKLQlCVUdfT04oIWhvc3QpOwotCUJVR19PTihmbiA+IDcpOworCWlmIChmbiA+IDcpCisJCXJldHVybiAtRUlOVkFMOwogCiAJLyogc2FuaXR5IGNoZWNrICovCiAJaWYgKGFkZHIgJiB+MHgxRkZGRikKQEAgLTExNCw3ICsxMTIsNiBAQAogaW50IG1tY19pb19yd19kaXJlY3Qoc3RydWN0IG1tY19jYXJkICpjYXJkLCBpbnQgd3JpdGUsIHVuc2lnbmVkIGZuLAogCXVuc2lnbmVkIGFkZHIsIHU4IGluLCB1OCAqb3V0KQogewotCUJVR19PTighY2FyZCk7CiAJcmV0dXJuIG1tY19pb19yd19kaXJlY3RfaG9zdChjYXJkLT5ob3N0LCB3cml0ZSwgZm4sIGFkZHIsIGluLCBvdXQpOwogfQogCkBAIC0xMjksOCArMTI2LDYgQEAKIAl1bnNpZ25lZCBpbnQgbmVudHMsIGxlZnRfc2l6ZSwgaTsKIAl1bnNpZ25lZCBpbnQgc2VnX3NpemUgPSBjYXJkLT5ob3N0LT5tYXhfc2VnX3NpemU7CiAKLQlCVUdfT04oIWNhcmQpOwotCUJVR19PTihmbiA+IDcpOwogCVdBUk5fT04oYmxrc3ogPT0gMCk7CiAKIAkvKiBzYW5pdHkgY2hlY2sgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvZGF2aW5jaV9tbWMuYyBiL2RyaXZlcnMvbW1jL2hvc3QvZGF2aW5jaV9tbWMuYwppbmRleCBhNTYzNzNjLi44ZmE0NzhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L2RhdmluY2lfbW1jLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9kYXZpbmNpX21tYy5jCkBAIC0xMjE2LDkgKzEyMTYsMTEgQEAKIAl9CiAKIAlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwotCWlmICghciB8fCBpcnEgPT0gTk9fSVJRKQorCWlmICghcikKIAkJcmV0dXJuIC1FTk9ERVY7CisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkKKwkJcmV0dXJuIGlycTsKIAogCW1lbV9zaXplID0gcmVzb3VyY2Vfc2l6ZShyKTsKIAltZW0gPSBkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LCByLT5zdGFydCwgbWVtX3NpemUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy1leHlub3MuYyBiL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLWV4eW5vcy5jCmluZGV4IGRhMGVmMTcuLjdhYjNkNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLWV4eW5vcy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLWV4eW5vcy5jCkBAIC0yMjUsOCArMjI1LDEyIEBACiAJICogTm90IHN1cHBvcnRlZCB0byBjb25maWd1cmUgcmVnaXN0ZXIKIAkgKiByZWxhdGVkIHRvIEhTNDAwCiAJICovCi0JaWYgKHByaXYtPmN0cmxfdHlwZSA8IERXX01DSV9UWVBFX0VYWU5PUzU0MjApCisJaWYgKHByaXYtPmN0cmxfdHlwZSA8IERXX01DSV9UWVBFX0VYWU5PUzU0MjApIHsKKwkJaWYgKHRpbWluZyA9PSBNTUNfVElNSU5HX01NQ19IUzQwMCkKKwkJCWRldl93YXJuKGhvc3QtPmRldiwKKwkJCQkgImNhbm5vdCBjb25maWd1cmUgSFM0MDAsIHVuc3VwcG9ydGVkIGNoaXBzZXRcbiIpOwogCQlyZXR1cm47CisJfQogCiAJZHFzID0gcHJpdi0+c2F2ZWRfZHFzX2VuOwogCXN0cm9iZSA9IHByaXYtPnNhdmVkX3N0cm9iZV9jdHJsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMtazMuYyBiL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLWszLmMKaW5kZXggOGU5ZDg4Ni4uNjI0Nzg5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMtazMuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy1rMy5jCkBAIC0xMzEsMTEgKzEzMSwxNyBAQAogCWhvc3QtPmJ1c19oeiA9IGNsa19nZXRfcmF0ZShob3N0LT5iaXVfY2xrKTsKIH0KIAorc3RhdGljIGludCBkd19tY2lfaGk2MjIwX2V4ZWN1dGVfdHVuaW5nKHN0cnVjdCBkd19tY2lfc2xvdCAqc2xvdCwgdTMyIG9wY29kZSkKK3sKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBkd19tY2lfZHJ2X2RhdGEgaGk2MjIwX2RhdGEgPSB7CiAJLmNhcHMJCQk9IGR3X21jaV9oaTYyMjBfY2FwcywKIAkuc3dpdGNoX3ZvbHRhZ2UJCT0gZHdfbWNpX2hpNjIyMF9zd2l0Y2hfdm9sdGFnZSwKIAkuc2V0X2lvcwkJPSBkd19tY2lfaGk2MjIwX3NldF9pb3MsCiAJLnBhcnNlX2R0CQk9IGR3X21jaV9oaTYyMjBfcGFyc2VfZHQsCisJLmV4ZWN1dGVfdHVuaW5nCQk9IGR3X21jaV9oaTYyMjBfZXhlY3V0ZV90dW5pbmcsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBkd19tY2lfazNfbWF0Y2hbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLmMgYi9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5jCmluZGV4IDMyMzgwZDUuLjRmY2JjNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuYwpAQCAtNjEsNiArNjEsOCBAQAogCQkJCSBTRE1NQ19JRE1BQ19JTlRfRkJFIHwgU0RNTUNfSURNQUNfSU5UX1JJIHwgXAogCQkJCSBTRE1NQ19JRE1BQ19JTlRfVEkpCiAKKyNkZWZpbmUgREVTQ19SSU5HX0JVRl9TWglQQUdFX1NJWkUKKwogc3RydWN0IGlkbWFjX2Rlc2NfNjRhZGRyIHsKIAl1MzIJCWRlczA7CS8qIENvbnRyb2wgRGVzY3JpcHRvciAqLwogCkBAIC00NjcsMTM2ICs0NjksNiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgZHdfbWNpX3RyYW5zbGF0ZV9zZ2xpc3Qoc3RydWN0IGR3X21jaSAqaG9zdCwgc3RydWN0IG1tY19kYXRhICpkYXRhLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgc2dfbGVuKQotewotCXVuc2lnbmVkIGludCBkZXNjX2xlbjsKLQlpbnQgaTsKLQotCWlmIChob3N0LT5kbWFfNjRiaXRfYWRkcmVzcyA9PSAxKSB7Ci0JCXN0cnVjdCBpZG1hY19kZXNjXzY0YWRkciAqZGVzY19maXJzdCwgKmRlc2NfbGFzdCwgKmRlc2M7Ci0KLQkJZGVzY19maXJzdCA9IGRlc2NfbGFzdCA9IGRlc2MgPSBob3N0LT5zZ19jcHU7Ci0KLQkJZm9yIChpID0gMDsgaSA8IHNnX2xlbjsgaSsrKSB7Ci0JCQl1bnNpZ25lZCBpbnQgbGVuZ3RoID0gc2dfZG1hX2xlbigmZGF0YS0+c2dbaV0pOwotCi0JCQl1NjQgbWVtX2FkZHIgPSBzZ19kbWFfYWRkcmVzcygmZGF0YS0+c2dbaV0pOwotCi0JCQlmb3IgKCA7IGxlbmd0aCA7IGRlc2MrKykgewotCQkJCWRlc2NfbGVuID0gKGxlbmd0aCA8PSBEV19NQ0lfREVTQ19EQVRBX0xFTkdUSCkgPwotCQkJCQkgICBsZW5ndGggOiBEV19NQ0lfREVTQ19EQVRBX0xFTkdUSDsKLQotCQkJCWxlbmd0aCAtPSBkZXNjX2xlbjsKLQotCQkJCS8qCi0JCQkJICogU2V0IHRoZSBPV04gYml0IGFuZCBkaXNhYmxlIGludGVycnVwdHMKLQkJCQkgKiBmb3IgdGhpcyBkZXNjcmlwdG9yCi0JCQkJICovCi0JCQkJZGVzYy0+ZGVzMCA9IElETUFDX0RFUzBfT1dOIHwgSURNQUNfREVTMF9ESUMgfAotCQkJCQkJCUlETUFDX0RFUzBfQ0g7Ci0KLQkJCQkvKiBCdWZmZXIgbGVuZ3RoICovCi0JCQkJSURNQUNfNjRBRERSX1NFVF9CVUZGRVIxX1NJWkUoZGVzYywgZGVzY19sZW4pOwotCi0JCQkJLyogUGh5c2ljYWwgYWRkcmVzcyB0byBETUEgdG8vZnJvbSAqLwotCQkJCWRlc2MtPmRlczQgPSBtZW1fYWRkciAmIDB4ZmZmZmZmZmY7Ci0JCQkJZGVzYy0+ZGVzNSA9IG1lbV9hZGRyID4+IDMyOwotCi0JCQkJLyogVXBkYXRlIHBoeXNpY2FsIGFkZHJlc3MgZm9yIHRoZSBuZXh0IGRlc2MgKi8KLQkJCQltZW1fYWRkciArPSBkZXNjX2xlbjsKLQotCQkJCS8qIFNhdmUgcG9pbnRlciB0byB0aGUgbGFzdCBkZXNjcmlwdG9yICovCi0JCQkJZGVzY19sYXN0ID0gZGVzYzsKLQkJCX0KLQkJfQotCi0JCS8qIFNldCBmaXJzdCBkZXNjcmlwdG9yICovCi0JCWRlc2NfZmlyc3QtPmRlczAgfD0gSURNQUNfREVTMF9GRDsKLQotCQkvKiBTZXQgbGFzdCBkZXNjcmlwdG9yICovCi0JCWRlc2NfbGFzdC0+ZGVzMCAmPSB+KElETUFDX0RFUzBfQ0ggfCBJRE1BQ19ERVMwX0RJQyk7Ci0JCWRlc2NfbGFzdC0+ZGVzMCB8PSBJRE1BQ19ERVMwX0xEOwotCi0JfSBlbHNlIHsKLQkJc3RydWN0IGlkbWFjX2Rlc2MgKmRlc2NfZmlyc3QsICpkZXNjX2xhc3QsICpkZXNjOwotCi0JCWRlc2NfZmlyc3QgPSBkZXNjX2xhc3QgPSBkZXNjID0gaG9zdC0+c2dfY3B1OwotCi0JCWZvciAoaSA9IDA7IGkgPCBzZ19sZW47IGkrKykgewotCQkJdW5zaWduZWQgaW50IGxlbmd0aCA9IHNnX2RtYV9sZW4oJmRhdGEtPnNnW2ldKTsKLQotCQkJdTMyIG1lbV9hZGRyID0gc2dfZG1hX2FkZHJlc3MoJmRhdGEtPnNnW2ldKTsKLQotCQkJZm9yICggOyBsZW5ndGggOyBkZXNjKyspIHsKLQkJCQlkZXNjX2xlbiA9IChsZW5ndGggPD0gRFdfTUNJX0RFU0NfREFUQV9MRU5HVEgpID8KLQkJCQkJICAgbGVuZ3RoIDogRFdfTUNJX0RFU0NfREFUQV9MRU5HVEg7Ci0KLQkJCQlsZW5ndGggLT0gZGVzY19sZW47Ci0KLQkJCQkvKgotCQkJCSAqIFNldCB0aGUgT1dOIGJpdCBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzCi0JCQkJICogZm9yIHRoaXMgZGVzY3JpcHRvcgotCQkJCSAqLwotCQkJCWRlc2MtPmRlczAgPSBjcHVfdG9fbGUzMihJRE1BQ19ERVMwX09XTiB8Ci0JCQkJCQkJIElETUFDX0RFUzBfRElDIHwKLQkJCQkJCQkgSURNQUNfREVTMF9DSCk7Ci0KLQkJCQkvKiBCdWZmZXIgbGVuZ3RoICovCi0JCQkJSURNQUNfU0VUX0JVRkZFUjFfU0laRShkZXNjLCBkZXNjX2xlbik7Ci0KLQkJCQkvKiBQaHlzaWNhbCBhZGRyZXNzIHRvIERNQSB0by9mcm9tICovCi0JCQkJZGVzYy0+ZGVzMiA9IGNwdV90b19sZTMyKG1lbV9hZGRyKTsKLQotCQkJCS8qIFVwZGF0ZSBwaHlzaWNhbCBhZGRyZXNzIGZvciB0aGUgbmV4dCBkZXNjICovCi0JCQkJbWVtX2FkZHIgKz0gZGVzY19sZW47Ci0KLQkJCQkvKiBTYXZlIHBvaW50ZXIgdG8gdGhlIGxhc3QgZGVzY3JpcHRvciAqLwotCQkJCWRlc2NfbGFzdCA9IGRlc2M7Ci0JCQl9Ci0JCX0KLQotCQkvKiBTZXQgZmlyc3QgZGVzY3JpcHRvciAqLwotCQlkZXNjX2ZpcnN0LT5kZXMwIHw9IGNwdV90b19sZTMyKElETUFDX0RFUzBfRkQpOwotCi0JCS8qIFNldCBsYXN0IGRlc2NyaXB0b3IgKi8KLQkJZGVzY19sYXN0LT5kZXMwICY9IGNwdV90b19sZTMyKH4oSURNQUNfREVTMF9DSCB8Ci0JCQkJCSAgICAgICBJRE1BQ19ERVMwX0RJQykpOwotCQlkZXNjX2xhc3QtPmRlczAgfD0gY3B1X3RvX2xlMzIoSURNQUNfREVTMF9MRCk7Ci0JfQotCi0Jd21iKCk7IC8qIGRyYWluIHdyaXRlYnVmZmVyICovCi19Ci0KLXN0YXRpYyBpbnQgZHdfbWNpX2lkbWFjX3N0YXJ0X2RtYShzdHJ1Y3QgZHdfbWNpICpob3N0LCB1bnNpZ25lZCBpbnQgc2dfbGVuKQotewotCXUzMiB0ZW1wOwotCi0JZHdfbWNpX3RyYW5zbGF0ZV9zZ2xpc3QoaG9zdCwgaG9zdC0+ZGF0YSwgc2dfbGVuKTsKLQotCS8qIE1ha2Ugc3VyZSB0byByZXNldCBETUEgaW4gY2FzZSB3ZSBkaWQgUElPIGJlZm9yZSB0aGlzICovCi0JZHdfbWNpX2N0cmxfcmVzZXQoaG9zdCwgU0RNTUNfQ1RSTF9ETUFfUkVTRVQpOwotCWR3X21jaV9pZG1hY19yZXNldChob3N0KTsKLQotCS8qIFNlbGVjdCBJRE1BQyBpbnRlcmZhY2UgKi8KLQl0ZW1wID0gbWNpX3JlYWRsKGhvc3QsIENUUkwpOwotCXRlbXAgfD0gU0RNTUNfQ1RSTF9VU0VfSURNQUM7Ci0JbWNpX3dyaXRlbChob3N0LCBDVFJMLCB0ZW1wKTsKLQotCS8qIGRyYWluIHdyaXRlYnVmZmVyICovCi0Jd21iKCk7Ci0KLQkvKiBFbmFibGUgdGhlIElETUFDICovCi0JdGVtcCA9IG1jaV9yZWFkbChob3N0LCBCTU9EKTsKLQl0ZW1wIHw9IFNETU1DX0lETUFDX0VOQUJMRSB8IFNETU1DX0lETUFDX0ZCOwotCW1jaV93cml0ZWwoaG9zdCwgQk1PRCwgdGVtcCk7Ci0KLQkvKiBTdGFydCBpdCBydW5uaW5nICovCi0JbWNpX3dyaXRlbChob3N0LCBQTERNTkQsIDEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgZHdfbWNpX2lkbWFjX2luaXQoc3RydWN0IGR3X21jaSAqaG9zdCkKIHsKIAlpbnQgaTsKQEAgLTYwNCw3ICs0NzYsOCBAQAogCWlmIChob3N0LT5kbWFfNjRiaXRfYWRkcmVzcyA9PSAxKSB7CiAJCXN0cnVjdCBpZG1hY19kZXNjXzY0YWRkciAqcDsKIAkJLyogTnVtYmVyIG9mIGRlc2NyaXB0b3JzIGluIHRoZSByaW5nIGJ1ZmZlciAqLwotCQlob3N0LT5yaW5nX3NpemUgPSBQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGlkbWFjX2Rlc2NfNjRhZGRyKTsKKwkJaG9zdC0+cmluZ19zaXplID0KKwkJCURFU0NfUklOR19CVUZfU1ogLyBzaXplb2Yoc3RydWN0IGlkbWFjX2Rlc2NfNjRhZGRyKTsKIAogCQkvKiBGb3J3YXJkIGxpbmsgdGhlIGRlc2NyaXB0b3IgbGlzdCAqLwogCQlmb3IgKGkgPSAwLCBwID0gaG9zdC0+c2dfY3B1OyBpIDwgaG9zdC0+cmluZ19zaXplIC0gMTsKQEAgLTYzMCw3ICs1MDMsOCBAQAogCX0gZWxzZSB7CiAJCXN0cnVjdCBpZG1hY19kZXNjICpwOwogCQkvKiBOdW1iZXIgb2YgZGVzY3JpcHRvcnMgaW4gdGhlIHJpbmcgYnVmZmVyICovCi0JCWhvc3QtPnJpbmdfc2l6ZSA9IFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3QgaWRtYWNfZGVzYyk7CisJCWhvc3QtPnJpbmdfc2l6ZSA9CisJCQlERVNDX1JJTkdfQlVGX1NaIC8gc2l6ZW9mKHN0cnVjdCBpZG1hY19kZXNjKTsKIAogCQkvKiBGb3J3YXJkIGxpbmsgdGhlIGRlc2NyaXB0b3IgbGlzdCAqLwogCQlmb3IgKGkgPSAwLCBwID0gaG9zdC0+c2dfY3B1OwpAQCAtNjcxLDYgKzU0NSwxOTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgZHdfbWNpX3ByZXBhcmVfZGVzYzY0KHN0cnVjdCBkd19tY2kgKmhvc3QsCisJCQkJCSBzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEsCisJCQkJCSB1bnNpZ25lZCBpbnQgc2dfbGVuKQoreworCXVuc2lnbmVkIGludCBkZXNjX2xlbjsKKwlzdHJ1Y3QgaWRtYWNfZGVzY182NGFkZHIgKmRlc2NfZmlyc3QsICpkZXNjX2xhc3QsICpkZXNjOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlpbnQgaTsKKworCWRlc2NfZmlyc3QgPSBkZXNjX2xhc3QgPSBkZXNjID0gaG9zdC0+c2dfY3B1OworCisJZm9yIChpID0gMDsgaSA8IHNnX2xlbjsgaSsrKSB7CisJCXVuc2lnbmVkIGludCBsZW5ndGggPSBzZ19kbWFfbGVuKCZkYXRhLT5zZ1tpXSk7CisKKwkJdTY0IG1lbV9hZGRyID0gc2dfZG1hX2FkZHJlc3MoJmRhdGEtPnNnW2ldKTsKKworCQlmb3IgKCA7IGxlbmd0aCA7IGRlc2MrKykgeworCQkJZGVzY19sZW4gPSAobGVuZ3RoIDw9IERXX01DSV9ERVNDX0RBVEFfTEVOR1RIKSA/CisJCQkJICAgbGVuZ3RoIDogRFdfTUNJX0RFU0NfREFUQV9MRU5HVEg7CisKKwkJCWxlbmd0aCAtPSBkZXNjX2xlbjsKKworCQkJLyoKKwkJCSAqIFdhaXQgZm9yIHRoZSBmb3JtZXIgY2xlYXIgT1dOIGJpdCBvcGVyYXRpb24KKwkJCSAqIG9mIElETUFDIHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgZGVzY3JpcHRvcgorCQkJICogaXNuJ3Qgc3RpbGwgb3duZWQgYnkgSURNQUMgYXMgSURNQUMncyB3cml0ZQorCQkJICogb3BzIGFuZCBDUFUncyByZWFkIG9wcyBhcmUgYXN5bmNocm9ub3VzLgorCQkJICovCisJCQl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwKTsKKwkJCXdoaWxlIChyZWFkbCgmZGVzYy0+ZGVzMCkgJiBJRE1BQ19ERVMwX09XTikgeworCQkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJCQlnb3RvIGVycl9vd25fYml0OworCQkJCXVkZWxheSgxMCk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBTZXQgdGhlIE9XTiBiaXQgYW5kIGRpc2FibGUgaW50ZXJydXB0cworCQkJICogZm9yIHRoaXMgZGVzY3JpcHRvcgorCQkJICovCisJCQlkZXNjLT5kZXMwID0gSURNQUNfREVTMF9PV04gfCBJRE1BQ19ERVMwX0RJQyB8CisJCQkJCQlJRE1BQ19ERVMwX0NIOworCisJCQkvKiBCdWZmZXIgbGVuZ3RoICovCisJCQlJRE1BQ182NEFERFJfU0VUX0JVRkZFUjFfU0laRShkZXNjLCBkZXNjX2xlbik7CisKKwkJCS8qIFBoeXNpY2FsIGFkZHJlc3MgdG8gRE1BIHRvL2Zyb20gKi8KKwkJCWRlc2MtPmRlczQgPSBtZW1fYWRkciAmIDB4ZmZmZmZmZmY7CisJCQlkZXNjLT5kZXM1ID0gbWVtX2FkZHIgPj4gMzI7CisKKwkJCS8qIFVwZGF0ZSBwaHlzaWNhbCBhZGRyZXNzIGZvciB0aGUgbmV4dCBkZXNjICovCisJCQltZW1fYWRkciArPSBkZXNjX2xlbjsKKworCQkJLyogU2F2ZSBwb2ludGVyIHRvIHRoZSBsYXN0IGRlc2NyaXB0b3IgKi8KKwkJCWRlc2NfbGFzdCA9IGRlc2M7CisJCX0KKwl9CisKKwkvKiBTZXQgZmlyc3QgZGVzY3JpcHRvciAqLworCWRlc2NfZmlyc3QtPmRlczAgfD0gSURNQUNfREVTMF9GRDsKKworCS8qIFNldCBsYXN0IGRlc2NyaXB0b3IgKi8KKwlkZXNjX2xhc3QtPmRlczAgJj0gfihJRE1BQ19ERVMwX0NIIHwgSURNQUNfREVTMF9ESUMpOworCWRlc2NfbGFzdC0+ZGVzMCB8PSBJRE1BQ19ERVMwX0xEOworCisJcmV0dXJuIDA7CitlcnJfb3duX2JpdDoKKwkvKiByZXN0b3JlIHRoZSBkZXNjcmlwdG9yIGNoYWluIGFzIGl0J3MgcG9sbHV0ZWQgKi8KKwlkZXZfZGJnKGhvc3QtPmRldiwgImRlc2NpcHRvciBpcyBzdGlsbCBvd25lZCBieSBJRE1BQy5cbiIpOworCW1lbXNldChob3N0LT5zZ19jcHUsIDAsIERFU0NfUklOR19CVUZfU1opOworCWR3X21jaV9pZG1hY19pbml0KGhvc3QpOworCXJldHVybiAtRUlOVkFMOworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50IGR3X21jaV9wcmVwYXJlX2Rlc2MzMihzdHJ1Y3QgZHdfbWNpICpob3N0LAorCQkJCQkgc3RydWN0IG1tY19kYXRhICpkYXRhLAorCQkJCQkgdW5zaWduZWQgaW50IHNnX2xlbikKK3sKKwl1bnNpZ25lZCBpbnQgZGVzY19sZW47CisJc3RydWN0IGlkbWFjX2Rlc2MgKmRlc2NfZmlyc3QsICpkZXNjX2xhc3QsICpkZXNjOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlpbnQgaTsKKworCWRlc2NfZmlyc3QgPSBkZXNjX2xhc3QgPSBkZXNjID0gaG9zdC0+c2dfY3B1OworCisJZm9yIChpID0gMDsgaSA8IHNnX2xlbjsgaSsrKSB7CisJCXVuc2lnbmVkIGludCBsZW5ndGggPSBzZ19kbWFfbGVuKCZkYXRhLT5zZ1tpXSk7CisKKwkJdTMyIG1lbV9hZGRyID0gc2dfZG1hX2FkZHJlc3MoJmRhdGEtPnNnW2ldKTsKKworCQlmb3IgKCA7IGxlbmd0aCA7IGRlc2MrKykgeworCQkJZGVzY19sZW4gPSAobGVuZ3RoIDw9IERXX01DSV9ERVNDX0RBVEFfTEVOR1RIKSA/CisJCQkJICAgbGVuZ3RoIDogRFdfTUNJX0RFU0NfREFUQV9MRU5HVEg7CisKKwkJCWxlbmd0aCAtPSBkZXNjX2xlbjsKKworCQkJLyoKKwkJCSAqIFdhaXQgZm9yIHRoZSBmb3JtZXIgY2xlYXIgT1dOIGJpdCBvcGVyYXRpb24KKwkJCSAqIG9mIElETUFDIHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgZGVzY3JpcHRvcgorCQkJICogaXNuJ3Qgc3RpbGwgb3duZWQgYnkgSURNQUMgYXMgSURNQUMncyB3cml0ZQorCQkJICogb3BzIGFuZCBDUFUncyByZWFkIG9wcyBhcmUgYXN5bmNocm9ub3VzLgorCQkJICovCisJCQl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwKTsKKwkJCXdoaWxlIChyZWFkbCgmZGVzYy0+ZGVzMCkgJgorCQkJICAgICAgIGNwdV90b19sZTMyKElETUFDX0RFUzBfT1dOKSkgeworCQkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJCQlnb3RvIGVycl9vd25fYml0OworCQkJCXVkZWxheSgxMCk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBTZXQgdGhlIE9XTiBiaXQgYW5kIGRpc2FibGUgaW50ZXJydXB0cworCQkJICogZm9yIHRoaXMgZGVzY3JpcHRvcgorCQkJICovCisJCQlkZXNjLT5kZXMwID0gY3B1X3RvX2xlMzIoSURNQUNfREVTMF9PV04gfAorCQkJCQkJIElETUFDX0RFUzBfRElDIHwKKwkJCQkJCSBJRE1BQ19ERVMwX0NIKTsKKworCQkJLyogQnVmZmVyIGxlbmd0aCAqLworCQkJSURNQUNfU0VUX0JVRkZFUjFfU0laRShkZXNjLCBkZXNjX2xlbik7CisKKwkJCS8qIFBoeXNpY2FsIGFkZHJlc3MgdG8gRE1BIHRvL2Zyb20gKi8KKwkJCWRlc2MtPmRlczIgPSBjcHVfdG9fbGUzMihtZW1fYWRkcik7CisKKwkJCS8qIFVwZGF0ZSBwaHlzaWNhbCBhZGRyZXNzIGZvciB0aGUgbmV4dCBkZXNjICovCisJCQltZW1fYWRkciArPSBkZXNjX2xlbjsKKworCQkJLyogU2F2ZSBwb2ludGVyIHRvIHRoZSBsYXN0IGRlc2NyaXB0b3IgKi8KKwkJCWRlc2NfbGFzdCA9IGRlc2M7CisJCX0KKwl9CisKKwkvKiBTZXQgZmlyc3QgZGVzY3JpcHRvciAqLworCWRlc2NfZmlyc3QtPmRlczAgfD0gY3B1X3RvX2xlMzIoSURNQUNfREVTMF9GRCk7CisKKwkvKiBTZXQgbGFzdCBkZXNjcmlwdG9yICovCisJZGVzY19sYXN0LT5kZXMwICY9IGNwdV90b19sZTMyKH4oSURNQUNfREVTMF9DSCB8CisJCQkJICAgICAgIElETUFDX0RFUzBfRElDKSk7CisJZGVzY19sYXN0LT5kZXMwIHw9IGNwdV90b19sZTMyKElETUFDX0RFUzBfTEQpOworCisJcmV0dXJuIDA7CitlcnJfb3duX2JpdDoKKwkvKiByZXN0b3JlIHRoZSBkZXNjcmlwdG9yIGNoYWluIGFzIGl0J3MgcG9sbHV0ZWQgKi8KKwlkZXZfZGJnKGhvc3QtPmRldiwgImRlc2NpcHRvciBpcyBzdGlsbCBvd25lZCBieSBJRE1BQy5cbiIpOworCW1lbXNldChob3N0LT5zZ19jcHUsIDAsIERFU0NfUklOR19CVUZfU1opOworCWR3X21jaV9pZG1hY19pbml0KGhvc3QpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGR3X21jaV9pZG1hY19zdGFydF9kbWEoc3RydWN0IGR3X21jaSAqaG9zdCwgdW5zaWduZWQgaW50IHNnX2xlbikKK3sKKwl1MzIgdGVtcDsKKwlpbnQgcmV0OworCisJaWYgKGhvc3QtPmRtYV82NGJpdF9hZGRyZXNzID09IDEpCisJCXJldCA9IGR3X21jaV9wcmVwYXJlX2Rlc2M2NChob3N0LCBob3N0LT5kYXRhLCBzZ19sZW4pOworCWVsc2UKKwkJcmV0ID0gZHdfbWNpX3ByZXBhcmVfZGVzYzMyKGhvc3QsIGhvc3QtPmRhdGEsIHNnX2xlbik7CisKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCS8qIGRyYWluIHdyaXRlYnVmZmVyICovCisJd21iKCk7CisKKwkvKiBNYWtlIHN1cmUgdG8gcmVzZXQgRE1BIGluIGNhc2Ugd2UgZGlkIFBJTyBiZWZvcmUgdGhpcyAqLworCWR3X21jaV9jdHJsX3Jlc2V0KGhvc3QsIFNETU1DX0NUUkxfRE1BX1JFU0VUKTsKKwlkd19tY2lfaWRtYWNfcmVzZXQoaG9zdCk7CisKKwkvKiBTZWxlY3QgSURNQUMgaW50ZXJmYWNlICovCisJdGVtcCA9IG1jaV9yZWFkbChob3N0LCBDVFJMKTsKKwl0ZW1wIHw9IFNETU1DX0NUUkxfVVNFX0lETUFDOworCW1jaV93cml0ZWwoaG9zdCwgQ1RSTCwgdGVtcCk7CisKKwkvKiBkcmFpbiB3cml0ZWJ1ZmZlciAqLworCXdtYigpOworCisJLyogRW5hYmxlIHRoZSBJRE1BQyAqLworCXRlbXAgPSBtY2lfcmVhZGwoaG9zdCwgQk1PRCk7CisJdGVtcCB8PSBTRE1NQ19JRE1BQ19FTkFCTEUgfCBTRE1NQ19JRE1BQ19GQjsKKwltY2lfd3JpdGVsKGhvc3QsIEJNT0QsIHRlbXApOworCisJLyogU3RhcnQgaXQgcnVubmluZyAqLworCW1jaV93cml0ZWwoaG9zdCwgUExETU5ELCAxKTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHdfbWNpX2RtYV9vcHMgZHdfbWNpX2lkbWFjX29wcyA9IHsKIAkuaW5pdCA9IGR3X21jaV9pZG1hY19pbml0LAogCS5zdGFydCA9IGR3X21jaV9pZG1hY19zdGFydF9kbWEsCkBAIC04NzYsMTEgKzkzOSw4IEBACiAJICogTVNJWkUgaXMgJzEnLAogCSAqIGlmIGJsa3N6IGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBGSUZPIHdpZHRoCiAJICovCi0JaWYgKGJsa3N6ICUgZmlmb193aWR0aCkgewotCQltc2l6ZSA9IDA7Ci0JCXJ4X3dtYXJrID0gMTsKKwlpZiAoYmxrc3ogJSBmaWZvX3dpZHRoKQogCQlnb3RvIGRvbmU7Ci0JfQogCiAJZG8gewogCQlpZiAoISgoYmxrc3pfZGVwdGggJSBtc3pzW2lkeF0pIHx8CkBAIC05OTgsOCArMTA1OCwxMCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmlycV9sb2NrLCBpcnFmbGFncyk7CiAKIAlpZiAoaG9zdC0+ZG1hX29wcy0+c3RhcnQoaG9zdCwgc2dfbGVuKSkgewotCQkvKiBXZSBjYW4ndCBkbyBETUEgKi8KLQkJZGV2X2Vycihob3N0LT5kZXYsICIlczogZmFpbGVkIHRvIHN0YXJ0IERNQS5cbiIsIF9fZnVuY19fKTsKKwkJLyogV2UgY2FuJ3QgZG8gRE1BLCB0cnkgUElPIGZvciB0aGlzIG9uZSAqLworCQlkZXZfZGJnKGhvc3QtPmRldiwKKwkJCSIlczogZmFsbCBiYWNrIHRvIFBJTyBtb2RlIGZvciBjdXJyZW50IHRyYW5zZmVyXG4iLAorCQkJX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTExMTIsMTEgKzExNzQsMTIgQEAKIAogCQlkaXYgPSAoaG9zdC0+YnVzX2h6ICE9IGNsb2NrKSA/IERJVl9ST1VORF9VUChkaXYsIDIpIDogMDsKIAotCQlkZXZfaW5mbygmc2xvdC0+bW1jLT5jbGFzc19kZXYsCi0JCQkgIkJ1cyBzcGVlZCAoc2xvdCAlZCkgPSAlZEh6IChzbG90IHJlcSAlZEh6LCBhY3R1YWwgJWRIWiBkaXYgPSAlZClcbiIsCi0JCQkgc2xvdC0+aWQsIGhvc3QtPmJ1c19oeiwgY2xvY2ssCi0JCQkgZGl2ID8gKChob3N0LT5idXNfaHogLyBkaXYpID4+IDEpIDoKLQkJCSBob3N0LT5idXNfaHosIGRpdik7CisJCWlmIChjbG9jayAhPSBzbG90LT5fX2Nsa19vbGQgfHwgZm9yY2VfY2xraW5pdCkKKwkJCWRldl9pbmZvKCZzbG90LT5tbWMtPmNsYXNzX2RldiwKKwkJCQkgIkJ1cyBzcGVlZCAoc2xvdCAlZCkgPSAlZEh6IChzbG90IHJlcSAlZEh6LCBhY3R1YWwgJWRIWiBkaXYgPSAlZClcbiIsCisJCQkJIHNsb3QtPmlkLCBob3N0LT5idXNfaHosIGNsb2NrLAorCQkJCSBkaXYgPyAoKGhvc3QtPmJ1c19oeiAvIGRpdikgPj4gMSkgOgorCQkJCSBob3N0LT5idXNfaHosIGRpdik7CiAKIAkJLyogZGlzYWJsZSBjbG9jayAqLwogCQltY2lfd3JpdGVsKGhvc3QsIENMS0VOQSwgMCk7CkBAIC0xMTM5LDYgKzEyMDIsOSBAQAogCiAJCS8qIGluZm9ybSBDSVUgKi8KIAkJbWNpX3NlbmRfY21kKHNsb3QsIHNkbW1jX2NtZF9iaXRzLCAwKTsKKworCQkvKiBrZWVwIHRoZSBsYXN0IGNsb2NrIHZhbHVlIHRoYXQgd2FzIHJlcXVlc3RlZCBmcm9tIGNvcmUgKi8KKwkJc2xvdC0+X19jbGtfb2xkID0gY2xvY2s7CiAJfQogCiAJaG9zdC0+Y3VycmVudF9zcGVlZCA9IGNsb2NrOwpAQCAtMTY5MSwxMSArMTc1NywxMSBAQAogCQkJCWRhdGEtPmVycm9yID0gLUVUSU1FRE9VVDsKIAkJCX0gZWxzZSBpZiAoaG9zdC0+ZGlyX3N0YXR1cyA9PQogCQkJCQlEV19NQ0lfUkVDVl9TVEFUVVMpIHsKLQkJCQlkYXRhLT5lcnJvciA9IC1FSU87CisJCQkJZGF0YS0+ZXJyb3IgPSAtRUlMU0VROwogCQkJfQogCQl9IGVsc2UgewogCQkJLyogU0RNTUNfSU5UX1NCRSBpcyBpbmNsdWRlZCAqLwotCQkJZGF0YS0+ZXJyb3IgPSAtRUlPOworCQkJZGF0YS0+ZXJyb3IgPSAtRUlMU0VROwogCQl9CiAKIAkJZGV2X2RiZyhob3N0LT5kZXYsICJkYXRhIGVycm9yLCBzdGF0dXMgMHglMDh4XG4iLCBzdGF0dXMpOwpAQCAtMjUyMyw0NyArMjU4OSw2IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi0jaWZkZWYgQ09ORklHX09GCi0vKiBnaXZlbiBhIHNsb3QsIGZpbmQgb3V0IHRoZSBkZXZpY2Ugbm9kZSByZXByZXNlbnRpbmcgdGhhdCBzbG90ICovCi1zdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpkd19tY2lfb2ZfZmluZF9zbG90X25vZGUoc3RydWN0IGR3X21jaV9zbG90ICpzbG90KQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHNsb3QtPm1tYy0+cGFyZW50OwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0JY29uc3QgX19iZTMyICphZGRyOwotCWludCBsZW47Ci0KLQlpZiAoIWRldiB8fCAhZGV2LT5vZl9ub2RlKQotCQlyZXR1cm4gTlVMTDsKLQotCWZvcl9lYWNoX2NoaWxkX29mX25vZGUoZGV2LT5vZl9ub2RlLCBucCkgewotCQlhZGRyID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicmVnIiwgJmxlbik7Ci0JCWlmICghYWRkciB8fCAobGVuIDwgc2l6ZW9mKGludCkpKQotCQkJY29udGludWU7Ci0JCWlmIChiZTMyX3RvX2NwdXAoYWRkcikgPT0gc2xvdC0+aWQpCi0JCQlyZXR1cm4gbnA7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBkd19tY2lfc2xvdF9vZl9wYXJzZShzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IGR3X21jaV9vZl9maW5kX3Nsb3Rfbm9kZShzbG90KTsKLQotCWlmICghbnApCi0JCXJldHVybjsKLQotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJkaXNhYmxlLXdwIikpIHsKLQkJc2xvdC0+bW1jLT5jYXBzMiB8PSBNTUNfQ0FQMl9OT19XUklURV9QUk9URUNUOwotCQlkZXZfd2FybihzbG90LT5tbWMtPnBhcmVudCwKLQkJCSJTbG90IHF1aXJrICdkaXNhYmxlLXdwJyBpcyBkZXByZWNhdGVkXG4iKTsKLQl9Ci19Ci0jZWxzZSAvKiBDT05GSUdfT0YgKi8KLXN0YXRpYyB2b2lkIGR3X21jaV9zbG90X29mX3BhcnNlKHN0cnVjdCBkd19tY2lfc2xvdCAqc2xvdCkKLXsKLX0KLSNlbmRpZiAvKiBDT05GSUdfT0YgKi8KLQogc3RhdGljIGludCBkd19tY2lfaW5pdF9zbG90KHN0cnVjdCBkd19tY2kgKmhvc3QsIHVuc2lnbmVkIGludCBpZCkKIHsKIAlzdHJ1Y3QgbW1jX2hvc3QgKm1tYzsKQEAgLTI2MjYsOCArMjY1MSw2IEBACiAJaWYgKGhvc3QtPnBkYXRhLT5jYXBzMikKIAkJbW1jLT5jYXBzMiA9IGhvc3QtPnBkYXRhLT5jYXBzMjsKIAotCWR3X21jaV9zbG90X29mX3BhcnNlKHNsb3QpOwotCiAJcmV0ID0gbW1jX29mX3BhcnNlKG1tYyk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJfaG9zdF9hbGxvY2F0ZWQ7CkBAIC0yNzMyLDcgKzI3NTUsOCBAQAogCQl9CiAKIAkJLyogQWxsb2MgbWVtb3J5IGZvciBzZyB0cmFuc2xhdGlvbiAqLwotCQlob3N0LT5zZ19jcHUgPSBkbWFtX2FsbG9jX2NvaGVyZW50KGhvc3QtPmRldiwgUEFHRV9TSVpFLAorCQlob3N0LT5zZ19jcHUgPSBkbWFtX2FsbG9jX2NvaGVyZW50KGhvc3QtPmRldiwKKwkJCQkJCSAgIERFU0NfUklOR19CVUZfU1osCiAJCQkJCQkgICAmaG9zdC0+c2dfZG1hLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFob3N0LT5zZ19jcHUpIHsKIAkJCWRldl9lcnIoaG9zdC0+ZGV2LApAQCAtMjkxNSw2ICsyOTM5LDEzIEBACiAJaWYgKCFwZGF0YSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKKwkvKiBmaW5kIHJlc2V0IGNvbnRyb2xsZXIgd2hlbiBleGlzdCAqLworCXBkYXRhLT5yc3RjID0gZGV2bV9yZXNldF9jb250cm9sX2dldF9vcHRpb25hbChkZXYsIE5VTEwpOworCWlmIChJU19FUlIocGRhdGEtPnJzdGMpKSB7CisJCWlmIChQVFJfRVJSKHBkYXRhLT5yc3RjKSA9PSAtRVBST0JFX0RFRkVSKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVQUk9CRV9ERUZFUik7CisJfQorCiAJLyogZmluZCBvdXQgbnVtYmVyIG9mIHNsb3RzIHN1cHBvcnRlZCAqLwogCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAibnVtLXNsb3RzIiwgJnBkYXRhLT5udW1fc2xvdHMpOwogCkBAIC0yOTMzLDExICsyOTY0LDYgQEAKIAkJCXJldHVybiBFUlJfUFRSKHJldCk7CiAJfQogCi0JaWYgKG9mX2ZpbmRfcHJvcGVydHkobnAsICJzdXBwb3J0cy1oaWdoc3BlZWQiLCBOVUxMKSkgewotCQlkZXZfaW5mbyhkZXYsICJzdXBwb3J0cy1oaWdoc3BlZWQgcHJvcGVydHkgaXMgZGVwcmVjYXRlZC5cbiIpOwotCQlwZGF0YS0+Y2FwcyB8PSBNTUNfQ0FQX1NEX0hJR0hTUEVFRCB8IE1NQ19DQVBfTU1DX0hJR0hTUEVFRDsKLQl9Ci0KIAlyZXR1cm4gcGRhdGE7CiB9CiAKQEAgLTI5ODYsNyArMzAxMiw5IEBACiAKIAlpZiAoIWhvc3QtPnBkYXRhKSB7CiAJCWhvc3QtPnBkYXRhID0gZHdfbWNpX3BhcnNlX2R0KGhvc3QpOwotCQlpZiAoSVNfRVJSKGhvc3QtPnBkYXRhKSkgeworCQlpZiAoUFRSX0VSUihob3N0LT5wZGF0YSkgPT0gLUVQUk9CRV9ERUZFUikgeworCQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJCX0gZWxzZSBpZiAoSVNfRVJSKGhvc3QtPnBkYXRhKSkgewogCQkJZGV2X2Vycihob3N0LT5kZXYsICJwbGF0Zm9ybSBkYXRhIG5vdCBhdmFpbGFibGVcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTMwNDAsNiArMzA2OCwxMiBAQAogCQl9CiAJfQogCisJaWYgKCFJU19FUlIoaG9zdC0+cGRhdGEtPnJzdGMpKSB7CisJCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KGhvc3QtPnBkYXRhLT5yc3RjKTsKKwkJdXNsZWVwX3JhbmdlKDEwLCA1MCk7CisJCXJlc2V0X2NvbnRyb2xfZGVhc3NlcnQoaG9zdC0+cGRhdGEtPnJzdGMpOworCX0KKwogCXNldHVwX3RpbWVyKCZob3N0LT5jbWQxMV90aW1lciwKIAkJICAgIGR3X21jaV9jbWQxMV90aW1lciwgKHVuc2lnbmVkIGxvbmcpaG9zdCk7CiAKQEAgLTMxODksMTMgKzMyMjMsMTQgQEAKIAlpZiAoaG9zdC0+dXNlX2RtYSAmJiBob3N0LT5kbWFfb3BzLT5leGl0KQogCQlob3N0LT5kbWFfb3BzLT5leGl0KGhvc3QpOwogCisJaWYgKCFJU19FUlIoaG9zdC0+cGRhdGEtPnJzdGMpKQorCQlyZXNldF9jb250cm9sX2Fzc2VydChob3N0LT5wZGF0YS0+cnN0Yyk7CisKIGVycl9jbGtfY2l1OgotCWlmICghSVNfRVJSKGhvc3QtPmNpdV9jbGspKQotCQljbGtfZGlzYWJsZV91bnByZXBhcmUoaG9zdC0+Y2l1X2Nsayk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGhvc3QtPmNpdV9jbGspOwogCiBlcnJfY2xrX2JpdToKLQlpZiAoIUlTX0VSUihob3N0LT5iaXVfY2xrKSkKLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGhvc3QtPmJpdV9jbGspOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShob3N0LT5iaXVfY2xrKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0zMjIxLDExICszMjU2LDExIEBACiAJaWYgKGhvc3QtPnVzZV9kbWEgJiYgaG9zdC0+ZG1hX29wcy0+ZXhpdCkKIAkJaG9zdC0+ZG1hX29wcy0+ZXhpdChob3N0KTsKIAotCWlmICghSVNfRVJSKGhvc3QtPmNpdV9jbGspKQotCQljbGtfZGlzYWJsZV91bnByZXBhcmUoaG9zdC0+Y2l1X2Nsayk7CisJaWYgKCFJU19FUlIoaG9zdC0+cGRhdGEtPnJzdGMpKQorCQlyZXNldF9jb250cm9sX2Fzc2VydChob3N0LT5wZGF0YS0+cnN0Yyk7CiAKLQlpZiAoIUlTX0VSUihob3N0LT5iaXVfY2xrKSkKLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGhvc3QtPmJpdV9jbGspOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShob3N0LT5jaXVfY2xrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoaG9zdC0+Yml1X2Nsayk7CiB9CiBFWFBPUlRfU1lNQk9MKGR3X21jaV9yZW1vdmUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5oIGIvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuaAppbmRleCA5ZTc0MGJjLi5lOGNkMmRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5oCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLmgKQEAgLTI0OSw2ICsyNDksOCBAQAogICogQHF1ZXVlX25vZGU6IExpc3Qgbm9kZSBmb3IgcGxhY2luZyB0aGlzIG5vZGUgaW4gdGhlIEBxdWV1ZSBsaXN0IG9mCiAgKgkmc3RydWN0IGR3X21jaS4KICAqIEBjbG9jazogQ2xvY2sgcmF0ZSBjb25maWd1cmVkIGJ5IHNldF9pb3MoKS4gUHJvdGVjdGVkIGJ5IGhvc3QtPmxvY2suCisgKiBAX19jbGtfb2xkOiBUaGUgbGFzdCBjbG9jayB2YWx1ZSB0aGF0IHdhcyByZXF1ZXN0ZWQgZnJvbSBjb3JlLgorICoJS2VlcGluZyB0cmFjayBvZiB0aGlzIGhlbHBzIHVzIHRvIGF2b2lkIHNwYW1taW5nIHRoZSBjb25zb2xlLgogICogQGZsYWdzOiBSYW5kb20gc3RhdGUgYml0cyBhc3NvY2lhdGVkIHdpdGggdGhlIHNsb3QuCiAgKiBAaWQ6IE51bWJlciBvZiB0aGlzIHNsb3QuCiAgKiBAc2Rpb19pZDogTnVtYmVyIG9mIHRoaXMgc2xvdCBpbiB0aGUgU0RJTyBpbnRlcnJ1cHQgcmVnaXN0ZXJzLgpAQCAtMjYzLDYgKzI2NSw3IEBACiAJc3RydWN0IGxpc3RfaGVhZAlxdWV1ZV9ub2RlOwogCiAJdW5zaWduZWQgaW50CQljbG9jazsKKwl1bnNpZ25lZCBpbnQJCV9fY2xrX29sZDsKIAogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogI2RlZmluZSBEV19NTUNfQ0FSRF9QUkVTRU5UCTAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvbW94YXJ0LW1tYy5jIGIvZHJpdmVycy9tbWMvaG9zdC9tb3hhcnQtbW1jLmMKaW5kZXggNzk5MDVjZS4uYmJhZDMwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9tb3hhcnQtbW1jLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9tb3hhcnQtbW1jLmMKQEAgLTI1Nyw3ICsyNTcsNyBAQAogc3RhdGljIHZvaWQgbW94YXJ0X3RyYW5zZmVyX2RtYShzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEsIHN0cnVjdCBtb3hhcnRfaG9zdCAqaG9zdCkKIHsKIAl1MzIgbGVuLCBkaXJfZGF0YSwgZGlyX3NsYXZlOwotCXVuc2lnbmVkIGxvbmcgZG1hX3RpbWU7CisJbG9uZyBkbWFfdGltZTsKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2MgPSBOVUxMOwogCXN0cnVjdCBkbWFfY2hhbiAqZG1hX2NoYW47CiAKQEAgLTM5Nyw3ICszOTcsOCBAQAogc3RhdGljIHZvaWQgbW94YXJ0X3JlcXVlc3Qoc3RydWN0IG1tY19ob3N0ICptbWMsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQogewogCXN0cnVjdCBtb3hhcnRfaG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7Ci0JdW5zaWduZWQgbG9uZyBwaW9fdGltZSwgZmxhZ3M7CisJbG9uZyBwaW9fdGltZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiBzdGF0dXM7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9vbWFwLmMgYi9kcml2ZXJzL21tYy9ob3N0L29tYXAuYwppbmRleCBmMjNkNjVlLi5iZTNjNDlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L29tYXAuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L29tYXAuYwpAQCAtMTAxNiwxNCArMTAxNiwxNiBAQAogCiAJCS8qIE9ubHkgcmVjb25maWd1cmUgaWYgd2UgaGF2ZSBhIGRpZmZlcmVudCBidXJzdCBzaXplICovCiAJCWlmICgqYnAgIT0gYnVyc3QpIHsKLQkJCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnIGNmZzsKLQotCQkJY2ZnLnNyY19hZGRyID0gaG9zdC0+cGh5c19iYXNlICsgT01BUF9NTUNfUkVHKGhvc3QsIERBVEEpOwotCQkJY2ZnLmRzdF9hZGRyID0gaG9zdC0+cGh5c19iYXNlICsgT01BUF9NTUNfUkVHKGhvc3QsIERBVEEpOwotCQkJY2ZnLnNyY19hZGRyX3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzJfQllURVM7Ci0JCQljZmcuZHN0X2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfMl9CWVRFUzsKLQkJCWNmZy5zcmNfbWF4YnVyc3QgPSBidXJzdDsKLQkJCWNmZy5kc3RfbWF4YnVyc3QgPSBidXJzdDsKKwkJCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnIGNmZyA9IHsKKwkJCQkuc3JjX2FkZHIgPSBob3N0LT5waHlzX2Jhc2UgKworCQkJCQkgICAgT01BUF9NTUNfUkVHKGhvc3QsIERBVEEpLAorCQkJCS5kc3RfYWRkciA9IGhvc3QtPnBoeXNfYmFzZSArCisJCQkJCSAgICBPTUFQX01NQ19SRUcoaG9zdCwgREFUQSksCisJCQkJLnNyY19hZGRyX3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzJfQllURVMsCisJCQkJLmRzdF9hZGRyX3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzJfQllURVMsCisJCQkJLnNyY19tYXhidXJzdCA9IGJ1cnN0LAorCQkJCS5kc3RfbWF4YnVyc3QgPSBidXJzdCwKKwkJCX07CiAKIAkJCWlmIChkbWFlbmdpbmVfc2xhdmVfY29uZmlnKGMsICZjZmcpKQogCQkJCWdvdG8gdXNlX3BpbzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvb21hcF9oc21tYy5jIGIvZHJpdmVycy9tbWMvaG9zdC9vbWFwX2hzbW1jLmMKaW5kZXggMjRlYmM5YS4uNWYyZjI0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9vbWFwX2hzbW1jLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9vbWFwX2hzbW1jLmMKQEAgLTE0MDksMTEgKzE0MDksMTggQEAKIHN0YXRpYyBpbnQgb21hcF9oc21tY19zZXR1cF9kbWFfdHJhbnNmZXIoc3RydWN0IG9tYXBfaHNtbWNfaG9zdCAqaG9zdCwKIAkJCQkJc3RydWN0IG1tY19yZXF1ZXN0ICpyZXEpCiB7Ci0Jc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgY2ZnOwogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHg7CiAJaW50IHJldCA9IDAsIGk7CiAJc3RydWN0IG1tY19kYXRhICpkYXRhID0gcmVxLT5kYXRhOwogCXN0cnVjdCBkbWFfY2hhbiAqY2hhbjsKKwlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyBjZmcgPSB7CisJCS5zcmNfYWRkciA9IGhvc3QtPm1hcGJhc2UgKyBPTUFQX0hTTU1DX0RBVEEsCisJCS5kc3RfYWRkciA9IGhvc3QtPm1hcGJhc2UgKyBPTUFQX0hTTU1DX0RBVEEsCisJCS5zcmNfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTLAorCQkuZHN0X2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfNF9CWVRFUywKKwkJLnNyY19tYXhidXJzdCA9IGRhdGEtPmJsa3N6IC8gNCwKKwkJLmRzdF9tYXhidXJzdCA9IGRhdGEtPmJsa3N6IC8gNCwKKwl9OwogCiAJLyogU2FuaXR5IGNoZWNrOiBhbGwgdGhlIFNHIGVudHJpZXMgbXVzdCBiZSBhbGlnbmVkIGJ5IGJsb2NrIHNpemUuICovCiAJZm9yIChpID0gMDsgaSA8IGRhdGEtPnNnX2xlbjsgaSsrKSB7CkBAIC0xNDMzLDEzICsxNDQwLDYgQEAKIAogCWNoYW4gPSBvbWFwX2hzbW1jX2dldF9kbWFfY2hhbihob3N0LCBkYXRhKTsKIAotCWNmZy5zcmNfYWRkciA9IGhvc3QtPm1hcGJhc2UgKyBPTUFQX0hTTU1DX0RBVEE7Ci0JY2ZnLmRzdF9hZGRyID0gaG9zdC0+bWFwYmFzZSArIE9NQVBfSFNNTUNfREFUQTsKLQljZmcuc3JjX2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfNF9CWVRFUzsKLQljZmcuZHN0X2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfNF9CWVRFUzsKLQljZmcuc3JjX21heGJ1cnN0ID0gZGF0YS0+Ymxrc3ogLyA0OwotCWNmZy5kc3RfbWF4YnVyc3QgPSBkYXRhLT5ibGtzeiAvIDQ7Ci0KIAlyZXQgPSBkbWFlbmdpbmVfc2xhdmVfY29uZmlnKGNoYW4sICZjZmcpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3J0c3hfcGNpX3NkbW1jLmMgYi9kcml2ZXJzL21tYy9ob3N0L3J0c3hfcGNpX3NkbW1jLmMKaW5kZXggMzk2YzliNy4uM2NjYWExNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9ydHN4X3BjaV9zZG1tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvcnRzeF9wY2lfc2RtbWMuYwpAQCAtMTI2LDcgKzEyNiw3IEBACiAJCXJldHVybiBTRF9SU1BfVFlQRV9SMDsKIAljYXNlIE1NQ19SU1BfUjE6CiAJCXJldHVybiBTRF9SU1BfVFlQRV9SMTsKLQljYXNlIE1NQ19SU1BfUjEgJiB+TU1DX1JTUF9DUkM6CisJY2FzZSBNTUNfUlNQX1IxX05PX0NSQzoKIAkJcmV0dXJuIFNEX1JTUF9UWVBFX1IxIHwgU0RfTk9fQ0hFQ0tfQ1JDNzsKIAljYXNlIE1NQ19SU1BfUjFCOgogCQlyZXR1cm4gU0RfUlNQX1RZUEVfUjFiOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9ydHN4X3VzYl9zZG1tYy5jIGIvZHJpdmVycy9tbWMvaG9zdC9ydHN4X3VzYl9zZG1tYy5jCmluZGV4IDZjNzFmYzkuLjQxMDYyOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvcnRzeF91c2Jfc2RtbWMuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3J0c3hfdXNiX3NkbW1jLmMKQEAgLTMyNCw3ICszMjQsNyBAQAogCWNhc2UgTU1DX1JTUF9SMToKIAkJcnNwX3R5cGUgPSBTRF9SU1BfVFlQRV9SMTsKIAkJYnJlYWs7Ci0JY2FzZSBNTUNfUlNQX1IxICYgfk1NQ19SU1BfQ1JDOgorCWNhc2UgTU1DX1JTUF9SMV9OT19DUkM6CiAJCXJzcF90eXBlID0gU0RfUlNQX1RZUEVfUjEgfCBTRF9OT19DSEVDS19DUkM3OwogCQlicmVhazsKIAljYXNlIE1NQ19SU1BfUjFCOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1hY3BpLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWFjcGkuYwppbmRleCA4ZmUwNzU2Li44MWQ0ZGMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWFjcGkuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWFjcGkuYwpAQCAtMjc1LDcgKzI3NSw3IEBACiAJLmNoaXAgICAgPSAmc2RoY2lfYWNwaV9jaGlwX2ludCwKIAkuY2FwcyAgICA9IE1NQ19DQVBfOF9CSVRfREFUQSB8IE1NQ19DQVBfTk9OUkVNT1ZBQkxFIHwKIAkJICAgTU1DX0NBUF9IV19SRVNFVCB8IE1NQ19DQVBfMV84Vl9ERFIgfAotCQkgICBNTUNfQ0FQX1dBSVRfV0hJTEVfQlVTWSwKKwkJICAgTU1DX0NBUF9DTURfRFVSSU5HX1RGUiB8IE1NQ19DQVBfV0FJVF9XSElMRV9CVVNZLAogCS5jYXBzMiAgID0gTU1DX0NBUDJfSENfRVJBU0VfU1osCiAJLmZsYWdzICAgPSBTREhDSV9BQ1BJX1JVTlRJTUVfUE0sCiAJLnF1aXJrcyAgPSBTREhDSV9RVUlSS19OT19FTkRBVFRSX0lOX05PUERFU0MsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWJjbS1rb25hLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWJjbS1rb25hLmMKaW5kZXggZTVjNjM0Yi4uNTFkZDJmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1iY20ta29uYS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktYmNtLWtvbmEuYwpAQCAtMjUzLDEyICsyNTMsMTQgQEAKIAkJZ290byBlcnJfcGx0Zm1fZnJlZTsKIAl9CiAKLQlpZiAoY2xrX3NldF9yYXRlKHBsdGZtX3ByaXYtPmNsaywgaG9zdC0+bW1jLT5mX21heCkgIT0gMCkgeworCXJldCA9IGNsa19zZXRfcmF0ZShwbHRmbV9wcml2LT5jbGssIGhvc3QtPm1tYy0+Zl9tYXgpOworCWlmIChyZXQpIHsKIAkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gc2V0IHJhdGUgY29yZSBjbG9ja1xuIik7CiAJCWdvdG8gZXJyX3BsdGZtX2ZyZWU7CiAJfQogCi0JaWYgKGNsa19wcmVwYXJlX2VuYWJsZShwbHRmbV9wcml2LT5jbGspICE9IDApIHsKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocGx0Zm1fcHJpdi0+Y2xrKTsKKwlpZiAocmV0KSB7CiAJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBjb3JlIGNsb2NrXG4iKTsKIAkJZ290byBlcnJfcGx0Zm1fZnJlZTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWJyY21zdGIuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktYnJjbXN0Yi5jCmluZGV4IGNjZTEwZmUuLjE1OWY2ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktYnJjbXN0Yi5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktYnJjbXN0Yi5jCkBAIC05OCw2ICs5OCw4IEBACiAJICogcHJvcGVydGllcyB0aHJvdWdoIG1tY19vZl9wYXJzZSgpLgogCSAqLwogCWhvc3QtPmNhcHMgPSBzZGhjaV9yZWFkbChob3N0LCBTREhDSV9DQVBBQklMSVRJRVMpOworCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwZGV2LT5kZXYub2Zfbm9kZSwgImJyY20sYmNtNzQyNS1zZGhjaSIpKQorCQlob3N0LT5jYXBzICY9IH5TREhDSV9DQU5fNjRCSVQ7CiAJaG9zdC0+Y2FwczEgPSBzZGhjaV9yZWFkbChob3N0LCBTREhDSV9DQVBBQklMSVRJRVNfMSk7CiAJaG9zdC0+Y2FwczEgJj0gfihTREhDSV9TVVBQT1JUX1NEUjUwIHwgU0RIQ0lfU1VQUE9SVF9TRFIxMDQgfAogCQkJU0RIQ0lfU1VQUE9SVF9ERFI1MCk7CkBAIC0xMjEsNiArMTIzLDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc2RoY2lfYnJjbV9vZl9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAiYnJjbSxiY203NDI1LXNkaGNpIiB9LAorCXsgLmNvbXBhdGlibGUgPSAiYnJjbSxiY203NDQ1LXNkaGNpIiB9LAogCXt9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHNkaGNpX2JyY21fb2ZfbWF0Y2gpOwpAQCAtMTI4LDcgKzEzMSw2IEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzZGhjaV9icmNtc3RiX2RyaXZlciA9IHsKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAic2RoY2ktYnJjbXN0YiIsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCQkucG0JPSAmc2RoY2lfYnJjbXN0Yl9wbW9wcywKIAkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHNkaGNpX2JyY21fb2ZfbWF0Y2gpLAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWVzZGhjLWlteC5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1lc2RoYy1pbXguYwppbmRleCA5OWUwYjMzLi4xZjU0ZmQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWVzZGhjLWlteC5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktZXNkaGMtaW14LmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlICJzZGhjaS1wbHRmbS5oIgogI2luY2x1ZGUgInNkaGNpLWVzZGhjLmgiCiAKKyNkZWZpbmUgRVNESENfU1lTX0NUUkxfRFRPQ1ZfTUFTSwkweDBmCiAjZGVmaW5lCUVTREhDX0NUUkxfRDNDRAkJCTB4MDgKICNkZWZpbmUgRVNESENfQlVSU1RfTEVOX0VOX0lOQ1IJCSgxIDw8IDI3KQogLyogVkVORE9SIFNQRUMgcmVnaXN0ZXIgKi8KQEAgLTkyOCw3ICs5MjksOCBAQAogCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0ID0gc2RoY2lfcHJpdihob3N0KTsKIAlzdHJ1Y3QgcGx0Zm1faW14X2RhdGEgKmlteF9kYXRhID0gc2RoY2lfcGx0Zm1fcHJpdihwbHRmbV9ob3N0KTsKIAotCXJldHVybiBlc2RoY19pc191c2RoYyhpbXhfZGF0YSkgPyAxIDw8IDI4IDogMSA8PCAyNzsKKwkvKiBEb2MgRXJyYXRhOiB0aGUgdVNESEMgYWN0dWFsIG1heGltdW0gdGltZW91dCBjb3VudCBpcyAxIDw8IDI5ICovCisJcmV0dXJuIGVzZGhjX2lzX3VzZGhjKGlteF9kYXRhKSA/IDEgPDwgMjkgOiAxIDw8IDI3OwogfQogCiBzdGF0aWMgdm9pZCBlc2RoY19zZXRfdGltZW91dChzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19jb21tYW5kICpjbWQpCkBAIC05MzcsNyArOTM5LDggQEAKIAlzdHJ1Y3QgcGx0Zm1faW14X2RhdGEgKmlteF9kYXRhID0gc2RoY2lfcGx0Zm1fcHJpdihwbHRmbV9ob3N0KTsKIAogCS8qIHVzZSBtYXhpbXVtIHRpbWVvdXQgY291bnRlciAqLwotCXNkaGNpX3dyaXRlYihob3N0LCBlc2RoY19pc191c2RoYyhpbXhfZGF0YSkgPyAweEYgOiAweEUsCisJZXNkaGNfY2xyc2V0X2xlKGhvc3QsIEVTREhDX1NZU19DVFJMX0RUT0NWX01BU0ssCisJCQllc2RoY19pc191c2RoYyhpbXhfZGF0YSkgPyAweEYgOiAweEUsCiAJCQlTREhDSV9USU1FT1VUX0NPTlRST0wpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWFyYXNhbi5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1vZi1hcmFzYW4uYwppbmRleCBlMGYxOTNmLi5kYThlNDBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWFyYXNhbi5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtYXJhc2FuLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CiAjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CiAjaW5jbHVkZSAic2RoY2ktcGx0Zm0uaCIKKyNpbmNsdWRlIDxsaW51eC9vZi5oPgogCiAjZGVmaW5lIFNESENJX0FSQVNBTl9DTEtfQ1RSTF9PRkZTRVQJMHgyYwogI2RlZmluZSBTREhDSV9BUkFTQU5fVkVORE9SX1JFR0lTVEVSCTB4NzgKQEAgLTM1LDYgKzM2LDggQEAKICNkZWZpbmUgQ0xLX0NUUkxfVElNRU9VVF9NQVNLCQkoMHhmIDw8IENMS19DVFJMX1RJTUVPVVRfU0hJRlQpCiAjZGVmaW5lIENMS19DVFJMX1RJTUVPVVRfTUlOX0VYUAkxMwogCisjZGVmaW5lIFBIWV9DTEtfVE9PX1NMT1dfSFoJCTQwMDAwMAorCiAvKgogICogT24gc29tZSBTb0NzIHRoZSBzeXNjb24gYXJlYSBoYXMgYSBmZWF0dXJlIHdoZXJlIHRoZSB1cHBlciAxNi1iaXRzIG9mCiAgKiBlYWNoIDMyLWJpdCByZWdpc3RlciBhY3QgYXMgYSB3cml0ZSBtYXNrIGZvciB0aGUgbG93ZXIgMTYtYml0cy4gIFRoaXMgYWxsb3dzCkBAIC02NSwxMCArNjgsMTIgQEAKICAqIGFjY2Vzc2libGUgdmlhIHRoZSBzeXNjb24gQVBJLgogICoKICAqIEBiYXNlY2xrZnJlcToJV2hlcmUgdG8gZmluZCBjb3JlY2ZnX2Jhc2VjbGtmcmVxCisgKiBAY2xvY2ttdWx0aXBsaWVyOglXaGVyZSB0byBmaW5kIGNvcmVjZmdfY2xvY2ttdWx0aXBsaWVyCiAgKiBAaGl3b3JkX3VwZGF0ZToJSWYgdHJ1ZSwgdXNlIEhJV09SRF9VUERBVEUgdG8gYWNjZXNzIHRoZSBzeXNjb24KICAqLwogc3RydWN0IHNkaGNpX2FyYXNhbl9zb2NfY3RsX21hcCB7CiAJc3RydWN0IHNkaGNpX2FyYXNhbl9zb2NfY3RsX2ZpZWxkCWJhc2VjbGtmcmVxOworCXN0cnVjdCBzZGhjaV9hcmFzYW5fc29jX2N0bF9maWVsZAljbG9ja211bHRpcGxpZXI7CiAJYm9vbAkJCQkJaGl3b3JkX3VwZGF0ZTsKIH07CiAKQEAgLTc3LDYgKzgyLDcgQEAKICAqIEBob3N0OgkJUG9pbnRlciB0byB0aGUgbWFpbiBTREhDSSBob3N0IHN0cnVjdHVyZS4KICAqIEBjbGtfYWhiOgkJUG9pbnRlciB0byB0aGUgQUhCIGNsb2NrCiAgKiBAcGh5OgkJUG9pbnRlciB0byB0aGUgZ2VuZXJpYyBwaHkKKyAqIEBpc19waHlfb246CQlUcnVlIGlmIHRoZSBQSFkgaXMgb247IGZhbHNlIGlmIG5vdC4KICAqIEBzZGNhcmRjbGtfaHc6CVN0cnVjdCBmb3IgdGhlIGNsb2NrIHdlIG1pZ2h0IHByb3ZpZGUgdG8gYSBQSFkuCiAgKiBAc2RjYXJkY2xrOgkJUG9pbnRlciB0byBub3JtYWwgJ3N0cnVjdCBjbG9jaycgZm9yIHNkY2FyZGNsa19ody4KICAqIEBzb2NfY3RsX2Jhc2U6CVBvaW50ZXIgdG8gcmVnbWFwIGZvciBzeXNjb24gZm9yIHNvY19jdGwgcmVnaXN0ZXJzLgpAQCAtODYsMTYgKzkyLDIyIEBACiAJc3RydWN0IHNkaGNpX2hvc3QgKmhvc3Q7CiAJc3RydWN0IGNsawkqY2xrX2FoYjsKIAlzdHJ1Y3QgcGh5CSpwaHk7CisJYm9vbAkJaXNfcGh5X29uOwogCiAJc3RydWN0IGNsa19odwlzZGNhcmRjbGtfaHc7CiAJc3RydWN0IGNsayAgICAgICpzZGNhcmRjbGs7CiAKIAlzdHJ1Y3QgcmVnbWFwCSpzb2NfY3RsX2Jhc2U7CiAJY29uc3Qgc3RydWN0IHNkaGNpX2FyYXNhbl9zb2NfY3RsX21hcCAqc29jX2N0bF9tYXA7CisJdW5zaWduZWQgaW50CXF1aXJrczsgLyogQXJhc2FuIGRldmlhdGlvbnMgZnJvbSBzcGVjICovCisKKy8qIENvbnRyb2xsZXIgZG9lcyBub3QgaGF2ZSBDRCB3aXJlZCBhbmQgd2lsbCBub3QgZnVuY3Rpb24gbm9ybWFsbHkgd2l0aG91dCAqLworI2RlZmluZSBTREhDSV9BUkFTQU5fUVVJUktfRk9SQ0VfQ0RURVNUCUJJVCgwKQogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzZGhjaV9hcmFzYW5fc29jX2N0bF9tYXAgcmszMzk5X3NvY19jdGxfbWFwID0gewogCS5iYXNlY2xrZnJlcSA9IHsgLnJlZyA9IDB4ZjAwMCwgLndpZHRoID0gOCwgLnNoaWZ0ID0gOCB9LAorCS5jbG9ja211bHRpcGxpZXIgPSB7IC5yZWcgPSAweGYwMmMsIC53aWR0aCA9IDgsIC5zaGlmdCA9IDB9LAogCS5oaXdvcmRfdXBkYXRlID0gdHJ1ZSwKIH07CiAKQEAgLTE3MCwxMyArMTgyLDQ3IEBACiAJc3RydWN0IHNkaGNpX2FyYXNhbl9kYXRhICpzZGhjaV9hcmFzYW4gPSBzZGhjaV9wbHRmbV9wcml2KHBsdGZtX2hvc3QpOwogCWJvb2wgY3RybF9waHkgPSBmYWxzZTsKIAotCWlmIChjbG9jayA+IE1NQ19ISUdIXzUyX01BWF9EVFIgJiYgKCFJU19FUlIoc2RoY2lfYXJhc2FuLT5waHkpKSkKLQkJY3RybF9waHkgPSB0cnVlOworCWlmICghSVNfRVJSKHNkaGNpX2FyYXNhbi0+cGh5KSkgeworCQlpZiAoIXNkaGNpX2FyYXNhbi0+aXNfcGh5X29uICYmIGNsb2NrIDw9IFBIWV9DTEtfVE9PX1NMT1dfSFopIHsKKwkJCS8qCisJCQkgKiBJZiBQSFkgb2ZmLCBzZXQgY2xvY2sgdG8gbWF4IHNwZWVkIGFuZCBwb3dlciBQSFkgb24uCisJCQkgKgorCQkJICogQWx0aG91Z2ggUEhZIGRvY3MgYXBwYXJlbnRseSBzdWdnZXN0IHBvd2VyIGN5Y2xpbmcKKwkJCSAqIHdoZW4gY2hhbmdpbmcgdGhlIGNsb2NrIHRoZSBQSFkgZG9lc24ndCBsaWtlIHRvIGJlCisJCQkgKiBwb3dlcmVkIG9uIHdoaWxlIGF0IGxvdyBzcGVlZHMgbGlrZSB0aG9zZSB1c2VkIGluIElECisJCQkgKiBtb2RlLiAgRXZlbiB3b3JzZSBpcyBwb3dlcmluZyB0aGUgUEhZIG9uIHdoaWxlIHRoZQorCQkJICogY2xvY2sgaXMgb2ZmLgorCQkJICoKKwkJCSAqIFRvIHdvcmthcm91bmQgdGhlIFBIWSBsaW1pdGF0aW9ucywgdGhlIGJlc3Qgd2UgY2FuCisJCQkgKiBkbyBpcyB0byBwb3dlciBpdCBvbiBhdCBhIGZhc3RlciBzcGVlZCBhbmQgdGhlbiBzbGFtCisJCQkgKiB0aHJvdWdoIGxvdyBzcGVlZHMgd2l0aG91dCBwb3dlciBjeWNsaW5nLgorCQkJICovCisJCQlzZGhjaV9zZXRfY2xvY2soaG9zdCwgaG9zdC0+bWF4X2Nsayk7CisJCQlzcGluX3VubG9ja19pcnEoJmhvc3QtPmxvY2spOworCQkJcGh5X3Bvd2VyX29uKHNkaGNpX2FyYXNhbi0+cGh5KTsKKwkJCXNwaW5fbG9ja19pcnEoJmhvc3QtPmxvY2spOworCQkJc2RoY2lfYXJhc2FuLT5pc19waHlfb24gPSB0cnVlOwogCi0JaWYgKGN0cmxfcGh5KSB7CisJCQkvKgorCQkJICogV2UnbGwgbm93IGZhbGwgdGhyb3VnaCB0byB0aGUgYmVsb3cgY2FzZSB3aXRoCisJCQkgKiBjdHJsX3BoeSA9IGZhbHNlIChzbyB3ZSB3b24ndCB0dXJuIG9mZi9vbikuICBUaGUKKwkJCSAqIHNkaGNpX3NldF9jbG9jaygpIHdpbGwgc2V0IHRoZSByZWFsIGNsb2NrLgorCQkJICovCisJCX0gZWxzZSBpZiAoY2xvY2sgPiBQSFlfQ0xLX1RPT19TTE9XX0haKSB7CisJCQkvKgorCQkJICogQXQgaGlnaGVyIGNsb2NrIHNwZWVkcyB0aGUgUEhZIGlzIGZpbmUgYmVpbmcgcG93ZXIKKwkJCSAqIGN5Y2xlZCBhbmQgZG9jcyBzYXkgeW91IF9zaG91bGRfIHBvd2VyIGN5Y2xlIHdoZW4KKwkJCSAqIGNoYW5naW5nIGNsb2NrIHNwZWVkcy4KKwkJCSAqLworCQkJY3RybF9waHkgPSB0cnVlOworCQl9CisJfQorCisJaWYgKGN0cmxfcGh5ICYmIHNkaGNpX2FyYXNhbi0+aXNfcGh5X29uKSB7CiAJCXNwaW5fdW5sb2NrX2lycSgmaG9zdC0+bG9jayk7CiAJCXBoeV9wb3dlcl9vZmYoc2RoY2lfYXJhc2FuLT5waHkpOwogCQlzcGluX2xvY2tfaXJxKCZob3N0LT5sb2NrKTsKKwkJc2RoY2lfYXJhc2FuLT5pc19waHlfb24gPSBmYWxzZTsKIAl9CiAKIAlzZGhjaV9zZXRfY2xvY2soaG9zdCwgY2xvY2spOwpAQCAtMTg1LDYgKzIzMSw3IEBACiAJCXNwaW5fdW5sb2NrX2lycSgmaG9zdC0+bG9jayk7CiAJCXBoeV9wb3dlcl9vbihzZGhjaV9hcmFzYW4tPnBoeSk7CiAJCXNwaW5fbG9ja19pcnEoJmhvc3QtPmxvY2spOworCQlzZGhjaV9hcmFzYW4tPmlzX3BoeV9vbiA9IHRydWU7CiAJfQogfQogCkBAIC0yMDMsMTIgKzI1MCwyNyBAQAogCXdyaXRlbCh2ZW5kb3IsIGhvc3QtPmlvYWRkciArIFNESENJX0FSQVNBTl9WRU5ET1JfUkVHSVNURVIpOwogfQogCit2b2lkIHNkaGNpX2FyYXNhbl9yZXNldChzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgdTggbWFzaykKK3sKKwl1OCBjdHJsOworCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0ID0gc2RoY2lfcHJpdihob3N0KTsKKwlzdHJ1Y3Qgc2RoY2lfYXJhc2FuX2RhdGEgKnNkaGNpX2FyYXNhbiA9IHNkaGNpX3BsdGZtX3ByaXYocGx0Zm1faG9zdCk7CisKKwlzZGhjaV9yZXNldChob3N0LCBtYXNrKTsKKworCWlmIChzZGhjaV9hcmFzYW4tPnF1aXJrcyAmIFNESENJX0FSQVNBTl9RVUlSS19GT1JDRV9DRFRFU1QpIHsKKwkJY3RybCA9IHNkaGNpX3JlYWRiKGhvc3QsIFNESENJX0hPU1RfQ09OVFJPTCk7CisJCWN0cmwgfD0gU0RIQ0lfQ1RSTF9DRFRFU1RfSU5TIHwgU0RIQ0lfQ1RSTF9DRFRFU1RfRU47CisJCXNkaGNpX3dyaXRlYihob3N0LCBjdHJsLCBTREhDSV9IT1NUX0NPTlRST0wpOworCX0KK30KKwogc3RhdGljIHN0cnVjdCBzZGhjaV9vcHMgc2RoY2lfYXJhc2FuX29wcyA9IHsKIAkuc2V0X2Nsb2NrID0gc2RoY2lfYXJhc2FuX3NldF9jbG9jaywKIAkuZ2V0X21heF9jbG9jayA9IHNkaGNpX3BsdGZtX2Nsa19nZXRfbWF4X2Nsb2NrLAogCS5nZXRfdGltZW91dF9jbG9jayA9IHNkaGNpX2FyYXNhbl9nZXRfdGltZW91dF9jbG9jaywKIAkuc2V0X2J1c193aWR0aCA9IHNkaGNpX3NldF9idXNfd2lkdGgsCi0JLnJlc2V0ID0gc2RoY2lfcmVzZXQsCisJLnJlc2V0ID0gc2RoY2lfYXJhc2FuX3Jlc2V0LAogCS5zZXRfdWhzX3NpZ25hbGluZyA9IHNkaGNpX3NldF91aHNfc2lnbmFsaW5nLAogfTsKIApAQCAtMjM5LDEzICszMDEsMTQgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKCFJU19FUlIoc2RoY2lfYXJhc2FuLT5waHkpKSB7CisJaWYgKCFJU19FUlIoc2RoY2lfYXJhc2FuLT5waHkpICYmIHNkaGNpX2FyYXNhbi0+aXNfcGh5X29uKSB7CiAJCXJldCA9IHBoeV9wb3dlcl9vZmYoc2RoY2lfYXJhc2FuLT5waHkpOwogCQlpZiAocmV0KSB7CiAJCQlkZXZfZXJyKGRldiwgIkNhbm5vdCBwb3dlciBvZmYgcGh5LlxuIik7CiAJCQlzZGhjaV9yZXN1bWVfaG9zdChob3N0KTsKIAkJCXJldHVybiByZXQ7CiAJCX0KKwkJc2RoY2lfYXJhc2FuLT5pc19waHlfb24gPSBmYWxzZTsKIAl9CiAKIAljbGtfZGlzYWJsZShwbHRmbV9ob3N0LT5jbGspOwpAQCAtMjgxLDEyICszNDQsMTMgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAoIUlTX0VSUihzZGhjaV9hcmFzYW4tPnBoeSkpIHsKKwlpZiAoIUlTX0VSUihzZGhjaV9hcmFzYW4tPnBoeSkgJiYgaG9zdC0+bW1jLT5hY3R1YWxfY2xvY2spIHsKIAkJcmV0ID0gcGh5X3Bvd2VyX29uKHNkaGNpX2FyYXNhbi0+cGh5KTsKIAkJaWYgKHJldCkgewogCQkJZGV2X2VycihkZXYsICJDYW5ub3QgcG93ZXIgb24gcGh5LlxuIik7CiAJCQlyZXR1cm4gcmV0OwogCQl9CisJCXNkaGNpX2FyYXNhbi0+aXNfcGh5X29uID0gdHJ1ZTsKIAl9CiAKIAlyZXR1cm4gc2RoY2lfcmVzdW1lX2hvc3QoaG9zdCk7CkBAIC0zMzgsNiArNDAyLDQ1IEBACiB9OwogCiAvKioKKyAqIHNkaGNpX2FyYXNhbl91cGRhdGVfY2xvY2ttdWx0aXBsaWVyIC0gU2V0IGNvcmVjZmdfY2xvY2ttdWx0aXBsaWVyCisgKgorICogVGhlIGNvcmVjZmdfY2xvY2ttdWx0aXBsaWVyIGlzIHN1cHBvc2VkIHRvIGNvbnRhaW4gY2xvY2sgbXVsdGlwbGllcgorICogdmFsdWUgb2YgcHJvZ3JhbW1hYmxlIGNsb2NrIGdlbmVyYXRvci4KKyAqCisgKiBOT1RFUzoKKyAqIC0gTWFueSBleGlzdGluZyBkZXZpY2VzIGRvbid0IHNlZW0gdG8gZG8gdGhpcyBhbmQgd29yayBmaW5lLiAgVG8ga2VlcAorICogICBjb21wYXRpYmlsaXR5IGZvciBvbGQgaGFyZHdhcmUgd2hlcmUgdGhlIGRldmljZSB0cmVlIGRvZXNuJ3QgcHJvdmlkZSBhCisgKiAgIHJlZ2lzdGVyIG1hcCwgdGhpcyBmdW5jdGlvbiBpcyBhIG5vb3AgaWYgYSBzb2NfY3RsX21hcCBoYXNuJ3QgYmVlbiBwcm92aWRlZAorICogICBmb3IgdGhpcyBwbGF0Zm9ybS4KKyAqIC0gVGhlIHZhbHVlIG9mIGNvcmVjZmdfY2xvY2ttdWx0aXBsaWVyIHNob3VsZCBzeW5jIHdpdGggdGhhdCBvZiBjb3JyZXNwb25kaW5nCisgKiAgIHZhbHVlIHJlYWRpbmcgZnJvbSBzZGhjaV9jYXBhYmlsaXR5X3JlZ2lzdGVyLiBTbyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZAorICogICBvbmNlIGF0IHByb2JlIHRpbWUgYW5kIG5ldmVyIGNhbGxlZCBhZ2Fpbi4KKyAqCisgKiBAaG9zdDoJCVRoZSBzZGhjaV9ob3N0CisgKi8KK3N0YXRpYyB2b2lkIHNkaGNpX2FyYXNhbl91cGRhdGVfY2xvY2ttdWx0aXBsaWVyKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LAorCQkJCQkJdTMyIHZhbHVlKQoreworCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0ID0gc2RoY2lfcHJpdihob3N0KTsKKwlzdHJ1Y3Qgc2RoY2lfYXJhc2FuX2RhdGEgKnNkaGNpX2FyYXNhbiA9IHNkaGNpX3BsdGZtX3ByaXYocGx0Zm1faG9zdCk7CisJY29uc3Qgc3RydWN0IHNkaGNpX2FyYXNhbl9zb2NfY3RsX21hcCAqc29jX2N0bF9tYXAgPQorCQlzZGhjaV9hcmFzYW4tPnNvY19jdGxfbWFwOworCisJLyogSGF2aW5nIGEgbWFwIGlzIG9wdGlvbmFsICovCisJaWYgKCFzb2NfY3RsX21hcCkKKwkJcmV0dXJuOworCisJLyogSWYgd2UgaGF2ZSBhIG1hcCwgd2UgZXhwZWN0IHRvIGhhdmUgYSBzeXNjb24gKi8KKwlpZiAoIXNkaGNpX2FyYXNhbi0+c29jX2N0bF9iYXNlKSB7CisJCXByX3dhcm4oIiVzOiBIYXZlIHJlZ21hcCwgYnV0IG5vIHNvYy1jdGwtc3lzY29uXG4iLAorCQkJbW1jX2hvc3RuYW1lKGhvc3QtPm1tYykpOworCQlyZXR1cm47CisJfQorCisJc2RoY2lfYXJhc2FuX3N5c2Nvbl93cml0ZShob3N0LCAmc29jX2N0bF9tYXAtPmNsb2NrbXVsdGlwbGllciwgdmFsdWUpOworfQorCisvKioKICAqIHNkaGNpX2FyYXNhbl91cGRhdGVfYmFzZWNsa2ZyZXEgLSBTZXQgY29yZWNmZ19iYXNlY2xrZnJlcQogICoKICAqIFRoZSBjb3JlY2ZnX2Jhc2VjbGtmcmVxIGlzIHN1cHBvc2VkIHRvIGNvbnRhaW4gdGhlIE1IeiBvZiBjbGtfeGluLiAgVGhpcwpAQCAtNDYyLDYgKzU2NSw3IEBACiAJc3RydWN0IHNkaGNpX2hvc3QgKmhvc3Q7CiAJc3RydWN0IHNkaGNpX3BsdGZtX2hvc3QgKnBsdGZtX2hvc3Q7CiAJc3RydWN0IHNkaGNpX2FyYXNhbl9kYXRhICpzZGhjaV9hcmFzYW47CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOwogCiAJaG9zdCA9IHNkaGNpX3BsdGZtX2luaXQocGRldiwgJnNkaGNpX2FyYXNhbl9wZGF0YSwKIAkJCQlzaXplb2YoKnNkaGNpX2FyYXNhbikpOwpAQCAtNTE2LDggKzYyMCwxNiBAQAogCX0KIAogCXNkaGNpX2dldF9vZl9wcm9wZXJ0eShwZGV2KTsKKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJ4bG54LGZhaWxzLXdpdGhvdXQtdGVzdC1jZCIpKQorCQlzZGhjaV9hcmFzYW4tPnF1aXJrcyB8PSBTREhDSV9BUkFTQU5fUVVJUktfRk9SQ0VfQ0RURVNUOworCiAJcGx0Zm1faG9zdC0+Y2xrID0gY2xrX3hpbjsKIAorCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkgICAgInJvY2tjaGlwLHJrMzM5OS1zZGhjaS01LjEiKSkKKwkJc2RoY2lfYXJhc2FuX3VwZGF0ZV9jbG9ja211bHRpcGxpZXIoaG9zdCwgMHgwKTsKKwogCXNkaGNpX2FyYXNhbl91cGRhdGVfYmFzZWNsa2ZyZXEoaG9zdCk7CiAKIAlyZXQgPSBzZGhjaV9hcmFzYW5fcmVnaXN0ZXJfc2RjbGsoc2RoY2lfYXJhc2FuLCBjbGtfeGluLCAmcGRldi0+ZGV2KTsKQEAgLTU0NywxMiArNjU5LDYgQEAKIAkJCWdvdG8gdW5yZWdfY2xrOwogCQl9CiAKLQkJcmV0ID0gcGh5X3Bvd2VyX29uKHNkaGNpX2FyYXNhbi0+cGh5KTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgInBoeV9wb3dlcl9vbiBlcnIuXG4iKTsKLQkJCWdvdG8gZXJyX3BoeV9wb3dlcjsKLQkJfQotCiAJCWhvc3QtPm1tY19ob3N0X29wcy5oczQwMF9lbmhhbmNlZF9zdHJvYmUgPQogCQkJCQlzZGhjaV9hcmFzYW5faHM0MDBfZW5oYW5jZWRfc3Ryb2JlOwogCX0KQEAgLTU2NSw5ICs2NzEsNiBAQAogCiBlcnJfYWRkX2hvc3Q6CiAJaWYgKCFJU19FUlIoc2RoY2lfYXJhc2FuLT5waHkpKQotCQlwaHlfcG93ZXJfb2ZmKHNkaGNpX2FyYXNhbi0+cGh5KTsKLWVycl9waHlfcG93ZXI6Ci0JaWYgKCFJU19FUlIoc2RoY2lfYXJhc2FuLT5waHkpKQogCQlwaHlfZXhpdChzZGhjaV9hcmFzYW4tPnBoeSk7CiB1bnJlZ19jbGs6CiAJc2RoY2lfYXJhc2FuX3VucmVnaXN0ZXJfc2RjbGsoJnBkZXYtPmRldik7CkBAIC01ODksNyArNjkyLDggQEAKIAlzdHJ1Y3QgY2xrICpjbGtfYWhiID0gc2RoY2lfYXJhc2FuLT5jbGtfYWhiOwogCiAJaWYgKCFJU19FUlIoc2RoY2lfYXJhc2FuLT5waHkpKSB7Ci0JCXBoeV9wb3dlcl9vZmYoc2RoY2lfYXJhc2FuLT5waHkpOworCQlpZiAoc2RoY2lfYXJhc2FuLT5pc19waHlfb24pCisJCQlwaHlfcG93ZXJfb2ZmKHNkaGNpX2FyYXNhbi0+cGh5KTsKIAkJcGh5X2V4aXQoc2RoY2lfYXJhc2FuLT5waHkpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1vZi1lc2RoYy5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1vZi1lc2RoYy5jCmluZGV4IDIzOWJlMmYuLmZiNzFjODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtZXNkaGMuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWVzZGhjLmMKQEAgLTU4Myw3ICs1ODMsNyBAQAogCiAJbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAotCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJsaXR0bGUtZW5kaWFuIiwgTlVMTCkpCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImxpdHRsZS1lbmRpYW4iKSkKIAkJaG9zdCA9IHNkaGNpX3BsdGZtX2luaXQocGRldiwgJnNkaGNpX2VzZGhjX2xlX3BkYXRhLAogCQkJCQlzaXplb2Yoc3RydWN0IHNkaGNpX2VzZGhjKSk7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wY2ktY29yZS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wY2ktY29yZS5jCmluZGV4IDg5N2NmZDIuLjcyYTFmMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGNpLWNvcmUuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBjaS1jb3JlLmMKQEAgLTE1Niw3ICsxNTYsNyBAQAogCWlmICghZ3Bpb19pc192YWxpZChncGlvKSkKIAkJcmV0dXJuOwogCi0JZXJyID0gZ3Bpb19yZXF1ZXN0KGdwaW8sICJzZF9jZCIpOworCWVyciA9IGRldm1fZ3Bpb19yZXF1ZXN0KCZzbG90LT5jaGlwLT5wZGV2LT5kZXYsIGdwaW8sICJzZF9jZCIpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIG91dDsKIApAQCAtMTc5LDcgKzE3OSw3IEBACiAJcmV0dXJuOwogCiBvdXRfZnJlZToKLQlncGlvX2ZyZWUoZ3Bpbyk7CisJZGV2bV9ncGlvX2ZyZWUoJnNsb3QtPmNoaXAtPnBkZXYtPmRldiwgZ3Bpbyk7CiBvdXQ6CiAJZGV2X3dhcm4oJnNsb3QtPmNoaXAtPnBkZXYtPmRldiwgImZhaWxlZCB0byBzZXR1cCBjYXJkIGRldGVjdCB3YWtlIHVwXG4iKTsKIH0KQEAgLTE4OCw4ICsxODgsNiBAQAogewogCWlmIChzbG90LT5jZF9pcnEgPj0gMCkKIAkJZnJlZV9pcnEoc2xvdC0+Y2RfaXJxLCBzbG90KTsKLQlpZiAoZ3Bpb19pc192YWxpZChzbG90LT5jZF9ncGlvKSkKLQkJZ3Bpb19mcmVlKHNsb3QtPmNkX2dwaW8pOwogfQogCiAjZWxzZQpAQCAtMzU2LDYgKzM1NCw3IEBACiB7CiAJc2xvdC0+aG9zdC0+bW1jLT5jYXBzIHw9IE1NQ19DQVBfOF9CSVRfREFUQSB8IE1NQ19DQVBfTk9OUkVNT1ZBQkxFIHwKIAkJCQkgTU1DX0NBUF9IV19SRVNFVCB8IE1NQ19DQVBfMV84Vl9ERFIgfAorCQkJCSBNTUNfQ0FQX0NNRF9EVVJJTkdfVEZSIHwKIAkJCQkgTU1DX0NBUF9XQUlUX1dISUxFX0JVU1k7CiAJc2xvdC0+aG9zdC0+bW1jLT5jYXBzMiB8PSBNTUNfQ0FQMl9IQ19FUkFTRV9TWjsKIAlzbG90LT5od19yZXNldCA9IHNkaGNpX3BjaV9pbnRfaHdfcmVzZXQ7CkBAIC00MjEsMTcgKzQyMCwzMCBAQAogLyogRGVmaW5lIEhvc3QgY29udHJvbGxlcnMgZm9yIEludGVsIE1lcnJpZmllbGQgcGxhdGZvcm0gKi8KICNkZWZpbmUgSU5URUxfTVJGTERfRU1NQ18wCTAKICNkZWZpbmUgSU5URUxfTVJGTERfRU1NQ18xCTEKKyNkZWZpbmUgSU5URUxfTVJGTERfU0QJCTIKKyNkZWZpbmUgSU5URUxfTVJGTERfU0RJTwkzCiAKIHN0YXRpYyBpbnQgaW50ZWxfbXJmbGRfbW1jX3Byb2JlX3Nsb3Qoc3RydWN0IHNkaGNpX3BjaV9zbG90ICpzbG90KQogewotCWlmICgoUENJX0ZVTkMoc2xvdC0+Y2hpcC0+cGRldi0+ZGV2Zm4pICE9IElOVEVMX01SRkxEX0VNTUNfMCkgJiYKLQkgICAgKFBDSV9GVU5DKHNsb3QtPmNoaXAtPnBkZXYtPmRldmZuKSAhPSBJTlRFTF9NUkZMRF9FTU1DXzEpKQotCQkvKiBTRCBzdXBwb3J0IGlzIG5vdCByZWFkeSB5ZXQgKi8KKwl1bnNpZ25lZCBpbnQgZnVuYyA9IFBDSV9GVU5DKHNsb3QtPmNoaXAtPnBkZXYtPmRldmZuKTsKKworCXN3aXRjaCAoZnVuYykgeworCWNhc2UgSU5URUxfTVJGTERfRU1NQ18wOgorCWNhc2UgSU5URUxfTVJGTERfRU1NQ18xOgorCQlzbG90LT5ob3N0LT5tbWMtPmNhcHMgfD0gTU1DX0NBUF9OT05SRU1PVkFCTEUgfAorCQkJCQkgTU1DX0NBUF84X0JJVF9EQVRBIHwKKwkJCQkJIE1NQ19DQVBfMV84Vl9ERFI7CisJCWJyZWFrOworCWNhc2UgSU5URUxfTVJGTERfU0Q6CisJCXNsb3QtPmhvc3QtPnF1aXJrczIgfD0gU0RIQ0lfUVVJUksyX05PXzFfOF9WOworCQlicmVhazsKKwljYXNlIElOVEVMX01SRkxEX1NESU86CisJCXNsb3QtPmhvc3QtPm1tYy0+Y2FwcyB8PSBNTUNfQ0FQX05PTlJFTU9WQUJMRSB8CisJCQkJCSBNTUNfQ0FQX1BPV0VSX09GRl9DQVJEOworCQlicmVhazsKKwlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT0RFVjsKLQotCXNsb3QtPmhvc3QtPm1tYy0+Y2FwcyB8PSBNTUNfQ0FQXzhfQklUX0RBVEEgfCBNTUNfQ0FQX05PTlJFTU9WQUJMRSB8Ci0JCQkJIE1NQ19DQVBfMV84Vl9ERFI7Ci0KKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2MTUsNyArMTYyNyw2IEBACiAKIAlzbG90LT5jaGlwID0gY2hpcDsKIAlzbG90LT5ob3N0ID0gaG9zdDsKLQlzbG90LT5wY2lfYmFyID0gYmFyOwogCXNsb3QtPnJzdF9uX2dwaW8gPSAtRUlOVkFMOwogCXNsb3QtPmNkX2dwaW8gPSAtRUlOVkFMOwogCXNsb3QtPmNkX2lkeCA9IC0xOwpAQCAtMTY0MywyNyArMTY1NCwyMiBAQAogCiAJaG9zdC0+aXJxID0gcGRldi0+aXJxOwogCi0JcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIGJhciwgbW1jX2hvc3RuYW1lKGhvc3QtPm1tYykpOworCXJldCA9IHBjaW1faW9tYXBfcmVnaW9ucyhwZGV2LCBCSVQoYmFyKSwgbW1jX2hvc3RuYW1lKGhvc3QtPm1tYykpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IHJlcXVlc3QgcmVnaW9uXG4iKTsKIAkJZ290byBjbGVhbnVwOwogCX0KIAotCWhvc3QtPmlvYWRkciA9IHBjaV9pb3JlbWFwX2JhcihwZGV2LCBiYXIpOwotCWlmICghaG9zdC0+aW9hZGRyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZW1hcCByZWdpc3RlcnNcbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIHJlbGVhc2U7Ci0JfQorCWhvc3QtPmlvYWRkciA9IHBjaW1faW9tYXBfdGFibGUocGRldilbYmFyXTsKIAogCWlmIChjaGlwLT5maXhlcyAmJiBjaGlwLT5maXhlcy0+cHJvYmVfc2xvdCkgewogCQlyZXQgPSBjaGlwLT5maXhlcy0+cHJvYmVfc2xvdChzbG90KTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gdW5tYXA7CisJCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJaWYgKGdwaW9faXNfdmFsaWQoc2xvdC0+cnN0X25fZ3BpbykpIHsKLQkJaWYgKCFncGlvX3JlcXVlc3Qoc2xvdC0+cnN0X25fZ3BpbywgImVNTUNfcmVzZXQiKSkgeworCQlpZiAoIWRldm1fZ3Bpb19yZXF1ZXN0KCZwZGV2LT5kZXYsIHNsb3QtPnJzdF9uX2dwaW8sICJlTU1DX3Jlc2V0IikpIHsKIAkJCWdwaW9fZGlyZWN0aW9uX291dHB1dChzbG90LT5yc3Rfbl9ncGlvLCAxKTsKIAkJCXNsb3QtPmhvc3QtPm1tYy0+Y2FwcyB8PSBNTUNfQ0FQX0hXX1JFU0VUOwogCQkJc2xvdC0+aHdfcmVzZXQgPSBzZGhjaV9wY2lfZ3Bpb19od19yZXNldDsKQEAgLTE3MDIsMTggKzE3MDgsOSBAQAogCXJldHVybiBzbG90OwogCiByZW1vdmU6Ci0JaWYgKGdwaW9faXNfdmFsaWQoc2xvdC0+cnN0X25fZ3BpbykpCi0JCWdwaW9fZnJlZShzbG90LT5yc3Rfbl9ncGlvKTsKLQogCWlmIChjaGlwLT5maXhlcyAmJiBjaGlwLT5maXhlcy0+cmVtb3ZlX3Nsb3QpCiAJCWNoaXAtPmZpeGVzLT5yZW1vdmVfc2xvdChzbG90LCAwKTsKIAotdW5tYXA6Ci0JaW91bm1hcChob3N0LT5pb2FkZHIpOwotCi1yZWxlYXNlOgotCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCBiYXIpOwotCiBjbGVhbnVwOgogCWlmIChzbG90LT5kYXRhICYmIHNsb3QtPmRhdGEtPmNsZWFudXApCiAJCXNsb3QtPmRhdGEtPmNsZWFudXAoc2xvdC0+ZGF0YSk7CkBAIC0xNzM4LDE3ICsxNzM1LDEyIEBACiAKIAlzZGhjaV9yZW1vdmVfaG9zdChzbG90LT5ob3N0LCBkZWFkKTsKIAotCWlmIChncGlvX2lzX3ZhbGlkKHNsb3QtPnJzdF9uX2dwaW8pKQotCQlncGlvX2ZyZWUoc2xvdC0+cnN0X25fZ3Bpbyk7Ci0KIAlpZiAoc2xvdC0+Y2hpcC0+Zml4ZXMgJiYgc2xvdC0+Y2hpcC0+Zml4ZXMtPnJlbW92ZV9zbG90KQogCQlzbG90LT5jaGlwLT5maXhlcy0+cmVtb3ZlX3Nsb3Qoc2xvdCwgZGVhZCk7CiAKIAlpZiAoc2xvdC0+ZGF0YSAmJiBzbG90LT5kYXRhLT5jbGVhbnVwKQogCQlzbG90LT5kYXRhLT5jbGVhbnVwKHNsb3QtPmRhdGEpOwogCi0JcGNpX3JlbGVhc2VfcmVnaW9uKHNsb3QtPmNoaXAtPnBkZXYsIHNsb3QtPnBjaV9iYXIpOwotCiAJc2RoY2lfZnJlZV9ob3N0KHNsb3QtPmhvc3QpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBjaS5oIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wY2kuaAppbmRleCA3ZTA3ODg3Li45YzdjMDhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBjaS5oCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGNpLmgKQEAgLTcyLDcgKzcyLDYgQEAKIAlzdHJ1Y3Qgc2RoY2lfaG9zdAkqaG9zdDsKIAlzdHJ1Y3Qgc2RoY2lfcGNpX2RhdGEJKmRhdGE7CiAKLQlpbnQJCQlwY2lfYmFyOwogCWludAkJCXJzdF9uX2dwaW87CiAJaW50CQkJY2RfZ3BpbzsKIAlpbnQJCQljZF9pcnE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBsdGZtLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBsdGZtLmMKaW5kZXggMWQxN2RjZi4uYWQ0OWJmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wbHRmbS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGx0Zm0uYwpAQCAtMTU2LDEzICsxNTYsNiBAQAogCQlob3N0LT5xdWlya3MyID0gcGRhdGEtPnF1aXJrczI7CiAJfQogCi0JLyoKLQkgKiBTb21lIHBsYXRmb3JtcyBuZWVkIHRvIHByb2JlIHRoZSBjb250cm9sbGVyIHRvIGJlIGFibGUgdG8KLQkgKiBkZXRlcm1pbmUgd2hpY2ggY2FwcyBzaG91bGQgYmUgdXNlZC4KLQkgKi8KLQlpZiAoaG9zdC0+b3BzICYmIGhvc3QtPm9wcy0+cGxhdGZvcm1faW5pdCkKLQkJaG9zdC0+b3BzLT5wbGF0Zm9ybV9pbml0KGhvc3QpOwotCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaG9zdCk7CiAKIAlyZXR1cm4gaG9zdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktc3QuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktc3QuYwppbmRleCBjOTViYTgzLi5lZDkyY2U3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1zdC5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktc3QuYwpAQCAtMjgsNiArMjgsNyBAQAogCiBzdHJ1Y3Qgc3RfbW1jX3BsYXRmb3JtX2RhdGEgewogCXN0cnVjdCAgcmVzZXRfY29udHJvbCAqcnN0YzsKKwlzdHJ1Y3QgIGNsayAqaWNuY2xrOwogCXZvaWQgX19pb21lbSAqdG9wX2lvYWRkcjsKIH07CiAKQEAgLTM1Myw3ICszNTQsNyBAQAogCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0OwogCXN0cnVjdCBzdF9tbWNfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAJc3RydWN0IHNkaGNpX3BsdGZtX2hvc3QgKnBsdGZtX2hvc3Q7Ci0Jc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGsgKmNsaywgKmljbmNsazsKIAlpbnQgcmV0ID0gMDsKIAl1MTYgaG9zdF92ZXJzaW9uOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwpAQCAtMzY1LDYgKzM2NiwxMSBAQAogCQlyZXR1cm4gUFRSX0VSUihjbGspOwogCX0KIAorCS8qIElDTiBjbG9jayBpc24ndCBjb21wdWxzb3J5LCBidXQgdXNlIGl0IGlmIGl0J3MgcHJvdmlkZWQuICovCisJaWNuY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJpY24iKTsKKwlpZiAoSVNfRVJSKGljbmNsaykpCisJCWljbmNsayA9IE5VTEw7CisKIAlyc3RjID0gZGV2bV9yZXNldF9jb250cm9sX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKIAlpZiAoSVNfRVJSKHJzdGMpKQogCQlyc3RjID0gTlVMTDsKQEAgLTM4OSw2ICszOTUsNyBAQAogCX0KIAogCWNsa19wcmVwYXJlX2VuYWJsZShjbGspOworCWNsa19wcmVwYXJlX2VuYWJsZShpY25jbGspOwogCiAJLyogQ29uZmlndXJlIHRoZSBGbGFzaFNTIFRvcCByZWdpc3RlcnMgZm9yIHNldHRpbmcgZU1NQyBUWC9SWCBkZWxheSAqLwogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCkBAIC00MDAsNiArNDA3LDcgQEAKIAl9CiAKIAlwbHRmbV9ob3N0LT5jbGsgPSBjbGs7CisJcGRhdGEtPmljbmNsayA9IGljbmNsazsKIAogCS8qIENvbmZpZ3VyZSB0aGUgQXJhc2FuIEhDIGluc2lkZSB0aGUgZmxhc2hTUyAqLwogCXN0X21tY3NzX2Njb25maWcobnAsIGhvc3QpOwpAQCAtNDIyLDYgKzQzMCw3IEBACiAJcmV0dXJuIDA7CiAKIGVycl9vdXQ6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGljbmNsayk7CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGNsayk7CiBlcnJfb2Y6CiAJc2RoY2lfcGx0Zm1fZnJlZShwZGV2KTsKQEAgLTQ0Miw2ICs0NTEsOCBAQAogCiAJcmV0ID0gc2RoY2lfcGx0Zm1fdW5yZWdpc3RlcihwZGV2KTsKIAorCWNsa19kaXNhYmxlX3VucHJlcGFyZShwZGF0YS0+aWNuY2xrKTsKKwogCWlmIChyc3RjKQogCQlyZXNldF9jb250cm9sX2Fzc2VydChyc3RjKTsKIApAQCAtNDYyLDYgKzQ3Myw3IEBACiAJaWYgKHBkYXRhLT5yc3RjKQogCQlyZXNldF9jb250cm9sX2Fzc2VydChwZGF0YS0+cnN0Yyk7CiAKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocGRhdGEtPmljbmNsayk7CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBsdGZtX2hvc3QtPmNsayk7CiBvdXQ6CiAJcmV0dXJuIHJldDsKQEAgLTQ3NSw2ICs0ODcsNyBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CiAKIAljbGtfcHJlcGFyZV9lbmFibGUocGx0Zm1faG9zdC0+Y2xrKTsKKwljbGtfcHJlcGFyZV9lbmFibGUocGRhdGEtPmljbmNsayk7CiAKIAlpZiAocGRhdGEtPnJzdGMpCiAJCXJlc2V0X2NvbnRyb2xfZGVhc3NlcnQocGRhdGEtPnJzdGMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS10ZWdyYS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS10ZWdyYS5jCmluZGV4IDFlOTNkYzQuLjIwYjZmZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktdGVncmEuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXRlZ3JhLmMKQEAgLTM5MSw2ICszOTEsMzEgQEAKIAkucGRhdGEgPSAmc2RoY2lfdGVncmExMTRfcGRhdGEsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNkaGNpX3BsdGZtX2RhdGEgc2RoY2lfdGVncmExMjRfcGRhdGEgPSB7CisJLnF1aXJrcyA9IFNESENJX1FVSVJLX0JST0tFTl9USU1FT1VUX1ZBTCB8CisJCSAgU0RIQ0lfUVVJUktfREFUQV9USU1FT1VUX1VTRVNfU0RDTEsgfAorCQkgIFNESENJX1FVSVJLX1NJTkdMRV9QT1dFUl9XUklURSB8CisJCSAgU0RIQ0lfUVVJUktfTk9fSElTUERfQklUIHwKKwkJICBTREhDSV9RVUlSS19CUk9LRU5fQURNQV9aRVJPTEVOX0RFU0MgfAorCQkgIFNESENJX1FVSVJLX0NBUF9DTE9DS19CQVNFX0JST0tFTiwKKwkucXVpcmtzMiA9IFNESENJX1FVSVJLMl9QUkVTRVRfVkFMVUVfQlJPS0VOIHwKKwkJICAgLyoKKwkJICAgICogVGhlIFRSTSBzdGF0ZXMgdGhhdCB0aGUgU0QvTU1DIGNvbnRyb2xsZXIgZm91bmQgb24KKwkJICAgICogVGVncmExMjQgY2FuIGFkZHJlc3MgMzQgYml0cyAodGhlIG1heGltdW0gc3VwcG9ydGVkIGJ5CisJCSAgICAqIHRoZSBUZWdyYSBtZW1vcnkgY29udHJvbGxlciksIGJ1dCB0ZXN0cyBzaG93IHRoYXQgRE1BCisJCSAgICAqIHRvIG9yIGZyb20gYWJvdmUgNCBHaUIgZG9lc24ndCB3b3JrLiBUaGlzIGlzIHBvc3NpYmx5CisJCSAgICAqIGNhdXNlZCBieSBtaXNzaW5nIHByb2dyYW1taW5nLCB0aG91Z2ggaXQncyBub3Qgb2J2aW91cworCQkgICAgKiB3aGF0IHNlcXVlbmNlIGlzIHJlcXVpcmVkLiBNYXJrIDY0LWJpdCBETUEgYnJva2VuIGZvcgorCQkgICAgKiBub3cgdG8gZml4IHRoaXMgZm9yIGV4aXN0aW5nIHVzZXJzIChlLmcuIE55YW4gYm9hcmRzKS4KKwkJICAgICovCisJCSAgIFNESENJX1FVSVJLMl9CUk9LRU5fNjRfQklUX0RNQSwKKwkub3BzICA9ICZ0ZWdyYTExNF9zZGhjaV9vcHMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNkaGNpX3RlZ3JhX3NvY19kYXRhIHNvY19kYXRhX3RlZ3JhMTI0ID0geworCS5wZGF0YSA9ICZzZGhjaV90ZWdyYTEyNF9wZGF0YSwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2RoY2lfcGx0Zm1fZGF0YSBzZGhjaV90ZWdyYTIxMF9wZGF0YSA9IHsKIAkucXVpcmtzID0gU0RIQ0lfUVVJUktfQlJPS0VOX1RJTUVPVVRfVkFMIHwKIAkJICBTREhDSV9RVUlSS19EQVRBX1RJTUVPVVRfVVNFU19TRENMSyB8CkBAIC00MDgsNyArNDMzLDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc2RoY2lfdGVncmFfZHRfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIxMC1zZGhjaSIsIC5kYXRhID0gJnNvY19kYXRhX3RlZ3JhMjEwIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmExMjQtc2RoY2kiLCAuZGF0YSA9ICZzb2NfZGF0YV90ZWdyYTExNCB9LAorCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMTI0LXNkaGNpIiwgLmRhdGEgPSAmc29jX2RhdGFfdGVncmExMjQgfSwKIAl7IC5jb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTExNC1zZGhjaSIsIC5kYXRhID0gJnNvY19kYXRhX3RlZ3JhMTE0IH0sCiAJeyAuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEzMC1zZGhjaSIsIC5kYXRhID0gJnNvY19kYXRhX3RlZ3JhMzAgfSwKIAl7IC5jb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLXNkaGNpIiwgLmRhdGEgPSAmc29jX2RhdGFfdGVncmEyMCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5jCmluZGV4IGNkNjVkNDcuLjQ4MDU1NjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmMKQEAgLTg4OCw3ICs4ODgsOCBAQAogc3RhdGljIGlubGluZSBib29sIHNkaGNpX2F1dG9fY21kMTIoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsCiAJCQkJICAgIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQogewotCXJldHVybiAhbXJxLT5zYmMgJiYgKGhvc3QtPmZsYWdzICYgU0RIQ0lfQVVUT19DTUQxMik7CisJcmV0dXJuICFtcnEtPnNiYyAmJiAoaG9zdC0+ZmxhZ3MgJiBTREhDSV9BVVRPX0NNRDEyKSAmJgorCSAgICAgICAhbXJxLT5jYXBfY21kX2R1cmluZ190ZnI7CiB9CiAKIHN0YXRpYyB2b2lkIHNkaGNpX3NldF90cmFuc2Zlcl9tb2RlKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LApAQCAtMTAzMSw5ICsxMDMyLDE4IEBACiAJCQlzZGhjaV9kb19yZXNldChob3N0LCBTREhDSV9SRVNFVF9EQVRBKTsKIAkJfQogCi0JCS8qIEF2b2lkIHRyaWdnZXJpbmcgd2FybmluZyBpbiBzZGhjaV9zZW5kX2NvbW1hbmQoKSAqLwotCQlob3N0LT5jbWQgPSBOVUxMOwotCQlzZGhjaV9zZW5kX2NvbW1hbmQoaG9zdCwgZGF0YS0+c3RvcCk7CisJCS8qCisJCSAqICdjYXBfY21kX2R1cmluZ190ZnInIHJlcXVlc3QgbXVzdCBub3QgdXNlIHRoZSBjb21tYW5kIGxpbmUKKwkJICogYWZ0ZXIgbW1jX2NvbW1hbmRfZG9uZSgpIGhhcyBiZWVuIGNhbGxlZC4gSXQgaXMgdXBwZXIgbGF5ZXIncworCQkgKiByZXNwb25zaWJpbGl0eSB0byBzZW5kIHRoZSBzdG9wIGNvbW1hbmQgaWYgcmVxdWlyZWQuCisJCSAqLworCQlpZiAoZGF0YS0+bXJxLT5jYXBfY21kX2R1cmluZ190ZnIpIHsKKwkJCXNkaGNpX2ZpbmlzaF9tcnEoaG9zdCwgZGF0YS0+bXJxKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEF2b2lkIHRyaWdnZXJpbmcgd2FybmluZyBpbiBzZGhjaV9zZW5kX2NvbW1hbmQoKSAqLworCQkJaG9zdC0+Y21kID0gTlVMTDsKKwkJCXNkaGNpX3NlbmRfY29tbWFuZChob3N0LCBkYXRhLT5zdG9wKTsKKwkJfQogCX0gZWxzZSB7CiAJCXNkaGNpX2ZpbmlzaF9tcnEoaG9zdCwgZGF0YS0+bXJxKTsKIAl9CkBAIC0xMTY1LDYgKzExNzUsOSBAQAogCQl9CiAJfQogCisJaWYgKGNtZC0+bXJxLT5jYXBfY21kX2R1cmluZ190ZnIgJiYgY21kID09IGNtZC0+bXJxLT5jbWQpCisJCW1tY19jb21tYW5kX2RvbmUoaG9zdC0+bW1jLCBjbWQtPm1ycSk7CisKIAkvKgogCSAqIFRoZSBob3N0IGNhbiBzZW5kIGFuZCBpbnRlcnJ1cHQgd2hlbiB0aGUgYnVzeSBzdGF0ZSBoYXMKIAkgKiBlbmRlZCwgYWxsb3dpbmcgdXMgdG8gd2FpdCB3aXRob3V0IHdhc3RpbmcgQ1BVIGN5Y2xlcy4KQEAgLTIwNjIsNyArMjA3NSw3IEBACiAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwogCQkvKiBXYWl0IGZvciBCdWZmZXIgUmVhZCBSZWFkeSBpbnRlcnJ1cHQgKi8KLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaG9zdC0+YnVmX3JlYWR5X2ludCwKKwkJd2FpdF9ldmVudF90aW1lb3V0KGhvc3QtPmJ1Zl9yZWFkeV9pbnQsCiAJCQkJCShob3N0LT50dW5pbmdfZG9uZSA9PSAxKSwKIAkJCQkJbXNlY3NfdG9famlmZmllcyg1MCkpOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5oIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5oCmluZGV4IDA0MTFjOWYuLmM3MjJjZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuaAorKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmgKQEAgLTg0LDYgKzg0LDggQEAKICNkZWZpbmUgICBTREhDSV9DVFJMX0FETUEzMgkweDEwCiAjZGVmaW5lICAgU0RIQ0lfQ1RSTF9BRE1BNjQJMHgxOAogI2RlZmluZSAgIFNESENJX0NUUkxfOEJJVEJVUwkweDIwCisjZGVmaW5lICBTREhDSV9DVFJMX0NEVEVTVF9JTlMJMHg0MAorI2RlZmluZSAgU0RIQ0lfQ1RSTF9DRFRFU1RfRU4JMHg4MAogCiAjZGVmaW5lIFNESENJX1BPV0VSX0NPTlRST0wJMHgyOQogI2RlZmluZSAgU0RIQ0lfUE9XRVJfT04JCTB4MDEKQEAgLTU1NSw3ICs1NTcsNiBAQAogCXZvaWQJKCpzZXRfdWhzX3NpZ25hbGluZykoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIHVuc2lnbmVkIGludCB1aHMpOwogCXZvaWQJKCpod19yZXNldCkoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpOwogCXZvaWQgICAgKCphZG1hX3dvcmthcm91bmQpKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCB1MzIgaW50bWFzayk7Ci0Jdm9pZAkoKnBsYXRmb3JtX2luaXQpKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0KTsKIAl2b2lkICAgICgqY2FyZF9ldmVudCkoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpOwogCXZvaWQJKCp2b2x0YWdlX3N3aXRjaCkoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpOwogCWludAkoKnNlbGVjdF9kcml2ZV9zdHJlbmd0aCkoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NoX21vYmlsZV9zZGhpLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NoX21vYmlsZV9zZGhpLmMKaW5kZXggYzNiNjUxYi4uNDllZGZmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zaF9tb2JpbGVfc2RoaS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2hfbW9iaWxlX3NkaGkuYwpAQCAtOTQsNiArOTQsNyBAQAogCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxzZGhpLXI4YTc3OTMiLCAuZGF0YSA9ICZvZl9yY2FyX2dlbjJfY29tcGF0aWJsZSwgfSwKIAl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMsc2RoaS1yOGE3Nzk0IiwgLmRhdGEgPSAmb2ZfcmNhcl9nZW4yX2NvbXBhdGlibGUsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHNkaGktcjhhNzc5NSIsIC5kYXRhID0gJm9mX3JjYXJfZ2VuM19jb21wYXRpYmxlLCB9LAorCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxzZGhpLXI4YTc3OTYiLCAuZGF0YSA9ICZvZl9yY2FyX2dlbjNfY29tcGF0aWJsZSwgfSwKIAl7fSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzaF9tb2JpbGVfc2RoaV9vZl9tYXRjaCk7CkBAIC0yMTMsNiArMjE0LDEzIEBACiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHByaXYtPmNsayk7CiB9CiAKK3N0YXRpYyBpbnQgc2hfbW9iaWxlX3NkaGlfY2FyZF9idXN5KHN0cnVjdCBtbWNfaG9zdCAqbW1jKQoreworCXN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKKworCXJldHVybiAhKHNkX2N0cmxfcmVhZDE2X2FuZF8xNl9hc18zMihob3N0LCBDVExfU1RBVFVTKSAmIFRNSU9fU1RBVF9EQVQwKTsKK30KKwogc3RhdGljIGludCBzaF9tb2JpbGVfc2RoaV9zdGFydF9zaWduYWxfdm9sdGFnZV9zd2l0Y2goc3RydWN0IG1tY19ob3N0ICptbWMsCiAJCQkJCQkgICAgICBzdHJ1Y3QgbW1jX2lvcyAqaW9zKQogewpAQCAtMzY5LDcgKzM3NywxNCBAQAogCWhvc3QtPmNsa191cGRhdGUJPSBzaF9tb2JpbGVfc2RoaV9jbGtfdXBkYXRlOwogCWhvc3QtPmNsa19kaXNhYmxlCT0gc2hfbW9iaWxlX3NkaGlfY2xrX2Rpc2FibGU7CiAJaG9zdC0+bXVsdGlfaW9fcXVpcmsJPSBzaF9tb2JpbGVfc2RoaV9tdWx0aV9pb19xdWlyazsKLQlob3N0LT5zdGFydF9zaWduYWxfdm9sdGFnZV9zd2l0Y2ggPSBzaF9tb2JpbGVfc2RoaV9zdGFydF9zaWduYWxfdm9sdGFnZV9zd2l0Y2g7CisKKwkvKiBTRFIgc3BlZWRzIGFyZSBvbmx5IGF2YWlsYWJsZSBvbiBHZW4yKyAqLworCWlmIChtbWNfZGF0YS0+ZmxhZ3MgJiBUTUlPX01NQ19NSU5fUkNBUjIpIHsKKwkJLyogY2FyZF9idXN5IGNhdXNlZCBpc3N1ZXMgb24gcjhhNzNhNCAocHJlLUdlbjIpIENELWxlc3MgU0RISSAqLworCQlob3N0LT5jYXJkX2J1c3kJPSBzaF9tb2JpbGVfc2RoaV9jYXJkX2J1c3k7CisJCWhvc3QtPnN0YXJ0X3NpZ25hbF92b2x0YWdlX3N3aXRjaCA9CisJCQlzaF9tb2JpbGVfc2RoaV9zdGFydF9zaWduYWxfdm9sdGFnZV9zd2l0Y2g7CisJfQogCiAJLyogT3JnaW5hbGx5IHJlZ2lzdGVycyB3ZXJlIDE2IGJpdCBhcGFydCwgY291bGQgYmUgMzIgb3IgNjQgbm93YWRheXMgKi8KIAlpZiAoIWhvc3QtPmJ1c19zaGlmdCAmJiByZXNvdXJjZV9zaXplKHJlcykgPiAweDEwMCkgLyogb2xkIHdheSB0byBkZXRlcm1pbmUgdGhlIHNoaWZ0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3N1bnhpLW1tYy5jIGIvZHJpdmVycy9tbWMvaG9zdC9zdW54aS1tbWMuYwppbmRleCAyZWU0YzIxLi5jMGE1YzY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3N1bnhpLW1tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc3VueGktbW1jLmMKQEAgLTcyLDYgKzcyLDEzIEBACiAjZGVmaW5lIFNEWENfUkVHX0NIREEJKDB4OTApCiAjZGVmaW5lIFNEWENfUkVHX0NCREEJKDB4OTQpCiAKKy8qIE5ldyByZWdpc3RlcnMgaW50cm9kdWNlZCBpbiBBNjQgKi8KKyNkZWZpbmUgU0RYQ19SRUdfQTEyQQkJMHgwNTggLyogU01DIEF1dG8gQ29tbWFuZCAxMiBSZWdpc3RlciAqLworI2RlZmluZSBTRFhDX1JFR19TRF9OVFNSCTB4MDVDIC8qIFNNQyBOZXcgVGltaW5nIFNldCBSZWdpc3RlciAqLworI2RlZmluZSBTRFhDX1JFR19EUlZfREwJCTB4MTQwIC8qIERyaXZlIERlbGF5IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0RYQ19SRUdfU0FNUF9ETF9SRUcJMHgxNDQgLyogU01DIHNhbXBsZSBkZWxheSBjb250cm9sICovCisjZGVmaW5lIFNEWENfUkVHX0RTX0RMX1JFRwkweDE0OCAvKiBTTUMgZGF0YSBzdHJvYmUgZGVsYXkgY29udHJvbCAqLworCiAjZGVmaW5lIG1tY19yZWFkbChob3N0LCByZWcpIFwKIAlyZWFkbCgoaG9zdCktPnJlZ19iYXNlICsgU0RYQ18jI3JlZykKICNkZWZpbmUgbW1jX3dyaXRlbChob3N0LCByZWcsIHZhbHVlKSBcCkBAIC0yMTcsMjEgKzIyNCw0MSBAQAogI2RlZmluZSBTRFhDX0NMS181ME1fRERSCTMKICNkZWZpbmUgU0RYQ19DTEtfNTBNX0REUl84QklUCTQKIAorI2RlZmluZSBTRFhDXzJYX1RJTUlOR19NT0RFCUJJVCgzMSkKKworI2RlZmluZSBTRFhDX0NBTF9TVEFSVAkJQklUKDE1KQorI2RlZmluZSBTRFhDX0NBTF9ET05FCQlCSVQoMTQpCisjZGVmaW5lIFNEWENfQ0FMX0RMX1NISUZUCTgKKyNkZWZpbmUgU0RYQ19DQUxfRExfU1dfRU4JQklUKDcpCisjZGVmaW5lIFNEWENfQ0FMX0RMX1NXX1NISUZUCTAKKyNkZWZpbmUgU0RYQ19DQUxfRExfTUFTSwkweDNmCisKKyNkZWZpbmUgU0RYQ19DQUxfVElNRU9VVAkzCS8qIGluIHNlY29uZHMsIDNzIGlzIGVub3VnaCovCisKIHN0cnVjdCBzdW54aV9tbWNfY2xrX2RlbGF5IHsKIAl1MzIgb3V0cHV0OwogCXUzMiBzYW1wbGU7CiB9OwogCiBzdHJ1Y3Qgc3VueGlfaWRtYV9kZXMgewotCXUzMgljb25maWc7Ci0JdTMyCWJ1Zl9zaXplOwotCXUzMglidWZfYWRkcl9wdHIxOwotCXUzMglidWZfYWRkcl9wdHIyOworCV9fbGUzMiBjb25maWc7CisJX19sZTMyIGJ1Zl9zaXplOworCV9fbGUzMiBidWZfYWRkcl9wdHIxOworCV9fbGUzMiBidWZfYWRkcl9wdHIyOworfTsKKworc3RydWN0IHN1bnhpX21tY19jZmcgeworCXUzMiBpZG1hX2Rlc19zaXplX2JpdHM7CisJY29uc3Qgc3RydWN0IHN1bnhpX21tY19jbGtfZGVsYXkgKmNsa19kZWxheXM7CisKKwkvKiBkb2VzIHRoZSBJUCBibG9jayBzdXBwb3J0IGF1dG9jYWxpYnJhdGlvbj8gKi8KKwlib29sIGNhbl9jYWxpYnJhdGU7CiB9OwogCiBzdHJ1Y3Qgc3VueGlfbW1jX2hvc3QgewogCXN0cnVjdCBtbWNfaG9zdAkqbW1jOwogCXN0cnVjdCByZXNldF9jb250cm9sICpyZXNldDsKKwljb25zdCBzdHJ1Y3Qgc3VueGlfbW1jX2NmZyAqY2ZnOwogCiAJLyogSU8gbWFwcGluZyBiYXNlICovCiAJdm9pZCBfX2lvbWVtCSpyZWdfYmFzZTsKQEAgLTI0MSw3ICsyNjgsNiBAQAogCXN0cnVjdCBjbGsJKmNsa19tbWM7CiAJc3RydWN0IGNsawkqY2xrX3NhbXBsZTsKIAlzdHJ1Y3QgY2xrCSpjbGtfb3V0cHV0OwotCWNvbnN0IHN0cnVjdCBzdW54aV9tbWNfY2xrX2RlbGF5ICpjbGtfZGVsYXlzOwogCiAJLyogaXJxICovCiAJc3BpbmxvY2tfdAlsb2NrOwpAQCAtMjUwLDcgKzI3Niw2IEBACiAJdTMyCQlzZGlvX2ltYXNrOwogCiAJLyogZG1hICovCi0JdTMyCQlpZG1hX2Rlc19zaXplX2JpdHM7CiAJZG1hX2FkZHJfdAlzZ19kbWE7CiAJdm9pZAkJKnNnX2NwdTsKIAlib29sCQl3YWl0X2RtYTsKQEAgLTMyMiwyNSArMzQ3LDI4IEBACiB7CiAJc3RydWN0IHN1bnhpX2lkbWFfZGVzICpwZGVzID0gKHN0cnVjdCBzdW54aV9pZG1hX2RlcyAqKWhvc3QtPnNnX2NwdTsKIAlkbWFfYWRkcl90IG5leHRfZGVzYyA9IGhvc3QtPnNnX2RtYTsKLQlpbnQgaSwgbWF4X2xlbiA9ICgxIDw8IGhvc3QtPmlkbWFfZGVzX3NpemVfYml0cyk7CisJaW50IGksIG1heF9sZW4gPSAoMSA8PCBob3N0LT5jZmctPmlkbWFfZGVzX3NpemVfYml0cyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+c2dfbGVuOyBpKyspIHsKLQkJcGRlc1tpXS5jb25maWcgPSBTRFhDX0lETUFDX0RFUzBfQ0ggfCBTRFhDX0lETUFDX0RFUzBfT1dOIHwKLQkJCQkgU0RYQ19JRE1BQ19ERVMwX0RJQzsKKwkJcGRlc1tpXS5jb25maWcgPSBjcHVfdG9fbGUzMihTRFhDX0lETUFDX0RFUzBfQ0ggfAorCQkJCQkgICAgIFNEWENfSURNQUNfREVTMF9PV04gfAorCQkJCQkgICAgIFNEWENfSURNQUNfREVTMF9ESUMpOwogCiAJCWlmIChkYXRhLT5zZ1tpXS5sZW5ndGggPT0gbWF4X2xlbikKIAkJCXBkZXNbaV0uYnVmX3NpemUgPSAwOyAvKiAwID09IG1heF9sZW4gKi8KIAkJZWxzZQotCQkJcGRlc1tpXS5idWZfc2l6ZSA9IGRhdGEtPnNnW2ldLmxlbmd0aDsKKwkJCXBkZXNbaV0uYnVmX3NpemUgPSBjcHVfdG9fbGUzMihkYXRhLT5zZ1tpXS5sZW5ndGgpOwogCiAJCW5leHRfZGVzYyArPSBzaXplb2Yoc3RydWN0IHN1bnhpX2lkbWFfZGVzKTsKLQkJcGRlc1tpXS5idWZfYWRkcl9wdHIxID0gc2dfZG1hX2FkZHJlc3MoJmRhdGEtPnNnW2ldKTsKLQkJcGRlc1tpXS5idWZfYWRkcl9wdHIyID0gKHUzMiluZXh0X2Rlc2M7CisJCXBkZXNbaV0uYnVmX2FkZHJfcHRyMSA9CisJCQljcHVfdG9fbGUzMihzZ19kbWFfYWRkcmVzcygmZGF0YS0+c2dbaV0pKTsKKwkJcGRlc1tpXS5idWZfYWRkcl9wdHIyID0gY3B1X3RvX2xlMzIoKHUzMiluZXh0X2Rlc2MpOwogCX0KIAotCXBkZXNbMF0uY29uZmlnIHw9IFNEWENfSURNQUNfREVTMF9GRDsKLQlwZGVzW2kgLSAxXS5jb25maWcgfD0gU0RYQ19JRE1BQ19ERVMwX0xEIHwgU0RYQ19JRE1BQ19ERVMwX0VSOwotCXBkZXNbaSAtIDFdLmNvbmZpZyAmPSB+U0RYQ19JRE1BQ19ERVMwX0RJQzsKKwlwZGVzWzBdLmNvbmZpZyB8PSBjcHVfdG9fbGUzMihTRFhDX0lETUFDX0RFUzBfRkQpOworCXBkZXNbaSAtIDFdLmNvbmZpZyB8PSBjcHVfdG9fbGUzMihTRFhDX0lETUFDX0RFUzBfTEQgfAorCQkJCQkgIFNEWENfSURNQUNfREVTMF9FUik7CisJcGRlc1tpIC0gMV0uY29uZmlnICY9IGNwdV90b19sZTMyKH5TRFhDX0lETUFDX0RFUzBfRElDKTsKIAlwZGVzW2kgLSAxXS5idWZfYWRkcl9wdHIyID0gMDsKIAogCS8qCkBAIC02NTMsMTEgKzY4MSw4NCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHN1bnhpX21tY19jYWxpYnJhdGUoc3RydWN0IHN1bnhpX21tY19ob3N0ICpob3N0LCBpbnQgcmVnX29mZikKK3sKKwl1MzIgcmVnID0gcmVhZGwoaG9zdC0+cmVnX2Jhc2UgKyByZWdfb2ZmKTsKKwl1MzIgZGVsYXk7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJaWYgKCFob3N0LT5jZmctPmNhbl9jYWxpYnJhdGUpCisJCXJldHVybiAwOworCisJcmVnICY9IH4oU0RYQ19DQUxfRExfTUFTSyA8PCBTRFhDX0NBTF9ETF9TV19TSElGVCk7CisJcmVnICY9IH5TRFhDX0NBTF9ETF9TV19FTjsKKworCXdyaXRlbChyZWcgfCBTRFhDX0NBTF9TVEFSVCwgaG9zdC0+cmVnX2Jhc2UgKyByZWdfb2ZmKTsKKworCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLCAiY2FsaWJyYXRpb24gc3RhcnRlZFxuIik7CisKKwl0aW1lb3V0ID0gamlmZmllcyArIEhaICogU0RYQ19DQUxfVElNRU9VVDsKKworCXdoaWxlICghKChyZWcgPSByZWFkbChob3N0LT5yZWdfYmFzZSArIHJlZ19vZmYpKSAmIFNEWENfQ0FMX0RPTkUpKSB7CisJCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCWNwdV9yZWxheCgpOworCQllbHNlIHsKKwkJCXJlZyAmPSB+U0RYQ19DQUxfU1RBUlQ7CisJCQl3cml0ZWwocmVnLCBob3N0LT5yZWdfYmFzZSArIHJlZ19vZmYpOworCisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCX0KKworCWRlbGF5ID0gKHJlZyA+PiBTRFhDX0NBTF9ETF9TSElGVCkgJiBTRFhDX0NBTF9ETF9NQVNLOworCisJcmVnICY9IH5TRFhDX0NBTF9TVEFSVDsKKwlyZWcgfD0gKGRlbGF5IDw8IFNEWENfQ0FMX0RMX1NXX1NISUZUKSB8IFNEWENfQ0FMX0RMX1NXX0VOOworCisJd3JpdGVsKHJlZywgaG9zdC0+cmVnX2Jhc2UgKyByZWdfb2ZmKTsKKworCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLCAiY2FsaWJyYXRpb24gZW5kZWQsIHJlZyBpcyAweCV4XG4iLCByZWcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3VueGlfbW1jX2Nsa19zZXRfcGhhc2Uoc3RydWN0IHN1bnhpX21tY19ob3N0ICpob3N0LAorCQkJCSAgIHN0cnVjdCBtbWNfaW9zICppb3MsIHUzMiByYXRlKQoreworCWludCBpbmRleDsKKworCWlmICghaG9zdC0+Y2ZnLT5jbGtfZGVsYXlzKQorCQlyZXR1cm4gMDsKKworCS8qIGRldGVybWluZSBkZWxheXMgKi8KKwlpZiAocmF0ZSA8PSA0MDAwMDApIHsKKwkJaW5kZXggPSBTRFhDX0NMS180MDBLOworCX0gZWxzZSBpZiAocmF0ZSA8PSAyNTAwMDAwMCkgeworCQlpbmRleCA9IFNEWENfQ0xLXzI1TTsKKwl9IGVsc2UgaWYgKHJhdGUgPD0gNTIwMDAwMDApIHsKKwkJaWYgKGlvcy0+dGltaW5nICE9IE1NQ19USU1JTkdfVUhTX0REUjUwICYmCisJCSAgICBpb3MtPnRpbWluZyAhPSBNTUNfVElNSU5HX01NQ19ERFI1MikgeworCQkJaW5kZXggPSBTRFhDX0NMS181ME07CisJCX0gZWxzZSBpZiAoaW9zLT5idXNfd2lkdGggPT0gTU1DX0JVU19XSURUSF84KSB7CisJCQlpbmRleCA9IFNEWENfQ0xLXzUwTV9ERFJfOEJJVDsKKwkJfSBlbHNlIHsKKwkJCWluZGV4ID0gU0RYQ19DTEtfNTBNX0REUjsKKwkJfQorCX0gZWxzZSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNsa19zZXRfcGhhc2UoaG9zdC0+Y2xrX3NhbXBsZSwgaG9zdC0+Y2ZnLT5jbGtfZGVsYXlzW2luZGV4XS5zYW1wbGUpOworCWNsa19zZXRfcGhhc2UoaG9zdC0+Y2xrX291dHB1dCwgaG9zdC0+Y2ZnLT5jbGtfZGVsYXlzW2luZGV4XS5vdXRwdXQpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgc3VueGlfbW1jX2Nsa19zZXRfcmF0ZShzdHJ1Y3Qgc3VueGlfbW1jX2hvc3QgKmhvc3QsCiAJCQkJICBzdHJ1Y3QgbW1jX2lvcyAqaW9zKQogewotCXUzMiByYXRlLCBvY2xrX2RseSwgcnZhbCwgc2Nsa19kbHk7Ci0JdTMyIGNsb2NrID0gaW9zLT5jbG9jazsKKwlsb25nIHJhdGU7CisJdTMyIHJ2YWwsIGNsb2NrID0gaW9zLT5jbG9jazsKIAlpbnQgcmV0OwogCiAJLyogOCBiaXQgRERSIHJlcXVpcmVzIGEgaGlnaGVyIG1vZHVsZSBjbG9jayAqLwpAQCAtNjY2LDEzICs3NjcsMTggQEAKIAkJY2xvY2sgPDw9IDE7CiAKIAlyYXRlID0gY2xrX3JvdW5kX3JhdGUoaG9zdC0+Y2xrX21tYywgY2xvY2spOwotCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLCAic2V0dGluZyBjbGsgdG8gJWQsIHJvdW5kZWQgJWRcbiIsCisJaWYgKHJhdGUgPCAwKSB7CisJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLCAiZXJyb3Igcm91bmRpbmcgY2xrIHRvICVkOiAlbGRcbiIsCisJCQljbG9jaywgcmF0ZSk7CisJCXJldHVybiByYXRlOworCX0KKwlkZXZfZGJnKG1tY19kZXYoaG9zdC0+bW1jKSwgInNldHRpbmcgY2xrIHRvICVkLCByb3VuZGVkICVsZFxuIiwKIAkJY2xvY2ssIHJhdGUpOwogCiAJLyogc2V0dGluZyBjbG9jayByYXRlICovCiAJcmV0ID0gY2xrX3NldF9yYXRlKGhvc3QtPmNsa19tbWMsIHJhdGUpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycihtbWNfZGV2KGhvc3QtPm1tYyksICJlcnJvciBzZXR0aW5nIGNsayB0byAlZDogJWRcbiIsCisJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLCAiZXJyb3Igc2V0dGluZyBjbGsgdG8gJWxkOiAlZFxuIiwKIAkJCXJhdGUsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQpAQCAtNjkyLDMxICs3OTgsMTUgQEAKIAl9CiAJbW1jX3dyaXRlbChob3N0LCBSRUdfQ0xLQ1IsIHJ2YWwpOwogCi0JLyogZGV0ZXJtaW5lIGRlbGF5cyAqLwotCWlmIChyYXRlIDw9IDQwMDAwMCkgewotCQlvY2xrX2RseSA9IGhvc3QtPmNsa19kZWxheXNbU0RYQ19DTEtfNDAwS10ub3V0cHV0OwotCQlzY2xrX2RseSA9IGhvc3QtPmNsa19kZWxheXNbU0RYQ19DTEtfNDAwS10uc2FtcGxlOwotCX0gZWxzZSBpZiAocmF0ZSA8PSAyNTAwMDAwMCkgewotCQlvY2xrX2RseSA9IGhvc3QtPmNsa19kZWxheXNbU0RYQ19DTEtfMjVNXS5vdXRwdXQ7Ci0JCXNjbGtfZGx5ID0gaG9zdC0+Y2xrX2RlbGF5c1tTRFhDX0NMS18yNU1dLnNhbXBsZTsKLQl9IGVsc2UgaWYgKHJhdGUgPD0gNTIwMDAwMDApIHsKLQkJaWYgKGlvcy0+dGltaW5nICE9IE1NQ19USU1JTkdfVUhTX0REUjUwICYmCi0JCSAgICBpb3MtPnRpbWluZyAhPSBNTUNfVElNSU5HX01NQ19ERFI1MikgewotCQkJb2Nsa19kbHkgPSBob3N0LT5jbGtfZGVsYXlzW1NEWENfQ0xLXzUwTV0ub3V0cHV0OwotCQkJc2Nsa19kbHkgPSBob3N0LT5jbGtfZGVsYXlzW1NEWENfQ0xLXzUwTV0uc2FtcGxlOwotCQl9IGVsc2UgaWYgKGlvcy0+YnVzX3dpZHRoID09IE1NQ19CVVNfV0lEVEhfOCkgewotCQkJb2Nsa19kbHkgPSBob3N0LT5jbGtfZGVsYXlzW1NEWENfQ0xLXzUwTV9ERFJfOEJJVF0ub3V0cHV0OwotCQkJc2Nsa19kbHkgPSBob3N0LT5jbGtfZGVsYXlzW1NEWENfQ0xLXzUwTV9ERFJfOEJJVF0uc2FtcGxlOwotCQl9IGVsc2UgewotCQkJb2Nsa19kbHkgPSBob3N0LT5jbGtfZGVsYXlzW1NEWENfQ0xLXzUwTV9ERFJdLm91dHB1dDsKLQkJCXNjbGtfZGx5ID0gaG9zdC0+Y2xrX2RlbGF5c1tTRFhDX0NMS181ME1fRERSXS5zYW1wbGU7Ci0JCX0KLQl9IGVsc2UgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJcmV0ID0gc3VueGlfbW1jX2Nsa19zZXRfcGhhc2UoaG9zdCwgaW9zLCByYXRlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCi0JY2xrX3NldF9waGFzZShob3N0LT5jbGtfc2FtcGxlLCBzY2xrX2RseSk7Ci0JY2xrX3NldF9waGFzZShob3N0LT5jbGtfb3V0cHV0LCBvY2xrX2RseSk7CisJcmV0ID0gc3VueGlfbW1jX2NhbGlicmF0ZShob3N0LCBTRFhDX1JFR19TQU1QX0RMX1JFRyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFRPRE86IGVuYWJsZSBjYWxpYnJhdGUgb24gc2RjMiBTRFhDX1JFR19EU19ETF9SRUcgb2YgQTY0ICovCiAKIAlyZXR1cm4gc3VueGlfbW1jX29jbGtfb25vZmYoaG9zdCwgMSk7CiB9CkBAIC05MzgsMTQgKzEwMjgsNiBAQAogCXJldHVybiAhIShtbWNfcmVhZGwoaG9zdCwgUkVHX1NUQVMpICYgU0RYQ19DQVJEX0RBVEFfQlVTWSk7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN1bnhpX21tY19vZl9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC1tbWMiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjVpLWExMy1tbWMiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjlpLWE4MC1tbWMiLCB9LAotCXsgLyogc2VudGluZWwgKi8gfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHN1bnhpX21tY19vZl9tYXRjaCk7Ci0KIHN0YXRpYyBzdHJ1Y3QgbW1jX2hvc3Rfb3BzIHN1bnhpX21tY19vcHMgPSB7CiAJLnJlcXVlc3QJID0gc3VueGlfbW1jX3JlcXVlc3QsCiAJLnNldF9pb3MJID0gc3VueGlfbW1jX3NldF9pb3MsCkBAIC05NzQsMjEgKzEwNTYsNTQgQEAKIAlbU0RYQ19DTEtfNTBNX0REUl84QklUXQk9IHsgLm91dHB1dCA9ICA3MiwgLnNhbXBsZSA9ICA3MiB9LAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBzdW54aV9tbWNfY2ZnIHN1bjRpX2ExMF9jZmcgPSB7CisJLmlkbWFfZGVzX3NpemVfYml0cyA9IDEzLAorCS5jbGtfZGVsYXlzID0gTlVMTCwKKwkuY2FuX2NhbGlicmF0ZSA9IGZhbHNlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdW54aV9tbWNfY2ZnIHN1bjVpX2ExM19jZmcgPSB7CisJLmlkbWFfZGVzX3NpemVfYml0cyA9IDE2LAorCS5jbGtfZGVsYXlzID0gTlVMTCwKKwkuY2FuX2NhbGlicmF0ZSA9IGZhbHNlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdW54aV9tbWNfY2ZnIHN1bjdpX2EyMF9jZmcgPSB7CisJLmlkbWFfZGVzX3NpemVfYml0cyA9IDE2LAorCS5jbGtfZGVsYXlzID0gc3VueGlfbW1jX2Nsa19kZWxheXMsCisJLmNhbl9jYWxpYnJhdGUgPSBmYWxzZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VueGlfbW1jX2NmZyBzdW45aV9hODBfY2ZnID0geworCS5pZG1hX2Rlc19zaXplX2JpdHMgPSAxNiwKKwkuY2xrX2RlbGF5cyA9IHN1bjlpX21tY19jbGtfZGVsYXlzLAorCS5jYW5fY2FsaWJyYXRlID0gZmFsc2UsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHN1bnhpX21tY19jZmcgc3VuNTBpX2E2NF9jZmcgPSB7CisJLmlkbWFfZGVzX3NpemVfYml0cyA9IDE2LAorCS5jbGtfZGVsYXlzID0gTlVMTCwKKwkuY2FuX2NhbGlicmF0ZSA9IHRydWUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzdW54aV9tbWNfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtbW1jIiwgLmRhdGEgPSAmc3VuNGlfYTEwX2NmZyB9LAorCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjVpLWExMy1tbWMiLCAuZGF0YSA9ICZzdW41aV9hMTNfY2ZnIH0sCisJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuN2ktYTIwLW1tYyIsIC5kYXRhID0gJnN1bjdpX2EyMF9jZmcgfSwKKwl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW45aS1hODAtbW1jIiwgLmRhdGEgPSAmc3VuOWlfYTgwX2NmZyB9LAorCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjUwaS1hNjQtbW1jIiwgLmRhdGEgPSAmc3VuNTBpX2E2NF9jZmcgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzdW54aV9tbWNfb2ZfbWF0Y2gpOworCiBzdGF0aWMgaW50IHN1bnhpX21tY19yZXNvdXJjZV9yZXF1ZXN0KHN0cnVjdCBzdW54aV9tbWNfaG9zdCAqaG9zdCwKIAkJCQkgICAgICBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAlpbnQgcmV0OwogCi0JaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiYWxsd2lubmVyLHN1bjRpLWExMC1tbWMiKSkKLQkJaG9zdC0+aWRtYV9kZXNfc2l6ZV9iaXRzID0gMTM7Ci0JZWxzZQotCQlob3N0LT5pZG1hX2Rlc19zaXplX2JpdHMgPSAxNjsKLQotCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImFsbHdpbm5lcixzdW45aS1hODAtbW1jIikpCi0JCWhvc3QtPmNsa19kZWxheXMgPSBzdW45aV9tbWNfY2xrX2RlbGF5czsKLQllbHNlCi0JCWhvc3QtPmNsa19kZWxheXMgPSBzdW54aV9tbWNfY2xrX2RlbGF5czsKKwlob3N0LT5jZmcgPSBvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGEoJnBkZXYtPmRldik7CisJaWYgKCFob3N0LT5jZmcpCisJCXJldHVybiAtRUlOVkFMOwogCiAJcmV0ID0gbW1jX3JlZ3VsYXRvcl9nZXRfc3VwcGx5KGhvc3QtPm1tYyk7CiAJaWYgKHJldCkgewpAQCAtMTAxNCwxNiArMTEyOSwxOCBAQAogCQlyZXR1cm4gUFRSX0VSUihob3N0LT5jbGtfbW1jKTsKIAl9CiAKLQlob3N0LT5jbGtfb3V0cHV0ID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJvdXRwdXQiKTsKLQlpZiAoSVNfRVJSKGhvc3QtPmNsa19vdXRwdXQpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkIG5vdCBnZXQgb3V0cHV0IGNsb2NrXG4iKTsKLQkJcmV0dXJuIFBUUl9FUlIoaG9zdC0+Y2xrX291dHB1dCk7Ci0JfQorCWlmIChob3N0LT5jZmctPmNsa19kZWxheXMpIHsKKwkJaG9zdC0+Y2xrX291dHB1dCA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAib3V0cHV0Iik7CisJCWlmIChJU19FUlIoaG9zdC0+Y2xrX291dHB1dCkpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkIG5vdCBnZXQgb3V0cHV0IGNsb2NrXG4iKTsKKwkJCXJldHVybiBQVFJfRVJSKGhvc3QtPmNsa19vdXRwdXQpOworCQl9CiAKLQlob3N0LT5jbGtfc2FtcGxlID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJzYW1wbGUiKTsKLQlpZiAoSVNfRVJSKGhvc3QtPmNsa19zYW1wbGUpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkIG5vdCBnZXQgc2FtcGxlIGNsb2NrXG4iKTsKLQkJcmV0dXJuIFBUUl9FUlIoaG9zdC0+Y2xrX3NhbXBsZSk7CisJCWhvc3QtPmNsa19zYW1wbGUgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgInNhbXBsZSIpOworCQlpZiAoSVNfRVJSKGhvc3QtPmNsa19zYW1wbGUpKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDb3VsZCBub3QgZ2V0IHNhbXBsZSBjbG9ja1xuIik7CisJCQlyZXR1cm4gUFRSX0VSUihob3N0LT5jbGtfc2FtcGxlKTsKKwkJfQogCX0KIAogCWhvc3QtPnJlc2V0ID0gZGV2bV9yZXNldF9jb250cm9sX2dldF9vcHRpb25hbCgmcGRldi0+ZGV2LCAiYWhiIik7CkBAIC0xMTIwLDE1ICsxMjM3LDE3IEBACiAJbW1jLT5tYXhfYmxrX2NvdW50CT0gODE5MjsKIAltbWMtPm1heF9ibGtfc2l6ZQk9IDQwOTY7CiAJbW1jLT5tYXhfc2VncwkJPSBQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IHN1bnhpX2lkbWFfZGVzKTsKLQltbWMtPm1heF9zZWdfc2l6ZQk9ICgxIDw8IGhvc3QtPmlkbWFfZGVzX3NpemVfYml0cyk7CisJbW1jLT5tYXhfc2VnX3NpemUJPSAoMSA8PCBob3N0LT5jZmctPmlkbWFfZGVzX3NpemVfYml0cyk7CiAJbW1jLT5tYXhfcmVxX3NpemUJPSBtbWMtPm1heF9zZWdfc2l6ZSAqIG1tYy0+bWF4X3NlZ3M7CiAJLyogNDAwa0h6IH4gNTJNSHogKi8KIAltbWMtPmZfbWluCQk9ICAgNDAwMDAwOwogCW1tYy0+Zl9tYXgJCT0gNTIwMDAwMDA7CiAJbW1jLT5jYXBzCSAgICAgICB8PSBNTUNfQ0FQX01NQ19ISUdIU1BFRUQgfCBNTUNfQ0FQX1NEX0hJR0hTUEVFRCB8Ci0JCQkJICBNTUNfQ0FQXzFfOFZfRERSIHwKIAkJCQkgIE1NQ19DQVBfRVJBU0UgfCBNTUNfQ0FQX1NESU9fSVJROwogCisJaWYgKGhvc3QtPmNmZy0+Y2xrX2RlbGF5cykKKwkJbW1jLT5jYXBzICAgICAgfD0gTU1DX0NBUF8xXzhWX0REUjsKKwogCXJldCA9IG1tY19vZl9wYXJzZShtbWMpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfZnJlZV9kbWE7CkBAIC0xMTYwLDYgKzEyNzksOCBAQAogCWlmICghSVNfRVJSKGhvc3QtPnJlc2V0KSkKIAkJcmVzZXRfY29udHJvbF9hc3NlcnQoaG9zdC0+cmVzZXQpOwogCisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGhvc3QtPmNsa19zYW1wbGUpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShob3N0LT5jbGtfb3V0cHV0KTsKIAljbGtfZGlzYWJsZV91bnByZXBhcmUoaG9zdC0+Y2xrX21tYyk7CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGhvc3QtPmNsa19haGIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jLmggYi9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jLmgKaW5kZXggN2Y2M2VjMC4uOGUxMjZhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tYy5oCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWMuaApAQCAtNzksNiArNzksOSBAQAogI2RlZmluZQlDTEtfQ1RMX0RJVl9NQVNLCTB4ZmYKICNkZWZpbmUJQ0xLX0NUTF9TQ0xLRU4JCUJJVCg4KQogCisjZGVmaW5lIENBUkRfT1BUX1dJRFRIOAkJQklUKDEzKQorI2RlZmluZSBDQVJEX09QVF9XSURUSAkJQklUKDE1KQorCiAjZGVmaW5lIFRNSU9fQkJTCQk1MTIJCS8qIEJvb3QgYmxvY2sgc2l6ZSAqLwogCiAvKiBEZWZpbml0aW9ucyBmb3IgdmFsdWVzIHRoZSBDVFJMX1NESU9fU1RBVFVTIHJlZ2lzdGVyIGNhbiB0YWtlLiAqLwpAQCAtMTU4LDYgKzE2MSw3IEBACiAJdm9pZCAoKmNsa19kaXNhYmxlKShzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCk7CiAJaW50ICgqbXVsdGlfaW9fcXVpcmspKHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwKIAkJCSAgICAgIHVuc2lnbmVkIGludCBkaXJlY3Rpb24sIGludCBibGtfc2l6ZSk7CisJaW50ICgqY2FyZF9idXN5KShzdHJ1Y3QgbW1jX2hvc3QgKm1tYyk7CiAJaW50ICgqc3RhcnRfc2lnbmFsX3ZvbHRhZ2Vfc3dpdGNoKShzdHJ1Y3QgbW1jX2hvc3QgKm1tYywKIAkJCQkJICAgc3RydWN0IG1tY19pb3MgKmlvcyk7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tY19waW8uYyBiL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWNfcGlvLmMKaW5kZXggOTI0NjdlZi4uNzAwNTY3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tY19waW8uYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jX3Bpby5jCkBAIC0zMzYsNyArMzM2LDkgQEAKIAogCXN3aXRjaCAobW1jX3Jlc3BfdHlwZShjbWQpKSB7CiAJY2FzZSBNTUNfUlNQX05PTkU6IGMgfD0gUkVTUF9OT05FOyBicmVhazsKLQljYXNlIE1NQ19SU1BfUjE6ICAgYyB8PSBSRVNQX1IxOyAgIGJyZWFrOworCWNhc2UgTU1DX1JTUF9SMToKKwljYXNlIE1NQ19SU1BfUjFfTk9fQ1JDOgorCQkJICAgYyB8PSBSRVNQX1IxOyAgIGJyZWFrOwogCWNhc2UgTU1DX1JTUF9SMUI6ICBjIHw9IFJFU1BfUjFCOyAgYnJlYWs7CiAJY2FzZSBNTUNfUlNQX1IyOiAgIGMgfD0gUkVTUF9SMjsgICBicmVhazsKIAljYXNlIE1NQ19SU1BfUjM6ICAgYyB8PSBSRVNQX1IzOyAgIGJyZWFrOwpAQCAtNzMwLDEyICs3MzIsMTMgQEAKIAlwcl9kZWJ1Zygic2V0dXAgZGF0YSB0cmFuc2ZlcjogYmxvY2tzaXplICUwOHggIG5yX2Jsb2NrcyAlZFxuIiwKIAkJIGRhdGEtPmJsa3N6LCBkYXRhLT5ibG9ja3MpOwogCi0JLyogU29tZSBoYXJkd2FyZSBjYW5ub3QgcGVyZm9ybSAyIGJ5dGUgcmVxdWVzdHMgaW4gNCBiaXQgbW9kZSAqLwotCWlmIChob3N0LT5tbWMtPmlvcy5idXNfd2lkdGggPT0gTU1DX0JVU19XSURUSF80KSB7CisJLyogU29tZSBoYXJkd2FyZSBjYW5ub3QgcGVyZm9ybSAyIGJ5dGUgcmVxdWVzdHMgaW4gNC84IGJpdCBtb2RlICovCisJaWYgKGhvc3QtPm1tYy0+aW9zLmJ1c193aWR0aCA9PSBNTUNfQlVTX1dJRFRIXzQgfHwKKwkgICAgaG9zdC0+bW1jLT5pb3MuYnVzX3dpZHRoID09IE1NQ19CVVNfV0lEVEhfOCkgewogCQlpbnQgYmxrc3pfMmJ5dGVzID0gcGRhdGEtPmZsYWdzICYgVE1JT19NTUNfQkxLU1pfMkJZVEVTOwogCiAJCWlmIChkYXRhLT5ibGtzeiA8IDIgfHwgKGRhdGEtPmJsa3N6IDwgNCAmJiAhYmxrc3pfMmJ5dGVzKSkgewotCQkJcHJfZXJyKCIlczogJWQgYnl0ZSBibG9jayB1bnN1cHBvcnRlZCBpbiA0IGJpdCBtb2RlXG4iLAorCQkJcHJfZXJyKCIlczogJWQgYnl0ZSBibG9jayB1bnN1cHBvcnRlZCBpbiA0LzggYml0IG1vZGVcbiIsCiAJCQkgICAgICAgbW1jX2hvc3RuYW1lKGhvc3QtPm1tYyksIGRhdGEtPmJsa3N6KTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC04NTcsMTQgKzg2MCwxNiBAQAogc3RhdGljIHZvaWQgdG1pb19tbWNfc2V0X2J1c193aWR0aChzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCwKIAkJCQl1bnNpZ25lZCBjaGFyIGJ1c193aWR0aCkKIHsKLQlzd2l0Y2ggKGJ1c193aWR0aCkgewotCWNhc2UgTU1DX0JVU19XSURUSF8xOgotCQlzZF9jdHJsX3dyaXRlMTYoaG9zdCwgQ1RMX1NEX01FTV9DQVJEX09QVCwgMHg4MGUwKTsKLQkJYnJlYWs7Ci0JY2FzZSBNTUNfQlVTX1dJRFRIXzQ6Ci0JCXNkX2N0cmxfd3JpdGUxNihob3N0LCBDVExfU0RfTUVNX0NBUkRfT1BULCAweDAwZTApOwotCQlicmVhazsKLQl9CisJdTE2IHJlZyA9IHNkX2N0cmxfcmVhZDE2KGhvc3QsIENUTF9TRF9NRU1fQ0FSRF9PUFQpCisJCQkJJiB+KENBUkRfT1BUX1dJRFRIIHwgQ0FSRF9PUFRfV0lEVEg4KTsKKworCS8qIHJlZyBub3cgYXBwbGllcyB0byBNTUNfQlVTX1dJRFRIXzQgKi8KKwlpZiAoYnVzX3dpZHRoID09IE1NQ19CVVNfV0lEVEhfMSkKKwkJcmVnIHw9IENBUkRfT1BUX1dJRFRIOworCWVsc2UgaWYgKGJ1c193aWR0aCA9PSBNTUNfQlVTX1dJRFRIXzgpCisJCXJlZyB8PSBDQVJEX09QVF9XSURUSDg7CisKKwlzZF9jdHJsX3dyaXRlMTYoaG9zdCwgQ1RMX1NEX01FTV9DQVJEX09QVCwgcmVnKTsKIH0KIAogLyogU2V0IE1NQyBjbG9jayAvIHBvd2VyLgpAQCAtOTYwLDIwICs5NjUsMTIgQEAKIAlyZXR1cm4gYmxrX3NpemU7CiB9CiAKLXN0YXRpYyBpbnQgdG1pb19tbWNfY2FyZF9idXN5KHN0cnVjdCBtbWNfaG9zdCAqbW1jKQotewotCXN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKLQotCXJldHVybiAhKHNkX2N0cmxfcmVhZDE2X2FuZF8xNl9hc18zMihob3N0LCBDVExfU1RBVFVTKSAmIFRNSU9fU1RBVF9EQVQwKTsKLX0KLQogc3RhdGljIHN0cnVjdCBtbWNfaG9zdF9vcHMgdG1pb19tbWNfb3BzID0gewogCS5yZXF1ZXN0CT0gdG1pb19tbWNfcmVxdWVzdCwKIAkuc2V0X2lvcwk9IHRtaW9fbW1jX3NldF9pb3MsCiAJLmdldF9ybyAgICAgICAgID0gdG1pb19tbWNfZ2V0X3JvLAogCS5nZXRfY2QJCT0gbW1jX2dwaW9fZ2V0X2NkLAogCS5lbmFibGVfc2Rpb19pcnEgPSB0bWlvX21tY19lbmFibGVfc2Rpb19pcnEsCi0JLmNhcmRfYnVzeQk9IHRtaW9fbW1jX2NhcmRfYnVzeSwKIAkubXVsdGlfaW9fcXVpcmsJPSB0bWlvX211bHRpX2lvX3F1aXJrLAogfTsKIApAQCAtMTA3Miw2ICsxMDY5LDcgQEAKIAkJZ290byBob3N0X2ZyZWU7CiAJfQogCisJdG1pb19tbWNfb3BzLmNhcmRfYnVzeSA9IF9ob3N0LT5jYXJkX2J1c3k7CiAJdG1pb19tbWNfb3BzLnN0YXJ0X3NpZ25hbF92b2x0YWdlX3N3aXRjaCA9IF9ob3N0LT5zdGFydF9zaWduYWxfdm9sdGFnZV9zd2l0Y2g7CiAJbW1jLT5vcHMgPSAmdG1pb19tbWNfb3BzOwogCkBAIC0xMDg5LDYgKzEwODcsMTUgQEAKIAkJCQkgICFtbWNfY2FyZF9pc19yZW1vdmFibGUobW1jKSB8fAogCQkJCSAgbW1jLT5zbG90LmNkX2lycSA+PSAwKTsKIAorCS8qCisJICogT24gR2VuMissIGVNTUMgd2l0aCBOT05SRU1PVkFCTEUgY3VycmVudGx5IGZhaWxzIGJlY2F1c2UgbmF0aXZlCisJICogaG90cGx1ZyBnZXRzIGRpc2FibGVkLiBJdCBzZWVtcyBSdW50aW1lUE0gcmVsYXRlZCB5ZXQgd2UgbmVlZCBmdXJ0aGVyCisJICogcmVzZWFyY2guIFNpbmNlIHdlIGFyZSBwbGFubmluZyBhIFBNIG92ZXJoYXVsIGFueXdheSwgbGV0J3MgZW5mb3JjZQorCSAqIGZvciBub3cgdGhlIGRldmljZSBiZWluZyBhY3RpdmUgYnkgZW5hYmxpbmcgbmF0aXZlIGhvdHBsdWcgYWx3YXlzLgorCSAqLworCWlmIChwZGF0YS0+ZmxhZ3MgJiBUTUlPX01NQ19NSU5fUkNBUjIpCisJCV9ob3N0LT5uYXRpdmVfaG90cGx1ZyA9IHRydWU7CisKIAlpZiAodG1pb19tbWNfY2xrX2VuYWJsZShfaG9zdCkgPCAwKSB7CiAJCW1tYy0+Zl9tYXggPSBwZGF0YS0+aGNsazsKIAkJbW1jLT5mX21pbiA9IG1tYy0+Zl9tYXggLyA1MTI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3Z1YjMwMC5jIGIvZHJpdmVycy9tbWMvaG9zdC92dWIzMDAuYwppbmRleCAxZTgxOWY5Li5iYjNlMGQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3Z1YjMwMC5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvdnViMzAwLmMKQEAgLTIxMTYsMTMgKzIxMTYsMTEgQEAKIAljb21tYW5kX291dF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCWlmICghY29tbWFuZF9vdXRfdXJiKSB7CiAJCXJldHZhbCA9IC1FTk9NRU07Ci0JCWRldl9lcnIoJnVkZXYtPmRldiwgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBjb21tYW5kX291dF91cmJcbiIpOwogCQlnb3RvIGVycm9yMDsKIAl9CiAJY29tbWFuZF9yZXNfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNvbW1hbmRfcmVzX3VyYikgewogCQlyZXR2YWwgPSAtRU5PTUVNOwotCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJub3QgZW5vdWdoIG1lbW9yeSBmb3IgY29tbWFuZF9yZXNfdXJiXG4iKTsKIAkJZ290byBlcnJvcjE7CiAJfQogCS8qIHRoaXMgYWxzbyBhbGxvY2F0ZXMgbWVtb3J5IGZvciBvdXIgVlVCMzAwIG1tYyBob3N0IGRldmljZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9kYXZpbmNpX25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvZGF2aW5jaV9uYW5kLmMKaW5kZXggY2MwN2JhMC4uMjdmYThiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9kYXZpbmNpX25hbmQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL2RhdmluY2lfbmFuZC5jCkBAIC0yNDAsNiArMjQwLDkgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiB2YWw7CiAKKwkvKiBSZXNldCBFQ0MgaGFyZHdhcmUgKi8KKwlkYXZpbmNpX25hbmRfcmVhZGwoaW5mbywgTkFORF80QklUX0VDQzFfT0ZGU0VUKTsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZkYXZpbmNpX25hbmRfbG9jaywgZmxhZ3MpOwogCiAJLyogU3RhcnQgNC1iaXQgRUNDIGNhbGN1bGF0aW9uIGZvciByZWFkL3dyaXRlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL210a19lY2MuYyBiL2RyaXZlcnMvbXRkL25hbmQvbXRrX2VjYy5jCmluZGV4IDI1YTRmYmQuLmQ1NGY2NjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvbXRrX2VjYy5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvbXRrX2VjYy5jCkBAIC0zNjYsNyArMzY2LDggQEAKIAkJICAgdTggKmRhdGEsIHUzMiBieXRlcykKIHsKIAlkbWFfYWRkcl90IGFkZHI7Ci0JdTMyICpwLCBsZW4sIGk7CisJdTggKnA7CisJdTMyIGxlbiwgaSwgdmFsOwogCWludCByZXQgPSAwOwogCiAJYWRkciA9IGRtYV9tYXBfc2luZ2xlKGVjYy0+ZGV2LCBkYXRhLCBieXRlcywgRE1BX1RPX0RFVklDRSk7CkBAIC0zOTIsMTEgKzM5MywxNCBAQAogCiAJLyogUHJvZ3JhbSBFQ0MgYnl0ZXMgdG8gT09COiBwZXIgc2VjdG9yIG9vYiA9IEZETSArIEVDQyArIFNQQVJFICovCiAJbGVuID0gKGNvbmZpZy0+c3RyZW5ndGggKiBFQ0NfUEFSSVRZX0JJVFMgKyA3KSA+PiAzOwotCXAgPSAodTMyICopKGRhdGEgKyBieXRlcyk7CisJcCA9IGRhdGEgKyBieXRlczsKIAogCS8qIHdyaXRlIHRoZSBwYXJpdHkgYnl0ZXMgZ2VuZXJhdGVkIGJ5IHRoZSBFQ0MgYmFjayB0byB0aGUgT09CIHJlZ2lvbiAqLwotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJcFtpXSA9IHJlYWRsKGVjYy0+cmVncyArIEVDQ19FTkNQQVIoaSkpOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpZiAoKGkgJSA0KSA9PSAwKQorCQkJdmFsID0gcmVhZGwoZWNjLT5yZWdzICsgRUNDX0VOQ1BBUihpIC8gNCkpOworCQlwW2ldID0gKHZhbCA+PiAoKGkgJSA0KSAqIDgpKSAmIDB4ZmY7CisJfQogdGltZW91dDoKIAogCWRtYV91bm1hcF9zaW5nbGUoZWNjLT5kZXYsIGFkZHIsIGJ5dGVzLCBETUFfVE9fREVWSUNFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvbXRrX25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvbXRrX25hbmQuYwppbmRleCBkZGFhMmFjLi41MjIzYTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL210a19uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9tdGtfbmFuZC5jCkBAIC05Myw2ICs5Myw5IEBACiAjZGVmaW5lCQlORklfRlNNX01BU0sJCSgweGYgPDwgMTYpCiAjZGVmaW5lIE5GSV9BRERSQ05UUgkJKDB4NzApCiAjZGVmaW5lCQlDTlRSX01BU0sJCUdFTk1BU0soMTYsIDEyKQorI2RlZmluZQkJQUREUkNOVFJfU0VDX1NISUZUCSgxMikKKyNkZWZpbmUJCUFERFJDTlRSX1NFQyh2YWwpIFwKKwkJKCgodmFsKSAmIENOVFJfTUFTSykgPj4gQUREUkNOVFJfU0VDX1NISUZUKQogI2RlZmluZSBORklfU1RSQUREUgkJKDB4ODApCiAjZGVmaW5lIE5GSV9CWVRFTEVOCQkoMHg4NCkKICNkZWZpbmUgTkZJX0NTRUwJCSgweDkwKQpAQCAtNjk5LDcgKzcwMiw3IEBACiAJfQogCiAJcmV0ID0gcmVhZGxfcG9sbF90aW1lb3V0X2F0b21pYyhuZmMtPnJlZ3MgKyBORklfQUREUkNOVFIsIHJlZywKLQkJCQkJKHJlZyAmIENOVFJfTUFTSykgPj0gY2hpcC0+ZWNjLnN0ZXBzLAorCQkJCQlBRERSQ05UUl9TRUMocmVnKSA+PSBjaGlwLT5lY2Muc3RlcHMsCiAJCQkJCTEwLCBNVEtfVElNRU9VVCk7CiAJaWYgKHJldCkKIAkJZGV2X2VycihkZXYsICJod2VjYyB3cml0ZSB0aW1lb3V0XG4iKTsKQEAgLTkwMiw3ICs5MDUsNyBAQAogCQlkZXZfd2FybihuZmMtPmRldiwgInJlYWQgYWhiL2RtYSBkb25lIHRpbWVvdXRcbiIpOwogCiAJcmMgPSByZWFkbF9wb2xsX3RpbWVvdXRfYXRvbWljKG5mYy0+cmVncyArIE5GSV9CWVRFTEVOLCByZWcsCi0JCQkJICAgICAgIChyZWcgJiBDTlRSX01BU0spID49IHNlY3RvcnMsIDEwLAorCQkJCSAgICAgICBBRERSQ05UUl9TRUMocmVnKSA+PSBzZWN0b3JzLCAxMCwKIAkJCQkgICAgICAgTVRLX1RJTUVPVVQpOwogCWlmIChyYyA8IDApIHsKIAkJZGV2X2VycihuZmMtPmRldiwgInN1YnBhZ2UgZG9uZSB0aW1lb3V0XG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvbXhjX25hbmQuYyBiL2RyaXZlcnMvbXRkL25hbmQvbXhjX25hbmQuYwppbmRleCA1MTczZmFkLi41N2NiZTJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL214Y19uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9teGNfbmFuZC5jCkBAIC05NDMsNyArOTQzLDcgQEAKIAlzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kX2NoaXAgPSBtdGRfdG9fbmFuZChtdGQpOwogCWludCBzdGVwc2l6ZSA9IG5hbmRfY2hpcC0+ZWNjLmJ5dGVzID09IDkgPyAxNiA6IDI2OwogCi0JaWYgKHNlY3Rpb24gPiBuYW5kX2NoaXAtPmVjYy5zdGVwcykKKwlpZiAoc2VjdGlvbiA+PSBuYW5kX2NoaXAtPmVjYy5zdGVwcykKIAkJcmV0dXJuIC1FUkFOR0U7CiAKIAlpZiAoIXNlY3Rpb24pIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvb21hcDIuYyBiL2RyaXZlcnMvbXRkL25hbmQvb21hcDIuYwppbmRleCBhNTkzNjFjLi41NTEzYmZkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9vbWFwMi5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvb21hcDIuYwpAQCAtMjE2OSw3ICsyMTY5LDcgQEAKIAlyZXR1cm4gMDsKIAogcmV0dXJuX2Vycm9yOgotCWlmIChpbmZvLT5kbWEpCisJaWYgKCFJU19FUlJfT1JfTlVMTChpbmZvLT5kbWEpKQogCQlkbWFfcmVsZWFzZV9jaGFubmVsKGluZm8tPmRtYSk7CiAJaWYgKG5hbmRfY2hpcC0+ZWNjLnByaXYpIHsKIAkJbmFuZF9iY2hfZnJlZShuYW5kX2NoaXAtPmVjYy5wcml2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L0tjb25maWcgYi9kcml2ZXJzL25ldC9LY29uZmlnCmluZGV4IDBjNTQxNWIuLjk1YzMyZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvS2NvbmZpZwpAQCAtMTQ5LDYgKzE0OSw4IEBACiAgICAgdHJpc3RhdGUgIklQLVZMQU4gc3VwcG9ydCIKICAgICBkZXBlbmRzIG9uIElORVQKICAgICBkZXBlbmRzIG9uIElQVjYKKyAgICBkZXBlbmRzIG9uIE5FVEZJTFRFUgorICAgIGRlcGVuZHMgb24gTkVUX0wzX01BU1RFUl9ERVYKICAgICAtLS1oZWxwLS0tCiAgICAgICBUaGlzIGFsbG93cyBvbmUgdG8gY3JlYXRlIHZpcnR1YWwgZGV2aWNlcyBvZmYgb2YgYSBtYWluIGludGVyZmFjZQogICAgICAgYW5kIHBhY2tldHMgd2lsbCBiZSBkZWxpdmVyZWQgYmFzZWQgb24gdGhlIGRlc3QgTDMgKElQdjYvSVB2NCBhZGRyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKaW5kZXggMWYyNzZmYS4uM2YzMWNhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCkBAIC0xNTIsNyArMTUyLDcgQEAKIE1PRFVMRV9QQVJNX0RFU0MobGFjcF9yYXRlLCAiTEFDUERVIHR4IHJhdGUgdG8gcmVxdWVzdCBmcm9tIDgwMi4zYWQgcGFydG5lcjsgIgogCQkJICAgICIwIGZvciBzbG93LCAxIGZvciBmYXN0Iik7CiBtb2R1bGVfcGFyYW0oYWRfc2VsZWN0LCBjaGFycCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGFkX3NlbGVjdCwgIjgwMy5hZCBhZ2dyZWdhdGlvbiBzZWxlY3Rpb24gbG9naWM7ICIKK01PRFVMRV9QQVJNX0RFU0MoYWRfc2VsZWN0LCAiODAyLjNhZCBhZ2dyZWdhdGlvbiBzZWxlY3Rpb24gbG9naWM7ICIKIAkJCSAgICAiMCBmb3Igc3RhYmxlIChkZWZhdWx0KSwgMSBmb3IgYmFuZHdpZHRoLCAiCiAJCQkgICAgIjIgZm9yIGNvdW50Iik7CiBtb2R1bGVfcGFyYW0obWluX2xpbmtzLCBpbnQsIDApOwpAQCAtMTM0MSw5ICsxMzQxLDEwIEBACiAJCQkgICAgc2xhdmVfZGV2LT5uYW1lKTsKIAl9CiAKLQkvKiBhbHJlYWR5IGVuc2xhdmVkICovCi0JaWYgKHNsYXZlX2Rldi0+ZmxhZ3MgJiBJRkZfU0xBVkUpIHsKLQkJbmV0ZGV2X2RiZyhib25kX2RldiwgIkVycm9yOiBEZXZpY2Ugd2FzIGFscmVhZHkgZW5zbGF2ZWRcbiIpOworCS8qIGFscmVhZHkgaW4tdXNlPyAqLworCWlmIChuZXRkZXZfaXNfcnhfaGFuZGxlcl9idXN5KHNsYXZlX2RldikpIHsKKwkJbmV0ZGV2X2Vycihib25kX2RldiwKKwkJCSAgICJFcnJvcjogRGV2aWNlIGlzIGluIHVzZSBhbmQgY2Fubm90IGJlIGVuc2xhdmVkXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKQEAgLTQ2MjcsNyArNDYyOCw3IEBACiAKIAluZXRkZXZfZGJnKGJvbmRfZGV2LCAiQmVnaW4gYm9uZF9pbml0XG4iKTsKIAotCWJvbmQtPndxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoYm9uZF9kZXYtPm5hbWUpOworCWJvbmQtPndxID0gYWxsb2Nfb3JkZXJlZF93b3JrcXVldWUoYm9uZF9kZXYtPm5hbWUsIFdRX01FTV9SRUNMQUlNKTsKIAlpZiAoIWJvbmQtPndxKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL2Rldi5jIGIvZHJpdmVycy9uZXQvY2FuL2Rldi5jCmluZGV4IGUyMWY3Y2MuLjhkNjIwOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi9kZXYuYworKysgYi9kcml2ZXJzL25ldC9jYW4vZGV2LmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvY2FuLmg+CiAjaW5jbHVkZSA8bGludXgvY2FuL2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2Nhbi9za2IuaD4KQEAgLTUwMSw5ICs1MDIsOCBAQAogLyoKICAqIENBTiBkZXZpY2UgcmVzdGFydCBmb3IgYnVzLW9mZiByZWNvdmVyeQogICovCi1zdGF0aWMgdm9pZCBjYW5fcmVzdGFydCh1bnNpZ25lZCBsb25nIGRhdGEpCitzdGF0aWMgdm9pZCBjYW5fcmVzdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhOwogCXN0cnVjdCBjYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmRldi0+c3RhdHM7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTU0Myw2ICs1NDMsMTQgQEAKIAkJbmV0ZGV2X2VycihkZXYsICJFcnJvciAlZCBkdXJpbmcgcmVzdGFydCIsIGVycik7CiB9CiAKK3N0YXRpYyB2b2lkIGNhbl9yZXN0YXJ0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gdG9fZGVsYXllZF93b3JrKHdvcmspOworCXN0cnVjdCBjYW5fcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IGNhbl9wcml2LCByZXN0YXJ0X3dvcmspOworCisJY2FuX3Jlc3RhcnQocHJpdi0+ZGV2KTsKK30KKwogaW50IGNhbl9yZXN0YXJ0X25vdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBjYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CkBAIC01NTYsOCArNTY0LDggQEAKIAlpZiAocHJpdi0+c3RhdGUgIT0gQ0FOX1NUQVRFX0JVU19PRkYpCiAJCXJldHVybiAtRUJVU1k7CiAKLQkvKiBSdW5zIGFzIHNvb24gYXMgcG9zc2libGUgaW4gdGhlIHRpbWVyIGNvbnRleHQgKi8KLQltb2RfdGltZXIoJnByaXYtPnJlc3RhcnRfdGltZXIsIGppZmZpZXMpOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHJpdi0+cmVzdGFydF93b3JrKTsKKwljYW5fcmVzdGFydChkZXYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01NzgsOCArNTg2LDggQEAKIAluZXRpZl9jYXJyaWVyX29mZihkZXYpOwogCiAJaWYgKHByaXYtPnJlc3RhcnRfbXMpCi0JCW1vZF90aW1lcigmcHJpdi0+cmVzdGFydF90aW1lciwKLQkJCSAgamlmZmllcyArIChwcml2LT5yZXN0YXJ0X21zICogSFopIC8gMTAwMCk7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+cmVzdGFydF93b3JrLAorCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMocHJpdi0+cmVzdGFydF9tcykpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY2FuX2J1c19vZmYpOwogCkBAIC02ODgsNiArNjk2LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwcml2LT5kZXYgPSBkZXY7CiAKIAlpZiAoZWNob19za2JfbWF4KSB7CiAJCXByaXYtPmVjaG9fc2tiX21heCA9IGVjaG9fc2tiX21heDsKQEAgLTY5Nyw3ICs3MDYsNyBAQAogCiAJcHJpdi0+c3RhdGUgPSBDQU5fU1RBVEVfU1RPUFBFRDsKIAotCWluaXRfdGltZXIoJnByaXYtPnJlc3RhcnRfdGltZXIpOworCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5yZXN0YXJ0X3dvcmssIGNhbl9yZXN0YXJ0X3dvcmspOwogCiAJcmV0dXJuIGRldjsKIH0KQEAgLTc3OCw4ICs3ODcsNiBAQAogCWlmICghbmV0aWZfY2Fycmllcl9vayhkZXYpKQogCQluZXRpZl9jYXJyaWVyX29uKGRldik7CiAKLQlzZXR1cF90aW1lcigmcHJpdi0+cmVzdGFydF90aW1lciwgY2FuX3Jlc3RhcnQsICh1bnNpZ25lZCBsb25nKWRldik7Ci0KIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9wZW5fY2FuZGV2KTsKQEAgLTc5NCw3ICs4MDEsNyBAQAogewogCXN0cnVjdCBjYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAKLQlkZWxfdGltZXJfc3luYygmcHJpdi0+cmVzdGFydF90aW1lcik7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwcml2LT5yZXN0YXJ0X3dvcmspOwogCWNhbl9mbHVzaF9lY2hvX3NrYihkZXYpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY2xvc2VfY2FuZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9mbGV4Y2FuLmMgYi9kcml2ZXJzL25ldC9jYW4vZmxleGNhbi5jCmluZGV4IDQxYzBmYzkuLjE2ZjdjYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi9mbGV4Y2FuLmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL2ZsZXhjYW4uYwpAQCAtMTI2OCwxMSArMTI2OCwxMCBAQAogCXN0cnVjdCBmbGV4Y2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBlcnI7CiAKLQllcnIgPSBmbGV4Y2FuX2NoaXBfZGlzYWJsZShwcml2KTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCiAJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQllcnIgPSBmbGV4Y2FuX2NoaXBfZGlzYWJsZShwcml2KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIAkJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOwogCX0KQEAgLTEyODUsMTMgKzEyODQsMTcgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CiAJc3RydWN0IGZsZXhjYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVycjsKIAogCXByaXYtPmNhbi5zdGF0ZSA9IENBTl9TVEFURV9FUlJPUl9BQ1RJVkU7CiAJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgewogCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CiAJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCWVyciA9IGZsZXhjYW5fY2hpcF9lbmFibGUocHJpdik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KLQlyZXR1cm4gZmxleGNhbl9jaGlwX2VuYWJsZShwcml2KTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGZsZXhjYW5fcG1fb3BzLCBmbGV4Y2FuX3N1c3BlbmQsIGZsZXhjYW5fcmVzdW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9pZmlfY2FuZmQvaWZpX2NhbmZkLmMgYi9kcml2ZXJzL25ldC9jYW4vaWZpX2NhbmZkL2lmaV9jYW5mZC5jCmluZGV4IDJkMWQyMmUuLjM2OGJiMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi9pZmlfY2FuZmQvaWZpX2NhbmZkLmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL2lmaV9jYW5mZC9pZmlfY2FuZmQuYwpAQCAtODEsNiArODEsMTAgQEAKICNkZWZpbmUgSUZJX0NBTkZEX1RJTUVfU0VUX1RJTUVBXzRfMTJfNl82CUJJVCgxNSkKIAogI2RlZmluZSBJRklfQ0FORkRfVERFTEFZCQkJMHgxYworI2RlZmluZSBJRklfQ0FORkRfVERFTEFZX0RFRkFVTFQJCTB4YgorI2RlZmluZSBJRklfQ0FORkRfVERFTEFZX01BU0sJCQkweDNmZmYKKyNkZWZpbmUgSUZJX0NBTkZEX1RERUxBWV9BQlMJCQlCSVQoMTQpCisjZGVmaW5lIElGSV9DQU5GRF9UREVMQVlfRU4JCQlCSVQoMTUpCiAKICNkZWZpbmUgSUZJX0NBTkZEX0VSUk9SCQkJCTB4MjAKICNkZWZpbmUgSUZJX0NBTkZEX0VSUk9SX1RYX09GRlNFVAkJMApAQCAtNjQxLDcgKzY0NSw3IEBACiAJc3RydWN0IGlmaV9jYW5mZF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJY29uc3Qgc3RydWN0IGNhbl9iaXR0aW1pbmcgKmJ0ID0gJnByaXYtPmNhbi5iaXR0aW1pbmc7CiAJY29uc3Qgc3RydWN0IGNhbl9iaXR0aW1pbmcgKmRidCA9ICZwcml2LT5jYW4uZGF0YV9iaXR0aW1pbmc7Ci0JdTE2IGJycCwgc2p3LCB0c2VnMSwgdHNlZzI7CisJdTE2IGJycCwgc2p3LCB0c2VnMSwgdHNlZzIsIHRkYzsKIAogCS8qIENvbmZpZ3VyZSBiaXQgdGltaW5nICovCiAJYnJwID0gYnQtPmJycCAtIDI7CkBAIC02NjQsNiArNjY4LDExIEBACiAJICAgICAgIChicnAgPDwgSUZJX0NBTkZEX1RJTUVfUFJFU0NBTEVfT0ZGKSB8CiAJICAgICAgIChzancgPDwgSUZJX0NBTkZEX1RJTUVfU0pXX09GRl83XzlfOF84KSwKIAkgICAgICAgcHJpdi0+YmFzZSArIElGSV9DQU5GRF9GVElNRSk7CisKKwkvKiBDb25maWd1cmUgdHJhbnNtaXR0ZXIgZGVsYXkgKi8KKwl0ZGMgPSAoZGJ0LT5icnAgKiAoZGJ0LT5waGFzZV9zZWcxICsgMSkpICYgSUZJX0NBTkZEX1RERUxBWV9NQVNLOworCXdyaXRlbChJRklfQ0FORkRfVERFTEFZX0VOIHwgSUZJX0NBTkZEX1RERUxBWV9BQlMgfCB0ZGMsCisJICAgICAgIHByaXYtPmJhc2UgKyBJRklfQ0FORkRfVERFTEFZKTsKIH0KIAogc3RhdGljIHZvaWQgaWZpX2NhbmZkX3NldF9maWx0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIGNvbnN0IHUzMiBpZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi91c2IvZW1zX3VzYi5jIGIvZHJpdmVycy9uZXQvY2FuL3VzYi9lbXNfdXNiLmMKaW5kZXggNzFmMGU3OS4uYjNkMDI3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL3VzYi9lbXNfdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL3VzYi9lbXNfdXNiLmMKQEAgLTYwMCw3ICs2MDAsNiBAQAogCQkvKiBjcmVhdGUgYSBVUkIsIGFuZCBhIGJ1ZmZlciBmb3IgaXQgKi8KIAkJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpIHsKLQkJCW5ldGRldl9lcnIobmV0ZGV2LCAiTm8gbWVtb3J5IGxlZnQgZm9yIFVSQnNcbiIpOwogCQkJZXJyID0gLUVOT01FTTsKIAkJCWJyZWFrOwogCQl9CkBAIC03NTIsMTAgKzc1MSw4IEBACiAKIAkvKiBjcmVhdGUgYSBVUkIsIGFuZCBhIGJ1ZmZlciBmb3IgaXQsIGFuZCBjb3B5IHRoZSBkYXRhIHRvIHRoZSBVUkIgKi8KIAl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOwotCWlmICghdXJiKSB7Ci0JCW5ldGRldl9lcnIobmV0ZGV2LCAiTm8gbWVtb3J5IGxlZnQgZm9yIFVSQnNcbiIpOworCWlmICghdXJiKQogCQlnb3RvIG5vbWVtOwotCX0KIAogCWJ1ZiA9IHVzYl9hbGxvY19jb2hlcmVudChkZXYtPnVkZXYsIHNpemUsIEdGUF9BVE9NSUMsICZ1cmItPnRyYW5zZmVyX2RtYSk7CiAJaWYgKCFidWYpIHsKQEAgLTEwMDcsMTAgKzEwMDQsOCBAQAogCQlkZXYtPnR4X2NvbnRleHRzW2ldLmVjaG9faW5kZXggPSBNQVhfVFhfVVJCUzsKIAogCWRldi0+aW50cl91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghZGV2LT5pbnRyX3VyYikgewotCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvYyBpbnRyIFVSQlxuIik7CisJaWYgKCFkZXYtPmludHJfdXJiKQogCQlnb3RvIGNsZWFudXBfY2FuZGV2OwotCX0KIAogCWRldi0+aW50cl9pbl9idWZmZXIgPSBremFsbG9jKElOVFJfSU5fQlVGRkVSX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghZGV2LT5pbnRyX2luX2J1ZmZlcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi91c2IvZXNkX3VzYjIuYyBiL2RyaXZlcnMvbmV0L2Nhbi91c2IvZXNkX3VzYjIuYwppbmRleCA3ODRhOTAwLi5iZTkyOGNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vdXNiL2VzZF91c2IyLmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL3VzYi9lc2RfdXNiMi5jCkBAIC01NTgsOCArNTU4LDYgQEAKIAkJLyogY3JlYXRlIGEgVVJCLCBhbmQgYSBidWZmZXIgZm9yIGl0ICovCiAJCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdXJiKSB7Ci0JCQlkZXZfd2FybihkZXYtPnVkZXYtPmRldi5wYXJlbnQsCi0JCQkJICJObyBtZW1vcnkgbGVmdCBmb3IgVVJCc1xuIik7CiAJCQllcnIgPSAtRU5PTUVNOwogCQkJYnJlYWs7CiAJCX0KQEAgLTczMCw3ICs3MjgsNiBAQAogCS8qIGNyZWF0ZSBhIFVSQiwgYW5kIGEgYnVmZmVyIGZvciBpdCwgYW5kIGNvcHkgdGhlIGRhdGEgdG8gdGhlIFVSQiAqLwogCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CiAJaWYgKCF1cmIpIHsKLQkJbmV0ZGV2X2VycihuZXRkZXYsICJObyBtZW1vcnkgbGVmdCBmb3IgVVJCc1xuIik7CiAJCXN0YXRzLT50eF9kcm9wcGVkKys7CiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJZ290byBub3VyYm1lbTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi91c2IvZ3NfdXNiLmMgYi9kcml2ZXJzL25ldC9jYW4vdXNiL2dzX3VzYi5jCmluZGV4IDZmMGNiYzMuLjc3ZTNjYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi91c2IvZ3NfdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL3VzYi9nc191c2IuYwpAQCAtNDkzLDEwICs0OTMsOCBAQAogCiAJLyogY3JlYXRlIGEgVVJCLCBhbmQgYSBidWZmZXIgZm9yIGl0ICovCiAJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXVyYikgewotCQluZXRkZXZfZXJyKG5ldGRldiwgIk5vIG1lbW9yeSBsZWZ0IGZvciBVUkJcbiIpOworCWlmICghdXJiKQogCQlnb3RvIG5vbWVtX3VyYjsKLQl9CiAKIAloZiA9IHVzYl9hbGxvY19jb2hlcmVudChkZXYtPnVkZXYsIHNpemVvZigqaGYpLCBHRlBfQVRPTUlDLAogCQkJCSZ1cmItPnRyYW5zZmVyX2RtYSk7CkBAIC02MDAsMTEgKzU5OCw4IEBACiAKIAkJCS8qIGFsbG9jIHJ4IHVyYiAqLwogCQkJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQkJCWlmICghdXJiKSB7Ci0JCQkJbmV0ZGV2X2VycihuZXRkZXYsCi0JCQkJCSAgICJObyBtZW1vcnkgbGVmdCBmb3IgVVJCXG4iKTsKKwkJCWlmICghdXJiKQogCQkJCXJldHVybiAtRU5PTUVNOwotCQkJfQogCiAJCQkvKiBhbGxvYyByeCBidWZmZXIgKi8KIAkJCWJ1ZiA9IHVzYl9hbGxvY19jb2hlcmVudChkZXYtPnVkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vdXNiL2t2YXNlcl91c2IuYyBiL2RyaXZlcnMvbmV0L2Nhbi91c2Iva3Zhc2VyX3VzYi5jCmluZGV4IDZmMWYzYjYuLmQ1MWUwYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi91c2Iva3Zhc2VyX3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi91c2Iva3Zhc2VyX3VzYi5jCkBAIC03ODcsMTAgKzc4Nyw4IEBACiAJaW50IGVycjsKIAogCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7Ci0JaWYgKCF1cmIpIHsKLQkJbmV0ZGV2X2VycihuZXRkZXYsICJObyBtZW1vcnkgbGVmdCBmb3IgVVJCc1xuIik7CisJaWYgKCF1cmIpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWJ1ZiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBrdmFzZXJfbXNnKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFidWYpIHsKQEAgLTEzOTMsOCArMTM5MSw2IEBACiAKIAkJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpIHsKLQkJCWRldl93YXJuKGRldi0+dWRldi0+ZGV2LnBhcmVudCwKLQkJCQkgIk5vIG1lbW9yeSBsZWZ0IGZvciBVUkJzXG4iKTsKIAkJCWVyciA9IC1FTk9NRU07CiAJCQlicmVhazsKIAkJfQpAQCAtMTY3MCw3ICsxNjY2LDYgQEAKIAogCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CiAJaWYgKCF1cmIpIHsKLQkJbmV0ZGV2X2VycihuZXRkZXYsICJObyBtZW1vcnkgbGVmdCBmb3IgVVJCc1xuIik7CiAJCXN0YXRzLT50eF9kcm9wcGVkKys7CiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIE5FVERFVl9UWF9PSzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi91c2IvcGVha191c2IvcGNhbl91c2JfY29yZS5jIGIvZHJpdmVycy9uZXQvY2FuL3VzYi9wZWFrX3VzYi9wY2FuX3VzYl9jb3JlLmMKaW5kZXggYmZiOTFkOC4uYzA2MzgyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL3VzYi9wZWFrX3VzYi9wY2FuX3VzYl9jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL3VzYi9wZWFrX3VzYi9wY2FuX3VzYl9jb3JlLmMKQEAgLTM5OSw3ICszOTksNiBAQAogCQkvKiBjcmVhdGUgYSBVUkIsIGFuZCBhIGJ1ZmZlciBmb3IgaXQsIHRvIHJlY2VpdmUgdXNiIG1lc3NhZ2VzICovCiAJCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdXJiKSB7Ci0JCQluZXRkZXZfZXJyKG5ldGRldiwgIk5vIG1lbW9yeSBsZWZ0IGZvciBVUkJzXG4iKTsKIAkJCWVyciA9IC1FTk9NRU07CiAJCQlicmVhazsKIAkJfQpAQCAtNDU0LDcgKzQ1Myw2IEBACiAJCS8qIGNyZWF0ZSBhIFVSQiBhbmQgYSBidWZmZXIgZm9yIGl0LCB0byB0cmFuc21pdCB1c2IgbWVzc2FnZXMgKi8KIAkJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpIHsKLQkJCW5ldGRldl9lcnIobmV0ZGV2LCAiTm8gbWVtb3J5IGxlZnQgZm9yIFVSQnNcbiIpOwogCQkJZXJyID0gLUVOT01FTTsKIAkJCWJyZWFrOwogCQl9CkBAIC02NTEsMTAgKzY0OSw4IEBACiAKIAkvKiBmaXJzdCBhbGxvY2F0ZSBhIHVyYiB0byBoYW5kbGUgdGhlIGFzeW5jaHJvbm91cyBzdGVwcyAqLwogCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7Ci0JaWYgKCF1cmIpIHsKLQkJbmV0ZGV2X2VycihkZXYtPm5ldGRldiwgIm5vIG1lbW9yeSBsZWZ0IGZvciB1cmJcbiIpOworCWlmICghdXJiKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAkvKiBhbHNvIGFsbG9jYXRlIGVub3VnaCBzcGFjZSBmb3IgdGhlIGNvbW1hbmRzIHRvIHNlbmQgKi8KIAlidWYgPSBrbWFsbG9jKFBDQU5fVVNCX01BWF9DTURfTEVOLCBHRlBfQVRPTUlDKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi91c2IvdXNiXzhkZXYuYyBiL2RyaXZlcnMvbmV0L2Nhbi91c2IvdXNiXzhkZXYuYwppbmRleCBhNzMxNzIwLi4xMDhhMzBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vdXNiL3VzYl84ZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL3VzYi91c2JfOGRldi5jCkBAIC02MjMsMTAgKzYyMyw4IEBACiAKIAkvKiBjcmVhdGUgYSBVUkIsIGFuZCBhIGJ1ZmZlciBmb3IgaXQsIGFuZCBjb3B5IHRoZSBkYXRhIHRvIHRoZSBVUkIgKi8KIAl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOwotCWlmICghdXJiKSB7Ci0JCW5ldGRldl9lcnIobmV0ZGV2LCAiTm8gbWVtb3J5IGxlZnQgZm9yIFVSQnNcbiIpOworCWlmICghdXJiKQogCQlnb3RvIG5vbWVtOwotCX0KIAogCWJ1ZiA9IHVzYl9hbGxvY19jb2hlcmVudChwcml2LT51ZGV2LCBzaXplLCBHRlBfQVRPTUlDLAogCQkJCSAmdXJiLT50cmFuc2Zlcl9kbWEpOwpAQCAtNzQ4LDcgKzc0Niw2IEBACiAJCS8qIGNyZWF0ZSBhIFVSQiwgYW5kIGEgYnVmZmVyIGZvciBpdCAqLwogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCQlpZiAoIXVyYikgewotCQkJbmV0ZGV2X2VycihuZXRkZXYsICJObyBtZW1vcnkgbGVmdCBmb3IgVVJCc1xuIik7CiAJCQllcnIgPSAtRU5PTUVNOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9LY29uZmlnIGIvZHJpdmVycy9uZXQvZHNhL0tjb25maWcKaW5kZXggOGY0NTQ0My4uMDY1OTg0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvZHNhL0tjb25maWcKQEAgLTE2LDYgKzE2LDcgQEAKIAlzZWxlY3QgRklYRURfUEhZCiAJc2VsZWN0IEJDTTdYWFhfUEhZCiAJc2VsZWN0IE1ESU9fQkNNX1VOSU1BQworCXNlbGVjdCBCNTMKIAktLS1oZWxwLS0tCiAJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIEJyb2FkY29tIFN0YXJmaWdodGVyIDIgRXRoZXJuZXQKIAkgIHN3aXRjaCBjaGlwcy4KQEAgLTI0LDQgKzI1LDEzIEBACiAKIHNvdXJjZSAiZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC9LY29uZmlnIgogCitjb25maWcgTkVUX0RTQV9RQ0E4SworCXRyaXN0YXRlICJRdWFsY29tbSBBdGhlcm9zIFFDQThLIEV0aGVybmV0IHN3aXRjaCBmYW1pbHkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9EU0EKKwlzZWxlY3QgTkVUX0RTQV9UQUdfUUNBCisJc2VsZWN0IFJFR01BUAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgUXVhbGNvbW0gQXRoZXJvcyBRQ0E4SyBFdGhlcm5ldAorCSAgc3dpdGNoIGNoaXBzLgorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9kc2EvTWFrZWZpbGUKaW5kZXggY2ExZTcxYi4uODM0NmU0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9NYWtlZmlsZQpAQCAtMSw1ICsxLDYgQEAKIG9iai0kKENPTkZJR19ORVRfRFNBX01WODhFNjA2MCkgKz0gbXY4OGU2MDYwLm8KIG9iai0kKENPTkZJR19ORVRfRFNBX0JDTV9TRjIpCSs9IGJjbV9zZjIubworb2JqLSQoQ09ORklHX05FVF9EU0FfUUNBOEspCSs9IHFjYThrLm8KIAogb2JqLXkJCQkJKz0gYjUzLwogb2JqLXkJCQkJKz0gbXY4OGU2eHh4LwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL2I1My9iNTNfY29tbW9uLmMgYi9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19jb21tb24uYwppbmRleCBiZGEzN2QzLi43NzE3YjE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19jb21tb24uYworKysgYi9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19jb21tb24uYwpAQCAtMTY3LDYgKzE2Nyw2NSBAQAogCiAjZGVmaW5lIEI1M19NSUJTX1NJWkUJQVJSQVlfU0laRShiNTNfbWlicykKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBiNTNfbWliX2Rlc2MgYjUzX21pYnNfNTh4eFtdID0geworCXsgOCwgMHgwMCwgIlR4T2N0ZXRzIiB9LAorCXsgNCwgMHgwOCwgIlR4RHJvcFBrdHMiIH0sCisJeyA0LCAweDBjLCAiVHhRUEtUUTAiIH0sCisJeyA0LCAweDEwLCAiVHhCcm9hZGNhc3RQa3RzIiB9LAorCXsgNCwgMHgxNCwgIlR4TXVsdGljYXN0UGt0cyIgfSwKKwl7IDQsIDB4MTgsICJUeFVuaWNhc3RQS3RzIiB9LAorCXsgNCwgMHgxYywgIlR4Q29sbGlzaW9ucyIgfSwKKwl7IDQsIDB4MjAsICJUeFNpbmdsZUNvbGxpc2lvbiIgfSwKKwl7IDQsIDB4MjQsICJUeE11bHRpcGxlQ29sbGlzaW9uIiB9LAorCXsgNCwgMHgyOCwgIlR4RGVmZXJyZWRDb2xsaXNpb24iIH0sCisJeyA0LCAweDJjLCAiVHhMYXRlQ29sbGlzaW9uIiB9LAorCXsgNCwgMHgzMCwgIlR4RXhjZXNzaXZlQ29sbGlzaW9uIiB9LAorCXsgNCwgMHgzNCwgIlR4RnJhbWVJbkRpc2MiIH0sCisJeyA0LCAweDM4LCAiVHhQYXVzZVBrdHMiIH0sCisJeyA0LCAweDNjLCAiVHhRUEtUUTEiIH0sCisJeyA0LCAweDQwLCAiVHhRUEtUUTIiIH0sCisJeyA0LCAweDQ0LCAiVHhRUEtUUTMiIH0sCisJeyA0LCAweDQ4LCAiVHhRUEtUUTQiIH0sCisJeyA0LCAweDRjLCAiVHhRUEtUUTUiIH0sCisJeyA4LCAweDUwLCAiUnhPY3RldHMiIH0sCisJeyA0LCAweDU4LCAiUnhVbmRlcnNpemVQa3RzIiB9LAorCXsgNCwgMHg1YywgIlJ4UGF1c2VQa3RzIiB9LAorCXsgNCwgMHg2MCwgIlJ4UGt0czY0T2N0ZXRzIiB9LAorCXsgNCwgMHg2NCwgIlJ4UGt0czY1dG8xMjdPY3RldHMiIH0sCisJeyA0LCAweDY4LCAiUnhQa3RzMTI4dG8yNTVPY3RldHMiIH0sCisJeyA0LCAweDZjLCAiUnhQa3RzMjU2dG81MTFPY3RldHMiIH0sCisJeyA0LCAweDcwLCAiUnhQa3RzNTEydG8xMDIzT2N0ZXRzIiB9LAorCXsgNCwgMHg3NCwgIlJ4UGt0czEwMjR0b01heFBrdHNPY3RldHMiIH0sCisJeyA0LCAweDc4LCAiUnhPdmVyc2l6ZVBrdHMiIH0sCisJeyA0LCAweDdjLCAiUnhKYWJiZXJzIiB9LAorCXsgNCwgMHg4MCwgIlJ4QWxpZ25tZW50RXJyb3JzIiB9LAorCXsgNCwgMHg4NCwgIlJ4RkNTRXJyb3JzIiB9LAorCXsgOCwgMHg4OCwgIlJ4R29vZE9jdGV0cyIgfSwKKwl7IDQsIDB4OTAsICJSeERyb3BQa3RzIiB9LAorCXsgNCwgMHg5NCwgIlJ4VW5pY2FzdFBrdHMiIH0sCisJeyA0LCAweDk4LCAiUnhNdWx0aWNhc3RQa3RzIiB9LAorCXsgNCwgMHg5YywgIlJ4QnJvYWRjYXN0UGt0cyIgfSwKKwl7IDQsIDB4YTAsICJSeFNBQ2hhbmdlcyIgfSwKKwl7IDQsIDB4YTQsICJSeEZyYWdtZW50cyIgfSwKKwl7IDQsIDB4YTgsICJSeEp1bWJvUGt0IiB9LAorCXsgNCwgMHhhYywgIlJ4U3ltYmxFcnIiIH0sCisJeyA0LCAweGIwLCAiSW5SYW5nZUVyckNvdW50IiB9LAorCXsgNCwgMHhiNCwgIk91dFJhbmdlRXJyQ291bnQiIH0sCisJeyA0LCAweGI4LCAiRUVFTHBpRXZlbnQiIH0sCisJeyA0LCAweGJjLCAiRUVFTHBpRHVyYXRpb24iIH0sCisJeyA0LCAweGMwLCAiUnhEaXNjYXJkIiB9LAorCXsgNCwgMHhjOCwgIlR4UVBLVFE2IiB9LAorCXsgNCwgMHhjYywgIlR4UVBLVFE3IiB9LAorCXsgNCwgMHhkMCwgIlR4UGt0czY0T2N0ZXRzIiB9LAorCXsgNCwgMHhkNCwgIlR4UGt0czY1dG8xMjdPY3RldHMiIH0sCisJeyA0LCAweGQ4LCAiVHhQa3RzMTI4dG8yNTVPY3RldHMiIH0sCisJeyA0LCAweGRjLCAiVHhQa3RzMjU2dG81MTFPY2V0cyIgfSwKKwl7IDQsIDB4ZTAsICJUeFBrdHM1MTJ0bzEwMjNPY2V0cyIgfSwKKwl7IDQsIDB4ZTQsICJUeFBrdHMxMDI0dG9NYXhQa3RPY2V0cyIgfSwKK307CisKKyNkZWZpbmUgQjUzX01JQlNfNThYWF9TSVpFCUFSUkFZX1NJWkUoYjUzX21pYnNfNTh4eCkKKwogc3RhdGljIGludCBiNTNfZG9fdmxhbl9vcChzdHJ1Y3QgYjUzX2RldmljZSAqZGV2LCB1OCBvcCkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKQEAgLTQxOCw3ICs0NzcsNyBAQAogCiBzdGF0aWMgdm9pZCBiNTNfaW1wX3ZsYW5fc2V0dXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgY3B1X3BvcnQpCiB7Ci0Jc3RydWN0IGI1M19kZXZpY2UgKmRldiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiNTNfZGV2aWNlICpkZXYgPSBkcy0+cHJpdjsKIAl1bnNpZ25lZCBpbnQgaTsKIAl1MTYgcHZsYW47CiAKQEAgLTQzNiw3ICs0OTUsNyBAQAogc3RhdGljIGludCBiNTNfZW5hYmxlX3BvcnQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAkJCSAgIHN0cnVjdCBwaHlfZGV2aWNlICpwaHkpCiB7Ci0Jc3RydWN0IGI1M19kZXZpY2UgKmRldiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiNTNfZGV2aWNlICpkZXYgPSBkcy0+cHJpdjsKIAl1bnNpZ25lZCBpbnQgY3B1X3BvcnQgPSBkZXYtPmNwdV9wb3J0OwogCXUxNiBwdmxhbjsKIApAQCAtNDYxLDcgKzUyMCw3IEBACiBzdGF0aWMgdm9pZCBiNTNfZGlzYWJsZV9wb3J0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCQkgICAgIHN0cnVjdCBwaHlfZGV2aWNlICpwaHkpCiB7Ci0Jc3RydWN0IGI1M19kZXZpY2UgKmRldiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiNTNfZGV2aWNlICpkZXYgPSBkcy0+cHJpdjsKIAl1OCByZWc7CiAKIAkvKiBEaXNhYmxlIFR4L1J4IGZvciB0aGUgcG9ydCAqLwpAQCAtNTcwLDcgKzYyOSw3IEBACiAKIHN0YXRpYyBpbnQgYjUzX3BoeV9yZWFkMTYoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgYWRkciwgaW50IHJlZykKIHsKLQlzdHJ1Y3QgYjUzX2RldmljZSAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiNTNfZGV2aWNlICpwcml2ID0gZHMtPnByaXY7CiAJdTE2IHZhbHVlID0gMDsKIAlpbnQgcmV0OwogCkBAIC01ODUsNyArNjQ0LDcgQEAKIAogc3RhdGljIGludCBiNTNfcGh5X3dyaXRlMTYoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgYWRkciwgaW50IHJlZywgdTE2IHZhbCkKIHsKLQlzdHJ1Y3QgYjUzX2RldmljZSAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiNTNfZGV2aWNlICpwcml2ID0gZHMtPnByaXY7CiAKIAlpZiAocHJpdi0+b3BzLT5waHlfd3JpdGUxNikKIAkJcmV0dXJuIHByaXYtPm9wcy0+cGh5X3dyaXRlMTYocHJpdiwgYWRkciwgcmVnLCB2YWwpOwpAQCAtNjM1LDYgKzY5NCw4IEBACiAJCXJldHVybiBiNTNfbWlic182NTsKIAllbHNlIGlmIChpczYzeHgoZGV2KSkKIAkJcmV0dXJuIGI1M19taWJzXzYzeHg7CisJZWxzZSBpZiAoaXM1OHh4KGRldikpCisJCXJldHVybiBiNTNfbWlic181OHh4OwogCWVsc2UKIAkJcmV0dXJuIGI1M19taWJzOwogfQpAQCAtNjQ1LDEzICs3MDYsMTUgQEAKIAkJcmV0dXJuIEI1M19NSUJTXzY1X1NJWkU7CiAJZWxzZSBpZiAoaXM2M3h4KGRldikpCiAJCXJldHVybiBCNTNfTUlCU182M1hYX1NJWkU7CisJZWxzZSBpZiAoaXM1OHh4KGRldikpCisJCXJldHVybiBCNTNfTUlCU181OFhYX1NJWkU7CiAJZWxzZQogCQlyZXR1cm4gQjUzX01JQlNfU0laRTsKIH0KIAogc3RhdGljIHZvaWQgYjUzX2dldF9zdHJpbmdzKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIHVpbnQ4X3QgKmRhdGEpCiB7Ci0Jc3RydWN0IGI1M19kZXZpY2UgKmRldiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiNTNfZGV2aWNlICpkZXYgPSBkcy0+cHJpdjsKIAljb25zdCBzdHJ1Y3QgYjUzX21pYl9kZXNjICptaWJzID0gYjUzX2dldF9taWIoZGV2KTsKIAl1bnNpZ25lZCBpbnQgbWliX3NpemUgPSBiNTNfZ2V0X21pYl9zaXplKGRldik7CiAJdW5zaWduZWQgaW50IGk7CkBAIC02NjQsNyArNzI3LDcgQEAKIHN0YXRpYyB2b2lkIGI1M19nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJCSAgdWludDY0X3QgKmRhdGEpCiB7Ci0Jc3RydWN0IGI1M19kZXZpY2UgKmRldiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiNTNfZGV2aWNlICpkZXYgPSBkcy0+cHJpdjsKIAljb25zdCBzdHJ1Y3QgYjUzX21pYl9kZXNjICptaWJzID0gYjUzX2dldF9taWIoZGV2KTsKIAl1bnNpZ25lZCBpbnQgbWliX3NpemUgPSBiNTNfZ2V0X21pYl9zaXplKGRldik7CiAJY29uc3Qgc3RydWN0IGI1M19taWJfZGVzYyAqczsKQEAgLTY5NiwxOSArNzU5LDE0IEBACiAKIHN0YXRpYyBpbnQgYjUzX2dldF9zc2V0X2NvdW50KHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKIHsKLQlzdHJ1Y3QgYjUzX2RldmljZSAqZGV2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGI1M19kZXZpY2UgKmRldiA9IGRzLT5wcml2OwogCiAJcmV0dXJuIGI1M19nZXRfbWliX3NpemUoZGV2KTsKIH0KIAotc3RhdGljIGludCBiNTNfc2V0X2FkZHIoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCB1OCAqYWRkcikKLXsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBiNTNfc2V0dXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQogewotCXN0cnVjdCBiNTNfZGV2aWNlICpkZXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYjUzX2RldmljZSAqZGV2ID0gZHMtPnByaXY7CiAJdW5zaWduZWQgaW50IHBvcnQ7CiAJaW50IHJldDsKIApAQCAtNzM5LDcgKzc5Nyw3IEBACiBzdGF0aWMgdm9pZCBiNTNfYWRqdXN0X2xpbmsoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAkJCSAgICBzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQogewotCXN0cnVjdCBiNTNfZGV2aWNlICpkZXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYjUzX2RldmljZSAqZGV2ID0gZHMtPnByaXY7CiAJdTggcmdtaWlfY3RybCA9IDAsIHJlZyA9IDAsIG9mZjsKIAogCWlmICghcGh5X2lzX3BzZXVkb19maXhlZF9saW5rKHBoeWRldikpCkBAIC04NzMsNyArOTMxLDcgQEAKIAkJCSAgICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X3ZsYW4gKnZsYW4sCiAJCQkgICAgc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpCiB7Ci0Jc3RydWN0IGI1M19kZXZpY2UgKmRldiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiNTNfZGV2aWNlICpkZXYgPSBkcy0+cHJpdjsKIAogCWlmICgoaXM1MzI1KGRldikgfHwgaXM1MzY1KGRldikpICYmIHZsYW4tPnZpZF9iZWdpbiA9PSAwKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CkBAIC04OTAsNyArOTQ4LDcgQEAKIAkJCSBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X3ZsYW4gKnZsYW4sCiAJCQkgc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpCiB7Ci0Jc3RydWN0IGI1M19kZXZpY2UgKmRldiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiNTNfZGV2aWNlICpkZXYgPSBkcy0+cHJpdjsKIAlib29sIHVudGFnZ2VkID0gdmxhbi0+ZmxhZ3MgJiBCUklER0VfVkxBTl9JTkZPX1VOVEFHR0VEOwogCWJvb2wgcHZpZCA9IHZsYW4tPmZsYWdzICYgQlJJREdFX1ZMQU5fSU5GT19QVklEOwogCXVuc2lnbmVkIGludCBjcHVfcG9ydCA9IGRldi0+Y3B1X3BvcnQ7CkBAIC05MjQsNyArOTgyLDcgQEAKIHN0YXRpYyBpbnQgYjUzX3ZsYW5fZGVsKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCQljb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X3ZsYW4gKnZsYW4pCiB7Ci0Jc3RydWN0IGI1M19kZXZpY2UgKmRldiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiNTNfZGV2aWNlICpkZXYgPSBkcy0+cHJpdjsKIAlib29sIHVudGFnZ2VkID0gdmxhbi0+ZmxhZ3MgJiBCUklER0VfVkxBTl9JTkZPX1VOVEFHR0VEOwogCXVuc2lnbmVkIGludCBjcHVfcG9ydCA9IGRldi0+Y3B1X3BvcnQ7CiAJc3RydWN0IGI1M192bGFuICp2bDsKQEAgLTk3MCw3ICsxMDI4LDcgQEAKIAkJCSBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X3ZsYW4gKnZsYW4sCiAJCQkgaW50ICgqY2IpKHN0cnVjdCBzd2l0Y2hkZXZfb2JqICpvYmopKQogewotCXN0cnVjdCBiNTNfZGV2aWNlICpkZXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYjUzX2RldmljZSAqZGV2ID0gZHMtPnByaXY7CiAJdTE2IHZpZCwgdmlkX3N0YXJ0ID0gMCwgcHZpZDsKIAlzdHJ1Y3QgYjUzX3ZsYW4gKnZsOwogCWludCBlcnIgPSAwOwpAQCAtMTEyOSw3ICsxMTg3LDcgQEAKIAkJCSAgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfZmRiICpmZGIsCiAJCQkgICBzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zICp0cmFucykKIHsKLQlzdHJ1Y3QgYjUzX2RldmljZSAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiNTNfZGV2aWNlICpwcml2ID0gZHMtPnByaXY7CiAKIAkvKiA1MzI1IGFuZCA1MzY1IHJlcXVpcmUgc29tZSBtb3JlIG1hc3NhZ2luZywgYnV0IGNvdWxkCiAJICogYmUgc3VwcG9ydGVkIGV2ZW50dWFsbHkKQEAgLTExNDQsNyArMTIwMiw3IEBACiAJCQljb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X2ZkYiAqZmRiLAogCQkJc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpCiB7Ci0Jc3RydWN0IGI1M19kZXZpY2UgKnByaXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYjUzX2RldmljZSAqcHJpdiA9IGRzLT5wcml2OwogCiAJaWYgKGI1M19hcmxfb3AocHJpdiwgMCwgcG9ydCwgZmRiLT5hZGRyLCBmZGItPnZpZCwgdHJ1ZSkpCiAJCXByX2VycigiJXM6IGZhaWxlZCB0byBhZGQgTUFDIGFkZHJlc3NcbiIsIF9fZnVuY19fKTsKQEAgLTExNTMsNyArMTIxMSw3IEBACiBzdGF0aWMgaW50IGI1M19mZGJfZGVsKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X2ZkYiAqZmRiKQogewotCXN0cnVjdCBiNTNfZGV2aWNlICpwcml2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGI1M19kZXZpY2UgKnByaXYgPSBkcy0+cHJpdjsKIAogCXJldHVybiBiNTNfYXJsX29wKHByaXYsIDAsIHBvcnQsIGZkYi0+YWRkciwgZmRiLT52aWQsIGZhbHNlKTsKIH0KQEAgLTEyMTIsNyArMTI3MCw3IEBACiAJCQlzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X2ZkYiAqZmRiLAogCQkJaW50ICgqY2IpKHN0cnVjdCBzd2l0Y2hkZXZfb2JqICpvYmopKQogewotCXN0cnVjdCBiNTNfZGV2aWNlICpwcml2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGI1M19kZXZpY2UgKnByaXYgPSBkcy0+cHJpdjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHMtPnBvcnRzW3BvcnRdLm5ldGRldjsKIAlzdHJ1Y3QgYjUzX2FybF9lbnRyeSByZXN1bHRzWzJdOwogCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CkBAIC0xMjUxLDEwICsxMzA5LDIyIEBACiBzdGF0aWMgaW50IGI1M19icl9qb2luKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqYnJpZGdlKQogewotCXN0cnVjdCBiNTNfZGV2aWNlICpkZXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYjUzX2RldmljZSAqZGV2ID0gZHMtPnByaXY7CisJczggY3B1X3BvcnQgPSBkcy0+ZHN0LT5jcHVfcG9ydDsKIAl1MTYgcHZsYW4sIHJlZzsKIAl1bnNpZ25lZCBpbnQgaTsKIAorCS8qIE1ha2UgdGhpcyBwb3J0IGxlYXZlIHRoZSBhbGwgVkxBTnMgam9pbiBzaW5jZSB3ZSB3aWxsIGhhdmUgcHJvcGVyCisJICogVkxBTiBlbnRyaWVzIGZyb20gbm93IG9uCisJICovCisJaWYgKGlzNTh4eChkZXYpKSB7CisJCWI1M19yZWFkMTYoZGV2LCBCNTNfVkxBTl9QQUdFLCBCNTNfSk9JTl9BTExfVkxBTl9FTiwgJnJlZyk7CisJCXJlZyAmPSB+QklUKHBvcnQpOworCQlpZiAoKHJlZyAmIEJJVChjcHVfcG9ydCkpID09IEJJVChjcHVfcG9ydCkpCisJCQlyZWcgJj0gfkJJVChjcHVfcG9ydCk7CisJCWI1M193cml0ZTE2KGRldiwgQjUzX1ZMQU5fUEFHRSwgQjUzX0pPSU5fQUxMX1ZMQU5fRU4sIHJlZyk7CisJfQorCiAJZGV2LT5wb3J0c1twb3J0XS5icmlkZ2VfZGV2ID0gYnJpZGdlOwogCWI1M19yZWFkMTYoZGV2LCBCNTNfUFZMQU5fUEFHRSwgQjUzX1BWTEFOX1BPUlRfTUFTSyhwb3J0KSwgJnB2bGFuKTsKIApAQCAtMTI4NCw5ICsxMzU0LDEwIEBACiAKIHN0YXRpYyB2b2lkIGI1M19icl9sZWF2ZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0KQogewotCXN0cnVjdCBiNTNfZGV2aWNlICpkZXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYjUzX2RldmljZSAqZGV2ID0gZHMtPnByaXY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmJyaWRnZSA9IGRldi0+cG9ydHNbcG9ydF0uYnJpZGdlX2RldjsKIAlzdHJ1Y3QgYjUzX3ZsYW4gKnZsID0gJmRldi0+dmxhbnNbMF07CisJczggY3B1X3BvcnQgPSBkcy0+ZHN0LT5jcHVfcG9ydDsKIAl1bnNpZ25lZCBpbnQgaTsKIAl1MTYgcHZsYW4sIHJlZywgcHZpZDsKIApAQCAtMTMxNiwyMiArMTM4NywyNyBAQAogCWVsc2UKIAkJcHZpZCA9IDA7CiAKLQliNTNfZ2V0X3ZsYW5fZW50cnkoZGV2LCBwdmlkLCB2bCk7Ci0JdmwtPm1lbWJlcnMgfD0gQklUKHBvcnQpIHwgQklUKGRldi0+Y3B1X3BvcnQpOwotCXZsLT51bnRhZyB8PSBCSVQocG9ydCkgfCBCSVQoZGV2LT5jcHVfcG9ydCk7Ci0JYjUzX3NldF92bGFuX2VudHJ5KGRldiwgcHZpZCwgdmwpOworCS8qIE1ha2UgdGhpcyBwb3J0IGpvaW4gYWxsIFZMQU5zIHdpdGhvdXQgVkxBTiBlbnRyaWVzICovCisJaWYgKGlzNTh4eChkZXYpKSB7CisJCWI1M19yZWFkMTYoZGV2LCBCNTNfVkxBTl9QQUdFLCBCNTNfSk9JTl9BTExfVkxBTl9FTiwgJnJlZyk7CisJCXJlZyB8PSBCSVQocG9ydCk7CisJCWlmICghKHJlZyAmIEJJVChjcHVfcG9ydCkpKQorCQkJcmVnIHw9IEJJVChjcHVfcG9ydCk7CisJCWI1M193cml0ZTE2KGRldiwgQjUzX1ZMQU5fUEFHRSwgQjUzX0pPSU5fQUxMX1ZMQU5fRU4sIHJlZyk7CisJfSBlbHNlIHsKKwkJYjUzX2dldF92bGFuX2VudHJ5KGRldiwgcHZpZCwgdmwpOworCQl2bC0+bWVtYmVycyB8PSBCSVQocG9ydCkgfCBCSVQoZGV2LT5jcHVfcG9ydCk7CisJCXZsLT51bnRhZyB8PSBCSVQocG9ydCkgfCBCSVQoZGV2LT5jcHVfcG9ydCk7CisJCWI1M19zZXRfdmxhbl9lbnRyeShkZXYsIHB2aWQsIHZsKTsKKwl9CiB9CiAKLXN0YXRpYyB2b2lkIGI1M19icl9zZXRfc3RwX3N0YXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCi0JCQkJIHU4IHN0YXRlKQorc3RhdGljIHZvaWQgYjUzX2JyX3NldF9zdHBfc3RhdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwgdTggc3RhdGUpCiB7Ci0Jc3RydWN0IGI1M19kZXZpY2UgKmRldiA9IGRzX3RvX3ByaXYoZHMpOwotCXU4IGh3X3N0YXRlLCBjdXJfaHdfc3RhdGU7CisJc3RydWN0IGI1M19kZXZpY2UgKmRldiA9IGRzLT5wcml2OworCXU4IGh3X3N0YXRlOwogCXU4IHJlZzsKIAotCWI1M19yZWFkOChkZXYsIEI1M19DVFJMX1BBR0UsIEI1M19QT1JUX0NUUkwocG9ydCksICZyZWcpOwotCWN1cl9od19zdGF0ZSA9IHJlZyAmIFBPUlRfQ1RSTF9TVFBfU1RBVEVfTUFTSzsKLQogCXN3aXRjaCAoc3RhdGUpIHsKIAljYXNlIEJSX1NUQVRFX0RJU0FCTEVEOgogCQlod19zdGF0ZSA9IFBPUlRfQ1RSTF9ESVNfU1RBVEU7CkBAIC0xMzUzLDMwICsxNDI5LDI4IEBACiAJCXJldHVybjsKIAl9CiAKLQkvKiBGYXN0LWFnZSBBUkwgZW50cmllcyBpZiB3ZSBhcmUgbW92aW5nIGEgcG9ydCBmcm9tIExlYXJuaW5nIG9yCi0JICogRm9yd2FyZGluZyAoY3VyX2h3X3N0YXRlKSBzdGF0ZSB0byBEaXNhYmxlZCwgQmxvY2tpbmcgb3IgTGlzdGVuaW5nCi0JICogc3RhdGUgKGh3X3N0YXRlKQotCSAqLwotCWlmIChjdXJfaHdfc3RhdGUgIT0gaHdfc3RhdGUpIHsKLQkJaWYgKGN1cl9od19zdGF0ZSA+PSBQT1JUX0NUUkxfTEVBUk5fU1RBVEUgJiYKLQkJICAgIGh3X3N0YXRlIDw9IFBPUlRfQ1RSTF9MSVNURU5fU1RBVEUpIHsKLQkJCWlmIChiNTNfZmFzdF9hZ2VfcG9ydChkZXYsIHBvcnQpKSB7Ci0JCQkJZGV2X2Vycihkcy0+ZGV2LCAiZmFzdCBhZ2VpbmcgZmFpbGVkXG4iKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KIAliNTNfcmVhZDgoZGV2LCBCNTNfQ1RSTF9QQUdFLCBCNTNfUE9SVF9DVFJMKHBvcnQpLCAmcmVnKTsKIAlyZWcgJj0gflBPUlRfQ1RSTF9TVFBfU1RBVEVfTUFTSzsKIAlyZWcgfD0gaHdfc3RhdGU7CiAJYjUzX3dyaXRlOChkZXYsIEI1M19DVFJMX1BBR0UsIEI1M19QT1JUX0NUUkwocG9ydCksIHJlZyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgYjUzX3N3aXRjaF9vcHMgPSB7Ci0JLnRhZ19wcm90b2NvbAkJPSBEU0FfVEFHX1BST1RPX05PTkUsCitzdGF0aWMgdm9pZCBiNTNfYnJfZmFzdF9hZ2Uoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCkKK3sKKwlzdHJ1Y3QgYjUzX2RldmljZSAqZGV2ID0gZHMtPnByaXY7CisKKwlpZiAoYjUzX2Zhc3RfYWdlX3BvcnQoZGV2LCBwb3J0KSkKKwkJZGV2X2Vycihkcy0+ZGV2LCAiZmFzdCBhZ2VpbmcgZmFpbGVkXG4iKTsKK30KKworc3RhdGljIGVudW0gZHNhX3RhZ19wcm90b2NvbCBiNTNfZ2V0X3RhZ19wcm90b2NvbChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCit7CisJcmV0dXJuIERTQV9UQUdfUFJPVE9fTk9ORTsKK30KKworc3RhdGljIHN0cnVjdCBkc2Ffc3dpdGNoX29wcyBiNTNfc3dpdGNoX29wcyA9IHsKKwkuZ2V0X3RhZ19wcm90b2NvbAk9IGI1M19nZXRfdGFnX3Byb3RvY29sLAogCS5zZXR1cAkJCT0gYjUzX3NldHVwLAotCS5zZXRfYWRkcgkJPSBiNTNfc2V0X2FkZHIsCiAJLmdldF9zdHJpbmdzCQk9IGI1M19nZXRfc3RyaW5ncywKIAkuZ2V0X2V0aHRvb2xfc3RhdHMJPSBiNTNfZ2V0X2V0aHRvb2xfc3RhdHMsCiAJLmdldF9zc2V0X2NvdW50CQk9IGI1M19nZXRfc3NldF9jb3VudCwKQEAgLTEzODgsNiArMTQ2Miw3IEBACiAJLnBvcnRfYnJpZGdlX2pvaW4JPSBiNTNfYnJfam9pbiwKIAkucG9ydF9icmlkZ2VfbGVhdmUJPSBiNTNfYnJfbGVhdmUsCiAJLnBvcnRfc3RwX3N0YXRlX3NldAk9IGI1M19icl9zZXRfc3RwX3N0YXRlLAorCS5wb3J0X2Zhc3RfYWdlCQk9IGI1M19icl9mYXN0X2FnZSwKIAkucG9ydF92bGFuX2ZpbHRlcmluZwk9IGI1M192bGFuX2ZpbHRlcmluZywKIAkucG9ydF92bGFuX3ByZXBhcmUJPSBiNTNfdmxhbl9wcmVwYXJlLAogCS5wb3J0X3ZsYW5fYWRkCQk9IGI1M192bGFuX2FkZCwKQEAgLTE1OTMsMTEgKzE2NjgsMjIgQEAKIAkJLmp1bWJvX3BtX3JlZyA9IEI1M19KVU1CT19QT1JUX01BU0ssCiAJCS5qdW1ib19zaXplX3JlZyA9IEI1M19KVU1CT19NQVhfU0laRSwKIAl9LAorCXsKKwkJLmNoaXBfaWQgPSBCQ003NDQ1X0RFVklDRV9JRCwKKwkJLmRldl9uYW1lID0gIkJDTTc0NDUiLAorCQkudmxhbnMJPSA0MDk2LAorCQkuZW5hYmxlZF9wb3J0cyA9IDB4MWZmLAorCQkuYXJsX2VudHJpZXMgPSA0LAorCQkuY3B1X3BvcnQgPSBCNTNfQ1BVX1BPUlQsCisJCS52dGFfcmVncyA9IEI1M19WVEFfUkVHUywKKwkJLmR1cGxleF9yZWcgPSBCNTNfRFVQTEVYX1NUQVRfR0UsCisJCS5qdW1ib19wbV9yZWcgPSBCNTNfSlVNQk9fUE9SVF9NQVNLLAorCQkuanVtYm9fc2l6ZV9yZWcgPSBCNTNfSlVNQk9fTUFYX1NJWkUsCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgYjUzX3N3aXRjaF9pbml0KHN0cnVjdCBiNTNfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gZGV2LT5kczsKIAl1bnNpZ25lZCBpbnQgaTsKIAlpbnQgcmV0OwogCkBAIC0xNjEzLDcgKzE2OTksNiBAQAogCQkJZGV2LT52dGFfcmVnc1sxXSA9IGNoaXAtPnZ0YV9yZWdzWzFdOwogCQkJZGV2LT52dGFfcmVnc1syXSA9IGNoaXAtPnZ0YV9yZWdzWzJdOwogCQkJZGV2LT5qdW1ib19wbV9yZWcgPSBjaGlwLT5qdW1ib19wbV9yZWc7Ci0JCQlkcy0+ZHJ2ID0gJmI1M19zd2l0Y2hfb3BzOwogCQkJZGV2LT5jcHVfcG9ydCA9IGNoaXAtPmNwdV9wb3J0OwogCQkJZGV2LT5udW1fdmxhbnMgPSBjaGlwLT52bGFuczsKIAkJCWRldi0+bnVtX2FybF9lbnRyaWVzID0gY2hpcC0+YXJsX2VudHJpZXM7CkBAIC0xNjgxLDcgKzE3NjYsOCBAQAogCXJldHVybiAwOwogfQogCi1zdHJ1Y3QgYjUzX2RldmljZSAqYjUzX3N3aXRjaF9hbGxvYyhzdHJ1Y3QgZGV2aWNlICpiYXNlLCBzdHJ1Y3QgYjUzX2lvX29wcyAqb3BzLAorc3RydWN0IGI1M19kZXZpY2UgKmI1M19zd2l0Y2hfYWxsb2Moc3RydWN0IGRldmljZSAqYmFzZSwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGI1M19pb19vcHMgKm9wcywKIAkJCQkgICAgdm9pZCAqcHJpdikKIHsKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHM7CkBAIC0xNzAwLDYgKzE3ODYsNyBAQAogCWRldi0+ZHMgPSBkczsKIAlkZXYtPnByaXYgPSBwcml2OwogCWRldi0+b3BzID0gb3BzOworCWRzLT5vcHMgPSAmYjUzX3N3aXRjaF9vcHM7CiAJbXV0ZXhfaW5pdCgmZGV2LT5yZWdfbXV0ZXgpOwogCW11dGV4X2luaXQoJmRldi0+c3RhdHNfbXV0ZXgpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19tZGlvLmMgYi9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19tZGlvLmMKaW5kZXggYWE4N2MzZi4uNDc3YTE2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL2I1My9iNTNfbWRpby5jCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9iNTMvYjUzX21kaW8uYwpAQCAtMjY3LDcgKzI2Nyw3IEBACiAJcmV0dXJuIG1kaW9idXNfd3JpdGVfbmVzdGVkKGJ1cywgYWRkciwgcmVnLCB2YWx1ZSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYjUzX2lvX29wcyBiNTNfbWRpb19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGI1M19pb19vcHMgYjUzX21kaW9fb3BzID0gewogCS5yZWFkOCA9IGI1M19tZGlvX3JlYWQ4LAogCS5yZWFkMTYgPSBiNTNfbWRpb19yZWFkMTYsCiAJLnJlYWQzMiA9IGI1M19tZGlvX3JlYWQzMiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9iNTMvYjUzX21tYXAuYyBiL2RyaXZlcnMvbmV0L2RzYS9iNTMvYjUzX21tYXAuYwppbmRleCA3N2ZmYzQzLi5jYzllNmJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19tbWFwLmMKKysrIGIvZHJpdmVycy9uZXQvZHNhL2I1My9iNTNfbW1hcC5jCkBAIC0yMDgsNyArMjA4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBiNTNfaW9fb3BzIGI1M19tbWFwX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYjUzX2lvX29wcyBiNTNfbW1hcF9vcHMgPSB7CiAJLnJlYWQ4ID0gYjUzX21tYXBfcmVhZDgsCiAJLnJlYWQxNiA9IGI1M19tbWFwX3JlYWQxNiwKIAkucmVhZDMyID0gYjUzX21tYXBfcmVhZDMyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL2I1My9iNTNfcHJpdi5oIGIvZHJpdmVycy9uZXQvZHNhL2I1My9iNTNfcHJpdi5oCmluZGV4IDgzNWE3NDQuLmYxOTJhNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RzYS9iNTMvYjUzX3ByaXYuaAorKysgYi9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19wcml2LmgKQEAgLTYwLDYgKzYwLDcgQEAKIAlCQ001MzAxOF9ERVZJQ0VfSUQgPSAweDUzMDE4LAogCUJDTTUzMDE5X0RFVklDRV9JRCA9IDB4NTMwMTksCiAJQkNNNThYWF9ERVZJQ0VfSUQgPSAweDU4MDAsCisJQkNNNzQ0NV9ERVZJQ0VfSUQgPSAweDc0NDUsCiB9OwogCiAjZGVmaW5lIEI1M19OX1BPUlRTCTkKQEAgLTE3NCw2ICsxNzUsMTIgQEAKIAkJZGV2LT5jaGlwX2lkID09IEJDTTUzMDE5X0RFVklDRV9JRDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgaXM1OHh4KHN0cnVjdCBiNTNfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldi0+Y2hpcF9pZCA9PSBCQ001OFhYX0RFVklDRV9JRCB8fAorCQlkZXYtPmNoaXBfaWQgPT0gQkNNNzQ0NV9ERVZJQ0VfSUQ7Cit9CisKICNkZWZpbmUgQjUzX0NQVV9QT1JUXzI1CTUKICNkZWZpbmUgQjUzX0NQVV9QT1JUCTgKIApAQCAtMTgyLDcgKzE4OSw4IEBACiAJcmV0dXJuIGRldi0+Y3B1X3BvcnQ7CiB9CiAKLXN0cnVjdCBiNTNfZGV2aWNlICpiNTNfc3dpdGNoX2FsbG9jKHN0cnVjdCBkZXZpY2UgKmJhc2UsIHN0cnVjdCBiNTNfaW9fb3BzICpvcHMsCitzdHJ1Y3QgYjUzX2RldmljZSAqYjUzX3N3aXRjaF9hbGxvYyhzdHJ1Y3QgZGV2aWNlICpiYXNlLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgYjUzX2lvX29wcyAqb3BzLAogCQkJCSAgICB2b2lkICpwcml2KTsKIAogaW50IGI1M19zd2l0Y2hfZGV0ZWN0KHN0cnVjdCBiNTNfZGV2aWNlICpkZXYpOwpAQCAtMzY0LDcgKzM3Miw2IEBACiAKICNpZmRlZiBDT05GSUdfQkNNNDdYWAogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2JjbTQ3eHhfbnZyYW0uaD4KICNpbmNsdWRlIDxiY200N3h4X2JvYXJkLmg+CiBzdGF0aWMgaW5saW5lIGludCBiNTNfc3dpdGNoX2dldF9yZXNldF9ncGlvKHN0cnVjdCBiNTNfZGV2aWNlICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19yZWdzLmggYi9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19yZWdzLmgKaW5kZXggOGYxMmJkZC4uZGFjMGFmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL2I1My9iNTNfcmVncy5oCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9iNTMvYjUzX3JlZ3MuaApAQCAtMjU4LDcgKzI1OCw3IEBACiAgKiBCQ001MzI1IGFuZCBCQ001MzY1IHNoYXJlIG1vc3QgZGVmaW5pdGlvbnMgYmVsb3cKICAqLwogI2RlZmluZSBCNTNfQVJMVEJMX01BQ19WSURfRU5UUlkobikJKDB4MTAgKiAobikpCi0jZGVmaW5lICAgQVJMVEJMX01BQ19NQVNLCQkweGZmZmZmZmZmZmZmZgorI2RlZmluZSAgIEFSTFRCTF9NQUNfTUFTSwkJMHhmZmZmZmZmZmZmZmZVTEwKICNkZWZpbmUgICBBUkxUQkxfVklEX1MJCQk0OAogI2RlZmluZSAgIEFSTFRCTF9WSURfTUFTS18yNQkJMHhmZgogI2RlZmluZSAgIEFSTFRCTF9WSURfTUFTSwkJMHhmZmYKQEAgLTMwOSw2ICszMDksOSBAQAogLyogUG9ydCBWTEFOIG1hc2sgKDE2IGJpdCkgSU1QIHBvcnQgaXMgYWx3YXlzIDgsIGFsc28gb24gNTMyNSAmIGNvICovCiAjZGVmaW5lIEI1M19QVkxBTl9QT1JUX01BU0soaSkJCSgoaSkgKiAyKQogCisvKiBKb2luIGFsbCBWTEFOcyByZWdpc3RlciAoMTYgYml0KSAqLworI2RlZmluZSBCNTNfSk9JTl9BTExfVkxBTl9FTgkJMHg1MAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogODAyLjFRIFBhZ2UgUmVnaXN0ZXJzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9iNTMvYjUzX3NwaS5jIGIvZHJpdmVycy9uZXQvZHNhL2I1My9iNTNfc3BpLmMKaW5kZXggMmJkYTBiNS4uZjg5ZjUzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL2I1My9iNTNfc3BpLmMKKysrIGIvZHJpdmVycy9uZXQvZHNhL2I1My9iNTNfc3BpLmMKQEAgLTI3MCw3ICsyNzAsNyBAQAogCXJldHVybiBzcGlfd3JpdGUoc3BpLCB0eGJ1Ziwgc2l6ZW9mKHR4YnVmKSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYjUzX2lvX29wcyBiNTNfc3BpX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYjUzX2lvX29wcyBiNTNfc3BpX29wcyA9IHsKIAkucmVhZDggPSBiNTNfc3BpX3JlYWQ4LAogCS5yZWFkMTYgPSBiNTNfc3BpX3JlYWQxNiwKIAkucmVhZDMyID0gYjUzX3NwaV9yZWFkMzIsCkBAIC0zMTcsOCArMzE3LDYgQEAKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBiNTNfc3BpX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZQk9ICJiNTMtc3dpdGNoIiwKLQkJLmJ1cwk9ICZzcGlfYnVzX3R5cGUsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCiAJLnByb2JlCT0gYjUzX3NwaV9wcm9iZSwKIAkucmVtb3ZlCT0gYjUzX3NwaV9yZW1vdmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19zcmFiLmMgYi9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19zcmFiLmMKaW5kZXggM2UyZDRhNS4uOGE2MmI2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL2I1My9iNTNfc3JhYi5jCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9iNTMvYjUzX3NyYWIuYwpAQCAtMzQ0LDcgKzM0NCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBiNTNfaW9fb3BzIGI1M19zcmFiX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYjUzX2lvX29wcyBiNTNfc3JhYl9vcHMgPSB7CiAJLnJlYWQ4ID0gYjUzX3NyYWJfcmVhZDgsCiAJLnJlYWQxNiA9IGI1M19zcmFiX3JlYWQxNiwKIAkucmVhZDMyID0gYjUzX3NyYWJfcmVhZDMyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL2JjbV9zZjIuYyBiL2RyaXZlcnMvbmV0L2RzYS9iY21fc2YyLmMKaW5kZXggYjJiODM4Ny4uZTIxODg4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL2JjbV9zZjIuYworKysgYi9kcml2ZXJzL25ldC9kc2EvYmNtX3NmMi5jCkBAIC0yOSwxMzAgKzI5LDIxIEBACiAjaW5jbHVkZSA8bGludXgvYnJjbXBoeS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bmV0L3N3aXRjaGRldi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvYjUzLmg+CiAKICNpbmNsdWRlICJiY21fc2YyLmgiCiAjaW5jbHVkZSAiYmNtX3NmMl9yZWdzLmgiCisjaW5jbHVkZSAiYjUzL2I1M19wcml2LmgiCisjaW5jbHVkZSAiYjUzL2I1M19yZWdzLmgiCiAKLS8qIFN0cmluZywgb2Zmc2V0LCBhbmQgcmVnaXN0ZXIgc2l6ZSBpbiBieXRlcyBpZiBkaWZmZXJlbnQgZnJvbSA0IGJ5dGVzICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGJjbV9zZjJfaHdfc3RhdHMgYmNtX3NmMl9taWJbXSA9IHsKLQl7ICJUeE9jdGV0cyIsCQkweDAwMCwgOAl9LAotCXsgIlR4RHJvcFBrdHMiLAkJMHgwMjAJCX0sCi0JeyAiVHhRUEtUUTAiLAkJMHgwMzAJCX0sCi0JeyAiVHhCcm9hZGNhc3RQa3RzIiwJMHgwNDAJCX0sCi0JeyAiVHhNdWx0aWNhc3RQa3RzIiwJMHgwNTAJCX0sCi0JeyAiVHhVbmljYXN0UEt0cyIsCTB4MDYwCQl9LAotCXsgIlR4Q29sbGlzaW9ucyIsCTB4MDcwCQl9LAotCXsgIlR4U2luZ2xlQ29sbGlzaW9uIiwJMHgwODAJCX0sCi0JeyAiVHhNdWx0aXBsZUNvbGxpc2lvbiIsIDB4MDkwCQl9LAotCXsgIlR4RGVmZXJyZWRDb2xsaXNpb24iLCAweDBhMAkJfSwKLQl7ICJUeExhdGVDb2xsaXNpb24iLAkweDBiMAkJfSwKLQl7ICJUeEV4Y2Vzc2l2ZUNvbGxpc2lvbiIsIDB4MGMwCQl9LAotCXsgIlR4RnJhbWVJbkRpc2MiLAkweDBkMAkJfSwKLQl7ICJUeFBhdXNlUGt0cyIsCTB4MGUwCQl9LAotCXsgIlR4UVBLVFExIiwJCTB4MGYwCQl9LAotCXsgIlR4UVBLVFEyIiwJCTB4MTAwCQl9LAotCXsgIlR4UVBLVFEzIiwJCTB4MTEwCQl9LAotCXsgIlR4UVBLVFE0IiwJCTB4MTIwCQl9LAotCXsgIlR4UVBLVFE1IiwJCTB4MTMwCQl9LAotCXsgIlJ4T2N0ZXRzIiwJCTB4MTQwLCA4CX0sCi0JeyAiUnhVbmRlcnNpemVQa3RzIiwJMHgxNjAJCX0sCi0JeyAiUnhQYXVzZVBrdHMiLAkweDE3MAkJfSwKLQl7ICJSeFBrdHM2NE9jdGV0cyIsCTB4MTgwCQl9LAotCXsgIlJ4UGt0czY1dG8xMjdPY3RldHMiLCAweDE5MAkJfSwKLQl7ICJSeFBrdHMxMjh0bzI1NU9jdGV0cyIsIDB4MWEwCQl9LAotCXsgIlJ4UGt0czI1NnRvNTExT2N0ZXRzIiwgMHgxYjAJCX0sCi0JeyAiUnhQa3RzNTEydG8xMDIzT2N0ZXRzIiwgMHgxYzAJfSwKLQl7ICJSeFBrdHMxMDI0dG9NYXhQa3RzT2N0ZXRzIiwgMHgxZDAJfSwKLQl7ICJSeE92ZXJzaXplUGt0cyIsCTB4MWUwCQl9LAotCXsgIlJ4SmFiYmVycyIsCQkweDFmMAkJfSwKLQl7ICJSeEFsaWdubWVudEVycm9ycyIsCTB4MjAwCQl9LAotCXsgIlJ4RkNTRXJyb3JzIiwJMHgyMTAJCX0sCi0JeyAiUnhHb29kT2N0ZXRzIiwJMHgyMjAsIDgJfSwKLQl7ICJSeERyb3BQa3RzIiwJCTB4MjQwCQl9LAotCXsgIlJ4VW5pY2FzdFBrdHMiLAkweDI1MAkJfSwKLQl7ICJSeE11bHRpY2FzdFBrdHMiLAkweDI2MAkJfSwKLQl7ICJSeEJyb2FkY2FzdFBrdHMiLAkweDI3MAkJfSwKLQl7ICJSeFNBQ2hhbmdlcyIsCTB4MjgwCQl9LAotCXsgIlJ4RnJhZ21lbnRzIiwJMHgyOTAJCX0sCi0JeyAiUnhKdW1ib1BrdCIsCQkweDJhMAkJfSwKLQl7ICJSeFN5bWJsRXJyIiwJCTB4MmIwCQl9LAotCXsgIkluUmFuZ2VFcnJDb3VudCIsCTB4MmMwCQl9LAotCXsgIk91dFJhbmdlRXJyQ291bnQiLAkweDJkMAkJfSwKLQl7ICJFRUVMcGlFdmVudCIsCTB4MmUwCQl9LAotCXsgIkVFRUxwaUR1cmF0aW9uIiwJMHgyZjAJCX0sCi0JeyAiUnhEaXNjYXJkIiwJCTB4MzAwLCA4CX0sCi0JeyAiVHhRUEtUUTYiLAkJMHgzMjAJCX0sCi0JeyAiVHhRUEtUUTciLAkJMHgzMzAJCX0sCi0JeyAiVHhQa3RzNjRPY3RldHMiLAkweDM0MAkJfSwKLQl7ICJUeFBrdHM2NXRvMTI3T2N0ZXRzIiwgMHgzNTAJCX0sCi0JeyAiVHhQa3RzMTI4dG8yNTVPY3RldHMiLCAweDM2MAkJfSwKLQl7ICJUeFBrdHMyNTZ0bzUxMU9jZXRzIiwgMHgzNzAJCX0sCi0JeyAiVHhQa3RzNTEydG8xMDIzT2NldHMiLCAweDM4MAkJfSwKLQl7ICJUeFBrdHMxMDI0dG9NYXhQa3RPY2V0cyIsIDB4MzkwCX0sCi19OwotCi0jZGVmaW5lIEJDTV9TRjJfU1RBVFNfU0laRQlBUlJBWV9TSVpFKGJjbV9zZjJfbWliKQotCi1zdGF0aWMgdm9pZCBiY21fc2YyX3N3X2dldF9zdHJpbmdzKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywKLQkJCQkgICBpbnQgcG9ydCwgdWludDhfdCAqZGF0YSkKK3N0YXRpYyBlbnVtIGRzYV90YWdfcHJvdG9jb2wgYmNtX3NmMl9zd19nZXRfdGFnX3Byb3RvY29sKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKIHsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBCQ01fU0YyX1NUQVRTX1NJWkU7IGkrKykKLQkJbWVtY3B5KGRhdGEgKyBpICogRVRIX0dTVFJJTkdfTEVOLAotCQkgICAgICAgYmNtX3NmMl9taWJbaV0uc3RyaW5nLCBFVEhfR1NUUklOR19MRU4pOwotfQotCi1zdGF0aWMgdm9pZCBiY21fc2YyX3N3X2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywKLQkJCQkJIGludCBwb3J0LCB1aW50NjRfdCAqZGF0YSkKLXsKLQlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZHNfdG9fcHJpdihkcyk7Ci0JY29uc3Qgc3RydWN0IGJjbV9zZjJfaHdfc3RhdHMgKnM7Ci0JdW5zaWduZWQgaW50IGk7Ci0JdTY0IHZhbCA9IDA7Ci0JdTMyIG9mZnNldDsKLQotCW11dGV4X2xvY2soJnByaXYtPnN0YXRzX211dGV4KTsKLQotCS8qIE5vdyBmZXRjaCB0aGUgcGVyLXBvcnQgY291bnRlcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQkNNX1NGMl9TVEFUU19TSVpFOyBpKyspIHsKLQkJcyA9ICZiY21fc2YyX21pYltpXTsKLQotCQkvKiBEbyBhIGxhdGNoZWQgNjQtYml0IHJlYWQgaWYgbmVlZGVkICovCi0JCW9mZnNldCA9IHMtPnJlZyArIENPUkVfUF9NSUJfT0ZGU0VUKHBvcnQpOwotCQlpZiAocy0+c2l6ZW9mX3N0YXQgPT0gOCkKLQkJCXZhbCA9IGNvcmVfcmVhZHEocHJpdiwgb2Zmc2V0KTsKLQkJZWxzZQotCQkJdmFsID0gY29yZV9yZWFkbChwcml2LCBvZmZzZXQpOwotCi0JCWRhdGFbaV0gPSAodTY0KXZhbDsKLQl9Ci0KLQltdXRleF91bmxvY2soJnByaXYtPnN0YXRzX211dGV4KTsKLX0KLQotc3RhdGljIGludCBiY21fc2YyX3N3X2dldF9zc2V0X2NvdW50KHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKLXsKLQlyZXR1cm4gQkNNX1NGMl9TVEFUU19TSVpFOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqYmNtX3NmMl9zd19kcnZfcHJvYmUoc3RydWN0IGRldmljZSAqZHNhX2RldiwKLQkJCQkJc3RydWN0IGRldmljZSAqaG9zdF9kZXYsIGludCBzd19hZGRyLAotCQkJCQl2b2lkICoqX3ByaXYpCi17Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdjsKLQotCXByaXYgPSBkZXZtX2t6YWxsb2MoZHNhX2Rldiwgc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcml2KQotCQlyZXR1cm4gTlVMTDsKLQkqX3ByaXYgPSBwcml2OwotCi0JcmV0dXJuICJCcm9hZGNvbSBTdGFyZmlnaHRlciAyIjsKKwlyZXR1cm4gRFNBX1RBR19QUk9UT19CUkNNOwogfQogCiBzdGF0aWMgdm9pZCBiY21fc2YyX2ltcF92bGFuX3NldHVwKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IGNwdV9wb3J0KQogewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gYmNtX3NmMl90b19wcml2KGRzKTsKIAl1bnNpZ25lZCBpbnQgaTsKIAl1MzIgcmVnOwogCkBAIC0xNzIsNyArNjMsNyBAQAogCiBzdGF0aWMgdm9pZCBiY21fc2YyX2ltcF9zZXR1cChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0KQogewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gYmNtX3NmMl90b19wcml2KGRzKTsKIAl1MzIgcmVnLCB2YWw7CiAKIAkvKiBFbmFibGUgdGhlIHBvcnQgbWVtb3JpZXMgKi8KQEAgLTIzNyw3ICsxMjgsNyBAQAogCiBzdGF0aWMgdm9pZCBiY21fc2YyX2VlZV9lbmFibGVfc2V0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIGJvb2wgZW5hYmxlKQogewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gYmNtX3NmMl90b19wcml2KGRzKTsKIAl1MzIgcmVnOwogCiAJcmVnID0gY29yZV9yZWFkbChwcml2LCBDT1JFX0VFRV9FTl9DVFJMKTsKQEAgLTI1MCw3ICsxNDEsNyBAQAogCiBzdGF0aWMgdm9pZCBiY21fc2YyX2dwaHlfZW5hYmxlX3NldChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGJvb2wgZW5hYmxlKQogewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gYmNtX3NmMl90b19wcml2KGRzKTsKIAl1MzIgcmVnOwogCiAJcmVnID0gcmVnX3JlYWRsKHByaXYsIFJFR19TUEhZX0NOVFJMKTsKQEAgLTMyNCw3ICsyMTUsNyBAQAogc3RhdGljIGludCBiY21fc2YyX3BvcnRfc2V0dXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAkJCSAgICAgIHN0cnVjdCBwaHlfZGV2aWNlICpwaHkpCiB7Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBiY21fc2YyX3RvX3ByaXYoZHMpOwogCXM4IGNwdV9wb3J0ID0gZHMtPmRzdFtkcy0+aW5kZXhdLmNwdV9wb3J0OwogCXUzMiByZWc7CiAKQEAgLTM2NSw3ICsyNTYsNyBAQAogCXJlZyA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9QT1JUX1ZMQU5fQ1RMX1BPUlQocG9ydCkpOwogCXJlZyAmPSB+UE9SVF9WTEFOX0NUUkxfTUFTSzsKIAlyZWcgfD0gKDEgPDwgcG9ydCk7Ci0JcmVnIHw9IHByaXYtPnBvcnRfc3RzW3BvcnRdLnZsYW5fY3RsX21hc2s7CisJcmVnIHw9IHByaXYtPmRldi0+cG9ydHNbcG9ydF0udmxhbl9jdGxfbWFzazsKIAljb3JlX3dyaXRlbChwcml2LCByZWcsIENPUkVfUE9SVF9WTEFOX0NUTF9QT1JUKHBvcnQpKTsKIAogCWJjbV9zZjJfaW1wX3ZsYW5fc2V0dXAoZHMsIGNwdV9wb3J0KTsKQEAgLTM4MCw3ICsyNzEsNyBAQAogc3RhdGljIHZvaWQgYmNtX3NmMl9wb3J0X2Rpc2FibGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAkJCQkgc3RydWN0IHBoeV9kZXZpY2UgKnBoeSkKIHsKLQlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGJjbV9zZjJfdG9fcHJpdihkcyk7CiAJdTMyIG9mZiwgcmVnOwogCiAJaWYgKHByaXYtPndvbF9wb3J0c19tYXNrICYgKDEgPDwgcG9ydCkpCkBAIC00MTIsNyArMzAzLDcgQEAKIHN0YXRpYyBpbnQgYmNtX3NmMl9lZWVfaW5pdChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJICAgIHN0cnVjdCBwaHlfZGV2aWNlICpwaHkpCiB7Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBiY21fc2YyX3RvX3ByaXYoZHMpOwogCXN0cnVjdCBldGh0b29sX2VlZSAqcCA9ICZwcml2LT5wb3J0X3N0c1twb3J0XS5lZWU7CiAJaW50IHJldDsKIApAQCAtNDMwLDcgKzMyMSw3IEBACiBzdGF0aWMgaW50IGJjbV9zZjJfc3dfZ2V0X2VlZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJICAgICAgc3RydWN0IGV0aHRvb2xfZWVlICplKQogewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gYmNtX3NmMl90b19wcml2KGRzKTsKIAlzdHJ1Y3QgZXRodG9vbF9lZWUgKnAgPSAmcHJpdi0+cG9ydF9zdHNbcG9ydF0uZWVlOwogCXUzMiByZWc7CiAKQEAgLTQ0NSw3ICszMzYsNyBAQAogCQkJICAgICAgc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwKIAkJCSAgICAgIHN0cnVjdCBldGh0b29sX2VlZSAqZSkKIHsKLQlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGJjbV9zZjJfdG9fcHJpdihkcyk7CiAJc3RydWN0IGV0aHRvb2xfZWVlICpwID0gJnByaXYtPnBvcnRfc3RzW3BvcnRdLmVlZTsKIAogCXAtPmVlZV9lbmFibGVkID0gZS0+ZWVlX2VuYWJsZWQ7CkBAIC00NjEsNDY5ICszNTIsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGJjbV9zZjJfZmFzdF9hZ2Vfb3Aoc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdikKLXsKLQl1bnNpZ25lZCBpbnQgdGltZW91dCA9IDEwMDA7Ci0JdTMyIHJlZzsKLQotCXJlZyA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9GQVNUX0FHRV9DVFJMKTsKLQlyZWcgfD0gRU5fQUdFX1BPUlQgfCBFTl9BR0VfVkxBTiB8IEVOX0FHRV9EWU5BTUlDIHwgRkFTVF9BR0VfU1RSX0RPTkU7Ci0JY29yZV93cml0ZWwocHJpdiwgcmVnLCBDT1JFX0ZBU1RfQUdFX0NUUkwpOwotCi0JZG8gewotCQlyZWcgPSBjb3JlX3JlYWRsKHByaXYsIENPUkVfRkFTVF9BR0VfQ1RSTCk7Ci0JCWlmICghKHJlZyAmIEZBU1RfQUdFX1NUUl9ET05FKSkKLQkJCWJyZWFrOwotCi0JCWNwdV9yZWxheCgpOwotCX0gd2hpbGUgKHRpbWVvdXQtLSk7Ci0KLQlpZiAoIXRpbWVvdXQpCi0JCXJldHVybiAtRVRJTUVET1VUOwotCi0JY29yZV93cml0ZWwocHJpdiwgMCwgQ09SRV9GQVNUX0FHRV9DVFJMKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBGYXN0LWFnZWluZyBvZiBBUkwgZW50cmllcyBmb3IgYSBnaXZlbiBwb3J0LCBlcXVpdmFsZW50IHRvIGFuIEFSTAotICogZmx1c2ggZm9yIHRoYXQgcG9ydC4KLSAqLwotc3RhdGljIGludCBiY21fc2YyX3N3X2Zhc3RfYWdlX3BvcnQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCkKLXsKLQlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZHNfdG9fcHJpdihkcyk7Ci0KLQljb3JlX3dyaXRlbChwcml2LCBwb3J0LCBDT1JFX0ZBU1RfQUdFX1BPUlQpOwotCi0JcmV0dXJuIGJjbV9zZjJfZmFzdF9hZ2Vfb3AocHJpdik7Ci19Ci0KLXN0YXRpYyBpbnQgYmNtX3NmMl9zd19mYXN0X2FnZV92bGFuKHN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYsIHUxNiB2aWQpCi17Ci0JY29yZV93cml0ZWwocHJpdiwgdmlkLCBDT1JFX0ZBU1RfQUdFX1ZJRCk7Ci0KLQlyZXR1cm4gYmNtX3NmMl9mYXN0X2FnZV9vcChwcml2KTsKLX0KLQotc3RhdGljIGludCBiY21fc2YyX3ZsYW5fb3Bfd2FpdChzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2KQotewotCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gMTA7Ci0JdTMyIHJlZzsKLQotCWRvIHsKLQkJcmVnID0gY29yZV9yZWFkbChwcml2LCBDT1JFX0FSTEFfVlRCTF9SV0NUUkwpOwotCQlpZiAoIShyZWcgJiBBUkxBX1ZUQkxfU1RETikpCi0JCQlyZXR1cm4gMDsKLQotCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7Ci0JfSB3aGlsZSAodGltZW91dC0tKTsKLQotCXJldHVybiAtRVRJTUVET1VUOwotfQotCi1zdGF0aWMgaW50IGJjbV9zZjJfdmxhbl9vcChzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2LCB1OCBvcCkKLXsKLQljb3JlX3dyaXRlbChwcml2LCBBUkxBX1ZUQkxfU1RETiB8IG9wLCBDT1JFX0FSTEFfVlRCTF9SV0NUUkwpOwotCi0JcmV0dXJuIGJjbV9zZjJfdmxhbl9vcF93YWl0KHByaXYpOwotfQotCi1zdGF0aWMgdm9pZCBiY21fc2YyX3NldF92bGFuX2VudHJ5KHN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYsIHUxNiB2aWQsCi0JCQkJICAgc3RydWN0IGJjbV9zZjJfdmxhbiAqdmxhbikKLXsKLQlpbnQgcmV0OwotCi0JY29yZV93cml0ZWwocHJpdiwgdmlkICYgVlRCTF9BRERSX0lOREVYX01BU0ssIENPUkVfQVJMQV9WVEJMX0FERFIpOwotCWNvcmVfd3JpdGVsKHByaXYsIHZsYW4tPnVudGFnIDw8IFVOVEFHX01BUF9TSElGVCB8IHZsYW4tPm1lbWJlcnMsCi0JCSAgICBDT1JFX0FSTEFfVlRCTF9FTlRSWSk7Ci0KLQlyZXQgPSBiY21fc2YyX3ZsYW5fb3AocHJpdiwgQVJMQV9WVEJMX0NNRF9XUklURSk7Ci0JaWYgKHJldCkKLQkJcHJfZXJyKCJmYWlsZWQgdG8gd3JpdGUgVkxBTiBlbnRyeVxuIik7Ci19Ci0KLXN0YXRpYyBpbnQgYmNtX3NmMl9nZXRfdmxhbl9lbnRyeShzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2LCB1MTYgdmlkLAotCQkJCSAgc3RydWN0IGJjbV9zZjJfdmxhbiAqdmxhbikKLXsKLQl1MzIgZW50cnk7Ci0JaW50IHJldDsKLQotCWNvcmVfd3JpdGVsKHByaXYsIHZpZCAmIFZUQkxfQUREUl9JTkRFWF9NQVNLLCBDT1JFX0FSTEFfVlRCTF9BRERSKTsKLQotCXJldCA9IGJjbV9zZjJfdmxhbl9vcChwcml2LCBBUkxBX1ZUQkxfQ01EX1JFQUQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQllbnRyeSA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9BUkxBX1ZUQkxfRU5UUlkpOwotCXZsYW4tPm1lbWJlcnMgPSBlbnRyeSAmIEZXRF9NQVBfTUFTSzsKLQl2bGFuLT51bnRhZyA9IChlbnRyeSA+PiBVTlRBR19NQVBfU0hJRlQpICYgVU5UQUdfTUFQX01BU0s7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBiY21fc2YyX3N3X2JyX2pvaW4oc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKLQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpicmlkZ2UpCi17Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOwotCXM4IGNwdV9wb3J0ID0gZHMtPmRzdC0+Y3B1X3BvcnQ7Ci0JdW5zaWduZWQgaW50IGk7Ci0JdTMyIHJlZywgcF9jdGw7Ci0KLQkvKiBNYWtlIHRoaXMgcG9ydCBsZWF2ZSB0aGUgYWxsIFZMQU5zIGpvaW4gc2luY2Ugd2Ugd2lsbCBoYXZlIHByb3BlcgotCSAqIFZMQU4gZW50cmllcyBmcm9tIG5vdyBvbgotCSAqLwotCXJlZyA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9KT0lOX0FMTF9WTEFOX0VOKTsKLQlyZWcgJj0gfkJJVChwb3J0KTsKLQlpZiAoKHJlZyAmIEJJVChjcHVfcG9ydCkpID09IEJJVChjcHVfcG9ydCkpCi0JCXJlZyAmPSB+QklUKGNwdV9wb3J0KTsKLQljb3JlX3dyaXRlbChwcml2LCByZWcsIENPUkVfSk9JTl9BTExfVkxBTl9FTik7Ci0KLQlwcml2LT5wb3J0X3N0c1twb3J0XS5icmlkZ2VfZGV2ID0gYnJpZGdlOwotCXBfY3RsID0gY29yZV9yZWFkbChwcml2LCBDT1JFX1BPUlRfVkxBTl9DVExfUE9SVChwb3J0KSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+aHdfcGFyYW1zLm51bV9wb3J0czsgaSsrKSB7Ci0JCWlmIChwcml2LT5wb3J0X3N0c1tpXS5icmlkZ2VfZGV2ICE9IGJyaWRnZSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIEFkZCB0aGlzIGxvY2FsIHBvcnQgdG8gdGhlIHJlbW90ZSBwb3J0IFZMQU4gY29udHJvbAotCQkgKiBtZW1iZXJzaGlwIGFuZCB1cGRhdGUgdGhlIHJlbW90ZSBwb3J0IGJpdG1hc2sKLQkJICovCi0JCXJlZyA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9QT1JUX1ZMQU5fQ1RMX1BPUlQoaSkpOwotCQlyZWcgfD0gMSA8PCBwb3J0OwotCQljb3JlX3dyaXRlbChwcml2LCByZWcsIENPUkVfUE9SVF9WTEFOX0NUTF9QT1JUKGkpKTsKLQkJcHJpdi0+cG9ydF9zdHNbaV0udmxhbl9jdGxfbWFzayA9IHJlZzsKLQotCQlwX2N0bCB8PSAxIDw8IGk7Ci0JfQotCi0JLyogQ29uZmlndXJlIHRoZSBsb2NhbCBwb3J0IFZMQU4gY29udHJvbCBtZW1iZXJzaGlwIHRvIGluY2x1ZGUKLQkgKiByZW1vdGUgcG9ydHMgYW5kIHVwZGF0ZSB0aGUgbG9jYWwgcG9ydCBiaXRtYXNrCi0JICovCi0JY29yZV93cml0ZWwocHJpdiwgcF9jdGwsIENPUkVfUE9SVF9WTEFOX0NUTF9QT1JUKHBvcnQpKTsKLQlwcml2LT5wb3J0X3N0c1twb3J0XS52bGFuX2N0bF9tYXNrID0gcF9jdGw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYmNtX3NmMl9zd19icl9sZWF2ZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0KQotewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqYnJpZGdlID0gcHJpdi0+cG9ydF9zdHNbcG9ydF0uYnJpZGdlX2RldjsKLQlzOCBjcHVfcG9ydCA9IGRzLT5kc3QtPmNwdV9wb3J0OwotCXVuc2lnbmVkIGludCBpOwotCXUzMiByZWcsIHBfY3RsOwotCi0JcF9jdGwgPSBjb3JlX3JlYWRsKHByaXYsIENPUkVfUE9SVF9WTEFOX0NUTF9QT1JUKHBvcnQpKTsKLQotCWZvciAoaSA9IDA7IGkgPCBwcml2LT5od19wYXJhbXMubnVtX3BvcnRzOyBpKyspIHsKLQkJLyogRG9uJ3QgdG91Y2ggdGhlIHJlbWFpbmluZyBwb3J0cyAqLwotCQlpZiAocHJpdi0+cG9ydF9zdHNbaV0uYnJpZGdlX2RldiAhPSBicmlkZ2UpCi0JCQljb250aW51ZTsKLQotCQlyZWcgPSBjb3JlX3JlYWRsKHByaXYsIENPUkVfUE9SVF9WTEFOX0NUTF9QT1JUKGkpKTsKLQkJcmVnICY9IH4oMSA8PCBwb3J0KTsKLQkJY29yZV93cml0ZWwocHJpdiwgcmVnLCBDT1JFX1BPUlRfVkxBTl9DVExfUE9SVChpKSk7Ci0JCXByaXYtPnBvcnRfc3RzW3BvcnRdLnZsYW5fY3RsX21hc2sgPSByZWc7Ci0KLQkJLyogUHJldmVudCBzZWxmIHJlbW92YWwgdG8gcHJlc2VydmUgaXNvbGF0aW9uICovCi0JCWlmIChwb3J0ICE9IGkpCi0JCQlwX2N0bCAmPSB+KDEgPDwgaSk7Ci0JfQotCi0JY29yZV93cml0ZWwocHJpdiwgcF9jdGwsIENPUkVfUE9SVF9WTEFOX0NUTF9QT1JUKHBvcnQpKTsKLQlwcml2LT5wb3J0X3N0c1twb3J0XS52bGFuX2N0bF9tYXNrID0gcF9jdGw7Ci0JcHJpdi0+cG9ydF9zdHNbcG9ydF0uYnJpZGdlX2RldiA9IE5VTEw7Ci0KLQkvKiBNYWtlIHRoaXMgcG9ydCBqb2luIGFsbCBWTEFOcyB3aXRob3V0IFZMQU4gZW50cmllcyAqLwotCXJlZyA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9KT0lOX0FMTF9WTEFOX0VOKTsKLQlyZWcgfD0gQklUKHBvcnQpOwotCWlmICghKHJlZyAmIEJJVChjcHVfcG9ydCkpKQotCQlyZWcgfD0gQklUKGNwdV9wb3J0KTsKLQljb3JlX3dyaXRlbChwcml2LCByZWcsIENPUkVfSk9JTl9BTExfVkxBTl9FTik7Ci19Ci0KLXN0YXRpYyB2b2lkIGJjbV9zZjJfc3dfYnJfc2V0X3N0cF9zdGF0ZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAotCQkJCQl1OCBzdGF0ZSkKLXsKLQlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZHNfdG9fcHJpdihkcyk7Ci0JdTggaHdfc3RhdGUsIGN1cl9od19zdGF0ZTsKLQl1MzIgcmVnOwotCi0JcmVnID0gY29yZV9yZWFkbChwcml2LCBDT1JFX0dfUENUTF9QT1JUKHBvcnQpKTsKLQljdXJfaHdfc3RhdGUgPSByZWcgJiAoR19NSVNUUF9TVEFURV9NQVNLIDw8IEdfTUlTVFBfU1RBVEVfU0hJRlQpOwotCi0Jc3dpdGNoIChzdGF0ZSkgewotCWNhc2UgQlJfU1RBVEVfRElTQUJMRUQ6Ci0JCWh3X3N0YXRlID0gR19NSVNUUF9ESVNfU1RBVEU7Ci0JCWJyZWFrOwotCWNhc2UgQlJfU1RBVEVfTElTVEVOSU5HOgotCQlod19zdGF0ZSA9IEdfTUlTVFBfTElTVEVOX1NUQVRFOwotCQlicmVhazsKLQljYXNlIEJSX1NUQVRFX0xFQVJOSU5HOgotCQlod19zdGF0ZSA9IEdfTUlTVFBfTEVBUk5fU1RBVEU7Ci0JCWJyZWFrOwotCWNhc2UgQlJfU1RBVEVfRk9SV0FSRElORzoKLQkJaHdfc3RhdGUgPSBHX01JU1RQX0ZXRF9TVEFURTsKLQkJYnJlYWs7Ci0JY2FzZSBCUl9TVEFURV9CTE9DS0lORzoKLQkJaHdfc3RhdGUgPSBHX01JU1RQX0JMT0NLX1NUQVRFOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIiVzOiBpbnZhbGlkIFNUUCBzdGF0ZTogJWRcbiIsIF9fZnVuY19fLCBzdGF0ZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBGYXN0LWFnZSBBUkwgZW50cmllcyBpZiB3ZSBhcmUgbW92aW5nIGEgcG9ydCBmcm9tIExlYXJuaW5nIG9yCi0JICogRm9yd2FyZGluZyAoY3VyX2h3X3N0YXRlKSBzdGF0ZSB0byBEaXNhYmxlZCwgQmxvY2tpbmcgb3IgTGlzdGVuaW5nCi0JICogc3RhdGUgKGh3X3N0YXRlKQotCSAqLwotCWlmIChjdXJfaHdfc3RhdGUgIT0gaHdfc3RhdGUpIHsKLQkJaWYgKGN1cl9od19zdGF0ZSA+PSBHX01JU1RQX0xFQVJOX1NUQVRFICYmCi0JCSAgICBod19zdGF0ZSA8PSBHX01JU1RQX0xJU1RFTl9TVEFURSkgewotCQkJaWYgKGJjbV9zZjJfc3dfZmFzdF9hZ2VfcG9ydChkcywgcG9ydCkpIHsKLQkJCQlwcl9lcnIoIiVzOiBmYXN0LWFnZWluZyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZWcgPSBjb3JlX3JlYWRsKHByaXYsIENPUkVfR19QQ1RMX1BPUlQocG9ydCkpOwotCXJlZyAmPSB+KEdfTUlTVFBfU1RBVEVfTUFTSyA8PCBHX01JU1RQX1NUQVRFX1NISUZUKTsKLQlyZWcgfD0gaHdfc3RhdGU7Ci0JY29yZV93cml0ZWwocHJpdiwgcmVnLCBDT1JFX0dfUENUTF9QT1JUKHBvcnQpKTsKLX0KLQotLyogQWRkcmVzcyBSZXNvbHV0aW9uIExvZ2ljIHJvdXRpbmVzICovCi1zdGF0aWMgaW50IGJjbV9zZjJfYXJsX29wX3dhaXQoc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdikKLXsKLQl1bnNpZ25lZCBpbnQgdGltZW91dCA9IDEwOwotCXUzMiByZWc7Ci0KLQlkbyB7Ci0JCXJlZyA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9BUkxBX1JXQ1RMKTsKLQkJaWYgKCEocmVnICYgQVJMX1NUUlRETikpCi0JCQlyZXR1cm4gMDsKLQotCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7Ci0JfSB3aGlsZSAodGltZW91dC0tKTsKLQotCXJldHVybiAtRVRJTUVET1VUOwotfQotCi1zdGF0aWMgaW50IGJjbV9zZjJfYXJsX3J3X29wKHN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBvcCkKLXsKLQl1MzIgY21kOwotCi0JaWYgKG9wID4gQVJMX1JXKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWNtZCA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9BUkxBX1JXQ1RMKTsKLQljbWQgJj0gfklWTF9TVkxfU0VMRUNUOwotCWNtZCB8PSBBUkxfU1RSVEROOwotCWlmIChvcCkKLQkJY21kIHw9IEFSTF9SVzsKLQllbHNlCi0JCWNtZCAmPSB+QVJMX1JXOwotCWNvcmVfd3JpdGVsKHByaXYsIGNtZCwgQ09SRV9BUkxBX1JXQ1RMKTsKLQotCXJldHVybiBiY21fc2YyX2FybF9vcF93YWl0KHByaXYpOwotfQotCi1zdGF0aWMgaW50IGJjbV9zZjJfYXJsX3JlYWQoc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiwgdTY0IG1hYywKLQkJCSAgICB1MTYgdmlkLCBzdHJ1Y3QgYmNtX3NmMl9hcmxfZW50cnkgKmVudCwgdTggKmlkeCwKLQkJCSAgICBib29sIGlzX3ZhbGlkKQotewotCXVuc2lnbmVkIGludCBpOwotCWludCByZXQ7Ci0KLQlyZXQgPSBiY21fc2YyX2FybF9vcF93YWl0KHByaXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBSZWFkIHRoZSA0IGJpbnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCXU2NCBtYWNfdmlkOwotCQl1MzIgZndkX2VudHJ5OwotCi0JCW1hY192aWQgPSBjb3JlX3JlYWRxKHByaXYsIENPUkVfQVJMQV9NQUNWSURfRU5UUlkoaSkpOwotCQlmd2RfZW50cnkgPSBjb3JlX3JlYWRsKHByaXYsIENPUkVfQVJMQV9GV0RfRU5UUlkoaSkpOwotCQliY21fc2YyX2FybF90b19lbnRyeShlbnQsIG1hY192aWQsIGZ3ZF9lbnRyeSk7Ci0KLQkJaWYgKGVudC0+aXNfdmFsaWQgJiYgaXNfdmFsaWQpIHsKLQkJCSppZHggPSBpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQkvKiBUaGlzIGlzIHRoZSBNQUMgd2UganVzdCBkZWxldGVkICovCi0JCWlmICghaXNfdmFsaWQgJiYgKG1hY192aWQgJiBtYWMpKQotCQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIC1FTk9FTlQ7Ci19Ci0KLXN0YXRpYyBpbnQgYmNtX3NmMl9hcmxfb3Aoc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiwgaW50IG9wLCBpbnQgcG9ydCwKLQkJCSAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkciwgdTE2IHZpZCwgYm9vbCBpc192YWxpZCkKLXsKLQlzdHJ1Y3QgYmNtX3NmMl9hcmxfZW50cnkgZW50OwotCXUzMiBmd2RfZW50cnk7Ci0JdTY0IG1hYywgbWFjX3ZpZCA9IDA7Ci0JdTggaWR4ID0gMDsKLQlpbnQgcmV0OwotCi0JLyogQ29udmVydCB0aGUgYXJyYXkgaW50byBhIDY0LWJpdCBNQUMgKi8KLQltYWMgPSBiY21fc2YyX21hY190b191NjQoYWRkcik7Ci0KLQkvKiBQZXJmb3JtIGEgcmVhZCBmb3IgdGhlIGdpdmVuIE1BQyBhbmQgVklEICovCi0JY29yZV93cml0ZXEocHJpdiwgbWFjLCBDT1JFX0FSTEFfTUFDKTsKLQljb3JlX3dyaXRlbChwcml2LCB2aWQsIENPUkVfQVJMQV9WSUQpOwotCi0JLyogSXNzdWUgYSByZWFkIG9wZXJhdGlvbiBmb3IgdGhpcyBNQUMgKi8KLQlyZXQgPSBiY21fc2YyX2FybF9yd19vcChwcml2LCAxKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gYmNtX3NmMl9hcmxfcmVhZChwcml2LCBtYWMsIHZpZCwgJmVudCwgJmlkeCwgaXNfdmFsaWQpOwotCS8qIElmIHRoaXMgaXMgYSByZWFkLCBqdXN0IGZpbmlzaCBub3cgKi8KLQlpZiAob3ApCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBXZSBjb3VsZCBub3QgZmluZCBhIG1hdGNoaW5nIE1BQywgc28gcmVzZXQgdG8gYSBuZXcgZW50cnkgKi8KLQlpZiAocmV0KSB7Ci0JCWZ3ZF9lbnRyeSA9IDA7Ci0JCWlkeCA9IDA7Ci0JfQotCi0JbWVtc2V0KCZlbnQsIDAsIHNpemVvZihlbnQpKTsKLQllbnQucG9ydCA9IHBvcnQ7Ci0JZW50LmlzX3ZhbGlkID0gaXNfdmFsaWQ7Ci0JZW50LnZpZCA9IHZpZDsKLQllbnQuaXNfc3RhdGljID0gdHJ1ZTsKLQltZW1jcHkoZW50Lm1hYywgYWRkciwgRVRIX0FMRU4pOwotCWJjbV9zZjJfYXJsX2Zyb21fZW50cnkoJm1hY192aWQsICZmd2RfZW50cnksICZlbnQpOwotCi0JY29yZV93cml0ZXEocHJpdiwgbWFjX3ZpZCwgQ09SRV9BUkxBX01BQ1ZJRF9FTlRSWShpZHgpKTsKLQljb3JlX3dyaXRlbChwcml2LCBmd2RfZW50cnksIENPUkVfQVJMQV9GV0RfRU5UUlkoaWR4KSk7Ci0KLQlyZXQgPSBiY21fc2YyX2FybF9yd19vcChwcml2LCAwKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JLyogUmUtcmVhZCB0aGUgZW50cnkgdG8gY2hlY2sgKi8KLQlyZXR1cm4gYmNtX3NmMl9hcmxfcmVhZChwcml2LCBtYWMsIHZpZCwgJmVudCwgJmlkeCwgaXNfdmFsaWQpOwotfQotCi1zdGF0aWMgaW50IGJjbV9zZjJfc3dfZmRiX3ByZXBhcmUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKLQkJCQkgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfZmRiICpmZGIsCi0JCQkJICBzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zICp0cmFucykKLXsKLQkvKiBXZSBkbyBub3QgbmVlZCB0byBkbyBhbnl0aGluZyBzcGVjaWZpYyBoZXJlIHlldCAqLwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBiY21fc2YyX3N3X2ZkYl9hZGQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X2ZkYiAqZmRiLAotCQkJICAgICAgIHN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zKQotewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKLQotCWlmIChiY21fc2YyX2FybF9vcChwcml2LCAwLCBwb3J0LCBmZGItPmFkZHIsIGZkYi0+dmlkLCB0cnVlKSkKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFkZCBNQUMgYWRkcmVzc1xuIiwgX19mdW5jX18pOwotfQotCi1zdGF0aWMgaW50IGJjbV9zZjJfc3dfZmRiX2RlbChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAotCQkJICAgICAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9mZGIgKmZkYikKLXsKLQlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZHNfdG9fcHJpdihkcyk7Ci0KLQlyZXR1cm4gYmNtX3NmMl9hcmxfb3AocHJpdiwgMCwgcG9ydCwgZmRiLT5hZGRyLCBmZGItPnZpZCwgZmFsc2UpOwotfQotCi1zdGF0aWMgaW50IGJjbV9zZjJfYXJsX3NlYXJjaF93YWl0KHN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYpCi17Ci0JdW5zaWduZWQgdGltZW91dCA9IDEwMDA7Ci0JdTMyIHJlZzsKLQotCWRvIHsKLQkJcmVnID0gY29yZV9yZWFkbChwcml2LCBDT1JFX0FSTEFfU1JDSF9DVEwpOwotCQlpZiAoIShyZWcgJiBBUkxBX1NSQ0hfU1RETikpCi0JCQlyZXR1cm4gMDsKLQotCQlpZiAocmVnICYgQVJMQV9TUkNIX1ZMSUQpCi0JCQlyZXR1cm4gMDsKLQotCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7Ci0JfSB3aGlsZSAodGltZW91dC0tKTsKLQotCXJldHVybiAtRVRJTUVET1VUOwotfQotCi1zdGF0aWMgdm9pZCBiY21fc2YyX2FybF9zZWFyY2hfcmQoc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiwgdTggaWR4LAotCQkJCSAgc3RydWN0IGJjbV9zZjJfYXJsX2VudHJ5ICplbnQpCi17Ci0JdTY0IG1hY192aWQ7Ci0JdTMyIGZ3ZF9lbnRyeTsKLQotCW1hY192aWQgPSBjb3JlX3JlYWRxKHByaXYsIENPUkVfQVJMQV9TUkNIX1JTTFRfTUFDVklEKGlkeCkpOwotCWZ3ZF9lbnRyeSA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9BUkxBX1NSQ0hfUlNMVChpZHgpKTsKLQliY21fc2YyX2FybF90b19lbnRyeShlbnQsIG1hY192aWQsIGZ3ZF9lbnRyeSk7Ci19Ci0KLXN0YXRpYyBpbnQgYmNtX3NmMl9zd19mZGJfY29weShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcG9ydCwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgYmNtX3NmMl9hcmxfZW50cnkgKmVudCwKLQkJCSAgICAgICBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X2ZkYiAqZmRiLAotCQkJICAgICAgIGludCAoKmNiKShzdHJ1Y3Qgc3dpdGNoZGV2X29iaiAqb2JqKSkKLXsKLQlpZiAoIWVudC0+aXNfdmFsaWQpCi0JCXJldHVybiAwOwotCi0JaWYgKHBvcnQgIT0gZW50LT5wb3J0KQotCQlyZXR1cm4gMDsKLQotCWV0aGVyX2FkZHJfY29weShmZGItPmFkZHIsIGVudC0+bWFjKTsKLQlmZGItPnZpZCA9IGVudC0+dmlkOwotCWZkYi0+bmRtX3N0YXRlID0gZW50LT5pc19zdGF0aWMgPyBOVURfTk9BUlAgOiBOVURfUkVBQ0hBQkxFOwotCi0JcmV0dXJuIGNiKCZmZGItPm9iaik7Ci19Ci0KLXN0YXRpYyBpbnQgYmNtX3NmMl9zd19mZGJfZHVtcChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAotCQkJICAgICAgIHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfZmRiICpmZGIsCi0JCQkgICAgICAgaW50ICgqY2IpKHN0cnVjdCBzd2l0Y2hkZXZfb2JqICpvYmopKQotewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHMtPnBvcnRzW3BvcnRdLm5ldGRldjsKLQlzdHJ1Y3QgYmNtX3NmMl9hcmxfZW50cnkgcmVzdWx0c1syXTsKLQl1bnNpZ25lZCBpbnQgY291bnQgPSAwOwotCWludCByZXQ7Ci0KLQkvKiBTdGFydCBzZWFyY2ggb3BlcmF0aW9uICovCi0JY29yZV93cml0ZWwocHJpdiwgQVJMQV9TUkNIX1NURE4sIENPUkVfQVJMQV9TUkNIX0NUTCk7Ci0KLQlkbyB7Ci0JCXJldCA9IGJjbV9zZjJfYXJsX3NlYXJjaF93YWl0KHByaXYpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQotCQkvKiBSZWFkIGJvdGggZW50cmllcywgdGhlbiByZXR1cm4gdGhlaXIgdmFsdWVzIGJhY2sgKi8KLQkJYmNtX3NmMl9hcmxfc2VhcmNoX3JkKHByaXYsIDAsICZyZXN1bHRzWzBdKTsKLQkJcmV0ID0gYmNtX3NmMl9zd19mZGJfY29weShkZXYsIHBvcnQsICZyZXN1bHRzWzBdLCBmZGIsIGNiKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJYmNtX3NmMl9hcmxfc2VhcmNoX3JkKHByaXYsIDEsICZyZXN1bHRzWzFdKTsKLQkJcmV0ID0gYmNtX3NmMl9zd19mZGJfY29weShkZXYsIHBvcnQsICZyZXN1bHRzWzFdLCBmZGIsIGNiKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJaWYgKCFyZXN1bHRzWzBdLmlzX3ZhbGlkICYmICFyZXN1bHRzWzFdLmlzX3ZhbGlkKQotCQkJYnJlYWs7Ci0KLQl9IHdoaWxlIChjb3VudCsrIDwgQ09SRV9BUkxBX05VTV9FTlRSSUVTKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGJjbV9zZjJfc3dfaW5kaXJfcncoc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiwgaW50IG9wLCBpbnQgYWRkciwKIAkJCSAgICAgICBpbnQgcmVnbnVtLCB1MTYgdmFsKQogewpAQCAtMTAzNiwxMiArNDY0LDEwIEBACiAKIHN0YXRpYyB2b2lkIGJjbV9zZjJfaW50cl9kaXNhYmxlKHN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYpCiB7Ci0JaW50cmwyXzBfd3JpdGVsKHByaXYsIDB4ZmZmZmZmZmYsIElOVFJMMl9DUFVfTUFTS19TRVQpOworCWludHJsMl8wX21hc2tfc2V0KHByaXYsIDB4ZmZmZmZmZmYpOwogCWludHJsMl8wX3dyaXRlbChwcml2LCAweGZmZmZmZmZmLCBJTlRSTDJfQ1BVX0NMRUFSKTsKLQlpbnRybDJfMF93cml0ZWwocHJpdiwgMCwgSU5UUkwyX0NQVV9NQVNLX0NMRUFSKTsKLQlpbnRybDJfMV93cml0ZWwocHJpdiwgMHhmZmZmZmZmZiwgSU5UUkwyX0NQVV9NQVNLX1NFVCk7CisJaW50cmwyXzFfbWFza19zZXQocHJpdiwgMHhmZmZmZmZmZik7CiAJaW50cmwyXzFfd3JpdGVsKHByaXYsIDB4ZmZmZmZmZmYsIElOVFJMMl9DUFVfQ0xFQVIpOwotCWludHJsMl8xX3dyaXRlbChwcml2LCAwLCBJTlRSTDJfQ1BVX01BU0tfQ0xFQVIpOwogfQogCiBzdGF0aWMgdm9pZCBiY21fc2YyX2lkZW50aWZ5X3BvcnRzKHN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYsCkBAIC0xMDgyLDcgKzUwOCw3IEBACiAKIHN0YXRpYyBpbnQgYmNtX3NmMl9tZGlvX3JlZ2lzdGVyKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKIHsKLQlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGJjbV9zZjJfdG9fcHJpdihkcyk7CiAJc3RydWN0IGRldmljZV9ub2RlICpkbjsKIAlzdGF0aWMgaW50IGluZGV4OwogCWludCBlcnI7CkBAIC0xMTQ2LDE0ICs1NzIsOSBAQAogCQlvZl9ub2RlX3B1dChwcml2LT5tYXN0ZXJfbWlpX2RuKTsKIH0KIAotc3RhdGljIGludCBiY21fc2YyX3N3X3NldF9hZGRyKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgdTggKmFkZHIpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyB1MzIgYmNtX3NmMl9zd19nZXRfcGh5X2ZsYWdzKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQpCiB7Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBiY21fc2YyX3RvX3ByaXYoZHMpOwogCiAJLyogVGhlIEJDTTd4eHggUEhZIGRyaXZlciBleHBlY3RzIHRvIGZpbmQgdGhlIGludGVncmF0ZWQgUEhZIHJldmlzaW9uCiAJICogaW4gYml0cyAxNTo4IGFuZCB0aGUgcGF0Y2ggbGV2ZWwgaW4gYml0cyA3OjAgd2hpY2ggaXMgZXhhY3RseSB3aGF0CkBAIC0xMTY2LDcgKzU4Nyw3IEBACiBzdGF0aWMgdm9pZCBiY21fc2YyX3N3X2FkanVzdF9saW5rKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCQkJICAgc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKIHsKLQlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGJjbV9zZjJfdG9fcHJpdihkcyk7CiAJdTMyIGlkX21vZGVfZGlzID0gMCwgcG9ydF9tb2RlOwogCWNvbnN0IGNoYXIgKnN0ciA9IE5VTEw7CiAJdTMyIHJlZzsKQEAgLTEyNDYsNyArNjY3LDcgQEAKIHN0YXRpYyB2b2lkIGJjbV9zZjJfc3dfZml4ZWRfbGlua191cGRhdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAkJCQkJIHN0cnVjdCBmaXhlZF9waHlfc3RhdHVzICpzdGF0dXMpCiB7Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBiY21fc2YyX3RvX3ByaXYoZHMpOwogCXUzMiBkdXBsZXgsIHBhdXNlOwogCXUzMiByZWc7CiAKQEAgLTEyOTgsNyArNzE5LDcgQEAKIAogc3RhdGljIGludCBiY21fc2YyX3N3X3N1c3BlbmQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQogewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gYmNtX3NmMl90b19wcml2KGRzKTsKIAl1bnNpZ25lZCBpbnQgcG9ydDsKIAogCWJjbV9zZjJfaW50cl9kaXNhYmxlKHByaXYpOwpAQCAtMTMxOCw3ICs3MzksNyBAQAogCiBzdGF0aWMgaW50IGJjbV9zZjJfc3dfcmVzdW1lKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKIHsKLQlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGJjbV9zZjJfdG9fcHJpdihkcyk7CiAJdW5zaWduZWQgaW50IHBvcnQ7CiAJaW50IHJldDsKIApAQCAtMTM0NSw3ICs3NjYsNyBAQAogCQkJICAgICAgIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcCA9IGRzLT5kc3RbZHMtPmluZGV4XS5tYXN0ZXJfbmV0ZGV2OwotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gYmNtX3NmMl90b19wcml2KGRzKTsKIAlzdHJ1Y3QgZXRodG9vbF93b2xpbmZvIHB3b2w7CiAKIAkvKiBHZXQgdGhlIHBhcmVudCBkZXZpY2UgV29MIHNldHRpbmdzICovCkBAIC0xMzY4LDcgKzc4OSw3IEBACiAJCQkgICAgICBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKnAgPSBkcy0+ZHN0W2RzLT5pbmRleF0ubWFzdGVyX25ldGRldjsKLQlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGJjbV9zZjJfdG9fcHJpdihkcyk7CiAJczggY3B1X3BvcnQgPSBkcy0+ZHN0W2RzLT5pbmRleF0uY3B1X3BvcnQ7CiAJc3RydWN0IGV0aHRvb2xfd29saW5mbyBwd29sOwogCkBAIC0xMzkzLDQzICs4MTQsMzIgQEAKIAlyZXR1cm4gcC0+ZXRodG9vbF9vcHMtPnNldF93b2wocCwgd29sKTsKIH0KIAotc3RhdGljIHZvaWQgYmNtX3NmMl9lbmFibGVfdmxhbihzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2LCBib29sIGVuYWJsZSkKK3N0YXRpYyBpbnQgYmNtX3NmMl92bGFuX29wX3dhaXQoc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdikKIHsKLQl1MzIgbWdtdCwgdmMwLCB2YzEsIHZjNCwgdmM1OworCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gMTA7CisJdTMyIHJlZzsKIAotCW1nbXQgPSBjb3JlX3JlYWRsKHByaXYsIENPUkVfU1dNT0RFKTsKLQl2YzAgPSBjb3JlX3JlYWRsKHByaXYsIENPUkVfVkxBTl9DVFJMMCk7Ci0JdmMxID0gY29yZV9yZWFkbChwcml2LCBDT1JFX1ZMQU5fQ1RSTDEpOwotCXZjNCA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9WTEFOX0NUUkw0KTsKLQl2YzUgPSBjb3JlX3JlYWRsKHByaXYsIENPUkVfVkxBTl9DVFJMNSk7CisJZG8geworCQlyZWcgPSBjb3JlX3JlYWRsKHByaXYsIENPUkVfQVJMQV9WVEJMX1JXQ1RSTCk7CisJCWlmICghKHJlZyAmIEFSTEFfVlRCTF9TVEROKSkKKwkJCXJldHVybiAwOwogCi0JbWdtdCAmPSB+U1dfRldER19NT0RFOworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CisJfSB3aGlsZSAodGltZW91dC0tKTsKIAotCWlmIChlbmFibGUpIHsKLQkJdmMwIHw9IFZMQU5fRU4gfCBWTEFOX0xFQVJOX01PREVfSVZMOwotCQl2YzEgfD0gRU5fUlNWX01DQVNUX1VOVEFHIHwgRU5fUlNWX01DQVNUX0ZXRE1BUDsKLQkJdmM0ICY9IH4oSU5HUl9WSURfQ0hLX01BU0sgPDwgSU5HUl9WSURfQ0hLX1NISUZUKTsKLQkJdmM0IHw9IElOR1JfVklEX0NIS19EUk9QOwotCQl2YzUgfD0gRFJPUF9WVEFCTEVfTUlTUyB8IEVOX1ZJRF9GRkZfRldEOwotCX0gZWxzZSB7Ci0JCXZjMCAmPSB+KFZMQU5fRU4gfCBWTEFOX0xFQVJOX01PREVfSVZMKTsKLQkJdmMxICY9IH4oRU5fUlNWX01DQVNUX1VOVEFHIHwgRU5fUlNWX01DQVNUX0ZXRE1BUCk7Ci0JCXZjNCAmPSB+KElOR1JfVklEX0NIS19NQVNLIDw8IElOR1JfVklEX0NIS19TSElGVCk7Ci0JCXZjNSAmPSB+KERST1BfVlRBQkxFX01JU1MgfCBFTl9WSURfRkZGX0ZXRCk7Ci0JCXZjNCB8PSBJTkdSX1ZJRF9DSEtfVklEX1ZJT0xfSU1QOwotCX0KKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KIAotCWNvcmVfd3JpdGVsKHByaXYsIHZjMCwgQ09SRV9WTEFOX0NUUkwwKTsKLQljb3JlX3dyaXRlbChwcml2LCB2YzEsIENPUkVfVkxBTl9DVFJMMSk7Ci0JY29yZV93cml0ZWwocHJpdiwgMCwgQ09SRV9WTEFOX0NUUkwzKTsKLQljb3JlX3dyaXRlbChwcml2LCB2YzQsIENPUkVfVkxBTl9DVFJMNCk7Ci0JY29yZV93cml0ZWwocHJpdiwgdmM1LCBDT1JFX1ZMQU5fQ1RSTDUpOwotCWNvcmVfd3JpdGVsKHByaXYsIG1nbXQsIENPUkVfU1dNT0RFKTsKK3N0YXRpYyBpbnQgYmNtX3NmMl92bGFuX29wKHN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYsIHU4IG9wKQoreworCWNvcmVfd3JpdGVsKHByaXYsIEFSTEFfVlRCTF9TVEROIHwgb3AsIENPUkVfQVJMQV9WVEJMX1JXQ1RSTCk7CisKKwlyZXR1cm4gYmNtX3NmMl92bGFuX29wX3dhaXQocHJpdik7CiB9CiAKIHN0YXRpYyB2b2lkIGJjbV9zZjJfc3dfY29uZmlndXJlX3ZsYW4oc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQogewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gYmNtX3NmMl90b19wcml2KGRzKTsKIAl1bnNpZ25lZCBpbnQgcG9ydDsKIAogCS8qIENsZWFyIGFsbCBWTEFOcyAqLwpAQCAtMTQ0MywxNjIgKzg1MywxOTkgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgYmNtX3NmMl9zd192bGFuX2ZpbHRlcmluZyhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAotCQkJCSAgICAgYm9vbCB2bGFuX2ZpbHRlcmluZykKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBiY21fc2YyX3N3X3ZsYW5fcHJlcGFyZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAotCQkJCSAgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfdmxhbiAqdmxhbiwKLQkJCQkgICBzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zICp0cmFucykKLXsKLQlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZHNfdG9fcHJpdihkcyk7Ci0KLQliY21fc2YyX2VuYWJsZV92bGFuKHByaXYsIHRydWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJjbV9zZjJfc3dfdmxhbl9hZGQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKLQkJCQljb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X3ZsYW4gKnZsYW4sCi0JCQkJc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpCi17Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOwotCWJvb2wgdW50YWdnZWQgPSB2bGFuLT5mbGFncyAmIEJSSURHRV9WTEFOX0lORk9fVU5UQUdHRUQ7Ci0JYm9vbCBwdmlkID0gdmxhbi0+ZmxhZ3MgJiBCUklER0VfVkxBTl9JTkZPX1BWSUQ7Ci0JczggY3B1X3BvcnQgPSBkcy0+ZHN0LT5jcHVfcG9ydDsKLQlzdHJ1Y3QgYmNtX3NmMl92bGFuICp2bDsKLQl1MTYgdmlkOwotCi0JZm9yICh2aWQgPSB2bGFuLT52aWRfYmVnaW47IHZpZCA8PSB2bGFuLT52aWRfZW5kOyArK3ZpZCkgewotCQl2bCA9ICZwcml2LT52bGFuc1t2aWRdOwotCi0JCWJjbV9zZjJfZ2V0X3ZsYW5fZW50cnkocHJpdiwgdmlkLCB2bCk7Ci0KLQkJdmwtPm1lbWJlcnMgfD0gQklUKHBvcnQpIHwgQklUKGNwdV9wb3J0KTsKLQkJaWYgKHVudGFnZ2VkKQotCQkJdmwtPnVudGFnIHw9IEJJVChwb3J0KSB8IEJJVChjcHVfcG9ydCk7Ci0JCWVsc2UKLQkJCXZsLT51bnRhZyAmPSB+KEJJVChwb3J0KSB8IEJJVChjcHVfcG9ydCkpOwotCi0JCWJjbV9zZjJfc2V0X3ZsYW5fZW50cnkocHJpdiwgdmlkLCB2bCk7Ci0JCWJjbV9zZjJfc3dfZmFzdF9hZ2Vfdmxhbihwcml2LCB2aWQpOwotCX0KLQotCWlmIChwdmlkKSB7Ci0JCWNvcmVfd3JpdGVsKHByaXYsIHZsYW4tPnZpZF9lbmQsIENPUkVfREVGQVVMVF8xUV9UQUdfUChwb3J0KSk7Ci0JCWNvcmVfd3JpdGVsKHByaXYsIHZsYW4tPnZpZF9lbmQsCi0JCQkgICAgQ09SRV9ERUZBVUxUXzFRX1RBR19QKGNwdV9wb3J0KSk7Ci0JCWJjbV9zZjJfc3dfZmFzdF9hZ2Vfdmxhbihwcml2LCB2aWQpOwotCX0KLX0KLQotc3RhdGljIGludCBiY21fc2YyX3N3X3ZsYW5fZGVsKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF92bGFuICp2bGFuKQotewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKLQlib29sIHVudGFnZ2VkID0gdmxhbi0+ZmxhZ3MgJiBCUklER0VfVkxBTl9JTkZPX1VOVEFHR0VEOwotCXM4IGNwdV9wb3J0ID0gZHMtPmRzdC0+Y3B1X3BvcnQ7Ci0Jc3RydWN0IGJjbV9zZjJfdmxhbiAqdmw7Ci0JdTE2IHZpZCwgcHZpZDsKLQlpbnQgcmV0OwotCi0JcHZpZCA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9ERUZBVUxUXzFRX1RBR19QKHBvcnQpKTsKLQotCWZvciAodmlkID0gdmxhbi0+dmlkX2JlZ2luOyB2aWQgPD0gdmxhbi0+dmlkX2VuZDsgKyt2aWQpIHsKLQkJdmwgPSAmcHJpdi0+dmxhbnNbdmlkXTsKLQotCQlyZXQgPSBiY21fc2YyX2dldF92bGFuX2VudHJ5KHByaXYsIHZpZCwgdmwpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQotCQl2bC0+bWVtYmVycyAmPSB+QklUKHBvcnQpOwotCQlpZiAoKHZsLT5tZW1iZXJzICYgQklUKGNwdV9wb3J0KSkgPT0gQklUKGNwdV9wb3J0KSkKLQkJCXZsLT5tZW1iZXJzID0gMDsKLQkJaWYgKHB2aWQgPT0gdmlkKQotCQkJcHZpZCA9IDA7Ci0JCWlmICh1bnRhZ2dlZCkgewotCQkJdmwtPnVudGFnICY9IH5CSVQocG9ydCk7Ci0JCQlpZiAoKHZsLT51bnRhZyAmIEJJVChwb3J0KSkgPT0gQklUKGNwdV9wb3J0KSkKLQkJCQl2bC0+dW50YWcgPSAwOwotCQl9Ci0KLQkJYmNtX3NmMl9zZXRfdmxhbl9lbnRyeShwcml2LCB2aWQsIHZsKTsKLQkJYmNtX3NmMl9zd19mYXN0X2FnZV92bGFuKHByaXYsIHZpZCk7Ci0JfQotCi0JY29yZV93cml0ZWwocHJpdiwgcHZpZCwgQ09SRV9ERUZBVUxUXzFRX1RBR19QKHBvcnQpKTsKLQljb3JlX3dyaXRlbChwcml2LCBwdmlkLCBDT1JFX0RFRkFVTFRfMVFfVEFHX1AoY3B1X3BvcnQpKTsKLQliY21fc2YyX3N3X2Zhc3RfYWdlX3ZsYW4ocHJpdiwgdmlkKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJjbV9zZjJfc3dfdmxhbl9kdW1wKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCi0JCQkJc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF92bGFuICp2bGFuLAotCQkJCWludCAoKmNiKShzdHJ1Y3Qgc3dpdGNoZGV2X29iaiAqb2JqKSkKLXsKLQlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZHNfdG9fcHJpdihkcyk7Ci0Jc3RydWN0IGJjbV9zZjJfcG9ydF9zdGF0dXMgKnAgPSAmcHJpdi0+cG9ydF9zdHNbcG9ydF07Ci0Jc3RydWN0IGJjbV9zZjJfdmxhbiAqdmw7Ci0JdTE2IHZpZCwgcHZpZDsKLQlpbnQgZXJyID0gMDsKLQotCXB2aWQgPSBjb3JlX3JlYWRsKHByaXYsIENPUkVfREVGQVVMVF8xUV9UQUdfUChwb3J0KSk7Ci0KLQlmb3IgKHZpZCA9IDA7IHZpZCA8IFZMQU5fTl9WSUQ7IHZpZCsrKSB7Ci0JCXZsID0gJnByaXYtPnZsYW5zW3ZpZF07Ci0KLQkJaWYgKCEodmwtPm1lbWJlcnMgJiBCSVQocG9ydCkpKQotCQkJY29udGludWU7Ci0KLQkJdmxhbi0+dmlkX2JlZ2luID0gdmxhbi0+dmlkX2VuZCA9IHZpZDsKLQkJdmxhbi0+ZmxhZ3MgPSAwOwotCi0JCWlmICh2bC0+dW50YWcgJiBCSVQocG9ydCkpCi0JCQl2bGFuLT5mbGFncyB8PSBCUklER0VfVkxBTl9JTkZPX1VOVEFHR0VEOwotCQlpZiAocC0+cHZpZCA9PSB2aWQpCi0JCQl2bGFuLT5mbGFncyB8PSBCUklER0VfVkxBTl9JTkZPX1BWSUQ7Ci0KLQkJZXJyID0gY2IoJnZsYW4tPm9iaik7Ci0JCWlmIChlcnIpCi0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotCiBzdGF0aWMgaW50IGJjbV9zZjJfc3dfc2V0dXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQogewotCWNvbnN0IGNoYXIgKnJlZ19uYW1lc1tCQ01fU0YyX1JFR1NfTlVNXSA9IEJDTV9TRjJfUkVHU19OQU1FOwotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOwotCXZvaWQgX19pb21lbSAqKmJhc2U7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGJjbV9zZjJfdG9fcHJpdihkcyk7CiAJdW5zaWduZWQgaW50IHBvcnQ7CisKKwkvKiBFbmFibGUgYWxsIHZhbGlkIHBvcnRzIGFuZCBkaXNhYmxlIHRob3NlIHVudXNlZCAqLworCWZvciAocG9ydCA9IDA7IHBvcnQgPCBwcml2LT5od19wYXJhbXMubnVtX3BvcnRzOyBwb3J0KyspIHsKKwkJLyogSU1QIHBvcnQgcmVjZWl2ZXMgc3BlY2lhbCB0cmVhdG1lbnQgKi8KKwkJaWYgKCgxIDw8IHBvcnQpICYgZHMtPmVuYWJsZWRfcG9ydF9tYXNrKQorCQkJYmNtX3NmMl9wb3J0X3NldHVwKGRzLCBwb3J0LCBOVUxMKTsKKwkJZWxzZSBpZiAoZHNhX2lzX2NwdV9wb3J0KGRzLCBwb3J0KSkKKwkJCWJjbV9zZjJfaW1wX3NldHVwKGRzLCBwb3J0KTsKKwkJZWxzZQorCQkJYmNtX3NmMl9wb3J0X2Rpc2FibGUoZHMsIHBvcnQsIE5VTEwpOworCX0KKworCWJjbV9zZjJfc3dfY29uZmlndXJlX3ZsYW4oZHMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBTV0lUQ0hfQ09SRSByZWdpc3RlciBzcGFjZSBpcyBtYW5hZ2VkIGJ5IGI1MyBidXQgb3BlcmF0ZXMgb24gYSBwYWdlICsKKyAqIHJlZ2lzdGVyIGJhc2lzIHNvIHdlIG5lZWQgdG8gdHJhbnNsYXRlIHRoYXQgaW50byBhbiBhZGRyZXNzIHRoYXQgdGhlCisgKiBidXMtZ2x1ZSB1bmRlcnN0YW5kcy4KKyAqLworI2RlZmluZSBTRjJfUEFHRV9SRUdfTUtBRERSKHBhZ2UsIHJlZykJKChwYWdlKSA8PCAxMCB8IChyZWcpIDw8IDIpCisKK3N0YXRpYyBpbnQgYmNtX3NmMl9jb3JlX3JlYWQ4KHN0cnVjdCBiNTNfZGV2aWNlICpkZXYsIHU4IHBhZ2UsIHU4IHJlZywKKwkJCSAgICAgIHU4ICp2YWwpCit7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKworCSp2YWwgPSBjb3JlX3JlYWRsKHByaXYsIFNGMl9QQUdFX1JFR19NS0FERFIocGFnZSwgcmVnKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY21fc2YyX2NvcmVfcmVhZDE2KHN0cnVjdCBiNTNfZGV2aWNlICpkZXYsIHU4IHBhZ2UsIHU4IHJlZywKKwkJCSAgICAgICB1MTYgKnZhbCkKK3sKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCisJKnZhbCA9IGNvcmVfcmVhZGwocHJpdiwgU0YyX1BBR0VfUkVHX01LQUREUihwYWdlLCByZWcpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbV9zZjJfY29yZV9yZWFkMzIoc3RydWN0IGI1M19kZXZpY2UgKmRldiwgdTggcGFnZSwgdTggcmVnLAorCQkJICAgICAgIHUzMiAqdmFsKQoreworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisKKwkqdmFsID0gY29yZV9yZWFkbChwcml2LCBTRjJfUEFHRV9SRUdfTUtBRERSKHBhZ2UsIHJlZykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtX3NmMl9jb3JlX3JlYWQ2NChzdHJ1Y3QgYjUzX2RldmljZSAqZGV2LCB1OCBwYWdlLCB1OCByZWcsCisJCQkgICAgICAgdTY0ICp2YWwpCit7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKworCSp2YWwgPSBjb3JlX3JlYWRxKHByaXYsIFNGMl9QQUdFX1JFR19NS0FERFIocGFnZSwgcmVnKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY21fc2YyX2NvcmVfd3JpdGU4KHN0cnVjdCBiNTNfZGV2aWNlICpkZXYsIHU4IHBhZ2UsIHU4IHJlZywKKwkJCSAgICAgICB1OCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCisJY29yZV93cml0ZWwocHJpdiwgdmFsdWUsIFNGMl9QQUdFX1JFR19NS0FERFIocGFnZSwgcmVnKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY21fc2YyX2NvcmVfd3JpdGUxNihzdHJ1Y3QgYjUzX2RldmljZSAqZGV2LCB1OCBwYWdlLCB1OCByZWcsCisJCQkJdTE2IHZhbHVlKQoreworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisKKwljb3JlX3dyaXRlbChwcml2LCB2YWx1ZSwgU0YyX1BBR0VfUkVHX01LQUREUihwYWdlLCByZWcpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbV9zZjJfY29yZV93cml0ZTMyKHN0cnVjdCBiNTNfZGV2aWNlICpkZXYsIHU4IHBhZ2UsIHU4IHJlZywKKwkJCQl1MzIgdmFsdWUpCit7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKworCWNvcmVfd3JpdGVsKHByaXYsIHZhbHVlLCBTRjJfUEFHRV9SRUdfTUtBRERSKHBhZ2UsIHJlZykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtX3NmMl9jb3JlX3dyaXRlNjQoc3RydWN0IGI1M19kZXZpY2UgKmRldiwgdTggcGFnZSwgdTggcmVnLAorCQkJCXU2NCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCisJY29yZV93cml0ZXEocHJpdiwgdmFsdWUsIFNGMl9QQUdFX1JFR19NS0FERFIocGFnZSwgcmVnKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBiNTNfaW9fb3BzIGJjbV9zZjJfaW9fb3BzID0geworCS5yZWFkOAk9IGJjbV9zZjJfY29yZV9yZWFkOCwKKwkucmVhZDE2CT0gYmNtX3NmMl9jb3JlX3JlYWQxNiwKKwkucmVhZDMyCT0gYmNtX3NmMl9jb3JlX3JlYWQzMiwKKwkucmVhZDQ4CT0gYmNtX3NmMl9jb3JlX3JlYWQ2NCwKKwkucmVhZDY0CT0gYmNtX3NmMl9jb3JlX3JlYWQ2NCwKKwkud3JpdGU4CT0gYmNtX3NmMl9jb3JlX3dyaXRlOCwKKwkud3JpdGUxNiA9IGJjbV9zZjJfY29yZV93cml0ZTE2LAorCS53cml0ZTMyID0gYmNtX3NmMl9jb3JlX3dyaXRlMzIsCisJLndyaXRlNDggPSBiY21fc2YyX2NvcmVfd3JpdGU2NCwKKwkud3JpdGU2NCA9IGJjbV9zZjJfY29yZV93cml0ZTY0LAorfTsKKworc3RhdGljIGludCBiY21fc2YyX3N3X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJY29uc3QgY2hhciAqcmVnX25hbWVzW0JDTV9TRjJfUkVHU19OVU1dID0gQkNNX1NGMl9SRUdTX05BTUU7CisJc3RydWN0IGRldmljZV9ub2RlICpkbiA9IHBkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBiNTNfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdjsKKwlzdHJ1Y3QgYjUzX2RldmljZSAqZGV2OworCXN0cnVjdCBkc2Ffc3dpdGNoICpkczsKKwl2b2lkIF9faW9tZW0gKipiYXNlOworCXN0cnVjdCByZXNvdXJjZSAqcjsKIAl1bnNpZ25lZCBpbnQgaTsKIAl1MzIgcmVnLCByZXY7CiAJaW50IHJldDsKIAorCXByaXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldiA9IGI1M19zd2l0Y2hfYWxsb2MoJnBkZXYtPmRldiwgJmJjbV9zZjJfaW9fb3BzLCBwcml2KTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBBdXRvLWRldGVjdGlvbiB1c2luZyBzdGFuZGFyZCByZWdpc3RlcnMgd2lsbCBub3Qgd29yaywgc28KKwkgKiBwcm92aWRlIGFuIGluZGljYXRpb24gb2Ygd2hhdCBraW5kIG9mIGRldmljZSB3ZSBhcmUgZm9yCisJICogYjUzX2NvbW1vbiB0byB3b3JrIHdpdGgKKwkgKi8KKwlwZGF0YS0+Y2hpcF9pZCA9IEJDTTc0NDVfREVWSUNFX0lEOworCWRldi0+cGRhdGEgPSBwZGF0YTsKKworCXByaXYtPmRldiA9IGRldjsKKwlkcyA9IGRldi0+ZHM7CisKKwkvKiBPdmVycmlkZSB0aGUgcGFydHMgdGhhdCBhcmUgbm9uLXN0YW5kYXJkIHdydC4gbm9ybWFsIGI1MyBkZXZpY2VzICovCisJZHMtPm9wcy0+Z2V0X3RhZ19wcm90b2NvbCA9IGJjbV9zZjJfc3dfZ2V0X3RhZ19wcm90b2NvbDsKKwlkcy0+b3BzLT5zZXR1cCA9IGJjbV9zZjJfc3dfc2V0dXA7CisJZHMtPm9wcy0+Z2V0X3BoeV9mbGFncyA9IGJjbV9zZjJfc3dfZ2V0X3BoeV9mbGFnczsKKwlkcy0+b3BzLT5hZGp1c3RfbGluayA9IGJjbV9zZjJfc3dfYWRqdXN0X2xpbms7CisJZHMtPm9wcy0+Zml4ZWRfbGlua191cGRhdGUgPSBiY21fc2YyX3N3X2ZpeGVkX2xpbmtfdXBkYXRlOworCWRzLT5vcHMtPnN1c3BlbmQgPSBiY21fc2YyX3N3X3N1c3BlbmQ7CisJZHMtPm9wcy0+cmVzdW1lID0gYmNtX3NmMl9zd19yZXN1bWU7CisJZHMtPm9wcy0+Z2V0X3dvbCA9IGJjbV9zZjJfc3dfZ2V0X3dvbDsKKwlkcy0+b3BzLT5zZXRfd29sID0gYmNtX3NmMl9zd19zZXRfd29sOworCWRzLT5vcHMtPnBvcnRfZW5hYmxlID0gYmNtX3NmMl9wb3J0X3NldHVwOworCWRzLT5vcHMtPnBvcnRfZGlzYWJsZSA9IGJjbV9zZjJfcG9ydF9kaXNhYmxlOworCWRzLT5vcHMtPmdldF9lZWUgPSBiY21fc2YyX3N3X2dldF9lZWU7CisJZHMtPm9wcy0+c2V0X2VlZSA9IGJjbV9zZjJfc3dfc2V0X2VlZTsKKworCS8qIEF2b2lkIGhhdmluZyBEU0EgZnJlZSBvdXIgc2xhdmUgTURJTyBidXMgKGNoZWNraW5nIGZvcgorCSAqIGRzLT5zbGF2ZV9taWlfYnVzIGFuZCBkcy0+b3BzLT5waHlfcmVhZCBiZWluZyBub24tTlVMTCkKKwkgKi8KKwlkcy0+b3BzLT5waHlfcmVhZCA9IE5VTEw7CisKKwlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgcHJpdik7CisKIAlzcGluX2xvY2tfaW5pdCgmcHJpdi0+aW5kaXJfbG9jayk7CiAJbXV0ZXhfaW5pdCgmcHJpdi0+c3RhdHNfbXV0ZXgpOwogCi0JLyogQWxsIHRoZSBpbnRlcmVzdGluZyBwcm9wZXJ0aWVzIGFyZSBhdCB0aGUgcGFyZW50IGRldmljZV9ub2RlCi0JICogbGV2ZWwKLQkgKi8KLQlkbiA9IGRzLT5jZC0+b2Zfbm9kZS0+cGFyZW50OwotCWJjbV9zZjJfaWRlbnRpZnlfcG9ydHMocHJpdiwgZHMtPmNkLT5vZl9ub2RlKTsKKwliY21fc2YyX2lkZW50aWZ5X3BvcnRzKHByaXYsIGRuLT5jaGlsZCk7CiAKIAlwcml2LT5pcnEwID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoZG4sIDApOwogCXByaXYtPmlycTEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChkbiwgMSk7CiAKIAliYXNlID0gJnByaXYtPmNvcmU7CiAJZm9yIChpID0gMDsgaSA8IEJDTV9TRjJfUkVHU19OVU07IGkrKykgewotCQkqYmFzZSA9IG9mX2lvbWFwKGRuLCBpKTsKLQkJaWYgKCpiYXNlID09IE5VTEwpIHsKKwkJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgaSk7CisJCSpiYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHIpOworCQlpZiAoSVNfRVJSKCpiYXNlKSkgewogCQkJcHJfZXJyKCJ1bmFibGUgdG8gZmluZCByZWdpc3RlcjogJXNcbiIsIHJlZ19uYW1lc1tpXSk7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBvdXRfdW5tYXA7CisJCQlyZXR1cm4gUFRSX0VSUigqYmFzZSk7CiAJCX0KIAkJYmFzZSsrOwogCX0KQEAgLTE2MDYsMzAgKzEwNTMsMzAgQEAKIAlyZXQgPSBiY21fc2YyX3N3X3JzdChwcml2KTsKIAlpZiAocmV0KSB7CiAJCXByX2VycigidW5hYmxlIHRvIHNvZnR3YXJlIHJlc2V0IHN3aXRjaDogJWRcbiIsIHJldCk7Ci0JCWdvdG8gb3V0X3VubWFwOworCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldCA9IGJjbV9zZjJfbWRpb19yZWdpc3Rlcihkcyk7CiAJaWYgKHJldCkgewogCQlwcl9lcnIoImZhaWxlZCB0byByZWdpc3RlciBNRElPIGJ1c1xuIik7Ci0JCWdvdG8gb3V0X3VubWFwOworCQlyZXR1cm4gcmV0OwogCX0KIAogCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgYW5kIHJlcXVlc3QgdGhlbSAqLwogCWJjbV9zZjJfaW50cl9kaXNhYmxlKHByaXYpOwogCi0JcmV0ID0gcmVxdWVzdF9pcnEocHJpdi0+aXJxMCwgYmNtX3NmMl9zd2l0Y2hfMF9pc3IsIDAsCi0JCQkgICJzd2l0Y2hfMCIsIHByaXYpOworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgcHJpdi0+aXJxMCwgYmNtX3NmMl9zd2l0Y2hfMF9pc3IsIDAsCisJCQkgICAgICAgInN3aXRjaF8wIiwgcHJpdik7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJfZXJyKCJmYWlsZWQgdG8gcmVxdWVzdCBzd2l0Y2hfMCBJUlFcbiIpOwogCQlnb3RvIG91dF9tZGlvOwogCX0KIAotCXJldCA9IHJlcXVlc3RfaXJxKHByaXYtPmlycTEsIGJjbV9zZjJfc3dpdGNoXzFfaXNyLCAwLAotCQkJICAic3dpdGNoXzEiLCBwcml2KTsKKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIHByaXYtPmlycTEsIGJjbV9zZjJfc3dpdGNoXzFfaXNyLCAwLAorCQkJICAgICAgICJzd2l0Y2hfMSIsIHByaXYpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByX2VycigiZmFpbGVkIHRvIHJlcXVlc3Qgc3dpdGNoXzEgSVJRXG4iKTsKLQkJZ290byBvdXRfZnJlZV9pcnEwOworCQlnb3RvIG91dF9tZGlvOwogCX0KIAogCS8qIFJlc2V0IHRoZSBNSUIgY291bnRlcnMgKi8KQEAgLTE2NDksMTkgKzEwOTYsNiBAQAogCQkJCSAmcHJpdi0+aHdfcGFyYW1zLm51bV9ncGh5KSkKIAkJcHJpdi0+aHdfcGFyYW1zLm51bV9ncGh5ID0gMTsKIAotCS8qIEVuYWJsZSBhbGwgdmFsaWQgcG9ydHMgYW5kIGRpc2FibGUgdGhvc2UgdW51c2VkICovCi0JZm9yIChwb3J0ID0gMDsgcG9ydCA8IHByaXYtPmh3X3BhcmFtcy5udW1fcG9ydHM7IHBvcnQrKykgewotCQkvKiBJTVAgcG9ydCByZWNlaXZlcyBzcGVjaWFsIHRyZWF0bWVudCAqLwotCQlpZiAoKDEgPDwgcG9ydCkgJiBkcy0+ZW5hYmxlZF9wb3J0X21hc2spCi0JCQliY21fc2YyX3BvcnRfc2V0dXAoZHMsIHBvcnQsIE5VTEwpOwotCQllbHNlIGlmIChkc2FfaXNfY3B1X3BvcnQoZHMsIHBvcnQpKQotCQkJYmNtX3NmMl9pbXBfc2V0dXAoZHMsIHBvcnQpOwotCQllbHNlCi0JCQliY21fc2YyX3BvcnRfZGlzYWJsZShkcywgcG9ydCwgTlVMTCk7Ci0JfQotCi0JYmNtX3NmMl9zd19jb25maWd1cmVfdmxhbihkcyk7Ci0KIAlyZXYgPSByZWdfcmVhZGwocHJpdiwgUkVHX1NXSVRDSF9SRVZJU0lPTik7CiAJcHJpdi0+aHdfcGFyYW1zLnRvcF9yZXYgPSAocmV2ID4+IFNXSVRDSF9UT1BfUkVWX1NISUZUKSAmCiAJCQkJCVNXSVRDSF9UT1BfUkVWX01BU0s7CkBAIC0xNjcwLDYgKzExMDQsMTAgQEAKIAlyZXYgPSByZWdfcmVhZGwocHJpdiwgUkVHX1BIWV9SRVZJU0lPTik7CiAJcHJpdi0+aHdfcGFyYW1zLmdwaHlfcmV2ID0gcmV2ICYgUEhZX1JFVklTSU9OX01BU0s7CiAKKwlyZXQgPSBiNTNfc3dpdGNoX3JlZ2lzdGVyKGRldik7CisJaWYgKHJldCkKKwkJZ290byBvdXRfbWRpbzsKKwogCXByX2luZm8oIlN0YXJmaWdodGVyIDIgdG9wOiAleC4lMDJ4LCBjb3JlOiAleC4lMDJ4IGJhc2U6IDB4JXAsIElSUXM6ICVkLCAlZFxuIiwKIAkJcHJpdi0+aHdfcGFyYW1zLnRvcF9yZXYgPj4gOCwgcHJpdi0+aHdfcGFyYW1zLnRvcF9yZXYgJiAweGZmLAogCQlwcml2LT5od19wYXJhbXMuY29yZV9yZXYgPj4gOCwgcHJpdi0+aHdfcGFyYW1zLmNvcmVfcmV2ICYgMHhmZiwKQEAgLTE2NzcsNjYgKzExMTUsNjAgQEAKIAogCXJldHVybiAwOwogCi1vdXRfZnJlZV9pcnEwOgotCWZyZWVfaXJxKHByaXYtPmlycTAsIHByaXYpOwogb3V0X21kaW86CiAJYmNtX3NmMl9tZGlvX3VucmVnaXN0ZXIocHJpdik7Ci1vdXRfdW5tYXA6Ci0JYmFzZSA9ICZwcml2LT5jb3JlOwotCWZvciAoaSA9IDA7IGkgPCBCQ01fU0YyX1JFR1NfTlVNOyBpKyspIHsKLQkJaWYgKCpiYXNlKQotCQkJaW91bm1hcCgqYmFzZSk7Ci0JCWJhc2UrKzsKLQl9CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBkc2Ffc3dpdGNoX2RyaXZlciBiY21fc2YyX3N3aXRjaF9kcml2ZXIgPSB7Ci0JLnRhZ19wcm90b2NvbAkJPSBEU0FfVEFHX1BST1RPX0JSQ00sCi0JLnByb2JlCQkJPSBiY21fc2YyX3N3X2Rydl9wcm9iZSwKLQkuc2V0dXAJCQk9IGJjbV9zZjJfc3dfc2V0dXAsCi0JLnNldF9hZGRyCQk9IGJjbV9zZjJfc3dfc2V0X2FkZHIsCi0JLmdldF9waHlfZmxhZ3MJCT0gYmNtX3NmMl9zd19nZXRfcGh5X2ZsYWdzLAotCS5nZXRfc3RyaW5ncwkJPSBiY21fc2YyX3N3X2dldF9zdHJpbmdzLAotCS5nZXRfZXRodG9vbF9zdGF0cwk9IGJjbV9zZjJfc3dfZ2V0X2V0aHRvb2xfc3RhdHMsCi0JLmdldF9zc2V0X2NvdW50CQk9IGJjbV9zZjJfc3dfZ2V0X3NzZXRfY291bnQsCi0JLmFkanVzdF9saW5rCQk9IGJjbV9zZjJfc3dfYWRqdXN0X2xpbmssCi0JLmZpeGVkX2xpbmtfdXBkYXRlCT0gYmNtX3NmMl9zd19maXhlZF9saW5rX3VwZGF0ZSwKLQkuc3VzcGVuZAkJPSBiY21fc2YyX3N3X3N1c3BlbmQsCi0JLnJlc3VtZQkJCT0gYmNtX3NmMl9zd19yZXN1bWUsCi0JLmdldF93b2wJCT0gYmNtX3NmMl9zd19nZXRfd29sLAotCS5zZXRfd29sCQk9IGJjbV9zZjJfc3dfc2V0X3dvbCwKLQkucG9ydF9lbmFibGUJCT0gYmNtX3NmMl9wb3J0X3NldHVwLAotCS5wb3J0X2Rpc2FibGUJCT0gYmNtX3NmMl9wb3J0X2Rpc2FibGUsCi0JLmdldF9lZWUJCT0gYmNtX3NmMl9zd19nZXRfZWVlLAotCS5zZXRfZWVlCQk9IGJjbV9zZjJfc3dfc2V0X2VlZSwKLQkucG9ydF9icmlkZ2Vfam9pbgk9IGJjbV9zZjJfc3dfYnJfam9pbiwKLQkucG9ydF9icmlkZ2VfbGVhdmUJPSBiY21fc2YyX3N3X2JyX2xlYXZlLAotCS5wb3J0X3N0cF9zdGF0ZV9zZXQJPSBiY21fc2YyX3N3X2JyX3NldF9zdHBfc3RhdGUsCi0JLnBvcnRfZmRiX3ByZXBhcmUJPSBiY21fc2YyX3N3X2ZkYl9wcmVwYXJlLAotCS5wb3J0X2ZkYl9hZGQJCT0gYmNtX3NmMl9zd19mZGJfYWRkLAotCS5wb3J0X2ZkYl9kZWwJCT0gYmNtX3NmMl9zd19mZGJfZGVsLAotCS5wb3J0X2ZkYl9kdW1wCQk9IGJjbV9zZjJfc3dfZmRiX2R1bXAsCi0JLnBvcnRfdmxhbl9maWx0ZXJpbmcJPSBiY21fc2YyX3N3X3ZsYW5fZmlsdGVyaW5nLAotCS5wb3J0X3ZsYW5fcHJlcGFyZQk9IGJjbV9zZjJfc3dfdmxhbl9wcmVwYXJlLAotCS5wb3J0X3ZsYW5fYWRkCQk9IGJjbV9zZjJfc3dfdmxhbl9hZGQsCi0JLnBvcnRfdmxhbl9kZWwJCT0gYmNtX3NmMl9zd192bGFuX2RlbCwKLQkucG9ydF92bGFuX2R1bXAJCT0gYmNtX3NmMl9zd192bGFuX2R1bXAsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBiY21fc2YyX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgYmNtX3NmMl9zd19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlyZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKCZiY21fc2YyX3N3aXRjaF9kcml2ZXIpOworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCS8qIERpc2FibGUgYWxsIHBvcnRzIGFuZCBpbnRlcnJ1cHRzICovCisJcHJpdi0+d29sX3BvcnRzX21hc2sgPSAwOworCWJjbV9zZjJfc3dfc3VzcGVuZChwcml2LT5kZXYtPmRzKTsKKwlkc2FfdW5yZWdpc3Rlcl9zd2l0Y2gocHJpdi0+ZGV2LT5kcyk7CisJYmNtX3NmMl9tZGlvX3VucmVnaXN0ZXIocHJpdik7CiAKIAlyZXR1cm4gMDsKIH0KLW1vZHVsZV9pbml0KGJjbV9zZjJfaW5pdCk7CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBiY21fc2YyX2V4aXQodm9pZCkKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgYmNtX3NmMl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQl1bnJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoJmJjbV9zZjJfc3dpdGNoX2RyaXZlcik7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJldHVybiBkc2Ffc3dpdGNoX3N1c3BlbmQocHJpdi0+ZGV2LT5kcyk7CiB9Ci1tb2R1bGVfZXhpdChiY21fc2YyX2V4aXQpOworCitzdGF0aWMgaW50IGJjbV9zZjJfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcmV0dXJuIGRzYV9zd2l0Y2hfcmVzdW1lKHByaXYtPmRldi0+ZHMpOworfQorI2VuZGlmIC8qIENPTkZJR19QTV9TTEVFUCAqLworCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoYmNtX3NmMl9wbV9vcHMsCisJCQkgYmNtX3NmMl9zdXNwZW5kLCBiY21fc2YyX3Jlc3VtZSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJjbV9zZjJfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImJyY20sYmNtNzQ0NS1zd2l0Y2gtdjQuMCIgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBiY21fc2YyX2RyaXZlciA9IHsKKwkucHJvYmUJPSBiY21fc2YyX3N3X3Byb2JlLAorCS5yZW1vdmUJPSBiY21fc2YyX3N3X3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJicmNtLXNmMiIsCisJCS5vZl9tYXRjaF90YWJsZSA9IGJjbV9zZjJfb2ZfbWF0Y2gsCisJCS5wbSA9ICZiY21fc2YyX3BtX29wcywKKwl9LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYmNtX3NmMl9kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJCcm9hZGNvbSBDb3Jwb3JhdGlvbiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIEJyb2FkY29tIFN0YXJmaWdodGVyIDIgZXRoZXJuZXQgc3dpdGNoIGNoaXAiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9iY21fc2YyLmggYi9kcml2ZXJzL25ldC9kc2EvYmNtX3NmMi5oCmluZGV4IDQ2M2JlZDguLjQ0NjkyNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RzYS9iY21fc2YyLmgKKysrIGIvZHJpdmVycy9uZXQvZHNhL2JjbV9zZjIuaApAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPG5ldC9kc2EuaD4KIAogI2luY2x1ZGUgImJjbV9zZjJfcmVncy5oIgorI2luY2x1ZGUgImI1My9iNTNfcHJpdi5oIgogCiBzdHJ1Y3QgYmNtX3NmMl9od19wYXJhbXMgewogCXUxNgl0b3BfcmV2OwpAQCAtNDksNzIgKzUwLDggQEAKIAl1bnNpZ25lZCBpbnQgbGluazsKIAogCXN0cnVjdCBldGh0b29sX2VlZSBlZWU7Ci0KLQl1MzIgdmxhbl9jdGxfbWFzazsKLQl1MTYgcHZpZDsKLQotCXN0cnVjdCBuZXRfZGV2aWNlICpicmlkZ2VfZGV2OwogfTsKIAotc3RydWN0IGJjbV9zZjJfYXJsX2VudHJ5IHsKLQl1OCBwb3J0OwotCXU4IG1hY1tFVEhfQUxFTl07Ci0JdTE2IHZpZDsKLQl1OCBpc192YWxpZDoxOwotCXU4IGlzX2FnZToxOwotCXU4IGlzX3N0YXRpYzoxOwotfTsKLQotc3RydWN0IGJjbV9zZjJfdmxhbiB7Ci0JdTE2IG1lbWJlcnM7Ci0JdTE2IHVudGFnOwotfTsKLQotc3RhdGljIGlubGluZSB2b2lkIGJjbV9zZjJfbWFjX2Zyb21fdTY0KHU2NCBzcmMsIHU4ICpkc3QpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKLQkJZHN0W0VUSF9BTEVOIC0gMSAtIGldID0gKHNyYyA+PiAoOCAqIGkpKSAmIDB4ZmY7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTY0IGJjbV9zZjJfbWFjX3RvX3U2NChjb25zdCB1OCAqc3JjKQotewotCXVuc2lnbmVkIGludCBpOwotCXU2NCBkc3QgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCi0JCWRzdCB8PSAodTY0KXNyY1tFVEhfQUxFTiAtIDEgLSBpXSA8PCAoOCAqIGkpOwotCi0JcmV0dXJuIGRzdDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGJjbV9zZjJfYXJsX3RvX2VudHJ5KHN0cnVjdCBiY21fc2YyX2FybF9lbnRyeSAqZW50LAotCQkJCQl1NjQgbWFjX3ZpZCwgdTMyIGZ3ZF9lbnRyeSkKLXsKLQltZW1zZXQoZW50LCAwLCBzaXplb2YoKmVudCkpOwotCWVudC0+cG9ydCA9IGZ3ZF9lbnRyeSAmIFBPUlRJRF9NQVNLOwotCWVudC0+aXNfdmFsaWQgPSAhIShmd2RfZW50cnkgJiBBUkxfVkFMSUQpOwotCWVudC0+aXNfYWdlID0gISEoZndkX2VudHJ5ICYgQVJMX0FHRSk7Ci0JZW50LT5pc19zdGF0aWMgPSAhIShmd2RfZW50cnkgJiBBUkxfU1RBVElDKTsKLQliY21fc2YyX21hY19mcm9tX3U2NChtYWNfdmlkLCBlbnQtPm1hYyk7Ci0JZW50LT52aWQgPSBtYWNfdmlkID4+IFZJRF9TSElGVDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGJjbV9zZjJfYXJsX2Zyb21fZW50cnkodTY0ICptYWNfdmlkLCB1MzIgKmZ3ZF9lbnRyeSwKLQkJCQkJICBjb25zdCBzdHJ1Y3QgYmNtX3NmMl9hcmxfZW50cnkgKmVudCkKLXsKLQkqbWFjX3ZpZCA9IGJjbV9zZjJfbWFjX3RvX3U2NChlbnQtPm1hYyk7Ci0JKm1hY192aWQgfD0gKHU2NCkoZW50LT52aWQgJiBWSURfTUFTSykgPDwgVklEX1NISUZUOwotCSpmd2RfZW50cnkgPSBlbnQtPnBvcnQgJiBQT1JUSURfTUFTSzsKLQlpZiAoZW50LT5pc192YWxpZCkKLQkJKmZ3ZF9lbnRyeSB8PSBBUkxfVkFMSUQ7Ci0JaWYgKGVudC0+aXNfc3RhdGljKQotCQkqZndkX2VudHJ5IHw9IEFSTF9TVEFUSUM7Ci0JaWYgKGVudC0+aXNfYWdlKQotCQkqZndkX2VudHJ5IHw9IEFSTF9BR0U7Ci19Ci0KIHN0cnVjdCBiY21fc2YyX3ByaXYgewogCS8qIEJhc2UgcmVnaXN0ZXJzLCBrZWVwIHRob3NlIGluIG9yZGVyIHdpdGggQkNNX1NGMl9SRUdTX05BTUUgKi8KIAl2b2lkIF9faW9tZW0JCQkqY29yZTsKQEAgLTEzNCw2ICs3MSw5IEBACiAJdTMyCQkJCWlycTFfc3RhdDsKIAl1MzIJCQkJaXJxMV9tYXNrOwogCisJLyogQmFja2luZyBiNTNfZGV2aWNlICovCisJc3RydWN0IGI1M19kZXZpY2UJCSpkZXY7CisKIAkvKiBNdXRleCBwcm90ZWN0aW5nIGFjY2VzcyB0byB0aGUgTUlCIGNvdW50ZXJzICovCiAJc3RydWN0IG11dGV4CQkJc3RhdHNfbXV0ZXg7CiAKQEAgLTE1NSwxNiArOTUsMTQgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUJCSptYXN0ZXJfbWlpX2RuOwogCXN0cnVjdCBtaWlfYnVzCQkJKnNsYXZlX21paV9idXM7CiAJc3RydWN0IG1paV9idXMJCQkqbWFzdGVyX21paV9idXM7Ci0KLQkvKiBDYWNoZSBvZiBwcm9ncmFtbWVkIFZMQU5zICovCi0Jc3RydWN0IGJjbV9zZjJfdmxhbgkJdmxhbnNbVkxBTl9OX1ZJRF07CiB9OwogCi1zdHJ1Y3QgYmNtX3NmMl9od19zdGF0cyB7Ci0JY29uc3QgY2hhcgkqc3RyaW5nOwotCXUxNgkJcmVnOwotCXU4CQlzaXplb2Zfc3RhdDsKLX07CitzdGF0aWMgaW5saW5lIHN0cnVjdCBiY21fc2YyX3ByaXYgKmJjbV9zZjJfdG9fcHJpdihzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCit7CisJc3RydWN0IGI1M19kZXZpY2UgKmRldiA9IGRzLT5wcml2OworCisJcmV0dXJuIGRldi0+cHJpdjsKK30KIAogI2RlZmluZSBTRjJfSU9fTUFDUk8obmFtZSkgXAogc3RhdGljIGlubGluZSB1MzIgbmFtZSMjX3JlYWRsKHN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYsIHUzMiBvZmYpCVwKQEAgLTIwNSw4ICsxNDMsOCBAQAogc3RhdGljIGlubGluZSB2b2lkIGludHJsMl8jI3doaWNoIyNfbWFza19jbGVhcihzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2LCBcCiAJCQkJCQl1MzIgbWFzaykJCVwKIHsJCQkJCQkJCQlcCi0JaW50cmwyXyMjd2hpY2gjI193cml0ZWwocHJpdiwgbWFzaywgSU5UUkwyX0NQVV9NQVNLX0NMRUFSKTsJXAogCXByaXYtPmlycSMjd2hpY2gjI19tYXNrICY9IH4obWFzayk7CQkJCVwKKwlpbnRybDJfIyN3aGljaCMjX3dyaXRlbChwcml2LCBtYXNrLCBJTlRSTDJfQ1BVX01BU0tfQ0xFQVIpOwlcCiB9CQkJCQkJCQkJXAogc3RhdGljIGlubGluZSB2b2lkIGludHJsMl8jI3doaWNoIyNfbWFza19zZXQoc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiwgXAogCQkJCQkJdTMyIG1hc2spCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvYmNtX3NmMl9yZWdzLmggYi9kcml2ZXJzL25ldC9kc2EvYmNtX3NmMl9yZWdzLmgKaW5kZXggOWYyYTljYi4uODM4ZmUzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL2JjbV9zZjJfcmVncy5oCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9iY21fc2YyX3JlZ3MuaApAQCAtMTE1LDE0ICsxMTUsNiBAQAogI2RlZmluZSAgUlhfQkNTVF9FTgkJCSgxIDw8IDIpCiAjZGVmaW5lICBSWF9NQ1NUX0VOCQkJKDEgPDwgMykKICNkZWZpbmUgIFJYX1VDU1RfRU4JCQkoMSA8PCA0KQotI2RlZmluZSAgR19NSVNUUF9TVEFURV9TSElGVAkJNQotI2RlZmluZSAgR19NSVNUUF9OT19TVFAJCQkoMCA8PCBHX01JU1RQX1NUQVRFX1NISUZUKQotI2RlZmluZSAgR19NSVNUUF9ESVNfU1RBVEUJCSgxIDw8IEdfTUlTVFBfU1RBVEVfU0hJRlQpCi0jZGVmaW5lICBHX01JU1RQX0JMT0NLX1NUQVRFCQkoMiA8PCBHX01JU1RQX1NUQVRFX1NISUZUKQotI2RlZmluZSAgR19NSVNUUF9MSVNURU5fU1RBVEUJCSgzIDw8IEdfTUlTVFBfU1RBVEVfU0hJRlQpCi0jZGVmaW5lICBHX01JU1RQX0xFQVJOX1NUQVRFCQkoNCA8PCBHX01JU1RQX1NUQVRFX1NISUZUKQotI2RlZmluZSAgR19NSVNUUF9GV0RfU1RBVEUJCSg1IDw8IEdfTUlTVFBfU1RBVEVfU0hJRlQpCi0jZGVmaW5lICBHX01JU1RQX1NUQVRFX01BU0sJCTB4NwogCiAjZGVmaW5lIENPUkVfU1dNT0RFCQkJMHgwMDAyYwogI2RlZmluZSAgU1dfRldER19NT0RFCQkJKDEgPDwgMCkKQEAgLTIwNSw3NSArMTk3LDExIEBACiAjZGVmaW5lICBCUkNNX0hEUl9FTl9QNQkJCSgxIDw8IDEpCiAjZGVmaW5lICBCUkNNX0hEUl9FTl9QNwkJCSgxIDw8IDIpCiAKLSNkZWZpbmUgQ09SRV9CUkNNX0hEUl9DVFJMMgkJMHgwODI4Ci0KLSNkZWZpbmUgQ09SRV9ITF9QUlRDX0NUUkwJCTB4MDk0MAotI2RlZmluZSAgQVJQX0VOCQkJCSgxIDw8IDApCi0jZGVmaW5lICBSQVJQX0VOCQkJKDEgPDwgMSkKLSNkZWZpbmUgIERIQ1BfRU4JCQkoMSA8PCAyKQotI2RlZmluZSAgSUNNUFY0X0VOCQkJKDEgPDwgMykKLSNkZWZpbmUgIElDTVBWNl9FTgkJCSgxIDw8IDQpCi0jZGVmaW5lICBJQ01QVjZfRldEX01PREUJCSgxIDw8IDUpCi0jZGVmaW5lICBJR01QX0RJUF9FTgkJCSgxIDw8IDgpCi0jZGVmaW5lICBJR01QX1JQVExWRV9FTgkJCSgxIDw8IDkpCi0jZGVmaW5lICBJR01QX1JUUExWRV9GV0RfTU9ERQkJKDEgPDwgMTApCi0jZGVmaW5lICBJR01QX1FSWV9FTgkJCSgxIDw8IDExKQotI2RlZmluZSAgSUdNUF9RUllfRldEX01PREUJCSgxIDw8IDEyKQotI2RlZmluZSAgSUdNUF9VS05fRU4JCQkoMSA8PCAxMykKLSNkZWZpbmUgIElHTVBfVUtOX0ZXRF9NT0RFCQkoMSA8PCAxNCkKLSNkZWZpbmUgIE1MRF9SUFRET05FX0VOCQkJKDEgPDwgMTUpCi0jZGVmaW5lICBNTERfUlBURE9ORV9GV0RfTU9ERQkJKDEgPDwgMTYpCi0jZGVmaW5lICBNTERfUVJZX0VOCQkJKDEgPDwgMTcpCi0jZGVmaW5lICBNTERfUVJZX0ZXRF9NT0RFCQkoMSA8PCAxOCkKLQogI2RlZmluZSBDT1JFX1JTVF9NSUJfQ05UX0VOCQkweDA5NTAKIAogI2RlZmluZSBDT1JFX0JSQ01fSERSX1JYX0RJUwkJMHgwOTgwCiAjZGVmaW5lIENPUkVfQlJDTV9IRFJfVFhfRElTCQkweDA5ODgKIAotI2RlZmluZSBDT1JFX0FSTEFfTlVNX0VOVFJJRVMJCTEwMjQKLQotI2RlZmluZSBDT1JFX0FSTEFfUldDVEwJCQkweDE0MDAKLSNkZWZpbmUgIEFSTF9SVwkJCQkoMSA8PCAwKQotI2RlZmluZSAgSVZMX1NWTF9TRUxFQ1QJCQkoMSA8PCA2KQotI2RlZmluZSAgQVJMX1NUUlRETgkJCSgxIDw8IDcpCi0KLSNkZWZpbmUgQ09SRV9BUkxBX01BQwkJCTB4MTQwOAotI2RlZmluZSBDT1JFX0FSTEFfVklECQkJMHgxNDIwCi0jZGVmaW5lICBBUkxBX1ZJRFRBQl9JTkRYX01BU0sJCTB4MWZmZgotCi0jZGVmaW5lIENPUkVfQVJMQV9NQUNWSUQwCQkweDE0NDAKLSNkZWZpbmUgIE1BQ19NQVNLCQkJMHhmZmZmZmZmZmZmCi0jZGVmaW5lICBWSURfU0hJRlQJCQk0OAotI2RlZmluZSAgVklEX01BU0sJCQkweGZmZgotCi0jZGVmaW5lIENPUkVfQVJMQV9GV0RfRU5UUlkwCQkweDE0NjAKLSNkZWZpbmUgIFBPUlRJRF9NQVNLCQkJMHgxZmYKLSNkZWZpbmUgIEFSTF9DT05fU0hJRlQJCQk5Ci0jZGVmaW5lICBBUkxfQ09OX01BU0sJCQkweDMKLSNkZWZpbmUgIEFSTF9QUklfU0hJRlQJCQkxMQotI2RlZmluZSAgQVJMX1BSSV9NQVNLCQkJMHg3Ci0jZGVmaW5lICBBUkxfQUdFCQkJKDEgPDwgMTQpCi0jZGVmaW5lICBBUkxfU1RBVElDCQkJKDEgPDwgMTUpCi0jZGVmaW5lICBBUkxfVkFMSUQJCQkoMSA8PCAxNikKLQotI2RlZmluZSBDT1JFX0FSTEFfTUFDVklEX0VOVFJZKHgpCShDT1JFX0FSTEFfTUFDVklEMCArICgoeCkgKiAweDQwKSkKLSNkZWZpbmUgQ09SRV9BUkxBX0ZXRF9FTlRSWSh4KQkJKENPUkVfQVJMQV9GV0RfRU5UUlkwICsgKCh4KSAqIDB4NDApKQotCi0jZGVmaW5lIENPUkVfQVJMQV9TUkNIX0NUTAkJMHgxNTQwCi0jZGVmaW5lICBBUkxBX1NSQ0hfVkxJRAkJCSgxIDw8IDApCi0jZGVmaW5lICBJVkxfU1ZMX1NFTEVDVAkJCSgxIDw8IDYpCi0jZGVmaW5lICBBUkxBX1NSQ0hfU1RETgkJCSgxIDw8IDcpCi0KLSNkZWZpbmUgQ09SRV9BUkxBX1NSQ0hfQURSCQkweDE1NDQKLSNkZWZpbmUgIEFSTEFfU1JDSF9BRFJfVkFMSUQJCSgxIDw8IDE1KQotCi0jZGVmaW5lIENPUkVfQVJMQV9TUkNIX1JTTFRfMF9NQUNWSUQJMHgxNTgwCi0jZGVmaW5lIENPUkVfQVJMQV9TUkNIX1JTTFRfMAkJMHgxNWEwCi0KLSNkZWZpbmUgQ09SRV9BUkxBX1NSQ0hfUlNMVF9NQUNWSUQoeCkJKENPUkVfQVJMQV9TUkNIX1JTTFRfMF9NQUNWSUQgKyAoKHgpICogMHg0MCkpCi0jZGVmaW5lIENPUkVfQVJMQV9TUkNIX1JTTFQoeCkJCShDT1JFX0FSTEFfU1JDSF9SU0xUXzAgKyAoKHgpICogMHg0MCkpCi0KICNkZWZpbmUgQ09SRV9BUkxBX1ZUQkxfUldDVFJMCQkweDE2MDAKICNkZWZpbmUgIEFSTEFfVlRCTF9DTURfV1JJVEUJCTAKICNkZWZpbmUgIEFSTEFfVlRCTF9DTURfUkVBRAkJMQpAQCAtMjk3LDU5ICsyMjUsOSBAQAogI2RlZmluZSAgUF9UWFFfUFNNX1ZERCh4KQkJKFBfVFhRX1BTTV9WRERfTUFTSyA8PCBcCiAJCQkJCSgoeCkgKiBQX1RYUV9QU01fVkREX1NISUZUKSkKIAotI2RlZmluZQlDT1JFX1AwX01JQl9PRkZTRVQJCTB4ODAwMAotI2RlZmluZSBQX01JQl9TSVpFCQkJMHg0MDAKLSNkZWZpbmUgQ09SRV9QX01JQl9PRkZTRVQoeCkJCShDT1JFX1AwX01JQl9PRkZTRVQgKyAoeCkgKiBQX01JQl9TSVpFKQotCiAjZGVmaW5lIENPUkVfUE9SVF9WTEFOX0NUTF9QT1JUKHgpCSgweGM0MDAgKyAoKHgpICogMHg4KSkKICNkZWZpbmUgIFBPUlRfVkxBTl9DVFJMX01BU0sJCTB4MWZmCiAKLSNkZWZpbmUgQ09SRV9WTEFOX0NUUkwwCQkJMHhkMDAwCi0jZGVmaW5lICBDSEFOR0VfMVBfVklEX0lOTkVSCQkoMSA8PCAwKQotI2RlZmluZSAgQ0hBTkdFXzFQX1ZJRF9PVVRFUgkJKDEgPDwgMSkKLSNkZWZpbmUgIENIQU5HRV8xUV9WSUQJCQkoMSA8PCAzKQotI2RlZmluZSAgVkxBTl9MRUFSTl9NT0RFX1NWTAkJKDAgPDwgNSkKLSNkZWZpbmUgIFZMQU5fTEVBUk5fTU9ERV9JVkwJCSgzIDw8IDUpCi0jZGVmaW5lICBWTEFOX0VOCQkJKDEgPDwgNykKLQotI2RlZmluZSBDT1JFX1ZMQU5fQ1RSTDEJCQkweGQwMDQKLSNkZWZpbmUgIEVOX1JTVl9NQ0FTVF9GV0RNQVAJCSgxIDw8IDIpCi0jZGVmaW5lICBFTl9SU1ZfTUNBU1RfVU5UQUcJCSgxIDw8IDMpCi0jZGVmaW5lICBFTl9JUE1DX0JZUEFTU19GV0RNQVAJCSgxIDw8IDUpCi0jZGVmaW5lICBFTl9JUE1DX0JZUEFTU19VTlRBRwkJKDEgPDwgNikKLQotI2RlZmluZSBDT1JFX1ZMQU5fQ1RSTDIJCQkweGQwMDgKLSNkZWZpbmUgIEVOX01JSU1fQllQQVNTX1ZfRldETUFQCSgxIDw8IDIpCi0jZGVmaW5lICBFTl9HTVJQX0dWUlBfVl9GV0RNQVAJCSgxIDw8IDUpCi0jZGVmaW5lICBFTl9HTVJQX0dWUlBfVU5UQUdfTUFQCQkoMSA8PCA2KQotCi0jZGVmaW5lIENPUkVfVkxBTl9DVFJMMwkJCTB4ZDAwYwotI2RlZmluZSAgRU5fRFJPUF9OT04xUV9NQVNLCQkweDFmZgotCi0jZGVmaW5lIENPUkVfVkxBTl9DVFJMNAkJCTB4ZDAxNAotI2RlZmluZSAgUkVTVl9NQ0FTVF9GTE9PRAkJKDEgPDwgMSkKLSNkZWZpbmUgIEVOX0RPVUJMRV9UQUdfTUFTSwkJMHgzCi0jZGVmaW5lICBFTl9ET1VCTEVfVEFHX1NISUZUCQkyCi0jZGVmaW5lICBFTl9NR0VfUkVWX0dNUlAJCSgxIDw8IDQpCi0jZGVmaW5lICBFTl9NR0VfUkVWX0dWUlAJCSgxIDw8IDUpCi0jZGVmaW5lICBJTkdSX1ZJRF9DSEtfU0hJRlQJCTYKLSNkZWZpbmUgIElOR1JfVklEX0NIS19NQVNLCQkweDMKLSNkZWZpbmUgIElOR1JfVklEX0NIS19GV0QJCSgwIDw8IElOR1JfVklEX0NIS19TSElGVCkKLSNkZWZpbmUgIElOR1JfVklEX0NIS19EUk9QCQkoMSA8PCBJTkdSX1ZJRF9DSEtfU0hJRlQpCi0jZGVmaW5lICBJTkdSX1ZJRF9DSEtfTk9fQ0hLCQkoMiA8PCBJTkdSX1ZJRF9DSEtfU0hJRlQpCi0jZGVmaW5lICBJTkdSX1ZJRF9DSEtfVklEX1ZJT0xfSU1QCSgzIDw8IElOR1JfVklEX0NIS19TSElGVCkKLQotI2RlZmluZSBDT1JFX1ZMQU5fQ1RSTDUJCQkweGQwMTgKLSNkZWZpbmUgIEVOX0NQVV9SWF9CWVBfSU5ORVJfQ1JDQ0hDSwkoMSA8PCAwKQotI2RlZmluZSAgRU5fVklEX0ZGRl9GV0QJCQkoMSA8PCAyKQotI2RlZmluZSAgRFJPUF9WVEFCTEVfTUlTUwkJKDEgPDwgMykKLSNkZWZpbmUgIEVHUkVTU19ESVJfRlJNX0JZUF9UUlVOS19FTgkoMSA8PCA0KQotI2RlZmluZSAgUFJFU1ZfTk9OMVEJCQkoMSA8PCA2KQotCi0jZGVmaW5lIENPUkVfVkxBTl9DVFJMNgkJCTB4ZDAxYwotI2RlZmluZSAgU1RSSUNUX1NGRF9ERVRFQ1QJCSgxIDw8IDApCi0jZGVmaW5lICBESVNfQVJMX0JVU1RfTE1JVAkJKDEgPDwgNCkKLQogI2RlZmluZSBDT1JFX0RFRkFVTFRfMVFfVEFHX1AoeCkJKDB4ZDA0MCArICgoeCkgKiA4KSkKICNkZWZpbmUgIENGSV9TSElGVAkJCTEyCiAjZGVmaW5lICBQUklfU0hJRlQJCQkxMwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL212ODhlNjA2MC5jIGIvZHJpdmVycy9uZXQvZHNhL212ODhlNjA2MC5jCmluZGV4IGUzNmI0MDguLjdjZTM2ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTYwNjAuYworKysgYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2MDYwLmMKQEAgLTE5LDcgKzE5LDcgQEAKIAogc3RhdGljIGludCByZWdfcmVhZChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBhZGRyLCBpbnQgcmVnKQogewotCXN0cnVjdCBtdjg4ZTYwNjBfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTYwNjBfcHJpdiAqcHJpdiA9IGRzLT5wcml2OwogCiAJcmV0dXJuIG1kaW9idXNfcmVhZF9uZXN0ZWQocHJpdi0+YnVzLCBwcml2LT5zd19hZGRyICsgYWRkciwgcmVnKTsKIH0KQEAgLTM3LDcgKzM3LDcgQEAKIAogc3RhdGljIGludCByZWdfd3JpdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgYWRkciwgaW50IHJlZywgdTE2IHZhbCkKIHsKLQlzdHJ1Y3QgbXY4OGU2MDYwX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgbXY4OGU2MDYwX3ByaXYgKnByaXYgPSBkcy0+cHJpdjsKIAogCXJldHVybiBtZGlvYnVzX3dyaXRlX25lc3RlZChwcml2LT5idXMsIHByaXYtPnN3X2FkZHIgKyBhZGRyLCByZWcsIHZhbCk7CiB9CkBAIC02OSw2ICs2OSwxMSBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgZW51bSBkc2FfdGFnX3Byb3RvY29sIG12ODhlNjA2MF9nZXRfdGFnX3Byb3RvY29sKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKK3sKKwlyZXR1cm4gRFNBX1RBR19QUk9UT19UUkFJTEVSOworfQorCiBzdGF0aWMgY29uc3QgY2hhciAqbXY4OGU2MDYwX2Rydl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkc2FfZGV2LAogCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlICpob3N0X2RldiwgaW50IHN3X2FkZHIsCiAJCQkJICAgICAgIHZvaWQgKipfcHJpdikKQEAgLTI0Nyw4ICsyNTIsOCBAQAogCXJldHVybiByZWdfd3JpdGUoZHMsIGFkZHIsIHJlZ251bSwgdmFsKTsKIH0KIAotc3RhdGljIHN0cnVjdCBkc2Ffc3dpdGNoX2RyaXZlciBtdjg4ZTYwNjBfc3dpdGNoX2RyaXZlciA9IHsKLQkudGFnX3Byb3RvY29sCT0gRFNBX1RBR19QUk9UT19UUkFJTEVSLAorc3RhdGljIHN0cnVjdCBkc2Ffc3dpdGNoX29wcyBtdjg4ZTYwNjBfc3dpdGNoX29wcyA9IHsKKwkuZ2V0X3RhZ19wcm90b2NvbCA9IG12ODhlNjA2MF9nZXRfdGFnX3Byb3RvY29sLAogCS5wcm9iZQkJPSBtdjg4ZTYwNjBfZHJ2X3Byb2JlLAogCS5zZXR1cAkJPSBtdjg4ZTYwNjBfc2V0dXAsCiAJLnNldF9hZGRyCT0gbXY4OGU2MDYwX3NldF9hZGRyLApAQCAtMjU4LDE0ICsyNjMsMTQgQEAKIAogc3RhdGljIGludCBfX2luaXQgbXY4OGU2MDYwX2luaXQodm9pZCkKIHsKLQlyZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKCZtdjg4ZTYwNjBfc3dpdGNoX2RyaXZlcik7CisJcmVnaXN0ZXJfc3dpdGNoX2RyaXZlcigmbXY4OGU2MDYwX3N3aXRjaF9vcHMpOwogCXJldHVybiAwOwogfQogbW9kdWxlX2luaXQobXY4OGU2MDYwX2luaXQpOwogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbXY4OGU2MDYwX2NsZWFudXAodm9pZCkKIHsKLQl1bnJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoJm12ODhlNjA2MF9zd2l0Y2hfZHJpdmVyKTsKKwl1bnJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoJm12ODhlNjA2MF9zd2l0Y2hfb3BzKTsKIH0KIG1vZHVsZV9leGl0KG12ODhlNjA2MF9jbGVhbnVwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC9LY29uZmlnIGIvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC9LY29uZmlnCmluZGV4IDQ5MGJjMDYuLjQ4NjY2ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L0tjb25maWcKQEAgLTIsNiArMiwxOCBAQAogCXRyaXN0YXRlICJNYXJ2ZWxsIDg4RTZ4eHggRXRoZXJuZXQgc3dpdGNoIGZhYnJpYyBzdXBwb3J0IgogCWRlcGVuZHMgb24gTkVUX0RTQQogCXNlbGVjdCBORVRfRFNBX1RBR19FRFNBCisJc2VsZWN0IE5FVF9EU0FfVEFHX0RTQQogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIGFkZHMgc3VwcG9ydCBmb3IgbW9zdCBvZiB0aGUgTWFydmVsbCA4OEU2eHh4IG1vZGVscyBvZgogCSAgRXRoZXJuZXQgc3dpdGNoIGNoaXBzLCBleGNlcHQgODhFNjA2MC4KKworY29uZmlnIE5FVF9EU0FfTVY4OEU2WFhYX0dMT0JBTDIKKwlib29sICJTd2l0Y2ggR2xvYmFsIDIgUmVnaXN0ZXJzIHN1cHBvcnQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBORVRfRFNBX01WODhFNlhYWAorCWhlbHAKKwkgIFRoaXMgcmVnaXN0ZXJzIHNldCBhdCBpbnRlcm5hbCBTTUkgYWRkcmVzcyAweDFDIHByb3ZpZGVzIGV4dGVuZGVkCisJICBmZWF0dXJlcyBsaWtlIEVFUFJPTSBpbnRlcmZhY2UsIHRydW5raW5nLCBjcm9zcy1jaGlwIHNldHVwLCBldGMuCisKKwkgIEl0IGlzIHJlcXVpcmVkIG9uIG1vc3QgY2hpcHMuIElmIHRoZSBjaGlwIHlvdSBjb21waWxlIHRoZSBzdXBwb3J0IGZvcgorCSAgZG9lc24ndCBoYXZlIHN1Y2ggcmVnaXN0ZXJzIHNldCwgc2F5IE4gaGVyZS4gSW4gZG91YnQsIHNheSBZLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvTWFrZWZpbGUKaW5kZXggNmUyOWE3NS4uMTBjZTgyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L01ha2VmaWxlCkBAIC0xICsxLDQgQEAKLW9iai0kKENPTkZJR19ORVRfRFNBX01WODhFNlhYWCkgKz0gY2hpcC5vCitvYmotJChDT05GSUdfTkVUX0RTQV9NVjg4RTZYWFgpICs9IG12ODhlNnh4eC5vCittdjg4ZTZ4eHgtb2JqcyA6PSBjaGlwLm8KK212ODhlNnh4eC1vYmpzICs9IGdsb2JhbDEubworbXY4OGU2eHh4LSQoQ09ORklHX05FVF9EU0FfTVY4OEU2WFhYX0dMT0JBTDIpICs9IGdsb2JhbDIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC9jaGlwLmMgYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L2NoaXAuYwppbmRleCBkMzZhZWRkLi44ODNmZDk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L2NoaXAuYworKysgYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L2NoaXAuYwpAQCAtMjksNyArMjksMTAgQEAKICNpbmNsdWRlIDxsaW51eC9waHkuaD4KICNpbmNsdWRlIDxuZXQvZHNhLmg+CiAjaW5jbHVkZSA8bmV0L3N3aXRjaGRldi5oPgorCiAjaW5jbHVkZSAibXY4OGU2eHh4LmgiCisjaW5jbHVkZSAiZ2xvYmFsMS5oIgorI2luY2x1ZGUgImdsb2JhbDIuaCIKIAogc3RhdGljIHZvaWQgYXNzZXJ0X3JlZ19sb2NrKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKIHsKQEAgLTk1LDcgKzk4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBtdjg4ZTZ4eHhfb3BzIG12ODhlNnh4eF9zbWlfc2luZ2xlX2NoaXBfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBtdjg4ZTZ4eHhfYnVzX29wcyBtdjg4ZTZ4eHhfc21pX3NpbmdsZV9jaGlwX29wcyA9IHsKIAkucmVhZCA9IG12ODhlNnh4eF9zbWlfc2luZ2xlX2NoaXBfcmVhZCwKIAkud3JpdGUgPSBtdjg4ZTZ4eHhfc21pX3NpbmdsZV9jaGlwX3dyaXRlLAogfTsKQEAgLTE3NywxMyArMTgwLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbXY4OGU2eHh4X29wcyBtdjg4ZTZ4eHhfc21pX211bHRpX2NoaXBfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBtdjg4ZTZ4eHhfYnVzX29wcyBtdjg4ZTZ4eHhfc21pX211bHRpX2NoaXBfb3BzID0gewogCS5yZWFkID0gbXY4OGU2eHh4X3NtaV9tdWx0aV9jaGlwX3JlYWQsCiAJLndyaXRlID0gbXY4OGU2eHh4X3NtaV9tdWx0aV9jaGlwX3dyaXRlLAogfTsKIAotc3RhdGljIGludCBtdjg4ZTZ4eHhfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCi0JCQkgIGludCBhZGRyLCBpbnQgcmVnLCB1MTYgKnZhbCkKK2ludCBtdjg4ZTZ4eHhfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBhZGRyLCBpbnQgcmVnLCB1MTYgKnZhbCkKIHsKIAlpbnQgZXJyOwogCkBAIC0xOTksOCArMjAxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtdjg4ZTZ4eHhfd3JpdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAotCQkJICAgaW50IGFkZHIsIGludCByZWcsIHUxNiB2YWwpCitpbnQgbXY4OGU2eHh4X3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IGFkZHIsIGludCByZWcsIHUxNiB2YWwpCiB7CiAJaW50IGVycjsKIApAQCAtMjE2LDI1ICsyMTcsMTQ0IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIEluZGlyZWN0IHdyaXRlIHRvIHNpbmdsZSBwb2ludGVyLWRhdGEgcmVnaXN0ZXIgd2l0aCBhbiBVcGRhdGUgYml0ICovCi1zdGF0aWMgaW50IG12ODhlNnh4eF91cGRhdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgYWRkciwgaW50IHJlZywKLQkJCSAgICB1MTYgdXBkYXRlKQorc3RhdGljIGludCBtdjg4ZTZ4eHhfcG9ydF9yZWFkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHBvcnQsIGludCByZWcsCisJCQkgICAgICAgdTE2ICp2YWwpCiB7Ci0JdTE2IHZhbDsKLQlpbnQgaSwgZXJyOworCWludCBhZGRyID0gY2hpcC0+aW5mby0+cG9ydF9iYXNlX2FkZHIgKyBwb3J0OwogCi0JLyogV2FpdCB1bnRpbCB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCAqLwotCWZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisJcmV0dXJuIG12ODhlNnh4eF9yZWFkKGNoaXAsIGFkZHIsIHJlZywgdmFsKTsKK30KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfcG9ydF93cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBwb3J0LCBpbnQgcmVnLAorCQkJCXUxNiB2YWwpCit7CisJaW50IGFkZHIgPSBjaGlwLT5pbmZvLT5wb3J0X2Jhc2VfYWRkciArIHBvcnQ7CisKKwlyZXR1cm4gbXY4OGU2eHh4X3dyaXRlKGNoaXAsIGFkZHIsIHJlZywgdmFsKTsKK30KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfcGh5X3JlYWQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcGh5LAorCQkJICAgICAgaW50IHJlZywgdTE2ICp2YWwpCit7CisJaW50IGFkZHIgPSBwaHk7IC8qIFBIWSBkZXZpY2VzIGFkZHJlc3NlcyBzdGFydCBhdCAweDAgKi8KKworCWlmICghY2hpcC0+aW5mby0+b3BzLT5waHlfcmVhZCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJcmV0dXJuIGNoaXAtPmluZm8tPm9wcy0+cGh5X3JlYWQoY2hpcCwgYWRkciwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW50IG12ODhlNnh4eF9waHlfd3JpdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcGh5LAorCQkJICAgICAgIGludCByZWcsIHUxNiB2YWwpCit7CisJaW50IGFkZHIgPSBwaHk7IC8qIFBIWSBkZXZpY2VzIGFkZHJlc3NlcyBzdGFydCBhdCAweDAgKi8KKworCWlmICghY2hpcC0+aW5mby0+b3BzLT5waHlfd3JpdGUpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXJldHVybiBjaGlwLT5pbmZvLT5vcHMtPnBoeV93cml0ZShjaGlwLCBhZGRyLCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X3BoeV9wYWdlX2dldChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBwaHksIHU4IHBhZ2UpCit7CisJaWYgKCFtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX1BIWV9QQUdFKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJcmV0dXJuIG12ODhlNnh4eF9waHlfd3JpdGUoY2hpcCwgcGh5LCBQSFlfUEFHRSwgcGFnZSk7Cit9CisKK3N0YXRpYyB2b2lkIG12ODhlNnh4eF9waHlfcGFnZV9wdXQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcGh5KQoreworCWludCBlcnI7CisKKwkvKiBSZXN0b3JlIFBIWSBwYWdlIENvcHBlciAweDAgZm9yIGFjY2VzcyB2aWEgdGhlIHJlZ2lzdGVyZWQgTURJTyBidXMgKi8KKwllcnIgPSBtdjg4ZTZ4eHhfcGh5X3dyaXRlKGNoaXAsIHBoeSwgUEhZX1BBR0UsIFBIWV9QQUdFX0NPUFBFUik7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJZGV2X2VycihjaGlwLT5kZXYsICJmYWlsZWQgdG8gcmVzdG9yZSBQSFkgJWQgcGFnZSBDb3BwZXIgKCVkKVxuIiwKKwkJCXBoeSwgZXJyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X3BoeV9wYWdlX3JlYWQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcGh5LAorCQkJCSAgIHU4IHBhZ2UsIGludCByZWcsIHUxNiAqdmFsKQoreworCWludCBlcnI7CisKKwkvKiBUaGVyZSBpcyBubyBwYWdpbmcgZm9yIHJlZ2lzdGVycyAyMiAqLworCWlmIChyZWcgPT0gUEhZX1BBR0UpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gbXY4OGU2eHh4X3BoeV9wYWdlX2dldChjaGlwLCBwaHksIHBhZ2UpOworCWlmICghZXJyKSB7CisJCWVyciA9IG12ODhlNnh4eF9waHlfcmVhZChjaGlwLCBwaHksIHJlZywgdmFsKTsKKwkJbXY4OGU2eHh4X3BoeV9wYWdlX3B1dChjaGlwLCBwaHkpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X3BoeV9wYWdlX3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHBoeSwKKwkJCQkgICAgdTggcGFnZSwgaW50IHJlZywgdTE2IHZhbCkKK3sKKwlpbnQgZXJyOworCisJLyogVGhlcmUgaXMgbm8gcGFnaW5nIGZvciByZWdpc3RlcnMgMjIgKi8KKwlpZiAocmVnID09IFBIWV9QQUdFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IG12ODhlNnh4eF9waHlfcGFnZV9nZXQoY2hpcCwgcGh5LCBwYWdlKTsKKwlpZiAoIWVycikgeworCQllcnIgPSBtdjg4ZTZ4eHhfcGh5X3dyaXRlKGNoaXAsIHBoeSwgUEhZX1BBR0UsIHBhZ2UpOworCQltdjg4ZTZ4eHhfcGh5X3BhZ2VfcHV0KGNoaXAsIHBoeSk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfc2VyZGVzX3JlYWQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcmVnLCB1MTYgKnZhbCkKK3sKKwlyZXR1cm4gbXY4OGU2eHh4X3BoeV9wYWdlX3JlYWQoY2hpcCwgQUREUl9TRVJERVMsIFNFUkRFU19QQUdFX0ZJQkVSLAorCQkJCSAgICAgICByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X3NlcmRlc193cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCByZWcsIHUxNiB2YWwpCit7CisJcmV0dXJuIG12ODhlNnh4eF9waHlfcGFnZV93cml0ZShjaGlwLCBBRERSX1NFUkRFUywgU0VSREVTX1BBR0VfRklCRVIsCisJCQkJCXJlZywgdmFsKTsKK30KKworaW50IG12ODhlNnh4eF93YWl0KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IGFkZHIsIGludCByZWcsIHUxNiBtYXNrKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJdTE2IHZhbDsKKwkJaW50IGVycjsKKwogCQllcnIgPSBtdjg4ZTZ4eHhfcmVhZChjaGlwLCBhZGRyLCByZWcsICZ2YWwpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAotCQlpZiAoISh2YWwgJiBCSVQoMTUpKSkKLQkJCWJyZWFrOworCQlpZiAoISh2YWwgJiBtYXNrKSkKKwkJCXJldHVybiAwOworCisJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKIAl9CiAKLQlpZiAoaSA9PSAxNikKLQkJcmV0dXJuIC1FVElNRURPVVQ7CisJZGV2X2VycihjaGlwLT5kZXYsICJUaW1lb3V0IHdoaWxlIHdhaXRpbmcgZm9yIHN3aXRjaFxuIik7CisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKKy8qIEluZGlyZWN0IHdyaXRlIHRvIHNpbmdsZSBwb2ludGVyLWRhdGEgcmVnaXN0ZXIgd2l0aCBhbiBVcGRhdGUgYml0ICovCitpbnQgbXY4OGU2eHh4X3VwZGF0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBhZGRyLCBpbnQgcmVnLCB1MTYgdXBkYXRlKQoreworCXUxNiB2YWw7CisJaW50IGVycjsKKworCS8qIFdhaXQgdW50aWwgdGhlIHByZXZpb3VzIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQgKi8KKwllcnIgPSBtdjg4ZTZ4eHhfd2FpdChjaGlwLCBhZGRyLCByZWcsIEJJVCgxNSkpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAkvKiBTZXQgdGhlIFVwZGF0ZSBiaXQgdG8gdHJpZ2dlciBhIHdyaXRlIG9wZXJhdGlvbiAqLwogCXZhbCA9IEJJVCgxNSkgfCB1cGRhdGU7CkBAIC0yNDIsNjMgKzM2MiwyNyBAQAogCXJldHVybiBtdjg4ZTZ4eHhfd3JpdGUoY2hpcCwgYWRkciwgcmVnLCB2YWwpOwogfQogCi1zdGF0aWMgaW50IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgYWRkciwgaW50IHJlZykKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X3BwdV9kaXNhYmxlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKIHsKIAl1MTYgdmFsOwotCWludCBlcnI7CisJaW50IGksIGVycjsKIAotCWVyciA9IG12ODhlNnh4eF9yZWFkKGNoaXAsIGFkZHIsIHJlZywgJnZhbCk7CisJZXJyID0gbXY4OGU2eHh4X2cxX3JlYWQoY2hpcCwgR0xPQkFMX0NPTlRST0wsICZ2YWwpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlyZXR1cm4gdmFsOwotfQorCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfQ09OVFJPTCwKKwkJCQkgdmFsICYgfkdMT0JBTF9DT05UUk9MX1BQVV9FTkFCTEUpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLXN0YXRpYyBpbnQgX212ODhlNnh4eF9yZWdfd3JpdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgYWRkciwKLQkJCQlpbnQgcmVnLCB1MTYgdmFsKQotewotCXJldHVybiBtdjg4ZTZ4eHhfd3JpdGUoY2hpcCwgYWRkciwgcmVnLCB2YWwpOwotfQotCi1zdGF0aWMgaW50IG12ODhlNnh4eF9tZGlvX3JlYWRfZGlyZWN0KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKLQkJCQkgICAgICBpbnQgYWRkciwgaW50IHJlZ251bSkKLXsKLQlpZiAoYWRkciA+PSAwKQotCQlyZXR1cm4gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBhZGRyLCByZWdudW0pOwotCXJldHVybiAweGZmZmY7Ci19Ci0KLXN0YXRpYyBpbnQgbXY4OGU2eHh4X21kaW9fd3JpdGVfZGlyZWN0KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKLQkJCQkgICAgICAgaW50IGFkZHIsIGludCByZWdudW0sIHUxNiB2YWwpCi17Ci0JaWYgKGFkZHIgPj0gMCkKLQkJcmV0dXJuIF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIGFkZHIsIHJlZ251bSwgdmFsKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfcHB1X2Rpc2FibGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQotewotCWludCByZXQ7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OwotCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfQ09OVFJPTCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfQ09OVFJPTCwKLQkJCQkgICByZXQgJiB+R0xPQkFMX0NPTlRST0xfUFBVX0VOQUJMRSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXRpbWVvdXQgPSBqaWZmaWVzICsgMSAqIEhaOwotCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9TVEFUVVMpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJZXJyID0gbXY4OGU2eHh4X2cxX3JlYWQoY2hpcCwgR0xPQkFMX1NUQVRVUywgJnZhbCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCiAJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKLQkJaWYgKChyZXQgJiBHTE9CQUxfU1RBVFVTX1BQVV9NQVNLKSAhPQotCQkgICAgR0xPQkFMX1NUQVRVU19QUFVfUE9MTElORykKKwkJaWYgKCh2YWwgJiBHTE9CQUxfU1RBVFVTX1BQVV9NQVNLKSAhPSBHTE9CQUxfU1RBVFVTX1BQVV9QT0xMSU5HKQogCQkJcmV0dXJuIDA7CiAJfQogCkBAIC0zMDcsMjcgKzM5MSwyNSBAQAogCiBzdGF0aWMgaW50IG12ODhlNnh4eF9wcHVfZW5hYmxlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKIHsKLQlpbnQgcmV0LCBlcnI7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXUxNiB2YWw7CisJaW50IGksIGVycjsKIAotCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX0NPTlRST0wpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JZXJyID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX0NPTlRST0wsCi0JCQkJICAgcmV0IHwgR0xPQkFMX0NPTlRST0xfUFBVX0VOQUJMRSk7CisJZXJyID0gbXY4OGU2eHh4X2cxX3JlYWQoY2hpcCwgR0xPQkFMX0NPTlRST0wsICZ2YWwpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQl0aW1lb3V0ID0gamlmZmllcyArIDEgKiBIWjsKLQl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfU1RBVFVTKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfQ09OVFJPTCwKKwkJCQkgdmFsIHwgR0xPQkFMX0NPTlRST0xfUFBVX0VOQUJMRSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWVyciA9IG12ODhlNnh4eF9nMV9yZWFkKGNoaXAsIEdMT0JBTF9TVEFUVVMsICZ2YWwpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAogCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7Ci0JCWlmICgocmV0ICYgR0xPQkFMX1NUQVRVU19QUFVfTUFTSykgPT0KLQkJICAgIEdMT0JBTF9TVEFUVVNfUFBVX1BPTExJTkcpCisJCWlmICgodmFsICYgR0xPQkFMX1NUQVRVU19QUFVfTUFTSykgPT0gR0xPQkFMX1NUQVRVU19QUFVfUE9MTElORykKIAkJCXJldHVybiAwOwogCX0KIApAQCAtNDAwLDMyICs0ODIsMzcgQEAKIAljaGlwLT5wcHVfdGltZXIuZnVuY3Rpb24gPSBtdjg4ZTZ4eHhfcHB1X3JlZW5hYmxlX3RpbWVyOwogfQogCi1zdGF0aWMgaW50IG12ODhlNnh4eF9tZGlvX3JlYWRfcHB1KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IGFkZHIsCi0JCQkJICAgaW50IHJlZ251bSkKK3N0YXRpYyB2b2lkIG12ODhlNnh4eF9wcHVfc3RhdGVfZGVzdHJveShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCiB7Ci0JaW50IHJldDsKLQotCXJldCA9IG12ODhlNnh4eF9wcHVfYWNjZXNzX2dldChjaGlwKTsKLQlpZiAocmV0ID49IDApIHsKLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBhZGRyLCByZWdudW0pOwotCQltdjg4ZTZ4eHhfcHB1X2FjY2Vzc19wdXQoY2hpcCk7Ci0JfQotCi0JcmV0dXJuIHJldDsKKwlkZWxfdGltZXJfc3luYygmY2hpcC0+cHB1X3RpbWVyKTsKIH0KIAotc3RhdGljIGludCBtdjg4ZTZ4eHhfbWRpb193cml0ZV9wcHUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgYWRkciwKLQkJCQkgICAgaW50IHJlZ251bSwgdTE2IHZhbCkKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X3BoeV9wcHVfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBhZGRyLAorCQkJCSAgaW50IHJlZywgdTE2ICp2YWwpCiB7Ci0JaW50IHJldDsKKwlpbnQgZXJyOwogCi0JcmV0ID0gbXY4OGU2eHh4X3BwdV9hY2Nlc3NfZ2V0KGNoaXApOwotCWlmIChyZXQgPj0gMCkgewotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBhZGRyLCByZWdudW0sIHZhbCk7CisJZXJyID0gbXY4OGU2eHh4X3BwdV9hY2Nlc3NfZ2V0KGNoaXApOworCWlmICghZXJyKSB7CisJCWVyciA9IG12ODhlNnh4eF9yZWFkKGNoaXAsIGFkZHIsIHJlZywgdmFsKTsKIAkJbXY4OGU2eHh4X3BwdV9hY2Nlc3NfcHV0KGNoaXApOwogCX0KIAotCXJldHVybiByZXQ7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfcGh5X3BwdV93cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBhZGRyLAorCQkJCSAgIGludCByZWcsIHUxNiB2YWwpCit7CisJaW50IGVycjsKKworCWVyciA9IG12ODhlNnh4eF9wcHVfYWNjZXNzX2dldChjaGlwKTsKKwlpZiAoIWVycikgeworCQllcnIgPSBtdjg4ZTZ4eHhfd3JpdGUoY2hpcCwgYWRkciwgcmVnLCB2YWwpOworCQltdjg4ZTZ4eHhfcHB1X2FjY2Vzc19wdXQoY2hpcCk7CisJfQorCisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGJvb2wgbXY4OGU2eHh4XzYwNjVfZmFtaWx5KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKQEAgLTQ2OCwyMSArNTU1LDYgQEAKIAlyZXR1cm4gY2hpcC0+aW5mby0+ZmFtaWx5ID09IE1WODhFNlhYWF9GQU1JTFlfNjM1MjsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBtdjg4ZTZ4eHhfbnVtX2RhdGFiYXNlcyhzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCi17Ci0JcmV0dXJuIGNoaXAtPmluZm8tPm51bV9kYXRhYmFzZXM7Ci19Ci0KLXN0YXRpYyBib29sIG12ODhlNnh4eF9oYXNfZmlkX3JlZyhzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCi17Ci0JLyogRG9lcyB0aGUgZGV2aWNlIGhhdmUgZGVkaWNhdGVkIEZJRCByZWdpc3RlcnMgZm9yIEFUVSBhbmQgVlRVIG9wcz8gKi8KLQlpZiAobXY4OGU2eHh4XzYwOTdfZmFtaWx5KGNoaXApIHx8IG12ODhlNnh4eF82MTY1X2ZhbWlseShjaGlwKSB8fAotCSAgICBtdjg4ZTZ4eHhfNjM1MV9mYW1pbHkoY2hpcCkgfHwgbXY4OGU2eHh4XzYzNTJfZmFtaWx5KGNoaXApKQotCQlyZXR1cm4gdHJ1ZTsKLQotCXJldHVybiBmYWxzZTsKLX0KLQogLyogV2UgZXhwZWN0IHRoZSBzd2l0Y2ggdG8gcGVyZm9ybSBhdXRvIG5lZ290aWF0aW9uIGlmIHRoZXJlIGlzIGEgcmVhbAogICogcGh5LiBIb3dldmVyLCBpbiB0aGUgY2FzZSBvZiBhIGZpeGVkIGxpbmsgcGh5LCB3ZSBmb3JjZSB0aGUgcG9ydAogICogc2V0dGluZ3MgZnJvbSB0aGUgZml4ZWQgbGluayBzZXR0aW5ncy4KQEAgLTQ5MCwyNCArNTYyLDI0IEBACiBzdGF0aWMgdm9pZCBtdjg4ZTZ4eHhfYWRqdXN0X2xpbmsoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAkJCQkgIHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7Ci0JdTMyIHJlZzsKLQlpbnQgcmV0OworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OworCXUxNiByZWc7CisJaW50IGVycjsKIAogCWlmICghcGh5X2lzX3BzZXVkb19maXhlZF9saW5rKHBoeWRldikpCiAJCXJldHVybjsKIAogCW11dGV4X2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKIAotCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX1BPUlQocG9ydCksIFBPUlRfUENTX0NUUkwpOwotCWlmIChyZXQgPCAwKQorCWVyciA9IG12ODhlNnh4eF9wb3J0X3JlYWQoY2hpcCwgcG9ydCwgUE9SVF9QQ1NfQ1RSTCwgJnJlZyk7CisJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKLQlyZWcgPSByZXQgJiB+KFBPUlRfUENTX0NUUkxfTElOS19VUCB8Ci0JCSAgICAgIFBPUlRfUENTX0NUUkxfRk9SQ0VfTElOSyB8Ci0JCSAgICAgIFBPUlRfUENTX0NUUkxfRFVQTEVYX0ZVTEwgfAotCQkgICAgICBQT1JUX1BDU19DVFJMX0ZPUkNFX0RVUExFWCB8Ci0JCSAgICAgIFBPUlRfUENTX0NUUkxfVU5GT1JDRUQpOworCXJlZyAmPSB+KFBPUlRfUENTX0NUUkxfTElOS19VUCB8CisJCSBQT1JUX1BDU19DVFJMX0ZPUkNFX0xJTksgfAorCQkgUE9SVF9QQ1NfQ1RSTF9EVVBMRVhfRlVMTCB8CisJCSBQT1JUX1BDU19DVFJMX0ZPUkNFX0RVUExFWCB8CisJCSBQT1JUX1BDU19DVFJMX1VORk9SQ0VEKTsKIAogCXJlZyB8PSBQT1JUX1BDU19DVFJMX0ZPUkNFX0xJTks7CiAJaWYgKHBoeWRldi0+bGluaykKQEAgLTUzNiw3ICs2MDgsNyBAQAogCQlyZWcgfD0gUE9SVF9QQ1NfQ1RSTF9EVVBMRVhfRlVMTDsKIAogCWlmICgobXY4OGU2eHh4XzYzNTJfZmFtaWx5KGNoaXApIHx8IG12ODhlNnh4eF82MzUxX2ZhbWlseShjaGlwKSkgJiYKLQkgICAgKHBvcnQgPj0gY2hpcC0+aW5mby0+bnVtX3BvcnRzIC0gMikpIHsKKwkgICAgKHBvcnQgPj0gbXY4OGU2eHh4X251bV9wb3J0cyhjaGlwKSAtIDIpKSB7CiAJCWlmIChwaHlkZXYtPmludGVyZmFjZSA9PSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUlfUlhJRCkKIAkJCXJlZyB8PSBQT1JUX1BDU19DVFJMX1JHTUlJX0RFTEFZX1JYQ0xLOwogCQlpZiAocGh5ZGV2LT5pbnRlcmZhY2UgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJX1RYSUQpCkBAIC01NDUsNyArNjE3LDcgQEAKIAkJCXJlZyB8PSAoUE9SVF9QQ1NfQ1RSTF9SR01JSV9ERUxBWV9SWENMSyB8CiAJCQkJUE9SVF9QQ1NfQ1RSTF9SR01JSV9ERUxBWV9UWENMSyk7CiAJfQotCV9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19QT1JUKHBvcnQpLCBQT1JUX1BDU19DVFJMLCByZWcpOworCW12ODhlNnh4eF9wb3J0X3dyaXRlKGNoaXAsIHBvcnQsIFBPUlRfUENTX0NUUkwsIHJlZyk7CiAKIG91dDoKIAltdXRleF91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKQEAgLTU1MywxMiArNjI1LDEyIEBACiAKIHN0YXRpYyBpbnQgX212ODhlNnh4eF9zdGF0c193YWl0KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKIHsKLQlpbnQgcmV0OwotCWludCBpOworCXUxNiB2YWw7CisJaW50IGksIGVycjsKIAogCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX1NUQVRTX09QKTsKLQkJaWYgKChyZXQgJiBHTE9CQUxfU1RBVFNfT1BfQlVTWSkgPT0gMCkKKwkJZXJyID0gbXY4OGU2eHh4X2cxX3JlYWQoY2hpcCwgR0xPQkFMX1NUQVRTX09QLCAmdmFsKTsKKwkJaWYgKCh2YWwgJiBHTE9CQUxfU1RBVFNfT1BfQlVTWSkgPT0gMCkKIAkJCXJldHVybiAwOwogCX0KIApAQCAtNTY3LDU1ICs2MzksNTIgQEAKIAogc3RhdGljIGludCBfbXY4OGU2eHh4X3N0YXRzX3NuYXBzaG90KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHBvcnQpCiB7Ci0JaW50IHJldDsKKwlpbnQgZXJyOwogCiAJaWYgKG12ODhlNnh4eF82MzIwX2ZhbWlseShjaGlwKSB8fCBtdjg4ZTZ4eHhfNjM1Ml9mYW1pbHkoY2hpcCkpCiAJCXBvcnQgPSAocG9ydCArIDEpIDw8IDU7CiAKIAkvKiBTbmFwc2hvdCB0aGUgaGFyZHdhcmUgc3RhdGlzdGljcyBjb3VudGVycyBmb3IgdGhpcyBwb3J0LiAqLwotCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9TVEFUU19PUCwKLQkJCQkgICBHTE9CQUxfU1RBVFNfT1BfQ0FQVFVSRV9QT1JUIHwKLQkJCQkgICBHTE9CQUxfU1RBVFNfT1BfSElTVF9SWF9UWCB8IHBvcnQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfU1RBVFNfT1AsCisJCQkJIEdMT0JBTF9TVEFUU19PUF9DQVBUVVJFX1BPUlQgfAorCQkJCSBHTE9CQUxfU1RBVFNfT1BfSElTVF9SWF9UWCB8IHBvcnQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAkvKiBXYWl0IGZvciB0aGUgc25hcHNob3R0aW5nIHRvIGNvbXBsZXRlLiAqLwotCXJldCA9IF9tdjg4ZTZ4eHhfc3RhdHNfd2FpdChjaGlwKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiAwOworCXJldHVybiBfbXY4OGU2eHh4X3N0YXRzX3dhaXQoY2hpcCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9tdjg4ZTZ4eHhfc3RhdHNfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCiAJCQkJICBpbnQgc3RhdCwgdTMyICp2YWwpCiB7Ci0JdTMyIF92YWw7Ci0JaW50IHJldDsKKwl1MzIgdmFsdWU7CisJdTE2IHJlZzsKKwlpbnQgZXJyOwogCiAJKnZhbCA9IDA7CiAKLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfU1RBVFNfT1AsCi0JCQkJICAgR0xPQkFMX1NUQVRTX09QX1JFQURfQ0FQVFVSRUQgfAotCQkJCSAgIEdMT0JBTF9TVEFUU19PUF9ISVNUX1JYX1RYIHwgc3RhdCk7Ci0JaWYgKHJldCA8IDApCisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9TVEFUU19PUCwKKwkJCQkgR0xPQkFMX1NUQVRTX09QX1JFQURfQ0FQVFVSRUQgfAorCQkJCSBHTE9CQUxfU1RBVFNfT1BfSElTVF9SWF9UWCB8IHN0YXQpOworCWlmIChlcnIpCiAJCXJldHVybjsKIAotCXJldCA9IF9tdjg4ZTZ4eHhfc3RhdHNfd2FpdChjaGlwKTsKLQlpZiAocmV0IDwgMCkKKwllcnIgPSBfbXY4OGU2eHh4X3N0YXRzX3dhaXQoY2hpcCk7CisJaWYgKGVycikKIAkJcmV0dXJuOwogCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfU1RBVFNfQ09VTlRFUl8zMik7Ci0JaWYgKHJldCA8IDApCisJZXJyID0gbXY4OGU2eHh4X2cxX3JlYWQoY2hpcCwgR0xPQkFMX1NUQVRTX0NPVU5URVJfMzIsICZyZWcpOworCWlmIChlcnIpCiAJCXJldHVybjsKIAotCV92YWwgPSByZXQgPDwgMTY7CisJdmFsdWUgPSByZWcgPDwgMTY7CiAKLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9TVEFUU19DT1VOVEVSXzAxKTsKLQlpZiAocmV0IDwgMCkKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfcmVhZChjaGlwLCBHTE9CQUxfU1RBVFNfQ09VTlRFUl8wMSwgJnJlZyk7CisJaWYgKGVycikKIAkJcmV0dXJuOwogCi0JKnZhbCA9IF92YWwgfCByZXQ7CisJKnZhbCA9IHZhbHVlIHwgcmVnOwogfQogCiBzdGF0aWMgc3RydWN0IG12ODhlNnh4eF9od19zdGF0IG12ODhlNnh4eF9od19zdGF0c1tdID0gewpAQCAtNzA1LDIyICs3NzQsMjIgQEAKIHsKIAl1MzIgbG93OwogCXUzMiBoaWdoID0gMDsKLQlpbnQgcmV0OworCWludCBlcnI7CisJdTE2IHJlZzsKIAl1NjQgdmFsdWU7CiAKIAlzd2l0Y2ggKHMtPnR5cGUpIHsKIAljYXNlIFBPUlQ6Ci0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX1BPUlQocG9ydCksIHMtPnJlZyk7Ci0JCWlmIChyZXQgPCAwKQorCQllcnIgPSBtdjg4ZTZ4eHhfcG9ydF9yZWFkKGNoaXAsIHBvcnQsIHMtPnJlZywgJnJlZyk7CisJCWlmIChlcnIpCiAJCQlyZXR1cm4gVUlOVDY0X01BWDsKIAotCQlsb3cgPSByZXQ7CisJCWxvdyA9IHJlZzsKIAkJaWYgKHMtPnNpemVvZl9zdGF0ID09IDQpIHsKLQkJCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX1BPUlQocG9ydCksCi0JCQkJCQkgIHMtPnJlZyArIDEpOwotCQkJaWYgKHJldCA8IDApCisJCQllcnIgPSBtdjg4ZTZ4eHhfcG9ydF9yZWFkKGNoaXAsIHBvcnQsIHMtPnJlZyArIDEsICZyZWcpOworCQkJaWYgKGVycikKIAkJCQlyZXR1cm4gVUlOVDY0X01BWDsKLQkJCWhpZ2ggPSByZXQ7CisJCQloaWdoID0gcmVnOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgQkFOSzA6CkBAIC03MzYsNyArODA1LDcgQEAKIHN0YXRpYyB2b2lkIG12ODhlNnh4eF9nZXRfc3RyaW5ncyhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJCSAgdWludDhfdCAqZGF0YSkKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKIAlzdHJ1Y3QgbXY4OGU2eHh4X2h3X3N0YXQgKnN0YXQ7CiAJaW50IGksIGo7CiAKQEAgLTc1Miw3ICs4MjEsNyBAQAogCiBzdGF0aWMgaW50IG12ODhlNnh4eF9nZXRfc3NldF9jb3VudChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CiAJc3RydWN0IG12ODhlNnh4eF9od19zdGF0ICpzdGF0OwogCWludCBpLCBqOwogCkBAIC03NjcsNyArODM2LDcgQEAKIHN0YXRpYyB2b2lkIG12ODhlNnh4eF9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJCQl1aW50NjRfdCAqZGF0YSkKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKIAlzdHJ1Y3QgbXY4OGU2eHh4X2h3X3N0YXQgKnN0YXQ7CiAJaW50IHJldDsKIAlpbnQgaSwgajsKQEAgLTc5OCw3ICs4NjcsOSBAQAogc3RhdGljIHZvaWQgbXY4OGU2eHh4X2dldF9yZWdzKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywgdm9pZCAqX3ApCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CisJaW50IGVycjsKKwl1MTYgcmVnOwogCXUxNiAqcCA9IF9wOwogCWludCBpOwogCkBAIC04MDksMTcwICs4ODAsMTA2IEBACiAJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOwogCiAJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKLQkJaW50IHJldDsKIAotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19QT1JUKHBvcnQpLCBpKTsKLQkJaWYgKHJldCA+PSAwKQotCQkJcFtpXSA9IHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X3BvcnRfcmVhZChjaGlwLCBwb3J0LCBpLCAmcmVnKTsKKwkJaWYgKCFlcnIpCisJCQlwW2ldID0gcmVnOwogCX0KIAogCW11dGV4X3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwogfQogCi1zdGF0aWMgaW50IF9tdjg4ZTZ4eHhfd2FpdChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCByZWcsIGludCBvZmZzZXQsCi0JCQkgICB1MTYgbWFzaykKLXsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgSFogLyAxMDsKLQotCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewotCQlpbnQgcmV0OwotCi0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgcmVnLCBvZmZzZXQpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JCWlmICghKHJldCAmIG1hc2spKQotCQkJcmV0dXJuIDA7Ci0KLQkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwotCX0KLQlyZXR1cm4gLUVUSU1FRE9VVDsKLX0KLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfbWRpb193YWl0KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKLXsKLQlyZXR1cm4gX212ODhlNnh4eF93YWl0KGNoaXAsIFJFR19HTE9CQUwyLCBHTE9CQUwyX1NNSV9PUCwKLQkJCSAgICAgICBHTE9CQUwyX1NNSV9PUF9CVVNZKTsKLX0KLQogc3RhdGljIGludCBfbXY4OGU2eHh4X2F0dV93YWl0KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKIHsKLQlyZXR1cm4gX212ODhlNnh4eF93YWl0KGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9BVFVfT1AsCi0JCQkgICAgICAgR0xPQkFMX0FUVV9PUF9CVVNZKTsKLX0KLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfbWRpb19yZWFkX2luZGlyZWN0KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKLQkJCQkJaW50IGFkZHIsIGludCByZWdudW0pCi17Ci0JaW50IHJldDsKLQotCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwyLCBHTE9CQUwyX1NNSV9PUCwKLQkJCQkgICBHTE9CQUwyX1NNSV9PUF8yMl9SRUFEIHwgKGFkZHIgPDwgNSkgfAotCQkJCSAgIHJlZ251bSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBtdjg4ZTZ4eHhfbWRpb193YWl0KGNoaXApOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfR0xPQkFMMiwgR0xPQkFMMl9TTUlfREFUQSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG12ODhlNnh4eF9tZGlvX3dyaXRlX2luZGlyZWN0KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKLQkJCQkJIGludCBhZGRyLCBpbnQgcmVnbnVtLCB1MTYgdmFsKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMMiwgR0xPQkFMMl9TTUlfREFUQSwgdmFsKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwyLCBHTE9CQUwyX1NNSV9PUCwKLQkJCQkgICBHTE9CQUwyX1NNSV9PUF8yMl9XUklURSB8IChhZGRyIDw8IDUpIHwKLQkJCQkgICByZWdudW0pOwotCi0JcmV0dXJuIG12ODhlNnh4eF9tZGlvX3dhaXQoY2hpcCk7CisJcmV0dXJuIG12ODhlNnh4eF9nMV93YWl0KGNoaXAsIEdMT0JBTF9BVFVfT1AsIEdMT0JBTF9BVFVfT1BfQlVTWSk7CiB9CiAKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X2dldF9lZWUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAkJCSAgICAgc3RydWN0IGV0aHRvb2xfZWVlICplKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOwotCWludCByZWc7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CisJdTE2IHJlZzsKKwlpbnQgZXJyOwogCiAJaWYgKCFtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX0VFRSkpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCW11dGV4X2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKIAotCXJlZyA9IG12ODhlNnh4eF9tZGlvX3JlYWRfaW5kaXJlY3QoY2hpcCwgcG9ydCwgMTYpOwotCWlmIChyZWcgPCAwKQorCWVyciA9IG12ODhlNnh4eF9waHlfcmVhZChjaGlwLCBwb3J0LCAxNiwgJnJlZyk7CisJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKIAllLT5lZWVfZW5hYmxlZCA9ICEhKHJlZyAmIDB4MDIwMCk7CiAJZS0+dHhfbHBpX2VuYWJsZWQgPSAhIShyZWcgJiAweDAxMDApOwogCi0JcmVnID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfUE9SVChwb3J0KSwgUE9SVF9TVEFUVVMpOwotCWlmIChyZWcgPCAwKQorCWVyciA9IG12ODhlNnh4eF9wb3J0X3JlYWQoY2hpcCwgcG9ydCwgUE9SVF9TVEFUVVMsICZyZWcpOworCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCiAJZS0+ZWVlX2FjdGl2ZSA9ICEhKHJlZyAmIFBPUlRfU1RBVFVTX0VFRSk7Ci0JcmVnID0gMDsKLQogb3V0OgogCW11dGV4X3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwotCXJldHVybiByZWc7CisKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IG12ODhlNnh4eF9zZXRfZWVlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCQkgICAgIHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYsIHN0cnVjdCBldGh0b29sX2VlZSAqZSkKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKLQlpbnQgcmVnOwotCWludCByZXQ7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CisJdTE2IHJlZzsKKwlpbnQgZXJyOwogCiAJaWYgKCFtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX0VFRSkpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCW11dGV4X2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKIAotCXJldCA9IG12ODhlNnh4eF9tZGlvX3JlYWRfaW5kaXJlY3QoY2hpcCwgcG9ydCwgMTYpOwotCWlmIChyZXQgPCAwKQorCWVyciA9IG12ODhlNnh4eF9waHlfcmVhZChjaGlwLCBwb3J0LCAxNiwgJnJlZyk7CisJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKLQlyZWcgPSByZXQgJiB+MHgwMzAwOworCXJlZyAmPSB+MHgwMzAwOwogCWlmIChlLT5lZWVfZW5hYmxlZCkKIAkJcmVnIHw9IDB4MDIwMDsKIAlpZiAoZS0+dHhfbHBpX2VuYWJsZWQpCiAJCXJlZyB8PSAweDAxMDA7CiAKLQlyZXQgPSBtdjg4ZTZ4eHhfbWRpb193cml0ZV9pbmRpcmVjdChjaGlwLCBwb3J0LCAxNiwgcmVnKTsKKwllcnIgPSBtdjg4ZTZ4eHhfcGh5X3dyaXRlKGNoaXAsIHBvcnQsIDE2LCByZWcpOwogb3V0OgogCW11dGV4X3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfYXR1X2NtZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIHUxNiBmaWQsIHUxNiBjbWQpCiB7Ci0JaW50IHJldDsKKwl1MTYgdmFsOworCWludCBlcnI7CiAKLQlpZiAobXY4OGU2eHh4X2hhc19maWRfcmVnKGNoaXApKSB7Ci0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9BVFVfRklELAotCQkJCQkgICBmaWQpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7CisJaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfRzFfQVRVX0ZJRCkpIHsKKwkJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9BVFVfRklELCBmaWQpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAl9IGVsc2UgaWYgKG12ODhlNnh4eF9udW1fZGF0YWJhc2VzKGNoaXApID09IDI1NikgewogCQkvKiBBVFUgREJOdW1bNzo0XSBhcmUgbG9jYXRlZCBpbiBBVFUgQ29udHJvbCAxNToxMiAqLwotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9BVFVfQ09OVFJPTCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X2cxX3JlYWQoY2hpcCwgR0xPQkFMX0FUVV9DT05UUk9MLCAmdmFsKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAKLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX0FUVV9DT05UUk9MLAotCQkJCQkgICAocmV0ICYgMHhmZmYpIHwKLQkJCQkJICAgKChmaWQgPDwgOCkgJiAweGYwMDApKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX0FUVV9DT05UUk9MLAorCQkJCQkgKHZhbCAmIDB4ZmZmKSB8ICgoZmlkIDw8IDgpICYgMHhmMDAwKSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCiAJCS8qIEFUVSBEQk51bVszOjBdIGFyZSBsb2NhdGVkIGluIEFUVSBPcGVyYXRpb24gMzowICovCiAJCWNtZCB8PSBmaWQgJiAweGY7CiAJfQogCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX0FUVV9PUCwgY21kKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX0FUVV9PUCwgY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCiAJcmV0dXJuIF9tdjg4ZTZ4eHhfYXR1X3dhaXQoY2hpcCk7CiB9CkBAIC05OTcsNyArMTAwNCw3IEBACiAJCWRhdGEgfD0gKGVudHJ5LT5wb3J0dl90cnVua2lkIDw8IHNoaWZ0KSAmIG1hc2s7CiAJfQogCi0JcmV0dXJuIF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9BVFVfREFUQSwgZGF0YSk7CisJcmV0dXJuIG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfQVRVX0RBVEEsIGRhdGEpOwogfQogCiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfYXR1X2ZsdXNoX21vdmUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLApAQCAtMTA3Myw1NyArMTA4MCw0NSBAQAogCQkJCSB1OCBzdGF0ZSkKIHsKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBjaGlwLT5kczsKLQlpbnQgcmVnLCByZXQgPSAwOworCXUxNiByZWc7CisJaW50IGVycjsKIAl1OCBvbGRzdGF0ZTsKIAotCXJlZyA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX1BPUlQocG9ydCksIFBPUlRfQ09OVFJPTCk7Ci0JaWYgKHJlZyA8IDApCi0JCXJldHVybiByZWc7CisJZXJyID0gbXY4OGU2eHh4X3BvcnRfcmVhZChjaGlwLCBwb3J0LCBQT1JUX0NPTlRST0wsICZyZWcpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlvbGRzdGF0ZSA9IHJlZyAmIFBPUlRfQ09OVFJPTF9TVEFURV9NQVNLOwogCi0JaWYgKG9sZHN0YXRlICE9IHN0YXRlKSB7Ci0JCS8qIEZsdXNoIGZvcndhcmRpbmcgZGF0YWJhc2UgaWYgd2UncmUgbW92aW5nIGEgcG9ydAotCQkgKiBmcm9tIExlYXJuaW5nIG9yIEZvcndhcmRpbmcgc3RhdGUgdG8gRGlzYWJsZWQgb3IKLQkJICogQmxvY2tpbmcgb3IgTGlzdGVuaW5nIHN0YXRlLgotCQkgKi8KLQkJaWYgKChvbGRzdGF0ZSA9PSBQT1JUX0NPTlRST0xfU1RBVEVfTEVBUk5JTkcgfHwKLQkJICAgICBvbGRzdGF0ZSA9PSBQT1JUX0NPTlRST0xfU1RBVEVfRk9SV0FSRElORykgJiYKLQkJICAgIChzdGF0ZSA9PSBQT1JUX0NPTlRST0xfU1RBVEVfRElTQUJMRUQgfHwKLQkJICAgICBzdGF0ZSA9PSBQT1JUX0NPTlRST0xfU1RBVEVfQkxPQ0tJTkcpKSB7Ci0JCQlyZXQgPSBfbXY4OGU2eHh4X2F0dV9yZW1vdmUoY2hpcCwgMCwgcG9ydCwgZmFsc2UpOwotCQkJaWYgKHJldCkKLQkJCQlyZXR1cm4gcmV0OwotCQl9CisJcmVnICY9IH5QT1JUX0NPTlRST0xfU1RBVEVfTUFTSzsKKwlyZWcgfD0gc3RhdGU7CiAKLQkJcmVnID0gKHJlZyAmIH5QT1JUX0NPTlRST0xfU1RBVEVfTUFTSykgfCBzdGF0ZTsKLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX1BPUlQocG9ydCksIFBPUlRfQ09OVFJPTCwKLQkJCQkJICAgcmVnKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7CisJZXJyID0gbXY4OGU2eHh4X3BvcnRfd3JpdGUoY2hpcCwgcG9ydCwgUE9SVF9DT05UUk9MLCByZWcpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLQkJbmV0ZGV2X2RiZyhkcy0+cG9ydHNbcG9ydF0ubmV0ZGV2LCAiUG9ydFN0YXRlICVzICh3YXMgJXMpXG4iLAotCQkJICAgbXY4OGU2eHh4X3BvcnRfc3RhdGVfbmFtZXNbc3RhdGVdLAotCQkJICAgbXY4OGU2eHh4X3BvcnRfc3RhdGVfbmFtZXNbb2xkc3RhdGVdKTsKLQl9CisJbmV0ZGV2X2RiZyhkcy0+cG9ydHNbcG9ydF0ubmV0ZGV2LCAiUG9ydFN0YXRlICVzICh3YXMgJXMpXG4iLAorCQkgICBtdjg4ZTZ4eHhfcG9ydF9zdGF0ZV9uYW1lc1tzdGF0ZV0sCisJCSAgIG12ODhlNnh4eF9wb3J0X3N0YXRlX25hbWVzW29sZHN0YXRlXSk7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfcG9ydF9iYXNlZF92bGFuX21hcChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBwb3J0KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpicmlkZ2UgPSBjaGlwLT5wb3J0c1twb3J0XS5icmlkZ2VfZGV2OwotCWNvbnN0IHUxNiBtYXNrID0gKDEgPDwgY2hpcC0+aW5mby0+bnVtX3BvcnRzKSAtIDE7CisJY29uc3QgdTE2IG1hc2sgPSAoMSA8PCBtdjg4ZTZ4eHhfbnVtX3BvcnRzKGNoaXApKSAtIDE7CiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gY2hpcC0+ZHM7CiAJdTE2IG91dHB1dF9wb3J0cyA9IDA7Ci0JaW50IHJlZzsKKwl1MTYgcmVnOworCWludCBlcnI7CiAJaW50IGk7CiAKIAkvKiBhbGxvdyBDUFUgcG9ydCBvciBEU0EgbGluayhzKSB0byBzZW5kIGZyYW1lcyB0byBldmVyeSBwb3J0ICovCiAJaWYgKGRzYV9pc19jcHVfcG9ydChkcywgcG9ydCkgfHwgZHNhX2lzX2RzYV9wb3J0KGRzLCBwb3J0KSkgewogCQlvdXRwdXRfcG9ydHMgPSBtYXNrOwogCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5pbmZvLT5udW1fcG9ydHM7ICsraSkgeworCQlmb3IgKGkgPSAwOyBpIDwgbXY4OGU2eHh4X251bV9wb3J0cyhjaGlwKTsgKytpKSB7CiAJCQkvKiBhbGxvdyBzZW5kaW5nIGZyYW1lcyB0byBldmVyeSBncm91cCBtZW1iZXIgKi8KIAkJCWlmIChicmlkZ2UgJiYgY2hpcC0+cG9ydHNbaV0uYnJpZGdlX2RldiA9PSBicmlkZ2UpCiAJCQkJb3V0cHV0X3BvcnRzIHw9IEJJVChpKTsKQEAgLTExMzcsMjAgKzExMzIsMjAgQEAKIAkvKiBwcmV2ZW50IGZyYW1lcyBmcm9tIGdvaW5nIGJhY2sgb3V0IG9mIHRoZSBwb3J0IHRoZXkgY2FtZSBpbiBvbiAqLwogCW91dHB1dF9wb3J0cyAmPSB+QklUKHBvcnQpOwogCi0JcmVnID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfUE9SVChwb3J0KSwgUE9SVF9CQVNFX1ZMQU4pOwotCWlmIChyZWcgPCAwKQotCQlyZXR1cm4gcmVnOworCWVyciA9IG12ODhlNnh4eF9wb3J0X3JlYWQoY2hpcCwgcG9ydCwgUE9SVF9CQVNFX1ZMQU4sICZyZWcpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlyZWcgJj0gfm1hc2s7CiAJcmVnIHw9IG91dHB1dF9wb3J0cyAmIG1hc2s7CiAKLQlyZXR1cm4gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX1BPUlQocG9ydCksIFBPUlRfQkFTRV9WTEFOLCByZWcpOworCXJldHVybiBtdjg4ZTZ4eHhfcG9ydF93cml0ZShjaGlwLCBwb3J0LCBQT1JUX0JBU0VfVkxBTiwgcmVnKTsKIH0KIAogc3RhdGljIHZvaWQgbXY4OGU2eHh4X3BvcnRfc3RwX3N0YXRlX3NldChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJCQkgdTggc3RhdGUpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CiAJaW50IHN0cF9zdGF0ZTsKIAlpbnQgZXJyOwogCkBAIC0xMTgxLDI3ICsxMTc2LDM5IEBACiAJCQkgICBtdjg4ZTZ4eHhfcG9ydF9zdGF0ZV9uYW1lc1tzdHBfc3RhdGVdKTsKIH0KIAorc3RhdGljIHZvaWQgbXY4OGU2eHh4X3BvcnRfZmFzdF9hZ2Uoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCkKK3sKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKKwlpbnQgZXJyOworCisJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOworCWVyciA9IF9tdjg4ZTZ4eHhfYXR1X3JlbW92ZShjaGlwLCAwLCBwb3J0LCBmYWxzZSk7CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisKKwlpZiAoZXJyKQorCQluZXRkZXZfZXJyKGRzLT5wb3J0c1twb3J0XS5uZXRkZXYsICJmYWlsZWQgdG8gZmx1c2ggQVRVXG4iKTsKK30KKwogc3RhdGljIGludCBfbXY4OGU2eHh4X3BvcnRfcHZpZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBwb3J0LAogCQkJCXUxNiAqbmV3LCB1MTYgKm9sZCkKIHsKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBjaGlwLT5kczsKLQl1MTYgcHZpZDsKLQlpbnQgcmV0OworCXUxNiBwdmlkLCByZWc7CisJaW50IGVycjsKIAotCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX1BPUlQocG9ydCksIFBPUlRfREVGQVVMVF9WTEFOKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBtdjg4ZTZ4eHhfcG9ydF9yZWFkKGNoaXAsIHBvcnQsIFBPUlRfREVGQVVMVF9WTEFOLCAmcmVnKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCi0JcHZpZCA9IHJldCAmIFBPUlRfREVGQVVMVF9WTEFOX01BU0s7CisJcHZpZCA9IHJlZyAmIFBPUlRfREVGQVVMVF9WTEFOX01BU0s7CiAKIAlpZiAobmV3KSB7Ci0JCXJldCAmPSB+UE9SVF9ERUZBVUxUX1ZMQU5fTUFTSzsKLQkJcmV0IHw9ICpuZXcgJiBQT1JUX0RFRkFVTFRfVkxBTl9NQVNLOworCQlyZWcgJj0gflBPUlRfREVGQVVMVF9WTEFOX01BU0s7CisJCXJlZyB8PSAqbmV3ICYgUE9SVF9ERUZBVUxUX1ZMQU5fTUFTSzsKIAotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfUE9SVChwb3J0KSwKLQkJCQkJICAgUE9SVF9ERUZBVUxUX1ZMQU4sIHJldCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X3BvcnRfd3JpdGUoY2hpcCwgcG9ydCwgUE9SVF9ERUZBVUxUX1ZMQU4sIHJlZyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCiAJCW5ldGRldl9kYmcoZHMtPnBvcnRzW3BvcnRdLm5ldGRldiwKIAkJCSAgICJEZWZhdWx0VklEICVkICh3YXMgJWQpXG4iLCAqbmV3LCBwdmlkKTsKQEAgLTEyMjcsMTcgKzEyMzQsMTYgQEAKIAogc3RhdGljIGludCBfbXY4OGU2eHh4X3Z0dV93YWl0KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKIHsKLQlyZXR1cm4gX212ODhlNnh4eF93YWl0KGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9WVFVfT1AsCi0JCQkgICAgICAgR0xPQkFMX1ZUVV9PUF9CVVNZKTsKKwlyZXR1cm4gbXY4OGU2eHh4X2cxX3dhaXQoY2hpcCwgR0xPQkFMX1ZUVV9PUCwgR0xPQkFMX1ZUVV9PUF9CVVNZKTsKIH0KIAogc3RhdGljIGludCBfbXY4OGU2eHh4X3Z0dV9jbWQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCB1MTYgb3ApCiB7Ci0JaW50IHJldDsKKwlpbnQgZXJyOwogCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX1ZUVV9PUCwgb3ApOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfVlRVX09QLCBvcCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCXJldHVybiBfbXY4OGU2eHh4X3Z0dV93YWl0KGNoaXApOwogfQpAQCAtMTI1NCwyMyArMTI2MCwyMSBAQAogfQogCiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfdnR1X3N0dV9kYXRhX3JlYWQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAotCQkJCQlzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9zdHVfZW50cnkgKmVudHJ5LAorCQkJCQlzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9lbnRyeSAqZW50cnksCiAJCQkJCXVuc2lnbmVkIGludCBuaWJibGVfb2Zmc2V0KQogewogCXUxNiByZWdzWzNdOwotCWludCBpOwotCWludCByZXQ7CisJaW50IGksIGVycjsKIAogCWZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHsKLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfR0xPQkFMLAotCQkJCQkgIEdMT0JBTF9WVFVfREFUQV8wXzMgKyBpKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQl1MTYgKnJlZyA9ICZyZWdzW2ldOwogCi0JCXJlZ3NbaV0gPSByZXQ7CisJCWVyciA9IG12ODhlNnh4eF9nMV9yZWFkKGNoaXAsIEdMT0JBTF9WVFVfREFUQV8wXzMgKyBpLCByZWcpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+aW5mby0+bnVtX3BvcnRzOyArK2kpIHsKKwlmb3IgKGkgPSAwOyBpIDwgbXY4OGU2eHh4X251bV9wb3J0cyhjaGlwKTsgKytpKSB7CiAJCXVuc2lnbmVkIGludCBzaGlmdCA9IChpICUgNCkgKiA0ICsgbmliYmxlX29mZnNldDsKIAkJdTE2IHJlZyA9IHJlZ3NbaSAvIDRdOwogCkBAIC0xMjgxLDI2ICsxMjg1LDI1IEBACiB9CiAKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X3Z0dV9kYXRhX3JlYWQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAotCQkJCSAgIHN0cnVjdCBtdjg4ZTZ4eHhfdnR1X3N0dV9lbnRyeSAqZW50cnkpCisJCQkJICAgc3RydWN0IG12ODhlNnh4eF92dHVfZW50cnkgKmVudHJ5KQogewogCXJldHVybiBfbXY4OGU2eHh4X3Z0dV9zdHVfZGF0YV9yZWFkKGNoaXAsIGVudHJ5LCAwKTsKIH0KIAogc3RhdGljIGludCBtdjg4ZTZ4eHhfc3R1X2RhdGFfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCi0JCQkJICAgc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5ICplbnRyeSkKKwkJCQkgICBzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9lbnRyeSAqZW50cnkpCiB7CiAJcmV0dXJuIF9tdjg4ZTZ4eHhfdnR1X3N0dV9kYXRhX3JlYWQoY2hpcCwgZW50cnksIDIpOwogfQogCiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfdnR1X3N0dV9kYXRhX3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKLQkJCQkJIHN0cnVjdCBtdjg4ZTZ4eHhfdnR1X3N0dV9lbnRyeSAqZW50cnksCisJCQkJCSBzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9lbnRyeSAqZW50cnksCiAJCQkJCSB1bnNpZ25lZCBpbnQgbmliYmxlX29mZnNldCkKIHsKIAl1MTYgcmVnc1szXSA9IHsgMCB9OwotCWludCBpOwotCWludCByZXQ7CisJaW50IGksIGVycjsKIAotCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5pbmZvLT5udW1fcG9ydHM7ICsraSkgeworCWZvciAoaSA9IDA7IGkgPCBtdjg4ZTZ4eHhfbnVtX3BvcnRzKGNoaXApOyArK2kpIHsKIAkJdW5zaWduZWQgaW50IHNoaWZ0ID0gKGkgJSA0KSAqIDQgKyBuaWJibGVfb2Zmc2V0OwogCQl1OCBkYXRhID0gZW50cnktPmRhdGFbaV07CiAKQEAgLTEzMDgsODYgKzEzMTEsODUgQEAKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsCi0JCQkJCSAgIEdMT0JBTF9WVFVfREFUQV8wXzMgKyBpLCByZWdzW2ldKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQl1MTYgcmVnID0gcmVnc1tpXTsKKworCQllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX1ZUVV9EQVRBXzBfMyArIGksIHJlZyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG12ODhlNnh4eF92dHVfZGF0YV93cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCi0JCQkJICAgIHN0cnVjdCBtdjg4ZTZ4eHhfdnR1X3N0dV9lbnRyeSAqZW50cnkpCisJCQkJICAgIHN0cnVjdCBtdjg4ZTZ4eHhfdnR1X2VudHJ5ICplbnRyeSkKIHsKIAlyZXR1cm4gX212ODhlNnh4eF92dHVfc3R1X2RhdGFfd3JpdGUoY2hpcCwgZW50cnksIDApOwogfQogCiBzdGF0aWMgaW50IG12ODhlNnh4eF9zdHVfZGF0YV93cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCi0JCQkJICAgIHN0cnVjdCBtdjg4ZTZ4eHhfdnR1X3N0dV9lbnRyeSAqZW50cnkpCisJCQkJICAgIHN0cnVjdCBtdjg4ZTZ4eHhfdnR1X2VudHJ5ICplbnRyeSkKIHsKIAlyZXR1cm4gX212ODhlNnh4eF92dHVfc3R1X2RhdGFfd3JpdGUoY2hpcCwgZW50cnksIDIpOwogfQogCiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfdnR1X3ZpZF93cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIHUxNiB2aWQpCiB7Ci0JcmV0dXJuIF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9WVFVfVklELAotCQkJCSAgICB2aWQgJiBHTE9CQUxfVlRVX1ZJRF9NQVNLKTsKKwlyZXR1cm4gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9WVFVfVklELAorCQkJCSAgdmlkICYgR0xPQkFMX1ZUVV9WSURfTUFTSyk7CiB9CiAKIHN0YXRpYyBpbnQgX212ODhlNnh4eF92dHVfZ2V0bmV4dChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCi0JCQkJICBzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9zdHVfZW50cnkgKmVudHJ5KQorCQkJCSAgc3RydWN0IG12ODhlNnh4eF92dHVfZW50cnkgKmVudHJ5KQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfdnR1X3N0dV9lbnRyeSBuZXh0ID0geyAwIH07Ci0JaW50IHJldDsKKwlzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9lbnRyeSBuZXh0ID0geyAwIH07CisJdTE2IHZhbDsKKwlpbnQgZXJyOwogCi0JcmV0ID0gX212ODhlNnh4eF92dHVfd2FpdChjaGlwKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBfbXY4OGU2eHh4X3Z0dV93YWl0KGNoaXApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLQlyZXQgPSBfbXY4OGU2eHh4X3Z0dV9jbWQoY2hpcCwgR0xPQkFMX1ZUVV9PUF9WVFVfR0VUX05FWFQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWVyciA9IF9tdjg4ZTZ4eHhfdnR1X2NtZChjaGlwLCBHTE9CQUxfVlRVX09QX1ZUVV9HRVRfTkVYVCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX1ZUVV9WSUQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWVyciA9IG12ODhlNnh4eF9nMV9yZWFkKGNoaXAsIEdMT0JBTF9WVFVfVklELCAmdmFsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCi0JbmV4dC52aWQgPSByZXQgJiBHTE9CQUxfVlRVX1ZJRF9NQVNLOwotCW5leHQudmFsaWQgPSAhIShyZXQgJiBHTE9CQUxfVlRVX1ZJRF9WQUxJRCk7CisJbmV4dC52aWQgPSB2YWwgJiBHTE9CQUxfVlRVX1ZJRF9NQVNLOworCW5leHQudmFsaWQgPSAhISh2YWwgJiBHTE9CQUxfVlRVX1ZJRF9WQUxJRCk7CiAKIAlpZiAobmV4dC52YWxpZCkgewotCQlyZXQgPSBtdjg4ZTZ4eHhfdnR1X2RhdGFfcmVhZChjaGlwLCAmbmV4dCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X3Z0dV9kYXRhX3JlYWQoY2hpcCwgJm5leHQpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAotCQlpZiAobXY4OGU2eHh4X2hhc19maWRfcmVnKGNoaXApKSB7Ci0JCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19HTE9CQUwsCi0JCQkJCQkgIEdMT0JBTF9WVFVfRklEKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCXJldHVybiByZXQ7CisJCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX0cxX1ZUVV9GSUQpKSB7CisJCQllcnIgPSBtdjg4ZTZ4eHhfZzFfcmVhZChjaGlwLCBHTE9CQUxfVlRVX0ZJRCwgJnZhbCk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CiAKLQkJCW5leHQuZmlkID0gcmV0ICYgR0xPQkFMX1ZUVV9GSURfTUFTSzsKKwkJCW5leHQuZmlkID0gdmFsICYgR0xPQkFMX1ZUVV9GSURfTUFTSzsKIAkJfSBlbHNlIGlmIChtdjg4ZTZ4eHhfbnVtX2RhdGFiYXNlcyhjaGlwKSA9PSAyNTYpIHsKIAkJCS8qIFZUVSBEQk51bVs3OjRdIGFyZSBsb2NhdGVkIGluIFZUVSBPcGVyYXRpb24gMTE6OCwgYW5kCiAJCQkgKiBWVFUgREJOdW1bMzowXSBhcmUgbG9jYXRlZCBpbiBWVFUgT3BlcmF0aW9uIDM6MAogCQkJICovCi0JCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19HTE9CQUwsCi0JCQkJCQkgIEdMT0JBTF9WVFVfT1ApOwotCQkJaWYgKHJldCA8IDApCi0JCQkJcmV0dXJuIHJldDsKKwkJCWVyciA9IG12ODhlNnh4eF9nMV9yZWFkKGNoaXAsIEdMT0JBTF9WVFVfT1AsICZ2YWwpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOwogCi0JCQluZXh0LmZpZCA9IChyZXQgJiAweGYwMCkgPj4gNDsKLQkJCW5leHQuZmlkIHw9IHJldCAmIDB4ZjsKKwkJCW5leHQuZmlkID0gKHZhbCAmIDB4ZjAwKSA+PiA0OworCQkJbmV4dC5maWQgfD0gdmFsICYgMHhmOwogCQl9CiAKIAkJaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfU1RVKSkgewotCQkJcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfR0xPQkFMLAotCQkJCQkJICBHTE9CQUxfVlRVX1NJRCk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gcmV0OworCQkJZXJyID0gbXY4OGU2eHh4X2cxX3JlYWQoY2hpcCwgR0xPQkFMX1ZUVV9TSUQsICZ2YWwpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOwogCi0JCQluZXh0LnNpZCA9IHJldCAmIEdMT0JBTF9WVFVfU0lEX01BU0s7CisJCQluZXh0LnNpZCA9IHZhbCAmIEdMT0JBTF9WVFVfU0lEX01BU0s7CiAJCX0KIAl9CiAKQEAgLTEzOTksOCArMTQwMSw4IEBACiAJCQkJICAgIHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfdmxhbiAqdmxhbiwKIAkJCQkgICAgaW50ICgqY2IpKHN0cnVjdCBzd2l0Y2hkZXZfb2JqICpvYmopKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOwotCXN0cnVjdCBtdjg4ZTZ4eHhfdnR1X3N0dV9lbnRyeSBuZXh0OworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OworCXN0cnVjdCBtdjg4ZTZ4eHhfdnR1X2VudHJ5IG5leHQ7CiAJdTE2IHB2aWQ7CiAJaW50IGVycjsKIApAQCAtMTQ1MSwzOCArMTQ1MywzNiBAQAogfQogCiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfdnR1X2xvYWRwdXJnZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCi0JCQkJICAgIHN0cnVjdCBtdjg4ZTZ4eHhfdnR1X3N0dV9lbnRyeSAqZW50cnkpCisJCQkJICAgIHN0cnVjdCBtdjg4ZTZ4eHhfdnR1X2VudHJ5ICplbnRyeSkKIHsKIAl1MTYgb3AgPSBHTE9CQUxfVlRVX09QX1ZUVV9MT0FEX1BVUkdFOwogCXUxNiByZWcgPSAwOwotCWludCByZXQ7CisJaW50IGVycjsKIAotCXJldCA9IF9tdjg4ZTZ4eHhfdnR1X3dhaXQoY2hpcCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJZXJyID0gX212ODhlNnh4eF92dHVfd2FpdChjaGlwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCiAJaWYgKCFlbnRyeS0+dmFsaWQpCiAJCWdvdG8gbG9hZHB1cmdlOwogCiAJLyogV3JpdGUgcG9ydCBtZW1iZXIgdGFncyAqLwotCXJldCA9IG12ODhlNnh4eF92dHVfZGF0YV93cml0ZShjaGlwLCBlbnRyeSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJZXJyID0gbXY4OGU2eHh4X3Z0dV9kYXRhX3dyaXRlKGNoaXAsIGVudHJ5KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCiAJaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfU1RVKSkgewogCQlyZWcgPSBlbnRyeS0+c2lkICYgR0xPQkFMX1ZUVV9TSURfTUFTSzsKLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX1ZUVV9TSUQsCi0JCQkJCSAgIHJlZyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9WVFVfU0lELCByZWcpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAl9CiAKLQlpZiAobXY4OGU2eHh4X2hhc19maWRfcmVnKGNoaXApKSB7CisJaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfRzFfVlRVX0ZJRCkpIHsKIAkJcmVnID0gZW50cnktPmZpZCAmIEdMT0JBTF9WVFVfRklEX01BU0s7Ci0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9WVFVfRklELAotCQkJCQkgICByZWcpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7CisJCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfVlRVX0ZJRCwgcmVnKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAJfSBlbHNlIGlmIChtdjg4ZTZ4eHhfbnVtX2RhdGFiYXNlcyhjaGlwKSA9PSAyNTYpIHsKIAkJLyogVlRVIERCTnVtWzc6NF0gYXJlIGxvY2F0ZWQgaW4gVlRVIE9wZXJhdGlvbiAxMTo4LCBhbmQKIAkJICogVlRVIERCTnVtWzM6MF0gYXJlIGxvY2F0ZWQgaW4gVlRVIE9wZXJhdGlvbiAzOjAKQEAgLTE0OTQsNDggKzE0OTQsNDkgQEAKIAlyZWcgPSBHTE9CQUxfVlRVX1ZJRF9WQUxJRDsKIGxvYWRwdXJnZToKIAlyZWcgfD0gZW50cnktPnZpZCAmIEdMT0JBTF9WVFVfVklEX01BU0s7Ci0JcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX1ZUVV9WSUQsIHJlZyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9WVFVfVklELCByZWcpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlyZXR1cm4gX212ODhlNnh4eF92dHVfY21kKGNoaXAsIG9wKTsKIH0KIAogc3RhdGljIGludCBfbXY4OGU2eHh4X3N0dV9nZXRuZXh0KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgdTggc2lkLAotCQkJCSAgc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5ICplbnRyeSkKKwkJCQkgIHN0cnVjdCBtdjg4ZTZ4eHhfdnR1X2VudHJ5ICplbnRyeSkKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9zdHVfZW50cnkgbmV4dCA9IHsgMCB9OwotCWludCByZXQ7CisJc3RydWN0IG12ODhlNnh4eF92dHVfZW50cnkgbmV4dCA9IHsgMCB9OworCXUxNiB2YWw7CisJaW50IGVycjsKIAotCXJldCA9IF9tdjg4ZTZ4eHhfdnR1X3dhaXQoY2hpcCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJZXJyID0gX212ODhlNnh4eF92dHVfd2FpdChjaGlwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX1ZUVV9TSUQsCi0JCQkJICAgc2lkICYgR0xPQkFMX1ZUVV9TSURfTUFTSyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9WVFVfU0lELAorCQkJCSBzaWQgJiBHTE9CQUxfVlRVX1NJRF9NQVNLKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCi0JcmV0ID0gX212ODhlNnh4eF92dHVfY21kKGNoaXAsIEdMT0JBTF9WVFVfT1BfU1RVX0dFVF9ORVhUKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBfbXY4OGU2eHh4X3Z0dV9jbWQoY2hpcCwgR0xPQkFMX1ZUVV9PUF9TVFVfR0VUX05FWFQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9WVFVfU0lEKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfcmVhZChjaGlwLCBHTE9CQUxfVlRVX1NJRCwgJnZhbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotCW5leHQuc2lkID0gcmV0ICYgR0xPQkFMX1ZUVV9TSURfTUFTSzsKKwluZXh0LnNpZCA9IHZhbCAmIEdMT0JBTF9WVFVfU0lEX01BU0s7CiAKLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9WVFVfVklEKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfcmVhZChjaGlwLCBHTE9CQUxfVlRVX1ZJRCwgJnZhbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotCW5leHQudmFsaWQgPSAhIShyZXQgJiBHTE9CQUxfVlRVX1ZJRF9WQUxJRCk7CisJbmV4dC52YWxpZCA9ICEhKHZhbCAmIEdMT0JBTF9WVFVfVklEX1ZBTElEKTsKIAogCWlmIChuZXh0LnZhbGlkKSB7Ci0JCXJldCA9IG12ODhlNnh4eF9zdHVfZGF0YV9yZWFkKGNoaXAsICZuZXh0KTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfc3R1X2RhdGFfcmVhZChjaGlwLCAmbmV4dCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KIAogCSplbnRyeSA9IG5leHQ7CkBAIC0xNTQzLDMzICsxNTQ0LDMzIEBACiB9CiAKIHN0YXRpYyBpbnQgX212ODhlNnh4eF9zdHVfbG9hZHB1cmdlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKLQkJCQkgICAgc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5ICplbnRyeSkKKwkJCQkgICAgc3RydWN0IG12ODhlNnh4eF92dHVfZW50cnkgKmVudHJ5KQogewogCXUxNiByZWcgPSAwOwotCWludCByZXQ7CisJaW50IGVycjsKIAotCXJldCA9IF9tdjg4ZTZ4eHhfdnR1X3dhaXQoY2hpcCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJZXJyID0gX212ODhlNnh4eF92dHVfd2FpdChjaGlwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCiAJaWYgKCFlbnRyeS0+dmFsaWQpCiAJCWdvdG8gbG9hZHB1cmdlOwogCiAJLyogV3JpdGUgcG9ydCBzdGF0ZXMgKi8KLQlyZXQgPSBtdjg4ZTZ4eHhfc3R1X2RhdGFfd3JpdGUoY2hpcCwgZW50cnkpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWVyciA9IG12ODhlNnh4eF9zdHVfZGF0YV93cml0ZShjaGlwLCBlbnRyeSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCXJlZyA9IEdMT0JBTF9WVFVfVklEX1ZBTElEOwogbG9hZHB1cmdlOgotCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9WVFVfVklELCByZWcpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfVlRVX1ZJRCwgcmVnKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCiAJcmVnID0gZW50cnktPnNpZCAmIEdMT0JBTF9WVFVfU0lEX01BU0s7Ci0JcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX1ZUVV9TSUQsIHJlZyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9WVFVfU0lELCByZWcpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlyZXR1cm4gX212ODhlNnh4eF92dHVfY21kKGNoaXAsIEdMT0JBTF9WVFVfT1BfU1RVX0xPQURfUFVSR0UpOwogfQpAQCAtMTU4MCw3ICsxNTgxLDggQEAKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBjaGlwLT5kczsKIAl1MTYgdXBwZXJfbWFzazsKIAl1MTYgZmlkOwotCWludCByZXQ7CisJdTE2IHJlZzsKKwlpbnQgZXJyOwogCiAJaWYgKG12ODhlNnh4eF9udW1fZGF0YWJhc2VzKGNoaXApID09IDQwOTYpCiAJCXVwcGVyX21hc2sgPSAweGZmOwpAQCAtMTU5MCwzNyArMTU5MiwzNSBAQAogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAkvKiBQb3J0J3MgZGVmYXVsdCBGSUQgYml0cyAzOjAgYXJlIGxvY2F0ZWQgaW4gcmVnIDB4MDYsIG9mZnNldCAxMiAqLwotCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX1BPUlQocG9ydCksIFBPUlRfQkFTRV9WTEFOKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBtdjg4ZTZ4eHhfcG9ydF9yZWFkKGNoaXAsIHBvcnQsIFBPUlRfQkFTRV9WTEFOLCAmcmVnKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCi0JZmlkID0gKHJldCAmIFBPUlRfQkFTRV9WTEFOX0ZJRF8zXzBfTUFTSykgPj4gMTI7CisJZmlkID0gKHJlZyAmIFBPUlRfQkFTRV9WTEFOX0ZJRF8zXzBfTUFTSykgPj4gMTI7CiAKIAlpZiAobmV3KSB7Ci0JCXJldCAmPSB+UE9SVF9CQVNFX1ZMQU5fRklEXzNfMF9NQVNLOwotCQlyZXQgfD0gKCpuZXcgPDwgMTIpICYgUE9SVF9CQVNFX1ZMQU5fRklEXzNfMF9NQVNLOworCQlyZWcgJj0gflBPUlRfQkFTRV9WTEFOX0ZJRF8zXzBfTUFTSzsKKwkJcmVnIHw9ICgqbmV3IDw8IDEyKSAmIFBPUlRfQkFTRV9WTEFOX0ZJRF8zXzBfTUFTSzsKIAotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfUE9SVChwb3J0KSwgUE9SVF9CQVNFX1ZMQU4sCi0JCQkJCSAgIHJldCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X3BvcnRfd3JpdGUoY2hpcCwgcG9ydCwgUE9SVF9CQVNFX1ZMQU4sIHJlZyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KIAogCS8qIFBvcnQncyBkZWZhdWx0IEZJRCBiaXRzIDExOjQgYXJlIGxvY2F0ZWQgaW4gcmVnIDB4MDUsIG9mZnNldCAwICovCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfUE9SVChwb3J0KSwgUE9SVF9DT05UUk9MXzEpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWVyciA9IG12ODhlNnh4eF9wb3J0X3JlYWQoY2hpcCwgcG9ydCwgUE9SVF9DT05UUk9MXzEsICZyZWcpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLQlmaWQgfD0gKHJldCAmIHVwcGVyX21hc2spIDw8IDQ7CisJZmlkIHw9IChyZWcgJiB1cHBlcl9tYXNrKSA8PCA0OwogCiAJaWYgKG5ldykgewotCQlyZXQgJj0gfnVwcGVyX21hc2s7Ci0JCXJldCB8PSAoKm5ldyA+PiA0KSAmIHVwcGVyX21hc2s7CisJCXJlZyAmPSB+dXBwZXJfbWFzazsKKwkJcmVnIHw9ICgqbmV3ID4+IDQpICYgdXBwZXJfbWFzazsKIAotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfUE9SVChwb3J0KSwgUE9SVF9DT05UUk9MXzEsCi0JCQkJCSAgIHJldCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X3BvcnRfd3JpdGUoY2hpcCwgcG9ydCwgUE9SVF9DT05UUk9MXzEsIHJlZyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCiAJCW5ldGRldl9kYmcoZHMtPnBvcnRzW3BvcnRdLm5ldGRldiwKIAkJCSAgICJGSUQgJWQgKHdhcyAlZClcbiIsICpuZXcsIGZpZCk7CkBAIC0xNjQ3LDEzICsxNjQ3LDEzIEBACiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfZmlkX25ldyhzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIHUxNiAqZmlkKQogewogCURFQ0xBUkVfQklUTUFQKGZpZF9iaXRtYXAsIE1WODhFNlhYWF9OX0ZJRCk7Ci0Jc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5IHZsYW47CisJc3RydWN0IG12ODhlNnh4eF92dHVfZW50cnkgdmxhbjsKIAlpbnQgaSwgZXJyOwogCiAJYml0bWFwX3plcm8oZmlkX2JpdG1hcCwgTVY4OEU2WFhYX05fRklEKTsKIAogCS8qIFNldCBldmVyeSBGSUQgYml0IHVzZWQgYnkgdGhlICh1bilicmlkZ2VkIHBvcnRzICovCi0JZm9yIChpID0gMDsgaSA8IGNoaXAtPmluZm8tPm51bV9wb3J0czsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IG12ODhlNnh4eF9udW1fcG9ydHMoY2hpcCk7ICsraSkgewogCQllcnIgPSBfbXY4OGU2eHh4X3BvcnRfZmlkX2dldChjaGlwLCBpLCBmaWQpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKQEAgLTE2ODksMTAgKzE2ODksMTAgQEAKIH0KIAogc3RhdGljIGludCBfbXY4OGU2eHh4X3Z0dV9uZXcoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCB1MTYgdmlkLAotCQkJICAgICAgc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5ICplbnRyeSkKKwkJCSAgICAgIHN0cnVjdCBtdjg4ZTZ4eHhfdnR1X2VudHJ5ICplbnRyeSkKIHsKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBjaGlwLT5kczsKLQlzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9zdHVfZW50cnkgdmxhbiA9IHsKKwlzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9lbnRyeSB2bGFuID0gewogCQkudmFsaWQgPSB0cnVlLAogCQkudmlkID0gdmlkLAogCX07CkBAIC0xNzAzLDE0ICsxNzAzLDE0IEBACiAJCXJldHVybiBlcnI7CiAKIAkvKiBleGNsdWRlIGFsbCBwb3J0cyBleGNlcHQgdGhlIENQVSBhbmQgRFNBIHBvcnRzICovCi0JZm9yIChpID0gMDsgaSA8IGNoaXAtPmluZm8tPm51bV9wb3J0czsgKytpKQorCWZvciAoaSA9IDA7IGkgPCBtdjg4ZTZ4eHhfbnVtX3BvcnRzKGNoaXApOyArK2kpCiAJCXZsYW4uZGF0YVtpXSA9IGRzYV9pc19jcHVfcG9ydChkcywgaSkgfHwgZHNhX2lzX2RzYV9wb3J0KGRzLCBpKQogCQkJPyBHTE9CQUxfVlRVX0RBVEFfTUVNQkVSX1RBR19VTk1PRElGSUVECiAJCQk6IEdMT0JBTF9WVFVfREFUQV9NRU1CRVJfVEFHX05PTl9NRU1CRVI7CiAKIAlpZiAobXY4OGU2eHh4XzYwOTdfZmFtaWx5KGNoaXApIHx8IG12ODhlNnh4eF82MTY1X2ZhbWlseShjaGlwKSB8fAogCSAgICBtdjg4ZTZ4eHhfNjM1MV9mYW1pbHkoY2hpcCkgfHwgbXY4OGU2eHh4XzYzNTJfZmFtaWx5KGNoaXApKSB7Ci0JCXN0cnVjdCBtdjg4ZTZ4eHhfdnR1X3N0dV9lbnRyeSB2c3RwOworCQlzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9lbnRyeSB2c3RwOwogCiAJCS8qIEFkZGluZyBhIFZUVSBlbnRyeSByZXF1aXJlcyBhIHZhbGlkIFNUVSBlbnRyeS4gQXMgVlNUUCBpcyBub3QKIAkJICogaW1wbGVtZW50ZWQsIG9ubHkgb25lIFNUVSBlbnRyeSBpcyBuZWVkZWQgdG8gY292ZXIgYWxsIFZUVQpAQCAtMTczNyw3ICsxNzM3LDcgQEAKIH0KIAogc3RhdGljIGludCBfbXY4OGU2eHh4X3Z0dV9nZXQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCB1MTYgdmlkLAotCQkJICAgICAgc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5ICplbnRyeSwgYm9vbCBjcmVhdCkKKwkJCSAgICAgIHN0cnVjdCBtdjg4ZTZ4eHhfdnR1X2VudHJ5ICplbnRyeSwgYm9vbCBjcmVhdCkKIHsKIAlpbnQgZXJyOwogCkBAIC0xNzY4LDggKzE3NjgsOCBAQAogc3RhdGljIGludCBtdjg4ZTZ4eHhfcG9ydF9jaGVja19od192bGFuKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCQkJCXUxNiB2aWRfYmVnaW4sIHUxNiB2aWRfZW5kKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOwotCXN0cnVjdCBtdjg4ZTZ4eHhfdnR1X3N0dV9lbnRyeSB2bGFuOworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OworCXN0cnVjdCBtdjg4ZTZ4eHhfdnR1X2VudHJ5IHZsYW47CiAJaW50IGksIGVycjsKIAogCWlmICghdmlkX2JlZ2luKQpAQCAtMTc5Miw3ICsxNzkyLDcgQEAKIAkJaWYgKHZsYW4udmlkID4gdmlkX2VuZCkKIAkJCWJyZWFrOwogCi0JCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5pbmZvLT5udW1fcG9ydHM7ICsraSkgeworCQlmb3IgKGkgPSAwOyBpIDwgbXY4OGU2eHh4X251bV9wb3J0cyhjaGlwKTsgKytpKSB7CiAJCQlpZiAoZHNhX2lzX2RzYV9wb3J0KGRzLCBpKSB8fCBkc2FfaXNfY3B1X3BvcnQoZHMsIGkpKQogCQkJCWNvbnRpbnVlOwogCkBAIC0xODI5LDI5ICsxODI5LDI5IEBACiBzdGF0aWMgaW50IG12ODhlNnh4eF9wb3J0X3ZsYW5fZmlsdGVyaW5nKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCQkJCSBib29sIHZsYW5fZmlsdGVyaW5nKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OwogCXUxNiBvbGQsIG5ldyA9IHZsYW5fZmlsdGVyaW5nID8gUE9SVF9DT05UUk9MXzJfODAyMVFfU0VDVVJFIDoKIAkJUE9SVF9DT05UUk9MXzJfODAyMVFfRElTQUJMRUQ7Ci0JaW50IHJldDsKKwl1MTYgcmVnOworCWludCBlcnI7CiAKIAlpZiAoIW12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfVlRVKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOwogCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfUE9SVChwb3J0KSwgUE9SVF9DT05UUk9MXzIpOwotCWlmIChyZXQgPCAwKQorCWVyciA9IG12ODhlNnh4eF9wb3J0X3JlYWQoY2hpcCwgcG9ydCwgUE9SVF9DT05UUk9MXzIsICZyZWcpOworCWlmIChlcnIpCiAJCWdvdG8gdW5sb2NrOwogCi0Jb2xkID0gcmV0ICYgUE9SVF9DT05UUk9MXzJfODAyMVFfTUFTSzsKKwlvbGQgPSByZWcgJiBQT1JUX0NPTlRST0xfMl84MDIxUV9NQVNLOwogCiAJaWYgKG5ldyAhPSBvbGQpIHsKLQkJcmV0ICY9IH5QT1JUX0NPTlRST0xfMl84MDIxUV9NQVNLOwotCQlyZXQgfD0gbmV3ICYgUE9SVF9DT05UUk9MXzJfODAyMVFfTUFTSzsKKwkJcmVnICY9IH5QT1JUX0NPTlRST0xfMl84MDIxUV9NQVNLOworCQlyZWcgfD0gbmV3ICYgUE9SVF9DT05UUk9MXzJfODAyMVFfTUFTSzsKIAotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfUE9SVChwb3J0KSwgUE9SVF9DT05UUk9MXzIsCi0JCQkJCSAgIHJldCk7Ci0JCWlmIChyZXQgPCAwKQorCQllcnIgPSBtdjg4ZTZ4eHhfcG9ydF93cml0ZShjaGlwLCBwb3J0LCBQT1JUX0NPTlRST0xfMiwgcmVnKTsKKwkJaWYgKGVycikKIAkJCWdvdG8gdW5sb2NrOwogCiAJCW5ldGRldl9kYmcoZHMtPnBvcnRzW3BvcnRdLm5ldGRldiwgIjgwMi4xUSBNb2RlICVzICh3YXMgJXMpXG4iLApAQCAtMTg1OSwxMSArMTg1OSwxMSBAQAogCQkJICAgbXY4OGU2eHh4X3BvcnRfODAyMXFfbW9kZV9uYW1lc1tvbGRdKTsKIAl9CiAKLQlyZXQgPSAwOworCWVyciA9IDA7CiB1bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTE4NzEsNyArMTg3MSw3IEBACiAJCQkgICAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF92bGFuICp2bGFuLAogCQkJICAgIHN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OwogCWludCBlcnI7CiAKIAlpZiAoIW12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfVlRVKSkKQEAgLTE4OTQsNyArMTg5NCw3IEBACiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfcG9ydF92bGFuX2FkZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBwb3J0LAogCQkJCSAgICB1MTYgdmlkLCBib29sIHVudGFnZ2VkKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfdnR1X3N0dV9lbnRyeSB2bGFuOworCXN0cnVjdCBtdjg4ZTZ4eHhfdnR1X2VudHJ5IHZsYW47CiAJaW50IGVycjsKIAogCWVyciA9IF9tdjg4ZTZ4eHhfdnR1X2dldChjaGlwLCB2aWQsICZ2bGFuLCB0cnVlKTsKQEAgLTE5MTIsNyArMTkxMiw3IEBACiAJCQkJICAgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfdmxhbiAqdmxhbiwKIAkJCQkgICAgc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CiAJYm9vbCB1bnRhZ2dlZCA9IHZsYW4tPmZsYWdzICYgQlJJREdFX1ZMQU5fSU5GT19VTlRBR0dFRDsKIAlib29sIHB2aWQgPSB2bGFuLT5mbGFncyAmIEJSSURHRV9WTEFOX0lORk9fUFZJRDsKIAl1MTYgdmlkOwpAQCAtMTkzOSw3ICsxOTM5LDcgQEAKIAkJCQkgICAgaW50IHBvcnQsIHUxNiB2aWQpCiB7CiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gY2hpcC0+ZHM7Ci0Jc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5IHZsYW47CisJc3RydWN0IG12ODhlNnh4eF92dHVfZW50cnkgdmxhbjsKIAlpbnQgaSwgZXJyOwogCiAJZXJyID0gX212ODhlNnh4eF92dHVfZ2V0KGNoaXAsIHZpZCwgJnZsYW4sIGZhbHNlKTsKQEAgLTE5NTQsNyArMTk1NCw3IEBACiAKIAkvKiBrZWVwIHRoZSBWTEFOIHVubGVzcyBhbGwgcG9ydHMgYXJlIGV4Y2x1ZGVkICovCiAJdmxhbi52YWxpZCA9IGZhbHNlOwotCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5pbmZvLT5udW1fcG9ydHM7ICsraSkgeworCWZvciAoaSA9IDA7IGkgPCBtdjg4ZTZ4eHhfbnVtX3BvcnRzKGNoaXApOyArK2kpIHsKIAkJaWYgKGRzYV9pc19jcHVfcG9ydChkcywgaSkgfHwgZHNhX2lzX2RzYV9wb3J0KGRzLCBpKSkKIAkJCWNvbnRpbnVlOwogCkBAIC0xOTc0LDcgKzE5NzQsNyBAQAogc3RhdGljIGludCBtdjg4ZTZ4eHhfcG9ydF92bGFuX2RlbChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJCSAgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfdmxhbiAqdmxhbikKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKIAl1MTYgcHZpZCwgdmlkOwogCWludCBlcnIgPSAwOwogCkBAIC0yMDA4LDE0ICsyMDA4LDEzIEBACiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfYXR1X21hY193cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCiAJCQkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIpCiB7Ci0JaW50IGksIHJldDsKKwlpbnQgaSwgZXJyOwogCiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZSgKLQkJCWNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9BVFVfTUFDXzAxICsgaSwKLQkJCShhZGRyW2kgKiAyXSA8PCA4KSB8IGFkZHJbaSAqIDIgKyAxXSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9BVFVfTUFDXzAxICsgaSwKKwkJCQkJIChhZGRyW2kgKiAyXSA8PCA4KSB8IGFkZHJbaSAqIDIgKyAxXSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KIAogCXJldHVybiAwOwpAQCAtMjAyNCwxNSArMjAyMywxNiBAQAogc3RhdGljIGludCBfbXY4OGU2eHh4X2F0dV9tYWNfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCiAJCQkJICAgdW5zaWduZWQgY2hhciAqYWRkcikKIHsKLQlpbnQgaSwgcmV0OworCXUxNiB2YWw7CisJaW50IGksIGVycjsKIAogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfR0xPQkFMLAotCQkJCQkgIEdMT0JBTF9BVFVfTUFDXzAxICsgaSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQkJYWRkcltpICogMl0gPSByZXQgPj4gODsKLQkJYWRkcltpICogMiArIDFdID0gcmV0ICYgMHhmZjsKKwkJZXJyID0gbXY4OGU2eHh4X2cxX3JlYWQoY2hpcCwgR0xPQkFMX0FUVV9NQUNfMDEgKyBpLCAmdmFsKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJYWRkcltpICogMl0gPSB2YWwgPj4gODsKKwkJYWRkcltpICogMiArIDFdID0gdmFsICYgMHhmZjsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTIwNTgsMTIgKzIwNTgsNDggQEAKIAlyZXR1cm4gX212ODhlNnh4eF9hdHVfY21kKGNoaXAsIGVudHJ5LT5maWQsIEdMT0JBTF9BVFVfT1BfTE9BRF9EQik7CiB9CiAKLXN0YXRpYyBpbnQgX212ODhlNnh4eF9wb3J0X2ZkYl9sb2FkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHBvcnQsCi0JCQkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsIHUxNiB2aWQsCi0JCQkJICAgIHU4IHN0YXRlKQorc3RhdGljIGludCBfbXY4OGU2eHh4X2F0dV9nZXRuZXh0KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgdTE2IGZpZCwKKwkJCQkgIHN0cnVjdCBtdjg4ZTZ4eHhfYXR1X2VudHJ5ICplbnRyeSk7CisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X2F0dV9nZXQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgZmlkLAorCQkJICAgICBjb25zdCB1OCAqYWRkciwgc3RydWN0IG12ODhlNnh4eF9hdHVfZW50cnkgKmVudHJ5KQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfYXR1X2VudHJ5IGVudHJ5ID0geyAwIH07Ci0Jc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5IHZsYW47CisJc3RydWN0IG12ODhlNnh4eF9hdHVfZW50cnkgbmV4dDsKKwlpbnQgZXJyOworCisJZXRoX2Jyb2FkY2FzdF9hZGRyKG5leHQubWFjKTsKKworCWVyciA9IF9tdjg4ZTZ4eHhfYXR1X21hY193cml0ZShjaGlwLCBuZXh0Lm1hYyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWRvIHsKKwkJZXJyID0gX212ODhlNnh4eF9hdHVfZ2V0bmV4dChjaGlwLCBmaWQsICZuZXh0KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJaWYgKG5leHQuc3RhdGUgPT0gR0xPQkFMX0FUVV9EQVRBX1NUQVRFX1VOVVNFRCkKKwkJCWJyZWFrOworCisJCWlmIChldGhlcl9hZGRyX2VxdWFsKG5leHQubWFjLCBhZGRyKSkgeworCQkJKmVudHJ5ID0gbmV4dDsKKwkJCXJldHVybiAwOworCQl9CisJfSB3aGlsZSAoIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKG5leHQubWFjKSk7CisKKwltZW1zZXQoZW50cnksIDAsIHNpemVvZigqZW50cnkpKTsKKwllbnRyeS0+ZmlkID0gZmlkOworCWV0aGVyX2FkZHJfY29weShlbnRyeS0+bWFjLCBhZGRyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG12ODhlNnh4eF9wb3J0X2RiX2xvYWRfcHVyZ2Uoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcG9ydCwKKwkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYWRkciwgdTE2IHZpZCwKKwkJCQkJdTggc3RhdGUpCit7CisJc3RydWN0IG12ODhlNnh4eF92dHVfZW50cnkgdmxhbjsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2F0dV9lbnRyeSBlbnRyeTsKIAlpbnQgZXJyOwogCiAJLyogTnVsbCBWTEFOIElEIGNvcnJlc3BvbmRzIHRvIHRoZSBwb3J0IHByaXZhdGUgZGF0YWJhc2UgKi8KQEAgLTIwNzQsMTIgKzIxMTAsMTggQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JZW50cnkuZmlkID0gdmxhbi5maWQ7Ci0JZW50cnkuc3RhdGUgPSBzdGF0ZTsKLQlldGhlcl9hZGRyX2NvcHkoZW50cnkubWFjLCBhZGRyKTsKLQlpZiAoc3RhdGUgIT0gR0xPQkFMX0FUVV9EQVRBX1NUQVRFX1VOVVNFRCkgewotCQllbnRyeS50cnVuayA9IGZhbHNlOwotCQllbnRyeS5wb3J0dl90cnVua2lkID0gQklUKHBvcnQpOworCWVyciA9IG12ODhlNnh4eF9hdHVfZ2V0KGNoaXAsIHZsYW4uZmlkLCBhZGRyLCAmZW50cnkpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBQdXJnZSB0aGUgQVRVIGVudHJ5IG9ubHkgaWYgbm8gcG9ydCBpcyB1c2luZyBpdCBhbnltb3JlICovCisJaWYgKHN0YXRlID09IEdMT0JBTF9BVFVfREFUQV9TVEFURV9VTlVTRUQpIHsKKwkJZW50cnkucG9ydHZfdHJ1bmtpZCAmPSB+QklUKHBvcnQpOworCQlpZiAoIWVudHJ5LnBvcnR2X3RydW5raWQpCisJCQllbnRyeS5zdGF0ZSA9IEdMT0JBTF9BVFVfREFUQV9TVEFURV9VTlVTRUQ7CisJfSBlbHNlIHsKKwkJZW50cnkucG9ydHZfdHJ1bmtpZCB8PSBCSVQocG9ydCk7CisJCWVudHJ5LnN0YXRlID0gc3RhdGU7CiAJfQogCiAJcmV0dXJuIF9tdjg4ZTZ4eHhfYXR1X2xvYWQoY2hpcCwgJmVudHJ5KTsKQEAgLTIwOTksNjEgKzIxNDEsNTkgQEAKIAkJCQkgICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X2ZkYiAqZmRiLAogCQkJCSAgIHN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zKQogewotCWludCBzdGF0ZSA9IGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGZkYi0+YWRkcikgPwotCQlHTE9CQUxfQVRVX0RBVEFfU1RBVEVfTUNfU1RBVElDIDoKLQkJR0xPQkFMX0FUVV9EQVRBX1NUQVRFX1VDX1NUQVRJQzsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKIAogCW11dGV4X2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQlpZiAoX212ODhlNnh4eF9wb3J0X2ZkYl9sb2FkKGNoaXAsIHBvcnQsIGZkYi0+YWRkciwgZmRiLT52aWQsIHN0YXRlKSkKLQkJbmV0ZGV2X2Vycihkcy0+cG9ydHNbcG9ydF0ubmV0ZGV2LAotCQkJICAgImZhaWxlZCB0byBsb2FkIE1BQyBhZGRyZXNzXG4iKTsKKwlpZiAobXY4OGU2eHh4X3BvcnRfZGJfbG9hZF9wdXJnZShjaGlwLCBwb3J0LCBmZGItPmFkZHIsIGZkYi0+dmlkLAorCQkJCQkgR0xPQkFMX0FUVV9EQVRBX1NUQVRFX1VDX1NUQVRJQykpCisJCW5ldGRldl9lcnIoZHMtPnBvcnRzW3BvcnRdLm5ldGRldiwgImZhaWxlZCB0byBsb2FkIHVuaWNhc3QgTUFDIGFkZHJlc3NcbiIpOwogCW11dGV4X3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwogfQogCiBzdGF0aWMgaW50IG12ODhlNnh4eF9wb3J0X2ZkYl9kZWwoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAkJCQkgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfZmRiICpmZGIpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKKwlpbnQgZXJyOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOwotCXJldCA9IF9tdjg4ZTZ4eHhfcG9ydF9mZGJfbG9hZChjaGlwLCBwb3J0LCBmZGItPmFkZHIsIGZkYi0+dmlkLAotCQkJCSAgICAgICBHTE9CQUxfQVRVX0RBVEFfU1RBVEVfVU5VU0VEKTsKKwllcnIgPSBtdjg4ZTZ4eHhfcG9ydF9kYl9sb2FkX3B1cmdlKGNoaXAsIHBvcnQsIGZkYi0+YWRkciwgZmRiLT52aWQsCisJCQkJCSAgIEdMT0JBTF9BVFVfREFUQV9TVEFURV9VTlVTRUQpOwogCW11dGV4X3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfYXR1X2dldG5leHQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCB1MTYgZmlkLAogCQkJCSAgc3RydWN0IG12ODhlNnh4eF9hdHVfZW50cnkgKmVudHJ5KQogewogCXN0cnVjdCBtdjg4ZTZ4eHhfYXR1X2VudHJ5IG5leHQgPSB7IDAgfTsKLQlpbnQgcmV0OworCXUxNiB2YWw7CisJaW50IGVycjsKIAogCW5leHQuZmlkID0gZmlkOwogCi0JcmV0ID0gX212ODhlNnh4eF9hdHVfd2FpdChjaGlwKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBfbXY4OGU2eHh4X2F0dV93YWl0KGNoaXApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLQlyZXQgPSBfbXY4OGU2eHh4X2F0dV9jbWQoY2hpcCwgZmlkLCBHTE9CQUxfQVRVX09QX0dFVF9ORVhUX0RCKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBfbXY4OGU2eHh4X2F0dV9jbWQoY2hpcCwgZmlkLCBHTE9CQUxfQVRVX09QX0dFVF9ORVhUX0RCKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCi0JcmV0ID0gX212ODhlNnh4eF9hdHVfbWFjX3JlYWQoY2hpcCwgbmV4dC5tYWMpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWVyciA9IF9tdjg4ZTZ4eHhfYXR1X21hY19yZWFkKGNoaXAsIG5leHQubWFjKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfQVRVX0RBVEEpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWVyciA9IG12ODhlNnh4eF9nMV9yZWFkKGNoaXAsIEdMT0JBTF9BVFVfREFUQSwgJnZhbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotCW5leHQuc3RhdGUgPSByZXQgJiBHTE9CQUxfQVRVX0RBVEFfU1RBVEVfTUFTSzsKKwluZXh0LnN0YXRlID0gdmFsICYgR0xPQkFMX0FUVV9EQVRBX1NUQVRFX01BU0s7CiAJaWYgKG5leHQuc3RhdGUgIT0gR0xPQkFMX0FUVV9EQVRBX1NUQVRFX1VOVVNFRCkgewogCQl1bnNpZ25lZCBpbnQgbWFzaywgc2hpZnQ7CiAKLQkJaWYgKHJldCAmIEdMT0JBTF9BVFVfREFUQV9UUlVOSykgeworCQlpZiAodmFsICYgR0xPQkFMX0FUVV9EQVRBX1RSVU5LKSB7CiAJCQluZXh0LnRydW5rID0gdHJ1ZTsKIAkJCW1hc2sgPSBHTE9CQUxfQVRVX0RBVEFfVFJVTktfSURfTUFTSzsKIAkJCXNoaWZ0ID0gR0xPQkFMX0FUVV9EQVRBX1RSVU5LX0lEX1NISUZUOwpAQCAtMjE2MywxNyArMjIwMywxNyBAQAogCQkJc2hpZnQgPSBHTE9CQUxfQVRVX0RBVEFfUE9SVF9WRUNUT1JfU0hJRlQ7CiAJCX0KIAotCQluZXh0LnBvcnR2X3RydW5raWQgPSAocmV0ICYgbWFzaykgPj4gc2hpZnQ7CisJCW5leHQucG9ydHZfdHJ1bmtpZCA9ICh2YWwgJiBtYXNrKSA+PiBzaGlmdDsKIAl9CiAKIAkqZW50cnkgPSBuZXh0OwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9tdjg4ZTZ4eHhfcG9ydF9mZGJfZHVtcF9vbmUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAotCQkJCQl1MTYgZmlkLCB1MTYgdmlkLCBpbnQgcG9ydCwKLQkJCQkJc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9mZGIgKmZkYiwKLQkJCQkJaW50ICgqY2IpKHN0cnVjdCBzd2l0Y2hkZXZfb2JqICpvYmopKQorc3RhdGljIGludCBtdjg4ZTZ4eHhfcG9ydF9kYl9kdW1wX2ZpZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCisJCQkJICAgICAgdTE2IGZpZCwgdTE2IHZpZCwgaW50IHBvcnQsCisJCQkJICAgICAgc3RydWN0IHN3aXRjaGRldl9vYmogKm9iaiwKKwkJCQkgICAgICBpbnQgKCpjYikoc3RydWN0IHN3aXRjaGRldl9vYmogKm9iaikpCiB7CiAJc3RydWN0IG12ODhlNnh4eF9hdHVfZW50cnkgYWRkciA9IHsKIAkJLm1hYyA9IHsgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiB9LApAQCAtMjE4Nyw3MiArMjIyNyw5OCBAQAogCWRvIHsKIAkJZXJyID0gX212ODhlNnh4eF9hdHVfZ2V0bmV4dChjaGlwLCBmaWQsICZhZGRyKTsKIAkJaWYgKGVycikKLQkJCWJyZWFrOworCQkJcmV0dXJuIGVycjsKIAogCQlpZiAoYWRkci5zdGF0ZSA9PSBHTE9CQUxfQVRVX0RBVEFfU1RBVEVfVU5VU0VEKQogCQkJYnJlYWs7CiAKLQkJaWYgKCFhZGRyLnRydW5rICYmIGFkZHIucG9ydHZfdHJ1bmtpZCAmIEJJVChwb3J0KSkgewotCQkJYm9vbCBpc19zdGF0aWMgPSBhZGRyLnN0YXRlID09Ci0JCQkJKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGFkZHIubWFjKSA/Ci0JCQkJIEdMT0JBTF9BVFVfREFUQV9TVEFURV9NQ19TVEFUSUMgOgotCQkJCSBHTE9CQUxfQVRVX0RBVEFfU1RBVEVfVUNfU1RBVElDKTsKKwkJaWYgKGFkZHIudHJ1bmsgfHwgKGFkZHIucG9ydHZfdHJ1bmtpZCAmIEJJVChwb3J0KSkgPT0gMCkKKwkJCWNvbnRpbnVlOwogCisJCWlmIChvYmotPmlkID09IFNXSVRDSERFVl9PQkpfSURfUE9SVF9GREIpIHsKKwkJCXN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfZmRiICpmZGI7CisKKwkJCWlmICghaXNfdW5pY2FzdF9ldGhlcl9hZGRyKGFkZHIubWFjKSkKKwkJCQljb250aW51ZTsKKworCQkJZmRiID0gU1dJVENIREVWX09CSl9QT1JUX0ZEQihvYmopOwogCQkJZmRiLT52aWQgPSB2aWQ7CiAJCQlldGhlcl9hZGRyX2NvcHkoZmRiLT5hZGRyLCBhZGRyLm1hYyk7Ci0JCQlmZGItPm5kbV9zdGF0ZSA9IGlzX3N0YXRpYyA/IE5VRF9OT0FSUCA6IE5VRF9SRUFDSEFCTEU7CisJCQlpZiAoYWRkci5zdGF0ZSA9PSBHTE9CQUxfQVRVX0RBVEFfU1RBVEVfVUNfU1RBVElDKQorCQkJCWZkYi0+bmRtX3N0YXRlID0gTlVEX05PQVJQOworCQkJZWxzZQorCQkJCWZkYi0+bmRtX3N0YXRlID0gTlVEX1JFQUNIQUJMRTsKKwkJfSBlbHNlIGlmIChvYmotPmlkID09IFNXSVRDSERFVl9PQkpfSURfUE9SVF9NREIpIHsKKwkJCXN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfbWRiICptZGI7CiAKLQkJCWVyciA9IGNiKCZmZGItPm9iaik7Ci0JCQlpZiAoZXJyKQotCQkJCWJyZWFrOworCQkJaWYgKCFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihhZGRyLm1hYykpCisJCQkJY29udGludWU7CisKKwkJCW1kYiA9IFNXSVRDSERFVl9PQkpfUE9SVF9NREIob2JqKTsKKwkJCW1kYi0+dmlkID0gdmlkOworCQkJZXRoZXJfYWRkcl9jb3B5KG1kYi0+YWRkciwgYWRkci5tYWMpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCQl9CisKKwkJZXJyID0gY2Iob2JqKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAJfSB3aGlsZSAoIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGFkZHIubWFjKSk7CiAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IG12ODhlNnh4eF9wb3J0X2RiX2R1bXAoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcG9ydCwKKwkJCQkgIHN0cnVjdCBzd2l0Y2hkZXZfb2JqICpvYmosCisJCQkJICBpbnQgKCpjYikoc3RydWN0IHN3aXRjaGRldl9vYmogKm9iaikpCit7CisJc3RydWN0IG12ODhlNnh4eF92dHVfZW50cnkgdmxhbiA9IHsKKwkJLnZpZCA9IEdMT0JBTF9WVFVfVklEX01BU0ssIC8qIGFsbCBvbmVzICovCisJfTsKKwl1MTYgZmlkOworCWludCBlcnI7CisKKwkvKiBEdW1wIHBvcnQncyBkZWZhdWx0IEZpbHRlcmluZyBJbmZvcm1hdGlvbiBEYXRhYmFzZSAoVkxBTiBJRCAwKSAqLworCWVyciA9IF9tdjg4ZTZ4eHhfcG9ydF9maWRfZ2V0KGNoaXAsIHBvcnQsICZmaWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBtdjg4ZTZ4eHhfcG9ydF9kYl9kdW1wX2ZpZChjaGlwLCBmaWQsIDAsIHBvcnQsIG9iaiwgY2IpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBEdW1wIFZMQU5zJyBGaWx0ZXJpbmcgSW5mb3JtYXRpb24gRGF0YWJhc2VzICovCisJZXJyID0gX212ODhlNnh4eF92dHVfdmlkX3dyaXRlKGNoaXAsIHZsYW4udmlkKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZG8geworCQllcnIgPSBfbXY4OGU2eHh4X3Z0dV9nZXRuZXh0KGNoaXAsICZ2bGFuKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJaWYgKCF2bGFuLnZhbGlkKQorCQkJYnJlYWs7CisKKwkJZXJyID0gbXY4OGU2eHh4X3BvcnRfZGJfZHVtcF9maWQoY2hpcCwgdmxhbi5maWQsIHZsYW4udmlkLCBwb3J0LAorCQkJCQkJIG9iaiwgY2IpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9IHdoaWxlICh2bGFuLnZpZCA8IEdMT0JBTF9WVFVfVklEX01BU0spOworCisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIGludCBtdjg4ZTZ4eHhfcG9ydF9mZGJfZHVtcChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJCSAgIHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfZmRiICpmZGIsCiAJCQkJICAgaW50ICgqY2IpKHN0cnVjdCBzd2l0Y2hkZXZfb2JqICpvYmopKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOwotCXN0cnVjdCBtdjg4ZTZ4eHhfdnR1X3N0dV9lbnRyeSB2bGFuID0gewotCQkudmlkID0gR0xPQkFMX1ZUVV9WSURfTUFTSywgLyogYWxsIG9uZXMgKi8KLQl9OwotCXUxNiBmaWQ7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CiAJaW50IGVycjsKIAogCW11dGV4X2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQotCS8qIER1bXAgcG9ydCdzIGRlZmF1bHQgRmlsdGVyaW5nIEluZm9ybWF0aW9uIERhdGFiYXNlIChWTEFOIElEIDApICovCi0JZXJyID0gX212ODhlNnh4eF9wb3J0X2ZpZF9nZXQoY2hpcCwgcG9ydCwgJmZpZCk7Ci0JaWYgKGVycikKLQkJZ290byB1bmxvY2s7Ci0KLQllcnIgPSBfbXY4OGU2eHh4X3BvcnRfZmRiX2R1bXBfb25lKGNoaXAsIGZpZCwgMCwgcG9ydCwgZmRiLCBjYik7Ci0JaWYgKGVycikKLQkJZ290byB1bmxvY2s7Ci0KLQkvKiBEdW1wIFZMQU5zJyBGaWx0ZXJpbmcgSW5mb3JtYXRpb24gRGF0YWJhc2VzICovCi0JZXJyID0gX212ODhlNnh4eF92dHVfdmlkX3dyaXRlKGNoaXAsIHZsYW4udmlkKTsKLQlpZiAoZXJyKQotCQlnb3RvIHVubG9jazsKLQotCWRvIHsKLQkJZXJyID0gX212ODhlNnh4eF92dHVfZ2V0bmV4dChjaGlwLCAmdmxhbik7Ci0JCWlmIChlcnIpCi0JCQlicmVhazsKLQotCQlpZiAoIXZsYW4udmFsaWQpCi0JCQlicmVhazsKLQotCQllcnIgPSBfbXY4OGU2eHh4X3BvcnRfZmRiX2R1bXBfb25lKGNoaXAsIHZsYW4uZmlkLCB2bGFuLnZpZCwKLQkJCQkJCSAgIHBvcnQsIGZkYiwgY2IpOwotCQlpZiAoZXJyKQotCQkJYnJlYWs7Ci0JfSB3aGlsZSAodmxhbi52aWQgPCBHTE9CQUxfVlRVX1ZJRF9NQVNLKTsKLQotdW5sb2NrOgorCWVyciA9IG12ODhlNnh4eF9wb3J0X2RiX2R1bXAoY2hpcCwgcG9ydCwgJmZkYi0+b2JqLCBjYik7CiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAKIAlyZXR1cm4gZXJyOwpAQCAtMjI2MSw3ICsyMzI3LDcgQEAKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X3BvcnRfYnJpZGdlX2pvaW4oc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAkJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqYnJpZGdlKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OwogCWludCBpLCBlcnIgPSAwOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOwpAQCAtMjI2OSw3ICsyMzM1LDcgQEAKIAkvKiBBc3NpZ24gdGhlIGJyaWRnZSBhbmQgcmVtYXAgZWFjaCBwb3J0J3MgVkxBTlRhYmxlICovCiAJY2hpcC0+cG9ydHNbcG9ydF0uYnJpZGdlX2RldiA9IGJyaWRnZTsKIAotCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5pbmZvLT5udW1fcG9ydHM7ICsraSkgeworCWZvciAoaSA9IDA7IGkgPCBtdjg4ZTZ4eHhfbnVtX3BvcnRzKGNoaXApOyArK2kpIHsKIAkJaWYgKGNoaXAtPnBvcnRzW2ldLmJyaWRnZV9kZXYgPT0gYnJpZGdlKSB7CiAJCQllcnIgPSBfbXY4OGU2eHh4X3BvcnRfYmFzZWRfdmxhbl9tYXAoY2hpcCwgaSk7CiAJCQlpZiAoZXJyKQpAQCAtMjI4NCw3ICsyMzUwLDcgQEAKIAogc3RhdGljIHZvaWQgbXY4OGU2eHh4X3BvcnRfYnJpZGdlX2xlYXZlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmJyaWRnZSA9IGNoaXAtPnBvcnRzW3BvcnRdLmJyaWRnZV9kZXY7CiAJaW50IGk7CiAKQEAgLTIyOTMsNyArMjM1OSw3IEBACiAJLyogVW5hc3NpZ24gdGhlIGJyaWRnZSBhbmQgcmVtYXAgZWFjaCBwb3J0J3MgVkxBTlRhYmxlICovCiAJY2hpcC0+cG9ydHNbcG9ydF0uYnJpZGdlX2RldiA9IE5VTEw7CiAKLQlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+aW5mby0+bnVtX3BvcnRzOyArK2kpCisJZm9yIChpID0gMDsgaSA8IG12ODhlNnh4eF9udW1fcG9ydHMoY2hpcCk7ICsraSkKIAkJaWYgKGkgPT0gcG9ydCB8fCBjaGlwLT5wb3J0c1tpXS5icmlkZ2VfZGV2ID09IGJyaWRnZSkKIAkJCWlmIChfbXY4OGU2eHh4X3BvcnRfYmFzZWRfdmxhbl9tYXAoY2hpcCwgaSkpCiAJCQkJbmV0ZGV2X3dhcm4oZHMtPnBvcnRzW2ldLm5ldGRldiwKQEAgLTIzMDIsNTcgKzIzNjgsMjYgQEAKIAltdXRleF91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKIH0KIAotc3RhdGljIGludCBfbXY4OGU2eHh4X21kaW9fcGFnZV93cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCi0JCQkJICAgICAgaW50IHBvcnQsIGludCBwYWdlLCBpbnQgcmVnLCBpbnQgdmFsKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBtdjg4ZTZ4eHhfbWRpb193cml0ZV9pbmRpcmVjdChjaGlwLCBwb3J0LCAweDE2LCBwYWdlKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byByZXN0b3JlX3BhZ2VfMDsKLQotCXJldCA9IG12ODhlNnh4eF9tZGlvX3dyaXRlX2luZGlyZWN0KGNoaXAsIHBvcnQsIHJlZywgdmFsKTsKLXJlc3RvcmVfcGFnZV8wOgotCW12ODhlNnh4eF9tZGlvX3dyaXRlX2luZGlyZWN0KGNoaXAsIHBvcnQsIDB4MTYsIDB4MCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IF9tdjg4ZTZ4eHhfbWRpb19wYWdlX3JlYWQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAotCQkJCSAgICAgaW50IHBvcnQsIGludCBwYWdlLCBpbnQgcmVnKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBtdjg4ZTZ4eHhfbWRpb193cml0ZV9pbmRpcmVjdChjaGlwLCBwb3J0LCAweDE2LCBwYWdlKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byByZXN0b3JlX3BhZ2VfMDsKLQotCXJldCA9IG12ODhlNnh4eF9tZGlvX3JlYWRfaW5kaXJlY3QoY2hpcCwgcG9ydCwgcmVnKTsKLXJlc3RvcmVfcGFnZV8wOgotCW12ODhlNnh4eF9tZGlvX3dyaXRlX2luZGlyZWN0KGNoaXAsIHBvcnQsIDB4MTYsIDB4MCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCiBzdGF0aWMgaW50IG12ODhlNnh4eF9zd2l0Y2hfcmVzZXQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQogewogCWJvb2wgcHB1X2FjdGl2ZSA9IG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfUFBVX0FDVElWRSk7CiAJdTE2IGlzX3Jlc2V0ID0gKHBwdV9hY3RpdmUgPyAweDg4MDAgOiAweGM4MDApOwogCXN0cnVjdCBncGlvX2Rlc2MgKmdwaW9kID0gY2hpcC0+cmVzZXQ7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwotCWludCByZXQ7CisJdTE2IHJlZzsKKwlpbnQgZXJyOwogCWludCBpOwogCiAJLyogU2V0IGFsbCBwb3J0cyB0byB0aGUgZGlzYWJsZWQgc3RhdGUuICovCi0JZm9yIChpID0gMDsgaSA8IGNoaXAtPmluZm8tPm51bV9wb3J0czsgaSsrKSB7Ci0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX1BPUlQoaSksIFBPUlRfQ09OVFJPTCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKKwlmb3IgKGkgPSAwOyBpIDwgbXY4OGU2eHh4X251bV9wb3J0cyhjaGlwKTsgaSsrKSB7CisJCWVyciA9IG12ODhlNnh4eF9wb3J0X3JlYWQoY2hpcCwgaSwgUE9SVF9DT05UUk9MLCAmcmVnKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAKLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX1BPUlQoaSksIFBPUlRfQ09OVFJPTCwKLQkJCQkJICAgcmV0ICYgMHhmZmZjKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7CisJCWVyciA9IG12ODhlNnh4eF9wb3J0X3dyaXRlKGNoaXAsIGksIFBPUlRfQ09OVFJPTCwKKwkJCQkJICAgcmVnICYgMHhmZmZjKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAJfQogCiAJLyogV2FpdCBmb3IgdHJhbnNtaXQgcXVldWVzIHRvIGRyYWluLiAqLwpAQCAtMjM3MSw2NSArMjQwNiw1MyBAQAogCSAqIHRocm91Z2ggZ2xvYmFsIHJlZ2lzdGVycyAweDE4IGFuZCAweDE5LgogCSAqLwogCWlmIChwcHVfYWN0aXZlKQotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCAweDA0LCAweGMwMDApOworCQllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgMHgwNCwgMHhjMDAwKTsKIAllbHNlCi0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIDB4MDQsIDB4YzQwMCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIDB4MDQsIDB4YzQwMCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCS8qIFdhaXQgdXAgdG8gb25lIHNlY29uZCBmb3IgcmVzZXQgdG8gY29tcGxldGUuICovCiAJdGltZW91dCA9IGppZmZpZXMgKyAxICogSFo7CiAJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX0dMT0JBTCwgMHgwMCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X2cxX3JlYWQoY2hpcCwgMHgwMCwgJnJlZyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCi0JCWlmICgocmV0ICYgaXNfcmVzZXQpID09IGlzX3Jlc2V0KQorCQlpZiAoKHJlZyAmIGlzX3Jlc2V0KSA9PSBpc19yZXNldCkKIAkJCWJyZWFrOwogCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CiAJfQogCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQotCQlyZXQgPSAtRVRJTUVET1VUOworCQllcnIgPSAtRVRJTUVET1VUOwogCWVsc2UKLQkJcmV0ID0gMDsKKwkJZXJyID0gMDsKIAotCXJldHVybiByZXQ7CisJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBtdjg4ZTZ4eHhfcG93ZXJfb25fc2VyZGVzKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X3NlcmRlc19wb3dlcl9vbihzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCiB7Ci0JaW50IHJldDsKKwl1MTYgdmFsOworCWludCBlcnI7CiAKLQlyZXQgPSBfbXY4OGU2eHh4X21kaW9fcGFnZV9yZWFkKGNoaXAsIFJFR19GSUJFUl9TRVJERVMsCi0JCQkJCVBBR0VfRklCRVJfU0VSREVTLCBNSUlfQk1DUik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJLyogQ2xlYXIgUG93ZXIgRG93biBiaXQgKi8KKwllcnIgPSBtdjg4ZTZ4eHhfc2VyZGVzX3JlYWQoY2hpcCwgTUlJX0JNQ1IsICZ2YWwpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLQlpZiAocmV0ICYgQk1DUl9QRE9XTikgewotCQlyZXQgJj0gfkJNQ1JfUERPV047Ci0JCXJldCA9IF9tdjg4ZTZ4eHhfbWRpb19wYWdlX3dyaXRlKGNoaXAsIFJFR19GSUJFUl9TRVJERVMsCi0JCQkJCQkgUEFHRV9GSUJFUl9TRVJERVMsIE1JSV9CTUNSLAotCQkJCQkJIHJldCk7CisJaWYgKHZhbCAmIEJNQ1JfUERPV04pIHsKKwkJdmFsICY9IH5CTUNSX1BET1dOOworCQllcnIgPSBtdjg4ZTZ4eHhfc2VyZGVzX3dyaXRlKGNoaXAsIE1JSV9CTUNSLCB2YWwpOwogCX0KIAotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXY4OGU2eHh4X3BvcnRfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBwb3J0LAotCQkJICAgICAgIGludCByZWcsIHUxNiAqdmFsKQotewotCWludCBhZGRyID0gY2hpcC0+aW5mby0+cG9ydF9iYXNlX2FkZHIgKyBwb3J0OwotCi0JaWYgKHBvcnQgPj0gY2hpcC0+aW5mby0+bnVtX3BvcnRzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiBtdjg4ZTZ4eHhfcmVhZChjaGlwLCBhZGRyLCByZWcsIHZhbCk7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBtdjg4ZTZ4eHhfc2V0dXBfcG9ydChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBwb3J0KQogewogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IGNoaXAtPmRzOwotCWludCByZXQ7CisJaW50IGVycjsKIAl1MTYgcmVnOwogCiAJaWYgKG12ODhlNnh4eF82MzUyX2ZhbWlseShjaGlwKSB8fCBtdjg4ZTZ4eHhfNjM1MV9mYW1pbHkoY2hpcCkgfHwKQEAgLTI0NDIsNyArMjQ2NSw3IEBACiAJCSAqIGFuZCBhbGwgRFNBIHBvcnRzIHRvIHRoZWlyIG1heGltdW0gYmFuZHdpZHRoIGFuZAogCQkgKiBmdWxsIGR1cGxleC4KIAkJICovCi0JCXJlZyA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX1BPUlQocG9ydCksIFBPUlRfUENTX0NUUkwpOworCQllcnIgPSBtdjg4ZTZ4eHhfcG9ydF9yZWFkKGNoaXAsIHBvcnQsIFBPUlRfUENTX0NUUkwsICZyZWcpOwogCQlpZiAoZHNhX2lzX2NwdV9wb3J0KGRzLCBwb3J0KSB8fCBkc2FfaXNfZHNhX3BvcnQoZHMsIHBvcnQpKSB7CiAJCQlyZWcgJj0gflBPUlRfUENTX0NUUkxfVU5GT1JDRUQ7CiAJCQlyZWcgfD0gUE9SVF9QQ1NfQ1RSTF9GT1JDRV9MSU5LIHwKQEAgLTI0NTcsMTAgKzI0ODAsOSBAQAogCQkJcmVnIHw9IFBPUlRfUENTX0NUUkxfVU5GT1JDRUQ7CiAJCX0KIAotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfUE9SVChwb3J0KSwKLQkJCQkJICAgUE9SVF9QQ1NfQ1RSTCwgcmVnKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7CisJCWVyciA9IG12ODhlNnh4eF9wb3J0X3dyaXRlKGNoaXAsIHBvcnQsIFBPUlRfUENTX0NUUkwsIHJlZyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KIAogCS8qIFBvcnQgQ29udHJvbDogZGlzYWJsZSBEcm9wLW9uLVVubG9jaywgZGlzYWJsZSBEcm9wLW9uLUxvY2ssCkBAIC0yNDg2LDI4ICsyNTA4LDEzIEBACiAJCVBPUlRfQ09OVFJPTF9VU0VfVEFHIHwgUE9SVF9DT05UUk9MX1VTRV9JUCB8CiAJCVBPUlRfQ09OVFJPTF9TVEFURV9GT1JXQVJESU5HOwogCWlmIChkc2FfaXNfY3B1X3BvcnQoZHMsIHBvcnQpKSB7Ci0JCWlmIChtdjg4ZTZ4eHhfNjA5NV9mYW1pbHkoY2hpcCkgfHwgbXY4OGU2eHh4XzYxODVfZmFtaWx5KGNoaXApKQotCQkJcmVnIHw9IFBPUlRfQ09OVFJPTF9EU0FfVEFHOwotCQlpZiAobXY4OGU2eHh4XzYzNTJfZmFtaWx5KGNoaXApIHx8Ci0JCSAgICBtdjg4ZTZ4eHhfNjM1MV9mYW1pbHkoY2hpcCkgfHwKLQkJICAgIG12ODhlNnh4eF82MTY1X2ZhbWlseShjaGlwKSB8fAotCQkgICAgbXY4OGU2eHh4XzYwOTdfZmFtaWx5KGNoaXApIHx8Ci0JCSAgICBtdjg4ZTZ4eHhfNjMyMF9mYW1pbHkoY2hpcCkpIHsKKwkJaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfRURTQSkpCiAJCQlyZWcgfD0gUE9SVF9DT05UUk9MX0ZSQU1FX0VUSEVSX1RZUEVfRFNBIHwKLQkJCQlQT1JUX0NPTlRST0xfRk9SV0FSRF9VTktOT1dOIHwKIAkJCQlQT1JUX0NPTlRST0xfRk9SV0FSRF9VTktOT1dOX01DOwotCQl9Ci0KLQkJaWYgKG12ODhlNnh4eF82MzUyX2ZhbWlseShjaGlwKSB8fAotCQkgICAgbXY4OGU2eHh4XzYzNTFfZmFtaWx5KGNoaXApIHx8Ci0JCSAgICBtdjg4ZTZ4eHhfNjE2NV9mYW1pbHkoY2hpcCkgfHwKLQkJICAgIG12ODhlNnh4eF82MDk3X2ZhbWlseShjaGlwKSB8fAotCQkgICAgbXY4OGU2eHh4XzYwOTVfZmFtaWx5KGNoaXApIHx8Ci0JCSAgICBtdjg4ZTZ4eHhfNjA2NV9mYW1pbHkoY2hpcCkgfHwKLQkJICAgIG12ODhlNnh4eF82MTg1X2ZhbWlseShjaGlwKSB8fAotCQkgICAgbXY4OGU2eHh4XzYzMjBfZmFtaWx5KGNoaXApKSB7Ci0JCQlyZWcgfD0gUE9SVF9DT05UUk9MX0VHUkVTU19BRERfVEFHOwotCQl9CisJCWVsc2UKKwkJCXJlZyB8PSBQT1JUX0NPTlRST0xfRFNBX1RBRzsKKwkJcmVnIHw9IFBPUlRfQ09OVFJPTF9FR1JFU1NfQUREX1RBRyB8CisJCQlQT1JUX0NPTlRST0xfRk9SV0FSRF9VTktOT1dOOwogCX0KIAlpZiAoZHNhX2lzX2RzYV9wb3J0KGRzLCBwb3J0KSkgewogCQlpZiAobXY4OGU2eHh4XzYwOTVfZmFtaWx5KGNoaXApIHx8CkBAIC0yNTI2LDI2ICsyNTMzLDI1IEBACiAJCQkJUE9SVF9DT05UUk9MX0ZPUldBUkRfVU5LTk9XTl9NQzsKIAl9CiAJaWYgKHJlZykgewotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfUE9SVChwb3J0KSwKLQkJCQkJICAgUE9SVF9DT05UUk9MLCByZWcpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X3BvcnRfd3JpdGUoY2hpcCwgcG9ydCwgUE9SVF9DT05UUk9MLCByZWcpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAl9CiAKIAkvKiBJZiB0aGlzIHBvcnQgaXMgY29ubmVjdGVkIHRvIGEgU2VyRGVzLCBtYWtlIHN1cmUgdGhlIFNlckRlcyBpcyBub3QKIAkgKiBwb3dlcmVkIGRvd24uCiAJICovCi0JaWYgKG12ODhlNnh4eF82MzUyX2ZhbWlseShjaGlwKSkgewotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19QT1JUKHBvcnQpLCBQT1JUX1NUQVRVUyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQkJcmV0ICY9IFBPUlRfU1RBVFVTX0NNT0RFX01BU0s7Ci0JCWlmICgocmV0ID09IFBPUlRfU1RBVFVTX0NNT0RFXzEwMEJBU0VfWCkgfHwKLQkJICAgIChyZXQgPT0gUE9SVF9TVEFUVVNfQ01PREVfMTAwMEJBU0VfWCkgfHwKLQkJICAgIChyZXQgPT0gUE9SVF9TVEFUVVNfQ01PREVfU0dNSUkpKSB7Ci0JCQlyZXQgPSBtdjg4ZTZ4eHhfcG93ZXJfb25fc2VyZGVzKGNoaXApOwotCQkJaWYgKHJldCA8IDApCi0JCQkJcmV0dXJuIHJldDsKKwlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR1NfU0VSREVTKSkgeworCQllcnIgPSBtdjg4ZTZ4eHhfcG9ydF9yZWFkKGNoaXAsIHBvcnQsIFBPUlRfU1RBVFVTLCAmcmVnKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCXJlZyAmPSBQT1JUX1NUQVRVU19DTU9ERV9NQVNLOworCQlpZiAoKHJlZyA9PSBQT1JUX1NUQVRVU19DTU9ERV8xMDBCQVNFX1gpIHx8CisJCSAgICAocmVnID09IFBPUlRfU1RBVFVTX0NNT0RFXzEwMDBCQVNFX1gpIHx8CisJCSAgICAocmVnID09IFBPUlRfU1RBVFVTX0NNT0RFX1NHTUlJKSkgeworCQkJZXJyID0gbXY4OGU2eHh4X3NlcmRlc19wb3dlcl9vbihjaGlwKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CiAJCX0KIAl9CiAKQEAgLTI1NzksMTAgKzI1ODUsOSBAQAogCXJlZyB8PSBQT1JUX0NPTlRST0xfMl84MDIxUV9ESVNBQkxFRDsKIAogCWlmIChyZWcpIHsKLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX1BPUlQocG9ydCksCi0JCQkJCSAgIFBPUlRfQ09OVFJPTF8yLCByZWcpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X3BvcnRfd3JpdGUoY2hpcCwgcG9ydCwgUE9SVF9DT05UUk9MXzIsIHJlZyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KIAogCS8qIFBvcnQgQXNzb2NpYXRpb24gVmVjdG9yOiB3aGVuIGxlYXJuaW5nIHNvdXJjZSBhZGRyZXNzZXMKQEAgLTI1OTUsMTYgKzI2MDAsMTQgQEAKIAlpZiAoZHNhX2lzX2NwdV9wb3J0KGRzLCBwb3J0KSkKIAkJcmVnID0gMDsKIAotCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19QT1JUKHBvcnQpLCBQT1JUX0FTU09DX1ZFQ1RPUiwKLQkJCQkgICByZWcpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJZXJyID0gbXY4OGU2eHh4X3BvcnRfd3JpdGUoY2hpcCwgcG9ydCwgUE9SVF9BU1NPQ19WRUNUT1IsIHJlZyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCS8qIEVncmVzcyByYXRlIGNvbnRyb2wgMjogZGlzYWJsZSBlZ3Jlc3MgcmF0ZSBjb250cm9sLiAqLwotCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19QT1JUKHBvcnQpLCBQT1JUX1JBVEVfQ09OVFJPTF8yLAotCQkJCSAgIDB4MDAwMCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBtdjg4ZTZ4eHhfcG9ydF93cml0ZShjaGlwLCBwb3J0LCBQT1JUX1JBVEVfQ09OVFJPTF8yLCAweDAwMDApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlpZiAobXY4OGU2eHh4XzYzNTJfZmFtaWx5KGNoaXApIHx8IG12ODhlNnh4eF82MzUxX2ZhbWlseShjaGlwKSB8fAogCSAgICBtdjg4ZTZ4eHhfNjE2NV9mYW1pbHkoY2hpcCkgfHwgbXY4OGU2eHh4XzYwOTdfZmFtaWx5KGNoaXApIHx8CkBAIC0yNjEzLDEwNyArMjYxNiwxMDggQEAKIAkJICogYmUgcGF1c2VkIGZvciBieSB0aGUgcmVtb3RlIGVuZCBvciB0aGUgcGVyaW9kIG9mCiAJCSAqIHRpbWUgdGhhdCB0aGlzIHBvcnQgY2FuIHBhdXNlIHRoZSByZW1vdGUgZW5kLgogCQkgKi8KLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX1BPUlQocG9ydCksCi0JCQkJCSAgIFBPUlRfUEFVU0VfQ1RSTCwgMHgwMDAwKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7CisJCWVyciA9IG12ODhlNnh4eF9wb3J0X3dyaXRlKGNoaXAsIHBvcnQsIFBPUlRfUEFVU0VfQ1RSTCwgMHgwMDAwKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAKIAkJLyogUG9ydCBBVFUgY29udHJvbDogZGlzYWJsZSBsaW1pdGluZyB0aGUgbnVtYmVyIG9mCiAJCSAqIGFkZHJlc3MgZGF0YWJhc2UgZW50cmllcyB0aGF0IHRoaXMgcG9ydCBpcyBhbGxvd2VkCiAJCSAqIHRvIHVzZS4KIAkJICovCi0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19QT1JUKHBvcnQpLAotCQkJCQkgICBQT1JUX0FUVV9DT05UUk9MLCAweDAwMDApOworCQllcnIgPSBtdjg4ZTZ4eHhfcG9ydF93cml0ZShjaGlwLCBwb3J0LCBQT1JUX0FUVV9DT05UUk9MLAorCQkJCQkgICAweDAwMDApOwogCQkvKiBQcmlvcml0eSBPdmVycmlkZTogZGlzYWJsZSBEQSwgU0EgYW5kIFZUVSBwcmlvcml0eQogCQkgKiBvdmVycmlkZS4KIAkJICovCi0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19QT1JUKHBvcnQpLAotCQkJCQkgICBQT1JUX1BSSV9PVkVSUklERSwgMHgwMDAwKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7CisJCWVyciA9IG12ODhlNnh4eF9wb3J0X3dyaXRlKGNoaXAsIHBvcnQsIFBPUlRfUFJJX09WRVJSSURFLAorCQkJCQkgICAweDAwMDApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAogCQkvKiBQb3J0IEV0aGVydHlwZTogdXNlIHRoZSBFdGhlcnR5cGUgRFNBIEV0aGVydHlwZQogCQkgKiB2YWx1ZS4KIAkJICovCi0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19QT1JUKHBvcnQpLAotCQkJCQkgICBQT1JUX0VUSF9UWVBFLCBFVEhfUF9FRFNBKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7CisJCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX0VEU0EpKSB7CisJCQllcnIgPSBtdjg4ZTZ4eHhfcG9ydF93cml0ZShjaGlwLCBwb3J0LCBQT1JUX0VUSF9UWVBFLAorCQkJCQkJICAgRVRIX1BfRURTQSk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwogCQkvKiBUYWcgUmVtYXA6IHVzZSBhbiBpZGVudGl0eSA4MDIuMXAgcHJpbyAtPiBzd2l0Y2gKIAkJICogcHJpbyBtYXBwaW5nLgogCQkgKi8KLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX1BPUlQocG9ydCksCi0JCQkJCSAgIFBPUlRfVEFHX1JFR01BUF8wMTIzLCAweDMyMTApOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X3BvcnRfd3JpdGUoY2hpcCwgcG9ydCwgUE9SVF9UQUdfUkVHTUFQXzAxMjMsCisJCQkJCSAgIDB4MzIxMCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCiAJCS8qIFRhZyBSZW1hcCAyOiB1c2UgYW4gaWRlbnRpdHkgODAyLjFwIHByaW8gLT4gc3dpdGNoCiAJCSAqIHByaW8gbWFwcGluZy4KIAkJICovCi0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19QT1JUKHBvcnQpLAotCQkJCQkgICBQT1JUX1RBR19SRUdNQVBfNDU2NywgMHg3NjU0KTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7CisJCWVyciA9IG12ODhlNnh4eF9wb3J0X3dyaXRlKGNoaXAsIHBvcnQsIFBPUlRfVEFHX1JFR01BUF80NTY3LAorCQkJCQkgICAweDc2NTQpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAl9CiAKKwkvKiBSYXRlIENvbnRyb2w6IGRpc2FibGUgaW5ncmVzcyByYXRlIGxpbWl0aW5nLiAqLwogCWlmIChtdjg4ZTZ4eHhfNjM1Ml9mYW1pbHkoY2hpcCkgfHwgbXY4OGU2eHh4XzYzNTFfZmFtaWx5KGNoaXApIHx8CiAJICAgIG12ODhlNnh4eF82MTY1X2ZhbWlseShjaGlwKSB8fCBtdjg4ZTZ4eHhfNjA5N19mYW1pbHkoY2hpcCkgfHwKLQkgICAgbXY4OGU2eHh4XzYxODVfZmFtaWx5KGNoaXApIHx8IG12ODhlNnh4eF82MDk1X2ZhbWlseShjaGlwKSB8fAogCSAgICBtdjg4ZTZ4eHhfNjMyMF9mYW1pbHkoY2hpcCkpIHsKLQkJLyogUmF0ZSBDb250cm9sOiBkaXNhYmxlIGluZ3Jlc3MgcmF0ZSBsaW1pdGluZy4gKi8KLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX1BPUlQocG9ydCksCi0JCQkJCSAgIFBPUlRfUkFURV9DT05UUk9MLCAweDAwMDEpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X3BvcnRfd3JpdGUoY2hpcCwgcG9ydCwgUE9SVF9SQVRFX0NPTlRST0wsCisJCQkJCSAgIDB4MDAwMSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0gZWxzZSBpZiAobXY4OGU2eHh4XzYxODVfZmFtaWx5KGNoaXApIHx8IG12ODhlNnh4eF82MDk1X2ZhbWlseShjaGlwKSkgeworCQllcnIgPSBtdjg4ZTZ4eHhfcG9ydF93cml0ZShjaGlwLCBwb3J0LCBQT1JUX1JBVEVfQ09OVFJPTCwKKwkJCQkJICAgMHgwMDAwKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAJfQogCiAJLyogUG9ydCBDb250cm9sIDE6IGRpc2FibGUgdHJ1bmtpbmcsIGRpc2FibGUgc2VuZGluZwogCSAqIGxlYXJuaW5nIG1lc3NhZ2VzIHRvIHRoaXMgcG9ydC4KIAkgKi8KLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfUE9SVChwb3J0KSwgUE9SVF9DT05UUk9MXzEsCi0JCQkJICAgMHgwMDAwKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCWVyciA9IG12ODhlNnh4eF9wb3J0X3dyaXRlKGNoaXAsIHBvcnQsIFBPUlRfQ09OVFJPTF8xLCAweDAwMDApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAkvKiBQb3J0IGJhc2VkIFZMQU4gbWFwOiBnaXZlIGVhY2ggcG9ydCB0aGUgc2FtZSBkZWZhdWx0IGFkZHJlc3MKIAkgKiBkYXRhYmFzZSwgYW5kIGFsbG93IGJpZGlyZWN0aW9uYWwgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZQogCSAqIENQVSBhbmQgRFNBIHBvcnQocyksIGFuZCB0aGUgb3RoZXIgcG9ydHMuCiAJICovCi0JcmV0ID0gX212ODhlNnh4eF9wb3J0X2ZpZF9zZXQoY2hpcCwgcG9ydCwgMCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBfbXY4OGU2eHh4X3BvcnRfZmlkX3NldChjaGlwLCBwb3J0LCAwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCi0JcmV0ID0gX212ODhlNnh4eF9wb3J0X2Jhc2VkX3ZsYW5fbWFwKGNoaXAsIHBvcnQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJZXJyID0gX212ODhlNnh4eF9wb3J0X2Jhc2VkX3ZsYW5fbWFwKGNoaXAsIHBvcnQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAkvKiBEZWZhdWx0IFZMQU4gSUQgYW5kIHByaW9yaXR5OiBkb24ndCBzZXQgYSBkZWZhdWx0IFZMQU4KIAkgKiBJRCwgYW5kIHNldCB0aGUgZGVmYXVsdCBwYWNrZXQgcHJpb3JpdHkgdG8gemVyby4KIAkgKi8KLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfUE9SVChwb3J0KSwgUE9SVF9ERUZBVUxUX1ZMQU4sCi0JCQkJICAgMHgwMDAwKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIG12ODhlNnh4eF9wb3J0X3dyaXRlKGNoaXAsIHBvcnQsIFBPUlRfREVGQVVMVF9WTEFOLCAweDAwMDApOwogfQogCi1zdGF0aWMgaW50IG12ODhlNnh4eF9nMV9zZXRfc3dpdGNoX21hYyhzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIHU4ICphZGRyKQoraW50IG12ODhlNnh4eF9nMV9zZXRfc3dpdGNoX21hYyhzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIHU4ICphZGRyKQogewogCWludCBlcnI7CiAKLQllcnIgPSBtdjg4ZTZ4eHhfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX01BQ18wMSwKLQkJCSAgICAgIChhZGRyWzBdIDw8IDgpIHwgYWRkclsxXSk7CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9NQUNfMDEsIChhZGRyWzBdIDw8IDgpIHwgYWRkclsxXSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWVyciA9IG12ODhlNnh4eF93cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfTUFDXzIzLAotCQkJICAgICAgKGFkZHJbMl0gPDwgOCkgfCBhZGRyWzNdKTsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX01BQ18yMywgKGFkZHJbMl0gPDwgOCkgfCBhZGRyWzNdKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JcmV0dXJuIG12ODhlNnh4eF93cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfTUFDXzQ1LAotCQkJICAgICAgIChhZGRyWzRdIDw8IDgpIHwgYWRkcls1XSk7CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9NQUNfNDUsIChhZGRyWzRdIDw8IDgpIHwgYWRkcls1XSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG12ODhlNnh4eF9nMV9zZXRfYWdlX3RpbWUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLApAQCAtMjczMiw3ICsyNzM2LDcgQEAKIAkvKiBSb3VuZCB0byBuZWFyZXN0IG11bHRpcGxlIG9mIGNvZWZmICovCiAJYWdlX3RpbWUgPSAobXNlY3MgKyBjb2VmZiAvIDIpIC8gY29lZmY7CiAKLQllcnIgPSBtdjg4ZTZ4eHhfcmVhZChjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfQVRVX0NPTlRST0wsICZ2YWwpOworCWVyciA9IG12ODhlNnh4eF9nMV9yZWFkKGNoaXAsIEdMT0JBTF9BVFVfQ09OVFJPTCwgJnZhbCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtMjc0MCwxMyArMjc0NCwxMyBAQAogCXZhbCAmPSB+MHhmZjA7CiAJdmFsIHw9IGFnZV90aW1lIDw8IDQ7CiAKLQlyZXR1cm4gbXY4OGU2eHh4X3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9BVFVfQ09OVFJPTCwgdmFsKTsKKwlyZXR1cm4gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9BVFVfQ09OVFJPTCwgdmFsKTsKIH0KIAogc3RhdGljIGludCBtdjg4ZTZ4eHhfc2V0X2FnZWluZ190aW1lKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywKIAkJCQkgICAgIHVuc2lnbmVkIGludCBhZ2VpbmdfdGltZSkKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKIAlpbnQgZXJyOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOwpAQCAtMjc3MSw3ICsyNzc1LDcgQEAKIAkgICAgbXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19QUFVfQUNUSVZFKSkKIAkJcmVnIHw9IEdMT0JBTF9DT05UUk9MX1BQVV9FTkFCTEU7CiAKLQllcnIgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfQ09OVFJPTCwgcmVnKTsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX0NPTlRST0wsIHJlZyk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtMjc4MSwxNSArMjc4NSwxNCBAQAogCXJlZyA9IHVwc3RyZWFtX3BvcnQgPDwgR0xPQkFMX01PTklUT1JfQ09OVFJPTF9JTkdSRVNTX1NISUZUIHwKIAkJdXBzdHJlYW1fcG9ydCA8PCBHTE9CQUxfTU9OSVRPUl9DT05UUk9MX0VHUkVTU19TSElGVCB8CiAJCXVwc3RyZWFtX3BvcnQgPDwgR0xPQkFMX01PTklUT1JfQ09OVFJPTF9BUlBfU0hJRlQ7Ci0JZXJyID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX01PTklUT1JfQ09OVFJPTCwKLQkJCQkgICByZWcpOworCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfTU9OSVRPUl9DT05UUk9MLCByZWcpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKIAkvKiBEaXNhYmxlIHJlbW90ZSBtYW5hZ2VtZW50LCBhbmQgc2V0IHRoZSBzd2l0Y2gncyBEU0EgZGV2aWNlIG51bWJlci4gKi8KLQllcnIgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfQ09OVFJPTF8yLAotCQkJCSAgIEdMT0JBTF9DT05UUk9MXzJfTVVMVElQTEVfQ0FTQ0FERSB8Ci0JCQkJICAgKGRzLT5pbmRleCAmIDB4MWYpKTsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX0NPTlRST0xfMiwKKwkJCQkgR0xPQkFMX0NPTlRST0xfMl9NVUxUSVBMRV9DQVNDQURFIHwKKwkJCQkgKGRzLT5pbmRleCAmIDB4MWYpKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCkBAIC0yODAyLDggKzI4MDUsOCBAQAogCSAqIGVuYWJsZSBhZGRyZXNzIGxlYXJuIG1lc3NhZ2VzIHRvIGJlIHNlbnQgdG8gYWxsIG1lc3NhZ2UKIAkgKiBwb3J0cy4KIAkgKi8KLQllcnIgPSBtdjg4ZTZ4eHhfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX0FUVV9DT05UUk9MLAotCQkJICAgICAgR0xPQkFMX0FUVV9DT05UUk9MX0xFQVJOMkFMTCk7CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9BVFVfQ09OVFJPTCwKKwkJCQkgR0xPQkFMX0FUVV9DT05UUk9MX0xFQVJOMkFMTCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtMjgxNywzOSArMjgyMCwzOSBAQAogCQlyZXR1cm4gZXJyOwogCiAJLyogQ29uZmlndXJlIHRoZSBJUCBUb1MgbWFwcGluZyByZWdpc3RlcnMuICovCi0JZXJyID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX0lQX1BSSV8wLCAweDAwMDApOworCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfSVBfUFJJXzAsIDB4MDAwMCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQllcnIgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfSVBfUFJJXzEsIDB4MDAwMCk7CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9JUF9QUklfMSwgMHgwMDAwKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCWVyciA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9JUF9QUklfMiwgMHg1NTU1KTsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX0lQX1BSSV8yLCAweDU1NTUpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7Ci0JZXJyID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX0lQX1BSSV8zLCAweDU1NTUpOworCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfSVBfUFJJXzMsIDB4NTU1NSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQllcnIgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfSVBfUFJJXzQsIDB4YWFhYSk7CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9JUF9QUklfNCwgMHhhYWFhKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCWVyciA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9JUF9QUklfNSwgMHhhYWFhKTsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX0lQX1BSSV81LCAweGFhYWEpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7Ci0JZXJyID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX0lQX1BSSV82LCAweGZmZmYpOworCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfSVBfUFJJXzYsIDB4ZmZmZik7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQllcnIgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfSVBfUFJJXzcsIDB4ZmZmZik7CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9JUF9QUklfNywgMHhmZmZmKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCiAJLyogQ29uZmlndXJlIHRoZSBJRUVFIDgwMi4xcCBwcmlvcml0eSBtYXBwaW5nIHJlZ2lzdGVyLiAqLwotCWVyciA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9JRUVFX1BSSSwgMHhmYTQxKTsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX0lFRUVfUFJJLCAweGZhNDEpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKIAkvKiBDbGVhciB0aGUgc3RhdGlzdGljcyBjb3VudGVycyBmb3IgYWxsIHBvcnRzICovCi0JZXJyID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX1NUQVRTX09QLAotCQkJCSAgIEdMT0JBTF9TVEFUU19PUF9GTFVTSF9BTEwpOworCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfU1RBVFNfT1AsCisJCQkJIEdMT0JBTF9TVEFUU19PUF9GTFVTSF9BTEwpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKQEAgLTI4NjEsMjc3ICsyODY0LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfZGV2aWNlX21hcHBpbmdfd3JpdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAotCQkJCQkgICAgIGludCB0YXJnZXQsIGludCBwb3J0KQotewotCXUxNiB2YWwgPSAodGFyZ2V0IDw8IDgpIHwgKHBvcnQgJiAweGYpOwotCi0JcmV0dXJuIG12ODhlNnh4eF91cGRhdGUoY2hpcCwgUkVHX0dMT0JBTDIsIEdMT0JBTDJfREVWSUNFX01BUFBJTkcsIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX3NldF9kZXZpY2VfbWFwcGluZyhzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCi17Ci0JaW50IHRhcmdldCwgcG9ydDsKLQlpbnQgZXJyOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgcm91dGluZyBwb3J0IHRvIHRoZSAzMiBwb3NzaWJsZSB0YXJnZXQgZGV2aWNlcyAqLwotCWZvciAodGFyZ2V0ID0gMDsgdGFyZ2V0IDwgMzI7ICsrdGFyZ2V0KSB7Ci0JCXBvcnQgPSAweGY7Ci0KLQkJaWYgKHRhcmdldCA8IERTQV9NQVhfU1dJVENIRVMpIHsKLQkJCXBvcnQgPSBjaGlwLT5kcy0+cnRhYmxlW3RhcmdldF07Ci0JCQlpZiAocG9ydCA9PSBEU0FfUlRBQkxFX05PTkUpCi0JCQkJcG9ydCA9IDB4ZjsKLQkJfQotCi0JCWVyciA9IG12ODhlNnh4eF9nMl9kZXZpY2VfbWFwcGluZ193cml0ZShjaGlwLCB0YXJnZXQsIHBvcnQpOwotCQlpZiAoZXJyKQotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfdHJ1bmtfbWFza193cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBudW0sCi0JCQkJCSBib29sIGhhc2ssIHUxNiBtYXNrKQotewotCWNvbnN0IHUxNiBwb3J0X21hc2sgPSBCSVQoY2hpcC0+aW5mby0+bnVtX3BvcnRzKSAtIDE7Ci0JdTE2IHZhbCA9IChudW0gPDwgMTIpIHwgKG1hc2sgJiBwb3J0X21hc2spOwotCi0JaWYgKGhhc2spCi0JCXZhbCB8PSBHTE9CQUwyX1RSVU5LX01BU0tfSEFTSzsKLQotCXJldHVybiBtdjg4ZTZ4eHhfdXBkYXRlKGNoaXAsIFJFR19HTE9CQUwyLCBHTE9CQUwyX1RSVU5LX01BU0ssIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX3RydW5rX21hcHBpbmdfd3JpdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgaWQsCi0JCQkJCSAgICB1MTYgbWFwKQotewotCWNvbnN0IHUxNiBwb3J0X21hc2sgPSBCSVQoY2hpcC0+aW5mby0+bnVtX3BvcnRzKSAtIDE7Ci0JdTE2IHZhbCA9IChpZCA8PCAxMSkgfCAobWFwICYgcG9ydF9tYXNrKTsKLQotCXJldHVybiBtdjg4ZTZ4eHhfdXBkYXRlKGNoaXAsIFJFR19HTE9CQUwyLCBHTE9CQUwyX1RSVU5LX01BUFBJTkcsIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX2NsZWFyX3RydW5rKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKLXsKLQljb25zdCB1MTYgcG9ydF9tYXNrID0gQklUKGNoaXAtPmluZm8tPm51bV9wb3J0cykgLSAxOwotCWludCBpLCBlcnI7Ci0KLQkvKiBDbGVhciBhbGwgZWlnaHQgcG9zc2libGUgVHJ1bmsgTWFzayB2ZWN0b3JzICovCi0JZm9yIChpID0gMDsgaSA8IDg7ICsraSkgewotCQllcnIgPSBtdjg4ZTZ4eHhfZzJfdHJ1bmtfbWFza193cml0ZShjaGlwLCBpLCBmYWxzZSwgcG9ydF9tYXNrKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JLyogQ2xlYXIgYWxsIHNpeHRlZW4gcG9zc2libGUgVHJ1bmsgSUQgcm91dGluZyB2ZWN0b3JzICovCi0JZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKLQkJZXJyID0gbXY4OGU2eHh4X2cyX3RydW5rX21hcHBpbmdfd3JpdGUoY2hpcCwgaSwgMCk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG12ODhlNnh4eF9nMl9jbGVhcl9pcmwoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQotewotCWludCBwb3J0LCBlcnI7Ci0KLQkvKiBJbml0IGFsbCBJbmdyZXNzIFJhdGUgTGltaXQgcmVzb3VyY2VzIG9mIGFsbCBwb3J0cyAqLwotCWZvciAocG9ydCA9IDA7IHBvcnQgPCBjaGlwLT5pbmZvLT5udW1fcG9ydHM7ICsrcG9ydCkgewotCQkvKiBYWFggbmV3ZXIgY2hpcHMgKGxpa2UgODhFNjM5MCkgaGF2ZSBkaWZmZXJlbnQgMi1iaXQgb3BzICovCi0JCWVyciA9IG12ODhlNnh4eF93cml0ZShjaGlwLCBSRUdfR0xPQkFMMiwgR0xPQkFMMl9JUkxfQ01ELAotCQkJCSAgICAgIEdMT0JBTDJfSVJMX0NNRF9PUF9JTklUX0FMTCB8Ci0JCQkJICAgICAgKHBvcnQgPDwgOCkpOwotCQlpZiAoZXJyKQotCQkJYnJlYWs7Ci0KLQkJLyogV2FpdCBmb3IgdGhlIG9wZXJhdGlvbiB0byBjb21wbGV0ZSAqLwotCQllcnIgPSBfbXY4OGU2eHh4X3dhaXQoY2hpcCwgUkVHX0dMT0JBTDIsIEdMT0JBTDJfSVJMX0NNRCwKLQkJCQkgICAgICBHTE9CQUwyX0lSTF9DTURfQlVTWSk7Ci0JCWlmIChlcnIpCi0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotCi0vKiBJbmRpcmVjdCB3cml0ZSB0byB0aGUgU3dpdGNoIE1BQy9Xb0wvV29GIHJlZ2lzdGVyICovCi1zdGF0aWMgaW50IG12ODhlNnh4eF9nMl9zd2l0Y2hfbWFjX3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKLQkJCQkJIHVuc2lnbmVkIGludCBwb2ludGVyLCB1OCBkYXRhKQotewotCXUxNiB2YWwgPSAocG9pbnRlciA8PCA4KSB8IGRhdGE7Ci0KLQlyZXR1cm4gbXY4OGU2eHh4X3VwZGF0ZShjaGlwLCBSRUdfR0xPQkFMMiwgR0xPQkFMMl9TV0lUQ0hfTUFDLCB2YWwpOwotfQotCi1zdGF0aWMgaW50IG12ODhlNnh4eF9nMl9zZXRfc3dpdGNoX21hYyhzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIHU4ICphZGRyKQotewotCWludCBpLCBlcnI7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0JCWVyciA9IG12ODhlNnh4eF9nMl9zd2l0Y2hfbWFjX3dyaXRlKGNoaXAsIGksIGFkZHJbaV0pOwotCQlpZiAoZXJyKQotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfcG90X3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHBvaW50ZXIsCi0JCQkJICB1OCBkYXRhKQotewotCXUxNiB2YWwgPSAocG9pbnRlciA8PCA4KSB8IChkYXRhICYgMHg3KTsKLQotCXJldHVybiBtdjg4ZTZ4eHhfdXBkYXRlKGNoaXAsIFJFR19HTE9CQUwyLCBHTE9CQUwyX1BSSU9fT1ZFUlJJREUsIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX2NsZWFyX3BvdChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCi17Ci0JaW50IGksIGVycjsKLQotCS8qIENsZWFyIGFsbCBzaXh0ZWVuIHBvc3NpYmxlIFByaW9yaXR5IE92ZXJyaWRlIGVudHJpZXMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotCQllcnIgPSBtdjg4ZTZ4eHhfZzJfcG90X3dyaXRlKGNoaXAsIGksIDApOwotCQlpZiAoZXJyKQotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3dhaXQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQotewotCXJldHVybiBfbXY4OGU2eHh4X3dhaXQoY2hpcCwgUkVHX0dMT0JBTDIsIEdMT0JBTDJfRUVQUk9NX0NNRCwKLQkJCSAgICAgICBHTE9CQUwyX0VFUFJPTV9DTURfQlVTWSB8Ci0JCQkgICAgICAgR0xPQkFMMl9FRVBST01fQ01EX1JVTk5JTkcpOwotfQotCi1zdGF0aWMgaW50IG12ODhlNnh4eF9nMl9lZXByb21fY21kKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgdTE2IGNtZCkKLXsKLQlpbnQgZXJyOwotCi0JZXJyID0gbXY4OGU2eHh4X3dyaXRlKGNoaXAsIFJFR19HTE9CQUwyLCBHTE9CQUwyX0VFUFJPTV9DTUQsIGNtZCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCXJldHVybiBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3dhaXQoY2hpcCk7Ci19Ci0KLXN0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX2VlcHJvbV9yZWFkMTYoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAotCQkJCSAgICAgIHU4IGFkZHIsIHUxNiAqZGF0YSkKLXsKLQl1MTYgY21kID0gR0xPQkFMMl9FRVBST01fQ01EX09QX1JFQUQgfCBhZGRyOwotCWludCBlcnI7Ci0KLQllcnIgPSBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3dhaXQoY2hpcCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWVyciA9IG12ODhlNnh4eF9nMl9lZXByb21fY21kKGNoaXAsIGNtZCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCXJldHVybiBtdjg4ZTZ4eHhfcmVhZChjaGlwLCBSRUdfR0xPQkFMMiwgR0xPQkFMMl9FRVBST01fREFUQSwgZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX2VlcHJvbV93cml0ZTE2KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKLQkJCQkgICAgICAgdTggYWRkciwgdTE2IGRhdGEpCi17Ci0JdTE2IGNtZCA9IEdMT0JBTDJfRUVQUk9NX0NNRF9PUF9XUklURSB8IGFkZHI7Ci0JaW50IGVycjsKLQotCWVyciA9IG12ODhlNnh4eF9nMl9lZXByb21fd2FpdChjaGlwKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JZXJyID0gbXY4OGU2eHh4X3dyaXRlKGNoaXAsIFJFR19HTE9CQUwyLCBHTE9CQUwyX0VFUFJPTV9EQVRBLCBkYXRhKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JcmV0dXJuIG12ODhlNnh4eF9nMl9lZXByb21fY21kKGNoaXAsIGNtZCk7Ci19Ci0KLXN0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX3NldHVwKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKLXsKLQl1MTYgcmVnOwotCWludCBlcnI7Ci0KLQlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19HMl9NR01UX0VOXzJYKSkgewotCQkvKiBDb25zaWRlciB0aGUgZnJhbWVzIHdpdGggcmVzZXJ2ZWQgbXVsdGljYXN0IGRlc3RpbmF0aW9uCi0JCSAqIGFkZHJlc3NlcyBtYXRjaGluZyAwMTo4MDpjMjowMDowMDoyeCBhcyBNR01ULgotCQkgKi8KLQkJZXJyID0gbXY4OGU2eHh4X3dyaXRlKGNoaXAsIFJFR19HTE9CQUwyLCBHTE9CQUwyX01HTVRfRU5fMlgsCi0JCQkJICAgICAgMHhmZmZmKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfRzJfTUdNVF9FTl8wWCkpIHsKLQkJLyogQ29uc2lkZXIgdGhlIGZyYW1lcyB3aXRoIHJlc2VydmVkIG11bHRpY2FzdCBkZXN0aW5hdGlvbgotCQkgKiBhZGRyZXNzZXMgbWF0Y2hpbmcgMDE6ODA6YzI6MDA6MDA6MHggYXMgTUdNVC4KLQkJICovCi0JCWVyciA9IG12ODhlNnh4eF93cml0ZShjaGlwLCBSRUdfR0xPQkFMMiwgR0xPQkFMMl9NR01UX0VOXzBYLAotCQkJCSAgICAgIDB4ZmZmZik7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCS8qIElnbm9yZSByZW1vdmVkIHRhZyBkYXRhIG9uIGRvdWJseSB0YWdnZWQgcGFja2V0cywgZGlzYWJsZQotCSAqIGZsb3cgY29udHJvbCBtZXNzYWdlcywgZm9yY2UgZmxvdyBjb250cm9sIHByaW9yaXR5IHRvIHRoZQotCSAqIGhpZ2hlc3QsIGFuZCBzZW5kIGFsbCBzcGVjaWFsIG11bHRpY2FzdCBmcmFtZXMgdG8gdGhlIENQVQotCSAqIHBvcnQgYXQgdGhlIGhpZ2hlc3QgcHJpb3JpdHkuCi0JICovCi0JcmVnID0gR0xPQkFMMl9TV0lUQ0hfTUdNVF9GT1JDRV9GTE9XX0NUUkxfUFJJIHwgKDB4NyA8PCA0KTsKLQlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19HMl9NR01UX0VOXzBYKSB8fAotCSAgICBtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX0cyX01HTVRfRU5fMlgpKQotCQlyZWcgfD0gR0xPQkFMMl9TV0lUQ0hfTUdNVF9SU1ZEMkNQVSB8IDB4NzsKLQllcnIgPSBtdjg4ZTZ4eHhfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTDIsIEdMT0JBTDJfU1dJVENIX01HTVQsIHJlZyk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCS8qIFByb2dyYW0gdGhlIERTQSByb3V0aW5nIHRhYmxlLiAqLwotCWVyciA9IG12ODhlNnh4eF9nMl9zZXRfZGV2aWNlX21hcHBpbmcoY2hpcCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCS8qIENsZWFyIGFsbCB0cnVuayBtYXNrcyBhbmQgbWFwcGluZy4gKi8KLQllcnIgPSBtdjg4ZTZ4eHhfZzJfY2xlYXJfdHJ1bmsoY2hpcCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHU19JUkwpKSB7Ci0JCS8qIERpc2FibGUgaW5ncmVzcyByYXRlIGxpbWl0aW5nIGJ5IHJlc2V0dGluZyBhbGwgcGVyIHBvcnQKLQkJICogaW5ncmVzcyByYXRlIGxpbWl0IHJlc291cmNlcyB0byB0aGVpciBpbml0aWFsIHN0YXRlLgotCQkgKi8KLQkJZXJyID0gbXY4OGU2eHh4X2cyX2NsZWFyX2lybChjaGlwKTsKLQkJCWlmIChlcnIpCi0JCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR1NfUFZUKSkgewotCQkvKiBJbml0aWFsaXplIENyb3NzLWNoaXAgUG9ydCBWTEFOIFRhYmxlIHRvIHJlc2V0IGRlZmF1bHRzICovCi0JCWVyciA9IG12ODhlNnh4eF93cml0ZShjaGlwLCBSRUdfR0xPQkFMMiwgR0xPQkFMMl9QVlRfQUREUiwKLQkJCQkgICAgICBHTE9CQUwyX1BWVF9BRERSX09QX0lOSVRfT05FUyk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX0cyX1BPVCkpIHsKLQkJLyogQ2xlYXIgdGhlIHByaW9yaXR5IG92ZXJyaWRlIHRhYmxlLiAqLwotCQllcnIgPSBtdjg4ZTZ4eHhfZzJfY2xlYXJfcG90KGNoaXApOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBtdjg4ZTZ4eHhfc2V0dXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OwogCWludCBlcnI7CiAJaW50IGk7CiAKQEAgLTMxNDUsNyArMjg4MCw3IEBACiAJCWdvdG8gdW5sb2NrOwogCiAJLyogU2V0dXAgU3dpdGNoIFBvcnQgUmVnaXN0ZXJzICovCi0JZm9yIChpID0gMDsgaSA8IGNoaXAtPmluZm8tPm51bV9wb3J0czsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IG12ODhlNnh4eF9udW1fcG9ydHMoY2hpcCk7IGkrKykgewogCQllcnIgPSBtdjg4ZTZ4eHhfc2V0dXBfcG9ydChjaGlwLCBpKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gdW5sb2NrOwpAQCAtMzE3MSw5OCArMjkwNiw0OCBAQAogCiBzdGF0aWMgaW50IG12ODhlNnh4eF9zZXRfYWRkcihzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIHU4ICphZGRyKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OwogCWludCBlcnI7CiAKKwlpZiAoIWNoaXAtPmluZm8tPm9wcy0+c2V0X3N3aXRjaF9tYWMpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwogCW11dGV4X2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQotCS8qIEhhcyBhbiBpbmRpcmVjdCBTd2l0Y2ggTUFDL1dvTC9Xb0YgcmVnaXN0ZXIgaW4gR2xvYmFsIDI/ICovCi0JaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfRzJfU1dJVENIX01BQykpCi0JCWVyciA9IG12ODhlNnh4eF9nMl9zZXRfc3dpdGNoX21hYyhjaGlwLCBhZGRyKTsKLQllbHNlCi0JCWVyciA9IG12ODhlNnh4eF9nMV9zZXRfc3dpdGNoX21hYyhjaGlwLCBhZGRyKTsKLQorCWVyciA9IGNoaXAtPmluZm8tPm9wcy0+c2V0X3N3aXRjaF9tYWMoY2hpcCwgYWRkcik7CiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IG12ODhlNnh4eF9tZGlvX3BhZ2VfcmVhZChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LCBpbnQgcGFnZSwKLQkJCQkgICAgaW50IHJlZykKLXsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOwotCXJldCA9IF9tdjg4ZTZ4eHhfbWRpb19wYWdlX3JlYWQoY2hpcCwgcG9ydCwgcGFnZSwgcmVnKTsKLQltdXRleF91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXY4OGU2eHh4X21kaW9fcGFnZV93cml0ZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LCBpbnQgcGFnZSwKLQkJCQkgICAgIGludCByZWcsIGludCB2YWwpCi17Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7Ci0JaW50IHJldDsKLQotCW11dGV4X2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQlyZXQgPSBfbXY4OGU2eHh4X21kaW9fcGFnZV93cml0ZShjaGlwLCBwb3J0LCBwYWdlLCByZWcsIHZhbCk7Ci0JbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG12ODhlNnh4eF9wb3J0X3RvX21kaW9fYWRkcihzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBwb3J0KQotewotCWlmIChwb3J0ID49IDAgJiYgcG9ydCA8IGNoaXAtPmluZm8tPm51bV9wb3J0cykKLQkJcmV0dXJuIHBvcnQ7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgbXY4OGU2eHh4X21kaW9fcmVhZChzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgcG9ydCwgaW50IHJlZ251bSkKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X21kaW9fcmVhZChzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgcGh5LCBpbnQgcmVnKQogewogCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGJ1cy0+cHJpdjsKLQlpbnQgYWRkciA9IG12ODhlNnh4eF9wb3J0X3RvX21kaW9fYWRkcihjaGlwLCBwb3J0KTsKLQlpbnQgcmV0OworCXUxNiB2YWw7CisJaW50IGVycjsKIAotCWlmIChhZGRyIDwgMCkKKwlpZiAocGh5ID49IG12ODhlNnh4eF9udW1fcG9ydHMoY2hpcCkpCiAJCXJldHVybiAweGZmZmY7CiAKIAltdXRleF9sb2NrKCZjaGlwLT5yZWdfbG9jayk7Ci0KLQlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19QUFUpKQotCQlyZXQgPSBtdjg4ZTZ4eHhfbWRpb19yZWFkX3BwdShjaGlwLCBhZGRyLCByZWdudW0pOwotCWVsc2UgaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfU01JX1BIWSkpCi0JCXJldCA9IG12ODhlNnh4eF9tZGlvX3JlYWRfaW5kaXJlY3QoY2hpcCwgYWRkciwgcmVnbnVtKTsKLQllbHNlCi0JCXJldCA9IG12ODhlNnh4eF9tZGlvX3JlYWRfZGlyZWN0KGNoaXAsIGFkZHIsIHJlZ251bSk7Ci0KKwllcnIgPSBtdjg4ZTZ4eHhfcGh5X3JlYWQoY2hpcCwgcGh5LCByZWcsICZ2YWwpOwogCW11dGV4X3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwotCXJldHVybiByZXQ7CisKKwlyZXR1cm4gZXJyID8gZXJyIDogdmFsOwogfQogCi1zdGF0aWMgaW50IG12ODhlNnh4eF9tZGlvX3dyaXRlKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBwb3J0LCBpbnQgcmVnbnVtLAotCQkJCXUxNiB2YWwpCitzdGF0aWMgaW50IG12ODhlNnh4eF9tZGlvX3dyaXRlKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBwaHksIGludCByZWcsIHUxNiB2YWwpCiB7CiAJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gYnVzLT5wcml2OwotCWludCBhZGRyID0gbXY4OGU2eHh4X3BvcnRfdG9fbWRpb19hZGRyKGNoaXAsIHBvcnQpOwotCWludCByZXQ7CisJaW50IGVycjsKIAotCWlmIChhZGRyIDwgMCkKKwlpZiAocGh5ID49IG12ODhlNnh4eF9udW1fcG9ydHMoY2hpcCkpCiAJCXJldHVybiAweGZmZmY7CiAKIAltdXRleF9sb2NrKCZjaGlwLT5yZWdfbG9jayk7Ci0KLQlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19QUFUpKQotCQlyZXQgPSBtdjg4ZTZ4eHhfbWRpb193cml0ZV9wcHUoY2hpcCwgYWRkciwgcmVnbnVtLCB2YWwpOwotCWVsc2UgaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfU01JX1BIWSkpCi0JCXJldCA9IG12ODhlNnh4eF9tZGlvX3dyaXRlX2luZGlyZWN0KGNoaXAsIGFkZHIsIHJlZ251bSwgdmFsKTsKLQllbHNlCi0JCXJldCA9IG12ODhlNnh4eF9tZGlvX3dyaXRlX2RpcmVjdChjaGlwLCBhZGRyLCByZWdudW0sIHZhbCk7Ci0KKwllcnIgPSBtdjg4ZTZ4eHhfcGh5X3dyaXRlKGNoaXAsIHBoeSwgcmVnLCB2YWwpOwogCW11dGV4X3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwotCXJldHVybiByZXQ7CisKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IG12ODhlNnh4eF9tZGlvX3JlZ2lzdGVyKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKQEAgLTMyNzIsOSArMjk1Nyw2IEBACiAJc3RydWN0IG1paV9idXMgKmJ1czsKIAlpbnQgZXJyOwogCi0JaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfUFBVKSkKLQkJbXY4OGU2eHh4X3BwdV9zdGF0ZV9pbml0KGNoaXApOwotCiAJaWYgKG5wKQogCQljaGlwLT5tZGlvX25wID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUobnAsICJtZGlvIik7CiAKQEAgLTMzMjksNjkgKzMwMTEsNzAgQEAKIAogc3RhdGljIGludCBtdjg4ZTYxeHhfZ2V0X3RlbXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgKnRlbXApCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CisJdTE2IHZhbDsKIAlpbnQgcmV0OwotCWludCB2YWw7CiAKIAkqdGVtcCA9IDA7CiAKIAltdXRleF9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAKLQlyZXQgPSBtdjg4ZTZ4eHhfbWRpb193cml0ZV9kaXJlY3QoY2hpcCwgMHgwLCAweDE2LCAweDYpOworCXJldCA9IG12ODhlNnh4eF9waHlfd3JpdGUoY2hpcCwgMHgwLCAweDE2LCAweDYpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycm9yOwogCiAJLyogRW5hYmxlIHRlbXBlcmF0dXJlIHNlbnNvciAqLwotCXJldCA9IG12ODhlNnh4eF9tZGlvX3JlYWRfZGlyZWN0KGNoaXAsIDB4MCwgMHgxYSk7CisJcmV0ID0gbXY4OGU2eHh4X3BoeV9yZWFkKGNoaXAsIDB4MCwgMHgxYSwgJnZhbCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3I7CiAKLQlyZXQgPSBtdjg4ZTZ4eHhfbWRpb193cml0ZV9kaXJlY3QoY2hpcCwgMHgwLCAweDFhLCByZXQgfCAoMSA8PCA1KSk7CisJcmV0ID0gbXY4OGU2eHh4X3BoeV93cml0ZShjaGlwLCAweDAsIDB4MWEsIHZhbCB8ICgxIDw8IDUpKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJvcjsKIAogCS8qIFdhaXQgZm9yIHRlbXBlcmF0dXJlIHRvIHN0YWJpbGl6ZSAqLwogCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTIwMDApOwogCi0JdmFsID0gbXY4OGU2eHh4X21kaW9fcmVhZF9kaXJlY3QoY2hpcCwgMHgwLCAweDFhKTsKLQlpZiAodmFsIDwgMCkgewotCQlyZXQgPSB2YWw7CisJcmV0ID0gbXY4OGU2eHh4X3BoeV9yZWFkKGNoaXAsIDB4MCwgMHgxYSwgJnZhbCk7CisJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3I7Ci0JfQogCiAJLyogRGlzYWJsZSB0ZW1wZXJhdHVyZSBzZW5zb3IgKi8KLQlyZXQgPSBtdjg4ZTZ4eHhfbWRpb193cml0ZV9kaXJlY3QoY2hpcCwgMHgwLCAweDFhLCByZXQgJiB+KDEgPDwgNSkpOworCXJldCA9IG12ODhlNnh4eF9waHlfd3JpdGUoY2hpcCwgMHgwLCAweDFhLCB2YWwgJiB+KDEgPDwgNSkpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycm9yOwogCiAJKnRlbXAgPSAoKHZhbCAmIDB4MWYpIC0gNSkgKiA1OwogCiBlcnJvcjoKLQltdjg4ZTZ4eHhfbWRpb193cml0ZV9kaXJlY3QoY2hpcCwgMHgwLCAweDE2LCAweDApOworCW12ODhlNnh4eF9waHlfd3JpdGUoY2hpcCwgMHgwLCAweDE2LCAweDApOwogCW11dGV4X3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgbXY4OGU2M3h4X2dldF90ZW1wKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50ICp0ZW1wKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OwogCWludCBwaHkgPSBtdjg4ZTZ4eHhfNjMyMF9mYW1pbHkoY2hpcCkgPyAzIDogMDsKKwl1MTYgdmFsOwogCWludCByZXQ7CiAKIAkqdGVtcCA9IDA7CiAKLQlyZXQgPSBtdjg4ZTZ4eHhfbWRpb19wYWdlX3JlYWQoZHMsIHBoeSwgNiwgMjcpOworCW11dGV4X2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlyZXQgPSBtdjg4ZTZ4eHhfcGh5X3BhZ2VfcmVhZChjaGlwLCBwaHksIDYsIDI3LCAmdmFsKTsKKwltdXRleF91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCSp0ZW1wID0gKHJldCAmIDB4ZmYpIC0gMjU7CisJKnRlbXAgPSAodmFsICYgMHhmZikgLSAyNTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG12ODhlNnh4eF9nZXRfdGVtcChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCAqdGVtcCkKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKIAogCWlmICghbXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19URU1QKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwpAQCAtMzQwNCw4ICszMDg3LDkgQEAKIAogc3RhdGljIGludCBtdjg4ZTZ4eHhfZ2V0X3RlbXBfbGltaXQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgKnRlbXApCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CiAJaW50IHBoeSA9IG12ODhlNnh4eF82MzIwX2ZhbWlseShjaGlwKSA/IDMgOiAwOworCXUxNiB2YWw7CiAJaW50IHJldDsKIAogCWlmICghbXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19URU1QX0xJTUlUKSkKQEAgLTM0MTMsMzYgKzMwOTcsNDUgQEAKIAogCSp0ZW1wID0gMDsKIAotCXJldCA9IG12ODhlNnh4eF9tZGlvX3BhZ2VfcmVhZChkcywgcGh5LCA2LCAyNik7CisJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOworCXJldCA9IG12ODhlNnh4eF9waHlfcGFnZV9yZWFkKGNoaXAsIHBoeSwgNiwgMjYsICZ2YWwpOworCW11dGV4X3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JKnRlbXAgPSAoKChyZXQgPj4gOCkgJiAweDFmKSAqIDUpIC0gMjU7CisJKnRlbXAgPSAoKCh2YWwgPj4gOCkgJiAweDFmKSAqIDUpIC0gMjU7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBtdjg4ZTZ4eHhfc2V0X3RlbXBfbGltaXQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgdGVtcCkKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKIAlpbnQgcGh5ID0gbXY4OGU2eHh4XzYzMjBfZmFtaWx5KGNoaXApID8gMyA6IDA7Ci0JaW50IHJldDsKKwl1MTYgdmFsOworCWludCBlcnI7CiAKIAlpZiAoIW12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfVEVNUF9MSU1JVCkpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCXJldCA9IG12ODhlNnh4eF9tZGlvX3BhZ2VfcmVhZChkcywgcGh5LCA2LCAyNik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOworCWVyciA9IG12ODhlNnh4eF9waHlfcGFnZV9yZWFkKGNoaXAsIHBoeSwgNiwgMjYsICZ2YWwpOworCWlmIChlcnIpCisJCWdvdG8gdW5sb2NrOwogCXRlbXAgPSBjbGFtcF92YWwoRElWX1JPVU5EX0NMT1NFU1QodGVtcCwgNSkgKyA1LCAwLCAweDFmKTsKLQlyZXR1cm4gbXY4OGU2eHh4X21kaW9fcGFnZV93cml0ZShkcywgcGh5LCA2LCAyNiwKLQkJCQkJIChyZXQgJiAweGUwZmYpIHwgKHRlbXAgPDwgOCkpOworCWVyciA9IG12ODhlNnh4eF9waHlfcGFnZV93cml0ZShjaGlwLCBwaHksIDYsIDI2LAorCQkJCSAgICAgICAodmFsICYgMHhlMGZmKSB8ICh0ZW1wIDw8IDgpKTsKK3VubG9jazoKKwltdXRleF91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X2dldF90ZW1wX2FsYXJtKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgYm9vbCAqYWxhcm0pCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CiAJaW50IHBoeSA9IG12ODhlNnh4eF82MzIwX2ZhbWlseShjaGlwKSA/IDMgOiAwOworCXUxNiB2YWw7CiAJaW50IHJldDsKIAogCWlmICghbXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19URU1QX0xJTUlUKSkKQEAgLTM0NTAsMTEgKzMxNDMsMTMgQEAKIAogCSphbGFybSA9IGZhbHNlOwogCi0JcmV0ID0gbXY4OGU2eHh4X21kaW9fcGFnZV9yZWFkKGRzLCBwaHksIDYsIDI2KTsKKwltdXRleF9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJcmV0ID0gbXY4OGU2eHh4X3BoeV9wYWdlX3JlYWQoY2hpcCwgcGh5LCA2LCAyNiwgJnZhbCk7CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQkqYWxhcm0gPSAhIShyZXQgJiAweDQwKTsKKwkqYWxhcm0gPSAhISh2YWwgJiAweDQwKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzQ2Miw3NCArMzE1NywyMiBAQAogCiBzdGF0aWMgaW50IG12ODhlNnh4eF9nZXRfZWVwcm9tX2xlbihzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CiAKIAlyZXR1cm4gY2hpcC0+ZWVwcm9tX2xlbjsKIH0KIAotc3RhdGljIGludCBtdjg4ZTZ4eHhfZ2V0X2VlcHJvbTE2KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKLQkJCQkgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqZGF0YSkKLXsKLQl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gZWVwcm9tLT5vZmZzZXQ7Ci0JdW5zaWduZWQgaW50IGxlbiA9IGVlcHJvbS0+bGVuOwotCXUxNiB2YWw7Ci0JaW50IGVycjsKLQotCWVlcHJvbS0+bGVuID0gMDsKLQotCWlmIChvZmZzZXQgJiAxKSB7Ci0JCWVyciA9IG12ODhlNnh4eF9nMl9lZXByb21fcmVhZDE2KGNoaXAsIG9mZnNldCA+PiAxLCAmdmFsKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0KLQkJKmRhdGErKyA9ICh2YWwgPj4gOCkgJiAweGZmOwotCi0JCW9mZnNldCsrOwotCQlsZW4tLTsKLQkJZWVwcm9tLT5sZW4rKzsKLQl9Ci0KLQl3aGlsZSAobGVuID49IDIpIHsKLQkJZXJyID0gbXY4OGU2eHh4X2cyX2VlcHJvbV9yZWFkMTYoY2hpcCwgb2Zmc2V0ID4+IDEsICZ2YWwpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQotCQkqZGF0YSsrID0gdmFsICYgMHhmZjsKLQkJKmRhdGErKyA9ICh2YWwgPj4gOCkgJiAweGZmOwotCi0JCW9mZnNldCArPSAyOwotCQlsZW4gLT0gMjsKLQkJZWVwcm9tLT5sZW4gKz0gMjsKLQl9Ci0KLQlpZiAobGVuKSB7Ci0JCWVyciA9IG12ODhlNnh4eF9nMl9lZXByb21fcmVhZDE2KGNoaXAsIG9mZnNldCA+PiAxLCAmdmFsKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0KLQkJKmRhdGErKyA9IHZhbCAmIDB4ZmY7Ci0KLQkJb2Zmc2V0Kys7Ci0JCWxlbi0tOwotCQllZXByb20tPmxlbisrOwotCX0KLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IG12ODhlNnh4eF9nZXRfZWVwcm9tKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywKIAkJCQlzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdTggKmRhdGEpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CiAJaW50IGVycjsKIAorCWlmICghY2hpcC0+aW5mby0+b3BzLT5nZXRfZWVwcm9tKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKIAltdXRleF9sb2NrKCZjaGlwLT5yZWdfbG9jayk7Ci0KLQlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR1NfRUVQUk9NMTYpKQotCQllcnIgPSBtdjg4ZTZ4eHhfZ2V0X2VlcHJvbTE2KGNoaXAsIGVlcHJvbSwgZGF0YSk7Ci0JZWxzZQotCQllcnIgPSAtRU9QTk9UU1VQUDsKLQorCWVyciA9IGNoaXAtPmluZm8tPm9wcy0+Z2V0X2VlcHJvbShjaGlwLCBlZXByb20sIGRhdGEpOwogCW11dGV4X3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwogCiAJaWYgKGVycikKQEAgLTM1NDAsOTMgKzMxODMsMTM5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbXY4OGU2eHh4X3NldF9lZXByb20xNihzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCi0JCQkJICBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdTggKmRhdGEpCi17Ci0JdW5zaWduZWQgaW50IG9mZnNldCA9IGVlcHJvbS0+b2Zmc2V0OwotCXVuc2lnbmVkIGludCBsZW4gPSBlZXByb20tPmxlbjsKLQl1MTYgdmFsOwotCWludCBlcnI7Ci0KLQkvKiBFbnN1cmUgdGhlIFJPIFdyaXRlRW4gYml0IGlzIHNldCAqLwotCWVyciA9IG12ODhlNnh4eF9yZWFkKGNoaXAsIFJFR19HTE9CQUwyLCBHTE9CQUwyX0VFUFJPTV9DTUQsICZ2YWwpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlpZiAoISh2YWwgJiBHTE9CQUwyX0VFUFJPTV9DTURfV1JJVEVfRU4pKQotCQlyZXR1cm4gLUVST0ZTOwotCi0JZWVwcm9tLT5sZW4gPSAwOwotCi0JaWYgKG9mZnNldCAmIDEpIHsKLQkJZXJyID0gbXY4OGU2eHh4X2cyX2VlcHJvbV9yZWFkMTYoY2hpcCwgb2Zmc2V0ID4+IDEsICZ2YWwpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQotCQl2YWwgPSAoKmRhdGErKyA8PCA4KSB8ICh2YWwgJiAweGZmKTsKLQotCQllcnIgPSBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3dyaXRlMTYoY2hpcCwgb2Zmc2V0ID4+IDEsIHZhbCk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCi0JCW9mZnNldCsrOwotCQlsZW4tLTsKLQkJZWVwcm9tLT5sZW4rKzsKLQl9Ci0KLQl3aGlsZSAobGVuID49IDIpIHsKLQkJdmFsID0gKmRhdGErKzsKLQkJdmFsIHw9ICpkYXRhKysgPDwgODsKLQotCQllcnIgPSBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3dyaXRlMTYoY2hpcCwgb2Zmc2V0ID4+IDEsIHZhbCk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCi0JCW9mZnNldCArPSAyOwotCQlsZW4gLT0gMjsKLQkJZWVwcm9tLT5sZW4gKz0gMjsKLQl9Ci0KLQlpZiAobGVuKSB7Ci0JCWVyciA9IG12ODhlNnh4eF9nMl9lZXByb21fcmVhZDE2KGNoaXAsIG9mZnNldCA+PiAxLCAmdmFsKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0KLQkJdmFsID0gKHZhbCAmIDB4ZmYwMCkgfCAqZGF0YSsrOwotCi0JCWVyciA9IG12ODhlNnh4eF9nMl9lZXByb21fd3JpdGUxNihjaGlwLCBvZmZzZXQgPj4gMSwgdmFsKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0KLQkJb2Zmc2V0Kys7Ci0JCWxlbi0tOwotCQllZXByb20tPmxlbisrOwotCX0KLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IG12ODhlNnh4eF9zZXRfZWVwcm9tKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywKIAkJCQlzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdTggKmRhdGEpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CiAJaW50IGVycjsKIAorCWlmICghY2hpcC0+aW5mby0+b3BzLT5zZXRfZWVwcm9tKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKIAlpZiAoZWVwcm9tLT5tYWdpYyAhPSAweGMzZWM0OTUxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW11dGV4X2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQotCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHU19FRVBST00xNikpCi0JCWVyciA9IG12ODhlNnh4eF9zZXRfZWVwcm9tMTYoY2hpcCwgZWVwcm9tLCBkYXRhKTsKLQllbHNlCi0JCWVyciA9IC1FT1BOT1RTVVBQOwotCisJZXJyID0gY2hpcC0+aW5mby0+b3BzLT5zZXRfZWVwcm9tKGNoaXAsIGVlcHJvbSwgZGF0YSk7CiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG12ODhlNnh4eF9vcHMgbXY4OGU2MDg1X29wcyA9IHsKKwkuc2V0X3N3aXRjaF9tYWMgPSBtdjg4ZTZ4eHhfZzFfc2V0X3N3aXRjaF9tYWMsCisJLnBoeV9yZWFkID0gbXY4OGU2eHh4X3BoeV9wcHVfcmVhZCwKKwkucGh5X3dyaXRlID0gbXY4OGU2eHh4X3BoeV9wcHVfd3JpdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG12ODhlNnh4eF9vcHMgbXY4OGU2MDk1X29wcyA9IHsKKwkuc2V0X3N3aXRjaF9tYWMgPSBtdjg4ZTZ4eHhfZzFfc2V0X3N3aXRjaF9tYWMsCisJLnBoeV9yZWFkID0gbXY4OGU2eHh4X3BoeV9wcHVfcmVhZCwKKwkucGh5X3dyaXRlID0gbXY4OGU2eHh4X3BoeV9wcHVfd3JpdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG12ODhlNnh4eF9vcHMgbXY4OGU2MTIzX29wcyA9IHsKKwkuc2V0X3N3aXRjaF9tYWMgPSBtdjg4ZTZ4eHhfZzJfc2V0X3N3aXRjaF9tYWMsCisJLnBoeV9yZWFkID0gbXY4OGU2eHh4X3JlYWQsCisJLnBoeV93cml0ZSA9IG12ODhlNnh4eF93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXY4OGU2eHh4X29wcyBtdjg4ZTYxMzFfb3BzID0geworCS5zZXRfc3dpdGNoX21hYyA9IG12ODhlNnh4eF9nMV9zZXRfc3dpdGNoX21hYywKKwkucGh5X3JlYWQgPSBtdjg4ZTZ4eHhfcGh5X3BwdV9yZWFkLAorCS5waHlfd3JpdGUgPSBtdjg4ZTZ4eHhfcGh5X3BwdV93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXY4OGU2eHh4X29wcyBtdjg4ZTYxNjFfb3BzID0geworCS5zZXRfc3dpdGNoX21hYyA9IG12ODhlNnh4eF9nMl9zZXRfc3dpdGNoX21hYywKKwkucGh5X3JlYWQgPSBtdjg4ZTZ4eHhfcmVhZCwKKwkucGh5X3dyaXRlID0gbXY4OGU2eHh4X3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtdjg4ZTZ4eHhfb3BzIG12ODhlNjE2NV9vcHMgPSB7CisJLnNldF9zd2l0Y2hfbWFjID0gbXY4OGU2eHh4X2cyX3NldF9zd2l0Y2hfbWFjLAorCS5waHlfcmVhZCA9IG12ODhlNnh4eF9yZWFkLAorCS5waHlfd3JpdGUgPSBtdjg4ZTZ4eHhfd3JpdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG12ODhlNnh4eF9vcHMgbXY4OGU2MTcxX29wcyA9IHsKKwkuc2V0X3N3aXRjaF9tYWMgPSBtdjg4ZTZ4eHhfZzJfc2V0X3N3aXRjaF9tYWMsCisJLnBoeV9yZWFkID0gbXY4OGU2eHh4X2cyX3NtaV9waHlfcmVhZCwKKwkucGh5X3dyaXRlID0gbXY4OGU2eHh4X2cyX3NtaV9waHlfd3JpdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG12ODhlNnh4eF9vcHMgbXY4OGU2MTcyX29wcyA9IHsKKwkuZ2V0X2VlcHJvbSA9IG12ODhlNnh4eF9nMl9nZXRfZWVwcm9tMTYsCisJLnNldF9lZXByb20gPSBtdjg4ZTZ4eHhfZzJfc2V0X2VlcHJvbTE2LAorCS5zZXRfc3dpdGNoX21hYyA9IG12ODhlNnh4eF9nMl9zZXRfc3dpdGNoX21hYywKKwkucGh5X3JlYWQgPSBtdjg4ZTZ4eHhfZzJfc21pX3BoeV9yZWFkLAorCS5waHlfd3JpdGUgPSBtdjg4ZTZ4eHhfZzJfc21pX3BoeV93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXY4OGU2eHh4X29wcyBtdjg4ZTYxNzVfb3BzID0geworCS5zZXRfc3dpdGNoX21hYyA9IG12ODhlNnh4eF9nMl9zZXRfc3dpdGNoX21hYywKKwkucGh5X3JlYWQgPSBtdjg4ZTZ4eHhfZzJfc21pX3BoeV9yZWFkLAorCS5waHlfd3JpdGUgPSBtdjg4ZTZ4eHhfZzJfc21pX3BoeV93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXY4OGU2eHh4X29wcyBtdjg4ZTYxNzZfb3BzID0geworCS5nZXRfZWVwcm9tID0gbXY4OGU2eHh4X2cyX2dldF9lZXByb20xNiwKKwkuc2V0X2VlcHJvbSA9IG12ODhlNnh4eF9nMl9zZXRfZWVwcm9tMTYsCisJLnNldF9zd2l0Y2hfbWFjID0gbXY4OGU2eHh4X2cyX3NldF9zd2l0Y2hfbWFjLAorCS5waHlfcmVhZCA9IG12ODhlNnh4eF9nMl9zbWlfcGh5X3JlYWQsCisJLnBoeV93cml0ZSA9IG12ODhlNnh4eF9nMl9zbWlfcGh5X3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtdjg4ZTZ4eHhfb3BzIG12ODhlNjE4NV9vcHMgPSB7CisJLnNldF9zd2l0Y2hfbWFjID0gbXY4OGU2eHh4X2cxX3NldF9zd2l0Y2hfbWFjLAorCS5waHlfcmVhZCA9IG12ODhlNnh4eF9waHlfcHB1X3JlYWQsCisJLnBoeV93cml0ZSA9IG12ODhlNnh4eF9waHlfcHB1X3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtdjg4ZTZ4eHhfb3BzIG12ODhlNjI0MF9vcHMgPSB7CisJLmdldF9lZXByb20gPSBtdjg4ZTZ4eHhfZzJfZ2V0X2VlcHJvbTE2LAorCS5zZXRfZWVwcm9tID0gbXY4OGU2eHh4X2cyX3NldF9lZXByb20xNiwKKwkuc2V0X3N3aXRjaF9tYWMgPSBtdjg4ZTZ4eHhfZzJfc2V0X3N3aXRjaF9tYWMsCisJLnBoeV9yZWFkID0gbXY4OGU2eHh4X2cyX3NtaV9waHlfcmVhZCwKKwkucGh5X3dyaXRlID0gbXY4OGU2eHh4X2cyX3NtaV9waHlfd3JpdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG12ODhlNnh4eF9vcHMgbXY4OGU2MzIwX29wcyA9IHsKKwkuZ2V0X2VlcHJvbSA9IG12ODhlNnh4eF9nMl9nZXRfZWVwcm9tMTYsCisJLnNldF9lZXByb20gPSBtdjg4ZTZ4eHhfZzJfc2V0X2VlcHJvbTE2LAorCS5zZXRfc3dpdGNoX21hYyA9IG12ODhlNnh4eF9nMl9zZXRfc3dpdGNoX21hYywKKwkucGh5X3JlYWQgPSBtdjg4ZTZ4eHhfZzJfc21pX3BoeV9yZWFkLAorCS5waHlfd3JpdGUgPSBtdjg4ZTZ4eHhfZzJfc21pX3BoeV93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXY4OGU2eHh4X29wcyBtdjg4ZTYzMjFfb3BzID0geworCS5nZXRfZWVwcm9tID0gbXY4OGU2eHh4X2cyX2dldF9lZXByb20xNiwKKwkuc2V0X2VlcHJvbSA9IG12ODhlNnh4eF9nMl9zZXRfZWVwcm9tMTYsCisJLnNldF9zd2l0Y2hfbWFjID0gbXY4OGU2eHh4X2cyX3NldF9zd2l0Y2hfbWFjLAorCS5waHlfcmVhZCA9IG12ODhlNnh4eF9nMl9zbWlfcGh5X3JlYWQsCisJLnBoeV93cml0ZSA9IG12ODhlNnh4eF9nMl9zbWlfcGh5X3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtdjg4ZTZ4eHhfb3BzIG12ODhlNjM1MF9vcHMgPSB7CisJLnNldF9zd2l0Y2hfbWFjID0gbXY4OGU2eHh4X2cyX3NldF9zd2l0Y2hfbWFjLAorCS5waHlfcmVhZCA9IG12ODhlNnh4eF9nMl9zbWlfcGh5X3JlYWQsCisJLnBoeV93cml0ZSA9IG12ODhlNnh4eF9nMl9zbWlfcGh5X3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtdjg4ZTZ4eHhfb3BzIG12ODhlNjM1MV9vcHMgPSB7CisJLnNldF9zd2l0Y2hfbWFjID0gbXY4OGU2eHh4X2cyX3NldF9zd2l0Y2hfbWFjLAorCS5waHlfcmVhZCA9IG12ODhlNnh4eF9nMl9zbWlfcGh5X3JlYWQsCisJLnBoeV93cml0ZSA9IG12ODhlNnh4eF9nMl9zbWlfcGh5X3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtdjg4ZTZ4eHhfb3BzIG12ODhlNjM1Ml9vcHMgPSB7CisJLmdldF9lZXByb20gPSBtdjg4ZTZ4eHhfZzJfZ2V0X2VlcHJvbTE2LAorCS5zZXRfZWVwcm9tID0gbXY4OGU2eHh4X2cyX3NldF9lZXByb20xNiwKKwkuc2V0X3N3aXRjaF9tYWMgPSBtdjg4ZTZ4eHhfZzJfc2V0X3N3aXRjaF9tYWMsCisJLnBoeV9yZWFkID0gbXY4OGU2eHh4X2cyX3NtaV9waHlfcmVhZCwKKwkucGh5X3dyaXRlID0gbXY4OGU2eHh4X2cyX3NtaV9waHlfd3JpdGUsCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IG12ODhlNnh4eF9pbmZvIG12ODhlNnh4eF90YWJsZVtdID0gewogCVtNVjg4RTYwODVdID0gewogCQkucHJvZF9udW0gPSBQT1JUX1NXSVRDSF9JRF9QUk9EX05VTV82MDg1LApAQCAtMzYzNSw4ICszMzI0LDEwIEBACiAJCS5udW1fZGF0YWJhc2VzID0gNDA5NiwKIAkJLm51bV9wb3J0cyA9IDEwLAogCQkucG9ydF9iYXNlX2FkZHIgPSAweDEwLAorCQkuZ2xvYmFsMV9hZGRyID0gMHgxYiwKIAkJLmFnZV90aW1lX2NvZWZmID0gMTUwMDAsCiAJCS5mbGFncyA9IE1WODhFNlhYWF9GTEFHU19GQU1JTFlfNjA5NywKKwkJLm9wcyA9ICZtdjg4ZTYwODVfb3BzLAogCX0sCiAKIAlbTVY4OEU2MDk1XSA9IHsKQEAgLTM2NDYsOCArMzMzNywxMCBAQAogCQkubnVtX2RhdGFiYXNlcyA9IDI1NiwKIAkJLm51bV9wb3J0cyA9IDExLAogCQkucG9ydF9iYXNlX2FkZHIgPSAweDEwLAorCQkuZ2xvYmFsMV9hZGRyID0gMHgxYiwKIAkJLmFnZV90aW1lX2NvZWZmID0gMTUwMDAsCiAJCS5mbGFncyA9IE1WODhFNlhYWF9GTEFHU19GQU1JTFlfNjA5NSwKKwkJLm9wcyA9ICZtdjg4ZTYwOTVfb3BzLAogCX0sCiAKIAlbTVY4OEU2MTIzXSA9IHsKQEAgLTM2NTcsOCArMzM1MCwxMCBAQAogCQkubnVtX2RhdGFiYXNlcyA9IDQwOTYsCiAJCS5udW1fcG9ydHMgPSAzLAogCQkucG9ydF9iYXNlX2FkZHIgPSAweDEwLAorCQkuZ2xvYmFsMV9hZGRyID0gMHgxYiwKIAkJLmFnZV90aW1lX2NvZWZmID0gMTUwMDAsCiAJCS5mbGFncyA9IE1WODhFNlhYWF9GTEFHU19GQU1JTFlfNjE2NSwKKwkJLm9wcyA9ICZtdjg4ZTYxMjNfb3BzLAogCX0sCiAKIAlbTVY4OEU2MTMxXSA9IHsKQEAgLTM2NjgsOCArMzM2MywxMCBAQAogCQkubnVtX2RhdGFiYXNlcyA9IDI1NiwKIAkJLm51bV9wb3J0cyA9IDgsCiAJCS5wb3J0X2Jhc2VfYWRkciA9IDB4MTAsCisJCS5nbG9iYWwxX2FkZHIgPSAweDFiLAogCQkuYWdlX3RpbWVfY29lZmYgPSAxNTAwMCwKIAkJLmZsYWdzID0gTVY4OEU2WFhYX0ZMQUdTX0ZBTUlMWV82MTg1LAorCQkub3BzID0gJm12ODhlNjEzMV9vcHMsCiAJfSwKIAogCVtNVjg4RTYxNjFdID0gewpAQCAtMzY3OSw4ICszMzc2LDEwIEBACiAJCS5udW1fZGF0YWJhc2VzID0gNDA5NiwKIAkJLm51bV9wb3J0cyA9IDYsCiAJCS5wb3J0X2Jhc2VfYWRkciA9IDB4MTAsCisJCS5nbG9iYWwxX2FkZHIgPSAweDFiLAogCQkuYWdlX3RpbWVfY29lZmYgPSAxNTAwMCwKIAkJLmZsYWdzID0gTVY4OEU2WFhYX0ZMQUdTX0ZBTUlMWV82MTY1LAorCQkub3BzID0gJm12ODhlNjE2MV9vcHMsCiAJfSwKIAogCVtNVjg4RTYxNjVdID0gewpAQCAtMzY5MCw4ICszMzg5LDEwIEBACiAJCS5udW1fZGF0YWJhc2VzID0gNDA5NiwKIAkJLm51bV9wb3J0cyA9IDYsCiAJCS5wb3J0X2Jhc2VfYWRkciA9IDB4MTAsCisJCS5nbG9iYWwxX2FkZHIgPSAweDFiLAogCQkuYWdlX3RpbWVfY29lZmYgPSAxNTAwMCwKIAkJLmZsYWdzID0gTVY4OEU2WFhYX0ZMQUdTX0ZBTUlMWV82MTY1LAorCQkub3BzID0gJm12ODhlNjE2NV9vcHMsCiAJfSwKIAogCVtNVjg4RTYxNzFdID0gewpAQCAtMzcwMSw4ICszNDAyLDEwIEBACiAJCS5udW1fZGF0YWJhc2VzID0gNDA5NiwKIAkJLm51bV9wb3J0cyA9IDcsCiAJCS5wb3J0X2Jhc2VfYWRkciA9IDB4MTAsCisJCS5nbG9iYWwxX2FkZHIgPSAweDFiLAogCQkuYWdlX3RpbWVfY29lZmYgPSAxNTAwMCwKIAkJLmZsYWdzID0gTVY4OEU2WFhYX0ZMQUdTX0ZBTUlMWV82MzUxLAorCQkub3BzID0gJm12ODhlNjE3MV9vcHMsCiAJfSwKIAogCVtNVjg4RTYxNzJdID0gewpAQCAtMzcxMiw4ICszNDE1LDEwIEBACiAJCS5udW1fZGF0YWJhc2VzID0gNDA5NiwKIAkJLm51bV9wb3J0cyA9IDcsCiAJCS5wb3J0X2Jhc2VfYWRkciA9IDB4MTAsCisJCS5nbG9iYWwxX2FkZHIgPSAweDFiLAogCQkuYWdlX3RpbWVfY29lZmYgPSAxNTAwMCwKIAkJLmZsYWdzID0gTVY4OEU2WFhYX0ZMQUdTX0ZBTUlMWV82MzUyLAorCQkub3BzID0gJm12ODhlNjE3Ml9vcHMsCiAJfSwKIAogCVtNVjg4RTYxNzVdID0gewpAQCAtMzcyMyw4ICszNDI4LDEwIEBACiAJCS5udW1fZGF0YWJhc2VzID0gNDA5NiwKIAkJLm51bV9wb3J0cyA9IDcsCiAJCS5wb3J0X2Jhc2VfYWRkciA9IDB4MTAsCisJCS5nbG9iYWwxX2FkZHIgPSAweDFiLAogCQkuYWdlX3RpbWVfY29lZmYgPSAxNTAwMCwKIAkJLmZsYWdzID0gTVY4OEU2WFhYX0ZMQUdTX0ZBTUlMWV82MzUxLAorCQkub3BzID0gJm12ODhlNjE3NV9vcHMsCiAJfSwKIAogCVtNVjg4RTYxNzZdID0gewpAQCAtMzczNCw4ICszNDQxLDEwIEBACiAJCS5udW1fZGF0YWJhc2VzID0gNDA5NiwKIAkJLm51bV9wb3J0cyA9IDcsCiAJCS5wb3J0X2Jhc2VfYWRkciA9IDB4MTAsCisJCS5nbG9iYWwxX2FkZHIgPSAweDFiLAogCQkuYWdlX3RpbWVfY29lZmYgPSAxNTAwMCwKIAkJLmZsYWdzID0gTVY4OEU2WFhYX0ZMQUdTX0ZBTUlMWV82MzUyLAorCQkub3BzID0gJm12ODhlNjE3Nl9vcHMsCiAJfSwKIAogCVtNVjg4RTYxODVdID0gewpAQCAtMzc0NSw4ICszNDU0LDEwIEBACiAJCS5udW1fZGF0YWJhc2VzID0gMjU2LAogCQkubnVtX3BvcnRzID0gMTAsCiAJCS5wb3J0X2Jhc2VfYWRkciA9IDB4MTAsCisJCS5nbG9iYWwxX2FkZHIgPSAweDFiLAogCQkuYWdlX3RpbWVfY29lZmYgPSAxNTAwMCwKIAkJLmZsYWdzID0gTVY4OEU2WFhYX0ZMQUdTX0ZBTUlMWV82MTg1LAorCQkub3BzID0gJm12ODhlNjE4NV9vcHMsCiAJfSwKIAogCVtNVjg4RTYyNDBdID0gewpAQCAtMzc1Niw4ICszNDY3LDEwIEBACiAJCS5udW1fZGF0YWJhc2VzID0gNDA5NiwKIAkJLm51bV9wb3J0cyA9IDcsCiAJCS5wb3J0X2Jhc2VfYWRkciA9IDB4MTAsCisJCS5nbG9iYWwxX2FkZHIgPSAweDFiLAogCQkuYWdlX3RpbWVfY29lZmYgPSAxNTAwMCwKIAkJLmZsYWdzID0gTVY4OEU2WFhYX0ZMQUdTX0ZBTUlMWV82MzUyLAorCQkub3BzID0gJm12ODhlNjI0MF9vcHMsCiAJfSwKIAogCVtNVjg4RTYzMjBdID0gewpAQCAtMzc2Nyw4ICszNDgwLDEwIEBACiAJCS5udW1fZGF0YWJhc2VzID0gNDA5NiwKIAkJLm51bV9wb3J0cyA9IDcsCiAJCS5wb3J0X2Jhc2VfYWRkciA9IDB4MTAsCisJCS5nbG9iYWwxX2FkZHIgPSAweDFiLAogCQkuYWdlX3RpbWVfY29lZmYgPSAxNTAwMCwKIAkJLmZsYWdzID0gTVY4OEU2WFhYX0ZMQUdTX0ZBTUlMWV82MzIwLAorCQkub3BzID0gJm12ODhlNjMyMF9vcHMsCiAJfSwKIAogCVtNVjg4RTYzMjFdID0gewpAQCAtMzc3OCw4ICszNDkzLDEwIEBACiAJCS5udW1fZGF0YWJhc2VzID0gNDA5NiwKIAkJLm51bV9wb3J0cyA9IDcsCiAJCS5wb3J0X2Jhc2VfYWRkciA9IDB4MTAsCisJCS5nbG9iYWwxX2FkZHIgPSAweDFiLAogCQkuYWdlX3RpbWVfY29lZmYgPSAxNTAwMCwKIAkJLmZsYWdzID0gTVY4OEU2WFhYX0ZMQUdTX0ZBTUlMWV82MzIwLAorCQkub3BzID0gJm12ODhlNjMyMV9vcHMsCiAJfSwKIAogCVtNVjg4RTYzNTBdID0gewpAQCAtMzc4OSw4ICszNTA2LDEwIEBACiAJCS5udW1fZGF0YWJhc2VzID0gNDA5NiwKIAkJLm51bV9wb3J0cyA9IDcsCiAJCS5wb3J0X2Jhc2VfYWRkciA9IDB4MTAsCisJCS5nbG9iYWwxX2FkZHIgPSAweDFiLAogCQkuYWdlX3RpbWVfY29lZmYgPSAxNTAwMCwKIAkJLmZsYWdzID0gTVY4OEU2WFhYX0ZMQUdTX0ZBTUlMWV82MzUxLAorCQkub3BzID0gJm12ODhlNjM1MF9vcHMsCiAJfSwKIAogCVtNVjg4RTYzNTFdID0gewpAQCAtMzgwMCw4ICszNTE5LDEwIEBACiAJCS5udW1fZGF0YWJhc2VzID0gNDA5NiwKIAkJLm51bV9wb3J0cyA9IDcsCiAJCS5wb3J0X2Jhc2VfYWRkciA9IDB4MTAsCisJCS5nbG9iYWwxX2FkZHIgPSAweDFiLAogCQkuYWdlX3RpbWVfY29lZmYgPSAxNTAwMCwKIAkJLmZsYWdzID0gTVY4OEU2WFhYX0ZMQUdTX0ZBTUlMWV82MzUxLAorCQkub3BzID0gJm12ODhlNjM1MV9vcHMsCiAJfSwKIAogCVtNVjg4RTYzNTJdID0gewpAQCAtMzgxMSw4ICszNTMyLDEwIEBACiAJCS5udW1fZGF0YWJhc2VzID0gNDA5NiwKIAkJLm51bV9wb3J0cyA9IDcsCiAJCS5wb3J0X2Jhc2VfYWRkciA9IDB4MTAsCisJCS5nbG9iYWwxX2FkZHIgPSAweDFiLAogCQkuYWdlX3RpbWVfY29lZmYgPSAxNTAwMCwKIAkJLmZsYWdzID0gTVY4OEU2WFhYX0ZMQUdTX0ZBTUlMWV82MzUyLAorCQkub3BzID0gJm12ODhlNjM1Ml9vcHMsCiAJfSwKIH07CiAKQEAgLTM4NTAsNiArMzU3MywxMCBAQAogCS8qIFVwZGF0ZSB0aGUgY29tcGF0aWJsZSBpbmZvIHdpdGggdGhlIHByb2JlZCBvbmUgKi8KIAljaGlwLT5pbmZvID0gaW5mbzsKIAorCWVyciA9IG12ODhlNnh4eF9nMl9yZXF1aXJlKGNoaXApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKIAlkZXZfaW5mbyhjaGlwLT5kZXYsICJzd2l0Y2ggMHgleCBkZXRlY3RlZDogJXMsIHJldmlzaW9uICV1XG4iLAogCQkgY2hpcC0+aW5mby0+cHJvZF9udW0sIGNoaXAtPmluZm8tPm5hbWUsIHJldik7CiAKQEAgLTM4NzEsNiArMzU5OCwxOCBAQAogCXJldHVybiBjaGlwOwogfQogCitzdGF0aWMgdm9pZCBtdjg4ZTZ4eHhfcGh5X2luaXQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQoreworCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX1BQVSkpCisJCW12ODhlNnh4eF9wcHVfc3RhdGVfaW5pdChjaGlwKTsKK30KKworc3RhdGljIHZvaWQgbXY4OGU2eHh4X3BoeV9kZXN0cm95KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKK3sKKwlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19QUFUpKQorCQltdjg4ZTZ4eHhfcHB1X3N0YXRlX2Rlc3Ryb3koY2hpcCk7Cit9CisKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X3NtaV9pbml0KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKIAkJCSAgICAgIHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBzd19hZGRyKQogewpAQCAtMzg4MCw3ICszNjE5LDcgQEAKIAogCWlmIChzd19hZGRyID09IDApCiAJCWNoaXAtPnNtaV9vcHMgPSAmbXY4OGU2eHh4X3NtaV9zaW5nbGVfY2hpcF9vcHM7Ci0JZWxzZSBpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19NVUxUSV9DSElQKSkKKwllbHNlIGlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHU19NVUxUSV9DSElQKSkKIAkJY2hpcC0+c21pX29wcyA9ICZtdjg4ZTZ4eHhfc21pX211bHRpX2NoaXBfb3BzOwogCWVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zODkxLDYgKzM2MzAsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGVudW0gZHNhX3RhZ19wcm90b2NvbCBtdjg4ZTZ4eHhfZ2V0X3RhZ19wcm90b2NvbChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCit7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CisKKwlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19FRFNBKSkKKwkJcmV0dXJuIERTQV9UQUdfUFJPVE9fRURTQTsKKworCXJldHVybiBEU0FfVEFHX1BST1RPX0RTQTsKK30KKwogc3RhdGljIGNvbnN0IGNoYXIgKm12ODhlNnh4eF9kcnZfcHJvYmUoc3RydWN0IGRldmljZSAqZHNhX2RldiwKIAkJCQkgICAgICAgc3RydWN0IGRldmljZSAqaG9zdF9kZXYsIGludCBzd19hZGRyLAogCQkJCSAgICAgICB2b2lkICoqcHJpdikKQEAgLTM5MTgsNiArMzY2Nyw4IEBACiAJaWYgKGVycikKIAkJZ290byBmcmVlOwogCisJbXY4OGU2eHh4X3BoeV9pbml0KGNoaXApOworCiAJZXJyID0gbXY4OGU2eHh4X21kaW9fcmVnaXN0ZXIoY2hpcCwgTlVMTCk7CiAJaWYgKGVycikKIAkJZ290byBmcmVlOwpAQCAtMzkzMSw5ICszNjgyLDYxIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgbXY4OGU2eHh4X3N3aXRjaF9kcml2ZXIgPSB7Ci0JLnRhZ19wcm90b2NvbAkJPSBEU0FfVEFHX1BST1RPX0VEU0EsCitzdGF0aWMgaW50IG12ODhlNnh4eF9wb3J0X21kYl9wcmVwYXJlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9tZGIgKm1kYiwKKwkJCQkgICAgICBzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zICp0cmFucykKK3sKKwkvKiBXZSBkb24ndCBuZWVkIGFueSBkeW5hbWljIHJlc291cmNlIGZyb20gdGhlIGtlcm5lbCAoeWV0KSwKKwkgKiBzbyBza2lwIHRoZSBwcmVwYXJlIHBoYXNlLgorCSAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG12ODhlNnh4eF9wb3J0X21kYl9hZGQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJCQkgICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X21kYiAqbWRiLAorCQkJCSAgIHN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zKQoreworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OworCisJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOworCWlmIChtdjg4ZTZ4eHhfcG9ydF9kYl9sb2FkX3B1cmdlKGNoaXAsIHBvcnQsIG1kYi0+YWRkciwgbWRiLT52aWQsCisJCQkJCSBHTE9CQUxfQVRVX0RBVEFfU1RBVEVfTUNfU1RBVElDKSkKKwkJbmV0ZGV2X2Vycihkcy0+cG9ydHNbcG9ydF0ubmV0ZGV2LCAiZmFpbGVkIHRvIGxvYWQgbXVsdGljYXN0IE1BQyBhZGRyZXNzXG4iKTsKKwltdXRleF91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKK30KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfcG9ydF9tZGJfZGVsKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJCQkJICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X21kYiAqbWRiKQoreworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OworCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJZXJyID0gbXY4OGU2eHh4X3BvcnRfZGJfbG9hZF9wdXJnZShjaGlwLCBwb3J0LCBtZGItPmFkZHIsIG1kYi0+dmlkLAorCQkJCQkgICBHTE9CQUxfQVRVX0RBVEFfU1RBVEVfVU5VU0VEKTsKKwltdXRleF91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X3BvcnRfbWRiX2R1bXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJCQkgICBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X21kYiAqbWRiLAorCQkJCSAgIGludCAoKmNiKShzdHJ1Y3Qgc3dpdGNoZGV2X29iaiAqb2JqKSkKK3sKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKKwlpbnQgZXJyOworCisJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOworCWVyciA9IG12ODhlNnh4eF9wb3J0X2RiX2R1bXAoY2hpcCwgcG9ydCwgJm1kYi0+b2JqLCBjYik7CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IGRzYV9zd2l0Y2hfb3BzIG12ODhlNnh4eF9zd2l0Y2hfb3BzID0gewogCS5wcm9iZQkJCT0gbXY4OGU2eHh4X2Rydl9wcm9iZSwKKwkuZ2V0X3RhZ19wcm90b2NvbAk9IG12ODhlNnh4eF9nZXRfdGFnX3Byb3RvY29sLAogCS5zZXR1cAkJCT0gbXY4OGU2eHh4X3NldHVwLAogCS5zZXRfYWRkcgkJPSBtdjg4ZTZ4eHhfc2V0X2FkZHIsCiAJLmFkanVzdF9saW5rCQk9IG12ODhlNnh4eF9hZGp1c3RfbGluaywKQEAgLTM5NTcsNiArMzc2MCw3IEBACiAJLnBvcnRfYnJpZGdlX2pvaW4JPSBtdjg4ZTZ4eHhfcG9ydF9icmlkZ2Vfam9pbiwKIAkucG9ydF9icmlkZ2VfbGVhdmUJPSBtdjg4ZTZ4eHhfcG9ydF9icmlkZ2VfbGVhdmUsCiAJLnBvcnRfc3RwX3N0YXRlX3NldAk9IG12ODhlNnh4eF9wb3J0X3N0cF9zdGF0ZV9zZXQsCisJLnBvcnRfZmFzdF9hZ2UJCT0gbXY4OGU2eHh4X3BvcnRfZmFzdF9hZ2UsCiAJLnBvcnRfdmxhbl9maWx0ZXJpbmcJPSBtdjg4ZTZ4eHhfcG9ydF92bGFuX2ZpbHRlcmluZywKIAkucG9ydF92bGFuX3ByZXBhcmUJPSBtdjg4ZTZ4eHhfcG9ydF92bGFuX3ByZXBhcmUsCiAJLnBvcnRfdmxhbl9hZGQJCT0gbXY4OGU2eHh4X3BvcnRfdmxhbl9hZGQsCkBAIC0zOTY2LDYgKzM3NzAsMTAgQEAKIAkucG9ydF9mZGJfYWRkICAgICAgICAgICA9IG12ODhlNnh4eF9wb3J0X2ZkYl9hZGQsCiAJLnBvcnRfZmRiX2RlbCAgICAgICAgICAgPSBtdjg4ZTZ4eHhfcG9ydF9mZGJfZGVsLAogCS5wb3J0X2ZkYl9kdW1wICAgICAgICAgID0gbXY4OGU2eHh4X3BvcnRfZmRiX2R1bXAsCisJLnBvcnRfbWRiX3ByZXBhcmUgICAgICAgPSBtdjg4ZTZ4eHhfcG9ydF9tZGJfcHJlcGFyZSwKKwkucG9ydF9tZGJfYWRkICAgICAgICAgICA9IG12ODhlNnh4eF9wb3J0X21kYl9hZGQsCisJLnBvcnRfbWRiX2RlbCAgICAgICAgICAgPSBtdjg4ZTZ4eHhfcG9ydF9tZGJfZGVsLAorCS5wb3J0X21kYl9kdW1wICAgICAgICAgID0gbXY4OGU2eHh4X3BvcnRfbWRiX2R1bXAsCiB9OwogCiBzdGF0aWMgaW50IG12ODhlNnh4eF9yZWdpc3Rlcl9zd2l0Y2goc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLApAQCAtMzk4MCw3ICszNzg4LDcgQEAKIAogCWRzLT5kZXYgPSBkZXY7CiAJZHMtPnByaXYgPSBjaGlwOwotCWRzLT5kcnYgPSAmbXY4OGU2eHh4X3N3aXRjaF9kcml2ZXI7CisJZHMtPm9wcyA9ICZtdjg4ZTZ4eHhfc3dpdGNoX29wczsKIAogCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGRzKTsKIApAQCAtNDAxOSwxMSArMzgyNywxMyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKKwltdjg4ZTZ4eHhfcGh5X2luaXQoY2hpcCk7CisKIAljaGlwLT5yZXNldCA9IGRldm1fZ3Bpb2RfZ2V0X29wdGlvbmFsKGRldiwgInJlc2V0IiwgR1BJT0RfQVNJUyk7CiAJaWYgKElTX0VSUihjaGlwLT5yZXNldCkpCiAJCXJldHVybiBQVFJfRVJSKGNoaXAtPnJlc2V0KTsKIAotCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHU19FRVBST00xNikgJiYKKwlpZiAoY2hpcC0+aW5mby0+b3BzLT5nZXRfZWVwcm9tICYmCiAJICAgICFvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImVlcHJvbS1sZW5ndGgiLCAmZWVwcm9tX2xlbikpCiAJCWNoaXAtPmVlcHJvbV9sZW4gPSBlZXByb21fbGVuOwogCkBAIC00MDQzLDggKzM4NTMsOSBAQAogc3RhdGljIHZvaWQgbXY4OGU2eHh4X3JlbW92ZShzdHJ1Y3QgbWRpb19kZXZpY2UgKm1kaW9kZXYpCiB7CiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gZGV2X2dldF9kcnZkYXRhKCZtZGlvZGV2LT5kZXYpOwotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OwogCisJbXY4OGU2eHh4X3BoeV9kZXN0cm95KGNoaXApOwogCW12ODhlNnh4eF91bnJlZ2lzdGVyX3N3aXRjaChjaGlwKTsKIAltdjg4ZTZ4eHhfbWRpb191bnJlZ2lzdGVyKGNoaXApOwogfQpAQCAtNDA3MCw3ICszODgxLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgbXY4OGU2eHh4X2luaXQodm9pZCkKIHsKLQlyZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKCZtdjg4ZTZ4eHhfc3dpdGNoX2RyaXZlcik7CisJcmVnaXN0ZXJfc3dpdGNoX2RyaXZlcigmbXY4OGU2eHh4X3N3aXRjaF9vcHMpOwogCXJldHVybiBtZGlvX2RyaXZlcl9yZWdpc3RlcigmbXY4OGU2eHh4X2RyaXZlcik7CiB9CiBtb2R1bGVfaW5pdChtdjg4ZTZ4eHhfaW5pdCk7CkBAIC00MDc4LDcgKzM4ODksNyBAQAogc3RhdGljIHZvaWQgX19leGl0IG12ODhlNnh4eF9jbGVhbnVwKHZvaWQpCiB7CiAJbWRpb19kcml2ZXJfdW5yZWdpc3RlcigmbXY4OGU2eHh4X2RyaXZlcik7Ci0JdW5yZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKCZtdjg4ZTZ4eHhfc3dpdGNoX2RyaXZlcik7CisJdW5yZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKCZtdjg4ZTZ4eHhfc3dpdGNoX29wcyk7CiB9CiBtb2R1bGVfZXhpdChtdjg4ZTZ4eHhfY2xlYW51cCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvZ2xvYmFsMS5jIGIvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC9nbG9iYWwxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM1ODcyMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvZ2xvYmFsMS5jCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBNYXJ2ZWxsIDg4RTZ4eHggU3dpdGNoIEdsb2JhbCAoMSkgUmVnaXN0ZXJzIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTWFydmVsbCBTZW1pY29uZHVjdG9yCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFZpdmllbiBEaWRlbG90IDx2aXZpZW4uZGlkZWxvdEBzYXZvaXJmYWlyZWxpbnV4LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlICJtdjg4ZTZ4eHguaCIKKyNpbmNsdWRlICJnbG9iYWwxLmgiCisKK2ludCBtdjg4ZTZ4eHhfZzFfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCByZWcsIHUxNiAqdmFsKQoreworCWludCBhZGRyID0gY2hpcC0+aW5mby0+Z2xvYmFsMV9hZGRyOworCisJcmV0dXJuIG12ODhlNnh4eF9yZWFkKGNoaXAsIGFkZHIsIHJlZywgdmFsKTsKK30KKworaW50IG12ODhlNnh4eF9nMV93cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCByZWcsIHUxNiB2YWwpCit7CisJaW50IGFkZHIgPSBjaGlwLT5pbmZvLT5nbG9iYWwxX2FkZHI7CisKKwlyZXR1cm4gbXY4OGU2eHh4X3dyaXRlKGNoaXAsIGFkZHIsIHJlZywgdmFsKTsKK30KKworaW50IG12ODhlNnh4eF9nMV93YWl0KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHJlZywgdTE2IG1hc2spCit7CisJcmV0dXJuIG12ODhlNnh4eF93YWl0KGNoaXAsIGNoaXAtPmluZm8tPmdsb2JhbDFfYWRkciwgcmVnLCBtYXNrKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvZ2xvYmFsMS5oIGIvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC9nbG9iYWwxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIyOTFlNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvZ2xvYmFsMS5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBNYXJ2ZWxsIDg4RTZ4eHggU3dpdGNoIEdsb2JhbCAoMSkgUmVnaXN0ZXJzIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTWFydmVsbCBTZW1pY29uZHVjdG9yCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFZpdmllbiBEaWRlbG90IDx2aXZpZW4uZGlkZWxvdEBzYXZvaXJmYWlyZWxpbnV4LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX01WODhFNlhYWF9HTE9CQUwxX0gKKyNkZWZpbmUgX01WODhFNlhYWF9HTE9CQUwxX0gKKworI2luY2x1ZGUgIm12ODhlNnh4eC5oIgorCitpbnQgbXY4OGU2eHh4X2cxX3JlYWQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcmVnLCB1MTYgKnZhbCk7CitpbnQgbXY4OGU2eHh4X2cxX3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHJlZywgdTE2IHZhbCk7CitpbnQgbXY4OGU2eHh4X2cxX3dhaXQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcmVnLCB1MTYgbWFzayk7CisKKyNlbmRpZiAvKiBfTVY4OEU2WFhYX0dMT0JBTDFfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC9nbG9iYWwyLmMgYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L2dsb2JhbDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjY4NmU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC9nbG9iYWwyLmMKQEAgLTAsMCArMSw0OTEgQEAKKy8qCisgKiBNYXJ2ZWxsIDg4RTZ4eHggU3dpdGNoIEdsb2JhbCAyIFJlZ2lzdGVycyBzdXBwb3J0IChkZXZpY2UgYWRkcmVzcyAweDFDKQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYXJ2ZWxsIFNlbWljb25kdWN0b3IKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgVml2aWVuIERpZGVsb3QgPHZpdmllbi5kaWRlbG90QHNhdm9pcmZhaXJlbGludXguY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgIm12ODhlNnh4eC5oIgorI2luY2x1ZGUgImdsb2JhbDIuaCIKKworI2RlZmluZSBBRERSX0dMT0JBTDIJMHgxYworCitzdGF0aWMgaW50IG12ODhlNnh4eF9nMl9yZWFkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHJlZywgdTE2ICp2YWwpCit7CisJcmV0dXJuIG12ODhlNnh4eF9yZWFkKGNoaXAsIEFERFJfR0xPQkFMMiwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW50IG12ODhlNnh4eF9nMl93cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCByZWcsIHUxNiB2YWwpCit7CisJcmV0dXJuIG12ODhlNnh4eF93cml0ZShjaGlwLCBBRERSX0dMT0JBTDIsIHJlZywgdmFsKTsKK30KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfdXBkYXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHJlZywgdTE2IHVwZGF0ZSkKK3sKKwlyZXR1cm4gbXY4OGU2eHh4X3VwZGF0ZShjaGlwLCBBRERSX0dMT0JBTDIsIHJlZywgdXBkYXRlKTsKK30KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfd2FpdChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCByZWcsIHUxNiBtYXNrKQoreworCXJldHVybiBtdjg4ZTZ4eHhfd2FpdChjaGlwLCBBRERSX0dMT0JBTDIsIHJlZywgbWFzayk7Cit9CisKKy8qIE9mZnNldCAweDA2OiBEZXZpY2UgTWFwcGluZyBUYWJsZSByZWdpc3RlciAqLworCitzdGF0aWMgaW50IG12ODhlNnh4eF9nMl9kZXZpY2VfbWFwcGluZ193cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCisJCQkJCSAgICAgaW50IHRhcmdldCwgaW50IHBvcnQpCit7CisJdTE2IHZhbCA9ICh0YXJnZXQgPDwgOCkgfCAocG9ydCAmIDB4Zik7CisKKwlyZXR1cm4gbXY4OGU2eHh4X2cyX3VwZGF0ZShjaGlwLCBHTE9CQUwyX0RFVklDRV9NQVBQSU5HLCB2YWwpOworfQorCitzdGF0aWMgaW50IG12ODhlNnh4eF9nMl9zZXRfZGV2aWNlX21hcHBpbmcoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQoreworCWludCB0YXJnZXQsIHBvcnQ7CisJaW50IGVycjsKKworCS8qIEluaXRpYWxpemUgdGhlIHJvdXRpbmcgcG9ydCB0byB0aGUgMzIgcG9zc2libGUgdGFyZ2V0IGRldmljZXMgKi8KKwlmb3IgKHRhcmdldCA9IDA7IHRhcmdldCA8IDMyOyArK3RhcmdldCkgeworCQlwb3J0ID0gMHhmOworCisJCWlmICh0YXJnZXQgPCBEU0FfTUFYX1NXSVRDSEVTKSB7CisJCQlwb3J0ID0gY2hpcC0+ZHMtPnJ0YWJsZVt0YXJnZXRdOworCQkJaWYgKHBvcnQgPT0gRFNBX1JUQUJMRV9OT05FKQorCQkJCXBvcnQgPSAweGY7CisJCX0KKworCQllcnIgPSBtdjg4ZTZ4eHhfZzJfZGV2aWNlX21hcHBpbmdfd3JpdGUoY2hpcCwgdGFyZ2V0LCBwb3J0KTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qIE9mZnNldCAweDA3OiBUcnVuayBNYXNrIFRhYmxlIHJlZ2lzdGVyICovCisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX3RydW5rX21hc2tfd3JpdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgbnVtLAorCQkJCQkgYm9vbCBoYXNrLCB1MTYgbWFzaykKK3sKKwljb25zdCB1MTYgcG9ydF9tYXNrID0gQklUKG12ODhlNnh4eF9udW1fcG9ydHMoY2hpcCkpIC0gMTsKKwl1MTYgdmFsID0gKG51bSA8PCAxMikgfCAobWFzayAmIHBvcnRfbWFzayk7CisKKwlpZiAoaGFzaykKKwkJdmFsIHw9IEdMT0JBTDJfVFJVTktfTUFTS19IQVNLOworCisJcmV0dXJuIG12ODhlNnh4eF9nMl91cGRhdGUoY2hpcCwgR0xPQkFMMl9UUlVOS19NQVNLLCB2YWwpOworfQorCisvKiBPZmZzZXQgMHgwODogVHJ1bmsgTWFwcGluZyBUYWJsZSByZWdpc3RlciAqLworCitzdGF0aWMgaW50IG12ODhlNnh4eF9nMl90cnVua19tYXBwaW5nX3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IGlkLAorCQkJCQkgICAgdTE2IG1hcCkKK3sKKwljb25zdCB1MTYgcG9ydF9tYXNrID0gQklUKG12ODhlNnh4eF9udW1fcG9ydHMoY2hpcCkpIC0gMTsKKwl1MTYgdmFsID0gKGlkIDw8IDExKSB8IChtYXAgJiBwb3J0X21hc2spOworCisJcmV0dXJuIG12ODhlNnh4eF9nMl91cGRhdGUoY2hpcCwgR0xPQkFMMl9UUlVOS19NQVBQSU5HLCB2YWwpOworfQorCitzdGF0aWMgaW50IG12ODhlNnh4eF9nMl9jbGVhcl90cnVuayhzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCit7CisJY29uc3QgdTE2IHBvcnRfbWFzayA9IEJJVChtdjg4ZTZ4eHhfbnVtX3BvcnRzKGNoaXApKSAtIDE7CisJaW50IGksIGVycjsKKworCS8qIENsZWFyIGFsbCBlaWdodCBwb3NzaWJsZSBUcnVuayBNYXNrIHZlY3RvcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7CisJCWVyciA9IG12ODhlNnh4eF9nMl90cnVua19tYXNrX3dyaXRlKGNoaXAsIGksIGZhbHNlLCBwb3J0X21hc2spOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBDbGVhciBhbGwgc2l4dGVlbiBwb3NzaWJsZSBUcnVuayBJRCByb3V0aW5nIHZlY3RvcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgeworCQllcnIgPSBtdjg4ZTZ4eHhfZzJfdHJ1bmtfbWFwcGluZ193cml0ZShjaGlwLCBpLCAwKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIE9mZnNldCAweDA5OiBJbmdyZXNzIFJhdGUgQ29tbWFuZCByZWdpc3RlcgorICogT2Zmc2V0IDB4MEE6IEluZ3Jlc3MgUmF0ZSBEYXRhIHJlZ2lzdGVyCisgKi8KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfY2xlYXJfaXJsKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKK3sKKwlpbnQgcG9ydCwgZXJyOworCisJLyogSW5pdCBhbGwgSW5ncmVzcyBSYXRlIExpbWl0IHJlc291cmNlcyBvZiBhbGwgcG9ydHMgKi8KKwlmb3IgKHBvcnQgPSAwOyBwb3J0IDwgbXY4OGU2eHh4X251bV9wb3J0cyhjaGlwKTsgKytwb3J0KSB7CisJCS8qIFhYWCBuZXdlciBjaGlwcyAobGlrZSA4OEU2MzkwKSBoYXZlIGRpZmZlcmVudCAyLWJpdCBvcHMgKi8KKwkJZXJyID0gbXY4OGU2eHh4X2cyX3dyaXRlKGNoaXAsIEdMT0JBTDJfSVJMX0NNRCwKKwkJCQkJIEdMT0JBTDJfSVJMX0NNRF9PUF9JTklUX0FMTCB8CisJCQkJCSAocG9ydCA8PCA4KSk7CisJCWlmIChlcnIpCisJCQlicmVhazsKKworCQkvKiBXYWl0IGZvciB0aGUgb3BlcmF0aW9uIHRvIGNvbXBsZXRlICovCisJCWVyciA9IG12ODhlNnh4eF9nMl93YWl0KGNoaXAsIEdMT0JBTDJfSVJMX0NNRCwKKwkJCQkJR0xPQkFMMl9JUkxfQ01EX0JVU1kpOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyogT2Zmc2V0IDB4MEQ6IFN3aXRjaCBNQUMvV29ML1dvRiByZWdpc3RlciAqLworCitzdGF0aWMgaW50IG12ODhlNnh4eF9nMl9zd2l0Y2hfbWFjX3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKKwkJCQkJIHVuc2lnbmVkIGludCBwb2ludGVyLCB1OCBkYXRhKQoreworCXUxNiB2YWwgPSAocG9pbnRlciA8PCA4KSB8IGRhdGE7CisKKwlyZXR1cm4gbXY4OGU2eHh4X2cyX3VwZGF0ZShjaGlwLCBHTE9CQUwyX1NXSVRDSF9NQUMsIHZhbCk7Cit9CisKK2ludCBtdjg4ZTZ4eHhfZzJfc2V0X3N3aXRjaF9tYWMoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCB1OCAqYWRkcikKK3sKKwlpbnQgaSwgZXJyOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQllcnIgPSBtdjg4ZTZ4eHhfZzJfc3dpdGNoX21hY193cml0ZShjaGlwLCBpLCBhZGRyW2ldKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qIE9mZnNldCAweDBGOiBQcmlvcml0eSBPdmVycmlkZSBUYWJsZSAqLworCitzdGF0aWMgaW50IG12ODhlNnh4eF9nMl9wb3Rfd3JpdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcG9pbnRlciwKKwkJCQkgIHU4IGRhdGEpCit7CisJdTE2IHZhbCA9IChwb2ludGVyIDw8IDgpIHwgKGRhdGEgJiAweDcpOworCisJcmV0dXJuIG12ODhlNnh4eF9nMl91cGRhdGUoY2hpcCwgR0xPQkFMMl9QUklPX09WRVJSSURFLCB2YWwpOworfQorCitzdGF0aWMgaW50IG12ODhlNnh4eF9nMl9jbGVhcl9wb3Qoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQoreworCWludCBpLCBlcnI7CisKKwkvKiBDbGVhciBhbGwgc2l4dGVlbiBwb3NzaWJsZSBQcmlvcml0eSBPdmVycmlkZSBlbnRyaWVzICovCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJZXJyID0gbXY4OGU2eHh4X2cyX3BvdF93cml0ZShjaGlwLCBpLCAwKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qIE9mZnNldCAweDE0OiBFRVBST00gQ29tbWFuZAorICogT2Zmc2V0IDB4MTU6IEVFUFJPTSBEYXRhCisgKi8KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3dhaXQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQoreworCXJldHVybiBtdjg4ZTZ4eHhfZzJfd2FpdChjaGlwLCBHTE9CQUwyX0VFUFJPTV9DTUQsCisJCQkJIEdMT0JBTDJfRUVQUk9NX0NNRF9CVVNZIHwKKwkJCQkgR0xPQkFMMl9FRVBST01fQ01EX1JVTk5JTkcpOworfQorCitzdGF0aWMgaW50IG12ODhlNnh4eF9nMl9lZXByb21fY21kKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgdTE2IGNtZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gbXY4OGU2eHh4X2cyX3dyaXRlKGNoaXAsIEdMT0JBTDJfRUVQUk9NX0NNRCwgY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIG12ODhlNnh4eF9nMl9lZXByb21fd2FpdChjaGlwKTsKK30KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3JlYWQxNihzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCisJCQkJICAgICAgdTggYWRkciwgdTE2ICpkYXRhKQoreworCXUxNiBjbWQgPSBHTE9CQUwyX0VFUFJPTV9DTURfT1BfUkVBRCB8IGFkZHI7CisJaW50IGVycjsKKworCWVyciA9IG12ODhlNnh4eF9nMl9lZXByb21fd2FpdChjaGlwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gbXY4OGU2eHh4X2cyX2VlcHJvbV9jbWQoY2hpcCwgY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIG12ODhlNnh4eF9nMl9yZWFkKGNoaXAsIEdMT0JBTDJfRUVQUk9NX0RBVEEsIGRhdGEpOworfQorCitzdGF0aWMgaW50IG12ODhlNnh4eF9nMl9lZXByb21fd3JpdGUxNihzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCisJCQkJICAgICAgIHU4IGFkZHIsIHUxNiBkYXRhKQoreworCXUxNiBjbWQgPSBHTE9CQUwyX0VFUFJPTV9DTURfT1BfV1JJVEUgfCBhZGRyOworCWludCBlcnI7CisKKwllcnIgPSBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3dhaXQoY2hpcCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IG12ODhlNnh4eF9nMl93cml0ZShjaGlwLCBHTE9CQUwyX0VFUFJPTV9EQVRBLCBkYXRhKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIG12ODhlNnh4eF9nMl9lZXByb21fY21kKGNoaXAsIGNtZCk7Cit9CisKK2ludCBtdjg4ZTZ4eHhfZzJfZ2V0X2VlcHJvbTE2KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKKwkJCSAgICAgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gZWVwcm9tLT5vZmZzZXQ7CisJdW5zaWduZWQgaW50IGxlbiA9IGVlcHJvbS0+bGVuOworCXUxNiB2YWw7CisJaW50IGVycjsKKworCWVlcHJvbS0+bGVuID0gMDsKKworCWlmIChvZmZzZXQgJiAxKSB7CisJCWVyciA9IG12ODhlNnh4eF9nMl9lZXByb21fcmVhZDE2KGNoaXAsIG9mZnNldCA+PiAxLCAmdmFsKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJKmRhdGErKyA9ICh2YWwgPj4gOCkgJiAweGZmOworCisJCW9mZnNldCsrOworCQlsZW4tLTsKKwkJZWVwcm9tLT5sZW4rKzsKKwl9CisKKwl3aGlsZSAobGVuID49IDIpIHsKKwkJZXJyID0gbXY4OGU2eHh4X2cyX2VlcHJvbV9yZWFkMTYoY2hpcCwgb2Zmc2V0ID4+IDEsICZ2YWwpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQkqZGF0YSsrID0gdmFsICYgMHhmZjsKKwkJKmRhdGErKyA9ICh2YWwgPj4gOCkgJiAweGZmOworCisJCW9mZnNldCArPSAyOworCQlsZW4gLT0gMjsKKwkJZWVwcm9tLT5sZW4gKz0gMjsKKwl9CisKKwlpZiAobGVuKSB7CisJCWVyciA9IG12ODhlNnh4eF9nMl9lZXByb21fcmVhZDE2KGNoaXAsIG9mZnNldCA+PiAxLCAmdmFsKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJKmRhdGErKyA9IHZhbCAmIDB4ZmY7CisKKwkJb2Zmc2V0Kys7CisJCWxlbi0tOworCQllZXByb20tPmxlbisrOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgbXY4OGU2eHh4X2cyX3NldF9lZXByb20xNihzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCisJCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdTggKmRhdGEpCit7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IGVlcHJvbS0+b2Zmc2V0OworCXVuc2lnbmVkIGludCBsZW4gPSBlZXByb20tPmxlbjsKKwl1MTYgdmFsOworCWludCBlcnI7CisKKwkvKiBFbnN1cmUgdGhlIFJPIFdyaXRlRW4gYml0IGlzIHNldCAqLworCWVyciA9IG12ODhlNnh4eF9nMl9yZWFkKGNoaXAsIEdMT0JBTDJfRUVQUk9NX0NNRCwgJnZhbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmICghKHZhbCAmIEdMT0JBTDJfRUVQUk9NX0NNRF9XUklURV9FTikpCisJCXJldHVybiAtRVJPRlM7CisKKwllZXByb20tPmxlbiA9IDA7CisKKwlpZiAob2Zmc2V0ICYgMSkgeworCQllcnIgPSBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3JlYWQxNihjaGlwLCBvZmZzZXQgPj4gMSwgJnZhbCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCXZhbCA9ICgqZGF0YSsrIDw8IDgpIHwgKHZhbCAmIDB4ZmYpOworCisJCWVyciA9IG12ODhlNnh4eF9nMl9lZXByb21fd3JpdGUxNihjaGlwLCBvZmZzZXQgPj4gMSwgdmFsKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJb2Zmc2V0Kys7CisJCWxlbi0tOworCQllZXByb20tPmxlbisrOworCX0KKworCXdoaWxlIChsZW4gPj0gMikgeworCQl2YWwgPSAqZGF0YSsrOworCQl2YWwgfD0gKmRhdGErKyA8PCA4OworCisJCWVyciA9IG12ODhlNnh4eF9nMl9lZXByb21fd3JpdGUxNihjaGlwLCBvZmZzZXQgPj4gMSwgdmFsKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJb2Zmc2V0ICs9IDI7CisJCWxlbiAtPSAyOworCQllZXByb20tPmxlbiArPSAyOworCX0KKworCWlmIChsZW4pIHsKKwkJZXJyID0gbXY4OGU2eHh4X2cyX2VlcHJvbV9yZWFkMTYoY2hpcCwgb2Zmc2V0ID4+IDEsICZ2YWwpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQl2YWwgPSAodmFsICYgMHhmZjAwKSB8ICpkYXRhKys7CisKKwkJZXJyID0gbXY4OGU2eHh4X2cyX2VlcHJvbV93cml0ZTE2KGNoaXAsIG9mZnNldCA+PiAxLCB2YWwpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQlvZmZzZXQrKzsKKwkJbGVuLS07CisJCWVlcHJvbS0+bGVuKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIE9mZnNldCAweDE4OiBTTUkgUEhZIENvbW1hbmQgUmVnaXN0ZXIKKyAqIE9mZnNldCAweDE5OiBTTUkgUEhZIERhdGEgUmVnaXN0ZXIKKyAqLworCitzdGF0aWMgaW50IG12ODhlNnh4eF9nMl9zbWlfcGh5X3dhaXQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQoreworCXJldHVybiBtdjg4ZTZ4eHhfZzJfd2FpdChjaGlwLCBHTE9CQUwyX1NNSV9QSFlfQ01ELAorCQkJCSBHTE9CQUwyX1NNSV9QSFlfQ01EX0JVU1kpOworfQorCitzdGF0aWMgaW50IG12ODhlNnh4eF9nMl9zbWlfcGh5X2NtZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIHUxNiBjbWQpCit7CisJaW50IGVycjsKKworCWVyciA9IG12ODhlNnh4eF9nMl93cml0ZShjaGlwLCBHTE9CQUwyX1NNSV9QSFlfQ01ELCBjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gbXY4OGU2eHh4X2cyX3NtaV9waHlfd2FpdChjaGlwKTsKK30KKworaW50IG12ODhlNnh4eF9nMl9zbWlfcGh5X3JlYWQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgYWRkciwgaW50IHJlZywKKwkJCSAgICAgIHUxNiAqdmFsKQoreworCXUxNiBjbWQgPSBHTE9CQUwyX1NNSV9QSFlfQ01EX09QXzIyX1JFQURfREFUQSB8IChhZGRyIDw8IDUpIHwgcmVnOworCWludCBlcnI7CisKKwllcnIgPSBtdjg4ZTZ4eHhfZzJfc21pX3BoeV93YWl0KGNoaXApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBtdjg4ZTZ4eHhfZzJfc21pX3BoeV9jbWQoY2hpcCwgY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIG12ODhlNnh4eF9nMl9yZWFkKGNoaXAsIEdMT0JBTDJfU01JX1BIWV9EQVRBLCB2YWwpOworfQorCitpbnQgbXY4OGU2eHh4X2cyX3NtaV9waHlfd3JpdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgYWRkciwgaW50IHJlZywKKwkJCSAgICAgICB1MTYgdmFsKQoreworCXUxNiBjbWQgPSBHTE9CQUwyX1NNSV9QSFlfQ01EX09QXzIyX1dSSVRFX0RBVEEgfCAoYWRkciA8PCA1KSB8IHJlZzsKKwlpbnQgZXJyOworCisJZXJyID0gbXY4OGU2eHh4X2cyX3NtaV9waHlfd2FpdChjaGlwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gbXY4OGU2eHh4X2cyX3dyaXRlKGNoaXAsIEdMT0JBTDJfU01JX1BIWV9EQVRBLCB2YWwpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gbXY4OGU2eHh4X2cyX3NtaV9waHlfY21kKGNoaXAsIGNtZCk7Cit9CisKK2ludCBtdjg4ZTZ4eHhfZzJfc2V0dXAoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQoreworCXUxNiByZWc7CisJaW50IGVycjsKKworCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX0cyX01HTVRfRU5fMlgpKSB7CisJCS8qIENvbnNpZGVyIHRoZSBmcmFtZXMgd2l0aCByZXNlcnZlZCBtdWx0aWNhc3QgZGVzdGluYXRpb24KKwkJICogYWRkcmVzc2VzIG1hdGNoaW5nIDAxOjgwOmMyOjAwOjAwOjJ4IGFzIE1HTVQuCisJCSAqLworCQllcnIgPSBtdjg4ZTZ4eHhfZzJfd3JpdGUoY2hpcCwgR0xPQkFMMl9NR01UX0VOXzJYLCAweGZmZmYpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19HMl9NR01UX0VOXzBYKSkgeworCQkvKiBDb25zaWRlciB0aGUgZnJhbWVzIHdpdGggcmVzZXJ2ZWQgbXVsdGljYXN0IGRlc3RpbmF0aW9uCisJCSAqIGFkZHJlc3NlcyBtYXRjaGluZyAwMTo4MDpjMjowMDowMDoweCBhcyBNR01ULgorCQkgKi8KKwkJZXJyID0gbXY4OGU2eHh4X2cyX3dyaXRlKGNoaXAsIEdMT0JBTDJfTUdNVF9FTl8wWCwgMHhmZmZmKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJLyogSWdub3JlIHJlbW92ZWQgdGFnIGRhdGEgb24gZG91Ymx5IHRhZ2dlZCBwYWNrZXRzLCBkaXNhYmxlCisJICogZmxvdyBjb250cm9sIG1lc3NhZ2VzLCBmb3JjZSBmbG93IGNvbnRyb2wgcHJpb3JpdHkgdG8gdGhlCisJICogaGlnaGVzdCwgYW5kIHNlbmQgYWxsIHNwZWNpYWwgbXVsdGljYXN0IGZyYW1lcyB0byB0aGUgQ1BVCisJICogcG9ydCBhdCB0aGUgaGlnaGVzdCBwcmlvcml0eS4KKwkgKi8KKwlyZWcgPSBHTE9CQUwyX1NXSVRDSF9NR01UX0ZPUkNFX0ZMT1dfQ1RSTF9QUkkgfCAoMHg3IDw8IDQpOworCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX0cyX01HTVRfRU5fMFgpIHx8CisJICAgIG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfRzJfTUdNVF9FTl8yWCkpCisJCXJlZyB8PSBHTE9CQUwyX1NXSVRDSF9NR01UX1JTVkQyQ1BVIHwgMHg3OworCWVyciA9IG12ODhlNnh4eF9nMl93cml0ZShjaGlwLCBHTE9CQUwyX1NXSVRDSF9NR01ULCByZWcpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBQcm9ncmFtIHRoZSBEU0Egcm91dGluZyB0YWJsZS4gKi8KKwllcnIgPSBtdjg4ZTZ4eHhfZzJfc2V0X2RldmljZV9tYXBwaW5nKGNoaXApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBDbGVhciBhbGwgdHJ1bmsgbWFza3MgYW5kIG1hcHBpbmcuICovCisJZXJyID0gbXY4OGU2eHh4X2cyX2NsZWFyX3RydW5rKGNoaXApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR1NfSVJMKSkgeworCQkvKiBEaXNhYmxlIGluZ3Jlc3MgcmF0ZSBsaW1pdGluZyBieSByZXNldHRpbmcgYWxsIHBlciBwb3J0CisJCSAqIGluZ3Jlc3MgcmF0ZSBsaW1pdCByZXNvdXJjZXMgdG8gdGhlaXIgaW5pdGlhbCBzdGF0ZS4KKwkJICovCisJCWVyciA9IG12ODhlNnh4eF9nMl9jbGVhcl9pcmwoY2hpcCk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJfQorCisJaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdTX1BWVCkpIHsKKwkJLyogSW5pdGlhbGl6ZSBDcm9zcy1jaGlwIFBvcnQgVkxBTiBUYWJsZSB0byByZXNldCBkZWZhdWx0cyAqLworCQllcnIgPSBtdjg4ZTZ4eHhfZzJfd3JpdGUoY2hpcCwgR0xPQkFMMl9QVlRfQUREUiwKKwkJCQkJIEdMT0JBTDJfUFZUX0FERFJfT1BfSU5JVF9PTkVTKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfRzJfUE9UKSkgeworCQkvKiBDbGVhciB0aGUgcHJpb3JpdHkgb3ZlcnJpZGUgdGFibGUuICovCisJCWVyciA9IG12ODhlNnh4eF9nMl9jbGVhcl9wb3QoY2hpcCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC9nbG9iYWwyLmggYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L2dsb2JhbDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGJiOTAzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC9nbG9iYWwyLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIE1hcnZlbGwgODhFNnh4eCBTd2l0Y2ggR2xvYmFsIDIgUmVnaXN0ZXJzIHN1cHBvcnQgKGRldmljZSBhZGRyZXNzIDB4MUMpCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE1hcnZlbGwgU2VtaWNvbmR1Y3RvcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBWaXZpZW4gRGlkZWxvdCA8dml2aWVuLmRpZGVsb3RAc2F2b2lyZmFpcmVsaW51eC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9NVjg4RTZYWFhfR0xPQkFMMl9ICisjZGVmaW5lIF9NVjg4RTZYWFhfR0xPQkFMMl9ICisKKyNpbmNsdWRlICJtdjg4ZTZ4eHguaCIKKworI2lmZGVmIENPTkZJR19ORVRfRFNBX01WODhFNlhYWF9HTE9CQUwyCisKK3N0YXRpYyBpbmxpbmUgaW50IG12ODhlNnh4eF9nMl9yZXF1aXJlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IG12ODhlNnh4eF9nMl9zbWlfcGh5X3JlYWQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgYWRkciwgaW50IHJlZywKKwkJCSAgICAgIHUxNiAqdmFsKTsKK2ludCBtdjg4ZTZ4eHhfZzJfc21pX3BoeV93cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBhZGRyLCBpbnQgcmVnLAorCQkJICAgICAgIHUxNiB2YWwpOworaW50IG12ODhlNnh4eF9nMl9zZXRfc3dpdGNoX21hYyhzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIHU4ICphZGRyKTsKK2ludCBtdjg4ZTZ4eHhfZzJfZ2V0X2VlcHJvbTE2KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKKwkJCSAgICAgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqZGF0YSk7CitpbnQgbXY4OGU2eHh4X2cyX3NldF9lZXByb20xNihzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCisJCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdTggKmRhdGEpOworaW50IG12ODhlNnh4eF9nMl9zZXR1cChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApOworCisjZWxzZSAvKiAhQ09ORklHX05FVF9EU0FfTVY4OEU2WFhYX0dMT0JBTDIgKi8KKworc3RhdGljIGlubGluZSBpbnQgbXY4OGU2eHh4X2cyX3JlcXVpcmUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQoreworCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX0dMT0JBTDIpKSB7CisJCWRldl9lcnIoY2hpcC0+ZGV2LCAidGhpcyBjaGlwIHJlcXVpcmVzIENPTkZJR19ORVRfRFNBX01WODhFNlhYWF9HTE9CQUwyIGVuYWJsZWRcbiIpOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG12ODhlNnh4eF9nMl9zbWlfcGh5X3JlYWQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAorCQkJCQkgICAgaW50IGFkZHIsIGludCByZWcsIHUxNiAqdmFsKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXY4OGU2eHh4X2cyX3NtaV9waHlfd3JpdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAorCQkJCQkgICAgIGludCBhZGRyLCBpbnQgcmVnLCB1MTYgdmFsKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXY4OGU2eHh4X2cyX3NldF9zd2l0Y2hfbWFjKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKKwkJCQkJICAgICAgdTggKmFkZHIpCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitzdGF0aWMgaW5saW5lIGludCBtdjg4ZTZ4eHhfZzJfZ2V0X2VlcHJvbTE2KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKKwkJCQkJICAgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLAorCQkJCQkgICAgdTggKmRhdGEpCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitzdGF0aWMgaW5saW5lIGludCBtdjg4ZTZ4eHhfZzJfc2V0X2VlcHJvbTE2KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKKwkJCQkJICAgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLAorCQkJCQkgICAgdTggKmRhdGEpCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitzdGF0aWMgaW5saW5lIGludCBtdjg4ZTZ4eHhfZzJfc2V0dXAoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworI2VuZGlmIC8qIENPTkZJR19ORVRfRFNBX01WODhFNlhYWF9HTE9CQUwyICovCisKKyNlbmRpZiAvKiBfTVY4OEU2WFhYX0dMT0JBTDJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC9tdjg4ZTZ4eHguaCBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvbXY4OGU2eHh4LmgKaW5kZXggNDhkNmVhNy4uZTU3MjEyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC9tdjg4ZTZ4eHguaAorKysgYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L212ODhlNnh4eC5oCkBAIC0zMCwxMSArMzAsMTMgQEAKICNkZWZpbmUgU01JX0NNRF9PUF80NV9SRUFEX0RBVEFfSU5DCSgoMyA8PCAxMCkgfCBTTUlfQ01EX0JVU1kpCiAjZGVmaW5lIFNNSV9EQVRBCQkweDAxCiAKLS8qIEZpYmVyL1NFUkRFUyBSZWdpc3RlcnMgYXJlIGxvY2F0ZWQgYXQgU01JIGFkZHJlc3MgRiwgcGFnZSAxICovCi0jZGVmaW5lIFJFR19GSUJFUl9TRVJERVMJMHgwZgotI2RlZmluZSBQQUdFX0ZJQkVSX1NFUkRFUwkweDAxCisvKiBQSFkgUmVnaXN0ZXJzICovCisjZGVmaW5lIFBIWV9QQUdFCQkweDE2CisjZGVmaW5lIFBIWV9QQUdFX0NPUFBFUgkJMHgwMAogCi0jZGVmaW5lIFJFR19QT1JUKHApCQkoMHgxMCArIChwKSkKKyNkZWZpbmUgQUREUl9TRVJERVMJCTB4MGYKKyNkZWZpbmUgU0VSREVTX1BBR0VfRklCRVIJMHgwMQorCiAjZGVmaW5lIFBPUlRfU1RBVFVTCQkweDAwCiAjZGVmaW5lIFBPUlRfU1RBVFVTX1BBVVNFX0VOCUJJVCgxNSkKICNkZWZpbmUgUE9SVF9TVEFUVVNfTVlfUEFVU0UJQklUKDE0KQpAQCAtMTU3LDcgKzE1OSw2IEBACiAjZGVmaW5lIFBPUlRfVEFHX1JFR01BUF8wMTIzCTB4MTgKICNkZWZpbmUgUE9SVF9UQUdfUkVHTUFQXzQ1NjcJMHgxOQogCi0jZGVmaW5lIFJFR19HTE9CQUwJCTB4MWIKICNkZWZpbmUgR0xPQkFMX1NUQVRVUwkJMHgwMAogI2RlZmluZSBHTE9CQUxfU1RBVFVTX1BQVV9TVEFURSBCSVQoMTUpIC8qIDYzNTEgYW5kIDYxNzEgKi8KIC8qIFR3byBiaXRzIGZvciA2MTY1LCA2MTg1IGV0YyAqLwpAQCAtMTY5LDggKzE3MCw4IEBACiAjZGVmaW5lIEdMT0JBTF9NQUNfMDEJCTB4MDEKICNkZWZpbmUgR0xPQkFMX01BQ18yMwkJMHgwMgogI2RlZmluZSBHTE9CQUxfTUFDXzQ1CQkweDAzCi0jZGVmaW5lIEdMT0JBTF9BVFVfRklECQkweDAxCS8qIDYwOTcgNjE2NSA2MzUxIDYzNTIgKi8KLSNkZWZpbmUgR0xPQkFMX1ZUVV9GSUQJCTB4MDIJLyogNjA5NyA2MTY1IDYzNTEgNjM1MiAqLworI2RlZmluZSBHTE9CQUxfQVRVX0ZJRAkJMHgwMQorI2RlZmluZSBHTE9CQUxfVlRVX0ZJRAkJMHgwMgogI2RlZmluZSBHTE9CQUxfVlRVX0ZJRF9NQVNLCTB4ZmZmCiAjZGVmaW5lIEdMT0JBTF9WVFVfU0lECQkweDAzCS8qIDYwOTcgNjE2NSA2MzUxIDYzNTIgKi8KICNkZWZpbmUgR0xPQkFMX1ZUVV9TSURfTUFTSwkweDNmCkBAIC0yNzUsNyArMjc2LDYgQEAKICNkZWZpbmUgR0xPQkFMX1NUQVRTX0NPVU5URVJfMzIJMHgxZQogI2RlZmluZSBHTE9CQUxfU1RBVFNfQ09VTlRFUl8wMQkweDFmCiAKLSNkZWZpbmUgUkVHX0dMT0JBTDIJCTB4MWMKICNkZWZpbmUgR0xPQkFMMl9JTlRfU09VUkNFCTB4MDAKICNkZWZpbmUgR0xPQkFMMl9JTlRfTUFTSwkweDAxCiAjZGVmaW5lIEdMT0JBTDJfTUdNVF9FTl8yWAkweDAyCkBAIC0zMjksMTcgKzMyOSwxNiBAQAogI2RlZmluZSBHTE9CQUwyX0VFUFJPTV9EQVRBCTB4MTUKICNkZWZpbmUgR0xPQkFMMl9QVFBfQVZCX09QCTB4MTYKICNkZWZpbmUgR0xPQkFMMl9QVFBfQVZCX0RBVEEJMHgxNwotI2RlZmluZSBHTE9CQUwyX1NNSV9PUAkJMHgxOAotI2RlZmluZSBHTE9CQUwyX1NNSV9PUF9CVVNZCQlCSVQoMTUpCi0jZGVmaW5lIEdMT0JBTDJfU01JX09QX0NMQVVTRV8yMglCSVQoMTIpCi0jZGVmaW5lIEdMT0JBTDJfU01JX09QXzIyX1dSSVRFCQkoKDEgPDwgMTApIHwgR0xPQkFMMl9TTUlfT1BfQlVTWSB8IFwKLQkJCQkJIEdMT0JBTDJfU01JX09QX0NMQVVTRV8yMikKLSNkZWZpbmUgR0xPQkFMMl9TTUlfT1BfMjJfUkVBRAkJKCgyIDw8IDEwKSB8IEdMT0JBTDJfU01JX09QX0JVU1kgfCBcCi0JCQkJCSBHTE9CQUwyX1NNSV9PUF9DTEFVU0VfMjIpCi0jZGVmaW5lIEdMT0JBTDJfU01JX09QXzQ1X1dSSVRFX0FERFIJKCgwIDw8IDEwKSB8IEdMT0JBTDJfU01JX09QX0JVU1kpCi0jZGVmaW5lIEdMT0JBTDJfU01JX09QXzQ1X1dSSVRFX0RBVEEJKCgxIDw8IDEwKSB8IEdMT0JBTDJfU01JX09QX0JVU1kpCi0jZGVmaW5lIEdMT0JBTDJfU01JX09QXzQ1X1JFQURfREFUQQkoKDIgPDwgMTApIHwgR0xPQkFMMl9TTUlfT1BfQlVTWSkKLSNkZWZpbmUgR0xPQkFMMl9TTUlfREFUQQkweDE5CisjZGVmaW5lIEdMT0JBTDJfU01JX1BIWV9DTUQJCQkweDE4CisjZGVmaW5lIEdMT0JBTDJfU01JX1BIWV9DTURfQlVTWQkJQklUKDE1KQorI2RlZmluZSBHTE9CQUwyX1NNSV9QSFlfQ01EX01PREVfMjIJCUJJVCgxMikKKyNkZWZpbmUgR0xPQkFMMl9TTUlfUEhZX0NNRF9PUF8yMl9XUklURV9EQVRBCSgoMHgxIDw8IDEwKSB8IFwKKwkJCQkJCSBHTE9CQUwyX1NNSV9QSFlfQ01EX01PREVfMjIgfCBcCisJCQkJCQkgR0xPQkFMMl9TTUlfUEhZX0NNRF9CVVNZKQorI2RlZmluZSBHTE9CQUwyX1NNSV9QSFlfQ01EX09QXzIyX1JFQURfREFUQQkoKDB4MiA8PCAxMCkgfCBcCisJCQkJCQkgR0xPQkFMMl9TTUlfUEhZX0NNRF9NT0RFXzIyIHwgXAorCQkJCQkJIEdMT0JBTDJfU01JX1BIWV9DTURfQlVTWSkKKyNkZWZpbmUgR0xPQkFMMl9TTUlfUEhZX0RBVEEJCQkweDE5CiAjZGVmaW5lIEdMT0JBTDJfU0NSQVRDSF9NSVNDCTB4MWEKICNkZWZpbmUgR0xPQkFMMl9TQ1JBVENIX0JVU1kJCUJJVCgxNSkKICNkZWZpbmUgR0xPQkFMMl9TQ1JBVENIX1JFR0lTVEVSX1NISUZUCTgKQEAgLTM4NCwxMCArMzgzLDM2IEBACiB9OwogCiBlbnVtIG12ODhlNnh4eF9jYXAgeworCS8qIFR3byBkaWZmZXJlbnQgdGFnIHByb3RvY29scyBjYW4gYmUgdXNlZCBieSB0aGUgZHJpdmVyLiBBbGwKKwkgKiBzd2l0Y2hlcyBzdXBwb3J0IERTQSwgYnV0IG9ubHkgbGF0ZXIgZ2VuZXJhdGlvbnMgc3VwcG9ydAorCSAqIEVEU0EuCisJICovCisJTVY4OEU2WFhYX0NBUF9FRFNBLAorCiAJLyogRW5lcmd5IEVmZmljaWVudCBFdGhlcm5ldC4KIAkgKi8KIAlNVjg4RTZYWFhfQ0FQX0VFRSwKIAorCS8qIE11bHRpLWNoaXAgQWRkcmVzc2luZyBNb2RlLgorCSAqIFNvbWUgY2hpcHMgcmVzcG9uZCB0byBvbmx5IDIgcmVnaXN0ZXJzIG9mIGl0cyBvd24gU01JIGRldmljZSBhZGRyZXNzCisJICogd2hlbiBpdCBpcyBub24temVybywgYW5kIHVzZSBpbmRpcmVjdCBhY2Nlc3MgdG8gaW50ZXJuYWwgcmVnaXN0ZXJzLgorCSAqLworCU1WODhFNlhYWF9DQVBfU01JX0NNRCwJCS8qICgweDAwKSBTTUkgQ29tbWFuZCAqLworCU1WODhFNlhYWF9DQVBfU01JX0RBVEEsCQkvKiAoMHgwMSkgU01JIERhdGEgKi8KKworCS8qIFBIWSBSZWdpc3RlcnMuCisJICovCisJTVY4OEU2WFhYX0NBUF9QSFlfUEFHRSwJCS8qICgweDE2KSBQYWdlIFJlZ2lzdGVyICovCisKKwkvKiBGaWJlci9TRVJERVMgUmVnaXN0ZXJzIChTTUkgYWRkcmVzcyBGKS4KKwkgKi8KKwlNVjg4RTZYWFhfQ0FQX1NFUkRFUywKKworCS8qIFN3aXRjaCBHbG9iYWwgKDEpIFJlZ2lzdGVycy4KKwkgKi8KKwlNVjg4RTZYWFhfQ0FQX0cxX0FUVV9GSUQsCS8qICgweDAxKSBBVFUgRklEIFJlZ2lzdGVyICovCisJTVY4OEU2WFhYX0NBUF9HMV9WVFVfRklELAkvKiAoMHgwMikgVlRVIEZJRCBSZWdpc3RlciAqLworCiAJLyogU3dpdGNoIEdsb2JhbCAyIFJlZ2lzdGVycy4KIAkgKiBUaGUgZGV2aWNlIGNvbnRhaW5zIGEgc2Vjb25kIHNldCBvZiBnbG9iYWwgMTYtYml0IHJlZ2lzdGVycy4KIAkgKi8KQEAgLTM5OCwxNiArNDIzLDcgQEAKIAlNVjg4RTZYWFhfQ0FQX0cyX0lSTF9EQVRBLAkvKiAoMHgwYSkgSW5ncmVzcyBSYXRlIERhdGEgKi8KIAlNVjg4RTZYWFhfQ0FQX0cyX1BWVF9BRERSLAkvKiAoMHgwYikgQ3Jvc3MgQ2hpcCBQb3J0IFZMQU4gQWRkciAqLwogCU1WODhFNlhYWF9DQVBfRzJfUFZUX0RBVEEsCS8qICgweDBjKSBDcm9zcyBDaGlwIFBvcnQgVkxBTiBEYXRhICovCi0JTVY4OEU2WFhYX0NBUF9HMl9TV0lUQ0hfTUFDLAkvKiAoMHgwZCkgU3dpdGNoIE1BQy9Xb0wvV29GICovCiAJTVY4OEU2WFhYX0NBUF9HMl9QT1QsCQkvKiAoMHgwZikgUHJpb3JpdHkgT3ZlcnJpZGUgVGFibGUgKi8KLQlNVjg4RTZYWFhfQ0FQX0cyX0VFUFJPTV9DTUQsCS8qICgweDE0KSBFRVBST00gQ29tbWFuZCAqLwotCU1WODhFNlhYWF9DQVBfRzJfRUVQUk9NX0RBVEEsCS8qICgweDE1KSBFRVBST00gRGF0YSAqLwotCi0JLyogTXVsdGktY2hpcCBBZGRyZXNzaW5nIE1vZGUuCi0JICogU29tZSBjaGlwcyByZXF1aXJlIGFuIGluZGlyZWN0IFNNSSBhY2Nlc3Mgd2hlbiB0aGVpciBTTUkgZGV2aWNlCi0JICogYWRkcmVzcyBpcyBub3QgemVyby4gU2VlIFNNSV9DTUQgYW5kIFNNSV9EQVRBLgotCSAqLwotCU1WODhFNlhYWF9DQVBfTVVMVElfQ0hJUCwKIAogCS8qIFBIWSBQb2xsaW5nIFVuaXQuCiAJICogU2VlIEdMT0JBTF9DT05UUk9MX1BQVV9FTkFCTEUgYW5kIEdMT0JBTF9TVEFUVVNfUFBVX1BPTExJTkcuCkBAIC00MTUsMTIgKzQzMSw2IEBACiAJTVY4OEU2WFhYX0NBUF9QUFUsCiAJTVY4OEU2WFhYX0NBUF9QUFVfQUNUSVZFLAogCi0JLyogU01JIFBIWSBDb21tYW5kIGFuZCBEYXRhIHJlZ2lzdGVycy4KLQkgKiBUaGlzIHJlcXVpcmVzIGFuIGluZGlyZWN0IGFjY2VzcyB0byBQSFkgcmVnaXN0ZXJzIHRocm91Z2gKLQkgKiBHTE9CQUwyX1NNSV9PUCwgb3RoZXJ3aXNlIGRpcmVjdCBhY2Nlc3MgdG8gUEhZIHJlZ2lzdGVycyBpcyBkb25lLgotCSAqLwotCU1WODhFNlhYWF9DQVBfU01JX1BIWSwKLQogCS8qIFBlciBWTEFOIFNwYW5uaW5nIFRyZWUgVW5pdCAoU1RVKS4KIAkgKiBUaGUgUG9ydCBTdGF0ZSBkYXRhYmFzZSwgaWYgcHJlc2VudCwgaXMgYWNjZXNzZWQgdGhyb3VnaCBWVFUKIAkgKiBvcGVyYXRpb25zIGFuZCBkZWRpY2F0ZWQgU0lEIHJlZ2lzdGVycy4gU2VlIEdMT0JBTF9WVFVfU0lELgpAQCAtNDQwLDEzMCArNDUwLDE0OCBAQAogfTsKIAogLyogQml0bWFzayBvZiBjYXBhYmlsaXRpZXMgKi8KLSNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfRUVFCQlCSVQoTVY4OEU2WFhYX0NBUF9FRUUpCi0jZGVmaW5lIE1WODhFNlhYWF9GTEFHX0dMT0JBTDIJCUJJVChNVjg4RTZYWFhfQ0FQX0dMT0JBTDIpCi0jZGVmaW5lIE1WODhFNlhYWF9GTEFHX0cyX01HTVRfRU5fMlgJQklUKE1WODhFNlhYWF9DQVBfRzJfTUdNVF9FTl8yWCkKLSNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfRzJfTUdNVF9FTl8wWAlCSVQoTVY4OEU2WFhYX0NBUF9HMl9NR01UX0VOXzBYKQotI2RlZmluZSBNVjg4RTZYWFhfRkxBR19HMl9JUkxfQ01ECUJJVChNVjg4RTZYWFhfQ0FQX0cyX0lSTF9DTUQpCi0jZGVmaW5lIE1WODhFNlhYWF9GTEFHX0cyX0lSTF9EQVRBCUJJVChNVjg4RTZYWFhfQ0FQX0cyX0lSTF9EQVRBKQotI2RlZmluZSBNVjg4RTZYWFhfRkxBR19HMl9QVlRfQUREUglCSVQoTVY4OEU2WFhYX0NBUF9HMl9QVlRfQUREUikKLSNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfRzJfUFZUX0RBVEEJQklUKE1WODhFNlhYWF9DQVBfRzJfUFZUX0RBVEEpCi0jZGVmaW5lIE1WODhFNlhYWF9GTEFHX0cyX1NXSVRDSF9NQUMJQklUKE1WODhFNlhYWF9DQVBfRzJfU1dJVENIX01BQykKLSNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfRzJfUE9UCQlCSVQoTVY4OEU2WFhYX0NBUF9HMl9QT1QpCi0jZGVmaW5lIE1WODhFNlhYWF9GTEFHX0cyX0VFUFJPTV9DTUQJQklUKE1WODhFNlhYWF9DQVBfRzJfRUVQUk9NX0NNRCkKLSNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfRzJfRUVQUk9NX0RBVEEJQklUKE1WODhFNlhYWF9DQVBfRzJfRUVQUk9NX0RBVEEpCi0jZGVmaW5lIE1WODhFNlhYWF9GTEFHX01VTFRJX0NISVAJQklUKE1WODhFNlhYWF9DQVBfTVVMVElfQ0hJUCkKLSNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfUFBVCQlCSVQoTVY4OEU2WFhYX0NBUF9QUFUpCi0jZGVmaW5lIE1WODhFNlhYWF9GTEFHX1BQVV9BQ1RJVkUJQklUKE1WODhFNlhYWF9DQVBfUFBVX0FDVElWRSkKLSNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfU01JX1BIWQkJQklUKE1WODhFNlhYWF9DQVBfU01JX1BIWSkKLSNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfU1RVCQlCSVQoTVY4OEU2WFhYX0NBUF9TVFUpCi0jZGVmaW5lIE1WODhFNlhYWF9GTEFHX1RFTVAJCUJJVChNVjg4RTZYWFhfQ0FQX1RFTVApCi0jZGVmaW5lIE1WODhFNlhYWF9GTEFHX1RFTVBfTElNSVQJQklUKE1WODhFNlhYWF9DQVBfVEVNUF9MSU1JVCkKLSNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfVlRVCQlCSVQoTVY4OEU2WFhYX0NBUF9WVFUpCisjZGVmaW5lIE1WODhFNlhYWF9GTEFHX0VEU0EJCUJJVF9VTEwoTVY4OEU2WFhYX0NBUF9FRFNBKQorI2RlZmluZSBNVjg4RTZYWFhfRkxBR19FRUUJCUJJVF9VTEwoTVY4OEU2WFhYX0NBUF9FRUUpCiAKLS8qIEVFUFJPTSBQcm9ncmFtbWluZyB2aWEgR2xvYmFsMiB3aXRoIDE2LWJpdCBkYXRhICovCi0jZGVmaW5lIE1WODhFNlhYWF9GTEFHU19FRVBST00xNglcCi0JKE1WODhFNlhYWF9GTEFHX0cyX0VFUFJPTV9DTUQgfAlcCi0JIE1WODhFNlhYWF9GTEFHX0cyX0VFUFJPTV9EQVRBKQorI2RlZmluZSBNVjg4RTZYWFhfRkxBR19TTUlfQ01ECQlCSVRfVUxMKE1WODhFNlhYWF9DQVBfU01JX0NNRCkKKyNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfU01JX0RBVEEJCUJJVF9VTEwoTVY4OEU2WFhYX0NBUF9TTUlfREFUQSkKKworI2RlZmluZSBNVjg4RTZYWFhfRkxBR19QSFlfUEFHRQkJQklUX1VMTChNVjg4RTZYWFhfQ0FQX1BIWV9QQUdFKQorCisjZGVmaW5lIE1WODhFNlhYWF9GTEFHX1NFUkRFUwkJQklUX1VMTChNVjg4RTZYWFhfQ0FQX1NFUkRFUykKKworI2RlZmluZSBNVjg4RTZYWFhfRkxBR19HMV9BVFVfRklECUJJVF9VTEwoTVY4OEU2WFhYX0NBUF9HMV9BVFVfRklEKQorI2RlZmluZSBNVjg4RTZYWFhfRkxBR19HMV9WVFVfRklECUJJVF9VTEwoTVY4OEU2WFhYX0NBUF9HMV9WVFVfRklEKQorCisjZGVmaW5lIE1WODhFNlhYWF9GTEFHX0dMT0JBTDIJCUJJVF9VTEwoTVY4OEU2WFhYX0NBUF9HTE9CQUwyKQorI2RlZmluZSBNVjg4RTZYWFhfRkxBR19HMl9NR01UX0VOXzJYCUJJVF9VTEwoTVY4OEU2WFhYX0NBUF9HMl9NR01UX0VOXzJYKQorI2RlZmluZSBNVjg4RTZYWFhfRkxBR19HMl9NR01UX0VOXzBYCUJJVF9VTEwoTVY4OEU2WFhYX0NBUF9HMl9NR01UX0VOXzBYKQorI2RlZmluZSBNVjg4RTZYWFhfRkxBR19HMl9JUkxfQ01ECUJJVF9VTEwoTVY4OEU2WFhYX0NBUF9HMl9JUkxfQ01EKQorI2RlZmluZSBNVjg4RTZYWFhfRkxBR19HMl9JUkxfREFUQQlCSVRfVUxMKE1WODhFNlhYWF9DQVBfRzJfSVJMX0RBVEEpCisjZGVmaW5lIE1WODhFNlhYWF9GTEFHX0cyX1BWVF9BRERSCUJJVF9VTEwoTVY4OEU2WFhYX0NBUF9HMl9QVlRfQUREUikKKyNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfRzJfUFZUX0RBVEEJQklUX1VMTChNVjg4RTZYWFhfQ0FQX0cyX1BWVF9EQVRBKQorI2RlZmluZSBNVjg4RTZYWFhfRkxBR19HMl9QT1QJCUJJVF9VTEwoTVY4OEU2WFhYX0NBUF9HMl9QT1QpCisKKyNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfUFBVCQlCSVRfVUxMKE1WODhFNlhYWF9DQVBfUFBVKQorI2RlZmluZSBNVjg4RTZYWFhfRkxBR19QUFVfQUNUSVZFCUJJVF9VTEwoTVY4OEU2WFhYX0NBUF9QUFVfQUNUSVZFKQorI2RlZmluZSBNVjg4RTZYWFhfRkxBR19TVFUJCUJJVF9VTEwoTVY4OEU2WFhYX0NBUF9TVFUpCisjZGVmaW5lIE1WODhFNlhYWF9GTEFHX1RFTVAJCUJJVF9VTEwoTVY4OEU2WFhYX0NBUF9URU1QKQorI2RlZmluZSBNVjg4RTZYWFhfRkxBR19URU1QX0xJTUlUCUJJVF9VTEwoTVY4OEU2WFhYX0NBUF9URU1QX0xJTUlUKQorI2RlZmluZSBNVjg4RTZYWFhfRkxBR19WVFUJCUJJVF9VTEwoTVY4OEU2WFhYX0NBUF9WVFUpCiAKIC8qIEluZ3Jlc3MgUmF0ZSBMaW1pdCB1bml0ICovCiAjZGVmaW5lIE1WODhFNlhYWF9GTEFHU19JUkwJCVwKIAkoTVY4OEU2WFhYX0ZMQUdfRzJfSVJMX0NNRCB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfRzJfSVJMX0RBVEEpCiAKKy8qIE11bHRpLWNoaXAgQWRkcmVzc2luZyBNb2RlICovCisjZGVmaW5lIE1WODhFNlhYWF9GTEFHU19NVUxUSV9DSElQCVwKKwkoTVY4OEU2WFhYX0ZMQUdfU01JX0NNRCB8CVwKKwkgTVY4OEU2WFhYX0ZMQUdfU01JX0RBVEEpCisKIC8qIENyb3NzLWNoaXAgUG9ydCBWTEFOIFRhYmxlICovCiAjZGVmaW5lIE1WODhFNlhYWF9GTEFHU19QVlQJCVwKIAkoTVY4OEU2WFhYX0ZMQUdfRzJfUFZUX0FERFIgfAlcCiAJIE1WODhFNlhYWF9GTEFHX0cyX1BWVF9EQVRBKQogCisvKiBGaWJlci9TRVJERVMgUmVnaXN0ZXJzIGF0IFNNSSBhZGRyZXNzIEYsIHBhZ2UgMSAqLworI2RlZmluZSBNVjg4RTZYWFhfRkxBR1NfU0VSREVTCQlcCisJKE1WODhFNlhYWF9GTEFHX1BIWV9QQUdFIHwJXAorCSBNVjg4RTZYWFhfRkxBR19TRVJERVMpCisKICNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdTX0ZBTUlMWV82MDk1CVwKIAkoTVY4OEU2WFhYX0ZMQUdfR0xPQkFMMiB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfRzJfTUdNVF9FTl8wWCB8CVwKLQkgTVY4OEU2WFhYX0ZMQUdfTVVMVElfQ0hJUCB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfUFBVIHwJCVwKLQkgTVY4OEU2WFhYX0ZMQUdfVlRVKQorCSBNVjg4RTZYWFhfRkxBR19WVFUgfAkJXAorCSBNVjg4RTZYWFhfRkxBR1NfTVVMVElfQ0hJUCkKIAogI2RlZmluZSBNVjg4RTZYWFhfRkxBR1NfRkFNSUxZXzYwOTcJXAotCShNVjg4RTZYWFhfRkxBR19HTE9CQUwyIHwJXAorCShNVjg4RTZYWFhfRkxBR19HMV9BVFVfRklEIHwJXAorCSBNVjg4RTZYWFhfRkxBR19HMV9WVFVfRklEIHwJXAorCSBNVjg4RTZYWFhfRkxBR19HTE9CQUwyIHwJXAogCSBNVjg4RTZYWFhfRkxBR19HMl9NR01UX0VOXzJYIHwJXAogCSBNVjg4RTZYWFhfRkxBR19HMl9NR01UX0VOXzBYIHwJXAogCSBNVjg4RTZYWFhfRkxBR19HMl9QT1QgfAlcCi0JIE1WODhFNlhYWF9GTEFHX01VTFRJX0NISVAgfAlcCiAJIE1WODhFNlhYWF9GTEFHX1BQVSB8CQlcCiAJIE1WODhFNlhYWF9GTEFHX1NUVSB8CQlcCiAJIE1WODhFNlhYWF9GTEFHX1ZUVSB8CQlcCiAJIE1WODhFNlhYWF9GTEFHU19JUkwgfAkJXAorCSBNVjg4RTZYWFhfRkxBR1NfTVVMVElfQ0hJUCB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdTX1BWVCkKIAogI2RlZmluZSBNVjg4RTZYWFhfRkxBR1NfRkFNSUxZXzYxNjUJXAotCShNVjg4RTZYWFhfRkxBR19HTE9CQUwyIHwJXAorCShNVjg4RTZYWFhfRkxBR19HMV9BVFVfRklEIHwJXAorCSBNVjg4RTZYWFhfRkxBR19HMV9WVFVfRklEIHwJXAorCSBNVjg4RTZYWFhfRkxBR19HTE9CQUwyIHwJXAogCSBNVjg4RTZYWFhfRkxBR19HMl9NR01UX0VOXzJYIHwJXAogCSBNVjg4RTZYWFhfRkxBR19HMl9NR01UX0VOXzBYIHwJXAotCSBNVjg4RTZYWFhfRkxBR19HMl9TV0lUQ0hfTUFDIHwJXAogCSBNVjg4RTZYWFhfRkxBR19HMl9QT1QgfAlcCi0JIE1WODhFNlhYWF9GTEFHX01VTFRJX0NISVAgfAlcCiAJIE1WODhFNlhYWF9GTEFHX1NUVSB8CQlcCiAJIE1WODhFNlhYWF9GTEFHX1RFTVAgfAkJXAogCSBNVjg4RTZYWFhfRkxBR19WVFUgfAkJXAogCSBNVjg4RTZYWFhfRkxBR1NfSVJMIHwJCVwKKwkgTVY4OEU2WFhYX0ZMQUdTX01VTFRJX0NISVAgfAlcCiAJIE1WODhFNlhYWF9GTEFHU19QVlQpCiAKICNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdTX0ZBTUlMWV82MTg1CVwKIAkoTVY4OEU2WFhYX0ZMQUdfR0xPQkFMMiB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfRzJfTUdNVF9FTl8wWCB8CVwKLQkgTVY4OEU2WFhYX0ZMQUdfTVVMVElfQ0hJUCB8CVwKKwkgTVY4OEU2WFhYX0ZMQUdTX01VTFRJX0NISVAgfAlcCiAJIE1WODhFNlhYWF9GTEFHX1BQVSB8CQlcCiAJIE1WODhFNlhYWF9GTEFHX1ZUVSkKIAogI2RlZmluZSBNVjg4RTZYWFhfRkxBR1NfRkFNSUxZXzYzMjAJXAotCShNVjg4RTZYWFhfRkxBR19FRUUgfAkJXAorCShNVjg4RTZYWFhfRkxBR19FRFNBIHwJCVwKKwkgTVY4OEU2WFhYX0ZMQUdfRUVFIHwJCVwKIAkgTVY4OEU2WFhYX0ZMQUdfR0xPQkFMMiB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfRzJfTUdNVF9FTl8yWCB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfRzJfTUdNVF9FTl8wWCB8CVwKLQkgTVY4OEU2WFhYX0ZMQUdfRzJfU1dJVENIX01BQyB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfRzJfUE9UIHwJXAotCSBNVjg4RTZYWFhfRkxBR19NVUxUSV9DSElQIHwJXAogCSBNVjg4RTZYWFhfRkxBR19QUFVfQUNUSVZFIHwJXAotCSBNVjg4RTZYWFhfRkxBR19TTUlfUEhZIHwJXAogCSBNVjg4RTZYWFhfRkxBR19URU1QIHwJCVwKIAkgTVY4OEU2WFhYX0ZMQUdfVEVNUF9MSU1JVCB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfVlRVIHwJCVwKLQkgTVY4OEU2WFhYX0ZMQUdTX0VFUFJPTTE2IHwJXAogCSBNVjg4RTZYWFhfRkxBR1NfSVJMIHwJCVwKKwkgTVY4OEU2WFhYX0ZMQUdTX01VTFRJX0NISVAgfAlcCiAJIE1WODhFNlhYWF9GTEFHU19QVlQpCiAKICNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdTX0ZBTUlMWV82MzUxCVwKLQkoTVY4OEU2WFhYX0ZMQUdfR0xPQkFMMiB8CVwKKwkoTVY4OEU2WFhYX0ZMQUdfRURTQSB8CQlcCisJIE1WODhFNlhYWF9GTEFHX0cxX0FUVV9GSUQgfAlcCisJIE1WODhFNlhYWF9GTEFHX0cxX1ZUVV9GSUQgfAlcCisJIE1WODhFNlhYWF9GTEFHX0dMT0JBTDIgfAlcCiAJIE1WODhFNlhYWF9GTEFHX0cyX01HTVRfRU5fMlggfAlcCiAJIE1WODhFNlhYWF9GTEFHX0cyX01HTVRfRU5fMFggfAlcCi0JIE1WODhFNlhYWF9GTEFHX0cyX1NXSVRDSF9NQUMgfAlcCiAJIE1WODhFNlhYWF9GTEFHX0cyX1BPVCB8CVwKLQkgTVY4OEU2WFhYX0ZMQUdfTVVMVElfQ0hJUCB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfUFBVX0FDVElWRSB8CVwKLQkgTVY4OEU2WFhYX0ZMQUdfU01JX1BIWSB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfU1RVIHwJCVwKIAkgTVY4OEU2WFhYX0ZMQUdfVEVNUCB8CQlcCiAJIE1WODhFNlhYWF9GTEFHX1ZUVSB8CQlcCiAJIE1WODhFNlhYWF9GTEFHU19JUkwgfAkJXAorCSBNVjg4RTZYWFhfRkxBR1NfTVVMVElfQ0hJUCB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdTX1BWVCkKIAogI2RlZmluZSBNVjg4RTZYWFhfRkxBR1NfRkFNSUxZXzYzNTIJXAotCShNVjg4RTZYWFhfRkxBR19FRUUgfAkJXAorCShNVjg4RTZYWFhfRkxBR19FRFNBIHwJCVwKKwkgTVY4OEU2WFhYX0ZMQUdfRUVFIHwJCVwKKwkgTVY4OEU2WFhYX0ZMQUdfRzFfQVRVX0ZJRCB8CVwKKwkgTVY4OEU2WFhYX0ZMQUdfRzFfVlRVX0ZJRCB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfR0xPQkFMMiB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfRzJfTUdNVF9FTl8yWCB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfRzJfTUdNVF9FTl8wWCB8CVwKLQkgTVY4OEU2WFhYX0ZMQUdfRzJfU1dJVENIX01BQyB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfRzJfUE9UIHwJXAotCSBNVjg4RTZYWFhfRkxBR19NVUxUSV9DSElQIHwJXAogCSBNVjg4RTZYWFhfRkxBR19QUFVfQUNUSVZFIHwJXAotCSBNVjg4RTZYWFhfRkxBR19TTUlfUEhZIHwJXAogCSBNVjg4RTZYWFhfRkxBR19TVFUgfAkJXAogCSBNVjg4RTZYWFhfRkxBR19URU1QIHwJCVwKIAkgTVY4OEU2WFhYX0ZMQUdfVEVNUF9MSU1JVCB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfVlRVIHwJCVwKLQkgTVY4OEU2WFhYX0ZMQUdTX0VFUFJPTTE2IHwJXAogCSBNVjg4RTZYWFhfRkxBR1NfSVJMIHwJCVwKLQkgTVY4OEU2WFhYX0ZMQUdTX1BWVCkKKwkgTVY4OEU2WFhYX0ZMQUdTX01VTFRJX0NISVAgfAlcCisJIE1WODhFNlhYWF9GTEFHU19QVlQgfAkJXAorCSBNVjg4RTZYWFhfRkxBR1NfU0VSREVTKQorCitzdHJ1Y3QgbXY4OGU2eHh4X29wczsKIAogc3RydWN0IG12ODhlNnh4eF9pbmZvIHsKIAllbnVtIG12ODhlNnh4eF9mYW1pbHkgZmFtaWx5OwpAQCAtNTcyLDggKzYwMCwxMCBAQAogCXVuc2lnbmVkIGludCBudW1fZGF0YWJhc2VzOwogCXVuc2lnbmVkIGludCBudW1fcG9ydHM7CiAJdW5zaWduZWQgaW50IHBvcnRfYmFzZV9hZGRyOworCXVuc2lnbmVkIGludCBnbG9iYWwxX2FkZHI7CiAJdW5zaWduZWQgaW50IGFnZV90aW1lX2NvZWZmOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBsb25nIGZsYWdzOworCWNvbnN0IHN0cnVjdCBtdjg4ZTZ4eHhfb3BzICpvcHM7CiB9OwogCiBzdHJ1Y3QgbXY4OGU2eHh4X2F0dV9lbnRyeSB7CkBAIC01ODQsMTggKzYxNCwxNSBAQAogCXU4CW1hY1tFVEhfQUxFTl07CiB9OwogCi1zdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9zdHVfZW50cnkgewotCS8qIFZUVSBvbmx5ICovCitzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9lbnRyeSB7CiAJdTE2CXZpZDsKIAl1MTYJZmlkOwotCi0JLyogVlRVIGFuZCBTVFUgKi8KIAl1OAlzaWQ7CiAJYm9vbAl2YWxpZDsKIAl1OAlkYXRhW0RTQV9NQVhfUE9SVFNdOwogfTsKIAotc3RydWN0IG12ODhlNnh4eF9vcHM7CitzdHJ1Y3QgbXY4OGU2eHh4X2J1c19vcHM7CiAKIHN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9wb3J0IHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqYnJpZGdlX2RldjsKQEAgLTYxNiwxMyArNjQzLDE0IEBACiAJLyogVGhlIE1JSSBidXMgYW5kIHRoZSBhZGRyZXNzIG9uIHRoZSBidXMgdGhhdCBpcyB1c2VkIHRvCiAJICogY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBzd2l0Y2gKIAkgKi8KLQljb25zdCBzdHJ1Y3QgbXY4OGU2eHh4X29wcyAqc21pX29wczsKKwljb25zdCBzdHJ1Y3QgbXY4OGU2eHh4X2J1c19vcHMgKnNtaV9vcHM7CiAJc3RydWN0IG1paV9idXMgKmJ1czsKIAlpbnQgc3dfYWRkcjsKIAogCS8qIEhhbmRsZXMgYXV0b21hdGljIGRpc2FibGluZyBhbmQgcmUtZW5hYmxpbmcgb2YgdGhlIFBIWQogCSAqIHBvbGxpbmcgdW5pdC4KIAkgKi8KKwljb25zdCBzdHJ1Y3QgbXY4OGU2eHh4X2J1c19vcHMgKnBoeV9vcHM7CiAJc3RydWN0IG11dGV4CQlwcHVfbXV0ZXg7CiAJaW50CQkJcHB1X2Rpc2FibGVkOwogCXN0cnVjdCB3b3JrX3N0cnVjdAlwcHVfd29yazsKQEAgLTY1MSwxMSArNjc5LDI1IEBACiAJc3RydWN0IG1paV9idXMgKm1kaW9fYnVzOwogfTsKIAotc3RydWN0IG12ODhlNnh4eF9vcHMgeworc3RydWN0IG12ODhlNnh4eF9idXNfb3BzIHsKIAlpbnQgKCpyZWFkKShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBhZGRyLCBpbnQgcmVnLCB1MTYgKnZhbCk7CiAJaW50ICgqd3JpdGUpKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IGFkZHIsIGludCByZWcsIHUxNiB2YWwpOwogfTsKIAorc3RydWN0IG12ODhlNnh4eF9vcHMgeworCWludCAoKmdldF9lZXByb20pKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKKwkJCSAgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICpkYXRhKTsKKwlpbnQgKCpzZXRfZWVwcm9tKShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCisJCQkgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqZGF0YSk7CisKKwlpbnQgKCpzZXRfc3dpdGNoX21hYykoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCB1OCAqYWRkcik7CisKKwlpbnQgKCpwaHlfcmVhZCkoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgYWRkciwgaW50IHJlZywKKwkJCXUxNiAqdmFsKTsKKwlpbnQgKCpwaHlfd3JpdGUpKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IGFkZHIsIGludCByZWcsCisJCQkgdTE2IHZhbCk7Cit9OworCiBlbnVtIHN0YXRfdHlwZSB7CiAJQkFOSzAsCiAJQkFOSzEsCkBAIC02NzUsNCArNzE3LDIwIEBACiAJcmV0dXJuIChjaGlwLT5pbmZvLT5mbGFncyAmIGZsYWdzKSA9PSBmbGFnczsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbXY4OGU2eHh4X251bV9kYXRhYmFzZXMoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQoreworCXJldHVybiBjaGlwLT5pbmZvLT5udW1fZGF0YWJhc2VzOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBtdjg4ZTZ4eHhfbnVtX3BvcnRzKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKK3sKKwlyZXR1cm4gY2hpcC0+aW5mby0+bnVtX3BvcnRzOworfQorCitpbnQgbXY4OGU2eHh4X3JlYWQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgYWRkciwgaW50IHJlZywgdTE2ICp2YWwpOworaW50IG12ODhlNnh4eF93cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBhZGRyLCBpbnQgcmVnLCB1MTYgdmFsKTsKK2ludCBtdjg4ZTZ4eHhfdXBkYXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IGFkZHIsIGludCByZWcsCisJCSAgICAgdTE2IHVwZGF0ZSk7CitpbnQgbXY4OGU2eHh4X3dhaXQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgYWRkciwgaW50IHJlZywgdTE2IG1hc2spOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9xY2E4ay5jIGIvZHJpdmVycy9uZXQvZHNhL3FjYThrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNkZjcwZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9xY2E4ay5jCkBAIC0wLDAgKzEsMTA0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBGZWxpeCBGaWV0a2F1IDxuYmRAbmJkLm5hbWU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBHYWJvciBKdWhvcyA8anVob3NnQG9wZW53cnQub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDE1LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxNiBKb2huIENyaXNwaW4gPGpvaG5AcGhyb3plbi5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L2RzYS5oPgorI2luY2x1ZGUgPG5ldC9zd2l0Y2hkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2JyaWRnZS5oPgorI2luY2x1ZGUgPGxpbnV4L21kaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorCisjaW5jbHVkZSAicWNhOGsuaCIKKworI2RlZmluZSBNSUJfREVTQyhfcywgX28sIF9uKQlcCisJewkJCVwKKwkJLnNpemUgPSAoX3MpLAlcCisJCS5vZmZzZXQgPSAoX28pLAlcCisJCS5uYW1lID0gKF9uKSwJXAorCX0KKworc3RhdGljIGNvbnN0IHN0cnVjdCBxY2E4a19taWJfZGVzYyBhcjgzMjdfbWliW10gPSB7CisJTUlCX0RFU0MoMSwgMHgwMCwgIlJ4QnJvYWQiKSwKKwlNSUJfREVTQygxLCAweDA0LCAiUnhQYXVzZSIpLAorCU1JQl9ERVNDKDEsIDB4MDgsICJSeE11bHRpIiksCisJTUlCX0RFU0MoMSwgMHgwYywgIlJ4RmNzRXJyIiksCisJTUlCX0RFU0MoMSwgMHgxMCwgIlJ4QWxpZ25FcnIiKSwKKwlNSUJfREVTQygxLCAweDE0LCAiUnhSdW50IiksCisJTUlCX0RFU0MoMSwgMHgxOCwgIlJ4RnJhZ21lbnQiKSwKKwlNSUJfREVTQygxLCAweDFjLCAiUng2NEJ5dGUiKSwKKwlNSUJfREVTQygxLCAweDIwLCAiUngxMjhCeXRlIiksCisJTUlCX0RFU0MoMSwgMHgyNCwgIlJ4MjU2Qnl0ZSIpLAorCU1JQl9ERVNDKDEsIDB4MjgsICJSeDUxMkJ5dGUiKSwKKwlNSUJfREVTQygxLCAweDJjLCAiUngxMDI0Qnl0ZSIpLAorCU1JQl9ERVNDKDEsIDB4MzAsICJSeDE1MThCeXRlIiksCisJTUlCX0RFU0MoMSwgMHgzNCwgIlJ4TWF4Qnl0ZSIpLAorCU1JQl9ERVNDKDEsIDB4MzgsICJSeFRvb0xvbmciKSwKKwlNSUJfREVTQygyLCAweDNjLCAiUnhHb29kQnl0ZSIpLAorCU1JQl9ERVNDKDIsIDB4NDQsICJSeEJhZEJ5dGUiKSwKKwlNSUJfREVTQygxLCAweDRjLCAiUnhPdmVyRmxvdyIpLAorCU1JQl9ERVNDKDEsIDB4NTAsICJGaWx0ZXJlZCIpLAorCU1JQl9ERVNDKDEsIDB4NTQsICJUeEJyb2FkIiksCisJTUlCX0RFU0MoMSwgMHg1OCwgIlR4UGF1c2UiKSwKKwlNSUJfREVTQygxLCAweDVjLCAiVHhNdWx0aSIpLAorCU1JQl9ERVNDKDEsIDB4NjAsICJUeFVuZGVyUnVuIiksCisJTUlCX0RFU0MoMSwgMHg2NCwgIlR4NjRCeXRlIiksCisJTUlCX0RFU0MoMSwgMHg2OCwgIlR4MTI4Qnl0ZSIpLAorCU1JQl9ERVNDKDEsIDB4NmMsICJUeDI1NkJ5dGUiKSwKKwlNSUJfREVTQygxLCAweDcwLCAiVHg1MTJCeXRlIiksCisJTUlCX0RFU0MoMSwgMHg3NCwgIlR4MTAyNEJ5dGUiKSwKKwlNSUJfREVTQygxLCAweDc4LCAiVHgxNTE4Qnl0ZSIpLAorCU1JQl9ERVNDKDEsIDB4N2MsICJUeE1heEJ5dGUiKSwKKwlNSUJfREVTQygxLCAweDgwLCAiVHhPdmVyU2l6ZSIpLAorCU1JQl9ERVNDKDIsIDB4ODQsICJUeEJ5dGUiKSwKKwlNSUJfREVTQygxLCAweDhjLCAiVHhDb2xsaXNpb24iKSwKKwlNSUJfREVTQygxLCAweDkwLCAiVHhBYm9ydENvbCIpLAorCU1JQl9ERVNDKDEsIDB4OTQsICJUeE11bHRpQ29sIiksCisJTUlCX0RFU0MoMSwgMHg5OCwgIlR4U2luZ2xlQ29sIiksCisJTUlCX0RFU0MoMSwgMHg5YywgIlR4RXhjRGVmZXIiKSwKKwlNSUJfREVTQygxLCAweGEwLCAiVHhEZWZlciIpLAorCU1JQl9ERVNDKDEsIDB4YTQsICJUeExhdGVDb2wiKSwKK307CisKKy8qIFRoZSAzMmJpdCBzd2l0Y2ggcmVnaXN0ZXJzIGFyZSBhY2Nlc3NlZCBpbmRpcmVjdGx5LiBUbyBhY2hpZXZlIHRoaXMgd2UgbmVlZAorICogdG8gc2V0IHRoZSBwYWdlIG9mIHRoZSByZWdpc3Rlci4gVHJhY2sgdGhlIGxhc3QgcGFnZSB0aGF0IHdhcyBzZXQgdG8gcmVkdWNlCisgKiBtZGlvIHdyaXRlcworICovCitzdGF0aWMgdTE2IHFjYThrX2N1cnJlbnRfcGFnZSA9IDB4ZmZmZjsKKworc3RhdGljIHZvaWQKK3FjYThrX3NwbGl0X2FkZHIodTMyIHJlZ2FkZHIsIHUxNiAqcjEsIHUxNiAqcjIsIHUxNiAqcGFnZSkKK3sKKwlyZWdhZGRyID4+PSAxOworCSpyMSA9IHJlZ2FkZHIgJiAweDFlOworCisJcmVnYWRkciA+Pj0gNTsKKwkqcjIgPSByZWdhZGRyICYgMHg3OworCisJcmVnYWRkciA+Pj0gMzsKKwkqcGFnZSA9IHJlZ2FkZHIgJiAweDNmZjsKK30KKworc3RhdGljIHUzMgorcWNhOGtfbWlpX3JlYWQzMihzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgcGh5X2lkLCB1MzIgcmVnbnVtKQoreworCXUzMiB2YWw7CisJaW50IHJldDsKKworCXJldCA9IGJ1cy0+cmVhZChidXMsIHBoeV9pZCwgcmVnbnVtKTsKKwlpZiAocmV0ID49IDApIHsKKwkJdmFsID0gcmV0OworCQlyZXQgPSBidXMtPnJlYWQoYnVzLCBwaHlfaWQsIHJlZ251bSArIDEpOworCQl2YWwgfD0gcmV0IDw8IDE2OworCX0KKworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoJmJ1cy0+ZGV2LAorCQkJCSAgICAiZmFpbGVkIHRvIHJlYWQgcWNhOGsgMzJiaXQgcmVnaXN0ZXJcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkCitxY2E4a19taWlfd3JpdGUzMihzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgcGh5X2lkLCB1MzIgcmVnbnVtLCB1MzIgdmFsKQoreworCXUxNiBsbywgaGk7CisJaW50IHJldDsKKworCWxvID0gdmFsICYgMHhmZmZmOworCWhpID0gKHUxNikodmFsID4+IDE2KTsKKworCXJldCA9IGJ1cy0+d3JpdGUoYnVzLCBwaHlfaWQsIHJlZ251bSwgbG8pOworCWlmIChyZXQgPj0gMCkKKwkJcmV0ID0gYnVzLT53cml0ZShidXMsIHBoeV9pZCwgcmVnbnVtICsgMSwgaGkpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyX3JhdGVsaW1pdGVkKCZidXMtPmRldiwKKwkJCQkgICAgImZhaWxlZCB0byB3cml0ZSBxY2E4ayAzMmJpdCByZWdpc3RlclxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitxY2E4a19zZXRfcGFnZShzdHJ1Y3QgbWlpX2J1cyAqYnVzLCB1MTYgcGFnZSkKK3sKKwlpZiAocGFnZSA9PSBxY2E4a19jdXJyZW50X3BhZ2UpCisJCXJldHVybjsKKworCWlmIChidXMtPndyaXRlKGJ1cywgMHgxOCwgMCwgcGFnZSkgPCAwKQorCQlkZXZfZXJyX3JhdGVsaW1pdGVkKCZidXMtPmRldiwKKwkJCQkgICAgImZhaWxlZCB0byBzZXQgcWNhOGsgcGFnZVxuIik7CisJcWNhOGtfY3VycmVudF9wYWdlID0gcGFnZTsKK30KKworc3RhdGljIHUzMgorcWNhOGtfcmVhZChzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiwgdTMyIHJlZykKK3sKKwl1MTYgcjEsIHIyLCBwYWdlOworCXUzMiB2YWw7CisKKwlxY2E4a19zcGxpdF9hZGRyKHJlZywgJnIxLCAmcjIsICZwYWdlKTsKKworCW11dGV4X2xvY2tfbmVzdGVkKCZwcml2LT5idXMtPm1kaW9fbG9jaywgTURJT19NVVRFWF9ORVNURUQpOworCisJcWNhOGtfc2V0X3BhZ2UocHJpdi0+YnVzLCBwYWdlKTsKKwl2YWwgPSBxY2E4a19taWlfcmVhZDMyKHByaXYtPmJ1cywgMHgxMCB8IHIyLCByMSk7CisKKwltdXRleF91bmxvY2soJnByaXYtPmJ1cy0+bWRpb19sb2NrKTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkCitxY2E4a193cml0ZShzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiwgdTMyIHJlZywgdTMyIHZhbCkKK3sKKwl1MTYgcjEsIHIyLCBwYWdlOworCisJcWNhOGtfc3BsaXRfYWRkcihyZWcsICZyMSwgJnIyLCAmcGFnZSk7CisKKwltdXRleF9sb2NrX25lc3RlZCgmcHJpdi0+YnVzLT5tZGlvX2xvY2ssIE1ESU9fTVVURVhfTkVTVEVEKTsKKworCXFjYThrX3NldF9wYWdlKHByaXYtPmJ1cywgcGFnZSk7CisJcWNhOGtfbWlpX3dyaXRlMzIocHJpdi0+YnVzLCAweDEwIHwgcjIsIHIxLCB2YWwpOworCisJbXV0ZXhfdW5sb2NrKCZwcml2LT5idXMtPm1kaW9fbG9jayk7Cit9CisKK3N0YXRpYyB1MzIKK3FjYThrX3JtdyhzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiwgdTMyIHJlZywgdTMyIG1hc2ssIHUzMiB2YWwpCit7CisJdTE2IHIxLCByMiwgcGFnZTsKKwl1MzIgcmV0OworCisJcWNhOGtfc3BsaXRfYWRkcihyZWcsICZyMSwgJnIyLCAmcGFnZSk7CisKKwltdXRleF9sb2NrX25lc3RlZCgmcHJpdi0+YnVzLT5tZGlvX2xvY2ssIE1ESU9fTVVURVhfTkVTVEVEKTsKKworCXFjYThrX3NldF9wYWdlKHByaXYtPmJ1cywgcGFnZSk7CisJcmV0ID0gcWNhOGtfbWlpX3JlYWQzMihwcml2LT5idXMsIDB4MTAgfCByMiwgcjEpOworCXJldCAmPSB+bWFzazsKKwlyZXQgfD0gdmFsOworCXFjYThrX21paV93cml0ZTMyKHByaXYtPmJ1cywgMHgxMCB8IHIyLCByMSwgcmV0KTsKKworCW11dGV4X3VubG9jaygmcHJpdi0+YnVzLT5tZGlvX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK3FjYThrX3JlZ19zZXQoc3RydWN0IHFjYThrX3ByaXYgKnByaXYsIHUzMiByZWcsIHUzMiB2YWwpCit7CisJcWNhOGtfcm13KHByaXYsIHJlZywgMCwgdmFsKTsKK30KKworc3RhdGljIHZvaWQKK3FjYThrX3JlZ19jbGVhcihzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiwgdTMyIHJlZywgdTMyIHZhbCkKK3sKKwlxY2E4a19ybXcocHJpdiwgcmVnLCB2YWwsIDApOworfQorCitzdGF0aWMgaW50CitxY2E4a19yZWdtYXBfcmVhZCh2b2lkICpjdHgsIHVpbnQzMl90IHJlZywgdWludDMyX3QgKnZhbCkKK3sKKwlzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcWNhOGtfcHJpdiAqKWN0eDsKKworCSp2YWwgPSBxY2E4a19yZWFkKHByaXYsIHJlZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcWNhOGtfcmVnbWFwX3dyaXRlKHZvaWQgKmN0eCwgdWludDMyX3QgcmVnLCB1aW50MzJfdCB2YWwpCit7CisJc3RydWN0IHFjYThrX3ByaXYgKnByaXYgPSAoc3RydWN0IHFjYThrX3ByaXYgKiljdHg7CisKKwlxY2E4a193cml0ZShwcml2LCByZWcsIHZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfcmFuZ2UgcWNhOGtfcmVhZGFibGVfcmFuZ2VzW10gPSB7CisJcmVnbWFwX3JlZ19yYW5nZSgweDAwMDAsIDB4MDBlNCksIC8qIEdsb2JhbCBjb250cm9sICovCisJcmVnbWFwX3JlZ19yYW5nZSgweDAxMDAsIDB4MDE2OCksIC8qIEVFRSBjb250cm9sICovCisJcmVnbWFwX3JlZ19yYW5nZSgweDAyMDAsIDB4MDI3MCksIC8qIFBhcnNlciBjb250cm9sICovCisJcmVnbWFwX3JlZ19yYW5nZSgweDA0MDAsIDB4MDQ1NCksIC8qIEFDTCAqLworCXJlZ21hcF9yZWdfcmFuZ2UoMHgwNjAwLCAweDA3MTgpLCAvKiBMb29rdXAgKi8KKwlyZWdtYXBfcmVnX3JhbmdlKDB4MDgwMCwgMHgwYjcwKSwgLyogUU0gKi8KKwlyZWdtYXBfcmVnX3JhbmdlKDB4MGMwMCwgMHgwYzgwKSwgLyogUEtUICovCisJcmVnbWFwX3JlZ19yYW5nZSgweDBlMDAsIDB4MGU5OCksIC8qIEwzICovCisJcmVnbWFwX3JlZ19yYW5nZSgweDEwMDAsIDB4MTBhYyksIC8qIE1JQiAtIFBvcnQwICovCisJcmVnbWFwX3JlZ19yYW5nZSgweDExMDAsIDB4MTFhYyksIC8qIE1JQiAtIFBvcnQxICovCisJcmVnbWFwX3JlZ19yYW5nZSgweDEyMDAsIDB4MTJhYyksIC8qIE1JQiAtIFBvcnQyICovCisJcmVnbWFwX3JlZ19yYW5nZSgweDEzMDAsIDB4MTNhYyksIC8qIE1JQiAtIFBvcnQzICovCisJcmVnbWFwX3JlZ19yYW5nZSgweDE0MDAsIDB4MTRhYyksIC8qIE1JQiAtIFBvcnQ0ICovCisJcmVnbWFwX3JlZ19yYW5nZSgweDE1MDAsIDB4MTVhYyksIC8qIE1JQiAtIFBvcnQ1ICovCisJcmVnbWFwX3JlZ19yYW5nZSgweDE2MDAsIDB4MTZhYyksIC8qIE1JQiAtIFBvcnQ2ICovCisKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwX2FjY2Vzc190YWJsZSBxY2E4a19yZWFkYWJsZV90YWJsZSA9IHsKKwkueWVzX3JhbmdlcyA9IHFjYThrX3JlYWRhYmxlX3JhbmdlcywKKwkubl95ZXNfcmFuZ2VzID0gQVJSQVlfU0laRShxY2E4a19yZWFkYWJsZV9yYW5nZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCByZWdtYXBfY29uZmlnIHFjYThrX3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzID0gMTYsCisJLnZhbF9iaXRzID0gMzIsCisJLnJlZ19zdHJpZGUgPSA0LAorCS5tYXhfcmVnaXN0ZXIgPSAweDE2YWMsIC8qIGVuZCBNSUIgLSBQb3J0NiByYW5nZSAqLworCS5yZWdfcmVhZCA9IHFjYThrX3JlZ21hcF9yZWFkLAorCS5yZWdfd3JpdGUgPSBxY2E4a19yZWdtYXBfd3JpdGUsCisJLnJkX3RhYmxlID0gJnFjYThrX3JlYWRhYmxlX3RhYmxlLAorfTsKKworc3RhdGljIGludAorcWNhOGtfYnVzeV93YWl0KHN0cnVjdCBxY2E4a19wcml2ICpwcml2LCB1MzIgcmVnLCB1MzIgbWFzaykKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjApOworCisJLyogbG9vcCB1bnRpbCB0aGUgYnVzeSBmbGFnIGhhcyBjbGVhcmVkICovCisJZG8geworCQl1MzIgdmFsID0gcWNhOGtfcmVhZChwcml2LCByZWcpOworCQlpbnQgYnVzeSA9IHZhbCAmIG1hc2s7CisKKwkJaWYgKCFidXN5KQorCQkJYnJlYWs7CisJCWNvbmRfcmVzY2hlZCgpOworCX0gd2hpbGUgKCF0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRpbWVvdXQpKTsKKworCXJldHVybiB0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRpbWVvdXQpOworfQorCitzdGF0aWMgdm9pZAorcWNhOGtfZmRiX3JlYWQoc3RydWN0IHFjYThrX3ByaXYgKnByaXYsIHN0cnVjdCBxY2E4a19mZGIgKmZkYikKK3sKKwl1MzIgcmVnWzRdOworCWludCBpOworCisJLyogbG9hZCB0aGUgQVJMIHRhYmxlIGludG8gYW4gYXJyYXkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQlyZWdbaV0gPSBxY2E4a19yZWFkKHByaXYsIFFDQThLX1JFR19BVFVfREFUQTAgKyAoaSAqIDQpKTsKKworCS8qIHZpZCAtIDgzOjcyICovCisJZmRiLT52aWQgPSAocmVnWzJdID4+IFFDQThLX0FUVV9WSURfUykgJiBRQ0E4S19BVFVfVklEX007CisJLyogYWdpbmcgLSA2Nzo2NCAqLworCWZkYi0+YWdpbmcgPSByZWdbMl0gJiBRQ0E4S19BVFVfU1RBVFVTX007CisJLyogcG9ydG1hc2sgLSA1NDo0OCAqLworCWZkYi0+cG9ydF9tYXNrID0gKHJlZ1sxXSA+PiBRQ0E4S19BVFVfUE9SVF9TKSAmIFFDQThLX0FUVV9QT1JUX007CisJLyogbWFjIC0gNDc6MCAqLworCWZkYi0+bWFjWzBdID0gKHJlZ1sxXSA+PiBRQ0E4S19BVFVfQUREUjBfUykgJiAweGZmOworCWZkYi0+bWFjWzFdID0gcmVnWzFdICYgMHhmZjsKKwlmZGItPm1hY1syXSA9IChyZWdbMF0gPj4gUUNBOEtfQVRVX0FERFIyX1MpICYgMHhmZjsKKwlmZGItPm1hY1szXSA9IChyZWdbMF0gPj4gUUNBOEtfQVRVX0FERFIzX1MpICYgMHhmZjsKKwlmZGItPm1hY1s0XSA9IChyZWdbMF0gPj4gUUNBOEtfQVRVX0FERFI0X1MpICYgMHhmZjsKKwlmZGItPm1hY1s1XSA9IHJlZ1swXSAmIDB4ZmY7Cit9CisKK3N0YXRpYyB2b2lkCitxY2E4a19mZGJfd3JpdGUoc3RydWN0IHFjYThrX3ByaXYgKnByaXYsIHUxNiB2aWQsIHU4IHBvcnRfbWFzaywgY29uc3QgdTggKm1hYywKKwkJdTggYWdpbmcpCit7CisJdTMyIHJlZ1szXSA9IHsgMCB9OworCWludCBpOworCisJLyogdmlkIC0gODM6NzIgKi8KKwlyZWdbMl0gPSAodmlkICYgUUNBOEtfQVRVX1ZJRF9NKSA8PCBRQ0E4S19BVFVfVklEX1M7CisJLyogYWdpbmcgLSA2Nzo2NCAqLworCXJlZ1syXSB8PSBhZ2luZyAmIFFDQThLX0FUVV9TVEFUVVNfTTsKKwkvKiBwb3J0bWFzayAtIDU0OjQ4ICovCisJcmVnWzFdID0gKHBvcnRfbWFzayAmIFFDQThLX0FUVV9QT1JUX00pIDw8IFFDQThLX0FUVV9QT1JUX1M7CisJLyogbWFjIC0gNDc6MCAqLworCXJlZ1sxXSB8PSBtYWNbMF0gPDwgUUNBOEtfQVRVX0FERFIwX1M7CisJcmVnWzFdIHw9IG1hY1sxXTsKKwlyZWdbMF0gfD0gbWFjWzJdIDw8IFFDQThLX0FUVV9BRERSMl9TOworCXJlZ1swXSB8PSBtYWNbM10gPDwgUUNBOEtfQVRVX0FERFIzX1M7CisJcmVnWzBdIHw9IG1hY1s0XSA8PCBRQ0E4S19BVFVfQUREUjRfUzsKKwlyZWdbMF0gfD0gbWFjWzVdOworCisJLyogbG9hZCB0aGUgYXJyYXkgaW50byB0aGUgQVJMIHRhYmxlICovCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJcWNhOGtfd3JpdGUocHJpdiwgUUNBOEtfUkVHX0FUVV9EQVRBMCArIChpICogNCksIHJlZ1tpXSk7Cit9CisKK3N0YXRpYyBpbnQKK3FjYThrX2ZkYl9hY2Nlc3Moc3RydWN0IHFjYThrX3ByaXYgKnByaXYsIGVudW0gcWNhOGtfZmRiX2NtZCBjbWQsIGludCBwb3J0KQoreworCXUzMiByZWc7CisKKwkvKiBTZXQgdGhlIGNvbW1hbmQgYW5kIEZEQiBpbmRleCAqLworCXJlZyA9IFFDQThLX0FUVV9GVU5DX0JVU1k7CisJcmVnIHw9IGNtZDsKKwlpZiAocG9ydCA+PSAwKSB7CisJCXJlZyB8PSBRQ0E4S19BVFVfRlVOQ19QT1JUX0VOOworCQlyZWcgfD0gKHBvcnQgJiBRQ0E4S19BVFVfRlVOQ19QT1JUX00pIDw8IFFDQThLX0FUVV9GVU5DX1BPUlRfUzsKKwl9CisKKwkvKiBXcml0ZSB0aGUgZnVuY3Rpb24gcmVnaXN0ZXIgdHJpZ2dlcmluZyB0aGUgdGFibGUgYWNjZXNzICovCisJcWNhOGtfd3JpdGUocHJpdiwgUUNBOEtfUkVHX0FUVV9GVU5DLCByZWcpOworCisJLyogd2FpdCBmb3IgY29tcGxldGlvbiAqLworCWlmIChxY2E4a19idXN5X3dhaXQocHJpdiwgUUNBOEtfUkVHX0FUVV9GVU5DLCBRQ0E4S19BVFVfRlVOQ19CVVNZKSkKKwkJcmV0dXJuIC0xOworCisJLyogQ2hlY2sgZm9yIHRhYmxlIGZ1bGwgdmlvbGF0aW9uIHdoZW4gYWRkaW5nIGFuIGVudHJ5ICovCisJaWYgKGNtZCA9PSBRQ0E4S19GREJfTE9BRCkgeworCQlyZWcgPSBxY2E4a19yZWFkKHByaXYsIFFDQThLX1JFR19BVFVfRlVOQyk7CisJCWlmIChyZWcgJiBRQ0E4S19BVFVfRlVOQ19GVUxMKQorCQkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitxY2E4a19mZGJfbmV4dChzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiwgc3RydWN0IHFjYThrX2ZkYiAqZmRiLCBpbnQgcG9ydCkKK3sKKwlpbnQgcmV0OworCisJcWNhOGtfZmRiX3dyaXRlKHByaXYsIGZkYi0+dmlkLCBmZGItPnBvcnRfbWFzaywgZmRiLT5tYWMsIGZkYi0+YWdpbmcpOworCXJldCA9IHFjYThrX2ZkYl9hY2Nlc3MocHJpdiwgUUNBOEtfRkRCX05FWFQsIHBvcnQpOworCWlmIChyZXQgPj0gMCkKKwkJcWNhOGtfZmRiX3JlYWQocHJpdiwgZmRiKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK3FjYThrX2ZkYl9hZGQoc3RydWN0IHFjYThrX3ByaXYgKnByaXYsIGNvbnN0IHU4ICptYWMsIHUxNiBwb3J0X21hc2ssCisJICAgICAgdTE2IHZpZCwgdTggYWdpbmcpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnByaXYtPnJlZ19tdXRleCk7CisJcWNhOGtfZmRiX3dyaXRlKHByaXYsIHZpZCwgcG9ydF9tYXNrLCBtYWMsIGFnaW5nKTsKKwlyZXQgPSBxY2E4a19mZGJfYWNjZXNzKHByaXYsIFFDQThLX0ZEQl9MT0FELCAtMSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5yZWdfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorcWNhOGtfZmRiX2RlbChzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiwgY29uc3QgdTggKm1hYywgdTE2IHBvcnRfbWFzaywgdTE2IHZpZCkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmcHJpdi0+cmVnX211dGV4KTsKKwlxY2E4a19mZGJfd3JpdGUocHJpdiwgdmlkLCBwb3J0X21hc2ssIG1hYywgMCk7CisJcmV0ID0gcWNhOGtfZmRiX2FjY2Vzcyhwcml2LCBRQ0E4S19GREJfUFVSR0UsIC0xKTsKKwltdXRleF91bmxvY2soJnByaXYtPnJlZ19tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorcWNhOGtfZmRiX2ZsdXNoKHN0cnVjdCBxY2E4a19wcml2ICpwcml2KQoreworCW11dGV4X2xvY2soJnByaXYtPnJlZ19tdXRleCk7CisJcWNhOGtfZmRiX2FjY2Vzcyhwcml2LCBRQ0E4S19GREJfRkxVU0gsIC0xKTsKKwltdXRleF91bmxvY2soJnByaXYtPnJlZ19tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkCitxY2E4a19taWJfaW5pdChzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdikKK3sKKwltdXRleF9sb2NrKCZwcml2LT5yZWdfbXV0ZXgpOworCXFjYThrX3JlZ19zZXQocHJpdiwgUUNBOEtfUkVHX01JQiwgUUNBOEtfTUlCX0ZMVVNIIHwgUUNBOEtfTUlCX0JVU1kpOworCXFjYThrX2J1c3lfd2FpdChwcml2LCBRQ0E4S19SRUdfTUlCLCBRQ0E4S19NSUJfQlVTWSk7CisJcWNhOGtfcmVnX3NldChwcml2LCBRQ0E4S19SRUdfTUlCLCBRQ0E4S19NSUJfQ1BVX0tFRVApOworCXFjYThrX3dyaXRlKHByaXYsIFFDQThLX1JFR19NT0RVTEVfRU4sIFFDQThLX01PRFVMRV9FTl9NSUIpOworCW11dGV4X3VubG9jaygmcHJpdi0+cmVnX211dGV4KTsKK30KKworc3RhdGljIGludAorcWNhOGtfc2V0X3BhZF9jdHJsKHN0cnVjdCBxY2E4a19wcml2ICpwcml2LCBpbnQgcG9ydCwgaW50IG1vZGUpCit7CisJdTMyIHJlZzsKKworCXN3aXRjaCAocG9ydCkgeworCWNhc2UgMDoKKwkJcmVnID0gUUNBOEtfUkVHX1BPUlQwX1BBRF9DVFJMOworCQlicmVhazsKKwljYXNlIDY6CisJCXJlZyA9IFFDQThLX1JFR19QT1JUNl9QQURfQ1RSTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCJDYW4ndCBzZXQgUEFEX0NUUkwgb24gcG9ydCAlZFxuIiwgcG9ydCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENvbmZpZ3VyZSBhIHBvcnQgdG8gYmUgZGlyZWN0bHkgY29ubmVjdGVkIHRvIGFuIGV4dGVybmFsCisJICogUEhZIG9yIE1BQy4KKwkgKi8KKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSToKKwkJcWNhOGtfd3JpdGUocHJpdiwgcmVnLAorCQkJICAgIFFDQThLX1BPUlRfUEFEX1JHTUlJX0VOIHwKKwkJCSAgICBRQ0E4S19QT1JUX1BBRF9SR01JSV9UWF9ERUxBWSgzKSB8CisJCQkgICAgUUNBOEtfUE9SVF9QQURfUkdNSUlfUlhfREVMQVkoMykpOworCisJCS8qIEFjY29yZGluZyB0byB0aGUgZGF0YXNoZWV0LCBSR01JSSBkZWxheSBpcyBlbmFibGVkIHRocm91Z2gKKwkJICogUE9SVDVfUEFEX0NUUkwgZm9yIGFsbCBwb3J0cywgcmF0aGVyIHRoYW4gaW5kaXZpZHVhbCBwb3J0CisJCSAqIHJlZ2lzdGVycworCQkgKi8KKwkJcWNhOGtfd3JpdGUocHJpdiwgUUNBOEtfUkVHX1BPUlQ1X1BBRF9DVFJMLAorCQkJICAgIFFDQThLX1BPUlRfUEFEX1JHTUlJX1JYX0RFTEFZX0VOKTsKKwkJYnJlYWs7CisJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfU0dNSUk6CisJCXFjYThrX3dyaXRlKHByaXYsIHJlZywgUUNBOEtfUE9SVF9QQURfU0dNSUlfRU4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoInhNSUkgbW9kZSAlZCBub3Qgc3VwcG9ydGVkXG4iLCBtb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitxY2E4a19wb3J0X3NldF9zdGF0dXMoc3RydWN0IHFjYThrX3ByaXYgKnByaXYsIGludCBwb3J0LCBpbnQgZW5hYmxlKQoreworCXUzMiBtYXNrID0gUUNBOEtfUE9SVF9TVEFUVVNfVFhNQUM7CisKKwkvKiBQb3J0IDAgYW5kIDYgaGF2ZSBubyBpbnRlcm5hbCBQSFkgKi8KKwlpZiAoKHBvcnQgPiAwKSAmJiAocG9ydCA8IDYpKQorCQltYXNrIHw9IFFDQThLX1BPUlRfU1RBVFVTX0xJTktfQVVUTzsKKworCWlmIChlbmFibGUpCisJCXFjYThrX3JlZ19zZXQocHJpdiwgUUNBOEtfUkVHX1BPUlRfU1RBVFVTKHBvcnQpLCBtYXNrKTsKKwllbHNlCisJCXFjYThrX3JlZ19jbGVhcihwcml2LCBRQ0E4S19SRUdfUE9SVF9TVEFUVVMocG9ydCksIG1hc2spOworfQorCitzdGF0aWMgaW50CitxY2E4a19zZXR1cChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCit7CisJc3RydWN0IHFjYThrX3ByaXYgKnByaXYgPSAoc3RydWN0IHFjYThrX3ByaXYgKilkcy0+cHJpdjsKKwlpbnQgcmV0LCBpLCBwaHlfbW9kZSA9IC0xOworCisJLyogTWFrZSBzdXJlIHRoYXQgcG9ydCAwIGlzIHRoZSBjcHUgcG9ydCAqLworCWlmICghZHNhX2lzX2NwdV9wb3J0KGRzLCAwKSkgeworCQlwcl9lcnIoInBvcnQgMCBpcyBub3QgdGhlIENQVSBwb3J0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfaW5pdCgmcHJpdi0+cmVnX211dGV4KTsKKworCS8qIFN0YXJ0IGJ5IHNldHRpbmcgdXAgdGhlIHJlZ2lzdGVyIG1hcHBpbmcgKi8KKwlwcml2LT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0KGRzLT5kZXYsIE5VTEwsIHByaXYsCisJCQkJCSZxY2E4a19yZWdtYXBfY29uZmlnKTsKKwlpZiAoSVNfRVJSKHByaXYtPnJlZ21hcCkpCisJCXByX3dhcm4oInJlZ21hcCBpbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKKworCS8qIEluaXRpYWxpemUgQ1BVIHBvcnQgcGFkIG1vZGUgKHhNSUkgdHlwZSwgZGVsYXlzLi4uKSAqLworCXBoeV9tb2RlID0gb2ZfZ2V0X3BoeV9tb2RlKGRzLT5wb3J0c1tkcy0+ZHN0LT5jcHVfcG9ydF0uZG4pOworCWlmIChwaHlfbW9kZSA8IDApIHsKKwkJcHJfZXJyKCJDYW4ndCBmaW5kIHBoeS1tb2RlIGZvciBtYXN0ZXIgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIHBoeV9tb2RlOworCX0KKwlyZXQgPSBxY2E4a19zZXRfcGFkX2N0cmwocHJpdiwgUUNBOEtfQ1BVX1BPUlQsIHBoeV9tb2RlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIEVuYWJsZSBDUFUgUG9ydCAqLworCXFjYThrX3JlZ19zZXQocHJpdiwgUUNBOEtfUkVHX0dMT0JBTF9GV19DVFJMMCwKKwkJICAgICAgUUNBOEtfR0xPQkFMX0ZXX0NUUkwwX0NQVV9QT1JUX0VOKTsKKwlxY2E4a19wb3J0X3NldF9zdGF0dXMocHJpdiwgUUNBOEtfQ1BVX1BPUlQsIDEpOworCXByaXYtPnBvcnRfc3RzW1FDQThLX0NQVV9QT1JUXS5lbmFibGVkID0gMTsKKworCS8qIEVuYWJsZSBNSUIgY291bnRlcnMgKi8KKwlxY2E4a19taWJfaW5pdChwcml2KTsKKworCS8qIEVuYWJsZSBRQ0EgaGVhZGVyIG1vZGUgb24gdGhlIGNwdSBwb3J0ICovCisJcWNhOGtfd3JpdGUocHJpdiwgUUNBOEtfUkVHX1BPUlRfSERSX0NUUkwoUUNBOEtfQ1BVX1BPUlQpLAorCQkgICAgUUNBOEtfUE9SVF9IRFJfQ1RSTF9BTEwgPDwgUUNBOEtfUE9SVF9IRFJfQ1RSTF9UWF9TIHwKKwkJICAgIFFDQThLX1BPUlRfSERSX0NUUkxfQUxMIDw8IFFDQThLX1BPUlRfSERSX0NUUkxfUlhfUyk7CisKKwkvKiBEaXNhYmxlIGZvcndhcmRpbmcgYnkgZGVmYXVsdCBvbiBhbGwgcG9ydHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUUNBOEtfTlVNX1BPUlRTOyBpKyspCisJCXFjYThrX3Jtdyhwcml2LCBRQ0E4S19QT1JUX0xPT0tVUF9DVFJMKGkpLAorCQkJICBRQ0E4S19QT1JUX0xPT0tVUF9NRU1CRVIsIDApOworCisJLyogRGlzYWJsZSBNQUMgYnkgZGVmYXVsdCBvbiBhbGwgdXNlciBwb3J0cyAqLworCWZvciAoaSA9IDE7IGkgPCBRQ0E4S19OVU1fUE9SVFM7IGkrKykKKwkJaWYgKGRzLT5lbmFibGVkX3BvcnRfbWFzayAmIEJJVChpKSkKKwkJCXFjYThrX3BvcnRfc2V0X3N0YXR1cyhwcml2LCBpLCAwKTsKKworCS8qIEZvcndhcmQgYWxsIHVua25vd24gZnJhbWVzIHRvIENQVSBwb3J0IGZvciBMaW51eCBwcm9jZXNzaW5nICovCisJcWNhOGtfd3JpdGUocHJpdiwgUUNBOEtfUkVHX0dMT0JBTF9GV19DVFJMMSwKKwkJICAgIEJJVCgwKSA8PCBRQ0E4S19HTE9CQUxfRldfQ1RSTDFfSUdNUF9EUF9TIHwKKwkJICAgIEJJVCgwKSA8PCBRQ0E4S19HTE9CQUxfRldfQ1RSTDFfQkNfRFBfUyB8CisJCSAgICBCSVQoMCkgPDwgUUNBOEtfR0xPQkFMX0ZXX0NUUkwxX01DX0RQX1MgfAorCQkgICAgQklUKDApIDw8IFFDQThLX0dMT0JBTF9GV19DVFJMMV9VQ19EUF9TKTsKKworCS8qIFNldHVwIGNvbm5lY3Rpb24gYmV0d2VlbiBDUFUgcG9ydCAmIHVzZXIgcG9ydHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgRFNBX01BWF9QT1JUUzsgaSsrKSB7CisJCS8qIENQVSBwb3J0IGdldHMgY29ubmVjdGVkIHRvIGFsbCB1c2VyIHBvcnRzIG9mIHRoZSBzd2l0Y2ggKi8KKwkJaWYgKGRzYV9pc19jcHVfcG9ydChkcywgaSkpIHsKKwkJCXFjYThrX3Jtdyhwcml2LCBRQ0E4S19QT1JUX0xPT0tVUF9DVFJMKFFDQThLX0NQVV9QT1JUKSwKKwkJCQkgIFFDQThLX1BPUlRfTE9PS1VQX01FTUJFUiwKKwkJCQkgIGRzLT5lbmFibGVkX3BvcnRfbWFzayk7CisJCX0KKworCQkvKiBJbnZpdmlkdWFsIHVzZXIgcG9ydHMgZ2V0IGNvbm5lY3RlZCB0byBDUFUgcG9ydCBvbmx5ICovCisJCWlmIChkcy0+ZW5hYmxlZF9wb3J0X21hc2sgJiBCSVQoaSkpIHsKKwkJCWludCBzaGlmdCA9IDE2ICogKGkgJSAyKTsKKworCQkJcWNhOGtfcm13KHByaXYsIFFDQThLX1BPUlRfTE9PS1VQX0NUUkwoaSksCisJCQkJICBRQ0E4S19QT1JUX0xPT0tVUF9NRU1CRVIsCisJCQkJICBCSVQoUUNBOEtfQ1BVX1BPUlQpKTsKKworCQkJLyogRW5hYmxlIEFSUCBBdXRvLWxlYXJuaW5nIGJ5IGRlZmF1bHQgKi8KKwkJCXFjYThrX3JlZ19zZXQocHJpdiwgUUNBOEtfUE9SVF9MT09LVVBfQ1RSTChpKSwKKwkJCQkgICAgICBRQ0E4S19QT1JUX0xPT0tVUF9MRUFSTik7CisKKwkJCS8qIEZvciBwb3J0IGJhc2VkIHZsYW5zIHRvIHdvcmsgd2UgbmVlZCB0byBzZXQgdGhlCisJCQkgKiBkZWZhdWx0IGVncmVzcyB2aWQKKwkJCSAqLworCQkJcWNhOGtfcm13KHByaXYsIFFDQThLX0VHUkVTU19WTEFOKGkpLAorCQkJCSAgMHhmZmZmIDw8IHNoaWZ0LCAxIDw8IHNoaWZ0KTsKKwkJCXFjYThrX3dyaXRlKHByaXYsIFFDQThLX1JFR19QT1JUX1ZMQU5fQ1RSTDAoaSksCisJCQkJICAgIFFDQThLX1BPUlRfVkxBTl9DVklEKDEpIHwKKwkJCQkgICAgUUNBOEtfUE9SVF9WTEFOX1NWSUQoMSkpOworCQl9CisJfQorCisJLyogRmx1c2ggdGhlIEZEQiB0YWJsZSAqLworCXFjYThrX2ZkYl9mbHVzaChwcml2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitxY2E4a19waHlfcmVhZChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwaHksIGludCByZWdudW0pCit7CisJc3RydWN0IHFjYThrX3ByaXYgKnByaXYgPSAoc3RydWN0IHFjYThrX3ByaXYgKilkcy0+cHJpdjsKKworCXJldHVybiBtZGlvYnVzX3JlYWQocHJpdi0+YnVzLCBwaHksIHJlZ251bSk7Cit9CisKK3N0YXRpYyBpbnQKK3FjYThrX3BoeV93cml0ZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwaHksIGludCByZWdudW0sIHUxNiB2YWwpCit7CisJc3RydWN0IHFjYThrX3ByaXYgKnByaXYgPSAoc3RydWN0IHFjYThrX3ByaXYgKilkcy0+cHJpdjsKKworCXJldHVybiBtZGlvYnVzX3dyaXRlKHByaXYtPmJ1cywgcGh5LCByZWdudW0sIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkCitxY2E4a19nZXRfc3RyaW5ncyhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LCB1aW50OF90ICpkYXRhKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYXI4MzI3X21pYik7IGkrKykKKwkJc3RybmNweShkYXRhICsgaSAqIEVUSF9HU1RSSU5HX0xFTiwgYXI4MzI3X21pYltpXS5uYW1lLAorCQkJRVRIX0dTVFJJTkdfTEVOKTsKK30KKworc3RhdGljIHZvaWQKK3FjYThrX2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJCQl1aW50NjRfdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcWNhOGtfcHJpdiAqKWRzLT5wcml2OworCWNvbnN0IHN0cnVjdCBxY2E4a19taWJfZGVzYyAqbWliOworCXUzMiByZWcsIGk7CisJdTY0IGhpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYXI4MzI3X21pYik7IGkrKykgeworCQltaWIgPSAmYXI4MzI3X21pYltpXTsKKwkJcmVnID0gUUNBOEtfUE9SVF9NSUJfQ09VTlRFUihwb3J0KSArIG1pYi0+b2Zmc2V0OworCisJCWRhdGFbaV0gPSBxY2E4a19yZWFkKHByaXYsIHJlZyk7CisJCWlmIChtaWItPnNpemUgPT0gMikgeworCQkJaGkgPSBxY2E4a19yZWFkKHByaXYsIHJlZyArIDQpOworCQkJZGF0YVtpXSB8PSBoaSA8PCAzMjsKKwkJfQorCX0KK30KKworc3RhdGljIGludAorcWNhOGtfZ2V0X3NzZXRfY291bnQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQoreworCXJldHVybiBBUlJBWV9TSVpFKGFyODMyN19taWIpOworfQorCitzdGF0aWMgdm9pZAorcWNhOGtfZWVlX2VuYWJsZV9zZXQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwgYm9vbCBlbmFibGUpCit7CisJc3RydWN0IHFjYThrX3ByaXYgKnByaXYgPSAoc3RydWN0IHFjYThrX3ByaXYgKilkcy0+cHJpdjsKKwl1MzIgbHBpX2VuID0gUUNBOEtfUkVHX0VFRV9DVFJMX0xQSV9FTihwb3J0KTsKKwl1MzIgcmVnOworCisJbXV0ZXhfbG9jaygmcHJpdi0+cmVnX211dGV4KTsKKwlyZWcgPSBxY2E4a19yZWFkKHByaXYsIFFDQThLX1JFR19FRUVfQ1RSTCk7CisJaWYgKGVuYWJsZSkKKwkJcmVnIHw9IGxwaV9lbjsKKwllbHNlCisJCXJlZyAmPSB+bHBpX2VuOworCXFjYThrX3dyaXRlKHByaXYsIFFDQThLX1JFR19FRUVfQ1RSTCwgcmVnKTsKKwltdXRleF91bmxvY2soJnByaXYtPnJlZ19tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQKK3FjYThrX2VlZV9pbml0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJICAgICAgIHN0cnVjdCBwaHlfZGV2aWNlICpwaHkpCit7CisJc3RydWN0IHFjYThrX3ByaXYgKnByaXYgPSAoc3RydWN0IHFjYThrX3ByaXYgKilkcy0+cHJpdjsKKwlzdHJ1Y3QgZXRodG9vbF9lZWUgKnAgPSAmcHJpdi0+cG9ydF9zdHNbcG9ydF0uZWVlOworCWludCByZXQ7CisKKwlwLT5zdXBwb3J0ZWQgPSAoU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwpOworCisJcmV0ID0gcGh5X2luaXRfZWVlKHBoeSwgMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXFjYThrX2VlZV9lbmFibGVfc2V0KGRzLCBwb3J0LCB0cnVlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitxY2E4a19zZXRfZWVlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJICAgICAgc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwKKwkgICAgICBzdHJ1Y3QgZXRodG9vbF9lZWUgKmUpCit7CisJc3RydWN0IHFjYThrX3ByaXYgKnByaXYgPSAoc3RydWN0IHFjYThrX3ByaXYgKilkcy0+cHJpdjsKKwlzdHJ1Y3QgZXRodG9vbF9lZWUgKnAgPSAmcHJpdi0+cG9ydF9zdHNbcG9ydF0uZWVlOworCWludCByZXQgPSAwOworCisJcC0+ZWVlX2VuYWJsZWQgPSBlLT5lZWVfZW5hYmxlZDsKKworCWlmIChlLT5lZWVfZW5hYmxlZCkgeworCQlwLT5lZWVfZW5hYmxlZCA9IHFjYThrX2VlZV9pbml0KGRzLCBwb3J0LCBwaHlkZXYpOworCQlpZiAoIXAtPmVlZV9lbmFibGVkKQorCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJfQorCXFjYThrX2VlZV9lbmFibGVfc2V0KGRzLCBwb3J0LCBwLT5lZWVfZW5hYmxlZCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitxY2E4a19nZXRfZWVlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJICAgICAgc3RydWN0IGV0aHRvb2xfZWVlICplKQoreworCXN0cnVjdCBxY2E4a19wcml2ICpwcml2ID0gKHN0cnVjdCBxY2E4a19wcml2ICopZHMtPnByaXY7CisJc3RydWN0IGV0aHRvb2xfZWVlICpwID0gJnByaXYtPnBvcnRfc3RzW3BvcnRdLmVlZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZHMtPnBvcnRzW3BvcnRdLm5ldGRldjsKKwlpbnQgcmV0OworCisJcmV0ID0gcGh5X2V0aHRvb2xfZ2V0X2VlZShuZXRkZXYtPnBoeWRldiwgcCk7CisJaWYgKCFyZXQpCisJCWUtPmVlZV9hY3RpdmUgPQorCQkJISEocC0+c3VwcG9ydGVkICYgcC0+YWR2ZXJ0aXNlZCAmIHAtPmxwX2FkdmVydGlzZWQpOworCWVsc2UKKwkJZS0+ZWVlX2FjdGl2ZSA9IDA7CisKKwllLT5lZWVfZW5hYmxlZCA9IHAtPmVlZV9lbmFibGVkOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK3FjYThrX3BvcnRfc3RwX3N0YXRlX3NldChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LCB1OCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcWNhOGtfcHJpdiAqKWRzLT5wcml2OworCXUzMiBzdHBfc3RhdGU7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBCUl9TVEFURV9ESVNBQkxFRDoKKwkJc3RwX3N0YXRlID0gUUNBOEtfUE9SVF9MT09LVVBfU1RBVEVfRElTQUJMRUQ7CisJCWJyZWFrOworCWNhc2UgQlJfU1RBVEVfQkxPQ0tJTkc6CisJCXN0cF9zdGF0ZSA9IFFDQThLX1BPUlRfTE9PS1VQX1NUQVRFX0JMT0NLSU5HOworCQlicmVhazsKKwljYXNlIEJSX1NUQVRFX0xJU1RFTklORzoKKwkJc3RwX3N0YXRlID0gUUNBOEtfUE9SVF9MT09LVVBfU1RBVEVfTElTVEVOSU5HOworCQlicmVhazsKKwljYXNlIEJSX1NUQVRFX0xFQVJOSU5HOgorCQlzdHBfc3RhdGUgPSBRQ0E4S19QT1JUX0xPT0tVUF9TVEFURV9MRUFSTklORzsKKwkJYnJlYWs7CisJY2FzZSBCUl9TVEFURV9GT1JXQVJESU5HOgorCWRlZmF1bHQ6CisJCXN0cF9zdGF0ZSA9IFFDQThLX1BPUlRfTE9PS1VQX1NUQVRFX0ZPUldBUkQ7CisJCWJyZWFrOworCX0KKworCXFjYThrX3Jtdyhwcml2LCBRQ0E4S19QT1JUX0xPT0tVUF9DVFJMKHBvcnQpLAorCQkgIFFDQThLX1BPUlRfTE9PS1VQX1NUQVRFX01BU0ssIHN0cF9zdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQKK3FjYThrX3BvcnRfYnJpZGdlX2pvaW4oc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpicmlkZ2UpCit7CisJc3RydWN0IHFjYThrX3ByaXYgKnByaXYgPSAoc3RydWN0IHFjYThrX3ByaXYgKilkcy0+cHJpdjsKKwlpbnQgcG9ydF9tYXNrID0gQklUKFFDQThLX0NQVV9QT1JUKTsKKwlpbnQgaTsKKworCXByaXYtPnBvcnRfc3RzW3BvcnRdLmJyaWRnZV9kZXYgPSBicmlkZ2U7CisKKwlmb3IgKGkgPSAxOyBpIDwgUUNBOEtfTlVNX1BPUlRTOyBpKyspIHsKKwkJaWYgKHByaXYtPnBvcnRfc3RzW2ldLmJyaWRnZV9kZXYgIT0gYnJpZGdlKQorCQkJY29udGludWU7CisJCS8qIEFkZCB0aGlzIHBvcnQgdG8gdGhlIHBvcnR2bGFuIG1hc2sgb2YgdGhlIG90aGVyIHBvcnRzCisJCSAqIGluIHRoZSBicmlkZ2UKKwkJICovCisJCXFjYThrX3JlZ19zZXQocHJpdiwKKwkJCSAgICAgIFFDQThLX1BPUlRfTE9PS1VQX0NUUkwoaSksCisJCQkgICAgICBCSVQocG9ydCkpOworCQlpZiAoaSAhPSBwb3J0KQorCQkJcG9ydF9tYXNrIHw9IEJJVChpKTsKKwl9CisJLyogQWRkIGFsbCBvdGhlciBwb3J0cyB0byB0aGlzIHBvcnRzIHBvcnR2bGFuIG1hc2sgKi8KKwlxY2E4a19ybXcocHJpdiwgUUNBOEtfUE9SVF9MT09LVVBfQ1RSTChwb3J0KSwKKwkJICBRQ0E4S19QT1JUX0xPT0tVUF9NRU1CRVIsIHBvcnRfbWFzayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3FjYThrX3BvcnRfYnJpZGdlX2xlYXZlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQpCit7CisJc3RydWN0IHFjYThrX3ByaXYgKnByaXYgPSAoc3RydWN0IHFjYThrX3ByaXYgKilkcy0+cHJpdjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDE7IGkgPCBRQ0E4S19OVU1fUE9SVFM7IGkrKykgeworCQlpZiAocHJpdi0+cG9ydF9zdHNbaV0uYnJpZGdlX2RldiAhPQorCQkgICAgcHJpdi0+cG9ydF9zdHNbcG9ydF0uYnJpZGdlX2RldikKKwkJCWNvbnRpbnVlOworCQkvKiBSZW1vdmUgdGhpcyBwb3J0IHRvIHRoZSBwb3J0dmxhbiBtYXNrIG9mIHRoZSBvdGhlciBwb3J0cworCQkgKiBpbiB0aGUgYnJpZGdlCisJCSAqLworCQlxY2E4a19yZWdfY2xlYXIocHJpdiwKKwkJCQlRQ0E4S19QT1JUX0xPT0tVUF9DVFJMKGkpLAorCQkJCUJJVChwb3J0KSk7CisJfQorCXByaXYtPnBvcnRfc3RzW3BvcnRdLmJyaWRnZV9kZXYgPSBOVUxMOworCS8qIFNldCB0aGUgY3B1IHBvcnQgdG8gYmUgdGhlIG9ubHkgb25lIGluIHRoZSBwb3J0dmxhbiBtYXNrIG9mCisJICogdGhpcyBwb3J0CisJICovCisJcWNhOGtfcm13KHByaXYsIFFDQThLX1BPUlRfTE9PS1VQX0NUUkwocG9ydCksCisJCSAgUUNBOEtfUE9SVF9MT09LVVBfTUVNQkVSLCBCSVQoUUNBOEtfQ1BVX1BPUlQpKTsKK30KKworc3RhdGljIGludAorcWNhOGtfcG9ydF9lbmFibGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJICBzdHJ1Y3QgcGh5X2RldmljZSAqcGh5KQoreworCXN0cnVjdCBxY2E4a19wcml2ICpwcml2ID0gKHN0cnVjdCBxY2E4a19wcml2ICopZHMtPnByaXY7CisKKwlxY2E4a19wb3J0X3NldF9zdGF0dXMocHJpdiwgcG9ydCwgMSk7CisJcHJpdi0+cG9ydF9zdHNbcG9ydF0uZW5hYmxlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3FjYThrX3BvcnRfZGlzYWJsZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAorCQkgICBzdHJ1Y3QgcGh5X2RldmljZSAqcGh5KQoreworCXN0cnVjdCBxY2E4a19wcml2ICpwcml2ID0gKHN0cnVjdCBxY2E4a19wcml2ICopZHMtPnByaXY7CisKKwlxY2E4a19wb3J0X3NldF9zdGF0dXMocHJpdiwgcG9ydCwgMCk7CisJcHJpdi0+cG9ydF9zdHNbcG9ydF0uZW5hYmxlZCA9IDA7Cit9CisKK3N0YXRpYyBpbnQKK3FjYThrX3BvcnRfZmRiX2luc2VydChzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiwgY29uc3QgdTggKmFkZHIsCisJCSAgICAgIHUxNiBwb3J0X21hc2ssIHUxNiB2aWQpCit7CisJLyogU2V0IHRoZSB2aWQgdG8gdGhlIHBvcnQgdmxhbiBpZCBpZiBubyB2aWQgaXMgc2V0ICovCisJaWYgKCF2aWQpCisJCXZpZCA9IDE7CisKKwlyZXR1cm4gcWNhOGtfZmRiX2FkZChwcml2LCBhZGRyLCBwb3J0X21hc2ssIHZpZCwKKwkJCSAgICAgUUNBOEtfQVRVX1NUQVRVU19TVEFUSUMpOworfQorCitzdGF0aWMgaW50CitxY2E4a19wb3J0X2ZkYl9wcmVwYXJlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X2ZkYiAqZmRiLAorCQkgICAgICAgc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpCit7CisJc3RydWN0IHFjYThrX3ByaXYgKnByaXYgPSAoc3RydWN0IHFjYThrX3ByaXYgKilkcy0+cHJpdjsKKworCS8qIFRoZSBGREIgdGFibGUgZm9yIHN0YXRpYyBhbmQgYXV0byBsZWFybmVkIGVudHJpZXMgaXMgdGhlIHNhbWUuIFdlCisJICogbmVlZCB0byByZXNlcnZlIGFuIGVudHJ5IHdpdGggbm8gcG9ydF9tYXNrIHNldCB0byBtYWtlIHN1cmUgdGhhdAorCSAqIHdoZW4gcG9ydF9mZGJfYWRkIGlzIGNhbGxlZCBhbiBlbnRyeSBpcyBzdGlsbCBhdmFpbGFibGUuIE90aGVyd2lzZQorCSAqIHRoZSBsYXN0IGZyZWUgZW50cnkgbWlnaHQgaGF2ZSBiZWVuIHVzZWQgdXAgYnkgYXV0byBsZWFybmluZworCSAqLworCXJldHVybiBxY2E4a19wb3J0X2ZkYl9pbnNlcnQocHJpdiwgZmRiLT5hZGRyLCAwLCBmZGItPnZpZCk7Cit9CisKK3N0YXRpYyB2b2lkCitxY2E4a19wb3J0X2ZkYl9hZGQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJICAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9mZGIgKmZkYiwKKwkJICAgc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpCit7CisJc3RydWN0IHFjYThrX3ByaXYgKnByaXYgPSAoc3RydWN0IHFjYThrX3ByaXYgKilkcy0+cHJpdjsKKwl1MTYgcG9ydF9tYXNrID0gQklUKHBvcnQpOworCisJLyogVXBkYXRlIHRoZSBGREIgZW50cnkgYWRkaW5nIHRoZSBwb3J0X21hc2sgKi8KKwlxY2E4a19wb3J0X2ZkYl9pbnNlcnQocHJpdiwgZmRiLT5hZGRyLCBwb3J0X21hc2ssIGZkYi0+dmlkKTsKK30KKworc3RhdGljIGludAorcWNhOGtfcG9ydF9mZGJfZGVsKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJCSAgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfZmRiICpmZGIpCit7CisJc3RydWN0IHFjYThrX3ByaXYgKnByaXYgPSAoc3RydWN0IHFjYThrX3ByaXYgKilkcy0+cHJpdjsKKwl1MTYgcG9ydF9tYXNrID0gQklUKHBvcnQpOworCXUxNiB2aWQgPSBmZGItPnZpZDsKKworCWlmICghdmlkKQorCQl2aWQgPSAxOworCisJcmV0dXJuIHFjYThrX2ZkYl9kZWwocHJpdiwgZmRiLT5hZGRyLCBwb3J0X21hc2ssIHZpZCk7Cit9CisKK3N0YXRpYyBpbnQKK3FjYThrX3BvcnRfZmRiX2R1bXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJICAgIHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfZmRiICpmZGIsCisJCSAgICBpbnQgKCpjYikoc3RydWN0IHN3aXRjaGRldl9vYmogKm9iaikpCit7CisJc3RydWN0IHFjYThrX3ByaXYgKnByaXYgPSAoc3RydWN0IHFjYThrX3ByaXYgKilkcy0+cHJpdjsKKwlzdHJ1Y3QgcWNhOGtfZmRiIF9mZGIgPSB7IDAgfTsKKwlpbnQgY250ID0gUUNBOEtfTlVNX0ZEQl9SRUNPUkRTOworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmcHJpdi0+cmVnX211dGV4KTsKKwl3aGlsZSAoY250LS0gJiYgIXFjYThrX2ZkYl9uZXh0KHByaXYsICZfZmRiLCBwb3J0KSkgeworCQlpZiAoIV9mZGIuYWdpbmcpCisJCQlicmVhazsKKworCQlldGhlcl9hZGRyX2NvcHkoZmRiLT5hZGRyLCBfZmRiLm1hYyk7CisJCWZkYi0+dmlkID0gX2ZkYi52aWQ7CisJCWlmIChfZmRiLmFnaW5nID09IFFDQThLX0FUVV9TVEFUVVNfU1RBVElDKQorCQkJZmRiLT5uZG1fc3RhdGUgPSBOVURfTk9BUlA7CisJCWVsc2UKKwkJCWZkYi0+bmRtX3N0YXRlID0gTlVEX1JFQUNIQUJMRTsKKworCQlyZXQgPSBjYigmZmRiLT5vYmopOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJfQorCW11dGV4X3VubG9jaygmcHJpdi0+cmVnX211dGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgZW51bSBkc2FfdGFnX3Byb3RvY29sCitxY2E4a19nZXRfdGFnX3Byb3RvY29sKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKK3sKKwlyZXR1cm4gRFNBX1RBR19QUk9UT19RQ0E7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHNhX3N3aXRjaF9vcHMgcWNhOGtfc3dpdGNoX29wcyA9IHsKKwkuZ2V0X3RhZ19wcm90b2NvbAk9IHFjYThrX2dldF90YWdfcHJvdG9jb2wsCisJLnNldHVwCQkJPSBxY2E4a19zZXR1cCwKKwkuZ2V0X3N0cmluZ3MJCT0gcWNhOGtfZ2V0X3N0cmluZ3MsCisJLnBoeV9yZWFkCQk9IHFjYThrX3BoeV9yZWFkLAorCS5waHlfd3JpdGUJCT0gcWNhOGtfcGh5X3dyaXRlLAorCS5nZXRfZXRodG9vbF9zdGF0cwk9IHFjYThrX2dldF9ldGh0b29sX3N0YXRzLAorCS5nZXRfc3NldF9jb3VudAkJPSBxY2E4a19nZXRfc3NldF9jb3VudCwKKwkuZ2V0X2VlZQkJPSBxY2E4a19nZXRfZWVlLAorCS5zZXRfZWVlCQk9IHFjYThrX3NldF9lZWUsCisJLnBvcnRfZW5hYmxlCQk9IHFjYThrX3BvcnRfZW5hYmxlLAorCS5wb3J0X2Rpc2FibGUJCT0gcWNhOGtfcG9ydF9kaXNhYmxlLAorCS5wb3J0X3N0cF9zdGF0ZV9zZXQJPSBxY2E4a19wb3J0X3N0cF9zdGF0ZV9zZXQsCisJLnBvcnRfYnJpZGdlX2pvaW4JPSBxY2E4a19wb3J0X2JyaWRnZV9qb2luLAorCS5wb3J0X2JyaWRnZV9sZWF2ZQk9IHFjYThrX3BvcnRfYnJpZGdlX2xlYXZlLAorCS5wb3J0X2ZkYl9wcmVwYXJlCT0gcWNhOGtfcG9ydF9mZGJfcHJlcGFyZSwKKwkucG9ydF9mZGJfYWRkCQk9IHFjYThrX3BvcnRfZmRiX2FkZCwKKwkucG9ydF9mZGJfZGVsCQk9IHFjYThrX3BvcnRfZmRiX2RlbCwKKwkucG9ydF9mZGJfZHVtcAkJPSBxY2E4a19wb3J0X2ZkYl9kdW1wLAorfTsKKworc3RhdGljIGludAorcWNhOGtfc3dfcHJvYmUoc3RydWN0IG1kaW9fZGV2aWNlICptZGlvZGV2KQoreworCXN0cnVjdCBxY2E4a19wcml2ICpwcml2OworCXUzMiBpZDsKKworCS8qIGFsbG9jYXRlIHRoZSBwcml2YXRlIGRhdGEgc3RydWN0IHNvIHRoYXQgd2UgY2FuIHByb2JlIHRoZSBzd2l0Y2hlcworCSAqIElEIHJlZ2lzdGVyCisJICovCisJcHJpdiA9IGRldm1fa3phbGxvYygmbWRpb2Rldi0+ZGV2LCBzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJpdi0+YnVzID0gbWRpb2Rldi0+YnVzOworCisJLyogcmVhZCB0aGUgc3dpdGNoZXMgSUQgcmVnaXN0ZXIgKi8KKwlpZCA9IHFjYThrX3JlYWQocHJpdiwgUUNBOEtfUkVHX01BU0tfQ1RSTCk7CisJaWQgPj49IFFDQThLX01BU0tfQ1RSTF9JRF9TOworCWlkICY9IFFDQThLX01BU0tfQ1RSTF9JRF9NOworCWlmIChpZCAhPSBRQ0E4S19JRF9RQ0E4MzM3KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXByaXYtPmRzID0gZGV2bV9remFsbG9jKCZtZGlvZGV2LT5kZXYsIHNpemVvZigqcHJpdi0+ZHMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYtPmRzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByaXYtPmRzLT5wcml2ID0gcHJpdjsKKwlwcml2LT5kcy0+ZGV2ID0gJm1kaW9kZXYtPmRldjsKKwlwcml2LT5kcy0+b3BzID0gJnFjYThrX3N3aXRjaF9vcHM7CisJbXV0ZXhfaW5pdCgmcHJpdi0+cmVnX211dGV4KTsKKwlkZXZfc2V0X2RydmRhdGEoJm1kaW9kZXYtPmRldiwgcHJpdik7CisKKwlyZXR1cm4gZHNhX3JlZ2lzdGVyX3N3aXRjaChwcml2LT5kcywgcHJpdi0+ZHMtPmRldi0+b2Zfbm9kZSk7Cit9CisKK3N0YXRpYyB2b2lkCitxY2E4a19zd19yZW1vdmUoc3RydWN0IG1kaW9fZGV2aWNlICptZGlvZGV2KQoreworCXN0cnVjdCBxY2E4a19wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKCZtZGlvZGV2LT5kZXYpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFFDQThLX05VTV9QT1JUUzsgaSsrKQorCQlxY2E4a19wb3J0X3NldF9zdGF0dXMocHJpdiwgaSwgMCk7CisKKwlkc2FfdW5yZWdpc3Rlcl9zd2l0Y2gocHJpdi0+ZHMpOworfQorCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgdm9pZAorcWNhOGtfc2V0X3BtKHN0cnVjdCBxY2E4a19wcml2ICpwcml2LCBpbnQgZW5hYmxlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFFDQThLX05VTV9QT1JUUzsgaSsrKSB7CisJCWlmICghcHJpdi0+cG9ydF9zdHNbaV0uZW5hYmxlZCkKKwkJCWNvbnRpbnVlOworCisJCXFjYThrX3BvcnRfc2V0X3N0YXR1cyhwcml2LCBpLCBlbmFibGUpOworCX0KK30KKworc3RhdGljIGludCBxY2E4a19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHFjYThrX3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXFjYThrX3NldF9wbShwcml2LCAwKTsKKworCXJldHVybiBkc2Ffc3dpdGNoX3N1c3BlbmQocHJpdi0+ZHMpOworfQorCitzdGF0aWMgaW50IHFjYThrX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBxY2E4a19wcml2ICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlxY2E4a19zZXRfcG0ocHJpdiwgMSk7CisKKwlyZXR1cm4gZHNhX3N3aXRjaF9yZXN1bWUocHJpdi0+ZHMpOworfQorI2VuZGlmIC8qIENPTkZJR19QTV9TTEVFUCAqLworCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMocWNhOGtfcG1fb3BzLAorCQkJIHFjYThrX3N1c3BlbmQsIHFjYThrX3Jlc3VtZSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHFjYThrX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJxY2EscWNhODMzNyIgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0sCit9OworCitzdGF0aWMgc3RydWN0IG1kaW9fZHJpdmVyIHFjYThrbWRpb19kcml2ZXIgPSB7CisJLnByb2JlICA9IHFjYThrX3N3X3Byb2JlLAorCS5yZW1vdmUgPSBxY2E4a19zd19yZW1vdmUsCisJLm1kaW9kcnYuZHJpdmVyID0geworCQkubmFtZSA9ICJxY2E4ayIsCisJCS5vZl9tYXRjaF90YWJsZSA9IHFjYThrX29mX21hdGNoLAorCQkucG0gPSAmcWNhOGtfcG1fb3BzLAorCX0sCit9OworCittZGlvX21vZHVsZV9kcml2ZXIocWNhOGttZGlvX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIk1hdGhpZXUgT2xpdmFyaSwgSm9obiBDcmlzcGluIDxqb2huQHBocm96ZW4ub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIFFDQThLIGV0aGVybmV0IHN3aXRjaCBmYW1pbHkiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06cWNhOGsiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9xY2E4ay5oIGIvZHJpdmVycy9uZXQvZHNhL3FjYThrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxNDY0NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9xY2E4ay5oCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEZlbGl4IEZpZXRrYXUgPG5iZEBuYmQubmFtZT4KKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIEdhYm9yIEp1aG9zIDxqdWhvc2dAb3BlbndydC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX1FDQThLX0gKKyNkZWZpbmUgX19RQ0E4S19ICisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorCisjZGVmaW5lIFFDQThLX05VTV9QT1JUUwkJCQkJNworCisjZGVmaW5lIFBIWV9JRF9RQ0E4MzM3CQkJCQkweDAwNGRkMDM2CisjZGVmaW5lIFFDQThLX0lEX1FDQTgzMzcJCQkJMHgxMworCisjZGVmaW5lIFFDQThLX05VTV9GREJfUkVDT1JEUwkJCQkyMDQ4CisKKyNkZWZpbmUgUUNBOEtfQ1BVX1BPUlQJCQkJCTAKKworLyogR2xvYmFsIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIFFDQThLX1JFR19NQVNLX0NUUkwJCQkJMHgwMDAKKyNkZWZpbmUgICBRQ0E4S19NQVNLX0NUUkxfSURfTQkJCQkweGZmCisjZGVmaW5lICAgUUNBOEtfTUFTS19DVFJMX0lEX1MJCQkJOAorI2RlZmluZSBRQ0E4S19SRUdfUE9SVDBfUEFEX0NUUkwJCQkweDAwNAorI2RlZmluZSBRQ0E4S19SRUdfUE9SVDVfUEFEX0NUUkwJCQkweDAwOAorI2RlZmluZSBRQ0E4S19SRUdfUE9SVDZfUEFEX0NUUkwJCQkweDAwYworI2RlZmluZSAgIFFDQThLX1BPUlRfUEFEX1JHTUlJX0VOCQkJQklUKDI2KQorI2RlZmluZSAgIFFDQThLX1BPUlRfUEFEX1JHTUlJX1RYX0RFTEFZKHgpCQlcCisJCQkJCQkoKDB4OCArICh4ICYgMHgzKSkgPDwgMjIpCisjZGVmaW5lICAgUUNBOEtfUE9SVF9QQURfUkdNSUlfUlhfREVMQVkoeCkJCVwKKwkJCQkJCSgoMHgxMCArICh4ICYgMHgzKSkgPDwgMjApCisjZGVmaW5lICAgUUNBOEtfUE9SVF9QQURfUkdNSUlfUlhfREVMQVlfRU4JCUJJVCgyNCkKKyNkZWZpbmUgICBRQ0E4S19QT1JUX1BBRF9TR01JSV9FTgkJCUJJVCg3KQorI2RlZmluZSBRQ0E4S19SRUdfTU9EVUxFX0VOCQkJCTB4MDMwCisjZGVmaW5lICAgUUNBOEtfTU9EVUxFX0VOX01JQgkJCQlCSVQoMCkKKyNkZWZpbmUgUUNBOEtfUkVHX01JQgkJCQkJMHgwMzQKKyNkZWZpbmUgICBRQ0E4S19NSUJfRkxVU0gJCQkJQklUKDI0KQorI2RlZmluZSAgIFFDQThLX01JQl9DUFVfS0VFUAkJCQlCSVQoMjApCisjZGVmaW5lICAgUUNBOEtfTUlCX0JVU1kJCQkJQklUKDE3KQorI2RlZmluZSBRQ0E4S19HT0xfTUFDX0FERFIwCQkJCTB4NjAKKyNkZWZpbmUgUUNBOEtfR09MX01BQ19BRERSMQkJCQkweDY0CisjZGVmaW5lIFFDQThLX1JFR19QT1JUX1NUQVRVUyhfaSkJCQkoMHgwN2MgKyAoX2kpICogNCkKKyNkZWZpbmUgICBRQ0E4S19QT1JUX1NUQVRVU19TUEVFRAkJCUdFTk1BU0soMiwgMCkKKyNkZWZpbmUgICBRQ0E4S19QT1JUX1NUQVRVU19TUEVFRF9TCQkJMAorI2RlZmluZSAgIFFDQThLX1BPUlRfU1RBVFVTX1RYTUFDCQkJQklUKDIpCisjZGVmaW5lICAgUUNBOEtfUE9SVF9TVEFUVVNfUlhNQUMJCQlCSVQoMykKKyNkZWZpbmUgICBRQ0E4S19QT1JUX1NUQVRVU19UWEZMT1cJCQlCSVQoNCkKKyNkZWZpbmUgICBRQ0E4S19QT1JUX1NUQVRVU19SWEZMT1cJCQlCSVQoNSkKKyNkZWZpbmUgICBRQ0E4S19QT1JUX1NUQVRVU19EVVBMRVgJCQlCSVQoNikKKyNkZWZpbmUgICBRQ0E4S19QT1JUX1NUQVRVU19MSU5LX1VQCQkJQklUKDgpCisjZGVmaW5lICAgUUNBOEtfUE9SVF9TVEFUVVNfTElOS19BVVRPCQkJQklUKDkpCisjZGVmaW5lICAgUUNBOEtfUE9SVF9TVEFUVVNfTElOS19QQVVTRQkJCUJJVCgxMCkKKyNkZWZpbmUgUUNBOEtfUkVHX1BPUlRfSERSX0NUUkwoX2kpCQkJKDB4OWMgKyAoX2kgKiA0KSkKKyNkZWZpbmUgICBRQ0E4S19QT1JUX0hEUl9DVFJMX1JYX01BU0sJCQlHRU5NQVNLKDMsIDIpCisjZGVmaW5lICAgUUNBOEtfUE9SVF9IRFJfQ1RSTF9SWF9TCQkJMgorI2RlZmluZSAgIFFDQThLX1BPUlRfSERSX0NUUkxfVFhfTUFTSwkJCUdFTk1BU0soMSwgMCkKKyNkZWZpbmUgICBRQ0E4S19QT1JUX0hEUl9DVFJMX1RYX1MJCQkwCisjZGVmaW5lICAgUUNBOEtfUE9SVF9IRFJfQ1RSTF9BTEwJCQkyCisjZGVmaW5lICAgUUNBOEtfUE9SVF9IRFJfQ1RSTF9NR01UCQkJMQorI2RlZmluZSAgIFFDQThLX1BPUlRfSERSX0NUUkxfTk9ORQkJCTAKKworLyogRUVFIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIFFDQThLX1JFR19FRUVfQ1RSTAkJCQkweDEwMAorI2RlZmluZSAgUUNBOEtfUkVHX0VFRV9DVFJMX0xQSV9FTihfaSkJCQkoKF9pICsgMSkgKiAyKQorCisvKiBBQ0wgcmVnaXN0ZXJzICovCisjZGVmaW5lIFFDQThLX1JFR19QT1JUX1ZMQU5fQ1RSTDAoX2kpCQkJKDB4NDIwICsgKF9pICogOCkpCisjZGVmaW5lICAgUUNBOEtfUE9SVF9WTEFOX0NWSUQoeCkJCQkoeCA8PCAxNikKKyNkZWZpbmUgICBRQ0E4S19QT1JUX1ZMQU5fU1ZJRCh4KQkJCXgKKyNkZWZpbmUgUUNBOEtfUkVHX1BPUlRfVkxBTl9DVFJMMShfaSkJCQkoMHg0MjQgKyAoX2kgKiA4KSkKKyNkZWZpbmUgUUNBOEtfUkVHX0lQVjRfUFJJX0JBU0VfQUREUgkJCTB4NDcwCisjZGVmaW5lIFFDQThLX1JFR19JUFY0X1BSSV9BRERSX01BU0sJCQkweDQ3NAorCisvKiBMb29rdXAgcmVnaXN0ZXJzICovCisjZGVmaW5lIFFDQThLX1JFR19BVFVfREFUQTAJCQkJMHg2MDAKKyNkZWZpbmUgICBRQ0E4S19BVFVfQUREUjJfUwkJCQkyNAorI2RlZmluZSAgIFFDQThLX0FUVV9BRERSM19TCQkJCTE2CisjZGVmaW5lICAgUUNBOEtfQVRVX0FERFI0X1MJCQkJOAorI2RlZmluZSBRQ0E4S19SRUdfQVRVX0RBVEExCQkJCTB4NjA0CisjZGVmaW5lICAgUUNBOEtfQVRVX1BPUlRfTQkJCQkweDdmCisjZGVmaW5lICAgUUNBOEtfQVRVX1BPUlRfUwkJCQkxNgorI2RlZmluZSAgIFFDQThLX0FUVV9BRERSMF9TCQkJCTgKKyNkZWZpbmUgUUNBOEtfUkVHX0FUVV9EQVRBMgkJCQkweDYwOAorI2RlZmluZSAgIFFDQThLX0FUVV9WSURfTQkJCQkweGZmZgorI2RlZmluZSAgIFFDQThLX0FUVV9WSURfUwkJCQk4CisjZGVmaW5lICAgUUNBOEtfQVRVX1NUQVRVU19NCQkJCTB4ZgorI2RlZmluZSAgIFFDQThLX0FUVV9TVEFUVVNfU1RBVElDCQkJMHhmCisjZGVmaW5lIFFDQThLX1JFR19BVFVfRlVOQwkJCQkweDYwYworI2RlZmluZSAgIFFDQThLX0FUVV9GVU5DX0JVU1kJCQkJQklUKDMxKQorI2RlZmluZSAgIFFDQThLX0FUVV9GVU5DX1BPUlRfRU4JCQlCSVQoMTQpCisjZGVmaW5lICAgUUNBOEtfQVRVX0ZVTkNfTVVMVElfRU4JCQlCSVQoMTMpCisjZGVmaW5lICAgUUNBOEtfQVRVX0ZVTkNfRlVMTAkJCQlCSVQoMTIpCisjZGVmaW5lICAgUUNBOEtfQVRVX0ZVTkNfUE9SVF9NCQkJCTB4ZgorI2RlZmluZSAgIFFDQThLX0FUVV9GVU5DX1BPUlRfUwkJCQk4CisjZGVmaW5lIFFDQThLX1JFR19HTE9CQUxfRldfQ1RSTDAJCQkweDYyMAorI2RlZmluZSAgIFFDQThLX0dMT0JBTF9GV19DVFJMMF9DUFVfUE9SVF9FTgkJQklUKDEwKQorI2RlZmluZSBRQ0E4S19SRUdfR0xPQkFMX0ZXX0NUUkwxCQkJMHg2MjQKKyNkZWZpbmUgICBRQ0E4S19HTE9CQUxfRldfQ1RSTDFfSUdNUF9EUF9TCQkyNAorI2RlZmluZSAgIFFDQThLX0dMT0JBTF9GV19DVFJMMV9CQ19EUF9TCQkJMTYKKyNkZWZpbmUgICBRQ0E4S19HTE9CQUxfRldfQ1RSTDFfTUNfRFBfUwkJCTgKKyNkZWZpbmUgICBRQ0E4S19HTE9CQUxfRldfQ1RSTDFfVUNfRFBfUwkJCTAKKyNkZWZpbmUgUUNBOEtfUE9SVF9MT09LVVBfQ1RSTChfaSkJCQkoMHg2NjAgKyAoX2kpICogMHhjKQorI2RlZmluZSAgIFFDQThLX1BPUlRfTE9PS1VQX01FTUJFUgkJCUdFTk1BU0soNiwgMCkKKyNkZWZpbmUgICBRQ0E4S19QT1JUX0xPT0tVUF9TVEFURV9NQVNLCQkJR0VOTUFTSygxOCwgMTYpCisjZGVmaW5lICAgUUNBOEtfUE9SVF9MT09LVVBfU1RBVEVfRElTQUJMRUQJCSgwIDw8IDE2KQorI2RlZmluZSAgIFFDQThLX1BPUlRfTE9PS1VQX1NUQVRFX0JMT0NLSU5HCQkoMSA8PCAxNikKKyNkZWZpbmUgICBRQ0E4S19QT1JUX0xPT0tVUF9TVEFURV9MSVNURU5JTkcJCSgyIDw8IDE2KQorI2RlZmluZSAgIFFDQThLX1BPUlRfTE9PS1VQX1NUQVRFX0xFQVJOSU5HCQkoMyA8PCAxNikKKyNkZWZpbmUgICBRQ0E4S19QT1JUX0xPT0tVUF9TVEFURV9GT1JXQVJECQkoNCA8PCAxNikKKyNkZWZpbmUgICBRQ0E4S19QT1JUX0xPT0tVUF9TVEFURQkJCUdFTk1BU0soMTgsIDE2KQorI2RlZmluZSAgIFFDQThLX1BPUlRfTE9PS1VQX0xFQVJOCQkJQklUKDIwKQorCisvKiBQa3QgZWRpdCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUUNBOEtfRUdSRVNTX1ZMQU4oeCkJCQkJKDB4MGM3MCArICg0ICogKHggLyAyKSkpCisKKy8qIEwzIHJlZ2lzdGVycyAqLworI2RlZmluZSBRQ0E4S19IUk9VVEVSX0NPTlRST0wJCQkJMHhlMDAKKyNkZWZpbmUgICBRQ0E4S19IUk9VVEVSX0NPTlRST0xfR0xCX0xPQ0tUSU1FX00JCUdFTk1BU0soMTcsIDE2KQorI2RlZmluZSAgIFFDQThLX0hST1VURVJfQ09OVFJPTF9HTEJfTE9DS1RJTUVfUwkJMTYKKyNkZWZpbmUgICBRQ0E4S19IUk9VVEVSX0NPTlRST0xfQVJQX0FHRV9NT0RFCQkxCisjZGVmaW5lIFFDQThLX0hST1VURVJfUEJBU0VEX0NPTlRST0wxCQkJMHhlMDgKKyNkZWZpbmUgUUNBOEtfSFJPVVRFUl9QQkFTRURfQ09OVFJPTDIJCQkweGUwYworI2RlZmluZSBRQ0E4S19ITkFUX0NPTlRST0wJCQkJMHhlMzgKKworLyogTUlCIHJlZ2lzdGVycyAqLworI2RlZmluZSBRQ0E4S19QT1JUX01JQl9DT1VOVEVSKF9pKQkJCSgweDEwMDAgKyAoX2kpICogMHgxMDApCisKKy8qIFFDQSBzcGVjaWZpYyBNSUkgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1JSV9BVEhfTU1EX0FERFIJCQkJMHgwZAorI2RlZmluZSBNSUlfQVRIX01NRF9EQVRBCQkJCTB4MGUKKworZW51bSB7CisJUUNBOEtfUE9SVF9TUEVFRF8xME0gPSAwLAorCVFDQThLX1BPUlRfU1BFRURfMTAwTSA9IDEsCisJUUNBOEtfUE9SVF9TUEVFRF8xMDAwTSA9IDIsCisJUUNBOEtfUE9SVF9TUEVFRF9FUlIgPSAzLAorfTsKKworZW51bSBxY2E4a19mZGJfY21kIHsKKwlRQ0E4S19GREJfRkxVU0gJPSAxLAorCVFDQThLX0ZEQl9MT0FEID0gMiwKKwlRQ0E4S19GREJfUFVSR0UgPSAzLAorCVFDQThLX0ZEQl9ORVhUID0gNiwKKwlRQ0E4S19GREJfU0VBUkNIID0gNywKK307CisKK3N0cnVjdCBhcjh4eHhfcG9ydF9zdGF0dXMgeworCXN0cnVjdCBldGh0b29sX2VlZSBlZWU7CisJc3RydWN0IG5ldF9kZXZpY2UgKmJyaWRnZV9kZXY7CisJaW50IGVuYWJsZWQ7Cit9OworCitzdHJ1Y3QgcWNhOGtfcHJpdiB7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCXN0cnVjdCBtaWlfYnVzICpidXM7CisJc3RydWN0IGFyOHh4eF9wb3J0X3N0YXR1cyBwb3J0X3N0c1tRQ0E4S19OVU1fUE9SVFNdOworCXN0cnVjdCBkc2Ffc3dpdGNoICpkczsKKwlzdHJ1Y3QgbXV0ZXggcmVnX211dGV4OworfTsKKworc3RydWN0IHFjYThrX21pYl9kZXNjIHsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCitzdHJ1Y3QgcWNhOGtfZmRiIHsKKwl1MTYgdmlkOworCXU4IHBvcnRfbWFzazsKKwl1OCBhZ2luZzsKKwl1OCBtYWNbNl07Cit9OworCisjZW5kaWYgLyogX19RQ0E4S19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC8zY29tLzNjNTl4LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC8zY29tLzNjNTl4LmMKaW5kZXggMjVjNTVhYi4uOTEzM2U3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvM2NvbS8zYzU5eC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0LzNjb20vM2M1OXguYwpAQCAtMzA4OSw3ICszMDg5LDcgQEAKIAlpb3dyaXRlMTYobmV3X21vZGUsIGlvYWRkciArIEVMM19DTUQpOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUSkgfHwgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfVkxBTl84MDIxUSkKIC8qIFNldHVwIHRoZSBjYXJkIHNvIHRoYXQgaXQgY2FuIHJlY2VpdmUgZnJhbWVzIHdpdGggYW4gODAyLjFxIFZMQU4gdGFnLgogICAgTm90ZSB0aGF0IHRoaXMgbXVzdCBiZSBkb25lIGFmdGVyIGVhY2ggUnhSZXNldCBkdWUgdG8gc29tZSBiYWNrd2FyZHMKICAgIGNvbXBhdGliaWxpdHkgbG9naWMgaW4gdGhlIEN5Y2xvbmUgYW5kIFRvcm5hZG8gQVNJQ3MgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L0tjb25maWcgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9LY29uZmlnCmluZGV4IDJmZmQ2MzQuLjhjYzc0NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvS2NvbmZpZwpAQCAtMjQsNiArMjQsNyBAQAogc291cmNlICJkcml2ZXJzL25ldC9ldGhlcm5ldC9hbGx3aW5uZXIvS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9uZXQvZXRoZXJuZXQvYWx0ZW9uL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvbmV0L2V0aGVybmV0L2FsdGVyYS9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL25ldC9ldGhlcm5ldC9hcHBsZS9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9NYWtlZmlsZQppbmRleCAxZDM0OWU5Li5hMDk0MjNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9NYWtlZmlsZQpAQCAtMTAsNiArMTAsNyBAQAogb2JqLSQoQ09ORklHX05FVF9WRU5ET1JfQUxMV0lOTkVSKSArPSBhbGx3aW5uZXIvCiBvYmotJChDT05GSUdfTkVUX1ZFTkRPUl9BTFRFT04pICs9IGFsdGVvbi8KIG9iai0kKENPTkZJR19BTFRFUkFfVFNFKSArPSBhbHRlcmEvCitvYmotJChDT05GSUdfTkVUX1ZFTkRPUl9BTUFaT04pICs9IGFtYXpvbi8KIG9iai0kKENPTkZJR19ORVRfVkVORE9SX0FNRCkgKz0gYW1kLwogb2JqLSQoQ09ORklHX05FVF9YR0VORSkgKz0gYXBtLwogb2JqLSQoQ09ORklHX05FVF9WRU5ET1JfQVBQTEUpICs9IGFwcGxlLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWRhcHRlYy9zdGFyZmlyZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWRhcHRlYy9zdGFyZmlyZS5jCmluZGV4IDFkMTA2OTYuLjhhZjJjODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FkYXB0ZWMvc3RhcmZpcmUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hZGFwdGVjL3N0YXJmaXJlLmMKQEAgLTY2LDcgKzY2LDcgQEAKICAqLwogI2RlZmluZSBaRVJPQ09QWQogCi0jaWYgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUSkgfHwgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfVkxBTl84MDIxUSkKICNkZWZpbmUgVkxBTl9TVVBQT1JUCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWRpL2JmaW5fbWFjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hZGkvYmZpbl9tYWMuYwppbmRleCAzOGVhZWExLi4wMGY5ZWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hZGkvYmZpbl9tYWMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hZGkvYmZpbl9tYWMuYwpAQCAtMTkyLDggKzE5Miw4IEBACiAJCQlnb3RvIGluaXRfZXJyb3I7CiAKIAkJc2tiX3Jlc2VydmUobmV3X3NrYiwgTkVUX0lQX0FMSUdOKTsKLQkJLyogSW52aWRhdGUgdGhlIGRhdGEgY2FjaGUgb2Ygc2tiLT5kYXRhIHJhbmdlIHdoZW4gaXQgaXMgd3JpdGUgYmFjawotCQkgKiBjYWNoZS4gSXQgd2lsbCBwcmV2ZW50IG92ZXJ3cml0dGluZyB0aGUgbmV3IGRhdGEgZnJvbSBETUEKKwkJLyogSW52YWxpZGF0ZSB0aGUgZGF0YSBjYWNoZSBvZiBza2ItPmRhdGEgcmFuZ2Ugd2hlbiBpdCBpcyB3cml0ZSBiYWNrCisJCSAqIGNhY2hlLiBJdCB3aWxsIHByZXZlbnQgb3ZlcndyaXRpbmcgdGhlIG5ldyBkYXRhIGZyb20gRE1BCiAJCSAqLwogCQlibGFja2Zpbl9kY2FjaGVfaW52YWxpZGF0ZV9yYW5nZSgodW5zaWduZWQgbG9uZyluZXdfc2tiLT5oZWFkLAogCQkJCQkgKHVuc2lnbmVkIGxvbmcpbmV3X3NrYi0+ZW5kKTsKQEAgLTEyMDUsNyArMTIwNSw3IEBACiAJfQogCS8qIHJlc2VydmUgMiBieXRlcyBmb3IgUlhEV0EgcGFkZGluZyAqLwogCXNrYl9yZXNlcnZlKG5ld19za2IsIE5FVF9JUF9BTElHTik7Ci0JLyogSW52aWRhdGUgdGhlIGRhdGEgY2FjaGUgb2Ygc2tiLT5kYXRhIHJhbmdlIHdoZW4gaXQgaXMgd3JpdGUgYmFjaworCS8qIEludmFsaWRhdGUgdGhlIGRhdGEgY2FjaGUgb2Ygc2tiLT5kYXRhIHJhbmdlIHdoZW4gaXQgaXMgd3JpdGUgYmFjawogCSAqIGNhY2hlLiBJdCB3aWxsIHByZXZlbnQgb3ZlcndyaXR0aW5nIHRoZSBuZXcgZGF0YSBmcm9tIERNQQogCSAqLwogCWJsYWNrZmluX2RjYWNoZV9pbnZhbGlkYXRlX3JhbmdlKCh1bnNpZ25lZCBsb25nKW5ld19za2ItPmhlYWQsCkBAIC0xNTk5LDcgKzE1OTksNyBAQAogCSooX19sZTE2ICopICgmKG5kZXYtPmRldl9hZGRyWzRdKSkgPSBjcHVfdG9fbGUxNigodTE2KSBiZmluX3JlYWRfRU1BQ19BRERSSEkoKSk7CiAKIAkvKiBwcm9iZSBtYWMgKi8KLQkvKnRvZG86IGhvdyB0byBwcm9ibGU/IHdoaWNoIGlzIHJldmlzaW9uX3JlZ2lzdGVyICovCisJLyp0b2RvOiBob3cgdG8gcHJvYmU/IHdoaWNoIGlzIHJldmlzaW9uX3JlZ2lzdGVyICovCiAJYmZpbl93cml0ZV9FTUFDX0FERFJMTygweDEyMzQ1Njc4KTsKIAlpZiAoYmZpbl9yZWFkX0VNQUNfQUREUkxPKCkgIT0gMHgxMjM0NTY3OCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgZGV0ZWN0IEJsYWNrZmluIG9uLWNoaXAgZXRoZXJuZXQgTUFDIGNvbnRyb2xsZXIhXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Flcm9mbGV4L2dyZXRoLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hZXJvZmxleC9ncmV0aC5jCmluZGV4IGJjYTA3YzUuLmY4ZGY4MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Flcm9mbGV4L2dyZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWVyb2ZsZXgvZ3JldGguYwpAQCAtMTEwNSwyNyArMTEwNSw2IEBACiAJc3RydWN0IGdyZXRoX3ByaXZhdGUgKmdyZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlncmV0aC0+bXNnX2VuYWJsZSA9IHZhbHVlOwogfQotc3RhdGljIGludCBncmV0aF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCi17Ci0Jc3RydWN0IGdyZXRoX3ByaXZhdGUgKmdyZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ID0gZ3JldGgtPnBoeTsKLQotCWlmICghcGh5KQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXJldHVybiBwaHlfZXRodG9vbF9nc2V0KHBoeSwgY21kKTsKLX0KLQotc3RhdGljIGludCBncmV0aF9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCi17Ci0Jc3RydWN0IGdyZXRoX3ByaXZhdGUgKmdyZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ID0gZ3JldGgtPnBoeTsKLQotCWlmICghcGh5KQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXJldHVybiBwaHlfZXRodG9vbF9zc2V0KHBoeSwgY21kKTsKLX0KIAogc3RhdGljIGludCBncmV0aF9nZXRfcmVnc19sZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKQEAgLTExNTcsMTIgKzExMzYsMTIgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgZ3JldGhfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9tc2dsZXZlbAkJPSBncmV0aF9nZXRfbXNnbGV2ZWwsCiAJLnNldF9tc2dsZXZlbAkJPSBncmV0aF9zZXRfbXNnbGV2ZWwsCi0JLmdldF9zZXR0aW5ncwkJPSBncmV0aF9nZXRfc2V0dGluZ3MsCi0JLnNldF9zZXR0aW5ncwkJPSBncmV0aF9zZXRfc2V0dGluZ3MsCiAJLmdldF9kcnZpbmZvCQk9IGdyZXRoX2dldF9kcnZpbmZvLAogCS5nZXRfcmVnc19sZW4gICAgICAgICAgID0gZ3JldGhfZ2V0X3JlZ3NfbGVuLAogCS5nZXRfcmVncyAgICAgICAgICAgICAgID0gZ3JldGhfZ2V0X3JlZ3MsCiAJLmdldF9saW5rCQk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9saW5rX2tzZXR0aW5ncwk9IHBoeV9ldGh0b29sX2dldF9saW5rX2tzZXR0aW5ncywKKwkuc2V0X2xpbmtfa3NldHRpbmdzCT0gcGh5X2V0aHRvb2xfc2V0X2xpbmtfa3NldHRpbmdzLAogfTsKIAogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX29wcyBncmV0aF9uZXRkZXZfb3BzID0gewpAQCAtMTIyNCw3ICsxMjAzLDcgQEAKIHN0YXRpYyB2b2lkIGdyZXRoX2xpbmtfY2hhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGdyZXRoX3ByaXZhdGUgKmdyZXRoID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gZ3JldGgtPnBoeTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gZGV2LT5waHlkZXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgc3RhdHVzX2NoYW5nZSA9IDA7CiAJdTMyIGN0cmw7CkBAIC0xMzA3LDcgKzEyODYsNiBAQAogCWdyZXRoLT5saW5rID0gMDsKIAlncmV0aC0+c3BlZWQgPSAwOwogCWdyZXRoLT5kdXBsZXggPSAtMTsKLQlncmV0aC0+cGh5ID0gcGh5OwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMzI1LDYgKzEzMDMsNyBAQAogewogCWludCByZXQ7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZ3JldGgtPm5ldGRldjsKIAogCWdyZXRoLT5tZGlvID0gbWRpb2J1c19hbGxvYygpOwogCWlmICghZ3JldGgtPm1kaW8pIHsKQEAgLTEzNDksMTUgKzEzMjgsMTYgQEAKIAkJZ290byB1bnJlZ19tZGlvOwogCX0KIAotCXBoeV9zdGFydChncmV0aC0+cGh5KTsKKwlwaHlfc3RhcnQobmRldi0+cGh5ZGV2KTsKIAogCS8qIElmIEV0aGVybmV0IGRlYnVnIGxpbmsgaXMgdXNlZCBtYWtlIGF1dG9uZWcgaGFwcGVuIHJpZ2h0IGF3YXkgKi8KIAlpZiAoZ3JldGgtPmVkY2wgJiYgZ3JldGhfZWRjbCA9PSAxKSB7Ci0JCXBoeV9zdGFydF9hbmVnKGdyZXRoLT5waHkpOworCQlwaHlfc3RhcnRfYW5lZyhuZGV2LT5waHlkZXYpOwogCQl0aW1lb3V0ID0gamlmZmllcyArIDYqSFo7Ci0JCXdoaWxlICghcGh5X2FuZWdfZG9uZShncmV0aC0+cGh5KSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQl3aGlsZSAoIXBoeV9hbmVnX2RvbmUobmRldi0+cGh5ZGV2KSAmJgorCQkgICAgICAgdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKIAkJfQotCQlwaHlfcmVhZF9zdGF0dXMoZ3JldGgtPnBoeSk7CisJCXBoeV9yZWFkX3N0YXR1cyhuZGV2LT5waHlkZXYpOwogCQlncmV0aF9saW5rX2NoYW5nZShncmV0aC0+bmV0ZGV2KTsKIAl9CiAKQEAgLTE1NjksOCArMTU0OSw4IEBACiAKIAlkbWFfZnJlZV9jb2hlcmVudCgmb2ZfZGV2LT5kZXYsIDEwMjQsIGdyZXRoLT50eF9iZF9iYXNlLCBncmV0aC0+dHhfYmRfYmFzZV9waHlzKTsKIAotCWlmIChncmV0aC0+cGh5KQotCQlwaHlfc3RvcChncmV0aC0+cGh5KTsKKwlpZiAobmRldi0+cGh5ZGV2KQorCQlwaHlfc3RvcChuZGV2LT5waHlkZXYpOwogCW1kaW9idXNfdW5yZWdpc3RlcihncmV0aC0+bWRpbyk7CiAKIAl1bnJlZ2lzdGVyX25ldGRldihuZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Flcm9mbGV4L2dyZXRoLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hZXJvZmxleC9ncmV0aC5oCmluZGV4IDkyZGQ5MTguLjljMDcxNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Flcm9mbGV4L2dyZXRoLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWVyb2ZsZXgvZ3JldGguaApAQCAtMTIzLDcgKzEyMyw2IEBACiAJc3RydWN0IG5hcGlfc3RydWN0IG5hcGk7CiAJc3BpbmxvY2tfdCBkZXZsb2NrOwogCi0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeTsKIAlzdHJ1Y3QgbWlpX2J1cyAqbWRpbzsKIAl1bnNpZ25lZCBpbnQgbGluazsKIAl1bnNpZ25lZCBpbnQgc3BlZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hZ2VyZS9ldDEzMXguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FnZXJlL2V0MTMxeC5jCmluZGV4IGM4M2ViYWUuLjkwNjY4MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FnZXJlL2V0MTMxeC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FnZXJlL2V0MTMxeC5jCkBAIC0yOTYxLDcgKzI5NjEsNyBAQAogCQlzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKIH0KIAotc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBldDEzMXhfZXRodG9vbF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGV0MTMxeF9ldGh0b29sX29wcyA9IHsKIAkuZ2V0X2RydmluZm8JPSBldDEzMXhfZ2V0X2RydmluZm8sCiAJLmdldF9yZWdzX2xlbgk9IGV0MTMxeF9nZXRfcmVnc19sZW4sCiAJLmdldF9yZWdzCT0gZXQxMzF4X2dldF9yZWdzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL0tjb25maWcgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWIzMDM1MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9LY29uZmlnCkBAIC0wLDAgKzEsMjcgQEAKKyMKKyMgQW1hem9uIG5ldHdvcmsgZGV2aWNlIGNvbmZpZ3VyYXRpb24KKyMKKworY29uZmlnIE5FVF9WRU5ET1JfQU1BWk9OCisJYm9vbCAiQW1hem9uIERldmljZXMiCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgZGV2aWNlIGJlbG9uZ2luZyB0byB0aGlzIGNsYXNzLCBzYXkgWS4KKworCSAgTm90ZSB0aGF0IHRoZSBhbnN3ZXIgdG8gdGhpcyBxdWVzdGlvbiBkb2Vzbid0IGRpcmVjdGx5IGFmZmVjdCB0aGUKKwkgIGtlcm5lbDogc2F5aW5nIE4gd2lsbCBqdXN0IGNhdXNlIHRoZSBjb25maWd1cmF0b3IgdG8gc2tpcCBhbGwKKwkgIHRoZSBxdWVzdGlvbnMgYWJvdXQgQW1hem9uIGRldmljZXMuIElmIHlvdSBzYXkgWSwgeW91IHdpbGwgYmUgYXNrZWQKKwkgIGZvciB5b3VyIHNwZWNpZmljIGRldmljZSBpbiB0aGUgZm9sbG93aW5nIHF1ZXN0aW9ucy4KKworaWYgTkVUX1ZFTkRPUl9BTUFaT04KKworY29uZmlnIEVOQV9FVEhFUk5FVAorCXRyaXN0YXRlICJFbGFzdGljIE5ldHdvcmsgQWRhcHRlciAoRU5BKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gKFBDSV9NU0kgJiYgWDg2KQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIEVsYXN0aWMgTmV0d29yayBBZGFwdGVyIChFTkEpIgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLgorCSAgVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBlbmEuCisKK2VuZGlmICNORVRfVkVORE9SX0FNQVpPTgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMGI3M2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgQW1hem9uIG5ldHdvcmsgZGV2aWNlIGRyaXZlcnMuCisjCisKK29iai0kKENPTkZJR19FTkFfRVRIRVJORVQpICs9IGVuYS8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZWVhZTA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBFbGFzdGljIE5ldHdvcmsgQWRhcHRlciAoRU5BKSBkZXZpY2UgZHJpdmVycy4KKyMKKworb2JqLSQoQ09ORklHX0VOQV9FVEhFUk5FVCkgKz0gZW5hLm8KKworZW5hLXkgOj0gZW5hX25ldGRldi5vIGVuYV9jb20ubyBlbmFfZXRoX2NvbS5vIGVuYV9ldGh0b29sLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX2FkbWluX2RlZnMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX2FkbWluX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDZlNzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfYWRtaW5fZGVmcy5oCkBAIC0wLDAgKzEsOTczIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgLSAyMDE2IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKyNpZm5kZWYgX0VOQV9BRE1JTl9IXworI2RlZmluZSBfRU5BX0FETUlOX0hfCisKK2VudW0gZW5hX2FkbWluX2FxX29wY29kZSB7CisJRU5BX0FETUlOX0NSRUFURV9TUQk9IDEsCisKKwlFTkFfQURNSU5fREVTVFJPWV9TUQk9IDIsCisKKwlFTkFfQURNSU5fQ1JFQVRFX0NRCT0gMywKKworCUVOQV9BRE1JTl9ERVNUUk9ZX0NRCT0gNCwKKworCUVOQV9BRE1JTl9HRVRfRkVBVFVSRQk9IDgsCisKKwlFTkFfQURNSU5fU0VUX0ZFQVRVUkUJPSA5LAorCisJRU5BX0FETUlOX0dFVF9TVEFUUwk9IDExLAorfTsKKworZW51bSBlbmFfYWRtaW5fYXFfY29tcGxldGlvbl9zdGF0dXMgeworCUVOQV9BRE1JTl9TVUNDRVNTCQkJPSAwLAorCisJRU5BX0FETUlOX1JFU09VUkNFX0FMTE9DQVRJT05fRkFJTFVSRQk9IDEsCisKKwlFTkFfQURNSU5fQkFEX09QQ09ERQkJCT0gMiwKKworCUVOQV9BRE1JTl9VTlNVUFBPUlRFRF9PUENPREUJCT0gMywKKworCUVOQV9BRE1JTl9NQUxGT1JNRURfUkVRVUVTVAkJPSA0LAorCisJLyogQWRkaXRpb25hbCBzdGF0dXMgaXMgcHJvdmlkZWQgaW4gQUNRIGVudHJ5IGV4dGVuZGVkX3N0YXR1cyAqLworCUVOQV9BRE1JTl9JTExFR0FMX1BBUkFNRVRFUgkJPSA1LAorCisJRU5BX0FETUlOX1VOS05PV05fRVJST1IJCQk9IDYsCit9OworCitlbnVtIGVuYV9hZG1pbl9hcV9mZWF0dXJlX2lkIHsKKwlFTkFfQURNSU5fREVWSUNFX0FUVFJJQlVURVMJCT0gMSwKKworCUVOQV9BRE1JTl9NQVhfUVVFVUVTX05VTQkJPSAyLAorCisJRU5BX0FETUlOX1JTU19IQVNIX0ZVTkNUSU9OCQk9IDEwLAorCisJRU5BX0FETUlOX1NUQVRFTEVTU19PRkZMT0FEX0NPTkZJRwk9IDExLAorCisJRU5BX0FETUlOX1JTU19SRURJUkVDVElPTl9UQUJMRV9DT05GSUcJPSAxMiwKKworCUVOQV9BRE1JTl9NVFUJCQkJPSAxNCwKKworCUVOQV9BRE1JTl9SU1NfSEFTSF9JTlBVVAkJPSAxOCwKKworCUVOQV9BRE1JTl9JTlRFUlJVUFRfTU9ERVJBVElPTgkJPSAyMCwKKworCUVOQV9BRE1JTl9BRU5RX0NPTkZJRwkJCT0gMjYsCisKKwlFTkFfQURNSU5fTElOS19DT05GSUcJCQk9IDI3LAorCisJRU5BX0FETUlOX0hPU1RfQVRUUl9DT05GSUcJCT0gMjgsCisKKwlFTkFfQURNSU5fRkVBVFVSRVNfT1BDT0RFX05VTQkJPSAzMiwKK307CisKK2VudW0gZW5hX2FkbWluX3BsYWNlbWVudF9wb2xpY3lfdHlwZSB7CisJLyogZGVzY3JpcHRvcnMgYW5kIGhlYWRlcnMgYXJlIGluIGhvc3QgbWVtb3J5ICovCisJRU5BX0FETUlOX1BMQUNFTUVOVF9QT0xJQ1lfSE9TVAk9IDEsCisKKwkvKiBkZXNjcmlwdG9ycyBhbmQgaGVhZGVycyBhcmUgaW4gZGV2aWNlIG1lbW9yeSAoYS5rLmEgTG93IExhdGVuY3kKKwkgKiBRdWV1ZSkKKwkgKi8KKwlFTkFfQURNSU5fUExBQ0VNRU5UX1BPTElDWV9ERVYJPSAzLAorfTsKKworZW51bSBlbmFfYWRtaW5fbGlua190eXBlcyB7CisJRU5BX0FETUlOX0xJTktfU1BFRURfMUcJCT0gMHgxLAorCisJRU5BX0FETUlOX0xJTktfU1BFRURfMl9IQUxGX0cJPSAweDIsCisKKwlFTkFfQURNSU5fTElOS19TUEVFRF81RwkJPSAweDQsCisKKwlFTkFfQURNSU5fTElOS19TUEVFRF8xMEcJPSAweDgsCisKKwlFTkFfQURNSU5fTElOS19TUEVFRF8yNUcJPSAweDEwLAorCisJRU5BX0FETUlOX0xJTktfU1BFRURfNDBHCT0gMHgyMCwKKworCUVOQV9BRE1JTl9MSU5LX1NQRUVEXzUwRwk9IDB4NDAsCisKKwlFTkFfQURNSU5fTElOS19TUEVFRF8xMDBHCT0gMHg4MCwKKworCUVOQV9BRE1JTl9MSU5LX1NQRUVEXzIwMEcJPSAweDEwMCwKKworCUVOQV9BRE1JTl9MSU5LX1NQRUVEXzQwMEcJPSAweDIwMCwKK307CisKK2VudW0gZW5hX2FkbWluX2NvbXBsZXRpb25fcG9saWN5X3R5cGUgeworCS8qIGNvbXBsZXRpb24gcXVldWUgZW50cnkgZm9yIGVhY2ggc3EgZGVzY3JpcHRvciAqLworCUVOQV9BRE1JTl9DT01QTEVUSU9OX1BPTElDWV9ERVNDCQk9IDAsCisKKwkvKiBjb21wbGV0aW9uIHF1ZXVlIGVudHJ5IHVwb24gcmVxdWVzdCBpbiBzcSBkZXNjcmlwdG9yICovCisJRU5BX0FETUlOX0NPTVBMRVRJT05fUE9MSUNZX0RFU0NfT05fREVNQU5ECT0gMSwKKworCS8qIGN1cnJlbnQgcXVldWUgaGVhZCBwb2ludGVyIGlzIHVwZGF0ZWQgaW4gT1MgbWVtb3J5IHVwb24gc3EKKwkgKiBkZXNjcmlwdG9yIHJlcXVlc3QKKwkgKi8KKwlFTkFfQURNSU5fQ09NUExFVElPTl9QT0xJQ1lfSEVBRF9PTl9ERU1BTkQJPSAyLAorCisJLyogY3VycmVudCBxdWV1ZSBoZWFkIHBvaW50ZXIgaXMgdXBkYXRlZCBpbiBPUyBtZW1vcnkgZm9yIGVhY2ggc3EKKwkgKiBkZXNjcmlwdG9yCisJICovCisJRU5BX0FETUlOX0NPTVBMRVRJT05fUE9MSUNZX0hFQUQJCT0gMywKK307CisKKy8qIGJhc2ljIHN0YXRzIHJldHVybiBlbmFfYWRtaW5fYmFzaWNfc3RhdHMgd2hpbGUgZXh0YW5kZWQgc3RhdHMgcmV0dXJuIGEKKyAqIGJ1ZmZlciAoc3RyaW5nIGZvcm1hdCkgd2l0aCBhZGRpdGlvbmFsIHN0YXRpc3RpY3MgcGVyIHF1ZXVlIGFuZCBwZXIKKyAqIGRldmljZSBpZAorICovCitlbnVtIGVuYV9hZG1pbl9nZXRfc3RhdHNfdHlwZSB7CisJRU5BX0FETUlOX0dFVF9TVEFUU19UWVBFX0JBU0lDCQk9IDAsCisKKwlFTkFfQURNSU5fR0VUX1NUQVRTX1RZUEVfRVhURU5ERUQJPSAxLAorfTsKKworZW51bSBlbmFfYWRtaW5fZ2V0X3N0YXRzX3Njb3BlIHsKKwlFTkFfQURNSU5fU1BFQ0lGSUNfUVVFVUUJPSAwLAorCisJRU5BX0FETUlOX0VUSF9UUkFGRklDCQk9IDEsCit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2FxX2NvbW1vbl9kZXNjIHsKKwkvKiAxMTowIDogY29tbWFuZF9pZAorCSAqIDE1OjEyIDogcmVzZXJ2ZWQxMgorCSAqLworCXUxNiBjb21tYW5kX2lkOworCisJLyogYXMgYXBwZWFycyBpbiBlbmFfYWRtaW5fYXFfb3Bjb2RlICovCisJdTggb3Bjb2RlOworCisJLyogMCA6IHBoYXNlCisJICogMSA6IGN0cmxfZGF0YSAtIGNvbnRyb2wgYnVmZmVyIGFkZHJlc3MgdmFsaWQKKwkgKiAyIDogY3RybF9kYXRhX2luZGlyZWN0IC0gY29udHJvbCBidWZmZXIgYWRkcmVzcworCSAqICAgIHBvaW50cyB0byBsaXN0IG9mIHBhZ2VzIHdpdGggYWRkcmVzc2VzIG9mIGNvbnRyb2wKKwkgKiAgICBidWZmZXJzCisJICogNzozIDogcmVzZXJ2ZWQzCisJICovCisJdTggZmxhZ3M7Cit9OworCisvKiB1c2VkIGluIGVuYV9hZG1pbl9hcV9lbnRyeS4gQ2FuIHBvaW50IGRpcmVjdGx5IHRvIGNvbnRyb2wgZGF0YSwgb3IgdG8gYQorICogcGFnZSBsaXN0IGNodW5rLiBVc2VkIGFsc28gYXQgdGhlIGVuZCBvZiBpbmRpcmVjdCBtb2RlIHBhZ2UgbGlzdCBjaHVua3MsCisgKiBmb3IgY2hhaW5pbmcuCisgKi8KK3N0cnVjdCBlbmFfYWRtaW5fY3RybF9idWZmX2luZm8geworCXUzMiBsZW5ndGg7CisKKwlzdHJ1Y3QgZW5hX2NvbW1vbl9tZW1fYWRkciBhZGRyZXNzOworfTsKKworc3RydWN0IGVuYV9hZG1pbl9zcSB7CisJdTE2IHNxX2lkeDsKKworCS8qIDQ6MCA6IHJlc2VydmVkCisJICogNzo1IDogc3FfZGlyZWN0aW9uIC0gMHgxIC0gVHg7IDB4MiAtIFJ4CisJICovCisJdTggc3FfaWRlbnRpdHk7CisKKwl1OCByZXNlcnZlZDE7Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2FxX2VudHJ5IHsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FxX2NvbW1vbl9kZXNjIGFxX2NvbW1vbl9kZXNjcmlwdG9yOworCisJdW5pb24geworCQl1MzIgaW5saW5lX2RhdGFfdzFbM107CisKKwkJc3RydWN0IGVuYV9hZG1pbl9jdHJsX2J1ZmZfaW5mbyBjb250cm9sX2J1ZmZlcjsKKwl9IHU7CisKKwl1MzIgaW5saW5lX2RhdGFfdzRbMTJdOworfTsKKworc3RydWN0IGVuYV9hZG1pbl9hY3FfY29tbW9uX2Rlc2MgeworCS8qIGNvbW1hbmQgaWRlbnRpZmllciB0byBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgYXEgZGVzY3JpcHRvcgorCSAqIDExOjAgOiBjb21tYW5kX2lkCisJICogMTU6MTIgOiByZXNlcnZlZDEyCisJICovCisJdTE2IGNvbW1hbmQ7CisKKwl1OCBzdGF0dXM7CisKKwkvKiAwIDogcGhhc2UKKwkgKiA3OjEgOiByZXNlcnZlZDEKKwkgKi8KKwl1OCBmbGFnczsKKworCXUxNiBleHRlbmRlZF9zdGF0dXM7CisKKwkvKiBzZXJ2ZXMgYXMgYSBoaW50IHdoYXQgQVEgZW50cmllcyBjYW4gYmUgcmV2b2tlZCAqLworCXUxNiBzcV9oZWFkX2luZHg7Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2FjcV9lbnRyeSB7CisJc3RydWN0IGVuYV9hZG1pbl9hY3FfY29tbW9uX2Rlc2MgYWNxX2NvbW1vbl9kZXNjcmlwdG9yOworCisJdTMyIHJlc3BvbnNlX3NwZWNpZmljX2RhdGFbMTRdOworfTsKKworc3RydWN0IGVuYV9hZG1pbl9hcV9jcmVhdGVfc3FfY21kIHsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FxX2NvbW1vbl9kZXNjIGFxX2NvbW1vbl9kZXNjcmlwdG9yOworCisJLyogNDowIDogcmVzZXJ2ZWQwX3cxCisJICogNzo1IDogc3FfZGlyZWN0aW9uIC0gMHgxIC0gVHgsIDB4MiAtIFJ4CisJICovCisJdTggc3FfaWRlbnRpdHk7CisKKwl1OCByZXNlcnZlZDhfdzE7CisKKwkvKiAzOjAgOiBwbGFjZW1lbnRfcG9saWN5IC0gRGVzY3JpYmluZyB3aGVyZSB0aGUgU1EKKwkgKiAgICBkZXNjcmlwdG9yIHJpbmcgYW5kIHRoZSBTUSBwYWNrZXQgaGVhZGVycyByZXNpZGU6CisJICogICAgMHgxIC0gZGVzY3JpcHRvcnMgYW5kIGhlYWRlcnMgYXJlIGluIE9TIG1lbW9yeSwKKwkgKiAgICAweDMgLSBkZXNjcmlwdG9ycyBhbmQgaGVhZGVycyBpbiBkZXZpY2UgbWVtb3J5CisJICogICAgKGEuay5hIExvdyBMYXRlbmN5IFF1ZXVlKQorCSAqIDY6NCA6IGNvbXBsZXRpb25fcG9saWN5IC0gRGVzY3JpYmluZyB3aGF0IHBvbGljeQorCSAqICAgIHRvIHVzZSBmb3IgZ2VuZXJhdGlvbiBjb21wbGV0aW9uIGVudHJ5IChjcWUpIGluCisJICogICAgdGhlIENRIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFNROiAweDAgLSBjcWUgZm9yIGVhY2gKKwkgKiAgICBzcSBkZXNjcmlwdG9yLCAweDEgLSBjcWUgdXBvbiByZXF1ZXN0IGluIHNxCisJICogICAgZGVzY3JpcHRvciwgMHgyIC0gY3VycmVudCBxdWV1ZSBoZWFkIHBvaW50ZXIgaXMKKwkgKiAgICB1cGRhdGVkIGluIE9TIG1lbW9yeSB1cG9uIHNxIGRlc2NyaXB0b3IgcmVxdWVzdAorCSAqICAgIDB4MyAtIGN1cnJlbnQgcXVldWUgaGVhZCBwb2ludGVyIGlzIHVwZGF0ZWQgaW4gT1MKKwkgKiAgICBtZW1vcnkgZm9yIGVhY2ggc3EgZGVzY3JpcHRvcgorCSAqIDcgOiByZXNlcnZlZDE1X3cxCisJICovCisJdTggc3FfY2Fwc18yOworCisJLyogMCA6IGlzX3BoeXNpY2FsbHlfY29udGlndW91cyAtIERlc2NyaWJlZCBpZiB0aGUKKwkgKiAgICBxdWV1ZSByaW5nIG1lbW9yeSBpcyBhbGxvY2F0ZWQgaW4gcGh5c2ljYWwKKwkgKiAgICBjb250aWd1b3VzIHBhZ2VzIG9yIHNwbGl0LgorCSAqIDc6MSA6IHJlc2VydmVkMTdfdzEKKwkgKi8KKwl1OCBzcV9jYXBzXzM7CisKKwkvKiBhc3NvY2lhdGVkIGNvbXBsZXRpb24gcXVldWUgaWQuIFRoaXMgQ1EgbXVzdCBiZSBjcmVhdGVkIHByaW9yIHRvCisJICogICAgU1EgY3JlYXRpb24KKwkgKi8KKwl1MTYgY3FfaWR4OworCisJLyogc3VibWlzc2lvbiBxdWV1ZSBkZXB0aCBpbiBlbnRyaWVzICovCisJdTE2IHNxX2RlcHRoOworCisJLyogU1EgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIGluIE9TIG1lbW9yeS4gVGhpcyBmaWVsZCBzaG91bGQgbm90IGJlCisJICogdXNlZCBmb3IgTG93IExhdGVuY3kgcXVldWVzLiBIYXMgdG8gYmUgcGFnZSBhbGlnbmVkLgorCSAqLworCXN0cnVjdCBlbmFfY29tbW9uX21lbV9hZGRyIHNxX2JhOworCisJLyogc3BlY2lmaWVzIHF1ZXVlIGhlYWQgd3JpdGViYWNrIGxvY2F0aW9uIGluIE9TIG1lbW9yeS4gVmFsaWQgaWYKKwkgKiBjb21wbGV0aW9uX3BvbGljeSBpcyBzZXQgdG8gY29tcGxldGlvbl9wb2xpY3lfaGVhZF9vbl9kZW1hbmQgb3IKKwkgKiBjb21wbGV0aW9uX3BvbGljeV9oZWFkLiBIYXMgdG8gYmUgY2FjaGUgYWxpZ25lZAorCSAqLworCXN0cnVjdCBlbmFfY29tbW9uX21lbV9hZGRyIHNxX2hlYWRfd3JpdGViYWNrOworCisJdTMyIHJlc2VydmVkMF93NzsKKworCXUzMiByZXNlcnZlZDBfdzg7Cit9OworCitlbnVtIGVuYV9hZG1pbl9zcV9kaXJlY3Rpb24geworCUVOQV9BRE1JTl9TUV9ESVJFQ1RJT05fVFgJPSAxLAorCisJRU5BX0FETUlOX1NRX0RJUkVDVElPTl9SWAk9IDIsCit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2FjcV9jcmVhdGVfc3FfcmVzcF9kZXNjIHsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FjcV9jb21tb25fZGVzYyBhY3FfY29tbW9uX2Rlc2M7CisKKwl1MTYgc3FfaWR4OworCisJdTE2IHJlc2VydmVkOworCisJLyogcXVldWUgZG9vcmJlbGwgYWRkcmVzcyBhcyBhbiBvZmZzZXQgdG8gUENJZSBNTUlPIFJFRyBCQVIgKi8KKwl1MzIgc3FfZG9vcmJlbGxfb2Zmc2V0OworCisJLyogbG93IGxhdGVuY3kgcXVldWUgcmluZyBiYXNlIGFkZHJlc3MgYXMgYW4gb2Zmc2V0IHRvIFBDSWUgTU1JTworCSAqIExMUV9NRU0gQkFSCisJICovCisJdTMyIGxscV9kZXNjcmlwdG9yc19vZmZzZXQ7CisKKwkvKiBsb3cgbGF0ZW5jeSBxdWV1ZSBoZWFkZXJzJyBtZW1vcnkgYXMgYW4gb2Zmc2V0IHRvIFBDSWUgTU1JTworCSAqIExMUV9NRU0gQkFSCisJICovCisJdTMyIGxscV9oZWFkZXJzX29mZnNldDsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fYXFfZGVzdHJveV9zcV9jbWQgeworCXN0cnVjdCBlbmFfYWRtaW5fYXFfY29tbW9uX2Rlc2MgYXFfY29tbW9uX2Rlc2NyaXB0b3I7CisKKwlzdHJ1Y3QgZW5hX2FkbWluX3NxIHNxOworfTsKKworc3RydWN0IGVuYV9hZG1pbl9hY3FfZGVzdHJveV9zcV9yZXNwX2Rlc2MgeworCXN0cnVjdCBlbmFfYWRtaW5fYWNxX2NvbW1vbl9kZXNjIGFjcV9jb21tb25fZGVzYzsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fYXFfY3JlYXRlX2NxX2NtZCB7CisJc3RydWN0IGVuYV9hZG1pbl9hcV9jb21tb25fZGVzYyBhcV9jb21tb25fZGVzY3JpcHRvcjsKKworCS8qIDQ6MCA6IHJlc2VydmVkNQorCSAqIDUgOiBpbnRlcnJ1cHRfbW9kZV9lbmFibGVkIC0gaWYgc2V0LCBjcSBvcGVyYXRlcworCSAqICAgIGluIGludGVycnVwdCBtb2RlLCBvdGhlcndpc2UgLSBwb2xsaW5nCisJICogNzo2IDogcmVzZXJ2ZWQ2CisJICovCisJdTggY3FfY2Fwc18xOworCisJLyogNDowIDogY3FfZW50cnlfc2l6ZV93b3JkcyAtIHNpemUgb2YgQ1EgZW50cnkgaW4KKwkgKiAgICAzMi1iaXQgd29yZHMsIHZhbGlkIHZhbHVlczogNCwgOC4KKwkgKiA3OjUgOiByZXNlcnZlZDcKKwkgKi8KKwl1OCBjcV9jYXBzXzI7CisKKwkvKiBjb21wbGV0aW9uIHF1ZXVlIGRlcHRoIGluICMgb2YgZW50cmllcy4gbXVzdCBiZSBwb3dlciBvZiAyICovCisJdTE2IGNxX2RlcHRoOworCisJLyogbXNpeCB2ZWN0b3IgYXNzaWduZWQgdG8gdGhpcyBjcSAqLworCXUzMiBtc2l4X3ZlY3RvcjsKKworCS8qIGNxIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBpbiBPUyBtZW1vcnkuIENRIG11c3QgYmUgcGh5c2ljYWxseQorCSAqIGNvbnRpZ3VvdXMKKwkgKi8KKwlzdHJ1Y3QgZW5hX2NvbW1vbl9tZW1fYWRkciBjcV9iYTsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fYWNxX2NyZWF0ZV9jcV9yZXNwX2Rlc2MgeworCXN0cnVjdCBlbmFfYWRtaW5fYWNxX2NvbW1vbl9kZXNjIGFjcV9jb21tb25fZGVzYzsKKworCXUxNiBjcV9pZHg7CisKKwkvKiBhY3R1YWwgY3EgZGVwdGggaW4gbnVtYmVyIG9mIGVudHJpZXMgKi8KKwl1MTYgY3FfYWN0dWFsX2RlcHRoOworCisJdTMyIG51bWFfbm9kZV9yZWdpc3Rlcl9vZmZzZXQ7CisKKwl1MzIgY3FfaGVhZF9kYl9yZWdpc3Rlcl9vZmZzZXQ7CisKKwl1MzIgY3FfaW50ZXJydXB0X3VubWFza19yZWdpc3Rlcl9vZmZzZXQ7Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2FxX2Rlc3Ryb3lfY3FfY21kIHsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FxX2NvbW1vbl9kZXNjIGFxX2NvbW1vbl9kZXNjcmlwdG9yOworCisJdTE2IGNxX2lkeDsKKworCXUxNiByZXNlcnZlZDE7Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2FjcV9kZXN0cm95X2NxX3Jlc3BfZGVzYyB7CisJc3RydWN0IGVuYV9hZG1pbl9hY3FfY29tbW9uX2Rlc2MgYWNxX2NvbW1vbl9kZXNjOworfTsKKworLyogRU5BIEFRIEdldCBTdGF0aXN0aWNzIGNvbW1hbmQuIEV4dGVuZGVkIHN0YXRpc3RpY3MgYXJlIHBsYWNlZCBpbiBjb250cm9sCisgKiBidWZmZXIgcG9pbnRlZCBieSBBUSBlbnRyeQorICovCitzdHJ1Y3QgZW5hX2FkbWluX2FxX2dldF9zdGF0c19jbWQgeworCXN0cnVjdCBlbmFfYWRtaW5fYXFfY29tbW9uX2Rlc2MgYXFfY29tbW9uX2Rlc2NyaXB0b3I7CisKKwl1bmlvbiB7CisJCS8qIGNvbW1hbmQgc3BlY2lmaWMgaW5saW5lIGRhdGEgKi8KKwkJdTMyIGlubGluZV9kYXRhX3cxWzNdOworCisJCXN0cnVjdCBlbmFfYWRtaW5fY3RybF9idWZmX2luZm8gY29udHJvbF9idWZmZXI7CisJfSB1OworCisJLyogc3RhdHMgdHlwZSBhcyBkZWZpbmVkIGluIGVudW0gZW5hX2FkbWluX2dldF9zdGF0c190eXBlICovCisJdTggdHlwZTsKKworCS8qIHN0YXRzIHNjb3BlIGRlZmluZWQgaW4gZW51bSBlbmFfYWRtaW5fZ2V0X3N0YXRzX3Njb3BlICovCisJdTggc2NvcGU7CisKKwl1MTYgcmVzZXJ2ZWQzOworCisJLyogcXVldWUgaWQuIHVzZWQgd2hlbiBzY29wZSBpcyBzcGVjaWZpY19xdWV1ZSAqLworCXUxNiBxdWV1ZV9pZHg7CisKKwkvKiBkZXZpY2UgaWQsIHZhbHVlIDB4RkZGRiBtZWFucyBtaW5lLiBvbmx5IHByaXZpbGVnZWQgZGV2aWNlIGNhbiBnZXQKKwkgKiAgICBzdGF0cyBvZiBvdGhlciBkZXZpY2UKKwkgKi8KKwl1MTYgZGV2aWNlX2lkOworfTsKKworLyogQmFzaWMgU3RhdGlzdGljcyBDb21tYW5kLiAqLworc3RydWN0IGVuYV9hZG1pbl9iYXNpY19zdGF0cyB7CisJdTMyIHR4X2J5dGVzX2xvdzsKKworCXUzMiB0eF9ieXRlc19oaWdoOworCisJdTMyIHR4X3BrdHNfbG93OworCisJdTMyIHR4X3BrdHNfaGlnaDsKKworCXUzMiByeF9ieXRlc19sb3c7CisKKwl1MzIgcnhfYnl0ZXNfaGlnaDsKKworCXUzMiByeF9wa3RzX2xvdzsKKworCXUzMiByeF9wa3RzX2hpZ2g7CisKKwl1MzIgcnhfZHJvcHNfbG93OworCisJdTMyIHJ4X2Ryb3BzX2hpZ2g7Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2FjcV9nZXRfc3RhdHNfcmVzcCB7CisJc3RydWN0IGVuYV9hZG1pbl9hY3FfY29tbW9uX2Rlc2MgYWNxX2NvbW1vbl9kZXNjOworCisJc3RydWN0IGVuYV9hZG1pbl9iYXNpY19zdGF0cyBiYXNpY19zdGF0czsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fZ2V0X3NldF9mZWF0dXJlX2NvbW1vbl9kZXNjIHsKKwkvKiAxOjAgOiBzZWxlY3QgLSAweDEgLSBjdXJyZW50IHZhbHVlOyAweDMgLSBkZWZhdWx0CisJICogICAgdmFsdWUKKwkgKiA3OjMgOiByZXNlcnZlZDMKKwkgKi8KKwl1OCBmbGFnczsKKworCS8qIGFzIGFwcGVhcnMgaW4gZW5hX2FkbWluX2FxX2ZlYXR1cmVfaWQgKi8KKwl1OCBmZWF0dXJlX2lkOworCisJdTE2IHJlc2VydmVkMTY7Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2RldmljZV9hdHRyX2ZlYXR1cmVfZGVzYyB7CisJdTMyIGltcGxfaWQ7CisKKwl1MzIgZGV2aWNlX3ZlcnNpb247CisKKwkvKiBiaXRtYXAgb2YgZW5hX2FkbWluX2FxX2ZlYXR1cmVfaWQgKi8KKwl1MzIgc3VwcG9ydGVkX2ZlYXR1cmVzOworCisJdTMyIHJlc2VydmVkMzsKKworCS8qIEluZGljYXRlcyBob3cgbWFueSBiaXRzIGFyZSB1c2VkIHBoeXNpY2FsIGFkZHJlc3MgYWNjZXNzLiAqLworCXUzMiBwaHlzX2FkZHJfd2lkdGg7CisKKwkvKiBJbmRpY2F0ZXMgaG93IG1hbnkgYml0cyBhcmUgdXNlZCB2aXJ0dWFsIGFkZHJlc3MgYWNjZXNzLiAqLworCXUzMiB2aXJ0X2FkZHJfd2lkdGg7CisKKwkvKiB1bmljYXN0IE1BQyBhZGRyZXNzIChpbiBOZXR3b3JrIGJ5dGUgb3JkZXIpICovCisJdTggbWFjX2FkZHJbNl07CisKKwl1OCByZXNlcnZlZDdbMl07CisKKwl1MzIgbWF4X210dTsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fcXVldWVfZmVhdHVyZV9kZXNjIHsKKwkvKiBpbmNsdWRpbmcgTExRcyAqLworCXUzMiBtYXhfc3FfbnVtOworCisJdTMyIG1heF9zcV9kZXB0aDsKKworCXUzMiBtYXhfY3FfbnVtOworCisJdTMyIG1heF9jcV9kZXB0aDsKKworCXUzMiBtYXhfbGxxX251bTsKKworCXUzMiBtYXhfbGxxX2RlcHRoOworCisJdTMyIG1heF9oZWFkZXJfc2l6ZTsKKworCS8qIE1heGltdW0gRGVzY3JpcHRvcnMgbnVtYmVyLCBpbmNsdWRpbmcgbWV0YSBkZXNjcmlwdG9yLCBhbGxvd2VkIGZvcgorCSAqICAgIGEgc2luZ2xlIFR4IHBhY2tldAorCSAqLworCXUxNiBtYXhfcGFja2V0X3R4X2Rlc2NzOworCisJLyogTWF4aW11bSBEZXNjcmlwdG9ycyBudW1iZXIgYWxsb3dlZCBmb3IgYSBzaW5nbGUgUnggcGFja2V0ICovCisJdTE2IG1heF9wYWNrZXRfcnhfZGVzY3M7Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX3NldF9mZWF0dXJlX210dV9kZXNjIHsKKwkvKiBleGNsdWRlIEwyICovCisJdTMyIG10dTsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fc2V0X2ZlYXR1cmVfaG9zdF9hdHRyX2Rlc2MgeworCS8qIGhvc3QgT1MgaW5mbyBiYXNlIGFkZHJlc3MgaW4gT1MgbWVtb3J5LiBob3N0IGluZm8gaXMgNEtCIG9mCisJICogcGh5c2ljYWxseSBjb250aWd1b3VzCisJICovCisJc3RydWN0IGVuYV9jb21tb25fbWVtX2FkZHIgb3NfaW5mb19iYTsKKworCS8qIGhvc3QgZGVidWcgYXJlYSBiYXNlIGFkZHJlc3MgaW4gT1MgbWVtb3J5LiBkZWJ1ZyBhcmVhIG11c3QgYmUKKwkgKiBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMKKwkgKi8KKwlzdHJ1Y3QgZW5hX2NvbW1vbl9tZW1fYWRkciBkZWJ1Z19iYTsKKworCS8qIGRlYnVnIGFyZWEgc2l6ZSAqLworCXUzMiBkZWJ1Z19hcmVhX3NpemU7Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfaW50cl9tb2Rlcl9kZXNjIHsKKwkvKiBpbnRlcnJ1cHQgZGVsYXkgZ3JhbnVsYXJpdHkgaW4gdXNlYyAqLworCXUxNiBpbnRyX2RlbGF5X3Jlc29sdXRpb247CisKKwl1MTYgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2dldF9mZWF0dXJlX2xpbmtfZGVzYyB7CisJLyogTGluayBzcGVlZCBpbiBNYiAqLworCXUzMiBzcGVlZDsKKworCS8qIGJpdCBmaWVsZCBvZiBlbnVtIGVuYV9hZG1pbl9saW5rIHR5cGVzICovCisJdTMyIHN1cHBvcnRlZDsKKworCS8qIDAgOiBhdXRvbmVnCisJICogMSA6IGR1cGxleCAtIEZ1bGwgRHVwbGV4CisJICogMzE6MiA6IHJlc2VydmVkMgorCSAqLworCXUzMiBmbGFnczsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9hZW5xX2Rlc2MgeworCS8qIGJpdG1hc2sgZm9yIEFFTlEgZ3JvdXBzIHRoZSBkZXZpY2UgY2FuIHJlcG9ydCAqLworCXUzMiBzdXBwb3J0ZWRfZ3JvdXBzOworCisJLyogYml0bWFzayBmb3IgQUVOUSBncm91cHMgdG8gcmVwb3J0ICovCisJdTMyIGVuYWJsZWRfZ3JvdXBzOworfTsKKworc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX29mZmxvYWRfZGVzYyB7CisJLyogMCA6IFRYX0wzX2NzdW1faXB2NAorCSAqIDEgOiBUWF9MNF9pcHY0X2NzdW1fcGFydCAtIFRoZSBjaGVja3N1bSBmaWVsZAorCSAqICAgIHNob3VsZCBiZSBpbml0aWFsaXplZCB3aXRoIHBzZXVkbyBoZWFkZXIgY2hlY2tzdW0KKwkgKiAyIDogVFhfTDRfaXB2NF9jc3VtX2Z1bGwKKwkgKiAzIDogVFhfTDRfaXB2Nl9jc3VtX3BhcnQgLSBUaGUgY2hlY2tzdW0gZmllbGQKKwkgKiAgICBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgd2l0aCBwc2V1ZG8gaGVhZGVyIGNoZWNrc3VtCisJICogNCA6IFRYX0w0X2lwdjZfY3N1bV9mdWxsCisJICogNSA6IHRzb19pcHY0CisJICogNiA6IHRzb19pcHY2CisJICogNyA6IHRzb19lY24KKwkgKi8KKwl1MzIgdHg7CisKKwkvKiBSZWNlaXZlIHNpZGUgc3VwcG9ydGVkIHN0YXRlbGVzcyBvZmZsb2FkCisJICogMCA6IFJYX0wzX2NzdW1faXB2NCAtIElQdjQgY2hlY2tzdW0KKwkgKiAxIDogUlhfTDRfaXB2NF9jc3VtIC0gVENQL1VEUC9JUHY0IGNoZWNrc3VtCisJICogMiA6IFJYX0w0X2lwdjZfY3N1bSAtIFRDUC9VRFAvSVB2NiBjaGVja3N1bQorCSAqIDMgOiBSWF9oYXNoIC0gSGFzaCBjYWxjdWxhdGlvbgorCSAqLworCXUzMiByeF9zdXBwb3J0ZWQ7CisKKwl1MzIgcnhfZW5hYmxlZDsKK307CisKK2VudW0gZW5hX2FkbWluX2hhc2hfZnVuY3Rpb25zIHsKKwlFTkFfQURNSU5fVE9FUExJVFoJPSAxLAorCisJRU5BX0FETUlOX0NSQzMyCQk9IDIsCit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfcnNzX2Zsb3dfaGFzaF9jb250cm9sIHsKKwl1MzIga2V5c19udW07CisKKwl1MzIgcmVzZXJ2ZWQ7CisKKwl1MzIga2V5WzEwXTsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9yc3NfZmxvd19oYXNoX2Z1bmN0aW9uIHsKKwkvKiA3OjAgOiBmdW5jcyAtIGJpdG1hc2sgb2YgZW5hX2FkbWluX2hhc2hfZnVuY3Rpb25zICovCisJdTMyIHN1cHBvcnRlZF9mdW5jOworCisJLyogNzowIDogc2VsZWN0ZWRfZnVuYyAtIGJpdG1hc2sgb2YKKwkgKiAgICBlbmFfYWRtaW5faGFzaF9mdW5jdGlvbnMKKwkgKi8KKwl1MzIgc2VsZWN0ZWRfZnVuYzsKKworCS8qIGluaXRpYWwgdmFsdWUgKi8KKwl1MzIgaW5pdF92YWw7Cit9OworCisvKiBSU1MgZmxvdyBoYXNoIHByb3RvY29scyAqLworZW51bSBlbmFfYWRtaW5fZmxvd19oYXNoX3Byb3RvIHsKKwlFTkFfQURNSU5fUlNTX1RDUDQJPSAwLAorCisJRU5BX0FETUlOX1JTU19VRFA0CT0gMSwKKworCUVOQV9BRE1JTl9SU1NfVENQNgk9IDIsCisKKwlFTkFfQURNSU5fUlNTX1VEUDYJPSAzLAorCisJRU5BX0FETUlOX1JTU19JUDQJPSA0LAorCisJRU5BX0FETUlOX1JTU19JUDYJPSA1LAorCisJRU5BX0FETUlOX1JTU19JUDRfRlJBRwk9IDYsCisKKwlFTkFfQURNSU5fUlNTX05PVF9JUAk9IDcsCisKKwlFTkFfQURNSU5fUlNTX1BST1RPX05VTQk9IDE2LAorfTsKKworLyogUlNTIGZsb3cgaGFzaCBmaWVsZHMgKi8KK2VudW0gZW5hX2FkbWluX2Zsb3dfaGFzaF9maWVsZHMgeworCS8qIEV0aGVybmV0IERlc3QgQWRkciAqLworCUVOQV9BRE1JTl9SU1NfTDJfREEJPSAwLAorCisJLyogRXRoZXJuZXQgU3JjIEFkZHIgKi8KKwlFTkFfQURNSU5fUlNTX0wyX1NBCT0gMSwKKworCS8qIGlwdjQvNiBEZXN0IEFkZHIgKi8KKwlFTkFfQURNSU5fUlNTX0wzX0RBCT0gMiwKKworCS8qIGlwdjQvNiBTcmMgQWRkciAqLworCUVOQV9BRE1JTl9SU1NfTDNfU0EJPSA1LAorCisJLyogdGNwL3VkcCBEZXN0IFBvcnQgKi8KKwlFTkFfQURNSU5fUlNTX0w0X0RQCT0gNiwKKworCS8qIHRjcC91ZHAgU3JjIFBvcnQgKi8KKwlFTkFfQURNSU5fUlNTX0w0X1NQCT0gNywKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fcHJvdG9faW5wdXQgeworCS8qIGZsb3cgaGFzaCBmaWVsZHMgKGJpdHdpc2UgYWNjb3JkaW5nIHRvIGVuYV9hZG1pbl9mbG93X2hhc2hfZmllbGRzKSAqLworCXUxNiBmaWVsZHM7CisKKwl1MTYgcmVzZXJ2ZWQyOworfTsKKworc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX3Jzc19oYXNoX2NvbnRyb2wgeworCXN0cnVjdCBlbmFfYWRtaW5fcHJvdG9faW5wdXQgc3VwcG9ydGVkX2ZpZWxkc1tFTkFfQURNSU5fUlNTX1BST1RPX05VTV07CisKKwlzdHJ1Y3QgZW5hX2FkbWluX3Byb3RvX2lucHV0IHNlbGVjdGVkX2ZpZWxkc1tFTkFfQURNSU5fUlNTX1BST1RPX05VTV07CisKKwlzdHJ1Y3QgZW5hX2FkbWluX3Byb3RvX2lucHV0IHJlc2VydmVkMltFTkFfQURNSU5fUlNTX1BST1RPX05VTV07CisKKwlzdHJ1Y3QgZW5hX2FkbWluX3Byb3RvX2lucHV0IHJlc2VydmVkM1tFTkFfQURNSU5fUlNTX1BST1RPX05VTV07Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfcnNzX2Zsb3dfaGFzaF9pbnB1dCB7CisJLyogc3VwcG9ydGVkIGhhc2ggaW5wdXQgc29ydGluZworCSAqIDEgOiBMM19zb3J0IC0gc3VwcG9ydCBzd2FwIEwzIGFkZHJlc3NlcyBpZiBEQSBpcworCSAqICAgIHNtYWxsZXIgdGhhbiBTQQorCSAqIDIgOiBMNF9zb3J0IC0gc3VwcG9ydCBzd2FwIEw0IHBvcnRzIGlmIERQIHNtYWxsZXIKKwkgKiAgICBTUAorCSAqLworCXUxNiBzdXBwb3J0ZWRfaW5wdXRfc29ydDsKKworCS8qIGVuYWJsZWQgaGFzaCBpbnB1dCBzb3J0aW5nCisJICogMSA6IGVuYWJsZV9MM19zb3J0IC0gZW5hYmxlIHN3YXAgTDMgYWRkcmVzc2VzIGlmCisJICogICAgREEgc21hbGxlciB0aGFuIFNBCisJICogMiA6IGVuYWJsZV9MNF9zb3J0IC0gZW5hYmxlIHN3YXAgTDQgcG9ydHMgaWYgRFAKKwkgKiAgICBzbWFsbGVyIHRoYW4gU1AKKwkgKi8KKwl1MTYgZW5hYmxlZF9pbnB1dF9zb3J0OworfTsKKworZW51bSBlbmFfYWRtaW5fb3NfdHlwZSB7CisJRU5BX0FETUlOX09TX0xJTlVYCT0gMSwKKworCUVOQV9BRE1JTl9PU19XSU4JPSAyLAorCisJRU5BX0FETUlOX09TX0RQREsJPSAzLAorCisJRU5BX0FETUlOX09TX0ZSRUVCU0QJPSA0LAorCisJRU5BX0FETUlOX09TX0lQWEUJPSA1LAorfTsKKworc3RydWN0IGVuYV9hZG1pbl9ob3N0X2luZm8geworCS8qIGRlZmluZWQgaW4gZW51bSBlbmFfYWRtaW5fb3NfdHlwZSAqLworCXUzMiBvc190eXBlOworCisJLyogb3MgZGlzdHJpYnV0aW9uIHN0cmluZyBmb3JtYXQgKi8KKwl1OCBvc19kaXN0X3N0clsxMjhdOworCisJLyogT1MgZGlzdHJpYnV0aW9uIG51bWVyaWMgZm9ybWF0ICovCisJdTMyIG9zX2Rpc3Q7CisKKwkvKiBrZXJuZWwgdmVyc2lvbiBzdHJpbmcgZm9ybWF0ICovCisJdTgga2VybmVsX3Zlcl9zdHJbMzJdOworCisJLyogS2VybmVsIHZlcnNpb24gbnVtZXJpYyBmb3JtYXQgKi8KKwl1MzIga2VybmVsX3ZlcjsKKworCS8qIDc6MCA6IG1ham9yCisJICogMTU6OCA6IG1pbm9yCisJICogMjM6MTYgOiBzdWJfbWlub3IKKwkgKi8KKwl1MzIgZHJpdmVyX3ZlcnNpb247CisKKwkvKiBmZWF0dXJlcyBiaXRtYXAgKi8KKwl1MzIgc3VwcG9ydGVkX25ldHdvcmtfZmVhdHVyZXNbNF07Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX3Jzc19pbmRfdGFibGVfZW50cnkgeworCXUxNiBjcV9pZHg7CisKKwl1MTYgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfcnNzX2luZF90YWJsZSB7CisJLyogbWluIHN1cHBvcnRlZCB0YWJsZSBzaXplICgyXm1pbl9zaXplKSAqLworCXUxNiBtaW5fc2l6ZTsKKworCS8qIG1heCBzdXBwb3J0ZWQgdGFibGUgc2l6ZSAoMl5tYXhfc2l6ZSkgKi8KKwl1MTYgbWF4X3NpemU7CisKKwkvKiB0YWJsZSBzaXplICgyXnNpemUpICovCisJdTE2IHNpemU7CisKKwl1MTYgcmVzZXJ2ZWQ7CisKKwkvKiBpbmRleCBvZiB0aGUgaW5saW5lIGVudHJ5LiAweEZGRkZGRkZGIG1lYW5zIGludmFsaWQgKi8KKwl1MzIgaW5saW5lX2luZGV4OworCisJLyogdXNlZCBmb3IgdXBkYXRpbmcgc2luZ2xlIGVudHJ5LCBpZ25vcmVkIHdoZW4gc2V0dGluZyB0aGUgZW50aXJlCisJICogdGFibGUgdGhyb3VnaCB0aGUgY29udHJvbCBidWZmZXIuCisJICovCisJc3RydWN0IGVuYV9hZG1pbl9yc3NfaW5kX3RhYmxlX2VudHJ5IGlubGluZV9lbnRyeTsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fZ2V0X2ZlYXRfY21kIHsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FxX2NvbW1vbl9kZXNjIGFxX2NvbW1vbl9kZXNjcmlwdG9yOworCisJc3RydWN0IGVuYV9hZG1pbl9jdHJsX2J1ZmZfaW5mbyBjb250cm9sX2J1ZmZlcjsKKworCXN0cnVjdCBlbmFfYWRtaW5fZ2V0X3NldF9mZWF0dXJlX2NvbW1vbl9kZXNjIGZlYXRfY29tbW9uOworCisJdTMyIHJhd1sxMV07Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2dldF9mZWF0X3Jlc3AgeworCXN0cnVjdCBlbmFfYWRtaW5fYWNxX2NvbW1vbl9kZXNjIGFjcV9jb21tb25fZGVzYzsKKworCXVuaW9uIHsKKwkJdTMyIHJhd1sxNF07CisKKwkJc3RydWN0IGVuYV9hZG1pbl9kZXZpY2VfYXR0cl9mZWF0dXJlX2Rlc2MgZGV2X2F0dHI7CisKKwkJc3RydWN0IGVuYV9hZG1pbl9xdWV1ZV9mZWF0dXJlX2Rlc2MgbWF4X3F1ZXVlOworCisJCXN0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9hZW5xX2Rlc2MgYWVucTsKKworCQlzdHJ1Y3QgZW5hX2FkbWluX2dldF9mZWF0dXJlX2xpbmtfZGVzYyBsaW5rOworCisJCXN0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9vZmZsb2FkX2Rlc2Mgb2ZmbG9hZDsKKworCQlzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfcnNzX2Zsb3dfaGFzaF9mdW5jdGlvbiBmbG93X2hhc2hfZnVuYzsKKworCQlzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfcnNzX2Zsb3dfaGFzaF9pbnB1dCBmbG93X2hhc2hfaW5wdXQ7CisKKwkJc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX3Jzc19pbmRfdGFibGUgaW5kX3RhYmxlOworCisJCXN0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9pbnRyX21vZGVyX2Rlc2MgaW50cl9tb2RlcmF0aW9uOworCX0gdTsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fc2V0X2ZlYXRfY21kIHsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FxX2NvbW1vbl9kZXNjIGFxX2NvbW1vbl9kZXNjcmlwdG9yOworCisJc3RydWN0IGVuYV9hZG1pbl9jdHJsX2J1ZmZfaW5mbyBjb250cm9sX2J1ZmZlcjsKKworCXN0cnVjdCBlbmFfYWRtaW5fZ2V0X3NldF9mZWF0dXJlX2NvbW1vbl9kZXNjIGZlYXRfY29tbW9uOworCisJdW5pb24geworCQl1MzIgcmF3WzExXTsKKworCQkvKiBtdHUgc2l6ZSAqLworCQlzdHJ1Y3QgZW5hX2FkbWluX3NldF9mZWF0dXJlX210dV9kZXNjIG10dTsKKworCQkvKiBob3N0IGF0dHJpYnV0ZXMgKi8KKwkJc3RydWN0IGVuYV9hZG1pbl9zZXRfZmVhdHVyZV9ob3N0X2F0dHJfZGVzYyBob3N0X2F0dHI7CisKKwkJLyogQUVOUSBjb25maWd1cmF0aW9uICovCisJCXN0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9hZW5xX2Rlc2MgYWVucTsKKworCQkvKiByc3MgZmxvdyBoYXNoIGZ1bmN0aW9uICovCisJCXN0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9yc3NfZmxvd19oYXNoX2Z1bmN0aW9uIGZsb3dfaGFzaF9mdW5jOworCisJCS8qIHJzcyBmbG93IGhhc2ggaW5wdXQgKi8KKwkJc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX3Jzc19mbG93X2hhc2hfaW5wdXQgZmxvd19oYXNoX2lucHV0OworCisJCS8qIHJzcyBpbmRpcmVjdGlvbiB0YWJsZSAqLworCQlzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfcnNzX2luZF90YWJsZSBpbmRfdGFibGU7CisJfSB1OworfTsKKworc3RydWN0IGVuYV9hZG1pbl9zZXRfZmVhdF9yZXNwIHsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FjcV9jb21tb25fZGVzYyBhY3FfY29tbW9uX2Rlc2M7CisKKwl1bmlvbiB7CisJCXUzMiByYXdbMTRdOworCX0gdTsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fYWVucV9jb21tb25fZGVzYyB7CisJdTE2IGdyb3VwOworCisJdTE2IHN5bmRyb207CisKKwkvKiAwIDogcGhhc2UgKi8KKwl1OCBmbGFnczsKKworCXU4IHJlc2VydmVkMVszXTsKKworCXUzMiB0aW1lc3RhbXBfbG93OworCisJdTMyIHRpbWVzdGFtcF9oaWdoOworfTsKKworLyogYXN5bmNocm9ub3VzIGV2ZW50IG5vdGlmaWNhdGlvbiBncm91cHMgKi8KK2VudW0gZW5hX2FkbWluX2FlbnFfZ3JvdXAgeworCUVOQV9BRE1JTl9MSU5LX0NIQU5HRQkJPSAwLAorCisJRU5BX0FETUlOX0ZBVEFMX0VSUk9SCQk9IDEsCisKKwlFTkFfQURNSU5fV0FSTklORwkJPSAyLAorCisJRU5BX0FETUlOX05PVElGSUNBVElPTgkJPSAzLAorCisJRU5BX0FETUlOX0tFRVBfQUxJVkUJCT0gNCwKKworCUVOQV9BRE1JTl9BRU5RX0dST1VQU19OVU0JPSA1LAorfTsKKworZW51bSBlbmFfYWRtaW5fYWVucV9ub3RpZmljYXRpb25fc3luZHJvbSB7CisJRU5BX0FETUlOX1NVU1BFTkQJPSAwLAorCisJRU5BX0FETUlOX1JFU1VNRQk9IDEsCit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2FlbnFfZW50cnkgeworCXN0cnVjdCBlbmFfYWRtaW5fYWVucV9jb21tb25fZGVzYyBhZW5xX2NvbW1vbl9kZXNjOworCisJLyogY29tbWFuZCBzcGVjaWZpYyBpbmxpbmUgZGF0YSAqLworCXUzMiBpbmxpbmVfZGF0YV93NFsxMl07Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2FlbnFfbGlua19jaGFuZ2VfZGVzYyB7CisJc3RydWN0IGVuYV9hZG1pbl9hZW5xX2NvbW1vbl9kZXNjIGFlbnFfY29tbW9uX2Rlc2M7CisKKwkvKiAwIDogbGlua19zdGF0dXMgKi8KKwl1MzIgZmxhZ3M7Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2VuYV9tbWlvX3JlcV9yZWFkX2xlc3NfcmVzcCB7CisJdTE2IHJlcV9pZDsKKworCXUxNiByZWdfb2ZmOworCisJLyogdmFsdWUgaXMgdmFsaWQgd2hlbiBwb2xsIGlzIGNsZWFyZWQgKi8KKwl1MzIgcmVnX3ZhbDsKK307CisKKy8qIGFxX2NvbW1vbl9kZXNjICovCisjZGVmaW5lIEVOQV9BRE1JTl9BUV9DT01NT05fREVTQ19DT01NQU5EX0lEX01BU0sgR0VOTUFTSygxMSwgMCkKKyNkZWZpbmUgRU5BX0FETUlOX0FRX0NPTU1PTl9ERVNDX1BIQVNFX01BU0sgQklUKDApCisjZGVmaW5lIEVOQV9BRE1JTl9BUV9DT01NT05fREVTQ19DVFJMX0RBVEFfU0hJRlQgMQorI2RlZmluZSBFTkFfQURNSU5fQVFfQ09NTU9OX0RFU0NfQ1RSTF9EQVRBX01BU0sgQklUKDEpCisjZGVmaW5lIEVOQV9BRE1JTl9BUV9DT01NT05fREVTQ19DVFJMX0RBVEFfSU5ESVJFQ1RfU0hJRlQgMgorI2RlZmluZSBFTkFfQURNSU5fQVFfQ09NTU9OX0RFU0NfQ1RSTF9EQVRBX0lORElSRUNUX01BU0sgQklUKDIpCisKKy8qIHNxICovCisjZGVmaW5lIEVOQV9BRE1JTl9TUV9TUV9ESVJFQ1RJT05fU0hJRlQgNQorI2RlZmluZSBFTkFfQURNSU5fU1FfU1FfRElSRUNUSU9OX01BU0sgR0VOTUFTSyg3LCA1KQorCisvKiBhY3FfY29tbW9uX2Rlc2MgKi8KKyNkZWZpbmUgRU5BX0FETUlOX0FDUV9DT01NT05fREVTQ19DT01NQU5EX0lEX01BU0sgR0VOTUFTSygxMSwgMCkKKyNkZWZpbmUgRU5BX0FETUlOX0FDUV9DT01NT05fREVTQ19QSEFTRV9NQVNLIEJJVCgwKQorCisvKiBhcV9jcmVhdGVfc3FfY21kICovCisjZGVmaW5lIEVOQV9BRE1JTl9BUV9DUkVBVEVfU1FfQ01EX1NRX0RJUkVDVElPTl9TSElGVCA1CisjZGVmaW5lIEVOQV9BRE1JTl9BUV9DUkVBVEVfU1FfQ01EX1NRX0RJUkVDVElPTl9NQVNLIEdFTk1BU0soNywgNSkKKyNkZWZpbmUgRU5BX0FETUlOX0FRX0NSRUFURV9TUV9DTURfUExBQ0VNRU5UX1BPTElDWV9NQVNLIEdFTk1BU0soMywgMCkKKyNkZWZpbmUgRU5BX0FETUlOX0FRX0NSRUFURV9TUV9DTURfQ09NUExFVElPTl9QT0xJQ1lfU0hJRlQgNAorI2RlZmluZSBFTkFfQURNSU5fQVFfQ1JFQVRFX1NRX0NNRF9DT01QTEVUSU9OX1BPTElDWV9NQVNLIEdFTk1BU0soNiwgNCkKKyNkZWZpbmUgRU5BX0FETUlOX0FRX0NSRUFURV9TUV9DTURfSVNfUEhZU0lDQUxMWV9DT05USUdVT1VTX01BU0sgQklUKDApCisKKy8qIGFxX2NyZWF0ZV9jcV9jbWQgKi8KKyNkZWZpbmUgRU5BX0FETUlOX0FRX0NSRUFURV9DUV9DTURfSU5URVJSVVBUX01PREVfRU5BQkxFRF9TSElGVCA1CisjZGVmaW5lIEVOQV9BRE1JTl9BUV9DUkVBVEVfQ1FfQ01EX0lOVEVSUlVQVF9NT0RFX0VOQUJMRURfTUFTSyBCSVQoNSkKKyNkZWZpbmUgRU5BX0FETUlOX0FRX0NSRUFURV9DUV9DTURfQ1FfRU5UUllfU0laRV9XT1JEU19NQVNLIEdFTk1BU0soNCwgMCkKKworLyogZ2V0X3NldF9mZWF0dXJlX2NvbW1vbl9kZXNjICovCisjZGVmaW5lIEVOQV9BRE1JTl9HRVRfU0VUX0ZFQVRVUkVfQ09NTU9OX0RFU0NfU0VMRUNUX01BU0sgR0VOTUFTSygxLCAwKQorCisvKiBnZXRfZmVhdHVyZV9saW5rX2Rlc2MgKi8KKyNkZWZpbmUgRU5BX0FETUlOX0dFVF9GRUFUVVJFX0xJTktfREVTQ19BVVRPTkVHX01BU0sgQklUKDApCisjZGVmaW5lIEVOQV9BRE1JTl9HRVRfRkVBVFVSRV9MSU5LX0RFU0NfRFVQTEVYX1NISUZUIDEKKyNkZWZpbmUgRU5BX0FETUlOX0dFVF9GRUFUVVJFX0xJTktfREVTQ19EVVBMRVhfTUFTSyBCSVQoMSkKKworLyogZmVhdHVyZV9vZmZsb2FkX2Rlc2MgKi8KKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1RYX0wzX0NTVU1fSVBWNF9NQVNLIEJJVCgwKQorI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfVFhfTDRfSVBWNF9DU1VNX1BBUlRfU0hJRlQgMQorI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfVFhfTDRfSVBWNF9DU1VNX1BBUlRfTUFTSyBCSVQoMSkKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1RYX0w0X0lQVjRfQ1NVTV9GVUxMX1NISUZUIDIKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1RYX0w0X0lQVjRfQ1NVTV9GVUxMX01BU0sgQklUKDIpCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19UWF9MNF9JUFY2X0NTVU1fUEFSVF9TSElGVCAzCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19UWF9MNF9JUFY2X0NTVU1fUEFSVF9NQVNLIEJJVCgzKQorI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfVFhfTDRfSVBWNl9DU1VNX0ZVTExfU0hJRlQgNAorI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfVFhfTDRfSVBWNl9DU1VNX0ZVTExfTUFTSyBCSVQoNCkKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1RTT19JUFY0X1NISUZUIDUKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1RTT19JUFY0X01BU0sgQklUKDUpCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19UU09fSVBWNl9TSElGVCA2CisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19UU09fSVBWNl9NQVNLIEJJVCg2KQorI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfVFNPX0VDTl9TSElGVCA3CisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19UU09fRUNOX01BU0sgQklUKDcpCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19SWF9MM19DU1VNX0lQVjRfTUFTSyBCSVQoMCkKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1JYX0w0X0lQVjRfQ1NVTV9TSElGVCAxCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19SWF9MNF9JUFY0X0NTVU1fTUFTSyBCSVQoMSkKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1JYX0w0X0lQVjZfQ1NVTV9TSElGVCAyCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19SWF9MNF9JUFY2X0NTVU1fTUFTSyBCSVQoMikKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1JYX0hBU0hfU0hJRlQgMworI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfUlhfSEFTSF9NQVNLIEJJVCgzKQorCisvKiBmZWF0dXJlX3Jzc19mbG93X2hhc2hfZnVuY3Rpb24gKi8KKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfUlNTX0ZMT1dfSEFTSF9GVU5DVElPTl9GVU5DU19NQVNLIEdFTk1BU0soNywgMCkKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfUlNTX0ZMT1dfSEFTSF9GVU5DVElPTl9TRUxFQ1RFRF9GVU5DX01BU0sgR0VOTUFTSyg3LCAwKQorCisvKiBmZWF0dXJlX3Jzc19mbG93X2hhc2hfaW5wdXQgKi8KKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfUlNTX0ZMT1dfSEFTSF9JTlBVVF9MM19TT1JUX1NISUZUIDEKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfUlNTX0ZMT1dfSEFTSF9JTlBVVF9MM19TT1JUX01BU0sgQklUKDEpCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX1JTU19GTE9XX0hBU0hfSU5QVVRfTDRfU09SVF9TSElGVCAyCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX1JTU19GTE9XX0hBU0hfSU5QVVRfTDRfU09SVF9NQVNLIEJJVCgyKQorI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9SU1NfRkxPV19IQVNIX0lOUFVUX0VOQUJMRV9MM19TT1JUX1NISUZUIDEKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfUlNTX0ZMT1dfSEFTSF9JTlBVVF9FTkFCTEVfTDNfU09SVF9NQVNLIEJJVCgxKQorI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9SU1NfRkxPV19IQVNIX0lOUFVUX0VOQUJMRV9MNF9TT1JUX1NISUZUIDIKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfUlNTX0ZMT1dfSEFTSF9JTlBVVF9FTkFCTEVfTDRfU09SVF9NQVNLIEJJVCgyKQorCisvKiBob3N0X2luZm8gKi8KKyNkZWZpbmUgRU5BX0FETUlOX0hPU1RfSU5GT19NQUpPUl9NQVNLIEdFTk1BU0soNywgMCkKKyNkZWZpbmUgRU5BX0FETUlOX0hPU1RfSU5GT19NSU5PUl9TSElGVCA4CisjZGVmaW5lIEVOQV9BRE1JTl9IT1NUX0lORk9fTUlOT1JfTUFTSyBHRU5NQVNLKDE1LCA4KQorI2RlZmluZSBFTkFfQURNSU5fSE9TVF9JTkZPX1NVQl9NSU5PUl9TSElGVCAxNgorI2RlZmluZSBFTkFfQURNSU5fSE9TVF9JTkZPX1NVQl9NSU5PUl9NQVNLIEdFTk1BU0soMjMsIDE2KQorCisvKiBhZW5xX2NvbW1vbl9kZXNjICovCisjZGVmaW5lIEVOQV9BRE1JTl9BRU5RX0NPTU1PTl9ERVNDX1BIQVNFX01BU0sgQklUKDApCisKKy8qIGFlbnFfbGlua19jaGFuZ2VfZGVzYyAqLworI2RlZmluZSBFTkFfQURNSU5fQUVOUV9MSU5LX0NIQU5HRV9ERVNDX0xJTktfU1RBVFVTX01BU0sgQklUKDApCisKKyNlbmRpZiAvKl9FTkFfQURNSU5fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX2NvbS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfY29tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA2NmQ5YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX2NvbS5jCkBAIC0wLDAgKzEsMjY2NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImVuYV9jb20uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaW1lb3V0IGluIG1pY3JvLXNlYyAqLworI2RlZmluZSBBRE1JTl9DTURfVElNRU9VVF9VUyAoMTAwMDAwMCkKKworI2RlZmluZSBFTkFfQVNZTkNfUVVFVUVfREVQVEggNAorI2RlZmluZSBFTkFfQURNSU5fUVVFVUVfREVQVEggMzIKKworI2RlZmluZSBNSU5fRU5BX1ZFUiAoKChFTkFfQ09NTU9OX1NQRUNfVkVSU0lPTl9NQUpPUikgPDwgXAorCQlFTkFfUkVHU19WRVJTSU9OX01BSk9SX1ZFUlNJT05fU0hJRlQpIFwKKwkJfCAoRU5BX0NPTU1PTl9TUEVDX1ZFUlNJT05fTUlOT1IpKQorCisjZGVmaW5lIEVOQV9DVFJMX01BSk9SCQkwCisjZGVmaW5lIEVOQV9DVFJMX01JTk9SCQkwCisjZGVmaW5lIEVOQV9DVFJMX1NVQl9NSU5PUgkxCisKKyNkZWZpbmUgTUlOX0VOQV9DVFJMX1ZFUiBcCisJKCgoRU5BX0NUUkxfTUFKT1IpIDw8IFwKKwkoRU5BX1JFR1NfQ09OVFJPTExFUl9WRVJTSU9OX01BSk9SX1ZFUlNJT05fU0hJRlQpKSB8IFwKKwkoKEVOQV9DVFJMX01JTk9SKSA8PCBcCisJKEVOQV9SRUdTX0NPTlRST0xMRVJfVkVSU0lPTl9NSU5PUl9WRVJTSU9OX1NISUZUKSkgfCBcCisJKEVOQV9DVFJMX1NVQl9NSU5PUikpCisKKyNkZWZpbmUgRU5BX0RNQV9BRERSX1RPX1VJTlQzMl9MT1coeCkJKCh1MzIpKCh1NjQpKHgpKSkKKyNkZWZpbmUgRU5BX0RNQV9BRERSX1RPX1VJTlQzMl9ISUdIKHgpCSgodTMyKSgoKHU2NCkoeCkpID4+IDMyKSkKKworI2RlZmluZSBFTkFfTU1JT19SRUFEX1RJTUVPVVQgMHhGRkZGRkZGRgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2VudW0gZW5hX2NtZF9zdGF0dXMgeworCUVOQV9DTURfU1VCTUlUVEVELAorCUVOQV9DTURfQ09NUExFVEVELAorCS8qIEFib3J0IC0gY2FuY2VsZWQgYnkgdGhlIGRyaXZlciAqLworCUVOQV9DTURfQUJPUlRFRCwKK307CisKK3N0cnVjdCBlbmFfY29tcF9jdHggeworCXN0cnVjdCBjb21wbGV0aW9uIHdhaXRfZXZlbnQ7CisJc3RydWN0IGVuYV9hZG1pbl9hY3FfZW50cnkgKnVzZXJfY3FlOworCXUzMiBjb21wX3NpemU7CisJZW51bSBlbmFfY21kX3N0YXR1cyBzdGF0dXM7CisJLyogc3RhdHVzIGZyb20gdGhlIGRldmljZSAqLworCXU4IGNvbXBfc3RhdHVzOworCXU4IGNtZF9vcGNvZGU7CisJYm9vbCBvY2N1cGllZDsKK307CisKK3N0cnVjdCBlbmFfY29tX3N0YXRzX2N0eCB7CisJc3RydWN0IGVuYV9hZG1pbl9hcV9nZXRfc3RhdHNfY21kIGdldF9jbWQ7CisJc3RydWN0IGVuYV9hZG1pbl9hY3FfZ2V0X3N0YXRzX3Jlc3AgZ2V0X3Jlc3A7Cit9OworCitzdGF0aWMgaW5saW5lIGludCBlbmFfY29tX21lbV9hZGRyX3NldChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkJICAgICAgIHN0cnVjdCBlbmFfY29tbW9uX21lbV9hZGRyICplbmFfYWRkciwKKwkJCQkgICAgICAgZG1hX2FkZHJfdCBhZGRyKQoreworCWlmICgoYWRkciAmIEdFTk1BU0tfVUxMKGVuYV9kZXYtPmRtYV9hZGRyX2JpdHMgLSAxLCAwKSkgIT0gYWRkcikgeworCQlwcl9lcnIoImRtYSBhZGRyZXNzIGhhcyBtb3JlIGJpdHMgdGhhdCB0aGUgZGV2aWNlIHN1cHBvcnRzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZW5hX2FkZHItPm1lbV9hZGRyX2xvdyA9ICh1MzIpYWRkcjsKKwllbmFfYWRkci0+bWVtX2FkZHJfaGlnaCA9ICh1NjQpYWRkciA+PiAzMjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuYV9jb21fYWRtaW5faW5pdF9zcShzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqcXVldWUpCit7CisJc3RydWN0IGVuYV9jb21fYWRtaW5fc3EgKnNxID0gJnF1ZXVlLT5zcTsKKwl1MTYgc2l6ZSA9IEFETUlOX1NRX1NJWkUocXVldWUtPnFfZGVwdGgpOworCisJc3EtPmVudHJpZXMgPSBkbWFfemFsbG9jX2NvaGVyZW50KHF1ZXVlLT5xX2RtYWRldiwgc2l6ZSwgJnNxLT5kbWFfYWRkciwKKwkJCQkJICBHRlBfS0VSTkVMKTsKKworCWlmICghc3EtPmVudHJpZXMpIHsKKwkJcHJfZXJyKCJtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3EtPmhlYWQgPSAwOworCXNxLT50YWlsID0gMDsKKwlzcS0+cGhhc2UgPSAxOworCisJc3EtPmRiX2FkZHIgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2NvbV9hZG1pbl9pbml0X2NxKHN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICpxdWV1ZSkKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9jcSAqY3EgPSAmcXVldWUtPmNxOworCXUxNiBzaXplID0gQURNSU5fQ1FfU0laRShxdWV1ZS0+cV9kZXB0aCk7CisKKwljcS0+ZW50cmllcyA9IGRtYV96YWxsb2NfY29oZXJlbnQocXVldWUtPnFfZG1hZGV2LCBzaXplLCAmY3EtPmRtYV9hZGRyLAorCQkJCQkgIEdGUF9LRVJORUwpOworCisJaWYgKCFjcS0+ZW50cmllcykgeworCQlwcl9lcnIoIm1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljcS0+aGVhZCA9IDA7CisJY3EtPnBoYXNlID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuYV9jb21fYWRtaW5faW5pdF9hZW5xKHN0cnVjdCBlbmFfY29tX2RldiAqZGV2LAorCQkJCSAgIHN0cnVjdCBlbmFfYWVucV9oYW5kbGVycyAqYWVucV9oYW5kbGVycykKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9hZW5xICphZW5xID0gJmRldi0+YWVucTsKKwl1MzIgYWRkcl9sb3csIGFkZHJfaGlnaCwgYWVucV9jYXBzOworCXUxNiBzaXplOworCisJZGV2LT5hZW5xLnFfZGVwdGggPSBFTkFfQVNZTkNfUVVFVUVfREVQVEg7CisJc2l6ZSA9IEFETUlOX0FFTlFfU0laRShFTkFfQVNZTkNfUVVFVUVfREVQVEgpOworCWFlbnEtPmVudHJpZXMgPSBkbWFfemFsbG9jX2NvaGVyZW50KGRldi0+ZG1hZGV2LCBzaXplLCAmYWVucS0+ZG1hX2FkZHIsCisJCQkJCSAgICBHRlBfS0VSTkVMKTsKKworCWlmICghYWVucS0+ZW50cmllcykgeworCQlwcl9lcnIoIm1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlhZW5xLT5oZWFkID0gYWVucS0+cV9kZXB0aDsKKwlhZW5xLT5waGFzZSA9IDE7CisKKwlhZGRyX2xvdyA9IEVOQV9ETUFfQUREUl9UT19VSU5UMzJfTE9XKGFlbnEtPmRtYV9hZGRyKTsKKwlhZGRyX2hpZ2ggPSBFTkFfRE1BX0FERFJfVE9fVUlOVDMyX0hJR0goYWVucS0+ZG1hX2FkZHIpOworCisJd3JpdGVsKGFkZHJfbG93LCBkZXYtPnJlZ19iYXIgKyBFTkFfUkVHU19BRU5RX0JBU0VfTE9fT0ZGKTsKKwl3cml0ZWwoYWRkcl9oaWdoLCBkZXYtPnJlZ19iYXIgKyBFTkFfUkVHU19BRU5RX0JBU0VfSElfT0ZGKTsKKworCWFlbnFfY2FwcyA9IDA7CisJYWVucV9jYXBzIHw9IGRldi0+YWVucS5xX2RlcHRoICYgRU5BX1JFR1NfQUVOUV9DQVBTX0FFTlFfREVQVEhfTUFTSzsKKwlhZW5xX2NhcHMgfD0gKHNpemVvZihzdHJ1Y3QgZW5hX2FkbWluX2FlbnFfZW50cnkpCisJCSAgICAgIDw8IEVOQV9SRUdTX0FFTlFfQ0FQU19BRU5RX0VOVFJZX1NJWkVfU0hJRlQpICYKKwkJICAgICBFTkFfUkVHU19BRU5RX0NBUFNfQUVOUV9FTlRSWV9TSVpFX01BU0s7CisJd3JpdGVsKGFlbnFfY2FwcywgZGV2LT5yZWdfYmFyICsgRU5BX1JFR1NfQUVOUV9DQVBTX09GRik7CisKKwlpZiAodW5saWtlbHkoIWFlbnFfaGFuZGxlcnMpKSB7CisJCXByX2VycigiYWVucSBoYW5kbGVycyBwb2ludGVyIGlzIE5VTExcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlhZW5xLT5hZW5xX2hhbmRsZXJzID0gYWVucV9oYW5kbGVyczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY29tcF9jdHh0X3JlbGVhc2Uoc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKnF1ZXVlLAorCQkJCSAgICAgc3RydWN0IGVuYV9jb21wX2N0eCAqY29tcF9jdHgpCit7CisJY29tcF9jdHgtPm9jY3VwaWVkID0gZmFsc2U7CisJYXRvbWljX2RlYygmcXVldWUtPm91dHN0YW5kaW5nX2NtZHMpOworfQorCitzdGF0aWMgc3RydWN0IGVuYV9jb21wX2N0eCAqZ2V0X2NvbXBfY3R4dChzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqcXVldWUsCisJCQkJCSAgdTE2IGNvbW1hbmRfaWQsIGJvb2wgY2FwdHVyZSkKK3sKKwlpZiAodW5saWtlbHkoY29tbWFuZF9pZCA+PSBxdWV1ZS0+cV9kZXB0aCkpIHsKKwkJcHJfZXJyKCJjb21tYW5kIGlkIGlzIGxhcmdlciB0aGFuIHRoZSBxdWV1ZSBzaXplLiBjbWRfaWQ6ICV1IHF1ZXVlIHNpemUgJWRcbiIsCisJCSAgICAgICBjb21tYW5kX2lkLCBxdWV1ZS0+cV9kZXB0aCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICh1bmxpa2VseShxdWV1ZS0+Y29tcF9jdHhbY29tbWFuZF9pZF0ub2NjdXBpZWQgJiYgY2FwdHVyZSkpIHsKKwkJcHJfZXJyKCJDb21wbGV0aW9uIGNvbnRleHQgaXMgb2NjdXBpZWRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoY2FwdHVyZSkgeworCQlhdG9taWNfaW5jKCZxdWV1ZS0+b3V0c3RhbmRpbmdfY21kcyk7CisJCXF1ZXVlLT5jb21wX2N0eFtjb21tYW5kX2lkXS5vY2N1cGllZCA9IHRydWU7CisJfQorCisJcmV0dXJuICZxdWV1ZS0+Y29tcF9jdHhbY29tbWFuZF9pZF07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZW5hX2NvbXBfY3R4ICpfX2VuYV9jb21fc3VibWl0X2FkbWluX2NtZChzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqYWRtaW5fcXVldWUsCisJCQkJCQkgICAgICAgc3RydWN0IGVuYV9hZG1pbl9hcV9lbnRyeSAqY21kLAorCQkJCQkJICAgICAgIHNpemVfdCBjbWRfc2l6ZV9pbl9ieXRlcywKKwkJCQkJCSAgICAgICBzdHJ1Y3QgZW5hX2FkbWluX2FjcV9lbnRyeSAqY29tcCwKKwkJCQkJCSAgICAgICBzaXplX3QgY29tcF9zaXplX2luX2J5dGVzKQoreworCXN0cnVjdCBlbmFfY29tcF9jdHggKmNvbXBfY3R4OworCXUxNiB0YWlsX21hc2tlZCwgY21kX2lkOworCXUxNiBxdWV1ZV9zaXplX21hc2s7CisJdTE2IGNudDsKKworCXF1ZXVlX3NpemVfbWFzayA9IGFkbWluX3F1ZXVlLT5xX2RlcHRoIC0gMTsKKworCXRhaWxfbWFza2VkID0gYWRtaW5fcXVldWUtPnNxLnRhaWwgJiBxdWV1ZV9zaXplX21hc2s7CisKKwkvKiBJbiBjYXNlIG9mIHF1ZXVlIEZVTEwgKi8KKwljbnQgPSBhZG1pbl9xdWV1ZS0+c3EudGFpbCAtIGFkbWluX3F1ZXVlLT5zcS5oZWFkOworCWlmIChjbnQgPj0gYWRtaW5fcXVldWUtPnFfZGVwdGgpIHsKKwkJcHJfZGVidWcoImFkbWluIHF1ZXVlIGlzIEZVTEwgKHRhaWwgJWQgaGVhZCAlZCBkZXB0aDogJWQpXG4iLAorCQkJIGFkbWluX3F1ZXVlLT5zcS50YWlsLCBhZG1pbl9xdWV1ZS0+c3EuaGVhZCwKKwkJCSBhZG1pbl9xdWV1ZS0+cV9kZXB0aCk7CisJCWFkbWluX3F1ZXVlLT5zdGF0cy5vdXRfb2Zfc3BhY2UrKzsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT1NQQyk7CisJfQorCisJY21kX2lkID0gYWRtaW5fcXVldWUtPmN1cnJfY21kX2lkOworCisJY21kLT5hcV9jb21tb25fZGVzY3JpcHRvci5mbGFncyB8PSBhZG1pbl9xdWV1ZS0+c3EucGhhc2UgJgorCQlFTkFfQURNSU5fQVFfQ09NTU9OX0RFU0NfUEhBU0VfTUFTSzsKKworCWNtZC0+YXFfY29tbW9uX2Rlc2NyaXB0b3IuY29tbWFuZF9pZCB8PSBjbWRfaWQgJgorCQlFTkFfQURNSU5fQVFfQ09NTU9OX0RFU0NfQ09NTUFORF9JRF9NQVNLOworCisJY29tcF9jdHggPSBnZXRfY29tcF9jdHh0KGFkbWluX3F1ZXVlLCBjbWRfaWQsIHRydWUpOworCWlmICh1bmxpa2VseSghY29tcF9jdHgpKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCWNvbXBfY3R4LT5zdGF0dXMgPSBFTkFfQ01EX1NVQk1JVFRFRDsKKwljb21wX2N0eC0+Y29tcF9zaXplID0gKHUzMiljb21wX3NpemVfaW5fYnl0ZXM7CisJY29tcF9jdHgtPnVzZXJfY3FlID0gY29tcDsKKwljb21wX2N0eC0+Y21kX29wY29kZSA9IGNtZC0+YXFfY29tbW9uX2Rlc2NyaXB0b3Iub3Bjb2RlOworCisJcmVpbml0X2NvbXBsZXRpb24oJmNvbXBfY3R4LT53YWl0X2V2ZW50KTsKKworCW1lbWNweSgmYWRtaW5fcXVldWUtPnNxLmVudHJpZXNbdGFpbF9tYXNrZWRdLCBjbWQsIGNtZF9zaXplX2luX2J5dGVzKTsKKworCWFkbWluX3F1ZXVlLT5jdXJyX2NtZF9pZCA9IChhZG1pbl9xdWV1ZS0+Y3Vycl9jbWRfaWQgKyAxKSAmCisJCXF1ZXVlX3NpemVfbWFzazsKKworCWFkbWluX3F1ZXVlLT5zcS50YWlsKys7CisJYWRtaW5fcXVldWUtPnN0YXRzLnN1Ym1pdHRlZF9jbWQrKzsKKworCWlmICh1bmxpa2VseSgoYWRtaW5fcXVldWUtPnNxLnRhaWwgJiBxdWV1ZV9zaXplX21hc2spID09IDApKQorCQlhZG1pbl9xdWV1ZS0+c3EucGhhc2UgPSAhYWRtaW5fcXVldWUtPnNxLnBoYXNlOworCisJd3JpdGVsKGFkbWluX3F1ZXVlLT5zcS50YWlsLCBhZG1pbl9xdWV1ZS0+c3EuZGJfYWRkcik7CisKKwlyZXR1cm4gY29tcF9jdHg7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGVuYV9jb21faW5pdF9jb21wX2N0eHQoc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKnF1ZXVlKQoreworCXNpemVfdCBzaXplID0gcXVldWUtPnFfZGVwdGggKiBzaXplb2Yoc3RydWN0IGVuYV9jb21wX2N0eCk7CisJc3RydWN0IGVuYV9jb21wX2N0eCAqY29tcF9jdHg7CisJdTE2IGk7CisKKwlxdWV1ZS0+Y29tcF9jdHggPSBkZXZtX2t6YWxsb2MocXVldWUtPnFfZG1hZGV2LCBzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIXF1ZXVlLT5jb21wX2N0eCkpIHsKKwkJcHJfZXJyKCJtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZm9yIChpID0gMDsgaSA8IHF1ZXVlLT5xX2RlcHRoOyBpKyspIHsKKwkJY29tcF9jdHggPSBnZXRfY29tcF9jdHh0KHF1ZXVlLCBpLCBmYWxzZSk7CisJCWlmIChjb21wX2N0eCkKKwkJCWluaXRfY29tcGxldGlvbigmY29tcF9jdHgtPndhaXRfZXZlbnQpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGVuYV9jb21wX2N0eCAqZW5hX2NvbV9zdWJtaXRfYWRtaW5fY21kKHN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICphZG1pbl9xdWV1ZSwKKwkJCQkJCSAgICAgc3RydWN0IGVuYV9hZG1pbl9hcV9lbnRyeSAqY21kLAorCQkJCQkJICAgICBzaXplX3QgY21kX3NpemVfaW5fYnl0ZXMsCisJCQkJCQkgICAgIHN0cnVjdCBlbmFfYWRtaW5fYWNxX2VudHJ5ICpjb21wLAorCQkJCQkJICAgICBzaXplX3QgY29tcF9zaXplX2luX2J5dGVzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGVuYV9jb21wX2N0eCAqY29tcF9jdHg7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRtaW5fcXVldWUtPnFfbG9jaywgZmxhZ3MpOworCWlmICh1bmxpa2VseSghYWRtaW5fcXVldWUtPnJ1bm5pbmdfc3RhdGUpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkbWluX3F1ZXVlLT5xX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisJfQorCWNvbXBfY3R4ID0gX19lbmFfY29tX3N1Ym1pdF9hZG1pbl9jbWQoYWRtaW5fcXVldWUsIGNtZCwKKwkJCQkJICAgICAgY21kX3NpemVfaW5fYnl0ZXMsCisJCQkJCSAgICAgIGNvbXAsCisJCQkJCSAgICAgIGNvbXBfc2l6ZV9pbl9ieXRlcyk7CisJaWYgKHVubGlrZWx5KElTX0VSUihjb21wX2N0eCkpKQorCQlhZG1pbl9xdWV1ZS0+cnVubmluZ19zdGF0ZSA9IGZhbHNlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkbWluX3F1ZXVlLT5xX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBjb21wX2N0eDsKK30KKworc3RhdGljIGludCBlbmFfY29tX2luaXRfaW9fc3Eoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJICAgICAgc3RydWN0IGVuYV9jb21fY3JlYXRlX2lvX2N0eCAqY3R4LAorCQkJICAgICAgc3RydWN0IGVuYV9jb21faW9fc3EgKmlvX3NxKQoreworCXNpemVfdCBzaXplOworCWludCBkZXZfbm9kZSA9IDA7CisKKwltZW1zZXQoJmlvX3NxLT5kZXNjX2FkZHIsIDB4MCwgc2l6ZW9mKHN0cnVjdCBlbmFfY29tX2lvX2Rlc2NfYWRkcikpOworCisJaW9fc3EtPmRlc2NfZW50cnlfc2l6ZSA9CisJCShpb19zcS0+ZGlyZWN0aW9uID09IEVOQV9DT01fSU9fUVVFVUVfRElSRUNUSU9OX1RYKSA/CisJCXNpemVvZihzdHJ1Y3QgZW5hX2V0aF9pb190eF9kZXNjKSA6CisJCXNpemVvZihzdHJ1Y3QgZW5hX2V0aF9pb19yeF9kZXNjKTsKKworCXNpemUgPSBpb19zcS0+ZGVzY19lbnRyeV9zaXplICogaW9fc3EtPnFfZGVwdGg7CisKKwlpZiAoaW9fc3EtPm1lbV9xdWV1ZV90eXBlID09IEVOQV9BRE1JTl9QTEFDRU1FTlRfUE9MSUNZX0hPU1QpIHsKKwkJZGV2X25vZGUgPSBkZXZfdG9fbm9kZShlbmFfZGV2LT5kbWFkZXYpOworCQlzZXRfZGV2X25vZGUoZW5hX2Rldi0+ZG1hZGV2LCBjdHgtPm51bWFfbm9kZSk7CisJCWlvX3NxLT5kZXNjX2FkZHIudmlydF9hZGRyID0KKwkJCWRtYV96YWxsb2NfY29oZXJlbnQoZW5hX2Rldi0+ZG1hZGV2LCBzaXplLAorCQkJCQkgICAgJmlvX3NxLT5kZXNjX2FkZHIucGh5c19hZGRyLAorCQkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCXNldF9kZXZfbm9kZShlbmFfZGV2LT5kbWFkZXYsIGRldl9ub2RlKTsKKwkJaWYgKCFpb19zcS0+ZGVzY19hZGRyLnZpcnRfYWRkcikgeworCQkJaW9fc3EtPmRlc2NfYWRkci52aXJ0X2FkZHIgPQorCQkJCWRtYV96YWxsb2NfY29oZXJlbnQoZW5hX2Rldi0+ZG1hZGV2LCBzaXplLAorCQkJCQkJICAgICZpb19zcS0+ZGVzY19hZGRyLnBoeXNfYWRkciwKKwkJCQkJCSAgICBHRlBfS0VSTkVMKTsKKwkJfQorCX0gZWxzZSB7CisJCWRldl9ub2RlID0gZGV2X3RvX25vZGUoZW5hX2Rldi0+ZG1hZGV2KTsKKwkJc2V0X2Rldl9ub2RlKGVuYV9kZXYtPmRtYWRldiwgY3R4LT5udW1hX25vZGUpOworCQlpb19zcS0+ZGVzY19hZGRyLnZpcnRfYWRkciA9CisJCQlkZXZtX2t6YWxsb2MoZW5hX2Rldi0+ZG1hZGV2LCBzaXplLCBHRlBfS0VSTkVMKTsKKwkJc2V0X2Rldl9ub2RlKGVuYV9kZXYtPmRtYWRldiwgZGV2X25vZGUpOworCQlpZiAoIWlvX3NxLT5kZXNjX2FkZHIudmlydF9hZGRyKSB7CisJCQlpb19zcS0+ZGVzY19hZGRyLnZpcnRfYWRkciA9CisJCQkJZGV2bV9remFsbG9jKGVuYV9kZXYtPmRtYWRldiwgc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCX0KKwl9CisKKwlpZiAoIWlvX3NxLT5kZXNjX2FkZHIudmlydF9hZGRyKSB7CisJCXByX2VycigibWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlvX3NxLT50YWlsID0gMDsKKwlpb19zcS0+bmV4dF90b19jb21wID0gMDsKKwlpb19zcS0+cGhhc2UgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2NvbV9pbml0X2lvX2NxKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCSAgICAgIHN0cnVjdCBlbmFfY29tX2NyZWF0ZV9pb19jdHggKmN0eCwKKwkJCSAgICAgIHN0cnVjdCBlbmFfY29tX2lvX2NxICppb19jcSkKK3sKKwlzaXplX3Qgc2l6ZTsKKwlpbnQgcHJldl9ub2RlID0gMDsKKworCW1lbXNldCgmaW9fY3EtPmNkZXNjX2FkZHIsIDB4MCwgc2l6ZW9mKHN0cnVjdCBlbmFfY29tX2lvX2Rlc2NfYWRkcikpOworCisJLyogVXNlIHRoZSBiYXNpYyBjb21wbGV0aW9uIGRlc2NyaXB0b3IgZm9yIFJ4ICovCisJaW9fY3EtPmNkZXNjX2VudHJ5X3NpemVfaW5fYnl0ZXMgPQorCQkoaW9fY3EtPmRpcmVjdGlvbiA9PSBFTkFfQ09NX0lPX1FVRVVFX0RJUkVDVElPTl9UWCkgPworCQlzaXplb2Yoc3RydWN0IGVuYV9ldGhfaW9fdHhfY2Rlc2MpIDoKKwkJc2l6ZW9mKHN0cnVjdCBlbmFfZXRoX2lvX3J4X2NkZXNjX2Jhc2UpOworCisJc2l6ZSA9IGlvX2NxLT5jZGVzY19lbnRyeV9zaXplX2luX2J5dGVzICogaW9fY3EtPnFfZGVwdGg7CisKKwlwcmV2X25vZGUgPSBkZXZfdG9fbm9kZShlbmFfZGV2LT5kbWFkZXYpOworCXNldF9kZXZfbm9kZShlbmFfZGV2LT5kbWFkZXYsIGN0eC0+bnVtYV9ub2RlKTsKKwlpb19jcS0+Y2Rlc2NfYWRkci52aXJ0X2FkZHIgPQorCQlkbWFfemFsbG9jX2NvaGVyZW50KGVuYV9kZXYtPmRtYWRldiwgc2l6ZSwKKwkJCQkgICAgJmlvX2NxLT5jZGVzY19hZGRyLnBoeXNfYWRkciwgR0ZQX0tFUk5FTCk7CisJc2V0X2Rldl9ub2RlKGVuYV9kZXYtPmRtYWRldiwgcHJldl9ub2RlKTsKKwlpZiAoIWlvX2NxLT5jZGVzY19hZGRyLnZpcnRfYWRkcikgeworCQlpb19jcS0+Y2Rlc2NfYWRkci52aXJ0X2FkZHIgPQorCQkJZG1hX3phbGxvY19jb2hlcmVudChlbmFfZGV2LT5kbWFkZXYsIHNpemUsCisJCQkJCSAgICAmaW9fY3EtPmNkZXNjX2FkZHIucGh5c19hZGRyLAorCQkJCQkgICAgR0ZQX0tFUk5FTCk7CisJfQorCisJaWYgKCFpb19jcS0+Y2Rlc2NfYWRkci52aXJ0X2FkZHIpIHsKKwkJcHJfZXJyKCJtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaW9fY3EtPnBoYXNlID0gMTsKKwlpb19jcS0+aGVhZCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZW5hX2NvbV9oYW5kbGVfc2luZ2xlX2FkbWluX2NvbXBsZXRpb24oc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKmFkbWluX3F1ZXVlLAorCQkJCQkJICAgc3RydWN0IGVuYV9hZG1pbl9hY3FfZW50cnkgKmNxZSkKK3sKKwlzdHJ1Y3QgZW5hX2NvbXBfY3R4ICpjb21wX2N0eDsKKwl1MTYgY21kX2lkOworCisJY21kX2lkID0gY3FlLT5hY3FfY29tbW9uX2Rlc2NyaXB0b3IuY29tbWFuZCAmCisJCUVOQV9BRE1JTl9BQ1FfQ09NTU9OX0RFU0NfQ09NTUFORF9JRF9NQVNLOworCisJY29tcF9jdHggPSBnZXRfY29tcF9jdHh0KGFkbWluX3F1ZXVlLCBjbWRfaWQsIGZhbHNlKTsKKwlpZiAodW5saWtlbHkoIWNvbXBfY3R4KSkgeworCQlwcl9lcnIoImNvbXBfY3R4IGlzIE5VTEwuIENoYW5naW5nIHRoZSBhZG1pbiBxdWV1ZSBydW5uaW5nIHN0YXRlXG4iKTsKKwkJYWRtaW5fcXVldWUtPnJ1bm5pbmdfc3RhdGUgPSBmYWxzZTsKKwkJcmV0dXJuOworCX0KKworCWNvbXBfY3R4LT5zdGF0dXMgPSBFTkFfQ01EX0NPTVBMRVRFRDsKKwljb21wX2N0eC0+Y29tcF9zdGF0dXMgPSBjcWUtPmFjcV9jb21tb25fZGVzY3JpcHRvci5zdGF0dXM7CisKKwlpZiAoY29tcF9jdHgtPnVzZXJfY3FlKQorCQltZW1jcHkoY29tcF9jdHgtPnVzZXJfY3FlLCAodm9pZCAqKWNxZSwgY29tcF9jdHgtPmNvbXBfc2l6ZSk7CisKKwlpZiAoIWFkbWluX3F1ZXVlLT5wb2xsaW5nKQorCQljb21wbGV0ZSgmY29tcF9jdHgtPndhaXRfZXZlbnQpOworfQorCitzdGF0aWMgdm9pZCBlbmFfY29tX2hhbmRsZV9hZG1pbl9jb21wbGV0aW9uKHN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICphZG1pbl9xdWV1ZSkKK3sKKwlzdHJ1Y3QgZW5hX2FkbWluX2FjcV9lbnRyeSAqY3FlID0gTlVMTDsKKwl1MTYgY29tcF9udW0gPSAwOworCXUxNiBoZWFkX21hc2tlZDsKKwl1OCBwaGFzZTsKKworCWhlYWRfbWFza2VkID0gYWRtaW5fcXVldWUtPmNxLmhlYWQgJiAoYWRtaW5fcXVldWUtPnFfZGVwdGggLSAxKTsKKwlwaGFzZSA9IGFkbWluX3F1ZXVlLT5jcS5waGFzZTsKKworCWNxZSA9ICZhZG1pbl9xdWV1ZS0+Y3EuZW50cmllc1toZWFkX21hc2tlZF07CisKKwkvKiBHbyBvdmVyIGFsbCB0aGUgY29tcGxldGlvbnMgKi8KKwl3aGlsZSAoKGNxZS0+YWNxX2NvbW1vbl9kZXNjcmlwdG9yLmZsYWdzICYKKwkJCUVOQV9BRE1JTl9BQ1FfQ09NTU9OX0RFU0NfUEhBU0VfTUFTSykgPT0gcGhhc2UpIHsKKwkJLyogRG8gbm90IHJlYWQgdGhlIHJlc3Qgb2YgdGhlIGNvbXBsZXRpb24gZW50cnkgYmVmb3JlIHRoZQorCQkgKiBwaGFzZSBiaXQgd2FzIHZhbGlkYXRlZAorCQkgKi8KKwkJcm1iKCk7CisJCWVuYV9jb21faGFuZGxlX3NpbmdsZV9hZG1pbl9jb21wbGV0aW9uKGFkbWluX3F1ZXVlLCBjcWUpOworCisJCWhlYWRfbWFza2VkKys7CisJCWNvbXBfbnVtKys7CisJCWlmICh1bmxpa2VseShoZWFkX21hc2tlZCA9PSBhZG1pbl9xdWV1ZS0+cV9kZXB0aCkpIHsKKwkJCWhlYWRfbWFza2VkID0gMDsKKwkJCXBoYXNlID0gIXBoYXNlOworCQl9CisKKwkJY3FlID0gJmFkbWluX3F1ZXVlLT5jcS5lbnRyaWVzW2hlYWRfbWFza2VkXTsKKwl9CisKKwlhZG1pbl9xdWV1ZS0+Y3EuaGVhZCArPSBjb21wX251bTsKKwlhZG1pbl9xdWV1ZS0+Y3EucGhhc2UgPSBwaGFzZTsKKwlhZG1pbl9xdWV1ZS0+c3EuaGVhZCArPSBjb21wX251bTsKKwlhZG1pbl9xdWV1ZS0+c3RhdHMuY29tcGxldGVkX2NtZCArPSBjb21wX251bTsKK30KKworc3RhdGljIGludCBlbmFfY29tX2NvbXBfc3RhdHVzX3RvX2Vycm5vKHU4IGNvbXBfc3RhdHVzKQoreworCWlmICh1bmxpa2VseShjb21wX3N0YXR1cyAhPSAwKSkKKwkJcHJfZXJyKCJhZG1pbiBjb21tYW5kIGZhaWxlZFsldV1cbiIsIGNvbXBfc3RhdHVzKTsKKworCWlmICh1bmxpa2VseShjb21wX3N0YXR1cyA+IEVOQV9BRE1JTl9VTktOT1dOX0VSUk9SKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGNvbXBfc3RhdHVzKSB7CisJY2FzZSBFTkFfQURNSU5fU1VDQ0VTUzoKKwkJcmV0dXJuIDA7CisJY2FzZSBFTkFfQURNSU5fUkVTT1VSQ0VfQUxMT0NBVElPTl9GQUlMVVJFOgorCQlyZXR1cm4gLUVOT01FTTsKKwljYXNlIEVOQV9BRE1JTl9VTlNVUFBPUlRFRF9PUENPREU6CisJCXJldHVybiAtRVBFUk07CisJY2FzZSBFTkFfQURNSU5fQkFEX09QQ09ERToKKwljYXNlIEVOQV9BRE1JTl9NQUxGT1JNRURfUkVRVUVTVDoKKwljYXNlIEVOQV9BRE1JTl9JTExFR0FMX1BBUkFNRVRFUjoKKwljYXNlIEVOQV9BRE1JTl9VTktOT1dOX0VSUk9SOgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmFfY29tX3dhaXRfYW5kX3Byb2Nlc3NfYWRtaW5fY3FfcG9sbGluZyhzdHJ1Y3QgZW5hX2NvbXBfY3R4ICpjb21wX2N0eCwKKwkJCQkJCSAgICAgc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKmFkbWluX3F1ZXVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHN0YXJ0X3RpbWU7CisJaW50IHJldDsKKworCXN0YXJ0X3RpbWUgPSAoKHUzMilqaWZmaWVzX3RvX3VzZWNzKGppZmZpZXMpKTsKKworCXdoaWxlIChjb21wX2N0eC0+c3RhdHVzID09IEVOQV9DTURfU1VCTUlUVEVEKSB7CisJCWlmICgoKCh1MzIpamlmZmllc190b191c2VjcyhqaWZmaWVzKSkgLSBzdGFydF90aW1lKSA+CisJCSAgICBBRE1JTl9DTURfVElNRU9VVF9VUykgeworCQkJcHJfZXJyKCJXYWl0IGZvciBjb21wbGV0aW9uIChwb2xsaW5nKSB0aW1lb3V0XG4iKTsKKwkJCS8qIEVOQSBkaWRuJ3QgaGF2ZSBhbnkgY29tcGxldGlvbiAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkbWluX3F1ZXVlLT5xX2xvY2ssIGZsYWdzKTsKKwkJCWFkbWluX3F1ZXVlLT5zdGF0cy5ub19jb21wbGV0aW9uKys7CisJCQlhZG1pbl9xdWV1ZS0+cnVubmluZ19zdGF0ZSA9IGZhbHNlOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRtaW5fcXVldWUtPnFfbG9jaywgZmxhZ3MpOworCisJCQlyZXQgPSAtRVRJTUU7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZhZG1pbl9xdWV1ZS0+cV9sb2NrLCBmbGFncyk7CisJCWVuYV9jb21faGFuZGxlX2FkbWluX2NvbXBsZXRpb24oYWRtaW5fcXVldWUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZG1pbl9xdWV1ZS0+cV9sb2NrLCBmbGFncyk7CisKKwkJbXNsZWVwKDEwMCk7CisJfQorCisJaWYgKHVubGlrZWx5KGNvbXBfY3R4LT5zdGF0dXMgPT0gRU5BX0NNRF9BQk9SVEVEKSkgeworCQlwcl9lcnIoIkNvbW1hbmQgd2FzIGFib3J0ZWRcbiIpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRtaW5fcXVldWUtPnFfbG9jaywgZmxhZ3MpOworCQlhZG1pbl9xdWV1ZS0+c3RhdHMuYWJvcnRlZF9jbWQrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRtaW5fcXVldWUtPnFfbG9jaywgZmxhZ3MpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycjsKKwl9CisKKwlXQVJOKGNvbXBfY3R4LT5zdGF0dXMgIT0gRU5BX0NNRF9DT01QTEVURUQsICJJbnZhbGlkIGNvbXAgc3RhdHVzICVkXG4iLAorCSAgICAgY29tcF9jdHgtPnN0YXR1cyk7CisKKwlyZXQgPSBlbmFfY29tX2NvbXBfc3RhdHVzX3RvX2Vycm5vKGNvbXBfY3R4LT5jb21wX3N0YXR1cyk7CitlcnI6CisJY29tcF9jdHh0X3JlbGVhc2UoYWRtaW5fcXVldWUsIGNvbXBfY3R4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGVuYV9jb21fd2FpdF9hbmRfcHJvY2Vzc19hZG1pbl9jcV9pbnRlcnJ1cHRzKHN0cnVjdCBlbmFfY29tcF9jdHggKmNvbXBfY3R4LAorCQkJCQkJCXN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICphZG1pbl9xdWV1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmNvbXBfY3R4LT53YWl0X2V2ZW50LAorCQkJCSAgICB1c2Vjc190b19qaWZmaWVzKEFETUlOX0NNRF9USU1FT1VUX1VTKSk7CisKKwkvKiBJbiBjYXNlIHRoZSBjb21tYW5kIHdhc24ndCBjb21wbGV0ZWQgZmluZCBvdXQgdGhlIHJvb3QgY2F1c2UuCisJICogVGhlcmUgbWlnaHQgYmUgMiBraW5kcyBvZiBlcnJvcnMKKwkgKiAxKSBObyBjb21wbGV0aW9uICh0aW1lb3V0IHJlYWNoZWQpCisJICogMikgVGhlcmUgaXMgY29tcGxldGlvbiBidXQgdGhlIGRldmljZSBkaWRuJ3QgZ2V0IGFueSBtc2kteCBpbnRlcnJ1cHQuCisJICovCisJaWYgKHVubGlrZWx5KGNvbXBfY3R4LT5zdGF0dXMgPT0gRU5BX0NNRF9TVUJNSVRURUQpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhZG1pbl9xdWV1ZS0+cV9sb2NrLCBmbGFncyk7CisJCWVuYV9jb21faGFuZGxlX2FkbWluX2NvbXBsZXRpb24oYWRtaW5fcXVldWUpOworCQlhZG1pbl9xdWV1ZS0+c3RhdHMubm9fY29tcGxldGlvbisrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZG1pbl9xdWV1ZS0+cV9sb2NrLCBmbGFncyk7CisKKwkJaWYgKGNvbXBfY3R4LT5zdGF0dXMgPT0gRU5BX0NNRF9DT01QTEVURUQpCisJCQlwcl9lcnIoIlRoZSBlbmEgZGV2aWNlIGhhdmUgY29tcGxldGlvbiBidXQgdGhlIGRyaXZlciBkaWRuJ3QgcmVjZWl2ZSBhbnkgTVNJLVggaW50ZXJydXB0IChjbWQgJWQpXG4iLAorCQkJICAgICAgIGNvbXBfY3R4LT5jbWRfb3Bjb2RlKTsKKwkJZWxzZQorCQkJcHJfZXJyKCJUaGUgZW5hIGRldmljZSBkb2Vzbid0IHNlbmQgYW55IGNvbXBsZXRpb24gZm9yIHRoZSBhZG1pbiBjbWQgJWQgc3RhdHVzICVkXG4iLAorCQkJICAgICAgIGNvbXBfY3R4LT5jbWRfb3Bjb2RlLCBjb21wX2N0eC0+c3RhdHVzKTsKKworCQlhZG1pbl9xdWV1ZS0+cnVubmluZ19zdGF0ZSA9IGZhbHNlOworCQlyZXQgPSAtRVRJTUU7CisJCWdvdG8gZXJyOworCX0KKworCXJldCA9IGVuYV9jb21fY29tcF9zdGF0dXNfdG9fZXJybm8oY29tcF9jdHgtPmNvbXBfc3RhdHVzKTsKK2VycjoKKwljb21wX2N0eHRfcmVsZWFzZShhZG1pbl9xdWV1ZSwgY29tcF9jdHgpOworCXJldHVybiByZXQ7Cit9CisKKy8qIFRoaXMgbWV0aG9kIHJlYWQgdGhlIGhhcmR3YXJlIGRldmljZSByZWdpc3RlciB0aHJvdWdoIHBvc3Rpbmcgd3JpdGVzCisgKiBhbmQgd2FpdGluZyBmb3IgcmVzcG9uc2UKKyAqIE9uIHRpbWVvdXQgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIEVOQV9NTUlPX1JFQURfVElNRU9VVAorICovCitzdGF0aWMgdTMyIGVuYV9jb21fcmVnX2Jhcl9yZWFkMzIoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LCB1MTYgb2Zmc2V0KQoreworCXN0cnVjdCBlbmFfY29tX21taW9fcmVhZCAqbW1pb19yZWFkID0gJmVuYV9kZXYtPm1taW9fcmVhZDsKKwl2b2xhdGlsZSBzdHJ1Y3QgZW5hX2FkbWluX2VuYV9tbWlvX3JlcV9yZWFkX2xlc3NfcmVzcCAqcmVhZF9yZXNwID0KKwkJbW1pb19yZWFkLT5yZWFkX3Jlc3A7CisJdTMyIG1taW9fcmVhZF9yZWcsIHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJbWlnaHRfc2xlZXAoKTsKKworCS8qIElmIHJlYWRsZXNzIGlzIGRpc2FibGVkLCBwZXJmb3JtIHJlZ3VsYXIgcmVhZCAqLworCWlmICghbW1pb19yZWFkLT5yZWFkbGVzc19zdXBwb3J0ZWQpCisJCXJldHVybiByZWFkbChlbmFfZGV2LT5yZWdfYmFyICsgb2Zmc2V0KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtbWlvX3JlYWQtPmxvY2ssIGZsYWdzKTsKKwltbWlvX3JlYWQtPnNlcV9udW0rKzsKKworCXJlYWRfcmVzcC0+cmVxX2lkID0gbW1pb19yZWFkLT5zZXFfbnVtICsgMHhERUFEOworCW1taW9fcmVhZF9yZWcgPSAob2Zmc2V0IDw8IEVOQV9SRUdTX01NSU9fUkVHX1JFQURfUkVHX09GRl9TSElGVCkgJgorCQkJRU5BX1JFR1NfTU1JT19SRUdfUkVBRF9SRUdfT0ZGX01BU0s7CisJbW1pb19yZWFkX3JlZyB8PSBtbWlvX3JlYWQtPnNlcV9udW0gJgorCQkJRU5BX1JFR1NfTU1JT19SRUdfUkVBRF9SRVFfSURfTUFTSzsKKworCS8qIG1ha2Ugc3VyZSByZWFkX3Jlc3AtPnJlcV9pZCBnZXQgdXBkYXRlZCBiZWZvcmUgdGhlIGh3IGNhbiB3cml0ZQorCSAqIHRoZXJlCisJICovCisJd21iKCk7CisKKwl3cml0ZWwobW1pb19yZWFkX3JlZywgZW5hX2Rldi0+cmVnX2JhciArIEVOQV9SRUdTX01NSU9fUkVHX1JFQURfT0ZGKTsKKworCWZvciAoaSA9IDA7IGkgPCBFTkFfUkVHX1JFQURfVElNRU9VVDsgaSsrKSB7CisJCWlmIChyZWFkX3Jlc3AtPnJlcV9pZCA9PSBtbWlvX3JlYWQtPnNlcV9udW0pCisJCQlicmVhazsKKworCQl1ZGVsYXkoMSk7CisJfQorCisJaWYgKHVubGlrZWx5KGkgPT0gRU5BX1JFR19SRUFEX1RJTUVPVVQpKSB7CisJCXByX2VycigicmVhZGluZyByZWcgZmFpbGVkIGZvciB0aW1lb3V0LiBleHBlY3RlZDogcmVxIGlkWyVodV0gb2Zmc2V0WyVodV0gYWN0dWFsOiByZXEgaWRbJWh1XSBvZmZzZXRbJWh1XVxuIiwKKwkJICAgICAgIG1taW9fcmVhZC0+c2VxX251bSwgb2Zmc2V0LCByZWFkX3Jlc3AtPnJlcV9pZCwKKwkJICAgICAgIHJlYWRfcmVzcC0+cmVnX29mZik7CisJCXJldCA9IEVOQV9NTUlPX1JFQURfVElNRU9VVDsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKHJlYWRfcmVzcC0+cmVnX29mZiAhPSBvZmZzZXQpIHsKKwkJcHJfZXJyKCJSZWFkIGZhaWx1cmU6IHdyb25nIG9mZnNldCBwcm92aWRlZCIpOworCQlyZXQgPSBFTkFfTU1JT19SRUFEX1RJTUVPVVQ7CisJfSBlbHNlIHsKKwkJcmV0ID0gcmVhZF9yZXNwLT5yZWdfdmFsOworCX0KK2VycjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtbWlvX3JlYWQtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFRoZXJlIGFyZSB0d28gdHlwZXMgdG8gd2FpdCBmb3IgY29tcGxldGlvbi4KKyAqIFBvbGxpbmcgbW9kZSAtIHdhaXQgdW50aWwgdGhlIGNvbXBsZXRpb24gaXMgYXZhaWxhYmxlLgorICogQXN5bmMgbW9kZSAtIHdhaXQgb24gd2FpdCBxdWV1ZSB1bnRpbCB0aGUgY29tcGxldGlvbiBpcyByZWFkeQorICogKG9yIHRoZSB0aW1lb3V0IGV4cGlyZWQpLgorICogSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgSVJRIGNhbGxlZCBlbmFfY29tX2hhbmRsZV9hZG1pbl9jb21wbGV0aW9uCisgKiB0byBtYXJrIHRoZSBjb21wbGV0aW9ucy4KKyAqLworc3RhdGljIGludCBlbmFfY29tX3dhaXRfYW5kX3Byb2Nlc3NfYWRtaW5fY3Eoc3RydWN0IGVuYV9jb21wX2N0eCAqY29tcF9jdHgsCisJCQkJCSAgICAgc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKmFkbWluX3F1ZXVlKQoreworCWlmIChhZG1pbl9xdWV1ZS0+cG9sbGluZykKKwkJcmV0dXJuIGVuYV9jb21fd2FpdF9hbmRfcHJvY2Vzc19hZG1pbl9jcV9wb2xsaW5nKGNvbXBfY3R4LAorCQkJCQkJCQkgYWRtaW5fcXVldWUpOworCisJcmV0dXJuIGVuYV9jb21fd2FpdF9hbmRfcHJvY2Vzc19hZG1pbl9jcV9pbnRlcnJ1cHRzKGNvbXBfY3R4LAorCQkJCQkJCSAgICBhZG1pbl9xdWV1ZSk7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2NvbV9kZXN0cm95X2lvX3NxKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCQkgc3RydWN0IGVuYV9jb21faW9fc3EgKmlvX3NxKQoreworCXN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICphZG1pbl9xdWV1ZSA9ICZlbmFfZGV2LT5hZG1pbl9xdWV1ZTsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FxX2Rlc3Ryb3lfc3FfY21kIGRlc3Ryb3lfY21kOworCXN0cnVjdCBlbmFfYWRtaW5fYWNxX2Rlc3Ryb3lfc3FfcmVzcF9kZXNjIGRlc3Ryb3lfcmVzcDsKKwl1OCBkaXJlY3Rpb247CisJaW50IHJldDsKKworCW1lbXNldCgmZGVzdHJveV9jbWQsIDB4MCwgc2l6ZW9mKHN0cnVjdCBlbmFfYWRtaW5fYXFfZGVzdHJveV9zcV9jbWQpKTsKKworCWlmIChpb19zcS0+ZGlyZWN0aW9uID09IEVOQV9DT01fSU9fUVVFVUVfRElSRUNUSU9OX1RYKQorCQlkaXJlY3Rpb24gPSBFTkFfQURNSU5fU1FfRElSRUNUSU9OX1RYOworCWVsc2UKKwkJZGlyZWN0aW9uID0gRU5BX0FETUlOX1NRX0RJUkVDVElPTl9SWDsKKworCWRlc3Ryb3lfY21kLnNxLnNxX2lkZW50aXR5IHw9IChkaXJlY3Rpb24gPDwKKwkJRU5BX0FETUlOX1NRX1NRX0RJUkVDVElPTl9TSElGVCkgJgorCQlFTkFfQURNSU5fU1FfU1FfRElSRUNUSU9OX01BU0s7CisKKwlkZXN0cm95X2NtZC5zcS5zcV9pZHggPSBpb19zcS0+aWR4OworCWRlc3Ryb3lfY21kLmFxX2NvbW1vbl9kZXNjcmlwdG9yLm9wY29kZSA9IEVOQV9BRE1JTl9ERVNUUk9ZX1NROworCisJcmV0ID0gZW5hX2NvbV9leGVjdXRlX2FkbWluX2NvbW1hbmQoYWRtaW5fcXVldWUsCisJCQkJCSAgICAoc3RydWN0IGVuYV9hZG1pbl9hcV9lbnRyeSAqKSZkZXN0cm95X2NtZCwKKwkJCQkJICAgIHNpemVvZihkZXN0cm95X2NtZCksCisJCQkJCSAgICAoc3RydWN0IGVuYV9hZG1pbl9hY3FfZW50cnkgKikmZGVzdHJveV9yZXNwLAorCQkJCQkgICAgc2l6ZW9mKGRlc3Ryb3lfcmVzcCkpOworCisJaWYgKHVubGlrZWx5KHJldCAmJiAocmV0ICE9IC1FTk9ERVYpKSkKKwkJcHJfZXJyKCJmYWlsZWQgdG8gZGVzdHJveSBpbyBzcSBlcnJvcjogJWRcbiIsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBlbmFfY29tX2lvX3F1ZXVlX2ZyZWUoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJCSAgc3RydWN0IGVuYV9jb21faW9fc3EgKmlvX3NxLAorCQkJCSAgc3RydWN0IGVuYV9jb21faW9fY3EgKmlvX2NxKQoreworCXNpemVfdCBzaXplOworCisJaWYgKGlvX2NxLT5jZGVzY19hZGRyLnZpcnRfYWRkcikgeworCQlzaXplID0gaW9fY3EtPmNkZXNjX2VudHJ5X3NpemVfaW5fYnl0ZXMgKiBpb19jcS0+cV9kZXB0aDsKKworCQlkbWFfZnJlZV9jb2hlcmVudChlbmFfZGV2LT5kbWFkZXYsIHNpemUsCisJCQkJICBpb19jcS0+Y2Rlc2NfYWRkci52aXJ0X2FkZHIsCisJCQkJICBpb19jcS0+Y2Rlc2NfYWRkci5waHlzX2FkZHIpOworCisJCWlvX2NxLT5jZGVzY19hZGRyLnZpcnRfYWRkciA9IE5VTEw7CisJfQorCisJaWYgKGlvX3NxLT5kZXNjX2FkZHIudmlydF9hZGRyKSB7CisJCXNpemUgPSBpb19zcS0+ZGVzY19lbnRyeV9zaXplICogaW9fc3EtPnFfZGVwdGg7CisKKwkJaWYgKGlvX3NxLT5tZW1fcXVldWVfdHlwZSA9PSBFTkFfQURNSU5fUExBQ0VNRU5UX1BPTElDWV9IT1NUKQorCQkJZG1hX2ZyZWVfY29oZXJlbnQoZW5hX2Rldi0+ZG1hZGV2LCBzaXplLAorCQkJCQkgIGlvX3NxLT5kZXNjX2FkZHIudmlydF9hZGRyLAorCQkJCQkgIGlvX3NxLT5kZXNjX2FkZHIucGh5c19hZGRyKTsKKwkJZWxzZQorCQkJZGV2bV9rZnJlZShlbmFfZGV2LT5kbWFkZXYsIGlvX3NxLT5kZXNjX2FkZHIudmlydF9hZGRyKTsKKworCQlpb19zcS0+ZGVzY19hZGRyLnZpcnRfYWRkciA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IHdhaXRfZm9yX3Jlc2V0X3N0YXRlKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwgdTMyIHRpbWVvdXQsCisJCQkJdTE2IGV4cF9zdGF0ZSkKK3sKKwl1MzIgdmFsLCBpOworCisJZm9yIChpID0gMDsgaSA8IHRpbWVvdXQ7IGkrKykgeworCQl2YWwgPSBlbmFfY29tX3JlZ19iYXJfcmVhZDMyKGVuYV9kZXYsIEVOQV9SRUdTX0RFVl9TVFNfT0ZGKTsKKworCQlpZiAodW5saWtlbHkodmFsID09IEVOQV9NTUlPX1JFQURfVElNRU9VVCkpIHsKKwkJCXByX2VycigiUmVnIHJlYWQgdGltZW91dCBvY2N1cnJlZFxuIik7CisJCQlyZXR1cm4gLUVUSU1FOworCQl9CisKKwkJaWYgKCh2YWwgJiBFTkFfUkVHU19ERVZfU1RTX1JFU0VUX0lOX1BST0dSRVNTX01BU0spID09CisJCQlleHBfc3RhdGUpCisJCQlyZXR1cm4gMDsKKworCQkvKiBUaGUgcmVzb2x1dGlvbiBvZiB0aGUgdGltZW91dCBpcyAxMDBtcyAqLworCQltc2xlZXAoMTAwKTsKKwl9CisKKwlyZXR1cm4gLUVUSU1FOworfQorCitzdGF0aWMgYm9vbCBlbmFfY29tX2NoZWNrX3N1cHBvcnRlZF9mZWF0dXJlX2lkKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCQkJICAgICAgIGVudW0gZW5hX2FkbWluX2FxX2ZlYXR1cmVfaWQgZmVhdHVyZV9pZCkKK3sKKwl1MzIgZmVhdHVyZV9tYXNrID0gMSA8PCBmZWF0dXJlX2lkOworCisJLyogRGV2aWNlIGF0dHJpYnV0ZXMgaXMgYWx3YXlzIHN1cHBvcnRlZCAqLworCWlmICgoZmVhdHVyZV9pZCAhPSBFTkFfQURNSU5fREVWSUNFX0FUVFJJQlVURVMpICYmCisJICAgICEoZW5hX2Rldi0+c3VwcG9ydGVkX2ZlYXR1cmVzICYgZmVhdHVyZV9tYXNrKSkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2NvbV9nZXRfZmVhdHVyZV9leChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkJICBzdHJ1Y3QgZW5hX2FkbWluX2dldF9mZWF0X3Jlc3AgKmdldF9yZXNwLAorCQkJCSAgZW51bSBlbmFfYWRtaW5fYXFfZmVhdHVyZV9pZCBmZWF0dXJlX2lkLAorCQkJCSAgZG1hX2FkZHJfdCBjb250cm9sX2J1Zl9kbWFfYWRkciwKKwkJCQkgIHUzMiBjb250cm9sX2J1ZmZfc2l6ZSkKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqYWRtaW5fcXVldWU7CisJc3RydWN0IGVuYV9hZG1pbl9nZXRfZmVhdF9jbWQgZ2V0X2NtZDsKKwlpbnQgcmV0OworCisJaWYgKCFlbmFfY29tX2NoZWNrX3N1cHBvcnRlZF9mZWF0dXJlX2lkKGVuYV9kZXYsIGZlYXR1cmVfaWQpKSB7CisJCXByX2luZm8oIkZlYXR1cmUgJWQgaXNuJ3Qgc3VwcG9ydGVkXG4iLCBmZWF0dXJlX2lkKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwltZW1zZXQoJmdldF9jbWQsIDB4MCwgc2l6ZW9mKGdldF9jbWQpKTsKKwlhZG1pbl9xdWV1ZSA9ICZlbmFfZGV2LT5hZG1pbl9xdWV1ZTsKKworCWdldF9jbWQuYXFfY29tbW9uX2Rlc2NyaXB0b3Iub3Bjb2RlID0gRU5BX0FETUlOX0dFVF9GRUFUVVJFOworCisJaWYgKGNvbnRyb2xfYnVmZl9zaXplKQorCQlnZXRfY21kLmFxX2NvbW1vbl9kZXNjcmlwdG9yLmZsYWdzID0KKwkJCUVOQV9BRE1JTl9BUV9DT01NT05fREVTQ19DVFJMX0RBVEFfSU5ESVJFQ1RfTUFTSzsKKwllbHNlCisJCWdldF9jbWQuYXFfY29tbW9uX2Rlc2NyaXB0b3IuZmxhZ3MgPSAwOworCisJcmV0ID0gZW5hX2NvbV9tZW1fYWRkcl9zZXQoZW5hX2RldiwKKwkJCQkgICAmZ2V0X2NtZC5jb250cm9sX2J1ZmZlci5hZGRyZXNzLAorCQkJCSAgIGNvbnRyb2xfYnVmX2RtYV9hZGRyKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlwcl9lcnIoIm1lbW9yeSBhZGRyZXNzIHNldCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWdldF9jbWQuY29udHJvbF9idWZmZXIubGVuZ3RoID0gY29udHJvbF9idWZmX3NpemU7CisKKwlnZXRfY21kLmZlYXRfY29tbW9uLmZlYXR1cmVfaWQgPSBmZWF0dXJlX2lkOworCisJcmV0ID0gZW5hX2NvbV9leGVjdXRlX2FkbWluX2NvbW1hbmQoYWRtaW5fcXVldWUsCisJCQkJCSAgICAoc3RydWN0IGVuYV9hZG1pbl9hcV9lbnRyeSAqKQorCQkJCQkgICAgJmdldF9jbWQsCisJCQkJCSAgICBzaXplb2YoZ2V0X2NtZCksCisJCQkJCSAgICAoc3RydWN0IGVuYV9hZG1pbl9hY3FfZW50cnkgKikKKwkJCQkJICAgIGdldF9yZXNwLAorCQkJCQkgICAgc2l6ZW9mKCpnZXRfcmVzcCkpOworCisJaWYgKHVubGlrZWx5KHJldCkpCisJCXByX2VycigiRmFpbGVkIHRvIHN1Ym1pdCBnZXRfZmVhdHVyZSBjb21tYW5kICVkIGVycm9yOiAlZFxuIiwKKwkJICAgICAgIGZlYXR1cmVfaWQsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGVuYV9jb21fZ2V0X2ZlYXR1cmUoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJICAgICAgIHN0cnVjdCBlbmFfYWRtaW5fZ2V0X2ZlYXRfcmVzcCAqZ2V0X3Jlc3AsCisJCQkgICAgICAgZW51bSBlbmFfYWRtaW5fYXFfZmVhdHVyZV9pZCBmZWF0dXJlX2lkKQoreworCXJldHVybiBlbmFfY29tX2dldF9mZWF0dXJlX2V4KGVuYV9kZXYsCisJCQkJICAgICAgZ2V0X3Jlc3AsCisJCQkJICAgICAgZmVhdHVyZV9pZCwKKwkJCQkgICAgICAwLAorCQkJCSAgICAgIDApOworfQorCitzdGF0aWMgaW50IGVuYV9jb21faGFzaF9rZXlfYWxsb2NhdGUoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXN0cnVjdCBlbmFfcnNzICpyc3MgPSAmZW5hX2Rldi0+cnNzOworCisJcnNzLT5oYXNoX2tleSA9CisJCWRtYV96YWxsb2NfY29oZXJlbnQoZW5hX2Rldi0+ZG1hZGV2LCBzaXplb2YoKnJzcy0+aGFzaF9rZXkpLAorCQkJCSAgICAmcnNzLT5oYXNoX2tleV9kbWFfYWRkciwgR0ZQX0tFUk5FTCk7CisKKwlpZiAodW5saWtlbHkoIXJzcy0+aGFzaF9rZXkpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlbmFfY29tX2hhc2hfa2V5X2Rlc3Ryb3koc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXN0cnVjdCBlbmFfcnNzICpyc3MgPSAmZW5hX2Rldi0+cnNzOworCisJaWYgKHJzcy0+aGFzaF9rZXkpCisJCWRtYV9mcmVlX2NvaGVyZW50KGVuYV9kZXYtPmRtYWRldiwgc2l6ZW9mKCpyc3MtPmhhc2hfa2V5KSwKKwkJCQkgIHJzcy0+aGFzaF9rZXksIHJzcy0+aGFzaF9rZXlfZG1hX2FkZHIpOworCXJzcy0+aGFzaF9rZXkgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGVuYV9jb21faGFzaF9jdHJsX2luaXQoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXN0cnVjdCBlbmFfcnNzICpyc3MgPSAmZW5hX2Rldi0+cnNzOworCisJcnNzLT5oYXNoX2N0cmwgPQorCQlkbWFfemFsbG9jX2NvaGVyZW50KGVuYV9kZXYtPmRtYWRldiwgc2l6ZW9mKCpyc3MtPmhhc2hfY3RybCksCisJCQkJICAgICZyc3MtPmhhc2hfY3RybF9kbWFfYWRkciwgR0ZQX0tFUk5FTCk7CisKKwlpZiAodW5saWtlbHkoIXJzcy0+aGFzaF9jdHJsKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZW5hX2NvbV9oYXNoX2N0cmxfZGVzdHJveShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJc3RydWN0IGVuYV9yc3MgKnJzcyA9ICZlbmFfZGV2LT5yc3M7CisKKwlpZiAocnNzLT5oYXNoX2N0cmwpCisJCWRtYV9mcmVlX2NvaGVyZW50KGVuYV9kZXYtPmRtYWRldiwgc2l6ZW9mKCpyc3MtPmhhc2hfY3RybCksCisJCQkJICByc3MtPmhhc2hfY3RybCwgcnNzLT5oYXNoX2N0cmxfZG1hX2FkZHIpOworCXJzcy0+aGFzaF9jdHJsID0gTlVMTDsKK30KKworc3RhdGljIGludCBlbmFfY29tX2luZGlyZWN0X3RhYmxlX2FsbG9jYXRlKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCQkJICAgdTE2IGxvZ19zaXplKQoreworCXN0cnVjdCBlbmFfcnNzICpyc3MgPSAmZW5hX2Rldi0+cnNzOworCXN0cnVjdCBlbmFfYWRtaW5fZ2V0X2ZlYXRfcmVzcCBnZXRfcmVzcDsKKwlzaXplX3QgdGJsX3NpemU7CisJaW50IHJldDsKKworCXJldCA9IGVuYV9jb21fZ2V0X2ZlYXR1cmUoZW5hX2RldiwgJmdldF9yZXNwLAorCQkJCSAgRU5BX0FETUlOX1JTU19SRURJUkVDVElPTl9UQUJMRV9DT05GSUcpOworCWlmICh1bmxpa2VseShyZXQpKQorCQlyZXR1cm4gcmV0OworCisJaWYgKChnZXRfcmVzcC51LmluZF90YWJsZS5taW5fc2l6ZSA+IGxvZ19zaXplKSB8fAorCSAgICAoZ2V0X3Jlc3AudS5pbmRfdGFibGUubWF4X3NpemUgPCBsb2dfc2l6ZSkpIHsKKwkJcHJfZXJyKCJpbmRpcmVjdCB0YWJsZSBzaXplIGRvZXNuJ3QgZml0LiByZXF1ZXN0ZWQgc2l6ZTogJWQgd2hpbGUgbWluIGlzOiVkIGFuZCBtYXggJWRcbiIsCisJCSAgICAgICAxIDw8IGxvZ19zaXplLCAxIDw8IGdldF9yZXNwLnUuaW5kX3RhYmxlLm1pbl9zaXplLAorCQkgICAgICAgMSA8PCBnZXRfcmVzcC51LmluZF90YWJsZS5tYXhfc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXRibF9zaXplID0gKDFVTEwgPDwgbG9nX3NpemUpICoKKwkJc2l6ZW9mKHN0cnVjdCBlbmFfYWRtaW5fcnNzX2luZF90YWJsZV9lbnRyeSk7CisKKwlyc3MtPnJzc19pbmRfdGJsID0KKwkJZG1hX3phbGxvY19jb2hlcmVudChlbmFfZGV2LT5kbWFkZXYsIHRibF9zaXplLAorCQkJCSAgICAmcnNzLT5yc3NfaW5kX3RibF9kbWFfYWRkciwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFyc3MtPnJzc19pbmRfdGJsKSkKKwkJZ290byBtZW1fZXJyMTsKKworCXRibF9zaXplID0gKDFVTEwgPDwgbG9nX3NpemUpICogc2l6ZW9mKHUxNik7CisJcnNzLT5ob3N0X3Jzc19pbmRfdGJsID0KKwkJZGV2bV9remFsbG9jKGVuYV9kZXYtPmRtYWRldiwgdGJsX3NpemUsIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseSghcnNzLT5ob3N0X3Jzc19pbmRfdGJsKSkKKwkJZ290byBtZW1fZXJyMjsKKworCXJzcy0+dGJsX2xvZ19zaXplID0gbG9nX3NpemU7CisKKwlyZXR1cm4gMDsKKworbWVtX2VycjI6CisJdGJsX3NpemUgPSAoMVVMTCA8PCBsb2dfc2l6ZSkgKgorCQlzaXplb2Yoc3RydWN0IGVuYV9hZG1pbl9yc3NfaW5kX3RhYmxlX2VudHJ5KTsKKworCWRtYV9mcmVlX2NvaGVyZW50KGVuYV9kZXYtPmRtYWRldiwgdGJsX3NpemUsIHJzcy0+cnNzX2luZF90YmwsCisJCQkgIHJzcy0+cnNzX2luZF90YmxfZG1hX2FkZHIpOworCXJzcy0+cnNzX2luZF90YmwgPSBOVUxMOworbWVtX2VycjE6CisJcnNzLT50YmxfbG9nX3NpemUgPSAwOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCBlbmFfY29tX2luZGlyZWN0X3RhYmxlX2Rlc3Ryb3koc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXN0cnVjdCBlbmFfcnNzICpyc3MgPSAmZW5hX2Rldi0+cnNzOworCXNpemVfdCB0Ymxfc2l6ZSA9ICgxVUxMIDw8IHJzcy0+dGJsX2xvZ19zaXplKSAqCisJCXNpemVvZihzdHJ1Y3QgZW5hX2FkbWluX3Jzc19pbmRfdGFibGVfZW50cnkpOworCisJaWYgKHJzcy0+cnNzX2luZF90YmwpCisJCWRtYV9mcmVlX2NvaGVyZW50KGVuYV9kZXYtPmRtYWRldiwgdGJsX3NpemUsIHJzcy0+cnNzX2luZF90YmwsCisJCQkJICByc3MtPnJzc19pbmRfdGJsX2RtYV9hZGRyKTsKKwlyc3MtPnJzc19pbmRfdGJsID0gTlVMTDsKKworCWlmIChyc3MtPmhvc3RfcnNzX2luZF90YmwpCisJCWRldm1fa2ZyZWUoZW5hX2Rldi0+ZG1hZGV2LCByc3MtPmhvc3RfcnNzX2luZF90YmwpOworCXJzcy0+aG9zdF9yc3NfaW5kX3RibCA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2NvbV9jcmVhdGVfaW9fc3Eoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJCXN0cnVjdCBlbmFfY29tX2lvX3NxICppb19zcSwgdTE2IGNxX2lkeCkKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqYWRtaW5fcXVldWUgPSAmZW5hX2Rldi0+YWRtaW5fcXVldWU7CisJc3RydWN0IGVuYV9hZG1pbl9hcV9jcmVhdGVfc3FfY21kIGNyZWF0ZV9jbWQ7CisJc3RydWN0IGVuYV9hZG1pbl9hY3FfY3JlYXRlX3NxX3Jlc3BfZGVzYyBjbWRfY29tcGxldGlvbjsKKwl1OCBkaXJlY3Rpb247CisJaW50IHJldDsKKworCW1lbXNldCgmY3JlYXRlX2NtZCwgMHgwLCBzaXplb2Yoc3RydWN0IGVuYV9hZG1pbl9hcV9jcmVhdGVfc3FfY21kKSk7CisKKwljcmVhdGVfY21kLmFxX2NvbW1vbl9kZXNjcmlwdG9yLm9wY29kZSA9IEVOQV9BRE1JTl9DUkVBVEVfU1E7CisKKwlpZiAoaW9fc3EtPmRpcmVjdGlvbiA9PSBFTkFfQ09NX0lPX1FVRVVFX0RJUkVDVElPTl9UWCkKKwkJZGlyZWN0aW9uID0gRU5BX0FETUlOX1NRX0RJUkVDVElPTl9UWDsKKwllbHNlCisJCWRpcmVjdGlvbiA9IEVOQV9BRE1JTl9TUV9ESVJFQ1RJT05fUlg7CisKKwljcmVhdGVfY21kLnNxX2lkZW50aXR5IHw9IChkaXJlY3Rpb24gPDwKKwkJRU5BX0FETUlOX0FRX0NSRUFURV9TUV9DTURfU1FfRElSRUNUSU9OX1NISUZUKSAmCisJCUVOQV9BRE1JTl9BUV9DUkVBVEVfU1FfQ01EX1NRX0RJUkVDVElPTl9NQVNLOworCisJY3JlYXRlX2NtZC5zcV9jYXBzXzIgfD0gaW9fc3EtPm1lbV9xdWV1ZV90eXBlICYKKwkJRU5BX0FETUlOX0FRX0NSRUFURV9TUV9DTURfUExBQ0VNRU5UX1BPTElDWV9NQVNLOworCisJY3JlYXRlX2NtZC5zcV9jYXBzXzIgfD0gKEVOQV9BRE1JTl9DT01QTEVUSU9OX1BPTElDWV9ERVNDIDw8CisJCUVOQV9BRE1JTl9BUV9DUkVBVEVfU1FfQ01EX0NPTVBMRVRJT05fUE9MSUNZX1NISUZUKSAmCisJCUVOQV9BRE1JTl9BUV9DUkVBVEVfU1FfQ01EX0NPTVBMRVRJT05fUE9MSUNZX01BU0s7CisKKwljcmVhdGVfY21kLnNxX2NhcHNfMyB8PQorCQlFTkFfQURNSU5fQVFfQ1JFQVRFX1NRX0NNRF9JU19QSFlTSUNBTExZX0NPTlRJR1VPVVNfTUFTSzsKKworCWNyZWF0ZV9jbWQuY3FfaWR4ID0gY3FfaWR4OworCWNyZWF0ZV9jbWQuc3FfZGVwdGggPSBpb19zcS0+cV9kZXB0aDsKKworCWlmIChpb19zcS0+bWVtX3F1ZXVlX3R5cGUgPT0gRU5BX0FETUlOX1BMQUNFTUVOVF9QT0xJQ1lfSE9TVCkgeworCQlyZXQgPSBlbmFfY29tX21lbV9hZGRyX3NldChlbmFfZGV2LAorCQkJCQkgICAmY3JlYXRlX2NtZC5zcV9iYSwKKwkJCQkJICAgaW9fc3EtPmRlc2NfYWRkci5waHlzX2FkZHIpOworCQlpZiAodW5saWtlbHkocmV0KSkgeworCQkJcHJfZXJyKCJtZW1vcnkgYWRkcmVzcyBzZXQgZmFpbGVkXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXQgPSBlbmFfY29tX2V4ZWN1dGVfYWRtaW5fY29tbWFuZChhZG1pbl9xdWV1ZSwKKwkJCQkJICAgIChzdHJ1Y3QgZW5hX2FkbWluX2FxX2VudHJ5ICopJmNyZWF0ZV9jbWQsCisJCQkJCSAgICBzaXplb2YoY3JlYXRlX2NtZCksCisJCQkJCSAgICAoc3RydWN0IGVuYV9hZG1pbl9hY3FfZW50cnkgKikmY21kX2NvbXBsZXRpb24sCisJCQkJCSAgICBzaXplb2YoY21kX2NvbXBsZXRpb24pKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBjcmVhdGUgSU8gU1EuIGVycm9yOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpb19zcS0+aWR4ID0gY21kX2NvbXBsZXRpb24uc3FfaWR4OworCisJaW9fc3EtPmRiX2FkZHIgPSAodTMyIF9faW9tZW0gKikoKHVpbnRwdHJfdCllbmFfZGV2LT5yZWdfYmFyICsKKwkJKHVpbnRwdHJfdCljbWRfY29tcGxldGlvbi5zcV9kb29yYmVsbF9vZmZzZXQpOworCisJaWYgKGlvX3NxLT5tZW1fcXVldWVfdHlwZSA9PSBFTkFfQURNSU5fUExBQ0VNRU5UX1BPTElDWV9ERVYpIHsKKwkJaW9fc3EtPmhlYWRlcl9hZGRyID0gKHU4IF9faW9tZW0gKikoKHVpbnRwdHJfdCllbmFfZGV2LT5tZW1fYmFyCisJCQkJKyBjbWRfY29tcGxldGlvbi5sbHFfaGVhZGVyc19vZmZzZXQpOworCisJCWlvX3NxLT5kZXNjX2FkZHIucGJ1Zl9kZXZfYWRkciA9CisJCQkodTggX19pb21lbSAqKSgodWludHB0cl90KWVuYV9kZXYtPm1lbV9iYXIgKworCQkJY21kX2NvbXBsZXRpb24ubGxxX2Rlc2NyaXB0b3JzX29mZnNldCk7CisJfQorCisJcHJfZGVidWcoImNyZWF0ZWQgc3FbJXVdLCBkZXB0aFsldV1cbiIsIGlvX3NxLT5pZHgsIGlvX3NxLT5xX2RlcHRoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2NvbV9pbmRfdGJsX2NvbnZlcnRfdG9fZGV2aWNlKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlzdHJ1Y3QgZW5hX3JzcyAqcnNzID0gJmVuYV9kZXYtPnJzczsKKwlzdHJ1Y3QgZW5hX2NvbV9pb19zcSAqaW9fc3E7CisJdTE2IHFpZDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxIDw8IHJzcy0+dGJsX2xvZ19zaXplOyBpKyspIHsKKwkJcWlkID0gcnNzLT5ob3N0X3Jzc19pbmRfdGJsW2ldOworCQlpZiAocWlkID49IEVOQV9UT1RBTF9OVU1fUVVFVUVTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaW9fc3EgPSAmZW5hX2Rldi0+aW9fc3FfcXVldWVzW3FpZF07CisKKwkJaWYgKGlvX3NxLT5kaXJlY3Rpb24gIT0gRU5BX0NPTV9JT19RVUVVRV9ESVJFQ1RJT05fUlgpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlyc3MtPnJzc19pbmRfdGJsW2ldLmNxX2lkeCA9IGlvX3NxLT5pZHg7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2NvbV9pbmRfdGJsX2NvbnZlcnRfZnJvbV9kZXZpY2Uoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXUxNiBkZXZfaWR4X3RvX2hvc3RfdGJsW0VOQV9UT1RBTF9OVU1fUVVFVUVTXSA9IHsgKHUxNiktMSB9OworCXN0cnVjdCBlbmFfcnNzICpyc3MgPSAmZW5hX2Rldi0+cnNzOworCXU4IGlkeDsKKwl1MTYgaTsKKworCWZvciAoaSA9IDA7IGkgPCBFTkFfVE9UQUxfTlVNX1FVRVVFUzsgaSsrKQorCQlkZXZfaWR4X3RvX2hvc3RfdGJsW2VuYV9kZXYtPmlvX3NxX3F1ZXVlc1tpXS5pZHhdID0gaTsKKworCWZvciAoaSA9IDA7IGkgPCAxIDw8IHJzcy0+dGJsX2xvZ19zaXplOyBpKyspIHsKKwkJaWYgKHJzcy0+cnNzX2luZF90YmxbaV0uY3FfaWR4ID4gRU5BX1RPVEFMX05VTV9RVUVVRVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWR4ID0gKHU4KXJzcy0+cnNzX2luZF90YmxbaV0uY3FfaWR4OworCisJCWlmIChkZXZfaWR4X3RvX2hvc3RfdGJsW2lkeF0gPiBFTkFfVE9UQUxfTlVNX1FVRVVFUykKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXJzcy0+aG9zdF9yc3NfaW5kX3RibFtpXSA9IGRldl9pZHhfdG9faG9zdF90YmxbaWR4XTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmFfY29tX2luaXRfaW50ZXJydXB0X21vZGVyYXRpb25fdGFibGUoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXNpemVfdCBzaXplOworCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZW5hX2ludHJfbW9kZXJfZW50cnkpICogRU5BX0lOVFJfTUFYX05VTV9PRl9MRVZFTFM7CisKKwllbmFfZGV2LT5pbnRyX21vZGVyX3RibCA9CisJCWRldm1fa3phbGxvYyhlbmFfZGV2LT5kbWFkZXYsIHNpemUsIEdGUF9LRVJORUwpOworCWlmICghZW5hX2Rldi0+aW50cl9tb2Rlcl90YmwpCisJCXJldHVybiAtRU5PTUVNOworCisJZW5hX2NvbV9jb25maWdfZGVmYXVsdF9pbnRlcnJ1cHRfbW9kZXJhdGlvbl90YWJsZShlbmFfZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlbmFfY29tX3VwZGF0ZV9pbnRyX2RlbGF5X3Jlc29sdXRpb24oc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJCQkJIHUxNiBpbnRyX2RlbGF5X3Jlc29sdXRpb24pCit7CisJc3RydWN0IGVuYV9pbnRyX21vZGVyX2VudHJ5ICppbnRyX21vZGVyX3RibCA9IGVuYV9kZXYtPmludHJfbW9kZXJfdGJsOworCXVuc2lnbmVkIGludCBpOworCisJaWYgKCFpbnRyX2RlbGF5X3Jlc29sdXRpb24pIHsKKwkJcHJfZXJyKCJJbGxlZ2FsIGludHJfZGVsYXlfcmVzb2x1dGlvbiBwcm92aWRlZC4gR29pbmcgdG8gdXNlIGRlZmF1bHQgMSB1c2VjIHJlc29sdXRpb25cbiIpOworCQlpbnRyX2RlbGF5X3Jlc29sdXRpb24gPSAxOworCX0KKwllbmFfZGV2LT5pbnRyX2RlbGF5X3Jlc29sdXRpb24gPSBpbnRyX2RlbGF5X3Jlc29sdXRpb247CisKKwkvKiB1cGRhdGUgUnggKi8KKwlmb3IgKGkgPSAwOyBpIDwgRU5BX0lOVFJfTUFYX05VTV9PRl9MRVZFTFM7IGkrKykKKwkJaW50cl9tb2Rlcl90YmxbaV0uaW50cl9tb2Rlcl9pbnRlcnZhbCAvPSBpbnRyX2RlbGF5X3Jlc29sdXRpb247CisKKwkvKiB1cGRhdGUgVHggKi8KKwllbmFfZGV2LT5pbnRyX21vZGVyX3R4X2ludGVydmFsIC89IGludHJfZGVsYXlfcmVzb2x1dGlvbjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgICBBUEkgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgZW5hX2NvbV9leGVjdXRlX2FkbWluX2NvbW1hbmQoc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKmFkbWluX3F1ZXVlLAorCQkJCSAgc3RydWN0IGVuYV9hZG1pbl9hcV9lbnRyeSAqY21kLAorCQkJCSAgc2l6ZV90IGNtZF9zaXplLAorCQkJCSAgc3RydWN0IGVuYV9hZG1pbl9hY3FfZW50cnkgKmNvbXAsCisJCQkJICBzaXplX3QgY29tcF9zaXplKQoreworCXN0cnVjdCBlbmFfY29tcF9jdHggKmNvbXBfY3R4OworCWludCByZXQ7CisKKwljb21wX2N0eCA9IGVuYV9jb21fc3VibWl0X2FkbWluX2NtZChhZG1pbl9xdWV1ZSwgY21kLCBjbWRfc2l6ZSwKKwkJCQkJICAgIGNvbXAsIGNvbXBfc2l6ZSk7CisJaWYgKHVubGlrZWx5KElTX0VSUihjb21wX2N0eCkpKSB7CisJCXByX2VycigiRmFpbGVkIHRvIHN1Ym1pdCBjb21tYW5kIFslbGRdXG4iLCBQVFJfRVJSKGNvbXBfY3R4KSk7CisJCXJldHVybiBQVFJfRVJSKGNvbXBfY3R4KTsKKwl9CisKKwlyZXQgPSBlbmFfY29tX3dhaXRfYW5kX3Byb2Nlc3NfYWRtaW5fY3EoY29tcF9jdHgsIGFkbWluX3F1ZXVlKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlpZiAoYWRtaW5fcXVldWUtPnJ1bm5pbmdfc3RhdGUpCisJCQlwcl9lcnIoIkZhaWxlZCB0byBwcm9jZXNzIGNvbW1hbmQuIHJldCA9ICVkXG4iLCByZXQpOworCQllbHNlCisJCQlwcl9kZWJ1ZygiRmFpbGVkIHRvIHByb2Nlc3MgY29tbWFuZC4gcmV0ID0gJWRcbiIsIHJldCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK2ludCBlbmFfY29tX2NyZWF0ZV9pb19jcShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkgc3RydWN0IGVuYV9jb21faW9fY3EgKmlvX2NxKQoreworCXN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICphZG1pbl9xdWV1ZSA9ICZlbmFfZGV2LT5hZG1pbl9xdWV1ZTsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FxX2NyZWF0ZV9jcV9jbWQgY3JlYXRlX2NtZDsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FjcV9jcmVhdGVfY3FfcmVzcF9kZXNjIGNtZF9jb21wbGV0aW9uOworCWludCByZXQ7CisKKwltZW1zZXQoJmNyZWF0ZV9jbWQsIDB4MCwgc2l6ZW9mKHN0cnVjdCBlbmFfYWRtaW5fYXFfY3JlYXRlX2NxX2NtZCkpOworCisJY3JlYXRlX2NtZC5hcV9jb21tb25fZGVzY3JpcHRvci5vcGNvZGUgPSBFTkFfQURNSU5fQ1JFQVRFX0NROworCisJY3JlYXRlX2NtZC5jcV9jYXBzXzIgfD0gKGlvX2NxLT5jZGVzY19lbnRyeV9zaXplX2luX2J5dGVzIC8gNCkgJgorCQlFTkFfQURNSU5fQVFfQ1JFQVRFX0NRX0NNRF9DUV9FTlRSWV9TSVpFX1dPUkRTX01BU0s7CisJY3JlYXRlX2NtZC5jcV9jYXBzXzEgfD0KKwkJRU5BX0FETUlOX0FRX0NSRUFURV9DUV9DTURfSU5URVJSVVBUX01PREVfRU5BQkxFRF9NQVNLOworCisJY3JlYXRlX2NtZC5tc2l4X3ZlY3RvciA9IGlvX2NxLT5tc2l4X3ZlY3RvcjsKKwljcmVhdGVfY21kLmNxX2RlcHRoID0gaW9fY3EtPnFfZGVwdGg7CisKKwlyZXQgPSBlbmFfY29tX21lbV9hZGRyX3NldChlbmFfZGV2LAorCQkJCSAgICZjcmVhdGVfY21kLmNxX2JhLAorCQkJCSAgIGlvX2NxLT5jZGVzY19hZGRyLnBoeXNfYWRkcik7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJcHJfZXJyKCJtZW1vcnkgYWRkcmVzcyBzZXQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBlbmFfY29tX2V4ZWN1dGVfYWRtaW5fY29tbWFuZChhZG1pbl9xdWV1ZSwKKwkJCQkJICAgIChzdHJ1Y3QgZW5hX2FkbWluX2FxX2VudHJ5ICopJmNyZWF0ZV9jbWQsCisJCQkJCSAgICBzaXplb2YoY3JlYXRlX2NtZCksCisJCQkJCSAgICAoc3RydWN0IGVuYV9hZG1pbl9hY3FfZW50cnkgKikmY21kX2NvbXBsZXRpb24sCisJCQkJCSAgICBzaXplb2YoY21kX2NvbXBsZXRpb24pKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBjcmVhdGUgSU8gQ1EuIGVycm9yOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpb19jcS0+aWR4ID0gY21kX2NvbXBsZXRpb24uY3FfaWR4OworCisJaW9fY3EtPnVubWFza19yZWcgPSAodTMyIF9faW9tZW0gKikoKHVpbnRwdHJfdCllbmFfZGV2LT5yZWdfYmFyICsKKwkJY21kX2NvbXBsZXRpb24uY3FfaW50ZXJydXB0X3VubWFza19yZWdpc3Rlcl9vZmZzZXQpOworCisJaWYgKGNtZF9jb21wbGV0aW9uLmNxX2hlYWRfZGJfcmVnaXN0ZXJfb2Zmc2V0KQorCQlpb19jcS0+Y3FfaGVhZF9kYl9yZWcgPQorCQkJKHUzMiBfX2lvbWVtICopKCh1aW50cHRyX3QpZW5hX2Rldi0+cmVnX2JhciArCisJCQljbWRfY29tcGxldGlvbi5jcV9oZWFkX2RiX3JlZ2lzdGVyX29mZnNldCk7CisKKwlpZiAoY21kX2NvbXBsZXRpb24ubnVtYV9ub2RlX3JlZ2lzdGVyX29mZnNldCkKKwkJaW9fY3EtPm51bWFfbm9kZV9jZmdfcmVnID0KKwkJCSh1MzIgX19pb21lbSAqKSgodWludHB0cl90KWVuYV9kZXYtPnJlZ19iYXIgKworCQkJY21kX2NvbXBsZXRpb24ubnVtYV9ub2RlX3JlZ2lzdGVyX29mZnNldCk7CisKKwlwcl9kZWJ1ZygiY3JlYXRlZCBjcVsldV0sIGRlcHRoWyV1XVxuIiwgaW9fY3EtPmlkeCwgaW9fY3EtPnFfZGVwdGgpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGVuYV9jb21fZ2V0X2lvX2hhbmRsZXJzKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwgdTE2IHFpZCwKKwkJCSAgICBzdHJ1Y3QgZW5hX2NvbV9pb19zcSAqKmlvX3NxLAorCQkJICAgIHN0cnVjdCBlbmFfY29tX2lvX2NxICoqaW9fY3EpCit7CisJaWYgKHFpZCA+PSBFTkFfVE9UQUxfTlVNX1FVRVVFUykgeworCQlwcl9lcnIoIkludmFsaWQgcXVldWUgbnVtYmVyICVkIGJ1dCB0aGUgbWF4IGlzICVkXG4iLCBxaWQsCisJCSAgICAgICBFTkFfVE9UQUxfTlVNX1FVRVVFUyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCSppb19zcSA9ICZlbmFfZGV2LT5pb19zcV9xdWV1ZXNbcWlkXTsKKwkqaW9fY3EgPSAmZW5hX2Rldi0+aW9fY3FfcXVldWVzW3FpZF07CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBlbmFfY29tX2Fib3J0X2FkbWluX2NvbW1hbmRzKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqYWRtaW5fcXVldWUgPSAmZW5hX2Rldi0+YWRtaW5fcXVldWU7CisJc3RydWN0IGVuYV9jb21wX2N0eCAqY29tcF9jdHg7CisJdTE2IGk7CisKKwlpZiAoIWFkbWluX3F1ZXVlLT5jb21wX2N0eCkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IGFkbWluX3F1ZXVlLT5xX2RlcHRoOyBpKyspIHsKKwkJY29tcF9jdHggPSBnZXRfY29tcF9jdHh0KGFkbWluX3F1ZXVlLCBpLCBmYWxzZSk7CisJCWlmICh1bmxpa2VseSghY29tcF9jdHgpKQorCQkJYnJlYWs7CisKKwkJY29tcF9jdHgtPnN0YXR1cyA9IEVOQV9DTURfQUJPUlRFRDsKKworCQljb21wbGV0ZSgmY29tcF9jdHgtPndhaXRfZXZlbnQpOworCX0KK30KKwordm9pZCBlbmFfY29tX3dhaXRfZm9yX2Fib3J0X2NvbXBsZXRpb24oc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICphZG1pbl9xdWV1ZSA9ICZlbmFfZGV2LT5hZG1pbl9xdWV1ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkbWluX3F1ZXVlLT5xX2xvY2ssIGZsYWdzKTsKKwl3aGlsZSAoYXRvbWljX3JlYWQoJmFkbWluX3F1ZXVlLT5vdXRzdGFuZGluZ19jbWRzKSAhPSAwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkbWluX3F1ZXVlLT5xX2xvY2ssIGZsYWdzKTsKKwkJbXNsZWVwKDIwKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkbWluX3F1ZXVlLT5xX2xvY2ssIGZsYWdzKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRtaW5fcXVldWUtPnFfbG9jaywgZmxhZ3MpOworfQorCitpbnQgZW5hX2NvbV9kZXN0cm95X2lvX2NxKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCSAgc3RydWN0IGVuYV9jb21faW9fY3EgKmlvX2NxKQoreworCXN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICphZG1pbl9xdWV1ZSA9ICZlbmFfZGV2LT5hZG1pbl9xdWV1ZTsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FxX2Rlc3Ryb3lfY3FfY21kIGRlc3Ryb3lfY21kOworCXN0cnVjdCBlbmFfYWRtaW5fYWNxX2Rlc3Ryb3lfY3FfcmVzcF9kZXNjIGRlc3Ryb3lfcmVzcDsKKwlpbnQgcmV0OworCisJbWVtc2V0KCZkZXN0cm95X2NtZCwgMHgwLCBzaXplb2Yoc3RydWN0IGVuYV9hZG1pbl9hcV9kZXN0cm95X3NxX2NtZCkpOworCisJZGVzdHJveV9jbWQuY3FfaWR4ID0gaW9fY3EtPmlkeDsKKwlkZXN0cm95X2NtZC5hcV9jb21tb25fZGVzY3JpcHRvci5vcGNvZGUgPSBFTkFfQURNSU5fREVTVFJPWV9DUTsKKworCXJldCA9IGVuYV9jb21fZXhlY3V0ZV9hZG1pbl9jb21tYW5kKGFkbWluX3F1ZXVlLAorCQkJCQkgICAgKHN0cnVjdCBlbmFfYWRtaW5fYXFfZW50cnkgKikmZGVzdHJveV9jbWQsCisJCQkJCSAgICBzaXplb2YoZGVzdHJveV9jbWQpLAorCQkJCQkgICAgKHN0cnVjdCBlbmFfYWRtaW5fYWNxX2VudHJ5ICopJmRlc3Ryb3lfcmVzcCwKKwkJCQkJICAgIHNpemVvZihkZXN0cm95X3Jlc3ApKTsKKworCWlmICh1bmxpa2VseShyZXQgJiYgKHJldCAhPSAtRU5PREVWKSkpCisJCXByX2VycigiRmFpbGVkIHRvIGRlc3Ryb3kgSU8gQ1EuIGVycm9yOiAlZFxuIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK2Jvb2wgZW5hX2NvbV9nZXRfYWRtaW5fcnVubmluZ19zdGF0ZShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJcmV0dXJuIGVuYV9kZXYtPmFkbWluX3F1ZXVlLnJ1bm5pbmdfc3RhdGU7Cit9CisKK3ZvaWQgZW5hX2NvbV9zZXRfYWRtaW5fcnVubmluZ19zdGF0ZShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsIGJvb2wgc3RhdGUpCit7CisJc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKmFkbWluX3F1ZXVlID0gJmVuYV9kZXYtPmFkbWluX3F1ZXVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRtaW5fcXVldWUtPnFfbG9jaywgZmxhZ3MpOworCWVuYV9kZXYtPmFkbWluX3F1ZXVlLnJ1bm5pbmdfc3RhdGUgPSBzdGF0ZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZG1pbl9xdWV1ZS0+cV9sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgZW5hX2NvbV9hZG1pbl9hZW5xX2VuYWJsZShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJdTE2IGRlcHRoID0gZW5hX2Rldi0+YWVucS5xX2RlcHRoOworCisJV0FSTihlbmFfZGV2LT5hZW5xLmhlYWQgIT0gZGVwdGgsICJJbnZhbGlkIEFFTlEgc3RhdGVcbiIpOworCisJLyogSW5pdCBoZWFkX2RiIHRvIG1hcmsgdGhhdCBhbGwgZW50cmllcyBpbiB0aGUgcXVldWUKKwkgKiBhcmUgaW5pdGlhbGx5IGF2YWlsYWJsZQorCSAqLworCXdyaXRlbChkZXB0aCwgZW5hX2Rldi0+cmVnX2JhciArIEVOQV9SRUdTX0FFTlFfSEVBRF9EQl9PRkYpOworfQorCitpbnQgZW5hX2NvbV9zZXRfYWVucV9jb25maWcoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LCB1MzIgZ3JvdXBzX2ZsYWcpCit7CisJc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKmFkbWluX3F1ZXVlOworCXN0cnVjdCBlbmFfYWRtaW5fc2V0X2ZlYXRfY21kIGNtZDsKKwlzdHJ1Y3QgZW5hX2FkbWluX3NldF9mZWF0X3Jlc3AgcmVzcDsKKwlzdHJ1Y3QgZW5hX2FkbWluX2dldF9mZWF0X3Jlc3AgZ2V0X3Jlc3A7CisJaW50IHJldDsKKworCXJldCA9IGVuYV9jb21fZ2V0X2ZlYXR1cmUoZW5hX2RldiwgJmdldF9yZXNwLCBFTkFfQURNSU5fQUVOUV9DT05GSUcpOworCWlmIChyZXQpIHsKKwkJcHJfaW5mbygiQ2FuJ3QgZ2V0IGFlbnEgY29uZmlndXJhdGlvblxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKChnZXRfcmVzcC51LmFlbnEuc3VwcG9ydGVkX2dyb3VwcyAmIGdyb3Vwc19mbGFnKSAhPSBncm91cHNfZmxhZykgeworCQlwcl93YXJuKCJUcnlpbmcgdG8gc2V0IHVuc3VwcG9ydGVkIGFlbnEgZXZlbnRzLiBzdXBwb3J0ZWQgZmxhZzogJXggYXNrZWQgZmxhZzogJXhcbiIsCisJCQlnZXRfcmVzcC51LmFlbnEuc3VwcG9ydGVkX2dyb3VwcywgZ3JvdXBzX2ZsYWcpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCW1lbXNldCgmY21kLCAweDAsIHNpemVvZihjbWQpKTsKKwlhZG1pbl9xdWV1ZSA9ICZlbmFfZGV2LT5hZG1pbl9xdWV1ZTsKKworCWNtZC5hcV9jb21tb25fZGVzY3JpcHRvci5vcGNvZGUgPSBFTkFfQURNSU5fU0VUX0ZFQVRVUkU7CisJY21kLmFxX2NvbW1vbl9kZXNjcmlwdG9yLmZsYWdzID0gMDsKKwljbWQuZmVhdF9jb21tb24uZmVhdHVyZV9pZCA9IEVOQV9BRE1JTl9BRU5RX0NPTkZJRzsKKwljbWQudS5hZW5xLmVuYWJsZWRfZ3JvdXBzID0gZ3JvdXBzX2ZsYWc7CisKKwlyZXQgPSBlbmFfY29tX2V4ZWN1dGVfYWRtaW5fY29tbWFuZChhZG1pbl9xdWV1ZSwKKwkJCQkJICAgIChzdHJ1Y3QgZW5hX2FkbWluX2FxX2VudHJ5ICopJmNtZCwKKwkJCQkJICAgIHNpemVvZihjbWQpLAorCQkJCQkgICAgKHN0cnVjdCBlbmFfYWRtaW5fYWNxX2VudHJ5ICopJnJlc3AsCisJCQkJCSAgICBzaXplb2YocmVzcCkpOworCisJaWYgKHVubGlrZWx5KHJldCkpCisJCXByX2VycigiRmFpbGVkIHRvIGNvbmZpZyBBRU5RIHJldDogJWRcbiIsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZW5hX2NvbV9nZXRfZG1hX3dpZHRoKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwl1MzIgY2FwcyA9IGVuYV9jb21fcmVnX2Jhcl9yZWFkMzIoZW5hX2RldiwgRU5BX1JFR1NfQ0FQU19PRkYpOworCWludCB3aWR0aDsKKworCWlmICh1bmxpa2VseShjYXBzID09IEVOQV9NTUlPX1JFQURfVElNRU9VVCkpIHsKKwkJcHJfZXJyKCJSZWcgcmVhZCB0aW1lb3V0IG9jY3VycmVkXG4iKTsKKwkJcmV0dXJuIC1FVElNRTsKKwl9CisKKwl3aWR0aCA9IChjYXBzICYgRU5BX1JFR1NfQ0FQU19ETUFfQUREUl9XSURUSF9NQVNLKSA+PgorCQlFTkFfUkVHU19DQVBTX0RNQV9BRERSX1dJRFRIX1NISUZUOworCisJcHJfZGVidWcoIkVOQSBkbWEgd2lkdGg6ICVkXG4iLCB3aWR0aCk7CisKKwlpZiAoKHdpZHRoIDwgMzIpIHx8IHdpZHRoID4gRU5BX01BWF9QSFlTX0FERFJfU0laRV9CSVRTKSB7CisJCXByX2VycigiRE1BIHdpZHRoIGlsbGVnYWwgdmFsdWU6ICVkXG4iLCB3aWR0aCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWVuYV9kZXYtPmRtYV9hZGRyX2JpdHMgPSB3aWR0aDsKKworCXJldHVybiB3aWR0aDsKK30KKworaW50IGVuYV9jb21fdmFsaWRhdGVfdmVyc2lvbihzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJdTMyIHZlcjsKKwl1MzIgY3RybF92ZXI7CisJdTMyIGN0cmxfdmVyX21hc2tlZDsKKworCS8qIE1ha2Ugc3VyZSB0aGUgRU5BIHZlcnNpb24gYW5kIHRoZSBjb250cm9sbGVyIHZlcnNpb24gYXJlIGF0IGxlYXN0CisJICogYXMgdGhlIGRyaXZlciBleHBlY3RzCisJICovCisJdmVyID0gZW5hX2NvbV9yZWdfYmFyX3JlYWQzMihlbmFfZGV2LCBFTkFfUkVHU19WRVJTSU9OX09GRik7CisJY3RybF92ZXIgPSBlbmFfY29tX3JlZ19iYXJfcmVhZDMyKGVuYV9kZXYsCisJCQkJCSAgRU5BX1JFR1NfQ09OVFJPTExFUl9WRVJTSU9OX09GRik7CisKKwlpZiAodW5saWtlbHkoKHZlciA9PSBFTkFfTU1JT19SRUFEX1RJTUVPVVQpIHx8CisJCSAgICAgKGN0cmxfdmVyID09IEVOQV9NTUlPX1JFQURfVElNRU9VVCkpKSB7CisJCXByX2VycigiUmVnIHJlYWQgdGltZW91dCBvY2N1cnJlZFxuIik7CisJCXJldHVybiAtRVRJTUU7CisJfQorCisJcHJfaW5mbygiZW5hIGRldmljZSB2ZXJzaW9uOiAlZC4lZFxuIiwKKwkJKHZlciAmIEVOQV9SRUdTX1ZFUlNJT05fTUFKT1JfVkVSU0lPTl9NQVNLKSA+PgorCQkJRU5BX1JFR1NfVkVSU0lPTl9NQUpPUl9WRVJTSU9OX1NISUZULAorCQl2ZXIgJiBFTkFfUkVHU19WRVJTSU9OX01JTk9SX1ZFUlNJT05fTUFTSyk7CisKKwlpZiAodmVyIDwgTUlOX0VOQV9WRVIpIHsKKwkJcHJfZXJyKCJFTkEgdmVyc2lvbiBpcyBsb3dlciB0aGFuIHRoZSBtaW5pbWFsIHZlcnNpb24gdGhlIGRyaXZlciBzdXBwb3J0c1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlwcl9pbmZvKCJlbmEgY29udHJvbGxlciB2ZXJzaW9uOiAlZC4lZC4lZCBpbXBsZW1lbnRhdGlvbiB2ZXJzaW9uICVkXG4iLAorCQkoY3RybF92ZXIgJiBFTkFfUkVHU19DT05UUk9MTEVSX1ZFUlNJT05fTUFKT1JfVkVSU0lPTl9NQVNLKSA+PgorCQkJRU5BX1JFR1NfQ09OVFJPTExFUl9WRVJTSU9OX01BSk9SX1ZFUlNJT05fU0hJRlQsCisJCShjdHJsX3ZlciAmIEVOQV9SRUdTX0NPTlRST0xMRVJfVkVSU0lPTl9NSU5PUl9WRVJTSU9OX01BU0spID4+CisJCQlFTkFfUkVHU19DT05UUk9MTEVSX1ZFUlNJT05fTUlOT1JfVkVSU0lPTl9TSElGVCwKKwkJKGN0cmxfdmVyICYgRU5BX1JFR1NfQ09OVFJPTExFUl9WRVJTSU9OX1NVQk1JTk9SX1ZFUlNJT05fTUFTSyksCisJCShjdHJsX3ZlciAmIEVOQV9SRUdTX0NPTlRST0xMRVJfVkVSU0lPTl9JTVBMX0lEX01BU0spID4+CisJCQlFTkFfUkVHU19DT05UUk9MTEVSX1ZFUlNJT05fSU1QTF9JRF9TSElGVCk7CisKKwljdHJsX3Zlcl9tYXNrZWQgPQorCQkoY3RybF92ZXIgJiBFTkFfUkVHU19DT05UUk9MTEVSX1ZFUlNJT05fTUFKT1JfVkVSU0lPTl9NQVNLKSB8CisJCShjdHJsX3ZlciAmIEVOQV9SRUdTX0NPTlRST0xMRVJfVkVSU0lPTl9NSU5PUl9WRVJTSU9OX01BU0spIHwKKwkJKGN0cmxfdmVyICYgRU5BX1JFR1NfQ09OVFJPTExFUl9WRVJTSU9OX1NVQk1JTk9SX1ZFUlNJT05fTUFTSyk7CisKKwkvKiBWYWxpZGF0ZSB0aGUgY3RybCB2ZXJzaW9uIHdpdGhvdXQgdGhlIGltcGxlbWVudGF0aW9uIElEICovCisJaWYgKGN0cmxfdmVyX21hc2tlZCA8IE1JTl9FTkFfQ1RSTF9WRVIpIHsKKwkJcHJfZXJyKCJFTkEgY3RybCB2ZXJzaW9uIGlzIGxvd2VyIHRoYW4gdGhlIG1pbmltYWwgY3RybCB2ZXJzaW9uIHRoZSBkcml2ZXIgc3VwcG9ydHNcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZW5hX2NvbV9hZG1pbl9kZXN0cm95KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqYWRtaW5fcXVldWUgPSAmZW5hX2Rldi0+YWRtaW5fcXVldWU7CisJc3RydWN0IGVuYV9jb21fYWRtaW5fY3EgKmNxID0gJmFkbWluX3F1ZXVlLT5jcTsKKwlzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9zcSAqc3EgPSAmYWRtaW5fcXVldWUtPnNxOworCXN0cnVjdCBlbmFfY29tX2FlbnEgKmFlbnEgPSAmZW5hX2Rldi0+YWVucTsKKwl1MTYgc2l6ZTsKKworCWlmIChhZG1pbl9xdWV1ZS0+Y29tcF9jdHgpCisJCWRldm1fa2ZyZWUoZW5hX2Rldi0+ZG1hZGV2LCBhZG1pbl9xdWV1ZS0+Y29tcF9jdHgpOworCWFkbWluX3F1ZXVlLT5jb21wX2N0eCA9IE5VTEw7CisJc2l6ZSA9IEFETUlOX1NRX1NJWkUoYWRtaW5fcXVldWUtPnFfZGVwdGgpOworCWlmIChzcS0+ZW50cmllcykKKwkJZG1hX2ZyZWVfY29oZXJlbnQoZW5hX2Rldi0+ZG1hZGV2LCBzaXplLCBzcS0+ZW50cmllcywKKwkJCQkgIHNxLT5kbWFfYWRkcik7CisJc3EtPmVudHJpZXMgPSBOVUxMOworCisJc2l6ZSA9IEFETUlOX0NRX1NJWkUoYWRtaW5fcXVldWUtPnFfZGVwdGgpOworCWlmIChjcS0+ZW50cmllcykKKwkJZG1hX2ZyZWVfY29oZXJlbnQoZW5hX2Rldi0+ZG1hZGV2LCBzaXplLCBjcS0+ZW50cmllcywKKwkJCQkgIGNxLT5kbWFfYWRkcik7CisJY3EtPmVudHJpZXMgPSBOVUxMOworCisJc2l6ZSA9IEFETUlOX0FFTlFfU0laRShhZW5xLT5xX2RlcHRoKTsKKwlpZiAoZW5hX2Rldi0+YWVucS5lbnRyaWVzKQorCQlkbWFfZnJlZV9jb2hlcmVudChlbmFfZGV2LT5kbWFkZXYsIHNpemUsIGFlbnEtPmVudHJpZXMsCisJCQkJICBhZW5xLT5kbWFfYWRkcik7CisJYWVucS0+ZW50cmllcyA9IE5VTEw7Cit9CisKK3ZvaWQgZW5hX2NvbV9zZXRfYWRtaW5fcG9sbGluZ19tb2RlKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwgYm9vbCBwb2xsaW5nKQoreworCWVuYV9kZXYtPmFkbWluX3F1ZXVlLnBvbGxpbmcgPSBwb2xsaW5nOworfQorCitpbnQgZW5hX2NvbV9tbWlvX3JlZ19yZWFkX3JlcXVlc3RfaW5pdChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJc3RydWN0IGVuYV9jb21fbW1pb19yZWFkICptbWlvX3JlYWQgPSAmZW5hX2Rldi0+bW1pb19yZWFkOworCisJc3Bpbl9sb2NrX2luaXQoJm1taW9fcmVhZC0+bG9jayk7CisJbW1pb19yZWFkLT5yZWFkX3Jlc3AgPQorCQlkbWFfemFsbG9jX2NvaGVyZW50KGVuYV9kZXYtPmRtYWRldiwKKwkJCQkgICAgc2l6ZW9mKCptbWlvX3JlYWQtPnJlYWRfcmVzcCksCisJCQkJICAgICZtbWlvX3JlYWQtPnJlYWRfcmVzcF9kbWFfYWRkciwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFtbWlvX3JlYWQtPnJlYWRfcmVzcCkpCisJCXJldHVybiAtRU5PTUVNOworCisJZW5hX2NvbV9tbWlvX3JlZ19yZWFkX3JlcXVlc3Rfd3JpdGVfZGV2X2FkZHIoZW5hX2Rldik7CisKKwltbWlvX3JlYWQtPnJlYWRfcmVzcC0+cmVxX2lkID0gMHgwOworCW1taW9fcmVhZC0+c2VxX251bSA9IDB4MDsKKwltbWlvX3JlYWQtPnJlYWRsZXNzX3N1cHBvcnRlZCA9IHRydWU7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBlbmFfY29tX3NldF9tbWlvX3JlYWRfbW9kZShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsIGJvb2wgcmVhZGxlc3Nfc3VwcG9ydGVkKQoreworCXN0cnVjdCBlbmFfY29tX21taW9fcmVhZCAqbW1pb19yZWFkID0gJmVuYV9kZXYtPm1taW9fcmVhZDsKKworCW1taW9fcmVhZC0+cmVhZGxlc3Nfc3VwcG9ydGVkID0gcmVhZGxlc3Nfc3VwcG9ydGVkOworfQorCit2b2lkIGVuYV9jb21fbW1pb19yZWdfcmVhZF9yZXF1ZXN0X2Rlc3Ryb3koc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXN0cnVjdCBlbmFfY29tX21taW9fcmVhZCAqbW1pb19yZWFkID0gJmVuYV9kZXYtPm1taW9fcmVhZDsKKworCXdyaXRlbCgweDAsIGVuYV9kZXYtPnJlZ19iYXIgKyBFTkFfUkVHU19NTUlPX1JFU1BfTE9fT0ZGKTsKKwl3cml0ZWwoMHgwLCBlbmFfZGV2LT5yZWdfYmFyICsgRU5BX1JFR1NfTU1JT19SRVNQX0hJX09GRik7CisKKwlkbWFfZnJlZV9jb2hlcmVudChlbmFfZGV2LT5kbWFkZXYsIHNpemVvZigqbW1pb19yZWFkLT5yZWFkX3Jlc3ApLAorCQkJICBtbWlvX3JlYWQtPnJlYWRfcmVzcCwgbW1pb19yZWFkLT5yZWFkX3Jlc3BfZG1hX2FkZHIpOworCisJbW1pb19yZWFkLT5yZWFkX3Jlc3AgPSBOVUxMOworfQorCit2b2lkIGVuYV9jb21fbW1pb19yZWdfcmVhZF9yZXF1ZXN0X3dyaXRlX2Rldl9hZGRyKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9tbWlvX3JlYWQgKm1taW9fcmVhZCA9ICZlbmFfZGV2LT5tbWlvX3JlYWQ7CisJdTMyIGFkZHJfbG93LCBhZGRyX2hpZ2g7CisKKwlhZGRyX2xvdyA9IEVOQV9ETUFfQUREUl9UT19VSU5UMzJfTE9XKG1taW9fcmVhZC0+cmVhZF9yZXNwX2RtYV9hZGRyKTsKKwlhZGRyX2hpZ2ggPSBFTkFfRE1BX0FERFJfVE9fVUlOVDMyX0hJR0gobW1pb19yZWFkLT5yZWFkX3Jlc3BfZG1hX2FkZHIpOworCisJd3JpdGVsKGFkZHJfbG93LCBlbmFfZGV2LT5yZWdfYmFyICsgRU5BX1JFR1NfTU1JT19SRVNQX0xPX09GRik7CisJd3JpdGVsKGFkZHJfaGlnaCwgZW5hX2Rldi0+cmVnX2JhciArIEVOQV9SRUdTX01NSU9fUkVTUF9ISV9PRkYpOworfQorCitpbnQgZW5hX2NvbV9hZG1pbl9pbml0KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJICAgICAgIHN0cnVjdCBlbmFfYWVucV9oYW5kbGVycyAqYWVucV9oYW5kbGVycywKKwkJICAgICAgIGJvb2wgaW5pdF9zcGlubG9jaykKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqYWRtaW5fcXVldWUgPSAmZW5hX2Rldi0+YWRtaW5fcXVldWU7CisJdTMyIGFxX2NhcHMsIGFjcV9jYXBzLCBkZXZfc3RzLCBhZGRyX2xvdywgYWRkcl9oaWdoOworCWludCByZXQ7CisKKwlkZXZfc3RzID0gZW5hX2NvbV9yZWdfYmFyX3JlYWQzMihlbmFfZGV2LCBFTkFfUkVHU19ERVZfU1RTX09GRik7CisKKwlpZiAodW5saWtlbHkoZGV2X3N0cyA9PSBFTkFfTU1JT19SRUFEX1RJTUVPVVQpKSB7CisJCXByX2VycigiUmVnIHJlYWQgdGltZW91dCBvY2N1cnJlZFxuIik7CisJCXJldHVybiAtRVRJTUU7CisJfQorCisJaWYgKCEoZGV2X3N0cyAmIEVOQV9SRUdTX0RFVl9TVFNfUkVBRFlfTUFTSykpIHsKKwkJcHJfZXJyKCJEZXZpY2UgaXNuJ3QgcmVhZHksIGFib3J0IGNvbSBpbml0XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJYWRtaW5fcXVldWUtPnFfZGVwdGggPSBFTkFfQURNSU5fUVVFVUVfREVQVEg7CisKKwlhZG1pbl9xdWV1ZS0+cV9kbWFkZXYgPSBlbmFfZGV2LT5kbWFkZXY7CisJYWRtaW5fcXVldWUtPnBvbGxpbmcgPSBmYWxzZTsKKwlhZG1pbl9xdWV1ZS0+Y3Vycl9jbWRfaWQgPSAwOworCisJYXRvbWljX3NldCgmYWRtaW5fcXVldWUtPm91dHN0YW5kaW5nX2NtZHMsIDApOworCisJaWYgKGluaXRfc3BpbmxvY2spCisJCXNwaW5fbG9ja19pbml0KCZhZG1pbl9xdWV1ZS0+cV9sb2NrKTsKKworCXJldCA9IGVuYV9jb21faW5pdF9jb21wX2N0eHQoYWRtaW5fcXVldWUpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBlbmFfY29tX2FkbWluX2luaXRfc3EoYWRtaW5fcXVldWUpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBlbmFfY29tX2FkbWluX2luaXRfY3EoYWRtaW5fcXVldWUpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlhZG1pbl9xdWV1ZS0+c3EuZGJfYWRkciA9ICh1MzIgX19pb21lbSAqKSgodWludHB0cl90KWVuYV9kZXYtPnJlZ19iYXIgKworCQlFTkFfUkVHU19BUV9EQl9PRkYpOworCisJYWRkcl9sb3cgPSBFTkFfRE1BX0FERFJfVE9fVUlOVDMyX0xPVyhhZG1pbl9xdWV1ZS0+c3EuZG1hX2FkZHIpOworCWFkZHJfaGlnaCA9IEVOQV9ETUFfQUREUl9UT19VSU5UMzJfSElHSChhZG1pbl9xdWV1ZS0+c3EuZG1hX2FkZHIpOworCisJd3JpdGVsKGFkZHJfbG93LCBlbmFfZGV2LT5yZWdfYmFyICsgRU5BX1JFR1NfQVFfQkFTRV9MT19PRkYpOworCXdyaXRlbChhZGRyX2hpZ2gsIGVuYV9kZXYtPnJlZ19iYXIgKyBFTkFfUkVHU19BUV9CQVNFX0hJX09GRik7CisKKwlhZGRyX2xvdyA9IEVOQV9ETUFfQUREUl9UT19VSU5UMzJfTE9XKGFkbWluX3F1ZXVlLT5jcS5kbWFfYWRkcik7CisJYWRkcl9oaWdoID0gRU5BX0RNQV9BRERSX1RPX1VJTlQzMl9ISUdIKGFkbWluX3F1ZXVlLT5jcS5kbWFfYWRkcik7CisKKwl3cml0ZWwoYWRkcl9sb3csIGVuYV9kZXYtPnJlZ19iYXIgKyBFTkFfUkVHU19BQ1FfQkFTRV9MT19PRkYpOworCXdyaXRlbChhZGRyX2hpZ2gsIGVuYV9kZXYtPnJlZ19iYXIgKyBFTkFfUkVHU19BQ1FfQkFTRV9ISV9PRkYpOworCisJYXFfY2FwcyA9IDA7CisJYXFfY2FwcyB8PSBhZG1pbl9xdWV1ZS0+cV9kZXB0aCAmIEVOQV9SRUdTX0FRX0NBUFNfQVFfREVQVEhfTUFTSzsKKwlhcV9jYXBzIHw9IChzaXplb2Yoc3RydWN0IGVuYV9hZG1pbl9hcV9lbnRyeSkgPDwKKwkJCUVOQV9SRUdTX0FRX0NBUFNfQVFfRU5UUllfU0laRV9TSElGVCkgJgorCQkJRU5BX1JFR1NfQVFfQ0FQU19BUV9FTlRSWV9TSVpFX01BU0s7CisKKwlhY3FfY2FwcyA9IDA7CisJYWNxX2NhcHMgfD0gYWRtaW5fcXVldWUtPnFfZGVwdGggJiBFTkFfUkVHU19BQ1FfQ0FQU19BQ1FfREVQVEhfTUFTSzsKKwlhY3FfY2FwcyB8PSAoc2l6ZW9mKHN0cnVjdCBlbmFfYWRtaW5fYWNxX2VudHJ5KSA8PAorCQlFTkFfUkVHU19BQ1FfQ0FQU19BQ1FfRU5UUllfU0laRV9TSElGVCkgJgorCQlFTkFfUkVHU19BQ1FfQ0FQU19BQ1FfRU5UUllfU0laRV9NQVNLOworCisJd3JpdGVsKGFxX2NhcHMsIGVuYV9kZXYtPnJlZ19iYXIgKyBFTkFfUkVHU19BUV9DQVBTX09GRik7CisJd3JpdGVsKGFjcV9jYXBzLCBlbmFfZGV2LT5yZWdfYmFyICsgRU5BX1JFR1NfQUNRX0NBUFNfT0ZGKTsKKwlyZXQgPSBlbmFfY29tX2FkbWluX2luaXRfYWVucShlbmFfZGV2LCBhZW5xX2hhbmRsZXJzKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJYWRtaW5fcXVldWUtPnJ1bm5pbmdfc3RhdGUgPSB0cnVlOworCisJcmV0dXJuIDA7CitlcnJvcjoKKwllbmFfY29tX2FkbWluX2Rlc3Ryb3koZW5hX2Rldik7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZW5hX2NvbV9jcmVhdGVfaW9fcXVldWUoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJICAgIHN0cnVjdCBlbmFfY29tX2NyZWF0ZV9pb19jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9pb19zcSAqaW9fc3E7CisJc3RydWN0IGVuYV9jb21faW9fY3EgKmlvX2NxOworCWludCByZXQ7CisKKwlpZiAoY3R4LT5xaWQgPj0gRU5BX1RPVEFMX05VTV9RVUVVRVMpIHsKKwkJcHJfZXJyKCJRaWQgKCVkKSBpcyBiaWdnZXIgdGhhbiBtYXggbnVtIG9mIHF1ZXVlcyAoJWQpXG4iLAorCQkgICAgICAgY3R4LT5xaWQsIEVOQV9UT1RBTF9OVU1fUVVFVUVTKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaW9fc3EgPSAmZW5hX2Rldi0+aW9fc3FfcXVldWVzW2N0eC0+cWlkXTsKKwlpb19jcSA9ICZlbmFfZGV2LT5pb19jcV9xdWV1ZXNbY3R4LT5xaWRdOworCisJbWVtc2V0KGlvX3NxLCAweDAsIHNpemVvZihzdHJ1Y3QgZW5hX2NvbV9pb19zcSkpOworCW1lbXNldChpb19jcSwgMHgwLCBzaXplb2Yoc3RydWN0IGVuYV9jb21faW9fY3EpKTsKKworCS8qIEluaXQgQ1EgKi8KKwlpb19jcS0+cV9kZXB0aCA9IGN0eC0+cXVldWVfc2l6ZTsKKwlpb19jcS0+ZGlyZWN0aW9uID0gY3R4LT5kaXJlY3Rpb247CisJaW9fY3EtPnFpZCA9IGN0eC0+cWlkOworCisJaW9fY3EtPm1zaXhfdmVjdG9yID0gY3R4LT5tc2l4X3ZlY3RvcjsKKworCWlvX3NxLT5xX2RlcHRoID0gY3R4LT5xdWV1ZV9zaXplOworCWlvX3NxLT5kaXJlY3Rpb24gPSBjdHgtPmRpcmVjdGlvbjsKKwlpb19zcS0+cWlkID0gY3R4LT5xaWQ7CisKKwlpb19zcS0+bWVtX3F1ZXVlX3R5cGUgPSBjdHgtPm1lbV9xdWV1ZV90eXBlOworCisJaWYgKGN0eC0+ZGlyZWN0aW9uID09IEVOQV9DT01fSU9fUVVFVUVfRElSRUNUSU9OX1RYKQorCQkvKiBoZWFkZXIgbGVuZ3RoIGlzIGxpbWl0ZWQgdG8gOCBiaXRzICovCisJCWlvX3NxLT50eF9tYXhfaGVhZGVyX3NpemUgPQorCQkJbWluX3QodTMyLCBlbmFfZGV2LT50eF9tYXhfaGVhZGVyX3NpemUsIFNaXzI1Nik7CisKKwlyZXQgPSBlbmFfY29tX2luaXRfaW9fc3EoZW5hX2RldiwgY3R4LCBpb19zcSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKwlyZXQgPSBlbmFfY29tX2luaXRfaW9fY3EoZW5hX2RldiwgY3R4LCBpb19jcSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IGVuYV9jb21fY3JlYXRlX2lvX2NxKGVuYV9kZXYsIGlvX2NxKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gZW5hX2NvbV9jcmVhdGVfaW9fc3EoZW5hX2RldiwgaW9fc3EsIGlvX2NxLT5pZHgpOworCWlmIChyZXQpCisJCWdvdG8gZGVzdHJveV9pb19jcTsKKworCXJldHVybiAwOworCitkZXN0cm95X2lvX2NxOgorCWVuYV9jb21fZGVzdHJveV9pb19jcShlbmFfZGV2LCBpb19jcSk7CitlcnJvcjoKKwllbmFfY29tX2lvX3F1ZXVlX2ZyZWUoZW5hX2RldiwgaW9fc3EsIGlvX2NxKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGVuYV9jb21fZGVzdHJveV9pb19xdWV1ZShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsIHUxNiBxaWQpCit7CisJc3RydWN0IGVuYV9jb21faW9fc3EgKmlvX3NxOworCXN0cnVjdCBlbmFfY29tX2lvX2NxICppb19jcTsKKworCWlmIChxaWQgPj0gRU5BX1RPVEFMX05VTV9RVUVVRVMpIHsKKwkJcHJfZXJyKCJRaWQgKCVkKSBpcyBiaWdnZXIgdGhhbiBtYXggbnVtIG9mIHF1ZXVlcyAoJWQpXG4iLCBxaWQsCisJCSAgICAgICBFTkFfVE9UQUxfTlVNX1FVRVVFUyk7CisJCXJldHVybjsKKwl9CisKKwlpb19zcSA9ICZlbmFfZGV2LT5pb19zcV9xdWV1ZXNbcWlkXTsKKwlpb19jcSA9ICZlbmFfZGV2LT5pb19jcV9xdWV1ZXNbcWlkXTsKKworCWVuYV9jb21fZGVzdHJveV9pb19zcShlbmFfZGV2LCBpb19zcSk7CisJZW5hX2NvbV9kZXN0cm95X2lvX2NxKGVuYV9kZXYsIGlvX2NxKTsKKworCWVuYV9jb21faW9fcXVldWVfZnJlZShlbmFfZGV2LCBpb19zcSwgaW9fY3EpOworfQorCitpbnQgZW5hX2NvbV9nZXRfbGlua19wYXJhbXMoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJICAgIHN0cnVjdCBlbmFfYWRtaW5fZ2V0X2ZlYXRfcmVzcCAqcmVzcCkKK3sKKwlyZXR1cm4gZW5hX2NvbV9nZXRfZmVhdHVyZShlbmFfZGV2LCByZXNwLCBFTkFfQURNSU5fTElOS19DT05GSUcpOworfQorCitpbnQgZW5hX2NvbV9nZXRfZGV2X2F0dHJfZmVhdChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkgICAgICBzdHJ1Y3QgZW5hX2NvbV9kZXZfZ2V0X2ZlYXR1cmVzX2N0eCAqZ2V0X2ZlYXRfY3R4KQoreworCXN0cnVjdCBlbmFfYWRtaW5fZ2V0X2ZlYXRfcmVzcCBnZXRfcmVzcDsKKwlpbnQgcmM7CisKKwlyYyA9IGVuYV9jb21fZ2V0X2ZlYXR1cmUoZW5hX2RldiwgJmdldF9yZXNwLAorCQkJCSBFTkFfQURNSU5fREVWSUNFX0FUVFJJQlVURVMpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJbWVtY3B5KCZnZXRfZmVhdF9jdHgtPmRldl9hdHRyLCAmZ2V0X3Jlc3AudS5kZXZfYXR0ciwKKwkgICAgICAgc2l6ZW9mKGdldF9yZXNwLnUuZGV2X2F0dHIpKTsKKwllbmFfZGV2LT5zdXBwb3J0ZWRfZmVhdHVyZXMgPSBnZXRfcmVzcC51LmRldl9hdHRyLnN1cHBvcnRlZF9mZWF0dXJlczsKKworCXJjID0gZW5hX2NvbV9nZXRfZmVhdHVyZShlbmFfZGV2LCAmZ2V0X3Jlc3AsCisJCQkJIEVOQV9BRE1JTl9NQVhfUVVFVUVTX05VTSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwltZW1jcHkoJmdldF9mZWF0X2N0eC0+bWF4X3F1ZXVlcywgJmdldF9yZXNwLnUubWF4X3F1ZXVlLAorCSAgICAgICBzaXplb2YoZ2V0X3Jlc3AudS5tYXhfcXVldWUpKTsKKwllbmFfZGV2LT50eF9tYXhfaGVhZGVyX3NpemUgPSBnZXRfcmVzcC51Lm1heF9xdWV1ZS5tYXhfaGVhZGVyX3NpemU7CisKKwlyYyA9IGVuYV9jb21fZ2V0X2ZlYXR1cmUoZW5hX2RldiwgJmdldF9yZXNwLAorCQkJCSBFTkFfQURNSU5fQUVOUV9DT05GSUcpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJbWVtY3B5KCZnZXRfZmVhdF9jdHgtPmFlbnEsICZnZXRfcmVzcC51LmFlbnEsCisJICAgICAgIHNpemVvZihnZXRfcmVzcC51LmFlbnEpKTsKKworCXJjID0gZW5hX2NvbV9nZXRfZmVhdHVyZShlbmFfZGV2LCAmZ2V0X3Jlc3AsCisJCQkJIEVOQV9BRE1JTl9TVEFURUxFU1NfT0ZGTE9BRF9DT05GSUcpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJbWVtY3B5KCZnZXRfZmVhdF9jdHgtPm9mZmxvYWQsICZnZXRfcmVzcC51Lm9mZmxvYWQsCisJICAgICAgIHNpemVvZihnZXRfcmVzcC51Lm9mZmxvYWQpKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGVuYV9jb21fYWRtaW5fcV9jb21wX2ludHJfaGFuZGxlcihzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJZW5hX2NvbV9oYW5kbGVfYWRtaW5fY29tcGxldGlvbigmZW5hX2Rldi0+YWRtaW5fcXVldWUpOworfQorCisvKiBlbmFfaGFuZGxlX3NwZWNpZmljX2FlbnFfZXZlbnQ6CisgKiByZXR1cm4gdGhlIGhhbmRsZXIgdGhhdCBpcyByZWxldmFudCB0byB0aGUgc3BlY2lmaWMgZXZlbnQgZ3JvdXAKKyAqLworc3RhdGljIGVuYV9hZW5xX2hhbmRsZXIgZW5hX2NvbV9nZXRfc3BlY2lmaWNfYWVucV9jYihzdHJ1Y3QgZW5hX2NvbV9kZXYgKmRldiwKKwkJCQkJCSAgICAgdTE2IGdyb3VwKQoreworCXN0cnVjdCBlbmFfYWVucV9oYW5kbGVycyAqYWVucV9oYW5kbGVycyA9IGRldi0+YWVucS5hZW5xX2hhbmRsZXJzOworCisJaWYgKChncm91cCA8IEVOQV9NQVhfSEFORExFUlMpICYmIGFlbnFfaGFuZGxlcnMtPmhhbmRsZXJzW2dyb3VwXSkKKwkJcmV0dXJuIGFlbnFfaGFuZGxlcnMtPmhhbmRsZXJzW2dyb3VwXTsKKworCXJldHVybiBhZW5xX2hhbmRsZXJzLT51bmltcGxlbWVudGVkX2hhbmRsZXI7Cit9CisKKy8qIGVuYV9hZW5xX2ludHJfaGFuZGxlcjoKKyAqIGhhbmRsZXMgdGhlIGFlbnEgaW5jb21pbmcgZXZlbnRzLgorICogcG9wIGV2ZW50cyBmcm9tIHRoZSBxdWV1ZSBhbmQgYXBwbHkgdGhlIHNwZWNpZmljIGhhbmRsZXIKKyAqLwordm9pZCBlbmFfY29tX2FlbnFfaW50cl9oYW5kbGVyKHN0cnVjdCBlbmFfY29tX2RldiAqZGV2LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBlbmFfYWRtaW5fYWVucV9lbnRyeSAqYWVucV9lOworCXN0cnVjdCBlbmFfYWRtaW5fYWVucV9jb21tb25fZGVzYyAqYWVucV9jb21tb247CisJc3RydWN0IGVuYV9jb21fYWVucSAqYWVucSAgPSAmZGV2LT5hZW5xOworCWVuYV9hZW5xX2hhbmRsZXIgaGFuZGxlcl9jYjsKKwl1MTYgbWFza2VkX2hlYWQsIHByb2Nlc3NlZCA9IDA7CisJdTggcGhhc2U7CisKKwltYXNrZWRfaGVhZCA9IGFlbnEtPmhlYWQgJiAoYWVucS0+cV9kZXB0aCAtIDEpOworCXBoYXNlID0gYWVucS0+cGhhc2U7CisJYWVucV9lID0gJmFlbnEtPmVudHJpZXNbbWFza2VkX2hlYWRdOyAvKiBHZXQgZmlyc3QgZW50cnkgKi8KKwlhZW5xX2NvbW1vbiA9ICZhZW5xX2UtPmFlbnFfY29tbW9uX2Rlc2M7CisKKwkvKiBHbyBvdmVyIGFsbCB0aGUgZXZlbnRzICovCisJd2hpbGUgKChhZW5xX2NvbW1vbi0+ZmxhZ3MgJiBFTkFfQURNSU5fQUVOUV9DT01NT05fREVTQ19QSEFTRV9NQVNLKSA9PQorCSAgICAgICBwaGFzZSkgeworCQlwcl9kZWJ1ZygiQUVOUSEgR3JvdXBbJXhdIFN5bmRyb21bJXhdIHRpbWVzdGFtcDogWyVsbHVzXVxuIiwKKwkJCSBhZW5xX2NvbW1vbi0+Z3JvdXAsIGFlbnFfY29tbW9uLT5zeW5kcm9tLAorCQkJICh1NjQpYWVucV9jb21tb24tPnRpbWVzdGFtcF9sb3cgKworCQkJCSAoKHU2NClhZW5xX2NvbW1vbi0+dGltZXN0YW1wX2hpZ2ggPDwgMzIpKTsKKworCQkvKiBIYW5kbGUgc3BlY2lmaWMgZXZlbnQqLworCQloYW5kbGVyX2NiID0gZW5hX2NvbV9nZXRfc3BlY2lmaWNfYWVucV9jYihkZXYsCisJCQkJCQkJICBhZW5xX2NvbW1vbi0+Z3JvdXApOworCQloYW5kbGVyX2NiKGRhdGEsIGFlbnFfZSk7IC8qIGNhbGwgdGhlIGFjdHVhbCBldmVudCBoYW5kbGVyKi8KKworCQkvKiBHZXQgbmV4dCBldmVudCBlbnRyeSAqLworCQltYXNrZWRfaGVhZCsrOworCQlwcm9jZXNzZWQrKzsKKworCQlpZiAodW5saWtlbHkobWFza2VkX2hlYWQgPT0gYWVucS0+cV9kZXB0aCkpIHsKKwkJCW1hc2tlZF9oZWFkID0gMDsKKwkJCXBoYXNlID0gIXBoYXNlOworCQl9CisJCWFlbnFfZSA9ICZhZW5xLT5lbnRyaWVzW21hc2tlZF9oZWFkXTsKKwkJYWVucV9jb21tb24gPSAmYWVucV9lLT5hZW5xX2NvbW1vbl9kZXNjOworCX0KKworCWFlbnEtPmhlYWQgKz0gcHJvY2Vzc2VkOworCWFlbnEtPnBoYXNlID0gcGhhc2U7CisKKwkvKiBEb24ndCB1cGRhdGUgYWVucSBkb29yYmVsbCBpZiB0aGVyZSB3ZXJlbid0IGFueSBwcm9jZXNzZWQgZXZlbnRzICovCisJaWYgKCFwcm9jZXNzZWQpCisJCXJldHVybjsKKworCS8qIHdyaXRlIHRoZSBhZW5xIGRvb3JiZWxsIGFmdGVyIGFsbCBBRU5RIGRlc2NyaXB0b3JzIHdlcmUgcmVhZCAqLworCW1iKCk7CisJd3JpdGVsKCh1MzIpYWVucS0+aGVhZCwgZGV2LT5yZWdfYmFyICsgRU5BX1JFR1NfQUVOUV9IRUFEX0RCX09GRik7Cit9CisKK2ludCBlbmFfY29tX2Rldl9yZXNldChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJdTMyIHN0YXQsIHRpbWVvdXQsIGNhcCwgcmVzZXRfdmFsOworCWludCByYzsKKworCXN0YXQgPSBlbmFfY29tX3JlZ19iYXJfcmVhZDMyKGVuYV9kZXYsIEVOQV9SRUdTX0RFVl9TVFNfT0ZGKTsKKwljYXAgPSBlbmFfY29tX3JlZ19iYXJfcmVhZDMyKGVuYV9kZXYsIEVOQV9SRUdTX0NBUFNfT0ZGKTsKKworCWlmICh1bmxpa2VseSgoc3RhdCA9PSBFTkFfTU1JT19SRUFEX1RJTUVPVVQpIHx8CisJCSAgICAgKGNhcCA9PSBFTkFfTU1JT19SRUFEX1RJTUVPVVQpKSkgeworCQlwcl9lcnIoIlJlZyByZWFkMzIgdGltZW91dCBvY2N1cnJlZFxuIik7CisJCXJldHVybiAtRVRJTUU7CisJfQorCisJaWYgKChzdGF0ICYgRU5BX1JFR1NfREVWX1NUU19SRUFEWV9NQVNLKSA9PSAwKSB7CisJCXByX2VycigiRGV2aWNlIGlzbid0IHJlYWR5LCBjYW4ndCByZXNldCBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl0aW1lb3V0ID0gKGNhcCAmIEVOQV9SRUdTX0NBUFNfUkVTRVRfVElNRU9VVF9NQVNLKSA+PgorCQkJRU5BX1JFR1NfQ0FQU19SRVNFVF9USU1FT1VUX1NISUZUOworCWlmICh0aW1lb3V0ID09IDApIHsKKwkJcHJfZXJyKCJJbnZhbGlkIHRpbWVvdXQgdmFsdWVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBzdGFydCByZXNldCAqLworCXJlc2V0X3ZhbCA9IEVOQV9SRUdTX0RFVl9DVExfREVWX1JFU0VUX01BU0s7CisJd3JpdGVsKHJlc2V0X3ZhbCwgZW5hX2Rldi0+cmVnX2JhciArIEVOQV9SRUdTX0RFVl9DVExfT0ZGKTsKKworCS8qIFdyaXRlIGFnYWluIHRoZSBNTUlPIHJlYWQgcmVxdWVzdCBhZGRyZXNzICovCisJZW5hX2NvbV9tbWlvX3JlZ19yZWFkX3JlcXVlc3Rfd3JpdGVfZGV2X2FkZHIoZW5hX2Rldik7CisKKwlyYyA9IHdhaXRfZm9yX3Jlc2V0X3N0YXRlKGVuYV9kZXYsIHRpbWVvdXQsCisJCQkJICBFTkFfUkVHU19ERVZfU1RTX1JFU0VUX0lOX1BST0dSRVNTX01BU0spOworCWlmIChyYyAhPSAwKSB7CisJCXByX2VycigiUmVzZXQgaW5kaWNhdGlvbiBkaWRuJ3QgdHVybiBvblxuIik7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiByZXNldCBkb25lICovCisJd3JpdGVsKDAsIGVuYV9kZXYtPnJlZ19iYXIgKyBFTkFfUkVHU19ERVZfQ1RMX09GRik7CisJcmMgPSB3YWl0X2Zvcl9yZXNldF9zdGF0ZShlbmFfZGV2LCB0aW1lb3V0LCAwKTsKKwlpZiAocmMgIT0gMCkgeworCQlwcl9lcnIoIlJlc2V0IGluZGljYXRpb24gZGlkbid0IHR1cm4gb2ZmXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuYV9nZXRfZGV2X3N0YXRzKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCSAgICAgc3RydWN0IGVuYV9jb21fc3RhdHNfY3R4ICpjdHgsCisJCQkgICAgIGVudW0gZW5hX2FkbWluX2dldF9zdGF0c190eXBlIHR5cGUpCit7CisJc3RydWN0IGVuYV9hZG1pbl9hcV9nZXRfc3RhdHNfY21kICpnZXRfY21kID0gJmN0eC0+Z2V0X2NtZDsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FjcV9nZXRfc3RhdHNfcmVzcCAqZ2V0X3Jlc3AgPSAmY3R4LT5nZXRfcmVzcDsKKwlzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqYWRtaW5fcXVldWU7CisJaW50IHJldDsKKworCWFkbWluX3F1ZXVlID0gJmVuYV9kZXYtPmFkbWluX3F1ZXVlOworCisJZ2V0X2NtZC0+YXFfY29tbW9uX2Rlc2NyaXB0b3Iub3Bjb2RlID0gRU5BX0FETUlOX0dFVF9TVEFUUzsKKwlnZXRfY21kLT5hcV9jb21tb25fZGVzY3JpcHRvci5mbGFncyA9IDA7CisJZ2V0X2NtZC0+dHlwZSA9IHR5cGU7CisKKwlyZXQgPSAgZW5hX2NvbV9leGVjdXRlX2FkbWluX2NvbW1hbmQoYWRtaW5fcXVldWUsCisJCQkJCSAgICAgKHN0cnVjdCBlbmFfYWRtaW5fYXFfZW50cnkgKilnZXRfY21kLAorCQkJCQkgICAgIHNpemVvZigqZ2V0X2NtZCksCisJCQkJCSAgICAgKHN0cnVjdCBlbmFfYWRtaW5fYWNxX2VudHJ5ICopZ2V0X3Jlc3AsCisJCQkJCSAgICAgc2l6ZW9mKCpnZXRfcmVzcCkpOworCisJaWYgKHVubGlrZWx5KHJldCkpCisJCXByX2VycigiRmFpbGVkIHRvIGdldCBzdGF0cy4gZXJyb3I6ICVkXG4iLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGVuYV9jb21fZ2V0X2Rldl9iYXNpY19zdGF0cyhzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkJc3RydWN0IGVuYV9hZG1pbl9iYXNpY19zdGF0cyAqc3RhdHMpCit7CisJc3RydWN0IGVuYV9jb21fc3RhdHNfY3R4IGN0eDsKKwlpbnQgcmV0OworCisJbWVtc2V0KCZjdHgsIDB4MCwgc2l6ZW9mKGN0eCkpOworCXJldCA9IGVuYV9nZXRfZGV2X3N0YXRzKGVuYV9kZXYsICZjdHgsIEVOQV9BRE1JTl9HRVRfU1RBVFNfVFlQRV9CQVNJQyk7CisJaWYgKGxpa2VseShyZXQgPT0gMCkpCisJCW1lbWNweShzdGF0cywgJmN0eC5nZXRfcmVzcC5iYXNpY19zdGF0cywKKwkJICAgICAgIHNpemVvZihjdHguZ2V0X3Jlc3AuYmFzaWNfc3RhdHMpKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBlbmFfY29tX3NldF9kZXZfbXR1KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwgaW50IG10dSkKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqYWRtaW5fcXVldWU7CisJc3RydWN0IGVuYV9hZG1pbl9zZXRfZmVhdF9jbWQgY21kOworCXN0cnVjdCBlbmFfYWRtaW5fc2V0X2ZlYXRfcmVzcCByZXNwOworCWludCByZXQ7CisKKwlpZiAoIWVuYV9jb21fY2hlY2tfc3VwcG9ydGVkX2ZlYXR1cmVfaWQoZW5hX2RldiwgRU5BX0FETUlOX01UVSkpIHsKKwkJcHJfaW5mbygiRmVhdHVyZSAlZCBpc24ndCBzdXBwb3J0ZWRcbiIsIEVOQV9BRE1JTl9NVFUpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCW1lbXNldCgmY21kLCAweDAsIHNpemVvZihjbWQpKTsKKwlhZG1pbl9xdWV1ZSA9ICZlbmFfZGV2LT5hZG1pbl9xdWV1ZTsKKworCWNtZC5hcV9jb21tb25fZGVzY3JpcHRvci5vcGNvZGUgPSBFTkFfQURNSU5fU0VUX0ZFQVRVUkU7CisJY21kLmFxX2NvbW1vbl9kZXNjcmlwdG9yLmZsYWdzID0gMDsKKwljbWQuZmVhdF9jb21tb24uZmVhdHVyZV9pZCA9IEVOQV9BRE1JTl9NVFU7CisJY21kLnUubXR1Lm10dSA9IG10dTsKKworCXJldCA9IGVuYV9jb21fZXhlY3V0ZV9hZG1pbl9jb21tYW5kKGFkbWluX3F1ZXVlLAorCQkJCQkgICAgKHN0cnVjdCBlbmFfYWRtaW5fYXFfZW50cnkgKikmY21kLAorCQkJCQkgICAgc2l6ZW9mKGNtZCksCisJCQkJCSAgICAoc3RydWN0IGVuYV9hZG1pbl9hY3FfZW50cnkgKikmcmVzcCwKKwkJCQkJICAgIHNpemVvZihyZXNwKSk7CisKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJcHJfZXJyKCJGYWlsZWQgdG8gc2V0IG10dSAlZC4gZXJyb3I6ICVkXG4iLCBtdHUsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZW5hX2NvbV9nZXRfb2ZmbG9hZF9zZXR0aW5ncyhzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkJIHN0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9vZmZsb2FkX2Rlc2MgKm9mZmxvYWQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZW5hX2FkbWluX2dldF9mZWF0X3Jlc3AgcmVzcDsKKworCXJldCA9IGVuYV9jb21fZ2V0X2ZlYXR1cmUoZW5hX2RldiwgJnJlc3AsCisJCQkJICBFTkFfQURNSU5fU1RBVEVMRVNTX09GRkxPQURfQ09ORklHKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBnZXQgb2ZmbG9hZCBjYXBhYmlsaXRpZXMgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJbWVtY3B5KG9mZmxvYWQsICZyZXNwLnUub2ZmbG9hZCwgc2l6ZW9mKHJlc3AudS5vZmZsb2FkKSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGVuYV9jb21fc2V0X2hhc2hfZnVuY3Rpb24oc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICphZG1pbl9xdWV1ZSA9ICZlbmFfZGV2LT5hZG1pbl9xdWV1ZTsKKwlzdHJ1Y3QgZW5hX3JzcyAqcnNzID0gJmVuYV9kZXYtPnJzczsKKwlzdHJ1Y3QgZW5hX2FkbWluX3NldF9mZWF0X2NtZCBjbWQ7CisJc3RydWN0IGVuYV9hZG1pbl9zZXRfZmVhdF9yZXNwIHJlc3A7CisJc3RydWN0IGVuYV9hZG1pbl9nZXRfZmVhdF9yZXNwIGdldF9yZXNwOworCWludCByZXQ7CisKKwlpZiAoIWVuYV9jb21fY2hlY2tfc3VwcG9ydGVkX2ZlYXR1cmVfaWQoZW5hX2RldiwKKwkJCQkJCUVOQV9BRE1JTl9SU1NfSEFTSF9GVU5DVElPTikpIHsKKwkJcHJfaW5mbygiRmVhdHVyZSAlZCBpc24ndCBzdXBwb3J0ZWRcbiIsCisJCQlFTkFfQURNSU5fUlNTX0hBU0hfRlVOQ1RJT04pOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCS8qIFZhbGlkYXRlIGhhc2ggZnVuY3Rpb24gaXMgc3VwcG9ydGVkICovCisJcmV0ID0gZW5hX2NvbV9nZXRfZmVhdHVyZShlbmFfZGV2LCAmZ2V0X3Jlc3AsCisJCQkJICBFTkFfQURNSU5fUlNTX0hBU0hfRlVOQ1RJT04pOworCWlmICh1bmxpa2VseShyZXQpKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGdldF9yZXNwLnUuZmxvd19oYXNoX2Z1bmMuc3VwcG9ydGVkX2Z1bmMgJiAoMSA8PCByc3MtPmhhc2hfZnVuYykpIHsKKwkJcHJfZXJyKCJGdW5jIGhhc2ggJWQgaXNuJ3Qgc3VwcG9ydGVkIGJ5IGRldmljZSwgYWJvcnRcbiIsCisJCSAgICAgICByc3MtPmhhc2hfZnVuYyk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJbWVtc2V0KCZjbWQsIDB4MCwgc2l6ZW9mKGNtZCkpOworCisJY21kLmFxX2NvbW1vbl9kZXNjcmlwdG9yLm9wY29kZSA9IEVOQV9BRE1JTl9TRVRfRkVBVFVSRTsKKwljbWQuYXFfY29tbW9uX2Rlc2NyaXB0b3IuZmxhZ3MgPQorCQlFTkFfQURNSU5fQVFfQ09NTU9OX0RFU0NfQ1RSTF9EQVRBX0lORElSRUNUX01BU0s7CisJY21kLmZlYXRfY29tbW9uLmZlYXR1cmVfaWQgPSBFTkFfQURNSU5fUlNTX0hBU0hfRlVOQ1RJT047CisJY21kLnUuZmxvd19oYXNoX2Z1bmMuaW5pdF92YWwgPSByc3MtPmhhc2hfaW5pdF92YWw7CisJY21kLnUuZmxvd19oYXNoX2Z1bmMuc2VsZWN0ZWRfZnVuYyA9IDEgPDwgcnNzLT5oYXNoX2Z1bmM7CisKKwlyZXQgPSBlbmFfY29tX21lbV9hZGRyX3NldChlbmFfZGV2LAorCQkJCSAgICZjbWQuY29udHJvbF9idWZmZXIuYWRkcmVzcywKKwkJCQkgICByc3MtPmhhc2hfa2V5X2RtYV9hZGRyKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlwcl9lcnIoIm1lbW9yeSBhZGRyZXNzIHNldCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWNtZC5jb250cm9sX2J1ZmZlci5sZW5ndGggPSBzaXplb2YoKnJzcy0+aGFzaF9rZXkpOworCisJcmV0ID0gZW5hX2NvbV9leGVjdXRlX2FkbWluX2NvbW1hbmQoYWRtaW5fcXVldWUsCisJCQkJCSAgICAoc3RydWN0IGVuYV9hZG1pbl9hcV9lbnRyeSAqKSZjbWQsCisJCQkJCSAgICBzaXplb2YoY21kKSwKKwkJCQkJICAgIChzdHJ1Y3QgZW5hX2FkbWluX2FjcV9lbnRyeSAqKSZyZXNwLAorCQkJCQkgICAgc2l6ZW9mKHJlc3ApKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBzZXQgaGFzaCBmdW5jdGlvbiAlZC4gZXJyb3I6ICVkXG4iLAorCQkgICAgICAgcnNzLT5oYXNoX2Z1bmMsIHJldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgZW5hX2NvbV9maWxsX2hhc2hfZnVuY3Rpb24oc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJICAgICAgIGVudW0gZW5hX2FkbWluX2hhc2hfZnVuY3Rpb25zIGZ1bmMsCisJCQkgICAgICAgY29uc3QgdTggKmtleSwgdTE2IGtleV9sZW4sIHUzMiBpbml0X3ZhbCkKK3sKKwlzdHJ1Y3QgZW5hX3JzcyAqcnNzID0gJmVuYV9kZXYtPnJzczsKKwlzdHJ1Y3QgZW5hX2FkbWluX2dldF9mZWF0X3Jlc3AgZ2V0X3Jlc3A7CisJc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX3Jzc19mbG93X2hhc2hfY29udHJvbCAqaGFzaF9rZXkgPQorCQlyc3MtPmhhc2hfa2V5OworCWludCByYzsKKworCS8qIE1ha2Ugc3VyZSBzaXplIGlzIGEgbXVsdCBvZiBEV3MgKi8KKwlpZiAodW5saWtlbHkoa2V5X2xlbiAmIDB4MykpCisJCXJldHVybiAtRUlOVkFMOworCisJcmMgPSBlbmFfY29tX2dldF9mZWF0dXJlX2V4KGVuYV9kZXYsICZnZXRfcmVzcCwKKwkJCQkgICAgRU5BX0FETUlOX1JTU19IQVNIX0ZVTkNUSU9OLAorCQkJCSAgICByc3MtPmhhc2hfa2V5X2RtYV9hZGRyLAorCQkJCSAgICBzaXplb2YoKnJzcy0+aGFzaF9rZXkpKTsKKwlpZiAodW5saWtlbHkocmMpKQorCQlyZXR1cm4gcmM7CisKKwlpZiAoISgoMSA8PCBmdW5jKSAmIGdldF9yZXNwLnUuZmxvd19oYXNoX2Z1bmMuc3VwcG9ydGVkX2Z1bmMpKSB7CisJCXByX2VycigiRmxvdyBoYXNoIGZ1bmN0aW9uICVkIGlzbid0IHN1cHBvcnRlZFxuIiwgZnVuYyk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJc3dpdGNoIChmdW5jKSB7CisJY2FzZSBFTkFfQURNSU5fVE9FUExJVFo6CisJCWlmIChrZXlfbGVuID4gc2l6ZW9mKGhhc2hfa2V5LT5rZXkpKSB7CisJCQlwcl9lcnIoImtleSBsZW4gKCVodSkgaXMgYmlnZ2VyIHRoYW4gdGhlIG1heCBzdXBwb3J0ZWQgKCV6dSlcbiIsCisJCQkgICAgICAga2V5X2xlbiwgc2l6ZW9mKGhhc2hfa2V5LT5rZXkpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJbWVtY3B5KGhhc2hfa2V5LT5rZXksIGtleSwga2V5X2xlbik7CisJCXJzcy0+aGFzaF9pbml0X3ZhbCA9IGluaXRfdmFsOworCQloYXNoX2tleS0+a2V5c19udW0gPSBrZXlfbGVuID4+IDI7CisJCWJyZWFrOworCWNhc2UgRU5BX0FETUlOX0NSQzMyOgorCQlyc3MtPmhhc2hfaW5pdF92YWwgPSBpbml0X3ZhbDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCJJbnZhbGlkIGhhc2ggZnVuY3Rpb24gKCVkKVxuIiwgZnVuYyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJjID0gZW5hX2NvbV9zZXRfaGFzaF9mdW5jdGlvbihlbmFfZGV2KTsKKworCS8qIFJlc3RvcmUgdGhlIG9sZCBmdW5jdGlvbiAqLworCWlmICh1bmxpa2VseShyYykpCisJCWVuYV9jb21fZ2V0X2hhc2hfZnVuY3Rpb24oZW5hX2RldiwgTlVMTCwgTlVMTCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBlbmFfY29tX2dldF9oYXNoX2Z1bmN0aW9uKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCSAgICAgIGVudW0gZW5hX2FkbWluX2hhc2hfZnVuY3Rpb25zICpmdW5jLAorCQkJICAgICAgdTggKmtleSkKK3sKKwlzdHJ1Y3QgZW5hX3JzcyAqcnNzID0gJmVuYV9kZXYtPnJzczsKKwlzdHJ1Y3QgZW5hX2FkbWluX2dldF9mZWF0X3Jlc3AgZ2V0X3Jlc3A7CisJc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX3Jzc19mbG93X2hhc2hfY29udHJvbCAqaGFzaF9rZXkgPQorCQlyc3MtPmhhc2hfa2V5OworCWludCByYzsKKworCXJjID0gZW5hX2NvbV9nZXRfZmVhdHVyZV9leChlbmFfZGV2LCAmZ2V0X3Jlc3AsCisJCQkJICAgIEVOQV9BRE1JTl9SU1NfSEFTSF9GVU5DVElPTiwKKwkJCQkgICAgcnNzLT5oYXNoX2tleV9kbWFfYWRkciwKKwkJCQkgICAgc2l6ZW9mKCpyc3MtPmhhc2hfa2V5KSk7CisJaWYgKHVubGlrZWx5KHJjKSkKKwkJcmV0dXJuIHJjOworCisJcnNzLT5oYXNoX2Z1bmMgPSBnZXRfcmVzcC51LmZsb3dfaGFzaF9mdW5jLnNlbGVjdGVkX2Z1bmM7CisJaWYgKGZ1bmMpCisJCSpmdW5jID0gcnNzLT5oYXNoX2Z1bmM7CisKKwlpZiAoa2V5KQorCQltZW1jcHkoa2V5LCBoYXNoX2tleS0+a2V5LCAoc2l6ZV90KShoYXNoX2tleS0+a2V5c19udW0pIDw8IDIpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBlbmFfY29tX2dldF9oYXNoX2N0cmwoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJICBlbnVtIGVuYV9hZG1pbl9mbG93X2hhc2hfcHJvdG8gcHJvdG8sCisJCQkgIHUxNiAqZmllbGRzKQoreworCXN0cnVjdCBlbmFfcnNzICpyc3MgPSAmZW5hX2Rldi0+cnNzOworCXN0cnVjdCBlbmFfYWRtaW5fZ2V0X2ZlYXRfcmVzcCBnZXRfcmVzcDsKKwlpbnQgcmM7CisKKwlyYyA9IGVuYV9jb21fZ2V0X2ZlYXR1cmVfZXgoZW5hX2RldiwgJmdldF9yZXNwLAorCQkJCSAgICBFTkFfQURNSU5fUlNTX0hBU0hfSU5QVVQsCisJCQkJICAgIHJzcy0+aGFzaF9jdHJsX2RtYV9hZGRyLAorCQkJCSAgICBzaXplb2YoKnJzcy0+aGFzaF9jdHJsKSk7CisJaWYgKHVubGlrZWx5KHJjKSkKKwkJcmV0dXJuIHJjOworCisJaWYgKGZpZWxkcykKKwkJKmZpZWxkcyA9IHJzcy0+aGFzaF9jdHJsLT5zZWxlY3RlZF9maWVsZHNbcHJvdG9dLmZpZWxkczsKKworCXJldHVybiAwOworfQorCitpbnQgZW5hX2NvbV9zZXRfaGFzaF9jdHJsKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqYWRtaW5fcXVldWUgPSAmZW5hX2Rldi0+YWRtaW5fcXVldWU7CisJc3RydWN0IGVuYV9yc3MgKnJzcyA9ICZlbmFfZGV2LT5yc3M7CisJc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX3Jzc19oYXNoX2NvbnRyb2wgKmhhc2hfY3RybCA9IHJzcy0+aGFzaF9jdHJsOworCXN0cnVjdCBlbmFfYWRtaW5fc2V0X2ZlYXRfY21kIGNtZDsKKwlzdHJ1Y3QgZW5hX2FkbWluX3NldF9mZWF0X3Jlc3AgcmVzcDsKKwlpbnQgcmV0OworCisJaWYgKCFlbmFfY29tX2NoZWNrX3N1cHBvcnRlZF9mZWF0dXJlX2lkKGVuYV9kZXYsCisJCQkJCQlFTkFfQURNSU5fUlNTX0hBU0hfSU5QVVQpKSB7CisJCXByX2luZm8oIkZlYXR1cmUgJWQgaXNuJ3Qgc3VwcG9ydGVkXG4iLCBFTkFfQURNSU5fUlNTX0hBU0hfSU5QVVQpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCW1lbXNldCgmY21kLCAweDAsIHNpemVvZihjbWQpKTsKKworCWNtZC5hcV9jb21tb25fZGVzY3JpcHRvci5vcGNvZGUgPSBFTkFfQURNSU5fU0VUX0ZFQVRVUkU7CisJY21kLmFxX2NvbW1vbl9kZXNjcmlwdG9yLmZsYWdzID0KKwkJRU5BX0FETUlOX0FRX0NPTU1PTl9ERVNDX0NUUkxfREFUQV9JTkRJUkVDVF9NQVNLOworCWNtZC5mZWF0X2NvbW1vbi5mZWF0dXJlX2lkID0gRU5BX0FETUlOX1JTU19IQVNIX0lOUFVUOworCWNtZC51LmZsb3dfaGFzaF9pbnB1dC5lbmFibGVkX2lucHV0X3NvcnQgPQorCQlFTkFfQURNSU5fRkVBVFVSRV9SU1NfRkxPV19IQVNIX0lOUFVUX0wzX1NPUlRfTUFTSyB8CisJCUVOQV9BRE1JTl9GRUFUVVJFX1JTU19GTE9XX0hBU0hfSU5QVVRfTDRfU09SVF9NQVNLOworCisJcmV0ID0gZW5hX2NvbV9tZW1fYWRkcl9zZXQoZW5hX2RldiwKKwkJCQkgICAmY21kLmNvbnRyb2xfYnVmZmVyLmFkZHJlc3MsCisJCQkJICAgcnNzLT5oYXNoX2N0cmxfZG1hX2FkZHIpOworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCXByX2VycigibWVtb3J5IGFkZHJlc3Mgc2V0IGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCWNtZC5jb250cm9sX2J1ZmZlci5sZW5ndGggPSBzaXplb2YoKmhhc2hfY3RybCk7CisKKwlyZXQgPSBlbmFfY29tX2V4ZWN1dGVfYWRtaW5fY29tbWFuZChhZG1pbl9xdWV1ZSwKKwkJCQkJICAgIChzdHJ1Y3QgZW5hX2FkbWluX2FxX2VudHJ5ICopJmNtZCwKKwkJCQkJICAgIHNpemVvZihjbWQpLAorCQkJCQkgICAgKHN0cnVjdCBlbmFfYWRtaW5fYWNxX2VudHJ5ICopJnJlc3AsCisJCQkJCSAgICBzaXplb2YocmVzcCkpOworCWlmICh1bmxpa2VseShyZXQpKQorCQlwcl9lcnIoIkZhaWxlZCB0byBzZXQgaGFzaCBpbnB1dC4gZXJyb3I6ICVkXG4iLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGVuYV9jb21fc2V0X2RlZmF1bHRfaGFzaF9jdHJsKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlzdHJ1Y3QgZW5hX3JzcyAqcnNzID0gJmVuYV9kZXYtPnJzczsKKwlzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfcnNzX2hhc2hfY29udHJvbCAqaGFzaF9jdHJsID0KKwkJcnNzLT5oYXNoX2N0cmw7CisJdTE2IGF2YWlsYWJsZV9maWVsZHMgPSAwOworCWludCByYywgaTsKKworCS8qIEdldCB0aGUgc3VwcG9ydGVkIGhhc2ggaW5wdXQgKi8KKwlyYyA9IGVuYV9jb21fZ2V0X2hhc2hfY3RybChlbmFfZGV2LCAwLCBOVUxMKTsKKwlpZiAodW5saWtlbHkocmMpKQorCQlyZXR1cm4gcmM7CisKKwloYXNoX2N0cmwtPnNlbGVjdGVkX2ZpZWxkc1tFTkFfQURNSU5fUlNTX1RDUDRdLmZpZWxkcyA9CisJCUVOQV9BRE1JTl9SU1NfTDNfU0EgfCBFTkFfQURNSU5fUlNTX0wzX0RBIHwKKwkJRU5BX0FETUlOX1JTU19MNF9EUCB8IEVOQV9BRE1JTl9SU1NfTDRfU1A7CisKKwloYXNoX2N0cmwtPnNlbGVjdGVkX2ZpZWxkc1tFTkFfQURNSU5fUlNTX1VEUDRdLmZpZWxkcyA9CisJCUVOQV9BRE1JTl9SU1NfTDNfU0EgfCBFTkFfQURNSU5fUlNTX0wzX0RBIHwKKwkJRU5BX0FETUlOX1JTU19MNF9EUCB8IEVOQV9BRE1JTl9SU1NfTDRfU1A7CisKKwloYXNoX2N0cmwtPnNlbGVjdGVkX2ZpZWxkc1tFTkFfQURNSU5fUlNTX1RDUDZdLmZpZWxkcyA9CisJCUVOQV9BRE1JTl9SU1NfTDNfU0EgfCBFTkFfQURNSU5fUlNTX0wzX0RBIHwKKwkJRU5BX0FETUlOX1JTU19MNF9EUCB8IEVOQV9BRE1JTl9SU1NfTDRfU1A7CisKKwloYXNoX2N0cmwtPnNlbGVjdGVkX2ZpZWxkc1tFTkFfQURNSU5fUlNTX1VEUDZdLmZpZWxkcyA9CisJCUVOQV9BRE1JTl9SU1NfTDNfU0EgfCBFTkFfQURNSU5fUlNTX0wzX0RBIHwKKwkJRU5BX0FETUlOX1JTU19MNF9EUCB8IEVOQV9BRE1JTl9SU1NfTDRfU1A7CisKKwloYXNoX2N0cmwtPnNlbGVjdGVkX2ZpZWxkc1tFTkFfQURNSU5fUlNTX0lQNF0uZmllbGRzID0KKwkJRU5BX0FETUlOX1JTU19MM19TQSB8IEVOQV9BRE1JTl9SU1NfTDNfREE7CisKKwloYXNoX2N0cmwtPnNlbGVjdGVkX2ZpZWxkc1tFTkFfQURNSU5fUlNTX0lQNl0uZmllbGRzID0KKwkJRU5BX0FETUlOX1JTU19MM19TQSB8IEVOQV9BRE1JTl9SU1NfTDNfREE7CisKKwloYXNoX2N0cmwtPnNlbGVjdGVkX2ZpZWxkc1tFTkFfQURNSU5fUlNTX0lQNF9GUkFHXS5maWVsZHMgPQorCQlFTkFfQURNSU5fUlNTX0wzX1NBIHwgRU5BX0FETUlOX1JTU19MM19EQTsKKworCWhhc2hfY3RybC0+c2VsZWN0ZWRfZmllbGRzW0VOQV9BRE1JTl9SU1NfSVA0X0ZSQUddLmZpZWxkcyA9CisJCUVOQV9BRE1JTl9SU1NfTDJfREEgfCBFTkFfQURNSU5fUlNTX0wyX1NBOworCisJZm9yIChpID0gMDsgaSA8IEVOQV9BRE1JTl9SU1NfUFJPVE9fTlVNOyBpKyspIHsKKwkJYXZhaWxhYmxlX2ZpZWxkcyA9IGhhc2hfY3RybC0+c2VsZWN0ZWRfZmllbGRzW2ldLmZpZWxkcyAmCisJCQkJaGFzaF9jdHJsLT5zdXBwb3J0ZWRfZmllbGRzW2ldLmZpZWxkczsKKwkJaWYgKGF2YWlsYWJsZV9maWVsZHMgIT0gaGFzaF9jdHJsLT5zZWxlY3RlZF9maWVsZHNbaV0uZmllbGRzKSB7CisJCQlwcl9lcnIoImhhc2ggY29udHJvbCBkb2Vzbid0IHN1cHBvcnQgYWxsIHRoZSBkZXNpcmUgY29uZmlndXJhdGlvbi4gcHJvdG8gJXggc3VwcG9ydGVkICV4IHNlbGVjdGVkICV4XG4iLAorCQkJICAgICAgIGksIGhhc2hfY3RybC0+c3VwcG9ydGVkX2ZpZWxkc1tpXS5maWVsZHMsCisJCQkgICAgICAgaGFzaF9jdHJsLT5zZWxlY3RlZF9maWVsZHNbaV0uZmllbGRzKTsKKwkJCXJldHVybiAtRVBFUk07CisJCX0KKwl9CisKKwlyYyA9IGVuYV9jb21fc2V0X2hhc2hfY3RybChlbmFfZGV2KTsKKworCS8qIEluIGNhc2Ugb2YgZmFpbHVyZSwgcmVzdG9yZSB0aGUgb2xkIGhhc2ggY3RybCAqLworCWlmICh1bmxpa2VseShyYykpCisJCWVuYV9jb21fZ2V0X2hhc2hfY3RybChlbmFfZGV2LCAwLCBOVUxMKTsKKworCXJldHVybiByYzsKK30KKworaW50IGVuYV9jb21fZmlsbF9oYXNoX2N0cmwoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJICAgZW51bSBlbmFfYWRtaW5fZmxvd19oYXNoX3Byb3RvIHByb3RvLAorCQkJICAgdTE2IGhhc2hfZmllbGRzKQoreworCXN0cnVjdCBlbmFfcnNzICpyc3MgPSAmZW5hX2Rldi0+cnNzOworCXN0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9yc3NfaGFzaF9jb250cm9sICpoYXNoX2N0cmwgPSByc3MtPmhhc2hfY3RybDsKKwl1MTYgc3VwcG9ydGVkX2ZpZWxkczsKKwlpbnQgcmM7CisKKwlpZiAocHJvdG8gPj0gRU5BX0FETUlOX1JTU19QUk9UT19OVU0pIHsKKwkJcHJfZXJyKCJJbnZhbGlkIHByb3RvIG51bSAoJXUpXG4iLCBwcm90byk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEdldCB0aGUgY3RybCB0YWJsZSAqLworCXJjID0gZW5hX2NvbV9nZXRfaGFzaF9jdHJsKGVuYV9kZXYsIHByb3RvLCBOVUxMKTsKKwlpZiAodW5saWtlbHkocmMpKQorCQlyZXR1cm4gcmM7CisKKwkvKiBNYWtlIHN1cmUgYWxsIHRoZSBmaWVsZHMgYXJlIHN1cHBvcnRlZCAqLworCXN1cHBvcnRlZF9maWVsZHMgPSBoYXNoX2N0cmwtPnN1cHBvcnRlZF9maWVsZHNbcHJvdG9dLmZpZWxkczsKKwlpZiAoKGhhc2hfZmllbGRzICYgc3VwcG9ydGVkX2ZpZWxkcykgIT0gaGFzaF9maWVsZHMpIHsKKwkJcHJfZXJyKCJwcm90byAlZCBkb2Vzbid0IHN1cHBvcnQgdGhlIHJlcXVpcmVkIGZpZWxkcyAleC4gc3VwcG9ydHMgb25seTogJXhcbiIsCisJCSAgICAgICBwcm90bywgaGFzaF9maWVsZHMsIHN1cHBvcnRlZF9maWVsZHMpOworCX0KKworCWhhc2hfY3RybC0+c2VsZWN0ZWRfZmllbGRzW3Byb3RvXS5maWVsZHMgPSBoYXNoX2ZpZWxkczsKKworCXJjID0gZW5hX2NvbV9zZXRfaGFzaF9jdHJsKGVuYV9kZXYpOworCisJLyogSW4gY2FzZSBvZiBmYWlsdXJlLCByZXN0b3JlIHRoZSBvbGQgaGFzaCBjdHJsICovCisJaWYgKHVubGlrZWx5KHJjKSkKKwkJZW5hX2NvbV9nZXRfaGFzaF9jdHJsKGVuYV9kZXYsIDAsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBlbmFfY29tX2luZGlyZWN0X3RhYmxlX2ZpbGxfZW50cnkoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJCSAgICAgIHUxNiBlbnRyeV9pZHgsIHUxNiBlbnRyeV92YWx1ZSkKK3sKKwlzdHJ1Y3QgZW5hX3JzcyAqcnNzID0gJmVuYV9kZXYtPnJzczsKKworCWlmICh1bmxpa2VseShlbnRyeV9pZHggPj0gKDEgPDwgcnNzLT50YmxfbG9nX3NpemUpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodW5saWtlbHkoKGVudHJ5X3ZhbHVlID4gRU5BX1RPVEFMX05VTV9RVUVVRVMpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyc3MtPmhvc3RfcnNzX2luZF90YmxbZW50cnlfaWR4XSA9IGVudHJ5X3ZhbHVlOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBlbmFfY29tX2luZGlyZWN0X3RhYmxlX3NldChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKmFkbWluX3F1ZXVlID0gJmVuYV9kZXYtPmFkbWluX3F1ZXVlOworCXN0cnVjdCBlbmFfcnNzICpyc3MgPSAmZW5hX2Rldi0+cnNzOworCXN0cnVjdCBlbmFfYWRtaW5fc2V0X2ZlYXRfY21kIGNtZDsKKwlzdHJ1Y3QgZW5hX2FkbWluX3NldF9mZWF0X3Jlc3AgcmVzcDsKKwlpbnQgcmV0OworCisJaWYgKCFlbmFfY29tX2NoZWNrX3N1cHBvcnRlZF9mZWF0dXJlX2lkKAorCQkgICAgZW5hX2RldiwgRU5BX0FETUlOX1JTU19SRURJUkVDVElPTl9UQUJMRV9DT05GSUcpKSB7CisJCXByX2luZm8oIkZlYXR1cmUgJWQgaXNuJ3Qgc3VwcG9ydGVkXG4iLAorCQkJRU5BX0FETUlOX1JTU19SRURJUkVDVElPTl9UQUJMRV9DT05GSUcpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCXJldCA9IGVuYV9jb21faW5kX3RibF9jb252ZXJ0X3RvX2RldmljZShlbmFfZGV2KTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiRmFpbGVkIHRvIGNvbnZlcnQgaG9zdCBpbmRpcmVjdGlvbiB0YWJsZSB0byBkZXZpY2UgdGFibGVcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCW1lbXNldCgmY21kLCAweDAsIHNpemVvZihjbWQpKTsKKworCWNtZC5hcV9jb21tb25fZGVzY3JpcHRvci5vcGNvZGUgPSBFTkFfQURNSU5fU0VUX0ZFQVRVUkU7CisJY21kLmFxX2NvbW1vbl9kZXNjcmlwdG9yLmZsYWdzID0KKwkJRU5BX0FETUlOX0FRX0NPTU1PTl9ERVNDX0NUUkxfREFUQV9JTkRJUkVDVF9NQVNLOworCWNtZC5mZWF0X2NvbW1vbi5mZWF0dXJlX2lkID0gRU5BX0FETUlOX1JTU19SRURJUkVDVElPTl9UQUJMRV9DT05GSUc7CisJY21kLnUuaW5kX3RhYmxlLnNpemUgPSByc3MtPnRibF9sb2dfc2l6ZTsKKwljbWQudS5pbmRfdGFibGUuaW5saW5lX2luZGV4ID0gMHhGRkZGRkZGRjsKKworCXJldCA9IGVuYV9jb21fbWVtX2FkZHJfc2V0KGVuYV9kZXYsCisJCQkJICAgJmNtZC5jb250cm9sX2J1ZmZlci5hZGRyZXNzLAorCQkJCSAgIHJzcy0+cnNzX2luZF90YmxfZG1hX2FkZHIpOworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCXByX2VycigibWVtb3J5IGFkZHJlc3Mgc2V0IGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJY21kLmNvbnRyb2xfYnVmZmVyLmxlbmd0aCA9ICgxVUxMIDw8IHJzcy0+dGJsX2xvZ19zaXplKSAqCisJCXNpemVvZihzdHJ1Y3QgZW5hX2FkbWluX3Jzc19pbmRfdGFibGVfZW50cnkpOworCisJcmV0ID0gZW5hX2NvbV9leGVjdXRlX2FkbWluX2NvbW1hbmQoYWRtaW5fcXVldWUsCisJCQkJCSAgICAoc3RydWN0IGVuYV9hZG1pbl9hcV9lbnRyeSAqKSZjbWQsCisJCQkJCSAgICBzaXplb2YoY21kKSwKKwkJCQkJICAgIChzdHJ1Y3QgZW5hX2FkbWluX2FjcV9lbnRyeSAqKSZyZXNwLAorCQkJCQkgICAgc2l6ZW9mKHJlc3ApKTsKKworCWlmICh1bmxpa2VseShyZXQpKQorCQlwcl9lcnIoIkZhaWxlZCB0byBzZXQgaW5kaXJlY3QgdGFibGUuIGVycm9yOiAlZFxuIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBlbmFfY29tX2luZGlyZWN0X3RhYmxlX2dldChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsIHUzMiAqaW5kX3RibCkKK3sKKwlzdHJ1Y3QgZW5hX3JzcyAqcnNzID0gJmVuYV9kZXYtPnJzczsKKwlzdHJ1Y3QgZW5hX2FkbWluX2dldF9mZWF0X3Jlc3AgZ2V0X3Jlc3A7CisJdTMyIHRibF9zaXplOworCWludCBpLCByYzsKKworCXRibF9zaXplID0gKDFVTEwgPDwgcnNzLT50YmxfbG9nX3NpemUpICoKKwkJc2l6ZW9mKHN0cnVjdCBlbmFfYWRtaW5fcnNzX2luZF90YWJsZV9lbnRyeSk7CisKKwlyYyA9IGVuYV9jb21fZ2V0X2ZlYXR1cmVfZXgoZW5hX2RldiwgJmdldF9yZXNwLAorCQkJCSAgICBFTkFfQURNSU5fUlNTX1JFRElSRUNUSU9OX1RBQkxFX0NPTkZJRywKKwkJCQkgICAgcnNzLT5yc3NfaW5kX3RibF9kbWFfYWRkciwKKwkJCQkgICAgdGJsX3NpemUpOworCWlmICh1bmxpa2VseShyYykpCisJCXJldHVybiByYzsKKworCWlmICghaW5kX3RibCkKKwkJcmV0dXJuIDA7CisKKwlyYyA9IGVuYV9jb21faW5kX3RibF9jb252ZXJ0X2Zyb21fZGV2aWNlKGVuYV9kZXYpOworCWlmICh1bmxpa2VseShyYykpCisJCXJldHVybiByYzsKKworCWZvciAoaSA9IDA7IGkgPCAoMSA8PCByc3MtPnRibF9sb2dfc2l6ZSk7IGkrKykKKwkJaW5kX3RibFtpXSA9IHJzcy0+aG9zdF9yc3NfaW5kX3RibFtpXTsKKworCXJldHVybiAwOworfQorCitpbnQgZW5hX2NvbV9yc3NfaW5pdChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsIHUxNiBpbmRyX3RibF9sb2dfc2l6ZSkKK3sKKwlpbnQgcmM7CisKKwltZW1zZXQoJmVuYV9kZXYtPnJzcywgMHgwLCBzaXplb2YoZW5hX2Rldi0+cnNzKSk7CisKKwlyYyA9IGVuYV9jb21faW5kaXJlY3RfdGFibGVfYWxsb2NhdGUoZW5hX2RldiwgaW5kcl90YmxfbG9nX3NpemUpOworCWlmICh1bmxpa2VseShyYykpCisJCWdvdG8gZXJyX2luZHJfdGJsOworCisJcmMgPSBlbmFfY29tX2hhc2hfa2V5X2FsbG9jYXRlKGVuYV9kZXYpOworCWlmICh1bmxpa2VseShyYykpCisJCWdvdG8gZXJyX2hhc2hfa2V5OworCisJcmMgPSBlbmFfY29tX2hhc2hfY3RybF9pbml0KGVuYV9kZXYpOworCWlmICh1bmxpa2VseShyYykpCisJCWdvdG8gZXJyX2hhc2hfY3RybDsKKworCXJldHVybiAwOworCitlcnJfaGFzaF9jdHJsOgorCWVuYV9jb21faGFzaF9rZXlfZGVzdHJveShlbmFfZGV2KTsKK2Vycl9oYXNoX2tleToKKwllbmFfY29tX2luZGlyZWN0X3RhYmxlX2Rlc3Ryb3koZW5hX2Rldik7CitlcnJfaW5kcl90Ymw6CisKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQgZW5hX2NvbV9yc3NfZGVzdHJveShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJZW5hX2NvbV9pbmRpcmVjdF90YWJsZV9kZXN0cm95KGVuYV9kZXYpOworCWVuYV9jb21faGFzaF9rZXlfZGVzdHJveShlbmFfZGV2KTsKKwllbmFfY29tX2hhc2hfY3RybF9kZXN0cm95KGVuYV9kZXYpOworCisJbWVtc2V0KCZlbmFfZGV2LT5yc3MsIDB4MCwgc2l6ZW9mKGVuYV9kZXYtPnJzcykpOworfQorCitpbnQgZW5hX2NvbV9hbGxvY2F0ZV9ob3N0X2luZm8oc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXN0cnVjdCBlbmFfaG9zdF9hdHRyaWJ1dGUgKmhvc3RfYXR0ciA9ICZlbmFfZGV2LT5ob3N0X2F0dHI7CisKKwlob3N0X2F0dHItPmhvc3RfaW5mbyA9CisJCWRtYV96YWxsb2NfY29oZXJlbnQoZW5hX2Rldi0+ZG1hZGV2LCBTWl80SywKKwkJCQkgICAgJmhvc3RfYXR0ci0+aG9zdF9pbmZvX2RtYV9hZGRyLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIWhvc3RfYXR0ci0+aG9zdF9pbmZvKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKworaW50IGVuYV9jb21fYWxsb2NhdGVfZGVidWdfYXJlYShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkJdTMyIGRlYnVnX2FyZWFfc2l6ZSkKK3sKKwlzdHJ1Y3QgZW5hX2hvc3RfYXR0cmlidXRlICpob3N0X2F0dHIgPSAmZW5hX2Rldi0+aG9zdF9hdHRyOworCisJaG9zdF9hdHRyLT5kZWJ1Z19hcmVhX3ZpcnRfYWRkciA9CisJCWRtYV96YWxsb2NfY29oZXJlbnQoZW5hX2Rldi0+ZG1hZGV2LCBkZWJ1Z19hcmVhX3NpemUsCisJCQkJICAgICZob3N0X2F0dHItPmRlYnVnX2FyZWFfZG1hX2FkZHIsIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseSghaG9zdF9hdHRyLT5kZWJ1Z19hcmVhX3ZpcnRfYWRkcikpIHsKKwkJaG9zdF9hdHRyLT5kZWJ1Z19hcmVhX3NpemUgPSAwOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlob3N0X2F0dHItPmRlYnVnX2FyZWFfc2l6ZSA9IGRlYnVnX2FyZWFfc2l6ZTsKKworCXJldHVybiAwOworfQorCit2b2lkIGVuYV9jb21fZGVsZXRlX2hvc3RfaW5mbyhzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJc3RydWN0IGVuYV9ob3N0X2F0dHJpYnV0ZSAqaG9zdF9hdHRyID0gJmVuYV9kZXYtPmhvc3RfYXR0cjsKKworCWlmIChob3N0X2F0dHItPmhvc3RfaW5mbykgeworCQlkbWFfZnJlZV9jb2hlcmVudChlbmFfZGV2LT5kbWFkZXYsIFNaXzRLLCBob3N0X2F0dHItPmhvc3RfaW5mbywKKwkJCQkgIGhvc3RfYXR0ci0+aG9zdF9pbmZvX2RtYV9hZGRyKTsKKwkJaG9zdF9hdHRyLT5ob3N0X2luZm8gPSBOVUxMOworCX0KK30KKwordm9pZCBlbmFfY29tX2RlbGV0ZV9kZWJ1Z19hcmVhKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlzdHJ1Y3QgZW5hX2hvc3RfYXR0cmlidXRlICpob3N0X2F0dHIgPSAmZW5hX2Rldi0+aG9zdF9hdHRyOworCisJaWYgKGhvc3RfYXR0ci0+ZGVidWdfYXJlYV92aXJ0X2FkZHIpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoZW5hX2Rldi0+ZG1hZGV2LCBob3N0X2F0dHItPmRlYnVnX2FyZWFfc2l6ZSwKKwkJCQkgIGhvc3RfYXR0ci0+ZGVidWdfYXJlYV92aXJ0X2FkZHIsCisJCQkJICBob3N0X2F0dHItPmRlYnVnX2FyZWFfZG1hX2FkZHIpOworCQlob3N0X2F0dHItPmRlYnVnX2FyZWFfdmlydF9hZGRyID0gTlVMTDsKKwl9Cit9CisKK2ludCBlbmFfY29tX3NldF9ob3N0X2F0dHJpYnV0ZXMoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXN0cnVjdCBlbmFfaG9zdF9hdHRyaWJ1dGUgKmhvc3RfYXR0ciA9ICZlbmFfZGV2LT5ob3N0X2F0dHI7CisJc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKmFkbWluX3F1ZXVlOworCXN0cnVjdCBlbmFfYWRtaW5fc2V0X2ZlYXRfY21kIGNtZDsKKwlzdHJ1Y3QgZW5hX2FkbWluX3NldF9mZWF0X3Jlc3AgcmVzcDsKKworCWludCByZXQ7CisKKwlpZiAoIWVuYV9jb21fY2hlY2tfc3VwcG9ydGVkX2ZlYXR1cmVfaWQoZW5hX2RldiwKKwkJCQkJCUVOQV9BRE1JTl9IT1NUX0FUVFJfQ09ORklHKSkgeworCQlwcl93YXJuKCJTZXQgaG9zdCBhdHRyaWJ1dGUgaXNuJ3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwltZW1zZXQoJmNtZCwgMHgwLCBzaXplb2YoY21kKSk7CisJYWRtaW5fcXVldWUgPSAmZW5hX2Rldi0+YWRtaW5fcXVldWU7CisKKwljbWQuYXFfY29tbW9uX2Rlc2NyaXB0b3Iub3Bjb2RlID0gRU5BX0FETUlOX1NFVF9GRUFUVVJFOworCWNtZC5mZWF0X2NvbW1vbi5mZWF0dXJlX2lkID0gRU5BX0FETUlOX0hPU1RfQVRUUl9DT05GSUc7CisKKwlyZXQgPSBlbmFfY29tX21lbV9hZGRyX3NldChlbmFfZGV2LAorCQkJCSAgICZjbWQudS5ob3N0X2F0dHIuZGVidWdfYmEsCisJCQkJICAgaG9zdF9hdHRyLT5kZWJ1Z19hcmVhX2RtYV9hZGRyKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlwcl9lcnIoIm1lbW9yeSBhZGRyZXNzIHNldCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGVuYV9jb21fbWVtX2FkZHJfc2V0KGVuYV9kZXYsCisJCQkJICAgJmNtZC51Lmhvc3RfYXR0ci5vc19pbmZvX2JhLAorCQkJCSAgIGhvc3RfYXR0ci0+aG9zdF9pbmZvX2RtYV9hZGRyKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlwcl9lcnIoIm1lbW9yeSBhZGRyZXNzIHNldCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWNtZC51Lmhvc3RfYXR0ci5kZWJ1Z19hcmVhX3NpemUgPSBob3N0X2F0dHItPmRlYnVnX2FyZWFfc2l6ZTsKKworCXJldCA9IGVuYV9jb21fZXhlY3V0ZV9hZG1pbl9jb21tYW5kKGFkbWluX3F1ZXVlLAorCQkJCQkgICAgKHN0cnVjdCBlbmFfYWRtaW5fYXFfZW50cnkgKikmY21kLAorCQkJCQkgICAgc2l6ZW9mKGNtZCksCisJCQkJCSAgICAoc3RydWN0IGVuYV9hZG1pbl9hY3FfZW50cnkgKikmcmVzcCwKKwkJCQkJICAgIHNpemVvZihyZXNwKSk7CisKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJcHJfZXJyKCJGYWlsZWQgdG8gc2V0IGhvc3QgYXR0cmlidXRlczogJWRcbiIsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBJbnRlcnJ1cHQgbW9kZXJhdGlvbiAqLworYm9vbCBlbmFfY29tX2ludGVycnVwdF9tb2RlcmF0aW9uX3N1cHBvcnRlZChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJcmV0dXJuIGVuYV9jb21fY2hlY2tfc3VwcG9ydGVkX2ZlYXR1cmVfaWQoZW5hX2RldiwKKwkJCQkJCSAgRU5BX0FETUlOX0lOVEVSUlVQVF9NT0RFUkFUSU9OKTsKK30KKworaW50IGVuYV9jb21fdXBkYXRlX25vbmFkYXB0aXZlX21vZGVyYXRpb25faW50ZXJ2YWxfdHgoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJCQkJICAgICAgdTMyIHR4X2NvYWxlc2NlX3VzZWNzKQoreworCWlmICghZW5hX2Rldi0+aW50cl9kZWxheV9yZXNvbHV0aW9uKSB7CisJCXByX2VycigiSWxsZWdhbCBpbnRlcnJ1cHQgZGVsYXkgZ3JhbnVsYXJpdHkgdmFsdWVcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwllbmFfZGV2LT5pbnRyX21vZGVyX3R4X2ludGVydmFsID0gdHhfY29hbGVzY2VfdXNlY3MgLworCQllbmFfZGV2LT5pbnRyX2RlbGF5X3Jlc29sdXRpb247CisKKwlyZXR1cm4gMDsKK30KKworaW50IGVuYV9jb21fdXBkYXRlX25vbmFkYXB0aXZlX21vZGVyYXRpb25faW50ZXJ2YWxfcngoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJCQkJICAgICAgdTMyIHJ4X2NvYWxlc2NlX3VzZWNzKQoreworCWlmICghZW5hX2Rldi0+aW50cl9kZWxheV9yZXNvbHV0aW9uKSB7CisJCXByX2VycigiSWxsZWdhbCBpbnRlcnJ1cHQgZGVsYXkgZ3JhbnVsYXJpdHkgdmFsdWVcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwkvKiBXZSB1c2UgTE9XRVNUIGVudHJ5IG9mIG1vZGVyYXRpb24gdGFibGUgZm9yIHN0b3JpbmcKKwkgKiBub25hZGFwdGl2ZSBpbnRlcnJ1cHQgY29hbGVzY2luZyB2YWx1ZXMKKwkgKi8KKwllbmFfZGV2LT5pbnRyX21vZGVyX3RibFtFTkFfSU5UUl9NT0RFUl9MT1dFU1RdLmludHJfbW9kZXJfaW50ZXJ2YWwgPQorCQlyeF9jb2FsZXNjZV91c2VjcyAvIGVuYV9kZXYtPmludHJfZGVsYXlfcmVzb2x1dGlvbjsKKworCXJldHVybiAwOworfQorCit2b2lkIGVuYV9jb21fZGVzdHJveV9pbnRlcnJ1cHRfbW9kZXJhdGlvbihzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJaWYgKGVuYV9kZXYtPmludHJfbW9kZXJfdGJsKQorCQlkZXZtX2tmcmVlKGVuYV9kZXYtPmRtYWRldiwgZW5hX2Rldi0+aW50cl9tb2Rlcl90YmwpOworCWVuYV9kZXYtPmludHJfbW9kZXJfdGJsID0gTlVMTDsKK30KKworaW50IGVuYV9jb21faW5pdF9pbnRlcnJ1cHRfbW9kZXJhdGlvbihzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJc3RydWN0IGVuYV9hZG1pbl9nZXRfZmVhdF9yZXNwIGdldF9yZXNwOworCXUxNiBkZWxheV9yZXNvbHV0aW9uOworCWludCByYzsKKworCXJjID0gZW5hX2NvbV9nZXRfZmVhdHVyZShlbmFfZGV2LCAmZ2V0X3Jlc3AsCisJCQkJIEVOQV9BRE1JTl9JTlRFUlJVUFRfTU9ERVJBVElPTik7CisKKwlpZiAocmMpIHsKKwkJaWYgKHJjID09IC1FUEVSTSkgeworCQkJcHJfaW5mbygiRmVhdHVyZSAlZCBpc24ndCBzdXBwb3J0ZWRcbiIsCisJCQkJRU5BX0FETUlOX0lOVEVSUlVQVF9NT0RFUkFUSU9OKTsKKwkJCXJjID0gMDsKKwkJfSBlbHNlIHsKKwkJCXByX2VycigiRmFpbGVkIHRvIGdldCBpbnRlcnJ1cHQgbW9kZXJhdGlvbiBhZG1pbiBjbWQuIHJjOiAlZFxuIiwKKwkJCSAgICAgICByYyk7CisJCX0KKworCQkvKiBubyBtb2RlcmF0aW9uIHN1cHBvcnRlZCwgZGlzYWJsZSBhZGFwdGl2ZSBzdXBwb3J0ICovCisJCWVuYV9jb21fZGlzYWJsZV9hZGFwdGl2ZV9tb2RlcmF0aW9uKGVuYV9kZXYpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBlbmFfY29tX2luaXRfaW50ZXJydXB0X21vZGVyYXRpb25fdGFibGUoZW5hX2Rldik7CisJaWYgKHJjKQorCQlnb3RvIGVycjsKKworCS8qIGlmIG1vZGVyYXRpb24gaXMgc3VwcG9ydGVkIGJ5IGRldmljZSB3ZSBzZXQgYWRhcHRpdmUgbW9kZXJhdGlvbiAqLworCWRlbGF5X3Jlc29sdXRpb24gPSBnZXRfcmVzcC51LmludHJfbW9kZXJhdGlvbi5pbnRyX2RlbGF5X3Jlc29sdXRpb247CisJZW5hX2NvbV91cGRhdGVfaW50cl9kZWxheV9yZXNvbHV0aW9uKGVuYV9kZXYsIGRlbGF5X3Jlc29sdXRpb24pOworCWVuYV9jb21fZW5hYmxlX2FkYXB0aXZlX21vZGVyYXRpb24oZW5hX2Rldik7CisKKwlyZXR1cm4gMDsKK2VycjoKKwllbmFfY29tX2Rlc3Ryb3lfaW50ZXJydXB0X21vZGVyYXRpb24oZW5hX2Rldik7CisJcmV0dXJuIHJjOworfQorCit2b2lkIGVuYV9jb21fY29uZmlnX2RlZmF1bHRfaW50ZXJydXB0X21vZGVyYXRpb25fdGFibGUoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXN0cnVjdCBlbmFfaW50cl9tb2Rlcl9lbnRyeSAqaW50cl9tb2Rlcl90YmwgPSBlbmFfZGV2LT5pbnRyX21vZGVyX3RibDsKKworCWlmICghaW50cl9tb2Rlcl90YmwpCisJCXJldHVybjsKKworCWludHJfbW9kZXJfdGJsW0VOQV9JTlRSX01PREVSX0xPV0VTVF0uaW50cl9tb2Rlcl9pbnRlcnZhbCA9CisJCUVOQV9JTlRSX0xPV0VTVF9VU0VDUzsKKwlpbnRyX21vZGVyX3RibFtFTkFfSU5UUl9NT0RFUl9MT1dFU1RdLnBrdHNfcGVyX2ludGVydmFsID0KKwkJRU5BX0lOVFJfTE9XRVNUX1BLVFM7CisJaW50cl9tb2Rlcl90YmxbRU5BX0lOVFJfTU9ERVJfTE9XRVNUXS5ieXRlc19wZXJfaW50ZXJ2YWwgPQorCQlFTkFfSU5UUl9MT1dFU1RfQllURVM7CisKKwlpbnRyX21vZGVyX3RibFtFTkFfSU5UUl9NT0RFUl9MT1ddLmludHJfbW9kZXJfaW50ZXJ2YWwgPQorCQlFTkFfSU5UUl9MT1dfVVNFQ1M7CisJaW50cl9tb2Rlcl90YmxbRU5BX0lOVFJfTU9ERVJfTE9XXS5wa3RzX3Blcl9pbnRlcnZhbCA9CisJCUVOQV9JTlRSX0xPV19QS1RTOworCWludHJfbW9kZXJfdGJsW0VOQV9JTlRSX01PREVSX0xPV10uYnl0ZXNfcGVyX2ludGVydmFsID0KKwkJRU5BX0lOVFJfTE9XX0JZVEVTOworCisJaW50cl9tb2Rlcl90YmxbRU5BX0lOVFJfTU9ERVJfTUlEXS5pbnRyX21vZGVyX2ludGVydmFsID0KKwkJRU5BX0lOVFJfTUlEX1VTRUNTOworCWludHJfbW9kZXJfdGJsW0VOQV9JTlRSX01PREVSX01JRF0ucGt0c19wZXJfaW50ZXJ2YWwgPQorCQlFTkFfSU5UUl9NSURfUEtUUzsKKwlpbnRyX21vZGVyX3RibFtFTkFfSU5UUl9NT0RFUl9NSURdLmJ5dGVzX3Blcl9pbnRlcnZhbCA9CisJCUVOQV9JTlRSX01JRF9CWVRFUzsKKworCWludHJfbW9kZXJfdGJsW0VOQV9JTlRSX01PREVSX0hJR0hdLmludHJfbW9kZXJfaW50ZXJ2YWwgPQorCQlFTkFfSU5UUl9ISUdIX1VTRUNTOworCWludHJfbW9kZXJfdGJsW0VOQV9JTlRSX01PREVSX0hJR0hdLnBrdHNfcGVyX2ludGVydmFsID0KKwkJRU5BX0lOVFJfSElHSF9QS1RTOworCWludHJfbW9kZXJfdGJsW0VOQV9JTlRSX01PREVSX0hJR0hdLmJ5dGVzX3Blcl9pbnRlcnZhbCA9CisJCUVOQV9JTlRSX0hJR0hfQllURVM7CisKKwlpbnRyX21vZGVyX3RibFtFTkFfSU5UUl9NT0RFUl9ISUdIRVNUXS5pbnRyX21vZGVyX2ludGVydmFsID0KKwkJRU5BX0lOVFJfSElHSEVTVF9VU0VDUzsKKwlpbnRyX21vZGVyX3RibFtFTkFfSU5UUl9NT0RFUl9ISUdIRVNUXS5wa3RzX3Blcl9pbnRlcnZhbCA9CisJCUVOQV9JTlRSX0hJR0hFU1RfUEtUUzsKKwlpbnRyX21vZGVyX3RibFtFTkFfSU5UUl9NT0RFUl9ISUdIRVNUXS5ieXRlc19wZXJfaW50ZXJ2YWwgPQorCQlFTkFfSU5UUl9ISUdIRVNUX0JZVEVTOworfQorCit1bnNpZ25lZCBpbnQgZW5hX2NvbV9nZXRfbm9uYWRhcHRpdmVfbW9kZXJhdGlvbl9pbnRlcnZhbF90eChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJcmV0dXJuIGVuYV9kZXYtPmludHJfbW9kZXJfdHhfaW50ZXJ2YWw7Cit9CisKK3Vuc2lnbmVkIGludCBlbmFfY29tX2dldF9ub25hZGFwdGl2ZV9tb2RlcmF0aW9uX2ludGVydmFsX3J4KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlzdHJ1Y3QgZW5hX2ludHJfbW9kZXJfZW50cnkgKmludHJfbW9kZXJfdGJsID0gZW5hX2Rldi0+aW50cl9tb2Rlcl90Ymw7CisKKwlpZiAoaW50cl9tb2Rlcl90YmwpCisJCXJldHVybiBpbnRyX21vZGVyX3RibFtFTkFfSU5UUl9NT0RFUl9MT1dFU1RdLmludHJfbW9kZXJfaW50ZXJ2YWw7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBlbmFfY29tX2luaXRfaW50cl9tb2RlcmF0aW9uX2VudHJ5KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCQkJZW51bSBlbmFfaW50cl9tb2Rlcl9sZXZlbCBsZXZlbCwKKwkJCQkJc3RydWN0IGVuYV9pbnRyX21vZGVyX2VudHJ5ICplbnRyeSkKK3sKKwlzdHJ1Y3QgZW5hX2ludHJfbW9kZXJfZW50cnkgKmludHJfbW9kZXJfdGJsID0gZW5hX2Rldi0+aW50cl9tb2Rlcl90Ymw7CisKKwlpZiAobGV2ZWwgPj0gRU5BX0lOVFJfTUFYX05VTV9PRl9MRVZFTFMpCisJCXJldHVybjsKKworCWludHJfbW9kZXJfdGJsW2xldmVsXS5pbnRyX21vZGVyX2ludGVydmFsID0gZW50cnktPmludHJfbW9kZXJfaW50ZXJ2YWw7CisJaWYgKGVuYV9kZXYtPmludHJfZGVsYXlfcmVzb2x1dGlvbikKKwkJaW50cl9tb2Rlcl90YmxbbGV2ZWxdLmludHJfbW9kZXJfaW50ZXJ2YWwgLz0KKwkJCWVuYV9kZXYtPmludHJfZGVsYXlfcmVzb2x1dGlvbjsKKwlpbnRyX21vZGVyX3RibFtsZXZlbF0ucGt0c19wZXJfaW50ZXJ2YWwgPSBlbnRyeS0+cGt0c19wZXJfaW50ZXJ2YWw7CisKKwkvKiB1c2UgaGFyZGNvZGVkIHZhbHVlIHVudGlsIGV0aHRvb2wgc3VwcG9ydHMgYnl0ZWNvdW50IHBhcmFtZXRlciAqLworCWlmIChlbnRyeS0+Ynl0ZXNfcGVyX2ludGVydmFsICE9IEVOQV9JTlRSX0JZVEVfQ09VTlRfTk9UX1NVUFBPUlRFRCkKKwkJaW50cl9tb2Rlcl90YmxbbGV2ZWxdLmJ5dGVzX3Blcl9pbnRlcnZhbCA9IGVudHJ5LT5ieXRlc19wZXJfaW50ZXJ2YWw7Cit9CisKK3ZvaWQgZW5hX2NvbV9nZXRfaW50cl9tb2RlcmF0aW9uX2VudHJ5KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCQkgICAgICAgZW51bSBlbmFfaW50cl9tb2Rlcl9sZXZlbCBsZXZlbCwKKwkJCQkgICAgICAgc3RydWN0IGVuYV9pbnRyX21vZGVyX2VudHJ5ICplbnRyeSkKK3sKKwlzdHJ1Y3QgZW5hX2ludHJfbW9kZXJfZW50cnkgKmludHJfbW9kZXJfdGJsID0gZW5hX2Rldi0+aW50cl9tb2Rlcl90Ymw7CisKKwlpZiAobGV2ZWwgPj0gRU5BX0lOVFJfTUFYX05VTV9PRl9MRVZFTFMpCisJCXJldHVybjsKKworCWVudHJ5LT5pbnRyX21vZGVyX2ludGVydmFsID0gaW50cl9tb2Rlcl90YmxbbGV2ZWxdLmludHJfbW9kZXJfaW50ZXJ2YWw7CisJaWYgKGVuYV9kZXYtPmludHJfZGVsYXlfcmVzb2x1dGlvbikKKwkJZW50cnktPmludHJfbW9kZXJfaW50ZXJ2YWwgKj0gZW5hX2Rldi0+aW50cl9kZWxheV9yZXNvbHV0aW9uOworCWVudHJ5LT5wa3RzX3Blcl9pbnRlcnZhbCA9CisJaW50cl9tb2Rlcl90YmxbbGV2ZWxdLnBrdHNfcGVyX2ludGVydmFsOworCWVudHJ5LT5ieXRlc19wZXJfaW50ZXJ2YWwgPSBpbnRyX21vZGVyX3RibFtsZXZlbF0uYnl0ZXNfcGVyX2ludGVydmFsOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfY29tLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9jb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDlkN2I4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfY29tLmgKQEAgLTAsMCArMSwxMDM4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIEVOQV9DT00KKyNkZWZpbmUgRU5BX0NPTQorCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2l6ZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorCisjaW5jbHVkZSAiZW5hX2NvbW1vbl9kZWZzLmgiCisjaW5jbHVkZSAiZW5hX2FkbWluX2RlZnMuaCIKKyNpbmNsdWRlICJlbmFfZXRoX2lvX2RlZnMuaCIKKyNpbmNsdWRlICJlbmFfcmVnc19kZWZzLmgiCisKKyN1bmRlZiBwcl9mbXQKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2RlZmluZSBFTkFfTUFYX05VTV9JT19RVUVVRVMJCTEyOFUKKy8qIFdlIG5lZWQgdG8gcXVldWVzIGZvciBlYWNoIElPIChvbiBmb3IgVHggYW5kIG9uZSBmb3IgUngpICovCisjZGVmaW5lIEVOQV9UT1RBTF9OVU1fUVVFVUVTCQkoMiAqIChFTkFfTUFYX05VTV9JT19RVUVVRVMpKQorCisjZGVmaW5lIEVOQV9NQVhfSEFORExFUlMgMjU2CisKKyNkZWZpbmUgRU5BX01BWF9QSFlTX0FERFJfU0laRV9CSVRTIDQ4CisKKy8qIFVuaXQgaW4gdXNlYyAqLworI2RlZmluZSBFTkFfUkVHX1JFQURfVElNRU9VVCAyMDAwMDAKKworI2RlZmluZSBBRE1JTl9TUV9TSVpFKGRlcHRoKQkoKGRlcHRoKSAqIHNpemVvZihzdHJ1Y3QgZW5hX2FkbWluX2FxX2VudHJ5KSkKKyNkZWZpbmUgQURNSU5fQ1FfU0laRShkZXB0aCkJKChkZXB0aCkgKiBzaXplb2Yoc3RydWN0IGVuYV9hZG1pbl9hY3FfZW50cnkpKQorI2RlZmluZSBBRE1JTl9BRU5RX1NJWkUoZGVwdGgpCSgoZGVwdGgpICogc2l6ZW9mKHN0cnVjdCBlbmFfYWRtaW5fYWVucV9lbnRyeSkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEVOQSBhZGFwdGl2ZSBpbnRlcnJ1cHQgbW9kZXJhdGlvbiBzZXR0aW5ncyAqLworCisjZGVmaW5lIEVOQV9JTlRSX0xPV0VTVF9VU0VDUyAgICAgICAgICAgKDApCisjZGVmaW5lIEVOQV9JTlRSX0xPV0VTVF9QS1RTICAgICAgICAgICAgKDMpCisjZGVmaW5lIEVOQV9JTlRSX0xPV0VTVF9CWVRFUyAgICAgICAgICAgKDIgKiAxNTI0KQorCisjZGVmaW5lIEVOQV9JTlRSX0xPV19VU0VDUyAgICAgICAgICAgICAgKDMyKQorI2RlZmluZSBFTkFfSU5UUl9MT1dfUEtUUyAgICAgICAgICAgICAgICgxMikKKyNkZWZpbmUgRU5BX0lOVFJfTE9XX0JZVEVTICAgICAgICAgICAgICAoMTYgKiAxMDI0KQorCisjZGVmaW5lIEVOQV9JTlRSX01JRF9VU0VDUyAgICAgICAgICAgICAgKDgwKQorI2RlZmluZSBFTkFfSU5UUl9NSURfUEtUUyAgICAgICAgICAgICAgICg0OCkKKyNkZWZpbmUgRU5BX0lOVFJfTUlEX0JZVEVTICAgICAgICAgICAgICAoNjQgKiAxMDI0KQorCisjZGVmaW5lIEVOQV9JTlRSX0hJR0hfVVNFQ1MgICAgICAgICAgICAgKDEyOCkKKyNkZWZpbmUgRU5BX0lOVFJfSElHSF9QS1RTICAgICAgICAgICAgICAoOTYpCisjZGVmaW5lIEVOQV9JTlRSX0hJR0hfQllURVMgICAgICAgICAgICAgKDEyOCAqIDEwMjQpCisKKyNkZWZpbmUgRU5BX0lOVFJfSElHSEVTVF9VU0VDUyAgICAgICAgICAoMTkyKQorI2RlZmluZSBFTkFfSU5UUl9ISUdIRVNUX1BLVFMgICAgICAgICAgICgxMjgpCisjZGVmaW5lIEVOQV9JTlRSX0hJR0hFU1RfQllURVMgICAgICAgICAgKDE5MiAqIDEwMjQpCisKKyNkZWZpbmUgRU5BX0lOVFJfSU5JVElBTF9UWF9JTlRFUlZBTF9VU0VDUwkJMTk2CisjZGVmaW5lIEVOQV9JTlRSX0lOSVRJQUxfUlhfSU5URVJWQUxfVVNFQ1MJCTQKKyNkZWZpbmUgRU5BX0lOVFJfREVMQVlfT0xEX1ZBTFVFX1dFSUdIVAkJCTYKKyNkZWZpbmUgRU5BX0lOVFJfREVMQVlfTkVXX1ZBTFVFX1dFSUdIVAkJCTQKKyNkZWZpbmUgRU5BX0lOVFJfTU9ERVJfTEVWRUxfU1RSSURFCQkJMgorI2RlZmluZSBFTkFfSU5UUl9CWVRFX0NPVU5UX05PVF9TVVBQT1JURUQJCTB4RkZGRkZGCisKK2VudW0gZW5hX2ludHJfbW9kZXJfbGV2ZWwgeworCUVOQV9JTlRSX01PREVSX0xPV0VTVCA9IDAsCisJRU5BX0lOVFJfTU9ERVJfTE9XLAorCUVOQV9JTlRSX01PREVSX01JRCwKKwlFTkFfSU5UUl9NT0RFUl9ISUdILAorCUVOQV9JTlRSX01PREVSX0hJR0hFU1QsCisJRU5BX0lOVFJfTUFYX05VTV9PRl9MRVZFTFMsCit9OworCitzdHJ1Y3QgZW5hX2ludHJfbW9kZXJfZW50cnkgeworCXVuc2lnbmVkIGludCBpbnRyX21vZGVyX2ludGVydmFsOworCXVuc2lnbmVkIGludCBwa3RzX3Blcl9pbnRlcnZhbDsKKwl1bnNpZ25lZCBpbnQgYnl0ZXNfcGVyX2ludGVydmFsOworfTsKKworZW51bSBxdWV1ZV9kaXJlY3Rpb24geworCUVOQV9DT01fSU9fUVVFVUVfRElSRUNUSU9OX1RYLAorCUVOQV9DT01fSU9fUVVFVUVfRElSRUNUSU9OX1JYCit9OworCitzdHJ1Y3QgZW5hX2NvbV9idWYgeworCWRtYV9hZGRyX3QgcGFkZHI7IC8qKjwgQnVmZmVyIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwl1MTYgbGVuOyAvKio8IEJ1ZmZlciBsZW5ndGggaW4gYnl0ZXMgKi8KK307CisKK3N0cnVjdCBlbmFfY29tX3J4X2J1Zl9pbmZvIHsKKwl1MTYgbGVuOworCXUxNiByZXFfaWQ7Cit9OworCitzdHJ1Y3QgZW5hX2NvbV9pb19kZXNjX2FkZHIgeworCXU4IF9faW9tZW0gKnBidWZfZGV2X2FkZHI7IC8qIExMUSBhZGRyZXNzICovCisJdTggKnZpcnRfYWRkcjsKKwlkbWFfYWRkcl90IHBoeXNfYWRkcjsKK307CisKK3N0cnVjdCBlbmFfY29tX3R4X21ldGEgeworCXUxNiBtc3M7CisJdTE2IGwzX2hkcl9sZW47CisJdTE2IGwzX2hkcl9vZmZzZXQ7CisJdTE2IGw0X2hkcl9sZW47IC8qIEluIHdvcmRzICovCit9OworCitzdHJ1Y3QgZW5hX2NvbV9pb19jcSB7CisJc3RydWN0IGVuYV9jb21faW9fZGVzY19hZGRyIGNkZXNjX2FkZHI7CisKKwkvKiBJbnRlcnJ1cHQgdW5tYXNrIHJlZ2lzdGVyICovCisJdTMyIF9faW9tZW0gKnVubWFza19yZWc7CisKKwkvKiBUaGUgY29tcGxldGlvbiBxdWV1ZSBoZWFkIGRvb3JiZWxsIHJlZ2lzdGVyICovCisJdTMyIF9faW9tZW0gKmNxX2hlYWRfZGJfcmVnOworCisJLyogbnVtYSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIChmb3IgVFBIKSAqLworCXUzMiBfX2lvbWVtICpudW1hX25vZGVfY2ZnX3JlZzsKKworCS8qIFRoZSB2YWx1ZSB0byB3cml0ZSB0byB0aGUgYWJvdmUgcmVnaXN0ZXIgdG8gdW5tYXNrCisJICogdGhlIGludGVycnVwdCBvZiB0aGlzIHF1ZXVlCisJICovCisJdTMyIG1zaXhfdmVjdG9yOworCisJZW51bSBxdWV1ZV9kaXJlY3Rpb24gZGlyZWN0aW9uOworCisJLyogaG9sZHMgdGhlIG51bWJlciBvZiBjZGVzYyBvZiB0aGUgY3VycmVudCBwYWNrZXQgKi8KKwl1MTYgY3VyX3J4X3BrdF9jZGVzY19jb3VudDsKKwkvKiBzYXZlIHRoZSBmaXJ0IGNkZXNjIGlkeCBvZiB0aGUgY3VycmVudCBwYWNrZXQgKi8KKwl1MTYgY3VyX3J4X3BrdF9jZGVzY19zdGFydF9pZHg7CisKKwl1MTYgcV9kZXB0aDsKKwkvKiBDYWxsZXIgcWlkICovCisJdTE2IHFpZDsKKworCS8qIERldmljZSBxdWV1ZSBpbmRleCAqLworCXUxNiBpZHg7CisJdTE2IGhlYWQ7CisJdTE2IGxhc3RfaGVhZF91cGRhdGU7CisJdTggcGhhc2U7CisJdTggY2Rlc2NfZW50cnlfc2l6ZV9pbl9ieXRlczsKKworfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisKK3N0cnVjdCBlbmFfY29tX2lvX3NxIHsKKwlzdHJ1Y3QgZW5hX2NvbV9pb19kZXNjX2FkZHIgZGVzY19hZGRyOworCisJdTMyIF9faW9tZW0gKmRiX2FkZHI7CisJdTggX19pb21lbSAqaGVhZGVyX2FkZHI7CisKKwllbnVtIHF1ZXVlX2RpcmVjdGlvbiBkaXJlY3Rpb247CisJZW51bSBlbmFfYWRtaW5fcGxhY2VtZW50X3BvbGljeV90eXBlIG1lbV9xdWV1ZV90eXBlOworCisJdTMyIG1zaXhfdmVjdG9yOworCXN0cnVjdCBlbmFfY29tX3R4X21ldGEgY2FjaGVkX3R4X21ldGE7CisKKwl1MTYgcV9kZXB0aDsKKwl1MTYgcWlkOworCisJdTE2IGlkeDsKKwl1MTYgdGFpbDsKKwl1MTYgbmV4dF90b19jb21wOworCXUzMiB0eF9tYXhfaGVhZGVyX3NpemU7CisJdTggcGhhc2U7CisJdTggZGVzY19lbnRyeV9zaXplOworCXU4IGRtYV9hZGRyX2JpdHM7Cit9IF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKKworc3RydWN0IGVuYV9jb21fYWRtaW5fY3EgeworCXN0cnVjdCBlbmFfYWRtaW5fYWNxX2VudHJ5ICplbnRyaWVzOworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisKKwl1MTYgaGVhZDsKKwl1OCBwaGFzZTsKK307CisKK3N0cnVjdCBlbmFfY29tX2FkbWluX3NxIHsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FxX2VudHJ5ICplbnRyaWVzOworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisKKwl1MzIgX19pb21lbSAqZGJfYWRkcjsKKworCXUxNiBoZWFkOworCXUxNiB0YWlsOworCXU4IHBoYXNlOworCit9OworCitzdHJ1Y3QgZW5hX2NvbV9zdGF0c19hZG1pbiB7CisJdTMyIGFib3J0ZWRfY21kOworCXUzMiBzdWJtaXR0ZWRfY21kOworCXUzMiBjb21wbGV0ZWRfY21kOworCXUzMiBvdXRfb2Zfc3BhY2U7CisJdTMyIG5vX2NvbXBsZXRpb247Cit9OworCitzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSB7CisJdm9pZCAqcV9kbWFkZXY7CisJc3BpbmxvY2tfdCBxX2xvY2s7IC8qIHNwaW5sb2NrIGZvciB0aGUgYWRtaW4gcXVldWUgKi8KKwlzdHJ1Y3QgZW5hX2NvbXBfY3R4ICpjb21wX2N0eDsKKwl1MTYgcV9kZXB0aDsKKwlzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9jcSBjcTsKKwlzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9zcSBzcTsKKworCS8qIEluZGljYXRlIGlmIHRoZSBhZG1pbiBxdWV1ZSBzaG91bGQgcG9sbCBmb3IgY29tcGxldGlvbiAqLworCWJvb2wgcG9sbGluZzsKKworCXUxNiBjdXJyX2NtZF9pZDsKKworCS8qIEluZGljYXRlIHRoYXQgdGhlIGVuYSB3YXMgaW5pdGlhbGl6ZWQgYW5kIGNhbgorCSAqIHByb2Nlc3MgbmV3IGFkbWluIGNvbW1hbmRzCisJICovCisJYm9vbCBydW5uaW5nX3N0YXRlOworCisJLyogQ291bnQgdGhlIG51bWJlciBvZiBvdXRzdGFuZGluZyBhZG1pbiBjb21tYW5kcyAqLworCWF0b21pY190IG91dHN0YW5kaW5nX2NtZHM7CisKKwlzdHJ1Y3QgZW5hX2NvbV9zdGF0c19hZG1pbiBzdGF0czsKK307CisKK3N0cnVjdCBlbmFfYWVucV9oYW5kbGVyczsKKworc3RydWN0IGVuYV9jb21fYWVucSB7CisJdTE2IGhlYWQ7CisJdTggcGhhc2U7CisJc3RydWN0IGVuYV9hZG1pbl9hZW5xX2VudHJ5ICplbnRyaWVzOworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJdTE2IHFfZGVwdGg7CisJc3RydWN0IGVuYV9hZW5xX2hhbmRsZXJzICphZW5xX2hhbmRsZXJzOworfTsKKworc3RydWN0IGVuYV9jb21fbW1pb19yZWFkIHsKKwlzdHJ1Y3QgZW5hX2FkbWluX2VuYV9tbWlvX3JlcV9yZWFkX2xlc3NfcmVzcCAqcmVhZF9yZXNwOworCWRtYV9hZGRyX3QgcmVhZF9yZXNwX2RtYV9hZGRyOworCXUxNiBzZXFfbnVtOworCWJvb2wgcmVhZGxlc3Nfc3VwcG9ydGVkOworCS8qIHNwaW4gbG9jayB0byBlbnN1cmUgYSBzaW5nbGUgb3V0c3RhbmRpbmcgcmVhZCAqLworCXNwaW5sb2NrX3QgbG9jazsKK307CisKK3N0cnVjdCBlbmFfcnNzIHsKKwkvKiBJbmRpcmVjdCB0YWJsZSAqLworCXUxNiAqaG9zdF9yc3NfaW5kX3RibDsKKwlzdHJ1Y3QgZW5hX2FkbWluX3Jzc19pbmRfdGFibGVfZW50cnkgKnJzc19pbmRfdGJsOworCWRtYV9hZGRyX3QgcnNzX2luZF90YmxfZG1hX2FkZHI7CisJdTE2IHRibF9sb2dfc2l6ZTsKKworCS8qIEhhc2gga2V5ICovCisJZW51bSBlbmFfYWRtaW5faGFzaF9mdW5jdGlvbnMgaGFzaF9mdW5jOworCXN0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9yc3NfZmxvd19oYXNoX2NvbnRyb2wgKmhhc2hfa2V5OworCWRtYV9hZGRyX3QgaGFzaF9rZXlfZG1hX2FkZHI7CisJdTMyIGhhc2hfaW5pdF92YWw7CisKKwkvKiBGbG93IENvbnRyb2wgKi8KKwlzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfcnNzX2hhc2hfY29udHJvbCAqaGFzaF9jdHJsOworCWRtYV9hZGRyX3QgaGFzaF9jdHJsX2RtYV9hZGRyOworCit9OworCitzdHJ1Y3QgZW5hX2hvc3RfYXR0cmlidXRlIHsKKwkvKiBEZWJ1ZyBhcmVhICovCisJdTggKmRlYnVnX2FyZWFfdmlydF9hZGRyOworCWRtYV9hZGRyX3QgZGVidWdfYXJlYV9kbWFfYWRkcjsKKwl1MzIgZGVidWdfYXJlYV9zaXplOworCisJLyogSG9zdCBpbmZvcm1hdGlvbiAqLworCXN0cnVjdCBlbmFfYWRtaW5faG9zdF9pbmZvICpob3N0X2luZm87CisJZG1hX2FkZHJfdCBob3N0X2luZm9fZG1hX2FkZHI7Cit9OworCisvKiBFYWNoIGVuYV9kZXYgaXMgYSBQQ0kgZnVuY3Rpb24uICovCitzdHJ1Y3QgZW5hX2NvbV9kZXYgeworCXN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlIGFkbWluX3F1ZXVlOworCXN0cnVjdCBlbmFfY29tX2FlbnEgYWVucTsKKwlzdHJ1Y3QgZW5hX2NvbV9pb19jcSBpb19jcV9xdWV1ZXNbRU5BX1RPVEFMX05VTV9RVUVVRVNdOworCXN0cnVjdCBlbmFfY29tX2lvX3NxIGlvX3NxX3F1ZXVlc1tFTkFfVE9UQUxfTlVNX1FVRVVFU107CisJdTggX19pb21lbSAqcmVnX2JhcjsKKwl2b2lkIF9faW9tZW0gKm1lbV9iYXI7CisJdm9pZCAqZG1hZGV2OworCisJZW51bSBlbmFfYWRtaW5fcGxhY2VtZW50X3BvbGljeV90eXBlIHR4X21lbV9xdWV1ZV90eXBlOworCXUzMiB0eF9tYXhfaGVhZGVyX3NpemU7CisJdTE2IHN0YXRzX2Z1bmM7IC8qIFNlbGVjdGVkIGZ1bmN0aW9uIGZvciBleHRlbmRlZCBzdGF0aXN0aWMgZHVtcCAqLworCXUxNiBzdGF0c19xdWV1ZTsgLyogU2VsZWN0ZWQgcXVldWUgZm9yIGV4dGVuZGVkIHN0YXRpc3RpYyBkdW1wICovCisKKwlzdHJ1Y3QgZW5hX2NvbV9tbWlvX3JlYWQgbW1pb19yZWFkOworCisJc3RydWN0IGVuYV9yc3MgcnNzOworCXUzMiBzdXBwb3J0ZWRfZmVhdHVyZXM7CisJdTMyIGRtYV9hZGRyX2JpdHM7CisKKwlzdHJ1Y3QgZW5hX2hvc3RfYXR0cmlidXRlIGhvc3RfYXR0cjsKKwlib29sIGFkYXB0aXZlX2NvYWxlc2Npbmc7CisJdTE2IGludHJfZGVsYXlfcmVzb2x1dGlvbjsKKwl1MzIgaW50cl9tb2Rlcl90eF9pbnRlcnZhbDsKKwlzdHJ1Y3QgZW5hX2ludHJfbW9kZXJfZW50cnkgKmludHJfbW9kZXJfdGJsOworfTsKKworc3RydWN0IGVuYV9jb21fZGV2X2dldF9mZWF0dXJlc19jdHggeworCXN0cnVjdCBlbmFfYWRtaW5fcXVldWVfZmVhdHVyZV9kZXNjIG1heF9xdWV1ZXM7CisJc3RydWN0IGVuYV9hZG1pbl9kZXZpY2VfYXR0cl9mZWF0dXJlX2Rlc2MgZGV2X2F0dHI7CisJc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX2FlbnFfZGVzYyBhZW5xOworCXN0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9vZmZsb2FkX2Rlc2Mgb2ZmbG9hZDsKK307CisKK3N0cnVjdCBlbmFfY29tX2NyZWF0ZV9pb19jdHggeworCWVudW0gZW5hX2FkbWluX3BsYWNlbWVudF9wb2xpY3lfdHlwZSBtZW1fcXVldWVfdHlwZTsKKwllbnVtIHF1ZXVlX2RpcmVjdGlvbiBkaXJlY3Rpb247CisJaW50IG51bWFfbm9kZTsKKwl1MzIgbXNpeF92ZWN0b3I7CisJdTE2IHF1ZXVlX3NpemU7CisJdTE2IHFpZDsKK307CisKK3R5cGVkZWYgdm9pZCAoKmVuYV9hZW5xX2hhbmRsZXIpKHZvaWQgKmRhdGEsCisJc3RydWN0IGVuYV9hZG1pbl9hZW5xX2VudHJ5ICphZW5xX2UpOworCisvKiBIb2xkcyBhZW5xIGhhbmRsZXJzLiBJbmRleGVkIGJ5IEFFTlEgZXZlbnQgZ3JvdXAgKi8KK3N0cnVjdCBlbmFfYWVucV9oYW5kbGVycyB7CisJZW5hX2FlbnFfaGFuZGxlciBoYW5kbGVyc1tFTkFfTUFYX0hBTkRMRVJTXTsKKwllbmFfYWVucV9oYW5kbGVyIHVuaW1wbGVtZW50ZWRfaGFuZGxlcjsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZW5hX2NvbV9tbWlvX3JlZ19yZWFkX3JlcXVlc3RfaW5pdCAtIEluaXQgdGhlIG1taW8gcmVnIHJlYWQgbWVjaGFuaXNtCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKgorICogSW5pdGlhbGl6ZSB0aGUgcmVnaXN0ZXIgcmVhZCBtZWNoYW5pc20uCisgKgorICogQG5vdGU6IFRoaXMgbWV0aG9kIG11c3QgYmUgdGhlIGZpcnN0IHN0YWdlIGluIHRoZSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZS4KKyAqCisgKiBAcmV0dXJuIC0gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICovCitpbnQgZW5hX2NvbV9tbWlvX3JlZ19yZWFkX3JlcXVlc3RfaW5pdChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX3NldF9tbWlvX3JlYWRfbW9kZSAtIEVuYWJsZS9kaXNhYmxlIHRoZSBtbWlvIHJlZyByZWFkIG1lY2hhbmlzbQorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICogQHJlYWRsZXNzX3N1cHBvcnRlZDogcmVhZGxlc3MgbW9kZSAoZW5hYmxlL2Rpc2FibGUpCisgKi8KK3ZvaWQgZW5hX2NvbV9zZXRfbW1pb19yZWFkX21vZGUoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJCWJvb2wgcmVhZGxlc3Nfc3VwcG9ydGVkKTsKKworLyogZW5hX2NvbV9tbWlvX3JlZ19yZWFkX3JlcXVlc3Rfd3JpdGVfZGV2X2FkZHIgLSBXcml0ZSB0aGUgbW1pbyByZWcgcmVhZCByZXR1cm4KKyAqIHZhbHVlIHBoeXNpY2FsIGFkZHJlc3MuCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKi8KK3ZvaWQgZW5hX2NvbV9tbWlvX3JlZ19yZWFkX3JlcXVlc3Rfd3JpdGVfZGV2X2FkZHIoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV9tbWlvX3JlZ19yZWFkX3JlcXVlc3RfZGVzdHJveSAtIERlc3Ryb3kgdGhlIG1taW8gcmVnIHJlYWQgbWVjaGFuaXNtCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKi8KK3ZvaWQgZW5hX2NvbV9tbWlvX3JlZ19yZWFkX3JlcXVlc3RfZGVzdHJveShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX2FkbWluX2luaXQgLSBJbml0IHRoZSBhZG1pbiBhbmQgdGhlIGFzeW5jIHF1ZXVlcworICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICogQGFlbnFfaGFuZGxlcnM6IFRob3NlIGhhbmRsZXJzIHRvIGJlIGNhbGxlZCB1cG9uIGV2ZW50LgorICogQGluaXRfc3BpbmxvY2s6IEluZGljYXRlIGlmIHRoaXMgbWV0aG9kIHNob3VsZCBpbml0IHRoZSBhZG1pbiBzcGlubG9jayBvcgorICogdGhlIHNwaW5sb2NrIHdhcyBpbml0IGJlZm9yZSAoZm9yIGV4YW1wbGUsIGluIGEgY2FzZSBvZiBGTFIpLgorICoKKyAqIEluaXRpYWxpemUgdGhlIGFkbWluIHN1Ym1pc3Npb24gYW5kIGNvbXBsZXRpb24gcXVldWVzLgorICogSW5pdGlhbGl6ZSB0aGUgYXN5bmNocm9ub3VzIGV2ZW50cyBub3RpZmljYXRpb24gcXVldWVzLgorICoKKyAqIEByZXR1cm4gLSAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBlbmFfY29tX2FkbWluX2luaXQoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkgICAgICAgc3RydWN0IGVuYV9hZW5xX2hhbmRsZXJzICphZW5xX2hhbmRsZXJzLAorCQkgICAgICAgYm9vbCBpbml0X3NwaW5sb2NrKTsKKworLyogZW5hX2NvbV9hZG1pbl9kZXN0cm95IC0gRGVzdHJveSB0aGUgYWRtaW4gYW5kIHRoZSBhc3luYyBldmVudHMgcXVldWVzLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICoKKyAqIEBub3RlOiBCZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZCwgdGhlIGNhbGxlciBtdXN0IHZhbGlkYXRlIHRoYXQgdGhlIGRldmljZQorICogd29uJ3Qgc2VuZCBhbnkgYWRkaXRpb25hbCBhZG1pbiBjb21wbGV0aW9ucy9hZW5xLgorICogVG8gYWNoaWV2ZSB0aGF0LCBhIEZMUiBpcyByZWNvbW1lbmRlZC4KKyAqLwordm9pZCBlbmFfY29tX2FkbWluX2Rlc3Ryb3koc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV9kZXZfcmVzZXQgLSBQZXJmb3JtIGRldmljZSBGTFIgdG8gdGhlIGRldmljZS4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqCisgKiBAcmV0dXJuIC0gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICovCitpbnQgZW5hX2NvbV9kZXZfcmVzZXQoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV9jcmVhdGVfaW9fcXVldWUgLSBDcmVhdGUgaW8gcXVldWUuCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKiBAY3R4IC0gY3JlYXRlIGNvbnRleHQgc3RydWN0dXJlCisgKgorICogQ3JlYXRlIHRoZSBzdWJtaXNzaW9uIGFuZCB0aGUgY29tcGxldGlvbiBxdWV1ZXMuCisgKgorICogQHJldHVybiAtIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqLworaW50IGVuYV9jb21fY3JlYXRlX2lvX3F1ZXVlKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCSAgICBzdHJ1Y3QgZW5hX2NvbV9jcmVhdGVfaW9fY3R4ICpjdHgpOworCisvKiBlbmFfY29tX2Rlc3Ryb3lfaW9fcXVldWUgLSBEZXN0cm95IElPIHF1ZXVlIHdpdGggdGhlIHF1ZXVlIGlkIC0gcWlkLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICogQHFpZCAtIHRoZSBjYWxsZXIgdmlydHVhbCBxdWV1ZSBpZC4KKyAqLwordm9pZCBlbmFfY29tX2Rlc3Ryb3lfaW9fcXVldWUoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LCB1MTYgcWlkKTsKKworLyogZW5hX2NvbV9nZXRfaW9faGFuZGxlcnMgLSBSZXR1cm4gdGhlIGlvIHF1ZXVlIGhhbmRsZXJzCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKiBAcWlkIC0gdGhlIGNhbGxlciB2aXJ0dWFsIHF1ZXVlIGlkLgorICogQGlvX3NxIC0gSU8gc3VibWlzc2lvbiBxdWV1ZSBoYW5kbGVyCisgKiBAaW9fY3EgLSBJTyBjb21wbGV0aW9uIHF1ZXVlIGhhbmRsZXIuCisgKgorICogQHJldHVybiAtIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqLworaW50IGVuYV9jb21fZ2V0X2lvX2hhbmRsZXJzKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwgdTE2IHFpZCwKKwkJCSAgICBzdHJ1Y3QgZW5hX2NvbV9pb19zcSAqKmlvX3NxLAorCQkJICAgIHN0cnVjdCBlbmFfY29tX2lvX2NxICoqaW9fY3EpOworCisvKiBlbmFfY29tX2FkbWluX2FlbnFfZW5hYmxlIC0gRU5BYmxlIGFzeW5jaHJvbm91cyBldmVudCBub3RpZmljYXRpb25zCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKgorICogQWZ0ZXIgdGhpcyBtZXRob2QsIGFlbnEgZXZlbnQgY2FuIGJlIHJlY2VpdmVkIHZpYSBBRU5RLgorICovCit2b2lkIGVuYV9jb21fYWRtaW5fYWVucV9lbmFibGUoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV9zZXRfYWRtaW5fcnVubmluZ19zdGF0ZSAtIFNldCB0aGUgc3RhdGUgb2YgdGhlIGFkbWluIHF1ZXVlCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKgorICogQ2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUgYWRtaW4gcXVldWUgKGVuYWJsZS9kaXNhYmxlKQorICovCit2b2lkIGVuYV9jb21fc2V0X2FkbWluX3J1bm5pbmdfc3RhdGUoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LCBib29sIHN0YXRlKTsKKworLyogZW5hX2NvbV9nZXRfYWRtaW5fcnVubmluZ19zdGF0ZSAtIEdldCB0aGUgYWRtaW4gcXVldWUgc3RhdGUKKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqCisgKiBSZXRyaWV2ZSB0aGUgc3RhdGUgb2YgdGhlIGFkbWluIHF1ZXVlIChlbmFibGUvZGlzYWJsZSkKKyAqCisgKiBAcmV0dXJuIC0gY3VycmVudCBwb2xsaW5nIG1vZGUgKGVuYWJsZS9kaXNhYmxlKQorICovCitib29sIGVuYV9jb21fZ2V0X2FkbWluX3J1bm5pbmdfc3RhdGUoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV9zZXRfYWRtaW5fcG9sbGluZ19tb2RlIC0gU2V0IHRoZSBhZG1pbiBjb21wbGV0aW9uIHF1ZXVlIHBvbGxpbmcgbW9kZQorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICogQHBvbGxpbmc6IEVOQWJsZS9EaXNhYmxlIHBvbGxpbmcgbW9kZQorICoKKyAqIFNldCB0aGUgYWRtaW4gY29tcGxldGlvbiBtb2RlLgorICovCit2b2lkIGVuYV9jb21fc2V0X2FkbWluX3BvbGxpbmdfbW9kZShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsIGJvb2wgcG9sbGluZyk7CisKKy8qIGVuYV9jb21fc2V0X2FkbWluX3BvbGxpbmdfbW9kZSAtIEdldCB0aGUgYWRtaW4gY29tcGxldGlvbiBxdWV1ZSBwb2xsaW5nIG1vZGUKKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqCisgKiBHZXQgdGhlIGFkbWluIGNvbXBsZXRpb24gbW9kZS4KKyAqIElmIHBvbGxpbmcgbW9kZSBpcyBvbiwgZW5hX2NvbV9leGVjdXRlX2FkbWluX2NvbW1hbmQgd2lsbCBwZXJmb3JtIGEKKyAqIHBvbGxpbmcgb24gdGhlIGFkbWluIGNvbXBsZXRpb24gcXVldWUgZm9yIHRoZSBjb21tYW5kcyBjb21wbGV0aW9uLAorICogb3RoZXJ3aXNlIGl0IHdpbGwgd2FpdCBvbiB3YWl0IGV2ZW50LgorICoKKyAqIEByZXR1cm4gc3RhdGUKKyAqLworYm9vbCBlbmFfY29tX2dldF9lbmFfYWRtaW5fcG9sbGluZ19tb2RlKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21fYWRtaW5fcV9jb21wX2ludHJfaGFuZGxlciAtIGFkbWluIHF1ZXVlIGludGVycnVwdCBoYW5kbGVyCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKgorICogVGhpcyBtZXRob2QgZ28gb3ZlciB0aGUgYWRtaW4gY29tcGxldGlvbiBxdWV1ZSBhbmQgd2FrZSB1cCBhbGwgdGhlIHBlbmRpbmcKKyAqIHRocmVhZHMgdGhhdCB3YWl0IG9uIHRoZSBjb21tYW5kcyB3YWl0IGV2ZW50LgorICoKKyAqIEBub3RlOiBTaG91bGQgYmUgY2FsbGVkIGFmdGVyIE1TSS1YIGludGVycnVwdC4KKyAqLwordm9pZCBlbmFfY29tX2FkbWluX3FfY29tcF9pbnRyX2hhbmRsZXIoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV9hZW5xX2ludHJfaGFuZGxlciAtIEFFTlEgaW50ZXJydXB0IGhhbmRsZXIKKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqCisgKiBUaGlzIG1ldGhvZCBnbyBvdmVyIHRoZSBhc3luYyBldmVudCBub3RpZmljYXRpb24gcXVldWUgYW5kIGNhbGwgdGhlIHByb3BlcgorICogYWVucSBoYW5kbGVyLgorICovCit2b2lkIGVuYV9jb21fYWVucV9pbnRyX2hhbmRsZXIoc3RydWN0IGVuYV9jb21fZGV2ICpkZXYsIHZvaWQgKmRhdGEpOworCisvKiBlbmFfY29tX2Fib3J0X2FkbWluX2NvbW1hbmRzIC0gQWJvcnQgYWxsIHRoZSBvdXRzdGFuZGluZyBhZG1pbiBjb21tYW5kcy4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqCisgKiBUaGlzIG1ldGhvZCBhYm9ydHMgYWxsIHRoZSBvdXRzdGFuZGluZyBhZG1pbiBjb21tYW5kcy4KKyAqIFRoZSBjYWxsZXIgc2hvdWxkIHRoZW4gY2FsbCBlbmFfY29tX3dhaXRfZm9yX2Fib3J0X2NvbXBsZXRpb24gdG8gbWFrZSBzdXJlCisgKiBhbGwgdGhlIGNvbW1hbmRzIHdlcmUgY29tcGxldGVkLgorICovCit2b2lkIGVuYV9jb21fYWJvcnRfYWRtaW5fY29tbWFuZHMoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV93YWl0X2Zvcl9hYm9ydF9jb21wbGV0aW9uIC0gV2FpdCBmb3IgYWRtaW4gY29tbWFuZHMgYWJvcnQuCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKgorICogVGhpcyBtZXRob2Qgd2FpdCB1bnRpbCBhbGwgdGhlIG91dHN0YW5kaW5nIGFkbWluIGNvbW1hbmRzIHdpbGwgYmUgY29tcGxldGVkLgorICovCit2b2lkIGVuYV9jb21fd2FpdF9mb3JfYWJvcnRfY29tcGxldGlvbihzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX3ZhbGlkYXRlX3ZlcnNpb24gLSBWYWxpZGF0ZSB0aGUgZGV2aWNlIHBhcmFtZXRlcnMKKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqCisgKiBUaGlzIG1ldGhvZCB2YWxpZGF0ZSB0aGUgZGV2aWNlIHBhcmFtZXRlcnMgYXJlIHRoZSBzYW1lIGFzIHRoZSBzYXZlZAorICogcGFyYW1ldGVycyBpbiBlbmFfZGV2LgorICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIGFmdGVyIGRldmljZSByZXNldCwgdG8gdmFsaWRhdGUgdGhlIGRldmljZSBtYWMgYWRkcmVzcworICogYW5kIHRoZSBkZXZpY2Ugb2ZmbG9hZHMgYXJlIHRoZSBzYW1lIGFzIGJlZm9yZSB0aGUgcmVzZXQuCisgKgorICogQHJldHVybiAtIDAgb24gc3VjY2VzcyBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisgKi8KK2ludCBlbmFfY29tX3ZhbGlkYXRlX3ZlcnNpb24oc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV9nZXRfbGlua19wYXJhbXMgLSBSZXRyaWV2ZSBwaHlzaWNhbCBsaW5rIHBhcmFtZXRlcnMuCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKiBAcmVzcDogTGluayBwYXJhbWV0ZXJzCisgKgorICogUmV0cmlldmUgdGhlIHBoeXNpY2FsIGxpbmsgcGFyYW1ldGVycywKKyAqIGxpa2Ugc3BlZWQsIGF1dG8tbmVnb3RpYXRpb24gYW5kIGZ1bGwgZHVwbGV4IHN1cHBvcnQuCisgKgorICogQHJldHVybiAtIDAgb24gU3VjY2VzcyBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisgKi8KK2ludCBlbmFfY29tX2dldF9saW5rX3BhcmFtcyhzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkgICAgc3RydWN0IGVuYV9hZG1pbl9nZXRfZmVhdF9yZXNwICpyZXNwKTsKKworLyogZW5hX2NvbV9nZXRfZG1hX3dpZHRoIC0gUmV0cmlldmUgcGh5c2ljYWwgZG1hIGFkZHJlc3Mgd2lkdGggdGhlIGRldmljZQorICogc3VwcG9ydHMuCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKgorICogUmV0cmlldmUgdGhlIG1heGltdW0gcGh5c2ljYWwgYWRkcmVzcyBiaXRzIHRoZSBkZXZpY2UgY2FuIGhhbmRsZS4KKyAqCisgKiBAcmV0dXJuOiA+IDAgb24gU3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICovCitpbnQgZW5hX2NvbV9nZXRfZG1hX3dpZHRoKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21fc2V0X2FlbnFfY29uZmlnIC0gU2V0IGFlbnEgZ3JvdXBzIGNvbmZpZ3VyYXRpb25zCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKiBAZ3JvdXBzIGZsYWc6IGJpdCBmaWVsZHMgZmxhZ3Mgb2YgZW51bSBlbmFfYWRtaW5fYWVucV9ncm91cC4KKyAqCisgKiBDb25maWd1cmUgd2hpY2ggYWVucSBldmVudCBncm91cCB0aGUgZHJpdmVyIHdvdWxkIGxpa2UgdG8gcmVjZWl2ZS4KKyAqCisgKiBAcmV0dXJuOiAwIG9uIFN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworaW50IGVuYV9jb21fc2V0X2FlbnFfY29uZmlnKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwgdTMyIGdyb3Vwc19mbGFnKTsKKworLyogZW5hX2NvbV9nZXRfZGV2X2F0dHJfZmVhdCAtIEdldCBkZXZpY2UgZmVhdHVyZXMKKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqIEBnZXRfZmVhdF9jdHg6IHJldHVybmVkIGNvbnRleHQgdGhhdCBjb250YWluIHRoZSBnZXQgZmVhdHVyZXMuCisgKgorICogQHJldHVybjogMCBvbiBTdWNjZXNzIGFuZCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisgKi8KK2ludCBlbmFfY29tX2dldF9kZXZfYXR0cl9mZWF0KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCSAgICAgIHN0cnVjdCBlbmFfY29tX2Rldl9nZXRfZmVhdHVyZXNfY3R4ICpnZXRfZmVhdF9jdHgpOworCisvKiBlbmFfY29tX2dldF9kZXZfYmFzaWNfc3RhdHMgLSBHZXQgZGV2aWNlIGJhc2ljIHN0YXRpc3RpY3MKKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqIEBzdGF0czogc3RhdHMgcmV0dXJuIHZhbHVlCisgKgorICogQHJldHVybjogMCBvbiBTdWNjZXNzIGFuZCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisgKi8KK2ludCBlbmFfY29tX2dldF9kZXZfYmFzaWNfc3RhdHMoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJCXN0cnVjdCBlbmFfYWRtaW5fYmFzaWNfc3RhdHMgKnN0YXRzKTsKKworLyogZW5hX2NvbV9zZXRfZGV2X210dSAtIENvbmZpZ3VyZSB0aGUgZGV2aWNlIG10dS4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqIEBtdHU6IG10dSB2YWx1ZQorICoKKyAqIEByZXR1cm46IDAgb24gU3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICovCitpbnQgZW5hX2NvbV9zZXRfZGV2X210dShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsIGludCBtdHUpOworCisvKiBlbmFfY29tX2dldF9vZmZsb2FkX3NldHRpbmdzIC0gUmV0cmlldmUgdGhlIGRldmljZSBvZmZsb2FkcyBjYXBhYmlsaXRpZXMKKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqIEBvZmZsYWQ6IG9mZmxvYWQgcmV0dXJuIHZhbHVlCisgKgorICogQHJldHVybjogMCBvbiBTdWNjZXNzIGFuZCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisgKi8KK2ludCBlbmFfY29tX2dldF9vZmZsb2FkX3NldHRpbmdzKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCQkgc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX29mZmxvYWRfZGVzYyAqb2ZmbG9hZCk7CisKKy8qIGVuYV9jb21fcnNzX2luaXQgLSBJbml0IFJTUworICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICogQGxvZ19zaXplOiBpbmRpcmVjdGlvbiBsb2cgc2l6ZQorICoKKyAqIEFsbG9jYXRlIFJTUy9SRlMgcmVzb3VyY2VzLgorICogVGhlIGNhbGxlciB0aGVuIGNhbiBjb25maWd1cmUgcnNzIHVzaW5nIGVuYV9jb21fc2V0X2hhc2hfZnVuY3Rpb24sCisgKiBlbmFfY29tX3NldF9oYXNoX2N0cmwgYW5kIGVuYV9jb21faW5kaXJlY3RfdGFibGVfc2V0LgorICoKKyAqIEByZXR1cm46IDAgb24gU3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICovCitpbnQgZW5hX2NvbV9yc3NfaW5pdChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsIHUxNiBsb2dfc2l6ZSk7CisKKy8qIGVuYV9jb21fcnNzX2Rlc3Ryb3kgLSBEZXN0cm95IHJzcworICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICoKKyAqIEZyZWUgYWxsIHRoZSBSU1MvUkZTIHJlc291cmNlcy4KKyAqLwordm9pZCBlbmFfY29tX3Jzc19kZXN0cm95KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21fZmlsbF9oYXNoX2Z1bmN0aW9uIC0gRmlsbCBSU1MgaGFzaCBmdW5jdGlvbgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICogQGZ1bmM6IFRoZSBoYXNoIGZ1bmN0aW9uIChUb2VwbGl0eiBvciBjcmMpCisgKiBAa2V5OiBIYXNoIGtleSAoZm9yIHRvZXBsaXR6IGhhc2gpCisgKiBAa2V5X2xlbjoga2V5IGxlbmd0aCAobWF4IGxlbmd0aCAxMCBEVykKKyAqIEBpbml0X3ZhbDogaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGhhc2ggZnVuY3Rpb24KKyAqCisgKiBGaWxsIHRoZSBlbmFfZGV2IHJlc291cmNlcyB3aXRoIHRoZSBkZXNpcmUgaGFzaCBmdW5jdGlvbiwgaGFzaCBrZXksIGtleV9sZW4KKyAqIGFuZCBrZXkgaW5pdGlhbCB2YWx1ZSAoaWYgbmVlZGVkIGJ5IHRoZSBoYXNoIGZ1bmN0aW9uKS4KKyAqIFRvIGZsdXNoIHRoZSBrZXkgaW50byB0aGUgZGV2aWNlIHRoZSBjYWxsZXIgc2hvdWxkIGNhbGwKKyAqIGVuYV9jb21fc2V0X2hhc2hfZnVuY3Rpb24uCisgKgorICogQHJldHVybjogMCBvbiBTdWNjZXNzIGFuZCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisgKi8KK2ludCBlbmFfY29tX2ZpbGxfaGFzaF9mdW5jdGlvbihzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkgICAgICAgZW51bSBlbmFfYWRtaW5faGFzaF9mdW5jdGlvbnMgZnVuYywKKwkJCSAgICAgICBjb25zdCB1OCAqa2V5LCB1MTYga2V5X2xlbiwgdTMyIGluaXRfdmFsKTsKKworLyogZW5hX2NvbV9zZXRfaGFzaF9mdW5jdGlvbiAtIEZsdXNoIHRoZSBoYXNoIGZ1bmN0aW9uIGFuZCBpdCBkZXBlbmRlbmNpZXMgdG8KKyAqIHRoZSBkZXZpY2UuCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKgorICogRmx1c2ggdGhlIGhhc2ggZnVuY3Rpb24gYW5kIGl0IGRlcGVuZGVuY2llcyAoa2V5LCBrZXkgbGVuZ3RoIGFuZAorICogaW5pdGlhbCB2YWx1ZSkgaWYgbmVlZGVkLgorICoKKyAqIEBub3RlOiBQcmlvciB0byB0aGlzIG1ldGhvZCB0aGUgY2FsbGVyIHNob3VsZCBjYWxsIGVuYV9jb21fZmlsbF9oYXNoX2Z1bmN0aW9uCisgKgorICogQHJldHVybjogMCBvbiBTdWNjZXNzIGFuZCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisgKi8KK2ludCBlbmFfY29tX3NldF9oYXNoX2Z1bmN0aW9uKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21fZ2V0X2hhc2hfZnVuY3Rpb24gLSBSZXRyaWV2ZSB0aGUgaGFzaCBmdW5jdGlvbiBhbmQgdGhlIGhhc2gga2V5CisgKiBmcm9tIHRoZSBkZXZpY2UuCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKiBAZnVuYzogaGFzaCBmdW5jdGlvbgorICogQGtleTogaGFzaCBrZXkKKyAqCisgKiBSZXRyaWV2ZSB0aGUgaGFzaCBmdW5jdGlvbiBhbmQgdGhlIGhhc2gga2V5IGZyb20gdGhlIGRldmljZS4KKyAqCisgKiBAbm90ZTogSWYgdGhlIGNhbGxlciBjYWxsZWQgZW5hX2NvbV9maWxsX2hhc2hfZnVuY3Rpb24gYnV0IGRpZG4ndCBmbGFzaAorICogaXQgdG8gdGhlIGRldmljZSwgdGhlIG5ldyBjb25maWd1cmF0aW9uIHdpbGwgYmUgbG9zdC4KKyAqCisgKiBAcmV0dXJuOiAwIG9uIFN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworaW50IGVuYV9jb21fZ2V0X2hhc2hfZnVuY3Rpb24oc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJICAgICAgZW51bSBlbmFfYWRtaW5faGFzaF9mdW5jdGlvbnMgKmZ1bmMsCisJCQkgICAgICB1OCAqa2V5KTsKKworLyogZW5hX2NvbV9maWxsX2hhc2hfY3RybCAtIEZpbGwgUlNTIGhhc2ggY29udHJvbAorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdC4KKyAqIEBwcm90bzogVGhlIHByb3RvY29sIHRvIGNvbmZpZ3VyZS4KKyAqIEBoYXNoX2ZpZWxkczogYml0IG1hc2sgb2YgZW5hX2FkbWluX2Zsb3dfaGFzaF9maWVsZHMKKyAqCisgKiBGaWxsIHRoZSBlbmFfZGV2IHJlc291cmNlcyB3aXRoIHRoZSBkZXNpcmUgaGFzaCBjb250cm9sICh0aGUgZXRoZXJuZXQKKyAqIGZpZWxkcyB0aGF0IHRha2UgcGFydCBvZiB0aGUgaGFzaCkgZm9yIGEgc3BlY2lmaWMgcHJvdG9jb2wuCisgKiBUbyBmbHVzaCB0aGUgaGFzaCBjb250cm9sIHRvIHRoZSBkZXZpY2UsIHRoZSBjYWxsZXIgc2hvdWxkIGNhbGwKKyAqIGVuYV9jb21fc2V0X2hhc2hfY3RybC4KKyAqCisgKiBAcmV0dXJuOiAwIG9uIFN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworaW50IGVuYV9jb21fZmlsbF9oYXNoX2N0cmwoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJICAgZW51bSBlbmFfYWRtaW5fZmxvd19oYXNoX3Byb3RvIHByb3RvLAorCQkJICAgdTE2IGhhc2hfZmllbGRzKTsKKworLyogZW5hX2NvbV9zZXRfaGFzaF9jdHJsIC0gRmx1c2ggdGhlIGhhc2ggY29udHJvbCByZXNvdXJjZXMgdG8gdGhlIGRldmljZS4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqCisgKiBGbHVzaCB0aGUgaGFzaCBjb250cm9sICh0aGUgZXRoZXJuZXQgZmllbGRzIHRoYXQgdGFrZSBwYXJ0IG9mIHRoZSBoYXNoKQorICoKKyAqIEBub3RlOiBQcmlvciB0byB0aGlzIG1ldGhvZCB0aGUgY2FsbGVyIHNob3VsZCBjYWxsIGVuYV9jb21fZmlsbF9oYXNoX2N0cmwuCisgKgorICogQHJldHVybjogMCBvbiBTdWNjZXNzIGFuZCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisgKi8KK2ludCBlbmFfY29tX3NldF9oYXNoX2N0cmwoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV9nZXRfaGFzaF9jdHJsIC0gUmV0cmlldmUgdGhlIGhhc2ggY29udHJvbCBmcm9tIHRoZSBkZXZpY2UuCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKiBAcHJvdG86IFRoZSBwcm90b2NvbCB0byByZXRyaWV2ZS4KKyAqIEBmaWVsZHM6IGJpdCBtYXNrIG9mIGVuYV9hZG1pbl9mbG93X2hhc2hfZmllbGRzLgorICoKKyAqIFJldHJpZXZlIHRoZSBoYXNoIGNvbnRyb2wgZnJvbSB0aGUgZGV2aWNlLgorICoKKyAqIEBub3RlLCBJZiB0aGUgY2FsbGVyIGNhbGxlZCBlbmFfY29tX2ZpbGxfaGFzaF9jdHJsIGJ1dCBkaWRuJ3QgZmxhc2gKKyAqIGl0IHRvIHRoZSBkZXZpY2UsIHRoZSBuZXcgY29uZmlndXJhdGlvbiB3aWxsIGJlIGxvc3QuCisgKgorICogQHJldHVybjogMCBvbiBTdWNjZXNzIGFuZCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisgKi8KK2ludCBlbmFfY29tX2dldF9oYXNoX2N0cmwoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJICBlbnVtIGVuYV9hZG1pbl9mbG93X2hhc2hfcHJvdG8gcHJvdG8sCisJCQkgIHUxNiAqZmllbGRzKTsKKworLyogZW5hX2NvbV9zZXRfZGVmYXVsdF9oYXNoX2N0cmwgLSBTZXQgdGhlIGhhc2ggY29udHJvbCB0byBhIGRlZmF1bHQKKyAqIGNvbmZpZ3VyYXRpb24uCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKgorICogRmlsbCB0aGUgZW5hX2RldiByZXNvdXJjZXMgd2l0aCB0aGUgZGVmYXVsdCBoYXNoIGNvbnRyb2wgY29uZmlndXJhdGlvbi4KKyAqIFRvIGZsdXNoIHRoZSBoYXNoIGNvbnRyb2wgdG8gdGhlIGRldmljZSwgdGhlIGNhbGxlciBzaG91bGQgY2FsbAorICogZW5hX2NvbV9zZXRfaGFzaF9jdHJsLgorICoKKyAqIEByZXR1cm46IDAgb24gU3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICovCitpbnQgZW5hX2NvbV9zZXRfZGVmYXVsdF9oYXNoX2N0cmwoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV9pbmRpcmVjdF90YWJsZV9maWxsX2VudHJ5IC0gRmlsbCBhIHNpbmdsZSBlbnRyeSBpbiB0aGUgUlNTCisgKiBpbmRpcmVjdGlvbiB0YWJsZQorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdC4KKyAqIEBlbnRyeV9pZHggLSBpbmRpcmVjdGlvbiB0YWJsZSBlbnRyeS4KKyAqIEBlbnRyeV92YWx1ZSAtIHJlZGlyZWN0aW9uIHZhbHVlCisgKgorICogRmlsbCBhIHNpbmdsZSBlbnRyeSBvZiB0aGUgUlNTIGluZGlyZWN0aW9uIHRhYmxlIGluIHRoZSBlbmFfZGV2IHJlc291cmNlcy4KKyAqIFRvIGZsdXNoIHRoZSBpbmRpcmVjdGlvbiB0YWJsZSB0byB0aGUgZGV2aWNlLCB0aGUgY2FsbGVkIHNob3VsZCBjYWxsCisgKiBlbmFfY29tX2luZGlyZWN0X3RhYmxlX3NldC4KKyAqCisgKiBAcmV0dXJuOiAwIG9uIFN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworaW50IGVuYV9jb21faW5kaXJlY3RfdGFibGVfZmlsbF9lbnRyeShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkJICAgICAgdTE2IGVudHJ5X2lkeCwgdTE2IGVudHJ5X3ZhbHVlKTsKKworLyogZW5hX2NvbV9pbmRpcmVjdF90YWJsZV9zZXQgLSBGbHVzaCB0aGUgaW5kaXJlY3Rpb24gdGFibGUgdG8gdGhlIGRldmljZS4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqCisgKiBGbHVzaCB0aGUgaW5kaXJlY3Rpb24gaGFzaCBjb250cm9sIHRvIHRoZSBkZXZpY2UuCisgKiBQcmlvciB0byB0aGlzIG1ldGhvZCB0aGUgY2FsbGVyIHNob3VsZCBjYWxsIGVuYV9jb21faW5kaXJlY3RfdGFibGVfZmlsbF9lbnRyeQorICoKKyAqIEByZXR1cm46IDAgb24gU3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICovCitpbnQgZW5hX2NvbV9pbmRpcmVjdF90YWJsZV9zZXQoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV9pbmRpcmVjdF90YWJsZV9nZXQgLSBSZXRyaWV2ZSB0aGUgaW5kaXJlY3Rpb24gdGFibGUgZnJvbSB0aGUgZGV2aWNlLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICogQGluZF90Ymw6IGluZGlyZWN0aW9uIHRhYmxlCisgKgorICogUmV0cmlldmUgdGhlIFJTUyBpbmRpcmVjdGlvbiB0YWJsZSBmcm9tIHRoZSBkZXZpY2UuCisgKgorICogQG5vdGU6IElmIHRoZSBjYWxsZXIgY2FsbGVkIGVuYV9jb21faW5kaXJlY3RfdGFibGVfZmlsbF9lbnRyeSBidXQgZGlkbid0IGZsYXNoCisgKiBpdCB0byB0aGUgZGV2aWNlLCB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBsb3N0LgorICoKKyAqIEByZXR1cm46IDAgb24gU3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICovCitpbnQgZW5hX2NvbV9pbmRpcmVjdF90YWJsZV9nZXQoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LCB1MzIgKmluZF90YmwpOworCisvKiBlbmFfY29tX2FsbG9jYXRlX2hvc3RfaW5mbyAtIEFsbG9jYXRlIGhvc3QgaW5mbyByZXNvdXJjZXMuCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKgorICogQHJldHVybjogMCBvbiBTdWNjZXNzIGFuZCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisgKi8KK2ludCBlbmFfY29tX2FsbG9jYXRlX2hvc3RfaW5mbyhzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX2FsbG9jYXRlX2RlYnVnX2FyZWEgLSBBbGxvY2F0ZSBkZWJ1ZyBhcmVhLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICogQGRlYnVnX2FyZWFfc2l6ZSAtIGRlYnVnIGFyZWEgc2l6ZS4KKyAqCisgKiBAcmV0dXJuOiAwIG9uIFN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworaW50IGVuYV9jb21fYWxsb2NhdGVfZGVidWdfYXJlYShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkJdTMyIGRlYnVnX2FyZWFfc2l6ZSk7CisKKy8qIGVuYV9jb21fZGVsZXRlX2RlYnVnX2FyZWEgLSBGcmVlIHRoZSBkZWJ1ZyBhcmVhIHJlc291cmNlcy4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqCisgKiBGcmVlIHRoZSBhbGxvY2F0ZSBkZWJ1ZyBhcmVhLgorICovCit2b2lkIGVuYV9jb21fZGVsZXRlX2RlYnVnX2FyZWEoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV9kZWxldGVfaG9zdF9pbmZvIC0gRnJlZSB0aGUgaG9zdCBpbmZvIHJlc291cmNlcy4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqCisgKiBGcmVlIHRoZSBhbGxvY2F0ZSBob3N0IGluZm8uCisgKi8KK3ZvaWQgZW5hX2NvbV9kZWxldGVfaG9zdF9pbmZvKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21fc2V0X2hvc3RfYXR0cmlidXRlcyAtIFVwZGF0ZSB0aGUgZGV2aWNlIHdpdGggdGhlIGhvc3QKKyAqIGF0dHJpYnV0ZXMgKGRlYnVnIGFyZWEgYW5kIGhvc3QgaW5mbykgYmFzZSBhZGRyZXNzLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICoKKyAqIEByZXR1cm46IDAgb24gU3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICovCitpbnQgZW5hX2NvbV9zZXRfaG9zdF9hdHRyaWJ1dGVzKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21fY3JlYXRlX2lvX2NxIC0gQ3JlYXRlIGlvIGNvbXBsZXRpb24gcXVldWUuCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKiBAaW9fY3EgLSBpbyBjb21wbGV0aW9uIHF1ZXVlIGhhbmRsZXIKKworICogQ3JlYXRlIElPIGNvbXBsZXRpb24gcXVldWUuCisgKgorICogQHJldHVybiAtIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqLworaW50IGVuYV9jb21fY3JlYXRlX2lvX2NxKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCSBzdHJ1Y3QgZW5hX2NvbV9pb19jcSAqaW9fY3EpOworCisvKiBlbmFfY29tX2Rlc3Ryb3lfaW9fY3EgLSBEZXN0cm95IGlvIGNvbXBsZXRpb24gcXVldWUuCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKiBAaW9fY3EgLSBpbyBjb21wbGV0aW9uIHF1ZXVlIGhhbmRsZXIKKworICogRGVzdHJveSBJTyBjb21wbGV0aW9uIHF1ZXVlLgorICoKKyAqIEByZXR1cm4gLSAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBlbmFfY29tX2Rlc3Ryb3lfaW9fY3Eoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJICBzdHJ1Y3QgZW5hX2NvbV9pb19jcSAqaW9fY3EpOworCisvKiBlbmFfY29tX2V4ZWN1dGVfYWRtaW5fY29tbWFuZCAtIEV4ZWN1dGUgYWRtaW4gY29tbWFuZAorICogQGFkbWluX3F1ZXVlOiBhZG1pbiBxdWV1ZS4KKyAqIEBjbWQ6IHRoZSBhZG1pbiBjb21tYW5kIHRvIGV4ZWN1dGUuCisgKiBAY21kX3NpemU6IHRoZSBjb21tYW5kIHNpemUuCisgKiBAY21kX2NvbXBsZXRpb246IGNvbW1hbmQgY29tcGxldGlvbiByZXR1cm4gdmFsdWUuCisgKiBAY21kX2NvbXBfc2l6ZTogY29tbWFuZCBjb21wbGV0aW9uIHNpemUuCisKKyAqIFN1Ym1pdCBhbiBhZG1pbiBjb21tYW5kIGFuZCB0aGVuIHdhaXQgdW50aWwgdGhlIGRldmljZSB3aWxsIHJldHVybiBhCisgKiBjb21wbGV0aW9uLgorICogVGhlIGNvbXBsZXRpb24gd2lsbCBiZSBjb3B5ZWQgaW50byBjbWRfY29tcC4KKyAqCisgKiBAcmV0dXJuIC0gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICovCitpbnQgZW5hX2NvbV9leGVjdXRlX2FkbWluX2NvbW1hbmQoc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKmFkbWluX3F1ZXVlLAorCQkJCSAgc3RydWN0IGVuYV9hZG1pbl9hcV9lbnRyeSAqY21kLAorCQkJCSAgc2l6ZV90IGNtZF9zaXplLAorCQkJCSAgc3RydWN0IGVuYV9hZG1pbl9hY3FfZW50cnkgKmNtZF9jb21wLAorCQkJCSAgc2l6ZV90IGNtZF9jb21wX3NpemUpOworCisvKiBlbmFfY29tX2luaXRfaW50ZXJydXB0X21vZGVyYXRpb24gLSBJbml0IGludGVycnVwdCBtb2RlcmF0aW9uCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKgorICogQHJldHVybiAtIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqLworaW50IGVuYV9jb21faW5pdF9pbnRlcnJ1cHRfbW9kZXJhdGlvbihzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX2Rlc3Ryb3lfaW50ZXJydXB0X21vZGVyYXRpb24gLSBEZXN0cm95IGludGVycnVwdCBtb2RlcmF0aW9uIHJlc291cmNlcworICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICovCit2b2lkIGVuYV9jb21fZGVzdHJveV9pbnRlcnJ1cHRfbW9kZXJhdGlvbihzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX2ludGVycnVwdF9tb2RlcmF0aW9uX3N1cHBvcnRlZCAtIFJldHVybiBpZiBpbnRlcnJ1cHQgbW9kZXJhdGlvbgorICogY2FwYWJpbGl0eSBpcyBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZS4KKyAqCisgKiBAcmV0dXJuIC0gc3VwcG9ydGVkIG9yIG5vdC4KKyAqLworYm9vbCBlbmFfY29tX2ludGVycnVwdF9tb2RlcmF0aW9uX3N1cHBvcnRlZChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX2NvbmZpZ19kZWZhdWx0X2ludGVycnVwdF9tb2RlcmF0aW9uX3RhYmxlIC0gUmVzdG9yZSB0aGUgaW50ZXJydXB0CisgKiBtb2RlcmF0aW9uIHRhYmxlIGJhY2sgdG8gdGhlIGRlZmF1bHQgcGFyYW1ldGVycy4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqLwordm9pZCBlbmFfY29tX2NvbmZpZ19kZWZhdWx0X2ludGVycnVwdF9tb2RlcmF0aW9uX3RhYmxlKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21fdXBkYXRlX25vbmFkYXB0aXZlX21vZGVyYXRpb25faW50ZXJ2YWxfdHggLSBVcGRhdGUgdGhlCisgKiBub24tYWRhcHRpdmUgaW50ZXJ2YWwgaW4gVHggZGlyZWN0aW9uLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICogQHR4X2NvYWxlc2NlX3VzZWNzOiBJbnRlcnZhbCBpbiB1c2VjLgorICoKKyAqIEByZXR1cm4gLSAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBlbmFfY29tX3VwZGF0ZV9ub25hZGFwdGl2ZV9tb2RlcmF0aW9uX2ludGVydmFsX3R4KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCQkJCSAgICAgIHUzMiB0eF9jb2FsZXNjZV91c2Vjcyk7CisKKy8qIGVuYV9jb21fdXBkYXRlX25vbmFkYXB0aXZlX21vZGVyYXRpb25faW50ZXJ2YWxfcnggLSBVcGRhdGUgdGhlCisgKiBub24tYWRhcHRpdmUgaW50ZXJ2YWwgaW4gUnggZGlyZWN0aW9uLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICogQHJ4X2NvYWxlc2NlX3VzZWNzOiBJbnRlcnZhbCBpbiB1c2VjLgorICoKKyAqIEByZXR1cm4gLSAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBlbmFfY29tX3VwZGF0ZV9ub25hZGFwdGl2ZV9tb2RlcmF0aW9uX2ludGVydmFsX3J4KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCQkJCSAgICAgIHUzMiByeF9jb2FsZXNjZV91c2Vjcyk7CisKKy8qIGVuYV9jb21fZ2V0X25vbmFkYXB0aXZlX21vZGVyYXRpb25faW50ZXJ2YWxfdHggLSBSZXRyaWV2ZSB0aGUKKyAqIG5vbi1hZGFwdGl2ZSBpbnRlcnZhbCBpbiBUeCBkaXJlY3Rpb24uCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKgorICogQHJldHVybiAtIGludGVydmFsIGluIHVzZWMKKyAqLwordW5zaWduZWQgaW50IGVuYV9jb21fZ2V0X25vbmFkYXB0aXZlX21vZGVyYXRpb25faW50ZXJ2YWxfdHgoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV9nZXRfbm9uYWRhcHRpdmVfbW9kZXJhdGlvbl9pbnRlcnZhbF9yeCAtIFJldHJpZXZlIHRoZQorICogbm9uLWFkYXB0aXZlIGludGVydmFsIGluIFJ4IGRpcmVjdGlvbi4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqCisgKiBAcmV0dXJuIC0gaW50ZXJ2YWwgaW4gdXNlYworICovCit1bnNpZ25lZCBpbnQgZW5hX2NvbV9nZXRfbm9uYWRhcHRpdmVfbW9kZXJhdGlvbl9pbnRlcnZhbF9yeChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX2luaXRfaW50cl9tb2RlcmF0aW9uX2VudHJ5IC0gVXBkYXRlIGEgc2luZ2xlIGVudHJ5IGluIHRoZSBpbnRlcnJ1cHQKKyAqIG1vZGVyYXRpb24gdGFibGUuCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKiBAbGV2ZWw6IEludGVycnVwdCBtb2RlcmF0aW9uIHRhYmxlIGxldmVsCisgKiBAZW50cnk6IEVudHJ5IHZhbHVlCisgKgorICogVXBkYXRlIGEgc2luZ2xlIGVudHJ5IGluIHRoZSBpbnRlcnJ1cHQgbW9kZXJhdGlvbiB0YWJsZS4KKyAqLwordm9pZCBlbmFfY29tX2luaXRfaW50cl9tb2RlcmF0aW9uX2VudHJ5KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCQkJZW51bSBlbmFfaW50cl9tb2Rlcl9sZXZlbCBsZXZlbCwKKwkJCQkJc3RydWN0IGVuYV9pbnRyX21vZGVyX2VudHJ5ICplbnRyeSk7CisKKy8qIGVuYV9jb21fZ2V0X2ludHJfbW9kZXJhdGlvbl9lbnRyeSAtIEluaXQgZW5hX2ludHJfbW9kZXJfZW50cnkuCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKiBAbGV2ZWw6IEludGVycnVwdCBtb2RlcmF0aW9uIHRhYmxlIGxldmVsCisgKiBAZW50cnk6IEVudHJ5IHRvIGZpbGwuCisgKgorICogSW5pdGlhbGl6ZSB0aGUgZW50cnkgYWNjb3JkaW5nIHRvIHRoZSBhZGFwdGl2ZSBpbnRlcnJ1cHQgbW9kZXJhdGlvbiB0YWJsZS4KKyAqLwordm9pZCBlbmFfY29tX2dldF9pbnRyX21vZGVyYXRpb25fZW50cnkoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJCSAgICAgICBlbnVtIGVuYV9pbnRyX21vZGVyX2xldmVsIGxldmVsLAorCQkJCSAgICAgICBzdHJ1Y3QgZW5hX2ludHJfbW9kZXJfZW50cnkgKmVudHJ5KTsKKworc3RhdGljIGlubGluZSBib29sIGVuYV9jb21fZ2V0X2FkYXB0aXZlX21vZGVyYXRpb25fZW5hYmxlZChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJcmV0dXJuIGVuYV9kZXYtPmFkYXB0aXZlX2NvYWxlc2Npbmc7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFfY29tX2VuYWJsZV9hZGFwdGl2ZV9tb2RlcmF0aW9uKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwllbmFfZGV2LT5hZGFwdGl2ZV9jb2FsZXNjaW5nID0gdHJ1ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVuYV9jb21fZGlzYWJsZV9hZGFwdGl2ZV9tb2RlcmF0aW9uKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwllbmFfZGV2LT5hZGFwdGl2ZV9jb2FsZXNjaW5nID0gZmFsc2U7Cit9CisKKy8qIGVuYV9jb21fY2FsY3VsYXRlX2ludGVycnVwdF9kZWxheSAtIENhbGN1bGF0ZSBuZXcgaW50ZXJydXB0IGRlbGF5CisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKiBAcGt0czogTnVtYmVyIG9mIHBhY2tldHMgc2luY2UgdGhlIGxhc3QgdXBkYXRlCisgKiBAYnl0ZXM6IE51bWJlciBvZiBieXRlcyByZWNlaXZlZCBzaW5jZSB0aGUgbGFzdCB1cGRhdGUuCisgKiBAc21vb3RoZWRfaW50ZXJ2YWw6IFJldHVybmVkIGludGVydmFsCisgKiBAbW9kZXJfdGJsX2lkeDogQ3VycmVudCB0YWJsZSBsZXZlbCBhcyBpbnB1dCB1cGRhdGUgbmV3IGxldmVsIGFzIHJldHVybgorICogdmFsdWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFfY29tX2NhbGN1bGF0ZV9pbnRlcnJ1cHRfZGVsYXkoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgcGt0cywKKwkJCQkJCSAgICAgdW5zaWduZWQgaW50IGJ5dGVzLAorCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgKnNtb290aGVkX2ludGVydmFsLAorCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgKm1vZGVyX3RibF9pZHgpCit7CisJZW51bSBlbmFfaW50cl9tb2Rlcl9sZXZlbCBjdXJyX21vZGVyX2lkeCwgbmV3X21vZGVyX2lkeDsKKwlzdHJ1Y3QgZW5hX2ludHJfbW9kZXJfZW50cnkgKmN1cnJfbW9kZXJfZW50cnk7CisJc3RydWN0IGVuYV9pbnRyX21vZGVyX2VudHJ5ICpwcmVkX21vZGVyX2VudHJ5OworCXN0cnVjdCBlbmFfaW50cl9tb2Rlcl9lbnRyeSAqbmV3X21vZGVyX2VudHJ5OworCXN0cnVjdCBlbmFfaW50cl9tb2Rlcl9lbnRyeSAqaW50cl9tb2Rlcl90YmwgPSBlbmFfZGV2LT5pbnRyX21vZGVyX3RibDsKKwl1bnNpZ25lZCBpbnQgaW50ZXJ2YWw7CisKKwkvKiBXZSBhcHBseSBhZGFwdGl2ZSBtb2RlcmF0aW9uIG9uIFJ4IHBhdGggb25seS4KKwkgKiBUeCB1c2VzIHN0YXRpYyBpbnRlcnJ1cHQgbW9kZXJhdGlvbi4KKwkgKi8KKwlpZiAoIXBrdHMgfHwgIWJ5dGVzKQorCQkvKiBUeCBpbnRlcnJ1cHQsIG9yIHNwdXJpb3VzIGludGVycnVwdCwKKwkJICogaW4gYm90aCBjYXNlcyB3ZSBqdXN0IHVzZSBzYW1lIGRlbGF5IHZhbHVlcworCQkgKi8KKwkJcmV0dXJuOworCisJY3Vycl9tb2Rlcl9pZHggPSAoZW51bSBlbmFfaW50cl9tb2Rlcl9sZXZlbCkoKm1vZGVyX3RibF9pZHgpOworCWlmICh1bmxpa2VseShjdXJyX21vZGVyX2lkeCA+PSBFTkFfSU5UUl9NQVhfTlVNX09GX0xFVkVMUykpIHsKKwkJcHJfZXJyKCJXcm9uZyBtb2RlcmF0aW9uIGluZGV4ICV1XG4iLCBjdXJyX21vZGVyX2lkeCk7CisJCXJldHVybjsKKwl9CisKKwljdXJyX21vZGVyX2VudHJ5ID0gJmludHJfbW9kZXJfdGJsW2N1cnJfbW9kZXJfaWR4XTsKKwluZXdfbW9kZXJfaWR4ID0gY3Vycl9tb2Rlcl9pZHg7CisKKwlpZiAoY3Vycl9tb2Rlcl9pZHggPT0gRU5BX0lOVFJfTU9ERVJfTE9XRVNUKSB7CisJCWlmICgocGt0cyA+IGN1cnJfbW9kZXJfZW50cnktPnBrdHNfcGVyX2ludGVydmFsKSB8fAorCQkgICAgKGJ5dGVzID4gY3Vycl9tb2Rlcl9lbnRyeS0+Ynl0ZXNfcGVyX2ludGVydmFsKSkKKwkJCW5ld19tb2Rlcl9pZHggPQorCQkJCShlbnVtIGVuYV9pbnRyX21vZGVyX2xldmVsKShjdXJyX21vZGVyX2lkeCArIEVOQV9JTlRSX01PREVSX0xFVkVMX1NUUklERSk7CisJfSBlbHNlIHsKKwkJcHJlZF9tb2Rlcl9lbnRyeSA9ICZpbnRyX21vZGVyX3RibFtjdXJyX21vZGVyX2lkeCAtIEVOQV9JTlRSX01PREVSX0xFVkVMX1NUUklERV07CisKKwkJaWYgKChwa3RzIDw9IHByZWRfbW9kZXJfZW50cnktPnBrdHNfcGVyX2ludGVydmFsKSB8fAorCQkgICAgKGJ5dGVzIDw9IHByZWRfbW9kZXJfZW50cnktPmJ5dGVzX3Blcl9pbnRlcnZhbCkpCisJCQluZXdfbW9kZXJfaWR4ID0KKwkJCQkoZW51bSBlbmFfaW50cl9tb2Rlcl9sZXZlbCkoY3Vycl9tb2Rlcl9pZHggLSBFTkFfSU5UUl9NT0RFUl9MRVZFTF9TVFJJREUpOworCQllbHNlIGlmICgocGt0cyA+IGN1cnJfbW9kZXJfZW50cnktPnBrdHNfcGVyX2ludGVydmFsKSB8fAorCQkJIChieXRlcyA+IGN1cnJfbW9kZXJfZW50cnktPmJ5dGVzX3Blcl9pbnRlcnZhbCkpIHsKKwkJCWlmIChjdXJyX21vZGVyX2lkeCAhPSBFTkFfSU5UUl9NT0RFUl9ISUdIRVNUKQorCQkJCW5ld19tb2Rlcl9pZHggPQorCQkJCQkoZW51bSBlbmFfaW50cl9tb2Rlcl9sZXZlbCkoY3Vycl9tb2Rlcl9pZHggKyBFTkFfSU5UUl9NT0RFUl9MRVZFTF9TVFJJREUpOworCQl9CisJfQorCW5ld19tb2Rlcl9lbnRyeSA9ICZpbnRyX21vZGVyX3RibFtuZXdfbW9kZXJfaWR4XTsKKworCWludGVydmFsID0gbmV3X21vZGVyX2VudHJ5LT5pbnRyX21vZGVyX2ludGVydmFsOworCSpzbW9vdGhlZF9pbnRlcnZhbCA9ICgKKwkJKGludGVydmFsICogRU5BX0lOVFJfREVMQVlfTkVXX1ZBTFVFX1dFSUdIVCArCisJCUVOQV9JTlRSX0RFTEFZX09MRF9WQUxVRV9XRUlHSFQgKiAoKnNtb290aGVkX2ludGVydmFsKSkgKyA1KSAvCisJCTEwOworCisJKm1vZGVyX3RibF9pZHggPSBuZXdfbW9kZXJfaWR4OworfQorCisvKiBlbmFfY29tX3VwZGF0ZV9pbnRyX3JlZyAtIFByZXBhcmUgaW50ZXJydXB0IHJlZ2lzdGVyCisgKiBAaW50cl9yZWc6IGludGVycnVwdCByZWdpc3RlciB0byB1cGRhdGUuCisgKiBAcnhfZGVsYXlfaW50ZXJ2YWw6IFJ4IGludGVydmFsIGluIHVzZWNzCisgKiBAdHhfZGVsYXlfaW50ZXJ2YWw6IFR4IGludGVydmFsIGluIHVzZWNzCisgKiBAdW5tYXNrOiB1bmFzayBlbmFibGUvZGlzYWJsZQorICoKKyAqIFByZXBhcmUgaW50ZXJydXB0IHVwZGF0ZSByZWdpc3RlciB3aXRoIHRoZSBzdXBwbGllZCBwYXJhbWV0ZXJzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZW5hX2NvbV91cGRhdGVfaW50cl9yZWcoc3RydWN0IGVuYV9ldGhfaW9faW50cl9yZWcgKmludHJfcmVnLAorCQkJCQkgICB1MzIgcnhfZGVsYXlfaW50ZXJ2YWwsCisJCQkJCSAgIHUzMiB0eF9kZWxheV9pbnRlcnZhbCwKKwkJCQkJICAgYm9vbCB1bm1hc2spCit7CisJaW50cl9yZWctPmludHJfY29udHJvbCA9IDA7CisJaW50cl9yZWctPmludHJfY29udHJvbCB8PSByeF9kZWxheV9pbnRlcnZhbCAmCisJCUVOQV9FVEhfSU9fSU5UUl9SRUdfUlhfSU5UUl9ERUxBWV9NQVNLOworCisJaW50cl9yZWctPmludHJfY29udHJvbCB8PQorCQkodHhfZGVsYXlfaW50ZXJ2YWwgPDwgRU5BX0VUSF9JT19JTlRSX1JFR19UWF9JTlRSX0RFTEFZX1NISUZUKQorCQkmIEVOQV9FVEhfSU9fSU5UUl9SRUdfVFhfSU5UUl9ERUxBWV9NQVNLOworCisJaWYgKHVubWFzaykKKwkJaW50cl9yZWctPmludHJfY29udHJvbCB8PSBFTkFfRVRIX0lPX0lOVFJfUkVHX0lOVFJfVU5NQVNLX01BU0s7Cit9CisKKyNlbmRpZiAvKiAhKEVOQV9DT00pICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9jb21tb25fZGVmcy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfY29tbW9uX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjhkNzM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfY29tbW9uX2RlZnMuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgLSAyMDE2IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKyNpZm5kZWYgX0VOQV9DT01NT05fSF8KKyNkZWZpbmUgX0VOQV9DT01NT05fSF8KKworI2RlZmluZSBFTkFfQ09NTU9OX1NQRUNfVkVSU0lPTl9NQUpPUgkwIC8qICAqLworI2RlZmluZSBFTkFfQ09NTU9OX1NQRUNfVkVSU0lPTl9NSU5PUgkxMCAvKiAgKi8KKworLyogRU5BIG9wZXJhdGVzIHdpdGggNDgtYml0IG1lbW9yeSBhZGRyZXNzZXMuIGVuYV9tZW1fYWRkcl90ICovCitzdHJ1Y3QgZW5hX2NvbW1vbl9tZW1fYWRkciB7CisJdTMyIG1lbV9hZGRyX2xvdzsKKworCXUxNiBtZW1fYWRkcl9oaWdoOworCisJLyogTUJaICovCisJdTE2IHJlc2VydmVkMTY7Cit9OworCisjZW5kaWYgLypfRU5BX0NPTU1PTl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfZXRoX2NvbS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfZXRoX2NvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOWM1MzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9ldGhfY29tLmMKQEAgLTAsMCArMSw1MDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJlbmFfZXRoX2NvbS5oIgorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBlbmFfZXRoX2lvX3J4X2NkZXNjX2Jhc2UgKmVuYV9jb21fZ2V0X25leHRfcnhfY2Rlc2MoCisJc3RydWN0IGVuYV9jb21faW9fY3EgKmlvX2NxKQoreworCXN0cnVjdCBlbmFfZXRoX2lvX3J4X2NkZXNjX2Jhc2UgKmNkZXNjOworCXUxNiBleHBlY3RlZF9waGFzZSwgaGVhZF9tYXNrZWQ7CisJdTE2IGRlc2NfcGhhc2U7CisKKwloZWFkX21hc2tlZCA9IGlvX2NxLT5oZWFkICYgKGlvX2NxLT5xX2RlcHRoIC0gMSk7CisJZXhwZWN0ZWRfcGhhc2UgPSBpb19jcS0+cGhhc2U7CisKKwljZGVzYyA9IChzdHJ1Y3QgZW5hX2V0aF9pb19yeF9jZGVzY19iYXNlICopKGlvX2NxLT5jZGVzY19hZGRyLnZpcnRfYWRkcgorCQkJKyAoaGVhZF9tYXNrZWQgKiBpb19jcS0+Y2Rlc2NfZW50cnlfc2l6ZV9pbl9ieXRlcykpOworCisJZGVzY19waGFzZSA9IChjZGVzYy0+c3RhdHVzICYgRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX1BIQVNFX01BU0spID4+CisJCQlFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfUEhBU0VfU0hJRlQ7CisKKwlpZiAoZGVzY19waGFzZSAhPSBleHBlY3RlZF9waGFzZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gY2Rlc2M7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFfY29tX2NxX2luY19oZWFkKHN0cnVjdCBlbmFfY29tX2lvX2NxICppb19jcSkKK3sKKwlpb19jcS0+aGVhZCsrOworCisJLyogU3dpdGNoIHBoYXNlIGJpdCBpbiBjYXNlIG9mIHdyYXAgYXJvdW5kICovCisJaWYgKHVubGlrZWx5KChpb19jcS0+aGVhZCAmIChpb19jcS0+cV9kZXB0aCAtIDEpKSA9PSAwKSkKKwkJaW9fY3EtPnBoYXNlIF49IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqZ2V0X3NxX2Rlc2Moc3RydWN0IGVuYV9jb21faW9fc3EgKmlvX3NxKQoreworCXUxNiB0YWlsX21hc2tlZDsKKwl1MzIgb2Zmc2V0OworCisJdGFpbF9tYXNrZWQgPSBpb19zcS0+dGFpbCAmIChpb19zcS0+cV9kZXB0aCAtIDEpOworCisJb2Zmc2V0ID0gdGFpbF9tYXNrZWQgKiBpb19zcS0+ZGVzY19lbnRyeV9zaXplOworCisJcmV0dXJuICh2b2lkICopKCh1aW50cHRyX3QpaW9fc3EtPmRlc2NfYWRkci52aXJ0X2FkZHIgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5hX2NvbV9jb3B5X2N1cnJfc3FfZGVzY190b19kZXYoc3RydWN0IGVuYV9jb21faW9fc3EgKmlvX3NxKQoreworCXUxNiB0YWlsX21hc2tlZCA9IGlvX3NxLT50YWlsICYgKGlvX3NxLT5xX2RlcHRoIC0gMSk7CisJdTMyIG9mZnNldCA9IHRhaWxfbWFza2VkICogaW9fc3EtPmRlc2NfZW50cnlfc2l6ZTsKKworCS8qIEluIGNhc2UgdGhpcyBxdWV1ZSBpc24ndCBhIExMUSAqLworCWlmIChpb19zcS0+bWVtX3F1ZXVlX3R5cGUgPT0gRU5BX0FETUlOX1BMQUNFTUVOVF9QT0xJQ1lfSE9TVCkKKwkJcmV0dXJuOworCisJbWVtY3B5X3RvaW8oaW9fc3EtPmRlc2NfYWRkci5wYnVmX2Rldl9hZGRyICsgb2Zmc2V0LAorCQkgICAgaW9fc3EtPmRlc2NfYWRkci52aXJ0X2FkZHIgKyBvZmZzZXQsCisJCSAgICBpb19zcS0+ZGVzY19lbnRyeV9zaXplKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVuYV9jb21fc3FfdXBkYXRlX3RhaWwoc3RydWN0IGVuYV9jb21faW9fc3EgKmlvX3NxKQoreworCWlvX3NxLT50YWlsKys7CisKKwkvKiBTd2l0Y2ggcGhhc2UgYml0IGluIGNhc2Ugb2Ygd3JhcCBhcm91bmQgKi8KKwlpZiAodW5saWtlbHkoKGlvX3NxLT50YWlsICYgKGlvX3NxLT5xX2RlcHRoIC0gMSkpID09IDApKQorCQlpb19zcS0+cGhhc2UgXj0gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZW5hX2NvbV93cml0ZV9oZWFkZXIoc3RydWN0IGVuYV9jb21faW9fc3EgKmlvX3NxLAorCQkJCSAgICAgICB1OCAqaGVhZF9zcmMsIHUxNiBoZWFkZXJfbGVuKQoreworCXUxNiB0YWlsX21hc2tlZCA9IGlvX3NxLT50YWlsICYgKGlvX3NxLT5xX2RlcHRoIC0gMSk7CisJdTggX19pb21lbSAqZGV2X2hlYWRfYWRkciA9CisJCWlvX3NxLT5oZWFkZXJfYWRkciArICh0YWlsX21hc2tlZCAqIGlvX3NxLT50eF9tYXhfaGVhZGVyX3NpemUpOworCisJaWYgKGlvX3NxLT5tZW1fcXVldWVfdHlwZSA9PSBFTkFfQURNSU5fUExBQ0VNRU5UX1BPTElDWV9IT1NUKQorCQlyZXR1cm4gMDsKKworCWlmICh1bmxpa2VseSghaW9fc3EtPmhlYWRlcl9hZGRyKSkgeworCQlwcl9lcnIoIlB1c2ggYnVmZmVyIGhlYWRlciBwdHIgaXMgTlVMTFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1lbWNweV90b2lvKGRldl9oZWFkX2FkZHIsIGhlYWRfc3JjLCBoZWFkZXJfbGVuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBlbmFfZXRoX2lvX3J4X2NkZXNjX2Jhc2UgKgorCWVuYV9jb21fcnhfY2Rlc2NfaWR4X3RvX3B0cihzdHJ1Y3QgZW5hX2NvbV9pb19jcSAqaW9fY3EsIHUxNiBpZHgpCit7CisJaWR4ICY9IChpb19jcS0+cV9kZXB0aCAtIDEpOworCXJldHVybiAoc3RydWN0IGVuYV9ldGhfaW9fcnhfY2Rlc2NfYmFzZSAqKQorCQkoKHVpbnRwdHJfdClpb19jcS0+Y2Rlc2NfYWRkci52aXJ0X2FkZHIgKworCQlpZHggKiBpb19jcS0+Y2Rlc2NfZW50cnlfc2l6ZV9pbl9ieXRlcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGVuYV9jb21fY2Rlc2NfcnhfcGt0X2dldChzdHJ1Y3QgZW5hX2NvbV9pb19jcSAqaW9fY3EsCisJCQkJCSAgIHUxNiAqZmlyc3RfY2Rlc2NfaWR4KQoreworCXN0cnVjdCBlbmFfZXRoX2lvX3J4X2NkZXNjX2Jhc2UgKmNkZXNjOworCXUxNiBjb3VudCA9IDAsIGhlYWRfbWFza2VkOworCXUzMiBsYXN0ID0gMDsKKworCWRvIHsKKwkJY2Rlc2MgPSBlbmFfY29tX2dldF9uZXh0X3J4X2NkZXNjKGlvX2NxKTsKKwkJaWYgKCFjZGVzYykKKwkJCWJyZWFrOworCisJCWVuYV9jb21fY3FfaW5jX2hlYWQoaW9fY3EpOworCQljb3VudCsrOworCQlsYXN0ID0gKGNkZXNjLT5zdGF0dXMgJiBFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfTEFTVF9NQVNLKSA+PgorCQkJRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0xBU1RfU0hJRlQ7CisJfSB3aGlsZSAoIWxhc3QpOworCisJaWYgKGxhc3QpIHsKKwkJKmZpcnN0X2NkZXNjX2lkeCA9IGlvX2NxLT5jdXJfcnhfcGt0X2NkZXNjX3N0YXJ0X2lkeDsKKwkJY291bnQgKz0gaW9fY3EtPmN1cl9yeF9wa3RfY2Rlc2NfY291bnQ7CisKKwkJaGVhZF9tYXNrZWQgPSBpb19jcS0+aGVhZCAmIChpb19jcS0+cV9kZXB0aCAtIDEpOworCisJCWlvX2NxLT5jdXJfcnhfcGt0X2NkZXNjX2NvdW50ID0gMDsKKwkJaW9fY3EtPmN1cl9yeF9wa3RfY2Rlc2Nfc3RhcnRfaWR4ID0gaGVhZF9tYXNrZWQ7CisKKwkJcHJfZGVidWcoImVuYSBxX2lkOiAlZCBwYWNrZXRzIHdlcmUgY29tcGxldGVkLiBmaXJzdCBkZXNjIGlkeCAldSBkZXNjcyMgJWRcbiIsCisJCQkgaW9fY3EtPnFpZCwgKmZpcnN0X2NkZXNjX2lkeCwgY291bnQpOworCX0gZWxzZSB7CisJCWlvX2NxLT5jdXJfcnhfcGt0X2NkZXNjX2NvdW50ICs9IGNvdW50OworCQljb3VudCA9IDA7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgZW5hX2NvbV9tZXRhX2Rlc2NfY2hhbmdlZChzdHJ1Y3QgZW5hX2NvbV9pb19zcSAqaW9fc3EsCisJCQkJCSAgICAgc3RydWN0IGVuYV9jb21fdHhfY3R4ICplbmFfdHhfY3R4KQoreworCWludCByYzsKKworCWlmIChlbmFfdHhfY3R4LT5tZXRhX3ZhbGlkKSB7CisJCXJjID0gbWVtY21wKCZpb19zcS0+Y2FjaGVkX3R4X21ldGEsCisJCQkgICAgJmVuYV90eF9jdHgtPmVuYV9tZXRhLAorCQkJICAgIHNpemVvZihzdHJ1Y3QgZW5hX2NvbV90eF9tZXRhKSk7CisKKwkJaWYgKHVubGlrZWx5KHJjICE9IDApKQorCQkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5hX2NvbV9jcmVhdGVfYW5kX3N0b3JlX3R4X21ldGFfZGVzYyhzdHJ1Y3QgZW5hX2NvbV9pb19zcSAqaW9fc3EsCisJCQkJCQkJIHN0cnVjdCBlbmFfY29tX3R4X2N0eCAqZW5hX3R4X2N0eCkKK3sKKwlzdHJ1Y3QgZW5hX2V0aF9pb190eF9tZXRhX2Rlc2MgKm1ldGFfZGVzYyA9IE5VTEw7CisJc3RydWN0IGVuYV9jb21fdHhfbWV0YSAqZW5hX21ldGEgPSAmZW5hX3R4X2N0eC0+ZW5hX21ldGE7CisKKwltZXRhX2Rlc2MgPSBnZXRfc3FfZGVzYyhpb19zcSk7CisJbWVtc2V0KG1ldGFfZGVzYywgMHgwLCBzaXplb2Yoc3RydWN0IGVuYV9ldGhfaW9fdHhfbWV0YV9kZXNjKSk7CisKKwltZXRhX2Rlc2MtPmxlbl9jdHJsIHw9IEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX01FVEFfREVTQ19NQVNLOworCisJbWV0YV9kZXNjLT5sZW5fY3RybCB8PSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19FWFRfVkFMSURfTUFTSzsKKworCS8qIGJpdHMgMC05IG9mIHRoZSBtc3MgKi8KKwltZXRhX2Rlc2MtPndvcmQyIHw9IChlbmFfbWV0YS0+bXNzIDw8CisJCUVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX01TU19MT19TSElGVCkgJgorCQlFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19NU1NfTE9fTUFTSzsKKwkvKiBiaXRzIDEwLTEzIG9mIHRoZSBtc3MgKi8KKwltZXRhX2Rlc2MtPmxlbl9jdHJsIHw9ICgoZW5hX21ldGEtPm1zcyA+PiAxMCkgPDwKKwkJRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfTVNTX0hJX1NISUZUKSAmCisJCUVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX01TU19ISV9NQVNLOworCisJLyogRXh0ZW5kZWQgbWV0YSBkZXNjICovCisJbWV0YV9kZXNjLT5sZW5fY3RybCB8PSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19FVEhfTUVUQV9UWVBFX01BU0s7CisJbWV0YV9kZXNjLT5sZW5fY3RybCB8PSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19NRVRBX1NUT1JFX01BU0s7CisJbWV0YV9kZXNjLT5sZW5fY3RybCB8PSAoaW9fc3EtPnBoYXNlIDw8CisJCUVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX1BIQVNFX1NISUZUKSAmCisJCUVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX1BIQVNFX01BU0s7CisKKwltZXRhX2Rlc2MtPmxlbl9jdHJsIHw9IEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX0ZJUlNUX01BU0s7CisJbWV0YV9kZXNjLT53b3JkMiB8PSBlbmFfbWV0YS0+bDNfaGRyX2xlbiAmCisJCUVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX0wzX0hEUl9MRU5fTUFTSzsKKwltZXRhX2Rlc2MtPndvcmQyIHw9IChlbmFfbWV0YS0+bDNfaGRyX29mZnNldCA8PAorCQlFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19MM19IRFJfT0ZGX1NISUZUKSAmCisJCUVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX0wzX0hEUl9PRkZfTUFTSzsKKworCW1ldGFfZGVzYy0+d29yZDIgfD0gKGVuYV9tZXRhLT5sNF9oZHJfbGVuIDw8CisJCUVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX0w0X0hEUl9MRU5fSU5fV09SRFNfU0hJRlQpICYKKwkJRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfTDRfSERSX0xFTl9JTl9XT1JEU19NQVNLOworCisJbWV0YV9kZXNjLT5sZW5fY3RybCB8PSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19NRVRBX1NUT1JFX01BU0s7CisKKwkvKiBDYWNoZWQgdGhlIG1ldGEgZGVzYyAqLworCW1lbWNweSgmaW9fc3EtPmNhY2hlZF90eF9tZXRhLCBlbmFfbWV0YSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBlbmFfY29tX3R4X21ldGEpKTsKKworCWVuYV9jb21fY29weV9jdXJyX3NxX2Rlc2NfdG9fZGV2KGlvX3NxKTsKKwllbmFfY29tX3NxX3VwZGF0ZV90YWlsKGlvX3NxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVuYV9jb21fcnhfc2V0X2ZsYWdzKHN0cnVjdCBlbmFfY29tX3J4X2N0eCAqZW5hX3J4X2N0eCwKKwkJCQkJc3RydWN0IGVuYV9ldGhfaW9fcnhfY2Rlc2NfYmFzZSAqY2Rlc2MpCit7CisJZW5hX3J4X2N0eC0+bDNfcHJvdG8gPSBjZGVzYy0+c3RhdHVzICYKKwkJRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0wzX1BST1RPX0lEWF9NQVNLOworCWVuYV9yeF9jdHgtPmw0X3Byb3RvID0KKwkJKGNkZXNjLT5zdGF0dXMgJiBFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfTDRfUFJPVE9fSURYX01BU0spID4+CisJCUVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9MNF9QUk9UT19JRFhfU0hJRlQ7CisJZW5hX3J4X2N0eC0+bDNfY3N1bV9lcnIgPQorCQkoY2Rlc2MtPnN0YXR1cyAmIEVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9MM19DU1VNX0VSUl9NQVNLKSA+PgorCQlFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfTDNfQ1NVTV9FUlJfU0hJRlQ7CisJZW5hX3J4X2N0eC0+bDRfY3N1bV9lcnIgPQorCQkoY2Rlc2MtPnN0YXR1cyAmIEVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9MNF9DU1VNX0VSUl9NQVNLKSA+PgorCQlFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfTDRfQ1NVTV9FUlJfU0hJRlQ7CisJZW5hX3J4X2N0eC0+aGFzaCA9IGNkZXNjLT5oYXNoOworCWVuYV9yeF9jdHgtPmZyYWcgPQorCQkoY2Rlc2MtPnN0YXR1cyAmIEVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9JUFY0X0ZSQUdfTUFTSykgPj4KKwkJRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0lQVjRfRlJBR19TSElGVDsKKworCXByX2RlYnVnKCJlbmFfcnhfY3R4LT5sM19wcm90byAlZCBlbmFfcnhfY3R4LT5sNF9wcm90byAlZFxuZW5hX3J4X2N0eC0+bDNfY3N1bV9lcnIgJWQgZW5hX3J4X2N0eC0+bDRfY3N1bV9lcnIgJWRcbmhhc2ggZnJhZyAlZCBmcmFnOiAlZCBjZGVzY19zdGF0dXM6ICV4XG4iLAorCQkgZW5hX3J4X2N0eC0+bDNfcHJvdG8sIGVuYV9yeF9jdHgtPmw0X3Byb3RvLAorCQkgZW5hX3J4X2N0eC0+bDNfY3N1bV9lcnIsIGVuYV9yeF9jdHgtPmw0X2NzdW1fZXJyLAorCQkgZW5hX3J4X2N0eC0+aGFzaCwgZW5hX3J4X2N0eC0+ZnJhZywgY2Rlc2MtPnN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgQVBJICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IGVuYV9jb21fcHJlcGFyZV90eChzdHJ1Y3QgZW5hX2NvbV9pb19zcSAqaW9fc3EsCisJCSAgICAgICBzdHJ1Y3QgZW5hX2NvbV90eF9jdHggKmVuYV90eF9jdHgsCisJCSAgICAgICBpbnQgKm5iX2h3X2Rlc2MpCit7CisJc3RydWN0IGVuYV9ldGhfaW9fdHhfZGVzYyAqZGVzYyA9IE5VTEw7CisJc3RydWN0IGVuYV9jb21fYnVmICplbmFfYnVmcyA9IGVuYV90eF9jdHgtPmVuYV9idWZzOworCXZvaWQgKnB1c2hfaGVhZGVyID0gZW5hX3R4X2N0eC0+cHVzaF9oZWFkZXI7CisJdTE2IGhlYWRlcl9sZW4gPSBlbmFfdHhfY3R4LT5oZWFkZXJfbGVuOworCXUxNiBudW1fYnVmcyA9IGVuYV90eF9jdHgtPm51bV9idWZzOworCWludCB0b3RhbF9kZXNjLCBpLCByYzsKKwlib29sIGhhdmVfbWV0YTsKKwl1NjQgYWRkcl9oaTsKKworCVdBUk4oaW9fc3EtPmRpcmVjdGlvbiAhPSBFTkFfQ09NX0lPX1FVRVVFX0RJUkVDVElPTl9UWCwgIndyb25nIFEgdHlwZSIpOworCisJLyogbnVtX2J1ZnMgKzEgZm9yIHBvdGVudGlhbCBtZXRhIGRlc2MgKi8KKwlpZiAoZW5hX2NvbV9zcV9lbXB0eV9zcGFjZShpb19zcSkgPCAobnVtX2J1ZnMgKyAxKSkgeworCQlwcl9lcnIoIk5vdCBlbm91Z2ggc3BhY2UgaW4gdGhlIHR4IHF1ZXVlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKHVubGlrZWx5KGhlYWRlcl9sZW4gPiBpb19zcS0+dHhfbWF4X2hlYWRlcl9zaXplKSkgeworCQlwcl9lcnIoImhlYWRlciBzaXplIGlzIHRvbyBsYXJnZSAlZCBtYXggaGVhZGVyOiAlZFxuIiwKKwkJICAgICAgIGhlYWRlcl9sZW4sIGlvX3NxLT50eF9tYXhfaGVhZGVyX3NpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBzdGFydCB3aXRoIHB1c2hpbmcgdGhlIGhlYWRlciAoaWYgbmVlZGVkKSAqLworCXJjID0gZW5hX2NvbV93cml0ZV9oZWFkZXIoaW9fc3EsIHB1c2hfaGVhZGVyLCBoZWFkZXJfbGVuKTsKKwlpZiAodW5saWtlbHkocmMpKQorCQlyZXR1cm4gcmM7CisKKwloYXZlX21ldGEgPSBlbmFfdHhfY3R4LT5tZXRhX3ZhbGlkICYmIGVuYV9jb21fbWV0YV9kZXNjX2NoYW5nZWQoaW9fc3EsCisJCQllbmFfdHhfY3R4KTsKKwlpZiAoaGF2ZV9tZXRhKQorCQllbmFfY29tX2NyZWF0ZV9hbmRfc3RvcmVfdHhfbWV0YV9kZXNjKGlvX3NxLCBlbmFfdHhfY3R4KTsKKworCS8qIElmIHRoZSBjYWxsZXIgZG9lc24ndCB3YW50IHNlbmQgcGFja2V0cyAqLworCWlmICh1bmxpa2VseSghbnVtX2J1ZnMgJiYgIWhlYWRlcl9sZW4pKSB7CisJCSpuYl9od19kZXNjID0gaGF2ZV9tZXRhID8gMCA6IDE7CisJCXJldHVybiAwOworCX0KKworCWRlc2MgPSBnZXRfc3FfZGVzYyhpb19zcSk7CisJbWVtc2V0KGRlc2MsIDB4MCwgc2l6ZW9mKHN0cnVjdCBlbmFfZXRoX2lvX3R4X2Rlc2MpKTsKKworCS8qIFNldCBmaXJzdCBkZXNjIHdoZW4gd2UgZG9uJ3QgaGF2ZSBtZXRhIGRlc2NyaXB0b3IgKi8KKwlpZiAoIWhhdmVfbWV0YSkKKwkJZGVzYy0+bGVuX2N0cmwgfD0gRU5BX0VUSF9JT19UWF9ERVNDX0ZJUlNUX01BU0s7CisKKwlkZXNjLT5idWZmX2FkZHJfaGlfaGRyX3N6IHw9IChoZWFkZXJfbGVuIDw8CisJCUVOQV9FVEhfSU9fVFhfREVTQ19IRUFERVJfTEVOR1RIX1NISUZUKSAmCisJCUVOQV9FVEhfSU9fVFhfREVTQ19IRUFERVJfTEVOR1RIX01BU0s7CisJZGVzYy0+bGVuX2N0cmwgfD0gKGlvX3NxLT5waGFzZSA8PCBFTkFfRVRIX0lPX1RYX0RFU0NfUEhBU0VfU0hJRlQpICYKKwkJRU5BX0VUSF9JT19UWF9ERVNDX1BIQVNFX01BU0s7CisKKwlkZXNjLT5sZW5fY3RybCB8PSBFTkFfRVRIX0lPX1RYX0RFU0NfQ09NUF9SRVFfTUFTSzsKKworCS8qIEJpdHMgMC05ICovCisJZGVzYy0+bWV0YV9jdHJsIHw9IChlbmFfdHhfY3R4LT5yZXFfaWQgPDwKKwkJRU5BX0VUSF9JT19UWF9ERVNDX1JFUV9JRF9MT19TSElGVCkgJgorCQlFTkFfRVRIX0lPX1RYX0RFU0NfUkVRX0lEX0xPX01BU0s7CisKKwlkZXNjLT5tZXRhX2N0cmwgfD0gKGVuYV90eF9jdHgtPmRmIDw8CisJCUVOQV9FVEhfSU9fVFhfREVTQ19ERl9TSElGVCkgJgorCQlFTkFfRVRIX0lPX1RYX0RFU0NfREZfTUFTSzsKKworCS8qIEJpdHMgMTAtMTUgKi8KKwlkZXNjLT5sZW5fY3RybCB8PSAoKGVuYV90eF9jdHgtPnJlcV9pZCA+PiAxMCkgPDwKKwkJRU5BX0VUSF9JT19UWF9ERVNDX1JFUV9JRF9ISV9TSElGVCkgJgorCQlFTkFfRVRIX0lPX1RYX0RFU0NfUkVRX0lEX0hJX01BU0s7CisKKwlpZiAoZW5hX3R4X2N0eC0+bWV0YV92YWxpZCkgeworCQlkZXNjLT5tZXRhX2N0cmwgfD0gKGVuYV90eF9jdHgtPnRzb19lbmFibGUgPDwKKwkJCUVOQV9FVEhfSU9fVFhfREVTQ19UU09fRU5fU0hJRlQpICYKKwkJCUVOQV9FVEhfSU9fVFhfREVTQ19UU09fRU5fTUFTSzsKKwkJZGVzYy0+bWV0YV9jdHJsIHw9IGVuYV90eF9jdHgtPmwzX3Byb3RvICYKKwkJCUVOQV9FVEhfSU9fVFhfREVTQ19MM19QUk9UT19JRFhfTUFTSzsKKwkJZGVzYy0+bWV0YV9jdHJsIHw9IChlbmFfdHhfY3R4LT5sNF9wcm90byA8PAorCQkJRU5BX0VUSF9JT19UWF9ERVNDX0w0X1BST1RPX0lEWF9TSElGVCkgJgorCQkJRU5BX0VUSF9JT19UWF9ERVNDX0w0X1BST1RPX0lEWF9NQVNLOworCQlkZXNjLT5tZXRhX2N0cmwgfD0gKGVuYV90eF9jdHgtPmwzX2NzdW1fZW5hYmxlIDw8CisJCQlFTkFfRVRIX0lPX1RYX0RFU0NfTDNfQ1NVTV9FTl9TSElGVCkgJgorCQkJRU5BX0VUSF9JT19UWF9ERVNDX0wzX0NTVU1fRU5fTUFTSzsKKwkJZGVzYy0+bWV0YV9jdHJsIHw9IChlbmFfdHhfY3R4LT5sNF9jc3VtX2VuYWJsZSA8PAorCQkJRU5BX0VUSF9JT19UWF9ERVNDX0w0X0NTVU1fRU5fU0hJRlQpICYKKwkJCUVOQV9FVEhfSU9fVFhfREVTQ19MNF9DU1VNX0VOX01BU0s7CisJCWRlc2MtPm1ldGFfY3RybCB8PSAoZW5hX3R4X2N0eC0+bDRfY3N1bV9wYXJ0aWFsIDw8CisJCQlFTkFfRVRIX0lPX1RYX0RFU0NfTDRfQ1NVTV9QQVJUSUFMX1NISUZUKSAmCisJCQlFTkFfRVRIX0lPX1RYX0RFU0NfTDRfQ1NVTV9QQVJUSUFMX01BU0s7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9idWZzOyBpKyspIHsKKwkJLyogVGhlIGZpcnN0IGRlc2Mgc2hhcmUgdGhlIHNhbWUgZGVzYyBhcyB0aGUgaGVhZGVyICovCisJCWlmIChsaWtlbHkoaSAhPSAwKSkgeworCQkJZW5hX2NvbV9jb3B5X2N1cnJfc3FfZGVzY190b19kZXYoaW9fc3EpOworCQkJZW5hX2NvbV9zcV91cGRhdGVfdGFpbChpb19zcSk7CisKKwkJCWRlc2MgPSBnZXRfc3FfZGVzYyhpb19zcSk7CisJCQltZW1zZXQoZGVzYywgMHgwLCBzaXplb2Yoc3RydWN0IGVuYV9ldGhfaW9fdHhfZGVzYykpOworCisJCQlkZXNjLT5sZW5fY3RybCB8PSAoaW9fc3EtPnBoYXNlIDw8CisJCQkJRU5BX0VUSF9JT19UWF9ERVNDX1BIQVNFX1NISUZUKSAmCisJCQkJRU5BX0VUSF9JT19UWF9ERVNDX1BIQVNFX01BU0s7CisJCX0KKworCQlkZXNjLT5sZW5fY3RybCB8PSBlbmFfYnVmcy0+bGVuICYKKwkJCUVOQV9FVEhfSU9fVFhfREVTQ19MRU5HVEhfTUFTSzsKKworCQlhZGRyX2hpID0gKChlbmFfYnVmcy0+cGFkZHIgJgorCQkJR0VOTUFTS19VTEwoaW9fc3EtPmRtYV9hZGRyX2JpdHMgLSAxLCAzMikpID4+IDMyKTsKKworCQlkZXNjLT5idWZmX2FkZHJfbG8gPSAodTMyKWVuYV9idWZzLT5wYWRkcjsKKwkJZGVzYy0+YnVmZl9hZGRyX2hpX2hkcl9zeiB8PSBhZGRyX2hpICYKKwkJCUVOQV9FVEhfSU9fVFhfREVTQ19BRERSX0hJX01BU0s7CisJCWVuYV9idWZzKys7CisJfQorCisJLyogc2V0IHRoZSBsYXN0IGRlc2MgaW5kaWNhdG9yICovCisJZGVzYy0+bGVuX2N0cmwgfD0gRU5BX0VUSF9JT19UWF9ERVNDX0xBU1RfTUFTSzsKKworCWVuYV9jb21fY29weV9jdXJyX3NxX2Rlc2NfdG9fZGV2KGlvX3NxKTsKKworCWVuYV9jb21fc3FfdXBkYXRlX3RhaWwoaW9fc3EpOworCisJdG90YWxfZGVzYyA9IG1heF90KHUxNiwgbnVtX2J1ZnMsIDEpOworCXRvdGFsX2Rlc2MgKz0gaGF2ZV9tZXRhID8gMSA6IDA7CisKKwkqbmJfaHdfZGVzYyA9IHRvdGFsX2Rlc2M7CisJcmV0dXJuIDA7Cit9CisKK2ludCBlbmFfY29tX3J4X3BrdChzdHJ1Y3QgZW5hX2NvbV9pb19jcSAqaW9fY3EsCisJCSAgIHN0cnVjdCBlbmFfY29tX2lvX3NxICppb19zcSwKKwkJICAgc3RydWN0IGVuYV9jb21fcnhfY3R4ICplbmFfcnhfY3R4KQoreworCXN0cnVjdCBlbmFfY29tX3J4X2J1Zl9pbmZvICplbmFfYnVmID0gJmVuYV9yeF9jdHgtPmVuYV9idWZzWzBdOworCXN0cnVjdCBlbmFfZXRoX2lvX3J4X2NkZXNjX2Jhc2UgKmNkZXNjID0gTlVMTDsKKwl1MTYgY2Rlc2NfaWR4ID0gMDsKKwl1MTYgbmJfaHdfZGVzYzsKKwl1MTYgaTsKKworCVdBUk4oaW9fY3EtPmRpcmVjdGlvbiAhPSBFTkFfQ09NX0lPX1FVRVVFX0RJUkVDVElPTl9SWCwgIndyb25nIFEgdHlwZSIpOworCisJbmJfaHdfZGVzYyA9IGVuYV9jb21fY2Rlc2NfcnhfcGt0X2dldChpb19jcSwgJmNkZXNjX2lkeCk7CisJaWYgKG5iX2h3X2Rlc2MgPT0gMCkgeworCQllbmFfcnhfY3R4LT5kZXNjcyA9IG5iX2h3X2Rlc2M7CisJCXJldHVybiAwOworCX0KKworCXByX2RlYnVnKCJmZXRjaCByeCBwYWNrZXQ6IHF1ZXVlICVkIGNvbXBsZXRlZCBkZXNjOiAlZFxuIiwgaW9fY3EtPnFpZCwKKwkJIG5iX2h3X2Rlc2MpOworCisJaWYgKHVubGlrZWx5KG5iX2h3X2Rlc2MgPiBlbmFfcnhfY3R4LT5tYXhfYnVmcykpIHsKKwkJcHJfZXJyKCJUb28gbWFueSBSWCBjZGVzY3MgKCVkKSA+IE1BWCglZClcbiIsIG5iX2h3X2Rlc2MsCisJCSAgICAgICBlbmFfcnhfY3R4LT5tYXhfYnVmcyk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBuYl9od19kZXNjOyBpKyspIHsKKwkJY2Rlc2MgPSBlbmFfY29tX3J4X2NkZXNjX2lkeF90b19wdHIoaW9fY3EsIGNkZXNjX2lkeCArIGkpOworCisJCWVuYV9idWYtPmxlbiA9IGNkZXNjLT5sZW5ndGg7CisJCWVuYV9idWYtPnJlcV9pZCA9IGNkZXNjLT5yZXFfaWQ7CisJCWVuYV9idWYrKzsKKwl9CisKKwkvKiBVcGRhdGUgU1EgaGVhZCBwdHIgKi8KKwlpb19zcS0+bmV4dF90b19jb21wICs9IG5iX2h3X2Rlc2M7CisKKwlwcl9kZWJ1ZygiWyVzXVtRSUQjJWRdIFVwZGF0aW5nIFNRIGhlYWQgdG86ICVkXG4iLCBfX2Z1bmNfXywgaW9fc3EtPnFpZCwKKwkJIGlvX3NxLT5uZXh0X3RvX2NvbXApOworCisJLyogR2V0IHJ4IGZsYWdzIGZyb20gdGhlIGxhc3QgcGt0ICovCisJZW5hX2NvbV9yeF9zZXRfZmxhZ3MoZW5hX3J4X2N0eCwgY2Rlc2MpOworCisJZW5hX3J4X2N0eC0+ZGVzY3MgPSBuYl9od19kZXNjOworCXJldHVybiAwOworfQorCitpbnQgZW5hX2NvbV9hZGRfc2luZ2xlX3J4X2Rlc2Moc3RydWN0IGVuYV9jb21faW9fc3EgKmlvX3NxLAorCQkJICAgICAgIHN0cnVjdCBlbmFfY29tX2J1ZiAqZW5hX2J1ZiwKKwkJCSAgICAgICB1MTYgcmVxX2lkKQoreworCXN0cnVjdCBlbmFfZXRoX2lvX3J4X2Rlc2MgKmRlc2M7CisKKwlXQVJOKGlvX3NxLT5kaXJlY3Rpb24gIT0gRU5BX0NPTV9JT19RVUVVRV9ESVJFQ1RJT05fUlgsICJ3cm9uZyBRIHR5cGUiKTsKKworCWlmICh1bmxpa2VseShlbmFfY29tX3NxX2VtcHR5X3NwYWNlKGlvX3NxKSA9PSAwKSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlkZXNjID0gZ2V0X3NxX2Rlc2MoaW9fc3EpOworCW1lbXNldChkZXNjLCAweDAsIHNpemVvZihzdHJ1Y3QgZW5hX2V0aF9pb19yeF9kZXNjKSk7CisKKwlkZXNjLT5sZW5ndGggPSBlbmFfYnVmLT5sZW47CisKKwlkZXNjLT5jdHJsIHw9IEVOQV9FVEhfSU9fUlhfREVTQ19GSVJTVF9NQVNLOworCWRlc2MtPmN0cmwgfD0gRU5BX0VUSF9JT19SWF9ERVNDX0xBU1RfTUFTSzsKKwlkZXNjLT5jdHJsIHw9IGlvX3NxLT5waGFzZSAmIEVOQV9FVEhfSU9fUlhfREVTQ19QSEFTRV9NQVNLOworCWRlc2MtPmN0cmwgfD0gRU5BX0VUSF9JT19SWF9ERVNDX0NPTVBfUkVRX01BU0s7CisKKwlkZXNjLT5yZXFfaWQgPSByZXFfaWQ7CisKKwlkZXNjLT5idWZmX2FkZHJfbG8gPSAodTMyKWVuYV9idWYtPnBhZGRyOworCWRlc2MtPmJ1ZmZfYWRkcl9oaSA9CisJCSgoZW5hX2J1Zi0+cGFkZHIgJiBHRU5NQVNLX1VMTChpb19zcS0+ZG1hX2FkZHJfYml0cyAtIDEsIDMyKSkgPj4gMzIpOworCisJZW5hX2NvbV9zcV91cGRhdGVfdGFpbChpb19zcSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGVuYV9jb21fdHhfY29tcF9yZXFfaWRfZ2V0KHN0cnVjdCBlbmFfY29tX2lvX2NxICppb19jcSwgdTE2ICpyZXFfaWQpCit7CisJdTggZXhwZWN0ZWRfcGhhc2UsIGNkZXNjX3BoYXNlOworCXN0cnVjdCBlbmFfZXRoX2lvX3R4X2NkZXNjICpjZGVzYzsKKwl1MTYgbWFza2VkX2hlYWQ7CisKKwltYXNrZWRfaGVhZCA9IGlvX2NxLT5oZWFkICYgKGlvX2NxLT5xX2RlcHRoIC0gMSk7CisJZXhwZWN0ZWRfcGhhc2UgPSBpb19jcS0+cGhhc2U7CisKKwljZGVzYyA9IChzdHJ1Y3QgZW5hX2V0aF9pb190eF9jZGVzYyAqKQorCQkoKHVpbnRwdHJfdClpb19jcS0+Y2Rlc2NfYWRkci52aXJ0X2FkZHIgKworCQkobWFza2VkX2hlYWQgKiBpb19jcS0+Y2Rlc2NfZW50cnlfc2l6ZV9pbl9ieXRlcykpOworCisJLyogV2hlbiB0aGUgY3VycmVudCBjb21wbGV0aW9uIGRlc2NyaXB0b3IgcGhhc2UgaXNuJ3QgdGhlIHNhbWUgYXMgdGhlCisJICogZXhwZWN0ZWQsIGl0IG1lYW4gdGhhdCB0aGUgZGV2aWNlIHN0aWxsIGRpZG4ndCB1cGRhdGUKKwkgKiB0aGlzIGNvbXBsZXRpb24uCisJICovCisJY2Rlc2NfcGhhc2UgPSBjZGVzYy0+ZmxhZ3MgJiBFTkFfRVRIX0lPX1RYX0NERVNDX1BIQVNFX01BU0s7CisJaWYgKGNkZXNjX3BoYXNlICE9IGV4cGVjdGVkX3BoYXNlKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWVuYV9jb21fY3FfaW5jX2hlYWQoaW9fY3EpOworCisJKnJlcV9pZCA9IGNkZXNjLT5yZXFfaWQ7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX2V0aF9jb20uaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX2V0aF9jb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjUzYzNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfZXRoX2NvbS5oCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIEVOQV9FVEhfQ09NX0hfCisjZGVmaW5lIEVOQV9FVEhfQ09NX0hfCisKKyNpbmNsdWRlICJlbmFfY29tLmgiCisKKy8qIGhlYWQgdXBkYXRlIHRocmVzaG9sZCBpbiB1bml0cyBvZiAocXVldWUgc2l6ZSAvIEVOQV9DT01QX0hFQURfVEhSRVNIKSAqLworI2RlZmluZSBFTkFfQ09NUF9IRUFEX1RIUkVTSCA0CisKK3N0cnVjdCBlbmFfY29tX3R4X2N0eCB7CisJc3RydWN0IGVuYV9jb21fdHhfbWV0YSBlbmFfbWV0YTsKKwlzdHJ1Y3QgZW5hX2NvbV9idWYgKmVuYV9idWZzOworCS8qIEZvciBMTFEsIGhlYWRlciBidWZmZXIgLSBwdXNoZWQgdG8gdGhlIGRldmljZSBtZW0gc3BhY2UgKi8KKwl2b2lkICpwdXNoX2hlYWRlcjsKKworCWVudW0gZW5hX2V0aF9pb19sM19wcm90b19pbmRleCBsM19wcm90bzsKKwllbnVtIGVuYV9ldGhfaW9fbDRfcHJvdG9faW5kZXggbDRfcHJvdG87CisJdTE2IG51bV9idWZzOworCXUxNiByZXFfaWQ7CisJLyogRm9yIHJlZ3VsYXIgcXVldWUsIGluZGljYXRlIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIKKwkgKiBGb3IgTExRLCBpbmRpY2F0ZSB0aGUgc2l6ZSBvZiB0aGUgcHVzaGVkIGJ1ZmZlcgorCSAqLworCXUxNiBoZWFkZXJfbGVuOworCisJdTggbWV0YV92YWxpZDsKKwl1OCB0c29fZW5hYmxlOworCXU4IGwzX2NzdW1fZW5hYmxlOworCXU4IGw0X2NzdW1fZW5hYmxlOworCXU4IGw0X2NzdW1fcGFydGlhbDsKKwl1OCBkZjsgLyogRG9uJ3QgZnJhZ21lbnQgKi8KK307CisKK3N0cnVjdCBlbmFfY29tX3J4X2N0eCB7CisJc3RydWN0IGVuYV9jb21fcnhfYnVmX2luZm8gKmVuYV9idWZzOworCWVudW0gZW5hX2V0aF9pb19sM19wcm90b19pbmRleCBsM19wcm90bzsKKwllbnVtIGVuYV9ldGhfaW9fbDRfcHJvdG9faW5kZXggbDRfcHJvdG87CisJYm9vbCBsM19jc3VtX2VycjsKKwlib29sIGw0X2NzdW1fZXJyOworCS8qIGZyYWdtZW50ZWQgcGFja2V0ICovCisJYm9vbCBmcmFnOworCXUzMiBoYXNoOworCXUxNiBkZXNjczsKKwlpbnQgbWF4X2J1ZnM7Cit9OworCitpbnQgZW5hX2NvbV9wcmVwYXJlX3R4KHN0cnVjdCBlbmFfY29tX2lvX3NxICppb19zcSwKKwkJICAgICAgIHN0cnVjdCBlbmFfY29tX3R4X2N0eCAqZW5hX3R4X2N0eCwKKwkJICAgICAgIGludCAqbmJfaHdfZGVzYyk7CisKK2ludCBlbmFfY29tX3J4X3BrdChzdHJ1Y3QgZW5hX2NvbV9pb19jcSAqaW9fY3EsCisJCSAgIHN0cnVjdCBlbmFfY29tX2lvX3NxICppb19zcSwKKwkJICAgc3RydWN0IGVuYV9jb21fcnhfY3R4ICplbmFfcnhfY3R4KTsKKworaW50IGVuYV9jb21fYWRkX3NpbmdsZV9yeF9kZXNjKHN0cnVjdCBlbmFfY29tX2lvX3NxICppb19zcSwKKwkJCSAgICAgICBzdHJ1Y3QgZW5hX2NvbV9idWYgKmVuYV9idWYsCisJCQkgICAgICAgdTE2IHJlcV9pZCk7CisKK2ludCBlbmFfY29tX3R4X2NvbXBfcmVxX2lkX2dldChzdHJ1Y3QgZW5hX2NvbV9pb19jcSAqaW9fY3EsIHUxNiAqcmVxX2lkKTsKKworc3RhdGljIGlubGluZSB2b2lkIGVuYV9jb21fdW5tYXNrX2ludHIoc3RydWN0IGVuYV9jb21faW9fY3EgKmlvX2NxLAorCQkJCSAgICAgICBzdHJ1Y3QgZW5hX2V0aF9pb19pbnRyX3JlZyAqaW50cl9yZWcpCit7CisJd3JpdGVsKGludHJfcmVnLT5pbnRyX2NvbnRyb2wsIGlvX2NxLT51bm1hc2tfcmVnKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZW5hX2NvbV9zcV9lbXB0eV9zcGFjZShzdHJ1Y3QgZW5hX2NvbV9pb19zcSAqaW9fc3EpCit7CisJdTE2IHRhaWwsIG5leHRfdG9fY29tcCwgY250OworCisJbmV4dF90b19jb21wID0gaW9fc3EtPm5leHRfdG9fY29tcDsKKwl0YWlsID0gaW9fc3EtPnRhaWw7CisJY250ID0gdGFpbCAtIG5leHRfdG9fY29tcDsKKworCXJldHVybiBpb19zcS0+cV9kZXB0aCAtIDEgLSBjbnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGVuYV9jb21fd3JpdGVfc3FfZG9vcmJlbGwoc3RydWN0IGVuYV9jb21faW9fc3EgKmlvX3NxKQoreworCXUxNiB0YWlsOworCisJdGFpbCA9IGlvX3NxLT50YWlsOworCisJcHJfZGVidWcoIndyaXRlIHN1Ym1pc3Npb24gcXVldWUgZG9vcmJlbGwgZm9yIHF1ZXVlOiAlZCB0YWlsOiAlZFxuIiwKKwkJIGlvX3NxLT5xaWQsIHRhaWwpOworCisJd3JpdGVsKHRhaWwsIGlvX3NxLT5kYl9hZGRyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBlbmFfY29tX3VwZGF0ZV9kZXZfY29tcF9oZWFkKHN0cnVjdCBlbmFfY29tX2lvX2NxICppb19jcSkKK3sKKwl1MTYgdW5yZXBvcnRlZF9jb21wLCBoZWFkOworCWJvb2wgbmVlZF91cGRhdGU7CisKKwloZWFkID0gaW9fY3EtPmhlYWQ7CisJdW5yZXBvcnRlZF9jb21wID0gaGVhZCAtIGlvX2NxLT5sYXN0X2hlYWRfdXBkYXRlOworCW5lZWRfdXBkYXRlID0gdW5yZXBvcnRlZF9jb21wID4gKGlvX2NxLT5xX2RlcHRoIC8gRU5BX0NPTVBfSEVBRF9USFJFU0gpOworCisJaWYgKGlvX2NxLT5jcV9oZWFkX2RiX3JlZyAmJiBuZWVkX3VwZGF0ZSkgeworCQlwcl9kZWJ1ZygiV3JpdGUgY29tcGxldGlvbiBxdWV1ZSBkb29yYmVsbCBmb3IgcXVldWUgJWQ6IGhlYWQ6ICVkXG4iLAorCQkJIGlvX2NxLT5xaWQsIGhlYWQpOworCQl3cml0ZWwoaGVhZCwgaW9fY3EtPmNxX2hlYWRfZGJfcmVnKTsKKwkJaW9fY3EtPmxhc3RfaGVhZF91cGRhdGUgPSBoZWFkOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5hX2NvbV91cGRhdGVfbnVtYV9ub2RlKHN0cnVjdCBlbmFfY29tX2lvX2NxICppb19jcSwKKwkJCQkJICAgIHU4IG51bWFfbm9kZSkKK3sKKwlzdHJ1Y3QgZW5hX2V0aF9pb19udW1hX25vZGVfY2ZnX3JlZyBudW1hX2NmZzsKKworCWlmICghaW9fY3EtPm51bWFfbm9kZV9jZmdfcmVnKQorCQlyZXR1cm47CisKKwludW1hX2NmZy5udW1hX2NmZyA9IChudW1hX25vZGUgJiBFTkFfRVRIX0lPX05VTUFfTk9ERV9DRkdfUkVHX05VTUFfTUFTSykKKwkJfCBFTkFfRVRIX0lPX05VTUFfTk9ERV9DRkdfUkVHX0VOQUJMRURfTUFTSzsKKworCXdyaXRlbChudW1hX2NmZy5udW1hX2NmZywgaW9fY3EtPm51bWFfbm9kZV9jZmdfcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVuYV9jb21fY29tcF9hY2soc3RydWN0IGVuYV9jb21faW9fc3EgKmlvX3NxLCB1MTYgZWxlbSkKK3sKKwlpb19zcS0+bmV4dF90b19jb21wICs9IGVsZW07Cit9CisKKyNlbmRpZiAvKiBFTkFfRVRIX0NPTV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfZXRoX2lvX2RlZnMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX2V0aF9pb19kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMyMGM1OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX2V0aF9pb19kZWZzLmgKQEAgLTAsMCArMSw0MTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSAtIDIwMTYgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworI2lmbmRlZiBfRU5BX0VUSF9JT19IXworI2RlZmluZSBfRU5BX0VUSF9JT19IXworCitlbnVtIGVuYV9ldGhfaW9fbDNfcHJvdG9faW5kZXggeworCUVOQV9FVEhfSU9fTDNfUFJPVE9fVU5LTk9XTgk9IDAsCisKKwlFTkFfRVRIX0lPX0wzX1BST1RPX0lQVjQJPSA4LAorCisJRU5BX0VUSF9JT19MM19QUk9UT19JUFY2CT0gMTEsCisKKwlFTkFfRVRIX0lPX0wzX1BST1RPX0ZDT0UJPSAyMSwKKworCUVOQV9FVEhfSU9fTDNfUFJPVE9fUk9DRQk9IDIyLAorfTsKKworZW51bSBlbmFfZXRoX2lvX2w0X3Byb3RvX2luZGV4IHsKKwlFTkFfRVRIX0lPX0w0X1BST1RPX1VOS05PV04JCT0gMCwKKworCUVOQV9FVEhfSU9fTDRfUFJPVE9fVENQCQkJPSAxMiwKKworCUVOQV9FVEhfSU9fTDRfUFJPVE9fVURQCQkJPSAxMywKKworCUVOQV9FVEhfSU9fTDRfUFJPVE9fUk9VVEVBQkxFX1JPQ0UJPSAyMywKK307CisKK3N0cnVjdCBlbmFfZXRoX2lvX3R4X2Rlc2MgeworCS8qIDE1OjAgOiBsZW5ndGggLSBCdWZmZXIgbGVuZ3RoIGluIGJ5dGVzLCBtdXN0CisJICogICAgaW5jbHVkZSBhbnkgcGFja2V0IHRyYWlsZXJzIHRoYXQgdGhlIEVOQSBzdXBwb3NlZAorCSAqICAgIHRvIHVwZGF0ZSBsaWtlIEVuZC10by1FbmQgQ1JDLCBBdXRoZW50aWNhdGlvbiBHTUFDCisJICogICAgZXRjLiBUaGlzIGxlbmd0aCBtdXN0IG5vdCBpbmNsdWRlIHRoZQorCSAqICAgICdQdXNoX0J1ZmZlcicgbGVuZ3RoLiBUaGlzIGxlbmd0aCBtdXN0IG5vdCBpbmNsdWRlCisJICogICAgdGhlIDQtYnl0ZSBhZGRlZCBpbiB0aGUgZW5kIGZvciA4MDIuMyBFdGhlcm5ldCBGQ1MKKwkgKiAyMToxNiA6IHJlcV9pZF9oaSAtIFJlcXVlc3QgSURbMTU6MTBdCisJICogMjIgOiByZXNlcnZlZDIyIC0gTUJaCisJICogMjMgOiBtZXRhX2Rlc2MgLSBNQloKKwkgKiAyNCA6IHBoYXNlCisJICogMjUgOiByZXNlcnZlZDEgLSBNQloKKwkgKiAyNiA6IGZpcnN0IC0gSW5kaWNhdGVzIGZpcnN0IGRlc2NyaXB0b3IgaW4KKwkgKiAgICB0cmFuc2FjdGlvbgorCSAqIDI3IDogbGFzdCAtIEluZGljYXRlcyBsYXN0IGRlc2NyaXB0b3IgaW4KKwkgKiAgICB0cmFuc2FjdGlvbgorCSAqIDI4IDogY29tcF9yZXEgLSBJbmRpY2F0ZXMgd2hldGhlciBjb21wbGV0aW9uCisJICogICAgc2hvdWxkIGJlIHBvc3RlZCwgYWZ0ZXIgcGFja2V0IGlzIHRyYW5zbWl0dGVkLgorCSAqICAgIFZhbGlkIG9ubHkgZm9yIGZpcnN0IGRlc2NyaXB0b3IKKwkgKiAzMDoyOSA6IHJlc2VydmVkMjkgLSBNQloKKwkgKiAzMSA6IHJlc2VydmVkMzEgLSBNQloKKwkgKi8KKwl1MzIgbGVuX2N0cmw7CisKKwkvKiAzOjAgOiBsM19wcm90b19pZHggLSBMMyBwcm90b2NvbC4gVGhpcyBmaWVsZAorCSAqICAgIHJlcXVpcmVkIHdoZW4gbDNfY3N1bV9lbixsM19jc3VtIG9yIHRzb19lbiBhcmUgc2V0LgorCSAqIDQgOiBERiAtIElQdjQgREYsIG11c3QgYmUgMCBpZiBwYWNrZXQgaXMgSVB2NCBhbmQKKwkgKiAgICBERiBmbGFncyBvZiB0aGUgSVB2NCBoZWFkZXIgaXMgMC4gT3RoZXJ3aXNlIG11c3QKKwkgKiAgICBiZSBzZXQgdG8gMQorCSAqIDY6NSA6IHJlc2VydmVkNQorCSAqIDcgOiB0c29fZW4gLSBFbmFibGUgVFNPLCBGb3IgVENQIG9ubHkuCisJICogMTI6OCA6IGw0X3Byb3RvX2lkeCAtIEw0IHByb3RvY29sLiBUaGlzIGZpZWxkIG5lZWQKKwkgKiAgICB0byBiZSBzZXQgd2hlbiBsNF9jc3VtX2VuIG9yIHRzb19lbiBhcmUgc2V0LgorCSAqIDEzIDogbDNfY3N1bV9lbiAtIGVuYWJsZSBJUHY0IGhlYWRlciBjaGVja3N1bS4KKwkgKiAxNCA6IGw0X2NzdW1fZW4gLSBlbmFibGUgVENQL1VEUCBjaGVja3N1bS4KKwkgKiAxNSA6IGV0aGVybmV0X2Zjc19kaXMgLSB3aGVuIHNldCwgdGhlIGNvbnRyb2xsZXIKKwkgKiAgICB3aWxsIG5vdCBhcHBlbmQgdGhlIDgwMi4zIEV0aGVybmV0IEZyYW1lIENoZWNrCisJICogICAgU2VxdWVuY2UgdG8gdGhlIHBhY2tldAorCSAqIDE2IDogcmVzZXJ2ZWQxNgorCSAqIDE3IDogbDRfY3N1bV9wYXJ0aWFsIC0gTDQgcGFydGlhbCBjaGVja3N1bS4gd2hlbgorCSAqICAgIHNldCB0byAwLCB0aGUgRU5BIGNhbGN1bGF0ZXMgdGhlIEw0IGNoZWNrc3VtLAorCSAqICAgIHdoZXJlIHRoZSBEZXN0aW5hdGlvbiBBZGRyZXNzIHJlcXVpcmVkIGZvciB0aGUKKwkgKiAgICBUQ1AvVURQIHBzZXVkby1oZWFkZXIgaXMgdGFrZW4gZnJvbSB0aGUgYWN0dWFsCisJICogICAgcGFja2V0IEwzIGhlYWRlci4gd2hlbiBzZXQgdG8gMSwgdGhlIEVOQSBkb2Vzbid0CisJICogICAgY2FsY3VsYXRlIHRoZSBzdW0gb2YgdGhlIHBzZXVkby1oZWFkZXIsIGluc3RlYWQsCisJICogICAgdGhlIGNoZWNrc3VtIGZpZWxkIG9mIHRoZSBMNCBpcyB1c2VkIGluc3RlYWQuIFdoZW4KKwkgKiAgICBUU08gZW5hYmxlZCwgdGhlIGNoZWNrc3VtIG9mIHRoZSBwc2V1ZG8taGVhZGVyCisJICogICAgbXVzdCBub3QgaW5jbHVkZSB0aGUgdGNwIGxlbmd0aCBmaWVsZC4gTDQgcGFydGlhbAorCSAqICAgIGNoZWNrc3VtIHNob3VsZCBiZSB1c2VkIGZvciBJUHY2IHBhY2tldCB0aGF0CisJICogICAgY29udGFpbnMgUm91dGluZyBIZWFkZXJzLgorCSAqIDIwOjE4IDogcmVzZXJ2ZWQxOCAtIE1CWgorCSAqIDIxIDogcmVzZXJ2ZWQyMSAtIE1CWgorCSAqIDMxOjIyIDogcmVxX2lkX2xvIC0gUmVxdWVzdCBJRFs5OjBdCisJICovCisJdTMyIG1ldGFfY3RybDsKKworCXUzMiBidWZmX2FkZHJfbG87CisKKwkvKiBhZGRyZXNzIGhpZ2ggYW5kIGhlYWRlciBzaXplCisJICogMTU6MCA6IGFkZHJfaGkgLSBCdWZmZXIgUG9pbnRlcls0NzozMl0KKwkgKiAyMzoxNiA6IHJlc2VydmVkMTZfdzIKKwkgKiAzMToyNCA6IGhlYWRlcl9sZW5ndGggLSBIZWFkZXIgbGVuZ3RoLiBGb3IgTG93CisJICogICAgTGF0ZW5jeSBRdWV1ZXMsIHRoaXMgZmllbGRzIGluZGljYXRlcyB0aGUgbnVtYmVyCisJICogICAgb2YgYnl0ZXMgd3JpdHRlbiB0byB0aGUgaGVhZGVycycgbWVtb3J5LiBGb3IKKwkgKiAgICBub3JtYWwgcXVldWVzLCBpZiBwYWNrZXQgaXMgVENQIG9yIFVEUCwgYW5kIGxvbmdlcgorCSAqICAgIHRoYW4gbWF4X2hlYWRlcl9zaXplLCB0aGVuIHRoaXMgZmllbGQgc2hvdWxkIGJlCisJICogICAgc2V0IHRvIHRoZSBzdW0gb2YgTDQgaGVhZGVyIG9mZnNldCBhbmQgTDQgaGVhZGVyCisJICogICAgc2l6ZSh3aXRob3V0IG9wdGlvbnMpLCBvdGhlcndpc2UsIHRoaXMgZmllbGQKKwkgKiAgICBzaG91bGQgYmUgc2V0IHRvIDAuIEZvciBib3RoIG1vZGVzLCB0aGlzIGZpZWxkCisJICogICAgbXVzdCBub3QgZXhjZWVkIHRoZSBtYXhfaGVhZGVyX3NpemUuCisJICogICAgbWF4X2hlYWRlcl9zaXplIHZhbHVlIGlzIHJlcG9ydGVkIGJ5IHRoZSBNYXgKKwkgKiAgICBRdWV1ZXMgRmVhdHVyZSBkZXNjcmlwdG9yCisJICovCisJdTMyIGJ1ZmZfYWRkcl9oaV9oZHJfc3o7Cit9OworCitzdHJ1Y3QgZW5hX2V0aF9pb190eF9tZXRhX2Rlc2MgeworCS8qIDk6MCA6IHJlcV9pZF9sbyAtIFJlcXVlc3QgSURbOTowXQorCSAqIDExOjEwIDogcmVzZXJ2ZWQxMCAtIE1CWgorCSAqIDEyIDogcmVzZXJ2ZWQxMiAtIE1CWgorCSAqIDEzIDogcmVzZXJ2ZWQxMyAtIE1CWgorCSAqIDE0IDogZXh0X3ZhbGlkIC0gaWYgc2V0LCBvZmZzZXQgZmllbGRzIGluIFdvcmQyCisJICogICAgYXJlIHZhbGlkIEFsc28gTVNTIEhpZ2ggaW4gV29yZCAwIGFuZCBiaXRzIFszMToyNF0KKwkgKiAgICBpbiBXb3JkIDMKKwkgKiAxNSA6IHJlc2VydmVkMTUKKwkgKiAxOToxNiA6IG1zc19oaQorCSAqIDIwIDogZXRoX21ldGFfdHlwZSAtIDA6IFR4IE1ldGFkYXRhIERlc2NyaXB0b3IsIDE6CisJICogICAgRXh0ZW5kZWQgTWV0YWRhdGEgRGVzY3JpcHRvcgorCSAqIDIxIDogbWV0YV9zdG9yZSAtIFN0b3JlIGV4dGVuZGVkIG1ldGFkYXRhIGluIHF1ZXVlCisJICogICAgY2FjaGUKKwkgKiAyMiA6IHJlc2VydmVkMjIgLSBNQloKKwkgKiAyMyA6IG1ldGFfZGVzYyAtIE1CTworCSAqIDI0IDogcGhhc2UKKwkgKiAyNSA6IHJlc2VydmVkMjUgLSBNQloKKwkgKiAyNiA6IGZpcnN0IC0gSW5kaWNhdGVzIGZpcnN0IGRlc2NyaXB0b3IgaW4KKwkgKiAgICB0cmFuc2FjdGlvbgorCSAqIDI3IDogbGFzdCAtIEluZGljYXRlcyBsYXN0IGRlc2NyaXB0b3IgaW4KKwkgKiAgICB0cmFuc2FjdGlvbgorCSAqIDI4IDogY29tcF9yZXEgLSBJbmRpY2F0ZXMgd2hldGhlciBjb21wbGV0aW9uCisJICogICAgc2hvdWxkIGJlIHBvc3RlZCwgYWZ0ZXIgcGFja2V0IGlzIHRyYW5zbWl0dGVkLgorCSAqICAgIFZhbGlkIG9ubHkgZm9yIGZpcnN0IGRlc2NyaXB0b3IKKwkgKiAzMDoyOSA6IHJlc2VydmVkMjkgLSBNQloKKwkgKiAzMSA6IHJlc2VydmVkMzEgLSBNQloKKwkgKi8KKwl1MzIgbGVuX2N0cmw7CisKKwkvKiA1OjAgOiByZXFfaWRfaGkKKwkgKiAzMTo2IDogcmVzZXJ2ZWQ2IC0gTUJaCisJICovCisJdTMyIHdvcmQxOworCisJLyogNzowIDogbDNfaGRyX2xlbgorCSAqIDE1OjggOiBsM19oZHJfb2ZmCisJICogMjE6MTYgOiBsNF9oZHJfbGVuX2luX3dvcmRzIC0gY291bnRzIHRoZSBMNCBoZWFkZXIKKwkgKiAgICBsZW5ndGggaW4gd29yZHMuIHRoZXJlIGlzIGFuIGV4cGxpY2l0IGFzc3VtcHRpb24KKwkgKiAgICB0aGF0IEw0IGhlYWRlciBhcHBlYXJzIHJpZ2h0IGFmdGVyIEwzIGhlYWRlciBhbmQKKwkgKiAgICBMNCBvZmZzZXQgaXMgYmFzZWQgb24gbDNfaGRyX29mZitsM19oZHJfbGVuCisJICogMzE6MjIgOiBtc3NfbG8KKwkgKi8KKwl1MzIgd29yZDI7CisKKwl1MzIgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgZW5hX2V0aF9pb190eF9jZGVzYyB7CisJLyogUmVxdWVzdCBJRFsxNTowXSAqLworCXUxNiByZXFfaWQ7CisKKwl1OCBzdGF0dXM7CisKKwkvKiBmbGFncworCSAqIDAgOiBwaGFzZQorCSAqIDc6MSA6IHJlc2VydmVkMQorCSAqLworCXU4IGZsYWdzOworCisJdTE2IHN1Yl9xaWQ7CisKKwl1MTYgc3FfaGVhZF9pZHg7Cit9OworCitzdHJ1Y3QgZW5hX2V0aF9pb19yeF9kZXNjIHsKKwkvKiBJbiBieXRlcy4gMCBtZWFucyA2NEtCICovCisJdTE2IGxlbmd0aDsKKworCS8qIE1CWiAqLworCXU4IHJlc2VydmVkMjsKKworCS8qIDAgOiBwaGFzZQorCSAqIDEgOiByZXNlcnZlZDEgLSBNQloKKwkgKiAyIDogZmlyc3QgLSBJbmRpY2F0ZXMgZmlyc3QgZGVzY3JpcHRvciBpbgorCSAqICAgIHRyYW5zYWN0aW9uCisJICogMyA6IGxhc3QgLSBJbmRpY2F0ZXMgbGFzdCBkZXNjcmlwdG9yIGluIHRyYW5zYWN0aW9uCisJICogNCA6IGNvbXBfcmVxCisJICogNSA6IHJlc2VydmVkNSAtIE1CTworCSAqIDc6NiA6IHJlc2VydmVkNiAtIE1CWgorCSAqLworCXU4IGN0cmw7CisKKwl1MTYgcmVxX2lkOworCisJLyogTUJaICovCisJdTE2IHJlc2VydmVkNjsKKworCXUzMiBidWZmX2FkZHJfbG87CisKKwl1MTYgYnVmZl9hZGRyX2hpOworCisJLyogTUJaICovCisJdTE2IHJlc2VydmVkMTZfdzM7Cit9OworCisvKiA0LXdvcmQgZm9ybWF0IE5vdGU6IGFsbCBldGhlcm5ldCBwYXJzaW5nIGluZm9ybWF0aW9uIGFyZSB2YWxpZCBvbmx5IHdoZW4KKyAqIGxhc3Q9MQorICovCitzdHJ1Y3QgZW5hX2V0aF9pb19yeF9jZGVzY19iYXNlIHsKKwkvKiA0OjAgOiBsM19wcm90b19pZHgKKwkgKiA2OjUgOiBzcmNfdmxhbl9jbnQKKwkgKiA3IDogcmVzZXJ2ZWQ3IC0gTUJaCisJICogMTI6OCA6IGw0X3Byb3RvX2lkeAorCSAqIDEzIDogbDNfY3N1bV9lcnIgLSB3aGVuIHNldCwgZWl0aGVyIHRoZSBMMworCSAqICAgIGNoZWNrc3VtIGVycm9yIGRldGVjdGVkLCBvciwgdGhlIGNvbnRyb2xsZXIgZGlkbid0CisJICogICAgdmFsaWRhdGUgdGhlIGNoZWNrc3VtLiBUaGlzIGJpdCBpcyB2YWxpZCBvbmx5IHdoZW4KKwkgKiAgICBsM19wcm90b19pZHggaW5kaWNhdGVzIElQdjQgcGFja2V0CisJICogMTQgOiBsNF9jc3VtX2VyciAtIHdoZW4gc2V0LCBlaXRoZXIgdGhlIEw0CisJICogICAgY2hlY2tzdW0gZXJyb3IgZGV0ZWN0ZWQsIG9yLCB0aGUgY29udHJvbGxlciBkaWRuJ3QKKwkgKiAgICB2YWxpZGF0ZSB0aGUgY2hlY2tzdW0uIFRoaXMgYml0IGlzIHZhbGlkIG9ubHkgd2hlbgorCSAqICAgIGw0X3Byb3RvX2lkeCBpbmRpY2F0ZXMgVENQL1VEUCBwYWNrZXQsIGFuZCwKKwkgKiAgICBpcHY0X2ZyYWcgaXMgbm90IHNldAorCSAqIDE1IDogaXB2NF9mcmFnIC0gSW5kaWNhdGVzIElQdjQgZnJhZ21lbnRlZCBwYWNrZXQKKwkgKiAyMzoxNiA6IHJlc2VydmVkMTYKKwkgKiAyNCA6IHBoYXNlCisJICogMjUgOiBsM19jc3VtMiAtIHNlY29uZCBjaGVja3N1bSBlbmdpbmUgcmVzdWx0CisJICogMjYgOiBmaXJzdCAtIEluZGljYXRlcyBmaXJzdCBkZXNjcmlwdG9yIGluCisJICogICAgdHJhbnNhY3Rpb24KKwkgKiAyNyA6IGxhc3QgLSBJbmRpY2F0ZXMgbGFzdCBkZXNjcmlwdG9yIGluCisJICogICAgdHJhbnNhY3Rpb24KKwkgKiAyOToyOCA6IHJlc2VydmVkMjgKKwkgKiAzMCA6IGJ1ZmZlciAtIDA6IE1ldGFkYXRhIGRlc2NyaXB0b3IuIDE6IEJ1ZmZlcgorCSAqICAgIERlc2NyaXB0b3Igd2FzIHVzZWQKKwkgKiAzMSA6IHJlc2VydmVkMzEKKwkgKi8KKwl1MzIgc3RhdHVzOworCisJdTE2IGxlbmd0aDsKKworCXUxNiByZXFfaWQ7CisKKwkvKiAzMi1iaXQgaGFzaCByZXN1bHQgKi8KKwl1MzIgaGFzaDsKKworCXUxNiBzdWJfcWlkOworCisJdTE2IHJlc2VydmVkOworfTsKKworLyogOC13b3JkIGZvcm1hdCAqLworc3RydWN0IGVuYV9ldGhfaW9fcnhfY2Rlc2NfZXh0IHsKKwlzdHJ1Y3QgZW5hX2V0aF9pb19yeF9jZGVzY19iYXNlIGJhc2U7CisKKwl1MzIgYnVmZl9hZGRyX2xvOworCisJdTE2IGJ1ZmZfYWRkcl9oaTsKKworCXUxNiByZXNlcnZlZDE2OworCisJdTMyIHJlc2VydmVkX3c2OworCisJdTMyIHJlc2VydmVkX3c3OworfTsKKworc3RydWN0IGVuYV9ldGhfaW9faW50cl9yZWcgeworCS8qIDE0OjAgOiByeF9pbnRyX2RlbGF5CisJICogMjk6MTUgOiB0eF9pbnRyX2RlbGF5CisJICogMzAgOiBpbnRyX3VubWFzaworCSAqIDMxIDogcmVzZXJ2ZWQKKwkgKi8KKwl1MzIgaW50cl9jb250cm9sOworfTsKKworc3RydWN0IGVuYV9ldGhfaW9fbnVtYV9ub2RlX2NmZ19yZWcgeworCS8qIDc6MCA6IG51bWEKKwkgKiAzMDo4IDogcmVzZXJ2ZWQKKwkgKiAzMSA6IGVuYWJsZWQKKwkgKi8KKwl1MzIgbnVtYV9jZmc7Cit9OworCisvKiB0eF9kZXNjICovCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19MRU5HVEhfTUFTSyBHRU5NQVNLKDE1LCAwKQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfUkVRX0lEX0hJX1NISUZUIDE2CisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19SRVFfSURfSElfTUFTSyBHRU5NQVNLKDIxLCAxNikKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX01FVEFfREVTQ19TSElGVCAyMworI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfTUVUQV9ERVNDX01BU0sgQklUKDIzKQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfUEhBU0VfU0hJRlQgMjQKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX1BIQVNFX01BU0sgQklUKDI0KQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfRklSU1RfU0hJRlQgMjYKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX0ZJUlNUX01BU0sgQklUKDI2KQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfTEFTVF9TSElGVCAyNworI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfTEFTVF9NQVNLIEJJVCgyNykKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX0NPTVBfUkVRX1NISUZUIDI4CisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19DT01QX1JFUV9NQVNLIEJJVCgyOCkKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX0wzX1BST1RPX0lEWF9NQVNLIEdFTk1BU0soMywgMCkKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX0RGX1NISUZUIDQKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX0RGX01BU0sgQklUKDQpCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19UU09fRU5fU0hJRlQgNworI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfVFNPX0VOX01BU0sgQklUKDcpCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19MNF9QUk9UT19JRFhfU0hJRlQgOAorI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfTDRfUFJPVE9fSURYX01BU0sgR0VOTUFTSygxMiwgOCkKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX0wzX0NTVU1fRU5fU0hJRlQgMTMKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX0wzX0NTVU1fRU5fTUFTSyBCSVQoMTMpCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19MNF9DU1VNX0VOX1NISUZUIDE0CisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19MNF9DU1VNX0VOX01BU0sgQklUKDE0KQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfRVRIRVJORVRfRkNTX0RJU19TSElGVCAxNQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfRVRIRVJORVRfRkNTX0RJU19NQVNLIEJJVCgxNSkKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX0w0X0NTVU1fUEFSVElBTF9TSElGVCAxNworI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfTDRfQ1NVTV9QQVJUSUFMX01BU0sgQklUKDE3KQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfUkVRX0lEX0xPX1NISUZUIDIyCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19SRVFfSURfTE9fTUFTSyBHRU5NQVNLKDMxLCAyMikKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX0FERFJfSElfTUFTSyBHRU5NQVNLKDE1LCAwKQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfSEVBREVSX0xFTkdUSF9TSElGVCAyNAorI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfSEVBREVSX0xFTkdUSF9NQVNLIEdFTk1BU0soMzEsIDI0KQorCisvKiB0eF9tZXRhX2Rlc2MgKi8KKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfUkVRX0lEX0xPX01BU0sgR0VOTUFTSyg5LCAwKQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19FWFRfVkFMSURfU0hJRlQgMTQKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfRVhUX1ZBTElEX01BU0sgQklUKDE0KQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19NU1NfSElfU0hJRlQgMTYKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfTVNTX0hJX01BU0sgR0VOTUFTSygxOSwgMTYpCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX0VUSF9NRVRBX1RZUEVfU0hJRlQgMjAKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfRVRIX01FVEFfVFlQRV9NQVNLIEJJVCgyMCkKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfTUVUQV9TVE9SRV9TSElGVCAyMQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19NRVRBX1NUT1JFX01BU0sgQklUKDIxKQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19NRVRBX0RFU0NfU0hJRlQgMjMKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfTUVUQV9ERVNDX01BU0sgQklUKDIzKQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19QSEFTRV9TSElGVCAyNAorI2RlZmluZSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19QSEFTRV9NQVNLIEJJVCgyNCkKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfRklSU1RfU0hJRlQgMjYKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfRklSU1RfTUFTSyBCSVQoMjYpCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX0xBU1RfU0hJRlQgMjcKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfTEFTVF9NQVNLIEJJVCgyNykKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfQ09NUF9SRVFfU0hJRlQgMjgKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfQ09NUF9SRVFfTUFTSyBCSVQoMjgpCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX1JFUV9JRF9ISV9NQVNLIEdFTk1BU0soNSwgMCkKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfTDNfSERSX0xFTl9NQVNLIEdFTk1BU0soNywgMCkKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfTDNfSERSX09GRl9TSElGVCA4CisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX0wzX0hEUl9PRkZfTUFTSyBHRU5NQVNLKDE1LCA4KQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19MNF9IRFJfTEVOX0lOX1dPUkRTX1NISUZUIDE2CisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX0w0X0hEUl9MRU5fSU5fV09SRFNfTUFTSyBHRU5NQVNLKDIxLCAxNikKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfTVNTX0xPX1NISUZUIDIyCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX01TU19MT19NQVNLIEdFTk1BU0soMzEsIDIyKQorCisvKiB0eF9jZGVzYyAqLworI2RlZmluZSBFTkFfRVRIX0lPX1RYX0NERVNDX1BIQVNFX01BU0sgQklUKDApCisKKy8qIHJ4X2Rlc2MgKi8KKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9ERVNDX1BIQVNFX01BU0sgQklUKDApCisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfREVTQ19GSVJTVF9TSElGVCAyCisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfREVTQ19GSVJTVF9NQVNLIEJJVCgyKQorI2RlZmluZSBFTkFfRVRIX0lPX1JYX0RFU0NfTEFTVF9TSElGVCAzCisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfREVTQ19MQVNUX01BU0sgQklUKDMpCisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfREVTQ19DT01QX1JFUV9TSElGVCA0CisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfREVTQ19DT01QX1JFUV9NQVNLIEJJVCg0KQorCisvKiByeF9jZGVzY19iYXNlICovCisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9MM19QUk9UT19JRFhfTUFTSyBHRU5NQVNLKDQsIDApCisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9TUkNfVkxBTl9DTlRfU0hJRlQgNQorI2RlZmluZSBFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfU1JDX1ZMQU5fQ05UX01BU0sgR0VOTUFTSyg2LCA1KQorI2RlZmluZSBFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfTDRfUFJPVE9fSURYX1NISUZUIDgKKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0w0X1BST1RPX0lEWF9NQVNLIEdFTk1BU0soMTIsIDgpCisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9MM19DU1VNX0VSUl9TSElGVCAxMworI2RlZmluZSBFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfTDNfQ1NVTV9FUlJfTUFTSyBCSVQoMTMpCisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9MNF9DU1VNX0VSUl9TSElGVCAxNAorI2RlZmluZSBFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfTDRfQ1NVTV9FUlJfTUFTSyBCSVQoMTQpCisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9JUFY0X0ZSQUdfU0hJRlQgMTUKKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0lQVjRfRlJBR19NQVNLIEJJVCgxNSkKKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX1BIQVNFX1NISUZUIDI0CisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9QSEFTRV9NQVNLIEJJVCgyNCkKKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0wzX0NTVU0yX1NISUZUIDI1CisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9MM19DU1VNMl9NQVNLIEJJVCgyNSkKKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0ZJUlNUX1NISUZUIDI2CisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9GSVJTVF9NQVNLIEJJVCgyNikKKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0xBU1RfU0hJRlQgMjcKKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0xBU1RfTUFTSyBCSVQoMjcpCisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9CVUZGRVJfU0hJRlQgMzAKKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0JVRkZFUl9NQVNLIEJJVCgzMCkKKworLyogaW50cl9yZWcgKi8KKyNkZWZpbmUgRU5BX0VUSF9JT19JTlRSX1JFR19SWF9JTlRSX0RFTEFZX01BU0sgR0VOTUFTSygxNCwgMCkKKyNkZWZpbmUgRU5BX0VUSF9JT19JTlRSX1JFR19UWF9JTlRSX0RFTEFZX1NISUZUIDE1CisjZGVmaW5lIEVOQV9FVEhfSU9fSU5UUl9SRUdfVFhfSU5UUl9ERUxBWV9NQVNLIEdFTk1BU0soMjksIDE1KQorI2RlZmluZSBFTkFfRVRIX0lPX0lOVFJfUkVHX0lOVFJfVU5NQVNLX1NISUZUIDMwCisjZGVmaW5lIEVOQV9FVEhfSU9fSU5UUl9SRUdfSU5UUl9VTk1BU0tfTUFTSyBCSVQoMzApCisKKy8qIG51bWFfbm9kZV9jZmdfcmVnICovCisjZGVmaW5lIEVOQV9FVEhfSU9fTlVNQV9OT0RFX0NGR19SRUdfTlVNQV9NQVNLIEdFTk1BU0soNywgMCkKKyNkZWZpbmUgRU5BX0VUSF9JT19OVU1BX05PREVfQ0ZHX1JFR19FTkFCTEVEX1NISUZUIDMxCisjZGVmaW5lIEVOQV9FVEhfSU9fTlVNQV9OT0RFX0NGR19SRUdfRU5BQkxFRF9NQVNLIEJJVCgzMSkKKworI2VuZGlmIC8qX0VOQV9FVEhfSU9fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX2V0aHRvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2IyMzM4ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX2V0aHRvb2wuYwpAQCAtMCwwICsxLDg5NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSAiZW5hX25ldGRldi5oIgorCitzdHJ1Y3QgZW5hX3N0YXRzIHsKKwljaGFyIG5hbWVbRVRIX0dTVFJJTkdfTEVOXTsKKwlpbnQgc3RhdF9vZmZzZXQ7Cit9OworCisjZGVmaW5lIEVOQV9TVEFUX0VOQV9DT01fRU5UUlkoc3RhdCkgeyBcCisJLm5hbWUgPSAjc3RhdCwgXAorCS5zdGF0X29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBlbmFfY29tX3N0YXRzX2FkbWluLCBzdGF0KSBcCit9CisKKyNkZWZpbmUgRU5BX1NUQVRfRU5UUlkoc3RhdCwgc3RhdF90eXBlKSB7IFwKKwkubmFtZSA9ICNzdGF0LCBcCisJLnN0YXRfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGVuYV9zdGF0c18jI3N0YXRfdHlwZSwgc3RhdCkgXAorfQorCisjZGVmaW5lIEVOQV9TVEFUX1JYX0VOVFJZKHN0YXQpIFwKKwlFTkFfU1RBVF9FTlRSWShzdGF0LCByeCkKKworI2RlZmluZSBFTkFfU1RBVF9UWF9FTlRSWShzdGF0KSBcCisJRU5BX1NUQVRfRU5UUlkoc3RhdCwgdHgpCisKKyNkZWZpbmUgRU5BX1NUQVRfR0xPQkFMX0VOVFJZKHN0YXQpIFwKKwlFTkFfU1RBVF9FTlRSWShzdGF0LCBkZXYpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZW5hX3N0YXRzIGVuYV9zdGF0c19nbG9iYWxfc3RyaW5nc1tdID0geworCUVOQV9TVEFUX0dMT0JBTF9FTlRSWSh0eF90aW1lb3V0KSwKKwlFTkFfU1RBVF9HTE9CQUxfRU5UUlkoaW9fc3VzcGVuZCksCisJRU5BX1NUQVRfR0xPQkFMX0VOVFJZKGlvX3Jlc3VtZSksCisJRU5BX1NUQVRfR0xPQkFMX0VOVFJZKHdkX2V4cGlyZWQpLAorCUVOQV9TVEFUX0dMT0JBTF9FTlRSWShpbnRlcmZhY2VfdXApLAorCUVOQV9TVEFUX0dMT0JBTF9FTlRSWShpbnRlcmZhY2VfZG93biksCisJRU5BX1NUQVRfR0xPQkFMX0VOVFJZKGFkbWluX3FfcGF1c2UpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbmFfc3RhdHMgZW5hX3N0YXRzX3R4X3N0cmluZ3NbXSA9IHsKKwlFTkFfU1RBVF9UWF9FTlRSWShjbnQpLAorCUVOQV9TVEFUX1RYX0VOVFJZKGJ5dGVzKSwKKwlFTkFfU1RBVF9UWF9FTlRSWShxdWV1ZV9zdG9wKSwKKwlFTkFfU1RBVF9UWF9FTlRSWShxdWV1ZV93YWtldXApLAorCUVOQV9TVEFUX1RYX0VOVFJZKGRtYV9tYXBwaW5nX2VyciksCisJRU5BX1NUQVRfVFhfRU5UUlkobGluZWFyaXplKSwKKwlFTkFfU1RBVF9UWF9FTlRSWShsaW5lYXJpemVfZmFpbGVkKSwKKwlFTkFfU1RBVF9UWF9FTlRSWShuYXBpX2NvbXApLAorCUVOQV9TVEFUX1RYX0VOVFJZKHR4X3BvbGwpLAorCUVOQV9TVEFUX1RYX0VOVFJZKGRvb3JiZWxscyksCisJRU5BX1NUQVRfVFhfRU5UUlkocHJlcGFyZV9jdHhfZXJyKSwKKwlFTkFfU1RBVF9UWF9FTlRSWShtaXNzaW5nX3R4X2NvbXApLAorCUVOQV9TVEFUX1RYX0VOVFJZKGJhZF9yZXFfaWQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbmFfc3RhdHMgZW5hX3N0YXRzX3J4X3N0cmluZ3NbXSA9IHsKKwlFTkFfU1RBVF9SWF9FTlRSWShjbnQpLAorCUVOQV9TVEFUX1JYX0VOVFJZKGJ5dGVzKSwKKwlFTkFfU1RBVF9SWF9FTlRSWShyZWZpbF9wYXJ0aWFsKSwKKwlFTkFfU1RBVF9SWF9FTlRSWShiYWRfY3N1bSksCisJRU5BX1NUQVRfUlhfRU5UUlkocGFnZV9hbGxvY19mYWlsKSwKKwlFTkFfU1RBVF9SWF9FTlRSWShza2JfYWxsb2NfZmFpbCksCisJRU5BX1NUQVRfUlhfRU5UUlkoZG1hX21hcHBpbmdfZXJyKSwKKwlFTkFfU1RBVF9SWF9FTlRSWShiYWRfZGVzY19udW0pLAorCUVOQV9TVEFUX1JYX0VOVFJZKHJ4X2NvcHlicmVha19wa3QpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbmFfc3RhdHMgZW5hX3N0YXRzX2VuYV9jb21fc3RyaW5nc1tdID0geworCUVOQV9TVEFUX0VOQV9DT01fRU5UUlkoYWJvcnRlZF9jbWQpLAorCUVOQV9TVEFUX0VOQV9DT01fRU5UUlkoc3VibWl0dGVkX2NtZCksCisJRU5BX1NUQVRfRU5BX0NPTV9FTlRSWShjb21wbGV0ZWRfY21kKSwKKwlFTkFfU1RBVF9FTkFfQ09NX0VOVFJZKG91dF9vZl9zcGFjZSksCisJRU5BX1NUQVRfRU5BX0NPTV9FTlRSWShub19jb21wbGV0aW9uKSwKK307CisKKyNkZWZpbmUgRU5BX1NUQVRTX0FSUkFZX0dMT0JBTAlBUlJBWV9TSVpFKGVuYV9zdGF0c19nbG9iYWxfc3RyaW5ncykKKyNkZWZpbmUgRU5BX1NUQVRTX0FSUkFZX1RYCUFSUkFZX1NJWkUoZW5hX3N0YXRzX3R4X3N0cmluZ3MpCisjZGVmaW5lIEVOQV9TVEFUU19BUlJBWV9SWAlBUlJBWV9TSVpFKGVuYV9zdGF0c19yeF9zdHJpbmdzKQorI2RlZmluZSBFTkFfU1RBVFNfQVJSQVlfRU5BX0NPTQlBUlJBWV9TSVpFKGVuYV9zdGF0c19lbmFfY29tX3N0cmluZ3MpCisKK3N0YXRpYyB2b2lkIGVuYV9zYWZlX3VwZGF0ZV9zdGF0KHU2NCAqc3JjLCB1NjQgKmRzdCwKKwkJCQkgc3RydWN0IHU2NF9zdGF0c19zeW5jICpzeW5jcCkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhcnQ7CisKKwlkbyB7CisJCXN0YXJ0ID0gdTY0X3N0YXRzX2ZldGNoX2JlZ2luX2lycShzeW5jcCk7CisJCSooZHN0KSA9ICpzcmM7CisJfSB3aGlsZSAodTY0X3N0YXRzX2ZldGNoX3JldHJ5X2lycShzeW5jcCwgc3RhcnQpKTsKK30KKworc3RhdGljIHZvaWQgZW5hX3F1ZXVlX3N0YXRzKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciwgdTY0ICoqZGF0YSkKK3sKKwljb25zdCBzdHJ1Y3QgZW5hX3N0YXRzICplbmFfc3RhdHM7CisJc3RydWN0IGVuYV9yaW5nICpyaW5nOworCisJdTY0ICpwdHI7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKSB7CisJCS8qIFR4IHN0YXRzICovCisJCXJpbmcgPSAmYWRhcHRlci0+dHhfcmluZ1tpXTsKKworCQlmb3IgKGogPSAwOyBqIDwgRU5BX1NUQVRTX0FSUkFZX1RYOyBqKyspIHsKKwkJCWVuYV9zdGF0cyA9ICZlbmFfc3RhdHNfdHhfc3RyaW5nc1tqXTsKKworCQkJcHRyID0gKHU2NCAqKSgodWludHB0cl90KSZyaW5nLT50eF9zdGF0cyArCisJCQkJKHVpbnRwdHJfdCllbmFfc3RhdHMtPnN0YXRfb2Zmc2V0KTsKKworCQkJZW5hX3NhZmVfdXBkYXRlX3N0YXQocHRyLCAoKmRhdGEpKyssICZyaW5nLT5zeW5jcCk7CisJCX0KKworCQkvKiBSeCBzdGF0cyAqLworCQlyaW5nID0gJmFkYXB0ZXItPnJ4X3JpbmdbaV07CisKKwkJZm9yIChqID0gMDsgaiA8IEVOQV9TVEFUU19BUlJBWV9SWDsgaisrKSB7CisJCQllbmFfc3RhdHMgPSAmZW5hX3N0YXRzX3J4X3N0cmluZ3Nbal07CisKKwkJCXB0ciA9ICh1NjQgKikoKHVpbnRwdHJfdCkmcmluZy0+cnhfc3RhdHMgKworCQkJCSh1aW50cHRyX3QpZW5hX3N0YXRzLT5zdGF0X29mZnNldCk7CisKKwkJCWVuYV9zYWZlX3VwZGF0ZV9zdGF0KHB0ciwgKCpkYXRhKSsrLCAmcmluZy0+c3luY3ApOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBlbmFfZGV2X2FkbWluX3F1ZXVlX3N0YXRzKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciwgdTY0ICoqZGF0YSkKK3sKKwljb25zdCBzdHJ1Y3QgZW5hX3N0YXRzICplbmFfc3RhdHM7CisJdTMyICpwdHI7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRU5BX1NUQVRTX0FSUkFZX0VOQV9DT007IGkrKykgeworCQllbmFfc3RhdHMgPSAmZW5hX3N0YXRzX2VuYV9jb21fc3RyaW5nc1tpXTsKKworCQlwdHIgPSAodTMyICopKCh1aW50cHRyX3QpJmFkYXB0ZXItPmVuYV9kZXYtPmFkbWluX3F1ZXVlLnN0YXRzICsKKwkJCSh1aW50cHRyX3QpZW5hX3N0YXRzLT5zdGF0X29mZnNldCk7CisKKwkJKigqZGF0YSkrKyA9ICpwdHI7CisJfQorfQorCitzdGF0aWMgdm9pZCBlbmFfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQkgIHN0cnVjdCBldGh0b29sX3N0YXRzICpzdGF0cywKKwkJCQkgIHU2NCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWNvbnN0IHN0cnVjdCBlbmFfc3RhdHMgKmVuYV9zdGF0czsKKwl1NjQgKnB0cjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBFTkFfU1RBVFNfQVJSQVlfR0xPQkFMOyBpKyspIHsKKwkJZW5hX3N0YXRzID0gJmVuYV9zdGF0c19nbG9iYWxfc3RyaW5nc1tpXTsKKworCQlwdHIgPSAodTY0ICopKCh1aW50cHRyX3QpJmFkYXB0ZXItPmRldl9zdGF0cyArCisJCQkodWludHB0cl90KWVuYV9zdGF0cy0+c3RhdF9vZmZzZXQpOworCisJCWVuYV9zYWZlX3VwZGF0ZV9zdGF0KHB0ciwgZGF0YSsrLCAmYWRhcHRlci0+c3luY3ApOworCX0KKworCWVuYV9xdWV1ZV9zdGF0cyhhZGFwdGVyLCAmZGF0YSk7CisJZW5hX2Rldl9hZG1pbl9xdWV1ZV9zdGF0cyhhZGFwdGVyLCAmZGF0YSk7Cit9CisKK2ludCBlbmFfZ2V0X3NzZXRfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHNzZXQpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWlmIChzc2V0ICE9IEVUSF9TU19TVEFUUykKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJcmV0dXJuICBhZGFwdGVyLT5udW1fcXVldWVzICogKEVOQV9TVEFUU19BUlJBWV9UWCArIEVOQV9TVEFUU19BUlJBWV9SWCkKKwkJKyBFTkFfU1RBVFNfQVJSQVlfR0xPQkFMICsgRU5BX1NUQVRTX0FSUkFZX0VOQV9DT007Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9xdWV1ZV9zdHJpbmdzKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciwgdTggKipkYXRhKQoreworCWNvbnN0IHN0cnVjdCBlbmFfc3RhdHMgKmVuYV9zdGF0czsKKwlpbnQgaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspIHsKKwkJLyogVHggc3RhdHMgKi8KKwkJZm9yIChqID0gMDsgaiA8IEVOQV9TVEFUU19BUlJBWV9UWDsgaisrKSB7CisJCQllbmFfc3RhdHMgPSAmZW5hX3N0YXRzX3R4X3N0cmluZ3Nbal07CisKKwkJCXNucHJpbnRmKCpkYXRhLCBFVEhfR1NUUklOR19MRU4sCisJCQkJICJxdWV1ZV8ldV90eF8lcyIsIGksIGVuYV9zdGF0cy0+bmFtZSk7CisJCQkgKCpkYXRhKSArPSBFVEhfR1NUUklOR19MRU47CisJCX0KKwkJLyogUnggc3RhdHMgKi8KKwkJZm9yIChqID0gMDsgaiA8IEVOQV9TVEFUU19BUlJBWV9SWDsgaisrKSB7CisJCQllbmFfc3RhdHMgPSAmZW5hX3N0YXRzX3J4X3N0cmluZ3Nbal07CisKKwkJCXNucHJpbnRmKCpkYXRhLCBFVEhfR1NUUklOR19MRU4sCisJCQkJICJxdWV1ZV8ldV9yeF8lcyIsIGksIGVuYV9zdGF0cy0+bmFtZSk7CisJCQkoKmRhdGEpICs9IEVUSF9HU1RSSU5HX0xFTjsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZW5hX2NvbV9kZXZfc3RyaW5ncyh1OCAqKmRhdGEpCit7CisJY29uc3Qgc3RydWN0IGVuYV9zdGF0cyAqZW5hX3N0YXRzOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEVOQV9TVEFUU19BUlJBWV9FTkFfQ09NOyBpKyspIHsKKwkJZW5hX3N0YXRzID0gJmVuYV9zdGF0c19lbmFfY29tX3N0cmluZ3NbaV07CisKKwkJc25wcmludGYoKmRhdGEsIEVUSF9HU1RSSU5HX0xFTiwKKwkJCSAiZW5hX2FkbWluX3FfJXMiLCBlbmFfc3RhdHMtPm5hbWUpOworCQkoKmRhdGEpICs9IEVUSF9HU1RSSU5HX0xFTjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgc3NldCwgdTggKmRhdGEpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwljb25zdCBzdHJ1Y3QgZW5hX3N0YXRzICplbmFfc3RhdHM7CisJaW50IGk7CisKKwlpZiAoc3NldCAhPSBFVEhfU1NfU1RBVFMpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBFTkFfU1RBVFNfQVJSQVlfR0xPQkFMOyBpKyspIHsKKwkJZW5hX3N0YXRzID0gJmVuYV9zdGF0c19nbG9iYWxfc3RyaW5nc1tpXTsKKworCQltZW1jcHkoZGF0YSwgZW5hX3N0YXRzLT5uYW1lLCBFVEhfR1NUUklOR19MRU4pOworCQlkYXRhICs9IEVUSF9HU1RSSU5HX0xFTjsKKwl9CisKKwllbmFfcXVldWVfc3RyaW5ncyhhZGFwdGVyLCAmZGF0YSk7CisJZW5hX2NvbV9kZXZfc3RyaW5ncygmZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2dldF9saW5rX2tzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJCSAgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmxpbmtfa3NldHRpbmdzKQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2ID0gYWRhcHRlci0+ZW5hX2RldjsKKwlzdHJ1Y3QgZW5hX2FkbWluX2dldF9mZWF0dXJlX2xpbmtfZGVzYyAqbGluazsKKwlzdHJ1Y3QgZW5hX2FkbWluX2dldF9mZWF0X3Jlc3AgZmVhdF9yZXNwOworCWludCByYzsKKworCXJjID0gZW5hX2NvbV9nZXRfbGlua19wYXJhbXMoZW5hX2RldiwgJmZlYXRfcmVzcCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlsaW5rID0gJmZlYXRfcmVzcC51Lmxpbms7CisJbGlua19rc2V0dGluZ3MtPmJhc2Uuc3BlZWQgPSBsaW5rLT5zcGVlZDsKKworCWlmIChsaW5rLT5mbGFncyAmIEVOQV9BRE1JTl9HRVRfRkVBVFVSRV9MSU5LX0RFU0NfQVVUT05FR19NQVNLKSB7CisJCWV0aHRvb2xfbGlua19rc2V0dGluZ3NfYWRkX2xpbmtfbW9kZShsaW5rX2tzZXR0aW5ncywKKwkJCQkJCSAgICAgc3VwcG9ydGVkLCBBdXRvbmVnKTsKKwkJZXRodG9vbF9saW5rX2tzZXR0aW5nc19hZGRfbGlua19tb2RlKGxpbmtfa3NldHRpbmdzLAorCQkJCQkJICAgICBzdXBwb3J0ZWQsIEF1dG9uZWcpOworCX0KKworCWxpbmtfa3NldHRpbmdzLT5iYXNlLmF1dG9uZWcgPQorCQkobGluay0+ZmxhZ3MgJiBFTkFfQURNSU5fR0VUX0ZFQVRVUkVfTElOS19ERVNDX0FVVE9ORUdfTUFTSykgPworCQlBVVRPTkVHX0VOQUJMRSA6IEFVVE9ORUdfRElTQUJMRTsKKworCWxpbmtfa3NldHRpbmdzLT5iYXNlLmR1cGxleCA9IERVUExFWF9GVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2dldF9jb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwKKwkJCSAgICBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqY29hbGVzY2UpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CisJc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2ID0gYWRhcHRlci0+ZW5hX2RldjsKKwlzdHJ1Y3QgZW5hX2ludHJfbW9kZXJfZW50cnkgaW50cl9tb2Rlcl9lbnRyeTsKKworCWlmICghZW5hX2NvbV9pbnRlcnJ1cHRfbW9kZXJhdGlvbl9zdXBwb3J0ZWQoZW5hX2RldikpIHsKKwkJLyogdGhlIGRldmllIGRvZXNuJ3Qgc3VwcG9ydCBpbnRlcnJ1cHQgbW9kZXJhdGlvbiAqLworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCWNvYWxlc2NlLT50eF9jb2FsZXNjZV91c2VjcyA9CisJCWVuYV9jb21fZ2V0X25vbmFkYXB0aXZlX21vZGVyYXRpb25faW50ZXJ2YWxfdHgoZW5hX2RldikgLworCQkJZW5hX2Rldi0+aW50cl9kZWxheV9yZXNvbHV0aW9uOworCWlmICghZW5hX2NvbV9nZXRfYWRhcHRpdmVfbW9kZXJhdGlvbl9lbmFibGVkKGVuYV9kZXYpKSB7CisJCWNvYWxlc2NlLT5yeF9jb2FsZXNjZV91c2VjcyA9CisJCQllbmFfY29tX2dldF9ub25hZGFwdGl2ZV9tb2RlcmF0aW9uX2ludGVydmFsX3J4KGVuYV9kZXYpCisJCQkvIGVuYV9kZXYtPmludHJfZGVsYXlfcmVzb2x1dGlvbjsKKwl9IGVsc2UgeworCQllbmFfY29tX2dldF9pbnRyX21vZGVyYXRpb25fZW50cnkoYWRhcHRlci0+ZW5hX2RldiwgRU5BX0lOVFJfTU9ERVJfTE9XRVNULCAmaW50cl9tb2Rlcl9lbnRyeSk7CisJCWNvYWxlc2NlLT5yeF9jb2FsZXNjZV91c2Vjc19sb3cgPSBpbnRyX21vZGVyX2VudHJ5LmludHJfbW9kZXJfaW50ZXJ2YWw7CisJCWNvYWxlc2NlLT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lc19sb3cgPSBpbnRyX21vZGVyX2VudHJ5LnBrdHNfcGVyX2ludGVydmFsOworCisJCWVuYV9jb21fZ2V0X2ludHJfbW9kZXJhdGlvbl9lbnRyeShhZGFwdGVyLT5lbmFfZGV2LCBFTkFfSU5UUl9NT0RFUl9NSUQsICZpbnRyX21vZGVyX2VudHJ5KTsKKwkJY29hbGVzY2UtPnJ4X2NvYWxlc2NlX3VzZWNzID0gaW50cl9tb2Rlcl9lbnRyeS5pbnRyX21vZGVyX2ludGVydmFsOworCQljb2FsZXNjZS0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPSBpbnRyX21vZGVyX2VudHJ5LnBrdHNfcGVyX2ludGVydmFsOworCisJCWVuYV9jb21fZ2V0X2ludHJfbW9kZXJhdGlvbl9lbnRyeShhZGFwdGVyLT5lbmFfZGV2LCBFTkFfSU5UUl9NT0RFUl9ISUdIRVNULCAmaW50cl9tb2Rlcl9lbnRyeSk7CisJCWNvYWxlc2NlLT5yeF9jb2FsZXNjZV91c2Vjc19oaWdoID0gaW50cl9tb2Rlcl9lbnRyeS5pbnRyX21vZGVyX2ludGVydmFsOworCQljb2FsZXNjZS0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaGlnaCA9IGludHJfbW9kZXJfZW50cnkucGt0c19wZXJfaW50ZXJ2YWw7CisJfQorCWNvYWxlc2NlLT51c2VfYWRhcHRpdmVfcnhfY29hbGVzY2UgPQorCQllbmFfY29tX2dldF9hZGFwdGl2ZV9tb2RlcmF0aW9uX2VuYWJsZWQoZW5hX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZW5hX3VwZGF0ZV90eF9yaW5nc19pbnRyX21vZGVyYXRpb24oc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IGk7CisKKwl2YWwgPSBlbmFfY29tX2dldF9ub25hZGFwdGl2ZV9tb2RlcmF0aW9uX2ludGVydmFsX3R4KGFkYXB0ZXItPmVuYV9kZXYpOworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykKKwkJYWRhcHRlci0+dHhfcmluZ1tpXS5zbW9vdGhlZF9pbnRlcnZhbCA9IHZhbDsKK30KKworc3RhdGljIGludCBlbmFfc2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAorCQkJICAgIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICpjb2FsZXNjZSkKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKKwlzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYgPSBhZGFwdGVyLT5lbmFfZGV2OworCXN0cnVjdCBlbmFfaW50cl9tb2Rlcl9lbnRyeSBpbnRyX21vZGVyX2VudHJ5OworCWludCByYzsKKworCWlmICghZW5hX2NvbV9pbnRlcnJ1cHRfbW9kZXJhdGlvbl9zdXBwb3J0ZWQoZW5hX2RldikpIHsKKwkJLyogdGhlIGRldmllIGRvZXNuJ3Qgc3VwcG9ydCBpbnRlcnJ1cHQgbW9kZXJhdGlvbiAqLworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJaWYgKGNvYWxlc2NlLT5yeF9jb2FsZXNjZV91c2Vjc19pcnEgfHwKKwkgICAgY29hbGVzY2UtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycSB8fAorCSAgICBjb2FsZXNjZS0+dHhfY29hbGVzY2VfdXNlY3NfaXJxIHx8CisJICAgIGNvYWxlc2NlLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lcyB8fAorCSAgICBjb2FsZXNjZS0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaXJxIHx8CisJICAgIGNvYWxlc2NlLT5zdGF0c19ibG9ja19jb2FsZXNjZV91c2VjcyB8fAorCSAgICBjb2FsZXNjZS0+dXNlX2FkYXB0aXZlX3R4X2NvYWxlc2NlIHx8CisJICAgIGNvYWxlc2NlLT5wa3RfcmF0ZV9sb3cgfHwKKwkgICAgY29hbGVzY2UtPnR4X2NvYWxlc2NlX3VzZWNzX2xvdyB8fAorCSAgICBjb2FsZXNjZS0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfbG93IHx8CisJICAgIGNvYWxlc2NlLT5wa3RfcmF0ZV9oaWdoIHx8CisJICAgIGNvYWxlc2NlLT50eF9jb2FsZXNjZV91c2Vjc19oaWdoIHx8CisJICAgIGNvYWxlc2NlLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lc19oaWdoIHx8CisJICAgIGNvYWxlc2NlLT5yYXRlX3NhbXBsZV9pbnRlcnZhbCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyYyA9IGVuYV9jb21fdXBkYXRlX25vbmFkYXB0aXZlX21vZGVyYXRpb25faW50ZXJ2YWxfdHgoZW5hX2RldiwKKwkJCQkJCQkgICAgICAgY29hbGVzY2UtPnR4X2NvYWxlc2NlX3VzZWNzKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWVuYV91cGRhdGVfdHhfcmluZ3NfaW50cl9tb2RlcmF0aW9uKGFkYXB0ZXIpOworCisJaWYgKGVuYV9jb21fZ2V0X2FkYXB0aXZlX21vZGVyYXRpb25fZW5hYmxlZChlbmFfZGV2KSkgeworCQlpZiAoIWNvYWxlc2NlLT51c2VfYWRhcHRpdmVfcnhfY29hbGVzY2UpIHsKKwkJCWVuYV9jb21fZGlzYWJsZV9hZGFwdGl2ZV9tb2RlcmF0aW9uKGVuYV9kZXYpOworCQkJcmMgPSBlbmFfY29tX3VwZGF0ZV9ub25hZGFwdGl2ZV9tb2RlcmF0aW9uX2ludGVydmFsX3J4KGVuYV9kZXYsCisJCQkJCQkJCQkgICAgICAgY29hbGVzY2UtPnJ4X2NvYWxlc2NlX3VzZWNzKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0gZWxzZSB7IC8qIHdhcyBpbiBub24tYWRhcHRpdmUgbW9kZSAqLworCQlpZiAoY29hbGVzY2UtPnVzZV9hZGFwdGl2ZV9yeF9jb2FsZXNjZSkgeworCQkJZW5hX2NvbV9lbmFibGVfYWRhcHRpdmVfbW9kZXJhdGlvbihlbmFfZGV2KTsKKwkJfSBlbHNlIHsKKwkJCXJjID0gZW5hX2NvbV91cGRhdGVfbm9uYWRhcHRpdmVfbW9kZXJhdGlvbl9pbnRlcnZhbF9yeChlbmFfZGV2LAorCQkJCQkJCQkJICAgICAgIGNvYWxlc2NlLT5yeF9jb2FsZXNjZV91c2Vjcyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwlpbnRyX21vZGVyX2VudHJ5LmludHJfbW9kZXJfaW50ZXJ2YWwgPSBjb2FsZXNjZS0+cnhfY29hbGVzY2VfdXNlY3NfbG93OworCWludHJfbW9kZXJfZW50cnkucGt0c19wZXJfaW50ZXJ2YWwgPSBjb2FsZXNjZS0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfbG93OworCWludHJfbW9kZXJfZW50cnkuYnl0ZXNfcGVyX2ludGVydmFsID0gRU5BX0lOVFJfQllURV9DT1VOVF9OT1RfU1VQUE9SVEVEOworCWVuYV9jb21faW5pdF9pbnRyX21vZGVyYXRpb25fZW50cnkoYWRhcHRlci0+ZW5hX2RldiwgRU5BX0lOVFJfTU9ERVJfTE9XRVNULCAmaW50cl9tb2Rlcl9lbnRyeSk7CisKKwlpbnRyX21vZGVyX2VudHJ5LmludHJfbW9kZXJfaW50ZXJ2YWwgPSBjb2FsZXNjZS0+cnhfY29hbGVzY2VfdXNlY3M7CisJaW50cl9tb2Rlcl9lbnRyeS5wa3RzX3Blcl9pbnRlcnZhbCA9IGNvYWxlc2NlLT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lczsKKwlpbnRyX21vZGVyX2VudHJ5LmJ5dGVzX3Blcl9pbnRlcnZhbCA9IEVOQV9JTlRSX0JZVEVfQ09VTlRfTk9UX1NVUFBPUlRFRDsKKwllbmFfY29tX2luaXRfaW50cl9tb2RlcmF0aW9uX2VudHJ5KGFkYXB0ZXItPmVuYV9kZXYsIEVOQV9JTlRSX01PREVSX01JRCwgJmludHJfbW9kZXJfZW50cnkpOworCisJaW50cl9tb2Rlcl9lbnRyeS5pbnRyX21vZGVyX2ludGVydmFsID0gY29hbGVzY2UtPnJ4X2NvYWxlc2NlX3VzZWNzX2hpZ2g7CisJaW50cl9tb2Rlcl9lbnRyeS5wa3RzX3Blcl9pbnRlcnZhbCA9IGNvYWxlc2NlLT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lc19oaWdoOworCWludHJfbW9kZXJfZW50cnkuYnl0ZXNfcGVyX2ludGVydmFsID0gRU5BX0lOVFJfQllURV9DT1VOVF9OT1RfU1VQUE9SVEVEOworCWVuYV9jb21faW5pdF9pbnRyX21vZGVyYXRpb25fZW50cnkoYWRhcHRlci0+ZW5hX2RldiwgRU5BX0lOVFJfTU9ERVJfSElHSEVTVCwgJmludHJfbW9kZXJfZW50cnkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgZW5hX2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlyZXR1cm4gYWRhcHRlci0+bXNnX2VuYWJsZTsKK30KKworc3RhdGljIHZvaWQgZW5hX3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgdmFsdWUpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWFkYXB0ZXItPm1zZ19lbmFibGUgPSB2YWx1ZTsKK30KKworc3RhdGljIHZvaWQgZW5hX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3RybGNweShpbmZvLT5kcml2ZXIsIERSVl9NT0RVTEVfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgRFJWX01PRFVMRV9WRVJTSU9OLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOworCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGFkYXB0ZXItPnBkZXYpLAorCQlzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKK30KKworc3RhdGljIHZvaWQgZW5hX2dldF9yaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgICAgIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcmluZykKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBlbmFfcmluZyAqdHhfcmluZyA9ICZhZGFwdGVyLT50eF9yaW5nWzBdOworCXN0cnVjdCBlbmFfcmluZyAqcnhfcmluZyA9ICZhZGFwdGVyLT5yeF9yaW5nWzBdOworCisJcmluZy0+cnhfbWF4X3BlbmRpbmcgPSByeF9yaW5nLT5yaW5nX3NpemU7CisJcmluZy0+dHhfbWF4X3BlbmRpbmcgPSB0eF9yaW5nLT5yaW5nX3NpemU7CisJcmluZy0+cnhfcGVuZGluZyA9IHJ4X3JpbmctPnJpbmdfc2l6ZTsKKwlyaW5nLT50eF9wZW5kaW5nID0gdHhfcmluZy0+cmluZ19zaXplOworfQorCitzdGF0aWMgdTMyIGVuYV9mbG93X2hhc2hfdG9fZmxvd190eXBlKHUxNiBoYXNoX2ZpZWxkcykKK3sKKwl1MzIgZGF0YSA9IDA7CisKKwlpZiAoaGFzaF9maWVsZHMgJiBFTkFfQURNSU5fUlNTX0wyX0RBKQorCQlkYXRhIHw9IFJYSF9MMkRBOworCisJaWYgKGhhc2hfZmllbGRzICYgRU5BX0FETUlOX1JTU19MM19EQSkKKwkJZGF0YSB8PSBSWEhfSVBfRFNUOworCisJaWYgKGhhc2hfZmllbGRzICYgRU5BX0FETUlOX1JTU19MM19TQSkKKwkJZGF0YSB8PSBSWEhfSVBfU1JDOworCisJaWYgKGhhc2hfZmllbGRzICYgRU5BX0FETUlOX1JTU19MNF9EUCkKKwkJZGF0YSB8PSBSWEhfTDRfQl8yXzM7CisKKwlpZiAoaGFzaF9maWVsZHMgJiBFTkFfQURNSU5fUlNTX0w0X1NQKQorCQlkYXRhIHw9IFJYSF9MNF9CXzBfMTsKKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgdTE2IGVuYV9mbG93X2RhdGFfdG9fZmxvd19oYXNoKHUzMiBoYXNoX2ZpZWxkcykKK3sKKwl1MTYgZGF0YSA9IDA7CisKKwlpZiAoaGFzaF9maWVsZHMgJiBSWEhfTDJEQSkKKwkJZGF0YSB8PSBFTkFfQURNSU5fUlNTX0wyX0RBOworCisJaWYgKGhhc2hfZmllbGRzICYgUlhIX0lQX0RTVCkKKwkJZGF0YSB8PSBFTkFfQURNSU5fUlNTX0wzX0RBOworCisJaWYgKGhhc2hfZmllbGRzICYgUlhIX0lQX1NSQykKKwkJZGF0YSB8PSBFTkFfQURNSU5fUlNTX0wzX1NBOworCisJaWYgKGhhc2hfZmllbGRzICYgUlhIX0w0X0JfMl8zKQorCQlkYXRhIHw9IEVOQV9BRE1JTl9SU1NfTDRfRFA7CisKKwlpZiAoaGFzaF9maWVsZHMgJiBSWEhfTDRfQl8wXzEpCisJCWRhdGEgfD0gRU5BX0FETUlOX1JTU19MNF9TUDsKKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW50IGVuYV9nZXRfcnNzX2hhc2goc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJICAgIHN0cnVjdCBldGh0b29sX3J4bmZjICpjbWQpCit7CisJZW51bSBlbmFfYWRtaW5fZmxvd19oYXNoX3Byb3RvIHByb3RvOworCXUxNiBoYXNoX2ZpZWxkczsKKwlpbnQgcmM7CisKKwljbWQtPmRhdGEgPSAwOworCisJc3dpdGNoIChjbWQtPmZsb3dfdHlwZSkgeworCWNhc2UgVENQX1Y0X0ZMT1c6CisJCXByb3RvID0gRU5BX0FETUlOX1JTU19UQ1A0OworCQlicmVhazsKKwljYXNlIFVEUF9WNF9GTE9XOgorCQlwcm90byA9IEVOQV9BRE1JTl9SU1NfVURQNDsKKwkJYnJlYWs7CisJY2FzZSBUQ1BfVjZfRkxPVzoKKwkJcHJvdG8gPSBFTkFfQURNSU5fUlNTX1RDUDY7CisJCWJyZWFrOworCWNhc2UgVURQX1Y2X0ZMT1c6CisJCXByb3RvID0gRU5BX0FETUlOX1JTU19VRFA2OworCQlicmVhazsKKwljYXNlIElQVjRfRkxPVzoKKwkJcHJvdG8gPSBFTkFfQURNSU5fUlNTX0lQNDsKKwkJYnJlYWs7CisJY2FzZSBJUFY2X0ZMT1c6CisJCXByb3RvID0gRU5BX0FETUlOX1JTU19JUDY7CisJCWJyZWFrOworCWNhc2UgRVRIRVJfRkxPVzoKKwkJcHJvdG8gPSBFTkFfQURNSU5fUlNTX05PVF9JUDsKKwkJYnJlYWs7CisJY2FzZSBBSF9WNF9GTE9XOgorCWNhc2UgRVNQX1Y0X0ZMT1c6CisJY2FzZSBBSF9WNl9GTE9XOgorCWNhc2UgRVNQX1Y2X0ZMT1c6CisJY2FzZSBTQ1RQX1Y0X0ZMT1c6CisJY2FzZSBBSF9FU1BfVjRfRkxPVzoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJjID0gZW5hX2NvbV9nZXRfaGFzaF9jdHJsKGVuYV9kZXYsIHByb3RvLCAmaGFzaF9maWVsZHMpOworCWlmIChyYykgeworCQkvKiBJZiBkZXZpY2UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uLCByZXR1cm4gdW5zdXBwb3J0ZWQgKi8KKwkJaWYgKHJjID09IC1FUEVSTSkKKwkJCXJjID0gLUVPUE5PVFNVUFA7CisJCXJldHVybiByYzsKKwl9CisKKwljbWQtPmRhdGEgPSBlbmFfZmxvd19oYXNoX3RvX2Zsb3dfdHlwZShoYXNoX2ZpZWxkcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmFfc2V0X3Jzc19oYXNoKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCSAgICBzdHJ1Y3QgZXRodG9vbF9yeG5mYyAqY21kKQoreworCWVudW0gZW5hX2FkbWluX2Zsb3dfaGFzaF9wcm90byBwcm90bzsKKwl1MTYgaGFzaF9maWVsZHM7CisKKwlzd2l0Y2ggKGNtZC0+Zmxvd190eXBlKSB7CisJY2FzZSBUQ1BfVjRfRkxPVzoKKwkJcHJvdG8gPSBFTkFfQURNSU5fUlNTX1RDUDQ7CisJCWJyZWFrOworCWNhc2UgVURQX1Y0X0ZMT1c6CisJCXByb3RvID0gRU5BX0FETUlOX1JTU19VRFA0OworCQlicmVhazsKKwljYXNlIFRDUF9WNl9GTE9XOgorCQlwcm90byA9IEVOQV9BRE1JTl9SU1NfVENQNjsKKwkJYnJlYWs7CisJY2FzZSBVRFBfVjZfRkxPVzoKKwkJcHJvdG8gPSBFTkFfQURNSU5fUlNTX1VEUDY7CisJCWJyZWFrOworCWNhc2UgSVBWNF9GTE9XOgorCQlwcm90byA9IEVOQV9BRE1JTl9SU1NfSVA0OworCQlicmVhazsKKwljYXNlIElQVjZfRkxPVzoKKwkJcHJvdG8gPSBFTkFfQURNSU5fUlNTX0lQNjsKKwkJYnJlYWs7CisJY2FzZSBFVEhFUl9GTE9XOgorCQlwcm90byA9IEVOQV9BRE1JTl9SU1NfTk9UX0lQOworCQlicmVhazsKKwljYXNlIEFIX1Y0X0ZMT1c6CisJY2FzZSBFU1BfVjRfRkxPVzoKKwljYXNlIEFIX1Y2X0ZMT1c6CisJY2FzZSBFU1BfVjZfRkxPVzoKKwljYXNlIFNDVFBfVjRfRkxPVzoKKwljYXNlIEFIX0VTUF9WNF9GTE9XOgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaGFzaF9maWVsZHMgPSBlbmFfZmxvd19kYXRhX3RvX2Zsb3dfaGFzaChjbWQtPmRhdGEpOworCisJcmV0dXJuIGVuYV9jb21fZmlsbF9oYXNoX2N0cmwoZW5hX2RldiwgcHJvdG8sIGhhc2hfZmllbGRzKTsKK30KKworc3RhdGljIGludCBlbmFfc2V0X3J4bmZjKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX3J4bmZjICppbmZvKQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoaW5mby0+Y21kKSB7CisJY2FzZSBFVEhUT09MX1NSWEZIOgorCQlyYyA9IGVuYV9zZXRfcnNzX2hhc2goYWRhcHRlci0+ZW5hX2RldiwgaW5mbyk7CisJCWJyZWFrOworCWNhc2UgRVRIVE9PTF9TUlhDTFNSTERFTDoKKwljYXNlIEVUSFRPT0xfU1JYQ0xTUkxJTlM6CisJZGVmYXVsdDoKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIGRydiwgbmV0ZGV2LAorCQkJICAiQ29tbWFuZCBwYXJhbWV0ZXIgJWQgaXMgbm90IHN1cHBvcnRlZFxuIiwgaW5mby0+Y21kKTsKKwkJcmMgPSAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gKHJjID09IC1FUEVSTSkgPyAtRU9QTk9UU1VQUCA6IHJjOworfQorCitzdGF0aWMgaW50IGVuYV9nZXRfcnhuZmMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfcnhuZmMgKmluZm8sCisJCQkgdTMyICpydWxlcykKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGluZm8tPmNtZCkgeworCWNhc2UgRVRIVE9PTF9HUlhSSU5HUzoKKwkJaW5mby0+ZGF0YSA9IGFkYXB0ZXItPm51bV9xdWV1ZXM7CisJCXJjID0gMDsKKwkJYnJlYWs7CisJY2FzZSBFVEhUT09MX0dSWEZIOgorCQlyYyA9IGVuYV9nZXRfcnNzX2hhc2goYWRhcHRlci0+ZW5hX2RldiwgaW5mbyk7CisJCWJyZWFrOworCWNhc2UgRVRIVE9PTF9HUlhDTFNSTENOVDoKKwljYXNlIEVUSFRPT0xfR1JYQ0xTUlVMRToKKwljYXNlIEVUSFRPT0xfR1JYQ0xTUkxBTEw6CisJZGVmYXVsdDoKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIGRydiwgbmV0ZGV2LAorCQkJICAiQ29tbWFuZCBwYXJhbWV0ZXIgJWQgaXMgbm90IHN1cHBvcnRlZFxuIiwgaW5mby0+Y21kKTsKKwkJcmMgPSAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gKHJjID09IC1FUEVSTSkgPyAtRU9QTk9UU1VQUCA6IHJjOworfQorCitzdGF0aWMgdTMyIGVuYV9nZXRfcnhmaF9pbmRpcl9zaXplKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJcmV0dXJuIEVOQV9SWF9SU1NfVEFCTEVfU0laRTsKK30KKworc3RhdGljIHUzMiBlbmFfZ2V0X3J4Zmhfa2V5X3NpemUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlyZXR1cm4gRU5BX0hBU0hfS0VZX1NJWkU7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2dldF9yeGZoKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiAqaW5kaXIsIHU4ICprZXksCisJCQl1OCAqaGZ1bmMpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwllbnVtIGVuYV9hZG1pbl9oYXNoX2Z1bmN0aW9ucyBlbmFfZnVuYzsKKwl1OCBmdW5jOworCWludCByYzsKKworCXJjID0gZW5hX2NvbV9pbmRpcmVjdF90YWJsZV9nZXQoYWRhcHRlci0+ZW5hX2RldiwgaW5kaXIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBlbmFfY29tX2dldF9oYXNoX2Z1bmN0aW9uKGFkYXB0ZXItPmVuYV9kZXYsICZlbmFfZnVuYywga2V5KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXN3aXRjaCAoZW5hX2Z1bmMpIHsKKwljYXNlIEVOQV9BRE1JTl9UT0VQTElUWjoKKwkJZnVuYyA9IEVUSF9SU1NfSEFTSF9UT1A7CisJCWJyZWFrOworCWNhc2UgRU5BX0FETUlOX0NSQzMyOgorCQlmdW5jID0gRVRIX1JTU19IQVNIX1hPUjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIGRydiwgbmV0ZGV2LAorCQkJICAiQ29tbWFuZCBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlpZiAoaGZ1bmMpCisJCSpoZnVuYyA9IGZ1bmM7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZW5hX3NldF9yeGZoKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGNvbnN0IHUzMiAqaW5kaXIsCisJCQljb25zdCB1OCAqa2V5LCBjb25zdCB1OCBoZnVuYykKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiA9IGFkYXB0ZXItPmVuYV9kZXY7CisJZW51bSBlbmFfYWRtaW5faGFzaF9mdW5jdGlvbnMgZnVuYzsKKwlpbnQgcmMsIGk7CisKKwlpZiAoaW5kaXIpIHsKKwkJZm9yIChpID0gMDsgaSA8IEVOQV9SWF9SU1NfVEFCTEVfU0laRTsgaSsrKSB7CisJCQlyYyA9IGVuYV9jb21faW5kaXJlY3RfdGFibGVfZmlsbF9lbnRyeShlbmFfZGV2LAorCQkJCQkJCSAgICAgICBFTkFfSU9fUlhRX0lEWChpbmRpcltpXSksCisJCQkJCQkJICAgICAgIGkpOworCQkJaWYgKHVubGlrZWx5KHJjKSkgeworCQkJCW5ldGlmX2VycihhZGFwdGVyLCBkcnYsIG5ldGRldiwKKwkJCQkJICAiQ2Fubm90IGZpbGwgaW5kaXJlY3QgdGFibGUgKGluZGV4IGlzIHRvbyBsYXJnZSlcbiIpOworCQkJCXJldHVybiByYzsKKwkJCX0KKwkJfQorCisJCXJjID0gZW5hX2NvbV9pbmRpcmVjdF90YWJsZV9zZXQoZW5hX2Rldik7CisJCWlmIChyYykgeworCQkJbmV0aWZfZXJyKGFkYXB0ZXIsIGRydiwgbmV0ZGV2LAorCQkJCSAgIkNhbm5vdCBzZXQgaW5kaXJlY3QgdGFibGVcbiIpOworCQkJcmV0dXJuIHJjID09IC1FUEVSTSA/IC1FT1BOT1RTVVBQIDogcmM7CisJCX0KKwl9CisKKwlzd2l0Y2ggKGhmdW5jKSB7CisJY2FzZSBFVEhfUlNTX0hBU0hfVE9QOgorCQlmdW5jID0gRU5BX0FETUlOX1RPRVBMSVRaOworCQlicmVhazsKKwljYXNlIEVUSF9SU1NfSEFTSF9YT1I6CisJCWZ1bmMgPSBFTkFfQURNSU5fQ1JDMzI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW5ldGlmX2VycihhZGFwdGVyLCBkcnYsIG5ldGRldiwgIlVuc3VwcG9ydGVkIGhmdW5jICVkXG4iLAorCQkJICBoZnVuYyk7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlpZiAoa2V5KSB7CisJCXJjID0gZW5hX2NvbV9maWxsX2hhc2hfZnVuY3Rpb24oZW5hX2RldiwgZnVuYywga2V5LAorCQkJCQkJRU5BX0hBU0hfS0VZX1NJWkUsCisJCQkJCQkweEZGRkZGRkZGKTsKKwkJaWYgKHVubGlrZWx5KHJjKSkgeworCQkJbmV0aWZfZXJyKGFkYXB0ZXIsIGRydiwgbmV0ZGV2LCAiQ2Fubm90IGZpbGwga2V5XG4iKTsKKwkJCXJldHVybiByYyA9PSAtRVBFUk0gPyAtRU9QTk9UU1VQUCA6IHJjOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9nZXRfY2hhbm5lbHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgICAgc3RydWN0IGV0aHRvb2xfY2hhbm5lbHMgKmNoYW5uZWxzKQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwljaGFubmVscy0+bWF4X3J4ID0gRU5BX01BWF9OVU1fSU9fUVVFVUVTOworCWNoYW5uZWxzLT5tYXhfdHggPSBFTkFfTUFYX05VTV9JT19RVUVVRVM7CisJY2hhbm5lbHMtPm1heF9vdGhlciA9IDA7CisJY2hhbm5lbHMtPm1heF9jb21iaW5lZCA9IDA7CisJY2hhbm5lbHMtPnJ4X2NvdW50ID0gYWRhcHRlci0+bnVtX3F1ZXVlczsKKwljaGFubmVscy0+dHhfY291bnQgPSBhZGFwdGVyLT5udW1fcXVldWVzOworCWNoYW5uZWxzLT5vdGhlcl9jb3VudCA9IDA7CisJY2hhbm5lbHMtPmNvbWJpbmVkX2NvdW50ID0gMDsKK30KKworc3RhdGljIGludCBlbmFfZ2V0X3R1bmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgIGNvbnN0IHN0cnVjdCBldGh0b29sX3R1bmFibGUgKnR1bmEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAodHVuYS0+aWQpIHsKKwljYXNlIEVUSFRPT0xfUlhfQ09QWUJSRUFLOgorCQkqKHUzMiAqKWRhdGEgPSBhZGFwdGVyLT5yeF9jb3B5YnJlYWs7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZW5hX3NldF90dW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICBjb25zdCBzdHJ1Y3QgZXRodG9vbF90dW5hYmxlICp0dW5hLAorCQkJICAgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCByZXQgPSAwOworCXUzMiBsZW47CisKKwlzd2l0Y2ggKHR1bmEtPmlkKSB7CisJY2FzZSBFVEhUT09MX1JYX0NPUFlCUkVBSzoKKwkJbGVuID0gKih1MzIgKilkYXRhOworCQlpZiAobGVuID4gYWRhcHRlci0+bmV0ZGV2LT5tdHUpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlhZGFwdGVyLT5yeF9jb3B5YnJlYWsgPSBsZW47CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgZW5hX2V0aHRvb2xfb3BzID0geworCS5nZXRfbGlua19rc2V0dGluZ3MJPSBlbmFfZ2V0X2xpbmtfa3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbwkJPSBlbmFfZ2V0X2RydmluZm8sCisJLmdldF9tc2dsZXZlbAkJPSBlbmFfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gZW5hX3NldF9tc2dsZXZlbCwKKwkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X2NvYWxlc2NlCQk9IGVuYV9nZXRfY29hbGVzY2UsCisJLnNldF9jb2FsZXNjZQkJPSBlbmFfc2V0X2NvYWxlc2NlLAorCS5nZXRfcmluZ3BhcmFtCQk9IGVuYV9nZXRfcmluZ3BhcmFtLAorCS5nZXRfc3NldF9jb3VudCAgICAgICAgID0gZW5hX2dldF9zc2V0X2NvdW50LAorCS5nZXRfc3RyaW5ncwkJPSBlbmFfZ2V0X3N0cmluZ3MsCisJLmdldF9ldGh0b29sX3N0YXRzICAgICAgPSBlbmFfZ2V0X2V0aHRvb2xfc3RhdHMsCisJLmdldF9yeG5mYwkJPSBlbmFfZ2V0X3J4bmZjLAorCS5zZXRfcnhuZmMJCT0gZW5hX3NldF9yeG5mYywKKwkuZ2V0X3J4ZmhfaW5kaXJfc2l6ZSAgICA9IGVuYV9nZXRfcnhmaF9pbmRpcl9zaXplLAorCS5nZXRfcnhmaF9rZXlfc2l6ZQk9IGVuYV9nZXRfcnhmaF9rZXlfc2l6ZSwKKwkuZ2V0X3J4ZmgJCT0gZW5hX2dldF9yeGZoLAorCS5zZXRfcnhmaAkJPSBlbmFfc2V0X3J4ZmgsCisJLmdldF9jaGFubmVscwkJPSBlbmFfZ2V0X2NoYW5uZWxzLAorCS5nZXRfdHVuYWJsZQkJPSBlbmFfZ2V0X3R1bmFibGUsCisJLnNldF90dW5hYmxlCQk9IGVuYV9zZXRfdHVuYWJsZSwKK307CisKK3ZvaWQgZW5hX3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCW5ldGRldi0+ZXRodG9vbF9vcHMgPSAmZW5hX2V0aHRvb2xfb3BzOworfQorCitzdGF0aWMgdm9pZCBlbmFfZHVtcF9zdGF0c19leChzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICpidWYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwl1OCAqc3RyaW5nc19idWY7CisJdTY0ICpkYXRhX2J1ZjsKKwlpbnQgc3RyaW5nc19udW07CisJaW50IGksIHJjOworCisJc3RyaW5nc19udW0gPSBlbmFfZ2V0X3NzZXRfY291bnQobmV0ZGV2LCBFVEhfU1NfU1RBVFMpOworCWlmIChzdHJpbmdzX251bSA8PSAwKSB7CisJCW5ldGlmX2VycihhZGFwdGVyLCBkcnYsIG5ldGRldiwgIkNhbid0IGdldCBzdGF0cyBudW1cbiIpOworCQlyZXR1cm47CisJfQorCisJc3RyaW5nc19idWYgPSBkZXZtX2t6YWxsb2MoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkgICBzdHJpbmdzX251bSAqIEVUSF9HU1RSSU5HX0xFTiwKKwkJCQkgICBHRlBfQVRPTUlDKTsKKwlpZiAoIXN0cmluZ3NfYnVmKSB7CisJCW5ldGlmX2VycihhZGFwdGVyLCBkcnYsIG5ldGRldiwKKwkJCSAgImZhaWxlZCB0byBhbGxvYyBzdHJpbmdzX2J1ZlxuIik7CisJCXJldHVybjsKKwl9CisKKwlkYXRhX2J1ZiA9IGRldm1fa3phbGxvYygmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJCXN0cmluZ3NfbnVtICogc2l6ZW9mKHU2NCksCisJCQkJR0ZQX0FUT01JQyk7CisJaWYgKCFkYXRhX2J1ZikgeworCQluZXRpZl9lcnIoYWRhcHRlciwgZHJ2LCBuZXRkZXYsCisJCQkgICJmYWlsZWQgdG8gYWxsb2NhdGUgZGF0YSBidWZcbiIpOworCQlkZXZtX2tmcmVlKCZhZGFwdGVyLT5wZGV2LT5kZXYsIHN0cmluZ3NfYnVmKTsKKwkJcmV0dXJuOworCX0KKworCWVuYV9nZXRfc3RyaW5ncyhuZXRkZXYsIEVUSF9TU19TVEFUUywgc3RyaW5nc19idWYpOworCWVuYV9nZXRfZXRodG9vbF9zdGF0cyhuZXRkZXYsIE5VTEwsIGRhdGFfYnVmKTsKKworCS8qIElmIHRoZXJlIGlzIGEgYnVmZmVyLCBkdW1wIHN0YXRzLCBvdGhlcndpc2UgcHJpbnQgdGhlbSB0byBkbWVzZyAqLworCWlmIChidWYpCisJCWZvciAoaSA9IDA7IGkgPCBzdHJpbmdzX251bTsgaSsrKSB7CisJCQlyYyA9IHNucHJpbnRmKGJ1ZiwgRVRIX0dTVFJJTkdfTEVOICsgc2l6ZW9mKHU2NCksCisJCQkJICAgICAgIiVzICVsbHVcbiIsCisJCQkJICAgICAgc3RyaW5nc19idWYgKyBpICogRVRIX0dTVFJJTkdfTEVOLAorCQkJCSAgICAgIGRhdGFfYnVmW2ldKTsKKwkJCWJ1ZiArPSByYzsKKwkJfQorCWVsc2UKKwkJZm9yIChpID0gMDsgaSA8IHN0cmluZ3NfbnVtOyBpKyspCisJCQluZXRpZl9lcnIoYWRhcHRlciwgZHJ2LCBuZXRkZXYsICIlczogJWxsdVxuIiwKKwkJCQkgIHN0cmluZ3NfYnVmICsgaSAqIEVUSF9HU1RSSU5HX0xFTiwKKwkJCQkgIGRhdGFfYnVmW2ldKTsKKworCWRldm1fa2ZyZWUoJmFkYXB0ZXItPnBkZXYtPmRldiwgc3RyaW5nc19idWYpOworCWRldm1fa2ZyZWUoJmFkYXB0ZXItPnBkZXYtPmRldiwgZGF0YV9idWYpOworfQorCit2b2lkIGVuYV9kdW1wX3N0YXRzX3RvX2J1ZihzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICpidWYpCit7CisJaWYgKCFidWYpCisJCXJldHVybjsKKworCWVuYV9kdW1wX3N0YXRzX2V4KGFkYXB0ZXIsIGJ1Zik7Cit9CisKK3ZvaWQgZW5hX2R1bXBfc3RhdHNfdG9fZG1lc2coc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCWVuYV9kdW1wX3N0YXRzX2V4KGFkYXB0ZXIsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfbmV0ZGV2LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9uZXRkZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmVhZWM1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfbmV0ZGV2LmMKQEAgLTAsMCArMSwzMjcyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpZmRlZiBDT05GSUdfUkZTX0FDQ0VMCisjaW5jbHVkZSA8bGludXgvY3B1X3JtYXAuaD4KKyNlbmRpZiAvKiBDT05GSUdfUkZTX0FDQ0VMICovCisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L251bWEuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKworI2luY2x1ZGUgImVuYV9uZXRkZXYuaCIKKyNpbmNsdWRlICJlbmFfcGNpX2lkX3RibC5oIgorCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gPSBERVZJQ0VfTkFNRSAiIHYiIERSVl9NT0RVTEVfVkVSU0lPTiAiXG4iOworCitNT0RVTEVfQVVUSE9SKCJBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzIik7CitNT0RVTEVfREVTQ1JJUFRJT04oREVWSUNFX05BTUUpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX01PRFVMRV9WRVJTSU9OKTsKKworLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nLiAqLworI2RlZmluZSBUWF9USU1FT1VUICAoNSAqIEhaKQorCisjZGVmaW5lIEVOQV9OQVBJX0JVREdFVCA2NAorCisjZGVmaW5lIERFRkFVTFRfTVNHX0VOQUJMRSAoTkVUSUZfTVNHX0RSViB8IE5FVElGX01TR19QUk9CRSB8IE5FVElGX01TR19JRlVQIHwgXAorCQlORVRJRl9NU0dfVFhfRE9ORSB8IE5FVElGX01TR19UWF9FUlIgfCBORVRJRl9NU0dfUlhfRVJSKQorc3RhdGljIGludCBkZWJ1ZyA9IC0xOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGxldmVsICgwPW5vbmUsLi4uLDE2PWFsbCkiKTsKKworc3RhdGljIHN0cnVjdCBlbmFfYWVucV9oYW5kbGVycyBhZW5xX2hhbmRsZXJzOworCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmVuYV93cTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGVuYV9wY2lfdGJsKTsKKworc3RhdGljIGludCBlbmFfcnNzX2luaXRfZGVmYXVsdChzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpOworCitzdGF0aWMgdm9pZCBlbmFfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CisKKwl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZhZGFwdGVyLT5zeW5jcCk7CisJYWRhcHRlci0+ZGV2X3N0YXRzLnR4X3RpbWVvdXQrKzsKKwl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmYWRhcHRlci0+c3luY3ApOworCisJbmV0aWZfZXJyKGFkYXB0ZXIsIHR4X2VyciwgZGV2LCAiVHJhbnNtaXQgdGltZSBvdXRcbiIpOworCisJLyogQ2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUgZGV2aWNlIHRvIHRyaWdnZXIgcmVzZXQgKi8KKwlzZXRfYml0KEVOQV9GTEFHX1RSSUdHRVJfUkVTRVQsICZhZGFwdGVyLT5mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9yeF9yaW5nX210dShzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBtdHUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKQorCQlhZGFwdGVyLT5yeF9yaW5nW2ldLm10dSA9IG10dTsKK30KKworc3RhdGljIGludCBlbmFfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByZXQ7CisKKwlpZiAoKG5ld19tdHUgPiBhZGFwdGVyLT5tYXhfbXR1KSB8fCAobmV3X210dSA8IEVOQV9NSU5fTVRVKSkgeworCQluZXRpZl9lcnIoYWRhcHRlciwgZHJ2LCBkZXYsCisJCQkgICJJbnZhbGlkIE1UVSBzZXR0aW5nLiBuZXdfbXR1OiAlZFxuIiwgbmV3X210dSk7CisKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gZW5hX2NvbV9zZXRfZGV2X210dShhZGFwdGVyLT5lbmFfZGV2LCBuZXdfbXR1KTsKKwlpZiAoIXJldCkgeworCQluZXRpZl9kYmcoYWRhcHRlciwgZHJ2LCBkZXYsICJzZXQgTVRVIHRvICVkXG4iLCBuZXdfbXR1KTsKKwkJdXBkYXRlX3J4X3JpbmdfbXR1KGFkYXB0ZXIsIG5ld19tdHUpOworCQlkZXYtPm10dSA9IG5ld19tdHU7CisJfSBlbHNlIHsKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIGRydiwgZGV2LCAiRmFpbGVkIHRvIHNldCBNVFUgdG8gJWRcbiIsCisJCQkgIG5ld19tdHUpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2luaXRfcnhfY3B1X3JtYXAoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworI2lmZGVmIENPTkZJR19SRlNfQUNDRUwKKwl1MzIgaTsKKwlpbnQgcmM7CisKKwlhZGFwdGVyLT5uZXRkZXYtPnJ4X2NwdV9ybWFwID0gYWxsb2NfaXJxX2NwdV9ybWFwKGFkYXB0ZXItPm51bV9xdWV1ZXMpOworCWlmICghYWRhcHRlci0+bmV0ZGV2LT5yeF9jcHVfcm1hcCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykgeworCQlpbnQgaXJxX2lkeCA9IEVOQV9JT19JUlFfSURYKGkpOworCisJCXJjID0gaXJxX2NwdV9ybWFwX2FkZChhZGFwdGVyLT5uZXRkZXYtPnJ4X2NwdV9ybWFwLAorCQkJCSAgICAgIGFkYXB0ZXItPm1zaXhfZW50cmllc1tpcnFfaWR4XS52ZWN0b3IpOworCQlpZiAocmMpIHsKKwkJCWZyZWVfaXJxX2NwdV9ybWFwKGFkYXB0ZXItPm5ldGRldi0+cnhfY3B1X3JtYXApOworCQkJYWRhcHRlci0+bmV0ZGV2LT5yeF9jcHVfcm1hcCA9IE5VTEw7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisjZW5kaWYgLyogQ09ORklHX1JGU19BQ0NFTCAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlbmFfaW5pdF9pb19yaW5nc19jb21tb24oc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyLAorCQkJCSAgICAgc3RydWN0IGVuYV9yaW5nICpyaW5nLCB1MTYgcWlkKQoreworCXJpbmctPnFpZCA9IHFpZDsKKwlyaW5nLT5wZGV2ID0gYWRhcHRlci0+cGRldjsKKwlyaW5nLT5kZXYgPSAmYWRhcHRlci0+cGRldi0+ZGV2OworCXJpbmctPm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwlyaW5nLT5uYXBpID0gJmFkYXB0ZXItPmVuYV9uYXBpW3FpZF0ubmFwaTsKKwlyaW5nLT5hZGFwdGVyID0gYWRhcHRlcjsKKwlyaW5nLT5lbmFfZGV2ID0gYWRhcHRlci0+ZW5hX2RldjsKKwlyaW5nLT5wZXJfbmFwaV9wYWNrZXRzID0gMDsKKwlyaW5nLT5wZXJfbmFwaV9ieXRlcyA9IDA7CisJcmluZy0+Y3B1ID0gMDsKKwl1NjRfc3RhdHNfaW5pdCgmcmluZy0+c3luY3ApOworfQorCitzdGF0aWMgdm9pZCBlbmFfaW5pdF9pb19yaW5ncyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2OworCXN0cnVjdCBlbmFfcmluZyAqdHhyLCAqcnhyOworCWludCBpOworCisJZW5hX2RldiA9IGFkYXB0ZXItPmVuYV9kZXY7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKSB7CisJCXR4ciA9ICZhZGFwdGVyLT50eF9yaW5nW2ldOworCQlyeHIgPSAmYWRhcHRlci0+cnhfcmluZ1tpXTsKKworCQkvKiBUWC9SWCBjb21tb24gcmluZyBzdGF0ZSAqLworCQllbmFfaW5pdF9pb19yaW5nc19jb21tb24oYWRhcHRlciwgdHhyLCBpKTsKKwkJZW5hX2luaXRfaW9fcmluZ3NfY29tbW9uKGFkYXB0ZXIsIHJ4ciwgaSk7CisKKwkJLyogVFggc3BlY2lmaWMgcmluZyBzdGF0ZSAqLworCQl0eHItPnJpbmdfc2l6ZSA9IGFkYXB0ZXItPnR4X3Jpbmdfc2l6ZTsKKwkJdHhyLT50eF9tYXhfaGVhZGVyX3NpemUgPSBlbmFfZGV2LT50eF9tYXhfaGVhZGVyX3NpemU7CisJCXR4ci0+dHhfbWVtX3F1ZXVlX3R5cGUgPSBlbmFfZGV2LT50eF9tZW1fcXVldWVfdHlwZTsKKwkJdHhyLT5zZ2xfc2l6ZSA9IGFkYXB0ZXItPm1heF90eF9zZ2xfc2l6ZTsKKwkJdHhyLT5zbW9vdGhlZF9pbnRlcnZhbCA9CisJCQllbmFfY29tX2dldF9ub25hZGFwdGl2ZV9tb2RlcmF0aW9uX2ludGVydmFsX3R4KGVuYV9kZXYpOworCisJCS8qIFJYIHNwZWNpZmljIHJpbmcgc3RhdGUgKi8KKwkJcnhyLT5yaW5nX3NpemUgPSBhZGFwdGVyLT5yeF9yaW5nX3NpemU7CisJCXJ4ci0+cnhfY29weWJyZWFrID0gYWRhcHRlci0+cnhfY29weWJyZWFrOworCQlyeHItPnNnbF9zaXplID0gYWRhcHRlci0+bWF4X3J4X3NnbF9zaXplOworCQlyeHItPnNtb290aGVkX2ludGVydmFsID0KKwkJCWVuYV9jb21fZ2V0X25vbmFkYXB0aXZlX21vZGVyYXRpb25faW50ZXJ2YWxfcngoZW5hX2Rldik7CisJfQorfQorCisvKiBlbmFfc2V0dXBfdHhfcmVzb3VyY2VzIC0gYWxsb2NhdGUgSS9PIFR4IHJlc291cmNlcyAoRGVzY3JpcHRvcnMpCisgKiBAYWRhcHRlcjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICogQHFpZDogcXVldWUgaW5kZXgKKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgZW5hX3NldHVwX3R4X3Jlc291cmNlcyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBxaWQpCit7CisJc3RydWN0IGVuYV9yaW5nICp0eF9yaW5nID0gJmFkYXB0ZXItPnR4X3JpbmdbcWlkXTsKKwlzdHJ1Y3QgZW5hX2lycSAqZW5hX2lycSA9ICZhZGFwdGVyLT5pcnFfdGJsW0VOQV9JT19JUlFfSURYKHFpZCldOworCWludCBzaXplLCBpLCBub2RlOworCisJaWYgKHR4X3JpbmctPnR4X2J1ZmZlcl9pbmZvKSB7CisJCW5ldGlmX2VycihhZGFwdGVyLCBpZnVwLAorCQkJICBhZGFwdGVyLT5uZXRkZXYsICJ0eF9idWZmZXJfaW5mbyBpbmZvIGlzIG5vdCBOVUxMIik7CisJCXJldHVybiAtRUVYSVNUOworCX0KKworCXNpemUgPSBzaXplb2Yoc3RydWN0IGVuYV90eF9idWZmZXIpICogdHhfcmluZy0+cmluZ19zaXplOworCW5vZGUgPSBjcHVfdG9fbm9kZShlbmFfaXJxLT5jcHUpOworCisJdHhfcmluZy0+dHhfYnVmZmVyX2luZm8gPSB2emFsbG9jX25vZGUoc2l6ZSwgbm9kZSk7CisJaWYgKCF0eF9yaW5nLT50eF9idWZmZXJfaW5mbykgeworCQl0eF9yaW5nLT50eF9idWZmZXJfaW5mbyA9IHZ6YWxsb2Moc2l6ZSk7CisJCWlmICghdHhfcmluZy0+dHhfYnVmZmVyX2luZm8pCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzaXplID0gc2l6ZW9mKHUxNikgKiB0eF9yaW5nLT5yaW5nX3NpemU7CisJdHhfcmluZy0+ZnJlZV90eF9pZHMgPSB2emFsbG9jX25vZGUoc2l6ZSwgbm9kZSk7CisJaWYgKCF0eF9yaW5nLT5mcmVlX3R4X2lkcykgeworCQl0eF9yaW5nLT5mcmVlX3R4X2lkcyA9IHZ6YWxsb2Moc2l6ZSk7CisJCWlmICghdHhfcmluZy0+ZnJlZV90eF9pZHMpIHsKKwkJCXZmcmVlKHR4X3JpbmctPnR4X2J1ZmZlcl9pbmZvKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJLyogUmVxIGlkIHJpbmcgZm9yIFRYIG91dCBvZiBvcmRlciBjb21wbGV0aW9ucyAqLworCWZvciAoaSA9IDA7IGkgPCB0eF9yaW5nLT5yaW5nX3NpemU7IGkrKykKKwkJdHhfcmluZy0+ZnJlZV90eF9pZHNbaV0gPSBpOworCisJLyogUmVzZXQgdHggc3RhdGlzdGljcyAqLworCW1lbXNldCgmdHhfcmluZy0+dHhfc3RhdHMsIDB4MCwgc2l6ZW9mKHR4X3JpbmctPnR4X3N0YXRzKSk7CisKKwl0eF9yaW5nLT5uZXh0X3RvX3VzZSA9IDA7CisJdHhfcmluZy0+bmV4dF90b19jbGVhbiA9IDA7CisJdHhfcmluZy0+Y3B1ID0gZW5hX2lycS0+Y3B1OworCXJldHVybiAwOworfQorCisvKiBlbmFfZnJlZV90eF9yZXNvdXJjZXMgLSBGcmVlIEkvTyBUeCBSZXNvdXJjZXMgcGVyIFF1ZXVlCisgKiBAYWRhcHRlcjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICogQHFpZDogcXVldWUgaW5kZXgKKyAqCisgKiBGcmVlIGFsbCB0cmFuc21pdCBzb2Z0d2FyZSByZXNvdXJjZXMKKyAqLworc3RhdGljIHZvaWQgZW5hX2ZyZWVfdHhfcmVzb3VyY2VzKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciwgaW50IHFpZCkKK3sKKwlzdHJ1Y3QgZW5hX3JpbmcgKnR4X3JpbmcgPSAmYWRhcHRlci0+dHhfcmluZ1txaWRdOworCisJdmZyZWUodHhfcmluZy0+dHhfYnVmZmVyX2luZm8pOworCXR4X3JpbmctPnR4X2J1ZmZlcl9pbmZvID0gTlVMTDsKKworCXZmcmVlKHR4X3JpbmctPmZyZWVfdHhfaWRzKTsKKwl0eF9yaW5nLT5mcmVlX3R4X2lkcyA9IE5VTEw7Cit9CisKKy8qIGVuYV9zZXR1cF9hbGxfdHhfcmVzb3VyY2VzIC0gYWxsb2NhdGUgSS9PIFR4IHF1ZXVlcyByZXNvdXJjZXMgZm9yIEFsbCBxdWV1ZXMKKyAqIEBhZGFwdGVyOiBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBlbmFfc2V0dXBfYWxsX3R4X3Jlc291cmNlcyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IGksIHJjID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspIHsKKwkJcmMgPSBlbmFfc2V0dXBfdHhfcmVzb3VyY2VzKGFkYXB0ZXIsIGkpOworCQlpZiAocmMpCisJCQlnb3RvIGVycl9zZXR1cF90eDsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX3NldHVwX3R4OgorCisJbmV0aWZfZXJyKGFkYXB0ZXIsIGlmdXAsIGFkYXB0ZXItPm5ldGRldiwKKwkJICAiVHggcXVldWUgJWQ6IGFsbG9jYXRpb24gZmFpbGVkXG4iLCBpKTsKKworCS8qIHJld2luZCB0aGUgaW5kZXggZnJlZWluZyB0aGUgcmluZ3MgYXMgd2UgZ28gKi8KKwl3aGlsZSAoaS0tKQorCQllbmFfZnJlZV90eF9yZXNvdXJjZXMoYWRhcHRlciwgaSk7CisJcmV0dXJuIHJjOworfQorCisvKiBlbmFfZnJlZV9hbGxfaW9fdHhfcmVzb3VyY2VzIC0gRnJlZSBJL08gVHggUmVzb3VyY2VzIGZvciBBbGwgUXVldWVzCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBGcmVlIGFsbCB0cmFuc21pdCBzb2Z0d2FyZSByZXNvdXJjZXMKKyAqLworc3RhdGljIHZvaWQgZW5hX2ZyZWVfYWxsX2lvX3R4X3Jlc291cmNlcyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKQorCQllbmFfZnJlZV90eF9yZXNvdXJjZXMoYWRhcHRlciwgaSk7Cit9CisKKy8qIGVuYV9zZXR1cF9yeF9yZXNvdXJjZXMgLSBhbGxvY2F0ZSBJL08gUnggcmVzb3VyY2VzIChEZXNjcmlwdG9ycykKKyAqIEBhZGFwdGVyOiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAcWlkOiBxdWV1ZSBpbmRleAorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgZW5hX3NldHVwX3J4X3Jlc291cmNlcyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJICB1MzIgcWlkKQoreworCXN0cnVjdCBlbmFfcmluZyAqcnhfcmluZyA9ICZhZGFwdGVyLT5yeF9yaW5nW3FpZF07CisJc3RydWN0IGVuYV9pcnEgKmVuYV9pcnEgPSAmYWRhcHRlci0+aXJxX3RibFtFTkFfSU9fSVJRX0lEWChxaWQpXTsKKwlpbnQgc2l6ZSwgbm9kZTsKKworCWlmIChyeF9yaW5nLT5yeF9idWZmZXJfaW5mbykgeworCQluZXRpZl9lcnIoYWRhcHRlciwgaWZ1cCwgYWRhcHRlci0+bmV0ZGV2LAorCQkJICAicnhfYnVmZmVyX2luZm8gaXMgbm90IE5VTEwiKTsKKwkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCisJLyogYWxsb2MgZXh0cmEgZWxlbWVudCBzbyBpbiByeCBwYXRoCisJICogd2UgY2FuIGFsd2F5cyBwcmVmZXRjaCByeF9pbmZvICsgMQorCSAqLworCXNpemUgPSBzaXplb2Yoc3RydWN0IGVuYV9yeF9idWZmZXIpICogKHJ4X3JpbmctPnJpbmdfc2l6ZSArIDEpOworCW5vZGUgPSBjcHVfdG9fbm9kZShlbmFfaXJxLT5jcHUpOworCisJcnhfcmluZy0+cnhfYnVmZmVyX2luZm8gPSB2emFsbG9jX25vZGUoc2l6ZSwgbm9kZSk7CisJaWYgKCFyeF9yaW5nLT5yeF9idWZmZXJfaW5mbykgeworCQlyeF9yaW5nLT5yeF9idWZmZXJfaW5mbyA9IHZ6YWxsb2Moc2l6ZSk7CisJCWlmICghcnhfcmluZy0+cnhfYnVmZmVyX2luZm8pCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBSZXNldCByeCBzdGF0aXN0aWNzICovCisJbWVtc2V0KCZyeF9yaW5nLT5yeF9zdGF0cywgMHgwLCBzaXplb2YocnhfcmluZy0+cnhfc3RhdHMpKTsKKworCXJ4X3JpbmctPm5leHRfdG9fY2xlYW4gPSAwOworCXJ4X3JpbmctPm5leHRfdG9fdXNlID0gMDsKKwlyeF9yaW5nLT5jcHUgPSBlbmFfaXJxLT5jcHU7CisKKwlyZXR1cm4gMDsKK30KKworLyogZW5hX2ZyZWVfcnhfcmVzb3VyY2VzIC0gRnJlZSBJL08gUnggUmVzb3VyY2VzCisgKiBAYWRhcHRlcjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICogQHFpZDogcXVldWUgaW5kZXgKKyAqCisgKiBGcmVlIGFsbCByZWNlaXZlIHNvZnR3YXJlIHJlc291cmNlcworICovCitzdGF0aWMgdm9pZCBlbmFfZnJlZV9yeF9yZXNvdXJjZXMoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyLAorCQkJCSAgdTMyIHFpZCkKK3sKKwlzdHJ1Y3QgZW5hX3JpbmcgKnJ4X3JpbmcgPSAmYWRhcHRlci0+cnhfcmluZ1txaWRdOworCisJdmZyZWUocnhfcmluZy0+cnhfYnVmZmVyX2luZm8pOworCXJ4X3JpbmctPnJ4X2J1ZmZlcl9pbmZvID0gTlVMTDsKK30KKworLyogZW5hX3NldHVwX2FsbF9yeF9yZXNvdXJjZXMgLSBhbGxvY2F0ZSBJL08gUnggcXVldWVzIHJlc291cmNlcyBmb3IgYWxsIHF1ZXVlcworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IGVuYV9zZXR1cF9hbGxfcnhfcmVzb3VyY2VzKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgaSwgcmMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykgeworCQlyYyA9IGVuYV9zZXR1cF9yeF9yZXNvdXJjZXMoYWRhcHRlciwgaSk7CisJCWlmIChyYykKKwkJCWdvdG8gZXJyX3NldHVwX3J4OworCX0KKworCXJldHVybiAwOworCitlcnJfc2V0dXBfcng6CisKKwluZXRpZl9lcnIoYWRhcHRlciwgaWZ1cCwgYWRhcHRlci0+bmV0ZGV2LAorCQkgICJSeCBxdWV1ZSAlZDogYWxsb2NhdGlvbiBmYWlsZWRcbiIsIGkpOworCisJLyogcmV3aW5kIHRoZSBpbmRleCBmcmVlaW5nIHRoZSByaW5ncyBhcyB3ZSBnbyAqLworCXdoaWxlIChpLS0pCisJCWVuYV9mcmVlX3J4X3Jlc291cmNlcyhhZGFwdGVyLCBpKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGVuYV9mcmVlX2FsbF9pb19yeF9yZXNvdXJjZXMgLSBGcmVlIEkvTyBSeCBSZXNvdXJjZXMgZm9yIEFsbCBRdWV1ZXMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqIEZyZWUgYWxsIHJlY2VpdmUgc29mdHdhcmUgcmVzb3VyY2VzCisgKi8KK3N0YXRpYyB2b2lkIGVuYV9mcmVlX2FsbF9pb19yeF9yZXNvdXJjZXMoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykKKwkJZW5hX2ZyZWVfcnhfcmVzb3VyY2VzKGFkYXB0ZXIsIGkpOworfQorCitzdGF0aWMgaW5saW5lIGludCBlbmFfYWxsb2NfcnhfcGFnZShzdHJ1Y3QgZW5hX3JpbmcgKnJ4X3JpbmcsCisJCQkJICAgIHN0cnVjdCBlbmFfcnhfYnVmZmVyICpyeF9pbmZvLCBnZnBfdCBnZnApCit7CisJc3RydWN0IGVuYV9jb21fYnVmICplbmFfYnVmOworCXN0cnVjdCBwYWdlICpwYWdlOworCWRtYV9hZGRyX3QgZG1hOworCisJLyogaWYgcHJldmlvdXMgYWxsb2NhdGVkIHBhZ2UgaXMgbm90IHVzZWQgKi8KKwlpZiAodW5saWtlbHkocnhfaW5mby0+cGFnZSkpCisJCXJldHVybiAwOworCisJcGFnZSA9IGFsbG9jX3BhZ2UoZ2ZwKTsKKwlpZiAodW5saWtlbHkoIXBhZ2UpKSB7CisJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnJ4X3JpbmctPnN5bmNwKTsKKwkJcnhfcmluZy0+cnhfc3RhdHMucGFnZV9hbGxvY19mYWlsKys7CisJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZyeF9yaW5nLT5zeW5jcCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRtYSA9IGRtYV9tYXBfcGFnZShyeF9yaW5nLT5kZXYsIHBhZ2UsIDAsIFBBR0VfU0laRSwKKwkJCSAgIERNQV9GUk9NX0RFVklDRSk7CisJaWYgKHVubGlrZWx5KGRtYV9tYXBwaW5nX2Vycm9yKHJ4X3JpbmctPmRldiwgZG1hKSkpIHsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmcnhfcmluZy0+c3luY3ApOworCQlyeF9yaW5nLT5yeF9zdGF0cy5kbWFfbWFwcGluZ19lcnIrKzsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnJ4X3JpbmctPnN5bmNwKTsKKworCQlfX2ZyZWVfcGFnZShwYWdlKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCW5ldGlmX2RiZyhyeF9yaW5nLT5hZGFwdGVyLCByeF9zdGF0dXMsIHJ4X3JpbmctPm5ldGRldiwKKwkJICAiYWxsb2MgcGFnZSAlcCwgcnhfaW5mbyAlcFxuIiwgcGFnZSwgcnhfaW5mbyk7CisKKwlyeF9pbmZvLT5wYWdlID0gcGFnZTsKKwlyeF9pbmZvLT5wYWdlX29mZnNldCA9IDA7CisJZW5hX2J1ZiA9ICZyeF9pbmZvLT5lbmFfYnVmOworCWVuYV9idWYtPnBhZGRyID0gZG1hOworCWVuYV9idWYtPmxlbiA9IFBBR0VfU0laRTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlbmFfZnJlZV9yeF9wYWdlKHN0cnVjdCBlbmFfcmluZyAqcnhfcmluZywKKwkJCSAgICAgc3RydWN0IGVuYV9yeF9idWZmZXIgKnJ4X2luZm8pCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSByeF9pbmZvLT5wYWdlOworCXN0cnVjdCBlbmFfY29tX2J1ZiAqZW5hX2J1ZiA9ICZyeF9pbmZvLT5lbmFfYnVmOworCisJaWYgKHVubGlrZWx5KCFwYWdlKSkgeworCQluZXRpZl93YXJuKHJ4X3JpbmctPmFkYXB0ZXIsIHJ4X2VyciwgcnhfcmluZy0+bmV0ZGV2LAorCQkJICAgIlRyeWluZyB0byBmcmVlIHVuYWxsb2NhdGVkIGJ1ZmZlclxuIik7CisJCXJldHVybjsKKwl9CisKKwlkbWFfdW5tYXBfcGFnZShyeF9yaW5nLT5kZXYsIGVuYV9idWYtPnBhZGRyLCBQQUdFX1NJWkUsCisJCSAgICAgICBETUFfRlJPTV9ERVZJQ0UpOworCisJX19mcmVlX3BhZ2UocGFnZSk7CisJcnhfaW5mby0+cGFnZSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZW5hX3JlZmlsbF9yeF9idWZzKHN0cnVjdCBlbmFfcmluZyAqcnhfcmluZywgdTMyIG51bSkKK3sKKwl1MTYgbmV4dF90b191c2U7CisJdTMyIGk7CisJaW50IHJjOworCisJbmV4dF90b191c2UgPSByeF9yaW5nLT5uZXh0X3RvX3VzZTsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQlzdHJ1Y3QgZW5hX3J4X2J1ZmZlciAqcnhfaW5mbyA9CisJCQkmcnhfcmluZy0+cnhfYnVmZmVyX2luZm9bbmV4dF90b191c2VdOworCisJCXJjID0gZW5hX2FsbG9jX3J4X3BhZ2UocnhfcmluZywgcnhfaW5mbywKKwkJCQkgICAgICAgX19HRlBfQ09MRCB8IEdGUF9BVE9NSUMgfCBfX0dGUF9DT01QKTsKKwkJaWYgKHVubGlrZWx5KHJjIDwgMCkpIHsKKwkJCW5ldGlmX3dhcm4ocnhfcmluZy0+YWRhcHRlciwgcnhfZXJyLCByeF9yaW5nLT5uZXRkZXYsCisJCQkJICAgImZhaWxlZCB0byBhbGxvYyBidWZmZXIgZm9yIHJ4IHF1ZXVlICVkXG4iLAorCQkJCSAgIHJ4X3JpbmctPnFpZCk7CisJCQlicmVhazsKKwkJfQorCQlyYyA9IGVuYV9jb21fYWRkX3NpbmdsZV9yeF9kZXNjKHJ4X3JpbmctPmVuYV9jb21faW9fc3EsCisJCQkJCQkmcnhfaW5mby0+ZW5hX2J1ZiwKKwkJCQkJCW5leHRfdG9fdXNlKTsKKwkJaWYgKHVubGlrZWx5KHJjKSkgeworCQkJbmV0aWZfd2FybihyeF9yaW5nLT5hZGFwdGVyLCByeF9zdGF0dXMsIHJ4X3JpbmctPm5ldGRldiwKKwkJCQkgICAiZmFpbGVkIHRvIGFkZCBidWZmZXIgZm9yIHJ4IHF1ZXVlICVkXG4iLAorCQkJCSAgIHJ4X3JpbmctPnFpZCk7CisJCQlicmVhazsKKwkJfQorCQluZXh0X3RvX3VzZSA9IEVOQV9SWF9SSU5HX0lEWF9ORVhUKG5leHRfdG9fdXNlLAorCQkJCQkJICAgcnhfcmluZy0+cmluZ19zaXplKTsKKwl9CisKKwlpZiAodW5saWtlbHkoaSA8IG51bSkpIHsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmcnhfcmluZy0+c3luY3ApOworCQlyeF9yaW5nLT5yeF9zdGF0cy5yZWZpbF9wYXJ0aWFsKys7CisJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZyeF9yaW5nLT5zeW5jcCk7CisJCW5ldGRldl93YXJuKHJ4X3JpbmctPm5ldGRldiwKKwkJCSAgICAicmVmaWxsZWQgcnggcWlkICVkIHdpdGggb25seSAlZCBidWZmZXJzIChmcm9tICVkKVxuIiwKKwkJCSAgICByeF9yaW5nLT5xaWQsIGksIG51bSk7CisJfQorCisJaWYgKGxpa2VseShpKSkgeworCQkvKiBBZGQgbWVtb3J5IGJhcnJpZXIgdG8gbWFrZSBzdXJlIHRoZSBkZXNjIHdlcmUgd3JpdHRlbiBiZWZvcmUKKwkJICogaXNzdWUgYSBkb29yYmVsbAorCQkgKi8KKwkJd21iKCk7CisJCWVuYV9jb21fd3JpdGVfc3FfZG9vcmJlbGwocnhfcmluZy0+ZW5hX2NvbV9pb19zcSk7CisJfQorCisJcnhfcmluZy0+bmV4dF90b191c2UgPSBuZXh0X3RvX3VzZTsKKworCXJldHVybiBpOworfQorCitzdGF0aWMgdm9pZCBlbmFfZnJlZV9yeF9idWZzKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciwKKwkJCSAgICAgdTMyIHFpZCkKK3sKKwlzdHJ1Y3QgZW5hX3JpbmcgKnJ4X3JpbmcgPSAmYWRhcHRlci0+cnhfcmluZ1txaWRdOworCXUzMiBpOworCisJZm9yIChpID0gMDsgaSA8IHJ4X3JpbmctPnJpbmdfc2l6ZTsgaSsrKSB7CisJCXN0cnVjdCBlbmFfcnhfYnVmZmVyICpyeF9pbmZvID0gJnJ4X3JpbmctPnJ4X2J1ZmZlcl9pbmZvW2ldOworCisJCWlmIChyeF9pbmZvLT5wYWdlKQorCQkJZW5hX2ZyZWVfcnhfcGFnZShyeF9yaW5nLCByeF9pbmZvKTsKKwl9Cit9CisKKy8qIGVuYV9yZWZpbGxfYWxsX3J4X2J1ZnMgLSBhbGxvY2F0ZSBhbGwgcXVldWVzIFJ4IGJ1ZmZlcnMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqLworc3RhdGljIHZvaWQgZW5hX3JlZmlsbF9hbGxfcnhfYnVmcyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGVuYV9yaW5nICpyeF9yaW5nOworCWludCBpLCByYywgYnVmc19udW07CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKSB7CisJCXJ4X3JpbmcgPSAmYWRhcHRlci0+cnhfcmluZ1tpXTsKKwkJYnVmc19udW0gPSByeF9yaW5nLT5yaW5nX3NpemUgLSAxOworCQlyYyA9IGVuYV9yZWZpbGxfcnhfYnVmcyhyeF9yaW5nLCBidWZzX251bSk7CisKKwkJaWYgKHVubGlrZWx5KHJjICE9IGJ1ZnNfbnVtKSkKKwkJCW5ldGlmX3dhcm4ocnhfcmluZy0+YWRhcHRlciwgcnhfc3RhdHVzLCByeF9yaW5nLT5uZXRkZXYsCisJCQkJICAgInJlZmlsbGluZyBRdWV1ZSAlZCBmYWlsZWQuIGFsbG9jYXRlZCAlZCBidWZmZXJzIGZyb206ICVkXG4iLAorCQkJCSAgIGksIHJjLCBidWZzX251bSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBlbmFfZnJlZV9hbGxfcnhfYnVmcyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKQorCQllbmFfZnJlZV9yeF9idWZzKGFkYXB0ZXIsIGkpOworfQorCisvKiBlbmFfZnJlZV90eF9idWZzIC0gRnJlZSBUeCBCdWZmZXJzIHBlciBRdWV1ZQorICogQHR4X3Jpbmc6IFRYIHJpbmcgZm9yIHdoaWNoIGJ1ZmZlcnMgYmUgZnJlZWQKKyAqLworc3RhdGljIHZvaWQgZW5hX2ZyZWVfdHhfYnVmcyhzdHJ1Y3QgZW5hX3JpbmcgKnR4X3JpbmcpCit7CisJdTMyIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdHhfcmluZy0+cmluZ19zaXplOyBpKyspIHsKKwkJc3RydWN0IGVuYV90eF9idWZmZXIgKnR4X2luZm8gPSAmdHhfcmluZy0+dHhfYnVmZmVyX2luZm9baV07CisJCXN0cnVjdCBlbmFfY29tX2J1ZiAqZW5hX2J1ZjsKKwkJaW50IG5yX2ZyYWdzOworCQlpbnQgajsKKworCQlpZiAoIXR4X2luZm8tPnNrYikKKwkJCWNvbnRpbnVlOworCisJCW5ldGRldl9ub3RpY2UodHhfcmluZy0+bmV0ZGV2LAorCQkJICAgICAgImZyZWUgdW5jb21wbGV0ZWQgdHggc2tiIHFpZCAlZCBpZHggMHgleFxuIiwKKwkJCSAgICAgIHR4X3JpbmctPnFpZCwgaSk7CisKKwkJZW5hX2J1ZiA9IHR4X2luZm8tPmJ1ZnM7CisJCWRtYV91bm1hcF9zaW5nbGUodHhfcmluZy0+ZGV2LAorCQkJCSBlbmFfYnVmLT5wYWRkciwKKwkJCQkgZW5hX2J1Zi0+bGVuLAorCQkJCSBETUFfVE9fREVWSUNFKTsKKworCQkvKiB1bm1hcCByZW1haW5pbmcgbWFwcGVkIHBhZ2VzICovCisJCW5yX2ZyYWdzID0gdHhfaW5mby0+bnVtX29mX2J1ZnMgLSAxOworCQlmb3IgKGogPSAwOyBqIDwgbnJfZnJhZ3M7IGorKykgeworCQkJZW5hX2J1ZisrOworCQkJZG1hX3VubWFwX3BhZ2UodHhfcmluZy0+ZGV2LAorCQkJCSAgICAgICBlbmFfYnVmLT5wYWRkciwKKwkJCQkgICAgICAgZW5hX2J1Zi0+bGVuLAorCQkJCSAgICAgICBETUFfVE9fREVWSUNFKTsKKwkJfQorCisJCWRldl9rZnJlZV9za2JfYW55KHR4X2luZm8tPnNrYik7CisJfQorCW5ldGRldl90eF9yZXNldF9xdWV1ZShuZXRkZXZfZ2V0X3R4X3F1ZXVlKHR4X3JpbmctPm5ldGRldiwKKwkJCQkJCSAgdHhfcmluZy0+cWlkKSk7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9mcmVlX2FsbF90eF9idWZzKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgZW5hX3JpbmcgKnR4X3Jpbmc7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKSB7CisJCXR4X3JpbmcgPSAmYWRhcHRlci0+dHhfcmluZ1tpXTsKKwkJZW5hX2ZyZWVfdHhfYnVmcyh0eF9yaW5nKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9kZXN0cm95X2FsbF90eF9xdWV1ZXMoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCXUxNiBlbmFfcWlkOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykgeworCQllbmFfcWlkID0gRU5BX0lPX1RYUV9JRFgoaSk7CisJCWVuYV9jb21fZGVzdHJveV9pb19xdWV1ZShhZGFwdGVyLT5lbmFfZGV2LCBlbmFfcWlkKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9kZXN0cm95X2FsbF9yeF9xdWV1ZXMoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCXUxNiBlbmFfcWlkOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykgeworCQllbmFfcWlkID0gRU5BX0lPX1JYUV9JRFgoaSk7CisJCWVuYV9jb21fZGVzdHJveV9pb19xdWV1ZShhZGFwdGVyLT5lbmFfZGV2LCBlbmFfcWlkKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9kZXN0cm95X2FsbF9pb19xdWV1ZXMoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCWVuYV9kZXN0cm95X2FsbF90eF9xdWV1ZXMoYWRhcHRlcik7CisJZW5hX2Rlc3Ryb3lfYWxsX3J4X3F1ZXVlcyhhZGFwdGVyKTsKK30KKworc3RhdGljIGludCB2YWxpZGF0ZV90eF9yZXFfaWQoc3RydWN0IGVuYV9yaW5nICp0eF9yaW5nLCB1MTYgcmVxX2lkKQoreworCXN0cnVjdCBlbmFfdHhfYnVmZmVyICp0eF9pbmZvID0gTlVMTDsKKworCWlmIChsaWtlbHkocmVxX2lkIDwgdHhfcmluZy0+cmluZ19zaXplKSkgeworCQl0eF9pbmZvID0gJnR4X3JpbmctPnR4X2J1ZmZlcl9pbmZvW3JlcV9pZF07CisJCWlmIChsaWtlbHkodHhfaW5mby0+c2tiKSkKKwkJCXJldHVybiAwOworCX0KKworCWlmICh0eF9pbmZvKQorCQluZXRpZl9lcnIodHhfcmluZy0+YWRhcHRlciwgdHhfZG9uZSwgdHhfcmluZy0+bmV0ZGV2LAorCQkJICAidHhfaW5mbyBkb2Vzbid0IGhhdmUgdmFsaWQgc2tiXG4iKTsKKwllbHNlCisJCW5ldGlmX2Vycih0eF9yaW5nLT5hZGFwdGVyLCB0eF9kb25lLCB0eF9yaW5nLT5uZXRkZXYsCisJCQkgICJJbnZhbGlkIHJlcV9pZDogJWh1XG4iLCByZXFfaWQpOworCisJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmdHhfcmluZy0+c3luY3ApOworCXR4X3JpbmctPnR4X3N0YXRzLmJhZF9yZXFfaWQrKzsKKwl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmdHhfcmluZy0+c3luY3ApOworCisJLyogVHJpZ2dlciBkZXZpY2UgcmVzZXQgKi8KKwlzZXRfYml0KEVOQV9GTEFHX1RSSUdHRVJfUkVTRVQsICZ0eF9yaW5nLT5hZGFwdGVyLT5mbGFncyk7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2NsZWFuX3R4X2lycShzdHJ1Y3QgZW5hX3JpbmcgKnR4X3JpbmcsIHUzMiBidWRnZXQpCit7CisJc3RydWN0IG5ldGRldl9xdWV1ZSAqdHhxOworCWJvb2wgYWJvdmVfdGhyZXNoOworCXUzMiB0eF9ieXRlcyA9IDA7CisJdTMyIHRvdGFsX2RvbmUgPSAwOworCXUxNiBuZXh0X3RvX2NsZWFuOworCXUxNiByZXFfaWQ7CisJaW50IHR4X3BrdHMgPSAwOworCWludCByYzsKKworCW5leHRfdG9fY2xlYW4gPSB0eF9yaW5nLT5uZXh0X3RvX2NsZWFuOworCXR4cSA9IG5ldGRldl9nZXRfdHhfcXVldWUodHhfcmluZy0+bmV0ZGV2LCB0eF9yaW5nLT5xaWQpOworCisJd2hpbGUgKHR4X3BrdHMgPCBidWRnZXQpIHsKKwkJc3RydWN0IGVuYV90eF9idWZmZXIgKnR4X2luZm87CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXN0cnVjdCBlbmFfY29tX2J1ZiAqZW5hX2J1ZjsKKwkJaW50IGksIG5yX2ZyYWdzOworCisJCXJjID0gZW5hX2NvbV90eF9jb21wX3JlcV9pZF9nZXQodHhfcmluZy0+ZW5hX2NvbV9pb19jcSwKKwkJCQkJCSZyZXFfaWQpOworCQlpZiAocmMpCisJCQlicmVhazsKKworCQlyYyA9IHZhbGlkYXRlX3R4X3JlcV9pZCh0eF9yaW5nLCByZXFfaWQpOworCQlpZiAocmMpCisJCQlicmVhazsKKworCQl0eF9pbmZvID0gJnR4X3JpbmctPnR4X2J1ZmZlcl9pbmZvW3JlcV9pZF07CisJCXNrYiA9IHR4X2luZm8tPnNrYjsKKworCQkvKiBwcmVmZXRjaCBza2JfZW5kX3BvaW50ZXIoKSB0byBzcGVlZHVwIHNrYl9zaGluZm8oc2tiKSAqLworCQlwcmVmZXRjaCgmc2tiLT5lbmQpOworCisJCXR4X2luZm8tPnNrYiA9IE5VTEw7CisJCXR4X2luZm8tPmxhc3RfamlmZmllcyA9IDA7CisKKwkJaWYgKGxpa2VseSh0eF9pbmZvLT5udW1fb2ZfYnVmcyAhPSAwKSkgeworCQkJZW5hX2J1ZiA9IHR4X2luZm8tPmJ1ZnM7CisKKwkJCWRtYV91bm1hcF9zaW5nbGUodHhfcmluZy0+ZGV2LAorCQkJCQkgZG1hX3VubWFwX2FkZHIoZW5hX2J1ZiwgcGFkZHIpLAorCQkJCQkgZG1hX3VubWFwX2xlbihlbmFfYnVmLCBsZW4pLAorCQkJCQkgRE1BX1RPX0RFVklDRSk7CisKKwkJCS8qIHVubWFwIHJlbWFpbmluZyBtYXBwZWQgcGFnZXMgKi8KKwkJCW5yX2ZyYWdzID0gdHhfaW5mby0+bnVtX29mX2J1ZnMgLSAxOworCQkJZm9yIChpID0gMDsgaSA8IG5yX2ZyYWdzOyBpKyspIHsKKwkJCQllbmFfYnVmKys7CisJCQkJZG1hX3VubWFwX3BhZ2UodHhfcmluZy0+ZGV2LAorCQkJCQkgICAgICAgZG1hX3VubWFwX2FkZHIoZW5hX2J1ZiwgcGFkZHIpLAorCQkJCQkgICAgICAgZG1hX3VubWFwX2xlbihlbmFfYnVmLCBsZW4pLAorCQkJCQkgICAgICAgRE1BX1RPX0RFVklDRSk7CisJCQl9CisJCX0KKworCQluZXRpZl9kYmcodHhfcmluZy0+YWRhcHRlciwgdHhfZG9uZSwgdHhfcmluZy0+bmV0ZGV2LAorCQkJICAidHhfcG9sbDogcSAlZCBza2IgJXAgY29tcGxldGVkXG4iLCB0eF9yaW5nLT5xaWQsCisJCQkgIHNrYik7CisKKwkJdHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJdHhfcGt0cysrOworCQl0b3RhbF9kb25lICs9IHR4X2luZm8tPnR4X2Rlc2NzOworCisJCXR4X3JpbmctPmZyZWVfdHhfaWRzW25leHRfdG9fY2xlYW5dID0gcmVxX2lkOworCQluZXh0X3RvX2NsZWFuID0gRU5BX1RYX1JJTkdfSURYX05FWFQobmV4dF90b19jbGVhbiwKKwkJCQkJCSAgICAgdHhfcmluZy0+cmluZ19zaXplKTsKKwl9CisKKwl0eF9yaW5nLT5uZXh0X3RvX2NsZWFuID0gbmV4dF90b19jbGVhbjsKKwllbmFfY29tX2NvbXBfYWNrKHR4X3JpbmctPmVuYV9jb21faW9fc3EsIHRvdGFsX2RvbmUpOworCWVuYV9jb21fdXBkYXRlX2Rldl9jb21wX2hlYWQodHhfcmluZy0+ZW5hX2NvbV9pb19jcSk7CisKKwluZXRkZXZfdHhfY29tcGxldGVkX3F1ZXVlKHR4cSwgdHhfcGt0cywgdHhfYnl0ZXMpOworCisJbmV0aWZfZGJnKHR4X3JpbmctPmFkYXB0ZXIsIHR4X2RvbmUsIHR4X3JpbmctPm5ldGRldiwKKwkJICAidHhfcG9sbDogcSAlZCBkb25lLiB0b3RhbCBwa3RzOiAlZFxuIiwKKwkJICB0eF9yaW5nLT5xaWQsIHR4X3BrdHMpOworCisJLyogbmVlZCB0byBtYWtlIHRoZSByaW5ncyBjaXJjdWxhciB1cGRhdGUgdmlzaWJsZSB0bworCSAqIGVuYV9zdGFydF94bWl0KCkgYmVmb3JlIGNoZWNraW5nIGZvciBuZXRpZl9xdWV1ZV9zdG9wcGVkKCkuCisJICovCisJc21wX21iKCk7CisKKwlhYm92ZV90aHJlc2ggPSBlbmFfY29tX3NxX2VtcHR5X3NwYWNlKHR4X3JpbmctPmVuYV9jb21faW9fc3EpID4KKwkJRU5BX1RYX1dBS0VVUF9USFJFU0g7CisJaWYgKHVubGlrZWx5KG5ldGlmX3R4X3F1ZXVlX3N0b3BwZWQodHhxKSAmJiBhYm92ZV90aHJlc2gpKSB7CisJCV9fbmV0aWZfdHhfbG9jayh0eHEsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJCWFib3ZlX3RocmVzaCA9IGVuYV9jb21fc3FfZW1wdHlfc3BhY2UodHhfcmluZy0+ZW5hX2NvbV9pb19zcSkgPgorCQkJRU5BX1RYX1dBS0VVUF9USFJFU0g7CisJCWlmIChuZXRpZl90eF9xdWV1ZV9zdG9wcGVkKHR4cSkgJiYgYWJvdmVfdGhyZXNoKSB7CisJCQluZXRpZl90eF93YWtlX3F1ZXVlKHR4cSk7CisJCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZ0eF9yaW5nLT5zeW5jcCk7CisJCQl0eF9yaW5nLT50eF9zdGF0cy5xdWV1ZV93YWtldXArKzsKKwkJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZ0eF9yaW5nLT5zeW5jcCk7CisJCX0KKwkJX19uZXRpZl90eF91bmxvY2sodHhxKTsKKwl9CisKKwl0eF9yaW5nLT5wZXJfbmFwaV9ieXRlcyArPSB0eF9ieXRlczsKKwl0eF9yaW5nLT5wZXJfbmFwaV9wYWNrZXRzICs9IHR4X3BrdHM7CisKKwlyZXR1cm4gdHhfcGt0czsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICplbmFfcnhfc2tiKHN0cnVjdCBlbmFfcmluZyAqcnhfcmluZywKKwkJCQkgIHN0cnVjdCBlbmFfY29tX3J4X2J1Zl9pbmZvICplbmFfYnVmcywKKwkJCQkgIHUzMiBkZXNjcywKKwkJCQkgIHUxNiAqbmV4dF90b19jbGVhbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBlbmFfcnhfYnVmZmVyICpyeF9pbmZvID0KKwkJJnJ4X3JpbmctPnJ4X2J1ZmZlcl9pbmZvWypuZXh0X3RvX2NsZWFuXTsKKwl1MzIgbGVuOworCXUzMiBidWYgPSAwOworCXZvaWQgKnZhOworCisJbGVuID0gZW5hX2J1ZnNbMF0ubGVuOworCWlmICh1bmxpa2VseSghcnhfaW5mby0+cGFnZSkpIHsKKwkJbmV0aWZfZXJyKHJ4X3JpbmctPmFkYXB0ZXIsIHJ4X2VyciwgcnhfcmluZy0+bmV0ZGV2LAorCQkJICAiUGFnZSBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbmV0aWZfZGJnKHJ4X3JpbmctPmFkYXB0ZXIsIHJ4X3N0YXR1cywgcnhfcmluZy0+bmV0ZGV2LAorCQkgICJyeF9pbmZvICVwIHBhZ2UgJXBcbiIsCisJCSAgcnhfaW5mbywgcnhfaW5mby0+cGFnZSk7CisKKwkvKiBzYXZlIHZpcnQgYWRkcmVzcyBvZiBmaXJzdCBidWZmZXIgKi8KKwl2YSA9IHBhZ2VfYWRkcmVzcyhyeF9pbmZvLT5wYWdlKSArIHJ4X2luZm8tPnBhZ2Vfb2Zmc2V0OworCXByZWZldGNoKHZhICsgTkVUX0lQX0FMSUdOKTsKKworCWlmIChsZW4gPD0gcnhfcmluZy0+cnhfY29weWJyZWFrKSB7CisJCXNrYiA9IG5ldGRldl9hbGxvY19za2JfaXBfYWxpZ24ocnhfcmluZy0+bmV0ZGV2LAorCQkJCQkJcnhfcmluZy0+cnhfY29weWJyZWFrKTsKKwkJaWYgKHVubGlrZWx5KCFza2IpKSB7CisJCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZyeF9yaW5nLT5zeW5jcCk7CisJCQlyeF9yaW5nLT5yeF9zdGF0cy5za2JfYWxsb2NfZmFpbCsrOworCQkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnJ4X3JpbmctPnN5bmNwKTsKKwkJCW5ldGlmX2VycihyeF9yaW5nLT5hZGFwdGVyLCByeF9lcnIsIHJ4X3JpbmctPm5ldGRldiwKKwkJCQkgICJGYWlsZWQgdG8gYWxsb2NhdGUgc2tiXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbmV0aWZfZGJnKHJ4X3JpbmctPmFkYXB0ZXIsIHJ4X3N0YXR1cywgcnhfcmluZy0+bmV0ZGV2LAorCQkJICAicnggYWxsb2NhdGVkIHNtYWxsIHBhY2tldC4gbGVuICVkLiBkYXRhX2xlbiAlZFxuIiwKKwkJCSAgc2tiLT5sZW4sIHNrYi0+ZGF0YV9sZW4pOworCisJCS8qIHN5bmMgdGhpcyBidWZmZXIgZm9yIENQVSB1c2UgKi8KKwkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUocnhfcmluZy0+ZGV2LAorCQkJCQlkbWFfdW5tYXBfYWRkcigmcnhfaW5mby0+ZW5hX2J1ZiwgcGFkZHIpLAorCQkJCQlsZW4sCisJCQkJCURNQV9GUk9NX0RFVklDRSk7CisJCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgdmEsIGxlbik7CisJCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHJ4X3JpbmctPmRldiwKKwkJCQkJICAgZG1hX3VubWFwX2FkZHIoJnJ4X2luZm8tPmVuYV9idWYsIHBhZGRyKSwKKwkJCQkJICAgbGVuLAorCQkJCQkgICBETUFfRlJPTV9ERVZJQ0UpOworCisJCXNrYl9wdXQoc2tiLCBsZW4pOworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCByeF9yaW5nLT5uZXRkZXYpOworCQkqbmV4dF90b19jbGVhbiA9IEVOQV9SWF9SSU5HX0lEWF9BREQoKm5leHRfdG9fY2xlYW4sIGRlc2NzLAorCQkJCQkJICAgICByeF9yaW5nLT5yaW5nX3NpemUpOworCQlyZXR1cm4gc2tiOworCX0KKworCXNrYiA9IG5hcGlfZ2V0X2ZyYWdzKHJ4X3JpbmctPm5hcGkpOworCWlmICh1bmxpa2VseSghc2tiKSkgeworCQluZXRpZl9kYmcocnhfcmluZy0+YWRhcHRlciwgcnhfc3RhdHVzLCByeF9yaW5nLT5uZXRkZXYsCisJCQkgICJGYWlsZWQgYWxsb2NhdGluZyBza2JcbiIpOworCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZyeF9yaW5nLT5zeW5jcCk7CisJCXJ4X3JpbmctPnJ4X3N0YXRzLnNrYl9hbGxvY19mYWlsKys7CisJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZyeF9yaW5nLT5zeW5jcCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWRvIHsKKwkJZG1hX3VubWFwX3BhZ2UocnhfcmluZy0+ZGV2LAorCQkJICAgICAgIGRtYV91bm1hcF9hZGRyKCZyeF9pbmZvLT5lbmFfYnVmLCBwYWRkciksCisJCQkgICAgICAgUEFHRV9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCisJCXNrYl9hZGRfcnhfZnJhZyhza2IsIHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MsIHJ4X2luZm8tPnBhZ2UsCisJCQkJcnhfaW5mby0+cGFnZV9vZmZzZXQsIGxlbiwgUEFHRV9TSVpFKTsKKworCQluZXRpZl9kYmcocnhfcmluZy0+YWRhcHRlciwgcnhfc3RhdHVzLCByeF9yaW5nLT5uZXRkZXYsCisJCQkgICJyeCBza2IgdXBkYXRlZC4gbGVuICVkLiBkYXRhX2xlbiAlZFxuIiwKKwkJCSAgc2tiLT5sZW4sIHNrYi0+ZGF0YV9sZW4pOworCisJCXJ4X2luZm8tPnBhZ2UgPSBOVUxMOworCQkqbmV4dF90b19jbGVhbiA9CisJCQlFTkFfUlhfUklOR19JRFhfTkVYVCgqbmV4dF90b19jbGVhbiwKKwkJCQkJICAgICByeF9yaW5nLT5yaW5nX3NpemUpOworCQlpZiAobGlrZWx5KC0tZGVzY3MgPT0gMCkpCisJCQlicmVhazsKKwkJcnhfaW5mbyA9ICZyeF9yaW5nLT5yeF9idWZmZXJfaW5mb1sqbmV4dF90b19jbGVhbl07CisJCWxlbiA9IGVuYV9idWZzWysrYnVmXS5sZW47CisJfSB3aGlsZSAoMSk7CisKKwlyZXR1cm4gc2tiOworfQorCisvKiBlbmFfcnhfY2hlY2tzdW0gLSBpbmRpY2F0ZSBpbiBza2IgaWYgaHcgaW5kaWNhdGVkIGEgZ29vZCBja3N1bQorICogQGFkYXB0ZXI6IHN0cnVjdHVyZSBjb250YWluaW5nIGFkYXB0ZXIgc3BlY2lmaWMgZGF0YQorICogQGVuYV9yeF9jdHg6IHJlY2VpdmVkIHBhY2tldCBjb250ZXh0L21ldGFkYXRhCisgKiBAc2tiOiBza2IgY3VycmVudGx5IGJlaW5nIHJlY2VpdmVkIGFuZCBtb2RpZmllZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZW5hX3J4X2NoZWNrc3VtKHN0cnVjdCBlbmFfcmluZyAqcnhfcmluZywKKwkJCQkgICBzdHJ1Y3QgZW5hX2NvbV9yeF9jdHggKmVuYV9yeF9jdHgsCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkvKiBSeCBjc3VtIGRpc2FibGVkICovCisJaWYgKHVubGlrZWx5KCEocnhfcmluZy0+bmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfUlhDU1VNKSkpIHsKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQlyZXR1cm47CisJfQorCisJLyogRm9yIGZyYWdtZW50ZWQgcGFja2V0cyB0aGUgY2hlY2tzdW0gaXNuJ3QgdmFsaWQgKi8KKwlpZiAoZW5hX3J4X2N0eC0+ZnJhZykgeworCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCXJldHVybjsKKwl9CisKKwkvKiBpZiBJUCBhbmQgZXJyb3IgKi8KKwlpZiAodW5saWtlbHkoKGVuYV9yeF9jdHgtPmwzX3Byb3RvID09IEVOQV9FVEhfSU9fTDNfUFJPVE9fSVBWNCkgJiYKKwkJICAgICAoZW5hX3J4X2N0eC0+bDNfY3N1bV9lcnIpKSkgeworCQkvKiBpcHY0IGNoZWNrc3VtIGVycm9yICovCisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmcnhfcmluZy0+c3luY3ApOworCQlyeF9yaW5nLT5yeF9zdGF0cy5iYWRfY3N1bSsrOworCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmcnhfcmluZy0+c3luY3ApOworCQluZXRpZl9lcnIocnhfcmluZy0+YWRhcHRlciwgcnhfZXJyLCByeF9yaW5nLT5uZXRkZXYsCisJCQkgICJSWCBJUHY0IGhlYWRlciBjaGVja3N1bSBlcnJvclxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBpZiBUQ1AvVURQICovCisJaWYgKGxpa2VseSgoZW5hX3J4X2N0eC0+bDRfcHJvdG8gPT0gRU5BX0VUSF9JT19MNF9QUk9UT19UQ1ApIHx8CisJCSAgIChlbmFfcnhfY3R4LT5sNF9wcm90byA9PSBFTkFfRVRIX0lPX0w0X1BST1RPX1VEUCkpKSB7CisJCWlmICh1bmxpa2VseShlbmFfcnhfY3R4LT5sNF9jc3VtX2VycikpIHsKKwkJCS8qIFRDUC9VRFAgY2hlY2tzdW0gZXJyb3IgKi8KKwkJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnJ4X3JpbmctPnN5bmNwKTsKKwkJCXJ4X3JpbmctPnJ4X3N0YXRzLmJhZF9jc3VtKys7CisJCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmcnhfcmluZy0+c3luY3ApOworCQkJbmV0aWZfZXJyKHJ4X3JpbmctPmFkYXB0ZXIsIHJ4X2VyciwgcnhfcmluZy0+bmV0ZGV2LAorCQkJCSAgIlJYIEw0IGNoZWNrc3VtIGVycm9yXG4iKTsKKwkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkJCXJldHVybjsKKwkJfQorCisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJfQorfQorCitzdGF0aWMgdm9pZCBlbmFfc2V0X3J4X2hhc2goc3RydWN0IGVuYV9yaW5nICpyeF9yaW5nLAorCQkJICAgIHN0cnVjdCBlbmFfY29tX3J4X2N0eCAqZW5hX3J4X2N0eCwKKwkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWVudW0gcGt0X2hhc2hfdHlwZXMgaGFzaF90eXBlOworCisJaWYgKGxpa2VseShyeF9yaW5nLT5uZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9SWEhBU0gpKSB7CisJCWlmIChsaWtlbHkoKGVuYV9yeF9jdHgtPmw0X3Byb3RvID09IEVOQV9FVEhfSU9fTDRfUFJPVE9fVENQKSB8fAorCQkJICAgKGVuYV9yeF9jdHgtPmw0X3Byb3RvID09IEVOQV9FVEhfSU9fTDRfUFJPVE9fVURQKSkpCisKKwkJCWhhc2hfdHlwZSA9IFBLVF9IQVNIX1RZUEVfTDQ7CisJCWVsc2UKKwkJCWhhc2hfdHlwZSA9IFBLVF9IQVNIX1RZUEVfTk9ORTsKKworCQkvKiBPdmVycmlkZSBoYXNoIHR5cGUgaWYgdGhlIHBhY2tldCBpcyBmcmFnbWVudGVkICovCisJCWlmIChlbmFfcnhfY3R4LT5mcmFnKQorCQkJaGFzaF90eXBlID0gUEtUX0hBU0hfVFlQRV9OT05FOworCisJCXNrYl9zZXRfaGFzaChza2IsIGVuYV9yeF9jdHgtPmhhc2gsIGhhc2hfdHlwZSk7CisJfQorfQorCisvKiBlbmFfY2xlYW5fcnhfaXJxIC0gQ2xlYW51cCBSWCBpcnEKKyAqIEByeF9yaW5nOiBSWCByaW5nIHRvIGNsZWFuCisgKiBAbmFwaTogbmFwaSBoYW5kbGVyCisgKiBAYnVkZ2V0OiBob3cgbWFueSBwYWNrZXRzIGRyaXZlciBpcyBhbGxvd2VkIHRvIGNsZWFuCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNsZWFuZWQgYnVmZmVycy4KKyAqLworc3RhdGljIGludCBlbmFfY2xlYW5fcnhfaXJxKHN0cnVjdCBlbmFfcmluZyAqcnhfcmluZywgc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLAorCQkJICAgIHUzMiBidWRnZXQpCit7CisJdTE2IG5leHRfdG9fY2xlYW4gPSByeF9yaW5nLT5uZXh0X3RvX2NsZWFuOworCXUzMiByZXNfYnVkZ2V0LCB3b3JrX2RvbmU7CisKKwlzdHJ1Y3QgZW5hX2NvbV9yeF9jdHggZW5hX3J4X2N0eDsKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgcmVmaWxsX3JlcXVpcmVkOworCWludCByZWZpbGxfdGhyZXNob2xkOworCWludCByYyA9IDA7CisJaW50IHRvdGFsX2xlbiA9IDA7CisJaW50IHJ4X2NvcHlicmVha19wa3QgPSAwOworCisJbmV0aWZfZGJnKHJ4X3JpbmctPmFkYXB0ZXIsIHJ4X3N0YXR1cywgcnhfcmluZy0+bmV0ZGV2LAorCQkgICIlcyBxaWQgJWRcbiIsIF9fZnVuY19fLCByeF9yaW5nLT5xaWQpOworCXJlc19idWRnZXQgPSBidWRnZXQ7CisKKwlkbyB7CisJCWVuYV9yeF9jdHguZW5hX2J1ZnMgPSByeF9yaW5nLT5lbmFfYnVmczsKKwkJZW5hX3J4X2N0eC5tYXhfYnVmcyA9IHJ4X3JpbmctPnNnbF9zaXplOworCQllbmFfcnhfY3R4LmRlc2NzID0gMDsKKwkJcmMgPSBlbmFfY29tX3J4X3BrdChyeF9yaW5nLT5lbmFfY29tX2lvX2NxLAorCQkJCSAgICByeF9yaW5nLT5lbmFfY29tX2lvX3NxLAorCQkJCSAgICAmZW5hX3J4X2N0eCk7CisJCWlmICh1bmxpa2VseShyYykpCisJCQlnb3RvIGVycm9yOworCisJCWlmICh1bmxpa2VseShlbmFfcnhfY3R4LmRlc2NzID09IDApKQorCQkJYnJlYWs7CisKKwkJbmV0aWZfZGJnKHJ4X3JpbmctPmFkYXB0ZXIsIHJ4X3N0YXR1cywgcnhfcmluZy0+bmV0ZGV2LAorCQkJICAicnhfcG9sbDogcSAlZCBnb3QgcGFja2V0IGZyb20gZW5hLiBkZXNjcyAjOiAlZCBsMyBwcm90byAlZCBsNCBwcm90byAlZCBoYXNoOiAleFxuIiwKKwkJCSAgcnhfcmluZy0+cWlkLCBlbmFfcnhfY3R4LmRlc2NzLCBlbmFfcnhfY3R4LmwzX3Byb3RvLAorCQkJICBlbmFfcnhfY3R4Lmw0X3Byb3RvLCBlbmFfcnhfY3R4Lmhhc2gpOworCisJCS8qIGFsbG9jYXRlIHNrYiBhbmQgZmlsbCBpdCAqLworCQlza2IgPSBlbmFfcnhfc2tiKHJ4X3JpbmcsIHJ4X3JpbmctPmVuYV9idWZzLCBlbmFfcnhfY3R4LmRlc2NzLAorCQkJCSAmbmV4dF90b19jbGVhbik7CisKKwkJLyogZXhpdCBpZiB3ZSBmYWlsZWQgdG8gcmV0cmlldmUgYSBidWZmZXIgKi8KKwkJaWYgKHVubGlrZWx5KCFza2IpKSB7CisJCQluZXh0X3RvX2NsZWFuID0gRU5BX1JYX1JJTkdfSURYX0FERChuZXh0X3RvX2NsZWFuLAorCQkJCQkJCSAgICBlbmFfcnhfY3R4LmRlc2NzLAorCQkJCQkJCSAgICByeF9yaW5nLT5yaW5nX3NpemUpOworCQkJYnJlYWs7CisJCX0KKworCQllbmFfcnhfY2hlY2tzdW0ocnhfcmluZywgJmVuYV9yeF9jdHgsIHNrYik7CisKKwkJZW5hX3NldF9yeF9oYXNoKHJ4X3JpbmcsICZlbmFfcnhfY3R4LCBza2IpOworCisJCXNrYl9yZWNvcmRfcnhfcXVldWUoc2tiLCByeF9yaW5nLT5xaWQpOworCisJCWlmIChyeF9yaW5nLT5lbmFfYnVmc1swXS5sZW4gPD0gcnhfcmluZy0+cnhfY29weWJyZWFrKSB7CisJCQl0b3RhbF9sZW4gKz0gcnhfcmluZy0+ZW5hX2J1ZnNbMF0ubGVuOworCQkJcnhfY29weWJyZWFrX3BrdCsrOworCQkJbmFwaV9ncm9fcmVjZWl2ZShuYXBpLCBza2IpOworCQl9IGVsc2UgeworCQkJdG90YWxfbGVuICs9IHNrYi0+bGVuOworCQkJbmFwaV9ncm9fZnJhZ3MobmFwaSk7CisJCX0KKworCQlyZXNfYnVkZ2V0LS07CisJfSB3aGlsZSAobGlrZWx5KHJlc19idWRnZXQpKTsKKworCXdvcmtfZG9uZSA9IGJ1ZGdldCAtIHJlc19idWRnZXQ7CisJcnhfcmluZy0+cGVyX25hcGlfYnl0ZXMgKz0gdG90YWxfbGVuOworCXJ4X3JpbmctPnBlcl9uYXBpX3BhY2tldHMgKz0gd29ya19kb25lOworCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnJ4X3JpbmctPnN5bmNwKTsKKwlyeF9yaW5nLT5yeF9zdGF0cy5ieXRlcyArPSB0b3RhbF9sZW47CisJcnhfcmluZy0+cnhfc3RhdHMuY250ICs9IHdvcmtfZG9uZTsKKwlyeF9yaW5nLT5yeF9zdGF0cy5yeF9jb3B5YnJlYWtfcGt0ICs9IHJ4X2NvcHlicmVha19wa3Q7CisJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnJ4X3JpbmctPnN5bmNwKTsKKworCXJ4X3JpbmctPm5leHRfdG9fY2xlYW4gPSBuZXh0X3RvX2NsZWFuOworCisJcmVmaWxsX3JlcXVpcmVkID0gZW5hX2NvbV9zcV9lbXB0eV9zcGFjZShyeF9yaW5nLT5lbmFfY29tX2lvX3NxKTsKKwlyZWZpbGxfdGhyZXNob2xkID0gcnhfcmluZy0+cmluZ19zaXplIC8gRU5BX1JYX1JFRklMTF9USFJFU0hfRElWSURFUjsKKworCS8qIE9wdGltaXphdGlvbiwgdHJ5IHRvIGJhdGNoIG5ldyByeCBidWZmZXJzICovCisJaWYgKHJlZmlsbF9yZXF1aXJlZCA+IHJlZmlsbF90aHJlc2hvbGQpIHsKKwkJZW5hX2NvbV91cGRhdGVfZGV2X2NvbXBfaGVhZChyeF9yaW5nLT5lbmFfY29tX2lvX2NxKTsKKwkJZW5hX3JlZmlsbF9yeF9idWZzKHJ4X3JpbmcsIHJlZmlsbF9yZXF1aXJlZCk7CisJfQorCisJcmV0dXJuIHdvcmtfZG9uZTsKKworZXJyb3I6CisJYWRhcHRlciA9IG5ldGRldl9wcml2KHJ4X3JpbmctPm5ldGRldik7CisKKwl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZyeF9yaW5nLT5zeW5jcCk7CisJcnhfcmluZy0+cnhfc3RhdHMuYmFkX2Rlc2NfbnVtKys7CisJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnJ4X3JpbmctPnN5bmNwKTsKKworCS8qIFRvbyBtYW55IGRlc2MgZnJvbSB0aGUgZGV2aWNlLiBUcmlnZ2VyIHJlc2V0ICovCisJc2V0X2JpdChFTkFfRkxBR19UUklHR0VSX1JFU0VULCAmYWRhcHRlci0+ZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK2lubGluZSB2b2lkIGVuYV9hZGp1c3RfaW50cl9tb2RlcmF0aW9uKHN0cnVjdCBlbmFfcmluZyAqcnhfcmluZywKKwkJCQkgICAgICAgc3RydWN0IGVuYV9yaW5nICp0eF9yaW5nKQoreworCS8qIFdlIGFwcGx5IGFkYXB0aXZlIG1vZGVyYXRpb24gb24gUnggcGF0aCBvbmx5LgorCSAqIFR4IHVzZXMgc3RhdGljIGludGVycnVwdCBtb2RlcmF0aW9uLgorCSAqLworCWVuYV9jb21fY2FsY3VsYXRlX2ludGVycnVwdF9kZWxheShyeF9yaW5nLT5lbmFfZGV2LAorCQkJCQkgIHJ4X3JpbmctPnBlcl9uYXBpX3BhY2tldHMsCisJCQkJCSAgcnhfcmluZy0+cGVyX25hcGlfYnl0ZXMsCisJCQkJCSAgJnJ4X3JpbmctPnNtb290aGVkX2ludGVydmFsLAorCQkJCQkgICZyeF9yaW5nLT5tb2Rlcl90YmxfaWR4KTsKKworCS8qIFJlc2V0IHBlciBuYXBpIHBhY2tldHMvYnl0ZXMgKi8KKwl0eF9yaW5nLT5wZXJfbmFwaV9wYWNrZXRzID0gMDsKKwl0eF9yaW5nLT5wZXJfbmFwaV9ieXRlcyA9IDA7CisJcnhfcmluZy0+cGVyX25hcGlfcGFja2V0cyA9IDA7CisJcnhfcmluZy0+cGVyX25hcGlfYnl0ZXMgPSAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5hX3VwZGF0ZV9yaW5nX251bWFfbm9kZShzdHJ1Y3QgZW5hX3JpbmcgKnR4X3JpbmcsCisJCQkJCSAgICAgc3RydWN0IGVuYV9yaW5nICpyeF9yaW5nKQoreworCWludCBjcHUgPSBnZXRfY3B1KCk7CisJaW50IG51bWFfbm9kZTsKKworCS8qIENoZWNrIG9ubHkgb25lIHJpbmcgc2luY2UgdGhlIDIgcmluZ3MgYXJlIHJ1bm5pbmcgb24gdGhlIHNhbWUgY3B1ICovCisJaWYgKGxpa2VseSh0eF9yaW5nLT5jcHUgPT0gY3B1KSkKKwkJZ290byBvdXQ7CisKKwludW1hX25vZGUgPSBjcHVfdG9fbm9kZShjcHUpOworCXB1dF9jcHUoKTsKKworCWlmIChudW1hX25vZGUgIT0gTlVNQV9OT19OT0RFKSB7CisJCWVuYV9jb21fdXBkYXRlX251bWFfbm9kZSh0eF9yaW5nLT5lbmFfY29tX2lvX2NxLCBudW1hX25vZGUpOworCQllbmFfY29tX3VwZGF0ZV9udW1hX25vZGUocnhfcmluZy0+ZW5hX2NvbV9pb19jcSwgbnVtYV9ub2RlKTsKKwl9CisKKwl0eF9yaW5nLT5jcHUgPSBjcHU7CisJcnhfcmluZy0+Y3B1ID0gY3B1OworCisJcmV0dXJuOworb3V0OgorCXB1dF9jcHUoKTsKK30KKworc3RhdGljIGludCBlbmFfaW9fcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpCit7CisJc3RydWN0IGVuYV9uYXBpICplbmFfbmFwaSA9IGNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgZW5hX25hcGksIG5hcGkpOworCXN0cnVjdCBlbmFfcmluZyAqdHhfcmluZywgKnJ4X3Jpbmc7CisJc3RydWN0IGVuYV9ldGhfaW9faW50cl9yZWcgaW50cl9yZWc7CisKKwl1MzIgdHhfd29ya19kb25lOworCXUzMiByeF93b3JrX2RvbmU7CisJaW50IHR4X2J1ZGdldDsKKwlpbnQgbmFwaV9jb21wX2NhbGwgPSAwOworCWludCByZXQ7CisKKwl0eF9yaW5nID0gZW5hX25hcGktPnR4X3Jpbmc7CisJcnhfcmluZyA9IGVuYV9uYXBpLT5yeF9yaW5nOworCisJdHhfYnVkZ2V0ID0gdHhfcmluZy0+cmluZ19zaXplIC8gRU5BX1RYX1BPTExfQlVER0VUX0RJVklERVI7CisKKwlpZiAoIXRlc3RfYml0KEVOQV9GTEFHX0RFVl9VUCwgJnR4X3JpbmctPmFkYXB0ZXItPmZsYWdzKSkgeworCQluYXBpX2NvbXBsZXRlX2RvbmUobmFwaSwgMCk7CisJCXJldHVybiAwOworCX0KKworCXR4X3dvcmtfZG9uZSA9IGVuYV9jbGVhbl90eF9pcnEodHhfcmluZywgdHhfYnVkZ2V0KTsKKwlyeF93b3JrX2RvbmUgPSBlbmFfY2xlYW5fcnhfaXJxKHJ4X3JpbmcsIG5hcGksIGJ1ZGdldCk7CisKKwlpZiAoKGJ1ZGdldCA+IHJ4X3dvcmtfZG9uZSkgJiYgKHR4X2J1ZGdldCA+IHR4X3dvcmtfZG9uZSkpIHsKKwkJbmFwaV9jb21wbGV0ZV9kb25lKG5hcGksIHJ4X3dvcmtfZG9uZSk7CisKKwkJbmFwaV9jb21wX2NhbGwgPSAxOworCQkvKiBUeCBhbmQgUnggc2hhcmUgdGhlIHNhbWUgaW50ZXJydXB0IHZlY3RvciAqLworCQlpZiAoZW5hX2NvbV9nZXRfYWRhcHRpdmVfbW9kZXJhdGlvbl9lbmFibGVkKHJ4X3JpbmctPmVuYV9kZXYpKQorCQkJZW5hX2FkanVzdF9pbnRyX21vZGVyYXRpb24ocnhfcmluZywgdHhfcmluZyk7CisKKwkJLyogVXBkYXRlIGludHIgcmVnaXN0ZXI6IHJ4IGludHIgZGVsYXksIHR4IGludHIgZGVsYXkgYW5kCisJCSAqIGludGVycnVwdCB1bm1hc2sKKwkJICovCisJCWVuYV9jb21fdXBkYXRlX2ludHJfcmVnKCZpbnRyX3JlZywKKwkJCQkJcnhfcmluZy0+c21vb3RoZWRfaW50ZXJ2YWwsCisJCQkJCXR4X3JpbmctPnNtb290aGVkX2ludGVydmFsLAorCQkJCQl0cnVlKTsKKworCQkvKiBJdCBpcyBhIHNoYXJlZCBNU0ktWC4gVHggYW5kIFJ4IENRIGhhdmUgcG9pbnRlciB0byBpdC4KKwkJICogU28gd2UgdXNlIG9uZSBvZiB0aGVtIHRvIHJlYWNoIHRoZSBpbnRyIHJlZworCQkgKi8KKwkJZW5hX2NvbV91bm1hc2tfaW50cihyeF9yaW5nLT5lbmFfY29tX2lvX2NxLCAmaW50cl9yZWcpOworCisJCWVuYV91cGRhdGVfcmluZ19udW1hX25vZGUodHhfcmluZywgcnhfcmluZyk7CisKKwkJcmV0ID0gcnhfd29ya19kb25lOworCX0gZWxzZSB7CisJCXJldCA9IGJ1ZGdldDsKKwl9CisKKwl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZ0eF9yaW5nLT5zeW5jcCk7CisJdHhfcmluZy0+dHhfc3RhdHMubmFwaV9jb21wICs9IG5hcGlfY29tcF9jYWxsOworCXR4X3JpbmctPnR4X3N0YXRzLnR4X3BvbGwrKzsKKwl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmdHhfcmluZy0+c3luY3ApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlycXJldHVybl90IGVuYV9pbnRyX21zaXhfbWdtbnQoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGVuYV9hZGFwdGVyICopZGF0YTsKKworCWVuYV9jb21fYWRtaW5fcV9jb21wX2ludHJfaGFuZGxlcihhZGFwdGVyLT5lbmFfZGV2KTsKKworCS8qIERvbid0IGNhbGwgdGhlIGFlbnEgaGFuZGxlciBiZWZvcmUgcHJvYmUgaXMgZG9uZSAqLworCWlmIChsaWtlbHkodGVzdF9iaXQoRU5BX0ZMQUdfREVWSUNFX1JVTk5JTkcsICZhZGFwdGVyLT5mbGFncykpKQorCQllbmFfY29tX2FlbnFfaW50cl9oYW5kbGVyKGFkYXB0ZXItPmVuYV9kZXYsIGRhdGEpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBlbmFfaW50cl9tc2l4X2lvIC0gTVNJLVggSW50ZXJydXB0IEhhbmRsZXIgZm9yIFR4L1J4CisgKiBAaXJxOiBpbnRlcnJ1cHQgbnVtYmVyCisgKiBAZGF0YTogcG9pbnRlciB0byBhIG5ldHdvcmsgaW50ZXJmYWNlIHByaXZhdGUgbmFwaSBkZXZpY2Ugc3RydWN0dXJlCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBlbmFfaW50cl9tc2l4X2lvKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGVuYV9uYXBpICplbmFfbmFwaSA9IGRhdGE7CisKKwluYXBpX3NjaGVkdWxlKCZlbmFfbmFwaS0+bmFwaSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2VuYWJsZV9tc2l4KHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciwgaW50IG51bV9xdWV1ZXMpCit7CisJaW50IGksIG1zaXhfdmVjcywgcmM7CisKKwlpZiAodGVzdF9iaXQoRU5BX0ZMQUdfTVNJWF9FTkFCTEVELCAmYWRhcHRlci0+ZmxhZ3MpKSB7CisJCW5ldGlmX2VycihhZGFwdGVyLCBwcm9iZSwgYWRhcHRlci0+bmV0ZGV2LAorCQkJICAiRXJyb3IsIE1TSS1YIGlzIGFscmVhZHkgZW5hYmxlZFxuIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJLyogUmVzZXJ2ZWQgdGhlIG1heCBtc2l4IHZlY3RvcnMgd2UgbWlnaHQgbmVlZCAqLworCW1zaXhfdmVjcyA9IEVOQV9NQVhfTVNJWF9WRUMobnVtX3F1ZXVlcyk7CisKKwluZXRpZl9kYmcoYWRhcHRlciwgcHJvYmUsIGFkYXB0ZXItPm5ldGRldiwKKwkJICAidHJ5aW5nIHRvIGVuYWJsZSBNU0ktWCwgdmVjdG9ycyAlZFxuIiwgbXNpeF92ZWNzKTsKKworCWFkYXB0ZXItPm1zaXhfZW50cmllcyA9IHZ6YWxsb2MobXNpeF92ZWNzICogc2l6ZW9mKHN0cnVjdCBtc2l4X2VudHJ5KSk7CisKKwlpZiAoIWFkYXB0ZXItPm1zaXhfZW50cmllcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgbXNpeF92ZWNzOyBpKyspCisJCWFkYXB0ZXItPm1zaXhfZW50cmllc1tpXS5lbnRyeSA9IGk7CisKKwlyYyA9IHBjaV9lbmFibGVfbXNpeChhZGFwdGVyLT5wZGV2LCBhZGFwdGVyLT5tc2l4X2VudHJpZXMsIG1zaXhfdmVjcyk7CisJaWYgKHJjICE9IDApIHsKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIHByb2JlLCBhZGFwdGVyLT5uZXRkZXYsCisJCQkgICJGYWlsZWQgdG8gZW5hYmxlIE1TSS1YLCB2ZWN0b3JzICVkIHJjICVkXG4iLAorCQkJICBtc2l4X3ZlY3MsIHJjKTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCisJbmV0aWZfZGJnKGFkYXB0ZXIsIHByb2JlLCBhZGFwdGVyLT5uZXRkZXYsICJlbmFibGUgTVNJLVgsIHZlY3RvcnMgJWRcbiIsCisJCSAgbXNpeF92ZWNzKTsKKworCWlmIChtc2l4X3ZlY3MgPj0gMSkgeworCQlpZiAoZW5hX2luaXRfcnhfY3B1X3JtYXAoYWRhcHRlcikpCisJCQluZXRpZl93YXJuKGFkYXB0ZXIsIHByb2JlLCBhZGFwdGVyLT5uZXRkZXYsCisJCQkJICAgIkZhaWxlZCB0byBtYXAgSVJRcyB0byBDUFVzXG4iKTsKKwl9CisKKwlhZGFwdGVyLT5tc2l4X3ZlY3MgPSBtc2l4X3ZlY3M7CisJc2V0X2JpdChFTkFfRkxBR19NU0lYX0VOQUJMRUQsICZhZGFwdGVyLT5mbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZW5hX3NldHVwX21nbW50X2ludHIoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCXUzMiBjcHU7CisKKwlzbnByaW50ZihhZGFwdGVyLT5pcnFfdGJsW0VOQV9NR01OVF9JUlFfSURYXS5uYW1lLAorCQkgRU5BX0lSUU5BTUVfU0laRSwgImVuYS1tZ21udEBwY2k6JXMiLAorCQkgcGNpX25hbWUoYWRhcHRlci0+cGRldikpOworCWFkYXB0ZXItPmlycV90YmxbRU5BX01HTU5UX0lSUV9JRFhdLmhhbmRsZXIgPQorCQllbmFfaW50cl9tc2l4X21nbW50OworCWFkYXB0ZXItPmlycV90YmxbRU5BX01HTU5UX0lSUV9JRFhdLmRhdGEgPSBhZGFwdGVyOworCWFkYXB0ZXItPmlycV90YmxbRU5BX01HTU5UX0lSUV9JRFhdLnZlY3RvciA9CisJCWFkYXB0ZXItPm1zaXhfZW50cmllc1tFTkFfTUdNTlRfSVJRX0lEWF0udmVjdG9yOworCWNwdSA9IGNwdW1hc2tfZmlyc3QoY3B1X29ubGluZV9tYXNrKTsKKwlhZGFwdGVyLT5pcnFfdGJsW0VOQV9NR01OVF9JUlFfSURYXS5jcHUgPSBjcHU7CisJY3B1bWFza19zZXRfY3B1KGNwdSwKKwkJCSZhZGFwdGVyLT5pcnFfdGJsW0VOQV9NR01OVF9JUlFfSURYXS5hZmZpbml0eV9oaW50X21hc2spOworfQorCitzdGF0aWMgdm9pZCBlbmFfc2V0dXBfaW9faW50cihzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlpbnQgaXJxX2lkeCwgaSwgY3B1OworCisJbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykgeworCQlpcnFfaWR4ID0gRU5BX0lPX0lSUV9JRFgoaSk7CisJCWNwdSA9IGkgJSBudW1fb25saW5lX2NwdXMoKTsKKworCQlzbnByaW50ZihhZGFwdGVyLT5pcnFfdGJsW2lycV9pZHhdLm5hbWUsIEVOQV9JUlFOQU1FX1NJWkUsCisJCQkgIiVzLVR4LVJ4LSVkIiwgbmV0ZGV2LT5uYW1lLCBpKTsKKwkJYWRhcHRlci0+aXJxX3RibFtpcnFfaWR4XS5oYW5kbGVyID0gZW5hX2ludHJfbXNpeF9pbzsKKwkJYWRhcHRlci0+aXJxX3RibFtpcnFfaWR4XS5kYXRhID0gJmFkYXB0ZXItPmVuYV9uYXBpW2ldOworCQlhZGFwdGVyLT5pcnFfdGJsW2lycV9pZHhdLnZlY3RvciA9CisJCQlhZGFwdGVyLT5tc2l4X2VudHJpZXNbaXJxX2lkeF0udmVjdG9yOworCQlhZGFwdGVyLT5pcnFfdGJsW2lycV9pZHhdLmNwdSA9IGNwdTsKKworCQljcHVtYXNrX3NldF9jcHUoY3B1LAorCQkJCSZhZGFwdGVyLT5pcnFfdGJsW2lycV9pZHhdLmFmZmluaXR5X2hpbnRfbWFzayk7CisJfQorfQorCitzdGF0aWMgaW50IGVuYV9yZXF1ZXN0X21nbW50X2lycShzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJc3RydWN0IGVuYV9pcnEgKmlycTsKKwlpbnQgcmM7CisKKwlpcnEgPSAmYWRhcHRlci0+aXJxX3RibFtFTkFfTUdNTlRfSVJRX0lEWF07CisJcmMgPSByZXF1ZXN0X2lycShpcnEtPnZlY3RvciwgaXJxLT5oYW5kbGVyLCBmbGFncywgaXJxLT5uYW1lLAorCQkJIGlycS0+ZGF0YSk7CisJaWYgKHJjKSB7CisJCW5ldGlmX2VycihhZGFwdGVyLCBwcm9iZSwgYWRhcHRlci0+bmV0ZGV2LAorCQkJICAiZmFpbGVkIHRvIHJlcXVlc3QgYWRtaW4gaXJxXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCW5ldGlmX2RiZyhhZGFwdGVyLCBwcm9iZSwgYWRhcHRlci0+bmV0ZGV2LAorCQkgICJzZXQgYWZmaW5pdHkgaGludCBvZiBtZ21udCBpcnEudG8gMHglbHggKGlycSB2ZWN0b3I6ICVkKVxuIiwKKwkJICBpcnEtPmFmZmluaXR5X2hpbnRfbWFzay5iaXRzWzBdLCBpcnEtPnZlY3Rvcik7CisKKwlpcnFfc2V0X2FmZmluaXR5X2hpbnQoaXJxLT52ZWN0b3IsICZpcnEtPmFmZmluaXR5X2hpbnRfbWFzayk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZW5hX3JlcXVlc3RfaW9faXJxKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlzdHJ1Y3QgZW5hX2lycSAqaXJxOworCWludCByYyA9IDAsIGksIGs7CisKKwlpZiAoIXRlc3RfYml0KEVOQV9GTEFHX01TSVhfRU5BQkxFRCwgJmFkYXB0ZXItPmZsYWdzKSkgeworCQluZXRpZl9lcnIoYWRhcHRlciwgaWZ1cCwgYWRhcHRlci0+bmV0ZGV2LAorCQkJICAiRmFpbGVkIHRvIHJlcXVlc3QgSS9PIElSUTogTVNJLVggaXMgbm90IGVuYWJsZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmb3IgKGkgPSBFTkFfSU9fSVJRX0ZJUlNUX0lEWDsgaSA8IGFkYXB0ZXItPm1zaXhfdmVjczsgaSsrKSB7CisJCWlycSA9ICZhZGFwdGVyLT5pcnFfdGJsW2ldOworCQlyYyA9IHJlcXVlc3RfaXJxKGlycS0+dmVjdG9yLCBpcnEtPmhhbmRsZXIsIGZsYWdzLCBpcnEtPm5hbWUsCisJCQkJIGlycS0+ZGF0YSk7CisJCWlmIChyYykgeworCQkJbmV0aWZfZXJyKGFkYXB0ZXIsIGlmdXAsIGFkYXB0ZXItPm5ldGRldiwKKwkJCQkgICJGYWlsZWQgdG8gcmVxdWVzdCBJL08gSVJRLiBpbmRleCAlZCByYyAlZFxuIiwKKwkJCQkgICBpLCByYyk7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCW5ldGlmX2RiZyhhZGFwdGVyLCBpZnVwLCBhZGFwdGVyLT5uZXRkZXYsCisJCQkgICJzZXQgYWZmaW5pdHkgaGludCBvZiBpcnEuIGluZGV4ICVkIHRvIDB4JWx4IChpcnEgdmVjdG9yOiAlZClcbiIsCisJCQkgIGksIGlycS0+YWZmaW5pdHlfaGludF9tYXNrLmJpdHNbMF0sIGlycS0+dmVjdG9yKTsKKworCQlpcnFfc2V0X2FmZmluaXR5X2hpbnQoaXJxLT52ZWN0b3IsICZpcnEtPmFmZmluaXR5X2hpbnRfbWFzayk7CisJfQorCisJcmV0dXJuIHJjOworCitlcnI6CisJZm9yIChrID0gRU5BX0lPX0lSUV9GSVJTVF9JRFg7IGsgPCBpOyBrKyspIHsKKwkJaXJxID0gJmFkYXB0ZXItPmlycV90Ymxba107CisJCWZyZWVfaXJxKGlycS0+dmVjdG9yLCBpcnEtPmRhdGEpOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgZW5hX2ZyZWVfbWdtbnRfaXJxKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgZW5hX2lycSAqaXJxOworCisJaXJxID0gJmFkYXB0ZXItPmlycV90YmxbRU5BX01HTU5UX0lSUV9JRFhdOworCXN5bmNocm9uaXplX2lycShpcnEtPnZlY3Rvcik7CisJaXJxX3NldF9hZmZpbml0eV9oaW50KGlycS0+dmVjdG9yLCBOVUxMKTsKKwlmcmVlX2lycShpcnEtPnZlY3RvciwgaXJxLT5kYXRhKTsKK30KKworc3RhdGljIHZvaWQgZW5hX2ZyZWVfaW9faXJxKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgZW5hX2lycSAqaXJxOworCWludCBpOworCisjaWZkZWYgQ09ORklHX1JGU19BQ0NFTAorCWlmIChhZGFwdGVyLT5tc2l4X3ZlY3MgPj0gMSkgeworCQlmcmVlX2lycV9jcHVfcm1hcChhZGFwdGVyLT5uZXRkZXYtPnJ4X2NwdV9ybWFwKTsKKwkJYWRhcHRlci0+bmV0ZGV2LT5yeF9jcHVfcm1hcCA9IE5VTEw7CisJfQorI2VuZGlmIC8qIENPTkZJR19SRlNfQUNDRUwgKi8KKworCWZvciAoaSA9IEVOQV9JT19JUlFfRklSU1RfSURYOyBpIDwgYWRhcHRlci0+bXNpeF92ZWNzOyBpKyspIHsKKwkJaXJxID0gJmFkYXB0ZXItPmlycV90YmxbaV07CisJCWlycV9zZXRfYWZmaW5pdHlfaGludChpcnEtPnZlY3RvciwgTlVMTCk7CisJCWZyZWVfaXJxKGlycS0+dmVjdG9yLCBpcnEtPmRhdGEpOworCX0KK30KKworc3RhdGljIHZvaWQgZW5hX2Rpc2FibGVfbXNpeChzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChFTkFfRkxBR19NU0lYX0VOQUJMRUQsICZhZGFwdGVyLT5mbGFncykpCisJCXBjaV9kaXNhYmxlX21zaXgoYWRhcHRlci0+cGRldik7CisKKwlpZiAoYWRhcHRlci0+bXNpeF9lbnRyaWVzKQorCQl2ZnJlZShhZGFwdGVyLT5tc2l4X2VudHJpZXMpOworCWFkYXB0ZXItPm1zaXhfZW50cmllcyA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9kaXNhYmxlX2lvX2ludHJfc3luYyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IGk7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkKKwkJcmV0dXJuOworCisJZm9yIChpID0gRU5BX0lPX0lSUV9GSVJTVF9JRFg7IGkgPCBhZGFwdGVyLT5tc2l4X3ZlY3M7IGkrKykKKwkJc3luY2hyb25pemVfaXJxKGFkYXB0ZXItPmlycV90YmxbaV0udmVjdG9yKTsKK30KKworc3RhdGljIHZvaWQgZW5hX2RlbF9uYXBpKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspCisJCW5ldGlmX25hcGlfZGVsKCZhZGFwdGVyLT5lbmFfbmFwaVtpXS5uYXBpKTsKK30KKworc3RhdGljIHZvaWQgZW5hX2luaXRfbmFwaShzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGVuYV9uYXBpICpuYXBpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykgeworCQluYXBpID0gJmFkYXB0ZXItPmVuYV9uYXBpW2ldOworCisJCW5ldGlmX25hcGlfYWRkKGFkYXB0ZXItPm5ldGRldiwKKwkJCSAgICAgICAmYWRhcHRlci0+ZW5hX25hcGlbaV0ubmFwaSwKKwkJCSAgICAgICBlbmFfaW9fcG9sbCwKKwkJCSAgICAgICBFTkFfTkFQSV9CVURHRVQpOworCQluYXBpLT5yeF9yaW5nID0gJmFkYXB0ZXItPnJ4X3JpbmdbaV07CisJCW5hcGktPnR4X3JpbmcgPSAmYWRhcHRlci0+dHhfcmluZ1tpXTsKKwkJbmFwaS0+cWlkID0gaTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9uYXBpX2Rpc2FibGVfYWxsKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspCisJCW5hcGlfZGlzYWJsZSgmYWRhcHRlci0+ZW5hX25hcGlbaV0ubmFwaSk7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9uYXBpX2VuYWJsZV9hbGwoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykKKwkJbmFwaV9lbmFibGUoJmFkYXB0ZXItPmVuYV9uYXBpW2ldLm5hcGkpOworfQorCitzdGF0aWMgdm9pZCBlbmFfcmVzdG9yZV9ldGh0b29sX3BhcmFtcyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJYWRhcHRlci0+dHhfdXNlY3MgPSAwOworCWFkYXB0ZXItPnJ4X3VzZWNzID0gMDsKKwlhZGFwdGVyLT50eF9mcmFtZXMgPSAxOworCWFkYXB0ZXItPnJ4X2ZyYW1lcyA9IDE7Cit9CisKKy8qIENvbmZpZ3VyZSB0aGUgUnggZm9yd2FyZGluZyAqLworc3RhdGljIGludCBlbmFfcnNzX2NvbmZpZ3VyZShzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2ID0gYWRhcHRlci0+ZW5hX2RldjsKKwlpbnQgcmM7CisKKwkvKiBJbiBjYXNlIHRoZSBSU1MgdGFibGUgd2Fzbid0IGluaXRpYWxpemVkIGJ5IHByb2JlICovCisJaWYgKCFlbmFfZGV2LT5yc3MudGJsX2xvZ19zaXplKSB7CisJCXJjID0gZW5hX3Jzc19pbml0X2RlZmF1bHQoYWRhcHRlcik7CisJCWlmIChyYyAmJiAocmMgIT0gLUVQRVJNKSkgeworCQkJbmV0aWZfZXJyKGFkYXB0ZXIsIGlmdXAsIGFkYXB0ZXItPm5ldGRldiwKKwkJCQkgICJGYWlsZWQgdG8gaW5pdCBSU1MgcmM6ICVkXG4iLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwkvKiBTZXQgaW5kaXJlY3QgdGFibGUgKi8KKwlyYyA9IGVuYV9jb21faW5kaXJlY3RfdGFibGVfc2V0KGVuYV9kZXYpOworCWlmICh1bmxpa2VseShyYyAmJiByYyAhPSAtRVBFUk0pKQorCQlyZXR1cm4gcmM7CisKKwkvKiBDb25maWd1cmUgaGFzaCBmdW5jdGlvbiAoaWYgc3VwcG9ydGVkKSAqLworCXJjID0gZW5hX2NvbV9zZXRfaGFzaF9mdW5jdGlvbihlbmFfZGV2KTsKKwlpZiAodW5saWtlbHkocmMgJiYgKHJjICE9IC1FUEVSTSkpKQorCQlyZXR1cm4gcmM7CisKKwkvKiBDb25maWd1cmUgaGFzaCBpbnB1dHMgKGlmIHN1cHBvcnRlZCkgKi8KKwlyYyA9IGVuYV9jb21fc2V0X2hhc2hfY3RybChlbmFfZGV2KTsKKwlpZiAodW5saWtlbHkocmMgJiYgKHJjICE9IC1FUEVSTSkpKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmFfdXBfY29tcGxldGUoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCByYywgaTsKKworCXJjID0gZW5hX3Jzc19jb25maWd1cmUoYWRhcHRlcik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwllbmFfaW5pdF9uYXBpKGFkYXB0ZXIpOworCisJZW5hX2NoYW5nZV9tdHUoYWRhcHRlci0+bmV0ZGV2LCBhZGFwdGVyLT5uZXRkZXYtPm10dSk7CisKKwllbmFfcmVmaWxsX2FsbF9yeF9idWZzKGFkYXB0ZXIpOworCisJLyogZW5hYmxlIHRyYW5zbWl0cyAqLworCW5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXMoYWRhcHRlci0+bmV0ZGV2KTsKKworCWVuYV9yZXN0b3JlX2V0aHRvb2xfcGFyYW1zKGFkYXB0ZXIpOworCisJZW5hX25hcGlfZW5hYmxlX2FsbChhZGFwdGVyKTsKKworCS8qIHNjaGVkdWxlIG5hcGkgaW4gY2FzZSB3ZSBoYWQgcGVuZGluZyBwYWNrZXRzCisJICogZnJvbSB0aGUgbGFzdCB0aW1lIHdlIGRpc2FibGUgbmFwaQorCSAqLworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspCisJCW5hcGlfc2NoZWR1bGUoJmFkYXB0ZXItPmVuYV9uYXBpW2ldLm5hcGkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2NyZWF0ZV9pb190eF9xdWV1ZShzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBxaWQpCit7CisJc3RydWN0IGVuYV9jb21fY3JlYXRlX2lvX2N0eCBjdHggPSB7IDAgfTsKKwlzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXY7CisJc3RydWN0IGVuYV9yaW5nICp0eF9yaW5nOworCXUzMiBtc2l4X3ZlY3RvcjsKKwl1MTYgZW5hX3FpZDsKKwlpbnQgcmM7CisKKwllbmFfZGV2ID0gYWRhcHRlci0+ZW5hX2RldjsKKworCXR4X3JpbmcgPSAmYWRhcHRlci0+dHhfcmluZ1txaWRdOworCW1zaXhfdmVjdG9yID0gRU5BX0lPX0lSUV9JRFgocWlkKTsKKwllbmFfcWlkID0gRU5BX0lPX1RYUV9JRFgocWlkKTsKKworCWN0eC5kaXJlY3Rpb24gPSBFTkFfQ09NX0lPX1FVRVVFX0RJUkVDVElPTl9UWDsKKwljdHgucWlkID0gZW5hX3FpZDsKKwljdHgubWVtX3F1ZXVlX3R5cGUgPSBlbmFfZGV2LT50eF9tZW1fcXVldWVfdHlwZTsKKwljdHgubXNpeF92ZWN0b3IgPSBtc2l4X3ZlY3RvcjsKKwljdHgucXVldWVfc2l6ZSA9IGFkYXB0ZXItPnR4X3Jpbmdfc2l6ZTsKKwljdHgubnVtYV9ub2RlID0gY3B1X3RvX25vZGUodHhfcmluZy0+Y3B1KTsKKworCXJjID0gZW5hX2NvbV9jcmVhdGVfaW9fcXVldWUoZW5hX2RldiwgJmN0eCk7CisJaWYgKHJjKSB7CisJCW5ldGlmX2VycihhZGFwdGVyLCBpZnVwLCBhZGFwdGVyLT5uZXRkZXYsCisJCQkgICJGYWlsZWQgdG8gY3JlYXRlIEkvTyBUWCBxdWV1ZSBudW0gJWQgcmM6ICVkXG4iLAorCQkJICBxaWQsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjID0gZW5hX2NvbV9nZXRfaW9faGFuZGxlcnMoZW5hX2RldiwgZW5hX3FpZCwKKwkJCQkgICAgICZ0eF9yaW5nLT5lbmFfY29tX2lvX3NxLAorCQkJCSAgICAgJnR4X3JpbmctPmVuYV9jb21faW9fY3EpOworCWlmIChyYykgeworCQluZXRpZl9lcnIoYWRhcHRlciwgaWZ1cCwgYWRhcHRlci0+bmV0ZGV2LAorCQkJICAiRmFpbGVkIHRvIGdldCBUWCBxdWV1ZSBoYW5kbGVycy4gVFggcXVldWUgbnVtICVkIHJjOiAlZFxuIiwKKwkJCSAgcWlkLCByYyk7CisJCWVuYV9jb21fZGVzdHJveV9pb19xdWV1ZShlbmFfZGV2LCBlbmFfcWlkKTsKKwl9CisKKwllbmFfY29tX3VwZGF0ZV9udW1hX25vZGUodHhfcmluZy0+ZW5hX2NvbV9pb19jcSwgY3R4Lm51bWFfbm9kZSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGVuYV9jcmVhdGVfYWxsX2lvX3R4X3F1ZXVlcyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2ID0gYWRhcHRlci0+ZW5hX2RldjsKKwlpbnQgcmMsIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKSB7CisJCXJjID0gZW5hX2NyZWF0ZV9pb190eF9xdWV1ZShhZGFwdGVyLCBpKTsKKwkJaWYgKHJjKQorCQkJZ290byBjcmVhdGVfZXJyOworCX0KKworCXJldHVybiAwOworCitjcmVhdGVfZXJyOgorCXdoaWxlIChpLS0pCisJCWVuYV9jb21fZGVzdHJveV9pb19xdWV1ZShlbmFfZGV2LCBFTkFfSU9fVFhRX0lEWChpKSk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2NyZWF0ZV9pb19yeF9xdWV1ZShzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBxaWQpCit7CisJc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2OworCXN0cnVjdCBlbmFfY29tX2NyZWF0ZV9pb19jdHggY3R4ID0geyAwIH07CisJc3RydWN0IGVuYV9yaW5nICpyeF9yaW5nOworCXUzMiBtc2l4X3ZlY3RvcjsKKwl1MTYgZW5hX3FpZDsKKwlpbnQgcmM7CisKKwllbmFfZGV2ID0gYWRhcHRlci0+ZW5hX2RldjsKKworCXJ4X3JpbmcgPSAmYWRhcHRlci0+cnhfcmluZ1txaWRdOworCW1zaXhfdmVjdG9yID0gRU5BX0lPX0lSUV9JRFgocWlkKTsKKwllbmFfcWlkID0gRU5BX0lPX1JYUV9JRFgocWlkKTsKKworCWN0eC5xaWQgPSBlbmFfcWlkOworCWN0eC5kaXJlY3Rpb24gPSBFTkFfQ09NX0lPX1FVRVVFX0RJUkVDVElPTl9SWDsKKwljdHgubWVtX3F1ZXVlX3R5cGUgPSBFTkFfQURNSU5fUExBQ0VNRU5UX1BPTElDWV9IT1NUOworCWN0eC5tc2l4X3ZlY3RvciA9IG1zaXhfdmVjdG9yOworCWN0eC5xdWV1ZV9zaXplID0gYWRhcHRlci0+cnhfcmluZ19zaXplOworCWN0eC5udW1hX25vZGUgPSBjcHVfdG9fbm9kZShyeF9yaW5nLT5jcHUpOworCisJcmMgPSBlbmFfY29tX2NyZWF0ZV9pb19xdWV1ZShlbmFfZGV2LCAmY3R4KTsKKwlpZiAocmMpIHsKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIGlmdXAsIGFkYXB0ZXItPm5ldGRldiwKKwkJCSAgIkZhaWxlZCB0byBjcmVhdGUgSS9PIFJYIHF1ZXVlIG51bSAlZCByYzogJWRcbiIsCisJCQkgIHFpZCwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBlbmFfY29tX2dldF9pb19oYW5kbGVycyhlbmFfZGV2LCBlbmFfcWlkLAorCQkJCSAgICAgJnJ4X3JpbmctPmVuYV9jb21faW9fc3EsCisJCQkJICAgICAmcnhfcmluZy0+ZW5hX2NvbV9pb19jcSk7CisJaWYgKHJjKSB7CisJCW5ldGlmX2VycihhZGFwdGVyLCBpZnVwLCBhZGFwdGVyLT5uZXRkZXYsCisJCQkgICJGYWlsZWQgdG8gZ2V0IFJYIHF1ZXVlIGhhbmRsZXJzLiBSWCBxdWV1ZSBudW0gJWQgcmM6ICVkXG4iLAorCQkJICBxaWQsIHJjKTsKKwkJZW5hX2NvbV9kZXN0cm95X2lvX3F1ZXVlKGVuYV9kZXYsIGVuYV9xaWQpOworCX0KKworCWVuYV9jb21fdXBkYXRlX251bWFfbm9kZShyeF9yaW5nLT5lbmFfY29tX2lvX2NxLCBjdHgubnVtYV9ub2RlKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBlbmFfY3JlYXRlX2FsbF9pb19yeF9xdWV1ZXMoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiA9IGFkYXB0ZXItPmVuYV9kZXY7CisJaW50IHJjLCBpOworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykgeworCQlyYyA9IGVuYV9jcmVhdGVfaW9fcnhfcXVldWUoYWRhcHRlciwgaSk7CisJCWlmIChyYykKKwkJCWdvdG8gY3JlYXRlX2VycjsKKwl9CisKKwlyZXR1cm4gMDsKKworY3JlYXRlX2VycjoKKwl3aGlsZSAoaS0tKQorCQllbmFfY29tX2Rlc3Ryb3lfaW9fcXVldWUoZW5hX2RldiwgRU5BX0lPX1JYUV9JRFgoaSkpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGVuYV91cChzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IHJjOworCisJbmV0ZGV2X2RiZyhhZGFwdGVyLT5uZXRkZXYsICIlc1xuIiwgX19mdW5jX18pOworCisJZW5hX3NldHVwX2lvX2ludHIoYWRhcHRlcik7CisKKwlyYyA9IGVuYV9yZXF1ZXN0X2lvX2lycShhZGFwdGVyKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX3JlcV9pcnE7CisKKwkvKiBhbGxvY2F0ZSB0cmFuc21pdCBkZXNjcmlwdG9ycyAqLworCXJjID0gZW5hX3NldHVwX2FsbF90eF9yZXNvdXJjZXMoYWRhcHRlcik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9zZXR1cF90eDsKKworCS8qIGFsbG9jYXRlIHJlY2VpdmUgZGVzY3JpcHRvcnMgKi8KKwlyYyA9IGVuYV9zZXR1cF9hbGxfcnhfcmVzb3VyY2VzKGFkYXB0ZXIpOworCWlmIChyYykKKwkJZ290byBlcnJfc2V0dXBfcng7CisKKwkvKiBDcmVhdGUgVFggcXVldWVzICovCisJcmMgPSBlbmFfY3JlYXRlX2FsbF9pb190eF9xdWV1ZXMoYWRhcHRlcik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9jcmVhdGVfdHhfcXVldWVzOworCisJLyogQ3JlYXRlIFJYIHF1ZXVlcyAqLworCXJjID0gZW5hX2NyZWF0ZV9hbGxfaW9fcnhfcXVldWVzKGFkYXB0ZXIpOworCWlmIChyYykKKwkJZ290byBlcnJfY3JlYXRlX3J4X3F1ZXVlczsKKworCXJjID0gZW5hX3VwX2NvbXBsZXRlKGFkYXB0ZXIpOworCWlmIChyYykKKwkJZ290byBlcnJfdXA7CisKKwlpZiAodGVzdF9iaXQoRU5BX0ZMQUdfTElOS19VUCwgJmFkYXB0ZXItPmZsYWdzKSkKKwkJbmV0aWZfY2Fycmllcl9vbihhZGFwdGVyLT5uZXRkZXYpOworCisJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmYWRhcHRlci0+c3luY3ApOworCWFkYXB0ZXItPmRldl9zdGF0cy5pbnRlcmZhY2VfdXArKzsKKwl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmYWRhcHRlci0+c3luY3ApOworCisJc2V0X2JpdChFTkFfRkxBR19ERVZfVVAsICZhZGFwdGVyLT5mbGFncyk7CisKKwlyZXR1cm4gcmM7CisKK2Vycl91cDoKKwllbmFfZGVzdHJveV9hbGxfcnhfcXVldWVzKGFkYXB0ZXIpOworZXJyX2NyZWF0ZV9yeF9xdWV1ZXM6CisJZW5hX2Rlc3Ryb3lfYWxsX3R4X3F1ZXVlcyhhZGFwdGVyKTsKK2Vycl9jcmVhdGVfdHhfcXVldWVzOgorCWVuYV9mcmVlX2FsbF9pb19yeF9yZXNvdXJjZXMoYWRhcHRlcik7CitlcnJfc2V0dXBfcng6CisJZW5hX2ZyZWVfYWxsX2lvX3R4X3Jlc291cmNlcyhhZGFwdGVyKTsKK2Vycl9zZXR1cF90eDoKKwllbmFfZnJlZV9pb19pcnEoYWRhcHRlcik7CitlcnJfcmVxX2lycToKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgZW5hX2Rvd24oc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCW5ldGlmX2luZm8oYWRhcHRlciwgaWZkb3duLCBhZGFwdGVyLT5uZXRkZXYsICIlc1xuIiwgX19mdW5jX18pOworCisJY2xlYXJfYml0KEVOQV9GTEFHX0RFVl9VUCwgJmFkYXB0ZXItPmZsYWdzKTsKKworCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJmFkYXB0ZXItPnN5bmNwKTsKKwlhZGFwdGVyLT5kZXZfc3RhdHMuaW50ZXJmYWNlX2Rvd24rKzsKKwl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmYWRhcHRlci0+c3luY3ApOworCisJLyogQWZ0ZXIgdGhpcyBwb2ludCB0aGUgbmFwaSBoYW5kbGVyIHdvbid0IGVuYWJsZSB0aGUgdHggcXVldWUgKi8KKwllbmFfbmFwaV9kaXNhYmxlX2FsbChhZGFwdGVyKTsKKwluZXRpZl9jYXJyaWVyX29mZihhZGFwdGVyLT5uZXRkZXYpOworCW5ldGlmX3R4X2Rpc2FibGUoYWRhcHRlci0+bmV0ZGV2KTsKKworCS8qIEFmdGVyIGRlc3Ryb3kgdGhlIHF1ZXVlIHRoZXJlIHdvbid0IGJlIGFueSBuZXcgaW50ZXJydXB0cyAqLworCWVuYV9kZXN0cm95X2FsbF9pb19xdWV1ZXMoYWRhcHRlcik7CisKKwllbmFfZGlzYWJsZV9pb19pbnRyX3N5bmMoYWRhcHRlcik7CisJZW5hX2ZyZWVfaW9faXJxKGFkYXB0ZXIpOworCWVuYV9kZWxfbmFwaShhZGFwdGVyKTsKKworCWVuYV9mcmVlX2FsbF90eF9idWZzKGFkYXB0ZXIpOworCWVuYV9mcmVlX2FsbF9yeF9idWZzKGFkYXB0ZXIpOworCWVuYV9mcmVlX2FsbF9pb190eF9yZXNvdXJjZXMoYWRhcHRlcik7CisJZW5hX2ZyZWVfYWxsX2lvX3J4X3Jlc291cmNlcyhhZGFwdGVyKTsKK30KKworLyogZW5hX29wZW4gLSBDYWxsZWQgd2hlbiBhIG5ldHdvcmsgaW50ZXJmYWNlIGlzIG1hZGUgYWN0aXZlCisgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUKKyAqCisgKiBUaGUgb3BlbiBlbnRyeSBwb2ludCBpcyBjYWxsZWQgd2hlbiBhIG5ldHdvcmsgaW50ZXJmYWNlIGlzIG1hZGUKKyAqIGFjdGl2ZSBieSB0aGUgc3lzdGVtIChJRkZfVVApLiAgQXQgdGhpcyBwb2ludCBhbGwgcmVzb3VyY2VzIG5lZWRlZAorICogZm9yIHRyYW5zbWl0IGFuZCByZWNlaXZlIG9wZXJhdGlvbnMgYXJlIGFsbG9jYXRlZCwgdGhlIGludGVycnVwdAorICogaGFuZGxlciBpcyByZWdpc3RlcmVkIHdpdGggdGhlIE9TLCB0aGUgd2F0Y2hkb2cgdGltZXIgaXMgc3RhcnRlZCwKKyAqIGFuZCB0aGUgc3RhY2sgaXMgbm90aWZpZWQgdGhhdCB0aGUgaW50ZXJmYWNlIGlzIHJlYWR5LgorICovCitzdGF0aWMgaW50IGVuYV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgcmM7CisKKwkvKiBOb3RpZnkgdGhlIHN0YWNrIG9mIHRoZSBhY3R1YWwgcXVldWUgY291bnRzLiAqLworCXJjID0gbmV0aWZfc2V0X3JlYWxfbnVtX3R4X3F1ZXVlcyhuZXRkZXYsIGFkYXB0ZXItPm51bV9xdWV1ZXMpOworCWlmIChyYykgeworCQluZXRpZl9lcnIoYWRhcHRlciwgaWZ1cCwgbmV0ZGV2LCAiQ2FuJ3Qgc2V0IG51bSB0eCBxdWV1ZXNcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBuZXRpZl9zZXRfcmVhbF9udW1fcnhfcXVldWVzKG5ldGRldiwgYWRhcHRlci0+bnVtX3F1ZXVlcyk7CisJaWYgKHJjKSB7CisJCW5ldGlmX2VycihhZGFwdGVyLCBpZnVwLCBuZXRkZXYsICJDYW4ndCBzZXQgbnVtIHJ4IHF1ZXVlc1xuIik7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IGVuYV91cChhZGFwdGVyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJldHVybiByYzsKK30KKworLyogZW5hX2Nsb3NlIC0gRGlzYWJsZXMgYSBuZXR3b3JrIGludGVyZmFjZQorICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgMCwgdGhpcyBpcyBub3QgYWxsb3dlZCB0byBmYWlsCisgKgorICogVGhlIGNsb3NlIGVudHJ5IHBvaW50IGlzIGNhbGxlZCB3aGVuIGFuIGludGVyZmFjZSBpcyBkZS1hY3RpdmF0ZWQKKyAqIGJ5IHRoZSBPUy4gIFRoZSBoYXJkd2FyZSBpcyBzdGlsbCB1bmRlciB0aGUgZHJpdmVycyBjb250cm9sLCBidXQKKyAqIG5lZWRzIHRvIGJlIGRpc2FibGVkLiAgQSBnbG9iYWwgTUFDIHJlc2V0IGlzIGlzc3VlZCB0byBzdG9wIHRoZQorICogaGFyZHdhcmUsIGFuZCBhbGwgdHJhbnNtaXQgYW5kIHJlY2VpdmUgcmVzb3VyY2VzIGFyZSBmcmVlZC4KKyAqLworc3RhdGljIGludCBlbmFfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJbmV0aWZfZGJnKGFkYXB0ZXIsIGlmZG93biwgbmV0ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKworCWlmICh0ZXN0X2JpdChFTkFfRkxBR19ERVZfVVAsICZhZGFwdGVyLT5mbGFncykpCisJCWVuYV9kb3duKGFkYXB0ZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV90eF9jc3VtKHN0cnVjdCBlbmFfY29tX3R4X2N0eCAqZW5hX3R4X2N0eCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1MzIgbXNzID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKKwlzdHJ1Y3QgZW5hX2NvbV90eF9tZXRhICplbmFfbWV0YSA9ICZlbmFfdHhfY3R4LT5lbmFfbWV0YTsKKwl1OCBsNF9wcm90b2NvbCA9IDA7CisKKwlpZiAoKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHx8IG1zcykgeworCQllbmFfdHhfY3R4LT5sNF9jc3VtX2VuYWJsZSA9IDE7CisJCWlmIChtc3MpIHsKKwkJCWVuYV90eF9jdHgtPnRzb19lbmFibGUgPSAxOworCQkJZW5hX21ldGEtPmw0X2hkcl9sZW4gPSB0Y3BfaGRyKHNrYiktPmRvZmY7CisJCQllbmFfdHhfY3R4LT5sNF9jc3VtX3BhcnRpYWwgPSAwOworCQl9IGVsc2UgeworCQkJZW5hX3R4X2N0eC0+dHNvX2VuYWJsZSA9IDA7CisJCQllbmFfbWV0YS0+bDRfaGRyX2xlbiA9IDA7CisJCQllbmFfdHhfY3R4LT5sNF9jc3VtX3BhcnRpYWwgPSAxOworCQl9CisKKwkJc3dpdGNoIChpcF9oZHIoc2tiKS0+dmVyc2lvbikgeworCQljYXNlIElQVkVSU0lPTjoKKwkJCWVuYV90eF9jdHgtPmwzX3Byb3RvID0gRU5BX0VUSF9JT19MM19QUk9UT19JUFY0OworCQkJaWYgKGlwX2hkcihza2IpLT5mcmFnX29mZiAmIGh0b25zKElQX0RGKSkKKwkJCQllbmFfdHhfY3R4LT5kZiA9IDE7CisJCQlpZiAobXNzKQorCQkJCWVuYV90eF9jdHgtPmwzX2NzdW1fZW5hYmxlID0gMTsKKwkJCWw0X3Byb3RvY29sID0gaXBfaGRyKHNrYiktPnByb3RvY29sOworCQkJYnJlYWs7CisJCWNhc2UgNjoKKwkJCWVuYV90eF9jdHgtPmwzX3Byb3RvID0gRU5BX0VUSF9JT19MM19QUk9UT19JUFY2OworCQkJbDRfcHJvdG9jb2wgPSBpcHY2X2hkcihza2IpLT5uZXh0aGRyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCWlmIChsNF9wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkKKwkJCWVuYV90eF9jdHgtPmw0X3Byb3RvID0gRU5BX0VUSF9JT19MNF9QUk9UT19UQ1A7CisJCWVsc2UKKwkJCWVuYV90eF9jdHgtPmw0X3Byb3RvID0gRU5BX0VUSF9JT19MNF9QUk9UT19VRFA7CisKKwkJZW5hX21ldGEtPm1zcyA9IG1zczsKKwkJZW5hX21ldGEtPmwzX2hkcl9sZW4gPSBza2JfbmV0d29ya19oZWFkZXJfbGVuKHNrYik7CisJCWVuYV9tZXRhLT5sM19oZHJfb2Zmc2V0ID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYik7CisJCWVuYV90eF9jdHgtPm1ldGFfdmFsaWQgPSAxOworCisJfSBlbHNlIHsKKwkJZW5hX3R4X2N0eC0+bWV0YV92YWxpZCA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IGVuYV9jaGVja19hbmRfbGluZWFyaXplX3NrYihzdHJ1Y3QgZW5hX3JpbmcgKnR4X3JpbmcsCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IG51bV9mcmFncywgaGVhZGVyX2xlbiwgcmM7CisKKwludW1fZnJhZ3MgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOworCWhlYWRlcl9sZW4gPSBza2JfaGVhZGxlbihza2IpOworCisJaWYgKG51bV9mcmFncyA8IHR4X3JpbmctPnNnbF9zaXplKQorCQlyZXR1cm4gMDsKKworCWlmICgobnVtX2ZyYWdzID09IHR4X3JpbmctPnNnbF9zaXplKSAmJgorCSAgICAoaGVhZGVyX2xlbiA8IHR4X3JpbmctPnR4X21heF9oZWFkZXJfc2l6ZSkpCisJCXJldHVybiAwOworCisJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmdHhfcmluZy0+c3luY3ApOworCXR4X3JpbmctPnR4X3N0YXRzLmxpbmVhcml6ZSsrOworCXU2NF9zdGF0c191cGRhdGVfZW5kKCZ0eF9yaW5nLT5zeW5jcCk7CisKKwlyYyA9IHNrYl9saW5lYXJpemUoc2tiKTsKKwlpZiAodW5saWtlbHkocmMpKSB7CisJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnR4X3JpbmctPnN5bmNwKTsKKwkJdHhfcmluZy0+dHhfc3RhdHMubGluZWFyaXplX2ZhaWxlZCsrOworCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmdHhfcmluZy0+c3luY3ApOworCX0KKworCXJldHVybiByYzsKK30KKworLyogQ2FsbGVkIHdpdGggbmV0aWZfdHhfbG9jay4gKi8KK3N0YXRpYyBuZXRkZXZfdHhfdCBlbmFfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGVuYV90eF9idWZmZXIgKnR4X2luZm87CisJc3RydWN0IGVuYV9jb21fdHhfY3R4IGVuYV90eF9jdHg7CisJc3RydWN0IGVuYV9yaW5nICp0eF9yaW5nOworCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cTsKKwlzdHJ1Y3QgZW5hX2NvbV9idWYgKmVuYV9idWY7CisJdm9pZCAqcHVzaF9oZHI7CisJdTMyIGxlbiwgbGFzdF9mcmFnOworCXUxNiBuZXh0X3RvX3VzZTsKKwl1MTYgcmVxX2lkOworCXUxNiBwdXNoX2xlbjsKKwl1MTYgaGVhZGVyX2xlbjsKKwlkbWFfYWRkcl90IGRtYTsKKwlpbnQgcWlkLCByYywgbmJfaHdfZGVzYzsKKwlpbnQgaSA9IC0xOworCisJbmV0aWZfZGJnKGFkYXB0ZXIsIHR4X3F1ZXVlZCwgZGV2LCAiJXMgc2tiICVwXG4iLCBfX2Z1bmNfXywgc2tiKTsKKwkvKiAgRGV0ZXJtaW5lIHdoaWNoIHR4IHJpbmcgd2Ugd2lsbCBiZSBwbGFjZWQgb24gKi8KKwlxaWQgPSBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKTsKKwl0eF9yaW5nID0gJmFkYXB0ZXItPnR4X3JpbmdbcWlkXTsKKwl0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKGRldiwgcWlkKTsKKworCXJjID0gZW5hX2NoZWNrX2FuZF9saW5lYXJpemVfc2tiKHR4X3JpbmcsIHNrYik7CisJaWYgKHVubGlrZWx5KHJjKSkKKwkJZ290byBlcnJvcl9kcm9wX3BhY2tldDsKKworCXNrYl90eF90aW1lc3RhbXAoc2tiKTsKKwlsZW4gPSBza2JfaGVhZGxlbihza2IpOworCisJbmV4dF90b191c2UgPSB0eF9yaW5nLT5uZXh0X3RvX3VzZTsKKwlyZXFfaWQgPSB0eF9yaW5nLT5mcmVlX3R4X2lkc1tuZXh0X3RvX3VzZV07CisJdHhfaW5mbyA9ICZ0eF9yaW5nLT50eF9idWZmZXJfaW5mb1tyZXFfaWRdOworCXR4X2luZm8tPm51bV9vZl9idWZzID0gMDsKKworCVdBUk4odHhfaW5mby0+c2tiLCAiU0tCIGlzbid0IE5VTEwgcmVxX2lkICVkXG4iLCByZXFfaWQpOworCWVuYV9idWYgPSB0eF9pbmZvLT5idWZzOworCXR4X2luZm8tPnNrYiA9IHNrYjsKKworCWlmICh0eF9yaW5nLT50eF9tZW1fcXVldWVfdHlwZSA9PSBFTkFfQURNSU5fUExBQ0VNRU5UX1BPTElDWV9ERVYpIHsKKwkJLyogcHJlcGFyZWQgdGhlIHB1c2ggYnVmZmVyICovCisJCXB1c2hfbGVuID0gbWluX3QodTMyLCBsZW4sIHR4X3JpbmctPnR4X21heF9oZWFkZXJfc2l6ZSk7CisJCWhlYWRlcl9sZW4gPSBwdXNoX2xlbjsKKwkJcHVzaF9oZHIgPSBza2ItPmRhdGE7CisJfSBlbHNlIHsKKwkJcHVzaF9sZW4gPSAwOworCQloZWFkZXJfbGVuID0gbWluX3QodTMyLCBsZW4sIHR4X3JpbmctPnR4X21heF9oZWFkZXJfc2l6ZSk7CisJCXB1c2hfaGRyID0gTlVMTDsKKwl9CisKKwluZXRpZl9kYmcoYWRhcHRlciwgdHhfcXVldWVkLCBkZXYsCisJCSAgInNrYjogJXAgaGVhZGVyX2J1Zi0+dmFkZHI6ICVwIHB1c2hfbGVuOiAlZFxuIiwgc2tiLAorCQkgIHB1c2hfaGRyLCBwdXNoX2xlbik7CisKKwlpZiAobGVuID4gcHVzaF9sZW4pIHsKKwkJZG1hID0gZG1hX21hcF9zaW5nbGUodHhfcmluZy0+ZGV2LCBza2ItPmRhdGEgKyBwdXNoX2xlbiwKKwkJCQkgICAgIGxlbiAtIHB1c2hfbGVuLCBETUFfVE9fREVWSUNFKTsKKwkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKHR4X3JpbmctPmRldiwgZG1hKSkKKwkJCWdvdG8gZXJyb3JfcmVwb3J0X2RtYV9lcnJvcjsKKworCQllbmFfYnVmLT5wYWRkciA9IGRtYTsKKwkJZW5hX2J1Zi0+bGVuID0gbGVuIC0gcHVzaF9sZW47CisKKwkJZW5hX2J1ZisrOworCQl0eF9pbmZvLT5udW1fb2ZfYnVmcysrOworCX0KKworCWxhc3RfZnJhZyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGFzdF9mcmFnOyBpKyspIHsKKwkJY29uc3Qgc2tiX2ZyYWdfdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOworCisJCWxlbiA9IHNrYl9mcmFnX3NpemUoZnJhZyk7CisJCWRtYSA9IHNrYl9mcmFnX2RtYV9tYXAodHhfcmluZy0+ZGV2LCBmcmFnLCAwLCBsZW4sCisJCQkJICAgICAgIERNQV9UT19ERVZJQ0UpOworCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IodHhfcmluZy0+ZGV2LCBkbWEpKQorCQkJZ290byBlcnJvcl9yZXBvcnRfZG1hX2Vycm9yOworCisJCWVuYV9idWYtPnBhZGRyID0gZG1hOworCQllbmFfYnVmLT5sZW4gPSBsZW47CisJCWVuYV9idWYrKzsKKwl9CisKKwl0eF9pbmZvLT5udW1fb2ZfYnVmcyArPSBsYXN0X2ZyYWc7CisKKwltZW1zZXQoJmVuYV90eF9jdHgsIDB4MCwgc2l6ZW9mKHN0cnVjdCBlbmFfY29tX3R4X2N0eCkpOworCWVuYV90eF9jdHguZW5hX2J1ZnMgPSB0eF9pbmZvLT5idWZzOworCWVuYV90eF9jdHgucHVzaF9oZWFkZXIgPSBwdXNoX2hkcjsKKwllbmFfdHhfY3R4Lm51bV9idWZzID0gdHhfaW5mby0+bnVtX29mX2J1ZnM7CisJZW5hX3R4X2N0eC5yZXFfaWQgPSByZXFfaWQ7CisJZW5hX3R4X2N0eC5oZWFkZXJfbGVuID0gaGVhZGVyX2xlbjsKKworCS8qIHNldCBmbGFncyBhbmQgbWV0YSBkYXRhICovCisJZW5hX3R4X2NzdW0oJmVuYV90eF9jdHgsIHNrYik7CisKKwkvKiBwcmVwYXJlIHRoZSBwYWNrZXQncyBkZXNjcmlwdG9ycyB0byBkbWEgZW5naW5lICovCisJcmMgPSBlbmFfY29tX3ByZXBhcmVfdHgodHhfcmluZy0+ZW5hX2NvbV9pb19zcSwgJmVuYV90eF9jdHgsCisJCQkJJm5iX2h3X2Rlc2MpOworCisJaWYgKHVubGlrZWx5KHJjKSkgeworCQluZXRpZl9lcnIoYWRhcHRlciwgdHhfcXVldWVkLCBkZXYsCisJCQkgICJmYWlsZWQgdG8gcHJlcGFyZSB0eCBidWZzXG4iKTsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmdHhfcmluZy0+c3luY3ApOworCQl0eF9yaW5nLT50eF9zdGF0cy5xdWV1ZV9zdG9wKys7CisJCXR4X3JpbmctPnR4X3N0YXRzLnByZXBhcmVfY3R4X2VycisrOworCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmdHhfcmluZy0+c3luY3ApOworCQluZXRpZl90eF9zdG9wX3F1ZXVlKHR4cSk7CisJCWdvdG8gZXJyb3JfdW5tYXBfZG1hOworCX0KKworCW5ldGRldl90eF9zZW50X3F1ZXVlKHR4cSwgc2tiLT5sZW4pOworCisJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmdHhfcmluZy0+c3luY3ApOworCXR4X3JpbmctPnR4X3N0YXRzLmNudCsrOworCXR4X3JpbmctPnR4X3N0YXRzLmJ5dGVzICs9IHNrYi0+bGVuOworCXU2NF9zdGF0c191cGRhdGVfZW5kKCZ0eF9yaW5nLT5zeW5jcCk7CisKKwl0eF9pbmZvLT50eF9kZXNjcyA9IG5iX2h3X2Rlc2M7CisJdHhfaW5mby0+bGFzdF9qaWZmaWVzID0gamlmZmllczsKKworCXR4X3JpbmctPm5leHRfdG9fdXNlID0gRU5BX1RYX1JJTkdfSURYX05FWFQobmV4dF90b191c2UsCisJCXR4X3JpbmctPnJpbmdfc2l6ZSk7CisKKwkvKiBUaGlzIFdNQiBpcyBhaW1lZCB0bzoKKwkgKiAxIC0gcGVyZm9ybSBzbXAgYmFycmllciBiZWZvcmUgcmVhZGluZyBuZXh0X3RvX2NvbXBsZXRpb24KKwkgKiAyIC0gbWFrZSBzdXJlIHRoZSBkZXNjIHdlcmUgd3JpdHRlbiBiZWZvcmUgdHJpZ2dlciBEQgorCSAqLworCXdtYigpOworCisJLyogc3RvcCB0aGUgcXVldWUgd2hlbiBubyBtb3JlIHNwYWNlIGF2YWlsYWJsZSwgdGhlIHBhY2tldCBjYW4gaGF2ZSB1cAorCSAqIHRvIHNnbF9zaXplICsgMi4gb25lIGZvciB0aGUgbWV0YSBkZXNjcmlwdG9yIGFuZCBvbmUgZm9yIGhlYWRlcgorCSAqIChpZiB0aGUgaGVhZGVyIGlzIGxhcmdlciB0aGFuIHR4X21heF9oZWFkZXJfc2l6ZSkuCisJICovCisJaWYgKHVubGlrZWx5KGVuYV9jb21fc3FfZW1wdHlfc3BhY2UodHhfcmluZy0+ZW5hX2NvbV9pb19zcSkgPAorCQkgICAgICh0eF9yaW5nLT5zZ2xfc2l6ZSArIDIpKSkgeworCQluZXRpZl9kYmcoYWRhcHRlciwgdHhfcXVldWVkLCBkZXYsICIlcyBzdG9wIHF1ZXVlICVkXG4iLAorCQkJICBfX2Z1bmNfXywgcWlkKTsKKworCQluZXRpZl90eF9zdG9wX3F1ZXVlKHR4cSk7CisJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnR4X3JpbmctPnN5bmNwKTsKKwkJdHhfcmluZy0+dHhfc3RhdHMucXVldWVfc3RvcCsrOworCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmdHhfcmluZy0+c3luY3ApOworCisJCS8qIFRoZXJlIGlzIGEgcmFyZSBjb25kaXRpb24gd2hlcmUgdGhpcyBmdW5jdGlvbiBkZWNpZGUgdG8KKwkJICogc3RvcCB0aGUgcXVldWUgYnV0IG1lYW53aGlsZSBjbGVhbl90eF9pcnEgdXBkYXRlcworCQkgKiBuZXh0X3RvX2NvbXBsZXRpb24gYW5kIHRlcm1pbmF0ZXMuCisJCSAqIFRoZSBxdWV1ZSB3aWxsIHJlbWFpbiBzdG9wcGVkIGZvcmV2ZXIuCisJCSAqIFRvIHNvbHZlIHRoaXMgaXNzdWUgdGhpcyBmdW5jdGlvbiBwZXJmb3JtIHJtYiwgY2hlY2sKKwkJICogdGhlIHdha2V1cCBjb25kaXRpb24gYW5kIHdha2UgdXAgdGhlIHF1ZXVlIGlmIG5lZWRlZC4KKwkJICovCisJCXNtcF9ybWIoKTsKKworCQlpZiAoZW5hX2NvbV9zcV9lbXB0eV9zcGFjZSh0eF9yaW5nLT5lbmFfY29tX2lvX3NxKQorCQkJCT4gRU5BX1RYX1dBS0VVUF9USFJFU0gpIHsKKwkJCW5ldGlmX3R4X3dha2VfcXVldWUodHhxKTsKKwkJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnR4X3JpbmctPnN5bmNwKTsKKwkJCXR4X3JpbmctPnR4X3N0YXRzLnF1ZXVlX3dha2V1cCsrOworCQkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnR4X3JpbmctPnN5bmNwKTsKKwkJfQorCX0KKworCWlmIChuZXRpZl94bWl0X3N0b3BwZWQodHhxKSB8fCAhc2tiLT54bWl0X21vcmUpIHsKKwkJLyogdHJpZ2dlciB0aGUgZG1hIGVuZ2luZSAqLworCQllbmFfY29tX3dyaXRlX3NxX2Rvb3JiZWxsKHR4X3JpbmctPmVuYV9jb21faW9fc3EpOworCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZ0eF9yaW5nLT5zeW5jcCk7CisJCXR4X3JpbmctPnR4X3N0YXRzLmRvb3JiZWxscysrOworCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmdHhfcmluZy0+c3luY3ApOworCX0KKworCXJldHVybiBORVRERVZfVFhfT0s7CisKK2Vycm9yX3JlcG9ydF9kbWFfZXJyb3I6CisJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmdHhfcmluZy0+c3luY3ApOworCXR4X3JpbmctPnR4X3N0YXRzLmRtYV9tYXBwaW5nX2VycisrOworCXU2NF9zdGF0c191cGRhdGVfZW5kKCZ0eF9yaW5nLT5zeW5jcCk7CisJbmV0ZGV2X3dhcm4oYWRhcHRlci0+bmV0ZGV2LCAiZmFpbGVkIHRvIG1hcCBza2JcbiIpOworCisJdHhfaW5mby0+c2tiID0gTlVMTDsKKworZXJyb3JfdW5tYXBfZG1hOgorCWlmIChpID49IDApIHsKKwkJLyogc2F2ZSB2YWx1ZSBvZiBmcmFnIHRoYXQgZmFpbGVkICovCisJCWxhc3RfZnJhZyA9IGk7CisKKwkJLyogc3RhcnQgYmFjayBhdCBiZWdpbm5pbmcgYW5kIHVubWFwIHNrYiAqLworCQl0eF9pbmZvLT5za2IgPSBOVUxMOworCQllbmFfYnVmID0gdHhfaW5mby0+YnVmczsKKwkJZG1hX3VubWFwX3NpbmdsZSh0eF9yaW5nLT5kZXYsIGRtYV91bm1hcF9hZGRyKGVuYV9idWYsIHBhZGRyKSwKKwkJCQkgZG1hX3VubWFwX2xlbihlbmFfYnVmLCBsZW4pLCBETUFfVE9fREVWSUNFKTsKKworCQkvKiB1bm1hcCByZW1haW5pbmcgbWFwcGVkIHBhZ2VzICovCisJCWZvciAoaSA9IDA7IGkgPCBsYXN0X2ZyYWc7IGkrKykgeworCQkJZW5hX2J1ZisrOworCQkJZG1hX3VubWFwX3BhZ2UodHhfcmluZy0+ZGV2LCBkbWFfdW5tYXBfYWRkcihlbmFfYnVmLCBwYWRkciksCisJCQkJICAgICAgIGRtYV91bm1hcF9sZW4oZW5hX2J1ZiwgbGVuKSwgRE1BX1RPX0RFVklDRSk7CisJCX0KKwl9CisKK2Vycm9yX2Ryb3BfcGFja2V0OgorCisJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgZW5hX25ldHBvbGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykKKwkJbmFwaV9zY2hlZHVsZSgmYWRhcHRlci0+ZW5hX25hcGlbaV0ubmFwaSk7Cit9CisjZW5kaWYgLyogQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgKi8KKworc3RhdGljIHUxNiBlbmFfc2VsZWN0X3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgdm9pZCAqYWNjZWxfcHJpdiwgc2VsZWN0X3F1ZXVlX2ZhbGxiYWNrX3QgZmFsbGJhY2spCit7CisJdTE2IHFpZDsKKwkvKiB3ZSBzdXNwZWN0IHRoYXQgdGhpcyBpcyBnb29kIGZvciBpbi0ta2VybmVsIG5ldHdvcmsgc2VydmljZXMgdGhhdAorCSAqIHdhbnQgdG8gbG9vcCBpbmNvbWluZyBza2IgcnggdG8gdHggaW4gbm9ybWFsIHVzZXIgZ2VuZXJhdGVkIHRyYWZmaWMsCisJICogbW9zdCBwcm9iYWJseSB3ZSB3aWxsIG5vdCBnZXQgdG8gdGhpcworCSAqLworCWlmIChza2JfcnhfcXVldWVfcmVjb3JkZWQoc2tiKSkKKwkJcWlkID0gc2tiX2dldF9yeF9xdWV1ZShza2IpOworCWVsc2UKKwkJcWlkID0gZmFsbGJhY2soZGV2LCBza2IpOworCisJcmV0dXJuIHFpZDsKK30KKworc3RhdGljIHZvaWQgZW5hX2NvbmZpZ19ob3N0X2luZm8oc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXN0cnVjdCBlbmFfYWRtaW5faG9zdF9pbmZvICpob3N0X2luZm87CisJaW50IHJjOworCisJLyogQWxsb2NhdGUgb25seSB0aGUgaG9zdCBpbmZvICovCisJcmMgPSBlbmFfY29tX2FsbG9jYXRlX2hvc3RfaW5mbyhlbmFfZGV2KTsKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCJDYW5ub3QgYWxsb2NhdGUgaG9zdCBpbmZvXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWhvc3RfaW5mbyA9IGVuYV9kZXYtPmhvc3RfYXR0ci5ob3N0X2luZm87CisKKwlob3N0X2luZm8tPm9zX3R5cGUgPSBFTkFfQURNSU5fT1NfTElOVVg7CisJaG9zdF9pbmZvLT5rZXJuZWxfdmVyID0gTElOVVhfVkVSU0lPTl9DT0RFOworCXN0cm5jcHkoaG9zdF9pbmZvLT5rZXJuZWxfdmVyX3N0ciwgdXRzbmFtZSgpLT52ZXJzaW9uLAorCQlzaXplb2YoaG9zdF9pbmZvLT5rZXJuZWxfdmVyX3N0cikgLSAxKTsKKwlob3N0X2luZm8tPm9zX2Rpc3QgPSAwOworCXN0cm5jcHkoaG9zdF9pbmZvLT5vc19kaXN0X3N0ciwgdXRzbmFtZSgpLT5yZWxlYXNlLAorCQlzaXplb2YoaG9zdF9pbmZvLT5vc19kaXN0X3N0cikgLSAxKTsKKwlob3N0X2luZm8tPmRyaXZlcl92ZXJzaW9uID0KKwkJKERSVl9NT0RVTEVfVkVSX01BSk9SKSB8CisJCShEUlZfTU9EVUxFX1ZFUl9NSU5PUiA8PCBFTkFfQURNSU5fSE9TVF9JTkZPX01JTk9SX1NISUZUKSB8CisJCShEUlZfTU9EVUxFX1ZFUl9TVUJNSU5PUiA8PCBFTkFfQURNSU5fSE9TVF9JTkZPX1NVQl9NSU5PUl9TSElGVCk7CisKKwlyYyA9IGVuYV9jb21fc2V0X2hvc3RfYXR0cmlidXRlcyhlbmFfZGV2KTsKKwlpZiAocmMpIHsKKwkJaWYgKHJjID09IC1FUEVSTSkKKwkJCXByX3dhcm4oIkNhbm5vdCBzZXQgaG9zdCBhdHRyaWJ1dGVzXG4iKTsKKwkJZWxzZQorCQkJcHJfZXJyKCJDYW5ub3Qgc2V0IGhvc3QgYXR0cmlidXRlc1xuIik7CisKKwkJZ290byBlcnI7CisJfQorCisJcmV0dXJuOworCitlcnI6CisJZW5hX2NvbV9kZWxldGVfaG9zdF9pbmZvKGVuYV9kZXYpOworfQorCitzdGF0aWMgdm9pZCBlbmFfY29uZmlnX2RlYnVnX2FyZWEoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCXUzMiBkZWJ1Z19hcmVhX3NpemU7CisJaW50IHJjLCBzc19jb3VudDsKKworCXNzX2NvdW50ID0gZW5hX2dldF9zc2V0X2NvdW50KGFkYXB0ZXItPm5ldGRldiwgRVRIX1NTX1NUQVRTKTsKKwlpZiAoc3NfY291bnQgPD0gMCkgeworCQluZXRpZl9lcnIoYWRhcHRlciwgZHJ2LCBhZGFwdGVyLT5uZXRkZXYsCisJCQkgICJTUyBjb3VudCBpcyBuZWdhdGl2ZVxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBhbGxvY2F0ZSAzMiBieXRlcyBmb3IgZWFjaCBzdHJpbmcgYW5kIDY0Yml0IGZvciB0aGUgdmFsdWUgKi8KKwlkZWJ1Z19hcmVhX3NpemUgPSBzc19jb3VudCAqIEVUSF9HU1RSSU5HX0xFTiArIHNpemVvZih1NjQpICogc3NfY291bnQ7CisKKwlyYyA9IGVuYV9jb21fYWxsb2NhdGVfZGVidWdfYXJlYShhZGFwdGVyLT5lbmFfZGV2LCBkZWJ1Z19hcmVhX3NpemUpOworCWlmIChyYykgeworCQlwcl9lcnIoIkNhbm5vdCBhbGxvY2F0ZSBkZWJ1ZyBhcmVhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXJjID0gZW5hX2NvbV9zZXRfaG9zdF9hdHRyaWJ1dGVzKGFkYXB0ZXItPmVuYV9kZXYpOworCWlmIChyYykgeworCQlpZiAocmMgPT0gLUVQRVJNKQorCQkJbmV0aWZfd2FybihhZGFwdGVyLCBkcnYsIGFkYXB0ZXItPm5ldGRldiwKKwkJCQkgICAiQ2Fubm90IHNldCBob3N0IGF0dHJpYnV0ZXNcbiIpOworCQllbHNlCisJCQluZXRpZl9lcnIoYWRhcHRlciwgZHJ2LCBhZGFwdGVyLT5uZXRkZXYsCisJCQkJICAiQ2Fubm90IHNldCBob3N0IGF0dHJpYnV0ZXNcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXR1cm47CitlcnI6CisJZW5hX2NvbV9kZWxldGVfZGVidWdfYXJlYShhZGFwdGVyLT5lbmFfZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqZW5hX2dldF9zdGF0czY0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJCQkgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpzdGF0cykKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBlbmFfYWRtaW5fYmFzaWNfc3RhdHMgZW5hX3N0YXRzOworCWludCByYzsKKworCWlmICghdGVzdF9iaXQoRU5BX0ZMQUdfREVWX1VQLCAmYWRhcHRlci0+ZmxhZ3MpKQorCQlyZXR1cm4gTlVMTDsKKworCXJjID0gZW5hX2NvbV9nZXRfZGV2X2Jhc2ljX3N0YXRzKGFkYXB0ZXItPmVuYV9kZXYsICZlbmFfc3RhdHMpOworCWlmIChyYykKKwkJcmV0dXJuIE5VTEw7CisKKwlzdGF0cy0+dHhfYnl0ZXMgPSAoKHU2NCllbmFfc3RhdHMudHhfYnl0ZXNfaGlnaCA8PCAzMikgfAorCQllbmFfc3RhdHMudHhfYnl0ZXNfbG93OworCXN0YXRzLT5yeF9ieXRlcyA9ICgodTY0KWVuYV9zdGF0cy5yeF9ieXRlc19oaWdoIDw8IDMyKSB8CisJCWVuYV9zdGF0cy5yeF9ieXRlc19sb3c7CisKKwlzdGF0cy0+cnhfcGFja2V0cyA9ICgodTY0KWVuYV9zdGF0cy5yeF9wa3RzX2hpZ2ggPDwgMzIpIHwKKwkJZW5hX3N0YXRzLnJ4X3BrdHNfbG93OworCXN0YXRzLT50eF9wYWNrZXRzID0gKCh1NjQpZW5hX3N0YXRzLnR4X3BrdHNfaGlnaCA8PCAzMikgfAorCQllbmFfc3RhdHMudHhfcGt0c19sb3c7CisKKwlzdGF0cy0+cnhfZHJvcHBlZCA9ICgodTY0KWVuYV9zdGF0cy5yeF9kcm9wc19oaWdoIDw8IDMyKSB8CisJCWVuYV9zdGF0cy5yeF9kcm9wc19sb3c7CisKKwlzdGF0cy0+bXVsdGljYXN0ID0gMDsKKwlzdGF0cy0+Y29sbGlzaW9ucyA9IDA7CisKKwlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycyA9IDA7CisJc3RhdHMtPnJ4X2NyY19lcnJvcnMgPSAwOworCXN0YXRzLT5yeF9mcmFtZV9lcnJvcnMgPSAwOworCXN0YXRzLT5yeF9maWZvX2Vycm9ycyA9IDA7CisJc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnMgPSAwOworCXN0YXRzLT50eF93aW5kb3dfZXJyb3JzID0gMDsKKworCXN0YXRzLT5yeF9lcnJvcnMgPSAwOworCXN0YXRzLT50eF9lcnJvcnMgPSAwOworCisJcmV0dXJuIHN0YXRzOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGVuYV9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBlbmFfb3BlbiwKKwkubmRvX3N0b3AJCT0gZW5hX2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBlbmFfc3RhcnRfeG1pdCwKKwkubmRvX3NlbGVjdF9xdWV1ZQk9IGVuYV9zZWxlY3RfcXVldWUsCisJLm5kb19nZXRfc3RhdHM2NAk9IGVuYV9nZXRfc3RhdHM2NCwKKwkubmRvX3R4X3RpbWVvdXQJCT0gZW5hX3R4X3RpbWVvdXQsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGVuYV9jaGFuZ2VfbXR1LAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gTlVMTCwKKwkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gZW5hX25ldHBvbGwsCisjZW5kaWYgLyogQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgKi8KK307CisKK3N0YXRpYyB2b2lkIGVuYV9kZXZpY2VfaW9fc3VzcGVuZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBlbmFfYWRhcHRlciwgc3VzcGVuZF9pb190YXNrKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCisJLyogZW5hX25hcGlfZGlzYWJsZV9hbGwgZGlzYWJsZXMgb25seSB0aGUgSU8gaGFuZGxpbmcuCisJICogV2UgYXJlIHN0aWxsIHN1YmplY3QgdG8gQUVOUSBrZWVwIGFsaXZlIHdhdGNoZG9nLgorCSAqLworCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJmFkYXB0ZXItPnN5bmNwKTsKKwlhZGFwdGVyLT5kZXZfc3RhdHMuaW9fc3VzcGVuZCsrOworCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJmFkYXB0ZXItPnN5bmNwKTsKKwllbmFfbmFwaV9kaXNhYmxlX2FsbChhZGFwdGVyKTsKKwluZXRpZl90eF9sb2NrKG5ldGRldik7CisJbmV0aWZfZGV2aWNlX2RldGFjaChuZXRkZXYpOworCW5ldGlmX3R4X3VubG9jayhuZXRkZXYpOworfQorCitzdGF0aWMgdm9pZCBlbmFfZGV2aWNlX2lvX3Jlc3VtZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBlbmFfYWRhcHRlciwgcmVzdW1lX2lvX3Rhc2spOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisKKwl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZhZGFwdGVyLT5zeW5jcCk7CisJYWRhcHRlci0+ZGV2X3N0YXRzLmlvX3Jlc3VtZSsrOworCXU2NF9zdGF0c191cGRhdGVfZW5kKCZhZGFwdGVyLT5zeW5jcCk7CisKKwluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldGRldik7CisJZW5hX25hcGlfZW5hYmxlX2FsbChhZGFwdGVyKTsKK30KKworc3RhdGljIGludCBlbmFfZGV2aWNlX3ZhbGlkYXRlX3BhcmFtcyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJICAgICAgc3RydWN0IGVuYV9jb21fZGV2X2dldF9mZWF0dXJlc19jdHggKmdldF9mZWF0X2N0eCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCWludCByYzsKKworCXJjID0gZXRoZXJfYWRkcl9lcXVhbChnZXRfZmVhdF9jdHgtPmRldl9hdHRyLm1hY19hZGRyLAorCQkJICAgICAgYWRhcHRlci0+bWFjX2FkZHIpOworCWlmICghcmMpIHsKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIGRydiwgbmV0ZGV2LAorCQkJICAiRXJyb3IsIG1hYyBhZGRyZXNzIGFyZSBkaWZmZXJlbnRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKGdldF9mZWF0X2N0eC0+bWF4X3F1ZXVlcy5tYXhfY3FfbnVtIDwgYWRhcHRlci0+bnVtX3F1ZXVlcykgfHwKKwkgICAgKGdldF9mZWF0X2N0eC0+bWF4X3F1ZXVlcy5tYXhfc3FfbnVtIDwgYWRhcHRlci0+bnVtX3F1ZXVlcykpIHsKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIGRydiwgbmV0ZGV2LAorCQkJICAiRXJyb3IsIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgZW5vdWdoIHF1ZXVlc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChnZXRfZmVhdF9jdHgtPmRldl9hdHRyLm1heF9tdHUgPCBuZXRkZXYtPm10dSkgeworCQluZXRpZl9lcnIoYWRhcHRlciwgZHJ2LCBuZXRkZXYsCisJCQkgICJFcnJvciwgZGV2aWNlIG1heCBtdHUgaXMgc21hbGxlciB0aGFuIG5ldGRldiBNVFVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmFfZGV2aWNlX2luaXQoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCSAgIHN0cnVjdCBlbmFfY29tX2Rldl9nZXRfZmVhdHVyZXNfY3R4ICpnZXRfZmVhdF9jdHgsCisJCQkgICBib29sICp3ZF9zdGF0ZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCWJvb2wgcmVhZGxlc3Nfc3VwcG9ydGVkOworCXUzMiBhZW5xX2dyb3VwczsKKwlpbnQgZG1hX3dpZHRoOworCWludCByYzsKKworCXJjID0gZW5hX2NvbV9tbWlvX3JlZ19yZWFkX3JlcXVlc3RfaW5pdChlbmFfZGV2KTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gaW5pdCBtbWlvIHJlYWQgbGVzc1xuIik7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBUaGUgUENJZSBjb25maWd1cmF0aW9uIHNwYWNlIHJldmlzaW9uIGlkIGluZGljYXRlIGlmIG1taW8gcmVnCisJICogcmVhZCBpcyBkaXNhYmxlZAorCSAqLworCXJlYWRsZXNzX3N1cHBvcnRlZCA9ICEocGRldi0+cmV2aXNpb24gJiBFTkFfTU1JT19ESVNBQkxFX1JFR19SRUFEKTsKKwllbmFfY29tX3NldF9tbWlvX3JlYWRfbW9kZShlbmFfZGV2LCByZWFkbGVzc19zdXBwb3J0ZWQpOworCisJcmMgPSBlbmFfY29tX2Rldl9yZXNldChlbmFfZGV2KTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycihkZXYsICJDYW4gbm90IHJlc2V0IGRldmljZVxuIik7CisJCWdvdG8gZXJyX21taW9fcmVhZF9sZXNzOworCX0KKworCXJjID0gZW5hX2NvbV92YWxpZGF0ZV92ZXJzaW9uKGVuYV9kZXYpOworCWlmIChyYykgeworCQlkZXZfZXJyKGRldiwgImRldmljZSB2ZXJzaW9uIGlzIHRvbyBsb3dcbiIpOworCQlnb3RvIGVycl9tbWlvX3JlYWRfbGVzczsKKwl9CisKKwlkbWFfd2lkdGggPSBlbmFfY29tX2dldF9kbWFfd2lkdGgoZW5hX2Rldik7CisJaWYgKGRtYV93aWR0aCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJJbnZhbGlkIGRtYSB3aWR0aCB2YWx1ZSAlZCIsIGRtYV93aWR0aCk7CisJCXJjID0gZG1hX3dpZHRoOworCQlnb3RvIGVycl9tbWlvX3JlYWRfbGVzczsKKwl9CisKKwlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKGRtYV93aWR0aCkpOworCWlmIChyYykgeworCQlkZXZfZXJyKGRldiwgInBjaV9zZXRfZG1hX21hc2sgZmFpbGVkIDB4JXhcbiIsIHJjKTsKKwkJZ290byBlcnJfbW1pb19yZWFkX2xlc3M7CisJfQorCisJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKGRtYV93aWR0aCkpOworCWlmIChyYykgeworCQlkZXZfZXJyKGRldiwgImVycl9wY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2sgZmFpbGVkIDB4JXhcbiIsCisJCQlyYyk7CisJCWdvdG8gZXJyX21taW9fcmVhZF9sZXNzOworCX0KKworCS8qIEVOQSBhZG1pbiBsZXZlbCBpbml0ICovCisJcmMgPSBlbmFfY29tX2FkbWluX2luaXQoZW5hX2RldiwgJmFlbnFfaGFuZGxlcnMsIHRydWUpOworCWlmIChyYykgeworCQlkZXZfZXJyKGRldiwKKwkJCSJDYW4gbm90IGluaXRpYWxpemUgZW5hIGFkbWluIHF1ZXVlIHdpdGggZGV2aWNlXG4iKTsKKwkJZ290byBlcnJfbW1pb19yZWFkX2xlc3M7CisJfQorCisJLyogVG8gZW5hYmxlIHRoZSBtc2l4IGludGVycnVwdHMgdGhlIGRyaXZlciBuZWVkcyB0byBrbm93IHRoZSBudW1iZXIKKwkgKiBvZiBxdWV1ZXMuIFNvIHRoZSBkcml2ZXIgdXNlcyBwb2xsaW5nIG1vZGUgdG8gcmV0cmlldmUgdGhpcworCSAqIGluZm9ybWF0aW9uCisJICovCisJZW5hX2NvbV9zZXRfYWRtaW5fcG9sbGluZ19tb2RlKGVuYV9kZXYsIHRydWUpOworCisJLyogR2V0IERldmljZSBBdHRyaWJ1dGVzKi8KKwlyYyA9IGVuYV9jb21fZ2V0X2Rldl9hdHRyX2ZlYXQoZW5hX2RldiwgZ2V0X2ZlYXRfY3R4KTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycihkZXYsICJDYW5ub3QgZ2V0IGF0dHJpYnV0ZSBmb3IgZW5hIGRldmljZSByYz0lZFxuIiwgcmMpOworCQlnb3RvIGVycl9hZG1pbl9pbml0OworCX0KKworCS8qIFRyeSB0byB0dXJuIGFsbCB0aGUgYXZhaWxhYmxlIGFlbnEgZ3JvdXBzICovCisJYWVucV9ncm91cHMgPSBCSVQoRU5BX0FETUlOX0xJTktfQ0hBTkdFKSB8CisJCUJJVChFTkFfQURNSU5fRkFUQUxfRVJST1IpIHwKKwkJQklUKEVOQV9BRE1JTl9XQVJOSU5HKSB8CisJCUJJVChFTkFfQURNSU5fTk9USUZJQ0FUSU9OKSB8CisJCUJJVChFTkFfQURNSU5fS0VFUF9BTElWRSk7CisKKwlhZW5xX2dyb3VwcyAmPSBnZXRfZmVhdF9jdHgtPmFlbnEuc3VwcG9ydGVkX2dyb3VwczsKKworCXJjID0gZW5hX2NvbV9zZXRfYWVucV9jb25maWcoZW5hX2RldiwgYWVucV9ncm91cHMpOworCWlmIChyYykgeworCQlkZXZfZXJyKGRldiwgIkNhbm5vdCBjb25maWd1cmUgYWVucSBncm91cHMgcmM9ICVkXG4iLCByYyk7CisJCWdvdG8gZXJyX2FkbWluX2luaXQ7CisJfQorCisJKndkX3N0YXRlID0gISEoYWVucV9ncm91cHMgJiBCSVQoRU5BX0FETUlOX0tFRVBfQUxJVkUpKTsKKworCWVuYV9jb25maWdfaG9zdF9pbmZvKGVuYV9kZXYpOworCisJcmV0dXJuIDA7CisKK2Vycl9hZG1pbl9pbml0OgorCWVuYV9jb21fYWRtaW5fZGVzdHJveShlbmFfZGV2KTsKK2Vycl9tbWlvX3JlYWRfbGVzczoKKwllbmFfY29tX21taW9fcmVnX3JlYWRfcmVxdWVzdF9kZXN0cm95KGVuYV9kZXYpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGVuYV9lbmFibGVfbXNpeF9hbmRfc2V0X2FkbWluX2ludGVycnVwdHMoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyLAorCQkJCQkJICAgIGludCBpb192ZWN0b3JzKQoreworCXN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiA9IGFkYXB0ZXItPmVuYV9kZXY7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmFkYXB0ZXItPnBkZXYtPmRldjsKKwlpbnQgcmM7CisKKwlyYyA9IGVuYV9lbmFibGVfbXNpeChhZGFwdGVyLCBpb192ZWN0b3JzKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycihkZXYsICJDYW4gbm90IHJlc2VydmUgbXNpeCB2ZWN0b3JzXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWVuYV9zZXR1cF9tZ21udF9pbnRyKGFkYXB0ZXIpOworCisJcmMgPSBlbmFfcmVxdWVzdF9tZ21udF9pcnEoYWRhcHRlcik7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoZGV2LCAiQ2FuIG5vdCBzZXR1cCBtYW5hZ2VtZW50IGludGVycnVwdHNcbiIpOworCQlnb3RvIGVycl9kaXNhYmxlX21zaXg7CisJfQorCisJZW5hX2NvbV9zZXRfYWRtaW5fcG9sbGluZ19tb2RlKGVuYV9kZXYsIGZhbHNlKTsKKworCWVuYV9jb21fYWRtaW5fYWVucV9lbmFibGUoZW5hX2Rldik7CisKKwlyZXR1cm4gMDsKKworZXJyX2Rpc2FibGVfbXNpeDoKKwllbmFfZGlzYWJsZV9tc2l4KGFkYXB0ZXIpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBlbmFfZndfcmVzZXRfZGV2aWNlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9kZXZfZ2V0X2ZlYXR1cmVzX2N0eCBnZXRfZmVhdF9jdHg7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBlbmFfYWRhcHRlciwgcmVzZXRfdGFzayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwlzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYgPSBhZGFwdGVyLT5lbmFfZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKwlib29sIGRldl91cCwgd2Rfc3RhdGU7CisJaW50IHJjOworCisJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPnRpbWVyX3NlcnZpY2UpOworCisJcnRubF9sb2NrKCk7CisKKwlkZXZfdXAgPSB0ZXN0X2JpdChFTkFfRkxBR19ERVZfVVAsICZhZGFwdGVyLT5mbGFncyk7CisJZW5hX2NvbV9zZXRfYWRtaW5fcnVubmluZ19zdGF0ZShlbmFfZGV2LCBmYWxzZSk7CisKKwkvKiBBZnRlciBjYWxsaW5nIGVuYV9jbG9zZSB0aGUgdHggcXVldWVzIGFuZCB0aGUgbmFwaQorCSAqIGFyZSBkaXNhYmxlZCBzbyBubyBvbmUgY2FuIGludGVyZmVyZSBvciB0b3VjaCB0aGUKKwkgKiBkYXRhIHN0cnVjdHVyZXMKKwkgKi8KKwllbmFfY2xvc2UobmV0ZGV2KTsKKworCXJjID0gZW5hX2NvbV9kZXZfcmVzZXQoZW5hX2Rldik7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkRldmljZSByZXNldCBmYWlsZWRcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwllbmFfZnJlZV9tZ21udF9pcnEoYWRhcHRlcik7CisKKwllbmFfZGlzYWJsZV9tc2l4KGFkYXB0ZXIpOworCisJZW5hX2NvbV9hYm9ydF9hZG1pbl9jb21tYW5kcyhlbmFfZGV2KTsKKworCWVuYV9jb21fd2FpdF9mb3JfYWJvcnRfY29tcGxldGlvbihlbmFfZGV2KTsKKworCWVuYV9jb21fYWRtaW5fZGVzdHJveShlbmFfZGV2KTsKKworCWVuYV9jb21fbW1pb19yZWdfcmVhZF9yZXF1ZXN0X2Rlc3Ryb3koZW5hX2Rldik7CisKKwkvKiBGaW5pc2ggd2l0aCB0aGUgZGVzdHJveSBwYXJ0LiBTdGFydCB0aGUgaW5pdCBwYXJ0ICovCisKKwlyYyA9IGVuYV9kZXZpY2VfaW5pdChlbmFfZGV2LCBhZGFwdGVyLT5wZGV2LCAmZ2V0X2ZlYXRfY3R4LCAmd2Rfc3RhdGUpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4gbm90IGluaXRpYWxpemUgZGV2aWNlXG4iKTsKKwkJZ290byBlcnI7CisJfQorCWFkYXB0ZXItPndkX3N0YXRlID0gd2Rfc3RhdGU7CisKKwlyYyA9IGVuYV9kZXZpY2VfdmFsaWRhdGVfcGFyYW1zKGFkYXB0ZXIsICZnZXRfZmVhdF9jdHgpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJWYWxpZGF0aW9uIG9mIGRldmljZSBwYXJhbWV0ZXJzIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2RldmljZV9kZXN0cm95OworCX0KKworCXJjID0gZW5hX2VuYWJsZV9tc2l4X2FuZF9zZXRfYWRtaW5faW50ZXJydXB0cyhhZGFwdGVyLAorCQkJCQkJICAgICAgYWRhcHRlci0+bnVtX3F1ZXVlcyk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkVuYWJsZSBNU0ktWCBmYWlsZWRcbiIpOworCQlnb3RvIGVycl9kZXZpY2VfZGVzdHJveTsKKwl9CisJLyogSWYgdGhlIGludGVyZmFjZSB3YXMgdXAgYmVmb3JlIHRoZSByZXNldCBicmluZyBpdCB1cCAqLworCWlmIChkZXZfdXApIHsKKwkJcmMgPSBlbmFfdXAoYWRhcHRlcik7CisJCWlmIChyYykgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBJL08gcXVldWVzXG4iKTsKKwkJCWdvdG8gZXJyX2Rpc2FibGVfbXNpeDsKKwkJfQorCX0KKworCW1vZF90aW1lcigmYWRhcHRlci0+dGltZXJfc2VydmljZSwgcm91bmRfamlmZmllcyhqaWZmaWVzICsgSFopKTsKKworCXJ0bmxfdW5sb2NrKCk7CisKKwlkZXZfZXJyKCZwZGV2LT5kZXYsICJEZXZpY2UgcmVzZXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseVxuIik7CisKKwlyZXR1cm47CitlcnJfZGlzYWJsZV9tc2l4OgorCWVuYV9mcmVlX21nbW50X2lycShhZGFwdGVyKTsKKwllbmFfZGlzYWJsZV9tc2l4KGFkYXB0ZXIpOworZXJyX2RldmljZV9kZXN0cm95OgorCWVuYV9jb21fYWRtaW5fZGVzdHJveShlbmFfZGV2KTsKK2VycjoKKwlydG5sX3VubG9jaygpOworCisJZGV2X2VycigmcGRldi0+ZGV2LAorCQkiUmVzZXQgYXR0ZW1wdCBmYWlsZWQuIENhbiBub3QgcmVzZXQgdGhlIGRldmljZVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2Zvcl9taXNzaW5nX3R4X2NvbXBsZXRpb25zKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgZW5hX3R4X2J1ZmZlciAqdHhfYnVmOworCXVuc2lnbmVkIGxvbmcgbGFzdF9qaWZmaWVzOworCXN0cnVjdCBlbmFfcmluZyAqdHhfcmluZzsKKwlpbnQgaSwgaiwgYnVkZ2V0OworCXUzMiBtaXNzZWRfdHg7CisKKwkvKiBNYWtlIHN1cmUgdGhlIGRyaXZlciBkb2Vzbid0IHR1cm4gdGhlIGRldmljZSBpbiBvdGhlciBwcm9jZXNzICovCisJc21wX3JtYigpOworCisJaWYgKCF0ZXN0X2JpdChFTkFfRkxBR19ERVZfVVAsICZhZGFwdGVyLT5mbGFncykpCisJCXJldHVybjsKKworCWJ1ZGdldCA9IEVOQV9NT05JVE9SRURfVFhfUVVFVUVTOworCisJZm9yIChpID0gYWRhcHRlci0+bGFzdF9tb25pdG9yZWRfdHhfcWlkOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKSB7CisJCXR4X3JpbmcgPSAmYWRhcHRlci0+dHhfcmluZ1tpXTsKKworCQlmb3IgKGogPSAwOyBqIDwgdHhfcmluZy0+cmluZ19zaXplOyBqKyspIHsKKwkJCXR4X2J1ZiA9ICZ0eF9yaW5nLT50eF9idWZmZXJfaW5mb1tqXTsKKwkJCWxhc3RfamlmZmllcyA9IHR4X2J1Zi0+bGFzdF9qaWZmaWVzOworCQkJaWYgKHVubGlrZWx5KGxhc3RfamlmZmllcyAmJiB0aW1lX2lzX2JlZm9yZV9qaWZmaWVzKGxhc3RfamlmZmllcyArIFRYX1RJTUVPVVQpKSkgeworCQkJCW5ldGlmX25vdGljZShhZGFwdGVyLCB0eF9lcnIsIGFkYXB0ZXItPm5ldGRldiwKKwkJCQkJICAgICAiRm91bmQgYSBUeCB0aGF0IHdhc24ndCBjb21wbGV0ZWQgb24gdGltZSwgcWlkICVkLCBpbmRleCAlZC5cbiIsCisJCQkJCSAgICAgdHhfcmluZy0+cWlkLCBqKTsKKworCQkJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnR4X3JpbmctPnN5bmNwKTsKKwkJCQltaXNzZWRfdHggPSB0eF9yaW5nLT50eF9zdGF0cy5taXNzaW5nX3R4X2NvbXArKzsKKwkJCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmdHhfcmluZy0+c3luY3ApOworCisJCQkJLyogQ2xlYXIgbGFzdCBqaWZmaWVzIHNvIHRoZSBsb3N0IGJ1ZmZlciB3b24ndAorCQkJCSAqIGJlIGNvdW50ZWQgdHdpY2UuCisJCQkJICovCisJCQkJdHhfYnVmLT5sYXN0X2ppZmZpZXMgPSAwOworCisJCQkJaWYgKHVubGlrZWx5KG1pc3NlZF90eCA+IE1BWF9OVU1fT0ZfVElNRU9VVEVEX1BBQ0tFVFMpKSB7CisJCQkJCW5ldGlmX2VycihhZGFwdGVyLCB0eF9lcnIsIGFkYXB0ZXItPm5ldGRldiwKKwkJCQkJCSAgIlRoZSBudW1iZXIgb2YgbG9zdCB0eCBjb21wbGV0aW9uIGlzIGFib3ZlIHRoZSB0aHJlc2hvbGQgKCVkID4gJWQpLiBSZXNldCB0aGUgZGV2aWNlXG4iLAorCQkJCQkJICBtaXNzZWRfdHgsIE1BWF9OVU1fT0ZfVElNRU9VVEVEX1BBQ0tFVFMpOworCQkJCQlzZXRfYml0KEVOQV9GTEFHX1RSSUdHRVJfUkVTRVQsICZhZGFwdGVyLT5mbGFncyk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJYnVkZ2V0LS07CisJCWlmICghYnVkZ2V0KQorCQkJYnJlYWs7CisJfQorCisJYWRhcHRlci0+bGFzdF9tb25pdG9yZWRfdHhfcWlkID0gaSAlIGFkYXB0ZXItPm51bV9xdWV1ZXM7Cit9CisKKy8qIENoZWNrIGZvciBrZWVwIGFsaXZlIGV4cGlyYXRpb24gKi8KK3N0YXRpYyB2b2lkIGNoZWNrX2Zvcl9taXNzaW5nX2tlZXBfYWxpdmUoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCXVuc2lnbmVkIGxvbmcga2VlcF9hbGl2ZV9leHBpcmVkOworCisJaWYgKCFhZGFwdGVyLT53ZF9zdGF0ZSkKKwkJcmV0dXJuOworCisJa2VlcF9hbGl2ZV9leHBpcmVkID0gcm91bmRfamlmZmllcyhhZGFwdGVyLT5sYXN0X2tlZXBfYWxpdmVfamlmZmllcworCQkJCQkgICArIEVOQV9ERVZJQ0VfS0FMSVZFX1RJTUVPVVQpOworCWlmICh1bmxpa2VseSh0aW1lX2lzX2JlZm9yZV9qaWZmaWVzKGtlZXBfYWxpdmVfZXhwaXJlZCkpKSB7CisJCW5ldGlmX2VycihhZGFwdGVyLCBkcnYsIGFkYXB0ZXItPm5ldGRldiwKKwkJCSAgIktlZXAgYWxpdmUgd2F0Y2hkb2cgdGltZW91dC5cbiIpOworCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZhZGFwdGVyLT5zeW5jcCk7CisJCWFkYXB0ZXItPmRldl9zdGF0cy53ZF9leHBpcmVkKys7CisJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZhZGFwdGVyLT5zeW5jcCk7CisJCXNldF9iaXQoRU5BX0ZMQUdfVFJJR0dFUl9SRVNFVCwgJmFkYXB0ZXItPmZsYWdzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2Zvcl9hZG1pbl9jb21fc3RhdGUoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCWlmICh1bmxpa2VseSghZW5hX2NvbV9nZXRfYWRtaW5fcnVubmluZ19zdGF0ZShhZGFwdGVyLT5lbmFfZGV2KSkpIHsKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIGRydiwgYWRhcHRlci0+bmV0ZGV2LAorCQkJICAiRU5BIGFkbWluIHF1ZXVlIGlzIG5vdCBpbiBydW5uaW5nIHN0YXRlIVxuIik7CisJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJmFkYXB0ZXItPnN5bmNwKTsKKwkJYWRhcHRlci0+ZGV2X3N0YXRzLmFkbWluX3FfcGF1c2UrKzsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJmFkYXB0ZXItPnN5bmNwKTsKKwkJc2V0X2JpdChFTkFfRkxBR19UUklHR0VSX1JFU0VULCAmYWRhcHRlci0+ZmxhZ3MpOworCX0KK30KKworc3RhdGljIHZvaWQgZW5hX3VwZGF0ZV9ob3N0X2luZm8oc3RydWN0IGVuYV9hZG1pbl9ob3N0X2luZm8gKmhvc3RfaW5mbywKKwkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlob3N0X2luZm8tPnN1cHBvcnRlZF9uZXR3b3JrX2ZlYXR1cmVzWzBdID0KKwkJbmV0ZGV2LT5mZWF0dXJlcyAmIEdFTk1BU0tfVUxMKDMxLCAwKTsKKwlob3N0X2luZm8tPnN1cHBvcnRlZF9uZXR3b3JrX2ZlYXR1cmVzWzFdID0KKwkJKG5ldGRldi0+ZmVhdHVyZXMgJiBHRU5NQVNLX1VMTCg2MywgMzIpKSA+PiAzMjsKK30KKworc3RhdGljIHZvaWQgZW5hX3RpbWVyX3NlcnZpY2UodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgZW5hX2FkYXB0ZXIgKilkYXRhOworCXU4ICpkZWJ1Z19hcmVhID0gYWRhcHRlci0+ZW5hX2Rldi0+aG9zdF9hdHRyLmRlYnVnX2FyZWFfdmlydF9hZGRyOworCXN0cnVjdCBlbmFfYWRtaW5faG9zdF9pbmZvICpob3N0X2luZm8gPQorCQlhZGFwdGVyLT5lbmFfZGV2LT5ob3N0X2F0dHIuaG9zdF9pbmZvOworCisJY2hlY2tfZm9yX21pc3Npbmdfa2VlcF9hbGl2ZShhZGFwdGVyKTsKKworCWNoZWNrX2Zvcl9hZG1pbl9jb21fc3RhdGUoYWRhcHRlcik7CisKKwljaGVja19mb3JfbWlzc2luZ190eF9jb21wbGV0aW9ucyhhZGFwdGVyKTsKKworCWlmIChkZWJ1Z19hcmVhKQorCQllbmFfZHVtcF9zdGF0c190b19idWYoYWRhcHRlciwgZGVidWdfYXJlYSk7CisKKwlpZiAoaG9zdF9pbmZvKQorCQllbmFfdXBkYXRlX2hvc3RfaW5mbyhob3N0X2luZm8sIGFkYXB0ZXItPm5ldGRldik7CisKKwlpZiAodW5saWtlbHkodGVzdF9hbmRfY2xlYXJfYml0KEVOQV9GTEFHX1RSSUdHRVJfUkVTRVQsICZhZGFwdGVyLT5mbGFncykpKSB7CisJCW5ldGlmX2VycihhZGFwdGVyLCBkcnYsIGFkYXB0ZXItPm5ldGRldiwKKwkJCSAgIlRyaWdnZXIgcmVzZXQgaXMgb25cbiIpOworCQllbmFfZHVtcF9zdGF0c190b19kbWVzZyhhZGFwdGVyKTsKKwkJcXVldWVfd29yayhlbmFfd3EsICZhZGFwdGVyLT5yZXNldF90YXNrKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFJlc2V0IHRoZSB0aW1lciAqLworCW1vZF90aW1lcigmYWRhcHRlci0+dGltZXJfc2VydmljZSwgamlmZmllcyArIEhaKTsKK30KKworc3RhdGljIGludCBlbmFfY2FsY19pb19xdWV1ZV9udW0oc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJIHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCQkgc3RydWN0IGVuYV9jb21fZGV2X2dldF9mZWF0dXJlc19jdHggKmdldF9mZWF0X2N0eCkKK3sKKwlpbnQgaW9fc3FfbnVtLCBpb19xdWV1ZV9udW07CisKKwkvKiBJbiBjYXNlIG9mIExMUSB1c2UgdGhlIGxscSBudW1iZXIgaW4gdGhlIGdldCBmZWF0dXJlIGNtZCAqLworCWlmIChlbmFfZGV2LT50eF9tZW1fcXVldWVfdHlwZSA9PSBFTkFfQURNSU5fUExBQ0VNRU5UX1BPTElDWV9ERVYpIHsKKwkJaW9fc3FfbnVtID0gZ2V0X2ZlYXRfY3R4LT5tYXhfcXVldWVzLm1heF9sbHFfbnVtOworCisJCWlmIChpb19zcV9udW0gPT0gMCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJUcnlpbmcgdG8gdXNlIExMUSBidXQgbGxxX251bSBpcyAwLiBGYWxsIGJhY2sgaW50byByZWd1bGFyIHF1ZXVlc1xuIik7CisKKwkJCWVuYV9kZXYtPnR4X21lbV9xdWV1ZV90eXBlID0KKwkJCQlFTkFfQURNSU5fUExBQ0VNRU5UX1BPTElDWV9IT1NUOworCQkJaW9fc3FfbnVtID0gZ2V0X2ZlYXRfY3R4LT5tYXhfcXVldWVzLm1heF9zcV9udW07CisJCX0KKwl9IGVsc2UgeworCQlpb19zcV9udW0gPSBnZXRfZmVhdF9jdHgtPm1heF9xdWV1ZXMubWF4X3NxX251bTsKKwl9CisKKwlpb19xdWV1ZV9udW0gPSBtaW5fdChpbnQsIG51bV9wb3NzaWJsZV9jcHVzKCksIEVOQV9NQVhfTlVNX0lPX1FVRVVFUyk7CisJaW9fcXVldWVfbnVtID0gbWluX3QoaW50LCBpb19xdWV1ZV9udW0sIGlvX3NxX251bSk7CisJaW9fcXVldWVfbnVtID0gbWluX3QoaW50LCBpb19xdWV1ZV9udW0sCisJCQkgICAgIGdldF9mZWF0X2N0eC0+bWF4X3F1ZXVlcy5tYXhfY3FfbnVtKTsKKwkvKiAxIElSUSBmb3IgZm9yIG1nbW50IGFuZCAxIElSUXMgZm9yIGVhY2ggSU8gZGlyZWN0aW9uICovCisJaW9fcXVldWVfbnVtID0gbWluX3QoaW50LCBpb19xdWV1ZV9udW0sIHBjaV9tc2l4X3ZlY19jb3VudChwZGV2KSAtIDEpOworCWlmICh1bmxpa2VseSghaW9fcXVldWVfbnVtKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJUaGUgZGV2aWNlIGRvZXNuJ3QgaGF2ZSBpbyBxdWV1ZXNcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gaW9fcXVldWVfbnVtOworfQorCitzdGF0aWMgdm9pZCBlbmFfc2V0X3B1c2hfbW9kZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJICAgICAgc3RydWN0IGVuYV9jb21fZGV2X2dldF9mZWF0dXJlc19jdHggKmdldF9mZWF0X2N0eCkKK3sKKwlib29sIGhhc19tZW1fYmFyOworCisJaGFzX21lbV9iYXIgPSBwY2lfc2VsZWN0X2JhcnMocGRldiwgSU9SRVNPVVJDRV9NRU0pICYgQklUKEVOQV9NRU1fQkFSKTsKKworCS8qIEVuYWJsZSBwdXNoIG1vZGUgaWYgZGV2aWNlIHN1cHBvcnRzIExMUSAqLworCWlmIChoYXNfbWVtX2JhciAmJiAoZ2V0X2ZlYXRfY3R4LT5tYXhfcXVldWVzLm1heF9sbHFfbnVtID4gMCkpCisJCWVuYV9kZXYtPnR4X21lbV9xdWV1ZV90eXBlID0gRU5BX0FETUlOX1BMQUNFTUVOVF9QT0xJQ1lfREVWOworCWVsc2UKKwkJZW5hX2Rldi0+dHhfbWVtX3F1ZXVlX3R5cGUgPSBFTkFfQURNSU5fUExBQ0VNRU5UX1BPTElDWV9IT1NUOworfQorCitzdGF0aWMgdm9pZCBlbmFfc2V0X2Rldl9vZmZsb2FkcyhzdHJ1Y3QgZW5hX2NvbV9kZXZfZ2V0X2ZlYXR1cmVzX2N0eCAqZmVhdCwKKwkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwluZXRkZXZfZmVhdHVyZXNfdCBkZXZfZmVhdHVyZXMgPSAwOworCisJLyogU2V0IG9mZmxvYWQgZmVhdHVyZXMgKi8KKwlpZiAoZmVhdC0+b2ZmbG9hZC50eCAmCisJCUVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19UWF9MNF9JUFY0X0NTVU1fUEFSVF9NQVNLKQorCQlkZXZfZmVhdHVyZXMgfD0gTkVUSUZfRl9JUF9DU1VNOworCisJaWYgKGZlYXQtPm9mZmxvYWQudHggJgorCQlFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfVFhfTDRfSVBWNl9DU1VNX1BBUlRfTUFTSykKKwkJZGV2X2ZlYXR1cmVzIHw9IE5FVElGX0ZfSVBWNl9DU1VNOworCisJaWYgKGZlYXQtPm9mZmxvYWQudHggJiBFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfVFNPX0lQVjRfTUFTSykKKwkJZGV2X2ZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPOworCisJaWYgKGZlYXQtPm9mZmxvYWQudHggJiBFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfVFNPX0lQVjZfTUFTSykKKwkJZGV2X2ZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPNjsKKworCWlmIChmZWF0LT5vZmZsb2FkLnR4ICYgRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1RTT19FQ05fTUFTSykKKwkJZGV2X2ZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPX0VDTjsKKworCWlmIChmZWF0LT5vZmZsb2FkLnJ4X3N1cHBvcnRlZCAmCisJCUVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19SWF9MNF9JUFY0X0NTVU1fTUFTSykKKwkJZGV2X2ZlYXR1cmVzIHw9IE5FVElGX0ZfUlhDU1VNOworCisJaWYgKGZlYXQtPm9mZmxvYWQucnhfc3VwcG9ydGVkICYKKwkJRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1JYX0w0X0lQVjZfQ1NVTV9NQVNLKQorCQlkZXZfZmVhdHVyZXMgfD0gTkVUSUZfRl9SWENTVU07CisKKwluZXRkZXYtPmZlYXR1cmVzID0KKwkJZGV2X2ZlYXR1cmVzIHwKKwkJTkVUSUZfRl9TRyB8CisJCU5FVElGX0ZfTlRVUExFIHwKKwkJTkVUSUZfRl9SWEhBU0ggfAorCQlORVRJRl9GX0hJR0hETUE7CisKKwluZXRkZXYtPmh3X2ZlYXR1cmVzIHw9IG5ldGRldi0+ZmVhdHVyZXM7CisJbmV0ZGV2LT52bGFuX2ZlYXR1cmVzIHw9IG5ldGRldi0+ZmVhdHVyZXM7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9zZXRfY29uZl9mZWF0X3BhcmFtcyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJICAgICBzdHJ1Y3QgZW5hX2NvbV9kZXZfZ2V0X2ZlYXR1cmVzX2N0eCAqZmVhdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCisJLyogQ29weSBtYWMgYWRkcmVzcyAqLworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihmZWF0LT5kZXZfYXR0ci5tYWNfYWRkcikpIHsKKwkJZXRoX2h3X2FkZHJfcmFuZG9tKG5ldGRldik7CisJCWV0aGVyX2FkZHJfY29weShhZGFwdGVyLT5tYWNfYWRkciwgbmV0ZGV2LT5kZXZfYWRkcik7CisJfSBlbHNlIHsKKwkJZXRoZXJfYWRkcl9jb3B5KGFkYXB0ZXItPm1hY19hZGRyLCBmZWF0LT5kZXZfYXR0ci5tYWNfYWRkcik7CisJCWV0aGVyX2FkZHJfY29weShuZXRkZXYtPmRldl9hZGRyLCBhZGFwdGVyLT5tYWNfYWRkcik7CisJfQorCisJLyogU2V0IG9mZmxvYWQgZmVhdHVyZXMgKi8KKwllbmFfc2V0X2Rldl9vZmZsb2FkcyhmZWF0LCBuZXRkZXYpOworCisJYWRhcHRlci0+bWF4X210dSA9IGZlYXQtPmRldl9hdHRyLm1heF9tdHU7Cit9CisKK3N0YXRpYyBpbnQgZW5hX3Jzc19pbml0X2RlZmF1bHQoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiA9IGFkYXB0ZXItPmVuYV9kZXY7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmFkYXB0ZXItPnBkZXYtPmRldjsKKwlpbnQgcmMsIGk7CisJdTMyIHZhbDsKKworCXJjID0gZW5hX2NvbV9yc3NfaW5pdChlbmFfZGV2LCBFTkFfUlhfUlNTX1RBQkxFX0xPR19TSVpFKTsKKwlpZiAodW5saWtlbHkocmMpKSB7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IGluaXQgaW5kaXJlY3QgdGFibGVcbiIpOworCQlnb3RvIGVycl9yc3NfaW5pdDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgRU5BX1JYX1JTU19UQUJMRV9TSVpFOyBpKyspIHsKKwkJdmFsID0gZXRodG9vbF9yeGZoX2luZGlyX2RlZmF1bHQoaSwgYWRhcHRlci0+bnVtX3F1ZXVlcyk7CisJCXJjID0gZW5hX2NvbV9pbmRpcmVjdF90YWJsZV9maWxsX2VudHJ5KGVuYV9kZXYsIGksCisJCQkJCQkgICAgICAgRU5BX0lPX1JYUV9JRFgodmFsKSk7CisJCWlmICh1bmxpa2VseShyYyAmJiAocmMgIT0gLUVQRVJNKSkpIHsKKwkJCWRldl9lcnIoZGV2LCAiQ2Fubm90IGZpbGwgaW5kaXJlY3QgdGFibGVcbiIpOworCQkJZ290byBlcnJfZmlsbF9pbmRpcjsKKwkJfQorCX0KKworCXJjID0gZW5hX2NvbV9maWxsX2hhc2hfZnVuY3Rpb24oZW5hX2RldiwgRU5BX0FETUlOX0NSQzMyLCBOVUxMLAorCQkJCQlFTkFfSEFTSF9LRVlfU0laRSwgMHhGRkZGRkZGRik7CisJaWYgKHVubGlrZWx5KHJjICYmIChyYyAhPSAtRVBFUk0pKSkgeworCQlkZXZfZXJyKGRldiwgIkNhbm5vdCBmaWxsIGhhc2ggZnVuY3Rpb25cbiIpOworCQlnb3RvIGVycl9maWxsX2luZGlyOworCX0KKworCXJjID0gZW5hX2NvbV9zZXRfZGVmYXVsdF9oYXNoX2N0cmwoZW5hX2Rldik7CisJaWYgKHVubGlrZWx5KHJjICYmIChyYyAhPSAtRVBFUk0pKSkgeworCQlkZXZfZXJyKGRldiwgIkNhbm5vdCBmaWxsIGhhc2ggY29udHJvbFxuIik7CisJCWdvdG8gZXJyX2ZpbGxfaW5kaXI7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9maWxsX2luZGlyOgorCWVuYV9jb21fcnNzX2Rlc3Ryb3koZW5hX2Rldik7CitlcnJfcnNzX2luaXQ6CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9yZWxlYXNlX2JhcnMoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlpbnQgcmVsZWFzZV9iYXJzOworCisJcmVsZWFzZV9iYXJzID0gcGNpX3NlbGVjdF9iYXJzKHBkZXYsIElPUkVTT1VSQ0VfTUVNKSAmIEVOQV9CQVJfTUFTSzsKKwlwY2lfcmVsZWFzZV9zZWxlY3RlZF9yZWdpb25zKHBkZXYsIHJlbGVhc2VfYmFycyk7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2NhbGNfcXVldWVfc2l6ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkgICAgICAgdTE2ICptYXhfdHhfc2dsX3NpemUsCisJCQkgICAgICAgdTE2ICptYXhfcnhfc2dsX3NpemUsCisJCQkgICAgICAgc3RydWN0IGVuYV9jb21fZGV2X2dldF9mZWF0dXJlc19jdHggKmdldF9mZWF0X2N0eCkKK3sKKwl1MzIgcXVldWVfc2l6ZSA9IEVOQV9ERUZBVUxUX1JJTkdfU0laRTsKKworCXF1ZXVlX3NpemUgPSBtaW5fdCh1MzIsIHF1ZXVlX3NpemUsCisJCQkgICBnZXRfZmVhdF9jdHgtPm1heF9xdWV1ZXMubWF4X2NxX2RlcHRoKTsKKwlxdWV1ZV9zaXplID0gbWluX3QodTMyLCBxdWV1ZV9zaXplLAorCQkJICAgZ2V0X2ZlYXRfY3R4LT5tYXhfcXVldWVzLm1heF9zcV9kZXB0aCk7CisKKwlpZiAoZW5hX2Rldi0+dHhfbWVtX3F1ZXVlX3R5cGUgPT0gRU5BX0FETUlOX1BMQUNFTUVOVF9QT0xJQ1lfREVWKQorCQlxdWV1ZV9zaXplID0gbWluX3QodTMyLCBxdWV1ZV9zaXplLAorCQkJCSAgIGdldF9mZWF0X2N0eC0+bWF4X3F1ZXVlcy5tYXhfbGxxX2RlcHRoKTsKKworCXF1ZXVlX3NpemUgPSByb3VuZGRvd25fcG93X29mX3R3byhxdWV1ZV9zaXplKTsKKworCWlmICh1bmxpa2VseSghcXVldWVfc2l6ZSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiSW52YWxpZCBxdWV1ZSBzaXplXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJKm1heF90eF9zZ2xfc2l6ZSA9IG1pbl90KHUxNiwgRU5BX1BLVF9NQVhfQlVGUywKKwkJCQkgZ2V0X2ZlYXRfY3R4LT5tYXhfcXVldWVzLm1heF9wYWNrZXRfdHhfZGVzY3MpOworCSptYXhfcnhfc2dsX3NpemUgPSBtaW5fdCh1MTYsIEVOQV9QS1RfTUFYX0JVRlMsCisJCQkJIGdldF9mZWF0X2N0eC0+bWF4X3F1ZXVlcy5tYXhfcGFja2V0X3J4X2Rlc2NzKTsKKworCXJldHVybiBxdWV1ZV9zaXplOworfQorCisvKiBlbmFfcHJvYmUgLSBEZXZpY2UgSW5pdGlhbGl6YXRpb24gUm91dGluZQorICogQHBkZXY6IFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gc3RydWN0CisgKiBAZW50OiBlbnRyeSBpbiBlbmFfcGNpX3RibAorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKgorICogZW5hX3Byb2JlIGluaXRpYWxpemVzIGFuIGFkYXB0ZXIgaWRlbnRpZmllZCBieSBhIHBjaV9kZXYgc3RydWN0dXJlLgorICogVGhlIE9TIGluaXRpYWxpemF0aW9uLCBjb25maWd1cmluZyBvZiB0aGUgYWRhcHRlciBwcml2YXRlIHN0cnVjdHVyZSwKKyAqIGFuZCBhIGhhcmR3YXJlIHJlc2V0IG9jY3VyLgorICovCitzdGF0aWMgaW50IGVuYV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9kZXZfZ2V0X2ZlYXR1cmVzX2N0eCBnZXRfZmVhdF9jdHg7CisJc3RhdGljIGludCB2ZXJzaW9uX3ByaW50ZWQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXI7CisJc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2ID0gTlVMTDsKKwlzdGF0aWMgaW50IGFkYXB0ZXJzX2ZvdW5kOworCWludCBpb19xdWV1ZV9udW0sIGJhcnMsIHJjOworCWludCBxdWV1ZV9zaXplOworCXUxNiB0eF9zZ2xfc2l6ZSA9IDA7CisJdTE2IHJ4X3NnbF9zaXplID0gMDsKKwlib29sIHdkX3N0YXRlOworCisJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKworCWlmICh2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQorCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiJXMiLCB2ZXJzaW9uKTsKKworCXJjID0gcGNpX2VuYWJsZV9kZXZpY2VfbWVtKHBkZXYpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwY2lfZW5hYmxlX2RldmljZV9tZW0oKSBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJZW5hX2RldiA9IHZ6YWxsb2Moc2l6ZW9mKCplbmFfZGV2KSk7CisJaWYgKCFlbmFfZGV2KSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfZGlzYWJsZV9kZXZpY2U7CisJfQorCisJYmFycyA9IHBjaV9zZWxlY3RfYmFycyhwZGV2LCBJT1JFU09VUkNFX01FTSkgJiBFTkFfQkFSX01BU0s7CisJcmMgPSBwY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zKHBkZXYsIGJhcnMsIERSVl9NT0RVTEVfTkFNRSk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInBjaV9yZXF1ZXN0X3NlbGVjdGVkX3JlZ2lvbnMgZmFpbGVkICVkXG4iLAorCQkJcmMpOworCQlnb3RvIGVycl9mcmVlX2VuYV9kZXY7CisJfQorCisJZW5hX2Rldi0+cmVnX2JhciA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIEVOQV9SRUdfQkFSKSwKKwkJCQkgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIEVOQV9SRUdfQkFSKSk7CisJaWYgKCFlbmFfZGV2LT5yZWdfYmFyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZW1hcCByZWdzIGJhclxuIik7CisJCXJjID0gLUVGQVVMVDsKKwkJZ290byBlcnJfZnJlZV9yZWdpb247CisJfQorCisJZW5hX2Rldi0+ZG1hZGV2ID0gJnBkZXYtPmRldjsKKworCXJjID0gZW5hX2RldmljZV9pbml0KGVuYV9kZXYsIHBkZXYsICZnZXRfZmVhdF9jdHgsICZ3ZF9zdGF0ZSk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImVuYSBkZXZpY2UgaW5pdCBmYWlsZWRcbiIpOworCQlpZiAocmMgPT0gLUVUSU1FKQorCQkJcmMgPSAtRVBST0JFX0RFRkVSOworCQlnb3RvIGVycl9mcmVlX3JlZ2lvbjsKKwl9CisKKwllbmFfc2V0X3B1c2hfbW9kZShwZGV2LCBlbmFfZGV2LCAmZ2V0X2ZlYXRfY3R4KTsKKworCWlmIChlbmFfZGV2LT50eF9tZW1fcXVldWVfdHlwZSA9PSBFTkFfQURNSU5fUExBQ0VNRU5UX1BPTElDWV9ERVYpIHsKKwkJZW5hX2Rldi0+bWVtX2JhciA9IGlvcmVtYXBfd2MocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIEVOQV9NRU1fQkFSKSwKKwkJCQkJICAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCBFTkFfTUVNX0JBUikpOworCQlpZiAoIWVuYV9kZXYtPm1lbV9iYXIpIHsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWdvdG8gZXJyX2RldmljZV9kZXN0cm95OworCQl9CisJfQorCisJLyogaW5pdGlhbCBUeCBpbnRlcnJ1cHQgZGVsYXksIEFzc3VtZXMgMSB1c2VjIGdyYW51bGFyaXR5LgorCSogVXBkYXRlZCBkdXJpbmcgZGV2aWNlIGluaXRpYWxpemF0aW9uIHdpdGggdGhlIHJlYWwgZ3JhbnVsYXJpdHkKKwkqLworCWVuYV9kZXYtPmludHJfbW9kZXJfdHhfaW50ZXJ2YWwgPSBFTkFfSU5UUl9JTklUSUFMX1RYX0lOVEVSVkFMX1VTRUNTOworCWlvX3F1ZXVlX251bSA9IGVuYV9jYWxjX2lvX3F1ZXVlX251bShwZGV2LCBlbmFfZGV2LCAmZ2V0X2ZlYXRfY3R4KTsKKwlxdWV1ZV9zaXplID0gZW5hX2NhbGNfcXVldWVfc2l6ZShwZGV2LCBlbmFfZGV2LCAmdHhfc2dsX3NpemUsCisJCQkJCSAmcnhfc2dsX3NpemUsICZnZXRfZmVhdF9jdHgpOworCWlmICgocXVldWVfc2l6ZSA8PSAwKSB8fCAoaW9fcXVldWVfbnVtIDw9IDApKSB7CisJCXJjID0gLUVGQVVMVDsKKwkJZ290byBlcnJfZGV2aWNlX2Rlc3Ryb3k7CisJfQorCisJZGV2X2luZm8oJnBkZXYtPmRldiwgImNyZWF0aW5nICVkIGlvIHF1ZXVlcy4gcXVldWUgc2l6ZTogJWRcbiIsCisJCSBpb19xdWV1ZV9udW0sIHF1ZXVlX3NpemUpOworCisJLyogZGV2IHplcm9lZCBpbiBpbml0X2V0aGVyZGV2ICovCisJbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXZfbXEoc2l6ZW9mKHN0cnVjdCBlbmFfYWRhcHRlciksIGlvX3F1ZXVlX251bSk7CisJaWYgKCFuZXRkZXYpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiYWxsb2NfZXRoZXJkZXZfbXEgZmFpbGVkXG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9kZXZpY2VfZGVzdHJveTsKKwl9CisKKwlTRVRfTkVUREVWX0RFVihuZXRkZXYsICZwZGV2LT5kZXYpOworCisJYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGFkYXB0ZXIpOworCisJYWRhcHRlci0+ZW5hX2RldiA9IGVuYV9kZXY7CisJYWRhcHRlci0+bmV0ZGV2ID0gbmV0ZGV2OworCWFkYXB0ZXItPnBkZXYgPSBwZGV2OworCisJZW5hX3NldF9jb25mX2ZlYXRfcGFyYW1zKGFkYXB0ZXIsICZnZXRfZmVhdF9jdHgpOworCisJYWRhcHRlci0+bXNnX2VuYWJsZSA9IG5ldGlmX21zZ19pbml0KGRlYnVnLCBERUZBVUxUX01TR19FTkFCTEUpOworCisJYWRhcHRlci0+dHhfcmluZ19zaXplID0gcXVldWVfc2l6ZTsKKwlhZGFwdGVyLT5yeF9yaW5nX3NpemUgPSBxdWV1ZV9zaXplOworCisJYWRhcHRlci0+bWF4X3R4X3NnbF9zaXplID0gdHhfc2dsX3NpemU7CisJYWRhcHRlci0+bWF4X3J4X3NnbF9zaXplID0gcnhfc2dsX3NpemU7CisKKwlhZGFwdGVyLT5udW1fcXVldWVzID0gaW9fcXVldWVfbnVtOworCWFkYXB0ZXItPmxhc3RfbW9uaXRvcmVkX3R4X3FpZCA9IDA7CisKKwlhZGFwdGVyLT5yeF9jb3B5YnJlYWsgPSBFTkFfREVGQVVMVF9SWF9DT1BZQlJFQUs7CisJYWRhcHRlci0+d2Rfc3RhdGUgPSB3ZF9zdGF0ZTsKKworCXNucHJpbnRmKGFkYXB0ZXItPm5hbWUsIEVOQV9OQU1FX01BWF9MRU4sICJlbmFfJWQiLCBhZGFwdGVyc19mb3VuZCk7CisKKwlyYyA9IGVuYV9jb21faW5pdF9pbnRlcnJ1cHRfbW9kZXJhdGlvbihhZGFwdGVyLT5lbmFfZGV2KTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIkZhaWxlZCB0byBxdWVyeSBpbnRlcnJ1cHQgbW9kZXJhdGlvbiBmZWF0dXJlXG4iKTsKKwkJZ290byBlcnJfbmV0ZGV2X2Rlc3Ryb3k7CisJfQorCWVuYV9pbml0X2lvX3JpbmdzKGFkYXB0ZXIpOworCisJbmV0ZGV2LT5uZXRkZXZfb3BzID0gJmVuYV9uZXRkZXZfb3BzOworCW5ldGRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOworCWVuYV9zZXRfZXRodG9vbF9vcHMobmV0ZGV2KTsKKworCW5ldGRldi0+cHJpdl9mbGFncyB8PSBJRkZfVU5JQ0FTVF9GTFQ7CisKKwl1NjRfc3RhdHNfaW5pdCgmYWRhcHRlci0+c3luY3ApOworCisJcmMgPSBlbmFfZW5hYmxlX21zaXhfYW5kX3NldF9hZG1pbl9pbnRlcnJ1cHRzKGFkYXB0ZXIsIGlvX3F1ZXVlX251bSk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJGYWlsZWQgdG8gZW5hYmxlIGFuZCBzZXQgdGhlIGFkbWluIGludGVycnVwdHNcbiIpOworCQlnb3RvIGVycl93b3JrZXJfZGVzdHJveTsKKwl9CisJcmMgPSBlbmFfcnNzX2luaXRfZGVmYXVsdChhZGFwdGVyKTsKKwlpZiAocmMgJiYgKHJjICE9IC1FUEVSTSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IGluaXQgUlNTIHJjOiAlZFxuIiwgcmMpOworCQlnb3RvIGVycl9mcmVlX21zaXg7CisJfQorCisJZW5hX2NvbmZpZ19kZWJ1Z19hcmVhKGFkYXB0ZXIpOworCisJbWVtY3B5KGFkYXB0ZXItPm5ldGRldi0+cGVybV9hZGRyLCBhZGFwdGVyLT5tYWNfYWRkciwgbmV0ZGV2LT5hZGRyX2xlbik7CisKKwluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCisJcmMgPSByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2VcbiIpOworCQlnb3RvIGVycl9yc3M7CisJfQorCisJSU5JVF9XT1JLKCZhZGFwdGVyLT5zdXNwZW5kX2lvX3Rhc2ssIGVuYV9kZXZpY2VfaW9fc3VzcGVuZCk7CisJSU5JVF9XT1JLKCZhZGFwdGVyLT5yZXN1bWVfaW9fdGFzaywgZW5hX2RldmljZV9pb19yZXN1bWUpOworCUlOSVRfV09SSygmYWRhcHRlci0+cmVzZXRfdGFzaywgZW5hX2Z3X3Jlc2V0X2RldmljZSk7CisKKwlhZGFwdGVyLT5sYXN0X2tlZXBfYWxpdmVfamlmZmllcyA9IGppZmZpZXM7CisKKwlpbml0X3RpbWVyKCZhZGFwdGVyLT50aW1lcl9zZXJ2aWNlKTsKKwlhZGFwdGVyLT50aW1lcl9zZXJ2aWNlLmV4cGlyZXMgPSByb3VuZF9qaWZmaWVzKGppZmZpZXMgKyBIWik7CisJYWRhcHRlci0+dGltZXJfc2VydmljZS5mdW5jdGlvbiA9IGVuYV90aW1lcl9zZXJ2aWNlOworCWFkYXB0ZXItPnRpbWVyX3NlcnZpY2UuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWFkYXB0ZXI7CisKKwlhZGRfdGltZXIoJmFkYXB0ZXItPnRpbWVyX3NlcnZpY2UpOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIiVzIGZvdW5kIGF0IG1lbSAlbHgsIG1hYyBhZGRyICVwTSBRdWV1ZXMgJWRcbiIsCisJCSBERVZJQ0VfTkFNRSwgKGxvbmcpcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLAorCQkgbmV0ZGV2LT5kZXZfYWRkciwgaW9fcXVldWVfbnVtKTsKKworCXNldF9iaXQoRU5BX0ZMQUdfREVWSUNFX1JVTk5JTkcsICZhZGFwdGVyLT5mbGFncyk7CisKKwlhZGFwdGVyc19mb3VuZCsrOworCisJcmV0dXJuIDA7CisKK2Vycl9yc3M6CisJZW5hX2NvbV9kZWxldGVfZGVidWdfYXJlYShlbmFfZGV2KTsKKwllbmFfY29tX3Jzc19kZXN0cm95KGVuYV9kZXYpOworZXJyX2ZyZWVfbXNpeDoKKwllbmFfY29tX2Rldl9yZXNldChlbmFfZGV2KTsKKwllbmFfZnJlZV9tZ21udF9pcnEoYWRhcHRlcik7CisJZW5hX2Rpc2FibGVfbXNpeChhZGFwdGVyKTsKK2Vycl93b3JrZXJfZGVzdHJveToKKwllbmFfY29tX2Rlc3Ryb3lfaW50ZXJydXB0X21vZGVyYXRpb24oZW5hX2Rldik7CisJZGVsX3RpbWVyKCZhZGFwdGVyLT50aW1lcl9zZXJ2aWNlKTsKKwljYW5jZWxfd29ya19zeW5jKCZhZGFwdGVyLT5zdXNwZW5kX2lvX3Rhc2spOworCWNhbmNlbF93b3JrX3N5bmMoJmFkYXB0ZXItPnJlc3VtZV9pb190YXNrKTsKK2Vycl9uZXRkZXZfZGVzdHJveToKKwlmcmVlX25ldGRldihuZXRkZXYpOworZXJyX2RldmljZV9kZXN0cm95OgorCWVuYV9jb21fZGVsZXRlX2hvc3RfaW5mbyhlbmFfZGV2KTsKKwllbmFfY29tX2FkbWluX2Rlc3Ryb3koZW5hX2Rldik7CitlcnJfZnJlZV9yZWdpb246CisJZW5hX3JlbGVhc2VfYmFycyhlbmFfZGV2LCBwZGV2KTsKK2Vycl9mcmVlX2VuYV9kZXY6CisJdmZyZWUoZW5hX2Rldik7CitlcnJfZGlzYWJsZV9kZXZpY2U6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBlbmFfc3Jpb3ZfY29uZmlndXJlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBudW12ZnMpCit7CisJaW50IHJjOworCisJaWYgKG51bXZmcyA+IDApIHsKKwkJcmMgPSBwY2lfZW5hYmxlX3NyaW92KGRldiwgbnVtdmZzKTsKKwkJaWYgKHJjICE9IDApIHsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJCSJwY2lfZW5hYmxlX3NyaW92IGZhaWxlZCB0byBlbmFibGU6ICVkIHZmcyB3aXRoIHRoZSBlcnJvcjogJWRcbiIsCisJCQkJbnVtdmZzLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKworCQlyZXR1cm4gbnVtdmZzOworCX0KKworCWlmIChudW12ZnMgPT0gMCkgeworCQlwY2lfZGlzYWJsZV9zcmlvdihkZXYpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBlbmFfcmVtb3ZlIC0gRGV2aWNlIFJlbW92YWwgUm91dGluZQorICogQHBkZXY6IFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gc3RydWN0CisgKgorICogZW5hX3JlbW92ZSBpcyBjYWxsZWQgYnkgdGhlIFBDSSBzdWJzeXN0ZW0gdG8gYWxlcnQgdGhlIGRyaXZlcgorICogdGhhdCBpdCBzaG91bGQgcmVsZWFzZSBhIFBDSSBkZXZpY2UuCisgKi8KK3N0YXRpYyB2b2lkIGVuYV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCisJaWYgKCFhZGFwdGVyKQorCQkvKiBUaGlzIGRldmljZSBkaWRuJ3QgbG9hZCBwcm9wZXJseSBhbmQgaXQncyByZXNvdXJjZXMKKwkJICogYWxyZWFkeSByZWxlYXNlZCwgbm90aGluZyB0byBkbworCQkgKi8KKwkJcmV0dXJuOworCisJZW5hX2RldiA9IGFkYXB0ZXItPmVuYV9kZXY7CisJbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCisjaWZkZWYgQ09ORklHX1JGU19BQ0NFTAorCWlmICgoYWRhcHRlci0+bXNpeF92ZWNzID49IDEpICYmIChuZXRkZXYtPnJ4X2NwdV9ybWFwKSkgeworCQlmcmVlX2lycV9jcHVfcm1hcChuZXRkZXYtPnJ4X2NwdV9ybWFwKTsKKwkJbmV0ZGV2LT5yeF9jcHVfcm1hcCA9IE5VTEw7CisJfQorI2VuZGlmIC8qIENPTkZJR19SRlNfQUNDRUwgKi8KKworCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPnRpbWVyX3NlcnZpY2UpOworCisJY2FuY2VsX3dvcmtfc3luYygmYWRhcHRlci0+cmVzZXRfdGFzayk7CisKKwljYW5jZWxfd29ya19zeW5jKCZhZGFwdGVyLT5zdXNwZW5kX2lvX3Rhc2spOworCisJY2FuY2VsX3dvcmtfc3luYygmYWRhcHRlci0+cmVzdW1lX2lvX3Rhc2spOworCisJZW5hX2NvbV9kZXZfcmVzZXQoZW5hX2Rldik7CisKKwllbmFfZnJlZV9tZ21udF9pcnEoYWRhcHRlcik7CisKKwllbmFfZGlzYWJsZV9tc2l4KGFkYXB0ZXIpOworCisJZnJlZV9uZXRkZXYobmV0ZGV2KTsKKworCWVuYV9jb21fbW1pb19yZWdfcmVhZF9yZXF1ZXN0X2Rlc3Ryb3koZW5hX2Rldik7CisKKwllbmFfY29tX2Fib3J0X2FkbWluX2NvbW1hbmRzKGVuYV9kZXYpOworCisJZW5hX2NvbV93YWl0X2Zvcl9hYm9ydF9jb21wbGV0aW9uKGVuYV9kZXYpOworCisJZW5hX2NvbV9hZG1pbl9kZXN0cm95KGVuYV9kZXYpOworCisJZW5hX2NvbV9yc3NfZGVzdHJveShlbmFfZGV2KTsKKworCWVuYV9jb21fZGVsZXRlX2RlYnVnX2FyZWEoZW5hX2Rldik7CisKKwllbmFfY29tX2RlbGV0ZV9ob3N0X2luZm8oZW5hX2Rldik7CisKKwllbmFfcmVsZWFzZV9iYXJzKGVuYV9kZXYsIHBkZXYpOworCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJZW5hX2NvbV9kZXN0cm95X2ludGVycnVwdF9tb2RlcmF0aW9uKGVuYV9kZXYpOworCisJdmZyZWUoZW5hX2Rldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBlbmFfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSBEUlZfTU9EVUxFX05BTUUsCisJLmlkX3RhYmxlCT0gZW5hX3BjaV90YmwsCisJLnByb2JlCQk9IGVuYV9wcm9iZSwKKwkucmVtb3ZlCQk9IGVuYV9yZW1vdmUsCisJLnNyaW92X2NvbmZpZ3VyZSA9IGVuYV9zcmlvdl9jb25maWd1cmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBlbmFfaW5pdCh2b2lkKQoreworCXByX2luZm8oIiVzIiwgdmVyc2lvbik7CisKKwllbmFfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShEUlZfTU9EVUxFX05BTUUpOworCWlmICghZW5hX3dxKSB7CisJCXByX2VycigiRmFpbGVkIHRvIGNyZWF0ZSB3b3JrcXVldWVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZW5hX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZW5hX2NsZWFudXAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmVuYV9wY2lfZHJpdmVyKTsKKworCWlmIChlbmFfd3EpIHsKKwkJZGVzdHJveV93b3JrcXVldWUoZW5hX3dxKTsKKwkJZW5hX3dxID0gTlVMTDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBRU5RIEhhbmRsZXJzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGVuYV91cGRhdGVfb25fbGlua19jaGFuZ2U6CisgKiBOb3RpZnkgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGFib3V0IHRoZSBjaGFuZ2UgaW4gbGluayBzdGF0dXMKKyAqLworc3RhdGljIHZvaWQgZW5hX3VwZGF0ZV9vbl9saW5rX2NoYW5nZSh2b2lkICphZGFwdGVyX2RhdGEsCisJCQkJICAgICAgc3RydWN0IGVuYV9hZG1pbl9hZW5xX2VudHJ5ICphZW5xX2UpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBlbmFfYWRhcHRlciAqKWFkYXB0ZXJfZGF0YTsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FlbnFfbGlua19jaGFuZ2VfZGVzYyAqYWVucV9kZXNjID0KKwkJKHN0cnVjdCBlbmFfYWRtaW5fYWVucV9saW5rX2NoYW5nZV9kZXNjICopYWVucV9lOworCWludCBzdGF0dXMgPSBhZW5xX2Rlc2MtPmZsYWdzICYKKwkJRU5BX0FETUlOX0FFTlFfTElOS19DSEFOR0VfREVTQ19MSU5LX1NUQVRVU19NQVNLOworCisJaWYgKHN0YXR1cykgeworCQluZXRkZXZfZGJnKGFkYXB0ZXItPm5ldGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJCXNldF9iaXQoRU5BX0ZMQUdfTElOS19VUCwgJmFkYXB0ZXItPmZsYWdzKTsKKwkJbmV0aWZfY2Fycmllcl9vbihhZGFwdGVyLT5uZXRkZXYpOworCX0gZWxzZSB7CisJCWNsZWFyX2JpdChFTkFfRkxBR19MSU5LX1VQLCAmYWRhcHRlci0+ZmxhZ3MpOworCQluZXRpZl9jYXJyaWVyX29mZihhZGFwdGVyLT5uZXRkZXYpOworCX0KK30KKworc3RhdGljIHZvaWQgZW5hX2tlZXBfYWxpdmVfd2Qodm9pZCAqYWRhcHRlcl9kYXRhLAorCQkJICAgICAgc3RydWN0IGVuYV9hZG1pbl9hZW5xX2VudHJ5ICphZW5xX2UpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBlbmFfYWRhcHRlciAqKWFkYXB0ZXJfZGF0YTsKKworCWFkYXB0ZXItPmxhc3Rfa2VlcF9hbGl2ZV9qaWZmaWVzID0gamlmZmllczsKK30KKworc3RhdGljIHZvaWQgZW5hX25vdGlmaWNhdGlvbih2b2lkICphZGFwdGVyX2RhdGEsCisJCQkgICAgIHN0cnVjdCBlbmFfYWRtaW5fYWVucV9lbnRyeSAqYWVucV9lKQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgZW5hX2FkYXB0ZXIgKilhZGFwdGVyX2RhdGE7CisKKwlXQVJOKGFlbnFfZS0+YWVucV9jb21tb25fZGVzYy5ncm91cCAhPSBFTkFfQURNSU5fTk9USUZJQ0FUSU9OLAorCSAgICAgIkludmFsaWQgZ3JvdXAoJXgpIGV4cGVjdGVkICV4XG4iLAorCSAgICAgYWVucV9lLT5hZW5xX2NvbW1vbl9kZXNjLmdyb3VwLAorCSAgICAgRU5BX0FETUlOX05PVElGSUNBVElPTik7CisKKwlzd2l0Y2ggKGFlbnFfZS0+YWVucV9jb21tb25fZGVzYy5zeW5kcm9tKSB7CisJY2FzZSBFTkFfQURNSU5fU1VTUEVORDoKKwkJLyogU3VzcGVuZCBqdXN0IHRoZSBJTyBxdWV1ZXMuCisJCSAqIFdlIGRlbGliZXJhdGVseSBkb24ndCBzdXNwZW5kIGFkbWluIHNvIHRoZSB0aW1lciBhbmQKKwkJICogdGhlIGtlZXBfYWxpdmUgZXZlbnRzIHNob3VsZCByZW1haW4uCisJCSAqLworCQlxdWV1ZV93b3JrKGVuYV93cSwgJmFkYXB0ZXItPnN1c3BlbmRfaW9fdGFzayk7CisJCWJyZWFrOworCWNhc2UgRU5BX0FETUlOX1JFU1VNRToKKwkJcXVldWVfd29yayhlbmFfd3EsICZhZGFwdGVyLT5yZXN1bWVfaW9fdGFzayk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW5ldGlmX2VycihhZGFwdGVyLCBkcnYsIGFkYXB0ZXItPm5ldGRldiwKKwkJCSAgIkludmFsaWQgYWVucSBub3RpZmljYXRpb24gbGluayBzdGF0ZSAlZFxuIiwKKwkJCSAgYWVucV9lLT5hZW5xX2NvbW1vbl9kZXNjLnN5bmRyb20pOworCX0KK30KKworLyogVGhpcyBoYW5kbGVyIHdpbGwgY2FsbGVkIGZvciB1bmtub3duIGV2ZW50IGdyb3VwIG9yIHVuaW1wbGVtZW50ZWQgaGFuZGxlcnMqLworc3RhdGljIHZvaWQgdW5pbXBsZW1lbnRlZF9hZW5xX2hhbmRsZXIodm9pZCAqZGF0YSwKKwkJCQkgICAgICAgc3RydWN0IGVuYV9hZG1pbl9hZW5xX2VudHJ5ICphZW5xX2UpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBlbmFfYWRhcHRlciAqKWRhdGE7CisKKwluZXRpZl9lcnIoYWRhcHRlciwgZHJ2LCBhZGFwdGVyLT5uZXRkZXYsCisJCSAgIlVua25vd24gZXZlbnQgd2FzIHJlY2VpdmVkIG9yIGV2ZW50IHdpdGggdW5pbXBsZW1lbnRlZCBoYW5kbGVyXG4iKTsKK30KKworc3RhdGljIHN0cnVjdCBlbmFfYWVucV9oYW5kbGVycyBhZW5xX2hhbmRsZXJzID0geworCS5oYW5kbGVycyA9IHsKKwkJW0VOQV9BRE1JTl9MSU5LX0NIQU5HRV0gPSBlbmFfdXBkYXRlX29uX2xpbmtfY2hhbmdlLAorCQlbRU5BX0FETUlOX05PVElGSUNBVElPTl0gPSBlbmFfbm90aWZpY2F0aW9uLAorCQlbRU5BX0FETUlOX0tFRVBfQUxJVkVdID0gZW5hX2tlZXBfYWxpdmVfd2QsCisJfSwKKwkudW5pbXBsZW1lbnRlZF9oYW5kbGVyID0gdW5pbXBsZW1lbnRlZF9hZW5xX2hhbmRsZXIKK307CisKK21vZHVsZV9pbml0KGVuYV9pbml0KTsKK21vZHVsZV9leGl0KGVuYV9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX25ldGRldi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfbmV0ZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlkN2U5ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX25ldGRldi5oCkBAIC0wLDAgKzEsMzI0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIEVOQV9ICisjZGVmaW5lIEVOQV9ICisKKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworI2luY2x1ZGUgImVuYV9jb20uaCIKKyNpbmNsdWRlICJlbmFfZXRoX2NvbS5oIgorCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSX01BSk9SCTEKKyNkZWZpbmUgRFJWX01PRFVMRV9WRVJfTUlOT1IJMAorI2RlZmluZSBEUlZfTU9EVUxFX1ZFUl9TVUJNSU5PUiAyCisKKyNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkiZW5hIgorI2lmbmRlZiBEUlZfTU9EVUxFX1ZFUlNJT04KKyNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OIFwKKwlfX3N0cmluZ2lmeShEUlZfTU9EVUxFX1ZFUl9NQUpPUikgIi4iCVwKKwlfX3N0cmluZ2lmeShEUlZfTU9EVUxFX1ZFUl9NSU5PUikgIi4iCVwKKwlfX3N0cmluZ2lmeShEUlZfTU9EVUxFX1ZFUl9TVUJNSU5PUikKKyNlbmRpZgorCisjZGVmaW5lIERFVklDRV9OQU1FCSJFbGFzdGljIE5ldHdvcmsgQWRhcHRlciAoRU5BKSIKKworLyogMSBmb3IgQUVOUSArIEFETUlOICovCisjZGVmaW5lIEVOQV9NQVhfTVNJWF9WRUMoaW9fcXVldWVzKQkoMSArIChpb19xdWV1ZXMpKQorCisjZGVmaW5lIEVOQV9SRUdfQkFSCQkJMAorI2RlZmluZSBFTkFfTUVNX0JBUgkJCTIKKyNkZWZpbmUgRU5BX0JBUl9NQVNLIChCSVQoRU5BX1JFR19CQVIpIHwgQklUKEVOQV9NRU1fQkFSKSkKKworI2RlZmluZSBFTkFfREVGQVVMVF9SSU5HX1NJWkUJKDEwMjQpCisKKyNkZWZpbmUgRU5BX1RYX1dBS0VVUF9USFJFU0gJCShNQVhfU0tCX0ZSQUdTICsgMikKKyNkZWZpbmUgRU5BX0RFRkFVTFRfUlhfQ09QWUJSRUFLCSgxMjggLSBORVRfSVBfQUxJR04pCisKKy8qIGxpbWl0IHRoZSBidWZmZXIgc2l6ZSB0byA2MDAgYnl0ZXMgdG8gaGFuZGxlIE1UVSBjaGFuZ2VzIGZyb20gdmVyeQorICogc21hbGwgdG8gdmVyeSBsYXJnZSwgaW4gd2hpY2ggY2FzZSB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgcGVyIHBhY2tldAorICogY291bGQgZXhjZWVkIEVOQV9QS1RfTUFYX0JVRlMKKyAqLworI2RlZmluZSBFTkFfREVGQVVMVF9NSU5fUlhfQlVGRl9BTExPQ19TSVpFIDYwMAorCisjZGVmaW5lIEVOQV9NSU5fTVRVCQkxMjgKKworI2RlZmluZSBFTkFfTkFNRV9NQVhfTEVOCTIwCisjZGVmaW5lIEVOQV9JUlFOQU1FX1NJWkUJNDAKKworI2RlZmluZSBFTkFfUEtUX01BWF9CVUZTCTE5CisKKyNkZWZpbmUgRU5BX1JYX1JTU19UQUJMRV9MT0dfU0laRSAgNworI2RlZmluZSBFTkFfUlhfUlNTX1RBQkxFX1NJWkUJKDEgPDwgRU5BX1JYX1JTU19UQUJMRV9MT0dfU0laRSkKKworI2RlZmluZSBFTkFfSEFTSF9LRVlfU0laRQk0MAorCisvKiBUaGUgbnVtYmVyIG9mIHR4IHBhY2tldCBjb21wbGV0aW9ucyB0aGF0IHdpbGwgYmUgaGFuZGxlZCBlYWNoIE5BUEkgcG9sbAorICogY3ljbGUgaXMgcmluZ19zaXplIC8gRU5BX1RYX1BPTExfQlVER0VUX0RJVklERVIuCisgKi8KKyNkZWZpbmUgRU5BX1RYX1BPTExfQlVER0VUX0RJVklERVIJNAorCisvKiBSZWZpbGwgUnggcXVldWUgd2hlbiBudW1iZXIgb2YgYXZhaWxhYmxlIGRlc2NyaXB0b3JzIGlzIGJlbG93CisgKiBRVUVVRV9TSVpFIC8gRU5BX1JYX1JFRklMTF9USFJFU0hfRElWSURFUgorICovCisjZGVmaW5lIEVOQV9SWF9SRUZJTExfVEhSRVNIX0RJVklERVIJOAorCisvKiBOdW1iZXIgb2YgcXVldWVzIHRvIGNoZWNrIGZvciBtaXNzaW5nIHF1ZXVlcyBwZXIgdGltZXIgc2VydmljZSAqLworI2RlZmluZSBFTkFfTU9OSVRPUkVEX1RYX1FVRVVFUwk0CisvKiBNYXggdGltZW91dCBwYWNrZXRzIGJlZm9yZSBkZXZpY2UgcmVzZXQgKi8KKyNkZWZpbmUgTUFYX05VTV9PRl9USU1FT1VURURfUEFDS0VUUyAzMgorCisjZGVmaW5lIEVOQV9UWF9SSU5HX0lEWF9ORVhUKGlkeCwgcmluZ19zaXplKSAoKChpZHgpICsgMSkgJiAoKHJpbmdfc2l6ZSkgLSAxKSkKKworI2RlZmluZSBFTkFfUlhfUklOR19JRFhfTkVYVChpZHgsIHJpbmdfc2l6ZSkgKCgoaWR4KSArIDEpICYgKChyaW5nX3NpemUpIC0gMSkpCisjZGVmaW5lIEVOQV9SWF9SSU5HX0lEWF9BREQoaWR4LCBuLCByaW5nX3NpemUpIFwKKwkoKChpZHgpICsgKG4pKSAmICgocmluZ19zaXplKSAtIDEpKQorCisjZGVmaW5lIEVOQV9JT19UWFFfSURYKHEpCSgyICogKHEpKQorI2RlZmluZSBFTkFfSU9fUlhRX0lEWChxKQkoMiAqIChxKSArIDEpCisKKyNkZWZpbmUgRU5BX01HTU5UX0lSUV9JRFgJCTAKKyNkZWZpbmUgRU5BX0lPX0lSUV9GSVJTVF9JRFgJCTEKKyNkZWZpbmUgRU5BX0lPX0lSUV9JRFgocSkJCShFTkFfSU9fSVJRX0ZJUlNUX0lEWCArIChxKSkKKworLyogRU5BIGRldmljZSBzaG91bGQgc2VuZCBrZWVwIGFsaXZlIG1zZyBldmVyeSAxIHNlYy4KKyAqIFdlIHdhaXQgZm9yIDMgc2VjIGp1c3QgdG8gYmUgb24gdGhlIHNhZmUgc2lkZS4KKyAqLworI2RlZmluZSBFTkFfREVWSUNFX0tBTElWRV9USU1FT1VUCSgzICogSFopCisKKyNkZWZpbmUgRU5BX01NSU9fRElTQUJMRV9SRUdfUkVBRAlCSVQoMCkKKworc3RydWN0IGVuYV9pcnEgeworCWlycV9oYW5kbGVyX3QgaGFuZGxlcjsKKwl2b2lkICpkYXRhOworCWludCBjcHU7CisJdTMyIHZlY3RvcjsKKwljcHVtYXNrX3QgYWZmaW5pdHlfaGludF9tYXNrOworCWNoYXIgbmFtZVtFTkFfSVJRTkFNRV9TSVpFXTsKK307CisKK3N0cnVjdCBlbmFfbmFwaSB7CisJc3RydWN0IG5hcGlfc3RydWN0IG5hcGkgX19fX2NhY2hlbGluZV9hbGlnbmVkOworCXN0cnVjdCBlbmFfcmluZyAqdHhfcmluZzsKKwlzdHJ1Y3QgZW5hX3JpbmcgKnJ4X3Jpbmc7CisJdTMyIHFpZDsKK307CisKK3N0cnVjdCBlbmFfdHhfYnVmZmVyIHsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCS8qIG51bSBvZiBlbmEgZGVzYyBmb3IgdGhpcyBzcGVjaWZpYyBza2IKKwkgKiAoaW5jbHVkZXMgZGF0YSBkZXNjIGFuZCBtZXRhZGF0YSBkZXNjKQorCSAqLworCXUzMiB0eF9kZXNjczsKKwkvKiBudW0gb2YgYnVmZmVycyB1c2VkIGJ5IHRoaXMgc2tiICovCisJdTMyIG51bV9vZl9idWZzOworCS8qIFNhdmUgdGhlIGxhc3QgamlmZmllcyB0byBkZXRlY3QgbWlzc2luZyB0eCBwYWNrZXRzICovCisJdW5zaWduZWQgbG9uZyBsYXN0X2ppZmZpZXM7CisJc3RydWN0IGVuYV9jb21fYnVmIGJ1ZnNbRU5BX1BLVF9NQVhfQlVGU107Cit9IF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKKworc3RydWN0IGVuYV9yeF9idWZmZXIgeworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdTMyIHBhZ2Vfb2Zmc2V0OworCXN0cnVjdCBlbmFfY29tX2J1ZiBlbmFfYnVmOworfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisKK3N0cnVjdCBlbmFfc3RhdHNfdHggeworCXU2NCBjbnQ7CisJdTY0IGJ5dGVzOworCXU2NCBxdWV1ZV9zdG9wOworCXU2NCBwcmVwYXJlX2N0eF9lcnI7CisJdTY0IHF1ZXVlX3dha2V1cDsKKwl1NjQgZG1hX21hcHBpbmdfZXJyOworCXU2NCBsaW5lYXJpemU7CisJdTY0IGxpbmVhcml6ZV9mYWlsZWQ7CisJdTY0IG5hcGlfY29tcDsKKwl1NjQgdHhfcG9sbDsKKwl1NjQgZG9vcmJlbGxzOworCXU2NCBtaXNzaW5nX3R4X2NvbXA7CisJdTY0IGJhZF9yZXFfaWQ7Cit9OworCitzdHJ1Y3QgZW5hX3N0YXRzX3J4IHsKKwl1NjQgY250OworCXU2NCBieXRlczsKKwl1NjQgcmVmaWxfcGFydGlhbDsKKwl1NjQgYmFkX2NzdW07CisJdTY0IHBhZ2VfYWxsb2NfZmFpbDsKKwl1NjQgc2tiX2FsbG9jX2ZhaWw7CisJdTY0IGRtYV9tYXBwaW5nX2VycjsKKwl1NjQgYmFkX2Rlc2NfbnVtOworCXU2NCByeF9jb3B5YnJlYWtfcGt0OworfTsKKworc3RydWN0IGVuYV9yaW5nIHsKKwkvKiBIb2xkcyB0aGUgZW1wdHkgcmVxdWVzdHMgZm9yIFRYIG91dCBvZiBvcmRlciBjb21wbGV0aW9ucyAqLworCXUxNiAqZnJlZV90eF9pZHM7CisJdW5pb24geworCQlzdHJ1Y3QgZW5hX3R4X2J1ZmZlciAqdHhfYnVmZmVyX2luZm87CisJCXN0cnVjdCBlbmFfcnhfYnVmZmVyICpyeF9idWZmZXJfaW5mbzsKKwl9OworCisJLyogY2FjaGUgcHRyIHRvIGF2b2lkIHVzaW5nIHRoZSBhZGFwdGVyICovCisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldjsKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXI7CisJc3RydWN0IGVuYV9jb21faW9fY3EgKmVuYV9jb21faW9fY3E7CisJc3RydWN0IGVuYV9jb21faW9fc3EgKmVuYV9jb21faW9fc3E7CisKKwl1MTYgbmV4dF90b191c2U7CisJdTE2IG5leHRfdG9fY2xlYW47CisJdTE2IHJ4X2NvcHlicmVhazsKKwl1MTYgcWlkOworCXUxNiBtdHU7CisJdTE2IHNnbF9zaXplOworCisJLyogVGhlIG1heGltdW0gaGVhZGVyIGxlbmd0aCB0aGUgZGV2aWNlIGNhbiBoYW5kbGUgKi8KKwl1OCB0eF9tYXhfaGVhZGVyX3NpemU7CisKKwkvKiBjcHUgZm9yIFRQSCAqLworCWludCBjcHU7CisJIC8qIG51bWJlciBvZiB0eC9yeF9idWZmZXJfaW5mbydzIGVudHJpZXMgKi8KKwlpbnQgcmluZ19zaXplOworCisJZW51bSBlbmFfYWRtaW5fcGxhY2VtZW50X3BvbGljeV90eXBlIHR4X21lbV9xdWV1ZV90eXBlOworCisJc3RydWN0IGVuYV9jb21fcnhfYnVmX2luZm8gZW5hX2J1ZnNbRU5BX1BLVF9NQVhfQlVGU107CisJdTMyICBzbW9vdGhlZF9pbnRlcnZhbDsKKwl1MzIgIHBlcl9uYXBpX3BhY2tldHM7CisJdTMyICBwZXJfbmFwaV9ieXRlczsKKwllbnVtIGVuYV9pbnRyX21vZGVyX2xldmVsIG1vZGVyX3RibF9pZHg7CisJc3RydWN0IHU2NF9zdGF0c19zeW5jIHN5bmNwOworCXVuaW9uIHsKKwkJc3RydWN0IGVuYV9zdGF0c190eCB0eF9zdGF0czsKKwkJc3RydWN0IGVuYV9zdGF0c19yeCByeF9zdGF0czsKKwl9OworfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisKK3N0cnVjdCBlbmFfc3RhdHNfZGV2IHsKKwl1NjQgdHhfdGltZW91dDsKKwl1NjQgaW9fc3VzcGVuZDsKKwl1NjQgaW9fcmVzdW1lOworCXU2NCB3ZF9leHBpcmVkOworCXU2NCBpbnRlcmZhY2VfdXA7CisJdTY0IGludGVyZmFjZV9kb3duOworCXU2NCBhZG1pbl9xX3BhdXNlOworfTsKKworZW51bSBlbmFfZmxhZ3NfdCB7CisJRU5BX0ZMQUdfREVWSUNFX1JVTk5JTkcsCisJRU5BX0ZMQUdfREVWX1VQLAorCUVOQV9GTEFHX0xJTktfVVAsCisJRU5BX0ZMQUdfTVNJWF9FTkFCTEVELAorCUVOQV9GTEFHX1RSSUdHRVJfUkVTRVQKK307CisKKy8qIGFkYXB0ZXIgc3BlY2lmaWMgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSAqLworc3RydWN0IGVuYV9hZGFwdGVyIHsKKwlzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXY7CisJLyogT1MgZGVmaW5lZCBzdHJ1Y3RzICovCisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKworCS8qIHJ4IHBhY2tldHMgdGhhdCBzaG9ydGVyIHRoYXQgdGhpcyBsZW4gd2lsbCBiZSBjb3BpZWQgdG8gdGhlIHNrYgorCSAqIGhlYWRlcgorCSAqLworCXUzMiByeF9jb3B5YnJlYWs7CisJdTMyIG1heF9tdHU7CisKKwlpbnQgbnVtX3F1ZXVlczsKKworCXN0cnVjdCBtc2l4X2VudHJ5ICptc2l4X2VudHJpZXM7CisJaW50IG1zaXhfdmVjczsKKworCXUzMiB0eF91c2VjcywgcnhfdXNlY3M7IC8qIGludGVycnVwdCBtb2RlcmF0aW9uICovCisJdTMyIHR4X2ZyYW1lcywgcnhfZnJhbWVzOyAvKiBpbnRlcnJ1cHQgbW9kZXJhdGlvbiAqLworCisJdTMyIHR4X3Jpbmdfc2l6ZTsKKwl1MzIgcnhfcmluZ19zaXplOworCisJdTMyIG1zZ19lbmFibGU7CisKKwl1MTYgbWF4X3R4X3NnbF9zaXplOworCXUxNiBtYXhfcnhfc2dsX3NpemU7CisKKwl1OCBtYWNfYWRkcltFVEhfQUxFTl07CisKKwljaGFyIG5hbWVbRU5BX05BTUVfTUFYX0xFTl07CisKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCS8qIFRYICovCisJc3RydWN0IGVuYV9yaW5nIHR4X3JpbmdbRU5BX01BWF9OVU1fSU9fUVVFVUVTXQorCQlfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOworCisJLyogUlggKi8KKwlzdHJ1Y3QgZW5hX3JpbmcgcnhfcmluZ1tFTkFfTUFYX05VTV9JT19RVUVVRVNdCisJCV9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CisKKwlzdHJ1Y3QgZW5hX25hcGkgZW5hX25hcGlbRU5BX01BWF9OVU1fSU9fUVVFVUVTXTsKKworCXN0cnVjdCBlbmFfaXJxIGlycV90YmxbRU5BX01BWF9NU0lYX1ZFQyhFTkFfTUFYX05VTV9JT19RVUVVRVMpXTsKKworCS8qIHRpbWVyIHNlcnZpY2UgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzZXRfdGFzazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc3VzcGVuZF9pb190YXNrOworCXN0cnVjdCB3b3JrX3N0cnVjdCByZXN1bWVfaW9fdGFzazsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcl9zZXJ2aWNlOworCisJYm9vbCB3ZF9zdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGxhc3Rfa2VlcF9hbGl2ZV9qaWZmaWVzOworCisJc3RydWN0IHU2NF9zdGF0c19zeW5jIHN5bmNwOworCXN0cnVjdCBlbmFfc3RhdHNfZGV2IGRldl9zdGF0czsKKworCS8qIGxhc3QgcXVldWUgaW5kZXggdGhhdCB3YXMgY2hlY2tlZCBmb3IgdW5jb21wbGV0ZWQgdHggcGFja2V0cyAqLworCXUzMiBsYXN0X21vbml0b3JlZF90eF9xaWQ7Cit9OworCit2b2lkIGVuYV9zZXRfZXRodG9vbF9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CisKK3ZvaWQgZW5hX2R1bXBfc3RhdHNfdG9fZG1lc2coc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKTsKKwordm9pZCBlbmFfZHVtcF9zdGF0c190b19idWYoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyLCB1OCAqYnVmKTsKKworaW50IGVuYV9nZXRfc3NldF9jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgc3NldCk7CisKKyNlbmRpZiAvKiAhKEVOQV9IKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfcGNpX2lkX3RibC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfcGNpX2lkX3RibC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MGQyYTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9wY2lfaWRfdGJsLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBFTkFfUENJX0lEX1RCTF9IXworI2RlZmluZSBFTkFfUENJX0lEX1RCTF9IXworCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfQU1BWk9OCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQU1BWk9OIDB4MWQwZgorI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVl9JRF9FTkFfUEYKKyNkZWZpbmUgUENJX0RFVl9JRF9FTkFfUEYJMHgwZWMyCisjZW5kaWYKKworI2lmbmRlZiBQQ0lfREVWX0lEX0VOQV9MTFFfUEYKKyNkZWZpbmUgUENJX0RFVl9JRF9FTkFfTExRX1BGCTB4MWVjMgorI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVl9JRF9FTkFfVkYKKyNkZWZpbmUgUENJX0RFVl9JRF9FTkFfVkYJMHhlYzIwCisjZW5kaWYKKworI2lmbmRlZiBQQ0lfREVWX0lEX0VOQV9MTFFfVkYKKyNkZWZpbmUgUENJX0RFVl9JRF9FTkFfTExRX1ZGCTB4ZWMyMQorI2VuZGlmCisKKyNkZWZpbmUgRU5BX1BDSV9JRF9UQUJMRV9FTlRSWShkZXZpZCkgXAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQU1BWk9OLCBkZXZpZCl9LAorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgZW5hX3BjaV90YmxbXSA9IHsKKwlFTkFfUENJX0lEX1RBQkxFX0VOVFJZKFBDSV9ERVZfSURfRU5BX1BGKQorCUVOQV9QQ0lfSURfVEFCTEVfRU5UUlkoUENJX0RFVl9JRF9FTkFfTExRX1BGKQorCUVOQV9QQ0lfSURfVEFCTEVfRU5UUlkoUENJX0RFVl9JRF9FTkFfVkYpCisJRU5BX1BDSV9JRF9UQUJMRV9FTlRSWShQQ0lfREVWX0lEX0VOQV9MTFFfVkYpCisJeyB9Cit9OworCisjZW5kaWYgLyogRU5BX1BDSV9JRF9UQkxfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX3JlZ3NfZGVmcy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfcmVnc19kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYwOTdhMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX3JlZ3NfZGVmcy5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgLSAyMDE2IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKyNpZm5kZWYgX0VOQV9SRUdTX0hfCisjZGVmaW5lIF9FTkFfUkVHU19IXworCisvKiBlbmFfcmVnaXN0ZXJzIG9mZnNldHMgKi8KKyNkZWZpbmUgRU5BX1JFR1NfVkVSU0lPTl9PRkYJCTB4MAorI2RlZmluZSBFTkFfUkVHU19DT05UUk9MTEVSX1ZFUlNJT05fT0ZGCQkweDQKKyNkZWZpbmUgRU5BX1JFR1NfQ0FQU19PRkYJCTB4OAorI2RlZmluZSBFTkFfUkVHU19DQVBTX0VYVF9PRkYJCTB4YworI2RlZmluZSBFTkFfUkVHU19BUV9CQVNFX0xPX09GRgkJMHgxMAorI2RlZmluZSBFTkFfUkVHU19BUV9CQVNFX0hJX09GRgkJMHgxNAorI2RlZmluZSBFTkFfUkVHU19BUV9DQVBTX09GRgkJMHgxOAorI2RlZmluZSBFTkFfUkVHU19BQ1FfQkFTRV9MT19PRkYJCTB4MjAKKyNkZWZpbmUgRU5BX1JFR1NfQUNRX0JBU0VfSElfT0ZGCQkweDI0CisjZGVmaW5lIEVOQV9SRUdTX0FDUV9DQVBTX09GRgkJMHgyOAorI2RlZmluZSBFTkFfUkVHU19BUV9EQl9PRkYJCTB4MmMKKyNkZWZpbmUgRU5BX1JFR1NfQUNRX1RBSUxfT0ZGCQkweDMwCisjZGVmaW5lIEVOQV9SRUdTX0FFTlFfQ0FQU19PRkYJCTB4MzQKKyNkZWZpbmUgRU5BX1JFR1NfQUVOUV9CQVNFX0xPX09GRgkJMHgzOAorI2RlZmluZSBFTkFfUkVHU19BRU5RX0JBU0VfSElfT0ZGCQkweDNjCisjZGVmaW5lIEVOQV9SRUdTX0FFTlFfSEVBRF9EQl9PRkYJCTB4NDAKKyNkZWZpbmUgRU5BX1JFR1NfQUVOUV9UQUlMX09GRgkJMHg0NAorI2RlZmluZSBFTkFfUkVHU19JTlRSX01BU0tfT0ZGCQkweDRjCisjZGVmaW5lIEVOQV9SRUdTX0RFVl9DVExfT0ZGCQkweDU0CisjZGVmaW5lIEVOQV9SRUdTX0RFVl9TVFNfT0ZGCQkweDU4CisjZGVmaW5lIEVOQV9SRUdTX01NSU9fUkVHX1JFQURfT0ZGCQkweDVjCisjZGVmaW5lIEVOQV9SRUdTX01NSU9fUkVTUF9MT19PRkYJCTB4NjAKKyNkZWZpbmUgRU5BX1JFR1NfTU1JT19SRVNQX0hJX09GRgkJMHg2NAorI2RlZmluZSBFTkFfUkVHU19SU1NfSU5EX0VOVFJZX1VQREFURV9PRkYJCTB4NjgKKworLyogdmVyc2lvbiByZWdpc3RlciAqLworI2RlZmluZSBFTkFfUkVHU19WRVJTSU9OX01JTk9SX1ZFUlNJT05fTUFTSwkJMHhmZgorI2RlZmluZSBFTkFfUkVHU19WRVJTSU9OX01BSk9SX1ZFUlNJT05fU0hJRlQJCTgKKyNkZWZpbmUgRU5BX1JFR1NfVkVSU0lPTl9NQUpPUl9WRVJTSU9OX01BU0sJCTB4ZmYwMAorCisvKiBjb250cm9sbGVyX3ZlcnNpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRU5BX1JFR1NfQ09OVFJPTExFUl9WRVJTSU9OX1NVQk1JTk9SX1ZFUlNJT05fTUFTSwkJMHhmZgorI2RlZmluZSBFTkFfUkVHU19DT05UUk9MTEVSX1ZFUlNJT05fTUlOT1JfVkVSU0lPTl9TSElGVAkJOAorI2RlZmluZSBFTkFfUkVHU19DT05UUk9MTEVSX1ZFUlNJT05fTUlOT1JfVkVSU0lPTl9NQVNLCQkweGZmMDAKKyNkZWZpbmUgRU5BX1JFR1NfQ09OVFJPTExFUl9WRVJTSU9OX01BSk9SX1ZFUlNJT05fU0hJRlQJCTE2CisjZGVmaW5lIEVOQV9SRUdTX0NPTlRST0xMRVJfVkVSU0lPTl9NQUpPUl9WRVJTSU9OX01BU0sJCTB4ZmYwMDAwCisjZGVmaW5lIEVOQV9SRUdTX0NPTlRST0xMRVJfVkVSU0lPTl9JTVBMX0lEX1NISUZUCQkyNAorI2RlZmluZSBFTkFfUkVHU19DT05UUk9MTEVSX1ZFUlNJT05fSU1QTF9JRF9NQVNLCQkweGZmMDAwMDAwCisKKy8qIGNhcHMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRU5BX1JFR1NfQ0FQU19DT05USUdVT1VTX1FVRVVFX1JFUVVJUkVEX01BU0sJCTB4MQorI2RlZmluZSBFTkFfUkVHU19DQVBTX1JFU0VUX1RJTUVPVVRfU0hJRlQJCTEKKyNkZWZpbmUgRU5BX1JFR1NfQ0FQU19SRVNFVF9USU1FT1VUX01BU0sJCTB4M2UKKyNkZWZpbmUgRU5BX1JFR1NfQ0FQU19ETUFfQUREUl9XSURUSF9TSElGVAkJOAorI2RlZmluZSBFTkFfUkVHU19DQVBTX0RNQV9BRERSX1dJRFRIX01BU0sJCTB4ZmYwMAorCisvKiBhcV9jYXBzIHJlZ2lzdGVyICovCisjZGVmaW5lIEVOQV9SRUdTX0FRX0NBUFNfQVFfREVQVEhfTUFTSwkJMHhmZmZmCisjZGVmaW5lIEVOQV9SRUdTX0FRX0NBUFNfQVFfRU5UUllfU0laRV9TSElGVAkJMTYKKyNkZWZpbmUgRU5BX1JFR1NfQVFfQ0FQU19BUV9FTlRSWV9TSVpFX01BU0sJCTB4ZmZmZjAwMDAKKworLyogYWNxX2NhcHMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRU5BX1JFR1NfQUNRX0NBUFNfQUNRX0RFUFRIX01BU0sJCTB4ZmZmZgorI2RlZmluZSBFTkFfUkVHU19BQ1FfQ0FQU19BQ1FfRU5UUllfU0laRV9TSElGVAkJMTYKKyNkZWZpbmUgRU5BX1JFR1NfQUNRX0NBUFNfQUNRX0VOVFJZX1NJWkVfTUFTSwkJMHhmZmZmMDAwMAorCisvKiBhZW5xX2NhcHMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRU5BX1JFR1NfQUVOUV9DQVBTX0FFTlFfREVQVEhfTUFTSwkJMHhmZmZmCisjZGVmaW5lIEVOQV9SRUdTX0FFTlFfQ0FQU19BRU5RX0VOVFJZX1NJWkVfU0hJRlQJCTE2CisjZGVmaW5lIEVOQV9SRUdTX0FFTlFfQ0FQU19BRU5RX0VOVFJZX1NJWkVfTUFTSwkJMHhmZmZmMDAwMAorCisvKiBkZXZfY3RsIHJlZ2lzdGVyICovCisjZGVmaW5lIEVOQV9SRUdTX0RFVl9DVExfREVWX1JFU0VUX01BU0sJCTB4MQorI2RlZmluZSBFTkFfUkVHU19ERVZfQ1RMX0FRX1JFU1RBUlRfU0hJRlQJCTEKKyNkZWZpbmUgRU5BX1JFR1NfREVWX0NUTF9BUV9SRVNUQVJUX01BU0sJCTB4MgorI2RlZmluZSBFTkFfUkVHU19ERVZfQ1RMX1FVSUVTQ0VOVF9TSElGVAkJMgorI2RlZmluZSBFTkFfUkVHU19ERVZfQ1RMX1FVSUVTQ0VOVF9NQVNLCQkweDQKKyNkZWZpbmUgRU5BX1JFR1NfREVWX0NUTF9JT19SRVNVTUVfU0hJRlQJCTMKKyNkZWZpbmUgRU5BX1JFR1NfREVWX0NUTF9JT19SRVNVTUVfTUFTSwkJMHg4CisKKy8qIGRldl9zdHMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRU5BX1JFR1NfREVWX1NUU19SRUFEWV9NQVNLCQkweDEKKyNkZWZpbmUgRU5BX1JFR1NfREVWX1NUU19BUV9SRVNUQVJUX0lOX1BST0dSRVNTX1NISUZUCQkxCisjZGVmaW5lIEVOQV9SRUdTX0RFVl9TVFNfQVFfUkVTVEFSVF9JTl9QUk9HUkVTU19NQVNLCQkweDIKKyNkZWZpbmUgRU5BX1JFR1NfREVWX1NUU19BUV9SRVNUQVJUX0ZJTklTSEVEX1NISUZUCQkyCisjZGVmaW5lIEVOQV9SRUdTX0RFVl9TVFNfQVFfUkVTVEFSVF9GSU5JU0hFRF9NQVNLCQkweDQKKyNkZWZpbmUgRU5BX1JFR1NfREVWX1NUU19SRVNFVF9JTl9QUk9HUkVTU19TSElGVAkJMworI2RlZmluZSBFTkFfUkVHU19ERVZfU1RTX1JFU0VUX0lOX1BST0dSRVNTX01BU0sJCTB4OAorI2RlZmluZSBFTkFfUkVHU19ERVZfU1RTX1JFU0VUX0ZJTklTSEVEX1NISUZUCQk0CisjZGVmaW5lIEVOQV9SRUdTX0RFVl9TVFNfUkVTRVRfRklOSVNIRURfTUFTSwkJMHgxMAorI2RlZmluZSBFTkFfUkVHU19ERVZfU1RTX0ZBVEFMX0VSUk9SX1NISUZUCQk1CisjZGVmaW5lIEVOQV9SRUdTX0RFVl9TVFNfRkFUQUxfRVJST1JfTUFTSwkJMHgyMAorI2RlZmluZSBFTkFfUkVHU19ERVZfU1RTX1FVSUVTQ0VOVF9TVEFURV9JTl9QUk9HUkVTU19TSElGVAkJNgorI2RlZmluZSBFTkFfUkVHU19ERVZfU1RTX1FVSUVTQ0VOVF9TVEFURV9JTl9QUk9HUkVTU19NQVNLCQkweDQwCisjZGVmaW5lIEVOQV9SRUdTX0RFVl9TVFNfUVVJRVNDRU5UX1NUQVRFX0FDSElFVkVEX1NISUZUCQk3CisjZGVmaW5lIEVOQV9SRUdTX0RFVl9TVFNfUVVJRVNDRU5UX1NUQVRFX0FDSElFVkVEX01BU0sJCTB4ODAKKworLyogbW1pb19yZWdfcmVhZCByZWdpc3RlciAqLworI2RlZmluZSBFTkFfUkVHU19NTUlPX1JFR19SRUFEX1JFUV9JRF9NQVNLCQkweGZmZmYKKyNkZWZpbmUgRU5BX1JFR1NfTU1JT19SRUdfUkVBRF9SRUdfT0ZGX1NISUZUCQkxNgorI2RlZmluZSBFTkFfUkVHU19NTUlPX1JFR19SRUFEX1JFR19PRkZfTUFTSwkJMHhmZmZmMDAwMAorCisvKiByc3NfaW5kX2VudHJ5X3VwZGF0ZSByZWdpc3RlciAqLworI2RlZmluZSBFTkFfUkVHU19SU1NfSU5EX0VOVFJZX1VQREFURV9JTkRFWF9NQVNLCQkweGZmZmYKKyNkZWZpbmUgRU5BX1JFR1NfUlNTX0lORF9FTlRSWV9VUERBVEVfQ1FfSURYX1NISUZUCQkxNgorI2RlZmluZSBFTkFfUkVHU19SU1NfSU5EX0VOVFJZX1VQREFURV9DUV9JRFhfTUFTSwkJMHhmZmZmMDAwMAorCisjZW5kaWYgLypfRU5BX1JFR1NfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC83OTkwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvNzk5MC5jCmluZGV4IGRjZjJhMWYuLmRjNTdmMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC83OTkwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kLzc5OTAuYwpAQCAtNDUsMTQgKzQ1LDE0IEBACiAjZGVmaW5lIFdSSVRFUkRQKGxwLCB4KQlvdXRfYmUxNihscC0+YmFzZSArIExBTkNFX1JEUCwgKHgpKQogI2RlZmluZSBSRUFEUkRQKGxwKQlpbl9iZTE2KGxwLT5iYXNlICsgTEFOQ0VfUkRQKQogCi0jaWYgZGVmaW5lZChDT05GSUdfSFBMQU5DRSkgfHwgZGVmaW5lZChDT05GSUdfSFBMQU5DRV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSFBMQU5DRSkKICNpbmNsdWRlICJocGxhbmNlLmgiCiAKICN1bmRlZiBXUklURVJBUAogI3VuZGVmIFdSSVRFUkRQCiAjdW5kZWYgUkVBRFJEUAogCi0jaWYgZGVmaW5lZChDT05GSUdfTVZNRTE0N19ORVQpIHx8IGRlZmluZWQoQ09ORklHX01WTUUxNDdfTkVUX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19NVk1FMTQ3X05FVCkKIAogLyogTG9zc2FnZSBGYWN0b3IgTmluZSwgTXIgU3VsdS4gKi8KICNkZWZpbmUgV1JJVEVSQVAobHAsIHgpCShscC0+d3JpdGVyYXAobHAsIHgpKQpAQCAtODYsNyArODYsNyBAQAogfQogCiAjZW5kaWYKLSNlbmRpZiAvKiBDT05GSUdfSFBMQU5DRSB8fCBDT05GSUdfSFBMQU5DRV9NT0RVTEUgKi8KKyNlbmRpZiAvKiBJU19FTkFCTEVEKENPTkZJR19IUExBTkNFKSAqLwogCiAvKiBkZWJ1Z2dpbmcgb3V0cHV0IG1hY3JvcywgdmFyaW91cyBmbGF2b3VycyAqLwogLyogI2RlZmluZSBURVNUX0hJVFMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9hbWQ4MTExZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL2FtZDgxMTFlLmMKaW5kZXggOTQ5NjAwNS4uZjkyY2M5NzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9hbWQ4MTExZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9hbWQ4MTExZS5jCkBAIC04OSw3ICs4OSw3IEBACiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19WTEFOXzgwMjFRKQogI2RlZmluZSBBTUQ4MTExRV9WTEFOX1RBR19VU0VEIDEKICNlbHNlCiAjZGVmaW5lIEFNRDgxMTFFX1ZMQU5fVEFHX1VTRUQgMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1kcnYuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUtZHJ2LmMKaW5kZXggYTliMjcwOS4uN2Y5MjE2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1kcnYuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLWRydi5jCkBAIC0xNzA4LDkgKzE3MDgsOSBAQAogCS5uZG9fc2V0X2ZlYXR1cmVzCT0geGdiZV9zZXRfZmVhdHVyZXMsCiB9OwogCi1zdHJ1Y3QgbmV0X2RldmljZV9vcHMgKnhnYmVfZ2V0X25ldGRldl9vcHModm9pZCkKK2NvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqeGdiZV9nZXRfbmV0ZGV2X29wcyh2b2lkKQogewotCXJldHVybiAoc3RydWN0IG5ldF9kZXZpY2Vfb3BzICopJnhnYmVfbmV0ZGV2X29wczsKKwlyZXR1cm4gJnhnYmVfbmV0ZGV2X29wczsKIH0KIAogc3RhdGljIHZvaWQgeGdiZV9yeF9yZWZyZXNoKHN0cnVjdCB4Z2JlX2NoYW5uZWwgKmNoYW5uZWwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLWV0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUtZXRodG9vbC5jCmluZGV4IDExZDlmMGMuLjQwMDdiNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUtZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUtZXRodG9vbC5jCkBAIC02MjMsNyArNjIzLDcgQEAKIAkuZ2V0X3RzX2luZm8gPSB4Z2JlX2dldF90c19pbmZvLAogfTsKIAotc3RydWN0IGV0aHRvb2xfb3BzICp4Z2JlX2dldF9ldGh0b29sX29wcyh2b2lkKQorY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzICp4Z2JlX2dldF9ldGh0b29sX29wcyh2b2lkKQogewotCXJldHVybiAoc3RydWN0IGV0aHRvb2xfb3BzICopJnhnYmVfZXRodG9vbF9vcHM7CisJcmV0dXJuICZ4Z2JlX2V0aHRvb2xfb3BzOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLW1haW4uYwppbmRleCAzZWVlMzIwLi45ZGUwNzg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLW1haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLW1haW4uYwpAQCAtODYxLDkgKzg2MSwxNSBAQAogCXBkYXRhLT5scG1fY3RybCAmPSB+TURJT19DVFJMMV9MUE9XRVI7CiAJWE1ESU9fV1JJVEUocGRhdGEsIE1ESU9fTU1EX1BDUywgTURJT19DVFJMMSwgcGRhdGEtPmxwbV9jdHJsKTsKIAotCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgewogCQlyZXQgPSB4Z2JlX3Bvd2VydXAobmV0ZGV2LCBYR01BQ19EUklWRVJfQ09OVEVYVCk7CiAKKwkJLyogU2NoZWR1bGUgYSByZXN0YXJ0IGluIGNhc2UgdGhlIGxpbmsgb3IgcGh5IHN0YXRlIGNoYW5nZWQKKwkJICogd2hpbGUgd2Ugd2VyZSBwb3dlcmVkIGRvd24uCisJCSAqLworCQlzY2hlZHVsZV93b3JrKCZwZGF0YS0+cmVzdGFydF93b3JrKTsKKwl9CisKIAlEQkdQUigiPC0teGdiZV9yZXN1bWVcbiIpOwogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUuaAppbmRleCA5OGQ5ZDYzLi41ZGQxN2RjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS5oCkBAIC05NTYsOCArOTU2LDkgQEAKIHZvaWQgeGdiZV9pbml0X2Z1bmN0aW9uX3B0cnNfZGV2KHN0cnVjdCB4Z2JlX2h3X2lmICopOwogdm9pZCB4Z2JlX2luaXRfZnVuY3Rpb25fcHRyc19waHkoc3RydWN0IHhnYmVfcGh5X2lmICopOwogdm9pZCB4Z2JlX2luaXRfZnVuY3Rpb25fcHRyc19kZXNjKHN0cnVjdCB4Z2JlX2Rlc2NfaWYgKik7Ci1zdHJ1Y3QgbmV0X2RldmljZV9vcHMgKnhnYmVfZ2V0X25ldGRldl9vcHModm9pZCk7Ci1zdHJ1Y3QgZXRodG9vbF9vcHMgKnhnYmVfZ2V0X2V0aHRvb2xfb3BzKHZvaWQpOworY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzICp4Z2JlX2dldF9uZXRkZXZfb3BzKHZvaWQpOworY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzICp4Z2JlX2dldF9ldGh0b29sX29wcyh2b2lkKTsKKwogI2lmZGVmIENPTkZJR19BTURfWEdCRV9EQ0IKIGNvbnN0IHN0cnVjdCBkY2JubF9ydG5sX29wcyAqeGdiZV9nZXRfZGNibmxfb3BzKHZvaWQpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS9LY29uZmlnCmluZGV4IDMwMGUzYjUuLmFmY2NiMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS9LY29uZmlnCkBAIC00LDYgKzQsNyBAQAogCWRlcGVuZHMgb24gQVJDSF9YR0VORSB8fCBDT01QSUxFX1RFU1QKIAlzZWxlY3QgUEhZTElCCiAJc2VsZWN0IE1ESU9fWEdFTkUKKwlzZWxlY3QgR1BJT0xJQgogCWhlbHAKIAkgIFRoaXMgaXMgdGhlIEV0aGVybmV0IGRyaXZlciBmb3IgdGhlIG9uLWNoaXAgZXRoZXJuZXQgaW50ZXJmYWNlIG9uIHRoZQogCSAgQVBNIFgtR2VuZSBTb0MuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9jbGUuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X2NsZS5jCmluZGV4IDQ3MmMwZmIuLjIzZDcyYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X2NsZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X2NsZS5jCkBAIC0zMiwxMiArMzIsMTkgQEAKIAkJU0VUX1ZBTChTQl9IRFJMRU4sIGxlbik7CiB9CiAKLXN0YXRpYyB2b2lkIHhnZW5lX2NsZV9pZHRfdG9faHcodTMyIGRzdHFpZCwgdTMyIGZwc2VsLAorc3RhdGljIHZvaWQgeGdlbmVfY2xlX2lkdF90b19odyhzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEsCisJCQkJdTMyIGRzdHFpZCwgdTMyIGZwc2VsLAogCQkJCXUzMiBuZnBzZWwsIHUzMiAqaWR0X3JlZykKIHsKLQkqaWR0X3JlZyA9ICBTRVRfVkFMKElEVF9EU1RRSUQsIGRzdHFpZCkgfAotCQkgICAgU0VUX1ZBTChJRFRfRlBTRUwsIGZwc2VsKSB8Ci0JCSAgICBTRVRfVkFMKElEVF9ORlBTRUwsIG5mcHNlbCk7CisJaWYgKHBkYXRhLT5lbmV0X2lkID09IFhHRU5FX0VORVQxKSB7CisJCSppZHRfcmVnID0gU0VUX1ZBTChJRFRfRFNUUUlELCBkc3RxaWQpIHwKKwkJCSAgIFNFVF9WQUwoSURUX0ZQU0VMMSwgZnBzZWwpICB8CisJCQkgICBTRVRfVkFMKElEVF9ORlBTRUwxLCBuZnBzZWwpOworCX0gZWxzZSB7CisJCSppZHRfcmVnID0gU0VUX1ZBTChJRFRfRFNUUUlELCBkc3RxaWQpIHwKKwkJCSAgIFNFVF9WQUwoSURUX0ZQU0VMLCBmcHNlbCkgICB8CisJCQkgICBTRVRfVkFMKElEVF9ORlBTRUwsIG5mcHNlbCk7CisJfQogfQogCiBzdGF0aWMgdm9pZCB4Z2VuZV9jbGVfZGJwdHJfdG9faHcoc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhLApAQCAtMzQ0LDcgKzM1MSw3IEBACiAJCW5mcHNlbCA9IDA7CiAJCWlkdF9yZWcgPSAwOwogCi0JCXhnZW5lX2NsZV9pZHRfdG9faHcoZHN0cWlkLCBmcHNlbCwgbmZwc2VsLCAmaWR0X3JlZyk7CisJCXhnZW5lX2NsZV9pZHRfdG9faHcocGRhdGEsIGRzdHFpZCwgZnBzZWwsIG5mcHNlbCwgJmlkdF9yZWcpOwogCQlyZXQgPSB4Z2VuZV9jbGVfZHJhbV93cigmcGRhdGEtPmNsZSwgJmlkdF9yZWcsIDEsIGksCiAJCQkJCVJTU19JRFQsIENMRV9DTURfV1IpOwogCQlpZiAocmV0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfY2xlLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9jbGUuaAppbmRleCAzM2M1ZjZiLi45YWM5ZjhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9jbGUuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9jbGUuaApAQCAtMTk2LDkgKzE5NiwxMyBAQAogI2RlZmluZSBJRFRfRFNUUUlEX1BPUwkJMAogI2RlZmluZSBJRFRfRFNUUUlEX0xFTgkJMTIKICNkZWZpbmUgSURUX0ZQU0VMX1BPUwkJMTIKLSNkZWZpbmUgSURUX0ZQU0VMX0xFTgkJNAotI2RlZmluZSBJRFRfTkZQU0VMX1BPUwkJMTYKLSNkZWZpbmUgSURUX05GUFNFTF9MRU4JCTQKKyNkZWZpbmUgSURUX0ZQU0VMX0xFTgkJNQorI2RlZmluZSBJRFRfTkZQU0VMX1BPUwkJMTcKKyNkZWZpbmUgSURUX05GUFNFTF9MRU4JCTUKKyNkZWZpbmUgSURUX0ZQU0VMMV9QT1MJCTEyCisjZGVmaW5lIElEVF9GUFNFTDFfTEVOCQk0CisjZGVmaW5lIElEVF9ORlBTRUwxX1BPUwkJMTYKKyNkZWZpbmUgSURUX05GUFNFTDFfTEVOCQk0CiAKIHN0cnVjdCB4Z2VuZV9jbGVfcHRyZWVfYnJhbmNoIHsKIAlib29sIHZhbGlkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfZXRodG9vbC5jCmluZGV4IDIyYTdiMjYuLmQzNzJkNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9ldGh0b29sLmMKQEAgLTU0LDU1ICs1NCw2OCBAQAogCXNwcmludGYoaW5mby0+YnVzX2luZm8sICIlcyIsIHBkZXYtPm5hbWUpOwogfQogCi1zdGF0aWMgaW50IHhnZW5lX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCitzdGF0aWMgaW50IHhnZW5lX2dldF9saW5rX2tzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwkJCQkgICAgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKIHsKIAlzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gcGRhdGEtPnBoeV9kZXY7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IG5kZXYtPnBoeWRldjsKKwl1MzIgc3VwcG9ydGVkOwogCiAJaWYgKHBkYXRhLT5waHlfbW9kZSA9PSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUkpIHsKIAkJaWYgKHBoeWRldiA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9ERVY7CiAKLQkJcmV0dXJuIHBoeV9ldGh0b29sX2dzZXQocGh5ZGV2LCBjbWQpOworCQlyZXR1cm4gcGh5X2V0aHRvb2xfa3NldHRpbmdzX2dldChwaHlkZXYsIGNtZCk7CiAJfSBlbHNlIGlmIChwZGF0YS0+cGh5X21vZGUgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1NHTUlJKSB7CiAJCWlmIChwZGF0YS0+bWRpb19kcml2ZXIpIHsKIAkJCWlmICghcGh5ZGV2KQogCQkJCXJldHVybiAtRU5PREVWOwogCi0JCQlyZXR1cm4gcGh5X2V0aHRvb2xfZ3NldChwaHlkZXYsIGNtZCk7CisJCQlyZXR1cm4gcGh5X2V0aHRvb2xfa3NldHRpbmdzX2dldChwaHlkZXYsIGNtZCk7CiAJCX0KIAotCQljbWQtPnN1cHBvcnRlZCA9IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF9BdXRvbmVnIHwKLQkJCQkgU1VQUE9SVEVEX01JSTsKLQkJY21kLT5hZHZlcnRpc2luZyA9IGNtZC0+c3VwcG9ydGVkOwotCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoY21kLCBTUEVFRF8xMDAwKTsKLQkJY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKLQkJY21kLT5wb3J0ID0gUE9SVF9NSUk7Ci0JCWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOwotCQljbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKKwkJc3VwcG9ydGVkID0gU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwgU1VQUE9SVEVEX0F1dG9uZWcgfAorCQkJU1VQUE9SVEVEX01JSTsKKwkJZXRodG9vbF9jb252ZXJ0X2xlZ2FjeV91MzJfdG9fbGlua19tb2RlKAorCQkJY21kLT5saW5rX21vZGVzLnN1cHBvcnRlZCwKKwkJCXN1cHBvcnRlZCk7CisJCWV0aHRvb2xfY29udmVydF9sZWdhY3lfdTMyX3RvX2xpbmtfbW9kZSgKKwkJCWNtZC0+bGlua19tb2Rlcy5hZHZlcnRpc2luZywKKwkJCXN1cHBvcnRlZCk7CisKKwkJY21kLT5iYXNlLnNwZWVkID0gU1BFRURfMTAwMDsKKwkJY21kLT5iYXNlLmR1cGxleCA9IERVUExFWF9GVUxMOworCQljbWQtPmJhc2UucG9ydCA9IFBPUlRfTUlJOworCQljbWQtPmJhc2UuYXV0b25lZyA9IEFVVE9ORUdfRU5BQkxFOwogCX0gZWxzZSB7Ci0JCWNtZC0+c3VwcG9ydGVkID0gU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF9GSUJSRTsKLQkJY21kLT5hZHZlcnRpc2luZyA9IGNtZC0+c3VwcG9ydGVkOwotCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoY21kLCBTUEVFRF8xMDAwMCk7Ci0JCWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7Ci0JCWNtZC0+cG9ydCA9IFBPUlRfRklCUkU7Ci0JCWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOwotCQljbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0RJU0FCTEU7CisJCXN1cHBvcnRlZCA9IFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfRklCUkU7CisJCWV0aHRvb2xfY29udmVydF9sZWdhY3lfdTMyX3RvX2xpbmtfbW9kZSgKKwkJCWNtZC0+bGlua19tb2Rlcy5zdXBwb3J0ZWQsCisJCQlzdXBwb3J0ZWQpOworCQlldGh0b29sX2NvbnZlcnRfbGVnYWN5X3UzMl90b19saW5rX21vZGUoCisJCQljbWQtPmxpbmtfbW9kZXMuYWR2ZXJ0aXNpbmcsCisJCQlzdXBwb3J0ZWQpOworCisJCWNtZC0+YmFzZS5zcGVlZCA9IFNQRUVEXzEwMDAwOworCQljbWQtPmJhc2UuZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJCWNtZC0+YmFzZS5wb3J0ID0gUE9SVF9GSUJSRTsKKwkJY21kLT5iYXNlLmF1dG9uZWcgPSBBVVRPTkVHX0RJU0FCTEU7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgeGdlbmVfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3N0YXRpYyBpbnQgeGdlbmVfc2V0X2xpbmtfa3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQogewogCXN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSA9IG5ldGRldl9wcml2KG5kZXYpOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBwZGF0YS0+cGh5X2RldjsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gbmRldi0+cGh5ZGV2OwogCiAJaWYgKHBkYXRhLT5waHlfbW9kZSA9PSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUkpIHsKIAkJaWYgKCFwaHlkZXYpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAotCQlyZXR1cm4gcGh5X2V0aHRvb2xfc3NldChwaHlkZXYsIGNtZCk7CisJCXJldHVybiBwaHlfZXRodG9vbF9rc2V0dGluZ3Nfc2V0KHBoeWRldiwgY21kKTsKIAl9CiAKIAlpZiAocGRhdGEtPnBoeV9tb2RlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9TR01JSSkgewpAQCAtMTEwLDcgKzEyMyw3IEBACiAJCQlpZiAoIXBoeWRldikKIAkJCQlyZXR1cm4gLUVOT0RFVjsKIAotCQkJcmV0dXJuIHBoeV9ldGh0b29sX3NzZXQocGh5ZGV2LCBjbWQpOworCQkJcmV0dXJuIHBoeV9ldGh0b29sX2tzZXR0aW5nc19zZXQocGh5ZGV2LCBjbWQpOwogCQl9CiAJfQogCkBAIC0xNTIsMTIgKzE2NSwxMiBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHhnZW5lX2V0aHRvb2xfb3BzID0gewogCS5nZXRfZHJ2aW5mbyA9IHhnZW5lX2dldF9kcnZpbmZvLAotCS5nZXRfc2V0dGluZ3MgPSB4Z2VuZV9nZXRfc2V0dGluZ3MsCi0JLnNldF9zZXR0aW5ncyA9IHhnZW5lX3NldF9zZXR0aW5ncywKIAkuZ2V0X2xpbmsgPSBldGh0b29sX29wX2dldF9saW5rLAogCS5nZXRfc3RyaW5ncyA9IHhnZW5lX2dldF9zdHJpbmdzLAogCS5nZXRfc3NldF9jb3VudCA9IHhnZW5lX2dldF9zc2V0X2NvdW50LAotCS5nZXRfZXRodG9vbF9zdGF0cyA9IHhnZW5lX2dldF9ldGh0b29sX3N0YXRzCisJLmdldF9ldGh0b29sX3N0YXRzID0geGdlbmVfZ2V0X2V0aHRvb2xfc3RhdHMsCisJLmdldF9saW5rX2tzZXR0aW5ncyA9IHhnZW5lX2dldF9saW5rX2tzZXR0aW5ncywKKwkuc2V0X2xpbmtfa3NldHRpbmdzID0geGdlbmVfc2V0X2xpbmtfa3NldHRpbmdzLAogfTsKIAogdm9pZCB4Z2VuZV9lbmV0X3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X2h3LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9ody5jCmluZGV4IDM3YTBmNDYuLmM0ODFmMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X2h3LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfaHcuYwpAQCAtNzEzLDcgKzcxMyw3IEBACiB7CiAJc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhID0gbmV0ZGV2X3ByaXYobmRldik7CiAJY29uc3Qgc3RydWN0IHhnZW5lX21hY19vcHMgKm1hY19vcHMgPSBwZGF0YS0+bWFjX29wczsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gcGRhdGEtPnBoeV9kZXY7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IG5kZXYtPnBoeWRldjsKIAogCWlmIChwaHlkZXYtPmxpbmspIHsKIAkJaWYgKHBkYXRhLT5waHlfc3BlZWQgIT0gcGh5ZGV2LT5zcGVlZCkgewpAQCAtNzYxLDMxICs3NjEsMjUgQEAKIAlpZiAoZGV2LT5vZl9ub2RlKSB7CiAJCWZvciAoaSA9IDAgOyBpIDwgMjsgaSsrKSB7CiAJCQlucCA9IG9mX3BhcnNlX3BoYW5kbGUoZGV2LT5vZl9ub2RlLCAicGh5LWhhbmRsZSIsIGkpOwotCQkJaWYgKG5wKQorCQkJcGh5X2RldiA9IG9mX3BoeV9jb25uZWN0KG5kZXYsIG5wLAorCQkJCQkJICZ4Z2VuZV9lbmV0X2FkanVzdF9saW5rLAorCQkJCQkJIDAsIHBkYXRhLT5waHlfbW9kZSk7CisJCQlvZl9ub2RlX3B1dChucCk7CisJCQlpZiAocGh5X2RldikKIAkJCQlicmVhazsKIAkJfQogCi0JCWlmICghbnApIHsKLQkJCW5ldGRldl9kYmcobmRldiwgIk5vIHBoeS1oYW5kbGUgZm91bmQgaW4gRFRcbiIpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQotCQlwaHlfZGV2ID0gb2ZfcGh5X2Nvbm5lY3QobmRldiwgbnAsICZ4Z2VuZV9lbmV0X2FkanVzdF9saW5rLAotCQkJCQkgMCwgcGRhdGEtPnBoeV9tb2RlKTsKLQkJb2Zfbm9kZV9wdXQobnApOwogCQlpZiAoIXBoeV9kZXYpIHsKIAkJCW5ldGRldl9lcnIobmRldiwgIkNvdWxkIG5vdCBjb25uZWN0IHRvIFBIWVxuIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQotCi0JCXBkYXRhLT5waHlfZGV2ID0gcGh5X2RldjsKIAl9IGVsc2UgewogI2lmZGVmIENPTkZJR19BQ1BJCiAJCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldiA9IGFjcGlfcGh5X2ZpbmRfZGV2aWNlKGRldik7CiAJCWlmIChhZGV2KQotCQkJcGRhdGEtPnBoeV9kZXYgPSAgYWRldi0+ZHJpdmVyX2RhdGE7Ci0KLQkJcGh5X2RldiA9IHBkYXRhLT5waHlfZGV2OworCQkJcGh5X2RldiA9IGFkZXYtPmRyaXZlcl9kYXRhOworCQllbHNlCisJCQlwaHlfZGV2ID0gTlVMTDsKIAogCQlpZiAoIXBoeV9kZXYgfHwKIAkJICAgIHBoeV9jb25uZWN0X2RpcmVjdChuZGV2LCBwaHlfZGV2LCAmeGdlbmVfZW5ldF9hZGp1c3RfbGluaywKQEAgLTc5Myw2ICs3ODcsOCBAQAogCQkJbmV0ZGV2X2VycihuZGV2LCAiQ291bGQgbm90IGNvbm5lY3QgdG8gUEhZXG4iKTsKIAkJCXJldHVybiAgLUVOT0RFVjsKIAkJfQorI2Vsc2UKKwkJcmV0dXJuIC1FTk9ERVY7CiAjZW5kaWYKIAl9CiAKQEAgLTg1MSw4ICs4NDcsNiBAQAogCWlmICghcGh5KQogCQlyZXR1cm4gLUVJTzsKIAotCXBkYXRhLT5waHlfZGV2ID0gcGh5OwotCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtODkyLDE0ICs4ODYsMTggQEAKIAogdm9pZCB4Z2VuZV9lbmV0X3BoeV9kaXNjb25uZWN0KHN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSkKIHsKLQlpZiAocGRhdGEtPnBoeV9kZXYpCi0JCXBoeV9kaXNjb25uZWN0KHBkYXRhLT5waHlfZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBkYXRhLT5uZGV2OworCisJaWYgKG5kZXYtPnBoeWRldikKKwkJcGh5X2Rpc2Nvbm5lY3QobmRldi0+cGh5ZGV2KTsKIH0KIAogdm9pZCB4Z2VuZV9lbmV0X21kaW9fcmVtb3ZlKHN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSkKIHsKLQlpZiAocGRhdGEtPnBoeV9kZXYpCi0JCXBoeV9kaXNjb25uZWN0KHBkYXRhLT5waHlfZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBkYXRhLT5uZGV2OworCisJaWYgKG5kZXYtPnBoeWRldikKKwkJcGh5X2Rpc2Nvbm5lY3QobmRldi0+cGh5ZGV2KTsKIAogCW1kaW9idXNfdW5yZWdpc3RlcihwZGF0YS0+bWRpb19idXMpOwogCW1kaW9idXNfZnJlZShwZGF0YS0+bWRpb19idXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfaHcuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X2h3LmgKaW5kZXggMTc5YTQ0ZC4uODQ1NjMzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfaHcuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9ody5oCkBAIC0xMjQsNiArMTI0LDEyIEBACiAjZGVmaW5lIE1BQ19SRUFEX1JFR19PRkZTRVQJCTB4MGMKICNkZWZpbmUgTUFDX0NPTU1BTkRfRE9ORV9SRUdfT0ZGU0VUCTB4MTAKIAorI2RlZmluZSBQQ1NfQUREUl9SRUdfT0ZGU0VUCQkweDAwCisjZGVmaW5lIFBDU19DT01NQU5EX1JFR19PRkZTRVQJCTB4MDQKKyNkZWZpbmUgUENTX1dSSVRFX1JFR19PRkZTRVQJCTB4MDgKKyNkZWZpbmUgUENTX1JFQURfUkVHX09GRlNFVAkJMHgwYworI2RlZmluZSBQQ1NfQ09NTUFORF9ET05FX1JFR19PRkZTRVQJMHgxMAorCiAjZGVmaW5lIE1JSV9NR01UX0NPTkZJR19BRERSCQkweDIwCiAjZGVmaW5lIE1JSV9NR01UX0NPTU1BTkRfQUREUgkJMHgyNAogI2RlZmluZSBNSUlfTUdNVF9BRERSRVNTX0FERFIJCTB4MjgKQEAgLTIzMSw2ICsyMzcsOCBAQAogI2RlZmluZSBUQ1BIRFJfTEVOCQkJNgogI2RlZmluZSBJUEhEUl9QT1MJCQk2CiAjZGVmaW5lIElQSERSX0xFTgkJCTYKKyNkZWZpbmUgTVNTX1BPUwkJCQkyMAorI2RlZmluZSBNU1NfTEVOCQkJCTIKICNkZWZpbmUgRUNfUE9TCQkJCTIyCS8qIEVuYWJsZSBjaGVja3N1bSAqLwogI2RlZmluZSBFQ19MRU4JCQkJMQogI2RlZmluZSBFVF9QT1MJCQkJMjMJLyogRW5hYmxlIFRTTyAqLwpAQCAtMjQ3LDYgKzI1NSwxMSBAQAogCiAjZGVmaW5lIExBU1RfQlVGRkVSCQkJKDB4NzgwMFVMTCA8PCBCVUZEQVRBTEVOX1BPUykKIAorI2RlZmluZSBUU09fTVNTMF9QT1MJCQkwCisjZGVmaW5lIFRTT19NU1MwX0xFTgkJCTE0CisjZGVmaW5lIFRTT19NU1MxX1BPUwkJCTE2CisjZGVmaW5lIFRTT19NU1MxX0xFTgkJCTE0CisKIHN0cnVjdCB4Z2VuZV9lbmV0X3Jhd19kZXNjIHsKIAlfX2xlNjQgbTA7CiAJX19sZTY0IG0xOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfbWFpbi5jCmluZGV4IGQxZDZiNWUuLjQyOWYxOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9tYWluLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSAieGdlbmVfZW5ldF9tYWluLmgiCiAjaW5jbHVkZSAieGdlbmVfZW5ldF9ody5oIgogI2luY2x1ZGUgInhnZW5lX2VuZXRfc2dtYWMuaCIKQEAgLTcyLDcgKzczLDYgQEAKIAkJc2tiID0gbmV0ZGV2X2FsbG9jX3NrYl9pcF9hbGlnbihuZGV2LCBsZW4pOwogCQlpZiAodW5saWtlbHkoIXNrYikpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJYnVmX3Bvb2wtPnJ4X3NrYlt0YWlsXSA9IHNrYjsKIAogCQlkbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGRldiwgc2tiLT5kYXRhLCBsZW4sIERNQV9GUk9NX0RFVklDRSk7CiAJCWlmIChkbWFfbWFwcGluZ19lcnJvcihkZXYsIGRtYV9hZGRyKSkgewpAQCAtODEsNiArODEsOCBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAorCQlidWZfcG9vbC0+cnhfc2tiW3RhaWxdID0gc2tiOworCiAJCXJhd19kZXNjLT5tMSA9IGNwdV90b19sZTY0KFNFVF9WQUwoREFUQUFERFIsIGRtYV9hZGRyKSB8CiAJCQkJCSAgIFNFVF9WQUwoQlVGREFUQUxFTiwgYnVmZGF0YWxlbikgfAogCQkJCQkgICBTRVRfQklUKENPSEVSRU5UKSk7CkBAIC0xMDIsMTIgKzEwNCwyMSBAQAogCiBzdGF0aWMgdm9pZCB4Z2VuZV9lbmV0X2RlbGV0ZV9idWZwb29sKHN0cnVjdCB4Z2VuZV9lbmV0X2Rlc2NfcmluZyAqYnVmX3Bvb2wpCiB7CisJc3RydWN0IGRldmljZSAqZGV2ID0gbmRldl90b19kZXYoYnVmX3Bvb2wtPm5kZXYpOworCXN0cnVjdCB4Z2VuZV9lbmV0X3Jhd19kZXNjMTYgKnJhd19kZXNjOworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CiAJaW50IGk7CiAKIAkvKiBGcmVlIHVwIHRoZSBidWZmZXJzIGhlbGQgYnkgaGFyZHdhcmUgKi8KIAlmb3IgKGkgPSAwOyBpIDwgYnVmX3Bvb2wtPnNsb3RzOyBpKyspIHsKLQkJaWYgKGJ1Zl9wb29sLT5yeF9za2JbaV0pCisJCWlmIChidWZfcG9vbC0+cnhfc2tiW2ldKSB7CiAJCQlkZXZfa2ZyZWVfc2tiX2FueShidWZfcG9vbC0+cnhfc2tiW2ldKTsKKworCQkJcmF3X2Rlc2MgPSAmYnVmX3Bvb2wtPnJhd19kZXNjMTZbaV07CisJCQlkbWFfYWRkciA9IEdFVF9WQUwoREFUQUFERFIsIGxlNjRfdG9fY3B1KHJhd19kZXNjLT5tMSkpOworCQkJZG1hX3VubWFwX3NpbmdsZShkZXYsIGRtYV9hZGRyLCBYR0VORV9FTkVUX01BWF9NVFUsCisJCQkJCSBETUFfRlJPTV9ERVZJQ0UpOworCQl9CiAJfQogfQogCkBAIC0xMjYsNiArMTM3LDcgQEAKIHN0YXRpYyBpbnQgeGdlbmVfZW5ldF90eF9jb21wbGV0aW9uKHN0cnVjdCB4Z2VuZV9lbmV0X2Rlc2NfcmluZyAqY3BfcmluZywKIAkJCQkgICAgc3RydWN0IHhnZW5lX2VuZXRfcmF3X2Rlc2MgKnJhd19kZXNjKQogeworCXN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSA9IG5ldGRldl9wcml2KGNwX3JpbmctPm5kZXYpOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCXNrYl9mcmFnX3QgKmZyYWc7CkBAIC0xMzMsNiArMTQ1LDcgQEAKIAl1MTYgc2tiX2luZGV4OwogCXU4IHN0YXR1czsKIAlpbnQgaSwgcmV0ID0gMDsKKwl1OCBtc3NfaW5kZXg7CiAKIAlza2JfaW5kZXggPSBHRVRfVkFMKFVTRVJJTkZPLCBsZTY0X3RvX2NwdShyYXdfZGVzYy0+bTApKTsKIAlza2IgPSBjcF9yaW5nLT5jcF9za2Jbc2tiX2luZGV4XTsKQEAgLTE0OSw2ICsxNjIsMTMgQEAKIAkJCSAgICAgICBETUFfVE9fREVWSUNFKTsKIAl9CiAKKwlpZiAoR0VUX0JJVChFVCwgbGU2NF90b19jcHUocmF3X2Rlc2MtPm0zKSkpIHsKKwkJbXNzX2luZGV4ID0gR0VUX1ZBTChNU1MsIGxlNjRfdG9fY3B1KHJhd19kZXNjLT5tMykpOworCQlzcGluX2xvY2soJnBkYXRhLT5tc3NfbG9jayk7CisJCXBkYXRhLT5tc3NfcmVmY250W21zc19pbmRleF0tLTsKKwkJc3Bpbl91bmxvY2soJnBkYXRhLT5tc3NfbG9jayk7CisJfQorCiAJLyogQ2hlY2tpbmcgZm9yIGVycm9yICovCiAJc3RhdHVzID0gR0VUX1ZBTChMRVJSLCBsZTY0X3RvX2NwdShyYXdfZGVzYy0+bTApKTsKIAlpZiAodW5saWtlbHkoc3RhdHVzID4gMikpIHsKQEAgLTE2NywxNSArMTg3LDUzIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHU2NCB4Z2VuZV9lbmV0X3dvcmtfbXNnKHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW50IHhnZW5lX2VuZXRfc2V0dXBfbXNzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB1MzIgbXNzKQoreworCXN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSA9IG5ldGRldl9wcml2KG5kZXYpOworCWJvb2wgbXNzX2luZGV4X2ZvdW5kID0gZmFsc2U7CisJaW50IG1zc19pbmRleDsKKwlpbnQgaTsKKworCXNwaW5fbG9jaygmcGRhdGEtPm1zc19sb2NrKTsKKworCS8qIFJldXNlIHRoZSBzbG90IGlmIE1TUyBtYXRjaGVzICovCisJZm9yIChpID0gMDsgIW1zc19pbmRleF9mb3VuZCAmJiBpIDwgTlVNX01TU19SRUc7IGkrKykgeworCQlpZiAocGRhdGEtPm1zc1tpXSA9PSBtc3MpIHsKKwkJCXBkYXRhLT5tc3NfcmVmY250W2ldKys7CisJCQltc3NfaW5kZXggPSBpOworCQkJbXNzX2luZGV4X2ZvdW5kID0gdHJ1ZTsKKwkJfQorCX0KKworCS8qIE92ZXJ3cml0ZSB0aGUgc2xvdCB3aXRoIHJlZl9jb3VudCA9IDAgKi8KKwlmb3IgKGkgPSAwOyAhbXNzX2luZGV4X2ZvdW5kICYmIGkgPCBOVU1fTVNTX1JFRzsgaSsrKSB7CisJCWlmICghcGRhdGEtPm1zc19yZWZjbnRbaV0pIHsKKwkJCXBkYXRhLT5tc3NfcmVmY250W2ldKys7CisJCQlwZGF0YS0+bWFjX29wcy0+c2V0X21zcyhwZGF0YSwgbXNzLCBpKTsKKwkJCXBkYXRhLT5tc3NbaV0gPSBtc3M7CisJCQltc3NfaW5kZXggPSBpOworCQkJbXNzX2luZGV4X2ZvdW5kID0gdHJ1ZTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrKCZwZGF0YS0+bXNzX2xvY2spOworCisJLyogTm8gc2xvdHMgd2l0aCByZWZfY291bnQgPSAwIGF2YWlsYWJsZSwgcmV0dXJuIGJ1c3kgKi8KKwlpZiAoIW1zc19pbmRleF9mb3VuZCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldHVybiBtc3NfaW5kZXg7Cit9CisKK3N0YXRpYyBpbnQgeGdlbmVfZW5ldF93b3JrX21zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1NjQgKmhvcGluZm8pCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBza2ItPmRldjsKIAlzdHJ1Y3QgaXBoZHIgKmlwaDsKIAl1OCBsM2hsZW4gPSAwLCBsNGhsZW4gPSAwOwogCXU4IGV0aGhkciwgcHJvdG8gPSAwLCBjc3VtX2VuYWJsZSA9IDA7Ci0JdTY0IGhvcGluZm8gPSAwOwogCXUzMiBoZHJfbGVuLCBtc3MgPSAwOwogCXUzMiBpLCBsZW4sIG5yX2ZyYWdzOworCWludCBtc3NfaW5kZXg7CiAKIAlldGhoZHIgPSB4Z2VuZV9lbmV0X2hkcl9sZW4oc2tiLT5kYXRhKTsKIApAQCAtMjE1LDcgKzI3MywxMSBAQAogCQkJaWYgKCFtc3MgfHwgKChza2ItPmxlbiAtIGhkcl9sZW4pIDw9IG1zcykpCiAJCQkJZ290byBvdXQ7CiAKLQkJCWhvcGluZm8gfD0gU0VUX0JJVChFVCk7CisJCQltc3NfaW5kZXggPSB4Z2VuZV9lbmV0X3NldHVwX21zcyhuZGV2LCBtc3MpOworCQkJaWYgKHVubGlrZWx5KG1zc19pbmRleCA8IDApKQorCQkJCXJldHVybiAtRUJVU1k7CisKKwkJCSpob3BpbmZvIHw9IFNFVF9CSVQoRVQpIHwgU0VUX1ZBTChNU1MsIG1zc19pbmRleCk7CiAJCX0KIAl9IGVsc2UgaWYgKGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApIHsKIAkJbDRobGVuID0gVURQX0hEUl9TSVpFOwpAQCAtMjIzLDE1ICsyODUsMTUgQEAKIAl9CiBvdXQ6CiAJbDNobGVuID0gaXBfaGRybGVuKHNrYikgPj4gMjsKLQlob3BpbmZvIHw9IFNFVF9WQUwoVENQSERSLCBsNGhsZW4pIHwKLQkJICBTRVRfVkFMKElQSERSLCBsM2hsZW4pIHwKLQkJICBTRVRfVkFMKEVUSEhEUiwgZXRoaGRyKSB8Ci0JCSAgU0VUX1ZBTChFQywgY3N1bV9lbmFibGUpIHwKLQkJICBTRVRfVkFMKElTLCBwcm90bykgfAotCQkgIFNFVF9CSVQoSUMpIHwKLQkJICBTRVRfQklUKFRZUEVfRVRIX1dPUktfTUVTU0FHRSk7CisJKmhvcGluZm8gfD0gU0VUX1ZBTChUQ1BIRFIsIGw0aGxlbikgfAorCQkgICAgU0VUX1ZBTChJUEhEUiwgbDNobGVuKSB8CisJCSAgICBTRVRfVkFMKEVUSEhEUiwgZXRoaGRyKSB8CisJCSAgICBTRVRfVkFMKEVDLCBjc3VtX2VuYWJsZSkgfAorCQkgICAgU0VUX1ZBTChJUywgcHJvdG8pIHwKKwkJICAgIFNFVF9CSVQoSUMpIHwKKwkJICAgIFNFVF9CSVQoVFlQRV9FVEhfV09SS19NRVNTQUdFKTsKIAotCXJldHVybiBob3BpbmZvOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdTE2IHhnZW5lX2VuZXRfZW5jb2RlX2xlbih1MTYgbGVuKQpAQCAtMjcxLDIwICszMzMsMjIgQEAKIAlkbWFfYWRkcl90IGRtYV9hZGRyLCBwYnVmX2FkZHIsICpmcmFnX2RtYV9hZGRyOwogCXNrYl9mcmFnX3QgKmZyYWc7CiAJdTE2IHRhaWwgPSB0eF9yaW5nLT50YWlsOwotCXU2NCBob3BpbmZvOworCXU2NCBob3BpbmZvID0gMDsKIAl1MzIgbGVuLCBod19sZW47CiAJdTggbGwgPSAwLCBudiA9IDAsIGlkeCA9IDA7CiAJYm9vbCBzcGxpdCA9IGZhbHNlOwogCXUzMiBzaXplLCBvZmZzZXQsIGVsbF9ieXRlcyA9IDA7CiAJdTMyIGksIGZpZHgsIG5yX2ZyYWdzLCBjb3VudCA9IDE7CisJaW50IHJldDsKIAogCXJhd19kZXNjID0gJnR4X3JpbmctPnJhd19kZXNjW3RhaWxdOwogCXRhaWwgPSAodGFpbCArIDEpICYgKHR4X3JpbmctPnNsb3RzIC0gMSk7CiAJbWVtc2V0KHJhd19kZXNjLCAwLCBzaXplb2Yoc3RydWN0IHhnZW5lX2VuZXRfcmF3X2Rlc2MpKTsKIAotCWhvcGluZm8gPSB4Z2VuZV9lbmV0X3dvcmtfbXNnKHNrYik7Ci0JaWYgKCFob3BpbmZvKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXQgPSB4Z2VuZV9lbmV0X3dvcmtfbXNnKHNrYiwgJmhvcGluZm8pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlyYXdfZGVzYy0+bTMgPSBjcHVfdG9fbGU2NChTRVRfVkFMKEhFTlFOVU0sIHR4X3JpbmctPmRzdF9yaW5nX251bSkgfAogCQkJCSAgIGhvcGluZm8pOwogCkBAIC00MjQsNiArNDg4LDkgQEAKIAkJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAogCWNvdW50ID0geGdlbmVfZW5ldF9zZXR1cF90eF9kZXNjKHR4X3JpbmcsIHNrYik7CisJaWYgKGNvdW50ID09IC1FQlVTWSkKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCiAJaWYgKGNvdW50IDw9IDApIHsKIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJcmV0dXJuIE5FVERFVl9UWF9PSzsKQEAgLTQ1Miw3ICs1MTksNiBAQAogCQkJICAgICAgIHN0cnVjdCB4Z2VuZV9lbmV0X3Jhd19kZXNjICpyYXdfZGVzYykKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKLQlzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGE7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCXN0cnVjdCB4Z2VuZV9lbmV0X2Rlc2NfcmluZyAqYnVmX3Bvb2w7CiAJdTMyIGRhdGFsZW4sIHNrYl9pbmRleDsKQEAgLTQ2MSw3ICs1MjcsNiBAQAogCWludCByZXQgPSAwOwogCiAJbmRldiA9IHJ4X3JpbmctPm5kZXY7Ci0JcGRhdGEgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAlkZXYgPSBuZGV2X3RvX2RldihyeF9yaW5nLT5uZGV2KTsKIAlidWZfcG9vbCA9IHJ4X3JpbmctPmJ1Zl9wb29sOwogCkBAIC03MzksOCArODA0LDggQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKHBkYXRhLT5waHlfZGV2KSB7Ci0JCXBoeV9zdGFydChwZGF0YS0+cGh5X2Rldik7CisJaWYgKG5kZXYtPnBoeWRldikgeworCQlwaHlfc3RhcnQobmRldi0+cGh5ZGV2KTsKIAl9IGVsc2UgewogCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnBkYXRhLT5saW5rX3dvcmssIFBIWV9QT0xMX0xJTktfT0ZGKTsKIAkJbmV0aWZfY2Fycmllcl9vZmYobmRldik7CkBAIC03NjMsOCArODI4LDggQEAKIAltYWNfb3BzLT50eF9kaXNhYmxlKHBkYXRhKTsKIAltYWNfb3BzLT5yeF9kaXNhYmxlKHBkYXRhKTsKIAotCWlmIChwZGF0YS0+cGh5X2RldikKLQkJcGh5X3N0b3AocGRhdGEtPnBoeV9kZXYpOworCWlmIChuZGV2LT5waHlkZXYpCisJCXBoeV9zdG9wKG5kZXYtPnBoeWRldik7CiAJZWxzZQogCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnBkYXRhLT5saW5rX3dvcmspOwogCkBAIC0xMzEyLDYgKzEzNzcsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgeGdlbmVfZW5ldF9ncGlvZF9nZXQoc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGF0YS0+cGRldi0+ZGV2OworCisJaWYgKHBkYXRhLT5waHlfbW9kZSAhPSBQSFlfSU5URVJGQUNFX01PREVfWEdNSUkpCisJCXJldHVybjsKKworCXBkYXRhLT5zZnBfcmR5ID0gZ3Bpb2RfZ2V0KGRldiwgInJ4bG9zIiwgR1BJT0RfSU4pOworCWlmIChJU19FUlIocGRhdGEtPnNmcF9yZHkpKQorCQlwZGF0YS0+c2ZwX3JkeSA9IGdwaW9kX2dldChkZXYsICJzZnAiLCBHUElPRF9JTik7Cit9CisKIHN0YXRpYyBpbnQgeGdlbmVfZW5ldF9nZXRfcmVzb3VyY2VzKHN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSkKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwpAQCAtMTQwMSw2ICsxNDc4LDggQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJeGdlbmVfZW5ldF9ncGlvZF9nZXQocGRhdGEpOworCiAJcGRhdGEtPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKIAlpZiAoSVNfRVJSKHBkYXRhLT5jbGspKSB7CiAJCS8qIEZpcm13YXJlIG1heSBoYXZlIHNldCB1cCB0aGUgY2xvY2sgYWxyZWFkeS4gKi8KQEAgLTE0MjUsNiArMTUwNCw3IEBACiAJfSBlbHNlIHsKIAkJcGRhdGEtPm1jeF9tYWNfYWRkciA9IGJhc2VfYWRkciArIEJMT0NLX0FYR19NQUNfT0ZGU0VUOwogCQlwZGF0YS0+bWN4X21hY19jc3JfYWRkciA9IGJhc2VfYWRkciArIEJMT0NLX0FYR19NQUNfQ1NSX09GRlNFVDsKKwkJcGRhdGEtPnBjc19hZGRyID0gYmFzZV9hZGRyICsgQkxPQ0tfUENTX09GRlNFVDsKIAl9CiAJcGRhdGEtPnJ4X2J1ZmZfY250ID0gTlVNX1BLVF9CVUY7CiAKQEAgLTE0NTQsMTAgKzE1MzQsOCBAQAogCQlidWZfcG9vbCA9IHBkYXRhLT5yeF9yaW5nW2ldLT5idWZfcG9vbDsKIAkJeGdlbmVfZW5ldF9pbml0X2J1ZnBvb2woYnVmX3Bvb2wpOwogCQlyZXQgPSB4Z2VuZV9lbmV0X3JlZmlsbF9idWZwb29sKGJ1Zl9wb29sLCBwZGF0YS0+cnhfYnVmZl9jbnQpOwotCQlpZiAocmV0KSB7Ci0JCQl4Z2VuZV9lbmV0X2RlbGV0ZV9kZXNjX3JpbmdzKHBkYXRhKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyOwogCX0KIAogCWRzdF9yaW5nX251bSA9IHhnZW5lX2VuZXRfZHN0X3JpbmdfbnVtKHBkYXRhLT5yeF9yaW5nWzBdKTsKQEAgLTE0NzQsNyArMTU1Miw3IEBACiAJCXJldCA9IHBkYXRhLT5jbGVfb3BzLT5jbGVfaW5pdChwZGF0YSk7CiAJCWlmIChyZXQpIHsKIAkJCW5ldGRldl9lcnIobmRldiwgIlByZWNsYXNzIFRyZWUgaW5pdCBlcnJvclxuIik7Ci0JCQlyZXR1cm4gcmV0OworCQkJZ290byBlcnI7CiAJCX0KIAl9IGVsc2UgewogCQlwZGF0YS0+cG9ydF9vcHMtPmNsZV9ieXBhc3MocGRhdGEsIGRzdF9yaW5nX251bSwgYnVmX3Bvb2wtPmlkKTsKQEAgLTE0ODQsNiArMTU2MiwxMCBAQAogCXBkYXRhLT5tYWNfb3BzLT5pbml0KHBkYXRhKTsKIAogCXJldHVybiByZXQ7CisKK2VycjoKKwl4Z2VuZV9lbmV0X2RlbGV0ZV9kZXNjX3JpbmdzKHBkYXRhKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCB4Z2VuZV9lbmV0X3NldHVwX29wcyhzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEpCkBAIC0xNjMxLDggKzE3MTMsOCBAQAogCX0KICNlbmRpZgogCWlmICghcGRhdGEtPmVuZXRfaWQpIHsKLQkJZnJlZV9uZXRkZXYobmRldik7Ci0JCXJldHVybiAtRU5PREVWOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycjsKIAl9CiAKIAlyZXQgPSB4Z2VuZV9lbmV0X2dldF9yZXNvdXJjZXMocGRhdGEpOwpAQCAtMTY0Myw3ICsxNzI1LDcgQEAKIAogCWlmIChwZGF0YS0+cGh5X21vZGUgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1hHTUlJKSB7CiAJCW5kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPOwotCQlwZGF0YS0+bXNzID0gWEdFTkVfRU5FVF9NU1M7CisJCXNwaW5fbG9ja19pbml0KCZwZGF0YS0+bXNzX2xvY2spOwogCX0KIAluZGV2LT5od19mZWF0dXJlcyA9IG5kZXYtPmZlYXR1cmVzOwogCkBAIC0xNjU1LDcgKzE3MzcsNyBAQAogCiAJcmV0ID0geGdlbmVfZW5ldF9pbml0X2h3KHBkYXRhKTsKIAlpZiAocmV0KQotCQlnb3RvIGVycl9uZXRkZXY7CisJCWdvdG8gZXJyOwogCiAJbGlua19zdGF0ZSA9IHBkYXRhLT5tYWNfb3BzLT5saW5rX3N0YXRlOwogCWlmIChwZGF0YS0+cGh5X21vZGUgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1hHTUlJKSB7CkBAIC0xNjY1LDIxICsxNzQ3LDMyIEBACiAJCQlyZXQgPSB4Z2VuZV9lbmV0X21kaW9fY29uZmlnKHBkYXRhKTsKIAkJZWxzZQogCQkJSU5JVF9ERUxBWUVEX1dPUksoJnBkYXRhLT5saW5rX3dvcmssIGxpbmtfc3RhdGUpOworCisJCWlmIChyZXQpCisJCQlnb3RvIGVycjE7CiAJfQotCWlmIChyZXQpCi0JCWdvdG8gZXJyOwogCiAJeGdlbmVfZW5ldF9uYXBpX2FkZChwZGF0YSk7CiAJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOwogCWlmIChyZXQpIHsKIAkJbmV0ZGV2X2VycihuZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIG5ldGRldlxuIik7Ci0JCWdvdG8gZXJyOworCQlnb3RvIGVycjI7CiAJfQogCiAJcmV0dXJuIDA7CiAKLWVycl9uZXRkZXY6Ci0JdW5yZWdpc3Rlcl9uZXRkZXYobmRldik7CitlcnIyOgorCS8qCisJICogSWYgbmVjZXNzYXJ5LCBmcmVlX25ldGRldigpIHdpbGwgY2FsbCBuZXRpZl9uYXBpX2RlbCgpIGFuZCB1bmRvCisJICogdGhlIGVmZmVjdHMgb2YgeGdlbmVfZW5ldF9uYXBpX2FkZCgpJ3MgY2FsbHMgdG8gbmV0aWZfbmFwaV9hZGQoKS4KKwkgKi8KKworCWlmIChwZGF0YS0+bWRpb19kcml2ZXIpCisJCXhnZW5lX2VuZXRfcGh5X2Rpc2Nvbm5lY3QocGRhdGEpOworCWVsc2UgaWYgKHBkYXRhLT5waHlfbW9kZSA9PSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUkpCisJCXhnZW5lX2VuZXRfbWRpb19yZW1vdmUocGRhdGEpOworZXJyMToKKwl4Z2VuZV9lbmV0X2RlbGV0ZV9kZXNjX3JpbmdzKHBkYXRhKTsKIGVycjoKIAlmcmVlX25ldGRldihuZGV2KTsKIAlyZXR1cm4gcmV0OwpAQCAtMTY4OCwxMSArMTc4MSw5IEBACiBzdGF0aWMgaW50IHhnZW5lX2VuZXRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhOwotCWNvbnN0IHN0cnVjdCB4Z2VuZV9tYWNfb3BzICptYWNfb3BzOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwogCiAJcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQltYWNfb3BzID0gcGRhdGEtPm1hY19vcHM7CiAJbmRldiA9IHBkYXRhLT5uZGV2OwogCiAJcnRubF9sb2NrKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9tYWluLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9tYWluLmgKaW5kZXggMjE3NTQ2ZS4uMGNkYTU4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfbWFpbi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X21haW4uaApAQCAtNDcsNyArNDcsNyBAQAogI2RlZmluZSBOVU1fUEtUX0JVRgk2NAogI2RlZmluZSBOVU1fQlVGUE9PTAkzMgogI2RlZmluZSBNQVhfRVhQX0JVRkZTCTI1NgotI2RlZmluZSBYR0VORV9FTkVUX01TUwkxNDQ4CisjZGVmaW5lIE5VTV9NU1NfUkVHCTQKICNkZWZpbmUgWEdFTkVfTUlOX0VORVRfRlJBTUVfU0laRQk2MAogCiAjZGVmaW5lIFhHRU5FX01BWF9FTkVUX0lSUQkxNgpAQCAtMTQzLDcgKzE0Myw3IEBACiAJdm9pZCAoKnJ4X2Rpc2FibGUpKHN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSk7CiAJdm9pZCAoKnNldF9zcGVlZCkoc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhKTsKIAl2b2lkICgqc2V0X21hY19hZGRyKShzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEpOwotCXZvaWQgKCpzZXRfbXNzKShzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEpOworCXZvaWQgKCpzZXRfbXNzKShzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEsIHUxNiBtc3MsIHU4IGluZGV4KTsKIAl2b2lkICgqbGlua19zdGF0ZSkoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIH07CiAKQEAgLTE3NCw3ICsxNzQsNiBAQAogc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwogCXN0cnVjdCBtaWlfYnVzICptZGlvX2J1czsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5X2RldjsKIAlpbnQgcGh5X3NwZWVkOwogCXN0cnVjdCBjbGsgKmNsazsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwpAQCAtMTk2LDYgKzE5NSw3IEBACiAJdm9pZCBfX2lvbWVtICptY3hfbWFjX2FkZHI7CiAJdm9pZCBfX2lvbWVtICptY3hfbWFjX2Nzcl9hZGRyOwogCXZvaWQgX19pb21lbSAqYmFzZV9hZGRyOworCXZvaWQgX19pb21lbSAqcGNzX2FkZHI7CiAJdm9pZCBfX2lvbWVtICpyaW5nX2Nzcl9hZGRyOwogCXZvaWQgX19pb21lbSAqcmluZ19jbWRfYWRkcjsKIAlpbnQgcGh5X21vZGU7CkBAIC0yMTIsMTAgKzIxMiwxMyBAQAogCXU4IGV0aF9idWZudW07CiAJdTggYnBfYnVmbnVtOwogCXUxNiByaW5nX251bTsKLQl1MzIgbXNzOworCXUzMiBtc3NbTlVNX01TU19SRUddOworCXUzMiBtc3NfcmVmY250W05VTV9NU1NfUkVHXTsKKwlzcGlubG9ja190IG1zc19sb2NrOyAgLyogbXNzIGxvY2sgKi8KIAl1OCB0eF9kZWxheTsKIAl1OCByeF9kZWxheTsKIAlib29sIG1kaW9fZHJpdmVyOworCXN0cnVjdCBncGlvX2Rlc2MgKnNmcF9yZHk7CiB9OwogCiBzdHJ1Y3QgeGdlbmVfaW5kaXJlY3RfY3RsIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X3hnbWFjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF94Z21hYy5jCmluZGV4IDljNmFkMGQuLjY0NzVmMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X3hnbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfeGdtYWMuYwpAQCAtMTgsNiArMTgsOCBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSAieGdlbmVfZW5ldF9tYWluLmgiCiAjaW5jbHVkZSAieGdlbmVfZW5ldF9ody5oIgogI2luY2x1ZGUgInhnZW5lX2VuZXRfeGdtYWMuaCIKQEAgLTg0LDYgKzg2LDIxIEBACiAJCQkgICB3cl9hZGRyKTsKIH0KIAorc3RhdGljIHZvaWQgeGdlbmVfZW5ldF93cl9wY3Moc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhLAorCQkJICAgICAgdTMyIHdyX2FkZHIsIHUzMiB3cl9kYXRhKQoreworCXZvaWQgX19pb21lbSAqYWRkciwgKndyLCAqY21kLCAqY21kX2RvbmU7CisKKwlhZGRyID0gcGRhdGEtPnBjc19hZGRyICsgUENTX0FERFJfUkVHX09GRlNFVDsKKwl3ciA9IHBkYXRhLT5wY3NfYWRkciArIFBDU19XUklURV9SRUdfT0ZGU0VUOworCWNtZCA9IHBkYXRhLT5wY3NfYWRkciArIFBDU19DT01NQU5EX1JFR19PRkZTRVQ7CisJY21kX2RvbmUgPSBwZGF0YS0+cGNzX2FkZHIgKyBQQ1NfQ09NTUFORF9ET05FX1JFR19PRkZTRVQ7CisKKwlpZiAoIXhnZW5lX2VuZXRfd3JfaW5kaXJlY3QoYWRkciwgd3IsIGNtZCwgY21kX2RvbmUsIHdyX2FkZHIsIHdyX2RhdGEpKQorCQluZXRkZXZfZXJyKHBkYXRhLT5uZGV2LCAiUENTIHdyaXRlIGZhaWxlZCwgYWRkcjogJTA0eFxuIiwKKwkJCSAgIHdyX2FkZHIpOworfQorCiBzdGF0aWMgdm9pZCB4Z2VuZV9lbmV0X3JkX2NzcihzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEsCiAJCQkgICAgICB1MzIgb2Zmc2V0LCB1MzIgKnZhbCkKIHsKQEAgLTEyMiw2ICsxMzksNyBAQAogCiAJcmV0dXJuIHRydWU7CiB9CisKIHN0YXRpYyB2b2lkIHhnZW5lX2VuZXRfcmRfbWFjKHN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSwKIAkJCSAgICAgIHUzMiByZF9hZGRyLCB1MzIgKnJkX2RhdGEpCiB7CkBAIC0xMzcsNiArMTU1LDI1IEBACiAJCQkgICByZF9hZGRyKTsKIH0KIAorc3RhdGljIGJvb2wgeGdlbmVfZW5ldF9yZF9wY3Moc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhLAorCQkJICAgICAgdTMyIHJkX2FkZHIsIHUzMiAqcmRfZGF0YSkKK3sKKwl2b2lkIF9faW9tZW0gKmFkZHIsICpyZCwgKmNtZCwgKmNtZF9kb25lOworCWJvb2wgc3VjY2VzczsKKworCWFkZHIgPSBwZGF0YS0+cGNzX2FkZHIgKyBQQ1NfQUREUl9SRUdfT0ZGU0VUOworCXJkID0gcGRhdGEtPnBjc19hZGRyICsgUENTX1JFQURfUkVHX09GRlNFVDsKKwljbWQgPSBwZGF0YS0+cGNzX2FkZHIgKyBQQ1NfQ09NTUFORF9SRUdfT0ZGU0VUOworCWNtZF9kb25lID0gcGRhdGEtPnBjc19hZGRyICsgUENTX0NPTU1BTkRfRE9ORV9SRUdfT0ZGU0VUOworCisJc3VjY2VzcyA9IHhnZW5lX2VuZXRfcmRfaW5kaXJlY3QoYWRkciwgcmQsIGNtZCwgY21kX2RvbmUsIHJkX2FkZHIsIHJkX2RhdGEpOworCWlmICghc3VjY2VzcykKKwkJbmV0ZGV2X2VycihwZGF0YS0+bmRldiwgIlBDUyByZWFkIGZhaWxlZCwgYWRkcjogJTA0eFxuIiwKKwkJCSAgIHJkX2FkZHIpOworCisJcmV0dXJuIHN1Y2Nlc3M7Cit9CisKIHN0YXRpYyBpbnQgeGdlbmVfZW5ldF9lY2NfaW5pdChzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwZGF0YS0+bmRldjsKQEAgLTE3MSw2ICsyMDgsMTcgQEAKIAl4Z2VuZV9lbmV0X3dyX21hYyhwZGF0YSwgQVhHTUFDX0NPTkZJR18wLCAwKTsKIH0KIAorc3RhdGljIHZvaWQgeGdlbmVfcGNzX3Jlc2V0KHN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSkKK3sKKwl1MzIgZGF0YTsKKworCWlmICgheGdlbmVfZW5ldF9yZF9wY3MocGRhdGEsIFBDU19DT05UUk9MXzEsICZkYXRhKSkKKwkJcmV0dXJuOworCisJeGdlbmVfZW5ldF93cl9wY3MocGRhdGEsIFBDU19DT05UUk9MXzEsIGRhdGEgfCBQQ1NfQ1RSTF9QQ1NfUlNUKTsKKwl4Z2VuZV9lbmV0X3dyX3BjcyhwZGF0YSwgUENTX0NPTlRST0xfMSwgZGF0YSAmIH5QQ1NfQ1RSTF9QQ1NfUlNUKTsKK30KKwogc3RhdGljIHZvaWQgeGdlbmVfeGdtYWNfc2V0X21hY19hZGRyKHN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSkKIHsKIAl1MzIgYWRkcjAsIGFkZHIxOwpAQCAtMTg0LDkgKzIzMiwyMiBAQAogCXhnZW5lX2VuZXRfd3JfbWFjKHBkYXRhLCBIU1RNQUNBRFJfTVNXX0FERFIsIGFkZHIxKTsKIH0KIAotc3RhdGljIHZvaWQgeGdlbmVfeGdtYWNfc2V0X21zcyhzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEpCitzdGF0aWMgdm9pZCB4Z2VuZV94Z21hY19zZXRfbXNzKHN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSwKKwkJCQl1MTYgbXNzLCB1OCBpbmRleCkKIHsKLQl4Z2VuZV9lbmV0X3dyX2NzcihwZGF0YSwgWEdfVFNJRl9NU1NfUkVHMF9BRERSLCBwZGF0YS0+bXNzKTsKKwl1OCBvZmZzZXQ7CisJdTMyIGRhdGE7CisKKwlvZmZzZXQgPSAoaW5kZXggPCAyKSA/IDAgOiA0OworCXhnZW5lX2VuZXRfcmRfY3NyKHBkYXRhLCBYR19UU0lGX01TU19SRUcwX0FERFIgKyBvZmZzZXQsICZkYXRhKTsKKworCWlmICghKGluZGV4ICYgMHgxKSkKKwkJZGF0YSA9IFNFVF9WQUwoVFNPX01TUzEsIGRhdGEgPj4gVFNPX01TUzFfUE9TKSB8CisJCQlTRVRfVkFMKFRTT19NU1MwLCBtc3MpOworCWVsc2UKKwkJZGF0YSA9IFNFVF9WQUwoVFNPX01TUzEsIG1zcykgfCBTRVRfVkFMKFRTT19NU1MwLCBkYXRhKTsKKworCXhnZW5lX2VuZXRfd3JfY3NyKHBkYXRhLCBYR19UU0lGX01TU19SRUcwX0FERFIgKyBvZmZzZXQsIGRhdGEpOwogfQogCiBzdGF0aWMgdTMyIHhnZW5lX2VuZXRfbGlua19zdGF0dXMoc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhKQpAQCAtMjEwLDE4ICsyNzEsMTcgQEAKIAl4Z2VuZV9lbmV0X3dyX21hYyhwZGF0YSwgQVhHTUFDX0NPTkZJR18xLCBkYXRhKTsKIAogCXhnZW5lX3hnbWFjX3NldF9tYWNfYWRkcihwZGF0YSk7Ci0JeGdlbmVfeGdtYWNfc2V0X21zcyhwZGF0YSk7CiAKIAl4Z2VuZV9lbmV0X3JkX2NzcihwZGF0YSwgWEdfUlNJRl9DT05GSUdfUkVHX0FERFIsICZkYXRhKTsKIAlkYXRhIHw9IENGR19SU0lGX0ZQQlVGRl9USU1FT1VUX0VOOwogCXhnZW5lX2VuZXRfd3JfY3NyKHBkYXRhLCBYR19SU0lGX0NPTkZJR19SRUdfQUREUiwgZGF0YSk7CiAKLQl4Z2VuZV9lbmV0X3dyX2NzcihwZGF0YSwgWEdfQ0ZHX0JZUEFTU19BRERSLCBSRVNVTUVfVFgpOwotCXhnZW5lX2VuZXRfd3JfY3NyKHBkYXRhLCBYR0VORVRfUlhfRFZfR0FURV9SRUdfMF9BRERSLCAwKTsKIAl4Z2VuZV9lbmV0X3JkX2NzcihwZGF0YSwgWEdfRU5FVF9TUEFSRV9DRkdfUkVHX0FERFIsICZkYXRhKTsKIAlkYXRhIHw9IEJJVCgxMik7CiAJeGdlbmVfZW5ldF93cl9jc3IocGRhdGEsIFhHX0VORVRfU1BBUkVfQ0ZHX1JFR19BRERSLCBkYXRhKTsKIAl4Z2VuZV9lbmV0X3dyX2NzcihwZGF0YSwgWEdfRU5FVF9TUEFSRV9DRkdfUkVHXzFfQUREUiwgMHg4Mik7CisJeGdlbmVfZW5ldF93cl9jc3IocGRhdGEsIFhHRU5FVF9SWF9EVl9HQVRFX1JFR18wX0FERFIsIDApOworCXhnZW5lX2VuZXRfd3JfY3NyKHBkYXRhLCBYR19DRkdfQllQQVNTX0FERFIsIFJFU1VNRV9UWCk7CiB9CiAKIHN0YXRpYyB2b2lkIHhnZW5lX3hnbWFjX3J4X2VuYWJsZShzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEpCkBAIC0zNTksMTQgKzQxOSwxNyBAQAogewogCXN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSA9IGNvbnRhaW5lcl9vZih0b19kZWxheWVkX3dvcmsod29yayksCiAJCQkJCSBzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSwgbGlua193b3JrKTsKKwlzdHJ1Y3QgZ3Bpb19kZXNjICpzZnBfcmR5ID0gcGRhdGEtPnNmcF9yZHk7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwZGF0YS0+bmRldjsKIAl1MzIgbGlua19zdGF0dXMsIHBvbGxfaW50ZXJ2YWw7CiAKIAlsaW5rX3N0YXR1cyA9IHhnZW5lX2VuZXRfbGlua19zdGF0dXMocGRhdGEpOworCWlmIChsaW5rX3N0YXR1cyAmJiAhSVNfRVJSKHNmcF9yZHkpICYmICFncGlvZF9nZXRfdmFsdWUoc2ZwX3JkeSkpCisJCWxpbmtfc3RhdHVzID0gMDsKKwogCWlmIChsaW5rX3N0YXR1cykgewogCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2sobmRldikpIHsKIAkJCW5ldGlmX2NhcnJpZXJfb24obmRldik7Ci0JCQl4Z2VuZV94Z21hY19pbml0KHBkYXRhKTsKIAkJCXhnZW5lX3hnbWFjX3J4X2VuYWJsZShwZGF0YSk7CiAJCQl4Z2VuZV94Z21hY190eF9lbmFibGUocGRhdGEpOwogCQkJbmV0ZGV2X2luZm8obmRldiwgIkxpbmsgaXMgVXAgLSAxMEdicHNcbiIpOwpAQCAtMzgwLDYgKzQ0Myw4IEBACiAJCQluZXRkZXZfaW5mbyhuZGV2LCAiTGluayBpcyBEb3duXG4iKTsKIAkJfQogCQlwb2xsX2ludGVydmFsID0gUEhZX1BPTExfTElOS19PRkY7CisKKwkJeGdlbmVfcGNzX3Jlc2V0KHBkYXRhKTsKIAl9CiAKIAlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnBkYXRhLT5saW5rX3dvcmssIHBvbGxfaW50ZXJ2YWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfeGdtYWMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X3hnbWFjLmgKaW5kZXggZjFlYTQ4NS4uMzYwY2NiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfeGdtYWMuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF94Z21hYy5oCkBAIC0yNCw2ICsyNCw3IEBACiAjZGVmaW5lIFgyX0JMT0NLX0VUSF9NQUNfQ1NSX09GRlNFVAkweDMwMDAKICNkZWZpbmUgQkxPQ0tfQVhHX01BQ19PRkZTRVQJCTB4MDgwMAogI2RlZmluZSBCTE9DS19BWEdfTUFDX0NTUl9PRkZTRVQJMHgyMDAwCisjZGVmaW5lIEJMT0NLX1BDU19PRkZTRVQJCTB4MzgwMAogCiAjZGVmaW5lIFhHRU5FVF9DT05GSUdfUkVHX0FERFIJCTB4MjAKICNkZWZpbmUgWEdFTkVUX1NSU1RfQUREUgkJMHgwMApAQCAtNzIsNiArNzMsOSBAQAogI2RlZmluZSBYR19NQ1hfSUNNX0NPTkZJRzBfUkVHXzBfQUREUgkweDAwZTAKICNkZWZpbmUgWEdfTUNYX0lDTV9DT05GSUcyX1JFR18wX0FERFIJMHgwMGU4CiAKKyNkZWZpbmUgUENTX0NPTlRST0xfMQkJCTB4MDAwMAorI2RlZmluZSBQQ1NfQ1RSTF9QQ1NfUlNUCQlCSVQoMTUpCisKIGV4dGVybiBjb25zdCBzdHJ1Y3QgeGdlbmVfbWFjX29wcyB4Z2VuZV94Z21hY19vcHM7CiBleHRlcm4gY29uc3Qgc3RydWN0IHhnZW5lX3BvcnRfb3BzIHhnZW5lX3hncG9ydF9vcHM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FyYy9lbWFjX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FyYy9lbWFjX21haW4uYwppbmRleCA0YmZmMGYzLi5iMGRhOTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcmMvZW1hY19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXJjL2VtYWNfbWFpbi5jCkBAIC03NzEsOCArNzcxLDEwIEBACiAJcHJpdi0+ZGV2ID0gZGV2OwogCiAJcHJpdi0+cmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsICZyZXNfcmVncyk7Ci0JaWYgKElTX0VSUihwcml2LT5yZWdzKSkKLQkJcmV0dXJuIFBUUl9FUlIocHJpdi0+cmVncyk7CisJaWYgKElTX0VSUihwcml2LT5yZWdzKSkgeworCQllcnIgPSBQVFJfRVJSKHByaXYtPnJlZ3MpOworCQlnb3RvIG91dF9wdXRfbm9kZTsKKwl9CiAKIAlkZXZfZGJnKGRldiwgIlJlZ2lzdGVycyBiYXNlIGFkZHJlc3MgaXMgMHglcFxuIiwgcHJpdi0+cmVncyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FyYy9lbWFjX21kaW8uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FyYy9lbWFjX21kaW8uYwppbmRleCAwNTg0NjBiLi5hMjI0MDNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcmMvZW1hY19tZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXJjL2VtYWNfbWRpby5jCkBAIC0xMDQsNyArMTA0LDcgQEAKICAqIEBidXM6IHBvaW50cyB0byB0aGUgbWlpX2J1cyBzdHJ1Y3R1cmUKICAqIERlc2NyaXB0aW9uOiByZXNldCB0aGUgTUlJIGJ1cwogICovCi1pbnQgYXJjX21kaW9fcmVzZXQoc3RydWN0IG1paV9idXMgKmJ1cykKK3N0YXRpYyBpbnQgYXJjX21kaW9fcmVzZXQoc3RydWN0IG1paV9idXMgKmJ1cykKIHsKIAlzdHJ1Y3QgYXJjX2VtYWNfcHJpdiAqcHJpdiA9IGJ1cy0+cHJpdjsKIAlzdHJ1Y3QgYXJjX2VtYWNfbWRpb19idXNfZGF0YSAqZGF0YSA9ICZwcml2LT5idXNfZGF0YTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYWx4L2FseC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hbHgvYWx4LmgKaW5kZXggOGZjOTNjNS4uNmNhYzkxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hbHgvYWx4LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hbHgvYWx4LmgKQEAgLTc2LDExICs3NiwxOSBAQAogCUFMWF9ERVZfUVVJUktfTVNJX0lOVFhfRElTQUJMRV9CVUcgPSBCSVQoMCksCiB9OwogCisjZGVmaW5lIEFMWF9GTEFHX1VTSU5HX01TSVgJQklUKDApCisjZGVmaW5lIEFMWF9GTEFHX1VTSU5HX01TSQlCSVQoMSkKKwogc3RydWN0IGFseF9wcml2IHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCiAJc3RydWN0IGFseF9odyBodzsKIAorCS8qIG1zaS14IHZlY3RvcnMgKi8KKwlpbnQgbnVtX3ZlYzsKKwlzdHJ1Y3QgbXNpeF9lbnRyeSAqbXNpeF9lbnRyaWVzOworCWNoYXIgaXJxX2xibFtJRk5BTVNJWiArIDhdOworCiAJLyogYWxsIGRlc2NyaXB0b3IgbWVtb3J5ICovCiAJc3RydWN0IHsKIAkJZG1hX2FkZHJfdCBkbWE7CkBAIC0xMDUsNyArMTEzLDcgQEAKIAogCXUxNiBtc2dfZW5hYmxlOwogCi0JYm9vbCBtc2k7CisJaW50IGZsYWdzOwogCiAJLyogcHJvdGVjdHMgaHcuc3RhdHMgKi8KIAlzcGlubG9ja190IHN0YXRzX2xvY2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2FseC9ody5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hbHgvaHcuYwppbmRleCAxZmUzNWU0Li42YWM0MGIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2FseC9ody5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYWx4L2h3LmMKQEAgLTEwMzEsNiArMTAzMSwyMCBAQAogCWFseF93cml0ZV9tZW0zMihodywgQUxYX1dSUiwgdmFsKTsKIH0KIAordm9pZCBhbHhfbWFza19tc2l4KHN0cnVjdCBhbHhfaHcgKmh3LCBpbnQgaW5kZXgsIGJvb2wgbWFzaykKK3sKKwl1MzIgcmVnLCB2YWw7CisKKwlyZWcgPSBBTFhfTVNJWF9FTlRSWV9CQVNFICsgaW5kZXggKiBQQ0lfTVNJWF9FTlRSWV9TSVpFICsKKwkJUENJX01TSVhfRU5UUllfVkVDVE9SX0NUUkw7CisKKwl2YWwgPSBtYXNrID8gUENJX01TSVhfRU5UUllfQ1RSTF9NQVNLQklUIDogMDsKKworCWFseF93cml0ZV9tZW0zMihodywgcmVnLCB2YWwpOworCWFseF9wb3N0X3dyaXRlKGh3KTsKK30KKworCiBib29sIGFseF9nZXRfcGh5X2luZm8oc3RydWN0IGFseF9odyAqaHcpCiB7CiAJdTE2ICBkZXZzMSwgZGV2czI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2FseC9ody5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hbHgvaHcuaAppbmRleCBmMjg5YzA1Li4wMTkxNDc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2FseC9ody5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYWx4L2h3LmgKQEAgLTU2Miw2ICs1NjIsNyBAQAogdm9pZCBhbHhfc2V0X21hY2FkZHIoc3RydWN0IGFseF9odyAqaHcsIGNvbnN0IHU4ICphZGRyKTsKIGJvb2wgYWx4X3BoeV9jb25maWd1cmVkKHN0cnVjdCBhbHhfaHcgKmh3KTsKIHZvaWQgYWx4X2NvbmZpZ3VyZV9iYXNpYyhzdHJ1Y3QgYWx4X2h3ICpodyk7Cit2b2lkIGFseF9tYXNrX21zaXgoc3RydWN0IGFseF9odyAqaHcsIGludCBpbmRleCwgYm9vbCBtYXNrKTsKIHZvaWQgYWx4X2Rpc2FibGVfcnNzKHN0cnVjdCBhbHhfaHcgKmh3KTsKIGJvb2wgYWx4X2dldF9waHlfaW5mbyhzdHJ1Y3QgYWx4X2h3ICpodyk7CiB2b2lkIGFseF91cGRhdGVfaHdfc3RhdHMoc3RydWN0IGFseF9odyAqaHcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hbHgvbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hbHgvbWFpbi5jCmluZGV4IDY0NTMxNDguLmMwZjg0YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYWx4L21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2FseC9tYWluLmMKQEAgLTUxLDYgKzUxLDkgQEAKIAogY29uc3QgY2hhciBhbHhfZHJ2X25hbWVbXSA9ICJhbHgiOwogCitzdGF0aWMgYm9vbCBtc2l4ID0gZmFsc2U7Cittb2R1bGVfcGFyYW0obXNpeCwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1zaXgsICJFbmFibGUgbXNpLXggaW50ZXJydXB0IHN1cHBvcnQiKTsKIAogc3RhdGljIHZvaWQgYWx4X2ZyZWVfdHhidWYoc3RydWN0IGFseF9wcml2ICphbHgsIGludCBlbnRyeSkKIHsKQEAgLTI5MiwzMiArMjk1LDI5IEBACiAJbmFwaV9jb21wbGV0ZSgmYWx4LT5uYXBpKTsKIAogCS8qIGVuYWJsZSBpbnRlcnJ1cHQgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYWx4LT5pcnFfbG9jaywgZmxhZ3MpOwotCWFseC0+aW50X21hc2sgfD0gQUxYX0lTUl9UWF9RMCB8IEFMWF9JU1JfUlhfUTA7Ci0JYWx4X3dyaXRlX21lbTMyKGh3LCBBTFhfSU1SLCBhbHgtPmludF9tYXNrKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhbHgtPmlycV9sb2NrLCBmbGFncyk7CisJaWYgKGFseC0+ZmxhZ3MgJiBBTFhfRkxBR19VU0lOR19NU0lYKSB7CisJCWFseF9tYXNrX21zaXgoaHcsIDEsIGZhbHNlKTsKKwl9IGVsc2UgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWx4LT5pcnFfbG9jaywgZmxhZ3MpOworCQlhbHgtPmludF9tYXNrIHw9IEFMWF9JU1JfVFhfUTAgfCBBTFhfSVNSX1JYX1EwOworCQlhbHhfd3JpdGVfbWVtMzIoaHcsIEFMWF9JTVIsIGFseC0+aW50X21hc2spOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhbHgtPmlycV9sb2NrLCBmbGFncyk7CisJfQogCiAJYWx4X3Bvc3Rfd3JpdGUoaHcpOwogCiAJcmV0dXJuIHdvcms7CiB9CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBhbHhfaW50cl9oYW5kbGUoc3RydWN0IGFseF9wcml2ICphbHgsIHUzMiBpbnRyKQorc3RhdGljIGJvb2wgYWx4X2ludHJfaGFuZGxlX21pc2Moc3RydWN0IGFseF9wcml2ICphbHgsIHUzMiBpbnRyKQogewogCXN0cnVjdCBhbHhfaHcgKmh3ID0gJmFseC0+aHc7Ci0JYm9vbCB3cml0ZV9pbnRfbWFzayA9IGZhbHNlOwotCi0Jc3Bpbl9sb2NrKCZhbHgtPmlycV9sb2NrKTsKLQotCS8qIEFDSyBpbnRlcnJ1cHQgKi8KLQlhbHhfd3JpdGVfbWVtMzIoaHcsIEFMWF9JU1IsIGludHIgfCBBTFhfSVNSX0RJUyk7Ci0JaW50ciAmPSBhbHgtPmludF9tYXNrOwogCiAJaWYgKGludHIgJiBBTFhfSVNSX0ZBVEFMKSB7CiAJCW5ldGlmX3dhcm4oYWx4LCBodywgYWx4LT5kZXYsCiAJCQkgICAiZmF0YWwgaW50ZXJydXB0IDB4JXgsIHJlc2V0dGluZ1xuIiwgaW50cik7CiAJCWFseF9zY2hlZHVsZV9yZXNldChhbHgpOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuIHRydWU7CiAJfQogCiAJaWYgKGludHIgJiBBTFhfSVNSX0FMRVJUKQpAQCAtMzI5LDE5ICszMjksMzIgQEAKIAkJICogaXMgY2xlYXJlZCwgdGhlIGludGVycnVwdCBzdGF0dXMgY291bGQgYmUgY2xlYXJlZC4KIAkJICovCiAJCWFseC0+aW50X21hc2sgJj0gfkFMWF9JU1JfUEhZOwotCQl3cml0ZV9pbnRfbWFzayA9IHRydWU7CisJCWFseF93cml0ZV9tZW0zMihodywgQUxYX0lNUiwgYWx4LT5pbnRfbWFzayk7CiAJCWFseF9zY2hlZHVsZV9saW5rX2NoZWNrKGFseCk7CiAJfQogCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYWx4X2ludHJfaGFuZGxlKHN0cnVjdCBhbHhfcHJpdiAqYWx4LCB1MzIgaW50cikKK3sKKwlzdHJ1Y3QgYWx4X2h3ICpodyA9ICZhbHgtPmh3OworCisJc3Bpbl9sb2NrKCZhbHgtPmlycV9sb2NrKTsKKworCS8qIEFDSyBpbnRlcnJ1cHQgKi8KKwlhbHhfd3JpdGVfbWVtMzIoaHcsIEFMWF9JU1IsIGludHIgfCBBTFhfSVNSX0RJUyk7CisJaW50ciAmPSBhbHgtPmludF9tYXNrOworCisJaWYgKGFseF9pbnRyX2hhbmRsZV9taXNjKGFseCwgaW50cikpCisJCWdvdG8gb3V0OworCiAJaWYgKGludHIgJiAoQUxYX0lTUl9UWF9RMCB8IEFMWF9JU1JfUlhfUTApKSB7CiAJCW5hcGlfc2NoZWR1bGUoJmFseC0+bmFwaSk7CiAJCS8qIG1hc2sgcngvdHggaW50ZXJydXB0LCBlbmFibGUgdGhlbSB3aGVuIG5hcGkgY29tcGxldGUgKi8KIAkJYWx4LT5pbnRfbWFzayAmPSB+QUxYX0lTUl9BTExfUVVFVUVTOwotCQl3cml0ZV9pbnRfbWFzayA9IHRydWU7Ci0JfQotCi0JaWYgKHdyaXRlX2ludF9tYXNrKQogCQlhbHhfd3JpdGVfbWVtMzIoaHcsIEFMWF9JTVIsIGFseC0+aW50X21hc2spOworCX0KIAogCWFseF93cml0ZV9tZW0zMihodywgQUxYX0lTUiwgMCk7CiAKQEAgLTM1MCw2ICszNjMsNDYgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKK3N0YXRpYyBpcnFyZXR1cm5fdCBhbHhfaW50cl9tc2l4X3JpbmcoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYWx4X3ByaXYgKmFseCA9IGRhdGE7CisJc3RydWN0IGFseF9odyAqaHcgPSAmYWx4LT5odzsKKworCS8qIG1hc2sgaW50ZXJydXB0IHRvIEFDSyBjaGlwICovCisJYWx4X21hc2tfbXNpeChodywgMSwgdHJ1ZSk7CisJLyogY2xlYXIgaW50ZXJydXB0IHN0YXR1cyAqLworCWFseF93cml0ZV9tZW0zMihodywgQUxYX0lTUiwgKEFMWF9JU1JfVFhfUTAgfCBBTFhfSVNSX1JYX1EwKSk7CisKKwluYXBpX3NjaGVkdWxlKCZhbHgtPm5hcGkpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYWx4X2ludHJfbXNpeF9taXNjKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGFseF9wcml2ICphbHggPSBkYXRhOworCXN0cnVjdCBhbHhfaHcgKmh3ID0gJmFseC0+aHc7CisJdTMyIGludHI7CisKKwkvKiBtYXNrIGludGVycnVwdCB0byBBQ0sgY2hpcCAqLworCWFseF9tYXNrX21zaXgoaHcsIDAsIHRydWUpOworCisJLyogcmVhZCBpbnRlcnJ1cHQgc3RhdHVzICovCisJaW50ciA9IGFseF9yZWFkX21lbTMyKGh3LCBBTFhfSVNSKTsKKwlpbnRyICY9IChhbHgtPmludF9tYXNrICYgfkFMWF9JU1JfQUxMX1FVRVVFUyk7CisKKwlpZiAoYWx4X2ludHJfaGFuZGxlX21pc2MoYWx4LCBpbnRyKSkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJLyogY2xlYXIgaW50ZXJydXB0IHN0YXR1cyAqLworCWFseF93cml0ZV9tZW0zMihodywgQUxYX0lTUiwgaW50cik7CisKKwkvKiBlbmFibGUgaW50ZXJydXB0IGFnYWluICovCisJYWx4X21hc2tfbXNpeChodywgMCwgZmFsc2UpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCiBzdGF0aWMgaXJxcmV0dXJuX3QgYWx4X2ludHJfbXNpKGludCBpcnEsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGFseF9wcml2ICphbHggPSBkYXRhOwpAQCAtNjE0LDMxICs2NjcsMTM2IEBACiBzdGF0aWMgdm9pZCBhbHhfY29uZmlnX3ZlY3Rvcl9tYXBwaW5nKHN0cnVjdCBhbHhfcHJpdiAqYWx4KQogewogCXN0cnVjdCBhbHhfaHcgKmh3ID0gJmFseC0+aHc7CisJdTMyIHRibCA9IDA7CiAKLQlhbHhfd3JpdGVfbWVtMzIoaHcsIEFMWF9NU0lfTUFQX1RCTDEsIDApOworCWlmIChhbHgtPmZsYWdzICYgQUxYX0ZMQUdfVVNJTkdfTVNJWCkgeworCQl0YmwgfD0gMSA8PCBBTFhfTVNJX01BUF9UQkwxX1RYUTBfU0hJRlQ7CisJCXRibCB8PSAxIDw8IEFMWF9NU0lfTUFQX1RCTDFfUlhRMF9TSElGVDsKKwl9CisKKwlhbHhfd3JpdGVfbWVtMzIoaHcsIEFMWF9NU0lfTUFQX1RCTDEsIHRibCk7CiAJYWx4X3dyaXRlX21lbTMyKGh3LCBBTFhfTVNJX01BUF9UQkwyLCAwKTsKIAlhbHhfd3JpdGVfbWVtMzIoaHcsIEFMWF9NU0lfSURfTUFQLCAwKTsKIH0KIAorc3RhdGljIGJvb2wgYWx4X2VuYWJsZV9tc2l4KHN0cnVjdCBhbHhfcHJpdiAqYWx4KQoreworCWludCBpLCBlcnIsIG51bV92ZWMgPSAyOworCisJYWx4LT5tc2l4X2VudHJpZXMgPSBrY2FsbG9jKG51bV92ZWMsIHNpemVvZihzdHJ1Y3QgbXNpeF9lbnRyeSksCisJCQkJICAgIEdGUF9LRVJORUwpOworCWlmICghYWx4LT5tc2l4X2VudHJpZXMpIHsKKwkJbmV0ZGV2X3dhcm4oYWx4LT5kZXYsICJBbGxvY2F0aW9uIG9mIG1zaXggZW50cmllcyBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBudW1fdmVjOyBpKyspCisJCWFseC0+bXNpeF9lbnRyaWVzW2ldLmVudHJ5ID0gaTsKKworCWVyciA9IHBjaV9lbmFibGVfbXNpeChhbHgtPmh3LnBkZXYsIGFseC0+bXNpeF9lbnRyaWVzLCBudW1fdmVjKTsKKwlpZiAoZXJyKSB7CisJCWtmcmVlKGFseC0+bXNpeF9lbnRyaWVzKTsKKwkJbmV0ZGV2X3dhcm4oYWx4LT5kZXYsICJFbmFibGluZyBNU0ktWCBpbnRlcnJ1cHRzIGZhaWxlZCFcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJYWx4LT5udW1fdmVjID0gbnVtX3ZlYzsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludCBhbHhfcmVxdWVzdF9tc2l4KHN0cnVjdCBhbHhfcHJpdiAqYWx4KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhbHgtPmRldjsKKwlpbnQgaSwgZXJyLCB2ZWN0b3IgPSAwLCBmcmVlX3ZlY3RvciA9IDA7CisKKwllcnIgPSByZXF1ZXN0X2lycShhbHgtPm1zaXhfZW50cmllc1swXS52ZWN0b3IsIGFseF9pbnRyX21zaXhfbWlzYywKKwkJCSAgMCwgbmV0ZGV2LT5uYW1lLCBhbHgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2VycjsKKworCXZlY3RvcisrOworCXNwcmludGYoYWx4LT5pcnFfbGJsLCAiJXMtVHhSeC0wIiwgbmV0ZGV2LT5uYW1lKTsKKworCWVyciA9IHJlcXVlc3RfaXJxKGFseC0+bXNpeF9lbnRyaWVzW3ZlY3Rvcl0udmVjdG9yLAorCQkJICBhbHhfaW50cl9tc2l4X3JpbmcsIDAsIGFseC0+aXJxX2xibCwgYWx4KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2ZyZWU7CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWU6CisJZnJlZV9pcnEoYWx4LT5tc2l4X2VudHJpZXNbZnJlZV92ZWN0b3IrK10udmVjdG9yLCBhbHgpOworCisJdmVjdG9yLS07CisJZm9yIChpID0gMDsgaSA8IHZlY3RvcjsgaSsrKQorCQlmcmVlX2lycShhbHgtPm1zaXhfZW50cmllc1tmcmVlX3ZlY3RvcisrXS52ZWN0b3IsIGFseCk7CisKK291dF9lcnI6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgYWx4X2luaXRfaW50cihzdHJ1Y3QgYWx4X3ByaXYgKmFseCwgYm9vbCBtc2l4KQoreworCWlmIChtc2l4KSB7CisJCWlmIChhbHhfZW5hYmxlX21zaXgoYWx4KSkKKwkJCWFseC0+ZmxhZ3MgfD0gQUxYX0ZMQUdfVVNJTkdfTVNJWDsKKwl9CisKKwlpZiAoIShhbHgtPmZsYWdzICYgQUxYX0ZMQUdfVVNJTkdfTVNJWCkpIHsKKwkJYWx4LT5udW1fdmVjID0gMTsKKworCQlpZiAoIXBjaV9lbmFibGVfbXNpKGFseC0+aHcucGRldikpCisJCQlhbHgtPmZsYWdzIHw9IEFMWF9GTEFHX1VTSU5HX01TSTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFseF9kaXNhYmxlX2FkdmFuY2VkX2ludHIoc3RydWN0IGFseF9wcml2ICphbHgpCit7CisJaWYgKGFseC0+ZmxhZ3MgJiBBTFhfRkxBR19VU0lOR19NU0lYKSB7CisJCWtmcmVlKGFseC0+bXNpeF9lbnRyaWVzKTsKKwkJcGNpX2Rpc2FibGVfbXNpeChhbHgtPmh3LnBkZXYpOworCQlhbHgtPmZsYWdzICY9IH5BTFhfRkxBR19VU0lOR19NU0lYOworCX0KKworCWlmIChhbHgtPmZsYWdzICYgQUxYX0ZMQUdfVVNJTkdfTVNJKSB7CisJCXBjaV9kaXNhYmxlX21zaShhbHgtPmh3LnBkZXYpOworCQlhbHgtPmZsYWdzICY9IH5BTFhfRkxBR19VU0lOR19NU0k7CisJfQorfQorCiBzdGF0aWMgdm9pZCBhbHhfaXJxX2VuYWJsZShzdHJ1Y3QgYWx4X3ByaXYgKmFseCkKIHsKIAlzdHJ1Y3QgYWx4X2h3ICpodyA9ICZhbHgtPmh3OworCWludCBpOwogCiAJLyogbGV2ZWwtMSBpbnRlcnJ1cHQgc3dpdGNoICovCiAJYWx4X3dyaXRlX21lbTMyKGh3LCBBTFhfSVNSLCAwKTsKIAlhbHhfd3JpdGVfbWVtMzIoaHcsIEFMWF9JTVIsIGFseC0+aW50X21hc2spOwogCWFseF9wb3N0X3dyaXRlKGh3KTsKKworCWlmIChhbHgtPmZsYWdzICYgQUxYX0ZMQUdfVVNJTkdfTVNJWCkKKwkJLyogZW5hYmxlIGFsbCBtc2l4IGlycXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IGFseC0+bnVtX3ZlYzsgaSsrKQorCQkJYWx4X21hc2tfbXNpeChodywgaSwgZmFsc2UpOwogfQogCiBzdGF0aWMgdm9pZCBhbHhfaXJxX2Rpc2FibGUoc3RydWN0IGFseF9wcml2ICphbHgpCiB7CiAJc3RydWN0IGFseF9odyAqaHcgPSAmYWx4LT5odzsKKwlpbnQgaTsKIAogCWFseF93cml0ZV9tZW0zMihodywgQUxYX0lTUiwgQUxYX0lTUl9ESVMpOwogCWFseF93cml0ZV9tZW0zMihodywgQUxYX0lNUiwgMCk7CiAJYWx4X3Bvc3Rfd3JpdGUoaHcpOwogCi0Jc3luY2hyb25pemVfaXJxKGFseC0+aHcucGRldi0+aXJxKTsKKwlpZiAoYWx4LT5mbGFncyAmIEFMWF9GTEFHX1VTSU5HX01TSVgpIHsKKwkJZm9yIChpID0gMDsgaSA8IGFseC0+bnVtX3ZlYzsgaSsrKSB7CisJCQlhbHhfbWFza19tc2l4KGh3LCBpLCB0cnVlKTsKKwkJCXN5bmNocm9uaXplX2lycShhbHgtPm1zaXhfZW50cmllc1tpXS52ZWN0b3IpOworCQl9CisJfSBlbHNlIHsKKwkJc3luY2hyb25pemVfaXJxKGFseC0+aHcucGRldi0+aXJxKTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgYWx4X3JlcXVlc3RfaXJxKHN0cnVjdCBhbHhfcHJpdiAqYWx4KQpAQCAtNjUwLDkgKzgwOCwxOCBAQAogCiAJbXNpX2N0cmwgPSAoaHctPmltdCA+PiAxKSA8PCBBTFhfTVNJX1JFVFJBTlNfVE1fU0hJRlQ7CiAKLQlpZiAoIXBjaV9lbmFibGVfbXNpKGFseC0+aHcucGRldikpIHsKLQkJYWx4LT5tc2kgPSB0cnVlOworCWlmIChhbHgtPmZsYWdzICYgQUxYX0ZMQUdfVVNJTkdfTVNJWCkgeworCQlhbHhfd3JpdGVfbWVtMzIoaHcsIEFMWF9NU0lfUkVUUkFOU19USU1FUiwgbXNpX2N0cmwpOworCQllcnIgPSBhbHhfcmVxdWVzdF9tc2l4KGFseCk7CisJCWlmICghZXJyKQorCQkJZ290byBvdXQ7CiAKKwkJLyogbXNpeCByZXF1ZXN0IGZhaWxlZCwgcmVhbGxvYyByZXNvdXJjZXMgKi8KKwkJYWx4X2Rpc2FibGVfYWR2YW5jZWRfaW50cihhbHgpOworCQlhbHhfaW5pdF9pbnRyKGFseCwgZmFsc2UpOworCX0KKworCWlmIChhbHgtPmZsYWdzICYgQUxYX0ZMQUdfVVNJTkdfTVNJKSB7CiAJCWFseF93cml0ZV9tZW0zMihodywgQUxYX01TSV9SRVRSQU5TX1RJTUVSLAogCQkJCW1zaV9jdHJsIHwgQUxYX01TSV9NQVNLX1NFTF9MSU5FKTsKIAkJZXJyID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBhbHhfaW50cl9tc2ksIDAsCkBAIC02NjAsNiArODI3LDcgQEAKIAkJaWYgKCFlcnIpCiAJCQlnb3RvIG91dDsKIAkJLyogZmFsbCBiYWNrIHRvIGxlZ2FjeSBpbnRlcnJ1cHQgKi8KKwkJYWx4LT5mbGFncyAmPSB+QUxYX0ZMQUdfVVNJTkdfTVNJOwogCQlwY2lfZGlzYWJsZV9tc2koYWx4LT5ody5wZGV2KTsKIAl9CiAKQEAgLTY2OSwxOSArODM3LDI1IEBACiBvdXQ6CiAJaWYgKCFlcnIpCiAJCWFseF9jb25maWdfdmVjdG9yX21hcHBpbmcoYWx4KTsKKwllbHNlCisJCW5ldGRldl9lcnIoYWx4LT5kZXYsICJJUlEgcmVnaXN0cmF0aW9uIGZhaWxlZCFcbiIpOwogCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIGFseF9mcmVlX2lycShzdHJ1Y3QgYWx4X3ByaXYgKmFseCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFseC0+aHcucGRldjsKKwlpbnQgaTsKIAotCWZyZWVfaXJxKHBkZXYtPmlycSwgYWx4KTsKLQotCWlmIChhbHgtPm1zaSkgewotCQlwY2lfZGlzYWJsZV9tc2koYWx4LT5ody5wZGV2KTsKLQkJYWx4LT5tc2kgPSBmYWxzZTsKKwlpZiAoYWx4LT5mbGFncyAmIEFMWF9GTEFHX1VTSU5HX01TSVgpIHsKKwkJLyogd2UgaGF2ZSBvbmx5IDIgdmVjdG9ycyB3aXRob3V0IG11bHRpIHF1ZXVlIHN1cHBvcnQgKi8KKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkJCWZyZWVfaXJxKGFseC0+bXNpeF9lbnRyaWVzW2ldLnZlY3RvciwgYWx4KTsKKwl9IGVsc2UgeworCQlmcmVlX2lycShwZGV2LT5pcnEsIGFseCk7CiAJfQorCisJYWx4X2Rpc2FibGVfYWR2YW5jZWRfaW50cihhbHgpOwogfQogCiBzdGF0aWMgaW50IGFseF9pZGVudGlmeV9odyhzdHJ1Y3QgYWx4X3ByaXYgKmFseCkKQEAgLTg0NywxMiArMTAyMSwxNCBAQAogewogCWludCBlcnI7CiAKKwlhbHhfaW5pdF9pbnRyKGFseCwgbXNpeCk7CisKIAlpZiAoIXJlc3VtZSkKIAkJbmV0aWZfY2Fycmllcl9vZmYoYWx4LT5kZXYpOwogCiAJZXJyID0gYWx4X2FsbG9jX3JpbmdzKGFseCk7CiAJaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwkJZ290byBvdXRfZGlzYWJsZV9hZHZfaW50cjsKIAogCWFseF9jb25maWd1cmUoYWx4KTsKIApAQCAtODczLDYgKzEwNDksOCBAQAogCiBvdXRfZnJlZV9yaW5nczoKIAlhbHhfZnJlZV9yaW5ncyhhbHgpOworb3V0X2Rpc2FibGVfYWR2X2ludHI6CisJYWx4X2Rpc2FibGVfYWR2YW5jZWRfaW50cihhbHgpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTk5Myw2ICsxMTcxLDE4IEBACiAJcnRubF91bmxvY2soKTsKIH0KIAorc3RhdGljIGludCBhbHhfdHBkX3JlcShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBudW07CisKKwludW0gPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsgMTsKKwkvKiB3ZSBuZWVkIG9uZSBleHRyYSBkZXNjcmlwdG9yIGZvciBMU092MiAqLworCWlmIChza2JfaXNfZ3NvKHNrYikgJiYgc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSAmIFNLQl9HU09fVENQVjYpCisJCW51bSsrOworCisJcmV0dXJuIG51bTsKK30KKwogc3RhdGljIGludCBhbHhfdHhfY3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYWx4X3R4ZCAqZmlyc3QpCiB7CiAJdTggY3NvLCBjc3M7CkBAIC0xMDEyLDYgKzEyMDIsNDUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBhbHhfdHNvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBhbHhfdHhkICpmaXJzdCkKK3sKKwlpbnQgZXJyOworCisJaWYgKHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1BBUlRJQUwpCisJCXJldHVybiAwOworCisJaWYgKCFza2JfaXNfZ3NvKHNrYikpCisJCXJldHVybiAwOworCisJZXJyID0gc2tiX2Nvd19oZWFkKHNrYiwgMCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpIHsKKwkJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKKworCQlpcGgtPmNoZWNrID0gMDsKKwkJdGNwX2hkcihza2IpLT5jaGVjayA9IH5jc3VtX3RjcHVkcF9tYWdpYyhpcGgtPnNhZGRyLCBpcGgtPmRhZGRyLAorCQkJCQkJCSAwLCBJUFBST1RPX1RDUCwgMCk7CisJCWZpcnN0LT53b3JkMSB8PSAxIDw8IFRQRF9JUFY0X1NISUZUOworCX0gZWxzZSBpZiAoc2tiX2lzX2dzb192Nihza2IpKSB7CisJCWlwdjZfaGRyKHNrYiktPnBheWxvYWRfbGVuID0gMDsKKwkJdGNwX2hkcihza2IpLT5jaGVjayA9IH5jc3VtX2lwdjZfbWFnaWMoJmlwdjZfaGRyKHNrYiktPnNhZGRyLAorCQkJCQkJICAgICAgICZpcHY2X2hkcihza2IpLT5kYWRkciwKKwkJCQkJCSAgICAgICAwLCBJUFBST1RPX1RDUCwgMCk7CisJCS8qIExTT3YyOiB0aGUgZmlyc3QgVFBEIG9ubHkgcHJvdmlkZXMgdGhlIHBhY2tldCBsZW5ndGggKi8KKwkJZmlyc3QtPmFkcmwubC5wa3RfbGVuID0gc2tiLT5sZW47CisJCWZpcnN0LT53b3JkMSB8PSAxIDw8IFRQRF9MU09fVjJfU0hJRlQ7CisJfQorCisJZmlyc3QtPndvcmQxIHw9IDEgPDwgVFBEX0xTT19FTl9TSElGVDsKKwlmaXJzdC0+d29yZDEgfD0gKHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgJgorCQkJIFRQRF9MNEhEUk9GRlNFVF9NQVNLKSA8PCBUUERfTDRIRFJPRkZTRVRfU0hJRlQ7CisJZmlyc3QtPndvcmQxIHw9IChza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplICYKKwkJCSBUUERfTVNTX01BU0spIDw8IFRQRF9NU1NfU0hJRlQ7CisJcmV0dXJuIDE7Cit9CisKIHN0YXRpYyBpbnQgYWx4X21hcF90eF9za2Ioc3RydWN0IGFseF9wcml2ICphbHgsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGFseF90eF9xdWV1ZSAqdHhxID0gJmFseC0+dHhxOwpAQCAtMTAyMiw2ICsxMjUxLDE2IEBACiAJZmlyc3RfdHBkID0gJnR4cS0+dHBkW3R4cS0+d3JpdGVfaWR4XTsKIAl0cGQgPSBmaXJzdF90cGQ7CiAKKwlpZiAodHBkLT53b3JkMSAmICgxIDw8IFRQRF9MU09fVjJfU0hJRlQpKSB7CisJCWlmICgrK3R4cS0+d3JpdGVfaWR4ID09IGFseC0+dHhfcmluZ3N6KQorCQkJdHhxLT53cml0ZV9pZHggPSAwOworCisJCXRwZCA9ICZ0eHEtPnRwZFt0eHEtPndyaXRlX2lkeF07CisJCXRwZC0+bGVuID0gZmlyc3RfdHBkLT5sZW47CisJCXRwZC0+dmxhbl90YWcgPSBmaXJzdF90cGQtPnZsYW5fdGFnOworCQl0cGQtPndvcmQxID0gZmlyc3RfdHBkLT53b3JkMTsKKwl9CisKIAltYXBsZW4gPSBza2JfaGVhZGxlbihza2IpOwogCWRtYSA9IGRtYV9tYXBfc2luZ2xlKCZhbHgtPmh3LnBkZXYtPmRldiwgc2tiLT5kYXRhLCBtYXBsZW4sCiAJCQkgICAgIERNQV9UT19ERVZJQ0UpOwpAQCAtMTA4Miw5ICsxMzIxLDkgQEAKIAlzdHJ1Y3QgYWx4X3ByaXYgKmFseCA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGFseF90eF9xdWV1ZSAqdHhxID0gJmFseC0+dHhxOwogCXN0cnVjdCBhbHhfdHhkICpmaXJzdDsKLQlpbnQgdHBkcmVxID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyArIDE7CisJaW50IHRzbzsKIAotCWlmIChhbHhfdHBkX2F2YWlsKGFseCkgPCB0cGRyZXEpIHsKKwlpZiAoYWx4X3RwZF9hdmFpbChhbHgpIDwgYWx4X3RwZF9yZXEoc2tiKSkgewogCQluZXRpZl9zdG9wX3F1ZXVlKGFseC0+ZGV2KTsKIAkJZ290byBkcm9wOwogCX0KQEAgLTEwOTIsNyArMTMzMSwxMCBAQAogCWZpcnN0ID0gJnR4cS0+dHBkW3R4cS0+d3JpdGVfaWR4XTsKIAltZW1zZXQoZmlyc3QsIDAsIHNpemVvZigqZmlyc3QpKTsKIAotCWlmIChhbHhfdHhfY3N1bShza2IsIGZpcnN0KSkKKwl0c28gPSBhbHhfdHNvKHNrYiwgZmlyc3QpOworCWlmICh0c28gPCAwKQorCQlnb3RvIGRyb3A7CisJZWxzZSBpZiAoIXRzbyAmJiBhbHhfdHhfY3N1bShza2IsIGZpcnN0KSkKIAkJZ290byBkcm9wOwogCiAJaWYgKGFseF9tYXBfdHhfc2tiKGFseCwgc2tiKSA8IDApCkBAIC0xMTcyLDcgKzE0MTQsMTAgQEAKIHsKIAlzdHJ1Y3QgYWx4X3ByaXYgKmFseCA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKLQlpZiAoYWx4LT5tc2kpCisJaWYgKGFseC0+ZmxhZ3MgJiBBTFhfRkxBR19VU0lOR19NU0lYKSB7CisJCWFseF9pbnRyX21zaXhfbWlzYygwLCBhbHgpOworCQlhbHhfaW50cl9tc2l4X3JpbmcoMCwgYWx4KTsKKwl9IGVsc2UgaWYgKGFseC0+ZmxhZ3MgJiBBTFhfRkxBR19VU0lOR19NU0kpCiAJCWFseF9pbnRyX21zaSgwLCBhbHgpOwogCWVsc2UKIAkJYWx4X2ludHJfbGVnYWN5KDAsIGFseCk7CkBAIC0xMzUxLDcgKzE1OTYsMTAgQEAKIAkJfQogCX0KIAotCW5ldGRldi0+aHdfZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwgTkVUSUZfRl9IV19DU1VNOworCW5ldGRldi0+aHdfZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwKKwkJCSAgICAgIE5FVElGX0ZfSFdfQ1NVTSB8CisJCQkgICAgICBORVRJRl9GX1RTTyB8CisJCQkgICAgICBORVRJRl9GX1RTTzY7CiAKIAlpZiAoYWx4X2dldF9wZXJtX21hY2FkZHIoaHcsIGh3LT5wZXJtX2FkZHIpKSB7CiAJCWRldl93YXJuKCZwZGV2LT5kZXYsCkBAIC0xNTQ1LDYgKzE3OTMsOCBAQAogCSAgLmRyaXZlcl9kYXRhID0gQUxYX0RFVl9RVUlSS19NU0lfSU5UWF9ESVNBQkxFX0JVRyB9LAogCXsgUENJX1ZERVZJQ0UoQVRUQU5TSUMsIEFMWF9ERVZfSURfRTI0MDApLAogCSAgLmRyaXZlcl9kYXRhID0gQUxYX0RFVl9RVUlSS19NU0lfSU5UWF9ESVNBQkxFX0JVRyB9LAorCXsgUENJX1ZERVZJQ0UoQVRUQU5TSUMsIEFMWF9ERVZfSURfRTI1MDApLAorCSAgLmRyaXZlcl9kYXRhID0gQUxYX0RFVl9RVUlSS19NU0lfSU5UWF9ESVNBQkxFX0JVRyB9LAogCXsgUENJX1ZERVZJQ0UoQVRUQU5TSUMsIEFMWF9ERVZfSURfQVI4MTYyKSwKIAkgIC5kcml2ZXJfZGF0YSA9IEFMWF9ERVZfUVVJUktfTVNJX0lOVFhfRElTQUJMRV9CVUcgfSwKIAl7IFBDSV9WREVWSUNFKEFUVEFOU0lDLCBBTFhfREVWX0lEX0FSODE3MSkgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYWx4L3JlZy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hbHgvcmVnLmgKaW5kZXggMDk1OWU2OC4uMWZjMmQ4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hbHgvcmVnLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hbHgvcmVnLmgKQEAgLTM4LDYgKzM4LDcgQEAKICNkZWZpbmUgQUxYX0RFVl9JRF9BUjgxNjEJCQkJMHgxMDkxCiAjZGVmaW5lIEFMWF9ERVZfSURfRTIyMDAJCQkJMHhlMDkxCiAjZGVmaW5lIEFMWF9ERVZfSURfRTI0MDAJCQkJMHhlMGExCisjZGVmaW5lIEFMWF9ERVZfSURfRTI1MDAJCQkJMHhlMGIxCiAjZGVmaW5lIEFMWF9ERVZfSURfQVI4MTYyCQkJCTB4MTA5MAogI2RlZmluZSBBTFhfREVWX0lEX0FSODE3MQkJCQkweDEwQTEKICNkZWZpbmUgQUxYX0RFVl9JRF9BUjgxNzIJCQkJMHgxMEEwCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iNDQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2I0NC5jCmluZGV4IDc0ZjBhMzcuLjE3YWEzM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2I0NC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2I0NC5jCkBAIC0xNDg2LDcgKzE0ODYsNyBAQAogCWI0NF9lbmFibGVfaW50cyhicCk7CiAKIAlpZiAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfRVhURVJOQUxfUEhZKQotCQlwaHlfc3RhcnQoYnAtPnBoeWRldik7CisJCXBoeV9zdGFydChkZXYtPnBoeWRldik7CiAKIAluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwogb3V0OgpAQCAtMTY1MSw3ICsxNjUxLDcgQEAKIAluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAKIAlpZiAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfRVhURVJOQUxfUEhZKQotCQlwaHlfc3RvcChicC0+cGh5ZGV2KTsKKwkJcGh5X3N0b3AoZGV2LT5waHlkZXYpOwogCiAJbmFwaV9kaXNhYmxlKCZicC0+bmFwaSk7CiAKQEAgLTE4MzIsOTAgKzE4MzIsMTAwIEBACiAJcmV0dXJuIHI7CiB9CiAKLXN0YXRpYyBpbnQgYjQ0X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3N0YXRpYyBpbnQgYjQ0X2dldF9saW5rX2tzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKIHsKIAlzdHJ1Y3QgYjQ0ICpicCA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIHN1cHBvcnRlZCwgYWR2ZXJ0aXNpbmc7CiAKIAlpZiAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfRVhURVJOQUxfUEhZKSB7Ci0JCUJVR19PTighYnAtPnBoeWRldik7Ci0JCXJldHVybiBwaHlfZXRodG9vbF9nc2V0KGJwLT5waHlkZXYsIGNtZCk7CisJCUJVR19PTighZGV2LT5waHlkZXYpOworCQlyZXR1cm4gcGh5X2V0aHRvb2xfa3NldHRpbmdzX2dldChkZXYtPnBoeWRldiwgY21kKTsKIAl9CiAKLQljbWQtPnN1cHBvcnRlZCA9IChTVVBQT1JURURfQXV0b25lZyk7Ci0JY21kLT5zdXBwb3J0ZWQgfD0gKFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmIHwKLQkJCSAgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgfAotCQkJICBTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKLQkJCSAgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8Ci0JCQkgIFNVUFBPUlRFRF9NSUkpOworCXN1cHBvcnRlZCA9IChTVVBQT1JURURfQXV0b25lZyk7CisJc3VwcG9ydGVkIHw9IChTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8CisJCSAgICAgIFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwKKwkJICAgICAgU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiB8CisJCSAgICAgIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfAorCQkgICAgICBTVVBQT1JURURfTUlJKTsKIAotCWNtZC0+YWR2ZXJ0aXNpbmcgPSAwOworCWFkdmVydGlzaW5nID0gMDsKIAlpZiAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfQURWXzEwSEFMRikKLQkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZjsKKwkJYWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMGJhc2VUX0hhbGY7CiAJaWYgKGJwLT5mbGFncyAmIEI0NF9GTEFHX0FEVl8xMEZVTEwpCi0JCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGw7CisJCWFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTBiYXNlVF9GdWxsOwogCWlmIChicC0+ZmxhZ3MgJiBCNDRfRkxBR19BRFZfMTAwSEFMRikKLQkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGY7CisJCWFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZjsKIAlpZiAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfQURWXzEwMEZVTEwpCi0JCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsOwotCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9QYXVzZSB8IEFEVkVSVElTRURfQXN5bV9QYXVzZTsKLQlldGh0b29sX2NtZF9zcGVlZF9zZXQoY21kLCAoKGJwLT5mbGFncyAmIEI0NF9GTEFHXzEwMF9CQVNFX1QpID8KLQkJCQkgICAgU1BFRURfMTAwIDogU1BFRURfMTApKTsKLQljbWQtPmR1cGxleCA9IChicC0+ZmxhZ3MgJiBCNDRfRkxBR19GVUxMX0RVUExFWCkgPworCQlhZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGw7CisJYWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9QYXVzZSB8IEFEVkVSVElTRURfQXN5bV9QYXVzZTsKKwljbWQtPmJhc2Uuc3BlZWQgPSAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfMTAwX0JBU0VfVCkgPworCQlTUEVFRF8xMDAgOiBTUEVFRF8xMDsKKwljbWQtPmJhc2UuZHVwbGV4ID0gKGJwLT5mbGFncyAmIEI0NF9GTEFHX0ZVTExfRFVQTEVYKSA/CiAJCURVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7Ci0JY21kLT5wb3J0ID0gMDsKLQljbWQtPnBoeV9hZGRyZXNzID0gYnAtPnBoeV9hZGRyOwotCWNtZC0+dHJhbnNjZWl2ZXIgPSAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfRVhURVJOQUxfUEhZKSA/Ci0JCVhDVlJfRVhURVJOQUwgOiBYQ1ZSX0lOVEVSTkFMOwotCWNtZC0+YXV0b25lZyA9IChicC0+ZmxhZ3MgJiBCNDRfRkxBR19GT1JDRV9MSU5LKSA/CisJY21kLT5iYXNlLnBvcnQgPSAwOworCWNtZC0+YmFzZS5waHlfYWRkcmVzcyA9IGJwLT5waHlfYWRkcjsKKwljbWQtPmJhc2UuYXV0b25lZyA9IChicC0+ZmxhZ3MgJiBCNDRfRkxBR19GT1JDRV9MSU5LKSA/CiAJCUFVVE9ORUdfRElTQUJMRSA6IEFVVE9ORUdfRU5BQkxFOwotCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpCi0JCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9BdXRvbmVnOworCWlmIChjbWQtPmJhc2UuYXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkKKwkJYWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9BdXRvbmVnOworCisJZXRodG9vbF9jb252ZXJ0X2xlZ2FjeV91MzJfdG9fbGlua19tb2RlKGNtZC0+bGlua19tb2Rlcy5zdXBwb3J0ZWQsCisJCQkJCQlzdXBwb3J0ZWQpOworCWV0aHRvb2xfY29udmVydF9sZWdhY3lfdTMyX3RvX2xpbmtfbW9kZShjbWQtPmxpbmtfbW9kZXMuYWR2ZXJ0aXNpbmcsCisJCQkJCQlhZHZlcnRpc2luZyk7CisKIAlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSl7Ci0JCWV0aHRvb2xfY21kX3NwZWVkX3NldChjbWQsIDApOwotCQljbWQtPmR1cGxleCA9IDB4ZmY7CisJCWNtZC0+YmFzZS5zcGVlZCA9IDA7CisJCWNtZC0+YmFzZS5kdXBsZXggPSAweGZmOwogCX0KLQljbWQtPm1heHR4cGt0ID0gMDsKLQljbWQtPm1heHJ4cGt0ID0gMDsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGI0NF9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCitzdGF0aWMgaW50IGI0NF9zZXRfbGlua19rc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIGNvbnN0IHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCiB7CiAJc3RydWN0IGI0NCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXUzMiBzcGVlZDsKIAlpbnQgcmV0OworCXUzMiBhZHZlcnRpc2luZzsKIAogCWlmIChicC0+ZmxhZ3MgJiBCNDRfRkxBR19FWFRFUk5BTF9QSFkpIHsKLQkJQlVHX09OKCFicC0+cGh5ZGV2KTsKKwkJQlVHX09OKCFkZXYtPnBoeWRldik7CiAJCXNwaW5fbG9ja19pcnEoJmJwLT5sb2NrKTsKIAkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKIAkJCWI0NF9zZXR1cF9waHkoYnApOwogCi0JCXJldCA9IHBoeV9ldGh0b29sX3NzZXQoYnAtPnBoeWRldiwgY21kKTsKKwkJcmV0ID0gcGh5X2V0aHRvb2xfa3NldHRpbmdzX3NldChkZXYtPnBoeWRldiwgY21kKTsKIAogCQlzcGluX3VubG9ja19pcnEoJmJwLT5sb2NrKTsKIAogCQlyZXR1cm4gcmV0OwogCX0KIAotCXNwZWVkID0gZXRodG9vbF9jbWRfc3BlZWQoY21kKTsKKwlzcGVlZCA9IGNtZC0+YmFzZS5zcGVlZDsKKworCWV0aHRvb2xfY29udmVydF9saW5rX21vZGVfdG9fbGVnYWN5X3UzMigmYWR2ZXJ0aXNpbmcsCisJCQkJCQljbWQtPmxpbmtfbW9kZXMuYWR2ZXJ0aXNpbmcpOwogCiAJLyogV2UgZG8gbm90IHN1cHBvcnQgZ2lnYWJpdC4gKi8KLQlpZiAoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7Ci0JCWlmIChjbWQtPmFkdmVydGlzaW5nICYKKwlpZiAoY21kLT5iYXNlLmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJaWYgKGFkdmVydGlzaW5nICYKIAkJICAgIChBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwKIAkJICAgICBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCX0gZWxzZSBpZiAoKHNwZWVkICE9IFNQRUVEXzEwMCAmJgogCQkgICAgc3BlZWQgIT0gU1BFRURfMTApIHx8Ci0JCSAgIChjbWQtPmR1cGxleCAhPSBEVVBMRVhfSEFMRiAmJgotCQkgICAgY21kLT5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpKSB7CisJCSAgIChjbWQtPmJhc2UuZHVwbGV4ICE9IERVUExFWF9IQUxGICYmCisJCSAgICBjbWQtPmJhc2UuZHVwbGV4ICE9IERVUExFWF9GVUxMKSkgewogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJc3Bpbl9sb2NrX2lycSgmYnAtPmxvY2spOwogCi0JaWYgKGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCWlmIChjbWQtPmJhc2UuYXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgewogCQlicC0+ZmxhZ3MgJj0gfihCNDRfRkxBR19GT1JDRV9MSU5LIHwKIAkJCSAgICAgICBCNDRfRkxBR18xMDBfQkFTRV9UIHwKIAkJCSAgICAgICBCNDRfRkxBR19GVUxMX0RVUExFWCB8CkBAIC0xOTIzLDE5ICsxOTMzLDE5IEBACiAJCQkgICAgICAgQjQ0X0ZMQUdfQURWXzEwRlVMTCB8CiAJCQkgICAgICAgQjQ0X0ZMQUdfQURWXzEwMEhBTEYgfAogCQkJICAgICAgIEI0NF9GTEFHX0FEVl8xMDBGVUxMKTsKLQkJaWYgKGNtZC0+YWR2ZXJ0aXNpbmcgPT0gMCkgeworCQlpZiAoYWR2ZXJ0aXNpbmcgPT0gMCkgewogCQkJYnAtPmZsYWdzIHw9IChCNDRfRkxBR19BRFZfMTBIQUxGIHwKIAkJCQkgICAgICBCNDRfRkxBR19BRFZfMTBGVUxMIHwKIAkJCQkgICAgICBCNDRfRkxBR19BRFZfMTAwSEFMRiB8CiAJCQkJICAgICAgQjQ0X0ZMQUdfQURWXzEwMEZVTEwpOwogCQl9IGVsc2UgewotCQkJaWYgKGNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZikKKwkJCWlmIChhZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTBiYXNlVF9IYWxmKQogCQkJCWJwLT5mbGFncyB8PSBCNDRfRkxBR19BRFZfMTBIQUxGOwotCQkJaWYgKGNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCkKKwkJCWlmIChhZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsKQogCQkJCWJwLT5mbGFncyB8PSBCNDRfRkxBR19BRFZfMTBGVUxMOwotCQkJaWYgKGNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYpCisJCQlpZiAoYWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYpCiAJCQkJYnAtPmZsYWdzIHw9IEI0NF9GTEFHX0FEVl8xMDBIQUxGOwotCQkJaWYgKGNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwpCisJCQlpZiAoYWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwpCiAJCQkJYnAtPmZsYWdzIHw9IEI0NF9GTEFHX0FEVl8xMDBGVUxMOwogCQl9CiAJfSBlbHNlIHsKQEAgLTE5NDMsNyArMTk1Myw3IEBACiAJCWJwLT5mbGFncyAmPSB+KEI0NF9GTEFHXzEwMF9CQVNFX1QgfCBCNDRfRkxBR19GVUxMX0RVUExFWCk7CiAJCWlmIChzcGVlZCA9PSBTUEVFRF8xMDApCiAJCQlicC0+ZmxhZ3MgfD0gQjQ0X0ZMQUdfMTAwX0JBU0VfVDsKLQkJaWYgKGNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQlpZiAoY21kLT5iYXNlLmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKIAkJCWJwLT5mbGFncyB8PSBCNDRfRkxBR19GVUxMX0RVUExFWDsKIAl9CiAKQEAgLTIxMTAsOCArMjEyMCw2IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgYjQ0X2V0aHRvb2xfb3BzID0gewogCS5nZXRfZHJ2aW5mbwkJPSBiNDRfZ2V0X2RydmluZm8sCi0JLmdldF9zZXR0aW5ncwkJPSBiNDRfZ2V0X3NldHRpbmdzLAotCS5zZXRfc2V0dGluZ3MJCT0gYjQ0X3NldF9zZXR0aW5ncywKIAkubndheV9yZXNldAkJPSBiNDRfbndheV9yZXNldCwKIAkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKIAkuZ2V0X3dvbAkJPSBiNDRfZ2V0X3dvbCwKQEAgLTIxMjUsNiArMjEzMyw4IEBACiAJLmdldF9zdHJpbmdzCQk9IGI0NF9nZXRfc3RyaW5ncywKIAkuZ2V0X3NzZXRfY291bnQJCT0gYjQ0X2dldF9zc2V0X2NvdW50LAogCS5nZXRfZXRodG9vbF9zdGF0cwk9IGI0NF9nZXRfZXRodG9vbF9zdGF0cywKKwkuZ2V0X2xpbmtfa3NldHRpbmdzCT0gYjQ0X2dldF9saW5rX2tzZXR0aW5ncywKKwkuc2V0X2xpbmtfa3NldHRpbmdzCT0gYjQ0X3NldF9saW5rX2tzZXR0aW5ncywKIH07CiAKIHN0YXRpYyBpbnQgYjQ0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQpAQCAtMjEzNyw4ICsyMTQ3LDggQEAKIAogCXNwaW5fbG9ja19pcnEoJmJwLT5sb2NrKTsKIAlpZiAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfRVhURVJOQUxfUEhZKSB7Ci0JCUJVR19PTighYnAtPnBoeWRldik7Ci0JCWVyciA9IHBoeV9taWlfaW9jdGwoYnAtPnBoeWRldiwgaWZyLCBjbWQpOworCQlCVUdfT04oIWRldi0+cGh5ZGV2KTsKKwkJZXJyID0gcGh5X21paV9pb2N0bChkZXYtPnBoeWRldiwgaWZyLCBjbWQpOwogCX0gZWxzZSB7CiAJCWVyciA9IGdlbmVyaWNfbWlpX2lvY3RsKCZicC0+bWlpX2lmLCBpZl9taWkoaWZyKSwgY21kLCBOVUxMKTsKIAl9CkBAIC0yMjA2LDcgKzIyMTYsNyBAQAogc3RhdGljIHZvaWQgYjQ0X2FkanVzdF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGI0NCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBicC0+cGh5ZGV2OworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBkZXYtPnBoeWRldjsKIAlib29sIHN0YXR1c19jaGFuZ2VkID0gMDsKIAogCUJVR19PTighcGh5ZGV2KTsKQEAgLTIzMDMsNyArMjMxMyw2IEBACiAJCQkgICAgICBTVVBQT1JURURfTUlJKTsKIAlwaHlkZXYtPmFkdmVydGlzaW5nID0gcGh5ZGV2LT5zdXBwb3J0ZWQ7CiAKLQlicC0+cGh5ZGV2ID0gcGh5ZGV2OwogCWJwLT5vbGRfbGluayA9IDA7CiAJYnAtPnBoeV9hZGRyID0gcGh5ZGV2LT5tZGlvLmFkZHI7CiAKQEAgLTIzMjMsOSArMjMzMiwxMCBAQAogCiBzdGF0aWMgdm9pZCBiNDRfdW5yZWdpc3Rlcl9waHlfb25lKHN0cnVjdCBiNDQgKmJwKQogeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBicC0+ZGV2OwogCXN0cnVjdCBtaWlfYnVzICptaWlfYnVzID0gYnAtPm1paV9idXM7CiAKLQlwaHlfZGlzY29ubmVjdChicC0+cGh5ZGV2KTsKKwlwaHlfZGlzY29ubmVjdChkZXYtPnBoeWRldik7CiAJbWRpb2J1c191bnJlZ2lzdGVyKG1paV9idXMpOwogCW1kaW9idXNfZnJlZShtaWlfYnVzKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2I0NC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYjQ0LmgKaW5kZXggNjVkODhkNy4uODlkMmNmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYjQ0LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYjQ0LmgKQEAgLTQwNCw3ICs0MDQsNiBAQAogCXUzMgkJCXR4X3BlbmRpbmc7CiAJdTgJCQlwaHlfYWRkcjsKIAl1OAkJCWZvcmNlX2NvcHlicmVhazsKLQlzdHJ1Y3QgcGh5X2RldmljZQkqcGh5ZGV2OwogCXN0cnVjdCBtaWlfYnVzCQkqbWlpX2J1czsKIAlpbnQJCQlvbGRfbGluazsKIAlzdHJ1Y3QgbWlpX2lmX2luZm8JbWlpX2lmOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmNtNjN4eF9lbmV0LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iY202M3h4X2VuZXQuYwppbmRleCA2YzhiYzVmLi5hZTM2NGM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iY202M3h4X2VuZXQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iY202M3h4X2VuZXQuYwpAQCAtNzkxLDcgKzc5MSw3IEBACiAJaW50IHN0YXR1c19jaGFuZ2VkOwogCiAJcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JcGh5ZGV2ID0gcHJpdi0+cGh5ZGV2OworCXBoeWRldiA9IGRldi0+cGh5ZGV2OwogCXN0YXR1c19jaGFuZ2VkID0gMDsKIAogCWlmIChwcml2LT5vbGRfbGluayAhPSBwaHlkZXYtPmxpbmspIHsKQEAgLTkxMyw3ICs5MTMsNiBAQAogCQlwcml2LT5vbGRfbGluayA9IDA7CiAJCXByaXYtPm9sZF9kdXBsZXggPSAtMTsKIAkJcHJpdi0+b2xkX3BhdXNlID0gLTE7Ci0JCXByaXYtPnBoeWRldiA9IHBoeWRldjsKIAl9CiAKIAkvKiBtYXNrIGFsbCBpbnRlcnJ1cHRzIGFuZCByZXF1ZXN0IHRoZW0gKi8KQEAgLTEwODUsNyArMTA4NCw3IEBACiAJCQkgRU5FVERNQUNfSVJNQVNLLCBwcml2LT50eF9jaGFuKTsKIAogCWlmIChwcml2LT5oYXNfcGh5KQotCQlwaHlfc3RhcnQocHJpdi0+cGh5ZGV2KTsKKwkJcGh5X3N0YXJ0KHBoeWRldik7CiAJZWxzZQogCQliY21fZW5ldF9hZGp1c3RfbGluayhkZXYpOwogCkBAIC0xMTI3LDcgKzExMjYsNyBAQAogCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwogCiBvdXRfcGh5X2Rpc2Nvbm5lY3Q6Ci0JcGh5X2Rpc2Nvbm5lY3QocHJpdi0+cGh5ZGV2KTsKKwlwaHlfZGlzY29ubmVjdChwaHlkZXYpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTExOTAsNyArMTE4OSw3IEBACiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCW5hcGlfZGlzYWJsZSgmcHJpdi0+bmFwaSk7CiAJaWYgKHByaXYtPmhhc19waHkpCi0JCXBoeV9zdG9wKHByaXYtPnBoeWRldik7CisJCXBoeV9zdG9wKGRldi0+cGh5ZGV2KTsKIAlkZWxfdGltZXJfc3luYygmcHJpdi0+cnhfdGltZW91dCk7CiAKIAkvKiBtYXNrIGFsbCBpbnRlcnJ1cHRzICovCkBAIC0xMjM0LDEwICsxMjMzLDggQEAKIAlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIAogCS8qIHJlbGVhc2UgcGh5ICovCi0JaWYgKHByaXYtPmhhc19waHkpIHsKLQkJcGh5X2Rpc2Nvbm5lY3QocHJpdi0+cGh5ZGV2KTsKLQkJcHJpdi0+cGh5ZGV2ID0gTlVMTDsKLQl9CisJaWYgKHByaXYtPmhhc19waHkpCisJCXBoeV9kaXNjb25uZWN0KGRldi0+cGh5ZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtMTQzNyw2NCArMTQzNCw2OCBAQAogCiAJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJaWYgKHByaXYtPmhhc19waHkpIHsKLQkJaWYgKCFwcml2LT5waHlkZXYpCisJCWlmICghZGV2LT5waHlkZXYpCiAJCQlyZXR1cm4gLUVOT0RFVjsKLQkJcmV0dXJuIGdlbnBoeV9yZXN0YXJ0X2FuZWcocHJpdi0+cGh5ZGV2KTsKKwkJcmV0dXJuIGdlbnBoeV9yZXN0YXJ0X2FuZWcoZGV2LT5waHlkZXYpOwogCX0KIAogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KIAotc3RhdGljIGludCBiY21fZW5ldF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCitzdGF0aWMgaW50IGJjbV9lbmV0X2dldF9saW5rX2tzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQogewogCXN0cnVjdCBiY21fZW5ldF9wcml2ICpwcml2OworCXUzMiBzdXBwb3J0ZWQsIGFkdmVydGlzaW5nOwogCiAJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAKLQljbWQtPm1heHJ4cGt0ID0gMDsKLQljbWQtPm1heHR4cGt0ID0gMDsKLQogCWlmIChwcml2LT5oYXNfcGh5KSB7Ci0JCWlmICghcHJpdi0+cGh5ZGV2KQorCQlpZiAoIWRldi0+cGh5ZGV2KQogCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCXJldHVybiBwaHlfZXRodG9vbF9nc2V0KHByaXYtPnBoeWRldiwgY21kKTsKKwkJcmV0dXJuIHBoeV9ldGh0b29sX2tzZXR0aW5nc19nZXQoZGV2LT5waHlkZXYsIGNtZCk7CiAJfSBlbHNlIHsKLQkJY21kLT5hdXRvbmVnID0gMDsKLQkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGNtZCwgKChwcml2LT5mb3JjZV9zcGVlZF8xMDApCi0JCQkJCSAgICA/IFNQRUVEXzEwMCA6IFNQRUVEXzEwKSk7Ci0JCWNtZC0+ZHVwbGV4ID0gKHByaXYtPmZvcmNlX2R1cGxleF9mdWxsKSA/CisJCWNtZC0+YmFzZS5hdXRvbmVnID0gMDsKKwkJY21kLT5iYXNlLnNwZWVkID0gKHByaXYtPmZvcmNlX3NwZWVkXzEwMCkgPworCQkJU1BFRURfMTAwIDogU1BFRURfMTA7CisJCWNtZC0+YmFzZS5kdXBsZXggPSAocHJpdi0+Zm9yY2VfZHVwbGV4X2Z1bGwpID8KIAkJCURVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7Ci0JCWNtZC0+c3VwcG9ydGVkID0gQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYgIHwKKwkJc3VwcG9ydGVkID0gQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYgfAogCQkJQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwgfAogCQkJQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmIHwKIAkJCUFEVkVSVElTRURfMTAwYmFzZVRfRnVsbDsKLQkJY21kLT5hZHZlcnRpc2luZyA9IDA7Ci0JCWNtZC0+cG9ydCA9IFBPUlRfTUlJOwotCQljbWQtPnRyYW5zY2VpdmVyID0gWENWUl9FWFRFUk5BTDsKKwkJYWR2ZXJ0aXNpbmcgPSAwOworCQlldGh0b29sX2NvbnZlcnRfbGVnYWN5X3UzMl90b19saW5rX21vZGUoCisJCQljbWQtPmxpbmtfbW9kZXMuc3VwcG9ydGVkLCBzdXBwb3J0ZWQpOworCQlldGh0b29sX2NvbnZlcnRfbGVnYWN5X3UzMl90b19saW5rX21vZGUoCisJCQljbWQtPmxpbmtfbW9kZXMuYWR2ZXJ0aXNpbmcsIGFkdmVydGlzaW5nKTsKKwkJY21kLT5iYXNlLnBvcnQgPSBQT1JUX01JSTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYmNtX2VuZXRfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQorc3RhdGljIGludCBiY21fZW5ldF9zZXRfbGlua19rc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKIHsKIAlzdHJ1Y3QgYmNtX2VuZXRfcHJpdiAqcHJpdjsKIAogCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWlmIChwcml2LT5oYXNfcGh5KSB7Ci0JCWlmICghcHJpdi0+cGh5ZGV2KQorCQlpZiAoIWRldi0+cGh5ZGV2KQogCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCXJldHVybiBwaHlfZXRodG9vbF9zc2V0KHByaXYtPnBoeWRldiwgY21kKTsKKwkJcmV0dXJuIHBoeV9ldGh0b29sX2tzZXR0aW5nc19zZXQoZGV2LT5waHlkZXYsIGNtZCk7CiAJfSBlbHNlIHsKIAotCQlpZiAoY21kLT5hdXRvbmVnIHx8Ci0JCSAgICAoY21kLT5zcGVlZCAhPSBTUEVFRF8xMDAgJiYgY21kLT5zcGVlZCAhPSBTUEVFRF8xMCkgfHwKLQkJICAgIGNtZC0+cG9ydCAhPSBQT1JUX01JSSkKKwkJaWYgKGNtZC0+YmFzZS5hdXRvbmVnIHx8CisJCSAgICAoY21kLT5iYXNlLnNwZWVkICE9IFNQRUVEXzEwMCAmJgorCQkgICAgIGNtZC0+YmFzZS5zcGVlZCAhPSBTUEVFRF8xMCkgfHwKKwkJICAgIGNtZC0+YmFzZS5wb3J0ICE9IFBPUlRfTUlJKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJcHJpdi0+Zm9yY2Vfc3BlZWRfMTAwID0gKGNtZC0+c3BlZWQgPT0gU1BFRURfMTAwKSA/IDEgOiAwOwotCQlwcml2LT5mb3JjZV9kdXBsZXhfZnVsbCA9IChjbWQtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkgPyAxIDogMDsKKwkJcHJpdi0+Zm9yY2Vfc3BlZWRfMTAwID0KKwkJCShjbWQtPmJhc2Uuc3BlZWQgPT0gU1BFRURfMTAwKSA/IDEgOiAwOworCQlwcml2LT5mb3JjZV9kdXBsZXhfZnVsbCA9CisJCQkoY21kLT5iYXNlLmR1cGxleCA9PSBEVVBMRVhfRlVMTCkgPyAxIDogMDsKIAogCQlpZiAobmV0aWZfcnVubmluZyhkZXYpKQogCQkJYmNtX2VuZXRfYWRqdXN0X2xpbmsoZGV2KTsKQEAgLTE1ODgsMTQgKzE1ODksMTQgQEAKIAkuZ2V0X3NzZXRfY291bnQJCT0gYmNtX2VuZXRfZ2V0X3NzZXRfY291bnQsCiAJLmdldF9ldGh0b29sX3N0YXRzICAgICAgPSBiY21fZW5ldF9nZXRfZXRodG9vbF9zdGF0cywKIAkubndheV9yZXNldAkJPSBiY21fZW5ldF9ud2F5X3Jlc2V0LAotCS5nZXRfc2V0dGluZ3MJCT0gYmNtX2VuZXRfZ2V0X3NldHRpbmdzLAotCS5zZXRfc2V0dGluZ3MJCT0gYmNtX2VuZXRfc2V0X3NldHRpbmdzLAogCS5nZXRfZHJ2aW5mbwkJPSBiY21fZW5ldF9nZXRfZHJ2aW5mbywKIAkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKIAkuZ2V0X3JpbmdwYXJhbQkJPSBiY21fZW5ldF9nZXRfcmluZ3BhcmFtLAogCS5zZXRfcmluZ3BhcmFtCQk9IGJjbV9lbmV0X3NldF9yaW5ncGFyYW0sCiAJLmdldF9wYXVzZXBhcmFtCQk9IGJjbV9lbmV0X2dldF9wYXVzZXBhcmFtLAogCS5zZXRfcGF1c2VwYXJhbQkJPSBiY21fZW5ldF9zZXRfcGF1c2VwYXJhbSwKKwkuZ2V0X2xpbmtfa3NldHRpbmdzCT0gYmNtX2VuZXRfZ2V0X2xpbmtfa3NldHRpbmdzLAorCS5zZXRfbGlua19rc2V0dGluZ3MJPSBiY21fZW5ldF9zZXRfbGlua19rc2V0dGluZ3MsCiB9OwogCiBzdGF0aWMgaW50IGJjbV9lbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCkBAIC0xNjA0LDkgKzE2MDUsOSBAQAogCiAJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJaWYgKHByaXYtPmhhc19waHkpIHsKLQkJaWYgKCFwcml2LT5waHlkZXYpCisJCWlmICghZGV2LT5waHlkZXYpCiAJCQlyZXR1cm4gLUVOT0RFVjsKLQkJcmV0dXJuIHBoeV9taWlfaW9jdGwocHJpdi0+cGh5ZGV2LCBycSwgY21kKTsKKwkJcmV0dXJuIHBoeV9taWlfaW9jdGwoZGV2LT5waHlkZXYsIHJxLCBjbWQpOwogCX0gZWxzZSB7CiAJCXN0cnVjdCBtaWlfaWZfaW5mbyBtaWk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JjbTYzeHhfZW5ldC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmNtNjN4eF9lbmV0LmgKaW5kZXggZjU1YWY0My4uMGExYjdiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmNtNjN4eF9lbmV0LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmNtNjN4eF9lbmV0LmgKQEAgLTI5MCw3ICsyOTAsNiBAQAogCiAJLyogdXNlZCB3aGVuIGEgcGh5IGlzIGNvbm5lY3RlZCAocGh5bGliIHVzZWQpICovCiAJc3RydWN0IG1paV9idXMgKm1paV9idXM7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKIAlpbnQgb2xkX2xpbms7CiAJaW50IG9sZF9kdXBsZXg7CiAJaW50IG9sZF9wYXVzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JjbXN5c3BvcnQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JjbXN5c3BvcnQuYwppbmRleCBiMmQzMDg2Li5jMzM1NGI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iY21zeXNwb3J0LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmNtc3lzcG9ydC5jCkBAIC01OCw4ICs1OCw4IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgaW50cmwyXyMjd2hpY2gjI19tYXNrX2NsZWFyKHN0cnVjdCBiY21fc3lzcG9ydF9wcml2ICpwcml2LCBcCiAJCQkJCQl1MzIgbWFzaykJCVwKIHsJCQkJCQkJCQlcCi0JaW50cmwyXyMjd2hpY2gjI193cml0ZWwocHJpdiwgbWFzaywgSU5UUkwyX0NQVV9NQVNLX0NMRUFSKTsJXAogCXByaXYtPmlycSMjd2hpY2gjI19tYXNrICY9IH4obWFzayk7CQkJCVwKKwlpbnRybDJfIyN3aGljaCMjX3dyaXRlbChwcml2LCBtYXNrLCBJTlRSTDJfQ1BVX01BU0tfQ0xFQVIpOwlcCiB9CQkJCQkJCQkJXAogc3RhdGljIGlubGluZSB2b2lkIGludHJsMl8jI3doaWNoIyNfbWFza19zZXQoc3RydWN0IGJjbV9zeXNwb3J0X3ByaXYgKnByaXYsIFwKIAkJCQkJCXUzMiBtYXNrKQkJXApAQCAtMTY5Miw3ICsxNjkyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBiY21fc3lzcG9ydF9ldGh0b29sX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgYmNtX3N5c3BvcnRfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9kcnZpbmZvCQk9IGJjbV9zeXNwb3J0X2dldF9kcnZpbmZvLAogCS5nZXRfbXNnbGV2ZWwJCT0gYmNtX3N5c3BvcnRfZ2V0X21zZ2x2bCwKIAkuc2V0X21zZ2xldmVsCQk9IGJjbV9zeXNwb3J0X3NldF9tc2dsdmwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iZ21hYy1iY21hLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iZ21hYy1iY21hLmMKaW5kZXggOWE5NzQ1YzQuLmMxNmVjM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JnbWFjLWJjbWEuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iZ21hYy1iY21hLmMKQEAgLTkyLDYgKzkyLDcgQEAKIC8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC9tYWMtZ2JpdC9nbWFjL2NoaXBhdHRhY2ggKi8KIHN0YXRpYyBpbnQgYmdtYWNfcHJvYmUoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlKQogeworCXN0cnVjdCBiY21hX2NoaXBpbmZvICpjaSA9ICZjb3JlLT5idXMtPmNoaXBpbmZvOwogCXN0cnVjdCBzc2Jfc3Byb20gKnNwcm9tID0gJmNvcmUtPmJ1cy0+c3Byb207CiAJc3RydWN0IG1paV9idXMgKm1paV9idXM7CiAJc3RydWN0IGJnbWFjICpiZ21hYzsKQEAgLTE1Nyw5ICsxNTgsMTAgQEAKIAlkZXZfaW5mbyhiZ21hYy0+ZGV2LCAiRm91bmQgUEhZIGFkZHI6ICVkJXNcbiIsIGJnbWFjLT5waHlhZGRyLAogCQkgYmdtYWMtPnBoeWFkZHIgPT0gQkdNQUNfUEhZX05PUkVHUyA/ICIgKE5PUkVHUykiIDogIiIpOwogCi0JaWYgKCFiZ21hY19pc19iY200NzA3X2ZhbWlseShjb3JlKSkgeworCWlmICghYmdtYWNfaXNfYmNtNDcwN19mYW1pbHkoY29yZSkgJiYKKwkgICAgIShjaS0+aWQgPT0gQkNNQV9DSElQX0lEX0JDTTUzNTczICYmIGNvcmUtPmNvcmVfdW5pdCA9PSAxKSkgewogCQltaWlfYnVzID0gYmNtYV9tZGlvX21paV9yZWdpc3Rlcihjb3JlLCBiZ21hYy0+cGh5YWRkcik7Ci0JCWlmICghSVNfRVJSKG1paV9idXMpKSB7CisJCWlmIChJU19FUlIobWlpX2J1cykpIHsKIAkJCWVyciA9IFBUUl9FUlIobWlpX2J1cyk7CiAJCQlnb3RvIGVycjsKIAkJfQpAQCAtMjMwLDYgKzIzMiwyMSBAQAogCQliZ21hYy0+ZmVhdHVyZV9mbGFncyB8PSBCR01BQ19GRUFUX05PX1JFU0VUOwogCQliZ21hYy0+ZmVhdHVyZV9mbGFncyB8PSBCR01BQ19GRUFUX0ZPUkNFX1NQRUVEXzI1MDA7CiAJCWJyZWFrOworCWNhc2UgQkNNQV9DSElQX0lEX0JDTTUzNTczOgorCQliZ21hYy0+ZmVhdHVyZV9mbGFncyB8PSBCR01BQ19GRUFUX0NMS0NUTFNUOworCQliZ21hYy0+ZmVhdHVyZV9mbGFncyB8PSBCR01BQ19GRUFUX1NFVF9SWFFfQ0xLOworCQlpZiAoY2ktPnBrZyA9PSBCQ01BX1BLR19JRF9CQ000NzE4OSkKKwkJCWJnbWFjLT5mZWF0dXJlX2ZsYWdzIHw9IEJHTUFDX0ZFQVRfSU9TVF9BVFRBQ0hFRDsKKwkJaWYgKGNvcmUtPmNvcmVfdW5pdCA9PSAwKSB7CisJCQliZ21hYy0+ZmVhdHVyZV9mbGFncyB8PSBCR01BQ19GRUFUX0NDNF9JRl9TV19UWVBFOworCQkJaWYgKGNpLT5wa2cgPT0gQkNNQV9QS0dfSURfQkNNNDcxODkpCisJCQkJYmdtYWMtPmZlYXR1cmVfZmxhZ3MgfD0KKwkJCQkJQkdNQUNfRkVBVF9DQzRfSUZfU1dfVFlQRV9SR01JSTsKKwkJfSBlbHNlIGlmIChjb3JlLT5jb3JlX3VuaXQgPT0gMSkgeworCQkJYmdtYWMtPmZlYXR1cmVfZmxhZ3MgfD0gQkdNQUNfRkVBVF9JUlFfSURfT09CXzY7CisJCQliZ21hYy0+ZmVhdHVyZV9mbGFncyB8PSBCR01BQ19GRUFUX0NDN19JRl9UWVBFX1JHTUlJOworCQl9CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJnbWFjLT5mZWF0dXJlX2ZsYWdzIHw9IEJHTUFDX0ZFQVRfQ0xLQ1RMU1Q7CiAJCWJnbWFjLT5mZWF0dXJlX2ZsYWdzIHw9IEJHTUFDX0ZFQVRfU0VUX1JYUV9DTEs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iZ21hYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmdtYWMuYwppbmRleCBjNDc1MWVjLi42ZWEwZTVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iZ21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JnbWFjLmMKQEAgLTkzMiw3ICs5MzIsOCBAQAogCQkJZXRfc3d0eXBlIDw8PSA0OwogCQkJc3dfdHlwZSA9IGV0X3N3dHlwZTsKIAkJfSBlbHNlIGlmIChiZ21hYy0+ZmVhdHVyZV9mbGFncyAmIEJHTUFDX0ZFQVRfU1dfVFlQRV9FUEhZUk1JSSkgewotCQkJc3dfdHlwZSA9IEJHTUFDX0NISVBDVExfMV9TV19UWVBFX0VQSFlSTUlJOworCQkJc3dfdHlwZSA9IEJHTUFDX0NISVBDVExfMV9JRl9UWVBFX1JNSUkgfAorCQkJCSAgQkdNQUNfQ0hJUENUTF8xX1NXX1RZUEVfRVBIWVJNSUk7CiAJCX0gZWxzZSBpZiAoYmdtYWMtPmZlYXR1cmVfZmxhZ3MgJiBCR01BQ19GRUFUX1NXX1RZUEVfUkdNSUkpIHsKIAkJCXN3X3R5cGUgPSBCR01BQ19DSElQQ1RMXzFfSUZfVFlQRV9SR01JSSB8CiAJCQkJICBCR01BQ19DSElQQ1RMXzFfU1dfVFlQRV9SR01JSTsKQEAgLTk0MCw2ICs5NDEsMjcgQEAKIAkJYmdtYWNfY2NvX2N0bF9tYXNrc2V0KGJnbWFjLCAxLCB+KEJHTUFDX0NISVBDVExfMV9JRl9UWVBFX01BU0sgfAogCQkJCQkJICBCR01BQ19DSElQQ1RMXzFfU1dfVFlQRV9NQVNLKSwKIAkJCQkgICAgICBzd190eXBlKTsKKwl9IGVsc2UgaWYgKGJnbWFjLT5mZWF0dXJlX2ZsYWdzICYgQkdNQUNfRkVBVF9DQzRfSUZfU1dfVFlQRSkgeworCQl1MzIgc3dfdHlwZSA9IEJHTUFDX0NISVBDVExfNF9JRl9UWVBFX01JSSB8CisJCQkgICAgICBCR01BQ19DSElQQ1RMXzRfU1dfVFlQRV9FUEhZOworCQl1OCBldF9zd3R5cGUgPSAwOworCQljaGFyIGJ1Zls0XTsKKworCQlpZiAoYmNtNDd4eF9udnJhbV9nZXRlbnYoImV0X3N3dHlwZSIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpID4gMCkgeworCQkJaWYgKGtzdHJ0b3U4KGJ1ZiwgMCwgJmV0X3N3dHlwZSkpCisJCQkJZGV2X2VycihiZ21hYy0+ZGV2LCAiRmFpbGVkIHRvIHBhcnNlIGV0X3N3dHlwZSAoJXMpXG4iLAorCQkJCQlidWYpOworCQkJc3dfdHlwZSA9IChldF9zd3R5cGUgJiAweDBmKSA8PCAxMjsKKwkJfSBlbHNlIGlmIChiZ21hYy0+ZmVhdHVyZV9mbGFncyAmIEJHTUFDX0ZFQVRfQ0M0X0lGX1NXX1RZUEVfUkdNSUkpIHsKKwkJCXN3X3R5cGUgPSBCR01BQ19DSElQQ1RMXzRfSUZfVFlQRV9SR01JSSB8CisJCQkJICBCR01BQ19DSElQQ1RMXzRfU1dfVFlQRV9SR01JSTsKKwkJfQorCQliZ21hY19jY29fY3RsX21hc2tzZXQoYmdtYWMsIDQsIH4oQkdNQUNfQ0hJUENUTF80X0lGX1RZUEVfTUFTSyB8CisJCQkJCQkgIEJHTUFDX0NISVBDVExfNF9TV19UWVBFX01BU0spLAorCQkJCSAgICAgIHN3X3R5cGUpOworCX0gZWxzZSBpZiAoYmdtYWMtPmZlYXR1cmVfZmxhZ3MgJiBCR01BQ19GRUFUX0NDN19JRl9UWVBFX1JHTUlJKSB7CisJCWJnbWFjX2Njb19jdGxfbWFza3NldChiZ21hYywgNywgfkJHTUFDX0NISVBDVExfN19JRl9UWVBFX01BU0ssCisJCQkJICAgICAgQkdNQUNfQ0hJUENUTF83X0lGX1RZUEVfUkdNSUkpOwogCX0KIAogCWlmIChpb3N0ICYgQkdNQUNfQkNNQV9JT1NUX0FUVEFDSEVEICYmICFiZ21hYy0+aGFzX3JvYm9zdykKQEAgLTE0NjcsNiArMTQ4OSwxMCBAQAogCSAqLwogCWJnbWFjX2Nsa19lbmFibGUoYmdtYWMsIDApOwogCisJLyogVGhpcyBzZWVtcyB0byBiZSBmaXhpbmcgSVJRIGJ5IGFzc2lnbmluZyBPT0IgIzYgdG8gdGhlIGNvcmUgKi8KKwlpZiAoYmdtYWMtPmZlYXR1cmVfZmxhZ3MgJiBCR01BQ19GRUFUX0lSUV9JRF9PT0JfNikKKwkJYmdtYWNfaWRtX3dyaXRlKGJnbWFjLCBCQ01BX09PQl9TRUxfT1VUX0EzMCwgMHg4Nik7CisKIAliZ21hY19jaGlwX3Jlc2V0KGJnbWFjKTsKIAogCWVyciA9IGJnbWFjX2RtYV9hbGxvYyhiZ21hYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iZ21hYy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmdtYWMuaAppbmRleCAyNGEyNTAyLi44MDgzNmI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iZ21hYy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JnbWFjLmgKQEAgLTM2OSw2ICszNjksMjEgQEAKICNkZWZpbmUgQkdNQUNfQ0hJUENUTF8xX1NXX1RZUEVfUkdNSUkJCTB4MDAwMDAwQzAKICNkZWZpbmUgQkdNQUNfQ0hJUENUTF8xX1JYQ19ETExfQllQQVNTCQkweDAwMDEwMDAwCiAKKyNkZWZpbmUgQkdNQUNfQ0hJUENUTF80X0lGX1RZUEVfTUFTSwkJMHgwMDAwMzAwMAorI2RlZmluZSBCR01BQ19DSElQQ1RMXzRfSUZfVFlQRV9STUlJCQkweDAwMDAwMDAwCisjZGVmaW5lIEJHTUFDX0NISVBDVExfNF9JRl9UWVBFX01JSQkJMHgwMDAwMTAwMAorI2RlZmluZSBCR01BQ19DSElQQ1RMXzRfSUZfVFlQRV9SR01JSQkJMHgwMDAwMjAwMAorI2RlZmluZSBCR01BQ19DSElQQ1RMXzRfU1dfVFlQRV9NQVNLCQkweDAwMDBDMDAwCisjZGVmaW5lIEJHTUFDX0NISVBDVExfNF9TV19UWVBFX0VQSFkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQkdNQUNfQ0hJUENUTF80X1NXX1RZUEVfRVBIWU1JSQkJMHgwMDAwNDAwMAorI2RlZmluZSBCR01BQ19DSElQQ1RMXzRfU1dfVFlQRV9FUEhZUk1JSQkweDAwMDA4MDAwCisjZGVmaW5lIEJHTUFDX0NISVBDVExfNF9TV19UWVBFX1JHTUlJCQkweDAwMDBDMDAwCisKKyNkZWZpbmUgQkdNQUNfQ0hJUENUTF83X0lGX1RZUEVfTUFTSwkJMHgwMDAwMDBDMAorI2RlZmluZSBCR01BQ19DSElQQ1RMXzdfSUZfVFlQRV9STUlJCQkweDAwMDAwMDAwCisjZGVmaW5lIEJHTUFDX0NISVBDVExfN19JRl9UWVBFX01JSQkJMHgwMDAwMDA0MAorI2RlZmluZSBCR01BQ19DSElQQ1RMXzdfSUZfVFlQRV9SR01JSQkJMHgwMDAwMDA4MAorCiAjZGVmaW5lIEJHTUFDX1dFSUdIVAk2NAogCiAjZGVmaW5lIEVUSEVSX01BWF9MRU4gICAxNTE4CkBAIC0zOTAsNiArNDA1LDEwIEBACiAjZGVmaW5lIEJHTUFDX0ZFQVRfTk9fQ0xSX01JQgkJQklUKDEzKQogI2RlZmluZSBCR01BQ19GRUFUX0ZPUkNFX1NQRUVEXzI1MDAJQklUKDE0KQogI2RlZmluZSBCR01BQ19GRUFUX0NNRENGR19TUl9SRVY0CUJJVCgxNSkKKyNkZWZpbmUgQkdNQUNfRkVBVF9JUlFfSURfT09CXzYJCUJJVCgxNikKKyNkZWZpbmUgQkdNQUNfRkVBVF9DQzRfSUZfU1dfVFlQRQlCSVQoMTcpCisjZGVmaW5lIEJHTUFDX0ZFQVRfQ0M0X0lGX1NXX1RZUEVfUkdNSUkJQklUKDE4KQorI2RlZmluZSBCR01BQ19GRUFUX0NDN19JRl9UWVBFX1JHTUlJCUJJVCgxOSkKIAogc3RydWN0IGJnbWFjX3Nsb3RfaW5mbyB7CiAJdW5pb24gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54Mi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54Mi5jCmluZGV4IDhmYzNmM2MuLjI3ZjExYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyLmMKQEAgLTUwLDcgKzUwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAjaW5jbHVkZSA8bGludXgvYWVyLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19DTklDKSB8fCBkZWZpbmVkKENPTkZJR19DTklDX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19DTklDKQogI2RlZmluZSBCQ01fQ05JQyAxCiAjaW5jbHVkZSAiY25pY19pZi5oIgogI2VuZGlmCkBAIC02MzU2LDEwICs2MzU2LDYgQEAKIAlzdHJ1Y3QgYm54MiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCByYzsKIAotCXJjID0gYm54Ml9yZXF1ZXN0X2Zpcm13YXJlKGJwKTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIG91dDsKLQogCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CiAKIAlibngyX2Rpc2FibGVfaW50KGJwKTsKQEAgLTY0MjgsNyArNjQyNCw2IEBACiAJYm54Ml9mcmVlX2lycShicCk7CiAJYm54Ml9mcmVlX21lbShicCk7CiAJYm54Ml9kZWxfbmFwaShicCk7Ci0JYm54Ml9yZWxlYXNlX2Zpcm13YXJlKGJwKTsKIAlnb3RvIG91dDsKIH0KIApAQCAtODU3NSw2ICs4NTcwLDEyIEBACiAKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKIAorCXJjID0gYm54Ml9yZXF1ZXN0X2Zpcm13YXJlKGJwKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycm9yOworCisKKwlibngyX3Jlc2V0X2NoaXAoYnAsIEJOWDJfRFJWX01TR19DT0RFX1JFU0VUKTsKIAltZW1jcHkoZGV2LT5kZXZfYWRkciwgYnAtPm1hY19hZGRyLCBFVEhfQUxFTik7CiAKIAlkZXYtPmh3X2ZlYXR1cmVzID0gTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9TRyB8CkBAIC04NjA3LDYgKzg2MDgsNyBAQAogCXJldHVybiAwOwogCiBlcnJvcjoKKwlibngyX3JlbGVhc2VfZmlybXdhcmUoYnApOwogCXBjaV9pb3VubWFwKHBkZXYsIGJwLT5yZWd2aWV3KTsKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2Ntbi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfY21uLmgKaW5kZXggMGU2OGZhZC4uMjQzY2I5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfY21uLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfY21uLmgKQEAgLTQ5Miw3ICs0OTIsOCBAQAogaW50IGJueDJ4X2dldF92Zl9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHZmLAogCQkJc3RydWN0IGlmbGFfdmZfaW5mbyAqaXZpKTsKIGludCBibngyeF9zZXRfdmZfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBxdWV1ZSwgdTggKm1hYyk7Ci1pbnQgYm54Mnhfc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmLCB1MTYgdmxhbiwgdTggcW9zKTsKK2ludCBibngyeF9zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmYsIHUxNiB2bGFuLCB1OCBxb3MsCisJCSAgICAgIF9fYmUxNiB2bGFuX3Byb3RvKTsKIAogLyogc2VsZWN0X3F1ZXVlIGNhbGxiYWNrICovCiB1MTYgYm54Mnhfc2VsZWN0X3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9tYWluLmMKaW5kZXggOTdlODkyNS4uMjBmZTZhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X21haW4uYwpAQCAtNzcyLDYgKzc3MiwxMSBAQAogCQkoYnAtPmNvbW1vbi5iY192ZXIgJiAweGZmMDApID4+IDgsCiAJCShicC0+Y29tbW9uLmJjX3ZlciAmIDB4ZmYpKTsKIAorCWlmIChwY2lfY2hhbm5lbF9vZmZsaW5lKGJwLT5wZGV2KSkgeworCQlCTlgyWF9FUlIoIkNhbm5vdCBkdW1wIE1DUCBpbmZvIHdoaWxlIGluIFBDSSBlcnJvclxuIik7CisJCXJldHVybjsKKwl9CisKIAl2YWwgPSBSRUdfUkQoYnAsIE1DUF9SRUdfTUNQUl9DUFVfUFJPR1JBTV9DT1VOVEVSKTsKIAlpZiAodmFsID09IFJFR19SRChicCwgTUNQX1JFR19NQ1BSX0NQVV9QUk9HUkFNX0NPVU5URVIpKQogCQlCTlgyWF9FUlIoIiVzIiAiTUNQIFBDIGF0IDB4JXhcbiIsIGx2bCwgdmFsKTsKQEAgLTk0MTUsMTAgKzk0MjAsMTYgQEAKIAkvKiBSZWxlYXNlIElSUXMgKi8KIAlibngyeF9mcmVlX2lycShicCk7CiAKLQkvKiBSZXNldCB0aGUgY2hpcCAqLwotCXJjID0gYm54MnhfcmVzZXRfaHcoYnAsIHJlc2V0X2NvZGUpOwotCWlmIChyYykKLQkJQk5YMlhfRVJSKCJIV19SRVNFVCBmYWlsZWRcbiIpOworCS8qIFJlc2V0IHRoZSBjaGlwLCB1bmxlc3MgUENJIGZ1bmN0aW9uIGlzIG9mZmxpbmUuIElmIHdlIHJlYWNoIHRoaXMKKwkgKiBwb2ludCBmb2xsb3dpbmcgYSBQQ0kgZXJyb3IgaGFuZGxpbmcsIGl0IG1lYW5zIGRldmljZSBpcyByZWFsbHkKKwkgKiBpbiBhIGJhZCBzdGF0ZSBhbmQgd2UncmUgYWJvdXQgdG8gcmVtb3ZlIGl0LCBzbyByZXNldCB0aGUgY2hpcAorCSAqIGlzIG5vdCBhIGdvb2QgaWRlYS4KKwkgKi8KKwlpZiAoIXBjaV9jaGFubmVsX29mZmxpbmUoYnAtPnBkZXYpKSB7CisJCXJjID0gYm54MnhfcmVzZXRfaHcoYnAsIHJlc2V0X2NvZGUpOworCQlpZiAocmMpCisJCQlCTlgyWF9FUlIoIkhXX1JFU0VUIGZhaWxlZFxuIik7CisJfQogCiAJLyogUmVwb3J0IFVOTE9BRF9ET05FIHRvIE1DUCAqLwogCWJueDJ4X3NlbmRfdW5sb2FkX2RvbmUoYnAsIGtlZXBfbGluayk7CkBAIC0xMjU1MiwzOSArMTI1NjMsNjIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBibngyeF9pbml0X21jYXN0X21hY3NfbGlzdChzdHJ1Y3QgYm54MnggKmJwLAotCQkJCSAgICAgIHN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zICpwKQorc3RydWN0IGJueDJ4X21jYXN0X2xpc3RfZWxlbV9ncm91cAogewotCWludCBtY19jb3VudCA9IG5ldGRldl9tY19jb3VudChicC0+ZGV2KTsKLQlzdHJ1Y3QgYm54MnhfbWNhc3RfbGlzdF9lbGVtICptY19tYWMgPQotCQlrY2FsbG9jKG1jX2NvdW50LCBzaXplb2YoKm1jX21hYyksIEdGUF9BVE9NSUMpOwotCXN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7CisJc3RydWN0IGxpc3RfaGVhZCBtY2FzdF9ncm91cF9saW5rOworCXN0cnVjdCBibngyeF9tY2FzdF9saXN0X2VsZW0gbWNhc3RfZWxlbXNbXTsKK307CiAKLQlpZiAoIW1jX21hYykKLQkJcmV0dXJuIC1FTk9NRU07CisjZGVmaW5lIE1DQVNUX0VMRU1TX1BFUl9QRyBcCisJKChQQUdFX1NJWkUgLSBzaXplb2Yoc3RydWN0IGJueDJ4X21jYXN0X2xpc3RfZWxlbV9ncm91cCkpIC8gXAorCXNpemVvZihzdHJ1Y3QgYm54MnhfbWNhc3RfbGlzdF9lbGVtKSkKIAotCUlOSVRfTElTVF9IRUFEKCZwLT5tY2FzdF9saXN0KTsKK3N0YXRpYyB2b2lkIGJueDJ4X2ZyZWVfbWNhc3RfbWFjc19saXN0KHN0cnVjdCBsaXN0X2hlYWQgKm1jYXN0X2dyb3VwX2xpc3QpCit7CisJc3RydWN0IGJueDJ4X21jYXN0X2xpc3RfZWxlbV9ncm91cCAqY3VycmVudF9tY2FzdF9ncm91cDsKIAotCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBicC0+ZGV2KSB7Ci0JCW1jX21hYy0+bWFjID0gYm54MnhfbWNfYWRkcihoYSk7Ci0JCWxpc3RfYWRkX3RhaWwoJm1jX21hYy0+bGluaywgJnAtPm1jYXN0X2xpc3QpOwotCQltY19tYWMrKzsKKwl3aGlsZSAoIWxpc3RfZW1wdHkobWNhc3RfZ3JvdXBfbGlzdCkpIHsKKwkJY3VycmVudF9tY2FzdF9ncm91cCA9IGxpc3RfZmlyc3RfZW50cnkobWNhc3RfZ3JvdXBfbGlzdCwKKwkJCQkgICAgICBzdHJ1Y3QgYm54MnhfbWNhc3RfbGlzdF9lbGVtX2dyb3VwLAorCQkJCSAgICAgIG1jYXN0X2dyb3VwX2xpbmspOworCQlsaXN0X2RlbCgmY3VycmVudF9tY2FzdF9ncm91cC0+bWNhc3RfZ3JvdXBfbGluayk7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyljdXJyZW50X21jYXN0X2dyb3VwKTsKIAl9Ci0KLQlwLT5tY2FzdF9saXN0X2xlbiA9IG1jX2NvdW50OwotCi0JcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGJueDJ4X2ZyZWVfbWNhc3RfbWFjc19saXN0KAotCXN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zICpwKQorc3RhdGljIGludCBibngyeF9pbml0X21jYXN0X21hY3NfbGlzdChzdHJ1Y3QgYm54MnggKmJwLAorCQkJCSAgICAgIHN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zICpwLAorCQkJCSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKm1jYXN0X2dyb3VwX2xpc3QpCiB7Ci0Jc3RydWN0IGJueDJ4X21jYXN0X2xpc3RfZWxlbSAqbWNfbWFjID0KLQkJbGlzdF9maXJzdF9lbnRyeSgmcC0+bWNhc3RfbGlzdCwgc3RydWN0IGJueDJ4X21jYXN0X2xpc3RfZWxlbSwKLQkJCQkgbGluayk7CisJc3RydWN0IGJueDJ4X21jYXN0X2xpc3RfZWxlbSAqbWNfbWFjOworCXN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7CisJc3RydWN0IGJueDJ4X21jYXN0X2xpc3RfZWxlbV9ncm91cCAqY3VycmVudF9tY2FzdF9ncm91cCA9IE5VTEw7CisJaW50IG1jX2NvdW50ID0gbmV0ZGV2X21jX2NvdW50KGJwLT5kZXYpOworCWludCBvZmZzZXQgPSAwOwogCi0JV0FSTl9PTighbWNfbWFjKTsKLQlrZnJlZShtY19tYWMpOworCUlOSVRfTElTVF9IRUFEKCZwLT5tY2FzdF9saXN0KTsKKwluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgYnAtPmRldikgeworCQlpZiAoIW9mZnNldCkgeworCQkJY3VycmVudF9tY2FzdF9ncm91cCA9CisJCQkJKHN0cnVjdCBibngyeF9tY2FzdF9saXN0X2VsZW1fZ3JvdXAgKikKKwkJCQlfX2dldF9mcmVlX3BhZ2UoR0ZQX0FUT01JQyk7CisJCQlpZiAoIWN1cnJlbnRfbWNhc3RfZ3JvdXApIHsKKwkJCQlibngyeF9mcmVlX21jYXN0X21hY3NfbGlzdChtY2FzdF9ncm91cF9saXN0KTsKKwkJCQlCTlgyWF9FUlIoIkZhaWxlZCB0byBhbGxvY2F0ZSBtYyBNQUMgbGlzdFxuIik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlsaXN0X2FkZCgmY3VycmVudF9tY2FzdF9ncm91cC0+bWNhc3RfZ3JvdXBfbGluaywKKwkJCQkgbWNhc3RfZ3JvdXBfbGlzdCk7CisJCX0KKwkJbWNfbWFjID0gJmN1cnJlbnRfbWNhc3RfZ3JvdXAtPm1jYXN0X2VsZW1zW29mZnNldF07CisJCW1jX21hYy0+bWFjID0gYm54MnhfbWNfYWRkcihoYSk7CisJCWxpc3RfYWRkX3RhaWwoJm1jX21hYy0+bGluaywgJnAtPm1jYXN0X2xpc3QpOworCQlvZmZzZXQrKzsKKwkJaWYgKG9mZnNldCA9PSBNQ0FTVF9FTEVNU19QRVJfUEcpCisJCQlvZmZzZXQgPSAwOworCX0KKwlwLT5tY2FzdF9saXN0X2xlbiA9IG1jX2NvdW50OworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTEyNjMyLDggKzEyNjY2LDkgQEAKIAkJCQkgQk5YMlhfVUNfTElTVF9NQUMsICZyYW1yb2RfZmxhZ3MpOwogfQogCi1zdGF0aWMgaW50IGJueDJ4X3NldF9tY19saXN0KHN0cnVjdCBibngyeCAqYnApCitzdGF0aWMgaW50IGJueDJ4X3NldF9tY19saXN0X2UxeChzdHJ1Y3QgYm54MnggKmJwKQogeworCUxJU1RfSEVBRChtY2FzdF9ncm91cF9saXN0KTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYnAtPmRldjsKIAlzdHJ1Y3QgYm54MnhfbWNhc3RfcmFtcm9kX3BhcmFtcyBycGFyYW0gPSB7TlVMTH07CiAJaW50IHJjID0gMDsKQEAgLTEyNjQ5LDEyICsxMjY4NCw5IEBACiAKIAkvKiB0aGVuLCBjb25maWd1cmUgYSBuZXcgTUFDcyBsaXN0ICovCiAJaWYgKG5ldGRldl9tY19jb3VudChkZXYpKSB7Ci0JCXJjID0gYm54MnhfaW5pdF9tY2FzdF9tYWNzX2xpc3QoYnAsICZycGFyYW0pOwotCQlpZiAocmMpIHsKLQkJCUJOWDJYX0VSUigiRmFpbGVkIHRvIGNyZWF0ZSBtdWx0aWNhc3QgTUFDcyBsaXN0OiAlZFxuIiwKLQkJCQkgIHJjKTsKKwkJcmMgPSBibngyeF9pbml0X21jYXN0X21hY3NfbGlzdChicCwgJnJwYXJhbSwgJm1jYXN0X2dyb3VwX2xpc3QpOworCQlpZiAocmMpCiAJCQlyZXR1cm4gcmM7Ci0JCX0KIAogCQkvKiBOb3cgYWRkIHRoZSBuZXcgTUFDcyAqLwogCQlyYyA9IGJueDJ4X2NvbmZpZ19tY2FzdChicCwgJnJwYXJhbSwKQEAgLTEyNjYzLDcgKzEyNjk1LDQ0IEBACiAJCQlCTlgyWF9FUlIoIkZhaWxlZCB0byBzZXQgYSBuZXcgbXVsdGljYXN0IGNvbmZpZ3VyYXRpb246ICVkXG4iLAogCQkJCSAgcmMpOwogCi0JCWJueDJ4X2ZyZWVfbWNhc3RfbWFjc19saXN0KCZycGFyYW0pOworCQlibngyeF9mcmVlX21jYXN0X21hY3NfbGlzdCgmbWNhc3RfZ3JvdXBfbGlzdCk7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGJueDJ4X3NldF9tY19saXN0KHN0cnVjdCBibngyeCAqYnApCit7CisJTElTVF9IRUFEKG1jYXN0X2dyb3VwX2xpc3QpOworCXN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zIHJwYXJhbSA9IHtOVUxMfTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYnAtPmRldjsKKwlpbnQgcmMgPSAwOworCisJLyogT24gb2xkZXIgYWRhcHRlcnMsIHdlIG5lZWQgdG8gZmx1c2ggYW5kIHJlLWFkZCBmaWx0ZXJzICovCisJaWYgKENISVBfSVNfRTF4KGJwKSkKKwkJcmV0dXJuIGJueDJ4X3NldF9tY19saXN0X2UxeChicCk7CisKKwlycGFyYW0ubWNhc3Rfb2JqID0gJmJwLT5tY2FzdF9vYmo7CisKKwlpZiAobmV0ZGV2X21jX2NvdW50KGRldikpIHsKKwkJcmMgPSBibngyeF9pbml0X21jYXN0X21hY3NfbGlzdChicCwgJnJwYXJhbSwgJm1jYXN0X2dyb3VwX2xpc3QpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJLyogT3ZlcnJpZGUgdGhlIGN1cmVudGx5IGNvbmZpZ3VyZWQgc2V0IG9mIG1jIGZpbHRlcnMgKi8KKwkJcmMgPSBibngyeF9jb25maWdfbWNhc3QoYnAsICZycGFyYW0sCisJCQkJCUJOWDJYX01DQVNUX0NNRF9TRVQpOworCQlpZiAocmMgPCAwKQorCQkJQk5YMlhfRVJSKCJGYWlsZWQgdG8gc2V0IGEgbmV3IG11bHRpY2FzdCBjb25maWd1cmF0aW9uOiAlZFxuIiwKKwkJCQkgIHJjKTsKKworCQlibngyeF9mcmVlX21jYXN0X21hY3NfbGlzdCgmbWNhc3RfZ3JvdXBfbGlzdCk7CisJfSBlbHNlIHsKKwkJLyogSWYgbm8gbWMgYWRkcmVzc2VzIGFyZSByZXF1aXJlZCwgZmx1c2ggdGhlIGNvbmZpZ3VyYXRpb24gKi8KKwkJcmMgPSBibngyeF9jb25maWdfbWNhc3QoYnAsICZycGFyYW0sIEJOWDJYX01DQVNUX0NNRF9ERUwpOworCQlpZiAocmMpCisJCQlCTlgyWF9FUlIoIkZhaWxlZCB0byBjbGVhciBtdWx0aWNhc3QgY29uZmlndXJhdGlvbiAlZFxuIiwKKwkJCQkgIHJjKTsKIAl9CiAKIAlyZXR1cm4gcmM7CkBAIC0xMzIwMywxMyArMTMyNzIsMjIgQEAKIAkJTkVUSUZfRl9SWENTVU0gfCBORVRJRl9GX0xSTyB8IE5FVElGX0ZfR1JPIHwKIAkJTkVUSUZfRl9SWEhBU0ggfCBORVRJRl9GX0hXX1ZMQU5fQ1RBR19UWDsKIAlpZiAoIWNoaXBfaXNfZTF4KSB7Ci0JCWRldi0+aHdfZmVhdHVyZXMgfD0gTkVUSUZfRl9HU09fR1JFIHwgTkVUSUZfRl9HU09fVURQX1RVTk5FTCB8Ci0JCQkJICAgIE5FVElGX0ZfR1NPX0lQWElQNDsKKwkJZGV2LT5od19mZWF0dXJlcyB8PSBORVRJRl9GX0dTT19HUkUgfCBORVRJRl9GX0dTT19HUkVfQ1NVTSB8CisJCQkJICAgIE5FVElGX0ZfR1NPX0lQWElQNCB8CisJCQkJICAgIE5FVElGX0ZfR1NPX1VEUF9UVU5ORUwgfAorCQkJCSAgICBORVRJRl9GX0dTT19VRFBfVFVOTkVMX0NTVU0gfAorCQkJCSAgICBORVRJRl9GX0dTT19QQVJUSUFMOworCiAJCWRldi0+aHdfZW5jX2ZlYXR1cmVzID0KIAkJCU5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfSVBWNl9DU1VNIHwgTkVUSUZfRl9TRyB8CiAJCQlORVRJRl9GX1RTTyB8IE5FVElGX0ZfVFNPX0VDTiB8IE5FVElGX0ZfVFNPNiB8CiAJCQlORVRJRl9GX0dTT19JUFhJUDQgfAotCQkJTkVUSUZfRl9HU09fR1JFIHwgTkVUSUZfRl9HU09fVURQX1RVTk5FTDsKKwkJCU5FVElGX0ZfR1NPX0dSRSB8IE5FVElGX0ZfR1NPX0dSRV9DU1VNIHwKKwkJCU5FVElGX0ZfR1NPX1VEUF9UVU5ORUwgfCBORVRJRl9GX0dTT19VRFBfVFVOTkVMX0NTVU0gfAorCQkJTkVUSUZfRl9HU09fUEFSVElBTDsKKworCQlkZXYtPmdzb19wYXJ0aWFsX2ZlYXR1cmVzID0gTkVUSUZfRl9HU09fR1JFX0NTVU0gfAorCQkJCQkgICAgTkVUSUZfRl9HU09fVURQX1RVTk5FTF9DU1VNOwogCX0KIAogCWRldi0+dmxhbl9mZWF0dXJlcyA9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0lQX0NTVU0gfCBORVRJRl9GX0lQVjZfQ1NVTSB8CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zcC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3AuYwppbmRleCBmZjcwMmE3Li5jZWE2YmRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zcC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3NwLmMKQEAgLTI2MDAsOCArMjYwMCwyOSBAQAogCXU4IHBhZFsyXTsgLyogRm9yIGEgbmF0dXJhbCBhbGlnbm1lbnQgb2YgdGhlIGZvbGxvd2luZyBidWZmZXIgKi8KIH07CiAKK3N0cnVjdCBibngyeF9tY2FzdF9iaW5fZWxlbSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaW5rOworCWludCBiaW47CisJaW50IHR5cGU7IC8qIEJOWDJYX01DQVNUX0NNRF9TRVRfe0FERCwgREVMfSAqLworfTsKKwordW5pb24gYm54MnhfbWNhc3RfZWxlbSB7CisJc3RydWN0IGJueDJ4X21jYXN0X2Jpbl9lbGVtIGJpbl9lbGVtOworCXN0cnVjdCBibngyeF9tY2FzdF9tYWNfZWxlbSBtYWNfZWxlbTsKK307CisKK3N0cnVjdCBibngyeF9tY2FzdF9lbGVtX2dyb3VwIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG1jYXN0X2dyb3VwX2xpbms7CisJdW5pb24gYm54MnhfbWNhc3RfZWxlbSBtY2FzdF9lbGVtc1tdOworfTsKKworI2RlZmluZSBNQ0FTVF9NQUNfRUxFTVNfUEVSX1BHIFwKKwkoKFBBR0VfU0laRSAtIHNpemVvZihzdHJ1Y3QgYm54MnhfbWNhc3RfZWxlbV9ncm91cCkpIC8gXAorCXNpemVvZih1bmlvbiBibngyeF9tY2FzdF9lbGVtKSkKKwogc3RydWN0IGJueDJ4X3BlbmRpbmdfbWNhc3RfY21kIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7CisJc3RydWN0IGxpc3RfaGVhZCBncm91cF9oZWFkOwogCWludCB0eXBlOyAvKiBCTlgyWF9NQ0FTVF9DTURfWCAqLwogCXVuaW9uIHsKIAkJc3RydWN0IGxpc3RfaGVhZCBtYWNzX2hlYWQ7CkBAIC0yNjA5LDYgKzI2MzAsMTEgQEAKIAkJaW50IG5leHRfYmluOyAvKiBOZWVkZWQgZm9yIFJFU1RPUkUgZmxvdyB3aXRoIGFwcm94IG1hdGNoICovCiAJfSBkYXRhOwogCisJYm9vbCBzZXRfY29udmVydDsgLyogaW4gY2FzZSB0eXBlID09IEJOWDJYX01DQVNUX0NNRF9TRVQsIHRoaXMgaXMgc2V0CisJCQkgICAqIHdoZW4gbWFjc19oZWFkIGhhZCBiZWVuIGNvbnZlcnRlZCB0byBhIGxpc3Qgb2YKKwkJCSAgICogYm54MnhfbWNhc3RfYmluX2VsZW0uCisJCQkgICAqLworCiAJYm9vbCBkb25lOyAvKiBzZXQgdG8gdHJ1ZSwgd2hlbiB0aGUgY29tbWFuZCBoYXMgYmVlbiBoYW5kbGVkLAogCQkgICAgKiBwcmFjdGljYWxseSB1c2VkIGluIDU3NzEyIGhhbmRsaW5nIG9ubHksIHdoZXJlIG9uZSBwZW5kaW5nCiAJCSAgICAqIGNvbW1hbmQgbWF5IGJlIGhhbmRsZWQgaW4gYSBmZXcgb3BlcmF0aW9ucy4gQXMgbG9uZyBhcyBmb3IKQEAgLTI2MjcsNTMgKzI2NTMsOTMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgYm54MnhfZnJlZV9ncm91cHMoc3RydWN0IGxpc3RfaGVhZCAqbWNhc3RfZ3JvdXBfbGlzdCkKK3sKKwlzdHJ1Y3QgYm54MnhfbWNhc3RfZWxlbV9ncm91cCAqY3VycmVudF9tY2FzdF9ncm91cDsKKworCXdoaWxlICghbGlzdF9lbXB0eShtY2FzdF9ncm91cF9saXN0KSkgeworCQljdXJyZW50X21jYXN0X2dyb3VwID0gbGlzdF9maXJzdF9lbnRyeShtY2FzdF9ncm91cF9saXN0LAorCQkJCSAgICAgIHN0cnVjdCBibngyeF9tY2FzdF9lbGVtX2dyb3VwLAorCQkJCSAgICAgIG1jYXN0X2dyb3VwX2xpbmspOworCQlsaXN0X2RlbCgmY3VycmVudF9tY2FzdF9ncm91cC0+bWNhc3RfZ3JvdXBfbGluayk7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyljdXJyZW50X21jYXN0X2dyb3VwKTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgYm54MnhfbWNhc3RfZW5xdWV1ZV9jbWQoc3RydWN0IGJueDJ4ICpicCwKIAkJCQkgICBzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICpvLAogCQkJCSAgIHN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zICpwLAogCQkJCSAgIGVudW0gYm54MnhfbWNhc3RfY21kIGNtZCkKIHsKLQlpbnQgdG90YWxfc3o7CiAJc3RydWN0IGJueDJ4X3BlbmRpbmdfbWNhc3RfY21kICpuZXdfY21kOwotCXN0cnVjdCBibngyeF9tY2FzdF9tYWNfZWxlbSAqY3VyX21hYyA9IE5VTEw7CiAJc3RydWN0IGJueDJ4X21jYXN0X2xpc3RfZWxlbSAqcG9zOwotCWludCBtYWNzX2xpc3RfbGVuID0gKChjbWQgPT0gQk5YMlhfTUNBU1RfQ01EX0FERCkgPwotCQkJICAgICBwLT5tY2FzdF9saXN0X2xlbiA6IDApOworCXN0cnVjdCBibngyeF9tY2FzdF9lbGVtX2dyb3VwICplbGVtX2dyb3VwOworCXN0cnVjdCBibngyeF9tY2FzdF9tYWNfZWxlbSAqbWFjX2VsZW07CisJaW50IHRvdGFsX2VsZW1zID0gMCwgbWFjc19saXN0X2xlbiA9IDAsIG9mZnNldCA9IDA7CisKKwkvKiBXaGVuIGFkZGluZyBNQUNzIHdlJ2xsIG5lZWQgdG8gc3RvcmUgdGhlaXIgdmFsdWVzICovCisJaWYgKGNtZCA9PSBCTlgyWF9NQ0FTVF9DTURfQUREIHx8IGNtZCA9PSBCTlgyWF9NQ0FTVF9DTURfU0VUKQorCQltYWNzX2xpc3RfbGVuID0gcC0+bWNhc3RfbGlzdF9sZW47CiAKIAkvKiBJZiB0aGUgY29tbWFuZCBpcyBlbXB0eSAoImhhbmRsZSBwZW5kaW5nIGNvbW1hbmRzIG9ubHkiKSwgYnJlYWsgKi8KIAlpZiAoIXAtPm1jYXN0X2xpc3RfbGVuKQogCQlyZXR1cm4gMDsKIAotCXRvdGFsX3N6ID0gc2l6ZW9mKCpuZXdfY21kKSArCi0JCW1hY3NfbGlzdF9sZW4gKiBzaXplb2Yoc3RydWN0IGJueDJ4X21jYXN0X21hY19lbGVtKTsKLQogCS8qIEFkZCBtY2FzdCBpcyBjYWxsZWQgdW5kZXIgc3Bpbl9sb2NrLCB0aHVzIGNhbGxpbmcgd2l0aCBHRlBfQVRPTUlDICovCi0JbmV3X2NtZCA9IGt6YWxsb2ModG90YWxfc3osIEdGUF9BVE9NSUMpOwotCisJbmV3X2NtZCA9IGt6YWxsb2Moc2l6ZW9mKCpuZXdfY21kKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFuZXdfY21kKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCUlOSVRfTElTVF9IRUFEKCZuZXdfY21kLT5kYXRhLm1hY3NfaGVhZCk7CisJSU5JVF9MSVNUX0hFQUQoJm5ld19jbWQtPmdyb3VwX2hlYWQpOworCW5ld19jbWQtPnR5cGUgPSBjbWQ7CisJbmV3X2NtZC0+ZG9uZSA9IGZhbHNlOworCiAJRFAoQk5YMlhfTVNHX1NQLCAiQWJvdXQgdG8gZW5xdWV1ZSBhIG5ldyAlZCBjb21tYW5kLiBtYWNzX2xpc3RfbGVuPSVkXG4iLAogCSAgIGNtZCwgbWFjc19saXN0X2xlbik7CiAKLQlJTklUX0xJU1RfSEVBRCgmbmV3X2NtZC0+ZGF0YS5tYWNzX2hlYWQpOwotCi0JbmV3X2NtZC0+dHlwZSA9IGNtZDsKLQluZXdfY21kLT5kb25lID0gZmFsc2U7Ci0KIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgQk5YMlhfTUNBU1RfQ01EX0FERDoKLQkJY3VyX21hYyA9IChzdHJ1Y3QgYm54MnhfbWNhc3RfbWFjX2VsZW0gKikKLQkJCSAgKCh1OCAqKW5ld19jbWQgKyBzaXplb2YoKm5ld19jbWQpKTsKLQotCQkvKiBQdXNoIHRoZSBNQUNzIG9mIHRoZSBjdXJyZW50IGNvbW1hbmQgaW50byB0aGUgcGVuZGluZyBjb21tYW5kCi0JCSAqIE1BQ3MgbGlzdDogRklGTworCWNhc2UgQk5YMlhfTUNBU1RfQ01EX1NFVDoKKwkJLyogRm9yIGEgc2V0IGNvbW1hbmQsIHdlIG5lZWQgdG8gYWxsb2NhdGUgc3VmZmljaWVudCBtZW1vcnkgZm9yCisJCSAqIGFsbCB0aGUgYmlucywgc2luY2Ugd2UgY2FuJ3QgYW5hbHl6ZSBhdCB0aGlzIHBvaW50IGhvdyBtdWNoCisJCSAqIG1lbW9yeSB3b3VsZCBiZSByZXF1aXJlZC4KIAkJICovCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCAmcC0+bWNhc3RfbGlzdCwgbGluaykgewotCQkJbWVtY3B5KGN1cl9tYWMtPm1hYywgcG9zLT5tYWMsIEVUSF9BTEVOKTsKLQkJCWxpc3RfYWRkX3RhaWwoJmN1cl9tYWMtPmxpbmssICZuZXdfY21kLT5kYXRhLm1hY3NfaGVhZCk7Ci0JCQljdXJfbWFjKys7CisJCXRvdGFsX2VsZW1zID0gbWFjc19saXN0X2xlbjsKKwkJaWYgKGNtZCA9PSBCTlgyWF9NQ0FTVF9DTURfU0VUKSB7CisJCQlpZiAodG90YWxfZWxlbXMgPCBCTlgyWF9NQ0FTVF9CSU5TX05VTSkKKwkJCQl0b3RhbF9lbGVtcyA9IEJOWDJYX01DQVNUX0JJTlNfTlVNOwogCQl9Ci0KKwkJd2hpbGUgKHRvdGFsX2VsZW1zID4gMCkgeworCQkJZWxlbV9ncm91cCA9IChzdHJ1Y3QgYm54MnhfbWNhc3RfZWxlbV9ncm91cCAqKQorCQkJCSAgICAgX19nZXRfZnJlZV9wYWdlKEdGUF9BVE9NSUMgfCBfX0dGUF9aRVJPKTsKKwkJCWlmICghZWxlbV9ncm91cCkgeworCQkJCWJueDJ4X2ZyZWVfZ3JvdXBzKCZuZXdfY21kLT5ncm91cF9oZWFkKTsKKwkJCQlrZnJlZShuZXdfY21kKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCXRvdGFsX2VsZW1zIC09IE1DQVNUX01BQ19FTEVNU19QRVJfUEc7CisJCQlsaXN0X2FkZF90YWlsKCZlbGVtX2dyb3VwLT5tY2FzdF9ncm91cF9saW5rLAorCQkJCSAgICAgICZuZXdfY21kLT5ncm91cF9oZWFkKTsKKwkJfQorCQllbGVtX2dyb3VwID0gbGlzdF9maXJzdF9lbnRyeSgmbmV3X2NtZC0+Z3JvdXBfaGVhZCwKKwkJCQkJICAgICAgc3RydWN0IGJueDJ4X21jYXN0X2VsZW1fZ3JvdXAsCisJCQkJCSAgICAgIG1jYXN0X2dyb3VwX2xpbmspOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJnAtPm1jYXN0X2xpc3QsIGxpbmspIHsKKwkJCW1hY19lbGVtID0gJmVsZW1fZ3JvdXAtPm1jYXN0X2VsZW1zW29mZnNldF0ubWFjX2VsZW07CisJCQltZW1jcHkobWFjX2VsZW0tPm1hYywgcG9zLT5tYWMsIEVUSF9BTEVOKTsKKwkJCS8qIFB1c2ggdGhlIE1BQ3Mgb2YgdGhlIGN1cnJlbnQgY29tbWFuZCBpbnRvIHRoZSBwZW5kaW5nCisJCQkgKiBjb21tYW5kIE1BQ3MgbGlzdDogRklGTworCQkJICovCisJCQlsaXN0X2FkZF90YWlsKCZtYWNfZWxlbS0+bGluaywKKwkJCQkgICAgICAmbmV3X2NtZC0+ZGF0YS5tYWNzX2hlYWQpOworCQkJb2Zmc2V0Kys7CisJCQlpZiAob2Zmc2V0ID09IE1DQVNUX01BQ19FTEVNU19QRVJfUEcpIHsKKwkJCQlvZmZzZXQgPSAwOworCQkJCWVsZW1fZ3JvdXAgPSBsaXN0X25leHRfZW50cnkoZWxlbV9ncm91cCwKKwkJCQkJCQkgICAgIG1jYXN0X2dyb3VwX2xpbmspOworCQkJfQorCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBCTlgyWF9NQ0FTVF9DTURfREVMOgpAQCAtMjc3MSw3ICsyODM3LDggQEAKIAl1OCByeF90eF9hZGRfZmxhZyA9IGJueDJ4X21jYXN0X2dldF9yeF90eF9mbGFnKG8pOwogCWludCBiaW47CiAKLQlpZiAoKGNtZCA9PSBCTlgyWF9NQ0FTVF9DTURfQUREKSB8fCAoY21kID09IEJOWDJYX01DQVNUX0NNRF9SRVNUT1JFKSkKKwlpZiAoKGNtZCA9PSBCTlgyWF9NQ0FTVF9DTURfQUREKSB8fCAoY21kID09IEJOWDJYX01DQVNUX0NNRF9SRVNUT1JFKSB8fAorCSAgICAoY21kID09IEJOWDJYX01DQVNUX0NNRF9TRVRfQUREKSkKIAkJcnhfdHhfYWRkX2ZsYWcgfD0gRVRIX01VTFRJQ0FTVF9SVUxFU19DTURfSVNfQUREOwogCiAJZGF0YS0+cnVsZXNbaWR4XS5jbWRfZ2VuZXJhbF9kYXRhIHw9IHJ4X3R4X2FkZF9mbGFnOwpAQCAtMjc5Nyw2ICsyODY0LDE2IEBACiAJCWJpbiA9IGNmZ19kYXRhLT5iaW47CiAJCWJyZWFrOwogCisJY2FzZSBCTlgyWF9NQ0FTVF9DTURfU0VUX0FERDoKKwkJYmluID0gY2ZnX2RhdGEtPmJpbjsKKwkJQklUX1ZFQzY0X1NFVF9CSVQoby0+cmVnaXN0cnkuYXByb3hfbWF0Y2gudmVjLCBiaW4pOworCQlicmVhazsKKworCWNhc2UgQk5YMlhfTUNBU1RfQ01EX1NFVF9ERUw6CisJCWJpbiA9IGNmZ19kYXRhLT5iaW47CisJCUJJVF9WRUM2NF9DTEVBUl9CSVQoby0+cmVnaXN0cnkuYXByb3hfbWF0Y2gudmVjLCBiaW4pOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCUJOWDJYX0VSUigiVW5rbm93biBjb21tYW5kOiAlZFxuIiwgY21kKTsKIAkJcmV0dXJuOwpAQCAtMjkzMiw2ICszMDA5LDExMCBAQAogCQljbWRfcG9zLT5kYXRhLm5leHRfYmluKys7CiB9CiAKK3N0YXRpYyB2b2lkCitibngyeF9tY2FzdF9oZGxfcGVuZGluZ19zZXRfZTJfY29udmVydChzdHJ1Y3QgYm54MnggKmJwLAorCQkJCSAgICAgICBzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICpvLAorCQkJCSAgICAgICBzdHJ1Y3QgYm54MnhfcGVuZGluZ19tY2FzdF9jbWQgKmNtZF9wb3MpCit7CisJdTY0IGN1cltCTlgyWF9NQ0FTVF9WRUNfU1pdLCByZXFbQk5YMlhfTUNBU1RfVkVDX1NaXTsKKwlzdHJ1Y3QgYm54MnhfbWNhc3RfbWFjX2VsZW0gKnBtYWNfcG9zLCAqcG1hY19wb3NfbjsKKwlzdHJ1Y3QgYm54MnhfbWNhc3RfYmluX2VsZW0gKnBfaXRlbTsKKwlzdHJ1Y3QgYm54MnhfbWNhc3RfZWxlbV9ncm91cCAqZWxlbV9ncm91cDsKKwlpbnQgY250ID0gMCwgbWFjX2NudCA9IDAsIG9mZnNldCA9IDAsIGk7CisKKwltZW1zZXQocmVxLCAwLCBzaXplb2YodTY0KSAqIEJOWDJYX01DQVNUX1ZFQ19TWik7CisJbWVtY3B5KGN1ciwgby0+cmVnaXN0cnkuYXByb3hfbWF0Y2gudmVjLAorCSAgICAgICBzaXplb2YodTY0KSAqIEJOWDJYX01DQVNUX1ZFQ19TWik7CisKKwkvKiBGaWxsIGBjdXJyZW50JyB3aXRoIHRoZSByZXF1aXJlZCBzZXQgb2YgYmlucyB0byBjb25maWd1cmUgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG1hY19wb3MsIHBtYWNfcG9zX24sICZjbWRfcG9zLT5kYXRhLm1hY3NfaGVhZCwKKwkJCQkgbGluaykgeworCQlpbnQgYmluID0gYm54MnhfbWNhc3RfYmluX2Zyb21fbWFjKHBtYWNfcG9zLT5tYWMpOworCisJCURQKEJOWDJYX01TR19TUCwgIlNldCBjb250YWlucyAlcE0gbWNhc3QgTUFDXG4iLAorCQkgICBwbWFjX3Bvcy0+bWFjKTsKKworCQlCSVRfVkVDNjRfU0VUX0JJVChyZXEsIGJpbik7CisJCWxpc3RfZGVsKCZwbWFjX3Bvcy0+bGluayk7CisJCW1hY19jbnQrKzsKKwl9CisKKwkvKiBXZSBubyBsb25nZXIgaGF2ZSB1c2UgZm9yIHRoZSBNQUNzOyBOZWVkIHRvIHJlLXVzZSBtZW1vcnkgZm9yCisJICogYSBsaXN0IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNvbmZpZ3VyZSBiaW5zLgorCSAqLworCWNtZF9wb3MtPnNldF9jb252ZXJ0ID0gdHJ1ZTsKKwlJTklUX0xJU1RfSEVBRCgmY21kX3Bvcy0+ZGF0YS5tYWNzX2hlYWQpOworCWVsZW1fZ3JvdXAgPSBsaXN0X2ZpcnN0X2VudHJ5KCZjbWRfcG9zLT5ncm91cF9oZWFkLAorCQkJCSAgICAgIHN0cnVjdCBibngyeF9tY2FzdF9lbGVtX2dyb3VwLAorCQkJCSAgICAgIG1jYXN0X2dyb3VwX2xpbmspOworCWZvciAoaSA9IDA7IGkgPCBCTlgyWF9NQ0FTVF9CSU5TX05VTTsgaSsrKSB7CisJCWJvb2wgYl9jdXJyZW50ID0gISFCSVRfVkVDNjRfVEVTVF9CSVQoY3VyLCBpKTsKKwkJYm9vbCBiX3JlcXVpcmVkID0gISFCSVRfVkVDNjRfVEVTVF9CSVQocmVxLCBpKTsKKworCQlpZiAoYl9jdXJyZW50ID09IGJfcmVxdWlyZWQpCisJCQljb250aW51ZTsKKworCQlwX2l0ZW0gPSAmZWxlbV9ncm91cC0+bWNhc3RfZWxlbXNbb2Zmc2V0XS5iaW5fZWxlbTsKKwkJcF9pdGVtLT5iaW4gPSBpOworCQlwX2l0ZW0tPnR5cGUgPSBiX3JlcXVpcmVkID8gQk5YMlhfTUNBU1RfQ01EX1NFVF9BREQKKwkJCQkJICA6IEJOWDJYX01DQVNUX0NNRF9TRVRfREVMOworCQlsaXN0X2FkZF90YWlsKCZwX2l0ZW0tPmxpbmsgLCAmY21kX3Bvcy0+ZGF0YS5tYWNzX2hlYWQpOworCQljbnQrKzsKKwkJb2Zmc2V0Kys7CisJCWlmIChvZmZzZXQgPT0gTUNBU1RfTUFDX0VMRU1TX1BFUl9QRykgeworCQkJb2Zmc2V0ID0gMDsKKwkJCWVsZW1fZ3JvdXAgPSBsaXN0X25leHRfZW50cnkoZWxlbV9ncm91cCwKKwkJCQkJCSAgICAgbWNhc3RfZ3JvdXBfbGluayk7CisJCX0KKwl9CisKKwkvKiBXZSBub3cgZGVmaW5pdGVseSBrbm93IGhvdyBtYW55IGNvbW1hbmRzIGFyZSBoaWRpbmcgaGVyZS4KKwkgKiBBbHNvIG5lZWQgdG8gY29ycmVjdCB0aGUgZGlzcnVwdGlvbiB3ZSd2ZSBhZGRlZCB0byBndWFyYW50ZWUgdGhpcworCSAqIHdvdWxkIGJlIGVucXVldWVkLgorCSAqLworCW8tPnRvdGFsX3BlbmRpbmdfbnVtIC09IChvLT5tYXhfY21kX2xlbiArIG1hY19jbnQpOworCW8tPnRvdGFsX3BlbmRpbmdfbnVtICs9IGNudDsKKworCURQKEJOWDJYX01TR19TUCwgIm8tPnRvdGFsX3BlbmRpbmdfbnVtPSVkXG4iLCBvLT50b3RhbF9wZW5kaW5nX251bSk7Cit9CisKK3N0YXRpYyB2b2lkCitibngyeF9tY2FzdF9oZGxfcGVuZGluZ19zZXRfZTIoc3RydWN0IGJueDJ4ICpicCwKKwkJCSAgICAgICBzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICpvLAorCQkJICAgICAgIHN0cnVjdCBibngyeF9wZW5kaW5nX21jYXN0X2NtZCAqY21kX3BvcywKKwkJCSAgICAgICBpbnQgKmNudCkKK3sKKwl1bmlvbiBibngyeF9tY2FzdF9jb25maWdfZGF0YSBjZmdfZGF0YSA9IHtOVUxMfTsKKwlzdHJ1Y3QgYm54MnhfbWNhc3RfYmluX2VsZW0gKnBfaXRlbSwgKnBfaXRlbV9uOworCisJLyogVGhpcyBpcyBhY3R1YWxseSBhIDItcGFydCBzY2hlbWUgLSBpdCBzdGFydHMgYnkgY29udmVydGluZyB0aGUgTUFDcworCSAqIGludG8gYSBsaXN0IG9mIGJpbnMgdG8gYmUgYWRkZWQvcmVtb3ZlZCwgYW5kIGNvcnJlY3RpbmcgdGhlIG51bWJlcnMKKwkgKiBvbiB0aGUgb2JqZWN0LiB0aGlzIGlzIG5vdyBhbGxvd2VkLCBhcyB3ZSdyZSBub3cgc3VyZSB0aGF0IGFsbAorCSAqIHByZXZpb3VzIGNvbmZpZ3VyZWQgcmVxdWVzdHMgaGF2ZSBhbHJlYWR5IGFwcGxpZWQuCisJICogVGhlIHNlY29uZCBwYXJ0IGlzIGFjdHVhbGx5IGFkZGluZyBydWxlcyBmb3IgdGhlIG5ld2x5IGludHJvZHVjZWQKKwkgKiBlbnRyaWVzIFtsaWtlIGFsbCB0aGUgcmVzdCBvZiB0aGUgaGRsX3BlbmRpbmcgZnVuY3Rpb25zXS4KKwkgKi8KKwlpZiAoIWNtZF9wb3MtPnNldF9jb252ZXJ0KQorCQlibngyeF9tY2FzdF9oZGxfcGVuZGluZ19zZXRfZTJfY29udmVydChicCwgbywgY21kX3Bvcyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocF9pdGVtLCBwX2l0ZW1fbiwgJmNtZF9wb3MtPmRhdGEubWFjc19oZWFkLAorCQkJCSBsaW5rKSB7CisJCWNmZ19kYXRhLmJpbiA9ICh1OClwX2l0ZW0tPmJpbjsKKwkJby0+c2V0X29uZV9ydWxlKGJwLCBvLCAqY250LCAmY2ZnX2RhdGEsIHBfaXRlbS0+dHlwZSk7CisJCSgqY250KSsrOworCisJCWxpc3RfZGVsKCZwX2l0ZW0tPmxpbmspOworCisJCS8qIEJyZWFrIGlmIHdlIHJlYWNoZWQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJ1bGVzLiAqLworCQlpZiAoKmNudCA+PSBvLT5tYXhfY21kX2xlbikKKwkJCWJyZWFrOworCX0KKworCS8qIGlmIG5vIG1vcmUgTUFDcyB0byBjb25maWd1cmUgLSB3ZSBhcmUgZG9uZSAqLworCWlmIChsaXN0X2VtcHR5KCZjbWRfcG9zLT5kYXRhLm1hY3NfaGVhZCkpCisJCWNtZF9wb3MtPmRvbmUgPSB0cnVlOworfQorCiBzdGF0aWMgaW5saW5lIGludCBibngyeF9tY2FzdF9oYW5kbGVfcGVuZGluZ19jbWRzX2UyKHN0cnVjdCBibngyeCAqYnAsCiAJCQkJc3RydWN0IGJueDJ4X21jYXN0X3JhbXJvZF9wYXJhbXMgKnApCiB7CkBAIC0yOTU1LDYgKzMxMzYsMTAgQEAKIAkJCQkJCQkgICAmY250KTsKIAkJCWJyZWFrOwogCisJCWNhc2UgQk5YMlhfTUNBU1RfQ01EX1NFVDoKKwkJCWJueDJ4X21jYXN0X2hkbF9wZW5kaW5nX3NldF9lMihicCwgbywgY21kX3BvcywgJmNudCk7CisJCQlicmVhazsKKwogCQlkZWZhdWx0OgogCQkJQk5YMlhfRVJSKCJVbmtub3duIGNvbW1hbmQ6ICVkXG4iLCBjbWRfcG9zLT50eXBlKTsKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtMjk2NSw2ICszMTUwLDcgQEAKIAkJICovCiAJCWlmIChjbWRfcG9zLT5kb25lKSB7CiAJCQlsaXN0X2RlbCgmY21kX3Bvcy0+bGluayk7CisJCQlibngyeF9mcmVlX2dyb3VwcygmY21kX3Bvcy0+Z3JvdXBfaGVhZCk7CiAJCQlrZnJlZShjbWRfcG9zKTsKIAkJfQogCkBAIC0zMDk1LDYgKzMyODEsMTkgQEAKIAkJby0+c2V0X3JlZ2lzdHJ5X3NpemUobywgcmVnX3N6ICsgcC0+bWNhc3RfbGlzdF9sZW4pOwogCQlicmVhazsKIAorCWNhc2UgQk5YMlhfTUNBU1RfQ01EX1NFVDoKKwkJLyogV2UgY2FuIG9ubHkgbGVhcm4gaG93IG1hbnkgY29tbWFuZHMgd291bGQgYWN0dWFsbHkgYmUgdXNlZAorCQkgKiB3aGVuIHRoaXMgaXMgYmVpbmcgY29uZmlndXJlZC4gU28gZm9yIG5vdywgc2ltcGx5IGd1YXJhbnRlZQorCQkgKiB0aGUgY29tbWFuZCB3aWxsIGJlIGVucXVldWVkIFt0byByZWZyYWluIGZyb20gYWRkaW5nIGxvZ2ljCisJCSAqIHRoYXQgaGFuZGxlcyB0aGlzIGFuZCBUSEVOIGxlYXJucyBpdCBuZWVkcyBzZXZlcmFsIHJhbXJvZHNdLgorCQkgKiBKdXN0IGxpa2UgZm9yIEFERC9Db250LCB0aGUgbWNhc3RfbGlzdF9sZW4gbWlnaHQgYmUgYW4gb3ZlcgorCQkgKiBlc3RpbWF0aW9uOyBvciBldmVuIG1vcmUgc28sIHNpbmNlIHdlIGRvbid0IHRha2UgaW50bworCQkgKiBhY2NvdW50IHRoZSBwb3NzaWJpbGl0eSBvZiByZW1vdmFsIG9mIGV4aXN0aW5nIGJpbnMuCisJCSAqLworCQlvLT5zZXRfcmVnaXN0cnlfc2l6ZShvLCByZWdfc3ogKyBwLT5tY2FzdF9saXN0X2xlbik7CisJCW8tPnRvdGFsX3BlbmRpbmdfbnVtICs9IG8tPm1heF9jbWRfbGVuOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCUJOWDJYX0VSUigiVW5rbm93biBjb21tYW5kOiAlZFxuIiwgY21kKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zMTA4LDEyICszMzA3LDE2IEBACiAKIHN0YXRpYyB2b2lkIGJueDJ4X21jYXN0X3JldmVydF9lMihzdHJ1Y3QgYm54MnggKmJwLAogCQkJCSAgICAgIHN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zICpwLAotCQkJCSAgICAgIGludCBvbGRfbnVtX2JpbnMpCisJCQkJICBpbnQgb2xkX251bV9iaW5zLAorCQkJCSAgZW51bSBibngyeF9tY2FzdF9jbWQgY21kKQogewogCXN0cnVjdCBibngyeF9tY2FzdF9vYmogKm8gPSBwLT5tY2FzdF9vYmo7CiAKIAlvLT5zZXRfcmVnaXN0cnlfc2l6ZShvLCBvbGRfbnVtX2JpbnMpOwogCW8tPnRvdGFsX3BlbmRpbmdfbnVtIC09IHAtPm1jYXN0X2xpc3RfbGVuOworCisJaWYgKGNtZCA9PSBCTlgyWF9NQ0FTVF9DTURfU0VUKQorCQlvLT50b3RhbF9wZW5kaW5nX251bSAtPSBvLT5tYXhfY21kX2xlbjsKIH0KIAogLyoqCkBAIC0zMjIzLDkgKzM0MjYsMTEgQEAKIAkJYm54MnhfbWNhc3RfcmVmcmVzaF9yZWdpc3RyeV9lMihicCwgbyk7CiAKIAkvKiBJZiBDTEVBUl9PTkxZIHdhcyByZXF1ZXN0ZWQgLSBkb24ndCBzZW5kIGEgcmFtcm9kIGFuZCBjbGVhcgotCSAqIFJBTVJPRF9QRU5ESU5HIHN0YXR1cyBpbW1lZGlhdGVseS4KKwkgKiBSQU1ST0RfUEVORElORyBzdGF0dXMgaW1tZWRpYXRlbHkuIGR1ZSB0byB0aGUgU0VUIG9wdGlvbiwgaXQncyBhbHNvCisJICogcG9zc2libGUgdGhhdCBhZnRlciBldmFsdWF0aW5nIHRoZSBkaWZmZXJlbmNlcyB0aGVyZSdzIG5vIG5lZWQgZm9yCisJICogYSByYW1yb2QuIEluIHRoYXQgY2FzZSwgd2UgY2FuIHNraXAgaXQgYXMgd2VsbC4KIAkgKi8KLQlpZiAodGVzdF9iaXQoUkFNUk9EX0RSVl9DTFJfT05MWSwgJnAtPnJhbXJvZF9mbGFncykpIHsKKwlpZiAodGVzdF9iaXQoUkFNUk9EX0RSVl9DTFJfT05MWSwgJnAtPnJhbXJvZF9mbGFncykgfHwgIWNudCkgewogCQlyYXctPmNsZWFyX3BlbmRpbmcocmF3KTsKIAkJcmV0dXJuIDA7CiAJfSBlbHNlIHsKQEAgLTMyNTMsNiArMzQ1OCwxMSBAQAogCQkJCSAgICBzdHJ1Y3QgYm54MnhfbWNhc3RfcmFtcm9kX3BhcmFtcyAqcCwKIAkJCQkgICAgZW51bSBibngyeF9tY2FzdF9jbWQgY21kKQogeworCWlmIChjbWQgPT0gQk5YMlhfTUNBU1RfQ01EX1NFVCkgeworCQlCTlgyWF9FUlIoIkNhbid0IHVzZSBgc2V0JyBjb21tYW5kIG9uIGUxaCFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAkvKiBNYXJrLCB0aGF0IHRoZXJlIGlzIGEgd29yayB0byBkbyAqLwogCWlmICgoY21kID09IEJOWDJYX01DQVNUX0NNRF9ERUwpIHx8IChjbWQgPT0gQk5YMlhfTUNBU1RfQ01EX1JFU1RPUkUpKQogCQlwLT5tY2FzdF9saXN0X2xlbiA9IDE7CkBAIC0zMjYyLDcgKzM0NzIsOCBAQAogCiBzdGF0aWMgdm9pZCBibngyeF9tY2FzdF9yZXZlcnRfZTFoKHN0cnVjdCBibngyeCAqYnAsCiAJCQkJICAgICAgIHN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zICpwLAotCQkJCSAgICAgICBpbnQgb2xkX251bV9iaW5zKQorCQkJCSAgICAgICBpbnQgb2xkX251bV9iaW5zLAorCQkJCSAgICAgICBlbnVtIGJueDJ4X21jYXN0X2NtZCBjbWQpCiB7CiAJLyogRG8gbm90aGluZyAqLwogfQpAQCAtMzM3Miw2ICszNTgzLDExIEBACiAJc3RydWN0IGJueDJ4X21jYXN0X29iaiAqbyA9IHAtPm1jYXN0X29iajsKIAlpbnQgcmVnX3N6ID0gby0+Z2V0X3JlZ2lzdHJ5X3NpemUobyk7CiAKKwlpZiAoY21kID09IEJOWDJYX01DQVNUX0NNRF9TRVQpIHsKKwkJQk5YMlhfRVJSKCJDYW4ndCB1c2UgYHNldCcgY29tbWFuZCBvbiBlMSFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlzd2l0Y2ggKGNtZCkgewogCS8qIERFTCBjb21tYW5kIGRlbGV0ZXMgYWxsIGN1cnJlbnRseSBjb25maWd1cmVkIE1BQ3MgKi8KIAljYXNlIEJOWDJYX01DQVNUX0NNRF9ERUw6CkBAIC0zNDIyLDcgKzM2MzgsOCBAQAogCiBzdGF0aWMgdm9pZCBibngyeF9tY2FzdF9yZXZlcnRfZTEoc3RydWN0IGJueDJ4ICpicCwKIAkJCQkgICAgICBzdHJ1Y3QgYm54MnhfbWNhc3RfcmFtcm9kX3BhcmFtcyAqcCwKLQkJCQkgICAgICBpbnQgb2xkX251bV9tYWNzKQorCQkJCSAgIGludCBvbGRfbnVtX21hY3MsCisJCQkJICAgZW51bSBibngyeF9tY2FzdF9jbWQgY21kKQogewogCXN0cnVjdCBibngyeF9tY2FzdF9vYmogKm8gPSBwLT5tY2FzdF9vYmo7CiAKQEAgLTM1NzIsNiArMzc4OSw3IEBACiAJfQogCiAJbGlzdF9kZWwoJmNtZF9wb3MtPmxpbmspOworCWJueDJ4X2ZyZWVfZ3JvdXBzKCZjbWRfcG9zLT5ncm91cF9oZWFkKTsKIAlrZnJlZShjbWRfcG9zKTsKIAogCXJldHVybiBjbnQ7CkBAIC0zODE2LDcgKzQwMzQsNyBAQAogCXItPmNsZWFyX3BlbmRpbmcocik7CiAKIGVycm9yX2V4aXQxOgotCW8tPnJldmVydChicCwgcCwgb2xkX3JlZ19zaXplKTsKKwlvLT5yZXZlcnQoYnAsIHAsIG9sZF9yZWdfc2l6ZSwgY21kKTsKIAogCXJldHVybiByYzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3NwLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zcC5oCmluZGV4IDQwNDhmYzUuLjBiZjJmZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3NwLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3AuaApAQCAtNTM2LDYgKzUzNiwxNSBAQAogCUJOWDJYX01DQVNUX0NNRF9DT05ULAogCUJOWDJYX01DQVNUX0NNRF9ERUwsCiAJQk5YMlhfTUNBU1RfQ01EX1JFU1RPUkUsCisKKwkvKiBGb2xsb3dpbmcgdGhpcywgbXVsdGljYXN0IGNvbmZpZ3VyYXRpb24gc2hvdWxkIGVxdWFsIHRvIGFwcHJveAorCSAqIHRoZSBzZXQgb2YgTUFDcyBwcm92aWRlZCBbaS5lLiwgcmVtb3ZlIGFsbCBlbHNlXS4KKwkgKiBUaGUgdHdvIHN1Yi1jb21tYW5kcyBhcmUgdXNlZCBpbnRlcm5hbGx5IHRvIGRlY2lkZSB3aGV0aGVyIGEgZ2l2ZW4KKwkgKiBiaW4gaXMgdG8gYmUgYWRkZWQgb3IgcmVtb3ZlZAorCSAqLworCUJOWDJYX01DQVNUX0NNRF9TRVQsCisJQk5YMlhfTUNBU1RfQ01EX1NFVF9BREQsCisJQk5YMlhfTUNBU1RfQ01EX1NFVF9ERUwsCiB9OwogCiBzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqIHsKQEAgLTYzNSw3ICs2NDQsOCBAQAogCSAqLwogCXZvaWQgKCpyZXZlcnQpKHN0cnVjdCBibngyeCAqYnAsCiAJCSAgICAgICBzdHJ1Y3QgYm54MnhfbWNhc3RfcmFtcm9kX3BhcmFtcyAqcCwKLQkJICAgICAgIGludCBvbGRfbnVtX2JpbnMpOworCQkgICAgICAgaW50IG9sZF9udW1fYmlucywKKwkJICAgICAgIGVudW0gYm54MnhfbWNhc3RfY21kIGNtZCk7CiAKIAlpbnQgKCpnZXRfcmVnaXN0cnlfc2l6ZSkoc3RydWN0IGJueDJ4X21jYXN0X29iaiAqbyk7CiAJdm9pZCAoKnNldF9yZWdpc3RyeV9zaXplKShzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICpvLCBpbnQgbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zcmlvdi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3Jpb3YuYwppbmRleCA2MzJkYWZmLi4zZjc3ZDA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zcmlvdi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3NyaW92LmMKQEAgLTU3MywxNyArNTczLDYgQEAKIAkJfQogCX0KIAotCS8qIGNsZWFyIGV4aXN0aW5nIG1jYXN0cyAqLwotCW1jYXN0Lm1jYXN0X2xpc3RfbGVuID0gdmYtPm1jYXN0X2xpc3RfbGVuOwotCXZmLT5tY2FzdF9saXN0X2xlbiA9IG1jX251bTsKLQlyYyA9IGJueDJ4X2NvbmZpZ19tY2FzdChicCwgJm1jYXN0LCBCTlgyWF9NQ0FTVF9DTURfREVMKTsKLQlpZiAocmMpIHsKLQkJQk5YMlhfRVJSKCJGYWlsZWQgdG8gcmVtb3ZlIG11bHRpY2FzdHNcbiIpOwotCQlrZnJlZShtYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQkvKiB1cGRhdGUgbWNhc3QgbGlzdCBvbiB0aGUgcmFtcm9kIHBhcmFtcyAqLwogCWlmIChtY19udW0pIHsKIAkJSU5JVF9MSVNUX0hFQUQoJm1jYXN0Lm1jYXN0X2xpc3QpOwogCQlmb3IgKGkgPSAwOyBpIDwgbWNfbnVtOyBpKyspIHsKQEAgLTU5NCwxMiArNTgzLDE4IEBACiAKIAkJLyogYWRkIG5ldyBtY2FzdHMgKi8KIAkJbWNhc3QubWNhc3RfbGlzdF9sZW4gPSBtY19udW07Ci0JCXJjID0gYm54MnhfY29uZmlnX21jYXN0KGJwLCAmbWNhc3QsIEJOWDJYX01DQVNUX0NNRF9BREQpOworCQlyYyA9IGJueDJ4X2NvbmZpZ19tY2FzdChicCwgJm1jYXN0LCBCTlgyWF9NQ0FTVF9DTURfU0VUKTsKIAkJaWYgKHJjKQotCQkJQk5YMlhfRVJSKCJGYWxlZCB0byBhZGQgbXVsdGljYXN0c1xuIik7Ci0JCWtmcmVlKG1jKTsKKwkJCUJOWDJYX0VSUigiRmFsZWQgdG8gc2V0IG11bHRpY2FzdHNcbiIpOworCX0gZWxzZSB7CisJCS8qIGNsZWFyIGV4aXN0aW5nIG1jYXN0cyAqLworCQlyYyA9IGJueDJ4X2NvbmZpZ19tY2FzdChicCwgJm1jYXN0LCBCTlgyWF9NQ0FTVF9DTURfREVMKTsKKwkJaWYgKHJjKQorCQkJQk5YMlhfRVJSKCJGYWlsZWQgdG8gcmVtb3ZlIG11bHRpY2FzdHNcbiIpOwogCX0KIAorCWtmcmVlKG1jKTsKKwogCXJldHVybiByYzsKIH0KIApAQCAtMTU4Myw3ICsxNTc4LDYgQEAKIAkJICogIEl0IG5lZWRzIHRvIGJlIGluaXRpYWxpemVkIGhlcmUgc28gdGhhdCBpdCBjYW4gYmUgc2FmZWx5CiAJCSAqICBoYW5kbGVkIGJ5IGEgc3Vic2VxdWVudCBGTFIgZmxvdy4KIAkJICovCi0JCXZmLT5tY2FzdF9saXN0X2xlbiA9IDA7CiAJCWJueDJ4X2luaXRfbWNhc3Rfb2JqKGJwLCAmdmYtPm1jYXN0X29iaiwgMHhGRiwKIAkJCQkgICAgIDB4RkYsIDB4RkYsIDB4RkYsCiAJCQkJICAgICBibngyeF92Zl9zcChicCwgdmYsIG1jYXN0X3JkYXRhKSwKQEAgLTI1MjcsNyArMjUyMSw4IEBACiAJZm9yX2VhY2hfdmYoYnAsIHZmaWR4KSB7CiAJCWJ1bGxldGluID0gQlBfVkZfQlVMTEVUSU4oYnAsIHZmaWR4KTsKIAkJaWYgKGJ1bGxldGluLT52YWxpZF9iaXRtYXAgJiAoMSA8PCBWTEFOX1ZBTElEKSkKLQkJCWJueDJ4X3NldF92Zl92bGFuKGJwLT5kZXYsIHZmaWR4LCBidWxsZXRpbi0+dmxhbiwgMCk7CisJCQlibngyeF9zZXRfdmZfdmxhbihicC0+ZGV2LCB2ZmlkeCwgYnVsbGV0aW4tPnZsYW4sIDAsCisJCQkJCSAgaHRvbnMoRVRIX1BfODAyMVEpKTsKIAl9CiB9CiAKQEAgLTI3ODcsNyArMjc4Miw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBibngyeF9zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdmZpZHgsIHUxNiB2bGFuLCB1OCBxb3MpCitpbnQgYm54Mnhfc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHZmaWR4LCB1MTYgdmxhbiwgdTggcW9zLAorCQkgICAgICBfX2JlMTYgdmxhbl9wcm90bykKIHsKIAlzdHJ1Y3QgcGZfdmZfYnVsbGV0aW5fY29udGVudCAqYnVsbGV0aW4gPSBOVUxMOwogCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtMjgwMiw2ICsyNzk4LDkgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJaWYgKHZsYW5fcHJvdG8gIT0gaHRvbnMoRVRIX1BfODAyMVEpKQorCQlyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKKwogCURQKEJOWDJYX01TR19JT1YsICJjb25maWd1cmluZyBWRiAlZCB3aXRoIFZMQU4gJWQgcW9zICVkXG4iLAogCSAgIHZmaWR4LCB2bGFuLCAwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3Jpb3YuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3NyaW92LmgKaW5kZXggNjcwYTU4MS4uN2E2ZDQwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3Jpb3YuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zcmlvdi5oCkBAIC0xOTUsNyArMTk1LDYgQEAKIAlpbnQgbGVhZGluZ19yc3M7CiAKIAkvKiBNQ0FTVCBvYmplY3QgKi8KLQlpbnQgbWNhc3RfbGlzdF9sZW47CiAJc3RydWN0IGJueDJ4X21jYXN0X29iagkJbWNhc3Rfb2JqOwogCiAJLyogUlNTIGNvbmZpZ3VyYXRpb24gb2JqZWN0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dC5jCmluZGV4IDJjZjc5MTAuLmE5ZjlmMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dC5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbWlpLmg+CiAjaW5jbHVkZSA8bGludXgvaWYuaD4KICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bmV0L3RjcC5oPgogI2luY2x1ZGUgPG5ldC91ZHAuaD4KQEAgLTkzLDUwICs5NCw0OSBAQAogCUJDTTU3NDA0X05QQVIsCiAJQkNNNTc0MDZfTlBBUiwKIAlCQ001NzQwN19TRlAsCisJQkNNNTc0MDdfTlBBUiwKIAlCQ001NzQxNF9OUEFSLAogCUJDTTU3NDE2X05QQVIsCi0JQkNNNTczMDRfVkYsCi0JQkNNNTc0MDRfVkYsCi0JQkNNNTc0MTRfVkYsCi0JQkNNNTczMTRfVkYsCisJTkVUWFRSRU1FX0VfVkYsCisJTkVUWFRSRU1FX0NfVkYsCiB9OwogCiAvKiBpbmRleGVkIGJ5IGVudW0gYWJvdmUgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewogCWNoYXIgKm5hbWU7CiB9IGJvYXJkX2luZm9bXSA9IHsKLQl7ICJCcm9hZGNvbSBCQ001NzMwMSBOZXRYdHJlbWUtQyBTaW5nbGUtcG9ydCAxMEdiIEV0aGVybmV0IiB9LAotCXsgIkJyb2FkY29tIEJDTTU3MzAyIE5ldFh0cmVtZS1DIER1YWwtcG9ydCAxMEdiLzI1R2IgRXRoZXJuZXQiIH0sCi0JeyAiQnJvYWRjb20gQkNNNTczMDQgTmV0WHRyZW1lLUMgRHVhbC1wb3J0IDEwR2IvMjVHYi80MEdiLzUwR2IgRXRoZXJuZXQiIH0sCisJeyAiQnJvYWRjb20gQkNNNTczMDEgTmV0WHRyZW1lLUMgMTBHYiBFdGhlcm5ldCIgfSwKKwl7ICJCcm9hZGNvbSBCQ001NzMwMiBOZXRYdHJlbWUtQyAxMEdiLzI1R2IgRXRoZXJuZXQiIH0sCisJeyAiQnJvYWRjb20gQkNNNTczMDQgTmV0WHRyZW1lLUMgMTBHYi8yNUdiLzQwR2IvNTBHYiBFdGhlcm5ldCIgfSwKIAl7ICJCcm9hZGNvbSBCQ001NzQxNyBOZXRYdHJlbWUtRSBFdGhlcm5ldCBQYXJ0aXRpb24iIH0sCi0JeyAiQnJvYWRjb20gQkNNNTg3MDAgTml0cm8gNC1wb3J0IDFHYi8yLjVHYi8xMEdiIEV0aGVybmV0IiB9LAotCXsgIkJyb2FkY29tIEJDTTU3MzExIE5ldFh0cmVtZS1DIFNpbmdsZS1wb3J0IDEwR2IgRXRoZXJuZXQiIH0sCi0JeyAiQnJvYWRjb20gQkNNNTczMTIgTmV0WHRyZW1lLUMgRHVhbC1wb3J0IDEwR2IvMjVHYiBFdGhlcm5ldCIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzQwMiBOZXRYdHJlbWUtRSBEdWFsLXBvcnQgMTBHYiBFdGhlcm5ldCIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzQwNCBOZXRYdHJlbWUtRSBEdWFsLXBvcnQgMTBHYi8yNUdiIEV0aGVybmV0IiB9LAotCXsgIkJyb2FkY29tIEJDTTU3NDA2IE5ldFh0cmVtZS1FIER1YWwtcG9ydCAxMEdCYXNlLVQgRXRoZXJuZXQiIH0sCisJeyAiQnJvYWRjb20gQkNNNTg3MDAgTml0cm8gMUdiLzIuNUdiLzEwR2IgRXRoZXJuZXQiIH0sCisJeyAiQnJvYWRjb20gQkNNNTczMTEgTmV0WHRyZW1lLUMgMTBHYiBFdGhlcm5ldCIgfSwKKwl7ICJCcm9hZGNvbSBCQ001NzMxMiBOZXRYdHJlbWUtQyAxMEdiLzI1R2IgRXRoZXJuZXQiIH0sCisJeyAiQnJvYWRjb20gQkNNNTc0MDIgTmV0WHRyZW1lLUUgMTBHYiBFdGhlcm5ldCIgfSwKKwl7ICJCcm9hZGNvbSBCQ001NzQwNCBOZXRYdHJlbWUtRSAxMEdiLzI1R2IgRXRoZXJuZXQiIH0sCisJeyAiQnJvYWRjb20gQkNNNTc0MDYgTmV0WHRyZW1lLUUgMTBHQmFzZS1UIEV0aGVybmV0IiB9LAogCXsgIkJyb2FkY29tIEJDTTU3NDAyIE5ldFh0cmVtZS1FIEV0aGVybmV0IFBhcnRpdGlvbiIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzQwNyBOZXRYdHJlbWUtRSBEdWFsLXBvcnQgMTBHQmFzZS1UIEV0aGVybmV0IiB9LAotCXsgIkJyb2FkY29tIEJDTTU3NDEyIE5ldFh0cmVtZS1FIER1YWwtcG9ydCAxMEdiIEV0aGVybmV0IiB9LAotCXsgIkJyb2FkY29tIEJDTTU3NDE0IE5ldFh0cmVtZS1FIER1YWwtcG9ydCAxMEdiLzI1R2IgRXRoZXJuZXQiIH0sCi0JeyAiQnJvYWRjb20gQkNNNTc0MTYgTmV0WHRyZW1lLUUgRHVhbC1wb3J0IDEwR0Jhc2UtVCBFdGhlcm5ldCIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzQxNyBOZXRYdHJlbWUtRSBEdWFsLXBvcnQgMTBHQmFzZS1UIEV0aGVybmV0IiB9LAorCXsgIkJyb2FkY29tIEJDTTU3NDA3IE5ldFh0cmVtZS1FIDEwR0Jhc2UtVCBFdGhlcm5ldCIgfSwKKwl7ICJCcm9hZGNvbSBCQ001NzQxMiBOZXRYdHJlbWUtRSAxMEdiIEV0aGVybmV0IiB9LAorCXsgIkJyb2FkY29tIEJDTTU3NDE0IE5ldFh0cmVtZS1FIDEwR2IvMjVHYiBFdGhlcm5ldCIgfSwKKwl7ICJCcm9hZGNvbSBCQ001NzQxNiBOZXRYdHJlbWUtRSAxMEdCYXNlLVQgRXRoZXJuZXQiIH0sCisJeyAiQnJvYWRjb20gQkNNNTc0MTcgTmV0WHRyZW1lLUUgMTBHQmFzZS1UIEV0aGVybmV0IiB9LAogCXsgIkJyb2FkY29tIEJDTTU3NDEyIE5ldFh0cmVtZS1FIEV0aGVybmV0IFBhcnRpdGlvbiIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzMxNCBOZXRYdHJlbWUtQyBEdWFsLXBvcnQgMTBHYi8yNUdiLzQwR2IvNTBHYiBFdGhlcm5ldCIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzQxNyBOZXRYdHJlbWUtRSBEdWFsLXBvcnQgMTBHYi8yNUdiIEV0aGVybmV0IiB9LAotCXsgIkJyb2FkY29tIEJDTTU3NDE2IE5ldFh0cmVtZS1FIER1YWwtcG9ydCAxMEdiIEV0aGVybmV0IiB9LAorCXsgIkJyb2FkY29tIEJDTTU3MzE0IE5ldFh0cmVtZS1DIDEwR2IvMjVHYi80MEdiLzUwR2IgRXRoZXJuZXQiIH0sCisJeyAiQnJvYWRjb20gQkNNNTc0MTcgTmV0WHRyZW1lLUUgMTBHYi8yNUdiIEV0aGVybmV0IiB9LAorCXsgIkJyb2FkY29tIEJDTTU3NDE2IE5ldFh0cmVtZS1FIDEwR2IgRXRoZXJuZXQiIH0sCiAJeyAiQnJvYWRjb20gQkNNNTc0MDQgTmV0WHRyZW1lLUUgRXRoZXJuZXQgUGFydGl0aW9uIiB9LAogCXsgIkJyb2FkY29tIEJDTTU3NDA2IE5ldFh0cmVtZS1FIEV0aGVybmV0IFBhcnRpdGlvbiIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzQwNyBOZXRYdHJlbWUtRSBEdWFsLXBvcnQgMjVHYiBFdGhlcm5ldCIgfSwKKwl7ICJCcm9hZGNvbSBCQ001NzQwNyBOZXRYdHJlbWUtRSAyNUdiIEV0aGVybmV0IiB9LAorCXsgIkJyb2FkY29tIEJDTTU3NDA3IE5ldFh0cmVtZS1FIEV0aGVybmV0IFBhcnRpdGlvbiIgfSwKIAl7ICJCcm9hZGNvbSBCQ001NzQxNCBOZXRYdHJlbWUtRSBFdGhlcm5ldCBQYXJ0aXRpb24iIH0sCiAJeyAiQnJvYWRjb20gQkNNNTc0MTYgTmV0WHRyZW1lLUUgRXRoZXJuZXQgUGFydGl0aW9uIiB9LAotCXsgIkJyb2FkY29tIEJDTTU3MzA0IE5ldFh0cmVtZS1DIEV0aGVybmV0IFZpcnR1YWwgRnVuY3Rpb24iIH0sCi0JeyAiQnJvYWRjb20gQkNNNTc0MDQgTmV0WHRyZW1lLUUgRXRoZXJuZXQgVmlydHVhbCBGdW5jdGlvbiIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzQxNCBOZXRYdHJlbWUtRSBFdGhlcm5ldCBWaXJ0dWFsIEZ1bmN0aW9uIiB9LAotCXsgIkJyb2FkY29tIEJDTTU3MzE0IE5ldFh0cmVtZS1FIEV0aGVybmV0IFZpcnR1YWwgRnVuY3Rpb24iIH0sCisJeyAiQnJvYWRjb20gTmV0WHRyZW1lLUUgRXRoZXJuZXQgVmlydHVhbCBGdW5jdGlvbiIgfSwKKwl7ICJCcm9hZGNvbSBOZXRYdHJlbWUtQyBFdGhlcm5ldCBWaXJ0dWFsIEZ1bmN0aW9uIiB9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGJueHRfcGNpX3RibFtdID0geworCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIDB4MTZjMCksIC5kcml2ZXJfZGF0YSA9IEJDTTU3NDE3X05QQVIgfSwKIAl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCAweDE2YzgpLCAuZHJpdmVyX2RhdGEgPSBCQ001NzMwMSB9LAogCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIDB4MTZjOSksIC5kcml2ZXJfZGF0YSA9IEJDTTU3MzAyIH0sCiAJeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgMHgxNmNhKSwgLmRyaXZlcl9kYXRhID0gQkNNNTczMDQgfSwKQEAgLTE2MCwxMyArMTYwLDE5IEBACiAJeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgMHgxNmU3KSwgLmRyaXZlcl9kYXRhID0gQkNNNTc0MDRfTlBBUiB9LAogCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIDB4MTZlOCksIC5kcml2ZXJfZGF0YSA9IEJDTTU3NDA2X05QQVIgfSwKIAl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCAweDE2ZTkpLCAuZHJpdmVyX2RhdGEgPSBCQ001NzQwN19TRlAgfSwKKwl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCAweDE2ZWEpLCAuZHJpdmVyX2RhdGEgPSBCQ001NzQwN19OUEFSIH0sCisJeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgMHgxNmViKSwgLmRyaXZlcl9kYXRhID0gQkNNNTc0MTJfTlBBUiB9LAogCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIDB4MTZlYyksIC5kcml2ZXJfZGF0YSA9IEJDTTU3NDE0X05QQVIgfSwKKwl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCAweDE2ZWQpLCAuZHJpdmVyX2RhdGEgPSBCQ001NzQxNF9OUEFSIH0sCiAJeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgMHgxNmVlKSwgLmRyaXZlcl9kYXRhID0gQkNNNTc0MTZfTlBBUiB9LAorCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIDB4MTZlZiksIC5kcml2ZXJfZGF0YSA9IEJDTTU3NDE2X05QQVIgfSwKICNpZmRlZiBDT05GSUdfQk5YVF9TUklPVgotCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIDB4MTZjYiksIC5kcml2ZXJfZGF0YSA9IEJDTTU3MzA0X1ZGIH0sCi0JeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgMHgxNmQzKSwgLmRyaXZlcl9kYXRhID0gQkNNNTc0MDRfVkYgfSwKLQl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCAweDE2ZGMpLCAuZHJpdmVyX2RhdGEgPSBCQ001NzQxNF9WRiB9LAotCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIDB4MTZlMSksIC5kcml2ZXJfZGF0YSA9IEJDTTU3MzE0X1ZGIH0sCisJeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgMHgxNmMxKSwgLmRyaXZlcl9kYXRhID0gTkVUWFRSRU1FX0VfVkYgfSwKKwl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCAweDE2Y2IpLCAuZHJpdmVyX2RhdGEgPSBORVRYVFJFTUVfQ19WRiB9LAorCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIDB4MTZkMyksIC5kcml2ZXJfZGF0YSA9IE5FVFhUUkVNRV9FX1ZGIH0sCisJeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgMHgxNmRjKSwgLmRyaXZlcl9kYXRhID0gTkVUWFRSRU1FX0VfVkYgfSwKKwl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCAweDE2ZTEpLCAuZHJpdmVyX2RhdGEgPSBORVRYVFJFTUVfQ19WRiB9LAorCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIDB4MTZlNSksIC5kcml2ZXJfZGF0YSA9IE5FVFhUUkVNRV9DX1ZGIH0sCiAjZW5kaWYKIAl7IDAgfQogfTsKQEAgLTE4OSw4ICsxOTUsNyBAQAogCiBzdGF0aWMgYm9vbCBibnh0X3ZmX3BjaWlkKGVudW0gYm9hcmRfaWR4IGlkeCkKIHsKLQlyZXR1cm4gKGlkeCA9PSBCQ001NzMwNF9WRiB8fCBpZHggPT0gQkNNNTc0MDRfVkYgfHwKLQkJaWR4ID09IEJDTTU3MzE0X1ZGIHx8IGlkeCA9PSBCQ001NzQxNF9WRik7CisJcmV0dXJuIChpZHggPT0gTkVUWFRSRU1FX0NfVkYgfHwgaWR4ID09IE5FVFhUUkVNRV9FX1ZGKTsKIH0KIAogI2RlZmluZSBEQl9DUF9SRUFSTV9GTEFHUwkoREJfS0VZX0NQIHwgREJfSURYX1ZBTElEKQpAQCAtMzUzLDggKzM1OCw4IEBACiAJCXB1c2hfbGVuID0gKGxlbmd0aCArIHNpemVvZigqdHhfcHVzaCkgKyA3KSAvIDg7CiAJCWlmIChwdXNoX2xlbiA+IDE2KSB7CiAJCQlfX2lvd3JpdGU2NF9jb3B5KHR4ci0+dHhfZG9vcmJlbGwsIHR4X3B1c2hfYnVmLCAxNik7Ci0JCQlfX2lvd3JpdGU2NF9jb3B5KHR4ci0+dHhfZG9vcmJlbGwgKyA0LCB0eF9wdXNoX2J1ZiArIDEsCi0JCQkJCSBwdXNoX2xlbiAtIDE2KTsKKwkJCV9faW93cml0ZTMyX2NvcHkodHhyLT50eF9kb29yYmVsbCArIDQsIHR4X3B1c2hfYnVmICsgMSwKKwkJCQkJIChwdXNoX2xlbiAtIDE2KSA8PCAxKTsKIAkJfSBlbHNlIHsKIAkJCV9faW93cml0ZTY0X2NvcHkodHhyLT50eF9kb29yYmVsbCwgdHhfcHVzaF9idWYsCiAJCQkJCSBwdXNoX2xlbik7CkBAIC0zNDE5LDEwICszNDI0LDEwIEBACiAKIAlibnh0X2h3cm1fY21kX2hkcl9pbml0KGJwLCAmcmVxLCBIV1JNX1ZOSUNfUlNTX0NGRywgLTEsIC0xKTsKIAlpZiAoc2V0X3JzcykgewotCQl2bmljLT5oYXNoX3R5cGUgPSBCTlhUX1JTU19IQVNIX1RZUEVfRkxBR19JUFY0IHwKLQkJCQkgQk5YVF9SU1NfSEFTSF9UWVBFX0ZMQUdfVENQX0lQVjQgfAotCQkJCSBCTlhUX1JTU19IQVNIX1RZUEVfRkxBR19JUFY2IHwKLQkJCQkgQk5YVF9SU1NfSEFTSF9UWVBFX0ZMQUdfVENQX0lQVjY7CisJCXZuaWMtPmhhc2hfdHlwZSA9IFZOSUNfUlNTX0NGR19SRVFfSEFTSF9UWVBFX0lQVjQgfAorCQkJCSAgVk5JQ19SU1NfQ0ZHX1JFUV9IQVNIX1RZUEVfVENQX0lQVjQgfAorCQkJCSAgVk5JQ19SU1NfQ0ZHX1JFUV9IQVNIX1RZUEVfSVBWNiB8CisJCQkJICBWTklDX1JTU19DRkdfUkVRX0hBU0hfVFlQRV9UQ1BfSVBWNjsKIAogCQlyZXEuaGFzaF90eXBlID0gY3B1X3RvX2xlMzIodm5pYy0+aGFzaF90eXBlKTsKIApAQCAtNDE1Niw2ICs0MTYxLDExIEBACiAJaWYgKHJjKQogCQlnb3RvIGh3cm1fZnVuY19xY2Fwc19leGl0OwogCisJYnAtPnR4X3B1c2hfdGhyZXNoID0gMDsKKwlpZiAocmVzcC0+ZmxhZ3MgJgorCSAgICBjcHVfdG9fbGUzMihGVU5DX1FDQVBTX1JFU1BfRkxBR1NfUFVTSF9NT0RFX1NVUFBPUlRFRCkpCisJCWJwLT50eF9wdXNoX3RocmVzaCA9IEJOWFRfVFhfUFVTSF9USFJFU0g7CisKIAlpZiAoQk5YVF9QRihicCkpIHsKIAkJc3RydWN0IGJueHRfcGZfaW5mbyAqcGYgPSAmYnAtPnBmOwogCkBAIC00MTg3LDEyICs0MTk3LDYgQEAKIAkJc3RydWN0IGJueHRfdmZfaW5mbyAqdmYgPSAmYnAtPnZmOwogCiAJCXZmLT5md19maWQgPSBsZTE2X3RvX2NwdShyZXNwLT5maWQpOwotCQltZW1jcHkodmYtPm1hY19hZGRyLCByZXNwLT5tYWNfYWRkcmVzcywgRVRIX0FMRU4pOwotCQlpZiAoaXNfdmFsaWRfZXRoZXJfYWRkcih2Zi0+bWFjX2FkZHIpKQotCQkJLyogb3ZlcndyaXRlIG5ldGRldiBkZXZfYWRyIHdpdGggYWRtaW4gVkYgTUFDICovCi0JCQltZW1jcHkoYnAtPmRldi0+ZGV2X2FkZHIsIHZmLT5tYWNfYWRkciwgRVRIX0FMRU4pOwotCQllbHNlCi0JCQlyYW5kb21fZXRoZXJfYWRkcihicC0+ZGV2LT5kZXZfYWRkcik7CiAKIAkJdmYtPm1heF9yc3Njb3NfY3R4cyA9IGxlMTZfdG9fY3B1KHJlc3AtPm1heF9yc3Njb3NfY3R4KTsKIAkJdmYtPm1heF9jcF9yaW5ncyA9IGxlMTZfdG9fY3B1KHJlc3AtPm1heF9jbXBsX3JpbmdzKTsKQEAgLTQyMDQsMTQgKzQyMDgsMjEgQEAKIAkJdmYtPm1heF9sMl9jdHhzID0gbGUxNl90b19jcHUocmVzcC0+bWF4X2wyX2N0eHMpOwogCQl2Zi0+bWF4X3ZuaWNzID0gbGUxNl90b19jcHUocmVzcC0+bWF4X3ZuaWNzKTsKIAkJdmYtPm1heF9zdGF0X2N0eHMgPSBsZTE2X3RvX2NwdShyZXNwLT5tYXhfc3RhdF9jdHgpOworCisJCW1lbWNweSh2Zi0+bWFjX2FkZHIsIHJlc3AtPm1hY19hZGRyZXNzLCBFVEhfQUxFTik7CisJCW11dGV4X3VubG9jaygmYnAtPmh3cm1fY21kX2xvY2spOworCisJCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKHZmLT5tYWNfYWRkcikpIHsKKwkJCS8qIG92ZXJ3cml0ZSBuZXRkZXYgZGV2X2FkciB3aXRoIGFkbWluIFZGIE1BQyAqLworCQkJbWVtY3B5KGJwLT5kZXYtPmRldl9hZGRyLCB2Zi0+bWFjX2FkZHIsIEVUSF9BTEVOKTsKKwkJfSBlbHNlIHsKKwkJCXJhbmRvbV9ldGhlcl9hZGRyKGJwLT5kZXYtPmRldl9hZGRyKTsKKwkJCXJjID0gYm54dF9hcHByb3ZlX21hYyhicCwgYnAtPmRldi0+ZGV2X2FkZHIpOworCQl9CisJCXJldHVybiByYzsKICNlbmRpZgogCX0KIAotCWJwLT50eF9wdXNoX3RocmVzaCA9IDA7Ci0JaWYgKHJlc3AtPmZsYWdzICYKLQkgICAgY3B1X3RvX2xlMzIoRlVOQ19RQ0FQU19SRVNQX0ZMQUdTX1BVU0hfTU9ERV9TVVBQT1JURUQpKQotCQlicC0+dHhfcHVzaF90aHJlc2ggPSBCTlhUX1RYX1BVU0hfVEhSRVNIOwotCiBod3JtX2Z1bmNfcWNhcHNfZXhpdDoKIAltdXRleF91bmxvY2soJmJwLT5od3JtX2NtZF9sb2NrKTsKIAlyZXR1cm4gcmM7CkBAIC00MjQ5LDYgKzQyNjAsOSBAQAogCWlmIChicC0+bWF4X3RjID4gQk5YVF9NQVhfUVVFVUUpCiAJCWJwLT5tYXhfdGMgPSBCTlhUX01BWF9RVUVVRTsKIAorCWlmIChyZXNwLT5xdWV1ZV9jZmdfaW5mbyAmIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfQ0ZHX0lORk9fQVNZTV9DRkcpCisJCWJwLT5tYXhfdGMgPSAxOworCiAJcXB0ciA9ICZyZXNwLT5xdWV1ZV9pZDA7CiAJZm9yIChpID0gMDsgaSA8IGJwLT5tYXhfdGM7IGkrKykgewogCQlicC0+cV9pbmZvW2ldLnF1ZXVlX2lkID0gKnFwdHIrKzsKQEAgLTQzMDcsNiArNDMyMSwzMSBAQAogCXJldHVybiByYzsKIH0KIAoraW50IGJueHRfaHdybV9md19zZXRfdGltZShzdHJ1Y3QgYm54dCAqYnApCit7CisjaWYgSVNfRU5BQkxFRChDT05GSUdfUlRDX0xJQikKKwlzdHJ1Y3QgaHdybV9md19zZXRfdGltZV9pbnB1dCByZXEgPSB7MH07CisJc3RydWN0IHJ0Y190aW1lIHRtOworCXN0cnVjdCB0aW1ldmFsIHR2OworCisJaWYgKGJwLT5od3JtX3NwZWNfY29kZSA8IDB4MTA0MDApCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWRvX2dldHRpbWVvZmRheSgmdHYpOworCXJ0Y190aW1lX3RvX3RtKHR2LnR2X3NlYywgJnRtKTsKKwlibnh0X2h3cm1fY21kX2hkcl9pbml0KGJwLCAmcmVxLCBIV1JNX0ZXX1NFVF9USU1FLCAtMSwgLTEpOworCXJlcS55ZWFyID0gY3B1X3RvX2xlMTYoMTkwMCArIHRtLnRtX3llYXIpOworCXJlcS5tb250aCA9IDEgKyB0bS50bV9tb247CisJcmVxLmRheSA9IHRtLnRtX21kYXk7CisJcmVxLmhvdXIgPSB0bS50bV9ob3VyOworCXJlcS5taW51dGUgPSB0bS50bV9taW47CisJcmVxLnNlY29uZCA9IHRtLnRtX3NlYzsKKwlyZXR1cm4gaHdybV9zZW5kX21lc3NhZ2UoYnAsICZyZXEsIHNpemVvZihyZXEpLCBIV1JNX0NNRF9USU1FT1VUKTsKKyNlbHNlCisJcmV0dXJuIC1FT1BOT1RTVVBQOworI2VuZGlmCit9CisKIHN0YXRpYyBpbnQgYm54dF9od3JtX3BvcnRfcXN0YXRzKHN0cnVjdCBibnh0ICpicCkKIHsKIAlpbnQgcmM7CkBAIC02ODA0LDYgKzY4NDMsOCBAQAogCWlmIChyYykKIAkJZ290byBpbml0X2VycjsKIAorCWJueHRfaHdybV9md19zZXRfdGltZShicCk7CisKIAlkZXYtPmh3X2ZlYXR1cmVzID0gTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9JUFY2X0NTVU0gfCBORVRJRl9GX1NHIHwKIAkJCSAgIE5FVElGX0ZfVFNPIHwgTkVUSUZfRl9UU082IHwKIAkJCSAgIE5FVElGX0ZfR1NPX1VEUF9UVU5ORUwgfCBORVRJRl9GX0dTT19HUkUgfApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHQuaAppbmRleCAyM2UwNGE2Li41MWIxNjRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHQuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHQuaApAQCAtMTEsMTAgKzExLDEwIEBACiAjZGVmaW5lIEJOWFRfSAogCiAjZGVmaW5lIERSVl9NT0RVTEVfTkFNRQkJImJueHRfZW4iCi0jZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMS4zLjAiCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMS41LjAiCiAKICNkZWZpbmUgRFJWX1ZFUl9NQUoJMQotI2RlZmluZSBEUlZfVkVSX01JTgkzCisjZGVmaW5lIERSVl9WRVJfTUlOCTUKICNkZWZpbmUgRFJWX1ZFUl9VUEQJMAogCiBzdHJ1Y3QgdHhfYmQgewpAQCAtMTA2LDExICsxMDYsMTEgQEAKIAkgI2RlZmluZSBDTVBfVFlQRV9SRU1PVEVfRFJJVkVSX1JFUQkJCSAzNAogCSAjZGVmaW5lIENNUF9UWVBFX1JFTU9URV9EUklWRVJfUkVTUAkJCSAzNgogCSAjZGVmaW5lIENNUF9UWVBFX0VSUk9SX1NUQVRVUwkJCQkgNDgKLQkgI2RlZmluZSBDTVBMX0JBU0VfVFlQRV9TVEFUX0VKRUNUCQkJICgweDFhVUwgPDwgMCkKLQkgI2RlZmluZSBDTVBMX0JBU0VfVFlQRV9IV1JNX0RPTkUJCQkgKDB4MjBVTCA8PCAwKQotCSAjZGVmaW5lIENNUExfQkFTRV9UWVBFX0hXUk1fRldEX1JFUQkJCSAoMHgyMlVMIDw8IDApCi0JICNkZWZpbmUgQ01QTF9CQVNFX1RZUEVfSFdSTV9GV0RfUkVTUAkJCSAoMHgyNFVMIDw8IDApCi0JICNkZWZpbmUgQ01QTF9CQVNFX1RZUEVfSFdSTV9BU1lOQ19FVkVOVAkJICgweDJlVUwgPDwgMCkKKwkgI2RlZmluZSBDTVBMX0JBU0VfVFlQRV9TVEFUX0VKRUNUCQkJIDB4MWFVTAorCSAjZGVmaW5lIENNUExfQkFTRV9UWVBFX0hXUk1fRE9ORQkJCSAweDIwVUwKKwkgI2RlZmluZSBDTVBMX0JBU0VfVFlQRV9IV1JNX0ZXRF9SRVEJCQkgMHgyMlVMCisJICNkZWZpbmUgQ01QTF9CQVNFX1RZUEVfSFdSTV9GV0RfUkVTUAkJCSAweDI0VUwKKwkgI2RlZmluZSBDTVBMX0JBU0VfVFlQRV9IV1JNX0FTWU5DX0VWRU5UCQkgMHgyZVVMCiAKIAkjZGVmaW5lIFRYX0NNUF9GTEFHU19FUlJPUgkJCQkoMSA8PCA2KQogCSNkZWZpbmUgVFhfQ01QX0ZMQUdTX1BVU0gJCQkJKDEgPDwgNykKQEAgLTM4OSwxMSArMzg5LDYgQEAKIAogI2RlZmluZSBJTlZBTElEX0hXX1JJTkdfSUQJKCh1MTYpLTEpCiAKLSNkZWZpbmUgQk5YVF9SU1NfSEFTSF9UWVBFX0ZMQUdfSVBWNAkJMHgwMQotI2RlZmluZSBCTlhUX1JTU19IQVNIX1RZUEVfRkxBR19UQ1BfSVBWNAkweDAyCi0jZGVmaW5lIEJOWFRfUlNTX0hBU0hfVFlQRV9GTEFHX0lQVjYJCTB4MDQKLSNkZWZpbmUgQk5YVF9SU1NfSEFTSF9UWVBFX0ZMQUdfVENQX0lQVjYJMHgwOAotCiAvKiBUaGUgaGFyZHdhcmUgc3VwcG9ydHMgY2VydGFpbiBwYWdlIHNpemVzLiAgVXNlIHRoZSBzdXBwb3J0ZWQgcGFnZSBzaXplcwogICogdG8gYWxsb2NhdGUgdGhlIHJpbmdzLgogICovCkBAIC00MTgsNyArNDEzLDcgQEAKIAogI2RlZmluZSBCTlhUX1JYX1BBR0VfU0laRSAoMSA8PCBCTlhUX1JYX1BBR0VfU0hJRlQpCiAKLSNkZWZpbmUgQk5YVF9NSU5fUEtUX1NJWkUJNDUKKyNkZWZpbmUgQk5YVF9NSU5fUEtUX1NJWkUJNTIKIAogI2RlZmluZSBCTlhUX05VTV9URVNUUyhicCkJMAogCkBAIC0xMjI1LDYgKzEyMjAsNyBAQAogaW50IGJueHRfaHdybV9mdW5jX3FjYXBzKHN0cnVjdCBibnh0ICopOwogaW50IGJueHRfaHdybV9zZXRfcGF1c2Uoc3RydWN0IGJueHQgKik7CiBpbnQgYm54dF9od3JtX3NldF9saW5rX3NldHRpbmcoc3RydWN0IGJueHQgKiwgYm9vbCwgYm9vbCk7CitpbnQgYm54dF9od3JtX2Z3X3NldF90aW1lKHN0cnVjdCBibnh0ICopOwogaW50IGJueHRfb3Blbl9uaWMoc3RydWN0IGJueHQgKiwgYm9vbCwgYm9vbCk7CiBpbnQgYm54dF9jbG9zZV9uaWMoc3RydWN0IGJueHQgKiwgYm9vbCwgYm9vbCk7CiBpbnQgYm54dF9nZXRfbWF4X3JpbmdzKHN0cnVjdCBibnh0ICosIGludCAqLCBpbnQgKiwgYm9vbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2V0aHRvb2wuYwppbmRleCBiODNlMTc0Li5hN2UwNGZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9ldGh0b29sLmMKQEAgLTIxLDYgKzIxLDggQEAKICNpbmNsdWRlICJibnh0X252bV9kZWZzLmgiCS8qIE5WUkFNIGNvbnRlbnQgY29uc3RhbnQgYW5kIHN0cnVjdHVyZSBkZWZzICovCiAjaW5jbHVkZSAiYm54dF9md19oZHIuaCIJLyogRmlybXdhcmUgaGRyIGNvbnN0YW50IGFuZCBzdHJ1Y3R1cmUgZGVmcyAqLwogI2RlZmluZSBGTEFTSF9OVlJBTV9USU1FT1VUCSgoSFdSTV9DTURfVElNRU9VVCkgKiAxMDApCisjZGVmaW5lIEZMQVNIX1BBQ0tBR0VfVElNRU9VVAkoKEhXUk1fQ01EX1RJTUVPVVQpICogMjAwKQorI2RlZmluZSBJTlNUQUxMX1BBQ0tBR0VfVElNRU9VVAkoKEhXUk1fQ01EX1RJTUVPVVQpICogMjAwKQogCiBzdGF0aWMgY2hhciAqYm54dF9nZXRfcGtndmVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zmxlbik7CiAKQEAgLTM0Niw3ICszNDgsNyBAQAogCWludCBtYXhfcnhfcmluZ3MsIG1heF90eF9yaW5ncywgdGNzOwogCiAJYm54dF9nZXRfbWF4X3JpbmdzKGJwLCAmbWF4X3J4X3JpbmdzLCAmbWF4X3R4X3JpbmdzLCB0cnVlKTsKLQljaGFubmVsLT5tYXhfY29tYmluZWQgPSBtYXhfcnhfcmluZ3M7CisJY2hhbm5lbC0+bWF4X2NvbWJpbmVkID0gbWF4X3QoaW50LCBtYXhfcnhfcmluZ3MsIG1heF90eF9yaW5ncyk7CiAKIAlpZiAoYm54dF9nZXRfbWF4X3JpbmdzKGJwLCAmbWF4X3J4X3JpbmdzLCAmbWF4X3R4X3JpbmdzLCBmYWxzZSkpIHsKIAkJbWF4X3J4X3JpbmdzID0gMDsKQEAgLTQwNCw4ICs0MDYsOCBAQAogCWlmICh0Y3MgPiAxKQogCQltYXhfdHhfcmluZ3MgLz0gdGNzOwogCi0JaWYgKHNoICYmIChjaGFubmVsLT5jb21iaW5lZF9jb3VudCA+IG1heF9yeF9yaW5ncyB8fAotCQkgICBjaGFubmVsLT5jb21iaW5lZF9jb3VudCA+IG1heF90eF9yaW5ncykpCisJaWYgKHNoICYmCisJICAgIGNoYW5uZWwtPmNvbWJpbmVkX2NvdW50ID4gbWF4X3QoaW50LCBtYXhfcnhfcmluZ3MsIG1heF90eF9yaW5ncykpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJaWYgKCFzaCAmJiAoY2hhbm5lbC0+cnhfY291bnQgPiBtYXhfcnhfcmluZ3MgfHwKQEAgLTQyOCw4ICs0MzAsMTAgQEAKIAogCWlmIChzaCkgewogCQlicC0+ZmxhZ3MgfD0gQk5YVF9GTEFHX1NIQVJFRF9SSU5HUzsKLQkJYnAtPnJ4X25yX3JpbmdzID0gY2hhbm5lbC0+Y29tYmluZWRfY291bnQ7Ci0JCWJwLT50eF9ucl9yaW5nc19wZXJfdGMgPSBjaGFubmVsLT5jb21iaW5lZF9jb3VudDsKKwkJYnAtPnJ4X25yX3JpbmdzID0gbWluX3QoaW50LCBjaGFubmVsLT5jb21iaW5lZF9jb3VudCwKKwkJCQkJbWF4X3J4X3JpbmdzKTsKKwkJYnAtPnR4X25yX3JpbmdzX3Blcl90YyA9IG1pbl90KGludCwgY2hhbm5lbC0+Y29tYmluZWRfY291bnQsCisJCQkJCSAgICAgICBtYXhfdHhfcmluZ3MpOwogCX0gZWxzZSB7CiAJCWJwLT5mbGFncyAmPSB+Qk5YVF9GTEFHX1NIQVJFRF9SSU5HUzsKIAkJYnAtPnJ4X25yX3JpbmdzID0gY2hhbm5lbC0+cnhfY291bnQ7CkBAIC0xMDI4LDYgKzEwMzIsMTAgQEAKIAlyZXR1cm4gYnAtPmxpbmtfaW5mby5saW5rX3VwOwogfQogCitzdGF0aWMgaW50IGJueHRfZmluZF9udnJhbV9pdGVtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiB0eXBlLCB1MTYgb3JkaW5hbCwKKwkJCQl1MTYgZXh0LCB1MTYgKmluZGV4LCB1MzIgKml0ZW1fbGVuZ3RoLAorCQkJCXUzMiAqZGF0YV9sZW5ndGgpOworCiBzdGF0aWMgaW50IGJueHRfZmxhc2hfbnZyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgICB1MTYgZGlyX3R5cGUsCiAJCQkgICAgdTE2IGRpcl9vcmRpbmFsLApAQCAtMTE3OSw3ICsxMTg3LDYgQEAKIAkJCSAgICh1bnNpZ25lZCBsb25nKWNhbGN1bGF0ZWRfY3JjKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCS8qIFRPRE86IFZhbGlkYXRlIGRpZ2l0YWwgc2lnbmF0dXJlIChSU0EtZW5jcnlwdGVkIFNIQS0yNTYgaGFzaCkgaGVyZSAqLwogCXJjID0gYm54dF9mbGFzaF9udnJhbShkZXYsIGRpcl90eXBlLCBCTlhfRElSX09SRElOQUxfRklSU1QsCiAJCQkgICAgICAwLCAwLCBmd19kYXRhLCBmd19zaXplKTsKIAlpZiAocmMgPT0gMCkJLyogRmlybXdhcmUgdXBkYXRlIHN1Y2Nlc3NmdWwgKi8KQEAgLTExODgsNiArMTE5NSw1NyBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGludCBibnh0X2ZsYXNoX21pY3JvY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXUxNiBkaXJfdHlwZSwKKwkJCQljb25zdCB1OCAqZndfZGF0YSwKKwkJCQlzaXplX3QgZndfc2l6ZSkKK3sKKwlzdHJ1Y3QgYm54dF91Y29kZV90cmFpbGVyICp0cmFpbGVyOworCXUzMiBjYWxjdWxhdGVkX2NyYzsKKwl1MzIgc3RvcmVkX2NyYzsKKwlpbnQgcmMgPSAwOworCisJaWYgKGZ3X3NpemUgPCBzaXplb2Yoc3RydWN0IGJueHRfdWNvZGVfdHJhaWxlcikpIHsKKwkJbmV0ZGV2X2VycihkZXYsICJJbnZhbGlkIG1pY3JvY29kZSBmaWxlIHNpemU6ICV1XG4iLAorCQkJICAgKHVuc2lnbmVkIGludClmd19zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXRyYWlsZXIgPSAoc3RydWN0IGJueHRfdWNvZGVfdHJhaWxlciAqKShmd19kYXRhICsgKGZ3X3NpemUgLQorCQkJCQkJc2l6ZW9mKCp0cmFpbGVyKSkpOworCWlmICh0cmFpbGVyLT5zaWcgIT0gY3B1X3RvX2xlMzIoQk5YVF9VQ09ERV9UUkFJTEVSX1NJR05BVFVSRSkpIHsKKwkJbmV0ZGV2X2VycihkZXYsICJJbnZhbGlkIG1pY3JvY29kZSB0cmFpbGVyIHNpZ25hdHVyZTogJTA4WFxuIiwKKwkJCSAgIGxlMzJfdG9fY3B1KHRyYWlsZXItPnNpZykpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGxlMTZfdG9fY3B1KHRyYWlsZXItPmRpcl90eXBlKSAhPSBkaXJfdHlwZSkgeworCQluZXRkZXZfZXJyKGRldiwgIkV4cGVjdGVkIG1pY3JvY29kZSB0eXBlOiAlZCwgcmVhZDogJWRcbiIsCisJCQkgICBkaXJfdHlwZSwgbGUxNl90b19jcHUodHJhaWxlci0+ZGlyX3R5cGUpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChsZTE2X3RvX2NwdSh0cmFpbGVyLT50cmFpbGVyX2xlbmd0aCkgPAorCQlzaXplb2Yoc3RydWN0IGJueHRfdWNvZGVfdHJhaWxlcikpIHsKKwkJbmV0ZGV2X2VycihkZXYsICJJbnZhbGlkIG1pY3JvY29kZSB0cmFpbGVyIGxlbmd0aDogJWRcbiIsCisJCQkgICBsZTE2X3RvX2NwdSh0cmFpbGVyLT50cmFpbGVyX2xlbmd0aCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDb25maXJtIHRoZSBDUkMzMiBjaGVja3N1bSBvZiB0aGUgZmlsZTogKi8KKwlzdG9yZWRfY3JjID0gbGUzMl90b19jcHUoKihfX2xlMzIgKikoZndfZGF0YSArIGZ3X3NpemUgLQorCQkJCQkgICAgIHNpemVvZihzdG9yZWRfY3JjKSkpOworCWNhbGN1bGF0ZWRfY3JjID0gfmNyYzMyKH4wLCBmd19kYXRhLCBmd19zaXplIC0gc2l6ZW9mKHN0b3JlZF9jcmMpKTsKKwlpZiAoY2FsY3VsYXRlZF9jcmMgIT0gc3RvcmVkX2NyYykgeworCQluZXRkZXZfZXJyKGRldiwKKwkJCSAgICJDUkMzMiAoJTA4bFgpIGRvZXMgbm90IG1hdGNoIGNhbGN1bGF0ZWQ6ICUwOGxYXG4iLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpc3RvcmVkX2NyYywKKwkJCSAgICh1bnNpZ25lZCBsb25nKWNhbGN1bGF0ZWRfY3JjKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJjID0gYm54dF9mbGFzaF9udnJhbShkZXYsIGRpcl90eXBlLCBCTlhfRElSX09SRElOQUxfRklSU1QsCisJCQkgICAgICAwLCAwLCBmd19kYXRhLCBmd19zaXplKTsKKworCXJldHVybiByYzsKK30KKwogc3RhdGljIGJvb2wgYm54dF9kaXJfdHlwZV9pc19hcGVfYmluX2Zvcm1hdCh1MTYgZGlyX3R5cGUpCiB7CiAJc3dpdGNoIChkaXJfdHlwZSkgewpAQCAtMTIwNiw3ICsxMjY0LDcgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBib29sIGJueHRfZGlyX3R5cGVfaXNfdW5wcm90ZWN0ZWRfZXhlY19mb3JtYXQodTE2IGRpcl90eXBlKQorc3RhdGljIGJvb2wgYm54dF9kaXJfdHlwZV9pc19vdGhlcl9leGVjX2Zvcm1hdCh1MTYgZGlyX3R5cGUpCiB7CiAJc3dpdGNoIChkaXJfdHlwZSkgewogCWNhc2UgQk5YX0RJUl9UWVBFX0FWUzoKQEAgLTEyMjcsNyArMTI4NSw3IEBACiBzdGF0aWMgYm9vbCBibnh0X2Rpcl90eXBlX2lzX2V4ZWN1dGFibGUodTE2IGRpcl90eXBlKQogewogCXJldHVybiBibnh0X2Rpcl90eXBlX2lzX2FwZV9iaW5fZm9ybWF0KGRpcl90eXBlKSB8fAotCQlibnh0X2Rpcl90eXBlX2lzX3VucHJvdGVjdGVkX2V4ZWNfZm9ybWF0KGRpcl90eXBlKTsKKwkJYm54dF9kaXJfdHlwZV9pc19vdGhlcl9leGVjX2Zvcm1hdChkaXJfdHlwZSk7CiB9CiAKIHN0YXRpYyBpbnQgYm54dF9mbGFzaF9maXJtd2FyZV9mcm9tX2ZpbGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKQEAgLTEyMzcsMTAgKzEyOTUsNiBAQAogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAgKmZ3OwogCWludAkJCXJjOwogCi0JaWYgKGRpcl90eXBlICE9IEJOWF9ESVJfVFlQRV9VUERBVEUgJiYKLQkgICAgYm54dF9kaXJfdHlwZV9pc19leGVjdXRhYmxlKGRpcl90eXBlKSA9PSBmYWxzZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAlyYyA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmaWxlbmFtZSwgJmRldi0+ZGV2KTsKIAlpZiAocmMgIT0gMCkgewogCQluZXRkZXZfZXJyKGRldiwgIkVycm9yICVkIHJlcXVlc3RpbmcgZmlybXdhcmUgZmlsZTogJXNcbiIsCkBAIC0xMjQ5LDYgKzEzMDMsOCBAQAogCX0KIAlpZiAoYm54dF9kaXJfdHlwZV9pc19hcGVfYmluX2Zvcm1hdChkaXJfdHlwZSkgPT0gdHJ1ZSkKIAkJcmMgPSBibnh0X2ZsYXNoX2Zpcm13YXJlKGRldiwgZGlyX3R5cGUsIGZ3LT5kYXRhLCBmdy0+c2l6ZSk7CisJZWxzZSBpZiAoYm54dF9kaXJfdHlwZV9pc19vdGhlcl9leGVjX2Zvcm1hdChkaXJfdHlwZSkgPT0gdHJ1ZSkKKwkJcmMgPSBibnh0X2ZsYXNoX21pY3JvY29kZShkZXYsIGRpcl90eXBlLCBmdy0+ZGF0YSwgZnctPnNpemUpOwogCWVsc2UKIAkJcmMgPSBibnh0X2ZsYXNoX252cmFtKGRldiwgZGlyX3R5cGUsIEJOWF9ESVJfT1JESU5BTF9GSVJTVCwKIAkJCQkgICAgICAwLCAwLCBmdy0+ZGF0YSwgZnctPnNpemUpOwpAQCAtMTI1NywxMCArMTMxMyw4MyBAQAogfQogCiBzdGF0aWMgaW50IGJueHRfZmxhc2hfcGFja2FnZV9mcm9tX2ZpbGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJY2hhciAqZmlsZW5hbWUpCisJCQkJCWNoYXIgKmZpbGVuYW1lLCB1MzIgaW5zdGFsbF90eXBlKQogewotCW5ldGRldl9lcnIoZGV2LCAicGFja2FnZXMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkXG4iKTsKLQlyZXR1cm4gLUVJTlZBTDsKKwlzdHJ1Y3QgYm54dCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBod3JtX252bV9pbnN0YWxsX3VwZGF0ZV9vdXRwdXQgKnJlc3AgPSBicC0+aHdybV9jbWRfcmVzcF9hZGRyOworCXN0cnVjdCBod3JtX252bV9pbnN0YWxsX3VwZGF0ZV9pbnB1dCBpbnN0YWxsID0gezB9OworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJdTMyIGl0ZW1fbGVuOworCXUxNiBpbmRleDsKKwlpbnQgcmM7CisKKwlibnh0X2h3cm1fZndfc2V0X3RpbWUoYnApOworCisJaWYgKGJueHRfZmluZF9udnJhbV9pdGVtKGRldiwgQk5YX0RJUl9UWVBFX1VQREFURSwKKwkJCQkgQk5YX0RJUl9PUkRJTkFMX0ZJUlNULCBCTlhfRElSX0VYVF9OT05FLAorCQkJCSAmaW5kZXgsICZpdGVtX2xlbiwgTlVMTCkgIT0gMCkgeworCQluZXRkZXZfZXJyKGRldiwgIlBLRyB1cGRhdGUgYXJlYSBub3QgY3JlYXRlZCBpbiBudnJhbVxuIik7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisKKwlyYyA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmaWxlbmFtZSwgJmRldi0+ZGV2KTsKKwlpZiAocmMgIT0gMCkgeworCQluZXRkZXZfZXJyKGRldiwgIlBLRyBlcnJvciAlZCByZXF1ZXN0aW5nIGZpbGU6ICVzXG4iLAorCQkJICAgcmMsIGZpbGVuYW1lKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWlmIChmdy0+c2l6ZSA+IGl0ZW1fbGVuKSB7CisJCW5ldGRldl9lcnIoZGV2LCAiUEtHIGluc3VmZmljaWVudCB1cGRhdGUgYXJlYSBpbiBudnJhbTogJWx1IiwKKwkJCSAgICh1bnNpZ25lZCBsb25nKWZ3LT5zaXplKTsKKwkJcmMgPSAtRUZCSUc7CisJfSBlbHNlIHsKKwkJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOworCQl1OCAqa21lbTsKKwkJc3RydWN0IGh3cm1fbnZtX21vZGlmeV9pbnB1dCBtb2RpZnkgPSB7MH07CisKKwkJYm54dF9od3JtX2NtZF9oZHJfaW5pdChicCwgJm1vZGlmeSwgSFdSTV9OVk1fTU9ESUZZLCAtMSwgLTEpOworCisJCW1vZGlmeS5kaXJfaWR4ID0gY3B1X3RvX2xlMTYoaW5kZXgpOworCQltb2RpZnkubGVuID0gY3B1X3RvX2xlMzIoZnctPnNpemUpOworCisJCWttZW0gPSBkbWFfYWxsb2NfY29oZXJlbnQoJmJwLT5wZGV2LT5kZXYsIGZ3LT5zaXplLAorCQkJCQkgICZkbWFfaGFuZGxlLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFrbWVtKSB7CisJCQluZXRkZXZfZXJyKGRldiwKKwkJCQkgICAiZG1hX2FsbG9jX2NvaGVyZW50IGZhaWx1cmUsIGxlbmd0aCA9ICV1XG4iLAorCQkJCSAgICh1bnNpZ25lZCBpbnQpZnctPnNpemUpOworCQkJcmMgPSAtRU5PTUVNOworCQl9IGVsc2UgeworCQkJbWVtY3B5KGttZW0sIGZ3LT5kYXRhLCBmdy0+c2l6ZSk7CisJCQltb2RpZnkuaG9zdF9zcmNfYWRkciA9IGNwdV90b19sZTY0KGRtYV9oYW5kbGUpOworCisJCQlyYyA9IGh3cm1fc2VuZF9tZXNzYWdlKGJwLCAmbW9kaWZ5LCBzaXplb2YobW9kaWZ5KSwKKwkJCQkJICAgICAgIEZMQVNIX1BBQ0tBR0VfVElNRU9VVCk7CisJCQlkbWFfZnJlZV9jb2hlcmVudCgmYnAtPnBkZXYtPmRldiwgZnctPnNpemUsIGttZW0sCisJCQkJCSAgZG1hX2hhbmRsZSk7CisJCX0KKwl9CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAoKGluc3RhbGxfdHlwZSAmIDB4ZmZmZikgPT0gMCkKKwkJaW5zdGFsbF90eXBlID4+PSAxNjsKKwlibnh0X2h3cm1fY21kX2hkcl9pbml0KGJwLCAmaW5zdGFsbCwgSFdSTV9OVk1fSU5TVEFMTF9VUERBVEUsIC0xLCAtMSk7CisJaW5zdGFsbC5pbnN0YWxsX3R5cGUgPSBjcHVfdG9fbGUzMihpbnN0YWxsX3R5cGUpOworCisJcmMgPSBod3JtX3NlbmRfbWVzc2FnZShicCwgJmluc3RhbGwsIHNpemVvZihpbnN0YWxsKSwKKwkJCSAgICAgICBJTlNUQUxMX1BBQ0tBR0VfVElNRU9VVCk7CisJaWYgKHJjKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAocmVzcC0+cmVzdWx0KSB7CisJCW5ldGRldl9lcnIoZGV2LCAiUEtHIGluc3RhbGwgZXJyb3IgPSAlZCwgcHJvYmxlbV9pdGVtID0gJWRcbiIsCisJCQkgICAoczgpcmVzcC0+cmVzdWx0LCAoaW50KXJlc3AtPnByb2JsZW1faXRlbSk7CisJCXJldHVybiAtRU5PUEtHOworCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBibnh0X2ZsYXNoX2RldmljZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApAQCAtMTI3MSw4ICsxNDAwLDEwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChmbGFzaC0+cmVnaW9uID09IEVUSFRPT0xfRkxBU0hfQUxMX1JFR0lPTlMpCi0JCXJldHVybiBibnh0X2ZsYXNoX3BhY2thZ2VfZnJvbV9maWxlKGRldiwgZmxhc2gtPmRhdGEpOworCWlmIChmbGFzaC0+cmVnaW9uID09IEVUSFRPT0xfRkxBU0hfQUxMX1JFR0lPTlMgfHwKKwkgICAgZmxhc2gtPnJlZ2lvbiA+IDB4ZmZmZikKKwkJcmV0dXJuIGJueHRfZmxhc2hfcGFja2FnZV9mcm9tX2ZpbGUoZGV2LCBmbGFzaC0+ZGF0YSwKKwkJCQkJCSAgICBmbGFzaC0+cmVnaW9uKTsKIAogCXJldHVybiBibnh0X2ZsYXNoX2Zpcm13YXJlX2Zyb21fZmlsZShkZXYsIGZsYXNoLT5yZWdpb24sIGZsYXNoLT5kYXRhKTsKIH0KQEAgLTE1MTYsNyArMTY0Nyw3IEBACiAKIAkvKiBDcmVhdGUgb3IgcmUtd3JpdGUgYW4gTlZNIGl0ZW06ICovCiAJaWYgKGJueHRfZGlyX3R5cGVfaXNfZXhlY3V0YWJsZSh0eXBlKSA9PSB0cnVlKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCWV4dCA9IGVlcHJvbS0+bWFnaWMgJiAweGZmZmY7CiAJb3JkaW5hbCA9IGVlcHJvbS0+b2Zmc2V0ID4+IDE2OwogCWF0dHIgPSBlZXByb20tPm9mZnNldCAmIDB4ZmZmZjsKQEAgLTE3MTgsNiArMTg0OSwyNSBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGludCBibnh0X253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmMgPSAwOworCisJc3RydWN0IGJueHQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYm54dF9saW5rX2luZm8gKmxpbmtfaW5mbyA9ICZicC0+bGlua19pbmZvOworCisJaWYgKCFCTlhUX1NJTkdMRV9QRihicCkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmICghKGxpbmtfaW5mby0+YXV0b25lZyAmIEJOWFRfQVVUT05FR19TUEVFRCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmMgPSBibnh0X2h3cm1fc2V0X2xpbmtfc2V0dGluZyhicCwgdHJ1ZSwgZmFsc2UpOworCisJcmV0dXJuIHJjOworfQorCiBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgYm54dF9ldGh0b29sX29wcyA9IHsKIAkuZ2V0X2xpbmtfa3NldHRpbmdzCT0gYm54dF9nZXRfbGlua19rc2V0dGluZ3MsCiAJLnNldF9saW5rX2tzZXR0aW5ncwk9IGJueHRfc2V0X2xpbmtfa3NldHRpbmdzLApAQCAtMTc1MCw0ICsxOTAwLDUgQEAKIAkuc2V0X2VlZQkJPSBibnh0X3NldF9lZWUsCiAJLmdldF9tb2R1bGVfaW5mbwk9IGJueHRfZ2V0X21vZHVsZV9pbmZvLAogCS5nZXRfbW9kdWxlX2VlcHJvbQk9IGJueHRfZ2V0X21vZHVsZV9lZXByb20sCisJLm53YXlfcmVzZXQJCT0gYm54dF9ud2F5X3Jlc2V0CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2Z3X2hkci5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2Z3X2hkci5oCmluZGV4IDgyYmY0NGEuLmNhZDMwZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9md19oZHIuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfZndfaGRyLmgKQEAgLTExLDYgKzExLDcgQEAKICNkZWZpbmUgX19CTlhUX0ZXX0hEUl9IX18KIAogI2RlZmluZSBCTlhUX0ZJUk1XQVJFX0JJTl9TSUdOQVRVUkUgICAgIDB4MWE0ZDQzNDIJLyogIkJDTSIrMHgxYSAqLworI2RlZmluZSBCTlhUX1VDT0RFX1RSQUlMRVJfU0lHTkFUVVJFCTB4NzI2YzcyNTQJLyogIlRybHIiICovCiAKIGVudW0gU1VQUE9SVEVEX0ZBTUlMWSB7CiAJREVWSUNFXzU3MDJfM180X0ZBTUlMWSwJCS8qIDAgIC0gRGVuYWxpLCBWaW5zb24sIEsyICovCkBAIC04NSw3ICs4Niw3IEBACiAKIHN0cnVjdCBibnh0X2Z3X2hlYWRlciB7CiAJX19sZTMyIHNpZ25hdHVyZTsJLyogY29uc3RhaW5zIHRoZSBjb25zdGFudCB2YWx1ZSBvZgotCQkJCSAqIEJOWFRfRmlybXdhcmVfQmluX1NpZ25hdHVyZXMKKwkJCQkgKiBCTlhUX0ZJUk1XQVJFX0JJTl9TSUdOQVRVUkUKIAkJCQkgKi8KIAl1OCBmbGFnczsJCS8qIHJlc2VydmVkIGZvciBDaGlNUCB1c2UgKi8KIAl1OCBjb2RlX3R5cGU7CQkvKiBlbnVtIFNVUFBPUlRFRF9DT0RFICovCkBAIC0xMDIsNCArMTAzLDE3IEBACiAJdTggbWFqb3JfdmVyOwogfTsKIAorLyogTWljcm9jb2RlIGFuZCBwcmUtYm9vdCBzb2Z0d2FyZS9maXJtd2FyZSB0cmFpbGVyOiAqLworc3RydWN0IGJueHRfdWNvZGVfdHJhaWxlciB7CisJdTggcnNhX3NpZ1syNTZdOworCV9fbGUxNiBmbGFnczsKKwl1OCB2ZXJzaW9uX2Zvcm1hdDsKKwl1OCB2ZXJzaW9uX2xlbmd0aDsKKwl1OCB2ZXJzaW9uWzE2XTsKKwlfX2xlMTYgZGlyX3R5cGU7CisJX19sZTE2IHRyYWlsZXJfbGVuZ3RoOworCV9fbGUzMiBzaWc7CQkvKiBCTlhUX1VDT0RFX1RSQUlMRVJfU0lHTkFUVVJFICovCisJX19sZTMyIGNoa3N1bTsJCS8qIENSQy0zMiAqLworfTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfaHNpLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfaHNpLmgKaW5kZXggNTE3NTY3Zi4uMDRhOTZjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2hzaS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9oc2kuaApAQCAtMzksNyArMzksNyBAQAogCV9fbGUxNiB0eXBlOwogCSNkZWZpbmUgRUpFQ1RfQ01QTF9UWVBFX01BU0sJCQkJICAgIDB4M2ZVTAogCSNkZWZpbmUgRUpFQ1RfQ01QTF9UWVBFX1NGVAkJCQkgICAgMAotCSNkZWZpbmUgRUpFQ1RfQ01QTF9UWVBFX1NUQVRfRUpFQ1QJCQkgICAoMHgxYVVMIDw8IDApCisJI2RlZmluZSBFSkVDVF9DTVBMX1RZUEVfU1RBVF9FSkVDVAkJCSAgIDB4MWFVTAogCV9fbGUxNiBsZW47CiAJX19sZTMyIG9wYXF1ZTsKIAlfX2xlMzIgdjsKQEAgLTUyLDcgKzUyLDcgQEAKIAlfX2xlMTYgdHlwZTsKIAkjZGVmaW5lIEhXUk1fQ01QTF9UWVBFX01BU0sJCQkJICAgIDB4M2ZVTAogCSNkZWZpbmUgSFdSTV9DTVBMX1RZUEVfU0ZUCQkJCSAgICAwCi0JI2RlZmluZSBIV1JNX0NNUExfVFlQRV9IV1JNX0RPTkUJCQkgICAoMHgyMFVMIDw8IDApCisJI2RlZmluZSBIV1JNX0NNUExfVFlQRV9IV1JNX0RPTkUJCQkgICAweDIwVUwKIAlfX2xlMTYgc2VxdWVuY2VfaWQ7CiAJX19sZTMyIHVudXNlZF8xOwogCV9fbGUzMiB2OwpAQCAtNjUsNyArNjUsNyBAQAogCV9fbGUxNiByZXFfbGVuX3R5cGU7CiAJI2RlZmluZSBIV1JNX0ZXRF9SRVFfQ01QTF9UWVBFX01BU0sJCQkgICAgMHgzZlVMCiAJI2RlZmluZSBIV1JNX0ZXRF9SRVFfQ01QTF9UWVBFX1NGVAkJCSAgICAwCi0JI2RlZmluZSBIV1JNX0ZXRF9SRVFfQ01QTF9UWVBFX0hXUk1fRldEX1JFUQkJICAgKDB4MjJVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9GV0RfUkVRX0NNUExfVFlQRV9IV1JNX0ZXRF9SRVEJCSAgIDB4MjJVTAogCSNkZWZpbmUgSFdSTV9GV0RfUkVRX0NNUExfUkVRX0xFTl9NQVNLCQkJICAgIDB4ZmZjMFVMCiAJI2RlZmluZSBIV1JNX0ZXRF9SRVFfQ01QTF9SRVFfTEVOX1NGVAkJCSAgICA2CiAJX19sZTE2IHNvdXJjZV9pZDsKQEAgLTgxLDcgKzgxLDcgQEAKIAlfX2xlMTYgdHlwZTsKIAkjZGVmaW5lIEhXUk1fRldEX1JFU1BfQ01QTF9UWVBFX01BU0sJCQkgICAgMHgzZlVMCiAJI2RlZmluZSBIV1JNX0ZXRF9SRVNQX0NNUExfVFlQRV9TRlQJCQkgICAgMAotCSNkZWZpbmUgSFdSTV9GV0RfUkVTUF9DTVBMX1RZUEVfSFdSTV9GV0RfUkVTUAkJICAgKDB4MjRVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9GV0RfUkVTUF9DTVBMX1RZUEVfSFdSTV9GV0RfUkVTUAkJICAgMHgyNFVMCiAJX19sZTE2IHNvdXJjZV9pZDsKIAlfX2xlMTYgcmVzcF9sZW47CiAJX19sZTE2IHVudXNlZF8xOwpAQCAtOTYsMjUgKzk2LDI2IEBACiAJX19sZTE2IHR5cGU7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfVFlQRV9NQVNLCQkgICAgMHgzZlVMCiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfVFlQRV9TRlQJCQkgICAgMAotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAgICAgICAoMHgyZVVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfVFlQRV9IV1JNX0FTWU5DX0VWRU5UICAgICAgIDB4MmVVTAogCV9fbGUxNiBldmVudF9pZDsKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9MSU5LX1NUQVRVU19DSEFOR0UgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfTElOS19NVFVfQ0hBTkdFICAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX0xJTktfU1BFRURfQ0hBTkdFICAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9EQ0JfQ09ORklHX0NIQU5HRSAgKDB4M1VMIDw8IDApCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfUE9SVF9DT05OX05PVF9BTExPV0VEICgweDRVTCA8PCAwKQotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX0xJTktfU1BFRURfQ0ZHX05PVF9BTExPV0VEICgweDVVTCA8PCAwKQotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX0xJTktfU1BFRURfQ0ZHX0NIQU5HRSAoMHg2VUwgPDwgMCkKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9QT1JUX1BIWV9DRkdfQ0hBTkdFICgweDdVTCA8PCAwKQotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX0ZVTkNfRFJWUl9VTkxPQUQgICAoMHgxMFVMIDw8IDApCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfRlVOQ19EUlZSX0xPQUQgICAgICgweDExVUwgPDwgMCkKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9QRl9EUlZSX1VOTE9BRCAgICAgKDB4MjBVTCA8PCAwKQotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX1BGX0RSVlJfTE9BRCAgICAgICAoMHgyMVVMIDw8IDApCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfVkZfRkxSCQkgICAoMHgzMFVMIDw8IDApCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfVkZfTUFDX0FERFJfQ0hBTkdFICgweDMxVUwgPDwgMCkKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9QRl9WRl9DT01NX1NUQVRVU19DSEFOR0UgKDB4MzJVTCA8PCAwKQotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX1ZGX0NGR19DSEFOR0UgICAgICAoMHgzM1VMIDw8IDApCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfSFdSTV9FUlJPUgkgICAoMHhmZlVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfTElOS19TVEFUVVNfQ0hBTkdFIDB4MFVMCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfTElOS19NVFVfQ0hBTkdFICAgIDB4MVVMCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfTElOS19TUEVFRF9DSEFOR0UgIDB4MlVMCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfRENCX0NPTkZJR19DSEFOR0UgIDB4M1VMCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfUE9SVF9DT05OX05PVF9BTExPV0VEIDB4NFVMCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfTElOS19TUEVFRF9DRkdfTk9UX0FMTE9XRUQgMHg1VUwKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9MSU5LX1NQRUVEX0NGR19DSEFOR0UgMHg2VUwKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9QT1JUX1BIWV9DRkdfQ0hBTkdFIDB4N1VMCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfRlVOQ19EUlZSX1VOTE9BRCAgIDB4MTBVTAorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX0ZVTkNfRFJWUl9MT0FEICAgICAweDExVUwKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9GVU5DX0ZMUl9QUk9DX0NNUExUIDB4MTJVTAorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX1BGX0RSVlJfVU5MT0FEICAgICAweDIwVUwKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9QRl9EUlZSX0xPQUQgICAgICAgMHgyMVVMCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfVkZfRkxSCQkgICAweDMwVUwKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9WRl9NQUNfQUREUl9DSEFOR0UgMHgzMVVMCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfUEZfVkZfQ09NTV9TVEFUVVNfQ0hBTkdFIDB4MzJVTAorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX1ZGX0NGR19DSEFOR0UgICAgICAweDMzVUwKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9IV1JNX0VSUk9SCSAgIDB4ZmZVTAogCV9fbGUzMiBldmVudF9kYXRhMjsKIAl1OCBvcGFxdWVfdjsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9WCQkJICAgIDB4MVVMCkBAIC0xMzAsOSArMTMxLDkgQEAKIAlfX2xlMTYgdHlwZTsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NUQVRVU19DSEFOR0VfVFlQRV9NQVNLIDB4M2ZVTAogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1RBVFVTX0NIQU5HRV9UWVBFX1NGVCAgMAotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1RBVFVTX0NIQU5HRV9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgKDB4MmVVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1RBVFVTX0NIQU5HRV9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgMHgyZVVMCiAJX19sZTE2IGV2ZW50X2lkOwotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1RBVFVTX0NIQU5HRV9FVkVOVF9JRF9MSU5LX1NUQVRVU19DSEFOR0UgKDB4MFVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TVEFUVVNfQ0hBTkdFX0VWRU5UX0lEX0xJTktfU1RBVFVTX0NIQU5HRSAweDBVTAogCV9fbGUzMiBldmVudF9kYXRhMjsKIAl1OCBvcGFxdWVfdjsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NUQVRVU19DSEFOR0VfVgkgICAgMHgxVUwKQEAgLTE1Niw5ICsxNTcsOSBAQAogCV9fbGUxNiB0eXBlOwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfTVRVX0NIQU5HRV9UWVBFX01BU0sgICAgMHgzZlVMCiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19NVFVfQ0hBTkdFX1RZUEVfU0ZUICAgICAwCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19NVFVfQ0hBTkdFX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAoMHgyZVVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19NVFVfQ0hBTkdFX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAweDJlVUwKIAlfX2xlMTYgZXZlbnRfaWQ7Ci0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19NVFVfQ0hBTkdFX0VWRU5UX0lEX0xJTktfTVRVX0NIQU5HRSAoMHgxVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX01UVV9DSEFOR0VfRVZFTlRfSURfTElOS19NVFVfQ0hBTkdFIDB4MVVMCiAJX19sZTMyIGV2ZW50X2RhdGEyOwogCXU4IG9wYXF1ZV92OwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfTVRVX0NIQU5HRV9WCSAgICAweDFVTApAQCAtMTc2LDkgKzE3Nyw5IEBACiAJX19sZTE2IHR5cGU7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DSEFOR0VfVFlQRV9NQVNLICAweDNmVUwKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NIQU5HRV9UWVBFX1NGVCAgIDAKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NIQU5HRV9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgKDB4MmVVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0hBTkdFX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAweDJlVUwKIAlfX2xlMTYgZXZlbnRfaWQ7Ci0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DSEFOR0VfRVZFTlRfSURfTElOS19TUEVFRF9DSEFOR0UgKDB4MlVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DSEFOR0VfRVZFTlRfSURfTElOS19TUEVFRF9DSEFOR0UgMHgyVUwKIAlfX2xlMzIgZXZlbnRfZGF0YTI7CiAJdTggb3BhcXVlX3Y7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DSEFOR0VfVgkgICAgMHgxVUwKQEAgLTIwMCw4ICsyMDEsNyBAQAogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0hBTkdFX0VWRU5UX0RBVEExX05FV19MSU5LX1NQRUVEXzEwME1CUFNfNDBHQiAoMHgxOTBVTCA8PCAxKQogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0hBTkdFX0VWRU5UX0RBVEExX05FV19MSU5LX1NQRUVEXzEwME1CUFNfNTBHQiAoMHgxZjRVTCA8PCAxKQogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0hBTkdFX0VWRU5UX0RBVEExX05FV19MSU5LX1NQRUVEXzEwME1CUFNfMTAwR0IgKDB4M2U4VUwgPDwgMSkKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NIQU5HRV9FVkVOVF9EQVRBMV9ORVdfTElOS19TUEVFRF8xMDBNQlBTXzEwTUIgKDB4ZmZmZlVMIDw8IDEpCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DSEFOR0VfRVZFTlRfREFUQTFfTkVXX0xJTktfU1BFRURfMTAwTUJQU19MQVNUICAgIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NIQU5HRV9FVkVOVF9EQVRBMV9ORVdfTElOS19TUEVFRF8xMDBNQlBTXzEwTUIKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NIQU5HRV9FVkVOVF9EQVRBMV9ORVdfTElOS19TUEVFRF8xMDBNQlBTX0xBU1QgICAgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0hBTkdFX0VWRU5UX0RBVEExX05FV19MSU5LX1NQRUVEXzEwME1CUFNfMTAwR0IKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NIQU5HRV9FVkVOVF9EQVRBMV9QT1JUX0lEX01BU0sgMHhmZmZmMDAwMFVMCiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DSEFOR0VfRVZFTlRfREFUQTFfUE9SVF9JRF9TRlQgMTYKIH07CkBAIC0yMTEsOSArMjExLDkgQEAKIAlfX2xlMTYgdHlwZTsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9EQ0JfQ09ORklHX0NIQU5HRV9UWVBFX01BU0sgIDB4M2ZVTAogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0RDQl9DT05GSUdfQ0hBTkdFX1RZUEVfU0ZUICAgMAotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0RDQl9DT05GSUdfQ0hBTkdFX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAoMHgyZVVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRENCX0NPTkZJR19DSEFOR0VfVFlQRV9IV1JNX0FTWU5DX0VWRU5UIDB4MmVVTAogCV9fbGUxNiBldmVudF9pZDsKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9EQ0JfQ09ORklHX0NIQU5HRV9FVkVOVF9JRF9EQ0JfQ09ORklHX0NIQU5HRSAoMHgzVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9EQ0JfQ09ORklHX0NIQU5HRV9FVkVOVF9JRF9EQ0JfQ09ORklHX0NIQU5HRSAweDNVTAogCV9fbGUzMiBldmVudF9kYXRhMjsKIAl1OCBvcGFxdWVfdjsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9EQ0JfQ09ORklHX0NIQU5HRV9WCSAgICAweDFVTApAQCAtMjMxLDkgKzIzMSw5IEBACiAJX19sZTE2IHR5cGU7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUE9SVF9DT05OX05PVF9BTExPV0VEX1RZUEVfTUFTSyAweDNmVUwKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QT1JUX0NPTk5fTk9UX0FMTE9XRURfVFlQRV9TRlQgMAotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BPUlRfQ09OTl9OT1RfQUxMT1dFRF9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgKDB4MmVVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BPUlRfQ09OTl9OT1RfQUxMT1dFRF9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgMHgyZVVMCiAJX19sZTE2IGV2ZW50X2lkOwotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BPUlRfQ09OTl9OT1RfQUxMT1dFRF9FVkVOVF9JRF9QT1JUX0NPTk5fTk9UX0FMTE9XRUQgKDB4NFVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUE9SVF9DT05OX05PVF9BTExPV0VEX0VWRU5UX0lEX1BPUlRfQ09OTl9OT1RfQUxMT1dFRCAweDRVTAogCV9fbGUzMiBldmVudF9kYXRhMjsKIAl1OCBvcGFxdWVfdjsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QT1JUX0NPTk5fTk9UX0FMTE9XRURfViAgICAgIDB4MVVMCkBAIC0yNTgsOSArMjU4LDkgQEAKIAlfX2xlMTYgdHlwZTsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NGR19OT1RfQUxMT1dFRF9UWVBFX01BU0sgMHgzZlVMCiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DRkdfTk9UX0FMTE9XRURfVFlQRV9TRlQgMAotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0ZHX05PVF9BTExPV0VEX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAoMHgyZVVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DRkdfTk9UX0FMTE9XRURfVFlQRV9IV1JNX0FTWU5DX0VWRU5UIDB4MmVVTAogCV9fbGUxNiBldmVudF9pZDsKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NGR19OT1RfQUxMT1dFRF9FVkVOVF9JRF9MSU5LX1NQRUVEX0NGR19OT1RfQUxMT1dFRCAoMHg1VUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NGR19OT1RfQUxMT1dFRF9FVkVOVF9JRF9MSU5LX1NQRUVEX0NGR19OT1RfQUxMT1dFRCAweDVVTAogCV9fbGUzMiBldmVudF9kYXRhMjsKIAl1OCBvcGFxdWVfdjsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NGR19OT1RfQUxMT1dFRF9WIDB4MVVMCkBAIC0yNzgsOSArMjc4LDkgQEAKIAlfX2xlMTYgdHlwZTsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NGR19DSEFOR0VfVFlQRV9NQVNLIDB4M2ZVTAogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0ZHX0NIQU5HRV9UWVBFX1NGVCAwCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DRkdfQ0hBTkdFX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAoMHgyZVVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DRkdfQ0hBTkdFX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAweDJlVUwKIAlfX2xlMTYgZXZlbnRfaWQ7Ci0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DRkdfQ0hBTkdFX0VWRU5UX0lEX0xJTktfU1BFRURfQ0ZHX0NIQU5HRSAoMHg2VUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NGR19DSEFOR0VfRVZFTlRfSURfTElOS19TUEVFRF9DRkdfQ0hBTkdFIDB4NlVMCiAJX19sZTMyIGV2ZW50X2RhdGEyOwogCXU4IG9wYXF1ZV92OwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0ZHX0NIQU5HRV9WICAgICAgMHgxVUwKQEAgLTMwMCw5ICszMDAsOSBAQAogCV9fbGUxNiB0eXBlOwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0ZVTkNfRFJWUl9VTkxPQURfVFlQRV9NQVNLICAgMHgzZlVMCiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRlVOQ19EUlZSX1VOTE9BRF9UWVBFX1NGVCAgICAwCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRlVOQ19EUlZSX1VOTE9BRF9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgKDB4MmVVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0ZVTkNfRFJWUl9VTkxPQURfVFlQRV9IV1JNX0FTWU5DX0VWRU5UIDB4MmVVTAogCV9fbGUxNiBldmVudF9pZDsKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9GVU5DX0RSVlJfVU5MT0FEX0VWRU5UX0lEX0ZVTkNfRFJWUl9VTkxPQUQgKDB4MTBVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0ZVTkNfRFJWUl9VTkxPQURfRVZFTlRfSURfRlVOQ19EUlZSX1VOTE9BRCAweDEwVUwKIAlfX2xlMzIgZXZlbnRfZGF0YTI7CiAJdTggb3BhcXVlX3Y7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRlVOQ19EUlZSX1VOTE9BRF9WCSAgICAweDFVTApAQCAtMzIwLDkgKzMyMCw5IEBACiAJX19sZTE2IHR5cGU7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRlVOQ19EUlZSX0xPQURfVFlQRV9NQVNLICAgICAweDNmVUwKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9GVU5DX0RSVlJfTE9BRF9UWVBFX1NGVCAgICAgIDAKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9GVU5DX0RSVlJfTE9BRF9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgKDB4MmVVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0ZVTkNfRFJWUl9MT0FEX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAweDJlVUwKIAlfX2xlMTYgZXZlbnRfaWQ7Ci0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRlVOQ19EUlZSX0xPQURfRVZFTlRfSURfRlVOQ19EUlZSX0xPQUQgKDB4MTFVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0ZVTkNfRFJWUl9MT0FEX0VWRU5UX0lEX0ZVTkNfRFJWUl9MT0FEIDB4MTFVTAogCV9fbGUzMiBldmVudF9kYXRhMjsKIAl1OCBvcGFxdWVfdjsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9GVU5DX0RSVlJfTE9BRF9WCQkgICAgMHgxVUwKQEAgLTM0MCw5ICszNDAsOSBAQAogCV9fbGUxNiB0eXBlOwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BGX0RSVlJfVU5MT0FEX1RZUEVfTUFTSyAgICAgMHgzZlVMCiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUEZfRFJWUl9VTkxPQURfVFlQRV9TRlQgICAgICAwCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUEZfRFJWUl9VTkxPQURfVFlQRV9IV1JNX0FTWU5DX0VWRU5UICgweDJlVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QRl9EUlZSX1VOTE9BRF9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgMHgyZVVMCiAJX19sZTE2IGV2ZW50X2lkOwotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BGX0RSVlJfVU5MT0FEX0VWRU5UX0lEX1BGX0RSVlJfVU5MT0FEICgweDIwVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QRl9EUlZSX1VOTE9BRF9FVkVOVF9JRF9QRl9EUlZSX1VOTE9BRCAweDIwVUwKIAlfX2xlMzIgZXZlbnRfZGF0YTI7CiAJdTggb3BhcXVlX3Y7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUEZfRFJWUl9VTkxPQURfVgkJICAgIDB4MVVMCkBAIC0zNjIsOSArMzYyLDkgQEAKIAlfX2xlMTYgdHlwZTsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QRl9EUlZSX0xPQURfVFlQRV9NQVNLICAgICAgIDB4M2ZVTAogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BGX0RSVlJfTE9BRF9UWVBFX1NGVAkgICAgMAotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BGX0RSVlJfTE9BRF9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgKDB4MmVVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BGX0RSVlJfTE9BRF9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgMHgyZVVMCiAJX19sZTE2IGV2ZW50X2lkOwotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BGX0RSVlJfTE9BRF9FVkVOVF9JRF9QRl9EUlZSX0xPQUQgKDB4MjFVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BGX0RSVlJfTE9BRF9FVkVOVF9JRF9QRl9EUlZSX0xPQUQgMHgyMVVMCiAJX19sZTMyIGV2ZW50X2RhdGEyOwogCXU4IG9wYXF1ZV92OwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BGX0RSVlJfTE9BRF9WCQkgICAgMHgxVUwKQEAgLTM4NCw5ICszODQsOSBAQAogCV9fbGUxNiB0eXBlOwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1ZGX0ZMUl9UWVBFX01BU0sJCSAgICAweDNmVUwKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9WRl9GTFJfVFlQRV9TRlQJCSAgICAwCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfVkZfRkxSX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAoMHgyZVVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfVkZfRkxSX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAweDJlVUwKIAlfX2xlMTYgZXZlbnRfaWQ7Ci0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfVkZfRkxSX0VWRU5UX0lEX1ZGX0ZMUiAgICAgICgweDMwVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9WRl9GTFJfRVZFTlRfSURfVkZfRkxSICAgICAgMHgzMFVMCiAJX19sZTMyIGV2ZW50X2RhdGEyOwogCXU4IG9wYXF1ZV92OwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1ZGX0ZMUl9WCQkJICAgIDB4MVVMCkBAIC00MDQsOSArNDA0LDkgQEAKIAlfX2xlMTYgdHlwZTsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9WRl9NQUNfQUREUl9DSEFOR0VfVFlQRV9NQVNLIDB4M2ZVTAogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1ZGX01BQ19BRERSX0NIQU5HRV9UWVBFX1NGVCAgMAotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1ZGX01BQ19BRERSX0NIQU5HRV9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgKDB4MmVVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1ZGX01BQ19BRERSX0NIQU5HRV9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgMHgyZVVMCiAJX19sZTE2IGV2ZW50X2lkOwotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1ZGX01BQ19BRERSX0NIQU5HRV9FVkVOVF9JRF9WRl9NQUNfQUREUl9DSEFOR0UgKDB4MzFVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1ZGX01BQ19BRERSX0NIQU5HRV9FVkVOVF9JRF9WRl9NQUNfQUREUl9DSEFOR0UgMHgzMVVMCiAJX19sZTMyIGV2ZW50X2RhdGEyOwogCXU4IG9wYXF1ZV92OwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1ZGX01BQ19BRERSX0NIQU5HRV9WCSAgICAweDFVTApAQCAtNDI0LDkgKzQyNCw5IEBACiAJX19sZTE2IHR5cGU7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUEZfVkZfQ09NTV9TVEFUVVNfQ0hBTkdFX1RZUEVfTUFTSyAweDNmVUwKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QRl9WRl9DT01NX1NUQVRVU19DSEFOR0VfVFlQRV9TRlQgMAotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BGX1ZGX0NPTU1fU1RBVFVTX0NIQU5HRV9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgKDB4MmVVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BGX1ZGX0NPTU1fU1RBVFVTX0NIQU5HRV9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgMHgyZVVMCiAJX19sZTE2IGV2ZW50X2lkOwotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BGX1ZGX0NPTU1fU1RBVFVTX0NIQU5HRV9FVkVOVF9JRF9QRl9WRl9DT01NX1NUQVRVU19DSEFOR0UgKDB4MzJVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BGX1ZGX0NPTU1fU1RBVFVTX0NIQU5HRV9FVkVOVF9JRF9QRl9WRl9DT01NX1NUQVRVU19DSEFOR0UgMHgzMlVMCiAJX19sZTMyIGV2ZW50X2RhdGEyOwogCXU4IG9wYXF1ZV92OwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BGX1ZGX0NPTU1fU1RBVFVTX0NIQU5HRV9WICAgMHgxVUwKQEAgLTQ0Myw5ICs0NDMsOSBAQAogCV9fbGUxNiB0eXBlOwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1ZGX0NGR19DSEFOR0VfVFlQRV9NQVNLICAgICAgMHgzZlVMCiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfVkZfQ0ZHX0NIQU5HRV9UWVBFX1NGVCAgICAgICAwCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfVkZfQ0ZHX0NIQU5HRV9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgKDB4MmVVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1ZGX0NGR19DSEFOR0VfVFlQRV9IV1JNX0FTWU5DX0VWRU5UIDB4MmVVTAogCV9fbGUxNiBldmVudF9pZDsKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9WRl9DRkdfQ0hBTkdFX0VWRU5UX0lEX1ZGX0NGR19DSEFOR0UgKDB4MzNVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1ZGX0NGR19DSEFOR0VfRVZFTlRfSURfVkZfQ0ZHX0NIQU5HRSAweDMzVUwKIAlfX2xlMzIgZXZlbnRfZGF0YTI7CiAJdTggb3BhcXVlX3Y7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfVkZfQ0ZHX0NIQU5HRV9WCQkgICAgMHgxVUwKQEAgLTQ2NSwxNSArNDY1LDE1IEBACiAJX19sZTE2IHR5cGU7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfSFdSTV9FUlJPUl9UWVBFX01BU0sJICAgIDB4M2ZVTAogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0hXUk1fRVJST1JfVFlQRV9TRlQJICAgIDAKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9IV1JNX0VSUk9SX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAoMHgyZVVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfSFdSTV9FUlJPUl9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgMHgyZVVMCiAJX19sZTE2IGV2ZW50X2lkOwotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0hXUk1fRVJST1JfRVZFTlRfSURfSFdSTV9FUlJPUiAoMHhmZlVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfSFdSTV9FUlJPUl9FVkVOVF9JRF9IV1JNX0VSUk9SIDB4ZmZVTAogCV9fbGUzMiBldmVudF9kYXRhMjsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9IV1JNX0VSUk9SX0VWRU5UX0RBVEEyX1NFVkVSSVRZX01BU0sgMHhmZlVMCiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfSFdSTV9FUlJPUl9FVkVOVF9EQVRBMl9TRVZFUklUWV9TRlQgMAotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0hXUk1fRVJST1JfRVZFTlRfREFUQTJfU0VWRVJJVFlfV0FSTklORyAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9IV1JNX0VSUk9SX0VWRU5UX0RBVEEyX1NFVkVSSVRZX05PTkZBVEFMICgweDFVTCA8PCAwKQotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0hXUk1fRVJST1JfRVZFTlRfREFUQTJfU0VWRVJJVFlfRkFUQUwgKDB4MlVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfSFdSTV9FUlJPUl9FVkVOVF9EQVRBMl9TRVZFUklUWV9XQVJOSU5HIDB4MFVMCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfSFdSTV9FUlJPUl9FVkVOVF9EQVRBMl9TRVZFUklUWV9OT05GQVRBTCAweDFVTAorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0hXUk1fRVJST1JfRVZFTlRfREFUQTJfU0VWRVJJVFlfRkFUQUwgMHgyVUwKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9IV1JNX0VSUk9SX0VWRU5UX0RBVEEyX1NFVkVSSVRZX0xBU1QgICAgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0hXUk1fRVJST1JfRVZFTlRfREFUQTJfU0VWRVJJVFlfRkFUQUwKIAl1OCBvcGFxdWVfdjsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9IV1JNX0VSUk9SX1YJCSAgICAweDFVTApAQCAtNDg1LDEyICs0ODUsMTIgQEAKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9IV1JNX0VSUk9SX0VWRU5UX0RBVEExX1RJTUVTVEFNUCAweDFVTAogfTsKIAotLyogSFcgUmVzb3VyY2UgTWFuYWdlciBTcGVjaWZpY2F0aW9uIDEuMy4wICovCisvKiBIVyBSZXNvdXJjZSBNYW5hZ2VyIFNwZWNpZmljYXRpb24gMS41LjEgKi8KICNkZWZpbmUgSFdSTV9WRVJTSU9OX01BSk9SCTEKLSNkZWZpbmUgSFdSTV9WRVJTSU9OX01JTk9SCTMKLSNkZWZpbmUgSFdSTV9WRVJTSU9OX1VQREFURQkwCisjZGVmaW5lIEhXUk1fVkVSU0lPTl9NSU5PUgk1CisjZGVmaW5lIEhXUk1fVkVSU0lPTl9VUERBVEUJMQogCi0jZGVmaW5lIEhXUk1fVkVSU0lPTl9TVFIJIjEuMy4wIgorI2RlZmluZSBIV1JNX1ZFUlNJT05fU1RSCSIxLjUuMSIKIC8qCiAgKiBGb2xsb3dpbmcgaXMgdGhlIHNpZ25hdHVyZSBmb3IgSFdSTSBtZXNzYWdlIGZpZWxkIHRoYXQgaW5kaWNhdGVzIG5vdAogICogYXBwbGljYWJsZSAoQWxsIEYncykuIE5lZWQgdG8gY2FzdCBpdCB0aGUgc2l6ZSBvZiB0aGUgZmllbGQgaWYgbmVlZGVkLgpAQCAtNTU2LDggKzU1Niw4IEBACiAJI2RlZmluZSBIV1JNX1FVRVVFX1FQT1JUQ0ZHCQkJCSAgICgweDMwVUwpCiAJI2RlZmluZSBIV1JNX1FVRVVFX1FDRkcJCQkJICAgKDB4MzFVTCkKIAkjZGVmaW5lIEhXUk1fUVVFVUVfQ0ZHCQkJCQkgICAoMHgzMlVMKQotCSNkZWZpbmUgSFdSTV9RVUVVRV9CVUZGRVJTX1FDRkcJCQkgICAoMHgzM1VMKQotCSNkZWZpbmUgSFdSTV9RVUVVRV9CVUZGRVJTX0NGRwkJCQkgICAoMHgzNFVMKQorCSNkZWZpbmUgUkVTRVJWRUQyCQkJCQkgICAoMHgzM1VMKQorCSNkZWZpbmUgUkVTRVJWRUQzCQkJCQkgICAoMHgzNFVMKQogCSNkZWZpbmUgSFdSTV9RVUVVRV9QRkNFTkFCTEVfUUNGRwkJCSAgICgweDM1VUwpCiAJI2RlZmluZSBIV1JNX1FVRVVFX1BGQ0VOQUJMRV9DRkcJCQkgICAoMHgzNlVMKQogCSNkZWZpbmUgSFdSTV9RVUVVRV9QUkkyQ09TX1FDRkcJCQkgICAoMHgzN1VMKQpAQCAtNTc0LDYgKzU3NCw3IEBACiAJI2RlZmluZSBIV1JNX1ZOSUNfUlNTX1FDRkcJCQkJICAgKDB4NDdVTCkKIAkjZGVmaW5lIEhXUk1fVk5JQ19QTENNT0RFU19DRkcJCQkJICAgKDB4NDhVTCkKIAkjZGVmaW5lIEhXUk1fVk5JQ19QTENNT0RFU19RQ0ZHCQkJICAgKDB4NDlVTCkKKwkjZGVmaW5lIEhXUk1fVk5JQ19RQ0FQUwkJCQkgICAoMHg0YVVMKQogCSNkZWZpbmUgSFdSTV9SSU5HX0FMTE9DCQkJCSAgICgweDUwVUwpCiAJI2RlZmluZSBIV1JNX1JJTkdfRlJFRQkJCQkJICAgKDB4NTFVTCkKIAkjZGVmaW5lIEhXUk1fUklOR19DTVBMX1JJTkdfUUFHR0lOVF9QQVJBTVMJCSAgICgweDUyVUwpCkBAIC01ODEsMTMgKzU4MiwxNSBAQAogCSNkZWZpbmUgSFdSTV9SSU5HX1JFU0VUCQkJCSAgICgweDVlVUwpCiAJI2RlZmluZSBIV1JNX1JJTkdfR1JQX0FMTE9DCQkJCSAgICgweDYwVUwpCiAJI2RlZmluZSBIV1JNX1JJTkdfR1JQX0ZSRUUJCQkJICAgKDB4NjFVTCkKKwkjZGVmaW5lIFJFU0VSVkVENQkJCQkJICAgKDB4NjRVTCkKKwkjZGVmaW5lIFJFU0VSVkVENgkJCQkJICAgKDB4NjVVTCkKIAkjZGVmaW5lIEhXUk1fVk5JQ19SU1NfQ09TX0xCX0NUWF9BTExPQwkJCSAgICgweDcwVUwpCiAJI2RlZmluZSBIV1JNX1ZOSUNfUlNTX0NPU19MQl9DVFhfRlJFRQkJCSAgICgweDcxVUwpCiAJI2RlZmluZSBIV1JNX0NGQV9MMl9GSUxURVJfQUxMT0MJCQkgICAoMHg5MFVMKQogCSNkZWZpbmUgSFdSTV9DRkFfTDJfRklMVEVSX0ZSRUUJCQkgICAoMHg5MVVMKQogCSNkZWZpbmUgSFdSTV9DRkFfTDJfRklMVEVSX0NGRwkJCQkgICAoMHg5MlVMKQogCSNkZWZpbmUgSFdSTV9DRkFfTDJfU0VUX1JYX01BU0sJCQkgICAoMHg5M1VMKQotCSNkZWZpbmUgUkVTRVJWRUQzCQkJCQkgICAoMHg5NFVMKQorCSNkZWZpbmUgUkVTRVJWRUQ0CQkJCQkgICAoMHg5NFVMKQogCSNkZWZpbmUgSFdSTV9DRkFfVFVOTkVMX0ZJTFRFUl9BTExPQwkJCSAgICgweDk1VUwpCiAJI2RlZmluZSBIV1JNX0NGQV9UVU5ORUxfRklMVEVSX0ZSRUUJCQkgICAoMHg5NlVMKQogCSNkZWZpbmUgSFdSTV9DRkFfRU5DQVBfUkVDT1JEX0FMTE9DCQkJICAgKDB4OTdVTCkKQEAgLTYwNyw2ICs2MTAsOCBAQAogCSNkZWZpbmUgSFdSTV9TVEFUX0NUWF9DTFJfU1RBVFMJCQkgICAoMHhiM1VMKQogCSNkZWZpbmUgSFdSTV9GV19SRVNFVAkJCQkJICAgKDB4YzBVTCkKIAkjZGVmaW5lIEhXUk1fRldfUVNUQVRVUwkJCQkgICAoMHhjMVVMKQorCSNkZWZpbmUgSFdSTV9GV19TRVRfVElNRQkJCQkgICAoMHhjOFVMKQorCSNkZWZpbmUgSFdSTV9GV19HRVRfVElNRQkJCQkgICAoMHhjOVVMKQogCSNkZWZpbmUgSFdSTV9FWEVDX0ZXRF9SRVNQCQkJCSAgICgweGQwVUwpCiAJI2RlZmluZSBIV1JNX1JFSkVDVF9GV0RfUkVTUAkJCQkgICAoMHhkMVVMKQogCSNkZWZpbmUgSFdSTV9GV0RfUkVTUAkJCQkJICAgKDB4ZDJVTCkKQEAgLTYxNSwxMSArNjIwLDEzIEBACiAJI2RlZmluZSBIV1JNX1dPTF9GSUxURVJfQUxMT0MJCQkJICAgKDB4ZjBVTCkKIAkjZGVmaW5lIEhXUk1fV09MX0ZJTFRFUl9GUkVFCQkJCSAgICgweGYxVUwpCiAJI2RlZmluZSBIV1JNX1dPTF9GSUxURVJfUUNGRwkJCQkgICAoMHhmMlVMKQorCSNkZWZpbmUgSFdSTV9XT0xfUkVBU09OX1FDRkcJCQkJICAgKDB4ZjNVTCkKIAkjZGVmaW5lIEhXUk1fREJHX1JFQURfRElSRUNUCQkJCSAgICgweGZmMTBVTCkKIAkjZGVmaW5lIEhXUk1fREJHX1JFQURfSU5ESVJFQ1QJCQkJICAgKDB4ZmYxMVVMKQogCSNkZWZpbmUgSFdSTV9EQkdfV1JJVEVfRElSRUNUCQkJCSAgICgweGZmMTJVTCkKIAkjZGVmaW5lIEhXUk1fREJHX1dSSVRFX0lORElSRUNUCQkJICAgKDB4ZmYxM1VMKQogCSNkZWZpbmUgSFdSTV9EQkdfRFVNUAkJCQkJICAgKDB4ZmYxNFVMKQorCSNkZWZpbmUgSFdSTV9OVk1fSU5TVEFMTF9VUERBVEUJCQkgICAoMHhmZmYzVUwpCiAJI2RlZmluZSBIV1JNX05WTV9NT0RJRlkJCQkJICAgKDB4ZmZmNFVMKQogCSNkZWZpbmUgSFdSTV9OVk1fVkVSSUZZX1VQREFURQkJCQkgICAoMHhmZmY1VUwpCiAJI2RlZmluZSBIV1JNX05WTV9HRVRfREVWX0lORk8JCQkJICAgKDB4ZmZmNlVMKQpAQCAtODI0LDcgKzgzMSw5IEBACiAJdTggbmV0Y3RybF9md19taW47CiAJdTggbmV0Y3RybF9md19ibGQ7CiAJdTggbmV0Y3RybF9md19yc3ZkOwotCV9fbGUzMiByZXNlcnZlZDE7CisJX19sZTMyIGRldl9jYXBzX2NmZzsKKwkjZGVmaW5lIFZFUl9HRVRfUkVTUF9ERVZfQ0FQU19DRkdfU0VDVVJFX0ZXX1VQRF9TVVBQT1JURUQgIDB4MVVMCisJI2RlZmluZSBWRVJfR0VUX1JFU1BfREVWX0NBUFNfQ0ZHX0ZXX0RDQlhfQUdFTlRfU1VQUE9SVEVEICAweDJVTAogCXU4IHJvY2VfZndfbWFqOwogCXU4IHJvY2VfZndfbWluOwogCXU4IHJvY2VfZndfYmxkOwpAQCAtODM5LDkgKzg0OCw5IEBACiAJdTggY2hpcF9tZXRhbDsKIAl1OCBjaGlwX2JvbmRfaWQ7CiAJdTggY2hpcF9wbGF0Zm9ybV90eXBlOwotCSNkZWZpbmUgVkVSX0dFVF9SRVNQX0NISVBfUExBVEZPUk1fVFlQRV9BU0lDCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFZFUl9HRVRfUkVTUF9DSElQX1BMQVRGT1JNX1RZUEVfRlBHQQkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBWRVJfR0VUX1JFU1BfQ0hJUF9QTEFURk9STV9UWVBFX1BBTExBRElVTQkgICAoMHgyVUwgPDwgMCkKKwkjZGVmaW5lIFZFUl9HRVRfUkVTUF9DSElQX1BMQVRGT1JNX1RZUEVfQVNJQwkJICAgMHgwVUwKKwkjZGVmaW5lIFZFUl9HRVRfUkVTUF9DSElQX1BMQVRGT1JNX1RZUEVfRlBHQQkJICAgMHgxVUwKKwkjZGVmaW5lIFZFUl9HRVRfUkVTUF9DSElQX1BMQVRGT1JNX1RZUEVfUEFMTEFESVVNCSAgIDB4MlVMCiAJX19sZTE2IG1heF9yZXFfd2luX2xlbjsKIAlfX2xlMTYgbWF4X3Jlc3BfbGVuOwogCV9fbGUxNiBkZWZfcmVxX3RpbWVvdXQ7CkBAIC04NjMsMTAgKzg3MiwxMCBAQAogCSNkZWZpbmUgRlVOQ19SRVNFVF9SRVFfRU5BQkxFU19WRl9JRF9WQUxJRAkJICAgIDB4MVVMCiAJX19sZTE2IHZmX2lkOwogCXU4IGZ1bmNfcmVzZXRfbGV2ZWw7Ci0JI2RlZmluZSBGVU5DX1JFU0VUX1JFUV9GVU5DX1JFU0VUX0xFVkVMX1JFU0VUQUxMCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19SRVNFVF9SRVFfRlVOQ19SRVNFVF9MRVZFTF9SRVNFVE1FCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19SRVNFVF9SRVFfRlVOQ19SRVNFVF9MRVZFTF9SRVNFVENISUxEUkVOICAgICAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfUkVTRVRfUkVRX0ZVTkNfUkVTRVRfTEVWRUxfUkVTRVRWRgkgICAoMHgzVUwgPDwgMCkKKwkjZGVmaW5lIEZVTkNfUkVTRVRfUkVRX0ZVTkNfUkVTRVRfTEVWRUxfUkVTRVRBTEwJICAgMHgwVUwKKwkjZGVmaW5lIEZVTkNfUkVTRVRfUkVRX0ZVTkNfUkVTRVRfTEVWRUxfUkVTRVRNRQkgICAweDFVTAorCSNkZWZpbmUgRlVOQ19SRVNFVF9SRVFfRlVOQ19SRVNFVF9MRVZFTF9SRVNFVENISUxEUkVOICAgICAweDJVTAorCSNkZWZpbmUgRlVOQ19SRVNFVF9SRVFfRlVOQ19SRVNFVF9MRVZFTF9SRVNFVFZGCSAgIDB4M1VMCiAJdTggdW51c2VkXzA7CiB9OwogCkBAIC0xMDI4LDYgKzEwMzcsMTAgQEAKIAkjZGVmaW5lIEZVTkNfUUNBUFNfUkVTUF9GTEFHU19ST0NFX1YyX1NVUFBPUlRFRAkgICAgMHgxMFVMCiAJI2RlZmluZSBGVU5DX1FDQVBTX1JFU1BfRkxBR1NfV09MX01BR0lDUEtUX1NVUFBPUlRFRCAgICAgICAweDIwVUwKIAkjZGVmaW5lIEZVTkNfUUNBUFNfUkVTUF9GTEFHU19XT0xfQk1QX1NVUFBPUlRFRAkgICAgMHg0MFVMCisJI2RlZmluZSBGVU5DX1FDQVBTX1JFU1BfRkxBR1NfVFhfUklOR19STF9TVVBQT1JURUQJICAgIDB4ODBVTAorCSNkZWZpbmUgRlVOQ19RQ0FQU19SRVNQX0ZMQUdTX1RYX0JXX0NGR19TVVBQT1JURUQJICAgIDB4MTAwVUwKKwkjZGVmaW5lIEZVTkNfUUNBUFNfUkVTUF9GTEFHU19WRl9UWF9SSU5HX1JMX1NVUFBPUlRFRCAgICAgIDB4MjAwVUwKKwkjZGVmaW5lIEZVTkNfUUNBUFNfUkVTUF9GTEFHU19WRl9CV19DRkdfU1VQUE9SVEVECSAgICAweDQwMFVMCiAJdTggbWFjX2FkZHJlc3NbNl07CiAJX19sZTE2IG1heF9yc3Njb3NfY3R4OwogCV9fbGUxNiBtYXhfY21wbF9yaW5nczsKQEAgLTEwNDcsOSArMTA2MCw4IEBACiAJX19sZTMyIG1heF9tY2FzdF9maWx0ZXJzOwogCV9fbGUzMiBtYXhfZmxvd19pZDsKIAlfX2xlMzIgbWF4X2h3X3JpbmdfZ3JwczsKKwlfX2xlMTYgbWF4X3NwX3R4X3JpbmdzOwogCXU4IHVudXNlZF8wOwotCXU4IHVudXNlZF8xOwotCXU4IHVudXNlZF8yOwogCXU4IHZhbGlkOwogfTsKIApAQCAtMTA3Nyw2ICsxMDg5LDcgQEAKIAlfX2xlMTYgZmxhZ3M7CiAJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9GTEFHU19PT0JfV09MX01BR0lDUEtUX0VOQUJMRUQgICAgICAweDFVTAogCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfRkxBR1NfT09CX1dPTF9CTVBfRU5BQkxFRAkgICAgMHgyVUwKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX0ZMQUdTX0ZXX0RDQlhfQUdFTlRfRU5BQkxFRAkgICAgMHg0VUwKIAl1OCBtYWNfYWRkcmVzc1s2XTsKIAlfX2xlMTYgcGNpX2lkOwogCV9fbGUxNiBhbGxvY19yc3Njb3NfY3R4OwpAQCAtMTA4OSwyOSArMTEwMiw0NiBAQAogCV9fbGUxNiBtcnU7CiAJX19sZTE2IHN0YXRfY3R4X2lkOwogCXU4IHBvcnRfcGFydGl0aW9uX3R5cGU7Ci0JI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9QT1JUX1BBUlRJVElPTl9UWVBFX1NQRgkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9QT1JUX1BBUlRJVElPTl9UWVBFX01QRlMJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9QT1JUX1BBUlRJVElPTl9UWVBFX05QQVIxXzAJICAgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9QT1JUX1BBUlRJVElPTl9UWVBFX05QQVIxXzUJICAgKDB4M1VMIDw8IDApCi0JI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9QT1JUX1BBUlRJVElPTl9UWVBFX05QQVIyXzAJICAgKDB4NFVMIDw8IDApCi0JI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9QT1JUX1BBUlRJVElPTl9UWVBFX1VOS05PV04JICAgKDB4ZmZVTCA8PCAwKQorCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfUE9SVF9QQVJUSVRJT05fVFlQRV9TUEYJCSAgIDB4MFVMCisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9QT1JUX1BBUlRJVElPTl9UWVBFX01QRlMJICAgMHgxVUwKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX1BPUlRfUEFSVElUSU9OX1RZUEVfTlBBUjFfMAkgICAweDJVTAorCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfUE9SVF9QQVJUSVRJT05fVFlQRV9OUEFSMV81CSAgIDB4M1VMCisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9QT1JUX1BBUlRJVElPTl9UWVBFX05QQVIyXzAJICAgMHg0VUwKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX1BPUlRfUEFSVElUSU9OX1RZUEVfVU5LTk9XTgkgICAweGZmVUwKIAl1OCB1bnVzZWRfMDsKIAlfX2xlMTYgZGZsdF92bmljX2lkOwogCXU4IHVudXNlZF8xOwogCXU4IHVudXNlZF8yOwogCV9fbGUzMiBtaW5fYnc7CisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9NSU5fQldfQldfVkFMVUVfTUFTSwkJICAgIDB4ZmZmZmZmZlVMCisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9NSU5fQldfQldfVkFMVUVfU0ZUCQkgICAgMAorCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfTUlOX0JXX1JTVkQJCQkgICAgMHgxMDAwMDAwMFVMCisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9NSU5fQldfQldfVkFMVUVfVU5JVF9NQVNLCSAgICAweGUwMDAwMDAwVUwKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX01JTl9CV19CV19WQUxVRV9VTklUX1NGVAkgICAgMjkKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX01JTl9CV19CV19WQUxVRV9VTklUX01CUFMJICAgKDB4MFVMIDw8IDI5KQorCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfUEVSQ0VOVDFfMTAwICAoMHgxVUwgPDwgMjkpCisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9NSU5fQldfQldfVkFMVUVfVU5JVF9JTlZBTElEICAgICAgICgweDdVTCA8PCAyOSkKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX01JTl9CV19CV19WQUxVRV9VTklUX0xBU1QgICAgRlVOQ19RQ0ZHX1JFU1BfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRAogCV9fbGUzMiBtYXhfYnc7CisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9NQVhfQldfQldfVkFMVUVfTUFTSwkJICAgIDB4ZmZmZmZmZlVMCisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9NQVhfQldfQldfVkFMVUVfU0ZUCQkgICAgMAorCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfTUFYX0JXX1JTVkQJCQkgICAgMHgxMDAwMDAwMFVMCisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9NQVhfQldfQldfVkFMVUVfVU5JVF9NQVNLCSAgICAweGUwMDAwMDAwVUwKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX01BWF9CV19CV19WQUxVRV9VTklUX1NGVAkgICAgMjkKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX01BWF9CV19CV19WQUxVRV9VTklUX01CUFMJICAgKDB4MFVMIDw8IDI5KQorCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfUEVSQ0VOVDFfMTAwICAoMHgxVUwgPDwgMjkpCisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9NQVhfQldfQldfVkFMVUVfVU5JVF9JTlZBTElEICAgICAgICgweDdVTCA8PCAyOSkKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX01BWF9CV19CV19WQUxVRV9VTklUX0xBU1QgICAgRlVOQ19RQ0ZHX1JFU1BfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRAogCXU4IGV2Yl9tb2RlOwotCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfRVZCX01PREVfTk9fRVZCCQkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9FVkJfTU9ERV9WRUIJCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX0VWQl9NT0RFX1ZFUEEJCQkgICAoMHgyVUwgPDwgMCkKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX0VWQl9NT0RFX05PX0VWQgkJCSAgIDB4MFVMCisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9FVkJfTU9ERV9WRUIJCQkgICAweDFVTAorCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfRVZCX01PREVfVkVQQQkJCSAgIDB4MlVMCiAJdTggdW51c2VkXzM7Ci0JX19sZTE2IHVudXNlZF80OworCV9fbGUxNiBhbGxvY192ZnM7CiAJX19sZTMyIGFsbG9jX21jYXN0X2ZpbHRlcnM7CiAJX19sZTMyIGFsbG9jX2h3X3JpbmdfZ3JwczsKLQl1OCB1bnVzZWRfNTsKLQl1OCB1bnVzZWRfNjsKLQl1OCB1bnVzZWRfNzsKKwlfX2xlMTYgYWxsb2Nfc3BfdHhfcmluZ3M7CisJdTggdW51c2VkXzQ7CiAJdTggdmFsaWQ7CiB9OwogCkBAIC0xMTcxLDE4ICsxMjAxLDM2IEBACiAJX19sZTE2IGRmbHRfdmxhbjsKIAlfX2JlMzIgZGZsdF9pcF9hZGRyWzRdOwogCV9fbGUzMiBtaW5fYnc7CisJI2RlZmluZSBGVU5DX0NGR19SRVFfTUlOX0JXX0JXX1ZBTFVFX01BU0sJCSAgICAweGZmZmZmZmZVTAorCSNkZWZpbmUgRlVOQ19DRkdfUkVRX01JTl9CV19CV19WQUxVRV9TRlQJCSAgICAwCisJI2RlZmluZSBGVU5DX0NGR19SRVFfTUlOX0JXX1JTVkQJCQkgICAgMHgxMDAwMDAwMFVMCisJI2RlZmluZSBGVU5DX0NGR19SRVFfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTUFTSwkJICAgIDB4ZTAwMDAwMDBVTAorCSNkZWZpbmUgRlVOQ19DRkdfUkVRX01JTl9CV19CV19WQUxVRV9VTklUX1NGVAkJICAgIDI5CisJI2RlZmluZSBGVU5DX0NGR19SRVFfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTUJQUwkJICAgKDB4MFVMIDw8IDI5KQorCSNkZWZpbmUgRlVOQ19DRkdfUkVRX01JTl9CV19CV19WQUxVRV9VTklUX1BFUkNFTlQxXzEwMCAgICAoMHgxVUwgPDwgMjkpCisJI2RlZmluZSBGVU5DX0NGR19SRVFfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRAkgICAoMHg3VUwgPDwgMjkpCisJI2RlZmluZSBGVU5DX0NGR19SRVFfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTEFTVCAgICBGVU5DX0NGR19SRVFfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRAogCV9fbGUzMiBtYXhfYnc7CisJI2RlZmluZSBGVU5DX0NGR19SRVFfTUFYX0JXX0JXX1ZBTFVFX01BU0sJCSAgICAweGZmZmZmZmZVTAorCSNkZWZpbmUgRlVOQ19DRkdfUkVRX01BWF9CV19CV19WQUxVRV9TRlQJCSAgICAwCisJI2RlZmluZSBGVU5DX0NGR19SRVFfTUFYX0JXX1JTVkQJCQkgICAgMHgxMDAwMDAwMFVMCisJI2RlZmluZSBGVU5DX0NGR19SRVFfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTUFTSwkJICAgIDB4ZTAwMDAwMDBVTAorCSNkZWZpbmUgRlVOQ19DRkdfUkVRX01BWF9CV19CV19WQUxVRV9VTklUX1NGVAkJICAgIDI5CisJI2RlZmluZSBGVU5DX0NGR19SRVFfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTUJQUwkJICAgKDB4MFVMIDw8IDI5KQorCSNkZWZpbmUgRlVOQ19DRkdfUkVRX01BWF9CV19CV19WQUxVRV9VTklUX1BFUkNFTlQxXzEwMCAgICAoMHgxVUwgPDwgMjkpCisJI2RlZmluZSBGVU5DX0NGR19SRVFfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRAkgICAoMHg3VUwgPDwgMjkpCisJI2RlZmluZSBGVU5DX0NGR19SRVFfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTEFTVCAgICBGVU5DX0NGR19SRVFfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRAogCV9fbGUxNiBhc3luY19ldmVudF9jcjsKIAl1OCB2bGFuX2FudGlzcG9vZl9tb2RlOwotCSNkZWZpbmUgRlVOQ19DRkdfUkVRX1ZMQU5fQU5USVNQT09GX01PREVfTk9DSEVDSwkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9WTEFOX0FOVElTUE9PRl9NT0RFX1ZBTElEQVRFX1ZMQU4gICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBGVU5DX0NGR19SRVFfVkxBTl9BTlRJU1BPT0ZfTU9ERV9JTlNFUlRfSUZfVkxBTkRORSAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9WTEFOX0FOVElTUE9PRl9NT0RFX0lOU0VSVF9PUl9PVkVSUklERV9WTEFOICgweDNVTCA8PCAwKQorCSNkZWZpbmUgRlVOQ19DRkdfUkVRX1ZMQU5fQU5USVNQT09GX01PREVfTk9DSEVDSwkgICAweDBVTAorCSNkZWZpbmUgRlVOQ19DRkdfUkVRX1ZMQU5fQU5USVNQT09GX01PREVfVkFMSURBVEVfVkxBTiAgICAweDFVTAorCSNkZWZpbmUgRlVOQ19DRkdfUkVRX1ZMQU5fQU5USVNQT09GX01PREVfSU5TRVJUX0lGX1ZMQU5ETkUgMHgyVUwKKwkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9WTEFOX0FOVElTUE9PRl9NT0RFX0lOU0VSVF9PUl9PVkVSUklERV9WTEFOIDB4M1VMCiAJdTggYWxsb3dlZF92bGFuX3ByaXM7CiAJdTggZXZiX21vZGU7Ci0JI2RlZmluZSBGVU5DX0NGR19SRVFfRVZCX01PREVfTk9fRVZCCQkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBGVU5DX0NGR19SRVFfRVZCX01PREVfVkVCCQkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBGVU5DX0NGR19SRVFfRVZCX01PREVfVkVQQQkJCSAgICgweDJVTCA8PCAwKQorCSNkZWZpbmUgRlVOQ19DRkdfUkVRX0VWQl9NT0RFX05PX0VWQgkJCSAgIDB4MFVMCisJI2RlZmluZSBGVU5DX0NGR19SRVFfRVZCX01PREVfVkVCCQkJICAgMHgxVUwKKwkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9FVkJfTU9ERV9WRVBBCQkJICAgMHgyVUwKIAl1OCB1bnVzZWRfMjsKIAlfX2xlMTYgbnVtX21jYXN0X2ZpbHRlcnM7CiB9OwpAQCAtMTM0MSwxNiArMTM4OSwxNiBAQAogCSNkZWZpbmUgRlVOQ19EUlZfUkdUUl9SRVFfRU5BQkxFU19WRl9SRVFfRldECQkgICAgMHg4VUwKIAkjZGVmaW5lIEZVTkNfRFJWX1JHVFJfUkVRX0VOQUJMRVNfQVNZTkNfRVZFTlRfRldECSAgICAweDEwVUwKIAlfX2xlMTYgb3NfdHlwZTsKLQkjZGVmaW5lIEZVTkNfRFJWX1JHVFJfUkVRX09TX1RZUEVfVU5LTk9XTgkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBGVU5DX0RSVl9SR1RSX1JFUV9PU19UWVBFX09USEVSCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfRFJWX1JHVFJfUkVRX09TX1RZUEVfTVNET1MJCSAgICgweGVVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19EUlZfUkdUUl9SRVFfT1NfVFlQRV9XSU5ET1dTCQkgICAoMHgxMlVMIDw8IDApCi0JI2RlZmluZSBGVU5DX0RSVl9SR1RSX1JFUV9PU19UWVBFX1NPTEFSSVMJCSAgICgweDFkVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfRFJWX1JHVFJfUkVRX09TX1RZUEVfTElOVVgJCSAgICgweDI0VUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfRFJWX1JHVFJfUkVRX09TX1RZUEVfRlJFRUJTRAkJICAgKDB4MmFVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19EUlZfUkdUUl9SRVFfT1NfVFlQRV9FU1hJCQkJICAgKDB4NjhVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19EUlZfUkdUUl9SRVFfT1NfVFlQRV9XSU44NjQJCSAgICgweDczVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfRFJWX1JHVFJfUkVRX09TX1RZUEVfV0lOMjAxMlIyCQkgICAoMHg3NFVMIDw8IDApCisJI2RlZmluZSBGVU5DX0RSVl9SR1RSX1JFUV9PU19UWVBFX1VOS05PV04JCSAgIDB4MFVMCisJI2RlZmluZSBGVU5DX0RSVl9SR1RSX1JFUV9PU19UWVBFX09USEVSCQkgICAweDFVTAorCSNkZWZpbmUgRlVOQ19EUlZfUkdUUl9SRVFfT1NfVFlQRV9NU0RPUwkJICAgMHhlVUwKKwkjZGVmaW5lIEZVTkNfRFJWX1JHVFJfUkVRX09TX1RZUEVfV0lORE9XUwkJICAgMHgxMlVMCisJI2RlZmluZSBGVU5DX0RSVl9SR1RSX1JFUV9PU19UWVBFX1NPTEFSSVMJCSAgIDB4MWRVTAorCSNkZWZpbmUgRlVOQ19EUlZfUkdUUl9SRVFfT1NfVFlQRV9MSU5VWAkJICAgMHgyNFVMCisJI2RlZmluZSBGVU5DX0RSVl9SR1RSX1JFUV9PU19UWVBFX0ZSRUVCU0QJCSAgIDB4MmFVTAorCSNkZWZpbmUgRlVOQ19EUlZfUkdUUl9SRVFfT1NfVFlQRV9FU1hJCQkJICAgMHg2OFVMCisJI2RlZmluZSBGVU5DX0RSVl9SR1RSX1JFUV9PU19UWVBFX1dJTjg2NAkJICAgMHg3M1VMCisJI2RlZmluZSBGVU5DX0RSVl9SR1RSX1JFUV9PU19UWVBFX1dJTjIwMTJSMgkJICAgMHg3NFVMCiAJdTggdmVyX21hajsKIAl1OCB2ZXJfbWluOwogCXU4IHZlcl91cGQ7CkBAIC0xNDE1LDEzICsxNDYzLDEzIEBACiAJX19sZTE2IHZmX2lkOwogCV9fbGUxNiByZXFfYnVmX251bV9wYWdlczsKIAlfX2xlMTYgcmVxX2J1Zl9wYWdlX3NpemU7Ci0JI2RlZmluZSBGVU5DX0JVRl9SR1RSX1JFUV9SRVFfQlVGX1BBR0VfU0laRV8xNkIJICAgKDB4NFVMIDw8IDApCi0JI2RlZmluZSBGVU5DX0JVRl9SR1RSX1JFUV9SRVFfQlVGX1BBR0VfU0laRV80SwkJICAgKDB4Y1VMIDw8IDApCi0JI2RlZmluZSBGVU5DX0JVRl9SR1RSX1JFUV9SRVFfQlVGX1BBR0VfU0laRV84SwkJICAgKDB4ZFVMIDw8IDApCi0JI2RlZmluZSBGVU5DX0JVRl9SR1RSX1JFUV9SRVFfQlVGX1BBR0VfU0laRV82NEsJICAgKDB4MTBVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19CVUZfUkdUUl9SRVFfUkVRX0JVRl9QQUdFX1NJWkVfMk0JCSAgICgweDE1VUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfQlVGX1JHVFJfUkVRX1JFUV9CVUZfUEFHRV9TSVpFXzRNCQkgICAoMHgxNlVMIDw8IDApCi0JI2RlZmluZSBGVU5DX0JVRl9SR1RSX1JFUV9SRVFfQlVGX1BBR0VfU0laRV8xRwkJICAgKDB4MWVVTCA8PCAwKQorCSNkZWZpbmUgRlVOQ19CVUZfUkdUUl9SRVFfUkVRX0JVRl9QQUdFX1NJWkVfMTZCCSAgIDB4NFVMCisJI2RlZmluZSBGVU5DX0JVRl9SR1RSX1JFUV9SRVFfQlVGX1BBR0VfU0laRV80SwkJICAgMHhjVUwKKwkjZGVmaW5lIEZVTkNfQlVGX1JHVFJfUkVRX1JFUV9CVUZfUEFHRV9TSVpFXzhLCQkgICAweGRVTAorCSNkZWZpbmUgRlVOQ19CVUZfUkdUUl9SRVFfUkVRX0JVRl9QQUdFX1NJWkVfNjRLCSAgIDB4MTBVTAorCSNkZWZpbmUgRlVOQ19CVUZfUkdUUl9SRVFfUkVRX0JVRl9QQUdFX1NJWkVfMk0JCSAgIDB4MTVVTAorCSNkZWZpbmUgRlVOQ19CVUZfUkdUUl9SRVFfUkVRX0JVRl9QQUdFX1NJWkVfNE0JCSAgIDB4MTZVTAorCSNkZWZpbmUgRlVOQ19CVUZfUkdUUl9SRVFfUkVRX0JVRl9QQUdFX1NJWkVfMUcJCSAgIDB4MWVVTAogCV9fbGUxNiByZXFfYnVmX2xlbjsKIAlfX2xlMTYgcmVzcF9idWZfbGVuOwogCXU4IHVudXNlZF8wOwpAQCAtMTQ3MywxNiArMTUyMSwxNiBAQAogCV9fbGUxNiBzZXFfaWQ7CiAJX19sZTE2IHJlc3BfbGVuOwogCV9fbGUxNiBvc190eXBlOwotCSNkZWZpbmUgRlVOQ19EUlZfUVZFUl9SRVNQX09TX1RZUEVfVU5LTk9XTgkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBGVU5DX0RSVl9RVkVSX1JFU1BfT1NfVFlQRV9PVEhFUgkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBGVU5DX0RSVl9RVkVSX1JFU1BfT1NfVFlQRV9NU0RPUwkJICAgKDB4ZVVMIDw8IDApCi0JI2RlZmluZSBGVU5DX0RSVl9RVkVSX1JFU1BfT1NfVFlQRV9XSU5ET1dTCQkgICAoMHgxMlVMIDw8IDApCi0JI2RlZmluZSBGVU5DX0RSVl9RVkVSX1JFU1BfT1NfVFlQRV9TT0xBUklTCQkgICAoMHgxZFVMIDw8IDApCi0JI2RlZmluZSBGVU5DX0RSVl9RVkVSX1JFU1BfT1NfVFlQRV9MSU5VWAkJICAgKDB4MjRVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19EUlZfUVZFUl9SRVNQX09TX1RZUEVfRlJFRUJTRAkJICAgKDB4MmFVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19EUlZfUVZFUl9SRVNQX09TX1RZUEVfRVNYSQkJICAgKDB4NjhVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19EUlZfUVZFUl9SRVNQX09TX1RZUEVfV0lOODY0CQkgICAoMHg3M1VMIDw8IDApCi0JI2RlZmluZSBGVU5DX0RSVl9RVkVSX1JFU1BfT1NfVFlQRV9XSU4yMDEyUjIJCSAgICgweDc0VUwgPDwgMCkKKwkjZGVmaW5lIEZVTkNfRFJWX1FWRVJfUkVTUF9PU19UWVBFX1VOS05PV04JCSAgIDB4MFVMCisJI2RlZmluZSBGVU5DX0RSVl9RVkVSX1JFU1BfT1NfVFlQRV9PVEhFUgkJICAgMHgxVUwKKwkjZGVmaW5lIEZVTkNfRFJWX1FWRVJfUkVTUF9PU19UWVBFX01TRE9TCQkgICAweGVVTAorCSNkZWZpbmUgRlVOQ19EUlZfUVZFUl9SRVNQX09TX1RZUEVfV0lORE9XUwkJICAgMHgxMlVMCisJI2RlZmluZSBGVU5DX0RSVl9RVkVSX1JFU1BfT1NfVFlQRV9TT0xBUklTCQkgICAweDFkVUwKKwkjZGVmaW5lIEZVTkNfRFJWX1FWRVJfUkVTUF9PU19UWVBFX0xJTlVYCQkgICAweDI0VUwKKwkjZGVmaW5lIEZVTkNfRFJWX1FWRVJfUkVTUF9PU19UWVBFX0ZSRUVCU0QJCSAgIDB4MmFVTAorCSNkZWZpbmUgRlVOQ19EUlZfUVZFUl9SRVNQX09TX1RZUEVfRVNYSQkJICAgMHg2OFVMCisJI2RlZmluZSBGVU5DX0RSVl9RVkVSX1JFU1BfT1NfVFlQRV9XSU44NjQJCSAgIDB4NzNVTAorCSNkZWZpbmUgRlVOQ19EUlZfUVZFUl9SRVNQX09TX1RZUEVfV0lOMjAxMlIyCQkgICAweDc0VUwKIAl1OCB2ZXJfbWFqOwogCXU4IHZlcl9taW47CiAJdTggdmVyX3VwZDsKQEAgLTE1MjgsNDQgKzE1NzYsNDQgQEAKIAkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfRU5BQkxFU19UWF9MUElfVElNRVIJCSAgICAweDQwMFVMCiAJX19sZTE2IHBvcnRfaWQ7CiAJX19sZTE2IGZvcmNlX2xpbmtfc3BlZWQ7Ci0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0ZPUkNFX0xJTktfU1BFRURfMTAwTUIJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0ZPUkNFX0xJTktfU1BFRURfMUdCCQkgICAoMHhhVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfRk9SQ0VfTElOS19TUEVFRF8yR0IJCSAgICgweDE0VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfRk9SQ0VfTElOS19TUEVFRF8yXzVHQgkgICAoMHgxOVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0ZPUkNFX0xJTktfU1BFRURfMTBHQgkJICAgKDB4NjRVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9GT1JDRV9MSU5LX1NQRUVEXzIwR0IJCSAgICgweGM4VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfRk9SQ0VfTElOS19TUEVFRF8yNUdCCQkgICAoMHhmYVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0ZPUkNFX0xJTktfU1BFRURfNDBHQgkJICAgKDB4MTkwVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfRk9SQ0VfTElOS19TUEVFRF81MEdCCQkgICAoMHgxZjRVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9GT1JDRV9MSU5LX1NQRUVEXzEwMEdCCSAgICgweDNlOFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0ZPUkNFX0xJTktfU1BFRURfMTBNQgkJICAgKDB4ZmZmZlVMIDw8IDApCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0ZPUkNFX0xJTktfU1BFRURfMTAwTUIJICAgMHgxVUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfRk9SQ0VfTElOS19TUEVFRF8xR0IJCSAgIDB4YVVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0ZPUkNFX0xJTktfU1BFRURfMkdCCQkgICAweDE0VUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfRk9SQ0VfTElOS19TUEVFRF8yXzVHQgkgICAweDE5VUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfRk9SQ0VfTElOS19TUEVFRF8xMEdCCQkgICAweDY0VUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfRk9SQ0VfTElOS19TUEVFRF8yMEdCCQkgICAweGM4VUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfRk9SQ0VfTElOS19TUEVFRF8yNUdCCQkgICAweGZhVUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfRk9SQ0VfTElOS19TUEVFRF80MEdCCQkgICAweDE5MFVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0ZPUkNFX0xJTktfU1BFRURfNTBHQgkJICAgMHgxZjRVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9GT1JDRV9MSU5LX1NQRUVEXzEwMEdCCSAgIDB4M2U4VUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfRk9SQ0VfTElOS19TUEVFRF8xME1CCQkgICAweGZmZmZVTAogCXU4IGF1dG9fbW9kZTsKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19NT0RFX05PTkUJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX01PREVfQUxMX1NQRUVEUwkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTU9ERV9PTkVfU1BFRUQJCSAgICgweDJVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX01PREVfT05FX09SX0JFTE9XCSAgICgweDNVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX01PREVfU1BFRURfTUFTSwkJICAgKDB4NFVMIDw8IDApCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTU9ERV9OT05FCQkgICAweDBVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX01PREVfQUxMX1NQRUVEUwkJICAgMHgxVUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19NT0RFX09ORV9TUEVFRAkJICAgMHgyVUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19NT0RFX09ORV9PUl9CRUxPVwkgICAweDNVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX01PREVfU1BFRURfTUFTSwkJICAgMHg0VUwKIAl1OCBhdXRvX2R1cGxleDsKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19EVVBMRVhfSEFMRgkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fRFVQTEVYX0ZVTEwJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0RVUExFWF9CT1RICQkgICAoMHgyVUwgPDwgMCkKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19EVVBMRVhfSEFMRgkJICAgMHgwVUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19EVVBMRVhfRlVMTAkJICAgMHgxVUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19EVVBMRVhfQk9USAkJICAgMHgyVUwKIAl1OCBhdXRvX3BhdXNlOwogCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX1BBVVNFX1RYCQkJICAgIDB4MVVMCiAJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fUEFVU0VfUlgJCQkgICAgMHgyVUwKIAkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19QQVVTRV9BVVRPTkVHX1BBVVNFCSAgICAweDRVTAogCXU4IHVudXNlZF8wOwogCV9fbGUxNiBhdXRvX2xpbmtfc3BlZWQ7Ci0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTElOS19TUEVFRF8xMDBNQgkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTElOS19TUEVFRF8xR0IJCSAgICgweGFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0xJTktfU1BFRURfMkdCCQkgICAoMHgxNFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTElOS19TUEVFRF8yXzVHQgkJICAgKDB4MTlVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0xJTktfU1BFRURfMTBHQgkJICAgKDB4NjRVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0xJTktfU1BFRURfMjBHQgkJICAgKDB4YzhVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0xJTktfU1BFRURfMjVHQgkJICAgKDB4ZmFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0xJTktfU1BFRURfNDBHQgkJICAgKDB4MTkwVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19MSU5LX1NQRUVEXzUwR0IJCSAgICgweDFmNFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTElOS19TUEVFRF8xMDBHQgkJICAgKDB4M2U4VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19MSU5LX1NQRUVEXzEwTUIJCSAgICgweGZmZmZVTCA8PCAwKQorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0xJTktfU1BFRURfMTAwTUIJCSAgIDB4MVVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTElOS19TUEVFRF8xR0IJCSAgIDB4YVVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTElOS19TUEVFRF8yR0IJCSAgIDB4MTRVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0xJTktfU1BFRURfMl81R0IJCSAgIDB4MTlVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0xJTktfU1BFRURfMTBHQgkJICAgMHg2NFVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTElOS19TUEVFRF8yMEdCCQkgICAweGM4VUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19MSU5LX1NQRUVEXzI1R0IJCSAgIDB4ZmFVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0xJTktfU1BFRURfNDBHQgkJICAgMHgxOTBVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0xJTktfU1BFRURfNTBHQgkJICAgMHgxZjRVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0xJTktfU1BFRURfMTAwR0IJCSAgIDB4M2U4VUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19MSU5LX1NQRUVEXzEwTUIJCSAgIDB4ZmZmZlVMCiAJX19sZTE2IGF1dG9fbGlua19zcGVlZF9tYXNrOwogCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0xJTktfU1BFRURfTUFTS18xMDBNQkhEICAgICAgMHgxVUwKIAkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19MSU5LX1NQRUVEX01BU0tfMTAwTUIJICAgIDB4MlVMCkBAIC0xNTgyLDEyICsxNjMwLDEyIEBACiAJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTElOS19TUEVFRF9NQVNLXzEwTUJIRCAgICAgICAweDEwMDBVTAogCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0xJTktfU1BFRURfTUFTS18xME1CCSAgICAweDIwMDBVTAogCXU4IHdpcmVzcGVlZDsKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfV0lSRVNQRUVEX09GRgkJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9XSVJFU1BFRURfT04JCQkgICAoMHgxVUwgPDwgMCkKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfV0lSRVNQRUVEX09GRgkJCSAgIDB4MFVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX1dJUkVTUEVFRF9PTgkJCSAgIDB4MVVMCiAJdTggbHBiazsKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfTFBCS19OT05FCQkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0xQQktfTE9DQUwJCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfTFBCS19SRU1PVEUJCQkgICAoMHgyVUwgPDwgMCkKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfTFBCS19OT05FCQkJICAgMHgwVUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfTFBCS19MT0NBTAkJCSAgIDB4MVVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0xQQktfUkVNT1RFCQkJICAgMHgyVUwKIAl1OCBmb3JjZV9wYXVzZTsKIAkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfRk9SQ0VfUEFVU0VfVFgJCSAgICAweDFVTAogCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9GT1JDRV9QQVVTRV9SWAkJICAgIDB4MlVMCkBAIC0xNjQxLDI1ICsxNjg5LDI1IEBACiAJX19sZTE2IHNlcV9pZDsKIAlfX2xlMTYgcmVzcF9sZW47CiAJdTggbGluazsKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX05PX0xJTksJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfU0lHTkFMCQkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19MSU5LCQkJICAgKDB4MlVMIDw8IDApCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19OT19MSU5LCQkgICAweDBVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfU0lHTkFMCQkJICAgMHgxVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX0xJTksJCQkgICAweDJVTAogCXU4IHVudXNlZF8wOwogCV9fbGUxNiBsaW5rX3NwZWVkOwotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfU1BFRURfMTAwTUIJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfU1BFRURfMUdCCQkgICAoMHhhVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1NQRUVEXzJHQgkJICAgKDB4MTRVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfU1BFRURfMl81R0IJCSAgICgweDE5VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1NQRUVEXzEwR0IJCSAgICgweDY0VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1NQRUVEXzIwR0IJCSAgICgweGM4VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1NQRUVEXzI1R0IJCSAgICgweGZhVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1NQRUVEXzQwR0IJCSAgICgweDE5MFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19TUEVFRF81MEdCCQkgICAoMHgxZjRVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfU1BFRURfMTAwR0IJCSAgICgweDNlOFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19TUEVFRF8xME1CCQkgICAoMHhmZmZmVUwgPDwgMCkKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1NQRUVEXzEwME1CCQkgICAweDFVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfU1BFRURfMUdCCQkgICAweGFVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfU1BFRURfMkdCCQkgICAweDE0VUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1NQRUVEXzJfNUdCCQkgICAweDE5VUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1NQRUVEXzEwR0IJCSAgIDB4NjRVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfU1BFRURfMjBHQgkJICAgMHhjOFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19TUEVFRF8yNUdCCQkgICAweGZhVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1NQRUVEXzQwR0IJCSAgIDB4MTkwVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1NQRUVEXzUwR0IJCSAgIDB4MWY0VUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1NQRUVEXzEwMEdCCQkgICAweDNlOFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19TUEVFRF8xME1CCQkgICAweGZmZmZVTAogCXU4IGR1cGxleDsKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9EVVBMRVhfSEFMRgkJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0RVUExFWF9GVUxMCQkJICAgKDB4MVVMIDw8IDApCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRFVQTEVYX0hBTEYJCQkgICAweDBVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0RVUExFWF9GVUxMCQkJICAgMHgxVUwKIAl1OCBwYXVzZTsKIAkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9QQVVTRV9UWAkJCSAgICAweDFVTAogCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1BBVVNFX1JYCQkJICAgIDB4MlVMCkBAIC0xNjc5LDM5ICsxNzI3LDM5IEBACiAJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfU1VQUE9SVF9TUEVFRFNfMTBNQkhECSAgICAweDEwMDBVTAogCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1NVUFBPUlRfU1BFRURTXzEwTUIJCSAgICAweDIwMDBVTAogCV9fbGUxNiBmb3JjZV9saW5rX3NwZWVkOwotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0ZPUkNFX0xJTktfU1BFRURfMTAwTUIJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRk9SQ0VfTElOS19TUEVFRF8xR0IJICAgKDB4YVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRk9SQ0VfTElOS19TUEVFRF8yR0IJICAgKDB4MTRVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0ZPUkNFX0xJTktfU1BFRURfMl81R0IJICAgKDB4MTlVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0ZPUkNFX0xJTktfU1BFRURfMTBHQgkgICAoMHg2NFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRk9SQ0VfTElOS19TUEVFRF8yMEdCCSAgICgweGM4VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9GT1JDRV9MSU5LX1NQRUVEXzI1R0IJICAgKDB4ZmFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0ZPUkNFX0xJTktfU1BFRURfNDBHQgkgICAoMHgxOTBVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0ZPUkNFX0xJTktfU1BFRURfNTBHQgkgICAoMHgxZjRVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0ZPUkNFX0xJTktfU1BFRURfMTAwR0IJICAgKDB4M2U4VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9GT1JDRV9MSU5LX1NQRUVEXzEwTUIJICAgKDB4ZmZmZlVMIDw8IDApCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRk9SQ0VfTElOS19TUEVFRF8xMDBNQgkgICAweDFVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0ZPUkNFX0xJTktfU1BFRURfMUdCCSAgIDB4YVVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRk9SQ0VfTElOS19TUEVFRF8yR0IJICAgMHgxNFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRk9SQ0VfTElOS19TUEVFRF8yXzVHQgkgICAweDE5VUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9GT1JDRV9MSU5LX1NQRUVEXzEwR0IJICAgMHg2NFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRk9SQ0VfTElOS19TUEVFRF8yMEdCCSAgIDB4YzhVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0ZPUkNFX0xJTktfU1BFRURfMjVHQgkgICAweGZhVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9GT1JDRV9MSU5LX1NQRUVEXzQwR0IJICAgMHgxOTBVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0ZPUkNFX0xJTktfU1BFRURfNTBHQgkgICAweDFmNFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRk9SQ0VfTElOS19TUEVFRF8xMDBHQgkgICAweDNlOFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRk9SQ0VfTElOS19TUEVFRF8xME1CCSAgIDB4ZmZmZlVMCiAJdTggYXV0b19tb2RlOwotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTU9ERV9OT05FCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX01PREVfQUxMX1NQRUVEUwkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX01PREVfT05FX1NQRUVECQkgICAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX01PREVfT05FX09SX0JFTE9XCSAgICgweDNVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTU9ERV9TUEVFRF9NQVNLCSAgICgweDRVTCA8PCAwKQorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTU9ERV9OT05FCQkgICAweDBVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTU9ERV9BTExfU1BFRURTCSAgIDB4MVVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19NT0RFX09ORV9TUEVFRAkJICAgMHgyVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX01PREVfT05FX09SX0JFTE9XCSAgIDB4M1VMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19NT0RFX1NQRUVEX01BU0sJICAgMHg0VUwKIAl1OCBhdXRvX3BhdXNlOwogCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fUEFVU0VfVFgJCSAgICAweDFVTAogCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fUEFVU0VfUlgJCSAgICAweDJVTAogCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fUEFVU0VfQVVUT05FR19QQVVTRQkgICAgMHg0VUwKIAlfX2xlMTYgYXV0b19saW5rX3NwZWVkOwotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTElOS19TUEVFRF8xMDBNQgkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX0xJTktfU1BFRURfMUdCCQkgICAoMHhhVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX0xJTktfU1BFRURfMkdCCQkgICAoMHgxNFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19MSU5LX1NQRUVEXzJfNUdCCSAgICgweDE5VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX0xJTktfU1BFRURfMTBHQgkgICAoMHg2NFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19MSU5LX1NQRUVEXzIwR0IJICAgKDB4YzhVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTElOS19TUEVFRF8yNUdCCSAgICgweGZhVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX0xJTktfU1BFRURfNDBHQgkgICAoMHgxOTBVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTElOS19TUEVFRF81MEdCCSAgICgweDFmNFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19MSU5LX1NQRUVEXzEwMEdCCSAgICgweDNlOFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19MSU5LX1NQRUVEXzEwTUIJICAgKDB4ZmZmZlVMIDw8IDApCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19MSU5LX1NQRUVEXzEwME1CCSAgIDB4MVVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19MSU5LX1NQRUVEXzFHQgkJICAgMHhhVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX0xJTktfU1BFRURfMkdCCQkgICAweDE0VUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX0xJTktfU1BFRURfMl81R0IJICAgMHgxOVVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19MSU5LX1NQRUVEXzEwR0IJICAgMHg2NFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19MSU5LX1NQRUVEXzIwR0IJICAgMHhjOFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19MSU5LX1NQRUVEXzI1R0IJICAgMHhmYVVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19MSU5LX1NQRUVEXzQwR0IJICAgMHgxOTBVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTElOS19TUEVFRF81MEdCCSAgIDB4MWY0VUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX0xJTktfU1BFRURfMTAwR0IJICAgMHgzZThVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTElOS19TUEVFRF8xME1CCSAgIDB4ZmZmZlVMCiAJX19sZTE2IGF1dG9fbGlua19zcGVlZF9tYXNrOwogCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTElOS19TUEVFRF9NQVNLXzEwME1CSEQgICAgMHgxVUwKIAkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX0xJTktfU1BFRURfTUFTS18xMDBNQiAgICAgIDB4MlVMCkBAIC0xNzI4LDQ2ICsxNzc2LDQ2IEBACiAJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19MSU5LX1NQRUVEX01BU0tfMTBNQkhEICAgICAweDEwMDBVTAogCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTElOS19TUEVFRF9NQVNLXzEwTUIgICAgICAgMHgyMDAwVUwKIAl1OCB3aXJlc3BlZWQ7Ci0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfV0lSRVNQRUVEX09GRgkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfV0lSRVNQRUVEX09OCQkgICAoMHgxVUwgPDwgMCkKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9XSVJFU1BFRURfT0ZGCQkgICAweDBVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1dJUkVTUEVFRF9PTgkJICAgMHgxVUwKIAl1OCBscGJrOwotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xQQktfTk9ORQkJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xQQktfTE9DQUwJCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MUEJLX1JFTU9URQkJCSAgICgweDJVTCA8PCAwKQorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xQQktfTk9ORQkJCSAgIDB4MFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTFBCS19MT0NBTAkJCSAgIDB4MVVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTFBCS19SRU1PVEUJCQkgICAweDJVTAogCXU4IGZvcmNlX3BhdXNlOwogCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0ZPUkNFX1BBVVNFX1RYCQkgICAgMHgxVUwKIAkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9GT1JDRV9QQVVTRV9SWAkJICAgIDB4MlVMCiAJdTggbW9kdWxlX3N0YXR1czsKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9NT0RVTEVfU1RBVFVTX05PTkUJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX01PRFVMRV9TVEFUVVNfRElTQUJMRVRYCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX01PRFVMRV9TVEFUVVNfV0FSTklOR01TRyAgICAgICAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9NT0RVTEVfU1RBVFVTX1BXUkRPV04JICAgKDB4M1VMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTU9EVUxFX1NUQVRVU19OT1RJTlNFUlRFRCAgICAgICgweDRVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX01PRFVMRV9TVEFUVVNfTk9UQVBQTElDQUJMRSAgICAoMHhmZlVMIDw8IDApCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTU9EVUxFX1NUQVRVU19OT05FCQkgICAweDBVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX01PRFVMRV9TVEFUVVNfRElTQUJMRVRYCSAgIDB4MVVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTU9EVUxFX1NUQVRVU19XQVJOSU5HTVNHICAgICAgIDB4MlVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTU9EVUxFX1NUQVRVU19QV1JET1dOCSAgIDB4M1VMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTU9EVUxFX1NUQVRVU19OT1RJTlNFUlRFRCAgICAgIDB4NFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTU9EVUxFX1NUQVRVU19OT1RBUFBMSUNBQkxFICAgIDB4ZmZVTAogCV9fbGUzMiBwcmVlbXBoYXNpczsKIAl1OCBwaHlfbWFqOwogCXU4IHBoeV9taW47CiAJdTggcGh5X2JsZDsKIAl1OCBwaHlfdHlwZTsKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9QSFlfVFlQRV9VTktOT1dOCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9QSFlfVFlQRV9CQVNFQ1IJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1BIWV9UWVBFX0JBU0VLUjQJCSAgICgweDJVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1BIWV9UWVBFX0JBU0VMUgkJICAgKDB4M1VMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfUEhZX1RZUEVfQkFTRVNSCQkgICAoMHg0VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9QSFlfVFlQRV9CQVNFS1IyCQkgICAoMHg1VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9QSFlfVFlQRV9CQVNFS1gJCSAgICgweDZVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1BIWV9UWVBFX0JBU0VLUgkJICAgKDB4N1VMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfUEhZX1RZUEVfQkFTRVQJCSAgICgweDhVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1BIWV9UWVBFX0JBU0VURQkJICAgKDB4OVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfUEhZX1RZUEVfU0dNSUlFWFRQSFkJICAgKDB4YVVMIDw8IDApCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfUEhZX1RZUEVfVU5LTk9XTgkJICAgMHgwVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9QSFlfVFlQRV9CQVNFQ1IJCSAgIDB4MVVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfUEhZX1RZUEVfQkFTRUtSNAkJICAgMHgyVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9QSFlfVFlQRV9CQVNFTFIJCSAgIDB4M1VMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfUEhZX1RZUEVfQkFTRVNSCQkgICAweDRVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1BIWV9UWVBFX0JBU0VLUjIJCSAgIDB4NVVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfUEhZX1RZUEVfQkFTRUtYCQkgICAweDZVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1BIWV9UWVBFX0JBU0VLUgkJICAgMHg3VUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9QSFlfVFlQRV9CQVNFVAkJICAgMHg4VUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9QSFlfVFlQRV9CQVNFVEUJCSAgIDB4OVVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfUEhZX1RZUEVfU0dNSUlFWFRQSFkJICAgMHhhVUwKIAl1OCBtZWRpYV90eXBlOwotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX01FRElBX1RZUEVfVU5LTk9XTgkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTUVESUFfVFlQRV9UUAkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTUVESUFfVFlQRV9EQUMJCSAgICgweDJVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX01FRElBX1RZUEVfRklCUkUJCSAgICgweDNVTCA8PCAwKQorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX01FRElBX1RZUEVfVU5LTk9XTgkJICAgMHgwVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9NRURJQV9UWVBFX1RQCQkgICAweDFVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX01FRElBX1RZUEVfREFDCQkgICAweDJVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX01FRElBX1RZUEVfRklCUkUJCSAgIDB4M1VMCiAJdTggeGN2cl9wa2dfdHlwZTsKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9YQ1ZSX1BLR19UWVBFX1hDVlJfSU5URVJOQUwgICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfWENWUl9QS0dfVFlQRV9YQ1ZSX0VYVEVSTkFMICAgICgweDJVTCA8PCAwKQorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1hDVlJfUEtHX1RZUEVfWENWUl9JTlRFUk5BTCAgICAweDFVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1hDVlJfUEtHX1RZUEVfWENWUl9FWFRFUk5BTCAgICAweDJVTAogCXU4IGVlZV9jb25maWdfcGh5X2FkZHI7CiAJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfUEhZX0FERFJfTUFTSwkJICAgIDB4MWZVTAogCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1BIWV9BRERSX1NGVAkJICAgIDAKQEAgLTE3OTYsMTEgKzE4NDQsMTEgQEAKIAkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1BBUlRORVJfQURWX1NQRUVEU18xME1CSEQgIDB4MTAwMFVMCiAJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19QQVJUTkVSX0FEVl9TUEVFRFNfMTBNQiAgICAweDIwMDBVTAogCXU4IGxpbmtfcGFydG5lcl9hZHZfYXV0b19tb2RlOwotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfUEFSVE5FUl9BRFZfQVVUT19NT0RFX05PTkUgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19QQVJUTkVSX0FEVl9BVVRPX01PREVfQUxMX1NQRUVEUyAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1BBUlRORVJfQURWX0FVVE9fTU9ERV9PTkVfU1BFRUQgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19QQVJUTkVSX0FEVl9BVVRPX01PREVfT05FX09SX0JFTE9XICgweDNVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfUEFSVE5FUl9BRFZfQVVUT19NT0RFX1NQRUVEX01BU0sgKDB4NFVMIDw8IDApCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19QQVJUTkVSX0FEVl9BVVRPX01PREVfTk9ORSAweDBVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfUEFSVE5FUl9BRFZfQVVUT19NT0RFX0FMTF9TUEVFRFMgMHgxVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1BBUlRORVJfQURWX0FVVE9fTU9ERV9PTkVfU1BFRUQgMHgyVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1BBUlRORVJfQURWX0FVVE9fTU9ERV9PTkVfT1JfQkVMT1cgMHgzVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1BBUlRORVJfQURWX0FVVE9fTU9ERV9TUEVFRF9NQVNLIDB4NFVMCiAJdTggbGlua19wYXJ0bmVyX2Fkdl9wYXVzZTsKIAkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1BBUlRORVJfQURWX1BBVVNFX1RYICAgICAgIDB4MVVMCiAJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19QQVJUTkVSX0FEVl9QQVVTRV9SWCAgICAgICAweDJVTApAQCAtMTg1OSw3ICsxOTA3LDcgQEAKIAlfX2xlNjQgcmVzcF9hZGRyOwogCV9fbGUzMiBmbGFnczsKIAkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfRkxBR1NfTUFUQ0hfTElOSwkJICAgIDB4MVVMCi0JI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0ZMQUdTX0NPU19BU1NJR05NRU5UX0VOQUJMRSAgICAgICAweDJVTAorCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9GTEFHU19WTEFOX1BSSTJDT1NfRU5BQkxFCSAgICAweDJVTAogCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9GTEFHU19UVU5ORUxfUFJJMkNPU19FTkFCTEUgICAgICAgMHg0VUwKIAkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfRkxBR1NfSVBfRFNDUDJDT1NfRU5BQkxFCSAgICAweDhVTAogCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9GTEFHU19QVFBfUlhfVFNfQ0FQVFVSRV9FTkFCTEUgICAgMHgxMFVMCkBAIC0xODY4LDI4ICsxOTE2LDUwIEBACiAJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0ZMQUdTX1BUUF9UWF9UU19DQVBUVVJFX0RJU0FCTEUgICAweDgwVUwKIAkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfRkxBR1NfT09CX1dPTF9FTkFCTEUJCSAgICAweDEwMFVMCiAJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0ZMQUdTX09PQl9XT0xfRElTQUJMRQkJICAgIDB4MjAwVUwKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfRkxBR1NfVkxBTl9QUkkyQ09TX0RJU0FCTEUJICAgIDB4NDAwVUwKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfRkxBR1NfVFVOTkVMX1BSSTJDT1NfRElTQUJMRSAgICAgIDB4ODAwVUwKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfRkxBR1NfSVBfRFNDUDJDT1NfRElTQUJMRQkgICAgMHgxMDAwVUwKIAlfX2xlMzIgZW5hYmxlczsKIAkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfRU5BQkxFU19JUEcJCQkgICAgMHgxVUwKIAkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfRU5BQkxFU19MUEJLCQkJICAgIDB4MlVMCi0JI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0VOQUJMRVNfSVZMQU5fUFJJMkNPU19NQVBfUFJJICAgICAweDRVTAotCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9FTkFCTEVTX0xDT1NfTUFQX1BSSQkJICAgIDB4OFVMCisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0VOQUJMRVNfVkxBTl9QUkkyQ09TX01BUF9QUkkgICAgICAweDRVTAorCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9FTkFCTEVTX1JFU0VSVkVEMQkJICAgIDB4OFVMCiAJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0VOQUJMRVNfVFVOTkVMX1BSSTJDT1NfTUFQX1BSSSAgICAweDEwVUwKIAkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfRU5BQkxFU19EU0NQMkNPU19NQVBfUFJJCSAgICAweDIwVUwKIAkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfRU5BQkxFU19SWF9UU19DQVBUVVJFX1BUUF9NU0dfVFlQRSAweDQwVUwKIAkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfRU5BQkxFU19UWF9UU19DQVBUVVJFX1BUUF9NU0dfVFlQRSAweDgwVUwKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfRU5BQkxFU19DT1NfRklFTERfQ0ZHCQkgICAgMHgxMDBVTAogCV9fbGUxNiBwb3J0X2lkOwogCXU4IGlwZzsKIAl1OCBscGJrOwotCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9MUEJLX05PTkUJCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfTFBCS19MT0NBTAkJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9MUEJLX1JFTU9URQkJCSAgICgweDJVTCA8PCAwKQotCXU4IGl2bGFuX3ByaTJjb3NfbWFwX3ByaTsKLQl1OCBsY29zX21hcF9wcmk7CisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0xQQktfTk9ORQkJCSAgIDB4MFVMCisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0xQQktfTE9DQUwJCQkgICAweDFVTAorCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9MUEJLX1JFTU9URQkJCSAgIDB4MlVMCisJdTggdmxhbl9wcmkyY29zX21hcF9wcmk7CisJdTggcmVzZXJ2ZWQxOwogCXU4IHR1bm5lbF9wcmkyY29zX21hcF9wcmk7CiAJdTggZHNjcDJwcmlfbWFwX3ByaTsKIAlfX2xlMTYgcnhfdHNfY2FwdHVyZV9wdHBfbXNnX3R5cGU7CiAJX19sZTE2IHR4X3RzX2NhcHR1cmVfcHRwX21zZ190eXBlOwotCV9fbGUzMiB1bnVzZWRfMDsKKwl1OCBjb3NfZmllbGRfY2ZnOworCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9DT1NfRklFTERfQ0ZHX1JTVkQxCQkgICAgMHgxVUwKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfQ09TX0ZJRUxEX0NGR19WTEFOX1BSSV9TRUxfTUFTSyAgIDB4NlVMCisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0NPU19GSUVMRF9DRkdfVkxBTl9QUklfU0VMX1NGVCAgICAxCisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0NPU19GSUVMRF9DRkdfVkxBTl9QUklfU0VMX0lOTkVSTU9TVCAoMHgwVUwgPDwgMSkKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfQ09TX0ZJRUxEX0NGR19WTEFOX1BSSV9TRUxfT1VURVIgKDB4MVVMIDw8IDEpCisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0NPU19GSUVMRF9DRkdfVkxBTl9QUklfU0VMX09VVEVSTU9TVCAoMHgyVUwgPDwgMSkKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfQ09TX0ZJRUxEX0NGR19WTEFOX1BSSV9TRUxfVU5TUEVDSUZJRUQgKDB4M1VMIDw8IDEpCisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0NPU19GSUVMRF9DRkdfVkxBTl9QUklfU0VMX0xBU1QgICAgUE9SVF9NQUNfQ0ZHX1JFUV9DT1NfRklFTERfQ0ZHX1ZMQU5fUFJJX1NFTF9VTlNQRUNJRklFRAorCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9DT1NfRklFTERfQ0ZHX1RfVkxBTl9QUklfU0VMX01BU0sgMHgxOFVMCisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0NPU19GSUVMRF9DRkdfVF9WTEFOX1BSSV9TRUxfU0ZUICAzCisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0NPU19GSUVMRF9DRkdfVF9WTEFOX1BSSV9TRUxfSU5ORVJNT1NUICgweDBVTCA8PCAzKQorCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9DT1NfRklFTERfQ0ZHX1RfVkxBTl9QUklfU0VMX09VVEVSICgweDFVTCA8PCAzKQorCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9DT1NfRklFTERfQ0ZHX1RfVkxBTl9QUklfU0VMX09VVEVSTU9TVCAoMHgyVUwgPDwgMykKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfQ09TX0ZJRUxEX0NGR19UX1ZMQU5fUFJJX1NFTF9VTlNQRUNJRklFRCAoMHgzVUwgPDwgMykKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfQ09TX0ZJRUxEX0NGR19UX1ZMQU5fUFJJX1NFTF9MQVNUICAgIFBPUlRfTUFDX0NGR19SRVFfQ09TX0ZJRUxEX0NGR19UX1ZMQU5fUFJJX1NFTF9VTlNQRUNJRklFRAorCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9DT1NfRklFTERfQ0ZHX0RFRkFVTFRfQ09TX01BU0sgICAgMHhlMFVMCisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0NPU19GSUVMRF9DRkdfREVGQVVMVF9DT1NfU0ZUICAgICA1CisJdTggdW51c2VkXzBbM107CiB9OwogCiAvKiBPdXRwdXQgKDE2IGJ5dGVzKSAqLwpAQCAtMTkwMiw5ICsxOTcyLDkgQEAKIAlfX2xlMTYgbXR1OwogCXU4IGlwZzsKIAl1OCBscGJrOwotCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFU1BfTFBCS19OT05FCQkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX01BQ19DRkdfUkVTUF9MUEJLX0xPQ0FMCQkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX01BQ19DRkdfUkVTUF9MUEJLX1JFTU9URQkJCSAgICgweDJVTCA8PCAwKQorCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFU1BfTFBCS19OT05FCQkJICAgMHgwVUwKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVNQX0xQQktfTE9DQUwJCQkgICAweDFVTAorCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFU1BfTFBCS19SRU1PVEUJCQkgICAweDJVTAogCXU4IHVudXNlZF8wOwogCXU4IHZhbGlkOwogfTsKQEAgLTIxNjMsOCArMjIzMyw4IEBACiAJX19sZTY0IHJlc3BfYWRkcjsKIAlfX2xlMzIgZmxhZ3M7CiAJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVFfRkxBR1NfUEFUSAkJCSAgICAweDFVTAotCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVRX0ZMQUdTX1BBVEhfVFgJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVRX0ZMQUdTX1BBVEhfUlgJCSAgICgweDFVTCA8PCAwKQorCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVRX0ZMQUdTX1BBVEhfVFgJCSAgIDB4MFVMCisJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVFfRkxBR1NfUEFUSF9SWAkJICAgMHgxVUwKIAkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFUV9GTEFHU19QQVRIX0xBU1QgICAgUVVFVUVfUVBPUlRDRkdfUkVRX0ZMQUdTX1BBVEhfUlgKIAlfX2xlMTYgcG9ydF9pZDsKIAlfX2xlMTYgdW51c2VkXzA7CkBAIC0yMTc5LDUwICsyMjQ5LDUxIEBACiAJdTggbWF4X2NvbmZpZ3VyYWJsZV9xdWV1ZXM7CiAJdTggbWF4X2NvbmZpZ3VyYWJsZV9sb3NzbGVzc19xdWV1ZXM7CiAJdTggcXVldWVfY2ZnX2FsbG93ZWQ7Ci0JdTggcXVldWVfYnVmZmVyc19jZmdfYWxsb3dlZDsKKwl1OCBxdWV1ZV9jZmdfaW5mbzsKKwkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfQ0ZHX0lORk9fQVNZTV9DRkcJICAgIDB4MVVMCiAJdTggcXVldWVfcGZjZW5hYmxlX2NmZ19hbGxvd2VkOwogCXU4IHF1ZXVlX3ByaTJjb3NfY2ZnX2FsbG93ZWQ7CiAJdTggcXVldWVfY29zMmJ3X2NmZ19hbGxvd2VkOwogCXU4IHF1ZXVlX2lkMDsKIAl1OCBxdWV1ZV9pZDBfc2VydmljZV9wcm9maWxlOwotCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDBfU0VSVklDRV9QUk9GSUxFX0xPU1NZICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDBfU0VSVklDRV9QUk9GSUxFX0xPU1NMRVNTICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDBfU0VSVklDRV9QUk9GSUxFX1VOS05PV04gKDB4ZmZVTCA8PCAwKQorCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDBfU0VSVklDRV9QUk9GSUxFX0xPU1NZIDB4MFVMCisJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEMF9TRVJWSUNFX1BST0ZJTEVfTE9TU0xFU1MgMHgxVUwKKwkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQwX1NFUlZJQ0VfUFJPRklMRV9VTktOT1dOIDB4ZmZVTAogCXU4IHF1ZXVlX2lkMTsKIAl1OCBxdWV1ZV9pZDFfc2VydmljZV9wcm9maWxlOwotCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDFfU0VSVklDRV9QUk9GSUxFX0xPU1NZICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDFfU0VSVklDRV9QUk9GSUxFX0xPU1NMRVNTICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDFfU0VSVklDRV9QUk9GSUxFX1VOS05PV04gKDB4ZmZVTCA8PCAwKQorCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDFfU0VSVklDRV9QUk9GSUxFX0xPU1NZIDB4MFVMCisJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEMV9TRVJWSUNFX1BST0ZJTEVfTE9TU0xFU1MgMHgxVUwKKwkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQxX1NFUlZJQ0VfUFJPRklMRV9VTktOT1dOIDB4ZmZVTAogCXU4IHF1ZXVlX2lkMjsKIAl1OCBxdWV1ZV9pZDJfc2VydmljZV9wcm9maWxlOwotCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDJfU0VSVklDRV9QUk9GSUxFX0xPU1NZICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDJfU0VSVklDRV9QUk9GSUxFX0xPU1NMRVNTICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDJfU0VSVklDRV9QUk9GSUxFX1VOS05PV04gKDB4ZmZVTCA8PCAwKQorCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDJfU0VSVklDRV9QUk9GSUxFX0xPU1NZIDB4MFVMCisJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEMl9TRVJWSUNFX1BST0ZJTEVfTE9TU0xFU1MgMHgxVUwKKwkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQyX1NFUlZJQ0VfUFJPRklMRV9VTktOT1dOIDB4ZmZVTAogCXU4IHF1ZXVlX2lkMzsKIAl1OCBxdWV1ZV9pZDNfc2VydmljZV9wcm9maWxlOwotCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDNfU0VSVklDRV9QUk9GSUxFX0xPU1NZICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDNfU0VSVklDRV9QUk9GSUxFX0xPU1NMRVNTICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDNfU0VSVklDRV9QUk9GSUxFX1VOS05PV04gKDB4ZmZVTCA8PCAwKQorCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDNfU0VSVklDRV9QUk9GSUxFX0xPU1NZIDB4MFVMCisJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEM19TRVJWSUNFX1BST0ZJTEVfTE9TU0xFU1MgMHgxVUwKKwkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQzX1NFUlZJQ0VfUFJPRklMRV9VTktOT1dOIDB4ZmZVTAogCXU4IHF1ZXVlX2lkNDsKIAl1OCBxdWV1ZV9pZDRfc2VydmljZV9wcm9maWxlOwotCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDRfU0VSVklDRV9QUk9GSUxFX0xPU1NZICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDRfU0VSVklDRV9QUk9GSUxFX0xPU1NMRVNTICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDRfU0VSVklDRV9QUk9GSUxFX1VOS05PV04gKDB4ZmZVTCA8PCAwKQorCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDRfU0VSVklDRV9QUk9GSUxFX0xPU1NZIDB4MFVMCisJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lENF9TRVJWSUNFX1BST0ZJTEVfTE9TU0xFU1MgMHgxVUwKKwkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQ0X1NFUlZJQ0VfUFJPRklMRV9VTktOT1dOIDB4ZmZVTAogCXU4IHF1ZXVlX2lkNTsKIAl1OCBxdWV1ZV9pZDVfc2VydmljZV9wcm9maWxlOwotCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDVfU0VSVklDRV9QUk9GSUxFX0xPU1NZICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDVfU0VSVklDRV9QUk9GSUxFX0xPU1NMRVNTICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDVfU0VSVklDRV9QUk9GSUxFX1VOS05PV04gKDB4ZmZVTCA8PCAwKQorCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDVfU0VSVklDRV9QUk9GSUxFX0xPU1NZIDB4MFVMCisJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lENV9TRVJWSUNFX1BST0ZJTEVfTE9TU0xFU1MgMHgxVUwKKwkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQ1X1NFUlZJQ0VfUFJPRklMRV9VTktOT1dOIDB4ZmZVTAogCXU4IHF1ZXVlX2lkNjsKIAl1OCBxdWV1ZV9pZDZfc2VydmljZV9wcm9maWxlOwotCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDZfU0VSVklDRV9QUk9GSUxFX0xPU1NZICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDZfU0VSVklDRV9QUk9GSUxFX0xPU1NMRVNTICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDZfU0VSVklDRV9QUk9GSUxFX1VOS05PV04gKDB4ZmZVTCA8PCAwKQorCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDZfU0VSVklDRV9QUk9GSUxFX0xPU1NZIDB4MFVMCisJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lENl9TRVJWSUNFX1BST0ZJTEVfTE9TU0xFU1MgMHgxVUwKKwkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQ2X1NFUlZJQ0VfUFJPRklMRV9VTktOT1dOIDB4ZmZVTAogCXU4IHF1ZXVlX2lkNzsKIAl1OCBxdWV1ZV9pZDdfc2VydmljZV9wcm9maWxlOwotCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDdfU0VSVklDRV9QUk9GSUxFX0xPU1NZICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDdfU0VSVklDRV9QUk9GSUxFX0xPU1NMRVNTICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDdfU0VSVklDRV9QUk9GSUxFX1VOS05PV04gKDB4ZmZVTCA8PCAwKQorCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDdfU0VSVklDRV9QUk9GSUxFX0xPU1NZIDB4MFVMCisJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEN19TRVJWSUNFX1BST0ZJTEVfTE9TU0xFU1MgMHgxVUwKKwkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQ3X1NFUlZJQ0VfUFJPRklMRV9VTktOT1dOIDB4ZmZVTAogCXU4IHZhbGlkOwogfTsKIApAQCAtMjIzNSwxOSArMjMwNiwyMSBAQAogCV9fbGUxNiB0YXJnZXRfaWQ7CiAJX19sZTY0IHJlc3BfYWRkcjsKIAlfX2xlMzIgZmxhZ3M7Ci0JI2RlZmluZSBRVUVVRV9DRkdfUkVRX0ZMQUdTX1BBVEgJCQkgICAgMHgxVUwKLQkjZGVmaW5lIFFVRVVFX0NGR19SRVFfRkxBR1NfUEFUSF9UWAkJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ0ZHX1JFUV9GTEFHU19QQVRIX1JYCQkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DRkdfUkVRX0ZMQUdTX1BBVEhfTEFTVCAgICBRVUVVRV9DRkdfUkVRX0ZMQUdTX1BBVEhfUlgKKwkjZGVmaW5lIFFVRVVFX0NGR19SRVFfRkxBR1NfUEFUSF9NQVNLCQkJICAgIDB4M1VMCisJI2RlZmluZSBRVUVVRV9DRkdfUkVRX0ZMQUdTX1BBVEhfU0ZUCQkJICAgIDAKKwkjZGVmaW5lIFFVRVVFX0NGR19SRVFfRkxBR1NfUEFUSF9UWAkJCSAgIDB4MFVMCisJI2RlZmluZSBRVUVVRV9DRkdfUkVRX0ZMQUdTX1BBVEhfUlgJCQkgICAweDFVTAorCSNkZWZpbmUgUVVFVUVfQ0ZHX1JFUV9GTEFHU19QQVRIX0JJRElSCQkJICAgMHgyVUwKKwkjZGVmaW5lIFFVRVVFX0NGR19SRVFfRkxBR1NfUEFUSF9MQVNUICAgIFFVRVVFX0NGR19SRVFfRkxBR1NfUEFUSF9CSURJUgogCV9fbGUzMiBlbmFibGVzOwogCSNkZWZpbmUgUVVFVUVfQ0ZHX1JFUV9FTkFCTEVTX0RGTFRfTEVOCQkJICAgIDB4MVVMCiAJI2RlZmluZSBRVUVVRV9DRkdfUkVRX0VOQUJMRVNfU0VSVklDRV9QUk9GSUxFCQkgICAgMHgyVUwKIAlfX2xlMzIgcXVldWVfaWQ7CiAJX19sZTMyIGRmbHRfbGVuOwogCXU4IHNlcnZpY2VfcHJvZmlsZTsKLQkjZGVmaW5lIFFVRVVFX0NGR19SRVFfU0VSVklDRV9QUk9GSUxFX0xPU1NZCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NGR19SRVFfU0VSVklDRV9QUk9GSUxFX0xPU1NMRVNTCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NGR19SRVFfU0VSVklDRV9QUk9GSUxFX1VOS05PV04JCSAgICgweGZmVUwgPDwgMCkKKwkjZGVmaW5lIFFVRVVFX0NGR19SRVFfU0VSVklDRV9QUk9GSUxFX0xPU1NZCQkgICAweDBVTAorCSNkZWZpbmUgUVVFVUVfQ0ZHX1JFUV9TRVJWSUNFX1BST0ZJTEVfTE9TU0xFU1MJCSAgIDB4MVVMCisJI2RlZmluZSBRVUVVRV9DRkdfUkVRX1NFUlZJQ0VfUFJPRklMRV9VTktOT1dOCQkgICAweGZmVUwKIAl1OCB1bnVzZWRfMFs3XTsKIH07CiAKQEAgLTIyNjQsNTAgKzIzMzcsNiBAQAogCXU4IHZhbGlkOwogfTsKIAotLyogaHdybV9xdWV1ZV9idWZmZXJzX2NmZyAqLwotLyogSW5wdXQgKDU2IGJ5dGVzKSAqLwotc3RydWN0IGh3cm1fcXVldWVfYnVmZmVyc19jZmdfaW5wdXQgewotCV9fbGUxNiByZXFfdHlwZTsKLQlfX2xlMTYgY21wbF9yaW5nOwotCV9fbGUxNiBzZXFfaWQ7Ci0JX19sZTE2IHRhcmdldF9pZDsKLQlfX2xlNjQgcmVzcF9hZGRyOwotCV9fbGUzMiBmbGFnczsKLQkjZGVmaW5lIFFVRVVFX0JVRkZFUlNfQ0ZHX1JFUV9GTEFHU19QQVRICQkgICAgMHgxVUwKLQkjZGVmaW5lIFFVRVVFX0JVRkZFUlNfQ0ZHX1JFUV9GTEFHU19QQVRIX1RYCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0JVRkZFUlNfQ0ZHX1JFUV9GTEFHU19QQVRIX1JYCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0JVRkZFUlNfQ0ZHX1JFUV9GTEFHU19QQVRIX0xBU1QgICAgUVVFVUVfQlVGRkVSU19DRkdfUkVRX0ZMQUdTX1BBVEhfUlgKLQlfX2xlMzIgZW5hYmxlczsKLQkjZGVmaW5lIFFVRVVFX0JVRkZFUlNfQ0ZHX1JFUV9FTkFCTEVTX1JFU0VSVkVECQkgICAgMHgxVUwKLQkjZGVmaW5lIFFVRVVFX0JVRkZFUlNfQ0ZHX1JFUV9FTkFCTEVTX1NIQVJFRAkJICAgIDB4MlVMCi0JI2RlZmluZSBRVUVVRV9CVUZGRVJTX0NGR19SRVFfRU5BQkxFU19YT0ZGCQkgICAgMHg0VUwKLQkjZGVmaW5lIFFVRVVFX0JVRkZFUlNfQ0ZHX1JFUV9FTkFCTEVTX1hPTgkJICAgIDB4OFVMCi0JI2RlZmluZSBRVUVVRV9CVUZGRVJTX0NGR19SRVFfRU5BQkxFU19GVUxMCQkgICAgMHgxMFVMCi0JI2RlZmluZSBRVUVVRV9CVUZGRVJTX0NGR19SRVFfRU5BQkxFU19OT1RGVUxMCQkgICAgMHgyMFVMCi0JI2RlZmluZSBRVUVVRV9CVUZGRVJTX0NGR19SRVFfRU5BQkxFU19NQVgJCSAgICAweDQwVUwKLQlfX2xlMzIgcXVldWVfaWQ7Ci0JX19sZTMyIHJlc2VydmVkOwotCV9fbGUzMiBzaGFyZWQ7Ci0JX19sZTMyIHhvZmY7Ci0JX19sZTMyIHhvbjsKLQlfX2xlMzIgZnVsbDsKLQlfX2xlMzIgbm90ZnVsbDsKLQlfX2xlMzIgbWF4OwotfTsKLQotLyogT3V0cHV0ICgxNiBieXRlcykgKi8KLXN0cnVjdCBod3JtX3F1ZXVlX2J1ZmZlcnNfY2ZnX291dHB1dCB7Ci0JX19sZTE2IGVycm9yX2NvZGU7Ci0JX19sZTE2IHJlcV90eXBlOwotCV9fbGUxNiBzZXFfaWQ7Ci0JX19sZTE2IHJlc3BfbGVuOwotCV9fbGUzMiB1bnVzZWRfMDsKLQl1OCB1bnVzZWRfMTsKLQl1OCB1bnVzZWRfMjsKLQl1OCB1bnVzZWRfMzsKLQl1OCB2YWxpZDsKLX07Ci0KIC8qIGh3cm1fcXVldWVfcGZjZW5hYmxlX2NmZyAqLwogLyogSW5wdXQgKDI0IGJ5dGVzKSAqLwogc3RydWN0IGh3cm1fcXVldWVfcGZjZW5hYmxlX2NmZ19pbnB1dCB7CkBAIC0yMzUxLDEyICsyMzgwLDIyIEBACiAJX19sZTE2IHRhcmdldF9pZDsKIAlfX2xlNjQgcmVzcF9hZGRyOwogCV9fbGUzMiBmbGFnczsKLQkjZGVmaW5lIFFVRVVFX1BSSTJDT1NfQ0ZHX1JFUV9GTEFHU19QQVRICQkgICAgMHgxVUwKKwkjZGVmaW5lIFFVRVVFX1BSSTJDT1NfQ0ZHX1JFUV9GTEFHU19QQVRIX01BU0sJCSAgICAweDNVTAorCSNkZWZpbmUgUVVFVUVfUFJJMkNPU19DRkdfUkVRX0ZMQUdTX1BBVEhfU0ZUCQkgICAgMAogCSNkZWZpbmUgUVVFVUVfUFJJMkNPU19DRkdfUkVRX0ZMQUdTX1BBVEhfVFgJCSAgICgweDBVTCA8PCAwKQogCSNkZWZpbmUgUVVFVUVfUFJJMkNPU19DRkdfUkVRX0ZMQUdTX1BBVEhfUlgJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfUFJJMkNPU19DRkdfUkVRX0ZMQUdTX1BBVEhfTEFTVCAgICBRVUVVRV9QUkkyQ09TX0NGR19SRVFfRkxBR1NfUEFUSF9SWAotCSNkZWZpbmUgUVVFVUVfUFJJMkNPU19DRkdfUkVRX0ZMQUdTX0lWTEFOCQkgICAgMHgyVUwKKwkjZGVmaW5lIFFVRVVFX1BSSTJDT1NfQ0ZHX1JFUV9GTEFHU19QQVRIX0JJRElSCQkgICAoMHgyVUwgPDwgMCkKKwkjZGVmaW5lIFFVRVVFX1BSSTJDT1NfQ0ZHX1JFUV9GTEFHU19QQVRIX0xBU1QgICAgUVVFVUVfUFJJMkNPU19DRkdfUkVRX0ZMQUdTX1BBVEhfQklESVIKKwkjZGVmaW5lIFFVRVVFX1BSSTJDT1NfQ0ZHX1JFUV9GTEFHU19JVkxBTgkJICAgIDB4NFVMCiAJX19sZTMyIGVuYWJsZXM7CisJI2RlZmluZSBRVUVVRV9QUkkyQ09TX0NGR19SRVFfRU5BQkxFU19QUkkwX0NPU19RVUVVRV9JRCAgICAweDFVTAorCSNkZWZpbmUgUVVFVUVfUFJJMkNPU19DRkdfUkVRX0VOQUJMRVNfUFJJMV9DT1NfUVVFVUVfSUQgICAgMHgyVUwKKwkjZGVmaW5lIFFVRVVFX1BSSTJDT1NfQ0ZHX1JFUV9FTkFCTEVTX1BSSTJfQ09TX1FVRVVFX0lEICAgIDB4NFVMCisJI2RlZmluZSBRVUVVRV9QUkkyQ09TX0NGR19SRVFfRU5BQkxFU19QUkkzX0NPU19RVUVVRV9JRCAgICAweDhVTAorCSNkZWZpbmUgUVVFVUVfUFJJMkNPU19DRkdfUkVRX0VOQUJMRVNfUFJJNF9DT1NfUVVFVUVfSUQgICAgMHgxMFVMCisJI2RlZmluZSBRVUVVRV9QUkkyQ09TX0NGR19SRVFfRU5BQkxFU19QUkk1X0NPU19RVUVVRV9JRCAgICAweDIwVUwKKwkjZGVmaW5lIFFVRVVFX1BSSTJDT1NfQ0ZHX1JFUV9FTkFCTEVTX1BSSTZfQ09TX1FVRVVFX0lEICAgIDB4NDBVTAorCSNkZWZpbmUgUVVFVUVfUFJJMkNPU19DRkdfUkVRX0VOQUJMRVNfUFJJN19DT1NfUVVFVUVfSUQgICAgMHg4MFVMCiAJdTggcG9ydF9pZDsKIAl1OCBwcmkwX2Nvc19xdWV1ZV9pZDsKIAl1OCBwcmkxX2Nvc19xdWV1ZV9pZDsKQEAgLTI0MDQsODIgKzI0NDMsMjI2IEBACiAJdTggcXVldWVfaWQwOwogCXU4IHVudXNlZF8wOwogCV9fbGUzMiBxdWV1ZV9pZDBfbWluX2J3OworCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX01JTl9CV19CV19WQUxVRV9NQVNLIDB4ZmZmZmZmZlVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfTUlOX0JXX0JXX1ZBTFVFX1NGVCAwCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfTUlOX0JXX1JTVkQJICAgIDB4MTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX01JTl9CV19CV19WQUxVRV9VTklUX01BU0sgMHhlMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfU0ZUIDI5CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTUJQUyAoMHgwVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfUEVSQ0VOVDFfMTAwICgweDFVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9NSU5fQldfQldfVkFMVUVfVU5JVF9JTlZBTElEICgweDdVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9NSU5fQldfQldfVkFMVUVfVU5JVF9MQVNUICAgIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9NSU5fQldfQldfVkFMVUVfVU5JVF9JTlZBTElECiAJX19sZTMyIHF1ZXVlX2lkMF9tYXhfYnc7CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfTUFYX0JXX0JXX1ZBTFVFX01BU0sgMHhmZmZmZmZmVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9NQVhfQldfQldfVkFMVUVfU0ZUIDAKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9NQVhfQldfUlNWRAkgICAgMHgxMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTUFTSyAweGUwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9NQVhfQldfQldfVkFMVUVfVU5JVF9TRlQgMjkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9NQVhfQldfQldfVkFMVUVfVU5JVF9NQlBTICgweDBVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9NQVhfQldfQldfVkFMVUVfVU5JVF9QRVJDRU5UMV8xMDAgKDB4MVVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX01BWF9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQgKDB4N1VMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX01BWF9CV19CV19WQUxVRV9VTklUX0xBU1QgICAgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX01BWF9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQKIAl1OCBxdWV1ZV9pZDBfdHNhX2Fzc2lnbjsKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9UU0FfQVNTSUdOX1NQICAgICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfVFNBX0FTU0lHTl9FVFMgICAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX1RTQV9BU1NJR05fUkVTRVJWRURfRklSU1QgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfVFNBX0FTU0lHTl9SRVNFUlZFRF9MQVNUICgweGZmVUwgPDwgMCkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9UU0FfQVNTSUdOX1NQICAgICAgMHgwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9UU0FfQVNTSUdOX0VUUyAgICAgMHgxVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9UU0FfQVNTSUdOX1JFU0VSVkVEX0ZJUlNUIDB4MlVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfVFNBX0FTU0lHTl9SRVNFUlZFRF9MQVNUIDB4ZmZVTAogCXU4IHF1ZXVlX2lkMF9wcmlfbHZsOwogCXU4IHF1ZXVlX2lkMF9id193ZWlnaHQ7CiAJdTggcXVldWVfaWQxOwogCV9fbGUzMiBxdWV1ZV9pZDFfbWluX2J3OworCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX01JTl9CV19CV19WQUxVRV9NQVNLIDB4ZmZmZmZmZlVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfTUlOX0JXX0JXX1ZBTFVFX1NGVCAwCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfTUlOX0JXX1JTVkQJICAgIDB4MTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX01JTl9CV19CV19WQUxVRV9VTklUX01BU0sgMHhlMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfU0ZUIDI5CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTUJQUyAoMHgwVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfUEVSQ0VOVDFfMTAwICgweDFVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9NSU5fQldfQldfVkFMVUVfVU5JVF9JTlZBTElEICgweDdVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9NSU5fQldfQldfVkFMVUVfVU5JVF9MQVNUICAgIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9NSU5fQldfQldfVkFMVUVfVU5JVF9JTlZBTElECiAJX19sZTMyIHF1ZXVlX2lkMV9tYXhfYnc7CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfTUFYX0JXX0JXX1ZBTFVFX01BU0sgMHhmZmZmZmZmVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9NQVhfQldfQldfVkFMVUVfU0ZUIDAKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9NQVhfQldfUlNWRAkgICAgMHgxMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTUFTSyAweGUwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9NQVhfQldfQldfVkFMVUVfVU5JVF9TRlQgMjkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9NQVhfQldfQldfVkFMVUVfVU5JVF9NQlBTICgweDBVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9NQVhfQldfQldfVkFMVUVfVU5JVF9QRVJDRU5UMV8xMDAgKDB4MVVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX01BWF9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQgKDB4N1VMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX01BWF9CV19CV19WQUxVRV9VTklUX0xBU1QgICAgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX01BWF9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQKIAl1OCBxdWV1ZV9pZDFfdHNhX2Fzc2lnbjsKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9UU0FfQVNTSUdOX1NQICAgICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfVFNBX0FTU0lHTl9FVFMgICAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX1RTQV9BU1NJR05fUkVTRVJWRURfRklSU1QgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfVFNBX0FTU0lHTl9SRVNFUlZFRF9MQVNUICgweGZmVUwgPDwgMCkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9UU0FfQVNTSUdOX1NQICAgICAgMHgwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9UU0FfQVNTSUdOX0VUUyAgICAgMHgxVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9UU0FfQVNTSUdOX1JFU0VSVkVEX0ZJUlNUIDB4MlVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfVFNBX0FTU0lHTl9SRVNFUlZFRF9MQVNUIDB4ZmZVTAogCXU4IHF1ZXVlX2lkMV9wcmlfbHZsOwogCXU4IHF1ZXVlX2lkMV9id193ZWlnaHQ7CiAJdTggcXVldWVfaWQyOwogCV9fbGUzMiBxdWV1ZV9pZDJfbWluX2J3OworCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX01JTl9CV19CV19WQUxVRV9NQVNLIDB4ZmZmZmZmZlVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfTUlOX0JXX0JXX1ZBTFVFX1NGVCAwCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfTUlOX0JXX1JTVkQJICAgIDB4MTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX01JTl9CV19CV19WQUxVRV9VTklUX01BU0sgMHhlMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfU0ZUIDI5CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTUJQUyAoMHgwVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfUEVSQ0VOVDFfMTAwICgweDFVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9NSU5fQldfQldfVkFMVUVfVU5JVF9JTlZBTElEICgweDdVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9NSU5fQldfQldfVkFMVUVfVU5JVF9MQVNUICAgIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9NSU5fQldfQldfVkFMVUVfVU5JVF9JTlZBTElECiAJX19sZTMyIHF1ZXVlX2lkMl9tYXhfYnc7CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfTUFYX0JXX0JXX1ZBTFVFX01BU0sgMHhmZmZmZmZmVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9NQVhfQldfQldfVkFMVUVfU0ZUIDAKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9NQVhfQldfUlNWRAkgICAgMHgxMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTUFTSyAweGUwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9NQVhfQldfQldfVkFMVUVfVU5JVF9TRlQgMjkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9NQVhfQldfQldfVkFMVUVfVU5JVF9NQlBTICgweDBVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9NQVhfQldfQldfVkFMVUVfVU5JVF9QRVJDRU5UMV8xMDAgKDB4MVVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX01BWF9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQgKDB4N1VMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX01BWF9CV19CV19WQUxVRV9VTklUX0xBU1QgICAgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX01BWF9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQKIAl1OCBxdWV1ZV9pZDJfdHNhX2Fzc2lnbjsKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9UU0FfQVNTSUdOX1NQICAgICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfVFNBX0FTU0lHTl9FVFMgICAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX1RTQV9BU1NJR05fUkVTRVJWRURfRklSU1QgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfVFNBX0FTU0lHTl9SRVNFUlZFRF9MQVNUICgweGZmVUwgPDwgMCkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9UU0FfQVNTSUdOX1NQICAgICAgMHgwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9UU0FfQVNTSUdOX0VUUyAgICAgMHgxVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9UU0FfQVNTSUdOX1JFU0VSVkVEX0ZJUlNUIDB4MlVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfVFNBX0FTU0lHTl9SRVNFUlZFRF9MQVNUIDB4ZmZVTAogCXU4IHF1ZXVlX2lkMl9wcmlfbHZsOwogCXU4IHF1ZXVlX2lkMl9id193ZWlnaHQ7CiAJdTggcXVldWVfaWQzOwogCV9fbGUzMiBxdWV1ZV9pZDNfbWluX2J3OworCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX01JTl9CV19CV19WQUxVRV9NQVNLIDB4ZmZmZmZmZlVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfTUlOX0JXX0JXX1ZBTFVFX1NGVCAwCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfTUlOX0JXX1JTVkQJICAgIDB4MTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX01JTl9CV19CV19WQUxVRV9VTklUX01BU0sgMHhlMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfU0ZUIDI5CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTUJQUyAoMHgwVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfUEVSQ0VOVDFfMTAwICgweDFVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19NSU5fQldfQldfVkFMVUVfVU5JVF9JTlZBTElEICgweDdVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19NSU5fQldfQldfVkFMVUVfVU5JVF9MQVNUICAgIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19NSU5fQldfQldfVkFMVUVfVU5JVF9JTlZBTElECiAJX19sZTMyIHF1ZXVlX2lkM19tYXhfYnc7CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfTUFYX0JXX0JXX1ZBTFVFX01BU0sgMHhmZmZmZmZmVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19NQVhfQldfQldfVkFMVUVfU0ZUIDAKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19NQVhfQldfUlNWRAkgICAgMHgxMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTUFTSyAweGUwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19NQVhfQldfQldfVkFMVUVfVU5JVF9TRlQgMjkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19NQVhfQldfQldfVkFMVUVfVU5JVF9NQlBTICgweDBVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19NQVhfQldfQldfVkFMVUVfVU5JVF9QRVJDRU5UMV8xMDAgKDB4MVVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX01BWF9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQgKDB4N1VMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX01BWF9CV19CV19WQUxVRV9VTklUX0xBU1QgICAgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX01BWF9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQKIAl1OCBxdWV1ZV9pZDNfdHNhX2Fzc2lnbjsKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19UU0FfQVNTSUdOX1NQICAgICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfVFNBX0FTU0lHTl9FVFMgICAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX1RTQV9BU1NJR05fUkVTRVJWRURfRklSU1QgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfVFNBX0FTU0lHTl9SRVNFUlZFRF9MQVNUICgweGZmVUwgPDwgMCkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19UU0FfQVNTSUdOX1NQICAgICAgMHgwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19UU0FfQVNTSUdOX0VUUyAgICAgMHgxVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19UU0FfQVNTSUdOX1JFU0VSVkVEX0ZJUlNUIDB4MlVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfVFNBX0FTU0lHTl9SRVNFUlZFRF9MQVNUIDB4ZmZVTAogCXU4IHF1ZXVlX2lkM19wcmlfbHZsOwogCXU4IHF1ZXVlX2lkM19id193ZWlnaHQ7CiAJdTggcXVldWVfaWQ0OwogCV9fbGUzMiBxdWV1ZV9pZDRfbWluX2J3OworCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X01JTl9CV19CV19WQUxVRV9NQVNLIDB4ZmZmZmZmZlVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfTUlOX0JXX0JXX1ZBTFVFX1NGVCAwCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfTUlOX0JXX1JTVkQJICAgIDB4MTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X01JTl9CV19CV19WQUxVRV9VTklUX01BU0sgMHhlMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfU0ZUIDI5CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTUJQUyAoMHgwVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfUEVSQ0VOVDFfMTAwICgweDFVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9NSU5fQldfQldfVkFMVUVfVU5JVF9JTlZBTElEICgweDdVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9NSU5fQldfQldfVkFMVUVfVU5JVF9MQVNUICAgIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9NSU5fQldfQldfVkFMVUVfVU5JVF9JTlZBTElECiAJX19sZTMyIHF1ZXVlX2lkNF9tYXhfYnc7CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfTUFYX0JXX0JXX1ZBTFVFX01BU0sgMHhmZmZmZmZmVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9NQVhfQldfQldfVkFMVUVfU0ZUIDAKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9NQVhfQldfUlNWRAkgICAgMHgxMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTUFTSyAweGUwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9NQVhfQldfQldfVkFMVUVfVU5JVF9TRlQgMjkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9NQVhfQldfQldfVkFMVUVfVU5JVF9NQlBTICgweDBVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9NQVhfQldfQldfVkFMVUVfVU5JVF9QRVJDRU5UMV8xMDAgKDB4MVVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X01BWF9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQgKDB4N1VMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X01BWF9CV19CV19WQUxVRV9VTklUX0xBU1QgICAgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X01BWF9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQKIAl1OCBxdWV1ZV9pZDRfdHNhX2Fzc2lnbjsKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9UU0FfQVNTSUdOX1NQICAgICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfVFNBX0FTU0lHTl9FVFMgICAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X1RTQV9BU1NJR05fUkVTRVJWRURfRklSU1QgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfVFNBX0FTU0lHTl9SRVNFUlZFRF9MQVNUICgweGZmVUwgPDwgMCkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9UU0FfQVNTSUdOX1NQICAgICAgMHgwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9UU0FfQVNTSUdOX0VUUyAgICAgMHgxVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9UU0FfQVNTSUdOX1JFU0VSVkVEX0ZJUlNUIDB4MlVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfVFNBX0FTU0lHTl9SRVNFUlZFRF9MQVNUIDB4ZmZVTAogCXU4IHF1ZXVlX2lkNF9wcmlfbHZsOwogCXU4IHF1ZXVlX2lkNF9id193ZWlnaHQ7CiAJdTggcXVldWVfaWQ1OwogCV9fbGUzMiBxdWV1ZV9pZDVfbWluX2J3OworCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X01JTl9CV19CV19WQUxVRV9NQVNLIDB4ZmZmZmZmZlVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfTUlOX0JXX0JXX1ZBTFVFX1NGVCAwCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfTUlOX0JXX1JTVkQJICAgIDB4MTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X01JTl9CV19CV19WQUxVRV9VTklUX01BU0sgMHhlMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfU0ZUIDI5CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTUJQUyAoMHgwVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfUEVSQ0VOVDFfMTAwICgweDFVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9NSU5fQldfQldfVkFMVUVfVU5JVF9JTlZBTElEICgweDdVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9NSU5fQldfQldfVkFMVUVfVU5JVF9MQVNUICAgIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9NSU5fQldfQldfVkFMVUVfVU5JVF9JTlZBTElECiAJX19sZTMyIHF1ZXVlX2lkNV9tYXhfYnc7CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfTUFYX0JXX0JXX1ZBTFVFX01BU0sgMHhmZmZmZmZmVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9NQVhfQldfQldfVkFMVUVfU0ZUIDAKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9NQVhfQldfUlNWRAkgICAgMHgxMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTUFTSyAweGUwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9NQVhfQldfQldfVkFMVUVfVU5JVF9TRlQgMjkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9NQVhfQldfQldfVkFMVUVfVU5JVF9NQlBTICgweDBVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9NQVhfQldfQldfVkFMVUVfVU5JVF9QRVJDRU5UMV8xMDAgKDB4MVVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X01BWF9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQgKDB4N1VMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X01BWF9CV19CV19WQUxVRV9VTklUX0xBU1QgICAgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X01BWF9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQKIAl1OCBxdWV1ZV9pZDVfdHNhX2Fzc2lnbjsKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9UU0FfQVNTSUdOX1NQICAgICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfVFNBX0FTU0lHTl9FVFMgICAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X1RTQV9BU1NJR05fUkVTRVJWRURfRklSU1QgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfVFNBX0FTU0lHTl9SRVNFUlZFRF9MQVNUICgweGZmVUwgPDwgMCkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9UU0FfQVNTSUdOX1NQICAgICAgMHgwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9UU0FfQVNTSUdOX0VUUyAgICAgMHgxVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9UU0FfQVNTSUdOX1JFU0VSVkVEX0ZJUlNUIDB4MlVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfVFNBX0FTU0lHTl9SRVNFUlZFRF9MQVNUIDB4ZmZVTAogCXU4IHF1ZXVlX2lkNV9wcmlfbHZsOwogCXU4IHF1ZXVlX2lkNV9id193ZWlnaHQ7CiAJdTggcXVldWVfaWQ2OwogCV9fbGUzMiBxdWV1ZV9pZDZfbWluX2J3OworCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X01JTl9CV19CV19WQUxVRV9NQVNLIDB4ZmZmZmZmZlVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfTUlOX0JXX0JXX1ZBTFVFX1NGVCAwCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfTUlOX0JXX1JTVkQJICAgIDB4MTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X01JTl9CV19CV19WQUxVRV9VTklUX01BU0sgMHhlMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfU0ZUIDI5CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTUJQUyAoMHgwVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfUEVSQ0VOVDFfMTAwICgweDFVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9NSU5fQldfQldfVkFMVUVfVU5JVF9JTlZBTElEICgweDdVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9NSU5fQldfQldfVkFMVUVfVU5JVF9MQVNUICAgIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9NSU5fQldfQldfVkFMVUVfVU5JVF9JTlZBTElECiAJX19sZTMyIHF1ZXVlX2lkNl9tYXhfYnc7CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfTUFYX0JXX0JXX1ZBTFVFX01BU0sgMHhmZmZmZmZmVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9NQVhfQldfQldfVkFMVUVfU0ZUIDAKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9NQVhfQldfUlNWRAkgICAgMHgxMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTUFTSyAweGUwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9NQVhfQldfQldfVkFMVUVfVU5JVF9TRlQgMjkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9NQVhfQldfQldfVkFMVUVfVU5JVF9NQlBTICgweDBVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9NQVhfQldfQldfVkFMVUVfVU5JVF9QRVJDRU5UMV8xMDAgKDB4MVVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X01BWF9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQgKDB4N1VMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X01BWF9CV19CV19WQUxVRV9VTklUX0xBU1QgICAgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X01BWF9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQKIAl1OCBxdWV1ZV9pZDZfdHNhX2Fzc2lnbjsKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9UU0FfQVNTSUdOX1NQICAgICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfVFNBX0FTU0lHTl9FVFMgICAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X1RTQV9BU1NJR05fUkVTRVJWRURfRklSU1QgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfVFNBX0FTU0lHTl9SRVNFUlZFRF9MQVNUICgweGZmVUwgPDwgMCkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9UU0FfQVNTSUdOX1NQICAgICAgMHgwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9UU0FfQVNTSUdOX0VUUyAgICAgMHgxVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9UU0FfQVNTSUdOX1JFU0VSVkVEX0ZJUlNUIDB4MlVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfVFNBX0FTU0lHTl9SRVNFUlZFRF9MQVNUIDB4ZmZVTAogCXU4IHF1ZXVlX2lkNl9wcmlfbHZsOwogCXU4IHF1ZXVlX2lkNl9id193ZWlnaHQ7CiAJdTggcXVldWVfaWQ3OwogCV9fbGUzMiBxdWV1ZV9pZDdfbWluX2J3OworCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X01JTl9CV19CV19WQUxVRV9NQVNLIDB4ZmZmZmZmZlVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfTUlOX0JXX0JXX1ZBTFVFX1NGVCAwCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfTUlOX0JXX1JTVkQJICAgIDB4MTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X01JTl9CV19CV19WQUxVRV9VTklUX01BU0sgMHhlMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfU0ZUIDI5CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTUJQUyAoMHgwVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfUEVSQ0VOVDFfMTAwICgweDFVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19NSU5fQldfQldfVkFMVUVfVU5JVF9JTlZBTElEICgweDdVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19NSU5fQldfQldfVkFMVUVfVU5JVF9MQVNUICAgIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19NSU5fQldfQldfVkFMVUVfVU5JVF9JTlZBTElECiAJX19sZTMyIHF1ZXVlX2lkN19tYXhfYnc7CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfTUFYX0JXX0JXX1ZBTFVFX01BU0sgMHhmZmZmZmZmVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19NQVhfQldfQldfVkFMVUVfU0ZUIDAKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19NQVhfQldfUlNWRAkgICAgMHgxMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTUFTSyAweGUwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19NQVhfQldfQldfVkFMVUVfVU5JVF9TRlQgMjkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19NQVhfQldfQldfVkFMVUVfVU5JVF9NQlBTICgweDBVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19NQVhfQldfQldfVkFMVUVfVU5JVF9QRVJDRU5UMV8xMDAgKDB4MVVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X01BWF9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQgKDB4N1VMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X01BWF9CV19CV19WQUxVRV9VTklUX0xBU1QgICAgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X01BWF9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQKIAl1OCBxdWV1ZV9pZDdfdHNhX2Fzc2lnbjsKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19UU0FfQVNTSUdOX1NQICAgICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfVFNBX0FTU0lHTl9FVFMgICAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X1RTQV9BU1NJR05fUkVTRVJWRURfRklSU1QgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfVFNBX0FTU0lHTl9SRVNFUlZFRF9MQVNUICgweGZmVUwgPDwgMCkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19UU0FfQVNTSUdOX1NQICAgICAgMHgwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19UU0FfQVNTSUdOX0VUUyAgICAgMHgxVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19UU0FfQVNTSUdOX1JFU0VSVkVEX0ZJUlNUIDB4MlVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfVFNBX0FTU0lHTl9SRVNFUlZFRF9MQVNUIDB4ZmZVTAogCXU4IHF1ZXVlX2lkN19wcmlfbHZsOwogCXU4IHF1ZXVlX2lkN19id193ZWlnaHQ7CiAJdTggdW51c2VkXzFbNV07CkBAIC0yNTYzLDYgKzI3NDYsNyBAQAogCSNkZWZpbmUgVk5JQ19DRkdfUkVRX0ZMQUdTX0JEX1NUQUxMX01PREUJCSAgICAweDRVTAogCSNkZWZpbmUgVk5JQ19DRkdfUkVRX0ZMQUdTX1JPQ0VfRFVBTF9WTklDX01PREUJCSAgICAweDhVTAogCSNkZWZpbmUgVk5JQ19DRkdfUkVRX0ZMQUdTX1JPQ0VfT05MWV9WTklDX01PREUJCSAgICAweDEwVUwKKwkjZGVmaW5lIFZOSUNfQ0ZHX1JFUV9GTEFHU19SU1NfREZMVF9DUl9NT0RFCQkgICAgMHgyMFVMCiAJX19sZTMyIGVuYWJsZXM7CiAJI2RlZmluZSBWTklDX0NGR19SRVFfRU5BQkxFU19ERkxUX1JJTkdfR1JQCQkgICAgMHgxVUwKIAkjZGVmaW5lIFZOSUNfQ0ZHX1JFUV9FTkFCTEVTX1JTU19SVUxFCQkJICAgIDB4MlVMCkBAIC0yNjE1LDE4ICsyNzk5LDE4IEBACiAJI2RlZmluZSBWTklDX1RQQV9DRkdfUkVRX0VOQUJMRVNfTUlOX0FHR19MRU4JCSAgICAweDhVTAogCV9fbGUxNiB2bmljX2lkOwogCV9fbGUxNiBtYXhfYWdnX3NlZ3M7Ci0JI2RlZmluZSBWTklDX1RQQV9DRkdfUkVRX01BWF9BR0dfU0VHU18xCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFZOSUNfVFBBX0NGR19SRVFfTUFYX0FHR19TRUdTXzIJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgVk5JQ19UUEFfQ0ZHX1JFUV9NQVhfQUdHX1NFR1NfNAkJICAgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBWTklDX1RQQV9DRkdfUkVRX01BWF9BR0dfU0VHU184CQkgICAoMHgzVUwgPDwgMCkKLQkjZGVmaW5lIFZOSUNfVFBBX0NGR19SRVFfTUFYX0FHR19TRUdTX01BWAkJICAgKDB4MWZVTCA8PCAwKQorCSNkZWZpbmUgVk5JQ19UUEFfQ0ZHX1JFUV9NQVhfQUdHX1NFR1NfMQkJICAgMHgwVUwKKwkjZGVmaW5lIFZOSUNfVFBBX0NGR19SRVFfTUFYX0FHR19TRUdTXzIJCSAgIDB4MVVMCisJI2RlZmluZSBWTklDX1RQQV9DRkdfUkVRX01BWF9BR0dfU0VHU180CQkgICAweDJVTAorCSNkZWZpbmUgVk5JQ19UUEFfQ0ZHX1JFUV9NQVhfQUdHX1NFR1NfOAkJICAgMHgzVUwKKwkjZGVmaW5lIFZOSUNfVFBBX0NGR19SRVFfTUFYX0FHR19TRUdTX01BWAkJICAgMHgxZlVMCiAJX19sZTE2IG1heF9hZ2dzOwotCSNkZWZpbmUgVk5JQ19UUEFfQ0ZHX1JFUV9NQVhfQUdHU18xCQkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBWTklDX1RQQV9DRkdfUkVRX01BWF9BR0dTXzIJCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFZOSUNfVFBBX0NGR19SRVFfTUFYX0FHR1NfNAkJCSAgICgweDJVTCA8PCAwKQotCSNkZWZpbmUgVk5JQ19UUEFfQ0ZHX1JFUV9NQVhfQUdHU184CQkJICAgKDB4M1VMIDw8IDApCi0JI2RlZmluZSBWTklDX1RQQV9DRkdfUkVRX01BWF9BR0dTXzE2CQkJICAgKDB4NFVMIDw8IDApCi0JI2RlZmluZSBWTklDX1RQQV9DRkdfUkVRX01BWF9BR0dTX01BWAkJCSAgICgweDdVTCA8PCAwKQorCSNkZWZpbmUgVk5JQ19UUEFfQ0ZHX1JFUV9NQVhfQUdHU18xCQkJICAgMHgwVUwKKwkjZGVmaW5lIFZOSUNfVFBBX0NGR19SRVFfTUFYX0FHR1NfMgkJCSAgIDB4MVVMCisJI2RlZmluZSBWTklDX1RQQV9DRkdfUkVRX01BWF9BR0dTXzQJCQkgICAweDJVTAorCSNkZWZpbmUgVk5JQ19UUEFfQ0ZHX1JFUV9NQVhfQUdHU184CQkJICAgMHgzVUwKKwkjZGVmaW5lIFZOSUNfVFBBX0NGR19SRVFfTUFYX0FHR1NfMTYJCQkgICAweDRVTAorCSNkZWZpbmUgVk5JQ19UUEFfQ0ZHX1JFUV9NQVhfQUdHU19NQVgJCQkgICAweDdVTAogCXU4IHVudXNlZF8wOwogCXU4IHVudXNlZF8xOwogCV9fbGUzMiBtYXhfYWdnX3RpbWVyOwpAQCAtMjc4MCwxNSArMjk2NCwxNSBAQAogCV9fbGU2NCByZXNwX2FkZHI7CiAJX19sZTMyIGVuYWJsZXM7CiAJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9FTkFCTEVTX1JFU0VSVkVEMQkJICAgIDB4MVVMCi0JI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9FTkFCTEVTX1JFU0VSVkVEMgkJICAgIDB4MlVMCisJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9FTkFCTEVTX1JJTkdfQVJCX0NGRwkJICAgIDB4MlVMCiAJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9FTkFCTEVTX1JFU0VSVkVEMwkJICAgIDB4NFVMCiAJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9FTkFCTEVTX1NUQVRfQ1RYX0lEX1ZBTElECSAgICAweDhVTAogCSNkZWZpbmUgUklOR19BTExPQ19SRVFfRU5BQkxFU19SRVNFUlZFRDQJCSAgICAweDEwVUwKIAkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX0VOQUJMRVNfTUFYX0JXX1ZBTElECQkgICAgMHgyMFVMCiAJdTggcmluZ190eXBlOwotCSNkZWZpbmUgUklOR19BTExPQ19SRVFfUklOR19UWVBFX0NNUEwJCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX1JJTkdfVFlQRV9UWAkJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUklOR19BTExPQ19SRVFfUklOR19UWVBFX1JYCQkJICAgKDB4MlVMIDw8IDApCisJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9SSU5HX1RZUEVfQ01QTAkJCSAgIDB4MFVMCisJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9SSU5HX1RZUEVfVFgJCQkgICAweDFVTAorCSNkZWZpbmUgUklOR19BTExPQ19SRVFfUklOR19UWVBFX1JYCQkJICAgMHgyVUwKIAl1OCB1bnVzZWRfMDsKIAlfX2xlMTYgdW51c2VkXzE7CiAJX19sZTY0IHBhZ2VfdGJsX2FkZHI7CkBAIC0yODA0LDE4ICsyOTg4LDM2IEBACiAJdTggdW51c2VkXzQ7CiAJdTggdW51c2VkXzU7CiAJX19sZTMyIHJlc2VydmVkMTsKLQlfX2xlMTYgcmVzZXJ2ZWQyOworCV9fbGUxNiByaW5nX2FyYl9jZmc7CisJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9SSU5HX0FSQl9DRkdfQVJCX1BPTElDWV9NQVNLCSAgICAweGZVTAorCSNkZWZpbmUgUklOR19BTExPQ19SRVFfUklOR19BUkJfQ0ZHX0FSQl9QT0xJQ1lfU0ZUCSAgICAwCisJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9SSU5HX0FSQl9DRkdfQVJCX1BPTElDWV9TUAkgICAoMHgxVUwgPDwgMCkKKwkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX1JJTkdfQVJCX0NGR19BUkJfUE9MSUNZX1dGUQkgICAoMHgyVUwgPDwgMCkKKwkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX1JJTkdfQVJCX0NGR19BUkJfUE9MSUNZX0xBU1QgICAgUklOR19BTExPQ19SRVFfUklOR19BUkJfQ0ZHX0FSQl9QT0xJQ1lfV0ZRCisJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9SSU5HX0FSQl9DRkdfUlNWRF9NQVNLCQkgICAgMHhmMFVMCisJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9SSU5HX0FSQl9DRkdfUlNWRF9TRlQJCSAgICA0CisJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9SSU5HX0FSQl9DRkdfQVJCX1BPTElDWV9QQVJBTV9NQVNLICAweGZmMDBVTAorCSNkZWZpbmUgUklOR19BTExPQ19SRVFfUklOR19BUkJfQ0ZHX0FSQl9QT0xJQ1lfUEFSQU1fU0ZUICAgOAogCXU4IHVudXNlZF82OwogCXU4IHVudXNlZF83OwogCV9fbGUzMiByZXNlcnZlZDM7CiAJX19sZTMyIHN0YXRfY3R4X2lkOwogCV9fbGUzMiByZXNlcnZlZDQ7CiAJX19sZTMyIG1heF9idzsKKwkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX01BWF9CV19CV19WQUxVRV9NQVNLCQkgICAgMHhmZmZmZmZmVUwKKwkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX01BWF9CV19CV19WQUxVRV9TRlQJCSAgICAwCisJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9NQVhfQldfUlNWRAkJCSAgICAweDEwMDAwMDAwVUwKKwkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX01BWF9CV19CV19WQUxVRV9VTklUX01BU0sJICAgIDB4ZTAwMDAwMDBVTAorCSNkZWZpbmUgUklOR19BTExPQ19SRVFfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfU0ZUCSAgICAyOQorCSNkZWZpbmUgUklOR19BTExPQ19SRVFfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTUJQUwkgICAoMHgwVUwgPDwgMjkpCisJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9NQVhfQldfQldfVkFMVUVfVU5JVF9QRVJDRU5UMV8xMDAgICgweDFVTCA8PCAyOSkKKwkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX01BWF9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQgICAgICAgKDB4N1VMIDw8IDI5KQorCSNkZWZpbmUgUklOR19BTExPQ19SRVFfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTEFTVCAgICBSSU5HX0FMTE9DX1JFUV9NQVhfQldfQldfVkFMVUVfVU5JVF9JTlZBTElECiAJdTggaW50X21vZGU7Ci0JI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9JTlRfTU9ERV9MRUdBQ1kJCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX0lOVF9NT0RFX1JTVkQJCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX0lOVF9NT0RFX01TSVgJCQkgICAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX0lOVF9NT0RFX1BPTEwJCQkgICAoMHgzVUwgPDwgMCkKKwkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX0lOVF9NT0RFX0xFR0FDWQkJCSAgIDB4MFVMCisJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9JTlRfTU9ERV9SU1ZECQkJICAgMHgxVUwKKwkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX0lOVF9NT0RFX01TSVgJCQkgICAweDJVTAorCSNkZWZpbmUgUklOR19BTExPQ19SRVFfSU5UX01PREVfUE9MTAkJCSAgIDB4M1VMCiAJdTggdW51c2VkXzhbM107CiB9OwogCkBAIC0yODQyLDkgKzMwNDQsOSBAQAogCV9fbGUxNiB0YXJnZXRfaWQ7CiAJX19sZTY0IHJlc3BfYWRkcjsKIAl1OCByaW5nX3R5cGU7Ci0JI2RlZmluZSBSSU5HX0ZSRUVfUkVRX1JJTkdfVFlQRV9DTVBMCQkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBSSU5HX0ZSRUVfUkVRX1JJTkdfVFlQRV9UWAkJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUklOR19GUkVFX1JFUV9SSU5HX1RZUEVfUlgJCQkgICAoMHgyVUwgPDwgMCkKKwkjZGVmaW5lIFJJTkdfRlJFRV9SRVFfUklOR19UWVBFX0NNUEwJCQkgICAweDBVTAorCSNkZWZpbmUgUklOR19GUkVFX1JFUV9SSU5HX1RZUEVfVFgJCQkgICAweDFVTAorCSNkZWZpbmUgUklOR19GUkVFX1JFUV9SSU5HX1RZUEVfUlgJCQkgICAweDJVTAogCXU4IHVudXNlZF8wOwogCV9fbGUxNiByaW5nX2lkOwogCV9fbGUzMiB1bnVzZWRfMTsKQEAgLTI5NDIsOSArMzE0NCw5IEBACiAJX19sZTE2IHRhcmdldF9pZDsKIAlfX2xlNjQgcmVzcF9hZGRyOwogCXU4IHJpbmdfdHlwZTsKLQkjZGVmaW5lIFJJTkdfUkVTRVRfUkVRX1JJTkdfVFlQRV9DTVBMCQkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBSSU5HX1JFU0VUX1JFUV9SSU5HX1RZUEVfVFgJCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFJJTkdfUkVTRVRfUkVRX1JJTkdfVFlQRV9SWAkJCSAgICgweDJVTCA8PCAwKQorCSNkZWZpbmUgUklOR19SRVNFVF9SRVFfUklOR19UWVBFX0NNUEwJCQkgICAweDBVTAorCSNkZWZpbmUgUklOR19SRVNFVF9SRVFfUklOR19UWVBFX1RYCQkJICAgMHgxVUwKKwkjZGVmaW5lIFJJTkdfUkVTRVRfUkVRX1JJTkdfVFlQRV9SWAkJCSAgIDB4MlVMCiAJdTggdW51c2VkXzA7CiAJX19sZTE2IHJpbmdfaWQ7CiAJX19sZTMyIHVudXNlZF8xOwpAQCAtMzA2OCwzNiArMzI3MCwzNiBAQAogCV9fbGUxNiB0X2wyX2l2bGFuOwogCV9fbGUxNiB0X2wyX2l2bGFuX21hc2s7CiAJdTggc3JjX3R5cGU7Ci0JI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9TUkNfVFlQRV9OUE9SVAkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9TUkNfVFlQRV9QRgkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9TUkNfVFlQRV9WRgkJICAgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9TUkNfVFlQRV9WTklDCQkgICAoMHgzVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1NSQ19UWVBFX0tPTkcJCSAgICgweDRVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfU1JDX1RZUEVfQVBFCQkgICAoMHg1VUwgPDwgMCkKLQkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1NSQ19UWVBFX0JPTk8JCSAgICgweDZVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfU1JDX1RZUEVfVEFORwkJICAgKDB4N1VMIDw8IDApCisJI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9TUkNfVFlQRV9OUE9SVAkJICAgMHgwVUwKKwkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1NSQ19UWVBFX1BGCQkgICAweDFVTAorCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfU1JDX1RZUEVfVkYJCSAgIDB4MlVMCisJI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9TUkNfVFlQRV9WTklDCQkgICAweDNVTAorCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfU1JDX1RZUEVfS09ORwkJICAgMHg0VUwKKwkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1NSQ19UWVBFX0FQRQkJICAgMHg1VUwKKwkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1NSQ19UWVBFX0JPTk8JCSAgIDB4NlVMCisJI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9TUkNfVFlQRV9UQU5HCQkgICAweDdVTAogCXU4IHVudXNlZF82OwogCV9fbGUzMiBzcmNfaWQ7CiAJdTggdHVubmVsX3R5cGU7Ci0JI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9OT05UVU5ORUwgICAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfVlhMQU4JICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9OVkdSRQkgICAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0wyR1JFCSAgICgweDNVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfSVBJUAkgICAoMHg0VUwgPDwgMCkKLQkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0dFTkVWRQkgICAoMHg1VUwgPDwgMCkKLQkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX01QTFMJICAgKDB4NlVMIDw8IDApCi0JI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9TVFQJICAgKDB4N1VMIDw8IDApCi0JI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9JUEdSRQkgICAoMHg4VUwgPDwgMCkKLQkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0FOWVRVTk5FTCAgICAgKDB4ZmZVTCA8PCAwKQorCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfTk9OVFVOTkVMICAgICAweDBVTAorCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfVlhMQU4JICAgMHgxVUwKKwkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX05WR1JFCSAgIDB4MlVMCisJI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9MMkdSRQkgICAweDNVTAorCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfSVBJUAkgICAweDRVTAorCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfR0VORVZFCSAgIDB4NVVMCisJI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9NUExTCSAgIDB4NlVMCisJI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9TVFQJICAgMHg3VUwKKwkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0lQR1JFCSAgIDB4OFVMCisJI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9BTllUVU5ORUwgICAgIDB4ZmZVTAogCXU4IHVudXNlZF83OwogCV9fbGUxNiBkc3RfaWQ7CiAJX19sZTE2IG1pcnJvcl92bmljX2lkOwogCXU4IHByaV9oaW50OwotCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfUFJJX0hJTlRfTk9fUFJFRkVSCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfUFJJX0hJTlRfQUJPVkVfRklMVEVSICAgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1BSSV9ISU5UX0JFTE9XX0ZJTFRFUiAgICAgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9QUklfSElOVF9NQVgJCSAgICgweDNVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfUFJJX0hJTlRfTUlOCQkgICAoMHg0VUwgPDwgMCkKKwkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1BSSV9ISU5UX05PX1BSRUZFUgkgICAweDBVTAorCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfUFJJX0hJTlRfQUJPVkVfRklMVEVSICAgICAweDFVTAorCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfUFJJX0hJTlRfQkVMT1dfRklMVEVSICAgICAweDJVTAorCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfUFJJX0hJTlRfTUFYCQkgICAweDNVTAorCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfUFJJX0hJTlRfTUlOCQkgICAweDRVTAogCXU4IHVudXNlZF84OwogCV9fbGUzMiB1bnVzZWRfOTsKIAlfX2xlNjQgbDJfZmlsdGVyX2lkX2hpbnQ7CkBAIC0zMjQ2LDE2ICszNDQ4LDE2IEBACiAJdTggbDNfYWRkcl90eXBlOwogCXU4IHRfbDNfYWRkcl90eXBlOwogCXU4IHR1bm5lbF90eXBlOwotCSNkZWZpbmUgQ0ZBX1RVTk5FTF9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX05PTlRVTk5FTCAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9UVU5ORUxfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9WWExBTiAgICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBDRkFfVFVOTkVMX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfTlZHUkUgICAgICgweDJVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX1RVTk5FTF9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0wyR1JFICAgICAoMHgzVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9UVU5ORUxfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9JUElQICAgICAgKDB4NFVMIDw8IDApCi0JI2RlZmluZSBDRkFfVFVOTkVMX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfR0VORVZFICAgICgweDVVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX1RVTk5FTF9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX01QTFMgICAgICAoMHg2VUwgPDwgMCkKLQkjZGVmaW5lIENGQV9UVU5ORUxfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9TVFQgICAgICAgKDB4N1VMIDw8IDApCi0JI2RlZmluZSBDRkFfVFVOTkVMX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfSVBHUkUgICAgICgweDhVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX1RVTk5FTF9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0FOWVRVTk5FTCAoMHhmZlVMIDw8IDApCisJI2RlZmluZSBDRkFfVFVOTkVMX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfTk9OVFVOTkVMIDB4MFVMCisJI2RlZmluZSBDRkFfVFVOTkVMX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfVlhMQU4gICAgIDB4MVVMCisJI2RlZmluZSBDRkFfVFVOTkVMX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfTlZHUkUgICAgIDB4MlVMCisJI2RlZmluZSBDRkFfVFVOTkVMX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfTDJHUkUgICAgIDB4M1VMCisJI2RlZmluZSBDRkFfVFVOTkVMX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfSVBJUCAgICAgIDB4NFVMCisJI2RlZmluZSBDRkFfVFVOTkVMX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfR0VORVZFICAgIDB4NVVMCisJI2RlZmluZSBDRkFfVFVOTkVMX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfTVBMUyAgICAgIDB4NlVMCisJI2RlZmluZSBDRkFfVFVOTkVMX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfU1RUICAgICAgIDB4N1VMCisJI2RlZmluZSBDRkFfVFVOTkVMX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfSVBHUkUgICAgIDB4OFVMCisJI2RlZmluZSBDRkFfVFVOTkVMX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfQU5ZVFVOTkVMIDB4ZmZVTAogCXU4IHVudXNlZF8wOwogCV9fbGUzMiB2bmk7CiAJX19sZTMyIGRzdF92bmljX2lkOwpAQCAtMzMxMSwxNCArMzUxMywxNCBAQAogCV9fbGUzMiBmbGFnczsKIAkjZGVmaW5lIENGQV9FTkNBUF9SRUNPUkRfQUxMT0NfUkVRX0ZMQUdTX0xPT1BCQUNLCSAgICAweDFVTAogCXU4IGVuY2FwX3R5cGU7Ci0JI2RlZmluZSBDRkFfRU5DQVBfUkVDT1JEX0FMTE9DX1JFUV9FTkNBUF9UWVBFX1ZYTEFOICAgICAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX0VOQ0FQX1JFQ09SRF9BTExPQ19SRVFfRU5DQVBfVFlQRV9OVkdSRSAgICAgICAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9FTkNBUF9SRUNPUkRfQUxMT0NfUkVRX0VOQ0FQX1RZUEVfTDJHUkUgICAgICAgKDB4M1VMIDw8IDApCi0JI2RlZmluZSBDRkFfRU5DQVBfUkVDT1JEX0FMTE9DX1JFUV9FTkNBUF9UWVBFX0lQSVAJICAgKDB4NFVMIDw8IDApCi0JI2RlZmluZSBDRkFfRU5DQVBfUkVDT1JEX0FMTE9DX1JFUV9FTkNBUF9UWVBFX0dFTkVWRSAgICAgICgweDVVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX0VOQ0FQX1JFQ09SRF9BTExPQ19SRVFfRU5DQVBfVFlQRV9NUExTCSAgICgweDZVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX0VOQ0FQX1JFQ09SRF9BTExPQ19SRVFfRU5DQVBfVFlQRV9WTEFOCSAgICgweDdVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX0VOQ0FQX1JFQ09SRF9BTExPQ19SRVFfRU5DQVBfVFlQRV9JUEdSRSAgICAgICAoMHg4VUwgPDwgMCkKKwkjZGVmaW5lIENGQV9FTkNBUF9SRUNPUkRfQUxMT0NfUkVRX0VOQ0FQX1RZUEVfVlhMQU4gICAgICAgMHgxVUwKKwkjZGVmaW5lIENGQV9FTkNBUF9SRUNPUkRfQUxMT0NfUkVRX0VOQ0FQX1RZUEVfTlZHUkUgICAgICAgMHgyVUwKKwkjZGVmaW5lIENGQV9FTkNBUF9SRUNPUkRfQUxMT0NfUkVRX0VOQ0FQX1RZUEVfTDJHUkUgICAgICAgMHgzVUwKKwkjZGVmaW5lIENGQV9FTkNBUF9SRUNPUkRfQUxMT0NfUkVRX0VOQ0FQX1RZUEVfSVBJUAkgICAweDRVTAorCSNkZWZpbmUgQ0ZBX0VOQ0FQX1JFQ09SRF9BTExPQ19SRVFfRU5DQVBfVFlQRV9HRU5FVkUgICAgICAweDVVTAorCSNkZWZpbmUgQ0ZBX0VOQ0FQX1JFQ09SRF9BTExPQ19SRVFfRU5DQVBfVFlQRV9NUExTCSAgIDB4NlVMCisJI2RlZmluZSBDRkFfRU5DQVBfUkVDT1JEX0FMTE9DX1JFUV9FTkNBUF9UWVBFX1ZMQU4JICAgMHg3VUwKKwkjZGVmaW5lIENGQV9FTkNBUF9SRUNPUkRfQUxMT0NfUkVRX0VOQ0FQX1RZUEVfSVBHUkUgICAgICAgMHg4VUwKIAl1OCB1bnVzZWRfMDsKIAlfX2xlMTYgdW51c2VkXzE7CiAJX19sZTMyIGVuY2FwX2RhdGFbMTZdOwpAQCAtMzM5NywzMiArMzU5OSwzMiBAQAogCXU4IHNyY19tYWNhZGRyWzZdOwogCV9fYmUxNiBldGhlcnR5cGU7CiAJdTggaXBfYWRkcl90eXBlOwotCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX0lQX0FERFJfVFlQRV9VTktOT1dOICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9JUF9BRERSX1RZUEVfSVBWNCAgICAgKDB4NFVMIDw8IDApCi0JI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfSVBfQUREUl9UWVBFX0lQVjYgICAgICgweDZVTCA8PCAwKQorCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX0lQX0FERFJfVFlQRV9VTktOT1dOICAweDBVTAorCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX0lQX0FERFJfVFlQRV9JUFY0ICAgICAweDRVTAorCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX0lQX0FERFJfVFlQRV9JUFY2ICAgICAweDZVTAogCXU4IGlwX3Byb3RvY29sOwotCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX0lQX1BST1RPQ09MX1VOS05PV04gICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9JUF9QUk9UT0NPTF9VRFAgICAgICAgKDB4NlVMIDw8IDApCi0JI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfSVBfUFJPVE9DT0xfVENQICAgICAgICgweDExVUwgPDwgMCkKKwkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9JUF9QUk9UT0NPTF9VTktOT1dOICAgMHgwVUwKKwkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9JUF9QUk9UT0NPTF9VRFAgICAgICAgMHg2VUwKKwkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9JUF9QUk9UT0NPTF9UQ1AgICAgICAgMHgxMVVMCiAJX19sZTE2IGRzdF9pZDsKIAlfX2xlMTYgbWlycm9yX3ZuaWNfaWQ7CiAJdTggdHVubmVsX3R5cGU7Ci0JI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfTk9OVFVOTkVMICgweDBVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX1ZYTEFOICAgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9OVkdSRSAgICAgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfTDJHUkUgICAgICgweDNVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0lQSVAgICAgICAoMHg0VUwgPDwgMCkKLQkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9HRU5FVkUgICAgKDB4NVVMIDw8IDApCi0JI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfTVBMUyAgICAgICgweDZVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX1NUVCAgICAgICAoMHg3VUwgPDwgMCkKLQkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9JUEdSRSAgICAgKDB4OFVMIDw8IDApCi0JI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfQU5ZVFVOTkVMICgweGZmVUwgPDwgMCkKKwkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9OT05UVU5ORUwgMHgwVUwKKwkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9WWExBTiAgICAgMHgxVUwKKwkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9OVkdSRSAgICAgMHgyVUwKKwkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9MMkdSRSAgICAgMHgzVUwKKwkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9JUElQICAgICAgMHg0VUwKKwkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9HRU5FVkUgICAgMHg1VUwKKwkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9NUExTICAgICAgMHg2VUwKKwkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9TVFQgICAgICAgMHg3VUwKKwkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9JUEdSRSAgICAgMHg4VUwKKwkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9BTllUVU5ORUwgMHhmZlVMCiAJdTggcHJpX2hpbnQ7Ci0JI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfUFJJX0hJTlRfTk9fUFJFRkVSICAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1BSSV9ISU5UX0FCT1ZFCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1BSSV9ISU5UX0JFTE9XCSAgICgweDJVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1BSSV9ISU5UX0hJR0hFU1QgICAgICAoMHgzVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9QUklfSElOVF9MT1dFU1QgICAgICAgKDB4NFVMIDw8IDApCisJI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfUFJJX0hJTlRfTk9fUFJFRkVSICAgIDB4MFVMCisJI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfUFJJX0hJTlRfQUJPVkUJICAgMHgxVUwKKwkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9QUklfSElOVF9CRUxPVwkgICAweDJVTAorCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1BSSV9ISU5UX0hJR0hFU1QgICAgICAweDNVTAorCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1BSSV9ISU5UX0xPV0VTVCAgICAgICAweDRVTAogCV9fYmUzMiBzcmNfaXBhZGRyWzRdOwogCV9fYmUzMiBzcmNfaXBhZGRyX21hc2tbNF07CiAJX19iZTMyIGRzdF9pcGFkZHJbNF07CkBAIC0zNTExLDggKzM3MTMsOCBAQAogCV9fbGUxNiB0YXJnZXRfaWQ7CiAJX19sZTY0IHJlc3BfYWRkcjsKIAl1OCB0dW5uZWxfdHlwZTsKLQkjZGVmaW5lIFRVTk5FTF9EU1RfUE9SVF9RVUVSWV9SRVFfVFVOTkVMX1RZUEVfVlhMQU4gICAgICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBUVU5ORUxfRFNUX1BPUlRfUVVFUllfUkVRX1RVTk5FTF9UWVBFX0dFTkVWRSAgICAgICgweDVVTCA8PCAwKQorCSNkZWZpbmUgVFVOTkVMX0RTVF9QT1JUX1FVRVJZX1JFUV9UVU5ORUxfVFlQRV9WWExBTiAgICAgICAweDFVTAorCSNkZWZpbmUgVFVOTkVMX0RTVF9QT1JUX1FVRVJZX1JFUV9UVU5ORUxfVFlQRV9HRU5FVkUgICAgICAweDVVTAogCXU4IHVudXNlZF8wWzddOwogfTsKIApAQCAtMzUzOSw4ICszNzQxLDggQEAKIAlfX2xlMTYgdGFyZ2V0X2lkOwogCV9fbGU2NCByZXNwX2FkZHI7CiAJdTggdHVubmVsX3R5cGU7Ci0JI2RlZmluZSBUVU5ORUxfRFNUX1BPUlRfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX1ZYTEFOICAgICAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgVFVOTkVMX0RTVF9QT1JUX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9HRU5FVkUgICAgICAoMHg1VUwgPDwgMCkKKwkjZGVmaW5lIFRVTk5FTF9EU1RfUE9SVF9BTExPQ19SRVFfVFVOTkVMX1RZUEVfVlhMQU4gICAgICAgMHgxVUwKKwkjZGVmaW5lIFRVTk5FTF9EU1RfUE9SVF9BTExPQ19SRVFfVFVOTkVMX1RZUEVfR0VORVZFICAgICAgMHg1VUwKIAl1OCB1bnVzZWRfMDsKIAlfX2JlMTYgdHVubmVsX2RzdF9wb3J0X3ZhbDsKIAlfX2xlMzIgdW51c2VkXzE7CkBAIC0zNTcwLDggKzM3NzIsOCBAQAogCV9fbGUxNiB0YXJnZXRfaWQ7CiAJX19sZTY0IHJlc3BfYWRkcjsKIAl1OCB0dW5uZWxfdHlwZTsKLQkjZGVmaW5lIFRVTk5FTF9EU1RfUE9SVF9GUkVFX1JFUV9UVU5ORUxfVFlQRV9WWExBTgkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFRVTk5FTF9EU1RfUE9SVF9GUkVFX1JFUV9UVU5ORUxfVFlQRV9HRU5FVkUgICAgICAgKDB4NVVMIDw8IDApCisJI2RlZmluZSBUVU5ORUxfRFNUX1BPUlRfRlJFRV9SRVFfVFVOTkVMX1RZUEVfVlhMQU4JICAgMHgxVUwKKwkjZGVmaW5lIFRVTk5FTF9EU1RfUE9SVF9GUkVFX1JFUV9UVU5ORUxfVFlQRV9HRU5FVkUgICAgICAgMHg1VUwKIAl1OCB1bnVzZWRfMDsKIAlfX2xlMTYgdHVubmVsX2RzdF9wb3J0X2lkOwogCV9fbGUzMiB1bnVzZWRfMTsKQEAgLTM3MjAsMTUgKzM5MjIsMTUgQEAKIAlfX2xlMTYgdGFyZ2V0X2lkOwogCV9fbGU2NCByZXNwX2FkZHI7CiAJdTggZW1iZWRkZWRfcHJvY190eXBlOwotCSNkZWZpbmUgRldfUkVTRVRfUkVRX0VNQkVEREVEX1BST0NfVFlQRV9CT09UCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIEZXX1JFU0VUX1JFUV9FTUJFRERFRF9QUk9DX1RZUEVfTUdNVAkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBGV19SRVNFVF9SRVFfRU1CRURERURfUFJPQ19UWVBFX05FVENUUkwJICAgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBGV19SRVNFVF9SRVFfRU1CRURERURfUFJPQ19UWVBFX1JPQ0UJCSAgICgweDNVTCA8PCAwKQotCSNkZWZpbmUgRldfUkVTRVRfUkVRX0VNQkVEREVEX1BST0NfVFlQRV9SU1ZECQkgICAoMHg0VUwgPDwgMCkKKwkjZGVmaW5lIEZXX1JFU0VUX1JFUV9FTUJFRERFRF9QUk9DX1RZUEVfQk9PVAkJICAgMHgwVUwKKwkjZGVmaW5lIEZXX1JFU0VUX1JFUV9FTUJFRERFRF9QUk9DX1RZUEVfTUdNVAkJICAgMHgxVUwKKwkjZGVmaW5lIEZXX1JFU0VUX1JFUV9FTUJFRERFRF9QUk9DX1RZUEVfTkVUQ1RSTAkgICAweDJVTAorCSNkZWZpbmUgRldfUkVTRVRfUkVRX0VNQkVEREVEX1BST0NfVFlQRV9ST0NFCQkgICAweDNVTAorCSNkZWZpbmUgRldfUkVTRVRfUkVRX0VNQkVEREVEX1BST0NfVFlQRV9SU1ZECQkgICAweDRVTAogCXU4IHNlbGZyc3Rfc3RhdHVzOwotCSNkZWZpbmUgRldfUkVTRVRfUkVRX1NFTEZSU1RfU1RBVFVTX1NFTEZSU1ROT05FCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgRldfUkVTRVRfUkVRX1NFTEZSU1RfU1RBVFVTX1NFTEZSU1RBU0FQCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgRldfUkVTRVRfUkVRX1NFTEZSU1RfU1RBVFVTX1NFTEZSU1RQQ0lFUlNUCSAgICgweDJVTCA8PCAwKQorCSNkZWZpbmUgRldfUkVTRVRfUkVRX1NFTEZSU1RfU1RBVFVTX1NFTEZSU1ROT05FCSAgIDB4MFVMCisJI2RlZmluZSBGV19SRVNFVF9SRVFfU0VMRlJTVF9TVEFUVVNfU0VMRlJTVEFTQVAJICAgMHgxVUwKKwkjZGVmaW5lIEZXX1JFU0VUX1JFUV9TRUxGUlNUX1NUQVRVU19TRUxGUlNUUENJRVJTVAkgICAweDJVTAogCV9fbGUxNiB1bnVzZWRfMFszXTsKIH07CiAKQEAgLTM3MzksOSArMzk0MSw5IEBACiAJX19sZTE2IHNlcV9pZDsKIAlfX2xlMTYgcmVzcF9sZW47CiAJdTggc2VsZnJzdF9zdGF0dXM7Ci0JI2RlZmluZSBGV19SRVNFVF9SRVNQX1NFTEZSU1RfU1RBVFVTX1NFTEZSU1ROT05FCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgRldfUkVTRVRfUkVTUF9TRUxGUlNUX1NUQVRVU19TRUxGUlNUQVNBUAkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIEZXX1JFU0VUX1JFU1BfU0VMRlJTVF9TVEFUVVNfU0VMRlJTVFBDSUVSU1QgICAgICAgKDB4MlVMIDw8IDApCisJI2RlZmluZSBGV19SRVNFVF9SRVNQX1NFTEZSU1RfU1RBVFVTX1NFTEZSU1ROT05FCSAgIDB4MFVMCisJI2RlZmluZSBGV19SRVNFVF9SRVNQX1NFTEZSU1RfU1RBVFVTX1NFTEZSU1RBU0FQCSAgIDB4MVVMCisJI2RlZmluZSBGV19SRVNFVF9SRVNQX1NFTEZSU1RfU1RBVFVTX1NFTEZSU1RQQ0lFUlNUICAgICAgIDB4MlVMCiAJdTggdW51c2VkXzA7CiAJX19sZTE2IHVudXNlZF8xOwogCXU4IHVudXNlZF8yOwpAQCAtMzc1OSwxMSArMzk2MSwxMSBAQAogCV9fbGUxNiB0YXJnZXRfaWQ7CiAJX19sZTY0IHJlc3BfYWRkcjsKIAl1OCBlbWJlZGRlZF9wcm9jX3R5cGU7Ci0JI2RlZmluZSBGV19RU1RBVFVTX1JFUV9FTUJFRERFRF9QUk9DX1RZUEVfQk9PVAkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBGV19RU1RBVFVTX1JFUV9FTUJFRERFRF9QUk9DX1RZUEVfTUdNVAkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBGV19RU1RBVFVTX1JFUV9FTUJFRERFRF9QUk9DX1RZUEVfTkVUQ1RSTAkgICAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIEZXX1FTVEFUVVNfUkVRX0VNQkVEREVEX1BST0NfVFlQRV9ST0NFCQkgICAoMHgzVUwgPDwgMCkKLQkjZGVmaW5lIEZXX1FTVEFUVVNfUkVRX0VNQkVEREVEX1BST0NfVFlQRV9SU1ZECQkgICAoMHg0VUwgPDwgMCkKKwkjZGVmaW5lIEZXX1FTVEFUVVNfUkVRX0VNQkVEREVEX1BST0NfVFlQRV9CT09UCQkgICAweDBVTAorCSNkZWZpbmUgRldfUVNUQVRVU19SRVFfRU1CRURERURfUFJPQ19UWVBFX01HTVQJCSAgIDB4MVVMCisJI2RlZmluZSBGV19RU1RBVFVTX1JFUV9FTUJFRERFRF9QUk9DX1RZUEVfTkVUQ1RSTAkgICAweDJVTAorCSNkZWZpbmUgRldfUVNUQVRVU19SRVFfRU1CRURERURfUFJPQ19UWVBFX1JPQ0UJCSAgIDB4M1VMCisJI2RlZmluZSBGV19RU1RBVFVTX1JFUV9FTUJFRERFRF9QUk9DX1RZUEVfUlNWRAkJICAgMHg0VUwKIAl1OCB1bnVzZWRfMFs3XTsKIH07CiAKQEAgLTM3NzQsOSArMzk3Niw5IEBACiAJX19sZTE2IHNlcV9pZDsKIAlfX2xlMTYgcmVzcF9sZW47CiAJdTggc2VsZnJzdF9zdGF0dXM7Ci0JI2RlZmluZSBGV19RU1RBVFVTX1JFU1BfU0VMRlJTVF9TVEFUVVNfU0VMRlJTVE5PTkUJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBGV19RU1RBVFVTX1JFU1BfU0VMRlJTVF9TVEFUVVNfU0VMRlJTVEFTQVAJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBGV19RU1RBVFVTX1JFU1BfU0VMRlJTVF9TVEFUVVNfU0VMRlJTVFBDSUVSU1QgICAgICgweDJVTCA8PCAwKQorCSNkZWZpbmUgRldfUVNUQVRVU19SRVNQX1NFTEZSU1RfU1RBVFVTX1NFTEZSU1ROT05FCSAgIDB4MFVMCisJI2RlZmluZSBGV19RU1RBVFVTX1JFU1BfU0VMRlJTVF9TVEFUVVNfU0VMRlJTVEFTQVAJICAgMHgxVUwKKwkjZGVmaW5lIEZXX1FTVEFUVVNfUkVTUF9TRUxGUlNUX1NUQVRVU19TRUxGUlNUUENJRVJTVCAgICAgMHgyVUwKIAl1OCB1bnVzZWRfMDsKIAlfX2xlMTYgdW51c2VkXzE7CiAJdTggdW51c2VkXzI7CkBAIC0zNzg1LDYgKzM5ODcsNDIgQEAKIAl1OCB2YWxpZDsKIH07CiAKKy8qIGh3cm1fZndfc2V0X3RpbWUgKi8KKy8qIElucHV0ICgzMiBieXRlcykgKi8KK3N0cnVjdCBod3JtX2Z3X3NldF90aW1lX2lucHV0IHsKKwlfX2xlMTYgcmVxX3R5cGU7CisJX19sZTE2IGNtcGxfcmluZzsKKwlfX2xlMTYgc2VxX2lkOworCV9fbGUxNiB0YXJnZXRfaWQ7CisJX19sZTY0IHJlc3BfYWRkcjsKKwlfX2xlMTYgeWVhcjsKKwkjZGVmaW5lIEZXX1NFVF9USU1FX1JFUV9ZRUFSX1VOS05PV04JCQkgICAweDBVTAorCXU4IG1vbnRoOworCXU4IGRheTsKKwl1OCBob3VyOworCXU4IG1pbnV0ZTsKKwl1OCBzZWNvbmQ7CisJdTggdW51c2VkXzA7CisJX19sZTE2IG1pbGxpc2Vjb25kOworCV9fbGUxNiB6b25lOworCSNkZWZpbmUgRldfU0VUX1RJTUVfUkVRX1pPTkVfVVRDCQkJICAgMHgwVUwKKwkjZGVmaW5lIEZXX1NFVF9USU1FX1JFUV9aT05FX1VOS05PV04JCQkgICAweGZmZmZVTAorCV9fbGUzMiB1bnVzZWRfMTsKK307CisKKy8qIE91dHB1dCAoMTYgYnl0ZXMpICovCitzdHJ1Y3QgaHdybV9md19zZXRfdGltZV9vdXRwdXQgeworCV9fbGUxNiBlcnJvcl9jb2RlOworCV9fbGUxNiByZXFfdHlwZTsKKwlfX2xlMTYgc2VxX2lkOworCV9fbGUxNiByZXNwX2xlbjsKKwlfX2xlMzIgdW51c2VkXzA7CisJdTggdW51c2VkXzE7CisJdTggdW51c2VkXzI7CisJdTggdW51c2VkXzM7CisJdTggdmFsaWQ7Cit9OworCiAvKiBod3JtX2V4ZWNfZndkX3Jlc3AgKi8KIC8qIElucHV0ICgxMjggYnl0ZXMpICovCiBzdHJ1Y3QgaHdybV9leGVjX2Z3ZF9yZXNwX2lucHV0IHsKQEAgLTM5MjEsMzIgKzQxNTksNiBAQAogCXU4IHZhbGlkOwogfTsKIAotLyogaHdybV9udm1fcmF3X3dyaXRlX2JsayAqLwotLyogSW5wdXQgKDMyIGJ5dGVzKSAqLwotc3RydWN0IGh3cm1fbnZtX3Jhd193cml0ZV9ibGtfaW5wdXQgewotCV9fbGUxNiByZXFfdHlwZTsKLQlfX2xlMTYgY21wbF9yaW5nOwotCV9fbGUxNiBzZXFfaWQ7Ci0JX19sZTE2IHRhcmdldF9pZDsKLQlfX2xlNjQgcmVzcF9hZGRyOwotCV9fbGU2NCBob3N0X3NyY19hZGRyOwotCV9fbGUzMiBkZXN0X2FkZHI7Ci0JX19sZTMyIGxlbjsKLX07Ci0KLS8qIE91dHB1dCAoMTYgYnl0ZXMpICovCi1zdHJ1Y3QgaHdybV9udm1fcmF3X3dyaXRlX2Jsa19vdXRwdXQgewotCV9fbGUxNiBlcnJvcl9jb2RlOwotCV9fbGUxNiByZXFfdHlwZTsKLQlfX2xlMTYgc2VxX2lkOwotCV9fbGUxNiByZXNwX2xlbjsKLQlfX2xlMzIgdW51c2VkXzA7Ci0JdTggdW51c2VkXzE7Ci0JdTggdW51c2VkXzI7Ci0JdTggdW51c2VkXzM7Ci0JdTggdmFsaWQ7Ci19OwotCiAvKiBod3JtX252bV9yZWFkICovCiAvKiBJbnB1dCAoNDAgYnl0ZXMpICovCiBzdHJ1Y3QgaHdybV9udm1fcmVhZF9pbnB1dCB7CkBAIC00MTMyLDkgKzQzNDQsOSBAQAogCXU4IG9wdF9vcmRpbmFsOwogCSNkZWZpbmUgTlZNX0ZJTkRfRElSX0VOVFJZX1JFUV9PUFRfT1JESU5BTF9NQVNLCSAgICAweDNVTAogCSNkZWZpbmUgTlZNX0ZJTkRfRElSX0VOVFJZX1JFUV9PUFRfT1JESU5BTF9TRlQJCSAgICAwCi0JI2RlZmluZSBOVk1fRklORF9ESVJfRU5UUllfUkVRX09QVF9PUkRJTkFMX0VRCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIE5WTV9GSU5EX0RJUl9FTlRSWV9SRVFfT1BUX09SRElOQUxfR0UJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgTlZNX0ZJTkRfRElSX0VOVFJZX1JFUV9PUFRfT1JESU5BTF9HVAkJICAgKDB4MlVMIDw8IDApCisJI2RlZmluZSBOVk1fRklORF9ESVJfRU5UUllfUkVRX09QVF9PUkRJTkFMX0VRCQkgICAweDBVTAorCSNkZWZpbmUgTlZNX0ZJTkRfRElSX0VOVFJZX1JFUV9PUFRfT1JESU5BTF9HRQkJICAgMHgxVUwKKwkjZGVmaW5lIE5WTV9GSU5EX0RJUl9FTlRSWV9SRVFfT1BUX09SRElOQUxfR1QJCSAgIDB4MlVMCiAJdTggdW51c2VkXzFbM107CiB9OwogCkBAIC00MjY2LDQgKzQ0NzgsNDEgQEAKIAl1OCB2YWxpZDsKIH07CiAKKy8qIGh3cm1fbnZtX2luc3RhbGxfdXBkYXRlICovCisvKiBJbnB1dCAoMjQgYnl0ZXMpICovCitzdHJ1Y3QgaHdybV9udm1faW5zdGFsbF91cGRhdGVfaW5wdXQgeworCV9fbGUxNiByZXFfdHlwZTsKKwlfX2xlMTYgY21wbF9yaW5nOworCV9fbGUxNiBzZXFfaWQ7CisJX19sZTE2IHRhcmdldF9pZDsKKwlfX2xlNjQgcmVzcF9hZGRyOworCV9fbGUzMiBpbnN0YWxsX3R5cGU7CisJI2RlZmluZSBOVk1fSU5TVEFMTF9VUERBVEVfUkVRX0lOU1RBTExfVFlQRV9OT1JNQUwJICAgMHgwVUwKKwkjZGVmaW5lIE5WTV9JTlNUQUxMX1VQREFURV9SRVFfSU5TVEFMTF9UWVBFX0FMTAkgICAweGZmZmZmZmZmVUwKKwlfX2xlMzIgdW51c2VkXzA7Cit9OworCisvKiBPdXRwdXQgKDI0IGJ5dGVzKSAqLworc3RydWN0IGh3cm1fbnZtX2luc3RhbGxfdXBkYXRlX291dHB1dCB7CisJX19sZTE2IGVycm9yX2NvZGU7CisJX19sZTE2IHJlcV90eXBlOworCV9fbGUxNiBzZXFfaWQ7CisJX19sZTE2IHJlc3BfbGVuOworCV9fbGU2NCBpbnN0YWxsZWRfaXRlbXM7CisJdTggcmVzdWx0OworCSNkZWZpbmUgTlZNX0lOU1RBTExfVVBEQVRFX1JFU1BfUkVTVUxUX1NVQ0NFU1MJCSAgIDB4MFVMCisJdTggcHJvYmxlbV9pdGVtOworCSNkZWZpbmUgTlZNX0lOU1RBTExfVVBEQVRFX1JFU1BfUFJPQkxFTV9JVEVNX05PTkUJICAgMHgwVUwKKwkjZGVmaW5lIE5WTV9JTlNUQUxMX1VQREFURV9SRVNQX1BST0JMRU1fSVRFTV9QQUNLQUdFICAgICAgMHhmZlVMCisJdTggcmVzZXRfcmVxdWlyZWQ7CisJI2RlZmluZSBOVk1fSU5TVEFMTF9VUERBVEVfUkVTUF9SRVNFVF9SRVFVSVJFRF9OT05FICAgICAgIDB4MFVMCisJI2RlZmluZSBOVk1fSU5TVEFMTF9VUERBVEVfUkVTUF9SRVNFVF9SRVFVSVJFRF9QQ0kJICAgMHgxVUwKKwkjZGVmaW5lIE5WTV9JTlNUQUxMX1VQREFURV9SRVNQX1JFU0VUX1JFUVVJUkVEX1BPV0VSICAgICAgMHgyVUwKKwl1OCB1bnVzZWRfMDsKKwl1OCB1bnVzZWRfMTsKKwl1OCB1bnVzZWRfMjsKKwl1OCB1bnVzZWRfMzsKKwl1OCB2YWxpZDsKK307CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X3NyaW92LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfc3Jpb3YuYwppbmRleCA1MGQyMDA3Li5lYzZjZDE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfc3Jpb3YuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfc3Jpb3YuYwpAQCAtMTksNiArMTksNDUgQEAKICNpbmNsdWRlICJibnh0X2V0aHRvb2wuaCIKIAogI2lmZGVmIENPTkZJR19CTlhUX1NSSU9WCitzdGF0aWMgaW50IGJueHRfaHdybV9md2RfYXN5bmNfZXZlbnRfY21wbChzdHJ1Y3QgYm54dCAqYnAsCisJCQkJCSAgc3RydWN0IGJueHRfdmZfaW5mbyAqdmYsIHUxNiBldmVudF9pZCkKK3sKKwlzdHJ1Y3QgaHdybV9md2RfYXN5bmNfZXZlbnRfY21wbF9vdXRwdXQgKnJlc3AgPSBicC0+aHdybV9jbWRfcmVzcF9hZGRyOworCXN0cnVjdCBod3JtX2Z3ZF9hc3luY19ldmVudF9jbXBsX2lucHV0IHJlcSA9IHswfTsKKwlzdHJ1Y3QgaHdybV9hc3luY19ldmVudF9jbXBsICphc3luY19jbXBsOworCWludCByYyA9IDA7CisKKwlibnh0X2h3cm1fY21kX2hkcl9pbml0KGJwLCAmcmVxLCBIV1JNX0ZXRF9BU1lOQ19FVkVOVF9DTVBMLCAtMSwgLTEpOworCWlmICh2ZikKKwkJcmVxLmVuY2FwX2FzeW5jX2V2ZW50X3RhcmdldF9pZCA9IGNwdV90b19sZTE2KHZmLT5md19maWQpOworCWVsc2UKKwkJLyogYnJvYWRjYXN0IHRoaXMgYXN5bmMgZXZlbnQgdG8gYWxsIFZGcyAqLworCQlyZXEuZW5jYXBfYXN5bmNfZXZlbnRfdGFyZ2V0X2lkID0gY3B1X3RvX2xlMTYoMHhmZmZmKTsKKwlhc3luY19jbXBsID0gKHN0cnVjdCBod3JtX2FzeW5jX2V2ZW50X2NtcGwgKilyZXEuZW5jYXBfYXN5bmNfZXZlbnRfY21wbDsKKwlhc3luY19jbXBsLT50eXBlID0KKwkJY3B1X3RvX2xlMTYoSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCk7CisJYXN5bmNfY21wbC0+ZXZlbnRfaWQgPSBjcHVfdG9fbGUxNihldmVudF9pZCk7CisKKwltdXRleF9sb2NrKCZicC0+aHdybV9jbWRfbG9jayk7CisJcmMgPSBfaHdybV9zZW5kX21lc3NhZ2UoYnAsICZyZXEsIHNpemVvZihyZXEpLCBIV1JNX0NNRF9USU1FT1VUKTsKKworCWlmIChyYykgeworCQluZXRkZXZfZXJyKGJwLT5kZXYsICJod3JtX2Z3ZF9hc3luY19ldmVudF9jbXBsIGZhaWxlZC4gcmM6JWRcbiIsCisJCQkgICByYyk7CisJCWdvdG8gZndkX2FzeW5jX2V2ZW50X2NtcGxfZXhpdDsKKwl9CisKKwlpZiAocmVzcC0+ZXJyb3JfY29kZSkgeworCQluZXRkZXZfZXJyKGJwLT5kZXYsICJod3JtX2Z3ZF9hc3luY19ldmVudF9jbXBsIGVycm9yICVkXG4iLAorCQkJICAgcmVzcC0+ZXJyb3JfY29kZSk7CisJCXJjID0gLTE7CisJfQorCitmd2RfYXN5bmNfZXZlbnRfY21wbF9leGl0OgorCW11dGV4X3VubG9jaygmYnAtPmh3cm1fY21kX2xvY2spOworCXJldHVybiByYzsKK30KKwogc3RhdGljIGludCBibnh0X3ZmX25kb19wcmVwKHN0cnVjdCBibnh0ICpicCwgaW50IHZmX2lkKQogewogCWlmICghdGVzdF9iaXQoQk5YVF9TVEFURV9PUEVOLCAmYnAtPnN0YXRlKSkgewpAQCAtMTM1LDcgKzE3NCw4IEBACiAJcmV0dXJuIGh3cm1fc2VuZF9tZXNzYWdlKGJwLCAmcmVxLCBzaXplb2YocmVxKSwgSFdSTV9DTURfVElNRU9VVCk7CiB9CiAKLWludCBibnh0X3NldF92Zl92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB2Zl9pZCwgdTE2IHZsYW5faWQsIHU4IHFvcykKK2ludCBibnh0X3NldF92Zl92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB2Zl9pZCwgdTE2IHZsYW5faWQsIHU4IHFvcywKKwkJICAgICBfX2JlMTYgdmxhbl9wcm90bykKIHsKIAlzdHJ1Y3QgaHdybV9mdW5jX2NmZ19pbnB1dCByZXEgPSB7MH07CiAJc3RydWN0IGJueHQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTE0Niw2ICsxODYsOSBAQAogCWlmIChicC0+aHdybV9zcGVjX2NvZGUgPCAweDEwMjAxKQogCQlyZXR1cm4gLUVOT1RTVVBQOwogCisJaWYgKHZsYW5fcHJvdG8gIT0gaHRvbnMoRVRIX1BfODAyMVEpKQorCQlyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKKwogCXJjID0gYm54dF92Zl9uZG9fcHJlcChicCwgdmZfaWQpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwpAQCAtMjQzLDggKzI4Niw5IEBACiAJCXJjID0gLUVJTlZBTDsKIAkJYnJlYWs7CiAJfQotCS8qIENISU1QIFRPRE86IHNlbmQgbXNnIHRvIFZGIHRvIHVwZGF0ZSBuZXcgbGluayBzdGF0ZSAqLwotCisJaWYgKHZmLT5mbGFncyAmIChCTlhUX1ZGX0xJTktfVVAgfCBCTlhUX1ZGX0xJTktfRk9SQ0VEKSkKKwkJcmMgPSBibnh0X2h3cm1fZndkX2FzeW5jX2V2ZW50X2NtcGwoYnAsIHZmLAorCQkJSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX0xJTktfU1RBVFVTX0NIQU5HRSk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC01MjUsNDYgKzU2OSw2IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IGJueHRfaHdybV9md2RfYXN5bmNfZXZlbnRfY21wbChzdHJ1Y3QgYm54dCAqYnAsCi0JCQkJCSAgc3RydWN0IGJueHRfdmZfaW5mbyAqdmYsCi0JCQkJCSAgdTE2IGV2ZW50X2lkKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGh3cm1fZndkX2FzeW5jX2V2ZW50X2NtcGxfaW5wdXQgcmVxID0gezB9OwotCXN0cnVjdCBod3JtX2Z3ZF9hc3luY19ldmVudF9jbXBsX291dHB1dCAqcmVzcCA9IGJwLT5od3JtX2NtZF9yZXNwX2FkZHI7Ci0Jc3RydWN0IGh3cm1fYXN5bmNfZXZlbnRfY21wbCAqYXN5bmNfY21wbDsKLQotCWJueHRfaHdybV9jbWRfaGRyX2luaXQoYnAsICZyZXEsIEhXUk1fRldEX0FTWU5DX0VWRU5UX0NNUEwsIC0xLCAtMSk7Ci0JaWYgKHZmKQotCQlyZXEuZW5jYXBfYXN5bmNfZXZlbnRfdGFyZ2V0X2lkID0gY3B1X3RvX2xlMTYodmYtPmZ3X2ZpZCk7Ci0JZWxzZQotCQkvKiBicm9hZGNhc3QgdGhpcyBhc3luYyBldmVudCB0byBhbGwgVkZzICovCi0JCXJlcS5lbmNhcF9hc3luY19ldmVudF90YXJnZXRfaWQgPSBjcHVfdG9fbGUxNigweGZmZmYpOwotCWFzeW5jX2NtcGwgPSAoc3RydWN0IGh3cm1fYXN5bmNfZXZlbnRfY21wbCAqKXJlcS5lbmNhcF9hc3luY19ldmVudF9jbXBsOwotCWFzeW5jX2NtcGwtPnR5cGUgPQotCQljcHVfdG9fbGUxNihIV1JNX0FTWU5DX0VWRU5UX0NNUExfVFlQRV9IV1JNX0FTWU5DX0VWRU5UKTsKLQlhc3luY19jbXBsLT5ldmVudF9pZCA9IGNwdV90b19sZTE2KGV2ZW50X2lkKTsKLQotCW11dGV4X2xvY2soJmJwLT5od3JtX2NtZF9sb2NrKTsKLQlyYyA9IF9od3JtX3NlbmRfbWVzc2FnZShicCwgJnJlcSwgc2l6ZW9mKHJlcSksIEhXUk1fQ01EX1RJTUVPVVQpOwotCi0JaWYgKHJjKSB7Ci0JCW5ldGRldl9lcnIoYnAtPmRldiwgImh3cm1fZndkX2FzeW5jX2V2ZW50X2NtcGwgZmFpbGVkLiByYzolZFxuIiwKLQkJCSAgIHJjKTsKLQkJZ290byBmd2RfYXN5bmNfZXZlbnRfY21wbF9leGl0OwotCX0KLQotCWlmIChyZXNwLT5lcnJvcl9jb2RlKSB7Ci0JCW5ldGRldl9lcnIoYnAtPmRldiwgImh3cm1fZndkX2FzeW5jX2V2ZW50X2NtcGwgZXJyb3IgJWRcbiIsCi0JCQkgICByZXNwLT5lcnJvcl9jb2RlKTsKLQkJcmMgPSAtMTsKLQl9Ci0KLWZ3ZF9hc3luY19ldmVudF9jbXBsX2V4aXQ6Ci0JbXV0ZXhfdW5sb2NrKCZicC0+aHdybV9jbWRfbG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCiB2b2lkIGJueHRfc3Jpb3ZfZGlzYWJsZShzdHJ1Y3QgYm54dCAqYnApCiB7CiAJdTE2IG51bV92ZnMgPSBwY2lfbnVtX3ZmKGJwLT5wZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9zcmlvdi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X3NyaW92LmgKaW5kZXggMDM5MjY3MC4uMWFiNzJlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X3NyaW92LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X3NyaW92LmgKQEAgLTEyLDcgKzEyLDcgQEAKIAogaW50IGJueHRfZ2V0X3ZmX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQsIHN0cnVjdCBpZmxhX3ZmX2luZm8gKik7CiBpbnQgYm54dF9zZXRfdmZfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCwgdTggKik7Ci1pbnQgYm54dF9zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQsIHUxNiwgdTgpOworaW50IGJueHRfc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50LCB1MTYsIHU4LCBfX2JlMTYpOwogaW50IGJueHRfc2V0X3ZmX2J3KHN0cnVjdCBuZXRfZGV2aWNlICosIGludCwgaW50LCBpbnQpOwogaW50IGJueHRfc2V0X3ZmX2xpbmtfc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50LCBpbnQpOwogaW50IGJueHRfc2V0X3ZmX3Nwb29mY2hrKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCwgYm9vbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9nZW5ldC9iY21nZW5ldC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vZ2VuZXQvYmNtZ2VuZXQuYwppbmRleCA4ZDRmODQ5Li40NDY0YmM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9nZW5ldC9iY21nZW5ldC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2dlbmV0L2JjbWdlbmV0LmMKQEAgLTQ1MCwyOCArNDUwLDMyIEBACiAJCQlnZW5ldF9kbWFfcmluZ19yZWdzW3JdKTsKIH0KIAotc3RhdGljIGludCBiY21nZW5ldF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCitzdGF0aWMgaW50IGJjbWdlbmV0X2dldF9saW5rX2tzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQogeworCXN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwogCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICghZGV2LT5waHlkZXYpCisJaWYgKCFwcml2LT5waHlkZXYpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcmV0dXJuIHBoeV9ldGh0b29sX2dzZXQoZGV2LT5waHlkZXYsIGNtZCk7CisJcmV0dXJuIHBoeV9ldGh0b29sX2tzZXR0aW5nc19nZXQocHJpdi0+cGh5ZGV2LCBjbWQpOwogfQogCi1zdGF0aWMgaW50IGJjbWdlbmV0X3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3N0YXRpYyBpbnQgYmNtZ2VuZXRfc2V0X2xpbmtfa3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCiB7CisJc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCiAJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKCFkZXYtPnBoeWRldikKKwlpZiAoIXByaXYtPnBoeWRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlyZXR1cm4gcGh5X2V0aHRvb2xfc3NldChkZXYtPnBoeWRldiwgY21kKTsKKwlyZXR1cm4gcGh5X2V0aHRvb2xfa3NldHRpbmdzX3NldChwcml2LT5waHlkZXYsIGNtZCk7CiB9CiAKIHN0YXRpYyBpbnQgYmNtZ2VuZXRfc2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKQEAgLTkzNyw3ICs5NDEsNyBAQAogCWUtPmVlZV9hY3RpdmUgPSBwLT5lZWVfYWN0aXZlOwogCWUtPnR4X2xwaV90aW1lciA9IGJjbWdlbmV0X3VtYWNfcmVhZGwocHJpdiwgVU1BQ19FRUVfTFBJX1RJTUVSKTsKIAotCXJldHVybiBwaHlfZXRodG9vbF9nZXRfZWVlKGRldi0+cGh5ZGV2LCBlKTsKKwlyZXR1cm4gcGh5X2V0aHRvb2xfZ2V0X2VlZShwcml2LT5waHlkZXYsIGUpOwogfQogCiBzdGF0aWMgaW50IGJjbWdlbmV0X3NldF9lZWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZWVlICplKQpAQCAtOTU0LDcgKzk1OCw3IEBACiAJaWYgKCFwLT5lZWVfZW5hYmxlZCkgewogCQliY21nZW5ldF9lZWVfZW5hYmxlX3NldChkZXYsIGZhbHNlKTsKIAl9IGVsc2UgewotCQlyZXQgPSBwaHlfaW5pdF9lZWUoZGV2LT5waHlkZXYsIDApOworCQlyZXQgPSBwaHlfaW5pdF9lZWUocHJpdi0+cGh5ZGV2LCAwKTsKIAkJaWYgKHJldCkgewogCQkJbmV0aWZfZXJyKHByaXYsIGh3LCBkZXYsICJFRUUgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKIAkJCXJldHVybiByZXQ7CkBAIC05NjQsMjEgKzk2OCwyMSBAQAogCQliY21nZW5ldF9lZWVfZW5hYmxlX3NldChkZXYsIHRydWUpOwogCX0KIAotCXJldHVybiBwaHlfZXRodG9vbF9zZXRfZWVlKGRldi0+cGh5ZGV2LCBlKTsKKwlyZXR1cm4gcGh5X2V0aHRvb2xfc2V0X2VlZShwcml2LT5waHlkZXYsIGUpOwogfQogCiBzdGF0aWMgaW50IGJjbWdlbmV0X253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gZ2VucGh5X3Jlc3RhcnRfYW5lZyhkZXYtPnBoeWRldik7CisJc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuIGdlbnBoeV9yZXN0YXJ0X2FuZWcocHJpdi0+cGh5ZGV2KTsKIH0KIAogLyogc3RhbmRhcmQgZXRodG9vbCBzdXBwb3J0IGZ1bmN0aW9ucy4gKi8KLXN0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgYmNtZ2VuZXRfZXRodG9vbF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGJjbWdlbmV0X2V0aHRvb2xfb3BzID0gewogCS5nZXRfc3RyaW5ncwkJPSBiY21nZW5ldF9nZXRfc3RyaW5ncywKIAkuZ2V0X3NzZXRfY291bnQJCT0gYmNtZ2VuZXRfZ2V0X3NzZXRfY291bnQsCiAJLmdldF9ldGh0b29sX3N0YXRzCT0gYmNtZ2VuZXRfZ2V0X2V0aHRvb2xfc3RhdHMsCi0JLmdldF9zZXR0aW5ncwkJPSBiY21nZW5ldF9nZXRfc2V0dGluZ3MsCi0JLnNldF9zZXR0aW5ncwkJPSBiY21nZW5ldF9zZXRfc2V0dGluZ3MsCiAJLmdldF9kcnZpbmZvCQk9IGJjbWdlbmV0X2dldF9kcnZpbmZvLAogCS5nZXRfbGluawkJPSBldGh0b29sX29wX2dldF9saW5rLAogCS5nZXRfbXNnbGV2ZWwJCT0gYmNtZ2VuZXRfZ2V0X21zZ2xldmVsLApAQCAtOTkwLDE5ICs5OTQsMjAgQEAKIAkubndheV9yZXNldAkJPSBiY21nZW5ldF9ud2F5X3Jlc2V0LAogCS5nZXRfY29hbGVzY2UJCT0gYmNtZ2VuZXRfZ2V0X2NvYWxlc2NlLAogCS5zZXRfY29hbGVzY2UJCT0gYmNtZ2VuZXRfc2V0X2NvYWxlc2NlLAorCS5nZXRfbGlua19rc2V0dGluZ3MJPSBiY21nZW5ldF9nZXRfbGlua19rc2V0dGluZ3MsCisJLnNldF9saW5rX2tzZXR0aW5ncwk9IGJjbWdlbmV0X3NldF9saW5rX2tzZXR0aW5ncywKIH07CiAKIC8qIFBvd2VyIGRvd24gdGhlIHVuaW1hYywgYmFzZWQgb24gbW9kZS4gKi8KIHN0YXRpYyBpbnQgYmNtZ2VuZXRfcG93ZXJfZG93bihzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdiwKIAkJCQllbnVtIGJjbWdlbmV0X3Bvd2VyX21vZGUgbW9kZSkKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHByaXYtPmRldjsKIAlpbnQgcmV0ID0gMDsKIAl1MzIgcmVnOwogCiAJc3dpdGNoIChtb2RlKSB7CiAJY2FzZSBHRU5FVF9QT1dFUl9DQUJMRV9TRU5TRToKLQkJcGh5X2RldGFjaChuZGV2LT5waHlkZXYpOworCQlwaHlfZGV0YWNoKHByaXYtPnBoeWRldik7CiAJCWJyZWFrOwogCiAJY2FzZSBHRU5FVF9QT1dFUl9XT0xfTUFHSUM6CkBAIC0xMDYzLDYgKzEwNjgsNyBAQAogLyogaW9jdGwgaGFuZGxlIHNwZWNpYWwgY29tbWFuZHMgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gZXRodG9vbC4gKi8KIHN0YXRpYyBpbnQgYmNtZ2VuZXRfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKIHsKKwlzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IHZhbCA9IDA7CiAKIAlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKQEAgLTEwNzIsMTAgKzEwNzgsMTAgQEAKIAljYXNlIFNJT0NHTUlJUEhZOgogCWNhc2UgU0lPQ0dNSUlSRUc6CiAJY2FzZSBTSU9DU01JSVJFRzoKLQkJaWYgKCFkZXYtPnBoeWRldikKKwkJaWYgKCFwcml2LT5waHlkZXYpCiAJCQl2YWwgPSAtRU5PREVWOwogCQllbHNlCi0JCQl2YWwgPSBwaHlfbWlpX2lvY3RsKGRldi0+cGh5ZGV2LCBycSwgY21kKTsKKwkJCXZhbCA9IHBoeV9taWlfaW9jdGwocHJpdi0+cGh5ZGV2LCBycSwgY21kKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMjQ1OCw3ICsyNDY0LDYgQEAKIHsKIAlzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZigKIAkJCXdvcmssIHN0cnVjdCBiY21nZW5ldF9wcml2LCBiY21nZW5ldF9pcnFfd29yayk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwcml2LT5kZXY7CiAKIAluZXRpZl9kYmcocHJpdiwgaW50ciwgcHJpdi0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIApAQCAtMjQ3MSw3ICsyNDc2LDcgQEAKIAogCS8qIExpbmsgVVAvRE9XTiBldmVudCAqLwogCWlmIChwcml2LT5pcnEwX3N0YXQgJiBVTUFDX0lSUV9MSU5LX0VWRU5UKSB7Ci0JCXBoeV9tYWNfaW50ZXJydXB0KG5kZXYtPnBoeWRldiwKKwkJcGh5X21hY19pbnRlcnJ1cHQocHJpdi0+cGh5ZGV2LAogCQkJCSAgISEocHJpdi0+aXJxMF9zdGF0ICYgVU1BQ19JUlFfTElOS19VUCkpOwogCQlwcml2LT5pcnEwX3N0YXQgJj0gflVNQUNfSVJRX0xJTktfRVZFTlQ7CiAJfQpAQCAtMjY2NCwxMjggKzI2NjksNiBAQAogCWJjbWdlbmV0X3RkbWFfd3JpdGVsKHByaXYsIHJlZywgRE1BX0NUUkwpOwogfQogCi1zdGF0aWMgYm9vbCBiY21nZW5ldF9oZmJfaXNfZmlsdGVyX2VuYWJsZWQoc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYsCi0JCQkJCSAgIHUzMiBmX2luZGV4KQotewotCXUzMiBvZmZzZXQ7Ci0JdTMyIHJlZzsKLQotCW9mZnNldCA9IEhGQl9GTFRfRU5BQkxFX1YzUExVUyArIChmX2luZGV4IDwgMzIpICogc2l6ZW9mKHUzMik7Ci0JcmVnID0gYmNtZ2VuZXRfaGZiX3JlZ19yZWFkbChwcml2LCBvZmZzZXQpOwotCXJldHVybiAhIShyZWcgJiAoMSA8PCAoZl9pbmRleCAlIDMyKSkpOwotfQotCi1zdGF0aWMgdm9pZCBiY21nZW5ldF9oZmJfZW5hYmxlX2ZpbHRlcihzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdiwgdTMyIGZfaW5kZXgpCi17Ci0JdTMyIG9mZnNldDsKLQl1MzIgcmVnOwotCi0Jb2Zmc2V0ID0gSEZCX0ZMVF9FTkFCTEVfVjNQTFVTICsgKGZfaW5kZXggPCAzMikgKiBzaXplb2YodTMyKTsKLQlyZWcgPSBiY21nZW5ldF9oZmJfcmVnX3JlYWRsKHByaXYsIG9mZnNldCk7Ci0JcmVnIHw9ICgxIDw8IChmX2luZGV4ICUgMzIpKTsKLQliY21nZW5ldF9oZmJfcmVnX3dyaXRlbChwcml2LCByZWcsIG9mZnNldCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJjbWdlbmV0X2hmYl9zZXRfZmlsdGVyX3J4X3F1ZXVlX21hcHBpbmcoc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYsCi0JCQkJCQkgICAgIHUzMiBmX2luZGV4LCB1MzIgcnhfcXVldWUpCi17Ci0JdTMyIG9mZnNldDsKLQl1MzIgcmVnOwotCi0Jb2Zmc2V0ID0gZl9pbmRleCAvIDg7Ci0JcmVnID0gYmNtZ2VuZXRfcmRtYV9yZWFkbChwcml2LCBETUFfSU5ERVgyUklOR18wICsgb2Zmc2V0KTsKLQlyZWcgJj0gfigweEYgPDwgKDQgKiAoZl9pbmRleCAlIDgpKSk7Ci0JcmVnIHw9ICgocnhfcXVldWUgJiAweEYpIDw8ICg0ICogKGZfaW5kZXggJSA4KSkpOwotCWJjbWdlbmV0X3JkbWFfd3JpdGVsKHByaXYsIHJlZywgRE1BX0lOREVYMlJJTkdfMCArIG9mZnNldCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJjbWdlbmV0X2hmYl9zZXRfZmlsdGVyX2xlbmd0aChzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdiwKLQkJCQkJICAgdTMyIGZfaW5kZXgsIHUzMiBmX2xlbmd0aCkKLXsKLQl1MzIgb2Zmc2V0OwotCXUzMiByZWc7Ci0KLQlvZmZzZXQgPSBIRkJfRkxUX0xFTl9WM1BMVVMgKwotCQkgKChwcml2LT5od19wYXJhbXMtPmhmYl9maWx0ZXJfY250IC0gMSAtIGZfaW5kZXgpIC8gNCkgKgotCQkgc2l6ZW9mKHUzMik7Ci0JcmVnID0gYmNtZ2VuZXRfaGZiX3JlZ19yZWFkbChwcml2LCBvZmZzZXQpOwotCXJlZyAmPSB+KDB4RkYgPDwgKDggKiAoZl9pbmRleCAlIDQpKSk7Ci0JcmVnIHw9ICgoZl9sZW5ndGggJiAweEZGKSA8PCAoOCAqIChmX2luZGV4ICUgNCkpKTsKLQliY21nZW5ldF9oZmJfcmVnX3dyaXRlbChwcml2LCByZWcsIG9mZnNldCk7Ci19Ci0KLXN0YXRpYyBpbnQgYmNtZ2VuZXRfaGZiX2ZpbmRfdW51c2VkX2ZpbHRlcihzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdikKLXsKLQl1MzIgZl9pbmRleDsKLQotCWZvciAoZl9pbmRleCA9IDA7IGZfaW5kZXggPCBwcml2LT5od19wYXJhbXMtPmhmYl9maWx0ZXJfY250OyBmX2luZGV4KyspCi0JCWlmICghYmNtZ2VuZXRfaGZiX2lzX2ZpbHRlcl9lbmFibGVkKHByaXYsIGZfaW5kZXgpKQotCQkJcmV0dXJuIGZfaW5kZXg7Ci0KLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotLyogYmNtZ2VuZXRfaGZiX2FkZF9maWx0ZXIKLSAqCi0gKiBBZGQgbmV3IGZpbHRlciB0byBIYXJkd2FyZSBGaWx0ZXIgQmxvY2sgdG8gbWF0Y2ggYW5kIGRpcmVjdCBSeCB0cmFmZmljIHRvCi0gKiBkZXNpcmVkIFJ4IHF1ZXVlLgotICoKLSAqIGZfZGF0YSBpcyBhbiBhcnJheSBvZiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlcnMgd2hlcmUgZWFjaCAzMi1iaXQgaW50ZWdlcgotICogcHJvdmlkZXMgZmlsdGVyIGRhdGEgZm9yIDIgYnl0ZXMgKDQgbmliYmxlcykgb2YgUnggZnJhbWU6Ci0gKgotICogYml0cyAzMToyMCAtIHVudXNlZAotICogYml0ICAxOSAgICAtIG5pYmJsZSAwIG1hdGNoIGVuYWJsZQotICogYml0ICAxOCAgICAtIG5pYmJsZSAxIG1hdGNoIGVuYWJsZQotICogYml0ICAxNyAgICAtIG5pYmJsZSAyIG1hdGNoIGVuYWJsZQotICogYml0ICAxNiAgICAtIG5pYmJsZSAzIG1hdGNoIGVuYWJsZQotICogYml0cyAxNToxMiAtIG5pYmJsZSAwIGRhdGEKLSAqIGJpdHMgMTE6OCAgLSBuaWJibGUgMSBkYXRhCi0gKiBiaXRzIDc6NCAgIC0gbmliYmxlIDIgZGF0YQotICogYml0cyAzOjAgICAtIG5pYmJsZSAzIGRhdGEKLSAqCi0gKiBFeGFtcGxlOgotICogSW4gb3JkZXIgdG8gbWF0Y2g6Ci0gKiAtIEV0aGVybmV0IGZyYW1lIHR5cGUgPSAweDA4MDAgKElQKQotICogLSBJUCB2ZXJzaW9uIGZpZWxkID0gNAotICogLSBJUCBwcm90b2NvbCBmaWVsZCA9IDB4MTEgKFVEUCkKLSAqCi0gKiBUaGUgZm9sbG93aW5nIGZpbHRlciBpcyBuZWVkZWQ6Ci0gKiB1MzIgaGZiX2ZpbHRlcl9pcHY0X3VkcFtdID0gewotICogICBSeCBmcmFtZSBvZmZzZXQgMHgwMDogMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLSAqICAgUnggZnJhbWUgb2Zmc2V0IDB4MDg6IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwRjA4MDAsIDB4MDAwODQwMDAsCi0gKiAgIFJ4IGZyYW1lIG9mZnNldCAweDEwOiAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDMwMDExLAotICogfTsKLSAqCi0gKiBUbyBhZGQgdGhlIGZpbHRlciB0byBIRkIgYW5kIGRpcmVjdCB0aGUgdHJhZmZpYyB0byBSeCBxdWV1ZSAwLCBjYWxsOgotICogYmNtZ2VuZXRfaGZiX2FkZF9maWx0ZXIocHJpdiwgaGZiX2ZpbHRlcl9pcHY0X3VkcCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoaGZiX2ZpbHRlcl9pcHY0X3VkcCksIDApOwotICovCi1pbnQgYmNtZ2VuZXRfaGZiX2FkZF9maWx0ZXIoc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYsIHUzMiAqZl9kYXRhLAotCQkJICAgIHUzMiBmX2xlbmd0aCwgdTMyIHJ4X3F1ZXVlKQotewotCWludCBmX2luZGV4OwotCXUzMiBpOwotCi0JZl9pbmRleCA9IGJjbWdlbmV0X2hmYl9maW5kX3VudXNlZF9maWx0ZXIocHJpdik7Ci0JaWYgKGZfaW5kZXggPCAwKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmIChmX2xlbmd0aCA+IHByaXYtPmh3X3BhcmFtcy0+aGZiX2ZpbHRlcl9zaXplKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWZvciAoaSA9IDA7IGkgPCBmX2xlbmd0aDsgaSsrKQotCQliY21nZW5ldF9oZmJfd3JpdGVsKHByaXYsIGZfZGF0YVtpXSwKLQkJCShmX2luZGV4ICogcHJpdi0+aHdfcGFyYW1zLT5oZmJfZmlsdGVyX3NpemUgKyBpKSAqCi0JCQlzaXplb2YodTMyKSk7Ci0KLQliY21nZW5ldF9oZmJfc2V0X2ZpbHRlcl9sZW5ndGgocHJpdiwgZl9pbmRleCwgMiAqIGZfbGVuZ3RoKTsKLQliY21nZW5ldF9oZmJfc2V0X2ZpbHRlcl9yeF9xdWV1ZV9tYXBwaW5nKHByaXYsIGZfaW5kZXgsIHJ4X3F1ZXVlKTsKLQliY21nZW5ldF9oZmJfZW5hYmxlX2ZpbHRlcihwcml2LCBmX2luZGV4KTsKLQliY21nZW5ldF9oZmJfcmVnX3dyaXRlbChwcml2LCAweDEsIEhGQl9DVFJMKTsKLQotCXJldHVybiAwOwotfQotCiAvKiBiY21nZW5ldF9oZmJfY2xlYXIKICAqCiAgKiBDbGVhciBIYXJkd2FyZSBGaWx0ZXIgQmxvY2sgYW5kIGRpc2FibGUgYWxsIGZpbHRlcmluZy4KQEAgLTI4MzMsNyArMjcxNiw3IEBACiAJLyogTW9uaXRvciBsaW5rIGludGVycnVwdHMgbm93ICovCiAJYmNtZ2VuZXRfbGlua19pbnRyX2VuYWJsZShwcml2KTsKIAotCXBoeV9zdGFydChkZXYtPnBoeWRldik7CisJcGh5X3N0YXJ0KHByaXYtPnBoeWRldik7CiB9CiAKIHN0YXRpYyBpbnQgYmNtZ2VuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMjkzMiw3ICsyODE1LDcgQEAKIAlzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAKIAluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMoZGV2KTsKLQlwaHlfc3RvcChkZXYtPnBoeWRldik7CisJcGh5X3N0b3AocHJpdi0+cGh5ZGV2KTsKIAliY21nZW5ldF9pbnRyX2Rpc2FibGUocHJpdik7CiAJYmNtZ2VuZXRfZGlzYWJsZV9yeF9uYXBpKHByaXYpOwogCWJjbWdlbmV0X2Rpc2FibGVfdHhfbmFwaShwcml2KTsKQEAgLTI5NTgsNyArMjg0MSw3IEBACiAJYmNtZ2VuZXRfbmV0aWZfc3RvcChkZXYpOwogCiAJLyogUmVhbGx5IGtpbGwgdGhlIFBIWSBzdGF0ZSBtYWNoaW5lIGFuZCBkaXNjb25uZWN0IGZyb20gaXQgKi8KLQlwaHlfZGlzY29ubmVjdChkZXYtPnBoeWRldik7CisJcGh5X2Rpc2Nvbm5lY3QocHJpdi0+cGh5ZGV2KTsKIAogCS8qIERpc2FibGUgTUFDIHJlY2VpdmUgKi8KIAl1bWFjX2VuYWJsZV9zZXQocHJpdiwgQ01EX1JYX0VOLCBmYWxzZSk7CkBAIC0zNTE3LDcgKzM0MDAsNyBAQAogCiAJYmNtZ2VuZXRfbmV0aWZfc3RvcChkZXYpOwogCi0JcGh5X3N1c3BlbmQoZGV2LT5waHlkZXYpOworCXBoeV9zdXNwZW5kKHByaXYtPnBoeWRldik7CiAKIAluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CiAKQEAgLTM1ODEsNyArMzQ2NCw3IEBACiAJaWYgKHByaXYtPndvbG9wdHMpCiAJCWNsa19kaXNhYmxlX3VucHJlcGFyZShwcml2LT5jbGtfd29sKTsKIAotCXBoeV9pbml0X2h3KGRldi0+cGh5ZGV2KTsKKwlwaHlfaW5pdF9odyhwcml2LT5waHlkZXYpOwogCS8qIFNwZWVkIHNldHRpbmdzIG11c3QgYmUgcmVzdG9yZWQgKi8KIAliY21nZW5ldF9taWlfY29uZmlnKHByaXYtPmRldik7CiAKQEAgLTM2MTQsNyArMzQ5Nyw3IEBACiAKIAluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CiAKLQlwaHlfcmVzdW1lKGRldi0+cGh5ZGV2KTsKKwlwaHlfcmVzdW1lKHByaXYtPnBoeWRldik7CiAKIAlpZiAocHJpdi0+ZWVlLmVlZV9lbmFibGVkKQogCQliY21nZW5ldF9lZWVfZW5hYmxlX3NldChkZXYsIHRydWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vZ2VuZXQvYmNtZ2VuZXQuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2dlbmV0L2JjbWdlbmV0LmgKaW5kZXggMGYwODY4Yy4uMWUyZGMzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vZ2VuZXQvYmNtZ2VuZXQuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9nZW5ldC9iY21nZW5ldC5oCkBAIC01OTcsNiArNTk3LDcgQEAKIAogCS8qIE1ESU8gYnVzIHZhcmlhYmxlcyAqLwogCXdhaXRfcXVldWVfaGVhZF90IHdxOworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7CiAJYm9vbCBpbnRlcm5hbF9waHk7CiAJc3RydWN0IGRldmljZV9ub2RlICpwaHlfZG47CiAJc3RydWN0IGRldmljZV9ub2RlICptZGlvX2RuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vZ2VuZXQvYmNtbWlpLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9nZW5ldC9iY21taWkuYwppbmRleCBlOTA3YWNkLi40NTdjM2JjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9nZW5ldC9iY21taWkuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9nZW5ldC9iY21taWkuYwpAQCAtODYsNyArODYsNyBAQAogdm9pZCBiY21nZW5ldF9taWlfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IGRldi0+cGh5ZGV2OworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBwcml2LT5waHlkZXY7CiAJdTMyIHJlZywgY21kX2JpdHMgPSAwOwogCWJvb2wgc3RhdHVzX2NoYW5nZWQgPSBmYWxzZTsKIApAQCAtMTgzLDkgKzE4Myw5IEBACiAJaWYgKEdFTkVUX0lTX1Y0KHByaXYpKQogCQlyZXR1cm47CiAKLQlpZiAoZGV2LT5waHlkZXYpIHsKLQkJcGh5X2luaXRfaHcoZGV2LT5waHlkZXYpOwotCQlwaHlfc3RhcnRfYW5lZyhkZXYtPnBoeWRldik7CisJaWYgKHByaXYtPnBoeWRldikgeworCQlwaHlfaW5pdF9odyhwcml2LT5waHlkZXYpOworCQlwaHlfc3RhcnRfYW5lZyhwcml2LT5waHlkZXYpOwogCX0KIH0KIApAQCAtMjM2LDcgKzIzNiw2IEBACiAKIHN0YXRpYyB2b2lkIGJjbWdlbmV0X21vY2FfcGh5X3NldHVwKHN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2KQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcHJpdi0+ZGV2OwogCXUzMiByZWc7CiAKIAkvKiBTcGVlZCBzZXR0aW5ncyBhcmUgc2V0IGluIGJjbWdlbmV0X21paV9zZXR1cCgpICovCkBAIC0yNDUsMTQgKzI0NCwxNCBAQAogCWJjbWdlbmV0X3N5c193cml0ZWwocHJpdiwgcmVnLCBTWVNfUE9SVF9DVFJMKTsKIAogCWlmIChwcml2LT5od19wYXJhbXMtPmZsYWdzICYgR0VORVRfSEFTX01PQ0FfTElOS19ERVQpCi0JCWZpeGVkX3BoeV9zZXRfbGlua191cGRhdGUobmRldi0+cGh5ZGV2LAorCQlmaXhlZF9waHlfc2V0X2xpbmtfdXBkYXRlKHByaXYtPnBoeWRldiwKIAkJCQkJICBiY21nZW5ldF9maXhlZF9waHlfbGlua191cGRhdGUpOwogfQogCiBpbnQgYmNtZ2VuZXRfbWlpX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gZGV2LT5waHlkZXY7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IHByaXYtPnBoeWRldjsKIAlzdHJ1Y3QgZGV2aWNlICprZGV2ID0gJnByaXYtPnBkZXYtPmRldjsKIAljb25zdCBjaGFyICpwaHlfbmFtZSA9IE5VTEw7CiAJdTMyIGlkX21vZGVfZGlzID0gMDsKQEAgLTMwMyw3ICszMDIsNyBAQAogCQkgKiBjYXBhYmlsaXRpZXMsIHVzZSB0aGF0IGtub3dsZWRnZSB0byBhbHNvIGNvbmZpZ3VyZSB0aGUKIAkJICogUmV2ZXJzZSBNSUkgaW50ZXJmYWNlIGNvcnJlY3RseS4KIAkJICovCi0JCWlmICgocGh5ZGV2LT5zdXBwb3J0ZWQgJiBQSFlfQkFTSUNfRkVBVFVSRVMpID09CisJCWlmICgocHJpdi0+cGh5ZGV2LT5zdXBwb3J0ZWQgJiBQSFlfQkFTSUNfRkVBVFVSRVMpID09CiAJCQkJUEhZX0JBU0lDX0ZFQVRVUkVTKQogCQkJcG9ydF9jdHJsID0gUE9SVF9NT0RFX0VYVF9SVk1JSV8yNTsKIAkJZWxzZQpAQCAtMzcyLDcgKzM3MSw3IEBACiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCX0gZWxzZSB7Ci0JCXBoeWRldiA9IGRldi0+cGh5ZGV2OworCQlwaHlkZXYgPSBwcml2LT5waHlkZXY7CiAJCXBoeWRldi0+ZGV2X2ZsYWdzID0gcGh5X2ZsYWdzOwogCiAJCXJldCA9IHBoeV9jb25uZWN0X2RpcmVjdChkZXYsIHBoeWRldiwgYmNtZ2VuZXRfbWlpX3NldHVwLApAQCAtMzgzLDYgKzM4Miw4IEBACiAJCX0KIAl9CiAKKwlwcml2LT5waHlkZXYgPSBwaHlkZXY7CisKIAkvKiBDb25maWd1cmUgcG9ydCBtdWx0aXBsZXhlciBiYXNlZCBvbiB3aGF0IHRoZSBwcm9iZWQgUEhZIGRldmljZSBzaW5jZQogCSAqIHJlYWRpbmcgdGhlICdtYXgtc3BlZWQnIHByb3BlcnR5IGRldGVybWluZXMgdGhlIG1heGltdW0gc3VwcG9ydGVkCiAJICogUEhZIHNwZWVkIHdoaWNoIGlzIG5lZWRlZCBmb3IgYmNtZ2VuZXRfbWlpX2NvbmZpZygpIHRvIGNvbmZpZ3VyZQpAQCAtMzkwLDcgKzM5MSw3IEBACiAJICovCiAJcmV0ID0gYmNtZ2VuZXRfbWlpX2NvbmZpZyhkZXYpOwogCWlmIChyZXQpIHsKLQkJcGh5X2Rpc2Nvbm5lY3QocGh5ZGV2KTsKKwkJcGh5X2Rpc2Nvbm5lY3QocHJpdi0+cGh5ZGV2KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTQwMCw3ICs0MDEsNyBAQAogCSAqIEV0aGVybmV0IE1BQyBJU1JzCiAJICovCiAJaWYgKHByaXYtPmludGVybmFsX3BoeSkKLQkJcGh5ZGV2LT5pcnEgPSBQSFlfSUdOT1JFX0lOVEVSUlVQVDsKKwkJcHJpdi0+cGh5ZGV2LT5pcnEgPSBQSFlfSUdOT1JFX0lOVEVSUlVQVDsKIAogCXJldHVybiAwOwogfQpAQCAtNjA1LDYgKzYwNiw3IEBACiAKIAl9CiAKKwlwcml2LT5waHlkZXYgPSBwaHlkZXY7CiAJcHJpdi0+cGh5X2ludGVyZmFjZSA9IHBkLT5waHlfaW50ZXJmYWNlOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS90ZzMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL3RnMy5jCmluZGV4IGZmMzAwZjcuLmE5MjdhNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL3RnMy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL3RnMy5jCkBAIC0xMjA3OSw5NSArMTIwNzksMTA3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCB0ZzNfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQorc3RhdGljIGludCB0ZzNfZ2V0X2xpbmtfa3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQogewogCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgc3VwcG9ydGVkLCBhZHZlcnRpc2luZzsKIAogCWlmICh0ZzNfZmxhZyh0cCwgVVNFX1BIWUxJQikpIHsKIAkJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKIAkJaWYgKCEodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfSVNfQ09OTkVDVEVEKSkKIAkJCXJldHVybiAtRUFHQUlOOwogCQlwaHlkZXYgPSBtZGlvYnVzX2dldF9waHkodHAtPm1kaW9fYnVzLCB0cC0+cGh5X2FkZHIpOwotCQlyZXR1cm4gcGh5X2V0aHRvb2xfZ3NldChwaHlkZXYsIGNtZCk7CisJCXJldHVybiBwaHlfZXRodG9vbF9rc2V0dGluZ3NfZ2V0KHBoeWRldiwgY21kKTsKIAl9CiAKLQljbWQtPnN1cHBvcnRlZCA9IChTVVBQT1JURURfQXV0b25lZyk7CisJc3VwcG9ydGVkID0gKFNVUFBPUlRFRF9BdXRvbmVnKTsKIAogCWlmICghKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHXzEwXzEwMF9PTkxZKSkKLQkJY21kLT5zdXBwb3J0ZWQgfD0gKFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZiB8Ci0JCQkJICAgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsKTsKKwkJc3VwcG9ydGVkIHw9IChTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYgfAorCQkJICAgICAgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsKTsKIAogCWlmICghKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0FOWV9TRVJERVMpKSB7Ci0JCWNtZC0+c3VwcG9ydGVkIHw9IChTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8Ci0JCQkJICBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8Ci0JCQkJICBTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKLQkJCQkgIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfAotCQkJCSAgU1VQUE9SVEVEX1RQKTsKLQkJY21kLT5wb3J0ID0gUE9SVF9UUDsKKwkJc3VwcG9ydGVkIHw9IChTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8CisJCQkgICAgICBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8CisJCQkgICAgICBTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwKKwkJCSAgICAgIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfAorCQkJICAgICAgU1VQUE9SVEVEX1RQKTsKKwkJY21kLT5iYXNlLnBvcnQgPSBQT1JUX1RQOwogCX0gZWxzZSB7Ci0JCWNtZC0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9GSUJSRTsKLQkJY21kLT5wb3J0ID0gUE9SVF9GSUJSRTsKKwkJc3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9GSUJSRTsKKwkJY21kLT5iYXNlLnBvcnQgPSBQT1JUX0ZJQlJFOwogCX0KKwlldGh0b29sX2NvbnZlcnRfbGVnYWN5X3UzMl90b19saW5rX21vZGUoY21kLT5saW5rX21vZGVzLnN1cHBvcnRlZCwKKwkJCQkJCXN1cHBvcnRlZCk7CiAKLQljbWQtPmFkdmVydGlzaW5nID0gdHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nOworCWFkdmVydGlzaW5nID0gdHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nOwogCWlmICh0ZzNfZmxhZyh0cCwgUEFVU0VfQVVUT05FRykpIHsKIAkJaWYgKHRwLT5saW5rX2NvbmZpZy5mbG93Y3RybCAmIEZMT1dfQ1RSTF9SWCkgewogCQkJaWYgKHRwLT5saW5rX2NvbmZpZy5mbG93Y3RybCAmIEZMT1dfQ1RSTF9UWCkgewotCQkJCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9QYXVzZTsKKwkJCQlhZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX1BhdXNlOwogCQkJfSBlbHNlIHsKLQkJCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfUGF1c2UgfAotCQkJCQkJICAgIEFEVkVSVElTRURfQXN5bV9QYXVzZTsKKwkJCQlhZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX1BhdXNlIHwKKwkJCQkJQURWRVJUSVNFRF9Bc3ltX1BhdXNlOwogCQkJfQogCQl9IGVsc2UgaWYgKHRwLT5saW5rX2NvbmZpZy5mbG93Y3RybCAmIEZMT1dfQ1RSTF9UWCkgewotCQkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX0FzeW1fUGF1c2U7CisJCQlhZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX0FzeW1fUGF1c2U7CiAJCX0KIAl9CisJZXRodG9vbF9jb252ZXJ0X2xlZ2FjeV91MzJfdG9fbGlua19tb2RlKGNtZC0+bGlua19tb2Rlcy5hZHZlcnRpc2luZywKKwkJCQkJCWFkdmVydGlzaW5nKTsKKwogCWlmIChuZXRpZl9ydW5uaW5nKGRldikgJiYgdHAtPmxpbmtfdXApIHsKLQkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGNtZCwgdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZCk7Ci0JCWNtZC0+ZHVwbGV4ID0gdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXg7Ci0JCWNtZC0+bHBfYWR2ZXJ0aXNpbmcgPSB0cC0+bGlua19jb25maWcucm10X2FkdjsKKwkJY21kLT5iYXNlLnNwZWVkID0gdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZDsKKwkJY21kLT5iYXNlLmR1cGxleCA9IHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfZHVwbGV4OworCQlldGh0b29sX2NvbnZlcnRfbGVnYWN5X3UzMl90b19saW5rX21vZGUoCisJCQljbWQtPmxpbmtfbW9kZXMubHBfYWR2ZXJ0aXNpbmcsCisJCQl0cC0+bGlua19jb25maWcucm10X2Fkdik7CisKIAkJaWYgKCEodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfQU5ZX1NFUkRFUykpIHsKIAkJCWlmICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19NRElYX1NUQVRFKQotCQkJCWNtZC0+ZXRoX3RwX21kaXggPSBFVEhfVFBfTURJX1g7CisJCQkJY21kLT5iYXNlLmV0aF90cF9tZGl4ID0gRVRIX1RQX01ESV9YOwogCQkJZWxzZQotCQkJCWNtZC0+ZXRoX3RwX21kaXggPSBFVEhfVFBfTURJOworCQkJCWNtZC0+YmFzZS5ldGhfdHBfbWRpeCA9IEVUSF9UUF9NREk7CiAJCX0KIAl9IGVsc2UgewotCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoY21kLCBTUEVFRF9VTktOT1dOKTsKLQkJY21kLT5kdXBsZXggPSBEVVBMRVhfVU5LTk9XTjsKLQkJY21kLT5ldGhfdHBfbWRpeCA9IEVUSF9UUF9NRElfSU5WQUxJRDsKKwkJY21kLT5iYXNlLnNwZWVkID0gU1BFRURfVU5LTk9XTjsKKwkJY21kLT5iYXNlLmR1cGxleCA9IERVUExFWF9VTktOT1dOOworCQljbWQtPmJhc2UuZXRoX3RwX21kaXggPSBFVEhfVFBfTURJX0lOVkFMSUQ7CiAJfQotCWNtZC0+cGh5X2FkZHJlc3MgPSB0cC0+cGh5X2FkZHI7Ci0JY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7Ci0JY21kLT5hdXRvbmVnID0gdHAtPmxpbmtfY29uZmlnLmF1dG9uZWc7Ci0JY21kLT5tYXh0eHBrdCA9IDA7Ci0JY21kLT5tYXhyeHBrdCA9IDA7CisJY21kLT5iYXNlLnBoeV9hZGRyZXNzID0gdHAtPnBoeV9hZGRyOworCWNtZC0+YmFzZS5hdXRvbmVnID0gdHAtPmxpbmtfY29uZmlnLmF1dG9uZWc7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdGczX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3N0YXRpYyBpbnQgdGczX3NldF9saW5rX2tzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKIHsKIAlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7Ci0JdTMyIHNwZWVkID0gZXRodG9vbF9jbWRfc3BlZWQoY21kKTsKKwl1MzIgc3BlZWQgPSBjbWQtPmJhc2Uuc3BlZWQ7CisJdTMyIGFkdmVydGlzaW5nOwogCiAJaWYgKHRnM19mbGFnKHRwLCBVU0VfUEhZTElCKSkgewogCQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2OwogCQlpZiAoISh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19JU19DT05ORUNURUQpKQogCQkJcmV0dXJuIC1FQUdBSU47CiAJCXBoeWRldiA9IG1kaW9idXNfZ2V0X3BoeSh0cC0+bWRpb19idXMsIHRwLT5waHlfYWRkcik7Ci0JCXJldHVybiBwaHlfZXRodG9vbF9zc2V0KHBoeWRldiwgY21kKTsKKwkJcmV0dXJuIHBoeV9ldGh0b29sX2tzZXR0aW5nc19zZXQocGh5ZGV2LCBjbWQpOwogCX0KIAotCWlmIChjbWQtPmF1dG9uZWcgIT0gQVVUT05FR19FTkFCTEUgJiYKLQkgICAgY21kLT5hdXRvbmVnICE9IEFVVE9ORUdfRElTQUJMRSkKKwlpZiAoY21kLT5iYXNlLmF1dG9uZWcgIT0gQVVUT05FR19FTkFCTEUgJiYKKwkgICAgY21kLT5iYXNlLmF1dG9uZWcgIT0gQVVUT05FR19ESVNBQkxFKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFICYmCi0JICAgIGNtZC0+ZHVwbGV4ICE9IERVUExFWF9GVUxMICYmCi0JICAgIGNtZC0+ZHVwbGV4ICE9IERVUExFWF9IQUxGKQorCWlmIChjbWQtPmJhc2UuYXV0b25lZyA9PSBBVVRPTkVHX0RJU0FCTEUgJiYKKwkgICAgY21kLT5iYXNlLmR1cGxleCAhPSBEVVBMRVhfRlVMTCAmJgorCSAgICBjbWQtPmJhc2UuZHVwbGV4ICE9IERVUExFWF9IQUxGKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwlldGh0b29sX2NvbnZlcnRfbGlua19tb2RlX3RvX2xlZ2FjeV91MzIoJmFkdmVydGlzaW5nLAorCQkJCQkJY21kLT5saW5rX21vZGVzLmFkdmVydGlzaW5nKTsKKworCWlmIChjbWQtPmJhc2UuYXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgewogCQl1MzIgbWFzayA9IEFEVkVSVElTRURfQXV0b25lZyB8CiAJCQkgICBBRFZFUlRJU0VEX1BhdXNlIHwKIAkJCSAgIEFEVkVSVElTRURfQXN5bV9QYXVzZTsKQEAgLTEyMTg1LDcgKzEyMTk3LDcgQEAKIAkJZWxzZQogCQkJbWFzayB8PSBBRFZFUlRJU0VEX0ZJQlJFOwogCi0JCWlmIChjbWQtPmFkdmVydGlzaW5nICYgfm1hc2spCisJCWlmIChhZHZlcnRpc2luZyAmIH5tYXNrKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJbWFzayAmPSAoQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZiB8CkBAIC0xMjE5NSwxMyArMTIyMDcsMTMgQEAKIAkJCSBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiB8CiAJCQkgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwpOwogCi0JCWNtZC0+YWR2ZXJ0aXNpbmcgJj0gbWFzazsKKwkJYWR2ZXJ0aXNpbmcgJj0gbWFzazsKIAl9IGVsc2UgewogCQlpZiAodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfQU5ZX1NFUkRFUykgewogCQkJaWYgKHNwZWVkICE9IFNQRUVEXzEwMDApCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJCWlmIChjbWQtPmR1cGxleCAhPSBEVVBMRVhfRlVMTCkKKwkJCWlmIChjbWQtPmJhc2UuZHVwbGV4ICE9IERVUExFWF9GVUxMKQogCQkJCXJldHVybiAtRUlOVkFMOwogCQl9IGVsc2UgewogCQkJaWYgKHNwZWVkICE9IFNQRUVEXzEwMCAmJgpAQCAtMTIyMTIsMTYgKzEyMjI0LDE2IEBACiAKIAl0ZzNfZnVsbF9sb2NrKHRwLCAwKTsKIAotCXRwLT5saW5rX2NvbmZpZy5hdXRvbmVnID0gY21kLT5hdXRvbmVnOwotCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKLQkJdHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nID0gKGNtZC0+YWR2ZXJ0aXNpbmcgfAorCXRwLT5saW5rX2NvbmZpZy5hdXRvbmVnID0gY21kLT5iYXNlLmF1dG9uZWc7CisJaWYgKGNtZC0+YmFzZS5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJCXRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyA9IChhZHZlcnRpc2luZyB8CiAJCQkJCSAgICAgIEFEVkVSVElTRURfQXV0b25lZyk7CiAJCXRwLT5saW5rX2NvbmZpZy5zcGVlZCA9IFNQRUVEX1VOS05PV047CiAJCXRwLT5saW5rX2NvbmZpZy5kdXBsZXggPSBEVVBMRVhfVU5LTk9XTjsKIAl9IGVsc2UgewogCQl0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgPSAwOwogCQl0cC0+bGlua19jb25maWcuc3BlZWQgPSBzcGVlZDsKLQkJdHAtPmxpbmtfY29uZmlnLmR1cGxleCA9IGNtZC0+ZHVwbGV4OworCQl0cC0+bGlua19jb25maWcuZHVwbGV4ID0gY21kLT5iYXNlLmR1cGxleDsKIAl9CiAKIAl0cC0+cGh5X2ZsYWdzIHw9IFRHM19QSFlGTEdfVVNFUl9DT05GSUdVUkVEOwpAQCAtMTI1NTIsMTAgKzEyNTY0LDYgQEAKIAkJCQlpbmZvLT5kYXRhID0gVEczX1JTU19NQVhfTlVNX1FTOwogCQl9CiAKLQkJLyogVGhlIGZpcnN0IGludGVycnVwdCB2ZWN0b3Igb25seQotCQkgKiBoYW5kbGVzIGxpbmsgaW50ZXJydXB0cy4KLQkJICovCi0JCWluZm8tPmRhdGEgLT0gMTsKIAkJcmV0dXJuIDA7CiAKIAlkZWZhdWx0OgpAQCAtMTQwMTQsNyArMTQwMjIsOSBAQAogCX0KIAogCWlmICgoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzID4gTUFYX1JYQ09MX1RJQ0tTKSB8fAorCSAgICAoIWVjLT5yeF9jb2FsZXNjZV91c2VjcykgfHwKIAkgICAgKGVjLT50eF9jb2FsZXNjZV91c2VjcyA+IE1BWF9UWENPTF9USUNLUykgfHwKKwkgICAgKCFlYy0+dHhfY29hbGVzY2VfdXNlY3MpIHx8CiAJICAgIChlYy0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPiBNQVhfUlhNQVhfRlJBTUVTKSB8fAogCSAgICAoZWMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzID4gTUFYX1RYTUFYX0ZSQU1FUykgfHwKIAkgICAgKGVjLT5yeF9jb2FsZXNjZV91c2Vjc19pcnEgPiBtYXhfcnhjb2FsX3RpY2tfaW50KSB8fApAQCAtMTQwMjUsMTYgKzE0MDM1LDYgQEAKIAkgICAgKGVjLT5zdGF0c19ibG9ja19jb2FsZXNjZV91c2VjcyA8IG1pbl9zdGF0X2NvYWxfdGlja3MpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qIE5vIHJ4IGludGVycnVwdHMgd2lsbCBiZSBnZW5lcmF0ZWQgaWYgYm90aCBhcmUgemVybyAqLwotCWlmICgoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzID09IDApICYmCi0JICAgIChlYy0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPT0gMCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogTm8gdHggaW50ZXJydXB0cyB3aWxsIGJlIGdlbmVyYXRlZCBpZiBib3RoIGFyZSB6ZXJvICovCi0JaWYgKChlYy0+dHhfY29hbGVzY2VfdXNlY3MgPT0gMCkgJiYKLQkgICAgKGVjLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA9PSAwKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAkvKiBPbmx5IGNvcHkgcmVsZXZhbnQgcGFyYW1ldGVycywgaWdub3JlIGFsbCBvdGhlcnMuICovCiAJdHAtPmNvYWwucnhfY29hbGVzY2VfdXNlY3MgPSBlYy0+cnhfY29hbGVzY2VfdXNlY3M7CiAJdHAtPmNvYWwudHhfY29hbGVzY2VfdXNlY3MgPSBlYy0+dHhfY29hbGVzY2VfdXNlY3M7CkBAIC0xNDEwNiw4ICsxNDEwNiw2IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgdGczX2V0aHRvb2xfb3BzID0gewotCS5nZXRfc2V0dGluZ3MJCT0gdGczX2dldF9zZXR0aW5ncywKLQkuc2V0X3NldHRpbmdzCQk9IHRnM19zZXRfc2V0dGluZ3MsCiAJLmdldF9kcnZpbmZvCQk9IHRnM19nZXRfZHJ2aW5mbywKIAkuZ2V0X3JlZ3NfbGVuCQk9IHRnM19nZXRfcmVnc19sZW4sCiAJLmdldF9yZWdzCQk9IHRnM19nZXRfcmVncywKQEAgLTE0MTQwLDYgKzE0MTM4LDggQEAKIAkuZ2V0X3RzX2luZm8JCT0gdGczX2dldF90c19pbmZvLAogCS5nZXRfZWVlCQk9IHRnM19nZXRfZWVlLAogCS5zZXRfZWVlCQk9IHRnM19zZXRfZWVlLAorCS5nZXRfbGlua19rc2V0dGluZ3MJPSB0ZzNfZ2V0X2xpbmtfa3NldHRpbmdzLAorCS5zZXRfbGlua19rc2V0dGluZ3MJPSB0ZzNfc2V0X2xpbmtfa3NldHRpbmdzLAogfTsKIAogc3RhdGljIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqdGczX2dldF9zdGF0czY0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC0xODEzNCwxNCArMTgxMzQsMTQgQEAKIAogCXJ0bmxfbG9jaygpOwogCi0JLyogV2UgbmVlZG4ndCByZWNvdmVyIGZyb20gcGVybWFuZW50IGVycm9yICovCi0JaWYgKHN0YXRlID09IHBjaV9jaGFubmVsX2lvX2Zyb3plbikKLQkJdHAtPnBjaWVycl9yZWNvdmVyeSA9IHRydWU7Ci0KIAkvKiBXZSBwcm9iYWJseSBkb24ndCBoYXZlIG5ldGRldiB5ZXQgKi8KIAlpZiAoIW5ldGRldiB8fCAhbmV0aWZfcnVubmluZyhuZXRkZXYpKQogCQlnb3RvIGRvbmU7CiAKKwkvKiBXZSBuZWVkbid0IHJlY292ZXIgZnJvbSBwZXJtYW5lbnQgZXJyb3IgKi8KKwlpZiAoc3RhdGUgPT0gcGNpX2NoYW5uZWxfaW9fZnJvemVuKQorCQl0cC0+cGNpZXJyX3JlY292ZXJ5ID0gdHJ1ZTsKKwogCXRnM19waHlfc3RvcCh0cCk7CiAKIAl0ZzNfbmV0aWZfc3RvcCh0cCk7CkBAIC0xODIzOCw3ICsxODIzOCw3IEBACiAKIAlydG5sX2xvY2soKTsKIAotCWlmICghbmV0aWZfcnVubmluZyhuZXRkZXYpKQorCWlmICghbmV0ZGV2IHx8ICFuZXRpZl9ydW5uaW5nKG5ldGRldikpCiAJCWdvdG8gZG9uZTsKIAogCXRnM19mdWxsX2xvY2sodHAsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hZC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hZC5jCmluZGV4IDc3MWNjMjYuLmY5ZGY0YjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hZC5jCkBAIC01NCw5ICs1NCw3IEBACiAgKiBHbG9iYWwgdmFyaWFibGVzCiAgKi8KIHN0YXRpYyB1MzIgYm5hZF9yeHFzX3Blcl9jcSA9IDI7Ci1zdGF0aWMgdTMyIGJuYV9pZDsKLXN0YXRpYyBzdHJ1Y3QgbXV0ZXggYm5hZF9saXN0X211dGV4Owotc3RhdGljIExJU1RfSEVBRChibmFkX2xpc3QpOworc3RhdGljIGF0b21pY190IGJuYV9pZDsKIHN0YXRpYyBjb25zdCB1OCBibmFkX2JjYXN0X2FkZHJbXSBfX2FsaWduZWQoMikgPQogCXsgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiB9OwogCkBAIC03NiwyMyArNzQsNiBAQAogCShfcmVzX2luZm8pLT5yZXNfdS5tZW1faW5mby5sZW4gPSAoX3NpemUpOwkJXAogfSB3aGlsZSAoMCkKIAotc3RhdGljIHZvaWQKLWJuYWRfYWRkX3RvX2xpc3Qoc3RydWN0IGJuYWQgKmJuYWQpCi17Ci0JbXV0ZXhfbG9jaygmYm5hZF9saXN0X211dGV4KTsKLQlsaXN0X2FkZF90YWlsKCZibmFkLT5saXN0X2VudHJ5LCAmYm5hZF9saXN0KTsKLQlibmFkLT5pZCA9IGJuYV9pZCsrOwotCW11dGV4X3VubG9jaygmYm5hZF9saXN0X211dGV4KTsKLX0KLQotc3RhdGljIHZvaWQKLWJuYWRfcmVtb3ZlX2Zyb21fbGlzdChzdHJ1Y3QgYm5hZCAqYm5hZCkKLXsKLQltdXRleF9sb2NrKCZibmFkX2xpc3RfbXV0ZXgpOwotCWxpc3RfZGVsKCZibmFkLT5saXN0X2VudHJ5KTsKLQltdXRleF91bmxvY2soJmJuYWRfbGlzdF9tdXRleCk7Ci19Ci0KIC8qCiAgKiBSZWluaXRpYWxpemUgY29tcGxldGlvbnMgaW4gQ1EsIG9uY2UgUnggaXMgdGFrZW4gZG93bgogICovCkBAIC0zNTczLDE0ICszNTU0LDEyIEBACiB7CiAJc3Bpbl9sb2NrX2luaXQoJmJuYWQtPmJuYV9sb2NrKTsKIAltdXRleF9pbml0KCZibmFkLT5jb25mX211dGV4KTsKLQltdXRleF9pbml0KCZibmFkX2xpc3RfbXV0ZXgpOwogfQogCiBzdGF0aWMgdm9pZAogYm5hZF9sb2NrX3VuaW5pdChzdHJ1Y3QgYm5hZCAqYm5hZCkKIHsKIAltdXRleF9kZXN0cm95KCZibmFkLT5jb25mX211dGV4KTsKLQltdXRleF9kZXN0cm95KCZibmFkX2xpc3RfbXV0ZXgpOwogfQogCiAvKiBQQ0kgSW5pdGlhbGl6YXRpb24gKi8KQEAgLTM2NTMsNyArMzYzMiw3IEBACiAJfQogCWJuYWQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCWJuYWRfbG9ja19pbml0KGJuYWQpOwotCWJuYWRfYWRkX3RvX2xpc3QoYm5hZCk7CisJYm5hZC0+aWQgPSBhdG9taWNfaW5jX3JldHVybigmYm5hX2lkKSAtIDE7CiAKIAltdXRleF9sb2NrKCZibmFkLT5jb25mX211dGV4KTsKIAkvKgpAQCAtMzgwNyw3ICszNzg2LDYgQEAKIAlibmFkX3BjaV91bmluaXQocGRldik7CiB1bmxvY2tfbXV0ZXg6CiAJbXV0ZXhfdW5sb2NrKCZibmFkLT5jb25mX211dGV4KTsKLQlibmFkX3JlbW92ZV9mcm9tX2xpc3QoYm5hZCk7CiAJYm5hZF9sb2NrX3VuaW5pdChibmFkKTsKIAlmcmVlX25ldGRldihuZXRkZXYpOwogCXJldHVybiBlcnI7CkBAIC0zODQ1LDcgKzM4MjMsNiBAQAogCWJuYWRfZGlzYWJsZV9tc2l4KGJuYWQpOwogCWJuYWRfcGNpX3VuaW5pdChwZGV2KTsKIAltdXRleF91bmxvY2soJmJuYWQtPmNvbmZfbXV0ZXgpOwotCWJuYWRfcmVtb3ZlX2Zyb21fbGlzdChibmFkKTsKIAlibmFkX2xvY2tfdW5pbml0KGJuYWQpOwogCS8qIFJlbW92ZSB0aGUgZGVidWdmcyBub2RlIGZvciB0aGlzIGJuYWQgKi8KIAlrZnJlZShibmFkLT5yZWdkYXRhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYWQuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYWQuaAppbmRleCBmNGVkODE2Li40NmY3Yjg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hZC5oCkBAIC0yODgsNyArMjg4LDYgQEAKIHN0cnVjdCBibmFkIHsKIAlzdHJ1Y3QgbmV0X2RldmljZQkqbmV0ZGV2OwogCXUzMgkJCWlkOwotCXN0cnVjdCBsaXN0X2hlYWQJbGlzdF9lbnRyeTsKIAogCS8qIERhdGEgcGF0aCAqLwogCXN0cnVjdCBibmFkX3R4X2luZm8gdHhfaW5mb1tCTkFEX01BWF9UWF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYWRfZXRodG9vbC5jCmluZGV4IDBlNGZkYzMuLjMxZjYxYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYWRfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYWRfZXRodG9vbC5jCkBAIC0zMSwxNSArMzEsMTAgQEAKICNkZWZpbmUgQk5BRF9OVU1fVFhGX0NPVU5URVJTIDEyCiAjZGVmaW5lIEJOQURfTlVNX1JYRl9DT1VOVEVSUyAxMAogI2RlZmluZSBCTkFEX05VTV9DUV9DT1VOVEVSUyAoMyArIDUpCi0jZGVmaW5lIEJOQURfTlVNX1JYUV9DT1VOVEVSUyA2CisjZGVmaW5lIEJOQURfTlVNX1JYUV9DT1VOVEVSUyA3CiAjZGVmaW5lIEJOQURfTlVNX1RYUV9DT1VOVEVSUyA1CiAKLSNkZWZpbmUgQk5BRF9FVEhUT09MX1NUQVRTX05VTQkJCQkJCVwKLQkoc2l6ZW9mKHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCkgLyBzaXplb2YodTY0KSArCVwKLQlzaXplb2Yoc3RydWN0IGJuYWRfZHJ2X3N0YXRzKSAvIHNpemVvZih1NjQpICsJCVwKLQlvZmZzZXRvZihzdHJ1Y3QgYmZpX2VuZXRfc3RhdHMsIHJ4Zl9zdGF0c1swXSkgLyBzaXplb2YodTY0KSkKLQotc3RhdGljIGNvbnN0IGNoYXIgKmJuYWRfbmV0X3N0YXRzX3N0cmluZ3NbQk5BRF9FVEhUT09MX1NUQVRTX05VTV0gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqYm5hZF9uZXRfc3RhdHNfc3RyaW5nc1tdID0gewogCSJyeF9wYWNrZXRzIiwKIAkidHhfcGFja2V0cyIsCiAJInJ4X2J5dGVzIiwKQEAgLTUwLDIyICs0NSwxMCBAQAogCSJ0eF9kcm9wcGVkIiwKIAkibXVsdGljYXN0IiwKIAkiY29sbGlzaW9ucyIsCi0KIAkicnhfbGVuZ3RoX2Vycm9ycyIsCi0JInJ4X292ZXJfZXJyb3JzIiwKIAkicnhfY3JjX2Vycm9ycyIsCiAJInJ4X2ZyYW1lX2Vycm9ycyIsCi0JInJ4X2ZpZm9fZXJyb3JzIiwKLQkicnhfbWlzc2VkX2Vycm9ycyIsCi0KLQkidHhfYWJvcnRlZF9lcnJvcnMiLAotCSJ0eF9jYXJyaWVyX2Vycm9ycyIsCiAJInR4X2ZpZm9fZXJyb3JzIiwKLQkidHhfaGVhcnRiZWF0X2Vycm9ycyIsCi0JInR4X3dpbmRvd19lcnJvcnMiLAotCi0JInJ4X2NvbXByZXNzZWQiLAotCSJ0eF9jb21wcmVzc2VkIiwKIAogCSJuZXRpZl9xdWV1ZV9zdG9wIiwKIAkibmV0aWZfcXVldWVfd2FrZXVwIiwKQEAgLTI1NCw2ICsyMzcsOCBAQAogCSJmY190eF9maWRfcGFyaXR5X2Vycm9ycyIsCiB9OwogCisjZGVmaW5lIEJOQURfRVRIVE9PTF9TVEFUU19OVU0JQVJSQVlfU0laRShibmFkX25ldF9zdGF0c19zdHJpbmdzKQorCiBzdGF0aWMgaW50CiBibmFkX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKIHsKQEAgLTY1OCw2ICs2NDMsOCBAQAogCQkJCXN0cmluZyArPSBFVEhfR1NUUklOR19MRU47CiAJCQkJc3ByaW50ZihzdHJpbmcsICJyeHElZF9hbGxvY2J1Zl9mYWlsZWQiLCBxX251bSk7CiAJCQkJc3RyaW5nICs9IEVUSF9HU1RSSU5HX0xFTjsKKwkJCQlzcHJpbnRmKHN0cmluZywgInJ4cSVkX21hcGJ1Zl9mYWlsZWQiLCBxX251bSk7CisJCQkJc3RyaW5nICs9IEVUSF9HU1RSSU5HX0xFTjsKIAkJCQlzcHJpbnRmKHN0cmluZywgInJ4cSVkX3Byb2R1Y2VyX2luZGV4IiwgcV9udW0pOwogCQkJCXN0cmluZyArPSBFVEhfR1NUUklOR19MRU47CiAJCQkJc3ByaW50ZihzdHJpbmcsICJyeHElZF9jb25zdW1lcl9pbmRleCIsIHFfbnVtKTsKQEAgLTY3OCw2ICs2NjUsOSBAQAogCQkJCQlzcHJpbnRmKHN0cmluZywgInJ4cSVkX2FsbG9jYnVmX2ZhaWxlZCIsCiAJCQkJCQkJCXFfbnVtKTsKIAkJCQkJc3RyaW5nICs9IEVUSF9HU1RSSU5HX0xFTjsKKwkJCQkJc3ByaW50ZihzdHJpbmcsICJyeHElZF9tYXBidWZfZmFpbGVkIiwKKwkJCQkJCXFfbnVtKTsKKwkJCQkJc3RyaW5nICs9IEVUSF9HU1RSSU5HX0xFTjsKIAkJCQkJc3ByaW50ZihzdHJpbmcsICJyeHElZF9wcm9kdWNlcl9pbmRleCIsCiAJCQkJCQkJCXFfbnVtKTsKIAkJCQkJc3RyaW5nICs9IEVUSF9HU1RSSU5HX0xFTjsKQEAgLTg1NCw5ICs4NDQsOSBAQAogCQkgICAgICAgdTY0ICpidWYpCiB7CiAJc3RydWN0IGJuYWQgKmJuYWQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWludCBpLCBqLCBiaTsKKwlpbnQgaSwgaiwgYmkgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpuZXRfc3RhdHM2NDsKKwlzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgbmV0X3N0YXRzNjQ7CiAJdTY0ICpzdGF0czY0OwogCXUzMiBibWFwOwogCkBAIC04NzEsMTQgKzg2MSwyNSBAQAogCSAqIHVuZGVyIHRoZSBzYW1lIGxvY2sKIAkgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmYm5hZC0+Ym5hX2xvY2ssIGZsYWdzKTsKLQliaSA9IDA7Ci0JbWVtc2V0KGJ1ZiwgMCwgc3RhdHMtPm5fc3RhdHMgKiBzaXplb2YodTY0KSk7CiAKLQluZXRfc3RhdHM2NCA9IChzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKilidWY7Ci0JYm5hZF9uZXRkZXZfcXN0YXRzX2ZpbGwoYm5hZCwgbmV0X3N0YXRzNjQpOwotCWJuYWRfbmV0ZGV2X2h3c3RhdHNfZmlsbChibmFkLCBuZXRfc3RhdHM2NCk7CisJbWVtc2V0KCZuZXRfc3RhdHM2NCwgMCwgc2l6ZW9mKG5ldF9zdGF0czY0KSk7CisJYm5hZF9uZXRkZXZfcXN0YXRzX2ZpbGwoYm5hZCwgJm5ldF9zdGF0czY0KTsKKwlibmFkX25ldGRldl9od3N0YXRzX2ZpbGwoYm5hZCwgJm5ldF9zdGF0czY0KTsKIAotCWJpID0gc2l6ZW9mKCpuZXRfc3RhdHM2NCkgLyBzaXplb2YodTY0KTsKKwlidWZbYmkrK10gPSBuZXRfc3RhdHM2NC5yeF9wYWNrZXRzOworCWJ1ZltiaSsrXSA9IG5ldF9zdGF0czY0LnR4X3BhY2tldHM7CisJYnVmW2JpKytdID0gbmV0X3N0YXRzNjQucnhfYnl0ZXM7CisJYnVmW2JpKytdID0gbmV0X3N0YXRzNjQudHhfYnl0ZXM7CisJYnVmW2JpKytdID0gbmV0X3N0YXRzNjQucnhfZXJyb3JzOworCWJ1ZltiaSsrXSA9IG5ldF9zdGF0czY0LnR4X2Vycm9yczsKKwlidWZbYmkrK10gPSBuZXRfc3RhdHM2NC5yeF9kcm9wcGVkOworCWJ1ZltiaSsrXSA9IG5ldF9zdGF0czY0LnR4X2Ryb3BwZWQ7CisJYnVmW2JpKytdID0gbmV0X3N0YXRzNjQubXVsdGljYXN0OworCWJ1ZltiaSsrXSA9IG5ldF9zdGF0czY0LmNvbGxpc2lvbnM7CisJYnVmW2JpKytdID0gbmV0X3N0YXRzNjQucnhfbGVuZ3RoX2Vycm9yczsKKwlidWZbYmkrK10gPSBuZXRfc3RhdHM2NC5yeF9jcmNfZXJyb3JzOworCWJ1ZltiaSsrXSA9IG5ldF9zdGF0czY0LnJ4X2ZyYW1lX2Vycm9yczsKKwlidWZbYmkrK10gPSBuZXRfc3RhdHM2NC50eF9maWZvX2Vycm9yczsKIAogCS8qIEdldCBuZXRpZl9xdWV1ZV9zdG9wcGVkIGZyb20gc3RhY2sgKi8KIAlibmFkLT5zdGF0cy5kcnZfc3RhdHMubmV0aWZfcXVldWVfc3RvcHBlZCA9IG5ldGlmX3F1ZXVlX3N0b3BwZWQobmV0ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NhZGVuY2UvbWFjYi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2FkZW5jZS9tYWNiLmMKaW5kZXggODljMGNmYS4uNjMxNDRiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2FkZW5jZS9tYWNiLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2FkZW5jZS9tYWNiLmMKQEAgLTU0MSw2ICs1NDEsMTQgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYWNiX3NldF9hZGRyKHN0cnVjdCBtYWNiX2RtYV9kZXNjICpkZXNjLCBkbWFfYWRkcl90IGFkZHIpCit7CisJZGVzYy0+YWRkciA9ICh1MzIpYWRkcjsKKyNpZmRlZiBDT05GSUdfQVJDSF9ETUFfQUREUl9UXzY0QklUCisJZGVzYy0+YWRkcmggPSAodTMyKShhZGRyID4+IDMyKTsKKyNlbmRpZgorfQorCiBzdGF0aWMgdm9pZCBtYWNiX3R4X2Vycm9yX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBtYWNiX3F1ZXVlCSpxdWV1ZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbWFjYl9xdWV1ZSwKQEAgLTYyMSwxNCArNjI5LDE3IEBACiAKIAkvKiBTZXQgZW5kIG9mIFRYIHF1ZXVlICovCiAJZGVzYyA9IG1hY2JfdHhfZGVzYyhxdWV1ZSwgMCk7Ci0JZGVzYy0+YWRkciA9IDA7CisJbWFjYl9zZXRfYWRkcihkZXNjLCAwKTsKIAlkZXNjLT5jdHJsID0gTUFDQl9CSVQoVFhfVVNFRCk7CiAKIAkvKiBNYWtlIGRlc2NyaXB0b3IgdXBkYXRlcyB2aXNpYmxlIHRvIGhhcmR3YXJlICovCiAJd21iKCk7CiAKIAkvKiBSZWluaXRpYWxpemUgdGhlIFRYIGRlc2MgcXVldWUgKi8KLQlxdWV1ZV93cml0ZWwocXVldWUsIFRCUVAsIHF1ZXVlLT50eF9yaW5nX2RtYSk7CisJcXVldWVfd3JpdGVsKHF1ZXVlLCBUQlFQLCAodTMyKShxdWV1ZS0+dHhfcmluZ19kbWEpKTsKKyNpZmRlZiBDT05GSUdfQVJDSF9ETUFfQUREUl9UXzY0QklUCisJcXVldWVfd3JpdGVsKHF1ZXVlLCBUQlFQSCwgKHUzMikocXVldWUtPnR4X3JpbmdfZG1hID4+IDMyKSk7CisjZW5kaWYKIAkvKiBNYWtlIFRYIHJpbmcgcmVmbGVjdCBzdGF0ZSBvZiBoYXJkd2FyZSAqLwogCXF1ZXVlLT50eF9oZWFkID0gMDsKIAlxdWV1ZS0+dHhfdGFpbCA9IDA7CkBAIC03NTAsNyArNzYxLDcgQEAKIAogCQkJaWYgKGVudHJ5ID09IFJYX1JJTkdfU0laRSAtIDEpCiAJCQkJcGFkZHIgfD0gTUFDQl9CSVQoUlhfV1JBUCk7Ci0JCQlicC0+cnhfcmluZ1tlbnRyeV0uYWRkciA9IHBhZGRyOworCQkJbWFjYl9zZXRfYWRkcigmKGJwLT5yeF9yaW5nW2VudHJ5XSksIHBhZGRyKTsKIAkJCWJwLT5yeF9yaW5nW2VudHJ5XS5jdHJsID0gMDsKIAogCQkJLyogcHJvcGVybHkgYWxpZ24gRXRoZXJuZXQgaGVhZGVyICovCkBAIC03OTgsNyArODA5LDkgQEAKIAlpbnQJCQljb3VudCA9IDA7CiAKIAl3aGlsZSAoY291bnQgPCBidWRnZXQpIHsKLQkJdTMyIGFkZHIsIGN0cmw7CisJCXUzMiBjdHJsOworCQlkbWFfYWRkcl90IGFkZHI7CisJCWJvb2wgcnh1c2VkOwogCiAJCWVudHJ5ID0gbWFjYl9yeF9yaW5nX3dyYXAoYnAtPnJ4X3RhaWwpOwogCQlkZXNjID0gJmJwLT5yeF9yaW5nW2VudHJ5XTsKQEAgLTgwNiwxMCArODE5LDE0IEBACiAJCS8qIE1ha2UgaHcgZGVzY3JpcHRvciB1cGRhdGVzIHZpc2libGUgdG8gQ1BVICovCiAJCXJtYigpOwogCi0JCWFkZHIgPSBkZXNjLT5hZGRyOworCQlyeHVzZWQgPSAoZGVzYy0+YWRkciAmIE1BQ0JfQklUKFJYX1VTRUQpKSA/IHRydWUgOiBmYWxzZTsKKwkJYWRkciA9IE1BQ0JfQkYoUlhfV0FERFIsIE1BQ0JfQkZFWFQoUlhfV0FERFIsIGRlc2MtPmFkZHIpKTsKKyNpZmRlZiBDT05GSUdfQVJDSF9ETUFfQUREUl9UXzY0QklUCisJCWFkZHIgfD0gKCh1NjQpKGRlc2MtPmFkZHJoKSA8PCAzMik7CisjZW5kaWYKIAkJY3RybCA9IGRlc2MtPmN0cmw7CiAKLQkJaWYgKCEoYWRkciAmIE1BQ0JfQklUKFJYX1VTRUQpKSkKKwkJaWYgKCFyeHVzZWQpCiAJCQlicmVhazsKIAogCQlicC0+cnhfdGFpbCsrOwpAQCAtODM1LDcgKzg1Miw2IEBACiAJCW5ldGRldl92ZGJnKGJwLT5kZXYsICJnZW1fcnggJXUgKGxlbiAldSlcbiIsIGVudHJ5LCBsZW4pOwogCiAJCXNrYl9wdXQoc2tiLCBsZW4pOwotCQlhZGRyID0gTUFDQl9CRihSWF9XQUREUiwgTUFDQl9CRkVYVChSWF9XQUREUiwgYWRkcikpOwogCQlkbWFfdW5tYXBfc2luZ2xlKCZicC0+cGRldi0+ZGV2LCBhZGRyLAogCQkJCSBicC0+cnhfYnVmZmVyX3NpemUsIERNQV9GUk9NX0RFVklDRSk7CiAKQEAgLTEyOTksNyArMTMxNSw3IEBACiAJCQljdHJsIHw9IE1BQ0JfQklUKFRYX1dSQVApOwogCiAJCS8qIFNldCBUWCBidWZmZXIgZGVzY3JpcHRvciAqLwotCQlkZXNjLT5hZGRyID0gdHhfc2tiLT5tYXBwaW5nOworCQltYWNiX3NldF9hZGRyKGRlc2MsIHR4X3NrYi0+bWFwcGluZyk7CiAJCS8qIGRlc2MtPmFkZHIgbXVzdCBiZSB2aXNpYmxlIHRvIGhhcmR3YXJlIGJlZm9yZSBjbGVhcmluZwogCQkgKiAnVFhfVVNFRCcgYml0IGluIGRlc2MtPmN0cmwuCiAJCSAqLwpAQCAtMTMyMyw2ICsxMzM5LDI0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG1hY2JfY2xlYXJfY3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCS8qIG5vIGNoYW5nZSBmb3IgcGFja2V0cyB3aXRob3V0IGNoZWNrc3VtIG9mZmxvYWRpbmcgKi8KKwlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fUEFSVElBTCkKKwkJcmV0dXJuIDA7CisKKwkvKiBtYWtlIHN1cmUgd2UgY2FuIG1vZGlmeSB0aGUgaGVhZGVyICovCisJaWYgKHVubGlrZWx5KHNrYl9jb3dfaGVhZChza2IsIDApKSkKKwkJcmV0dXJuIC0xOworCisJLyogaW5pdGlhbGl6ZSBjaGVja3N1bSBmaWVsZAorCSAqIFRoaXMgaXMgcmVxdWlyZWQgLSBhdCBsZWFzdCBmb3IgWnlucSwgd2hpY2ggb3RoZXJ3aXNlIGNhbGN1bGF0ZXMKKwkgKiB3cm9uZyBVRFAgaGVhZGVyIGNoZWNrc3VtcyBmb3IgVURQIHBhY2tldHMgd2l0aCBVRFAgZGF0YSBsZW4gPD0yCisJICovCisJKihfX3N1bTE2ICopKHNrYl9jaGVja3N1bV9zdGFydChza2IpICsgc2tiLT5jc3VtX29mZnNldCkgPSAwOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IG1hY2Jfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXUxNiBxdWV1ZV9pbmRleCA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpOwpAQCAtMTM2Miw2ICsxMzk2LDExIEBACiAJCXJldHVybiBORVRERVZfVFhfQlVTWTsKIAl9CiAKKwlpZiAobWFjYl9jbGVhcl9jc3VtKHNrYikpIHsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJZ290byB1bmxvY2s7CisJfQorCiAJLyogTWFwIHNvY2tldCBidWZmZXIgZm9yIERNQSB0cmFuc2ZlciAqLwogCWlmICghbWFjYl90eF9tYXAoYnAsIHF1ZXVlLCBza2IpKSB7CiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CkBAIC0xNDIyLDYgKzE0NjEsOSBAQAogCiAJCWRlc2MgPSAmYnAtPnJ4X3JpbmdbaV07CiAJCWFkZHIgPSBNQUNCX0JGKFJYX1dBRERSLCBNQUNCX0JGRVhUKFJYX1dBRERSLCBkZXNjLT5hZGRyKSk7CisjaWZkZWYgQ09ORklHX0FSQ0hfRE1BX0FERFJfVF82NEJJVAorCQlhZGRyIHw9ICgodTY0KShkZXNjLT5hZGRyaCkgPDwgMzIpOworI2VuZGlmCiAJCWRtYV91bm1hcF9zaW5nbGUoJmJwLT5wZGV2LT5kZXYsIGFkZHIsIGJwLT5yeF9idWZmZXJfc2l6ZSwKIAkJCQkgRE1BX0ZST01fREVWSUNFKTsKIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKQEAgLTE1NDcsNyArMTU4OSw3IEBACiAKIAlmb3IgKHEgPSAwLCBxdWV1ZSA9IGJwLT5xdWV1ZXM7IHEgPCBicC0+bnVtX3F1ZXVlczsgKytxLCArK3F1ZXVlKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBUWF9SSU5HX1NJWkU7IGkrKykgewotCQkJcXVldWUtPnR4X3JpbmdbaV0uYWRkciA9IDA7CisJCQltYWNiX3NldF9hZGRyKCYocXVldWUtPnR4X3JpbmdbaV0pLCAwKTsKIAkJCXF1ZXVlLT50eF9yaW5nW2ldLmN0cmwgPSBNQUNCX0JJVChUWF9VU0VEKTsKIAkJfQogCQlxdWV1ZS0+dHhfcmluZ1tUWF9SSU5HX1NJWkUgLSAxXS5jdHJsIHw9IE1BQ0JfQklUKFRYX1dSQVApOwpAQCAtMTY5NCw2ICsxNzM2LDEwIEBACiAJCQlkbWFjZmcgfD0gR0VNX0JJVChUWENPRU4pOwogCQllbHNlCiAJCQlkbWFjZmcgJj0gfkdFTV9CSVQoVFhDT0VOKTsKKworI2lmZGVmIENPTkZJR19BUkNIX0RNQV9BRERSX1RfNjRCSVQKKwkJZG1hY2ZnIHw9IEdFTV9CSVQoQUREUjY0KTsKKyNlbmRpZgogCQluZXRkZXZfZGJnKGJwLT5kZXYsICJDYWRlbmNlIGNvbmZpZ3VyZSBETUEgd2l0aCAweCUwOHhcbiIsCiAJCQkgICBkbWFjZmcpOwogCQlnZW1fd3JpdGVsKGJwLCBETUFDRkcsIGRtYWNmZyk7CkBAIC0xNzM5LDkgKzE3ODUsMTUgQEAKIAltYWNiX2NvbmZpZ3VyZV9kbWEoYnApOwogCiAJLyogSW5pdGlhbGl6ZSBUWCBhbmQgUlggYnVmZmVycyAqLwotCW1hY2Jfd3JpdGVsKGJwLCBSQlFQLCBicC0+cnhfcmluZ19kbWEpOworCW1hY2Jfd3JpdGVsKGJwLCBSQlFQLCAodTMyKShicC0+cnhfcmluZ19kbWEpKTsKKyNpZmRlZiBDT05GSUdfQVJDSF9ETUFfQUREUl9UXzY0QklUCisJbWFjYl93cml0ZWwoYnAsIFJCUVBILCAodTMyKShicC0+cnhfcmluZ19kbWEgPj4gMzIpKTsKKyNlbmRpZgogCWZvciAocSA9IDAsIHF1ZXVlID0gYnAtPnF1ZXVlczsgcSA8IGJwLT5udW1fcXVldWVzOyArK3EsICsrcXVldWUpIHsKLQkJcXVldWVfd3JpdGVsKHF1ZXVlLCBUQlFQLCBxdWV1ZS0+dHhfcmluZ19kbWEpOworCQlxdWV1ZV93cml0ZWwocXVldWUsIFRCUVAsICh1MzIpKHF1ZXVlLT50eF9yaW5nX2RtYSkpOworI2lmZGVmIENPTkZJR19BUkNIX0RNQV9BRERSX1RfNjRCSVQKKwkJcXVldWVfd3JpdGVsKHF1ZXVlLCBUQlFQSCwgKHUzMikocXVldWUtPnR4X3JpbmdfZG1hID4+IDMyKSk7CisjZW5kaWYKIAogCQkvKiBFbmFibGUgaW50ZXJydXB0cyAqLwogCQlxdWV1ZV93cml0ZWwocXVldWUsIElFUiwKQEAgLTIzMDMsNyArMjM1NSw4IEBACiB9CiAKIHN0YXRpYyBpbnQgbWFjYl9jbGtfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgY2xrICoqcGNsaywKLQkJCSBzdHJ1Y3QgY2xrICoqaGNsaywgc3RydWN0IGNsayAqKnR4X2NsaykKKwkJCSBzdHJ1Y3QgY2xrICoqaGNsaywgc3RydWN0IGNsayAqKnR4X2NsaywKKwkJCSBzdHJ1Y3QgY2xrICoqcnhfY2xrKQogewogCWludCBlcnI7CiAKQEAgLTIzMjUsNiArMjM3OCwxMCBAQAogCWlmIChJU19FUlIoKnR4X2NsaykpCiAJCSp0eF9jbGsgPSBOVUxMOwogCisJKnJ4X2NsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAicnhfY2xrIik7CisJaWYgKElTX0VSUigqcnhfY2xrKSkKKwkJKnJ4X2NsayA9IE5VTEw7CisKIAllcnIgPSBjbGtfcHJlcGFyZV9lbmFibGUoKnBjbGspOwogCWlmIChlcnIpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBwY2xrICgldSlcbiIsIGVycik7CkBAIC0yMzQzLDggKzI0MDAsMTcgQEAKIAkJZ290byBlcnJfZGlzYWJsZV9oY2xrOwogCX0KIAorCWVyciA9IGNsa19wcmVwYXJlX2VuYWJsZSgqcnhfY2xrKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBlbmFibGUgcnhfY2xrICgldSlcbiIsIGVycik7CisJCWdvdG8gZXJyX2Rpc2FibGVfdHhjbGs7CisJfQorCiAJcmV0dXJuIDA7CiAKK2Vycl9kaXNhYmxlX3R4Y2xrOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZSgqdHhfY2xrKTsKKwogZXJyX2Rpc2FibGVfaGNsazoKIAljbGtfZGlzYWJsZV91bnByZXBhcmUoKmhjbGspOwogCkBAIC0yMzc5LDYgKzI0NDUsOSBAQAogCQkJcXVldWUtPklEUiAgPSBHRU1fSURSKGh3X3EgLSAxKTsKIAkJCXF1ZXVlLT5JTVIgID0gR0VNX0lNUihod19xIC0gMSk7CiAJCQlxdWV1ZS0+VEJRUCA9IEdFTV9UQlFQKGh3X3EgLSAxKTsKKyNpZmRlZiBDT05GSUdfQVJDSF9ETUFfQUREUl9UXzY0QklUCisJCQlxdWV1ZS0+VEJRUEggPSBHRU1fVEJRUEgoaHdfcSAtMSk7CisjZW5kaWYKIAkJfSBlbHNlIHsKIAkJCS8qIHF1ZXVlMCB1c2VzIGxlZ2FjeSByZWdpc3RlcnMgKi8KIAkJCXF1ZXVlLT5JU1IgID0gTUFDQl9JU1I7CkBAIC0yMzg2LDYgKzI0NTUsOSBAQAogCQkJcXVldWUtPklEUiAgPSBNQUNCX0lEUjsKIAkJCXF1ZXVlLT5JTVIgID0gTUFDQl9JTVI7CiAJCQlxdWV1ZS0+VEJRUCA9IE1BQ0JfVEJRUDsKKyNpZmRlZiBDT05GSUdfQVJDSF9ETUFfQUREUl9UXzY0QklUCisJCQlxdWV1ZS0+VEJRUEggPSBNQUNCX1RCUVBIOworI2VuZGlmCiAJCX0KIAogCQkvKiBnZXQgaXJxOiBoZXJlIHdlIHVzZSB0aGUgbGludXggcXVldWUgaW5kZXgsIG5vdCB0aGUgaGFyZHdhcmUKQEAgLTI3MjgsMTIgKzI4MDAsMTQgQEAKIH07CiAKIHN0YXRpYyBpbnQgYXQ5MWV0aGVyX2Nsa19pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHN0cnVjdCBjbGsgKipwY2xrLAotCQkJICAgICAgc3RydWN0IGNsayAqKmhjbGssIHN0cnVjdCBjbGsgKip0eF9jbGspCisJCQkgICAgICBzdHJ1Y3QgY2xrICoqaGNsaywgc3RydWN0IGNsayAqKnR4X2NsaywKKwkJCSAgICAgIHN0cnVjdCBjbGsgKipyeF9jbGspCiB7CiAJaW50IGVycjsKIAogCSpoY2xrID0gTlVMTDsKIAkqdHhfY2xrID0gTlVMTDsKKwkqcnhfY2xrID0gTlVMTDsKIAogCSpwY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJldGhlcl9jbGsiKTsKIAlpZiAoSVNfRVJSKCpwY2xrKSkKQEAgLTI4NTcsMTMgKzI5MzEsMTMgQEAKIHN0YXRpYyBpbnQgbWFjYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCWludCAoKmNsa19pbml0KShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICosIHN0cnVjdCBjbGsgKiosCi0JCQlzdHJ1Y3QgY2xrICoqLCBzdHJ1Y3QgY2xrICoqKQorCQkJc3RydWN0IGNsayAqKiwgc3RydWN0IGNsayAqKiwgIHN0cnVjdCBjbGsgKiopCiAJCQkJCSAgICAgID0gbWFjYl9jbGtfaW5pdDsKIAlpbnQgKCppbml0KShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICopID0gbWFjYl9pbml0OwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBoeV9ub2RlOwogCWNvbnN0IHN0cnVjdCBtYWNiX2NvbmZpZyAqbWFjYl9jb25maWcgPSBOVUxMOwotCXN0cnVjdCBjbGsgKnBjbGssICpoY2xrID0gTlVMTCwgKnR4X2NsayA9IE5VTEw7CisJc3RydWN0IGNsayAqcGNsaywgKmhjbGsgPSBOVUxMLCAqdHhfY2xrID0gTlVMTCwgKnJ4X2NsayA9IE5VTEw7CiAJdW5zaWduZWQgaW50IHF1ZXVlX21hc2ssIG51bV9xdWV1ZXM7CiAJc3RydWN0IG1hY2JfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAJYm9vbCBuYXRpdmVfaW87CkBAIC0yODkxLDcgKzI5NjUsNyBAQAogCQl9CiAJfQogCi0JZXJyID0gY2xrX2luaXQocGRldiwgJnBjbGssICZoY2xrLCAmdHhfY2xrKTsKKwllcnIgPSBjbGtfaW5pdChwZGV2LCAmcGNsaywgJmhjbGssICZ0eF9jbGssICZyeF9jbGspOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKQEAgLTI5MjcsNiArMzAwMSw3IEBACiAJYnAtPnBjbGsgPSBwY2xrOwogCWJwLT5oY2xrID0gaGNsazsKIAlicC0+dHhfY2xrID0gdHhfY2xrOworCWJwLT5yeF9jbGsgPSByeF9jbGs7CiAJaWYgKG1hY2JfY29uZmlnKQogCQlicC0+anVtYm9fbWF4X2xlbiA9IG1hY2JfY29uZmlnLT5qdW1ib19tYXhfbGVuOwogCkBAIC0yOTM1LDYgKzMwMTAsMTEgQEAKIAkJYnAtPndvbCB8PSBNQUNCX1dPTF9IQVNfTUFHSUNfUEFDS0VUOwogCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCBicC0+d29sICYgTUFDQl9XT0xfSEFTX01BR0lDX1BBQ0tFVCk7CiAKKyNpZmRlZiBDT05GSUdfQVJDSF9ETUFfQUREUl9UXzY0QklUCisJaWYgKEdFTV9CRkVYVChEQldERUYsIGdlbV9yZWFkbChicCwgRENGRzEpKSA+IEdFTV9EQlczMikKKwkJZG1hX3NldF9tYXNrKCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSyg0NCkpOworI2VuZGlmCisKIAlzcGluX2xvY2tfaW5pdCgmYnAtPmxvY2spOwogCiAJLyogc2V0dXAgY2FwYWJpbGl0aWVzICovCkBAIC0yOTQ1LDcgKzMwMjUsNyBAQAogCWRldi0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKIAlpZiAoZGV2LT5pcnEgPCAwKSB7CiAJCWVyciA9IGRldi0+aXJxOwotCQlnb3RvIGVycl9kaXNhYmxlX2Nsb2NrczsKKwkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OwogCX0KIAogCW1hYyA9IG9mX2dldF9tYWNfYWRkcmVzcyhucCk7CkBAIC0zMDIwLDYgKzMxMDAsNyBAQAogCWNsa19kaXNhYmxlX3VucHJlcGFyZSh0eF9jbGspOwogCWNsa19kaXNhYmxlX3VucHJlcGFyZShoY2xrKTsKIAljbGtfZGlzYWJsZV91bnByZXBhcmUocGNsayk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHJ4X2Nsayk7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtMzA0Niw2ICszMTI3LDcgQEAKIAkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGJwLT50eF9jbGspOwogCQljbGtfZGlzYWJsZV91bnByZXBhcmUoYnAtPmhjbGspOwogCQljbGtfZGlzYWJsZV91bnByZXBhcmUoYnAtPnBjbGspOworCQljbGtfZGlzYWJsZV91bnByZXBhcmUoYnAtPnJ4X2Nsayk7CiAJCWZyZWVfbmV0ZGV2KGRldik7CiAJfQogCkBAIC0zMDY5LDYgKzMxNTEsNyBAQAogCQljbGtfZGlzYWJsZV91bnByZXBhcmUoYnAtPnR4X2Nsayk7CiAJCWNsa19kaXNhYmxlX3VucHJlcGFyZShicC0+aGNsayk7CiAJCWNsa19kaXNhYmxlX3VucHJlcGFyZShicC0+cGNsayk7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShicC0+cnhfY2xrKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTMwODgsNiArMzE3MSw3IEBACiAJCWNsa19wcmVwYXJlX2VuYWJsZShicC0+cGNsayk7CiAJCWNsa19wcmVwYXJlX2VuYWJsZShicC0+aGNsayk7CiAJCWNsa19wcmVwYXJlX2VuYWJsZShicC0+dHhfY2xrKTsKKwkJY2xrX3ByZXBhcmVfZW5hYmxlKGJwLT5yeF9jbGspOwogCX0KIAogCW5ldGlmX2RldmljZV9hdHRhY2gobmV0ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NhZGVuY2UvbWFjYi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2FkZW5jZS9tYWNiLmgKaW5kZXggMzY4OTNkOC4uOGJlZDRiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2FkZW5jZS9tYWNiLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2FkZW5jZS9tYWNiLmgKQEAgLTY2LDYgKzY2LDggQEAKICNkZWZpbmUgTUFDQl9VU1JJTwkJMHgwMGMwCiAjZGVmaW5lIE1BQ0JfV09MCQkweDAwYzQKICNkZWZpbmUgTUFDQl9NSUQJCTB4MDBmYworI2RlZmluZSBNQUNCX1RCUVBICQkweDA0QzgKKyNkZWZpbmUgTUFDQl9SQlFQSAkJMHgwNEQ0CiAKIC8qIEdFTSByZWdpc3RlciBvZmZzZXRzLiAqLwogI2RlZmluZSBHRU1fTkNGR1IJCTB4MDAwNCAvKiBOZXR3b3JrIENvbmZpZyAqLwpAQCAtMTM5LDYgKzE0MSw3IEBACiAKICNkZWZpbmUgR0VNX0lTUihod19xKQkJKDB4MDQwMCArICgoaHdfcSkgPDwgMikpCiAjZGVmaW5lIEdFTV9UQlFQKGh3X3EpCQkoMHgwNDQwICsgKChod19xKSA8PCAyKSkKKyNkZWZpbmUgR0VNX1RCUVBIKGh3X3EpCQkoMHgwNEM4KQogI2RlZmluZSBHRU1fUkJRUChod19xKQkJKDB4MDQ4MCArICgoaHdfcSkgPDwgMikpCiAjZGVmaW5lIEdFTV9JRVIoaHdfcSkJCSgweDA2MDAgKyAoKGh3X3EpIDw8IDIpKQogI2RlZmluZSBHRU1fSURSKGh3X3EpCQkoMHgwNjIwICsgKChod19xKSA8PCAyKSkKQEAgLTI0OSw2ICsyNTIsOCBAQAogI2RlZmluZSBHRU1fUlhCU19TSVpFCQk4CiAjZGVmaW5lIEdFTV9ERFJQX09GRlNFVAkJMjQgLyogZGlzY193aGVuX25vX2FoYiAqLwogI2RlZmluZSBHRU1fRERSUF9TSVpFCQkxCisjZGVmaW5lIEdFTV9BRERSNjRfT0ZGU0VUCTMwIC8qIEFkZHJlc3MgYnVzIHdpZHRoIC0gNjRiIG9yIDMyYiAqLworI2RlZmluZSBHRU1fQUREUjY0X1NJWkUJCTEKIAogCiAvKiBCaXRmaWVsZHMgaW4gTlNSICovCkBAIC00MDMsMTEgKzQwOCwxMSBAQAogI2RlZmluZSBNQUNCX0NBUFNfVVNSSU9fREVGQVVMVF9JU19NSUlfR01JSQkweDAwMDAwMDA0CiAjZGVmaW5lIE1BQ0JfQ0FQU19OT19HSUdBQklUX0hBTEYJCTB4MDAwMDAwMDgKICNkZWZpbmUgTUFDQl9DQVBTX1VTUklPX0RJU0FCTEVECQkweDAwMDAwMDEwCisjZGVmaW5lIE1BQ0JfQ0FQU19KVU1CTwkJCQkweDAwMDAwMDIwCiAjZGVmaW5lIE1BQ0JfQ0FQU19GSUZPX01PREUJCQkweDEwMDAwMDAwCiAjZGVmaW5lIE1BQ0JfQ0FQU19HSUdBQklUX01PREVfQVZBSUxBQkxFCTB4MjAwMDAwMDAKICNkZWZpbmUgTUFDQl9DQVBTX1NHX0RJU0FCTEVECQkJMHg0MDAwMDAwMAogI2RlZmluZSBNQUNCX0NBUFNfTUFDQl9JU19HRU0JCQkweDgwMDAwMDAwCi0jZGVmaW5lIE1BQ0JfQ0FQU19KVU1CTwkJCQkweDAwMDAwMDEwCiAKIC8qIEJpdCBtYW5pcHVsYXRpb24gbWFjcm9zICovCiAjZGVmaW5lIE1BQ0JfQklUKG5hbWUpCQkJCQlcCkBAIC00NzQsNiArNDc5LDEwIEBACiBzdHJ1Y3QgbWFjYl9kbWFfZGVzYyB7CiAJdTMyCWFkZHI7CiAJdTMyCWN0cmw7CisjaWZkZWYgQ09ORklHX0FSQ0hfRE1BX0FERFJfVF82NEJJVAorCXUzMiAgICAgYWRkcmg7CisJdTMyICAgICByZXN2ZDsKKyNlbmRpZgogfTsKIAogLyogRE1BIGRlc2NyaXB0b3IgYml0ZmllbGRzICovCkBAIC03NjMsNyArNzcyLDggQEAKIAl1MzIJCQljYXBzOwogCXVuc2lnbmVkIGludAkJZG1hX2J1cnN0X2xlbmd0aDsKIAlpbnQJKCpjbGtfaW5pdCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IGNsayAqKnBjbGssCi0JCQkgICAgc3RydWN0IGNsayAqKmhjbGssIHN0cnVjdCBjbGsgKip0eF9jbGspOworCQkJICAgIHN0cnVjdCBjbGsgKipoY2xrLCBzdHJ1Y3QgY2xrICoqdHhfY2xrLAorCQkJICAgIHN0cnVjdCBjbGsgKipyeF9jbGspOwogCWludAkoKmluaXQpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwogCWludAlqdW1ib19tYXhfbGVuOwogfTsKQEAgLTc3Nyw2ICs3ODcsNyBAQAogCXVuc2lnbmVkIGludAkJSURSOwogCXVuc2lnbmVkIGludAkJSU1SOwogCXVuc2lnbmVkIGludAkJVEJRUDsKKwl1bnNpZ25lZCBpbnQJCVRCUVBIOwogCiAJdW5zaWduZWQgaW50CQl0eF9oZWFkLCB0eF90YWlsOwogCXN0cnVjdCBtYWNiX2RtYV9kZXNjCSp0eF9yaW5nOwpAQCAtODA5LDYgKzgyMCw3IEBACiAJc3RydWN0IGNsawkJKnBjbGs7CiAJc3RydWN0IGNsawkJKmhjbGs7CiAJc3RydWN0IGNsawkJKnR4X2NsazsKKwlzdHJ1Y3QgY2xrCQkqcnhfY2xrOwogCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7CiAJc3RydWN0IG5hcGlfc3RydWN0CW5hcGk7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9LY29uZmlnCmluZGV4IDBlZjIzMmQuLjkyZjQxMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9LY29uZmlnCkBAIC0zNiwxMCArMzYsMjAgQEAKIAlkZXBlbmRzIG9uIDY0QklUCiAJc2VsZWN0IFBIWUxJQgogCXNlbGVjdCBNRElPX1RIVU5ERVIKKwlzZWxlY3QgVEhVTkRFUl9OSUNfUkdYCiAJLS0taGVscC0tLQogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgcHJvZ3JhbW1pbmcgYW5kIGNvbnRyb2xsaW5nIG9mIE1BQwogCSAgaW50ZXJmYWNlIGZyb20gTklDIHBoeXNpY2FsIGZ1bmN0aW9uIGRyaXZlci4KIAorY29uZmlnCVRIVU5ERVJfTklDX1JHWAorCXRyaXN0YXRlICJUaHVuZGVyIE1BQyBpbnRlcmZhY2UgZHJpdmVyIChSR1gpIgorCWRlcGVuZHMgb24gNjRCSVQKKwlzZWxlY3QgUEhZTElCCisJc2VsZWN0IE1ESU9fVEhVTkRFUgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIGNvbmZpZ3VyaW5nIFhDViBibG9jayBvZiBSR1ggaW50ZXJmYWNlCisJICBwcmVzZW50IG9uIENOODFYWCBjaGlwLgorCiBjb25maWcgTElRVUlESU8KIAl0cmlzdGF0ZSAiQ2F2aXVtIExpcXVpZElPIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiA2NEJJVApAQCAtNDgsNyArNTgsNyBAQAogCXNlbGVjdCBMSUJDUkMzMkMKIAktLS1oZWxwLS0tCiAJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBDYXZpdW0gTGlxdWlkSU8gSW50ZWxsaWdlbnQgU2VydmVyIEFkYXB0ZXJzCi0JICBiYXNlZCBvbiBDTjY2WFggYW5kIENONjhYWCBjaGlwcy4KKwkgIGJhc2VkIG9uIENONjZYWCwgQ042OFhYIGFuZCBDTjIzWFggY2hpcHMuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGxpcXVpZGlvLiAgVGhpcyBpcyByZWNvbW1lbmRlZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9NYWtlZmlsZQppbmRleCAyZjM2NjgwLi41YTI3YjJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL01ha2VmaWxlCkBAIC0zLDE0ICszLDE2IEBACiAjCiBvYmotJChDT05GSUdfTElRVUlESU8pICs9IGxpcXVpZGlvLm8KIAotbGlxdWlkaW8tb2JqcyA6PSBsaW9fbWFpbi5vICBcCi0JICAgICAgbGlvX2V0aHRvb2wubyAgICAgIFwKLQkgICAgICByZXF1ZXN0X21hbmFnZXIubyAgXAotCSAgICAgIHJlc3BvbnNlX21hbmFnZXIubyBcCi0JICAgICAgb2N0ZW9uX2RldmljZS5vICAgIFwKLQkgICAgICBjbjY2eHhfZGV2aWNlLm8gICAgXAotCSAgICAgIGNuNjh4eF9kZXZpY2UubyAgICBcCi0JICAgICAgb2N0ZW9uX21lbV9vcHMubyAgIFwKLQkgICAgICBvY3Rlb25fZHJvcS5vICAgICAgXAotCSAgICAgIG9jdGVvbl9jb25zb2xlLm8gICBcCi0JICAgICAgb2N0ZW9uX25pYy5vCitsaXF1aWRpby0kKENPTkZJR19MSVFVSURJTykgKz0gbGlvX2V0aHRvb2wubyBcCisJCQlsaW9fY29yZS5vICAgICAgICAgXAorCQkJcmVxdWVzdF9tYW5hZ2VyLm8gIFwKKwkJCXJlc3BvbnNlX21hbmFnZXIubyBcCisJCQlvY3Rlb25fZGV2aWNlLm8gICAgXAorCQkJY242Nnh4X2RldmljZS5vICAgIFwKKwkJCWNuNjh4eF9kZXZpY2UubyAgICBcCisJCQljbjIzeHhfcGZfZGV2aWNlLm8gXAorCQkJb2N0ZW9uX21lbV9vcHMubyAgIFwKKwkJCW9jdGVvbl9kcm9xLm8gICAgICBcCisJCQlvY3Rlb25fbmljLm8KKworbGlxdWlkaW8tb2JqcyA6PSBsaW9fbWFpbi5vIG9jdGVvbl9jb25zb2xlLm8gJChsaXF1aWRpby15KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2NuMjN4eF9wZl9kZXZpY2UuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9jbjIzeHhfcGZfZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkYjE5OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9jbjIzeHhfcGZfZGV2aWNlLmMKQEAgLTAsMCArMSwxMjM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBBdXRob3I6IENhdml1bSwgSW5jLgorKgorKiBDb250YWN0OiBzdXBwb3J0QGNhdml1bS5jb20KKyogICAgICAgICAgUGxlYXNlIGluY2x1ZGUgIkxpcXVpZElPIiBpbiB0aGUgc3ViamVjdC4KKyoKKyogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2F2aXVtLCBJbmMuCisqCisqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMiwgYXMKKyogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqCisqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyogQVMtSVMgYW5kIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBUSVRMRSwgb3IKKyogTk9OSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorKiBkZXRhaWxzLgorKgorKiBUaGlzIGZpbGUgbWF5IGFsc28gYmUgYXZhaWxhYmxlIHVuZGVyIGEgZGlmZmVyZW50IGxpY2Vuc2UgZnJvbSBDYXZpdW0uCisqIENvbnRhY3QgQ2F2aXVtLCBJbmMuIGZvciBtb3JlIGluZm9ybWF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgImxpcXVpZGlvX2NvbW1vbi5oIgorI2luY2x1ZGUgIm9jdGVvbl9kcm9xLmgiCisjaW5jbHVkZSAib2N0ZW9uX2lxLmgiCisjaW5jbHVkZSAicmVzcG9uc2VfbWFuYWdlci5oIgorI2luY2x1ZGUgIm9jdGVvbl9kZXZpY2UuaCIKKyNpbmNsdWRlICJjbjIzeHhfcGZfZGV2aWNlLmgiCisjaW5jbHVkZSAib2N0ZW9uX21haW4uaCIKKworI2RlZmluZSBSRVNFVF9OT1RET05FIDAKKyNkZWZpbmUgUkVTRVRfRE9ORSAxCisKKy8qIENoYW5nZSB0aGUgdmFsdWUgb2YgU0xJIFBhY2tldCBJbnB1dCBKYWJiZXIgUmVnaXN0ZXIgdG8gYWxsb3cKKyAqIFZYTEFOIFRTTyBwYWNrZXRzIHdoaWNoIGNhbiBiZSA2NDQyNCBieXRlcywgZXhjZWVkaW5nIHRoZQorICogTUFYX0dTT19TSVpFIHdlIHN1cHBsaWVkIHRvIHRoZSBrZXJuZWwKKyAqLworI2RlZmluZSBDTjIzWFhfSU5QVVRfSkFCQkVSIDY0NjAwCisKKyNkZWZpbmUgTElPTFVUX1JJTkdfRElTVFJJQlVUSU9OIDkKK2NvbnN0IGludCBsaW9sdXRfbnVtX3Zmc190b19yaW5nc19wZXJfdmZbTElPTFVUX1JJTkdfRElTVFJJQlVUSU9OXSA9IHsKKwkwLCA4LCA0LCAyLCAyLCAyLCAxLCAxLCAxCit9OworCit2b2lkIGNuMjN4eF9kdW1wX3BmX2luaXRpYWxpemVkX3JlZ3Moc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKK3sKKwlpbnQgaSA9IDA7CisJdTMyIHJlZ3ZhbCA9IDA7CisJc3RydWN0IG9jdGVvbl9jbjIzeHhfcGYgKmNuMjN4eCA9IChzdHJ1Y3Qgb2N0ZW9uX2NuMjN4eF9wZiAqKW9jdC0+Y2hpcDsKKworCS8qSW4gY24yM3h4X3NvZnRfcmVzZXQqLworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXNbJWxseF0gOiAweCVsbHhcbiIsCisJCSJDTjIzWFhfV0lOX1dSX01BU0tfUkVHIiwgQ1ZNX0NBU1Q2NChDTjIzWFhfV0lOX1dSX01BU0tfUkVHKSwKKwkJQ1ZNX0NBU1Q2NChvY3Rlb25fcmVhZF9jc3I2NChvY3QsIENOMjNYWF9XSU5fV1JfTUFTS19SRUcpKSk7CisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlc1slbGx4XSA6IDB4JTAxNmxseFxuIiwKKwkJIkNOMjNYWF9TTElfU0NSQVRDSDEiLCBDVk1fQ0FTVDY0KENOMjNYWF9TTElfU0NSQVRDSDEpLAorCQlDVk1fQ0FTVDY0KG9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9TQ1JBVENIMSkpKTsKKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzWyVsbHhdIDogMHglMDE2bGx4XG4iLAorCQkiQ04yM1hYX1JTVF9TT0ZUX1JTVCIsIENOMjNYWF9SU1RfU09GVF9SU1QsCisJCWxpb19wY2lfcmVhZHEob2N0LCBDTjIzWFhfUlNUX1NPRlRfUlNUKSk7CisKKwkvKkluIGNuMjN4eF9zZXRfZHBpX3JlZ3MqLworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXNbJWxseF0gOiAweCUwMTZsbHhcbiIsCisJCSJDTjIzWFhfRFBJX0RNQV9DT05UUk9MIiwgQ04yM1hYX0RQSV9ETUFfQ09OVFJPTCwKKwkJbGlvX3BjaV9yZWFkcShvY3QsIENOMjNYWF9EUElfRE1BX0NPTlRST0wpKTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyglZClbJWxseF0gOiAweCUwMTZsbHhcbiIsCisJCQkiQ04yM1hYX0RQSV9ETUFfRU5HX0VOQiIsIGksCisJCQlDTjIzWFhfRFBJX0RNQV9FTkdfRU5CKGkpLAorCQkJbGlvX3BjaV9yZWFkcShvY3QsIENOMjNYWF9EUElfRE1BX0VOR19FTkIoaSkpKTsKKwkJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyglZClbJWxseF0gOiAweCUwMTZsbHhcbiIsCisJCQkiQ04yM1hYX0RQSV9ETUFfRU5HX0JVRiIsIGksCisJCQlDTjIzWFhfRFBJX0RNQV9FTkdfQlVGKGkpLAorCQkJbGlvX3BjaV9yZWFkcShvY3QsIENOMjNYWF9EUElfRE1BX0VOR19CVUYoaSkpKTsKKwl9CisKKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzWyVsbHhdIDogMHglMDE2bGx4XG4iLCAiQ04yM1hYX0RQSV9DVEwiLAorCQlDTjIzWFhfRFBJX0NUTCwgbGlvX3BjaV9yZWFkcShvY3QsIENOMjNYWF9EUElfQ1RMKSk7CisKKwkvKkluIGNuMjN4eF9zZXR1cF9wY2llX21wcyBhbmQgY24yM3h4X3NldHVwX3BjaWVfbXJycyAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChvY3QtPnBjaV9kZXYsIENOMjNYWF9DT05GSUdfUENJRV9ERVZDVEwsICZyZWd2YWwpOworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXNbJWxseF0gOiAweCUwMTZsbHhcbiIsCisJCSJDTjIzWFhfQ09ORklHX1BDSUVfREVWQ1RMIiwKKwkJQ1ZNX0NBU1Q2NChDTjIzWFhfQ09ORklHX1BDSUVfREVWQ1RMKSwgQ1ZNX0NBU1Q2NChyZWd2YWwpKTsKKworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMoJWQpWyVsbHhdIDogMHglMDE2bGx4XG4iLAorCQkiQ04yM1hYX0RQSV9TTElfUFJUWF9DRkciLCBvY3QtPnBjaWVfcG9ydCwKKwkJQ04yM1hYX0RQSV9TTElfUFJUWF9DRkcob2N0LT5wY2llX3BvcnQpLAorCQlsaW9fcGNpX3JlYWRxKG9jdCwgQ04yM1hYX0RQSV9TTElfUFJUWF9DRkcob2N0LT5wY2llX3BvcnQpKSk7CisKKwkvKkluIGNuMjN4eF9zcGVjaWZpY19yZWdzX3NldHVwICovCisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyglZClbJWxseF0gOiAweCUwMTZsbHhcbiIsCisJCSJDTjIzWFhfU0xJX1MyTV9QT1JUWF9DVEwiLCBvY3QtPnBjaWVfcG9ydCwKKwkJQ1ZNX0NBU1Q2NChDTjIzWFhfU0xJX1MyTV9QT1JUWF9DVEwob2N0LT5wY2llX3BvcnQpKSwKKwkJQ1ZNX0NBU1Q2NChvY3Rlb25fcmVhZF9jc3I2NCgKKwkJCW9jdCwgQ04yM1hYX1NMSV9TMk1fUE9SVFhfQ1RMKG9jdC0+cGNpZV9wb3J0KSkpKTsKKworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXNbJWxseF0gOiAweCUwMTZsbHhcbiIsCisJCSJDTjIzWFhfU0xJX1JJTkdfUlNUIiwgQ1ZNX0NBU1Q2NChDTjIzWFhfU0xJX1BLVF9JT1FfUklOR19SU1QpLAorCQkodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9QS1RfSU9RX1JJTkdfUlNUKSk7CisKKwkvKkluIGNuMjN4eF9zZXR1cF9nbG9iYWxfbWFjX3JlZ3MqLworCWZvciAoaSA9IDA7IGkgPCBDTjIzWFhfTUFYX01BQ1M7IGkrKykgeworCQlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzKCVkKVslbGx4XSA6IDB4JTAxNmxseFxuIiwKKwkJCSJDTjIzWFhfU0xJX1BLVF9NQUNfUklORk82NCIsIGksCisJCQlDVk1fQ0FTVDY0KENOMjNYWF9TTElfUEtUX01BQ19SSU5GTzY0KGksIG9jdC0+cGZfbnVtKSksCisJCQlDVk1fQ0FTVDY0KG9jdGVvbl9yZWFkX2NzcjY0CisJCQkJKG9jdCwgQ04yM1hYX1NMSV9QS1RfTUFDX1JJTkZPNjQKKwkJCQkJKGksIG9jdC0+cGZfbnVtKSkpKTsKKwl9CisKKwkvKkluIGNuMjN4eF9zZXR1cF9nbG9iYWxfaW5wdXRfcmVncyovCisJZm9yIChpID0gMDsgaSA8IENOMjNYWF9NQVhfSU5QVVRfUVVFVUVTOyBpKyspIHsKKwkJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyglZClbJWxseF0gOiAweCUwMTZsbHhcbiIsCisJCQkiQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTDY0IiwgaSwKKwkJCUNWTV9DQVNUNjQoQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTDY0KGkpKSwKKwkJCUNWTV9DQVNUNjQob2N0ZW9uX3JlYWRfY3NyNjQKKwkJCQkob2N0LCBDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MNjQoaSkpKSk7CisJfQorCisJLypJbiBjbjIzeHhfc2V0dXBfZ2xvYmFsX291dHB1dF9yZWdzKi8KKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzWyVsbHhdIDogMHglMDE2bGx4XG4iLAorCQkiQ04yM1hYX1NMSV9PUV9XTUFSSyIsIENWTV9DQVNUNjQoQ04yM1hYX1NMSV9PUV9XTUFSSyksCisJCUNWTV9DQVNUNjQob2N0ZW9uX3JlYWRfY3NyNjQob2N0LCBDTjIzWFhfU0xJX09RX1dNQVJLKSkpOworCisJZm9yIChpID0gMDsgaSA8IENOMjNYWF9NQVhfT1VUUFVUX1FVRVVFUzsgaSsrKSB7CisJCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMoJWQpWyVsbHhdIDogMHglMDE2bGx4XG4iLAorCQkJIkNOMjNYWF9TTElfT1FfUEtUX0NPTlRST0wiLCBpLAorCQkJQ1ZNX0NBU1Q2NChDTjIzWFhfU0xJX09RX1BLVF9DT05UUk9MKGkpKSwKKwkJCUNWTV9DQVNUNjQob2N0ZW9uX3JlYWRfY3NyKAorCQkJCW9jdCwgQ04yM1hYX1NMSV9PUV9QS1RfQ09OVFJPTChpKSkpKTsKKwkJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyglZClbJWxseF0gOiAweCUwMTZsbHhcbiIsCisJCQkiQ04yM1hYX1NMSV9PUV9QS1RfSU5UX0xFVkVMUyIsIGksCisJCQlDVk1fQ0FTVDY0KENOMjNYWF9TTElfT1FfUEtUX0lOVF9MRVZFTFMoaSkpLAorCQkJQ1ZNX0NBU1Q2NChvY3Rlb25fcmVhZF9jc3I2NCgKKwkJCQlvY3QsIENOMjNYWF9TTElfT1FfUEtUX0lOVF9MRVZFTFMoaSkpKSk7CisJfQorCisJLypJbiBjbjIzeHhfZW5hYmxlX2ludGVycnVwdCBhbmQgY24yM3h4X2Rpc2FibGVfaW50ZXJydXB0Ki8KKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzWyVsbHhdIDogMHglMDE2bGx4XG4iLAorCQkiY24yM3h4LT5pbnRyX2VuYl9yZWc2NCIsCisJCUNWTV9DQVNUNjQoKGxvbmcpKGNuMjN4eC0+aW50cl9lbmJfcmVnNjQpKSwKKwkJQ1ZNX0NBU1Q2NChyZWFkcShjbjIzeHgtPmludHJfZW5iX3JlZzY0KSkpOworCisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlc1slbGx4XSA6IDB4JTAxNmxseFxuIiwKKwkJImNuMjN4eC0+aW50cl9zdW1fcmVnNjQiLAorCQlDVk1fQ0FTVDY0KChsb25nKShjbjIzeHgtPmludHJfc3VtX3JlZzY0KSksCisJCUNWTV9DQVNUNjQocmVhZHEoY24yM3h4LT5pbnRyX3N1bV9yZWc2NCkpKTsKKworCS8qSW4gY24yM3h4X3NldHVwX2lxX3JlZ3MqLworCWZvciAoaSA9IDA7IGkgPCBDTjIzWFhfTUFYX0lOUFVUX1FVRVVFUzsgaSsrKSB7CisJCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMoJWQpWyVsbHhdIDogMHglMDE2bGx4XG4iLAorCQkJIkNOMjNYWF9TTElfSVFfQkFTRV9BRERSNjQiLCBpLAorCQkJQ1ZNX0NBU1Q2NChDTjIzWFhfU0xJX0lRX0JBU0VfQUREUjY0KGkpKSwKKwkJCUNWTV9DQVNUNjQob2N0ZW9uX3JlYWRfY3NyNjQoCisJCQkJb2N0LCBDTjIzWFhfU0xJX0lRX0JBU0VfQUREUjY0KGkpKSkpOworCQlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzKCVkKVslbGx4XSA6IDB4JTAxNmxseFxuIiwKKwkJCSJDTjIzWFhfU0xJX0lRX1NJWkUiLCBpLAorCQkJQ1ZNX0NBU1Q2NChDTjIzWFhfU0xJX0lRX1NJWkUoaSkpLAorCQkJQ1ZNX0NBU1Q2NChvY3Rlb25fcmVhZF9jc3IKKwkJCQkob2N0LCBDTjIzWFhfU0xJX0lRX1NJWkUoaSkpKSk7CisJCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMoJWQpWyVsbHhdIDogMHglMDE2bGx4XG4iLAorCQkJIkNOMjNYWF9TTElfSVFfRE9PUkJFTEwiLCBpLAorCQkJQ1ZNX0NBU1Q2NChDTjIzWFhfU0xJX0lRX0RPT1JCRUxMKGkpKSwKKwkJCUNWTV9DQVNUNjQob2N0ZW9uX3JlYWRfY3NyNjQoCisJCQkJb2N0LCBDTjIzWFhfU0xJX0lRX0RPT1JCRUxMKGkpKSkpOworCQlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzKCVkKVslbGx4XSA6IDB4JTAxNmxseFxuIiwKKwkJCSJDTjIzWFhfU0xJX0lRX0lOU1RSX0NPVU5UNjQiLCBpLAorCQkJQ1ZNX0NBU1Q2NChDTjIzWFhfU0xJX0lRX0lOU1RSX0NPVU5UNjQoaSkpLAorCQkJQ1ZNX0NBU1Q2NChvY3Rlb25fcmVhZF9jc3I2NCgKKwkJCQlvY3QsIENOMjNYWF9TTElfSVFfSU5TVFJfQ09VTlQ2NChpKSkpKTsKKwl9CisKKwkvKkluIGNuMjN4eF9zZXR1cF9vcV9yZWdzKi8KKwlmb3IgKGkgPSAwOyBpIDwgQ04yM1hYX01BWF9PVVRQVVRfUVVFVUVTOyBpKyspIHsKKwkJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyglZClbJWxseF0gOiAweCUwMTZsbHhcbiIsCisJCQkiQ04yM1hYX1NMSV9PUV9CQVNFX0FERFI2NCIsIGksCisJCQlDVk1fQ0FTVDY0KENOMjNYWF9TTElfT1FfQkFTRV9BRERSNjQoaSkpLAorCQkJQ1ZNX0NBU1Q2NChvY3Rlb25fcmVhZF9jc3I2NCgKKwkJCQlvY3QsIENOMjNYWF9TTElfT1FfQkFTRV9BRERSNjQoaSkpKSk7CisJCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMoJWQpWyVsbHhdIDogMHglMDE2bGx4XG4iLAorCQkJIkNOMjNYWF9TTElfT1FfU0laRSIsIGksCisJCQlDVk1fQ0FTVDY0KENOMjNYWF9TTElfT1FfU0laRShpKSksCisJCQlDVk1fQ0FTVDY0KG9jdGVvbl9yZWFkX2NzcgorCQkJCShvY3QsIENOMjNYWF9TTElfT1FfU0laRShpKSkpKTsKKwkJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyglZClbJWxseF0gOiAweCUwMTZsbHhcbiIsCisJCQkiQ04yM1hYX1NMSV9PUV9CVUZGX0lORk9fU0laRSIsIGksCisJCQlDVk1fQ0FTVDY0KENOMjNYWF9TTElfT1FfQlVGRl9JTkZPX1NJWkUoaSkpLAorCQkJQ1ZNX0NBU1Q2NChvY3Rlb25fcmVhZF9jc3IoCisJCQkJb2N0LCBDTjIzWFhfU0xJX09RX0JVRkZfSU5GT19TSVpFKGkpKSkpOworCQlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzKCVkKVslbGx4XSA6IDB4JTAxNmxseFxuIiwKKwkJCSJDTjIzWFhfU0xJX09RX1BLVFNfU0VOVCIsIGksCisJCQlDVk1fQ0FTVDY0KENOMjNYWF9TTElfT1FfUEtUU19TRU5UKGkpKSwKKwkJCUNWTV9DQVNUNjQob2N0ZW9uX3JlYWRfY3NyNjQoCisJCQkJb2N0LCBDTjIzWFhfU0xJX09RX1BLVFNfU0VOVChpKSkpKTsKKwkJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyglZClbJWxseF0gOiAweCUwMTZsbHhcbiIsCisJCQkiQ04yM1hYX1NMSV9PUV9QS1RTX0NSRURJVCIsIGksCisJCQlDVk1fQ0FTVDY0KENOMjNYWF9TTElfT1FfUEtUU19DUkVESVQoaSkpLAorCQkJQ1ZNX0NBU1Q2NChvY3Rlb25fcmVhZF9jc3I2NCgKKwkJCQlvY3QsIENOMjNYWF9TTElfT1FfUEtUU19DUkVESVQoaSkpKSk7CisJfQorCisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlc1slbGx4XSA6IDB4JTAxNmxseFxuIiwKKwkJIkNOMjNYWF9TTElfUEtUX1RJTUVfSU5UIiwKKwkJQ1ZNX0NBU1Q2NChDTjIzWFhfU0xJX1BLVF9USU1FX0lOVCksCisJCUNWTV9DQVNUNjQob2N0ZW9uX3JlYWRfY3NyNjQob2N0LCBDTjIzWFhfU0xJX1BLVF9USU1FX0lOVCkpKTsKKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzWyVsbHhdIDogMHglMDE2bGx4XG4iLAorCQkiQ04yM1hYX1NMSV9QS1RfQ05UX0lOVCIsCisJCUNWTV9DQVNUNjQoQ04yM1hYX1NMSV9QS1RfQ05UX0lOVCksCisJCUNWTV9DQVNUNjQob2N0ZW9uX3JlYWRfY3NyNjQob2N0LCBDTjIzWFhfU0xJX1BLVF9DTlRfSU5UKSkpOworfQorCitzdGF0aWMgaW50IGNuMjN4eF9wZl9zb2Z0X3Jlc2V0KHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCit7CisJb2N0ZW9uX3dyaXRlX2NzcjY0KG9jdCwgQ04yM1hYX1dJTl9XUl9NQVNLX1JFRywgMHhGRik7CisKKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIk9DVEVPTlslZF06IEJJU1QgZW5hYmxlZCBmb3IgQ04yM1hYIHNvZnQgcmVzZXRcbiIsCisJCW9jdC0+b2N0ZW9uX2lkKTsKKworCW9jdGVvbl93cml0ZV9jc3I2NChvY3QsIENOMjNYWF9TTElfU0NSQVRDSDEsIDB4MTIzNFVMTCk7CisKKwkvKiBJbml0aWF0ZSBjaGlwLXdpZGUgc29mdCByZXNldCAqLworCWxpb19wY2lfcmVhZHEob2N0LCBDTjIzWFhfUlNUX1NPRlRfUlNUKTsKKwlsaW9fcGNpX3dyaXRlcShvY3QsIDEsIENOMjNYWF9SU1RfU09GVF9SU1QpOworCisJLyogV2FpdCBmb3IgMTAwbXMgYXMgT2N0ZW9uIHJlc2V0cy4gKi8KKwltZGVsYXkoMTAwKTsKKworCWlmIChvY3Rlb25fcmVhZF9jc3I2NChvY3QsIENOMjNYWF9TTElfU0NSQVRDSDEpID09IDB4MTIzNFVMTCkgeworCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIk9DVEVPTlslZF06IFNvZnQgcmVzZXQgZmFpbGVkXG4iLAorCQkJb2N0LT5vY3Rlb25faWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIk9DVEVPTlslZF06IFJlc2V0IGNvbXBsZXRlZFxuIiwKKwkJb2N0LT5vY3Rlb25faWQpOworCisJLyogcmVzdG9yZSB0aGUgIHJlc2V0IHZhbHVlKi8KKwlvY3Rlb25fd3JpdGVfY3NyNjQob2N0LCBDTjIzWFhfV0lOX1dSX01BU0tfUkVHLCAweEZGKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjbjIzeHhfZW5hYmxlX2Vycm9yX3JlcG9ydGluZyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQoreworCXUzMiByZWd2YWw7CisJdTMyIHVuY29ycmVjdGFibGVfZXJyX21hc2ssIGNvcnJ0YWJsZV9lcnJfc3RhdHVzOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKG9jdC0+cGNpX2RldiwgQ04yM1hYX0NPTkZJR19QQ0lFX0RFVkNUTCwgJnJlZ3ZhbCk7CisJaWYgKHJlZ3ZhbCAmIENOMjNYWF9DT05GSUdfUENJRV9ERVZDVExfTUFTSykgeworCQl1bmNvcnJlY3RhYmxlX2Vycl9tYXNrID0gMDsKKwkJY29ycnRhYmxlX2Vycl9zdGF0dXMgPSAwOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQob2N0LT5wY2lfZGV2LAorCQkJCSAgICAgIENOMjNYWF9DT05GSUdfUENJRV9VTkNPUlJFQ1RfRVJSX01BU0ssCisJCQkJICAgICAgJnVuY29ycmVjdGFibGVfZXJyX21hc2spOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQob2N0LT5wY2lfZGV2LAorCQkJCSAgICAgIENOMjNYWF9DT05GSUdfUENJRV9DT1JSRUNUX0VSUl9TVEFUVVMsCisJCQkJICAgICAgJmNvcnJ0YWJsZV9lcnJfc3RhdHVzKTsKKwkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJQQ0ktRSBGYXRhbCBlcnJvciBkZXRlY3RlZDtcbiIKKwkJCQkgIlx0ZGV2X2N0bF9zdGF0dXNfcmVnID0gMHglMDh4XG4iCisJCQkJICJcdHVuY29ycmVjdGFibGVfZXJyb3JfbWFza19yZWcgPSAweCUwOHhcbiIKKwkJCQkgIlx0Y29ycmVjdGFibGVfZXJyb3Jfc3RhdHVzX3JlZyA9IDB4JTA4eFxuIiwKKwkJCSAgICByZWd2YWwsIHVuY29ycmVjdGFibGVfZXJyX21hc2ssCisJCQkgICAgY29ycnRhYmxlX2Vycl9zdGF0dXMpOworCX0KKworCXJlZ3ZhbCB8PSAweGY7IC8qIEVuYWJsZSBMaW5rIGVycm9yIHJlcG9ydGluZyAqLworCisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICJPQ1RFT05bJWRdOiBFbmFibGluZyBQQ0ktRSBlcnJvciByZXBvcnRpbmcuLlxuIiwKKwkJb2N0LT5vY3Rlb25faWQpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQob2N0LT5wY2lfZGV2LCBDTjIzWFhfQ09ORklHX1BDSUVfREVWQ1RMLCByZWd2YWwpOworfQorCitzdGF0aWMgdTMyIGNuMjN4eF9jb3Byb2Nlc3Nvcl9jbG9jayhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQoreworCS8qIEJpdHMgMjk6MjQgb2YgUlNUX0JPT1RbUE5SX01VTF0gaG9sZHMgdGhlIHJlZi5jbG9jayBNVUxUSVBMSUVSCisJICogZm9yIFNMSS4KKwkgKi8KKworCS8qIFRCRDogZ2V0IHRoZSBpbmZvIGluIEhhbmQtc2hha2UgKi8KKwlyZXR1cm4gKCgobGlvX3BjaV9yZWFkcShvY3QsIENOMjNYWF9SU1RfQk9PVCkgPj4gMjQpICYgMHgzZikgKiA1MCk7Cit9CisKK3UzMiBjbjIzeHhfcGZfZ2V0X29xX3RpY2tzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsIHUzMiB0aW1lX2ludHJfaW5fdXMpCit7CisJLyogVGhpcyBnaXZlcyB0aGUgU0xJIGNsb2NrIHBlciBtaWNyb3NlYyAqLworCXUzMiBvcXRpY2tzX3Blcl91cyA9IGNuMjN4eF9jb3Byb2Nlc3Nvcl9jbG9jayhvY3QpOworCisJb2N0LT5wZnZmX2hzd29yZC5jb3Byb2NfdGljc19wZXJfdXMgPSBvcXRpY2tzX3Blcl91czsKKworCS8qIFRoaXMgZ2l2ZXMgdGhlIGNsb2NrIGN5Y2xlcyBwZXIgbWlsbGlzZWNvbmQgKi8KKwlvcXRpY2tzX3Blcl91cyAqPSAxMDAwOworCisJLyogVGhpcyBnaXZlcyB0aGUgb3EgdGlja3MgKDEwMjQgY29yZSBjbG9jayBjeWNsZXMpIHBlciBtaWxsaXNlY29uZCAqLworCW9xdGlja3NfcGVyX3VzIC89IDEwMjQ7CisKKwkvKiB0aW1lX2ludHIgaXMgaW4gbWljcm9zZWNvbmRzLiBUaGUgbmV4dCAyIHN0ZXBzIGdpdmVzIHRoZSBvcSB0aWNrcworCSAqICBjb3JyZXNzcG9uZGluZyB0byB0aW1lX2ludHIuCisJICovCisJb3F0aWNrc19wZXJfdXMgKj0gdGltZV9pbnRyX2luX3VzOworCW9xdGlja3NfcGVyX3VzIC89IDEwMDA7CisKKwlyZXR1cm4gb3F0aWNrc19wZXJfdXM7Cit9CisKK3N0YXRpYyB2b2lkIGNuMjN4eF9zZXR1cF9nbG9iYWxfbWFjX3JlZ3Moc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKK3sKKwl1NjQgcmVnX3ZhbDsKKwl1MTYgbWFjX25vID0gb2N0LT5wY2llX3BvcnQ7CisJdTE2IHBmX251bSA9IG9jdC0+cGZfbnVtOworCisJLyogcHJvZ3JhbW1pbmcgU1JOIGFuZCBUUlMgZm9yIGVhY2ggTUFDKDAuLjMpICAqLworCisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlczpVc2luZyBwY2llIHBvcnQgJWRcbiIsCisJCV9fZnVuY19fLCBtYWNfbm8pOworCS8qIEJ5IGRlZmF1bHQsIG1hcHBpbmcgYWxsIDY0IElPUXMgdG8gIGEgc2luZ2xlIE1BQ3MgKi8KKworCXJlZ192YWwgPQorCSAgICBvY3Rlb25fcmVhZF9jc3I2NChvY3QsIENOMjNYWF9TTElfUEtUX01BQ19SSU5GTzY0KG1hY19ubywgcGZfbnVtKSk7CisKKwlpZiAob2N0LT5yZXZfaWQgPT0gT0NURU9OX0NOMjNYWF9SRVZfMV8xKSB7CisJCS8qIHNldHRpbmcgU1JOIDw2OjA+ICAqLworCQlyZWdfdmFsID0gcGZfbnVtICogQ04yM1hYX01BWF9SSU5HU19QRVJfUEZfUEFTU18xXzE7CisJfSBlbHNlIHsKKwkJLyogc2V0dGluZyBTUk4gPDY6MD4gICovCisJCXJlZ192YWwgPSBwZl9udW0gKiBDTjIzWFhfTUFYX1JJTkdTX1BFUl9QRjsKKwl9CisKKwkvKiBzZXR0aW5nIFRSUyA8MjM6MTY+ICovCisJcmVnX3ZhbCA9IHJlZ192YWwgfAorCQkgIChvY3QtPnNyaW92X2luZm8udHJzIDw8IENOMjNYWF9QS1RfTUFDX0NUTF9SSU5GT19UUlNfQklUX1BPUyk7CisJLyogd3JpdGUgdGhlc2Ugc2V0dGluZ3MgdG8gTUFDIHJlZ2lzdGVyICovCisJb2N0ZW9uX3dyaXRlX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9QS1RfTUFDX1JJTkZPNjQobWFjX25vLCBwZl9udW0pLAorCQkJICAgcmVnX3ZhbCk7CisKKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIlNMSV9QS1RfTUFDKCVkKV9QRiglZClfUklORk8gOiAweCUwMTZsbHhcbiIsCisJCW1hY19ubywgcGZfbnVtLCAodTY0KW9jdGVvbl9yZWFkX2NzcjY0CisJCShvY3QsIENOMjNYWF9TTElfUEtUX01BQ19SSU5GTzY0KG1hY19ubywgcGZfbnVtKSkpOworfQorCitzdGF0aWMgaW50IGNuMjN4eF9yZXNldF9pb19xdWV1ZXMoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKK3sKKwlpbnQgcmV0X3ZhbCA9IDA7CisJdTY0IGQ2NDsKKwl1MzIgcV9ubywgc3JuLCBlcm47CisJdTMyIGxvb3AgPSAxMDAwOworCisJc3JuID0gb2N0LT5zcmlvdl9pbmZvLnBmX3NybjsKKwllcm4gPSBzcm4gKyBvY3QtPnNyaW92X2luZm8ubnVtX3BmX3JpbmdzOworCisJLypBcyBwZXIgSFJNIHJlZyBkZXNjcmlwdGlvbiwgcy93IGNhbnQgd3JpdGUgMCB0byBFTkIuICovCisJLyp0byBtYWtlIHRoZSBxdWV1ZSBvZmYsIG5lZWQgdG8gc2V0IHRoZSBSU1QgYml0LiAqLworCisJLyogUmVzZXQgdGhlIEVuYWJsZSBiaXQgZm9yIGFsbCB0aGUgNjQgSVFzLiAgKi8KKwlmb3IgKHFfbm8gPSBzcm47IHFfbm8gPCBlcm47IHFfbm8rKykgeworCQkvKiBzZXQgUlNUIGJpdCB0byAxLiBUaGlzIGJpdCBhcHBsaWVzIHRvIGJvdGggSVEgYW5kIE9RICovCisJCWQ2NCA9IG9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTDY0KHFfbm8pKTsKKwkJZDY0ID0gZDY0IHwgQ04yM1hYX1BLVF9JTlBVVF9DVExfUlNUOworCQlvY3Rlb25fd3JpdGVfY3NyNjQob2N0LCBDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MNjQocV9ubyksIGQ2NCk7CisJfQorCisJLyp3YWl0IHVudGlsIHRoZSBSU1QgYml0IGlzIGNsZWFyIG9yIHRoZSBSU1QgYW5kIHF1aXRlIGJpdHMgYXJlIHNldCovCisJZm9yIChxX25vID0gc3JuOyBxX25vIDwgZXJuOyBxX25vKyspIHsKKwkJdTY0IHJlZ192YWwgPSBvY3Rlb25fcmVhZF9jc3I2NChvY3QsCisJCQkJCUNOMjNYWF9TTElfSVFfUEtUX0NPTlRST0w2NChxX25vKSk7CisJCXdoaWxlICgoUkVBRF9PTkNFKHJlZ192YWwpICYgQ04yM1hYX1BLVF9JTlBVVF9DVExfUlNUKSAmJgorCQkgICAgICAgIShSRUFEX09OQ0UocmVnX3ZhbCkgJiBDTjIzWFhfUEtUX0lOUFVUX0NUTF9RVUlFVCkgJiYKKwkJICAgICAgIGxvb3AtLSkgeworCQkJV1JJVEVfT05DRShyZWdfdmFsLCBvY3Rlb25fcmVhZF9jc3I2NCgKKwkJCSAgICBvY3QsIENOMjNYWF9TTElfSVFfUEtUX0NPTlRST0w2NChxX25vKSkpOworCQl9CisJCWlmICghbG9vcCkgeworCQkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsCisJCQkJImNsZWFyaW5nIHRoZSByZXNldCByZWcgZmFpbGVkIG9yIHNldHRpbmcgdGhlIHF1aWV0IHJlZyBmYWlsZWQgZm9yIHFubzogJXVcbiIsCisJCQkJcV9ubyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJV1JJVEVfT05DRShyZWdfdmFsLCBSRUFEX09OQ0UocmVnX3ZhbCkgJgorCQkJfkNOMjNYWF9QS1RfSU5QVVRfQ1RMX1JTVCk7CisJCW9jdGVvbl93cml0ZV9jc3I2NChvY3QsIENOMjNYWF9TTElfSVFfUEtUX0NPTlRST0w2NChxX25vKSwKKwkJCQkgICBSRUFEX09OQ0UocmVnX3ZhbCkpOworCisJCVdSSVRFX09OQ0UocmVnX3ZhbCwgb2N0ZW9uX3JlYWRfY3NyNjQoCisJCQkgICBvY3QsIENOMjNYWF9TTElfSVFfUEtUX0NPTlRST0w2NChxX25vKSkpOworCQlpZiAoUkVBRF9PTkNFKHJlZ192YWwpICYgQ04yM1hYX1BLVF9JTlBVVF9DVExfUlNUKSB7CisJCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwKKwkJCQkiY2xlYXJpbmcgdGhlIHJlc2V0IGZhaWxlZCBmb3IgcW5vOiAldVxuIiwKKwkJCQlxX25vKTsKKwkJCXJldF92YWwgPSAtMTsKKwkJfQorCX0KKworCXJldHVybiByZXRfdmFsOworfQorCitzdGF0aWMgaW50IGNuMjN4eF9wZl9zZXR1cF9nbG9iYWxfaW5wdXRfcmVncyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQoreworCXUzMiBxX25vLCBlcm4sIHNybjsKKwl1NjQgcGZfbnVtOworCXU2NCBpbnRyX3RocmVzaG9sZCwgcmVnX3ZhbDsKKwlzdHJ1Y3Qgb2N0ZW9uX2luc3RyX3F1ZXVlICppcTsKKwlzdHJ1Y3Qgb2N0ZW9uX2NuMjN4eF9wZiAqY24yM3h4ID0gKHN0cnVjdCBvY3Rlb25fY24yM3h4X3BmICopb2N0LT5jaGlwOworCisJcGZfbnVtID0gb2N0LT5wZl9udW07CisKKwlzcm4gPSBvY3QtPnNyaW92X2luZm8ucGZfc3JuOworCWVybiA9IHNybiArIG9jdC0+c3Jpb3ZfaW5mby5udW1fcGZfcmluZ3M7CisKKwlpZiAoY24yM3h4X3Jlc2V0X2lvX3F1ZXVlcyhvY3QpKQorCQlyZXR1cm4gLTE7CisKKwkvKiogU2V0IHRoZSBNQUNfTlVNIGFuZCBQVkZfTlVNIGluIElRX1BLVF9DT05UUk9MIHJlZworCSogZm9yIGFsbCBxdWV1ZXMuT25seSBQRiBjYW4gc2V0IHRoZXNlIGJpdHMuCisJKiBiaXRzIDI5OjMwIGluZGljYXRlIHRoZSBNQUMgbnVtLgorCSogYml0cyAzMjo0NyBpbmRpY2F0ZSB0aGUgUFZGIG51bS4KKwkqLworCWZvciAocV9ubyA9IDA7IHFfbm8gPCBlcm47IHFfbm8rKykgeworCQlyZWdfdmFsID0gb2N0LT5wY2llX3BvcnQgPDwgQ04yM1hYX1BLVF9JTlBVVF9DVExfTUFDX05VTV9QT1M7CisJCXJlZ192YWwgfD0gcGZfbnVtIDw8IENOMjNYWF9QS1RfSU5QVVRfQ1RMX1BGX05VTV9QT1M7CisKKwkJb2N0ZW9uX3dyaXRlX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTDY0KHFfbm8pLAorCQkJCSAgIHJlZ192YWwpOworCX0KKworCS8qIFNlbGVjdCBFUywgUk8sIE5TLCBSRFNJWkUsRFBUUiBGb21hdCMwIGZvcgorCSAqIHBmIHF1ZXVlcworCSAqLworCWZvciAocV9ubyA9IHNybjsgcV9ubyA8IGVybjsgcV9ubysrKSB7CisJCXZvaWQgX19pb21lbSAqaW5zdF9jbnRfcmVnOworCisJCWlxID0gb2N0LT5pbnN0cl9xdWV1ZVtxX25vXTsKKwkJaWYgKGlxKQorCQkJaW5zdF9jbnRfcmVnID0gaXEtPmluc3RfY250X3JlZzsKKwkJZWxzZQorCQkJaW5zdF9jbnRfcmVnID0gKHU4ICopb2N0LT5tbWlvWzBdLmh3X2FkZHIgKworCQkJCSAgICAgICBDTjIzWFhfU0xJX0lRX0lOU1RSX0NPVU5UNjQocV9ubyk7CisKKwkJcmVnX3ZhbCA9CisJCSAgICBvY3Rlb25fcmVhZF9jc3I2NChvY3QsIENOMjNYWF9TTElfSVFfUEtUX0NPTlRST0w2NChxX25vKSk7CisKKwkJcmVnX3ZhbCB8PSBDTjIzWFhfUEtUX0lOUFVUX0NUTF9NQVNLOworCisJCW9jdGVvbl93cml0ZV9jc3I2NChvY3QsIENOMjNYWF9TTElfSVFfUEtUX0NPTlRST0w2NChxX25vKSwKKwkJCQkgICByZWdfdmFsKTsKKworCQkvKiBTZXQgV01BUksgbGV2ZWwgZm9yIHRyaWdnZXJpbmcgUElfSU5UICovCisJCS8qIGludHJfdGhyZXNob2xkID0gQ04yM1hYX0RFRl9JUV9JTlRSX1RIUkVTSE9MRCAmICovCisJCWludHJfdGhyZXNob2xkID0gQ0ZHX0dFVF9JUV9JTlRSX1BLVChjbjIzeHgtPmNvbmYpICYKKwkJCQkgQ04yM1hYX1BLVF9JTl9ET05FX1dNQVJLX01BU0s7CisKKwkJd3JpdGVxKChyZWFkcShpbnN0X2NudF9yZWcpICYKKwkJCX4oQ04yM1hYX1BLVF9JTl9ET05FX1dNQVJLX01BU0sgPDwKKwkJCSAgQ04yM1hYX1BLVF9JTl9ET05FX1dNQVJLX0JJVF9QT1MpKSB8CisJCSAgICAgICAoaW50cl90aHJlc2hvbGQgPDwgQ04yM1hYX1BLVF9JTl9ET05FX1dNQVJLX0JJVF9QT1MpLAorCQkgICAgICAgaW5zdF9jbnRfcmVnKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNuMjN4eF9wZl9zZXR1cF9nbG9iYWxfb3V0cHV0X3JlZ3Moc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKK3sKKwl1MzIgcmVnX3ZhbDsKKwl1MzIgcV9ubywgZXJuLCBzcm47CisJdTY0IHRpbWVfdGhyZXNob2xkOworCisJc3RydWN0IG9jdGVvbl9jbjIzeHhfcGYgKmNuMjN4eCA9IChzdHJ1Y3Qgb2N0ZW9uX2NuMjN4eF9wZiAqKW9jdC0+Y2hpcDsKKworCXNybiA9IG9jdC0+c3Jpb3ZfaW5mby5wZl9zcm47CisJZXJuID0gc3JuICsgb2N0LT5zcmlvdl9pbmZvLm51bV9wZl9yaW5nczsKKworCWlmIChDRkdfR0VUX0lTX1NMSV9CUF9PTihjbjIzeHgtPmNvbmYpKSB7CisJCW9jdGVvbl93cml0ZV9jc3I2NChvY3QsIENOMjNYWF9TTElfT1FfV01BUkssIDMyKTsKKwl9IGVsc2UgeworCQkvKiogU2V0IE91dHB1dCBxdWV1ZSB3YXRlcm1hcmsgdG8gMCB0byBkaXNhYmxlIGJhY2twcmVzc3VyZSAqLworCQlvY3Rlb25fd3JpdGVfY3NyNjQob2N0LCBDTjIzWFhfU0xJX09RX1dNQVJLLCAwKTsKKwl9CisKKwlmb3IgKHFfbm8gPSBzcm47IHFfbm8gPCBlcm47IHFfbm8rKykgeworCQlyZWdfdmFsID0gb2N0ZW9uX3JlYWRfY3NyKG9jdCwgQ04yM1hYX1NMSV9PUV9QS1RfQ09OVFJPTChxX25vKSk7CisKKwkJLyogc2V0IElQVFIgJiBEUFRSICovCisJCXJlZ192YWwgfD0KKwkJICAgIChDTjIzWFhfUEtUX09VVFBVVF9DVExfSVBUUiB8IENOMjNYWF9QS1RfT1VUUFVUX0NUTF9EUFRSKTsKKworCQkvKiByZXNldCBCTU9ERSAqLworCQlyZWdfdmFsICY9IH4oQ04yM1hYX1BLVF9PVVRQVVRfQ1RMX0JNT0RFKTsKKworCQkvKiBObyBSZWxheGVkIE9yZGVyaW5nLCBObyBTbm9vcCwgNjQtYml0IEJ5dGUgc3dhcAorCQkgKiBmb3IgT3V0cHV0IFF1ZXVlIFNjYXR0ZXJMaXN0CisJCSAqIHJlc2V0IFJPUl9QLCBOU1JfUAorCQkgKi8KKwkJcmVnX3ZhbCAmPSB+KENOMjNYWF9QS1RfT1VUUFVUX0NUTF9ST1JfUCk7CisJCXJlZ192YWwgJj0gfihDTjIzWFhfUEtUX09VVFBVVF9DVExfTlNSX1ApOworCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxECisJCXJlZ192YWwgJj0gfihDTjIzWFhfUEtUX09VVFBVVF9DVExfRVNfUCk7CisjZWxzZQorCQlyZWdfdmFsIHw9IChDTjIzWFhfUEtUX09VVFBVVF9DVExfRVNfUCk7CisjZW5kaWYKKwkJLyogTm8gUmVsYXhlZCBPcmRlcmluZywgTm8gU25vb3AsIDY0LWJpdCBCeXRlIHN3YXAKKwkJICogZm9yIE91dHB1dCBRdWV1ZSBEYXRhCisJCSAqIHJlc2V0IFJPUiwgTlNSCisJCSAqLworCQlyZWdfdmFsICY9IH4oQ04yM1hYX1BLVF9PVVRQVVRfQ1RMX1JPUik7CisJCXJlZ192YWwgJj0gfihDTjIzWFhfUEtUX09VVFBVVF9DVExfTlNSKTsKKwkJLyogc2V0IHRoZSBFUyBiaXQgKi8KKwkJcmVnX3ZhbCB8PSAoQ04yM1hYX1BLVF9PVVRQVVRfQ1RMX0VTKTsKKworCQkvKiB3cml0ZSBhbGwgdGhlIHNlbGVjdGVkIHNldHRpbmdzICovCisJCW9jdGVvbl93cml0ZV9jc3Iob2N0LCBDTjIzWFhfU0xJX09RX1BLVF9DT05UUk9MKHFfbm8pLCByZWdfdmFsKTsKKworCQkvKiBFbmFibGluZyB0aGVzZSBpbnRlcnJ1cHQgaW4gb2N0LT5mbl9saXN0LmVuYWJsZV9pbnRlcnJ1cHQoKQorCQkgKiByb3V0aW5lIHdoaWNoIGNhbGxlZCBhZnRlciBJT1EgaW5pdC4KKwkJICogU2V0IHVwIGludGVycnVwdCBwYWNrZXQgYW5kIHRpbWUgdGhyZXNob2xkcworCQkgKiBmb3IgYWxsIHRoZSBPUXMKKwkJICovCisJCXRpbWVfdGhyZXNob2xkID0gY24yM3h4X3BmX2dldF9vcV90aWNrcygKKwkJICAgIG9jdCwgKHUzMilDRkdfR0VUX09RX0lOVFJfVElNRShjbjIzeHgtPmNvbmYpKTsKKworCQlvY3Rlb25fd3JpdGVfY3NyNjQob2N0LCBDTjIzWFhfU0xJX09RX1BLVF9JTlRfTEVWRUxTKHFfbm8pLAorCQkJCSAgIChDRkdfR0VUX09RX0lOVFJfUEtUKGNuMjN4eC0+Y29uZikgfAorCQkJCSAgICAodGltZV90aHJlc2hvbGQgPDwgMzIpKSk7CisJfQorCisJLyoqIFNldHRpbmcgdGhlIHdhdGVyIG1hcmsgbGV2ZWwgZm9yIHBrbyBiYWNrIHByZXNzdXJlICoqLworCXdyaXRlcSgweDQwLCAodTggKilvY3QtPm1taW9bMF0uaHdfYWRkciArIENOMjNYWF9TTElfT1FfV01BUkspOworCisJLyoqIERpc2FibGluZyBzZXR0aW5nIE9RcyBpbiByZXNldCB3aGVuIHJpbmcgaGFzIG5vIGRvcmViZWxscworCSAgKiBlbmFibGluZyB0aGlzIHdpbGwgY2F1c2Ugb2YgaGVhZCBvZiBsaW5lIGJsb2NraW5nCisJICAqLworCS8qIERvIGl0IG9ubHkgZm9yIHBhc3MxLjEuIGFuZCBwYXNzMS4yICovCisJaWYgKChvY3QtPnJldl9pZCA9PSBPQ1RFT05fQ04yM1hYX1JFVl8xXzApIHx8CisJICAgIChvY3QtPnJldl9pZCA9PSBPQ1RFT05fQ04yM1hYX1JFVl8xXzEpKQorCQl3cml0ZXEocmVhZHEoKHU4ICopb2N0LT5tbWlvWzBdLmh3X2FkZHIgKworCQkJCSAgICAgQ04yM1hYX1NMSV9HQkxfQ09OVFJPTCkgfCAweDIsCisJCSAgICAgICAodTggKilvY3QtPm1taW9bMF0uaHdfYWRkciArIENOMjNYWF9TTElfR0JMX0NPTlRST0wpOworCisJLyoqIEVuYWJsZSBjaGFubmVsLWxldmVsIGJhY2twcmVzc3VyZSAqLworCWlmIChvY3QtPnBmX251bSkKKwkJd3JpdGVxKDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCwKKwkJICAgICAgICh1OCAqKW9jdC0+bW1pb1swXS5od19hZGRyICsgQ04yM1hYX1NMSV9PVVRfQlBfRU4yX1cxUyk7CisJZWxzZQorCQl3cml0ZXEoMHhmZmZmZmZmZmZmZmZmZmZmVUxMLAorCQkgICAgICAgKHU4ICopb2N0LT5tbWlvWzBdLmh3X2FkZHIgKyBDTjIzWFhfU0xJX09VVF9CUF9FTl9XMVMpOworfQorCitzdGF0aWMgaW50IGNuMjN4eF9zZXR1cF9wZl9kZXZpY2VfcmVncyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQoreworCWNuMjN4eF9lbmFibGVfZXJyb3JfcmVwb3J0aW5nKG9jdCk7CisKKwkvKiBwcm9ncmFtIHRoZSBNQUMoMC4uMylfUklORk8gYmVmb3JlIHNldHRpbmcgdXAgaW5wdXQvb3V0cHV0IHJlZ3MgKi8KKwljbjIzeHhfc2V0dXBfZ2xvYmFsX21hY19yZWdzKG9jdCk7CisKKwlpZiAoY24yM3h4X3BmX3NldHVwX2dsb2JhbF9pbnB1dF9yZWdzKG9jdCkpCisJCXJldHVybiAtMTsKKworCWNuMjN4eF9wZl9zZXR1cF9nbG9iYWxfb3V0cHV0X3JlZ3Mob2N0KTsKKworCS8qIERlZmF1bHQgZXJyb3IgdGltZW91dCB2YWx1ZSBzaG91bGQgYmUgMHgyMDAwMDAgdG8gYXZvaWQgaG9zdCBoYW5nCisJICogd2hlbiByZWFkcyBpbnZhbGlkIHJlZ2lzdGVyCisJICovCisJb2N0ZW9uX3dyaXRlX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9XSU5ET1dfQ1RMLAorCQkJICAgQ04yM1hYX1NMSV9XSU5ET1dfQ1RMX0RFRkFVTFQpOworCisJLyogc2V0IFNMSV9QS1RfSU5fSkFCQkVSIHRvIGhhbmRsZSBsYXJnZSBWWExBTiBwYWNrZXRzICovCisJb2N0ZW9uX3dyaXRlX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9QS1RfSU5fSkFCQkVSLCBDTjIzWFhfSU5QVVRfSkFCQkVSKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY24yM3h4X3NldHVwX2lxX3JlZ3Moc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwgdTMyIGlxX25vKQoreworCXN0cnVjdCBvY3Rlb25faW5zdHJfcXVldWUgKmlxID0gb2N0LT5pbnN0cl9xdWV1ZVtpcV9ub107CisJdTY0IHBrdF9pbl9kb25lOworCisJaXFfbm8gKz0gb2N0LT5zcmlvdl9pbmZvLnBmX3NybjsKKworCS8qIFdyaXRlIHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgcXVldWUncyByaW5nIGFuZCBpdHMgc2l6ZSAgKi8KKwlvY3Rlb25fd3JpdGVfY3NyNjQob2N0LCBDTjIzWFhfU0xJX0lRX0JBU0VfQUREUjY0KGlxX25vKSwKKwkJCSAgIGlxLT5iYXNlX2FkZHJfZG1hKTsKKwlvY3Rlb25fd3JpdGVfY3NyKG9jdCwgQ04yM1hYX1NMSV9JUV9TSVpFKGlxX25vKSwgaXEtPm1heF9jb3VudCk7CisKKwkvKiBSZW1lbWJlciB0aGUgZG9vcmJlbGwgJiBpbnN0cnVjdGlvbiBjb3VudCByZWdpc3RlciBhZGRyCisJICogZm9yIHRoaXMgcXVldWUKKwkgKi8KKwlpcS0+ZG9vcmJlbGxfcmVnID0KKwkgICAgKHU4ICopb2N0LT5tbWlvWzBdLmh3X2FkZHIgKyBDTjIzWFhfU0xJX0lRX0RPT1JCRUxMKGlxX25vKTsKKwlpcS0+aW5zdF9jbnRfcmVnID0KKwkgICAgKHU4ICopb2N0LT5tbWlvWzBdLmh3X2FkZHIgKyBDTjIzWFhfU0xJX0lRX0lOU1RSX0NPVU5UNjQoaXFfbm8pOworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiSW5zdFFbJWRdOmRiZWxsIHJlZyBAIDB4JXAgaW5zdGNudF9yZWcgQCAweCVwXG4iLAorCQlpcV9ubywgaXEtPmRvb3JiZWxsX3JlZywgaXEtPmluc3RfY250X3JlZyk7CisKKwkvKiBTdG9yZSB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBjb3VudGVyICh1c2VkIGluIGZsdXNoX2lxCisJICogY2FsY3VsYXRpb24pCisJICovCisJcGt0X2luX2RvbmUgPSByZWFkcShpcS0+aW5zdF9jbnRfcmVnKTsKKworCWlmIChvY3QtPm1zaXhfb24pIHsKKwkJLyogU2V0IENJTlRfRU5CIHRvIGVuYWJsZSBJUSBpbnRlcnJ1cHQgICAqLworCQl3cml0ZXEoKHBrdF9pbl9kb25lIHwgQ04yM1hYX0lOVFJfQ0lOVF9FTkIpLAorCQkgICAgICAgaXEtPmluc3RfY250X3JlZyk7CisJfSBlbHNlIHsKKwkJLyogQ2xlYXIgdGhlIGNvdW50IGJ5IHdyaXRpbmcgYmFjayB3aGF0IHdlIHJlYWQsIGJ1dCBkb24ndAorCQkgKiBlbmFibGUgaW50ZXJydXB0cworCQkgKi8KKwkJd3JpdGVxKHBrdF9pbl9kb25lLCBpcS0+aW5zdF9jbnRfcmVnKTsKKwl9CisKKwlpcS0+cmVzZXRfaW5zdHJfY250ID0gMDsKK30KKworc3RhdGljIHZvaWQgY24yM3h4X3NldHVwX29xX3JlZ3Moc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwgdTMyIG9xX25vKQoreworCXUzMiByZWdfdmFsOworCXN0cnVjdCBvY3Rlb25fZHJvcSAqZHJvcSA9IG9jdC0+ZHJvcVtvcV9ub107CisJc3RydWN0IG9jdGVvbl9jbjIzeHhfcGYgKmNuMjN4eCA9IChzdHJ1Y3Qgb2N0ZW9uX2NuMjN4eF9wZiAqKW9jdC0+Y2hpcDsKKwl1NjQgdGltZV90aHJlc2hvbGQ7CisJdTY0IGNudF90aHJlc2hvbGQ7CisKKwlvcV9ubyArPSBvY3QtPnNyaW92X2luZm8ucGZfc3JuOworCisJb2N0ZW9uX3dyaXRlX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9PUV9CQVNFX0FERFI2NChvcV9ubyksCisJCQkgICBkcm9xLT5kZXNjX3JpbmdfZG1hKTsKKwlvY3Rlb25fd3JpdGVfY3NyKG9jdCwgQ04yM1hYX1NMSV9PUV9TSVpFKG9xX25vKSwgZHJvcS0+bWF4X2NvdW50KTsKKworCW9jdGVvbl93cml0ZV9jc3Iob2N0LCBDTjIzWFhfU0xJX09RX0JVRkZfSU5GT19TSVpFKG9xX25vKSwKKwkJCSAoZHJvcS0+YnVmZmVyX3NpemUgfCAoT0NUX1JIX1NJWkUgPDwgMTYpKSk7CisKKwkvKiBHZXQgdGhlIG1hcHBlZCBhZGRyZXNzIG9mIHRoZSBwa3Rfc2VudCBhbmQgcGt0c19jcmVkaXQgcmVncyAqLworCWRyb3EtPnBrdHNfc2VudF9yZWcgPQorCSAgICAodTggKilvY3QtPm1taW9bMF0uaHdfYWRkciArIENOMjNYWF9TTElfT1FfUEtUU19TRU5UKG9xX25vKTsKKwlkcm9xLT5wa3RzX2NyZWRpdF9yZWcgPQorCSAgICAodTggKilvY3QtPm1taW9bMF0uaHdfYWRkciArIENOMjNYWF9TTElfT1FfUEtUU19DUkVESVQob3Ffbm8pOworCisJaWYgKCFvY3QtPm1zaXhfb24pIHsKKwkJLyogRW5hYmxlIHRoaXMgb3V0cHV0IHF1ZXVlIHRvIGdlbmVyYXRlIFBhY2tldCBUaW1lciBJbnRlcnJ1cHQKKwkJICovCisJCXJlZ192YWwgPQorCQkgICAgb2N0ZW9uX3JlYWRfY3NyKG9jdCwgQ04yM1hYX1NMSV9PUV9QS1RfQ09OVFJPTChvcV9ubykpOworCQlyZWdfdmFsIHw9IENOMjNYWF9QS1RfT1VUUFVUX0NUTF9URU5COworCQlvY3Rlb25fd3JpdGVfY3NyKG9jdCwgQ04yM1hYX1NMSV9PUV9QS1RfQ09OVFJPTChvcV9ubyksCisJCQkJIHJlZ192YWwpOworCisJCS8qIEVuYWJsZSB0aGlzIG91dHB1dCBxdWV1ZSB0byBnZW5lcmF0ZSBQYWNrZXQgQ291bnQgSW50ZXJydXB0CisJCSAqLworCQlyZWdfdmFsID0KKwkJICAgIG9jdGVvbl9yZWFkX2NzcihvY3QsIENOMjNYWF9TTElfT1FfUEtUX0NPTlRST0wob3Ffbm8pKTsKKwkJcmVnX3ZhbCB8PSBDTjIzWFhfUEtUX09VVFBVVF9DVExfQ0VOQjsKKwkJb2N0ZW9uX3dyaXRlX2NzcihvY3QsIENOMjNYWF9TTElfT1FfUEtUX0NPTlRST0wob3Ffbm8pLAorCQkJCSByZWdfdmFsKTsKKwl9IGVsc2UgeworCQl0aW1lX3RocmVzaG9sZCA9IGNuMjN4eF9wZl9nZXRfb3FfdGlja3MoCisJCSAgICBvY3QsICh1MzIpQ0ZHX0dFVF9PUV9JTlRSX1RJTUUoY24yM3h4LT5jb25mKSk7CisJCWNudF90aHJlc2hvbGQgPSAodTMyKUNGR19HRVRfT1FfSU5UUl9QS1QoY24yM3h4LT5jb25mKTsKKworCQlvY3Rlb25fd3JpdGVfY3NyNjQoCisJCSAgICBvY3QsIENOMjNYWF9TTElfT1FfUEtUX0lOVF9MRVZFTFMob3Ffbm8pLAorCQkgICAgKCh0aW1lX3RocmVzaG9sZCA8PCAzMiB8IGNudF90aHJlc2hvbGQpKSk7CisJfQorfQorCitzdGF0aWMgaW50IGNuMjN4eF9lbmFibGVfaW9fcXVldWVzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCit7CisJdTY0IHJlZ192YWw7CisJdTMyIHNybiwgZXJuLCBxX25vOworCXUzMiBsb29wID0gMTAwMDsKKworCXNybiA9IG9jdC0+c3Jpb3ZfaW5mby5wZl9zcm47CisJZXJuID0gc3JuICsgb2N0LT5udW1faXFzOworCisJZm9yIChxX25vID0gc3JuOyBxX25vIDwgZXJuOyBxX25vKyspIHsKKwkJLyogc2V0IHRoZSBjb3JyZXNwb25kaW5nIElRIElTXzY0QiBiaXQgKi8KKwkJaWYgKG9jdC0+aW9fcW1hc2suaXE2NEIgJiBCSVRfVUxMKHFfbm8gLSBzcm4pKSB7CisJCQlyZWdfdmFsID0gb2N0ZW9uX3JlYWRfY3NyNjQoCisJCQkgICAgb2N0LCBDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MNjQocV9ubykpOworCQkJcmVnX3ZhbCA9IHJlZ192YWwgfCBDTjIzWFhfUEtUX0lOUFVUX0NUTF9JU182NEI7CisJCQlvY3Rlb25fd3JpdGVfY3NyNjQoCisJCQkgICAgb2N0LCBDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MNjQocV9ubyksIHJlZ192YWwpOworCQl9CisKKwkJLyogc2V0IHRoZSBjb3JyZXNwb25kaW5nIElRIEVOQiBiaXQgKi8KKwkJaWYgKG9jdC0+aW9fcW1hc2suaXEgJiBCSVRfVUxMKHFfbm8gLSBzcm4pKSB7CisJCQkvKiBJT1FzIGFyZSBpbiByZXNldCBieSBkZWZhdWx0IGluIFBFTTIgbW9kZSwKKwkJCSAqIGNsZWFyaW5nIHJlc2V0IGJpdAorCQkJICovCisJCQlyZWdfdmFsID0gb2N0ZW9uX3JlYWRfY3NyNjQoCisJCQkgICAgb2N0LCBDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MNjQocV9ubykpOworCisJCQlpZiAocmVnX3ZhbCAmIENOMjNYWF9QS1RfSU5QVVRfQ1RMX1JTVCkgeworCQkJCXdoaWxlICgocmVnX3ZhbCAmIENOMjNYWF9QS1RfSU5QVVRfQ1RMX1JTVCkgJiYKKwkJCQkgICAgICAgIShyZWdfdmFsICYKKwkJCQkJIENOMjNYWF9QS1RfSU5QVVRfQ1RMX1FVSUVUKSAmJgorCQkJCSAgICAgICBsb29wLS0pIHsKKwkJCQkJcmVnX3ZhbCA9IG9jdGVvbl9yZWFkX2NzcjY0KAorCQkJCQkgICAgb2N0LAorCQkJCQkgICAgQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTDY0KHFfbm8pKTsKKwkJCQl9CisJCQkJaWYgKCFsb29wKSB7CisJCQkJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LAorCQkJCQkJImNsZWFyaW5nIHRoZSByZXNldCByZWcgZmFpbGVkIG9yIHNldHRpbmcgdGhlIHF1aWV0IHJlZyBmYWlsZWQgZm9yIHFubzogJXVcbiIsCisJCQkJCQlxX25vKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlyZWdfdmFsID0gcmVnX3ZhbCAmIH5DTjIzWFhfUEtUX0lOUFVUX0NUTF9SU1Q7CisJCQkJb2N0ZW9uX3dyaXRlX2NzcjY0KAorCQkJCSAgICBvY3QsIENOMjNYWF9TTElfSVFfUEtUX0NPTlRST0w2NChxX25vKSwKKwkJCQkgICAgcmVnX3ZhbCk7CisKKwkJCQlyZWdfdmFsID0gb2N0ZW9uX3JlYWRfY3NyNjQoCisJCQkJICAgIG9jdCwgQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTDY0KHFfbm8pKTsKKwkJCQlpZiAocmVnX3ZhbCAmIENOMjNYWF9QS1RfSU5QVVRfQ1RMX1JTVCkgeworCQkJCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwKKwkJCQkJCSJjbGVhcmluZyB0aGUgcmVzZXQgZmFpbGVkIGZvciBxbm86ICV1XG4iLAorCQkJCQkJcV9ubyk7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQl9CisJCQlyZWdfdmFsID0gb2N0ZW9uX3JlYWRfY3NyNjQoCisJCQkgICAgb2N0LCBDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MNjQocV9ubykpOworCQkJcmVnX3ZhbCA9IHJlZ192YWwgfCBDTjIzWFhfUEtUX0lOUFVUX0NUTF9SSU5HX0VOQjsKKwkJCW9jdGVvbl93cml0ZV9jc3I2NCgKKwkJCSAgICBvY3QsIENOMjNYWF9TTElfSVFfUEtUX0NPTlRST0w2NChxX25vKSwgcmVnX3ZhbCk7CisJCX0KKwl9CisJZm9yIChxX25vID0gc3JuOyBxX25vIDwgZXJuOyBxX25vKyspIHsKKwkJdTMyIHJlZ192YWw7CisJCS8qIHNldCB0aGUgY29ycmVzcG9uZGluZyBPUSBFTkIgYml0ICovCisJCWlmIChvY3QtPmlvX3FtYXNrLm9xICYgQklUX1VMTChxX25vIC0gc3JuKSkgeworCQkJcmVnX3ZhbCA9IG9jdGVvbl9yZWFkX2NzcigKKwkJCSAgICBvY3QsIENOMjNYWF9TTElfT1FfUEtUX0NPTlRST0wocV9ubykpOworCQkJcmVnX3ZhbCA9IHJlZ192YWwgfCBDTjIzWFhfUEtUX09VVFBVVF9DVExfUklOR19FTkI7CisJCQlvY3Rlb25fd3JpdGVfY3NyKG9jdCwgQ04yM1hYX1NMSV9PUV9QS1RfQ09OVFJPTChxX25vKSwKKwkJCQkJIHJlZ192YWwpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjbjIzeHhfZGlzYWJsZV9pb19xdWV1ZXMoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKK3sKKwlpbnQgcV9ubywgbG9vcDsKKwl1NjQgZDY0OworCXUzMiBkMzI7CisJdTMyIHNybiwgZXJuOworCisJc3JuID0gb2N0LT5zcmlvdl9pbmZvLnBmX3NybjsKKwllcm4gPSBzcm4gKyBvY3QtPm51bV9pcXM7CisKKwkvKioqIERpc2FibGUgSW5wdXQgUXVldWVzLiAqKiovCisJZm9yIChxX25vID0gc3JuOyBxX25vIDwgZXJuOyBxX25vKyspIHsKKwkJbG9vcCA9IEhaOworCisJCS8qIHN0YXJ0IHRoZSBSZXNldCBmb3IgYSBwYXJ0aWN1bGFyIHJpbmcgKi8KKwkJV1JJVEVfT05DRShkNjQsIG9jdGVvbl9yZWFkX2NzcjY0KAorCQkJICAgb2N0LCBDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MNjQocV9ubykpKTsKKwkJV1JJVEVfT05DRShkNjQsIFJFQURfT05DRShkNjQpICYKKwkJCQkJKH4oQ04yM1hYX1BLVF9JTlBVVF9DVExfUklOR19FTkIpKSk7CisJCVdSSVRFX09OQ0UoZDY0LCBSRUFEX09OQ0UoZDY0KSB8IENOMjNYWF9QS1RfSU5QVVRfQ1RMX1JTVCk7CisJCW9jdGVvbl93cml0ZV9jc3I2NChvY3QsIENOMjNYWF9TTElfSVFfUEtUX0NPTlRST0w2NChxX25vKSwKKwkJCQkgICBSRUFEX09OQ0UoZDY0KSk7CisKKwkJLyogV2FpdCB1bnRpbCBoYXJkd2FyZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcGFydGljdWxhciBJUQorCQkgKiBpcyBvdXQgb2YgcmVzZXQuCisJCSAqLworCQlXUklURV9PTkNFKGQ2NCwgb2N0ZW9uX3JlYWRfY3NyNjQoCisJCQkJCW9jdCwgQ04yM1hYX1NMSV9QS1RfSU9RX1JJTkdfUlNUKSk7CisJCXdoaWxlICghKFJFQURfT05DRShkNjQpICYgQklUX1VMTChxX25vKSkgJiYgbG9vcC0tKSB7CisJCQlXUklURV9PTkNFKGQ2NCwgb2N0ZW9uX3JlYWRfY3NyNjQoCisJCQkJCW9jdCwgQ04yM1hYX1NMSV9QS1RfSU9RX1JJTkdfUlNUKSk7CisJCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKKwkJfQorCisJCS8qIFJlc2V0IHRoZSBkb29yYmVsbCByZWdpc3RlciBmb3IgdGhpcyBJbnB1dCBRdWV1ZS4gKi8KKwkJb2N0ZW9uX3dyaXRlX2NzcihvY3QsIENOMjNYWF9TTElfSVFfRE9PUkJFTEwocV9ubyksIDB4RkZGRkZGRkYpOworCQl3aGlsZSAob2N0ZW9uX3JlYWRfY3NyNjQob2N0LCBDTjIzWFhfU0xJX0lRX0RPT1JCRUxMKHFfbm8pKSAmJgorCQkgICAgICAgbG9vcC0tKSB7CisJCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKKwkJfQorCX0KKworCS8qKiogRGlzYWJsZSBPdXRwdXQgUXVldWVzLiAqKiovCisJZm9yIChxX25vID0gc3JuOyBxX25vIDwgZXJuOyBxX25vKyspIHsKKwkJbG9vcCA9IEhaOworCisJCS8qIFdhaXQgdW50aWwgaGFyZHdhcmUgaW5kaWNhdGVzIHRoYXQgdGhlIHBhcnRpY3VsYXIgSVEKKwkJICogaXMgb3V0IG9mIHJlc2V0Lkl0IGdpdmVuIHRoYXQgU0xJX1BLVF9SSU5HX1JTVCBpcworCQkgKiBjb21tb24gZm9yIGJvdGggSVFzIGFuZCBPUXMKKwkJICovCisJCVdSSVRFX09OQ0UoZDY0LCBvY3Rlb25fcmVhZF9jc3I2NCgKKwkJCQkJb2N0LCBDTjIzWFhfU0xJX1BLVF9JT1FfUklOR19SU1QpKTsKKwkJd2hpbGUgKCEoUkVBRF9PTkNFKGQ2NCkgJiBCSVRfVUxMKHFfbm8pKSAmJiBsb29wLS0pIHsKKwkJCVdSSVRFX09OQ0UoZDY0LCBvY3Rlb25fcmVhZF9jc3I2NCgKKwkJCQkJb2N0LCBDTjIzWFhfU0xJX1BLVF9JT1FfUklOR19SU1QpKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOworCQl9CisKKwkJLyogUmVzZXQgdGhlIGRvb3JiZWxsIHJlZ2lzdGVyIGZvciB0aGlzIE91dHB1dCBRdWV1ZS4gKi8KKwkJb2N0ZW9uX3dyaXRlX2NzcihvY3QsIENOMjNYWF9TTElfT1FfUEtUU19DUkVESVQocV9ubyksCisJCQkJIDB4RkZGRkZGRkYpOworCQl3aGlsZSAob2N0ZW9uX3JlYWRfY3NyNjQob2N0LAorCQkJCQkgQ04yM1hYX1NMSV9PUV9QS1RTX0NSRURJVChxX25vKSkgJiYKKwkJICAgICAgIGxvb3AtLSkgeworCQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CisJCX0KKworCQkvKiBjbGVhciB0aGUgU0xJX1BLVCgwLi42MylfQ05UU1tDTlRdIHJlZyB2YWx1ZSAqLworCQlXUklURV9PTkNFKGQzMiwgb2N0ZW9uX3JlYWRfY3NyKAorCQkJCQlvY3QsIENOMjNYWF9TTElfT1FfUEtUU19TRU5UKHFfbm8pKSk7CisJCW9jdGVvbl93cml0ZV9jc3Iob2N0LCBDTjIzWFhfU0xJX09RX1BLVFNfU0VOVChxX25vKSwKKwkJCQkgUkVBRF9PTkNFKGQzMikpOworCX0KK30KKworc3RhdGljIHU2NCBjbjIzeHhfcGZfbXNpeF9pbnRlcnJ1cHRfaGFuZGxlcih2b2lkICpkZXYpCit7CisJc3RydWN0IG9jdGVvbl9pb3FfdmVjdG9yICppb3FfdmVjdG9yID0gKHN0cnVjdCBvY3Rlb25faW9xX3ZlY3RvciAqKWRldjsKKwlzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0ID0gaW9xX3ZlY3Rvci0+b2N0X2RldjsKKwl1NjQgcGt0c19zZW50OworCXU2NCByZXQgPSAwOworCXN0cnVjdCBvY3Rlb25fZHJvcSAqZHJvcSA9IG9jdC0+ZHJvcVtpb3FfdmVjdG9yLT5kcm9xX2luZGV4XTsKKworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiSW4gJXMgb2N0ZW9uX2RldiBAICVwXG4iLCBfX2Z1bmNfXywgb2N0KTsKKworCWlmICghZHJvcSkgeworCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIjIzWFggYnJpbmd1cCBGSVhNRTogb2N0IHBmbnVtOiVkIGlvcV92ZWN0b3ItPmlvcV9udW0gOiVkIGRyb3EgaXMgTlVMTFxuIiwKKwkJCW9jdC0+cGZfbnVtLCBpb3FfdmVjdG9yLT5pb3FfbnVtKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcGt0c19zZW50ID0gcmVhZHEoZHJvcS0+cGt0c19zZW50X3JlZyk7CisKKwkvKiBJZiBvdXIgZGV2aWNlIGhhcyBpbnRlcnJ1cHRlZCwgdGhlbiBwcm9jZWVkLiBBbHNvIGNoZWNrCisJICogZm9yIGFsbCBmJ3MgaWYgaW50ZXJydXB0IHdhcyB0cmlnZ2VyZWQgb24gYW4gZXJyb3IKKwkgKiBhbmQgdGhlIFBDSSByZWFkIGZhaWxzLgorCSAqLworCWlmICghcGt0c19zZW50IHx8IChwa3RzX3NlbnQgPT0gMHhGRkZGRkZGRkZGRkZGRkZGVUxMKSkKKwkJcmV0dXJuIHJldDsKKworCS8qIFdyaXRlIGNvdW50IHJlZyBpbiBzbGlfcGt0X2NudHMgdG8gY2xlYXIgdGhlc2UgaW50LiovCisJaWYgKChwa3RzX3NlbnQgJiBDTjIzWFhfSU5UUl9QT19JTlQpIHx8CisJICAgIChwa3RzX3NlbnQgJiBDTjIzWFhfSU5UUl9QSV9JTlQpKSB7CisJCWlmIChwa3RzX3NlbnQgJiBDTjIzWFhfSU5UUl9QT19JTlQpCisJCQlyZXQgfD0gTVNJWF9QT19JTlQ7CisJfQorCisJaWYgKHBrdHNfc2VudCAmIENOMjNYWF9JTlRSX1BJX0lOVCkKKwkJLyogV2Ugd2lsbCBjbGVhciB0aGUgY291bnQgd2hlbiB3ZSB1cGRhdGUgdGhlIHJlYWRfaW5kZXguICovCisJCXJldCB8PSBNU0lYX1BJX0lOVDsKKworCS8qIE5ldmVyIG5lZWQgdG8gaGFuZGxlIG1zaXggbWJveCBpbnRyIGZvciBwZi4gVGhleSBhcnJpdmUgb24gdGhlIGxhc3QKKwkgKiBtc2l4CisJICovCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlycXJldHVybl90IGNuMjN4eF9pbnRlcnJ1cHRfaGFuZGxlcih2b2lkICpkZXYpCit7CisJc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCA9IChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqKWRldjsKKwlzdHJ1Y3Qgb2N0ZW9uX2NuMjN4eF9wZiAqY24yM3h4ID0gKHN0cnVjdCBvY3Rlb25fY24yM3h4X3BmICopb2N0LT5jaGlwOworCXU2NCBpbnRyNjQ7CisKKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIkluICVzIG9jdGVvbl9kZXYgQCAlcFxuIiwgX19mdW5jX18sIG9jdCk7CisJaW50cjY0ID0gcmVhZHEoY24yM3h4LT5pbnRyX3N1bV9yZWc2NCk7CisKKwlvY3QtPmludF9zdGF0dXMgPSAwOworCisJaWYgKGludHI2NCAmIENOMjNYWF9JTlRSX0VSUikKKwkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJPQ1RFT05bJWRdOiBFcnJvciBJbnRyOiAweCUwMTZsbHhcbiIsCisJCQlvY3QtPm9jdGVvbl9pZCwgQ1ZNX0NBU1Q2NChpbnRyNjQpKTsKKworCWlmIChvY3QtPm1zaXhfb24gIT0gTElPX0ZMQUdfTVNJWF9FTkFCTEVEKSB7CisJCWlmIChpbnRyNjQgJiBDTjIzWFhfSU5UUl9QS1RfREFUQSkKKwkJCW9jdC0+aW50X3N0YXR1cyB8PSBPQ1RfREVWX0lOVFJfUEtUX0RBVEE7CisJfQorCisJaWYgKGludHI2NCAmIChDTjIzWFhfSU5UUl9ETUEwX0ZPUkNFKSkKKwkJb2N0LT5pbnRfc3RhdHVzIHw9IE9DVF9ERVZfSU5UUl9ETUEwX0ZPUkNFOworCWlmIChpbnRyNjQgJiAoQ04yM1hYX0lOVFJfRE1BMV9GT1JDRSkpCisJCW9jdC0+aW50X3N0YXR1cyB8PSBPQ1RfREVWX0lOVFJfRE1BMV9GT1JDRTsKKworCS8qIENsZWFyIHRoZSBjdXJyZW50IGludGVycnVwdHMgKi8KKwl3cml0ZXEoaW50cjY0LCBjbjIzeHgtPmludHJfc3VtX3JlZzY0KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgY24yM3h4X2JhcjFfaWR4X3NldHVwKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsIHU2NCBjb3JlX2FkZHIsCisJCQkJICB1MzIgaWR4LCBpbnQgdmFsaWQpCit7CisJdTY0IGJhcjE7CisJdTY0IHJlZ19hZHI7CisKKwlpZiAoIXZhbGlkKSB7CisJCXJlZ19hZHIgPSBsaW9fcGNpX3JlYWRxKAorCQkJb2N0LCBDTjIzWFhfUEVNX0JBUjFfSU5ERVhfUkVHKG9jdC0+cGNpZV9wb3J0LCBpZHgpKTsKKwkJV1JJVEVfT05DRShiYXIxLCByZWdfYWRyKTsKKwkJbGlvX3BjaV93cml0ZXEob2N0LCAoUkVBRF9PTkNFKGJhcjEpICYgMHhGRkZGRkZGRVVMTCksCisJCQkgICAgICAgQ04yM1hYX1BFTV9CQVIxX0lOREVYX1JFRyhvY3QtPnBjaWVfcG9ydCwgaWR4KSk7CisJCXJlZ19hZHIgPSBsaW9fcGNpX3JlYWRxKAorCQkJb2N0LCBDTjIzWFhfUEVNX0JBUjFfSU5ERVhfUkVHKG9jdC0+cGNpZV9wb3J0LCBpZHgpKTsKKwkJV1JJVEVfT05DRShiYXIxLCByZWdfYWRyKTsKKwkJcmV0dXJuOworCX0KKworCS8qICBUaGUgUEVNKDAuLjMpX0JBUjFfSU5ERVgoMC4uMTUpW0FERFJfSURYXTwyMzo0PiBzdG9yZXMKKwkgKiAgYml0cyA8NDE6MjI+IG9mIHRoZSBDb3JlIEFkZHIKKwkgKi8KKwlsaW9fcGNpX3dyaXRlcShvY3QsICgoKGNvcmVfYWRkciA+PiAyMikgPDwgNCkgfCBQQ0lfQkFSMV9NQVNLKSwKKwkJICAgICAgIENOMjNYWF9QRU1fQkFSMV9JTkRFWF9SRUcob2N0LT5wY2llX3BvcnQsIGlkeCkpOworCisJV1JJVEVfT05DRShiYXIxLCBsaW9fcGNpX3JlYWRxKAorCQkgICBvY3QsIENOMjNYWF9QRU1fQkFSMV9JTkRFWF9SRUcob2N0LT5wY2llX3BvcnQsIGlkeCkpKTsKK30KKworc3RhdGljIHZvaWQgY24yM3h4X2JhcjFfaWR4X3dyaXRlKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsIHUzMiBpZHgsIHUzMiBtYXNrKQoreworCWxpb19wY2lfd3JpdGVxKG9jdCwgbWFzaywKKwkJICAgICAgIENOMjNYWF9QRU1fQkFSMV9JTkRFWF9SRUcob2N0LT5wY2llX3BvcnQsIGlkeCkpOworfQorCitzdGF0aWMgdTMyIGNuMjN4eF9iYXIxX2lkeF9yZWFkKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsIHUzMiBpZHgpCit7CisJcmV0dXJuICh1MzIpbGlvX3BjaV9yZWFkcSgKKwkgICAgb2N0LCBDTjIzWFhfUEVNX0JBUjFfSU5ERVhfUkVHKG9jdC0+cGNpZV9wb3J0LCBpZHgpKTsKK30KKworLyogYWx3YXlzIGNhbGwgd2l0aCBsb2NrIGhlbGQgKi8KK3N0YXRpYyB1MzIgY24yM3h4X3VwZGF0ZV9yZWFkX2luZGV4KHN0cnVjdCBvY3Rlb25faW5zdHJfcXVldWUgKmlxKQoreworCXUzMiBuZXdfaWR4OworCXUzMiBsYXN0X2RvbmU7CisJdTMyIHBrdF9pbl9kb25lID0gcmVhZGwoaXEtPmluc3RfY250X3JlZyk7CisKKwlsYXN0X2RvbmUgPSBwa3RfaW5fZG9uZSAtIGlxLT5wa3RfaW5fZG9uZTsKKwlpcS0+cGt0X2luX2RvbmUgPSBwa3RfaW5fZG9uZTsKKworCS8qIE1vZHVsbyBvZiB0aGUgbmV3IGluZGV4IHdpdGggdGhlIElRIHNpemUgd2lsbCBnaXZlIHVzCisJICogdGhlIG5ldyBpbmRleC4gIFRoZSBpcS0+cmVzZXRfaW5zdHJfY250IGlzIGFsd2F5cyB6ZXJvIGZvcgorCSAqIGNuMjN4eCwgc28gbm8gZXh0cmEgYWRqdXN0bWVudHMgYXJlIG5lZWRlZC4KKwkgKi8KKwluZXdfaWR4ID0gKGlxLT5vY3Rlb25fcmVhZF9pbmRleCArCisJCSAgICh1MzIpKGxhc3RfZG9uZSAmIENOMjNYWF9QS1RfSU5fRE9ORV9DTlRfTUFTSykpICUKKwkJICBpcS0+bWF4X2NvdW50OworCisJcmV0dXJuIG5ld19pZHg7Cit9CisKK3N0YXRpYyB2b2lkIGNuMjN4eF9lbmFibGVfcGZfaW50ZXJydXB0KHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsIHU4IGludHJfZmxhZykKK3sKKwlzdHJ1Y3Qgb2N0ZW9uX2NuMjN4eF9wZiAqY24yM3h4ID0gKHN0cnVjdCBvY3Rlb25fY24yM3h4X3BmICopb2N0LT5jaGlwOworCXU2NCBpbnRyX3ZhbCA9IDA7CisKKwkvKiAgRGl2aWRlIHRoZSBzaW5nbGUgd3JpdGUgdG8gbXVsdGlwbGUgd3JpdGVzIGJhc2VkIG9uIHRoZSBmbGFnLiAqLworCS8qIEVuYWJsZSBJbnRlcnJ1cHQgKi8KKwlpZiAoaW50cl9mbGFnID09IE9DVEVPTl9BTExfSU5UUikgeworCQl3cml0ZXEoY24yM3h4LT5pbnRyX21hc2s2NCwgY24yM3h4LT5pbnRyX2VuYl9yZWc2NCk7CisJfSBlbHNlIGlmIChpbnRyX2ZsYWcgJiBPQ1RFT05fT1VUUFVUX0lOVFIpIHsKKwkJaW50cl92YWwgPSByZWFkcShjbjIzeHgtPmludHJfZW5iX3JlZzY0KTsKKwkJaW50cl92YWwgfD0gQ04yM1hYX0lOVFJfUEtUX0RBVEE7CisJCXdyaXRlcShpbnRyX3ZhbCwgY24yM3h4LT5pbnRyX2VuYl9yZWc2NCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjbjIzeHhfZGlzYWJsZV9wZl9pbnRlcnJ1cHQoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwgdTggaW50cl9mbGFnKQoreworCXN0cnVjdCBvY3Rlb25fY24yM3h4X3BmICpjbjIzeHggPSAoc3RydWN0IG9jdGVvbl9jbjIzeHhfcGYgKilvY3QtPmNoaXA7CisJdTY0IGludHJfdmFsID0gMDsKKworCS8qIERpc2FibGUgSW50ZXJydXB0cyAqLworCWlmIChpbnRyX2ZsYWcgPT0gT0NURU9OX0FMTF9JTlRSKSB7CisJCXdyaXRlcSgwLCBjbjIzeHgtPmludHJfZW5iX3JlZzY0KTsKKwl9IGVsc2UgaWYgKGludHJfZmxhZyAmIE9DVEVPTl9PVVRQVVRfSU5UUikgeworCQlpbnRyX3ZhbCA9IHJlYWRxKGNuMjN4eC0+aW50cl9lbmJfcmVnNjQpOworCQlpbnRyX3ZhbCAmPSB+Q04yM1hYX0lOVFJfUEtUX0RBVEE7CisJCXdyaXRlcShpbnRyX3ZhbCwgY24yM3h4LT5pbnRyX2VuYl9yZWc2NCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjbjIzeHhfZ2V0X3BjaWVfcWxtcG9ydChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQoreworCW9jdC0+cGNpZV9wb3J0ID0gKG9jdGVvbl9yZWFkX2NzcihvY3QsIENOMjNYWF9TTElfTUFDX05VTUJFUikpICYgMHhmZjsKKworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiT0NURU9OOiBDTjIzeHggdXNlcyBQQ0lFIFBvcnQgJWRcbiIsCisJCW9jdC0+cGNpZV9wb3J0KTsKK30KKworc3RhdGljIHZvaWQgY24yM3h4X2dldF9wZl9udW0oc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKK3sKKwl1MzIgZmRsX2JpdCA9IDA7CisKKwkvKiogUmVhZCBGdW5jdGlvbiBEZXBlbmRlbmN5IExpbmsgcmVnIHRvIGdldCB0aGUgZnVuY3Rpb24gbnVtYmVyICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKG9jdC0+cGNpX2RldiwgQ04yM1hYX1BDSUVfU1JJT1ZfRkRMLCAmZmRsX2JpdCk7CisJb2N0LT5wZl9udW0gPSAoKGZkbF9iaXQgPj4gQ04yM1hYX1BDSUVfU1JJT1ZfRkRMX0JJVF9QT1MpICYKKwkJICAgICAgIENOMjNYWF9QQ0lFX1NSSU9WX0ZETF9NQVNLKTsKK30KKworc3RhdGljIHZvaWQgY24yM3h4X3NldHVwX3JlZ19hZGRyZXNzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCit7CisJdTggX19pb21lbSAqYmFyMF9wY2lhZGRyID0gb2N0LT5tbWlvWzBdLmh3X2FkZHI7CisJc3RydWN0IG9jdGVvbl9jbjIzeHhfcGYgKmNuMjN4eCA9IChzdHJ1Y3Qgb2N0ZW9uX2NuMjN4eF9wZiAqKW9jdC0+Y2hpcDsKKworCW9jdC0+cmVnX2xpc3QucGNpX3dpbl93cl9hZGRyX2hpID0KKwkgICAgKHUzMiBfX2lvbWVtICopKGJhcjBfcGNpYWRkciArIENOMjNYWF9XSU5fV1JfQUREUl9ISSk7CisJb2N0LT5yZWdfbGlzdC5wY2lfd2luX3dyX2FkZHJfbG8gPQorCSAgICAodTMyIF9faW9tZW0gKikoYmFyMF9wY2lhZGRyICsgQ04yM1hYX1dJTl9XUl9BRERSX0xPKTsKKwlvY3QtPnJlZ19saXN0LnBjaV93aW5fd3JfYWRkciA9CisJICAgICh1NjQgX19pb21lbSAqKShiYXIwX3BjaWFkZHIgKyBDTjIzWFhfV0lOX1dSX0FERFI2NCk7CisKKwlvY3QtPnJlZ19saXN0LnBjaV93aW5fcmRfYWRkcl9oaSA9CisJICAgICh1MzIgX19pb21lbSAqKShiYXIwX3BjaWFkZHIgKyBDTjIzWFhfV0lOX1JEX0FERFJfSEkpOworCW9jdC0+cmVnX2xpc3QucGNpX3dpbl9yZF9hZGRyX2xvID0KKwkgICAgKHUzMiBfX2lvbWVtICopKGJhcjBfcGNpYWRkciArIENOMjNYWF9XSU5fUkRfQUREUl9MTyk7CisJb2N0LT5yZWdfbGlzdC5wY2lfd2luX3JkX2FkZHIgPQorCSAgICAodTY0IF9faW9tZW0gKikoYmFyMF9wY2lhZGRyICsgQ04yM1hYX1dJTl9SRF9BRERSNjQpOworCisJb2N0LT5yZWdfbGlzdC5wY2lfd2luX3dyX2RhdGFfaGkgPQorCSAgICAodTMyIF9faW9tZW0gKikoYmFyMF9wY2lhZGRyICsgQ04yM1hYX1dJTl9XUl9EQVRBX0hJKTsKKwlvY3QtPnJlZ19saXN0LnBjaV93aW5fd3JfZGF0YV9sbyA9CisJICAgICh1MzIgX19pb21lbSAqKShiYXIwX3BjaWFkZHIgKyBDTjIzWFhfV0lOX1dSX0RBVEFfTE8pOworCW9jdC0+cmVnX2xpc3QucGNpX3dpbl93cl9kYXRhID0KKwkgICAgKHU2NCBfX2lvbWVtICopKGJhcjBfcGNpYWRkciArIENOMjNYWF9XSU5fV1JfREFUQTY0KTsKKworCW9jdC0+cmVnX2xpc3QucGNpX3dpbl9yZF9kYXRhX2hpID0KKwkgICAgKHUzMiBfX2lvbWVtICopKGJhcjBfcGNpYWRkciArIENOMjNYWF9XSU5fUkRfREFUQV9ISSk7CisJb2N0LT5yZWdfbGlzdC5wY2lfd2luX3JkX2RhdGFfbG8gPQorCSAgICAodTMyIF9faW9tZW0gKikoYmFyMF9wY2lhZGRyICsgQ04yM1hYX1dJTl9SRF9EQVRBX0xPKTsKKwlvY3QtPnJlZ19saXN0LnBjaV93aW5fcmRfZGF0YSA9CisJICAgICh1NjQgX19pb21lbSAqKShiYXIwX3BjaWFkZHIgKyBDTjIzWFhfV0lOX1JEX0RBVEE2NCk7CisKKwljbjIzeHhfZ2V0X3BjaWVfcWxtcG9ydChvY3QpOworCisJY24yM3h4LT5pbnRyX21hc2s2NCA9IENOMjNYWF9JTlRSX01BU0s7CisJaWYgKCFvY3QtPm1zaXhfb24pCisJCWNuMjN4eC0+aW50cl9tYXNrNjQgfD0gQ04yM1hYX0lOVFJfUEtUX1RJTUU7CisJaWYgKG9jdC0+cmV2X2lkID49IE9DVEVPTl9DTjIzWFhfUkVWXzFfMSkKKwkJY24yM3h4LT5pbnRyX21hc2s2NCB8PSBDTjIzWFhfSU5UUl9WRl9NQk9YOworCisJY24yM3h4LT5pbnRyX3N1bV9yZWc2NCA9CisJICAgIGJhcjBfcGNpYWRkciArCisJICAgIENOMjNYWF9TTElfTUFDX1BGX0lOVF9TVU02NChvY3QtPnBjaWVfcG9ydCwgb2N0LT5wZl9udW0pOworCWNuMjN4eC0+aW50cl9lbmJfcmVnNjQgPQorCSAgICBiYXIwX3BjaWFkZHIgKworCSAgICBDTjIzWFhfU0xJX01BQ19QRl9JTlRfRU5CNjQob2N0LT5wY2llX3BvcnQsIG9jdC0+cGZfbnVtKTsKK30KKworc3RhdGljIGludCBjbjIzeHhfc3Jpb3ZfY29uZmlnKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCit7CisJdTMyIHRvdGFsX3JpbmdzOworCXN0cnVjdCBvY3Rlb25fY24yM3h4X3BmICpjbjIzeHggPSAoc3RydWN0IG9jdGVvbl9jbjIzeHhfcGYgKilvY3QtPmNoaXA7CisJLyogbnVtX3ZmcyBpcyBhbHJlYWR5IGZpbGxlZCBmb3IgdXMgKi8KKwl1MzIgcGZfc3JuLCBudW1fcGZfcmluZ3M7CisKKwljbjIzeHgtPmNvbmYgPQorCSAgICAoc3RydWN0IG9jdGVvbl9jb25maWcgKilvY3RfZ2V0X2NvbmZpZ19pbmZvKG9jdCwgTElPXzIzWFgpOworCXN3aXRjaCAob2N0LT5yZXZfaWQpIHsKKwljYXNlIE9DVEVPTl9DTjIzWFhfUkVWXzFfMDoKKwkJdG90YWxfcmluZ3MgPSBDTjIzWFhfTUFYX1JJTkdTX1BFUl9QRl9QQVNTXzFfMDsKKwkJYnJlYWs7CisJY2FzZSBPQ1RFT05fQ04yM1hYX1JFVl8xXzE6CisJCXRvdGFsX3JpbmdzID0gQ04yM1hYX01BWF9SSU5HU19QRVJfUEZfUEFTU18xXzE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXRvdGFsX3JpbmdzID0gQ04yM1hYX01BWF9SSU5HU19QRVJfUEY7CisJCWJyZWFrOworCX0KKwlpZiAoIW9jdC0+c3Jpb3ZfaW5mby5udW1fcGZfcmluZ3MpIHsKKwkJaWYgKHRvdGFsX3JpbmdzID4gbnVtX3ByZXNlbnRfY3B1cygpKQorCQkJbnVtX3BmX3JpbmdzID0gbnVtX3ByZXNlbnRfY3B1cygpOworCQllbHNlCisJCQludW1fcGZfcmluZ3MgPSB0b3RhbF9yaW5nczsKKwl9IGVsc2UgeworCQludW1fcGZfcmluZ3MgPSBvY3QtPnNyaW92X2luZm8ubnVtX3BmX3JpbmdzOworCisJCWlmIChudW1fcGZfcmluZ3MgPiB0b3RhbF9yaW5ncykgeworCQkJZGV2X3dhcm4oJm9jdC0+cGNpX2Rldi0+ZGV2LAorCQkJCSAibnVtX3F1ZXVlc19wZXJfcGYgcmVxdWVzdGVkICV1IGlzIG1vcmUgdGhhbiBhdmFpbGFibGUgcmluZ3MuIFJlZHVjaW5nIHRvICV1XG4iLAorCQkJCSBudW1fcGZfcmluZ3MsIHRvdGFsX3JpbmdzKTsKKwkJCW51bV9wZl9yaW5ncyA9IHRvdGFsX3JpbmdzOworCQl9CisJfQorCisJdG90YWxfcmluZ3MgPSBudW1fcGZfcmluZ3M7CisJLyogdGhlIGZpcnN0IHJpbmcgb2YgdGhlIHBmICovCisJcGZfc3JuID0gdG90YWxfcmluZ3MgLSBudW1fcGZfcmluZ3M7CisKKwlvY3QtPnNyaW92X2luZm8udHJzID0gdG90YWxfcmluZ3M7CisJb2N0LT5zcmlvdl9pbmZvLnBmX3NybiA9IHBmX3NybjsKKwlvY3QtPnNyaW92X2luZm8ubnVtX3BmX3JpbmdzID0gbnVtX3BmX3JpbmdzOworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAidHJzOiVkIHBmX3NybjolZCBudW1fcGZfcmluZ3M6JWRcbiIsCisJCW9jdC0+c3Jpb3ZfaW5mby50cnMsIG9jdC0+c3Jpb3ZfaW5mby5wZl9zcm4sCisJCW9jdC0+c3Jpb3ZfaW5mby5udW1fcGZfcmluZ3MpOworCXJldHVybiAwOworfQorCitpbnQgc2V0dXBfY24yM3h4X29jdGVvbl9wZl9kZXZpY2Uoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKK3sKKwlpZiAob2N0ZW9uX21hcF9wY2lfYmFyeChvY3QsIDAsIDApKQorCQlyZXR1cm4gMTsKKworCWlmIChvY3Rlb25fbWFwX3BjaV9iYXJ4KG9jdCwgMSwgTUFYX0JBUjFfSU9SRU1BUF9TSVpFKSkgeworCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzIENOMjNYWCBCQVIxIG1hcCBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCW9jdGVvbl91bm1hcF9wY2lfYmFyeChvY3QsIDApOworCQlyZXR1cm4gMTsKKwl9CisKKwljbjIzeHhfZ2V0X3BmX251bShvY3QpOworCisJaWYgKGNuMjN4eF9zcmlvdl9jb25maWcob2N0KSkgeworCQlvY3Rlb25fdW5tYXBfcGNpX2Jhcngob2N0LCAwKTsKKwkJb2N0ZW9uX3VubWFwX3BjaV9iYXJ4KG9jdCwgMSk7CisJCXJldHVybiAxOworCX0KKworCW9jdGVvbl93cml0ZV9jc3I2NChvY3QsIENOMjNYWF9TTElfTUFDX0NSRURJVF9DTlQsIDB4M0Y4MDIwODA4MDIwODBVTEwpOworCisJb2N0LT5mbl9saXN0LnNldHVwX2lxX3JlZ3MgPSBjbjIzeHhfc2V0dXBfaXFfcmVnczsKKwlvY3QtPmZuX2xpc3Quc2V0dXBfb3FfcmVncyA9IGNuMjN4eF9zZXR1cF9vcV9yZWdzOworCW9jdC0+Zm5fbGlzdC5wcm9jZXNzX2ludGVycnVwdF9yZWdzID0gY24yM3h4X2ludGVycnVwdF9oYW5kbGVyOworCW9jdC0+Zm5fbGlzdC5tc2l4X2ludGVycnVwdF9oYW5kbGVyID0gY24yM3h4X3BmX21zaXhfaW50ZXJydXB0X2hhbmRsZXI7CisKKwlvY3QtPmZuX2xpc3Quc29mdF9yZXNldCA9IGNuMjN4eF9wZl9zb2Z0X3Jlc2V0OworCW9jdC0+Zm5fbGlzdC5zZXR1cF9kZXZpY2VfcmVncyA9IGNuMjN4eF9zZXR1cF9wZl9kZXZpY2VfcmVnczsKKwlvY3QtPmZuX2xpc3QudXBkYXRlX2lxX3JlYWRfaWR4ID0gY24yM3h4X3VwZGF0ZV9yZWFkX2luZGV4OworCisJb2N0LT5mbl9saXN0LmJhcjFfaWR4X3NldHVwID0gY24yM3h4X2JhcjFfaWR4X3NldHVwOworCW9jdC0+Zm5fbGlzdC5iYXIxX2lkeF93cml0ZSA9IGNuMjN4eF9iYXIxX2lkeF93cml0ZTsKKwlvY3QtPmZuX2xpc3QuYmFyMV9pZHhfcmVhZCA9IGNuMjN4eF9iYXIxX2lkeF9yZWFkOworCisJb2N0LT5mbl9saXN0LmVuYWJsZV9pbnRlcnJ1cHQgPSBjbjIzeHhfZW5hYmxlX3BmX2ludGVycnVwdDsKKwlvY3QtPmZuX2xpc3QuZGlzYWJsZV9pbnRlcnJ1cHQgPSBjbjIzeHhfZGlzYWJsZV9wZl9pbnRlcnJ1cHQ7CisKKwlvY3QtPmZuX2xpc3QuZW5hYmxlX2lvX3F1ZXVlcyA9IGNuMjN4eF9lbmFibGVfaW9fcXVldWVzOworCW9jdC0+Zm5fbGlzdC5kaXNhYmxlX2lvX3F1ZXVlcyA9IGNuMjN4eF9kaXNhYmxlX2lvX3F1ZXVlczsKKworCWNuMjN4eF9zZXR1cF9yZWdfYWRkcmVzcyhvY3QpOworCisJb2N0LT5jb3Byb2NfY2xvY2tfcmF0ZSA9IDEwMDAwMDBVTEwgKiBjbjIzeHhfY29wcm9jZXNzb3JfY2xvY2sob2N0KTsKKworCXJldHVybiAwOworfQorCitpbnQgdmFsaWRhdGVfY24yM3h4X3BmX2NvbmZpZ19pbmZvKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsCisJCQkJICAgc3RydWN0IG9jdGVvbl9jb25maWcgKmNvbmYyM3h4KQoreworCWlmIChDRkdfR0VUX0lRX01BWF9RKGNvbmYyM3h4KSA+IENOMjNYWF9NQVhfSU5QVVRfUVVFVUVTKSB7CisJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXM6IE51bSBJUSAoJWQpIGV4Y2VlZHMgTWF4ICglZClcbiIsCisJCQlfX2Z1bmNfXywgQ0ZHX0dFVF9JUV9NQVhfUShjb25mMjN4eCksCisJCQlDTjIzWFhfTUFYX0lOUFVUX1FVRVVFUyk7CisJCXJldHVybiAxOworCX0KKworCWlmIChDRkdfR0VUX09RX01BWF9RKGNvbmYyM3h4KSA+IENOMjNYWF9NQVhfT1VUUFVUX1FVRVVFUykgeworCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzOiBOdW0gT1EgKCVkKSBleGNlZWRzIE1heCAoJWQpXG4iLAorCQkJX19mdW5jX18sIENGR19HRVRfT1FfTUFYX1EoY29uZjIzeHgpLAorCQkJQ04yM1hYX01BWF9PVVRQVVRfUVVFVUVTKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKENGR19HRVRfSVFfSU5TVFJfVFlQRShjb25mMjN4eCkgIT0gT0NURU9OXzMyQllURV9JTlNUUiAmJgorCSAgICBDRkdfR0VUX0lRX0lOU1RSX1RZUEUoY29uZjIzeHgpICE9IE9DVEVPTl82NEJZVEVfSU5TVFIpIHsKKwkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICIlczogSW52YWxpZCBpbnN0ciB0eXBlIGZvciBJUVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCEoQ0ZHX0dFVF9PUV9JTkZPX1BUUihjb25mMjN4eCkpIHx8CisJICAgICEoQ0ZHX0dFVF9PUV9SRUZJTExfVEhSRVNIT0xEKGNvbmYyM3h4KSkpIHsKKwkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICIlczogSW52YWxpZCBwYXJhbWV0ZXIgZm9yIE9RXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIShDRkdfR0VUX09RX0lOVFJfVElNRShjb25mMjN4eCkpKSB7CisJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXM6IEludmFsaWQgcGFyYW1ldGVyIGZvciBPUVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY24yM3h4X2R1bXBfaXFfcmVncyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQoreworCXUzMiByZWd2YWwsIHFfbm87CisKKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIlNMSV9JUV9ET09SQkVMTF8wIFsweCV4XTogMHglMDE2bGx4XG4iLAorCQlDTjIzWFhfU0xJX0lRX0RPT1JCRUxMKDApLAorCQlDVk1fQ0FTVDY0KG9jdGVvbl9yZWFkX2NzcjY0CisJCQkob2N0LCBDTjIzWFhfU0xJX0lRX0RPT1JCRUxMKDApKSkpOworCisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICJTTElfSVFfQkFTRUFERFJfMCBbMHgleF06IDB4JTAxNmxseFxuIiwKKwkJQ04yM1hYX1NMSV9JUV9CQVNFX0FERFI2NCgwKSwKKwkJQ1ZNX0NBU1Q2NChvY3Rlb25fcmVhZF9jc3I2NAorCQkJKG9jdCwgQ04yM1hYX1NMSV9JUV9CQVNFX0FERFI2NCgwKSkpKTsKKworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiU0xJX0lRX0ZJRk9fUlNJWkVfMCBbMHgleF06IDB4JTAxNmxseFxuIiwKKwkJQ04yM1hYX1NMSV9JUV9TSVpFKDApLAorCQlDVk1fQ0FTVDY0KG9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9JUV9TSVpFKDApKSkpOworCisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICJTTElfQ1RMX1NUQVRVUyBbMHgleF06IDB4JTAxNmxseFxuIiwKKwkJQ04yM1hYX1NMSV9DVExfU1RBVFVTLAorCQlDVk1fQ0FTVDY0KG9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9DVExfU1RBVFVTKSkpOworCisJZm9yIChxX25vID0gMDsgcV9ubyA8IENOMjNYWF9NQVhfSU5QVVRfUVVFVUVTOyBxX25vKyspIHsKKwkJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICJTTElfUEtUWyVkXV9JTlBVVF9DVEwgWzB4JXhdOiAweCUwMTZsbHhcbiIsCisJCQlxX25vLCBDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MNjQocV9ubyksCisJCQlDVk1fQ0FTVDY0KG9jdGVvbl9yZWFkX2NzcjY0CisJCQkJKG9jdCwKKwkJCQkJQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTDY0KHFfbm8pKSkpOworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChvY3QtPnBjaV9kZXYsIENOMjNYWF9DT05GSUdfUENJRV9ERVZDVEwsICZyZWd2YWwpOworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiQ29uZmlnIERldkN0bCBbMHgleF06IDB4JTA4eFxuIiwKKwkJQ04yM1hYX0NPTkZJR19QQ0lFX0RFVkNUTCwgcmVndmFsKTsKKworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiU0xJX1BSVFslZF1fQ0ZHIFsweCVsbHhdOiAweCUwMTZsbHhcbiIsCisJCW9jdC0+cGNpZV9wb3J0LCBDTjIzWFhfRFBJX1NMSV9QUlRYX0NGRyhvY3QtPnBjaWVfcG9ydCksCisJCUNWTV9DQVNUNjQobGlvX3BjaV9yZWFkcSgKKwkJCW9jdCwgQ04yM1hYX0RQSV9TTElfUFJUWF9DRkcob2N0LT5wY2llX3BvcnQpKSkpOworCisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICJTTElfUzJNX1BPUlRbJWRdX0NUTCBbMHgleF06IDB4JTAxNmxseFxuIiwKKwkJb2N0LT5wY2llX3BvcnQsIENOMjNYWF9TTElfUzJNX1BPUlRYX0NUTChvY3QtPnBjaWVfcG9ydCksCisJCUNWTV9DQVNUNjQob2N0ZW9uX3JlYWRfY3NyNjQoCisJCQlvY3QsIENOMjNYWF9TTElfUzJNX1BPUlRYX0NUTChvY3QtPnBjaWVfcG9ydCkpKSk7Cit9CisKK2ludCBjbjIzeHhfZndfbG9hZGVkKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCit7CisJdTY0IHZhbDsKKworCXZhbCA9IG9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9TQ1JBVENIMSk7CisJcmV0dXJuICh2YWwgPj4gMSkgJiAxVUxMOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2NuMjN4eF9wZl9kZXZpY2UuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9jbjIzeHhfcGZfZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFiNWM5MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9jbjIzeHhfcGZfZGV2aWNlLmgKQEAgLTAsMCArMSw1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQXV0aG9yOiBDYXZpdW0sIEluYy4KKyoKKyogQ29udGFjdDogc3VwcG9ydEBjYXZpdW0uY29tCisqICAgICAgICAgIFBsZWFzZSBpbmNsdWRlICJMaXF1aWRJTyIgaW4gdGhlIHN1YmplY3QuCisqCisqIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENhdml1bSwgSW5jLgorKgorKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDIsIGFzCisqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKgorKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisqIEFTLUlTIGFuZCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUsIG9yCisqIE5PTklORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyogZGV0YWlscy4KKyoKKyogVGhpcyBmaWxlIG1heSBhbHNvIGJlIGF2YWlsYWJsZSB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlIGZyb20gQ2F2aXVtLgorKiBDb250YWN0IENhdml1bSwgSW5jLiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyohIFxmaWxlICBjbjIzeHhfZGV2aWNlLmgKKyAqIFxicmllZiBIb3N0IERyaXZlcjogUm91dGluZXMgdGhhdCBwZXJmb3JtIENOMjNYWCBzcGVjaWZpYyBvcGVyYXRpb25zLgorKi8KKworI2lmbmRlZiBfX0NOMjNYWF9QRl9ERVZJQ0VfSF9fCisjZGVmaW5lIF9fQ04yM1hYX1BGX0RFVklDRV9IX18KKworI2luY2x1ZGUgImNuMjN4eF9wZl9yZWdzLmgiCisKKy8qIFJlZ2lzdGVyIGFkZHJlc3MgYW5kIGNvbmZpZ3VyYXRpb24gZm9yIGEgQ04yM1hYIGRldmljZXMuCisgKiBJZiBkZXZpY2Ugc3BlY2lmaWMgY2hhbmdlcyBuZWVkIHRvIGJlIG1hZGUgdGhlbiBhZGQgYSBzdHJ1Y3QgdG8gaW5jbHVkZQorICogZGV2aWNlIHNwZWNpZmljIGZpZWxkcyBhcyBzaG93biBpbiB0aGUgY29tbWVudGVkIHNlY3Rpb24KKyAqLworc3RydWN0IG9jdGVvbl9jbjIzeHhfcGYgeworCS8qKiBQQ0kgaW50ZXJydXB0IHN1bW1hcnkgcmVnaXN0ZXIgKi8KKwl1OCBfX2lvbWVtICppbnRyX3N1bV9yZWc2NDsKKworCS8qKiBQQ0kgaW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciAqLworCXU4IF9faW9tZW0gKmludHJfZW5iX3JlZzY0OworCisJLyoqIFRoZSBQQ0kgaW50ZXJydXB0IG1hc2sgdXNlZCBieSBpbnRlcnJ1cHQgaGFuZGxlciAqLworCXU2NCBpbnRyX21hc2s2NDsKKworCXN0cnVjdCBvY3Rlb25fY29uZmlnICpjb25mOworfTsKKworaW50IHNldHVwX2NuMjN4eF9vY3Rlb25fcGZfZGV2aWNlKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpOworCitpbnQgdmFsaWRhdGVfY24yM3h4X3BmX2NvbmZpZ19pbmZvKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsCisJCQkJICAgc3RydWN0IG9jdGVvbl9jb25maWcgKmNvbmYyM3h4KTsKKwordTMyIGNuMjN4eF9wZl9nZXRfb3FfdGlja3Moc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwgdTMyIHRpbWVfaW50cl9pbl91cyk7CisKK3ZvaWQgY24yM3h4X2R1bXBfcGZfaW5pdGlhbGl6ZWRfcmVncyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KTsKKworaW50IGNuMjN4eF9md19sb2FkZWQoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9jbjIzeHhfcGZfcmVncy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2NuMjN4eF9wZl9yZWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNkNzlkOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9jbjIzeHhfcGZfcmVncy5oCkBAIC0wLDAgKzEsNjA0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBBdXRob3I6IENhdml1bSwgSW5jLgorKgorKiBDb250YWN0OiBzdXBwb3J0QGNhdml1bS5jb20KKyogICAgICAgICAgUGxlYXNlIGluY2x1ZGUgIkxpcXVpZElPIiBpbiB0aGUgc3ViamVjdC4KKyoKKyogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2F2aXVtLCBJbmMuCisqCisqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMiwgYXMKKyogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqCisqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyogQVMtSVMgYW5kIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBUSVRMRSwgb3IKKyogTk9OSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorKiBkZXRhaWxzLgorKgorKiBUaGlzIGZpbGUgbWF5IGFsc28gYmUgYXZhaWxhYmxlIHVuZGVyIGEgZGlmZmVyZW50IGxpY2Vuc2UgZnJvbSBDYXZpdW0uCisqIENvbnRhY3QgQ2F2aXVtLCBJbmMuIGZvciBtb3JlIGluZm9ybWF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiEgXGZpbGUgY24yM3h4X3JlZ3MuaAorICogXGJyaWVmIEhvc3QgRHJpdmVyOiBSZWdpc3RlciBBZGRyZXNzIGFuZCBSZWdpc3RlciBNYXNrIHZhbHVlcyBmb3IKKyAqIE9jdGVvbiBDTjIzWFggZGV2aWNlcy4KKyovCisKKyNpZm5kZWYgX19DTjIzWFhfUEZfUkVHU19IX18KKyNkZWZpbmUgX19DTjIzWFhfUEZfUkVHU19IX18KKworI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19WRU5ET1JfSUQJMHgwMAorI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19ERVZJQ0VfSUQJMHgwMgorCisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX1hQQU5TSU9OX0JBUiAgICAgICAgICAgICAweDM4CisKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfTVNJWF9DQVAJCSAgIDB4NTAKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfTVNJWF9MTVNJCQkgICAweDU0CisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX01TSVhfVU1TSQkJICAgMHg1OAorI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19NU0lYX01TSU1ECQkgICAweDVDCisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX01TSVhfTVNJTU0JCSAgIDB4NjAKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfTVNJWF9NU0lNUAkJICAgMHg2NAorCisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX1BDSUVfQ0FQICAgICAgICAgICAgICAgICAweDcwCisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX1BDSUVfREVWQ0FQICAgICAgICAgICAgICAweDc0CisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX1BDSUVfREVWQ1RMICAgICAgICAgICAgICAweDc4CisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX1BDSUVfTElOS0NBUCAgICAgICAgICAgICAweDdDCisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX1BDSUVfTElOS0NUTCAgICAgICAgICAgICAweDgwCisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX1BDSUVfU0xPVENBUCAgICAgICAgICAgICAweDg0CisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX1BDSUVfU0xPVENUTCAgICAgICAgICAgICAweDg4CisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX1BDSUVfREVWQ1RMMiAgICAgICAgICAgICAweDk4CisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX1BDSUVfTElOS0NUTDIgICAgICAgICAgICAweEEwCisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX1BDSUVfVU5DT1JSRUNUX0VSUl9NQVNLICAweDEwOAorI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19QQ0lFX0NPUlJFQ1RfRVJSX1NUQVRVUyAgMHgxMTAKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfUENJRV9ERVZDVExfTUFTSyAgICAgICAgIDB4MDAwNDAwMDAKKworI2RlZmluZSAgICAgQ04yM1hYX1BDSUVfU1JJT1ZfRkRMCQkgICAweDE4OAorI2RlZmluZSAgICAgQ04yM1hYX1BDSUVfU1JJT1ZfRkRMX0JJVF9QT1MJICAgMHgxMAorI2RlZmluZSAgICAgQ04yM1hYX1BDSUVfU1JJT1ZfRkRMX01BU0sJCSAgIDB4RkYKKworI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19QQ0lFX0ZMVE1TSyAgICAgICAgICAgICAgMHg3MjAKKworI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19TUklPVl9WRkRFVklEICAgICAgICAgICAgMHgxOTAKKworI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19TUklPVl9CQVJfU1RBUlQJICAgMHgxOUMKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfU1JJT1ZfQkFSWChpKQkJXAorCQkoQ04yM1hYX0NPTkZJR19TUklPVl9CQVJfU1RBUlQgKyAoaSAqIDQpKQorI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19TUklPVl9CQVJfUEYJCSAgIDB4MDgKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfU1JJT1ZfQkFSXzY0QklUCSAgIDB4MDQKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfU1JJT1ZfQkFSX0lPCQkgICAweDAxCisKKy8qICMjIyMjIyMjIyMjIyMjICBCQVIwIFJlZ2lzdGVycyAjIyMjIyMjIyMjIyMjIyMjICovCisKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9DVExfUE9SVF9TVEFSVCAgICAgICAgICAgICAgIDB4Mjg2RTAKKyNkZWZpbmUgICAgQ04yM1hYX1BPUlRfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgIDB4MTAKKworI2RlZmluZSAgICBDTjIzWFhfU0xJX0NUTF9QT1JUKHApICAgICAgICAgICAgICAgICAgXAorCQkoQ04yM1hYX1NMSV9DVExfUE9SVF9TVEFSVCArICgocCkgKiBDTjIzWFhfUE9SVF9PRkZTRVQpKQorCisvKiAyIHNjYXRjaCByZWdpc3RlcnMgKDY0LWJpdCkgICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfV0lORE9XX0NUTCAgICAgICAgICAgICAgICAgICAweDI4MkUwCisjZGVmaW5lICAgIENOMjNYWF9TTElfU0NSQVRDSDEgICAgICAgICAgICAgICAgICAgICAweDI4M0MwCisjZGVmaW5lICAgIENOMjNYWF9TTElfU0NSQVRDSDIgICAgICAgICAgICAgICAgICAgICAweDI4M0QwCisjZGVmaW5lICAgIENOMjNYWF9TTElfV0lORE9XX0NUTF9ERUZBVUxUICAgICAgICAgICAweDIwMDAwMFVMTAorCisvKiAxIHJlZ2lzdGVycyAoNjQtYml0KSAgLSBTTElfQ1RMX1NUQVRVUyAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX0NUTF9TVEFUVVMgICAgICAgICAgICAgICAgICAgMHgyODU3MAorCisvKiBTTEkgUGFja2V0IElucHV0IEphYmJlciBSZWdpc3RlciAoNjQgYml0IHJlZ2lzdGVyKQorICogPDMxOjA+IGZvciBCeXRlIGNvdW50IGZvciBsaW1pdGluZyBzaXplcyBvZiBwYWNrZXQgc2l6ZXMKKyAqIHRoYXQgYXJlIGFsbG93ZWQgZm9yIHNsaSBwYWNrZXQgaW5ib3VuZCBwYWNrZXRzLgorICogdGhlIGRlZmF1bHQgdmFsdWUgaXMgMHhGQTAwKD02NDAwMCkuCisgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9QS1RfSU5fSkFCQkVSICAgICAgICAgICAgICAgIDB4MjkxNzAKKy8qIFRoZSBpbnB1dCBqYWJiZXIgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIFRTTyBtYXggc2l6ZS4KKyAqIER1ZSB0byBIL1cgbGltaXRhdGlvbiwgdGhpcyBuZWVkIHRvIGJlIHJlZHVjZWQgdG8gNjAwMDAKKyAqIGluIG9yZGVyIHRvIHRvIEgvVyBUU08gYW5kIGF2b2lkIHRoZSBXUUUgbWFsZmFybWF0aW9uCisgKiBQS09fQlVHXzI0OTg5X1dRRV9MRU4KKyAqLworI2RlZmluZSAgICBDTjIzWFhfREVGQVVMVF9JTlBVVF9KQUJCRVIgICAgICAgICAgICAgMHhFQTYwIC8qNjAwMDAqLworCisjZGVmaW5lICAgIENOMjNYWF9XSU5fV1JfQUREUl9MTyAgICAgICAgICAgICAgICAgICAweDIwMDAwCisjZGVmaW5lICAgIENOMjNYWF9XSU5fV1JfQUREUl9ISSAgICAgICAgICAgICAgICAgICAweDIwMDA0CisjZGVmaW5lICAgIENOMjNYWF9XSU5fV1JfQUREUjY0ICAgICAgICAgICAgICAgICAgICBDTjIzWFhfV0lOX1dSX0FERFJfTE8KKworI2RlZmluZSAgICBDTjIzWFhfV0lOX1JEX0FERFJfTE8gICAgICAgICAgICAgICAgICAgMHgyMDAxMAorI2RlZmluZSAgICBDTjIzWFhfV0lOX1JEX0FERFJfSEkgICAgICAgICAgICAgICAgICAgMHgyMDAxNAorI2RlZmluZSAgICBDTjIzWFhfV0lOX1JEX0FERFI2NCAgICAgICAgICAgICAgICAgICAgQ04yM1hYX1dJTl9SRF9BRERSX0xPCisKKyNkZWZpbmUgICAgQ04yM1hYX1dJTl9XUl9EQVRBX0xPICAgICAgICAgICAgICAgICAgIDB4MjAwMjAKKyNkZWZpbmUgICAgQ04yM1hYX1dJTl9XUl9EQVRBX0hJICAgICAgICAgICAgICAgICAgIDB4MjAwMjQKKyNkZWZpbmUgICAgQ04yM1hYX1dJTl9XUl9EQVRBNjQgICAgICAgICAgICAgICAgICAgIENOMjNYWF9XSU5fV1JfREFUQV9MTworCisjZGVmaW5lICAgIENOMjNYWF9XSU5fUkRfREFUQV9MTyAgICAgICAgICAgICAgICAgICAweDIwMDQwCisjZGVmaW5lICAgIENOMjNYWF9XSU5fUkRfREFUQV9ISSAgICAgICAgICAgICAgICAgICAweDIwMDQ0CisjZGVmaW5lICAgIENOMjNYWF9XSU5fUkRfREFUQTY0ICAgICAgICAgICAgICAgICAgICBDTjIzWFhfV0lOX1JEX0RBVEFfTE8KKworI2RlZmluZSAgICBDTjIzWFhfV0lOX1dSX01BU0tfTE8gICAgICAgICAgICAgICAgICAgMHgyMDAzMAorI2RlZmluZSAgICBDTjIzWFhfV0lOX1dSX01BU0tfSEkgICAgICAgICAgICAgICAgICAgMHgyMDAzNAorI2RlZmluZSAgICBDTjIzWFhfV0lOX1dSX01BU0tfUkVHICAgICAgICAgICAgICAgICAgQ04yM1hYX1dJTl9XUl9NQVNLX0xPCisjZGVmaW5lICAgIENOMjNYWF9TTElfTUFDX0NSRURJVF9DTlQgICAgICAgICAgICAgICAweDIzRDcwCisKKy8qIDQgcmVnaXN0ZXJzICg2NC1iaXQpIGZvciBtYXBwaW5nIElPUXMgdG8gTUFDcyhQRU1zKS0KKyAqIFNMSV9QS1RfTUFDKDAuLjMpX1BGKDAuLjEpX1JJTkZPCisgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9QS1RfTUFDX1JJTkZPX1NUQVJUNjQgICAgICAgMHgyOTAzMAorCisvKjEgcmVnaXN0ZXIgKDY0LWJpdCkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgSU9RcyBhcmUgaW4gcmVzZXQuICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfUEtUX0lPUV9SSU5HX1JTVCAgICAgICAgICAgIDB4MjkxRTAKKworLyogRWFjaCBJbnB1dCBRdWV1ZSByZWdpc3RlciBpcyBhdCBhIDE2LWJ5dGUgT2Zmc2V0IGluIEJBUjAgKi8KKyNkZWZpbmUgICAgQ04yM1hYX0lRX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMAorCisjZGVmaW5lICAgIENOMjNYWF9NQUNfUklORk9fT0ZGU0VUICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgICAgQ04yM1hYX1BGX1JJTkZPX09GRlNFVCAgICAgICAgICAgICAgICAgMHgxMAorCisjZGVmaW5lIENOMjNYWF9TTElfUEtUX01BQ19SSU5GTzY0KG1hYywgcGYpCQlcCisJCShDTjIzWFhfU0xJX1BLVF9NQUNfUklORk9fU1RBUlQ2NCArICAgICBcCisJCSAoKG1hYykgKiBDTjIzWFhfTUFDX1JJTkZPX09GRlNFVCkgKwlcCisJCSAoKHBmKSAqIENOMjNYWF9QRl9SSU5GT19PRkZTRVQpKQorCisvKiogbWFzayBmb3IgdG90YWwgcmluZ3MsIHNldHRpbmcgVFJTIHRvIGJhc2UgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9NQUNfQ1RMX1JJTkZPX1RSUyAgICAgICAgICAgICAgIEJJVF9VTEwoMTYpCisvKiogbWFzayBmb3Igc3RhcnRpbmcgcmluZyBudW1iZXI6IHNldHRpbmcgU1JOIDw2OjA+ID0gMHg3RiAqLworI2RlZmluZSAgICBDTjIzWFhfUEtUX01BQ19DVExfUklORk9fU1JOICAgICAgICAgICAgICAgKDB4N0YpCisKKy8qIFN0YXJ0aW5nIGJpdCBvZiB0aGUgVFJTIGZpZWxkIGluIENOMjNYWF9TTElfUEtUX01BQ19SSU5GTzY0IHJlZ2lzdGVyICovCisjZGVmaW5lICAgIENOMjNYWF9QS1RfTUFDX0NUTF9SSU5GT19UUlNfQklUX1BPUyAgICAgMTYKKy8qIFN0YXJ0aW5nIGJpdCBvZiBTUk4gZmllbGQgaW4gQ04yM1hYX1NMSV9QS1RfTUFDX1JJTkZPNjQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9NQUNfQ1RMX1JJTkZPX1NSTl9CSVRfUE9TICAgICAwCisvKiBTdGFydGluZyBiaXQgb2YgUlBWRiBmaWVsZCBpbiBDTjIzWFhfU0xJX1BLVF9NQUNfUklORk82NCByZWdpc3RlciAqLworI2RlZmluZSAgICBDTjIzWFhfUEtUX01BQ19DVExfUklORk9fUlBWRl9CSVRfUE9TICAgICAzMgorLyogU3RhcnRpbmcgYml0IG9mIE5WRlMgZmllbGQgaW4gQ04yM1hYX1NMSV9QS1RfTUFDX1JJTkZPNjQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9NQUNfQ1RMX1JJTkZPX05WRlNfQklUX1BPUyAgICAgNDgKKworLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFJFUVVFU1QgUVVFVUUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisKKy8qIDY0IHJlZ2lzdGVycyBmb3IgSW5wdXQgUXVldWUgSW5zdHIgQ291bnQgLSBTTElfUEtUX0lOX0RPTkUwX0NOVFMgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9JUV9JTlNUUl9DT1VOVF9TVEFSVDY0ICAgICAweDEwMDQwCisKKy8qIDY0IHJlZ2lzdGVycyBmb3IgSW5wdXQgUXVldWVzIFN0YXJ0IEFkZHIgLSBTTElfUEtUMF9JTlNUUl9CQUREUiAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX0lRX0JBU0VfQUREUl9TVEFSVDY0ICAgICAgIDB4MTAwMTAKKworLyogNjQgcmVnaXN0ZXJzIGZvciBJbnB1dCBEb29yYmVsbCAtIFNMSV9QS1QwX0lOU1RSX0JBT0ZGX0RCRUxMICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfSVFfRE9PUkJFTExfU1RBUlQgICAgICAgICAgMHgxMDAyMAorCisvKiA2NCByZWdpc3RlcnMgZm9yIElucHV0IFF1ZXVlIHNpemUgLSBTTElfUEtUMF9JTlNUUl9GSUZPX1JTSVpFICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfSVFfU0laRV9TVEFSVCAgICAgICAgICAgICAgMHgxMDAzMAorCisvKiA2NCByZWdpc3RlcnMgKDY0LWJpdCkgLSBFUywgUk8sIE5TLCBBcmJpdHJhdGlvbiBmb3IgSW5wdXQgUXVldWUgRGF0YSAmCisgKiBnYXRoZXIgbGlzdCBmZXRjaGVzLiBTTElfUEtUKDAuLjYzKV9JTlBVVF9DT05UUk9MLgorICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfSVFfUEtUX0NPTlRST0xfU1RBUlQ2NCAgICAweDEwMDAwCisKKy8qLS0tLS0tLSBSZXF1ZXN0IFF1ZXVlIE1hY3JvcyAtLS0tLS0tLS0qLworI2RlZmluZSAgICBDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MNjQoaXEpICAgICAgICAgIFwKKwkJKENOMjNYWF9TTElfSVFfUEtUX0NPTlRST0xfU1RBUlQ2NCArICgoaXEpICogQ04yM1hYX0lRX09GRlNFVCkpCisKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9JUV9CQVNFX0FERFI2NChpcSkgICAgICAgICAgXAorCQkoQ04yM1hYX1NMSV9JUV9CQVNFX0FERFJfU1RBUlQ2NCArICgoaXEpICogQ04yM1hYX0lRX09GRlNFVCkpCisKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9JUV9TSVpFKGlxKSAgICAgICAgICAgICAgICAgXAorCQkoQ04yM1hYX1NMSV9JUV9TSVpFX1NUQVJUICsgKChpcSkgKiBDTjIzWFhfSVFfT0ZGU0VUKSkKKworI2RlZmluZSAgICBDTjIzWFhfU0xJX0lRX0RPT1JCRUxMKGlxKSAgICAgICAgICAgICBcCisJCShDTjIzWFhfU0xJX0lRX0RPT1JCRUxMX1NUQVJUICsgKChpcSkgKiBDTjIzWFhfSVFfT0ZGU0VUKSkKKworI2RlZmluZSAgICBDTjIzWFhfU0xJX0lRX0lOU1RSX0NPVU5UNjQoaXEpICAgICAgICAgIFwKKwkJKENOMjNYWF9TTElfSVFfSU5TVFJfQ09VTlRfU1RBUlQ2NCArICgoaXEpICogQ04yM1hYX0lRX09GRlNFVCkpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tIE1hc2tzIC0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSAgICBDTjIzWFhfUEtUX0lOUFVUX0NUTF9WRl9OVU0gICAgICAgICAgICAgICAgICBCSVRfVUxMKDMyKQorI2RlZmluZSAgICBDTjIzWFhfUEtUX0lOUFVUX0NUTF9NQUNfTlVNICAgICAgICAgICAgICAgICBCSVQoMjkpCisvKiBOdW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHRvIGJlIHJlYWQgaW4gb25lIE1BQyByZWFkIHJlcXVlc3QuCisgKiBzZXR0aW5nIHRvIE1heCB2YWx1ZSg0KQorICovCisjZGVmaW5lICAgIENOMjNYWF9QS1RfSU5QVVRfQ1RMX1JEU0laRSAgICAgICAgICAgICAgICAgICgzIDw8IDI1KQorI2RlZmluZSAgICBDTjIzWFhfUEtUX0lOUFVUX0NUTF9JU182NEIgICAgICAgICAgICAgICAgICBCSVQoMjQpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfSU5QVVRfQ1RMX1JTVCAgICAgICAgICAgICAgICAgICAgIEJJVCgyMykKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9JTlBVVF9DVExfUVVJRVQgICAgICAgICAgICAgICAgICAgQklUKDI4KQorI2RlZmluZSAgICBDTjIzWFhfUEtUX0lOUFVUX0NUTF9SSU5HX0VOQiAgICAgICAgICAgICAgICBCSVQoMjIpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfSU5QVVRfQ1RMX0RBVEFfTlMgICAgICAgICAgICAgICAgIEJJVCg4KQorI2RlZmluZSAgICBDTjIzWFhfUEtUX0lOUFVUX0NUTF9EQVRBX0VTXzY0Ql9TV0FQICAgICAgICBCSVQoNikKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9JTlBVVF9DVExfREFUQV9STyAgICAgICAgICAgICAgICAgQklUKDUpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfSU5QVVRfQ1RMX1VTRV9DU1IgICAgICAgICAgICAgICAgIEJJVCg0KQorI2RlZmluZSAgICBDTjIzWFhfUEtUX0lOUFVUX0NUTF9HQVRIRVJfTlMgICAgICAgICAgICAgICBCSVQoMykKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9JTlBVVF9DVExfR0FUSEVSX0VTXzY0Ql9TV0FQICAgICAgKDIpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfSU5QVVRfQ1RMX0dBVEhFUl9STyAgICAgICAgICAgICAgICgxKQorCisvKiogUmluZ3MgcGVyIFZpcnR1YWwgRnVuY3Rpb24gKiovCisjZGVmaW5lICAgIENOMjNYWF9QS1RfSU5QVVRfQ1RMX1JQVkZfTUFTSyAgICAgICAgICAgICAgICgweDNGKQorI2RlZmluZSAgICBDTjIzWFhfUEtUX0lOUFVUX0NUTF9SUFZGX1BPUyAgICAgICAgICAgICAgICAoNDgpCisvKiogVGhlc2UgYml0c1s0Nzo0NF0gc2VsZWN0IHRoZSBQaHlzaWNhbCBmdW5jdGlvbiBudW1iZXIgd2l0aGluIHRoZSBNQUMgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9JTlBVVF9DVExfUEZfTlVNX01BU0sgICAgICAgICAgICAgKDB4NykKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9JTlBVVF9DVExfUEZfTlVNX1BPUyAgICAgICAgICAgICAgKDQ1KQorLyoqIFRoZXNlIGJpdHNbNDM6MzJdIHNlbGVjdCB0aGUgZnVuY3Rpb24gbnVtYmVyIHdpdGhpbiB0aGUgUEYgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9JTlBVVF9DVExfVkZfTlVNX01BU0sgICAgICAgICAgICAgKDB4MUZGRikKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9JTlBVVF9DVExfVkZfTlVNX1BPUyAgICAgICAgICAgICAgKDMyKQorI2RlZmluZSAgICBDTjIzWFhfUEtUX0lOUFVUX0NUTF9NQUNfTlVNX01BU0sgICAgICAgICAgICAoMHgzKQorI2RlZmluZSAgICBDTjIzWFhfUEtUX0lOUFVUX0NUTF9NQUNfTlVNX1BPUyAgICAgICAgICAgICAoMjkpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfSU5fRE9ORV9XTUFSS19NQVNLICAgICAgICAgICAgICAgICgweEZGRkZVTEwpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfSU5fRE9ORV9XTUFSS19CSVRfUE9TICAgICAgICAgICAgICgzMikKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9JTl9ET05FX0NOVF9NQVNLICAgICAgICAgICAgICAgICAgKDB4MDAwMDAwMDBGRkZGRkZGRlVMTCkKKworI2lmZGVmIF9fTElUVExFX0VORElBTl9CSVRGSUVMRAorI2RlZmluZSAgICBDTjIzWFhfUEtUX0lOUFVUX0NUTF9NQVNLCQkJCVwKKwkJKENOMjNYWF9QS1RfSU5QVVRfQ1RMX1JEU0laRQkJfAlcCisJCSBDTjIzWFhfUEtUX0lOUFVUX0NUTF9EQVRBX0VTXzY0Ql9TV0FQCXwJXAorCQkgQ04yM1hYX1BLVF9JTlBVVF9DVExfVVNFX0NTUikKKyNlbHNlCisjZGVmaW5lICAgIENOMjNYWF9QS1RfSU5QVVRfQ1RMX01BU0sJCQkJXAorCQkoQ04yM1hYX1BLVF9JTlBVVF9DVExfUkRTSVpFCQl8CVwKKwkJIENOMjNYWF9QS1RfSU5QVVRfQ1RMX0RBVEFfRVNfNjRCX1NXQVAJfAlcCisJCSBDTjIzWFhfUEtUX0lOUFVUX0NUTF9VU0VfQ1NSCQl8CVwKKwkJIENOMjNYWF9QS1RfSU5QVVRfQ1RMX0dBVEhFUl9FU182NEJfU1dBUCkKKyNlbmRpZgorCisvKiogTWFza3MgZm9yIFNMSV9QS1RfSU5fRE9ORSgwLi42MylfQ05UUyBSZWdpc3RlciAqLworI2RlZmluZSAgICBDTjIzWFhfSU5fRE9ORV9DTlRTX1BJX0lOVCAgICAgICAgICAgICAgIEJJVF9VTEwoNjIpCisjZGVmaW5lICAgIENOMjNYWF9JTl9ET05FX0NOVFNfQ0lOVF9FTkIgICAgICAgICAgICAgQklUX1VMTCg0OCkKKworLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE9VVFBVVCBRVUVVRSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KKworLyogNjQgcmVnaXN0ZXJzIGZvciBPdXRwdXQgcXVldWUgY29udHJvbCAtIFNMSV9QS1QoMC4uNjMpX09VVFBVVF9DT05UUk9MICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfT1FfUEtUX0NPTlRST0xfU1RBUlQgICAgICAgMHgxMDA1MAorCisvKiA2NCByZWdpc3RlcnMgZm9yIE91dHB1dCBxdWV1ZSBidWZmZXIgYW5kIGluZm8gc2l6ZSAtIFNMSV9QS1QwX09VVF9TSVpFICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfT1EwX0JVRkZfSU5GT19TSVpFICAgICAgICAgMHgxMDA2MAorCisvKiA2NCByZWdpc3RlcnMgZm9yIE91dHB1dCBRdWV1ZSBTdGFydCBBZGRyIC0gU0xJX1BLVDBfU0xJU1RfQkFERFIgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9PUV9CQVNFX0FERFJfU1RBUlQ2NCAgICAgICAweDEwMDcwCisKKy8qIDY0IHJlZ2lzdGVycyBmb3IgT3V0cHV0IFF1ZXVlIFBhY2tldCBDcmVkaXRzIC0gU0xJX1BLVDBfU0xJU1RfQkFPRkZfREJFTEwgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9PUV9QS1RfQ1JFRElUU19TVEFSVCAgICAgICAweDEwMDgwCisKKy8qIDY0IHJlZ2lzdGVycyBmb3IgT3V0cHV0IFF1ZXVlIHNpemUgLSBTTElfUEtUMF9TTElTVF9GSUZPX1JTSVpFICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfT1FfU0laRV9TVEFSVCAgICAgICAgICAgICAgMHgxMDA5MAorCisvKiA2NCByZWdpc3RlcnMgZm9yIE91dHB1dCBRdWV1ZSBQYWNrZXQgQ291bnQgLSBTTElfUEtUMF9DTlRTICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfT1FfUEtUX1NFTlRfU1RBUlQgICAgICAgICAgMHgxMDBCMAorCisvKiA2NCByZWdpc3RlcnMgZm9yIE91dHB1dCBRdWV1ZSBJTlQgTGV2ZWxzIC0gU0xJX1BLVDBfSU5UX0xFVkVMUyAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX09RX1BLVF9JTlRfTEVWRUxTX1NUQVJUNjQgICAweDEwMEEwCisKKy8qIEVhY2ggT3V0cHV0IFF1ZXVlIHJlZ2lzdGVyIGlzIGF0IGEgMTYtYnl0ZSBPZmZzZXQgaW4gQkFSMCAqLworI2RlZmluZSAgICBDTjIzWFhfT1FfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMDAKKworLyogMSAoNjQtYml0IHJlZ2lzdGVyKSBmb3IgT3V0cHV0IFF1ZXVlIGJhY2twcmVzc3VyZSBhY3Jvc3MgYWxsIHJpbmdzLiAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX09RX1dNQVJLICAgICAgICAgICAgICAgICAgIDB4MjkxODAKKworLyogR2xvYmFsIHBrdCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfR0JMX0NPTlRST0wgICAgICAgICAgICAgICAgMHgyOTIxMAorCisvKiBCYWNrcHJlc3N1cmUgZW5hYmxlIHJlZ2lzdGVyIGZvciBQRjAgICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfT1VUX0JQX0VOX1cxUyAgICAgICAgICAgICAgMHgyOTI2MAorCisvKiBCYWNrcHJlc3N1cmUgZW5hYmxlIHJlZ2lzdGVyIGZvciBQRjEgICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfT1VUX0JQX0VOMl9XMVMgICAgICAgICAgICAgMHgyOTI3MAorCisvKiBCYWNrcHJlc3N1cmUgZGlzYWJsZSByZWdpc3RlciBmb3IgUEYwICAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX09VVF9CUF9FTl9XMUMgICAgICAgICAgICAgIDB4MjkyODAKKworLyogQmFja3ByZXNzdXJlIGRpc2FibGUgcmVnaXN0ZXIgZm9yIFBGMSAgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9PVVRfQlBfRU4yX1cxQyAgICAgICAgICAgICAweDI5MjkwCisKKy8qLS0tLS0tLSBPdXRwdXQgUXVldWUgTWFjcm9zIC0tLS0tLS0tLSovCisKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9PUV9QS1RfQ09OVFJPTChvcSkgICAgICAgICAgXAorCQkoQ04yM1hYX1NMSV9PUV9QS1RfQ09OVFJPTF9TVEFSVCArICgob3EpICogQ04yM1hYX09RX09GRlNFVCkpCisKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9PUV9CQVNFX0FERFI2NChvcSkgICAgICAgICAgXAorCQkoQ04yM1hYX1NMSV9PUV9CQVNFX0FERFJfU1RBUlQ2NCArICgob3EpICogQ04yM1hYX09RX09GRlNFVCkpCisKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9PUV9TSVpFKG9xKSAgICAgICAgICAgICAgICAgXAorCQkoQ04yM1hYX1NMSV9PUV9TSVpFX1NUQVJUICsgKChvcSkgKiBDTjIzWFhfT1FfT0ZGU0VUKSkKKworI2RlZmluZSAgICBDTjIzWFhfU0xJX09RX0JVRkZfSU5GT19TSVpFKG9xKSAgICAgICAgICAgICAgICAgXAorCQkoQ04yM1hYX1NMSV9PUTBfQlVGRl9JTkZPX1NJWkUgKyAoKG9xKSAqIENOMjNYWF9PUV9PRkZTRVQpKQorCisjZGVmaW5lICAgIENOMjNYWF9TTElfT1FfUEtUU19TRU5UKG9xKSAgICAgICAgICAgIFwKKwkJKENOMjNYWF9TTElfT1FfUEtUX1NFTlRfU1RBUlQgKyAoKG9xKSAqIENOMjNYWF9PUV9PRkZTRVQpKQorCisjZGVmaW5lICAgIENOMjNYWF9TTElfT1FfUEtUU19DUkVESVQob3EpICAgICAgICAgIFwKKwkJKENOMjNYWF9TTElfT1FfUEtUX0NSRURJVFNfU1RBUlQgKyAoKG9xKSAqIENOMjNYWF9PUV9PRkZTRVQpKQorCisjZGVmaW5lICAgIENOMjNYWF9TTElfT1FfUEtUX0lOVF9MRVZFTFMob3EpCQlcCisJCShDTjIzWFhfU0xJX09RX1BLVF9JTlRfTEVWRUxTX1NUQVJUNjQgKwlcCisJCSAoKG9xKSAqIENOMjNYWF9PUV9PRkZTRVQpKQorCisvKk1hY3JvJ3MgZm9yIGFjY2Vzc2luZyBDTlQgYW5kIFRJTUUgc2VwYXJhdGVseSBmcm9tIElOVF9MRVZFTFMqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX09RX1BLVF9JTlRfTEVWRUxTX0NOVChvcSkJCVwKKwkJKENOMjNYWF9TTElfT1FfUEtUX0lOVF9MRVZFTFNfU1RBUlQ2NCArIFwKKwkJICgob3EpICogQ04yM1hYX09RX09GRlNFVCkpCisKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9PUV9QS1RfSU5UX0xFVkVMU19USU1FKG9xKQlcCisJCShDTjIzWFhfU0xJX09RX1BLVF9JTlRfTEVWRUxTX1NUQVJUNjQgKwlcCisJCSAoKG9xKSAqIENOMjNYWF9PUV9PRkZTRVQpICsgNCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0gTWFza3MgLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lICAgIENOMjNYWF9QS1RfT1VUUFVUX0NUTF9URU5CICAgICAgICAgICAgICAgICAgQklUKDEzKQorI2RlZmluZSAgICBDTjIzWFhfUEtUX09VVFBVVF9DVExfQ0VOQiAgICAgICAgICAgICAgICAgIEJJVCgxMikKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9PVVRQVVRfQ1RMX0lQVFIgICAgICAgICAgICAgICAgICBCSVQoMTEpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfT1VUUFVUX0NUTF9FUyAgICAgICAgICAgICAgICAgICAgQklUKDkpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfT1VUUFVUX0NUTF9OU1IgICAgICAgICAgICAgICAgICAgQklUKDgpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfT1VUUFVUX0NUTF9ST1IgICAgICAgICAgICAgICAgICAgQklUKDcpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfT1VUUFVUX0NUTF9EUFRSICAgICAgICAgICAgICAgICAgQklUKDYpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfT1VUUFVUX0NUTF9CTU9ERSAgICAgICAgICAgICAgICAgQklUKDUpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfT1VUUFVUX0NUTF9FU19QICAgICAgICAgICAgICAgICAgQklUKDMpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfT1VUUFVUX0NUTF9OU1JfUCAgICAgICAgICAgICAgICAgQklUKDIpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfT1VUUFVUX0NUTF9ST1JfUCAgICAgICAgICAgICAgICAgQklUKDEpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfT1VUUFVUX0NUTF9SSU5HX0VOQiAgICAgICAgICAgICAgQklUKDApCisKKy8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBNYWlsYm94IFJlZyBNYWNyb3MgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9QS1RfTUJPWF9JTlRfU1RBUlQgICAgICAgICAgICAgMHgxMDIxMAorI2RlZmluZSAgICBDTjIzWFhfU0xJX1BLVF9QRl9WRl9NQk9YX1NJR19TVEFSVCAgICAgICAweDEwMjAwCisjZGVmaW5lICAgIENOMjNYWF9TTElfTUFDX1BGX01CT1hfSU5UX1NUQVJUICAgICAgICAgIDB4MjczODAKKworI2RlZmluZSAgICBDTjIzWFhfU0xJX01CT1hfT0ZGU0VUCQkgICAgIDB4MjAwMDAKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9NQk9YX1NJR19JRFhfT0ZGU0VUCSAgICAgMHg4CisKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9QS1RfTUJPWF9JTlQocSkgICAgICAgICAgXAorCQkoQ04yM1hYX1NMSV9QS1RfTUJPWF9JTlRfU1RBUlQgKyAoKHEpICogQ04yM1hYX1NMSV9NQk9YX09GRlNFVCkpCisKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9QS1RfUEZfVkZfTUJPWF9TSUcocSwgaWR4KQkJXAorCQkoQ04yM1hYX1NMSV9QS1RfUEZfVkZfTUJPWF9TSUdfU1RBUlQgKwkJXAorCQkgKChxKSAqIENOMjNYWF9TTElfTUJPWF9PRkZTRVQgKwkJXAorCQkgIChpZHgpICogQ04yM1hYX1NMSV9NQk9YX1NJR19JRFhfT0ZGU0VUKSkKKworI2RlZmluZSAgICBDTjIzWFhfU0xJX01BQ19QRl9NQk9YX0lOVChtYWMsIHBmKQkJXAorCQkoQ04yM1hYX1NMSV9NQUNfUEZfTUJPWF9JTlRfU1RBUlQgKwlcCisJCSAoKG1hYykgKiBDTjIzWFhfTUFDX0lOVF9PRkZTRVQgKwlcCisJCSAgKHBmKSAqIENOMjNYWF9QRl9JTlRfT0ZGU0VUKSkKKworLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIERNQSBDb3VudGVycyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KKworLyogMiByZWdpc3RlcnMgKDY0LWJpdCkgLSBETUEgQ291bnQgLSAxIGZvciBlYWNoIERNQSBjb3VudGVyIDAvMS4gKi8KKyNkZWZpbmUgICAgQ04yM1hYX0RNQV9DTlRfU1RBUlQgICAgICAgICAgICAgICAgICAgMHgyODQwMAorCisvKiAyIHJlZ2lzdGVycyAoNjQtYml0KSAtIERNQSBUaW1lciAwLzEsIGNvbnRhaW5zIERNQSB0aW1lciB2YWx1ZXMgKi8KKy8qIFNMSV9ETUFfMF9USU0gKi8KKyNkZWZpbmUgICAgQ04yM1hYX0RNQV9USU1fU1RBUlQgICAgICAgICAgICAgICAgICAgMHgyODQyMAorCisvKiAyIHJlZ2lzdGVycyAoNjQtYml0KSAtIERNQSBjb3VudCAmIFRpbWUgSW50ZXJydXB0IHRocmVzaG9sZCAtCisgKiBTTElfRE1BXzBfSU5UX0xFVkVMCisgKi8KKyNkZWZpbmUgICAgQ04yM1hYX0RNQV9JTlRfTEVWRUxfU1RBUlQgICAgICAgICAgICAgMHgyODNFMAorCisvKiBFYWNoIERNQSByZWdpc3RlciBpcyBhdCBhIDE2LWJ5dGUgT2Zmc2V0IGluIEJBUjAgKi8KKyNkZWZpbmUgICAgQ04yM1hYX0RNQV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgMHgxMAorCisvKi0tLS0tLS0tLS0gRE1BIENvdW50ZXIgTWFjcm9zIC0tLS0tLS0tLSovCisjZGVmaW5lICAgIENOMjNYWF9ETUFfQ05UKGRxKSAgICAgICAgICAgICAgICAgICAgICBcCisJCShDTjIzWFhfRE1BX0NOVF9TVEFSVCArICgoZHEpICogQ04yM1hYX0RNQV9PRkZTRVQpKQorCisjZGVmaW5lICAgIENOMjNYWF9ETUFfSU5UX0xFVkVMKGRxKSAgICAgICAgICAgICAgICBcCisJCShDTjIzWFhfRE1BX0lOVF9MRVZFTF9TVEFSVCArICgoZHEpICogQ04yM1hYX0RNQV9PRkZTRVQpKQorCisjZGVmaW5lICAgIENOMjNYWF9ETUFfUEtUX0lOVF9MRVZFTChkcSkgICAgICAgICAgICBcCisJCShDTjIzWFhfRE1BX0lOVF9MRVZFTF9TVEFSVCArICgoZHEpICogQ04yM1hYX0RNQV9PRkZTRVQpKQorCisjZGVmaW5lICAgIENOMjNYWF9ETUFfVElNRV9JTlRfTEVWRUwoZHEpICAgICAgICAgICBcCisJCShDTjIzWFhfRE1BX0lOVF9MRVZFTF9TVEFSVCArIDQgKyAoKGRxKSAqIENOMjNYWF9ETUFfT0ZGU0VUKSkKKworI2RlZmluZSAgICBDTjIzWFhfRE1BX1RJTShkcSkgICAgICAgICAgICAgICAgICAgICBcCisJCShDTjIzWFhfRE1BX1RJTV9TVEFSVCArICgoZHEpICogQ04yM1hYX0RNQV9PRkZTRVQpKQorCisvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBNU0lYIFRBQkxFICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworCisjZGVmaW5lCUNOMjNYWF9NU0lYX1RBQkxFX0FERFJfU1RBUlQJCTB4MAorI2RlZmluZQlDTjIzWFhfTVNJWF9UQUJMRV9EQVRBX1NUQVJUCQkweDgKKworI2RlZmluZQlDTjIzWFhfTVNJWF9UQUJMRV9TSVpFCQkJMHgxMAorI2RlZmluZQlDTjIzWFhfTVNJWF9UQUJMRV9FTlRSSUVTCQkweDQxCisKKyNkZWZpbmUgQ04yM1hYX01TSVhfRU5UUllfVkVDVE9SX0NUTAlCSVRfVUxMKDMyKQorCisjZGVmaW5lCUNOMjNYWF9NU0lYX1RBQkxFX0FERFIoaWR4KQkJXAorCShDTjIzWFhfTVNJWF9UQUJMRV9BRERSX1NUQVJUICsgKChpZHgpICogQ04yM1hYX01TSVhfVEFCTEVfU0laRSkpCisKKyNkZWZpbmUJQ04yM1hYX01TSVhfVEFCTEVfREFUQShpZHgpCQlcCisJKENOMjNYWF9NU0lYX1RBQkxFX0RBVEFfU1RBUlQgKyAoKGlkeCkgKiBDTjIzWFhfTVNJWF9UQUJMRV9TSVpFKSkKKworLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5URVJSVVBUUyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KKyNkZWZpbmUgQ04yM1hYX01BQ19JTlRfT0ZGU0VUICAgMHgyMAorI2RlZmluZSBDTjIzWFhfUEZfSU5UX09GRlNFVCAgICAweDEwCisKKy8qIDEgcmVnaXN0ZXIgKDY0LWJpdCkgZm9yIEludGVycnVwdCBTdW1tYXJ5ICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfSU5UX1NVTTY0ICAgICAgICAgICAgMHgyNzAwMAorCisvKiA0IHJlZ2lzdGVycyAoNjQtYml0KSBmb3IgSW50ZXJydXB0IEVuYWJsZSBmb3IgZWFjaCBQb3J0ICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfSU5UX0VOQjY0ICAgICAgICAgICAgMHgyNzA4MAorCisjZGVmaW5lICAgIENOMjNYWF9TTElfTUFDX1BGX0lOVF9TVU02NChtYWMsIHBmKQkJCVwKKwkJKENOMjNYWF9TTElfSU5UX1NVTTY0ICsJCQkJXAorCQkgKChtYWMpICogQ04yM1hYX01BQ19JTlRfT0ZGU0VUKSArCQlcCisJCSAoKHBmKSAqIENOMjNYWF9QRl9JTlRfT0ZGU0VUKSkKKworI2RlZmluZSAgICBDTjIzWFhfU0xJX01BQ19QRl9JTlRfRU5CNjQobWFjLCBwZikJCVwKKwkJKENOMjNYWF9TTElfSU5UX0VOQjY0ICsJCQlcCisJCSAoKG1hYykgKiBDTjIzWFhfTUFDX0lOVF9PRkZTRVQpICsJXAorCQkgKChwZikgKiBDTjIzWFhfUEZfSU5UX09GRlNFVCkpCisKKy8qIDEgcmVnaXN0ZXIgKDY0LWJpdCkgdG8gaW5kaWNhdGUgd2hpY2ggT3V0cHV0IFF1ZXVlIHJlYWNoZWQgcGt0IHRocmVzaG9sZCAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX1BLVF9DTlRfSU5UICAgICAgICAgICAgICAgIDB4MjkxMzAKKworLyogMSByZWdpc3RlciAoNjQtYml0KSB0byBpbmRpY2F0ZSB3aGljaCBPdXRwdXQgUXVldWUgcmVhY2hlZCB0aW1lIHRocmVzaG9sZCAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX1BLVF9USU1FX0lOVCAgICAgICAgICAgICAgIDB4MjkxNDAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0gSW50ZXJydXB0IE1hc2tzIC0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX1BPX0lOVAkJCUJJVF9VTEwoNjMpCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX1BJX0lOVAkJCUJJVF9VTEwoNjIpCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX01CT1hfSU5UCQkJQklUX1VMTCg2MSkKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfUkVTRU5ECQkJQklUX1VMTCg2MCkKKworI2RlZmluZSAgICBDTjIzWFhfSU5UUl9DSU5UX0VOQiAgICAgICAgICAgICAgICAgQklUX1VMTCg0OCkKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfTUJPWF9FTkIgICAgICAgICAgICAgICAgIEJJVCgwKQorCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX1JNTF9USU1FT1VUX0VSUiAgICAgICAgICAgKDEpCisKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfTUlPX0lOVCAgICAgICAgICAgICAgICAgICBCSVQoMSkKKworI2RlZmluZSAgICBDTjIzWFhfSU5UUl9SRVNFUlZFRDEgICAgICAgICAgICAgICAgICgzIDw8IDIpCisKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfUEtUX0NPVU5UICAgICAgICAgICAgICAgICBCSVQoNCkKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfUEtUX1RJTUUgICAgICAgICAgICAgICAgICBCSVQoNSkKKworI2RlZmluZSAgICBDTjIzWFhfSU5UUl9SRVNFUlZFRDIgICAgICAgICAgICAgICAgICgzIDw8IDYpCisKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfTTBVUEIwX0VSUiAgICAgICAgICAgICAgICBCSVQoOCkKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfTTBVUFdJX0VSUiAgICAgICAgICAgICAgICBCSVQoOSkKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfTTBVTkIwX0VSUiAgICAgICAgICAgICAgICBCSVQoMTApCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX00wVU5XSV9FUlIgICAgICAgICAgICAgICAgQklUKDExKQorCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX1JFU0VSVkVEMyAgICAgICAgICAgICAgICAgKDB4RkZGRkZVTEwgPDwgMTIpCisKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfRE1BMF9GT1JDRSAgICAgICAgICAgICAgICBCSVRfVUxMKDMyKQorI2RlZmluZSAgICBDTjIzWFhfSU5UUl9ETUExX0ZPUkNFICAgICAgICAgICAgICAgIEJJVF9VTEwoMzMpCisKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfRE1BMF9DT1VOVCAgICAgICAgICAgICAgICBCSVRfVUxMKDM0KQorI2RlZmluZSAgICBDTjIzWFhfSU5UUl9ETUExX0NPVU5UICAgICAgICAgICAgICAgIEJJVF9VTEwoMzUpCisKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfRE1BMF9USU1FICAgICAgICAgICAgICAgICBCSVRfVUxMKDM2KQorI2RlZmluZSAgICBDTjIzWFhfSU5UUl9ETUExX1RJTUUgICAgICAgICAgICAgICAgIEJJVF9VTEwoMzcpCisKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfUkVTRVJWRUQ0ICAgICAgICAgICAgICAgICAoMHg3RkZGRlVMTCA8PCAzOCkKKworI2RlZmluZSAgICBDTjIzWFhfSU5UUl9WRl9NQk9YICAgICAgICAgICAgICAgICAgIEJJVF9VTEwoNTcpCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX0RNQVZGX0VSUiAgICAgICAgICAgICAgICAgQklUX1VMTCg1OCkKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfRE1BUEZfRVJSICAgICAgICAgICAgICAgICBCSVRfVUxMKDU5KQorCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX1BLVFZGX0VSUiAgICAgICAgICAgICAgICAgQklUX1VMTCg2MCkKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfUEtUUEZfRVJSICAgICAgICAgICAgICAgICBCSVRfVUxMKDYxKQorI2RlZmluZSAgICBDTjIzWFhfSU5UUl9QUFZGX0VSUiAgICAgICAgICAgICAgICAgIEJJVF9VTEwoNjIpCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX1BQUEZfRVJSICAgICAgICAgICAgICAgICAgQklUX1VMTCg2MykKKworI2RlZmluZSAgICBDTjIzWFhfSU5UUl9ETUEwX0RBVEEgICAgICAgICAgICAgICAgIChDTjIzWFhfSU5UUl9ETUEwX1RJTUUpCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX0RNQTFfREFUQSAgICAgICAgICAgICAgICAgKENOMjNYWF9JTlRSX0RNQTFfVElNRSkKKworI2RlZmluZSAgICBDTjIzWFhfSU5UUl9ETUFfREFUQSAgICAgICAgICAgICAgICAgIFwKKwkJKENOMjNYWF9JTlRSX0RNQTBfREFUQSB8IENOMjNYWF9JTlRSX0RNQTFfREFUQSkKKworLyogQnkgZmF1bHQgb25seSBUSU1FIGJhc2VkICovCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX1BLVF9EQVRBICAgICAgICAgICAgICAgICAgKENOMjNYWF9JTlRSX1BLVF9USU1FKQorLyogRm9yIGJvdGggQ09VTlQgYW5kIFRJTUUgYmFzZWQgKi8KKy8qICNkZWZpbmUgICAgQ04yM1hYX0lOVFJfUEtUX0RBVEEgICAgICAgICAgICAgICAgICBcCisgKiAoQ04yM1hYX0lOVFJfUEtUX0NPVU5UIHwgQ04yM1hYX0lOVFJfUEtUX1RJTUUpCisgKi8KKworLyogU3VtIG9mIGludGVycnVwdHMgZm9yIGFsbCBQQ0ktRXhwcmVzcyBEYXRhIEludGVycnVwdHMgKi8KKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfUENJRV9EQVRBICAgICAgICAgICAgICAgICBcCisJCShDTjIzWFhfSU5UUl9ETUFfREFUQSB8IENOMjNYWF9JTlRSX1BLVF9EQVQpCisKKy8qIFN1bSBvZiBpbnRlcnJ1cHRzIGZvciBlcnJvciBldmVudHMgKi8KKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfRVJSCQkJXAorCQkoQ04yM1hYX0lOVFJfTTBVUEIwX0VSUgl8CVwKKwkJIENOMjNYWF9JTlRSX00wVVBXSV9FUlIJfAlcCisJCSBDTjIzWFhfSU5UUl9NMFVOQjBfRVJSCXwJXAorCQkgQ04yM1hYX0lOVFJfTTBVTldJX0VSUgl8CVwKKwkJIENOMjNYWF9JTlRSX0RNQVZGX0VSUgl8CVwKKwkJIENOMjNYWF9JTlRSX0RNQVBGX0VSUgl8CVwKKwkJIENOMjNYWF9JTlRSX1BLVFBGX0VSUgl8CVwKKwkJIENOMjNYWF9JTlRSX1BQUEZfRVJSCXwJXAorCQkgQ04yM1hYX0lOVFJfUFBWRl9FUlIpCisKKy8qIFByb2dyYW1tZWQgTWFzayBmb3IgSW50ZXJydXB0IFN1bSAqLworI2RlZmluZSAgICBDTjIzWFhfSU5UUl9NQVNLCQkJXAorCQkoQ04yM1hYX0lOVFJfRE1BX0RBVEEJfAlcCisJCSBDTjIzWFhfSU5UUl9ETUEwX0ZPUkNFCXwJXAorCQkgQ04yM1hYX0lOVFJfRE1BMV9GT1JDRQl8CVwKKwkJIENOMjNYWF9JTlRSX01JT19JTlQJfAlcCisJCSBDTjIzWFhfSU5UUl9FUlIpCisKKy8qIDQgUmVnaXN0ZXJzICg2NCAtIGJpdCkgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9TMk1fUE9SVF9DVExfU1RBUlQgICAgICAgICAweDIzRDgwCisjZGVmaW5lICAgIENOMjNYWF9TTElfUzJNX1BPUlRYX0NUTChwb3J0KQlcCisJCShDTjIzWFhfU0xJX1MyTV9QT1JUX0NUTF9TVEFSVCArIChwb3J0ICogMHgxMCkpCisKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9NQUNfTlVNQkVSICAgICAgICAgICAgICAgICAweDIwMDUwCisKKy8qKiBQRU0oMC4uMylfQkFSMV9JTkRFWCgwLi4xNSlhZGRyZXNzIGlzIGRlZmluZWQgYXMKKyAqICBhZGRyID0gKDB4MDAwMTE4MDBDMDAwMDEwMCAgfHBvcnQgPDwyNCB8aWR4IDw8MyApCisgKiAgSGVyZSwgcG9ydCBpcyBQRU0oMC4uMykgJiBpZHggaXMgSU5ERVgoMC4uMTUpCisgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1BFTV9CQVIxX0lOREVYX1NUQVJUICAgICAgICAgICAgIDB4MDAwMTE4MDBDMDAwMDEwMFVMTAorI2RlZmluZSAgICBDTjIzWFhfUEVNX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgICAgQ04yM1hYX0JBUjFfSU5ERVhfT0ZGU0VUICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSAgICBDTjIzWFhfUEVNX0JBUjFfSU5ERVhfUkVHKHBvcnQsIGlkeCkJCVwKKwkJKENOMjNYWF9QRU1fQkFSMV9JTkRFWF9TVEFSVCArICgocG9ydCkgPDwgQ04yM1hYX1BFTV9PRkZTRVQpICsgXAorCQkgKChpZHgpIDw8IENOMjNYWF9CQVIxX0lOREVYX09GRlNFVCkpCisKKy8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBEUEkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisKKy8qIDEgcmVnaXN0ZXIgKDY0LWJpdCkgLSBwcm92aWRlcyBETUEgRW5hYmxlICovCisjZGVmaW5lICAgIENOMjNYWF9EUElfQ1RMICAgICAgICAgICAgICAgICAweDAwMDFkZjAwMDAwMDAwNDBVTEwKKworLyogMSByZWdpc3RlciAoNjQtYml0KSAtIENvbnRyb2xzIHRoZSBETUEgSU8gT3BlcmF0aW9uICovCisjZGVmaW5lICAgIENOMjNYWF9EUElfRE1BX0NPTlRST0wgICAgICAgICAweDAwMDFkZjAwMDAwMDAwNDhVTEwKKworLyogMSByZWdpc3RlciAoNjQtYml0KSAtIFByb3ZpZGVzIERNQSBJbnN0ciduIFF1ZXVlIEVuYWJsZSAgKi8KKyNkZWZpbmUgICAgQ04yM1hYX0RQSV9SRVFfR0JMX0VOQiAgICAgICAgIDB4MDAwMWRmMDAwMDAwMDA1MFVMTAorCisvKiAxIHJlZ2lzdGVyICg2NC1iaXQpIC0gRFBJX1JFUV9FUlJfUlNQCisgKiBJbmRpY2F0ZXMgd2hpY2ggSW5zdHInbiBRdWV1ZSByZWNlaXZlZCBlcnJvciByZXNwb25zZSBmcm9tIHRoZSBJTyBzdWItc3lzdGVtCisgKi8KKyNkZWZpbmUgICAgQ04yM1hYX0RQSV9SRVFfRVJSX1JTUCAgICAgICAgIDB4MDAwMWRmMDAwMDAwMDA1OFVMTAorCisvKiAxIHJlZ2lzdGVyICg2NC1iaXQpIC0gRFBJX1JFUV9FUlJfUlNUCisgKiBJbmRpY2F0ZXMgd2hpY2ggSW5zdHInbiBRdWV1ZSBkcm9wcGVkIGFuIEluc3RyJ24KKyAqLworI2RlZmluZSAgICBDTjIzWFhfRFBJX1JFUV9FUlJfUlNUICAgICAgICAgMHgwMDAxZGYwMDAwMDAwMDYwVUxMCisKKy8qIDYgcmVnaXN0ZXIgKDY0LWJpdCkgLSBEUElfRE1BX0VORygwLi41KV9FTgorICogUHJvdmlkZXMgRE1BIEVuZ2luZSBRdWV1ZSBFbmFibGUKKyAqLworI2RlZmluZSAgICBDTjIzWFhfRFBJX0RNQV9FTkcwX0VOQiAgICAgICAgMHgwMDAxZGYwMDAwMDAwMDgwVUxMCisjZGVmaW5lICAgIENOMjNYWF9EUElfRE1BX0VOR19FTkIoZW5nKSAoQ04yM1hYX0RQSV9ETUFfRU5HMF9FTkIgKyAoZW5nICogOCkpCisKKy8qIDggcmVnaXN0ZXIgKDY0LWJpdCkgLSBEUElfRE1BKDAuLjcpX1JFUVFfQ1RMCisgKiBQcm92aWRlcyBjb250cm9sIGJpdHMgZm9yIHRyYW5zYWN0aW9uIG9uIDggUXVldWVzCisgKi8KKyNkZWZpbmUgICAgQ04yM1hYX0RQSV9ETUFfUkVRUTBfQ1RMICAgICAgIDB4MDAwMWRmMDAwMDAwMDE4MFVMTAorI2RlZmluZSAgICBDTjIzWFhfRFBJX0RNQV9SRVFRX0NUTChxX25vKQlcCisJCShDTjIzWFhfRFBJX0RNQV9SRVFRMF9DVEwgKyAocV9ubyAqIDgpKQorCisvKiA2IHJlZ2lzdGVyICg2NC1iaXQpIC0gRFBJX0VORygwLi41KV9CVUYKKyAqIFByb3ZpZGVzIERNQSBFbmdpbmUgRklGTyAoUXVldWUpIFNpemUKKyAqLworI2RlZmluZSAgICBDTjIzWFhfRFBJX0RNQV9FTkcwX0JVRiAgICAgICAgMHgwMDAxZGYwMDAwMDAwODgwVUxMCisjZGVmaW5lICAgIENOMjNYWF9EUElfRE1BX0VOR19CVUYoZW5nKSAgIFwKKwkJKENOMjNYWF9EUElfRE1BX0VORzBfQlVGICsgKGVuZyAqIDgpKQorCisvKiA0IFJlZ2lzdGVycyAoNjQtYml0KSAqLworI2RlZmluZSAgICBDTjIzWFhfRFBJX1NMSV9QUlRfQ0ZHX1NUQVJUICAgMHgwMDAxZGYwMDAwMDAwOTAwVUxMCisjZGVmaW5lICAgIENOMjNYWF9EUElfU0xJX1BSVFhfQ0ZHKHBvcnQpICAgICAgICBcCisJCShDTjIzWFhfRFBJX1NMSV9QUlRfQ0ZHX1NUQVJUICsgKHBvcnQgKiAweDgpKQorCisvKiBNYXNrcyBmb3IgRFBJX0RNQV9DT05UUk9MIFJlZ2lzdGVyICovCisjZGVmaW5lICAgIENOMjNYWF9EUElfRE1BX0NPTU1JVF9NT0RFICAgICBCSVRfVUxMKDU4KQorI2RlZmluZSAgICBDTjIzWFhfRFBJX0RNQV9QS1RfRU4gICAgICAgICAgQklUX1VMTCg1NikKKyNkZWZpbmUgICAgQ04yM1hYX0RQSV9ETUFfRU5CICAgICAgICAgICAgICgweDBGVUxMIDw8IDQ4KQorLyogU2V0IHRoZSBETUEgQ29udHJvbCwgdG8gdXBkYXRlIHBhY2tldCBjb3VudCBub3QgYnl0ZSBjb3VudCBzZW50IGJ5IERNQSwKKyAqIHdoZW4gd2UgdXNlIEludGVycnVwdCBDb2FsZXNjaW5nIChDQSBtb2RlKQorICovCisjZGVmaW5lICAgIENOMjNYWF9EUElfRE1BX09fQUREMSAgICAgICAgICBCSVQoMTkpCisvKnNlbGVjdGluZyA2NC1iaXQgQnl0ZSBTd2FwIE1vZGUgKi8KKyNkZWZpbmUgICAgQ04yM1hYX0RQSV9ETUFfT19FUyAgICAgICAgICAgIEJJVCgxNSkKKyNkZWZpbmUgICAgQ04yM1hYX0RQSV9ETUFfT19NT0RFICAgICAgICAgIEJJVCgxNCkKKworI2RlZmluZSAgICBDTjIzWFhfRFBJX0RNQV9DVExfTUFTSwkJCVwKKwkJKENOMjNYWF9EUElfRE1BX0NPTU1JVF9NT0RFCXwJXAorCQkgQ04yM1hYX0RQSV9ETUFfUEtUX0VOCQl8CVwKKwkJIENOMjNYWF9EUElfRE1BX09fRVMJCXwJXAorCQkgQ04yM1hYX0RQSV9ETUFfT19NT0RFKQorCisvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgUlNUICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworCisjZGVmaW5lICAgIENOMjNYWF9SU1RfQk9PVCAgICAgICAgICAgIDB4MDAwMTE4MDAwNjAwMTYwMFVMTAorI2RlZmluZSAgICBDTjIzWFhfUlNUX1NPRlRfUlNUICAgICAgICAweDAwMDExODAwMDYwMDE2ODBVTEwKKworI2RlZmluZSAgICBDTjIzWFhfTE1DMF9SRVNFVF9DVEwgICAgICAgICAgICAgICAweDAwMDExODAwODgwMDAxODBVTEwKKyNkZWZpbmUgICAgQ04yM1hYX0xNQzBfUkVTRVRfQ1RMX0REUjNSU1RfTUFTSyAgMHgwMDAwMDAwMDAwMDAwMDAxVUxMCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2NuNjZ4eF9kZXZpY2UuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9jbjY2eHhfZGV2aWNlLmMKaW5kZXggYzAzZDM3MC4uZTc3OWFmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2NuNjZ4eF9kZXZpY2UuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vY242Nnh4X2RldmljZS5jCkBAIC0zMzgsNyArMzM4LDcgQEAKIAlvY3Rlb25fd3JpdGVfY3NyKG9jdCwgQ042WFhYX1NMSV9QS1RfQ05UX0lOVF9FTkIsIGludHIpOwogfQogCi12b2lkIGxpb19jbjZ4eHhfZW5hYmxlX2lvX3F1ZXVlcyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQoraW50IGxpb19jbjZ4eHhfZW5hYmxlX2lvX3F1ZXVlcyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQogewogCXUzMiBtYXNrOwogCkBAIC0zNTMsNiArMzUzLDggQEAKIAltYXNrID0gb2N0ZW9uX3JlYWRfY3NyKG9jdCwgQ042WFhYX1NMSV9QS1RfT1VUX0VOQik7CiAJbWFzayB8PSBvY3QtPmlvX3FtYXNrLm9xOwogCW9jdGVvbl93cml0ZV9jc3Iob2N0LCBDTjZYWFhfU0xJX1BLVF9PVVRfRU5CLCBtYXNrKTsKKworCXJldHVybiAwOwogfQogCiB2b2lkIGxpb19jbjZ4eHhfZGlzYWJsZV9pb19xdWV1ZXMoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKQEAgLTQxOCwzNiArNDIwLDYgQEAKIAkJb2N0ZW9uX3dyaXRlX2NzcihvY3QsIENONlhYWF9TTElfUEtUX1RJTUVfSU5ULCBkMzIpOwogfQogCi12b2lkIGxpb19jbjZ4eHhfcmVpbml0X3JlZ3Moc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfT0NURU9OX0lOU1RSX1FVRVVFUyhvY3QpOyBpKyspIHsKLQkJaWYgKCEob2N0LT5pb19xbWFzay5pcSAmICgxVUxMIDw8IGkpKSkKLQkJCWNvbnRpbnVlOwotCQlvY3QtPmZuX2xpc3Quc2V0dXBfaXFfcmVncyhvY3QsIGkpOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfT0NURU9OX09VVFBVVF9RVUVVRVMob2N0KTsgaSsrKSB7Ci0JCWlmICghKG9jdC0+aW9fcW1hc2sub3EgJiAoMVVMTCA8PCBpKSkpCi0JCQljb250aW51ZTsKLQkJb2N0LT5mbl9saXN0LnNldHVwX29xX3JlZ3Mob2N0LCBpKTsKLQl9Ci0KLQlvY3QtPmZuX2xpc3Quc2V0dXBfZGV2aWNlX3JlZ3Mob2N0KTsKLQotCW9jdC0+Zm5fbGlzdC5lbmFibGVfaW50ZXJydXB0KG9jdC0+Y2hpcCk7Ci0KLQlvY3QtPmZuX2xpc3QuZW5hYmxlX2lvX3F1ZXVlcyhvY3QpOwotCi0JLyogZm9yIChpID0gMDsgaSA8IG9jdC0+bnVtX29xczsgaSsrKSB7ICovCi0JZm9yIChpID0gMDsgaSA8IE1BWF9PQ1RFT05fT1VUUFVUX1FVRVVFUyhvY3QpOyBpKyspIHsKLQkJaWYgKCEob2N0LT5pb19xbWFzay5vcSAmICgxVUxMIDw8IGkpKSkKLQkJCWNvbnRpbnVlOwotCQl3cml0ZWwob2N0LT5kcm9xW2ldLT5tYXhfY291bnQsIG9jdC0+ZHJvcVtpXS0+cGt0c19jcmVkaXRfcmVnKTsKLQl9Ci19Ci0KIHZvaWQKIGxpb19jbjZ4eHhfYmFyMV9pZHhfc2V0dXAoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwKIAkJCSAgdTY0IGNvcmVfYWRkciwKQEAgLTUwNywxOCArNDc5LDIwIEBACiAJcmV0dXJuIG5ld19pZHg7CiB9CiAKLXZvaWQgbGlvX2NuNnh4eF9lbmFibGVfaW50ZXJydXB0KHZvaWQgKmNoaXApCit2b2lkIGxpb19jbjZ4eHhfZW5hYmxlX2ludGVycnVwdChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LAorCQkJCSB1OCB1bnVzZWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCiB7Ci0Jc3RydWN0IG9jdGVvbl9jbjZ4eHggKmNuNnh4eCA9IChzdHJ1Y3Qgb2N0ZW9uX2NuNnh4eCAqKWNoaXA7CisJc3RydWN0IG9jdGVvbl9jbjZ4eHggKmNuNnh4eCA9IChzdHJ1Y3Qgb2N0ZW9uX2NuNnh4eCAqKW9jdC0+Y2hpcDsKIAl1NjQgbWFzayA9IGNuNnh4eC0+aW50cl9tYXNrNjQgfCBDTjZYWFhfSU5UUl9ETUEwX0ZPUkNFOwogCiAJLyogRW5hYmxlIEludGVycnVwdCAqLwogCXdyaXRlcShtYXNrLCBjbjZ4eHgtPmludHJfZW5iX3JlZzY0KTsKIH0KIAotdm9pZCBsaW9fY242eHh4X2Rpc2FibGVfaW50ZXJydXB0KHZvaWQgKmNoaXApCit2b2lkIGxpb19jbjZ4eHhfZGlzYWJsZV9pbnRlcnJ1cHQoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwKKwkJCQkgIHU4IHVudXNlZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKIHsKLQlzdHJ1Y3Qgb2N0ZW9uX2NuNnh4eCAqY242eHh4ID0gKHN0cnVjdCBvY3Rlb25fY242eHh4ICopY2hpcDsKKwlzdHJ1Y3Qgb2N0ZW9uX2NuNnh4eCAqY242eHh4ID0gKHN0cnVjdCBvY3Rlb25fY242eHh4ICopb2N0LT5jaGlwOwogCiAJLyogRGlzYWJsZSBJbnRlcnJ1cHRzICovCiAJd3JpdGVxKDAsIGNuNnh4eC0+aW50cl9lbmJfcmVnNjQpOwpAQCAtNzE0LDcgKzY4OCw2IEBACiAKIAlvY3QtPmZuX2xpc3Quc29mdF9yZXNldCA9IGxpb19jbjZ4eHhfc29mdF9yZXNldDsKIAlvY3QtPmZuX2xpc3Quc2V0dXBfZGV2aWNlX3JlZ3MgPSBsaW9fY242eHh4X3NldHVwX2RldmljZV9yZWdzOwotCW9jdC0+Zm5fbGlzdC5yZWluaXRfcmVncyA9IGxpb19jbjZ4eHhfcmVpbml0X3JlZ3M7CiAJb2N0LT5mbl9saXN0LnVwZGF0ZV9pcV9yZWFkX2lkeCA9IGxpb19jbjZ4eHhfdXBkYXRlX3JlYWRfaW5kZXg7CiAKIAlvY3QtPmZuX2xpc3QuYmFyMV9pZHhfc2V0dXAgPSBsaW9fY242eHh4X2JhcjFfaWR4X3NldHVwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2NuNjZ4eF9kZXZpY2UuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9jbjY2eHhfZGV2aWNlLmgKaW5kZXggMjhjNDcyMi4uYTQwYTkxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2NuNjZ4eF9kZXZpY2UuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vY242Nnh4X2RldmljZS5oCkBAIC04MCwxOCArODAsMTcgQEAKIHZvaWQgbGlvX2NuNnh4eF9zZXR1cF9nbG9iYWxfb3V0cHV0X3JlZ3Moc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCk7CiB2b2lkIGxpb19jbjZ4eHhfc2V0dXBfaXFfcmVncyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LCB1MzIgaXFfbm8pOwogdm9pZCBsaW9fY242eHh4X3NldHVwX29xX3JlZ3Moc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwgdTMyIG9xX25vKTsKLXZvaWQgbGlvX2NuNnh4eF9lbmFibGVfaW9fcXVldWVzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpOworaW50IGxpb19jbjZ4eHhfZW5hYmxlX2lvX3F1ZXVlcyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KTsKIHZvaWQgbGlvX2NuNnh4eF9kaXNhYmxlX2lvX3F1ZXVlcyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KTsKIGlycXJldHVybl90IGxpb19jbjZ4eHhfcHJvY2Vzc19pbnRlcnJ1cHRfcmVncyh2b2lkICpkZXYpOwotdm9pZCBsaW9fY242eHh4X3JlaW5pdF9yZWdzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpOwogdm9pZCBsaW9fY242eHh4X2JhcjFfaWR4X3NldHVwKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsIHU2NCBjb3JlX2FkZHIsCiAJCQkgICAgICAgdTMyIGlkeCwgaW50IHZhbGlkKTsKIHZvaWQgbGlvX2NuNnh4eF9iYXIxX2lkeF93cml0ZShzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LCB1MzIgaWR4LCB1MzIgbWFzayk7CiB1MzIgbGlvX2NuNnh4eF9iYXIxX2lkeF9yZWFkKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsIHUzMiBpZHgpOwogdTMyCiBsaW9fY242eHh4X3VwZGF0ZV9yZWFkX2luZGV4KHN0cnVjdCBvY3Rlb25faW5zdHJfcXVldWUgKmlxKTsKLXZvaWQgbGlvX2NuNnh4eF9lbmFibGVfaW50ZXJydXB0KHZvaWQgKmNoaXApOwotdm9pZCBsaW9fY242eHh4X2Rpc2FibGVfaW50ZXJydXB0KHZvaWQgKmNoaXApOwordm9pZCBsaW9fY242eHh4X2VuYWJsZV9pbnRlcnJ1cHQoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwgdTggdW51c2VkKTsKK3ZvaWQgbGlvX2NuNnh4eF9kaXNhYmxlX2ludGVycnVwdChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LCB1OCB1bnVzZWQpOwogdm9pZCBjbjZ4eHhfZ2V0X3BjaWVfcWxtcG9ydChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KTsKIHZvaWQgbGlvX2NuNnh4eF9zZXR1cF9yZWdfYWRkcmVzcyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LCB2b2lkICpjaGlwLAogCQkJCSAgc3RydWN0IG9jdGVvbl9yZWdfbGlzdCAqcmVnX2xpc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2NuNjh4eF9kZXZpY2UuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9jbjY4eHhfZGV2aWNlLmMKaW5kZXggMjk3NTViYzYuLmRiZjM1NjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9jbjY4eHhfZGV2aWNlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2NuNjh4eF9kZXZpY2UuYwpAQCAtMTQ4LDcgKzE0OCw2IEBACiAJb2N0LT5mbl9saXN0LnByb2Nlc3NfaW50ZXJydXB0X3JlZ3MgPSBsaW9fY242eHh4X3Byb2Nlc3NfaW50ZXJydXB0X3JlZ3M7CiAJb2N0LT5mbl9saXN0LnNvZnRfcmVzZXQgPSBsaW9fY242OHh4X3NvZnRfcmVzZXQ7CiAJb2N0LT5mbl9saXN0LnNldHVwX2RldmljZV9yZWdzID0gbGlvX2NuNjh4eF9zZXR1cF9kZXZpY2VfcmVnczsKLQlvY3QtPmZuX2xpc3QucmVpbml0X3JlZ3MgPSBsaW9fY242eHh4X3JlaW5pdF9yZWdzOwogCW9jdC0+Zm5fbGlzdC51cGRhdGVfaXFfcmVhZF9pZHggPSBsaW9fY242eHh4X3VwZGF0ZV9yZWFkX2luZGV4OwogCiAJb2N0LT5mbl9saXN0LmJhcjFfaWR4X3NldHVwID0gbGlvX2NuNnh4eF9iYXIxX2lkeF9zZXR1cDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9saW9fY29yZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2xpb19jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxZWRkYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9saW9fY29yZS5jCkBAIC0wLDAgKzEsMjY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBBdXRob3I6IENhdml1bSwgSW5jLgorKgorKiBDb250YWN0OiBzdXBwb3J0QGNhdml1bS5jb20KKyogICAgICAgICAgUGxlYXNlIGluY2x1ZGUgIkxpcXVpZElPIiBpbiB0aGUgc3ViamVjdC4KKyoKKyogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTUgQ2F2aXVtLCBJbmMuCisqCisqIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMiwgYXMKKyogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqCisqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyogQVMtSVMgYW5kIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBUSVRMRSwgb3IKKyogTk9OSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQorKiBkZXRhaWxzLgorKgorKiBUaGlzIGZpbGUgbWF5IGFsc28gYmUgYXZhaWxhYmxlIHVuZGVyIGEgZGlmZmVyZW50IGxpY2Vuc2UgZnJvbSBDYXZpdW0uCisqIENvbnRhY3QgQ2F2aXVtLCBJbmMuIGZvciBtb3JlIGluZm9ybWF0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlICJsaXF1aWRpb19jb21tb24uaCIKKyNpbmNsdWRlICJvY3Rlb25fZHJvcS5oIgorI2luY2x1ZGUgIm9jdGVvbl9pcS5oIgorI2luY2x1ZGUgInJlc3BvbnNlX21hbmFnZXIuaCIKKyNpbmNsdWRlICJvY3Rlb25fZGV2aWNlLmgiCisjaW5jbHVkZSAib2N0ZW9uX25pYy5oIgorI2luY2x1ZGUgIm9jdGVvbl9tYWluLmgiCisjaW5jbHVkZSAib2N0ZW9uX25ldHdvcmsuaCIKKworaW50IGxpcXVpZGlvX3NldF9mZWF0dXJlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBjbWQsIHUxNiBwYXJhbTEpCit7CisJc3RydWN0IGxpbyAqbGlvID0gR0VUX0xJTyhuZXRkZXYpOworCXN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QgPSBsaW8tPm9jdF9kZXY7CisJc3RydWN0IG9jdG5pY19jdHJsX3BrdCBuY3RybDsKKwlpbnQgcmV0ID0gMDsKKworCW1lbXNldCgmbmN0cmwsIDAsIHNpemVvZihzdHJ1Y3Qgb2N0bmljX2N0cmxfcGt0KSk7CisKKwluY3RybC5uY21kLnU2NCA9IDA7CisJbmN0cmwubmNtZC5zLmNtZCA9IGNtZDsKKwluY3RybC5uY21kLnMucGFyYW0xID0gcGFyYW0xOworCW5jdHJsLmlxX25vID0gbGlvLT5saW5mby50eHBjaXFbMF0ucy5xX25vOworCW5jdHJsLndhaXRfdGltZSA9IDEwMDsKKwluY3RybC5uZXRwbmRldiA9ICh1NjQpbmV0ZGV2OworCW5jdHJsLmNiX2ZuID0gbGlxdWlkaW9fbGlua19jdHJsX2NtZF9jb21wbGV0aW9uOworCisJcmV0ID0gb2N0bmV0X3NlbmRfbmljX2N0cmxfcGt0KGxpby0+b2N0X2RldiwgJm5jdHJsKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIkZlYXR1cmUgY2hhbmdlIGZhaWxlZCBpbiBjb3JlIChyZXQ6IDB4JXgpXG4iLAorCQkJcmV0KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBvY3Rlb25fcmVwb3J0X3R4X2NvbXBsZXRpb25fdG9fYnFsKHZvaWQgKnR4cSwgdW5zaWduZWQgaW50IHBrdHNfY29tcGwsCisJCQkJCXVuc2lnbmVkIGludCBieXRlc19jb21wbCkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICpuZXRkZXZfcXVldWUgPSB0eHE7CisKKwluZXRkZXZfdHhfY29tcGxldGVkX3F1ZXVlKG5ldGRldl9xdWV1ZSwgcGt0c19jb21wbCwgYnl0ZXNfY29tcGwpOworfQorCit2b2lkIG9jdGVvbl91cGRhdGVfdHhfY29tcGxldGlvbl9jb3VudGVycyh2b2lkICpidWYsIGludCByZXF0eXBlLAorCQkJCQkgIHVuc2lnbmVkIGludCAqcGt0c19jb21wbCwKKwkJCQkJICB1bnNpZ25lZCBpbnQgKmJ5dGVzX2NvbXBsKQoreworCXN0cnVjdCBvY3RuZXRfYnVmX2ZyZWVfaW5mbyAqZmluZm87CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJc3RydWN0IG9jdGVvbl9zb2Z0X2NvbW1hbmQgKnNjOworCisJc3dpdGNoIChyZXF0eXBlKSB7CisJY2FzZSBSRVFUWVBFX05PUkVTUF9ORVQ6CisJY2FzZSBSRVFUWVBFX05PUkVTUF9ORVRfU0c6CisJCWZpbmZvID0gYnVmOworCQlza2IgPSBmaW5mby0+c2tiOworCQlicmVhazsKKworCWNhc2UgUkVRVFlQRV9SRVNQX05FVF9TRzoKKwljYXNlIFJFUVRZUEVfUkVTUF9ORVQ6CisJCXNjID0gYnVmOworCQlza2IgPSBzYy0+Y2FsbGJhY2tfYXJnOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisKKwkoKnBrdHNfY29tcGwpKys7CisvKlRPRE8sIFVzZSBzb21lIG90aGVyIHBvdW5kIGRlZmluZSB0byBzdWdnZXN0CisgKiB0aGUgZmFjdCB0aGF0IGlxcyBhcmUgbm90IHRpZWQgdG8gbmV0ZGV2cworICogYW5kIGNhbiB0YWtlIHRyYWZmaWMgZnJvbSBkaWZmZXJlbnQgbmV0ZGV2cworICogaGVuY2UgYnFsIHJlcG9ydGluZyBpcyBkb25lIHBlciBwYWNrZXQKKyAqIHRoYW4gaW4gYnVsay4gVXNhZ2Ugb2YgTk9fTkFQSSBpbiB0eHEgY29tcGxldGlvbiBpcworICogYSBsaXR0bGUgY29uZnVzaW5nCisgKi8KKwkqYnl0ZXNfY29tcGwgKz0gc2tiLT5sZW47Cit9CisKK3ZvaWQgb2N0ZW9uX3JlcG9ydF9zZW50X2J5dGVzX3RvX2JxbCh2b2lkICpidWYsIGludCByZXF0eXBlKQoreworCXN0cnVjdCBvY3RuZXRfYnVmX2ZyZWVfaW5mbyAqZmluZm87CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgb2N0ZW9uX3NvZnRfY29tbWFuZCAqc2M7CisJc3RydWN0IG5ldGRldl9xdWV1ZSAqdHhxOworCisJc3dpdGNoIChyZXF0eXBlKSB7CisJY2FzZSBSRVFUWVBFX05PUkVTUF9ORVQ6CisJY2FzZSBSRVFUWVBFX05PUkVTUF9ORVRfU0c6CisJCWZpbmZvID0gYnVmOworCQlza2IgPSBmaW5mby0+c2tiOworCQlicmVhazsKKworCWNhc2UgUkVRVFlQRV9SRVNQX05FVF9TRzoKKwljYXNlIFJFUVRZUEVfUkVTUF9ORVQ6CisJCXNjID0gYnVmOworCQlza2IgPSBzYy0+Y2FsbGJhY2tfYXJnOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisKKwl0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKHNrYi0+ZGV2LCBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKSk7CisJbmV0ZGV2X3R4X3NlbnRfcXVldWUodHhxLCBza2ItPmxlbik7Cit9CisKK3ZvaWQgbGlxdWlkaW9fbGlua19jdHJsX2NtZF9jb21wbGV0aW9uKHZvaWQgKm5jdHJsX3B0cikKK3sKKwlzdHJ1Y3Qgb2N0bmljX2N0cmxfcGt0ICpuY3RybCA9IChzdHJ1Y3Qgb2N0bmljX2N0cmxfcGt0ICopbmN0cmxfcHRyOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKiluY3RybC0+bmV0cG5kZXY7CisJc3RydWN0IGxpbyAqbGlvID0gR0VUX0xJTyhuZXRkZXYpOworCXN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QgPSBsaW8tPm9jdF9kZXY7CisJdTggKm1hYzsKKworCXN3aXRjaCAobmN0cmwtPm5jbWQucy5jbWQpIHsKKwljYXNlIE9DVE5FVF9DTURfQ0hBTkdFX0RFVkZMQUdTOgorCWNhc2UgT0NUTkVUX0NNRF9TRVRfTVVMVElfTElTVDoKKwkJYnJlYWs7CisKKwljYXNlIE9DVE5FVF9DTURfQ0hBTkdFX01BQ0FERFI6CisJCW1hYyA9ICgodTggKikmbmN0cmwtPnVkZFswXSkgKyAyOworCQluZXRpZl9pbmZvKGxpbywgcHJvYmUsIGxpby0+bmV0ZGV2LAorCQkJICAgIk1BQ0FkZHIgY2hhbmdlZCB0byAlMi4yeDolMi4yeDolMi4yeDolMi4yeDolMi4yeDolMi4yeFxuIiwKKwkJCSAgIG1hY1swXSwgbWFjWzFdLAorCQkJICAgbWFjWzJdLCBtYWNbM10sCisJCQkgICBtYWNbNF0sIG1hY1s1XSk7CisJCWJyZWFrOworCisJY2FzZSBPQ1RORVRfQ01EX0NIQU5HRV9NVFU6CisJCS8qIElmIGNvbW1hbmQgaXMgc3VjY2Vzc2Z1bCwgY2hhbmdlIHRoZSBNVFUuICovCisJCW5ldGlmX2luZm8obGlvLCBwcm9iZSwgbGlvLT5uZXRkZXYsICJNVFUgQ2hhbmdlZCBmcm9tICVkIHRvICVkXG4iLAorCQkJICAgbmV0ZGV2LT5tdHUsIG5jdHJsLT5uY21kLnMucGFyYW0xKTsKKwkJZGV2X2luZm8oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMgTVRVIENoYW5nZWQgZnJvbSAlZCB0byAlZFxuIiwKKwkJCSBuZXRkZXYtPm5hbWUsIG5ldGRldi0+bXR1LAorCQkJIG5jdHJsLT5uY21kLnMucGFyYW0xKTsKKwkJbmV0ZGV2LT5tdHUgPSBuY3RybC0+bmNtZC5zLnBhcmFtMTsKKwkJcXVldWVfZGVsYXllZF93b3JrKGxpby0+bGlua19zdGF0dXNfd3Eud3EsCisJCQkJICAgJmxpby0+bGlua19zdGF0dXNfd3Eud2sud29yaywgMCk7CisJCWJyZWFrOworCisJY2FzZSBPQ1RORVRfQ01EX0dQSU9fQUNDRVNTOgorCQluZXRpZl9pbmZvKGxpbywgcHJvYmUsIGxpby0+bmV0ZGV2LCAiTEVEIEZsYXNoaW5nIHZpc3VhbCBpZGVudGlmaWNhdGlvblxuIik7CisKKwkJYnJlYWs7CisKKwljYXNlIE9DVE5FVF9DTURfSURfQUNUSVZFOgorCQluZXRpZl9pbmZvKGxpbywgcHJvYmUsIGxpby0+bmV0ZGV2LCAiTEVEIEZsYXNoaW5nIHZpc3VhbCBpZGVudGlmaWNhdGlvblxuIik7CisKKwkJYnJlYWs7CisKKwljYXNlIE9DVE5FVF9DTURfTFJPX0VOQUJMRToKKwkJZGV2X2luZm8oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMgTFJPIEVuYWJsZWRcbiIsIG5ldGRldi0+bmFtZSk7CisJCWJyZWFrOworCisJY2FzZSBPQ1RORVRfQ01EX0xST19ESVNBQkxFOgorCQlkZXZfaW5mbygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyBMUk8gRGlzYWJsZWRcbiIsCisJCQkgbmV0ZGV2LT5uYW1lKTsKKwkJYnJlYWs7CisKKwljYXNlIE9DVE5FVF9DTURfVkVSQk9TRV9FTkFCTEU6CisJCWRldl9pbmZvKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzIEZpcm13YXJlIGRlYnVnIGVuYWJsZWRcbiIsCisJCQkgbmV0ZGV2LT5uYW1lKTsKKwkJYnJlYWs7CisKKwljYXNlIE9DVE5FVF9DTURfVkVSQk9TRV9ESVNBQkxFOgorCQlkZXZfaW5mbygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyBGaXJtd2FyZSBkZWJ1ZyBkaXNhYmxlZFxuIiwKKwkJCSBuZXRkZXYtPm5hbWUpOworCQlicmVhazsKKworCWNhc2UgT0NUTkVUX0NNRF9FTkFCTEVfVkxBTl9GSUxURVI6CisJCWRldl9pbmZvKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzIFZMQU4gZmlsdGVyIGVuYWJsZWRcbiIsCisJCQkgbmV0ZGV2LT5uYW1lKTsKKwkJYnJlYWs7CisKKwljYXNlIE9DVE5FVF9DTURfQUREX1ZMQU5fRklMVEVSOgorCQlkZXZfaW5mbygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyBWTEFOIGZpbHRlciAlZCBhZGRlZFxuIiwKKwkJCSBuZXRkZXYtPm5hbWUsIG5jdHJsLT5uY21kLnMucGFyYW0xKTsKKwkJYnJlYWs7CisKKwljYXNlIE9DVE5FVF9DTURfREVMX1ZMQU5fRklMVEVSOgorCQlkZXZfaW5mbygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyBWTEFOIGZpbHRlciAlZCByZW1vdmVkXG4iLAorCQkJIG5ldGRldi0+bmFtZSwgbmN0cmwtPm5jbWQucy5wYXJhbTEpOworCQlicmVhazsKKworCWNhc2UgT0NUTkVUX0NNRF9TRVRfU0VUVElOR1M6CisJCWRldl9pbmZvKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzIHNldHRpbmdzIGNoYW5nZWRcbiIsCisJCQkgbmV0ZGV2LT5uYW1lKTsKKworCQlicmVhazsKKworCS8qIENhc2UgdG8gaGFuZGxlICJPQ1RORVRfQ01EX1ROTF9SWF9DU1VNX0NUTCIKKwkgKiBDb21tYW5kIHBhc3NlZCBieSBOSUMgZHJpdmVyCisJICovCisJY2FzZSBPQ1RORVRfQ01EX1ROTF9SWF9DU1VNX0NUTDoKKwkJaWYgKG5jdHJsLT5uY21kLnMucGFyYW0xID09IE9DVE5FVF9DTURfUlhDU1VNX0VOQUJMRSkgeworCQkJbmV0aWZfaW5mbyhsaW8sIHByb2JlLCBsaW8tPm5ldGRldiwKKwkJCQkgICAiUlggQ2hlY2tzdW0gT2ZmbG9hZCBFbmFibGVkXG4iKTsKKwkJfSBlbHNlIGlmIChuY3RybC0+bmNtZC5zLnBhcmFtMSA9PQorCQkJICAgT0NUTkVUX0NNRF9SWENTVU1fRElTQUJMRSkgeworCQkJbmV0aWZfaW5mbyhsaW8sIHByb2JlLCBsaW8tPm5ldGRldiwKKwkJCQkgICAiUlggQ2hlY2tzdW0gT2ZmbG9hZCBEaXNhYmxlZFxuIik7CisJCX0KKwkJYnJlYWs7CisKKwkJLyogQ2FzZSB0byBoYW5kbGUgIk9DVE5FVF9DTURfVE5MX1RYX0NTVU1fQ1RMIgorCQkgKiBDb21tYW5kIHBhc3NlZCBieSBOSUMgZHJpdmVyCisJCSAqLworCWNhc2UgT0NUTkVUX0NNRF9UTkxfVFhfQ1NVTV9DVEw6CisJCWlmIChuY3RybC0+bmNtZC5zLnBhcmFtMSA9PSBPQ1RORVRfQ01EX1RYQ1NVTV9FTkFCTEUpIHsKKwkJCW5ldGlmX2luZm8obGlvLCBwcm9iZSwgbGlvLT5uZXRkZXYsCisJCQkJICAgIlRYIENoZWNrc3VtIE9mZmxvYWQgRW5hYmxlZFxuIik7CisJCX0gZWxzZSBpZiAobmN0cmwtPm5jbWQucy5wYXJhbTEgPT0KKwkJCSAgIE9DVE5FVF9DTURfVFhDU1VNX0RJU0FCTEUpIHsKKwkJCW5ldGlmX2luZm8obGlvLCBwcm9iZSwgbGlvLT5uZXRkZXYsCisJCQkJICAgIlRYIENoZWNrc3VtIE9mZmxvYWQgRGlzYWJsZWRcbiIpOworCQl9CisJCWJyZWFrOworCisJCS8qIENhc2UgdG8gaGFuZGxlICJPQ1RORVRfQ01EX1ZYTEFOX1BPUlRfQ09ORklHIgorCQkgKiBDb21tYW5kIHBhc3NlZCBieSBOSUMgZHJpdmVyCisJCSAqLworCWNhc2UgT0NUTkVUX0NNRF9WWExBTl9QT1JUX0NPTkZJRzoKKwkJaWYgKG5jdHJsLT5uY21kLnMubW9yZSA9PSBPQ1RORVRfQ01EX1ZYTEFOX1BPUlRfQUREKSB7CisJCQluZXRpZl9pbmZvKGxpbywgcHJvYmUsIGxpby0+bmV0ZGV2LAorCQkJCSAgICJWeExBTiBEZXN0aW5hdGlvbiBVRFAgUE9SVDolZCBBRERFRFxuIiwKKwkJCQkgICBuY3RybC0+bmNtZC5zLnBhcmFtMSk7CisJCX0gZWxzZSBpZiAobmN0cmwtPm5jbWQucy5tb3JlID09CisJCQkgICBPQ1RORVRfQ01EX1ZYTEFOX1BPUlRfREVMKSB7CisJCQluZXRpZl9pbmZvKGxpbywgcHJvYmUsIGxpby0+bmV0ZGV2LAorCQkJCSAgICJWeExBTiBEZXN0aW5hdGlvbiBVRFAgUE9SVDolZCBERUxFVEVEXG4iLAorCQkJCSAgIG5jdHJsLT5uY21kLnMucGFyYW0xKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgT0NUTkVUX0NNRF9TRVRfRkxPV19DVEw6CisJCW5ldGlmX2luZm8obGlvLCBwcm9iZSwgbGlvLT5uZXRkZXYsICJTZXQgUlgvVFggZmxvdyBjb250cm9sIHBhcmFtZXRlcnNcbiIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMgVW5rbm93biBjbWQgJWRcbiIsIF9fZnVuY19fLAorCQkJbmN0cmwtPm5jbWQucy5jbWQpOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9saW9fZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2xpb19ldGh0b29sLmMKaW5kZXggMjg5ZWI4OS4uZjE2M2UwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2xpb19ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2xpb19ldGh0b29sLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlICJvY3Rlb25fbmV0d29yay5oIgogI2luY2x1ZGUgImNuNjZ4eF9yZWdzLmgiCiAjaW5jbHVkZSAiY242Nnh4X2RldmljZS5oIgorI2luY2x1ZGUgImNuMjN4eF9wZl9kZXZpY2UuaCIKIAogc3RhdGljIGludCBvY3RuZXRfZ2V0X2xpbmtfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CiAKQEAgLTc1LDYgKzc2LDcgQEAKIAogI2RlZmluZSBBUlJBWV9MRU5HVEgoYSkgKHNpemVvZihhKSAvIHNpemVvZigoYSlbMF0pKQogI2RlZmluZSBPQ1RfRVRIVE9PTF9SRUdEVU1QX0xFTiAgNDA5NgorI2RlZmluZSBPQ1RfRVRIVE9PTF9SRUdEVU1QX0xFTl8yM1hYICAoNDA5NiAqIDExKQogI2RlZmluZSBPQ1RfRVRIVE9PTF9SRUdTVkVSICAxCiAKIC8qIHN0YXRpc3RpY3Mgb2YgUEYgKi8KQEAgLTE4OCw2ICsxOTAsMTAgQEAKIAkiYnVmZmVyX2FsbG9jX2ZhaWx1cmUiLAogfTsKIAorLyogTGlxdWlkSU8gZHJpdmVyIHByaXZhdGUgZmxhZ3MgKi8KK3N0YXRpYyBjb25zdCBjaGFyIG9jdF9wcml2X2ZsYWdzX3N0cmluZ3NbXVtFVEhfR1NUUklOR19MRU5dID0geworfTsKKwogI2RlZmluZSBPQ1ROSUNfTkNNRF9BVVRPTkVHX09OICAweDEKICNkZWZpbmUgT0NUTklDX05DTURfUEhZX09OICAgICAgMHgyCiAKQEAgLTI1OSw2ICsyNjUsMTMgQEAKIAkJbWF4X3R4ID0gQ0ZHX0dFVF9JUV9NQVhfUShjb25mNngpOwogCQlyeF9jb3VudCA9IENGR19HRVRfTlVNX1JYUVNfTklDX0lGKGNvbmY2eCwgbGlvLT5pZmlkeCk7CiAJCXR4X2NvdW50ID0gQ0ZHX0dFVF9OVU1fVFhRU19OSUNfSUYoY29uZjZ4LCBsaW8tPmlmaWR4KTsKKwl9IGVsc2UgaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSkgeworCQlzdHJ1Y3Qgb2N0ZW9uX2NvbmZpZyAqY29uZjIzID0gQ0hJUF9GSUVMRChvY3QsIGNuMjN4eF9wZiwgY29uZik7CisKKwkJbWF4X3J4ID0gQ0ZHX0dFVF9PUV9NQVhfUShjb25mMjMpOworCQltYXhfdHggPSBDRkdfR0VUX0lRX01BWF9RKGNvbmYyMyk7CisJCXJ4X2NvdW50ID0gQ0ZHX0dFVF9OVU1fUlhRU19OSUNfSUYoY29uZjIzLCBsaW8tPmlmaWR4KTsKKwkJdHhfY291bnQgPSBDRkdfR0VUX05VTV9UWFFTX05JQ19JRihjb25mMjMsIGxpby0+aWZpZHgpOwogCX0KIAogCWNoYW5uZWwtPm1heF9yeCA9IG1heF9yeDsKQEAgLTI5MCwxOCArMzAzLDE2IEBACiAJc3RydWN0IGxpbyAqbGlvID0gR0VUX0xJTyhuZXRkZXYpOwogCXN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3RfZGV2ID0gbGlvLT5vY3RfZGV2OwogCXN0cnVjdCBvY3Rlb25fYm9hcmRfaW5mbyAqYm9hcmRfaW5mbzsKLQlpbnQgbGVuOwogCi0JaWYgKGVlcHJvbS0+b2Zmc2V0ICE9IDApCisJaWYgKGVlcHJvbS0+b2Zmc2V0KQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWVlcHJvbS0+bWFnaWMgPSBvY3RfZGV2LT5wY2lfZGV2LT52ZW5kb3I7CiAJYm9hcmRfaW5mbyA9IChzdHJ1Y3Qgb2N0ZW9uX2JvYXJkX2luZm8gKikoJm9jdF9kZXYtPmJvYXJkaW5mbyk7Ci0JbGVuID0KLQkJc3ByaW50ZigoY2hhciAqKWJ5dGVzLAotCQkJImJvYXJkbmFtZTolcyBzZXJpYWxudW06JXMgbWFqOiVsbGQgbWluOiVsbGRcbiIsCi0JCQlib2FyZF9pbmZvLT5uYW1lLCBib2FyZF9pbmZvLT5zZXJpYWxfbnVtYmVyLAotCQkJYm9hcmRfaW5mby0+bWFqb3IsIGJvYXJkX2luZm8tPm1pbm9yKTsKKwlzcHJpbnRmKChjaGFyICopYnl0ZXMsCisJCSJib2FyZG5hbWU6JXMgc2VyaWFsbnVtOiVzIG1hajolbGxkIG1pbjolbGxkXG4iLAorCQlib2FyZF9pbmZvLT5uYW1lLCBib2FyZF9pbmZvLT5zZXJpYWxfbnVtYmVyLAorCQlib2FyZF9pbmZvLT5tYWpvciwgYm9hcmRfaW5mby0+bWlub3IpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMzMsNiArMzQ0LDMyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgb2N0bmV0X2lkX2FjdGl2ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmFsKQoreworCXN0cnVjdCBsaW8gKmxpbyA9IEdFVF9MSU8obmV0ZGV2KTsKKwlzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0ID0gbGlvLT5vY3RfZGV2OworCXN0cnVjdCBvY3RuaWNfY3RybF9wa3QgbmN0cmw7CisJaW50IHJldCA9IDA7CisKKwltZW1zZXQoJm5jdHJsLCAwLCBzaXplb2Yoc3RydWN0IG9jdG5pY19jdHJsX3BrdCkpOworCisJbmN0cmwubmNtZC51NjQgPSAwOworCW5jdHJsLm5jbWQucy5jbWQgPSBPQ1RORVRfQ01EX0lEX0FDVElWRTsKKwluY3RybC5uY21kLnMucGFyYW0xID0gdmFsOworCW5jdHJsLmlxX25vID0gbGlvLT5saW5mby50eHBjaXFbMF0ucy5xX25vOworCW5jdHJsLndhaXRfdGltZSA9IDEwMDsKKwluY3RybC5uZXRwbmRldiA9ICh1NjQpbmV0ZGV2OworCW5jdHJsLmNiX2ZuID0gbGlxdWlkaW9fbGlua19jdHJsX2NtZF9jb21wbGV0aW9uOworCisJcmV0ID0gb2N0bmV0X3NlbmRfbmljX2N0cmxfcGt0KGxpby0+b2N0X2RldiwgJm5jdHJsKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIkZhaWxlZCB0byBjb25maWd1cmUgZ3BpbyB2YWx1ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCiAvKiBDYWxsYmFjayBmb3Igd2hlbiBtZGlvIGNvbW1hbmQgcmVzcG9uc2UgYXJyaXZlcwogICovCiBzdGF0aWMgdm9pZCBvY3RuZXRfbWRpb19yZXNwX2NhbGxiYWNrKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsCkBAIC00MDYsNyArNDQzLDcgQEAKIAkJZGV2X2Vycigmb2N0X2Rldi0+cGNpX2Rldi0+ZGV2LAogCQkJIm9jdG5ldF9tZGlvNDVfYWNjZXNzIGluc3RydWN0aW9uIGZhaWxlZCBzdGF0dXM6ICV4XG4iLAogCQkJcmV0dmFsKTsKLQkJcmV0dmFsID0gIC1FQlVTWTsKKwkJcmV0dmFsID0gLUVCVVNZOwogCX0gZWxzZSB7CiAJCS8qIFNsZWVwIG9uIGEgd2FpdCBxdWV1ZSB0aWxsIHRoZSBjb25kIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlCiAJCSAqIHJlc3BvbnNlIGFycml2ZWQKQEAgLTQ3Niw2ICs1MTMsMTEgQEAKIAkJCQkJCSAgICZ2YWx1ZSk7CiAJCQlpZiAocmV0KQogCQkJCXJldHVybiByZXQ7CisJCX0gZWxzZSBpZiAob2N0LT5jaGlwX2lkID09IE9DVEVPTl9DTjIzWFhfUEZfVklEKSB7CisJCQlvY3RuZXRfaWRfYWN0aXZlKG5ldGRldiwgTEVEX0lERU5USUZJQ0FUSU9OX09OKTsKKworCQkJLyogcmV0dXJucyAwIHNpbmNlIHVwZGF0ZXMgYXJlIGFzeW5jaHJvbm91cyAqLworCQkJcmV0dXJuIDA7CiAJCX0gZWxzZSB7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtNTIxLDcgKzU2MywxMCBAQAogCQkJCQkJICAgJmxpby0+cGh5X2JlYWNvbl92YWwpOwogCQkJaWYgKHJldCkKIAkJCQlyZXR1cm4gcmV0OworCQl9IGVsc2UgaWYgKG9jdC0+Y2hpcF9pZCA9PSBPQ1RFT05fQ04yM1hYX1BGX1ZJRCkgeworCQkJb2N0bmV0X2lkX2FjdGl2ZShuZXRkZXYsIExFRF9JREVOVElGSUNBVElPTl9PRkYpOwogCisJCQlyZXR1cm4gMDsKIAkJfSBlbHNlIHsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC01NTAsNiArNTk1LDEzIEBACiAJCXJ4X21heF9wZW5kaW5nID0gQ042WFhYX01BWF9PUV9ERVNDUklQVE9SUzsKIAkJcnhfcGVuZGluZyA9IENGR19HRVRfTlVNX1JYX0RFU0NTX05JQ19JRihjb25mNngsIGxpby0+aWZpZHgpOwogCQl0eF9wZW5kaW5nID0gQ0ZHX0dFVF9OVU1fVFhfREVTQ1NfTklDX0lGKGNvbmY2eCwgbGlvLT5pZmlkeCk7CisJfSBlbHNlIGlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkpIHsKKwkJc3RydWN0IG9jdGVvbl9jb25maWcgKmNvbmYyMyA9IENISVBfRklFTEQob2N0LCBjbjIzeHhfcGYsIGNvbmYpOworCisJCXR4X21heF9wZW5kaW5nID0gQ04yM1hYX01BWF9JUV9ERVNDUklQVE9SUzsKKwkJcnhfbWF4X3BlbmRpbmcgPSBDTjIzWFhfTUFYX09RX0RFU0NSSVBUT1JTOworCQlyeF9wZW5kaW5nID0gQ0ZHX0dFVF9OVU1fUlhfREVTQ1NfTklDX0lGKGNvbmYyMywgbGlvLT5pZmlkeCk7CisJCXR4X3BlbmRpbmcgPSBDRkdfR0VUX05VTV9UWF9ERVNDU19OSUNfSUYoY29uZjIzLCBsaW8tPmlmaWR4KTsKIAl9CiAKIAlpZiAobGlvLT5tdHUgPiBPQ1RORVRfREVGQVVMVF9GUk1fU0laRSAtIE9DVE5FVF9GUk1fSEVBREVSX1NJWkUpIHsKQEAgLTYxMCw2ICs2NjIsNjkgQEAKIAlwYXVzZS0+cnhfcGF1c2UgPSBvY3QtPnJ4X3BhdXNlOwogfQogCitzdGF0aWMgaW50CitsaW9fc2V0X3BhdXNlcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqcGF1c2UpCit7CisJLyogTm90ZXM6IE5vdCBzdXBwb3J0aW5nIGFueSBhdXRvIG5lZ290aWF0aW9uIGluIHRoZXNlCisJICogZHJpdmVycy4KKwkgKi8KKwlzdHJ1Y3QgbGlvICpsaW8gPSBHRVRfTElPKG5ldGRldik7CisJc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCA9IGxpby0+b2N0X2RldjsKKwlzdHJ1Y3Qgb2N0bmljX2N0cmxfcGt0IG5jdHJsOworCXN0cnVjdCBvY3RfbGlua19pbmZvICpsaW5mbyA9ICZsaW8tPmxpbmZvOworCisJaW50IHJldCA9IDA7CisKKwlpZiAob2N0LT5jaGlwX2lkICE9IE9DVEVPTl9DTjIzWFhfUEZfVklEKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChsaW5mby0+bGluay5zLmR1cGxleCA9PSAwKSB7CisJCS8qbm8gZmxvdyBjb250cm9sIGZvciBoYWxmIGR1cGxleCovCisJCWlmIChwYXVzZS0+cnhfcGF1c2UgfHwgcGF1c2UtPnR4X3BhdXNlKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLypkbyBub3Qgc3VwcG9ydCBhdXRvbmVnIG9mIGxpbmsgZmxvdyBjb250cm9sKi8KKwlpZiAocGF1c2UtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KCZuY3RybCwgMCwgc2l6ZW9mKHN0cnVjdCBvY3RuaWNfY3RybF9wa3QpKTsKKworCW5jdHJsLm5jbWQudTY0ID0gMDsKKwluY3RybC5uY21kLnMuY21kID0gT0NUTkVUX0NNRF9TRVRfRkxPV19DVEw7CisJbmN0cmwuaXFfbm8gPSBsaW8tPmxpbmZvLnR4cGNpcVswXS5zLnFfbm87CisJbmN0cmwud2FpdF90aW1lID0gMTAwOworCW5jdHJsLm5ldHBuZGV2ID0gKHU2NCluZXRkZXY7CisJbmN0cmwuY2JfZm4gPSBsaXF1aWRpb19saW5rX2N0cmxfY21kX2NvbXBsZXRpb247CisKKwlpZiAocGF1c2UtPnJ4X3BhdXNlKSB7CisJCS8qZW5hYmxlIHJ4IHBhdXNlKi8KKwkJbmN0cmwubmNtZC5zLnBhcmFtMSA9IDE7CisJfSBlbHNlIHsKKwkJLypkaXNhYmxlIHJ4IHBhdXNlKi8KKwkJbmN0cmwubmNtZC5zLnBhcmFtMSA9IDA7CisJfQorCisJaWYgKHBhdXNlLT50eF9wYXVzZSkgeworCQkvKmVuYWJsZSB0eCBwYXVzZSovCisJCW5jdHJsLm5jbWQucy5wYXJhbTIgPSAxOworCX0gZWxzZSB7CisJCS8qZGlzYWJsZSB0eCBwYXVzZSovCisJCW5jdHJsLm5jbWQucy5wYXJhbTIgPSAwOworCX0KKworCXJldCA9IG9jdG5ldF9zZW5kX25pY19jdHJsX3BrdChsaW8tPm9jdF9kZXYsICZuY3RybCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJGYWlsZWQgdG8gc2V0IHBhdXNlIHBhcmFtZXRlclxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW9jdC0+cnhfcGF1c2UgPSBwYXVzZS0+cnhfcGF1c2U7CisJb2N0LT50eF9wYXVzZSA9IHBhdXNlLT50eF9wYXVzZTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZAogbGlvX2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAJCSAgICAgIHN0cnVjdCBldGh0b29sX3N0YXRzICpzdGF0cyAgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCkBAIC04NzcsNiArOTkyLDI3IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBsaW9fZ2V0X3ByaXZfZmxhZ3Nfc3RyaW5ncyhzdHJ1Y3QgbGlvICpsaW8sIHU4ICpkYXRhKQoreworCXN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3RfZGV2ID0gbGlvLT5vY3RfZGV2OworCWludCBpOworCisJc3dpdGNoIChvY3RfZGV2LT5jaGlwX2lkKSB7CisJY2FzZSBPQ1RFT05fQ04yM1hYX1BGX1ZJRDoKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob2N0X3ByaXZfZmxhZ3Nfc3RyaW5ncyk7IGkrKykgeworCQkJc3ByaW50ZihkYXRhLCAiJXMiLCBvY3RfcHJpdl9mbGFnc19zdHJpbmdzW2ldKTsKKwkJCWRhdGEgKz0gRVRIX0dTVFJJTkdfTEVOOworCQl9CisJCWJyZWFrOworCWNhc2UgT0NURU9OX0NONjhYWDoKKwljYXNlIE9DVEVPTl9DTjY2WFg6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW5ldGlmX2luZm8obGlvLCBkcnYsIGxpby0+bmV0ZGV2LCAiVW5rbm93biBDaGlwICEhXG4iKTsKKwkJYnJlYWs7CisJfQorfQorCiBzdGF0aWMgdm9pZCBsaW9fZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIHN0cmluZ3NldCwgdTggKmRhdGEpCiB7CiAJc3RydWN0IGxpbyAqbGlvID0gR0VUX0xJTyhuZXRkZXYpOwpAQCAtOTE2LDEyICsxMDUyLDMxIEBACiAJCX0KIAkJYnJlYWs7CiAKKwljYXNlIEVUSF9TU19QUklWX0ZMQUdTOgorCQlsaW9fZ2V0X3ByaXZfZmxhZ3Nfc3RyaW5ncyhsaW8sIGRhdGEpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQluZXRpZl9pbmZvKGxpbywgZHJ2LCBsaW8tPm5ldGRldiwgIlVua25vd24gU3RyaW5nc2V0ICEhXG4iKTsKIAkJYnJlYWs7CiAJfQogfQogCitzdGF0aWMgaW50IGxpb19nZXRfcHJpdl9mbGFnc19zc19jb3VudChzdHJ1Y3QgbGlvICpsaW8pCit7CisJc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdF9kZXYgPSBsaW8tPm9jdF9kZXY7CisKKwlzd2l0Y2ggKG9jdF9kZXYtPmNoaXBfaWQpIHsKKwljYXNlIE9DVEVPTl9DTjIzWFhfUEZfVklEOgorCQlyZXR1cm4gQVJSQVlfU0laRShvY3RfcHJpdl9mbGFnc19zdHJpbmdzKTsKKwljYXNlIE9DVEVPTl9DTjY4WFg6CisJY2FzZSBPQ1RFT05fQ042NlhYOgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJZGVmYXVsdDoKKwkJbmV0aWZfaW5mbyhsaW8sIGRydiwgbGlvLT5uZXRkZXYsICJVbmtub3duIENoaXAgISFcbiIpOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCiBzdGF0aWMgaW50IGxpb19nZXRfc3NldF9jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgc3NldCkKIHsKIAlzdHJ1Y3QgbGlvICpsaW8gPSBHRVRfTElPKG5ldGRldik7CkBAIC05MzIsNiArMTA4Nyw4IEBACiAJCXJldHVybiAoQVJSQVlfU0laRShvY3Rfc3RhdHNfc3RyaW5ncykgKwogCQkJQVJSQVlfU0laRShvY3RfaXFfc3RhdHNfc3RyaW5ncykgKiBvY3RfZGV2LT5udW1faXFzICsKIAkJCUFSUkFZX1NJWkUob2N0X2Ryb3Ffc3RhdHNfc3RyaW5ncykgKiBvY3RfZGV2LT5udW1fb3FzKTsKKwljYXNlIEVUSF9TU19QUklWX0ZMQUdTOgorCQlyZXR1cm4gbGlvX2dldF9wcml2X2ZsYWdzX3NzX2NvdW50KGxpbyk7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KQEAgLTk0OCw2ICsxMTA1LDE2IEBACiAJaW50cm1vZF9jZmcgPSAmb2N0LT5pbnRybW9kOwogCiAJc3dpdGNoIChvY3QtPmNoaXBfaWQpIHsKKwljYXNlIE9DVEVPTl9DTjIzWFhfUEZfVklEOgorCQlpZiAoIWludHJtb2RfY2ZnLT5yeF9lbmFibGUpIHsKKwkJCWludHJfY29hbC0+cnhfY29hbGVzY2VfdXNlY3MgPSBpbnRybW9kX2NmZy0+cnhfdXNlY3M7CisJCQlpbnRyX2NvYWwtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzID0KKwkJCQlpbnRybW9kX2NmZy0+cnhfZnJhbWVzOworCQl9CisJCWlmICghaW50cm1vZF9jZmctPnR4X2VuYWJsZSkKKwkJCWludHJfY29hbC0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPQorCQkJCWludHJtb2RfY2ZnLT50eF9mcmFtZXM7CisJCWJyZWFrOwogCWNhc2UgT0NURU9OX0NONjhYWDoKIAljYXNlIE9DVEVPTl9DTjY2WFg6IHsKIAkJc3RydWN0IG9jdGVvbl9jbjZ4eHggKmNuNnh4eCA9CkBAIC05ODMsNyArMTE1MCwxNSBAQAogCQlpbnRyX2NvYWwtPnJ4X2NvYWxlc2NlX3VzZWNzX2xvdyA9CiAJCQlpbnRybW9kX2NmZy0+cnhfbWludG1yX3RyaWdnZXI7CiAJCWludHJfY29hbC0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfbG93ID0KLQkJCWludHJtb2RfY2ZnLT5yeF9taW5jbnRfdHJpZ2dlcjsKKwkJICAgIGludHJtb2RfY2ZnLT5yeF9taW5jbnRfdHJpZ2dlcjsKKwl9CisJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSAmJgorCSAgICAoaW50cm1vZF9jZmctPnR4X2VuYWJsZSkpIHsKKwkJaW50cl9jb2FsLT51c2VfYWRhcHRpdmVfdHhfY29hbGVzY2UgPSBpbnRybW9kX2NmZy0+dHhfZW5hYmxlOworCQlpbnRyX2NvYWwtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2hpZ2ggPQorCQkgICAgaW50cm1vZF9jZmctPnR4X21heGNudF90cmlnZ2VyOworCQlpbnRyX2NvYWwtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2xvdyA9CisJCSAgICBpbnRybW9kX2NmZy0+dHhfbWluY250X3RyaWdnZXI7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMTA2MCwxMSArMTIzNSwxMSBAQAogb2N0bmV0X25pY19zdGF0c19jYWxsYmFjayhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0X2RldiwKIAkJCSAgdTMyIHN0YXR1cywgdm9pZCAqcHRyKQogewotCXN0cnVjdCBvY3Rlb25fc29mdF9jb21tYW5kICAqc2MgPSAoc3RydWN0IG9jdGVvbl9zb2Z0X2NvbW1hbmQgICopcHRyOwotCXN0cnVjdCBvY3RfbmljX3N0YXRzX3Jlc3AgKnJlc3AgPSAoc3RydWN0IG9jdF9uaWNfc3RhdHNfcmVzcCAqKQotCQlzYy0+dmlydHJwdHI7Ci0Jc3RydWN0IG9jdF9uaWNfc3RhdHNfY3RybCAqY3RybCA9IChzdHJ1Y3Qgb2N0X25pY19zdGF0c19jdHJsICopCi0JCXNjLT5jdHhwdHI7CisJc3RydWN0IG9jdGVvbl9zb2Z0X2NvbW1hbmQgKnNjID0gKHN0cnVjdCBvY3Rlb25fc29mdF9jb21tYW5kICopcHRyOworCXN0cnVjdCBvY3RfbmljX3N0YXRzX3Jlc3AgKnJlc3AgPQorCSAgICAoc3RydWN0IG9jdF9uaWNfc3RhdHNfcmVzcCAqKXNjLT52aXJ0cnB0cjsKKwlzdHJ1Y3Qgb2N0X25pY19zdGF0c19jdHJsICpjdHJsID0KKwkgICAgKHN0cnVjdCBvY3RfbmljX3N0YXRzX2N0cmwgKilzYy0+Y3R4cHRyOwogCXN0cnVjdCBuaWNfcnhfc3RhdHMgKnJzcF9yc3RhdHMgPSAmcmVzcC0+c3RhdHMuZnJvbXdpcmU7CiAJc3RydWN0IG5pY190eF9zdGF0cyAqcnNwX3RzdGF0cyA9ICZyZXNwLT5zdGF0cy5mcm9taG9zdDsKIApAQCAtMTMxNCwxNCArMTQ4OSwzNSBAQAogCQlDRkdfU0VUX09RX0lOVFJfUEtUKGNuNnh4eC0+Y29uZiwgcnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMpOwogCQlicmVhazsKIAl9CisJY2FzZSBPQ1RFT05fQ04yM1hYX1BGX1ZJRDogeworCQlpbnQgcV9ubzsKKworCQlpZiAoIWludHJfY29hbC0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMpCisJCQlyeF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA9IG9jdC0+aW50cm1vZC5yeF9mcmFtZXM7CisJCWVsc2UKKwkJCXJ4X21heF9jb2FsZXNjZWRfZnJhbWVzID0KKwkJCSAgICBpbnRyX2NvYWwtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzOworCQlmb3IgKHFfbm8gPSAwOyBxX25vIDwgb2N0LT5udW1fb3FzOyBxX25vKyspIHsKKwkJCXFfbm8gKz0gb2N0LT5zcmlvdl9pbmZvLnBmX3NybjsKKwkJCW9jdGVvbl93cml0ZV9jc3I2NCgKKwkJCSAgICBvY3QsIENOMjNYWF9TTElfT1FfUEtUX0lOVF9MRVZFTFMocV9ubyksCisJCQkgICAgKG9jdGVvbl9yZWFkX2NzcjY0KAorCQkJCSBvY3QsIENOMjNYWF9TTElfT1FfUEtUX0lOVF9MRVZFTFMocV9ubykpICYKKwkJCSAgICAgKDB4M2ZmZmZmMDAwMDAwMDBVTCkpIHwKKwkJCQlyeF9tYXhfY29hbGVzY2VkX2ZyYW1lcyk7CisJCQkvKmNvbnNpZGVyIHNldHRpbmcgcmVzZW5kIGJpdCovCisJCX0KKwkJb2N0LT5pbnRybW9kLnJ4X2ZyYW1lcyA9IHJ4X21heF9jb2FsZXNjZWRfZnJhbWVzOworCQlicmVhazsKKwl9CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG9jdF9jZmdfcnhfaW50cnRpbWUoc3RydWN0IGxpbyAqbGlvLCBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZQotCQkJICAgICAgICppbnRyX2NvYWwpCitzdGF0aWMgaW50IG9jdF9jZmdfcnhfaW50cnRpbWUoc3RydWN0IGxpbyAqbGlvLAorCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICppbnRyX2NvYWwpCiB7CiAJc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCA9IGxpby0+b2N0X2RldjsKIAl1MzIgdGltZV90aHJlc2hvbGQsIHJ4X2NvYWxlc2NlX3VzZWNzOwpAQCAtMTM0Niw2ICsxNTQyLDI3IEBACiAJCUNGR19TRVRfT1FfSU5UUl9USU1FKGNuNnh4eC0+Y29uZiwgcnhfY29hbGVzY2VfdXNlY3MpOwogCQlicmVhazsKIAl9CisJY2FzZSBPQ1RFT05fQ04yM1hYX1BGX1ZJRDogeworCQl1NjQgdGltZV90aHJlc2hvbGQ7CisJCWludCBxX25vOworCisJCWlmICghaW50cl9jb2FsLT5yeF9jb2FsZXNjZV91c2VjcykKKwkJCXJ4X2NvYWxlc2NlX3VzZWNzID0gb2N0LT5pbnRybW9kLnJ4X3VzZWNzOworCQllbHNlCisJCQlyeF9jb2FsZXNjZV91c2VjcyA9IGludHJfY29hbC0+cnhfY29hbGVzY2VfdXNlY3M7CisJCXRpbWVfdGhyZXNob2xkID0KKwkJICAgIGNuMjN4eF9wZl9nZXRfb3FfdGlja3Mob2N0LCAodTMyKXJ4X2NvYWxlc2NlX3VzZWNzKTsKKwkJZm9yIChxX25vID0gMDsgcV9ubyA8IG9jdC0+bnVtX29xczsgcV9ubysrKSB7CisJCQlxX25vICs9IG9jdC0+c3Jpb3ZfaW5mby5wZl9zcm47CisJCQlvY3Rlb25fd3JpdGVfY3NyNjQob2N0LAorCQkJCQkgICBDTjIzWFhfU0xJX09RX1BLVF9JTlRfTEVWRUxTKHFfbm8pLAorCQkJCQkgICAob2N0LT5pbnRybW9kLnJ4X2ZyYW1lcyB8CisJCQkJCSAgICAodGltZV90aHJlc2hvbGQgPDwgMzIpKSk7CisJCQkvKmNvbnNpZGVyIHdyaXRpbmcgdG8gcmVzZW5kIGJpdCBoZXJlKi8KKwkJfQorCQlvY3QtPmludHJtb2QucnhfdXNlY3MgPSByeF9jb2FsZXNjZV91c2VjczsKKwkJYnJlYWs7CisJfQogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTEzNTgsMTIgKzE1NzUsMzcgQEAKIAkJICAgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCiB7CiAJc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCA9IGxpby0+b2N0X2RldjsKKwl1MzIgaXFfaW50cl9wa3Q7CisJdm9pZCBfX2lvbWVtICppbnN0X2NudF9yZWc7CisJdTY0IHZhbDsKIAogCS8qIENvbmZpZyBDbnQgYmFzZWQgaW50ZXJydXB0IHZhbHVlcyAqLwogCXN3aXRjaCAob2N0LT5jaGlwX2lkKSB7CiAJY2FzZSBPQ1RFT05fQ042OFhYOgogCWNhc2UgT0NURU9OX0NONjZYWDoKIAkJYnJlYWs7CisJY2FzZSBPQ1RFT05fQ04yM1hYX1BGX1ZJRDogeworCQlpbnQgcV9ubzsKKworCQlpZiAoIWludHJfY29hbC0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXMpCisJCQlpcV9pbnRyX3BrdCA9IENOMjNYWF9ERUZfSVFfSU5UUl9USFJFU0hPTEQgJgorCQkJCSAgICAgIENOMjNYWF9QS1RfSU5fRE9ORV9XTUFSS19NQVNLOworCQllbHNlCisJCQlpcV9pbnRyX3BrdCA9IGludHJfY29hbC0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgJgorCQkJCSAgICAgIENOMjNYWF9QS1RfSU5fRE9ORV9XTUFSS19NQVNLOworCQlmb3IgKHFfbm8gPSAwOyBxX25vIDwgb2N0LT5udW1faXFzOyBxX25vKyspIHsKKwkJCWluc3RfY250X3JlZyA9IChvY3QtPmluc3RyX3F1ZXVlW3Ffbm9dKS0+aW5zdF9jbnRfcmVnOworCQkJdmFsID0gcmVhZHEoaW5zdF9jbnRfcmVnKTsKKwkJCS8qY2xlYXIgd21hcmsgYW5kIGNvdW50LmRvbnQgd2FudCB0byB3cml0ZSBjb3VudCBiYWNrKi8KKwkJCXZhbCA9ICh2YWwgJiAweEZGRkYwMDAwMDAwMDAwMDBVTEwpIHwKKwkJCSAgICAgICgodTY0KWlxX2ludHJfcGt0CisJCQkgICAgICAgPDwgQ04yM1hYX1BLVF9JTl9ET05FX1dNQVJLX0JJVF9QT1MpOworCQkJd3JpdGVxKHZhbCwgaW5zdF9jbnRfcmVnKTsKKwkJCS8qY29uc2lkZXIgc2V0dGluZyByZXNlbmQgYml0Ki8KKwkJfQorCQlvY3QtPmludHJtb2QudHhfZnJhbWVzID0gaXFfaW50cl9wa3Q7CisJCWJyZWFrOworCX0KIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xMzk5LDYgKzE2NDEsOCBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBPQ1RFT05fQ04yM1hYX1BGX1ZJRDoKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTU0MSw5ICsxNzg1LDIzNyBAQAogfQogCiAvKiBSZXR1cm4gcmVnaXN0ZXIgZHVtcCBsZW4uICovCi1zdGF0aWMgaW50IGxpb19nZXRfcmVnc19sZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3N0YXRpYyBpbnQgbGlvX2dldF9yZWdzX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXJldHVybiBPQ1RfRVRIVE9PTF9SRUdEVU1QX0xFTjsKKwlzdHJ1Y3QgbGlvICpsaW8gPSBHRVRfTElPKGRldik7CisJc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCA9IGxpby0+b2N0X2RldjsKKworCXN3aXRjaCAob2N0LT5jaGlwX2lkKSB7CisJY2FzZSBPQ1RFT05fQ04yM1hYX1BGX1ZJRDoKKwkJcmV0dXJuIE9DVF9FVEhUT09MX1JFR0RVTVBfTEVOXzIzWFg7CisJZGVmYXVsdDoKKwkJcmV0dXJuIE9DVF9FVEhUT09MX1JFR0RVTVBfTEVOOworCX0KK30KKworc3RhdGljIGludCBjbjIzeHhfcmVhZF9jc3JfcmVnKGNoYXIgKnMsIHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCit7CisJdTMyIHJlZzsKKwl1OCBwZl9udW0gPSBvY3QtPnBmX251bTsKKwlpbnQgbGVuID0gMDsKKwlpbnQgaTsKKworCS8qIFBDSSAgV2luZG93IFJlZ2lzdGVycyAqLworCisJbGVuICs9IHNwcmludGYocyArIGxlbiwgIlxuXHQgT2N0ZW9uIENTUiBSZWdpc3RlcnNcblxuIik7CisKKwkvKjB4MjkwMzAgb3IgMHgyOTA0MCovCisJcmVnID0gQ04yM1hYX1NMSV9QS1RfTUFDX1JJTkZPNjQob2N0LT5wY2llX3BvcnQsIG9jdC0+cGZfbnVtKTsKKwlsZW4gKz0gc3ByaW50ZihzICsgbGVuLAorCQkgICAgICAgIlxuWyUwOHhdIChTTElfUEtUX01BQyVkX1BGJWRfUklORk8pOiAlMDE2bGx4XG4iLAorCQkgICAgICAgcmVnLCBvY3QtPnBjaWVfcG9ydCwgb2N0LT5wZl9udW0sCisJCSAgICAgICAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisKKwkvKjB4MjcwODAgb3IgMHgyNzA5MCovCisJcmVnID0gQ04yM1hYX1NMSV9NQUNfUEZfSU5UX0VOQjY0KG9jdC0+cGNpZV9wb3J0LCBvY3QtPnBmX251bSk7CisJbGVuICs9CisJICAgIHNwcmludGYocyArIGxlbiwgIlxuWyUwOHhdIChTTElfTUFDJWRfUEYlZF9JTlRfRU5CKTogJTAxNmxseFxuIiwKKwkJICAgIHJlZywgb2N0LT5wY2llX3BvcnQsIG9jdC0+cGZfbnVtLAorCQkgICAgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCisJLyoweDI3MDAwIG9yIDB4MjcwMTAqLworCXJlZyA9IENOMjNYWF9TTElfTUFDX1BGX0lOVF9TVU02NChvY3QtPnBjaWVfcG9ydCwgb2N0LT5wZl9udW0pOworCWxlbiArPQorCSAgICBzcHJpbnRmKHMgKyBsZW4sICJcblslMDh4XSAoU0xJX01BQyVkX1BGJWRfSU5UX1NVTSk6ICUwMTZsbHhcbiIsCisJCSAgICByZWcsIG9jdC0+cGNpZV9wb3J0LCBvY3QtPnBmX251bSwKKwkJICAgICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKworCS8qMHgyOTEyMCovCisJcmVnID0gMHgyOTEyMDsKKwlsZW4gKz0gc3ByaW50ZihzICsgbGVuLCAiXG5bJTA4eF0gKFNMSV9QS1RfTUVNX0NUTCk6ICUwMTZsbHhcbiIsIHJlZywKKwkJICAgICAgICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKworCS8qMHgyNzMwMCovCisJcmVnID0gMHgyNzMwMCArIG9jdC0+cGNpZV9wb3J0ICogQ04yM1hYX01BQ19JTlRfT0ZGU0VUICsKKwkgICAgICAob2N0LT5wZl9udW0pICogQ04yM1hYX1BGX0lOVF9PRkZTRVQ7CisJbGVuICs9IHNwcmludGYoCisJICAgIHMgKyBsZW4sICJcblslMDh4XSAoU0xJX01BQyVkX1BGJWRfUEtUX1ZGX0lOVCk6ICUwMTZsbHhcbiIsIHJlZywKKwkgICAgb2N0LT5wY2llX3BvcnQsIG9jdC0+cGZfbnVtLCAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisKKwkvKjB4MjcyMDAqLworCXJlZyA9IDB4MjcyMDAgKyBvY3QtPnBjaWVfcG9ydCAqIENOMjNYWF9NQUNfSU5UX09GRlNFVCArCisJICAgICAgKG9jdC0+cGZfbnVtKSAqIENOMjNYWF9QRl9JTlRfT0ZGU0VUOworCWxlbiArPSBzcHJpbnRmKHMgKyBsZW4sCisJCSAgICAgICAiXG5bJTA4eF0gKFNMSV9NQUMlZF9QRiVkX1BQX1ZGX0lOVCk6ICUwMTZsbHhcbiIsCisJCSAgICAgICByZWcsIG9jdC0+cGNpZV9wb3J0LCBvY3QtPnBmX251bSwKKwkJICAgICAgICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKworCS8qMjkxMzAqLworCXJlZyA9IENOMjNYWF9TTElfUEtUX0NOVF9JTlQ7CisJbGVuICs9IHNwcmludGYocyArIGxlbiwgIlxuWyUwOHhdIChTTElfUEtUX0NOVF9JTlQpOiAlMDE2bGx4XG4iLCByZWcsCisJCSAgICAgICAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisKKwkvKjB4MjkxNDAqLworCXJlZyA9IENOMjNYWF9TTElfUEtUX1RJTUVfSU5UOworCWxlbiArPSBzcHJpbnRmKHMgKyBsZW4sICJcblslMDh4XSAoU0xJX1BLVF9USU1FX0lOVCk6ICUwMTZsbHhcbiIsIHJlZywKKwkJICAgICAgICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKworCS8qMHgyOTE2MCovCisJcmVnID0gMHgyOTE2MDsKKwlsZW4gKz0gc3ByaW50ZihzICsgbGVuLCAiXG5bJTA4eF0gKFNMSV9QS1RfSU5UKTogJTAxNmxseFxuIiwgcmVnLAorCQkgICAgICAgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCisJLyoweDI5MTgwKi8KKwlyZWcgPSBDTjIzWFhfU0xJX09RX1dNQVJLOworCWxlbiArPSBzcHJpbnRmKHMgKyBsZW4sICJcblslMDh4XSAoU0xJX1BLVF9PVVRQVVRfV01BUkspOiAlMDE2bGx4XG4iLAorCQkgICAgICAgcmVnLCAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisKKwkvKjB4MjkxRTAqLworCXJlZyA9IENOMjNYWF9TTElfUEtUX0lPUV9SSU5HX1JTVDsKKwlsZW4gKz0gc3ByaW50ZihzICsgbGVuLCAiXG5bJTA4eF0gKFNMSV9QS1RfUklOR19SU1QpOiAlMDE2bGx4XG4iLCByZWcsCisJCSAgICAgICAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisKKwkvKjB4MjkyMTAqLworCXJlZyA9IENOMjNYWF9TTElfR0JMX0NPTlRST0w7CisJbGVuICs9IHNwcmludGYocyArIGxlbiwKKwkJICAgICAgICJcblslMDh4XSAoU0xJX1BLVF9HQkxfQ09OVFJPTCk6ICUwMTZsbHhcbiIsIHJlZywKKwkJICAgICAgICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKworCS8qMHgyOTIyMCovCisJcmVnID0gMHgyOTIyMDsKKwlsZW4gKz0gc3ByaW50ZihzICsgbGVuLCAiXG5bJTA4eF0gKFNMSV9QS1RfQklTVF9TVEFUVVMpOiAlMDE2bGx4XG4iLAorCQkgICAgICAgcmVnLCAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisKKwkvKlBGIG9ubHkqLworCWlmIChwZl9udW0gPT0gMCkgeworCQkvKjB4MjkyNjAqLworCQlyZWcgPSBDTjIzWFhfU0xJX09VVF9CUF9FTl9XMVM7CisJCWxlbiArPSBzcHJpbnRmKHMgKyBsZW4sCisJCQkgICAgICAgIlxuWyUwOHhdIChTTElfUEtUX09VVF9CUF9FTl9XMVMpOiAgJTAxNmxseFxuIiwKKwkJCSAgICAgICByZWcsICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKwl9IGVsc2UgaWYgKHBmX251bSA9PSAxKSB7CisJCS8qMHgyOTI3MCovCisJCXJlZyA9IENOMjNYWF9TTElfT1VUX0JQX0VOMl9XMVM7CisJCWxlbiArPSBzcHJpbnRmKHMgKyBsZW4sCisJCQkgICAgICAgIlxuWyUwOHhdIChTTElfUEtUX09VVF9CUF9FTjJfVzFTKTogJTAxNmxseFxuIiwKKwkJCSAgICAgICByZWcsICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQ04yM1hYX01BWF9PVVRQVVRfUVVFVUVTOyBpKyspIHsKKwkJcmVnID0gQ04yM1hYX1NMSV9PUV9CVUZGX0lORk9fU0laRShpKTsKKwkJbGVuICs9CisJCSAgICBzcHJpbnRmKHMgKyBsZW4sICJcblslMDh4XSAoU0xJX1BLVCVkX09VVF9TSVpFKTogJTAxNmxseFxuIiwKKwkJCSAgICByZWcsIGksICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKwl9CisKKwkvKjB4MTAwNDAqLworCWZvciAoaSA9IDA7IGkgPCBDTjIzWFhfTUFYX0lOUFVUX1FVRVVFUzsgaSsrKSB7CisJCXJlZyA9IENOMjNYWF9TTElfSVFfSU5TVFJfQ09VTlQ2NChpKTsKKwkJbGVuICs9IHNwcmludGYocyArIGxlbiwKKwkJCSAgICAgICAiXG5bJTA4eF0gKFNMSV9QS1RfSU5fRE9ORSVkX0NOVFMpOiAlMDE2bGx4XG4iLAorCQkJICAgICAgIHJlZywgaSwgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCX0KKworCS8qMHgxMDA4MCovCisJZm9yIChpID0gMDsgaSA8IENOMjNYWF9NQVhfT1VUUFVUX1FVRVVFUzsgaSsrKSB7CisJCXJlZyA9IENOMjNYWF9TTElfT1FfUEtUU19DUkVESVQoaSk7CisJCWxlbiArPSBzcHJpbnRmKHMgKyBsZW4sCisJCQkgICAgICAgIlxuWyUwOHhdIChTTElfUEtUJWRfU0xJU1RfQkFPRkZfREJFTEwpOiAlMDE2bGx4XG4iLAorCQkJICAgICAgIHJlZywgaSwgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCX0KKworCS8qMHgxMDA5MCovCisJZm9yIChpID0gMDsgaSA8IENOMjNYWF9NQVhfT1VUUFVUX1FVRVVFUzsgaSsrKSB7CisJCXJlZyA9IENOMjNYWF9TTElfT1FfU0laRShpKTsKKwkJbGVuICs9IHNwcmludGYoCisJCSAgICBzICsgbGVuLCAiXG5bJTA4eF0gKFNMSV9QS1QlZF9TTElTVF9GSUZPX1JTSVpFKTogJTAxNmxseFxuIiwKKwkJICAgIHJlZywgaSwgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCX0KKworCS8qMHgxMDA1MCovCisJZm9yIChpID0gMDsgaSA8IENOMjNYWF9NQVhfT1VUUFVUX1FVRVVFUzsgaSsrKSB7CisJCXJlZyA9IENOMjNYWF9TTElfT1FfUEtUX0NPTlRST0woaSk7CisJCWxlbiArPSBzcHJpbnRmKAorCQkJcyArIGxlbiwKKwkJCSJcblslMDh4XSAoU0xJX1BLVCVkX19PVVRQVVRfQ09OVFJPTCk6ICUwMTZsbHhcbiIsCisJCQlyZWcsIGksICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKwl9CisKKwkvKjB4MTAwNzAqLworCWZvciAoaSA9IDA7IGkgPCBDTjIzWFhfTUFYX09VVFBVVF9RVUVVRVM7IGkrKykgeworCQlyZWcgPSBDTjIzWFhfU0xJX09RX0JBU0VfQUREUjY0KGkpOworCQlsZW4gKz0gc3ByaW50ZihzICsgbGVuLAorCQkJICAgICAgICJcblslMDh4XSAoU0xJX1BLVCVkX1NMSVNUX0JBRERSKTogJTAxNmxseFxuIiwKKwkJCSAgICAgICByZWcsIGksICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKwl9CisKKwkvKjB4MTAwYTAqLworCWZvciAoaSA9IDA7IGkgPCBDTjIzWFhfTUFYX09VVFBVVF9RVUVVRVM7IGkrKykgeworCQlyZWcgPSBDTjIzWFhfU0xJX09RX1BLVF9JTlRfTEVWRUxTKGkpOworCQlsZW4gKz0gc3ByaW50ZihzICsgbGVuLAorCQkJICAgICAgICJcblslMDh4XSAoU0xJX1BLVCVkX0lOVF9MRVZFTFMpOiAlMDE2bGx4XG4iLAorCQkJICAgICAgIHJlZywgaSwgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCX0KKworCS8qMHgxMDBiMCovCisJZm9yIChpID0gMDsgaSA8IENOMjNYWF9NQVhfT1VUUFVUX1FVRVVFUzsgaSsrKSB7CisJCXJlZyA9IENOMjNYWF9TTElfT1FfUEtUU19TRU5UKGkpOworCQlsZW4gKz0gc3ByaW50ZihzICsgbGVuLCAiXG5bJTA4eF0gKFNMSV9QS1QlZF9DTlRTKTogJTAxNmxseFxuIiwKKwkJCSAgICAgICByZWcsIGksICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKwl9CisKKwkvKjB4MTAwYzAqLworCWZvciAoaSA9IDA7IGkgPCBDTjIzWFhfTUFYX09VVFBVVF9RVUVVRVM7IGkrKykgeworCQlyZWcgPSAweDEwMGMwICsgaSAqIENOMjNYWF9PUV9PRkZTRVQ7CisJCWxlbiArPSBzcHJpbnRmKHMgKyBsZW4sCisJCQkgICAgICAgIlxuWyUwOHhdIChTTElfUEtUJWRfRVJST1JfSU5GTyk6ICUwMTZsbHhcbiIsCisJCQkgICAgICAgcmVnLCBpLCAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisKKwkJLyoweDEwMDAwKi8KKwkJZm9yIChpID0gMDsgaSA8IENOMjNYWF9NQVhfSU5QVVRfUVVFVUVTOyBpKyspIHsKKwkJCXJlZyA9IENOMjNYWF9TTElfSVFfUEtUX0NPTlRST0w2NChpKTsKKwkJCWxlbiArPSBzcHJpbnRmKAorCQkJCXMgKyBsZW4sCisJCQkJIlxuWyUwOHhdIChTTElfUEtUJWRfSU5QVVRfQ09OVFJPTCk6ICUwMTZsbHhcbiIsCisJCQkJcmVnLCBpLCAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisJCX0KKworCQkvKjB4MTAwMTAqLworCQlmb3IgKGkgPSAwOyBpIDwgQ04yM1hYX01BWF9JTlBVVF9RVUVVRVM7IGkrKykgeworCQkJcmVnID0gQ04yM1hYX1NMSV9JUV9CQVNFX0FERFI2NChpKTsKKwkJCWxlbiArPSBzcHJpbnRmKAorCQkJICAgIHMgKyBsZW4sCisJCQkgICAgIlxuWyUwOHhdIChTTElfUEtUJWRfSU5TVFJfQkFERFIpOiAlMDE2bGx4XG4iLCByZWcsCisJCQkgICAgaSwgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCQl9CisKKwkJLyoweDEwMDIwKi8KKwkJZm9yIChpID0gMDsgaSA8IENOMjNYWF9NQVhfSU5QVVRfUVVFVUVTOyBpKyspIHsKKwkJCXJlZyA9IENOMjNYWF9TTElfSVFfRE9PUkJFTEwoaSk7CisJCQlsZW4gKz0gc3ByaW50ZigKKwkJCSAgICBzICsgbGVuLAorCQkJICAgICJcblslMDh4XSAoU0xJX1BLVCVkX0lOU1RSX0JBT0ZGX0RCRUxMKTogJTAxNmxseFxuIiwKKwkJCSAgICByZWcsIGksICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKwkJfQorCisJCS8qMHgxMDAzMCovCisJCWZvciAoaSA9IDA7IGkgPCBDTjIzWFhfTUFYX0lOUFVUX1FVRVVFUzsgaSsrKSB7CisJCQlyZWcgPSBDTjIzWFhfU0xJX0lRX1NJWkUoaSk7CisJCQlsZW4gKz0gc3ByaW50ZigKKwkJCSAgICBzICsgbGVuLAorCQkJICAgICJcblslMDh4XSAoU0xJX1BLVCVkX0lOU1RSX0ZJRk9fUlNJWkUpOiAlMDE2bGx4XG4iLAorCQkJICAgIHJlZywgaSwgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCQl9CisKKwkJLyoweDEwMDQwKi8KKwkJZm9yIChpID0gMDsgaSA8IENOMjNYWF9NQVhfSU5QVVRfUVVFVUVTOyBpKyspCisJCQlyZWcgPSBDTjIzWFhfU0xJX0lRX0lOU1RSX0NPVU5UNjQoaSk7CisJCWxlbiArPSBzcHJpbnRmKHMgKyBsZW4sCisJCQkgICAgICAgIlxuWyUwOHhdIChTTElfUEtUX0lOX0RPTkUlZF9DTlRTKTogJTAxNmxseFxuIiwKKwkJCSAgICAgICByZWcsIGksICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKwl9CisKKwlyZXR1cm4gbGVuOwogfQogCiBzdGF0aWMgaW50IGNuNnh4eF9yZWFkX2Nzcl9yZWcoY2hhciAqcywgc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKQEAgLTE2ODgsNiArMjE2MCwxMCBAQAogCXJlZ3MtPnZlcnNpb24gPSBPQ1RfRVRIVE9PTF9SRUdTVkVSOwogCiAJc3dpdGNoIChvY3QtPmNoaXBfaWQpIHsKKwljYXNlIE9DVEVPTl9DTjIzWFhfUEZfVklEOgorCQltZW1zZXQocmVnYnVmLCAwLCBPQ1RfRVRIVE9PTF9SRUdEVU1QX0xFTl8yM1hYKTsKKwkJbGVuICs9IGNuMjN4eF9yZWFkX2Nzcl9yZWcocmVnYnVmICsgbGVuLCBvY3QpOworCQlicmVhazsKIAljYXNlIE9DVEVPTl9DTjY4WFg6CiAJY2FzZSBPQ1RFT05fQ042NlhYOgogCQltZW1zZXQocmVnYnVmLCAwLCBPQ1RfRVRIVE9PTF9SRUdEVU1QX0xFTik7CkBAIC0xNzI5LDYgKzIyMDUsNyBAQAogCS5nZXRfc3RyaW5ncwkJPSBsaW9fZ2V0X3N0cmluZ3MsCiAJLmdldF9ldGh0b29sX3N0YXRzCT0gbGlvX2dldF9ldGh0b29sX3N0YXRzLAogCS5nZXRfcGF1c2VwYXJhbQkJPSBsaW9fZ2V0X3BhdXNlcGFyYW0sCisJLnNldF9wYXVzZXBhcmFtCQk9IGxpb19zZXRfcGF1c2VwYXJhbSwKIAkuZ2V0X3JlZ3NfbGVuCQk9IGxpb19nZXRfcmVnc19sZW4sCiAJLmdldF9yZWdzCQk9IGxpb19nZXRfcmVncywKIAkuZ2V0X21zZ2xldmVsCQk9IGxpb19nZXRfbXNnbGV2ZWwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vbGlvX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9saW9fbWFpbi5jCmluZGV4IDIwZDY5NDIuLmFmYzZmOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9saW9fbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9saW9fbWFpbi5jCkBAIC0yMSwxMSArMjEsMTAgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldF90c3RhbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9wdHBfY2xvY2tfa2VybmVsLmg+CiAjaW5jbHVkZSA8bmV0L3Z4bGFuLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgImxpcXVpZGlvX2NvbW1vbi5oIgogI2luY2x1ZGUgIm9jdGVvbl9kcm9xLmgiCiAjaW5jbHVkZSAib2N0ZW9uX2lxLmgiCkBAIC0zNyw2ICszNiw3IEBACiAjaW5jbHVkZSAiY242Nnh4X3JlZ3MuaCIKICNpbmNsdWRlICJjbjY2eHhfZGV2aWNlLmgiCiAjaW5jbHVkZSAiY242OHh4X2RldmljZS5oIgorI2luY2x1ZGUgImNuMjN4eF9wZl9kZXZpY2UuaCIKICNpbmNsdWRlICJsaXF1aWRpb19pbWFnZS5oIgogCiBNT0RVTEVfQVVUSE9SKCJDYXZpdW0gTmV0d29ya3MsIDxzdXBwb3J0QGNhdml1bS5jb20+Iik7CkBAIC01MiwxMSArNTIsNiBAQAogTU9EVUxFX1BBUk1fREVTQyhkZHJfdGltZW91dCwKIAkJICJOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIEREUiBpbml0aWFsaXphdGlvbi4gMCB3YWl0cyBmb3IgZGRyX3RpbWVvdXQgdG8gYmUgc2V0IHRvIG5vbi16ZXJvIHZhbHVlIGJlZm9yZSBzdGFydGluZyB0byBjaGVjayIpOwogCi1zdGF0aWMgdTMyIGNvbnNvbGVfYml0bWFzazsKLW1vZHVsZV9wYXJhbShjb25zb2xlX2JpdG1hc2ssIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGNvbnNvbGVfYml0bWFzaywKLQkJICJCaXRtYXNrIGluZGljYXRpbmcgd2hpY2ggY29uc29sZXMgaGF2ZSBkZWJ1ZyBvdXRwdXQgcmVkaXJlY3RlZCB0byBzeXNsb2cuIik7Ci0KICNkZWZpbmUgREVGQVVMVF9NU0dfRU5BQkxFIChORVRJRl9NU0dfRFJWIHwgTkVUSUZfTVNHX1BST0JFIHwgTkVUSUZfTVNHX0xJTkspCiAKICNkZWZpbmUgSU5DUl9JTlNUUlFVRVVFX1BLVF9DT1VOVChvY3Rlb25fZGV2X3B0ciwgaXFfbm8sIGZpZWxkLCBjb3VudCkgIFwKQEAgLTEwMiw2ICs5NywxNCBAQAogCXU2NCBzdGF0dXM7CiB9OwogCitzdHJ1Y3QgbGlxdWlkaW9fcnhfY3RsX2NvbnRleHQgeworCWludCBvY3Rlb25faWQ7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YzsKKworCWludCBjb25kOworfTsKKwogc3RydWN0IG9jdF9saW5rX3N0YXR1c19yZXNwIHsKIAl1NjQgcmg7CiAJc3RydWN0IG9jdF9saW5rX2luZm8gbGlua19pbmZvOwpAQCAtMTM5LDcgKzE0Miw4IEBACiAjZGVmaW5lIE9DVE5JQ19NQVhfU0cgIChNQVhfU0tCX0ZSQUdTKQogCiAjZGVmaW5lIE9DVE5JQ19HU09fTUFYX0hFQURFUl9TSVpFIDEyOAotI2RlZmluZSBPQ1ROSUNfR1NPX01BWF9TSVpFIChHU09fTUFYX1NJWkUgLSBPQ1ROSUNfR1NPX01BWF9IRUFERVJfU0laRSkKKyNkZWZpbmUgT0NUTklDX0dTT19NQVhfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKENOMjNYWF9ERUZBVUxUX0lOUFVUX0pBQkJFUiAtIE9DVE5JQ19HU09fTUFYX0hFQURFUl9TSVpFKQogCiAvKiogU3RydWN0dXJlIG9mIGEgbm9kZSBpbiBsaXN0IG9mIGdhdGhlciBjb21wb25lbnRzIG1haW50YWluZWQgYnkKICAqIE5JQyBkcml2ZXIgZm9yIGVhY2ggbmV0d29yayBkZXZpY2UuCkBAIC0xNjIsMjcgKzE2Niw2IEBACiAJdTY0IHNnX2RtYV9wdHI7CiB9OwogCi0vKiogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBieSBOSUMgZHJpdmVyIHRvIHN0b3JlIGluZm9ybWF0aW9uIHJlcXVpcmVkCi0gKiB0byBmcmVlIHRoZSBza19idWZmIHdoZW4gdGhlIHBhY2tldCBoYXMgYmVlbiBmZXRjaGVkIGJ5IE9jdGVvbi4KLSAqIEJ5dGVzIG9mZnNldCBiZWxvdyBhc3N1bWUgd29yc3QtY2FzZSBvZiBhIDY0LWJpdCBzeXN0ZW0uCi0gKi8KLXN0cnVjdCBvY3RuZXRfYnVmX2ZyZWVfaW5mbyB7Ci0JLyoqIEJ5dGVzIDEtOC4gIFBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2UgcHJpdmF0ZSBzdHJ1Y3R1cmUuICovCi0Jc3RydWN0IGxpbyAqbGlvOwotCi0JLyoqIEJ5dGVzIDktMTYuICBQb2ludGVyIHRvIHNrX2J1ZmYuICovCi0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQotCS8qKiBCeXRlcyAxNy0yNC4gIFBvaW50ZXIgdG8gZ2F0aGVyIGxpc3QuICovCi0Jc3RydWN0IG9jdG5pY19nYXRoZXIgKmc7Ci0KLQkvKiogQnl0ZXMgMjUtMzIuIFBoeXNpY2FsIGFkZHJlc3Mgb2Ygc2tiLT5kYXRhIG9yIGdhdGhlciBsaXN0LiAqLwotCXU2NCBkcHRyOwotCi0JLyoqIEJ5dGVzIDMzLTQ3LiBQaWdneWJhY2tlZCBzb2Z0IGNvbW1hbmQsIGlmIGFueSAqLwotCXN0cnVjdCBvY3Rlb25fc29mdF9jb21tYW5kICpzYzsKLX07Ci0KIHN0cnVjdCBoYW5kc2hha2UgewogCXN0cnVjdCBjb21wbGV0aW9uIGluaXQ7CiAJc3RydWN0IGNvbXBsZXRpb24gc3RhcnRlZDsKQEAgLTE5OCw2ICsxODEsNyBAQAogfTsKIAogc3RhdGljIGludCBvY3Rlb25fZGV2aWNlX2luaXQoc3RydWN0IG9jdGVvbl9kZXZpY2UgKik7CitzdGF0aWMgaW50IGxpcXVpZGlvX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CiBzdGF0aWMgdm9pZCBsaXF1aWRpb19yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwogc3RhdGljIGludCBsaXF1aWRpb19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CkBAIC0yMTksNiArMjAzLDIwIEBACiAJCQljb250aW51ZTsKIAkJcmVzY2hlZHVsZSB8PSBvY3Rlb25fZHJvcV9wcm9jZXNzX3BhY2tldHMob2N0LCBvY3QtPmRyb3FbcV9ub10sCiAJCQkJCQkJICBNQVhfUEFDS0VUX0JVREdFVCk7CisJCWxpb19lbmFibGVfaXJxKG9jdC0+ZHJvcVtxX25vXSwgTlVMTCk7CisKKwkJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSAmJiBvY3QtPm1zaXhfb24pIHsKKwkJCS8qIHNldCB0aW1lIGFuZCBjbnQgaW50ZXJydXB0IHRocmVzaG9sZHMgZm9yIHRoaXMgRFJPUQorCQkJICogZm9yIE5BUEkKKwkJCSAqLworCQkJaW50IGFkanVzdGVkX3Ffbm8gPSBxX25vICsgb2N0LT5zcmlvdl9pbmZvLnBmX3NybjsKKworCQkJb2N0ZW9uX3dyaXRlX2NzcjY0KAorCQkJICAgIG9jdCwgQ04yM1hYX1NMSV9PUV9QS1RfSU5UX0xFVkVMUyhhZGp1c3RlZF9xX25vKSwKKwkJCSAgICAweDU3MDAwMDAwNDBVTEwpOworCQkJb2N0ZW9uX3dyaXRlX2NzcjY0KAorCQkJICAgIG9jdCwgQ04yM1hYX1NMSV9PUV9QS1RTX1NFTlQoYWRqdXN0ZWRfcV9ubyksIDApOworCQl9CiAJfQogCiAJaWYgKHJlc2NoZWR1bGUpCkBAIC0yNTIsNzYgKzI1MCw2IEBACiAJcmV0dXJuIHBrdF9jbnQ7CiB9CiAKLXZvaWQgb2N0ZW9uX3JlcG9ydF90eF9jb21wbGV0aW9uX3RvX2JxbCh2b2lkICp0eHEsIHVuc2lnbmVkIGludCBwa3RzX2NvbXBsLAotCQkJCQl1bnNpZ25lZCBpbnQgYnl0ZXNfY29tcGwpCi17Ci0Jc3RydWN0IG5ldGRldl9xdWV1ZSAqbmV0ZGV2X3F1ZXVlID0gdHhxOwotCi0JbmV0ZGV2X3R4X2NvbXBsZXRlZF9xdWV1ZShuZXRkZXZfcXVldWUsIHBrdHNfY29tcGwsIGJ5dGVzX2NvbXBsKTsKLX0KLQotdm9pZCBvY3Rlb25fdXBkYXRlX3R4X2NvbXBsZXRpb25fY291bnRlcnModm9pZCAqYnVmLCBpbnQgcmVxdHlwZSwKLQkJCQkJICB1bnNpZ25lZCBpbnQgKnBrdHNfY29tcGwsCi0JCQkJCSAgdW5zaWduZWQgaW50ICpieXRlc19jb21wbCkKLXsKLQlzdHJ1Y3Qgb2N0bmV0X2J1Zl9mcmVlX2luZm8gKmZpbmZvOwotCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwotCXN0cnVjdCBvY3Rlb25fc29mdF9jb21tYW5kICpzYzsKLQotCXN3aXRjaCAocmVxdHlwZSkgewotCWNhc2UgUkVRVFlQRV9OT1JFU1BfTkVUOgotCWNhc2UgUkVRVFlQRV9OT1JFU1BfTkVUX1NHOgotCQlmaW5mbyA9IGJ1ZjsKLQkJc2tiID0gZmluZm8tPnNrYjsKLQkJYnJlYWs7Ci0KLQljYXNlIFJFUVRZUEVfUkVTUF9ORVRfU0c6Ci0JY2FzZSBSRVFUWVBFX1JFU1BfTkVUOgotCQlzYyA9IGJ1ZjsKLQkJc2tiID0gc2MtPmNhbGxiYWNrX2FyZzsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm47Ci0JfQotCi0JKCpwa3RzX2NvbXBsKSsrOwotCSpieXRlc19jb21wbCArPSBza2ItPmxlbjsKLX0KLQotdm9pZCBvY3Rlb25fcmVwb3J0X3NlbnRfYnl0ZXNfdG9fYnFsKHZvaWQgKmJ1ZiwgaW50IHJlcXR5cGUpCi17Ci0Jc3RydWN0IG9jdG5ldF9idWZfZnJlZV9pbmZvICpmaW5mbzsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBvY3Rlb25fc29mdF9jb21tYW5kICpzYzsKLQlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHE7Ci0KLQlzd2l0Y2ggKHJlcXR5cGUpIHsKLQljYXNlIFJFUVRZUEVfTk9SRVNQX05FVDoKLQljYXNlIFJFUVRZUEVfTk9SRVNQX05FVF9TRzoKLQkJZmluZm8gPSBidWY7Ci0JCXNrYiA9IGZpbmZvLT5za2I7Ci0JCWJyZWFrOwotCi0JY2FzZSBSRVFUWVBFX1JFU1BfTkVUX1NHOgotCWNhc2UgUkVRVFlQRV9SRVNQX05FVDoKLQkJc2MgPSBidWY7Ci0JCXNrYiA9IHNjLT5jYWxsYmFja19hcmc7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuOwotCX0KLQotCXR4cSA9IG5ldGRldl9nZXRfdHhfcXVldWUoc2tiLT5kZXYsIHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpKTsKLQluZXRkZXZfdHhfc2VudF9xdWV1ZSh0eHEsIHNrYi0+bGVuKTsKLX0KLQotaW50IG9jdGVvbl9jb25zb2xlX2RlYnVnX2VuYWJsZWQodTMyIGNvbnNvbGUpCi17Ci0JcmV0dXJuIChjb25zb2xlX2JpdG1hc2sgPj4gKGNvbnNvbGUpKSAmIDB4MTsKLX0KLQogLyoqCiAgKiBcYnJpZWYgRm9yY2VzIGFsbCBJTyBxdWV1ZXMgb2ZmIG9uIGEgZ2l2ZW4gZGV2aWNlCiAgKiBAcGFyYW0gb2N0IFBvaW50ZXIgdG8gT2N0ZW9uIGRldmljZQpAQCAtNDQxLDcgKzM2OSw3IEBACiAJcGNpX2Rpc2FibGVfZGV2aWNlKG9jdC0+cGNpX2Rldik7CiAKIAkvKiBEaXNhYmxlIGludGVycnVwdHMgICovCi0Jb2N0LT5mbl9saXN0LmRpc2FibGVfaW50ZXJydXB0KG9jdC0+Y2hpcCk7CisJb2N0LT5mbl9saXN0LmRpc2FibGVfaW50ZXJydXB0KG9jdCwgT0NURU9OX0FMTF9JTlRSKTsKIAogCXBjaWVycm9yX3F1aWVzY2VfZGV2aWNlKG9jdCk7CiAKQEAgLTU3MCw2ICs0OTgsOSBAQAogCXsgICAgICAgLyogNjZ4eCAqLwogCQlQQ0lfVkVORE9SX0lEX0NBVklVTSwgMHg5MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMAogCX0sCisJeyAgICAgICAvKiAyM3h4IHBmICovCisJCVBDSV9WRU5ET1JfSURfQ0FWSVVNLCAweDk3MDIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAKKwl9LAogCXsKIAkJMCwgMCwgMCwgMCwgMCwgMCwgMAogCX0KQEAgLTU4Nyw3ICs1MTgsNiBAQAogCS5zdXNwZW5kCT0gbGlxdWlkaW9fc3VzcGVuZCwKIAkucmVzdW1lCQk9IGxpcXVpZGlvX3Jlc3VtZSwKICNlbmRpZgotCiB9OwogCiAvKioKQEAgLTkzNiw2ICs4NjYsNTIgQEAKIH0KIAogLyoqCisgKiBcYnJpZWYgUm91dGluZSB0byBub3RpZnkgTVRVIGNoYW5nZQorICogQHBhcmFtIHdvcmsgd29ya19zdHJ1Y3QgZGF0YSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQgb2N0bmV0X2xpbmtfc3RhdHVzX2NoYW5nZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGNhdml1bV93ayAqd2sgPSAoc3RydWN0IGNhdml1bV93ayAqKXdvcms7CisJc3RydWN0IGxpbyAqbGlvID0gKHN0cnVjdCBsaW8gKil3ay0+Y3R4cHRyOworCisJcnRubF9sb2NrKCk7CisJY2FsbF9uZXRkZXZpY2Vfbm90aWZpZXJzKE5FVERFVl9DSEFOR0VNVFUsIGxpby0+bmV0ZGV2KTsKKwlydG5sX3VubG9jaygpOworfQorCisvKioKKyAqIFxicmllZiBTZXRzIHVwIHRoZSBtdHUgc3RhdHVzIGNoYW5nZSB3b3JrCisgKiBAcGFyYW0gbmV0ZGV2IG5ldHdvcmsgZGV2aWNlCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNldHVwX2xpbmtfc3RhdHVzX2NoYW5nZV93cShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBsaW8gKmxpbyA9IEdFVF9MSU8obmV0ZGV2KTsKKwlzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0ID0gbGlvLT5vY3RfZGV2OworCisJbGlvLT5saW5rX3N0YXR1c193cS53cSA9IGFsbG9jX3dvcmtxdWV1ZSgibGluay1zdGF0dXMiLAorCQkJCQkJIFdRX01FTV9SRUNMQUlNLCAwKTsKKwlpZiAoIWxpby0+bGlua19zdGF0dXNfd3Eud3EpIHsKKwkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJ1bmFibGUgdG8gY3JlYXRlIGNhdml1bSBsaW5rIHN0YXR1cyB3cVxuIik7CisJCXJldHVybiAtMTsKKwl9CisJSU5JVF9ERUxBWUVEX1dPUksoJmxpby0+bGlua19zdGF0dXNfd3Eud2sud29yaywKKwkJCSAgb2N0bmV0X2xpbmtfc3RhdHVzX2NoYW5nZSk7CisJbGlvLT5saW5rX3N0YXR1c193cS53ay5jdHhwdHIgPSBsaW87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsZWFudXBfbGlua19zdGF0dXNfY2hhbmdlX3dxKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGxpbyAqbGlvID0gR0VUX0xJTyhuZXRkZXYpOworCisJaWYgKGxpby0+bGlua19zdGF0dXNfd3Eud3EpIHsKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZsaW8tPmxpbmtfc3RhdHVzX3dxLndrLndvcmspOworCQlkZXN0cm95X3dvcmtxdWV1ZShsaW8tPmxpbmtfc3RhdHVzX3dxLndxKTsKKwl9Cit9CisKKy8qKgogICogXGJyaWVmIFVwZGF0ZSBsaW5rIHN0YXR1cwogICogQHBhcmFtIG5ldGRldiBuZXR3b3JrIGRldmljZQogICogQHBhcmFtIGxzIGxpbmsgc3RhdHVzIHN0cnVjdHVyZQpAQCAtOTczLDggKzk0OSw2IEBACiAJc3RydWN0IGxpbyAqbGlvOwogCXN0cnVjdCBvY3Rlb25faW5zdHJfcXVldWUgKmlxID0gb2N0LT5pbnN0cl9xdWV1ZVtpcV9udW1dOwogCi0JLypvY3Rlb25fdXBkYXRlX2lxX3JlYWRfaWR4KG9jdCwgaXEpOyovCi0KIAluZXRkZXYgPSBvY3QtPnByb3BzW2lxLT5pZmlkeF0ubmV0ZGV2OwogCiAJLyogVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgZmlyc3QgSVEgZG9lcyBub3QgaGF2ZQpAQCAtMTAwMiwxMiArOTc2LDMyIEBACiAJfQogfQogCitzdGF0aWMKK2ludCBsaXF1aWRpb19zY2hlZHVsZV9tc2l4X2Ryb3FfcGt0X2hhbmRsZXIoc3RydWN0IG9jdGVvbl9kcm9xICpkcm9xLCB1NjQgcmV0KQoreworCXN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QgPSBkcm9xLT5vY3RfZGV2OworCXN0cnVjdCBvY3Rlb25fZGV2aWNlX3ByaXYgKm9jdF9wcml2ID0KKwkgICAgKHN0cnVjdCBvY3Rlb25fZGV2aWNlX3ByaXYgKilvY3QtPnByaXY7CisKKwlpZiAoZHJvcS0+b3BzLnBvbGxfbW9kZSkgeworCQlkcm9xLT5vcHMubmFwaV9mbihkcm9xKTsKKwl9IGVsc2UgeworCQlpZiAocmV0ICYgTVNJWF9QT19JTlQpIHsKKwkJCXRhc2tsZXRfc2NoZWR1bGUoJm9jdF9wcml2LT5kcm9xX3Rhc2tsZXQpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJLyogdGhpcyB3aWxsIGJlIGZsdXNoZWQgcGVyaW9kaWNhbGx5IGJ5IGNoZWNrIGlxIGRiICovCisJCWlmIChyZXQgJiBNU0lYX1BJX0lOVCkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiBcYnJpZWYgRHJvcSBwYWNrZXQgcHJvY2Vzc29yIHNjZWR1bGVyCiAgKiBAcGFyYW0gb2N0IG9jdGVvbiBkZXZpY2UKICAqLwotc3RhdGljCi12b2lkIGxpcXVpZGlvX3NjaGVkdWxlX2Ryb3FfcGt0X2hhbmRsZXJzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCitzdGF0aWMgdm9pZCBsaXF1aWRpb19zY2hlZHVsZV9kcm9xX3BrdF9oYW5kbGVycyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQogewogCXN0cnVjdCBvY3Rlb25fZGV2aWNlX3ByaXYgKm9jdF9wcml2ID0KIAkJKHN0cnVjdCBvY3Rlb25fZGV2aWNlX3ByaXYgKilvY3QtPnByaXY7CkBAIC0xMDMyLDE5ICsxMDI2LDM2IEBACiAJfQogfQogCitzdGF0aWMgaXJxcmV0dXJuX3QKK2xpcXVpZGlvX21zaXhfaW50cl9oYW5kbGVyKGludCBpcnEgX19hdHRyaWJ1dGVfXygodW51c2VkKSksIHZvaWQgKmRldikKK3sKKwl1NjQgcmV0OworCXN0cnVjdCBvY3Rlb25faW9xX3ZlY3RvciAqaW9xX3ZlY3RvciA9IChzdHJ1Y3Qgb2N0ZW9uX2lvcV92ZWN0b3IgKilkZXY7CisJc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCA9IGlvcV92ZWN0b3ItPm9jdF9kZXY7CisJc3RydWN0IG9jdGVvbl9kcm9xICpkcm9xID0gb2N0LT5kcm9xW2lvcV92ZWN0b3ItPmRyb3FfaW5kZXhdOworCisJcmV0ID0gb2N0LT5mbl9saXN0Lm1zaXhfaW50ZXJydXB0X2hhbmRsZXIoaW9xX3ZlY3Rvcik7CisKKwlpZiAoKHJldCAmIE1TSVhfUE9fSU5UKSB8fCAocmV0ICYgTVNJWF9QSV9JTlQpKQorCQlsaXF1aWRpb19zY2hlZHVsZV9tc2l4X2Ryb3FfcGt0X2hhbmRsZXIoZHJvcSwgcmV0KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKwogLyoqCiAgKiBcYnJpZWYgSW50ZXJydXB0IGhhbmRsZXIgZm9yIG9jdGVvbgogICogQHBhcmFtIGlycSB1bnVzZWQKICAqIEBwYXJhbSBkZXYgb2N0ZW9uIGRldmljZQogICovCiBzdGF0aWMKLWlycXJldHVybl90IGxpcXVpZGlvX2ludHJfaGFuZGxlcihpbnQgaXJxIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLCB2b2lkICpkZXYpCitpcnFyZXR1cm5fdCBsaXF1aWRpb19sZWdhY3lfaW50cl9oYW5kbGVyKGludCBpcnEgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCQkJCSB2b2lkICpkZXYpCiB7CiAJc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCA9IChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqKWRldjsKIAlpcnFyZXR1cm5fdCByZXQ7CiAKIAkvKiBEaXNhYmxlIG91ciBpbnRlcnJ1cHRzIGZvciB0aGUgZHVyYXRpb24gb2YgSVNSICovCi0Jb2N0LT5mbl9saXN0LmRpc2FibGVfaW50ZXJydXB0KG9jdC0+Y2hpcCk7CisJb2N0LT5mbl9saXN0LmRpc2FibGVfaW50ZXJydXB0KG9jdCwgT0NURU9OX0FMTF9JTlRSKTsKIAogCXJldCA9IG9jdC0+Zm5fbGlzdC5wcm9jZXNzX2ludGVycnVwdF9yZWdzKG9jdCk7CiAKQEAgLTEwNTMsNyArMTA2NCw3IEBACiAKIAkvKiBSZS1lbmFibGUgb3VyIGludGVycnVwdHMgICovCiAJaWYgKCEoYXRvbWljX3JlYWQoJm9jdC0+c3RhdHVzKSA9PSBPQ1RfREVWX0lOX1JFU0VUKSkKLQkJb2N0LT5mbl9saXN0LmVuYWJsZV9pbnRlcnJ1cHQob2N0LT5jaGlwKTsKKwkJb2N0LT5mbl9saXN0LmVuYWJsZV9pbnRlcnJ1cHQob2N0LCBPQ1RFT05fQUxMX0lOVFIpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTEwNjcsMjIgKzEwNzgsMjA0IEBACiBzdGF0aWMgaW50IG9jdGVvbl9zZXR1cF9pbnRlcnJ1cHQoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKIHsKIAlpbnQgaXJxcmV0LCBlcnI7CisJc3RydWN0IG1zaXhfZW50cnkgKm1zaXhfZW50cmllczsKKwlpbnQgaTsKKwlpbnQgbnVtX2lvcV92ZWN0b3JzOworCWludCBudW1fYWxsb2NfaW9xX3ZlY3RvcnM7CiAKLQllcnIgPSBwY2lfZW5hYmxlX21zaShvY3QtPnBjaV9kZXYpOwotCWlmIChlcnIpCi0JCWRldl93YXJuKCZvY3QtPnBjaV9kZXYtPmRldiwgIlJldmVydGluZyB0byBsZWdhY3kgaW50ZXJydXB0cy4gRXJyb3I6ICVkXG4iLAotCQkJIGVycik7Ci0JZWxzZQotCQlvY3QtPmZsYWdzIHw9IExJT19GTEFHX01TSV9FTkFCTEVEOworCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkgJiYgb2N0LT5tc2l4X29uKSB7CisJCW9jdC0+bnVtX21zaXhfaXJxcyA9IG9jdC0+c3Jpb3ZfaW5mby5udW1fcGZfcmluZ3M7CisJCS8qIG9uZSBub24gaW9xIGludGVycnVwdCBmb3IgaGFuZGxpbmcgc2xpX21hY19wZl9pbnRfc3VtICovCisJCW9jdC0+bnVtX21zaXhfaXJxcyArPSAxOwogCi0JaXJxcmV0ID0gcmVxdWVzdF9pcnEob2N0LT5wY2lfZGV2LT5pcnEsIGxpcXVpZGlvX2ludHJfaGFuZGxlciwKLQkJCSAgICAgSVJRRl9TSEFSRUQsICJvY3Rlb24iLCBvY3QpOwotCWlmIChpcnFyZXQpIHsKLQkJaWYgKG9jdC0+ZmxhZ3MgJiBMSU9fRkxBR19NU0lfRU5BQkxFRCkKLQkJCXBjaV9kaXNhYmxlX21zaShvY3QtPnBjaV9kZXYpOwotCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIlJlcXVlc3QgSVJRIGZhaWxlZCB3aXRoIGNvZGU6ICVkXG4iLAotCQkJaXJxcmV0KTsKLQkJcmV0dXJuIDE7CisJCW9jdC0+bXNpeF9lbnRyaWVzID0ga2NhbGxvYygKKwkJICAgIG9jdC0+bnVtX21zaXhfaXJxcywgc2l6ZW9mKHN0cnVjdCBtc2l4X2VudHJ5KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghb2N0LT5tc2l4X2VudHJpZXMpCisJCQlyZXR1cm4gMTsKKworCQltc2l4X2VudHJpZXMgPSAoc3RydWN0IG1zaXhfZW50cnkgKilvY3QtPm1zaXhfZW50cmllczsKKwkJLypBc3N1bXB0aW9uIGlzIHRoYXQgcGYgbXNpeCB2ZWN0b3JzIHN0YXJ0IGZyb20gcGYgc3JuIHRvIHBmIHRvCisJCSAqIHRycyBhbmQgbm90IGZyb20gMC4gaWYgbm90IGNoYW5nZSB0aGlzIGNvZGUKKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBvY3QtPm51bV9tc2l4X2lycXMgLSAxOyBpKyspCisJCQltc2l4X2VudHJpZXNbaV0uZW50cnkgPSBvY3QtPnNyaW92X2luZm8ucGZfc3JuICsgaTsKKwkJbXNpeF9lbnRyaWVzW29jdC0+bnVtX21zaXhfaXJxcyAtIDFdLmVudHJ5ID0KKwkJICAgIG9jdC0+c3Jpb3ZfaW5mby50cnM7CisJCW51bV9hbGxvY19pb3FfdmVjdG9ycyA9IHBjaV9lbmFibGVfbXNpeF9yYW5nZSgKKwkJCQkJCW9jdC0+cGNpX2RldiwgbXNpeF9lbnRyaWVzLAorCQkJCQkJb2N0LT5udW1fbXNpeF9pcnFzLAorCQkJCQkJb2N0LT5udW1fbXNpeF9pcnFzKTsKKwkJaWYgKG51bV9hbGxvY19pb3FfdmVjdG9ycyA8IDApIHsKKwkJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAidW5hYmxlIHRvIEFsbG9jYXRlIE1TSS1YIGludGVycnVwdHNcbiIpOworCQkJa2ZyZWUob2N0LT5tc2l4X2VudHJpZXMpOworCQkJb2N0LT5tc2l4X2VudHJpZXMgPSBOVUxMOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICJPQ1RFT046IEVub3VnaCBNU0ktWCBpbnRlcnJ1cHRzIGFyZSBhbGxvY2F0ZWQuLi5cbiIpOworCisJCW51bV9pb3FfdmVjdG9ycyA9IG9jdC0+bnVtX21zaXhfaXJxczsKKworCQkvKiogRm9yIFBGLCB0aGVyZSBpcyBvbmUgbm9uLWlvcSBpbnRlcnJ1cHQgaGFuZGxlciAqLworCQludW1faW9xX3ZlY3RvcnMgLT0gMTsKKwkJaXJxcmV0ID0gcmVxdWVzdF9pcnEobXNpeF9lbnRyaWVzW251bV9pb3FfdmVjdG9yc10udmVjdG9yLAorCQkJCSAgICAgbGlxdWlkaW9fbGVnYWN5X2ludHJfaGFuZGxlciwgMCwgIm9jdGVvbiIsCisJCQkJICAgICBvY3QpOworCQlpZiAoaXJxcmV0KSB7CisJCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwKKwkJCQkiT0NURU9OOiBSZXF1ZXN0X2lycSBmYWlsZWQgZm9yIE1TSVggaW50ZXJydXB0IEVycm9yOiAlZFxuIiwKKwkJCQlpcnFyZXQpOworCQkJcGNpX2Rpc2FibGVfbXNpeChvY3QtPnBjaV9kZXYpOworCQkJa2ZyZWUob2N0LT5tc2l4X2VudHJpZXMpOworCQkJb2N0LT5tc2l4X2VudHJpZXMgPSBOVUxMOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2lvcV92ZWN0b3JzOyBpKyspIHsKKwkJCWlycXJldCA9IHJlcXVlc3RfaXJxKG1zaXhfZW50cmllc1tpXS52ZWN0b3IsCisJCQkJCSAgICAgbGlxdWlkaW9fbXNpeF9pbnRyX2hhbmRsZXIsIDAsCisJCQkJCSAgICAgIm9jdGVvbiIsICZvY3QtPmlvcV92ZWN0b3JbaV0pOworCQkJaWYgKGlycXJldCkgeworCQkJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LAorCQkJCQkiT0NURU9OOiBSZXF1ZXN0X2lycSBmYWlsZWQgZm9yIE1TSVggaW50ZXJydXB0IEVycm9yOiAlZFxuIiwKKwkJCQkJaXJxcmV0KTsKKwkJCQkvKiogRnJlZWluZyB0aGUgbm9uLWlvcSBpcnEgdmVjdG9yIGhlcmUgLiAqLworCQkJCWZyZWVfaXJxKG1zaXhfZW50cmllc1tudW1faW9xX3ZlY3RvcnNdLnZlY3RvciwKKwkJCQkJIG9jdCk7CisKKwkJCQl3aGlsZSAoaSkgeworCQkJCQlpLS07CisJCQkJCS8qKiBjbGVhcmluZyBhZmZpbml0eSBtYXNrLiAqLworCQkJCQlpcnFfc2V0X2FmZmluaXR5X2hpbnQoCisJCQkJCQltc2l4X2VudHJpZXNbaV0udmVjdG9yLCBOVUxMKTsKKwkJCQkJZnJlZV9pcnEobXNpeF9lbnRyaWVzW2ldLnZlY3RvciwKKwkJCQkJCSAmb2N0LT5pb3FfdmVjdG9yW2ldKTsKKwkJCQl9CisJCQkJcGNpX2Rpc2FibGVfbXNpeChvY3QtPnBjaV9kZXYpOworCQkJCWtmcmVlKG9jdC0+bXNpeF9lbnRyaWVzKTsKKwkJCQlvY3QtPm1zaXhfZW50cmllcyA9IE5VTEw7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlvY3QtPmlvcV92ZWN0b3JbaV0udmVjdG9yID0gbXNpeF9lbnRyaWVzW2ldLnZlY3RvcjsKKwkJCS8qIGFzc2lnbiB0aGUgY3B1IG1hc2sgZm9yIHRoaXMgbXNpeCBpbnRlcnJ1cHQgdmVjdG9yICovCisJCQlpcnFfc2V0X2FmZmluaXR5X2hpbnQoCisJCQkJCW1zaXhfZW50cmllc1tpXS52ZWN0b3IsCisJCQkJCSgmb2N0LT5pb3FfdmVjdG9yW2ldLmFmZmluaXR5X21hc2spKTsKKwkJfQorCQlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIk9DVEVPTlslZF06IE1TSS1YIGVuYWJsZWRcbiIsCisJCQlvY3QtPm9jdGVvbl9pZCk7CisJfSBlbHNlIHsKKwkJZXJyID0gcGNpX2VuYWJsZV9tc2kob2N0LT5wY2lfZGV2KTsKKwkJaWYgKGVycikKKwkJCWRldl93YXJuKCZvY3QtPnBjaV9kZXYtPmRldiwgIlJldmVydGluZyB0byBsZWdhY3kgaW50ZXJydXB0cy4gRXJyb3I6ICVkXG4iLAorCQkJCSBlcnIpOworCQllbHNlCisJCQlvY3QtPmZsYWdzIHw9IExJT19GTEFHX01TSV9FTkFCTEVEOworCisJCWlycXJldCA9IHJlcXVlc3RfaXJxKG9jdC0+cGNpX2Rldi0+aXJxLAorCQkJCSAgICAgbGlxdWlkaW9fbGVnYWN5X2ludHJfaGFuZGxlciwgSVJRRl9TSEFSRUQsCisJCQkJICAgICAib2N0ZW9uIiwgb2N0KTsKKwkJaWYgKGlycXJldCkgeworCQkJaWYgKG9jdC0+ZmxhZ3MgJiBMSU9fRkxBR19NU0lfRU5BQkxFRCkKKwkJCQlwY2lfZGlzYWJsZV9tc2kob2N0LT5wY2lfZGV2KTsKKwkJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiUmVxdWVzdCBJUlEgZmFpbGVkIHdpdGggY29kZTogJWRcbiIsCisJCQkJaXJxcmV0KTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxpcXVpZGlvX3dhdGNoZG9nKHZvaWQgKnBhcmFtKQoreworCXU2NCB3ZG9nOworCXUxNiBtYXNrX29mX3N0dWNrX2NvcmVzID0gMDsKKwl1MTYgbWFza19vZl9jcmFzaGVkX2NvcmVzID0gMDsKKwlpbnQgY29yZV9udW07CisJdTggY29yZV9pc19zdHVja1tMSU9fTUFYX0NPUkVTXTsKKwl1OCBjb3JlX2NyYXNoZWRbTElPX01BWF9DT1JFU107CisJc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCA9IHBhcmFtOworCisJbWVtc2V0KGNvcmVfaXNfc3R1Y2ssIDAsIHNpemVvZihjb3JlX2lzX3N0dWNrKSk7CisJbWVtc2V0KGNvcmVfY3Jhc2hlZCwgMCwgc2l6ZW9mKGNvcmVfY3Jhc2hlZCkpOworCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJbWFza19vZl9jcmFzaGVkX2NvcmVzID0KKwkJICAgICh1MTYpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCBDTjIzWFhfU0xJX1NDUkFUQ0gyKTsKKworCQlmb3IgKGNvcmVfbnVtID0gMDsgY29yZV9udW0gPCBMSU9fTUFYX0NPUkVTOyBjb3JlX251bSsrKSB7CisJCQlpZiAoIWNvcmVfaXNfc3R1Y2tbY29yZV9udW1dKSB7CisJCQkJd2RvZyA9IGxpb19wY2lfcmVhZHEob2N0LCBDSVUzX1dET0coY29yZV9udW0pKTsKKworCQkJCS8qIGxvb2sgYXQgd2F0Y2hkb2cgc3RhdGUgZmllbGQgKi8KKwkJCQl3ZG9nICY9IENJVTNfV0RPR19NQVNLOworCQkJCWlmICh3ZG9nKSB7CisJCQkJCS8qIHRoaXMgd2F0Y2hkb2cgdGltZXIgaGFzIGV4cGlyZWQgKi8KKwkJCQkJY29yZV9pc19zdHVja1tjb3JlX251bV0gPQorCQkJCQkJTElPX01PTklUT1JfV0RPR19FWFBJUkU7CisJCQkJCW1hc2tfb2Zfc3R1Y2tfY29yZXMgfD0gKDEgPDwgY29yZV9udW0pOworCQkJCX0KKwkJCX0KKworCQkJaWYgKCFjb3JlX2NyYXNoZWRbY29yZV9udW1dKQorCQkJCWNvcmVfY3Jhc2hlZFtjb3JlX251bV0gPQorCQkJCSAgICAobWFza19vZl9jcmFzaGVkX2NvcmVzID4+IGNvcmVfbnVtKSAmIDE7CisJCX0KKworCQlpZiAobWFza19vZl9zdHVja19jb3JlcykgeworCQkJZm9yIChjb3JlX251bSA9IDA7IGNvcmVfbnVtIDwgTElPX01BWF9DT1JFUzsKKwkJCSAgICAgY29yZV9udW0rKykgeworCQkJCWlmIChjb3JlX2lzX3N0dWNrW2NvcmVfbnVtXSA9PSAxKSB7CisJCQkJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LAorCQkJCQkJIkVSUk9SOiBPY3Rlb24gY29yZSAlZCBpcyBzdHVjayFcbiIsCisJCQkJCQljb3JlX251bSk7CisJCQkJCS8qIDIgbWVhbnMgd2UgaGF2ZSBwcmludGsnZCAgYW4gZXJyb3IKKwkJCQkJICogc28gbm8gbmVlZCB0byByZXBlYXQgdGhlIHNhbWUgcHJpbnRrCisJCQkJCSAqLworCQkJCQljb3JlX2lzX3N0dWNrW2NvcmVfbnVtXSA9CisJCQkJCQlMSU9fTU9OSVRPUl9DT1JFX1NUVUNLX01TR0Q7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKG1hc2tfb2ZfY3Jhc2hlZF9jb3JlcykgeworCQkJZm9yIChjb3JlX251bSA9IDA7IGNvcmVfbnVtIDwgTElPX01BWF9DT1JFUzsKKwkJCSAgICAgY29yZV9udW0rKykgeworCQkJCWlmIChjb3JlX2NyYXNoZWRbY29yZV9udW1dID09IDEpIHsKKwkJCQkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsCisJCQkJCQkiRVJST1I6IE9jdGVvbiBjb3JlICVkIGNyYXNoZWQhICBTZWUgb2N0LWZ3ZHVtcCBmb3IgZGV0YWlscy5cbiIsCisJCQkJCQljb3JlX251bSk7CisJCQkJCS8qIDIgbWVhbnMgd2UgaGF2ZSBwcmludGsnZCAgYW4gZXJyb3IKKwkJCQkJICogc28gbm8gbmVlZCB0byByZXBlYXQgdGhlIHNhbWUgcHJpbnRrCisJCQkJCSAqLworCQkJCQljb3JlX2NyYXNoZWRbY29yZV9udW1dID0KKwkJCQkJCUxJT19NT05JVE9SX0NPUkVfU1RVQ0tfTVNHRDsKKwkJCQl9CisJCQl9CisJCX0KKyNpZmRlZiBDT05GSUdfTU9EVUxFX1VOTE9BRAorCQlpZiAobWFza19vZl9zdHVja19jb3JlcyB8fCBtYXNrX29mX2NyYXNoZWRfY29yZXMpIHsKKwkJCS8qIG1ha2UgbW9kdWxlIHJlZmNvdW50PTAgc28gdGhhdCBybW1vZCB3aWxsIHdvcmsgKi8KKwkJCWxvbmcgcmVmY291bnQ7CisKKwkJCXJlZmNvdW50ID0gbW9kdWxlX3JlZmNvdW50KFRISVNfTU9EVUxFKTsKKworCQkJd2hpbGUgKHJlZmNvdW50ID4gMCkgeworCQkJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCQkJCXJlZmNvdW50ID0gbW9kdWxlX3JlZmNvdW50KFRISVNfTU9EVUxFKTsKKwkJCX0KKworCQkJLyogY29tcGVuc2F0ZSBmb3IgYW5kIHdpdGhzdGFuZCBhbiB1bmxpa2VseSAoYnV0IHN0aWxsCisJCQkgKiBwb3NzaWJsZSkgcmFjZSBjb25kaXRpb24KKwkJCSAqLworCQkJd2hpbGUgKHJlZmNvdW50IDwgMCkgeworCQkJCXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKwkJCQlyZWZjb3VudCA9IG1vZHVsZV9yZWZjb3VudChUSElTX01PRFVMRSk7CisJCQl9CisJCX0KKyNlbmRpZgorCQkvKiBzbGVlcCBmb3IgdHdvIHNlY29uZHMgKi8KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgyICogSFopOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTEwNyw2ICsxMzAwLDkgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJaWYgKHBkZXYtPmRldmljZSA9PSBPQ1RFT05fQ04yM1hYX1BGX1ZJRCkKKwkJb2N0X2Rldi0+bXNpeF9vbiA9IExJT19GTEFHX01TSVhfRU5BQkxFRDsKKwogCWRldl9pbmZvKCZwZGV2LT5kZXYsICJJbml0aWFsaXppbmcgZGV2aWNlICV4OiV4LlxuIiwKIAkJICh1MzIpcGRldi0+dmVuZG9yLCAodTMyKXBkZXYtPmRldmljZSk7CiAKQEAgLTExMzAsNiArMTMyNiwzMCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKKwlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3RfZGV2KSkgeworCQl1NjQgc2NyYXRjaDE7CisJCXU4IGJ1cywgZGV2aWNlLCBmdW5jdGlvbjsKKworCQlzY3JhdGNoMSA9IG9jdGVvbl9yZWFkX2NzcjY0KG9jdF9kZXYsIENOMjNYWF9TTElfU0NSQVRDSDEpOworCQlpZiAoIShzY3JhdGNoMSAmIDRVTEwpKSB7CisJCQkvKiBCaXQgMiBvZiBTTElfU0NSQVRDSF8xIGlzIGEgZmxhZyB0aGF0IGluZGljYXRlcyB0aGF0CisJCQkgKiB0aGUgbGlvIHdhdGNoZG9nIGtlcm5lbCB0aHJlYWQgaXMgcnVubmluZyBmb3IgdGhpcworCQkJICogTklDLiAgRWFjaCBOSUMgZ2V0cyBvbmUgd2F0Y2hkb2cga2VybmVsIHRocmVhZC4KKwkJCSAqLworCQkJc2NyYXRjaDEgfD0gNFVMTDsKKwkJCW9jdGVvbl93cml0ZV9jc3I2NChvY3RfZGV2LCBDTjIzWFhfU0xJX1NDUkFUQ0gxLAorCQkJCQkgICBzY3JhdGNoMSk7CisKKwkJCWJ1cyA9IHBkZXYtPmJ1cy0+bnVtYmVyOworCQkJZGV2aWNlID0gUENJX1NMT1QocGRldi0+ZGV2Zm4pOworCQkJZnVuY3Rpb24gPSBQQ0lfRlVOQyhwZGV2LT5kZXZmbik7CisJCQlvY3RfZGV2LT53YXRjaGRvZ190YXNrID0ga3RocmVhZF9jcmVhdGUoCisJCQkgICAgbGlxdWlkaW9fd2F0Y2hkb2csIG9jdF9kZXYsCisJCQkgICAgImxpb3dkLyUwMmhoeDolMDJoaHguJWhoeCIsIGJ1cywgZGV2aWNlLCBmdW5jdGlvbik7CisJCQl3YWtlX3VwX3Byb2Nlc3Mob2N0X2Rldi0+d2F0Y2hkb2dfdGFzayk7CisJCX0KKwl9CisKIAlvY3RfZGV2LT5yeF9wYXVzZSA9IDE7CiAJb2N0X2Rldi0+dHhfcGF1c2UgPSAxOwogCkBAIC0xMTQ2LDYgKzEzNjYsNyBAQAogc3RhdGljIHZvaWQgb2N0ZW9uX2Rlc3Ryb3lfcmVzb3VyY2VzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCiB7CiAJaW50IGk7CisJc3RydWN0IG1zaXhfZW50cnkgKm1zaXhfZW50cmllczsKIAlzdHJ1Y3Qgb2N0ZW9uX2RldmljZV9wcml2ICpvY3RfcHJpdiA9CiAJCShzdHJ1Y3Qgb2N0ZW9uX2RldmljZV9wcml2ICopb2N0LT5wcml2OwogCkBAIC0xMTkwLDIxICsxNDExLDQwIEBACiAJCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIk9RIGhhZCBwZW5kaW5nIHBhY2tldHNcbiIpOwogCiAJCS8qIERpc2FibGUgaW50ZXJydXB0cyAgKi8KLQkJb2N0LT5mbl9saXN0LmRpc2FibGVfaW50ZXJydXB0KG9jdC0+Y2hpcCk7CisJCW9jdC0+Zm5fbGlzdC5kaXNhYmxlX2ludGVycnVwdChvY3QsIE9DVEVPTl9BTExfSU5UUik7CiAKLQkJLyogUmVsZWFzZSB0aGUgaW50ZXJydXB0IGxpbmUgKi8KLQkJZnJlZV9pcnEob2N0LT5wY2lfZGV2LT5pcnEsIG9jdCk7CisJCWlmIChvY3QtPm1zaXhfb24pIHsKKwkJCW1zaXhfZW50cmllcyA9IChzdHJ1Y3QgbXNpeF9lbnRyeSAqKW9jdC0+bXNpeF9lbnRyaWVzOworCQkJZm9yIChpID0gMDsgaSA8IG9jdC0+bnVtX21zaXhfaXJxcyAtIDE7IGkrKykgeworCQkJCS8qIGNsZWFyIHRoZSBhZmZpbml0eV9jcHVtYXNrICovCisJCQkJaXJxX3NldF9hZmZpbml0eV9oaW50KG1zaXhfZW50cmllc1tpXS52ZWN0b3IsCisJCQkJCQkgICAgICBOVUxMKTsKKwkJCQlmcmVlX2lycShtc2l4X2VudHJpZXNbaV0udmVjdG9yLAorCQkJCQkgJm9jdC0+aW9xX3ZlY3RvcltpXSk7CisJCQl9CisJCQkvKiBub24taW92IHZlY3RvcidzIGFyZ3VtZW50IGlzIG9jdCBzdHJ1Y3QgKi8KKwkJCWZyZWVfaXJxKG1zaXhfZW50cmllc1tpXS52ZWN0b3IsIG9jdCk7CiAKLQkJaWYgKG9jdC0+ZmxhZ3MgJiBMSU9fRkxBR19NU0lfRU5BQkxFRCkKLQkJCXBjaV9kaXNhYmxlX21zaShvY3QtPnBjaV9kZXYpOworCQkJcGNpX2Rpc2FibGVfbXNpeChvY3QtPnBjaV9kZXYpOworCQkJa2ZyZWUob2N0LT5tc2l4X2VudHJpZXMpOworCQkJb2N0LT5tc2l4X2VudHJpZXMgPSBOVUxMOworCQl9IGVsc2UgeworCQkJLyogUmVsZWFzZSB0aGUgaW50ZXJydXB0IGxpbmUgKi8KKwkJCWZyZWVfaXJxKG9jdC0+cGNpX2Rldi0+aXJxLCBvY3QpOwogCi0JCS8qIGZhbGx0aHJvdWdoICovCisJCQlpZiAob2N0LT5mbGFncyAmIExJT19GTEFHX01TSV9FTkFCTEVEKQorCQkJCXBjaV9kaXNhYmxlX21zaShvY3QtPnBjaV9kZXYpOworCQl9CisKKwkJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSkKKwkJCW9jdGVvbl9mcmVlX2lvcV92ZWN0b3Iob2N0KTsKKwkvKiBmYWxsdGhyb3VnaCAqLwogCWNhc2UgT0NUX0RFVl9JTl9SRVNFVDoKIAljYXNlIE9DVF9ERVZfRFJPUV9JTklUX0RPTkU6CiAJCS8qYXRvbWljX3NldCgmb2N0LT5zdGF0dXMsIE9DVF9ERVZfRFJPUV9JTklUX0RPTkUpOyovCiAJCW1kZWxheSgxMDApOwogCQlmb3IgKGkgPSAwOyBpIDwgTUFYX09DVEVPTl9PVVRQVVRfUVVFVUVTKG9jdCk7IGkrKykgewotCQkJaWYgKCEob2N0LT5pb19xbWFzay5vcSAmICgxVUxMIDw8IGkpKSkKKwkJCWlmICghKG9jdC0+aW9fcW1hc2sub3EgJiBCSVRfVUxMKGkpKSkKIAkJCQljb250aW51ZTsKIAkJCW9jdGVvbl9kZWxldGVfZHJvcShvY3QsIGkpOwogCQl9CkBAIC0xMjI2LDE2ICsxNDY2LDE1IEBACiAJCW9jdGVvbl9kZWxldGVfcmVzcG9uc2VfbGlzdChvY3QpOwogCiAJCS8qIGZhbGx0aHJvdWdoICovCi0JY2FzZSBPQ1RfREVWX1NDX0JVRkZfUE9PTF9JTklUX0RPTkU6Ci0JCW9jdGVvbl9mcmVlX3NjX2J1ZmZlcl9wb29sKG9jdCk7Ci0KLQkJLyogZmFsbHRocm91Z2ggKi8KIAljYXNlIE9DVF9ERVZfSU5TVFJfUVVFVUVfSU5JVF9ET05FOgogCQlmb3IgKGkgPSAwOyBpIDwgTUFYX09DVEVPTl9JTlNUUl9RVUVVRVMob2N0KTsgaSsrKSB7Ci0JCQlpZiAoIShvY3QtPmlvX3FtYXNrLmlxICYgKDFVTEwgPDwgaSkpKQorCQkJaWYgKCEob2N0LT5pb19xbWFzay5pcSAmIEJJVF9VTEwoaSkpKQogCQkJCWNvbnRpbnVlOwogCQkJb2N0ZW9uX2RlbGV0ZV9pbnN0cl9xdWV1ZShvY3QsIGkpOwogCQl9CisJCS8qIGZhbGx0aHJvdWdoICovCisJY2FzZSBPQ1RfREVWX1NDX0JVRkZfUE9PTF9JTklUX0RPTkU6CisJCW9jdGVvbl9mcmVlX3NjX2J1ZmZlcl9wb29sKG9jdCk7CiAKIAkJLyogZmFsbHRocm91Z2ggKi8KIAljYXNlIE9DVF9ERVZfRElTUEFUQ0hfSU5JVF9ET05FOgpAQCAtMTI0NCw5ICsxNDgzLDkgQEAKIAogCQkvKiBmYWxsdGhyb3VnaCAqLwogCWNhc2UgT0NUX0RFVl9QQ0lfTUFQX0RPTkU6Ci0KIAkJLyogU29mdCByZXNldCB0aGUgb2N0ZW9uIGRldmljZSBiZWZvcmUgZXhpdGluZyAqLwotCQlvY3QtPmZuX2xpc3Quc29mdF9yZXNldChvY3QpOworCQlpZiAoKCFPQ1RFT05fQ04yM1hYX1BGKG9jdCkpIHx8ICFvY3QtPm9jdGVvbl9pZCkKKwkJCW9jdC0+Zm5fbGlzdC5zb2Z0X3Jlc2V0KG9jdCk7CiAKIAkJb2N0ZW9uX3VubWFwX3BjaV9iYXJ4KG9jdCwgMCk7CiAJCW9jdGVvbl91bm1hcF9wY2lfYmFyeChvY3QsIDEpOwpAQCAtMTI2NCwyMyArMTUwMyw4OSBAQAogfQogCiAvKioKKyAqIFxicmllZiBDYWxsYmFjayBmb3IgcnggY3RybAorICogQHBhcmFtIHN0YXR1cyBzdGF0dXMgb2YgcmVxdWVzdAorICogQHBhcmFtIGJ1ZiBwb2ludGVyIHRvIHJlc3Agc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIHJ4X2N0bF9jYWxsYmFjayhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LAorCQkJICAgIHUzMiBzdGF0dXMsCisJCQkgICAgdm9pZCAqYnVmKQoreworCXN0cnVjdCBvY3Rlb25fc29mdF9jb21tYW5kICpzYyA9IChzdHJ1Y3Qgb2N0ZW9uX3NvZnRfY29tbWFuZCAqKWJ1ZjsKKwlzdHJ1Y3QgbGlxdWlkaW9fcnhfY3RsX2NvbnRleHQgKmN0eDsKKworCWN0eCAgPSAoc3RydWN0IGxpcXVpZGlvX3J4X2N0bF9jb250ZXh0ICopc2MtPmN0eHB0cjsKKworCW9jdCA9IGxpb19nZXRfZGV2aWNlKGN0eC0+b2N0ZW9uX2lkKTsKKwlpZiAoc3RhdHVzKQorCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgInJ4IGN0bCBpbnN0cnVjdGlvbiBmYWlsZWQuIFN0YXR1czogJWxseFxuIiwKKwkJCUNWTV9DQVNUNjQoc3RhdHVzKSk7CisJV1JJVEVfT05DRShjdHgtPmNvbmQsIDEpOworCisJLyogVGhpcyBiYXJyaWVyIGlzIHJlcXVpcmVkIHRvIGJlIHN1cmUgdGhhdCB0aGUgcmVzcG9uc2UgaGFzIGJlZW4KKwkgKiB3cml0dGVuIGZ1bGx5IGJlZm9yZSB3YWtpbmcgdXAgdGhlIGhhbmRsZXIKKwkgKi8KKwl3bWIoKTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY3R4LT53Yyk7Cit9CisKKy8qKgogICogXGJyaWVmIFNlbmQgUnggY29udHJvbCBjb21tYW5kCiAgKiBAcGFyYW0gbGlvIHBlci1uZXR3b3JrIHByaXZhdGUgZGF0YQogICogQHBhcmFtIHN0YXJ0X3N0b3Agd2hldGhlciB0byBzdGFydCBvciBzdG9wCiAgKi8KIHN0YXRpYyB2b2lkIHNlbmRfcnhfY3RybF9jbWQoc3RydWN0IGxpbyAqbGlvLCBpbnQgc3RhcnRfc3RvcCkKIHsKLQlzdHJ1Y3Qgb2N0bmljX2N0cmxfcGt0IG5jdHJsOworCXN0cnVjdCBvY3Rlb25fc29mdF9jb21tYW5kICpzYzsKKwlzdHJ1Y3QgbGlxdWlkaW9fcnhfY3RsX2NvbnRleHQgKmN0eDsKKwl1bmlvbiBvY3RuZXRfY21kICpuY21kOworCWludCBjdHhfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbGlxdWlkaW9fcnhfY3RsX2NvbnRleHQpOworCXN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QgPSAoc3RydWN0IG9jdGVvbl9kZXZpY2UgKilsaW8tPm9jdF9kZXY7CisJaW50IHJldHZhbDsKIAotCW1lbXNldCgmbmN0cmwsIDAsIHNpemVvZihzdHJ1Y3Qgb2N0bmljX2N0cmxfcGt0KSk7CisJaWYgKG9jdC0+cHJvcHNbbGlvLT5pZmlkeF0ucnhfb24gPT0gc3RhcnRfc3RvcCkKKwkJcmV0dXJuOwogCi0JbmN0cmwubmNtZC5zLmNtZCA9IE9DVE5FVF9DTURfUlhfQ1RMOwotCW5jdHJsLm5jbWQucy5wYXJhbTEgPSBzdGFydF9zdG9wOwotCW5jdHJsLmlxX25vID0gbGlvLT5saW5mby50eHBjaXFbMF0ucy5xX25vOwotCW5jdHJsLm5ldHBuZGV2ID0gKHU2NClsaW8tPm5ldGRldjsKKwlzYyA9IChzdHJ1Y3Qgb2N0ZW9uX3NvZnRfY29tbWFuZCAqKQorCQlvY3Rlb25fYWxsb2Nfc29mdF9jb21tYW5kKG9jdCwgT0NUTkVUX0NNRF9TSVpFLAorCQkJCQkgIDE2LCBjdHhfc2l6ZSk7CiAKLQlpZiAob2N0bmV0X3NlbmRfbmljX2N0cmxfcGt0KGxpby0+b2N0X2RldiwgJm5jdHJsKSA8IDApCisJbmNtZCA9ICh1bmlvbiBvY3RuZXRfY21kICopc2MtPnZpcnRkcHRyOworCWN0eCAgPSAoc3RydWN0IGxpcXVpZGlvX3J4X2N0bF9jb250ZXh0ICopc2MtPmN0eHB0cjsKKworCVdSSVRFX09OQ0UoY3R4LT5jb25kLCAwKTsKKwljdHgtPm9jdGVvbl9pZCA9IGxpb19nZXRfZGV2aWNlX2lkKG9jdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmY3R4LT53Yyk7CisKKwluY21kLT51NjQgPSAwOworCW5jbWQtPnMuY21kID0gT0NUTkVUX0NNRF9SWF9DVEw7CisJbmNtZC0+cy5wYXJhbTEgPSBzdGFydF9zdG9wOworCisJb2N0ZW9uX3N3YXBfOEJfZGF0YSgodTY0ICopbmNtZCwgKE9DVE5FVF9DTURfU0laRSA+PiAzKSk7CisKKwlzYy0+aXFfbm8gPSBsaW8tPmxpbmZvLnR4cGNpcVswXS5zLnFfbm87CisKKwlvY3Rlb25fcHJlcGFyZV9zb2Z0X2NvbW1hbmQob2N0LCBzYywgT1BDT0RFX05JQywKKwkJCQkgICAgT1BDT0RFX05JQ19DTUQsIDAsIDAsIDApOworCisJc2MtPmNhbGxiYWNrID0gcnhfY3RsX2NhbGxiYWNrOworCXNjLT5jYWxsYmFja19hcmcgPSBzYzsKKwlzYy0+d2FpdF90aW1lID0gNTAwMDsKKworCXJldHZhbCA9IG9jdGVvbl9zZW5kX3NvZnRfY29tbWFuZChvY3QsIHNjKTsKKwlpZiAocmV0dmFsID09IElRX1NFTkRfRkFJTEVEKSB7CiAJCW5ldGlmX2luZm8obGlvLCByeF9lcnIsIGxpby0+bmV0ZGV2LCAiRmFpbGVkIHRvIHNlbmQgUlggQ29udHJvbCBtZXNzYWdlXG4iKTsKKwl9IGVsc2UgeworCQkvKiBTbGVlcCBvbiBhIHdhaXQgcXVldWUgdGlsbCB0aGUgY29uZCBmbGFnIGluZGljYXRlcyB0aGF0IHRoZQorCQkgKiByZXNwb25zZSBhcnJpdmVkIG9yIHRpbWVkLW91dC4KKwkJICovCisJCWlmIChzbGVlcF9jb25kKCZjdHgtPndjLCAmY3R4LT5jb25kKSA9PSAtRUlOVFIpCisJCQlyZXR1cm47CisJCW9jdC0+cHJvcHNbbGlvLT5pZmlkeF0ucnhfb24gPSBzdGFydF9zdG9wOworCX0KKworCW9jdGVvbl9mcmVlX3NvZnRfY29tbWFuZChvY3QsIHNjKTsKIH0KIAogLyoqCkBAIC0xMzA3LDIxICsxNjEyLDI0IEBACiAKIAlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIk5JQyBkZXZpY2UgY2xlYW51cFxuIik7CiAKLQlzZW5kX3J4X2N0cmxfY21kKGxpbywgMCk7Ci0KIAlpZiAoYXRvbWljX3JlYWQoJmxpby0+aWZzdGF0ZSkgJiBMSU9fSUZTVEFURV9SVU5OSU5HKQotCQl0eHFzX3N0b3AobmV0ZGV2KTsKKwkJbGlxdWlkaW9fc3RvcChuZXRkZXYpOwogCiAJaWYgKG9jdC0+cHJvcHNbbGlvLT5pZmlkeF0ubmFwaV9lbmFibGVkID09IDEpIHsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5hcGksIG4sICZuZXRkZXYtPm5hcGlfbGlzdCwgZGV2X2xpc3QpCiAJCQluYXBpX2Rpc2FibGUobmFwaSk7CiAKIAkJb2N0LT5wcm9wc1tsaW8tPmlmaWR4XS5uYXBpX2VuYWJsZWQgPSAwOworCisJCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkpCisJCQlvY3QtPmRyb3FbMF0tPm9wcy5wb2xsX21vZGUgPSAwOwogCX0KIAogCWlmIChhdG9taWNfcmVhZCgmbGlvLT5pZnN0YXRlKSAmIExJT19JRlNUQVRFX1JFR0lTVEVSRUQpCiAJCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CiAKKwljbGVhbnVwX2xpbmtfc3RhdHVzX2NoYW5nZV93cShuZXRkZXYpOworCiAJZGVsZXRlX2dsaXN0cyhsaW8pOwogCiAJZnJlZV9uZXRkZXYobmV0ZGV2KTsKQEAgLTEzNzQsNiArMTY4Miw5IEBACiAKIAlkZXZfZGJnKCZvY3RfZGV2LT5wY2lfZGV2LT5kZXYsICJTdG9wcGluZyBkZXZpY2VcbiIpOwogCisJaWYgKG9jdF9kZXYtPndhdGNoZG9nX3Rhc2spCisJCWt0aHJlYWRfc3RvcChvY3RfZGV2LT53YXRjaGRvZ190YXNrKTsKKwogCWlmIChvY3RfZGV2LT5hcHBfbW9kZSAmJiAob2N0X2Rldi0+YXBwX21vZGUgPT0gQ1ZNX0RSVl9OSUNfQVBQKSkKIAkJbGlxdWlkaW9fc3RvcF9uaWNfbW9kdWxlKG9jdF9kZXYpOwogCkBAIC0xNDE3LDYgKzE3MjgsMTIgQEAKIAkJcyA9ICJDTjY2WFgiOwogCQlicmVhazsKIAorCWNhc2UgT0NURU9OX0NOMjNYWF9QQ0lJRF9QRjoKKwkJb2N0LT5jaGlwX2lkID0gT0NURU9OX0NOMjNYWF9QRl9WSUQ7CisJCXJldCA9IHNldHVwX2NuMjN4eF9vY3Rlb25fcGZfZGV2aWNlKG9jdCk7CisJCXMgPSAiQ04yM1hYIjsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlzID0gIj8iOwogCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIlVua25vd24gZGV2aWNlIGZvdW5kIChkZXZfaWQ6ICV4KVxuIiwKQEAgLTE4NjcsNyArMjE4NCw3IEBACiAJc3RydWN0IGxpcXVpZGlvX2lmX2NmZ19jb250ZXh0ICpjdHg7CiAKIAlyZXNwID0gKHN0cnVjdCBsaXF1aWRpb19pZl9jZmdfcmVzcCAqKXNjLT52aXJ0cnB0cjsKLQljdHggID0gKHN0cnVjdCBsaXF1aWRpb19pZl9jZmdfY29udGV4dCAqKXNjLT5jdHhwdHI7CisJY3R4ID0gKHN0cnVjdCBsaXF1aWRpb19pZl9jZmdfY29udGV4dCAqKXNjLT5jdHhwdHI7CiAKIAlvY3QgPSBsaW9fZ2V0X2RldmljZShjdHgtPm9jdGVvbl9pZCk7CiAJaWYgKHJlc3AtPnN0YXR1cykKQEAgLTIwNjAsMTEgKzIzNzcsMTQgQEAKICAqLwogc3RhdGljIHZvaWQgbGlxdWlkaW9fbmFwaV9kcnZfY2FsbGJhY2sodm9pZCAqYXJnKQogeworCXN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3Q7CiAJc3RydWN0IG9jdGVvbl9kcm9xICpkcm9xID0gYXJnOwogCWludCB0aGlzX2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAotCWlmIChkcm9xLT5jcHVfaWQgPT0gdGhpc19jcHUpIHsKLQkJbmFwaV9zY2hlZHVsZSgmZHJvcS0+bmFwaSk7CisJb2N0ID0gZHJvcS0+b2N0X2RldjsKKworCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkgfHwgZHJvcS0+Y3B1X2lkID09IHRoaXNfY3B1KSB7CisJCW5hcGlfc2NoZWR1bGVfaXJxb2ZmKCZkcm9xLT5uYXBpKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgY2FsbF9zaW5nbGVfZGF0YSAqY3NkID0gJmRyb3EtPmNzZDsKIApAQCAtMjE3MywxNyArMjQ5MywxNSBAQAogCQkJCQkJICAgbGlvLT5pZmlkeCksIE5VTEwpOwogCQlpZiAocmV0dmFsKSB7CiAJCQlkZXZfZXJyKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsCi0JCQkJIiAlcyA6IFJ1bnRpbWUgRFJPUShSeFEpIGNyZWF0aW9uIGZhaWxlZC5cbiIsCisJCQkJIiVzIDogUnVudGltZSBEUk9RKFJ4USkgY3JlYXRpb24gZmFpbGVkLlxuIiwKIAkJCQlfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gMTsKIAkJfQogCiAJCWRyb3EgPSBvY3Rlb25fZGV2LT5kcm9xW3Ffbm9dOwogCQluYXBpID0gJmRyb3EtPm5hcGk7Ci0JCWRldl9kYmcoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwKLQkJCSJuZXRpZl9uYXBpX2FkZCBuZXRkZXY6JWxseCBvY3Q6JWxseFxuIiwKLQkJCSh1NjQpbmV0ZGV2LAotCQkJKHU2NClvY3Rlb25fZGV2KTsKKwkJZGV2X2RiZygmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LCAibmV0aWZfbmFwaV9hZGQgbmV0ZGV2OiVsbHggb2N0OiVsbHggcGZfbnVtOiVkXG4iLAorCQkJKHU2NCluZXRkZXYsICh1NjQpb2N0ZW9uX2Rldiwgb2N0ZW9uX2Rldi0+cGZfbnVtKTsKIAkJbmV0aWZfbmFwaV9hZGQobmV0ZGV2LCBuYXBpLCBsaXF1aWRpb19uYXBpX3BvbGwsIDY0KTsKIAogCQkvKiBkZXNpZ25hdGUgYSBDUFUgZm9yIHRoaXMgZHJvcSAqLwpAQCAtMjE5NSw2ICsyNTEzLDE0IEBACiAJCW9jdGVvbl9yZWdpc3Rlcl9kcm9xX29wcyhvY3Rlb25fZGV2LCBxX25vLCAmZHJvcV9vcHMpOwogCX0KIAorCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdGVvbl9kZXYpKSB7CisJCS8qIDIzWFggUEYgY2FuIHJlY2VpdmUgY29udHJvbCBtZXNzYWdlcyAodmlhIHRoZSBmaXJzdCBQRi1vd25lZAorCQkgKiBkcm9xKSBmcm9tIHRoZSBmaXJtd2FyZSBldmVuIGlmIHRoZSBldGhYIGludGVyZmFjZSBpcyBkb3duLAorCQkgKiBzbyB0aGF0J3Mgd2h5IHBvbGxfbW9kZSBtdXN0IGJlIG9mZiBmb3IgdGhlIGZpcnN0IGRyb3EuCisJCSAqLworCQlvY3Rlb25fZGV2LT5kcm9xWzBdLT5vcHMucG9sbF9tb2RlID0gMDsKKwl9CisKIAkvKiBzZXQgdXAgSVFzLiAqLwogCWZvciAocSA9IDA7IHEgPCBsaW8tPmxpbmZvLm51bV90eHBjaXE7IHErKykgewogCQludW1fdHhfZGVzY3MgPSBDRkdfR0VUX05VTV9UWF9ERVNDU19OSUNfSUYob2N0ZW9uX2dldF9jb25mCkBAIC0yMjM1LDcgKzI1NjEsNyBAQAogICogXGJyaWVmIFNldHMgdXAgdGhlIHR4cSBwb2xsIGNoZWNrCiAgKiBAcGFyYW0gbmV0ZGV2IG5ldHdvcmsgZGV2aWNlCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXR1cF90eF9wb2xsX2ZuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCitzdGF0aWMgaW5saW5lIGludCBzZXR1cF90eF9wb2xsX2ZuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJc3RydWN0IGxpbyAqbGlvID0gR0VUX0xJTyhuZXRkZXYpOwogCXN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QgPSBsaW8tPm9jdF9kZXY7CkBAIC0yMjQ0LDIxICsyNTcwLDI0IEBACiAJCQkJCQlXUV9NRU1fUkVDTEFJTSwgMCk7CiAJaWYgKCFsaW8tPnR4cV9zdGF0dXNfd3Eud3EpIHsKIAkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJ1bmFibGUgdG8gY3JlYXRlIGNhdml1bSB0eHEgc3RhdHVzIHdxXG4iKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gLTE7CiAJfQogCUlOSVRfREVMQVlFRF9XT1JLKCZsaW8tPnR4cV9zdGF0dXNfd3Eud2sud29yaywKIAkJCSAgb2N0bmV0X3BvbGxfY2hlY2tfdHhxX3N0YXR1cyk7CiAJbGlvLT50eHFfc3RhdHVzX3dxLndrLmN0eHB0ciA9IGxpbzsKIAlxdWV1ZV9kZWxheWVkX3dvcmsobGlvLT50eHFfc3RhdHVzX3dxLndxLAogCQkJICAgJmxpby0+dHhxX3N0YXR1c193cS53ay53b3JrLCBtc2Vjc190b19qaWZmaWVzKDEpKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNsZWFudXBfdHhfcG9sbF9mbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCXN0cnVjdCBsaW8gKmxpbyA9IEdFVF9MSU8obmV0ZGV2KTsKIAotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbGlvLT50eHFfc3RhdHVzX3dxLndrLndvcmspOwotCWRlc3Ryb3lfd29ya3F1ZXVlKGxpby0+dHhxX3N0YXR1c193cS53cSk7CisJaWYgKGxpby0+dHhxX3N0YXR1c193cS53cSkgeworCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmxpby0+dHhxX3N0YXR1c193cS53ay53b3JrKTsKKwkJZGVzdHJveV93b3JrcXVldWUobGlvLT50eHFfc3RhdHVzX3dxLndxKTsKKwl9CiB9CiAKIC8qKgpAQCAtMjI3NiwyNCArMjYwNSwzNCBAQAogCQkJbmFwaV9lbmFibGUobmFwaSk7CiAKIAkJb2N0LT5wcm9wc1tsaW8tPmlmaWR4XS5uYXBpX2VuYWJsZWQgPSAxOworCisJCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkpCisJCQlvY3QtPmRyb3FbMF0tPm9wcy5wb2xsX21vZGUgPSAxOwogCX0KIAogCW9jdF9wdHBfb3BlbihuZXRkZXYpOwogCiAJaWZzdGF0ZV9zZXQobGlvLCBMSU9fSUZTVEFURV9SVU5OSU5HKTsKIAotCXNldHVwX3R4X3BvbGxfZm4obmV0ZGV2KTsKLQotCXN0YXJ0X3R4cShuZXRkZXYpOworCS8qIFJlYWR5IGZvciBsaW5rIHN0YXR1cyB1cGRhdGVzICovCisJbGlvLT5pbnRmX29wZW4gPSAxOwogCiAJbmV0aWZfaW5mbyhsaW8sIGlmdXAsIGxpby0+bmV0ZGV2LCAiSW50ZXJmYWNlIE9wZW4sIHJlYWR5IGZvciB0cmFmZmljXG4iKTsKIAorCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkpIHsKKwkJaWYgKCFvY3QtPm1zaXhfb24pCisJCQlpZiAoc2V0dXBfdHhfcG9sbF9mbihuZXRkZXYpKQorCQkJCXJldHVybiAtMTsKKwl9IGVsc2UgeworCQlpZiAoc2V0dXBfdHhfcG9sbF9mbihuZXRkZXYpKQorCQkJcmV0dXJuIC0xOworCX0KKworCXN0YXJ0X3R4cShuZXRkZXYpOworCiAJLyogdGVsbCBPY3Rlb24gdG8gc3RhcnQgZm9yd2FyZGluZyBwYWNrZXRzIHRvIGhvc3QgKi8KIAlzZW5kX3J4X2N0cmxfY21kKGxpbywgMSk7CiAKLQkvKiBSZWFkeSBmb3IgbGluayBzdGF0dXMgdXBkYXRlcyAqLwotCWxpby0+aW50Zl9vcGVuID0gMTsKLQogCWRldl9pbmZvKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzIGludGVyZmFjZSBpcyBvcGVuZWRcbiIsCiAJCSBuZXRkZXYtPm5hbWUpOwogCkBAIC0yMzI4LDcgKzI2NjcsMTIgQEAKIAkvKiBOb3cgaXQgc2hvdWxkIGJlIHNhZmUgdG8gdGVsbCBPY3Rlb24gdGhhdCBuaWMgaW50ZXJmYWNlIGlzIGRvd24uICovCiAJc2VuZF9yeF9jdHJsX2NtZChsaW8sIDApOwogCi0JY2xlYW51cF90eF9wb2xsX2ZuKG5ldGRldik7CisJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSkgeworCQlpZiAoIW9jdC0+bXNpeF9vbikKKwkJCWNsZWFudXBfdHhfcG9sbF9mbihuZXRkZXYpOworCX0gZWxzZSB7CisJCWNsZWFudXBfdHhfcG9sbF9mbihuZXRkZXYpOworCX0KIAogCWlmIChsaW8tPnB0cF9jbG9jaykgewogCQlwdHBfY2xvY2tfdW5yZWdpc3RlcihsaW8tPnB0cF9jbG9jayk7CkBAIC0yMzQwLDE0MyArMjY4NCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgbGlxdWlkaW9fbGlua19jdHJsX2NtZF9jb21wbGV0aW9uKHZvaWQgKm5jdHJsX3B0cikKLXsKLQlzdHJ1Y3Qgb2N0bmljX2N0cmxfcGt0ICpuY3RybCA9IChzdHJ1Y3Qgb2N0bmljX2N0cmxfcGt0ICopbmN0cmxfcHRyOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKiluY3RybC0+bmV0cG5kZXY7Ci0Jc3RydWN0IGxpbyAqbGlvID0gR0VUX0xJTyhuZXRkZXYpOwotCXN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QgPSBsaW8tPm9jdF9kZXY7Ci0JdTggKm1hYzsKLQotCXN3aXRjaCAobmN0cmwtPm5jbWQucy5jbWQpIHsKLQljYXNlIE9DVE5FVF9DTURfQ0hBTkdFX0RFVkZMQUdTOgotCWNhc2UgT0NUTkVUX0NNRF9TRVRfTVVMVElfTElTVDoKLQkJYnJlYWs7Ci0KLQljYXNlIE9DVE5FVF9DTURfQ0hBTkdFX01BQ0FERFI6Ci0JCW1hYyA9ICgodTggKikmbmN0cmwtPnVkZFswXSkgKyAyOwotCQluZXRpZl9pbmZvKGxpbywgcHJvYmUsIGxpby0+bmV0ZGV2LAotCQkJICAgIiVzICUyLjJ4OiUyLjJ4OiUyLjJ4OiUyLjJ4OiUyLjJ4OiUyLjJ4XG4iLAotCQkJICAgIk1BQ0FkZHIgY2hhbmdlZCB0byIsIG1hY1swXSwgbWFjWzFdLAotCQkJICAgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE9DVE5FVF9DTURfQ0hBTkdFX01UVToKLQkJLyogSWYgY29tbWFuZCBpcyBzdWNjZXNzZnVsLCBjaGFuZ2UgdGhlIE1UVS4gKi8KLQkJbmV0aWZfaW5mbyhsaW8sIHByb2JlLCBsaW8tPm5ldGRldiwgIiBNVFUgQ2hhbmdlZCBmcm9tICVkIHRvICVkXG4iLAotCQkJICAgbmV0ZGV2LT5tdHUsIG5jdHJsLT5uY21kLnMucGFyYW0xKTsKLQkJZGV2X2luZm8oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMgTVRVIENoYW5nZWQgZnJvbSAlZCB0byAlZFxuIiwKLQkJCSBuZXRkZXYtPm5hbWUsIG5ldGRldi0+bXR1LAotCQkJIG5jdHJsLT5uY21kLnMucGFyYW0xKTsKLQkJcnRubF9sb2NrKCk7Ci0JCW5ldGRldi0+bXR1ID0gbmN0cmwtPm5jbWQucy5wYXJhbTE7Ci0JCWNhbGxfbmV0ZGV2aWNlX25vdGlmaWVycyhORVRERVZfQ0hBTkdFTVRVLCBuZXRkZXYpOwotCQlydG5sX3VubG9jaygpOwotCQlicmVhazsKLQotCWNhc2UgT0NUTkVUX0NNRF9HUElPX0FDQ0VTUzoKLQkJbmV0aWZfaW5mbyhsaW8sIHByb2JlLCBsaW8tPm5ldGRldiwgIkxFRCBGbGFzaGluZyB2aXN1YWwgaWRlbnRpZmljYXRpb25cbiIpOwotCi0JCWJyZWFrOwotCi0JY2FzZSBPQ1RORVRfQ01EX0xST19FTkFCTEU6Ci0JCWRldl9pbmZvKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzIExSTyBFbmFibGVkXG4iLCBuZXRkZXYtPm5hbWUpOwotCQlicmVhazsKLQotCWNhc2UgT0NUTkVUX0NNRF9MUk9fRElTQUJMRToKLQkJZGV2X2luZm8oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMgTFJPIERpc2FibGVkXG4iLAotCQkJIG5ldGRldi0+bmFtZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBPQ1RORVRfQ01EX1ZFUkJPU0VfRU5BQkxFOgotCQlkZXZfaW5mbygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyBMUk8gRW5hYmxlZFxuIiwgbmV0ZGV2LT5uYW1lKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE9DVE5FVF9DTURfVkVSQk9TRV9ESVNBQkxFOgotCQlkZXZfaW5mbygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyBMUk8gRGlzYWJsZWRcbiIsCi0JCQkgbmV0ZGV2LT5uYW1lKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE9DVE5FVF9DTURfRU5BQkxFX1ZMQU5fRklMVEVSOgotCQlkZXZfaW5mbygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyBWTEFOIGZpbHRlciBlbmFibGVkXG4iLAotCQkJIG5ldGRldi0+bmFtZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBPQ1RORVRfQ01EX0FERF9WTEFOX0ZJTFRFUjoKLQkJZGV2X2luZm8oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMgVkxBTiBmaWx0ZXIgJWQgYWRkZWRcbiIsCi0JCQkgbmV0ZGV2LT5uYW1lLCBuY3RybC0+bmNtZC5zLnBhcmFtMSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBPQ1RORVRfQ01EX0RFTF9WTEFOX0ZJTFRFUjoKLQkJZGV2X2luZm8oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMgVkxBTiBmaWx0ZXIgJWQgcmVtb3ZlZFxuIiwKLQkJCSBuZXRkZXYtPm5hbWUsIG5jdHJsLT5uY21kLnMucGFyYW0xKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE9DVE5FVF9DTURfU0VUX1NFVFRJTkdTOgotCQlkZXZfaW5mbygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyBzZXR0aW5ncyBjaGFuZ2VkXG4iLAotCQkJIG5ldGRldi0+bmFtZSk7Ci0KLQkJYnJlYWs7Ci0JCS8qIENhc2UgdG8gaGFuZGxlICJPQ1RORVRfQ01EX1ROTF9SWF9DU1VNX0NUTCIKLQkJICogQ29tbWFuZCBwYXNzZWQgYnkgTklDIGRyaXZlcgotCQkgKi8KLQljYXNlIE9DVE5FVF9DTURfVE5MX1JYX0NTVU1fQ1RMOgotCQlpZiAobmN0cmwtPm5jbWQucy5wYXJhbTEgPT0gT0NUTkVUX0NNRF9SWENTVU1fRU5BQkxFKSB7Ci0JCQluZXRpZl9pbmZvKGxpbywgcHJvYmUsIGxpby0+bmV0ZGV2LAotCQkJCSAgICIlcyBSWCBDaGVja3N1bSBPZmZsb2FkIEVuYWJsZWRcbiIsCi0JCQkJICAgbmV0ZGV2LT5uYW1lKTsKLQkJfSBlbHNlIGlmIChuY3RybC0+bmNtZC5zLnBhcmFtMSA9PQotCQkJICAgT0NUTkVUX0NNRF9SWENTVU1fRElTQUJMRSkgewotCQkJbmV0aWZfaW5mbyhsaW8sIHByb2JlLCBsaW8tPm5ldGRldiwKLQkJCQkgICAiJXMgUlggQ2hlY2tzdW0gT2ZmbG9hZCBEaXNhYmxlZFxuIiwKLQkJCQkgICBuZXRkZXYtPm5hbWUpOwotCQl9Ci0JCWJyZWFrOwotCi0JCS8qIENhc2UgdG8gaGFuZGxlICJPQ1RORVRfQ01EX1ROTF9UWF9DU1VNX0NUTCIKLQkJICogQ29tbWFuZCBwYXNzZWQgYnkgTklDIGRyaXZlcgotCQkgKi8KLQljYXNlIE9DVE5FVF9DTURfVE5MX1RYX0NTVU1fQ1RMOgotCQlpZiAobmN0cmwtPm5jbWQucy5wYXJhbTEgPT0gT0NUTkVUX0NNRF9UWENTVU1fRU5BQkxFKSB7Ci0JCQluZXRpZl9pbmZvKGxpbywgcHJvYmUsIGxpby0+bmV0ZGV2LAotCQkJCSAgICIlcyBUWCBDaGVja3N1bSBPZmZsb2FkIEVuYWJsZWRcbiIsCi0JCQkJICAgbmV0ZGV2LT5uYW1lKTsKLQkJfSBlbHNlIGlmIChuY3RybC0+bmNtZC5zLnBhcmFtMSA9PQotCQkJICAgT0NUTkVUX0NNRF9UWENTVU1fRElTQUJMRSkgewotCQkJbmV0aWZfaW5mbyhsaW8sIHByb2JlLCBsaW8tPm5ldGRldiwKLQkJCQkgICAiJXMgVFggQ2hlY2tzdW0gT2ZmbG9hZCBEaXNhYmxlZFxuIiwKLQkJCQkgICBuZXRkZXYtPm5hbWUpOwotCQl9Ci0JCWJyZWFrOwotCi0JCS8qIENhc2UgdG8gaGFuZGxlICJPQ1RORVRfQ01EX1ZYTEFOX1BPUlRfQ09ORklHIgotCQkgKiBDb21tYW5kIHBhc3NlZCBieSBOSUMgZHJpdmVyCi0JCSAqLwotCWNhc2UgT0NUTkVUX0NNRF9WWExBTl9QT1JUX0NPTkZJRzoKLQkJaWYgKG5jdHJsLT5uY21kLnMubW9yZSA9PSBPQ1RORVRfQ01EX1ZYTEFOX1BPUlRfQUREKSB7Ci0JCQluZXRpZl9pbmZvKGxpbywgcHJvYmUsIGxpby0+bmV0ZGV2LAotCQkJCSAgICIlcyBWeExBTiBEZXN0aW5hdGlvbiBVRFAgUE9SVDolZCBBRERFRFxuIiwKLQkJCQkgICBuZXRkZXYtPm5hbWUsCi0JCQkJICAgbmN0cmwtPm5jbWQucy5wYXJhbTEpOwotCQl9IGVsc2UgaWYgKG5jdHJsLT5uY21kLnMubW9yZSA9PQotCQkJICAgT0NUTkVUX0NNRF9WWExBTl9QT1JUX0RFTCkgewotCQkJbmV0aWZfaW5mbyhsaW8sIHByb2JlLCBsaW8tPm5ldGRldiwKLQkJCQkgICAiJXMgVnhMQU4gRGVzdGluYXRpb24gVURQIFBPUlQ6JWQgREVMRVRFRFxuIiwKLQkJCQkgICBuZXRkZXYtPm5hbWUsCi0JCQkJICAgbmN0cmwtPm5jbWQucy5wYXJhbTEpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBPQ1RORVRfQ01EX1NFVF9GTE9XX0NUTDoKLQkJbmV0aWZfaW5mbyhsaW8sIHByb2JlLCBsaW8tPm5ldGRldiwgIlNldCBSWC9UWCBmbG93IGNvbnRyb2wgcGFyYW1ldGVyc1xuIik7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyBVbmtub3duIGNtZCAlZFxuIiwgX19mdW5jX18sCi0JCQluY3RybC0+bmNtZC5zLmNtZCk7Ci0JfQotfQotCiAvKioKICAqIFxicmllZiBDb252ZXJ0cyBhIG1hc2sgYmFzZWQgb24gbmV0IGRldmljZSBmbGFncwogICogQHBhcmFtIG5ldGRldiBuZXR3b3JrIGRldmljZQpAQCAtMjgxNyw4ICszMDI0LDcgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgc2VuZF9uaWNfdGltZXN0YW1wX3BrdChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LAogCQkJCQkgc3RydWN0IG9jdG5pY19kYXRhX3BrdCAqbmRhdGEsCi0JCQkJCSBzdHJ1Y3Qgb2N0bmV0X2J1Zl9mcmVlX2luZm8gKmZpbmZvLAotCQkJCQkgaW50IHhtaXRfbW9yZSkKKwkJCQkJIHN0cnVjdCBvY3RuZXRfYnVmX2ZyZWVfaW5mbyAqZmluZm8pCiB7CiAJaW50IHJldHZhbDsKIAlzdHJ1Y3Qgb2N0ZW9uX3NvZnRfY29tbWFuZCAqc2M7CkBAIC0yODQ2LDkgKzMwNTIsMTUgQEAKIAlzYy0+Y2FsbGJhY2tfYXJnID0gZmluZm8tPnNrYjsKIAlzYy0+aXFfbm8gPSBuZGF0YS0+cV9ubzsKIAotCWxlbiA9ICh1MzIpKChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2loMiAqKSgmc2MtPmNtZC5jbWQyLmloMikpLT5kbGVuZ3N6OworCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkpCisJCWxlbiA9ICh1MzIpKChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2loMyAqKQorCQkJICAgICgmc2MtPmNtZC5jbWQzLmloMykpLT5kbGVuZ3N6OworCWVsc2UKKwkJbGVuID0gKHUzMikoKHN0cnVjdCBvY3Rlb25faW5zdHJfaWgyICopCisJCQkgICAgKCZzYy0+Y21kLmNtZDIuaWgyKSktPmRsZW5nc3o7CiAKLQlyaW5nX2Rvb3JiZWxsID0gIXhtaXRfbW9yZTsKKwlyaW5nX2Rvb3JiZWxsID0gMTsKKwogCXJldHZhbCA9IG9jdGVvbl9zZW5kX2NvbW1hbmQob2N0LCBzYy0+aXFfbm8sIHJpbmdfZG9vcmJlbGwsICZzYy0+Y21kLAogCQkJCSAgICAgc2MsIGxlbiwgbmRhdGEtPnJlcXR5cGUpOwogCkBAIC0yODgxLDcgKzMwOTMsNyBAQAogCXVuaW9uIHR4X2luZm8gKnR4X2luZm87CiAJaW50IHN0YXR1cyA9IDA7CiAJaW50IHFfaWR4ID0gMCwgaXFfbm8gPSAwOwotCWludCB4bWl0X21vcmUsIGo7CisJaW50IGo7CiAJdTY0IGRwdHIgPSAwOwogCXUzMiB0YWcgPSAwOwogCkBAIC0yOTgwLDcgKzMxOTIsMTAgQEAKIAkJCXJldHVybiBORVRERVZfVFhfQlVTWTsKIAkJfQogCi0JCW5kYXRhLmNtZC5jbWQyLmRwdHIgPSBkcHRyOworCQlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpKQorCQkJbmRhdGEuY21kLmNtZDMuZHB0ciA9IGRwdHI7CisJCWVsc2UKKwkJCW5kYXRhLmNtZC5jbWQyLmRwdHIgPSBkcHRyOwogCQlmaW5mby0+ZHB0ciA9IGRwdHI7CiAJCW5kYXRhLnJlcXR5cGUgPSBSRVFUWVBFX05PUkVTUF9ORVQ7CiAKQEAgLTMwNTUsMTUgKzMyNzAsMjMgQEAKIAkJCQkJICAgZy0+c2dfc2l6ZSwgRE1BX1RPX0RFVklDRSk7CiAJCWRwdHIgPSBnLT5zZ19kbWFfcHRyOwogCi0JCW5kYXRhLmNtZC5jbWQyLmRwdHIgPSBkcHRyOworCQlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpKQorCQkJbmRhdGEuY21kLmNtZDMuZHB0ciA9IGRwdHI7CisJCWVsc2UKKwkJCW5kYXRhLmNtZC5jbWQyLmRwdHIgPSBkcHRyOwogCQlmaW5mby0+ZHB0ciA9IGRwdHI7CiAJCWZpbmZvLT5nID0gZzsKIAogCQluZGF0YS5yZXF0eXBlID0gUkVRVFlQRV9OT1JFU1BfTkVUX1NHOwogCX0KIAotCWlyaCA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2lyaCAqKSZuZGF0YS5jbWQuY21kMi5pcmg7Ci0JdHhfaW5mbyA9ICh1bmlvbiB0eF9pbmZvICopJm5kYXRhLmNtZC5jbWQyLm9zc3BbMF07CisJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSkgeworCQlpcmggPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9pcmggKikmbmRhdGEuY21kLmNtZDMuaXJoOworCQl0eF9pbmZvID0gKHVuaW9uIHR4X2luZm8gKikmbmRhdGEuY21kLmNtZDMub3NzcFswXTsKKwl9IGVsc2UgeworCQlpcmggPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9pcmggKikmbmRhdGEuY21kLmNtZDIuaXJoOworCQl0eF9pbmZvID0gKHVuaW9uIHR4X2luZm8gKikmbmRhdGEuY21kLmNtZDIub3NzcFswXTsKKwl9CiAKIAlpZiAoc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkgewogCQl0eF9pbmZvLT5zLmdzb19zaXplID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKQEAgLTMwNzcsMTIgKzMzMDAsMTAgQEAKIAkJaXJoLT52bGFuID0gc2tiX3ZsYW5fdGFnX2dldChza2IpICYgMHhmZmY7CiAJfQogCi0JeG1pdF9tb3JlID0gc2tiLT54bWl0X21vcmU7Ci0KIAlpZiAodW5saWtlbHkoY21kc2V0dXAucy50aW1lc3RhbXApKQotCQlzdGF0dXMgPSBzZW5kX25pY190aW1lc3RhbXBfcGt0KG9jdCwgJm5kYXRhLCBmaW5mbywgeG1pdF9tb3JlKTsKKwkJc3RhdHVzID0gc2VuZF9uaWNfdGltZXN0YW1wX3BrdChvY3QsICZuZGF0YSwgZmluZm8pOwogCWVsc2UKLQkJc3RhdHVzID0gb2N0bmV0X3NlbmRfbmljX2RhdGFfcGt0KG9jdCwgJm5kYXRhLCB4bWl0X21vcmUpOworCQlzdGF0dXMgPSBvY3RuZXRfc2VuZF9uaWNfZGF0YV9wa3Qob2N0LCAmbmRhdGEpOwogCWlmIChzdGF0dXMgPT0gSVFfU0VORF9GQUlMRUQpCiAJCWdvdG8gbGlvX3htaXRfZmFpbGVkOwogCkBAIC0zMTkwLDggKzM0MTEsOCBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ1RORVRfQ01EX1JYQ1NVTV9ESVNBQkxFCiAgKiBAcmV0dXJucyAgICAgICAgICAgICAgICAgICAgIFNVQ0NFU1Mgb3IgRkFJTFVSRQogICovCi1pbnQgbGlxdWlkaW9fc2V0X3J4Y3N1bV9jb21tYW5kKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBjb21tYW5kLAotCQkJCXU4IHJ4X2NtZCkKK3N0YXRpYyBpbnQgbGlxdWlkaW9fc2V0X3J4Y3N1bV9jb21tYW5kKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBjb21tYW5kLAorCQkJCSAgICAgICB1OCByeF9jbWQpCiB7CiAJc3RydWN0IGxpbyAqbGlvID0gR0VUX0xJTyhuZXRkZXYpOwogCXN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QgPSBsaW8tPm9jdF9kZXY7CkBAIC0zMjQ5LDMxICszNDcwLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgbGlxdWlkaW9fc2V0X2ZlYXR1cmUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IGNtZCwgdTE2IHBhcmFtMSkKLXsKLQlzdHJ1Y3QgbGlvICpsaW8gPSBHRVRfTElPKG5ldGRldik7Ci0Jc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCA9IGxpby0+b2N0X2RldjsKLQlzdHJ1Y3Qgb2N0bmljX2N0cmxfcGt0IG5jdHJsOwotCWludCByZXQgPSAwOwotCi0JbWVtc2V0KCZuY3RybCwgMCwgc2l6ZW9mKHN0cnVjdCBvY3RuaWNfY3RybF9wa3QpKTsKLQotCW5jdHJsLm5jbWQudTY0ID0gMDsKLQluY3RybC5uY21kLnMuY21kID0gY21kOwotCW5jdHJsLm5jbWQucy5wYXJhbTEgPSBwYXJhbTE7Ci0JbmN0cmwuaXFfbm8gPSBsaW8tPmxpbmZvLnR4cGNpcVswXS5zLnFfbm87Ci0JbmN0cmwud2FpdF90aW1lID0gMTAwOwotCW5jdHJsLm5ldHBuZGV2ID0gKHU2NCluZXRkZXY7Ci0JbmN0cmwuY2JfZm4gPSBsaXF1aWRpb19saW5rX2N0cmxfY21kX2NvbXBsZXRpb247Ci0KLQlyZXQgPSBvY3RuZXRfc2VuZF9uaWNfY3RybF9wa3QobGlvLT5vY3RfZGV2LCAmbmN0cmwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiRmVhdHVyZSBjaGFuZ2UgZmFpbGVkIGluIGNvcmUgKHJldDogMHgleClcbiIsCi0JCQlyZXQpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCiAvKiogXGJyaWVmIE5ldCBkZXZpY2UgZml4IGZlYXR1cmVzCiAgKiBAcGFyYW0gbmV0ZGV2ICBwb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlCiAgKiBAcGFyYW0gcmVxdWVzdCBmZWF0dXJlcyByZXF1ZXN0ZWQKQEAgLTM0OTIsOCArMzY4OCw5IEBACiAJdW5pb24gb2N0X25pY19pZl9jZmcgaWZfY2ZnOwogCXVuc2lnbmVkIGludCBiYXNlX3F1ZXVlOwogCXVuc2lnbmVkIGludCBnbXhfcG9ydF9pZDsKLQl1MzIgcmVzcF9zaXplLCBjdHhfc2l6ZTsKKwl1MzIgcmVzcF9zaXplLCBjdHhfc2l6ZSwgZGF0YV9zaXplOwogCXUzMiBpZmlkeF9vcl9wZm51bTsKKwlzdHJ1Y3QgbGlvX3ZlcnNpb24gKnZkYXRhOwogCiAJLyogVGhpcyBpcyB0byBoYW5kbGUgbGluayBzdGF0dXMgY2hhbmdlcyAqLwogCW9jdGVvbl9yZWdpc3Rlcl9kaXNwYXRjaF9mbihvY3Rlb25fZGV2LCBPUENPREVfTklDLApAQCAtMzUxNSwyMSArMzcxMiwzNyBAQAogCWZvciAoaSA9IDA7IGkgPCBvY3Rlb25fZGV2LT5pZmNvdW50OyBpKyspIHsKIAkJcmVzcF9zaXplID0gc2l6ZW9mKHN0cnVjdCBsaXF1aWRpb19pZl9jZmdfcmVzcCk7CiAJCWN0eF9zaXplID0gc2l6ZW9mKHN0cnVjdCBsaXF1aWRpb19pZl9jZmdfY29udGV4dCk7CisJCWRhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbGlvX3ZlcnNpb24pOwogCQlzYyA9IChzdHJ1Y3Qgb2N0ZW9uX3NvZnRfY29tbWFuZCAqKQotCQkJb2N0ZW9uX2FsbG9jX3NvZnRfY29tbWFuZChvY3Rlb25fZGV2LCAwLAorCQkJb2N0ZW9uX2FsbG9jX3NvZnRfY29tbWFuZChvY3Rlb25fZGV2LCBkYXRhX3NpemUsCiAJCQkJCQkgIHJlc3Bfc2l6ZSwgY3R4X3NpemUpOwogCQlyZXNwID0gKHN0cnVjdCBsaXF1aWRpb19pZl9jZmdfcmVzcCAqKXNjLT52aXJ0cnB0cjsKIAkJY3R4ICA9IChzdHJ1Y3QgbGlxdWlkaW9faWZfY2ZnX2NvbnRleHQgKilzYy0+Y3R4cHRyOworCQl2ZGF0YSA9IChzdHJ1Y3QgbGlvX3ZlcnNpb24gKilzYy0+dmlydGRwdHI7CiAKLQkJbnVtX2lxdWV1ZXMgPQotCQkJQ0ZHX0dFVF9OVU1fVFhRU19OSUNfSUYob2N0ZW9uX2dldF9jb25mKG9jdGVvbl9kZXYpLCBpKTsKLQkJbnVtX29xdWV1ZXMgPQotCQkJQ0ZHX0dFVF9OVU1fUlhRU19OSUNfSUYob2N0ZW9uX2dldF9jb25mKG9jdGVvbl9kZXYpLCBpKTsKLQkJYmFzZV9xdWV1ZSA9Ci0JCQlDRkdfR0VUX0JBU0VfUVVFX05JQ19JRihvY3Rlb25fZ2V0X2NvbmYob2N0ZW9uX2RldiksIGkpOwotCQlnbXhfcG9ydF9pZCA9Ci0JCQlDRkdfR0VUX0dNWElEX05JQ19JRihvY3Rlb25fZ2V0X2NvbmYob2N0ZW9uX2RldiksIGkpOwotCQlpZmlkeF9vcl9wZm51bSA9IGk7CisJCSooKHU2NCAqKXZkYXRhKSA9IDA7CisJCXZkYXRhLT5tYWpvciA9IGNwdV90b19iZTE2KExJUVVJRElPX0JBU0VfTUFKT1JfVkVSU0lPTik7CisJCXZkYXRhLT5taW5vciA9IGNwdV90b19iZTE2KExJUVVJRElPX0JBU0VfTUlOT1JfVkVSU0lPTik7CisJCXZkYXRhLT5taWNybyA9IGNwdV90b19iZTE2KExJUVVJRElPX0JBU0VfTUlDUk9fVkVSU0lPTik7CisKKwkJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0ZW9uX2RldikpIHsKKwkJCW51bV9pcXVldWVzID0gb2N0ZW9uX2Rldi0+c3Jpb3ZfaW5mby5udW1fcGZfcmluZ3M7CisJCQludW1fb3F1ZXVlcyA9IG9jdGVvbl9kZXYtPnNyaW92X2luZm8ubnVtX3BmX3JpbmdzOworCQkJYmFzZV9xdWV1ZSA9IG9jdGVvbl9kZXYtPnNyaW92X2luZm8ucGZfc3JuOworCisJCQlnbXhfcG9ydF9pZCA9IG9jdGVvbl9kZXYtPnBmX251bTsKKwkJCWlmaWR4X29yX3BmbnVtID0gb2N0ZW9uX2Rldi0+cGZfbnVtOworCQl9IGVsc2UgeworCQkJbnVtX2lxdWV1ZXMgPSBDRkdfR0VUX05VTV9UWFFTX05JQ19JRigKKwkJCQkJCW9jdGVvbl9nZXRfY29uZihvY3Rlb25fZGV2KSwgaSk7CisJCQludW1fb3F1ZXVlcyA9IENGR19HRVRfTlVNX1JYUVNfTklDX0lGKAorCQkJCQkJb2N0ZW9uX2dldF9jb25mKG9jdGVvbl9kZXYpLCBpKTsKKwkJCWJhc2VfcXVldWUgPSBDRkdfR0VUX0JBU0VfUVVFX05JQ19JRigKKwkJCQkJCW9jdGVvbl9nZXRfY29uZihvY3Rlb25fZGV2KSwgaSk7CisJCQlnbXhfcG9ydF9pZCA9IENGR19HRVRfR01YSURfTklDX0lGKAorCQkJCQkJb2N0ZW9uX2dldF9jb25mKG9jdGVvbl9kZXYpLCBpKTsKKwkJCWlmaWR4X29yX3BmbnVtID0gaTsKKwkJfQogCiAJCWRldl9kYmcoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwKIAkJCSJyZXF1ZXN0aW5nIGNvbmZpZyBmb3IgaW50ZXJmYWNlICVkLCBpcXMgJWQsIG9xcyAlZFxuIiwKQEAgLTM1NjYsNyArMzc3OSwxMSBAQAogCQkvKiBTbGVlcCBvbiBhIHdhaXQgcXVldWUgdGlsbCB0aGUgY29uZCBmbGFnIGluZGljYXRlcyB0aGF0IHRoZQogCQkgKiByZXNwb25zZSBhcnJpdmVkIG9yIHRpbWVkLW91dC4KIAkJICovCi0JCXNsZWVwX2NvbmQoJmN0eC0+d2MsICZjdHgtPmNvbmQpOworCQlpZiAoc2xlZXBfY29uZCgmY3R4LT53YywgJmN0eC0+Y29uZCkgPT0gLUVJTlRSKSB7CisJCQlkZXZfZXJyKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsICJXYWl0IGludGVycnVwdGVkXG4iKTsKKwkJCWdvdG8gc2V0dXBfbmljX3dhaXRfaW50cjsKKwkJfQorCiAJCXJldHZhbCA9IHJlc3AtPnN0YXR1czsKIAkJaWYgKHJldHZhbCkgewogCQkJZGV2X2Vycigmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LCAiaXEvb3EgY29uZmlnIGZhaWxlZFxuIik7CkBAIC0zNjMzLDEyICszODUwLDE2IEBACiAKIAkJbGlvLT5tc2dfZW5hYmxlID0gbmV0aWZfbXNnX2luaXQoZGVidWcsIERFRkFVTFRfTVNHX0VOQUJMRSk7CiAKLQkJbGlvLT5kZXZfY2FwYWJpbGl0eSA9IE5FVElGX0ZfSElHSERNQQotCQkJCXwgTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9JUFY2X0NTVU0KLQkJCQl8IE5FVElGX0ZfU0cgfCBORVRJRl9GX1JYQ1NVTQotCQkJCXwgTkVUSUZfRl9HUk8KLQkJCQl8IE5FVElGX0ZfVFNPIHwgTkVUSUZfRl9UU082Ci0JCQkJfCBORVRJRl9GX0xSTzsKKwkJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0ZW9uX2RldikgfHwKKwkJICAgIE9DVEVPTl9DTjZYWFgob2N0ZW9uX2RldikpIHsKKwkJCWxpby0+ZGV2X2NhcGFiaWxpdHkgPSBORVRJRl9GX0hJR0hETUEKKwkJCQkJICAgICAgfCBORVRJRl9GX0lQX0NTVU0KKwkJCQkJICAgICAgfCBORVRJRl9GX0lQVjZfQ1NVTQorCQkJCQkgICAgICB8IE5FVElGX0ZfU0cgfCBORVRJRl9GX1JYQ1NVTQorCQkJCQkgICAgICB8IE5FVElGX0ZfR1JPCisJCQkJCSAgICAgIHwgTkVUSUZfRl9UU08gfCBORVRJRl9GX1RTTzYKKwkJCQkJICAgICAgfCBORVRJRl9GX0xSTzsKKwkJfQogCQluZXRpZl9zZXRfZ3NvX21heF9zaXplKG5ldGRldiwgT0NUTklDX0dTT19NQVhfU0laRSk7CiAKIAkJLyogIENvcHkgb2YgdHJhbnNtaXQgZW5jYXBzdWxhdGlvbiBjYXBhYmlsaXRpZXM6CkBAIC0zNzEzLDcgKzM5MzQsMTAgQEAKIAogCQkvKiBSZWdpc3RlciBldGh0b29sIHN1cHBvcnQgKi8KIAkJbGlxdWlkaW9fc2V0X2V0aHRvb2xfb3BzKG5ldGRldik7Ci0JCW9jdGVvbl9kZXYtPnByaXZfZmxhZ3MgPSAweDA7CisJCWlmIChsaW8tPm9jdF9kZXYtPmNoaXBfaWQgPT0gT0NURU9OX0NOMjNYWF9QRl9WSUQpCisJCQlvY3Rlb25fZGV2LT5wcml2X2ZsYWdzID0gT0NUX1BSSVZfRkxBR19ERUZBVUxUOworCQllbHNlCisJCQlvY3Rlb25fZGV2LT5wcml2X2ZsYWdzID0gMHgwOwogCiAJCWlmIChuZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9MUk8pCiAJCQlsaXF1aWRpb19zZXRfZmVhdHVyZShuZXRkZXYsIE9DVE5FVF9DTURfTFJPX0VOQUJMRSwKQEAgLTM3MjUsNiArMzk0OSw5IEBACiAJCQlsaXF1aWRpb19zZXRfZmVhdHVyZShuZXRkZXYsCiAJCQkJCSAgICAgT0NUTkVUX0NNRF9WRVJCT1NFX0VOQUJMRSwgMCk7CiAKKwkJaWYgKHNldHVwX2xpbmtfc3RhdHVzX2NoYW5nZV93cShuZXRkZXYpKQorCQkJZ290byBzZXR1cF9uaWNfZGV2X2ZhaWw7CisKIAkJLyogUmVnaXN0ZXIgdGhlIG5ldHdvcmsgZGV2aWNlIHdpdGggdGhlIE9TICovCiAJCWlmIChyZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KSkgewogCQkJZGV2X2Vycigmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LCAiRGV2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOwpAQCAtMzc2MCw2ICszOTg3LDggQEAKIAogCW9jdGVvbl9mcmVlX3NvZnRfY29tbWFuZChvY3Rlb25fZGV2LCBzYyk7CiAKK3NldHVwX25pY193YWl0X2ludHI6CisKIAl3aGlsZSAoaS0tKSB7CiAJCWRldl9lcnIoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwKIAkJCSJOSUMgaWZpZHg6JWQgU2V0dXAgZmFpbGVkXG4iLCBpKTsKQEAgLTM3ODksOCArNDAxOCw3IEBACiAJLyogcnVuIHBvcnRfY29uZmlnIGNvbW1hbmQgZm9yIGVhY2ggcG9ydCAqLwogCW9jdC0+aWZjb3VudCA9IG51bV9uaWNfcG9ydHM7CiAKLQltZW1zZXQob2N0LT5wcm9wcywgMCwKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCBvY3RkZXZfcHJvcHMpICogbnVtX25pY19wb3J0cyk7CisJbWVtc2V0KG9jdC0+cHJvcHMsIDAsIHNpemVvZihzdHJ1Y3Qgb2N0ZGV2X3Byb3BzKSAqIG51bV9uaWNfcG9ydHMpOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9PQ1RFT05fTElOS1M7IGkrKykKIAkJb2N0LT5wcm9wc1tpXS5nbXhwb3J0ID0gLTE7CkBAIC0zODA2LDcgKzQwMzQsNyBAQAogCS8qIEluaXRpYWxpemUgaW50ZXJydXB0IG1vZGVyYXRpb24gcGFyYW1zICovCiAJaW50cm1vZF9jZmcgPSAmKChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqKW9jdCktPmludHJtb2Q7CiAJaW50cm1vZF9jZmctPnJ4X2VuYWJsZSA9IDE7Ci0JaW50cm1vZF9jZmctPmNoZWNrX2ludHJ2bCA9ICAgTElPX0lOVFJNT0RfQ0hFQ0tfSU5URVJWQUw7CisJaW50cm1vZF9jZmctPmNoZWNrX2ludHJ2bCA9IExJT19JTlRSTU9EX0NIRUNLX0lOVEVSVkFMOwogCWludHJtb2RfY2ZnLT5tYXhwa3RfcmF0ZXRociA9IExJT19JTlRSTU9EX01BWFBLVF9SQVRFVEhSOwogCWludHJtb2RfY2ZnLT5taW5wa3RfcmF0ZXRociA9IExJT19JTlRSTU9EX01JTlBLVF9SQVRFVEhSOwogCWludHJtb2RfY2ZnLT5yeF9tYXhjbnRfdHJpZ2dlciA9IExJT19JTlRSTU9EX1JYTUFYQ05UX1RSSUdHRVI7CkBAIC0zODE4LDYgKzQwNDYsNyBAQAogCWludHJtb2RfY2ZnLT50eF9taW5jbnRfdHJpZ2dlciA9IExJT19JTlRSTU9EX1RYTUlOQ05UX1RSSUdHRVI7CiAJaW50cm1vZF9jZmctPnJ4X2ZyYW1lcyA9IENGR19HRVRfT1FfSU5UUl9QS1Qob2N0ZW9uX2dldF9jb25mKG9jdCkpOwogCWludHJtb2RfY2ZnLT5yeF91c2VjcyA9IENGR19HRVRfT1FfSU5UUl9USU1FKG9jdGVvbl9nZXRfY29uZihvY3QpKTsKKwlpbnRybW9kX2NmZy0+dHhfZnJhbWVzID0gQ0ZHX0dFVF9JUV9JTlRSX1BLVChvY3Rlb25fZ2V0X2NvbmYob2N0KSk7CiAJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICJOZXR3b3JrIGludGVyZmFjZXMgcmVhZHlcbiIpOwogCiAJcmV0dXJuIHJldHZhbDsKQEAgLTM4ODAsNiArNDEwOSw3IEBACiBzdGF0aWMgaW50IG9jdGVvbl9kZXZpY2VfaW5pdChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0ZW9uX2RldikKIHsKIAlpbnQgaiwgcmV0OworCWludCBmd19sb2FkZWQgPSAwOwogCWNoYXIgYm9vdGNtZFtdID0gIlxuIjsKIAlzdHJ1Y3Qgb2N0ZW9uX2RldmljZV9wcml2ICpvY3RfcHJpdiA9CiAJCShzdHJ1Y3Qgb2N0ZW9uX2RldmljZV9wcml2ICopb2N0ZW9uX2Rldi0+cHJpdjsKQEAgLTM5MDEsOSArNDEzMSwyMyBAQAogCiAJb2N0ZW9uX2Rldi0+YXBwX21vZGUgPSBDVk1fRFJWX0lOVkFMSURfQVBQOwogCi0JLyogRG8gYSBzb2Z0IHJlc2V0IG9mIHRoZSBPY3Rlb24gZGV2aWNlLiAqLwotCWlmIChvY3Rlb25fZGV2LT5mbl9saXN0LnNvZnRfcmVzZXQob2N0ZW9uX2RldikpCisJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0ZW9uX2RldikpIHsKKwkJaWYgKCFjbjIzeHhfZndfbG9hZGVkKG9jdGVvbl9kZXYpKSB7CisJCQlmd19sb2FkZWQgPSAwOworCQkJLyogRG8gYSBzb2Z0IHJlc2V0IG9mIHRoZSBPY3Rlb24gZGV2aWNlLiAqLworCQkJaWYgKG9jdGVvbl9kZXYtPmZuX2xpc3Quc29mdF9yZXNldChvY3Rlb25fZGV2KSkKKwkJCQlyZXR1cm4gMTsKKwkJCS8qIHRoaW5ncyBtaWdodCBoYXZlIGNoYW5nZWQgKi8KKwkJCWlmICghY24yM3h4X2Z3X2xvYWRlZChvY3Rlb25fZGV2KSkKKwkJCQlmd19sb2FkZWQgPSAwOworCQkJZWxzZQorCQkJCWZ3X2xvYWRlZCA9IDE7CisJCX0gZWxzZSB7CisJCQlmd19sb2FkZWQgPSAxOworCQl9CisJfSBlbHNlIGlmIChvY3Rlb25fZGV2LT5mbl9saXN0LnNvZnRfcmVzZXQob2N0ZW9uX2RldikpIHsKIAkJcmV0dXJuIDE7CisJfQogCiAJLyogSW5pdGlhbGl6ZSB0aGUgZGlzcGF0Y2ggbWVjaGFuaXNtIHVzZWQgdG8gcHVzaCBwYWNrZXRzIGFycml2aW5nIG9uCiAJICogT2N0ZW9uIE91dHB1dCBxdWV1ZXMuCkBAIC0zOTI1LDYgKzQxNjksMjIgQEAKIAogCW9jdGVvbl9zZXRfaW9fcXVldWVzX29mZihvY3Rlb25fZGV2KTsKIAorCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdGVvbl9kZXYpKSB7CisJCXJldCA9IG9jdGVvbl9kZXYtPmZuX2xpc3Quc2V0dXBfZGV2aWNlX3JlZ3Mob2N0ZW9uX2Rldik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwgIk9DVEVPTjogRmFpbGVkIHRvIGNvbmZpZ3VyZSBkZXZpY2UgcmVnaXN0ZXJzXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwkvKiBJbml0aWFsaXplIHNvZnQgY29tbWFuZCBidWZmZXIgcG9vbAorCSAqLworCWlmIChvY3Rlb25fc2V0dXBfc2NfYnVmZmVyX3Bvb2wob2N0ZW9uX2RldikpIHsKKwkJZGV2X2Vycigmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LCAic2MgYnVmZmVyIHBvb2wgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJYXRvbWljX3NldCgmb2N0ZW9uX2Rldi0+c3RhdHVzLCBPQ1RfREVWX1NDX0JVRkZfUE9PTF9JTklUX0RPTkUpOworCiAJLyogIFNldHVwIHRoZSBkYXRhIHN0cnVjdHVyZXMgdGhhdCBtYW5hZ2UgdGhpcyBPY3Rlb24ncyBJbnB1dCBxdWV1ZXMuICovCiAJaWYgKG9jdGVvbl9zZXR1cF9pbnN0cl9xdWV1ZXMob2N0ZW9uX2RldikpIHsKIAkJZGV2X2Vycigmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LApAQCAtMzkzNiwxNCArNDE5Niw2IEBACiAJfQogCWF0b21pY19zZXQoJm9jdGVvbl9kZXYtPnN0YXR1cywgT0NUX0RFVl9JTlNUUl9RVUVVRV9JTklUX0RPTkUpOwogCi0JLyogSW5pdGlhbGl6ZSBzb2Z0IGNvbW1hbmQgYnVmZmVyIHBvb2wKLQkgKi8KLQlpZiAob2N0ZW9uX3NldHVwX3NjX2J1ZmZlcl9wb29sKG9jdGVvbl9kZXYpKSB7Ci0JCWRldl9lcnIoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwgInNjIGJ1ZmZlciBwb29sIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWF0b21pY19zZXQoJm9jdGVvbl9kZXYtPnN0YXR1cywgT0NUX0RFVl9TQ19CVUZGX1BPT0xfSU5JVF9ET05FKTsKLQogCS8qIEluaXRpYWxpemUgbGlzdHMgdG8gbWFuYWdlIHRoZSByZXF1ZXN0cyBvZiBkaWZmZXJlbnQgdHlwZXMgdGhhdAogCSAqIGFycml2ZSBmcm9tIHVzZXIgJiBrZXJuZWwgYXBwbGljYXRpb25zIGZvciB0aGlzIG9jdGVvbiBkZXZpY2UuCiAJICovCkBAIC0zOTYzLDE1ICs0MjE1LDIzIEBACiAKIAlhdG9taWNfc2V0KCZvY3Rlb25fZGV2LT5zdGF0dXMsIE9DVF9ERVZfRFJPUV9JTklUX0RPTkUpOwogCi0JLyogVGhlIGlucHV0IGFuZCBvdXRwdXQgcXVldWUgcmVnaXN0ZXJzIHdlcmUgc2V0dXAgZWFybGllciAodGhlIHF1ZXVlcwotCSAqIHdlcmUgbm90IGVuYWJsZWQpLiBBbnkgYWRkaXRpb25hbCByZWdpc3RlcnMgdGhhdCBuZWVkIHRvIGJlCi0JICogcHJvZ3JhbW1lZCBzaG91bGQgYmUgZG9uZSBub3cuCi0JICovCi0JcmV0ID0gb2N0ZW9uX2Rldi0+Zm5fbGlzdC5zZXR1cF9kZXZpY2VfcmVncyhvY3Rlb25fZGV2KTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwKLQkJCSJGYWlsZWQgdG8gY29uZmlndXJlIGRldmljZSByZWdpc3RlcnNcbiIpOwotCQlyZXR1cm4gcmV0OworCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdGVvbl9kZXYpKSB7CisJCWlmIChvY3Rlb25fYWxsb2NhdGVfaW9xX3ZlY3RvcihvY3Rlb25fZGV2KSkgeworCQkJZGV2X2Vycigmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LCAiT0NURU9OOiBpb3EgdmVjdG9yIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisKKwl9IGVsc2UgeworCQkvKiBUaGUgaW5wdXQgYW5kIG91dHB1dCBxdWV1ZSByZWdpc3RlcnMgd2VyZSBzZXR1cCBlYXJsaWVyICh0aGUKKwkJICogcXVldWVzIHdlcmUgbm90IGVuYWJsZWQpLiBBbnkgYWRkaXRpb25hbCByZWdpc3RlcnMKKwkJICogdGhhdCBuZWVkIHRvIGJlIHByb2dyYW1tZWQgc2hvdWxkIGJlIGRvbmUgbm93LgorCQkgKi8KKwkJcmV0ID0gb2N0ZW9uX2Rldi0+Zm5fbGlzdC5zZXR1cF9kZXZpY2VfcmVncyhvY3Rlb25fZGV2KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycigmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LAorCQkJCSJGYWlsZWQgdG8gY29uZmlndXJlIGRldmljZSByZWdpc3RlcnNcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQogCX0KIAogCS8qIEluaXRpYWxpemUgdGhlIHRhc2tsZXQgdGhhdCBoYW5kbGVzIG91dHB1dCBxdWV1ZSBwYWNrZXQgcHJvY2Vzc2luZy4qLwpAQCAtMzk4NSw2MyArNDI0NSw3NiBAQAogCQlyZXR1cm4gMTsKIAogCS8qIEVuYWJsZSBPY3Rlb24gZGV2aWNlIGludGVycnVwdHMgKi8KLQlvY3Rlb25fZGV2LT5mbl9saXN0LmVuYWJsZV9pbnRlcnJ1cHQob2N0ZW9uX2Rldi0+Y2hpcCk7CisJb2N0ZW9uX2Rldi0+Zm5fbGlzdC5lbmFibGVfaW50ZXJydXB0KG9jdGVvbl9kZXYsIE9DVEVPTl9BTExfSU5UUik7CiAKIAkvKiBFbmFibGUgdGhlIGlucHV0IGFuZCBvdXRwdXQgcXVldWVzIGZvciB0aGlzIE9jdGVvbiBkZXZpY2UgKi8KLQlvY3Rlb25fZGV2LT5mbl9saXN0LmVuYWJsZV9pb19xdWV1ZXMob2N0ZW9uX2Rldik7CisJcmV0ID0gb2N0ZW9uX2Rldi0+Zm5fbGlzdC5lbmFibGVfaW9fcXVldWVzKG9jdGVvbl9kZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBpbnB1dC9vdXRwdXQgcXVldWVzIik7CisJCXJldHVybiByZXQ7CisJfQogCiAJYXRvbWljX3NldCgmb2N0ZW9uX2Rldi0+c3RhdHVzLCBPQ1RfREVWX0lPX1FVRVVFU19ET05FKTsKIAotCWRldl9kYmcoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwgIldhaXRpbmcgZm9yIEREUiBpbml0aWFsaXphdGlvbi4uLlxuIik7CisJaWYgKCghT0NURU9OX0NOMjNYWF9QRihvY3Rlb25fZGV2KSkgfHwgIWZ3X2xvYWRlZCkgeworCQlkZXZfZGJnKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsICJXYWl0aW5nIGZvciBERFIgaW5pdGlhbGl6YXRpb24uLi5cbiIpOworCQlpZiAoIWRkcl90aW1lb3V0KSB7CisJCQlkZXZfaW5mbygmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LAorCQkJCSAiV0FJVElORy4gU2V0IGRkcl90aW1lb3V0IHRvIG5vbi16ZXJvIHZhbHVlIHRvIHByb2NlZWQgd2l0aCBpbml0aWFsaXphdGlvbi5cbiIpOworCQl9CiAKLQlpZiAoZGRyX3RpbWVvdXQgPT0gMCkKLQkJZGV2X2luZm8oJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwgIldBSVRJTkcuIFNldCBkZHJfdGltZW91dCB0byBub24temVybyB2YWx1ZSB0byBwcm9jZWVkIHdpdGggaW5pdGlhbGl6YXRpb24uXG4iKTsKKwkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoSFogKiBMSU9fUkVTRVRfU0VDUyk7CiAKLQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZShIWiAqIExJT19SRVNFVF9TRUNTKTsKLQotCS8qIFdhaXQgZm9yIHRoZSBvY3Rlb24gdG8gaW5pdGlhbGl6ZSBERFIgYWZ0ZXIgdGhlIHNvZnQtcmVzZXQuICovCi0Jd2hpbGUgKGRkcl90aW1lb3V0ID09IDApIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJaWYgKHNjaGVkdWxlX3RpbWVvdXQoSFogLyAxMCkpIHsKLQkJCS8qIHVzZXIgcHJvYmFibHkgcHJlc3NlZCBDb250cm9sLUMgKi8KKwkJLyogV2FpdCBmb3IgdGhlIG9jdGVvbiB0byBpbml0aWFsaXplIEREUiBhZnRlciB0aGUgc29mdC1yZXNldC4qLworCQl3aGlsZSAoIWRkcl90aW1lb3V0KSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJaWYgKHNjaGVkdWxlX3RpbWVvdXQoSFogLyAxMCkpIHsKKwkJCQkvKiB1c2VyIHByb2JhYmx5IHByZXNzZWQgQ29udHJvbC1DICovCisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwkJcmV0ID0gb2N0ZW9uX3dhaXRfZm9yX2Rkcl9pbml0KG9jdGVvbl9kZXYsICZkZHJfdGltZW91dCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwKKwkJCQkiRERSIG5vdCBpbml0aWFsaXplZC4gUGxlYXNlIGNvbmZpcm0gdGhhdCBib2FyZCBpcyBjb25maWd1cmVkIHRvIGJvb3QgZnJvbSBGbGFzaCwgcmV0OiAlZFxuIiwKKwkJCQlyZXQpOwogCQkJcmV0dXJuIDE7CiAJCX0KLQl9Ci0JcmV0ID0gb2N0ZW9uX3dhaXRfZm9yX2Rkcl9pbml0KG9jdGVvbl9kZXYsICZkZHJfdGltZW91dCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsCi0JCQkiRERSIG5vdCBpbml0aWFsaXplZC4gUGxlYXNlIGNvbmZpcm0gdGhhdCBib2FyZCBpcyBjb25maWd1cmVkIHRvIGJvb3QgZnJvbSBGbGFzaCwgcmV0OiAlZFxuIiwKLQkJCXJldCk7Ci0JCXJldHVybiAxOwotCX0KIAotCWlmIChvY3Rlb25fd2FpdF9mb3JfYm9vdGxvYWRlcihvY3Rlb25fZGV2LCAxMDAwKSAhPSAwKSB7Ci0JCWRldl9lcnIoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwgIkJvYXJkIG5vdCByZXNwb25kaW5nXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQorCQlpZiAob2N0ZW9uX3dhaXRfZm9yX2Jvb3Rsb2FkZXIob2N0ZW9uX2RldiwgMTAwMCkpIHsKKwkJCWRldl9lcnIoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwgIkJvYXJkIG5vdCByZXNwb25kaW5nXG4iKTsKKwkJCXJldHVybiAxOworCQl9CiAKLQkvKiBEaXZlcnQgdWJvb3QgdG8gdGFrZSBjb21tYW5kcyBmcm9tIGhvc3QgaW5zdGVhZC4gKi8KLQlyZXQgPSBvY3Rlb25fY29uc29sZV9zZW5kX2NtZChvY3Rlb25fZGV2LCBib290Y21kLCA1MCk7CisJCS8qIERpdmVydCB1Ym9vdCB0byB0YWtlIGNvbW1hbmRzIGZyb20gaG9zdCBpbnN0ZWFkLiAqLworCQlyZXQgPSBvY3Rlb25fY29uc29sZV9zZW5kX2NtZChvY3Rlb25fZGV2LCBib290Y21kLCA1MCk7CiAKLQlkZXZfZGJnKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsICJJbml0aWFsaXppbmcgY29uc29sZXNcbiIpOwotCXJldCA9IG9jdGVvbl9pbml0X2NvbnNvbGVzKG9jdGVvbl9kZXYpOwotCWlmIChyZXQpIHsKLQkJZGV2X2Vycigmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LCAiQ291bGQgbm90IGFjY2VzcyBib2FyZCBjb25zb2xlc1xuIik7Ci0JCXJldHVybiAxOwotCX0KLQlyZXQgPSBvY3Rlb25fYWRkX2NvbnNvbGUob2N0ZW9uX2RldiwgMCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsICJDb3VsZCBub3QgYWNjZXNzIGJvYXJkIGNvbnNvbGVcbiIpOwotCQlyZXR1cm4gMTsKLQl9CisJCWRldl9kYmcoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwgIkluaXRpYWxpemluZyBjb25zb2xlc1xuIik7CisJCXJldCA9IG9jdGVvbl9pbml0X2NvbnNvbGVzKG9jdGVvbl9kZXYpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsICJDb3VsZCBub3QgYWNjZXNzIGJvYXJkIGNvbnNvbGVzXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCXJldCA9IG9jdGVvbl9hZGRfY29uc29sZShvY3Rlb25fZGV2LCAwKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycigmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LCAiQ291bGQgbm90IGFjY2VzcyBib2FyZCBjb25zb2xlXG4iKTsKKwkJCXJldHVybiAxOworCQl9CiAKLQlhdG9taWNfc2V0KCZvY3Rlb25fZGV2LT5zdGF0dXMsIE9DVF9ERVZfQ09OU09MRV9JTklUX0RPTkUpOworCQlhdG9taWNfc2V0KCZvY3Rlb25fZGV2LT5zdGF0dXMsIE9DVF9ERVZfQ09OU09MRV9JTklUX0RPTkUpOwogCi0JZGV2X2RiZygmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LCAiTG9hZGluZyBmaXJtd2FyZVxuIik7Ci0JcmV0ID0gbG9hZF9maXJtd2FyZShvY3Rlb25fZGV2KTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwgIkNvdWxkIG5vdCBsb2FkIGZpcm13YXJlIHRvIGJvYXJkXG4iKTsKLQkJcmV0dXJuIDE7CisJCWRldl9kYmcoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwgIkxvYWRpbmcgZmlybXdhcmVcbiIpOworCQlyZXQgPSBsb2FkX2Zpcm13YXJlKG9jdGVvbl9kZXYpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsICJDb3VsZCBub3QgbG9hZCBmaXJtd2FyZSB0byBib2FyZFxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQkvKiBzZXQgYml0IDEgb2YgU0xJX1NDUkFUQ0hfMSB0byBpbmRpY2F0ZSB0aGF0IGZpcm13YXJlIGlzCisJCSAqIGxvYWRlZAorCQkgKi8KKwkJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0ZW9uX2RldikpCisJCQlvY3Rlb25fd3JpdGVfY3NyNjQob2N0ZW9uX2RldiwgQ04yM1hYX1NMSV9TQ1JBVENIMSwKKwkJCQkJICAgMlVMTCk7CiAJfQogCiAJaGFuZHNoYWtlW29jdGVvbl9kZXYtPm9jdGVvbl9pZF0uaW5pdF9vayA9IDE7CkBAIC00MDU3LDcgKzQzMzAsNiBAQAogCQkgICAgICAgb2N0ZW9uX2Rldi0+ZHJvcVtqXS0+cGt0c19jcmVkaXRfcmVnKTsKIAogCS8qIFBhY2tldHMgY2FuIHN0YXJ0IGFycml2aW5nIG9uIHRoZSBvdXRwdXQgcXVldWVzIGZyb20gdGhpcyBwb2ludC4gKi8KLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vbGlxdWlkaW9fY29tbW9uLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vbGlxdWlkaW9fY29tbW9uLmgKaW5kZXggMTk5YThiOS4uMGQ5OTBhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2xpcXVpZGlvX2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9saXF1aWRpb19jb21tb24uaApAQCAtMzAsMTAgKzMwLDI0IEBACiAKICNpbmNsdWRlICJvY3Rlb25fY29uZmlnLmgiCiAKLSNkZWZpbmUgTElRVUlESU9fQkFTRV9WRVJTSU9OICAgIjEuNCIKLSNkZWZpbmUgTElRVUlESU9fTUlDUk9fVkVSU0lPTiAgIi4xIgogI2RlZmluZSBMSVFVSURJT19QQUNLQUdFICIiCi0jZGVmaW5lIExJUVVJRElPX1ZFUlNJT04gICIxLjQuMSIKKyNkZWZpbmUgTElRVUlESU9fQkFTRV9NQUpPUl9WRVJTSU9OIDEKKyNkZWZpbmUgTElRVUlESU9fQkFTRV9NSU5PUl9WRVJTSU9OIDQKKyNkZWZpbmUgTElRVUlESU9fQkFTRV9NSUNST19WRVJTSU9OIDEKKyNkZWZpbmUgTElRVUlESU9fQkFTRV9WRVJTSU9OICAgX19zdHJpbmdpZnkoTElRVUlESU9fQkFTRV9NQUpPUl9WRVJTSU9OKSAiLiIgXAorCQkJCV9fc3RyaW5naWZ5KExJUVVJRElPX0JBU0VfTUlOT1JfVkVSU0lPTikKKyNkZWZpbmUgTElRVUlESU9fTUlDUk9fVkVSU0lPTiAgIi4iIF9fc3RyaW5naWZ5KExJUVVJRElPX0JBU0VfTUlDUk9fVkVSU0lPTikKKyNkZWZpbmUgTElRVUlESU9fVkVSU0lPTiAgICAgICAgTElRVUlESU9fUEFDS0FHRSBcCisJCQkJX19zdHJpbmdpZnkoTElRVUlESU9fQkFTRV9NQUpPUl9WRVJTSU9OKSAiLiIgXAorCQkJCV9fc3RyaW5naWZ5KExJUVVJRElPX0JBU0VfTUlOT1JfVkVSU0lPTikgXAorCQkJCSIuIiBfX3N0cmluZ2lmeShMSVFVSURJT19CQVNFX01JQ1JPX1ZFUlNJT04pCisKK3N0cnVjdCBsaW9fdmVyc2lvbiB7CisJdTE2ICBtYWpvcjsKKwl1MTYgIG1pbm9yOworCXUxNiAgbWljcm87CisJdTE2ICByZXNlcnZlZDsKK307CiAKICNkZWZpbmUgQ09OVFJPTF9JUSAwCiAvKiogVGFnIHR5cGVzIHVzZWQgYnkgT2N0ZW9uIGNvcmVzIGluIGl0cyB3b3JrLiAqLwpAQCAtMjE4LDYgKzIzMiw5IEBACiAjZGVmaW5lICAgT0NUTkVUX0NNRF9BRERfVkxBTl9GSUxURVIgIDB4MTcKICNkZWZpbmUgICBPQ1RORVRfQ01EX0RFTF9WTEFOX0ZJTFRFUiAgMHgxOAogI2RlZmluZSAgIE9DVE5FVF9DTURfVlhMQU5fUE9SVF9DT05GSUcgMHgxOQorCisjZGVmaW5lICAgT0NUTkVUX0NNRF9JRF9BQ1RJVkUgICAgICAgICAweDFhCisKICNkZWZpbmUgICBPQ1RORVRfQ01EX1ZYTEFOX1BPUlRfQUREICAgIDB4MAogI2RlZmluZSAgIE9DVE5FVF9DTURfVlhMQU5fUE9SVF9ERUwgICAgMHgxCiAjZGVmaW5lICAgT0NUTkVUX0NNRF9SWENTVU1fRU5BQkxFICAgICAweDAKQEAgLTI5Niw2ICszMTMsMTMgQEAKIAogI2RlZmluZSAgIE9DVE5FVF9DTURfU0laRSAgICAgKHNpemVvZih1bmlvbiBvY3RuZXRfY21kKSkKIAorLypwa2lpaDMgKyBpcmggKyBvc3NwWzBdICsgb3NzcFsxXSArIHJkcCArIHJwdHIgPSA0MCBieXRlcyAqLworI2RlZmluZSBMSU9fU09GVENNRFJFU1BfSUgyICAgICAgIDQwCisjZGVmaW5lIExJT19TT0ZUQ01EUkVTUF9JSDMgICAgICAgKDQwICsgOCkKKworI2RlZmluZSBMSU9fUENJQ01EX08yICAgICAgICAgICAgIDI0CisjZGVmaW5lIExJT19QQ0lDTURfTzMgICAgICAgICAgICAgKDI0ICsgOCkKKwogLyogSW5zdHJ1Y3Rpb24gSGVhZGVyKERQSSkgLSBmb3IgT0NURU9OLUlJSSBtb2RlbHMgKi8KIHN0cnVjdCAgb2N0ZW9uX2luc3RyX2loMyB7CiAjaWZkZWYgX19CSUdfRU5ESUFOX0JJVEZJRUxECkBAIC04MTQsNiArODM4LDggQEAKICNkZWZpbmUgVklURVNTRV9QSFlfR1BJT19EUklWRU9GRiAweDQKICNkZWZpbmUgVklURVNTRV9QSFlfR1BJT19ISUdIICAgICAweDIKICNkZWZpbmUgVklURVNTRV9QSFlfR1BJT19MT1cgICAgICAweDMKKyNkZWZpbmUgTEVEX0lERU5USUZJQ0FUSU9OX09OICAgICAweDEKKyNkZWZpbmUgTEVEX0lERU5USUZJQ0FUSU9OX09GRiAgICAweDAKIAogc3RydWN0IG9jdF9tZGlvX2NtZCB7CiAJdTY0IG9wOwpAQCAtODMyLDcgKzg1OCw3IEBACiAvKiBpbnRybW9kOiBtYXguIHBhY2tldHMgdG8gdHJpZ2dlciBpbnRlcnJ1cHQgKi8KICNkZWZpbmUgTElPX0lOVFJNT0RfUlhNQVhDTlRfVFJJR0dFUgkzODQKIC8qIGludHJtb2Q6IG1pbi4gcGFja2V0cyB0byB0cmlnZ2VyIGludGVycnVwdCAqLwotI2RlZmluZSBMSU9fSU5UUk1PRF9SWE1JTkNOVF9UUklHR0VSCTEKKyNkZWZpbmUgTElPX0lOVFJNT0RfUlhNSU5DTlRfVFJJR0dFUgkwCiAvKiBpbnRybW9kOiBtYXguIHRpbWUgdG8gdHJpZ2dlciBpbnRlcnJ1cHQgKi8KICNkZWZpbmUgTElPX0lOVFJNT0RfUlhNQVhUTVJfVFJJR0dFUgkxMjgKIC8qIDY2eHg6aW50cm1vZDogbWluLiB0aW1lIHRvIHRyaWdnZXIgaW50ZXJydXB0CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2NvbmZpZy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9jb25maWcuaAppbmRleCBiMzM5NmUzLi5jNzY1NTY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2NvbmZpZy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fY29uZmlnLmgKQEAgLTY0LDYgKzY0LDM0IEBACiAjZGVmaW5lICAgREVGQVVMVF9OVU1fTklDX1BPUlRTXzY4WFggICA0CiAjZGVmaW5lICAgREVGQVVMVF9OVU1fTklDX1BPUlRTXzY4WFhfMjEwTlYgIDIKIAorLyogQ04yM3h4ICBJUSBjb25maWd1cmF0aW9uIG1hY3JvcyAqLworI2RlZmluZSAgIENOMjNYWF9NQVhfUklOR1NfUEVSX1BGX1BBU1NfMV8wIDEyCisjZGVmaW5lICAgQ04yM1hYX01BWF9SSU5HU19QRVJfUEZfUEFTU18xXzEgMzIKKyNkZWZpbmUgICBDTjIzWFhfTUFYX1JJTkdTX1BFUl9QRiAgICAgICAgICA2NAorCisjZGVmaW5lICAgQ04yM1hYX01BWF9JTlBVVF9RVUVVRVMJQ04yM1hYX01BWF9SSU5HU19QRVJfUEYKKyNkZWZpbmUgICBDTjIzWFhfTUFYX0lRX0RFU0NSSVBUT1JTCTIwNDgKKyNkZWZpbmUgICBDTjIzWFhfREJfTUlOICAgICAgICAgICAgICAgICAxCisjZGVmaW5lICAgQ04yM1hYX0RCX01BWCAgICAgICAgICAgICAgICAgOAorI2RlZmluZSAgIENOMjNYWF9EQl9USU1FT1VUICAgICAgICAgICAgIDEKKworI2RlZmluZSAgIENOMjNYWF9NQVhfT1VUUFVUX1FVRVVFUwlDTjIzWFhfTUFYX1JJTkdTX1BFUl9QRgorI2RlZmluZSAgIENOMjNYWF9NQVhfT1FfREVTQ1JJUFRPUlMJMjA0OAorI2RlZmluZSAgIENOMjNYWF9PUV9CVUZfU0laRQkJMTUzNgorI2RlZmluZSAgIENOMjNYWF9PUV9QS1RTUEVSX0lOVFIJMTI4CisvKiNkZWZpbmUgQ0FWSVVNX09OTFlfQ04yM1hYX1JYX1BFUkYqLworI2RlZmluZSAgIENOMjNYWF9PUV9SRUZJTF9USFJFU0hPTEQJMTI4CisKKyNkZWZpbmUgICBDTjIzWFhfT1FfSU5UUl9QS1QJCTY0CisjZGVmaW5lICAgQ04yM1hYX09RX0lOVFJfVElNRQkJMTAwCisjZGVmaW5lICAgREVGQVVMVF9OVU1fTklDX1BPUlRTXzIzWFgJMQorCisjZGVmaW5lICAgQ04yM1hYX0NGR19JT19RVUVVRVMJCUNOMjNYWF9NQVhfUklOR1NfUEVSX1BGCisvKiBQRU1zIGNvdW50ICovCisjZGVmaW5lICAgQ04yM1hYX01BWF9NQUNTCQk0CisKKyNkZWZpbmUgICBDTjIzWFhfREVGX0lRX0lOVFJfVEhSRVNIT0xECTMyCisjZGVmaW5lICAgQ04yM1hYX0RFRl9JUV9JTlRSX0JZVEVfVEhSRVNIT0xEICAgKDY0ICogMTAyNCkKIC8qIGNvbW1vbiBPQ1RFT04gY29uZmlndXJhdGlvbiBtYWNyb3MgKi8KICNkZWZpbmUgICBDTjZYWFhfQ0ZHX0lPX1FVRVVFUyAgICAgICAgIDMyCiAjZGVmaW5lICAgT0NURU9OXzMyQllURV9JTlNUUiAgICAgICAgICAzMgpAQCAtOTIsNiArMTIwLDkgQEAKICNkZWZpbmUgQ0ZHX0dFVF9JUV9EQl9NSU4oY2ZnKSAgICAgICAgICAgICAgICAgICAoKGNmZyktPmlxLmRiX21pbikKICNkZWZpbmUgQ0ZHX0dFVF9JUV9EQl9USU1FT1VUKGNmZykgICAgICAgICAgICAgICAoKGNmZyktPmlxLmRiX3RpbWVvdXQpCiAKKyNkZWZpbmUgQ0ZHX0dFVF9JUV9JTlRSX1BLVChjZmcpICAgICAgICAgICAgICAgICAoKGNmZyktPmlxLmlxX2ludHJfcGt0KQorI2RlZmluZSBDRkdfU0VUX0lRX0lOVFJfUEtUKGNmZywgdmFsKSAgICAgICAgICAgIChjZmcpLT5pcS5pcV9pbnRyX3BrdCA9IHZhbAorCiAjZGVmaW5lIENGR19HRVRfT1FfTUFYX1EoY2ZnKSAgICAgICAgICAgICAgICAgICAgKChjZmcpLT5vcS5tYXhfb3FzKQogI2RlZmluZSBDRkdfR0VUX09RX0lORk9fUFRSKGNmZykgICAgICAgICAgICAgICAgICgoY2ZnKS0+b3EuaW5mb19wdHIpCiAjZGVmaW5lIENGR19HRVRfT1FfUEtUU19QRVJfSU5UUihjZmcpICAgICAgICAgICAgKChjZmcpLT5vcS5wa3RzX3Blcl9pbnRyKQpAQCAtMTQwLDE5ICsxNzEsMjQgQEAKIGVudW0gbGlvX2NhcmRfdHlwZSB7CiAJTElPXzIxMFNWID0gMCwgLyogVHdvIHBvcnQsIDY2eHggKi8KIAlMSU9fMjEwTlYsICAgICAvKiBUd28gcG9ydCwgNjh4eCAqLwotCUxJT180MTBOViAgICAgIC8qIEZvdXIgcG9ydCwgNjh4eCAqLworCUxJT180MTBOViwgICAgIC8qIEZvdXIgcG9ydCwgNjh4eCAqLworCUxJT18yM1hYICAgICAgIC8qIDIzeHggKi8KIH07CiAKICNkZWZpbmUgTElPXzIxMFNWX05BTUUgIjIxMHN2IgogI2RlZmluZSBMSU9fMjEwTlZfTkFNRSAiMjEwbnYiCiAjZGVmaW5lIExJT180MTBOVl9OQU1FICI0MTBudiIKKyNkZWZpbmUgTElPXzIzWFhfTkFNRSAgIjIzeHgiCiAKIC8qKiBTdHJ1Y3R1cmUgdG8gZGVmaW5lIHRoZSBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZXMgZm9yIGVhY2ggSW5wdXQgcXVldWUuCiAgKiAgQXBwbGljYWJsZSB0byBhbGwgT2N0ZW9uIHByb2Nlc3NvcnMKICAqKi8KIHN0cnVjdCBvY3Rlb25faXFfY29uZmlnIHsKICNpZmRlZiBfX0JJR19FTkRJQU5fQklURklFTEQKLQl1NjQgcmVzZXJ2ZWQ6MzI7CisJdTY0IHJlc2VydmVkOjE2OworCisJLyoqIFR4IGludGVycnVwdCBwYWNrZXRzLiBBcHBsaWNhYmxlIHRvIDIzeHggb25seSAqLworCXU2NCBpcV9pbnRyX3BrdDoxNjsKIAogCS8qKiBNaW5pbXVtIHRpY2tzIHRvIHdhaXQgYmVmb3JlIGNoZWNraW5nIGZvciBwZW5kaW5nIGluc3RydWN0aW9ucy4gKi8KIAl1NjQgZGJfdGltZW91dDoxNjsKQEAgLTE5Miw3ICsyMjgsMTAgQEAKIAkvKiogTWluaW11bSB0aWNrcyB0byB3YWl0IGJlZm9yZSBjaGVja2luZyBmb3IgcGVuZGluZyBpbnN0cnVjdGlvbnMuICovCiAJdTY0IGRiX3RpbWVvdXQ6MTY7CiAKLQl1NjQgcmVzZXJ2ZWQ6MzI7CisJLyoqIFR4IGludGVycnVwdCBwYWNrZXRzLiBBcHBsaWNhYmxlIHRvIDIzeHggb25seSAqLworCXU2NCBpcV9pbnRyX3BrdDoxNjsKKworCXU2NCByZXNlcnZlZDoxNjsKICNlbmRpZgogfTsKIApAQCAtNDE2LDExICs0NTUsMTUgQEAKICNkZWZpbmUgRElTUEFUQ0hfTElTVF9TSVpFICAgICAgICAgICAgICAgICAgICAgIEJJVChPUENPREVfTUFTS19CSVRTKQogCiAvKiBNYXhpbXVtIG51bWJlciBvZiBPY3Rlb24gSW5zdHJ1Y3Rpb24gKGNvbW1hbmQpIHF1ZXVlcyAqLwotI2RlZmluZSBNQVhfT0NURU9OX0lOU1RSX1FVRVVFUyhvY3QpICAgICAgICAgQ042WFhYX01BWF9JTlBVVF9RVUVVRVMKLS8qIE1heGltdW0gbnVtYmVyIG9mIE9jdGVvbiBPdXRwdXQgcXVldWVzICovCi0jZGVmaW5lIE1BWF9PQ1RFT05fT1VUUFVUX1FVRVVFUyhvY3QpICAgICAgICAgQ042WFhYX01BWF9PVVRQVVRfUVVFVUVTCisjZGVmaW5lIE1BWF9PQ1RFT05fSU5TVFJfUVVFVUVTKG9jdCkJCVwKKwkJKE9DVEVPTl9DTjIzWFhfUEYob2N0KSA/IENOMjNYWF9NQVhfSU5QVVRfUVVFVUVTIDogXAorCQkJCQlDTjZYWFhfTUFYX0lOUFVUX1FVRVVFUykKIAotI2RlZmluZSBNQVhfUE9TU0lCTEVfT0NURU9OX0lOU1RSX1FVRVVFUyAgICAgICBDTjZYWFhfTUFYX0lOUFVUX1FVRVVFUwotI2RlZmluZSBNQVhfUE9TU0lCTEVfT0NURU9OX09VVFBVVF9RVUVVRVMgICAgICBDTjZYWFhfTUFYX09VVFBVVF9RVUVVRVMKKy8qIE1heGltdW0gbnVtYmVyIG9mIE9jdGVvbiBJbnN0cnVjdGlvbiAoY29tbWFuZCkgcXVldWVzICovCisjZGVmaW5lIE1BWF9PQ1RFT05fT1VUUFVUX1FVRVVFUyhvY3QpCQlcCisJCShPQ1RFT05fQ04yM1hYX1BGKG9jdCkgPyBDTjIzWFhfTUFYX09VVFBVVF9RVUVVRVMgOiBcCisJCQkJCUNONlhYWF9NQVhfT1VUUFVUX1FVRVVFUykKIAorI2RlZmluZSBNQVhfUE9TU0lCTEVfT0NURU9OX0lOU1RSX1FVRVVFUwlDTjIzWFhfTUFYX0lOUFVUX1FVRVVFUworI2RlZmluZSBNQVhfUE9TU0lCTEVfT0NURU9OX09VVFBVVF9RVUVVRVMJQ04yM1hYX01BWF9PVVRQVVRfUVVFVUVTCiAjZW5kaWYgLyogX19PQ1RFT05fQ09ORklHX0hfXyAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fY29uc29sZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9jb25zb2xlLmMKaW5kZXggYmJiNTBlYS4uMDFhNTBmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9jb25zb2xlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9jb25zb2xlLmMKQEAgLTI1LDEyICsyNSwxMyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlICJsaXF1aWRpb19jb21tb24uaCIKICNpbmNsdWRlICJvY3Rlb25fZHJvcS5oIgogI2luY2x1ZGUgIm9jdGVvbl9pcS5oIgogI2luY2x1ZGUgInJlc3BvbnNlX21hbmFnZXIuaCIKICNpbmNsdWRlICJvY3Rlb25fZGV2aWNlLmgiCi0jaW5jbHVkZSAib2N0ZW9uX21haW4uaCIKKyNpbmNsdWRlICJsaXF1aWRpb19pbWFnZS5oIgogI2luY2x1ZGUgIm9jdGVvbl9tZW1fb3BzLmgiCiAKIHN0YXRpYyB2b2lkIG9jdGVvbl9yZW1vdGVfbG9jayh2b2lkKTsKQEAgLTQwLDYgKzQxLDEwIEBACiAJCQkJCSAgICAgdTMyIGZsYWdzKTsKIHN0YXRpYyBpbnQgb2N0ZW9uX2NvbnNvbGVfcmVhZChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LCB1MzIgY29uc29sZV9udW0sCiAJCQkgICAgICAgY2hhciAqYnVmZmVyLCB1MzIgYnVmX3NpemUpOworc3RhdGljIHUzMiBjb25zb2xlX2JpdG1hc2s7Cittb2R1bGVfcGFyYW0oY29uc29sZV9iaXRtYXNrLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhjb25zb2xlX2JpdG1hc2ssCisJCSAiQml0bWFzayBpbmRpY2F0aW5nIHdoaWNoIGNvbnNvbGVzIGhhdmUgZGVidWcgb3V0cHV0IHJlZGlyZWN0ZWQgdG8gc3lzbG9nLiIpOwogCiAjZGVmaW5lIE1JTihhLCBiKSBtaW4oKGEpLCAoYikpCiAjZGVmaW5lIENBU1RfVUxMKHYpICgodTY0KSh2KSkKQEAgLTE3Nyw2ICsxODIsMTUgQEAKIAlfX2N2bXhfYm9vdG1lbV9kZXNjX2dldChvY3QsIGFkZHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJb2Zmc2V0b2Yoc3RydWN0IGN2bXhfYm9vdG1lbV9uYW1lZF9ibG9ja19kZXNjLCBmaWVsZCksICAgXAogCQlTSVpFT0ZfRklFTEQoc3RydWN0IGN2bXhfYm9vdG1lbV9uYW1lZF9ibG9ja19kZXNjLCBmaWVsZCkpCisvKioKKyAqIFxicmllZiBkZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gY29uc29sZSBoYXMgZGVidWcgZW5hYmxlZC4KKyAqIEBwYXJhbSBjb25zb2xlIGNvbnNvbGUgdG8gY2hlY2sKKyAqIEByZXR1cm5zICAxID0gZW5hYmxlZC4gMCBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBvY3Rlb25fY29uc29sZV9kZWJ1Z19lbmFibGVkKHUzMiBjb25zb2xlKQoreworCXJldHVybiAoY29uc29sZV9iaXRtYXNrID4+IChjb25zb2xlKSkgJiAweDE7Cit9CiAKIC8qKgogICogVGhpcyBmdW5jdGlvbiBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGdldCBtYWNyb3MgZGVmaW5lZApAQCAtNzA5LDMgKzcyMywxMDQgQEAKIAogCXJldHVybiBieXRlc190b19yZWFkOwogfQorCisjZGVmaW5lIEZCVUZfU0laRQkoNCAqIDEwMjQgKiAxMDI0KQordTggZmJ1ZltGQlVGX1NJWkVdOworCitpbnQgb2N0ZW9uX2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsIGNvbnN0IHU4ICpkYXRhLAorCQkJICAgICBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1OCAqcCA9IGZidWY7CisJdTMyIGNyYzMyX3Jlc3VsdDsKKwl1NjQgbG9hZF9hZGRyOworCXUzMiBpbWFnZV9sZW47CisJc3RydWN0IG9jdGVvbl9maXJtd2FyZV9maWxlX2hlYWRlciAqaDsKKwl1MzIgaSwgcmVtOworCisJaWYgKHNpemUgPCBzaXplb2Yoc3RydWN0IG9jdGVvbl9maXJtd2FyZV9maWxlX2hlYWRlcikpIHsKKwkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJGaXJtd2FyZSBmaWxlIHRvbyBzbWFsbCAoJWQgPCAlZCkuXG4iLAorCQkJKHUzMilzaXplLAorCQkJKHUzMilzaXplb2Yoc3RydWN0IG9jdGVvbl9maXJtd2FyZV9maWxlX2hlYWRlcikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwloID0gKHN0cnVjdCBvY3Rlb25fZmlybXdhcmVfZmlsZV9oZWFkZXIgKilkYXRhOworCisJaWYgKGJlMzJfdG9fY3B1KGgtPm1hZ2ljKSAhPSBMSU9fTklDX01BR0lDKSB7CisJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiVW5yZWNvZ25pemVkIGZpcm13YXJlIGZpbGUuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY3JjMzJfcmVzdWx0ID0gY3JjMzIoKHVuc2lnbmVkIGludCl+MCwgZGF0YSwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBvY3Rlb25fZmlybXdhcmVfZmlsZV9oZWFkZXIpIC0KKwkJCSAgICAgc2l6ZW9mKHUzMikpIF4gfjBVOworCWlmIChjcmMzMl9yZXN1bHQgIT0gYmUzMl90b19jcHUoaC0+Y3JjMzIpKSB7CisJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiRmlybXdhcmUgQ1JDIG1pc21hdGNoICgweCUwOHggIT0gMHglMDh4KS5cbiIsCisJCQljcmMzMl9yZXN1bHQsIGJlMzJfdG9fY3B1KGgtPmNyYzMyKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChzdHJuY21wKExJUVVJRElPX1BBQ0tBR0UsIGgtPnZlcnNpb24sIHN0cmxlbihMSVFVSURJT19QQUNLQUdFKSkpIHsKKwkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJVbm1hdGNoZWQgZmlybXdhcmUgcGFja2FnZSB0eXBlLiBFeHBlY3RlZCAlcywgZ290ICVzLlxuIiwKKwkJCUxJUVVJRElPX1BBQ0tBR0UsIGgtPnZlcnNpb24pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobWVtY21wKExJUVVJRElPX0JBU0VfVkVSU0lPTiwgaC0+dmVyc2lvbiArIHN0cmxlbihMSVFVSURJT19QQUNLQUdFKSwKKwkJICAgc3RybGVuKExJUVVJRElPX0JBU0VfVkVSU0lPTikpKSB7CisJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiVW5tYXRjaGVkIGZpcm13YXJlIHZlcnNpb24uIEV4cGVjdGVkICVzLngsIGdvdCAlcy5cbiIsCisJCQlMSVFVSURJT19CQVNFX1ZFUlNJT04sCisJCQloLT52ZXJzaW9uICsgc3RybGVuKExJUVVJRElPX1BBQ0tBR0UpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGJlMzJfdG9fY3B1KGgtPm51bV9pbWFnZXMpID4gTElPX01BWF9JTUFHRVMpIHsKKwkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJUb28gbWFueSBpbWFnZXMgaW4gZmlybXdhcmUgZmlsZSAoJWQpLlxuIiwKKwkJCWJlMzJfdG9fY3B1KGgtPm51bV9pbWFnZXMpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X2luZm8oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiRmlybXdhcmUgdmVyc2lvbjogJXNcbiIsIGgtPnZlcnNpb24pOworCXNucHJpbnRmKG9jdC0+ZndfaW5mby5saXF1aWRpb19maXJtd2FyZV92ZXJzaW9uLCAzMiwgIkxJUVVJRElPOiAlcyIsCisJCSBoLT52ZXJzaW9uKTsKKworCWRhdGEgKz0gc2l6ZW9mKHN0cnVjdCBvY3Rlb25fZmlybXdhcmVfZmlsZV9oZWFkZXIpOworCisJZGV2X2luZm8oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXM6IExvYWRpbmcgJWQgaW1hZ2VzXG4iLCBfX2Z1bmNfXywKKwkJIGJlMzJfdG9fY3B1KGgtPm51bV9pbWFnZXMpKTsKKwkvKiBsb2FkIGFsbCBpbWFnZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYmUzMl90b19jcHUoaC0+bnVtX2ltYWdlcyk7IGkrKykgeworCQlsb2FkX2FkZHIgPSBiZTY0X3RvX2NwdShoLT5kZXNjW2ldLmFkZHIpOworCQlpbWFnZV9sZW4gPSBiZTMyX3RvX2NwdShoLT5kZXNjW2ldLmxlbik7CisKKwkJZGV2X2luZm8oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiTG9hZGluZyBmaXJtd2FyZSAlZCBhdCAlbGx4XG4iLAorCQkJIGltYWdlX2xlbiwgbG9hZF9hZGRyKTsKKworCQkvKiBXcml0ZSBpbiA0TUIgY2h1bmtzKi8KKwkJcmVtID0gaW1hZ2VfbGVuOworCisJCXdoaWxlIChyZW0pIHsKKwkJCWlmIChyZW0gPCBGQlVGX1NJWkUpCisJCQkJc2l6ZSA9IHJlbTsKKwkJCWVsc2UKKwkJCQlzaXplID0gRkJVRl9TSVpFOworCisJCQltZW1jcHkocCwgZGF0YSwgc2l6ZSk7CisKKwkJCS8qIGRvd25sb2FkIHRoZSBpbWFnZSAqLworCQkJb2N0ZW9uX3BjaV93cml0ZV9jb3JlX21lbShvY3QsIGxvYWRfYWRkciwgcCwgKHUzMilzaXplKTsKKworCQkJZGF0YSArPSBzaXplOworCQkJcmVtIC09ICh1MzIpc2l6ZTsKKwkJCWxvYWRfYWRkciArPSBzaXplOworCQl9CisJfQorCWRldl9pbmZvKCZvY3QtPnBjaV9kZXYtPmRldiwgIldyaXRpbmcgYm9vdCBjb21tYW5kOiAlc1xuIiwKKwkJIGgtPmJvb3RjbWQpOworCisJLyogSW52b2tlIHRoZSBib290Y21kICovCisJcmV0ID0gb2N0ZW9uX2NvbnNvbGVfc2VuZF9jbWQob2N0LCBoLT5ib290Y21kLCA1MCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fZGV2aWNlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2RldmljZS5jCmluZGV4IDBlYjUwNGEuLjU4NmI2ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fZGV2aWNlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9kZXZpY2UuYwpAQCAtMjAsNyArMjAsNiBAQAogKiBDb250YWN0IENhdml1bSwgSW5jLiBmb3IgbW9yZSBpbmZvcm1hdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlICJsaXF1aWRpb19jb21tb24uaCIKQEAgLTMyLDggKzMxLDcgQEAKICNpbmNsdWRlICJvY3Rlb25fbmV0d29yay5oIgogI2luY2x1ZGUgImNuNjZ4eF9yZWdzLmgiCiAjaW5jbHVkZSAiY242Nnh4X2RldmljZS5oIgotI2luY2x1ZGUgImxpcXVpZGlvX2ltYWdlLmgiCi0jaW5jbHVkZSAib2N0ZW9uX21lbV9vcHMuaCIKKyNpbmNsdWRlICJjbjIzeHhfcGZfZGV2aWNlLmgiCiAKIC8qKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24KICAqICBmb3IgQ042NlhYIE9DVEVPTiBNb2RlbHMuCkBAIC00MjAsNiArNDE4LDEwOCBAQAogCSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgb2N0ZW9uX2NvbmZpZyBkZWZhdWx0X2NuMjN4eF9jb25mID0geworCS5jYXJkX3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IExJT18yM1hYLAorCS5jYXJkX25hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IExJT18yM1hYX05BTUUsCisJLyoqIElRIGF0dHJpYnV0ZXMgKi8KKwkuaXEgPSB7CisJCS5tYXhfaXFzCQk9IENOMjNYWF9DRkdfSU9fUVVFVUVTLAorCQkucGVuZGluZ19saXN0X3NpemUJPSAoQ04yM1hYX01BWF9JUV9ERVNDUklQVE9SUyAqCisJCQkJCSAgIENOMjNYWF9DRkdfSU9fUVVFVUVTKSwKKwkJLmluc3RyX3R5cGUJCT0gT0NURU9OXzY0QllURV9JTlNUUiwKKwkJLmRiX21pbgkJCT0gQ04yM1hYX0RCX01JTiwKKwkJLmRiX3RpbWVvdXQJCT0gQ04yM1hYX0RCX1RJTUVPVVQsCisJCS5pcV9pbnRyX3BrdAkJPSBDTjIzWFhfREVGX0lRX0lOVFJfVEhSRVNIT0xELAorCX0sCisKKwkvKiogT1EgYXR0cmlidXRlcyAqLworCS5vcSA9IHsKKwkJLm1heF9vcXMJCT0gQ04yM1hYX0NGR19JT19RVUVVRVMsCisJCS5pbmZvX3B0cgkJPSBPQ1RFT05fT1FfSU5GT1BUUl9NT0RFLAorCQkucGt0c19wZXJfaW50cgk9IENOMjNYWF9PUV9QS1RTUEVSX0lOVFIsCisJCS5yZWZpbGxfdGhyZXNob2xkCT0gQ04yM1hYX09RX1JFRklMX1RIUkVTSE9MRCwKKwkJLm9xX2ludHJfcGt0CT0gQ04yM1hYX09RX0lOVFJfUEtULAorCQkub3FfaW50cl90aW1lCT0gQ04yM1hYX09RX0lOVFJfVElNRSwKKwl9LAorCisJLm51bV9uaWNfcG9ydHMJCQkJPSBERUZBVUxUX05VTV9OSUNfUE9SVFNfMjNYWCwKKwkubnVtX2RlZl9yeF9kZXNjcwkJCT0gQ04yM1hYX01BWF9PUV9ERVNDUklQVE9SUywKKwkubnVtX2RlZl90eF9kZXNjcwkJCT0gQ04yM1hYX01BWF9JUV9ERVNDUklQVE9SUywKKwkuZGVmX3J4X2J1Zl9zaXplCQkJPSBDTjIzWFhfT1FfQlVGX1NJWkUsCisKKwkvKiBGb3IgZXRoZXJuZXQgaW50ZXJmYWNlIDA6ICBQb3J0IGNmZyBBdHRyaWJ1dGVzICovCisJLm5pY19pZl9jZmdbMF0gPSB7CisJCS8qIE1heCBUeHFzOiBIYWxmIGZvciBlYWNoIG9mIHRoZSB0d28gcG9ydHMgOm1heF9pcS8yICovCisJCS5tYXhfdHhxcwkJCT0gTUFYX1RYUVNfUEVSX0lOVEYsCisKKwkJLyogQWN0dWFsIGNvbmZpZ3VyZWQgdmFsdWUuIFJhbmdlIGNvdWxkIGJlOiAxLi4ubWF4X3R4cXMgKi8KKwkJLm51bV90eHFzCQkJPSBERUZfVFhRU19QRVJfSU5URiwKKworCQkvKiBNYXggUnhxczogSGFsZiBmb3IgZWFjaCBvZiB0aGUgdHdvIHBvcnRzIDptYXhfb3EvMiAgKi8KKwkJLm1heF9yeHFzCQkJPSBNQVhfUlhRU19QRVJfSU5URiwKKworCQkvKiBBY3R1YWwgY29uZmlndXJlZCB2YWx1ZS4gUmFuZ2UgY291bGQgYmU6IDEuLi5tYXhfcnhxcyAqLworCQkubnVtX3J4cXMJCQk9IERFRl9SWFFTX1BFUl9JTlRGLAorCisJCS8qIE51bSBvZiBkZXNjIGZvciByeCByaW5ncyAqLworCQkubnVtX3J4X2Rlc2NzCQkJPSBDTjIzWFhfTUFYX09RX0RFU0NSSVBUT1JTLAorCisJCS8qIE51bSBvZiBkZXNjIGZvciB0eCByaW5ncyAqLworCQkubnVtX3R4X2Rlc2NzCQkJPSBDTjIzWFhfTUFYX0lRX0RFU0NSSVBUT1JTLAorCisJCS8qIFNLQiBzaXplLCBXZSBuZWVkIG5vdCBjaGFuZ2UgYnVmIHNpemUgZXZlbiBmb3IgSnVtYm8gZnJhbWVzLgorCQkgKiBPY3Rlb24gY2FuIHNlbmQganVtYm8gZnJhbWVzIGluIDQgY29uc2VjdXRpdmUgZGVzY3JpcHRvcnMsCisJCSAqLworCQkucnhfYnVmX3NpemUJCQk9IENOMjNYWF9PUV9CVUZfU0laRSwKKworCQkuYmFzZV9xdWV1ZQkJCT0gQkFTRV9RVUVVRV9OT1RfUkVRVUVTVEVELAorCisJCS5nbXhfcG9ydF9pZAkJCT0gMCwKKwl9LAorCisJLm5pY19pZl9jZmdbMV0gPSB7CisJCS8qIE1heCBUeHFzOiBIYWxmIGZvciBlYWNoIG9mIHRoZSB0d28gcG9ydHMgOm1heF9pcS8yICovCisJCS5tYXhfdHhxcwkJCT0gTUFYX1RYUVNfUEVSX0lOVEYsCisKKwkJLyogQWN0dWFsIGNvbmZpZ3VyZWQgdmFsdWUuIFJhbmdlIGNvdWxkIGJlOiAxLi4ubWF4X3R4cXMgKi8KKwkJLm51bV90eHFzCQkJPSBERUZfVFhRU19QRVJfSU5URiwKKworCQkvKiBNYXggUnhxczogSGFsZiBmb3IgZWFjaCBvZiB0aGUgdHdvIHBvcnRzIDptYXhfb3EvMiAgKi8KKwkJLm1heF9yeHFzCQkJPSBNQVhfUlhRU19QRVJfSU5URiwKKworCQkvKiBBY3R1YWwgY29uZmlndXJlZCB2YWx1ZS4gUmFuZ2UgY291bGQgYmU6IDEuLi5tYXhfcnhxcyAqLworCQkubnVtX3J4cXMJCQk9IERFRl9SWFFTX1BFUl9JTlRGLAorCisJCS8qIE51bSBvZiBkZXNjIGZvciByeCByaW5ncyAqLworCQkubnVtX3J4X2Rlc2NzCQkJPSBDTjIzWFhfTUFYX09RX0RFU0NSSVBUT1JTLAorCisJCS8qIE51bSBvZiBkZXNjIGZvciB0eCByaW5ncyAqLworCQkubnVtX3R4X2Rlc2NzCQkJPSBDTjIzWFhfTUFYX0lRX0RFU0NSSVBUT1JTLAorCisJCS8qIFNLQiBzaXplLCBXZSBuZWVkIG5vdCBjaGFuZ2UgYnVmIHNpemUgZXZlbiBmb3IgSnVtYm8gZnJhbWVzLgorCQkgKiBPY3Rlb24gY2FuIHNlbmQganVtYm8gZnJhbWVzIGluIDQgY29uc2VjdXRpdmUgZGVzY3JpcHRvcnMsCisJCSAqLworCQkucnhfYnVmX3NpemUJCQk9IENOMjNYWF9PUV9CVUZfU0laRSwKKworCQkuYmFzZV9xdWV1ZQkJCT0gQkFTRV9RVUVVRV9OT1RfUkVRVUVTVEVELAorCisJCS5nbXhfcG9ydF9pZAkJCT0gMSwKKwl9LAorCisJLm1pc2MJCQkJCT0geworCQkvKiBIb3N0IGRyaXZlciBsaW5rIHF1ZXJ5IGludGVydmFsICovCisJCS5vY3RfbGlua19xdWVyeV9pbnRlcnZhbAk9IDEwMCwKKworCQkvKiBPY3Rlb24gbGluayBxdWVyeSBpbnRlcnZhbCAqLworCQkuaG9zdF9saW5rX3F1ZXJ5X2ludGVydmFsCT0gNTAwLAorCisJCS5lbmFibGVfc2xpX29xX2JwCQk9IDAsCisKKwkJLyogQ29udHJvbCBxdWV1ZSBncm91cCAqLworCQkuY3RybHFfZ3JwCQkJPSAxLAorCX0KK307CisKIGVudW0gewogCU9DVEVPTl9DT05GSUdfVFlQRV9ERUZBVUxUID0gMCwKIAlOVU1fT0NURU9OX0NPTkZTLApAQCAtNDg3LDYgKzU4Nyw4IEBACiAJCX0gZWxzZSBpZiAoKG9jdC0+Y2hpcF9pZCA9PSBPQ1RFT05fQ042OFhYKSAmJgogCQkJICAgKGNhcmRfdHlwZSA9PSBMSU9fNDEwTlYpKSB7CiAJCQlyZXQgPSAgKHZvaWQgKikmZGVmYXVsdF9jbjY4eHhfY29uZjsKKwkJfSBlbHNlIGlmIChvY3QtPmNoaXBfaWQgPT0gT0NURU9OX0NOMjNYWF9QRl9WSUQpIHsKKwkJCXJldCA9ICAodm9pZCAqKSZkZWZhdWx0X2NuMjN4eF9jb25mOwogCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC01MDEsNyArNjAzLDggQEAKIAljYXNlIE9DVEVPTl9DTjY2WFg6CiAJY2FzZSBPQ1RFT05fQ042OFhYOgogCQlyZXR1cm4gbGlvX3ZhbGlkYXRlX2NuNnh4eF9jb25maWdfaW5mbyhvY3QsIGNvbmYpOwotCisJY2FzZSBPQ1RFT05fQ04yM1hYX1BGX1ZJRDoKKwkJcmV0dXJuIDA7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQpAQCAtNTQxLDEwNyArNjQ0LDYgQEAKIAlyZXR1cm4gb2N0X2Rldl9hcHBfc3RyW0NWTV9EUlZfSU5WQUxJRF9BUFAgLSBDVk1fRFJWX0FQUF9TVEFSVF07CiB9CiAKLXU4IGZidWZbNCAqIDEwMjQgKiAxMDI0XTsKLQotaW50IG9jdGVvbl9kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LCBjb25zdCB1OCAqZGF0YSwKLQkJCSAgICAgc2l6ZV90IHNpemUpCi17Ci0JaW50IHJldCA9IDA7Ci0JdTggKnAgPSBmYnVmOwotCXUzMiBjcmMzMl9yZXN1bHQ7Ci0JdTY0IGxvYWRfYWRkcjsKLQl1MzIgaW1hZ2VfbGVuOwotCXN0cnVjdCBvY3Rlb25fZmlybXdhcmVfZmlsZV9oZWFkZXIgKmg7Ci0JdTMyIGksIHJlbSwgYmFzZV9sZW4gPSBzdHJsZW4oTElRVUlESU9fQkFTRV9WRVJTSU9OKTsKLQljaGFyICpiYXNlOwotCi0JaWYgKHNpemUgPCBzaXplb2Yoc3RydWN0IG9jdGVvbl9maXJtd2FyZV9maWxlX2hlYWRlcikpIHsKLQkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJGaXJtd2FyZSBmaWxlIHRvbyBzbWFsbCAoJWQgPCAlZCkuXG4iLAotCQkJKHUzMilzaXplLAotCQkJKHUzMilzaXplb2Yoc3RydWN0IG9jdGVvbl9maXJtd2FyZV9maWxlX2hlYWRlcikpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQloID0gKHN0cnVjdCBvY3Rlb25fZmlybXdhcmVfZmlsZV9oZWFkZXIgKilkYXRhOwotCi0JaWYgKGJlMzJfdG9fY3B1KGgtPm1hZ2ljKSAhPSBMSU9fTklDX01BR0lDKSB7Ci0JCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiVW5yZWNvZ25pemVkIGZpcm13YXJlIGZpbGUuXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JY3JjMzJfcmVzdWx0ID0gY3JjMzIoKHVuc2lnbmVkIGludCl+MCwgZGF0YSwKLQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBvY3Rlb25fZmlybXdhcmVfZmlsZV9oZWFkZXIpIC0KLQkJCSAgICAgc2l6ZW9mKHUzMikpIF4gfjBVOwotCWlmIChjcmMzMl9yZXN1bHQgIT0gYmUzMl90b19jcHUoaC0+Y3JjMzIpKSB7Ci0JCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiRmlybXdhcmUgQ1JDIG1pc21hdGNoICgweCUwOHggIT0gMHglMDh4KS5cbiIsCi0JCQljcmMzMl9yZXN1bHQsIGJlMzJfdG9fY3B1KGgtPmNyYzMyKSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChzdHJuY21wKExJUVVJRElPX1BBQ0tBR0UsIGgtPnZlcnNpb24sIHN0cmxlbihMSVFVSURJT19QQUNLQUdFKSkpIHsKLQkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJVbm1hdGNoZWQgZmlybXdhcmUgcGFja2FnZSB0eXBlLiBFeHBlY3RlZCAlcywgZ290ICVzLlxuIiwKLQkJCUxJUVVJRElPX1BBQ0tBR0UsIGgtPnZlcnNpb24pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQliYXNlID0gaC0+dmVyc2lvbiArIHN0cmxlbihMSVFVSURJT19QQUNLQUdFKTsKLQlyZXQgPSBtZW1jbXAoTElRVUlESU9fQkFTRV9WRVJTSU9OLCBiYXNlLCBiYXNlX2xlbik7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIlVubWF0Y2hlZCBmaXJtd2FyZSB2ZXJzaW9uLiBFeHBlY3RlZCAlcy54LCBnb3QgJXMuXG4iLAotCQkJTElRVUlESU9fQkFTRV9WRVJTSU9OLCBiYXNlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGJlMzJfdG9fY3B1KGgtPm51bV9pbWFnZXMpID4gTElPX01BWF9JTUFHRVMpIHsKLQkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJUb28gbWFueSBpbWFnZXMgaW4gZmlybXdhcmUgZmlsZSAoJWQpLlxuIiwKLQkJCWJlMzJfdG9fY3B1KGgtPm51bV9pbWFnZXMpKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGV2X2luZm8oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiRmlybXdhcmUgdmVyc2lvbjogJXNcbiIsIGgtPnZlcnNpb24pOwotCXNucHJpbnRmKG9jdC0+ZndfaW5mby5saXF1aWRpb19maXJtd2FyZV92ZXJzaW9uLCAzMiwgIkxJUVVJRElPOiAlcyIsCi0JCSBoLT52ZXJzaW9uKTsKLQotCWRhdGEgKz0gc2l6ZW9mKHN0cnVjdCBvY3Rlb25fZmlybXdhcmVfZmlsZV9oZWFkZXIpOwotCi0JZGV2X2luZm8oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXM6IExvYWRpbmcgJWQgaW1hZ2VzXG4iLCBfX2Z1bmNfXywKLQkJIGJlMzJfdG9fY3B1KGgtPm51bV9pbWFnZXMpKTsKLQkvKiBsb2FkIGFsbCBpbWFnZXMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgYmUzMl90b19jcHUoaC0+bnVtX2ltYWdlcyk7IGkrKykgewotCQlsb2FkX2FkZHIgPSBiZTY0X3RvX2NwdShoLT5kZXNjW2ldLmFkZHIpOwotCQlpbWFnZV9sZW4gPSBiZTMyX3RvX2NwdShoLT5kZXNjW2ldLmxlbik7Ci0KLQkJZGV2X2luZm8oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiTG9hZGluZyBmaXJtd2FyZSAlZCBhdCAlbGx4XG4iLAotCQkJIGltYWdlX2xlbiwgbG9hZF9hZGRyKTsKLQotCQkvKiBXcml0ZSBpbiA0TUIgY2h1bmtzKi8KLQkJcmVtID0gaW1hZ2VfbGVuOwotCi0JCXdoaWxlIChyZW0pIHsKLQkJCWlmIChyZW0gPCAoNCAqIDEwMjQgKiAxMDI0KSkKLQkJCQlzaXplID0gcmVtOwotCQkJZWxzZQotCQkJCXNpemUgPSA0ICogMTAyNCAqIDEwMjQ7Ci0KLQkJCW1lbWNweShwLCBkYXRhLCBzaXplKTsKLQotCQkJLyogZG93bmxvYWQgdGhlIGltYWdlICovCi0JCQlvY3Rlb25fcGNpX3dyaXRlX2NvcmVfbWVtKG9jdCwgbG9hZF9hZGRyLCBwLCAodTMyKXNpemUpOwotCi0JCQlkYXRhICs9IHNpemU7Ci0JCQlyZW0gLT0gKHUzMilzaXplOwotCQkJbG9hZF9hZGRyICs9IHNpemU7Ci0JCX0KLQl9Ci0JZGV2X2luZm8oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiV3JpdGluZyBib290IGNvbW1hbmQ6ICVzXG4iLAotCQkgaC0+Ym9vdGNtZCk7Ci0KLQkvKiBJbnZva2UgdGhlIGJvb3RjbWQgKi8KLQlyZXQgPSBvY3Rlb25fY29uc29sZV9zZW5kX2NtZChvY3QsIGgtPmJvb3RjbWQsIDUwKTsKLQotCXJldHVybiAwOwotfQotCiB2b2lkIG9jdGVvbl9mcmVlX2RldmljZV9tZW0oc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKIHsKIAlpbnQgaTsKQEAgLTY3Niw2ICs2NzgsOSBAQAogCQljb25maWdzaXplID0gc2l6ZW9mKHN0cnVjdCBvY3Rlb25fY242eHh4KTsKIAkJYnJlYWs7CiAKKwljYXNlIE9DVEVPTl9DTjIzWFhfUEZfVklEOgorCQljb25maWdzaXplID0gc2l6ZW9mKHN0cnVjdCBvY3Rlb25fY24yM3h4X3BmKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJfZXJyKCIlczogVW5rbm93biBQQ0kgRGV2aWNlOiAweCV4XG4iLAogCQkgICAgICAgX19mdW5jX18sCkBAIC03NDEsNiArNzQ2LDQ1IEBACiAJcmV0dXJuIG9jdDsKIH0KIAoraW50CitvY3Rlb25fYWxsb2NhdGVfaW9xX3ZlY3RvcihzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAgKm9jdCkKK3sKKwlpbnQgaSwgbnVtX2lvcXMgPSAwOworCXN0cnVjdCBvY3Rlb25faW9xX3ZlY3RvciAqaW9xX3ZlY3RvcjsKKwlpbnQgY3B1X251bTsKKwlpbnQgc2l6ZTsKKworCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkpCisJCW51bV9pb3FzID0gb2N0LT5zcmlvdl9pbmZvLm51bV9wZl9yaW5nczsKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBvY3Rlb25faW9xX3ZlY3RvcikgKiBudW1faW9xczsKKworCW9jdC0+aW9xX3ZlY3RvciA9IHZtYWxsb2Moc2l6ZSk7CisJaWYgKCFvY3QtPmlvcV92ZWN0b3IpCisJCXJldHVybiAxOworCW1lbXNldChvY3QtPmlvcV92ZWN0b3IsIDAsIHNpemUpOworCWZvciAoaSA9IDA7IGkgPCBudW1faW9xczsgaSsrKSB7CisJCWlvcV92ZWN0b3IJCT0gJm9jdC0+aW9xX3ZlY3RvcltpXTsKKwkJaW9xX3ZlY3Rvci0+b2N0X2Rldgk9IG9jdDsKKwkJaW9xX3ZlY3Rvci0+aXFfaW5kZXgJPSBpOworCQlpb3FfdmVjdG9yLT5kcm9xX2luZGV4CT0gaTsKKworCQljcHVfbnVtID0gaSAlIG51bV9vbmxpbmVfY3B1cygpOworCQljcHVtYXNrX3NldF9jcHUoY3B1X251bSwgJmlvcV92ZWN0b3ItPmFmZmluaXR5X21hc2spOworCisJCWlmIChvY3QtPmNoaXBfaWQgPT0gT0NURU9OX0NOMjNYWF9QRl9WSUQpCisJCQlpb3FfdmVjdG9yLT5pb3FfbnVtCT0gaSArIG9jdC0+c3Jpb3ZfaW5mby5wZl9zcm47CisJCWVsc2UKKwkJCWlvcV92ZWN0b3ItPmlvcV9udW0JPSBpOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZAorb2N0ZW9uX2ZyZWVfaW9xX3ZlY3RvcihzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQoreworCXZmcmVlKG9jdC0+aW9xX3ZlY3Rvcik7Cit9CisKIC8qIHRoaXMgZnVuY3Rpb24gaXMgb25seSBmb3Igc2V0dGluZyB1cCB0aGUgZmlyc3QgcXVldWUgKi8KIGludCBvY3Rlb25fc2V0dXBfaW5zdHJfcXVldWVzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCiB7CkBAIC03NDksMTAgKzc5MywxMiBAQAogCXVuaW9uIG9jdF90eHBjaXEgdHhwY2lxOwogCWludCBudW1hX25vZGUgPSBjcHVfdG9fbm9kZShpcV9ubyAlIG51bV9vbmxpbmVfY3B1cygpKTsKIAotCS8qIHRoaXMgY2F1c2VzIHF1ZXVlIDAgdG8gYmUgZGVmYXVsdCBxdWV1ZSAqLwogCWlmIChPQ1RFT05fQ042WFhYKG9jdCkpCiAJCW51bV9kZXNjcyA9CiAJCQlDRkdfR0VUX05VTV9ERUZfVFhfREVTQ1MoQ0hJUF9GSUVMRChvY3QsIGNuNnh4eCwgY29uZikpOworCWVsc2UgaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSkKKwkJbnVtX2Rlc2NzID0gQ0ZHX0dFVF9OVU1fREVGX1RYX0RFU0NTKENISVBfRklFTEQob2N0LCBjbjIzeHhfcGYsCisJCQkJCQkJCWNvbmYpKTsKIAogCW9jdC0+bnVtX2lxcyA9IDA7CiAKQEAgLTc2OSw2ICs4MTUsNyBAQAogCW9jdC0+aW5zdHJfcXVldWVbMF0tPmlmaWR4ID0gMDsKIAl0eHBjaXEudTY0ID0gMDsKIAl0eHBjaXEucy5xX25vID0gaXFfbm87CisJdHhwY2lxLnMucGtpbmQgPSBvY3QtPnBmdmZfaHN3b3JkLnBraW5kOwogCXR4cGNpcS5zLnVzZV9xcGcgPSAwOwogCXR4cGNpcS5zLnFwZyA9IDA7CiAJaWYgKG9jdGVvbl9pbml0X2luc3RyX3F1ZXVlKG9jdCwgdHhwY2lxLCBudW1fZGVzY3MpKSB7CkBAIC03ODgsMTQgKzgzNSwxNyBAQAogCXUzMiBvcV9ubyA9IDA7CiAJaW50IG51bWFfbm9kZSA9IGNwdV90b19ub2RlKG9xX25vICUgbnVtX29ubGluZV9jcHVzKCkpOwogCi0JLyogdGhpcyBjYXVzZXMgcXVldWUgMCB0byBiZSBkZWZhdWx0IHF1ZXVlICovCiAJaWYgKE9DVEVPTl9DTjZYWFgob2N0KSkgewogCQludW1fZGVzY3MgPQogCQkJQ0ZHX0dFVF9OVU1fREVGX1JYX0RFU0NTKENISVBfRklFTEQob2N0LCBjbjZ4eHgsIGNvbmYpKTsKIAkJZGVzY19zaXplID0KIAkJCUNGR19HRVRfREVGX1JYX0JVRl9TSVpFKENISVBfRklFTEQob2N0LCBjbjZ4eHgsIGNvbmYpKTsKKwl9IGVsc2UgaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSkgeworCQludW1fZGVzY3MgPSBDRkdfR0VUX05VTV9ERUZfUlhfREVTQ1MoQ0hJUF9GSUVMRChvY3QsIGNuMjN4eF9wZiwKKwkJCQkJCQkJY29uZikpOworCQlkZXNjX3NpemUgPSBDRkdfR0VUX0RFRl9SWF9CVUZfU0laRShDSElQX0ZJRUxEKG9jdCwgY24yM3h4X3BmLAorCQkJCQkJCSAgICAgICBjb25mKSk7CiAJfQotCiAJb2N0LT5udW1fb3FzID0gMDsKIAlvY3QtPmRyb3FbMF0gPSB2bWFsbG9jX25vZGUoc2l6ZW9mKCpvY3QtPmRyb3FbMF0pLCBudW1hX25vZGUpOwogCWlmICghb2N0LT5kcm9xWzBdKQpAQCAtODEyLDEwICs4NjIsMTAgQEAKIAogdm9pZCBvY3Rlb25fc2V0X2lvX3F1ZXVlc19vZmYoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKIHsKLQkvKiBEaXNhYmxlIHRoZSBpL3AgYW5kIG8vcCBxdWV1ZXMgZm9yIHRoaXMgT2N0ZW9uLiAqLwotCi0Jb2N0ZW9uX3dyaXRlX2NzcihvY3QsIENONlhYWF9TTElfUEtUX0lOU1RSX0VOQiwgMCk7Ci0Jb2N0ZW9uX3dyaXRlX2NzcihvY3QsIENONlhYWF9TTElfUEtUX09VVF9FTkIsIDApOworCWlmIChPQ1RFT05fQ042WFhYKG9jdCkpIHsKKwkJb2N0ZW9uX3dyaXRlX2NzcihvY3QsIENONlhYWF9TTElfUEtUX0lOU1RSX0VOQiwgMCk7CisJCW9jdGVvbl93cml0ZV9jc3Iob2N0LCBDTjZYWFhfU0xJX1BLVF9PVVRfRU5CLCAwKTsKKwl9CiB9CiAKIHZvaWQgb2N0ZW9uX3NldF9kcm9xX3BrdF9vcChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LApAQCAtODI1LDE0ICs4NzUsMTYgQEAKIAl1MzIgcmVnX3ZhbCA9IDA7CiAKIAkvKiBEaXNhYmxlIHRoZSBpL3AgYW5kIG8vcCBxdWV1ZXMgZm9yIHRoaXMgT2N0ZW9uLiAqLwotCXJlZ192YWwgPSBvY3Rlb25fcmVhZF9jc3Iob2N0LCBDTjZYWFhfU0xJX1BLVF9PVVRfRU5CKTsKKwlpZiAoT0NURU9OX0NONlhYWChvY3QpKSB7CisJCXJlZ192YWwgPSBvY3Rlb25fcmVhZF9jc3Iob2N0LCBDTjZYWFhfU0xJX1BLVF9PVVRfRU5CKTsKIAotCWlmIChlbmFibGUpCi0JCXJlZ192YWwgPSByZWdfdmFsIHwgKDEgPDwgcV9ubyk7Ci0JZWxzZQotCQlyZWdfdmFsID0gcmVnX3ZhbCAmICh+KDEgPDwgcV9ubykpOworCQlpZiAoZW5hYmxlKQorCQkJcmVnX3ZhbCA9IHJlZ192YWwgfCAoMSA8PCBxX25vKTsKKwkJZWxzZQorCQkJcmVnX3ZhbCA9IHJlZ192YWwgJiAofigxIDw8IHFfbm8pKTsKIAotCW9jdGVvbl93cml0ZV9jc3Iob2N0LCBDTjZYWFhfU0xJX1BLVF9PVVRfRU5CLCByZWdfdmFsKTsKKwkJb2N0ZW9uX3dyaXRlX2NzcihvY3QsIENONlhYWF9TTElfUEtUX09VVF9FTkIsIHJlZ192YWwpOworCX0KIH0KIAogaW50IG9jdGVvbl9pbml0X2Rpc3BhdGNoX2xpc3Qoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKQEAgLTEwMTksNiArMTA3MSw5IEBACiAJaWYgKE9DVEVPTl9DTjZYWFgob2N0KSkKIAkJbnVtX25pY19wb3J0cyA9CiAJCQlDRkdfR0VUX05VTV9OSUNfUE9SVFMoQ0hJUF9GSUVMRChvY3QsIGNuNnh4eCwgY29uZikpOworCWVsc2UgaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSkKKwkJbnVtX25pY19wb3J0cyA9CisJCQlDRkdfR0VUX05VTV9OSUNfUE9SVFMoQ0hJUF9GSUVMRChvY3QsIGNuMjN4eF9wZiwgY29uZikpOwogCiAJaWYgKGF0b21pY19yZWFkKCZvY3QtPnN0YXR1cykgPj0gT0NUX0RFVl9SVU5OSU5HKSB7CiAJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiUmVjZWl2ZWQgQ09SRSBPSyB3aGVuIGRldmljZSBzdGF0ZSBpcyAweCV4XG4iLApAQCAtMTA0Niw2ICsxMTAxLDEyIEBACiAJfQogCW9jdC0+ZndfaW5mby5hcHBfY2FwX2ZsYWdzID0gcmVjdl9wa3QtPnJoLnJfY29yZV9kcnZfaW5pdC5hcHBfY2FwX2ZsYWdzOwogCW9jdC0+ZndfaW5mby5hcHBfbW9kZSA9ICh1MzIpcmVjdl9wa3QtPnJoLnJfY29yZV9kcnZfaW5pdC5hcHBfbW9kZTsKKwlvY3QtPnBmdmZfaHN3b3JkLmFwcF9tb2RlID0gKHUzMilyZWN2X3BrdC0+cmgucl9jb3JlX2Rydl9pbml0LmFwcF9tb2RlOworCisJb2N0LT5wZnZmX2hzd29yZC5wa2luZCA9IHJlY3ZfcGt0LT5yaC5yX2NvcmVfZHJ2X2luaXQucGtpbmQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgb2N0LT5udW1faXFzOyBpKyspCisJCW9jdC0+aW5zdHJfcXVldWVbaV0tPnR4cGNpcS5zLnBraW5kID0gb2N0LT5wZnZmX2hzd29yZC5wa2luZDsKIAogCWF0b21pY19zZXQoJm9jdC0+c3RhdHVzLCBPQ1RfREVWX0NPUkVfT0spOwogCkBAIC0xMTA4LDggKzExNjksMTAgQEAKIAlpZiAoT0NURU9OX0NONlhYWChvY3QpKSB7CiAJCWRlZmF1bHRfb2N0X2NvbmYgPQogCQkJKHN0cnVjdCBvY3Rlb25fY29uZmlnICopKENISVBfRklFTEQob2N0LCBjbjZ4eHgsIGNvbmYpKTsKKwl9IGVsc2UgaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSkgeworCQlkZWZhdWx0X29jdF9jb25mID0gKHN0cnVjdCBvY3Rlb25fY29uZmlnICopCisJCQkoQ0hJUF9GSUVMRChvY3QsIGNuMjN4eF9wZiwgY29uZikpOwogCX0KLQogCXJldHVybiBkZWZhdWx0X29jdF9jb25mOwogfQogCkBAIC0xMTQxLDcgKzEyMDQsOSBAQAogCSAqIFNvIHdyaXRlIE1TQiBmaXJzdAogCSAqLwogCWFkZHJoaSA9IChhZGRyID4+IDMyKTsKLQlpZiAoKG9jdC0+Y2hpcF9pZCA9PSBPQ1RFT05fQ042NlhYKSB8fCAob2N0LT5jaGlwX2lkID09IE9DVEVPTl9DTjY4WFgpKQorCWlmICgob2N0LT5jaGlwX2lkID09IE9DVEVPTl9DTjY2WFgpIHx8CisJICAgIChvY3QtPmNoaXBfaWQgPT0gT0NURU9OX0NONjhYWCkgfHwKKwkgICAgKG9jdC0+Y2hpcF9pZCA9PSBPQ1RFT05fQ04yM1hYX1BGX1ZJRCkpCiAJCWFkZHJoaSB8PSAweDAwMDYwMDAwOwogCXdyaXRlbChhZGRyaGksIG9jdC0+cmVnX2xpc3QucGNpX3dpbl9yZF9hZGRyX2hpKTsKIApAQCAtMTE4NSw4ICsxMjUwLDE1IEBACiAJdTY0IGxtYzBfcmVzZXRfY3RsOwogCiAJLyogQ2hlY2sgdG8gbWFrZSBzdXJlIGEgRERSIGludGVyZmFjZSBpcyBlbmFibGVkICovCi0JbG1jMF9yZXNldF9jdGwgPSBsaW9fcGNpX3JlYWRxKG9jdCwgQ042WFhYX0xNQzBfUkVTRVRfQ1RMKTsKLQlhY2Nlc3Nfb2theSA9IChsbWMwX3Jlc2V0X2N0bCAmIENONlhYWF9MTUMwX1JFU0VUX0NUTF9ERFIzUlNUX01BU0spOworCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkpIHsKKwkJbG1jMF9yZXNldF9jdGwgPSBsaW9fcGNpX3JlYWRxKG9jdCwgQ04yM1hYX0xNQzBfUkVTRVRfQ1RMKTsKKwkJYWNjZXNzX29rYXkgPQorCQkJKGxtYzBfcmVzZXRfY3RsICYgQ04yM1hYX0xNQzBfUkVTRVRfQ1RMX0REUjNSU1RfTUFTSyk7CisJfSBlbHNlIHsKKwkJbG1jMF9yZXNldF9jdGwgPSBsaW9fcGNpX3JlYWRxKG9jdCwgQ042WFhYX0xNQzBfUkVTRVRfQ1RMKTsKKwkJYWNjZXNzX29rYXkgPQorCQkJKGxtYzBfcmVzZXRfY3RsICYgQ042WFhYX0xNQzBfUkVTRVRfQ1RMX0REUjNSU1RfTUFTSyk7CisJfQogCiAJcmV0dXJuIGFjY2Vzc19va2F5ID8gMCA6IDE7CiB9CkBAIC0xMjI2LDMgKzEyOTgsMzkgQEAKIAkJCXJldHVybiBvY3Rlb25fZGV2LT5vY3Rlb25faWQ7CiAJcmV0dXJuIC0xOwogfQorCit2b2lkIGxpb19lbmFibGVfaXJxKHN0cnVjdCBvY3Rlb25fZHJvcSAqZHJvcSwgc3RydWN0IG9jdGVvbl9pbnN0cl9xdWV1ZSAqaXEpCit7CisJdTY0IGluc3RyX2NudDsKKwlzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0ID0gTlVMTDsKKworCS8qIHRoZSB3aG9sZSB0aGluZyBuZWVkcyB0byBiZSBhdG9taWMsIGlkZWFsbHkgKi8KKwlpZiAoZHJvcSkgeworCQlzcGluX2xvY2tfYmgoJmRyb3EtPmxvY2spOworCQl3cml0ZWwoZHJvcS0+cGt0X2NvdW50LCBkcm9xLT5wa3RzX3NlbnRfcmVnKTsKKwkJZHJvcS0+cGt0X2NvdW50ID0gMDsKKwkJc3Bpbl91bmxvY2tfYmgoJmRyb3EtPmxvY2spOworCQlvY3QgPSBkcm9xLT5vY3RfZGV2OworCX0KKwlpZiAoaXEpIHsKKwkJc3Bpbl9sb2NrX2JoKCZpcS0+bG9jayk7CisJCXdyaXRlbChpcS0+cGt0X2luX2RvbmUsIGlxLT5pbnN0X2NudF9yZWcpOworCQlpcS0+cGt0X2luX2RvbmUgPSAwOworCQlzcGluX3VubG9ja19iaCgmaXEtPmxvY2spOworCQlvY3QgPSBpcS0+b2N0X2RldjsKKwl9CisJLyp3cml0ZSByZXNlbmQuIFdyaXRpbmcgUkVTRU5EIGluIFNMSV9QS1RYX0NOVFMgc2hvdWxkIGJlIGVub3VnaAorCSAqdG8gdHJpZ2dlciB0eCBpbnRlcnJ1cHRzIGFzIHdlbGwsIGlmIHRoZXkgYXJlIHBlbmRpbmcuCisJICovCisJaWYgKG9jdCAmJiBPQ1RFT05fQ04yM1hYX1BGKG9jdCkpIHsKKwkJaWYgKGRyb3EpCisJCQl3cml0ZXEoQ04yM1hYX0lOVFJfUkVTRU5ELCBkcm9xLT5wa3RzX3NlbnRfcmVnKTsKKwkJLyp3ZSByYWNlIHdpdGggZmlybXJ3YXJlIGhlcmUuIHJlYWQgYW5kIHdyaXRlIHRoZSBJTl9ET05FX0NOVFMqLworCQllbHNlIGlmIChpcSkgeworCQkJaW5zdHJfY250ID0gIHJlYWRxKGlxLT5pbnN0X2NudF9yZWcpOworCQkJd3JpdGVxKCgoaW5zdHJfY250ICYgMHhGRkZGRkZGRjAwMDAwMDAwVUxMKSB8CisJCQkJQ04yM1hYX0lOVFJfUkVTRU5EKSwKKwkJCSAgICAgICBpcS0+aW5zdF9jbnRfcmVnKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fZGV2aWNlLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2RldmljZS5oCmluZGV4IDAxZWRmYjQuLmRhMTVjMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fZGV2aWNlLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9kZXZpY2UuaApAQCAtMzAsMTMgKzMwLDE5IEBACiAvKiogUENJIFZlbmRvcklkIERldmljZSBJZCAqLwogI2RlZmluZSAgT0NURU9OX0NONjhYWF9QQ0lJRCAgICAgICAgICAweDkxMTc3ZAogI2RlZmluZSAgT0NURU9OX0NONjZYWF9QQ0lJRCAgICAgICAgICAweDkyMTc3ZAotCisjZGVmaW5lICBPQ1RFT05fQ04yM1hYX1BDSUlEX1BGICAgICAgIDB4OTcwMjE3N2QKIC8qKiBEcml2ZXIgaWRlbnRpZmllcyBjaGlwcyBieSB0aGVzZSBJZHMsIGNyZWF0ZWQgYnkgY2x1YmJpbmcgdG9nZXRoZXIKICAqICBEZXZpY2VJZCtSZXZpc2lvbklkOyBXaGVyZSBSZXZpc2lvbiBJZCBpcyBub3QgdXNlZCB0byBkaXN0aW5ndWlzaAogICogIGJldHdlZW4gY2hpcHMsIGEgdmFsdWUgb2YgMCBpcyB1c2VkIGZvciByZXZpc2lvbiBpZC4KICAqLwogI2RlZmluZSAgT0NURU9OX0NONjhYWCAgICAgICAgICAgICAgICAweDAwOTEKICNkZWZpbmUgIE9DVEVPTl9DTjY2WFggICAgICAgICAgICAgICAgMHgwMDkyCisjZGVmaW5lICBPQ1RFT05fQ04yM1hYX1BGX1ZJRCAgICAgICAgIDB4OTcwMgorCisvKipSZXZpc2lvbklkIGZvciB0aGUgY2hpcHMgKi8KKyNkZWZpbmUgIE9DVEVPTl9DTjIzWFhfUkVWXzFfMCAgICAgICAgMHgwMAorI2RlZmluZSAgT0NURU9OX0NOMjNYWF9SRVZfMV8xICAgICAgICAweDAxCisjZGVmaW5lICBPQ1RFT05fQ04yM1hYX1JFVl8yXzAgICAgICAgIDB4ODAKIAogLyoqIEVuZGlhbi1zd2FwIG1vZGVzIHN1cHBvcnRlZCBieSBPY3Rlb24uICovCiBlbnVtIG9jdGVvbl9wY2lfc3dhcF9tb2RlIHsKQEAgLTQ2LDYgKzUyLDkgQEAKIAlPQ1RFT05fUENJXzMyQklUX0xXX1NXQVAgPSAzCiB9OwogCisjZGVmaW5lICBPQ1RFT05fT1VUUFVUX0lOVFIgICAoMikKKyNkZWZpbmUgIE9DVEVPTl9BTExfSU5UUiAgICAgIDB4ZmYKKwogLyotLS0tLS0tLS0tLS0tLS0gICBQQ0kgQkFSMSBpbmRleCByZWdpc3RlcnMgLS0tLS0tLS0tLS0tLSovCiAKIC8qIEJBUjEgTWFzayAqLwpAQCAtMTk4LDkgKzIwNyw5IEBACiAJdm9pZCAoKnNldHVwX29xX3JlZ3MpKHN0cnVjdCBvY3Rlb25fZGV2aWNlICosIHUzMik7CiAKIAlpcnFyZXR1cm5fdCAoKnByb2Nlc3NfaW50ZXJydXB0X3JlZ3MpKHZvaWQgKik7CisJdTY0ICgqbXNpeF9pbnRlcnJ1cHRfaGFuZGxlcikodm9pZCAqKTsKIAlpbnQgKCpzb2Z0X3Jlc2V0KShzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqKTsKIAlpbnQgKCpzZXR1cF9kZXZpY2VfcmVncykoc3RydWN0IG9jdGVvbl9kZXZpY2UgKik7Ci0Jdm9pZCAoKnJlaW5pdF9yZWdzKShzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqKTsKIAl2b2lkICgqYmFyMV9pZHhfc2V0dXApKHN0cnVjdCBvY3Rlb25fZGV2aWNlICosIHU2NCwgdTMyLCBpbnQpOwogCXZvaWQgKCpiYXIxX2lkeF93cml0ZSkoc3RydWN0IG9jdGVvbl9kZXZpY2UgKiwgdTMyLCB1MzIpOwogCXUzMiAoKmJhcjFfaWR4X3JlYWQpKHN0cnVjdCBvY3Rlb25fZGV2aWNlICosIHUzMik7CkBAIC0yMDksMTAgKzIxOCwxMCBAQAogCXZvaWQgKCplbmFibGVfb3FfcGt0X3RpbWVfaW50cikoc3RydWN0IG9jdGVvbl9kZXZpY2UgKiwgdTMyKTsKIAl2b2lkICgqZGlzYWJsZV9vcV9wa3RfdGltZV9pbnRyKShzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqLCB1MzIpOwogCi0Jdm9pZCAoKmVuYWJsZV9pbnRlcnJ1cHQpKHZvaWQgKik7Ci0Jdm9pZCAoKmRpc2FibGVfaW50ZXJydXB0KSh2b2lkICopOworCXZvaWQgKCplbmFibGVfaW50ZXJydXB0KShzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqLCB1OCk7CisJdm9pZCAoKmRpc2FibGVfaW50ZXJydXB0KShzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqLCB1OCk7CiAKLQl2b2lkICgqZW5hYmxlX2lvX3F1ZXVlcykoc3RydWN0IG9jdGVvbl9kZXZpY2UgKik7CisJaW50ICgqZW5hYmxlX2lvX3F1ZXVlcykoc3RydWN0IG9jdGVvbl9kZXZpY2UgKik7CiAJdm9pZCAoKmRpc2FibGVfaW9fcXVldWVzKShzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqKTsKIH07CiAKQEAgLTI2NiwxMSArMjc1LDcyIEBACiAJLyogRWFjaCBpbnRlcmZhY2UgaW4gdGhlIE9jdGVvbiBkZXZpY2UgaGFzIGEgbmV0d29yawogCSAqIGRldmljZSBwb2ludGVyICh1c2VkIGZvciBPUyBzcGVjaWZpYyBjYWxscykuCiAJICovCisJaW50ICAgIHJ4X29uOwogCWludCAgICBuYXBpX2VuYWJsZWQ7CiAJaW50ICAgIGdteHBvcnQ7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKIH07CiAKKyNkZWZpbmUgTElPX0ZMQUdfTVNJWF9FTkFCTEVECTB4MQorI2RlZmluZSBNU0lYX1BPX0lOVAkJMHgxCisjZGVmaW5lIE1TSVhfUElfSU5UCQkweDIKKworc3RydWN0IG9jdGVvbl9wZl92Zl9oc193b3JkIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKKwkvKiogUEtJTkQgdmFsdWUgYXNzaWduZWQgZm9yIHRoZSBEUEkgaW50ZXJmYWNlICovCisJdTY0ICAgICAgICBwa2luZCA6IDg7CisKKwkvKiogT0NURU9OIGNvcmUgY2xvY2sgbXVsdGlwbGllciAgICovCisJdTY0ICAgICAgICBjb3JlX3RpY3NfcGVyX3VzIDogMTY7CisKKwkvKiogT0NURU9OIGNvcHJvY2Vzc29yIGNsb2NrIG11bHRpcGxpZXIgICovCisJdTY0ICAgICAgICBjb3Byb2NfdGljc19wZXJfdXMgOiAxNjsKKworCS8qKiBhcHAgdGhhdCBjdXJyZW50bHkgcnVubmluZyBvbiBPQ1RFT04gICovCisJdTY0ICAgICAgICBhcHBfbW9kZSA6IDg7CisKKwkvKiogUkVTRVJWRUQgKi8KKwl1NjQgcmVzZXJ2ZWQgOiAxNjsKKworI2Vsc2UKKworCS8qKiBSRVNFUlZFRCAqLworCXU2NCByZXNlcnZlZCA6IDE2OworCisJLyoqIGFwcCB0aGF0IGN1cnJlbnRseSBydW5uaW5nIG9uIE9DVEVPTiAgKi8KKwl1NjQgICAgICAgIGFwcF9tb2RlIDogODsKKworCS8qKiBPQ1RFT04gY29wcm9jZXNzb3IgY2xvY2sgbXVsdGlwbGllciAgKi8KKwl1NjQgICAgICAgIGNvcHJvY190aWNzX3Blcl91cyA6IDE2OworCisJLyoqIE9DVEVPTiBjb3JlIGNsb2NrIG11bHRpcGxpZXIgICAqLworCXU2NCAgICAgICAgY29yZV90aWNzX3Blcl91cyA6IDE2OworCisJLyoqIFBLSU5EIHZhbHVlIGFzc2lnbmVkIGZvciB0aGUgRFBJIGludGVyZmFjZSAqLworCXU2NCAgICAgICAgcGtpbmQgOiA4OworI2VuZGlmCit9OworCitzdHJ1Y3Qgb2N0ZW9uX3NyaW92X2luZm8geworCS8qIEFjdHVhbCByaW5ncyBsZWZ0IGZvciBQRiBkZXZpY2UgKi8KKwl1MzIJbnVtX3BmX3JpbmdzOworCisJLyogU1JOIG9mIFBGIHVzYWJsZSBJTyBxdWV1ZXMgICAqLworCXUzMglwZl9zcm47CisJLyogdG90YWwgcGYgcmluZ3MgKi8KKwl1MzIJdHJzOworCit9OworCitzdHJ1Y3Qgb2N0ZW9uX2lvcV92ZWN0b3IgeworCXN0cnVjdCBvY3Rlb25fZGV2aWNlICAgKm9jdF9kZXY7CisJaW50CQkgICAgICAgIGlxX2luZGV4OworCWludAkJICAgICAgICBkcm9xX2luZGV4OworCWludAkJCXZlY3RvcjsKKwlzdHJ1Y3QgY3B1bWFzawkJYWZmaW5pdHlfbWFzazsKKwl1MzIJCQlpb3FfbnVtOworfTsKKwogLyoqIFRoZSBPY3Rlb24gZGV2aWNlLgogICogIEVhY2ggT2N0ZW9uIGRldmljZSBoYXMgdGhpcyBzdHJ1Y3R1cmUgdG8gcmVwcmVzZW50IGFsbCBpdHMKICAqICBjb21wb25lbnRzLgpAQCAtMjk2LDcgKzM2Niw3IEBACiAJLyoqIE9jdGVvbiBDaGlwIHR5cGUuICovCiAJdTE2IGNoaXBfaWQ7CiAJdTE2IHJldl9pZDsKLQorCXUxNiBwZl9udW07CiAJLyoqIFRoaXMgZGV2aWNlJ3MgaWQgLSBzZXQgYnkgdGhlIGRyaXZlci4gKi8KIAl1MzIgb2N0ZW9uX2lkOwogCkBAIC0zMDUsNyArMzc1LDYgQEAKIAogCXUxNiBmbGFnczsKICNkZWZpbmUgTElPX0ZMQUdfTVNJX0VOQUJMRUQgICAgICAgICAgICAgICAgICAodTMyKSgxIDw8IDEpCi0jZGVmaW5lIExJT19GTEFHX01TSVhfRU5BQkxFRCAgICAgICAgICAgICAgICAgKHUzMikoMSA8PCAyKQogCiAJLyoqIFRoZSBzdGF0ZSBvZiB0aGlzIGRldmljZSAqLwogCWF0b21pY190IHN0YXR1czsKQEAgLTM5NSw2ICs0NjQsMTkgQEAKIAogCXZvaWQgKnByaXY7CiAKKwlpbnQgbnVtX21zaXhfaXJxczsKKworCXZvaWQgKm1zaXhfZW50cmllczsKKworCXN0cnVjdCBvY3Rlb25fc3Jpb3ZfaW5mbyBzcmlvdl9pbmZvOworCisJc3RydWN0IG9jdGVvbl9wZl92Zl9oc193b3JkIHBmdmZfaHN3b3JkOworCisJaW50IG1zaXhfb247CisKKwkvKiogSU9xIGluZm9ybWF0aW9uIG9mIGl0J3MgY29ycmVzcG9uZGluZyBNU0ktWCBpbnRlcnJ1cHQuICovCisJc3RydWN0IG9jdGVvbl9pb3FfdmVjdG9yICAgICppb3FfdmVjdG9yOworCiAJaW50IHJ4X3BhdXNlOwogCWludCB0eF9wYXVzZTsKIApAQCAtNDAyLDEyICs0ODQsMTUgQEAKIAogCS8qIHByaXZhdGUgZmxhZ3MgdG8gY29udHJvbCBkcml2ZXItc3BlY2lmaWMgZmVhdHVyZXMgdGhyb3VnaCBldGh0b29sICovCiAJdTMyIHByaXZfZmxhZ3M7CisKKwl2b2lkICp3YXRjaGRvZ190YXNrOwogfTsKIAogI2RlZmluZSAgT0NUX0RSVl9PTkxJTkUgMQogI2RlZmluZSAgT0NUX0RSVl9PRkZMSU5FIDIKICNkZWZpbmUgIE9DVEVPTl9DTjZYWFgob2N0KSAgICAgICAgICAgKChvY3QtPmNoaXBfaWQgPT0gT0NURU9OX0NONjZYWCkgfHwgXAogCQkJCSAgICAgICAob2N0LT5jaGlwX2lkID09IE9DVEVPTl9DTjY4WFgpKQorI2RlZmluZSAgT0NURU9OX0NOMjNYWF9QRihvY3QpICAgICAgICAob2N0LT5jaGlwX2lkID09IE9DVEVPTl9DTjIzWFhfUEZfVklEKQogI2RlZmluZSBDSElQX0ZJRUxEKG9jdCwgVFlQRSwgZmllbGQpICAgICAgICAgICAgIFwKIAkoKChzdHJ1Y3Qgb2N0ZW9uXyAjIyBUWVBFICAqKShvY3QtPmNoaXApKS0+ZmllbGQpCiAKQEAgLTY2MSwxMyArNzQ2LDI0IEBACiAgKi8KIHN0cnVjdCBvY3Rlb25fY29uZmlnICpvY3Rlb25fZ2V0X2NvbmYoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCk7CiAKK3ZvaWQgb2N0ZW9uX2ZyZWVfaW9xX3ZlY3RvcihzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KTsKK2ludCBvY3Rlb25fYWxsb2NhdGVfaW9xX3ZlY3RvcihzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAgKm9jdCk7Cit2b2lkIGxpb19lbmFibGVfaXJxKHN0cnVjdCBvY3Rlb25fZHJvcSAqZHJvcSwgc3RydWN0IG9jdGVvbl9pbnN0cl9xdWV1ZSAqaXEpOworCiAvKiBMaXF1aWRJTyBkcml2ZXIgcGl2YXRlIGZsYWdzICovCiBlbnVtIHsKIAlPQ1RfUFJJVl9GTEFHX1RYX0JZVEVTID0gMCwgLyogVHggaW50ZXJydXB0cyBieSBwZW5kaW5nIGJ5dGUgY291bnQgKi8KIH07CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBsaW9fc2V0X3ByaXZfZmxhZyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0ZGV2LCB1MzIgZmxhZywKLQkJCQkgICAgIHUzMiB2YWwpCisjZGVmaW5lIE9DVF9QUklWX0ZMQUdfREVGQVVMVCAweDAKKworc3RhdGljIGlubGluZSB1MzIgbGlvX2dldF9wcml2X2ZsYWcoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdGRldiwgdTMyIGZsYWcpCit7CisJcmV0dXJuICEhKG9jdGRldi0+cHJpdl9mbGFncyAmICgweDEgPDwgZmxhZykpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbGlvX3NldF9wcml2X2ZsYWcoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdGRldiwKKwkJCQkgICAgIHUzMiBmbGFnLCB1MzIgdmFsKQogewogCWlmICh2YWwpCiAJCW9jdGRldi0+cHJpdl9mbGFncyB8PSAoMHgxIDw8IGZsYWcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9kcm9xLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2Ryb3EuYwppbmRleCBlMGFmZTRjLi5mNjBlNTMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2Ryb3EuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2Ryb3EuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgIm9jdGVvbl9uZXR3b3JrLmgiCiAjaW5jbHVkZSAiY242Nnh4X3JlZ3MuaCIKICNpbmNsdWRlICJjbjY2eHhfZGV2aWNlLmgiCisjaW5jbHVkZSAiY24yM3h4X3BmX2RldmljZS5oIgogCiAjZGVmaW5lICAgICBDVk1fTUlOKGQxLCBkMikgICAgICAgICAgICgoKGQxKSA8IChkMikpID8gKGQxKSA6IChkMikpCiAjZGVmaW5lICAgICBDVk1fTUFYKGQxLCBkMikgICAgICAgICAgICgoKGQxKSA+IChkMikpID8gKGQxKSA6IChkMikpCkBAIC05MiwyMiArOTMsMjUgQEAKIAlyZXR1cm4gZm5fYXJnOwogfQogCi0vKiogQ2hlY2sgZm9yIHBhY2tldHMgb24gRHJvcS4gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdpdGgKLSAqIGxvY2sgaGVsZC4KKy8qKiBDaGVjayBmb3IgcGFja2V0cyBvbiBEcm9xLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBsb2NrIGhlbGQuCiAgKiAgQHBhcmFtICBkcm9xIC0gRHJvcSBvbiB3aGljaCBjb3VudCBpcyBjaGVja2VkLgogICogIEByZXR1cm4gUmV0dXJucyBwYWNrZXQgY291bnQuCiAgKi8KIHUzMiBvY3Rlb25fZHJvcV9jaGVja19od19mb3JfcGt0cyhzdHJ1Y3Qgb2N0ZW9uX2Ryb3EgKmRyb3EpCiB7CiAJdTMyIHBrdF9jb3VudCA9IDA7CisJdTMyIGxhc3RfY291bnQ7CiAKIAlwa3RfY291bnQgPSByZWFkbChkcm9xLT5wa3RzX3NlbnRfcmVnKTsKLQlpZiAocGt0X2NvdW50KSB7Ci0JCWF0b21pY19hZGQocGt0X2NvdW50LCAmZHJvcS0+cGt0c19wZW5kaW5nKTsKLQkJd3JpdGVsKHBrdF9jb3VudCwgZHJvcS0+cGt0c19zZW50X3JlZyk7Ci0JfQogCi0JcmV0dXJuIHBrdF9jb3VudDsKKwlsYXN0X2NvdW50ID0gcGt0X2NvdW50IC0gZHJvcS0+cGt0X2NvdW50OworCWRyb3EtPnBrdF9jb3VudCA9IHBrdF9jb3VudDsKKworCS8qIHdlIHNoYWxsIHdyaXRlIHRvIGNudHMgIGF0IG5hcGkgaXJxIGVuYWJsZSBvciBlbmQgb2YgZHJvcSB0YXNrbGV0ICovCisJaWYgKGxhc3RfY291bnQpCisJCWF0b21pY19hZGQobGFzdF9jb3VudCwgJmRyb3EtPnBrdHNfcGVuZGluZyk7CisKKwlyZXR1cm4gbGFzdF9jb3VudDsKIH0KIAogc3RhdGljIHZvaWQgb2N0ZW9uX2Ryb3FfY29tcHV0ZV9tYXhfcGFja2V0X2J1ZnMoc3RydWN0IG9jdGVvbl9kcm9xICpkcm9xKQpAQCAtMjU5LDYgKzI2MywxMSBAQAogCQljX3BrdHNfcGVyX2ludHIgPSAodTMyKUNGR19HRVRfT1FfUEtUU19QRVJfSU5UUihjb25mNngpOwogCQljX3JlZmlsbF90aHJlc2hvbGQgPQogCQkJKHUzMilDRkdfR0VUX09RX1JFRklMTF9USFJFU0hPTEQoY29uZjZ4KTsKKwl9IGVsc2UgaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSkgeworCQlzdHJ1Y3Qgb2N0ZW9uX2NvbmZpZyAqY29uZjIzID0gQ0hJUF9GSUVMRChvY3QsIGNuMjN4eF9wZiwgY29uZik7CisKKwkJY19wa3RzX3Blcl9pbnRyID0gKHUzMilDRkdfR0VUX09RX1BLVFNfUEVSX0lOVFIoY29uZjIzKTsKKwkJY19yZWZpbGxfdGhyZXNob2xkID0gKHUzMilDRkdfR0VUX09RX1JFRklMTF9USFJFU0hPTEQoY29uZjIzKTsKIAl9IGVsc2UgewogCQlyZXR1cm4gMTsKIAl9CkBAIC01NjQsNyArNTczLDcgQEAKIAkJCSh1bnNpZ25lZCBpbnQpcmgtPnIub3Bjb2RlLAogCQkJKHVuc2lnbmVkIGludClyaC0+ci5zdWJjb2RlKTsKIAkJZHJvcS0+c3RhdHMuZHJvcHBlZF9ub2Rpc3BhdGNoKys7Ci0JfSAgICAgICAgICAgICAgICAgICAgICAgLyogZWxzZSAoZGlzcGF0Y2hfZm4gLi4uICovCisJfQogCiAJcmV0dXJuIGNudDsKIH0KQEAgLTczNSwxNiArNzQ0LDIwIEBACiAJdTMyIHBrdF9jb3VudCA9IDAsIHBrdHNfcHJvY2Vzc2VkID0gMDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICp0bXAsICp0bXAyOwogCisJLyogR3JhYiB0aGUgZHJvcSBsb2NrICovCisJc3Bpbl9sb2NrKCZkcm9xLT5sb2NrKTsKKworCW9jdGVvbl9kcm9xX2NoZWNrX2h3X2Zvcl9wa3RzKGRyb3EpOwogCXBrdF9jb3VudCA9IGF0b21pY19yZWFkKCZkcm9xLT5wa3RzX3BlbmRpbmcpOwotCWlmICghcGt0X2NvdW50KQorCisJaWYgKCFwa3RfY291bnQpIHsKKwkJc3Bpbl91bmxvY2soJmRyb3EtPmxvY2spOwogCQlyZXR1cm4gMDsKKwl9CiAKIAlpZiAocGt0X2NvdW50ID4gYnVkZ2V0KQogCQlwa3RfY291bnQgPSBidWRnZXQ7CiAKLQkvKiBHcmFiIHRoZSBkcm9xIGxvY2sgKi8KLQlzcGluX2xvY2soJmRyb3EtPmxvY2spOwotCiAJcGt0c19wcm9jZXNzZWQgPSBvY3Rlb25fZHJvcV9mYXN0X3Byb2Nlc3NfcGFja2V0cyhvY3QsIGRyb3EsIHBrdF9jb3VudCk7CiAKIAlhdG9taWNfc3ViKHBrdHNfcHJvY2Vzc2VkLCAmZHJvcS0+cGt0c19wZW5kaW5nKTsKQEAgLTc4OSw2ICs4MDIsOCBAQAogCXNwaW5fbG9jaygmZHJvcS0+bG9jayk7CiAKIAl3aGlsZSAodG90YWxfcGt0c19wcm9jZXNzZWQgPCBidWRnZXQpIHsKKwkJb2N0ZW9uX2Ryb3FfY2hlY2tfaHdfZm9yX3BrdHMoZHJvcSk7CisKIAkJcGt0c19hdmFpbGFibGUgPQogCQkJQ1ZNX01JTigoYnVkZ2V0IC0gdG90YWxfcGt0c19wcm9jZXNzZWQpLAogCQkJCSh1MzIpKGF0b21pY19yZWFkKCZkcm9xLT5wa3RzX3BlbmRpbmcpKSk7CkBAIC04MDMsOCArODE4LDYgQEAKIAkJYXRvbWljX3N1Yihwa3RzX3Byb2Nlc3NlZCwgJmRyb3EtPnBrdHNfcGVuZGluZyk7CiAKIAkJdG90YWxfcGt0c19wcm9jZXNzZWQgKz0gcGt0c19wcm9jZXNzZWQ7Ci0KLQkJb2N0ZW9uX2Ryb3FfY2hlY2tfaHdfZm9yX3BrdHMoZHJvcSk7CiAJfQogCiAJc3Bpbl91bmxvY2soJmRyb3EtPmxvY2spOwpAQCAtODc0LDggKzg4NywxMSBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAkJYnJlYWs7CisJCWNhc2UgT0NURU9OX0NOMjNYWF9QRl9WSUQ6IHsKKwkJCWxpb19lbmFibGVfaXJxKG9jdC0+ZHJvcVtxX25vXSwgb2N0LT5pbnN0cl9xdWV1ZVtxX25vXSk7CiAJCX0KLQorCQlicmVhazsKKwkJfQogCQlyZXR1cm4gMDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fZHJvcS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9kcm9xLmgKaW5kZXggNWE2ZmI5MS4uNWJlMDAyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9kcm9xLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9kcm9xLmgKQEAgLTI2MSw2ICsyNjEsOCBAQAogCiAJdTMyIHFfbm87CiAKKwl1MzIgcGt0X2NvdW50OworCiAJc3RydWN0IG9jdGVvbl9kcm9xX29wcyBvcHM7CiAKIAlzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0X2RldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25faXEuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25faXEuaAppbmRleCBmZjRiMWQ2Li5lNGQ0MjZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2lxLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9pcS5oCkBAIC04OCw2ICs4OCw4IEBACiAJLyoqIEEgc3BpbmxvY2sgdG8gcHJvdGVjdCB3aGlsZSBwb3N0aW5nIG9uIHRoZSByaW5nLiAgKi8KIAlzcGlubG9ja190IHBvc3RfbG9jazsKIAorCXUzMiBwa3RfaW5fZG9uZTsKKwogCS8qKiBBIHNwaW5sb2NrIHRvIHByb3RlY3QgYWNjZXNzIHRvIHRoZSBpbnB1dCByaW5nLiovCiAJc3BpbmxvY2tfdCBpcV9mbHVzaF9ydW5uaW5nX2xvY2s7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fbWFpbi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9tYWluLmgKaW5kZXggYmMxNGU0Yy4uMzY2Mjk4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9tYWluLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9tYWluLmgKQEAgLTM4LDEyICszOCwyNiBAQAogCiAjZGVmaW5lIERSVl9OQU1FICJMaXF1aWRJTyIKIAotLyoqCi0gKiBcYnJpZWYgZGV0ZXJtaW5lcyBpZiBhIGdpdmVuIGNvbnNvbGUgaGFzIGRlYnVnIGVuYWJsZWQuCi0gKiBAcGFyYW0gY29uc29sZSBjb25zb2xlIHRvIGNoZWNrCi0gKiBAcmV0dXJucyAgMSA9IGVuYWJsZWQuIDAgb3RoZXJ3aXNlCisvKiogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBieSBOSUMgZHJpdmVyIHRvIHN0b3JlIGluZm9ybWF0aW9uIHJlcXVpcmVkCisgKiB0byBmcmVlIHRoZSBza19idWZmIHdoZW4gdGhlIHBhY2tldCBoYXMgYmVlbiBmZXRjaGVkIGJ5IE9jdGVvbi4KKyAqIEJ5dGVzIG9mZnNldCBiZWxvdyBhc3N1bWUgd29yc3QtY2FzZSBvZiBhIDY0LWJpdCBzeXN0ZW0uCiAgKi8KLWludCBvY3Rlb25fY29uc29sZV9kZWJ1Z19lbmFibGVkKHUzMiBjb25zb2xlKTsKK3N0cnVjdCBvY3RuZXRfYnVmX2ZyZWVfaW5mbyB7CisJLyoqIEJ5dGVzIDEtOC4gIFBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2UgcHJpdmF0ZSBzdHJ1Y3R1cmUuICovCisJc3RydWN0IGxpbyAqbGlvOworCisJLyoqIEJ5dGVzIDktMTYuICBQb2ludGVyIHRvIHNrX2J1ZmYuICovCisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCS8qKiBCeXRlcyAxNy0yNC4gIFBvaW50ZXIgdG8gZ2F0aGVyIGxpc3QuICovCisJc3RydWN0IG9jdG5pY19nYXRoZXIgKmc7CisKKwkvKiogQnl0ZXMgMjUtMzIuIFBoeXNpY2FsIGFkZHJlc3Mgb2Ygc2tiLT5kYXRhIG9yIGdhdGhlciBsaXN0LiAqLworCXU2NCBkcHRyOworCisJLyoqIEJ5dGVzIDMzLTQ3LiBQaWdneWJhY2tlZCBzb2Z0IGNvbW1hbmQsIGlmIGFueSAqLworCXN0cnVjdCBvY3Rlb25fc29mdF9jb21tYW5kICpzYzsKK307CiAKIC8qIEJRTC1yZWxhdGVkIGZ1bmN0aW9ucyAqLwogdm9pZCBvY3Rlb25fcmVwb3J0X3NlbnRfYnl0ZXNfdG9fYnFsKHZvaWQgKmJ1ZiwgaW50IHJlcXR5cGUpOwpAQCAtMTY3LDIyICsxODEsMjYgQEAKICNkZWZpbmUgY25uaWNfZnJlZV9hbGlnbmVkX2RtYShwY2lfZGV2LCBwdHIsIHNpemUsIG9yaWdfcHRyLCBkbWFfYWRkcikgXAogCQlmcmVlX3BhZ2VzKG9yaWdfcHRyLCBnZXRfb3JkZXIoc2l6ZSkpCiAKLXN0YXRpYyBpbmxpbmUgdm9pZAorc3RhdGljIGlubGluZSBpbnQKIHNsZWVwX2NvbmQod2FpdF9xdWV1ZV9oZWFkX3QgKndhaXRfcXVldWUsIGludCAqY29uZGl0aW9uKQogeworCWludCBlcnJubyA9IDA7CiAJd2FpdF9xdWV1ZV90IHdlOwogCiAJaW5pdF93YWl0cXVldWVfZW50cnkoJndlLCBjdXJyZW50KTsKIAlhZGRfd2FpdF9xdWV1ZSh3YWl0X3F1ZXVlLCAmd2UpOwogCXdoaWxlICghKFJFQURfT05DRSgqY29uZGl0aW9uKSkpIHsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCWVycm5vID0gLUVJTlRSOwogCQkJZ290byBvdXQ7CisJCX0KIAkJc2NoZWR1bGUoKTsKIAl9CiBvdXQ6CiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAlyZW1vdmVfd2FpdF9xdWV1ZSh3YWl0X3F1ZXVlLCAmd2UpOworCXJldHVybiBlcnJubzsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX21lbV9vcHMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fbWVtX29wcy5jCmluZGV4IDk1YTRiYmUuLjBkYzA4MWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fbWVtX29wcy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fbWVtX29wcy5jCkBAIC0xOSw3ICsxOSw2IEBACiAgKiBUaGlzIGZpbGUgbWF5IGFsc28gYmUgYXZhaWxhYmxlIHVuZGVyIGEgZGlmZmVyZW50IGxpY2Vuc2UgZnJvbSBDYXZpdW0uCiAgKiBDb250YWN0IENhdml1bSwgSW5jLiBmb3IgbW9yZSBpbmZvcm1hdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSAibGlxdWlkaW9fY29tbW9uLmgiCiAjaW5jbHVkZSAib2N0ZW9uX2Ryb3EuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fbmV0d29yay5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9uZXR3b3JrLmgKaW5kZXggZmI4MjBkYy4uZTVkMWRlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9uZXR3b3JrLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9uZXR3b3JrLmgKQEAgLTI2LDggKzI2LDYgQEAKIAogI2lmbmRlZiBfX09DVEVPTl9ORVRXT1JLX0hfXwogI2RlZmluZSBfX09DVEVPTl9ORVRXT1JLX0hfXwotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cF9jbG9ja19rZXJuZWwuaD4KIAogI2RlZmluZSBMSU9fTUFYX01UVV9TSVpFIChPQ1RORVRfTUFYX0ZSTV9TSVpFIC0gT0NUTkVUX0ZSTV9IRUFERVJfU0laRSkKQEAgLTEyNCwxMSArMTIyLDIxIEBACiAKIAkvKiB3b3JrIHF1ZXVlIGZvciAgdHhxIHN0YXR1cyAqLwogCXN0cnVjdCBjYXZpdW1fd3EJdHhxX3N0YXR1c193cTsKKworCS8qIHdvcmsgcXVldWUgZm9yICBsaW5rIHN0YXR1cyAqLworCXN0cnVjdCBjYXZpdW1fd3EJbGlua19zdGF0dXNfd3E7CisKIH07CiAKICNkZWZpbmUgTElPX1NJWkUgICAgICAgICAoc2l6ZW9mKHN0cnVjdCBsaW8pKQogI2RlZmluZSBHRVRfTElPKG5ldGRldikgICgoc3RydWN0IGxpbyAqKW5ldGRldl9wcml2KG5ldGRldikpCiAKKyNkZWZpbmUgQ0lVM19XRE9HKGMpICAgICAgICAgICAgICAgICAoMHgxMDEwMDAwMDIwMDAwVUxMICsgKGMgPDwgMykpCisjZGVmaW5lIENJVTNfV0RPR19NQVNLICAgICAgICAgICAgICAgMTJVTEwKKyNkZWZpbmUgTElPX01PTklUT1JfV0RPR19FWFBJUkUgICAgICAxCisjZGVmaW5lIExJT19NT05JVE9SX0NPUkVfU1RVQ0tfTVNHRCAgMgorI2RlZmluZSBMSU9fTUFYX0NPUkVTICAgICAgICAgICAgICAgIDEyCisKIC8qKgogICogXGJyaWVmIEVuYWJsZSBvciBkaXNhYmxlIGZlYXR1cmUKICAqIEBwYXJhbSBuZXRkZXYgICAgcG9pbnRlciB0byBuZXR3b3JrIGRldmljZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9uaWMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fbmljLmMKaW5kZXggMTY2NzI3Yi4uNDBhYzFmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9uaWMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX25pYy5jCkBAIC0xOSw3ICsxOSw2IEBACiAgKiBUaGlzIGZpbGUgbWF5IGFsc28gYmUgYXZhaWxhYmxlIHVuZGVyIGEgZGlmZmVyZW50IGxpY2Vuc2UgZnJvbSBDYXZpdW0uCiAgKiBDb250YWN0IENhdml1bSwgSW5jLiBmb3IgbW9yZSBpbmZvcm1hdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSAibGlxdWlkaW9fY29tbW9uLmgiCkBAIC0zNiw2ICszNSw3IEBACiAJCQkgICAgICAgdTMyCQkgICAgICAgcmRhdGFzaXplKQogewogCXN0cnVjdCBvY3Rlb25fc29mdF9jb21tYW5kICpzYzsKKwlzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2loMyAgKmloMzsKIAlzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2loMiAgKmloMjsKIAlzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2lyaCAqaXJoOwogCXN0cnVjdCBvY3Rlb25faW5zdHJfcmRwICpyZHA7CkBAIC01MiwxMCArNTIsMTkgQEAKIAkvKiBBZGQgaW4gdGhlIHJlc3BvbnNlIHJlbGF0ZWQgZmllbGRzLiBPcGNvZGUgYW5kIFBhcmFtIGFyZSBhbHJlYWR5CiAJICogdGhlcmUuCiAJICovCi0JaWgyICAgICAgPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9paDIgKikmc2MtPmNtZC5jbWQyLmloMjsKLQlyZHAgICAgID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfcmRwICopJnNjLT5jbWQuY21kMi5yZHA7Ci0JaXJoICAgICA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2lyaCAqKSZzYy0+Y21kLmNtZDIuaXJoOwotCWloMi0+ZnN6ID0gNDA7IC8qIGlyaCArIG9zc3BbMF0gKyBvc3NwWzFdICsgcmRwICsgcnB0ciA9IDQwIGJ5dGVzICovCisJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSkgeworCQlpaDMgICAgICA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2loMyAqKSZzYy0+Y21kLmNtZDMuaWgzOworCQlyZHAgICAgID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfcmRwICopJnNjLT5jbWQuY21kMy5yZHA7CisJCWlyaCAgICAgPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9pcmggKikmc2MtPmNtZC5jbWQzLmlyaDsKKwkJLypwa2lpaDMgKyBpcmggKyBvc3NwWzBdICsgb3NzcFsxXSArIHJkcCArIHJwdHIgPSA0MCBieXRlcyAqLworCQlpaDMtPmZzeiA9IExJT19TT0ZUQ01EUkVTUF9JSDM7CisJfSBlbHNlIHsKKwkJaWgyICAgICAgPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9paDIgKikmc2MtPmNtZC5jbWQyLmloMjsKKwkJcmRwICAgICA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX3JkcCAqKSZzYy0+Y21kLmNtZDIucmRwOworCQlpcmggICAgID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfaXJoICopJnNjLT5jbWQuY21kMi5pcmg7CisJCS8qIGlyaCArIG9zc3BbMF0gKyBvc3NwWzFdICsgcmRwICsgcnB0ciA9IDQwIGJ5dGVzICovCisJCWloMi0+ZnN6ID0gTElPX1NPRlRDTURSRVNQX0lIMjsKKwl9CiAKIAlpcmgtPnJmbGFnID0gMTsgLyogYSByZXNwb25zZSBpcyByZXF1aXJlZCAqLwogCkBAIC02NCw3ICs3MywxMCBAQAogCiAJKnNjLT5zdGF0dXNfd29yZCA9IENPTVBMRVRJT05fV09SRF9JTklUOwogCi0Jc2MtPmNtZC5jbWQyLnJwdHIgPSAgc2MtPmRtYXJwdHI7CisJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSkKKwkJc2MtPmNtZC5jbWQzLnJwdHIgPSAgc2MtPmRtYXJwdHI7CisJZWxzZQorCQlzYy0+Y21kLmNtZDIucnB0ciA9ICBzYy0+ZG1hcnB0cjsKIAogCXNjLT53YWl0X3RpbWUgPSAxMDAwOwogCXNjLT50aW1lb3V0ID0gamlmZmllcyArIHNjLT53YWl0X3RpbWU7CkBAIC03MywxMiArODUsOSBAQAogfQogCiBpbnQgb2N0bmV0X3NlbmRfbmljX2RhdGFfcGt0KHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsCi0JCQkgICAgIHN0cnVjdCBvY3RuaWNfZGF0YV9wa3QgKm5kYXRhLAotCQkJICAgICB1MzIgeG1pdF9tb3JlKQorCQkJICAgICBzdHJ1Y3Qgb2N0bmljX2RhdGFfcGt0ICpuZGF0YSkKIHsKLQlpbnQgcmluZ19kb29yYmVsbDsKLQotCXJpbmdfZG9vcmJlbGwgPSAheG1pdF9tb3JlOworCWludCByaW5nX2Rvb3JiZWxsID0gMTsKIAogCXJldHVybiBvY3Rlb25fc2VuZF9jb21tYW5kKG9jdCwgbmRhdGEtPnFfbm8sIHJpbmdfZG9vcmJlbGwsICZuZGF0YS0+Y21kLAogCQkJCSAgIG5kYXRhLT5idWYsIG5kYXRhLT5kYXRhc2l6ZSwKQEAgLTE4Myw4ICsxOTIsOCBAQAogCXJldHZhbCA9IG9jdGVvbl9zZW5kX3NvZnRfY29tbWFuZChvY3QsIHNjKTsKIAlpZiAocmV0dmFsID09IElRX1NFTkRfRkFJTEVEKSB7CiAJCW9jdGVvbl9mcmVlX3NvZnRfY29tbWFuZChvY3QsIHNjKTsKLQkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyBzb2Z0IGNvbW1hbmQ6JWQgc2VuZCBmYWlsZWQgc3RhdHVzOiAleFxuIiwKLQkJCV9fZnVuY19fLCBuY3RybC0+bmNtZC5zLmNtZCwgcmV0dmFsKTsKKwkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyBwZl9udW06JWQgc29mdCBjb21tYW5kOiVkIHNlbmQgZmFpbGVkIHN0YXR1czogJXhcbiIsCisJCQlfX2Z1bmNfXywgb2N0LT5wZl9udW0sIG5jdHJsLT5uY21kLnMuY21kLCByZXR2YWwpOwogCQlzcGluX3VubG9ja19iaCgmb2N0LT5jbWRfcmVzcF93cWxvY2spOwogCQlyZXR1cm4gLTE7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9uaWMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fbmljLmgKaW5kZXggYjcxYTJiYi4uNGI4ZGE2N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fbmljLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9uaWMuaApAQCAtMTM4LDcgKzEzOCw3IEBACiAJLyogYXNzdW1lIHRoYXQgcmZsYWcgaXMgY2xlYXJlZCBzbyB0aGVyZWZvcmUgZnJvbnQgZGF0YSB3aWxsIG9ubHkgaGF2ZQogCSAqIGlyaCBhbmQgb3NzcFswXSwgb3NzcFsxXSBmb3IgYSB0b3RhbCBvZiAzMiBieXRlcwogCSAqLwotCWloMi0+ZnN6ID0gMjQ7CisJaWgyLT5mc3ogPSBMSU9fUENJQ01EX08yOwogCiAJaWgyLT50YWd0eXBlID0gT1JERVJFRF9UQUc7CiAJaWgyLT5ncnAgPSBERUZBVUxUX1BPV19HUlA7CkBAIC0xOTYsNyArMTk2LDcgQEAKIAkgKi8KIAlpaDMtPnBraW5kICAgICAgID0gb2N0LT5pbnN0cl9xdWV1ZVtzZXR1cC0+cy5pcV9ub10tPnR4cGNpcS5zLnBraW5kOwogCS8qUEtJIElIKi8KLQlpaDMtPmZzeiA9IDI0ICsgODsKKwlpaDMtPmZzeiA9IExJT19QQ0lDTURfTzM7CiAKIAlpZiAoIXNldHVwLT5zLmdhdGhlcikgewogCQlpaDMtPmRsZW5nc3ogPSBzZXR1cC0+cy51LmRhdGFzaXplOwpAQCAtMjc4LDcgKzI3OCw3IEBACiAgKiBxdWV1ZSBzaG91bGQgYmUgc3RvcHBlZCwgYW5kIElRX1NFTkRfT0sgaWYgaXQgc2VudCBva2F5LgogICovCiBpbnQgb2N0bmV0X3NlbmRfbmljX2RhdGFfcGt0KHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsCi0JCQkgICAgIHN0cnVjdCBvY3RuaWNfZGF0YV9wa3QgKm5kYXRhLCB1MzIgeG1pdF9tb3JlKTsKKwkJCSAgICAgc3RydWN0IG9jdG5pY19kYXRhX3BrdCAqbmRhdGEpOwogCiAvKiogU2VuZCBhIE5JQyBjb250cm9sIHBhY2tldCB0byB0aGUgZGV2aWNlCiAgKiBAcGFyYW0gb2N0IC0gb2N0ZW9uIGRldmljZSBwb2ludGVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vcmVxdWVzdF9tYW5hZ2VyLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vcmVxdWVzdF9tYW5hZ2VyLmMKaW5kZXggZDMyNDkyZjEuLjkwODY2YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9yZXF1ZXN0X21hbmFnZXIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vcmVxdWVzdF9tYW5hZ2VyLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlICJvY3Rlb25fbWFpbi5oIgogI2luY2x1ZGUgIm9jdGVvbl9uZXR3b3JrLmgiCiAjaW5jbHVkZSAiY242Nnh4X2RldmljZS5oIgorI2luY2x1ZGUgImNuMjN4eF9wZl9kZXZpY2UuaCIKIAogI2RlZmluZSBJTkNSX0lOU1RSUVVFVUVfUEtUX0NPVU5UKG9jdGVvbl9kZXZfcHRyLCBpcV9ubywgZmllbGQsIGNvdW50KSAgXAogCShvY3Rlb25fZGV2X3B0ci0+aW5zdHJfcXVldWVbaXFfbm9dLT5zdGF0cy5maWVsZCArPSBjb3VudCkKQEAgLTcxLDcgKzcyLDggQEAKIAogCWlmIChPQ1RFT05fQ042WFhYKG9jdCkpCiAJCWNvbmYgPSAmKENGR19HRVRfSVFfQ0ZHKENISVBfRklFTEQob2N0LCBjbjZ4eHgsIGNvbmYpKSk7Ci0KKwllbHNlIGlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkpCisJCWNvbmYgPSAmKENGR19HRVRfSVFfQ0ZHKENISVBfRklFTEQob2N0LCBjbjIzeHhfcGYsIGNvbmYpKSk7CiAJaWYgKCFjb25mKSB7CiAJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiVW5zdXBwb3J0ZWQgQ2hpcCAleFxuIiwKIAkJCW9jdC0+Y2hpcF9pZCk7CkBAIC04OCw2ICs5MCw3IEBACiAJcV9zaXplID0gKHUzMiljb25mLT5pbnN0cl90eXBlICogbnVtX2Rlc2NzOwogCiAJaXEgPSBvY3QtPmluc3RyX3F1ZXVlW2lxX25vXTsKKwogCWlxLT5vY3RfZGV2ID0gb2N0OwogCiAJc2V0X2Rldl9ub2RlKCZvY3QtPnBjaV9kZXYtPmRldiwgbnVtYV9ub2RlKTsKQEAgLTE4MSw2ICsxODQsOSBAQAogCWlmIChPQ1RFT05fQ042WFhYKG9jdCkpCiAJCWRlc2Nfc2l6ZSA9CiAJCSAgICBDRkdfR0VUX0lRX0lOU1RSX1RZUEUoQ0hJUF9GSUVMRChvY3QsIGNuNnh4eCwgY29uZikpOworCWVsc2UgaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSkKKwkJZGVzY19zaXplID0KKwkJICAgIENGR19HRVRfSVFfSU5TVFJfVFlQRShDSElQX0ZJRUxEKG9jdCwgY24yM3h4X3BmLCBjb25mKSk7CiAKIAl2ZnJlZShpcS0+cmVxdWVzdF9saXN0KTsKIApAQCAtMzgzLDcgKzM4OSwxMiBAQAogCQljYXNlIFJFUVRZUEVfU09GVF9DT01NQU5EOgogCQkJc2MgPSBidWY7CiAKLQkJCWlyaCA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2lyaCAqKSZzYy0+Y21kLmNtZDIuaXJoOworCQkJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSkKKwkJCQlpcmggPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9pcmggKikKKwkJCQkJJnNjLT5jbWQuY21kMy5pcmg7CisJCQllbHNlCisJCQkJaXJoID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfaXJoICopCisJCQkJCSZzYy0+Y21kLmNtZDIuaXJoOwogCQkJaWYgKGlyaC0+cmZsYWcpIHsKIAkJCQkvKiBXZSdyZSBleHBlY3RpbmcgYSByZXNwb25zZSBmcm9tIE9jdGVvbi4KIAkJCQkgKiBJdCdzIHVwIHRvIGxpb19wcm9jZXNzX29yZGVyZWRfbGlzdCgpIHRvCkBAIC00OTksNiArNTEwLDcgQEAKIAogCWlmICghb2N0KQogCQlyZXR1cm47CisKIAlpcSA9IG9jdC0+aW5zdHJfcXVldWVbaXFfbm9dOwogCWlmICghaXEpCiAJCXJldHVybjsKQEAgLTUxNCw2ICs1MjYsOCBAQAogCiAJLyogRmx1c2ggdGhlIGluc3RydWN0aW9uIHF1ZXVlICovCiAJb2N0ZW9uX2ZsdXNoX2lxKG9jdCwgaXEsIDEsIDApOworCisJbGlvX2VuYWJsZV9pcnEoTlVMTCwgaXEpOwogfQogCiAvKiBDYWxsZWQgYnkgdGhlIFBvbGwgdGhyZWFkIGF0IHJlZ3VsYXIgaW50ZXJ2YWxzIHRvIGNoZWNrIHRoZSBpbnN0cnVjdGlvbgpAQCAtNTgwLDYgKzU5NCw4IEBACiB7CiAJc3RydWN0IG9jdGVvbl9jb25maWcgKm9jdF9jZmc7CiAJc3RydWN0IG9jdGVvbl9pbnN0cl9paDIgKmloMjsKKwlzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2loMyAqaWgzOworCXN0cnVjdCBvY3Rlb25faW5zdHJfcGtpX2loMyAqcGtpX2loMzsKIAlzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2lyaCAqaXJoOwogCXN0cnVjdCBvY3Rlb25faW5zdHJfcmRwICpyZHA7CiAKQEAgLTU4OCwzNiArNjA0LDg4IEBACiAKIAlvY3RfY2ZnID0gb2N0ZW9uX2dldF9jb25mKG9jdCk7CiAKLQlpaDIgICAgICAgICAgPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9paDIgKikmc2MtPmNtZC5jbWQyLmloMjsKLQlpaDItPnRhZ3R5cGUgPSBBVE9NSUNfVEFHOwotCWloMi0+dGFnICAgICA9IExJT19DT05UUk9MOwotCWloMi0+cmF3ICAgICA9IDE7Ci0JaWgyLT5ncnAgICAgID0gQ0ZHX0dFVF9DVFJMX1FfR1JQKG9jdF9jZmcpOworCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkpIHsKKwkJaWgzID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfaWgzICopJnNjLT5jbWQuY21kMy5paDM7CiAKLQlpZiAoc2MtPmRhdGFzaXplKSB7Ci0JCWloMi0+ZGxlbmdzeiA9IHNjLT5kYXRhc2l6ZTsKLQkJaWgyLT5ycyA9IDE7Ci0JfQorCQlpaDMtPnBraW5kID0gb2N0LT5pbnN0cl9xdWV1ZVtzYy0+aXFfbm9dLT50eHBjaXEucy5wa2luZDsKIAotCWlyaCAgICAgICAgICAgID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfaXJoICopJnNjLT5jbWQuY21kMi5pcmg7Ci0JaXJoLT5vcGNvZGUgICAgPSBvcGNvZGU7Ci0JaXJoLT5zdWJjb2RlICAgPSBzdWJjb2RlOworCQlwa2lfaWgzID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfcGtpX2loMyAqKSZzYy0+Y21kLmNtZDMucGtpX2loMzsKIAotCS8qIG9wY29kZS9zdWJjb2RlIHNwZWNpZmljIHBhcmFtZXRlcnMgKG9zc3ApICovCi0JaXJoLT5vc3NwICAgICAgID0gaXJoX29zc3A7Ci0Jc2MtPmNtZC5jbWQyLm9zc3BbMF0gPSBvc3NwMDsKLQlzYy0+Y21kLmNtZDIub3NzcFsxXSA9IG9zc3AxOworCQlwa2lfaWgzLT53ICAgICAgICAgICA9IDE7CisJCXBraV9paDMtPnJhdyAgICAgICAgID0gMTsKKwkJcGtpX2loMy0+dXRhZyAgICAgICAgPSAxOworCQlwa2lfaWgzLT51cXBnICAgICAgICA9CisJCQlvY3QtPmluc3RyX3F1ZXVlW3NjLT5pcV9ub10tPnR4cGNpcS5zLnVzZV9xcGc7CisJCXBraV9paDMtPnV0dCAgICAgICAgID0gMTsKKwkJcGtpX2loMy0+dGFnICAgICA9IExJT19DT05UUk9MOworCQlwa2lfaWgzLT50YWd0eXBlID0gQVRPTUlDX1RBRzsKKwkJcGtpX2loMy0+cXBnICAgICAgICAgPQorCQkJb2N0LT5pbnN0cl9xdWV1ZVtzYy0+aXFfbm9dLT50eHBjaXEucy5xcGc7CisJCXBraV9paDMtPnBtICAgICAgICAgID0gMHg3OworCQlwa2lfaWgzLT5zbCAgICAgICAgICA9IDg7CiAKLQlpZiAoc2MtPnJkYXRhc2l6ZSkgewotCQlyZHAgPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9yZHAgKikmc2MtPmNtZC5jbWQyLnJkcDsKLQkJcmRwLT5wY2llX3BvcnQgPSBvY3QtPnBjaWVfcG9ydDsKLQkJcmRwLT5ybGVuICAgICAgPSBzYy0+cmRhdGFzaXplOworCQlpZiAoc2MtPmRhdGFzaXplKQorCQkJaWgzLT5kbGVuZ3N6ID0gc2MtPmRhdGFzaXplOwogCi0JCWlyaC0+cmZsYWcgPSAgMTsKLQkJaWgyLT5mc3ogICA9IDQwOyAvKiBpcmgrb3NzcFswXStvc3NwWzFdK3JkcCtycHRyID0gNDAgYnl0ZXMgKi8KKwkJaXJoICAgICAgICAgICAgPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9pcmggKikmc2MtPmNtZC5jbWQzLmlyaDsKKwkJaXJoLT5vcGNvZGUgICAgPSBvcGNvZGU7CisJCWlyaC0+c3ViY29kZSAgID0gc3ViY29kZTsKKworCQkvKiBvcGNvZGUvc3ViY29kZSBzcGVjaWZpYyBwYXJhbWV0ZXJzIChvc3NwKSAqLworCQlpcmgtPm9zc3AgICAgICAgPSBpcmhfb3NzcDsKKwkJc2MtPmNtZC5jbWQzLm9zc3BbMF0gPSBvc3NwMDsKKwkJc2MtPmNtZC5jbWQzLm9zc3BbMV0gPSBvc3NwMTsKKworCQlpZiAoc2MtPnJkYXRhc2l6ZSkgeworCQkJcmRwID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfcmRwICopJnNjLT5jbWQuY21kMy5yZHA7CisJCQlyZHAtPnBjaWVfcG9ydCA9IG9jdC0+cGNpZV9wb3J0OworCQkJcmRwLT5ybGVuICAgICAgPSBzYy0+cmRhdGFzaXplOworCisJCQlpcmgtPnJmbGFnID0gIDE7CisJCQkvKlBLSSBJSDMqLworCQkJLyogcGtpX2loMyBpcmgrb3NzcFswXStvc3NwWzFdK3JkcCtycHRyID0gNDggYnl0ZXMgKi8KKwkJCWloMy0+ZnN6ICAgID0gTElPX1NPRlRDTURSRVNQX0lIMzsKKwkJfSBlbHNlIHsKKwkJCWlyaC0+cmZsYWcgPSAgMDsKKwkJCS8qUEtJIElIMyovCisJCQkvKiBwa2lfaDMgKyBpcmggKyBvc3NwWzBdICsgb3NzcFsxXSA9IDMyIGJ5dGVzICovCisJCQlpaDMtPmZzeiAgICA9IExJT19QQ0lDTURfTzM7CisJCX0KKwogCX0gZWxzZSB7Ci0JCWlyaC0+cmZsYWcgPSAgMDsKLQkJaWgyLT5mc3ogICA9IDI0OyAvKiBpcmggKyBvc3NwWzBdICsgb3NzcFsxXSA9IDI0IGJ5dGVzICovCisJCWloMiAgICAgICAgICA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2loMiAqKSZzYy0+Y21kLmNtZDIuaWgyOworCQlpaDItPnRhZ3R5cGUgPSBBVE9NSUNfVEFHOworCQlpaDItPnRhZyAgICAgPSBMSU9fQ09OVFJPTDsKKwkJaWgyLT5yYXcgICAgID0gMTsKKwkJaWgyLT5ncnAgICAgID0gQ0ZHX0dFVF9DVFJMX1FfR1JQKG9jdF9jZmcpOworCisJCWlmIChzYy0+ZGF0YXNpemUpIHsKKwkJCWloMi0+ZGxlbmdzeiA9IHNjLT5kYXRhc2l6ZTsKKwkJCWloMi0+cnMgPSAxOworCQl9CisKKwkJaXJoICAgICAgICAgICAgPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9pcmggKikmc2MtPmNtZC5jbWQyLmlyaDsKKwkJaXJoLT5vcGNvZGUgICAgPSBvcGNvZGU7CisJCWlyaC0+c3ViY29kZSAgID0gc3ViY29kZTsKKworCQkvKiBvcGNvZGUvc3ViY29kZSBzcGVjaWZpYyBwYXJhbWV0ZXJzIChvc3NwKSAqLworCQlpcmgtPm9zc3AgICAgICAgPSBpcmhfb3NzcDsKKwkJc2MtPmNtZC5jbWQyLm9zc3BbMF0gPSBvc3NwMDsKKwkJc2MtPmNtZC5jbWQyLm9zc3BbMV0gPSBvc3NwMTsKKworCQlpZiAoc2MtPnJkYXRhc2l6ZSkgeworCQkJcmRwID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfcmRwICopJnNjLT5jbWQuY21kMi5yZHA7CisJCQlyZHAtPnBjaWVfcG9ydCA9IG9jdC0+cGNpZV9wb3J0OworCQkJcmRwLT5ybGVuICAgICAgPSBzYy0+cmRhdGFzaXplOworCisJCQlpcmgtPnJmbGFnID0gIDE7CisJCQkvKiBpcmgrb3NzcFswXStvc3NwWzFdK3JkcCtycHRyID0gNDAgYnl0ZXMgKi8KKwkJCWloMi0+ZnN6ICAgPSBMSU9fU09GVENNRFJFU1BfSUgyOworCQl9IGVsc2UgeworCQkJaXJoLT5yZmxhZyA9ICAwOworCQkJLyogaXJoICsgb3NzcFswXSArIG9zc3BbMV0gPSAyNCBieXRlcyAqLworCQkJaWgyLT5mc3ogICA9IExJT19QQ0lDTURfTzI7CisJCX0KIAl9CiB9CiAKQEAgLTYyNSwyMyArNjkzLDM5IEBACiAJCQkgICAgIHN0cnVjdCBvY3Rlb25fc29mdF9jb21tYW5kICpzYykKIHsKIAlzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2loMiAqaWgyOworCXN0cnVjdCBvY3Rlb25faW5zdHJfaWgzICppaDM7CiAJc3RydWN0IG9jdGVvbl9pbnN0cl9pcmggKmlyaDsKIAl1MzIgbGVuOwogCi0JaWgyID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfaWgyICopJnNjLT5jbWQuY21kMi5paDI7Ci0JaWYgKGloMi0+ZGxlbmdzeikgewotCQlXQVJOX09OKCFzYy0+ZG1hZHB0cik7Ci0JCXNjLT5jbWQuY21kMi5kcHRyID0gc2MtPmRtYWRwdHI7CisJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSkgeworCQlpaDMgPSAgKHN0cnVjdCBvY3Rlb25faW5zdHJfaWgzICopJnNjLT5jbWQuY21kMy5paDM7CisJCWlmIChpaDMtPmRsZW5nc3opIHsKKwkJCVdBUk5fT04oIXNjLT5kbWFkcHRyKTsKKwkJCXNjLT5jbWQuY21kMy5kcHRyID0gc2MtPmRtYWRwdHI7CisJCX0KKwkJaXJoID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfaXJoICopJnNjLT5jbWQuY21kMy5pcmg7CisJCWlmIChpcmgtPnJmbGFnKSB7CisJCQlXQVJOX09OKCFzYy0+ZG1hcnB0cik7CisJCQlXQVJOX09OKCFzYy0+c3RhdHVzX3dvcmQpOworCQkJKnNjLT5zdGF0dXNfd29yZCA9IENPTVBMRVRJT05fV09SRF9JTklUOworCQkJc2MtPmNtZC5jbWQzLnJwdHIgPSBzYy0+ZG1hcnB0cjsKKwkJfQorCQlsZW4gPSAodTMyKWloMy0+ZGxlbmdzejsKKwl9IGVsc2UgeworCQlpaDIgPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9paDIgKikmc2MtPmNtZC5jbWQyLmloMjsKKwkJaWYgKGloMi0+ZGxlbmdzeikgeworCQkJV0FSTl9PTighc2MtPmRtYWRwdHIpOworCQkJc2MtPmNtZC5jbWQyLmRwdHIgPSBzYy0+ZG1hZHB0cjsKKwkJfQorCQlpcmggPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9pcmggKikmc2MtPmNtZC5jbWQyLmlyaDsKKwkJaWYgKGlyaC0+cmZsYWcpIHsKKwkJCVdBUk5fT04oIXNjLT5kbWFycHRyKTsKKwkJCVdBUk5fT04oIXNjLT5zdGF0dXNfd29yZCk7CisJCQkqc2MtPnN0YXR1c193b3JkID0gQ09NUExFVElPTl9XT1JEX0lOSVQ7CisJCQlzYy0+Y21kLmNtZDIucnB0ciA9IHNjLT5kbWFycHRyOworCQl9CisJCWxlbiA9ICh1MzIpaWgyLT5kbGVuZ3N6OwogCX0KLQlpcmggPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9pcmggKikmc2MtPmNtZC5jbWQyLmlyaDsKLQlpZiAoaXJoLT5yZmxhZykgewotCQlXQVJOX09OKCFzYy0+ZG1hcnB0cik7Ci0JCVdBUk5fT04oIXNjLT5zdGF0dXNfd29yZCk7Ci0JCSpzYy0+c3RhdHVzX3dvcmQgPSBDT01QTEVUSU9OX1dPUkRfSU5JVDsKLQotCQlzYy0+Y21kLmNtZDIucnB0ciA9IHNjLT5kbWFycHRyOwotCX0KLQlsZW4gPSAodTMyKWloMi0+ZGxlbmdzejsKIAogCWlmIChzYy0+d2FpdF90aW1lKQogCQlzYy0+dGltZW91dCA9IGppZmZpZXMgKyBzYy0+d2FpdF90aW1lOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL3Jlc3BvbnNlX21hbmFnZXIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9yZXNwb25zZV9tYW5hZ2VyLmMKaW5kZXggNzA5MDQ5ZS4uYmU1MjE3OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9yZXNwb25zZV9tYW5hZ2VyLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL3Jlc3BvbnNlX21hbmFnZXIuYwpAQCAtOTEsOCArOTEsMTMgQEAKIAogCQlzYyA9IChzdHJ1Y3Qgb2N0ZW9uX3NvZnRfY29tbWFuZCAqKW9yZGVyZWRfc2NfbGlzdC0+CiAJCSAgICBoZWFkLm5leHQ7Ci0JCXJkcCA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX3JkcCAqKSZzYy0+Y21kLmNtZDIucmRwOwotCQlycHRyID0gc2MtPmNtZC5jbWQyLnJwdHI7CisJCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdGVvbl9kZXYpKSB7CisJCQlyZHAgPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9yZHAgKikmc2MtPmNtZC5jbWQzLnJkcDsKKwkJCXJwdHIgPSBzYy0+Y21kLmNtZDMucnB0cjsKKwkJfSBlbHNlIHsKKwkJCXJkcCA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX3JkcCAqKSZzYy0+Y21kLmNtZDIucmRwOworCQkJcnB0ciA9IHNjLT5jbWQuY21kMi5ycHRyOworCQl9CiAKIAkJc3RhdHVzID0gT0NURU9OX1JFUVVFU1RfUEVORElORzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9NYWtlZmlsZQppbmRleCA1YzQ2MTVjLi42YjRkNGFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9NYWtlZmlsZQpAQCAtMiw2ICsyLDcgQEAKICMgTWFrZWZpbGUgZm9yIENhdml1bSdzIFRodW5kZXIgZXRoZXJuZXQgZGV2aWNlCiAjCiAKK29iai0kKENPTkZJR19USFVOREVSX05JQ19SR1gpICs9IHRodW5kZXJfeGN2Lm8KIG9iai0kKENPTkZJR19USFVOREVSX05JQ19CR1gpICs9IHRodW5kZXJfYmd4Lm8KIG9iai0kKENPTkZJR19USFVOREVSX05JQ19QRikgKz0gbmljcGYubwogb2JqLSQoQ09ORklHX1RIVU5ERVJfTklDX1ZGKSArPSBuaWN2Zi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pYy5oCmluZGV4IDgzMDI1YmIuLjMwNDI2MTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pYy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pYy5oCkBAIC0yMCw2ICsyMCwxNyBAQAogI2RlZmluZQlQQ0lfREVWSUNFX0lEX1RIVU5ERVJfTklDX1ZGCQkweEEwMzQKICNkZWZpbmUJUENJX0RFVklDRV9JRF9USFVOREVSX0JHWAkJMHhBMDI2CiAKKy8qIFN1YnN5c3RlbSBkZXZpY2UgSURzICovCisjZGVmaW5lIFBDSV9TVUJTWVNfREVWSURfODhYWF9OSUNfUEYJCTB4QTExRQorI2RlZmluZSBQQ0lfU1VCU1lTX0RFVklEXzgxWFhfTklDX1BGCQkweEEyMUUKKyNkZWZpbmUgUENJX1NVQlNZU19ERVZJRF84M1hYX05JQ19QRgkJMHhBMzFFCisKKyNkZWZpbmUgUENJX1NVQlNZU19ERVZJRF84OFhYX1BBU1MxX05JQ19WRgkweEExMUUKKyNkZWZpbmUgUENJX1NVQlNZU19ERVZJRF84OFhYX05JQ19WRgkJMHhBMTM0CisjZGVmaW5lIFBDSV9TVUJTWVNfREVWSURfODFYWF9OSUNfVkYJCTB4QTIzNAorI2RlZmluZSBQQ0lfU1VCU1lTX0RFVklEXzgzWFhfTklDX1ZGCQkweEEzMzQKKworCiAvKiBQQ0kgQkFSIG5vcyAqLwogI2RlZmluZQlQQ0lfQ0ZHX1JFR19CQVJfTlVNCQkwCiAjZGVmaW5lCVBDSV9NU0lYX1JFR19CQVJfTlVNCQk0CkBAIC00MSw0MCArNTIsOCBAQAogLyogTWF4IHBraW5kcyAqLwogI2RlZmluZQlOSUNfTUFYX1BLSU5ECQkJMTYKIAotLyogUnggQ2hhbm5lbHMgKi8KLS8qIFJlY2VpdmUgY2hhbm5lbCBjb25maWd1cmF0aW9uIGluIFROUyBieXBhc3MgbW9kZQotICogQmVsb3cgaXMgY29uZmlndXJhdGlvbiBpbiBUTlMgYnlwYXNzIG1vZGUKLSAqIEJHWDAtTE1BQzAtQ0hBTjAgLSBWTklDIENIQU4wCi0gKiBCR1gwLUxNQUMxLUNIQU4wIC0gVk5JQyBDSEFOMTYKLSAqIC4uLgotICogQkdYMS1MTUFDMC1DSEFOMCAtIFZOSUMgQ0hBTjEyOAotICogLi4uCi0gKiBCR1gxLUxNQUMzLUNIQU4wIC0gVk5JQyBDSEFOMTc0Ci0gKi8KLSNkZWZpbmUJTklDX0lOVEZfQ09VTlQJCQkyICAvKiBJbnRlcmZhY2VzIGJ0dyBWTklDIGFuZCBUTlMvQkdYICovCi0jZGVmaW5lCU5JQ19DSEFOU19QRVJfSU5GCQkxMjgKLSNkZWZpbmUJTklDX01BWF9DSEFOUwkJCShOSUNfSU5URl9DT1VOVCAqIE5JQ19DSEFOU19QRVJfSU5GKQotI2RlZmluZQlOSUNfQ1BJX0NPVU5UCQkJMjA0OCAvKiBObyBvZiBjaGFubmVsIHBhcnNlIGluZGljZXMgKi8KLQotLyogVE5TIGJ5cGFzcyBtb2RlOiAxLTEgbWFwcGluZyBiZXR3ZWVuIFZOSUMgYW5kIEJHWDpMTUFDICovCi0jZGVmaW5lIE5JQ19NQVhfQkdYCQkJTUFYX0JHWF9QRVJfQ044OFhYCi0jZGVmaW5lCU5JQ19DUElfUEVSX0JHWAkJCShOSUNfQ1BJX0NPVU5UIC8gTklDX01BWF9CR1gpCi0jZGVmaW5lCU5JQ19NQVhfQ1BJX1BFUl9MTUFDCQk2NCAvKiBNYXggd2hlbiBDUElfQUxHIGlzIElQIGRpZmZzZXJ2ICovCi0jZGVmaW5lCU5JQ19SU1NJX1BFUl9CR1gJCShOSUNfUlNTSV9DT1VOVCAvIE5JQ19NQVhfQkdYKQotCi0vKiBUeCBzY2hlZHVsaW5nICovCi0jZGVmaW5lCU5JQ19NQVhfVEw0CQkJMTAyNAotI2RlZmluZQlOSUNfTUFYX1RMNF9TSEFQRVJTCQkyNTYgLyogMSBzaGFwZXIgZm9yIDQgVEw0cyAqLwotI2RlZmluZQlOSUNfTUFYX1RMMwkJCTI1NgotI2RlZmluZQlOSUNfTUFYX1RMM19TSEFQRVJTCQk2NCAgLyogMSBzaGFwZXIgZm9yIDQgVEwzcyAqLwotI2RlZmluZQlOSUNfTUFYX1RMMgkJCTY0Ci0jZGVmaW5lCU5JQ19NQVhfVEwyX1NIQVBFUlMJCTIgIC8qIDEgc2hhcGVyIGZvciAzMiBUTDJzICovCi0jZGVmaW5lCU5JQ19NQVhfVEwxCQkJMgotCi0vKiBUTlMgYnlwYXNzIG1vZGUgKi8KLSNkZWZpbmUJTklDX1RMMl9QRVJfQkdYCQkJMzIKLSNkZWZpbmUJTklDX1RMNF9QRVJfQkdYCQkJKE5JQ19NQVhfVEw0IC8gTklDX01BWF9CR1gpCi0jZGVmaW5lCU5JQ19UTDRfUEVSX0xNQUMJCShOSUNfTUFYX1RMNCAvIE5JQ19DSEFOU19QRVJfSU5GKQorLyogTWF4IHdoZW4gQ1BJX0FMRyBpcyBJUCBkaWZmc2VydiAqLworI2RlZmluZQlOSUNfTUFYX0NQSV9QRVJfTE1BQwkJNjQKIAogLyogTklDIFZGIEludGVycnVwdHMgKi8KICNkZWZpbmUJTklDVkZfSU5UUl9DUQkJCTAKQEAgLTE0OCw3ICsxMjcsNiBAQAogCXN0cnVjdAluYXBpX3N0cnVjdCBuYXBpOwogfTsKIAotI2RlZmluZQlOSUNfUlNTSV9DT1VOVAkJCTQwOTYgLyogVG90YWwgbm8gb2YgUlNTIGluZGljZXMgKi8KICNkZWZpbmUgTklDX01BWF9SU1NfSEFTSF9CSVRTCQk4CiAjZGVmaW5lIE5JQ19NQVhfUlNTX0lEUl9UQkxfU0laRQkoMSA8PCBOSUNfTUFYX1JTU19IQVNIX0JJVFMpCiAjZGVmaW5lIFJTU19IQVNIX0tFWV9TSVpFCQk1IC8qIDMyMCBiaXQga2V5ICovCkBAIC0yNzMsMTIgKzI1MSwxNCBAQAogCXN0cnVjdCBuZXRfZGV2aWNlCSpuZXRkZXY7CiAJc3RydWN0IHBjaV9kZXYJCSpwZGV2OwogCXZvaWQgX19pb21lbQkJKnJlZ19iYXNlOworI2RlZmluZQlNQVhfUVVFVUVTX1BFUl9RU0VUCQkJOAogCXN0cnVjdCBxdWV1ZV9zZXQJKnFzOwogCXN0cnVjdCBuaWN2Zl9jcV9wb2xsCSpuYXBpWzhdOwogCXU4CQkJdmZfaWQ7CiAJdTgJCQlzcXNfaWQ7CiAJYm9vbCAgICAgICAgICAgICAgICAgICAgc3FzX21vZGU7CiAJYm9vbAkJCWh3X3RzbzsKKwlib29sCQkJdDg4OwogCiAJLyogUmVjZWl2ZSBidWZmZXIgYWxsb2MgKi8KIAl1MzIJCQlyYl9wYWdlX29mZnNldDsKQEAgLTMyNSw3ICszMDUsNyBAQAogCWJvb2wJCQltc2l4X2VuYWJsZWQ7CiAJdTgJCQludW1fdmVjOwogCXN0cnVjdCBtc2l4X2VudHJ5CW1zaXhfZW50cmllc1tOSUNfVkZfTVNJWF9WRUNUT1JTXTsKLQljaGFyCQkJaXJxX25hbWVbTklDX1ZGX01TSVhfVkVDVE9SU11bMjBdOworCWNoYXIJCQlpcnFfbmFtZVtOSUNfVkZfTVNJWF9WRUNUT1JTXVtJRk5BTVNJWiArIDE1XTsKIAlib29sCQkJaXJxX2FsbG9jYXRlZFtOSUNfVkZfTVNJWF9WRUNUT1JTXTsKIAljcHVtYXNrX3Zhcl90CQlhZmZpbml0eV9tYXNrW05JQ19WRl9NU0lYX1ZFQ1RPUlNdOwogCkBAIC0zNjgsNiArMzQ4LDcgQEAKICNkZWZpbmUJTklDX01CT1hfTVNHX1BOSUNWRl9QVFIJCTB4MTQJLyogR2V0IHByaW1hcnkgcXNldCBuaWN2ZiBwdHIgKi8KICNkZWZpbmUJTklDX01CT1hfTVNHX1NOSUNWRl9QVFIJCTB4MTUJLyogU2VuZCBzcWV0IG5pY3ZmIHB0ciB0byBQVkYgKi8KICNkZWZpbmUJTklDX01CT1hfTVNHX0xPT1BCQUNLCQkweDE2CS8qIFNldCBpbnRlcmZhY2UgaW4gbG9vcGJhY2sgKi8KKyNkZWZpbmUJTklDX01CT1hfTVNHX1JFU0VUX1NUQVRfQ09VTlRFUiAweDE3CS8qIFJlc2V0IHN0YXRpc3RpY3MgY291bnRlcnMgKi8KICNkZWZpbmUJTklDX01CT1hfTVNHX0NGR19ET05FCQkweEYwCS8qIFZGIGNvbmZpZ3VyYXRpb24gZG9uZSAqLwogI2RlZmluZQlOSUNfTUJPWF9NU0dfU0hVVERPV04JCTB4RjEJLyogVkYgaXMgYmVpbmcgc2h1dGRvd24gKi8KIApAQCAtNDg0LDYgKzQ2NSwzMSBAQAogCWJvb2wgIGVuYWJsZTsKIH07CiAKKy8qIFJlc2V0IHN0YXRpc3RpY3MgY291bnRlcnMgKi8KK3N0cnVjdCByZXNldF9zdGF0X2NmZyB7CisJdTggICAgbXNnOworCS8qIEJpdG1hcCB0byBzZWxlY3QgTklDX1BGX1ZOSUModmZfaWQpX1JYX1NUQVQoMC4uMTMpICovCisJdTE2ICAgcnhfc3RhdF9tYXNrOworCS8qIEJpdG1hcCB0byBzZWxlY3QgTklDX1BGX1ZOSUModmZfaWQpX1RYX1NUQVQoMC4uNCkgKi8KKwl1OCAgICB0eF9zdGF0X21hc2s7CisJLyogQml0bWFwIHRvIHNlbGVjdCBOSUNfUEZfUVMoMC4uMTI3KV9SUSgwLi43KV9TVEFUKDAuLjEpCisJICogYml0MTQsIGJpdDE1IE5JQ19QRl9RUyh2Zl9pZClfUlE3X1NUQVQoMC4uMSkKKwkgKiBiaXQxMiwgYml0MTMgTklDX1BGX1FTKHZmX2lkKV9SUTZfU1RBVCgwLi4xKQorCSAqIC4uCisJICogYml0MiwgYml0MyBOSUNfUEZfUVModmZfaWQpX1JRMV9TVEFUKDAuLjEpCisJICogYml0MCwgYml0MSBOSUNfUEZfUVModmZfaWQpX1JRMF9TVEFUKDAuLjEpCisJICovCisJdTE2ICAgcnFfc3RhdF9tYXNrOworCS8qIEJpdG1hcCB0byBzZWxlY3QgTklDX1BGX1FTKDAuLjEyNylfU1EoMC4uNylfU1RBVCgwLi4xKQorCSAqIGJpdDE0LCBiaXQxNSBOSUNfUEZfUVModmZfaWQpX1NRN19TVEFUKDAuLjEpCisJICogYml0MTIsIGJpdDEzIE5JQ19QRl9RUyh2Zl9pZClfU1E2X1NUQVQoMC4uMSkKKwkgKiAuLgorCSAqIGJpdDIsIGJpdDMgTklDX1BGX1FTKHZmX2lkKV9TUTFfU1RBVCgwLi4xKQorCSAqIGJpdDAsIGJpdDEgTklDX1BGX1FTKHZmX2lkKV9TUTBfU1RBVCgwLi4xKQorCSAqLworCXUxNiAgIHNxX3N0YXRfbWFzazsKK307CisKIC8qIDEyOCBiaXQgc2hhcmVkIG1lbW9yeSBiZXR3ZWVuIFBGIGFuZCBlYWNoIFZGICovCiB1bmlvbiBuaWNfbWJ4IHsKIAlzdHJ1Y3QgeyB1OCBtc2c7IH0JbXNnOwpAQCAtNTAxLDYgKzUwNyw3IEBACiAJc3RydWN0IHNxc19hbGxvYyAgICAgICAgc3FzX2FsbG9jOwogCXN0cnVjdCBuaWN2Zl9wdHIJbmljdmY7CiAJc3RydWN0IHNldF9sb29wYmFjawlsYms7CisJc3RydWN0IHJlc2V0X3N0YXRfY2ZnCXJlc2V0X3N0YXQ7CiB9OwogCiAjZGVmaW5lIE5JQ19OT0RFX0lEX01BU0sJMHgwMwpAQCAtNTE0LDcgKzUyMSwxNCBAQAogCiBzdGF0aWMgaW5saW5lIGJvb2wgcGFzczFfc2lsaWNvbihzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKLQlyZXR1cm4gcGRldi0+cmV2aXNpb24gPCA4OworCXJldHVybiAocGRldi0+cmV2aXNpb24gPCA4KSAmJgorCQkocGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSBQQ0lfU1VCU1lTX0RFVklEXzg4WFhfTklDX1BGKTsKK30KKworc3RhdGljIGlubGluZSBib29sIHBhc3MyX3NpbGljb24oc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJcmV0dXJuIChwZGV2LT5yZXZpc2lvbiA+PSA4KSAmJgorCQkocGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSBQQ0lfU1VCU1lTX0RFVklEXzg4WFhfTklDX1BGKTsKIH0KIAogaW50IG5pY3ZmX3NldF9yZWFsX251bV9xdWV1ZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pY19tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWNfbWFpbi5jCmluZGV4IDE2ZWQyMDMuLjJiYmY0Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pY19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljX21haW4uYwpAQCAtMjAsOCArMjAsMjUgQEAKICNkZWZpbmUgRFJWX05BTUUJInRodW5kZXItbmljIgogI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4wIgogCitzdHJ1Y3QgaHdfaW5mbyB7CisJdTgJCWJneF9jbnQ7CisJdTgJCWNoYW5zX3Blcl9sbWFjOworCXU4CQljaGFuc19wZXJfYmd4OyAvKiBSeC9UeCBjaGFucyAqLworCXU4CQljaGFuc19wZXJfcmd4OworCXU4CQljaGFuc19wZXJfbGJrOworCXUxNgkJY3BpX2NudDsKKwl1MTYJCXJzc2lfY250OworCXUxNgkJcnNzX2luZF90Ymxfc2l6ZTsKKwl1MTYJCXRsNF9jbnQ7CisJdTE2CQl0bDNfY250OworCXU4CQl0bDJfY250OworCXU4CQl0bDFfY250OworCWJvb2wJCXRsMV9wZXJfYmd4OyAvKiBUTDEgcGVyIEJHWCBvciBwZXIgTE1BQyAqLworfTsKKwogc3RydWN0IG5pY3BmIHsKIAlzdHJ1Y3QgcGNpX2RldgkJKnBkZXY7CisJc3RydWN0IGh3X2luZm8gICAgICAgICAgKmh3OwogCXU4CQkJbm9kZTsKIAl1bnNpZ25lZCBpbnQJCWZsYWdzOwogCXU4CQkJbnVtX3ZmX2VuOyAgICAgIC8qIE5vIG9mIFZGIGVuYWJsZWQgKi8KQEAgLTM2LDIyICs1MywyMiBAQAogI2RlZmluZQlOSUNfU0VUX1ZGX0xNQUNfTUFQKGJneCwgbG1hYykJKCgoYmd4ICYgMHhGKSA8PCA0KSB8IChsbWFjICYgMHhGKSkKICNkZWZpbmUJTklDX0dFVF9CR1hfRlJPTV9WRl9MTUFDX01BUChtYXApCSgobWFwID4+IDQpICYgMHhGKQogI2RlZmluZQlOSUNfR0VUX0xNQUNfRlJPTV9WRl9MTUFDX01BUChtYXApCShtYXAgJiAweEYpCi0JdTgJCQl2Zl9sbWFjX21hcFtNQVhfTE1BQ107CisJdTgJCQkqdmZfbG1hY19tYXA7CiAJc3RydWN0IGRlbGF5ZWRfd29yayAgICAgZHdvcms7CiAJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmNoZWNrX2xpbms7Ci0JdTgJCQlsaW5rW01BWF9MTUFDXTsKLQl1OAkJCWR1cGxleFtNQVhfTE1BQ107Ci0JdTMyCQkJc3BlZWRbTUFYX0xNQUNdOworCXU4CQkJKmxpbms7CisJdTgJCQkqZHVwbGV4OworCXUzMgkJCSpzcGVlZDsKIAl1MTYJCQljcGlfYmFzZVtNQVhfTlVNX1ZGU19TVVBQT1JURURdOwogCXUxNgkJCXJzc2lfYmFzZVtNQVhfTlVNX1ZGU19TVVBQT1JURURdOwotCXUxNgkJCXJzc19pbmRfdGJsX3NpemU7CiAJYm9vbAkJCW1ieF9sb2NrW01BWF9OVU1fVkZTX1NVUFBPUlRFRF07CiAKIAkvKiBNU0ktWCAqLwogCWJvb2wJCQltc2l4X2VuYWJsZWQ7CiAJdTgJCQludW1fdmVjOwotCXN0cnVjdCBtc2l4X2VudHJ5CW1zaXhfZW50cmllc1tOSUNfUEZfTVNJWF9WRUNUT1JTXTsKKwlzdHJ1Y3QgbXNpeF9lbnRyeQkqbXNpeF9lbnRyaWVzOwogCWJvb2wJCQlpcnFfYWxsb2NhdGVkW05JQ19QRl9NU0lYX1ZFQ1RPUlNdOworCWNoYXIJCQlpcnFfbmFtZVtOSUNfUEZfTVNJWF9WRUNUT1JTXVsyMF07CiB9OwogCiAvKiBTdXBwb3J0ZWQgZGV2aWNlcyAqLwpAQCAtODksOSArMTA2LDIyIEBACiAvKiBQRiAtPiBWRiBtYWlsYm94IGNvbW11bmljYXRpb24gQVBJcyAqLwogc3RhdGljIHZvaWQgbmljX2VuYWJsZV9tYnhfaW50cihzdHJ1Y3QgbmljcGYgKm5pYykKIHsKLQkvKiBFbmFibGUgbWFpbGJveCBpbnRlcnJ1cHQgZm9yIGFsbCAxMjggVkZzICovCi0JbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9NQUlMQk9YX0VOQV9XMVMsIH4wdWxsKTsKLQluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX01BSUxCT1hfRU5BX1cxUyArIHNpemVvZih1NjQpLCB+MHVsbCk7CisJaW50IHZmX2NudCA9IHBjaV9zcmlvdl9nZXRfdG90YWx2ZnMobmljLT5wZGV2KTsKKworI2RlZmluZSBJTlRSX01BU0sodmZzKSAoKHZmcyA8IDY0KSA/IChCSVRfVUxMKHZmcykgLSAxKSA6ICh+MHVsbCkpCisKKwkvKiBDbGVhciBpdCwgdG8gYXZvaWQgc3B1cmlvdXMgaW50ZXJydXB0cyAoaWYgYW55KSAqLworCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfTUFJTEJPWF9JTlQsIElOVFJfTUFTSyh2Zl9jbnQpKTsKKworCS8qIEVuYWJsZSBtYWlsYm94IGludGVycnVwdCBmb3IgYWxsIFZGcyAqLworCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfTUFJTEJPWF9FTkFfVzFTLCBJTlRSX01BU0sodmZfY250KSk7CisJLyogT25lIG1haWxib3ggaW50ciBlbmFibGUgcmVnIHBlciA2NCBWRnMgKi8KKwlpZiAodmZfY250ID4gNjQpIHsKKwkJbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9NQUlMQk9YX0lOVCArIHNpemVvZih1NjQpLAorCQkJICAgICAgSU5UUl9NQVNLKHZmX2NudCAtIDY0KSk7CisJCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfTUFJTEJPWF9FTkFfVzFTICsgc2l6ZW9mKHU2NCksCisJCQkgICAgICBJTlRSX01BU0sodmZfY250IC0gNjQpKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIG5pY19jbGVhcl9tYnhfaW50cihzdHJ1Y3QgbmljcGYgKm5pYywgaW50IHZmLCBpbnQgbWJ4X3JlZykKQEAgLTE0NCw3ICsxNzQsNyBAQAogCiAJbWJ4Lm5pY19jZmcudG5zX21vZGUgPSBOSUNfVE5TX0JZUEFTU19NT0RFOwogCi0JaWYgKHZmIDwgTUFYX0xNQUMpIHsKKwlpZiAodmYgPCBuaWMtPm51bV92Zl9lbikgewogCQliZ3hfaWR4ID0gTklDX0dFVF9CR1hfRlJPTV9WRl9MTUFDX01BUChuaWMtPnZmX2xtYWNfbWFwW3ZmXSk7CiAJCWxtYWMgPSBOSUNfR0VUX0xNQUNfRlJPTV9WRl9MTUFDX01BUChuaWMtPnZmX2xtYWNfbWFwW3ZmXSk7CiAKQEAgLTE1NSw3ICsxODUsNyBAQAogCW1ieC5uaWNfY2ZnLnNxc19tb2RlID0gKHZmID49IG5pYy0+bnVtX3ZmX2VuKSA/IHRydWUgOiBmYWxzZTsKIAltYngubmljX2NmZy5ub2RlX2lkID0gbmljLT5ub2RlOwogCi0JbWJ4Lm5pY19jZmcubG9vcGJhY2tfc3VwcG9ydGVkID0gdmYgPCBNQVhfTE1BQzsKKwltYngubmljX2NmZy5sb29wYmFja19zdXBwb3J0ZWQgPSB2ZiA8IG5pYy0+bnVtX3ZmX2VuOwogCiAJbmljX3NlbmRfbXNnX3RvX3ZmKG5pYywgdmYsICZtYngpOwogfQpAQCAtMjQ4LDE0ICsyNzgsMjcgQEAKIC8qIFNldCBtaW5pbXVtIHRyYW5zbWl0IHBhY2tldCBzaXplICovCiBzdGF0aWMgdm9pZCBuaWNfc2V0X3R4X3BrdF9wYWQoc3RydWN0IG5pY3BmICpuaWMsIGludCBzaXplKQogewotCWludCBsbWFjOworCWludCBsbWFjLCBtYXhfbG1hYzsKKwl1MTYgc2RldmlkOwogCXU2NCBsbWFjX2NmZzsKIAotCS8qIE1heCB2YWx1ZSB0aGF0IGNhbiBiZSBzZXQgaXMgNjAgKi8KLQlpZiAoc2l6ZSA+IDYwKQotCQlzaXplID0gNjA7CisJLyogVGhlcmUgaXMgYSBpc3N1ZSBpbiBIVyB3aGVyZS1pbiB3aGlsZSBzZW5kaW5nIEdTTyBzaXplZAorCSAqIHBrdHMgYXMgcGFydCBvZiBUU08sIGlmIHBrdCBsZW4gZmFsbHMgYmVsb3cgdGhpcyBzaXplCisJICogTklDIHdpbGwgemVybyBQQUQgcGFja2V0IGFuZCBhbHNvIHVwZGF0ZXMgSVAgdG90YWwgbGVuZ3RoLgorCSAqIEhlbmNlIHNldCB0aGlzIHZhbHVlIHRvIGxlc3N0aGFuIG1pbiBwa3Qgc2l6ZSBvZiBNQUMrSVArVENQCisJICogaGVhZGVycywgQkdYIHdpbGwgZG8gdGhlIHBhZGRpbmcgdG8gdHJhbnNtaXQgNjQgYnl0ZSBwa3QuCisJICovCisJaWYgKHNpemUgPiA1MikKKwkJc2l6ZSA9IDUyOwogCi0JZm9yIChsbWFjID0gMDsgbG1hYyA8IChNQVhfQkdYX1BFUl9DTjg4WFggKiBNQVhfTE1BQ19QRVJfQkdYKTsgbG1hYysrKSB7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQobmljLT5wZGV2LCBQQ0lfU1VCU1lTVEVNX0lELCAmc2RldmlkKTsKKwkvKiA4MXh4J3MgUkdYIGhhcyBvbmx5IG9uZSBMTUFDICovCisJaWYgKHNkZXZpZCA9PSBQQ0lfU1VCU1lTX0RFVklEXzgxWFhfTklDX1BGKQorCQltYXhfbG1hYyA9ICgobmljLT5ody0+Ymd4X2NudCAtIDEpICogTUFYX0xNQUNfUEVSX0JHWCkgKyAxOworCWVsc2UKKwkJbWF4X2xtYWMgPSBuaWMtPmh3LT5iZ3hfY250ICogTUFYX0xNQUNfUEVSX0JHWDsKKworCWZvciAobG1hYyA9IDA7IGxtYWMgPCBtYXhfbG1hYzsgbG1hYysrKSB7CiAJCWxtYWNfY2ZnID0gbmljX3JlZ19yZWFkKG5pYywgTklDX1BGX0xNQUNfMF83X0NGRyB8IChsbWFjIDw8IDMpKTsKIAkJbG1hY19jZmcgJj0gfigweEYgPDwgMik7CiAJCWxtYWNfY2ZnIHw9ICgoc2l6ZSAvIDQpIDw8IDIpOwpAQCAtMjc1LDcgKzMxOCw3IEBACiAKIAluaWMtPm51bV92Zl9lbiA9IDA7CiAKLQlmb3IgKGJneCA9IDA7IGJneCA8IE5JQ19NQVhfQkdYOyBiZ3grKykgeworCWZvciAoYmd4ID0gMDsgYmd4IDwgbmljLT5ody0+Ymd4X2NudDsgYmd4KyspIHsKIAkJaWYgKCEoYmd4X21hcCAmICgxIDw8IGJneCkpKQogCQkJY29udGludWU7CiAJCWxtYWNfY250ID0gYmd4X2dldF9sbWFjX2NvdW50KG5pYy0+bm9kZSwgYmd4KTsKQEAgLTI5NSwyOCArMzM4LDEyNSBAQAogCQkJbmljX3JlZ193cml0ZShuaWMsCiAJCQkJICAgICAgTklDX1BGX0xNQUNfMF83X0NSRURJVCArIChsbWFjICogOCksCiAJCQkJICAgICAgbG1hY19jcmVkaXQpOworCisJCS8qIE9uIENOODFYWCB0aGVyZSBhcmUgb25seSA4IFZGcyBidXQgbWF4IHBvc3NpYmxlIG5vIG9mCisJCSAqIGludGVyZmFjZXMgYXJlIDkuCisJCSAqLworCQlpZiAobmljLT5udW1fdmZfZW4gPj0gcGNpX3NyaW92X2dldF90b3RhbHZmcyhuaWMtPnBkZXYpKSB7CisJCQluaWMtPm51bV92Zl9lbiA9IHBjaV9zcmlvdl9nZXRfdG90YWx2ZnMobmljLT5wZGV2KTsKKwkJCWJyZWFrOworCQl9CiAJfQogfQogCitzdGF0aWMgdm9pZCBuaWNfZnJlZV9sbWFjbWVtKHN0cnVjdCBuaWNwZiAqbmljKQoreworCWtmcmVlKG5pYy0+dmZfbG1hY19tYXApOworCWtmcmVlKG5pYy0+bGluayk7CisJa2ZyZWUobmljLT5kdXBsZXgpOworCWtmcmVlKG5pYy0+c3BlZWQpOworfQorCitzdGF0aWMgaW50IG5pY19nZXRfaHdfaW5mbyhzdHJ1Y3QgbmljcGYgKm5pYykKK3sKKwl1OCBtYXhfbG1hYzsKKwl1MTYgc2RldmlkOworCXN0cnVjdCBod19pbmZvICpodyA9IG5pYy0+aHc7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChuaWMtPnBkZXYsIFBDSV9TVUJTWVNURU1fSUQsICZzZGV2aWQpOworCisJc3dpdGNoIChzZGV2aWQpIHsKKwljYXNlIFBDSV9TVUJTWVNfREVWSURfODhYWF9OSUNfUEY6CisJCWh3LT5iZ3hfY250ID0gTUFYX0JHWF9QRVJfQ044OFhYOworCQlody0+Y2hhbnNfcGVyX2xtYWMgPSAxNjsKKwkJaHctPmNoYW5zX3Blcl9iZ3ggPSAxMjg7CisJCWh3LT5jcGlfY250ID0gMjA0ODsKKwkJaHctPnJzc2lfY250ID0gNDA5NjsKKwkJaHctPnJzc19pbmRfdGJsX3NpemUgPSBOSUNfTUFYX1JTU19JRFJfVEJMX1NJWkU7CisJCWh3LT50bDNfY250ID0gMjU2OworCQlody0+dGwyX2NudCA9IDY0OworCQlody0+dGwxX2NudCA9IDI7CisJCWh3LT50bDFfcGVyX2JneCA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgUENJX1NVQlNZU19ERVZJRF84MVhYX05JQ19QRjoKKwkJaHctPmJneF9jbnQgPSBNQVhfQkdYX1BFUl9DTjgxWFg7CisJCWh3LT5jaGFuc19wZXJfbG1hYyA9IDg7CisJCWh3LT5jaGFuc19wZXJfYmd4ID0gMzI7CisJCWh3LT5jaGFuc19wZXJfcmd4ID0gODsKKwkJaHctPmNoYW5zX3Blcl9sYmsgPSAyNDsKKwkJaHctPmNwaV9jbnQgPSA1MTI7CisJCWh3LT5yc3NpX2NudCA9IDI1NjsKKwkJaHctPnJzc19pbmRfdGJsX3NpemUgPSAzMjsgLyogTWF4IFJTU0kgLyBNYXggaW50ZXJmYWNlcyAqLworCQlody0+dGwzX2NudCA9IDY0OworCQlody0+dGwyX2NudCA9IDE2OworCQlody0+dGwxX2NudCA9IDEwOworCQlody0+dGwxX3Blcl9iZ3ggPSBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfU1VCU1lTX0RFVklEXzgzWFhfTklDX1BGOgorCQlody0+Ymd4X2NudCA9IE1BWF9CR1hfUEVSX0NOODNYWDsKKwkJaHctPmNoYW5zX3Blcl9sbWFjID0gODsKKwkJaHctPmNoYW5zX3Blcl9iZ3ggPSAzMjsKKwkJaHctPmNoYW5zX3Blcl9sYmsgPSA2NDsKKwkJaHctPmNwaV9jbnQgPSAyMDQ4OworCQlody0+cnNzaV9jbnQgPSAxMDI0OworCQlody0+cnNzX2luZF90Ymxfc2l6ZSA9IDY0OyAvKiBNYXggUlNTSSAvIE1heCBpbnRlcmZhY2VzICovCisJCWh3LT50bDNfY250ID0gMjU2OworCQlody0+dGwyX2NudCA9IDY0OworCQlody0+dGwxX2NudCA9IDE4OworCQlody0+dGwxX3Blcl9iZ3ggPSBmYWxzZTsKKwkJYnJlYWs7CisJfQorCWh3LT50bDRfY250ID0gTUFYX1FVRVVFU19QRVJfUVNFVCAqIHBjaV9zcmlvdl9nZXRfdG90YWx2ZnMobmljLT5wZGV2KTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgTE1BQyB0cmFja2luZyBlbGVtZW50cyAqLworCW1heF9sbWFjID0gaHctPmJneF9jbnQgKiBNQVhfTE1BQ19QRVJfQkdYOworCW5pYy0+dmZfbG1hY19tYXAgPSBrbWFsbG9jX2FycmF5KG1heF9sbWFjLCBzaXplb2YodTgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5pYy0+dmZfbG1hY19tYXApCisJCWdvdG8gZXJyb3I7CisJbmljLT5saW5rID0ga21hbGxvY19hcnJheShtYXhfbG1hYywgc2l6ZW9mKHU4KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuaWMtPmxpbmspCisJCWdvdG8gZXJyb3I7CisJbmljLT5kdXBsZXggPSBrbWFsbG9jX2FycmF5KG1heF9sbWFjLCBzaXplb2YodTgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5pYy0+ZHVwbGV4KQorCQlnb3RvIGVycm9yOworCW5pYy0+c3BlZWQgPSBrbWFsbG9jX2FycmF5KG1heF9sbWFjLCBzaXplb2YodTMyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuaWMtPnNwZWVkKQorCQlnb3RvIGVycm9yOworCXJldHVybiAwOworCitlcnJvcjoKKwluaWNfZnJlZV9sbWFjbWVtKG5pYyk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKICNkZWZpbmUgQkdYMF9CTE9DSyA4CiAjZGVmaW5lIEJHWDFfQkxPQ0sgOQogCi1zdGF0aWMgdm9pZCBuaWNfaW5pdF9odyhzdHJ1Y3QgbmljcGYgKm5pYykKK3N0YXRpYyBpbnQgbmljX2luaXRfaHcoc3RydWN0IG5pY3BmICpuaWMpCiB7Ci0JaW50IGk7CisJaW50IGksIGVycjsKIAl1NjQgY3FtX2NmZzsKIAorCS8qIEdldCBIVyBjYXBhYmlsaXR5IGluZm8gKi8KKwllcnIgPSBuaWNfZ2V0X2h3X2luZm8obmljKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCiAJLyogRW5hYmxlIE5JQyBIVyBibG9jayAqLwogCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfQ0ZHLCAweDMpOwogCiAJLyogRW5hYmxlIGJhY2twcmVzc3VyZSAqLwogCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfQlBfQ0ZHLCAoMVVMTCA8PCA2KSB8IDB4MDMpOwogCi0JLyogRGlzYWJsZSBUTlMgbW9kZSBvbiBib3RoIGludGVyZmFjZXMgKi8KLQluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX0lOVEZfMF8xX1NFTkRfQ0ZHLAotCQkgICAgICAoTklDX1ROU19CWVBBU1NfTU9ERSA8PCA3KSB8IEJHWDBfQkxPQ0spOwotCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfSU5URl8wXzFfU0VORF9DRkcgfCAoMSA8PCA4KSwKLQkJICAgICAgKE5JQ19UTlNfQllQQVNTX01PREUgPDwgNykgfCBCR1gxX0JMT0NLKTsKKwkvKiBUTlMgYW5kIFROUyBieXBhc3MgbW9kZXMgYXJlIHByZXNlbnQgb25seSBvbiA4OHh4ICovCisJaWYgKG5pYy0+cGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSBQQ0lfU1VCU1lTX0RFVklEXzg4WFhfTklDX1BGKSB7CisJCS8qIERpc2FibGUgVE5TIG1vZGUgb24gYm90aCBpbnRlcmZhY2VzICovCisJCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfSU5URl8wXzFfU0VORF9DRkcsCisJCQkgICAgICAoTklDX1ROU19CWVBBU1NfTU9ERSA8PCA3KSB8IEJHWDBfQkxPQ0spOworCQluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX0lOVEZfMF8xX1NFTkRfQ0ZHIHwgKDEgPDwgOCksCisJCQkgICAgICAoTklDX1ROU19CWVBBU1NfTU9ERSA8PCA3KSB8IEJHWDFfQkxPQ0spOworCX0KKwogCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfSU5URl8wXzFfQlBfQ0ZHLAogCQkgICAgICAoMVVMTCA8PCA2MykgfCBCR1gwX0JMT0NLKTsKIAluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX0lOVEZfMF8xX0JQX0NGRyArICgxIDw8IDgpLApAQCAtMzQ2LDExICs0ODYsMTQgQEAKIAljcW1fY2ZnID0gbmljX3JlZ19yZWFkKG5pYywgTklDX1BGX0NRTV9DRkcpOwogCWlmIChjcW1fY2ZnIDwgTklDUEZfQ1FNX01JTl9EUk9QX0xFVkVMKQogCQluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX0NRTV9DRkcsIE5JQ1BGX0NRTV9NSU5fRFJPUF9MRVZFTCk7CisKKwlyZXR1cm4gMDsKIH0KIAogLyogQ2hhbm5lbCBwYXJzZSBpbmRleCBjb25maWd1cmF0aW9uICovCiBzdGF0aWMgdm9pZCBuaWNfY29uZmlnX2NwaShzdHJ1Y3QgbmljcGYgKm5pYywgc3RydWN0IGNwaV9jZmdfbXNnICpjZmcpCiB7CisJc3RydWN0IGh3X2luZm8gKmh3ID0gbmljLT5odzsKIAl1MzIgdm5pYywgYmd4LCBsbWFjLCBjaGFuOwogCXUzMiBwYWRkLCBjcGlfY291bnQgPSAwOwogCXU2NCBjcGlfYmFzZSwgY3BpLCByc3NpX2Jhc2UsIHJzc2k7CkBAIC0zNjAsOSArNTAzLDkgQEAKIAliZ3ggPSBOSUNfR0VUX0JHWF9GUk9NX1ZGX0xNQUNfTUFQKG5pYy0+dmZfbG1hY19tYXBbdm5pY10pOwogCWxtYWMgPSBOSUNfR0VUX0xNQUNfRlJPTV9WRl9MTUFDX01BUChuaWMtPnZmX2xtYWNfbWFwW3ZuaWNdKTsKIAotCWNoYW4gPSAobG1hYyAqIE1BWF9CR1hfQ0hBTlNfUEVSX0xNQUMpICsgKGJneCAqIE5JQ19DSEFOU19QRVJfSU5GKTsKLQljcGlfYmFzZSA9IChsbWFjICogTklDX01BWF9DUElfUEVSX0xNQUMpICsgKGJneCAqIE5JQ19DUElfUEVSX0JHWCk7Ci0JcnNzaV9iYXNlID0gKGxtYWMgKiBuaWMtPnJzc19pbmRfdGJsX3NpemUpICsgKGJneCAqIE5JQ19SU1NJX1BFUl9CR1gpOworCWNoYW4gPSAobG1hYyAqIGh3LT5jaGFuc19wZXJfbG1hYykgKyAoYmd4ICogaHctPmNoYW5zX3Blcl9iZ3gpOworCWNwaV9iYXNlID0gdm5pYyAqIE5JQ19NQVhfQ1BJX1BFUl9MTUFDOworCXJzc2lfYmFzZSA9IHZuaWMgKiBody0+cnNzX2luZF90Ymxfc2l6ZTsKIAogCS8qIFJ4IGNoYW5uZWwgY29uZmlndXJhdGlvbiAqLwogCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfQ0hBTl8wXzI1NV9SWF9CUF9DRkcgfCAoY2hhbiA8PCAzKSwKQEAgLTQzNCw3ICs1NzcsNyBAQAogCW1zZyA9ICh1NjQgKikmbWJ4OwogCiAJbWJ4LnJzc19zaXplLm1zZyA9IE5JQ19NQk9YX01TR19SU1NfU0laRTsKLQltYngucnNzX3NpemUuaW5kX3RibF9zaXplID0gbmljLT5yc3NfaW5kX3RibF9zaXplOworCW1ieC5yc3Nfc2l6ZS5pbmRfdGJsX3NpemUgPSBuaWMtPmh3LT5yc3NfaW5kX3RibF9zaXplOwogCW5pY19zZW5kX21zZ190b192ZihuaWMsIHZmLCAmbWJ4KTsKIH0KIApAQCAtNDgxLDcgKzYyNCw3IEBACiAvKiA0IGxldmVsIHRyYW5zbWl0IHNpZGUgc2NoZWR1bGVyIGNvbmZpZ3V0YXRpb24KICAqIGZvciBUTlMgYnlwYXNzIG1vZGUKICAqCi0gKiBTYW1wbGUgY29uZmlndXJhdGlvbiBmb3IgU1EwCisgKiBTYW1wbGUgY29uZmlndXJhdGlvbiBmb3IgU1EwIG9uIDg4eHgKICAqIFZOSUMwLVNRMCAtPiBUTDQoMCkgICAtPiBUTDNbMF0gICAtPiBUTDJbMF0gIC0+IFRMMVswXSAtPiBCR1gwCiAgKiBWTklDMS1TUTAgLT4gVEw0KDgpICAgLT4gVEwzWzJdICAgLT4gVEwyWzBdICAtPiBUTDFbMF0gLT4gQkdYMAogICogVk5JQzItU1EwIC0+IFRMNCgxNikgIC0+IFRMM1s0XSAgIC0+IFRMMlsxXSAgLT4gVEwxWzBdIC0+IEJHWDAKQEAgLTQ5NCw2ICs2MzcsNyBAQAogc3RhdGljIHZvaWQgbmljX3R4X2NoYW5uZWxfY2ZnKHN0cnVjdCBuaWNwZiAqbmljLCB1OCB2bmljLAogCQkJICAgICAgIHN0cnVjdCBzcV9jZmdfbXNnICpzcSkKIHsKKwlzdHJ1Y3QgaHdfaW5mbyAqaHcgPSBuaWMtPmh3OwogCXUzMiBiZ3gsIGxtYWMsIGNoYW47CiAJdTMyIHRsMiwgdGwzLCB0bDQ7CiAJdTMyIHJyX3F1YW50dW07CkBAIC01MTIsMjEgKzY1NiwyOCBAQAogCS8qIDI0IGJ5dGVzIGZvciBGQ1MsIElQRyBhbmQgcHJlYW1ibGUgKi8KIAlycl9xdWFudHVtID0gKChOSUNfSFdfTUFYX0ZSUyArIDI0KSAvIDQpOwogCi0JaWYgKCFzcS0+c3FzX21vZGUpIHsKLQkJdGw0ID0gKGxtYWMgKiBOSUNfVEw0X1BFUl9MTUFDKSArIChiZ3ggKiBOSUNfVEw0X1BFUl9CR1gpOwotCX0gZWxzZSB7Ci0JCWZvciAoc3ZmID0gMDsgc3ZmIDwgTUFYX1NRU19QRVJfVkY7IHN2ZisrKSB7Ci0JCQlpZiAobmljLT52Zl9zcXNbcHFzX3ZuaWNdW3N2Zl0gPT0gdm5pYykKLQkJCQlicmVhazsKKwkvKiBGb3IgODh4eCAwLTUxMSBUTDQgdHJhbnNtaXRzIHZpYSBCR1gwIGFuZAorCSAqIDUxMi0xMDIzIFRMNHMgdHJhbnNtaXQgdmlhIEJHWDEuCisJICovCisJaWYgKGh3LT50bDFfcGVyX2JneCkgeworCQl0bDQgPSBiZ3ggKiAoaHctPnRsNF9jbnQgLyBody0+Ymd4X2NudCk7CisJCWlmICghc3EtPnNxc19tb2RlKSB7CisJCQl0bDQgKz0gKGxtYWMgKiBNQVhfUVVFVUVTX1BFUl9RU0VUKTsKKwkJfSBlbHNlIHsKKwkJCWZvciAoc3ZmID0gMDsgc3ZmIDwgTUFYX1NRU19QRVJfVkY7IHN2ZisrKSB7CisJCQkJaWYgKG5pYy0+dmZfc3FzW3Bxc192bmljXVtzdmZdID09IHZuaWMpCisJCQkJCWJyZWFrOworCQkJfQorCQkJdGw0ICs9IChNQVhfTE1BQ19QRVJfQkdYICogTUFYX1FVRVVFU19QRVJfUVNFVCk7CisJCQl0bDQgKz0gKGxtYWMgKiBNQVhfUVVFVUVTX1BFUl9RU0VUICogTUFYX1NRU19QRVJfVkYpOworCQkJdGw0ICs9IChzdmYgKiBNQVhfUVVFVUVTX1BFUl9RU0VUKTsKIAkJfQotCQl0bDQgPSAoTUFYX0xNQUNfUEVSX0JHWCAqIE5JQ19UTDRfUEVSX0xNQUMpOwotCQl0bDQgKz0gKGxtYWMgKiBOSUNfVEw0X1BFUl9MTUFDICogTUFYX1NRU19QRVJfVkYpOwotCQl0bDQgKz0gKHN2ZiAqIE5JQ19UTDRfUEVSX0xNQUMpOwotCQl0bDQgKz0gKGJneCAqIE5JQ19UTDRfUEVSX0JHWCk7CisJfSBlbHNlIHsKKwkJdGw0ID0gKHZuaWMgKiBNQVhfUVVFVUVTX1BFUl9RU0VUKTsKIAl9CiAJdGw0ICs9IHNxX2lkeDsKIAotCXRsMyA9IHRsNCAvIChOSUNfTUFYX1RMNCAvIE5JQ19NQVhfVEwzKTsKKwl0bDMgPSB0bDQgLyAoaHctPnRsNF9jbnQgLyBody0+dGwzX2NudCk7CiAJbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9RU0VUXzBfMTI3X1NRXzBfN19DRkcyIHwKIAkJICAgICAgKCh1NjQpdm5pYyA8PCBOSUNfUVNfSURfU0hJRlQpIHwKIAkJICAgICAgKCh1MzIpc3FfaWR4IDw8IE5JQ19RX05VTV9TSElGVCksIHRsNCk7CkBAIC01MzQsOCArNjg1LDE5IEBACiAJCSAgICAgICgodTY0KXZuaWMgPDwgMjcpIHwgKCh1MzIpc3FfaWR4IDw8IDI0KSB8IHJyX3F1YW50dW0pOwogCiAJbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9UTDNfMF8yNTVfQ0ZHIHwgKHRsMyA8PCAzKSwgcnJfcXVhbnR1bSk7Ci0JY2hhbiA9IChsbWFjICogTUFYX0JHWF9DSEFOU19QRVJfTE1BQykgKyAoYmd4ICogTklDX0NIQU5TX1BFUl9JTkYpOwotCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfVEwzXzBfMjU1X0NIQU4gfCAodGwzIDw8IDMpLCBjaGFuKTsKKworCS8qIE9uIDg4eHggMC0xMjcgY2hhbm5lbHMgYXJlIGZvciBCR1gwIGFuZAorCSAqIDEyNy0yNTUgY2hhbm5lbHMgZm9yIEJHWDEuCisJICoKKwkgKiBPbiA4MXh4LzgzeHggVEwzX0NIQU4gcmVnIHNob3VsZCBiZSBjb25maWd1cmVkIHdpdGggY2hhbm5lbAorCSAqIHdpdGhpbiBMTUFDIGkuZSAwLTcgYW5kIG5vdCB0aGUgYWN0dWFsIGNoYW5uZWwgbnVtYmVyIGxpa2Ugb24gODh4eAorCSAqLworCWNoYW4gPSAobG1hYyAqIGh3LT5jaGFuc19wZXJfbG1hYykgKyAoYmd4ICogaHctPmNoYW5zX3Blcl9iZ3gpOworCWlmIChody0+dGwxX3Blcl9iZ3gpCisJCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfVEwzXzBfMjU1X0NIQU4gfCAodGwzIDw8IDMpLCBjaGFuKTsKKwllbHNlCisJCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfVEwzXzBfMjU1X0NIQU4gfCAodGwzIDw8IDMpLCAwKTsKKwogCS8qIEVuYWJsZSBiYWNrcHJlc3N1cmUgb24gdGhlIGNoYW5uZWwgKi8KIAluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX0NIQU5fMF8yNTVfVFhfQ0ZHIHwgKGNoYW4gPDwgMyksIDEpOwogCkBAIC01NDQsNiArNzA2LDE2IEBACiAJbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9UTDJfMF82M19DRkcgfCAodGwyIDw8IDMpLCBycl9xdWFudHVtKTsKIAkvKiBObyBwcmlvcml0aWVzIGFzIG9mIG5vdyAqLwogCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfVEwyXzBfNjNfUFJJIHwgKHRsMiA8PCAzKSwgMHgwMCk7CisKKwkvKiBVbmxpa2UgODh4eCB3aGVyZSBUTDJzIDAtMzEgdHJhbnNtaXRzIHRvIFRMMSAnMCcgYW5kIHJlc3QgdG8gVEwxICcxJworCSAqIG9uIDgxeHgvODN4eCBUTDIgbmVlZHMgdG8gYmUgY29uZmlndXJlZCB0byB0cmFuc21pdCB0byBvbmUgb2YgdGhlCisJICogcG9zc2libGUgTE1BQ3MuCisJICoKKwkgKiBUaGlzIHJlZ2lzdGVyIGRvZXNuJ3QgZXhpc3Qgb24gODh4eC4KKwkgKi8KKwlpZiAoIWh3LT50bDFfcGVyX2JneCkKKwkJbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9UTDJfTE1BQyB8ICh0bDIgPDwgMyksCisJCQkgICAgICBsbWFjICsgKGJneCAqIE1BWF9MTUFDX1BFUl9CR1gpKTsKIH0KIAogLyogU2VuZCBwcmltYXJ5IG5pY3ZmIHBvaW50ZXIgdG8gc2Vjb25kYXJ5IFFTJ3MgVkYgKi8KQEAgLTYxNSw3ICs3ODcsNyBAQAogewogCWludCBiZ3hfaWR4LCBsbWFjX2lkeDsKIAotCWlmIChsYmstPnZmX2lkID4gTUFYX0xNQUMpCisJaWYgKGxiay0+dmZfaWQgPj0gbmljLT5udW1fdmZfZW4pCiAJCXJldHVybiAtMTsKIAogCWJneF9pZHggPSBOSUNfR0VUX0JHWF9GUk9NX1ZGX0xNQUNfTUFQKG5pYy0+dmZfbG1hY19tYXBbbGJrLT52Zl9pZF0pOwpAQCAtNjI2LDYgKzc5OCw2NyBAQAogCXJldHVybiAwOwogfQogCisvKiBSZXNldCBzdGF0aXN0aWNzIGNvdW50ZXJzICovCitzdGF0aWMgaW50IG5pY19yZXNldF9zdGF0X2NvdW50ZXJzKHN0cnVjdCBuaWNwZiAqbmljLAorCQkJCSAgIGludCB2Ziwgc3RydWN0IHJlc2V0X3N0YXRfY2ZnICpjZmcpCit7CisJaW50IGksIHN0YXQsIHFudW07CisJdTY0IHJlZ19hZGRyOworCisJZm9yIChpID0gMDsgaSA8IFJYX1NUQVRTX0VOVU1fTEFTVDsgaSsrKSB7CisJCWlmIChjZmctPnJ4X3N0YXRfbWFzayAmIEJJVChpKSkgeworCQkJcmVnX2FkZHIgPSBOSUNfUEZfVk5JQ18wXzEyN19SWF9TVEFUXzBfMTMgfAorCQkJCSAgICh2ZiA8PCBOSUNfUVNfSURfU0hJRlQpIHwKKwkJCQkgICAoaSA8PCAzKTsKKwkJCW5pY19yZWdfd3JpdGUobmljLCByZWdfYWRkciwgMCk7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVFhfU1RBVFNfRU5VTV9MQVNUOyBpKyspIHsKKwkJaWYgKGNmZy0+dHhfc3RhdF9tYXNrICYgQklUKGkpKSB7CisJCQlyZWdfYWRkciA9IE5JQ19QRl9WTklDXzBfMTI3X1RYX1NUQVRfMF80IHwKKwkJCQkgICAodmYgPDwgTklDX1FTX0lEX1NISUZUKSB8CisJCQkJICAgKGkgPDwgMyk7CisJCQluaWNfcmVnX3dyaXRlKG5pYywgcmVnX2FkZHIsIDApOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8PSAxNTsgaSsrKSB7CisJCXFudW0gPSBpID4+IDE7CisJCXN0YXQgPSBpICYgMSA/IDEgOiAwOworCQlyZWdfYWRkciA9ICh2ZiA8PCBOSUNfUVNfSURfU0hJRlQpIHwKKwkJCSAgIChxbnVtIDw8IE5JQ19RX05VTV9TSElGVCkgfCAoc3RhdCA8PCAzKTsKKwkJaWYgKGNmZy0+cnFfc3RhdF9tYXNrICYgQklUKGkpKSB7CisJCQlyZWdfYWRkciB8PSBOSUNfUEZfUVNFVF8wXzEyN19SUV8wXzdfU1RBVF8wXzE7CisJCQluaWNfcmVnX3dyaXRlKG5pYywgcmVnX2FkZHIsIDApOworCQl9CisJCWlmIChjZmctPnNxX3N0YXRfbWFzayAmIEJJVChpKSkgeworCQkJcmVnX2FkZHIgfD0gTklDX1BGX1FTRVRfMF8xMjdfU1FfMF83X1NUQVRfMF8xOworCQkJbmljX3JlZ193cml0ZShuaWMsIHJlZ19hZGRyLCAwKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbmljX2VuYWJsZV90dW5uZWxfcGFyc2luZyhzdHJ1Y3QgbmljcGYgKm5pYywgaW50IHZmKQoreworCXU2NCBwcm90X2RlZiA9IChJUFY2X1BST1QgPDwgMzIpIHwgKElQVjRfUFJPVCA8PCAxNikgfCBFVF9QUk9UOworCXU2NCB2eGxhbl9wcm90X2RlZiA9IChJUFY2X1BST1RfREVGIDw8IDMyKSB8CisJCQkgICAgICAoSVBWNF9QUk9UX0RFRikgPDwgMTYgfCBFVF9QUk9UX0RFRjsKKworCS8qIENvbmZpZ3VyZSB0dW5uZWwgcGFyc2luZyBwYXJhbWV0ZXJzICovCisJbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9SWF9HRU5FVkVfREVGLAorCQkgICAgICAoMVVMTCA8PCA2MyB8IFVEUF9HRU5FVkVfUE9SVF9OVU0pKTsKKwluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX1JYX0dFTkVWRV9QUk9UX0RFRiwKKwkJICAgICAgKCg3VUxMIDw8IDYxKSB8IHByb3RfZGVmKSk7CisJbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9SWF9OVkdSRV9QUk9UX0RFRiwKKwkJICAgICAgKCg3VUxMIDw8IDYxKSB8IHByb3RfZGVmKSk7CisJbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9SWF9WWExBTl9ERUZfMF8xLAorCQkgICAgICAoKDFVTEwgPDwgNjMpIHwgVURQX1ZYTEFOX1BPUlRfTlVNKSk7CisJbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9SWF9WWExBTl9QUk9UX0RFRiwKKwkJICAgICAgKCgweGZVTEwgPDwgNjApIHwgdnhsYW5fcHJvdF9kZWYpKTsKK30KKwogc3RhdGljIHZvaWQgbmljX2VuYWJsZV92ZihzdHJ1Y3QgbmljcGYgKm5pYywgaW50IHZmLCBib29sIGVuYWJsZSkKIHsKIAlpbnQgYmd4LCBsbWFjOwpAQCAtNjY0LDE4ICs4OTcsMTcgQEAKIAkJbWJ4X2FkZHIgKz0gc2l6ZW9mKHU2NCk7CiAJfQogCi0JZGV2X2RiZygmbmljLT5wZGV2LT5kZXYsICIlczogTWFpbGJveCBtc2cgJWQgZnJvbSBWRiVkXG4iLAorCWRldl9kYmcoJm5pYy0+cGRldi0+ZGV2LCAiJXM6IE1haWxib3ggbXNnIDB4JTAyeCBmcm9tIFZGJWRcbiIsCiAJCV9fZnVuY19fLCBtYngubXNnLm1zZywgdmYpOwogCXN3aXRjaCAobWJ4Lm1zZy5tc2cpIHsKIAljYXNlIE5JQ19NQk9YX01TR19SRUFEWToKIAkJbmljX21ieF9zZW5kX3JlYWR5KG5pYywgdmYpOwotCQlpZiAodmYgPCBNQVhfTE1BQykgeworCQlpZiAodmYgPCBuaWMtPm51bV92Zl9lbikgewogCQkJbmljLT5saW5rW3ZmXSA9IDA7CiAJCQluaWMtPmR1cGxleFt2Zl0gPSAwOwogCQkJbmljLT5zcGVlZFt2Zl0gPSAwOwogCQl9Ci0JCXJldCA9IDE7Ci0JCWJyZWFrOworCQlnb3RvIHVubG9jazsKIAljYXNlIE5JQ19NQk9YX01TR19RU19DRkc6CiAJCXJlZ19hZGRyID0gTklDX1BGX1FTRVRfMF8xMjdfQ0ZHIHwKIAkJCSAgIChtYngucXMubnVtIDw8IE5JQ19RU19JRF9TSElGVCk7CkBAIC02OTMsNiArOTI1LDE1IEBACiAJCQkgICAobWJ4LnJxLnFzX251bSA8PCBOSUNfUVNfSURfU0hJRlQpIHwKIAkJCSAgIChtYngucnEucnFfbnVtIDw8IE5JQ19RX05VTV9TSElGVCk7CiAJCW5pY19yZWdfd3JpdGUobmljLCByZWdfYWRkciwgbWJ4LnJxLmNmZyk7CisJCS8qIEVuYWJsZSBDUUVfUlgyX1MgZXh0ZW5zaW9uIGluIENRRV9SWCBkZXNjcmlwdG9yLgorCQkgKiBUaGlzIGdldHMgYXBwZW5kZWQgYnkgZGVmYXVsdCBvbiA4MXh4LzgzeHggY2hpcHMsCisJCSAqIGZvciBjb25zaXN0ZW5jeSBlbmFibGluZyB0aGUgc2FtZSBvbiA4OHh4IHBhc3MyCisJCSAqIHdoZXJlIHRoaXMgaXMgaW50cm9kdWNlZC4KKwkJICovCisJCWlmIChwYXNzMl9zaWxpY29uKG5pYy0+cGRldikpCisJCQluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX1JYX0NGRywgMHgwMSk7CisJCWlmICghcGFzczFfc2lsaWNvbihuaWMtPnBkZXYpKQorCQkJbmljX2VuYWJsZV90dW5uZWxfcGFyc2luZyhuaWMsIHZmKTsKIAkJYnJlYWs7CiAJY2FzZSBOSUNfTUJPWF9NU0dfUlFfQlBfQ0ZHOgogCQlyZWdfYWRkciA9IE5JQ19QRl9RU0VUXzBfMTI3X1JRXzBfN19CUF9DRkcgfApAQCAtNzE3LDggKzk1OCwxMCBAQAogCQluaWNfdHhfY2hhbm5lbF9jZmcobmljLCBtYngucXMubnVtLCAmbWJ4LnNxKTsKIAkJYnJlYWs7CiAJY2FzZSBOSUNfTUJPWF9NU0dfU0VUX01BQzoKLQkJaWYgKHZmID49IG5pYy0+bnVtX3ZmX2VuKQorCQlpZiAodmYgPj0gbmljLT5udW1fdmZfZW4pIHsKKwkJCXJldCA9IC0xOyAvKiBOQUNLICovCiAJCQlicmVhazsKKwkJfQogCQlsbWFjID0gbWJ4Lm1hYy52Zl9pZDsKIAkJYmd4ID0gTklDX0dFVF9CR1hfRlJPTV9WRl9MTUFDX01BUChuaWMtPnZmX2xtYWNfbWFwW2xtYWNdKTsKIAkJbG1hYyA9IE5JQ19HRVRfTE1BQ19GUk9NX1ZGX0xNQUNfTUFQKG5pYy0+dmZfbG1hY19tYXBbbG1hY10pOwpAQCAtNzY3LDI1ICsxMDEwLDM4IEBACiAJY2FzZSBOSUNfTUJPWF9NU0dfTE9PUEJBQ0s6CiAJCXJldCA9IG5pY19jb25maWdfbG9vcGJhY2sobmljLCAmbWJ4Lmxiayk7CiAJCWJyZWFrOworCWNhc2UgTklDX01CT1hfTVNHX1JFU0VUX1NUQVRfQ09VTlRFUjoKKwkJcmV0ID0gbmljX3Jlc2V0X3N0YXRfY291bnRlcnMobmljLCB2ZiwgJm1ieC5yZXNldF9zdGF0KTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2VycigmbmljLT5wZGV2LT5kZXYsCiAJCQkiSW52YWxpZCBtc2cgZnJvbSBWRiVkLCBtc2cgMHgleFxuIiwgdmYsIG1ieC5tc2cubXNnKTsKIAkJYnJlYWs7CiAJfQogCi0JaWYgKCFyZXQpCisJaWYgKCFyZXQpIHsKIAkJbmljX21ieF9zZW5kX2FjayhuaWMsIHZmKTsKLQllbHNlIGlmIChtYngubXNnLm1zZyAhPSBOSUNfTUJPWF9NU0dfUkVBRFkpCisJfSBlbHNlIGlmIChtYngubXNnLm1zZyAhPSBOSUNfTUJPWF9NU0dfUkVBRFkpIHsKKwkJZGV2X2VycigmbmljLT5wZGV2LT5kZXYsICJOQUNLIGZvciBNQk9YIDB4JTAyeCBmcm9tIFZGICVkXG4iLAorCQkJbWJ4Lm1zZy5tc2csIHZmKTsKIAkJbmljX21ieF9zZW5kX25hY2sobmljLCB2Zik7CisJfQogdW5sb2NrOgogCW5pYy0+bWJ4X2xvY2tbdmZdID0gZmFsc2U7CiB9CiAKLXN0YXRpYyB2b2lkIG5pY19tYnhfaW50cl9oYW5kbGVyIChzdHJ1Y3QgbmljcGYgKm5pYywgaW50IG1ieCkKK3N0YXRpYyBpcnFyZXR1cm5fdCBuaWNfbWJ4X2ludHJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpuaWNfaXJxKQogeworCXN0cnVjdCBuaWNwZiAqbmljID0gKHN0cnVjdCBuaWNwZiAqKW5pY19pcnE7CisJaW50IG1ieDsKIAl1NjQgaW50cjsKIAl1OCAgdmYsIHZmX3Blcl9tYnhfcmVnID0gNjQ7CiAKKwlpZiAoaXJxID09IG5pYy0+bXNpeF9lbnRyaWVzW05JQ19QRl9JTlRSX0lEX01CT1gwXS52ZWN0b3IpCisJCW1ieCA9IDA7CisJZWxzZQorCQltYnggPSAxOworCiAJaW50ciA9IG5pY19yZWdfcmVhZChuaWMsIE5JQ19QRl9NQUlMQk9YX0lOVCArIChtYnggPDwgMykpOwogCWRldl9kYmcoJm5pYy0+cGRldi0+ZGV2LCAiUEYgaW50ZXJydXB0IE1ib3glZCAweCVsbHhcbiIsIG1ieCwgaW50cik7CiAJZm9yICh2ZiA9IDA7IHZmIDwgdmZfcGVyX21ieF9yZWc7IHZmKyspIHsKQEAgLTc5NywyMyArMTA1Myw2IEBACiAJCQluaWNfY2xlYXJfbWJ4X2ludHIobmljLCB2ZiwgbWJ4KTsKIAkJfQogCX0KLX0KLQotc3RhdGljIGlycXJldHVybl90IG5pY19tYngwX2ludHJfaGFuZGxlciAoaW50IGlycSwgdm9pZCAqbmljX2lycSkKLXsKLQlzdHJ1Y3QgbmljcGYgKm5pYyA9IChzdHJ1Y3QgbmljcGYgKiluaWNfaXJxOwotCi0JbmljX21ieF9pbnRyX2hhbmRsZXIobmljLCAwKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIGlycXJldHVybl90IG5pY19tYngxX2ludHJfaGFuZGxlciAoaW50IGlycSwgdm9pZCAqbmljX2lycSkKLXsKLQlzdHJ1Y3QgbmljcGYgKm5pYyA9IChzdHJ1Y3QgbmljcGYgKiluaWNfaXJxOwotCi0JbmljX21ieF9pbnRyX2hhbmRsZXIobmljLCAxKTsKLQogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtODIxLDcgKzEwNjAsMTMgQEAKIHsKIAlpbnQgaSwgcmV0OwogCi0JbmljLT5udW1fdmVjID0gTklDX1BGX01TSVhfVkVDVE9SUzsKKwluaWMtPm51bV92ZWMgPSBwY2lfbXNpeF92ZWNfY291bnQobmljLT5wZGV2KTsKKworCW5pYy0+bXNpeF9lbnRyaWVzID0ga21hbGxvY19hcnJheShuaWMtPm51bV92ZWMsCisJCQkJCSAgc2l6ZW9mKHN0cnVjdCBtc2l4X2VudHJ5KSwKKwkJCQkJICBHRlBfS0VSTkVMKTsKKwlpZiAoIW5pYy0+bXNpeF9lbnRyaWVzKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCWZvciAoaSA9IDA7IGkgPCBuaWMtPm51bV92ZWM7IGkrKykKIAkJbmljLT5tc2l4X2VudHJpZXNbaV0uZW50cnkgPSBpOwpAQCAtODI5LDggKzEwNzQsOSBAQAogCXJldCA9IHBjaV9lbmFibGVfbXNpeChuaWMtPnBkZXYsIG5pYy0+bXNpeF9lbnRyaWVzLCBuaWMtPm51bV92ZWMpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmbmljLT5wZGV2LT5kZXYsCi0JCQkiUmVxdWVzdCBmb3IgIyVkIG1zaXggdmVjdG9ycyBmYWlsZWRcbiIsCi0JCQkgICBuaWMtPm51bV92ZWMpOworCQkJIlJlcXVlc3QgZm9yICMlZCBtc2l4IHZlY3RvcnMgZmFpbGVkLCByZXR1cm5lZCAlZFxuIiwKKwkJCSAgIG5pYy0+bnVtX3ZlYywgcmV0KTsKKwkJa2ZyZWUobmljLT5tc2l4X2VudHJpZXMpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtODQyLDYgKzEwODgsNyBAQAogewogCWlmIChuaWMtPm1zaXhfZW5hYmxlZCkgewogCQlwY2lfZGlzYWJsZV9tc2l4KG5pYy0+cGRldik7CisJCWtmcmVlKG5pYy0+bXNpeF9lbnRyaWVzKTsKIAkJbmljLT5tc2l4X2VuYWJsZWQgPSAwOwogCQluaWMtPm51bV92ZWMgPSAwOwogCX0KQEAgLTg2MCwyNyArMTEwNywyNiBAQAogCiBzdGF0aWMgaW50IG5pY19yZWdpc3Rlcl9pbnRlcnJ1cHRzKHN0cnVjdCBuaWNwZiAqbmljKQogewotCWludCByZXQ7CisJaW50IGksIHJldDsKIAogCS8qIEVuYWJsZSBNU0ktWCAqLwogCXJldCA9IG5pY19lbmFibGVfbXNpeChuaWMpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQkvKiBSZWdpc3RlciBtYWlsYm94IGludGVycnVwdCBoYW5kbGVycyAqLwotCXJldCA9IHJlcXVlc3RfaXJxKG5pYy0+bXNpeF9lbnRyaWVzW05JQ19QRl9JTlRSX0lEX01CT1gwXS52ZWN0b3IsCi0JCQkgIG5pY19tYngwX2ludHJfaGFuZGxlciwgMCwgIk5JQyBNYm94MCIsIG5pYyk7Ci0JaWYgKHJldCkKLQkJZ290byBmYWlsOworCS8qIFJlZ2lzdGVyIG1haWxib3ggaW50ZXJydXB0IGhhbmRsZXIgKi8KKwlmb3IgKGkgPSBOSUNfUEZfSU5UUl9JRF9NQk9YMDsgaSA8IG5pYy0+bnVtX3ZlYzsgaSsrKSB7CisJCXNwcmludGYobmljLT5pcnFfbmFtZVtpXSwKKwkJCSJOSUNQRiBNYm94JWQiLCAoaSAtIE5JQ19QRl9JTlRSX0lEX01CT1gwKSk7CiAKLQluaWMtPmlycV9hbGxvY2F0ZWRbTklDX1BGX0lOVFJfSURfTUJPWDBdID0gdHJ1ZTsKKwkJcmV0ID0gcmVxdWVzdF9pcnEobmljLT5tc2l4X2VudHJpZXNbaV0udmVjdG9yLAorCQkJCSAgbmljX21ieF9pbnRyX2hhbmRsZXIsIDAsCisJCQkJICBuaWMtPmlycV9uYW1lW2ldLCBuaWMpOworCQlpZiAocmV0KQorCQkJZ290byBmYWlsOwogCi0JcmV0ID0gcmVxdWVzdF9pcnEobmljLT5tc2l4X2VudHJpZXNbTklDX1BGX0lOVFJfSURfTUJPWDFdLnZlY3RvciwKLQkJCSAgbmljX21ieDFfaW50cl9oYW5kbGVyLCAwLCAiTklDIE1ib3gxIiwgbmljKTsKLQlpZiAocmV0KQotCQlnb3RvIGZhaWw7Ci0KLQluaWMtPmlycV9hbGxvY2F0ZWRbTklDX1BGX0lOVFJfSURfTUJPWDFdID0gdHJ1ZTsKKwkJbmljLT5pcnFfYWxsb2NhdGVkW2ldID0gdHJ1ZTsKKwl9CiAKIAkvKiBFbmFibGUgbWFpbGJveCBpbnRlcnJ1cHQgKi8KIAluaWNfZW5hYmxlX21ieF9pbnRyKG5pYyk7CkBAIC04ODksNiArMTEzNSw3IEBACiBmYWlsOgogCWRldl9lcnIoJm5pYy0+cGRldi0+ZGV2LCAiUmVxdWVzdCBpcnEgZmFpbGVkXG4iKTsKIAluaWNfZnJlZV9hbGxfaW50ZXJydXB0cyhuaWMpOworCW5pY19kaXNhYmxlX21zaXgobmljKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC05MDMsNiArMTE1MCwxMiBAQAogCWludCBwb3MsIHNxc19wZXJfdmYgPSBNQVhfU1FTX1BFUl9WRl9TSU5HTEVfTk9ERTsKIAl1MTYgdG90YWxfdmY7CiAKKwkvKiBTZWNvbmRhcnkgUXNldHMgYXJlIG5lZWRlZCBvbmx5IGlmIENQVSBjb3VudCBpcworCSAqIG1vcmV0aGFuIE1BWF9RVUVVRVNfUEVSX1FTRVQuCisJICovCisJaWYgKG51bV9vbmxpbmVfY3B1cygpIDw9IE1BWF9RVUVVRVNfUEVSX1FTRVQpCisJCXJldHVybiAwOworCiAJLyogQ2hlY2sgaWYgaXRzIGEgbXVsdGktbm9kZSBlbnZpcm9ubWVudCAqLwogCWlmIChucl9ub2RlX2lkcyA+IDEpCiAJCXNxc19wZXJfdmYgPSBNQVhfU1FTX1BFUl9WRjsKQEAgLTEwMDgsNiArMTI2MSwxMiBAQAogCWlmICghbmljKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCW5pYy0+aHcgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IGh3X2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5pYy0+aHcpIHsKKwkJZGV2bV9rZnJlZShkZXYsIG5pYyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBuaWMpOwogCiAJbmljLT5wZGV2ID0gcGRldjsKQEAgLTEwNDcsMTMgKzEzMDYsMTIgQEAKIAogCW5pYy0+bm9kZSA9IG5pY19nZXRfbm9kZV9pZChwZGV2KTsKIAotCW5pY19zZXRfbG1hY192Zl9tYXBwaW5nKG5pYyk7Ci0KIAkvKiBJbml0aWFsaXplIGhhcmR3YXJlICovCi0JbmljX2luaXRfaHcobmljKTsKKwllcnIgPSBuaWNfaW5pdF9odyhuaWMpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3JlbGVhc2VfcmVnaW9uczsKIAotCS8qIFNldCBSU1MgVEJMIHNpemUgZm9yIGVhY2ggVkYgKi8KLQluaWMtPnJzc19pbmRfdGJsX3NpemUgPSBOSUNfTUFYX1JTU19JRFJfVEJMX1NJWkU7CisJbmljX3NldF9sbWFjX3ZmX21hcHBpbmcobmljKTsKIAogCS8qIFJlZ2lzdGVyIGludGVycnVwdHMgKi8KIAllcnIgPSBuaWNfcmVnaXN0ZXJfaW50ZXJydXB0cyhuaWMpOwpAQCAtMTA4Niw2ICsxMzQ0LDkgQEAKIGVycl9yZWxlYXNlX3JlZ2lvbnM6CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKIGVycl9kaXNhYmxlX2RldmljZToKKwluaWNfZnJlZV9sbWFjbWVtKG5pYyk7CisJZGV2bV9rZnJlZShkZXYsIG5pYy0+aHcpOworCWRldm1fa2ZyZWUoZGV2LCBuaWMpOwogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAJcmV0dXJuIGVycjsKQEAgLTExMDYsNiArMTM2NywxMSBAQAogCiAJbmljX3VucmVnaXN0ZXJfaW50ZXJydXB0cyhuaWMpOwogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisKKwluaWNfZnJlZV9sbWFjbWVtKG5pYyk7CisJZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBuaWMtPmh3KTsKKwlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIG5pYyk7CisKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljX3JlZy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljX3JlZy5oCmluZGV4IGFmYjEwZTMuLmVkZjc3OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pY19yZWcuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWNfcmVnLmgKQEAgLTM2LDYgKzM2LDIwIEBACiAjZGVmaW5lICAgTklDX1BGX01BSUxCT1hfRU5BX1cxQwkJKDB4MDQ1MCkKICNkZWZpbmUgICBOSUNfUEZfTUFJTEJPWF9FTkFfVzFTCQkoMHgwNDcwKQogI2RlZmluZSAgIE5JQ19QRl9SWF9FVFlQRV8wXzcJCQkoMHgwNTAwKQorI2RlZmluZSAgIE5JQ19QRl9SWF9HRU5FVkVfREVGCQkJKDB4MDU4MCkKKyNkZWZpbmUgICAgVURQX0dFTkVWRV9QT1JUX05VTQkJCQkweDE3QzFVTEwKKyNkZWZpbmUgICBOSUNfUEZfUlhfR0VORVZFX1BST1RfREVGCQkoMHgwNTg4KQorI2RlZmluZSAgICBJUFY2X1BST1QJCQkJCTB4ODZERFVMTAorI2RlZmluZSAgICBJUFY0X1BST1QJCQkJCTB4ODAwVUxMCisjZGVmaW5lICAgIEVUX1BST1QJCQkJCTB4NjU1OFVMTAorI2RlZmluZSAgIE5JQ19QRl9SWF9OVkdSRV9QUk9UX0RFRgkJKDB4MDU5OCkKKyNkZWZpbmUgICBOSUNfUEZfUlhfVlhMQU5fREVGXzBfMQkJKDB4MDVBMCkKKyNkZWZpbmUgICAgVURQX1ZYTEFOX1BPUlRfTlVNCQkJCTB4MTJCNQorI2RlZmluZSAgIE5JQ19QRl9SWF9WWExBTl9QUk9UX0RFRgkJKDB4MDVCMCkKKyNkZWZpbmUgICAgSVBWNl9QUk9UX0RFRgkJCQkweDJVTEwKKyNkZWZpbmUgICAgSVBWNF9QUk9UX0RFRgkJCQkweDFVTEwKKyNkZWZpbmUgICAgRVRfUFJPVF9ERUYJCQkJCTB4M1VMTAorI2RlZmluZSAgIE5JQ19QRl9SWF9DRkcJCQkJKDB4MDVEMCkKICNkZWZpbmUgICBOSUNfUEZfUEtJTkRfMF8xNV9DRkcJCQkoMHgwNjAwKQogI2RlZmluZSAgIE5JQ19QRl9FQ0MwX0ZMSVAwCQkJKDB4MTAwMCkKICNkZWZpbmUgICBOSUNfUEZfRUNDMV9GTElQMAkJCSgweDEwMDgpCkBAIC0xMDMsNiArMTE3LDcgQEAKICNkZWZpbmUgICBOSUNfUEZfU1dfU1lOQ19SWF9ET05FCQkoMHg0OTAwMDgpCiAjZGVmaW5lICAgTklDX1BGX1RMMl8wXzYzX0NGRwkJCSgweDUwMDAwMCkKICNkZWZpbmUgICBOSUNfUEZfVEwyXzBfNjNfUFJJCQkJKDB4NTIwMDAwKQorI2RlZmluZSAgIE5JQ19QRl9UTDJfTE1BQwkJCSgweDU0MDAwMCkKICNkZWZpbmUgICBOSUNfUEZfVEwyXzBfNjNfU0hfU1RBVFVTCQkoMHg1ODAwMDApCiAjZGVmaW5lICAgTklDX1BGX1RMM0FfMF82M19DRkcJCQkoMHg1RjAwMDApCiAjZGVmaW5lICAgTklDX1BGX1RMM18wXzI1NV9DRkcJCQkoMHg2MDAwMDApCkBAIC0xNzAsNyArMTg1LDYgQEAKICNkZWZpbmUgICBOSUNfUVNFVF9TUV8wXzdfRE9PUgkJCSgweDAxMDgzOCkKICNkZWZpbmUgICBOSUNfUVNFVF9TUV8wXzdfU1RBVFVTCQkoMHgwMTA4NDApCiAjZGVmaW5lICAgTklDX1FTRVRfU1FfMF83X0RFQlVHCQkJKDB4MDEwODQ4KQotI2RlZmluZSAgIE5JQ19RU0VUX1NRXzBfN19DTk1fQ0hHCQkoMHgwMTA4NjApCiAjZGVmaW5lICAgTklDX1FTRVRfU1FfMF83X1NUQVRfMF8xCQkoMHgwMTA5MDApCiAKICNkZWZpbmUgICBOSUNfUVNFVF9SQkRSXzBfMV9DRkcJCQkoMHgwMTBDMDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWN2Zl9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWN2Zl9ldGh0b29sLmMKaW5kZXggZDJkOGVmMi4uYWQ0ZmRkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljdmZfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pY3ZmX2V0aHRvb2wuYwpAQCAtMzgyLDcgKzM4MiwxMCBAQAogCQlwW2krK10gPSBuaWN2Zl9xdWV1ZV9yZWdfcmVhZChuaWMsIE5JQ19RU0VUX1NRXzBfN19ET09SLCBxKTsKIAkJcFtpKytdID0gbmljdmZfcXVldWVfcmVnX3JlYWQobmljLCBOSUNfUVNFVF9TUV8wXzdfU1RBVFVTLCBxKTsKIAkJcFtpKytdID0gbmljdmZfcXVldWVfcmVnX3JlYWQobmljLCBOSUNfUVNFVF9TUV8wXzdfREVCVUcsIHEpOwotCQlwW2krK10gPSBuaWN2Zl9xdWV1ZV9yZWdfcmVhZChuaWMsIE5JQ19RU0VUX1NRXzBfN19DTk1fQ0hHLCBxKTsKKwkJLyogUGFkZGluZywgd2FzIE5JQ19RU0VUX1NRXzBfN19DTk1fQ0hHLCB3aGljaAorCQkgKiBwcm9kdWNlcyBidXMgZXJyb3JzIHdoZW4gcmVhZAorCQkgKi8KKwkJcFtpKytdID0gMDsKIAkJcFtpKytdID0gbmljdmZfcXVldWVfcmVnX3JlYWQobmljLCBOSUNfUVNFVF9TUV8wXzdfU1RBVF8wXzEsIHEpOwogCQlyZWdfb2Zmc2V0ID0gTklDX1FTRVRfU1FfMF83X1NUQVRfMF8xIHwgKDEgPDwgMyk7CiAJCXBbaSsrXSA9IG5pY3ZmX3F1ZXVlX3JlZ19yZWFkKG5pYywgcmVnX29mZnNldCwgcSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWN2Zl9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWN2Zl9tYWluLmMKaW5kZXggYTE5ZTczZi4uNDVhMTNmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljdmZfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pY3ZmX21haW4uYwpAQCAtMjksMTAgKzI5LDIwIEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgbmljdmZfaWRfdGFibGVbXSA9IHsKIAl7IFBDSV9ERVZJQ0VfU1VCKFBDSV9WRU5ET1JfSURfQ0FWSVVNLAogCQkJIFBDSV9ERVZJQ0VfSURfVEhVTkRFUl9OSUNfVkYsCi0JCQkgUENJX1ZFTkRPUl9JRF9DQVZJVU0sIDB4QTEzNCkgfSwKKwkJCSBQQ0lfVkVORE9SX0lEX0NBVklVTSwKKwkJCSBQQ0lfU1VCU1lTX0RFVklEXzg4WFhfTklDX1ZGKSB9LAogCXsgUENJX0RFVklDRV9TVUIoUENJX1ZFTkRPUl9JRF9DQVZJVU0sCiAJCQkgUENJX0RFVklDRV9JRF9USFVOREVSX1BBU1MxX05JQ19WRiwKLQkJCSBQQ0lfVkVORE9SX0lEX0NBVklVTSwgMHhBMTFFKSB9LAorCQkJIFBDSV9WRU5ET1JfSURfQ0FWSVVNLAorCQkJIFBDSV9TVUJTWVNfREVWSURfODhYWF9QQVNTMV9OSUNfVkYpIH0sCisJeyBQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0NBVklVTSwKKwkJCSBQQ0lfREVWSUNFX0lEX1RIVU5ERVJfTklDX1ZGLAorCQkJIFBDSV9WRU5ET1JfSURfQ0FWSVVNLAorCQkJIFBDSV9TVUJTWVNfREVWSURfODFYWF9OSUNfVkYpIH0sCisJeyBQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0NBVklVTSwKKwkJCSBQQ0lfREVWSUNFX0lEX1RIVU5ERVJfTklDX1ZGLAorCQkJIFBDSV9WRU5ET1JfSURfQ0FWSVVNLAorCQkJIFBDSV9TVUJTWVNfREVWSURfODNYWF9OSUNfVkYpIH0sCiAJeyAwLCB9ICAvKiBlbmQgb2YgdGFibGUgKi8KIH07CiAKQEAgLTEzNCwxNSArMTQ0LDE5IEBACiAKIAkvKiBXYWl0IGZvciBwcmV2aW91cyBtZXNzYWdlIHRvIGJlIGFja2VkLCB0aW1lb3V0IDJzZWMgKi8KIAl3aGlsZSAoIW5pYy0+cGZfYWNrZWQpIHsKLQkJaWYgKG5pYy0+cGZfbmFja2VkKQorCQlpZiAobmljLT5wZl9uYWNrZWQpIHsKKwkJCW5ldGRldl9lcnIobmljLT5uZXRkZXYsCisJCQkJICAgIlBGIE5BQ0sgdG8gbWJveCBtc2cgMHglMDJ4IGZyb20gVkYlZFxuIiwKKwkJCQkgICAobWJ4LT5tc2cubXNnICYgMHhGRiksIG5pYy0+dmZfaWQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAkJbXNsZWVwKHNsZWVwKTsKIAkJaWYgKG5pYy0+cGZfYWNrZWQpCiAJCQlicmVhazsKIAkJdGltZW91dCAtPSBzbGVlcDsKIAkJaWYgKCF0aW1lb3V0KSB7CiAJCQluZXRkZXZfZXJyKG5pYy0+bmV0ZGV2LAotCQkJCSAgICJQRiBkaWRuJ3QgYWNrIHRvIG1ib3ggbXNnICVkIGZyb20gVkYlZFxuIiwKKwkJCQkgICAiUEYgZGlkbid0IEFDSyB0byBtYm94IG1zZyAweCUwMnggZnJvbSBWRiVkXG4iLAogCQkJCSAgIChtYngtPm1zZy5tc2cgJiAweEZGKSwgbmljLT52Zl9pZCk7CiAJCQlyZXR1cm4gLUVCVVNZOwogCQl9CkBAIC0zNTIsMTMgKzM2Niw3IEBACiAKIAlyc3MtPmVuYWJsZSA9IHRydWU7CiAKLQkvKiBVc2luZyB0aGUgSFcgcmVzZXQgdmFsdWUgZm9yIG5vdyAqLwotCXJzcy0+a2V5WzBdID0gMHhGRUVEMEJBREZFRUQwQkFEVUxMOwotCXJzcy0+a2V5WzFdID0gMHhGRUVEMEJBREZFRUQwQkFEVUxMOwotCXJzcy0+a2V5WzJdID0gMHhGRUVEMEJBREZFRUQwQkFEVUxMOwotCXJzcy0+a2V5WzNdID0gMHhGRUVEMEJBREZFRUQwQkFEVUxMOwotCXJzcy0+a2V5WzRdID0gMHhGRUVEMEJBREZFRUQwQkFEVUxMOwotCisJbmV0ZGV2X3Jzc19rZXlfZmlsbChyc3MtPmtleSwgUlNTX0hBU0hfS0VZX1NJWkUgKiBzaXplb2YodTY0KSk7CiAJbmljdmZfc2V0X3Jzc19rZXkobmljKTsKIAogCXJzcy0+Y2ZnID0gUlNTX0lQX0hBU0hfRU5BIHwgUlNTX1RDUF9IQVNIX0VOQSB8IFJTU19VRFBfSEFTSF9FTkE7CkBAIC01MDcsMTIgKzUxNSwxNSBAQAogCiBzdGF0aWMgdm9pZCBuaWN2Zl9zbmRfcGt0X2hhbmRsZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKIAkJCQkgIHN0cnVjdCBjbXBfcXVldWUgKmNxLAotCQkJCSAgc3RydWN0IGNxZV9zZW5kX3QgKmNxZV90eCwgaW50IGNxZV90eXBlKQorCQkJCSAgc3RydWN0IGNxZV9zZW5kX3QgKmNxZV90eCwKKwkJCQkgIGludCBjcWVfdHlwZSwgaW50IGJ1ZGdldCwKKwkJCQkgIHVuc2lnbmVkIGludCAqdHhfcGt0cywgdW5zaWduZWQgaW50ICp0eF9ieXRlcykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKIAlzdHJ1Y3QgbmljdmYgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IHNuZF9xdWV1ZSAqc3E7CiAJc3RydWN0IHNxX2hkcl9zdWJkZXNjICpoZHI7CisJc3RydWN0IHNxX2hkcl9zdWJkZXNjICp0c29fc3FlOwogCiAJc3EgPSAmbmljLT5xcy0+c3FbY3FlX3R4LT5zcV9pZHhdOwogCkBAIC01MjcsMTcgKzUzOCwyMyBAQAogCiAJbmljdmZfY2hlY2tfY3FlX3R4X2VycnMobmljLCBjcSwgY3FlX3R4KTsKIAlza2IgPSAoc3RydWN0IHNrX2J1ZmYgKilzcS0+c2tidWZmW2NxZV90eC0+c3FlX3B0cl07Ci0JLyogRm9yIFRTTyBvZmZsb2FkZWQgcGFja2V0cyBvbmx5IG9uZSBTUUUgd2lsbCBoYXZlIGEgdmFsaWQgU0tCICovCiAJaWYgKHNrYikgeworCQkvKiBDaGVjayBmb3IgZHVtbXkgZGVzY3JpcHRvciB1c2VkIGZvciBIVyBUU08gb2ZmbG9hZCBvbiA4OHh4ICovCisJCWlmIChoZHItPmRvbnRfc2VuZCkgeworCQkJLyogR2V0IGFjdHVhbCBUU08gZGVzY3JpcHRvcnMgYW5kIGZyZWUgdGhlbSAqLworCQkJdHNvX3NxZSA9CisJCQkgKHN0cnVjdCBzcV9oZHJfc3ViZGVzYyAqKUdFVF9TUV9ERVNDKHNxLCBoZHItPnJzdmQyKTsKKwkJCW5pY3ZmX3B1dF9zcV9kZXNjKHNxLCB0c29fc3FlLT5zdWJkZXNjX2NudCArIDEpOworCQl9CiAJCW5pY3ZmX3B1dF9zcV9kZXNjKHNxLCBoZHItPnN1YmRlc2NfY250ICsgMSk7CiAJCXByZWZldGNoKHNrYik7Ci0JCWRldl9jb25zdW1lX3NrYl9hbnkoc2tiKTsKKwkJKCp0eF9wa3RzKSsrOworCQkqdHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCW5hcGlfY29uc3VtZV9za2Ioc2tiLCBidWRnZXQpOwogCQlzcS0+c2tidWZmW2NxZV90eC0+c3FlX3B0cl0gPSAodTY0KU5VTEw7CiAJfSBlbHNlIHsKLQkJLyogSW4gY2FzZSBvZiBIVyBUU08sIEhXIHNlbmRzIGEgQ1FFIGZvciBlYWNoIHNlZ21lbnQgb2YgYSBUU08KLQkJICogcGFja2V0IGluc3RlYWQgb2YgYSBzaW5nbGUgQ1FFIGZvciB0aGUgd2hvbGUgVFNPIHBhY2tldAotCQkgKiB0cmFuc21pdHRlZC4gRWFjaCBvZiB0aGlzIENRRSBwb2ludHMgdG8gdGhlIHNhbWUgU1FFLCBzbwotCQkgKiBhdm9pZCBmcmVlaW5nIHNhbWUgU1FFIG11bHRpcGxlIHRpbWVzLgorCQkvKiBJbiBjYXNlIG9mIFNXIFRTTyBvbiA4OHh4LCBvbmx5IGxhc3Qgc2VnbWVudCB3aWxsIGhhdmUKKwkJICogYSBTS0IgYXR0YWNoZWQsIHNvIGp1c3QgZnJlZSBTUUVzIGhlcmUuCiAJCSAqLwogCQlpZiAoIW5pYy0+aHdfdHNvKQogCQkJbmljdmZfcHV0X3NxX2Rlc2Moc3EsIGhkci0+c3ViZGVzY19jbnQgKyAxKTsKQEAgLTY0OCw2ICs2NjUsNyBAQAogCXN0cnVjdCBjbXBfcXVldWUgKmNxID0gJnFzLT5jcVtjcV9pZHhdOwogCXN0cnVjdCBjcWVfcnhfdCAqY3FfZGVzYzsKIAlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHE7CisJdW5zaWduZWQgaW50IHR4X3BrdHMgPSAwLCB0eF9ieXRlcyA9IDA7CiAKIAlzcGluX2xvY2tfYmgoJmNxLT5sb2NrKTsKIGxvb3A6CkBAIC02ODYsNyArNzA0LDggQEAKIAkJYnJlYWs7CiAJCWNhc2UgQ1FFX1RZUEVfU0VORDoKIAkJCW5pY3ZmX3NuZF9wa3RfaGFuZGxlcihuZXRkZXYsIGNxLAotCQkJCQkgICAgICAodm9pZCAqKWNxX2Rlc2MsIENRRV9UWVBFX1NFTkQpOworCQkJCQkgICAgICAodm9pZCAqKWNxX2Rlc2MsIENRRV9UWVBFX1NFTkQsCisJCQkJCSAgICAgIGJ1ZGdldCwgJnR4X3BrdHMsICZ0eF9ieXRlcyk7CiAJCQl0eF9kb25lKys7CiAJCWJyZWFrOwogCQljYXNlIENRRV9UWVBFX0lOVkFMSUQ6CkBAIC03MTUsNiArNzM0LDkgQEAKIAkJbmV0ZGV2ID0gbmljLT5wbmljdmYtPm5ldGRldjsKIAkJdHhxID0gbmV0ZGV2X2dldF90eF9xdWV1ZShuZXRkZXYsCiAJCQkJCSAgbmljdmZfbmV0ZGV2X3FpZHgobmljLCBjcV9pZHgpKTsKKwkJaWYgKHR4X3BrdHMpCisJCQluZXRkZXZfdHhfY29tcGxldGVkX3F1ZXVlKHR4cSwgdHhfcGt0cywgdHhfYnl0ZXMpOworCiAJCW5pYyA9IG5pYy0+cG5pY3ZmOwogCQlpZiAobmV0aWZfdHhfcXVldWVfc3RvcHBlZCh0eHEpICYmIG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgewogCQkJbmV0aWZfdHhfc3RhcnRfcXVldWUodHhxKTsKQEAgLTkyOCwxNiArOTUwLDE5IEBACiAJaW50IHZlY3RvcjsKIAogCWZvcl9lYWNoX2NxX2lycShpcnEpCi0JCXNwcmludGYobmljLT5pcnFfbmFtZVtpcnFdLCAiTklDVkYlZCBDUSVkIiwKLQkJCW5pYy0+dmZfaWQsIGlycSk7CisJCXNwcmludGYobmljLT5pcnFfbmFtZVtpcnFdLCAiJXMtcnh0eC0lZCIsCisJCQluaWMtPnBuaWN2Zi0+bmV0ZGV2LT5uYW1lLAorCQkJbmljdmZfbmV0ZGV2X3FpZHgobmljLCBpcnEpKTsKIAogCWZvcl9lYWNoX3NxX2lycShpcnEpCi0JCXNwcmludGYobmljLT5pcnFfbmFtZVtpcnFdLCAiTklDVkYlZCBTUSVkIiwKLQkJCW5pYy0+dmZfaWQsIGlycSAtIE5JQ1ZGX0lOVFJfSURfU1EpOworCQlzcHJpbnRmKG5pYy0+aXJxX25hbWVbaXJxXSwgIiVzLXNxLSVkIiwKKwkJCW5pYy0+cG5pY3ZmLT5uZXRkZXYtPm5hbWUsCisJCQluaWN2Zl9uZXRkZXZfcWlkeChuaWMsIGlycSAtIE5JQ1ZGX0lOVFJfSURfU1EpKTsKIAogCWZvcl9lYWNoX3JiZHJfaXJxKGlycSkKLQkJc3ByaW50ZihuaWMtPmlycV9uYW1lW2lycV0sICJOSUNWRiVkIFJCRFIlZCIsCi0JCQluaWMtPnZmX2lkLCBpcnEgLSBOSUNWRl9JTlRSX0lEX1JCRFIpOworCQlzcHJpbnRmKG5pYy0+aXJxX25hbWVbaXJxXSwgIiVzLXJiZHItJWQiLAorCQkJbmljLT5wbmljdmYtPm5ldGRldi0+bmFtZSwKKwkJCW5pYy0+c3FzX21vZGUgPyAobmljLT5zcXNfaWQgKyAxKSA6IDApOwogCiAJLyogUmVnaXN0ZXIgQ1EgaW50ZXJydXB0cyAqLwogCWZvciAoaXJxID0gMDsgaXJxIDwgbmljLT5xcy0+Y3FfY250OyBpcnErKykgewpAQCAtOTYxLDggKzk4Niw5IEBACiAJfQogCiAJLyogUmVnaXN0ZXIgUVMgZXJyb3IgaW50ZXJydXB0ICovCi0Jc3ByaW50ZihuaWMtPmlycV9uYW1lW05JQ1ZGX0lOVFJfSURfUVNfRVJSXSwKLQkJIk5JQ1ZGJWQgUXNldCBlcnJvciIsIG5pYy0+dmZfaWQpOworCXNwcmludGYobmljLT5pcnFfbmFtZVtOSUNWRl9JTlRSX0lEX1FTX0VSUl0sICIlcy1xc2V0LWVyci0lZCIsCisJCW5pYy0+cG5pY3ZmLT5uZXRkZXYtPm5hbWUsCisJCW5pYy0+c3FzX21vZGUgPyAobmljLT5zcXNfaWQgKyAxKSA6IDApOwogCWlycSA9IE5JQ1ZGX0lOVFJfSURfUVNfRVJSOwogCXJldCA9IHJlcXVlc3RfaXJxKG5pYy0+bXNpeF9lbnRyaWVzW2lycV0udmVjdG9yLAogCQkJICBuaWN2Zl9xc19lcnJfaW50cl9oYW5kbGVyLApAQCAtMTE0MSw2ICsxMTY3LDkgQEAKIAogCW5ldGlmX3R4X2Rpc2FibGUobmV0ZGV2KTsKIAorCWZvciAocWlkeCA9IDA7IHFpZHggPCBuZXRkZXYtPm51bV90eF9xdWV1ZXM7IHFpZHgrKykKKwkJbmV0ZGV2X3R4X3Jlc2V0X3F1ZXVlKG5ldGRldl9nZXRfdHhfcXVldWUobmV0ZGV2LCBxaWR4KSk7CisKIAkvKiBGcmVlIHJlc291cmNlcyAqLwogCW5pY3ZmX2NvbmZpZ19kYXRhX3RyYW5zZmVyKG5pYywgZmFsc2UpOwogCkBAIC0xMTkxLDcgKzEyMjAsNyBAQAogCX0KIAogCS8qIENoZWNrIGlmIHdlIGdvdCBNQUMgYWRkcmVzcyBmcm9tIFBGIG9yIGVsc2UgZ2VuZXJhdGUgYSByYWRvbSBNQUMgKi8KLQlpZiAoaXNfemVyb19ldGhlcl9hZGRyKG5ldGRldi0+ZGV2X2FkZHIpKSB7CisJaWYgKCFuaWMtPnNxc19tb2RlICYmIGlzX3plcm9fZXRoZXJfYWRkcihuZXRkZXYtPmRldl9hZGRyKSkgewogCQlldGhfaHdfYWRkcl9yYW5kb20obmV0ZGV2KTsKIAkJbmljdmZfaHdfc2V0X21hY19hZGRyKG5pYywgbmV0ZGV2KTsKIAl9CkBAIC0xNTAyLDYgKzE1MzEsNyBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CiAJc3RydWN0IG5pY3ZmICpuaWM7CiAJaW50ICAgIGVyciwgcWNvdW50OworCXUxNiAgICBzZGV2aWQ7CiAKIAllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKIAlpZiAoZXJyKSB7CkBAIC0xNTI3LDE0ICsxNTU3LDEzIEBACiAJCWdvdG8gZXJyX3JlbGVhc2VfcmVnaW9uczsKIAl9CiAKLQlxY291bnQgPSBNQVhfQ01QX1FVRVVFU19QRVJfUVM7CisJcWNvdW50ID0gbmV0aWZfZ2V0X251bV9kZWZhdWx0X3Jzc19xdWV1ZXMoKTsKIAogCS8qIFJlc3RyaWN0IG11bHRpcXNldCBzdXBwb3J0IG9ubHkgZm9yIGhvc3QgYm91bmQgVkZzICovCiAJaWYgKHBkZXYtPmlzX3ZpcnRmbikgewogCQkvKiBTZXQgbWF4IG51bWJlciBvZiBxdWV1ZXMgcGVyIFZGICovCi0JCXFjb3VudCA9IHJvdW5kdXAobnVtX29ubGluZV9jcHVzKCksIE1BWF9DTVBfUVVFVUVTX1BFUl9RUyk7Ci0JCXFjb3VudCA9IG1pbihxY291bnQsCi0JCQkgICAgIChNQVhfU1FTX1BFUl9WRiArIDEpICogTUFYX0NNUF9RVUVVRVNfUEVSX1FTKTsKKwkJcWNvdW50ID0gbWluX3QoaW50LCBudW1fb25saW5lX2NwdXMoKSwKKwkJCSAgICAgICAoTUFYX1NRU19QRVJfVkYgKyAxKSAqIE1BWF9DTVBfUVVFVUVTX1BFUl9RUyk7CiAJfQogCiAJbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXZfbXFzKHNpemVvZihzdHJ1Y3QgbmljdmYpLCBxY291bnQsIHFjb3VudCk7CkBAIC0xNTc1LDYgKzE2MDQsMTAgQEAKIAlpZiAoIXBhc3MxX3NpbGljb24obmljLT5wZGV2KSkKIAkJbmljLT5od190c28gPSB0cnVlOwogCisJcGNpX3JlYWRfY29uZmlnX3dvcmQobmljLT5wZGV2LCBQQ0lfU1VCU1lTVEVNX0lELCAmc2RldmlkKTsKKwlpZiAoc2RldmlkID09IDB4QTEzNCkKKwkJbmljLT50ODggPSB0cnVlOworCiAJLyogQ2hlY2sgaWYgdGhpcyBWRiBpcyBpbiBRUyBvbmx5IG1vZGUgKi8KIAlpZiAobmljLT5zcXNfbW9kZSkKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWN2Zl9xdWV1ZXMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pY3ZmX3F1ZXVlcy5jCmluZGV4IDBmZjhlNjAuLmE0ZmM1MDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pY3ZmX3F1ZXVlcy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pY3ZmX3F1ZXVlcy5jCkBAIC00NzksNiArNDc5LDE2IEBACiAJCQkJCSAgICAgIE5JQ19RU0VUX1JRX0dFTl9DRkcsIDAsIHJxX2NmZyk7CiB9CiAKK3N0YXRpYyB2b2lkIG5pY3ZmX3Jlc2V0X3Jjdl9xdWV1ZV9zdGF0cyhzdHJ1Y3QgbmljdmYgKm5pYykKK3sKKwl1bmlvbiBuaWNfbWJ4IG1ieCA9IHt9OworCisJLyogUmVzZXQgYWxsIFJYUSdzIHN0YXRzICovCisJbWJ4LnJlc2V0X3N0YXQubXNnID0gTklDX01CT1hfTVNHX1JFU0VUX1NUQVRfQ09VTlRFUjsKKwltYngucmVzZXRfc3RhdC5ycV9zdGF0X21hc2sgPSAweEZGRkY7CisJbmljdmZfc2VuZF9tc2dfdG9fcGYobmljLCAmbWJ4KTsKK30KKwogLyogQ29uZmlndXJlcyByZWNlaXZlIHF1ZXVlICovCiBzdGF0aWMgdm9pZCBuaWN2Zl9yY3ZfcXVldWVfY29uZmlnKHN0cnVjdCBuaWN2ZiAqbmljLCBzdHJ1Y3QgcXVldWVfc2V0ICpxcywKIAkJCQkgICBpbnQgcWlkeCwgYm9vbCBlbmFibGUpCkBAIC03NjIsMTAgKzc3MiwxMCBAQAogCW5pYy0+cXMgPSBxczsKIAogCS8qIFNldCBjb3VudCBvZiBlYWNoIHF1ZXVlICovCi0JcXMtPnJiZHJfY250ID0gUkJEUl9DTlQ7Ci0JcXMtPnJxX2NudCA9IFJDVl9RVUVVRV9DTlQ7Ci0JcXMtPnNxX2NudCA9IFNORF9RVUVVRV9DTlQ7Ci0JcXMtPmNxX2NudCA9IENNUF9RVUVVRV9DTlQ7CisJcXMtPnJiZHJfY250ID0gREVGQVVMVF9SQkRSX0NOVDsKKwlxcy0+cnFfY250ID0gbWluX3QodTgsIE1BWF9SQ1ZfUVVFVUVTX1BFUl9RUywgbnVtX29ubGluZV9jcHVzKCkpOworCXFzLT5zcV9jbnQgPSBtaW5fdCh1OCwgTUFYX1NORF9RVUVVRVNfUEVSX1FTLCBudW1fb25saW5lX2NwdXMoKSk7CisJcXMtPmNxX2NudCA9IG1heF90KHU4LCBxcy0+cnFfY250LCBxcy0+c3FfY250KTsKIAogCS8qIFNldCBxdWV1ZSBsZW5ndGhzICovCiAJcXMtPnJiZHJfbGVuID0gUkNWX0JVRl9DT1VOVDsKQEAgLTgxMiw2ICs4MjIsMTEgQEAKIAkJbmljdmZfZnJlZV9yZXNvdXJjZXMobmljKTsKIAl9CiAKKwkvKiBSZXNldCBSWFEncyBzdGF0cy4KKwkgKiBTUSdzIHN0YXRzIHdpbGwgZ2V0IHJlc2V0IGF1dG9tYXRpY2FsbHkgb25jZSBTUSBpcyByZXNldC4KKwkgKi8KKwluaWN2Zl9yZXNldF9yY3ZfcXVldWVfc3RhdHMobmljKTsKKwogCXJldHVybiAwOwogfQogCkBAIC05MzgsNiArOTUzLDggQEAKIAlyZXR1cm4gbnVtX2VkZXNjcyArIHNoLT5nc29fc2VnczsKIH0KIAorI2RlZmluZSBQT1NUX0NRRV9ERVNDX0NPVU5UIDIKKwogLyogR2V0IHRoZSBudW1iZXIgb2YgU1EgZGVzY3JpcHRvcnMgbmVlZGVkIHRvIHhtaXQgdGhpcyBza2IgKi8KIHN0YXRpYyBpbnQgbmljdmZfc3Ffc3ViZGVzY19yZXF1aXJlZChzdHJ1Y3QgbmljdmYgKm5pYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKQEAgLTk0OCw2ICs5NjUsMTAgQEAKIAkJcmV0dXJuIHN1YmRlc2NfY250OwogCX0KIAorCS8qIER1bW15IGRlc2NyaXB0b3JzIHRvIGdldCBUU08gcGt0IGNvbXBsZXRpb24gbm90aWZpY2F0aW9uICovCisJaWYgKG5pYy0+dDg4ICYmIG5pYy0+aHdfdHNvICYmIHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpCisJCXN1YmRlc2NfY250ICs9IFBPU1RfQ1FFX0RFU0NfQ09VTlQ7CisKIAlpZiAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncykKIAkJc3ViZGVzY19jbnQgKz0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKIApAQCAtOTY1LDE0ICs5ODYsMjEgQEAKIAlzdHJ1Y3Qgc3FfaGRyX3N1YmRlc2MgKmhkcjsKIAogCWhkciA9IChzdHJ1Y3Qgc3FfaGRyX3N1YmRlc2MgKilHRVRfU1FfREVTQyhzcSwgcWVudHJ5KTsKLQlzcS0+c2tidWZmW3FlbnRyeV0gPSAodTY0KXNrYjsKLQogCW1lbXNldChoZHIsIDAsIFNORF9RVUVVRV9ERVNDX1NJWkUpOwogCWhkci0+c3ViZGVzY190eXBlID0gU1FfREVTQ19UWVBFX0hFQURFUjsKLQkvKiBFbmFibGUgbm90aWZpY2F0aW9uIHZpYSBDUUUgYWZ0ZXIgcHJvY2Vzc2luZyBTUUUgKi8KLQloZHItPnBvc3RfY3FlID0gMTsKLQkvKiBObyBvZiBzdWJkZXNjcmlwdG9ycyBmb2xsb3dpbmcgdGhpcyAqLwotCWhkci0+c3ViZGVzY19jbnQgPSBzdWJkZXNjX2NudDsKKworCWlmIChuaWMtPnQ4OCAmJiBuaWMtPmh3X3RzbyAmJiBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKSB7CisJCS8qIHBvc3RfY3FlID0gMCwgdG8gYXZvaWQgSFcgcG9zdGluZyBhIENRRSBmb3IgZXZlcnkgVFNPCisJCSAqIHNlZ21lbnQgdHJhbnNtaXR0ZWQgb24gODh4eC4KKwkJICovCisJCWhkci0+c3ViZGVzY19jbnQgPSBzdWJkZXNjX2NudCAtIFBPU1RfQ1FFX0RFU0NfQ09VTlQ7CisJfSBlbHNlIHsKKwkJc3EtPnNrYnVmZltxZW50cnldID0gKHU2NClza2I7CisJCS8qIEVuYWJsZSBub3RpZmljYXRpb24gdmlhIENRRSBhZnRlciBwcm9jZXNzaW5nIFNRRSAqLworCQloZHItPnBvc3RfY3FlID0gMTsKKwkJLyogTm8gb2Ygc3ViZGVzY3JpcHRvcnMgZm9sbG93aW5nIHRoaXMgKi8KKwkJaGRyLT5zdWJkZXNjX2NudCA9IHN1YmRlc2NfY250OworCX0KIAloZHItPnRvdF9sZW4gPSBsZW47CiAKIAkvKiBPZmZsb2FkIGNoZWNrc3VtIGNhbGN1bGF0aW9uIHRvIEhXICovCkBAIC0xMDIzLDYgKzEwNTEsNTUgQEAKIAlnYXRoZXItPmFkZHIgPSBkYXRhOwogfQogCisvKiBBZGQgSERSICsgSU1NRURJQVRFIHN1YmRlc2NyaXB0b3JzIHJpZ2h0IGFmdGVyIGRlc2NyaXB0b3JzIG9mIGEgVFNPCisgKiBwYWNrZXQgc28gdGhhdCBhIENRRSBpcyBwb3N0ZWQgYXMgYSBub3RpZmF0aW9uIGZvciB0cmFuc21pc3Npb24gb2YKKyAqIFRTTyBwYWNrZXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBuaWN2Zl9zcV9hZGRfY3FlX3N1YmRlc2Moc3RydWN0IHNuZF9xdWV1ZSAqc3EsIGludCBxZW50cnksCisJCQkJCSAgICBpbnQgdHNvX3NxZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc3FfaW1tX3N1YmRlc2MgKmltbTsKKwlzdHJ1Y3Qgc3FfaGRyX3N1YmRlc2MgKmhkcjsKKworCXNxLT5za2J1ZmZbcWVudHJ5XSA9ICh1NjQpc2tiOworCisJaGRyID0gKHN0cnVjdCBzcV9oZHJfc3ViZGVzYyAqKUdFVF9TUV9ERVNDKHNxLCBxZW50cnkpOworCW1lbXNldChoZHIsIDAsIFNORF9RVUVVRV9ERVNDX1NJWkUpOworCWhkci0+c3ViZGVzY190eXBlID0gU1FfREVTQ19UWVBFX0hFQURFUjsKKwkvKiBFbmFibGUgbm90aWZpY2F0aW9uIHZpYSBDUUUgYWZ0ZXIgcHJvY2Vzc2luZyBTUUUgKi8KKwloZHItPnBvc3RfY3FlID0gMTsKKwkvKiBUaGVyZSBpcyBubyBwYWNrZXQgdG8gdHJhbnNtaXQgaGVyZSAqLworCWhkci0+ZG9udF9zZW5kID0gMTsKKwloZHItPnN1YmRlc2NfY250ID0gUE9TVF9DUUVfREVTQ19DT1VOVCAtIDE7CisJaGRyLT50b3RfbGVuID0gMTsKKwkvKiBBY3R1YWwgVFNPIGhlYWRlciBTUUUgaW5kZXgsIG5lZWRlZCBmb3IgY2xlYW51cCAqLworCWhkci0+cnN2ZDIgPSB0c29fc3FlOworCisJcWVudHJ5ID0gbmljdmZfZ2V0X254dF9zcWVudHJ5KHNxLCBxZW50cnkpOworCWltbSA9IChzdHJ1Y3Qgc3FfaW1tX3N1YmRlc2MgKilHRVRfU1FfREVTQyhzcSwgcWVudHJ5KTsKKwltZW1zZXQoaW1tLCAwLCBTTkRfUVVFVUVfREVTQ19TSVpFKTsKKwlpbW0tPnN1YmRlc2NfdHlwZSA9IFNRX0RFU0NfVFlQRV9JTU1FRElBVEU7CisJaW1tLT5sZW4gPSAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmljdmZfc3FfZG9vcmJlbGwoc3RydWN0IG5pY3ZmICpuaWMsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICBpbnQgc3FfbnVtLCBpbnQgZGVzY19jbnQpCit7CisJc3RydWN0IG5ldGRldl9xdWV1ZSAqdHhxOworCisJdHhxID0gbmV0ZGV2X2dldF90eF9xdWV1ZShuaWMtPnBuaWN2Zi0+bmV0ZGV2LAorCQkJCSAgc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYikpOworCisJbmV0ZGV2X3R4X3NlbnRfcXVldWUodHhxLCBza2ItPmxlbik7CisKKwkvKiBtYWtlIHN1cmUgYWxsIG1lbW9yeSBzdG9yZXMgYXJlIGRvbmUgYmVmb3JlIHJpbmdpbmcgZG9vcmJlbGwgKi8KKwlzbXBfd21iKCk7CisKKwkvKiBJbmZvcm0gSFcgdG8geG1pdCBhbGwgVFNPIHNlZ21lbnRzICovCisJbmljdmZfcXVldWVfcmVnX3dyaXRlKG5pYywgTklDX1FTRVRfU1FfMF83X0RPT1IsCisJCQkgICAgICBzcV9udW0sIGRlc2NfY250KTsKK30KKwogLyogU2VnbWVudCBhIFRTTyBwYWNrZXQgaW50byAnZ3NvX3NpemUnIHNlZ21lbnRzIGFuZCBhcHBlbmQKICAqIHRoZW0gdG8gU1EgZm9yIHRyYW5zZmVyCiAgKi8KQEAgLTEwODIsMTIgKzExNTksOCBAQAogCS8qIFNhdmUgU0tCIGluIHRoZSBsYXN0IHNlZ21lbnQgZm9yIGZyZWVpbmcgKi8KIAlzcS0+c2tidWZmW2hkcl9xZW50cnldID0gKHU2NClza2I7CiAKLQkvKiBtYWtlIHN1cmUgYWxsIG1lbW9yeSBzdG9yZXMgYXJlIGRvbmUgYmVmb3JlIHJpbmdpbmcgZG9vcmJlbGwgKi8KLQlzbXBfd21iKCk7CisJbmljdmZfc3FfZG9vcmJlbGwobmljLCBza2IsIHNxX251bSwgZGVzY19jbnQpOwogCi0JLyogSW5mb3JtIEhXIHRvIHhtaXQgYWxsIFRTTyBzZWdtZW50cyAqLwotCW5pY3ZmX3F1ZXVlX3JlZ193cml0ZShuaWMsIE5JQ19RU0VUX1NRXzBfN19ET09SLAotCQkJICAgICAgc3FfbnVtLCBkZXNjX2NudCk7CiAJbmljLT5kcnZfc3RhdHMudHhfdHNvKys7CiAJcmV0dXJuIDE7CiB9CkBAIC0xMDk2LDcgKzExNjksNyBAQAogaW50IG5pY3ZmX3NxX2FwcGVuZF9za2Ioc3RydWN0IG5pY3ZmICpuaWMsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaW50IGksIHNpemU7Ci0JaW50IHN1YmRlc2NfY250OworCWludCBzdWJkZXNjX2NudCwgdHNvX3NxZSA9IDA7CiAJaW50IHNxX251bSwgcWVudHJ5OwogCXN0cnVjdCBxdWV1ZV9zZXQgKnFzOwogCXN0cnVjdCBzbmRfcXVldWUgKnNxOwpAQCAtMTEzMSw2ICsxMjA0LDcgQEAKIAkvKiBBZGQgU1EgaGVhZGVyIHN1YmRlc2MgKi8KIAluaWN2Zl9zcV9hZGRfaGRyX3N1YmRlc2MobmljLCBzcSwgcWVudHJ5LCBzdWJkZXNjX2NudCAtIDEsCiAJCQkJIHNrYiwgc2tiLT5sZW4pOworCXRzb19zcWUgPSBxZW50cnk7CiAKIAkvKiBBZGQgU1EgZ2F0aGVyIHN1YmRlc2NzICovCiAJcWVudHJ5ID0gbmljdmZfZ2V0X254dF9zcWVudHJ5KHNxLCBxZW50cnkpOwpAQCAtMTE1NCwxMiArMTIyOCwxMyBAQAogCX0KIAogZG9vcmJlbGw6Ci0JLyogbWFrZSBzdXJlIGFsbCBtZW1vcnkgc3RvcmVzIGFyZSBkb25lIGJlZm9yZSByaW5naW5nIGRvb3JiZWxsICovCi0Jc21wX3dtYigpOworCWlmIChuaWMtPnQ4OCAmJiBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKSB7CisJCXFlbnRyeSA9IG5pY3ZmX2dldF9ueHRfc3FlbnRyeShzcSwgcWVudHJ5KTsKKwkJbmljdmZfc3FfYWRkX2NxZV9zdWJkZXNjKHNxLCBxZW50cnksIHRzb19zcWUsIHNrYik7CisJfQogCi0JLyogSW5mb3JtIEhXIHRvIHhtaXQgbmV3IHBhY2tldCAqLwotCW5pY3ZmX3F1ZXVlX3JlZ193cml0ZShuaWMsIE5JQ19RU0VUX1NRXzBfN19ET09SLAotCQkJICAgICAgc3FfbnVtLCBzdWJkZXNjX2NudCk7CisJbmljdmZfc3FfZG9vcmJlbGwobmljLCBza2IsIHNxX251bSwgc3ViZGVzY19jbnQpOworCiAJcmV0dXJuIDE7CiAKIGFwcGVuZF9mYWlsOgpAQCAtMTE4NCwxMyArMTI1OSwyMyBAQAogCWludCBmcmFnOwogCWludCBwYXlsb2FkX2xlbiA9IDA7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYl9mcmFnID0gTlVMTDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcHJldl9mcmFnID0gTlVMTDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgb2Zmc2V0OwogCXUxNiAqcmJfbGVucyA9IE5VTEw7CiAJdTY0ICpyYl9wdHJzID0gTlVMTDsKIAogCXJiX2xlbnMgPSAodm9pZCAqKWNxZV9yeCArICgzICogc2l6ZW9mKHU2NCkpOwotCXJiX3B0cnMgPSAodm9pZCAqKWNxZV9yeCArICg2ICogc2l6ZW9mKHU2NCkpOworCS8qIEV4Y2VwdCA4OHh4IHBhc3MxIG9uIGFsbCBvdGhlciBjaGlwcyBDUUVfUlgyX1MgaXMgYWRkZWQgdG8KKwkgKiBDUUVfUlggYXQgd29yZDYsIGhlbmNlIGJ1ZmZlciBwb2ludGVycyBtb3ZlIGJ5IHdvcmQKKwkgKgorCSAqIFVzZSBleGlzdGluZyAnaHdfdHNvJyBmbGFnIHdoaWNoIHdpbGwgYmUgc2V0IGZvciBhbGwgY2hpcHMKKwkgKiBleGNlcHQgODh4eCBwYXNzMSBpbnN0ZWFkIG9mIGEgYWRkaXRpb25hbCBjYWNoZSBsaW5lCisJICogYWNjZXNzIChvciBtaXNzKSBieSB1c2luZyBwY2kgZGV2J3MgcmV2aXNpb24uCisJICovCisJaWYgKCFuaWMtPmh3X3RzbykKKwkJcmJfcHRycyA9ICh2b2lkICopY3FlX3J4ICsgKDYgKiBzaXplb2YodTY0KSk7CisJZWxzZQorCQlyYl9wdHJzID0gKHZvaWQgKiljcWVfcnggKyAoNyAqIHNpemVvZih1NjQpKTsKIAogCW5ldGRldl9kYmcobmljLT5uZXRkZXYsICIlcyByYl9jbnQgJWQgcmIwX3B0ciAlbGx4IHJiMF9zeiAlZFxuIiwKIAkJICAgX19mdW5jX18sIGNxZV9yeC0+cmJfY250LCBjcWVfcngtPnJiMF9wdHIsIGNxZV9yeC0+cmIwX3N6KTsKQEAgLTEyMDgsMjIgKzEyOTMsMTAgQEAKIAkJCXNrYl9wdXQoc2tiLCBwYXlsb2FkX2xlbik7CiAJCX0gZWxzZSB7CiAJCQkvKiBBZGQgZnJhZ21lbnRzICovCi0JCQlza2JfZnJhZyA9IG5pY3ZmX3JiX3B0cl90b19za2IobmljLCAqcmJfcHRycywKLQkJCQkJCSAgICAgICBwYXlsb2FkX2xlbik7Ci0JCQlpZiAoIXNrYl9mcmFnKSB7Ci0JCQkJZGV2X2tmcmVlX3NrYihza2IpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCi0JCQlpZiAoIXNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0KQotCQkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0ID0gc2tiX2ZyYWc7Ci0JCQllbHNlCi0JCQkJcHJldl9mcmFnLT5uZXh0ID0gc2tiX2ZyYWc7Ci0KLQkJCXByZXZfZnJhZyA9IHNrYl9mcmFnOwotCQkJc2tiLT5sZW4gKz0gcGF5bG9hZF9sZW47Ci0JCQlza2ItPmRhdGFfbGVuICs9IHBheWxvYWRfbGVuOwotCQkJc2tiX2ZyYWctPmxlbiA9IHBheWxvYWRfbGVuOworCQkJcGFnZSA9IHZpcnRfdG9fcGFnZShwaHlzX3RvX3ZpcnQoKnJiX3B0cnMpKTsKKwkJCW9mZnNldCA9IHBoeXNfdG9fdmlydCgqcmJfcHRycykgLSBwYWdlX2FkZHJlc3MocGFnZSk7CisJCQlza2JfYWRkX3J4X2ZyYWcoc2tiLCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzLCBwYWdlLAorCQkJCQlvZmZzZXQsIHBheWxvYWRfbGVuLCBSQ1ZfRlJBR19MRU4pOwogCQl9CiAJCS8qIE5leHQgYnVmZmVyIHBvaW50ZXIgKi8KIAkJcmJfcHRycysrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljdmZfcXVldWVzLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWN2Zl9xdWV1ZXMuaAppbmRleCA2NjczZTExLi44NjlmMzM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWN2Zl9xdWV1ZXMuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWN2Zl9xdWV1ZXMuaApAQCAtNTcsMTAgKzU3LDcgQEAKICNkZWZpbmUgQ01QX1FVRVVFX1NJWkU2CQk2VUxMIC8qIDY0SyBlbnRyaWVzICovCiAKIC8qIERlZmF1bHQgcXVldWUgY291bnQgcGVyIFFTLCBpdHMgbGVuZ3RocyBhbmQgdGhyZXNob2xkIHZhbHVlcyAqLwotI2RlZmluZSBSQkRSX0NOVAkJMQotI2RlZmluZSBSQ1ZfUVVFVUVfQ05UCQk4Ci0jZGVmaW5lIFNORF9RVUVVRV9DTlQJCTgKLSNkZWZpbmUgQ01QX1FVRVVFX0NOVAkJOCAvKiBNYXggb2YgUkNWIGFuZCBTTkQgcWNvdW50ICovCisjZGVmaW5lIERFRkFVTFRfUkJEUl9DTlQJMQogCiAjZGVmaW5lIFNORF9RU0laRQkJU05EX1FVRVVFX1NJWkUyCiAjZGVmaW5lIFNORF9RVUVVRV9MRU4JCSgxVUxMIDw8IChTTkRfUVNJWkUgKyAxMCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci90aHVuZGVyX2JneC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvdGh1bmRlcl9iZ3guYwppbmRleCA2M2EzOWFjLi44YmJhZWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci90aHVuZGVyX2JneC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL3RodW5kZXJfYmd4LmMKQEAgLTI4LDYgKzI4LDkgQEAKIAlzdHJ1Y3QgYmd4CQkqYmd4OwogCWludAkJCWRtYWM7CiAJdTgJCQltYWNbRVRIX0FMRU5dOworCXU4ICAgICAgICAgICAgICAgICAgICAgIGxtYWNfdHlwZTsKKwl1OCAgICAgICAgICAgICAgICAgICAgICBsYW5lX3RvX3NkczsKKwlib29sICAgICAgICAgICAgICAgICAgICB1c2VfdHJhaW5pbmc7CiAJYm9vbAkJCWxpbmtfdXA7CiAJaW50CQkJbG1hY2lkOyAvKiBJRCB3aXRoaW4gQkdYICovCiAJaW50CQkJbG1hY2lkX2JkOyAvKiBJRCBvbiBib2FyZCAqLwpAQCAtNDMsMTQgKzQ2LDEzIEBACiAKIHN0cnVjdCBiZ3ggewogCXU4CQkJYmd4X2lkOwotCXU4CQkJcWxtX21vZGU7CiAJc3RydWN0CWxtYWMJCWxtYWNbTUFYX0xNQUNfUEVSX0JHWF07CiAJaW50CQkJbG1hY19jb3VudDsKLQlpbnQgICAgICAgICAgICAgICAgICAgICBsbWFjX3R5cGU7Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgbGFuZV90b19zZHM7Ci0JaW50CQkJdXNlX3RyYWluaW5nOworCXU4CQkJbWF4X2xtYWM7CiAJdm9pZCBfX2lvbWVtCQkqcmVnX2Jhc2U7CiAJc3RydWN0IHBjaV9kZXYJCSpwZGV2OworCWJvb2wgICAgICAgICAgICAgICAgICAgIGlzX2RsbTsKKwlib29sICAgICAgICAgICAgICAgICAgICBpc19yZ3g7CiB9OwogCiBzdGF0aWMgc3RydWN0IGJneCAqYmd4X3ZuaWNbTUFYX0JHWF9USFVOREVSXTsKQEAgLTYxLDYgKzYzLDcgQEAKIC8qIFN1cHBvcnRlZCBkZXZpY2VzICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgYmd4X2lkX3RhYmxlW10gPSB7CiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQ0FWSVVNLCBQQ0lfREVWSUNFX0lEX1RIVU5ERVJfQkdYKSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0NBVklVTSwgUENJX0RFVklDRV9JRF9USFVOREVSX1JHWCkgfSwKIAl7IDAsIH0gIC8qIGVuZCBvZiB0YWJsZSAqLwogfTsKIApAQCAtMTI0LDggKzEyNyw4IEBACiAJaW50IGk7CiAJdW5zaWduZWQgbWFwID0gMDsKIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfQkdYX1BFUl9DTjg4WFg7IGkrKykgewotCQlpZiAoYmd4X3ZuaWNbKG5vZGUgKiBNQVhfQkdYX1BFUl9DTjg4WFgpICsgaV0pCisJZm9yIChpID0gMDsgaSA8IE1BWF9CR1hfUEVSX05PREU7IGkrKykgeworCQlpZiAoYmd4X3ZuaWNbKG5vZGUgKiBNQVhfQkdYX1BFUl9OT0RFKSArIGldKQogCQkJbWFwIHw9ICgxIDw8IGkpOwogCX0KIApAQCAtMTM4LDcgKzE0MSw3IEBACiB7CiAJc3RydWN0IGJneCAqYmd4OwogCi0JYmd4ID0gYmd4X3ZuaWNbKG5vZGUgKiBNQVhfQkdYX1BFUl9DTjg4WFgpICsgYmd4X2lkeF07CisJYmd4ID0gYmd4X3ZuaWNbKG5vZGUgKiBNQVhfQkdYX1BFUl9OT0RFKSArIGJneF9pZHhdOwogCWlmIChiZ3gpCiAJCXJldHVybiBiZ3gtPmxtYWNfY291bnQ7CiAKQEAgLTE1Myw3ICsxNTYsNyBAQAogCXN0cnVjdCBiZ3ggKmJneDsKIAlzdHJ1Y3QgbG1hYyAqbG1hYzsKIAotCWJneCA9IGJneF92bmljWyhub2RlICogTUFYX0JHWF9QRVJfQ044OFhYKSArIGJneF9pZHhdOworCWJneCA9IGJneF92bmljWyhub2RlICogTUFYX0JHWF9QRVJfTk9ERSkgKyBiZ3hfaWR4XTsKIAlpZiAoIWJneCkKIAkJcmV0dXJuOwogCkBAIC0xNjYsNyArMTY5LDcgQEAKIAogY29uc3QgdTggKmJneF9nZXRfbG1hY19tYWMoaW50IG5vZGUsIGludCBiZ3hfaWR4LCBpbnQgbG1hY2lkKQogewotCXN0cnVjdCBiZ3ggKmJneCA9IGJneF92bmljWyhub2RlICogTUFYX0JHWF9QRVJfQ044OFhYKSArIGJneF9pZHhdOworCXN0cnVjdCBiZ3ggKmJneCA9IGJneF92bmljWyhub2RlICogTUFYX0JHWF9QRVJfTk9ERSkgKyBiZ3hfaWR4XTsKIAogCWlmIChiZ3gpCiAJCXJldHVybiBiZ3gtPmxtYWNbbG1hY2lkXS5tYWM7CkBAIC0xNzcsNyArMTgwLDcgQEAKIAogdm9pZCBiZ3hfc2V0X2xtYWNfbWFjKGludCBub2RlLCBpbnQgYmd4X2lkeCwgaW50IGxtYWNpZCwgY29uc3QgdTggKm1hYykKIHsKLQlzdHJ1Y3QgYmd4ICpiZ3ggPSBiZ3hfdm5pY1sobm9kZSAqIE1BWF9CR1hfUEVSX0NOODhYWCkgKyBiZ3hfaWR4XTsKKwlzdHJ1Y3QgYmd4ICpiZ3ggPSBiZ3hfdm5pY1sobm9kZSAqIE1BWF9CR1hfUEVSX05PREUpICsgYmd4X2lkeF07CiAKIAlpZiAoIWJneCkKIAkJcmV0dXJuOwpAQCAtMTg4LDExICsxOTEsMTMgQEAKIAogdm9pZCBiZ3hfbG1hY19yeF90eF9lbmFibGUoaW50IG5vZGUsIGludCBiZ3hfaWR4LCBpbnQgbG1hY2lkLCBib29sIGVuYWJsZSkKIHsKLQlzdHJ1Y3QgYmd4ICpiZ3ggPSBiZ3hfdm5pY1sobm9kZSAqIE1BWF9CR1hfUEVSX0NOODhYWCkgKyBiZ3hfaWR4XTsKKwlzdHJ1Y3QgYmd4ICpiZ3ggPSBiZ3hfdm5pY1sobm9kZSAqIE1BWF9CR1hfUEVSX05PREUpICsgYmd4X2lkeF07CisJc3RydWN0IGxtYWMgKmxtYWM7CiAJdTY0IGNmZzsKIAogCWlmICghYmd4KQogCQlyZXR1cm47CisJbG1hYyA9ICZiZ3gtPmxtYWNbbG1hY2lkXTsKIAogCWNmZyA9IGJneF9yZWdfcmVhZChiZ3gsIGxtYWNpZCwgQkdYX0NNUlhfQ0ZHKTsKIAlpZiAoZW5hYmxlKQpAQCAtMjAwLDYgKzIwNSw5IEBACiAJZWxzZQogCQljZmcgJj0gfihDTVJfUEtUX1JYX0VOIHwgQ01SX1BLVF9UWF9FTik7CiAJYmd4X3JlZ193cml0ZShiZ3gsIGxtYWNpZCwgQkdYX0NNUlhfQ0ZHLCBjZmcpOworCisJaWYgKGJneC0+aXNfcmd4KQorCQl4Y3Zfc2V0dXBfbGluayhlbmFibGUgPyBsbWFjLT5saW5rX3VwIDogMCwgbG1hYy0+bGFzdF9zcGVlZCk7CiB9CiBFWFBPUlRfU1lNQk9MKGJneF9sbWFjX3J4X3R4X2VuYWJsZSk7CiAKQEAgLTI2Niw5ICsyNzQsMTIgQEAKIAogCXBvcnRfY2ZnID0gYmd4X3JlZ19yZWFkKGJneCwgbG1hYy0+bG1hY2lkLCBCR1hfR01QX0dNSV9QUlRYX0NGRyk7CiAKLQkvKiByZW5hYmxlIGxtYWMgKi8KKwkvKiBSZS1lbmFibGUgbG1hYyAqLwogCWNtcl9jZmcgfD0gQ01SX0VOOwogCWJneF9yZWdfd3JpdGUoYmd4LCBsbWFjLT5sbWFjaWQsIEJHWF9DTVJYX0NGRywgY21yX2NmZyk7CisKKwlpZiAoYmd4LT5pc19yZ3ggJiYgKGNtcl9jZmcgJiAoQ01SX1BLVF9SWF9FTiB8IENNUl9QS1RfVFhfRU4pKSkKKwkJeGN2X3NldHVwX2xpbmsobG1hYy0+bGlua191cCwgbG1hYy0+bGFzdF9zcGVlZCk7CiB9CiAKIHN0YXRpYyB2b2lkIGJneF9sbWFjX2hhbmRsZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKQEAgLTMxNCw3ICszMjUsNyBAQAogewogCXN0cnVjdCBiZ3ggKmJneDsKIAotCWJneCA9IGJneF92bmljWyhub2RlICogTUFYX0JHWF9QRVJfQ044OFhYKSArIGJneF9pZHhdOworCWJneCA9IGJneF92bmljWyhub2RlICogTUFYX0JHWF9QRVJfTk9ERSkgKyBiZ3hfaWR4XTsKIAlpZiAoIWJneCkKIAkJcmV0dXJuIDA7CiAKQEAgLTMyOCw3ICszMzksNyBAQAogewogCXN0cnVjdCBiZ3ggKmJneDsKIAotCWJneCA9IGJneF92bmljWyhub2RlICogTUFYX0JHWF9QRVJfQ044OFhYKSArIGJneF9pZHhdOworCWJneCA9IGJneF92bmljWyhub2RlICogTUFYX0JHWF9QRVJfTk9ERSkgKyBiZ3hfaWR4XTsKIAlpZiAoIWJneCkKIAkJcmV0dXJuIDA7CiAKQEAgLTM1Niw3ICszNjcsNyBAQAogCXN0cnVjdCBsbWFjICpsbWFjOwogCXU2NCAgICBjZmc7CiAKLQliZ3ggPSBiZ3hfdm5pY1sobm9kZSAqIE1BWF9CR1hfUEVSX0NOODhYWCkgKyBiZ3hfaWR4XTsKKwliZ3ggPSBiZ3hfdm5pY1sobm9kZSAqIE1BWF9CR1hfUEVSX05PREUpICsgYmd4X2lkeF07CiAJaWYgKCFiZ3gpCiAJCXJldHVybjsKIApAQCAtMzc5LDggKzM5MCw5IEBACiB9CiBFWFBPUlRfU1lNQk9MKGJneF9sbWFjX2ludGVybmFsX2xvb3BiYWNrKTsKIAotc3RhdGljIGludCBiZ3hfbG1hY19zZ21paV9pbml0KHN0cnVjdCBiZ3ggKmJneCwgaW50IGxtYWNpZCkKK3N0YXRpYyBpbnQgYmd4X2xtYWNfc2dtaWlfaW5pdChzdHJ1Y3QgYmd4ICpiZ3gsIHN0cnVjdCBsbWFjICpsbWFjKQogeworCWludCBsbWFjaWQgPSBsbWFjLT5sbWFjaWQ7CiAJdTY0IGNmZzsKIAogCWJneF9yZWdfbW9kaWZ5KGJneCwgbG1hY2lkLCBCR1hfR01QX0dNSV9UWFhfVEhSRVNILCAweDMwKTsKQEAgLTQwOSwxOCArNDIxLDI5IEBACiAJY2ZnIHw9IChQQ1NfTVJYX0NUTF9SU1RfQU4gfCBQQ1NfTVJYX0NUTF9BTl9FTik7CiAJYmd4X3JlZ193cml0ZShiZ3gsIGxtYWNpZCwgQkdYX0dNUF9QQ1NfTVJYX0NUTCwgY2ZnKTsKIAotCWlmIChiZ3hfcG9sbF9yZWcoYmd4LCBsbWFjaWQsIEJHWF9HTVBfUENTX01SWF9TVEFUVVMsCi0JCQkgUENTX01SWF9TVEFUVVNfQU5fQ1BULCBmYWxzZSkpIHsKLQkJZGV2X2VycigmYmd4LT5wZGV2LT5kZXYsICJCR1ggQU5fQ1BUIG5vdCBjb21wbGV0ZWRcbiIpOwotCQlyZXR1cm4gLTE7CisJaWYgKGxtYWMtPmxtYWNfdHlwZSA9PSBCR1hfTU9ERV9RU0dNSUkpIHsKKwkJLyogRGlzYWJsZSBkaXNwYXJpdHkgY2hlY2sgZm9yIFFTR01JSSAqLworCQljZmcgPSBiZ3hfcmVnX3JlYWQoYmd4LCBsbWFjaWQsIEJHWF9HTVBfUENTX01JU0NYX0NUTCk7CisJCWNmZyAmPSB+UENTX01JU0NfQ1RMX0RJU1BfRU47CisJCWJneF9yZWdfd3JpdGUoYmd4LCBsbWFjaWQsIEJHWF9HTVBfUENTX01JU0NYX0NUTCwgY2ZnKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGxtYWMtPmxtYWNfdHlwZSA9PSBCR1hfTU9ERV9TR01JSSkgeworCQlpZiAoYmd4X3BvbGxfcmVnKGJneCwgbG1hY2lkLCBCR1hfR01QX1BDU19NUlhfU1RBVFVTLAorCQkJCSBQQ1NfTVJYX1NUQVRVU19BTl9DUFQsIGZhbHNlKSkgeworCQkJZGV2X2VycigmYmd4LT5wZGV2LT5kZXYsICJCR1ggQU5fQ1BUIG5vdCBjb21wbGV0ZWRcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYmd4X2xtYWNfeGF1aV9pbml0KHN0cnVjdCBiZ3ggKmJneCwgaW50IGxtYWNpZCwgaW50IGxtYWNfdHlwZSkKK3N0YXRpYyBpbnQgYmd4X2xtYWNfeGF1aV9pbml0KHN0cnVjdCBiZ3ggKmJneCwgc3RydWN0IGxtYWMgKmxtYWMpCiB7CiAJdTY0IGNmZzsKKwlpbnQgbG1hY2lkID0gbG1hYy0+bG1hY2lkOwogCiAJLyogUmVzZXQgU1BVICovCiAJYmd4X3JlZ19tb2RpZnkoYmd4LCBsbWFjaWQsIEJHWF9TUFVYX0NPTlRST0wxLCBTUFVfQ1RMX1JFU0VUKTsKQEAgLTQzNiwxMiArNDU5LDE0IEBACiAKIAliZ3hfcmVnX21vZGlmeShiZ3gsIGxtYWNpZCwgQkdYX1NQVVhfQ09OVFJPTDEsIFNQVV9DVExfTE9XX1BPV0VSKTsKIAkvKiBTZXQgaW50ZXJsZWF2ZWQgcnVubmluZyBkaXNwYXJpdHkgZm9yIFJYQVVJICovCi0JaWYgKGJneC0+bG1hY190eXBlICE9IEJHWF9NT0RFX1JYQVVJKQotCQliZ3hfcmVnX21vZGlmeShiZ3gsIGxtYWNpZCwKLQkJCSAgICAgICBCR1hfU1BVWF9NSVNDX0NPTlRST0wsIFNQVV9NSVNDX0NUTF9SWF9ESVMpOwotCWVsc2UKKwlpZiAobG1hYy0+bG1hY190eXBlID09IEJHWF9NT0RFX1JYQVVJKQogCQliZ3hfcmVnX21vZGlmeShiZ3gsIGxtYWNpZCwgQkdYX1NQVVhfTUlTQ19DT05UUk9MLAotCQkJICAgICAgIFNQVV9NSVNDX0NUTF9SWF9ESVMgfCBTUFVfTUlTQ19DVExfSU5UTFZfUkRJU1ApOworCQkJICAgICAgIFNQVV9NSVNDX0NUTF9JTlRMVl9SRElTUCk7CisKKwkvKiBDbGVhciByZWNlaXZlIHBhY2tldCBkaXNhYmxlICovCisJY2ZnID0gYmd4X3JlZ19yZWFkKGJneCwgbG1hY2lkLCBCR1hfU1BVWF9NSVNDX0NPTlRST0wpOworCWNmZyAmPSB+U1BVX01JU0NfQ1RMX1JYX0RJUzsKKwliZ3hfcmVnX3dyaXRlKGJneCwgbG1hY2lkLCBCR1hfU1BVWF9NSVNDX0NPTlRST0wsIGNmZyk7CiAKIAkvKiBjbGVhciBhbGwgaW50ZXJydXB0cyAqLwogCWNmZyA9IGJneF9yZWdfcmVhZChiZ3gsIGxtYWNpZCwgQkdYX1NNVVhfUlhfSU5UKTsKQEAgLTQ1MSw3ICs0NzYsNyBAQAogCWNmZyA9IGJneF9yZWdfcmVhZChiZ3gsIGxtYWNpZCwgQkdYX1NQVVhfSU5UKTsKIAliZ3hfcmVnX3dyaXRlKGJneCwgbG1hY2lkLCBCR1hfU1BVWF9JTlQsIGNmZyk7CiAKLQlpZiAoYmd4LT51c2VfdHJhaW5pbmcpIHsKKwlpZiAobG1hYy0+dXNlX3RyYWluaW5nKSB7CiAJCWJneF9yZWdfd3JpdGUoYmd4LCBsbWFjaWQsIEJHWF9TUFVYX0JSX1BNRF9MUF9DVVAsIDB4MDApOwogCQliZ3hfcmVnX3dyaXRlKGJneCwgbG1hY2lkLCBCR1hfU1BVWF9CUl9QTURfTERfQ1VQLCAweDAwKTsKIAkJYmd4X3JlZ193cml0ZShiZ3gsIGxtYWNpZCwgQkdYX1NQVVhfQlJfUE1EX0xEX1JFUCwgMHgwMCk7CkBAIC00NzQsOSArNDk5LDkgQEAKIAliZ3hfcmVnX3dyaXRlKGJneCwgbG1hY2lkLCBCR1hfU1BVWF9BTl9DT05UUk9MLCBjZmcpOwogCiAJY2ZnID0gYmd4X3JlZ19yZWFkKGJneCwgbG1hY2lkLCBCR1hfU1BVWF9BTl9BRFYpOwotCWlmIChiZ3gtPmxtYWNfdHlwZSA9PSBCR1hfTU9ERV8xMEdfS1IpCisJaWYgKGxtYWMtPmxtYWNfdHlwZSA9PSBCR1hfTU9ERV8xMEdfS1IpCiAJCWNmZyB8PSAoMSA8PCAyMyk7Ci0JZWxzZSBpZiAoYmd4LT5sbWFjX3R5cGUgPT0gQkdYX01PREVfNDBHX0tSKQorCWVsc2UgaWYgKGxtYWMtPmxtYWNfdHlwZSA9PSBCR1hfTU9ERV80MEdfS1IpCiAJCWNmZyB8PSAoMSA8PCAyNCk7CiAJZWxzZQogCQljZmcgJj0gfigoMSA8PCAyMykgfCAoMSA8PCAyNCkpOwpAQCAtNTExLDExICs1MzYsMTAgQEAKIHsKIAlzdHJ1Y3QgYmd4ICpiZ3ggPSBsbWFjLT5iZ3g7CiAJaW50IGxtYWNpZCA9IGxtYWMtPmxtYWNpZDsKLQlpbnQgbG1hY190eXBlID0gYmd4LT5sbWFjX3R5cGU7CisJaW50IGxtYWNfdHlwZSA9IGxtYWMtPmxtYWNfdHlwZTsKIAl1NjQgY2ZnOwogCi0JYmd4X3JlZ19tb2RpZnkoYmd4LCBsbWFjaWQsIEJHWF9TUFVYX01JU0NfQ09OVFJPTCwgU1BVX01JU0NfQ1RMX1JYX0RJUyk7Ci0JaWYgKGJneC0+dXNlX3RyYWluaW5nKSB7CisJaWYgKGxtYWMtPnVzZV90cmFpbmluZykgewogCQljZmcgPSBiZ3hfcmVnX3JlYWQoYmd4LCBsbWFjaWQsIEJHWF9TUFVYX0lOVCk7CiAJCWlmICghKGNmZyAmICgxdWxsIDw8IDEzKSkpIHsKIAkJCWNmZyA9ICgxdWxsIDw8IDEzKSB8ICgxdWxsIDw8IDE0KTsKQEAgLTU1Niw3ICs1ODAsNyBAQAogCQkJICAgICAgIEJHWF9TUFVYX1NUQVRVUzIsIFNQVV9TVEFUVVMyX1JDVkZMVCk7CiAJaWYgKGJneF9yZWdfcmVhZChiZ3gsIGxtYWNpZCwgQkdYX1NQVVhfU1RBVFVTMikgJiBTUFVfU1RBVFVTMl9SQ1ZGTFQpIHsKIAkJZGV2X2VycigmYmd4LT5wZGV2LT5kZXYsICJSZWNlaXZlIGZhdWx0LCByZXRyeSB0cmFpbmluZ1xuIik7Ci0JCWlmIChiZ3gtPnVzZV90cmFpbmluZykgeworCQlpZiAobG1hYy0+dXNlX3RyYWluaW5nKSB7CiAJCQljZmcgPSBiZ3hfcmVnX3JlYWQoYmd4LCBsbWFjaWQsIEJHWF9TUFVYX0lOVCk7CiAJCQlpZiAoIShjZmcgJiAoMXVsbCA8PCAxMykpKSB7CiAJCQkJY2ZnID0gKDF1bGwgPDwgMTMpIHwgKDF1bGwgPDwgMTQpOwpAQCAtNTg0LDExICs2MDgsNiBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JLyogQ2xlYXIgcmVjZWl2ZSBwYWNrZXQgZGlzYWJsZSAqLwotCWNmZyA9IGJneF9yZWdfcmVhZChiZ3gsIGxtYWNpZCwgQkdYX1NQVVhfTUlTQ19DT05UUk9MKTsKLQljZmcgJj0gflNQVV9NSVNDX0NUTF9SWF9ESVM7Ci0JYmd4X3JlZ193cml0ZShiZ3gsIGxtYWNpZCwgQkdYX1NQVVhfTUlTQ19DT05UUk9MLCBjZmcpOwotCiAJLyogQ2hlY2sgZm9yIE1BQyBSWCBmYXVsdHMgKi8KIAljZmcgPSBiZ3hfcmVnX3JlYWQoYmd4LCBsbWFjaWQsIEJHWF9TTVVYX1JYX0NUTCk7CiAJLyogMCAtIExpbmsgaXMgb2theSwgMSAtIExvY2FsIGZhdWx0LCAyIC0gUmVtb3RlIGZhdWx0ICovCkBAIC01OTksNyArNjE4LDcgQEAKIAkvKiBSeCBsb2NhbC9yZW1vdGUgZmF1bHQgc2Vlbi4KIAkgKiBEbyBsbWFjIHJlaW5pdCB0byBzZWUgaWYgY29uZGl0aW9uIHJlY292ZXJzCiAJICovCi0JYmd4X2xtYWNfeGF1aV9pbml0KGJneCwgbG1hY2lkLCBiZ3gtPmxtYWNfdHlwZSk7CisJYmd4X2xtYWNfeGF1aV9pbml0KGJneCwgbG1hYyk7CiAKIAlyZXR1cm4gLTE7CiB9CkBAIC02MjMsNyArNjQyLDcgQEAKIAlpZiAoKHNwdV9saW5rICYgU1BVX1NUQVRVUzFfUkNWX0xOSykgJiYKIAkgICAgIShzbXVfbGluayAmIFNNVV9SWF9DVExfU1RBVFVTKSkgewogCQlsbWFjLT5saW5rX3VwID0gMTsKLQkJaWYgKGxtYWMtPmJneC0+bG1hY190eXBlID09IEJHWF9NT0RFX1hMQVVJKQorCQlpZiAobG1hYy0+bG1hY190eXBlID09IEJHWF9NT0RFX1hMQVVJKQogCQkJbG1hYy0+bGFzdF9zcGVlZCA9IDQwMDAwOwogCQllbHNlCiAJCQlsbWFjLT5sYXN0X3NwZWVkID0gMTAwMDA7CkBAIC02NDksNiArNjY4LDE2IEBACiAJcXVldWVfZGVsYXllZF93b3JrKGxtYWMtPmNoZWNrX2xpbmssICZsbWFjLT5kd29yaywgSFogKiAyKTsKIH0KIAorc3RhdGljIGludCBwaHlfaW50ZXJmYWNlX21vZGUodTggbG1hY190eXBlKQoreworCWlmIChsbWFjX3R5cGUgPT0gQkdYX01PREVfUVNHTUlJKQorCQlyZXR1cm4gUEhZX0lOVEVSRkFDRV9NT0RFX1FTR01JSTsKKwlpZiAobG1hY190eXBlID09IEJHWF9NT0RFX1JHTUlJKQorCQlyZXR1cm4gUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJOworCisJcmV0dXJuIFBIWV9JTlRFUkZBQ0VfTU9ERV9TR01JSTsKK30KKwogc3RhdGljIGludCBiZ3hfbG1hY19lbmFibGUoc3RydWN0IGJneCAqYmd4LCB1OCBsbWFjaWQpCiB7CiAJc3RydWN0IGxtYWMgKmxtYWM7CkBAIC02NTcsMTMgKzY4NiwxNSBAQAogCWxtYWMgPSAmYmd4LT5sbWFjW2xtYWNpZF07CiAJbG1hYy0+Ymd4ID0gYmd4OwogCi0JaWYgKGJneC0+bG1hY190eXBlID09IEJHWF9NT0RFX1NHTUlJKSB7CisJaWYgKChsbWFjLT5sbWFjX3R5cGUgPT0gQkdYX01PREVfU0dNSUkpIHx8CisJICAgIChsbWFjLT5sbWFjX3R5cGUgPT0gQkdYX01PREVfUVNHTUlJKSB8fAorCSAgICAobG1hYy0+bG1hY190eXBlID09IEJHWF9NT0RFX1JHTUlJKSkgewogCQlsbWFjLT5pc19zZ21paSA9IDE7Ci0JCWlmIChiZ3hfbG1hY19zZ21paV9pbml0KGJneCwgbG1hY2lkKSkKKwkJaWYgKGJneF9sbWFjX3NnbWlpX2luaXQoYmd4LCBsbWFjKSkKIAkJCXJldHVybiAtMTsKIAl9IGVsc2UgewogCQlsbWFjLT5pc19zZ21paSA9IDA7Ci0JCWlmIChiZ3hfbG1hY194YXVpX2luaXQoYmd4LCBsbWFjaWQsIGJneC0+bG1hY190eXBlKSkKKwkJaWYgKGJneF9sbWFjX3hhdWlfaW5pdChiZ3gsIGxtYWMpKQogCQkJcmV0dXJuIC0xOwogCX0KIApAQCAtNjg1LDEwICs3MTYsMTAgQEAKIAkvKiBSZXN0b3JlIGRlZmF1bHQgY2ZnLCBpbmNhc2UgbG93IGxldmVsIGZpcm13YXJlIGNoYW5nZWQgaXQgKi8KIAliZ3hfcmVnX3dyaXRlKGJneCwgbG1hY2lkLCBCR1hfQ01SWF9SWF9ETUFDX0NUTCwgMHgwMyk7CiAKLQlpZiAoKGJneC0+bG1hY190eXBlICE9IEJHWF9NT0RFX1hGSSkgJiYKLQkgICAgKGJneC0+bG1hY190eXBlICE9IEJHWF9NT0RFX1hMQVVJKSAmJgotCSAgICAoYmd4LT5sbWFjX3R5cGUgIT0gQkdYX01PREVfNDBHX0tSKSAmJgotCSAgICAoYmd4LT5sbWFjX3R5cGUgIT0gQkdYX01PREVfMTBHX0tSKSkgeworCWlmICgobG1hYy0+bG1hY190eXBlICE9IEJHWF9NT0RFX1hGSSkgJiYKKwkgICAgKGxtYWMtPmxtYWNfdHlwZSAhPSBCR1hfTU9ERV9YTEFVSSkgJiYKKwkgICAgKGxtYWMtPmxtYWNfdHlwZSAhPSBCR1hfTU9ERV80MEdfS1IpICYmCisJICAgIChsbWFjLT5sbWFjX3R5cGUgIT0gQkdYX01PREVfMTBHX0tSKSkgewogCQlpZiAoIWxtYWMtPnBoeWRldikKIAkJCXJldHVybiAtRU5PREVWOwogCkBAIC02OTYsNyArNzI3LDcgQEAKIAogCQlpZiAocGh5X2Nvbm5lY3RfZGlyZWN0KCZsbWFjLT5uZXRkZXYsIGxtYWMtPnBoeWRldiwKIAkJCQkgICAgICAgYmd4X2xtYWNfaGFuZGxlciwKLQkJCQkgICAgICAgUEhZX0lOVEVSRkFDRV9NT0RFX1NHTUlJKSkKKwkJCQkgICAgICAgcGh5X2ludGVyZmFjZV9tb2RlKGxtYWMtPmxtYWNfdHlwZSkpKQogCQkJcmV0dXJuIC1FTk9ERVY7CiAKIAkJcGh5X3N0YXJ0X2FuZWcobG1hYy0+cGh5ZGV2KTsKQEAgLTc1Myw3NiArNzg0LDE5IEBACiAKIAliZ3hfZmx1c2hfZG1hY19hZGRycyhiZ3gsIGxtYWNpZCk7CiAKLQlpZiAoKGJneC0+bG1hY190eXBlICE9IEJHWF9NT0RFX1hGSSkgJiYKLQkgICAgKGJneC0+bG1hY190eXBlICE9IEJHWF9NT0RFX1hMQVVJKSAmJgotCSAgICAoYmd4LT5sbWFjX3R5cGUgIT0gQkdYX01PREVfNDBHX0tSKSAmJgotCSAgICAoYmd4LT5sbWFjX3R5cGUgIT0gQkdYX01PREVfMTBHX0tSKSAmJiBsbWFjLT5waHlkZXYpCisJaWYgKChsbWFjLT5sbWFjX3R5cGUgIT0gQkdYX01PREVfWEZJKSAmJgorCSAgICAobG1hYy0+bG1hY190eXBlICE9IEJHWF9NT0RFX1hMQVVJKSAmJgorCSAgICAobG1hYy0+bG1hY190eXBlICE9IEJHWF9NT0RFXzQwR19LUikgJiYKKwkgICAgKGxtYWMtPmxtYWNfdHlwZSAhPSBCR1hfTU9ERV8xMEdfS1IpICYmIGxtYWMtPnBoeWRldikKIAkJcGh5X2Rpc2Nvbm5lY3QobG1hYy0+cGh5ZGV2KTsKIAogCWxtYWMtPnBoeWRldiA9IE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIGJneF9zZXRfbnVtX3BvcnRzKHN0cnVjdCBiZ3ggKmJneCkKLXsKLQl1NjQgbG1hY19jb3VudDsKLQotCXN3aXRjaCAoYmd4LT5xbG1fbW9kZSkgewotCWNhc2UgUUxNX01PREVfU0dNSUk6Ci0JCWJneC0+bG1hY19jb3VudCA9IDQ7Ci0JCWJneC0+bG1hY190eXBlID0gQkdYX01PREVfU0dNSUk7Ci0JCWJneC0+bGFuZV90b19zZHMgPSAwOwotCQlicmVhazsKLQljYXNlIFFMTV9NT0RFX1hBVUlfMVg0OgotCQliZ3gtPmxtYWNfY291bnQgPSAxOwotCQliZ3gtPmxtYWNfdHlwZSA9IEJHWF9NT0RFX1hBVUk7Ci0JCWJneC0+bGFuZV90b19zZHMgPSAweEU0OwotCQkJYnJlYWs7Ci0JY2FzZSBRTE1fTU9ERV9SWEFVSV8yWDI6Ci0JCWJneC0+bG1hY19jb3VudCA9IDI7Ci0JCWJneC0+bG1hY190eXBlID0gQkdYX01PREVfUlhBVUk7Ci0JCWJneC0+bGFuZV90b19zZHMgPSAweEU0OwotCQkJYnJlYWs7Ci0JY2FzZSBRTE1fTU9ERV9YRklfNFgxOgotCQliZ3gtPmxtYWNfY291bnQgPSA0OwotCQliZ3gtPmxtYWNfdHlwZSA9IEJHWF9NT0RFX1hGSTsKLQkJYmd4LT5sYW5lX3RvX3NkcyA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgUUxNX01PREVfWExBVUlfMVg0OgotCQliZ3gtPmxtYWNfY291bnQgPSAxOwotCQliZ3gtPmxtYWNfdHlwZSA9IEJHWF9NT0RFX1hMQVVJOwotCQliZ3gtPmxhbmVfdG9fc2RzID0gMHhFNDsKLQkJYnJlYWs7Ci0JY2FzZSBRTE1fTU9ERV8xMEdfS1JfNFgxOgotCQliZ3gtPmxtYWNfY291bnQgPSA0OwotCQliZ3gtPmxtYWNfdHlwZSA9IEJHWF9NT0RFXzEwR19LUjsKLQkJYmd4LT5sYW5lX3RvX3NkcyA9IDA7Ci0JCWJneC0+dXNlX3RyYWluaW5nID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBRTE1fTU9ERV80MEdfS1I0XzFYNDoKLQkJYmd4LT5sbWFjX2NvdW50ID0gMTsKLQkJYmd4LT5sbWFjX3R5cGUgPSBCR1hfTU9ERV80MEdfS1I7Ci0JCWJneC0+bGFuZV90b19zZHMgPSAweEU0OwotCQliZ3gtPnVzZV90cmFpbmluZyA9IDE7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJneC0+bG1hY19jb3VudCA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCS8qIENoZWNrIGlmIGxvdyBsZXZlbCBmaXJtd2FyZSBoYXMgcHJvZ3JhbW1lZCBMTUFDIGNvdW50Ci0JICogYmFzZWQgb24gYm9hcmQgdHlwZSwgaWYgeWVzIGNvbnNpZGVyIHRoYXQgb3RoZXJ3aXNlCi0JICogdGhlIGRlZmF1bHQgc3RhdGljIHZhbHVlcwotCSAqLwotCWxtYWNfY291bnQgPSBiZ3hfcmVnX3JlYWQoYmd4LCAwLCBCR1hfQ01SX1JYX0xNQUNTKSAmIDB4NzsKLQlpZiAobG1hY19jb3VudCAhPSA0KQotCQliZ3gtPmxtYWNfY291bnQgPSBsbWFjX2NvdW50OwotfQotCiBzdGF0aWMgdm9pZCBiZ3hfaW5pdF9odyhzdHJ1Y3QgYmd4ICpiZ3gpCiB7CiAJaW50IGk7Ci0KLQliZ3hfc2V0X251bV9wb3J0cyhiZ3gpOworCXN0cnVjdCBsbWFjICpsbWFjOwogCiAJYmd4X3JlZ19tb2RpZnkoYmd4LCAwLCBCR1hfQ01SX0dMT0JBTF9DRkcsIENNUl9HTE9CQUxfQ0ZHX0ZDU19TVFJJUCk7CiAJaWYgKGJneF9yZWdfcmVhZChiZ3gsIDAsIEJHWF9DTVJfQklTVF9TVEFUVVMpKQpAQCAtODMwLDE3ICs4MDQsOSBAQAogCiAJLyogU2V0IGxtYWMgdHlwZSBhbmQgbGFuZTJzZXJkZXMgbWFwcGluZyAqLwogCWZvciAoaSA9IDA7IGkgPCBiZ3gtPmxtYWNfY291bnQ7IGkrKykgewotCQlpZiAoYmd4LT5sbWFjX3R5cGUgPT0gQkdYX01PREVfUlhBVUkpIHsKLQkJCWlmIChpKQotCQkJCWJneC0+bGFuZV90b19zZHMgPSAweDBlOwotCQkJZWxzZQotCQkJCWJneC0+bGFuZV90b19zZHMgPSAweDA0OwotCQkJYmd4X3JlZ193cml0ZShiZ3gsIGksIEJHWF9DTVJYX0NGRywKLQkJCQkgICAgICAoYmd4LT5sbWFjX3R5cGUgPDwgOCkgfCBiZ3gtPmxhbmVfdG9fc2RzKTsKLQkJCWNvbnRpbnVlOwotCQl9CisJCWxtYWMgPSAmYmd4LT5sbWFjW2ldOwogCQliZ3hfcmVnX3dyaXRlKGJneCwgaSwgQkdYX0NNUlhfQ0ZHLAotCQkJICAgICAgKGJneC0+bG1hY190eXBlIDw8IDgpIHwgKGJneC0+bGFuZV90b19zZHMgKyBpKSk7CisJCQkgICAgICAobG1hYy0+bG1hY190eXBlIDw8IDgpIHwgbG1hYy0+bGFuZV90b19zZHMpOwogCQliZ3gtPmxtYWNbaV0ubG1hY2lkX2JkID0gbG1hY19jb3VudDsKIAkJbG1hY19jb3VudCsrOwogCX0KQEAgLTg2Myw1NSArODI5LDIxMiBAQAogCQliZ3hfcmVnX3dyaXRlKGJneCwgMCwgQkdYX0NNUl9SWF9TVFJFRVJJTkcgKyAoaSAqIDgpLCAweDAwKTsKIH0KIAotc3RhdGljIHZvaWQgYmd4X2dldF9xbG1fbW9kZShzdHJ1Y3QgYmd4ICpiZ3gpCitzdGF0aWMgdTggYmd4X2dldF9sYW5lMnNkc19jZmcoc3RydWN0IGJneCAqYmd4LCBzdHJ1Y3QgbG1hYyAqbG1hYykKK3sKKwlyZXR1cm4gKHU4KShiZ3hfcmVnX3JlYWQoYmd4LCBsbWFjLT5sbWFjaWQsIEJHWF9DTVJYX0NGRykgJiAweEZGKTsKK30KKworc3RhdGljIHZvaWQgYmd4X3ByaW50X3FsbV9tb2RlKHN0cnVjdCBiZ3ggKmJneCwgdTggbG1hY2lkKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZiZ3gtPnBkZXYtPmRldjsKLQlpbnQgbG1hY190eXBlOwotCWludCB0cmFpbl9lbjsKKwlzdHJ1Y3QgbG1hYyAqbG1hYzsKKwljaGFyIHN0clsyMF07CisJdTggZGxtOwogCi0JLyogUmVhZCBMTUFDMCB0eXBlIHRvIGZpZ3VyZSBvdXQgUUxNIG1vZGUKLQkgKiBUaGlzIGlzIGNvbmZpZ3VyZWQgYnkgbG93IGxldmVsIGZpcm13YXJlCi0JICovCi0JbG1hY190eXBlID0gYmd4X3JlZ19yZWFkKGJneCwgMCwgQkdYX0NNUlhfQ0ZHKTsKLQlsbWFjX3R5cGUgPSAobG1hY190eXBlID4+IDgpICYgMHgwNzsKKwlpZiAobG1hY2lkID4gYmd4LT5tYXhfbG1hYykKKwkJcmV0dXJuOwogCi0JdHJhaW5fZW4gPSBiZ3hfcmVnX3JlYWQoYmd4LCAwLCBCR1hfU1BVWF9CUl9QTURfQ1JUTCkgJgotCQkJCVNQVV9QTURfQ1JUTF9UUkFJTl9FTjsKKwlsbWFjID0gJmJneC0+bG1hY1tsbWFjaWRdOworCWRsbSA9IChsbWFjaWQgLyAyKSArIChiZ3gtPmJneF9pZCAqIDIpOworCWlmICghYmd4LT5pc19kbG0pCisJCXNwcmludGYoc3RyLCAiQkdYJWQgUUxNIG1vZGUiLCBiZ3gtPmJneF9pZCk7CisJZWxzZQorCQlzcHJpbnRmKHN0ciwgIkJHWCVkIERMTSVkIG1vZGUiLCBiZ3gtPmJneF9pZCwgZGxtKTsKIAotCXN3aXRjaCAobG1hY190eXBlKSB7CisJc3dpdGNoIChsbWFjLT5sbWFjX3R5cGUpIHsKIAljYXNlIEJHWF9NT0RFX1NHTUlJOgotCQliZ3gtPnFsbV9tb2RlID0gUUxNX01PREVfU0dNSUk7Ci0JCWRldl9pbmZvKGRldiwgIkJHWCVkIFFMTSBtb2RlOiBTR01JSVxuIiwgYmd4LT5iZ3hfaWQpOworCQlkZXZfaW5mbyhkZXYsICIlczogU0dNSUlcbiIsIChjaGFyICopc3RyKTsKIAkJYnJlYWs7CiAJY2FzZSBCR1hfTU9ERV9YQVVJOgotCQliZ3gtPnFsbV9tb2RlID0gUUxNX01PREVfWEFVSV8xWDQ7Ci0JCWRldl9pbmZvKGRldiwgIkJHWCVkIFFMTSBtb2RlOiBYQVVJXG4iLCBiZ3gtPmJneF9pZCk7CisJCWRldl9pbmZvKGRldiwgIiVzOiBYQVVJXG4iLCAoY2hhciAqKXN0cik7CiAJCWJyZWFrOwogCWNhc2UgQkdYX01PREVfUlhBVUk6Ci0JCWJneC0+cWxtX21vZGUgPSBRTE1fTU9ERV9SWEFVSV8yWDI7Ci0JCWRldl9pbmZvKGRldiwgIkJHWCVkIFFMTSBtb2RlOiBSWEFVSVxuIiwgYmd4LT5iZ3hfaWQpOworCQlkZXZfaW5mbyhkZXYsICIlczogUlhBVUlcbiIsIChjaGFyICopc3RyKTsKIAkJYnJlYWs7CiAJY2FzZSBCR1hfTU9ERV9YRkk6Ci0JCWlmICghdHJhaW5fZW4pIHsKLQkJCWJneC0+cWxtX21vZGUgPSBRTE1fTU9ERV9YRklfNFgxOwotCQkJZGV2X2luZm8oZGV2LCAiQkdYJWQgUUxNIG1vZGU6IFhGSVxuIiwgYmd4LT5iZ3hfaWQpOwotCQl9IGVsc2UgewotCQkJYmd4LT5xbG1fbW9kZSA9IFFMTV9NT0RFXzEwR19LUl80WDE7Ci0JCQlkZXZfaW5mbyhkZXYsICJCR1glZCBRTE0gbW9kZTogMTBHX0tSXG4iLCBiZ3gtPmJneF9pZCk7Ci0JCX0KKwkJaWYgKCFsbWFjLT51c2VfdHJhaW5pbmcpCisJCQlkZXZfaW5mbyhkZXYsICIlczogWEZJXG4iLCAoY2hhciAqKXN0cik7CisJCWVsc2UKKwkJCWRldl9pbmZvKGRldiwgIiVzOiAxMEdfS1JcbiIsIChjaGFyICopc3RyKTsKIAkJYnJlYWs7CiAJY2FzZSBCR1hfTU9ERV9YTEFVSToKLQkJaWYgKCF0cmFpbl9lbikgewotCQkJYmd4LT5xbG1fbW9kZSA9IFFMTV9NT0RFX1hMQVVJXzFYNDsKLQkJCWRldl9pbmZvKGRldiwgIkJHWCVkIFFMTSBtb2RlOiBYTEFVSVxuIiwgYmd4LT5iZ3hfaWQpOwotCQl9IGVsc2UgewotCQkJYmd4LT5xbG1fbW9kZSA9IFFMTV9NT0RFXzQwR19LUjRfMVg0OwotCQkJZGV2X2luZm8oZGV2LCAiQkdYJWQgUUxNIG1vZGU6IDQwR19LUjRcbiIsIGJneC0+Ymd4X2lkKTsKLQkJfQorCQlpZiAoIWxtYWMtPnVzZV90cmFpbmluZykKKwkJCWRldl9pbmZvKGRldiwgIiVzOiBYTEFVSVxuIiwgKGNoYXIgKilzdHIpOworCQllbHNlCisJCQlkZXZfaW5mbyhkZXYsICIlczogNDBHX0tSNFxuIiwgKGNoYXIgKilzdHIpOworCQlicmVhazsKKwljYXNlIEJHWF9NT0RFX1FTR01JSToKKwkJaWYgKChsbWFjaWQgPT0gMCkgJiYKKwkJICAgIChiZ3hfZ2V0X2xhbmUyc2RzX2NmZyhiZ3gsIGxtYWMpICE9IGxtYWNpZCkpCisJCQlyZXR1cm47CisJCWlmICgobG1hY2lkID09IDIpICYmCisJCSAgICAoYmd4X2dldF9sYW5lMnNkc19jZmcoYmd4LCBsbWFjKSA9PSBsbWFjaWQpKQorCQkJcmV0dXJuOworCQlkZXZfaW5mbyhkZXYsICIlczogUVNHTUlJXG4iLCAoY2hhciAqKXN0cik7CisJCWJyZWFrOworCWNhc2UgQkdYX01PREVfUkdNSUk6CisJCWRldl9pbmZvKGRldiwgIiVzOiBSR01JSVxuIiwgKGNoYXIgKilzdHIpOworCQlicmVhazsKKwljYXNlIEJHWF9NT0RFX0lOVkFMSUQ6CisJCS8qIE5vdGhpbmcgdG8gZG8gKi8KKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBsbWFjX3NldF9sYW5lMnNkcyhzdHJ1Y3QgYmd4ICpiZ3gsIHN0cnVjdCBsbWFjICpsbWFjKQoreworCXN3aXRjaCAobG1hYy0+bG1hY190eXBlKSB7CisJY2FzZSBCR1hfTU9ERV9TR01JSToKKwljYXNlIEJHWF9NT0RFX1hGSToKKwkJbG1hYy0+bGFuZV90b19zZHMgPSBsbWFjLT5sbWFjaWQ7CisJCWJyZWFrOworCWNhc2UgQkdYX01PREVfWEFVSToKKwljYXNlIEJHWF9NT0RFX1hMQVVJOgorCWNhc2UgQkdYX01PREVfUkdNSUk6CisJCWxtYWMtPmxhbmVfdG9fc2RzID0gMHhFNDsKKwkJYnJlYWs7CisJY2FzZSBCR1hfTU9ERV9SWEFVSToKKwkJbG1hYy0+bGFuZV90b19zZHMgPSAobG1hYy0+bG1hY2lkKSA/IDB4RSA6IDB4NDsKKwkJYnJlYWs7CisJY2FzZSBCR1hfTU9ERV9RU0dNSUk6CisJCS8qIFRoZXJlIGlzIG5vIHdheSB0byBkZXRlcm1pbmUgaWYgRExNMC8yIGlzIFFTR01JSSBvcgorCQkgKiBETE0xLzMgaXMgY29uZmlndXJlZCB0byBRU0dNSUkgYXMgYm9vdGxvYWRlciB3aWxsCisJCSAqIGNvbmZpZ3VyZSBhbGwgTE1BQ3MsIHNvIHRha2Ugd2hhdGV2ZXIgaXMgY29uZmlndXJlZAorCQkgKiBieSBsb3cgbGV2ZWwgZmlybXdhcmUuCisJCSAqLworCQlsbWFjLT5sYW5lX3RvX3NkcyA9IGJneF9nZXRfbGFuZTJzZHNfY2ZnKGJneCwgbG1hYyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWJneC0+cWxtX21vZGUgPSBRTE1fTU9ERV9TR01JSTsKLQkJZGV2X2luZm8oZGV2LCAiQkdYJWQgUUxNIGRlZmF1bHQgbW9kZTogU0dNSUlcbiIsIGJneC0+Ymd4X2lkKTsKKwkJbG1hYy0+bGFuZV90b19zZHMgPSAwOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGxtYWNfc2V0X3RyYWluaW5nKHN0cnVjdCBiZ3ggKmJneCwgc3RydWN0IGxtYWMgKmxtYWMsIGludCBsbWFjaWQpCit7CisJaWYgKChsbWFjLT5sbWFjX3R5cGUgIT0gQkdYX01PREVfMTBHX0tSKSAmJgorCSAgICAobG1hYy0+bG1hY190eXBlICE9IEJHWF9NT0RFXzQwR19LUikpIHsKKwkJbG1hYy0+dXNlX3RyYWluaW5nID0gMDsKKwkJcmV0dXJuOworCX0KKworCWxtYWMtPnVzZV90cmFpbmluZyA9IGJneF9yZWdfcmVhZChiZ3gsIGxtYWNpZCwgQkdYX1NQVVhfQlJfUE1EX0NSVEwpICYKKwkJCQkJCQlTUFVfUE1EX0NSVExfVFJBSU5fRU47Cit9CisKK3N0YXRpYyB2b2lkIGJneF9zZXRfbG1hY19jb25maWcoc3RydWN0IGJneCAqYmd4LCB1OCBpZHgpCit7CisJc3RydWN0IGxtYWMgKmxtYWM7CisJc3RydWN0IGxtYWMgKm9sbWFjOworCXU2NCBjbXJfY2ZnOworCXU4IGxtYWNfdHlwZTsKKwl1OCBsYW5lX3RvX3NkczsKKworCWxtYWMgPSAmYmd4LT5sbWFjW2lkeF07CisKKwlpZiAoIWJneC0+aXNfZGxtIHx8IGJneC0+aXNfcmd4KSB7CisJCS8qIFJlYWQgTE1BQzAgdHlwZSB0byBmaWd1cmUgb3V0IFFMTSBtb2RlCisJCSAqIFRoaXMgaXMgY29uZmlndXJlZCBieSBsb3cgbGV2ZWwgZmlybXdhcmUKKwkJICovCisJCWNtcl9jZmcgPSBiZ3hfcmVnX3JlYWQoYmd4LCAwLCBCR1hfQ01SWF9DRkcpOworCQlsbWFjLT5sbWFjX3R5cGUgPSAoY21yX2NmZyA+PiA4KSAmIDB4MDc7CisJCWlmIChiZ3gtPmlzX3JneCkKKwkJCWxtYWMtPmxtYWNfdHlwZSA9IEJHWF9NT0RFX1JHTUlJOworCQlsbWFjX3NldF90cmFpbmluZyhiZ3gsIGxtYWMsIDApOworCQlsbWFjX3NldF9sYW5lMnNkcyhiZ3gsIGxtYWMpOworCQlyZXR1cm47CisJfQorCisJLyogT24gODF4eCBCR1ggY2FuIGJlIHNwbGl0IGFjcm9zcyAyIERMTXMKKwkgKiBmaXJtd2FyZSBwcm9ncmFtcyBsbWFjX3R5cGUgb2YgTE1BQzAgYW5kIExNQUMyCisJICovCisJaWYgKChpZHggPT0gMCkgfHwgKGlkeCA9PSAyKSkgeworCQljbXJfY2ZnID0gYmd4X3JlZ19yZWFkKGJneCwgaWR4LCBCR1hfQ01SWF9DRkcpOworCQlsbWFjX3R5cGUgPSAodTgpKChjbXJfY2ZnID4+IDgpICYgMHgwNyk7CisJCWxhbmVfdG9fc2RzID0gKHU4KShjbXJfY2ZnICYgMHhGRik7CisJCS8qIENoZWNrIGlmIGNvbmZpZyBpcyBub3QgcmVzZXQgdmFsdWUgKi8KKwkJaWYgKChsbWFjX3R5cGUgPT0gMCkgJiYgKGxhbmVfdG9fc2RzID09IDB4RTQpKQorCQkJbG1hYy0+bG1hY190eXBlID0gQkdYX01PREVfSU5WQUxJRDsKKwkJZWxzZQorCQkJbG1hYy0+bG1hY190eXBlID0gbG1hY190eXBlOworCQlsbWFjX3NldF90cmFpbmluZyhiZ3gsIGxtYWMsIGxtYWMtPmxtYWNpZCk7CisJCWxtYWNfc2V0X2xhbmUyc2RzKGJneCwgbG1hYyk7CisKKwkJLyogU2V0IExNQUMgdHlwZSBvZiBvdGhlciBsbWFjIG9uIHNhbWUgRExNIGkuZSBMTUFDIDEvMyAqLworCQlvbG1hYyA9ICZiZ3gtPmxtYWNbaWR4ICsgMV07CisJCW9sbWFjLT5sbWFjX3R5cGUgPSBsbWFjLT5sbWFjX3R5cGU7CisJCWxtYWNfc2V0X3RyYWluaW5nKGJneCwgb2xtYWMsIG9sbWFjLT5sbWFjaWQpOworCQlsbWFjX3NldF9sYW5lMnNkcyhiZ3gsIG9sbWFjKTsKKwl9Cit9CisKK3N0YXRpYyBib29sIGlzX2RsbTBfaW5fYmd4X21vZGUoc3RydWN0IGJneCAqYmd4KQoreworCXN0cnVjdCBsbWFjICpsbWFjOworCisJaWYgKCFiZ3gtPmlzX2RsbSkKKwkJcmV0dXJuIHRydWU7CisKKwlsbWFjID0gJmJneC0+bG1hY1swXTsKKwlpZiAobG1hYy0+bG1hY190eXBlID09IEJHWF9NT0RFX0lOVkFMSUQpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBiZ3hfZ2V0X3FsbV9tb2RlKHN0cnVjdCBiZ3ggKmJneCkKK3sKKwlzdHJ1Y3QgbG1hYyAqbG1hYzsKKwlzdHJ1Y3QgbG1hYyAqbG1hYzAxOworCXN0cnVjdCBsbWFjICpsbWFjMjM7CisJdTggIGlkeDsKKworCS8qIEluaXQgYWxsIExNQUMncyB0eXBlIHRvIGludmFsaWQgKi8KKwlmb3IgKGlkeCA9IDA7IGlkeCA8IGJneC0+bWF4X2xtYWM7IGlkeCsrKSB7CisJCWxtYWMgPSAmYmd4LT5sbWFjW2lkeF07CisJCWxtYWMtPmxtYWNpZCA9IGlkeDsKKwkJbG1hYy0+bG1hY190eXBlID0gQkdYX01PREVfSU5WQUxJRDsKKwkJbG1hYy0+dXNlX3RyYWluaW5nID0gZmFsc2U7CisJfQorCisJLyogSXQgaXMgYXNzdW1lZCB0aGF0IGxvdyBsZXZlbCBmaXJtd2FyZSBzZXRzIHRoaXMgdmFsdWUgKi8KKwliZ3gtPmxtYWNfY291bnQgPSBiZ3hfcmVnX3JlYWQoYmd4LCAwLCBCR1hfQ01SX1JYX0xNQUNTKSAmIDB4NzsKKwlpZiAoYmd4LT5sbWFjX2NvdW50ID4gYmd4LT5tYXhfbG1hYykKKwkJYmd4LT5sbWFjX2NvdW50ID0gYmd4LT5tYXhfbG1hYzsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgYmd4LT5tYXhfbG1hYzsgaWR4KyspCisJCWJneF9zZXRfbG1hY19jb25maWcoYmd4LCBpZHgpOworCisJaWYgKCFiZ3gtPmlzX2RsbSB8fCBiZ3gtPmlzX3JneCkgeworCQliZ3hfcHJpbnRfcWxtX21vZGUoYmd4LCAwKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChiZ3gtPmxtYWNfY291bnQpIHsKKwkJYmd4X3ByaW50X3FsbV9tb2RlKGJneCwgMCk7CisJCWJneF9wcmludF9xbG1fbW9kZShiZ3gsIDIpOworCX0KKworCS8qIElmIERMTTAgaXMgbm90IGluIEJHWCBtb2RlIHRoZW4gTE1BQzAvMSBoYXZlCisJICogdG8gYmUgY29uZmlndXJlZCB3aXRoIHNlcmRlcyBsYW5lcyBvZiBETE0xCisJICovCisJaWYgKGlzX2RsbTBfaW5fYmd4X21vZGUoYmd4KSB8fCAoYmd4LT5sbWFjX2NvdW50ID4gMikpCisJCXJldHVybjsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IGJneC0+bG1hY19jb3VudDsgaWR4KyspIHsKKwkJbG1hYzAxID0gJmJneC0+bG1hY1tpZHhdOworCQlsbWFjMjMgPSAmYmd4LT5sbWFjW2lkeCArIDJdOworCQlsbWFjMDEtPmxtYWNfdHlwZSA9IGxtYWMyMy0+bG1hY190eXBlOworCQlsbWFjMDEtPmxhbmVfdG9fc2RzID0gbG1hYzIzLT5sYW5lX3RvX3NkczsKIAl9CiB9CiAKQEAgLTEwNDIsNyArMTE2NSw3IEBACiAJCX0KIAogCQlsbWFjKys7Ci0JCWlmIChsbWFjID09IE1BWF9MTUFDX1BFUl9CR1gpIHsKKwkJaWYgKGxtYWMgPT0gYmd4LT5tYXhfbG1hYykgewogCQkJb2Zfbm9kZV9wdXQobm9kZSk7CiAJCQlicmVhazsKIAkJfQpAQCAtMTA4Nyw2ICsxMjEwLDcgQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwogCXN0cnVjdCBiZ3ggKmJneCA9IE5VTEw7CiAJdTggbG1hYzsKKwl1MTYgc2RldmlkOwogCiAJYmd4ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpiZ3gpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJneCkKQEAgLTExMTUsMTAgKzEyMzksMzAgQEAKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnJfcmVsZWFzZV9yZWdpb25zOwogCX0KLQliZ3gtPmJneF9pZCA9IChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgUENJX0NGR19SRUdfQkFSX05VTSkgPj4gMjQpICYgMTsKLQliZ3gtPmJneF9pZCArPSBuaWNfZ2V0X25vZGVfaWQocGRldikgKiBNQVhfQkdYX1BFUl9DTjg4WFg7CiAKLQliZ3hfdm5pY1tiZ3gtPmJneF9pZF0gPSBiZ3g7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0RFVklDRV9JRCwgJnNkZXZpZCk7CisJaWYgKHNkZXZpZCAhPSBQQ0lfREVWSUNFX0lEX1RIVU5ERVJfUkdYKSB7CisJCWJneC0+Ymd4X2lkID0KKwkJICAgIChwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgUENJX0NGR19SRUdfQkFSX05VTSkgPj4gMjQpICYgMTsKKwkJYmd4LT5iZ3hfaWQgKz0gbmljX2dldF9ub2RlX2lkKHBkZXYpICogTUFYX0JHWF9QRVJfTk9ERTsKKwkJYmd4LT5tYXhfbG1hYyA9IE1BWF9MTUFDX1BFUl9CR1g7CisJCWJneF92bmljW2JneC0+Ymd4X2lkXSA9IGJneDsKKwl9IGVsc2UgeworCQliZ3gtPmlzX3JneCA9IHRydWU7CisJCWJneC0+bWF4X2xtYWMgPSAxOworCQliZ3gtPmJneF9pZCA9IE1BWF9CR1hfUEVSX0NOODFYWCAtIDE7CisJCWJneF92bmljW2JneC0+Ymd4X2lkXSA9IGJneDsKKwkJeGN2X2luaXRfaHcoKTsKKwl9CisKKwkvKiBPbiA4MXh4IGFsbCBhcmUgRExNcyBhbmQgb24gODN4eCB0aGVyZSBhcmUgMyBCR1ggUUxNcyBhbmQgb25lCisJICogQkdYIGkuZSBCR1gyIGNhbiBiZSBzcGxpdCBhY3Jvc3MgMiBETE1zLgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9TVUJTWVNURU1fSUQsICZzZGV2aWQpOworCWlmICgoc2RldmlkID09IFBDSV9TVUJTWVNfREVWSURfODFYWF9CR1gpIHx8CisJICAgICgoc2RldmlkID09IFBDSV9TVUJTWVNfREVWSURfODNYWF9CR1gpICYmIChiZ3gtPmJneF9pZCA9PSAyKSkpCisJCWJneC0+aXNfZGxtID0gdHJ1ZTsKKwogCWJneF9nZXRfcWxtX21vZGUoYmd4KTsKIAogCWVyciA9IGJneF9pbml0X3BoeShiZ3gpOwpAQCAtMTEzMyw2ICsxMjc3LDggQEAKIAkJaWYgKGVycikgewogCQkJZGV2X2VycihkZXYsICJCR1glZCBmYWlsZWQgdG8gZW5hYmxlIGxtYWMlZFxuIiwKIAkJCQliZ3gtPmJneF9pZCwgbG1hYyk7CisJCQl3aGlsZSAobG1hYykKKwkJCQliZ3hfbG1hY19kaXNhYmxlKGJneCwgLS1sbWFjKTsKIAkJCWdvdG8gZXJyX2VuYWJsZTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL3RodW5kZXJfYmd4LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci90aHVuZGVyX2JneC5oCmluZGV4IDQyMDEwZDIuLmQ1OWM3MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL3RodW5kZXJfYmd4LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvdGh1bmRlcl9iZ3guaApAQCAtOSw4ICs5LDIwIEBACiAjaWZuZGVmIFRIVU5ERVJfQkdYX0gKICNkZWZpbmUgVEhVTkRFUl9CR1hfSAogCi0jZGVmaW5lICAgIE1BWF9CR1hfVEhVTkRFUgkJCTggLyogTWF4IDQgbm9kZXMsIDIgcGVyIG5vZGUgKi8KKy8qIFBDSSBkZXZpY2UgSUQgKi8KKyNkZWZpbmUJUENJX0RFVklDRV9JRF9USFVOREVSX0JHWAkJMHhBMDI2CisjZGVmaW5lCVBDSV9ERVZJQ0VfSURfVEhVTkRFUl9SR1gJCTB4QTA1NAorCisvKiBTdWJzeXN0ZW0gZGV2aWNlIElEcyAqLworI2RlZmluZSBQQ0lfU1VCU1lTX0RFVklEXzg4WFhfQkdYCQkweEExMjYKKyNkZWZpbmUgUENJX1NVQlNZU19ERVZJRF84MVhYX0JHWAkJMHhBMjI2CisjZGVmaW5lIFBDSV9TVUJTWVNfREVWSURfODNYWF9CR1gJCTB4QTMyNgorCisjZGVmaW5lICAgIE1BWF9CR1hfVEhVTkRFUgkJCTggLyogTWF4IDIgbm9kZXMsIDQgcGVyIG5vZGUgKi8KICNkZWZpbmUgICAgTUFYX0JHWF9QRVJfQ044OFhYCQkJMgorI2RlZmluZSAgICBNQVhfQkdYX1BFUl9DTjgxWFgJCQkzIC8qIDIgQkdYcyArIDEgUkdYICovCisjZGVmaW5lICAgIE1BWF9CR1hfUEVSX0NOODNYWAkJCTQKKyNkZWZpbmUgICAgTUFYX0JHWF9QRVJfTk9ERQkJCTQKICNkZWZpbmUgICAgTUFYX0xNQUNfUEVSX0JHWAkJCTQKICNkZWZpbmUgICAgTUFYX0JHWF9DSEFOU19QRVJfTE1BQwkJMTYKICNkZWZpbmUgICAgTUFYX0RNQUNfUEVSX0xNQUMJCQk4CkBAIC0xOCw4ICszMCw2IEBACiAKICNkZWZpbmUgICAgTUFYX0RNQUNfUEVSX0xNQUNfVE5TX0JZUEFTU19NT0RFCTIKIAotI2RlZmluZSAgICBNQVhfTE1BQwkoTUFYX0JHWF9QRVJfQ044OFhYICogTUFYX0xNQUNfUEVSX0JHWCkKLQogLyogUmVnaXN0ZXJzICovCiAjZGVmaW5lIEJHWF9DTVJYX0NGRwkJCTB4MDAKICNkZWZpbmUgIENNUl9QS1RfVFhfRU4JCQkJQklUX1VMTCgxMykKQEAgLTEzNiw2ICsxNDYsNyBAQAogI2RlZmluZSBCR1hfR01QX1BDU19BTlhfQU5fUkVTVUxUUwkweDMwMDIwCiAjZGVmaW5lIEJHWF9HTVBfUENTX1NHTV9BTl9BRFYJCTB4MzAwNjgKICNkZWZpbmUgQkdYX0dNUF9QQ1NfTUlTQ1hfQ1RMCQkweDMwMDc4CisjZGVmaW5lICBQQ1NfTUlTQ19DVExfRElTUF9FTgkJCUJJVF9VTEwoMTMpCiAjZGVmaW5lICBQQ1NfTUlTQ19DVExfR01YX0VOTwkJCUJJVF9VTEwoMTEpCiAjZGVmaW5lICBQQ1NfTUlTQ19DVExfU0FNUF9QVF9NQVNLCTB4N0Z1bGwKICNkZWZpbmUgQkdYX0dNUF9HTUlfUFJUWF9DRkcJCTB4MzgwMjAKQEAgLTE5NCw2ICsyMDUsOSBAQAogdm9pZCBiZ3hfZ2V0X2xtYWNfbGlua19zdGF0ZShpbnQgbm9kZSwgaW50IGJneF9pZHgsIGludCBsbWFjaWQsIHZvaWQgKnN0YXR1cyk7CiB2b2lkIGJneF9sbWFjX2ludGVybmFsX2xvb3BiYWNrKGludCBub2RlLCBpbnQgYmd4X2lkeCwKIAkJCQlpbnQgbG1hY19pZHgsIGJvb2wgZW5hYmxlKTsKK3ZvaWQgeGN2X2luaXRfaHcodm9pZCk7Cit2b2lkIHhjdl9zZXR1cF9saW5rKGJvb2wgbGlua191cCwgaW50IGxpbmtfc3BlZWQpOworCiB1NjQgYmd4X2dldF9yeF9zdGF0cyhpbnQgbm9kZSwgaW50IGJneF9pZHgsIGludCBsbWFjLCBpbnQgaWR4KTsKIHU2NCBiZ3hfZ2V0X3R4X3N0YXRzKGludCBub2RlLCBpbnQgYmd4X2lkeCwgaW50IGxtYWMsIGludCBpZHgpOwogI2RlZmluZSBCR1hfUlhfU1RBVFNfQ09VTlQgMTEKQEAgLTIxMywxNiArMjI3LDkgQEAKIAlCR1hfTU9ERV9YTEFVSSA9IDQsIC8qIDQgbGFuZXMsIDEwLjMxMjUgR2JhdWQgKi8KIAlCR1hfTU9ERV8xMEdfS1IgPSAzLC8qIDEgbGFuZSwgMTAuMzEyNSBHYmF1ZCAqLwogCUJHWF9NT0RFXzQwR19LUiA9IDQsLyogNCBsYW5lcywgMTAuMzEyNSBHYmF1ZCAqLwotfTsKLQotZW51bSBxbG1fbW9kZSB7Ci0JUUxNX01PREVfU0dNSUksICAgICAgICAgLyogU0dNSUksIGVhY2ggbGFuZSBpbmRlcGVuZGVudCAqLwotCVFMTV9NT0RFX1hBVUlfMVg0LCAgICAgIC8qIDEgWEFVSSBvciBEWEFVSSwgNCBsYW5lcyAqLwotCVFMTV9NT0RFX1JYQVVJXzJYMiwgICAgIC8qIDIgUlhBVUksIDIgbGFuZXMgZWFjaCAqLwotCVFMTV9NT0RFX1hGSV80WDEsICAgICAgIC8qIDQgWEZJLCAxIGxhbmUgZWFjaCAqLwotCVFMTV9NT0RFX1hMQVVJXzFYNCwgICAgIC8qIDEgWExBVUksIDQgbGFuZXMgZWFjaCAqLwotCVFMTV9NT0RFXzEwR19LUl80WDEsICAgIC8qIDQgMTBHQkFTRS1LUiwgMSBsYW5lIGVhY2ggKi8KLQlRTE1fTU9ERV80MEdfS1I0XzFYNCwgICAvKiAxIDQwR0JBU0UtS1I0LCA0IGxhbmVzIGVhY2ggKi8KKwlCR1hfTU9ERV9SR01JSSA9IDUsCisJQkdYX01PREVfUVNHTUlJID0gNiwKKwlCR1hfTU9ERV9JTlZBTElEID0gNywKIH07CiAKICNlbmRpZiAvKiBUSFVOREVSX0JHWF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci90aHVuZGVyX3hjdi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvdGh1bmRlcl94Y3YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2JlZmVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvdGh1bmRlcl94Y3YuYwpAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBDYXZpdW0sIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX21kaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9uZXQuaD4KKworI2luY2x1ZGUgIm5pYy5oIgorI2luY2x1ZGUgInRodW5kZXJfYmd4LmgiCisKKyNkZWZpbmUgRFJWX05BTUUJInRodW5kZXIteGN2IgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4wIgorCisvKiBSZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIFhDVl9SRVNFVAkJMHgwMAorI2RlZmluZSAgIFBPUlRfRU4JCUJJVF9VTEwoNjMpCisjZGVmaW5lICAgQ0xLX1JFU0VUCQlCSVRfVUxMKDE1KQorI2RlZmluZSAgIERMTF9SRVNFVAkJQklUX1VMTCgxMSkKKyNkZWZpbmUgICBDT01QX0VOCQlCSVRfVUxMKDcpCisjZGVmaW5lICAgVFhfUEtUX1JFU0VUCQlCSVRfVUxMKDMpCisjZGVmaW5lICAgVFhfREFUQV9SRVNFVAkJQklUX1VMTCgyKQorI2RlZmluZSAgIFJYX1BLVF9SRVNFVAkJQklUX1VMTCgxKQorI2RlZmluZSAgIFJYX0RBVEFfUkVTRVQJCUJJVF9VTEwoMCkKKyNkZWZpbmUgWENWX0RMTF9DVEwJCTB4MTAKKyNkZWZpbmUgICBDTEtSWF9CWVAJCUJJVF9VTEwoMjMpCisjZGVmaW5lICAgQ0xLVFhfQllQCQlCSVRfVUxMKDE1KQorI2RlZmluZSBYQ1ZfQ09NUF9DVEwJCTB4MjAKKyNkZWZpbmUgICBEUlZfQllQCQlCSVRfVUxMKDYzKQorI2RlZmluZSBYQ1ZfQ1RMCQkJMHgzMAorI2RlZmluZSBYQ1ZfSU5UCQkJMHg0MAorI2RlZmluZSBYQ1ZfSU5UX1cxUwkJMHg0OAorI2RlZmluZSBYQ1ZfSU5UX0VOQV9XMUMJCTB4NTAKKyNkZWZpbmUgWENWX0lOVF9FTkFfVzFTCQkweDU4CisjZGVmaW5lIFhDVl9JTkJORF9TVEFUVVMJMHg4MAorI2RlZmluZSBYQ1ZfQkFUQ0hfQ1JEX1JFVAkweDEwMAorCitzdHJ1Y3QgeGN2IHsKKwl2b2lkIF9faW9tZW0JCSpyZWdfYmFzZTsKKwlzdHJ1Y3QgcGNpX2RldgkJKnBkZXY7Cit9OworCitzdGF0aWMgc3RydWN0IHhjdiAqeGN2OworCisvKiBTdXBwb3J0ZWQgZGV2aWNlcyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHhjdl9pZF90YWJsZVtdID0geworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0NBVklVTSwgMHhBMDU2KSB9LAorCXsgMCwgfSAgLyogZW5kIG9mIHRhYmxlICovCit9OworCitNT0RVTEVfQVVUSE9SKCJDYXZpdW0gSW5jIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNhdml1bSBUaHVuZGVyIFJHWC9YQ1YgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgeGN2X2lkX3RhYmxlKTsKKwordm9pZCB4Y3ZfaW5pdF9odyh2b2lkKQoreworCXU2NCAgY2ZnOworCisJLyogVGFrZSBETEwgb3V0IG9mIHJlc2V0ICovCisJY2ZnID0gcmVhZHFfcmVsYXhlZCh4Y3YtPnJlZ19iYXNlICsgWENWX1JFU0VUKTsKKwljZmcgJj0gfkRMTF9SRVNFVDsKKwl3cml0ZXFfcmVsYXhlZChjZmcsIHhjdi0+cmVnX2Jhc2UgKyBYQ1ZfUkVTRVQpOworCisJLyogVGFrZSBjbG9jayB0cmVlIG91dCBvZiByZXNldCAqLworCWNmZyA9IHJlYWRxX3JlbGF4ZWQoeGN2LT5yZWdfYmFzZSArIFhDVl9SRVNFVCk7CisJY2ZnICY9IH5DTEtfUkVTRVQ7CisJd3JpdGVxX3JlbGF4ZWQoY2ZnLCB4Y3YtPnJlZ19iYXNlICsgWENWX1JFU0VUKTsKKwkvKiBXYWl0IGZvciBETEwgdG8gbG9jayAqLworCW1zbGVlcCgxKTsKKworCS8qIENvbmZpZ3VyZSBETEwgLSBlbmFibGUgb3IgYnlwYXNzCisJICogVFggbm8gYnlwYXNzLCBSWCBieXBhc3MKKwkgKi8KKwljZmcgPSByZWFkcV9yZWxheGVkKHhjdi0+cmVnX2Jhc2UgKyBYQ1ZfRExMX0NUTCk7CisJY2ZnICY9IH4weEZGMDM7CisJY2ZnIHw9IENMS1JYX0JZUDsKKwl3cml0ZXFfcmVsYXhlZChjZmcsIHhjdi0+cmVnX2Jhc2UgKyBYQ1ZfRExMX0NUTCk7CisKKwkvKiBFbmFibGUgY29tcGVuc2F0aW9uIGNvbnRyb2xsZXIgYW5kIGZvcmNlIHRoZQorCSAqIHdyaXRlIHRvIGJlIHZpc2libGUgdG8gSFcgYnkgcmVhZGlnIGJhY2suCisJICovCisJY2ZnID0gcmVhZHFfcmVsYXhlZCh4Y3YtPnJlZ19iYXNlICsgWENWX1JFU0VUKTsKKwljZmcgfD0gQ09NUF9FTjsKKwl3cml0ZXFfcmVsYXhlZChjZmcsIHhjdi0+cmVnX2Jhc2UgKyBYQ1ZfUkVTRVQpOworCXJlYWRxX3JlbGF4ZWQoeGN2LT5yZWdfYmFzZSArIFhDVl9SRVNFVCk7CisJLyogV2FpdCBmb3IgY29tcGVuc2F0aW9uIHN0YXRlIG1hY2hpbmUgdG8gbG9jayAqLworCW1zbGVlcCgxMCk7CisKKwkvKiBlbmFibGUgdGhlIFhDViBibG9jayAqLworCWNmZyA9IHJlYWRxX3JlbGF4ZWQoeGN2LT5yZWdfYmFzZSArIFhDVl9SRVNFVCk7CisJY2ZnIHw9IFBPUlRfRU47CisJd3JpdGVxX3JlbGF4ZWQoY2ZnLCB4Y3YtPnJlZ19iYXNlICsgWENWX1JFU0VUKTsKKworCWNmZyA9IHJlYWRxX3JlbGF4ZWQoeGN2LT5yZWdfYmFzZSArIFhDVl9SRVNFVCk7CisJY2ZnIHw9IENMS19SRVNFVDsKKwl3cml0ZXFfcmVsYXhlZChjZmcsIHhjdi0+cmVnX2Jhc2UgKyBYQ1ZfUkVTRVQpOworfQorRVhQT1JUX1NZTUJPTCh4Y3ZfaW5pdF9odyk7CisKK3ZvaWQgeGN2X3NldHVwX2xpbmsoYm9vbCBsaW5rX3VwLCBpbnQgbGlua19zcGVlZCkKK3sKKwl1NjQgIGNmZzsKKwlpbnQgc3BlZWQgPSAyOworCisJaWYgKCF4Y3YpIHsKKwkJZGV2X2VycigmeGN2LT5wZGV2LT5kZXYsCisJCQkiWENWIGluaXQgbm90IGRvbmUsIHByb2JlIG1heSBoYXZlIGZhaWxlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAobGlua19zcGVlZCA9PSAxMDApCisJCXNwZWVkID0gMTsKKwllbHNlIGlmIChsaW5rX3NwZWVkID09IDEwKQorCQlzcGVlZCA9IDA7CisKKwlpZiAobGlua191cCkgeworCQkvKiBzZXQgb3BlcmF0aW5nIHNwZWVkICovCisJCWNmZyA9IHJlYWRxX3JlbGF4ZWQoeGN2LT5yZWdfYmFzZSArIFhDVl9DVEwpOworCQljZmcgJj0gfjB4MDM7CisJCWNmZyB8PSBzcGVlZDsKKwkJd3JpdGVxX3JlbGF4ZWQoY2ZnLCB4Y3YtPnJlZ19iYXNlICsgWENWX0NUTCk7CisKKwkJLyogUmVzZXQgZGF0YXBhdGhzICovCisJCWNmZyA9IHJlYWRxX3JlbGF4ZWQoeGN2LT5yZWdfYmFzZSArIFhDVl9SRVNFVCk7CisJCWNmZyB8PSBUWF9EQVRBX1JFU0VUIHwgUlhfREFUQV9SRVNFVDsKKwkJd3JpdGVxX3JlbGF4ZWQoY2ZnLCB4Y3YtPnJlZ19iYXNlICsgWENWX1JFU0VUKTsKKworCQkvKiBFbmFibGUgdGhlIHBhY2tldCBmbG93ICovCisJCWNmZyA9IHJlYWRxX3JlbGF4ZWQoeGN2LT5yZWdfYmFzZSArIFhDVl9SRVNFVCk7CisJCWNmZyB8PSBUWF9QS1RfUkVTRVQgfCBSWF9QS1RfUkVTRVQ7CisJCXdyaXRlcV9yZWxheGVkKGNmZywgeGN2LT5yZWdfYmFzZSArIFhDVl9SRVNFVCk7CisKKwkJLyogUmV0dXJuIGNyZWRpdHMgdG8gUkdYICovCisJCXdyaXRlcV9yZWxheGVkKDB4MDEsIHhjdi0+cmVnX2Jhc2UgKyBYQ1ZfQkFUQ0hfQ1JEX1JFVCk7CisJfSBlbHNlIHsKKwkJLyogRGlzYWJsZSBwYWNrZXQgZmxvdyAqLworCQljZmcgPSByZWFkcV9yZWxheGVkKHhjdi0+cmVnX2Jhc2UgKyBYQ1ZfUkVTRVQpOworCQljZmcgJj0gfihUWF9QS1RfUkVTRVQgfCBSWF9QS1RfUkVTRVQpOworCQl3cml0ZXFfcmVsYXhlZChjZmcsIHhjdi0+cmVnX2Jhc2UgKyBYQ1ZfUkVTRVQpOworCQlyZWFkcV9yZWxheGVkKHhjdi0+cmVnX2Jhc2UgKyBYQ1ZfUkVTRVQpOworCX0KK30KK0VYUE9SVF9TWU1CT0woeGN2X3NldHVwX2xpbmspOworCitzdGF0aWMgaW50IHhjdl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisKKwl4Y3YgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IHhjdiksIEdGUF9LRVJORUwpOworCWlmICgheGN2KQorCQlyZXR1cm4gLUVOT01FTTsKKwl4Y3YtPnBkZXYgPSBwZGV2OworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIHhjdik7CisKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBQQ0kgZGV2aWNlXG4iKTsKKwkJZ290byBlcnJfa2ZyZWU7CisJfQorCisJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKGRldiwgIlBDSSByZXF1ZXN0IHJlZ2lvbnMgZmFpbGVkIDB4JXhcbiIsIGVycik7CisJCWdvdG8gZXJyX2Rpc2FibGVfZGV2aWNlOworCX0KKworCS8qIE1BUCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworCXhjdi0+cmVnX2Jhc2UgPSBwY2ltX2lvbWFwKHBkZXYsIFBDSV9DRkdfUkVHX0JBUl9OVU0sIDApOworCWlmICgheGN2LT5yZWdfYmFzZSkgeworCQlkZXZfZXJyKGRldiwgIlhDVjogQ2Fubm90IG1hcCBDU1IgbWVtb3J5IHNwYWNlLCBhYm9ydGluZ1xuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3JlbGVhc2VfcmVnaW9uczsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX3JlbGVhc2VfcmVnaW9uczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworZXJyX2Rpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK2Vycl9rZnJlZToKKwlkZXZtX2tmcmVlKGRldiwgeGN2KTsKKwl4Y3YgPSBOVUxMOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHhjdl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKworCWlmICh4Y3YpIHsKKwkJZGV2bV9rZnJlZShkZXYsIHhjdik7CisJCXhjdiA9IE5VTEw7CisJfQorCisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB4Y3ZfZHJpdmVyID0geworCS5uYW1lID0gRFJWX05BTUUsCisJLmlkX3RhYmxlID0geGN2X2lkX3RhYmxlLAorCS5wcm9iZSA9IHhjdl9wcm9iZSwKKwkucmVtb3ZlID0geGN2X3JlbW92ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHhjdl9pbml0X21vZHVsZSh2b2lkKQoreworCXByX2luZm8oIiVzLCB2ZXIgJXNcbiIsIERSVl9OQU1FLCBEUlZfVkVSU0lPTik7CisKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmeGN2X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB4Y3ZfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnhjdl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh4Y3ZfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoeGN2X2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L01ha2VmaWxlCmluZGV4IGFjZTBhYjkuLmM2YjcxZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9NYWtlZmlsZQpAQCAtNCw3ICs0LDcgQEAKIAogb2JqLSQoQ09ORklHX0NIRUxTSU9fVDQpICs9IGN4Z2I0Lm8KIAotY3hnYjQtb2JqcyA6PSBjeGdiNF9tYWluLm8gbDJ0Lm8gdDRfaHcubyBzZ2UubyBjbGlwX3RibC5vIGN4Z2I0X2V0aHRvb2wubworY3hnYjQtb2JqcyA6PSBjeGdiNF9tYWluLm8gbDJ0Lm8gdDRfaHcubyBzZ2UubyBjbGlwX3RibC5vIGN4Z2I0X2V0aHRvb2wubyBjeGdiNF91bGQubyBzY2hlZC5vIGN4Z2I0X2ZpbHRlci5vIGN4Z2I0X3RjX3UzMi5vCiBjeGdiNC0kKENPTkZJR19DSEVMU0lPX1Q0X0RDQikgKz0gIGN4Z2I0X2RjYi5vCiBjeGdiNC0kKENPTkZJR19DSEVMU0lPX1Q0X0ZDT0UpICs9ICBjeGdiNF9mY29lLm8KIGN4Z2I0LSQoQ09ORklHX0RFQlVHX0ZTKSArPSBjeGdiNF9kZWJ1Z2ZzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjQuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjQuaAppbmRleCAyZTJhYTlmLi4yOGU2NTNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNC5oCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDaGVsc2lvIFQ0IEV0aGVybmV0IGRyaXZlciBmb3IgTGludXguCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTQgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTYgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCkBAIC01Myw2ICs1Myw4IEBACiAjaW5jbHVkZSAiY3hnYjRfdWxkLmgiCiAKICNkZWZpbmUgQ0hfV0FSTihhZGFwLCBmbXQsIC4uLikgZGV2X3dhcm4oYWRhcC0+cGRldl9kZXYsIGZtdCwgIyMgX19WQV9BUkdTX18pCitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBhZGFwdGVyX2xpc3Q7CitleHRlcm4gc3RydWN0IG11dGV4IHVsZF9tdXRleDsKIAogZW51bSB7CiAJTUFYX05QT1JUUwk9IDQsICAgICAvKiBtYXggIyBvZiBwb3J0cyAqLwpAQCAtMzM4LDEyICszNDAsMTQgQEAKIAllbnVtIGNoaXBfdHlwZSBjaGlwOyAgICAgICAgICAgICAgIC8qIGNoaXAgY29kZSAqLwogCXN0cnVjdCBhcmNoX3NwZWNpZmljX3BhcmFtcyBhcmNoOyAgLyogY2hpcCBzcGVjaWZpYyBwYXJhbXMgKi8KIAl1bnNpZ25lZCBjaGFyIG9mZmxvYWQ7CisJdW5zaWduZWQgY2hhciBjcnlwdG87CQkvKiBIVyBjYXBhYmlsaXR5IGZvciBjcnlwdG8gKi8KIAogCXVuc2lnbmVkIGNoYXIgYnlwYXNzOwogCiAJdW5zaWduZWQgaW50IG9mbGRxX3dyX2NyZWQ7CiAJYm9vbCB1bHB0eF9tZW13cml0ZV9kc2dsOyAgICAgICAgICAvKiB1c2Ugb2YgVDUgRFNHTCBhbGxvd2VkICovCiAKKwl1bnNpZ25lZCBpbnQgbnNjaGVkX2NsczsgICAgICAgICAgLyogbnVtYmVyIG9mIHRyYWZmaWMgY2xhc3NlcyAqLwogCXVuc2lnbmVkIGludCBtYXhfb3JkaXJkX3FwOyAgICAgICAvKiBNYXggcmVhZCBkZXB0aCBwZXIgUkRNQSBRUCAqLwogCXVuc2lnbmVkIGludCBtYXhfaXJkX2FkYXB0ZXI7ICAgICAvKiBNYXggcmVhZCBkZXB0aCBwZXIgYWRhcHRlciAqLwogfTsKQEAgLTQwMyw3ICs0MDcsNiBAQAogCXN0cnVjdCBmd19oZHIgZndfaGRyOwogfTsKIAotCiBzdHJ1Y3QgdHJhY2VfcGFyYW1zIHsKIAl1MzIgZGF0YVtUUkFDRV9MRU4gLyA0XTsKIAl1MzIgbWFza1tUUkFDRV9MRU4gLyA0XTsKQEAgLTQxOSw4ICs0MjIsOCBAQAogCXVuc2lnbmVkIHNob3J0IHN1cHBvcnRlZDsgICAgICAgIC8qIGxpbmsgY2FwYWJpbGl0aWVzICovCiAJdW5zaWduZWQgc2hvcnQgYWR2ZXJ0aXNpbmc7ICAgICAgLyogYWR2ZXJ0aXNlZCBjYXBhYmlsaXRpZXMgKi8KIAl1bnNpZ25lZCBzaG9ydCBscF9hZHZlcnRpc2luZzsgICAvKiBwZWVyIGFkdmVydGlzZWQgY2FwYWJpbGl0aWVzICovCi0JdW5zaWduZWQgc2hvcnQgcmVxdWVzdGVkX3NwZWVkOyAgLyogc3BlZWQgdXNlciBoYXMgcmVxdWVzdGVkICovCi0JdW5zaWduZWQgc2hvcnQgc3BlZWQ7ICAgICAgICAgICAgLyogYWN0dWFsIGxpbmsgc3BlZWQgKi8KKwl1bnNpZ25lZCBpbnQgICByZXF1ZXN0ZWRfc3BlZWQ7ICAvKiBzcGVlZCB1c2VyIGhhcyByZXF1ZXN0ZWQgKi8KKwl1bnNpZ25lZCBpbnQgICBzcGVlZDsgICAgICAgICAgICAvKiBhY3R1YWwgbGluayBzcGVlZCAqLwogCXVuc2lnbmVkIGNoYXIgIHJlcXVlc3RlZF9mYzsgICAgIC8qIGZsb3cgY29udHJvbCB1c2VyIGhhcyByZXF1ZXN0ZWQgKi8KIAl1bnNpZ25lZCBjaGFyICBmYzsgICAgICAgICAgICAgICAvKiBhY3R1YWwgbGluayBmbG93IGNvbnRyb2wgKi8KIAl1bnNpZ25lZCBjaGFyICBhdXRvbmVnOyAgICAgICAgICAvKiBhdXRvbmVnb3RpYXRpbmc/ICovCkBAIC00MzQsMTEgKzQzNyw2IEBACiAJTUFYX0VUSF9RU0VUUyA9IDMyLCAgICAgICAgICAgLyogIyBvZiBFdGhlcm5ldCBUeC9SeCBxdWV1ZSBzZXRzICovCiAJTUFYX09GTERfUVNFVFMgPSAxNiwgICAgICAgICAgLyogIyBvZiBvZmZsb2FkIFR4LCBpc2NzaSBSeCBxdWV1ZSBzZXRzICovCiAJTUFYX0NUUkxfUVVFVUVTID0gTkNIQU4sICAgICAgLyogIyBvZiBjb250cm9sIFR4IHF1ZXVlcyAqLwotCU1BWF9SRE1BX1FVRVVFUyA9IE5DSEFOLCAgICAgIC8qICMgb2Ygc3RyZWFtaW5nIFJETUEgUnggcXVldWVzICovCi0JTUFYX1JETUFfQ0lRUyA9IDMyLCAgICAgICAgLyogIyBvZiAgUkRNQSBjb25jZW50cmF0b3IgSVFzICovCi0KLQkvKiAjIG9mIHN0cmVhbWluZyBpU0NTSVQgUnggcXVldWVzICovCi0JTUFYX0lTQ1NJVF9RVUVVRVMgPSBNQVhfT0ZMRF9RU0VUUywKIH07CiAKIGVudW0gewpAQCAtNDU1LDggKzQ1Myw3IEBACiBlbnVtIHsKIAlJTkdRX0VYVFJBUyA9IDIsICAgICAgICAvKiBmaXJtd2FyZSBldmVudCBxdWV1ZSBhbmQgKi8KIAkJCQkvKiAgIGZvcndhcmRlZCBpbnRlcnJ1cHRzICovCi0JTUFYX0lOR1EgPSBNQVhfRVRIX1FTRVRTICsgTUFYX09GTERfUVNFVFMgKyBNQVhfUkRNQV9RVUVVRVMgKwotCQkgICBNQVhfUkRNQV9DSVFTICsgTUFYX0lTQ1NJVF9RVUVVRVMgKyBJTkdRX0VYVFJBUywKKwlNQVhfSU5HUSA9IE1BWF9FVEhfUVNFVFMgKyBJTkdRX0VYVFJBUywKIH07CiAKIHN0cnVjdCBhZGFwdGVyOwpAQCAtNDkzLDYgKzQ5MCw3IEBACiAjZW5kaWYgLyogQ09ORklHX0NIRUxTSU9fVDRfRkNPRSAqLwogCWJvb2wgcnh0c3RhbXA7ICAvKiBFbmFibGUgVFMgKi8KIAlzdHJ1Y3QgaHd0c3RhbXBfY29uZmlnIHRzdGFtcF9jb25maWc7CisJc3RydWN0IHNjaGVkX3RhYmxlICpzY2hlZF90Ymw7CiB9OwogCiBzdHJ1Y3QgZGVudHJ5OwpAQCAtNTEwLDYgKzUwOCwxMCBAQAogCUZXX09GTERfQ09OTiAgICAgICA9ICgxIDw8IDkpLAogfTsKIAorZW51bSB7CisJVUxQX0NSWVBUT19MT09LQVNJREUgPSAxIDw8IDAsCit9OworCiBzdHJ1Y3Qgcnhfc3dfZGVzYzsKIAogc3RydWN0IHNnZV9mbCB7ICAgICAgICAgICAgICAgICAgICAgLyogU0dFIGZyZWUtYnVmZmVyIHF1ZXVlIHN0YXRlICovCkBAIC02ODAsMTcgKzY4MiwyNCBAQAogCXU4IGZ1bGw7ICAgICAgICAgICAgICAgICAgICAvKiB0aGUgVHggcmluZyBpcyBmdWxsICovCiB9IF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CiAKK3N0cnVjdCBzZ2VfdWxkX3J4cV9pbmZvIHsKKwljaGFyIG5hbWVbSUZOQU1TSVpdOwkvKiBuYW1lIG9mIFVMRCBkcml2ZXIgKi8KKwlzdHJ1Y3Qgc2dlX29mbGRfcnhxICp1bGRyeHE7IC8qIFJ4cSdzIGZvciBVTEQgKi8KKwl1MTYgKm1zaXhfdGJsOwkJLyogbXNpeF90YmwgZm9yIHVsZCAqLworCXUxNiAqcnNwcV9pZDsJCS8qIHJlc3BvbnNlIHF1ZXVlIGlkJ3Mgb2YgcnhxICovCisJdTE2IG5yeHE7CQkvKiAjIG9mIGluZ3Jlc3MgdWxkIHF1ZXVlcyAqLworCXUxNiBuY2lxOwkJLyogIyBvZiBjb21wbGV0aW9uIHF1ZXVlcyAqLworCXU4IHVsZDsJCQkvKiB1bGQgdHlwZSAqLworfTsKKwogc3RydWN0IHNnZSB7CiAJc3RydWN0IHNnZV9ldGhfdHhxIGV0aHR4cVtNQVhfRVRIX1FTRVRTXTsKIAlzdHJ1Y3Qgc2dlX29mbGRfdHhxIG9mbGR0eHFbTUFYX09GTERfUVNFVFNdOwogCXN0cnVjdCBzZ2VfY3RybF90eHEgY3RybHFbTUFYX0NUUkxfUVVFVUVTXTsKIAogCXN0cnVjdCBzZ2VfZXRoX3J4cSBldGhyeHFbTUFYX0VUSF9RU0VUU107Ci0Jc3RydWN0IHNnZV9vZmxkX3J4cSBpc2NzaXJ4cVtNQVhfT0ZMRF9RU0VUU107Ci0Jc3RydWN0IHNnZV9vZmxkX3J4cSBpc2NzaXRyeHFbTUFYX0lTQ1NJVF9RVUVVRVNdOwotCXN0cnVjdCBzZ2Vfb2ZsZF9yeHEgcmRtYXJ4cVtNQVhfUkRNQV9RVUVVRVNdOwotCXN0cnVjdCBzZ2Vfb2ZsZF9yeHEgcmRtYWNpcVtNQVhfUkRNQV9DSVFTXTsKIAlzdHJ1Y3Qgc2dlX3JzcHEgZndfZXZ0cSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOworCXN0cnVjdCBzZ2VfdWxkX3J4cV9pbmZvICoqdWxkX3J4cV9pbmZvOwogCiAJc3RydWN0IHNnZV9yc3BxIGludHJxIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CiAJc3BpbmxvY2tfdCBpbnRycV9sb2NrOwpAQCAtNjk4LDE0ICs3MDcsOCBAQAogCXUxNiBtYXhfZXRocXNldHM7ICAgICAgICAgICAvKiAjIG9mIGF2YWlsYWJsZSBFdGhlcm5ldCBxdWV1ZSBzZXRzICovCiAJdTE2IGV0aHFzZXRzOyAgICAgICAgICAgICAgIC8qICMgb2YgYWN0aXZlIEV0aGVybmV0IHF1ZXVlIHNldHMgKi8KIAl1MTYgZXRodHhxX3JvdmVyOyAgICAgICAgICAgLyogVHggcXVldWUgdG8gY2xlYW4gdXAgbmV4dCAqLwotCXUxNiBpc2NzaXFzZXRzOyAgICAgICAgICAgICAgLyogIyBvZiBhY3RpdmUgaVNDU0kgcXVldWUgc2V0cyAqLwotCXUxNiBuaXNjc2l0cTsgICAgICAgICAgICAgICAvKiAjIG9mIGF2YWlsYWJsZSBpU0NTVCBSeCBxdWV1ZXMgKi8KLQl1MTYgcmRtYXFzOyAgICAgICAgICAgICAgICAgLyogIyBvZiBhdmFpbGFibGUgUkRNQSBSeCBxdWV1ZXMgKi8KLQl1MTYgcmRtYWNpcXM7ICAgICAgICAgICAgICAgLyogIyBvZiBhdmFpbGFibGUgUkRNQSBjb25jZW50cmF0b3IgSVFzICovCi0JdTE2IGlzY3NpX3J4cVtNQVhfT0ZMRF9RU0VUU107Ci0JdTE2IGlzY3NpdF9yeHFbTUFYX0lTQ1NJVF9RVUVVRVNdOwotCXUxNiByZG1hX3J4cVtNQVhfUkRNQV9RVUVVRVNdOwotCXUxNiByZG1hX2NpcVtNQVhfUkRNQV9DSVFTXTsKKwl1MTYgb2ZsZHFzZXRzOyAgICAgICAgICAgICAgLyogIyBvZiBhY3RpdmUgb2ZsZCBxdWV1ZSBzZXRzICovCisJdTE2IG5xc19wZXJfdWxkOwkgICAgLyogIyBvZiBSeCBxdWV1ZXMgcGVyIFVMRCAqLwogCXUxNiB0aW1lcl92YWxbU0dFX05USU1FUlNdOwogCXU4IGNvdW50ZXJfdmFsW1NHRV9OQ09VTlRFUlNdOwogCXUzMiBmbF9wZ19vcmRlcjsgICAgICAgICAgICAvKiBsYXJnZSBwYWdlIGFsbG9jYXRpb24gc2l6ZSAqLwpAQCAtNzI5LDEwICs3MzIsNyBAQAogfTsKIAogI2RlZmluZSBmb3JfZWFjaF9ldGhyeHEoc2dlLCBpKSBmb3IgKGkgPSAwOyBpIDwgKHNnZSktPmV0aHFzZXRzOyBpKyspCi0jZGVmaW5lIGZvcl9lYWNoX2lzY3NpcnhxKHNnZSwgaSkgZm9yIChpID0gMDsgaSA8IChzZ2UpLT5pc2NzaXFzZXRzOyBpKyspCi0jZGVmaW5lIGZvcl9lYWNoX2lzY3NpdHJ4cShzZ2UsIGkpIGZvciAoaSA9IDA7IGkgPCAoc2dlKS0+bmlzY3NpdHE7IGkrKykKLSNkZWZpbmUgZm9yX2VhY2hfcmRtYXJ4cShzZ2UsIGkpIGZvciAoaSA9IDA7IGkgPCAoc2dlKS0+cmRtYXFzOyBpKyspCi0jZGVmaW5lIGZvcl9lYWNoX3JkbWFjaXEoc2dlLCBpKSBmb3IgKGkgPSAwOyBpIDwgKHNnZSktPnJkbWFjaXFzOyBpKyspCisjZGVmaW5lIGZvcl9lYWNoX29mbGR0eHEoc2dlLCBpKSBmb3IgKGkgPSAwOyBpIDwgKHNnZSktPm9mbGRxc2V0czsgaSsrKQogCiBzdHJ1Y3QgbDJ0X2RhdGE7CiAKQEAgLTc1Nyw2ICs3NTcsMjMgQEAKIAl1OCBhZGRyW0VUSF9BTEVOXTsKIH07CiAKK3N0cnVjdCB1bGRfbXNpeF9ibWFwIHsKKwl1bnNpZ25lZCBsb25nICptc2l4X2JtYXA7CisJdW5zaWduZWQgaW50IG1hcHNpemU7CisJc3BpbmxvY2tfdCBsb2NrOyAvKiBsb2NrIGZvciBhY3F1aXJpbmcgYml0bWFwICovCit9OworCitzdHJ1Y3QgdWxkX21zaXhfaW5mbyB7CisJdW5zaWduZWQgc2hvcnQgdmVjOworCWNoYXIgZGVzY1tJRk5BTVNJWiArIDEwXTsKKwl1bnNpZ25lZCBpbnQgaWR4OworfTsKKworc3RydWN0IHZmX2luZm8geworCXVuc2lnbmVkIGNoYXIgdmZfbWFjX2FkZHJbRVRIX0FMRU5dOworCWJvb2wgcGZfc2V0X21hYzsKK307CisKIHN0cnVjdCBhZGFwdGVyIHsKIAl2b2lkIF9faW9tZW0gKnJlZ3M7CiAJdm9pZCBfX2lvbWVtICpiYXIyOwpAQCAtNzY3LDYgKzc4NCw3IEBACiAJdW5zaWduZWQgaW50IG1ib3g7CiAJdW5zaWduZWQgaW50IHBmOwogCXVuc2lnbmVkIGludCBmbGFnczsKKwl1bnNpZ25lZCBpbnQgYWRhcF9pZHg7CiAJZW51bSBjaGlwX3R5cGUgY2hpcDsKIAogCWludCBtc2dfZW5hYmxlOwpAQCAtNzc5LDYgKzc5Nyw5IEBACiAJCXVuc2lnbmVkIHNob3J0IHZlYzsKIAkJY2hhciBkZXNjW0lGTkFNU0laICsgMTBdOwogCX0gbXNpeF9pbmZvW01BWF9JTkdRICsgMV07CisJc3RydWN0IHVsZF9tc2l4X2luZm8gKm1zaXhfaW5mb191bGRzOyAvKiBtc2l4IGluZm8gZm9yIHVsZCdzICovCisJc3RydWN0IHVsZF9tc2l4X2JtYXAgbXNpeF9ibWFwX3VsZHM7IC8qIG1zaXggYml0bWFwIGZvciBhbGwgdWxkICovCisJaW50IG1zaV9pZHg7CiAKIAlzdHJ1Y3QgZG9vcmJlbGxfc3RhdHMgZGJfc3RhdHM7CiAJc3RydWN0IHNnZSBzZ2U7CkBAIC03ODYsNiArODA3LDkgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcG9ydFtNQVhfTlBPUlRTXTsKIAl1OCBjaGFuX21hcFtOQ0hBTl07ICAgICAgICAgICAgICAgICAgIC8qIGNoYW5uZWwgLT4gcG9ydCBtYXAgKi8KIAorCXN0cnVjdCB2Zl9pbmZvICp2ZmluZm87CisJdTggbnVtX3ZmczsKKwogCXUzMiBmaWx0ZXJfbW9kZTsKIAl1bnNpZ25lZCBpbnQgbDJ0X3N0YXJ0OwogCXVuc2lnbmVkIGludCBsMnRfZW5kOwpAQCAtNzkzLDcgKzgxNywxMCBAQAogCXVuc2lnbmVkIGludCBjbGlwdF9zdGFydDsKIAl1bnNpZ25lZCBpbnQgY2xpcHRfZW5kOwogCXN0cnVjdCBjbGlwX3RibCAqY2xpcHQ7CisJc3RydWN0IGN4Z2I0X3VsZF9pbmZvICp1bGQ7CiAJdm9pZCAqdWxkX2hhbmRsZVtDWEdCNF9VTERfTUFYXTsKKwl1bnNpZ25lZCBpbnQgbnVtX3VsZDsKKwl1bnNpZ25lZCBpbnQgbnVtX29mbGRfdWxkOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdF9ub2RlOwogCXN0cnVjdCBsaXN0X2hlYWQgcmN1X25vZGU7CiAJc3RydWN0IGxpc3RfaGVhZCBtYWNfaGxpc3Q7IC8qIGxpc3Qgb2YgTUFDIGFkZHJlc3NlcyBpbiBNUFMgSGFzaCAqLwpAQCAtODEzLDYgKzg0MCw4IEBACiAjZGVmaW5lIFQ0X09TX0xPR19NQk9YX0NNRFMgMjU2CiAJc3RydWN0IG1ib3hfY21kX2xvZyAqbWJveF9sb2c7CiAKKwlzdHJ1Y3QgbXV0ZXggdWxkX211dGV4OworCiAJc3RydWN0IGRlbnRyeSAqZGVidWdmc19yb290OwogCWJvb2wgdXNlX2JkOyAgICAgLyogVXNlIFNHRSBCYWNrIERvb3IgaW50ZmMgZm9yIHJlYWRpbmcgU0dFIENvbnRleHRzICovCiAJYm9vbCB0cmFjZV9yc3M7CS8qIDEgaW1wbGllcyB0aGF0IGRpZmZlcmVudCBSU1MgZmxpdCBwZXIgZmlsdGVyIGlzCkBAIC04MjIsNiArODUxLDU4IEBACiAKIAlzcGlubG9ja190IHN0YXRzX2xvY2s7CiAJc3BpbmxvY2tfdCB3aW4wX2xvY2sgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKKworCS8qIFRDIHUzMiBvZmZsb2FkICovCisJc3RydWN0IGN4Z2I0X3RjX3UzMl90YWJsZSAqdGNfdTMyOworfTsKKworLyogU3VwcG9ydCBmb3IgInNjaGVkLWNsYXNzIiBjb21tYW5kIHRvIGFsbG93IGEgVFggU2NoZWR1bGluZyBDbGFzcyB0byBiZQorICogcHJvZ3JhbW1lZCB3aXRoIHZhcmlvdXMgcGFyYW1ldGVycy4KKyAqLworc3RydWN0IGNoX3NjaGVkX3BhcmFtcyB7CisJczggICB0eXBlOyAgICAgICAgICAgICAgICAgICAgIC8qIHBhY2tldCBvciBmbG93ICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJczggICBsZXZlbDsgICAgLyogc2NoZWR1bGVyIGhpZXJhcmNoeSBsZXZlbCAqLworCQkJczggICBtb2RlOyAgICAgLyogcGVyLWNsYXNzIG9yIHBlci1mbG93ICovCisJCQlzOCAgIHJhdGV1bml0OyAvKiBiaXQgb3IgcGFja2V0IHJhdGUgKi8KKwkJCXM4ICAgcmF0ZW1vZGU7IC8qICVwb3J0IHJlbGF0aXZlIG9yIGticHMgYWJzb2x1dGUgKi8KKwkJCXM4ICAgY2hhbm5lbDsgIC8qIHNjaGVkdWxlciBjaGFubmVsIFswLi5OXSAqLworCQkJczggICBjbGFzczsgICAgLyogc2NoZWR1bGVyIGNsYXNzIFswLi5OXSAqLworCQkJczMyICBtaW5yYXRlOyAgLyogbWluaW11bSByYXRlICovCisJCQlzMzIgIG1heHJhdGU7ICAvKiBtYXhpbXVtIHJhdGUgKi8KKwkJCXMxNiAgd2VpZ2h0OyAgIC8qIHBlcmNlbnQgd2VpZ2h0ICovCisJCQlzMTYgIHBrdHNpemU7ICAvKiBhdmVyYWdlIHBhY2tldCBzaXplICovCisJCX0gcGFyYW1zOworCX0gdTsKK307CisKK2VudW0geworCVNDSEVEX0NMQVNTX1RZUEVfUEFDS0VUID0gMCwgICAgLyogY2xhc3MgdHlwZSAqLworfTsKKworZW51bSB7CisJU0NIRURfQ0xBU1NfTEVWRUxfQ0xfUkwgPSAwLCAgICAvKiBjbGFzcyByYXRlIGxpbWl0ZXIgKi8KK307CisKK2VudW0geworCVNDSEVEX0NMQVNTX01PREVfQ0xBU1MgPSAwLCAgICAgLyogcGVyLWNsYXNzIHNjaGVkdWxpbmcgKi8KK307CisKK2VudW0geworCVNDSEVEX0NMQVNTX1JBVEVVTklUX0JJVFMgPSAwLCAgLyogYml0IHJhdGUgc2NoZWR1bGluZyAqLworfTsKKworZW51bSB7CisJU0NIRURfQ0xBU1NfUkFURU1PREVfQUJTID0gMSwgICAvKiBLYi9zICovCit9OworCisvKiBTdXBwb3J0IGZvciAic2NoZWRfcXVldWUiIGNvbW1hbmQgdG8gYWxsb3cgb25lIG9yIG1vcmUgTklDIFRYIFF1ZXVlcworICogdG8gYmUgYm91bmQgdG8gYSBUWCBTY2hlZHVsaW5nIENsYXNzLgorICovCitzdHJ1Y3QgY2hfc2NoZWRfcXVldWUgeworCXM4ICAgcXVldWU7ICAgIC8qIHF1ZXVlIGluZGV4ICovCisJczggICBjbGFzczsgICAgLyogY2xhc3MgaW5kZXggKi8KIH07CiAKIC8qIERlZmluZWQgYml0IHdpZHRoIG9mIHVzZXIgZGVmaW5hYmxlIGZpbHRlciB0dXBsZXMKQEAgLTk0NywxMSArMTAyOCw0NyBAQAogCVZMQU5fUkVXUklURQogfTsKIAorLyogSG9zdCBzaGFkb3cgY29weSBvZiBpbmdyZXNzIGZpbHRlciBlbnRyeS4gIFRoaXMgaXMgaW4gaG9zdCBuYXRpdmUgZm9ybWF0CisgKiBhbmQgZG9lc24ndCBtYXRjaCB0aGUgb3JkZXJpbmcgb3IgYml0IG9yZGVyLCBldGMuIG9mIHRoZSBoYXJkd2FyZSBvZiB0aGUKKyAqIGZpcm13YXJlIGNvbW1hbmQuICBUaGUgdXNlIG9mIGJpdC1maWVsZCBzdHJ1Y3R1cmUgZWxlbWVudHMgaXMgcHVyZWx5IHRvCisgKiByZW1pbmQgb3Vyc2VsdmVzIG9mIHRoZSBmaWVsZCBzaXplIGxpbWl0YXRpb25zIGFuZCBzYXZlIG1lbW9yeSBpbiB0aGUgY2FzZQorICogd2hlcmUgdGhlIGZpbHRlciB0YWJsZSBpcyBsYXJnZS4KKyAqLworc3RydWN0IGZpbHRlcl9lbnRyeSB7CisJLyogQWRtaW5pc3RyYXRpdmUgZmllbGRzIGZvciBmaWx0ZXIuICovCisJdTMyIHZhbGlkOjE7ICAgICAgICAgICAgLyogZmlsdGVyIGFsbG9jYXRlZCBhbmQgdmFsaWQgKi8KKwl1MzIgbG9ja2VkOjE7ICAgICAgICAgICAvKiBmaWx0ZXIgaXMgYWRtaW5pc3RyYXRpdmVseSBsb2NrZWQgKi8KKworCXUzMiBwZW5kaW5nOjE7ICAgICAgICAgIC8qIGZpbHRlciBhY3Rpb24gaXMgcGVuZGluZyBmaXJtd2FyZSByZXBseSAqLworCXUzMiBzbXRpZHg6ODsgICAgICAgICAgIC8qIFNvdXJjZSBNQUMgVGFibGUgaW5kZXggZm9yIHNtYWMgKi8KKwlzdHJ1Y3QgZmlsdGVyX2N0eCAqY3R4OyAvKiBDYWxsZXIncyBjb21wbGV0aW9uIGhvb2sgKi8KKwlzdHJ1Y3QgbDJ0X2VudHJ5ICpsMnQ7ICAvKiBMYXllciBUd28gVGFibGUgZW50cnkgZm9yIGRtYWMgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OyAvKiBBc3NvY2lhdGVkIG5ldCBkZXZpY2UgKi8KKwl1MzIgdGlkOyAgICAgICAgICAgICAgICAvKiBUaGlzIHdpbGwgc3RvcmUgdGhlIGFjdHVhbCB0aWQgKi8KKworCS8qIFRoZSBmaWx0ZXIgaXRzZWxmLiAgTW9zdCBvZiB0aGlzIGlzIGEgc3RyYWlnaHQgY29weSBvZiBpbmZvcm1hdGlvbgorCSAqIHByb3ZpZGVkIGJ5IHRoZSBleHRlbmRlZCBpb2N0bCgpLiAgU29tZSBmaWVsZHMgYXJlIHRyYW5zbGF0ZWQgdG8KKwkgKiBpbnRlcm5hbCBmb3JtcyAtLSBmb3IgaW5zdGFuY2UgdGhlIEluZ3Jlc3MgUXVldWUgSUQgcGFzc2VkIGluIGZyb20KKwkgKiB0aGUgaW9jdGwoKSBpcyB0cmFuc2xhdGVkIGludG8gdGhlIEFic29sdXRlIEluZ3Jlc3MgUXVldWUgSUQuCisJICovCisJc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uIGZzOworfTsKKwogc3RhdGljIGlubGluZSBpbnQgaXNfb2ZmbG9hZChjb25zdCBzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKIHsKIAlyZXR1cm4gYWRhcC0+cGFyYW1zLm9mZmxvYWQ7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3BjaV91bGQoY29uc3Qgc3RydWN0IGFkYXB0ZXIgKmFkYXApCit7CisJcmV0dXJuIGFkYXAtPnBhcmFtcy5jcnlwdG87Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3VsZChjb25zdCBzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKK3sKKwlyZXR1cm4gKGFkYXAtPnBhcmFtcy5vZmZsb2FkIHx8IGFkYXAtPnBhcmFtcy5jcnlwdG8pOworfQorCiBzdGF0aWMgaW5saW5lIHUzMiB0NF9yZWFkX3JlZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgdTMyIHJlZ19hZGRyKQogewogCXJldHVybiByZWFkbChhZGFwLT5yZWdzICsgcmVnX2FkZHIpOwpAQCAtMTE3OCw2ICsxMjk1LDggQEAKIGludCB0NF9zZ2VfYWxsb2NfY3RybF90eHEoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHN0cnVjdCBzZ2VfY3RybF90eHEgKnR4cSwKIAkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGlxaWQsCiAJCQkgIHVuc2lnbmVkIGludCBjbXBscWlkKTsKK2ludCB0NF9zZ2VfbW9kX2N0cmxfdHhxKHN0cnVjdCBhZGFwdGVyICphZGFwLCB1bnNpZ25lZCBpbnQgZXFpZCwKKwkJCXVuc2lnbmVkIGludCBjbXBscWlkKTsKIGludCB0NF9zZ2VfYWxsb2Nfb2ZsZF90eHEoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHN0cnVjdCBzZ2Vfb2ZsZF90eHEgKnR4cSwKIAkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGlxaWQpOwogaXJxcmV0dXJuX3QgdDRfc2dlX2ludHJfbXNpeChpbnQgaXJxLCB2b2lkICpjb29raWUpOwpAQCAtMTE4NSw4ICsxMzA0LDYgQEAKIHZvaWQgdDRfc2dlX3N0YXJ0KHN0cnVjdCBhZGFwdGVyICphZGFwKTsKIHZvaWQgdDRfc2dlX3N0b3Aoc3RydWN0IGFkYXB0ZXIgKmFkYXApOwogaW50IGN4Z2JfYnVzeV9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSk7Ci1pbnQgY3hnYjRfc2V0X3JzcHFfaW50cl9wYXJhbXMoc3RydWN0IHNnZV9yc3BxICpxLCB1bnNpZ25lZCBpbnQgdXMsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IGNudCk7CiB2b2lkIGN4Z2I0X3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKIGludCBjeGdiNF93cml0ZV9yc3MoY29uc3Qgc3RydWN0IHBvcnRfaW5mbyAqcGksIGNvbnN0IHUxNiAqcXVldWVzKTsKIGV4dGVybiBpbnQgZGJmaWZvX2ludF90aHJlc2g7CkBAIC0xMjg5LDYgKzE0MDYsMTggQEAKIAlyZXR1cm4gYSAmIDB4M2Y7CiB9CiAKK2ludCBjeGdiNF9zZXRfcnNwcV9pbnRyX3BhcmFtcyhzdHJ1Y3Qgc2dlX3JzcHEgKnEsIHVuc2lnbmVkIGludCB1cywKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgY250KTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbml0X3JzcHEoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHN0cnVjdCBzZ2VfcnNwcSAqcSwKKwkJCSAgICAgdW5zaWduZWQgaW50IHVzLCB1bnNpZ25lZCBpbnQgY250LAorCQkJICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgaW50IGlxZV9zaXplKQoreworCXEtPmFkYXAgPSBhZGFwOworCWN4Z2I0X3NldF9yc3BxX2ludHJfcGFyYW1zKHEsIHVzLCBjbnQpOworCXEtPmlxZV9sZW4gPSBpcWVfc2l6ZTsKKwlxLT5zaXplID0gc2l6ZTsKK30KKwogdm9pZCB0NF93cml0ZV9pbmRpcmVjdChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgdW5zaWduZWQgaW50IGFkZHJfcmVnLAogCQkgICAgICAgdW5zaWduZWQgaW50IGRhdGFfcmVnLCBjb25zdCB1MzIgKnZhbHMsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgbnJlZ3MsIHVuc2lnbmVkIGludCBzdGFydF9pZHgpOwpAQCAtMTUxNCw2ICsxNjQzLDkgQEAKIAkJCSBpbnQgZmlsdGVyX2luZGV4LCBpbnQgKmVuYWJsZWQpOwogaW50IHQ0X2Z3YWRkcnNwYWNlX3dyaXRlKHN0cnVjdCBhZGFwdGVyICphZGFwLCB1bnNpZ25lZCBpbnQgbWJveCwKIAkJCSB1MzIgYWRkciwgdTMyIHZhbCk7CitpbnQgdDRfc2NoZWRfcGFyYW1zKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgdHlwZSwgaW50IGxldmVsLCBpbnQgbW9kZSwKKwkJICAgIGludCByYXRldW5pdCwgaW50IHJhdGVtb2RlLCBpbnQgY2hhbm5lbCwgaW50IGNsYXNzLAorCQkgICAgaW50IG1pbnJhdGUsIGludCBtYXhyYXRlLCBpbnQgd2VpZ2h0LCBpbnQgcGt0c2l6ZSk7CiB2b2lkIHQ0X3NnZV9kZWNvZGVfaWRtYV9zdGF0ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IHN0YXRlKTsKIHZvaWQgdDRfZnJlZV9tZW0odm9pZCAqYWRkcik7CiB2b2lkIHQ0X2lkbWFfbW9uaXRvcl9pbml0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLApAQCAtMTUyMSw0ICsxNjUzLDExIEBACiB2b2lkIHQ0X2lkbWFfbW9uaXRvcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKIAkJICAgICBzdHJ1Y3Qgc2dlX2lkbWFfbW9uaXRvcl9zdGF0ZSAqaWRtYSwKIAkJICAgICBpbnQgaHosIGludCB0aWNrcyk7CitpbnQgdDRfc2V0X3ZmX21hY19hY2woc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCB2ZiwKKwkJICAgICAgdW5zaWduZWQgaW50IG5hZGRyLCB1OCAqYWRkcik7Cit2b2lkIHQ0X3VsZF9tZW1fZnJlZShzdHJ1Y3QgYWRhcHRlciAqYWRhcCk7CitpbnQgdDRfdWxkX21lbV9hbGxvYyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCk7Cit2b2lkIHQ0X3VsZF9jbGVhbl91cChzdHJ1Y3QgYWRhcHRlciAqYWRhcCk7Cit2b2lkIHQ0X3JlZ2lzdGVyX25ldGV2ZW50X25vdGlmaWVyKHZvaWQpOwordm9pZCBmcmVlX3JzcHFfZmwoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHN0cnVjdCBzZ2VfcnNwcSAqcnEsIHN0cnVjdCBzZ2VfZmwgKmZsKTsKICNlbmRpZiAvKiBfX0NYR0I0X0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X2RlYnVnZnMuYwppbmRleCA5MWZiNTA4Li4yMDQ1NWQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X2RlYnVnZnMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X2RlYnVnZnMuYwpAQCAtMjQzMiwxNyArMjQzMiwxMSBAQAogewogCXN0cnVjdCBhZGFwdGVyICphZGFwID0gc2VxLT5wcml2YXRlOwogCWludCBldGhfZW50cmllcyA9IERJVl9ST1VORF9VUChhZGFwLT5zZ2UuZXRocXNldHMsIDQpOwotCWludCBpc2NzaV9lbnRyaWVzID0gRElWX1JPVU5EX1VQKGFkYXAtPnNnZS5pc2NzaXFzZXRzLCA0KTsKLQlpbnQgaXNjc2l0X2VudHJpZXMgPSBESVZfUk9VTkRfVVAoYWRhcC0+c2dlLm5pc2NzaXRxLCA0KTsKLQlpbnQgcmRtYV9lbnRyaWVzID0gRElWX1JPVU5EX1VQKGFkYXAtPnNnZS5yZG1hcXMsIDQpOwotCWludCBjaXFfZW50cmllcyA9IERJVl9ST1VORF9VUChhZGFwLT5zZ2UucmRtYWNpcXMsIDQpOworCWludCBvZmxkX2VudHJpZXMgPSBESVZfUk9VTkRfVVAoYWRhcC0+c2dlLm9mbGRxc2V0cywgNCk7CiAJaW50IGN0cmxfZW50cmllcyA9IERJVl9ST1VORF9VUChNQVhfQ1RSTF9RVUVVRVMsIDQpOwogCWludCBpLCByID0gKHVpbnRwdHJfdCl2IC0gMTsKLQlpbnQgaXNjc2lfaWR4ID0gciAtIGV0aF9lbnRyaWVzOwotCWludCBpc2NzaXRfaWR4ID0gaXNjc2lfaWR4IC0gaXNjc2lfZW50cmllczsKLQlpbnQgcmRtYV9pZHggPSBpc2NzaXRfaWR4IC0gaXNjc2l0X2VudHJpZXM7Ci0JaW50IGNpcV9pZHggPSByZG1hX2lkeCAtIHJkbWFfZW50cmllczsKLQlpbnQgY3RybF9pZHggPSAgY2lxX2lkeCAtIGNpcV9lbnRyaWVzOworCWludCBvZmxkX2lkeCA9IHIgLSBldGhfZW50cmllczsKKwlpbnQgY3RybF9pZHggPSAgb2ZsZF9pZHggLSBvZmxkX2VudHJpZXM7CiAJaW50IGZxX2lkeCA9ICBjdHJsX2lkeCAtIGN0cmxfZW50cmllczsKIAogCWlmIChyKQpAQCAtMjUxOCwxMTkgKzI1MTIsMTcgQEAKIAkJUkwoIkZMTG93OiIsIGZsLmxvdyk7CiAJCVJMKCJGTFN0YXJ2aW5nOiIsIGZsLnN0YXJ2aW5nKTsKIAotCX0gZWxzZSBpZiAoaXNjc2lfaWR4IDwgaXNjc2lfZW50cmllcykgewotCQljb25zdCBzdHJ1Y3Qgc2dlX29mbGRfcnhxICpyeCA9Ci0JCQkmYWRhcC0+c2dlLmlzY3NpcnhxW2lzY3NpX2lkeCAqIDRdOworCX0gZWxzZSBpZiAob2ZsZF9pZHggPCBvZmxkX2VudHJpZXMpIHsKIAkJY29uc3Qgc3RydWN0IHNnZV9vZmxkX3R4cSAqdHggPQotCQkJJmFkYXAtPnNnZS5vZmxkdHhxW2lzY3NpX2lkeCAqIDRdOwotCQlpbnQgbiA9IG1pbig0LCBhZGFwLT5zZ2UuaXNjc2lxc2V0cyAtIDQgKiBpc2NzaV9pZHgpOworCQkJJmFkYXAtPnNnZS5vZmxkdHhxW29mbGRfaWR4ICogNF07CisJCWludCBuID0gbWluKDQsIGFkYXAtPnNnZS5vZmxkcXNldHMgLSA0ICogb2ZsZF9pZHgpOwogCi0JCVMoIlFUeXBlOiIsICJpU0NTSSIpOworCQlTKCJRVHlwZToiLCAiT0ZMRC1UeHEiKTsKIAkJVCgiVHhRIElEOiIsIHEuY250eHRfaWQpOwogCQlUKCJUeFEgc2l6ZToiLCBxLnNpemUpOwogCQlUKCJUeFEgaW51c2U6IiwgcS5pbl91c2UpOwogCQlUKCJUeFEgQ0lEWDoiLCBxLmNpZHgpOwogCQlUKCJUeFEgUElEWDoiLCBxLnBpZHgpOwotCQlSKCJSc3BRIElEOiIsIHJzcHEuYWJzX2lkKTsKLQkJUigiUnNwUSBzaXplOiIsIHJzcHEuc2l6ZSk7Ci0JCVIoIlJzcFFFIHNpemU6IiwgcnNwcS5pcWVfbGVuKTsKLQkJUigiUnNwUSBDSURYOiIsIHJzcHEuY2lkeCk7Ci0JCVIoIlJzcFEgR2VuOiIsIHJzcHEuZ2VuKTsKLQkJUzMoInUiLCAiSW50ciBkZWxheToiLCBxdGltZXJfdmFsKGFkYXAsICZyeFtpXS5yc3BxKSk7Ci0JCVMzKCJ1IiwgIkludHIgcGt0Y250OiIsCi0JCSAgIGFkYXAtPnNnZS5jb3VudGVyX3ZhbFtyeFtpXS5yc3BxLnBrdGNudF9pZHhdKTsKLQkJUigiRkwgSUQ6IiwgZmwuY250eHRfaWQpOwotCQlSKCJGTCBzaXplOiIsIGZsLnNpemUgLSA4KTsKLQkJUigiRkwgcGVuZDoiLCBmbC5wZW5kX2NyZWQpOwotCQlSKCJGTCBhdmFpbDoiLCBmbC5hdmFpbCk7Ci0JCVIoIkZMIFBJRFg6IiwgZmwucGlkeCk7Ci0JCVIoIkZMIENJRFg6IiwgZmwuY2lkeCk7Ci0JCVJMKCJSeFBhY2tldHM6Iiwgc3RhdHMucGt0cyk7Ci0JCVJMKCJSeEltbVBrdHM6Iiwgc3RhdHMuaW1tKTsKLQkJUkwoIlJ4Tm9NZW06Iiwgc3RhdHMubm9tZW0pOwotCQlSTCgiRkxBbGxvY0VycjoiLCBmbC5hbGxvY19mYWlsZWQpOwotCQlSTCgiRkxMcmdBbGNFcnI6IiwgZmwubGFyZ2VfYWxsb2NfZmFpbGVkKTsKLQkJUkwoIkZMTWFwRXJyOiIsIGZsLm1hcHBpbmdfZXJyKTsKLQkJUkwoIkZMTG93OiIsIGZsLmxvdyk7Ci0JCVJMKCJGTFN0YXJ2aW5nOiIsIGZsLnN0YXJ2aW5nKTsKLQotCX0gZWxzZSBpZiAoaXNjc2l0X2lkeCA8IGlzY3NpdF9lbnRyaWVzKSB7Ci0JCWNvbnN0IHN0cnVjdCBzZ2Vfb2ZsZF9yeHEgKnJ4ID0KLQkJCSZhZGFwLT5zZ2UuaXNjc2l0cnhxW2lzY3NpdF9pZHggKiA0XTsKLQkJaW50IG4gPSBtaW4oNCwgYWRhcC0+c2dlLm5pc2NzaXRxIC0gNCAqIGlzY3NpdF9pZHgpOwotCi0JCVMoIlFUeXBlOiIsICJpU0NTSVQiKTsKLQkJUigiUnNwUSBJRDoiLCByc3BxLmFic19pZCk7Ci0JCVIoIlJzcFEgc2l6ZToiLCByc3BxLnNpemUpOwotCQlSKCJSc3BRRSBzaXplOiIsIHJzcHEuaXFlX2xlbik7Ci0JCVIoIlJzcFEgQ0lEWDoiLCByc3BxLmNpZHgpOwotCQlSKCJSc3BRIEdlbjoiLCByc3BxLmdlbik7Ci0JCVMzKCJ1IiwgIkludHIgZGVsYXk6IiwgcXRpbWVyX3ZhbChhZGFwLCAmcnhbaV0ucnNwcSkpOwotCQlTMygidSIsICJJbnRyIHBrdGNudDoiLAotCQkgICBhZGFwLT5zZ2UuY291bnRlcl92YWxbcnhbaV0ucnNwcS5wa3RjbnRfaWR4XSk7Ci0JCVIoIkZMIElEOiIsIGZsLmNudHh0X2lkKTsKLQkJUigiRkwgc2l6ZToiLCBmbC5zaXplIC0gOCk7Ci0JCVIoIkZMIHBlbmQ6IiwgZmwucGVuZF9jcmVkKTsKLQkJUigiRkwgYXZhaWw6IiwgZmwuYXZhaWwpOwotCQlSKCJGTCBQSURYOiIsIGZsLnBpZHgpOwotCQlSKCJGTCBDSURYOiIsIGZsLmNpZHgpOwotCQlSTCgiUnhQYWNrZXRzOiIsIHN0YXRzLnBrdHMpOwotCQlSTCgiUnhJbW1Qa3RzOiIsIHN0YXRzLmltbSk7Ci0JCVJMKCJSeE5vTWVtOiIsIHN0YXRzLm5vbWVtKTsKLQkJUkwoIkZMQWxsb2NFcnI6IiwgZmwuYWxsb2NfZmFpbGVkKTsKLQkJUkwoIkZMTHJnQWxjRXJyOiIsIGZsLmxhcmdlX2FsbG9jX2ZhaWxlZCk7Ci0JCVJMKCJGTE1hcEVycjoiLCBmbC5tYXBwaW5nX2Vycik7Ci0JCVJMKCJGTExvdzoiLCBmbC5sb3cpOwotCQlSTCgiRkxTdGFydmluZzoiLCBmbC5zdGFydmluZyk7Ci0KLQl9IGVsc2UgaWYgKHJkbWFfaWR4IDwgcmRtYV9lbnRyaWVzKSB7Ci0JCWNvbnN0IHN0cnVjdCBzZ2Vfb2ZsZF9yeHEgKnJ4ID0KLQkJCQkmYWRhcC0+c2dlLnJkbWFyeHFbcmRtYV9pZHggKiA0XTsKLQkJaW50IG4gPSBtaW4oNCwgYWRhcC0+c2dlLnJkbWFxcyAtIDQgKiByZG1hX2lkeCk7Ci0KLQkJUygiUVR5cGU6IiwgIlJETUEtQ1BMIik7Ci0JCVMoIkludGVyZmFjZToiLAotCQkgIHJ4W2ldLnJzcHEubmV0ZGV2ID8gcnhbaV0ucnNwcS5uZXRkZXYtPm5hbWUgOiAiTi9BIik7Ci0JCVIoIlJzcFEgSUQ6IiwgcnNwcS5hYnNfaWQpOwotCQlSKCJSc3BRIHNpemU6IiwgcnNwcS5zaXplKTsKLQkJUigiUnNwUUUgc2l6ZToiLCByc3BxLmlxZV9sZW4pOwotCQlSKCJSc3BRIENJRFg6IiwgcnNwcS5jaWR4KTsKLQkJUigiUnNwUSBHZW46IiwgcnNwcS5nZW4pOwotCQlTMygidSIsICJJbnRyIGRlbGF5OiIsIHF0aW1lcl92YWwoYWRhcCwgJnJ4W2ldLnJzcHEpKTsKLQkJUzMoInUiLCAiSW50ciBwa3RjbnQ6IiwKLQkJICAgYWRhcC0+c2dlLmNvdW50ZXJfdmFsW3J4W2ldLnJzcHEucGt0Y250X2lkeF0pOwotCQlSKCJGTCBJRDoiLCBmbC5jbnR4dF9pZCk7Ci0JCVIoIkZMIHNpemU6IiwgZmwuc2l6ZSAtIDgpOwotCQlSKCJGTCBwZW5kOiIsIGZsLnBlbmRfY3JlZCk7Ci0JCVIoIkZMIGF2YWlsOiIsIGZsLmF2YWlsKTsKLQkJUigiRkwgUElEWDoiLCBmbC5waWR4KTsKLQkJUigiRkwgQ0lEWDoiLCBmbC5jaWR4KTsKLQkJUkwoIlJ4UGFja2V0czoiLCBzdGF0cy5wa3RzKTsKLQkJUkwoIlJ4SW1tUGt0czoiLCBzdGF0cy5pbW0pOwotCQlSTCgiUnhOb01lbToiLCBzdGF0cy5ub21lbSk7Ci0JCVJMKCJGTEFsbG9jRXJyOiIsIGZsLmFsbG9jX2ZhaWxlZCk7Ci0JCVJMKCJGTExyZ0FsY0VycjoiLCBmbC5sYXJnZV9hbGxvY19mYWlsZWQpOwotCQlSTCgiRkxNYXBFcnI6IiwgZmwubWFwcGluZ19lcnIpOwotCQlSTCgiRkxMb3c6IiwgZmwubG93KTsKLQkJUkwoIkZMU3RhcnZpbmc6IiwgZmwuc3RhcnZpbmcpOwotCi0JfSBlbHNlIGlmIChjaXFfaWR4IDwgY2lxX2VudHJpZXMpIHsKLQkJY29uc3Qgc3RydWN0IHNnZV9vZmxkX3J4cSAqcnggPSAmYWRhcC0+c2dlLnJkbWFjaXFbY2lxX2lkeCAqIDRdOwotCQlpbnQgbiA9IG1pbig0LCBhZGFwLT5zZ2UucmRtYWNpcXMgLSA0ICogY2lxX2lkeCk7Ci0KLQkJUygiUVR5cGU6IiwgIlJETUEtQ0lRIik7Ci0JCVMoIkludGVyZmFjZToiLAotCQkgIHJ4W2ldLnJzcHEubmV0ZGV2ID8gcnhbaV0ucnNwcS5uZXRkZXYtPm5hbWUgOiAiTi9BIik7Ci0JCVIoIlJzcFEgSUQ6IiwgcnNwcS5hYnNfaWQpOwotCQlSKCJSc3BRIHNpemU6IiwgcnNwcS5zaXplKTsKLQkJUigiUnNwUUUgc2l6ZToiLCByc3BxLmlxZV9sZW4pOwotCQlSKCJSc3BRIENJRFg6IiwgcnNwcS5jaWR4KTsKLQkJUigiUnNwUSBHZW46IiwgcnNwcS5nZW4pOwotCQlTMygidSIsICJJbnRyIGRlbGF5OiIsIHF0aW1lcl92YWwoYWRhcCwgJnJ4W2ldLnJzcHEpKTsKLQkJUzMoInUiLCAiSW50ciBwa3RjbnQ6IiwKLQkJICAgYWRhcC0+c2dlLmNvdW50ZXJfdmFsW3J4W2ldLnJzcHEucGt0Y250X2lkeF0pOwotCQlSTCgiUnhBTjoiLCBzdGF0cy5hbik7Ci0JCVJMKCJSeE5vTWVtOiIsIHN0YXRzLm5vbWVtKTsKIAogCX0gZWxzZSBpZiAoY3RybF9pZHggPCBjdHJsX2VudHJpZXMpIHsKIAkJY29uc3Qgc3RydWN0IHNnZV9jdHJsX3R4cSAqdHggPSAmYWRhcC0+c2dlLmN0cmxxW2N0cmxfaWR4ICogNF07CkBAIC0yNjcyLDEwICsyNTY0LDcgQEAKIHN0YXRpYyBpbnQgc2dlX3F1ZXVlX2VudHJpZXMoY29uc3Qgc3RydWN0IGFkYXB0ZXIgKmFkYXApCiB7CiAJcmV0dXJuIERJVl9ST1VORF9VUChhZGFwLT5zZ2UuZXRocXNldHMsIDQpICsKLQkgICAgICAgRElWX1JPVU5EX1VQKGFkYXAtPnNnZS5pc2NzaXFzZXRzLCA0KSArCi0JICAgICAgIERJVl9ST1VORF9VUChhZGFwLT5zZ2UubmlzY3NpdHEsIDQpICsKLQkgICAgICAgRElWX1JPVU5EX1VQKGFkYXAtPnNnZS5yZG1hcXMsIDQpICsKLQkgICAgICAgRElWX1JPVU5EX1VQKGFkYXAtPnNnZS5yZG1hY2lxcywgNCkgKworCSAgICAgICBESVZfUk9VTkRfVVAoYWRhcC0+c2dlLm9mbGRxc2V0cywgNCkgKwogCSAgICAgICBESVZfUk9VTkRfVVAoTUFYX0NUUkxfUVVFVUVTLCA0KSArIDE7CiB9CiAKQEAgLTI4NTksMTIgKzI3NDgsNiBAQAogCQkJCSBzaXplX21iIDw8IDIwKTsKIH0KIAotc3RhdGljIGludCBibG9ja2VkX2ZsX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHNzaXplX3QgYmxvY2tlZF9mbF9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqdWJ1ZiwKIAkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKQEAgLTI5MDgsNyArMjc5MSw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJsb2NrZWRfZmxfZm9wcyA9IHsKIAkub3duZXIgICA9IFRISVNfTU9EVUxFLAotCS5vcGVuICAgID0gYmxvY2tlZF9mbF9vcGVuLAorCS5vcGVuICAgID0gc2ltcGxlX29wZW4sCiAJLnJlYWQgICAgPSBibG9ja2VkX2ZsX3JlYWQsCiAJLndyaXRlICAgPSBibG9ja2VkX2ZsX3dyaXRlLAogCS5sbHNlZWsgID0gZ2VuZXJpY19maWxlX2xsc2VlaywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfZmlsdGVyLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X2ZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNzM2NzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X2ZpbHRlci5jCkBAIC0wLDAgKzEsNzIxIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENoZWxzaW8gVDQgRXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNiBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiY3hnYjQuaCIKKyNpbmNsdWRlICJ0NF9yZWdzLmgiCisjaW5jbHVkZSAibDJ0LmgiCisjaW5jbHVkZSAidDRmd19hcGkuaCIKKyNpbmNsdWRlICJjeGdiNF9maWx0ZXIuaCIKKworc3RhdGljIGlubGluZSBib29sIGlzX2ZpZWxkX3NldCh1MzIgdmFsLCB1MzIgbWFzaykKK3sKKwlyZXR1cm4gdmFsIHx8IG1hc2s7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCB1bnN1cHBvcnRlZCh1MzIgY29uZiwgdTMyIGNvbmZfbWFzaywgdTMyIHZhbCwgdTMyIG1hc2spCit7CisJcmV0dXJuICEoY29uZiAmIGNvbmZfbWFzaykgJiYgaXNfZmllbGRfc2V0KHZhbCwgbWFzayk7Cit9CisKKy8qIFZhbGlkYXRlIGZpbHRlciBzcGVjIGFnYWluc3QgY29uZmlndXJhdGlvbiBkb25lIG9uIHRoZSBjYXJkLiAqLworc3RhdGljIGludCB2YWxpZGF0ZV9maWx0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiAqZnMpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYyYWRhcChkZXYpOworCXUzMiBmY29uZiwgaWNvbmY7CisKKwkvKiBDaGVjayBmb3IgdW5jb25maWd1cmVkIGZpZWxkcyBiZWluZyB1c2VkLiAqLworCWZjb25mID0gYWRhcHRlci0+cGFyYW1zLnRwLnZsYW5fcHJpX21hcDsKKwlpY29uZiA9IGFkYXB0ZXItPnBhcmFtcy50cC5pbmdyZXNzX2NvbmZpZzsKKworCWlmICh1bnN1cHBvcnRlZChmY29uZiwgRkNPRV9GLCBmcy0+dmFsLmZjb2UsIGZzLT5tYXNrLmZjb2UpIHx8CisJICAgIHVuc3VwcG9ydGVkKGZjb25mLCBQT1JUX0YsIGZzLT52YWwuaXBvcnQsIGZzLT5tYXNrLmlwb3J0KSB8fAorCSAgICB1bnN1cHBvcnRlZChmY29uZiwgVE9TX0YsIGZzLT52YWwudG9zLCBmcy0+bWFzay50b3MpIHx8CisJICAgIHVuc3VwcG9ydGVkKGZjb25mLCBFVEhFUlRZUEVfRiwgZnMtPnZhbC5ldGh0eXBlLAorCQkJZnMtPm1hc2suZXRodHlwZSkgfHwKKwkgICAgdW5zdXBwb3J0ZWQoZmNvbmYsIE1BQ01BVENIX0YsIGZzLT52YWwubWFjaWR4LCBmcy0+bWFzay5tYWNpZHgpIHx8CisJICAgIHVuc3VwcG9ydGVkKGZjb25mLCBNUFNISVRUWVBFX0YsIGZzLT52YWwubWF0Y2h0eXBlLAorCQkJZnMtPm1hc2subWF0Y2h0eXBlKSB8fAorCSAgICB1bnN1cHBvcnRlZChmY29uZiwgRlJBR01FTlRBVElPTl9GLCBmcy0+dmFsLmZyYWcsIGZzLT5tYXNrLmZyYWcpIHx8CisJICAgIHVuc3VwcG9ydGVkKGZjb25mLCBQUk9UT0NPTF9GLCBmcy0+dmFsLnByb3RvLCBmcy0+bWFzay5wcm90bykgfHwKKwkgICAgdW5zdXBwb3J0ZWQoZmNvbmYsIFZOSUNfSURfRiwgZnMtPnZhbC5wZnZmX3ZsZCwKKwkJCWZzLT5tYXNrLnBmdmZfdmxkKSB8fAorCSAgICB1bnN1cHBvcnRlZChmY29uZiwgVk5JQ19JRF9GLCBmcy0+dmFsLm92bGFuX3ZsZCwKKwkJCWZzLT5tYXNrLm92bGFuX3ZsZCkgfHwKKwkgICAgdW5zdXBwb3J0ZWQoZmNvbmYsIFZMQU5fRiwgZnMtPnZhbC5pdmxhbl92bGQsIGZzLT5tYXNrLml2bGFuX3ZsZCkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCS8qIFQ0IGluY29udmVuaWVudGx5IHVzZXMgdGhlIHNhbWUgRlRfVk5JQ19JRF9XIGJpdHMgZm9yIGJvdGggdGhlIE91dGVyCisJICogVkxBTiBUYWcgYW5kIFBGL1ZGL1ZGdmxkIGZpZWxkcyBiYXNlZCBvbiBWTklDX0YgYmVpbmcgc2V0CisJICogaW4gVFBfSU5HUkVTU19DT05GSUcuICBIZW5zZSB0aGUgc29tZXdoYXQgY3JhenkgY2hlY2tzCisJICogYmVsb3cuICBBZGRpdGlvbmFsbHksIHNpbmNlIHRoZSBUNCBmaXJtd2FyZSBpbnRlcmZhY2UgYWxzbworCSAqIGNhcnJpZXMgdGhhdCBvdmVybGFwLCB3ZSBuZWVkIHRvIHRyYW5zbGF0ZSBhbnkgUEYvVkYKKwkgKiBzcGVjaWZpY2F0aW9uIGludG8gdGhhdCBpbnRlcm5hbCBmb3JtYXQgYmVsb3cuCisJICovCisJaWYgKGlzX2ZpZWxkX3NldChmcy0+dmFsLnBmdmZfdmxkLCBmcy0+bWFzay5wZnZmX3ZsZCkgJiYKKwkgICAgaXNfZmllbGRfc2V0KGZzLT52YWwub3ZsYW5fdmxkLCBmcy0+bWFzay5vdmxhbl92bGQpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYgKHVuc3VwcG9ydGVkKGljb25mLCBWTklDX0YsIGZzLT52YWwucGZ2Zl92bGQsIGZzLT5tYXNrLnBmdmZfdmxkKSB8fAorCSAgICAoaXNfZmllbGRfc2V0KGZzLT52YWwub3ZsYW5fdmxkLCBmcy0+bWFzay5vdmxhbl92bGQpICYmCisJICAgICAoaWNvbmYgJiBWTklDX0YpKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmIChmcy0+dmFsLnBmID4gMHg3IHx8IGZzLT52YWwudmYgPiAweDdmKQorCQlyZXR1cm4gLUVSQU5HRTsKKwlmcy0+bWFzay5wZiAmPSAweDc7CisJZnMtPm1hc2sudmYgJj0gMHg3ZjsKKworCS8qIElmIHRoZSB1c2VyIGlzIHJlcXVlc3RpbmcgdGhhdCB0aGUgZmlsdGVyIGFjdGlvbiBsb29wCisJICogbWF0Y2hpbmcgcGFja2V0cyBiYWNrIG91dCBvbmUgb2Ygb3VyIHBvcnRzLCBtYWtlIHN1cmUgdGhhdAorCSAqIHRoZSBlZ3Jlc3MgcG9ydCBpcyBpbiByYW5nZS4KKwkgKi8KKwlpZiAoZnMtPmFjdGlvbiA9PSBGSUxURVJfU1dJVENIICYmCisJICAgIGZzLT5lcG9ydCA+PSBhZGFwdGVyLT5wYXJhbXMubnBvcnRzKQorCQlyZXR1cm4gLUVSQU5HRTsKKworCS8qIERvbid0IGFsbG93IHZhcmlvdXMgdHJpdmlhbGx5IG9idmlvdXMgYm9ndXMgb3V0LW9mLXJhbmdlIHZhbHVlcy4uLiAqLworCWlmIChmcy0+dmFsLmlwb3J0ID49IGFkYXB0ZXItPnBhcmFtcy5ucG9ydHMpCisJCXJldHVybiAtRVJBTkdFOworCisJLyogVDQgZG9lc24ndCBzdXBwb3J0IHJlbW92aW5nIFZMQU4gVGFncyBmb3IgbG9vcCBiYWNrIGZpbHRlcnMuICovCisJaWYgKGlzX3Q0KGFkYXB0ZXItPnBhcmFtcy5jaGlwKSAmJgorCSAgICBmcy0+YWN0aW9uID09IEZJTFRFUl9TV0lUQ0ggJiYKKwkgICAgKGZzLT5uZXd2bGFuID09IFZMQU5fUkVNT1ZFIHx8CisJICAgICBmcy0+bmV3dmxhbiA9PSBWTEFOX1JFV1JJVEUpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfZmlsdGVyX3N0ZWVycShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gKmZzKQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2MmFkYXAoZGV2KTsKKwlpbnQgaXE7CisKKwkvKiBJZiB0aGUgdXNlciBoYXMgcmVxdWVzdGVkIHN0ZWVyaW5nIG1hdGNoaW5nIEluZ3Jlc3MgUGFja2V0cworCSAqIHRvIGEgc3BlY2lmaWMgUXVldWUgU2V0LCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBpdCdzIGluIHJhbmdlCisJICogZm9yIHRoZSBwb3J0IGFuZCBtYXAgdGhhdCBpbnRvIHRoZSBBYnNvbHV0ZSBRdWV1ZSBJRCBvZiB0aGUKKwkgKiBRdWV1ZSBTZXQncyBSZXNwb25zZSBRdWV1ZS4KKwkgKi8KKwlpZiAoIWZzLT5kaXJzdGVlcikgeworCQlpZiAoZnMtPmlxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlxID0gMDsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CisKKwkJLyogSWYgdGhlIGlxIGlkIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHFzZXRzLAorCQkgKiB0aGVuIGFzc3VtZSBpdCBpcyBhbiBhYnNvbHV0ZSBxaWQuCisJCSAqLworCQlpZiAoZnMtPmlxIDwgcGktPm5xc2V0cykKKwkJCWlxID0gYWRhcHRlci0+c2dlLmV0aHJ4cVtwaS0+Zmlyc3RfcXNldCArCisJCQkJCQkgZnMtPmlxXS5yc3BxLmFic19pZDsKKwkJZWxzZQorCQkJaXEgPSBmcy0+aXE7CisJfQorCisJcmV0dXJuIGlxOworfQorCitzdGF0aWMgaW50IGN4Z2I0X3NldF9mdGlkKHN0cnVjdCB0aWRfaW5mbyAqdCwgaW50IGZpZHgsIGludCBmYW1pbHkpCit7CisJc3Bpbl9sb2NrX2JoKCZ0LT5mdGlkX2xvY2spOworCisJaWYgKHRlc3RfYml0KGZpZHgsIHQtPmZ0aWRfYm1hcCkpIHsKKwkJc3Bpbl91bmxvY2tfYmgoJnQtPmZ0aWRfbG9jayk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKGZhbWlseSA9PSBQRl9JTkVUKQorCQlfX3NldF9iaXQoZmlkeCwgdC0+ZnRpZF9ibWFwKTsKKwllbHNlCisJCWJpdG1hcF9hbGxvY2F0ZV9yZWdpb24odC0+ZnRpZF9ibWFwLCBmaWR4LCAyKTsKKworCXNwaW5fdW5sb2NrX2JoKCZ0LT5mdGlkX2xvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjeGdiNF9jbGVhcl9mdGlkKHN0cnVjdCB0aWRfaW5mbyAqdCwgaW50IGZpZHgsIGludCBmYW1pbHkpCit7CisJc3Bpbl9sb2NrX2JoKCZ0LT5mdGlkX2xvY2spOworCWlmIChmYW1pbHkgPT0gUEZfSU5FVCkKKwkJX19jbGVhcl9iaXQoZmlkeCwgdC0+ZnRpZF9ibWFwKTsKKwllbHNlCisJCWJpdG1hcF9yZWxlYXNlX3JlZ2lvbih0LT5mdGlkX2JtYXAsIGZpZHgsIDIpOworCXNwaW5fdW5sb2NrX2JoKCZ0LT5mdGlkX2xvY2spOworfQorCisvKiBEZWxldGUgdGhlIGZpbHRlciBhdCBhIHNwZWNpZmllZCBpbmRleC4gKi8KK3N0YXRpYyBpbnQgZGVsX2ZpbHRlcl93cihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IGZpZHgpCit7CisJc3RydWN0IGZpbHRlcl9lbnRyeSAqZiA9ICZhZGFwdGVyLT50aWRzLmZ0aWRfdGFiW2ZpZHhdOworCXN0cnVjdCBmd19maWx0ZXJfd3IgKmZ3cjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGludCBsZW47CisKKwlsZW4gPSBzaXplb2YoKmZ3cik7CisKKwlza2IgPSBhbGxvY19za2IobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmd3IgPSAoc3RydWN0IGZ3X2ZpbHRlcl93ciAqKV9fc2tiX3B1dChza2IsIGxlbik7CisJdDRfbWtfZmlsdGRlbHdyKGYtPnRpZCwgZndyLCBhZGFwdGVyLT5zZ2UuZndfZXZ0cS5hYnNfaWQpOworCisJLyogTWFyayB0aGUgZmlsdGVyIGFzICJwZW5kaW5nIiBhbmQgc2hpcCBvZmYgdGhlIEZpbHRlciBXb3JrIFJlcXVlc3QuCisJICogV2hlbiB3ZSBnZXQgdGhlIFdvcmsgUmVxdWVzdCBSZXBseSB3ZSdsbCBjbGVhciB0aGUgcGVuZGluZyBzdGF0dXMuCisJICovCisJZi0+cGVuZGluZyA9IDE7CisJdDRfbWdtdF90eChhZGFwdGVyLCBza2IpOworCXJldHVybiAwOworfQorCisvKiBTZW5kIGEgV29yayBSZXF1ZXN0IHRvIHdyaXRlIHRoZSBmaWx0ZXIgYXQgYSBzcGVjaWZpZWQgaW5kZXguICBXZSBjb25zdHJ1Y3QKKyAqIGEgRmlybXdhcmUgRmlsdGVyIFdvcmsgUmVxdWVzdCB0byBoYXZlIHRoZSB3b3JrIGRvbmUgYW5kIHB1dCB0aGUgaW5kaWNhdGVkCisgKiBmaWx0ZXIgaW50byAicGVuZGluZyIgbW9kZSB3aGljaCB3aWxsIHByZXZlbnQgYW55IGZ1cnRoZXIgYWN0aW9ucyBhZ2FpbnN0CisgKiBpdCB0aWxsIHdlIGdldCBhIHJlcGx5IGZyb20gdGhlIGZpcm13YXJlIG9uIHRoZSBjb21wbGV0aW9uIHN0YXR1cyBvZiB0aGUKKyAqIHJlcXVlc3QuCisgKi8KK2ludCBzZXRfZmlsdGVyX3dyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgZmlkeCkKK3sKKwlzdHJ1Y3QgZmlsdGVyX2VudHJ5ICpmID0gJmFkYXB0ZXItPnRpZHMuZnRpZF90YWJbZmlkeF07CisJc3RydWN0IGZ3X2ZpbHRlcl93ciAqZndyOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBhbGxvY19za2Ioc2l6ZW9mKCpmd3IpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBJZiB0aGUgbmV3IGZpbHRlciByZXF1aXJlcyBsb29wYmFjayBEZXN0aW5hdGlvbiBNQUMgYW5kL29yIFZMQU4KKwkgKiByZXdyaXRpbmcgdGhlbiB3ZSBuZWVkIHRvIGFsbG9jYXRlIGEgTGF5ZXIgMiBUYWJsZSAoTDJUKSBlbnRyeSBmb3IKKwkgKiB0aGUgZmlsdGVyLgorCSAqLworCWlmIChmLT5mcy5uZXdkbWFjIHx8IGYtPmZzLm5ld3ZsYW4pIHsKKwkJLyogYWxsb2NhdGUgTDJUIGVudHJ5IGZvciBuZXcgZmlsdGVyICovCisJCWYtPmwydCA9IHQ0X2wydF9hbGxvY19zd2l0Y2hpbmcoYWRhcHRlciwgZi0+ZnMudmxhbiwKKwkJCQkJCWYtPmZzLmVwb3J0LCBmLT5mcy5kbWFjKTsKKwkJaWYgKCFmLT5sMnQpIHsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKwlmd3IgPSAoc3RydWN0IGZ3X2ZpbHRlcl93ciAqKV9fc2tiX3B1dChza2IsIHNpemVvZigqZndyKSk7CisJbWVtc2V0KGZ3ciwgMCwgc2l6ZW9mKCpmd3IpKTsKKworCS8qIEl0IHdvdWxkIGJlIG5pY2UgdG8gcHV0IG1vc3Qgb2YgdGhlIGZvbGxvd2luZyBpbiB0NF9ody5jIGJ1dCBtb3N0CisJICogb2YgdGhlIHdvcmsgaXMgdHJhbnNsYXRpbmcgdGhlIGN4Z2J0b29sIGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uCisJICogaW50byB0aGUgV29yayBSZXF1ZXN0IGFuZCB0aGUgZGVmaW5pdGlvbiBvZiB0aGF0IHN0cnVjdHVyZSBpcworCSAqIGN1cnJlbnRseSBpbiBjeGdidG9vbC5oIHdoaWNoIGlzbid0IGFwcHJvcHJpYXRlIHRvIHB1bGwgaW50byB0aGUKKwkgKiBjb21tb24gY29kZS4gIFdlIG1heSBldmVudHVhbGx5IHRyeSB0byBjb21lIHVwIHdpdGggYSBtb3JlIG5ldXRyYWwKKwkgKiBmaWx0ZXIgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgYnV0IGZvciBub3cgaXQncyBlYXNpZXN0IHRvIHNpbXBseQorCSAqIHB1dCB0aGlzIGZhaXJseSBkaXJlY3QgY29kZSBpbiBsaW5lIC4uLgorCSAqLworCWZ3ci0+b3BfcGtkID0gaHRvbmwoRldfV1JfT1BfVihGV19GSUxURVJfV1IpKTsKKwlmd3ItPmxlbjE2X3BrZCA9IGh0b25sKEZXX1dSX0xFTjE2X1Yoc2l6ZW9mKCpmd3IpIC8gMTYpKTsKKwlmd3ItPnRpZF90b19pcSA9CisJCWh0b25sKEZXX0ZJTFRFUl9XUl9USURfVihmLT50aWQpIHwKKwkJICAgICAgRldfRklMVEVSX1dSX1JRVFlQRV9WKGYtPmZzLnR5cGUpIHwKKwkJICAgICAgRldfRklMVEVSX1dSX05PUkVQTFlfVigwKSB8CisJCSAgICAgIEZXX0ZJTFRFUl9XUl9JUV9WKGYtPmZzLmlxKSk7CisJZndyLT5kZWxfZmlsdGVyX3RvX2wydGl4ID0KKwkJaHRvbmwoRldfRklMVEVSX1dSX1JQVFRJRF9WKGYtPmZzLnJwdHRpZCkgfAorCQkgICAgICBGV19GSUxURVJfV1JfRFJPUF9WKGYtPmZzLmFjdGlvbiA9PSBGSUxURVJfRFJPUCkgfAorCQkgICAgICBGV19GSUxURVJfV1JfRElSU1RFRVJfVihmLT5mcy5kaXJzdGVlcikgfAorCQkgICAgICBGV19GSUxURVJfV1JfTUFTS0hBU0hfVihmLT5mcy5tYXNraGFzaCkgfAorCQkgICAgICBGV19GSUxURVJfV1JfRElSU1RFRVJIQVNIX1YoZi0+ZnMuZGlyc3RlZXJoYXNoKSB8CisJCSAgICAgIEZXX0ZJTFRFUl9XUl9MUEJLX1YoZi0+ZnMuYWN0aW9uID09IEZJTFRFUl9TV0lUQ0gpIHwKKwkJICAgICAgRldfRklMVEVSX1dSX0RNQUNfVihmLT5mcy5uZXdkbWFjKSB8CisJCSAgICAgIEZXX0ZJTFRFUl9XUl9TTUFDX1YoZi0+ZnMubmV3c21hYykgfAorCQkgICAgICBGV19GSUxURVJfV1JfSU5TVkxBTl9WKGYtPmZzLm5ld3ZsYW4gPT0gVkxBTl9JTlNFUlQgfHwKKwkJCQkJICAgICBmLT5mcy5uZXd2bGFuID09IFZMQU5fUkVXUklURSkgfAorCQkgICAgICBGV19GSUxURVJfV1JfUk1WTEFOX1YoZi0+ZnMubmV3dmxhbiA9PSBWTEFOX1JFTU9WRSB8fAorCQkJCQkgICAgZi0+ZnMubmV3dmxhbiA9PSBWTEFOX1JFV1JJVEUpIHwKKwkJICAgICAgRldfRklMVEVSX1dSX0hJVENOVFNfVihmLT5mcy5oaXRjbnRzKSB8CisJCSAgICAgIEZXX0ZJTFRFUl9XUl9UWENIQU5fVihmLT5mcy5lcG9ydCkgfAorCQkgICAgICBGV19GSUxURVJfV1JfUFJJT19WKGYtPmZzLnByaW8pIHwKKwkJICAgICAgRldfRklMVEVSX1dSX0wyVElYX1YoZi0+bDJ0ID8gZi0+bDJ0LT5pZHggOiAwKSk7CisJZndyLT5ldGh0eXBlID0gaHRvbnMoZi0+ZnMudmFsLmV0aHR5cGUpOworCWZ3ci0+ZXRodHlwZW0gPSBodG9ucyhmLT5mcy5tYXNrLmV0aHR5cGUpOworCWZ3ci0+ZnJhZ190b19vdmxhbl92bGRtID0KKwkJKEZXX0ZJTFRFUl9XUl9GUkFHX1YoZi0+ZnMudmFsLmZyYWcpIHwKKwkJIEZXX0ZJTFRFUl9XUl9GUkFHTV9WKGYtPmZzLm1hc2suZnJhZykgfAorCQkgRldfRklMVEVSX1dSX0lWTEFOX1ZMRF9WKGYtPmZzLnZhbC5pdmxhbl92bGQpIHwKKwkJIEZXX0ZJTFRFUl9XUl9PVkxBTl9WTERfVihmLT5mcy52YWwub3ZsYW5fdmxkKSB8CisJCSBGV19GSUxURVJfV1JfSVZMQU5fVkxETV9WKGYtPmZzLm1hc2suaXZsYW5fdmxkKSB8CisJCSBGV19GSUxURVJfV1JfT1ZMQU5fVkxETV9WKGYtPmZzLm1hc2sub3ZsYW5fdmxkKSk7CisJZndyLT5zbWFjX3NlbCA9IDA7CisJZndyLT5yeF9jaGFuX3J4X3JwbF9pcSA9CisJCWh0b25zKEZXX0ZJTFRFUl9XUl9SWF9DSEFOX1YoMCkgfAorCQkgICAgICBGV19GSUxURVJfV1JfUlhfUlBMX0lRX1YoYWRhcHRlci0+c2dlLmZ3X2V2dHEuYWJzX2lkKSk7CisJZndyLT5tYWNpX3RvX21hdGNodHlwZW0gPQorCQlodG9ubChGV19GSUxURVJfV1JfTUFDSV9WKGYtPmZzLnZhbC5tYWNpZHgpIHwKKwkJICAgICAgRldfRklMVEVSX1dSX01BQ0lNX1YoZi0+ZnMubWFzay5tYWNpZHgpIHwKKwkJICAgICAgRldfRklMVEVSX1dSX0ZDT0VfVihmLT5mcy52YWwuZmNvZSkgfAorCQkgICAgICBGV19GSUxURVJfV1JfRkNPRU1fVihmLT5mcy5tYXNrLmZjb2UpIHwKKwkJICAgICAgRldfRklMVEVSX1dSX1BPUlRfVihmLT5mcy52YWwuaXBvcnQpIHwKKwkJICAgICAgRldfRklMVEVSX1dSX1BPUlRNX1YoZi0+ZnMubWFzay5pcG9ydCkgfAorCQkgICAgICBGV19GSUxURVJfV1JfTUFUQ0hUWVBFX1YoZi0+ZnMudmFsLm1hdGNodHlwZSkgfAorCQkgICAgICBGV19GSUxURVJfV1JfTUFUQ0hUWVBFTV9WKGYtPmZzLm1hc2subWF0Y2h0eXBlKSk7CisJZndyLT5wdGNsID0gZi0+ZnMudmFsLnByb3RvOworCWZ3ci0+cHRjbG0gPSBmLT5mcy5tYXNrLnByb3RvOworCWZ3ci0+dHR5cCA9IGYtPmZzLnZhbC50b3M7CisJZndyLT50dHlwbSA9IGYtPmZzLm1hc2sudG9zOworCWZ3ci0+aXZsYW4gPSBodG9ucyhmLT5mcy52YWwuaXZsYW4pOworCWZ3ci0+aXZsYW5tID0gaHRvbnMoZi0+ZnMubWFzay5pdmxhbik7CisJZndyLT5vdmxhbiA9IGh0b25zKGYtPmZzLnZhbC5vdmxhbik7CisJZndyLT5vdmxhbm0gPSBodG9ucyhmLT5mcy5tYXNrLm92bGFuKTsKKwltZW1jcHkoZndyLT5saXAsIGYtPmZzLnZhbC5saXAsIHNpemVvZihmd3ItPmxpcCkpOworCW1lbWNweShmd3ItPmxpcG0sIGYtPmZzLm1hc2subGlwLCBzaXplb2YoZndyLT5saXBtKSk7CisJbWVtY3B5KGZ3ci0+ZmlwLCBmLT5mcy52YWwuZmlwLCBzaXplb2YoZndyLT5maXApKTsKKwltZW1jcHkoZndyLT5maXBtLCBmLT5mcy5tYXNrLmZpcCwgc2l6ZW9mKGZ3ci0+ZmlwbSkpOworCWZ3ci0+bHAgPSBodG9ucyhmLT5mcy52YWwubHBvcnQpOworCWZ3ci0+bHBtID0gaHRvbnMoZi0+ZnMubWFzay5scG9ydCk7CisJZndyLT5mcCA9IGh0b25zKGYtPmZzLnZhbC5mcG9ydCk7CisJZndyLT5mcG0gPSBodG9ucyhmLT5mcy5tYXNrLmZwb3J0KTsKKwlpZiAoZi0+ZnMubmV3c21hYykKKwkJbWVtY3B5KGZ3ci0+c21hLCBmLT5mcy5zbWFjLCBzaXplb2YoZndyLT5zbWEpKTsKKworCS8qIE1hcmsgdGhlIGZpbHRlciBhcyAicGVuZGluZyIgYW5kIHNoaXAgb2ZmIHRoZSBGaWx0ZXIgV29yayBSZXF1ZXN0LgorCSAqIFdoZW4gd2UgZ2V0IHRoZSBXb3JrIFJlcXVlc3QgUmVwbHkgd2UnbGwgY2xlYXIgdGhlIHBlbmRpbmcgc3RhdHVzLgorCSAqLworCWYtPnBlbmRpbmcgPSAxOworCXNldF93cl90eHEoc2tiLCBDUExfUFJJT1JJVFlfQ09OVFJPTCwgZi0+ZnMudmFsLmlwb3J0ICYgMHgzKTsKKwl0NF9vZmxkX3NlbmQoYWRhcHRlciwgc2tiKTsKKwlyZXR1cm4gMDsKK30KKworLyogUmV0dXJuIGFuIGVycm9yIG51bWJlciBpZiB0aGUgaW5kaWNhdGVkIGZpbHRlciBpc24ndCB3cml0YWJsZSAuLi4gKi8KK2ludCB3cml0YWJsZV9maWx0ZXIoc3RydWN0IGZpbHRlcl9lbnRyeSAqZikKK3sKKwlpZiAoZi0+bG9ja2VkKQorCQlyZXR1cm4gLUVQRVJNOworCWlmIChmLT5wZW5kaW5nKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmV0dXJuIDA7Cit9CisKKy8qIERlbGV0ZSB0aGUgZmlsdGVyIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggKGlmIHZhbGlkKS4gIFRoZSBjaGVja3MgZm9yIGFsbAorICogdGhlIGNvbW1vbiBwcm9ibGVtcyB3aXRoIGRvaW5nIHRoaXMgbGlrZSB0aGUgZmlsdGVyIGJlaW5nIGxvY2tlZCwgY3VycmVudGx5CisgKiBwZW5kaW5nIGluIGFub3RoZXIgb3BlcmF0aW9uLCBldGMuCisgKi8KK2ludCBkZWxldGVfZmlsdGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgZmlkeCkKK3sKKwlzdHJ1Y3QgZmlsdGVyX2VudHJ5ICpmOworCWludCByZXQ7CisKKwlpZiAoZmlkeCA+PSBhZGFwdGVyLT50aWRzLm5mdGlkcyArIGFkYXB0ZXItPnRpZHMubnNmdGlkcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmID0gJmFkYXB0ZXItPnRpZHMuZnRpZF90YWJbZmlkeF07CisJcmV0ID0gd3JpdGFibGVfZmlsdGVyKGYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJaWYgKGYtPnZhbGlkKQorCQlyZXR1cm4gZGVsX2ZpbHRlcl93cihhZGFwdGVyLCBmaWR4KTsKKworCXJldHVybiAwOworfQorCisvKiBDbGVhciBhIGZpbHRlciBhbmQgcmVsZWFzZSBhbnkgb2YgaXRzIHJlc291cmNlcyB0aGF0IHdlIG93bi4gIFRoaXMgYWxzbworICogY2xlYXJzIHRoZSBmaWx0ZXIncyAicGVuZGluZyIgc3RhdHVzLgorICovCit2b2lkIGNsZWFyX2ZpbHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgc3RydWN0IGZpbHRlcl9lbnRyeSAqZikKK3sKKwkvKiBJZiB0aGUgbmV3IG9yIG9sZCBmaWx0ZXIgaGF2ZSBsb29wYmFjayByZXdyaXRlaW5nIHJ1bGVzIHRoZW4gd2UnbGwKKwkgKiBuZWVkIHRvIGZyZWUgYW55IGV4aXN0aW5nIExheWVyIFR3byBUYWJsZSAoTDJUKSBlbnRyaWVzIG9mIHRoZSBvbGQKKwkgKiBmaWx0ZXIgcnVsZS4gIFRoZSBmaXJtd2FyZSB3aWxsIGhhbmRsZSBmcmVlaW5nIHVwIGFueSBTb3VyY2UgTUFDCisJICogVGFibGUgKFNNVCkgZW50cmllcyB1c2VkIGZvciByZXdyaXRpbmcgU291cmNlIE1BQyBBZGRyZXNzZXMgaW4KKwkgKiBsb29wYmFjayBydWxlcy4KKwkgKi8KKwlpZiAoZi0+bDJ0KQorCQljeGdiNF9sMnRfcmVsZWFzZShmLT5sMnQpOworCisJLyogVGhlIHplcm9pbmcgb2YgdGhlIGZpbHRlciBydWxlIGJlbG93IGNsZWFycyB0aGUgZmlsdGVyIHZhbGlkLAorCSAqIHBlbmRpbmcsIGxvY2tlZCBmbGFncywgbDJ0IHBvaW50ZXIsIGV0Yy4gc28gaXQncyBhbGwgd2UgbmVlZCBmb3IKKwkgKiB0aGlzIG9wZXJhdGlvbi4KKwkgKi8KKwltZW1zZXQoZiwgMCwgc2l6ZW9mKCpmKSk7Cit9CisKK3ZvaWQgY2xlYXJfYWxsX2ZpbHRlcnMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoYWRhcHRlci0+dGlkcy5mdGlkX3RhYikgeworCQlzdHJ1Y3QgZmlsdGVyX2VudHJ5ICpmID0gJmFkYXB0ZXItPnRpZHMuZnRpZF90YWJbMF07CisJCXVuc2lnbmVkIGludCBtYXhfZnRpZCA9IGFkYXB0ZXItPnRpZHMubmZ0aWRzICsKKwkJCQkJYWRhcHRlci0+dGlkcy5uc2Z0aWRzOworCisJCWZvciAoaSA9IDA7IGkgPCBtYXhfZnRpZDsgaSsrLCBmKyspCisJCQlpZiAoZi0+dmFsaWQgfHwgZi0+cGVuZGluZykKKwkJCQljbGVhcl9maWx0ZXIoYWRhcHRlciwgZik7CisJfQorfQorCisvKiBGaWxsIHVwIGRlZmF1bHQgbWFza3MgZm9yIHNldCBtYXRjaCBmaWVsZHMuICovCitzdGF0aWMgdm9pZCBmaWxsX2RlZmF1bHRfbWFzayhzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gKmZzKQoreworCXVuc2lnbmVkIGludCBsaXAgPSAwLCBsaXBfbWFzayA9IDA7CisJdW5zaWduZWQgaW50IGZpcCA9IDAsIGZpcF9tYXNrID0gMDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChmcy0+dmFsLmlwb3J0ICYmICFmcy0+bWFzay5pcG9ydCkKKwkJZnMtPm1hc2suaXBvcnQgfD0gfjA7CisJaWYgKGZzLT52YWwuZmNvZSAmJiAhZnMtPm1hc2suZmNvZSkKKwkJZnMtPm1hc2suZmNvZSB8PSB+MDsKKwlpZiAoZnMtPnZhbC5tYXRjaHR5cGUgJiYgIWZzLT5tYXNrLm1hdGNodHlwZSkKKwkJZnMtPm1hc2subWF0Y2h0eXBlIHw9IH4wOworCWlmIChmcy0+dmFsLm1hY2lkeCAmJiAhZnMtPm1hc2subWFjaWR4KQorCQlmcy0+bWFzay5tYWNpZHggfD0gfjA7CisJaWYgKGZzLT52YWwuZXRodHlwZSAmJiAhZnMtPm1hc2suZXRodHlwZSkKKwkJZnMtPm1hc2suZXRodHlwZSB8PSB+MDsKKwlpZiAoZnMtPnZhbC5pdmxhbiAmJiAhZnMtPm1hc2suaXZsYW4pCisJCWZzLT5tYXNrLml2bGFuIHw9IH4wOworCWlmIChmcy0+dmFsLm92bGFuICYmICFmcy0+bWFzay5vdmxhbikKKwkJZnMtPm1hc2sub3ZsYW4gfD0gfjA7CisJaWYgKGZzLT52YWwuZnJhZyAmJiAhZnMtPm1hc2suZnJhZykKKwkJZnMtPm1hc2suZnJhZyB8PSB+MDsKKwlpZiAoZnMtPnZhbC50b3MgJiYgIWZzLT5tYXNrLnRvcykKKwkJZnMtPm1hc2sudG9zIHw9IH4wOworCWlmIChmcy0+dmFsLnByb3RvICYmICFmcy0+bWFzay5wcm90bykKKwkJZnMtPm1hc2sucHJvdG8gfD0gfjA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmcy0+dmFsLmxpcCk7IGkrKykgeworCQlsaXAgfD0gZnMtPnZhbC5saXBbaV07CisJCWxpcF9tYXNrIHw9IGZzLT5tYXNrLmxpcFtpXTsKKwkJZmlwIHw9IGZzLT52YWwuZmlwW2ldOworCQlmaXBfbWFzayB8PSBmcy0+bWFzay5maXBbaV07CisJfQorCisJaWYgKGxpcCAmJiAhbGlwX21hc2spCisJCW1lbXNldChmcy0+bWFzay5saXAsIH4wLCBzaXplb2YoZnMtPm1hc2subGlwKSk7CisKKwlpZiAoZmlwICYmICFmaXBfbWFzaykKKwkJbWVtc2V0KGZzLT5tYXNrLmZpcCwgfjAsIHNpemVvZihmcy0+bWFzay5saXApKTsKKworCWlmIChmcy0+dmFsLmxwb3J0ICYmICFmcy0+bWFzay5scG9ydCkKKwkJZnMtPm1hc2subHBvcnQgPSB+MDsKKwlpZiAoZnMtPnZhbC5mcG9ydCAmJiAhZnMtPm1hc2suZnBvcnQpCisJCWZzLT5tYXNrLmZwb3J0ID0gfjA7Cit9CisKKy8qIENoZWNrIGEgQ2hlbHNpbyBGaWx0ZXIgUmVxdWVzdCBmb3IgdmFsaWRpdHksIGNvbnZlcnQgaXQgaW50byBvdXIgaW50ZXJuYWwKKyAqIGZvcm1hdCBhbmQgc2VuZCBpdCB0byB0aGUgaGFyZHdhcmUuICBSZXR1cm4gMCBvbiBzdWNjZXNzLCBhbiBlcnJvciBudW1iZXIKKyAqIG90aGVyd2lzZS4gIFdlIGF0dGFjaCBhbnkgcHJvdmlkZWQgZmlsdGVyIG9wZXJhdGlvbiBjb250ZXh0IHRvIHRoZSBpbnRlcm5hbAorICogZmlsdGVyIHNwZWNpZmljYXRpb24gaW4gb3JkZXIgdG8gZmFjaWxpdGF0ZSBzaWduYWxpbmcgY29tcGxldGlvbiBvZiB0aGUKKyAqIG9wZXJhdGlvbi4KKyAqLworaW50IF9fY3hnYjRfc2V0X2ZpbHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZmlsdGVyX2lkLAorCQkgICAgICAgc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uICpmcywKKwkJICAgICAgIHN0cnVjdCBmaWx0ZXJfY3R4ICpjdHgpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYyYWRhcChkZXYpOworCXVuc2lnbmVkIGludCBtYXhfZmlkeCwgZmlkeDsKKwlzdHJ1Y3QgZmlsdGVyX2VudHJ5ICpmOworCXUzMiBpY29uZjsKKwlpbnQgaXEsIHJldDsKKworCW1heF9maWR4ID0gYWRhcHRlci0+dGlkcy5uZnRpZHM7CisJaWYgKGZpbHRlcl9pZCAhPSAobWF4X2ZpZHggKyBhZGFwdGVyLT50aWRzLm5zZnRpZHMgLSAxKSAmJgorCSAgICBmaWx0ZXJfaWQgPj0gbWF4X2ZpZHgpCisJCXJldHVybiAtRTJCSUc7CisKKwlmaWxsX2RlZmF1bHRfbWFzayhmcyk7CisKKwlyZXQgPSB2YWxpZGF0ZV9maWx0ZXIoZGV2LCBmcyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlxID0gZ2V0X2ZpbHRlcl9zdGVlcnEoZGV2LCBmcyk7CisJaWYgKGlxIDwgMCkKKwkJcmV0dXJuIGlxOworCisJLyogSVB2NiBmaWx0ZXJzIG9jY3VweSBmb3VyIHNsb3RzIGFuZCBtdXN0IGJlIGFsaWduZWQgb24KKwkgKiBmb3VyLXNsb3QgYm91bmRhcmllcy4gIElQdjQgZmlsdGVycyBvbmx5IG9jY3VweSBhIHNpbmdsZQorCSAqIHNsb3QgYW5kIGhhdmUgbm8gYWxpZ25tZW50IHJlcXVpcmVtZW50cyBidXQgd3JpdGluZyBhIG5ldworCSAqIElQdjQgZmlsdGVyIGludG8gdGhlIG1pZGRsZSBvZiBhbiBleGlzdGluZyBJUHY2IGZpbHRlcgorCSAqIHJlcXVpcmVzIGNsZWFyaW5nIHRoZSBvbGQgSVB2NiBmaWx0ZXIgYW5kIGhlbmNlIHdlIHByZXZlbnQKKwkgKiBpbnNlcnRpb24uCisJICovCisJaWYgKGZzLT50eXBlID09IDApIHsgLyogSVB2NCAqLworCQkvKiBJZiBvdXIgSVB2NCBmaWx0ZXIgaXNuJ3QgYmVpbmcgd3JpdHRlbiB0byBhCisJCSAqIG11bHRpcGxlIG9mIGZvdXIgZmlsdGVyIGluZGV4IGFuZCB0aGVyZSdzIGFuIElQdjYKKwkJICogZmlsdGVyIGF0IHRoZSBtdWx0aXBsZSBvZiA0IGJhc2Ugc2xvdCwgdGhlbiB3ZQorCQkgKiBwcmV2ZW50IGluc2VydGlvbi4KKwkJICovCisJCWZpZHggPSBmaWx0ZXJfaWQgJiB+MHgzOworCQlpZiAoZmlkeCAhPSBmaWx0ZXJfaWQgJiYKKwkJICAgIGFkYXB0ZXItPnRpZHMuZnRpZF90YWJbZmlkeF0uZnMudHlwZSkgeworCQkJZiA9ICZhZGFwdGVyLT50aWRzLmZ0aWRfdGFiW2ZpZHhdOworCQkJaWYgKGYtPnZhbGlkKSB7CisJCQkJZGV2X2VycihhZGFwdGVyLT5wZGV2X2RldiwKKwkJCQkJIkludmFsaWQgbG9jYXRpb24uIElQdjYgcmVxdWlyZXMgNCBzbG90cyBhbmQgaXMgb2NjdXB5aW5nIHNsb3RzICV1IHRvICV1XG4iLAorCQkJCQlmaWR4LCBmaWR4ICsgMyk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKwl9IGVsc2UgeyAvKiBJUHY2ICovCisJCS8qIEVuc3VyZSB0aGF0IHRoZSBJUHY2IGZpbHRlciBpcyBhbGlnbmVkIG9uIGEKKwkJICogbXVsdGlwbGUgb2YgNCBib3VuZGFyeS4KKwkJICovCisJCWlmIChmaWx0ZXJfaWQgJiAweDMpIHsKKwkJCWRldl9lcnIoYWRhcHRlci0+cGRldl9kZXYsCisJCQkJIkludmFsaWQgbG9jYXRpb24uIElQdjYgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1zbG90IGJvdW5kYXJ5XG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyogQ2hlY2sgYWxsIGV4Y2VwdCB0aGUgYmFzZSBvdmVybGFwcGluZyBJUHY0IGZpbHRlciBzbG90cy4gKi8KKwkJZm9yIChmaWR4ID0gZmlsdGVyX2lkICsgMTsgZmlkeCA8IGZpbHRlcl9pZCArIDQ7IGZpZHgrKykgeworCQkJZiA9ICZhZGFwdGVyLT50aWRzLmZ0aWRfdGFiW2ZpZHhdOworCQkJaWYgKGYtPnZhbGlkKSB7CisJCQkJZGV2X2VycihhZGFwdGVyLT5wZGV2X2RldiwKKwkJCQkJIkludmFsaWQgbG9jYXRpb24uICBJUHY2IHJlcXVpcmVzIDQgc2xvdHMgYW5kIGFuIElQdjQgZmlsdGVyIGV4aXN0cyBhdCAldVxuIiwKKwkJCQkJZmlkeCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKwl9CisKKwkvKiBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCBwcm92aWRlZCBmaWx0ZXIgaW5kZXggaXMgbm90CisJICogYWxyZWFkeSBpbiB1c2UgYnkgc29tZW9uZSBlbHNlCisJICovCisJZiA9ICZhZGFwdGVyLT50aWRzLmZ0aWRfdGFiW2ZpbHRlcl9pZF07CisJaWYgKGYtPnZhbGlkKQorCQlyZXR1cm4gLUVCVVNZOworCisJZmlkeCA9IGZpbHRlcl9pZCArIGFkYXB0ZXItPnRpZHMuZnRpZF9iYXNlOworCXJldCA9IGN4Z2I0X3NldF9mdGlkKCZhZGFwdGVyLT50aWRzLCBmaWx0ZXJfaWQsCisJCQkgICAgIGZzLT50eXBlID8gUEZfSU5FVDYgOiBQRl9JTkVUKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBmaWx0ZXIgcmVxdWVzdGVkIGlzIHdyaXRhYmxlIC4uLiAqLworCXJldCA9IHdyaXRhYmxlX2ZpbHRlcihmKTsKKwlpZiAocmV0KSB7CisJCS8qIENsZWFyIHRoZSBiaXRzIHdlIGhhdmUgc2V0IGFib3ZlICovCisJCWN4Z2I0X2NsZWFyX2Z0aWQoJmFkYXB0ZXItPnRpZHMsIGZpbHRlcl9pZCwKKwkJCQkgZnMtPnR5cGUgPyBQRl9JTkVUNiA6IFBGX0lORVQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIENsZWFyIG91dCBhbnkgb2xkIHJlc291cmNlcyBiZWluZyB1c2VkIGJ5IHRoZSBmaWx0ZXIgYmVmb3JlCisJICogd2Ugc3RhcnQgY29uc3RydWN0aW5nIHRoZSBuZXcgZmlsdGVyLgorCSAqLworCWlmIChmLT52YWxpZCkKKwkJY2xlYXJfZmlsdGVyKGFkYXB0ZXIsIGYpOworCisJLyogQ29udmVydCB0aGUgZmlsdGVyIHNwZWNpZmljYXRpb24gaW50byBvdXIgaW50ZXJuYWwgZm9ybWF0LgorCSAqIFdlIGNvcHkgdGhlIFBGL1ZGIHNwZWNpZmljYXRpb24gaW50byB0aGUgT3V0ZXIgVkxBTiBmaWVsZAorCSAqIGhlcmUgc28gdGhlIHJlc3Qgb2YgdGhlIGNvZGUgLS0gaW5jbHVkaW5nIHRoZSBpbnRlcmZhY2UgdG8KKwkgKiB0aGUgZmlybXdhcmUgLS0gZG9lc24ndCBoYXZlIHRvIGNvbnN0YW50bHkgZG8gdGhlc2UgY2hlY2tzLgorCSAqLworCWYtPmZzID0gKmZzOworCWYtPmZzLmlxID0gaXE7CisJZi0+ZGV2ID0gZGV2OworCisJaWNvbmYgPSBhZGFwdGVyLT5wYXJhbXMudHAuaW5ncmVzc19jb25maWc7CisJaWYgKGljb25mICYgVk5JQ19GKSB7CisJCWYtPmZzLnZhbC5vdmxhbiA9IChmcy0+dmFsLnBmIDw8IDEzKSB8IGZzLT52YWwudmY7CisJCWYtPmZzLm1hc2sub3ZsYW4gPSAoZnMtPm1hc2sucGYgPDwgMTMpIHwgZnMtPm1hc2sudmY7CisJCWYtPmZzLnZhbC5vdmxhbl92bGQgPSBmcy0+dmFsLnBmdmZfdmxkOworCQlmLT5mcy5tYXNrLm92bGFuX3ZsZCA9IGZzLT5tYXNrLnBmdmZfdmxkOworCX0KKworCS8qIEF0dGVtcHQgdG8gc2V0IHRoZSBmaWx0ZXIuICBJZiB3ZSBkb24ndCBzdWNjZWVkLCB3ZSBjbGVhcgorCSAqIGl0IGFuZCByZXR1cm4gdGhlIGZhaWx1cmUuCisJICovCisJZi0+Y3R4ID0gY3R4OworCWYtPnRpZCA9IGZpZHg7IC8qIFNhdmUgdGhlIGFjdHVhbCB0aWQgKi8KKwlyZXQgPSBzZXRfZmlsdGVyX3dyKGFkYXB0ZXIsIGZpbHRlcl9pZCk7CisJaWYgKHJldCkgeworCQljeGdiNF9jbGVhcl9mdGlkKCZhZGFwdGVyLT50aWRzLCBmaWx0ZXJfaWQsCisJCQkJIGZzLT50eXBlID8gUEZfSU5FVDYgOiBQRl9JTkVUKTsKKwkJY2xlYXJfZmlsdGVyKGFkYXB0ZXIsIGYpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIENoZWNrIGEgZGVsZXRlIGZpbHRlciByZXF1ZXN0IGZvciB2YWxpZGl0eSBhbmQgc2VuZCBpdCB0byB0aGUgaGFyZHdhcmUuCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCBhbiBlcnJvciBudW1iZXIgb3RoZXJ3aXNlLiAgV2UgYXR0YWNoIGFueSBwcm92aWRlZAorICogZmlsdGVyIG9wZXJhdGlvbiBjb250ZXh0IHRvIHRoZSBpbnRlcm5hbCBmaWx0ZXIgc3BlY2lmaWNhdGlvbiBpbiBvcmRlciB0bworICogZmFjaWxpdGF0ZSBzaWduYWxpbmcgY29tcGxldGlvbiBvZiB0aGUgb3BlcmF0aW9uLgorICovCitpbnQgX19jeGdiNF9kZWxfZmlsdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBmaWx0ZXJfaWQsCisJCSAgICAgICBzdHJ1Y3QgZmlsdGVyX2N0eCAqY3R4KQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2MmFkYXAoZGV2KTsKKwlzdHJ1Y3QgZmlsdGVyX2VudHJ5ICpmOworCXVuc2lnbmVkIGludCBtYXhfZmlkeDsKKwlpbnQgcmV0OworCisJbWF4X2ZpZHggPSBhZGFwdGVyLT50aWRzLm5mdGlkczsKKwlpZiAoZmlsdGVyX2lkICE9IChtYXhfZmlkeCArIGFkYXB0ZXItPnRpZHMubnNmdGlkcyAtIDEpICYmCisJICAgIGZpbHRlcl9pZCA+PSBtYXhfZmlkeCkKKwkJcmV0dXJuIC1FMkJJRzsKKworCWYgPSAmYWRhcHRlci0+dGlkcy5mdGlkX3RhYltmaWx0ZXJfaWRdOworCXJldCA9IHdyaXRhYmxlX2ZpbHRlcihmKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGYtPnZhbGlkKSB7CisJCWYtPmN0eCA9IGN0eDsKKwkJY3hnYjRfY2xlYXJfZnRpZCgmYWRhcHRlci0+dGlkcywgZmlsdGVyX2lkLAorCQkJCSBmLT5mcy50eXBlID8gUEZfSU5FVDYgOiBQRl9JTkVUKTsKKwkJcmV0dXJuIGRlbF9maWx0ZXJfd3IoYWRhcHRlciwgZmlsdGVyX2lkKTsKKwl9CisKKwkvKiBJZiB0aGUgY2FsbGVyIGhhcyBwYXNzZWQgaW4gYSBDb21wbGV0aW9uIENvbnRleHQgdGhlbiB3ZSBuZWVkIHRvCisJICogbWFyayBpdCBhcyBhIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBzbyB0aGV5IGRvbid0IHN0YWxsIHdhaXRpbmcKKwkgKiBmb3IgaXQuCisJICovCisJaWYgKGN0eCkgeworCQljdHgtPnJlc3VsdCA9IDA7CisJCWNvbXBsZXRlKCZjdHgtPmNvbXBsZXRpb24pOworCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgY3hnYjRfc2V0X2ZpbHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZmlsdGVyX2lkLAorCQkgICAgIHN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiAqZnMpCit7CisJc3RydWN0IGZpbHRlcl9jdHggY3R4OworCWludCByZXQ7CisKKwlpbml0X2NvbXBsZXRpb24oJmN0eC5jb21wbGV0aW9uKTsKKworCXJldCA9IF9fY3hnYjRfc2V0X2ZpbHRlcihkZXYsIGZpbHRlcl9pZCwgZnMsICZjdHgpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJLyogV2FpdCBmb3IgcmVwbHkgKi8KKwlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmN0eC5jb21wbGV0aW9uLCAxMCAqIEhaKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwlyZXQgPSBjdHgucmVzdWx0Oworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK2ludCBjeGdiNF9kZWxfZmlsdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBmaWx0ZXJfaWQpCit7CisJc3RydWN0IGZpbHRlcl9jdHggY3R4OworCWludCByZXQ7CisKKwlpbml0X2NvbXBsZXRpb24oJmN0eC5jb21wbGV0aW9uKTsKKworCXJldCA9IF9fY3hnYjRfZGVsX2ZpbHRlcihkZXYsIGZpbHRlcl9pZCwgJmN0eCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwkvKiBXYWl0IGZvciByZXBseSAqLworCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY3R4LmNvbXBsZXRpb24sIDEwICogSFopOworCWlmICghcmV0KQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCXJldCA9IGN0eC5yZXN1bHQ7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogSGFuZGxlIGEgZmlsdGVyIHdyaXRlL2RlbGV0aW9uIHJlcGx5LiAqLwordm9pZCBmaWx0ZXJfcnBsKHN0cnVjdCBhZGFwdGVyICphZGFwLCBjb25zdCBzdHJ1Y3QgY3BsX3NldF90Y2JfcnBsICpycGwpCit7CisJdW5zaWduZWQgaW50IHRpZCA9IEdFVF9USUQocnBsKTsKKwlzdHJ1Y3QgZmlsdGVyX2VudHJ5ICpmID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgbWF4X2ZpZHg7CisJaW50IGlkeDsKKworCW1heF9maWR4ID0gYWRhcC0+dGlkcy5uZnRpZHMgKyBhZGFwLT50aWRzLm5zZnRpZHM7CisJLyogR2V0IHRoZSBjb3JyZXNwb25kaW5nIGZpbHRlciBlbnRyeSBmb3IgdGhpcyB0aWQgKi8KKwlpZiAoYWRhcC0+dGlkcy5mdGlkX3RhYikgeworCQkvKiBDaGVjayB0aGlzIGluIG5vcm1hbCBmaWx0ZXIgcmVnaW9uICovCisJCWlkeCA9IHRpZCAtIGFkYXAtPnRpZHMuZnRpZF9iYXNlOworCQlpZiAoaWR4ID49IG1heF9maWR4KQorCQkJcmV0dXJuOworCQlmID0gJmFkYXAtPnRpZHMuZnRpZF90YWJbaWR4XTsKKwkJaWYgKGYtPnRpZCAhPSB0aWQpCisJCQlyZXR1cm47CisJfQorCisJLyogV2UgZm91bmQgdGhlIGZpbHRlciBlbnRyeSBmb3IgdGhpcyB0aWQgKi8KKwlpZiAoZikgeworCQl1bnNpZ25lZCBpbnQgcmV0ID0gVENCX0NPT0tJRV9HKHJwbC0+Y29va2llKTsKKwkJc3RydWN0IGZpbHRlcl9jdHggKmN0eDsKKworCQkvKiBQdWxsIG9mZiBhbnkgZmlsdGVyIG9wZXJhdGlvbiBjb250ZXh0IGF0dGFjaGVkIHRvIHRoZQorCQkgKiBmaWx0ZXIuCisJCSAqLworCQljdHggPSBmLT5jdHg7CisJCWYtPmN0eCA9IE5VTEw7CisKKwkJaWYgKHJldCA9PSBGV19GSUxURVJfV1JfRkxUX0RFTEVURUQpIHsKKwkJCS8qIENsZWFyIHRoZSBmaWx0ZXIgd2hlbiB3ZSBnZXQgY29uZmlybWF0aW9uIGZyb20gdGhlCisJCQkgKiBoYXJkd2FyZSB0aGF0IHRoZSBmaWx0ZXIgaGFzIGJlZW4gZGVsZXRlZC4KKwkJCSAqLworCQkJY2xlYXJfZmlsdGVyKGFkYXAsIGYpOworCQkJaWYgKGN0eCkKKwkJCQljdHgtPnJlc3VsdCA9IDA7CisJCX0gZWxzZSBpZiAocmV0ID09IEZXX0ZJTFRFUl9XUl9TTVRfVEJMX0ZVTEwpIHsKKwkJCWRldl9lcnIoYWRhcC0+cGRldl9kZXYsICJmaWx0ZXIgJXUgc2V0dXAgZmFpbGVkIGR1ZSB0byBmdWxsIFNNVFxuIiwKKwkJCQlpZHgpOworCQkJY2xlYXJfZmlsdGVyKGFkYXAsIGYpOworCQkJaWYgKGN0eCkKKwkJCQljdHgtPnJlc3VsdCA9IC1FTk9NRU07CisJCX0gZWxzZSBpZiAocmV0ID09IEZXX0ZJTFRFUl9XUl9GTFRfQURERUQpIHsKKwkJCWYtPnNtdGlkeCA9IChiZTY0X3RvX2NwdShycGwtPm9sZHZhbCkgPj4gMjQpICYgMHhmZjsKKwkJCWYtPnBlbmRpbmcgPSAwOyAgLyogYXN5bmNocm9ub3VzIHNldHVwIGNvbXBsZXRlZCAqLworCQkJZi0+dmFsaWQgPSAxOworCQkJaWYgKGN0eCkgeworCQkJCWN0eC0+cmVzdWx0ID0gMDsKKwkJCQljdHgtPnRpZCA9IGlkeDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIFNvbWV0aGluZyB3ZW50IHdyb25nLiAgSXNzdWUgYSB3YXJuaW5nIGFib3V0IHRoZQorCQkJICogcHJvYmxlbSBhbmQgY2xlYXIgZXZlcnl0aGluZyBvdXQuCisJCQkgKi8KKwkJCWRldl9lcnIoYWRhcC0+cGRldl9kZXYsICJmaWx0ZXIgJXUgc2V0dXAgZmFpbGVkIHdpdGggZXJyb3IgJXVcbiIsCisJCQkJaWR4LCByZXQpOworCQkJY2xlYXJfZmlsdGVyKGFkYXAsIGYpOworCQkJaWYgKGN0eCkKKwkJCQljdHgtPnJlc3VsdCA9IC1FSU5WQUw7CisJCX0KKwkJaWYgKGN0eCkKKwkJCWNvbXBsZXRlKCZjdHgtPmNvbXBsZXRpb24pOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfZmlsdGVyLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X2ZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNzQyY2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X2ZpbHRlci5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQ2hlbHNpbyBUNCBFdGhlcm5ldCBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE2IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19DWEdCNF9GSUxURVJfSAorI2RlZmluZSBfX0NYR0I0X0ZJTFRFUl9ICisKKyNpbmNsdWRlICJ0NF9tc2cuaCIKKwordm9pZCBmaWx0ZXJfcnBsKHN0cnVjdCBhZGFwdGVyICphZGFwLCBjb25zdCBzdHJ1Y3QgY3BsX3NldF90Y2JfcnBsICpycGwpOwordm9pZCBjbGVhcl9maWx0ZXIoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHN0cnVjdCBmaWx0ZXJfZW50cnkgKmYpOworCitpbnQgc2V0X2ZpbHRlcl93cihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IGZpZHgpOworaW50IGRlbGV0ZV9maWx0ZXIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCBmaWR4KTsKKworaW50IHdyaXRhYmxlX2ZpbHRlcihzdHJ1Y3QgZmlsdGVyX2VudHJ5ICpmKTsKK3ZvaWQgY2xlYXJfYWxsX2ZpbHRlcnMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOworI2VuZGlmIC8qIF9fQ1hHQjRfRklMVEVSX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF9tYWluLmMKaW5kZXggYzQ1ZGU0OS4uY2YxNDdjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF9tYWluLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENoZWxzaW8gVDQgRXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNiBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTY3LDYgKzY3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcmFzaF9kdW1wLmg+CiAKICNpbmNsdWRlICJjeGdiNC5oIgorI2luY2x1ZGUgImN4Z2I0X2ZpbHRlci5oIgogI2luY2x1ZGUgInQ0X3JlZ3MuaCIKICNpbmNsdWRlICJ0NF92YWx1ZXMuaCIKICNpbmNsdWRlICJ0NF9tc2cuaCIKQEAgLTc2LDYgKzc3LDggQEAKICNpbmNsdWRlICJjeGdiNF9kZWJ1Z2ZzLmgiCiAjaW5jbHVkZSAiY2xpcF90YmwuaCIKICNpbmNsdWRlICJsMnQuaCIKKyNpbmNsdWRlICJzY2hlZC5oIgorI2luY2x1ZGUgImN4Z2I0X3RjX3UzMi5oIgogCiBjaGFyIGN4Z2I0X2RyaXZlcl9uYW1lW10gPSBLQlVJTERfTU9ETkFNRTsKIApAQCAtODYsMzAgKzg5LDYgQEAKIGNvbnN0IGNoYXIgY3hnYjRfZHJpdmVyX3ZlcnNpb25bXSA9IERSVl9WRVJTSU9OOwogI2RlZmluZSBEUlZfREVTQyAiQ2hlbHNpbyBUNC9UNS9UNiBOZXR3b3JrIERyaXZlciIKIAotLyogSG9zdCBzaGFkb3cgY29weSBvZiBpbmdyZXNzIGZpbHRlciBlbnRyeS4gIFRoaXMgaXMgaW4gaG9zdCBuYXRpdmUgZm9ybWF0Ci0gKiBhbmQgZG9lc24ndCBtYXRjaCB0aGUgb3JkZXJpbmcgb3IgYml0IG9yZGVyLCBldGMuIG9mIHRoZSBoYXJkd2FyZSBvZiB0aGUKLSAqIGZpcm13YXJlIGNvbW1hbmQuICBUaGUgdXNlIG9mIGJpdC1maWVsZCBzdHJ1Y3R1cmUgZWxlbWVudHMgaXMgcHVyZWx5IHRvCi0gKiByZW1pbmQgb3Vyc2VsdmVzIG9mIHRoZSBmaWVsZCBzaXplIGxpbWl0YXRpb25zIGFuZCBzYXZlIG1lbW9yeSBpbiB0aGUgY2FzZQotICogd2hlcmUgdGhlIGZpbHRlciB0YWJsZSBpcyBsYXJnZS4KLSAqLwotc3RydWN0IGZpbHRlcl9lbnRyeSB7Ci0JLyogQWRtaW5pc3RyYXRpdmUgZmllbGRzIGZvciBmaWx0ZXIuCi0JICovCi0JdTMyIHZhbGlkOjE7ICAgICAgICAgICAgLyogZmlsdGVyIGFsbG9jYXRlZCBhbmQgdmFsaWQgKi8KLQl1MzIgbG9ja2VkOjE7ICAgICAgICAgICAvKiBmaWx0ZXIgaXMgYWRtaW5pc3RyYXRpdmVseSBsb2NrZWQgKi8KLQotCXUzMiBwZW5kaW5nOjE7ICAgICAgICAgIC8qIGZpbHRlciBhY3Rpb24gaXMgcGVuZGluZyBmaXJtd2FyZSByZXBseSAqLwotCXUzMiBzbXRpZHg6ODsgICAgICAgICAgIC8qIFNvdXJjZSBNQUMgVGFibGUgaW5kZXggZm9yIHNtYWMgKi8KLQlzdHJ1Y3QgbDJ0X2VudHJ5ICpsMnQ7ICAvKiBMYXllciBUd28gVGFibGUgZW50cnkgZm9yIGRtYWMgKi8KLQotCS8qIFRoZSBmaWx0ZXIgaXRzZWxmLiAgTW9zdCBvZiB0aGlzIGlzIGEgc3RyYWlnaHQgY29weSBvZiBpbmZvcm1hdGlvbgotCSAqIHByb3ZpZGVkIGJ5IHRoZSBleHRlbmRlZCBpb2N0bCgpLiAgU29tZSBmaWVsZHMgYXJlIHRyYW5zbGF0ZWQgdG8KLQkgKiBpbnRlcm5hbCBmb3JtcyAtLSBmb3IgaW5zdGFuY2UgdGhlIEluZ3Jlc3MgUXVldWUgSUQgcGFzc2VkIGluIGZyb20KLQkgKiB0aGUgaW9jdGwoKSBpcyB0cmFuc2xhdGVkIGludG8gdGhlIEFic29sdXRlIEluZ3Jlc3MgUXVldWUgSUQuCi0JICovCi0Jc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uIGZzOwotfTsKLQogI2RlZmluZSBERkxUX01TR19FTkFCTEUgKE5FVElGX01TR19EUlYgfCBORVRJRl9NU0dfUFJPQkUgfCBORVRJRl9NU0dfTElOSyB8IFwKIAkJCSBORVRJRl9NU0dfVElNRVIgfCBORVRJRl9NU0dfSUZET1dOIHwgTkVUSUZfTVNHX0lGVVAgfFwKIAkJCSBORVRJRl9NU0dfUlhfRVJSIHwgTkVUSUZfTVNHX1RYX0VSUikKQEAgLTIyMywxMyArMjAyLDggQEAKIAogc3RhdGljIHN0cnVjdCBkZW50cnkgKmN4Z2I0X2RlYnVnZnNfcm9vdDsKIAotc3RhdGljIExJU1RfSEVBRChhZGFwdGVyX2xpc3QpOwotc3RhdGljIERFRklORV9NVVRFWCh1bGRfbXV0ZXgpOwotLyogQWRhcHRlciBsaXN0IHRvIGJlIGFjY2Vzc2VkIGZyb20gYXRvbWljIGNvbnRleHQgKi8KLXN0YXRpYyBMSVNUX0hFQUQoYWRhcF9yY3VfbGlzdCk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGFkYXBfcmN1X2xvY2spOwotc3RhdGljIHN0cnVjdCBjeGdiNF91bGRfaW5mbyB1bGRzW0NYR0I0X1VMRF9NQVhdOwotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHVsZF9zdHJbXSA9IHsgIlJETUEiLCAiaVNDU0kiLCAiaVNDU0lUIiB9OworTElTVF9IRUFEKGFkYXB0ZXJfbGlzdCk7CitERUZJTkVfTVVURVgodWxkX211dGV4KTsKIAogc3RhdGljIHZvaWQgbGlua19yZXBvcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKQEAgLTMwMywxMSArMjc3LDkgQEAKIAkJCXR4cS0+ZGNiX3ByaW8gPSB2YWx1ZTsKIAl9CiB9Ci0jZW5kaWYgLyogQ09ORklHX0NIRUxTSU9fVDRfRENCICovCiAKLWludCBjeGdiNF9kY2JfZW5hYmxlZChjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIGludCBjeGdiNF9kY2JfZW5hYmxlZChjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotI2lmZGVmIENPTkZJR19DSEVMU0lPX1Q0X0RDQgogCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCWlmICghcGktPmRjYi5lbmFibGVkKQpAQCAtMzE1LDExICsyODcsOCBAQAogCiAJcmV0dXJuICgocGktPmRjYi5zdGF0ZSA9PSBDWEdCNF9EQ0JfU1RBVEVfRldfQUxMU1lOQ0VEKSB8fAogCQkocGktPmRjYi5zdGF0ZSA9PSBDWEdCNF9EQ0JfU1RBVEVfSE9TVCkpOwotI2Vsc2UKLQlyZXR1cm4gMDsKLSNlbmRpZgogfQotRVhQT1JUX1NZTUJPTChjeGdiNF9kY2JfZW5hYmxlZCk7CisjZW5kaWYgLyogQ09ORklHX0NIRUxTSU9fVDRfRENCICovCiAKIHZvaWQgdDRfb3NfbGlua19jaGFuZ2VkKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgcG9ydF9pZCwgaW50IGxpbmtfc3RhdCkKIHsKQEAgLTUzMSw2NiArNTAwLDYgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfQ0hFTFNJT19UNF9EQ0IgKi8KIAotLyogQ2xlYXIgYSBmaWx0ZXIgYW5kIHJlbGVhc2UgYW55IG9mIGl0cyByZXNvdXJjZXMgdGhhdCB3ZSBvd24uICBUaGlzIGFsc28KLSAqIGNsZWFycyB0aGUgZmlsdGVyJ3MgInBlbmRpbmciIHN0YXR1cy4KLSAqLwotc3RhdGljIHZvaWQgY2xlYXJfZmlsdGVyKHN0cnVjdCBhZGFwdGVyICphZGFwLCBzdHJ1Y3QgZmlsdGVyX2VudHJ5ICpmKQotewotCS8qIElmIHRoZSBuZXcgb3Igb2xkIGZpbHRlciBoYXZlIGxvb3BiYWNrIHJld3JpdGVpbmcgcnVsZXMgdGhlbiB3ZSdsbAotCSAqIG5lZWQgdG8gZnJlZSBhbnkgZXhpc3RpbmcgTGF5ZXIgVHdvIFRhYmxlIChMMlQpIGVudHJpZXMgb2YgdGhlIG9sZAotCSAqIGZpbHRlciBydWxlLiAgVGhlIGZpcm13YXJlIHdpbGwgaGFuZGxlIGZyZWVpbmcgdXAgYW55IFNvdXJjZSBNQUMKLQkgKiBUYWJsZSAoU01UKSBlbnRyaWVzIHVzZWQgZm9yIHJld3JpdGluZyBTb3VyY2UgTUFDIEFkZHJlc3NlcyBpbgotCSAqIGxvb3BiYWNrIHJ1bGVzLgotCSAqLwotCWlmIChmLT5sMnQpCi0JCWN4Z2I0X2wydF9yZWxlYXNlKGYtPmwydCk7Ci0KLQkvKiBUaGUgemVyb2luZyBvZiB0aGUgZmlsdGVyIHJ1bGUgYmVsb3cgY2xlYXJzIHRoZSBmaWx0ZXIgdmFsaWQsCi0JICogcGVuZGluZywgbG9ja2VkIGZsYWdzLCBsMnQgcG9pbnRlciwgZXRjLiBzbyBpdCdzIGFsbCB3ZSBuZWVkIGZvcgotCSAqIHRoaXMgb3BlcmF0aW9uLgotCSAqLwotCW1lbXNldChmLCAwLCBzaXplb2YoKmYpKTsKLX0KLQotLyogSGFuZGxlIGEgZmlsdGVyIHdyaXRlL2RlbGV0aW9uIHJlcGx5LgotICovCi1zdGF0aWMgdm9pZCBmaWx0ZXJfcnBsKHN0cnVjdCBhZGFwdGVyICphZGFwLCBjb25zdCBzdHJ1Y3QgY3BsX3NldF90Y2JfcnBsICpycGwpCi17Ci0JdW5zaWduZWQgaW50IGlkeCA9IEdFVF9USUQocnBsKTsKLQl1bnNpZ25lZCBpbnQgbmlkeCA9IGlkeCAtIGFkYXAtPnRpZHMuZnRpZF9iYXNlOwotCXVuc2lnbmVkIGludCByZXQ7Ci0Jc3RydWN0IGZpbHRlcl9lbnRyeSAqZjsKLQotCWlmIChpZHggPj0gYWRhcC0+dGlkcy5mdGlkX2Jhc2UgJiYgbmlkeCA8Ci0JICAgKGFkYXAtPnRpZHMubmZ0aWRzICsgYWRhcC0+dGlkcy5uc2Z0aWRzKSkgewotCQlpZHggPSBuaWR4OwotCQlyZXQgPSBUQ0JfQ09PS0lFX0cocnBsLT5jb29raWUpOwotCQlmID0gJmFkYXAtPnRpZHMuZnRpZF90YWJbaWR4XTsKLQotCQlpZiAocmV0ID09IEZXX0ZJTFRFUl9XUl9GTFRfREVMRVRFRCkgewotCQkJLyogQ2xlYXIgdGhlIGZpbHRlciB3aGVuIHdlIGdldCBjb25maXJtYXRpb24gZnJvbSB0aGUKLQkJCSAqIGhhcmR3YXJlIHRoYXQgdGhlIGZpbHRlciBoYXMgYmVlbiBkZWxldGVkLgotCQkJICovCi0JCQljbGVhcl9maWx0ZXIoYWRhcCwgZik7Ci0JCX0gZWxzZSBpZiAocmV0ID09IEZXX0ZJTFRFUl9XUl9TTVRfVEJMX0ZVTEwpIHsKLQkJCWRldl9lcnIoYWRhcC0+cGRldl9kZXYsICJmaWx0ZXIgJXUgc2V0dXAgZmFpbGVkIGR1ZSB0byBmdWxsIFNNVFxuIiwKLQkJCQlpZHgpOwotCQkJY2xlYXJfZmlsdGVyKGFkYXAsIGYpOwotCQl9IGVsc2UgaWYgKHJldCA9PSBGV19GSUxURVJfV1JfRkxUX0FEREVEKSB7Ci0JCQlmLT5zbXRpZHggPSAoYmU2NF90b19jcHUocnBsLT5vbGR2YWwpID4+IDI0KSAmIDB4ZmY7Ci0JCQlmLT5wZW5kaW5nID0gMDsgIC8qIGFzeW5jaHJvbm91cyBzZXR1cCBjb21wbGV0ZWQgKi8KLQkJCWYtPnZhbGlkID0gMTsKLQkJfSBlbHNlIHsKLQkJCS8qIFNvbWV0aGluZyB3ZW50IHdyb25nLiAgSXNzdWUgYSB3YXJuaW5nIGFib3V0IHRoZQotCQkJICogcHJvYmxlbSBhbmQgY2xlYXIgZXZlcnl0aGluZyBvdXQuCi0JCQkgKi8KLQkJCWRldl9lcnIoYWRhcC0+cGRldl9kZXYsICJmaWx0ZXIgJXUgc2V0dXAgZmFpbGVkIHdpdGggZXJyb3IgJXVcbiIsCi0JCQkJaWR4LCByZXQpOwotCQkJY2xlYXJfZmlsdGVyKGFkYXAsIGYpOwotCQl9Ci0JfQotfQotCiAvKiBSZXNwb25zZSBxdWV1ZSBoYW5kbGVyIGZvciB0aGUgRlcgZXZlbnQgcXVldWUuCiAgKi8KIHN0YXRpYyBpbnQgZndldnRxX2hhbmRsZXIoc3RydWN0IHNnZV9yc3BxICpxLCBjb25zdCBfX2JlNjQgKnJzcCwKQEAgLTY3Nyw1NiArNTg2LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogRmx1c2ggdGhlIGFnZ3JlZ2F0ZWQgbHJvIHNlc3Npb25zICovCi1zdGF0aWMgdm9pZCB1bGRyeF9mbHVzaF9oYW5kbGVyKHN0cnVjdCBzZ2VfcnNwcSAqcSkKLXsKLQlpZiAodWxkc1txLT51bGRdLmxyb19mbHVzaCkKLQkJdWxkc1txLT51bGRdLmxyb19mbHVzaCgmcS0+bHJvX21ncik7Ci19Ci0KLS8qKgotICoJdWxkcnhfaGFuZGxlciAtIHJlc3BvbnNlIHF1ZXVlIGhhbmRsZXIgZm9yIFVMRCBxdWV1ZXMKLSAqCUBxOiB0aGUgcmVzcG9uc2UgcXVldWUgdGhhdCByZWNlaXZlZCB0aGUgcGFja2V0Ci0gKglAcnNwOiB0aGUgcmVzcG9uc2UgcXVldWUgZGVzY3JpcHRvciBob2xkaW5nIHRoZSBvZmZsb2FkIG1lc3NhZ2UKLSAqCUBnbDogdGhlIGdhdGhlciBsaXN0IG9mIHBhY2tldCBmcmFnbWVudHMKLSAqCi0gKglEZWxpdmVyIGFuIGluZ3Jlc3Mgb2ZmbG9hZCBwYWNrZXQgdG8gYSBVTEQuICBBbGwgcHJvY2Vzc2luZyBpcyBkb25lIGJ5Ci0gKgl0aGUgVUxELCB3ZSBqdXN0IG1haW50YWluIHN0YXRpc3RpY3MuCi0gKi8KLXN0YXRpYyBpbnQgdWxkcnhfaGFuZGxlcihzdHJ1Y3Qgc2dlX3JzcHEgKnEsIGNvbnN0IF9fYmU2NCAqcnNwLAotCQkJIGNvbnN0IHN0cnVjdCBwa3RfZ2wgKmdsKQotewotCXN0cnVjdCBzZ2Vfb2ZsZF9yeHEgKnJ4cSA9IGNvbnRhaW5lcl9vZihxLCBzdHJ1Y3Qgc2dlX29mbGRfcnhxLCByc3BxKTsKLQlpbnQgcmV0OwotCi0JLyogRlcgY2FuIHNlbmQgQ1BMcyBlbmNhcHN1bGF0ZWQgaW4gYSBDUExfRlc0X01TRy4KLQkgKi8KLQlpZiAoKChjb25zdCBzdHJ1Y3QgcnNzX2hlYWRlciAqKXJzcCktPm9wY29kZSA9PSBDUExfRlc0X01TRyAmJgotCSAgICAoKGNvbnN0IHN0cnVjdCBjcGxfZnc0X21zZyAqKShyc3AgKyAxKSktPnR5cGUgPT0gRldfVFlQRV9SU1NDUEwpCi0JCXJzcCArPSAyOwotCi0JaWYgKHEtPmZsdXNoX2hhbmRsZXIpCi0JCXJldCA9IHVsZHNbcS0+dWxkXS5scm9fcnhfaGFuZGxlcihxLT5hZGFwLT51bGRfaGFuZGxlW3EtPnVsZF0sCi0JCQkJCQkgIHJzcCwgZ2wsICZxLT5scm9fbWdyLAotCQkJCQkJICAmcS0+bmFwaSk7Ci0JZWxzZQotCQlyZXQgPSB1bGRzW3EtPnVsZF0ucnhfaGFuZGxlcihxLT5hZGFwLT51bGRfaGFuZGxlW3EtPnVsZF0sCi0JCQkJCSAgICAgIHJzcCwgZ2wpOwotCi0JaWYgKHJldCkgewotCQlyeHEtPnN0YXRzLm5vbWVtKys7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoZ2wgPT0gTlVMTCkKLQkJcnhxLT5zdGF0cy5pbW0rKzsKLQllbHNlIGlmIChnbCA9PSBDWEdCNF9NU0dfQU4pCi0JCXJ4cS0+c3RhdHMuYW4rKzsKLQllbHNlCi0JCXJ4cS0+c3RhdHMucGt0cysrOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCBkaXNhYmxlX21zaShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKIHsKIAlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBVU0lOR19NU0lYKSB7CkBAIC03NzgsMzAgKzYzNywxMiBAQAogCQkJc25wcmludGYoYWRhcC0+bXNpeF9pbmZvW21zaV9pZHhdLmRlc2MsIG4sICIlcy1SeCVkIiwKIAkJCQkgZC0+bmFtZSwgaSk7CiAJfQotCi0JLyogb2ZmbG9hZCBxdWV1ZXMgKi8KLQlmb3JfZWFjaF9pc2NzaXJ4cSgmYWRhcC0+c2dlLCBpKQotCQlzbnByaW50ZihhZGFwLT5tc2l4X2luZm9bbXNpX2lkeCsrXS5kZXNjLCBuLCAiJXMtaXNjc2klZCIsCi0JCQkgYWRhcC0+cG9ydFswXS0+bmFtZSwgaSk7Ci0KLQlmb3JfZWFjaF9pc2NzaXRyeHEoJmFkYXAtPnNnZSwgaSkKLQkJc25wcmludGYoYWRhcC0+bXNpeF9pbmZvW21zaV9pZHgrK10uZGVzYywgbiwgIiVzLWlTQ1NJVCVkIiwKLQkJCSBhZGFwLT5wb3J0WzBdLT5uYW1lLCBpKTsKLQotCWZvcl9lYWNoX3JkbWFyeHEoJmFkYXAtPnNnZSwgaSkKLQkJc25wcmludGYoYWRhcC0+bXNpeF9pbmZvW21zaV9pZHgrK10uZGVzYywgbiwgIiVzLXJkbWElZCIsCi0JCQkgYWRhcC0+cG9ydFswXS0+bmFtZSwgaSk7Ci0KLQlmb3JfZWFjaF9yZG1hY2lxKCZhZGFwLT5zZ2UsIGkpCi0JCXNucHJpbnRmKGFkYXAtPm1zaXhfaW5mb1ttc2lfaWR4KytdLmRlc2MsIG4sICIlcy1yZG1hLWNpcSVkIiwKLQkJCSBhZGFwLT5wb3J0WzBdLT5uYW1lLCBpKTsKIH0KIAogc3RhdGljIGludCByZXF1ZXN0X21zaXhfcXVldWVfaXJxcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKIHsKIAlzdHJ1Y3Qgc2dlICpzID0gJmFkYXAtPnNnZTsKLQlpbnQgZXJyLCBldGhxaWR4LCBpc2NzaXFpZHggPSAwLCByZG1hcWlkeCA9IDAsIHJkbWFjaXFxaWR4ID0gMDsKLQlpbnQgaXNjc2l0cWlkeCA9IDA7CisJaW50IGVyciwgZXRocWlkeDsKIAlpbnQgbXNpX2luZGV4ID0gMjsKIAogCWVyciA9IHJlcXVlc3RfaXJxKGFkYXAtPm1zaXhfaW5mb1sxXS52ZWMsIHQ0X3NnZV9pbnRyX21zaXgsIDAsCkBAIC04MTgsNTcgKzY1OSw5IEBACiAJCQlnb3RvIHVud2luZDsKIAkJbXNpX2luZGV4Kys7CiAJfQotCWZvcl9lYWNoX2lzY3NpcnhxKHMsIGlzY3NpcWlkeCkgewotCQllcnIgPSByZXF1ZXN0X2lycShhZGFwLT5tc2l4X2luZm9bbXNpX2luZGV4XS52ZWMsCi0JCQkJICB0NF9zZ2VfaW50cl9tc2l4LCAwLAotCQkJCSAgYWRhcC0+bXNpeF9pbmZvW21zaV9pbmRleF0uZGVzYywKLQkJCQkgICZzLT5pc2NzaXJ4cVtpc2NzaXFpZHhdLnJzcHEpOwotCQlpZiAoZXJyKQotCQkJZ290byB1bndpbmQ7Ci0JCW1zaV9pbmRleCsrOwotCX0KLQlmb3JfZWFjaF9pc2NzaXRyeHEocywgaXNjc2l0cWlkeCkgewotCQllcnIgPSByZXF1ZXN0X2lycShhZGFwLT5tc2l4X2luZm9bbXNpX2luZGV4XS52ZWMsCi0JCQkJICB0NF9zZ2VfaW50cl9tc2l4LCAwLAotCQkJCSAgYWRhcC0+bXNpeF9pbmZvW21zaV9pbmRleF0uZGVzYywKLQkJCQkgICZzLT5pc2NzaXRyeHFbaXNjc2l0cWlkeF0ucnNwcSk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIHVud2luZDsKLQkJbXNpX2luZGV4Kys7Ci0JfQotCWZvcl9lYWNoX3JkbWFyeHEocywgcmRtYXFpZHgpIHsKLQkJZXJyID0gcmVxdWVzdF9pcnEoYWRhcC0+bXNpeF9pbmZvW21zaV9pbmRleF0udmVjLAotCQkJCSAgdDRfc2dlX2ludHJfbXNpeCwgMCwKLQkJCQkgIGFkYXAtPm1zaXhfaW5mb1ttc2lfaW5kZXhdLmRlc2MsCi0JCQkJICAmcy0+cmRtYXJ4cVtyZG1hcWlkeF0ucnNwcSk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIHVud2luZDsKLQkJbXNpX2luZGV4Kys7Ci0JfQotCWZvcl9lYWNoX3JkbWFjaXEocywgcmRtYWNpcXFpZHgpIHsKLQkJZXJyID0gcmVxdWVzdF9pcnEoYWRhcC0+bXNpeF9pbmZvW21zaV9pbmRleF0udmVjLAotCQkJCSAgdDRfc2dlX2ludHJfbXNpeCwgMCwKLQkJCQkgIGFkYXAtPm1zaXhfaW5mb1ttc2lfaW5kZXhdLmRlc2MsCi0JCQkJICAmcy0+cmRtYWNpcVtyZG1hY2lxcWlkeF0ucnNwcSk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIHVud2luZDsKLQkJbXNpX2luZGV4Kys7Ci0JfQogCXJldHVybiAwOwogCiB1bndpbmQ6Ci0Jd2hpbGUgKC0tcmRtYWNpcXFpZHggPj0gMCkKLQkJZnJlZV9pcnEoYWRhcC0+bXNpeF9pbmZvWy0tbXNpX2luZGV4XS52ZWMsCi0JCQkgJnMtPnJkbWFjaXFbcmRtYWNpcXFpZHhdLnJzcHEpOwotCXdoaWxlICgtLXJkbWFxaWR4ID49IDApCi0JCWZyZWVfaXJxKGFkYXAtPm1zaXhfaW5mb1stLW1zaV9pbmRleF0udmVjLAotCQkJICZzLT5yZG1hcnhxW3JkbWFxaWR4XS5yc3BxKTsKLQl3aGlsZSAoLS1pc2NzaXRxaWR4ID49IDApCi0JCWZyZWVfaXJxKGFkYXAtPm1zaXhfaW5mb1stLW1zaV9pbmRleF0udmVjLAotCQkJICZzLT5pc2NzaXRyeHFbaXNjc2l0cWlkeF0ucnNwcSk7Ci0Jd2hpbGUgKC0taXNjc2lxaWR4ID49IDApCi0JCWZyZWVfaXJxKGFkYXAtPm1zaXhfaW5mb1stLW1zaV9pbmRleF0udmVjLAotCQkJICZzLT5pc2NzaXJ4cVtpc2NzaXFpZHhdLnJzcHEpOwogCXdoaWxlICgtLWV0aHFpZHggPj0gMCkKIAkJZnJlZV9pcnEoYWRhcC0+bXNpeF9pbmZvWy0tbXNpX2luZGV4XS52ZWMsCiAJCQkgJnMtPmV0aHJ4cVtldGhxaWR4XS5yc3BxKTsKQEAgLTg4NCwxNiArNjc3LDYgQEAKIAlmcmVlX2lycShhZGFwLT5tc2l4X2luZm9bMV0udmVjLCAmcy0+ZndfZXZ0cSk7CiAJZm9yX2VhY2hfZXRocnhxKHMsIGkpCiAJCWZyZWVfaXJxKGFkYXAtPm1zaXhfaW5mb1ttc2lfaW5kZXgrK10udmVjLCAmcy0+ZXRocnhxW2ldLnJzcHEpOwotCWZvcl9lYWNoX2lzY3NpcnhxKHMsIGkpCi0JCWZyZWVfaXJxKGFkYXAtPm1zaXhfaW5mb1ttc2lfaW5kZXgrK10udmVjLAotCQkJICZzLT5pc2NzaXJ4cVtpXS5yc3BxKTsKLQlmb3JfZWFjaF9pc2NzaXRyeHEocywgaSkKLQkJZnJlZV9pcnEoYWRhcC0+bXNpeF9pbmZvW21zaV9pbmRleCsrXS52ZWMsCi0JCQkgJnMtPmlzY3NpdHJ4cVtpXS5yc3BxKTsKLQlmb3JfZWFjaF9yZG1hcnhxKHMsIGkpCi0JCWZyZWVfaXJxKGFkYXAtPm1zaXhfaW5mb1ttc2lfaW5kZXgrK10udmVjLCAmcy0+cmRtYXJ4cVtpXS5yc3BxKTsKLQlmb3JfZWFjaF9yZG1hY2lxKHMsIGkpCi0JCWZyZWVfaXJxKGFkYXAtPm1zaXhfaW5mb1ttc2lfaW5kZXgrK10udmVjLCAmcy0+cmRtYWNpcVtpXS5yc3BxKTsKIH0KIAogLyoqCkBAIC0xMDMyLDI4ICs4MTUsMzAgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgYWxsb2Nfb2ZsZF9yeHFzKHN0cnVjdCBhZGFwdGVyICphZGFwLCBzdHJ1Y3Qgc2dlX29mbGRfcnhxICpxLAotCQkJICAgdW5zaWduZWQgaW50IG5xLCB1bnNpZ25lZCBpbnQgcGVyX2NoYW4sIGludCBtc2lfaWR4LAotCQkJICAgdTE2ICppZHMsIGJvb2wgbHJvKQotewotCWludCBpLCBlcnI7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnE7IGkrKywgcSsrKSB7Ci0JCWlmIChtc2lfaWR4ID4gMCkKLQkJCW1zaV9pZHgrKzsKLQkJZXJyID0gdDRfc2dlX2FsbG9jX3J4cShhZGFwLCAmcS0+cnNwcSwgZmFsc2UsCi0JCQkJICAgICAgIGFkYXAtPnBvcnRbaSAvIHBlcl9jaGFuXSwKLQkJCQkgICAgICAgbXNpX2lkeCwgcS0+Zmwuc2l6ZSA/ICZxLT5mbCA6IE5VTEwsCi0JCQkJICAgICAgIHVsZHJ4X2hhbmRsZXIsCi0JCQkJICAgICAgIGxybyA/IHVsZHJ4X2ZsdXNoX2hhbmRsZXIgOiBOVUxMLAotCQkJCSAgICAgICAwKTsKK3N0YXRpYyBpbnQgc2V0dXBfZndfc2dlX3F1ZXVlcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3Qgc2dlICpzID0gJmFkYXAtPnNnZTsKKwlpbnQgZXJyID0gMDsKKworCWJpdG1hcF96ZXJvKHMtPnN0YXJ2aW5nX2ZsLCBzLT5lZ3Jfc3opOworCWJpdG1hcF96ZXJvKHMtPnR4cV9tYXBlcnIsIHMtPmVncl9zeik7CisKKwlpZiAoYWRhcC0+ZmxhZ3MgJiBVU0lOR19NU0lYKQorCQlhZGFwLT5tc2lfaWR4ID0gMTsgICAgICAgICAvKiB2ZWN0b3IgMCBpcyBmb3Igbm9uLXF1ZXVlIGludGVycnVwdHMgKi8KKwllbHNlIHsKKwkJZXJyID0gdDRfc2dlX2FsbG9jX3J4cShhZGFwLCAmcy0+aW50cnEsIGZhbHNlLCBhZGFwLT5wb3J0WzBdLCAwLAorCQkJCSAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCAtMSk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwotCQltZW1zZXQoJnEtPnN0YXRzLCAwLCBzaXplb2YocS0+c3RhdHMpKTsKLQkJaWYgKGlkcykKLQkJCWlkc1tpXSA9IHEtPnJzcHEuYWJzX2lkOworCQlhZGFwLT5tc2lfaWR4ID0gLSgoaW50KXMtPmludHJxLmFic19pZCArIDEpOwogCX0KLQlyZXR1cm4gMDsKKworCWVyciA9IHQ0X3NnZV9hbGxvY19yeHEoYWRhcCwgJnMtPmZ3X2V2dHEsIHRydWUsIGFkYXAtPnBvcnRbMF0sCisJCQkgICAgICAgYWRhcC0+bXNpX2lkeCwgTlVMTCwgZndldnRxX2hhbmRsZXIsIE5VTEwsIC0xKTsKKwlpZiAoZXJyKQorCQl0NF9mcmVlX3NnZV9yZXNvdXJjZXMoYWRhcCk7CisJcmV0dXJuIGVycjsKIH0KIAogLyoqCkBAIC0xMDY2LDQxICs4NTEsMTAgQEAKICAqLwogc3RhdGljIGludCBzZXR1cF9zZ2VfcXVldWVzKHN0cnVjdCBhZGFwdGVyICphZGFwKQogewotCWludCBlcnIsIG1zaV9pZHgsIGksIGo7CisJaW50IGVyciwgaSwgajsKIAlzdHJ1Y3Qgc2dlICpzID0gJmFkYXAtPnNnZTsKLQotCWJpdG1hcF96ZXJvKHMtPnN0YXJ2aW5nX2ZsLCBzLT5lZ3Jfc3opOwotCWJpdG1hcF96ZXJvKHMtPnR4cV9tYXBlcnIsIHMtPmVncl9zeik7Ci0KLQlpZiAoYWRhcC0+ZmxhZ3MgJiBVU0lOR19NU0lYKQotCQltc2lfaWR4ID0gMTsgICAgICAgICAvKiB2ZWN0b3IgMCBpcyBmb3Igbm9uLXF1ZXVlIGludGVycnVwdHMgKi8KLQllbHNlIHsKLQkJZXJyID0gdDRfc2dlX2FsbG9jX3J4cShhZGFwLCAmcy0+aW50cnEsIGZhbHNlLCBhZGFwLT5wb3J0WzBdLCAwLAotCQkJCSAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCAtMSk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCQltc2lfaWR4ID0gLSgoaW50KXMtPmludHJxLmFic19pZCArIDEpOwotCX0KLQotCS8qIE5PVEU6IElmIHlvdSBhZGQvZGVsZXRlIGFueSBJbmdyZXNzL0VncmVzcyBRdWV1ZSBhbGxvY2F0aW9ucyBpbiBoZXJlLAotCSAqIGRvbid0IGZvcmdldCB0byB1cGRhdGUgdGhlIGZvbGxvd2luZyB3aGljaCBuZWVkIHRvIGJlCi0JICogc3luY2hyb25pemVkIHRvIGFuZCBjaGFuZ2VzIGhlcmUuCi0JICoKLQkgKiAxLiBUaGUgY2FsY3VsYXRpb25zIG9mIE1BWF9JTkdRIGluIGN4Z2I0LmguCi0JICoKLQkgKiAyLiBVcGRhdGUgZW5hYmxlX21zaXgvbmFtZV9tc2l4X3ZlY3MvcmVxdWVzdF9tc2l4X3F1ZXVlX2lycXMKLQkgKiAgICB0byBhY2NvbW1vZGF0ZSBhbnkgbmV3L2RlbGV0ZWQgSW5ncmVzcyBRdWV1ZXMKLQkgKiAgICB3aGljaCBuZWVkIE1TSS1YIFZlY3RvcnMuCi0JICoKLQkgKiAzLiBVcGRhdGUgc2dlX3FpbmZvX3Nob3coKSB0byBpbmNsdWRlIGluZm9ybWF0aW9uIG9uIHRoZQotCSAqICAgIG5ldy9kZWxldGVkIHF1ZXVlcy4KLQkgKi8KLQllcnIgPSB0NF9zZ2VfYWxsb2NfcnhxKGFkYXAsICZzLT5md19ldnRxLCB0cnVlLCBhZGFwLT5wb3J0WzBdLAotCQkJICAgICAgIG1zaV9pZHgsIE5VTEwsIGZ3ZXZ0cV9oYW5kbGVyLCBOVUxMLCAtMSk7Ci0JaWYgKGVycikgewotZnJlZW91dDoJdDRfZnJlZV9zZ2VfcmVzb3VyY2VzKGFkYXApOwotCQlyZXR1cm4gZXJyOwotCX0KKwlzdHJ1Y3Qgc2dlX3VsZF9yeHFfaW5mbyAqcnhxX2luZm8gPSBzLT51bGRfcnhxX2luZm9bQ1hHQjRfVUxEX1JETUFdOworCXVuc2lnbmVkIGludCBjbXBscWlkID0gMDsKIAogCWZvcl9lYWNoX3BvcnQoYWRhcCwgaSkgewogCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWRhcC0+cG9ydFtpXTsKQEAgLTExMDksMTAgKzg2MywxMCBAQAogCQlzdHJ1Y3Qgc2dlX2V0aF90eHEgKnQgPSAmcy0+ZXRodHhxW3BpLT5maXJzdF9xc2V0XTsKIAogCQlmb3IgKGogPSAwOyBqIDwgcGktPm5xc2V0czsgaisrLCBxKyspIHsKLQkJCWlmIChtc2lfaWR4ID4gMCkKLQkJCQltc2lfaWR4Kys7CisJCQlpZiAoYWRhcC0+bXNpX2lkeCA+IDApCisJCQkJYWRhcC0+bXNpX2lkeCsrOwogCQkJZXJyID0gdDRfc2dlX2FsbG9jX3J4cShhZGFwLCAmcS0+cnNwcSwgZmFsc2UsIGRldiwKLQkJCQkJICAgICAgIG1zaV9pZHgsICZxLT5mbCwKKwkJCQkJICAgICAgIGFkYXAtPm1zaV9pZHgsICZxLT5mbCwKIAkJCQkJICAgICAgIHQ0X2V0aHJ4X2hhbmRsZXIsCiAJCQkJCSAgICAgICBOVUxMLAogCQkJCQkgICAgICAgdDRfZ2V0X21wc19iZ19tYXAoYWRhcCwKQEAgLTExMzEsOCArODg1LDggQEAKIAkJfQogCX0KIAotCWogPSBzLT5pc2NzaXFzZXRzIC8gYWRhcC0+cGFyYW1zLm5wb3J0czsgLyogaXNjc2kgcXVldWVzIHBlciBjaGFubmVsICovCi0JZm9yX2VhY2hfaXNjc2lyeHEocywgaSkgeworCWogPSBzLT5vZmxkcXNldHMgLyBhZGFwLT5wYXJhbXMubnBvcnRzOyAvKiBpc2NzaSBxdWV1ZXMgcGVyIGNoYW5uZWwgKi8KKwlmb3JfZWFjaF9vZmxkdHhxKHMsIGkpIHsKIAkJZXJyID0gdDRfc2dlX2FsbG9jX29mbGRfdHhxKGFkYXAsICZzLT5vZmxkdHhxW2ldLAogCQkJCQkgICAgYWRhcC0+cG9ydFtpIC8gal0sCiAJCQkJCSAgICBzLT5md19ldnRxLmNudHh0X2lkKTsKQEAgLTExNDAsMzAgKzg5NCwxNSBAQAogCQkJZ290byBmcmVlb3V0OwogCX0KIAotI2RlZmluZSBBTExPQ19PRkxEX1JYUVMoZmlyc3RxLCBucSwgcGVyX2NoYW4sIGlkcywgbHJvKSBkbyB7IFwKLQllcnIgPSBhbGxvY19vZmxkX3J4cXMoYWRhcCwgZmlyc3RxLCBucSwgcGVyX2NoYW4sIG1zaV9pZHgsIGlkcywgbHJvKTsgXAotCWlmIChlcnIpIFwKLQkJZ290byBmcmVlb3V0OyBcCi0JaWYgKG1zaV9pZHggPiAwKSBcCi0JCW1zaV9pZHggKz0gbnE7IFwKLX0gd2hpbGUgKDApCi0KLQlBTExPQ19PRkxEX1JYUVMocy0+aXNjc2lyeHEsIHMtPmlzY3NpcXNldHMsIGosIHMtPmlzY3NpX3J4cSwgZmFsc2UpOwotCUFMTE9DX09GTERfUlhRUyhzLT5pc2NzaXRyeHEsIHMtPm5pc2NzaXRxLCBqLCBzLT5pc2NzaXRfcnhxLCB0cnVlKTsKLQlBTExPQ19PRkxEX1JYUVMocy0+cmRtYXJ4cSwgcy0+cmRtYXFzLCAxLCBzLT5yZG1hX3J4cSwgZmFsc2UpOwotCWogPSBzLT5yZG1hY2lxcyAvIGFkYXAtPnBhcmFtcy5ucG9ydHM7IC8qIHJkbWFxIHF1ZXVlcyBwZXIgY2hhbm5lbCAqLwotCUFMTE9DX09GTERfUlhRUyhzLT5yZG1hY2lxLCBzLT5yZG1hY2lxcywgaiwgcy0+cmRtYV9jaXEsIGZhbHNlKTsKLQotI3VuZGVmIEFMTE9DX09GTERfUlhRUwotCiAJZm9yX2VhY2hfcG9ydChhZGFwLCBpKSB7Ci0JCS8qCi0JCSAqIE5vdGUgdGhhdCAtPnJkbWFyeHFbaV0ucnNwcS5jbnR4dF9pZCBiZWxvdyBpcyAwIGlmIHdlIGRvbid0CisJCS8qIE5vdGUgdGhhdCBjbXBscWlkIGJlbG93IGlzIDAgaWYgd2UgZG9uJ3QKIAkJICogaGF2ZSBSRE1BIHF1ZXVlcywgYW5kIHRoYXQncyB0aGUgcmlnaHQgdmFsdWUuCiAJCSAqLworCQlpZiAocnhxX2luZm8pCisJCQljbXBscWlkCT0gcnhxX2luZm8tPnVsZHJ4cVtpXS5yc3BxLmNudHh0X2lkOworCiAJCWVyciA9IHQ0X3NnZV9hbGxvY19jdHJsX3R4cShhZGFwLCAmcy0+Y3RybHFbaV0sIGFkYXAtPnBvcnRbaV0sCi0JCQkJCSAgICBzLT5md19ldnRxLmNudHh0X2lkLAotCQkJCQkgICAgcy0+cmRtYXJ4cVtpXS5yc3BxLmNudHh0X2lkKTsKKwkJCQkJICAgIHMtPmZ3X2V2dHEuY250eHRfaWQsIGNtcGxxaWQpOwogCQlpZiAoZXJyKQogCQkJZ290byBmcmVlb3V0OwogCX0KQEAgLTExNzQsNiArOTEzLDkgQEAKIAkJICAgICBSU1NDT05UUk9MX1YobmV0ZGV2MnBpbmZvKGFkYXAtPnBvcnRbMF0pLT50eF9jaGFuKSB8CiAJCSAgICAgUVVFVUVOVU1CRVJfVihzLT5ldGhyeHFbMF0ucnNwcS5hYnNfaWQpKTsKIAlyZXR1cm4gMDsKK2ZyZWVvdXQ6CisJdDRfZnJlZV9zZ2VfcmVzb3VyY2VzKGFkYXApOworCXJldHVybiBlcnI7CiB9CiAKIC8qCkBAIC0xMTk3LDE1MSArOTM5LDYgQEAKIAlrdmZyZWUoYWRkcik7CiB9CiAKLS8qIFNlbmQgYSBXb3JrIFJlcXVlc3QgdG8gd3JpdGUgdGhlIGZpbHRlciBhdCBhIHNwZWNpZmllZCBpbmRleC4gIFdlIGNvbnN0cnVjdAotICogYSBGaXJtd2FyZSBGaWx0ZXIgV29yayBSZXF1ZXN0IHRvIGhhdmUgdGhlIHdvcmsgZG9uZSBhbmQgcHV0IHRoZSBpbmRpY2F0ZWQKLSAqIGZpbHRlciBpbnRvICJwZW5kaW5nIiBtb2RlIHdoaWNoIHdpbGwgcHJldmVudCBhbnkgZnVydGhlciBhY3Rpb25zIGFnYWluc3QKLSAqIGl0IHRpbGwgd2UgZ2V0IGEgcmVwbHkgZnJvbSB0aGUgZmlybXdhcmUgb24gdGhlIGNvbXBsZXRpb24gc3RhdHVzIG9mIHRoZQotICogcmVxdWVzdC4KLSAqLwotc3RhdGljIGludCBzZXRfZmlsdGVyX3dyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgZmlkeCkKLXsKLQlzdHJ1Y3QgZmlsdGVyX2VudHJ5ICpmID0gJmFkYXB0ZXItPnRpZHMuZnRpZF90YWJbZmlkeF07Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgZndfZmlsdGVyX3dyICpmd3I7Ci0JdW5zaWduZWQgaW50IGZ0aWQ7Ci0KLQlza2IgPSBhbGxvY19za2Ioc2l6ZW9mKCpmd3IpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNrYikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkvKiBJZiB0aGUgbmV3IGZpbHRlciByZXF1aXJlcyBsb29wYmFjayBEZXN0aW5hdGlvbiBNQUMgYW5kL29yIFZMQU4KLQkgKiByZXdyaXRpbmcgdGhlbiB3ZSBuZWVkIHRvIGFsbG9jYXRlIGEgTGF5ZXIgMiBUYWJsZSAoTDJUKSBlbnRyeSBmb3IKLQkgKiB0aGUgZmlsdGVyLgotCSAqLwotCWlmIChmLT5mcy5uZXdkbWFjIHx8IGYtPmZzLm5ld3ZsYW4pIHsKLQkJLyogYWxsb2NhdGUgTDJUIGVudHJ5IGZvciBuZXcgZmlsdGVyICovCi0JCWYtPmwydCA9IHQ0X2wydF9hbGxvY19zd2l0Y2hpbmcoYWRhcHRlciwgZi0+ZnMudmxhbiwKLQkJCQkJCWYtPmZzLmVwb3J0LCBmLT5mcy5kbWFjKTsKLQkJaWYgKGYtPmwydCA9PSBOVUxMKSB7Ci0JCQlrZnJlZV9za2Ioc2tiKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JfQotCi0JZnRpZCA9IGFkYXB0ZXItPnRpZHMuZnRpZF9iYXNlICsgZmlkeDsKLQotCWZ3ciA9IChzdHJ1Y3QgZndfZmlsdGVyX3dyICopX19za2JfcHV0KHNrYiwgc2l6ZW9mKCpmd3IpKTsKLQltZW1zZXQoZndyLCAwLCBzaXplb2YoKmZ3cikpOwotCi0JLyogSXQgd291bGQgYmUgbmljZSB0byBwdXQgbW9zdCBvZiB0aGUgZm9sbG93aW5nIGluIHQ0X2h3LmMgYnV0IG1vc3QKLQkgKiBvZiB0aGUgd29yayBpcyB0cmFuc2xhdGluZyB0aGUgY3hnYnRvb2wgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24KLQkgKiBpbnRvIHRoZSBXb3JrIFJlcXVlc3QgYW5kIHRoZSBkZWZpbml0aW9uIG9mIHRoYXQgc3RydWN0dXJlIGlzCi0JICogY3VycmVudGx5IGluIGN4Z2J0b29sLmggd2hpY2ggaXNuJ3QgYXBwcm9wcmlhdGUgdG8gcHVsbCBpbnRvIHRoZQotCSAqIGNvbW1vbiBjb2RlLiAgV2UgbWF5IGV2ZW50dWFsbHkgdHJ5IHRvIGNvbWUgdXAgd2l0aCBhIG1vcmUgbmV1dHJhbAotCSAqIGZpbHRlciBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSBidXQgZm9yIG5vdyBpdCdzIGVhc2llc3QgdG8gc2ltcGx5Ci0JICogcHV0IHRoaXMgZmFpcmx5IGRpcmVjdCBjb2RlIGluIGxpbmUgLi4uCi0JICovCi0JZndyLT5vcF9wa2QgPSBodG9ubChGV19XUl9PUF9WKEZXX0ZJTFRFUl9XUikpOwotCWZ3ci0+bGVuMTZfcGtkID0gaHRvbmwoRldfV1JfTEVOMTZfVihzaXplb2YoKmZ3cikvMTYpKTsKLQlmd3ItPnRpZF90b19pcSA9Ci0JCWh0b25sKEZXX0ZJTFRFUl9XUl9USURfVihmdGlkKSB8Ci0JCSAgICAgIEZXX0ZJTFRFUl9XUl9SUVRZUEVfVihmLT5mcy50eXBlKSB8Ci0JCSAgICAgIEZXX0ZJTFRFUl9XUl9OT1JFUExZX1YoMCkgfAotCQkgICAgICBGV19GSUxURVJfV1JfSVFfVihmLT5mcy5pcSkpOwotCWZ3ci0+ZGVsX2ZpbHRlcl90b19sMnRpeCA9Ci0JCWh0b25sKEZXX0ZJTFRFUl9XUl9SUFRUSURfVihmLT5mcy5ycHR0aWQpIHwKLQkJICAgICAgRldfRklMVEVSX1dSX0RST1BfVihmLT5mcy5hY3Rpb24gPT0gRklMVEVSX0RST1ApIHwKLQkJICAgICAgRldfRklMVEVSX1dSX0RJUlNURUVSX1YoZi0+ZnMuZGlyc3RlZXIpIHwKLQkJICAgICAgRldfRklMVEVSX1dSX01BU0tIQVNIX1YoZi0+ZnMubWFza2hhc2gpIHwKLQkJICAgICAgRldfRklMVEVSX1dSX0RJUlNURUVSSEFTSF9WKGYtPmZzLmRpcnN0ZWVyaGFzaCkgfAotCQkgICAgICBGV19GSUxURVJfV1JfTFBCS19WKGYtPmZzLmFjdGlvbiA9PSBGSUxURVJfU1dJVENIKSB8Ci0JCSAgICAgIEZXX0ZJTFRFUl9XUl9ETUFDX1YoZi0+ZnMubmV3ZG1hYykgfAotCQkgICAgICBGV19GSUxURVJfV1JfU01BQ19WKGYtPmZzLm5ld3NtYWMpIHwKLQkJICAgICAgRldfRklMVEVSX1dSX0lOU1ZMQU5fVihmLT5mcy5uZXd2bGFuID09IFZMQU5fSU5TRVJUIHx8Ci0JCQkJCSAgICAgZi0+ZnMubmV3dmxhbiA9PSBWTEFOX1JFV1JJVEUpIHwKLQkJICAgICAgRldfRklMVEVSX1dSX1JNVkxBTl9WKGYtPmZzLm5ld3ZsYW4gPT0gVkxBTl9SRU1PVkUgfHwKLQkJCQkJICAgIGYtPmZzLm5ld3ZsYW4gPT0gVkxBTl9SRVdSSVRFKSB8Ci0JCSAgICAgIEZXX0ZJTFRFUl9XUl9ISVRDTlRTX1YoZi0+ZnMuaGl0Y250cykgfAotCQkgICAgICBGV19GSUxURVJfV1JfVFhDSEFOX1YoZi0+ZnMuZXBvcnQpIHwKLQkJICAgICAgRldfRklMVEVSX1dSX1BSSU9fVihmLT5mcy5wcmlvKSB8Ci0JCSAgICAgIEZXX0ZJTFRFUl9XUl9MMlRJWF9WKGYtPmwydCA/IGYtPmwydC0+aWR4IDogMCkpOwotCWZ3ci0+ZXRodHlwZSA9IGh0b25zKGYtPmZzLnZhbC5ldGh0eXBlKTsKLQlmd3ItPmV0aHR5cGVtID0gaHRvbnMoZi0+ZnMubWFzay5ldGh0eXBlKTsKLQlmd3ItPmZyYWdfdG9fb3ZsYW5fdmxkbSA9Ci0JCShGV19GSUxURVJfV1JfRlJBR19WKGYtPmZzLnZhbC5mcmFnKSB8Ci0JCSBGV19GSUxURVJfV1JfRlJBR01fVihmLT5mcy5tYXNrLmZyYWcpIHwKLQkJIEZXX0ZJTFRFUl9XUl9JVkxBTl9WTERfVihmLT5mcy52YWwuaXZsYW5fdmxkKSB8Ci0JCSBGV19GSUxURVJfV1JfT1ZMQU5fVkxEX1YoZi0+ZnMudmFsLm92bGFuX3ZsZCkgfAotCQkgRldfRklMVEVSX1dSX0lWTEFOX1ZMRE1fVihmLT5mcy5tYXNrLml2bGFuX3ZsZCkgfAotCQkgRldfRklMVEVSX1dSX09WTEFOX1ZMRE1fVihmLT5mcy5tYXNrLm92bGFuX3ZsZCkpOwotCWZ3ci0+c21hY19zZWwgPSAwOwotCWZ3ci0+cnhfY2hhbl9yeF9ycGxfaXEgPQotCQlodG9ucyhGV19GSUxURVJfV1JfUlhfQ0hBTl9WKDApIHwKLQkJICAgICAgRldfRklMVEVSX1dSX1JYX1JQTF9JUV9WKGFkYXB0ZXItPnNnZS5md19ldnRxLmFic19pZCkpOwotCWZ3ci0+bWFjaV90b19tYXRjaHR5cGVtID0KLQkJaHRvbmwoRldfRklMVEVSX1dSX01BQ0lfVihmLT5mcy52YWwubWFjaWR4KSB8Ci0JCSAgICAgIEZXX0ZJTFRFUl9XUl9NQUNJTV9WKGYtPmZzLm1hc2subWFjaWR4KSB8Ci0JCSAgICAgIEZXX0ZJTFRFUl9XUl9GQ09FX1YoZi0+ZnMudmFsLmZjb2UpIHwKLQkJICAgICAgRldfRklMVEVSX1dSX0ZDT0VNX1YoZi0+ZnMubWFzay5mY29lKSB8Ci0JCSAgICAgIEZXX0ZJTFRFUl9XUl9QT1JUX1YoZi0+ZnMudmFsLmlwb3J0KSB8Ci0JCSAgICAgIEZXX0ZJTFRFUl9XUl9QT1JUTV9WKGYtPmZzLm1hc2suaXBvcnQpIHwKLQkJICAgICAgRldfRklMVEVSX1dSX01BVENIVFlQRV9WKGYtPmZzLnZhbC5tYXRjaHR5cGUpIHwKLQkJICAgICAgRldfRklMVEVSX1dSX01BVENIVFlQRU1fVihmLT5mcy5tYXNrLm1hdGNodHlwZSkpOwotCWZ3ci0+cHRjbCA9IGYtPmZzLnZhbC5wcm90bzsKLQlmd3ItPnB0Y2xtID0gZi0+ZnMubWFzay5wcm90bzsKLQlmd3ItPnR0eXAgPSBmLT5mcy52YWwudG9zOwotCWZ3ci0+dHR5cG0gPSBmLT5mcy5tYXNrLnRvczsKLQlmd3ItPml2bGFuID0gaHRvbnMoZi0+ZnMudmFsLml2bGFuKTsKLQlmd3ItPml2bGFubSA9IGh0b25zKGYtPmZzLm1hc2suaXZsYW4pOwotCWZ3ci0+b3ZsYW4gPSBodG9ucyhmLT5mcy52YWwub3ZsYW4pOwotCWZ3ci0+b3ZsYW5tID0gaHRvbnMoZi0+ZnMubWFzay5vdmxhbik7Ci0JbWVtY3B5KGZ3ci0+bGlwLCBmLT5mcy52YWwubGlwLCBzaXplb2YoZndyLT5saXApKTsKLQltZW1jcHkoZndyLT5saXBtLCBmLT5mcy5tYXNrLmxpcCwgc2l6ZW9mKGZ3ci0+bGlwbSkpOwotCW1lbWNweShmd3ItPmZpcCwgZi0+ZnMudmFsLmZpcCwgc2l6ZW9mKGZ3ci0+ZmlwKSk7Ci0JbWVtY3B5KGZ3ci0+ZmlwbSwgZi0+ZnMubWFzay5maXAsIHNpemVvZihmd3ItPmZpcG0pKTsKLQlmd3ItPmxwID0gaHRvbnMoZi0+ZnMudmFsLmxwb3J0KTsKLQlmd3ItPmxwbSA9IGh0b25zKGYtPmZzLm1hc2subHBvcnQpOwotCWZ3ci0+ZnAgPSBodG9ucyhmLT5mcy52YWwuZnBvcnQpOwotCWZ3ci0+ZnBtID0gaHRvbnMoZi0+ZnMubWFzay5mcG9ydCk7Ci0JaWYgKGYtPmZzLm5ld3NtYWMpCi0JCW1lbWNweShmd3ItPnNtYSwgZi0+ZnMuc21hYywgc2l6ZW9mKGZ3ci0+c21hKSk7Ci0KLQkvKiBNYXJrIHRoZSBmaWx0ZXIgYXMgInBlbmRpbmciIGFuZCBzaGlwIG9mZiB0aGUgRmlsdGVyIFdvcmsgUmVxdWVzdC4KLQkgKiBXaGVuIHdlIGdldCB0aGUgV29yayBSZXF1ZXN0IFJlcGx5IHdlJ2xsIGNsZWFyIHRoZSBwZW5kaW5nIHN0YXR1cy4KLQkgKi8KLQlmLT5wZW5kaW5nID0gMTsKLQlzZXRfd3JfdHhxKHNrYiwgQ1BMX1BSSU9SSVRZX0NPTlRST0wsIGYtPmZzLnZhbC5pcG9ydCAmIDB4Myk7Ci0JdDRfb2ZsZF9zZW5kKGFkYXB0ZXIsIHNrYik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIERlbGV0ZSB0aGUgZmlsdGVyIGF0IGEgc3BlY2lmaWVkIGluZGV4LgotICovCi1zdGF0aWMgaW50IGRlbF9maWx0ZXJfd3Ioc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBmaWR4KQotewotCXN0cnVjdCBmaWx0ZXJfZW50cnkgKmYgPSAmYWRhcHRlci0+dGlkcy5mdGlkX3RhYltmaWR4XTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBmd19maWx0ZXJfd3IgKmZ3cjsKLQl1bnNpZ25lZCBpbnQgbGVuLCBmdGlkOwotCi0JbGVuID0gc2l6ZW9mKCpmd3IpOwotCWZ0aWQgPSBhZGFwdGVyLT50aWRzLmZ0aWRfYmFzZSArIGZpZHg7Ci0KLQlza2IgPSBhbGxvY19za2IobGVuLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNrYikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlmd3IgPSAoc3RydWN0IGZ3X2ZpbHRlcl93ciAqKV9fc2tiX3B1dChza2IsIGxlbik7Ci0JdDRfbWtfZmlsdGRlbHdyKGZ0aWQsIGZ3ciwgYWRhcHRlci0+c2dlLmZ3X2V2dHEuYWJzX2lkKTsKLQotCS8qIE1hcmsgdGhlIGZpbHRlciBhcyAicGVuZGluZyIgYW5kIHNoaXAgb2ZmIHRoZSBGaWx0ZXIgV29yayBSZXF1ZXN0LgotCSAqIFdoZW4gd2UgZ2V0IHRoZSBXb3JrIFJlcXVlc3QgUmVwbHkgd2UnbGwgY2xlYXIgdGhlIHBlbmRpbmcgc3RhdHVzLgotCSAqLwotCWYtPnBlbmRpbmcgPSAxOwotCXQ0X21nbXRfdHgoYWRhcHRlciwgc2tiKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHUxNiBjeGdiX3NlbGVjdF9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICB2b2lkICphY2NlbF9wcml2LCBzZWxlY3RfcXVldWVfZmFsbGJhY2tfdCBmYWxsYmFjaykKIHsKQEAgLTE3MjMsMTkgKzEzMjAsMjIgQEAKICAqLwogc3RhdGljIGludCB0aWRfaW5pdChzdHJ1Y3QgdGlkX2luZm8gKnQpCiB7Ci0Jc2l6ZV90IHNpemU7Ci0JdW5zaWduZWQgaW50IHN0aWRfYm1hcF9zaXplOwotCXVuc2lnbmVkIGludCBuYXRpZHMgPSB0LT5uYXRpZHM7CiAJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBjb250YWluZXJfb2YodCwgc3RydWN0IGFkYXB0ZXIsIHRpZHMpOworCXVuc2lnbmVkIGludCBtYXhfZnRpZHMgPSB0LT5uZnRpZHMgKyB0LT5uc2Z0aWRzOworCXVuc2lnbmVkIGludCBuYXRpZHMgPSB0LT5uYXRpZHM7CisJdW5zaWduZWQgaW50IHN0aWRfYm1hcF9zaXplOworCXVuc2lnbmVkIGludCBmdGlkX2JtYXBfc2l6ZTsKKwlzaXplX3Qgc2l6ZTsKIAogCXN0aWRfYm1hcF9zaXplID0gQklUU19UT19MT05HUyh0LT5uc3RpZHMgKyB0LT5uc2Z0aWRzKTsKKwlmdGlkX2JtYXBfc2l6ZSA9IEJJVFNfVE9fTE9OR1ModC0+bmZ0aWRzKTsKIAlzaXplID0gdC0+bnRpZHMgKiBzaXplb2YoKnQtPnRpZF90YWIpICsKIAkgICAgICAgbmF0aWRzICogc2l6ZW9mKCp0LT5hdGlkX3RhYikgKwogCSAgICAgICB0LT5uc3RpZHMgKiBzaXplb2YoKnQtPnN0aWRfdGFiKSArCiAJICAgICAgIHQtPm5zZnRpZHMgKiBzaXplb2YoKnQtPnN0aWRfdGFiKSArCiAJICAgICAgIHN0aWRfYm1hcF9zaXplICogc2l6ZW9mKGxvbmcpICsKLQkgICAgICAgdC0+bmZ0aWRzICogc2l6ZW9mKCp0LT5mdGlkX3RhYikgKwotCSAgICAgICB0LT5uc2Z0aWRzICogc2l6ZW9mKCp0LT5mdGlkX3RhYik7CisJICAgICAgIG1heF9mdGlkcyAqIHNpemVvZigqdC0+ZnRpZF90YWIpICsKKwkgICAgICAgZnRpZF9ibWFwX3NpemUgKiBzaXplb2YobG9uZyk7CiAKIAl0LT50aWRfdGFiID0gdDRfYWxsb2NfbWVtKHNpemUpOwogCWlmICghdC0+dGlkX3RhYikKQEAgLTE3NDUsOCArMTM0NSwxMCBAQAogCXQtPnN0aWRfdGFiID0gKHN0cnVjdCBzZXJ2X2VudHJ5ICopJnQtPmF0aWRfdGFiW25hdGlkc107CiAJdC0+c3RpZF9ibWFwID0gKHVuc2lnbmVkIGxvbmcgKikmdC0+c3RpZF90YWJbdC0+bnN0aWRzICsgdC0+bnNmdGlkc107CiAJdC0+ZnRpZF90YWIgPSAoc3RydWN0IGZpbHRlcl9lbnRyeSAqKSZ0LT5zdGlkX2JtYXBbc3RpZF9ibWFwX3NpemVdOworCXQtPmZ0aWRfYm1hcCA9ICh1bnNpZ25lZCBsb25nICopJnQtPmZ0aWRfdGFiW21heF9mdGlkc107CiAJc3Bpbl9sb2NrX2luaXQoJnQtPnN0aWRfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnQtPmF0aWRfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnQtPmZ0aWRfbG9jayk7CiAKIAl0LT5zdGlkc19pbl91c2UgPSAwOwogCXQtPnNmdGlkc19pbl91c2UgPSAwOwpAQCAtMTc2MSwxMiArMTM2MywxNiBAQAogCQkJdC0+YXRpZF90YWJbbmF0aWRzIC0gMV0ubmV4dCA9ICZ0LT5hdGlkX3RhYltuYXRpZHNdOwogCQl0LT5hZnJlZSA9IHQtPmF0aWRfdGFiOwogCX0KLQliaXRtYXBfemVybyh0LT5zdGlkX2JtYXAsIHQtPm5zdGlkcyArIHQtPm5zZnRpZHMpOwotCS8qIFJlc2VydmUgc3RpZCAwIGZvciBUNC9UNSBhZGFwdGVycyAqLwotCWlmICghdC0+c3RpZF9iYXNlICYmCi0JICAgIChDSEVMU0lPX0NISVBfVkVSU0lPTihhZGFwLT5wYXJhbXMuY2hpcCkgPD0gQ0hFTFNJT19UNSkpCi0JCV9fc2V0X2JpdCgwLCB0LT5zdGlkX2JtYXApOwogCisJaWYgKGlzX29mZmxvYWQoYWRhcCkpIHsKKwkJYml0bWFwX3plcm8odC0+c3RpZF9ibWFwLCB0LT5uc3RpZHMgKyB0LT5uc2Z0aWRzKTsKKwkJLyogUmVzZXJ2ZSBzdGlkIDAgZm9yIFQ0L1Q1IGFkYXB0ZXJzICovCisJCWlmICghdC0+c3RpZF9iYXNlICYmCisJCSAgICBDSEVMU0lPX0NISVBfVkVSU0lPTihhZGFwLT5wYXJhbXMuY2hpcCkgPD0gQ0hFTFNJT19UNSkKKwkJCV9fc2V0X2JpdCgwLCB0LT5zdGlkX2JtYXApOworCX0KKworCWJpdG1hcF96ZXJvKHQtPmZ0aWRfYm1hcCwgdC0+bmZ0aWRzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjMxNiw3ICsxOTIyLDcgQEAKIAogCWZvcl9lYWNoX2V0aHJ4cSgmYWRhcC0+c2dlLCBpKQogCQlkaXNhYmxlX3R4cV9kYigmYWRhcC0+c2dlLmV0aHR4cVtpXS5xKTsKLQlmb3JfZWFjaF9pc2NzaXJ4cSgmYWRhcC0+c2dlLCBpKQorCWZvcl9lYWNoX29mbGR0eHEoJmFkYXAtPnNnZSwgaSkKIAkJZGlzYWJsZV90eHFfZGIoJmFkYXAtPnNnZS5vZmxkdHhxW2ldLnEpOwogCWZvcl9lYWNoX3BvcnQoYWRhcCwgaSkKIAkJZGlzYWJsZV90eHFfZGIoJmFkYXAtPnNnZS5jdHJscVtpXS5xKTsKQEAgLTIzMjgsNyArMTkzNCw3IEBACiAKIAlmb3JfZWFjaF9ldGhyeHEoJmFkYXAtPnNnZSwgaSkKIAkJZW5hYmxlX3R4cV9kYihhZGFwLCAmYWRhcC0+c2dlLmV0aHR4cVtpXS5xKTsKLQlmb3JfZWFjaF9pc2NzaXJ4cSgmYWRhcC0+c2dlLCBpKQorCWZvcl9lYWNoX29mbGR0eHEoJmFkYXAtPnNnZSwgaSkKIAkJZW5hYmxlX3R4cV9kYihhZGFwLCAmYWRhcC0+c2dlLm9mbGR0eHFbaV0ucSk7CiAJZm9yX2VhY2hfcG9ydChhZGFwLCBpKQogCQllbmFibGVfdHhxX2RiKGFkYXAsICZhZGFwLT5zZ2UuY3RybHFbaV0ucSk7CkBAIC0yMzM2LDkgKzE5NDIsMTAgQEAKIAogc3RhdGljIHZvaWQgbm90aWZ5X3JkbWFfdWxkKHN0cnVjdCBhZGFwdGVyICphZGFwLCBlbnVtIGN4Z2I0X2NvbnRyb2wgY21kKQogewotCWlmIChhZGFwLT51bGRfaGFuZGxlW0NYR0I0X1VMRF9SRE1BXSkKLQkJdWxkc1tDWEdCNF9VTERfUkRNQV0uY29udHJvbChhZGFwLT51bGRfaGFuZGxlW0NYR0I0X1VMRF9SRE1BXSwKLQkJCQljbWQpOworCWVudW0gY3hnYjRfdWxkIHR5cGUgPSBDWEdCNF9VTERfUkRNQTsKKworCWlmIChhZGFwLT51bGQgJiYgYWRhcC0+dWxkW3R5cGVdLmhhbmRsZSkKKwkJYWRhcC0+dWxkW3R5cGVdLmNvbnRyb2woYWRhcC0+dWxkW3R5cGVdLmhhbmRsZSwgY21kKTsKIH0KIAogc3RhdGljIHZvaWQgcHJvY2Vzc19kYl9mdWxsKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKQEAgLTIzOTIsMTMgKzE5OTksMTQgQEAKIAlpZiAocmV0KQogCQlDSF9XQVJOKGFkYXAsICJEQiBkcm9wIHJlY292ZXJ5IGZhaWxlZC5cbiIpOwogfQorCiBzdGF0aWMgdm9pZCByZWNvdmVyX2FsbF9xdWV1ZXMoc3RydWN0IGFkYXB0ZXIgKmFkYXApCiB7CiAJaW50IGk7CiAKIAlmb3JfZWFjaF9ldGhyeHEoJmFkYXAtPnNnZSwgaSkKIAkJc3luY190eHFfcGlkeChhZGFwLCAmYWRhcC0+c2dlLmV0aHR4cVtpXS5xKTsKLQlmb3JfZWFjaF9pc2NzaXJ4cSgmYWRhcC0+c2dlLCBpKQorCWZvcl9lYWNoX29mbGR0eHEoJmFkYXAtPnNnZSwgaSkKIAkJc3luY190eHFfcGlkeChhZGFwLCAmYWRhcC0+c2dlLm9mbGR0eHFbaV0ucSk7CiAJZm9yX2VhY2hfcG9ydChhZGFwLCBpKQogCQlzeW5jX3R4cV9waWR4KGFkYXAsICZhZGFwLT5zZ2UuY3RybHFbaV0ucSk7CkBAIC0yNDYzLDk0ICsyMDcxLDEyIEBACiAJcXVldWVfd29yayhhZGFwLT53b3JrcSwgJmFkYXAtPmRiX2Ryb3BfdGFzayk7CiB9CiAKLXN0YXRpYyB2b2lkIHVsZF9hdHRhY2goc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCB1bGQpCit2b2lkIHQ0X3JlZ2lzdGVyX25ldGV2ZW50X25vdGlmaWVyKHZvaWQpCiB7Ci0Jdm9pZCAqaGFuZGxlOwotCXN0cnVjdCBjeGdiNF9sbGRfaW5mbyBsbGk7Ci0JdW5zaWduZWQgc2hvcnQgaTsKLQotCWxsaS5wZGV2ID0gYWRhcC0+cGRldjsKLQlsbGkucGYgPSBhZGFwLT5wZjsKLQlsbGkubDJ0ID0gYWRhcC0+bDJ0OwotCWxsaS50aWRzID0gJmFkYXAtPnRpZHM7Ci0JbGxpLnBvcnRzID0gYWRhcC0+cG9ydDsKLQlsbGkudnIgPSAmYWRhcC0+dnJlczsKLQlsbGkubXR1cyA9IGFkYXAtPnBhcmFtcy5tdHVzOwotCWlmICh1bGQgPT0gQ1hHQjRfVUxEX1JETUEpIHsKLQkJbGxpLnJ4cV9pZHMgPSBhZGFwLT5zZ2UucmRtYV9yeHE7Ci0JCWxsaS5jaXFfaWRzID0gYWRhcC0+c2dlLnJkbWFfY2lxOwotCQlsbGkubnJ4cSA9IGFkYXAtPnNnZS5yZG1hcXM7Ci0JCWxsaS5uY2lxID0gYWRhcC0+c2dlLnJkbWFjaXFzOwotCX0gZWxzZSBpZiAodWxkID09IENYR0I0X1VMRF9JU0NTSSkgewotCQlsbGkucnhxX2lkcyA9IGFkYXAtPnNnZS5pc2NzaV9yeHE7Ci0JCWxsaS5ucnhxID0gYWRhcC0+c2dlLmlzY3NpcXNldHM7Ci0JfSBlbHNlIGlmICh1bGQgPT0gQ1hHQjRfVUxEX0lTQ1NJVCkgewotCQlsbGkucnhxX2lkcyA9IGFkYXAtPnNnZS5pc2NzaXRfcnhxOwotCQlsbGkubnJ4cSA9IGFkYXAtPnNnZS5uaXNjc2l0cTsKLQl9Ci0JbGxpLm50eHEgPSBhZGFwLT5zZ2UuaXNjc2lxc2V0czsKLQlsbGkubmNoYW4gPSBhZGFwLT5wYXJhbXMubnBvcnRzOwotCWxsaS5ucG9ydHMgPSBhZGFwLT5wYXJhbXMubnBvcnRzOwotCWxsaS53cl9jcmVkID0gYWRhcC0+cGFyYW1zLm9mbGRxX3dyX2NyZWQ7Ci0JbGxpLmFkYXB0ZXJfdHlwZSA9IGFkYXAtPnBhcmFtcy5jaGlwOwotCWxsaS5pc2NzaV9pb2xlbiA9IE1BWFJYREFUQV9HKHQ0X3JlYWRfcmVnKGFkYXAsIFRQX1BBUkFfUkVHMl9BKSk7Ci0JbGxpLmlzY3NpX3RhZ21hc2sgPSB0NF9yZWFkX3JlZyhhZGFwLCBVTFBfUlhfSVNDU0lfVEFHTUFTS19BKTsKLQlsbGkuaXNjc2lfcGdzel9vcmRlciA9IHQ0X3JlYWRfcmVnKGFkYXAsIFVMUF9SWF9JU0NTSV9QU1pfQSk7Ci0JbGxpLmlzY3NpX2xsaW1pdCA9IHQ0X3JlYWRfcmVnKGFkYXAsIFVMUF9SWF9JU0NTSV9MTElNSVRfQSk7Ci0JbGxpLmlzY3NpX3BwbSA9ICZhZGFwLT5pc2NzaV9wcG07Ci0JbGxpLmNjbGtfcHMgPSAxMDAwMDAwMDAwIC8gYWRhcC0+cGFyYW1zLnZwZC5jY2xrOwotCWxsaS51ZGJfZGVuc2l0eSA9IDEgPDwgYWRhcC0+cGFyYW1zLnNnZS5lcV9xcHA7Ci0JbGxpLnVjcV9kZW5zaXR5ID0gMSA8PCBhZGFwLT5wYXJhbXMuc2dlLmlxX3FwcDsKLQlsbGkuZmlsdF9tb2RlID0gYWRhcC0+cGFyYW1zLnRwLnZsYW5fcHJpX21hcDsKLQkvKiBNT0RRX1JFUV9NQVAgc2V0cyBxdWV1ZXMgMC0zIHRvIGNoYW4gMC0zICovCi0JZm9yIChpID0gMDsgaSA8IE5DSEFOOyBpKyspCi0JCWxsaS50eF9tb2RxW2ldID0gaTsKLQlsbGkuZ3RzX3JlZyA9IGFkYXAtPnJlZ3MgKyBNWVBGX1JFRyhTR0VfUEZfR1RTX0EpOwotCWxsaS5kYl9yZWcgPSBhZGFwLT5yZWdzICsgTVlQRl9SRUcoU0dFX1BGX0tET09SQkVMTF9BKTsKLQlsbGkuZndfdmVycyA9IGFkYXAtPnBhcmFtcy5md192ZXJzOwotCWxsaS5kYmZpZm9faW50X3RocmVzaCA9IGRiZmlmb19pbnRfdGhyZXNoOwotCWxsaS5zZ2VfaW5ncGFkYm91bmRhcnkgPSBhZGFwLT5zZ2UuZmxfYWxpZ247Ci0JbGxpLnNnZV9lZ3JzdGF0dXNwYWdlc2l6ZSA9IGFkYXAtPnNnZS5zdGF0X2xlbjsKLQlsbGkuc2dlX3BrdHNoaWZ0ID0gYWRhcC0+c2dlLnBrdHNoaWZ0OwotCWxsaS5lbmFibGVfZndfb2ZsZF9jb25uID0gYWRhcC0+ZmxhZ3MgJiBGV19PRkxEX0NPTk47Ci0JbGxpLm1heF9vcmRpcmRfcXAgPSBhZGFwLT5wYXJhbXMubWF4X29yZGlyZF9xcDsKLQlsbGkubWF4X2lyZF9hZGFwdGVyID0gYWRhcC0+cGFyYW1zLm1heF9pcmRfYWRhcHRlcjsKLQlsbGkudWxwdHhfbWVtd3JpdGVfZHNnbCA9IGFkYXAtPnBhcmFtcy51bHB0eF9tZW13cml0ZV9kc2dsOwotCWxsaS5ub2RlaWQgPSBkZXZfdG9fbm9kZShhZGFwLT5wZGV2X2Rldik7Ci0KLQloYW5kbGUgPSB1bGRzW3VsZF0uYWRkKCZsbGkpOwotCWlmIChJU19FUlIoaGFuZGxlKSkgewotCQlkZXZfd2FybihhZGFwLT5wZGV2X2RldiwKLQkJCSAiY291bGQgbm90IGF0dGFjaCB0byB0aGUgJXMgZHJpdmVyLCBlcnJvciAlbGRcbiIsCi0JCQkgdWxkX3N0clt1bGRdLCBQVFJfRVJSKGhhbmRsZSkpOwotCQlyZXR1cm47Ci0JfQotCi0JYWRhcC0+dWxkX2hhbmRsZVt1bGRdID0gaGFuZGxlOwotCiAJaWYgKCFuZXRldmVudF9yZWdpc3RlcmVkKSB7CiAJCXJlZ2lzdGVyX25ldGV2ZW50X25vdGlmaWVyKCZjeGdiNF9uZXRldmVudF9uYik7CiAJCW5ldGV2ZW50X3JlZ2lzdGVyZWQgPSB0cnVlOwogCX0KLQotCWlmIChhZGFwLT5mbGFncyAmIEZVTExfSU5JVF9ET05FKQotCQl1bGRzW3VsZF0uc3RhdGVfY2hhbmdlKGhhbmRsZSwgQ1hHQjRfU1RBVEVfVVApOwotfQotCi1zdGF0aWMgdm9pZCBhdHRhY2hfdWxkcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCXNwaW5fbG9jaygmYWRhcF9yY3VfbG9jayk7Ci0JbGlzdF9hZGRfdGFpbF9yY3UoJmFkYXAtPnJjdV9ub2RlLCAmYWRhcF9yY3VfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJmFkYXBfcmN1X2xvY2spOwotCi0JbXV0ZXhfbG9jaygmdWxkX211dGV4KTsKLQlsaXN0X2FkZF90YWlsKCZhZGFwLT5saXN0X25vZGUsICZhZGFwdGVyX2xpc3QpOwotCWZvciAoaSA9IDA7IGkgPCBDWEdCNF9VTERfTUFYOyBpKyspCi0JCWlmICh1bGRzW2ldLmFkZCkKLQkJCXVsZF9hdHRhY2goYWRhcCwgaSk7Ci0JbXV0ZXhfdW5sb2NrKCZ1bGRfbXV0ZXgpOwogfQogCiBzdGF0aWMgdm9pZCBkZXRhY2hfdWxkcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKQEAgLTI1NjAsMjAgKzIwODYsMTYgQEAKIAltdXRleF9sb2NrKCZ1bGRfbXV0ZXgpOwogCWxpc3RfZGVsKCZhZGFwLT5saXN0X25vZGUpOwogCWZvciAoaSA9IDA7IGkgPCBDWEdCNF9VTERfTUFYOyBpKyspCi0JCWlmIChhZGFwLT51bGRfaGFuZGxlW2ldKSB7Ci0JCQl1bGRzW2ldLnN0YXRlX2NoYW5nZShhZGFwLT51bGRfaGFuZGxlW2ldLAorCQlpZiAoYWRhcC0+dWxkICYmIGFkYXAtPnVsZFtpXS5oYW5kbGUpIHsKKwkJCWFkYXAtPnVsZFtpXS5zdGF0ZV9jaGFuZ2UoYWRhcC0+dWxkW2ldLmhhbmRsZSwKIAkJCQkJICAgICBDWEdCNF9TVEFURV9ERVRBQ0gpOwotCQkJYWRhcC0+dWxkX2hhbmRsZVtpXSA9IE5VTEw7CisJCQlhZGFwLT51bGRbaV0uaGFuZGxlID0gTlVMTDsKIAkJfQogCWlmIChuZXRldmVudF9yZWdpc3RlcmVkICYmIGxpc3RfZW1wdHkoJmFkYXB0ZXJfbGlzdCkpIHsKIAkJdW5yZWdpc3Rlcl9uZXRldmVudF9ub3RpZmllcigmY3hnYjRfbmV0ZXZlbnRfbmIpOwogCQluZXRldmVudF9yZWdpc3RlcmVkID0gZmFsc2U7CiAJfQogCW11dGV4X3VubG9jaygmdWxkX211dGV4KTsKLQotCXNwaW5fbG9jaygmYWRhcF9yY3VfbG9jayk7Ci0JbGlzdF9kZWxfcmN1KCZhZGFwLT5yY3Vfbm9kZSk7Ci0Jc3Bpbl91bmxvY2soJmFkYXBfcmN1X2xvY2spOwogfQogCiBzdGF0aWMgdm9pZCBub3RpZnlfdWxkcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgZW51bSBjeGdiNF9zdGF0ZSBuZXdfc3RhdGUpCkBAIC0yNTgyLDYxICsyMTA0LDEyIEBACiAKIAltdXRleF9sb2NrKCZ1bGRfbXV0ZXgpOwogCWZvciAoaSA9IDA7IGkgPCBDWEdCNF9VTERfTUFYOyBpKyspCi0JCWlmIChhZGFwLT51bGRfaGFuZGxlW2ldKQotCQkJdWxkc1tpXS5zdGF0ZV9jaGFuZ2UoYWRhcC0+dWxkX2hhbmRsZVtpXSwgbmV3X3N0YXRlKTsKKwkJaWYgKGFkYXAtPnVsZCAmJiBhZGFwLT51bGRbaV0uaGFuZGxlKQorCQkJYWRhcC0+dWxkW2ldLnN0YXRlX2NoYW5nZShhZGFwLT51bGRbaV0uaGFuZGxlLAorCQkJCQkJICBuZXdfc3RhdGUpOwogCW11dGV4X3VubG9jaygmdWxkX211dGV4KTsKIH0KIAotLyoqCi0gKgljeGdiNF9yZWdpc3Rlcl91bGQgLSByZWdpc3RlciBhbiB1cHBlci1sYXllciBkcml2ZXIKLSAqCUB0eXBlOiB0aGUgVUxEIHR5cGUKLSAqCUBwOiB0aGUgVUxEIG1ldGhvZHMKLSAqCi0gKglSZWdpc3RlcnMgYW4gdXBwZXItbGF5ZXIgZHJpdmVyIHdpdGggdGhpcyBkcml2ZXIgYW5kIG5vdGlmaWVzIHRoZSBVTEQKLSAqCWFib3V0IGFueSBwcmVzZW50bHkgYXZhaWxhYmxlIGRldmljZXMgdGhhdCBzdXBwb3J0IGl0cyB0eXBlLiAgUmV0dXJucwotICoJJS1FQlVTWSBpZiBhIFVMRCBvZiB0aGUgc2FtZSB0eXBlIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4KLSAqLwotaW50IGN4Z2I0X3JlZ2lzdGVyX3VsZChlbnVtIGN4Z2I0X3VsZCB0eXBlLCBjb25zdCBzdHJ1Y3QgY3hnYjRfdWxkX2luZm8gKnApCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGFkYXB0ZXIgKmFkYXA7Ci0KLQlpZiAodHlwZSA+PSBDWEdCNF9VTERfTUFYKQotCQlyZXR1cm4gLUVJTlZBTDsKLQltdXRleF9sb2NrKCZ1bGRfbXV0ZXgpOwotCWlmICh1bGRzW3R5cGVdLmFkZCkgewotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0OwotCX0KLQl1bGRzW3R5cGVdID0gKnA7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShhZGFwLCAmYWRhcHRlcl9saXN0LCBsaXN0X25vZGUpCi0JCXVsZF9hdHRhY2goYWRhcCwgdHlwZSk7Ci1vdXQ6CW11dGV4X3VubG9jaygmdWxkX211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChjeGdiNF9yZWdpc3Rlcl91bGQpOwotCi0vKioKLSAqCWN4Z2I0X3VucmVnaXN0ZXJfdWxkIC0gdW5yZWdpc3RlciBhbiB1cHBlci1sYXllciBkcml2ZXIKLSAqCUB0eXBlOiB0aGUgVUxEIHR5cGUKLSAqCi0gKglVbnJlZ2lzdGVycyBhbiBleGlzdGluZyB1cHBlci1sYXllciBkcml2ZXIuCi0gKi8KLWludCBjeGdiNF91bnJlZ2lzdGVyX3VsZChlbnVtIGN4Z2I0X3VsZCB0eXBlKQotewotCXN0cnVjdCBhZGFwdGVyICphZGFwOwotCi0JaWYgKHR5cGUgPj0gQ1hHQjRfVUxEX01BWCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JbXV0ZXhfbG9jaygmdWxkX211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFkYXAsICZhZGFwdGVyX2xpc3QsIGxpc3Rfbm9kZSkKLQkJYWRhcC0+dWxkX2hhbmRsZVt0eXBlXSA9IE5VTEw7Ci0JdWxkc1t0eXBlXS5hZGQgPSBOVUxMOwotCW11dGV4X3VubG9jaygmdWxkX211dGV4KTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woY3hnYjRfdW5yZWdpc3Rlcl91bGQpOwotCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIHN0YXRpYyBpbnQgY3hnYjRfaW5ldDZhZGRyX2hhbmRsZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAogCQkJCSAgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKmRhdGEpCkBAIC0yNzQxLDcgKzIyMTQsNiBAQAogCQkJCSAgYWRhcC0+bXNpeF9pbmZvWzBdLmRlc2MsIGFkYXApOwogCQlpZiAoZXJyKQogCQkJZ290byBpcnFfZXJyOwotCiAJCWVyciA9IHJlcXVlc3RfbXNpeF9xdWV1ZV9pcnFzKGFkYXApOwogCQlpZiAoZXJyKSB7CiAJCQlmcmVlX2lycShhZGFwLT5tc2l4X2luZm9bMF0udmVjLCBhZGFwKTsKQEAgLTI4MTksNDAgKzIyOTEsNiBAQAogCXJldHVybiB0NF9lbmFibGVfdmkoYWRhcHRlciwgYWRhcHRlci0+cGYsIHBpLT52aWlkLCBmYWxzZSwgZmFsc2UpOwogfQogCi0vKiBSZXR1cm4gYW4gZXJyb3IgbnVtYmVyIGlmIHRoZSBpbmRpY2F0ZWQgZmlsdGVyIGlzbid0IHdyaXRhYmxlIC4uLgotICovCi1zdGF0aWMgaW50IHdyaXRhYmxlX2ZpbHRlcihzdHJ1Y3QgZmlsdGVyX2VudHJ5ICpmKQotewotCWlmIChmLT5sb2NrZWQpCi0JCXJldHVybiAtRVBFUk07Ci0JaWYgKGYtPnBlbmRpbmcpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogRGVsZXRlIHRoZSBmaWx0ZXIgYXQgdGhlIHNwZWNpZmllZCBpbmRleCAoaWYgdmFsaWQpLiAgVGhlIGNoZWNrcyBmb3IgYWxsCi0gKiB0aGUgY29tbW9uIHByb2JsZW1zIHdpdGggZG9pbmcgdGhpcyBsaWtlIHRoZSBmaWx0ZXIgYmVpbmcgbG9ja2VkLCBjdXJyZW50bHkKLSAqIHBlbmRpbmcgaW4gYW5vdGhlciBvcGVyYXRpb24sIGV0Yy4KLSAqLwotc3RhdGljIGludCBkZWxldGVfZmlsdGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgZmlkeCkKLXsKLQlzdHJ1Y3QgZmlsdGVyX2VudHJ5ICpmOwotCWludCByZXQ7Ci0KLQlpZiAoZmlkeCA+PSBhZGFwdGVyLT50aWRzLm5mdGlkcyArIGFkYXB0ZXItPnRpZHMubnNmdGlkcykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlmID0gJmFkYXB0ZXItPnRpZHMuZnRpZF90YWJbZmlkeF07Ci0JcmV0ID0gd3JpdGFibGVfZmlsdGVyKGYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JaWYgKGYtPnZhbGlkKQotCQlyZXR1cm4gZGVsX2ZpbHRlcl93cihhZGFwdGVyLCBmaWR4KTsKLQotCXJldHVybiAwOwotfQotCiBpbnQgY3hnYjRfY3JlYXRlX3NlcnZlcl9maWx0ZXIoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHN0aWQsCiAJCV9fYmUzMiBzaXAsIF9fYmUxNiBzcG9ydCwgX19iZTE2IHZsYW4sCiAJCXVuc2lnbmVkIGludCBxdWV1ZSwgdW5zaWduZWQgY2hhciBwb3J0LCB1bnNpZ25lZCBjaGFyIG1hc2spCkBAIC0yOTIyLDcgKzIzNjAsNiBAQAogaW50IGN4Z2I0X3JlbW92ZV9zZXJ2ZXJfZmlsdGVyKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBzdGlkLAogCQl1bnNpZ25lZCBpbnQgcXVldWUsIGJvb2wgaXB2NikKIHsKLQlpbnQgcmV0OwogCXN0cnVjdCBmaWx0ZXJfZW50cnkgKmY7CiAJc3RydWN0IGFkYXB0ZXIgKmFkYXA7CiAKQEAgLTI5MzYsMTEgKzIzNzMsNyBAQAogCS8qIFVubG9jayB0aGUgZmlsdGVyICovCiAJZi0+bG9ja2VkID0gMDsKIAotCXJldCA9IGRlbGV0ZV9maWx0ZXIoYWRhcCwgc3RpZCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiAwOworCXJldHVybiBkZWxldGVfZmlsdGVyKGFkYXAsIHN0aWQpOwogfQogRVhQT1JUX1NZTUJPTChjeGdiNF9yZW1vdmVfc2VydmVyX2ZpbHRlcik7CiAKQEAgLTMwNzgsNiArMjUxMSw4NSBAQAogCXJldHVybiByZXQ7CiB9CiAKKyNpZmRlZiBDT05GSUdfUENJX0lPVgorc3RhdGljIGludCBkdW1teV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJLyogVHVybiBjYXJyaWVyIG9mZiBzaW5jZSB3ZSBkb24ndCBoYXZlIHRvIHRyYW5zbWl0IGFueXRoaW5nIG9uIHRoaXMKKwkgKiBpbnRlcmZhY2UuCisJICovCisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyogRmlsbCBNQUMgYWRkcmVzcyB0aGF0IHdpbGwgYmUgYXNzaWduZWQgYnkgdGhlIEZXICovCitzdGF0aWMgdm9pZCBmaWxsX3ZmX3N0YXRpb25fbWFjX2FkZHIoc3RydWN0IGFkYXB0ZXIgKmFkYXApCit7CisJdW5zaWduZWQgaW50IGk7CisJdTggaHdfYWRkcltFVEhfQUxFTl0sIG1hY2FkZHJbRVRIX0FMRU5dOworCWludCBlcnI7CisJdTggKm5hOworCXUxNiBhLCBiOworCisJZXJyID0gdDRfZ2V0X3Jhd192cGRfcGFyYW1zKGFkYXAsICZhZGFwLT5wYXJhbXMudnBkKTsKKwlpZiAoIWVycikgeworCQluYSA9IGFkYXAtPnBhcmFtcy52cGQubmE7CisJCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQorCQkJaHdfYWRkcltpXSA9IChoZXgydmFsKG5hWzIgKiBpICsgMF0pICogMTYgKworCQkJCSAgICAgIGhleDJ2YWwobmFbMiAqIGkgKyAxXSkpOworCQlhID0gKGh3X2FkZHJbMF0gPDwgOCkgfCBod19hZGRyWzFdOworCQliID0gKGh3X2FkZHJbMV0gPDwgOCkgfCBod19hZGRyWzJdOworCQlhIF49IGI7CisJCWEgfD0gMHgwMjAwOyAgICAvKiBsb2NhbGx5IGFzc2lnbmVkIEV0aGVybmV0IE1BQyBhZGRyZXNzICovCisJCWEgJj0gfjB4MDEwMDsgICAvKiBub3QgYSBtdWx0aWNhc3QgRXRoZXJuZXQgTUFDIGFkZHJlc3MgKi8KKwkJbWFjYWRkclswXSA9IGEgPj4gODsKKwkJbWFjYWRkclsxXSA9IGEgJiAweGZmOworCisJCWZvciAoaSA9IDI7IGkgPCA1OyBpKyspCisJCQltYWNhZGRyW2ldID0gaHdfYWRkcltpICsgMV07CisKKwkJZm9yIChpID0gMDsgaSA8IGFkYXAtPm51bV92ZnM7IGkrKykgeworCQkJbWFjYWRkcls1XSA9IGFkYXAtPnBmICogMTYgKyBpOworCQkJZXRoZXJfYWRkcl9jb3B5KGFkYXAtPnZmaW5mb1tpXS52Zl9tYWNfYWRkciwgbWFjYWRkcik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgY3hnYl9zZXRfdmZfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB2ZiwgdTggKm1hYykKK3sKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBwaS0+YWRhcHRlcjsKKwlpbnQgcmV0OworCisJLyogdmVyaWZ5IE1BQyBhZGRyIGlzIHZhbGlkICovCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKG1hYykpIHsKKwkJZGV2X2VycihwaS0+YWRhcHRlci0+cGRldl9kZXYsCisJCQkiSW52YWxpZCBFdGhlcm5ldCBhZGRyZXNzICVwTSBmb3IgVkYgJWRcbiIsCisJCQltYWMsIHZmKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X2luZm8ocGktPmFkYXB0ZXItPnBkZXZfZGV2LAorCQkgIlNldHRpbmcgTUFDICVwTSBvbiBWRiAlZFxuIiwgbWFjLCB2Zik7CisJcmV0ID0gdDRfc2V0X3ZmX21hY19hY2woYWRhcCwgdmYgKyAxLCAxLCBtYWMpOworCWlmICghcmV0KQorCQlldGhlcl9hZGRyX2NvcHkoYWRhcC0+dmZpbmZvW3ZmXS52Zl9tYWNfYWRkciwgbWFjKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGN4Z2JfZ2V0X3ZmX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgaW50IHZmLCBzdHJ1Y3QgaWZsYV92Zl9pbmZvICppdmkpCit7CisJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gcGktPmFkYXB0ZXI7CisKKwlpZiAodmYgPj0gYWRhcC0+bnVtX3ZmcykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaXZpLT52ZiA9IHZmOworCWV0aGVyX2FkZHJfY29weShpdmktPm1hYywgYWRhcC0+dmZpbmZvW3ZmXS52Zl9tYWNfYWRkcik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwogc3RhdGljIGludCBjeGdiX3NldF9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwKQogewogCWludCByZXQ7CkBAIC0zMTE0LDYgKzI2MjYsMTE2IEBACiB9CiAjZW5kaWYKIAorc3RhdGljIGludCBjeGdiX3NldF90eF9tYXhyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbmRleCwgdTMyIHJhdGUpCit7CisJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gcGktPmFkYXB0ZXI7CisJc3RydWN0IHNjaGVkX2NsYXNzICplOworCXN0cnVjdCBjaF9zY2hlZF9wYXJhbXMgcDsKKwlzdHJ1Y3QgY2hfc2NoZWRfcXVldWUgcWU7CisJdTMyIHJlcV9yYXRlOworCWludCBlcnIgPSAwOworCisJaWYgKCFjYW5fc2NoZWQoZGV2KSkKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBwaS0+bnFzZXRzIC0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIShhZGFwLT5mbGFncyAmIEZVTExfSU5JVF9ET05FKSkgeworCQlkZXZfZXJyKGFkYXAtPnBkZXZfZGV2LAorCQkJIkZhaWxlZCB0byByYXRlIGxpbWl0IG9uIHF1ZXVlICVkLiBMaW5rIERvd24/XG4iLAorCQkJaW5kZXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDb252ZXJ0IGZyb20gTWJwcyB0byBLYnBzICovCisJcmVxX3JhdGUgPSByYXRlIDw8IDEwOworCisJLyogTWF4IHJhdGUgaXMgMTAgR2JwcyAqLworCWlmIChyZXFfcmF0ZSA+PSBTQ0hFRF9NQVhfUkFURV9LQlBTKSB7CisJCWRldl9lcnIoYWRhcC0+cGRldl9kZXYsCisJCQkiSW52YWxpZCByYXRlICV1IE1icHMsIE1heCByYXRlIGlzICV1IEdicHNcbiIsCisJCQlyYXRlLCBTQ0hFRF9NQVhfUkFURV9LQlBTKTsKKwkJcmV0dXJuIC1FUkFOR0U7CisJfQorCisJLyogRmlyc3QgdW5iaW5kIHRoZSBxdWV1ZSBmcm9tIGFueSBleGlzdGluZyBjbGFzcyAqLworCW1lbXNldCgmcWUsIDAsIHNpemVvZihxZSkpOworCXFlLnF1ZXVlID0gaW5kZXg7CisJcWUuY2xhc3MgPSBTQ0hFRF9DTFNfTk9ORTsKKworCWVyciA9IGN4Z2I0X3NjaGVkX2NsYXNzX3VuYmluZChkZXYsICh2b2lkICopKCZxZSksIFNDSEVEX1FVRVVFKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoYWRhcC0+cGRldl9kZXYsCisJCQkiVW5iaW5kaW5nIFF1ZXVlICVkIG9uIHBvcnQgJWQgZmFpbC4gRXJyOiAlZFxuIiwKKwkJCWluZGV4LCBwaS0+cG9ydF9pZCwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBRdWV1ZSBhbHJlYWR5IHVuYm91bmQgKi8KKwlpZiAoIXJlcV9yYXRlKQorCQlyZXR1cm4gMDsKKworCS8qIEZldGNoIGFueSBhdmFpbGFibGUgdW51c2VkIG9yIG1hdGNoaW5nIHNjaGVkdWxpbmcgY2xhc3MgKi8KKwltZW1zZXQoJnAsIDAsIHNpemVvZihwKSk7CisJcC50eXBlID0gU0NIRURfQ0xBU1NfVFlQRV9QQUNLRVQ7CisJcC51LnBhcmFtcy5sZXZlbCAgICA9IFNDSEVEX0NMQVNTX0xFVkVMX0NMX1JMOworCXAudS5wYXJhbXMubW9kZSAgICAgPSBTQ0hFRF9DTEFTU19NT0RFX0NMQVNTOworCXAudS5wYXJhbXMucmF0ZXVuaXQgPSBTQ0hFRF9DTEFTU19SQVRFVU5JVF9CSVRTOworCXAudS5wYXJhbXMucmF0ZW1vZGUgPSBTQ0hFRF9DTEFTU19SQVRFTU9ERV9BQlM7CisJcC51LnBhcmFtcy5jaGFubmVsICA9IHBpLT50eF9jaGFuOworCXAudS5wYXJhbXMuY2xhc3MgICAgPSBTQ0hFRF9DTFNfTk9ORTsKKwlwLnUucGFyYW1zLm1pbnJhdGUgID0gMDsKKwlwLnUucGFyYW1zLm1heHJhdGUgID0gcmVxX3JhdGU7CisJcC51LnBhcmFtcy53ZWlnaHQgICA9IDA7CisJcC51LnBhcmFtcy5wa3RzaXplICA9IGRldi0+bXR1OworCisJZSA9IGN4Z2I0X3NjaGVkX2NsYXNzX2FsbG9jKGRldiwgJnApOworCWlmICghZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBCaW5kIHRoZSBxdWV1ZSB0byBhIHNjaGVkdWxpbmcgY2xhc3MgKi8KKwltZW1zZXQoJnFlLCAwLCBzaXplb2YocWUpKTsKKwlxZS5xdWV1ZSA9IGluZGV4OworCXFlLmNsYXNzID0gZS0+aWR4OworCisJZXJyID0gY3hnYjRfc2NoZWRfY2xhc3NfYmluZChkZXYsICh2b2lkICopKCZxZSksIFNDSEVEX1FVRVVFKTsKKwlpZiAoZXJyKQorCQlkZXZfZXJyKGFkYXAtPnBkZXZfZGV2LAorCQkJIlF1ZXVlIHJhdGUgbGltaXRpbmcgZmFpbGVkLiBFcnI6ICVkXG4iLCBlcnIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgY3hnYl9zZXR1cF90YyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgaGFuZGxlLCBfX2JlMTYgcHJvdG8sCisJCQkgc3RydWN0IHRjX3RvX25ldGRldiAqdGMpCit7CisJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXYycGluZm8oZGV2KTsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IG5ldGRldjJhZGFwKGRldik7CisKKwlpZiAoIShhZGFwLT5mbGFncyAmIEZVTExfSU5JVF9ET05FKSkgeworCQlkZXZfZXJyKGFkYXAtPnBkZXZfZGV2LAorCQkJIkZhaWxlZCB0byBzZXR1cCB0YyBvbiBwb3J0ICVkLiBMaW5rIERvd24/XG4iLAorCQkJcGktPnBvcnRfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoVENfSF9NQUooaGFuZGxlKSA9PSBUQ19IX01BSihUQ19IX0lOR1JFU1MpICYmCisJICAgIHRjLT50eXBlID09IFRDX1NFVFVQX0NMU1UzMikgeworCQlzd2l0Y2ggKHRjLT5jbHNfdTMyLT5jb21tYW5kKSB7CisJCWNhc2UgVENfQ0xTVTMyX05FV19LTk9ERToKKwkJY2FzZSBUQ19DTFNVMzJfUkVQTEFDRV9LTk9ERToKKwkJCXJldHVybiBjeGdiNF9jb25maWdfa25vZGUoZGV2LCBwcm90bywgdGMtPmNsc191MzIpOworCQljYXNlIFRDX0NMU1UzMl9ERUxFVEVfS05PREU6CisJCQlyZXR1cm4gY3hnYjRfZGVsZXRlX2tub2RlKGRldiwgcHJvdG8sIHRjLT5jbHNfdTMyKTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJfQorCX0KKworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBjeGdiNF9uZXRkZXZfb3BzID0gewogCS5uZG9fb3BlbiAgICAgICAgICAgICA9IGN4Z2Jfb3BlbiwKIAkubmRvX3N0b3AgICAgICAgICAgICAgPSBjeGdiX2Nsb3NlLApAQCAtMzEzNiw3ICsyNzU4LDMxIEBACiAjaWZkZWYgQ09ORklHX05FVF9SWF9CVVNZX1BPTEwKIAkubmRvX2J1c3lfcG9sbCAgICAgICAgPSBjeGdiX2J1c3lfcG9sbCwKICNlbmRpZgorCS5uZG9fc2V0X3R4X21heHJhdGUgICA9IGN4Z2Jfc2V0X3R4X21heHJhdGUsCisJLm5kb19zZXR1cF90YyAgICAgICAgID0gY3hnYl9zZXR1cF90YywKK307CiAKKyNpZmRlZiBDT05GSUdfUENJX0lPVgorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBjeGdiNF9tZ210X25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuICAgICAgICAgICAgID0gZHVtbXlfb3BlbiwKKwkubmRvX3NldF92Zl9tYWMgICAgICAgPSBjeGdiX3NldF92Zl9tYWMsCisJLm5kb19nZXRfdmZfY29uZmlnICAgID0gY3hnYl9nZXRfdmZfY29uZmlnLAorfTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBnZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2MmFkYXAoZGV2KTsKKworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCBjeGdiNF9kcml2ZXJfbmFtZSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgY3hnYjRfZHJpdmVyX3ZlcnNpb24sCisJCXNpemVvZihpbmZvLT52ZXJzaW9uKSk7CisJc3RybGNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoYWRhcHRlci0+cGRldiksCisJCXNpemVvZihpbmZvLT5idXNfaW5mbykpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGN4Z2I0X21nbXRfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvICAgICAgID0gZ2V0X2RydmluZm8sCiB9OwogCiB2b2lkIHQ0X2ZhdGFsX2VycihzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKQEAgLTM5NzksNiArMzYyNSwxMiBAQAogCWFkYXAtPmNsaXB0X3N0YXJ0ID0gdmFsWzBdOwogCWFkYXAtPmNsaXB0X2VuZCA9IHZhbFsxXTsKIAorCS8qIFdlIGRvbid0IHlldCBoYXZlIGEgUEFSQU1zIGNhbGxzIHRvIHJldHJpZXZlIHRoZSBudW1iZXIgb2YgVHJhZmZpYworCSAqIENsYXNzZXMgc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZS9maXJtd2FyZSBzbyB3ZSBoYXJkIGNvZGUgaXQgaGVyZQorCSAqIGZvciBub3cuCisJICovCisJYWRhcC0+cGFyYW1zLm5zY2hlZF9jbHMgPSBpc190NChhZGFwLT5wYXJhbXMuY2hpcCkgPyAxNSA6IDE2OworCiAJLyogcXVlcnkgcGFyYW1zIHJlbGF0ZWQgdG8gYWN0aXZlIGZpbHRlciByZWdpb24gKi8KIAlwYXJhbXNbMF0gPSBGV19QQVJBTV9QRlZGKEFDVElWRV9GSUxURVJfU1RBUlQpOwogCXBhcmFtc1sxXSA9IEZXX1BBUkFNX1BGVkYoQUNUSVZFX0ZJTFRFUl9FTkQpOwpAQCAtNDA2Nyw2ICszNzE5LDcgQEAKIAkJYWRhcC0+cGFyYW1zLm9mbGRxX3dyX2NyZWQgPSB2YWxbNV07CiAKIAkJYWRhcC0+cGFyYW1zLm9mZmxvYWQgPSAxOworCQlhZGFwLT5udW1fb2ZsZF91bGQgKz0gMTsKIAl9CiAJaWYgKGNhcHNfY21kLnJkbWFjYXBzKSB7CiAJCXBhcmFtc1swXSA9IEZXX1BBUkFNX1BGVkYoU1RBR19TVEFSVCk7CkBAIC00MTE5LDYgKzM3NzIsNyBAQAogCQkJICJtYXhfb3JkaXJkX3FwICVkIG1heF9pcmRfYWRhcHRlciAlZFxuIiwKIAkJCSBhZGFwLT5wYXJhbXMubWF4X29yZGlyZF9xcCwKIAkJCSBhZGFwLT5wYXJhbXMubWF4X2lyZF9hZGFwdGVyKTsKKwkJYWRhcC0+bnVtX29mbGRfdWxkICs9IDI7CiAJfQogCWlmIChjYXBzX2NtZC5pc2NzaWNhcHMpIHsKIAkJcGFyYW1zWzBdID0gRldfUEFSQU1fUEZWRihJU0NTSV9TVEFSVCk7CkBAIC00MTI5LDYgKzM3ODMsMTMgQEAKIAkJCWdvdG8gYnllOwogCQlhZGFwLT52cmVzLmlzY3NpLnN0YXJ0ID0gdmFsWzBdOwogCQlhZGFwLT52cmVzLmlzY3NpLnNpemUgPSB2YWxbMV0gLSB2YWxbMF0gKyAxOworCQkvKiBMSU8gdGFyZ2V0IGFuZCBjeGdiNGkgaW5pdGlhaXRvciAqLworCQlhZGFwLT5udW1fb2ZsZF91bGQgKz0gMjsKKwl9CisJaWYgKGNhcHNfY21kLmNyeXB0b2NhcHMpIHsKKwkJLyogU2hvdWxkIHF1ZXJ5IHBhcmFtcyBoZXJlLi4uVE9ETyAqLworCQlhZGFwLT5wYXJhbXMuY3J5cHRvIHw9IFVMUF9DUllQVE9fTE9PS0FTSURFOworCQlhZGFwLT5udW1fdWxkICs9IDE7CiAJfQogI3VuZGVmIEZXX1BBUkFNX1BGVkYKICN1bmRlZiBGV19QQVJBTV9ERVYKQEAgLTQzMDUsMjAgKzM5NjYsMTcgQEAKIAkucmVzdW1lICAgICAgICAgPSBlZWhfcmVzdW1lLAogfTsKIAorLyogUmV0dXJuIHRydWUgaWYgdGhlIExpbmsgQ29uZmlndXJhdGlvbiBzdXBwb3J0cyAiSGlnaCBTcGVlZHMiICh0aG9zZSBncmVhdGVyCisgKiB0aGFuIDFHYi9zKS4KKyAqLwogc3RhdGljIGlubGluZSBib29sIGlzX3hfMTBnX3BvcnQoY29uc3Qgc3RydWN0IGxpbmtfY29uZmlnICpsYykKIHsKLQlyZXR1cm4gKGxjLT5zdXBwb3J0ZWQgJiBGV19QT1JUX0NBUF9TUEVFRF8xMEcpICE9IDAgfHwKLQkgICAgICAgKGxjLT5zdXBwb3J0ZWQgJiBGV19QT1JUX0NBUF9TUEVFRF80MEcpICE9IDA7Ci19CisJdW5zaWduZWQgaW50IHNwZWVkcywgaGlnaF9zcGVlZHM7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X3JzcHEoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHN0cnVjdCBzZ2VfcnNwcSAqcSwKLQkJCSAgICAgdW5zaWduZWQgaW50IHVzLCB1bnNpZ25lZCBpbnQgY250LAotCQkJICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgaW50IGlxZV9zaXplKQotewotCXEtPmFkYXAgPSBhZGFwOwotCWN4Z2I0X3NldF9yc3BxX2ludHJfcGFyYW1zKHEsIHVzLCBjbnQpOwotCXEtPmlxZV9sZW4gPSBpcWVfc2l6ZTsKLQlxLT5zaXplID0gc2l6ZTsKKwlzcGVlZHMgPSBGV19QT1JUX0NBUF9TUEVFRF9WKEZXX1BPUlRfQ0FQX1NQRUVEX0cobGMtPnN1cHBvcnRlZCkpOworCWhpZ2hfc3BlZWRzID0gc3BlZWRzICYgfihGV19QT1JUX0NBUF9TUEVFRF8xMDBNIHwgRldfUE9SVF9DQVBfU1BFRURfMUcpOworCisJcmV0dXJuIGhpZ2hfc3BlZWRzICE9IDA7CiB9CiAKIC8qCkBAIC00MzMzLDcgKzM5OTEsMTYgQEAKICNpZm5kZWYgQ09ORklHX0NIRUxTSU9fVDRfRENCCiAJaW50IHExMGcgPSAwOwogI2VuZGlmCi0JaW50IGNpcV9zaXplOworCisJLyogUmVkdWNlIG1lbW9yeSB1c2FnZSBpbiBrZHVtcCBlbnZpcm9ubWVudCwgZGlzYWJsZSBhbGwgb2ZmbG9hZC4KKwkgKi8KKwlpZiAoaXNfa2R1bXBfa2VybmVsKCkpIHsKKwkJYWRhcC0+cGFyYW1zLm9mZmxvYWQgPSAwOworCQlhZGFwLT5wYXJhbXMuY3J5cHRvID0gMDsKKwl9IGVsc2UgaWYgKGlzX3VsZChhZGFwKSAmJiB0NF91bGRfbWVtX2FsbG9jKGFkYXApKSB7CisJCWFkYXAtPnBhcmFtcy5vZmZsb2FkID0gMDsKKwkJYWRhcC0+cGFyYW1zLmNyeXB0byA9IDA7CisJfQogCiAJZm9yX2VhY2hfcG9ydChhZGFwLCBpKQogCQluMTBnICs9IGlzX3hfMTBnX3BvcnQoJmFkYXAycGluZm8oYWRhcCwgaSktPmxpbmtfY2ZnKTsKQEAgLTQzNjUsMTEgKzQwMzIsNiBAQAogCWlmIChxMTBnID4gbmV0aWZfZ2V0X251bV9kZWZhdWx0X3Jzc19xdWV1ZXMoKSkKIAkJcTEwZyA9IG5ldGlmX2dldF9udW1fZGVmYXVsdF9yc3NfcXVldWVzKCk7CiAKLQkvKiBSZWR1Y2UgbWVtb3J5IHVzYWdlIGluIGtkdW1wIGVudmlyb25tZW50LCBkaXNhYmxlIGFsbCBvZmZsb2FkLgotCSAqLwotCWlmIChpc19rZHVtcF9rZXJuZWwoKSkKLQkJYWRhcC0+cGFyYW1zLm9mZmxvYWQgPSAwOwotCiAJZm9yX2VhY2hfcG9ydChhZGFwLCBpKSB7CiAJCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gYWRhcDJwaW5mbyhhZGFwLCBpKTsKIApAQCAtNDM4MiwzMyArNDA0NCwxOCBAQAogCXMtPmV0aHFzZXRzID0gcWlkeDsKIAlzLT5tYXhfZXRocXNldHMgPSBxaWR4OyAgIC8qIE1TSS1YIG1heSBsb3dlciBpdCBsYXRlciAqLwogCi0JaWYgKGlzX29mZmxvYWQoYWRhcCkpIHsKKwlpZiAoaXNfdWxkKGFkYXApKSB7CiAJCS8qCiAJCSAqIEZvciBvZmZsb2FkIHdlIHVzZSAxIHF1ZXVlL2NoYW5uZWwgaWYgYWxsIHBvcnRzIGFyZSB1cCB0byAxRywKIAkJICogb3RoZXJ3aXNlIHdlIGRpdmlkZSBhbGwgYXZhaWxhYmxlIHF1ZXVlcyBhbW9uZ3N0IHRoZSBjaGFubmVscwogCQkgKiBjYXBwZWQgYnkgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgY29yZXMuCiAJCSAqLwogCQlpZiAobjEwZykgewotCQkJaSA9IG1pbl90KGludCwgQVJSQVlfU0laRShzLT5pc2NzaXJ4cSksCi0JCQkJICBudW1fb25saW5lX2NwdXMoKSk7Ci0JCQlzLT5pc2NzaXFzZXRzID0gcm91bmR1cChpLCBhZGFwLT5wYXJhbXMubnBvcnRzKTsKLQkJfSBlbHNlCi0JCQlzLT5pc2NzaXFzZXRzID0gYWRhcC0+cGFyYW1zLm5wb3J0czsKLQkJLyogRm9yIFJETUEgb25lIFJ4IHF1ZXVlIHBlciBjaGFubmVsIHN1ZmZpY2VzICovCi0JCXMtPnJkbWFxcyA9IGFkYXAtPnBhcmFtcy5ucG9ydHM7Ci0JCS8qIFRyeSBhbmQgYWxsb3cgYXQgbGVhc3QgMSBDSVEgcGVyIGNwdSByb3VuZGluZyBkb3duCi0JCSAqIHRvIHRoZSBudW1iZXIgb2YgcG9ydHMsIHdpdGggYSBtaW5pbXVtIG9mIDEgcGVyIHBvcnQuCi0JCSAqIEEgMiBwb3J0IGNhcmQgaW4gYSA2IGNwdSBzeXN0ZW06IDYgQ0lRcywgMyAvIHBvcnQuCi0JCSAqIEEgNCBwb3J0IGNhcmQgaW4gYSA2IGNwdSBzeXN0ZW06IDQgQ0lRcywgMSAvIHBvcnQuCi0JCSAqIEEgNCBwb3J0IGNhcmQgaW4gYSAyIGNwdSBzeXN0ZW06IDQgQ0lRcywgMSAvIHBvcnQuCi0JCSAqLwotCQlzLT5yZG1hY2lxcyA9IG1pbl90KGludCwgTUFYX1JETUFfQ0lRUywgbnVtX29ubGluZV9jcHVzKCkpOwotCQlzLT5yZG1hY2lxcyA9IChzLT5yZG1hY2lxcyAvIGFkYXAtPnBhcmFtcy5ucG9ydHMpICoKLQkJCQlhZGFwLT5wYXJhbXMubnBvcnRzOwotCQlzLT5yZG1hY2lxcyA9IG1heF90KGludCwgcy0+cmRtYWNpcXMsIGFkYXAtPnBhcmFtcy5ucG9ydHMpOwotCi0JCWlmICghaXNfdDQoYWRhcC0+cGFyYW1zLmNoaXApKQotCQkJcy0+bmlzY3NpdHEgPSBzLT5pc2NzaXFzZXRzOworCQkJaSA9IG51bV9vbmxpbmVfY3B1cygpOworCQkJcy0+b2ZsZHFzZXRzID0gcm91bmR1cChpLCBhZGFwLT5wYXJhbXMubnBvcnRzKTsKKwkJfSBlbHNlIHsKKwkJCXMtPm9mbGRxc2V0cyA9IGFkYXAtPnBhcmFtcy5ucG9ydHM7CisJCX0KIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzLT5ldGhyeHEpOyBpKyspIHsKQEAgLTQ0MjcsNDcgKzQwNzQsOCBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHMtPm9mbGR0eHEpOyBpKyspCiAJCXMtPm9mbGR0eHFbaV0ucS5zaXplID0gMTAyNDsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHMtPmlzY3NpcnhxKTsgaSsrKSB7Ci0JCXN0cnVjdCBzZ2Vfb2ZsZF9yeHEgKnIgPSAmcy0+aXNjc2lyeHFbaV07Ci0KLQkJaW5pdF9yc3BxKGFkYXAsICZyLT5yc3BxLCA1LCAxLCAxMDI0LCA2NCk7Ci0JCXItPnJzcHEudWxkID0gQ1hHQjRfVUxEX0lTQ1NJOwotCQlyLT5mbC5zaXplID0gNzI7Ci0JfQotCi0JaWYgKCFpc190NChhZGFwLT5wYXJhbXMuY2hpcCkpIHsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocy0+aXNjc2l0cnhxKTsgaSsrKSB7Ci0JCQlzdHJ1Y3Qgc2dlX29mbGRfcnhxICpyID0gJnMtPmlzY3NpdHJ4cVtpXTsKLQotCQkJaW5pdF9yc3BxKGFkYXAsICZyLT5yc3BxLCA1LCAxLCAxMDI0LCA2NCk7Ci0JCQlyLT5yc3BxLnVsZCA9IENYR0I0X1VMRF9JU0NTSVQ7Ci0JCQlyLT5mbC5zaXplID0gNzI7Ci0JCX0KLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzLT5yZG1hcnhxKTsgaSsrKSB7Ci0JCXN0cnVjdCBzZ2Vfb2ZsZF9yeHEgKnIgPSAmcy0+cmRtYXJ4cVtpXTsKLQotCQlpbml0X3JzcHEoYWRhcCwgJnItPnJzcHEsIDUsIDEsIDUxMSwgNjQpOwotCQlyLT5yc3BxLnVsZCA9IENYR0I0X1VMRF9SRE1BOwotCQlyLT5mbC5zaXplID0gNzI7Ci0JfQotCi0JY2lxX3NpemUgPSA2NCArIGFkYXAtPnZyZXMuY3Euc2l6ZSArIGFkYXAtPnRpZHMubmZ0aWRzOwotCWlmIChjaXFfc2l6ZSA+IFNHRV9NQVhfSVFfU0laRSkgewotCQlDSF9XQVJOKGFkYXAsICJDSVEgc2l6ZSB0b28gc21hbGwgZm9yIGF2YWlsYWJsZSBJUXNcbiIpOwotCQljaXFfc2l6ZSA9IFNHRV9NQVhfSVFfU0laRTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzLT5yZG1hY2lxKTsgaSsrKSB7Ci0JCXN0cnVjdCBzZ2Vfb2ZsZF9yeHEgKnIgPSAmcy0+cmRtYWNpcVtpXTsKLQotCQlpbml0X3JzcHEoYWRhcCwgJnItPnJzcHEsIDUsIDEsIGNpcV9zaXplLCA2NCk7Ci0JCXItPnJzcHEudWxkID0gQ1hHQjRfVUxEX1JETUE7Ci0JfQotCiAJaW5pdF9yc3BxKGFkYXAsICZzLT5md19ldnRxLCAwLCAxLCAxMDI0LCA2NCk7Ci0JaW5pdF9yc3BxKGFkYXAsICZzLT5pbnRycSwgMCwgMSwgMiAqIE1BWF9JTkdRLCA2NCk7CisJaW5pdF9yc3BxKGFkYXAsICZzLT5pbnRycSwgMCwgMSwgNTEyLCA2NCk7CiB9CiAKIC8qCkBAIC00NDk4LDQyICs0MTA2LDkwIEBACiAJfQogfQogCitzdGF0aWMgaW50IGdldF9tc2l4X2luZm8oc3RydWN0IGFkYXB0ZXIgKmFkYXApCit7CisJc3RydWN0IHVsZF9tc2l4X2luZm8gKm1zaXhfaW5mbzsKKwl1bnNpZ25lZCBpbnQgbWF4X2luZ3EgPSAwOworCisJaWYgKGlzX29mZmxvYWQoYWRhcCkpCisJCW1heF9pbmdxICs9IE1BWF9PRkxEX1FTRVRTICogYWRhcC0+bnVtX29mbGRfdWxkOworCWlmIChpc19wY2lfdWxkKGFkYXApKQorCQltYXhfaW5ncSArPSBNQVhfT0ZMRF9RU0VUUyAqIGFkYXAtPm51bV91bGQ7CisKKwlpZiAoIW1heF9pbmdxKQorCQlnb3RvIG91dDsKKworCW1zaXhfaW5mbyA9IGtjYWxsb2MobWF4X2luZ3EsIHNpemVvZigqbXNpeF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtc2l4X2luZm8pCisJCXJldHVybiAtRU5PTUVNOworCisJYWRhcC0+bXNpeF9ibWFwX3VsZHMubXNpeF9ibWFwID0ga2NhbGxvYyhCSVRTX1RPX0xPTkdTKG1heF9pbmdxKSwKKwkJCQkJCSBzaXplb2YobG9uZyksIEdGUF9LRVJORUwpOworCWlmICghYWRhcC0+bXNpeF9ibWFwX3VsZHMubXNpeF9ibWFwKSB7CisJCWtmcmVlKG1zaXhfaW5mbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlzcGluX2xvY2tfaW5pdCgmYWRhcC0+bXNpeF9ibWFwX3VsZHMubG9jayk7CisJYWRhcC0+bXNpeF9pbmZvX3VsZHMgPSBtc2l4X2luZm87CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfbXNpeF9pbmZvKHN0cnVjdCBhZGFwdGVyICphZGFwKQoreworCWlmICghKGFkYXAtPm51bV91bGQgJiYgYWRhcC0+bnVtX29mbGRfdWxkKSkKKwkJcmV0dXJuOworCisJa2ZyZWUoYWRhcC0+bXNpeF9pbmZvX3VsZHMpOworCWtmcmVlKGFkYXAtPm1zaXhfYm1hcF91bGRzLm1zaXhfYm1hcCk7Cit9CisKIC8qIDIgTVNJLVggdmVjdG9ycyBuZWVkZWQgZm9yIHRoZSBGVyBxdWV1ZSBhbmQgbm9uLWRhdGEgaW50ZXJydXB0cyAqLwogI2RlZmluZSBFWFRSQV9WRUNTIDIKIAogc3RhdGljIGludCBlbmFibGVfbXNpeChzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKIHsKLQlpbnQgb2ZsZF9uZWVkID0gMDsKLQlpbnQgaSwgd2FudCwgbmVlZCwgYWxsb2NhdGVkOworCWludCBvZmxkX25lZWQgPSAwLCB1bGRfbmVlZCA9IDA7CisJaW50IGksIGosIHdhbnQsIG5lZWQsIGFsbG9jYXRlZDsKIAlzdHJ1Y3Qgc2dlICpzID0gJmFkYXAtPnNnZTsKIAl1bnNpZ25lZCBpbnQgbmNoYW4gPSBhZGFwLT5wYXJhbXMubnBvcnRzOwogCXN0cnVjdCBtc2l4X2VudHJ5ICplbnRyaWVzOworCWludCBtYXhfaW5ncSA9IE1BWF9JTkdROwogCi0JZW50cmllcyA9IGttYWxsb2Moc2l6ZW9mKCplbnRyaWVzKSAqIChNQVhfSU5HUSArIDEpLAorCWlmIChpc19wY2lfdWxkKGFkYXApKQorCQltYXhfaW5ncSArPSAoTUFYX09GTERfUVNFVFMgKiBhZGFwLT5udW1fdWxkKTsKKwlpZiAoaXNfb2ZmbG9hZChhZGFwKSkKKwkJbWF4X2luZ3EgKz0gKE1BWF9PRkxEX1FTRVRTICogYWRhcC0+bnVtX29mbGRfdWxkKTsKKwllbnRyaWVzID0ga21hbGxvYyhzaXplb2YoKmVudHJpZXMpICogKG1heF9pbmdxICsgMSksCiAJCQkgIEdGUF9LRVJORUwpOwogCWlmICghZW50cmllcykKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0lOR1EgKyAxOyArK2kpCisJLyogbWFwIGZvciBtc2l4ICovCisJaWYgKGdldF9tc2l4X2luZm8oYWRhcCkpIHsKKwkJYWRhcC0+cGFyYW1zLm9mZmxvYWQgPSAwOworCQlhZGFwLT5wYXJhbXMuY3J5cHRvID0gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbWF4X2luZ3EgKyAxOyArK2kpCiAJCWVudHJpZXNbaV0uZW50cnkgPSBpOwogCiAJd2FudCA9IHMtPm1heF9ldGhxc2V0cyArIEVYVFJBX1ZFQ1M7CiAJaWYgKGlzX29mZmxvYWQoYWRhcCkpIHsKLQkJd2FudCArPSBzLT5yZG1hcXMgKyBzLT5yZG1hY2lxcyArIHMtPmlzY3NpcXNldHMJKwotCQkJcy0+bmlzY3NpdHE7Ci0JCS8qIG5lZWQgbmNoYW4gZm9yIGVhY2ggcG9zc2libGUgVUxEICovCi0JCWlmIChpc190NChhZGFwLT5wYXJhbXMuY2hpcCkpCi0JCQlvZmxkX25lZWQgPSAzICogbmNoYW47Ci0JCWVsc2UKLQkJCW9mbGRfbmVlZCA9IDQgKiBuY2hhbjsKKwkJd2FudCArPSBhZGFwLT5udW1fb2ZsZF91bGQgKiBzLT5vZmxkcXNldHM7CisJCW9mbGRfbmVlZCA9IGFkYXAtPm51bV9vZmxkX3VsZCAqIG5jaGFuOworCX0KKwlpZiAoaXNfcGNpX3VsZChhZGFwKSkgeworCQl3YW50ICs9IGFkYXAtPm51bV91bGQgKiBzLT5vZmxkcXNldHM7CisJCXVsZF9uZWVkID0gYWRhcC0+bnVtX3VsZCAqIG5jaGFuOwogCX0KICNpZmRlZiBDT05GSUdfQ0hFTFNJT19UNF9EQ0IKIAkvKiBGb3IgRGF0YSBDZW50ZXIgQnJpZGdpbmcgd2UgbmVlZCA4IEV0aGVybmV0IFRYIFByaW9yaXR5IFF1ZXVlcyBmb3IKIAkgKiBlYWNoIHBvcnQuCiAJICovCi0JbmVlZCA9IDggKiBhZGFwLT5wYXJhbXMubnBvcnRzICsgRVhUUkFfVkVDUyArIG9mbGRfbmVlZDsKKwluZWVkID0gOCAqIGFkYXAtPnBhcmFtcy5ucG9ydHMgKyBFWFRSQV9WRUNTICsgb2ZsZF9uZWVkICsgdWxkX25lZWQ7CiAjZWxzZQotCW5lZWQgPSBhZGFwLT5wYXJhbXMubnBvcnRzICsgRVhUUkFfVkVDUyArIG9mbGRfbmVlZDsKKwluZWVkID0gYWRhcC0+cGFyYW1zLm5wb3J0cyArIEVYVFJBX1ZFQ1MgKyBvZmxkX25lZWQgKyB1bGRfbmVlZDsKICNlbmRpZgogCWFsbG9jYXRlZCA9IHBjaV9lbmFibGVfbXNpeF9yYW5nZShhZGFwLT5wZGV2LCBlbnRyaWVzLCBuZWVkLCB3YW50KTsKIAlpZiAoYWxsb2NhdGVkIDwgMCkgewpAQCAtNDU0NywzMyArNDIwMywzMSBAQAogCSAqIEV2ZXJ5IGdyb3VwIGdldHMgaXRzIG1pbmltdW0gcmVxdWlyZW1lbnQgYW5kIE5JQyBnZXRzIHRvcAogCSAqIHByaW9yaXR5IGZvciBsZWZ0b3ZlcnMuCiAJICovCi0JaSA9IGFsbG9jYXRlZCAtIEVYVFJBX1ZFQ1MgLSBvZmxkX25lZWQ7CisJaSA9IGFsbG9jYXRlZCAtIEVYVFJBX1ZFQ1MgLSBvZmxkX25lZWQgLSB1bGRfbmVlZDsKIAlpZiAoaSA8IHMtPm1heF9ldGhxc2V0cykgewogCQlzLT5tYXhfZXRocXNldHMgPSBpOwogCQlpZiAoaSA8IHMtPmV0aHFzZXRzKQogCQkJcmVkdWNlX2V0aHFzKGFkYXAsIGkpOwogCX0KLQlpZiAoaXNfb2ZmbG9hZChhZGFwKSkgewotCQlpZiAoYWxsb2NhdGVkIDwgd2FudCkgewotCQkJcy0+cmRtYXFzID0gbmNoYW47Ci0JCQlzLT5yZG1hY2lxcyA9IG5jaGFuOwotCi0JCQlpZiAoIWlzX3Q0KGFkYXAtPnBhcmFtcy5jaGlwKSkKLQkJCQlzLT5uaXNjc2l0cSA9IG5jaGFuOwotCQl9Ci0KLQkJLyogbGVmdG92ZXJzIGdvIHRvIE9GTEQgKi8KLQkJaSA9IGFsbG9jYXRlZCAtIEVYVFJBX1ZFQ1MgLSBzLT5tYXhfZXRocXNldHMgLQotCQkgICAgcy0+cmRtYXFzIC0gcy0+cmRtYWNpcXMgLSBzLT5uaXNjc2l0cTsKLQkJcy0+aXNjc2lxc2V0cyA9IChpIC8gbmNoYW4pICogbmNoYW47ICAvKiByb3VuZCBkb3duICovCi0KKwlpZiAoaXNfdWxkKGFkYXApKSB7CisJCWlmIChhbGxvY2F0ZWQgPCB3YW50KQorCQkJcy0+bnFzX3Blcl91bGQgPSBuY2hhbjsKKwkJZWxzZQorCQkJcy0+bnFzX3Blcl91bGQgPSBzLT5vZmxkcXNldHM7CiAJfQotCWZvciAoaSA9IDA7IGkgPCBhbGxvY2F0ZWQ7ICsraSkKKworCWZvciAoaSA9IDA7IGkgPCAocy0+bWF4X2V0aHFzZXRzICsgRVhUUkFfVkVDUyk7ICsraSkKIAkJYWRhcC0+bXNpeF9pbmZvW2ldLnZlYyA9IGVudHJpZXNbaV0udmVjdG9yOworCWlmIChpc191bGQoYWRhcCkpIHsKKwkJZm9yIChqID0gMCA7IGkgPCBhbGxvY2F0ZWQ7ICsraSwgaisrKSB7CisJCQlhZGFwLT5tc2l4X2luZm9fdWxkc1tqXS52ZWMgPSBlbnRyaWVzW2ldLnZlY3RvcjsKKwkJCWFkYXAtPm1zaXhfaW5mb191bGRzW2pdLmlkeCA9IGk7CisJCX0KKwkJYWRhcC0+bXNpeF9ibWFwX3VsZHMubWFwc2l6ZSA9IGo7CisJfQogCWRldl9pbmZvKGFkYXAtPnBkZXZfZGV2LCAiJWQgTVNJLVggdmVjdG9ycyBhbGxvY2F0ZWQsICIKLQkJICJuaWMgJWQgaXNjc2kgJWQgcmRtYSBjcGwgJWQgcmRtYSBjaXEgJWRcbiIsCi0JCSBhbGxvY2F0ZWQsIHMtPm1heF9ldGhxc2V0cywgcy0+aXNjc2lxc2V0cywgcy0+cmRtYXFzLAotCQkgcy0+cmRtYWNpcXMpOworCQkgIm5pYyAlZCBwZXIgdWxkICVkXG4iLAorCQkgYWxsb2NhdGVkLCBzLT5tYXhfZXRocXNldHMsIHMtPm5xc19wZXJfdWxkKTsKIAogCWtmcmVlKGVudHJpZXMpOwogCXJldHVybiAwOwpAQCAtNDc1Niw4ICs0NDEwLDEyIEBACiAJCWJ1ZnAgKz0gc3ByaW50ZihidWZwLCAiMTAwMC8iKTsKIAlpZiAocGktPmxpbmtfY2ZnLnN1cHBvcnRlZCAmIEZXX1BPUlRfQ0FQX1NQRUVEXzEwRykKIAkJYnVmcCArPSBzcHJpbnRmKGJ1ZnAsICIxMEcvIik7CisJaWYgKHBpLT5saW5rX2NmZy5zdXBwb3J0ZWQgJiBGV19QT1JUX0NBUF9TUEVFRF8yNUcpCisJCWJ1ZnAgKz0gc3ByaW50ZihidWZwLCAiMjVHLyIpOwogCWlmIChwaS0+bGlua19jZmcuc3VwcG9ydGVkICYgRldfUE9SVF9DQVBfU1BFRURfNDBHKQogCQlidWZwICs9IHNwcmludGYoYnVmcCwgIjQwRy8iKTsKKwlpZiAocGktPmxpbmtfY2ZnLnN1cHBvcnRlZCAmIEZXX1BPUlRfQ0FQX1NQRUVEXzEwMEcpCisJCWJ1ZnAgKz0gc3ByaW50ZihidWZwLCAiMTAwRy8iKTsKIAlpZiAoYnVmcCAhPSBidWYpCiAJCS0tYnVmcDsKIAlzcHJpbnRmKGJ1ZnAsICJCQVNFLSVzIiwgdDRfZ2V0X3BvcnRfdHlwZV9kZXNjcmlwdGlvbihwaS0+cG9ydF90eXBlKSk7CkBAIC00NzgzLDcgKzQ0NDEsOSBAQAogCXVuc2lnbmVkIGludCBpOwogCiAJdDRfZnJlZV9tZW0oYWRhcHRlci0+bDJ0KTsKKwl0NF9jbGVhbnVwX3NjaGVkKGFkYXB0ZXIpOwogCXQ0X2ZyZWVfbWVtKGFkYXB0ZXItPnRpZHMudGlkX3RhYik7CisJY3hnYjRfY2xlYW51cF90Y191MzIoYWRhcHRlcik7CiAJa2ZyZWUoYWRhcHRlci0+c2dlLmVncl9tYXApOwogCWtmcmVlKGFkYXB0ZXItPnNnZS5pbmdyX21hcCk7CiAJa2ZyZWUoYWRhcHRlci0+c2dlLnN0YXJ2aW5nX2ZsKTsKQEAgLTQ4MzQsMjEgKzQ0OTQsNTkgQEAKIH0KIAogI2lmZGVmIENPTkZJR19QQ0lfSU9WCitzdGF0aWMgdm9pZCBkdW1teV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWRldi0+dHlwZSA9IEFSUEhSRF9OT05FOworCWRldi0+bXR1ID0gMDsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IDA7CisJZGV2LT5hZGRyX2xlbiA9IDA7CisJZGV2LT50eF9xdWV1ZV9sZW4gPSAwOworCWRldi0+ZmxhZ3MgfD0gSUZGX05PQVJQOworCWRldi0+cHJpdl9mbGFncyB8PSBJRkZfTk9fUVVFVUU7CisKKwkvKiBJbml0aWFsaXplIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLworCWRldi0+bmV0ZGV2X29wcyA9ICZjeGdiNF9tZ210X25ldGRldl9vcHM7CisJZGV2LT5ldGh0b29sX29wcyA9ICZjeGdiNF9tZ210X2V0aHRvb2xfb3BzOworCWRldi0+ZGVzdHJ1Y3RvciA9IGZyZWVfbmV0ZGV2OworfQorCitzdGF0aWMgaW50IGNvbmZpZ19tZ210X2RldihzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBwb3J0X2luZm8gKnBpOworCWNoYXIgbmFtZVtJRk5BTVNJWl07CisJaW50IGVycjsKKworCXNucHJpbnRmKG5hbWUsIElGTkFNU0laLCAibWdtdHBmJWQlZCIsIGFkYXAtPmFkYXBfaWR4LCBhZGFwLT5wZik7CisJbmV0ZGV2ID0gYWxsb2NfbmV0ZGV2KDAsIG5hbWUsIE5FVF9OQU1FX1VOS05PV04sIGR1bW15X3NldHVwKTsKKwlpZiAoIW5ldGRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwaSA9IG5ldGRldl9wcml2KG5ldGRldik7CisJcGktPmFkYXB0ZXIgPSBhZGFwOworCVNFVF9ORVRERVZfREVWKG5ldGRldiwgJnBkZXYtPmRldik7CisKKwlhZGFwLT5wb3J0WzBdID0gbmV0ZGV2OworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGFkYXAtPnBvcnRbMF0pOworCWlmIChlcnIpIHsKKwkJcHJfaW5mbygiVW5hYmxlIHRvIHJlZ2lzdGVyIFZGIG1nbXQgbmV0ZGV2ICVzXG4iLCBuYW1lKTsKKwkJZnJlZV9uZXRkZXYoYWRhcC0+cG9ydFswXSk7CisJCWFkYXAtPnBvcnRbMF0gPSBOVUxMOworCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBjeGdiNF9pb3ZfY29uZmlndXJlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgbnVtX3ZmcykKIHsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlpbnQgZXJyID0gMDsKIAlpbnQgY3VycmVudF92ZnMgPSBwY2lfbnVtX3ZmKHBkZXYpOwogCXUzMiBwY2llX2Z3OwotCXZvaWQgX19pb21lbSAqcmVnczsKIAotCXJlZ3MgPSBwY2lfaW9yZW1hcF9iYXIocGRldiwgMCk7Ci0JaWYgKCFyZWdzKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBtYXAgZGV2aWNlIHJlZ2lzdGVyc1xuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXBjaWVfZncgPSByZWFkbChyZWdzICsgUENJRV9GV19BKTsKLQlpb3VubWFwKHJlZ3MpOworCXBjaWVfZncgPSByZWFkbChhZGFwLT5yZWdzICsgUENJRV9GV19BKTsKIAkvKiBDaGVjayBpZiBjeGdiNCBpcyB0aGUgTUFTVEVSIGFuZCBmdyBpcyBpbml0aWFsaXplZCAqLwogCWlmICghKHBjaWVfZncgJiBQQ0lFX0ZXX0lOSVRfRikgfHwKIAkgICAgIShwY2llX2Z3ICYgUENJRV9GV19NQVNURVJfVkxEX0YpIHx8CkBAIC00ODc1LDYgKzQ1NzMsMTQgQEAKIAkgKi8KIAlpZiAoIW51bV92ZnMpIHsKIAkJcGNpX2Rpc2FibGVfc3Jpb3YocGRldik7CisJCWlmIChhZGFwLT5wb3J0WzBdKSB7CisJCQl1bnJlZ2lzdGVyX25ldGRldihhZGFwLT5wb3J0WzBdKTsKKwkJCWFkYXAtPnBvcnRbMF0gPSBOVUxMOworCQl9CisJCS8qIGZyZWUgVkYgcmVzb3VyY2VzICovCisJCWtmcmVlKGFkYXAtPnZmaW5mbyk7CisJCWFkYXAtPnZmaW5mbyA9IE5VTEw7CisJCWFkYXAtPm51bV92ZnMgPSAwOwogCQlyZXR1cm4gbnVtX3ZmczsKIAl9CiAKQEAgLTQ4ODIsNyArNDU4OCwxNyBAQAogCQllcnIgPSBwY2lfZW5hYmxlX3NyaW92KHBkZXYsIG51bV92ZnMpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKKworCQlhZGFwLT5udW1fdmZzID0gbnVtX3ZmczsKKwkJZXJyID0gY29uZmlnX21nbXRfZGV2KHBkZXYpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAl9CisKKwlhZGFwLT52ZmluZm8gPSBrY2FsbG9jKGFkYXAtPm51bV92ZnMsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2Zl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGFkYXAtPnZmaW5mbykKKwkJZmlsbF92Zl9zdGF0aW9uX21hY19hZGRyKGFkYXApOwogCXJldHVybiBudW1fdmZzOwogfQogI2VuZGlmCkBAIC00ODkzLDkgKzQ2MDksMTEgQEAKIAlzdHJ1Y3QgcG9ydF9pbmZvICpwaTsKIAlib29sIGhpZ2hkbWEgPSBmYWxzZTsKIAlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKIAl2b2lkIF9faW9tZW0gKnJlZ3M7CiAJdTMyIHdob2FtaSwgcGxfcmV2OwogCWVudW0gY2hpcF90eXBlIGNoaXA7CisJc3RhdGljIGludCBhZGFwX2lkeCA9IDE7CiAKIAlwcmludGtfb25jZShLRVJOX0lORk8gIiVzIC0gdmVyc2lvbiAlc1xuIiwgRFJWX0RFU0MsIERSVl9WRVJTSU9OKTsKIApAQCAtNDkzMCw3ICs0NjQ4LDkgQEAKIAlmdW5jID0gQ0hFTFNJT19DSElQX1ZFUlNJT04oY2hpcCkgPD0gQ0hFTFNJT19UNSA/CiAJCVNPVVJDRVBGX0cod2hvYW1pKSA6IFQ2X1NPVVJDRVBGX0cod2hvYW1pKTsKIAlpZiAoZnVuYyAhPSBlbnQtPmRyaXZlcl9kYXRhKSB7CisjaWZuZGVmIENPTkZJR19QQ0lfSU9WCiAJCWlvdW5tYXAocmVncyk7CisjZW5kaWYKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCQlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsgICAgICAgIC8qIHRvIHJlc3RvcmUgU1ItSU9WIGxhdGVyICovCiAJCWdvdG8gc3Jpb3Y7CkBAIC00OTYyLDYgKzQ2ODIsNyBAQAogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIG91dF91bm1hcF9iYXIwOwogCX0KKwlhZGFwX2lkeCsrOwogCiAJYWRhcHRlci0+d29ya3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiY3hnYjQiKTsKIAlpZiAoIWFkYXB0ZXItPndvcmtxKSB7CkBAIC01MDQ4LDggKzQ3NjksNiBAQAogCQkJICAgICAgVDZfU1RBVE1PREVfVigwKSkpOwogCiAJZm9yX2VhY2hfcG9ydChhZGFwdGVyLCBpKSB7Ci0JCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7Ci0KIAkJbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXZfbXEoc2l6ZW9mKHN0cnVjdCBwb3J0X2luZm8pLAogCQkJCQkgICBNQVhfRVRIX1FTRVRTKTsKIAkJaWYgKCFuZXRkZXYpIHsKQEAgLTUwNjksNyArNDc4OCw4IEBACiAJCW5ldGRldi0+aHdfZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwgVFNPX0ZMQUdTIHwKIAkJCU5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfSVBWNl9DU1VNIHwKIAkJCU5FVElGX0ZfUlhDU1VNIHwgTkVUSUZfRl9SWEhBU0ggfAotCQkJTkVUSUZfRl9IV19WTEFOX0NUQUdfVFggfCBORVRJRl9GX0hXX1ZMQU5fQ1RBR19SWDsKKwkJCU5FVElGX0ZfSFdfVkxBTl9DVEFHX1RYIHwgTkVUSUZfRl9IV19WTEFOX0NUQUdfUlggfAorCQkJTkVUSUZfRl9IV19UQzsKIAkJaWYgKGhpZ2hkbWEpCiAJCQluZXRkZXYtPmh3X2ZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKIAkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBuZXRkZXYtPmh3X2ZlYXR1cmVzOwpAQCAtNTE0MywxMCArNDg2MywyNiBAQAogCQl9CiAJfQogI2VuZGlmCi0JaWYgKGlzX29mZmxvYWQoYWRhcHRlcikgJiYgdGlkX2luaXQoJmFkYXB0ZXItPnRpZHMpIDwgMCkgeworCisJZm9yX2VhY2hfcG9ydChhZGFwdGVyLCBpKSB7CisJCXBpID0gYWRhcDJwaW5mbyhhZGFwdGVyLCBpKTsKKwkJcGktPnNjaGVkX3RibCA9IHQ0X2luaXRfc2NoZWQoYWRhcHRlci0+cGFyYW1zLm5zY2hlZF9jbHMpOworCQlpZiAoIXBpLT5zY2hlZF90YmwpCisJCQlkZXZfd2FybigmcGRldi0+ZGV2LAorCQkJCSAiY291bGQgbm90IGFjdGl2YXRlIHNjaGVkdWxpbmcgb24gcG9ydCAlZFxuIiwKKwkJCQkgaSk7CisJfQorCisJaWYgKHRpZF9pbml0KCZhZGFwdGVyLT50aWRzKSA8IDApIHsKIAkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImNvdWxkIG5vdCBhbGxvY2F0ZSBUSUQgdGFibGUsICIKIAkJCSAiY29udGludWluZ1xuIik7CiAJCWFkYXB0ZXItPnBhcmFtcy5vZmZsb2FkID0gMDsKKwl9IGVsc2UgeworCQlhZGFwdGVyLT50Y191MzIgPSBjeGdiNF9pbml0X3RjX3UzMihhZGFwdGVyLAorCQkJCQkJICAgIENYR0I0X01BWF9MSU5LX0hBTkRMRSk7CisJCWlmICghYWRhcHRlci0+dGNfdTMyKQorCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwKKwkJCQkgImNvdWxkIG5vdCBvZmZsb2FkIHRjIHUzMiwgY29udGludWluZ1xuIik7CiAJfQogCiAJaWYgKGlzX29mZmxvYWQoYWRhcHRlcikpIHsKQEAgLTUxNjgsOCArNDkwNCwxMSBAQAogCS8qIFNlZSB3aGF0IGludGVycnVwdHMgd2UnbGwgYmUgdXNpbmcgKi8KIAlpZiAobXNpID4gMSAmJiBlbmFibGVfbXNpeChhZGFwdGVyKSA9PSAwKQogCQlhZGFwdGVyLT5mbGFncyB8PSBVU0lOR19NU0lYOwotCWVsc2UgaWYgKG1zaSA+IDAgJiYgcGNpX2VuYWJsZV9tc2kocGRldikgPT0gMCkKKwllbHNlIGlmIChtc2kgPiAwICYmIHBjaV9lbmFibGVfbXNpKHBkZXYpID09IDApIHsKIAkJYWRhcHRlci0+ZmxhZ3MgfD0gVVNJTkdfTVNJOworCQlpZiAobXNpID4gMSkKKwkJCWZyZWVfbXNpeF9pbmZvKGFkYXB0ZXIpOworCX0KIAogCS8qIGNoZWNrIGZvciBQQ0kgRXhwcmVzcyBiYW5kd2lkdGggY2FwYWJpbHRpdGVzICovCiAJY3hnYjRfY2hlY2tfcGNpZV9jYXBzKGFkYXB0ZXIpOwpAQCAtNTIxMywxMCArNDk1MiwxNSBAQAogCS8qIFBDSWUgRUVIIHJlY292ZXJ5IG9uIHBvd2VycGMgcGxhdGZvcm1zIG5lZWRzIGZ1bmRhbWVudGFsIHJlc2V0ICovCiAJcGRldi0+bmVlZHNfZnJlc2V0ID0gMTsKIAotCWlmIChpc19vZmZsb2FkKGFkYXB0ZXIpKQotCQlhdHRhY2hfdWxkcyhhZGFwdGVyKTsKKwlpZiAoaXNfdWxkKGFkYXB0ZXIpKSB7CisJCW11dGV4X2xvY2soJnVsZF9tdXRleCk7CisJCWxpc3RfYWRkX3RhaWwoJmFkYXB0ZXItPmxpc3Rfbm9kZSwgJmFkYXB0ZXJfbGlzdCk7CisJCW11dGV4X3VubG9jaygmdWxkX211dGV4KTsKKwl9CiAKIAlwcmludF9hZGFwdGVyX2luZm8oYWRhcHRlcik7CisJc2V0dXBfZndfc2dlX3F1ZXVlcyhhZGFwdGVyKTsKKwlyZXR1cm4gMDsKIAogc3Jpb3Y6CiAjaWZkZWYgQ09ORklHX1BDSV9JT1YKQEAgLTUyMzAsMTEgKzQ5NzQsNDggQEAKIAkJCQkgImluc3RhbnRpYXRlZCAldSB2aXJ0dWFsIGZ1bmN0aW9uc1xuIiwKIAkJCQkgbnVtX3ZmW2Z1bmNdKTsKIAl9Ci0jZW5kaWYKKworCWFkYXB0ZXIgPSBremFsbG9jKHNpemVvZigqYWRhcHRlciksIEdGUF9LRVJORUwpOworCWlmICghYWRhcHRlcikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGZyZWVfcGNpX3JlZ2lvbjsKKwl9CisKKwlhZGFwdGVyLT5wZGV2ID0gcGRldjsKKwlhZGFwdGVyLT5wZGV2X2RldiA9ICZwZGV2LT5kZXY7CisJYWRhcHRlci0+bmFtZSA9IHBjaV9uYW1lKHBkZXYpOworCWFkYXB0ZXItPm1ib3ggPSBmdW5jOworCWFkYXB0ZXItPnBmID0gZnVuYzsKKwlhZGFwdGVyLT5yZWdzID0gcmVnczsKKwlhZGFwdGVyLT5hZGFwX2lkeCA9IGFkYXBfaWR4OworCWFkYXB0ZXItPm1ib3hfbG9nID0ga3phbGxvYyhzaXplb2YoKmFkYXB0ZXItPm1ib3hfbG9nKSArCisJCQkJICAgIChzaXplb2Yoc3RydWN0IG1ib3hfY21kKSAqCisJCQkJICAgICBUNF9PU19MT0dfTUJPWF9DTURTKSwKKwkJCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFhZGFwdGVyLT5tYm94X2xvZykgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGZyZWVfYWRhcHRlcjsKKwl9CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGFkYXB0ZXIpOwogCXJldHVybiAwOwogCisgZnJlZV9hZGFwdGVyOgorCWtmcmVlKGFkYXB0ZXIpOworIGZyZWVfcGNpX3JlZ2lvbjoKKwlpb3VubWFwKHJlZ3MpOworCXBjaV9kaXNhYmxlX3NyaW92KHBkZXYpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcmV0dXJuIGVycjsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKKwogIG91dF9mcmVlX2RldjoKIAlmcmVlX3NvbWVfcmVzb3VyY2VzKGFkYXB0ZXIpOworCWlmIChhZGFwdGVyLT5mbGFncyAmIFVTSU5HX01TSVgpCisJCWZyZWVfbXNpeF9pbmZvKGFkYXB0ZXIpOworCWlmIChhZGFwdGVyLT5udW1fdWxkIHx8IGFkYXB0ZXItPm51bV9vZmxkX3VsZCkKKwkJdDRfdWxkX21lbV9mcmVlKGFkYXB0ZXIpOwogIG91dF91bm1hcF9iYXI6CiAJaWYgKCFpc190NChhZGFwdGVyLT5wYXJhbXMuY2hpcCkpCiAJCWlvdW5tYXAoYWRhcHRlci0+YmFyMik7CkBAIC01MjU4LDEyICs1MDM5LDEyIEBACiB7CiAJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAKLSNpZmRlZiBDT05GSUdfUENJX0lPVgotCXBjaV9kaXNhYmxlX3NyaW92KHBkZXYpOworCWlmICghYWRhcHRlcikgeworCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCQlyZXR1cm47CisJfQogCi0jZW5kaWYKLQotCWlmIChhZGFwdGVyKSB7CisJaWYgKGFkYXB0ZXItPnBmID09IDQpIHsKIAkJaW50IGk7CiAKIAkJLyogVGVhciBkb3duIHBlci1hZGFwdGVyIFdvcmsgUXVldWUgZmlyc3Qgc2luY2UgaXQgY2FuIGNvbnRhaW4KQEAgLTUyNzEsNyArNTA1Miw3IEBACiAJCSAqLwogCQlkZXN0cm95X3dvcmtxdWV1ZShhZGFwdGVyLT53b3JrcSk7CiAKLQkJaWYgKGlzX29mZmxvYWQoYWRhcHRlcikpCisJCWlmIChpc191bGQoYWRhcHRlcikpCiAJCQlkZXRhY2hfdWxkcyhhZGFwdGVyKTsKIAogCQlkaXNhYmxlX2ludGVycnVwdHMoYWRhcHRlcik7CkBAIC01Mjg1LDE3ICs1MDY2LDE1IEBACiAJCS8qIElmIHdlIGFsbG9jYXRlZCBmaWx0ZXJzLCBmcmVlIHVwIHN0YXRlIGFzc29jaWF0ZWQgd2l0aCBhbnkKIAkJICogdmFsaWQgZmlsdGVycyAuLi4KIAkJICovCi0JCWlmIChhZGFwdGVyLT50aWRzLmZ0aWRfdGFiKSB7Ci0JCQlzdHJ1Y3QgZmlsdGVyX2VudHJ5ICpmID0gJmFkYXB0ZXItPnRpZHMuZnRpZF90YWJbMF07Ci0JCQlmb3IgKGkgPSAwOyBpIDwgKGFkYXB0ZXItPnRpZHMubmZ0aWRzICsKLQkJCQkJYWRhcHRlci0+dGlkcy5uc2Z0aWRzKTsgaSsrLCBmKyspCi0JCQkJaWYgKGYtPnZhbGlkKQotCQkJCQljbGVhcl9maWx0ZXIoYWRhcHRlciwgZik7Ci0JCX0KKwkJY2xlYXJfYWxsX2ZpbHRlcnMoYWRhcHRlcik7CiAKIAkJaWYgKGFkYXB0ZXItPmZsYWdzICYgRlVMTF9JTklUX0RPTkUpCiAJCQljeGdiX2Rvd24oYWRhcHRlcik7CiAKKwkJaWYgKGFkYXB0ZXItPmZsYWdzICYgVVNJTkdfTVNJWCkKKwkJCWZyZWVfbXNpeF9pbmZvKGFkYXB0ZXIpOworCQlpZiAoYWRhcHRlci0+bnVtX3VsZCB8fCBhZGFwdGVyLT5udW1fb2ZsZF91bGQpCisJCQl0NF91bGRfbWVtX2ZyZWUoYWRhcHRlcik7CiAJCWZyZWVfc29tZV9yZXNvdXJjZXMoYWRhcHRlcik7CiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAkJdDRfY2xlYW51cF9jbGlwX3RibChhZGFwdGVyKTsKQEAgLTUzMTIsOCArNTA5MSw2NCBAQAogCQlrZnJlZShhZGFwdGVyLT5tYm94X2xvZyk7CiAJCXN5bmNocm9uaXplX3JjdSgpOwogCQlrZnJlZShhZGFwdGVyKTsKLQl9IGVsc2UKKwl9CisjaWZkZWYgQ09ORklHX1BDSV9JT1YKKwllbHNlIHsKKwkJaWYgKGFkYXB0ZXItPnBvcnRbMF0pCisJCQl1bnJlZ2lzdGVyX25ldGRldihhZGFwdGVyLT5wb3J0WzBdKTsKKwkJaW91bm1hcChhZGFwdGVyLT5yZWdzKTsKKwkJa2ZyZWUoYWRhcHRlci0+dmZpbmZvKTsKKwkJa2ZyZWUoYWRhcHRlcik7CisJCXBjaV9kaXNhYmxlX3NyaW92KHBkZXYpOwogCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCX0KKyNlbmRpZgorfQorCisvKiAiU2h1dGRvd24iIHF1aWVzY2VzIHRoZSBkZXZpY2UsIHN0b3BwaW5nIEluZ3Jlc3MgUGFja2V0IGFuZCBJbnRlcnJ1cHQKKyAqIGRlbGl2ZXJ5LiAgVGhpcyBpcyBlc3NlbnRpYWxseSBhIHN0cmlwcGVkIGRvd24gdmVyc2lvbiBvZiB0aGUgUENJIHJlbW92ZSgpCisgKiBmdW5jdGlvbiB3aGVyZSB3ZSBkbyB0aGUgbWluaW1hbCBhbW91bnQgb2Ygd29yayBuZWNlc3NhcnkgdG8gc2h1dGRvd24gYW55CisgKiBmdXJ0aGVyIGFjdGl2aXR5LgorICovCitzdGF0aWMgdm9pZCBzaHV0ZG93bl9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwkvKiBBcyB3aXRoIHJlbW92ZV9vbmUoKSBhYm92ZSAoc2VlIGV4dGVuZGVkIGNvbW1lbnQpLCB3ZSBvbmx5IHdhbnQgZG8KKwkgKiBkbyBjbGVhbnVwIG9uIFBDSSBEZXZpY2VzIHdoaWNoIHdlbnQgYWxsIHRoZSB3YXkgdGhyb3VnaCBpbml0X29uZSgpCisJICogLi4uCisJICovCisJaWYgKCFhZGFwdGVyKSB7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoYWRhcHRlci0+cGYgPT0gNCkgeworCQlpbnQgaTsKKworCQlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpCisJCQlpZiAoYWRhcHRlci0+cG9ydFtpXS0+cmVnX3N0YXRlID09IE5FVFJFR19SRUdJU1RFUkVEKQorCQkJCWN4Z2JfY2xvc2UoYWRhcHRlci0+cG9ydFtpXSk7CisKKwkJdDRfdWxkX2NsZWFuX3VwKGFkYXB0ZXIpOworCQlkaXNhYmxlX2ludGVycnVwdHMoYWRhcHRlcik7CisJCWRpc2FibGVfbXNpKGFkYXB0ZXIpOworCisJCXQ0X3NnZV9zdG9wKGFkYXB0ZXIpOworCQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBGV19PSykKKwkJCXQ0X2Z3X2J5ZShhZGFwdGVyLCBhZGFwdGVyLT5tYm94KTsKKwl9CisjaWZkZWYgQ09ORklHX1BDSV9JT1YKKwllbHNlIHsKKwkJaWYgKGFkYXB0ZXItPnBvcnRbMF0pCisJCQl1bnJlZ2lzdGVyX25ldGRldihhZGFwdGVyLT5wb3J0WzBdKTsKKwkJaW91bm1hcChhZGFwdGVyLT5yZWdzKTsKKwkJa2ZyZWUoYWRhcHRlci0+dmZpbmZvKTsKKwkJa2ZyZWUoYWRhcHRlcik7CisJCXBjaV9kaXNhYmxlX3NyaW92KHBkZXYpOworCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCX0KKyNlbmRpZgogfQogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgY3hnYjRfZHJpdmVyID0gewpAQCAtNTMyMSw3ICs1MTU2LDcgQEAKIAkuaWRfdGFibGUgPSBjeGdiNF9wY2lfdGJsLAogCS5wcm9iZSAgICA9IGluaXRfb25lLAogCS5yZW1vdmUgICA9IHJlbW92ZV9vbmUsCi0JLnNodXRkb3duID0gcmVtb3ZlX29uZSwKKwkuc2h1dGRvd24gPSBzaHV0ZG93bl9vbmUsCiAjaWZkZWYgQ09ORklHX1BDSV9JT1YKIAkuc3Jpb3ZfY29uZmlndXJlID0gY3hnYjRfaW92X2NvbmZpZ3VyZSwKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF90Y191MzIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfdGNfdTMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlkMmRlYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfdGNfdTMyLmMKQEAgLTAsMCArMSw0ODMgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQ2hlbHNpbyBUNCBFdGhlcm5ldCBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8bmV0L3RjX2FjdC90Y19nYWN0Lmg+CisjaW5jbHVkZSA8bmV0L3RjX2FjdC90Y19taXJyZWQuaD4KKworI2luY2x1ZGUgImN4Z2I0LmgiCisjaW5jbHVkZSAiY3hnYjRfdGNfdTMyX3BhcnNlLmgiCisjaW5jbHVkZSAiY3hnYjRfdGNfdTMyLmgiCisKKy8qIEZpbGwgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gd2l0aCBwYXJzZWQgbWF0Y2ggdmFsdWUvbWFzayBwYWlyLiAqLworc3RhdGljIGludCBmaWxsX21hdGNoX2ZpZWxkcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCwKKwkJCSAgICAgc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uICpmcywKKwkJCSAgICAgc3RydWN0IHRjX2Nsc191MzJfb2ZmbG9hZCAqY2xzLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgY3hnYjRfbWF0Y2hfZmllbGQgKmVudHJ5LAorCQkJICAgICBib29sIG5leHRfaGVhZGVyKQoreworCXVuc2lnbmVkIGludCBpLCBqOworCXUzMiB2YWwsIG1hc2s7CisJaW50IG9mZiwgZXJyOworCWJvb2wgZm91bmQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2xzLT5rbm9kZS5zZWwtPm5rZXlzOyBpKyspIHsKKwkJb2ZmID0gY2xzLT5rbm9kZS5zZWwtPmtleXNbaV0ub2ZmOworCQl2YWwgPSBjbHMtPmtub2RlLnNlbC0+a2V5c1tpXS52YWw7CisJCW1hc2sgPSBjbHMtPmtub2RlLnNlbC0+a2V5c1tpXS5tYXNrOworCisJCWlmIChuZXh0X2hlYWRlcikgeworCQkJLyogRm9yIG5leHQgaGVhZGVycywgcGFyc2Ugb25seSBrZXlzIHdpdGggb2ZmbWFzayAqLworCQkJaWYgKCFjbHMtPmtub2RlLnNlbC0+a2V5c1tpXS5vZmZtYXNrKQorCQkJCWNvbnRpbnVlOworCQl9IGVsc2UgeworCQkJLyogRm9yIHRoZSByZW1haW5pbmcsIHBhcnNlIG9ubHkga2V5cyB3aXRob3V0IG9mZm1hc2sgKi8KKwkJCWlmIChjbHMtPmtub2RlLnNlbC0+a2V5c1tpXS5vZmZtYXNrKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJZm91bmQgPSBmYWxzZTsKKworCQlmb3IgKGogPSAwOyBlbnRyeVtqXS52YWw7IGorKykgeworCQkJaWYgKG9mZiA9PSBlbnRyeVtqXS5vZmYpIHsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQkJZXJyID0gZW50cnlbal0udmFsKGZzLCB2YWwsIG1hc2spOworCQkJCWlmIChlcnIpCisJCQkJCXJldHVybiBlcnI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoIWZvdW5kKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIEZpbGwgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gd2l0aCBwYXJzZWQgYWN0aW9uLiAqLworc3RhdGljIGludCBmaWxsX2FjdGlvbl9maWVsZHMoc3RydWN0IGFkYXB0ZXIgKmFkYXAsCisJCQkgICAgICBzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gKmZzLAorCQkJICAgICAgc3RydWN0IHRjX2Nsc191MzJfb2ZmbG9hZCAqY2xzKQoreworCXVuc2lnbmVkIGludCBudW1fYWN0aW9ucyA9IDA7CisJY29uc3Qgc3RydWN0IHRjX2FjdGlvbiAqYTsKKwlzdHJ1Y3QgdGNmX2V4dHMgKmV4dHM7CisJTElTVF9IRUFEKGFjdGlvbnMpOworCisJZXh0cyA9IGNscy0+a25vZGUuZXh0czsKKwlpZiAodGNfbm9fYWN0aW9ucyhleHRzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0Y2ZfZXh0c190b19saXN0KGV4dHMsICZhY3Rpb25zKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGEsICZhY3Rpb25zLCBsaXN0KSB7CisJCS8qIERvbid0IGFsbG93IG1vcmUgdGhhbiBvbmUgYWN0aW9uIHBlciBydWxlLiAqLworCQlpZiAobnVtX2FjdGlvbnMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkvKiBEcm9wIGluIGhhcmR3YXJlLiAqLworCQlpZiAoaXNfdGNmX2dhY3Rfc2hvdChhKSkgeworCQkJZnMtPmFjdGlvbiA9IEZJTFRFUl9EUk9QOworCQkJbnVtX2FjdGlvbnMrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogUmUtZGlyZWN0IHRvIHNwZWNpZmllZCBwb3J0IGluIGhhcmR3YXJlLiAqLworCQlpZiAoaXNfdGNmX21pcnJlZF9yZWRpcmVjdChhKSkgeworCQkJc3RydWN0IG5ldF9kZXZpY2UgKm5fZGV2OworCQkJdW5zaWduZWQgaW50IGksIGluZGV4OworCQkJYm9vbCBmb3VuZCA9IGZhbHNlOworCisJCQlpbmRleCA9IHRjZl9taXJyZWRfaWZpbmRleChhKTsKKwkJCWZvcl9lYWNoX3BvcnQoYWRhcCwgaSkgeworCQkJCW5fZGV2ID0gYWRhcC0+cG9ydFtpXTsKKwkJCQlpZiAoaW5kZXggPT0gbl9kZXYtPmlmaW5kZXgpIHsKKwkJCQkJZnMtPmFjdGlvbiA9IEZJTFRFUl9TV0lUQ0g7CisJCQkJCWZzLT5lcG9ydCA9IGk7CisJCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQkvKiBJbnRlcmZhY2UgZG9lc24ndCBiZWxvbmcgdG8gYW55IHBvcnQgb2YKKwkJCSAqIHRoZSB1bmRlcmx5aW5nIGhhcmR3YXJlLgorCQkJICovCisJCQlpZiAoIWZvdW5kKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQludW1fYWN0aW9ucysrOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBVbi1zdXBwb3J0ZWQgYWN0aW9uLiAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGN4Z2I0X2NvbmZpZ19rbm9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX2JlMTYgcHJvdG9jb2wsCisJCSAgICAgICBzdHJ1Y3QgdGNfY2xzX3UzMl9vZmZsb2FkICpjbHMpCit7CisJY29uc3Qgc3RydWN0IGN4Z2I0X21hdGNoX2ZpZWxkICpzdGFydCwgKmxpbmtfc3RhcnQgPSBOVUxMOworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2MmFkYXAoZGV2KTsKKwlzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gZnM7CisJc3RydWN0IGN4Z2I0X3RjX3UzMl90YWJsZSAqdDsKKwlzdHJ1Y3QgY3hnYjRfbGluayAqbGluazsKKwl1bnNpZ25lZCBpbnQgZmlsdGVyX2lkOworCXUzMiB1aHRpZCwgbGlua191aHRpZDsKKwlib29sIGlzX2lwdjYgPSBmYWxzZTsKKwlpbnQgcmV0OworCisJaWYgKCFjYW5fdGNfdTMyX29mZmxvYWQoZGV2KSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKHByb3RvY29sICE9IGh0b25zKEVUSF9QX0lQKSAmJiBwcm90b2NvbCAhPSBodG9ucyhFVEhfUF9JUFY2KSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJLyogRmV0Y2ggdGhlIGxvY2F0aW9uIHRvIGluc2VydCB0aGUgZmlsdGVyLiAqLworCWZpbHRlcl9pZCA9IGNscy0+a25vZGUuaGFuZGxlICYgMHhGRkZGRjsKKworCWlmIChmaWx0ZXJfaWQgPiBhZGFwdGVyLT50aWRzLm5mdGlkcykgeworCQlkZXZfZXJyKGFkYXB0ZXItPnBkZXZfZGV2LAorCQkJIkxvY2F0aW9uICVkIG91dCBvZiByYW5nZSBmb3IgaW5zZXJ0aW9uLiBNYXg6ICVkXG4iLAorCQkJZmlsdGVyX2lkLCBhZGFwdGVyLT50aWRzLm5mdGlkcyk7CisJCXJldHVybiAtRVJBTkdFOworCX0KKworCXQgPSBhZGFwdGVyLT50Y191MzI7CisJdWh0aWQgPSBUQ19VMzJfVVNFUkhUSUQoY2xzLT5rbm9kZS5oYW5kbGUpOworCWxpbmtfdWh0aWQgPSBUQ19VMzJfVVNFUkhUSUQoY2xzLT5rbm9kZS5saW5rX2hhbmRsZSk7CisKKwkvKiBFbnN1cmUgdGhhdCB1aHRpZCBpcyBlaXRoZXIgcm9vdCB1MzIgKGkuZS4gMHg4MDApCisJICogb3IgYSBhIHZhbGlkIGxpbmtlZCBidWNrZXQuCisJICovCisJaWYgKHVodGlkICE9IDB4ODAwICYmIHVodGlkID49IHQtPnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRW5zdXJlIGxpbmsgaGFuZGxlIHVodGlkIGlzIHNhbmUsIGlmIHNwZWNpZmllZC4gKi8KKwlpZiAobGlua191aHRpZCA+PSB0LT5zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldCgmZnMsIDAsIHNpemVvZihmcykpOworCisJaWYgKHByb3RvY29sID09IGh0b25zKEVUSF9QX0lQVjYpKSB7CisJCXN0YXJ0ID0gY3hnYjRfaXB2Nl9maWVsZHM7CisJCWlzX2lwdjYgPSB0cnVlOworCX0gZWxzZSB7CisJCXN0YXJ0ID0gY3hnYjRfaXB2NF9maWVsZHM7CisJCWlzX2lwdjYgPSBmYWxzZTsKKwl9CisKKwlpZiAodWh0aWQgIT0gMHg4MDApIHsKKwkJLyogTGluayBtdXN0IGV4aXN0IGZyb20gcm9vdCBub2RlIGJlZm9yZSBpbnNlcnRpb24uICovCisJCWlmICghdC0+dGFibGVbdWh0aWQgLSAxXS5saW5rX2hhbmRsZSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qIExpbmsgbXVzdCBoYXZlIGEgdmFsaWQgc3VwcG9ydGVkIG5leHQgaGVhZGVyLiAqLworCQlsaW5rX3N0YXJ0ID0gdC0+dGFibGVbdWh0aWQgLSAxXS5tYXRjaF9maWVsZDsKKwkJaWYgKCFsaW5rX3N0YXJ0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogUGFyc2UgbGlua3MgYW5kIHJlY29yZCB0aGVtIGZvciBzdWJzZXF1ZW50IGp1bXBzIHRvIHZhbGlkCisJICogbmV4dCBoZWFkZXJzLgorCSAqLworCWlmIChsaW5rX3VodGlkKSB7CisJCWNvbnN0IHN0cnVjdCBjeGdiNF9uZXh0X2hlYWRlciAqbmV4dDsKKwkJYm9vbCBmb3VuZCA9IGZhbHNlOworCQl1bnNpZ25lZCBpbnQgaSwgajsKKwkJdTMyIHZhbCwgbWFzazsKKwkJaW50IG9mZjsKKworCQlpZiAodC0+dGFibGVbbGlua191aHRpZCAtIDFdLmxpbmtfaGFuZGxlKSB7CisJCQlkZXZfZXJyKGFkYXB0ZXItPnBkZXZfZGV2LAorCQkJCSJMaW5rIGhhbmRsZSBleGlzdHMgZm9yOiAweCV4XG4iLAorCQkJCWxpbmtfdWh0aWQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQluZXh0ID0gaXNfaXB2NiA/IGN4Z2I0X2lwdjZfanVtcHMgOiBjeGdiNF9pcHY0X2p1bXBzOworCisJCS8qIFRyeSB0byBmaW5kIG1hdGNoZXMgdGhhdCBhbGxvdyBqdW1wcyB0byBuZXh0IGhlYWRlci4gKi8KKwkJZm9yIChpID0gMDsgbmV4dFtpXS5qdW1wOyBpKyspIHsKKwkJCWlmIChuZXh0W2ldLm9mZm9mZiAhPSBjbHMtPmtub2RlLnNlbC0+b2Zmb2ZmIHx8CisJCQkgICAgbmV4dFtpXS5zaGlmdCAhPSBjbHMtPmtub2RlLnNlbC0+b2Zmc2hpZnQgfHwKKwkJCSAgICBuZXh0W2ldLm1hc2sgIT0gY2xzLT5rbm9kZS5zZWwtPm9mZm1hc2sgfHwKKwkJCSAgICBuZXh0W2ldLm9mZnNldCAhPSBjbHMtPmtub2RlLnNlbC0+b2ZmKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBGb3VuZCBhIHBvc3NpYmxlIGNhbmRpZGF0ZS4gIEZpbmQgYSBrZXkgdGhhdAorCQkJICogbWF0Y2hlcyB0aGUgY29ycmVzcG9uZGluZyBvZmZzZXQsIHZhbHVlLCBhbmQKKwkJCSAqIG1hc2sgdG8ganVtcCB0byBuZXh0IGhlYWRlci4KKwkJCSAqLworCQkJZm9yIChqID0gMDsgaiA8IGNscy0+a25vZGUuc2VsLT5ua2V5czsgaisrKSB7CisJCQkJb2ZmID0gY2xzLT5rbm9kZS5zZWwtPmtleXNbal0ub2ZmOworCQkJCXZhbCA9IGNscy0+a25vZGUuc2VsLT5rZXlzW2pdLnZhbDsKKwkJCQltYXNrID0gY2xzLT5rbm9kZS5zZWwtPmtleXNbal0ubWFzazsKKworCQkJCWlmIChuZXh0W2ldLm1hdGNoX29mZiA9PSBvZmYgJiYKKwkJCQkgICAgbmV4dFtpXS5tYXRjaF92YWwgPT0gdmFsICYmCisJCQkJICAgIG5leHRbaV0ubWF0Y2hfbWFzayA9PSBtYXNrKSB7CisJCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAoIWZvdW5kKQorCQkJCWNvbnRpbnVlOyAvKiBUcnkgbmV4dCBjYW5kaWRhdGUuICovCisKKwkJCS8qIENhbmRpZGF0ZSB0byBqdW1wIHRvIG5leHQgaGVhZGVyIGZvdW5kLgorCQkJICogVHJhbnNsYXRlIGFsbCBrZXlzIHRvIGludGVybmFsIHNwZWNpZmljYXRpb24KKwkJCSAqIGFuZCBzdG9yZSB0aGVtIGluIGp1bXAgdGFibGUuIFRoaXMgc3BlYyBpcyBjb3BpZWQKKwkJCSAqIGxhdGVyIHRvIHNldCB0aGUgYWN0dWFsIGZpbHRlcnMuCisJCQkgKi8KKwkJCXJldCA9IGZpbGxfbWF0Y2hfZmllbGRzKGFkYXB0ZXIsICZmcywgY2xzLAorCQkJCQkJc3RhcnQsIGZhbHNlKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBvdXQ7CisKKwkJCWxpbmsgPSAmdC0+dGFibGVbbGlua191aHRpZCAtIDFdOworCQkJbGluay0+bWF0Y2hfZmllbGQgPSBuZXh0W2ldLmp1bXA7CisJCQlsaW5rLT5saW5rX2hhbmRsZSA9IGNscy0+a25vZGUuaGFuZGxlOworCQkJbWVtY3B5KCZsaW5rLT5mcywgJmZzLCBzaXplb2YoZnMpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogTm8gY2FuZGlkYXRlIGZvdW5kIHRvIGp1bXAgdG8gbmV4dCBoZWFkZXIuICovCisJCWlmICghZm91bmQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBGaWxsIGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uIG1hdGNoIGZpZWxkcyB0byBiZSBzaGlwcGVkIHRvIGhhcmR3YXJlLgorCSAqIENvcHkgdGhlIGxpbmtlZCBzcGVjIChpZiBhbnkpIGZpcnN0LiAgQW5kIHRoZW4gdXBkYXRlIHRoZSBzcGVjIGFzCisJICogbmVlZGVkLgorCSAqLworCWlmICh1aHRpZCAhPSAweDgwMCAmJiB0LT50YWJsZVt1aHRpZCAtIDFdLmxpbmtfaGFuZGxlKSB7CisJCS8qIENvcHkgbGlua2VkIGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uICovCisJCW1lbWNweSgmZnMsICZ0LT50YWJsZVt1aHRpZCAtIDFdLmZzLCBzaXplb2YoZnMpKTsKKwkJcmV0ID0gZmlsbF9tYXRjaF9maWVsZHMoYWRhcHRlciwgJmZzLCBjbHMsCisJCQkJCWxpbmtfc3RhcnQsIHRydWUpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gZmlsbF9tYXRjaF9maWVsZHMoYWRhcHRlciwgJmZzLCBjbHMsIHN0YXJ0LCBmYWxzZSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwkvKiBGaWxsIGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uIGFjdGlvbiBmaWVsZHMgdG8gYmUgc2hpcHBlZCB0bworCSAqIGhhcmR3YXJlLgorCSAqLworCXJldCA9IGZpbGxfYWN0aW9uX2ZpZWxkcyhhZGFwdGVyLCAmZnMsIGNscyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwkvKiBUaGUgZmlsdGVyIHNwZWMgaGFzIGJlZW4gY29tcGxldGVseSBidWlsdCBmcm9tIHRoZSBpbmZvCisJICogcHJvdmlkZWQgZnJvbSB1MzIuICBXZSBub3cgc2V0IHNvbWUgZGVmYXVsdCBmaWVsZHMgaW4gdGhlCisJICogc3BlYyBmb3Igc2FuaXR5LgorCSAqLworCisJLyogTWF0Y2ggb25seSBwYWNrZXRzIGNvbWluZyBmcm9tIHRoZSBpbmdyZXNzIHBvcnQgd2hlcmUgdGhpcworCSAqIGZpbHRlciB3aWxsIGJlIGNyZWF0ZWQuCisJICovCisJZnMudmFsLmlwb3J0ID0gbmV0ZGV2MnBpbmZvKGRldiktPnBvcnRfaWQ7CisJZnMubWFzay5pcG9ydCA9IH4wOworCisJLyogRW5hYmxlIGZpbHRlciBoaXQgY291bnRzLiAqLworCWZzLmhpdGNudHMgPSAxOworCisJLyogU2V0IHR5cGUgb2YgZmlsdGVyIC0gSVB2NiBvciBJUHY0ICovCisJZnMudHlwZSA9IGlzX2lwdjYgPyAxIDogMDsKKworCS8qIFNldCB0aGUgZmlsdGVyICovCisJcmV0ID0gY3hnYjRfc2V0X2ZpbHRlcihkZXYsIGZpbHRlcl9pZCwgJmZzKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCS8qIElmIHRoaXMgaXMgYSBsaW5rZWQgYnVja2V0LCB0aGVuIHNldCB0aGUgY29ycmVzcG9uZGluZworCSAqIGVudHJ5IGluIHRoZSBiaXRtYXAgdG8gbWFyayBpdCBhcyBiZWxvbmdpbmcgdG8gdGhpcyBsaW5rZWQKKwkgKiBidWNrZXQuCisJICovCisJaWYgKHVodGlkICE9IDB4ODAwICYmIHQtPnRhYmxlW3VodGlkIC0gMV0ubGlua19oYW5kbGUpCisJCXNldF9iaXQoZmlsdGVyX2lkLCB0LT50YWJsZVt1aHRpZCAtIDFdLnRpZF9tYXApOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworaW50IGN4Z2I0X2RlbGV0ZV9rbm9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX2JlMTYgcHJvdG9jb2wsCisJCSAgICAgICBzdHJ1Y3QgdGNfY2xzX3UzMl9vZmZsb2FkICpjbHMpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYyYWRhcChkZXYpOworCXVuc2lnbmVkIGludCBmaWx0ZXJfaWQsIG1heF90aWRzLCBpLCBqOworCXN0cnVjdCBjeGdiNF9saW5rICpsaW5rID0gTlVMTDsKKwlzdHJ1Y3QgY3hnYjRfdGNfdTMyX3RhYmxlICp0OworCXUzMiBoYW5kbGUsIHVodGlkOworCWludCByZXQ7CisKKwlpZiAoIWNhbl90Y191MzJfb2ZmbG9hZChkZXYpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkvKiBGZXRjaCB0aGUgbG9jYXRpb24gdG8gZGVsZXRlIHRoZSBmaWx0ZXIuICovCisJZmlsdGVyX2lkID0gY2xzLT5rbm9kZS5oYW5kbGUgJiAweEZGRkZGOworCisJaWYgKGZpbHRlcl9pZCA+IGFkYXB0ZXItPnRpZHMubmZ0aWRzKSB7CisJCWRldl9lcnIoYWRhcHRlci0+cGRldl9kZXYsCisJCQkiTG9jYXRpb24gJWQgb3V0IG9mIHJhbmdlIGZvciBkZWxldGlvbi4gTWF4OiAlZFxuIiwKKwkJCWZpbHRlcl9pZCwgYWRhcHRlci0+dGlkcy5uZnRpZHMpOworCQlyZXR1cm4gLUVSQU5HRTsKKwl9CisKKwl0ID0gYWRhcHRlci0+dGNfdTMyOworCWhhbmRsZSA9IGNscy0+a25vZGUuaGFuZGxlOworCXVodGlkID0gVENfVTMyX1VTRVJIVElEKGNscy0+a25vZGUuaGFuZGxlKTsKKworCS8qIEVuc3VyZSB0aGF0IHVodGlkIGlzIGVpdGhlciByb290IHUzMiAoaS5lLiAweDgwMCkKKwkgKiBvciBhIGEgdmFsaWQgbGlua2VkIGJ1Y2tldC4KKwkgKi8KKwlpZiAodWh0aWQgIT0gMHg4MDAgJiYgdWh0aWQgPj0gdC0+c2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBEZWxldGUgdGhlIHNwZWNpZmllZCBmaWx0ZXIgKi8KKwlpZiAodWh0aWQgIT0gMHg4MDApIHsKKwkJbGluayA9ICZ0LT50YWJsZVt1aHRpZCAtIDFdOworCQlpZiAoIWxpbmstPmxpbmtfaGFuZGxlKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKCF0ZXN0X2JpdChmaWx0ZXJfaWQsIGxpbmstPnRpZF9tYXApKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gY3hnYjRfZGVsX2ZpbHRlcihkZXYsIGZpbHRlcl9pZCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlpZiAobGluaykKKwkJY2xlYXJfYml0KGZpbHRlcl9pZCwgbGluay0+dGlkX21hcCk7CisKKwkvKiBJZiBhIGxpbmsgaXMgYmVpbmcgZGVsZXRlZCwgdGhlbiBkZWxldGUgYWxsIGZpbHRlcnMKKwkgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmsuCisJICovCisJbWF4X3RpZHMgPSBhZGFwdGVyLT50aWRzLm5mdGlkczsKKwlmb3IgKGkgPSAwOyBpIDwgdC0+c2l6ZTsgaSsrKSB7CisJCWxpbmsgPSAmdC0+dGFibGVbaV07CisKKwkJaWYgKGxpbmstPmxpbmtfaGFuZGxlID09IGhhbmRsZSkgeworCQkJZm9yIChqID0gMDsgaiA8IG1heF90aWRzOyBqKyspIHsKKwkJCQlpZiAoIXRlc3RfYml0KGosIGxpbmstPnRpZF9tYXApKQorCQkJCQljb250aW51ZTsKKworCQkJCXJldCA9IF9fY3hnYjRfZGVsX2ZpbHRlcihkZXYsIGosIE5VTEwpOworCQkJCWlmIChyZXQpCisJCQkJCWdvdG8gb3V0OworCisJCQkJY2xlYXJfYml0KGosIGxpbmstPnRpZF9tYXApOworCQkJfQorCisJCQkvKiBDbGVhciB0aGUgbGluayBzdGF0ZSAqLworCQkJbGluay0+bWF0Y2hfZmllbGQgPSBOVUxMOworCQkJbGluay0+bGlua19oYW5kbGUgPSAwOworCQkJbWVtc2V0KCZsaW5rLT5mcywgMCwgc2l6ZW9mKGxpbmstPmZzKSk7CisJCQlicmVhazsKKwkJfQorCX0KKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgY3hnYjRfY2xlYW51cF90Y191MzIoc3RydWN0IGFkYXB0ZXIgKmFkYXApCit7CisJc3RydWN0IGN4Z2I0X3RjX3UzMl90YWJsZSAqdDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICghYWRhcC0+dGNfdTMyKQorCQlyZXR1cm47CisKKwkvKiBGcmVlIHVwIGFsbCBhbGxvY2F0ZWQgbWVtb3J5LiAqLworCXQgPSBhZGFwLT50Y191MzI7CisJZm9yIChpID0gMDsgaSA8IHQtPnNpemU7IGkrKykgeworCQlzdHJ1Y3QgY3hnYjRfbGluayAqbGluayA9ICZ0LT50YWJsZVtpXTsKKworCQl0NF9mcmVlX21lbShsaW5rLT50aWRfbWFwKTsKKwl9CisJdDRfZnJlZV9tZW0oYWRhcC0+dGNfdTMyKTsKK30KKworc3RydWN0IGN4Z2I0X3RjX3UzMl90YWJsZSAqY3hnYjRfaW5pdF90Y191MzIoc3RydWN0IGFkYXB0ZXIgKmFkYXAsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IHNpemUpCit7CisJc3RydWN0IGN4Z2I0X3RjX3UzMl90YWJsZSAqdDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICghc2l6ZSkKKwkJcmV0dXJuIE5VTEw7CisKKwl0ID0gdDRfYWxsb2NfbWVtKHNpemVvZigqdCkgKworCQkJIChzaXplICogc2l6ZW9mKHN0cnVjdCBjeGdiNF9saW5rKSkpOworCWlmICghdCkKKwkJcmV0dXJuIE5VTEw7CisKKwl0LT5zaXplID0gc2l6ZTsKKworCWZvciAoaSA9IDA7IGkgPCB0LT5zaXplOyBpKyspIHsKKwkJc3RydWN0IGN4Z2I0X2xpbmsgKmxpbmsgPSAmdC0+dGFibGVbaV07CisJCXVuc2lnbmVkIGludCBibWFwX3NpemU7CisJCXVuc2lnbmVkIGludCBtYXhfdGlkczsKKworCQltYXhfdGlkcyA9IGFkYXAtPnRpZHMubmZ0aWRzOworCQlibWFwX3NpemUgPSBCSVRTX1RPX0xPTkdTKG1heF90aWRzKTsKKwkJbGluay0+dGlkX21hcCA9IHQ0X2FsbG9jX21lbShzaXplb2YodW5zaWduZWQgbG9uZykgKiBibWFwX3NpemUpOworCQlpZiAoIWxpbmstPnRpZF9tYXApCisJCQlnb3RvIG91dF9ub19tZW07CisJCWJpdG1hcF96ZXJvKGxpbmstPnRpZF9tYXAsIG1heF90aWRzKTsKKwl9CisKKwlyZXR1cm4gdDsKKworb3V0X25vX21lbToKKwlmb3IgKGkgPSAwOyBpIDwgdC0+c2l6ZTsgaSsrKSB7CisJCXN0cnVjdCBjeGdiNF9saW5rICpsaW5rID0gJnQtPnRhYmxlW2ldOworCisJCWlmIChsaW5rLT50aWRfbWFwKQorCQkJdDRfZnJlZV9tZW0obGluay0+dGlkX21hcCk7CisJfQorCisJaWYgKHQpCisJCXQ0X2ZyZWVfbWVtKHQpOworCisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X3RjX3UzMi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF90Y191MzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmRjODg1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF90Y191MzIuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENoZWxzaW8gVDQgRXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfX0NYR0I0X1RDX1UzMl9ICisjZGVmaW5lIF9fQ1hHQjRfVENfVTMyX0gKKworI2luY2x1ZGUgPG5ldC9wa3RfY2xzLmg+CisKKyNkZWZpbmUgQ1hHQjRfTUFYX0xJTktfSEFORExFIDMyCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBjYW5fdGNfdTMyX29mZmxvYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IG5ldGRldjJhZGFwKGRldik7CisKKwlyZXR1cm4gKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1RDKSAmJiBhZGFwLT50Y191MzIgPyB0cnVlIDogZmFsc2U7Cit9CisKK2ludCBjeGdiNF9jb25maWdfa25vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX19iZTE2IHByb3RvY29sLAorCQkgICAgICAgc3RydWN0IHRjX2Nsc191MzJfb2ZmbG9hZCAqY2xzKTsKK2ludCBjeGdiNF9kZWxldGVfa25vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX19iZTE2IHByb3RvY29sLAorCQkgICAgICAgc3RydWN0IHRjX2Nsc191MzJfb2ZmbG9hZCAqY2xzKTsKKwordm9pZCBjeGdiNF9jbGVhbnVwX3RjX3UzMihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7CitzdHJ1Y3QgY3hnYjRfdGNfdTMyX3RhYmxlICpjeGdiNF9pbml0X3RjX3UzMihzdHJ1Y3QgYWRhcHRlciAqYWRhcCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgc2l6ZSk7CisjZW5kaWYgLyogX19DWEdCNF9UQ19VMzJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF90Y191MzJfcGFyc2UuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfdGNfdTMyX3BhcnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRiOTllZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfdGNfdTMyX3BhcnNlLmgKQEAgLTAsMCArMSwyOTQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQ2hlbHNpbyBUNCBFdGhlcm5ldCBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fQ1hHQjRfVENfVTMyX1BBUlNFX0gKKyNkZWZpbmUgX19DWEdCNF9UQ19VMzJfUEFSU0VfSAorCitzdHJ1Y3QgY3hnYjRfbWF0Y2hfZmllbGQgeworCWludCBvZmY7IC8qIE9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGhlYWRlciB0byBtYXRjaCAqLworCS8qIEZpbGwgdGhlIHZhbHVlL21hc2sgcGFpciBpbiB0aGUgc3BlYyBpZiBtYXRjaGVkICovCisJaW50ICgqdmFsKShzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gKmYsIHUzMiB2YWwsIHUzMiBtYXNrKTsKK307CisKKy8qIElQdjQgbWF0Y2ggZmllbGRzICovCitzdGF0aWMgaW5saW5lIGludCBjeGdiNF9maWxsX2lwdjRfdG9zKHN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiAqZiwKKwkJCQkgICAgICB1MzIgdmFsLCB1MzIgbWFzaykKK3sKKwlmLT52YWwudG9zICA9IChudG9obCh2YWwpICA+PiAxNikgJiAweDAwMDAwMEZGOworCWYtPm1hc2sudG9zID0gKG50b2hsKG1hc2spID4+IDE2KSAmIDB4MDAwMDAwRkY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3hnYjRfZmlsbF9pcHY0X2ZyYWcoc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uICpmLAorCQkJCSAgICAgICB1MzIgdmFsLCB1MzIgbWFzaykKK3sKKwl1MzIgbWFza192YWw7CisJdTggZnJhZ192YWw7CisKKwlmcmFnX3ZhbCA9IChudG9obCh2YWwpID4+IDEzKSAmIDB4MDAwMDAwMDc7CisJbWFza192YWwgPSBudG9obChtYXNrKSAmIDB4MDAwMEZGRkY7CisKKwlpZiAoZnJhZ192YWwgPT0gMHgxICYmIG1hc2tfdmFsICE9IDB4M0ZGRikgeyAvKiBNRiBzZXQgKi8KKwkJZi0+dmFsLmZyYWcgPSAxOworCQlmLT5tYXNrLmZyYWcgPSAxOworCX0gZWxzZSBpZiAoZnJhZ192YWwgPT0gMHgyICYmIG1hc2tfdmFsICE9IDB4M0ZGRikgeyAvKiBERiBzZXQgKi8KKwkJZi0+dmFsLmZyYWcgPSAwOworCQlmLT5tYXNrLmZyYWcgPSAxOworCX0gZWxzZSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjeGdiNF9maWxsX2lwdjRfcHJvdG8oc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uICpmLAorCQkJCQl1MzIgdmFsLCB1MzIgbWFzaykKK3sKKwlmLT52YWwucHJvdG8gID0gKG50b2hsKHZhbCkgID4+IDE2KSAmIDB4MDAwMDAwRkY7CisJZi0+bWFzay5wcm90byA9IChudG9obChtYXNrKSA+PiAxNikgJiAweDAwMDAwMEZGOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGN4Z2I0X2ZpbGxfaXB2NF9zcmNfaXAoc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uICpmLAorCQkJCQkgdTMyIHZhbCwgdTMyIG1hc2spCit7CisJbWVtY3B5KCZmLT52YWwuZmlwWzBdLCAgJnZhbCwgIHNpemVvZih1MzIpKTsKKwltZW1jcHkoJmYtPm1hc2suZmlwWzBdLCAmbWFzaywgc2l6ZW9mKHUzMikpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGN4Z2I0X2ZpbGxfaXB2NF9kc3RfaXAoc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uICpmLAorCQkJCQkgdTMyIHZhbCwgdTMyIG1hc2spCit7CisJbWVtY3B5KCZmLT52YWwubGlwWzBdLCAgJnZhbCwgIHNpemVvZih1MzIpKTsKKwltZW1jcHkoJmYtPm1hc2subGlwWzBdLCAmbWFzaywgc2l6ZW9mKHUzMikpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3hnYjRfbWF0Y2hfZmllbGQgY3hnYjRfaXB2NF9maWVsZHNbXSA9IHsKKwl7IC5vZmYgPSAwLCAgLnZhbCA9IGN4Z2I0X2ZpbGxfaXB2NF90b3MgfSwKKwl7IC5vZmYgPSA0LCAgLnZhbCA9IGN4Z2I0X2ZpbGxfaXB2NF9mcmFnIH0sCisJeyAub2ZmID0gOCwgIC52YWwgPSBjeGdiNF9maWxsX2lwdjRfcHJvdG8gfSwKKwl7IC5vZmYgPSAxMiwgLnZhbCA9IGN4Z2I0X2ZpbGxfaXB2NF9zcmNfaXAgfSwKKwl7IC5vZmYgPSAxNiwgLnZhbCA9IGN4Z2I0X2ZpbGxfaXB2NF9kc3RfaXAgfSwKKwl7IC52YWwgPSBOVUxMIH0KK307CisKKy8qIElQdjYgbWF0Y2ggZmllbGRzICovCitzdGF0aWMgaW5saW5lIGludCBjeGdiNF9maWxsX2lwdjZfdG9zKHN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiAqZiwKKwkJCQkgICAgICB1MzIgdmFsLCB1MzIgbWFzaykKK3sKKwlmLT52YWwudG9zICA9IChudG9obCh2YWwpICA+PiAyMCkgJiAweDAwMDAwMEZGOworCWYtPm1hc2sudG9zID0gKG50b2hsKG1hc2spID4+IDIwKSAmIDB4MDAwMDAwRkY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3hnYjRfZmlsbF9pcHY2X3Byb3RvKHN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiAqZiwKKwkJCQkJdTMyIHZhbCwgdTMyIG1hc2spCit7CisJZi0+dmFsLnByb3RvICA9IChudG9obCh2YWwpICA+PiA4KSAmIDB4MDAwMDAwRkY7CisJZi0+bWFzay5wcm90byA9IChudG9obChtYXNrKSA+PiA4KSAmIDB4MDAwMDAwRkY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3hnYjRfZmlsbF9pcHY2X3NyY19pcDAoc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uICpmLAorCQkJCQkgIHUzMiB2YWwsIHUzMiBtYXNrKQoreworCW1lbWNweSgmZi0+dmFsLmZpcFswXSwgICZ2YWwsICBzaXplb2YodTMyKSk7CisJbWVtY3B5KCZmLT5tYXNrLmZpcFswXSwgJm1hc2ssIHNpemVvZih1MzIpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjeGdiNF9maWxsX2lwdjZfc3JjX2lwMShzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gKmYsCisJCQkJCSAgdTMyIHZhbCwgdTMyIG1hc2spCit7CisJbWVtY3B5KCZmLT52YWwuZmlwWzRdLCAgJnZhbCwgIHNpemVvZih1MzIpKTsKKwltZW1jcHkoJmYtPm1hc2suZmlwWzRdLCAmbWFzaywgc2l6ZW9mKHUzMikpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGN4Z2I0X2ZpbGxfaXB2Nl9zcmNfaXAyKHN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiAqZiwKKwkJCQkJICB1MzIgdmFsLCB1MzIgbWFzaykKK3sKKwltZW1jcHkoJmYtPnZhbC5maXBbOF0sICAmdmFsLCAgc2l6ZW9mKHUzMikpOworCW1lbWNweSgmZi0+bWFzay5maXBbOF0sICZtYXNrLCBzaXplb2YodTMyKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3hnYjRfZmlsbF9pcHY2X3NyY19pcDMoc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uICpmLAorCQkJCQkgIHUzMiB2YWwsIHUzMiBtYXNrKQoreworCW1lbWNweSgmZi0+dmFsLmZpcFsxMl0sICAmdmFsLCAgc2l6ZW9mKHUzMikpOworCW1lbWNweSgmZi0+bWFzay5maXBbMTJdLCAmbWFzaywgc2l6ZW9mKHUzMikpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGN4Z2I0X2ZpbGxfaXB2Nl9kc3RfaXAwKHN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiAqZiwKKwkJCQkJICB1MzIgdmFsLCB1MzIgbWFzaykKK3sKKwltZW1jcHkoJmYtPnZhbC5saXBbMF0sICAmdmFsLCAgc2l6ZW9mKHUzMikpOworCW1lbWNweSgmZi0+bWFzay5saXBbMF0sICZtYXNrLCBzaXplb2YodTMyKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3hnYjRfZmlsbF9pcHY2X2RzdF9pcDEoc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uICpmLAorCQkJCQkgIHUzMiB2YWwsIHUzMiBtYXNrKQoreworCW1lbWNweSgmZi0+dmFsLmxpcFs0XSwgICZ2YWwsICBzaXplb2YodTMyKSk7CisJbWVtY3B5KCZmLT5tYXNrLmxpcFs0XSwgJm1hc2ssIHNpemVvZih1MzIpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjeGdiNF9maWxsX2lwdjZfZHN0X2lwMihzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gKmYsCisJCQkJCSAgdTMyIHZhbCwgdTMyIG1hc2spCit7CisJbWVtY3B5KCZmLT52YWwubGlwWzhdLCAgJnZhbCwgIHNpemVvZih1MzIpKTsKKwltZW1jcHkoJmYtPm1hc2subGlwWzhdLCAmbWFzaywgc2l6ZW9mKHUzMikpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGN4Z2I0X2ZpbGxfaXB2Nl9kc3RfaXAzKHN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiAqZiwKKwkJCQkJICB1MzIgdmFsLCB1MzIgbWFzaykKK3sKKwltZW1jcHkoJmYtPnZhbC5saXBbMTJdLCAgJnZhbCwgIHNpemVvZih1MzIpKTsKKwltZW1jcHkoJmYtPm1hc2subGlwWzEyXSwgJm1hc2ssIHNpemVvZih1MzIpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGN4Z2I0X21hdGNoX2ZpZWxkIGN4Z2I0X2lwdjZfZmllbGRzW10gPSB7CisJeyAub2ZmID0gMCwgIC52YWwgPSBjeGdiNF9maWxsX2lwdjZfdG9zIH0sCisJeyAub2ZmID0gNCwgIC52YWwgPSBjeGdiNF9maWxsX2lwdjZfcHJvdG8gfSwKKwl7IC5vZmYgPSA4LCAgLnZhbCA9IGN4Z2I0X2ZpbGxfaXB2Nl9zcmNfaXAwIH0sCisJeyAub2ZmID0gMTIsIC52YWwgPSBjeGdiNF9maWxsX2lwdjZfc3JjX2lwMSB9LAorCXsgLm9mZiA9IDE2LCAudmFsID0gY3hnYjRfZmlsbF9pcHY2X3NyY19pcDIgfSwKKwl7IC5vZmYgPSAyMCwgLnZhbCA9IGN4Z2I0X2ZpbGxfaXB2Nl9zcmNfaXAzIH0sCisJeyAub2ZmID0gMjQsIC52YWwgPSBjeGdiNF9maWxsX2lwdjZfZHN0X2lwMCB9LAorCXsgLm9mZiA9IDI4LCAudmFsID0gY3hnYjRfZmlsbF9pcHY2X2RzdF9pcDEgfSwKKwl7IC5vZmYgPSAzMiwgLnZhbCA9IGN4Z2I0X2ZpbGxfaXB2Nl9kc3RfaXAyIH0sCisJeyAub2ZmID0gMzYsIC52YWwgPSBjeGdiNF9maWxsX2lwdjZfZHN0X2lwMyB9LAorCXsgLnZhbCA9IE5VTEwgfQorfTsKKworLyogVENQL1VEUCBtYXRjaCAqLworc3RhdGljIGlubGluZSBpbnQgY3hnYjRfZmlsbF9sNF9wb3J0cyhzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gKmYsCisJCQkJICAgICAgdTMyIHZhbCwgdTMyIG1hc2spCit7CisJZi0+dmFsLmZwb3J0ICA9IG50b2hsKHZhbCkgID4+IDE2OworCWYtPm1hc2suZnBvcnQgPSBudG9obChtYXNrKSA+PiAxNjsKKwlmLT52YWwubHBvcnQgID0gbnRvaGwodmFsKSAgJiAweDAwMDBGRkZGOworCWYtPm1hc2subHBvcnQgPSBudG9obChtYXNrKSAmIDB4MDAwMEZGRkY7CisKKwlyZXR1cm4gMDsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3hnYjRfbWF0Y2hfZmllbGQgY3hnYjRfdGNwX2ZpZWxkc1tdID0geworCXsgLm9mZiA9IDAsIC52YWwgPSBjeGdiNF9maWxsX2w0X3BvcnRzIH0sCisJeyAudmFsID0gTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGN4Z2I0X21hdGNoX2ZpZWxkIGN4Z2I0X3VkcF9maWVsZHNbXSA9IHsKKwl7IC5vZmYgPSAwLCAudmFsID0gY3hnYjRfZmlsbF9sNF9wb3J0cyB9LAorCXsgLnZhbCA9IE5VTEwgfQorfTsKKworc3RydWN0IGN4Z2I0X25leHRfaGVhZGVyIHsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OyAvKiBPZmZzZXQgdG8gbmV4dCBoZWFkZXIgKi8KKwkvKiBvZmZzZXQsIHNoaWZ0LCBhbmQgbWFzayBhZGRlZCB0byBvZmZzZXQgYWJvdmUKKwkgKiB0byBnZXQgdG8gbmV4dCBoZWFkZXIuICBVc2VmdWwgd2hlbiB1c2luZyBhIGhlYWRlcgorCSAqIGZpZWxkJ3MgdmFsdWUgdG8ganVtcCB0byBuZXh0IGhlYWRlciBzdWNoIGFzIElITCBmaWVsZAorCSAqIGluIElQdjQgaGVhZGVyLgorCSAqLworCXVuc2lnbmVkIGludCBvZmZvZmY7CisJdTMyIHNoaWZ0OworCXUzMiBtYXNrOworCS8qIG1hdGNoIGNyaXRlcmlhIHRvIG1ha2UgdGhpcyBqdW1wICovCisJdW5zaWduZWQgaW50IG1hdGNoX29mZjsKKwl1MzIgbWF0Y2hfdmFsOworCXUzMiBtYXRjaF9tYXNrOworCS8qIGxvY2F0aW9uIG9mIGp1bXAgdG8gbWFrZSAqLworCWNvbnN0IHN0cnVjdCBjeGdiNF9tYXRjaF9maWVsZCAqanVtcDsKK307CisKKy8qIEFjY2VwdCBhIHJ1bGUgd2l0aCBhIGp1bXAgdG8gdHJhbnNwb3J0IGxheWVyIGhlYWRlciBiYXNlZCBvbiBJSEwgZmllbGQgaW4KKyAqIElQdjQgaGVhZGVyLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGN4Z2I0X25leHRfaGVhZGVyIGN4Z2I0X2lwdjRfanVtcHNbXSA9IHsKKwl7IC5vZmZzZXQgPSAwLCAub2Zmb2ZmID0gMCwgLnNoaWZ0ID0gNiwgLm1hc2sgPSAweEYsCisJICAubWF0Y2hfb2ZmID0gOCwgLm1hdGNoX3ZhbCA9IDB4NjAwLCAubWF0Y2hfbWFzayA9IDB4RkYwMCwKKwkgIC5qdW1wID0gY3hnYjRfdGNwX2ZpZWxkcyB9LAorCXsgLm9mZnNldCA9IDAsIC5vZmZvZmYgPSAwLCAuc2hpZnQgPSA2LCAubWFzayA9IDB4RiwKKwkgIC5tYXRjaF9vZmYgPSA4LCAubWF0Y2hfdmFsID0gMHgxMTAwLCAubWF0Y2hfbWFzayA9IDB4RkYwMCwKKwkgIC5qdW1wID0gY3hnYjRfdWRwX2ZpZWxkcyB9LAorCXsgLmp1bXAgPSBOVUxMIH0KK307CisKKy8qIEFjY2VwdCBhIHJ1bGUgd2l0aCBhIGp1bXAgZGlyZWN0bHkgcGFzdCB0aGUgNDAgQnl0ZXMgb2YgSVB2NiBmaXhlZCBoZWFkZXIKKyAqIHRvIGdldCB0byB0cmFuc3BvcnQgbGF5ZXIgaGVhZGVyLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGN4Z2I0X25leHRfaGVhZGVyIGN4Z2I0X2lwdjZfanVtcHNbXSA9IHsKKwl7IC5vZmZzZXQgPSAweDI4LCAub2Zmb2ZmID0gMCwgLnNoaWZ0ID0gMCwgLm1hc2sgPSAwLAorCSAgLm1hdGNoX29mZiA9IDQsIC5tYXRjaF92YWwgPSAweDYwMDAwLCAubWF0Y2hfbWFzayA9IDB4RkYwMDAwLAorCSAgLmp1bXAgPSBjeGdiNF90Y3BfZmllbGRzIH0sCisJeyAub2Zmc2V0ID0gMHgyOCwgLm9mZm9mZiA9IDAsIC5zaGlmdCA9IDAsIC5tYXNrID0gMCwKKwkgIC5tYXRjaF9vZmYgPSA0LCAubWF0Y2hfdmFsID0gMHgxMTAwMDAsIC5tYXRjaF9tYXNrID0gMHhGRjAwMDAsCisJICAuanVtcCA9IGN4Z2I0X3VkcF9maWVsZHMgfSwKKwl7IC5qdW1wID0gTlVMTCB9Cit9OworCitzdHJ1Y3QgY3hnYjRfbGluayB7CisJY29uc3Qgc3RydWN0IGN4Z2I0X21hdGNoX2ZpZWxkICptYXRjaF9maWVsZDsgIC8qIE5leHQgaGVhZGVyICovCisJc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uIGZzOyAvKiBNYXRjaCBzcGVjIGFzc29jaWF0ZWQgd2l0aCBsaW5rICovCisJdTMyIGxpbmtfaGFuZGxlOyAgICAgICAgIC8qIEtub2RlIGhhbmRsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmsgKi8KKwl1bnNpZ25lZCBsb25nICp0aWRfbWFwOyAgLyogQml0bWFwIGZvciBmaWx0ZXIgdGlkcyAqLworfTsKKworc3RydWN0IGN4Z2I0X3RjX3UzMl90YWJsZSB7CisJdW5zaWduZWQgaW50IHNpemU7ICAgICAgICAgIC8qIG51bWJlciBvZiBlbnRyaWVzIGluIHRhYmxlICovCisJc3RydWN0IGN4Z2I0X2xpbmsgdGFibGVbMF07IC8qIEp1bXAgdGFibGUgKi8KK307CisjZW5kaWYgLyogX19DWEdCNF9UQ19VMzJfUEFSU0VfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF91bGQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfdWxkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiMmQyMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfdWxkLmMKQEAgLTAsMCArMSw2OTYgQEAKKy8qCisgKiBjeGdiNF91bGQuYzpDaGVsc2lvIFVwcGVyIExheWVyIERyaXZlciBJbnRlcmZhY2UgZm9yIFQ0L1Q1L1Q2IFNHRSBtYW5hZ2VtZW50CisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqICBXcml0dGVuIGJ5OiBBdHVsIEd1cHRhIChhdHVsLmd1cHRhQGNoZWxzaW8uY29tKQorICogIFdyaXR0ZW4gYnk6IEhhcmlwcmFzYWQgU2hlbmFpIChoYXJpcHJhc2FkQGNoZWxzaW8uY29tKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgImN4Z2I0LmgiCisjaW5jbHVkZSAiY3hnYjRfdWxkLmgiCisjaW5jbHVkZSAidDRfcmVncy5oIgorI2luY2x1ZGUgInQ0ZndfYXBpLmgiCisjaW5jbHVkZSAidDRfbXNnLmgiCisKKyNkZWZpbmUgZm9yX2VhY2hfdWxkcnhxKG0sIGkpIGZvciAoaSA9IDA7IGkgPCAoKG0pLT5ucnhxICsgKG0pLT5uY2lxKTsgaSsrKQorCitzdGF0aWMgaW50IGdldF9tc2l4X2lkeF9mcm9tX2JtYXAoc3RydWN0IGFkYXB0ZXIgKmFkYXApCit7CisJc3RydWN0IHVsZF9tc2l4X2JtYXAgKmJtYXAgPSAmYWRhcC0+bXNpeF9ibWFwX3VsZHM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbXNpeF9pZHg7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYm1hcC0+bG9jaywgZmxhZ3MpOworCW1zaXhfaWR4ID0gZmluZF9maXJzdF96ZXJvX2JpdChibWFwLT5tc2l4X2JtYXAsIGJtYXAtPm1hcHNpemUpOworCWlmIChtc2l4X2lkeCA8IGJtYXAtPm1hcHNpemUpIHsKKwkJX19zZXRfYml0KG1zaXhfaWR4LCBibWFwLT5tc2l4X2JtYXApOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJtYXAtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYm1hcC0+bG9jaywgZmxhZ3MpOworCXJldHVybiBtc2l4X2lkeDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9tc2l4X2lkeF9pbl9ibWFwKHN0cnVjdCBhZGFwdGVyICphZGFwLCB1bnNpZ25lZCBpbnQgbXNpeF9pZHgpCit7CisJc3RydWN0IHVsZF9tc2l4X2JtYXAgKmJtYXAgPSAmYWRhcC0+bXNpeF9ibWFwX3VsZHM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZibWFwLT5sb2NrLCBmbGFncyk7CisJIF9fY2xlYXJfYml0KG1zaXhfaWR4LCBibWFwLT5tc2l4X2JtYXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJtYXAtPmxvY2ssIGZsYWdzKTsKK30KKworLyogRmx1c2ggdGhlIGFnZ3JlZ2F0ZWQgbHJvIHNlc3Npb25zICovCitzdGF0aWMgdm9pZCB1bGRyeF9mbHVzaF9oYW5kbGVyKHN0cnVjdCBzZ2VfcnNwcSAqcSkKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHEtPmFkYXA7CisKKwlpZiAoYWRhcC0+dWxkW3EtPnVsZF0ubHJvX2ZsdXNoKQorCQlhZGFwLT51bGRbcS0+dWxkXS5scm9fZmx1c2goJnEtPmxyb19tZ3IpOworfQorCisvKioKKyAqCXVsZHJ4X2hhbmRsZXIgLSByZXNwb25zZSBxdWV1ZSBoYW5kbGVyIGZvciBVTEQgcXVldWVzCisgKglAcTogdGhlIHJlc3BvbnNlIHF1ZXVlIHRoYXQgcmVjZWl2ZWQgdGhlIHBhY2tldAorICoJQHJzcDogdGhlIHJlc3BvbnNlIHF1ZXVlIGRlc2NyaXB0b3IgaG9sZGluZyB0aGUgb2ZmbG9hZCBtZXNzYWdlCisgKglAZ2w6IHRoZSBnYXRoZXIgbGlzdCBvZiBwYWNrZXQgZnJhZ21lbnRzCisgKgorICoJRGVsaXZlciBhbiBpbmdyZXNzIG9mZmxvYWQgcGFja2V0IHRvIGEgVUxELiAgQWxsIHByb2Nlc3NpbmcgaXMgZG9uZSBieQorICoJdGhlIFVMRCwgd2UganVzdCBtYWludGFpbiBzdGF0aXN0aWNzLgorICovCitzdGF0aWMgaW50IHVsZHJ4X2hhbmRsZXIoc3RydWN0IHNnZV9yc3BxICpxLCBjb25zdCBfX2JlNjQgKnJzcCwKKwkJCSBjb25zdCBzdHJ1Y3QgcGt0X2dsICpnbCkKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHEtPmFkYXA7CisJc3RydWN0IHNnZV9vZmxkX3J4cSAqcnhxID0gY29udGFpbmVyX29mKHEsIHN0cnVjdCBzZ2Vfb2ZsZF9yeHEsIHJzcHEpOworCWludCByZXQ7CisKKwkvKiBGVyBjYW4gc2VuZCBDUExzIGVuY2Fwc3VsYXRlZCBpbiBhIENQTF9GVzRfTVNHICovCisJaWYgKCgoY29uc3Qgc3RydWN0IHJzc19oZWFkZXIgKilyc3ApLT5vcGNvZGUgPT0gQ1BMX0ZXNF9NU0cgJiYKKwkgICAgKChjb25zdCBzdHJ1Y3QgY3BsX2Z3NF9tc2cgKikocnNwICsgMSkpLT50eXBlID09IEZXX1RZUEVfUlNTQ1BMKQorCQlyc3AgKz0gMjsKKworCWlmIChxLT5mbHVzaF9oYW5kbGVyKQorCQlyZXQgPSBhZGFwLT51bGRbcS0+dWxkXS5scm9fcnhfaGFuZGxlcihhZGFwLT51bGRbcS0+dWxkXS5oYW5kbGUsCisJCQkJcnNwLCBnbCwgJnEtPmxyb19tZ3IsCisJCQkJJnEtPm5hcGkpOworCWVsc2UKKwkJcmV0ID0gYWRhcC0+dWxkW3EtPnVsZF0ucnhfaGFuZGxlcihhZGFwLT51bGRbcS0+dWxkXS5oYW5kbGUsCisJCQkJcnNwLCBnbCk7CisKKwlpZiAocmV0KSB7CisJCXJ4cS0+c3RhdHMubm9tZW0rKzsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICghZ2wpCisJCXJ4cS0+c3RhdHMuaW1tKys7CisJZWxzZSBpZiAoZ2wgPT0gQ1hHQjRfTVNHX0FOKQorCQlyeHEtPnN0YXRzLmFuKys7CisJZWxzZQorCQlyeHEtPnN0YXRzLnBrdHMrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbGxvY191bGRfcnhxcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCwKKwkJCSAgc3RydWN0IHNnZV91bGRfcnhxX2luZm8gKnJ4cV9pbmZvLAorCQkJICB1bnNpZ25lZCBpbnQgbnEsIHVuc2lnbmVkIGludCBvZmZzZXQsIGJvb2wgbHJvKQoreworCXN0cnVjdCBzZ2UgKnMgPSAmYWRhcC0+c2dlOworCXN0cnVjdCBzZ2Vfb2ZsZF9yeHEgKnEgPSByeHFfaW5mby0+dWxkcnhxICsgb2Zmc2V0OworCXVuc2lnbmVkIHNob3J0ICppZHMgPSByeHFfaW5mby0+cnNwcV9pZCArIG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgcGVyX2NoYW4gPSBucSAvIGFkYXAtPnBhcmFtcy5ucG9ydHM7CisJdW5zaWduZWQgaW50IGJtYXBfaWR4ID0gMDsKKwlpbnQgaSwgZXJyLCBtc2lfaWR4OworCisJaWYgKGFkYXAtPmZsYWdzICYgVVNJTkdfTVNJWCkKKwkJbXNpX2lkeCA9IDE7CisJZWxzZQorCQltc2lfaWR4ID0gLSgoaW50KXMtPmludHJxLmFic19pZCArIDEpOworCisJZm9yIChpID0gMDsgaSA8IG5xOyBpKyssIHErKykgeworCQlpZiAobXNpX2lkeCA+PSAwKSB7CisJCQlibWFwX2lkeCA9IGdldF9tc2l4X2lkeF9mcm9tX2JtYXAoYWRhcCk7CisJCQltc2lfaWR4ID0gYWRhcC0+bXNpeF9pbmZvX3VsZHNbYm1hcF9pZHhdLmlkeDsKKwkJfQorCQllcnIgPSB0NF9zZ2VfYWxsb2NfcnhxKGFkYXAsICZxLT5yc3BxLCBmYWxzZSwKKwkJCQkgICAgICAgYWRhcC0+cG9ydFtpIC8gcGVyX2NoYW5dLAorCQkJCSAgICAgICBtc2lfaWR4LAorCQkJCSAgICAgICBxLT5mbC5zaXplID8gJnEtPmZsIDogTlVMTCwKKwkJCQkgICAgICAgdWxkcnhfaGFuZGxlciwKKwkJCQkgICAgICAgbHJvID8gdWxkcnhfZmx1c2hfaGFuZGxlciA6IE5VTEwsCisJCQkJICAgICAgIDApOworCQlpZiAoZXJyKQorCQkJZ290byBmcmVlb3V0OworCQlpZiAobXNpX2lkeCA+PSAwKQorCQkJcnhxX2luZm8tPm1zaXhfdGJsW2kgKyBvZmZzZXRdID0gYm1hcF9pZHg7CisJCW1lbXNldCgmcS0+c3RhdHMsIDAsIHNpemVvZihxLT5zdGF0cykpOworCQlpZiAoaWRzKQorCQkJaWRzW2ldID0gcS0+cnNwcS5hYnNfaWQ7CisJfQorCXJldHVybiAwOworZnJlZW91dDoKKwlxID0gcnhxX2luZm8tPnVsZHJ4cSArIG9mZnNldDsKKwlmb3IgKCA7IGk7IGktLSwgcSsrKSB7CisJCWlmIChxLT5yc3BxLmRlc2MpCisJCQlmcmVlX3JzcHFfZmwoYWRhcCwgJnEtPnJzcHEsCisJCQkJICAgICBxLT5mbC5zaXplID8gJnEtPmZsIDogTlVMTCk7CisJfQorCisJLyogV2UgbmVlZCB0byBmcmVlIHJ4cSBhbHNvIGluIGNhc2Ugb2YgY2lxIGFsbG9jYXRpb24gZmFpbHVyZSAqLworCWlmIChvZmZzZXQpIHsKKwkJcSA9IHJ4cV9pbmZvLT51bGRyeHEgKyBvZmZzZXQ7CisJCWZvciAoIDsgaTsgaS0tLCBxKyspIHsKKwkJCWlmIChxLT5yc3BxLmRlc2MpCisJCQkJZnJlZV9yc3BxX2ZsKGFkYXAsICZxLT5yc3BxLAorCQkJCQkgICAgIHEtPmZsLnNpemUgPyAmcS0+ZmwgOiBOVUxMKTsKKwkJfQorCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50CitzZXR1cF9zZ2VfcXVldWVzX3VsZChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgdW5zaWduZWQgaW50IHVsZF90eXBlLCBib29sIGxybykKK3sKKwlzdHJ1Y3Qgc2dlX3VsZF9yeHFfaW5mbyAqcnhxX2luZm8gPSBhZGFwLT5zZ2UudWxkX3J4cV9pbmZvW3VsZF90eXBlXTsKKwlpbnQgaSwgcmV0ID0gMDsKKworCWlmIChhZGFwLT5mbGFncyAmIFVTSU5HX01TSVgpIHsKKwkJcnhxX2luZm8tPm1zaXhfdGJsID0ga2NhbGxvYygocnhxX2luZm8tPm5yeHEgKyByeHFfaW5mby0+bmNpcSksCisJCQkJCSAgICAgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSwKKwkJCQkJICAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKCFyeHFfaW5mby0+bXNpeF90YmwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXQgPSAhKCFhbGxvY191bGRfcnhxcyhhZGFwLCByeHFfaW5mbywgcnhxX2luZm8tPm5yeHEsIDAsIGxybykgJiYKKwkJICFhbGxvY191bGRfcnhxcyhhZGFwLCByeHFfaW5mbywgcnhxX2luZm8tPm5jaXEsCisJCQkJIHJ4cV9pbmZvLT5ucnhxLCBscm8pKTsKKworCS8qIFRlbGwgdVAgdG8gcm91dGUgY29udHJvbCBxdWV1ZSBjb21wbGV0aW9ucyB0byByZG1hIHJzcHEgKi8KKwlpZiAoYWRhcC0+ZmxhZ3MgJiBGVUxMX0lOSVRfRE9ORSAmJgorCSAgICAhcmV0ICYmIHVsZF90eXBlID09IENYR0I0X1VMRF9SRE1BKSB7CisJCXN0cnVjdCBzZ2UgKnMgPSAmYWRhcC0+c2dlOworCQl1bnNpZ25lZCBpbnQgY21wbHFpZDsKKwkJdTMyIHBhcmFtLCBjbWRvcDsKKworCQljbWRvcCA9IEZXX1BBUkFNU19QQVJBTV9ETUFRX0VRX0NNUExJUUlEX0NUUkw7CisJCWZvcl9lYWNoX3BvcnQoYWRhcCwgaSkgeworCQkJY21wbHFpZCA9IHJ4cV9pbmZvLT51bGRyeHFbaV0ucnNwcS5jbnR4dF9pZDsKKwkJCXBhcmFtID0gKEZXX1BBUkFNU19NTkVNX1YoRldfUEFSQU1TX01ORU1fRE1BUSkgfAorCQkJCSBGV19QQVJBTVNfUEFSQU1fWF9WKGNtZG9wKSB8CisJCQkJIEZXX1BBUkFNU19QQVJBTV9ZWl9WKHMtPmN0cmxxW2ldLnEuY250eHRfaWQpKTsKKwkJCXJldCA9IHQ0X3NldF9wYXJhbXMoYWRhcCwgYWRhcC0+bWJveCwgYWRhcC0+cGYsCisJCQkJCSAgICAwLCAxLCAmcGFyYW0sICZjbXBscWlkKTsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB0NF9mcmVlX3VsZF9yeHFzKHN0cnVjdCBhZGFwdGVyICphZGFwLCBpbnQgbiwKKwkJCSAgICAgc3RydWN0IHNnZV9vZmxkX3J4cSAqcSkKK3sKKwlmb3IgKCA7IG47IG4tLSwgcSsrKSB7CisJCWlmIChxLT5yc3BxLmRlc2MpCisJCQlmcmVlX3JzcHFfZmwoYWRhcCwgJnEtPnJzcHEsCisJCQkJICAgICBxLT5mbC5zaXplID8gJnEtPmZsIDogTlVMTCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBmcmVlX3NnZV9xdWV1ZXNfdWxkKHN0cnVjdCBhZGFwdGVyICphZGFwLCB1bnNpZ25lZCBpbnQgdWxkX3R5cGUpCit7CisJc3RydWN0IHNnZV91bGRfcnhxX2luZm8gKnJ4cV9pbmZvID0gYWRhcC0+c2dlLnVsZF9yeHFfaW5mb1t1bGRfdHlwZV07CisKKwlpZiAoYWRhcC0+ZmxhZ3MgJiBGVUxMX0lOSVRfRE9ORSAmJiB1bGRfdHlwZSA9PSBDWEdCNF9VTERfUkRNQSkgeworCQlzdHJ1Y3Qgc2dlICpzID0gJmFkYXAtPnNnZTsKKwkJdTMyIHBhcmFtLCBjbWRvcCwgY21wbHFpZCA9IDA7CisJCWludCBpOworCisJCWNtZG9wID0gRldfUEFSQU1TX1BBUkFNX0RNQVFfRVFfQ01QTElRSURfQ1RSTDsKKwkJZm9yX2VhY2hfcG9ydChhZGFwLCBpKSB7CisJCQlwYXJhbSA9IChGV19QQVJBTVNfTU5FTV9WKEZXX1BBUkFNU19NTkVNX0RNQVEpIHwKKwkJCQkgRldfUEFSQU1TX1BBUkFNX1hfVihjbWRvcCkgfAorCQkJCSBGV19QQVJBTVNfUEFSQU1fWVpfVihzLT5jdHJscVtpXS5xLmNudHh0X2lkKSk7CisJCQl0NF9zZXRfcGFyYW1zKGFkYXAsIGFkYXAtPm1ib3gsIGFkYXAtPnBmLAorCQkJCSAgICAgIDAsIDEsICZwYXJhbSwgJmNtcGxxaWQpOworCQl9CisJfQorCisJaWYgKHJ4cV9pbmZvLT5uY2lxKQorCQl0NF9mcmVlX3VsZF9yeHFzKGFkYXAsIHJ4cV9pbmZvLT5uY2lxLAorCQkJCSByeHFfaW5mby0+dWxkcnhxICsgcnhxX2luZm8tPm5yeHEpOworCXQ0X2ZyZWVfdWxkX3J4cXMoYWRhcCwgcnhxX2luZm8tPm5yeHEsIHJ4cV9pbmZvLT51bGRyeHEpOworCWlmIChhZGFwLT5mbGFncyAmIFVTSU5HX01TSVgpCisJCWtmcmVlKHJ4cV9pbmZvLT5tc2l4X3RibCk7Cit9CisKK3N0YXRpYyBpbnQgY2ZnX3F1ZXVlc191bGQoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCB1bGRfdHlwZSwKKwkJCSAgY29uc3Qgc3RydWN0IGN4Z2I0X3VsZF9pbmZvICp1bGRfaW5mbykKK3sKKwlzdHJ1Y3Qgc2dlICpzID0gJmFkYXAtPnNnZTsKKwlzdHJ1Y3Qgc2dlX3VsZF9yeHFfaW5mbyAqcnhxX2luZm87CisJaW50IGksIG5yeHEsIGNpcV9zaXplOworCisJcnhxX2luZm8gPSBremFsbG9jKHNpemVvZigqcnhxX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJ4cV9pbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChhZGFwLT5mbGFncyAmIFVTSU5HX01TSVggJiYgdWxkX2luZm8tPm5yeHEgPiBzLT5ucXNfcGVyX3VsZCkgeworCQlpID0gcy0+bnFzX3Blcl91bGQ7CisJCXJ4cV9pbmZvLT5ucnhxID0gcm91bmR1cChpLCBhZGFwLT5wYXJhbXMubnBvcnRzKTsKKwl9IGVsc2UgeworCQlpID0gbWluX3QoaW50LCB1bGRfaW5mby0+bnJ4cSwKKwkJCSAgbnVtX29ubGluZV9jcHVzKCkpOworCQlyeHFfaW5mby0+bnJ4cSA9IHJvdW5kdXAoaSwgYWRhcC0+cGFyYW1zLm5wb3J0cyk7CisJfQorCWlmICghdWxkX2luZm8tPmNpcSkgeworCQlyeHFfaW5mby0+bmNpcSA9IDA7CisJfSBlbHNlICB7CisJCWlmIChhZGFwLT5mbGFncyAmIFVTSU5HX01TSVgpCisJCQlyeHFfaW5mby0+bmNpcSA9IG1pbl90KGludCwgcy0+bnFzX3Blcl91bGQsCisJCQkJCSAgICAgICBudW1fb25saW5lX2NwdXMoKSk7CisJCWVsc2UKKwkJCXJ4cV9pbmZvLT5uY2lxID0gbWluX3QoaW50LCBNQVhfT0ZMRF9RU0VUUywKKwkJCQkJICAgICAgIG51bV9vbmxpbmVfY3B1cygpKTsKKwkJcnhxX2luZm8tPm5jaXEgPSAoKHJ4cV9pbmZvLT5uY2lxIC8gYWRhcC0+cGFyYW1zLm5wb3J0cykgKgorCQkJCSAgYWRhcC0+cGFyYW1zLm5wb3J0cyk7CisJCXJ4cV9pbmZvLT5uY2lxID0gbWF4X3QoaW50LCByeHFfaW5mby0+bmNpcSwKKwkJCQkgICAgICAgYWRhcC0+cGFyYW1zLm5wb3J0cyk7CisJfQorCisJbnJ4cSA9IHJ4cV9pbmZvLT5ucnhxICsgcnhxX2luZm8tPm5jaXE7IC8qIHRvdGFsIHJ4cSdzICovCisJcnhxX2luZm8tPnVsZHJ4cSA9IGtjYWxsb2MobnJ4cSwgc2l6ZW9mKHN0cnVjdCBzZ2Vfb2ZsZF9yeHEpLAorCQkJCSAgIEdGUF9LRVJORUwpOworCWlmICghcnhxX2luZm8tPnVsZHJ4cSkgeworCQlrZnJlZShyeHFfaW5mbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJ4cV9pbmZvLT5yc3BxX2lkID0ga2NhbGxvYyhucnhxLCBzaXplb2YodW5zaWduZWQgc2hvcnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJ4cV9pbmZvLT5yc3BxX2lkKSB7CisJCWtmcmVlKHJ4cV9pbmZvLT51bGRyeHEpOworCQlrZnJlZShyeHFfaW5mbyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWZvciAoaSA9IDA7IGkgPCByeHFfaW5mby0+bnJ4cTsgaSsrKSB7CisJCXN0cnVjdCBzZ2Vfb2ZsZF9yeHEgKnIgPSAmcnhxX2luZm8tPnVsZHJ4cVtpXTsKKworCQlpbml0X3JzcHEoYWRhcCwgJnItPnJzcHEsIDUsIDEsIHVsZF9pbmZvLT5yeHFfc2l6ZSwgNjQpOworCQlyLT5yc3BxLnVsZCA9IHVsZF90eXBlOworCQlyLT5mbC5zaXplID0gNzI7CisJfQorCisJY2lxX3NpemUgPSA2NCArIGFkYXAtPnZyZXMuY3Euc2l6ZSArIGFkYXAtPnRpZHMubmZ0aWRzOworCWlmIChjaXFfc2l6ZSA+IFNHRV9NQVhfSVFfU0laRSkgeworCQlkZXZfd2FybihhZGFwLT5wZGV2X2RldiwgIkNJUSBzaXplIHRvbyBzbWFsbCBmb3IgYXZhaWxhYmxlIElRc1xuIik7CisJCWNpcV9zaXplID0gU0dFX01BWF9JUV9TSVpFOworCX0KKworCWZvciAoaSA9IHJ4cV9pbmZvLT5ucnhxOyBpIDwgbnJ4cTsgaSsrKSB7CisJCXN0cnVjdCBzZ2Vfb2ZsZF9yeHEgKnIgPSAmcnhxX2luZm8tPnVsZHJ4cVtpXTsKKworCQlpbml0X3JzcHEoYWRhcCwgJnItPnJzcHEsIDUsIDEsIGNpcV9zaXplLCA2NCk7CisJCXItPnJzcHEudWxkID0gdWxkX3R5cGU7CisJfQorCisJbWVtY3B5KHJ4cV9pbmZvLT5uYW1lLCB1bGRfaW5mby0+bmFtZSwgSUZOQU1TSVopOworCWFkYXAtPnNnZS51bGRfcnhxX2luZm9bdWxkX3R5cGVdID0gcnhxX2luZm87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9xdWV1ZXNfdWxkKHN0cnVjdCBhZGFwdGVyICphZGFwLCB1bnNpZ25lZCBpbnQgdWxkX3R5cGUpCit7CisJc3RydWN0IHNnZV91bGRfcnhxX2luZm8gKnJ4cV9pbmZvID0gYWRhcC0+c2dlLnVsZF9yeHFfaW5mb1t1bGRfdHlwZV07CisKKwlrZnJlZShyeHFfaW5mby0+cnNwcV9pZCk7CisJa2ZyZWUocnhxX2luZm8tPnVsZHJ4cSk7CisJa2ZyZWUocnhxX2luZm8pOworfQorCitzdGF0aWMgaW50CityZXF1ZXN0X21zaXhfcXVldWVfaXJxc191bGQoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCB1bGRfdHlwZSkKK3sKKwlzdHJ1Y3Qgc2dlX3VsZF9yeHFfaW5mbyAqcnhxX2luZm8gPSBhZGFwLT5zZ2UudWxkX3J4cV9pbmZvW3VsZF90eXBlXTsKKwlpbnQgZXJyID0gMDsKKwl1bnNpZ25lZCBpbnQgaWR4LCBibWFwX2lkeDsKKworCWZvcl9lYWNoX3VsZHJ4cShyeHFfaW5mbywgaWR4KSB7CisJCWJtYXBfaWR4ID0gcnhxX2luZm8tPm1zaXhfdGJsW2lkeF07CisJCWVyciA9IHJlcXVlc3RfaXJxKGFkYXAtPm1zaXhfaW5mb191bGRzW2JtYXBfaWR4XS52ZWMsCisJCQkJICB0NF9zZ2VfaW50cl9tc2l4LCAwLAorCQkJCSAgYWRhcC0+bXNpeF9pbmZvX3VsZHNbYm1hcF9pZHhdLmRlc2MsCisJCQkJICAmcnhxX2luZm8tPnVsZHJ4cVtpZHhdLnJzcHEpOworCQlpZiAoZXJyKQorCQkJZ290byB1bndpbmQ7CisJfQorCXJldHVybiAwOwordW53aW5kOgorCXdoaWxlIChpZHgtLSA+IDApIHsKKwkJYm1hcF9pZHggPSByeHFfaW5mby0+bXNpeF90YmxbaWR4XTsKKwkJZnJlZV9tc2l4X2lkeF9pbl9ibWFwKGFkYXAsIGJtYXBfaWR4KTsKKwkJZnJlZV9pcnEoYWRhcC0+bXNpeF9pbmZvX3VsZHNbYm1hcF9pZHhdLnZlYywKKwkJCSAmcnhxX2luZm8tPnVsZHJ4cVtpZHhdLnJzcHEpOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9tc2l4X3F1ZXVlX2lycXNfdWxkKHN0cnVjdCBhZGFwdGVyICphZGFwLCB1bnNpZ25lZCBpbnQgdWxkX3R5cGUpCit7CisJc3RydWN0IHNnZV91bGRfcnhxX2luZm8gKnJ4cV9pbmZvID0gYWRhcC0+c2dlLnVsZF9yeHFfaW5mb1t1bGRfdHlwZV07CisJdW5zaWduZWQgaW50IGlkeCwgYm1hcF9pZHg7CisKKwlmb3JfZWFjaF91bGRyeHEocnhxX2luZm8sIGlkeCkgeworCQlibWFwX2lkeCA9IHJ4cV9pbmZvLT5tc2l4X3RibFtpZHhdOworCisJCWZyZWVfbXNpeF9pZHhfaW5fYm1hcChhZGFwLCBibWFwX2lkeCk7CisJCWZyZWVfaXJxKGFkYXAtPm1zaXhfaW5mb191bGRzW2JtYXBfaWR4XS52ZWMsCisJCQkgJnJ4cV9pbmZvLT51bGRyeHFbaWR4XS5yc3BxKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG5hbWVfbXNpeF92ZWNzX3VsZChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgdW5zaWduZWQgaW50IHVsZF90eXBlKQoreworCXN0cnVjdCBzZ2VfdWxkX3J4cV9pbmZvICpyeHFfaW5mbyA9IGFkYXAtPnNnZS51bGRfcnhxX2luZm9bdWxkX3R5cGVdOworCWludCBuID0gc2l6ZW9mKGFkYXAtPm1zaXhfaW5mb191bGRzWzBdLmRlc2MpOworCXVuc2lnbmVkIGludCBpZHgsIGJtYXBfaWR4OworCisJZm9yX2VhY2hfdWxkcnhxKHJ4cV9pbmZvLCBpZHgpIHsKKwkJYm1hcF9pZHggPSByeHFfaW5mby0+bXNpeF90YmxbaWR4XTsKKworCQlzbnByaW50ZihhZGFwLT5tc2l4X2luZm9fdWxkc1tibWFwX2lkeF0uZGVzYywgbiwgIiVzLSVzJWQiLAorCQkJIGFkYXAtPnBvcnRbMF0tPm5hbWUsIHJ4cV9pbmZvLT5uYW1lLCBpZHgpOworCX0KK30KKworc3RhdGljIHZvaWQgZW5hYmxlX3J4KHN0cnVjdCBhZGFwdGVyICphZGFwLCBzdHJ1Y3Qgc2dlX3JzcHEgKnEpCit7CisJaWYgKCFxKQorCQlyZXR1cm47CisKKwlpZiAocS0+aGFuZGxlcikgeworCQljeGdiX2J1c3lfcG9sbF9pbml0X2xvY2socSk7CisJCW5hcGlfZW5hYmxlKCZxLT5uYXBpKTsKKwl9CisJLyogMC1pbmNyZW1lbnQgR1RTIHRvIHN0YXJ0IHRoZSB0aW1lciBhbmQgZW5hYmxlIGludGVycnVwdHMgKi8KKwl0NF93cml0ZV9yZWcoYWRhcCwgTVlQRl9SRUcoU0dFX1BGX0dUU19BKSwKKwkJICAgICBTRUlOVEFSTV9WKHEtPmludHJfcGFyYW1zKSB8CisJCSAgICAgSU5HUkVTU1FJRF9WKHEtPmNudHh0X2lkKSk7Cit9CisKK3N0YXRpYyB2b2lkIHF1aWVzY2Vfcngoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHN0cnVjdCBzZ2VfcnNwcSAqcSkKK3sKKwlpZiAocSAmJiBxLT5oYW5kbGVyKSB7CisJCW5hcGlfZGlzYWJsZSgmcS0+bmFwaSk7CisJCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwkJd2hpbGUgKCFjeGdiX3BvbGxfbG9ja19uYXBpKHEpKQorCQkJbWRlbGF5KDEpOworCQlsb2NhbF9iaF9lbmFibGUoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9yeF91bGQoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCB1bGRfdHlwZSkKK3sKKwlzdHJ1Y3Qgc2dlX3VsZF9yeHFfaW5mbyAqcnhxX2luZm8gPSBhZGFwLT5zZ2UudWxkX3J4cV9pbmZvW3VsZF90eXBlXTsKKwlpbnQgaWR4OworCisJZm9yX2VhY2hfdWxkcnhxKHJ4cV9pbmZvLCBpZHgpCisJCWVuYWJsZV9yeChhZGFwLCAmcnhxX2luZm8tPnVsZHJ4cVtpZHhdLnJzcHEpOworfQorCitzdGF0aWMgdm9pZCBxdWllc2NlX3J4X3VsZChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgdW5zaWduZWQgaW50IHVsZF90eXBlKQoreworCXN0cnVjdCBzZ2VfdWxkX3J4cV9pbmZvICpyeHFfaW5mbyA9IGFkYXAtPnNnZS51bGRfcnhxX2luZm9bdWxkX3R5cGVdOworCWludCBpZHg7CisKKwlmb3JfZWFjaF91bGRyeHEocnhxX2luZm8sIGlkeCkKKwkJcXVpZXNjZV9yeChhZGFwLCAmcnhxX2luZm8tPnVsZHJ4cVtpZHhdLnJzcHEpOworfQorCitzdGF0aWMgdm9pZCB1bGRfcXVldWVfaW5pdChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgdW5zaWduZWQgaW50IHVsZF90eXBlLAorCQkJICAgc3RydWN0IGN4Z2I0X2xsZF9pbmZvICpsbGkpCit7CisJc3RydWN0IHNnZV91bGRfcnhxX2luZm8gKnJ4cV9pbmZvID0gYWRhcC0+c2dlLnVsZF9yeHFfaW5mb1t1bGRfdHlwZV07CisKKwlsbGktPnJ4cV9pZHMgPSByeHFfaW5mby0+cnNwcV9pZDsKKwlsbGktPm5yeHEgPSByeHFfaW5mby0+bnJ4cTsKKwlsbGktPmNpcV9pZHMgPSByeHFfaW5mby0+cnNwcV9pZCArIHJ4cV9pbmZvLT5ucnhxOworCWxsaS0+bmNpcSA9IHJ4cV9pbmZvLT5uY2lxOworfQorCitpbnQgdDRfdWxkX21lbV9hbGxvYyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3Qgc2dlICpzID0gJmFkYXAtPnNnZTsKKworCWFkYXAtPnVsZCA9IGtjYWxsb2MoQ1hHQjRfVUxEX01BWCwgc2l6ZW9mKCphZGFwLT51bGQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFkYXAtPnVsZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzLT51bGRfcnhxX2luZm8gPSBremFsbG9jKENYR0I0X1VMRF9NQVggKgorCQkJCSAgc2l6ZW9mKHN0cnVjdCBzZ2VfdWxkX3J4cV9pbmZvICopLAorCQkJCSAgR0ZQX0tFUk5FTCk7CisJaWYgKCFzLT51bGRfcnhxX2luZm8pCisJCWdvdG8gZXJyX3VsZDsKKworCXJldHVybiAwOworZXJyX3VsZDoKKwlrZnJlZShhZGFwLT51bGQpOworCXJldHVybiAtRU5PTUVNOworfQorCit2b2lkIHQ0X3VsZF9tZW1fZnJlZShzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3Qgc2dlICpzID0gJmFkYXAtPnNnZTsKKworCWtmcmVlKHMtPnVsZF9yeHFfaW5mbyk7CisJa2ZyZWUoYWRhcC0+dWxkKTsKK30KKwordm9pZCB0NF91bGRfY2xlYW5fdXAoc3RydWN0IGFkYXB0ZXIgKmFkYXApCit7CisJc3RydWN0IHNnZV91bGRfcnhxX2luZm8gKnJ4cV9pbmZvOworCXVuc2lnbmVkIGludCBpOworCisJaWYgKCFhZGFwLT51bGQpCisJCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgQ1hHQjRfVUxEX01BWDsgaSsrKSB7CisJCWlmICghYWRhcC0+dWxkW2ldLmhhbmRsZSkKKwkJCWNvbnRpbnVlOworCQlyeHFfaW5mbyA9IGFkYXAtPnNnZS51bGRfcnhxX2luZm9baV07CisJCWlmIChhZGFwLT5mbGFncyAmIEZVTExfSU5JVF9ET05FKQorCQkJcXVpZXNjZV9yeF91bGQoYWRhcCwgaSk7CisJCWlmIChhZGFwLT5mbGFncyAmIFVTSU5HX01TSVgpCisJCQlmcmVlX21zaXhfcXVldWVfaXJxc191bGQoYWRhcCwgaSk7CisJCWZyZWVfc2dlX3F1ZXVlc191bGQoYWRhcCwgaSk7CisJCWZyZWVfcXVldWVzX3VsZChhZGFwLCBpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVsZF9pbml0KHN0cnVjdCBhZGFwdGVyICphZGFwLCBzdHJ1Y3QgY3hnYjRfbGxkX2luZm8gKmxsZCkKK3sKKwlpbnQgaTsKKworCWxsZC0+cGRldiA9IGFkYXAtPnBkZXY7CisJbGxkLT5wZiA9IGFkYXAtPnBmOworCWxsZC0+bDJ0ID0gYWRhcC0+bDJ0OworCWxsZC0+dGlkcyA9ICZhZGFwLT50aWRzOworCWxsZC0+cG9ydHMgPSBhZGFwLT5wb3J0OworCWxsZC0+dnIgPSAmYWRhcC0+dnJlczsKKwlsbGQtPm10dXMgPSBhZGFwLT5wYXJhbXMubXR1czsKKwlsbGQtPm50eHEgPSBhZGFwLT5zZ2Uub2ZsZHFzZXRzOworCWxsZC0+bmNoYW4gPSBhZGFwLT5wYXJhbXMubnBvcnRzOworCWxsZC0+bnBvcnRzID0gYWRhcC0+cGFyYW1zLm5wb3J0czsKKwlsbGQtPndyX2NyZWQgPSBhZGFwLT5wYXJhbXMub2ZsZHFfd3JfY3JlZDsKKwlsbGQtPmlzY3NpX2lvbGVuID0gTUFYUlhEQVRBX0codDRfcmVhZF9yZWcoYWRhcCwgVFBfUEFSQV9SRUcyX0EpKTsKKwlsbGQtPmlzY3NpX3RhZ21hc2sgPSB0NF9yZWFkX3JlZyhhZGFwLCBVTFBfUlhfSVNDU0lfVEFHTUFTS19BKTsKKwlsbGQtPmlzY3NpX3Bnc3pfb3JkZXIgPSB0NF9yZWFkX3JlZyhhZGFwLCBVTFBfUlhfSVNDU0lfUFNaX0EpOworCWxsZC0+aXNjc2lfbGxpbWl0ID0gdDRfcmVhZF9yZWcoYWRhcCwgVUxQX1JYX0lTQ1NJX0xMSU1JVF9BKTsKKwlsbGQtPmlzY3NpX3BwbSA9ICZhZGFwLT5pc2NzaV9wcG07CisJbGxkLT5hZGFwdGVyX3R5cGUgPSBhZGFwLT5wYXJhbXMuY2hpcDsKKwlsbGQtPmNjbGtfcHMgPSAxMDAwMDAwMDAwIC8gYWRhcC0+cGFyYW1zLnZwZC5jY2xrOworCWxsZC0+dWRiX2RlbnNpdHkgPSAxIDw8IGFkYXAtPnBhcmFtcy5zZ2UuZXFfcXBwOworCWxsZC0+dWNxX2RlbnNpdHkgPSAxIDw8IGFkYXAtPnBhcmFtcy5zZ2UuaXFfcXBwOworCWxsZC0+ZmlsdF9tb2RlID0gYWRhcC0+cGFyYW1zLnRwLnZsYW5fcHJpX21hcDsKKwkvKiBNT0RRX1JFUV9NQVAgc2V0cyBxdWV1ZXMgMC0zIHRvIGNoYW4gMC0zICovCisJZm9yIChpID0gMDsgaSA8IE5DSEFOOyBpKyspCisJCWxsZC0+dHhfbW9kcVtpXSA9IGk7CisJbGxkLT5ndHNfcmVnID0gYWRhcC0+cmVncyArIE1ZUEZfUkVHKFNHRV9QRl9HVFNfQSk7CisJbGxkLT5kYl9yZWcgPSBhZGFwLT5yZWdzICsgTVlQRl9SRUcoU0dFX1BGX0tET09SQkVMTF9BKTsKKwlsbGQtPmZ3X3ZlcnMgPSBhZGFwLT5wYXJhbXMuZndfdmVyczsKKwlsbGQtPmRiZmlmb19pbnRfdGhyZXNoID0gZGJmaWZvX2ludF90aHJlc2g7CisJbGxkLT5zZ2VfaW5ncGFkYm91bmRhcnkgPSBhZGFwLT5zZ2UuZmxfYWxpZ247CisJbGxkLT5zZ2VfZWdyc3RhdHVzcGFnZXNpemUgPSBhZGFwLT5zZ2Uuc3RhdF9sZW47CisJbGxkLT5zZ2VfcGt0c2hpZnQgPSBhZGFwLT5zZ2UucGt0c2hpZnQ7CisJbGxkLT5lbmFibGVfZndfb2ZsZF9jb25uID0gYWRhcC0+ZmxhZ3MgJiBGV19PRkxEX0NPTk47CisJbGxkLT5tYXhfb3JkaXJkX3FwID0gYWRhcC0+cGFyYW1zLm1heF9vcmRpcmRfcXA7CisJbGxkLT5tYXhfaXJkX2FkYXB0ZXIgPSBhZGFwLT5wYXJhbXMubWF4X2lyZF9hZGFwdGVyOworCWxsZC0+dWxwdHhfbWVtd3JpdGVfZHNnbCA9IGFkYXAtPnBhcmFtcy51bHB0eF9tZW13cml0ZV9kc2dsOworCWxsZC0+bm9kZWlkID0gZGV2X3RvX25vZGUoYWRhcC0+cGRldl9kZXYpOworfQorCitzdGF0aWMgdm9pZCB1bGRfYXR0YWNoKHN0cnVjdCBhZGFwdGVyICphZGFwLCB1bnNpZ25lZCBpbnQgdWxkKQoreworCXZvaWQgKmhhbmRsZTsKKwlzdHJ1Y3QgY3hnYjRfbGxkX2luZm8gbGxpOworCisJdWxkX2luaXQoYWRhcCwgJmxsaSk7CisJdWxkX3F1ZXVlX2luaXQoYWRhcCwgdWxkLCAmbGxpKTsKKworCWhhbmRsZSA9IGFkYXAtPnVsZFt1bGRdLmFkZCgmbGxpKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJZGV2X3dhcm4oYWRhcC0+cGRldl9kZXYsCisJCQkgImNvdWxkIG5vdCBhdHRhY2ggdG8gdGhlICVzIGRyaXZlciwgZXJyb3IgJWxkXG4iLAorCQkJIGFkYXAtPnVsZFt1bGRdLm5hbWUsIFBUUl9FUlIoaGFuZGxlKSk7CisJCXJldHVybjsKKwl9CisKKwlhZGFwLT51bGRbdWxkXS5oYW5kbGUgPSBoYW5kbGU7CisJdDRfcmVnaXN0ZXJfbmV0ZXZlbnRfbm90aWZpZXIoKTsKKworCWlmIChhZGFwLT5mbGFncyAmIEZVTExfSU5JVF9ET05FKQorCQlhZGFwLT51bGRbdWxkXS5zdGF0ZV9jaGFuZ2UoaGFuZGxlLCBDWEdCNF9TVEFURV9VUCk7Cit9CisKKy8qKgorICoJY3hnYjRfcmVnaXN0ZXJfdWxkIC0gcmVnaXN0ZXIgYW4gdXBwZXItbGF5ZXIgZHJpdmVyCisgKglAdHlwZTogdGhlIFVMRCB0eXBlCisgKglAcDogdGhlIFVMRCBtZXRob2RzCisgKgorICoJUmVnaXN0ZXJzIGFuIHVwcGVyLWxheWVyIGRyaXZlciB3aXRoIHRoaXMgZHJpdmVyIGFuZCBub3RpZmllcyB0aGUgVUxECisgKglhYm91dCBhbnkgcHJlc2VudGx5IGF2YWlsYWJsZSBkZXZpY2VzIHRoYXQgc3VwcG9ydCBpdHMgdHlwZS4gIFJldHVybnMKKyAqCSUtRUJVU1kgaWYgYSBVTEQgb2YgdGhlIHNhbWUgdHlwZSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCisgKi8KK2ludCBjeGdiNF9yZWdpc3Rlcl91bGQoZW51bSBjeGdiNF91bGQgdHlwZSwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBjeGdiNF91bGRfaW5mbyAqcCkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBpbnQgYWRhcF9pZHggPSAwOworCXN0cnVjdCBhZGFwdGVyICphZGFwOworCisJaWYgKHR5cGUgPj0gQ1hHQjRfVUxEX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZ1bGRfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYWRhcCwgJmFkYXB0ZXJfbGlzdCwgbGlzdF9ub2RlKSB7CisJCWlmICgodHlwZSA9PSBDWEdCNF9VTERfQ1JZUFRPICYmICFpc19wY2lfdWxkKGFkYXApKSB8fAorCQkgICAgKHR5cGUgIT0gQ1hHQjRfVUxEX0NSWVBUTyAmJiAhaXNfb2ZmbG9hZChhZGFwKSkpCisJCQljb250aW51ZTsKKwkJaWYgKHR5cGUgPT0gQ1hHQjRfVUxEX0lTQ1NJVCAmJiBpc190NChhZGFwLT5wYXJhbXMuY2hpcCkpCisJCQljb250aW51ZTsKKwkJcmV0ID0gY2ZnX3F1ZXVlc191bGQoYWRhcCwgdHlwZSwgcCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwkJcmV0ID0gc2V0dXBfc2dlX3F1ZXVlc191bGQoYWRhcCwgdHlwZSwgcC0+bHJvKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZnJlZV9xdWV1ZXM7CisJCWlmIChhZGFwLT5mbGFncyAmIFVTSU5HX01TSVgpIHsKKwkJCW5hbWVfbXNpeF92ZWNzX3VsZChhZGFwLCB0eXBlKTsKKwkJCXJldCA9IHJlcXVlc3RfbXNpeF9xdWV1ZV9pcnFzX3VsZChhZGFwLCB0eXBlKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBmcmVlX3J4cTsKKwkJfQorCQlpZiAoYWRhcC0+ZmxhZ3MgJiBGVUxMX0lOSVRfRE9ORSkKKwkJCWVuYWJsZV9yeF91bGQoYWRhcCwgdHlwZSk7CisJCWlmIChhZGFwLT51bGRbdHlwZV0uYWRkKSB7CisJCQlyZXQgPSAtRUJVU1k7CisJCQlnb3RvIGZyZWVfaXJxOworCQl9CisJCWFkYXAtPnVsZFt0eXBlXSA9ICpwOworCQl1bGRfYXR0YWNoKGFkYXAsIHR5cGUpOworCQlhZGFwX2lkeCsrOworCX0KKwltdXRleF91bmxvY2soJnVsZF9tdXRleCk7CisJcmV0dXJuIDA7CisKK2ZyZWVfaXJxOgorCWlmIChhZGFwLT5mbGFncyAmIEZVTExfSU5JVF9ET05FKQorCQlxdWllc2NlX3J4X3VsZChhZGFwLCB0eXBlKTsKKwlpZiAoYWRhcC0+ZmxhZ3MgJiBVU0lOR19NU0lYKQorCQlmcmVlX21zaXhfcXVldWVfaXJxc191bGQoYWRhcCwgdHlwZSk7CitmcmVlX3J4cToKKwlmcmVlX3NnZV9xdWV1ZXNfdWxkKGFkYXAsIHR5cGUpOworZnJlZV9xdWV1ZXM6CisJZnJlZV9xdWV1ZXNfdWxkKGFkYXAsIHR5cGUpOworb3V0OgorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShhZGFwLCAmYWRhcHRlcl9saXN0LCBsaXN0X25vZGUpIHsKKwkJaWYgKCh0eXBlID09IENYR0I0X1VMRF9DUllQVE8gJiYgIWlzX3BjaV91bGQoYWRhcCkpIHx8CisJCSAgICAodHlwZSAhPSBDWEdCNF9VTERfQ1JZUFRPICYmICFpc19vZmZsb2FkKGFkYXApKSkKKwkJCWNvbnRpbnVlOworCQlpZiAodHlwZSA9PSBDWEdCNF9VTERfSVNDU0lUICYmIGlzX3Q0KGFkYXAtPnBhcmFtcy5jaGlwKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIWFkYXBfaWR4KQorCQkJYnJlYWs7CisJCWFkYXAtPnVsZFt0eXBlXS5oYW5kbGUgPSBOVUxMOworCQlhZGFwLT51bGRbdHlwZV0uYWRkID0gTlVMTDsKKwkJaWYgKGFkYXAtPmZsYWdzICYgRlVMTF9JTklUX0RPTkUpCisJCQlxdWllc2NlX3J4X3VsZChhZGFwLCB0eXBlKTsKKwkJaWYgKGFkYXAtPmZsYWdzICYgVVNJTkdfTVNJWCkKKwkJCWZyZWVfbXNpeF9xdWV1ZV9pcnFzX3VsZChhZGFwLCB0eXBlKTsKKwkJZnJlZV9zZ2VfcXVldWVzX3VsZChhZGFwLCB0eXBlKTsKKwkJZnJlZV9xdWV1ZXNfdWxkKGFkYXAsIHR5cGUpOworCQlhZGFwX2lkeC0tOworCX0KKwltdXRleF91bmxvY2soJnVsZF9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woY3hnYjRfcmVnaXN0ZXJfdWxkKTsKKworLyoqCisgKgljeGdiNF91bnJlZ2lzdGVyX3VsZCAtIHVucmVnaXN0ZXIgYW4gdXBwZXItbGF5ZXIgZHJpdmVyCisgKglAdHlwZTogdGhlIFVMRCB0eXBlCisgKgorICoJVW5yZWdpc3RlcnMgYW4gZXhpc3RpbmcgdXBwZXItbGF5ZXIgZHJpdmVyLgorICovCitpbnQgY3hnYjRfdW5yZWdpc3Rlcl91bGQoZW51bSBjeGdiNF91bGQgdHlwZSkKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcDsKKworCWlmICh0eXBlID49IENYR0I0X1VMRF9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmdWxkX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFkYXAsICZhZGFwdGVyX2xpc3QsIGxpc3Rfbm9kZSkgeworCQlpZiAoKHR5cGUgPT0gQ1hHQjRfVUxEX0NSWVBUTyAmJiAhaXNfcGNpX3VsZChhZGFwKSkgfHwKKwkJICAgICh0eXBlICE9IENYR0I0X1VMRF9DUllQVE8gJiYgIWlzX29mZmxvYWQoYWRhcCkpKQorCQkJY29udGludWU7CisJCWlmICh0eXBlID09IENYR0I0X1VMRF9JU0NTSVQgJiYgaXNfdDQoYWRhcC0+cGFyYW1zLmNoaXApKQorCQkJY29udGludWU7CisJCWFkYXAtPnVsZFt0eXBlXS5oYW5kbGUgPSBOVUxMOworCQlhZGFwLT51bGRbdHlwZV0uYWRkID0gTlVMTDsKKwkJaWYgKGFkYXAtPmZsYWdzICYgRlVMTF9JTklUX0RPTkUpCisJCQlxdWllc2NlX3J4X3VsZChhZGFwLCB0eXBlKTsKKwkJaWYgKGFkYXAtPmZsYWdzICYgVVNJTkdfTVNJWCkKKwkJCWZyZWVfbXNpeF9xdWV1ZV9pcnFzX3VsZChhZGFwLCB0eXBlKTsKKwkJZnJlZV9zZ2VfcXVldWVzX3VsZChhZGFwLCB0eXBlKTsKKwkJZnJlZV9xdWV1ZXNfdWxkKGFkYXAsIHR5cGUpOworCX0KKwltdXRleF91bmxvY2soJnVsZF9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woY3hnYjRfdW5yZWdpc3Rlcl91bGQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF91bGQuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfdWxkLmgKaW5kZXggZjNjNThhYS4uNDdiZDE0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF91bGQuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X3VsZC5oCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDaGVsc2lvIFQ0IEV0aGVybmV0IGRyaXZlciBmb3IgTGludXguCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTQgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTYgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCkBAIC0zMiw4ICszMiw4IEBACiAgKiBTT0ZUV0FSRS4KICAqLwogCi0jaWZuZGVmIF9fQ1hHQjRfT0ZMRF9ICi0jZGVmaW5lIF9fQ1hHQjRfT0ZMRF9ICisjaWZuZGVmIF9fQ1hHQjRfVUxEX0gKKyNkZWZpbmUgX19DWEdCNF9VTERfSAogCiAjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgpAQCAtNDIsNiArNDIsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgogI2luY2x1ZGUgImN4Z2I0LmgiCiAKKyNkZWZpbmUgTUFYX1VMRF9RU0VUUyAxNgorCiAvKiBDUEwgbWVzc2FnZSBwcmlvcml0eSBsZXZlbHMgKi8KIGVudW0gewogCUNQTF9QUklPUklUWV9EQVRBICAgICA9IDAsICAvKiBkYXRhIG1lc3NhZ2VzICovCkBAIC0xMDQsNiArMTA2LDcgQEAKIAl1bnNpZ25lZCBpbnQgYXRpZF9iYXNlOwogCiAJc3RydWN0IGZpbHRlcl9lbnRyeSAqZnRpZF90YWI7CisJdW5zaWduZWQgbG9uZyAqZnRpZF9ibWFwOwogCXVuc2lnbmVkIGludCBuZnRpZHM7CiAJdW5zaWduZWQgaW50IGZ0aWRfYmFzZTsKIAl1bnNpZ25lZCBpbnQgYWZ0aWRfYmFzZTsKQEAgLTEyNCw2ICsxMjcsOCBAQAogCWF0b21pY190IHRpZHNfaW5fdXNlOwogCS8qIFRJRHMgaW4gdGhlIEhBU0ggKi8KIAlhdG9taWNfdCBoYXNoX3RpZHNfaW5fdXNlOworCS8qIGxvY2sgZm9yIHNldHRpbmcvY2xlYXJpbmcgZmlsdGVyIGJpdG1hcCAqLworCXNwaW5sb2NrX3QgZnRpZF9sb2NrOwogfTsKIAogc3RhdGljIGlubGluZSB2b2lkICpsb29rdXBfdGlkKGNvbnN0IHN0cnVjdCB0aWRfaW5mbyAqdCwgdW5zaWduZWQgaW50IHRpZCkKQEAgLTE4MywxNSArMTg4LDM4IEBACiBpbnQgY3hnYjRfcmVtb3ZlX3NlcnZlcl9maWx0ZXIoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHN0aWQsCiAJCQkgICAgICAgdW5zaWduZWQgaW50IHF1ZXVlLCBib29sIGlwdjYpOwogCisvKiBGaWx0ZXIgb3BlcmF0aW9uIGNvbnRleHQgdG8gYWxsb3cgY2FsbGVycyBvZiBjeGdiNF9zZXRfZmlsdGVyKCkgYW5kCisgKiBjeGdiNF9kZWxfZmlsdGVyKCkgdG8gd2FpdCBmb3IgYW4gYXN5bmNocm9ub3VzIGNvbXBsZXRpb24uCisgKi8KK3N0cnVjdCBmaWx0ZXJfY3R4IHsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0aW9uOwkvKiBjb21wbGV0aW9uIHJlbmRlenZvdXMgKi8KKwl2b2lkICpjbG9zdXJlOwkJCS8qIGNhbGxlcidzIG9wYXF1ZSBpbmZvcm1hdGlvbiAqLworCWludCByZXN1bHQ7CQkJLyogcmVzdWx0IG9mIG9wZXJhdGlvbiAqLworCXUzMiB0aWQ7CQkJLyogdG8gc3RvcmUgdGlkICovCit9OworCitzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb247CisKK2ludCBfX2N4Z2I0X3NldF9maWx0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGZpbHRlcl9pZCwKKwkJICAgICAgIHN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiAqZnMsCisJCSAgICAgICBzdHJ1Y3QgZmlsdGVyX2N0eCAqY3R4KTsKK2ludCBfX2N4Z2I0X2RlbF9maWx0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGZpbHRlcl9pZCwKKwkJICAgICAgIHN0cnVjdCBmaWx0ZXJfY3R4ICpjdHgpOworaW50IGN4Z2I0X3NldF9maWx0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGZpbHRlcl9pZCwKKwkJICAgICBzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gKmZzKTsKK2ludCBjeGdiNF9kZWxfZmlsdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBmaWx0ZXJfaWQpOworCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3dyX3R4cShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcHJpbywgaW50IHF1ZXVlKQogewogCXNrYl9zZXRfcXVldWVfbWFwcGluZyhza2IsIChxdWV1ZSA8PCAxKSB8IHByaW8pOwogfQogCiBlbnVtIGN4Z2I0X3VsZCB7CisJQ1hHQjRfVUxEX0lOSVQsCiAJQ1hHQjRfVUxEX1JETUEsCiAJQ1hHQjRfVUxEX0lTQ1NJLAogCUNYR0I0X1VMRF9JU0NTSVQsCisJQ1hHQjRfVUxEX0NSWVBUTywKIAlDWEdCNF9VTERfTUFYCiB9OwogCkBAIC0yODQsNiArMzEyLDExIEBACiAKIHN0cnVjdCBjeGdiNF91bGRfaW5mbyB7CiAJY29uc3QgY2hhciAqbmFtZTsKKwl2b2lkICpoYW5kbGU7CisJdW5zaWduZWQgaW50IG5yeHE7CisJdW5zaWduZWQgaW50IHJ4cV9zaXplOworCWJvb2wgY2lxOworCWJvb2wgbHJvOwogCXZvaWQgKigqYWRkKShjb25zdCBzdHJ1Y3QgY3hnYjRfbGxkX2luZm8gKnApOwogCWludCAoKnJ4X2hhbmRsZXIpKHZvaWQgKmhhbmRsZSwgY29uc3QgX19iZTY0ICpyc3AsCiAJCQkgIGNvbnN0IHN0cnVjdCBwa3RfZ2wgKmdsKTsKQEAgLTMzMCw0ICszNjMsNCBAQAogCQkJIHU2NCAqcGJhcjJfcW9mZnNldCwKIAkJCSB1bnNpZ25lZCBpbnQgKnBiYXIyX3FpZCk7CiAKLSNlbmRpZiAgLyogIV9fQ1hHQjRfT0ZMRF9IICovCisjZW5kaWYgIC8qICFfX0NYR0I0X1VMRF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3NjaGVkLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3NjaGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM5ZGU3NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvc2NoZWQuYwpAQCAtMCwwICsxLDU1NiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDaGVsc2lvIFQ0IEV0aGVybmV0IGRyaXZlciBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKworI2luY2x1ZGUgImN4Z2I0LmgiCisjaW5jbHVkZSAic2NoZWQuaCIKKworLyogU3BpbmxvY2sgbXVzdCBiZSBoZWxkIGJ5IGNhbGxlciAqLworc3RhdGljIGludCB0NF9zY2hlZF9jbGFzc19md19jbWQoc3RydWN0IHBvcnRfaW5mbyAqcGksCisJCQkJIHN0cnVjdCBjaF9zY2hlZF9wYXJhbXMgKnAsCisJCQkJIGVudW0gc2NoZWRfZndfb3BzIG9wKQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gcGktPmFkYXB0ZXI7CisJc3RydWN0IHNjaGVkX3RhYmxlICpzID0gcGktPnNjaGVkX3RibDsKKwlzdHJ1Y3Qgc2NoZWRfY2xhc3MgKmU7CisJaW50IGVyciA9IDA7CisKKwllID0gJnMtPnRhYltwLT51LnBhcmFtcy5jbGFzc107CisJc3dpdGNoIChvcCkgeworCWNhc2UgU0NIRURfRldfT1BfQUREOgorCQllcnIgPSB0NF9zY2hlZF9wYXJhbXMoYWRhcCwgcC0+dHlwZSwKKwkJCQkgICAgICBwLT51LnBhcmFtcy5sZXZlbCwgcC0+dS5wYXJhbXMubW9kZSwKKwkJCQkgICAgICBwLT51LnBhcmFtcy5yYXRldW5pdCwKKwkJCQkgICAgICBwLT51LnBhcmFtcy5yYXRlbW9kZSwKKwkJCQkgICAgICBwLT51LnBhcmFtcy5jaGFubmVsLCBlLT5pZHgsCisJCQkJICAgICAgcC0+dS5wYXJhbXMubWlucmF0ZSwgcC0+dS5wYXJhbXMubWF4cmF0ZSwKKwkJCQkgICAgICBwLT51LnBhcmFtcy53ZWlnaHQsIHAtPnUucGFyYW1zLnBrdHNpemUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSAtRU5PVFNVUFA7CisJCWJyZWFrOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qIFNwaW5sb2NrIG11c3QgYmUgaGVsZCBieSBjYWxsZXIgKi8KK3N0YXRpYyBpbnQgdDRfc2NoZWRfYmluZF91bmJpbmRfb3Aoc3RydWN0IHBvcnRfaW5mbyAqcGksIHZvaWQgKmFyZywKKwkJCQkgICBlbnVtIHNjaGVkX2JpbmRfdHlwZSB0eXBlLCBib29sIGJpbmQpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBwaS0+YWRhcHRlcjsKKwl1MzIgZndfbW5lbSwgZndfY2xhc3MsIGZ3X3BhcmFtOworCXVuc2lnbmVkIGludCBwZiA9IGFkYXAtPnBmOworCXVuc2lnbmVkIGludCB2ZiA9IDA7CisJaW50IGVyciA9IDA7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNDSEVEX1FVRVVFOiB7CisJCXN0cnVjdCBzY2hlZF9xdWV1ZV9lbnRyeSAqcWU7CisKKwkJcWUgPSAoc3RydWN0IHNjaGVkX3F1ZXVlX2VudHJ5ICopYXJnOworCisJCS8qIENyZWF0ZSBhIHRlbXBsYXRlIGZvciB0aGUgRldfUEFSQU1TX0NNRCBtbmVtb25pYyBhbmQKKwkJICogdmFsdWUgKFRYIFNjaGVkdWxpbmcgQ2xhc3MgaW4gdGhpcyBjYXNlKS4KKwkJICovCisJCWZ3X21uZW0gPSAoRldfUEFSQU1TX01ORU1fVihGV19QQVJBTVNfTU5FTV9ETUFRKSB8CisJCQkgICBGV19QQVJBTVNfUEFSQU1fWF9WKAorCQkJCSAgIEZXX1BBUkFNU19QQVJBTV9ETUFRX0VRX1NDSEVEQ0xBU1NfRVRIKSk7CisJCWZ3X2NsYXNzID0gYmluZCA/IHFlLT5wYXJhbS5jbGFzcyA6IEZXX1NDSEVEX0NMU19OT05FOworCQlmd19wYXJhbSA9IChmd19tbmVtIHwgRldfUEFSQU1TX1BBUkFNX1laX1YocWUtPmNudHh0X2lkKSk7CisKKwkJcGYgPSBhZGFwLT5wZjsKKwkJdmYgPSAwOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT1RTVVBQOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSB0NF9zZXRfcGFyYW1zKGFkYXAsIGFkYXAtPm1ib3gsIHBmLCB2ZiwgMSwgJmZ3X3BhcmFtLCAmZndfY2xhc3MpOworCitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBzY2hlZF9jbGFzcyAqdDRfc2NoZWRfcXVldWVfbG9va3VwKHN0cnVjdCBwb3J0X2luZm8gKnBpLAorCQkJCQkJIGNvbnN0IHVuc2lnbmVkIGludCBxaWQsCisJCQkJCQkgaW50ICppbmRleCkKK3sKKwlzdHJ1Y3Qgc2NoZWRfdGFibGUgKnMgPSBwaS0+c2NoZWRfdGJsOworCXN0cnVjdCBzY2hlZF9jbGFzcyAqZSwgKmVuZDsKKwlzdHJ1Y3Qgc2NoZWRfY2xhc3MgKmZvdW5kID0gTlVMTDsKKwlpbnQgaTsKKworCS8qIExvb2sgZm9yIGEgY2xhc3Mgd2l0aCBtYXRjaGluZyBib3VuZCBxdWV1ZSBwYXJhbWV0ZXJzICovCisJZW5kID0gJnMtPnRhYltzLT5zY2hlZF9zaXplXTsKKwlmb3IgKGUgPSAmcy0+dGFiWzBdOyBlICE9IGVuZDsgKytlKSB7CisJCXN0cnVjdCBzY2hlZF9xdWV1ZV9lbnRyeSAqcWU7CisKKwkJaSA9IDA7CisJCWlmIChlLT5zdGF0ZSA9PSBTQ0hFRF9TVEFURV9VTlVTRUQpCisJCQljb250aW51ZTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHFlLCAmZS0+cXVldWVfbGlzdCwgbGlzdCkgeworCQkJaWYgKHFlLT5jbnR4dF9pZCA9PSBxaWQpIHsKKwkJCQlmb3VuZCA9IGU7CisJCQkJaWYgKGluZGV4KQorCQkJCQkqaW5kZXggPSBpOworCQkJCWJyZWFrOworCQkJfQorCQkJaSsrOworCQl9CisKKwkJaWYgKGZvdW5kKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGZvdW5kOworfQorCitzdGF0aWMgaW50IHQ0X3NjaGVkX3F1ZXVlX3VuYmluZChzdHJ1Y3QgcG9ydF9pbmZvICpwaSwgc3RydWN0IGNoX3NjaGVkX3F1ZXVlICpwKQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gcGktPmFkYXB0ZXI7CisJc3RydWN0IHNjaGVkX2NsYXNzICplOworCXN0cnVjdCBzY2hlZF9xdWV1ZV9lbnRyeSAqcWUgPSBOVUxMOworCXN0cnVjdCBzZ2VfZXRoX3R4cSAqdHhxOworCXVuc2lnbmVkIGludCBxaWQ7CisJaW50IGluZGV4ID0gLTE7CisJaW50IGVyciA9IDA7CisKKwlpZiAocC0+cXVldWUgPCAwIHx8IHAtPnF1ZXVlID49IHBpLT5ucXNldHMpCisJCXJldHVybiAtRVJBTkdFOworCisJdHhxID0gJmFkYXAtPnNnZS5ldGh0eHFbcGktPmZpcnN0X3FzZXQgKyBwLT5xdWV1ZV07CisJcWlkID0gdHhxLT5xLmNudHh0X2lkOworCisJLyogRmluZCB0aGUgZXhpc3RpbmcgY2xhc3MgdGhhdCB0aGUgcXVldWUgaXMgYm91bmQgdG8gKi8KKwllID0gdDRfc2NoZWRfcXVldWVfbG9va3VwKHBpLCBxaWQsICZpbmRleCk7CisJaWYgKGUgJiYgaW5kZXggPj0gMCkgeworCQlpbnQgaSA9IDA7CisKKwkJc3Bpbl9sb2NrKCZlLT5sb2NrKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShxZSwgJmUtPnF1ZXVlX2xpc3QsIGxpc3QpIHsKKwkJCWlmIChpID09IGluZGV4KQorCQkJCWJyZWFrOworCQkJaSsrOworCQl9CisJCWVyciA9IHQ0X3NjaGVkX2JpbmRfdW5iaW5kX29wKHBpLCAodm9pZCAqKXFlLCBTQ0hFRF9RVUVVRSwKKwkJCQkJICAgICAgZmFsc2UpOworCQlpZiAoZXJyKSB7CisJCQlzcGluX3VubG9jaygmZS0+bG9jayk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWxpc3RfZGVsKCZxZS0+bGlzdCk7CisJCXQ0X2ZyZWVfbWVtKHFlKTsKKwkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmUtPnJlZmNudCkpIHsKKwkJCWUtPnN0YXRlID0gU0NIRURfU1RBVEVfVU5VU0VEOworCQkJbWVtc2V0KCZlLT5pbmZvLCAwLCBzaXplb2YoZS0+aW5mbykpOworCQl9CisJCXNwaW5fdW5sb2NrKCZlLT5sb2NrKTsKKwl9CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB0NF9zY2hlZF9xdWV1ZV9iaW5kKHN0cnVjdCBwb3J0X2luZm8gKnBpLCBzdHJ1Y3QgY2hfc2NoZWRfcXVldWUgKnApCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBwaS0+YWRhcHRlcjsKKwlzdHJ1Y3Qgc2NoZWRfdGFibGUgKnMgPSBwaS0+c2NoZWRfdGJsOworCXN0cnVjdCBzY2hlZF9jbGFzcyAqZTsKKwlzdHJ1Y3Qgc2NoZWRfcXVldWVfZW50cnkgKnFlID0gTlVMTDsKKwlzdHJ1Y3Qgc2dlX2V0aF90eHEgKnR4cTsKKwl1bnNpZ25lZCBpbnQgcWlkOworCWludCBlcnIgPSAwOworCisJaWYgKHAtPnF1ZXVlIDwgMCB8fCBwLT5xdWV1ZSA+PSBwaS0+bnFzZXRzKQorCQlyZXR1cm4gLUVSQU5HRTsKKworCXFlID0gdDRfYWxsb2NfbWVtKHNpemVvZihzdHJ1Y3Qgc2NoZWRfcXVldWVfZW50cnkpKTsKKwlpZiAoIXFlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXR4cSA9ICZhZGFwLT5zZ2UuZXRodHhxW3BpLT5maXJzdF9xc2V0ICsgcC0+cXVldWVdOworCXFpZCA9IHR4cS0+cS5jbnR4dF9pZDsKKworCS8qIFVuYmluZCBxdWV1ZSBmcm9tIGFueSBleGlzdGluZyBjbGFzcyAqLworCWVyciA9IHQ0X3NjaGVkX3F1ZXVlX3VuYmluZChwaSwgcCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwkvKiBCaW5kIHF1ZXVlIHRvIHNwZWNpZmllZCBjbGFzcyAqLworCW1lbXNldChxZSwgMCwgc2l6ZW9mKCpxZSkpOworCXFlLT5jbnR4dF9pZCA9IHFpZDsKKwltZW1jcHkoJnFlLT5wYXJhbSwgcCwgc2l6ZW9mKHFlLT5wYXJhbSkpOworCisJZSA9ICZzLT50YWJbcWUtPnBhcmFtLmNsYXNzXTsKKwlzcGluX2xvY2soJmUtPmxvY2spOworCWVyciA9IHQ0X3NjaGVkX2JpbmRfdW5iaW5kX29wKHBpLCAodm9pZCAqKXFlLCBTQ0hFRF9RVUVVRSwgdHJ1ZSk7CisJaWYgKGVycikgeworCQl0NF9mcmVlX21lbShxZSk7CisJCXNwaW5fdW5sb2NrKCZlLT5sb2NrKTsKKwkJZ290byBvdXQ7CisJfQorCisJbGlzdF9hZGRfdGFpbCgmcWUtPmxpc3QsICZlLT5xdWV1ZV9saXN0KTsKKwlhdG9taWNfaW5jKCZlLT5yZWZjbnQpOworCXNwaW5fdW5sb2NrKCZlLT5sb2NrKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCB0NF9zY2hlZF9jbGFzc191bmJpbmRfYWxsKHN0cnVjdCBwb3J0X2luZm8gKnBpLAorCQkJCSAgICAgIHN0cnVjdCBzY2hlZF9jbGFzcyAqZSwKKwkJCQkgICAgICBlbnVtIHNjaGVkX2JpbmRfdHlwZSB0eXBlKQoreworCWlmICghZSkKKwkJcmV0dXJuOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTQ0hFRF9RVUVVRTogeworCQlzdHJ1Y3Qgc2NoZWRfcXVldWVfZW50cnkgKnFlOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkocWUsICZlLT5xdWV1ZV9saXN0LCBsaXN0KQorCQkJdDRfc2NoZWRfcXVldWVfdW5iaW5kKHBpLCAmcWUtPnBhcmFtKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCB0NF9zY2hlZF9jbGFzc19iaW5kX3VuYmluZF9vcChzdHJ1Y3QgcG9ydF9pbmZvICpwaSwgdm9pZCAqYXJnLAorCQkJCQkgZW51bSBzY2hlZF9iaW5kX3R5cGUgdHlwZSwgYm9vbCBiaW5kKQoreworCWludCBlcnIgPSAwOworCisJaWYgKCFhcmcpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTQ0hFRF9RVUVVRTogeworCQlzdHJ1Y3QgY2hfc2NoZWRfcXVldWUgKnFlID0gKHN0cnVjdCBjaF9zY2hlZF9xdWV1ZSAqKWFyZzsKKworCQlpZiAoYmluZCkKKwkJCWVyciA9IHQ0X3NjaGVkX3F1ZXVlX2JpbmQocGksIHFlKTsKKwkJZWxzZQorCQkJZXJyID0gdDRfc2NoZWRfcXVldWVfdW5iaW5kKHBpLCBxZSk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQllcnIgPSAtRU5PVFNVUFA7CisJCWJyZWFrOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogY3hnYjRfc2NoZWRfY2xhc3NfYmluZCAtIEJpbmQgYW4gZW50aXR5IHRvIGEgc2NoZWR1bGluZyBjbGFzcworICogQGRldjogbmV0X2RldmljZSBwb2ludGVyCisgKiBAYXJnOiBFbnRpdHkgb3BhcXVlIGRhdGEKKyAqIEB0eXBlOiBFbnRpdHkgdHlwZSAoUXVldWUpCisgKgorICogQmluZHMgYW4gZW50aXR5IChxdWV1ZSkgdG8gYSBzY2hlZHVsaW5nIGNsYXNzLiAgSWYgdGhlIGVudGl0eQorICogaXMgYm91bmQgdG8gYW5vdGhlciBjbGFzcywgaXQgd2lsbCBiZSB1bmJvdW5kIGZyb20gdGhlIG90aGVyIGNsYXNzCisgKiBhbmQgYm91bmQgdG8gdGhlIGNsYXNzIHNwZWNpZmllZCBpbiBAYXJnLgorICovCitpbnQgY3hnYjRfc2NoZWRfY2xhc3NfYmluZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphcmcsCisJCQkgICBlbnVtIHNjaGVkX2JpbmRfdHlwZSB0eXBlKQoreworCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2MnBpbmZvKGRldik7CisJc3RydWN0IHNjaGVkX3RhYmxlICpzOworCWludCBlcnIgPSAwOworCXU4IGNsYXNzX2lkOworCisJaWYgKCFjYW5fc2NoZWQoZGV2KSkKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKworCWlmICghYXJnKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU0NIRURfUVVFVUU6IHsKKwkJc3RydWN0IGNoX3NjaGVkX3F1ZXVlICpxZSA9IChzdHJ1Y3QgY2hfc2NoZWRfcXVldWUgKilhcmc7CisKKwkJY2xhc3NfaWQgPSBxZS0+Y2xhc3M7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1RTVVBQOworCX0KKworCWlmICghdmFsaWRfY2xhc3NfaWQoZGV2LCBjbGFzc19pZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNsYXNzX2lkID09IFNDSEVEX0NMU19OT05FKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCisJcyA9IHBpLT5zY2hlZF90Ymw7CisJd3JpdGVfbG9jaygmcy0+cndfbG9jayk7CisJZXJyID0gdDRfc2NoZWRfY2xhc3NfYmluZF91bmJpbmRfb3AocGksIGFyZywgdHlwZSwgdHJ1ZSk7CisJd3JpdGVfdW5sb2NrKCZzLT5yd19sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogY3hnYjRfc2NoZWRfY2xhc3NfdW5iaW5kIC0gVW5iaW5kIGFuIGVudGl0eSBmcm9tIGEgc2NoZWR1bGluZyBjbGFzcworICogQGRldjogbmV0X2RldmljZSBwb2ludGVyCisgKiBAYXJnOiBFbnRpdHkgb3BhcXVlIGRhdGEKKyAqIEB0eXBlOiBFbnRpdHkgdHlwZSAoUXVldWUpCisgKgorICogVW5iaW5kcyBhbiBlbnRpdHkgKHF1ZXVlKSBmcm9tIGEgc2NoZWR1bGluZyBjbGFzcy4KKyAqLworaW50IGN4Z2I0X3NjaGVkX2NsYXNzX3VuYmluZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphcmcsCisJCQkgICAgIGVudW0gc2NoZWRfYmluZF90eXBlIHR5cGUpCit7CisJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXYycGluZm8oZGV2KTsKKwlzdHJ1Y3Qgc2NoZWRfdGFibGUgKnM7CisJaW50IGVyciA9IDA7CisJdTggY2xhc3NfaWQ7CisKKwlpZiAoIWNhbl9zY2hlZChkZXYpKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCisJaWYgKCFhcmcpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTQ0hFRF9RVUVVRTogeworCQlzdHJ1Y3QgY2hfc2NoZWRfcXVldWUgKnFlID0gKHN0cnVjdCBjaF9zY2hlZF9xdWV1ZSAqKWFyZzsKKworCQljbGFzc19pZCA9IHFlLT5jbGFzczsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFNVUFA7CisJfQorCisJaWYgKCF2YWxpZF9jbGFzc19pZChkZXYsIGNsYXNzX2lkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzID0gcGktPnNjaGVkX3RibDsKKwl3cml0ZV9sb2NrKCZzLT5yd19sb2NrKTsKKwllcnIgPSB0NF9zY2hlZF9jbGFzc19iaW5kX3VuYmluZF9vcChwaSwgYXJnLCB0eXBlLCBmYWxzZSk7CisJd3JpdGVfdW5sb2NrKCZzLT5yd19sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qIElmIEBwIGlzIE5VTEwsIGZldGNoIGFueSBhdmFpbGFibGUgdW51c2VkIGNsYXNzICovCitzdGF0aWMgc3RydWN0IHNjaGVkX2NsYXNzICp0NF9zY2hlZF9jbGFzc19sb29rdXAoc3RydWN0IHBvcnRfaW5mbyAqcGksCisJCQkJCQljb25zdCBzdHJ1Y3QgY2hfc2NoZWRfcGFyYW1zICpwKQoreworCXN0cnVjdCBzY2hlZF90YWJsZSAqcyA9IHBpLT5zY2hlZF90Ymw7CisJc3RydWN0IHNjaGVkX2NsYXNzICplLCAqZW5kOworCXN0cnVjdCBzY2hlZF9jbGFzcyAqZm91bmQgPSBOVUxMOworCisJaWYgKCFwKSB7CisJCS8qIEdldCBhbnkgYXZhaWxhYmxlIHVudXNlZCBjbGFzcyAqLworCQllbmQgPSAmcy0+dGFiW3MtPnNjaGVkX3NpemVdOworCQlmb3IgKGUgPSAmcy0+dGFiWzBdOyBlICE9IGVuZDsgKytlKSB7CisJCQlpZiAoZS0+c3RhdGUgPT0gU0NIRURfU1RBVEVfVU5VU0VEKSB7CisJCQkJZm91bmQgPSBlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyogTG9vayBmb3IgYSBjbGFzcyB3aXRoIG1hdGNoaW5nIHNjaGVkdWxpbmcgcGFyYW1ldGVycyAqLworCQlzdHJ1Y3QgY2hfc2NoZWRfcGFyYW1zIGluZm87CisJCXN0cnVjdCBjaF9zY2hlZF9wYXJhbXMgdHA7CisKKwkJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworCQltZW1zZXQoJnRwLCAwLCBzaXplb2YodHApKTsKKworCQltZW1jcHkoJnRwLCBwLCBzaXplb2YodHApKTsKKwkJLyogRG9uJ3QgdHJ5IHRvIG1hdGNoIGNsYXNzIHBhcmFtZXRlciAqLworCQl0cC51LnBhcmFtcy5jbGFzcyA9IFNDSEVEX0NMU19OT05FOworCisJCWVuZCA9ICZzLT50YWJbcy0+c2NoZWRfc2l6ZV07CisJCWZvciAoZSA9ICZzLT50YWJbMF07IGUgIT0gZW5kOyArK2UpIHsKKwkJCWlmIChlLT5zdGF0ZSA9PSBTQ0hFRF9TVEFURV9VTlVTRUQpCisJCQkJY29udGludWU7CisKKwkJCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKKwkJCW1lbWNweSgmaW5mbywgJmUtPmluZm8sIHNpemVvZihpbmZvKSk7CisJCQkvKiBEb24ndCB0cnkgdG8gbWF0Y2ggY2xhc3MgcGFyYW1ldGVyICovCisJCQlpbmZvLnUucGFyYW1zLmNsYXNzID0gU0NIRURfQ0xTX05PTkU7CisKKwkJCWlmICgoaW5mby50eXBlID09IHRwLnR5cGUpICYmCisJCQkgICAgKCFtZW1jbXAoJmluZm8udS5wYXJhbXMsICZ0cC51LnBhcmFtcywKKwkJCQkgICAgIHNpemVvZihpbmZvLnUucGFyYW1zKSkpKSB7CisJCQkJZm91bmQgPSBlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGZvdW5kOworfQorCitzdGF0aWMgc3RydWN0IHNjaGVkX2NsYXNzICp0NF9zY2hlZF9jbGFzc19hbGxvYyhzdHJ1Y3QgcG9ydF9pbmZvICpwaSwKKwkJCQkJCXN0cnVjdCBjaF9zY2hlZF9wYXJhbXMgKnApCit7CisJc3RydWN0IHNjaGVkX3RhYmxlICpzID0gcGktPnNjaGVkX3RibDsKKwlzdHJ1Y3Qgc2NoZWRfY2xhc3MgKmU7CisJdTggY2xhc3NfaWQ7CisJaW50IGVycjsKKworCWlmICghcCkKKwkJcmV0dXJuIE5VTEw7CisKKwljbGFzc19pZCA9IHAtPnUucGFyYW1zLmNsYXNzOworCisJLyogT25seSBhY2NlcHQgc2VhcmNoIGZvciBleGlzdGluZyBjbGFzcyB3aXRoIG1hdGNoaW5nIHBhcmFtcworCSAqIG9yIGFsbG9jYXRpb24gb2YgbmV3IGNsYXNzIHdpdGggc3BlY2lmaWVkIHBhcmFtcworCSAqLworCWlmIChjbGFzc19pZCAhPSBTQ0hFRF9DTFNfTk9ORSkKKwkJcmV0dXJuIE5VTEw7CisKKwl3cml0ZV9sb2NrKCZzLT5yd19sb2NrKTsKKwkvKiBTZWUgaWYgdGhlcmUncyBhbiBleGlzaXRpbmcgY2xhc3Mgd2l0aCBzYW1lCisJICogcmVxdWVzdGVkIHNjaGVkIHBhcmFtcworCSAqLworCWUgPSB0NF9zY2hlZF9jbGFzc19sb29rdXAocGksIHApOworCWlmICghZSkgeworCQlzdHJ1Y3QgY2hfc2NoZWRfcGFyYW1zIG5wOworCisJCS8qIEZldGNoIGFueSBhdmFpbGFibGUgdW51c2VkIGNsYXNzICovCisJCWUgPSB0NF9zY2hlZF9jbGFzc19sb29rdXAocGksIE5VTEwpOworCQlpZiAoIWUpCisJCQlnb3RvIG91dDsKKworCQltZW1zZXQoJm5wLCAwLCBzaXplb2YobnApKTsKKwkJbWVtY3B5KCZucCwgcCwgc2l6ZW9mKG5wKSk7CisJCW5wLnUucGFyYW1zLmNsYXNzID0gZS0+aWR4OworCisJCXNwaW5fbG9jaygmZS0+bG9jayk7CisJCS8qIE5ldyBjbGFzcyAqLworCQllcnIgPSB0NF9zY2hlZF9jbGFzc19md19jbWQocGksICZucCwgU0NIRURfRldfT1BfQUREKTsKKwkJaWYgKGVycikgeworCQkJc3Bpbl91bmxvY2soJmUtPmxvY2spOworCQkJZSA9IE5VTEw7CisJCQlnb3RvIG91dDsKKwkJfQorCQltZW1jcHkoJmUtPmluZm8sICZucCwgc2l6ZW9mKGUtPmluZm8pKTsKKwkJYXRvbWljX3NldCgmZS0+cmVmY250LCAwKTsKKwkJZS0+c3RhdGUgPSBTQ0hFRF9TVEFURV9BQ1RJVkU7CisJCXNwaW5fdW5sb2NrKCZlLT5sb2NrKTsKKwl9CisKK291dDoKKwl3cml0ZV91bmxvY2soJnMtPnJ3X2xvY2spOworCXJldHVybiBlOworfQorCisvKioKKyAqIGN4Z2I0X3NjaGVkX2NsYXNzX2FsbG9jIC0gYWxsb2NhdGUgYSBzY2hlZHVsaW5nIGNsYXNzCisgKiBAZGV2OiBuZXRfZGV2aWNlIHBvaW50ZXIKKyAqIEBwOiBuZXcgc2NoZWR1bGluZyBjbGFzcyB0byBjcmVhdGUuCisgKgorICogUmV0dXJucyBwb2ludGVyIHRvIHRoZSBzY2hlZHVsaW5nIGNsYXNzIGNyZWF0ZWQuICBJZiBAcCBpcyBOVUxMLCB0aGVuCisgKiBpdCBhbGxvY2F0ZXMgYW5kIHJldHVybnMgYW55IGF2YWlsYWJsZSB1bnVzZWQgc2NoZWR1bGluZyBjbGFzcy4gSWYgYQorICogc2NoZWR1bGluZyBjbGFzcyB3aXRoIG1hdGNoaW5nIEBwIGlzIGZvdW5kLCB0aGVuIHRoZSBtYXRjaGluZyBjbGFzcyBpcworICogcmV0dXJuZWQuCisgKi8KK3N0cnVjdCBzY2hlZF9jbGFzcyAqY3hnYjRfc2NoZWRfY2xhc3NfYWxsb2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgIHN0cnVjdCBjaF9zY2hlZF9wYXJhbXMgKnApCit7CisJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXYycGluZm8oZGV2KTsKKwl1OCBjbGFzc19pZDsKKworCWlmICghY2FuX3NjaGVkKGRldikpCisJCXJldHVybiBOVUxMOworCisJY2xhc3NfaWQgPSBwLT51LnBhcmFtcy5jbGFzczsKKwlpZiAoIXZhbGlkX2NsYXNzX2lkKGRldiwgY2xhc3NfaWQpKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiB0NF9zY2hlZF9jbGFzc19hbGxvYyhwaSwgcCk7Cit9CisKK3N0YXRpYyB2b2lkIHQ0X3NjaGVkX2NsYXNzX2ZyZWUoc3RydWN0IHBvcnRfaW5mbyAqcGksIHN0cnVjdCBzY2hlZF9jbGFzcyAqZSkKK3sKKwl0NF9zY2hlZF9jbGFzc191bmJpbmRfYWxsKHBpLCBlLCBTQ0hFRF9RVUVVRSk7Cit9CisKK3N0cnVjdCBzY2hlZF90YWJsZSAqdDRfaW5pdF9zY2hlZCh1bnNpZ25lZCBpbnQgc2NoZWRfc2l6ZSkKK3sKKwlzdHJ1Y3Qgc2NoZWRfdGFibGUgKnM7CisJdW5zaWduZWQgaW50IGk7CisKKwlzID0gdDRfYWxsb2NfbWVtKHNpemVvZigqcykgKyBzY2hlZF9zaXplICogc2l6ZW9mKHN0cnVjdCBzY2hlZF9jbGFzcykpOworCWlmICghcykKKwkJcmV0dXJuIE5VTEw7CisKKwlzLT5zY2hlZF9zaXplID0gc2NoZWRfc2l6ZTsKKwlyd2xvY2tfaW5pdCgmcy0+cndfbG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcy0+c2NoZWRfc2l6ZTsgaSsrKSB7CisJCW1lbXNldCgmcy0+dGFiW2ldLCAwLCBzaXplb2Yoc3RydWN0IHNjaGVkX2NsYXNzKSk7CisJCXMtPnRhYltpXS5pZHggPSBpOworCQlzLT50YWJbaV0uc3RhdGUgPSBTQ0hFRF9TVEFURV9VTlVTRUQ7CisJCUlOSVRfTElTVF9IRUFEKCZzLT50YWJbaV0ucXVldWVfbGlzdCk7CisJCXNwaW5fbG9ja19pbml0KCZzLT50YWJbaV0ubG9jayk7CisJCWF0b21pY19zZXQoJnMtPnRhYltpXS5yZWZjbnQsIDApOworCX0KKwlyZXR1cm4gczsKK30KKwordm9pZCB0NF9jbGVhbnVwX3NjaGVkKHN0cnVjdCBhZGFwdGVyICphZGFwKQoreworCXN0cnVjdCBzY2hlZF90YWJsZSAqczsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvcl9lYWNoX3BvcnQoYWRhcCwgaSkgeworCQlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldjJwaW5mbyhhZGFwLT5wb3J0W2ldKTsKKworCQlzID0gcGktPnNjaGVkX3RibDsKKwkJZm9yIChpID0gMDsgaSA8IHMtPnNjaGVkX3NpemU7IGkrKykgeworCQkJc3RydWN0IHNjaGVkX2NsYXNzICplOworCisJCQl3cml0ZV9sb2NrKCZzLT5yd19sb2NrKTsKKwkJCWUgPSAmcy0+dGFiW2ldOworCQkJaWYgKGUtPnN0YXRlID09IFNDSEVEX1NUQVRFX0FDVElWRSkKKwkJCQl0NF9zY2hlZF9jbGFzc19mcmVlKHBpLCBlKTsKKwkJCXdyaXRlX3VubG9jaygmcy0+cndfbG9jayk7CisJCX0KKwkJdDRfZnJlZV9tZW0ocyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9zY2hlZC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9zY2hlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YjJiM2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3NjaGVkLmgKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQ2hlbHNpbyBUNCBFdGhlcm5ldCBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fQ1hHQjRfU0NIRURfSAorI2RlZmluZSBfX0NYR0I0X1NDSEVEX0gKKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisKKyNkZWZpbmUgU0NIRURfQ0xTX05PTkUgMHhmZgorCisjZGVmaW5lIEZXX1NDSEVEX0NMU19OT05FIDB4ZmZmZmZmZmYKKworLyogTWF4IHJhdGUgdGhhdCBjYW4gYmUgc2V0IHRvIGEgc2NoZWR1bGluZyBjbGFzcyBpcyAxMCBHYnBzICovCisjZGVmaW5lIFNDSEVEX01BWF9SQVRFX0tCUFMgMTAwMDAwMDBVCisKK2VudW0geworCVNDSEVEX1NUQVRFX0FDVElWRSwKKwlTQ0hFRF9TVEFURV9VTlVTRUQsCit9OworCitlbnVtIHNjaGVkX2Z3X29wcyB7CisJU0NIRURfRldfT1BfQURELAorfTsKKworZW51bSBzY2hlZF9iaW5kX3R5cGUgeworCVNDSEVEX1FVRVVFLAorfTsKKworc3RydWN0IHNjaGVkX3F1ZXVlX2VudHJ5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdW5zaWduZWQgaW50IGNudHh0X2lkOworCXN0cnVjdCBjaF9zY2hlZF9xdWV1ZSBwYXJhbTsKK307CisKK3N0cnVjdCBzY2hlZF9jbGFzcyB7CisJdTggc3RhdGU7CisJdTggaWR4OworCXN0cnVjdCBjaF9zY2hlZF9wYXJhbXMgaW5mbzsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHF1ZXVlX2xpc3Q7CisJc3BpbmxvY2tfdCBsb2NrOyAvKiBQZXIgY2xhc3MgbG9jayAqLworCWF0b21pY190IHJlZmNudDsKK307CisKK3N0cnVjdCBzY2hlZF90YWJsZSB7ICAgICAgLyogcGVyIHBvcnQgc2NoZWR1bGluZyB0YWJsZSAqLworCXU4IHNjaGVkX3NpemU7CisJcndsb2NrX3QgcndfbG9jazsgLyogVGFibGUgbG9jayAqLworCXN0cnVjdCBzY2hlZF9jbGFzcyB0YWJbMF07Cit9OworCitzdGF0aWMgaW5saW5lIGJvb2wgY2FuX3NjaGVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXYycGluZm8oZGV2KTsKKworCXJldHVybiAhcGktPnNjaGVkX3RibCA/IGZhbHNlIDogdHJ1ZTsKK30KKworc3RhdGljIGlubGluZSBib29sIHZhbGlkX2NsYXNzX2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGNsYXNzX2lkKQoreworCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2MnBpbmZvKGRldik7CisKKwlpZiAoKGNsYXNzX2lkID4gcGktPnNjaGVkX3RibC0+c2NoZWRfc2l6ZSAtIDEpICYmCisJICAgIChjbGFzc19pZCAhPSBTQ0hFRF9DTFNfTk9ORSkpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitpbnQgY3hnYjRfc2NoZWRfY2xhc3NfYmluZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphcmcsCisJCQkgICBlbnVtIHNjaGVkX2JpbmRfdHlwZSB0eXBlKTsKK2ludCBjeGdiNF9zY2hlZF9jbGFzc191bmJpbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYXJnLAorCQkJICAgICBlbnVtIHNjaGVkX2JpbmRfdHlwZSB0eXBlKTsKKworc3RydWN0IHNjaGVkX2NsYXNzICpjeGdiNF9zY2hlZF9jbGFzc19hbGxvYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICAgc3RydWN0IGNoX3NjaGVkX3BhcmFtcyAqcCk7CisKK3N0cnVjdCBzY2hlZF90YWJsZSAqdDRfaW5pdF9zY2hlZCh1bnNpZ25lZCBpbnQgc2l6ZSk7Cit2b2lkIHQ0X2NsZWFudXBfc2NoZWQoc3RydWN0IGFkYXB0ZXIgKmFkYXApOworI2VuZGlmICAvKiBfX0NYR0I0X1NDSEVEX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvc2dlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3NnZS5jCmluZGV4IGFkMzU1MmQuLjFlNzRmZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvc2dlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9zZ2UuYwpAQCAtMjg2MCw2ICsyODYwLDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCB0NF9zZ2VfbW9kX2N0cmxfdHhxKHN0cnVjdCBhZGFwdGVyICphZGFwLCB1bnNpZ25lZCBpbnQgZXFpZCwKKwkJCXVuc2lnbmVkIGludCBjbXBscWlkKQoreworCXUzMiBwYXJhbSwgdmFsOworCisJcGFyYW0gPSAoRldfUEFSQU1TX01ORU1fVihGV19QQVJBTVNfTU5FTV9ETUFRKSB8CisJCSBGV19QQVJBTVNfUEFSQU1fWF9WKEZXX1BBUkFNU19QQVJBTV9ETUFRX0VRX0NNUExJUUlEX0NUUkwpIHwKKwkJIEZXX1BBUkFNU19QQVJBTV9ZWl9WKGVxaWQpKTsKKwl2YWwgPSBjbXBscWlkOworCXJldHVybiB0NF9zZXRfcGFyYW1zKGFkYXAsIGFkYXAtPm1ib3gsIGFkYXAtPnBmLCAwLCAxLCAmcGFyYW0sICZ2YWwpOworfQorCiBpbnQgdDRfc2dlX2FsbG9jX29mbGRfdHhxKHN0cnVjdCBhZGFwdGVyICphZGFwLCBzdHJ1Y3Qgc2dlX29mbGRfdHhxICp0eHEsCiAJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBpcWlkKQogewpAQCAtMjkyOCw4ICsyOTQwLDggQEAKIAlxLT5kZXNjID0gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgZnJlZV9yc3BxX2ZsKHN0cnVjdCBhZGFwdGVyICphZGFwLCBzdHJ1Y3Qgc2dlX3JzcHEgKnJxLAotCQkJIHN0cnVjdCBzZ2VfZmwgKmZsKQordm9pZCBmcmVlX3JzcHFfZmwoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHN0cnVjdCBzZ2VfcnNwcSAqcnEsCisJCSAgc3RydWN0IHNnZV9mbCAqZmwpCiB7CiAJc3RydWN0IHNnZSAqcyA9ICZhZGFwLT5zZ2U7CiAJdW5zaWduZWQgaW50IGZsX2lkID0gZmwgPyBmbC0+Y250eHRfaWQgOiAweGZmZmY7CkBAIC0zMDE0LDEyICszMDI2LDYgQEAKIAkJfQogCX0KIAotCS8qIGNsZWFuIHVwIFJETUEgYW5kIGlTQ1NJIFJ4IHF1ZXVlcyAqLwotCXQ0X2ZyZWVfb2ZsZF9yeHFzKGFkYXAsIGFkYXAtPnNnZS5pc2NzaXFzZXRzLCBhZGFwLT5zZ2UuaXNjc2lyeHEpOwotCXQ0X2ZyZWVfb2ZsZF9yeHFzKGFkYXAsIGFkYXAtPnNnZS5uaXNjc2l0cSwgYWRhcC0+c2dlLmlzY3NpdHJ4cSk7Ci0JdDRfZnJlZV9vZmxkX3J4cXMoYWRhcCwgYWRhcC0+c2dlLnJkbWFxcywgYWRhcC0+c2dlLnJkbWFyeHEpOwotCXQ0X2ZyZWVfb2ZsZF9yeHFzKGFkYXAsIGFkYXAtPnNnZS5yZG1hY2lxcywgYWRhcC0+c2dlLnJkbWFjaXEpOwotCiAJLyogY2xlYW4gdXAgb2ZmbG9hZCBUeCBxdWV1ZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhZGFwLT5zZ2Uub2ZsZHR4cSk7IGkrKykgewogCQlzdHJ1Y3Qgc2dlX29mbGRfdHhxICpxID0gJmFkYXAtPnNnZS5vZmxkdHhxW2ldOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC90NF9ody5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC90NF9ody5jCmluZGV4IGRjOTJjODAuLjIwZGVjODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvdDRfaHcuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3Q0X2h3LmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENoZWxzaW8gVDQgRXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNiBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTI3MjksNyArMjcyOSw3IEBACiAKIG91dDoKIAl2ZnJlZSh2cGQpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIHJldCA8IDAgPyByZXQgOiAwOwogfQogCiAvKioKQEAgLTM2MjcsNyArMzYyNyw4IEBACiB9CiAKICNkZWZpbmUgQURWRVJUX01BU0sgKEZXX1BPUlRfQ0FQX1NQRUVEXzEwME0gfCBGV19QT1JUX0NBUF9TUEVFRF8xRyB8XAotCQkgICAgIEZXX1BPUlRfQ0FQX1NQRUVEXzEwRyB8IEZXX1BPUlRfQ0FQX1NQRUVEXzQwRyB8IFwKKwkJICAgICBGV19QT1JUX0NBUF9TUEVFRF8xMEcgfCBGV19QT1JUX0NBUF9TUEVFRF8yNUcgfCBcCisJCSAgICAgRldfUE9SVF9DQVBfU1BFRURfNDBHIHwgRldfUE9SVF9DQVBfU1BFRURfMTAwRyB8IFwKIAkJICAgICBGV19QT1JUX0NBUF9BTkVHKQogCiAvKioKQEAgLTcxOTYsOCArNzE5NywxMiBAQAogCQlzcGVlZCA9IDEwMDA7CiAJZWxzZSBpZiAoc3RhdCAmIEZXX1BPUlRfQ01EX0xTUEVFRF9WKEZXX1BPUlRfQ0FQX1NQRUVEXzEwRykpCiAJCXNwZWVkID0gMTAwMDA7CisJZWxzZSBpZiAoc3RhdCAmIEZXX1BPUlRfQ01EX0xTUEVFRF9WKEZXX1BPUlRfQ0FQX1NQRUVEXzI1RykpCisJCXNwZWVkID0gMjUwMDA7CiAJZWxzZSBpZiAoc3RhdCAmIEZXX1BPUlRfQ01EX0xTUEVFRF9WKEZXX1BPUlRfQ0FQX1NQRUVEXzQwRykpCiAJCXNwZWVkID0gNDAwMDA7CisJZWxzZSBpZiAoc3RhdCAmIEZXX1BPUlRfQ01EX0xTUEVFRF9WKEZXX1BPUlRfQ0FQX1NQRUVEXzEwMEcpKQorCQlzcGVlZCA9IDEwMDAwMDsKIAogCWxjID0gJnBpLT5saW5rX2NmZzsKIApAQCAtODI2NCwzICs4MjY5LDczIEBACiAJCXQ0X3NnZV9kZWNvZGVfaWRtYV9zdGF0ZShhZGFwdGVyLCBpZG1hLT5pZG1hX3N0YXRlW2ldKTsKIAl9CiB9CisKKy8qKgorICoJdDRfc2V0X3ZmX21hYyAtIFNldCBNQUMgYWRkcmVzcyBmb3IgdGhlIHNwZWNpZmllZCBWRgorICoJQGFkYXB0ZXI6IFRoZSBhZGFwdGVyCisgKglAdmY6IG9uZSBvZiB0aGUgVkZzIGluc3RhbnRpYXRlZCBieSB0aGUgc3BlY2lmaWVkIFBGCisgKglAbmFkZHI6IHRoZSBudW1iZXIgb2YgTUFDIGFkZHJlc3NlcworICoJQGFkZHI6IHRoZSBNQUMgYWRkcmVzcyhlcykgdG8gYmUgc2V0IHRvIHRoZSBzcGVjaWZpZWQgVkYKKyAqLworaW50IHQ0X3NldF92Zl9tYWNfYWNsKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgdmYsCisJCSAgICAgIHVuc2lnbmVkIGludCBuYWRkciwgdTggKmFkZHIpCit7CisJc3RydWN0IGZ3X2FjbF9tYWNfY21kIGNtZDsKKworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJY21kLm9wX3RvX3ZmbiA9IGNwdV90b19iZTMyKEZXX0NNRF9PUF9WKEZXX0FDTF9NQUNfQ01EKSB8CisJCQkJICAgIEZXX0NNRF9SRVFVRVNUX0YgfAorCQkJCSAgICBGV19DTURfV1JJVEVfRiB8CisJCQkJICAgIEZXX0FDTF9NQUNfQ01EX1BGTl9WKGFkYXB0ZXItPnBmKSB8CisJCQkJICAgIEZXX0FDTF9NQUNfQ01EX1ZGTl9WKHZmKSk7CisKKwkvKiBOb3RlOiBEbyBub3QgZW5hYmxlIHRoZSBBQ0wgKi8KKwljbWQuZW5fdG9fbGVuMTYgPSBjcHVfdG9fYmUzMigodW5zaWduZWQgaW50KUZXX0xFTjE2KGNtZCkpOworCWNtZC5ubWFjID0gbmFkZHI7CisKKwlzd2l0Y2ggKGFkYXB0ZXItPnBmKSB7CisJY2FzZSAzOgorCQltZW1jcHkoY21kLm1hY2FkZHIzLCBhZGRyLCBzaXplb2YoY21kLm1hY2FkZHIzKSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJbWVtY3B5KGNtZC5tYWNhZGRyMiwgYWRkciwgc2l6ZW9mKGNtZC5tYWNhZGRyMikpOworCQlicmVhazsKKwljYXNlIDE6CisJCW1lbWNweShjbWQubWFjYWRkcjEsIGFkZHIsIHNpemVvZihjbWQubWFjYWRkcjEpKTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQltZW1jcHkoY21kLm1hY2FkZHIwLCBhZGRyLCBzaXplb2YoY21kLm1hY2FkZHIwKSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiB0NF93cl9tYm94KGFkYXB0ZXIsIGFkYXB0ZXItPm1ib3gsICZjbWQsIHNpemVvZihjbWQpLCAmY21kKTsKK30KKworaW50IHQ0X3NjaGVkX3BhcmFtcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IHR5cGUsIGludCBsZXZlbCwgaW50IG1vZGUsCisJCSAgICBpbnQgcmF0ZXVuaXQsIGludCByYXRlbW9kZSwgaW50IGNoYW5uZWwsIGludCBjbGFzcywKKwkJICAgIGludCBtaW5yYXRlLCBpbnQgbWF4cmF0ZSwgaW50IHdlaWdodCwgaW50IHBrdHNpemUpCit7CisJc3RydWN0IGZ3X3NjaGVkX2NtZCBjbWQ7CisKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5vcF90b193cml0ZSA9IGNwdV90b19iZTMyKEZXX0NNRF9PUF9WKEZXX1NDSEVEX0NNRCkgfAorCQkJCSAgICAgIEZXX0NNRF9SRVFVRVNUX0YgfAorCQkJCSAgICAgIEZXX0NNRF9XUklURV9GKTsKKwljbWQucmV0dmFsX2xlbjE2ID0gY3B1X3RvX2JlMzIoRldfTEVOMTYoY21kKSk7CisKKwljbWQudS5wYXJhbXMuc2MgPSBGV19TQ0hFRF9TQ19QQVJBTVM7CisJY21kLnUucGFyYW1zLnR5cGUgPSB0eXBlOworCWNtZC51LnBhcmFtcy5sZXZlbCA9IGxldmVsOworCWNtZC51LnBhcmFtcy5tb2RlID0gbW9kZTsKKwljbWQudS5wYXJhbXMuY2ggPSBjaGFubmVsOworCWNtZC51LnBhcmFtcy5jbCA9IGNsYXNzOworCWNtZC51LnBhcmFtcy51bml0ID0gcmF0ZXVuaXQ7CisJY21kLnUucGFyYW1zLnJhdGUgPSByYXRlbW9kZTsKKwljbWQudS5wYXJhbXMubWluID0gY3B1X3RvX2JlMzIobWlucmF0ZSk7CisJY21kLnUucGFyYW1zLm1heCA9IGNwdV90b19iZTMyKG1heHJhdGUpOworCWNtZC51LnBhcmFtcy53ZWlnaHQgPSBjcHVfdG9fYmUxNih3ZWlnaHQpOworCWNtZC51LnBhcmFtcy5wa3RzaXplID0gY3B1X3RvX2JlMTYocGt0c2l6ZSk7CisKKwlyZXR1cm4gdDRfd3JfbWJveF9tZWF0KGFkYXB0ZXIsIGFkYXB0ZXItPm1ib3gsICZjbWQsIHNpemVvZihjbWQpLAorCQkJICAgICAgIE5VTEwsIDEpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC90NF9tc2cuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvdDRfbXNnLmgKaW5kZXggZTBlYmUxMy4uZmJhM2IyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC90NF9tc2cuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3Q0X21zZy5oCkBAIC02MSw2ICs2MSw3IEBACiAJQ1BMX0FCT1JUX1JFUV9SU1MgICAgID0gMHgyQiwKIAlDUExfQUJPUlRfUlBMX1JTUyAgICAgPSAweDJELAogCisJQ1BMX1JYX1BIWVNfQUREUiAgICAgID0gMHgzMCwKIAlDUExfQ0xPU0VfQ09OX1JQTCAgICAgPSAweDMyLAogCUNQTF9JU0NTSV9IRFIgICAgICAgICA9IDB4MzMsCiAJQ1BMX1JETUFfQ1FFICAgICAgICAgID0gMHgzNSwKQEAgLTgzLDYgKzg0LDEwIEBACiAJQ1BMX1BBU1NfT1BFTl9SRVE2ICAgID0gMHg4MSwKIAlDUExfQUNUX09QRU5fUkVRNiAgICAgPSAweDgzLAogCisJQ1BMX1RYX1RMU19QRFUgICAgID0gICAgMHg4OCwKKwlDUExfVFhfU0VDX1BEVSAgICAgICAgPSAweDhBLAorCUNQTF9UWF9UTFNfQUNLICAgICAgICA9IDB4OEIsCisKIAlDUExfUkRNQV9URVJNSU5BVEUgICAgPSAweEEyLAogCUNQTF9SRE1BX1dSSVRFICAgICAgICA9IDB4QTQsCiAJQ1BMX1NHRV9FR1JfVVBEQVRFICAgID0gMHhBNSwKQEAgLTk0LDYgKzk5LDggQEAKIAlDUExfRlc0X1BMRCAgICAgICAgICAgPSAweEMxLAogCUNQTF9GVzRfQUNLICAgICAgICAgICA9IDB4QzMsCiAKKwlDUExfUlhfUEhZU19EU0dMICAgICAgPSAweEQwLAorCiAJQ1BMX0ZXNl9NU0cgICAgICAgICAgID0gMHhFMCwKIAlDUExfRlc2X1BMRCAgICAgICAgICAgPSAweEUxLAogCUNQTF9UWF9QS1RfTFNPICAgICAgICA9IDB4RUQsCkBAIC0xMzYyLDYgKzEzNjksMTUgQEAKIAlfX2JlMzIgbGVuOwogfTsKIAorc3RydWN0IHVscF90eHBrdCB7CisJX19iZTMyIGNtZF9kZXN0OworCV9fYmUzMiBsZW47Cit9OworCisjZGVmaW5lIFVMUFRYX0NNRF9TICAgIDI0CisjZGVmaW5lIFVMUFRYX0NNRF9NICAgIDB4RkYKKyNkZWZpbmUgVUxQVFhfQ01EX1YoeCkgKCh4KSA8PCBVTFBUWF9DTURfUykKKwogI2RlZmluZSBVTFBUWF9OU0dFX1MgICAgMAogI2RlZmluZSBVTFBUWF9OU0dFX1YoeCkgKCh4KSA8PCBVTFBUWF9OU0dFX1MpCiAKQEAgLTEzNjksNiArMTM4NSwyMiBAQAogI2RlZmluZSBVTFBUWF9NT1JFX1YoeCkJKCh4KSA8PCBVTFBUWF9NT1JFX1MpCiAjZGVmaW5lIFVMUFRYX01PUkVfRglVTFBUWF9NT1JFX1YoMVUpCiAKKyNkZWZpbmUgVUxQX1RYUEtUX0RFU1RfUyAgICAxNgorI2RlZmluZSBVTFBfVFhQS1RfREVTVF9NICAgIDB4MworI2RlZmluZSBVTFBfVFhQS1RfREVTVF9WKHgpICgoeCkgPDwgVUxQX1RYUEtUX0RFU1RfUykKKworI2RlZmluZSBVTFBfVFhQS1RfRklEX1MgICAgIDQKKyNkZWZpbmUgVUxQX1RYUEtUX0ZJRF9NICAgICAweDdmZgorI2RlZmluZSBVTFBfVFhQS1RfRklEX1YoeCkgICgoeCkgPDwgVUxQX1RYUEtUX0ZJRF9TKQorCisjZGVmaW5lIFVMUF9UWFBLVF9ST19TICAgICAgMworI2RlZmluZSBVTFBfVFhQS1RfUk9fVih4KSAoKHgpIDw8IFVMUF9UWFBLVF9ST19TKQorI2RlZmluZSBVTFBfVFhQS1RfUk9fRiBVTFBfVFhQS1RfUk9fVigxVSkKKworI2RlZmluZSBVTFBfVFhfU0NfTU9SRV9TIDIzCisjZGVmaW5lIFVMUF9UWF9TQ19NT1JFX1YoeCkgKCh4KSA8PCBVTFBfVFhfU0NfTU9SRV9TKQorI2RlZmluZSBVTFBfVFhfU0NfTU9SRV9GICBVTFBfVFhfU0NfTU9SRV9WKDFVKQorCiBzdHJ1Y3QgdWxwX21lbV9pbyB7CiAJV1JfSERSOwogCV9fYmUzMiBjbWQ7CkBAIC0xNDA2LDQgKzE0MzgsNDA5IEBACiAjZGVmaW5lIFVMUF9NRU1JT19EQVRBX0xFTl9TICAgIDAKICNkZWZpbmUgVUxQX01FTUlPX0RBVEFfTEVOX1YoeCkgKCh4KSA8PCBVTFBfTUVNSU9fREFUQV9MRU5fUykKIAorI2RlZmluZSBVTFBUWF9OU0dFX1MgICAgMAorI2RlZmluZSBVTFBUWF9OU0dFX00gICAgMHhGRkZGCisjZGVmaW5lIFVMUFRYX05TR0VfVih4KSAoKHgpIDw8IFVMUFRYX05TR0VfUykKKyNkZWZpbmUgVUxQVFhfTlNHRV9HKHgpICgoKHgpID4+IFVMUFRYX05TR0VfUykgJiBVTFBUWF9OU0dFX00pCisKK3N0cnVjdCB1bHB0eF9zY19tZW1yZCB7CisJX19iZTMyIGNtZF90b19sZW47CisJX19iZTMyIGFkZHI7Cit9OworCisjZGVmaW5lIFVMUF9UWFBLVF9EQVRBTU9ESUZZX1MgICAgICAgMjMKKyNkZWZpbmUgVUxQX1RYUEtUX0RBVEFNT0RJRllfTSAgICAgICAweDEKKyNkZWZpbmUgVUxQX1RYUEtUX0RBVEFNT0RJRllfVih4KSAgICAoKHgpIDw8IFVMUF9UWFBLVF9EQVRBTU9ESUZZX1MpCisjZGVmaW5lIFVMUF9UWFBLVF9EQVRBTU9ESUZZX0coeCkgICAgXAorCSgoKHgpID4+IFVMUF9UWFBLVF9EQVRBTU9ESUZZX1MpICYgVUxQX1RYUEtUX0RBVEFNT0RJRllfX00pCisjZGVmaW5lIFVMUF9UWFBLVF9EQVRBTU9ESUZZX0YgICAgICAgVUxQX1RYUEtUX0RBVEFNT0RJRllfVigxVSkKKworI2RlZmluZSBVTFBfVFhQS1RfQ0hBTk5FTElEX1MgICAgICAgIDIyCisjZGVmaW5lIFVMUF9UWFBLVF9DSEFOTkVMSURfTSAgICAgICAgMHgxCisjZGVmaW5lIFVMUF9UWFBLVF9DSEFOTkVMSURfVih4KSAgICAgKCh4KSA8PCBVTFBfVFhQS1RfQ0hBTk5FTElEX1MpCisjZGVmaW5lIFVMUF9UWFBLVF9DSEFOTkVMSURfRyh4KSAgICAgXAorCSgoKHgpID4+IFVMUF9UWFBLVF9DSEFOTkVMSURfUykgJiBVTFBfVFhQS1RfQ0hBTk5FTElEX00pCisjZGVmaW5lIFVMUF9UWFBLVF9DSEFOTkVMSURfRiAgICAgICAgVUxQX1RYUEtUX0NIQU5ORUxJRF9WKDFVKQorCisjZGVmaW5lIFNDTURfU0VRX05PX0NUUkxfUyAgICAgIDI5CisjZGVmaW5lIFNDTURfU0VRX05PX0NUUkxfTSAgICAgIDB4MworI2RlZmluZSBTQ01EX1NFUV9OT19DVFJMX1YoeCkgICAoKHgpIDw8IFNDTURfU0VRX05PX0NUUkxfUykKKyNkZWZpbmUgU0NNRF9TRVFfTk9fQ1RSTF9HKHgpICAgXAorCSgoKHgpID4+IFNDTURfU0VRX05PX0NUUkxfUykgJiBTQ01EX1NFUV9OT19DVFJMX00pCisKKy8qIFN0c0ZpZWxkUHJzbnQtIFN0YXR1cyBmaWVsZCBhdCB0aGUgZW5kIG9mIHRoZSBUTFMgUERVICovCisjZGVmaW5lIFNDTURfU1RBVFVTX1BSRVNFTlRfUyAgIDI4CisjZGVmaW5lIFNDTURfU1RBVFVTX1BSRVNFTlRfTSAgIDB4MQorI2RlZmluZSBTQ01EX1NUQVRVU19QUkVTRU5UX1YoeCkgICAgKCh4KSA8PCBTQ01EX1NUQVRVU19QUkVTRU5UX1MpCisjZGVmaW5lIFNDTURfU1RBVFVTX1BSRVNFTlRfRyh4KSAgICBcCisJKCgoeCkgPj4gU0NNRF9TVEFUVVNfUFJFU0VOVF9TKSAmIFNDTURfU1RBVFVTX1BSRVNFTlRfTSkKKyNkZWZpbmUgU0NNRF9TVEFUVVNfUFJFU0VOVF9GICAgU0NNRF9TVEFUVVNfUFJFU0VOVF9WKDFVKQorCisvKiBQcm90b1ZlcnNpb24gLSBQcm90b2NvbCBWZXJzaW9uIDA6IDEuMiwgMToxLjEsIDI6RFRMUywgMzpHZW5lcmljLAorICogMy0xNTogUmVzZXJ2ZWQuCisgKi8KKyNkZWZpbmUgU0NNRF9QUk9UT19WRVJTSU9OX1MgICAgMjQKKyNkZWZpbmUgU0NNRF9QUk9UT19WRVJTSU9OX00gICAgMHhmCisjZGVmaW5lIFNDTURfUFJPVE9fVkVSU0lPTl9WKHgpICgoeCkgPDwgU0NNRF9QUk9UT19WRVJTSU9OX1MpCisjZGVmaW5lIFNDTURfUFJPVE9fVkVSU0lPTl9HKHgpIFwKKwkoKCh4KSA+PiBTQ01EX1BST1RPX1ZFUlNJT05fUykgJiBTQ01EX1BST1RPX1ZFUlNJT05fTSkKKworLyogRW5jRGVjQ3RybCAtIEVuY3J5cHRpb24vRGVjcnlwdGlvbiBDb250cm9sLiAwOiBFbmNyeXB0LCAxOiBEZWNyeXB0ICovCisjZGVmaW5lIFNDTURfRU5DX0RFQ19DVFJMX1MgICAgIDIzCisjZGVmaW5lIFNDTURfRU5DX0RFQ19DVFJMX00gICAgIDB4MQorI2RlZmluZSBTQ01EX0VOQ19ERUNfQ1RSTF9WKHgpICAoKHgpIDw8IFNDTURfRU5DX0RFQ19DVFJMX1MpCisjZGVmaW5lIFNDTURfRU5DX0RFQ19DVFJMX0coeCkgIFwKKwkoKCh4KSA+PiBTQ01EX0VOQ19ERUNfQ1RSTF9TKSAmIFNDTURfRU5DX0RFQ19DVFJMX00pCisjZGVmaW5lIFNDTURfRU5DX0RFQ19DVFJMX0YgU0NNRF9FTkNfREVDX0NUUkxfVigxVSkKKworLyogQ2lwaGVyQXV0aFNlcUN0cmwgLSBDaXBoZXIgQXV0aGVudGljYXRpb24gU2VxdWVuY2UgQ29udHJvbC4gKi8KKyNkZWZpbmUgU0NNRF9DSVBIX0FVVEhfU0VRX0NUUkxfUyAgICAgICAyMgorI2RlZmluZSBTQ01EX0NJUEhfQVVUSF9TRVFfQ1RSTF9NICAgICAgIDB4MQorI2RlZmluZSBTQ01EX0NJUEhfQVVUSF9TRVFfQ1RSTF9WKHgpICAgIFwKKwkoKHgpIDw8IFNDTURfQ0lQSF9BVVRIX1NFUV9DVFJMX1MpCisjZGVmaW5lIFNDTURfQ0lQSF9BVVRIX1NFUV9DVFJMX0coeCkgICAgXAorCSgoKHgpID4+IFNDTURfQ0lQSF9BVVRIX1NFUV9DVFJMX1MpICYgU0NNRF9DSVBIX0FVVEhfU0VRX0NUUkxfTSkKKyNkZWZpbmUgU0NNRF9DSVBIX0FVVEhfU0VRX0NUUkxfRiAgIFNDTURfQ0lQSF9BVVRIX1NFUV9DVFJMX1YoMVUpCisKKy8qIENpcGhNb2RlIC0gIENpcGhlciBNb2RlLiAwOiBOT1AsIDE6QUVTLUNCQywgMjpBRVMtR0NNLCAzOkFFUy1DVFIsCisgKiA0OkdlbmVyaWMtQUVTLCA1LTE1OiBSZXNlcnZlZC4KKyAqLworI2RlZmluZSBTQ01EX0NJUEhfTU9ERV9TICAgIDE4CisjZGVmaW5lIFNDTURfQ0lQSF9NT0RFX00gICAgMHhmCisjZGVmaW5lIFNDTURfQ0lQSF9NT0RFX1YoeCkgKCh4KSA8PCBTQ01EX0NJUEhfTU9ERV9TKQorI2RlZmluZSBTQ01EX0NJUEhfTU9ERV9HKHgpIFwKKwkoKCh4KSA+PiBTQ01EX0NJUEhfTU9ERV9TKSAmIFNDTURfQ0lQSF9NT0RFX00pCisKKy8qIEF1dGhNb2RlIC0gQXV0aCBNb2RlLiAwOiBOT1AsIDE6U0hBMSwgMjpTSEEyLTIyNCwgMzpTSEEyLTI1NgorICogNC0xNTogUmVzZXJ2ZWQKKyAqLworI2RlZmluZSBTQ01EX0FVVEhfTU9ERV9TICAgIDE0CisjZGVmaW5lIFNDTURfQVVUSF9NT0RFX00gICAgMHhmCisjZGVmaW5lIFNDTURfQVVUSF9NT0RFX1YoeCkgKCh4KSA8PCBTQ01EX0FVVEhfTU9ERV9TKQorI2RlZmluZSBTQ01EX0FVVEhfTU9ERV9HKHgpIFwKKwkoKCh4KSA+PiBTQ01EX0FVVEhfTU9ERV9TKSAmIFNDTURfQVVUSF9NT0RFX00pCisKKy8qIEhtYWNDdHJsIC0gSE1BQyBDb250cm9sLiAwOk5PUCwgMTpObyB0cnVuY2F0aW9uLCAyOlN1cHBvcnQgSE1BQyBUcnVuY2F0aW9uCisgKiBwZXIgUkZDIDQzNjYsIDM6SVBTZWMgOTYgYml0cywgNC03OlJlc2VydmVkCisgKi8KKyNkZWZpbmUgU0NNRF9ITUFDX0NUUkxfUyAgICAxMQorI2RlZmluZSBTQ01EX0hNQUNfQ1RSTF9NICAgIDB4NworI2RlZmluZSBTQ01EX0hNQUNfQ1RSTF9WKHgpICgoeCkgPDwgU0NNRF9ITUFDX0NUUkxfUykKKyNkZWZpbmUgU0NNRF9ITUFDX0NUUkxfRyh4KSBcCisJKCgoeCkgPj4gU0NNRF9ITUFDX0NUUkxfUykgJiBTQ01EX0hNQUNfQ1RSTF9NKQorCisvKiBJdlNpemUgLSBJViBzaXplIGluIHVuaXRzIG9mIDIgYnl0ZXMgKi8KKyNkZWZpbmUgU0NNRF9JVl9TSVpFX1MgIDcKKyNkZWZpbmUgU0NNRF9JVl9TSVpFX00gIDB4ZgorI2RlZmluZSBTQ01EX0lWX1NJWkVfVih4KSAgICgoeCkgPDwgU0NNRF9JVl9TSVpFX1MpCisjZGVmaW5lIFNDTURfSVZfU0laRV9HKHgpICAgXAorCSgoKHgpID4+IFNDTURfSVZfU0laRV9TKSAmIFNDTURfSVZfU0laRV9NKQorCisvKiBOdW1JVnMgLSBOdW1iZXIgb2YgSVZzICovCisjZGVmaW5lIFNDTURfTlVNX0lWU19TICAwCisjZGVmaW5lIFNDTURfTlVNX0lWU19NICAweDdmCisjZGVmaW5lIFNDTURfTlVNX0lWU19WKHgpICAgKCh4KSA8PCBTQ01EX05VTV9JVlNfUykKKyNkZWZpbmUgU0NNRF9OVU1fSVZTX0coeCkgICBcCisJKCgoeCkgPj4gU0NNRF9OVU1fSVZTX1MpICYgU0NNRF9OVU1fSVZTX00pCisKKy8qIEVuYkRiZ0lkIC0gSWYgdGhpcyBpcyBlbmFibGVkIHVwcGVyIDIwICg2Mzo0NCkgYml0cyBpZiBTZXFOdW1iZXIKKyAqIChiZWxvdykgYXJlIHVzZWQgYXMgQ2lkIChjb25uZWN0aW9uIGlkIGZvciBkZWJ1ZyBzdGF0dXMpLCB0aGVzZQorICogYml0cyBhcmUgcGFkZGVkIHRvIHplcm8gZm9yIGZvcm1pbmcgdGhlIDY0IGJpdAorICogc2VxdWVuY2UgbnVtYmVyIGZvciBUTFMKKyAqLworI2RlZmluZSBTQ01EX0VOQl9EQkdJRF9TICAzMQorI2RlZmluZSBTQ01EX0VOQl9EQkdJRF9NICAweDEKKyNkZWZpbmUgU0NNRF9FTkJfREJHSURfVih4KSAgICgoeCkgPDwgU0NNRF9FTkJfREJHSURfUykKKyNkZWZpbmUgU0NNRF9FTkJfREJHSURfRyh4KSAgIFwKKwkoKCh4KSA+PiBTQ01EX0VOQl9EQkdJRF9TKSAmIFNDTURfRU5CX0RCR0lEX00pCisKKy8qIElWIGdlbmVyYXRpb24gaW4gU1cuICovCisjZGVmaW5lIFNDTURfSVZfR0VOX0NUUkxfUyAgICAgIDMwCisjZGVmaW5lIFNDTURfSVZfR0VOX0NUUkxfTSAgICAgIDB4MQorI2RlZmluZSBTQ01EX0lWX0dFTl9DVFJMX1YoeCkgICAoKHgpIDw8IFNDTURfSVZfR0VOX0NUUkxfUykKKyNkZWZpbmUgU0NNRF9JVl9HRU5fQ1RSTF9HKHgpICAgXAorCSgoKHgpID4+IFNDTURfSVZfR0VOX0NUUkxfUykgJiBTQ01EX0lWX0dFTl9DVFJMX00pCisjZGVmaW5lIFNDTURfSVZfR0VOX0NUUkxfRiAgU0NNRF9JVl9HRU5fQ1RSTF9WKDFVKQorCisvKiBNb3JlIGZyYWdzICovCisjZGVmaW5lIFNDTURfTU9SRV9GUkFHU19TICAgMjAKKyNkZWZpbmUgU0NNRF9NT1JFX0ZSQUdTX00gICAweDEKKyNkZWZpbmUgU0NNRF9NT1JFX0ZSQUdTX1YoeCkgICAgKCh4KSA8PCBTQ01EX01PUkVfRlJBR1NfUykKKyNkZWZpbmUgU0NNRF9NT1JFX0ZSQUdTX0coeCkgICAgKCgoeCkgPj4gU0NNRF9NT1JFX0ZSQUdTX1MpICYgU0NNRF9NT1JFX0ZSQUdTX00pCisKKy8qbGFzdCBmcmFnICovCisjZGVmaW5lIFNDTURfTEFTVF9GUkFHX1MgICAgMTkKKyNkZWZpbmUgU0NNRF9MQVNUX0ZSQUdfTSAgICAweDEKKyNkZWZpbmUgU0NNRF9MQVNUX0ZSQUdfVih4KSAoKHgpIDw8IFNDTURfTEFTVF9GUkFHX1MpCisjZGVmaW5lIFNDTURfTEFTVF9GUkFHX0coeCkgKCgoeCkgPj4gU0NNRF9MQVNUX0ZSQUdfUykgJiBTQ01EX0xBU1RfRlJBR19NKQorCisvKiBUbHNDb21wUGR1ICovCisjZGVmaW5lIFNDTURfVExTX0NPTVBQRFVfUyAgICAxOAorI2RlZmluZSBTQ01EX1RMU19DT01QUERVX00gICAgMHgxCisjZGVmaW5lIFNDTURfVExTX0NPTVBQRFVfVih4KSAoKHgpIDw8IFNDTURfVExTX0NPTVBQRFVfUykKKyNkZWZpbmUgU0NNRF9UTFNfQ09NUFBEVV9HKHgpICgoKHgpID4+IFNDTURfVExTX0NPTVBQRFVfUykgJiBTQ01EX1RMU19DT01QUERVX00pCisKKy8qIEtleUNudHh0SW5saW5lIC0gS2V5IGNvbnRleHQgaW5saW5lIGFmdGVyIHRoZSBzY21kICBPUiBQYXlsb2FkT25seSovCisjZGVmaW5lIFNDTURfS0VZX0NUWF9JTkxJTkVfUyAgIDE3CisjZGVmaW5lIFNDTURfS0VZX0NUWF9JTkxJTkVfTSAgIDB4MQorI2RlZmluZSBTQ01EX0tFWV9DVFhfSU5MSU5FX1YoeCkgICAgKCh4KSA8PCBTQ01EX0tFWV9DVFhfSU5MSU5FX1MpCisjZGVmaW5lIFNDTURfS0VZX0NUWF9JTkxJTkVfRyh4KSAgICBcCisJKCgoeCkgPj4gU0NNRF9LRVlfQ1RYX0lOTElORV9TKSAmIFNDTURfS0VZX0NUWF9JTkxJTkVfTSkKKyNkZWZpbmUgU0NNRF9LRVlfQ1RYX0lOTElORV9GICAgU0NNRF9LRVlfQ1RYX0lOTElORV9WKDFVKQorCisvKiBUTFNGcmFnRW5hYmxlIC0gMDogSG9zdCBjcmVhdGVkIFRMUyBQRFVzLCAxOiBUTFMgRnJhbWdtZW50YXRpb24gaW4gQVNJQyAqLworI2RlZmluZSBTQ01EX1RMU19GUkFHX0VOQUJMRV9TICAxNgorI2RlZmluZSBTQ01EX1RMU19GUkFHX0VOQUJMRV9NICAweDEKKyNkZWZpbmUgU0NNRF9UTFNfRlJBR19FTkFCTEVfVih4KSAgICgoeCkgPDwgU0NNRF9UTFNfRlJBR19FTkFCTEVfUykKKyNkZWZpbmUgU0NNRF9UTFNfRlJBR19FTkFCTEVfRyh4KSAgIFwKKwkoKCh4KSA+PiBTQ01EX1RMU19GUkFHX0VOQUJMRV9TKSAmIFNDTURfVExTX0ZSQUdfRU5BQkxFX00pCisjZGVmaW5lIFNDTURfVExTX0ZSQUdfRU5BQkxFX0YgIFNDTURfVExTX0ZSQUdfRU5BQkxFX1YoMVUpCisKKy8qIE1hY09ubHkgLSBPbmx5IHNlbmQgdGhlIE1BQyBhbmQgZGlzY2FyZCBQRFUuIFRoaXMgaXMgdmFsaWQgZm9yIGhhc2ggb25seQorICogbW9kZXMsIGluIHRoaXMgY2FzZSBUTFNfVFggIHdpbGwgZHJvcCB0aGUgUERVIGFuZCBvbmx5CisgKiBzZW5kIGJhY2sgdGhlIE1BQyBieXRlcy4KKyAqLworI2RlZmluZSBTQ01EX01BQ19PTkxZX1MgMTUKKyNkZWZpbmUgU0NNRF9NQUNfT05MWV9NIDB4MQorI2RlZmluZSBTQ01EX01BQ19PTkxZX1YoeCkgICgoeCkgPDwgU0NNRF9NQUNfT05MWV9TKQorI2RlZmluZSBTQ01EX01BQ19PTkxZX0coeCkgIFwKKwkoKCh4KSA+PiBTQ01EX01BQ19PTkxZX1MpICYgU0NNRF9NQUNfT05MWV9NKQorI2RlZmluZSBTQ01EX01BQ19PTkxZX0YgU0NNRF9NQUNfT05MWV9WKDFVKQorCisvKiBBYWRJVkRyb3AgLSBEcm9wIHRoZSBBQUQgYW5kIElWIGZpZWxkcy4gVXNlZnVsIGluIHByb3RvY29scworICogd2hpY2ggaGF2ZSBjb21wbGV4IEFBRCBhbmQgSVYgZm9ybWF0aW9ucyBFZzpBRVMtQ0NNCisgKi8KKyNkZWZpbmUgU0NNRF9BQURJVkRST1BfUyAxNAorI2RlZmluZSBTQ01EX0FBRElWRFJPUF9NIDB4MQorI2RlZmluZSBTQ01EX0FBRElWRFJPUF9WKHgpICAoKHgpIDw8IFNDTURfQUFESVZEUk9QX1MpCisjZGVmaW5lIFNDTURfQUFESVZEUk9QX0coeCkgIFwKKwkoKCh4KSA+PiBTQ01EX0FBRElWRFJPUF9TKSAmIFNDTURfQUFESVZEUk9QX00pCisjZGVmaW5lIFNDTURfQUFESVZEUk9QX0YgU0NNRF9BQURJVkRST1BfVigxVSkKKworLyogSGRyTGVuZ3RoIC0gTGVuZ3RoIG9mIGFsbCBoZWFkZXJzIGV4Y2x1ZGluZyBUTFMgaGVhZGVyCisgKiBwcmVzZW50IGJlZm9yZSBzdGFydCBvZiBjcnlwdG8gUERVL3BheWxvYWQuCisgKi8KKyNkZWZpbmUgU0NNRF9IRFJfTEVOX1MgIDAKKyNkZWZpbmUgU0NNRF9IRFJfTEVOX00gIDB4M2ZmZgorI2RlZmluZSBTQ01EX0hEUl9MRU5fVih4KSAgICgoeCkgPDwgU0NNRF9IRFJfTEVOX1MpCisjZGVmaW5lIFNDTURfSERSX0xFTl9HKHgpICAgXAorCSgoKHgpID4+IFNDTURfSERSX0xFTl9TKSAmIFNDTURfSERSX0xFTl9NKQorCitzdHJ1Y3QgY3BsX3R4X3NlY19wZHUgeworCV9fYmUzMiBvcF9pdmluc3J0b2ZzdDsKKwlfX2JlMzIgcGxkbGVuOworCV9fYmUzMiBhYWRzdGFydF9jaXBoZXJzdG9wX2hpOworCV9fYmUzMiBjaXBoZXJzdG9wX2xvX2F1dGhpbnNlcnQ7CisJX19iZTMyIHNlcW5vX251bWl2czsKKwlfX2JlMzIgaXZnZW5faGRybGVuOworCV9fYmU2NCBzY21kMTsKK307CisKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfT1BDT0RFX1MgICAgIDI0CisjZGVmaW5lIENQTF9UWF9TRUNfUERVX09QQ09ERV9NICAgICAweGZmCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX09QQ09ERV9WKHgpICAoKHgpIDw8IENQTF9UWF9TRUNfUERVX09QQ09ERV9TKQorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9PUENPREVfRyh4KSAgXAorCSgoKHgpID4+IENQTF9UWF9TRUNfUERVX09QQ09ERV9TKSAmIENQTF9UWF9TRUNfUERVX09QQ09ERV9NKQorCisvKiBSWCBDaGFubmVsIElkICovCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX1JYQ0hJRF9TICAyMgorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9SWENISURfTSAgMHgxCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX1JYQ0hJRF9WKHgpICAgKCh4KSA8PCBDUExfVFhfU0VDX1BEVV9SWENISURfUykKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfUlhDSElEX0coeCkgICBcCisJKCgoeCkgPj4gQ1BMX1RYX1NFQ19QRFVfUlhDSElEX1MpICYgQ1BMX1RYX1NFQ19QRFVfUlhDSElEX00pCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX1JYQ0hJRF9GICBDUExfVFhfU0VDX1BEVV9SWENISURfVigxVSkKKworLyogQWNrIEZvbGxvd3MgKi8KKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQUNLRk9MTE9XU19TICAyMQorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9BQ0tGT0xMT1dTX00gIDB4MQorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9BQ0tGT0xMT1dTX1YoeCkgICAoKHgpIDw8IENQTF9UWF9TRUNfUERVX0FDS0ZPTExPV1NfUykKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQUNLRk9MTE9XU19HKHgpICAgXAorCSgoKHgpID4+IENQTF9UWF9TRUNfUERVX0FDS0ZPTExPV1NfUykgJiBDUExfVFhfU0VDX1BEVV9BQ0tGT0xMT1dTX00pCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0FDS0ZPTExPV1NfRiAgQ1BMX1RYX1NFQ19QRFVfQUNLRk9MTE9XU19WKDFVKQorCisvKiBMb29wYmFjayBiaXQgaW4gY3BsX3R4X3NlY19wZHUgKi8KKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfVUxQVFhMUEJLX1MgIDIwCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX1VMUFRYTFBCS19NICAweDEKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfVUxQVFhMUEJLX1YoeCkgICAoKHgpIDw8IENQTF9UWF9TRUNfUERVX1VMUFRYTFBCS19TKQorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9VTFBUWExQQktfRyh4KSAgIFwKKwkoKCh4KSA+PiBDUExfVFhfU0VDX1BEVV9VTFBUWExQQktfUykgJiBDUExfVFhfU0VDX1BEVV9VTFBUWExQQktfTSkKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfVUxQVFhMUEJLX0YgIENQTF9UWF9TRUNfUERVX1VMUFRYTFBCS19WKDFVKQorCisvKiBMZW5ndGggb2YgY3BsIGhlYWRlciBlbmNhcHN1bGF0ZWQgKi8KKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQ1BMTEVOX1MgICAgIDE2CisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0NQTExFTl9NICAgICAweGYKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQ1BMTEVOX1YoeCkgICgoeCkgPDwgQ1BMX1RYX1NFQ19QRFVfQ1BMTEVOX1MpCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0NQTExFTl9HKHgpICBcCisJKCgoeCkgPj4gQ1BMX1RYX1NFQ19QRFVfQ1BMTEVOX1MpICYgQ1BMX1RYX1NFQ19QRFVfQ1BMTEVOX00pCisKKy8qIFBsYWNlSG9sZGVyICovCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX1BMQUNFSE9MREVSX1MgICAgMTAKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfUExBQ0VIT0xERVJfTSAgICAweDEKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfUExBQ0VIT0xERVJfVih4KSAoKHgpIDw8IENQTF9UWF9TRUNfUERVX1BMQUNFSE9MREVSX1MpCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX1BMQUNFSE9MREVSX0coeCkgXAorCSgoKHgpID4+IENQTF9UWF9TRUNfUERVX1BMQUNFSE9MREVSX1MpICYgXAorCSBDUExfVFhfU0VDX1BEVV9QTEFDRUhPTERFUl9NKQorCisvKiBJdkluc3J0T2Zmc2V0OiBJbnNlcnRpb24gbG9jYXRpb24gZm9yIElWICovCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0lWSU5TUlRPRlNUX1MgICAgMAorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9JVklOU1JUT0ZTVF9NICAgIDB4M2ZmCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0lWSU5TUlRPRlNUX1YoeCkgKCh4KSA8PCBDUExfVFhfU0VDX1BEVV9JVklOU1JUT0ZTVF9TKQorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9JVklOU1JUT0ZTVF9HKHgpIFwKKwkoKCh4KSA+PiBDUExfVFhfU0VDX1BEVV9JVklOU1JUT0ZTVF9TKSAmIFwKKwkgQ1BMX1RYX1NFQ19QRFVfSVZJTlNSVE9GU1RfTSkKKworLyogQWFkU3RhcnRPZmZzZXQ6IE9mZnNldCBpbiBieXRlcyBmb3IgQUFEIHN0YXJ0IGZyb20KKyAqIHRoZSBmaXJzdCBieXRlIGZvbGxvd2luZyB0aGUgcGt0IGhlYWRlcnMgKDAtMjU1IGJ5dGVzKQorICovCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0FBRFNUQVJUX1MgICAyNAorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9BQURTVEFSVF9NICAgMHhmZgorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9BQURTVEFSVF9WKHgpICAgICgoeCkgPDwgQ1BMX1RYX1NFQ19QRFVfQUFEU1RBUlRfUykKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQUFEU1RBUlRfRyh4KSAgICBcCisJKCgoeCkgPj4gQ1BMX1RYX1NFQ19QRFVfQUFEU1RBUlRfUykgJiBcCisJIENQTF9UWF9TRUNfUERVX0FBRFNUQVJUX00pCisKKy8qIEFhZFN0b3BPZmZzZXQ6IG9mZnNldCBpbiBieXRlcyBmb3IgQUFEIHN0b3AvZW5kIGZyb20gdGhlIGZpcnN0IGJ5dGUgZm9sbG93aW5nCisgKiB0aGUgcGt0IGhlYWRlcnMgKDAtNTExIGJ5dGVzKQorICovCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0FBRFNUT1BfUyAgICAxNQorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9BQURTVE9QX00gICAgMHgxZmYKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQUFEU1RPUF9WKHgpICgoeCkgPDwgQ1BMX1RYX1NFQ19QRFVfQUFEU1RPUF9TKQorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9BQURTVE9QX0coeCkgXAorCSgoKHgpID4+IENQTF9UWF9TRUNfUERVX0FBRFNUT1BfUykgJiBDUExfVFhfU0VDX1BEVV9BQURTVE9QX00pCisKKy8qIENpcGhlclN0YXJ0T2Zmc2V0OiBvZmZzZXQgaW4gYnl0ZXMgZm9yIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBzdGFydCBmcm9tIHRoZQorICogZmlyc3QgYnl0ZSBmb2xsb3dpbmcgdGhlIHBrdCBoZWFkZXJzICgwLTEwMjMgYnl0ZXMpCisgKi8KKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQ0lQSEVSU1RBUlRfUyAgICA1CisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0NJUEhFUlNUQVJUX00gICAgMHgzZmYKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQ0lQSEVSU1RBUlRfVih4KSAoKHgpIDw8IENQTF9UWF9TRUNfUERVX0NJUEhFUlNUQVJUX1MpCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0NJUEhFUlNUQVJUX0coeCkgXAorCSgoKHgpID4+IENQTF9UWF9TRUNfUERVX0NJUEhFUlNUQVJUX1MpICYgXAorCSBDUExfVFhfU0VDX1BEVV9DSVBIRVJTVEFSVF9NKQorCisvKiBDaXBoZXJTdG9wT2Zmc2V0OiBvZmZzZXQgaW4gYnl0ZXMgZm9yIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBlbmQKKyAqIGZyb20gZW5kIG9mIHRoZSBwYXlsb2FkIG9mIHRoaXMgY29tbWFuZCAoMC01MTEgYnl0ZXMpCisgKi8KKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQ0lQSEVSU1RPUF9ISV9TICAgICAgMAorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9DSVBIRVJTVE9QX0hJX00gICAgICAweDFmCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0NJUEhFUlNUT1BfSElfVih4KSAgIFwKKwkoKHgpIDw8IENQTF9UWF9TRUNfUERVX0NJUEhFUlNUT1BfSElfUykKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQ0lQSEVSU1RPUF9ISV9HKHgpICAgXAorCSgoKHgpID4+IENQTF9UWF9TRUNfUERVX0NJUEhFUlNUT1BfSElfUykgJiBcCisJIENQTF9UWF9TRUNfUERVX0NJUEhFUlNUT1BfSElfTSkKKworI2RlZmluZSBDUExfVFhfU0VDX1BEVV9DSVBIRVJTVE9QX0xPX1MgICAgICAyOAorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9DSVBIRVJTVE9QX0xPX00gICAgICAweGYKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQ0lQSEVSU1RPUF9MT19WKHgpICAgXAorCSgoeCkgPDwgQ1BMX1RYX1NFQ19QRFVfQ0lQSEVSU1RPUF9MT19TKQorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9DSVBIRVJTVE9QX0xPX0coeCkgICBcCisJKCgoeCkgPj4gQ1BMX1RYX1NFQ19QRFVfQ0lQSEVSU1RPUF9MT19TKSAmIFwKKwkgQ1BMX1RYX1NFQ19QRFVfQ0lQSEVSU1RPUF9MT19NKQorCisvKiBBdXRoU3RhcnRPZmZzZXQ6IG9mZnNldCBpbiBieXRlcyBmb3IgYXV0aGVudGljYXRpb24gc3RhcnQgZnJvbQorICogdGhlIGZpcnN0IGJ5dGUgZm9sbG93aW5nIHRoZSBwa3QgaGVhZGVycyAoMC0xMDIzKQorICovCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0FVVEhTVEFSVF9TICAxOAorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9BVVRIU1RBUlRfTSAgMHgzZmYKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQVVUSFNUQVJUX1YoeCkgICAoKHgpIDw8IENQTF9UWF9TRUNfUERVX0FVVEhTVEFSVF9TKQorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9BVVRIU1RBUlRfRyh4KSAgIFwKKwkoKCh4KSA+PiBDUExfVFhfU0VDX1BEVV9BVVRIU1RBUlRfUykgJiBcCisJIENQTF9UWF9TRUNfUERVX0FVVEhTVEFSVF9NKQorCisvKiBBdXRoU3RvcE9mZnNldDogb2Zmc2V0IGluIGJ5dGVzIGZvciBhdXRoZW50aWNhdGlvbgorICogZW5kIGZyb20gZW5kIG9mIHRoZSBwYXlsb2FkIG9mIHRoaXMgY29tbWFuZCAoMC01MTEgQnl0ZXMpCisgKi8KKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQVVUSFNUT1BfUyAgIDkKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQVVUSFNUT1BfTSAgIDB4MWZmCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0FVVEhTVE9QX1YoeCkgICAgKCh4KSA8PCBDUExfVFhfU0VDX1BEVV9BVVRIU1RPUF9TKQorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9BVVRIU1RPUF9HKHgpICAgIFwKKwkoKCh4KSA+PiBDUExfVFhfU0VDX1BEVV9BVVRIU1RPUF9TKSAmIFwKKwkgQ1BMX1RYX1NFQ19QRFVfQVVUSFNUT1BfTSkKKworLyogQXV0aEluc3J0T2Zmc2V0OiBvZmZzZXQgaW4gYnl0ZXMgZm9yIGF1dGhlbnRpY2F0aW9uIGluc2VydGlvbgorICogZnJvbSBlbmQgb2YgdGhlIHBheWxvYWQgb2YgdGhpcyBjb21tYW5kICgwLTUxMSBieXRlcykKKyAqLworI2RlZmluZSBDUExfVFhfU0VDX1BEVV9BVVRISU5TRVJUX1MgMAorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9BVVRISU5TRVJUX00gMHgxZmYKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQVVUSElOU0VSVF9WKHgpICAoKHgpIDw8IENQTF9UWF9TRUNfUERVX0FVVEhJTlNFUlRfUykKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQVVUSElOU0VSVF9HKHgpICBcCisJKCgoeCkgPj4gQ1BMX1RYX1NFQ19QRFVfQVVUSElOU0VSVF9TKSAmIFwKKwkgQ1BMX1RYX1NFQ19QRFVfQVVUSElOU0VSVF9NKQorCitzdHJ1Y3QgY3BsX3J4X3BoeXNfZHNnbCB7CisJX19iZTMyIG9wX3RvX3RpZDsKKwlfX2JlMzIgcGNpcmx4b3JkZXJfdG9fbm9vZnNnZW50cjsKKwlzdHJ1Y3QgcnNzX2hlYWRlciByc3NfaGRyX2ludDsKK307CisKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9PUENPREVfUyAgICAgICAyNAorI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX09QQ09ERV9NICAgICAgIDB4ZmYKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9PUENPREVfVih4KSAgICAoKHgpIDw8IENQTF9SWF9QSFlTX0RTR0xfT1BDT0RFX1MpCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfT1BDT0RFX0coeCkgICAgXAorCSgoKHgpID4+IENQTF9SWF9QSFlTX0RTR0xfT1BDT0RFX1MpICYgQ1BMX1JYX1BIWVNfRFNHTF9PUENPREVfTSkKKworI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX0lTUkRNQV9TICAgICAgIDIzCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfSVNSRE1BX00gICAgICAgMHgxCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfSVNSRE1BX1YoeCkgICAgKCh4KSA8PCBDUExfUlhfUEhZU19EU0dMX0lTUkRNQV9TKQorI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX0lTUkRNQV9HKHgpICAgIFwKKwkoKCh4KSA+PiBDUExfUlhfUEhZU19EU0dMX0lTUkRNQV9TKSAmIENQTF9SWF9QSFlTX0RTR0xfSVNSRE1BX00pCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfSVNSRE1BX0YgICAgICAgQ1BMX1JYX1BIWVNfRFNHTF9JU1JETUFfVigxVSkKKworI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX1JTVkQxX1MgICAgICAgIDIwCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfUlNWRDFfTSAgICAgICAgMHg3CisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfUlNWRDFfVih4KSAgICAgKCh4KSA8PCBDUExfUlhfUEhZU19EU0dMX1JTVkQxX1MpCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfUlNWRDFfRyh4KSAgICAgXAorCSgoKHgpID4+IENQTF9SWF9QSFlTX0RTR0xfUlNWRDFfUykgJiBcCisJIENQTF9SWF9QSFlTX0RTR0xfUlNWRDFfTSkKKworI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX1BDSVJMWE9SREVSX1MgICAgICAgICAgMzEKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lSTFhPUkRFUl9NICAgICAgICAgIDB4MQorI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX1BDSVJMWE9SREVSX1YoeCkgICAgICAgXAorCSgoeCkgPDwgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lSTFhPUkRFUl9TKQorI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX1BDSVJMWE9SREVSX0coeCkgICAgICAgXAorCSgoKHgpID4+IENQTF9SWF9QSFlTX0RTR0xfUENJUkxYT1JERVJfUykgJiBcCisJIENQTF9SWF9QSFlTX0RTR0xfUENJUkxYT1JERVJfTSkKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lSTFhPUkRFUl9GICBDUExfUlhfUEhZU19EU0dMX1BDSVJMWE9SREVSX1YoMVUpCisKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lOT1NOT09QX1MgICAgICAgICAgIDMwCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfUENJTk9TTk9PUF9NICAgICAgICAgICAweDEKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lOT1NOT09QX1YoeCkgICAgICAgIFwKKwkoKHgpIDw8IENQTF9SWF9QSFlTX0RTR0xfUENJTk9TTk9PUF9TKQorI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX1BDSU5PU05PT1BfRyh4KSAgICAgICAgXAorCSgoKHgpID4+IENQTF9SWF9QSFlTX0RTR0xfUENJTk9TTk9PUF9TKSAmIFwKKwkgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lOT1NOT09QX00pCisKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lOT1NOT09QX0YgICBDUExfUlhfUEhZU19EU0dMX1BDSU5PU05PT1BfVigxVSkKKworI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX1BDSVRQSE5URU5CX1MgICAgICAgICAgMjkKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lUUEhOVEVOQl9NICAgICAgICAgIDB4MQorI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX1BDSVRQSE5URU5CX1YoeCkgICAgICAgXAorCSgoeCkgPDwgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lUUEhOVEVOQl9TKQorI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX1BDSVRQSE5URU5CX0coeCkgICAgICAgXAorCSgoKHgpID4+IENQTF9SWF9QSFlTX0RTR0xfUENJVFBITlRFTkJfUykgJiBcCisJIENQTF9SWF9QSFlTX0RTR0xfUENJVFBITlRFTkJfTSkKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lUUEhOVEVOQl9GICBDUExfUlhfUEhZU19EU0dMX1BDSVRQSE5URU5CX1YoMVUpCisKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lUUEhOVF9TICAgICAyNworI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX1BDSVRQSE5UX00gICAgIDB4MworI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX1BDSVRQSE5UX1YoeCkgICgoeCkgPDwgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lUUEhOVF9TKQorI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX1BDSVRQSE5UX0coeCkgIFwKKwkoKCh4KSA+PiBDUExfUlhfUEhZU19EU0dMX1BDSVRQSE5UX1MpICYgXAorCSBDUExfUlhfUEhZU19EU0dMX1BDSVRQSE5UX00pCisKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9EQ0FJRF9TICAgICAgICAxNgorI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX0RDQUlEX00gICAgICAgIDB4N2ZmCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfRENBSURfVih4KSAgICAgKCh4KSA8PCBDUExfUlhfUEhZU19EU0dMX0RDQUlEX1MpCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfRENBSURfRyh4KSAgICAgXAorCSgoKHgpID4+IENQTF9SWF9QSFlTX0RTR0xfRENBSURfUykgJiBcCisJIENQTF9SWF9QSFlTX0RTR0xfRENBSURfTSkKKworI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX05PT0ZTR0VOVFJfUyAgICAgICAgICAgMAorI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX05PT0ZTR0VOVFJfTSAgICAgICAgICAgMHhmZmZmCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfTk9PRlNHRU5UUl9WKHgpICAgICAgICBcCisJKCh4KSA8PCBDUExfUlhfUEhZU19EU0dMX05PT0ZTR0VOVFJfUykKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9OT09GU0dFTlRSX0coeCkgICAgICAgIFwKKwkoKCh4KSA+PiBDUExfUlhfUEhZU19EU0dMX05PT0ZTR0VOVFJfUykgJiBcCisJIENQTF9SWF9QSFlTX0RTR0xfTk9PRlNHRU5UUl9NKQorCiAjZW5kaWYgIC8qIF9fVDRfTVNHX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvdDRmd19hcGkuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvdDRmd19hcGkuaAppbmRleCBhODliMzA3Li40YjU4YjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3Q0ZndfYXBpLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC90NGZ3X2FwaS5oCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDaGVsc2lvIFQ0IEV0aGVybmV0IGRyaXZlciBmb3IgTGludXguCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTQgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTYgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCkBAIC0xMDIsNiArMTAyLDcgQEAKIAlGV19SSV9GUl9OU01SX1dSICAgICAgICAgICAgICAgPSAweDE5LAogCUZXX1JJX0lOVl9MU1RBR19XUiAgICAgICAgICAgICA9IDB4MWEsCiAJRldfSVNDU0lfVFhfREFUQV9XUgkgICAgICAgPSAweDQ1LAorCUZXX0NSWVBUT19MT09LQVNJREVfV1IgICAgICAgICA9IDBYNmQsCiAJRldfTEFTVEMyRV9XUiAgICAgICAgICAgICAgICAgID0gMHg3MAogfTsKIApAQCAtNjgwLDYgKzY4MSw3IEBACiAJRldfUlNTX0lORF9UQkxfQ01EICAgICAgICAgICAgID0gMHgyMCwKIAlGV19SU1NfR0xCX0NPTkZJR19DTUQgICAgICAgICAgPSAweDIyLAogCUZXX1JTU19WSV9DT05GSUdfQ01EICAgICAgICAgICA9IDB4MjMsCisJRldfU0NIRURfQ01EICAgICAgICAgICAgICAgICAgID0gMHgyNCwKIAlGV19ERVZMT0dfQ01EICAgICAgICAgICAgICAgICAgPSAweDI1LAogCUZXX0NMSVBfQ01EICAgICAgICAgICAgICAgICAgICA9IDB4MjgsCiAJRldfTEFTVEMyRV9DTUQgICAgICAgICAgICAgICAgID0gMHg0MCwKQEAgLTEwNjAsNyArMTA2Miw3IEBACiAJX19iZTE2IG5pY2NhcHM7CiAJX19iZTE2IG9mbGRjYXBzOwogCV9fYmUxNiByZG1hY2FwczsKLQlfX2JlMTYgcjQ7CisJX19iZTE2IGNyeXB0b2NhcHM7CiAJX19iZTE2IGlzY3NpY2FwczsKIAlfX2JlMTYgZmNvZWNhcHM7CiAJX19iZTMyIGNmY3N1bTsKQEAgLTIyNjUsNiArMjI2NywxMiBAQAogCUZXX1BPUlRfQ0FQXzgwMl8zX0FTTV9ESVIJPSAweDgwMDAsCiB9OwogCisjZGVmaW5lIEZXX1BPUlRfQ0FQX1NQRUVEX1MgICAgIDAKKyNkZWZpbmUgRldfUE9SVF9DQVBfU1BFRURfTSAgICAgMHgzZgorI2RlZmluZSBGV19QT1JUX0NBUF9TUEVFRF9WKHgpICAoKHgpIDw8IEZXX1BPUlRfQ0FQX1NQRUVEX1MpCisjZGVmaW5lIEZXX1BPUlRfQ0FQX1NQRUVEX0coeCkgXAorCSgoKHgpID4+IEZXX1BPUlRfQ0FQX1NQRUVEX1MpICYgRldfUE9SVF9DQVBfU1BFRURfTSkKKwogZW51bSBmd19wb3J0X21kaSB7CiAJRldfUE9SVF9DQVBfTURJX1VOQ0hBTkdFRCwKIAlGV19QT1JUX0NBUF9NRElfQVVUTywKQEAgLTI5NjEsNiArMjk2OSw0MSBAQAogI2RlZmluZSBGV19SU1NfVklfQ09ORklHX0NNRF9VRFBFTl9WKHgpCSgoeCkgPDwgRldfUlNTX1ZJX0NPTkZJR19DTURfVURQRU5fUykKICNkZWZpbmUgRldfUlNTX1ZJX0NPTkZJR19DTURfVURQRU5fRglGV19SU1NfVklfQ09ORklHX0NNRF9VRFBFTl9WKDFVKQogCitlbnVtIGZ3X3NjaGVkX3NjIHsKKwlGV19TQ0hFRF9TQ19QQVJBTVMJCT0gMSwKK307CisKK3N0cnVjdCBmd19zY2hlZF9jbWQgeworCV9fYmUzMiBvcF90b193cml0ZTsKKwlfX2JlMzIgcmV0dmFsX2xlbjE2OworCXVuaW9uIGZ3X3NjaGVkIHsKKwkJc3RydWN0IGZ3X3NjaGVkX2NvbmZpZyB7CisJCQlfX3U4ICAgc2M7CisJCQlfX3U4ICAgdHlwZTsKKwkJCV9fdTggICBtaW5tYXhlbjsKKwkJCV9fdTggICByM1s1XTsKKwkJCV9fdTggICBuY2xhc3Nlc1s0XTsKKwkJCV9fYmUzMiByNDsKKwkJfSBjb25maWc7CisJCXN0cnVjdCBmd19zY2hlZF9wYXJhbXMgeworCQkJX191OCAgIHNjOworCQkJX191OCAgIHR5cGU7CisJCQlfX3U4ICAgbGV2ZWw7CisJCQlfX3U4ICAgbW9kZTsKKwkJCV9fdTggICB1bml0OworCQkJX191OCAgIHJhdGU7CisJCQlfX3U4ICAgY2g7CisJCQlfX3U4ICAgY2w7CisJCQlfX2JlMzIgbWluOworCQkJX19iZTMyIG1heDsKKwkJCV9fYmUxNiB3ZWlnaHQ7CisJCQlfX2JlMTYgcGt0c2l6ZTsKKwkJCV9fYmUxNiBidXJzdHNpemU7CisJCQlfX2JlMTYgcjQ7CisJCX0gcGFyYW1zOworCX0gdTsKK307CisKIHN0cnVjdCBmd19jbGlwX2NtZCB7CiAJX19iZTMyIG9wX3RvX3dyaXRlOwogCV9fYmUzMiBhbGxvY190b19sZW4xNjsKQEAgLTMyNDksNCArMzI5MiwxMjcgQEAKICNkZWZpbmUgUENJRV9GV19QRl9ERVZMT0dfTUVNVFlQRV9HKHgpIFwKIAkoKCh4KSA+PiBQQ0lFX0ZXX1BGX0RFVkxPR19NRU1UWVBFX1MpICYgUENJRV9GV19QRl9ERVZMT0dfTUVNVFlQRV9NKQogCisjZGVmaW5lIE1BWF9JTU1fT0ZMRF9UWF9EQVRBX1dSX0xFTiAoMHhmZiArIHNpemVvZihzdHJ1Y3QgZndfb2ZsZF90eF9kYXRhX3dyKSkKKworc3RydWN0IGZ3X2NyeXB0b19sb29rYXNpZGVfd3IgeworCV9fYmUzMiBvcF90b19jY3R4X3NpemU7CisJX19iZTMyIGxlbjE2X3BrZDsKKwlfX2JlMzIgc2Vzc2lvbl9pZDsKKwlfX2JlMzIgcnhfY2hpZF90b19yeF9xX2lkOworCV9fYmUzMiBrZXlfYWRkcjsKKwlfX2JlMzIgcGxkX3NpemVfaGFzaF9zaXplOworCV9fYmU2NCBjb29raWU7Cit9OworCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfT1BDT0RFX1MgMjQKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9PUENPREVfTSAweGZmCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfT1BDT0RFX1YoeCkgXAorCSgoeCkgPDwgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9PUENPREVfUykKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9PUENPREVfRyh4KSBcCisJKCgoeCkgPj4gRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9PUENPREVfUykgJiBcCisJIEZXX0NSWVBUT19MT09LQVNJREVfV1JfT1BDT0RFX00pCisKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9DT01QTF9TIDIzCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfQ09NUExfTSAweDEKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9DT01QTF9WKHgpIFwKKwkoKHgpIDw8IEZXX0NSWVBUT19MT09LQVNJREVfV1JfQ09NUExfUykKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9DT01QTF9HKHgpIFwKKwkoKCh4KSA+PiBGV19DUllQVE9fTE9PS0FTSURFX1dSX0NPTVBMX1MpICYgXAorCSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0NPTVBMX00pCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfQ09NUExfRiBGV19DUllQVE9fTE9PS0FTSURFX1dSX0NPTVBMX1YoMVUpCisKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9JTU1fTEVOX1MgMTUKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9JTU1fTEVOX00gMHhmZgorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0lNTV9MRU5fVih4KSBcCisJKCh4KSA8PCBGV19DUllQVE9fTE9PS0FTSURFX1dSX0lNTV9MRU5fUykKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9JTU1fTEVOX0coeCkgXAorCSgoKHgpID4+IEZXX0NSWVBUT19MT09LQVNJREVfV1JfSU1NX0xFTl9TKSAmIFwKKwkgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9JTU1fTEVOX00pCisKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9DQ1RYX0xPQ19TIDUKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9DQ1RYX0xPQ19NIDB4MworI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0NDVFhfTE9DX1YoeCkgXAorCSgoeCkgPDwgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9DQ1RYX0xPQ19TKQorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0NDVFhfTE9DX0coeCkgXAorCSgoKHgpID4+IEZXX0NSWVBUT19MT09LQVNJREVfV1JfQ0NUWF9MT0NfUykgJiBcCisJIEZXX0NSWVBUT19MT09LQVNJREVfV1JfQ0NUWF9MT0NfTSkKKworI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0NDVFhfU0laRV9TIDAKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9DQ1RYX1NJWkVfTSAweDFmCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfQ0NUWF9TSVpFX1YoeCkgXAorCSgoeCkgPDwgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9DQ1RYX1NJWkVfUykKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9DQ1RYX1NJWkVfRyh4KSBcCisJKCgoeCkgPj4gRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9DQ1RYX1NJWkVfUykgJiBcCisJIEZXX0NSWVBUT19MT09LQVNJREVfV1JfQ0NUWF9TSVpFX00pCisKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9MRU4xNl9TIDAKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9MRU4xNl9NIDB4ZmYKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9MRU4xNl9WKHgpIFwKKwkoKHgpIDw8IEZXX0NSWVBUT19MT09LQVNJREVfV1JfTEVOMTZfUykKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9MRU4xNl9HKHgpIFwKKwkoKCh4KSA+PiBGV19DUllQVE9fTE9PS0FTSURFX1dSX0xFTjE2X1MpICYgXAorCSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0xFTjE2X00pCisKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9SWF9DSElEX1MgMjkKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9SWF9DSElEX00gMHgzCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfUlhfQ0hJRF9WKHgpIFwKKwkoKHgpIDw8IEZXX0NSWVBUT19MT09LQVNJREVfV1JfUlhfQ0hJRF9TKQorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX1JYX0NISURfRyh4KSBcCisJKCgoeCkgPj4gRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9SWF9DSElEX1MpICYgXAorCSBGV19DUllQVE9fTE9PS0FTSURFX1dSX1JYX0NISURfTSkKKworI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0xDQl9TICAyNworI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0xDQl9NICAweDMKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9MQ0JfVih4KSBcCisJKCh4KSA8PCBGV19DUllQVE9fTE9PS0FTSURFX1dSX0xDQl9TKQorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0xDQl9HKHgpIFwKKwkoKCh4KSA+PiBGV19DUllQVE9fTE9PS0FTSURFX1dSX0xDQl9TKSAmIEZXX0NSWVBUT19MT09LQVNJREVfV1JfTENCX00pCisKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9QSEFTSF9TIDI1CisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfUEhBU0hfTSAweDMKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9QSEFTSF9WKHgpIFwKKwkoKHgpIDw8IEZXX0NSWVBUT19MT09LQVNJREVfV1JfUEhBU0hfUykKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9QSEFTSF9HKHgpIFwKKwkoKCh4KSA+PiBGV19DUllQVE9fTE9PS0FTSURFX1dSX1BIQVNIX1MpICYgXAorCSBGV19DUllQVE9fTE9PS0FTSURFX1dSX1BIQVNIX00pCisKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9JVl9TICAgMjMKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9JVl9NICAgMHgzCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfSVZfVih4KSBcCisJKCh4KSA8PCBGV19DUllQVE9fTE9PS0FTSURFX1dSX0lWX1MpCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfSVZfRyh4KSBcCisJKCgoeCkgPj4gRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9JVl9TKSAmIEZXX0NSWVBUT19MT09LQVNJREVfV1JfSVZfTSkKKworI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX1RYX0NIX1MgMTAKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9UWF9DSF9NIDB4MworI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX1RYX0NIX1YoeCkgXAorCSgoeCkgPDwgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9UWF9DSF9TKQorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX1RYX0NIX0coeCkgXAorCSgoKHgpID4+IEZXX0NSWVBUT19MT09LQVNJREVfV1JfVFhfQ0hfUykgJiBcCisJIEZXX0NSWVBUT19MT09LQVNJREVfV1JfVFhfQ0hfTSkKKworI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX1JYX1FfSURfUyAwCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfUlhfUV9JRF9NIDB4M2ZmCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfUlhfUV9JRF9WKHgpIFwKKwkoKHgpIDw8IEZXX0NSWVBUT19MT09LQVNJREVfV1JfUlhfUV9JRF9TKQorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX1JYX1FfSURfRyh4KSBcCisJKCgoeCkgPj4gRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9SWF9RX0lEX1MpICYgXAorCSBGV19DUllQVE9fTE9PS0FTSURFX1dSX1JYX1FfSURfTSkKKworI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX1BMRF9TSVpFX1MgMjQKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9QTERfU0laRV9NIDB4ZmYKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9QTERfU0laRV9WKHgpIFwKKwkoKHgpIDw8IEZXX0NSWVBUT19MT09LQVNJREVfV1JfUExEX1NJWkVfUykKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9QTERfU0laRV9HKHgpIFwKKwkoKCh4KSA+PiBGV19DUllQVE9fTE9PS0FTSURFX1dSX1BMRF9TSVpFX1MpICYgXAorCSBGV19DUllQVE9fTE9PS0FTSURFX1dSX1BMRF9TSVpFX00pCisKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9IQVNIX1NJWkVfUyAxNworI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0hBU0hfU0laRV9NIDB4N2YKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9IQVNIX1NJWkVfVih4KSBcCisJKCh4KSA8PCBGV19DUllQVE9fTE9PS0FTSURFX1dSX0hBU0hfU0laRV9TKQorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0hBU0hfU0laRV9HKHgpIFwKKwkoKCh4KSA+PiBGV19DUllQVE9fTE9PS0FTSURFX1dSX0hBU0hfU0laRV9TKSAmIFwKKwkgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9IQVNIX1NJWkVfTSkKKwogI2VuZGlmIC8qIF9UNEZXX0lOVEVSRkFDRV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNHZmL2N4Z2I0dmZfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNHZmL2N4Z2I0dmZfbWFpbi5jCmluZGV4IGUxMTZiYjguLjEwMGIyY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjR2Zi9jeGdiNHZmX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0dmYvY3hnYjR2Zl9tYWluLmMKQEAgLTIzNzgsNyArMjM3OCw3IEBACiAJICovCiAJcG1hc2tfbnBvcnRzID0gaHdlaWdodDMyKGFkYXB0ZXItPnBhcmFtcy52ZnJlcy5wbWFzayk7CiAJaWYgKHBtYXNrX25wb3J0cyA8IGFkYXB0ZXItPnBhcmFtcy5ucG9ydHMpIHsKLQkJZGV2X3dhcm4oYWRhcHRlci0+cGRldl9kZXYsICJvbmx5IHVzaW5nICVkIG9mICVkIHByb3Zpc3Npb25lZCIKKwkJZGV2X3dhcm4oYWRhcHRlci0+cGRldl9kZXYsICJvbmx5IHVzaW5nICVkIG9mICVkIHByb3Zpc2lvbmVkIgogCQkJICIgdmlydHVhbCBpbnRlcmZhY2VzOyBsaW1pdGVkIGJ5IFBvcnQgQWNjZXNzIFJpZ2h0cyIKIAkJCSAiIG1hc2sgJSN4XG4iLCBwbWFza19ucG9ydHMsIGFkYXB0ZXItPnBhcmFtcy5ucG9ydHMsCiAJCQkgYWRhcHRlci0+cGFyYW1zLnZmcmVzLnBtYXNrKTsKQEAgLTI3NzcsNiArMjc3Nyw3IEBACiAJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXI7CiAJc3RydWN0IHBvcnRfaW5mbyAqcGk7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwl1bnNpZ25lZCBpbnQgcGY7CiAKIAkvKgogCSAqIFByaW50IG91ciBkcml2ZXIgYmFubmVyIHRoZSBmaXJzdCB0aW1lIHdlJ3JlIGNhbGxlZCB0byBpbml0aWFsaXplIGEKQEAgLTI5MDMsOCArMjkwNCwxMSBAQAogCSAqIEFsbG9jYXRlIG91ciAiYWRhcHRlciBwb3J0cyIgYW5kIHN0aXRjaCBldmVyeXRoaW5nIHRvZ2V0aGVyLgogCSAqLwogCXBtYXNrID0gYWRhcHRlci0+cGFyYW1zLnZmcmVzLnBtYXNrOworCXBmID0gdDR2Zl9nZXRfcGZfZnJvbV92ZihhZGFwdGVyKTsKIAlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIHBpZHgpIHsKIAkJaW50IHBvcnRfaWQsIHZpaWQ7CisJCXU4IG1hY1tFVEhfQUxFTl07CisJCXVuc2lnbmVkIGludCBuYWRkciA9IDE7CiAKIAkJLyoKIAkJICogV2Ugc2ltcGxpc3RpY2FsbHkgYWxsb2NhdGUgb3VyIHZpcnR1YWwgaW50ZXJmYWNlcwpAQCAtMjk3NSw2ICsyOTc5LDI2IEBACiAJCQkJcGlkeCk7CiAJCQlnb3RvIGVycl9mcmVlX2RldjsKIAkJfQorCisJCWVyciA9IHQ0dmZfZ2V0X3ZmX21hY19hY2woYWRhcHRlciwgcGYsICZuYWRkciwgbWFjKTsKKwkJaWYgKGVycikgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJ1bmFibGUgdG8gZGV0ZXJtaW5lIE1BQyBBQ0wgYWRkcmVzcywgIgorCQkJCSJjb250aW51aW5nIGFueXdheS4uIChzdGF0dXMgJWQpXG4iLCBlcnIpOworCQl9IGVsc2UgaWYgKG5hZGRyICYmIGFkYXB0ZXItPnBhcmFtcy52ZnJlcy5udmkgPT0gMSkgeworCQkJc3RydWN0IHNvY2thZGRyIGFkZHI7CisKKwkJCWV0aGVyX2FkZHJfY29weShhZGRyLnNhX2RhdGEsIG1hYyk7CisJCQllcnIgPSBjeGdiNHZmX3NldF9tYWNfYWRkcihuZXRkZXYsICZhZGRyKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJCSJ1bmFibGUgdG8gc2V0IE1BQyBhZGRyZXNzICVwTVxuIiwKKwkJCQkJbWFjKTsKKwkJCQlnb3RvIGVycl9mcmVlX2RldjsKKwkJCX0KKwkJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCQkJICJVc2luZyBhc3NpZ25lZCBNQUMgQUNMOiAlcE1cbiIsIG1hYyk7CisJCX0KIAl9CiAKIAkvKiBTZWUgd2hhdCBpbnRlcnJ1cHRzIHdlJ2xsIGJlIHVzaW5nLiAgSWYgd2UndmUgYmVlbiBjb25maWd1cmVkIHRvCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0dmYvc2dlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0dmYvc2dlLmMKaW5kZXggYzhmZDRmOC4uZjNlZDljZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNHZmL3NnZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjR2Zi9zZ2UuYwpAQCAtMTY0OCwxNCArMTY0OCwxNSBAQAogCiAJaWYgKGNzdW1fb2sgJiYgIXBrdC0+ZXJyX3ZlYyAmJgogCSAgICAoYmUzMl90b19jcHUocGt0LT5sMmluZm8pICYgKFJYRl9VRFBfRiB8IFJYRl9UQ1BfRikpKSB7Ci0JCWlmICghcGt0LT5pcF9mcmFnKQorCQlpZiAoIXBrdC0+aXBfZnJhZykgewogCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKLQkJZWxzZSB7CisJCQlyeHEtPnN0YXRzLnJ4X2NzbysrOworCQl9IGVsc2UgaWYgKHBrdC0+bDJpbmZvICYgaHRvbmwoUlhGX0lQX0YpKSB7CiAJCQlfX3N1bTE2IGMgPSAoX19mb3JjZSBfX3N1bTE2KXBrdC0+Y3N1bTsKIAkJCXNrYi0+Y3N1bSA9IGNzdW1fdW5mb2xkKGMpOwogCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9DT01QTEVURTsKKwkJCXJ4cS0+c3RhdHMucnhfY3NvKys7CiAJCX0KLQkJcnhxLT5zdGF0cy5yeF9jc28rKzsKIAl9IGVsc2UKIAkJc2tiX2NoZWNrc3VtX25vbmVfYXNzZXJ0KHNrYik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjR2Zi90NHZmX2NvbW1vbi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNHZmL3Q0dmZfY29tbW9uLmgKaW5kZXggOGVlNTQxNC4uYjM5MDNmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNHZmL3Q0dmZfY29tbW9uLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNHZmL3Q0dmZfY29tbW9uLmgKQEAgLTEwOCw4ICsxMDgsOCBAQAogCXVuc2lnbmVkIGludCAgIHN1cHBvcnRlZDsgICAgICAgIC8qIGxpbmsgY2FwYWJpbGl0aWVzICovCiAJdW5zaWduZWQgaW50ICAgYWR2ZXJ0aXNpbmc7ICAgICAgLyogYWR2ZXJ0aXNlZCBjYXBhYmlsaXRpZXMgKi8KIAl1bnNpZ25lZCBzaG9ydCBscF9hZHZlcnRpc2luZzsgICAvKiBwZWVyIGFkdmVydGlzZWQgY2FwYWJpbGl0aWVzICovCi0JdW5zaWduZWQgc2hvcnQgcmVxdWVzdGVkX3NwZWVkOyAgLyogc3BlZWQgdXNlciBoYXMgcmVxdWVzdGVkICovCi0JdW5zaWduZWQgc2hvcnQgc3BlZWQ7ICAgICAgICAgICAgLyogYWN0dWFsIGxpbmsgc3BlZWQgKi8KKwl1bnNpZ25lZCBpbnQgICByZXF1ZXN0ZWRfc3BlZWQ7ICAvKiBzcGVlZCB1c2VyIGhhcyByZXF1ZXN0ZWQgKi8KKwl1bnNpZ25lZCBpbnQgICBzcGVlZDsgICAgICAgICAgICAvKiBhY3R1YWwgbGluayBzcGVlZCAqLwogCXVuc2lnbmVkIGNoYXIgIHJlcXVlc3RlZF9mYzsgICAgIC8qIGZsb3cgY29udHJvbCB1c2VyIGhhcyByZXF1ZXN0ZWQgKi8KIAl1bnNpZ25lZCBjaGFyICBmYzsgICAgICAgICAgICAgICAvKiBhY3R1YWwgbGluayBmbG93IGNvbnRyb2wgKi8KIAl1bnNpZ25lZCBjaGFyICBhdXRvbmVnOyAgICAgICAgICAvKiBhdXRvbmVnb3RpYXRpbmc/ICovCkBAIC0yNzEsMTAgKzI3MSwxNyBAQAogCXJldHVybiAobGMtPnN1cHBvcnRlZCAmIEZXX1BPUlRfQ0FQX1NQRUVEXzEwRykgIT0gMDsKIH0KIAorLyogUmV0dXJuIHRydWUgaWYgdGhlIExpbmsgQ29uZmlndXJhdGlvbiBzdXBwb3J0cyAiSGlnaCBTcGVlZHMiICh0aG9zZSBncmVhdGVyCisgKiB0aGFuIDFHYi9zKS4KKyAqLwogc3RhdGljIGlubGluZSBib29sIGlzX3hfMTBnX3BvcnQoY29uc3Qgc3RydWN0IGxpbmtfY29uZmlnICpsYykKIHsKLQlyZXR1cm4gKGxjLT5zdXBwb3J0ZWQgJiBGV19QT1JUX0NBUF9TUEVFRF8xMEcpICE9IDAgfHwKLQkJKGxjLT5zdXBwb3J0ZWQgJiBGV19QT1JUX0NBUF9TUEVFRF80MEcpICE9IDA7CisJdW5zaWduZWQgaW50IHNwZWVkcywgaGlnaF9zcGVlZHM7CisKKwlzcGVlZHMgPSBGV19QT1JUX0NBUF9TUEVFRF9WKEZXX1BPUlRfQ0FQX1NQRUVEX0cobGMtPnN1cHBvcnRlZCkpOworCWhpZ2hfc3BlZWRzID0gc3BlZWRzICYgfihGV19QT1JUX0NBUF9TUEVFRF8xMDBNIHwgRldfUE9SVF9DQVBfU1BFRURfMUcpOworCisJcmV0dXJuIGhpZ2hfc3BlZWRzICE9IDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNvcmVfdGlja3NfcGVyX3VzZWMoY29uc3Qgc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCkBAIC0zNDcsNiArMzU0LDcgQEAKIAkJCXU2NCAqcGJhcjJfcW9mZnNldCwKIAkJCXVuc2lnbmVkIGludCAqcGJhcjJfcWlkKTsKIAordW5zaWduZWQgaW50IHQ0dmZfZ2V0X3BmX2Zyb21fdmYoc3RydWN0IGFkYXB0ZXIgKik7CiBpbnQgdDR2Zl9nZXRfc2dlX3BhcmFtcyhzdHJ1Y3QgYWRhcHRlciAqKTsKIGludCB0NHZmX2dldF92cGRfcGFyYW1zKHN0cnVjdCBhZGFwdGVyICopOwogaW50IHQ0dmZfZ2V0X2Rldl9wYXJhbXMoc3RydWN0IGFkYXB0ZXIgKik7CkBAIC0zODEsNSArMzg5LDcgQEAKIAogaW50IHQ0dmZfaGFuZGxlX2Z3X3JwbChzdHJ1Y3QgYWRhcHRlciAqLCBjb25zdCBfX2JlNjQgKik7CiBpbnQgdDR2Zl9wcmVwX2FkYXB0ZXIoc3RydWN0IGFkYXB0ZXIgKik7CitpbnQgdDR2Zl9nZXRfdmZfbWFjX2FjbChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IHBmLAorCQkJdW5zaWduZWQgaW50ICpuYWRkciwgdTggKmFkZHIpOwogCiAjZW5kaWYgLyogX19UNFZGX0NPTU1PTl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjR2Zi90NHZmX2h3LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0dmYvdDR2Zl9ody5jCmluZGV4IDQyN2JmYTcuLmU5ODI0OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjR2Zi90NHZmX2h3LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNHZmL3Q0dmZfaHcuYwpAQCAtMzE0LDggKzMxNCw5IEBACiB9CiAKICNkZWZpbmUgQURWRVJUX01BU0sgKEZXX1BPUlRfQ0FQX1NQRUVEXzEwME0gfCBGV19QT1JUX0NBUF9TUEVFRF8xRyB8XAotCQkgICAgIEZXX1BPUlRfQ0FQX1NQRUVEXzEwRyB8IEZXX1BPUlRfQ0FQX1NQRUVEXzQwRyB8IFwKLQkJICAgICBGV19QT1JUX0NBUF9TUEVFRF8xMDBHIHwgRldfUE9SVF9DQVBfQU5FRykKKwkJICAgICBGV19QT1JUX0NBUF9TUEVFRF8xMEcgfCBGV19QT1JUX0NBUF9TUEVFRF8yNUcgfCBcCisJCSAgICAgRldfUE9SVF9DQVBfU1BFRURfNDBHIHwgRldfUE9SVF9DQVBfU1BFRURfMTAwRyB8IFwKKwkJICAgICBGV19QT1JUX0NBUF9BTkVHKQogCiAvKioKICAqCWluaXRfbGlua19jb25maWcgLSBpbml0aWFsaXplIGEgbGluaydzIFNXIHN0YXRlCkBAIC02MzksNiArNjQwLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3Vuc2lnbmVkIGludCB0NHZmX2dldF9wZl9mcm9tX3ZmKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXUzMiB3aG9hbWk7CisKKwl3aG9hbWkgPSB0NF9yZWFkX3JlZyhhZGFwdGVyLCBUNFZGX1BMX0JBU0VfQUREUiArIFBMX1ZGX1dIT0FNSV9BKTsKKwlyZXR1cm4gKENIRUxTSU9fQ0hJUF9WRVJTSU9OKGFkYXB0ZXItPnBhcmFtcy5jaGlwKSA8PSBDSEVMU0lPX1Q1ID8KKwkJCVNPVVJDRVBGX0cod2hvYW1pKSA6IFQ2X1NPVVJDRVBGX0cod2hvYW1pKSk7Cit9CisKIC8qKgogICoJdDR2Zl9nZXRfc2dlX3BhcmFtcyAtIHJldHJpZXZlIGFkYXB0ZXIgU2NhdHRlciBnYXRoZXIgRW5naW5lIHBhcmFtZXRlcnMKICAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgpAQCAtNzE2LDcgKzcyNiw2IEBACiAJICogcmVhZC4KIAkgKi8KIAlpZiAoIWlzX3Q0KGFkYXB0ZXItPnBhcmFtcy5jaGlwKSkgewotCQl1MzIgd2hvYW1pOwogCQl1bnNpZ25lZCBpbnQgcGYsIHNfaHBzLCBzX3FwcDsKIAogCQlwYXJhbXNbMF0gPSAoRldfUEFSQU1TX01ORU1fVihGV19QQVJBTVNfTU5FTV9SRUcpIHwKQEAgLTc0MCwxMSArNzQ5LDcgQEAKIAkJICogcmVnaXN0ZXIgd2UganVzdCByZWFkLiBEbyBpdCBvbmNlIGhlcmUgc28gb3RoZXIgY29kZSBpbgogCQkgKiB0aGUgZHJpdmVyIGNhbiBqdXN0IHVzZSBpdC4KIAkJICovCi0JCXdob2FtaSA9IHQ0X3JlYWRfcmVnKGFkYXB0ZXIsCi0JCQkJICAgICBUNFZGX1BMX0JBU0VfQUREUiArIFBMX1ZGX1dIT0FNSV9BKTsKLQkJcGYgPSBDSEVMU0lPX0NISVBfVkVSU0lPTihhZGFwdGVyLT5wYXJhbXMuY2hpcCkgPD0gQ0hFTFNJT19UNSA/Ci0JCQlTT1VSQ0VQRl9HKHdob2FtaSkgOiBUNl9TT1VSQ0VQRl9HKHdob2FtaSk7Ci0KKwkJcGYgPSB0NHZmX2dldF9wZl9mcm9tX3ZmKGFkYXB0ZXIpOwogCQlzX2hwcyA9IChIT1NUUEFHRVNJWkVQRjBfUyArCiAJCQkgKEhPU1RQQUdFU0laRVBGMV9TIC0gSE9TVFBBR0VTSVpFUEYwX1MpICogcGYpOwogCQlzZ2VfcGFyYW1zLT5zZ2VfdmZfaHBzID0KQEAgLTE3MTIsOCArMTcxNywxMiBAQAogCQkJc3BlZWQgPSAxMDAwOwogCQllbHNlIGlmIChzdGF0ICYgRldfUE9SVF9DTURfTFNQRUVEX1YoRldfUE9SVF9DQVBfU1BFRURfMTBHKSkKIAkJCXNwZWVkID0gMTAwMDA7CisJCWVsc2UgaWYgKHN0YXQgJiBGV19QT1JUX0NNRF9MU1BFRURfVihGV19QT1JUX0NBUF9TUEVFRF8yNUcpKQorCQkJc3BlZWQgPSAyNTAwMDsKIAkJZWxzZSBpZiAoc3RhdCAmIEZXX1BPUlRfQ01EX0xTUEVFRF9WKEZXX1BPUlRfQ0FQX1NQRUVEXzQwRykpCiAJCQlzcGVlZCA9IDQwMDAwOworCQllbHNlIGlmIChzdGF0ICYgRldfUE9SVF9DTURfTFNQRUVEX1YoRldfUE9SVF9DQVBfU1BFRURfMTAwRykpCisJCQlzcGVlZCA9IDEwMDAwMDsKIAogCQkvKgogCQkgKiBTY2FuIGFsbCBvZiBvdXIgInBvcnRzIiAoVmlydHVhbCBJbnRlcmZhY2VzKSBsb29raW5nIGZvcgpAQCAtMTgwNywzICsxODE2LDUwIEBACiAKIAlyZXR1cm4gMDsKIH0KKworLyoqCisgKgl0NHZmX2dldF92Zl9tYWNfYWNsIC0gR2V0IHRoZSBNQUMgYWRkcmVzcyB0byBiZSBzZXQgdG8KKyAqCQkJICAgICAgdGhlIFZJIG9mIHRoaXMgVkYuCisgKglAYWRhcHRlcjogVGhlIGFkYXB0ZXIKKyAqCUBwZjogVGhlIHBmIGFzc29jaWF0ZWQgd2l0aCB2ZgorICoJQG5hZGRyOiB0aGUgbnVtYmVyIG9mIEFDTCBNQUMgYWRkcmVzc2VzIHJldHVybmVkIGluIGFkZHIKKyAqCUBhZGRyOiBQbGFjZWhvbGRlciBmb3IgTUFDIGFkZHJlc3NlcworICoKKyAqCUZpbmQgdGhlIE1BQyBhZGRyZXNzIHRvIGJlIHNldCB0byB0aGUgVkYncyBWSS4gVGhlIHJlcXVlc3RlZCBNQUMgYWRkcmVzcworICoJaXMgZnJvbSB0aGUgaG9zdCBPUyB2aWEgY2FsbGJhY2sgaW4gdGhlIFBGIGRyaXZlci4KKyAqLworaW50IHQ0dmZfZ2V0X3ZmX21hY19hY2woc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCBwZiwKKwkJCXVuc2lnbmVkIGludCAqbmFkZHIsIHU4ICphZGRyKQoreworCXN0cnVjdCBmd19hY2xfbWFjX2NtZCBjbWQ7CisJaW50IHJldDsKKworCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CisJY21kLm9wX3RvX3ZmbiA9IGNwdV90b19iZTMyKEZXX0NNRF9PUF9WKEZXX0FDTF9NQUNfQ01EKSB8CisJCQkJICAgIEZXX0NNRF9SRVFVRVNUX0YgfAorCQkJCSAgICBGV19DTURfUkVBRF9GKTsKKwljbWQuZW5fdG9fbGVuMTYgPSBjcHVfdG9fYmUzMigodW5zaWduZWQgaW50KUZXX0xFTjE2KGNtZCkpOworCXJldCA9IHQ0dmZfd3JfbWJveChhZGFwdGVyLCAmY21kLCBzaXplb2YoY21kKSwgJmNtZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChjbWQubm1hYyA8ICpuYWRkcikKKwkJKm5hZGRyID0gY21kLm5tYWM7CisKKwlzd2l0Y2ggKHBmKSB7CisJY2FzZSAzOgorCQltZW1jcHkoYWRkciwgY21kLm1hY2FkZHIzLCBzaXplb2YoY21kLm1hY2FkZHIzKSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJbWVtY3B5KGFkZHIsIGNtZC5tYWNhZGRyMiwgc2l6ZW9mKGNtZC5tYWNhZGRyMikpOworCQlicmVhazsKKwljYXNlIDE6CisJCW1lbWNweShhZGRyLCBjbWQubWFjYWRkcjEsIHNpemVvZihjbWQubWFjYWRkcjEpKTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQltZW1jcHkoYWRkciwgY21kLm1hY2FkZHIwLCBzaXplb2YoY21kLm1hY2FkZHIwKSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2xpYmN4Z2IvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2xpYmN4Z2IvTWFrZWZpbGUKaW5kZXggMjM2MjIzMC4uMjUzNGUzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9saWJjeGdiL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vbGliY3hnYi9NYWtlZmlsZQpAQCAtMSwzICsxLDUgQEAKK2NjZmxhZ3MteSA6PSAtSWRyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQKKwogb2JqLSQoQ09ORklHX0NIRUxTSU9fTElCKSArPSBsaWJjeGdiLm8KIAotbGliY3hnYi15IDo9IGxpYmN4Z2JfcHBtLm8KK2xpYmN4Z2IteSA6PSBsaWJjeGdiX3BwbS5vIGxpYmN4Z2JfY20ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9saWJjeGdiL2xpYmN4Z2JfY20uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vbGliY3hnYi9saWJjeGdiX2NtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYwZGU1YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vbGliY3hnYi9saWJjeGdiX2NtLmMKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICoJICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICoJICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKgkgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKgkgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICoJICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorI2luY2x1ZGUgPG5ldC9pcDZfcm91dGUuaD4KKworI2luY2x1ZGUgImxpYmN4Z2JfY20uaCIKKwordm9pZAorY3hnYl9nZXRfNHR1cGxlKHN0cnVjdCBjcGxfcGFzc19hY2NlcHRfcmVxICpyZXEsIGVudW0gY2hpcF90eXBlIHR5cGUsCisJCWludCAqaXB0eXBlLCBfX3U4ICpsb2NhbF9pcCwgX191OCAqcGVlcl9pcCwKKwkJX19iZTE2ICpsb2NhbF9wb3J0LCBfX2JlMTYgKnBlZXJfcG9ydCkKK3sKKwlpbnQgZXRoX2xlbiA9IChDSEVMU0lPX0NISVBfVkVSU0lPTih0eXBlKSA8PSBDSEVMU0lPX1Q1KSA/CisJCSAgICAgIEVUSF9IRFJfTEVOX0coYmUzMl90b19jcHUocmVxLT5oZHJfbGVuKSkgOgorCQkgICAgICBUNl9FVEhfSERSX0xFTl9HKGJlMzJfdG9fY3B1KHJlcS0+aGRyX2xlbikpOworCWludCBpcF9sZW4gPSAoQ0hFTFNJT19DSElQX1ZFUlNJT04odHlwZSkgPD0gQ0hFTFNJT19UNSkgPworCQkgICAgIElQX0hEUl9MRU5fRyhiZTMyX3RvX2NwdShyZXEtPmhkcl9sZW4pKSA6CisJCSAgICAgVDZfSVBfSERSX0xFTl9HKGJlMzJfdG9fY3B1KHJlcS0+aGRyX2xlbikpOworCXN0cnVjdCBpcGhkciAqaXAgPSAoc3RydWN0IGlwaGRyICopKCh1OCAqKShyZXEgKyAxKSArIGV0aF9sZW4pOworCXN0cnVjdCBpcHY2aGRyICppcDYgPSAoc3RydWN0IGlwdjZoZHIgKikoKHU4ICopKHJlcSArIDEpICsgZXRoX2xlbik7CisJc3RydWN0IHRjcGhkciAqdGNwID0gKHN0cnVjdCB0Y3BoZHIgKikKKwkJCSAgICAgKCh1OCAqKShyZXEgKyAxKSArIGV0aF9sZW4gKyBpcF9sZW4pOworCisJaWYgKGlwLT52ZXJzaW9uID09IDQpIHsKKwkJcHJfZGVidWcoIiVzIHNhZGRyIDB4JXggZGFkZHIgMHgleCBzcG9ydCAldSBkcG9ydCAldVxuIiwKKwkJCSBfX2Z1bmNfXywgbnRvaGwoaXAtPnNhZGRyKSwgbnRvaGwoaXAtPmRhZGRyKSwKKwkJCSBudG9ocyh0Y3AtPnNvdXJjZSksIG50b2hzKHRjcC0+ZGVzdCkpOworCQkqaXB0eXBlID0gNDsKKwkJbWVtY3B5KHBlZXJfaXAsICZpcC0+c2FkZHIsIDQpOworCQltZW1jcHkobG9jYWxfaXAsICZpcC0+ZGFkZHIsIDQpOworCX0gZWxzZSB7CisJCXByX2RlYnVnKCIlcyBzYWRkciAlcEk2IGRhZGRyICVwSTYgc3BvcnQgJXUgZHBvcnQgJXVcbiIsCisJCQkgX19mdW5jX18sIGlwNi0+c2FkZHIuczZfYWRkciwgaXA2LT5kYWRkci5zNl9hZGRyLAorCQkJIG50b2hzKHRjcC0+c291cmNlKSwgbnRvaHModGNwLT5kZXN0KSk7CisJCSppcHR5cGUgPSA2OworCQltZW1jcHkocGVlcl9pcCwgaXA2LT5zYWRkci5zNl9hZGRyLCAxNik7CisJCW1lbWNweShsb2NhbF9pcCwgaXA2LT5kYWRkci5zNl9hZGRyLCAxNik7CisJfQorCSpwZWVyX3BvcnQgPSB0Y3AtPnNvdXJjZTsKKwkqbG9jYWxfcG9ydCA9IHRjcC0+ZGVzdDsKK30KK0VYUE9SVF9TWU1CT0woY3hnYl9nZXRfNHR1cGxlKTsKKworc3RhdGljIGJvb2wKK2N4Z2Jfb3VyX2ludGVyZmFjZShzdHJ1Y3QgY3hnYjRfbGxkX2luZm8gKmxsZGksCisJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICooKmdldF9yZWFsX2Rldikoc3RydWN0IG5ldF9kZXZpY2UgKiksCisJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICplZ3Jlc3NfZGV2KQoreworCWludCBpOworCisJZWdyZXNzX2RldiA9IGdldF9yZWFsX2RldihlZ3Jlc3NfZGV2KTsKKwlmb3IgKGkgPSAwOyBpIDwgbGxkaS0+bnBvcnRzOyBpKyspCisJCWlmIChsbGRpLT5wb3J0c1tpXSA9PSBlZ3Jlc3NfZGV2KQorCQkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCitzdHJ1Y3QgZHN0X2VudHJ5ICoKK2N4Z2JfZmluZF9yb3V0ZShzdHJ1Y3QgY3hnYjRfbGxkX2luZm8gKmxsZGksCisJCXN0cnVjdCBuZXRfZGV2aWNlICooKmdldF9yZWFsX2Rldikoc3RydWN0IG5ldF9kZXZpY2UgKiksCisJCV9fYmUzMiBsb2NhbF9pcCwgX19iZTMyIHBlZXJfaXAsIF9fYmUxNiBsb2NhbF9wb3J0LAorCQlfX2JlMTYgcGVlcl9wb3J0LCB1OCB0b3MpCit7CisJc3RydWN0IHJ0YWJsZSAqcnQ7CisJc3RydWN0IGZsb3dpNCBmbDQ7CisJc3RydWN0IG5laWdoYm91ciAqbjsKKworCXJ0ID0gaXBfcm91dGVfb3V0cHV0X3BvcnRzKCZpbml0X25ldCwgJmZsNCwgTlVMTCwgcGVlcl9pcCwgbG9jYWxfaXAsCisJCQkJICAgcGVlcl9wb3J0LCBsb2NhbF9wb3J0LCBJUFBST1RPX1RDUCwKKwkJCQkgICB0b3MsIDApOworCWlmIChJU19FUlIocnQpKQorCQlyZXR1cm4gTlVMTDsKKwluID0gZHN0X25laWdoX2xvb2t1cCgmcnQtPmRzdCwgJnBlZXJfaXApOworCWlmICghbikKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCFjeGdiX291cl9pbnRlcmZhY2UobGxkaSwgZ2V0X3JlYWxfZGV2LCBuLT5kZXYpICYmCisJICAgICEobi0+ZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykpIHsKKwkJbmVpZ2hfcmVsZWFzZShuKTsKKwkJZHN0X3JlbGVhc2UoJnJ0LT5kc3QpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbmVpZ2hfcmVsZWFzZShuKTsKKwlyZXR1cm4gJnJ0LT5kc3Q7Cit9CitFWFBPUlRfU1lNQk9MKGN4Z2JfZmluZF9yb3V0ZSk7CisKK3N0cnVjdCBkc3RfZW50cnkgKgorY3hnYl9maW5kX3JvdXRlNihzdHJ1Y3QgY3hnYjRfbGxkX2luZm8gKmxsZGksCisJCSBzdHJ1Y3QgbmV0X2RldmljZSAqKCpnZXRfcmVhbF9kZXYpKHN0cnVjdCBuZXRfZGV2aWNlICopLAorCQkgX191OCAqbG9jYWxfaXAsIF9fdTggKnBlZXJfaXAsIF9fYmUxNiBsb2NhbF9wb3J0LAorCQkgX19iZTE2IHBlZXJfcG9ydCwgdTggdG9zLCBfX3UzMiBzaW42X3Njb3BlX2lkKQoreworCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IE5VTEw7CisKKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfSVBWNikpIHsKKwkJc3RydWN0IGZsb3dpNiBmbDY7CisKKwkJbWVtc2V0KCZmbDYsIDAsIHNpemVvZihmbDYpKTsKKwkJbWVtY3B5KCZmbDYuZGFkZHIsIHBlZXJfaXAsIDE2KTsKKwkJbWVtY3B5KCZmbDYuc2FkZHIsIGxvY2FsX2lwLCAxNik7CisJCWlmIChpcHY2X2FkZHJfdHlwZSgmZmw2LmRhZGRyKSAmIElQVjZfQUREUl9MSU5LTE9DQUwpCisJCQlmbDYuZmxvd2k2X29pZiA9IHNpbjZfc2NvcGVfaWQ7CisJCWRzdCA9IGlwNl9yb3V0ZV9vdXRwdXQoJmluaXRfbmV0LCBOVUxMLCAmZmw2KTsKKwkJaWYgKCFkc3QpCisJCQlnb3RvIG91dDsKKwkJaWYgKCFjeGdiX291cl9pbnRlcmZhY2UobGxkaSwgZ2V0X3JlYWxfZGV2LAorCQkJCQlpcDZfZHN0X2lkZXYoZHN0KS0+ZGV2KSAmJgorCQkgICAgIShpcDZfZHN0X2lkZXYoZHN0KS0+ZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykpIHsKKwkJCWRzdF9yZWxlYXNlKGRzdCk7CisJCQlkc3QgPSBOVUxMOworCQl9CisJfQorCitvdXQ6CisJcmV0dXJuIGRzdDsKK30KK0VYUE9SVF9TWU1CT0woY3hnYl9maW5kX3JvdXRlNik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2xpYmN4Z2IvbGliY3hnYl9jbS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9saWJjeGdiL2xpYmN4Z2JfY20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTViOTRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9saWJjeGdiL2xpYmN4Z2JfY20uaApAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKgkgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKgkgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqCSAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqCSAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKgkgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19MSUJDWEdCX0NNX0hfXworI2RlZmluZSBfX0xJQkNYR0JfQ01fSF9fCisKKworI2luY2x1ZGUgPG5ldC90Y3AuaD4KKworI2luY2x1ZGUgPGN4Z2I0Lmg+CisjaW5jbHVkZSA8dDRfbXNnLmg+CisjaW5jbHVkZSA8bDJ0Lmg+CisKK3ZvaWQKK2N4Z2JfZ2V0XzR0dXBsZShzdHJ1Y3QgY3BsX3Bhc3NfYWNjZXB0X3JlcSAqLCBlbnVtIGNoaXBfdHlwZSwKKwkJaW50ICosIF9fdTggKiwgX191OCAqLCBfX2JlMTYgKiwgX19iZTE2ICopOworc3RydWN0IGRzdF9lbnRyeSAqCitjeGdiX2ZpbmRfcm91dGUoc3RydWN0IGN4Z2I0X2xsZF9pbmZvICosCisJCXN0cnVjdCBuZXRfZGV2aWNlICooKikoc3RydWN0IG5ldF9kZXZpY2UgKiksCisJCV9fYmUzMiwgX19iZTMyLCBfX2JlMTYsCV9fYmUxNiwgdTgpOworc3RydWN0IGRzdF9lbnRyeSAqCitjeGdiX2ZpbmRfcm91dGU2KHN0cnVjdCBjeGdiNF9sbGRfaW5mbyAqLAorCQkgc3RydWN0IG5ldF9kZXZpY2UgKigqKShzdHJ1Y3QgbmV0X2RldmljZSAqKSwKKwkJIF9fdTggKiwgX191OCAqLCBfX2JlMTYsIF9fYmUxNiwgdTgsIF9fdTMyKTsKKworLyogUmV0dXJucyB3aGV0aGVyIGEgQ1BMIHN0YXR1cyBjb252ZXlzIG5lZ2F0aXZlIGFkdmljZS4KKyAqLworc3RhdGljIGlubGluZSBib29sIGN4Z2JfaXNfbmVnX2Fkdih1bnNpZ25lZCBpbnQgc3RhdHVzKQoreworCXJldHVybiBzdGF0dXMgPT0gQ1BMX0VSUl9SVFhfTkVHX0FEVklDRSB8fAorCSAgICAgICBzdGF0dXMgPT0gQ1BMX0VSUl9QRVJTSVNUX05FR19BRFZJQ0UgfHwKKwkgICAgICAgc3RhdHVzID09IENQTF9FUlJfS0VFUEFMVl9ORUdfQURWSUNFOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2N4Z2JfYmVzdF9tdHUoY29uc3QgdW5zaWduZWQgc2hvcnQgKm10dXMsIHVuc2lnbmVkIHNob3J0IG10dSwKKwkgICAgICB1bnNpZ25lZCBpbnQgKmlkeCwgaW50IHVzZV90cywgaW50IGlwdjYpCit7CisJdW5zaWduZWQgc2hvcnQgaGRyX3NpemUgPSAoaXB2NiA/CisJCQkJICAgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSA6CisJCQkJICAgc2l6ZW9mKHN0cnVjdCBpcGhkcikpICsKKwkJCQkgIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSArCisJCQkJICAodXNlX3RzID8KKwkJCQkgICByb3VuZF91cChUQ1BPTEVOX1RJTUVTVEFNUCwgNCkgOiAwKTsKKwl1bnNpZ25lZCBzaG9ydCBkYXRhX3NpemUgPSBtdHUgLSBoZHJfc2l6ZTsKKworCWN4Z2I0X2Jlc3RfYWxpZ25lZF9tdHUobXR1cywgaGRyX3NpemUsIGRhdGFfc2l6ZSwgOCwgaWR4KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgY3hnYl9jb21wdXRlX3dzY2FsZSh1MzIgd2luKQoreworCXUzMiB3c2NhbGUgPSAwOworCisJd2hpbGUgKHdzY2FsZSA8IDE0ICYmICg2NTUzNSA8PCB3c2NhbGUpIDwgd2luKQorCQl3c2NhbGUrKzsKKwlyZXR1cm4gd3NjYWxlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2N4Z2JfbWtfdGlkX3JlbGVhc2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGxlbiwgdTMyIHRpZCwgdTE2IGNoYW4pCit7CisJc3RydWN0IGNwbF90aWRfcmVsZWFzZSAqcmVxOworCisJcmVxID0gKHN0cnVjdCBjcGxfdGlkX3JlbGVhc2UgKilfX3NrYl9wdXQoc2tiLCBsZW4pOworCW1lbXNldChyZXEsIDAsIGxlbik7CisKKwlJTklUX1RQX1dSKHJlcSwgdGlkKTsKKwlPUENPREVfVElEKHJlcSkgPSBjcHVfdG9fYmUzMihNS19PUENPREVfVElEKENQTF9USURfUkVMRUFTRSwgdGlkKSk7CisJc2V0X3dyX3R4cShza2IsIENQTF9QUklPUklUWV9TRVRVUCwgY2hhbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorY3hnYl9ta19jbG9zZV9jb25fcmVxKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBsZW4sIHUzMiB0aWQsIHUxNiBjaGFuLAorCQkgICAgICB2b2lkICpoYW5kbGUsIGFycF9lcnJfaGFuZGxlcl90IGhhbmRsZXIpCit7CisJc3RydWN0IGNwbF9jbG9zZV9jb25fcmVxICpyZXE7CisKKwlyZXEgPSAoc3RydWN0IGNwbF9jbG9zZV9jb25fcmVxICopX19za2JfcHV0KHNrYiwgbGVuKTsKKwltZW1zZXQocmVxLCAwLCBsZW4pOworCisJSU5JVF9UUF9XUihyZXEsIHRpZCk7CisJT1BDT0RFX1RJRChyZXEpID0gY3B1X3RvX2JlMzIoTUtfT1BDT0RFX1RJRChDUExfQ0xPU0VfQ09OX1JFUSwgdGlkKSk7CisJc2V0X3dyX3R4cShza2IsIENQTF9QUklPUklUWV9EQVRBLCBjaGFuKTsKKwl0NF9zZXRfYXJwX2Vycl9oYW5kbGVyKHNrYiwgaGFuZGxlLCBoYW5kbGVyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitjeGdiX21rX2Fib3J0X3JlcShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgbGVuLCB1MzIgdGlkLCB1MTYgY2hhbiwKKwkJICB2b2lkICpoYW5kbGUsIGFycF9lcnJfaGFuZGxlcl90IGhhbmRsZXIpCit7CisJc3RydWN0IGNwbF9hYm9ydF9yZXEgKnJlcTsKKworCXJlcSA9IChzdHJ1Y3QgY3BsX2Fib3J0X3JlcSAqKV9fc2tiX3B1dChza2IsIGxlbik7CisJbWVtc2V0KHJlcSwgMCwgbGVuKTsKKworCUlOSVRfVFBfV1IocmVxLCB0aWQpOworCU9QQ09ERV9USUQocmVxKSA9IGNwdV90b19iZTMyKE1LX09QQ09ERV9USUQoQ1BMX0FCT1JUX1JFUSwgdGlkKSk7CisJcmVxLT5jbWQgPSBDUExfQUJPUlRfU0VORF9SU1Q7CisJc2V0X3dyX3R4cShza2IsIENQTF9QUklPUklUWV9EQVRBLCBjaGFuKTsKKwl0NF9zZXRfYXJwX2Vycl9oYW5kbGVyKHNrYiwgaGFuZGxlLCBoYW5kbGVyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitjeGdiX21rX2Fib3J0X3JwbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgbGVuLCB1MzIgdGlkLCB1MTYgY2hhbikKK3sKKwlzdHJ1Y3QgY3BsX2Fib3J0X3JwbCAqcnBsOworCisJcnBsID0gKHN0cnVjdCBjcGxfYWJvcnRfcnBsICopX19za2JfcHV0KHNrYiwgbGVuKTsKKwltZW1zZXQocnBsLCAwLCBsZW4pOworCisJSU5JVF9UUF9XUihycGwsIHRpZCk7CisJT1BDT0RFX1RJRChycGwpID0gY3B1X3RvX2JlMzIoTUtfT1BDT0RFX1RJRChDUExfQUJPUlRfUlBMLCB0aWQpKTsKKwlycGwtPmNtZCA9IENQTF9BQk9SVF9OT19SU1Q7CisJc2V0X3dyX3R4cShza2IsIENQTF9QUklPUklUWV9EQVRBLCBjaGFuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitjeGdiX21rX3J4X2RhdGFfYWNrKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBsZW4sIHUzMiB0aWQsIHUxNiBjaGFuLAorCQkgICAgdTMyIGNyZWRpdF9kYWNrKQoreworCXN0cnVjdCBjcGxfcnhfZGF0YV9hY2sgKnJlcTsKKworCXJlcSA9IChzdHJ1Y3QgY3BsX3J4X2RhdGFfYWNrICopX19za2JfcHV0KHNrYiwgbGVuKTsKKwltZW1zZXQocmVxLCAwLCBsZW4pOworCisJSU5JVF9UUF9XUihyZXEsIHRpZCk7CisJT1BDT0RFX1RJRChyZXEpID0gY3B1X3RvX2JlMzIoTUtfT1BDT0RFX1RJRChDUExfUlhfREFUQV9BQ0ssIHRpZCkpOworCXJlcS0+Y3JlZGl0X2RhY2sgPSBjcHVfdG9fYmUzMihjcmVkaXRfZGFjayk7CisJc2V0X3dyX3R4cShza2IsIENQTF9QUklPUklUWV9BQ0ssIGNoYW4pOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9kYXZpY29tL2RtOTAwMC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGF2aWNvbS9kbTkwMDAuYwppbmRleCAxNDcxZTE2Li5mNDUzODVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9kYXZpY29tL2RtOTAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Rhdmljb20vZG05MDAwLmMKQEAgLTEyOTksNiArMTI5OSw3IEBACiBkbTkwMDBfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBib2FyZF9pbmZvICpkYiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IGlycV9mbGFncyA9IGlycV9nZXRfdHJpZ2dlcl90eXBlKGRldi0+aXJxKTsKIAogCWlmIChuZXRpZl9tc2dfaWZ1cChkYikpCiAJCWRldl9kYmcoZGItPmRldiwgImVuYWJsaW5nICVzXG4iLCBkZXYtPm5hbWUpOwpAQCAtMTMwNiw5ICsxMzA3LDExIEBACiAJLyogSWYgdGhlcmUgaXMgbm8gSVJRIHR5cGUgc3BlY2lmaWVkLCB0ZWxsIHRoZSB1c2VyIHRoYXQgdGhpcyBpcyBhCiAJICogcHJvYmxlbQogCSAqLwotCWlmIChpcnFfZ2V0X3RyaWdnZXJfdHlwZShkZXYtPmlycSkgPT0gSVJRRl9UUklHR0VSX05PTkUpCisJaWYgKGlycV9mbGFncyA9PSBJUlFGX1RSSUdHRVJfTk9ORSkKIAkJZGV2X3dhcm4oZGItPmRldiwgIldBUk5JTkc6IG5vIElSUSByZXNvdXJjZSBmbGFncyBzZXQuXG4iKTsKIAorCWlycV9mbGFncyB8PSBJUlFGX1NIQVJFRDsKKwogCS8qIEdQSU8wIG9uIHByZS1hY3RpdmF0ZSBQSFksIFJlZyAxRiBpcyBub3Qgc2V0IGJ5IHJlc2V0ICovCiAJaW93KGRiLCBETTkwMDBfR1BSLCAwKTsJLyogUkVHXzFGIGJpdDAgYWN0aXZhdGUgcGh5eGNlciAqLwogCW1kZWxheSgxKTsgLyogZGVsYXkgbmVlZHMgYnkgRE05MDAwQiAqLwpAQCAtMTMxNiw4ICsxMzE5LDcgQEAKIAkvKiBJbml0aWFsaXplIERNOTAwMCBib2FyZCAqLwogCWRtOTAwMF9pbml0X2RtOTAwMChkZXYpOwogCi0JaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBkbTkwMDBfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKLQkJCWRldi0+bmFtZSwgZGV2KSkKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIGRtOTAwMF9pbnRlcnJ1cHQsIGlycV9mbGFncywgZGV2LT5uYW1lLCBkZXYpKQogCQlyZXR1cm4gLUVBR0FJTjsKIAkvKiBOb3cgdGhhdCB3ZSBoYXZlIGFuIGludGVycnVwdCBoYW5kbGVyIGhvb2tlZCB1cCB3ZSBjYW4gdW5tYXNrCiAJICogb3VyIGludGVycnVwdHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2RlYy90dWxpcC9kZTR4NS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGVjL3R1bGlwL2RlNHg1LmMKaW5kZXggZjBlOWUyZS4uNjYyMGZjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGVjL3R1bGlwL2RlNHg1LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGVjL3R1bGlwL2RlNHg1LmMKQEAgLTE5NjYsNyArMTk2Niw3IEBACiAgICAgfSBlbHNlIGlmIChscC0+c2V0dXBfZiA9PSBIQVNIX1BFUkYpIHsgICAvKiBIYXNoIEZpbHRlcmluZyAqLwogCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBkZXYpIHsKIAkJY3JjID0gZXRoZXJfY3JjX2xlKEVUSF9BTEVOLCBoYS0+YWRkcik7Ci0JCWhhc2hjb2RlID0gY3JjICYgSEFTSF9CSVRTOyAgLyogaGFzaGNvZGUgaXMgOSBMU2Igb2YgQ1JDICovCisJCWhhc2hjb2RlID0gY3JjICYgREU0WDVfSEFTSF9CSVRTOyAgLyogaGFzaGNvZGUgaXMgOSBMU2Igb2YgQ1JDICovCiAKIAkJYnl0ZSA9IGhhc2hjb2RlID4+IDM7ICAgICAgICAvKiBiaXRbMy04XSAtPiBieXRlIGluIGZpbHRlciAqLwogCQliaXQgPSAxIDw8IChoYXNoY29kZSAmIDB4MDcpOy8qIGJpdFswLTJdIC0+IGJpdCBpbiBieXRlICovCkBAIC01MDQzLDcgKzUwNDMsNyBAQAogCSAgICAqKHBhICsgaSkgPSBkZXYtPmRldl9hZGRyW2ldOyAgICAgICAgICAgICAgICAgLyogSG9zdCBhZGRyZXNzICovCiAJICAgIGlmIChpICYgMHgwMSkgcGEgKz0gMjsKIAl9Ci0JKihscC0+c2V0dXBfZnJhbWUgKyAoSEFTSF9UQUJMRV9MRU4gPj4gMykgLSAzKSA9IDB4ODA7CisJKihscC0+c2V0dXBfZnJhbWUgKyAoREU0WDVfSEFTSF9UQUJMRV9MRU4gPj4gMykgLSAzKSA9IDB4ODA7CiAgICAgfSBlbHNlIHsKIAlmb3IgKGk9MDsgaTxFVEhfQUxFTjsgaSsrKSB7IC8qIEhvc3QgYWRkcmVzcyAqLwogCSAgICAqKHBhICsgKGkmMSkpID0gZGV2LT5kZXZfYWRkcltpXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2RlYy90dWxpcC9kZTR4NS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGVjL3R1bGlwL2RlNHg1LmgKaW5kZXggZWM3NTZlYi4uMWJmZGM5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGVjL3R1bGlwL2RlNHg1LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGVjL3R1bGlwL2RlNHg1LmgKQEAgLTg2MCw4ICs4NjAsOCBAQAogI2RlZmluZSBQQ0kgIDAKICNkZWZpbmUgRUlTQSAxCiAKLSNkZWZpbmUgSEFTSF9UQUJMRV9MRU4gICA1MTIgICAgICAgLyogQml0cyAqLwotI2RlZmluZSBIQVNIX0JJVFMgICAgICAgIDB4MDFmZiAgICAvKiA5IExTIGJpdHMgKi8KKyNkZWZpbmUgREU0WDVfSEFTSF9UQUJMRV9MRU4gICA1MTIgICAgICAgLyogQml0cyAqLworI2RlZmluZSBERTRYNV9IQVNIX0JJVFMgICAgICAgIDB4MDFmZiAgICAvKiA5IExTIGJpdHMgKi8KIAogI2RlZmluZSBTRVRVUF9GUkFNRV9MRU4gIDE5MiAgICAgICAvKiBCeXRlcyAqLwogI2RlZmluZSBJTVBFUkZfUEFfT0ZGU0VUIDE1NiAgICAgICAvKiBCeXRlcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGxpbmsvc3VuZGFuY2UuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2RsaW5rL3N1bmRhbmNlLmMKaW5kZXggNThjNjMzOC4uNzlkODAwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGxpbmsvc3VuZGFuY2UuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9kbGluay9zdW5kYW5jZS5jCkBAIC04NjcsNyArODY3LDcgQEAKIAogCS8qIEluaXRpYWxpemUgb3RoZXIgcmVnaXN0ZXJzLiAqLwogCV9fc2V0X21hY19hZGRyKGRldik7Ci0jaWYgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUSkgfHwgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfVkxBTl84MDIxUSkKIAlpb3dyaXRlMTYoZGV2LT5tdHUgKyAxOCwgaW9hZGRyICsgTWF4RnJhbWVTaXplKTsKICNlbHNlCiAJaW93cml0ZTE2KGRldi0+bXR1ICsgMTQsIGlvYWRkciArIE1heEZyYW1lU2l6ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmUuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZS5oCmluZGV4IDQ1NTVlMDQuLjZjZmE2M2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZS5oCkBAIC0zNyw3ICszNyw3IEBACiAjaW5jbHVkZSAiYmVfaHcuaCIKICNpbmNsdWRlICJiZV9yb2NlLmgiCiAKLSNkZWZpbmUgRFJWX1ZFUgkJCSIxMS4wLjAuMCIKKyNkZWZpbmUgRFJWX1ZFUgkJCSIxMS4xLjAuMCIKICNkZWZpbmUgRFJWX05BTUUJCSJiZTJuZXQiCiAjZGVmaW5lIEJFX05BTUUJCQkiRW11bGV4IEJsYWRlRW5naW5lMiIKICNkZWZpbmUgQkUzX05BTUUJCSJFbXVsZXggQmxhZGVFbmdpbmUzIgpAQCAtMzk5LDEzICszOTksMTMgQEAKICNkZWZpbmUgQkVfRkxBR1NfUEhZX01JU0NPTkZJR1VSRUQJCUJJVCgxMCkKICNkZWZpbmUgQkVfRkxBR1NfRVJSX0RFVEVDVElPTl9TQ0hFRFVMRUQJQklUKDExKQogI2RlZmluZSBCRV9GTEFHU19PUzJCTUMJCQkJQklUKDEyKQorI2RlZmluZSBCRV9GTEFHU19UUllfUkVDT1ZFUlkJCQlCSVQoMTMpCiAKICNkZWZpbmUgQkVfVUNfUE1BQ19DT1VOVAkJCTMwCiAjZGVmaW5lIEJFX1ZGX1VDX1BNQUNfQ09VTlQJCQkyCiAKICNkZWZpbmUgTUFYX0VSUl9SRUNPVkVSWV9SRVRSWV9DT1VOVAkJMwogI2RlZmluZSBFUlJfREVURUNUSU9OX0RFTEFZCQkJMTAwMAotI2RlZmluZSBFUlJfUkVDT1ZFUllfUkVUUllfREVMQVkJCTMwMDAwCiAKIC8qIEV0aHRvb2wgc2V0X2R1bXAgZmxhZ3MgKi8KICNkZWZpbmUgTEFOQ0VSX0lOSVRJQVRFX0ZXX0RVTVAJCQkweDEKQEAgLTUwOCw2ICs1MDgsNzAgQEAKIAl1MTYgbHNvX21zczsJLyogTVNTIGZvciBMU08gKi8KIH07CiAKK3N0cnVjdCBiZV9ldGhfYWRkciB7CisJdW5zaWduZWQgY2hhciBtYWNbRVRIX0FMRU5dOworfTsKKworI2RlZmluZSBCRV9TRUMJMTAwMAkJCS8qIGluIG1zZWMgKi8KKyNkZWZpbmUgQkVfTUlOCSg2MCAqIEJFX1NFQykJCS8qIGluIG1zZWMgKi8KKyNkZWZpbmUgQkVfSE9VUgkoNjAgKiBCRV9NSU4pCQkvKiBpbiBtc2VjICovCisKKyNkZWZpbmUgRVJSX1JFQ09WRVJZX01BWF9SRVRSWV9DT1VOVAkJMworI2RlZmluZSBFUlJfUkVDT1ZFUllfREVURUNUSU9OX0RFTEFZCQlCRV9TRUMKKyNkZWZpbmUgRVJSX1JFQ09WRVJZX1JFVFJZX0RFTEFZCQkoMzAgKiBCRV9TRUMpCisKKy8qIFVFLWRldGVjdGlvbi1kdXJhdGlvbiBpbiBCRXgvU2t5aGF3azoKKyAqIEFsbCBQRnMgbXVzdCB3YWl0IGZvciB0aGlzIGR1cmF0aW9uIGFmdGVyIHRoZXkgZGV0ZWN0IFVFIGJlZm9yZSByZWFkaW5nCisgKiBTTElQT1JUX1NFTUFQSE9SRSByZWdpc3Rlci4gQXQgdGhlIGVuZCBvZiB0aGlzIGR1cmF0aW9uLCB0aGUgRmlybXdhcmUKKyAqIGd1YXJhbnRlZXMgdGhhdCB0aGUgU0xJUE9SVF9TRU1BUEhPUkUgcmVnaXN0ZXIgaXMgdXBkYXRlZCB0byBpbmRpY2F0ZQorICogaWYgdGhlIFVFIGlzIHJlY292ZXJhYmxlLgorICovCisjZGVmaW5lIEVSUl9SRUNPVkVSWV9VRV9ERVRFQ1RfRFVSQVRJT04JCQlCRV9TRUMKKworLyogSW5pdGlhbCBpZGxlIHRpbWUgKGluIG1zZWMpIHRvIGVsYXBzZSBhZnRlciBkcml2ZXIgbG9hZCwKKyAqIGJlZm9yZSBVRSByZWNvdmVyeSBpcyBhbGxvd2VkLgorICovCisjZGVmaW5lIEVSUl9JRExFX0hSCQkJMjQKKyNkZWZpbmUgRVJSX1JFQ09WRVJZX0lETEVfVElNRQkJKEVSUl9JRExFX0hSICogQkVfSE9VUikKKworLyogVGltZSBpbnRlcnZhbCAoaW4gbXNlYykgYWZ0ZXIgd2hpY2ggVUUgcmVjb3ZlcnkgY2FuIGJlIHJlcGVhdGVkICovCisjZGVmaW5lIEVSUl9JTlRFUlZBTF9IUgkJCTcyCisjZGVmaW5lIEVSUl9SRUNPVkVSWV9JTlRFUlZBTAkJKEVSUl9JTlRFUlZBTF9IUiAqIEJFX0hPVVIpCisKKy8qIEJFeC9TSCBVRSByZWNvdmVyeSBzdGF0ZSBtYWNoaW5lICovCitlbnVtIHsKKwlFUlJfUkVDT1ZFUllfU1RfTk9ORSA9IDAsCQkvKiBObyBSZWNvdmVyeSAqLworCUVSUl9SRUNPVkVSWV9TVF9ERVRFQ1QgPSAxLAkJLyogVUUgZGV0ZWN0aW9uIGR1cmF0aW9uICovCisJRVJSX1JFQ09WRVJZX1NUX1JFU0VUID0gMiwJCS8qIFJlc2V0IFBoYXNlIChQRjAgb25seSkgKi8KKwlFUlJfUkVDT1ZFUllfU1RfUFJFX1BPTEwgPSAzLAkJLyogUHJlLVBvbGwgUGhhc2UgKGFsbCBQRnMpICovCisJRVJSX1JFQ09WRVJZX1NUX1JFSU5JVCA9IDQJCS8qIFJlLWluaXRpYWxpemUgUGhhc2UgKi8KK307CisKK3N0cnVjdCBiZV9lcnJvcl9yZWNvdmVyeSB7CisJLyogTGFuY2VyIGVycm9yIHJlY292ZXJ5IHZhcmlhYmxlcyAqLworCXU4IHJlY292ZXJ5X3JldHJpZXM7CisKKwkvKiBCRXgvU2t5aGF3ayBlcnJvciByZWNvdmVyeSB2YXJpYWJsZXMgKi8KKwl1OCByZWNvdmVyeV9zdGF0ZTsKKwl1MTYgdWVfdG9fcmVzZXRfdGltZTsJCS8qIFRpbWUgYWZ0ZXIgVUUsIHRvIHNvZnQgcmVzZXQKKwkJCQkJICogdGhlIGNoaXAgLSBQRjAgb25seQorCQkJCQkgKi8KKwl1MTYgdWVfdG9fcG9sbF90aW1lOwkJLyogVGltZSBhZnRlciBVRSwgdG8gUmVzdGFydCBQb2xsaW5nCisJCQkJCSAqIG9mIFNMSVBPUlRfU0VNQVBIT1JFIHJlZworCQkJCQkgKi8KKwl1MTYgbGFzdF9lcnJfY29kZTsKKwlib29sIHJlY292ZXJ5X3N1cHBvcnRlZDsKKwl1bnNpZ25lZCBsb25nIHByb2JlX3RpbWU7CisJdW5zaWduZWQgbG9uZyBsYXN0X3JlY292ZXJ5X3RpbWU7CisKKwkvKiBDb21tb24gdG8gYm90aCBMYW5jZXIgJiBCRXgvU0ggZXJyb3IgcmVjb3ZlcnkgKi8KKwl1MzIgcmVzY2hlZF9kZWxheTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGVycl9kZXRlY3Rpb25fd29yazsKK307CisKKy8qIEV0aHRvb2wgcHJpdl9mbGFncyAqLworI2RlZmluZQlCRV9ESVNBQkxFX1RQRV9SRUNPVkVSWQkweDEKKwogc3RydWN0IGJlX2FkYXB0ZXIgewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CkBAIC01MjMsNyArNTg3LDcgQEAKIAlzdHJ1Y3QgYmVfZG1hX21lbSBtYm94X21lbV9hbGxvY2VkOwogCiAJc3RydWN0IGJlX21jY19vYmogbWNjX29iajsKLQlzcGlubG9ja190IG1jY19sb2NrOwkvKiBGb3Igc2VyaWFsaXppbmcgbWNjIGNtZHMgdG8gQkUgY2FyZCAqLworCXN0cnVjdCBtdXRleCBtY2NfbG9jazsJLyogRm9yIHNlcmlhbGl6aW5nIG1jYyBjbWRzIHRvIEJFIGNhcmQgKi8KIAlzcGlubG9ja190IG1jY19jcV9sb2NrOwogCiAJdTE2IGNmZ19udW1fcnhfaXJxczsJCS8qIGNvbmZpZ3VyZWQgdmlhIHNldC1jaGFubmVscyAqLwpAQCAtNTU2LDcgKzYyMCw2IEBACiAJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwogCXUxNiB3b3JrX2NvdW50ZXI7CiAKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGJlX2Vycl9kZXRlY3Rpb25fd29yazsKIAl1OCByZWNvdmVyeV9yZXRyaWVzOwogCXU4IGVycl9mbGFnczsKIAlib29sIHBjaWNmZ19tYXBwZWQ7CS8qIHBjaWNmZyBvYnRhaW5lZCB2aWEgcGNpX2lvbWFwKCkgKi8KQEAgLTU3MCw5ICs2MzMsMTUgQEAKIAlpbnQgaWZfaGFuZGxlOwkJLyogVXNlZCB0byBjb25maWd1cmUgZmlsdGVyaW5nICovCiAJdTMyIGlmX2ZsYWdzOwkJLyogSW50ZXJmYWNlIGZpbHRlcmluZyBmbGFncyAqLwogCXUzMiAqcG1hY19pZDsJCS8qIE1BQyBhZGRyIGhhbmRsZSB1c2VkIGJ5IEJFIGNhcmQgKi8KKwlzdHJ1Y3QgYmVfZXRoX2FkZHIgKnVjX2xpc3Q7LyogbGlzdCBvZiB1Yy1hZGRycyBwcm9ncmFtbWVkIChub3QgcGVybSkgKi8KIAl1MzIgdWNfbWFjczsJCS8qIENvdW50IG9mIHNlY29uZGFyeSBVQyBNQUMgcHJvZ3JhbW1lZCAqLworCXN0cnVjdCBiZV9ldGhfYWRkciAqbWNfbGlzdDsvKiBsaXN0IG9mIG1jYXN0IGFkZHJzIHByb2dyYW1tZWQgKi8KKwl1MzIgbWNfY291bnQ7CiAJdW5zaWduZWQgbG9uZyB2aWRzW0JJVFNfVE9fTE9OR1MoVkxBTl9OX1ZJRCldOwogCXUxNiB2bGFuc19hZGRlZDsKKwlib29sIHVwZGF0ZV91Y19saXN0OworCWJvb2wgdXBkYXRlX21jX2xpc3Q7CisJc3RydWN0IG11dGV4IHJ4X2ZpbHRlcl9sb2NrOy8qIEZvciBwcm90ZWN0aW5nIHZpZHNbXSAmIG1jL3VjX2xpc3RbXSAqLwogCiAJdTMyIGJlYWNvbl9zdGF0ZTsJLyogZm9yIHNldF9waHlzX2lkICovCiAKQEAgLTYyNCw2ICs2OTMsMTggQEAKIAl1MzIgZmF0X2R1bXBfbGVuOwogCXUxNiBzZXJpYWxfbnVtW0NOVExfU0VSSUFMX05VTV9XT1JEU107CiAJdTggcGh5X3N0YXRlOyAvKiBzdGF0ZSBvZiBzZnAgb3B0aWNzIChmdW5jdGlvbmFsLCBmYXVsdGVkLCBldGMuLCkgKi8KKwl1OCBkZXZfbWFjW0VUSF9BTEVOXTsKKwl1MzIgcHJpdl9mbGFnczsgLyogZXRodG9vbCBnZXQvc2V0X3ByaXZfZmxhZ3MoKSAqLworCXN0cnVjdCBiZV9lcnJvcl9yZWNvdmVyeSBlcnJvcl9yZWNvdmVyeTsKK307CisKKy8qIFVzZWQgZm9yIGRlZmVyZWQgRlcgY29uZmlnIGNtZHMuIEFkZCBmaWVsZHMgdG8gdGhpcyBzdHJ1Y3QgYXMgcmVxZCAqLworc3RydWN0IGJlX2NtZF93b3JrIHsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcjsKKwl1bmlvbiB7CisJCV9fYmUxNiB2eGxhbl9wb3J0OworCX0gaW5mbzsKIH07CiAKICNkZWZpbmUgYmVfcGh5c2ZuKGFkYXB0ZXIpCQkoIWFkYXB0ZXItPnZpcnRmbikKQEAgLTg0OCw2ICs5MjksOSBAQAogCXJldHVybiBza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSAmJiBpcF9oZHIoc2tiKS0+dmVyc2lvbiA9PSA0OwogfQogCisjZGVmaW5lIGJlX2Vycm9yX3JlY292ZXJpbmcoYWRhcHRlcikJXAorCQkoYWRhcHRlci0+ZmxhZ3MgJiBCRV9GTEFHU19UUllfUkVDT1ZFUlkpCisKICNkZWZpbmUgQkVfRVJST1JfRUVICQkxCiAjZGVmaW5lIEJFX0VSUk9SX1VFCQlCSVQoMSkKICNkZWZpbmUgQkVfRVJST1JfRlcJCUJJVCgyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2NtZHMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9jbWRzLmMKaW5kZXggMmNjMTE3NS4uOWNmZmU0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2NtZHMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfY21kcy5jCkBAIC05Miw2ICs5MiwxMSBAQAogCQlDTURfU1VCU1lTVEVNX0NPTU1PTiwKIAkJQkVfUFJJVl9ERVZDRkcgfCBCRV9QUklWX1ZIQURNCiAJfSwKKwl7CisJCU9QQ09ERV9DT01NT05fR0VUX0VYVF9GQVRfQ0FQQUJJTElUSUVTLAorCQlDTURfU1VCU1lTVEVNX0NPTU1PTiwKKwkJQkVfUFJJVl9ERVZDRkcKKwl9CiB9OwogCiBzdGF0aWMgYm9vbCBiZV9jbWRfYWxsb3dlZChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTggb3Bjb2RlLCB1OCBzdWJzeXN0ZW0pCkBAIC01NzEsNyArNTc2LDcgQEAKIC8qIFdhaXQgdGlsbCBubyBtb3JlIHBlbmRpbmcgbWNjIHJlcXVlc3RzIGFyZSBwcmVzZW50ICovCiBzdGF0aWMgaW50IGJlX21jY193YWl0X2NvbXBsKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQogewotI2RlZmluZSBtY2NfdGltZW91dAkJMTIwMDAwIC8qIDEycyB0aW1lb3V0ICovCisjZGVmaW5lIG1jY190aW1lb3V0CQkxMjAwMCAvKiAxMnMgdGltZW91dCAqLwogCWludCBpLCBzdGF0dXMgPSAwOwogCXN0cnVjdCBiZV9tY2Nfb2JqICptY2Nfb2JqID0gJmFkYXB0ZXItPm1jY19vYmo7CiAKQEAgLTU4NSw3ICs1OTAsNyBAQAogCiAJCWlmIChhdG9taWNfcmVhZCgmbWNjX29iai0+cS51c2VkKSA9PSAwKQogCQkJYnJlYWs7Ci0JCXVkZWxheSgxMDApOworCQl1c2xlZXBfcmFuZ2UoNTAwLCAxMDAwKTsKIAl9CiAJaWYgKGkgPT0gbWNjX3RpbWVvdXQpIHsKIAkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiRlcgbm90IHJlc3BvbmRpbmdcbiIpOwpAQCAtNzA1LDcgKzcxMCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1MTYgYmVfUE9TVF9zdGFnZV9nZXQoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCit1MTYgYmVfUE9TVF9zdGFnZV9nZXQoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJdTMyIHNlbTsKIApAQCAtODYzLDcgKzg2OCw3IEBACiBzdGF0aWMgaW50IGJlX2NtZF9sb2NrKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQogewogCWlmICh1c2VfbWNjKGFkYXB0ZXIpKSB7Ci0JCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCQltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJCXJldHVybiAwOwogCX0gZWxzZSB7CiAJCXJldHVybiBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmFkYXB0ZXItPm1ib3hfbG9jayk7CkBAIC04NzQsNyArODc5LDcgQEAKIHN0YXRpYyB2b2lkIGJlX2NtZF91bmxvY2soc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJaWYgKHVzZV9tY2MoYWRhcHRlcikpCi0JCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJCXJldHVybiBtdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAllbHNlCiAJCXJldHVybiBtdXRleF91bmxvY2soJmFkYXB0ZXItPm1ib3hfbG9jayk7CiB9CkBAIC0xMDQ0LDcgKzEwNDksNyBAQAogCXN0cnVjdCBiZV9jbWRfcmVxX21hY19xdWVyeSAqcmVxOwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0xMDczLDcgKzEwNzgsNyBAQAogCX0KIAogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMTA4NSw3ICsxMDkwLDcgQEAKIAlzdHJ1Y3QgYmVfY21kX3JlcV9wbWFjX2FkZCAqcmVxOwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0xMTEwLDcgKzExMTUsNyBAQAogCX0KIAogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAkgaWYgKHN0YXR1cyA9PSBNQ0NfU1RBVFVTX1VOQVVUSE9SSVpFRF9SRVFVRVNUKQogCQlzdGF0dXMgPSAtRVBFUk07CkBAIC0xMTI4LDcgKzExMzMsNyBAQAogCWlmIChwbWFjX2lkID09IC0xKQogCQlyZXR1cm4gMDsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTExNDgsNyArMTE1Myw3IEBACiAJc3RhdHVzID0gYmVfbWNjX25vdGlmeV93YWl0KGFkYXB0ZXIpOwogCiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xNDExLDcgKzE0MTYsNyBAQAogCXN0cnVjdCBiZV9kbWFfbWVtICpxX21lbSA9ICZyeHEtPmRtYV9tZW07CiAJaW50IHN0YXR1czsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTE0NDEsNyArMTQ0Niw3IEBACiAJfQogCiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xNTA1LDcgKzE1MTAsNyBAQAogCXN0cnVjdCBiZV9jbWRfcmVxX3FfZGVzdHJveSAqcmVxOwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0xNTIyLDcgKzE1MjcsNyBAQAogCXEtPmNyZWF0ZWQgPSBmYWxzZTsKIAogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMTU5MCw3ICsxNTk1LDcgQEAKIAlzdHJ1Y3QgYmVfY21kX3JlcV9oZHIgKmhkcjsKIAlpbnQgc3RhdHVzID0gMDsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTE2MTgsNyArMTYyMyw3IEBACiAJYWRhcHRlci0+c3RhdHNfY21kX3NlbnQgPSB0cnVlOwogCiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xNjM0LDcgKzE2MzksNyBAQAogCQkJICAgIENNRF9TVUJTWVNURU1fRVRIKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTE2NTcsNyArMTY2Miw3IEBACiAJYWRhcHRlci0+c3RhdHNfY21kX3NlbnQgPSB0cnVlOwogCiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xNjk0LDcgKzE2OTksNyBAQAogCXN0cnVjdCBiZV9jbWRfcmVxX2xpbmtfc3RhdHVzICpyZXE7CiAJaW50IHN0YXR1czsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCWlmIChsaW5rX3N0YXR1cykKIAkJKmxpbmtfc3RhdHVzID0gTElOS19ET1dOOwpAQCAtMTczMyw3ICsxNzM4LDcgQEAKIAl9CiAKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE3NDQsNyArMTc0OSw3IEBACiAJc3RydWN0IGJlX2NtZF9yZXFfZ2V0X2NudGxfYWRkbmxfYXR0cmlicyAqcmVxOwogCWludCBzdGF0dXMgPSAwOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMTc1OSw3ICsxNzY0LDcgQEAKIAogCXN0YXR1cyA9IGJlX21jY19ub3RpZnkoYWRhcHRlcik7CiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xODA4LDcgKzE4MTMsNyBAQAogCWlmICghZ2V0X2ZhdF9jbWQudmEpCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd2hpbGUgKHRvdGFsX3NpemUpIHsKIAkJYnVmX3NpemUgPSBtaW4odG90YWxfc2l6ZSwgKHUzMik2MCoxMDI0KTsKQEAgLTE4NDgsNyArMTg1Myw3IEBACiBlcnI6CiAJZG1hX2ZyZWVfY29oZXJlbnQoJmFkYXB0ZXItPnBkZXYtPmRldiwgZ2V0X2ZhdF9jbWQuc2l6ZSwKIAkJCSAgZ2V0X2ZhdF9jbWQudmEsIGdldF9mYXRfY21kLmRtYSk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xODU5LDcgKzE4NjQsNyBAQAogCXN0cnVjdCBiZV9jbWRfcmVxX2dldF9md192ZXJzaW9uICpyZXE7CiAJaW50IHN0YXR1czsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTE4ODIsNyArMTg4Nyw3IEBACiAJCQlzaXplb2YoYWRhcHRlci0+Zndfb25fZmxhc2gpKTsKIAl9CiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xODk2LDcgKzE5MDEsNyBAQAogCXN0cnVjdCBiZV9jbWRfcmVxX21vZGlmeV9lcV9kZWxheSAqcmVxOwogCWludCBzdGF0dXMgPSAwLCBpOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMTkxOSw3ICsxOTI0LDcgQEAKIAogCXN0YXR1cyA9IGJlX21jY19ub3RpZnkoYWRhcHRlcik7CiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xOTQ2LDcgKzE5NTEsNyBAQAogCXN0cnVjdCBiZV9jbWRfcmVxX3ZsYW5fY29uZmlnICpyZXE7CiAJaW50IHN0YXR1czsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTE5NjgsNyArMTk3Myw3IEBACiAKIAlzdGF0dXMgPSBiZV9tY2Nfbm90aWZ5X3dhaXQoYWRhcHRlcik7CiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xOTc5LDcgKzE5ODQsNyBAQAogCXN0cnVjdCBiZV9jbWRfcmVxX3J4X2ZpbHRlciAqcmVxID0gbWVtLT52YTsKIAlpbnQgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMTk5Niw4ICsyMDAxLDcgQEAKIAlyZXEtPmlmX2ZsYWdzID0gKHZhbHVlID09IE9OKSA/IHJlcS0+aWZfZmxhZ3NfbWFzayA6IDA7CiAKIAlpZiAoZmxhZ3MgJiBCRV9JRl9GTEFHU19NVUxUSUNBU1QpIHsKLQkJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKLQkJaW50IGkgPSAwOworCQlpbnQgaTsKIAogCQkvKiBSZXNldCBtY2FzdCBwcm9taXNjIG1vZGUgaWYgYWxyZWFkeSBzZXQgYnkgc2V0dGluZyBtYXNrCiAJCSAqIGFuZCBub3Qgc2V0dGluZyBmbGFncyBmaWVsZApAQCAtMjAwNSwxNCArMjAwOSwxNSBAQAogCQlyZXEtPmlmX2ZsYWdzX21hc2sgfD0KIAkJCWNwdV90b19sZTMyKEJFX0lGX0ZMQUdTX01DQVNUX1BST01JU0NVT1VTICYKIAkJCQkgICAgYmVfaWZfY2FwX2ZsYWdzKGFkYXB0ZXIpKTsKLQkJcmVxLT5tY2FzdF9udW0gPSBjcHVfdG9fbGUzMihuZXRkZXZfbWNfY291bnQoYWRhcHRlci0+bmV0ZGV2KSk7Ci0JCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBhZGFwdGVyLT5uZXRkZXYpCi0JCQltZW1jcHkocmVxLT5tY2FzdF9tYWNbaSsrXS5ieXRlLCBoYS0+YWRkciwgRVRIX0FMRU4pOworCQlyZXEtPm1jYXN0X251bSA9IGNwdV90b19sZTMyKGFkYXB0ZXItPm1jX2NvdW50KTsKKwkJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm1jX2NvdW50OyBpKyspCisJCQlldGhlcl9hZGRyX2NvcHkocmVxLT5tY2FzdF9tYWNbaV0uYnl0ZSwKKwkJCQkJYWRhcHRlci0+bWNfbGlzdFtpXS5tYWMpOwogCX0KIAogCXN0YXR1cyA9IGJlX21jY19ub3RpZnlfd2FpdChhZGFwdGVyKTsKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTIwNDMsNyArMjA0OCw3IEBACiAJCQkgICAgQ01EX1NVQlNZU1RFTV9DT01NT04pKQogCQlyZXR1cm4gLUVQRVJNOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMjA2Myw3ICsyMDY4LDcgQEAKIAlzdGF0dXMgPSBiZV9tY2Nfbm90aWZ5X3dhaXQoYWRhcHRlcik7CiAKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJaWYgKGJhc2Vfc3RhdHVzKHN0YXR1cykgPT0gTUNDX1NUQVRVU19GRUFUVVJFX05PVF9TVVBQT1JURUQpCiAJCXJldHVybiAgLUVPUE5PVFNVUFA7CkBAIC0yMDgyLDcgKzIwODcsNyBAQAogCQkJICAgIENNRF9TVUJTWVNURU1fQ09NTU9OKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTIxMDUsNyArMjExMCw3IEBACiAJfQogCiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0yMTg2LDcgKzIxOTEsNyBAQAogCWlmICghKGJlX2lmX2NhcF9mbGFncyhhZGFwdGVyKSAmIEJFX0lGX0ZMQUdTX1JTUykpCiAJCXJldHVybiAwOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMjIxMSw3ICsyMjE2LDcgQEAKIAogCXN0YXR1cyA9IGJlX21jY19ub3RpZnlfd2FpdChhZGFwdGVyKTsKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTIyMjMsNyArMjIyOCw3IEBACiAJc3RydWN0IGJlX2NtZF9yZXFfZW5hYmxlX2Rpc2FibGVfYmVhY29uICpyZXE7CiAJaW50IHN0YXR1czsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTIyNDQsNyArMjI0OSw3IEBACiAJc3RhdHVzID0gYmVfbWNjX25vdGlmeV93YWl0KGFkYXB0ZXIpOwogCiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0yMjU1LDcgKzIyNjAsNyBAQAogCXN0cnVjdCBiZV9jbWRfcmVxX2dldF9iZWFjb25fc3RhdGUgKnJlcTsKIAlpbnQgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMjI3OSw3ICsyMjg0LDcgQEAKIAl9CiAKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTIzMDMsNyArMjMwOCw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTIzMjUsNyArMjMzMCw3IEBACiAJCW1lbWNweShkYXRhLCByZXNwLT5wYWdlX2RhdGEsIFBBR0VfREFUQV9MRU4pOwogCX0KIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCWRtYV9mcmVlX2NvaGVyZW50KCZhZGFwdGVyLT5wZGV2LT5kZXYsIGNtZC5zaXplLCBjbWQudmEsIGNtZC5kbWEpOwogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0yMzQyLDcgKzIzNDcsNyBAQAogCXZvaWQgKmN0eHQgPSBOVUxMOwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJYWRhcHRlci0+Zmxhc2hfc3RhdHVzID0gMDsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CkBAIC0yMzg0LDcgKzIzODksNyBAQAogCWlmIChzdGF0dXMpCiAJCWdvdG8gZXJyX3VubG9jazsKIAotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmYWRhcHRlci0+ZXRfY21kX2NvbXBsLAogCQkJCQkgbXNlY3NfdG9famlmZmllcyg2MDAwMCkpKQpAQCAtMjQwMyw3ICsyNDA4LDcgQEAKIAlyZXR1cm4gc3RhdHVzOwogCiBlcnJfdW5sb2NrOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMjQ1Nyw3ICsyNDYyLDcgQEAKIAlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiOwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0yNDc1LDcgKzI0ODAsNyBAQAogCiAJc3RhdHVzID0gYmVfbWNjX25vdGlmeV93YWl0KGFkYXB0ZXIpOwogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMjQ4OCw3ICsyNDkzLDcgQEAKIAlzdHJ1Y3QgbGFuY2VyX2NtZF9yZXNwX3JlYWRfb2JqZWN0ICpyZXNwOwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0yNTIyLDcgKzI1MjcsNyBAQAogCX0KIAogZXJyX3VubG9jazoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTI1MzQsNyArMjUzOSw3IEBACiAJc3RydWN0IGJlX2NtZF93cml0ZV9mbGFzaHJvbSAqcmVxOwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJYWRhcHRlci0+Zmxhc2hfc3RhdHVzID0gMDsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CkBAIC0yNTU5LDcgKzI1NjQsNyBAQAogCWlmIChzdGF0dXMpCiAJCWdvdG8gZXJyX3VubG9jazsKIAotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmYWRhcHRlci0+ZXRfY21kX2NvbXBsLAogCQkJCQkgbXNlY3NfdG9famlmZmllcyg0MDAwMCkpKQpAQCAtMjU3MCw3ICsyNTc1LDcgQEAKIAlyZXR1cm4gc3RhdHVzOwogCiBlcnJfdW5sb2NrOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMjU4MSw3ICsyNTg2LDcgQEAKIAlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiOwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0yNjA4LDcgKzI2MTMsNyBAQAogCQltZW1jcHkoZmxhc2hlZF9jcmMsIHJlcS0+Y3JjLCA0KTsKIAogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMzE5Miw3ICszMTk3LDcgQEAKIAlzdHJ1Y3QgYmVfY21kX3JlcV9hY3BpX3dvbF9tYWdpY19jb25maWcgKnJlcTsKIAlpbnQgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMzIwOSw3ICszMjE0LDcgQEAKIAlzdGF0dXMgPSBiZV9tY2Nfbm90aWZ5X3dhaXQoYWRhcHRlcik7CiAKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTMyMjQsNyArMzIyOSw3IEBACiAJCQkgICAgQ01EX1NVQlNZU1RFTV9MT1dMRVZFTCkpCiAJCXJldHVybiAtRVBFUk07CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0zMjQ3LDcgKzMyNTIsNyBAQAogCWlmIChzdGF0dXMpCiAJCWdvdG8gZXJyX3VubG9jazsKIAotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmYWRhcHRlci0+ZXRfY21kX2NvbXBsLAogCQkJCQkgbXNlY3NfdG9famlmZmllcyhTRVRfTEJfTU9ERV9USU1FT1VUKSkpCkBAIC0zMjU2LDcgKzMyNjEsNyBAQAogCXJldHVybiBzdGF0dXM7CiAKIGVycl91bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0zMjczLDcgKzMyNzgsNyBAQAogCQkJICAgIENNRF9TVUJTWVNURU1fTE9XTEVWRUwpKQogCQlyZXR1cm4gLUVQRVJNOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMzI5OSw3ICszMzA0LDcgQEAKIAlpZiAoc3RhdHVzKQogCQlnb3RvIGVycjsKIAotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZhZGFwdGVyLT5ldF9jbWRfY29tcGwpOwogCXJlc3AgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7CkBAIC0zMzA3LDcgKzMzMTIsNyBAQAogCiAJcmV0dXJuIHN0YXR1czsKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTMzMjMsNyArMzMyOCw3IEBACiAJCQkgICAgQ01EX1NVQlNZU1RFTV9MT1dMRVZFTCkpCiAJCXJldHVybiAtRVBFUk07CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0zMzU3LDcgKzMzNjIsNyBAQAogCX0KIAogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMzM2OCw3ICszMzczLDcgQEAKIAlzdHJ1Y3QgYmVfY21kX3JlcV9zZWVwcm9tX3JlYWQgKnJlcTsKIAlpbnQgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMzM4NCw3ICszMzg5LDcgQEAKIAlzdGF0dXMgPSBiZV9tY2Nfbm90aWZ5X3dhaXQoYWRhcHRlcik7CiAKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTMzOTksNyArMzQwNCw3IEBACiAJCQkgICAgQ01EX1NVQlNZU1RFTV9DT01NT04pKQogCQlyZXR1cm4gLUVQRVJNOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMzQ0NCw3ICszNDQ5LDcgQEAKIAl9CiAJZG1hX2ZyZWVfY29oZXJlbnQoJmFkYXB0ZXItPnBkZXYtPmRldiwgY21kLnNpemUsIGNtZC52YSwgY21kLmRtYSk7CiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0zNDU0LDcgKzM0NTksNyBAQAogCXN0cnVjdCBiZV9jbWRfcmVxX3NldF9xb3MgKnJlcTsKIAlpbnQgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMzQ3NCw3ICszNDc5LDcgQEAKIAlzdGF0dXMgPSBiZV9tY2Nfbm90aWZ5X3dhaXQoYWRhcHRlcik7CiAKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTM1ODEsNyArMzU4Niw3IEBACiAJc3RydWN0IGJlX2NtZF9yZXFfZ2V0X2ZuX3ByaXZpbGVnZXMgKnJlcTsKIAlpbnQgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMzYxMyw3ICszNjE4LDcgQEAKIAl9CiAKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTM2MjUsNyArMzYzMCw3IEBACiAJc3RydWN0IGJlX2NtZF9yZXFfc2V0X2ZuX3ByaXZpbGVnZXMgKnJlcTsKIAlpbnQgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMzY0NSw3ICszNjUwLDcgQEAKIAogCXN0YXR1cyA9IGJlX21jY19ub3RpZnlfd2FpdChhZGFwdGVyKTsKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTM2NzcsNyArMzY4Miw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTM3NDEsNyArMzc0Niw3IEBACiAJfQogCiBvdXQ6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlkbWFfZnJlZV9jb2hlcmVudCgmYWRhcHRlci0+cGRldi0+ZGV2LCBnZXRfbWFjX2xpc3RfY21kLnNpemUsCiAJCQkgIGdldF9tYWNfbGlzdF9jbWQudmEsIGdldF9tYWNfbGlzdF9jbWQuZG1hKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMzgwMSw3ICszODA2LDcgQEAKIAlpZiAoIWNtZC52YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0zODIzLDcgKzM4MjgsNyBAQAogCiBlcnI6CiAJZG1hX2ZyZWVfY29oZXJlbnQoJmFkYXB0ZXItPnBkZXYtPmRldiwgY21kLnNpemUsIGNtZC52YSwgY21kLmRtYSk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0zODU5LDcgKzM4NjQsNyBAQAogCQkJICAgIENNRF9TVUJTWVNURU1fQ09NTU9OKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTM5MDAsNyArMzkwNSw3IEBACiAJc3RhdHVzID0gYmVfbWNjX25vdGlmeV93YWl0KGFkYXB0ZXIpOwogCiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0zOTE0LDcgKzM5MTksNyBAQAogCWludCBzdGF0dXM7CiAJdTE2IHZpZDsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTM5NjEsNyArMzk2Niw3IEBACiAJfQogCiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC00MTI3LDYgKzQxMzIsMTAgQEAKIAlzdHJ1Y3QgYmVfY21kX3JlcV9nZXRfZXh0X2ZhdF9jYXBzICpyZXE7CiAJaW50IHN0YXR1czsKIAorCWlmICghYmVfY21kX2FsbG93ZWQoYWRhcHRlciwgT1BDT0RFX0NPTU1PTl9HRVRfRVhUX0ZBVF9DQVBBQklMSVRJRVMsCisJCQkgICAgQ01EX1NVQlNZU1RFTV9DT01NT04pKQorCQlyZXR1cm4gLUVQRVJNOworCiAJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmYWRhcHRlci0+bWJveF9sb2NrKSkKIAkJcmV0dXJuIC0xOwogCkBAIC00MTM4LDcgKzQxNDcsNyBAQAogCiAJcmVxID0gY21kLT52YTsKIAliZV93cmJfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9DT01NT04sCi0JCQkgICAgICAgT1BDT0RFX0NPTU1PTl9HRVRfRVhUX0ZBVF9DQVBBQklMSVRFUywKKwkJCSAgICAgICBPUENPREVfQ09NTU9OX0dFVF9FWFRfRkFUX0NBUEFCSUxJVElFUywKIAkJCSAgICAgICBjbWQtPnNpemUsIHdyYiwgY21kKTsKIAlyZXEtPnBhcmFtZXRlcl90eXBlID0gY3B1X3RvX2xlMzIoMSk7CiAKQEAgLTQxNTYsNyArNDE2NSw3IEBACiAJc3RydWN0IGJlX2NtZF9yZXFfc2V0X2V4dF9mYXRfY2FwcyAqcmVxOwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC00MTY3LDEyICs0MTc2LDEyIEBACiAJcmVxID0gY21kLT52YTsKIAltZW1jcHkoJnJlcS0+c2V0X3BhcmFtcywgY29uZmlncywgc2l6ZW9mKHN0cnVjdCBiZV9mYXRfY29uZl9wYXJhbXMpKTsKIAliZV93cmJfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9DT01NT04sCi0JCQkgICAgICAgT1BDT0RFX0NPTU1PTl9TRVRfRVhUX0ZBVF9DQVBBQklMSVRFUywKKwkJCSAgICAgICBPUENPREVfQ09NTU9OX1NFVF9FWFRfRkFUX0NBUEFCSUxJVElFUywKIAkJCSAgICAgICBjbWQtPnNpemUsIHdyYiwgY21kKTsKIAogCXN0YXR1cyA9IGJlX21jY19ub3RpZnlfd2FpdChhZGFwdGVyKTsKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTQzNzMsNyArNDM4Miw3IEBACiB9CiAKIC8qIFRoaXMgcm91dGluZSByZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIE5JQyBQRl9udW1zIGluIHRoZSBhZGFwdGVyICovCi11MTYgYmVfZ2V0X25pY19wZl9udW1fbGlzdCh1OCAqYnVmLCB1MzIgZGVzY19jb3VudCwgdTE2ICpuaWNfcGZfbnVtcykKK3N0YXRpYyB1MTYgYmVfZ2V0X25pY19wZl9udW1fbGlzdCh1OCAqYnVmLCB1MzIgZGVzY19jb3VudCwgdTE2ICpuaWNfcGZfbnVtcykKIHsKIAlzdHJ1Y3QgYmVfcmVzX2Rlc2NfaGRyICpoZHIgPSAoc3RydWN0IGJlX3Jlc19kZXNjX2hkciAqKWJ1ZjsKIAlzdHJ1Y3QgYmVfcGNpZV9yZXNfZGVzYyAqcGNpZSA9IE5VTEw7CkBAIC00NTI1LDcgKzQ1MzQsNyBAQAogfQogCiAvKiBNYXJrIGFsbCBmaWVsZHMgaW52YWxpZCAqLwotdm9pZCBiZV9yZXNldF9uaWNfZGVzYyhzdHJ1Y3QgYmVfbmljX3Jlc19kZXNjICpuaWMpCitzdGF0aWMgdm9pZCBiZV9yZXNldF9uaWNfZGVzYyhzdHJ1Y3QgYmVfbmljX3Jlc19kZXNjICpuaWMpCiB7CiAJbWVtc2V0KG5pYywgMCwgc2l6ZW9mKCpuaWMpKTsKIAluaWMtPnVuaWNhc3RfbWFjX2NvdW50ID0gMHhGRkZGOwpAQCAtNDY1MCw3ICs0NjU5LDcgQEAKIAlpZiAoaWZhY2UgPT0gMHhGRkZGRkZGRikKIAkJcmV0dXJuIC0xOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtNDY2Nyw3ICs0Njc2LDcgQEAKIAogCXN0YXR1cyA9IGJlX21jY19ub3RpZnlfd2FpdChhZGFwdGVyKTsKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTQ3MDEsNyArNDcxMCw3IEBACiAJc3RydWN0IGJlX2NtZF9yZXNwX2dldF9pZmFjZV9saXN0ICpyZXNwOwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC00NzIyLDcgKzQ3MzEsNyBAQAogCX0KIAogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtNDgxNiw3ICs0ODI1LDcgQEAKIAlpZiAoQkV4X2NoaXAoYWRhcHRlcikpCiAJCXJldHVybiAwOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtNDgzNCw3ICs0ODQzLDcgQEAKIAlyZXEtPmVuYWJsZSA9IDE7CiAJc3RhdHVzID0gYmVfbWNjX25vdGlmeV93YWl0KGFkYXB0ZXIpOwogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtNDg5OCwxNCArNDkwNywxNSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLWludCBfX2JlX2NtZF9zZXRfbG9naWNhbF9saW5rX2NvbmZpZyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKLQkJCQkgICAgIGludCBsaW5rX3N0YXRlLCBpbnQgdmVyc2lvbiwgdTggZG9tYWluKQorc3RhdGljIGludAorX19iZV9jbWRfc2V0X2xvZ2ljYWxfbGlua19jb25maWcoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJIGludCBsaW5rX3N0YXRlLCBpbnQgdmVyc2lvbiwgdTggZG9tYWluKQogewogCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmI7CiAJc3RydWN0IGJlX2NtZF9yZXFfc2V0X2xsX2xpbmsgKnJlcTsKIAlpbnQgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtNDkzMSw3ICs0OTQxLDcgQEAKIAogCXN0YXR1cyA9IGJlX21jY19ub3RpZnlfd2FpdChhZGFwdGVyKTsKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTQ5NTQsNiArNDk2NCw1NyBAQAogCQkJCQkJCSAgMSwgZG9tYWluKTsKIAlyZXR1cm4gc3RhdHVzOwogfQorCitpbnQgYmVfY21kX3NldF9mZWF0dXJlcyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgYmVfY21kX3Jlc3Bfc2V0X2ZlYXR1cmVzICpyZXNwOworCXN0cnVjdCBiZV9jbWRfcmVxX3NldF9mZWF0dXJlcyAqcmVxOworCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmI7CisJaW50IHN0YXR1czsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmFkYXB0ZXItPm1jY19sb2NrKSkKKwkJcmV0dXJuIC0xOworCisJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKKwlpZiAoIXdyYikgeworCQlzdGF0dXMgPSAtRUJVU1k7CisJCWdvdG8gZXJyOworCX0KKworCXJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKKworCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKKwkJCSAgICAgICBPUENPREVfQ09NTU9OX1NFVF9GRUFUVVJFUywKKwkJCSAgICAgICBzaXplb2YoKnJlcSksIHdyYiwgTlVMTCk7CisKKwlyZXEtPmZlYXR1cmVzID0gY3B1X3RvX2xlMzIoQkVfRkVBVFVSRV9VRV9SRUNPVkVSWSk7CisJcmVxLT5wYXJhbWV0ZXJfbGVuID0gY3B1X3RvX2xlMzIoc2l6ZW9mKHN0cnVjdCBiZV9yZXFfdWVfcmVjb3ZlcnkpKTsKKwlyZXEtPnBhcmFtZXRlci5yZXEudWVyID0gY3B1X3RvX2xlMzIoQkVfVUVfUkVDT1ZFUllfVUVSX01BU0spOworCisJc3RhdHVzID0gYmVfbWNjX25vdGlmeV93YWl0KGFkYXB0ZXIpOworCWlmIChzdGF0dXMpCisJCWdvdG8gZXJyOworCisJcmVzcCA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKKworCWFkYXB0ZXItPmVycm9yX3JlY292ZXJ5LnVlX3RvX3BvbGxfdGltZSA9CisJCWxlMTZfdG9fY3B1KHJlc3AtPnBhcmFtZXRlci5yZXNwLnVlMnJwKTsKKwlhZGFwdGVyLT5lcnJvcl9yZWNvdmVyeS51ZV90b19yZXNldF90aW1lID0KKwkJbGUxNl90b19jcHUocmVzcC0+cGFyYW1ldGVyLnJlc3AudWUyc3IpOworCWFkYXB0ZXItPmVycm9yX3JlY292ZXJ5LnJlY292ZXJ5X3N1cHBvcnRlZCA9IHRydWU7CitlcnI6CisJLyogQ2hlY2tpbmcgIk1DQ19TVEFUVVNfSU5WQUxJRF9MRU5HVEgiIGZvciBTS0ggYXMgRlcKKwkgKiByZXR1cm5zIHRoaXMgZXJyb3IgaW4gb2xkZXIgZmlybXdhcmUgdmVyc2lvbnMKKwkgKi8KKwlpZiAoYmFzZV9zdGF0dXMoc3RhdHVzKSA9PSBNQ0NfU1RBVFVTX0lMTEVHQUxfUkVRVUVTVCB8fAorCSAgICBiYXNlX3N0YXR1cyhzdGF0dXMpID09IE1DQ19TVEFUVVNfSU5WQUxJRF9MRU5HVEgpCisJCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkgIkFkYXB0ZXIgZG9lcyBub3Qgc3VwcG9ydCBIVyBlcnJvciByZWNvdmVyeVxuIik7CisKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCiBpbnQgYmVfcm9jZV9tY2NfY21kKHZvaWQgKm5ldGRldl9oYW5kbGUsIHZvaWQgKndyYl9wYXlsb2FkLAogCQkgICAgaW50IHdyYl9wYXlsb2FkX3NpemUsIHUxNiAqY21kX3N0YXR1cywgdTE2ICpleHRfc3RhdHVzKQogewpAQCAtNDk2NCw3ICs1MDI1LDcgQEAKIAlzdHJ1Y3QgYmVfY21kX3Jlc3BfaGRyICpyZXNwOwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC00OTg3LDcgKzUwNDgsNyBAQAogCW1lbWNweSh3cmJfcGF5bG9hZCwgcmVzcCwgc2l6ZW9mKCpyZXNwKSArIHJlc3AtPnJlc3BvbnNlX2xlbmd0aCk7CiAJYmVfZHdzX2xlX3RvX2NwdSh3cmJfcGF5bG9hZCwgc2l6ZW9mKCpyZXNwKSArIHJlc3AtPnJlc3BvbnNlX2xlbmd0aCk7CiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogRVhQT1JUX1NZTUJPTChiZV9yb2NlX21jY19jbWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2NtZHMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9jbWRzLmgKaW5kZXggMGQ2YmUyMi4uMWJkODJiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2NtZHMuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfY21kcy5oCkBAIC01OCw3ICs1OCw4IEBACiAJTUNDX1NUQVRVU19JTlNVRkZJQ0lFTlRfQlVGRkVSID0gNCwKIAlNQ0NfU1RBVFVTX1VOQVVUSE9SSVpFRF9SRVFVRVNUID0gNSwKIAlNQ0NfU1RBVFVTX05PVF9TVVBQT1JURUQgPSA2NiwKLQlNQ0NfU1RBVFVTX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCA9IDY4CisJTUNDX1NUQVRVU19GRUFUVVJFX05PVF9TVVBQT1JURUQgPSA2OCwKKwlNQ0NfU1RBVFVTX0lOVkFMSURfTEVOR1RIID0gMTE2CiB9OwogCiAvKiBBZGRpdGlvbmFsIHN0YXR1cyAqLwpAQCAtMjk0LDggKzI5NSw4IEBACiAjZGVmaW5lIE9QQ09ERV9DT01NT05fR0VUX1BIWV9ERVRBSUxTCQkJMTAyCiAjZGVmaW5lIE9QQ09ERV9DT01NT05fU0VUX0RSSVZFUl9GVU5DVElPTl9DQVAJCTEwMwogI2RlZmluZSBPUENPREVfQ09NTU9OX0dFVF9DTlRMX0FERElUSU9OQUxfQVRUUklCVVRFUwkxMjEKLSNkZWZpbmUgT1BDT0RFX0NPTU1PTl9HRVRfRVhUX0ZBVF9DQVBBQklMSVRFUwkJMTI1Ci0jZGVmaW5lIE9QQ09ERV9DT01NT05fU0VUX0VYVF9GQVRfQ0FQQUJJTElURVMJCTEyNgorI2RlZmluZSBPUENPREVfQ09NTU9OX0dFVF9FWFRfRkFUX0NBUEFCSUxJVElFUwkJMTI1CisjZGVmaW5lIE9QQ09ERV9DT01NT05fU0VUX0VYVF9GQVRfQ0FQQUJJTElUSUVTCQkxMjYKICNkZWZpbmUgT1BDT0RFX0NPTU1PTl9HRVRfTUFDX0xJU1QJCQkxNDcKICNkZWZpbmUgT1BDT0RFX0NPTU1PTl9TRVRfTUFDX0xJU1QJCQkxNDgKICNkZWZpbmUgT1BDT0RFX0NPTU1PTl9HRVRfSFNXX0NPTkZJRwkJCTE1MgpAQCAtMzA4LDYgKzMwOSw3IEBACiAjZGVmaW5lIE9QQ09ERV9DT01NT05fUkVBRF9PQkpFQ1QJCQkxNzEKICNkZWZpbmUgT1BDT0RFX0NPTU1PTl9XUklURV9PQkpFQ1QJCQkxNzIKICNkZWZpbmUgT1BDT0RFX0NPTU1PTl9ERUxFVEVfT0JKRUNUCQkJMTc0CisjZGVmaW5lIE9QQ09ERV9DT01NT05fU0VUX0ZFQVRVUkVTCQkJMTkxCiAjZGVmaW5lIE9QQ09ERV9DT01NT05fTUFOQUdFX0lGQUNFX0ZJTFRFUlMJCTE5MwogI2RlZmluZSBPUENPREVfQ09NTU9OX0dFVF9JRkFDRV9MSVNUCQkJMTk0CiAjZGVmaW5lIE9QQ09ERV9DT01NT05fRU5BQkxFX0RJU0FCTEVfVkYJCQkxOTYKQEAgLTIzMTUsNiArMjMxNyw0MSBAQAogCXN0cnVjdCBiZV9pZl9kZXNjIGlmX2Rlc2M7CiB9OwogCisvKioqKioqKioqKioqKiogU2V0IEZlYXR1cmVzICoqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lCUJFX0ZFQVRVUkVfVUVfUkVDT1ZFUlkJCTB4MTAKKyNkZWZpbmUJQkVfVUVfUkVDT1ZFUllfVUVSX01BU0sJCTB4MQorCitzdHJ1Y3QgYmVfcmVxX3VlX3JlY292ZXJ5IHsKKwl1MzIJdWVyOworCXUzMglyc3ZkOworfTsKKworc3RydWN0IGJlX2NtZF9yZXFfc2V0X2ZlYXR1cmVzIHsKKwlzdHJ1Y3QgYmVfY21kX3JlcV9oZHIgaGRyOworCXUzMiBmZWF0dXJlczsKKwl1MzIgcGFyYW1ldGVyX2xlbjsKKwl1bmlvbiB7CisJCXN0cnVjdCBiZV9yZXFfdWVfcmVjb3ZlcnkgcmVxOworCQl1MzIgcnN2ZFsyXTsKKwl9IHBhcmFtZXRlcjsKK307CisKK3N0cnVjdCBiZV9yZXNwX3VlX3JlY292ZXJ5IHsKKwl1MzIgdWVyOworCXUxNiB1ZTJycDsKKwl1MTYgdWUyc3I7Cit9OworCitzdHJ1Y3QgYmVfY21kX3Jlc3Bfc2V0X2ZlYXR1cmVzIHsKKwlzdHJ1Y3QgYmVfY21kX3Jlc3BfaGRyIGhkcjsKKwl1MzIgZmVhdHVyZXM7CisJdTMyIHBhcmFtZXRlcl9sZW47CisJdW5pb24geworCQlzdHJ1Y3QgYmVfcmVzcF91ZV9yZWNvdmVyeSByZXNwOworCQl1MzIgcnN2ZFsyXTsKKwl9IHBhcmFtZXRlcjsKK307CisKIC8qKioqKioqKioqKioqKiogU2V0IGxvZ2ljYWwgbGluayAqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgUExJTktfRU5BQkxFICAgICAgICAgICAgQklUKDApCiAjZGVmaW5lIFBMSU5LX1RSQUNLICAgICAgICAgICAgIEJJVCg4KQpAQCAtMjM0Myw2ICsyMzgwLDcgQEAKIAl1MzIgY2FwX2NvbnRyb2xfZmxhZ3M7CiB9IF9fcGFja2VkOwogCit1MTYgYmVfUE9TVF9zdGFnZV9nZXQoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpOwogaW50IGJlX3BjaV9mbnVtX2dldChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcik7CiBpbnQgYmVfZndfd2FpdF9yZWFkeShzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcik7CiBpbnQgYmVfY21kX21hY19hZGRyX3F1ZXJ5KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1OCAqbWFjX2FkZHIsCkBAIC0yNDcwLDMgKzI1MDgsNCBAQAogaW50IGJlX2NtZF9zZXRfc3Jpb3ZfY29uZmlnKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAogCQkJICAgIHN0cnVjdCBiZV9yZXNvdXJjZXMgcmVzLCB1MTYgbnVtX3ZmcywKIAkJCSAgICBzdHJ1Y3QgYmVfcmVzb3VyY2VzICp2ZnRfcmVzKTsKK2ludCBiZV9jbWRfc2V0X2ZlYXR1cmVzKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfZXRodG9vbC5jCmluZGV4IDUwZTdiZTUuLjBhNDhhMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2V0aHRvb2wuYwpAQCAtNDIxLDYgKzQyMSwxMCBAQAogCX0KIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgYmVfcHJpdl9mbGFnc1tdW0VUSF9HU1RSSU5HX0xFTl0gPSB7CisJImRpc2FibGUtdHBlLXJlY292ZXJ5IgorfTsKKwogc3RhdGljIHZvaWQgYmVfZ2V0X3N0YXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1aW50MzJfdCBzdHJpbmdzZXQsCiAJCQkJdWludDhfdCAqZGF0YSkKIHsKQEAgLTQ1NCw2ICs0NTgsMTAgQEAKIAkJCWRhdGEgKz0gRVRIX0dTVFJJTkdfTEVOOwogCQl9CiAJCWJyZWFrOworCWNhc2UgRVRIX1NTX1BSSVZfRkxBR1M6CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJlX3ByaXZfZmxhZ3MpOyBpKyspCisJCQlzdHJjcHkoZGF0YSArIGkgKiBFVEhfR1NUUklOR19MRU4sIGJlX3ByaXZfZmxhZ3NbaV0pOworCQlicmVhazsKIAl9CiB9CiAKQEAgLTQ2OCw2ICs0NzYsOCBAQAogCQlyZXR1cm4gRVRIVE9PTF9TVEFUU19OVU0gKwogCQkJYWRhcHRlci0+bnVtX3J4X3FzICogRVRIVE9PTF9SWFNUQVRTX05VTSArCiAJCQlhZGFwdGVyLT5udW1fdHhfcXMgKiBFVEhUT09MX1RYU1RBVFNfTlVNOworCWNhc2UgRVRIX1NTX1BSSVZfRkxBR1M6CisJCXJldHVybiBBUlJBWV9TSVpFKGJlX3ByaXZfZmxhZ3MpOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTEzNjAsNiArMTM3MCwzNCBAQAogCXJldHVybiBiZV9jbWRfc3RhdHVzKHN0YXR1cyk7CiB9CiAKK3N0YXRpYyB1MzIgYmVfZ2V0X3ByaXZfZmxhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlyZXR1cm4gYWRhcHRlci0+cHJpdl9mbGFnczsKK30KKworc3RhdGljIGludCBiZV9zZXRfcHJpdl9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZmxhZ3MpCit7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWJvb2wgdHBlX29sZCA9ICEhKGFkYXB0ZXItPnByaXZfZmxhZ3MgJiBCRV9ESVNBQkxFX1RQRV9SRUNPVkVSWSk7CisJYm9vbCB0cGVfbmV3ID0gISEoZmxhZ3MgJiBCRV9ESVNBQkxFX1RQRV9SRUNPVkVSWSk7CisKKwlpZiAodHBlX29sZCAhPSB0cGVfbmV3KSB7CisJCWlmICh0cGVfbmV3KSB7CisJCQlhZGFwdGVyLT5wcml2X2ZsYWdzIHw9IEJFX0RJU0FCTEVfVFBFX1JFQ09WRVJZOworCQkJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkgIkhXIGVycm9yIHJlY292ZXJ5IGlzIGRpc2FibGVkXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWFkYXB0ZXItPnByaXZfZmxhZ3MgJj0gfkJFX0RJU0FCTEVfVFBFX1JFQ09WRVJZOworCQkJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkgIkhXIGVycm9yIHJlY292ZXJ5IGlzIGVuYWJsZWRcbiIpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBiZV9ldGh0b29sX29wcyA9IHsKIAkuZ2V0X3NldHRpbmdzID0gYmVfZ2V0X3NldHRpbmdzLAogCS5nZXRfZHJ2aW5mbyA9IGJlX2dldF9kcnZpbmZvLApAQCAtMTM3Myw2ICsxNDExLDggQEAKIAkuZ2V0X3JpbmdwYXJhbSA9IGJlX2dldF9yaW5ncGFyYW0sCiAJLmdldF9wYXVzZXBhcmFtID0gYmVfZ2V0X3BhdXNlcGFyYW0sCiAJLnNldF9wYXVzZXBhcmFtID0gYmVfc2V0X3BhdXNlcGFyYW0sCisJLnNldF9wcml2X2ZsYWdzID0gYmVfc2V0X3ByaXZfZmxhZ3MsCisJLmdldF9wcml2X2ZsYWdzID0gYmVfZ2V0X3ByaXZfZmxhZ3MsCiAJLmdldF9zdHJpbmdzID0gYmVfZ2V0X3N0YXRfc3RyaW5ncywKIAkuc2V0X3BoeXNfaWQgPSBiZV9zZXRfcGh5c19pZCwKIAkuc2V0X2R1bXAgPSBiZV9zZXRfZHVtcCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9ody5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2h3LmgKaW5kZXggYzY4NGJiMy4uOTI5NDJjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2h3LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2h3LmgKQEAgLTMyLDE4ICszMiwyMyBAQAogI2RlZmluZSBNUFVfRVBfQ09OVFJPTCAJCTAKIAogLyoqKioqKioqKiogTVBVIHNlbXBob3JlOiB1c2VkIGZvciBTSCAmIEJFICAqKioqKioqKioqKioqLworI2RlZmluZSBTTElQT1JUX1NPRlRSRVNFVF9PRkZTRVQJCTB4NWMJLyogQ1NSIEJBUiBvZmZzZXQgKi8KICNkZWZpbmUgU0xJUE9SVF9TRU1BUEhPUkVfT0ZGU0VUX0JFeAkJMHhhYyAgLyogQ1NSIEJBUiBvZmZzZXQgKi8KICNkZWZpbmUgU0xJUE9SVF9TRU1BUEhPUkVfT0ZGU0VUX1NICQkweDk0ICAvKiBQQ0ktQ0ZHIG9mZnNldCAqLwogI2RlZmluZSBQT1NUX1NUQUdFX01BU0sJCQkJMHgwMDAwRkZGRgogI2RlZmluZSBQT1NUX0VSUl9NQVNLCQkJCTB4MQogI2RlZmluZSBQT1NUX0VSUl9TSElGVAkJCQkzMQorI2RlZmluZSBQT1NUX0VSUl9SRUNPVkVSWV9DT0RFX01BU0sJCTB4RkZGCisKKy8qIFNvZnQgUmVzZXQgcmVnaXN0ZXIgbWFza3MgKi8KKyNkZWZpbmUgU0xJUE9SVF9TT0ZUUkVTRVRfU1JfTUFTSwkJMHgwMDAwMDA4MAkvKiBTUiBiaXQgKi8KIAogLyogTVBVIHNlbXBob3JlIFBPU1Qgc3RhZ2UgdmFsdWVzICovCiAjZGVmaW5lIFBPU1RfU1RBR0VfQVdBSVRJTkdfSE9TVF9SRFkgCTB4MSAvKiBGVyBhd2FpdGluZyBnb2FoZWFkIGZyb20gaG9zdCAqLwogI2RlZmluZSBQT1NUX1NUQUdFX0hPU1RfUkRZIAkJMHgyIC8qIEhvc3QgaGFzIGdpdmVuIGdvLWFoZWQgdG8gRlcgKi8KICNkZWZpbmUgUE9TVF9TVEFHRV9CRV9SRVNFVAkJMHgzIC8qIEhvc3Qgd2FudHMgdG8gcmVzZXQgY2hpcCAqLwogI2RlZmluZSBQT1NUX1NUQUdFX0FSTUZXX1JEWQkJMHhjMDAwCS8qIEZXIGlzIGRvbmUgd2l0aCBQT1NUICovCi0KKyNkZWZpbmUgUE9TVF9TVEFHRV9SRUNPVkVSQUJMRV9FUlIJMHhFMDAwCS8qIFJlY292ZXJhYmxlIGVyciBkZXRlY3RlZCAqLwogCiAvKiBMYW5jZXIgU0xJUE9SVCByZWdpc3RlcnMgKi8KICNkZWZpbmUgU0xJUE9SVF9TVEFUVVNfT0ZGU0VUCQkweDQwNApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9tYWluLmMKaW5kZXggODc0Yzc1My4uZGNiOTMwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfbWFpbi5jCkBAIC00MSw2ICs0MSwxMSBAQAogbW9kdWxlX3BhcmFtKHJ4X2ZyYWdfc2l6ZSwgdXNob3J0LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MocnhfZnJhZ19zaXplLCAiU2l6ZSBvZiBhIGZyYWdtZW50IHRoYXQgaG9sZHMgcmN2ZCBkYXRhLiIpOwogCisvKiBQZXItbW9kdWxlIGVycm9yIGRldGVjdGlvbi9yZWNvdmVyeSB3b3JrcSBzaGFyZWQgYWNyb3NzIGFsbCBmdW5jdGlvbnMuCisgKiBFYWNoIGZ1bmN0aW9uIHNjaGVkdWxlcyBpdHMgb3duIHdvcmsgcmVxdWVzdCBvbiB0aGlzIHNoYXJlZCB3b3JrcS4KKyAqLworc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpiZV9lcnJfcmVjb3Zlcnlfd29ya3E7CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBiZV9kZXZfaWRzW10gPSB7CiAJeyBQQ0lfREVWSUNFKEJFX1ZFTkRPUl9JRCwgQkVfREVWSUNFX0lEMSkgfSwKIAl7IFBDSV9ERVZJQ0UoQkVfVkVORE9SX0lELCBCRV9ERVZJQ0VfSUQyKSB9LApAQCAtNTMsNiArNTgsMTAgQEAKIAl7IDAgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBiZV9kZXZfaWRzKTsKKworLyogV29ya3F1ZXVlIHVzZWQgYnkgYWxsIGZ1bmN0aW9ucyBmb3IgZGVmZXJpbmcgY21kIGNhbGxzIHRvIHRoZSBhZGFwdGVyICovCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmJlX3dxOworCiAvKiBVRSBTdGF0dXMgTG93IENTUiAqLwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1ZV9zdGF0dXNfbG93X2Rlc2NbXSA9IHsKIAkiQ0VWIiwKQEAgLTI2MCw2ICsyNjksMzggQEAKIAlpb3dyaXRlMzIodmFsLCBhZGFwdGVyLT5kYiArIERCX0NRX09GRlNFVCk7CiB9CiAKK3N0YXRpYyBpbnQgYmVfZGV2X21hY19hZGQoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICptYWMpCit7CisJaW50IGk7CisKKwkvKiBDaGVjayBpZiBtYWMgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCBhcyBwYXJ0IG9mIHVjLWxpc3QgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+dWNfbWFjczsgaSsrKSB7CisJCWlmIChldGhlcl9hZGRyX2VxdWFsKCh1OCAqKSZhZGFwdGVyLT51Y19saXN0W2kgKiBFVEhfQUxFTl0sCisJCQkJICAgICBtYWMpKSB7CisJCQkvKiBtYWMgYWxyZWFkeSBhZGRlZCwgc2tpcCBhZGRpdGlvbiAqLworCQkJYWRhcHRlci0+cG1hY19pZFswXSA9IGFkYXB0ZXItPnBtYWNfaWRbaSArIDFdOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gYmVfY21kX3BtYWNfYWRkKGFkYXB0ZXIsIG1hYywgYWRhcHRlci0+aWZfaGFuZGxlLAorCQkJICAgICAgICZhZGFwdGVyLT5wbWFjX2lkWzBdLCAwKTsKK30KKworc3RhdGljIHZvaWQgYmVfZGV2X21hY19kZWwoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBwbWFjX2lkKQoreworCWludCBpOworCisJLyogU2tpcCBkZWxldGlvbiBpZiB0aGUgcHJvZ3JhbW1lZCBtYWMgaXMKKwkgKiBiZWluZyB1c2VkIGluIHVjLWxpc3QKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+dWNfbWFjczsgaSsrKSB7CisJCWlmIChhZGFwdGVyLT5wbWFjX2lkW2kgKyAxXSA9PSBwbWFjX2lkKQorCQkJcmV0dXJuOworCX0KKwliZV9jbWRfcG1hY19kZWwoYWRhcHRlciwgYWRhcHRlci0+aWZfaGFuZGxlLCBwbWFjX2lkLCAwKTsKK30KKwogc3RhdGljIGludCBiZV9tYWNfYWRkcl9zZXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdm9pZCAqcCkKIHsKIAlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CkBAIC0yNjcsNyArMzA4LDcgQEAKIAlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOwogCWludCBzdGF0dXM7CiAJdTggbWFjW0VUSF9BTEVOXTsKLQl1MzIgb2xkX3BtYWNfaWQgPSBhZGFwdGVyLT5wbWFjX2lkWzBdLCBjdXJyX3BtYWNfaWQgPSAwOworCXUzMiBvbGRfcG1hY19pZCA9IGFkYXB0ZXItPnBtYWNfaWRbMF07CiAKIAlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkci0+c2FfZGF0YSkpCiAJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKQEAgLTI3NSw3ICszMTYsNyBAQAogCS8qIFByb2NlZWQgZnVydGhlciBvbmx5IGlmLCBVc2VyIHByb3ZpZGVkIE1BQyBpcyBkaWZmZXJlbnQKIAkgKiBmcm9tIGFjdGl2ZSBNQUMKIAkgKi8KLQlpZiAoZXRoZXJfYWRkcl9lcXVhbChhZGRyLT5zYV9kYXRhLCBuZXRkZXYtPmRldl9hZGRyKSkKKwlpZiAoZXRoZXJfYWRkcl9lcXVhbChhZGRyLT5zYV9kYXRhLCBhZGFwdGVyLT5kZXZfbWFjKSkKIAkJcmV0dXJuIDA7CiAKIAkvKiBpZiBkZXZpY2UgaXMgbm90IHJ1bm5pbmcsIGNvcHkgTUFDIHRvIG5ldGRldi0+ZGV2X2FkZHIgKi8KQEAgLTI4OCwyMyArMzI5LDIyIEBACiAJICogRklMVE1HTVQgcHJpdmlsZWdlLiBUaGlzIGZhaWx1cmUgaXMgT0ssIG9ubHkgaWYgdGhlIFBGIHByb2dyYW1tZWQKIAkgKiB0aGUgTUFDIGZvciB0aGUgVkYuCiAJICovCi0Jc3RhdHVzID0gYmVfY21kX3BtYWNfYWRkKGFkYXB0ZXIsICh1OCAqKWFkZHItPnNhX2RhdGEsCi0JCQkJIGFkYXB0ZXItPmlmX2hhbmRsZSwgJmFkYXB0ZXItPnBtYWNfaWRbMF0sIDApOworCW11dGV4X2xvY2soJmFkYXB0ZXItPnJ4X2ZpbHRlcl9sb2NrKTsKKwlzdGF0dXMgPSBiZV9kZXZfbWFjX2FkZChhZGFwdGVyLCAodTggKilhZGRyLT5zYV9kYXRhKTsKIAlpZiAoIXN0YXR1cykgewotCQljdXJyX3BtYWNfaWQgPSBhZGFwdGVyLT5wbWFjX2lkWzBdOwogCiAJCS8qIERlbGV0ZSB0aGUgb2xkIHByb2dyYW1tZWQgTUFDLiBUaGlzIGNhbGwgbWF5IGZhaWwgaWYgdGhlCiAJCSAqIG9sZCBNQUMgd2FzIGFscmVhZHkgZGVsZXRlZCBieSB0aGUgUEYgZHJpdmVyLgogCQkgKi8KIAkJaWYgKGFkYXB0ZXItPnBtYWNfaWRbMF0gIT0gb2xkX3BtYWNfaWQpCi0JCQliZV9jbWRfcG1hY19kZWwoYWRhcHRlciwgYWRhcHRlci0+aWZfaGFuZGxlLAotCQkJCQlvbGRfcG1hY19pZCwgMCk7CisJCQliZV9kZXZfbWFjX2RlbChhZGFwdGVyLCBvbGRfcG1hY19pZCk7CiAJfQogCisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5yeF9maWx0ZXJfbG9jayk7CiAJLyogRGVjaWRlIGlmIHRoZSBuZXcgTUFDIGlzIHN1Y2Nlc3NmdWxseSBhY3RpdmF0ZWQgb25seSBhZnRlcgogCSAqIHF1ZXJ5aW5nIHRoZSBGVwogCSAqLwotCXN0YXR1cyA9IGJlX2NtZF9nZXRfYWN0aXZlX21hYyhhZGFwdGVyLCBjdXJyX3BtYWNfaWQsIG1hYywKKwlzdGF0dXMgPSBiZV9jbWRfZ2V0X2FjdGl2ZV9tYWMoYWRhcHRlciwgYWRhcHRlci0+cG1hY19pZFswXSwgbWFjLAogCQkJCSAgICAgICBhZGFwdGVyLT5pZl9oYW5kbGUsIHRydWUsIDApOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gZXJyOwpAQCAtMzE3LDYgKzM1Nyw3IEBACiAJCWdvdG8gZXJyOwogCX0KIGRvbmU6CisJZXRoZXJfYWRkcl9jb3B5KGFkYXB0ZXItPmRldl9tYWMsIGFkZHItPnNhX2RhdGEpOwogCWV0aGVyX2FkZHJfY29weShuZXRkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhKTsKIAlkZXZfaW5mbyhkZXYsICJNQUMgYWRkcmVzcyBjaGFuZ2VkIHRvICVwTVxuIiwgYWRkci0+c2FfZGF0YSk7CiAJcmV0dXJuIDA7CkBAIC0xNDIwLDEzICsxNDYxLDE4IEBACiAJdTE2IG51bSA9IDAsIGkgPSAwOwogCWludCBzdGF0dXMgPSAwOwogCi0JLyogTm8gbmVlZCB0byBmdXJ0aGVyIGNvbmZpZ3VyZSB2aWRzIGlmIGluIHByb21pc2N1b3VzIG1vZGUgKi8KLQlpZiAoYmVfaW5fYWxsX3Byb21pc2MoYWRhcHRlcikpCisJLyogTm8gbmVlZCB0byBjaGFuZ2UgdGhlIFZMQU4gc3RhdGUgaWYgdGhlIEkvRiBpcyBpbiBwcm9taXNjdW91cyAqLworCWlmIChhZGFwdGVyLT5uZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCiAJCXJldHVybiAwOwogCiAJaWYgKGFkYXB0ZXItPnZsYW5zX2FkZGVkID4gYmVfbWF4X3ZsYW5zKGFkYXB0ZXIpKQogCQlyZXR1cm4gYmVfc2V0X3ZsYW5fcHJvbWlzYyhhZGFwdGVyKTsKIAorCWlmIChhZGFwdGVyLT5pZl9mbGFncyAmIEJFX0lGX0ZMQUdTX1ZMQU5fUFJPTUlTQ1VPVVMpIHsKKwkJc3RhdHVzID0gYmVfY2xlYXJfdmxhbl9wcm9taXNjKGFkYXB0ZXIpOworCQlpZiAoc3RhdHVzKQorCQkJcmV0dXJuIHN0YXR1czsKKwl9CiAJLyogQ29uc3RydWN0IFZMQU4gVGFibGUgdG8gZ2l2ZSB0byBIVyAqLwogCWZvcl9lYWNoX3NldF9iaXQoaSwgYWRhcHRlci0+dmlkcywgVkxBTl9OX1ZJRCkKIAkJdmlkc1tudW0rK10gPSBjcHVfdG9fbGUxNihpKTsKQEAgLTE0MzksOCArMTQ4NSw2IEBACiAJCSAgICBhZGRsX3N0YXR1cyhzdGF0dXMpID09CiAJCQkJTUNDX0FERExfU1RBVFVTX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMpCiAJCQlyZXR1cm4gYmVfc2V0X3ZsYW5fcHJvbWlzYyhhZGFwdGVyKTsKLQl9IGVsc2UgaWYgKGFkYXB0ZXItPmlmX2ZsYWdzICYgQkVfSUZfRkxBR1NfVkxBTl9QUk9NSVNDVU9VUykgewotCQlzdGF0dXMgPSBiZV9jbGVhcl92bGFuX3Byb21pc2MoYWRhcHRlcik7CiAJfQogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xNDUwLDQ2ICsxNDk0LDQ1IEBACiAJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCWludCBzdGF0dXMgPSAwOwogCisJbXV0ZXhfbG9jaygmYWRhcHRlci0+cnhfZmlsdGVyX2xvY2spOworCiAJLyogUGFja2V0cyB3aXRoIFZJRCAwIGFyZSBhbHdheXMgcmVjZWl2ZWQgYnkgTGFuY2VyIGJ5IGRlZmF1bHQgKi8KIAlpZiAobGFuY2VyX2NoaXAoYWRhcHRlcikgJiYgdmlkID09IDApCi0JCXJldHVybiBzdGF0dXM7CisJCWdvdG8gZG9uZTsKIAogCWlmICh0ZXN0X2JpdCh2aWQsIGFkYXB0ZXItPnZpZHMpKQotCQlyZXR1cm4gc3RhdHVzOworCQlnb3RvIGRvbmU7CiAKIAlzZXRfYml0KHZpZCwgYWRhcHRlci0+dmlkcyk7CiAJYWRhcHRlci0+dmxhbnNfYWRkZWQrKzsKIAogCXN0YXR1cyA9IGJlX3ZpZF9jb25maWcoYWRhcHRlcik7Ci0JaWYgKHN0YXR1cykgewotCQlhZGFwdGVyLT52bGFuc19hZGRlZC0tOwotCQljbGVhcl9iaXQodmlkLCBhZGFwdGVyLT52aWRzKTsKLQl9Ci0KK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5yeF9maWx0ZXJfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdGljIGludCBiZV92bGFuX3JlbV92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgX19iZTE2IHByb3RvLCB1MTYgdmlkKQogewogCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgc3RhdHVzID0gMDsKKworCW11dGV4X2xvY2soJmFkYXB0ZXItPnJ4X2ZpbHRlcl9sb2NrKTsKIAogCS8qIFBhY2tldHMgd2l0aCBWSUQgMCBhcmUgYWx3YXlzIHJlY2VpdmVkIGJ5IExhbmNlciBieSBkZWZhdWx0ICovCiAJaWYgKGxhbmNlcl9jaGlwKGFkYXB0ZXIpICYmIHZpZCA9PSAwKQotCQlyZXR1cm4gMDsKKwkJZ290byBkb25lOwogCiAJaWYgKCF0ZXN0X2JpdCh2aWQsIGFkYXB0ZXItPnZpZHMpKQotCQlyZXR1cm4gMDsKKwkJZ290byBkb25lOwogCiAJY2xlYXJfYml0KHZpZCwgYWRhcHRlci0+dmlkcyk7CiAJYWRhcHRlci0+dmxhbnNfYWRkZWQtLTsKIAotCXJldHVybiBiZV92aWRfY29uZmlnKGFkYXB0ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBiZV9jbGVhcl9hbGxfcHJvbWlzYyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKLXsKLQliZV9jbWRfcnhfZmlsdGVyKGFkYXB0ZXIsIEJFX0lGX0ZMQUdTX0FMTF9QUk9NSVNDVU9VUywgT0ZGKTsKLQlhZGFwdGVyLT5pZl9mbGFncyAmPSB+QkVfSUZfRkxBR1NfQUxMX1BST01JU0NVT1VTOworCXN0YXR1cyA9IGJlX3ZpZF9jb25maWcoYWRhcHRlcik7Citkb25lOgorCW11dGV4X3VubG9jaygmYWRhcHRlci0+cnhfZmlsdGVyX2xvY2spOworCXJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXRpYyB2b2lkIGJlX3NldF9hbGxfcHJvbWlzYyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKQEAgLTE1MTAsNzUgKzE1NTMsMjI2IEBACiAJCWFkYXB0ZXItPmlmX2ZsYWdzIHw9IEJFX0lGX0ZMQUdTX01DQVNUX1BST01JU0NVT1VTOwogfQogCi1zdGF0aWMgdm9pZCBiZV9zZXRfbWNfbGlzdChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKK3N0YXRpYyB2b2lkIGJlX3NldF91Y19wcm9taXNjKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQogewogCWludCBzdGF0dXM7CiAKLQlzdGF0dXMgPSBiZV9jbWRfcnhfZmlsdGVyKGFkYXB0ZXIsIEJFX0lGX0ZMQUdTX01VTFRJQ0FTVCwgT04pOworCWlmIChhZGFwdGVyLT5pZl9mbGFncyAmIEJFX0lGX0ZMQUdTX1BST01JU0NVT1VTKQorCQlyZXR1cm47CisKKwlzdGF0dXMgPSBiZV9jbWRfcnhfZmlsdGVyKGFkYXB0ZXIsIEJFX0lGX0ZMQUdTX1BST01JU0NVT1VTLCBPTik7CiAJaWYgKCFzdGF0dXMpCi0JCWFkYXB0ZXItPmlmX2ZsYWdzICY9IH5CRV9JRl9GTEFHU19NQ0FTVF9QUk9NSVNDVU9VUzsKLQllbHNlCisJCWFkYXB0ZXItPmlmX2ZsYWdzIHw9IEJFX0lGX0ZMQUdTX1BST01JU0NVT1VTOworfQorCitzdGF0aWMgdm9pZCBiZV9jbGVhcl91Y19wcm9taXNjKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBzdGF0dXM7CisKKwlpZiAoIShhZGFwdGVyLT5pZl9mbGFncyAmIEJFX0lGX0ZMQUdTX1BST01JU0NVT1VTKSkKKwkJcmV0dXJuOworCisJc3RhdHVzID0gYmVfY21kX3J4X2ZpbHRlcihhZGFwdGVyLCBCRV9JRl9GTEFHU19QUk9NSVNDVU9VUywgT0ZGKTsKKwlpZiAoIXN0YXR1cykKKwkJYWRhcHRlci0+aWZfZmxhZ3MgJj0gfkJFX0lGX0ZMQUdTX1BST01JU0NVT1VTOworfQorCisvKiBUaGUgYmVsb3cgMiBmdW5jdGlvbnMgYXJlIHRoZSBjYWxsYmFjayBhcmdzIGZvciBfX2Rldl9tY19zeW5jL2Rldl91Y19zeW5jKCkuCisgKiBXZSB1c2UgYSBzaW5nbGUgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGJvdGggc3luYyBhbmQgdW5zeW5jLiBXZSByZWFsbHkgZG9uJ3QKKyAqIGFkZC9yZW1vdmUgYWRkcmVzc2VzIHRocm91Z2ggdGhpcyBjYWxsYmFjay4gQnV0LCB3ZSB1c2UgaXQgdG8gZGV0ZWN0IGNoYW5nZXMKKyAqIHRvIHRoZSB1Yy9tYyBsaXN0cy4gVGhlIGVudGlyZSB1Yy9tYyBsaXN0IGlzIHByb2dyYW1tZWQgaW4gYmVfc2V0X3J4X21vZGUoKS4KKyAqLworc3RhdGljIGludCBiZV91Y19saXN0X3VwZGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyKQoreworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWFkYXB0ZXItPnVwZGF0ZV91Y19saXN0ID0gdHJ1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiZV9tY19saXN0X3VwZGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyKQoreworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWFkYXB0ZXItPnVwZGF0ZV9tY19saXN0ID0gdHJ1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmVfc2V0X21jX2xpc3Qoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOworCWJvb2wgbWNfcHJvbWlzYyA9IGZhbHNlOworCWludCBzdGF0dXM7CisKKwluZXRpZl9hZGRyX2xvY2tfYmgobmV0ZGV2KTsKKwlfX2Rldl9tY19zeW5jKG5ldGRldiwgYmVfbWNfbGlzdF91cGRhdGUsIGJlX21jX2xpc3RfdXBkYXRlKTsKKworCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKKwkJYWRhcHRlci0+dXBkYXRlX21jX2xpc3QgPSBmYWxzZTsKKwl9IGVsc2UgaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkgfHwKKwkJICAgbmV0ZGV2X21jX2NvdW50KG5ldGRldikgPiBiZV9tYXhfbWMoYWRhcHRlcikpIHsKKwkJLyogRW5hYmxlIG11bHRpY2FzdCBwcm9taXNjIGlmIG51bSBjb25maWd1cmVkIGV4Y2VlZHMKKwkJICogd2hhdCB3ZSBzdXBwb3J0CisJCSAqLworCQltY19wcm9taXNjID0gdHJ1ZTsKKwkJYWRhcHRlci0+dXBkYXRlX21jX2xpc3QgPSBmYWxzZTsKKwl9IGVsc2UgaWYgKGFkYXB0ZXItPmlmX2ZsYWdzICYgQkVfSUZfRkxBR1NfTUNBU1RfUFJPTUlTQ1VPVVMpIHsKKwkJLyogVXBkYXRlIG1jLWxpc3QgdW5jb25kaXRpb25hbGx5IGlmIHRoZSBpZmFjZSB3YXMgcHJldmlvdXNseQorCQkgKiBpbiBtYy1wcm9taXNjIG1vZGUgYW5kIG5vdyBpcyBvdXQgb2YgdGhhdCBtb2RlLgorCQkgKi8KKwkJYWRhcHRlci0+dXBkYXRlX21jX2xpc3QgPSB0cnVlOworCX0KKworCWlmIChhZGFwdGVyLT51cGRhdGVfbWNfbGlzdCkgeworCQlpbnQgaSA9IDA7CisKKwkJLyogY2FjaGUgdGhlIG1jLWxpc3QgaW4gYWRhcHRlciAqLworCQluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgbmV0ZGV2KSB7CisJCQlldGhlcl9hZGRyX2NvcHkoYWRhcHRlci0+bWNfbGlzdFtpXS5tYWMsIGhhLT5hZGRyKTsKKwkJCWkrKzsKKwkJfQorCQlhZGFwdGVyLT5tY19jb3VudCA9IG5ldGRldl9tY19jb3VudChuZXRkZXYpOworCX0KKwluZXRpZl9hZGRyX3VubG9ja19iaChuZXRkZXYpOworCisJaWYgKG1jX3Byb21pc2MpIHsKIAkJYmVfc2V0X21jX3Byb21pc2MoYWRhcHRlcik7CisJfSBlbHNlIGlmIChhZGFwdGVyLT51cGRhdGVfbWNfbGlzdCkgeworCQlzdGF0dXMgPSBiZV9jbWRfcnhfZmlsdGVyKGFkYXB0ZXIsIEJFX0lGX0ZMQUdTX01VTFRJQ0FTVCwgT04pOworCQlpZiAoIXN0YXR1cykKKwkJCWFkYXB0ZXItPmlmX2ZsYWdzICY9IH5CRV9JRl9GTEFHU19NQ0FTVF9QUk9NSVNDVU9VUzsKKwkJZWxzZQorCQkJYmVfc2V0X21jX3Byb21pc2MoYWRhcHRlcik7CisKKwkJYWRhcHRlci0+dXBkYXRlX21jX2xpc3QgPSBmYWxzZTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJlX2NsZWFyX21jX2xpc3Qoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKworCV9fZGV2X21jX3Vuc3luYyhuZXRkZXYsIE5VTEwpOworCWJlX2NtZF9yeF9maWx0ZXIoYWRhcHRlciwgQkVfSUZfRkxBR1NfTVVMVElDQVNULCBPRkYpOworCWFkYXB0ZXItPm1jX2NvdW50ID0gMDsKK30KKworc3RhdGljIGludCBiZV91Y19tYWNfYWRkKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCBpbnQgdWNfaWR4KQoreworCWlmIChldGhlcl9hZGRyX2VxdWFsKCh1OCAqKSZhZGFwdGVyLT51Y19saXN0W3VjX2lkeCAqIEVUSF9BTEVOXSwKKwkJCSAgICAgYWRhcHRlci0+ZGV2X21hYykpIHsKKwkJYWRhcHRlci0+cG1hY19pZFt1Y19pZHggKyAxXSA9IGFkYXB0ZXItPnBtYWNfaWRbMF07CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBiZV9jbWRfcG1hY19hZGQoYWRhcHRlciwKKwkJCSAgICAgICAodTggKikmYWRhcHRlci0+dWNfbGlzdFt1Y19pZHggKiBFVEhfQUxFTl0sCisJCQkgICAgICAgYWRhcHRlci0+aWZfaGFuZGxlLAorCQkJICAgICAgICZhZGFwdGVyLT5wbWFjX2lkW3VjX2lkeCArIDFdLCAwKTsKK30KKworc3RhdGljIHZvaWQgYmVfdWNfbWFjX2RlbChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgaW50IHBtYWNfaWQpCit7CisJaWYgKHBtYWNfaWQgPT0gYWRhcHRlci0+cG1hY19pZFswXSkKKwkJcmV0dXJuOworCisJYmVfY21kX3BtYWNfZGVsKGFkYXB0ZXIsIGFkYXB0ZXItPmlmX2hhbmRsZSwgcG1hY19pZCwgMCk7CiB9CiAKIHN0YXRpYyB2b2lkIGJlX3NldF91Y19saXN0KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQogeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CiAJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKLQlpbnQgaSA9IDE7IC8qIEZpcnN0IHNsb3QgaXMgY2xhaW1lZCBieSB0aGUgUHJpbWFyeSBNQUMgKi8KKwlib29sIHVjX3Byb21pc2MgPSBmYWxzZTsKKwlpbnQgY3Vycl91Y19tYWNzID0gMCwgaTsKIAotCWZvciAoOyBhZGFwdGVyLT51Y19tYWNzID4gMDsgYWRhcHRlci0+dWNfbWFjcy0tLCBpKyspCi0JCWJlX2NtZF9wbWFjX2RlbChhZGFwdGVyLCBhZGFwdGVyLT5pZl9oYW5kbGUsCi0JCQkJYWRhcHRlci0+cG1hY19pZFtpXSwgMCk7CisJbmV0aWZfYWRkcl9sb2NrX2JoKG5ldGRldik7CisJX19kZXZfdWNfc3luYyhuZXRkZXYsIGJlX3VjX2xpc3RfdXBkYXRlLCBiZV91Y19saXN0X3VwZGF0ZSk7CiAKLQlpZiAobmV0ZGV2X3VjX2NvdW50KGFkYXB0ZXItPm5ldGRldikgPiBiZV9tYXhfdWMoYWRhcHRlcikpIHsKLQkJYmVfc2V0X2FsbF9wcm9taXNjKGFkYXB0ZXIpOwotCQlyZXR1cm47CisJaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQlhZGFwdGVyLT51cGRhdGVfdWNfbGlzdCA9IGZhbHNlOworCX0gZWxzZSBpZiAobmV0ZGV2X3VjX2NvdW50KG5ldGRldikgPiAoYmVfbWF4X3VjKGFkYXB0ZXIpIC0gMSkpIHsKKwkJdWNfcHJvbWlzYyA9IHRydWU7CisJCWFkYXB0ZXItPnVwZGF0ZV91Y19saXN0ID0gZmFsc2U7CisJfSAgZWxzZSBpZiAoYWRhcHRlci0+aWZfZmxhZ3MgJiBCRV9JRl9GTEFHU19QUk9NSVNDVU9VUykgeworCQkvKiBVcGRhdGUgdWMtbGlzdCB1bmNvbmRpdGlvbmFsbHkgaWYgdGhlIGlmYWNlIHdhcyBwcmV2aW91c2x5CisJCSAqIGluIHVjLXByb21pc2MgbW9kZSBhbmQgbm93IGlzIG91dCBvZiB0aGF0IG1vZGUuCisJCSAqLworCQlhZGFwdGVyLT51cGRhdGVfdWNfbGlzdCA9IHRydWU7CiAJfQogCi0JbmV0ZGV2X2Zvcl9lYWNoX3VjX2FkZHIoaGEsIGFkYXB0ZXItPm5ldGRldikgewotCQlhZGFwdGVyLT51Y19tYWNzKys7IC8qIEZpcnN0IHNsb3QgaXMgZm9yIFByaW1hcnkgTUFDICovCi0JCWJlX2NtZF9wbWFjX2FkZChhZGFwdGVyLCAodTggKiloYS0+YWRkciwgYWRhcHRlci0+aWZfaGFuZGxlLAotCQkJCSZhZGFwdGVyLT5wbWFjX2lkW2FkYXB0ZXItPnVjX21hY3NdLCAwKTsKKwlpZiAoYWRhcHRlci0+dXBkYXRlX3VjX2xpc3QpIHsKKwkJaSA9IDE7IC8qIEZpcnN0IHNsb3QgaXMgY2xhaW1lZCBieSB0aGUgUHJpbWFyeSBNQUMgKi8KKworCQkvKiBjYWNoZSB0aGUgdWMtbGlzdCBpbiBhZGFwdGVyIGFycmF5ICovCisJCW5ldGRldl9mb3JfZWFjaF91Y19hZGRyKGhhLCBuZXRkZXYpIHsKKwkJCWV0aGVyX2FkZHJfY29weShhZGFwdGVyLT51Y19saXN0W2ldLm1hYywgaGEtPmFkZHIpOworCQkJaSsrOworCQl9CisJCWN1cnJfdWNfbWFjcyA9IG5ldGRldl91Y19jb3VudChuZXRkZXYpOworCX0KKwluZXRpZl9hZGRyX3VubG9ja19iaChuZXRkZXYpOworCisJaWYgKHVjX3Byb21pc2MpIHsKKwkJYmVfc2V0X3VjX3Byb21pc2MoYWRhcHRlcik7CisJfSBlbHNlIGlmIChhZGFwdGVyLT51cGRhdGVfdWNfbGlzdCkgeworCQliZV9jbGVhcl91Y19wcm9taXNjKGFkYXB0ZXIpOworCisJCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT51Y19tYWNzOyBpKyspCisJCQliZV91Y19tYWNfZGVsKGFkYXB0ZXIsIGFkYXB0ZXItPnBtYWNfaWRbaSArIDFdKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgY3Vycl91Y19tYWNzOyBpKyspCisJCQliZV91Y19tYWNfYWRkKGFkYXB0ZXIsIGkpOworCQlhZGFwdGVyLT51Y19tYWNzID0gY3Vycl91Y19tYWNzOworCQlhZGFwdGVyLT51cGRhdGVfdWNfbGlzdCA9IGZhbHNlOwogCX0KIH0KIAogc3RhdGljIHZvaWQgYmVfY2xlYXJfdWNfbGlzdChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwogCWludCBpOwogCi0JZm9yIChpID0gMTsgaSA8IChhZGFwdGVyLT51Y19tYWNzICsgMSk7IGkrKykKLQkJYmVfY21kX3BtYWNfZGVsKGFkYXB0ZXIsIGFkYXB0ZXItPmlmX2hhbmRsZSwKLQkJCQlhZGFwdGVyLT5wbWFjX2lkW2ldLCAwKTsKKwlfX2Rldl91Y191bnN5bmMobmV0ZGV2LCBOVUxMKTsKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+dWNfbWFjczsgaSsrKQorCQliZV91Y19tYWNfZGVsKGFkYXB0ZXIsIGFkYXB0ZXItPnBtYWNfaWRbaSArIDFdKTsKKwogCWFkYXB0ZXItPnVjX21hY3MgPSAwOwogfQogCi1zdGF0aWMgdm9pZCBiZV9zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQorc3RhdGljIHZvaWQgX19iZV9zZXRfcnhfbW9kZShzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKLQlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKworCW11dGV4X2xvY2soJmFkYXB0ZXItPnJ4X2ZpbHRlcl9sb2NrKTsKIAogCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKLQkJYmVfc2V0X2FsbF9wcm9taXNjKGFkYXB0ZXIpOwotCQlyZXR1cm47CisJCWlmICghYmVfaW5fYWxsX3Byb21pc2MoYWRhcHRlcikpCisJCQliZV9zZXRfYWxsX3Byb21pc2MoYWRhcHRlcik7CisJfSBlbHNlIGlmIChiZV9pbl9hbGxfcHJvbWlzYyhhZGFwdGVyKSkgeworCQkvKiBXZSBuZWVkIHRvIHJlLXByb2dyYW0gdGhlIHZsYW4tbGlzdCBvciBjbGVhcgorCQkgKiB2bGFuLXByb21pc2MgbW9kZSAoaWYgbmVlZGVkKSB3aGVuIHRoZSBpbnRlcmZhY2UKKwkJICogY29tZXMgb3V0IG9mIHByb21pc2MgbW9kZS4KKwkJICovCisJCWJlX3ZpZF9jb25maWcoYWRhcHRlcik7CiAJfQogCi0JLyogSW50ZXJmYWNlIHdhcyBwcmV2aW91c2x5IGluIHByb21pc2N1b3VzIG1vZGU7IGRpc2FibGUgaXQgKi8KLQlpZiAoYmVfaW5fYWxsX3Byb21pc2MoYWRhcHRlcikpIHsKLQkJYmVfY2xlYXJfYWxsX3Byb21pc2MoYWRhcHRlcik7Ci0JCWlmIChhZGFwdGVyLT52bGFuc19hZGRlZCkKLQkJCWJlX3ZpZF9jb25maWcoYWRhcHRlcik7Ci0JfQotCi0JLyogRW5hYmxlIG11bHRpY2FzdCBwcm9taXNjIGlmIG51bSBjb25maWd1cmVkIGV4Y2VlZHMgd2hhdCB3ZSBzdXBwb3J0ICovCi0JaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkgfHwKLQkgICAgbmV0ZGV2X21jX2NvdW50KG5ldGRldikgPiBiZV9tYXhfbWMoYWRhcHRlcikpIHsKLQkJYmVfc2V0X21jX3Byb21pc2MoYWRhcHRlcik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAobmV0ZGV2X3VjX2NvdW50KG5ldGRldikgIT0gYWRhcHRlci0+dWNfbWFjcykKLQkJYmVfc2V0X3VjX2xpc3QoYWRhcHRlcik7Ci0KKwliZV9zZXRfdWNfbGlzdChhZGFwdGVyKTsKIAliZV9zZXRfbWNfbGlzdChhZGFwdGVyKTsKKworCW11dGV4X3VubG9jaygmYWRhcHRlci0+cnhfZmlsdGVyX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBiZV93b3JrX3NldF9yeF9tb2RlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYmVfY21kX3dvcmsgKmNtZF93b3JrID0KKwkJCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGJlX2NtZF93b3JrLCB3b3JrKTsKKworCV9fYmVfc2V0X3J4X21vZGUoY21kX3dvcmstPmFkYXB0ZXIpOworCWtmcmVlKGNtZF93b3JrKTsKIH0KIAogc3RhdGljIGludCBiZV9zZXRfdmZfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2ZiwgdTggKm1hYykKQEAgLTE3MDEsNyArMTg5NSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYmVfc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmLCB1MTYgdmxhbiwgdTggcW9zKQorc3RhdGljIGludCBiZV9zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmYsIHUxNiB2bGFuLCB1OCBxb3MsCisJCQkgIF9fYmUxNiB2bGFuX3Byb3RvKQogewogCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgYmVfdmZfY2ZnICp2Zl9jZmcgPSAmYWRhcHRlci0+dmZfY2ZnW3ZmXTsKQEAgLTE3MTMsNiArMTkwOCw5IEBACiAJaWYgKHZmID49IGFkYXB0ZXItPm51bV92ZnMgfHwgdmxhbiA+IDQwOTUgfHwgcW9zID4gNykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAodmxhbl9wcm90byAhPSBodG9ucyhFVEhfUF84MDIxUSkpCisJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOworCiAJaWYgKHZsYW4gfHwgcW9zKSB7CiAJCXZsYW4gfD0gcW9zIDw8IFZMQU5fUFJJT19TSElGVDsKIAkJc3RhdHVzID0gYmVfc2V0X3ZmX3R2dChhZGFwdGVyLCB2Ziwgdmxhbik7CkBAIC0zMjIwLDkgKzM0MTgsNyBAQAogCQkgKi8KIAogCQlpZiAodWVfbG8gfHwgdWVfaGkpIHsKLQkJCWRldl9lcnIoZGV2LAotCQkJCSJVbnJlY292ZXJhYmxlIEVycm9yIGRldGVjdGVkIGluIHRoZSBhZGFwdGVyIik7Ci0JCQlkZXZfZXJyKGRldiwgIlBsZWFzZSByZWJvb3Qgc2VydmVyIHRvIHJlY292ZXIiKTsKKwkJCWRldl9lcnIoZGV2LCAiRXJyb3IgZGV0ZWN0ZWQgaW4gdGhlIGFkYXB0ZXIiKTsKIAkJCWlmIChza3loYXdrX2NoaXAoYWRhcHRlcikpCiAJCQkJYmVfc2V0X2Vycm9yKGFkYXB0ZXIsIEJFX0VSUk9SX1VFKTsKIApAQCAtMzQyNSwxMCArMzYyMSw5IEBACiAKIHN0YXRpYyB2b2lkIGJlX2Rpc2FibGVfaWZfZmlsdGVycyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKLQliZV9jbWRfcG1hY19kZWwoYWRhcHRlciwgYWRhcHRlci0+aWZfaGFuZGxlLAotCQkJYWRhcHRlci0+cG1hY19pZFswXSwgMCk7Ci0KKwliZV9kZXZfbWFjX2RlbChhZGFwdGVyLCBhZGFwdGVyLT5wbWFjX2lkWzBdKTsKIAliZV9jbGVhcl91Y19saXN0KGFkYXB0ZXIpOworCWJlX2NsZWFyX21jX2xpc3QoYWRhcHRlcik7CiAKIAkvKiBUaGUgSUZBQ0UgZmxhZ3MgYXJlIGVuYWJsZWQgaW4gdGhlIG9wZW4gcGF0aCBhbmQgY2xlYXJlZAogCSAqIGluIHRoZSBjbG9zZSBwYXRoLiBXaGVuIGEgVkYgZ2V0cyBkZXRhY2hlZCBmcm9tIHRoZSBob3N0IGFuZApAQCAtMzQ2Miw2ICszNjU3LDExIEBACiAJaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBCRV9GTEFHU19TRVRVUF9ET05FKSkKIAkJcmV0dXJuIDA7CiAKKwkvKiBCZWZvcmUgYXR0ZW1wdGluZyBjbGVhbnVwIGVuc3VyZSBhbGwgdGhlIHBlbmRpbmcgY21kcyBpbiB0aGUKKwkgKiBjb25maWdfd3EgaGF2ZSBmaW5pc2hlZCBleGVjdXRpb24KKwkgKi8KKwlmbHVzaF93b3JrcXVldWUoYmVfd3EpOworCiAJYmVfZGlzYWJsZV9pZl9maWx0ZXJzKGFkYXB0ZXIpOwogCiAJaWYgKGFkYXB0ZXItPmZsYWdzICYgQkVfRkxBR1NfTkFQSV9FTkFCTEVEKSB7CkBAIC0zNTc2LDE3ICszNzc2LDE2IEBACiAKIAkvKiBGb3IgQkUzIFZGcywgdGhlIFBGIHByb2dyYW1zIHRoZSBpbml0aWFsIE1BQyBhZGRyZXNzICovCiAJaWYgKCEoQkV4X2NoaXAoYWRhcHRlcikgJiYgYmVfdmlydGZuKGFkYXB0ZXIpKSkgewotCQlzdGF0dXMgPSBiZV9jbWRfcG1hY19hZGQoYWRhcHRlciwgYWRhcHRlci0+bmV0ZGV2LT5kZXZfYWRkciwKLQkJCQkJIGFkYXB0ZXItPmlmX2hhbmRsZSwKLQkJCQkJICZhZGFwdGVyLT5wbWFjX2lkWzBdLCAwKTsKKwkJc3RhdHVzID0gYmVfZGV2X21hY19hZGQoYWRhcHRlciwgYWRhcHRlci0+bmV0ZGV2LT5kZXZfYWRkcik7CiAJCWlmIChzdGF0dXMpCiAJCQlyZXR1cm4gc3RhdHVzOworCQlldGhlcl9hZGRyX2NvcHkoYWRhcHRlci0+ZGV2X21hYywgYWRhcHRlci0+bmV0ZGV2LT5kZXZfYWRkcik7CiAJfQogCiAJaWYgKGFkYXB0ZXItPnZsYW5zX2FkZGVkKQogCQliZV92aWRfY29uZmlnKGFkYXB0ZXIpOwogCi0JYmVfc2V0X3J4X21vZGUoYWRhcHRlci0+bmV0ZGV2KTsKKwlfX2JlX3NldF9yeF9tb2RlKGFkYXB0ZXIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zNzU5LDggKzM5NTgsMTMgQEAKIAogc3RhdGljIHZvaWQgYmVfY2FuY2VsX2Vycl9kZXRlY3Rpb24oc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CisJc3RydWN0IGJlX2Vycm9yX3JlY292ZXJ5ICplcnJfcmVjID0gJmFkYXB0ZXItPmVycm9yX3JlY292ZXJ5OworCisJaWYgKCFiZV9lcnJfcmVjb3Zlcnlfd29ya3EpCisJCXJldHVybjsKKwogCWlmIChhZGFwdGVyLT5mbGFncyAmIEJFX0ZMQUdTX0VSUl9ERVRFQ1RJT05fU0NIRURVTEVEKSB7Ci0JCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYWRhcHRlci0+YmVfZXJyX2RldGVjdGlvbl93b3JrKTsKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZlcnJfcmVjLT5lcnJfZGV0ZWN0aW9uX3dvcmspOwogCQlhZGFwdGVyLT5mbGFncyAmPSB+QkVfRkxBR1NfRVJSX0RFVEVDVElPTl9TQ0hFRFVMRUQ7CiAJfQogfQpAQCAtMzg2MCw2ICs0MDY0LDIwIEBACiAJCXZmdF9yZXMtPm1heF9tY2NfY291bnQgPSByZXMubWF4X21jY19jb3VudCAvIChudW1fdmZzICsgMSk7CiB9CiAKK3N0YXRpYyB2b2lkIGJlX2lmX2Rlc3Ryb3koc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJYmVfY21kX2lmX2Rlc3Ryb3koYWRhcHRlciwgYWRhcHRlci0+aWZfaGFuZGxlLCAgMCk7CisKKwlrZnJlZShhZGFwdGVyLT5wbWFjX2lkKTsKKwlhZGFwdGVyLT5wbWFjX2lkID0gTlVMTDsKKworCWtmcmVlKGFkYXB0ZXItPm1jX2xpc3QpOworCWFkYXB0ZXItPm1jX2xpc3QgPSBOVUxMOworCisJa2ZyZWUoYWRhcHRlci0+dWNfbGlzdCk7CisJYWRhcHRlci0+dWNfbGlzdCA9IE5VTEw7Cit9CisKIHN0YXRpYyBpbnQgYmVfY2xlYXIoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OwpAQCAtMzg2Nyw2ICs0MDg1LDggQEAKIAogCWJlX2NhbmNlbF93b3JrZXIoYWRhcHRlcik7CiAKKwlmbHVzaF93b3JrcXVldWUoYmVfd3EpOworCiAJaWYgKHNyaW92X2VuYWJsZWQoYWRhcHRlcikpCiAJCWJlX3ZmX2NsZWFyKGFkYXB0ZXIpOwogCkBAIC0zODg0LDEwICs0MTA0LDggQEAKIAl9CiAKIAliZV9kaXNhYmxlX3Z4bGFuX29mZmxvYWRzKGFkYXB0ZXIpOwotCWtmcmVlKGFkYXB0ZXItPnBtYWNfaWQpOwotCWFkYXB0ZXItPnBtYWNfaWQgPSBOVUxMOwogCi0JYmVfY21kX2lmX2Rlc3Ryb3koYWRhcHRlciwgYWRhcHRlci0+aWZfaGFuZGxlLCAgMCk7CisJYmVfaWZfZGVzdHJveShhZGFwdGVyKTsKIAogCWJlX2NsZWFyX3F1ZXVlcyhhZGFwdGVyKTsKIApAQCAtNDE1MSw3ICs0MzY5LDcgQEAKICAqIGZvciBkaXN0cmlidXRpb24gYmV0d2VlbiB0aGUgVkZzLiBUaGlzIHNlbGYtaW1wb3NlZCBsaW1pdCB3aWxsIGRldGVybWluZSB0aGUKICAqIG5vOiBvZiBWRnMgZm9yIHdoaWNoIFJTUyBjYW4gYmUgZW5hYmxlZC4KICAqLwotdm9pZCBiZV9jYWxjdWxhdGVfcGZfcG9vbF9yc3NfdGFibGVzKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIHZvaWQgYmVfY2FsY3VsYXRlX3BmX3Bvb2xfcnNzX3RhYmxlcyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlzdHJ1Y3QgYmVfcG9ydF9yZXNvdXJjZXMgcG9ydF9yZXMgPSB7MH07CiAJdTggcnNzX3RhYmxlc19vbl9wb3J0OwpAQCAtNDM0MSwxNCArNDU1OSwyOSBAQAogCiBzdGF0aWMgdm9pZCBiZV9zY2hlZHVsZV93b3JrZXIoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhZGFwdGVyLT53b3JrLCBtc2Vjc190b19qaWZmaWVzKDEwMDApKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsoYmVfd3EsICZhZGFwdGVyLT53b3JrLCBtc2Vjc190b19qaWZmaWVzKDEwMDApKTsKIAlhZGFwdGVyLT5mbGFncyB8PSBCRV9GTEFHU19XT1JLRVJfU0NIRURVTEVEOwogfQogCitzdGF0aWMgdm9pZCBiZV9kZXN0cm95X2Vycl9yZWNvdmVyeV93b3JrcSh2b2lkKQoreworCWlmICghYmVfZXJyX3JlY292ZXJ5X3dvcmtxKQorCQlyZXR1cm47CisKKwlmbHVzaF93b3JrcXVldWUoYmVfZXJyX3JlY292ZXJ5X3dvcmtxKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShiZV9lcnJfcmVjb3Zlcnlfd29ya3EpOworCWJlX2Vycl9yZWNvdmVyeV93b3JrcSA9IE5VTEw7Cit9CisKIHN0YXRpYyB2b2lkIGJlX3NjaGVkdWxlX2Vycl9kZXRlY3Rpb24oc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBkZWxheSkKIHsKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmFkYXB0ZXItPmJlX2Vycl9kZXRlY3Rpb25fd29yaywKLQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoZGVsYXkpKTsKKwlzdHJ1Y3QgYmVfZXJyb3JfcmVjb3ZlcnkgKmVycl9yZWMgPSAmYWRhcHRlci0+ZXJyb3JfcmVjb3Zlcnk7CisKKwlpZiAoIWJlX2Vycl9yZWNvdmVyeV93b3JrcSkKKwkJcmV0dXJuOworCisJcXVldWVfZGVsYXllZF93b3JrKGJlX2Vycl9yZWNvdmVyeV93b3JrcSwgJmVycl9yZWMtPmVycl9kZXRlY3Rpb25fd29yaywKKwkJCSAgIG1zZWNzX3RvX2ppZmZpZXMoZGVsYXkpKTsKIAlhZGFwdGVyLT5mbGFncyB8PSBCRV9GTEFHU19FUlJfREVURUNUSU9OX1NDSEVEVUxFRDsKIH0KIApAQCAtNDM5Myw2ICs0NjI2LDIyIEBACiAJdTMyIGNhcF9mbGFncyA9IGJlX2lmX2NhcF9mbGFncyhhZGFwdGVyKTsKIAlpbnQgc3RhdHVzOwogCisJLyogYWxsb2MgcmVxdWlyZWQgbWVtb3J5IGZvciBvdGhlciBmaWx0ZXJpbmcgZmllbGRzICovCisJYWRhcHRlci0+cG1hY19pZCA9IGtjYWxsb2MoYmVfbWF4X3VjKGFkYXB0ZXIpLAorCQkJCSAgIHNpemVvZigqYWRhcHRlci0+cG1hY19pZCksIEdGUF9LRVJORUwpOworCWlmICghYWRhcHRlci0+cG1hY19pZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlhZGFwdGVyLT5tY19saXN0ID0ga2NhbGxvYyhiZV9tYXhfbWMoYWRhcHRlciksCisJCQkJICAgc2l6ZW9mKCphZGFwdGVyLT5tY19saXN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhZGFwdGVyLT5tY19saXN0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWFkYXB0ZXItPnVjX2xpc3QgPSBrY2FsbG9jKGJlX21heF91YyhhZGFwdGVyKSwKKwkJCQkgICBzaXplb2YoKmFkYXB0ZXItPnVjX2xpc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFkYXB0ZXItPnVjX2xpc3QpCisJCXJldHVybiAtRU5PTUVNOworCiAJaWYgKGFkYXB0ZXItPmNmZ19udW1fcnhfaXJxcyA9PSAxKQogCQljYXBfZmxhZ3MgJj0gfihCRV9JRl9GTEFHU19ERUZRX1JTUyB8IEJFX0lGX0ZMQUdTX1JTUyk7CiAKQEAgLTQ0MDEsNyArNDY1MCwxMCBAQAogCXN0YXR1cyA9IGJlX2NtZF9pZl9jcmVhdGUoYWRhcHRlciwgYmVfaWZfY2FwX2ZsYWdzKGFkYXB0ZXIpLCBlbl9mbGFncywKIAkJCQkgICZhZGFwdGVyLT5pZl9oYW5kbGUsIDApOwogCi0JcmV0dXJuIHN0YXR1czsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCisJcmV0dXJuIDA7CiB9CiAKIGludCBiZV91cGRhdGVfcXVldWVzKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQpAQCAtNDQ1OCwxMCArNDcxMCwxNSBAQAogCXJldHVybiBmd19tYWpvcjsKIH0KIAotLyogSWYgYW55IFZGcyBhcmUgYWxyZWFkeSBlbmFibGVkIGRvbid0IEZMUiB0aGUgUEYgKi8KKy8qIElmIGl0IGlzIGVycm9yIHJlY292ZXJ5LCBGTFIgdGhlIFBGCisgKiBFbHNlIGlmIGFueSBWRnMgYXJlIGFscmVhZHkgZW5hYmxlZCBkb24ndCBGTFIgdGhlIFBGCisgKi8KIHN0YXRpYyBib29sIGJlX3Jlc2V0X3JlcXVpcmVkKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQogewotCXJldHVybiBwY2lfbnVtX3ZmKGFkYXB0ZXItPnBkZXYpID8gZmFsc2UgOiB0cnVlOworCWlmIChiZV9lcnJvcl9yZWNvdmVyaW5nKGFkYXB0ZXIpKQorCQlyZXR1cm4gdHJ1ZTsKKwllbHNlCisJCXJldHVybiBwY2lfbnVtX3ZmKGFkYXB0ZXItPnBkZXYpID09IDA7CiB9CiAKIC8qIFdhaXQgZm9yIHRoZSBGVyB0byBiZSByZWFkeSBhbmQgcGVyZm9ybSB0aGUgcmVxdWlyZWQgaW5pdGlhbGl6YXRpb24gKi8KQEAgLTQ0NzMsNiArNDczMCw5IEBACiAJaWYgKHN0YXR1cykKIAkJcmV0dXJuIHN0YXR1czsKIAorCS8qIEZXIGlzIG5vdyByZWFkeTsgY2xlYXIgZXJyb3JzIHRvIGFsbG93IGNtZHMvZG9vcmJlbGwgKi8KKwliZV9jbGVhcl9lcnJvcihhZGFwdGVyLCBCRV9DTEVBUl9BTEwpOworCiAJaWYgKGJlX3Jlc2V0X3JlcXVpcmVkKGFkYXB0ZXIpKSB7CiAJCXN0YXR1cyA9IGJlX2NtZF9yZXNldF9mdW5jdGlvbihhZGFwdGVyKTsKIAkJaWYgKHN0YXR1cykKQEAgLTQ0ODAsOSArNDc0MCw2IEBACiAKIAkJLyogV2FpdCBmb3IgaW50ZXJydXB0cyB0byBxdWllc2NlIGFmdGVyIGFuIEZMUiAqLwogCQltc2xlZXAoMTAwKTsKLQotCQkvKiBXZSBjYW4gY2xlYXIgYWxsIGVycm9ycyB3aGVuIGZ1bmN0aW9uIHJlc2V0IHN1Y2NlZWRzICovCi0JCWJlX2NsZWFyX2Vycm9yKGFkYXB0ZXIsIEJFX0NMRUFSX0FMTCk7CiAJfQogCiAJLyogVGVsbCBGVyB3ZSdyZSByZWFkeSB0byBmaXJlIGNtZHMgKi8KQEAgLTQ1MzAsMTEgKzQ3ODcsNiBAQAogCWlmIChzdGF0dXMpCiAJCWdvdG8gZXJyOwogCi0JYWRhcHRlci0+cG1hY19pZCA9IGtjYWxsb2MoYmVfbWF4X3VjKGFkYXB0ZXIpLAotCQkJCSAgIHNpemVvZigqYWRhcHRlci0+cG1hY19pZCksIEdGUF9LRVJORUwpOwotCWlmICghYWRhcHRlci0+cG1hY19pZCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAlzdGF0dXMgPSBiZV9tc2l4X2VuYWJsZShhZGFwdGVyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIGVycjsKQEAgLTQ1OTUsNiArNDg0Nyw5IEBACiAJaWYgKCFzdGF0dXMgJiYgYmVfcGF1c2Vfc3VwcG9ydGVkKGFkYXB0ZXIpKQogCQlhZGFwdGVyLT5waHkuZmNfYXV0b25lZyA9IDE7CiAKKwlpZiAoYmVfcGh5c2ZuKGFkYXB0ZXIpICYmICFsYW5jZXJfY2hpcChhZGFwdGVyKSkKKwkJYmVfY21kX3NldF9mZWF0dXJlcyhhZGFwdGVyKTsKKwogCWJlX3NjaGVkdWxlX3dvcmtlcihhZGFwdGVyKTsKIAlhZGFwdGVyLT5mbGFncyB8PSBCRV9GTEFHU19TRVRVUF9ET05FOwogCXJldHVybiAwOwpAQCAtNDcyOCw2ICs0OTgzLDIzIEBACiAJCQkJICAgICAgIDAsIDAsIG5sZmxhZ3MsIGZpbHRlcl9tYXNrLCBOVUxMKTsKIH0KIAorc3RhdGljIHN0cnVjdCBiZV9jbWRfd29yayAqYmVfYWxsb2Nfd29yayhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJIHZvaWQgKCpmdW5jKShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKikpCit7CisJc3RydWN0IGJlX2NtZF93b3JrICp3b3JrOworCisJd29yayA9IGt6YWxsb2Moc2l6ZW9mKCp3b3JrKSwgR0ZQX0FUT01JQyk7CisJaWYgKCF3b3JrKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCSJiZV93b3JrIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCUlOSVRfV09SSygmd29yay0+d29yaywgZnVuYyk7CisJd29yay0+YWRhcHRlciA9IGFkYXB0ZXI7CisJcmV0dXJuIHdvcms7Cit9CisKIC8qIFZ4TEFOIG9mZmxvYWQgTm90ZXM6CiAgKgogICogVGhlIHN0YWNrIGRlZmluZXMgdHVubmVsIG9mZmxvYWQgZmxhZ3MgKGh3X2VuY19mZWF0dXJlcykgZm9yIElQIGFuZCBkb2Vzbid0CkBAIC00NzQyLDIzICs1MDE0LDE5IEBACiAgKiBhZGRzIG1vcmUgdGhhbiBvbmUgcG9ydCwgZGlzYWJsZSBvZmZsb2FkcyBhbmQgZG9uJ3QgcmUtZW5hYmxlIHRoZW0gYWdhaW4KICAqIHVudGlsIGFmdGVyIGFsbCB0aGUgdHVubmVscyBhcmUgcmVtb3ZlZC4KICAqLwotc3RhdGljIHZvaWQgYmVfYWRkX3Z4bGFuX3BvcnQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCSAgICAgIHN0cnVjdCB1ZHBfdHVubmVsX2luZm8gKnRpKQorc3RhdGljIHZvaWQgYmVfd29ya19hZGRfdnhsYW5fcG9ydChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBiZV9jbWRfd29yayAqY21kX3dvcmsgPQorCQkJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYmVfY21kX3dvcmssIHdvcmspOworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gY21kX3dvcmstPmFkYXB0ZXI7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYWRhcHRlci0+cGRldi0+ZGV2OwotCV9fYmUxNiBwb3J0ID0gdGktPnBvcnQ7CisJX19iZTE2IHBvcnQgPSBjbWRfd29yay0+aW5mby52eGxhbl9wb3J0OwogCWludCBzdGF0dXM7CiAKLQlpZiAodGktPnR5cGUgIT0gVURQX1RVTk5FTF9UWVBFX1ZYTEFOKQotCQlyZXR1cm47Ci0KLQlpZiAobGFuY2VyX2NoaXAoYWRhcHRlcikgfHwgQkV4X2NoaXAoYWRhcHRlcikgfHwgYmVfaXNfbWMoYWRhcHRlcikpCi0JCXJldHVybjsKLQogCWlmIChhZGFwdGVyLT52eGxhbl9wb3J0ID09IHBvcnQgJiYgYWRhcHRlci0+dnhsYW5fcG9ydF9jb3VudCkgewogCQlhZGFwdGVyLT52eGxhbl9wb3J0X2FsaWFzZXMrKzsKLQkJcmV0dXJuOworCQlnb3RvIGRvbmU7CiAJfQogCiAJaWYgKGFkYXB0ZXItPmZsYWdzICYgQkVfRkxBR1NfVlhMQU5fT0ZGTE9BRFMpIHsKQEAgLTQ3NzAsNyArNTAzOCw3IEBACiAJfQogCiAJaWYgKGFkYXB0ZXItPnZ4bGFuX3BvcnRfY291bnQrKyA+PSAxKQotCQlyZXR1cm47CisJCWdvdG8gZG9uZTsKIAogCXN0YXR1cyA9IGJlX2NtZF9tYW5hZ2VfaWZhY2UoYWRhcHRlciwgYWRhcHRlci0+aWZfaGFuZGxlLAogCQkJCSAgICAgT1BfQ09OVkVSVF9OT1JNQUxfVE9fVFVOTkVMKTsKQEAgLTQ3OTUsMjkgKzUwNjMsMjYgQEAKIAogCWRldl9pbmZvKGRldiwgIkVuYWJsZWQgVnhMQU4gb2ZmbG9hZHMgZm9yIFVEUCBwb3J0ICVkXG4iLAogCQkgYmUxNl90b19jcHUocG9ydCkpOwotCXJldHVybjsKKwlnb3RvIGRvbmU7CiBlcnI6CiAJYmVfZGlzYWJsZV92eGxhbl9vZmZsb2FkcyhhZGFwdGVyKTsKK2RvbmU6CisJa2ZyZWUoY21kX3dvcmspOwogfQogCi1zdGF0aWMgdm9pZCBiZV9kZWxfdnhsYW5fcG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJICAgICAgc3RydWN0IHVkcF90dW5uZWxfaW5mbyAqdGkpCitzdGF0aWMgdm9pZCBiZV93b3JrX2RlbF92eGxhbl9wb3J0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JX19iZTE2IHBvcnQgPSB0aS0+cG9ydDsKLQotCWlmICh0aS0+dHlwZSAhPSBVRFBfVFVOTkVMX1RZUEVfVlhMQU4pCi0JCXJldHVybjsKLQotCWlmIChsYW5jZXJfY2hpcChhZGFwdGVyKSB8fCBCRXhfY2hpcChhZGFwdGVyKSB8fCBiZV9pc19tYyhhZGFwdGVyKSkKLQkJcmV0dXJuOworCXN0cnVjdCBiZV9jbWRfd29yayAqY21kX3dvcmsgPQorCQkJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYmVfY21kX3dvcmssIHdvcmspOworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gY21kX3dvcmstPmFkYXB0ZXI7CisJX19iZTE2IHBvcnQgPSBjbWRfd29yay0+aW5mby52eGxhbl9wb3J0OwogCiAJaWYgKGFkYXB0ZXItPnZ4bGFuX3BvcnQgIT0gcG9ydCkKIAkJZ290byBkb25lOwogCiAJaWYgKGFkYXB0ZXItPnZ4bGFuX3BvcnRfYWxpYXNlcykgewogCQlhZGFwdGVyLT52eGxhbl9wb3J0X2FsaWFzZXMtLTsKLQkJcmV0dXJuOworCQlnb3RvIG91dDsKIAl9CiAKIAliZV9kaXNhYmxlX3Z4bGFuX29mZmxvYWRzKGFkYXB0ZXIpOwpAQCAtNDgyNyw2ICs1MDkyLDQwIEBACiAJCSBiZTE2X3RvX2NwdShwb3J0KSk7CiBkb25lOgogCWFkYXB0ZXItPnZ4bGFuX3BvcnRfY291bnQtLTsKK291dDoKKwlrZnJlZShjbWRfd29yayk7Cit9CisKK3N0YXRpYyB2b2lkIGJlX2NmZ192eGxhbl9wb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgICBzdHJ1Y3QgdWRwX3R1bm5lbF9pbmZvICp0aSwKKwkJCSAgICAgIHZvaWQgKCpmdW5jKShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKikpCit7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBiZV9jbWRfd29yayAqY21kX3dvcms7CisKKwlpZiAodGktPnR5cGUgIT0gVURQX1RVTk5FTF9UWVBFX1ZYTEFOKQorCQlyZXR1cm47CisKKwlpZiAobGFuY2VyX2NoaXAoYWRhcHRlcikgfHwgQkV4X2NoaXAoYWRhcHRlcikgfHwgYmVfaXNfbWMoYWRhcHRlcikpCisJCXJldHVybjsKKworCWNtZF93b3JrID0gYmVfYWxsb2Nfd29yayhhZGFwdGVyLCBmdW5jKTsKKwlpZiAoY21kX3dvcmspIHsKKwkJY21kX3dvcmstPmluZm8udnhsYW5fcG9ydCA9IHRpLT5wb3J0OworCQlxdWV1ZV93b3JrKGJlX3dxLCAmY21kX3dvcmstPndvcmspOworCX0KK30KKworc3RhdGljIHZvaWQgYmVfZGVsX3Z4bGFuX3BvcnQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgICAgIHN0cnVjdCB1ZHBfdHVubmVsX2luZm8gKnRpKQoreworCWJlX2NmZ192eGxhbl9wb3J0KG5ldGRldiwgdGksIGJlX3dvcmtfZGVsX3Z4bGFuX3BvcnQpOworfQorCitzdGF0aWMgdm9pZCBiZV9hZGRfdnhsYW5fcG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgICAgc3RydWN0IHVkcF90dW5uZWxfaW5mbyAqdGkpCit7CisJYmVfY2ZnX3Z4bGFuX3BvcnQobmV0ZGV2LCB0aSwgYmVfd29ya19hZGRfdnhsYW5fcG9ydCk7CiB9CiAKIHN0YXRpYyBuZXRkZXZfZmVhdHVyZXNfdCBiZV9mZWF0dXJlc19jaGVjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtNDg5MSw2ICs1MTkwLDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGJlX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBiZV9jbWRfd29yayAqd29yazsKKworCXdvcmsgPSBiZV9hbGxvY193b3JrKGFkYXB0ZXIsIGJlX3dvcmtfc2V0X3J4X21vZGUpOworCWlmICh3b3JrKQorCQlxdWV1ZV93b3JrKGJlX3dxLCAmd29yay0+d29yayk7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgYmVfbmV0ZGV2X29wcyA9IHsKIAkubmRvX29wZW4JCT0gYmVfb3BlbiwKIAkubmRvX3N0b3AJCT0gYmVfY2xvc2UsCkBAIC00OTg0LDEzICs1MjkzLDE0NSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBiZV9zb2Z0X3Jlc2V0KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCXUzMiB2YWw7CisKKwlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCAiSW5pdGlhdGluZyBjaGlwIHNvZnQgcmVzZXRcbiIpOworCXZhbCA9IGlvcmVhZDMyKGFkYXB0ZXItPnBjaWNmZyArIFNMSVBPUlRfU09GVFJFU0VUX09GRlNFVCk7CisJdmFsIHw9IFNMSVBPUlRfU09GVFJFU0VUX1NSX01BU0s7CisJaW93cml0ZTMyKHZhbCwgYWRhcHRlci0+cGNpY2ZnICsgU0xJUE9SVF9TT0ZUUkVTRVRfT0ZGU0VUKTsKK30KKworc3RhdGljIGJvb2wgYmVfZXJyX2lzX3JlY292ZXJhYmxlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBiZV9lcnJvcl9yZWNvdmVyeSAqZXJyX3JlYyA9ICZhZGFwdGVyLT5lcnJvcl9yZWNvdmVyeTsKKwl1bnNpZ25lZCBsb25nIGluaXRpYWxfaWRsZV90aW1lID0KKwkJbXNlY3NfdG9famlmZmllcyhFUlJfUkVDT1ZFUllfSURMRV9USU1FKTsKKwl1bnNpZ25lZCBsb25nIHJlY292ZXJ5X2ludGVydmFsID0KKwkJbXNlY3NfdG9famlmZmllcyhFUlJfUkVDT1ZFUllfSU5URVJWQUwpOworCXUxNiB1ZV9lcnJfY29kZTsKKwl1MzIgdmFsOworCisJdmFsID0gYmVfUE9TVF9zdGFnZV9nZXQoYWRhcHRlcik7CisJaWYgKCh2YWwgJiBQT1NUX1NUQUdFX1JFQ09WRVJBQkxFX0VSUikgIT0gUE9TVF9TVEFHRV9SRUNPVkVSQUJMRV9FUlIpCisJCXJldHVybiBmYWxzZTsKKwl1ZV9lcnJfY29kZSA9IHZhbCAmIFBPU1RfRVJSX1JFQ09WRVJZX0NPREVfTUFTSzsKKwlpZiAodWVfZXJyX2NvZGUgPT0gMCkKKwkJcmV0dXJuIGZhbHNlOworCisJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiUmVjb3ZlcmFibGUgSFcgZXJyb3IgY29kZTogMHgleFxuIiwKKwkJdWVfZXJyX2NvZGUpOworCisJaWYgKGppZmZpZXMgLSBlcnJfcmVjLT5wcm9iZV90aW1lIDw9IGluaXRpYWxfaWRsZV90aW1lKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCSJDYW5ub3QgcmVjb3ZlciB3aXRoaW4gJWx1IHNlYyBmcm9tIGRyaXZlciBsb2FkXG4iLAorCQkJamlmZmllc190b19tc2Vjcyhpbml0aWFsX2lkbGVfdGltZSkgLyBNU0VDX1BFUl9TRUMpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKGVycl9yZWMtPmxhc3RfcmVjb3ZlcnlfdGltZSAmJgorCSAgICAoamlmZmllcyAtIGVycl9yZWMtPmxhc3RfcmVjb3ZlcnlfdGltZSA8PSByZWNvdmVyeV9pbnRlcnZhbCkpIHsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJIkNhbm5vdCByZWNvdmVyIHdpdGhpbiAlbHUgc2VjIGZyb20gbGFzdCByZWNvdmVyeVxuIiwKKwkJCWppZmZpZXNfdG9fbXNlY3MocmVjb3ZlcnlfaW50ZXJ2YWwpIC8gTVNFQ19QRVJfU0VDKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmICh1ZV9lcnJfY29kZSA9PSBlcnJfcmVjLT5sYXN0X2Vycl9jb2RlKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCSJDYW5ub3QgcmVjb3ZlciBmcm9tIGEgY29uc2VjdXRpdmUgVFBFIGVycm9yXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWVycl9yZWMtPmxhc3RfcmVjb3ZlcnlfdGltZSA9IGppZmZpZXM7CisJZXJyX3JlYy0+bGFzdF9lcnJfY29kZSA9IHVlX2Vycl9jb2RlOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IGJlX3RwZV9yZWNvdmVyKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBiZV9lcnJvcl9yZWNvdmVyeSAqZXJyX3JlYyA9ICZhZGFwdGVyLT5lcnJvcl9yZWNvdmVyeTsKKwlpbnQgc3RhdHVzID0gLUVBR0FJTjsKKwl1MzIgdmFsOworCisJc3dpdGNoIChlcnJfcmVjLT5yZWNvdmVyeV9zdGF0ZSkgeworCWNhc2UgRVJSX1JFQ09WRVJZX1NUX05PTkU6CisJCWVycl9yZWMtPnJlY292ZXJ5X3N0YXRlID0gRVJSX1JFQ09WRVJZX1NUX0RFVEVDVDsKKwkJZXJyX3JlYy0+cmVzY2hlZF9kZWxheSA9IEVSUl9SRUNPVkVSWV9VRV9ERVRFQ1RfRFVSQVRJT047CisJCWJyZWFrOworCisJY2FzZSBFUlJfUkVDT1ZFUllfU1RfREVURUNUOgorCQl2YWwgPSBiZV9QT1NUX3N0YWdlX2dldChhZGFwdGVyKTsKKwkJaWYgKCh2YWwgJiBQT1NUX1NUQUdFX1JFQ09WRVJBQkxFX0VSUikgIT0KKwkJICAgIFBPU1RfU1RBR0VfUkVDT1ZFUkFCTEVfRVJSKSB7CisJCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkJIlVucmVjb3ZlcmFibGUgSFcgZXJyb3IgZGV0ZWN0ZWQ6IDB4JXhcbiIsIHZhbCk7CisJCQlzdGF0dXMgPSAtRUlOVkFMOworCQkJZXJyX3JlYy0+cmVzY2hlZF9kZWxheSA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgIlJlY292ZXJhYmxlIEhXIGVycm9yIGRldGVjdGVkXG4iKTsKKworCQkvKiBPbmx5IFBGMCBpbml0aWF0ZXMgQ2hpcCBTb2Z0IFJlc2V0LiBCdXQgUEYwIG11c3Qgd2FpdCBVRTJTUgorCQkgKiBtaWxsaXNlY29uZHMgYmVmb3JlIGl0IGNoZWNrcyBmb3IgZmluYWwgZXJyb3Igc3RhdHVzIGluCisJCSAqIFNMSVBPUlRfU0VNQVBIT1JFIHRvIGRldGVybWluZSBpZiByZWNvdmVyeSBjcml0ZXJpYSBpcyBtZXQuCisJCSAqIElmIGl0IGRvZXMsIHRoZW4gUEYwIGluaXRpYXRlcyBhIFNvZnQgUmVzZXQuCisJCSAqLworCQlpZiAoYWRhcHRlci0+cGZfbnVtID09IDApIHsKKwkJCWVycl9yZWMtPnJlY292ZXJ5X3N0YXRlID0gRVJSX1JFQ09WRVJZX1NUX1JFU0VUOworCQkJZXJyX3JlYy0+cmVzY2hlZF9kZWxheSA9IGVycl9yZWMtPnVlX3RvX3Jlc2V0X3RpbWUgLQorCQkJCQlFUlJfUkVDT1ZFUllfVUVfREVURUNUX0RVUkFUSU9OOworCQkJYnJlYWs7CisJCX0KKworCQllcnJfcmVjLT5yZWNvdmVyeV9zdGF0ZSA9IEVSUl9SRUNPVkVSWV9TVF9QUkVfUE9MTDsKKwkJZXJyX3JlYy0+cmVzY2hlZF9kZWxheSA9IGVycl9yZWMtPnVlX3RvX3BvbGxfdGltZSAtCisJCQkJCUVSUl9SRUNPVkVSWV9VRV9ERVRFQ1RfRFVSQVRJT047CisJCWJyZWFrOworCisJY2FzZSBFUlJfUkVDT1ZFUllfU1RfUkVTRVQ6CisJCWlmICghYmVfZXJyX2lzX3JlY292ZXJhYmxlKGFkYXB0ZXIpKSB7CisJCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkJIkZhaWxlZCB0byBtZWV0IHJlY292ZXJ5IGNyaXRlcmlhXG4iKTsKKwkJCXN0YXR1cyA9IC1FSU87CisJCQllcnJfcmVjLT5yZXNjaGVkX2RlbGF5ID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWJlX3NvZnRfcmVzZXQoYWRhcHRlcik7CisJCWVycl9yZWMtPnJlY292ZXJ5X3N0YXRlID0gRVJSX1JFQ09WRVJZX1NUX1BSRV9QT0xMOworCQllcnJfcmVjLT5yZXNjaGVkX2RlbGF5ID0gZXJyX3JlYy0+dWVfdG9fcG9sbF90aW1lIC0KKwkJCQkJZXJyX3JlYy0+dWVfdG9fcmVzZXRfdGltZTsKKwkJYnJlYWs7CisKKwljYXNlIEVSUl9SRUNPVkVSWV9TVF9QUkVfUE9MTDoKKwkJZXJyX3JlYy0+cmVjb3Zlcnlfc3RhdGUgPSBFUlJfUkVDT1ZFUllfU1RfUkVJTklUOworCQllcnJfcmVjLT5yZXNjaGVkX2RlbGF5ID0gMDsKKwkJc3RhdHVzID0gMDsJCQkvKiBkb25lICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwkJZXJyX3JlYy0+cmVzY2hlZF9kZWxheSA9IDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKIHN0YXRpYyBpbnQgYmVfZXJyX3JlY292ZXIoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJaW50IHN0YXR1czsKIAotCS8qIEVycm9yIHJlY292ZXJ5IGlzIHN1cHBvcnRlZCBvbmx5IExhbmNlciBhcyBvZiBub3cgKi8KLQlpZiAoIWxhbmNlcl9jaGlwKGFkYXB0ZXIpKQotCQlyZXR1cm4gLUVJTzsKKwlpZiAoIWxhbmNlcl9jaGlwKGFkYXB0ZXIpKSB7CisJCWlmICghYWRhcHRlci0+ZXJyb3JfcmVjb3ZlcnkucmVjb3Zlcnlfc3VwcG9ydGVkIHx8CisJCSAgICBhZGFwdGVyLT5wcml2X2ZsYWdzICYgQkVfRElTQUJMRV9UUEVfUkVDT1ZFUlkpCisJCQlyZXR1cm4gLUVJTzsKKwkJc3RhdHVzID0gYmVfdHBlX3JlY292ZXIoYWRhcHRlcik7CisJCWlmIChzdGF0dXMpCisJCQlnb3RvIGVycjsKKwl9CiAKIAkvKiBXYWl0IGZvciBhZGFwdGVyIHRvIHJlYWNoIHF1aWVzY2VudCBzdGF0ZSBiZWZvcmUKIAkgKiBkZXN0cm95aW5nIHF1ZXVlcwpAQCAtNDk5OSw1OSArNTQ0MCw3NCBAQAogCWlmIChzdGF0dXMpCiAJCWdvdG8gZXJyOwogCisJYWRhcHRlci0+ZmxhZ3MgfD0gQkVfRkxBR1NfVFJZX1JFQ09WRVJZOworCiAJYmVfY2xlYW51cChhZGFwdGVyKTsKIAogCXN0YXR1cyA9IGJlX3Jlc3VtZShhZGFwdGVyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIGVycjsKIAotCXJldHVybiAwOworCWFkYXB0ZXItPmZsYWdzICY9IH5CRV9GTEFHU19UUllfUkVDT1ZFUlk7CisKIGVycjoKIAlyZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0aWMgdm9pZCBiZV9lcnJfZGV0ZWN0aW9uX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogeworCXN0cnVjdCBiZV9lcnJvcl9yZWNvdmVyeSAqZXJyX3JlYyA9CisJCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGJlX2Vycm9yX3JlY292ZXJ5LAorCQkJCSAgICAgZXJyX2RldGVjdGlvbl93b3JrLndvcmspOwogCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0KLQkJCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGJlX2FkYXB0ZXIsCi0JCQkJCSAgICAgYmVfZXJyX2RldGVjdGlvbl93b3JrLndvcmspOworCQkJY29udGFpbmVyX29mKGVycl9yZWMsIHN0cnVjdCBiZV9hZGFwdGVyLAorCQkJCSAgICAgZXJyb3JfcmVjb3ZlcnkpOworCXUzMiByZXNjaGVkX2RlbGF5ID0gRVJSX1JFQ09WRVJZX0RFVEVDVElPTl9ERUxBWTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYWRhcHRlci0+cGRldi0+ZGV2OwogCWludCByZWNvdmVyeV9zdGF0dXM7Ci0JaW50IGRlbGF5ID0gRVJSX0RFVEVDVElPTl9ERUxBWTsKIAogCWJlX2RldGVjdF9lcnJvcihhZGFwdGVyKTsKLQotCWlmIChiZV9jaGVja19lcnJvcihhZGFwdGVyLCBCRV9FUlJPUl9IVykpCi0JCXJlY292ZXJ5X3N0YXR1cyA9IGJlX2Vycl9yZWNvdmVyKGFkYXB0ZXIpOwotCWVsc2UKKwlpZiAoIWJlX2NoZWNrX2Vycm9yKGFkYXB0ZXIsIEJFX0VSUk9SX0hXKSkKIAkJZ290byByZXNjaGVkdWxlX3Rhc2s7CiAKKwlyZWNvdmVyeV9zdGF0dXMgPSBiZV9lcnJfcmVjb3ZlcihhZGFwdGVyKTsKIAlpZiAoIXJlY292ZXJ5X3N0YXR1cykgewotCQlhZGFwdGVyLT5yZWNvdmVyeV9yZXRyaWVzID0gMDsKKwkJZXJyX3JlYy0+cmVjb3ZlcnlfcmV0cmllcyA9IDA7CisJCWVycl9yZWMtPnJlY292ZXJ5X3N0YXRlID0gRVJSX1JFQ09WRVJZX1NUX05PTkU7CiAJCWRldl9pbmZvKGRldiwgIkFkYXB0ZXIgcmVjb3Zlcnkgc3VjY2Vzc2Z1bFxuIik7CiAJCWdvdG8gcmVzY2hlZHVsZV90YXNrOwotCX0gZWxzZSBpZiAoYmVfdmlydGZuKGFkYXB0ZXIpKSB7CisJfSBlbHNlIGlmICghbGFuY2VyX2NoaXAoYWRhcHRlcikgJiYgZXJyX3JlYy0+cmVzY2hlZF9kZWxheSkgeworCQkvKiBCRXgvU0ggcmVjb3Zlcnkgc3RhdGUgbWFjaGluZSAqLworCQlpZiAoYWRhcHRlci0+cGZfbnVtID09IDAgJiYKKwkJICAgIGVycl9yZWMtPnJlY292ZXJ5X3N0YXRlID4gRVJSX1JFQ09WRVJZX1NUX0RFVEVDVCkKKwkJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkiQWRhcHRlciByZWNvdmVyeSBpbiBwcm9ncmVzc1xuIik7CisJCXJlc2NoZWRfZGVsYXkgPSBlcnJfcmVjLT5yZXNjaGVkX2RlbGF5OworCQlnb3RvIHJlc2NoZWR1bGVfdGFzazsKKwl9IGVsc2UgaWYgKGxhbmNlcl9jaGlwKGFkYXB0ZXIpICYmIGJlX3ZpcnRmbihhZGFwdGVyKSkgewogCQkvKiBGb3IgVkZzLCBjaGVjayBpZiBQRiBoYXZlIGFsbG9jYXRlZCByZXNvdXJjZXMKIAkJICogZXZlcnkgc2Vjb25kLgogCQkgKi8KIAkJZGV2X2VycihkZXYsICJSZS10cnlpbmcgYWRhcHRlciByZWNvdmVyeVxuIik7CiAJCWdvdG8gcmVzY2hlZHVsZV90YXNrOwotCX0gZWxzZSBpZiAoYWRhcHRlci0+cmVjb3ZlcnlfcmV0cmllcysrIDwKLQkJICAgTUFYX0VSUl9SRUNPVkVSWV9SRVRSWV9DT1VOVCkgeworCX0gZWxzZSBpZiAobGFuY2VyX2NoaXAoYWRhcHRlcikgJiYgZXJyX3JlYy0+cmVjb3ZlcnlfcmV0cmllcysrIDwKKwkJICAgRVJSX1JFQ09WRVJZX01BWF9SRVRSWV9DT1VOVCkgewogCQkvKiBJbiBjYXNlIG9mIGFub3RoZXIgZXJyb3IgZHVyaW5nIHJlY292ZXJ5LCBpdCB0YWtlcyAzMCBzZWMKIAkJICogZm9yIGFkYXB0ZXIgdG8gY29tZSBvdXQgb2YgZXJyb3IuIFJldHJ5IGVycm9yIHJlY292ZXJ5IGFmdGVyCiAJCSAqIHRoaXMgdGltZSBpbnRlcnZhbC4KIAkJICovCiAJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgIlJlLXRyeWluZyBhZGFwdGVyIHJlY292ZXJ5XG4iKTsKLQkJZGVsYXkgPSBFUlJfUkVDT1ZFUllfUkVUUllfREVMQVk7CisJCXJlc2NoZWRfZGVsYXkgPSBFUlJfUkVDT1ZFUllfUkVUUllfREVMQVk7CiAJCWdvdG8gcmVzY2hlZHVsZV90YXNrOwogCX0gZWxzZSB7CiAJCWRldl9lcnIoZGV2LCAiQWRhcHRlciByZWNvdmVyeSBmYWlsZWRcbiIpOworCQlkZXZfZXJyKGRldiwgIlBsZWFzZSByZWJvb3Qgc2VydmVyIHRvIHJlY292ZXJcbiIpOwogCX0KIAogCXJldHVybjsKKwogcmVzY2hlZHVsZV90YXNrOgotCWJlX3NjaGVkdWxlX2Vycl9kZXRlY3Rpb24oYWRhcHRlciwgZGVsYXkpOworCWJlX3NjaGVkdWxlX2Vycl9kZXRlY3Rpb24oYWRhcHRlciwgcmVzY2hlZF9kZWxheSk7CiB9CiAKIHN0YXRpYyB2b2lkIGJlX2xvZ19zZnBfaW5mbyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKQEAgLTUxMTYsNyArNTU3Miw3IEBACiAKIHJlc2NoZWR1bGU6CiAJYWRhcHRlci0+d29ya19jb3VudGVyKys7Ci0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhZGFwdGVyLT53b3JrLCBtc2Vjc190b19qaWZmaWVzKDEwMDApKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsoYmVfd3EsICZhZGFwdGVyLT53b3JrLCBtc2Vjc190b19qaWZmaWVzKDEwMDApKTsKIH0KIAogc3RhdGljIHZvaWQgYmVfdW5tYXBfcGNpX2JhcnMoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC01MjU2LDE0ICs1NzEyLDE4IEBACiAJfQogCiAJbXV0ZXhfaW5pdCgmYWRhcHRlci0+bWJveF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2luaXQoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9pbml0KCZhZGFwdGVyLT5yeF9maWx0ZXJfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPm1jY19jcV9sb2NrKTsKIAlpbml0X2NvbXBsZXRpb24oJmFkYXB0ZXItPmV0X2NtZF9jb21wbCk7CiAKIAlwY2lfc2F2ZV9zdGF0ZShhZGFwdGVyLT5wZGV2KTsKIAogCUlOSVRfREVMQVlFRF9XT1JLKCZhZGFwdGVyLT53b3JrLCBiZV93b3JrZXIpOwotCUlOSVRfREVMQVlFRF9XT1JLKCZhZGFwdGVyLT5iZV9lcnJfZGV0ZWN0aW9uX3dvcmssCisKKwlhZGFwdGVyLT5lcnJvcl9yZWNvdmVyeS5yZWNvdmVyeV9zdGF0ZSA9IEVSUl9SRUNPVkVSWV9TVF9OT05FOworCWFkYXB0ZXItPmVycm9yX3JlY292ZXJ5LnJlc2NoZWRfZGVsYXkgPSAwOworCUlOSVRfREVMQVlFRF9XT1JLKCZhZGFwdGVyLT5lcnJvcl9yZWNvdmVyeS5lcnJfZGV0ZWN0aW9uX3dvcmssCiAJCQkgIGJlX2Vycl9kZXRlY3Rpb25fdGFzayk7CiAKIAlhZGFwdGVyLT5yeF9mYyA9IHRydWU7CkBAIC01Mjk4LDYgKzU3NTgsOSBAQAogCiAJYmVfY2xlYXIoYWRhcHRlcik7CiAKKwlpZiAoIXBjaV92ZnNfYXNzaWduZWQoYWRhcHRlci0+cGRldikpCisJCWJlX2NtZF9yZXNldF9mdW5jdGlvbihhZGFwdGVyKTsKKwogCS8qIHRlbGwgZncgd2UncmUgZG9uZSB3aXRoIGZpcmluZyBjbWRzICovCiAJYmVfY21kX2Z3X2NsZWFuKGFkYXB0ZXIpOwogCkBAIC01NDU0LDYgKzU5MTcsNyBAQAogCWJlX3JvY2VfZGV2X2FkZChhZGFwdGVyKTsKIAogCWJlX3NjaGVkdWxlX2Vycl9kZXRlY3Rpb24oYWRhcHRlciwgRVJSX0RFVEVDVElPTl9ERUxBWSk7CisJYWRhcHRlci0+ZXJyb3JfcmVjb3ZlcnkucHJvYmVfdGltZSA9IGppZmZpZXM7CiAKIAkvKiBPbiBEaWUgdGVtcGVyYXR1cmUgbm90IHN1cHBvcnRlZCBmb3IgVkYuICovCiAJaWYgKGJlX3BoeXNmbihhZGFwdGVyKSAmJiBJU19FTkFCTEVEKENPTkZJR19CRTJORVRfSFdNT04pKSB7CkBAIC01Njk5LDYgKzYxNjMsOCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBiZV9pbml0X21vZHVsZSh2b2lkKQogeworCWludCBzdGF0dXM7CisKIAlpZiAocnhfZnJhZ19zaXplICE9IDgxOTIgJiYgcnhfZnJhZ19zaXplICE9IDQwOTYgJiYKIAkgICAgcnhfZnJhZ19zaXplICE9IDIwNDgpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRQpAQCAtNTcxMiwxMiArNjE3OCwzMyBAQAogCQlwcl9pbmZvKERSVl9OQU1FICIgOiBVc2Ugc3lzZnMgbWV0aG9kIHRvIGVuYWJsZSBWRnNcbiIpOwogCX0KIAotCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZiZV9kcml2ZXIpOworCWJlX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImJlX3dxIik7CisJaWYgKCFiZV93cSkgeworCQlwcl93YXJuKERSVl9OQU1FICJ3b3JrcXVldWUgY3JlYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWJlX2Vycl9yZWNvdmVyeV93b3JrcSA9CisJCWNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJiZV9lcnJfcmVjb3ZlciIpOworCWlmICghYmVfZXJyX3JlY292ZXJ5X3dvcmtxKQorCQlwcl93YXJuKERSVl9OQU1FICJDb3VsZCBub3QgY3JlYXRlIGVycm9yIHJlY292ZXJ5IHdvcmtxdWV1ZVxuIik7CisKKwlzdGF0dXMgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZiZV9kcml2ZXIpOworCWlmIChzdGF0dXMpIHsKKwkJZGVzdHJveV93b3JrcXVldWUoYmVfd3EpOworCQliZV9kZXN0cm95X2Vycl9yZWNvdmVyeV93b3JrcSgpOworCX0KKwlyZXR1cm4gc3RhdHVzOwogfQogbW9kdWxlX2luaXQoYmVfaW5pdF9tb2R1bGUpOwogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYmVfZXhpdF9tb2R1bGUodm9pZCkKIHsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmJlX2RyaXZlcik7CisKKwliZV9kZXN0cm95X2Vycl9yZWNvdmVyeV93b3JrcSgpOworCisJaWYgKGJlX3dxKQorCQlkZXN0cm95X3dvcmtxdWV1ZShiZV93cSk7CiB9CiBtb2R1bGVfZXhpdChiZV9leGl0X21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mYXJhZGF5L2Z0Z21hYzEwMC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZmFyYWRheS9mdGdtYWMxMDAuYwppbmRleCAzNjM2MWY4Li4yNjI1ODcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mYXJhZGF5L2Z0Z21hYzEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZhcmFkYXkvZnRnbWFjMTAwLmMKQEAgLTYwLDYgKzYwLDggQEAKIAlzdHJ1Y3QgZnRnbWFjMTAwX2Rlc2NzICpkZXNjczsKIAlkbWFfYWRkcl90IGRlc2NzX2RtYV9hZGRyOwogCisJc3RydWN0IHBhZ2UgKnJ4X3BhZ2VzW1JYX1FVRVVFX0VOVFJJRVNdOworCiAJdW5zaWduZWQgaW50IHJ4X3BvaW50ZXI7CiAJdW5zaWduZWQgaW50IHR4X2NsZWFuX3BvaW50ZXI7CiAJdW5zaWduZWQgaW50IHR4X3BvaW50ZXI7CkBAIC03Nyw2ICs3OSw5IEBACiAJaW50IGludF9tYXNrX2FsbDsKIAlib29sIHVzZV9uY3NpOwogCWJvb2wgZW5hYmxlZDsKKworCXUzMiByeGRlczBfZWRvcnJfbWFzazsKKwl1MzIgdHhkZXMwX2Vkb3RyX21hc2s7CiB9OwogCiBzdGF0aWMgaW50IGZ0Z21hYzEwMF9hbGxvY19yeF9wYWdlKHN0cnVjdCBmdGdtYWMxMDAgKnByaXYsCkBAIC0yNTcsMTAgKzI2MiwxMSBAQAogCXJldHVybiByeGRlcy0+cnhkZXMwICYgY3B1X3RvX2xlMzIoRlRHTUFDMTAwX1JYREVTMF9SWFBLVF9SRFkpOwogfQogCi1zdGF0aWMgdm9pZCBmdGdtYWMxMDBfcnhkZXNfc2V0X2RtYV9vd24oc3RydWN0IGZ0Z21hYzEwMF9yeGRlcyAqcnhkZXMpCitzdGF0aWMgdm9pZCBmdGdtYWMxMDBfcnhkZXNfc2V0X2RtYV9vd24oY29uc3Qgc3RydWN0IGZ0Z21hYzEwMCAqcHJpdiwKKwkJCQkJc3RydWN0IGZ0Z21hYzEwMF9yeGRlcyAqcnhkZXMpCiB7CiAJLyogY2xlYXIgc3RhdHVzIGJpdHMgKi8KLQlyeGRlcy0+cnhkZXMwICY9IGNwdV90b19sZTMyKEZUR01BQzEwMF9SWERFUzBfRURPUlIpOworCXJ4ZGVzLT5yeGRlczAgJj0gY3B1X3RvX2xlMzIocHJpdi0+cnhkZXMwX2Vkb3JyX21hc2spOwogfQogCiBzdGF0aWMgYm9vbCBmdGdtYWMxMDBfcnhkZXNfcnhfZXJyb3Ioc3RydWN0IGZ0Z21hYzEwMF9yeGRlcyAqcnhkZXMpCkBAIC0yOTgsOSArMzA0LDEwIEBACiAJcmV0dXJuIHJ4ZGVzLT5yeGRlczAgJiBjcHVfdG9fbGUzMihGVEdNQUMxMDBfUlhERVMwX01VTFRJQ0FTVCk7CiB9CiAKLXN0YXRpYyB2b2lkIGZ0Z21hYzEwMF9yeGRlc19zZXRfZW5kX29mX3Jpbmcoc3RydWN0IGZ0Z21hYzEwMF9yeGRlcyAqcnhkZXMpCitzdGF0aWMgdm9pZCBmdGdtYWMxMDBfcnhkZXNfc2V0X2VuZF9vZl9yaW5nKGNvbnN0IHN0cnVjdCBmdGdtYWMxMDAgKnByaXYsCisJCQkJCSAgICBzdHJ1Y3QgZnRnbWFjMTAwX3J4ZGVzICpyeGRlcykKIHsKLQlyeGRlcy0+cnhkZXMwIHw9IGNwdV90b19sZTMyKEZUR01BQzEwMF9SWERFUzBfRURPUlIpOworCXJ4ZGVzLT5yeGRlczAgfD0gY3B1X3RvX2xlMzIocHJpdi0+cnhkZXMwX2Vkb3JyX21hc2spOwogfQogCiBzdGF0aWMgdm9pZCBmdGdtYWMxMDBfcnhkZXNfc2V0X2RtYV9hZGRyKHN0cnVjdCBmdGdtYWMxMDBfcnhkZXMgKnJ4ZGVzLApAQCAtMzQxLDE4ICszNDgsMjcgQEAKIAlyZXR1cm4gcnhkZXMtPnJ4ZGVzMSAmIGNwdV90b19sZTMyKEZUR01BQzEwMF9SWERFUzFfSVBfQ0hLU1VNX0VSUik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKipmdGdtYWMxMDBfcnhkZXNfcGFnZV9zbG90KHN0cnVjdCBmdGdtYWMxMDAgKnByaXYsCisJCQkJCQkgICAgICBzdHJ1Y3QgZnRnbWFjMTAwX3J4ZGVzICpyeGRlcykKK3sKKwlyZXR1cm4gJnByaXYtPnJ4X3BhZ2VzW3J4ZGVzIC0gcHJpdi0+ZGVzY3MtPnJ4ZGVzXTsKK30KKwogLyoKICAqIHJ4ZGVzMiBpcyBub3QgdXNlZCBieSBoYXJkd2FyZS4gV2UgdXNlIGl0IHRvIGtlZXAgdHJhY2sgb2YgcGFnZS4KICAqIFNpbmNlIGhhcmR3YXJlIGRvZXMgbm90IHRvdWNoIGl0LCB3ZSBjYW4gc2tpcCBjcHVfdG9fbGUzMigpL2xlMzJfdG9fY3B1KCkuCiAgKi8KLXN0YXRpYyB2b2lkIGZ0Z21hYzEwMF9yeGRlc19zZXRfcGFnZShzdHJ1Y3QgZnRnbWFjMTAwX3J4ZGVzICpyeGRlcywgc3RydWN0IHBhZ2UgKnBhZ2UpCitzdGF0aWMgdm9pZCBmdGdtYWMxMDBfcnhkZXNfc2V0X3BhZ2Uoc3RydWN0IGZ0Z21hYzEwMCAqcHJpdiwKKwkJCQkgICAgIHN0cnVjdCBmdGdtYWMxMDBfcnhkZXMgKnJ4ZGVzLAorCQkJCSAgICAgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JcnhkZXMtPnJ4ZGVzMiA9ICh1bnNpZ25lZCBpbnQpcGFnZTsKKwkqZnRnbWFjMTAwX3J4ZGVzX3BhZ2Vfc2xvdChwcml2LCByeGRlcykgPSBwYWdlOwogfQogCi1zdGF0aWMgc3RydWN0IHBhZ2UgKmZ0Z21hYzEwMF9yeGRlc19nZXRfcGFnZShzdHJ1Y3QgZnRnbWFjMTAwX3J4ZGVzICpyeGRlcykKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqZnRnbWFjMTAwX3J4ZGVzX2dldF9wYWdlKHN0cnVjdCBmdGdtYWMxMDAgKnByaXYsCisJCQkJCSAgICAgc3RydWN0IGZ0Z21hYzEwMF9yeGRlcyAqcnhkZXMpCiB7Ci0JcmV0dXJuIChzdHJ1Y3QgcGFnZSAqKXJ4ZGVzLT5yeGRlczI7CisJcmV0dXJuICpmdGdtYWMxMDBfcnhkZXNfcGFnZV9zbG90KHByaXYsIHJ4ZGVzKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzgyLDcgKzM5OCw3IEBACiAJCWlmIChmdGdtYWMxMDBfcnhkZXNfZmlyc3Rfc2VnbWVudChyeGRlcykpCiAJCQlyZXR1cm4gcnhkZXM7CiAKLQkJZnRnbWFjMTAwX3J4ZGVzX3NldF9kbWFfb3duKHJ4ZGVzKTsKKwkJZnRnbWFjMTAwX3J4ZGVzX3NldF9kbWFfb3duKHByaXYsIHJ4ZGVzKTsKIAkJZnRnbWFjMTAwX3J4X3BvaW50ZXJfYWR2YW5jZShwcml2KTsKIAkJcnhkZXMgPSBmdGdtYWMxMDBfY3VycmVudF9yeGRlcyhwcml2KTsKIAl9CkBAIC00NTMsNyArNDY5LDcgQEAKIAkJaWYgKGZ0Z21hYzEwMF9yeGRlc19sYXN0X3NlZ21lbnQocnhkZXMpKQogCQkJZG9uZSA9IHRydWU7CiAKLQkJZnRnbWFjMTAwX3J4ZGVzX3NldF9kbWFfb3duKHJ4ZGVzKTsKKwkJZnRnbWFjMTAwX3J4ZGVzX3NldF9kbWFfb3duKHByaXYsIHJ4ZGVzKTsKIAkJZnRnbWFjMTAwX3J4X3BvaW50ZXJfYWR2YW5jZShwcml2KTsKIAkJcnhkZXMgPSBmdGdtYWMxMDBfY3VycmVudF9yeGRlcyhwcml2KTsKIAl9IHdoaWxlICghZG9uZSAmJiBmdGdtYWMxMDBfcnhkZXNfcGFja2V0X3JlYWR5KHJ4ZGVzKSk7CkBAIC01MDEsNyArNTE3LDcgQEAKIAogCWRvIHsKIAkJZG1hX2FkZHJfdCBtYXAgPSBmdGdtYWMxMDBfcnhkZXNfZ2V0X2RtYV9hZGRyKHJ4ZGVzKTsKLQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBmdGdtYWMxMDBfcnhkZXNfZ2V0X3BhZ2UocnhkZXMpOworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGZ0Z21hYzEwMF9yeGRlc19nZXRfcGFnZShwcml2LCByeGRlcyk7CiAJCXVuc2lnbmVkIGludCBzaXplOwogCiAJCWRtYV91bm1hcF9wYWdlKHByaXYtPmRldiwgbWFwLCBSWF9CVUZfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKQEAgLTU0NSwxMCArNTYxLDExIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBpbnRlcm5hbCBmdW5jdGlvbnMgKHRyYW5zbWl0IGRlc2NyaXB0b3IpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBmdGdtYWMxMDBfdHhkZXNfcmVzZXQoc3RydWN0IGZ0Z21hYzEwMF90eGRlcyAqdHhkZXMpCitzdGF0aWMgdm9pZCBmdGdtYWMxMDBfdHhkZXNfcmVzZXQoY29uc3Qgc3RydWN0IGZ0Z21hYzEwMCAqcHJpdiwKKwkJCQkgIHN0cnVjdCBmdGdtYWMxMDBfdHhkZXMgKnR4ZGVzKQogewogCS8qIGNsZWFyIGFsbCBleGNlcHQgZW5kIG9mIHJpbmcgYml0ICovCi0JdHhkZXMtPnR4ZGVzMCAmPSBjcHVfdG9fbGUzMihGVEdNQUMxMDBfVFhERVMwX0VET1RSKTsKKwl0eGRlcy0+dHhkZXMwICY9IGNwdV90b19sZTMyKHByaXYtPnR4ZGVzMF9lZG90cl9tYXNrKTsKIAl0eGRlcy0+dHhkZXMxID0gMDsKIAl0eGRlcy0+dHhkZXMyID0gMDsKIAl0eGRlcy0+dHhkZXMzID0gMDsKQEAgLTU2OSw5ICs1ODYsMTAgQEAKIAl0eGRlcy0+dHhkZXMwIHw9IGNwdV90b19sZTMyKEZUR01BQzEwMF9UWERFUzBfVFhETUFfT1dOKTsKIH0KIAotc3RhdGljIHZvaWQgZnRnbWFjMTAwX3R4ZGVzX3NldF9lbmRfb2ZfcmluZyhzdHJ1Y3QgZnRnbWFjMTAwX3R4ZGVzICp0eGRlcykKK3N0YXRpYyB2b2lkIGZ0Z21hYzEwMF90eGRlc19zZXRfZW5kX29mX3JpbmcoY29uc3Qgc3RydWN0IGZ0Z21hYzEwMCAqcHJpdiwKKwkJCQkJICAgIHN0cnVjdCBmdGdtYWMxMDBfdHhkZXMgKnR4ZGVzKQogewotCXR4ZGVzLT50eGRlczAgfD0gY3B1X3RvX2xlMzIoRlRHTUFDMTAwX1RYREVTMF9FRE9UUik7CisJdHhkZXMtPnR4ZGVzMCB8PSBjcHVfdG9fbGUzMihwcml2LT50eGRlczBfZWRvdHJfbWFzayk7CiB9CiAKIHN0YXRpYyB2b2lkIGZ0Z21hYzEwMF90eGRlc19zZXRfZmlyc3Rfc2VnbWVudChzdHJ1Y3QgZnRnbWFjMTAwX3R4ZGVzICp0eGRlcykKQEAgLTY5MCw3ICs3MDgsNyBAQAogCiAJZGV2X2tmcmVlX3NrYihza2IpOwogCi0JZnRnbWFjMTAwX3R4ZGVzX3Jlc2V0KHR4ZGVzKTsKKwlmdGdtYWMxMDBfdHhkZXNfcmVzZXQocHJpdiwgdHhkZXMpOwogCiAJZnRnbWFjMTAwX3R4X2NsZWFuX3BvaW50ZXJfYWR2YW5jZShwcml2KTsKIApAQCAtNzc5LDkgKzc5Nyw5IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCWZ0Z21hYzEwMF9yeGRlc19zZXRfcGFnZShyeGRlcywgcGFnZSk7CisJZnRnbWFjMTAwX3J4ZGVzX3NldF9wYWdlKHByaXYsIHJ4ZGVzLCBwYWdlKTsKIAlmdGdtYWMxMDBfcnhkZXNfc2V0X2RtYV9hZGRyKHJ4ZGVzLCBtYXApOwotCWZ0Z21hYzEwMF9yeGRlc19zZXRfZG1hX293bihyeGRlcyk7CisJZnRnbWFjMTAwX3J4ZGVzX3NldF9kbWFfb3duKHByaXYsIHJ4ZGVzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzkxLDcgKzgwOSw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgUlhfUVVFVUVfRU5UUklFUzsgaSsrKSB7CiAJCXN0cnVjdCBmdGdtYWMxMDBfcnhkZXMgKnJ4ZGVzID0gJnByaXYtPmRlc2NzLT5yeGRlc1tpXTsKLQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBmdGdtYWMxMDBfcnhkZXNfZ2V0X3BhZ2UocnhkZXMpOworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGZ0Z21hYzEwMF9yeGRlc19nZXRfcGFnZShwcml2LCByeGRlcyk7CiAJCWRtYV9hZGRyX3QgbWFwID0gZnRnbWFjMTAwX3J4ZGVzX2dldF9kbWFfYWRkcihyeGRlcyk7CiAKIAkJaWYgKCFwYWdlKQpAQCAtODI4LDcgKzg0Niw4IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJLyogaW5pdGlhbGl6ZSBSWCByaW5nICovCi0JZnRnbWFjMTAwX3J4ZGVzX3NldF9lbmRfb2ZfcmluZygmcHJpdi0+ZGVzY3MtPnJ4ZGVzW1JYX1FVRVVFX0VOVFJJRVMgLSAxXSk7CisJZnRnbWFjMTAwX3J4ZGVzX3NldF9lbmRfb2ZfcmluZyhwcml2LAorCQkJCQkmcHJpdi0+ZGVzY3MtPnJ4ZGVzW1JYX1FVRVVFX0VOVFJJRVMgLSAxXSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgUlhfUVVFVUVfRU5UUklFUzsgaSsrKSB7CiAJCXN0cnVjdCBmdGdtYWMxMDBfcnhkZXMgKnJ4ZGVzID0gJnByaXYtPmRlc2NzLT5yeGRlc1tpXTsKQEAgLTgzOCw3ICs4NTcsOCBAQAogCX0KIAogCS8qIGluaXRpYWxpemUgVFggcmluZyAqLwotCWZ0Z21hYzEwMF90eGRlc19zZXRfZW5kX29mX3JpbmcoJnByaXYtPmRlc2NzLT50eGRlc1tUWF9RVUVVRV9FTlRSSUVTIC0gMV0pOworCWZ0Z21hYzEwMF90eGRlc19zZXRfZW5kX29mX3JpbmcocHJpdiwKKwkJCQkJJnByaXYtPmRlc2NzLT50eGRlc1tUWF9RVUVVRV9FTlRSSUVTIC0gMV0pOwogCXJldHVybiAwOwogCiBlcnI6CkBAIC0xMDU1LDE0ICsxMDc1LDEyIEBACiAJfQogCiAJaWYgKHN0YXR1cyAmIHByaXYtPmludF9tYXNrX2FsbCAmIChGVEdNQUMxMDBfSU5UX05PX1JYQlVGIHwKLQkJCUZUR01BQzEwMF9JTlRfUlBLVF9MT1NUIHwgRlRHTUFDMTAwX0lOVF9BSEJfRVJSIHwKLQkJCUZUR01BQzEwMF9JTlRfUEhZU1RTX0NIRykpIHsKKwkJCUZUR01BQzEwMF9JTlRfUlBLVF9MT1NUIHwgRlRHTUFDMTAwX0lOVF9BSEJfRVJSKSkgewogCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJbmV0ZGV2X2luZm8obmV0ZGV2LCAiW0lTUl0gPSAweCV4OiAlcyVzJXMlc1xuIiwgc3RhdHVzLAorCQkJbmV0ZGV2X2luZm8obmV0ZGV2LCAiW0lTUl0gPSAweCV4OiAlcyVzJXNcbiIsIHN0YXR1cywKIAkJCQkgICAgc3RhdHVzICYgRlRHTUFDMTAwX0lOVF9OT19SWEJVRiA/ICJOT19SWEJVRiAiIDogIiIsCiAJCQkJICAgIHN0YXR1cyAmIEZUR01BQzEwMF9JTlRfUlBLVF9MT1NUID8gIlJQS1RfTE9TVCAiIDogIiIsCi0JCQkJICAgIHN0YXR1cyAmIEZUR01BQzEwMF9JTlRfQUhCX0VSUiA/ICJBSEJfRVJSICIgOiAiIiwKLQkJCQkgICAgc3RhdHVzICYgRlRHTUFDMTAwX0lOVF9QSFlTVFNfQ0hHID8gIlBIWVNUU19DSEciIDogIiIpOworCQkJCSAgICBzdGF0dXMgJiBGVEdNQUMxMDBfSU5UX0FIQl9FUlIgPyAiQUhCX0VSUiAiIDogIiIpOwogCiAJCWlmIChzdGF0dXMgJiBGVEdNQUMxMDBfSU5UX05PX1JYQlVGKSB7CiAJCQkvKiBSWCBidWZmZXIgdW5hdmFpbGFibGUgKi8KQEAgLTEwOTIsNiArMTExMCw3IEBACiBzdGF0aWMgaW50IGZ0Z21hYzEwMF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJc3RydWN0IGZ0Z21hYzEwMCAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdW5zaWduZWQgaW50IHN0YXR1czsKIAlpbnQgZXJyOwogCiAJZXJyID0gZnRnbWFjMTAwX2FsbG9jX2J1ZmZlcnMocHJpdik7CkBAIC0xMTE3LDYgKzExMzYsMTEgQEAKIAogCWZ0Z21hYzEwMF9pbml0X2h3KHByaXYpOwogCWZ0Z21hYzEwMF9zdGFydF9odyhwcml2LCBwcml2LT51c2VfbmNzaSA/IDEwMCA6IDEwKTsKKworCS8qIENsZWFyIHN0YWxlIGludGVycnVwdHMgKi8KKwlzdGF0dXMgPSBpb3JlYWQzMihwcml2LT5iYXNlICsgRlRHTUFDMTAwX09GRlNFVF9JU1IpOworCWlvd3JpdGUzMihzdGF0dXMsIHByaXYtPmJhc2UgKyBGVEdNQUMxMDBfT0ZGU0VUX0lTUik7CisKIAlpZiAobmV0ZGV2LT5waHlkZXYpCiAJCXBoeV9zdGFydChuZXRkZXYtPnBoeWRldik7CiAJZWxzZSBpZiAocHJpdi0+dXNlX25jc2kpCkBAIC0xMTY2LDYgKzExOTAsOCBAQAogCW5hcGlfZGlzYWJsZSgmcHJpdi0+bmFwaSk7CiAJaWYgKG5ldGRldi0+cGh5ZGV2KQogCQlwaHlfc3RvcChuZXRkZXYtPnBoeWRldik7CisJZWxzZSBpZiAocHJpdi0+dXNlX25jc2kpCisJCW5jc2lfc3RvcF9kZXYocHJpdi0+bmRldik7CiAKIAlmdGdtYWMxMDBfc3RvcF9odyhwcml2KTsKIAlmcmVlX2lycShwcml2LT5pcnEsIG5ldGRldik7CkBAIC0xMjI2LDEyICsxMjUyLDIxIEBACiAJc3RydWN0IGZ0Z21hYzEwMCAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShwcml2LT5kZXYpOwogCWludCBpLCBlcnIgPSAwOworCXUzMiByZWc7CiAKIAkvKiBpbml0aWFsaXplIG1kaW8gYnVzICovCiAJcHJpdi0+bWlpX2J1cyA9IG1kaW9idXNfYWxsb2MoKTsKIAlpZiAoIXByaXYtPm1paV9idXMpCiAJCXJldHVybiAtRUlPOwogCisJaWYgKG9mX21hY2hpbmVfaXNfY29tcGF0aWJsZSgiYXNwZWVkLGFzdDI0MDAiKSB8fAorCSAgICBvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoImFzcGVlZCxhc3QyNTAwIikpIHsKKwkJLyogVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIG9sZCBNRElPIGludGVyZmFjZSAqLworCQlyZWcgPSBpb3JlYWQzMihwcml2LT5iYXNlICsgRlRHTUFDMTAwX09GRlNFVF9SRVZSKTsKKwkJcmVnICY9IH5GVEdNQUMxMDBfUkVWUl9ORVdfTURJT19JTlRFUkZBQ0U7CisJCWlvd3JpdGUzMihyZWcsIHByaXYtPmJhc2UgKyBGVEdNQUMxMDBfT0ZGU0VUX1JFVlIpOworCX07CisKIAlwcml2LT5taWlfYnVzLT5uYW1lID0gImZ0Z21hYzEwMF9tZGlvIjsKIAlzbnByaW50Zihwcml2LT5taWlfYnVzLT5pZCwgTUlJX0JVU19JRF9TSVpFLCAiJXMtJWQiLAogCQkgcGRldi0+bmFtZSwgcGRldi0+aWQpOwpAQCAtMTM1NSw5ICsxMzkwLDE4IEBACiAJCQkgICAgICBGVEdNQUMxMDBfSU5UX1hQS1RfRVRIIHwKIAkJCSAgICAgIEZUR01BQzEwMF9JTlRfWFBLVF9MT1NUIHwKIAkJCSAgICAgIEZUR01BQzEwMF9JTlRfQUhCX0VSUiB8Ci0JCQkgICAgICBGVEdNQUMxMDBfSU5UX1BIWVNUU19DSEcgfAogCQkJICAgICAgRlRHTUFDMTAwX0lOVF9SUEtUX0JVRiB8CiAJCQkgICAgICBGVEdNQUMxMDBfSU5UX05PX1JYQlVGKTsKKworCWlmIChvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoImFzcGVlZCxhc3QyNDAwIikgfHwKKwkgICAgb2ZfbWFjaGluZV9pc19jb21wYXRpYmxlKCJhc3BlZWQsYXN0MjUwMCIpKSB7CisJCXByaXYtPnJ4ZGVzMF9lZG9ycl9tYXNrID0gQklUKDMwKTsKKwkJcHJpdi0+dHhkZXMwX2Vkb3RyX21hc2sgPSBCSVQoMzApOworCX0gZWxzZSB7CisJCXByaXYtPnJ4ZGVzMF9lZG9ycl9tYXNrID0gQklUKDE1KTsKKwkJcHJpdi0+dHhkZXMwX2Vkb3RyX21hc2sgPSBCSVQoMTUpOworCX0KKwogCWlmIChwZGV2LT5kZXYub2Zfbm9kZSAmJgogCSAgICBvZl9nZXRfcHJvcGVydHkocGRldi0+ZGV2Lm9mX25vZGUsICJ1c2UtbmNzaSIsIE5VTEwpKSB7CiAJCWlmICghSVNfRU5BQkxFRChDT05GSUdfTkVUX05DU0kpKSB7CkBAIC0xMzY3LDcgKzE0MTEsNiBAQAogCiAJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJVc2luZyBOQ1NJIGludGVyZmFjZVxuIik7CiAJCXByaXYtPnVzZV9uY3NpID0gdHJ1ZTsKLQkJcHJpdi0+aW50X21hc2tfYWxsICY9IH5GVEdNQUMxMDBfSU5UX1BIWVNUU19DSEc7CiAJCXByaXYtPm5kZXYgPSBuY3NpX3JlZ2lzdGVyX2RldihuZXRkZXYsIGZ0Z21hYzEwMF9uY3NpX2hhbmRsZXIpOwogCQlpZiAoIXByaXYtPm5kZXYpCiAJCQlnb3RvIGVycl9uY3NpX2RldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZhcmFkYXkvZnRnbWFjMTAwLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mYXJhZGF5L2Z0Z21hYzEwMC5oCmluZGV4IDEzNDA4ZDQuLmE3Y2UwYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZhcmFkYXkvZnRnbWFjMTAwLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZmFyYWRheS9mdGdtYWMxMDAuaApAQCAtMTM0LDYgKzEzNCwxMSBAQAogI2RlZmluZSBGVEdNQUMxMDBfRE1BRklGT1NfVFhETUFfUkVRCQkoMSA8PCAzMSkKIAogLyoKKyAqIEZlYXR1cmUgUmVnaXN0ZXIKKyAqLworI2RlZmluZSBGVEdNQUMxMDBfUkVWUl9ORVdfTURJT19JTlRFUkZBQ0UJQklUKDMxKQorCisvKgogICogUmVjZWl2ZSBidWZmZXIgc2l6ZSByZWdpc3RlcgogICovCiAjZGVmaW5lIEZUR01BQzEwMF9SQlNSX1NJWkUoeCkJCSgoeCkgJiAweDNmZmYpCkBAIC0xNTIsNiArMTU3LDcgQEAKICNkZWZpbmUgRlRHTUFDMTAwX01BQ0NSX0ZVTExEVVAJCSgxIDw8IDgpCiAjZGVmaW5lIEZUR01BQzEwMF9NQUNDUl9HSUdBX01PREUJKDEgPDwgOSkKICNkZWZpbmUgRlRHTUFDMTAwX01BQ0NSX0NSQ19BUEQJCSgxIDw8IDEwKQorI2RlZmluZSBGVEdNQUMxMDBfTUFDQ1JfUEhZX0xJTktfTEVWRUwJKDEgPDwgMTEpCiAjZGVmaW5lIEZUR01BQzEwMF9NQUNDUl9SWF9SVU5UCQkoMSA8PCAxMikKICNkZWZpbmUgRlRHTUFDMTAwX01BQ0NSX0pVTUJPX0xGCSgxIDw8IDEzKQogI2RlZmluZSBGVEdNQUMxMDBfTUFDQ1JfUlhfQUxMCQkoMSA8PCAxNCkKQEAgLTE4OSw3ICsxOTUsNiBAQAogfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKTsKIAogI2RlZmluZSBGVEdNQUMxMDBfVFhERVMwX1RYQlVGX1NJWkUoeCkJKCh4KSAmIDB4M2ZmZikKLSNkZWZpbmUgRlRHTUFDMTAwX1RYREVTMF9FRE9UUgkJKDEgPDwgMTUpCiAjZGVmaW5lIEZUR01BQzEwMF9UWERFUzBfQ1JDX0VSUgkoMSA8PCAxOSkKICNkZWZpbmUgRlRHTUFDMTAwX1RYREVTMF9MVFMJCSgxIDw8IDI4KQogI2RlZmluZSBGVEdNQUMxMDBfVFhERVMwX0ZUUwkJKDEgPDwgMjkpCkBAIC0yMTUsNyArMjIwLDYgQEAKIH0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSk7CiAKICNkZWZpbmUgRlRHTUFDMTAwX1JYREVTMF9WREJDCQkweDNmZmYKLSNkZWZpbmUgRlRHTUFDMTAwX1JYREVTMF9FRE9SUgkJKDEgPDwgMTUpCiAjZGVmaW5lIEZUR01BQzEwMF9SWERFUzBfTVVMVElDQVNUCSgxIDw8IDE2KQogI2RlZmluZSBGVEdNQUMxMDBfUlhERVMwX0JST0FEQ0FTVAkoMSA8PCAxNykKICNkZWZpbmUgRlRHTUFDMTAwX1JYREVTMF9SWF9FUlIJCSgxIDw8IDE4KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZlY19tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZmVjX21haW4uYwppbmRleCAwMWY3ZTgxLi40OGEwMzNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZmVjX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZmVjX21haW4uYwpAQCAtODksMTAgKzg5LDEwIEBACiAJCS5kcml2ZXJfZGF0YSA9IDAsCiAJfSwgewogCQkubmFtZSA9ICJpbXgyNS1mZWMiLAotCQkuZHJpdmVyX2RhdGEgPSBGRUNfUVVJUktfVVNFX0dBU0tFVCB8IEZFQ19RVUlSS19IQVNfUkFDQywKKwkJLmRyaXZlcl9kYXRhID0gRkVDX1FVSVJLX1VTRV9HQVNLRVQsCiAJfSwgewogCQkubmFtZSA9ICJpbXgyNy1mZWMiLAotCQkuZHJpdmVyX2RhdGEgPSBGRUNfUVVJUktfSEFTX1JBQ0MsCisJCS5kcml2ZXJfZGF0YSA9IDAsCiAJfSwgewogCQkubmFtZSA9ICJpbXgyOC1mZWMiLAogCQkuZHJpdmVyX2RhdGEgPSBGRUNfUVVJUktfRU5FVF9NQUMgfCBGRUNfUVVJUktfU1dBUF9GUkFNRSB8CkBAIC0xODAsNiArMTgwLDcgQEAKIC8qIEZFQyByZWNlaXZlIGFjY2VsZXJhdGlvbiAqLwogI2RlZmluZSBGRUNfUkFDQ19JUERJUwkJKDEgPDwgMSkKICNkZWZpbmUgRkVDX1JBQ0NfUFJPRElTCQkoMSA8PCAyKQorI2RlZmluZSBGRUNfUkFDQ19TSElGVDE2CUJJVCg3KQogI2RlZmluZSBGRUNfUkFDQ19PUFRJT05TCShGRUNfUkFDQ19JUERJUyB8IEZFQ19SQUNDX1BST0RJUykKIAogLyoKQEAgLTkxMiwxMyArOTEzLDExIEBACiAJICogZW5ldC1tYWMgcmVzZXQgd2lsbCByZXNldCBtYWMgYWRkcmVzcyByZWdpc3RlcnMgdG9vLAogCSAqIHNvIG5lZWQgdG8gcmVjb25maWd1cmUgaXQuCiAJICovCi0JaWYgKGZlcC0+cXVpcmtzICYgRkVDX1FVSVJLX0VORVRfTUFDKSB7Ci0JCW1lbWNweSgmdGVtcF9tYWMsIG5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0JCXdyaXRlbCgoX19mb3JjZSB1MzIpY3B1X3RvX2JlMzIodGVtcF9tYWNbMF0pLAotCQkgICAgICAgZmVwLT5od3AgKyBGRUNfQUREUl9MT1cpOwotCQl3cml0ZWwoKF9fZm9yY2UgdTMyKWNwdV90b19iZTMyKHRlbXBfbWFjWzFdKSwKLQkJICAgICAgIGZlcC0+aHdwICsgRkVDX0FERFJfSElHSCk7Ci0JfQorCW1lbWNweSgmdGVtcF9tYWMsIG5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJd3JpdGVsKChfX2ZvcmNlIHUzMiljcHVfdG9fYmUzMih0ZW1wX21hY1swXSksCisJICAgICAgIGZlcC0+aHdwICsgRkVDX0FERFJfTE9XKTsKKwl3cml0ZWwoKF9fZm9yY2UgdTMyKWNwdV90b19iZTMyKHRlbXBfbWFjWzFdKSwKKwkgICAgICAgZmVwLT5od3AgKyBGRUNfQUREUl9ISUdIKTsKIAogCS8qIENsZWFyIGFueSBvdXRzdGFuZGluZyBpbnRlcnJ1cHQuICovCiAJd3JpdGVsKDB4ZmZmZmZmZmYsIGZlcC0+aHdwICsgRkVDX0lFVkVOVCk7CkBAIC05NDUsOSArOTQ0LDExIEBACiAKICNpZiAhZGVmaW5lZChDT05GSUdfTTUyNzIpCiAJaWYgKGZlcC0+cXVpcmtzICYgRkVDX1FVSVJLX0hBU19SQUNDKSB7Ci0JCS8qIHNldCBSWCBjaGVja3N1bSAqLwogCQl2YWwgPSByZWFkbChmZXAtPmh3cCArIEZFQ19SQUNDKTsKKwkJLyogYWxpZ24gSVAgaGVhZGVyICovCisJCXZhbCB8PSBGRUNfUkFDQ19TSElGVDE2OwogCQlpZiAoZmVwLT5jc3VtX2ZsYWdzICYgRkxBR19SWF9DU1VNX0VOQUJMRUQpCisJCQkvKiBzZXQgUlggY2hlY2tzdW0gKi8KIAkJCXZhbCB8PSBGRUNfUkFDQ19PUFRJT05TOwogCQllbHNlCiAJCQl2YWwgJj0gfkZFQ19SQUNDX09QVElPTlM7CkBAIC0xNDI4LDYgKzE0MjksMTIgQEAKIAkJcHJlZmV0Y2goc2tiLT5kYXRhIC0gTkVUX0lQX0FMSUdOKTsKIAkJc2tiX3B1dChza2IsIHBrdF9sZW4gLSA0KTsKIAkJZGF0YSA9IHNrYi0+ZGF0YTsKKworI2lmICFkZWZpbmVkKENPTkZJR19NNTI3MikKKwkJaWYgKGZlcC0+cXVpcmtzICYgRkVDX1FVSVJLX0hBU19SQUNDKQorCQkJZGF0YSA9IHNrYl9wdWxsX2lubGluZShza2IsIDIpOworI2VuZGlmCisKIAkJaWYgKCFpc19jb3B5YnJlYWsgJiYgbmVlZF9zd2FwKQogCQkJc3dhcF9idWZmZXIoZGF0YSwgcGt0X2xlbik7CiAKQEAgLTI4ODcsNyArMjg5NCw3IEBACiAgKiB0aGlzIGtpbmQgb2YgZmVhdHVyZT8pLgogICovCiAKLSNkZWZpbmUgSEFTSF9CSVRTCTYJCS8qICNiaXRzIGluIGhhc2ggKi8KKyNkZWZpbmUgRkVDX0hBU0hfQklUUwk2CQkvKiAjYml0cyBpbiBoYXNoICovCiAjZGVmaW5lIENSQzMyX1BPTFkJMHhFREI4ODMyMAogCiBzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCkBAIC0yOTM1LDEwICsyOTQyLDEwIEBACiAJCQl9CiAJCX0KIAotCQkvKiBvbmx5IHVwcGVyIDYgYml0cyAoSEFTSF9CSVRTKSBhcmUgdXNlZAorCQkvKiBvbmx5IHVwcGVyIDYgYml0cyAoRkVDX0hBU0hfQklUUykgYXJlIHVzZWQKIAkJICogd2hpY2ggcG9pbnQgdG8gc3BlY2lmaWMgYml0IGluIGhlIGhhc2ggcmVnaXN0ZXJzCiAJCSAqLwotCQloYXNoID0gKGNyYyA+PiAoMzIgLSBIQVNIX0JJVFMpKSAmIDB4M2Y7CisJCWhhc2ggPSAoY3JjID4+ICgzMiAtIEZFQ19IQVNIX0JJVFMpKSAmIDB4M2Y7CiAKIAkJaWYgKGhhc2ggPiAzMSkgewogCQkJdG1wID0gcmVhZGwoZmVwLT5od3AgKyBGRUNfR1JQX0hBU0hfVEFCTEVfSElHSCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZm1hbi9mbWFuX21hYy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZtYW4vZm1hbl9tYWMuaAppbmRleCA4ZGRlZWRiLi5kZGYwMjYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZm1hbi9mbWFuX21hYy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mbWFuL2ZtYW5fbWFjLmgKQEAgLTE5Miw3ICsxOTIsNyBAQAogCS8qIEEgaGFuZGxlIHRvIHRoZSBGTSBvYmplY3QgdGhpcyBwb3J0IHJlbGF0ZWQgdG8gKi8KIAl2b2lkICpmbTsKIAkvKiBNRElPIGV4Y2VwdGlvbnMgaW50ZXJydXB0IHNvdXJjZSAtIG5vdCB2YWxpZCBmb3IgYWxsCi0JICogTUFDczsgTVVTVCBiZSBzZXQgdG8gJ05PX0lSUScgZm9yIE1BQ3MgdGhhdCBkb24ndCBoYXZlCisJICogTUFDczsgTVVTVCBiZSBzZXQgdG8gMCBmb3IgTUFDcyB0aGF0IGRvbid0IGhhdmUKIAkgKiBtZGlvLWlycSwgb3IgZm9yIHBvbGxpbmcKIAkgKi8KIAl2b2lkICpkZXZfaWQ7IC8qIGRldmljZSBjb29raWUgdXNlZCBieSB0aGUgZXhjZXB0aW9uIGNicyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzX2VuZXQvZnNfZW5ldC1tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9mc19lbmV0LW1haW4uYwppbmRleCA2MWZkNDg2Li5kYzEyMGMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9mc19lbmV0LW1haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9mc19lbmV0LW1haW4uYwpAQCAtNjAsNiArNjAsOSBAQAogTU9EVUxFX1BBUk1fREVTQyhmc19lbmV0X2RlYnVnLAogCQkgIkZyZWVzY2FsZSBiaXRtYXBwZWQgZGVidWdnaW5nIG1lc3NhZ2UgZW5hYmxlIHZhbHVlIik7CiAKKyNkZWZpbmUgUlhfUklOR19TSVpFCTMyCisjZGVmaW5lIFRYX1JJTkdfU0laRQk2NAorCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIHN0YXRpYyB2b2lkIGZzX2VuZXRfbmV0cG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKICNlbmRpZgpAQCAtNzksOCArODIsOCBAQAogCQlza2JfcmVzZXJ2ZShza2IsIGFsaWduIC0gb2ZmKTsKIH0KIAotLyogTkFQSSByZWNlaXZlIGZ1bmN0aW9uICovCi1zdGF0aWMgaW50IGZzX2VuZXRfcnhfbmFwaShzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpCisvKiBOQVBJIGZ1bmN0aW9uICovCitzdGF0aWMgaW50IGZzX2VuZXRfbmFwaShzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpCiB7CiAJc3RydWN0IGZzX2VuZXRfcHJpdmF0ZSAqZmVwID0gY29udGFpbmVyX29mKG5hcGksIHN0cnVjdCBmc19lbmV0X3ByaXZhdGUsIG5hcGkpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBmZXAtPm5kZXY7CkBAIC05MCwxNDcgKzkzLDE3IEBACiAJaW50IHJlY2VpdmVkID0gMDsKIAl1MTYgcGt0X2xlbiwgc2M7CiAJaW50IGN1cmlkeDsKLQotCWlmIChidWRnZXQgPD0gMCkKLQkJcmV0dXJuIHJlY2VpdmVkOwotCi0JLyoKLQkgKiBGaXJzdCwgZ3JhYiBhbGwgb2YgdGhlIHN0YXRzIGZvciB0aGUgaW5jb21pbmcgcGFja2V0LgotCSAqIFRoZXNlIGdldCBtZXNzZWQgdXAgaWYgd2UgZ2V0IGNhbGxlZCBkdWUgdG8gYSBidXN5IGNvbmRpdGlvbi4KLQkgKi8KLQliZHAgPSBmZXAtPmN1cl9yeDsKLQotCS8qIGNsZWFyIFJYIHN0YXR1cyBiaXRzIGZvciBuYXBpKi8KLQkoKmZlcC0+b3BzLT5uYXBpX2NsZWFyX3J4X2V2ZW50KShkZXYpOwotCi0Jd2hpbGUgKCgoc2MgPSBDQkRSX1NDKGJkcCkpICYgQkRfRU5FVF9SWF9FTVBUWSkgPT0gMCkgewotCQljdXJpZHggPSBiZHAgLSBmZXAtPnJ4X2JkX2Jhc2U7Ci0KLQkJLyoKLQkJICogU2luY2Ugd2UgaGF2ZSBhbGxvY2F0ZWQgc3BhY2UgdG8gaG9sZCBhIGNvbXBsZXRlIGZyYW1lLAotCQkgKiB0aGUgbGFzdCBpbmRpY2F0b3Igc2hvdWxkIGJlIHNldC4KLQkJICovCi0JCWlmICgoc2MgJiBCRF9FTkVUX1JYX0xBU1QpID09IDApCi0JCQlkZXZfd2FybihmZXAtPmRldiwgInJjdiBpcyBub3QgK2xhc3RcbiIpOwotCi0JCS8qCi0JCSAqIENoZWNrIGZvciBlcnJvcnMuCi0JCSAqLwotCQlpZiAoc2MgJiAoQkRfRU5FVF9SWF9MRyB8IEJEX0VORVRfUlhfU0ggfCBCRF9FTkVUX1JYX0NMIHwKLQkJCSAgQkRfRU5FVF9SWF9OTyB8IEJEX0VORVRfUlhfQ1IgfCBCRF9FTkVUX1JYX09WKSkgewotCQkJZmVwLT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJCS8qIEZyYW1lIHRvbyBsb25nIG9yIHRvbyBzaG9ydC4gKi8KLQkJCWlmIChzYyAmIChCRF9FTkVUX1JYX0xHIHwgQkRfRU5FVF9SWF9TSCkpCi0JCQkJZmVwLT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7Ci0JCQkvKiBGcmFtZSBhbGlnbm1lbnQgKi8KLQkJCWlmIChzYyAmIChCRF9FTkVUX1JYX05PIHwgQkRfRU5FVF9SWF9DTCkpCi0JCQkJZmVwLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKLQkJCS8qIENSQyBFcnJvciAqLwotCQkJaWYgKHNjICYgQkRfRU5FVF9SWF9DUikKLQkJCQlmZXAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKLQkJCS8qIEZJRk8gb3ZlcnJ1biAqLwotCQkJaWYgKHNjICYgQkRfRU5FVF9SWF9PVikKLQkJCQlmZXAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKLQotCQkJc2tiID0gZmVwLT5yeF9za2J1ZmZbY3VyaWR4XTsKLQotCQkJZG1hX3VubWFwX3NpbmdsZShmZXAtPmRldiwgQ0JEUl9CVUZBRERSKGJkcCksCi0JCQkJTDFfQ0FDSEVfQUxJR04oUEtUX01BWEJVRl9TSVpFKSwKLQkJCQlETUFfRlJPTV9ERVZJQ0UpOwotCi0JCQlza2JuID0gc2tiOwotCi0JCX0gZWxzZSB7Ci0JCQlza2IgPSBmZXAtPnJ4X3NrYnVmZltjdXJpZHhdOwotCi0JCQlkbWFfdW5tYXBfc2luZ2xlKGZlcC0+ZGV2LCBDQkRSX0JVRkFERFIoYmRwKSwKLQkJCQlMMV9DQUNIRV9BTElHTihQS1RfTUFYQlVGX1NJWkUpLAotCQkJCURNQV9GUk9NX0RFVklDRSk7Ci0KLQkJCS8qCi0JCQkgKiBQcm9jZXNzIHRoZSBpbmNvbWluZyBmcmFtZS4KLQkJCSAqLwotCQkJZmVwLT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JCQlwa3RfbGVuID0gQ0JEUl9EQVRMRU4oYmRwKSAtIDQ7CS8qIHJlbW92ZSBDUkMgKi8KLQkJCWZlcC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbiArIDQ7Ci0KLQkJCWlmIChwa3RfbGVuIDw9IGZwaS0+cnhfY29weWJyZWFrKSB7Ci0JCQkJLyogKzIgdG8gbWFrZSBJUCBoZWFkZXIgTDEgY2FjaGUgYWxpZ25lZCAqLwotCQkJCXNrYm4gPSBuZXRkZXZfYWxsb2Nfc2tiKGRldiwgcGt0X2xlbiArIDIpOwotCQkJCWlmIChza2JuICE9IE5VTEwpIHsKLQkJCQkJc2tiX3Jlc2VydmUoc2tibiwgMik7CS8qIGFsaWduIElQIGhlYWRlciAqLwotCQkJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwKLQkJCQkJCSAgICAgIHNrYm4tPmRhdGEsIHBrdF9sZW4pOwotCQkJCQlzd2FwKHNrYiwgc2tibik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlza2JuID0gbmV0ZGV2X2FsbG9jX3NrYihkZXYsIEVORVRfUlhfRlJTSVpFKTsKLQotCQkJCWlmIChza2JuKQotCQkJCQlza2JfYWxpZ24oc2tibiwgRU5FVF9SWF9BTElHTik7Ci0JCQl9Ci0KLQkJCWlmIChza2JuICE9IE5VTEwpIHsKLQkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CS8qIE1ha2Ugcm9vbSAqLwotCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7Ci0JCQkJcmVjZWl2ZWQrKzsKLQkJCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOwotCQkJfSBlbHNlIHsKLQkJCQlmZXAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKLQkJCQlza2JuID0gc2tiOwotCQkJfQotCQl9Ci0KLQkJZmVwLT5yeF9za2J1ZmZbY3VyaWR4XSA9IHNrYm47Ci0JCUNCRFdfQlVGQUREUihiZHAsIGRtYV9tYXBfc2luZ2xlKGZlcC0+ZGV2LCBza2JuLT5kYXRhLAotCQkJICAgICBMMV9DQUNIRV9BTElHTihQS1RfTUFYQlVGX1NJWkUpLAotCQkJICAgICBETUFfRlJPTV9ERVZJQ0UpKTsKLQkJQ0JEV19EQVRMRU4oYmRwLCAwKTsKLQkJQ0JEV19TQyhiZHAsIChzYyAmIH5CRF9FTkVUX1JYX1NUQVRTKSB8IEJEX0VORVRfUlhfRU1QVFkpOwotCi0JCS8qCi0JCSAqIFVwZGF0ZSBCRCBwb2ludGVyIHRvIG5leHQgZW50cnkuCi0JCSAqLwotCQlpZiAoKHNjICYgQkRfRU5FVF9SWF9XUkFQKSA9PSAwKQotCQkJYmRwKys7Ci0JCWVsc2UKLQkJCWJkcCA9IGZlcC0+cnhfYmRfYmFzZTsKLQotCQkoKmZlcC0+b3BzLT5yeF9iZF9kb25lKShkZXYpOwotCi0JCWlmIChyZWNlaXZlZCA+PSBidWRnZXQpCi0JCQlicmVhazsKLQl9Ci0KLQlmZXAtPmN1cl9yeCA9IGJkcDsKLQotCWlmIChyZWNlaXZlZCA8IGJ1ZGdldCkgewotCQkvKiBkb25lICovCi0JCW5hcGlfY29tcGxldGUobmFwaSk7Ci0JCSgqZmVwLT5vcHMtPm5hcGlfZW5hYmxlX3J4KShkZXYpOwotCX0KLQlyZXR1cm4gcmVjZWl2ZWQ7Ci19Ci0KLXN0YXRpYyBpbnQgZnNfZW5ldF90eF9uYXBpKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKLXsKLQlzdHJ1Y3QgZnNfZW5ldF9wcml2YXRlICpmZXAgPSBjb250YWluZXJfb2YobmFwaSwgc3RydWN0IGZzX2VuZXRfcHJpdmF0ZSwKLQkJCQkJCSAgIG5hcGlfdHgpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBmZXAtPm5kZXY7Ci0JY2JkX3QgX19pb21lbSAqYmRwOwotCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IGRpcnR5aWR4LCBkb193YWtlLCBkb19yZXN0YXJ0OwotCXUxNiBzYzsKLQlpbnQgaGFzX3R4X3dvcmsgPSAwOworCWludCB0eF9sZWZ0ID0gVFhfUklOR19TSVpFOwogCiAJc3Bpbl9sb2NrKCZmZXAtPnR4X2xvY2spOwogCWJkcCA9IGZlcC0+ZGlydHlfdHg7CiAKLQkvKiBjbGVhciBUWCBzdGF0dXMgYml0cyBmb3IgbmFwaSovCi0JKCpmZXAtPm9wcy0+bmFwaV9jbGVhcl90eF9ldmVudCkoZGV2KTsKKwkvKiBjbGVhciBzdGF0dXMgYml0cyBmb3IgbmFwaSovCisJKCpmZXAtPm9wcy0+bmFwaV9jbGVhcl9ldmVudCkoZGV2KTsKIAogCWRvX3dha2UgPSBkb19yZXN0YXJ0ID0gMDsKLQl3aGlsZSAoKChzYyA9IENCRFJfU0MoYmRwKSkgJiBCRF9FTkVUX1RYX1JFQURZKSA9PSAwKSB7CisJd2hpbGUgKCgoc2MgPSBDQkRSX1NDKGJkcCkpICYgQkRfRU5FVF9UWF9SRUFEWSkgPT0gMCAmJiB0eF9sZWZ0KSB7CiAJCWRpcnR5aWR4ID0gYmRwIC0gZmVwLT50eF9iZF9iYXNlOwogCiAJCWlmIChmZXAtPnR4X2ZyZWUgPT0gZmVwLT50eF9yaW5nKQpAQCAtMzAyLDkgKzE3NSw5IEBACiAJCSAqIFNpbmNlIHdlIGhhdmUgZnJlZWQgdXAgYSBidWZmZXIsIHRoZSByaW5nIGlzIG5vIGxvbmdlcgogCQkgKiBmdWxsLgogCQkgKi8KLQkJaWYgKCsrZmVwLT50eF9mcmVlID49IE1BWF9TS0JfRlJBR1MpCisJCWlmICgrK2ZlcC0+dHhfZnJlZSA9PSBNQVhfU0tCX0ZSQUdTKQogCQkJZG9fd2FrZSA9IDE7Ci0JCWhhc190eF93b3JrID0gMTsKKwkJdHhfbGVmdC0tOwogCX0KIAogCWZlcC0+ZGlydHlfdHggPSBiZHA7CkBAIC0zMTIsMTkgKzE4NSwxMjkgQEAKIAlpZiAoZG9fcmVzdGFydCkKIAkJKCpmZXAtPm9wcy0+dHhfcmVzdGFydCkoZGV2KTsKIAotCWlmICghaGFzX3R4X3dvcmspIHsKLQkJbmFwaV9jb21wbGV0ZShuYXBpKTsKLQkJKCpmZXAtPm9wcy0+bmFwaV9lbmFibGVfdHgpKGRldik7Ci0JfQotCiAJc3Bpbl91bmxvY2soJmZlcC0+dHhfbG9jayk7CiAKIAlpZiAoZG9fd2FrZSkKIAkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwogCi0JaWYgKGhhc190eF93b3JrKQotCQlyZXR1cm4gYnVkZ2V0OwotCXJldHVybiAwOworCS8qCisJICogRmlyc3QsIGdyYWIgYWxsIG9mIHRoZSBzdGF0cyBmb3IgdGhlIGluY29taW5nIHBhY2tldC4KKwkgKiBUaGVzZSBnZXQgbWVzc2VkIHVwIGlmIHdlIGdldCBjYWxsZWQgZHVlIHRvIGEgYnVzeSBjb25kaXRpb24uCisJICovCisJYmRwID0gZmVwLT5jdXJfcng7CisKKwl3aGlsZSAoKChzYyA9IENCRFJfU0MoYmRwKSkgJiBCRF9FTkVUX1JYX0VNUFRZKSA9PSAwICYmCisJICAgICAgIHJlY2VpdmVkIDwgYnVkZ2V0KSB7CisJCWN1cmlkeCA9IGJkcCAtIGZlcC0+cnhfYmRfYmFzZTsKKworCQkvKgorCQkgKiBTaW5jZSB3ZSBoYXZlIGFsbG9jYXRlZCBzcGFjZSB0byBob2xkIGEgY29tcGxldGUgZnJhbWUsCisJCSAqIHRoZSBsYXN0IGluZGljYXRvciBzaG91bGQgYmUgc2V0LgorCQkgKi8KKwkJaWYgKChzYyAmIEJEX0VORVRfUlhfTEFTVCkgPT0gMCkKKwkJCWRldl93YXJuKGZlcC0+ZGV2LCAicmN2IGlzIG5vdCArbGFzdFxuIik7CisKKwkJLyoKKwkJICogQ2hlY2sgZm9yIGVycm9ycy4KKwkJICovCisJCWlmIChzYyAmIChCRF9FTkVUX1JYX0xHIHwgQkRfRU5FVF9SWF9TSCB8IEJEX0VORVRfUlhfQ0wgfAorCQkJICBCRF9FTkVUX1JYX05PIHwgQkRfRU5FVF9SWF9DUiB8IEJEX0VORVRfUlhfT1YpKSB7CisJCQlmZXAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJLyogRnJhbWUgdG9vIGxvbmcgb3IgdG9vIHNob3J0LiAqLworCQkJaWYgKHNjICYgKEJEX0VORVRfUlhfTEcgfCBCRF9FTkVUX1JYX1NIKSkKKwkJCQlmZXAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCS8qIEZyYW1lIGFsaWdubWVudCAqLworCQkJaWYgKHNjICYgKEJEX0VORVRfUlhfTk8gfCBCRF9FTkVUX1JYX0NMKSkKKwkJCQlmZXAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJLyogQ1JDIEVycm9yICovCisJCQlpZiAoc2MgJiBCRF9FTkVUX1JYX0NSKQorCQkJCWZlcC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJLyogRklGTyBvdmVycnVuICovCisJCQlpZiAoc2MgJiBCRF9FTkVUX1JYX09WKQorCQkJCWZlcC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCisJCQlza2JuID0gZmVwLT5yeF9za2J1ZmZbY3VyaWR4XTsKKwkJfSBlbHNlIHsKKwkJCXNrYiA9IGZlcC0+cnhfc2tidWZmW2N1cmlkeF07CisKKwkJCS8qCisJCQkgKiBQcm9jZXNzIHRoZSBpbmNvbWluZyBmcmFtZS4KKwkJCSAqLworCQkJZmVwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlwa3RfbGVuID0gQ0JEUl9EQVRMRU4oYmRwKSAtIDQ7CS8qIHJlbW92ZSBDUkMgKi8KKwkJCWZlcC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X2xlbiArIDQ7CisKKwkJCWlmIChwa3RfbGVuIDw9IGZwaS0+cnhfY29weWJyZWFrKSB7CisJCQkJLyogKzIgdG8gbWFrZSBJUCBoZWFkZXIgTDEgY2FjaGUgYWxpZ25lZCAqLworCQkJCXNrYm4gPSBuZXRkZXZfYWxsb2Nfc2tiKGRldiwgcGt0X2xlbiArIDIpOworCQkJCWlmIChza2JuICE9IE5VTEwpIHsKKwkJCQkJc2tiX3Jlc2VydmUoc2tibiwgMik7CS8qIGFsaWduIElQIGhlYWRlciAqLworCQkJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhKHNrYiwKKwkJCQkJCSAgICAgIHNrYm4tPmRhdGEsIHBrdF9sZW4pOworCQkJCQlzd2FwKHNrYiwgc2tibik7CisJCQkJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGZlcC0+ZGV2LAorCQkJCQkJQ0JEUl9CVUZBRERSKGJkcCksCisJCQkJCQlMMV9DQUNIRV9BTElHTihwa3RfbGVuKSwKKwkJCQkJCURNQV9GUk9NX0RFVklDRSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlza2JuID0gbmV0ZGV2X2FsbG9jX3NrYihkZXYsIEVORVRfUlhfRlJTSVpFKTsKKworCQkJCWlmIChza2JuKSB7CisJCQkJCWRtYV9hZGRyX3QgZG1hOworCisJCQkJCXNrYl9hbGlnbihza2JuLCBFTkVUX1JYX0FMSUdOKTsKKworCQkJCQlkbWFfdW5tYXBfc2luZ2xlKGZlcC0+ZGV2LAorCQkJCQkJQ0JEUl9CVUZBRERSKGJkcCksCisJCQkJCQlMMV9DQUNIRV9BTElHTihQS1RfTUFYQlVGX1NJWkUpLAorCQkJCQkJRE1BX0ZST01fREVWSUNFKTsKKworCQkJCQlkbWEgPSBkbWFfbWFwX3NpbmdsZShmZXAtPmRldiwKKwkJCQkJCXNrYm4tPmRhdGEsCisJCQkJCQlMMV9DQUNIRV9BTElHTihQS1RfTUFYQlVGX1NJWkUpLAorCQkJCQkJRE1BX0ZST01fREVWSUNFKTsKKwkJCQkJQ0JEV19CVUZBRERSKGJkcCwgZG1hKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChza2JuICE9IE5VTEwpIHsKKwkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CS8qIE1ha2Ugcm9vbSAqLworCQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQkJcmVjZWl2ZWQrKzsKKwkJCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOworCQkJfSBlbHNlIHsKKwkJCQlmZXAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJCQlza2JuID0gc2tiOworCQkJfQorCQl9CisKKwkJZmVwLT5yeF9za2J1ZmZbY3VyaWR4XSA9IHNrYm47CisJCUNCRFdfREFUTEVOKGJkcCwgMCk7CisJCUNCRFdfU0MoYmRwLCAoc2MgJiB+QkRfRU5FVF9SWF9TVEFUUykgfCBCRF9FTkVUX1JYX0VNUFRZKTsKKworCQkvKgorCQkgKiBVcGRhdGUgQkQgcG9pbnRlciB0byBuZXh0IGVudHJ5LgorCQkgKi8KKwkJaWYgKChzYyAmIEJEX0VORVRfUlhfV1JBUCkgPT0gMCkKKwkJCWJkcCsrOworCQllbHNlCisJCQliZHAgPSBmZXAtPnJ4X2JkX2Jhc2U7CisKKwkJKCpmZXAtPm9wcy0+cnhfYmRfZG9uZSkoZGV2KTsKKwl9CisKKwlmZXAtPmN1cl9yeCA9IGJkcDsKKworCWlmIChyZWNlaXZlZCA8IGJ1ZGdldCAmJiB0eF9sZWZ0KSB7CisJCS8qIGRvbmUgKi8KKwkJbmFwaV9jb21wbGV0ZShuYXBpKTsKKwkJKCpmZXAtPm9wcy0+bmFwaV9lbmFibGUpKGRldik7CisKKwkJcmV0dXJuIHJlY2VpdmVkOworCX0KKworCXJldHVybiBidWRnZXQ7CiB9CiAKIC8qCkBAIC0zNTAsMTggKzMzMywxOCBAQAogCQlucisrOwogCiAJCWludF9jbHJfZXZlbnRzID0gaW50X2V2ZW50czsKLQkJaW50X2Nscl9ldmVudHMgJj0gfmZlcC0+ZXZfbmFwaV9yeDsKKwkJaW50X2Nscl9ldmVudHMgJj0gfmZlcC0+ZXZfbmFwaTsKIAogCQkoKmZlcC0+b3BzLT5jbGVhcl9pbnRfZXZlbnRzKShkZXYsIGludF9jbHJfZXZlbnRzKTsKIAogCQlpZiAoaW50X2V2ZW50cyAmIGZlcC0+ZXZfZXJyKQogCQkJKCpmZXAtPm9wcy0+ZXZfZXJyb3IpKGRldiwgaW50X2V2ZW50cyk7CiAKLQkJaWYgKGludF9ldmVudHMgJiBmZXAtPmV2X3J4KSB7CisJCWlmIChpbnRfZXZlbnRzICYgZmVwLT5ldikgewogCQkJbmFwaV9vayA9IG5hcGlfc2NoZWR1bGVfcHJlcCgmZmVwLT5uYXBpKTsKIAotCQkJKCpmZXAtPm9wcy0+bmFwaV9kaXNhYmxlX3J4KShkZXYpOwotCQkJKCpmZXAtPm9wcy0+Y2xlYXJfaW50X2V2ZW50cykoZGV2LCBmZXAtPmV2X25hcGlfcngpOworCQkJKCpmZXAtPm9wcy0+bmFwaV9kaXNhYmxlKShkZXYpOworCQkJKCpmZXAtPm9wcy0+Y2xlYXJfaW50X2V2ZW50cykoZGV2LCBmZXAtPmV2X25hcGkpOwogCiAJCQkvKiBOT1RFOiBpdCBpcyBwb3NzaWJsZSBmb3IgRkNDcyBpbiBOQVBJIG1vZGUgICAgKi8KIAkJCS8qIHRvIHN1Ym1pdCBhIHNwdXJpb3VzIGludGVycnVwdCB3aGlsZSBpbiBwb2xsICAqLwpAQCAtMzY5LDE3ICszNTIsNiBAQAogCQkJCV9fbmFwaV9zY2hlZHVsZSgmZmVwLT5uYXBpKTsKIAkJfQogCi0JCWlmIChpbnRfZXZlbnRzICYgZmVwLT5ldl90eCkgewotCQkJbmFwaV9vayA9IG5hcGlfc2NoZWR1bGVfcHJlcCgmZmVwLT5uYXBpX3R4KTsKLQotCQkJKCpmZXAtPm9wcy0+bmFwaV9kaXNhYmxlX3R4KShkZXYpOwotCQkJKCpmZXAtPm9wcy0+Y2xlYXJfaW50X2V2ZW50cykoZGV2LCBmZXAtPmV2X25hcGlfdHgpOwotCi0JCQkvKiBOT1RFOiBpdCBpcyBwb3NzaWJsZSBmb3IgRkNDcyBpbiBOQVBJIG1vZGUgICAgKi8KLQkJCS8qIHRvIHN1Ym1pdCBhIHNwdXJpb3VzIGludGVycnVwdCB3aGlsZSBpbiBwb2xsICAqLwotCQkJaWYgKG5hcGlfb2spCi0JCQkJX19uYXBpX3NjaGVkdWxlKCZmZXAtPm5hcGlfdHgpOwotCQl9CiAJfQogCiAJaGFuZGxlZCA9IG5yID4gMDsKQEAgLTY1OSw3ICs2MzEsOCBAQAogCX0KIAogCXBoeV9zdGFydChkZXYtPnBoeWRldik7Ci0Jd2FrZSA9IGZlcC0+dHhfZnJlZSAmJiAhKENCRFJfU0MoZmVwLT5jdXJfdHgpICYgQkRfRU5FVF9UWF9SRUFEWSk7CisJd2FrZSA9IGZlcC0+dHhfZnJlZSA+PSBNQVhfU0tCX0ZSQUdTICYmCisJICAgICAgICEoQ0JEUl9TQyhmZXAtPmN1cl90eCkgJiBCRF9FTkVUX1RYX1JFQURZKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZXAtPmxvY2ssIGZsYWdzKTsKIAogCWlmICh3YWtlKQpAQCAtNzUxLDExICs3MjQsMTAgQEAKIAlpbnQgZXJyOwogCiAJLyogdG8gaW5pdGlhbGl6ZSB0aGUgZmVwLT5jdXJfcngsLi4uICovCi0JLyogbm90IGRvaW5nIHRoaXMsIHdpbGwgY2F1c2UgYSBjcmFzaCBpbiBmc19lbmV0X3J4X25hcGkgKi8KKwkvKiBub3QgZG9pbmcgdGhpcywgd2lsbCBjYXVzZSBhIGNyYXNoIGluIGZzX2VuZXRfbmFwaSAqLwogCWZzX2luaXRfYmRzKGZlcC0+bmRldik7CiAKIAluYXBpX2VuYWJsZSgmZmVwLT5uYXBpKTsKLQluYXBpX2VuYWJsZSgmZmVwLT5uYXBpX3R4KTsKIAogCS8qIEluc3RhbGwgb3VyIGludGVycnVwdCBoYW5kbGVyLiAqLwogCXIgPSByZXF1ZXN0X2lycShmZXAtPmludGVycnVwdCwgZnNfZW5ldF9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELApAQCAtNzYzLDcgKzczNSw2IEBACiAJaWYgKHIgIT0gMCkgewogCQlkZXZfZXJyKGZlcC0+ZGV2LCAiQ291bGQgbm90IGFsbG9jYXRlIEZTX0VORVQgSVJRISIpOwogCQluYXBpX2Rpc2FibGUoJmZlcC0+bmFwaSk7Ci0JCW5hcGlfZGlzYWJsZSgmZmVwLT5uYXBpX3R4KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC03NzEsNyArNzQyLDYgQEAKIAlpZiAoZXJyKSB7CiAJCWZyZWVfaXJxKGZlcC0+aW50ZXJydXB0LCBkZXYpOwogCQluYXBpX2Rpc2FibGUoJmZlcC0+bmFwaSk7Ci0JCW5hcGlfZGlzYWJsZSgmZmVwLT5uYXBpX3R4KTsKIAkJcmV0dXJuIGVycjsKIAl9CiAJcGh5X3N0YXJ0KGRldi0+cGh5ZGV2KTsKQEAgLTc4OSw3ICs3NTksNiBAQAogCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIAluZXRpZl9jYXJyaWVyX29mZihkZXYpOwogCW5hcGlfZGlzYWJsZSgmZmVwLT5uYXBpKTsKLQluYXBpX2Rpc2FibGUoJmZlcC0+bmFwaV90eCk7CiAJcGh5X3N0b3AoZGV2LT5waHlkZXYpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmZlcC0+bG9jaywgZmxhZ3MpOwpAQCAtODYxLDYgKzgzMCw0NCBAQAogCWZlcC0+bXNnX2VuYWJsZSA9IHZhbHVlOwogfQogCitzdGF0aWMgaW50IGZzX2dldF90dW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIGNvbnN0IHN0cnVjdCBldGh0b29sX3R1bmFibGUgKnR1bmEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGZzX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZnNfcGxhdGZvcm1faW5mbyAqZnBpID0gZmVwLT5mcGk7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKHR1bmEtPmlkKSB7CisJY2FzZSBFVEhUT09MX1JYX0NPUFlCUkVBSzoKKwkJKih1MzIgKilkYXRhID0gZnBpLT5yeF9jb3B5YnJlYWs7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZnNfc2V0X3R1bmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgY29uc3Qgc3RydWN0IGV0aHRvb2xfdHVuYWJsZSAqdHVuYSwgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZnNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBmc19wbGF0Zm9ybV9pbmZvICpmcGkgPSBmZXAtPmZwaTsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAodHVuYS0+aWQpIHsKKwljYXNlIEVUSFRPT0xfUlhfQ09QWUJSRUFLOgorCQlmcGktPnJ4X2NvcHlicmVhayA9ICoodTMyICopZGF0YTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBmc19ldGh0b29sX29wcyA9IHsKIAkuZ2V0X2RydmluZm8gPSBmc19nZXRfZHJ2aW5mbywKIAkuZ2V0X3JlZ3NfbGVuID0gZnNfZ2V0X3JlZ3NfbGVuLApAQCAtODcyLDYgKzg3OSw4IEBACiAJLmdldF90c19pbmZvID0gZXRodG9vbF9vcF9nZXRfdHNfaW5mbywKIAkuZ2V0X2xpbmtfa3NldHRpbmdzID0gcGh5X2V0aHRvb2xfZ2V0X2xpbmtfa3NldHRpbmdzLAogCS5zZXRfbGlua19rc2V0dGluZ3MgPSBwaHlfZXRodG9vbF9zZXRfbGlua19rc2V0dGluZ3MsCisJLmdldF90dW5hYmxlID0gZnNfZ2V0X3R1bmFibGUsCisJLnNldF90dW5hYmxlID0gZnNfc2V0X3R1bmFibGUsCiB9OwogCiBzdGF0aWMgaW50IGZzX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCkBAIC05MzksOCArOTQ4LDggQEAKIAkJZnBpLT5jcF9jb21tYW5kID0gKmRhdGE7CiAJfQogCi0JZnBpLT5yeF9yaW5nID0gMzI7Ci0JZnBpLT50eF9yaW5nID0gNjQ7CisJZnBpLT5yeF9yaW5nID0gUlhfUklOR19TSVpFOworCWZwaS0+dHhfcmluZyA9IFRYX1JJTkdfU0laRTsKIAlmcGktPnJ4X2NvcHlicmVhayA9IDI0MDsKIAlmcGktPm5hcGlfd2VpZ2h0ID0gMTc7CiAJZnBpLT5waHlfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUob2ZkZXYtPmRldi5vZl9ub2RlLCAicGh5LWhhbmRsZSIsIDApOwpAQCAtMTAyNCw4ICsxMDMzLDcgQEAKIAogCW5kZXYtPm5ldGRldl9vcHMgPSAmZnNfZW5ldF9uZXRkZXZfb3BzOwogCW5kZXYtPndhdGNoZG9nX3RpbWVvID0gMiAqIEhaOwotCW5ldGlmX25hcGlfYWRkKG5kZXYsICZmZXAtPm5hcGksIGZzX2VuZXRfcnhfbmFwaSwgZnBpLT5uYXBpX3dlaWdodCk7Ci0JbmV0aWZfdHhfbmFwaV9hZGQobmRldiwgJmZlcC0+bmFwaV90eCwgZnNfZW5ldF90eF9uYXBpLCAyKTsKKwluZXRpZl9uYXBpX2FkZChuZGV2LCAmZmVwLT5uYXBpLCBmc19lbmV0X25hcGksIGZwaS0+bmFwaV93ZWlnaHQpOwogCiAJbmRldi0+ZXRodG9vbF9vcHMgPSAmZnNfZXRodG9vbF9vcHM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L2ZzX2VuZXQuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L2ZzX2VuZXQuaAppbmRleCBlMjlmNTRhLi5mZWUyNGM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9mc19lbmV0LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzX2VuZXQvZnNfZW5ldC5oCkBAIC04MSwxMiArODEsOSBAQAogCXZvaWQgKCphZGp1c3RfbGluaykoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAJdm9pZCAoKnJlc3RhcnQpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCXZvaWQgKCpzdG9wKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLQl2b2lkICgqbmFwaV9jbGVhcl9yeF9ldmVudCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci0Jdm9pZCAoKm5hcGlfZW5hYmxlX3J4KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLQl2b2lkICgqbmFwaV9kaXNhYmxlX3J4KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLQl2b2lkICgqbmFwaV9jbGVhcl90eF9ldmVudCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci0Jdm9pZCAoKm5hcGlfZW5hYmxlX3R4KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLQl2b2lkICgqbmFwaV9kaXNhYmxlX3R4KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqbmFwaV9jbGVhcl9ldmVudCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKm5hcGlfZW5hYmxlKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqbmFwaV9kaXNhYmxlKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAl2b2lkICgqcnhfYmRfZG9uZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAJdm9pZCAoKnR4X2tpY2tzdGFydCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAJdTMyICgqZ2V0X2ludF9ldmVudHMpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpAQCAtMTIyLDcgKzExOSw2IEBACiAKIHN0cnVjdCBmc19lbmV0X3ByaXZhdGUgewogCXN0cnVjdCBuYXBpX3N0cnVjdCBuYXBpOwotCXN0cnVjdCBuYXBpX3N0cnVjdCBuYXBpX3R4OwogCXN0cnVjdCBkZXZpY2UgKmRldjsJLyogcG9pbnRlciBiYWNrIHRvIHRoZSBkZXZpY2UgKG11c3QgYmUgaW5pdGlhbGl6ZWQgZmlyc3QpICovCiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CiAJc3BpbmxvY2tfdCBsb2NrOwkvKiBkdXJpbmcgYWxsIG9wcyBleGNlcHQgVFggcGNrdCBwcm9jZXNzaW5nICovCkBAIC0xNTIsMTAgKzE0OCw4IEBACiAJaW50IG9sZGR1cGxleCwgb2xkc3BlZWQsIG9sZGxpbms7CS8qIGN1cnJlbnQgc2V0dGluZ3MgKi8KIAogCS8qIGV2ZW50IG1hc2tzICovCi0JdTMyIGV2X25hcGlfcng7CQkvKiBtYXNrIG9mIE5BUEkgcnggZXZlbnRzICovCi0JdTMyIGV2X25hcGlfdHg7CQkvKiBtYXNrIG9mIE5BUEkgcnggZXZlbnRzICovCi0JdTMyIGV2X3J4OwkJLyogcnggZXZlbnQgbWFzayAgICAgICAgICAqLwotCXUzMiBldl90eDsJCS8qIHR4IGV2ZW50IG1hc2sgICAgICAgICAgKi8KKwl1MzIgZXZfbmFwaTsJCS8qIG1hc2sgb2YgTkFQSSBldmVudHMgKi8KKwl1MzIgZXY7CQkJLyogZXZlbnQgbWFzayAgICAgICAgICAqLwogCXUzMiBldl9lcnI7CQkvKiBlcnJvciBldmVudCBtYXNrICAgICAgICovCiAKIAl1MTYgYmRfcnhfZW1wdHk7CS8qIG1hc2sgb2YgQkQgcnggZW1wdHkJICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzX2VuZXQvbWFjLWZjYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzX2VuZXQvbWFjLWZjYy5jCmluZGV4IGQ3MTc2MWEuLjEyMGM3NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L21hYy1mY2MuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9tYWMtZmNjLmMKQEAgLTkwLDcgKzkwLDcgQEAKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAogCWZlcC0+aW50ZXJydXB0ID0gaXJxX29mX3BhcnNlX2FuZF9tYXAob2ZkZXYtPmRldi5vZl9ub2RlLCAwKTsKLQlpZiAoZmVwLT5pbnRlcnJ1cHQgPT0gTk9fSVJRKQorCWlmICghZmVwLT5pbnRlcnJ1cHQpCiAJCWdvdG8gb3V0OwogCiAJZmVwLT5mY2MuZmNjcCA9IG9mX2lvbWFwKG9mZGV2LT5kZXYub2Zfbm9kZSwgMCk7CkBAIC0xMjQsMTAgKzEyNCw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotI2RlZmluZSBGQ0NfTkFQSV9SWF9FVkVOVF9NU0sJKEZDQ19FTkVUX1JYRiB8IEZDQ19FTkVUX1JYQikKLSNkZWZpbmUgRkNDX05BUElfVFhfRVZFTlRfTVNLCShGQ0NfRU5FVF9UWEIpCi0jZGVmaW5lIEZDQ19SWF9FVkVOVAkJKEZDQ19FTkVUX1JYRikKLSNkZWZpbmUgRkNDX1RYX0VWRU5UCQkoRkNDX0VORVRfVFhCKQorI2RlZmluZSBGQ0NfTkFQSV9FVkVOVF9NU0sJKEZDQ19FTkVUX1JYRiB8IEZDQ19FTkVUX1JYQiB8IEZDQ19FTkVUX1RYQikKKyNkZWZpbmUgRkNDX0VWRU5UCQkoRkNDX0VORVRfUlhGIHwgRkNDX0VORVRfVFhCKQogI2RlZmluZSBGQ0NfRVJSX0VWRU5UX01TSwkoRkNDX0VORVRfVFhFKQogCiBzdGF0aWMgaW50IHNldHVwX2RhdGEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTEzNywxMCArMTM1LDggQEAKIAlpZiAoZG9fcGRfc2V0dXAoZmVwKSAhPSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWZlcC0+ZXZfbmFwaV9yeCA9IEZDQ19OQVBJX1JYX0VWRU5UX01TSzsKLQlmZXAtPmV2X25hcGlfdHggPSBGQ0NfTkFQSV9UWF9FVkVOVF9NU0s7Ci0JZmVwLT5ldl9yeCA9IEZDQ19SWF9FVkVOVDsKLQlmZXAtPmV2X3R4ID0gRkNDX1RYX0VWRU5UOworCWZlcC0+ZXZfbmFwaSA9IEZDQ19OQVBJX0VWRU5UX01TSzsKKwlmZXAtPmV2ID0gRkNDX0VWRU5UOwogCWZlcC0+ZXZfZXJyID0gRkNDX0VSUl9FVkVOVF9NU0s7CiAKIAlyZXR1cm4gMDsKQEAgLTQyNCw1MiArNDIwLDI4IEBACiAJZnNfY2xlYW51cF9iZHMoZGV2KTsKIH0KIAotc3RhdGljIHZvaWQgbmFwaV9jbGVhcl9yeF9ldmVudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgbmFwaV9jbGVhcl9ldmVudF9mcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CiAJZmNjX3QgX19pb21lbSAqZmNjcCA9IGZlcC0+ZmNjLmZjY3A7CiAKLQlXMTYoZmNjcCwgZmNjX2ZjY2UsIEZDQ19OQVBJX1JYX0VWRU5UX01TSyk7CisJVzE2KGZjY3AsIGZjY19mY2NlLCBGQ0NfTkFQSV9FVkVOVF9NU0spOwogfQogCi1zdGF0aWMgdm9pZCBuYXBpX2VuYWJsZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgbmFwaV9lbmFibGVfZnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZnNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOwogCWZjY190IF9faW9tZW0gKmZjY3AgPSBmZXAtPmZjYy5mY2NwOwogCi0JUzE2KGZjY3AsIGZjY19mY2NtLCBGQ0NfTkFQSV9SWF9FVkVOVF9NU0spOworCVMxNihmY2NwLCBmY2NfZmNjbSwgRkNDX05BUElfRVZFTlRfTVNLKTsKIH0KIAotc3RhdGljIHZvaWQgbmFwaV9kaXNhYmxlX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBuYXBpX2Rpc2FibGVfZnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZnNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOwogCWZjY190IF9faW9tZW0gKmZjY3AgPSBmZXAtPmZjYy5mY2NwOwogCi0JQzE2KGZjY3AsIGZjY19mY2NtLCBGQ0NfTkFQSV9SWF9FVkVOVF9NU0spOwotfQotCi1zdGF0aWMgdm9pZCBuYXBpX2NsZWFyX3R4X2V2ZW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGZzX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlmY2NfdCBfX2lvbWVtICpmY2NwID0gZmVwLT5mY2MuZmNjcDsKLQotCVcxNihmY2NwLCBmY2NfZmNjZSwgRkNDX05BUElfVFhfRVZFTlRfTVNLKTsKLX0KLQotc3RhdGljIHZvaWQgbmFwaV9lbmFibGVfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZnNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOwotCWZjY190IF9faW9tZW0gKmZjY3AgPSBmZXAtPmZjYy5mY2NwOwotCi0JUzE2KGZjY3AsIGZjY19mY2NtLCBGQ0NfTkFQSV9UWF9FVkVOVF9NU0spOwotfQotCi1zdGF0aWMgdm9pZCBuYXBpX2Rpc2FibGVfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZnNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOwotCWZjY190IF9faW9tZW0gKmZjY3AgPSBmZXAtPmZjYy5mY2NwOwotCi0JQzE2KGZjY3AsIGZjY19mY2NtLCBGQ0NfTkFQSV9UWF9FVkVOVF9NU0spOworCUMxNihmY2NwLCBmY2NfZmNjbSwgRkNDX05BUElfRVZFTlRfTVNLKTsKIH0KIAogc3RhdGljIHZvaWQgcnhfYmRfZG9uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtNTk1LDEyICs1NjcsOSBAQAogCS5zZXRfbXVsdGljYXN0X2xpc3QJPSBzZXRfbXVsdGljYXN0X2xpc3QsCiAJLnJlc3RhcnQJCT0gcmVzdGFydCwKIAkuc3RvcAkJCT0gc3RvcCwKLQkubmFwaV9jbGVhcl9yeF9ldmVudAk9IG5hcGlfY2xlYXJfcnhfZXZlbnQsCi0JLm5hcGlfZW5hYmxlX3J4CQk9IG5hcGlfZW5hYmxlX3J4LAotCS5uYXBpX2Rpc2FibGVfcngJPSBuYXBpX2Rpc2FibGVfcngsCi0JLm5hcGlfY2xlYXJfdHhfZXZlbnQJPSBuYXBpX2NsZWFyX3R4X2V2ZW50LAotCS5uYXBpX2VuYWJsZV90eAkJPSBuYXBpX2VuYWJsZV90eCwKLQkubmFwaV9kaXNhYmxlX3R4CT0gbmFwaV9kaXNhYmxlX3R4LAorCS5uYXBpX2NsZWFyX2V2ZW50CT0gbmFwaV9jbGVhcl9ldmVudF9mcywKKwkubmFwaV9lbmFibGUJCT0gbmFwaV9lbmFibGVfZnMsCisJLm5hcGlfZGlzYWJsZQkJPSBuYXBpX2Rpc2FibGVfZnMsCiAJLnJ4X2JkX2RvbmUJCT0gcnhfYmRfZG9uZSwKIAkudHhfa2lja3N0YXJ0CQk9IHR4X2tpY2tzdGFydCwKIAkuZ2V0X2ludF9ldmVudHMJCT0gZ2V0X2ludF9ldmVudHMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9tYWMtZmVjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9tYWMtZmVjLmMKaW5kZXggMzVhMzE4ZS4uNzc3YmVmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzX2VuZXQvbWFjLWZlYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L21hYy1mZWMuYwpAQCAtOTksNyArOTksNyBAQAogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9mZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGZlcC0+ZGV2KTsKIAogCWZlcC0+aW50ZXJydXB0ID0gaXJxX29mX3BhcnNlX2FuZF9tYXAob2ZkZXYtPmRldi5vZl9ub2RlLCAwKTsKLQlpZiAoZmVwLT5pbnRlcnJ1cHQgPT0gTk9fSVJRKQorCWlmICghZmVwLT5pbnRlcnJ1cHQpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJZmVwLT5mZWMuZmVjcCA9IG9mX2lvbWFwKG9mZGV2LT5kZXYub2Zfbm9kZSwgMCk7CkBAIC0xMDksMTAgKzEwOSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNkZWZpbmUgRkVDX05BUElfUlhfRVZFTlRfTVNLCShGRUNfRU5FVF9SWEYgfCBGRUNfRU5FVF9SWEIpCi0jZGVmaW5lIEZFQ19OQVBJX1RYX0VWRU5UX01TSwkoRkVDX0VORVRfVFhGKQotI2RlZmluZSBGRUNfUlhfRVZFTlQJCShGRUNfRU5FVF9SWEYpCi0jZGVmaW5lIEZFQ19UWF9FVkVOVAkJKEZFQ19FTkVUX1RYRikKKyNkZWZpbmUgRkVDX05BUElfRVZFTlRfTVNLCShGRUNfRU5FVF9SWEYgfCBGRUNfRU5FVF9SWEIgfCBGRUNfRU5FVF9UWEYpCisjZGVmaW5lIEZFQ19FVkVOVAkJKEZFQ19FTkVUX1JYRiB8IEZFQ19FTkVUX1RYRikKICNkZWZpbmUgRkVDX0VSUl9FVkVOVF9NU0sJKEZFQ19FTkVUX0hCRVJSIHwgRkVDX0VORVRfQkFCUiB8IFwKIAkJCQkgRkVDX0VORVRfQkFCVCB8IEZFQ19FTkVUX0VCRVJSKQogCkBAIC0xMjYsMTAgKzEyNCw4IEBACiAJZmVwLT5mZWMuaHRoaSA9IDA7CiAJZmVwLT5mZWMuaHRsbyA9IDA7CiAKLQlmZXAtPmV2X25hcGlfcnggPSBGRUNfTkFQSV9SWF9FVkVOVF9NU0s7Ci0JZmVwLT5ldl9uYXBpX3R4ID0gRkVDX05BUElfVFhfRVZFTlRfTVNLOwotCWZlcC0+ZXZfcnggPSBGRUNfUlhfRVZFTlQ7Ci0JZmVwLT5ldl90eCA9IEZFQ19UWF9FVkVOVDsKKwlmZXAtPmV2X25hcGkgPSBGRUNfTkFQSV9FVkVOVF9NU0s7CisJZmVwLT5ldiA9IEZFQ19FVkVOVDsKIAlmZXAtPmV2X2VyciA9IEZFQ19FUlJfRVZFTlRfTVNLOwogCiAJcmV0dXJuIDA7CkBAIC0zOTYsNTIgKzM5MiwyOCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgbmFwaV9jbGVhcl9yeF9ldmVudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgbmFwaV9jbGVhcl9ldmVudF9mcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGZlYyBfX2lvbWVtICpmZWNwID0gZmVwLT5mZWMuZmVjcDsKIAotCUZXKGZlY3AsIGlldmVudCwgRkVDX05BUElfUlhfRVZFTlRfTVNLKTsKKwlGVyhmZWNwLCBpZXZlbnQsIEZFQ19OQVBJX0VWRU5UX01TSyk7CiB9CiAKLXN0YXRpYyB2b2lkIG5hcGlfZW5hYmxlX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBuYXBpX2VuYWJsZV9mcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGZlYyBfX2lvbWVtICpmZWNwID0gZmVwLT5mZWMuZmVjcDsKIAotCUZTKGZlY3AsIGltYXNrLCBGRUNfTkFQSV9SWF9FVkVOVF9NU0spOworCUZTKGZlY3AsIGltYXNrLCBGRUNfTkFQSV9FVkVOVF9NU0spOwogfQogCi1zdGF0aWMgdm9pZCBuYXBpX2Rpc2FibGVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIG5hcGlfZGlzYWJsZV9mcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGZlYyBfX2lvbWVtICpmZWNwID0gZmVwLT5mZWMuZmVjcDsKIAotCUZDKGZlY3AsIGltYXNrLCBGRUNfTkFQSV9SWF9FVkVOVF9NU0spOwotfQotCi1zdGF0aWMgdm9pZCBuYXBpX2NsZWFyX3R4X2V2ZW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGZzX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgZmVjIF9faW9tZW0gKmZlY3AgPSBmZXAtPmZlYy5mZWNwOwotCi0JRlcoZmVjcCwgaWV2ZW50LCBGRUNfTkFQSV9UWF9FVkVOVF9NU0spOwotfQotCi1zdGF0aWMgdm9pZCBuYXBpX2VuYWJsZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IGZlYyBfX2lvbWVtICpmZWNwID0gZmVwLT5mZWMuZmVjcDsKLQotCUZTKGZlY3AsIGltYXNrLCBGRUNfTkFQSV9UWF9FVkVOVF9NU0spOwotfQotCi1zdGF0aWMgdm9pZCBuYXBpX2Rpc2FibGVfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZnNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBmZWMgX19pb21lbSAqZmVjcCA9IGZlcC0+ZmVjLmZlY3A7Ci0KLQlGQyhmZWNwLCBpbWFzaywgRkVDX05BUElfVFhfRVZFTlRfTVNLKTsKKwlGQyhmZWNwLCBpbWFzaywgRkVDX05BUElfRVZFTlRfTVNLKTsKIH0KIAogc3RhdGljIHZvaWQgcnhfYmRfZG9uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtNTEzLDEyICs0ODUsOSBAQAogCS5zZXRfbXVsdGljYXN0X2xpc3QJPSBzZXRfbXVsdGljYXN0X2xpc3QsCiAJLnJlc3RhcnQJCT0gcmVzdGFydCwKIAkuc3RvcAkJCT0gc3RvcCwKLQkubmFwaV9jbGVhcl9yeF9ldmVudAk9IG5hcGlfY2xlYXJfcnhfZXZlbnQsCi0JLm5hcGlfZW5hYmxlX3J4CQk9IG5hcGlfZW5hYmxlX3J4LAotCS5uYXBpX2Rpc2FibGVfcngJPSBuYXBpX2Rpc2FibGVfcngsCi0JLm5hcGlfY2xlYXJfdHhfZXZlbnQJPSBuYXBpX2NsZWFyX3R4X2V2ZW50LAotCS5uYXBpX2VuYWJsZV90eAkJPSBuYXBpX2VuYWJsZV90eCwKLQkubmFwaV9kaXNhYmxlX3R4CT0gbmFwaV9kaXNhYmxlX3R4LAorCS5uYXBpX2NsZWFyX2V2ZW50CT0gbmFwaV9jbGVhcl9ldmVudF9mcywKKwkubmFwaV9lbmFibGUJCT0gbmFwaV9lbmFibGVfZnMsCisJLm5hcGlfZGlzYWJsZQkJPSBuYXBpX2Rpc2FibGVfZnMsCiAJLnJ4X2JkX2RvbmUJCT0gcnhfYmRfZG9uZSwKIAkudHhfa2lja3N0YXJ0CQk9IHR4X2tpY2tzdGFydCwKIAkuZ2V0X2ludF9ldmVudHMJCT0gZ2V0X2ludF9ldmVudHMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9tYWMtc2NjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9tYWMtc2NjLmMKaW5kZXggZThiOWMzMy4uMTVhYmQzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzX2VuZXQvbWFjLXNjYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L21hYy1zY2MuYwpAQCAtOTksNyArOTksNyBAQAogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9mZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGZlcC0+ZGV2KTsKIAogCWZlcC0+aW50ZXJydXB0ID0gaXJxX29mX3BhcnNlX2FuZF9tYXAob2ZkZXYtPmRldi5vZl9ub2RlLCAwKTsKLQlpZiAoZmVwLT5pbnRlcnJ1cHQgPT0gTk9fSVJRKQorCWlmICghZmVwLT5pbnRlcnJ1cHQpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJZmVwLT5zY2Muc2NjcCA9IG9mX2lvbWFwKG9mZGV2LT5kZXYub2Zfbm9kZSwgMCk7CkBAIC0xMTUsMTAgKzExNSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNkZWZpbmUgU0NDX05BUElfUlhfRVZFTlRfTVNLCShTQ0NFX0VORVRfUlhGIHwgU0NDRV9FTkVUX1JYQikKLSNkZWZpbmUgU0NDX05BUElfVFhfRVZFTlRfTVNLCShTQ0NFX0VORVRfVFhCKQotI2RlZmluZSBTQ0NfUlhfRVZFTlQJCShTQ0NFX0VORVRfUlhGKQotI2RlZmluZSBTQ0NfVFhfRVZFTlQJCShTQ0NFX0VORVRfVFhCKQorI2RlZmluZSBTQ0NfTkFQSV9FVkVOVF9NU0sJKFNDQ0VfRU5FVF9SWEYgfCBTQ0NFX0VORVRfUlhCIHwgU0NDRV9FTkVUX1RYQikKKyNkZWZpbmUgU0NDX0VWRU5UCQkoU0NDRV9FTkVUX1JYRiB8IFNDQ0VfRU5FVF9UWEIpCiAjZGVmaW5lIFNDQ19FUlJfRVZFTlRfTVNLCShTQ0NFX0VORVRfVFhFIHwgU0NDRV9FTkVUX0JTWSkKIAogc3RhdGljIGludCBzZXR1cF9kYXRhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0xMzAsMTAgKzEyOCw4IEBACiAJZmVwLT5zY2MuaHRoaSA9IDA7CiAJZmVwLT5zY2MuaHRsbyA9IDA7CiAKLQlmZXAtPmV2X25hcGlfcnggPSBTQ0NfTkFQSV9SWF9FVkVOVF9NU0s7Ci0JZmVwLT5ldl9uYXBpX3R4ID0gU0NDX05BUElfVFhfRVZFTlRfTVNLOwotCWZlcC0+ZXZfcnggPSBTQ0NfUlhfRVZFTlQ7Ci0JZmVwLT5ldl90eCA9IFNDQ19UWF9FVkVOVCB8IFNDQ0VfRU5FVF9UWEU7CisJZmVwLT5ldl9uYXBpID0gU0NDX05BUElfRVZFTlRfTVNLOworCWZlcC0+ZXYgPSBTQ0NfRVZFTlQgfCBTQ0NFX0VORVRfVFhFOwogCWZlcC0+ZXZfZXJyID0gU0NDX0VSUl9FVkVOVF9NU0s7CiAKIAlyZXR1cm4gMDsKQEAgLTM3OSw1MiArMzc1LDI4IEBACiAJZnNfY2xlYW51cF9iZHMoZGV2KTsKIH0KIAotc3RhdGljIHZvaWQgbmFwaV9jbGVhcl9yeF9ldmVudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgbmFwaV9jbGVhcl9ldmVudF9mcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CiAJc2NjX3QgX19pb21lbSAqc2NjcCA9IGZlcC0+c2NjLnNjY3A7CiAKLQlXMTYoc2NjcCwgc2NjX3NjY2UsIFNDQ19OQVBJX1JYX0VWRU5UX01TSyk7CisJVzE2KHNjY3AsIHNjY19zY2NlLCBTQ0NfTkFQSV9FVkVOVF9NU0spOwogfQogCi1zdGF0aWMgdm9pZCBuYXBpX2VuYWJsZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgbmFwaV9lbmFibGVfZnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZnNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXNjY190IF9faW9tZW0gKnNjY3AgPSBmZXAtPnNjYy5zY2NwOwogCi0JUzE2KHNjY3AsIHNjY19zY2NtLCBTQ0NfTkFQSV9SWF9FVkVOVF9NU0spOworCVMxNihzY2NwLCBzY2Nfc2NjbSwgU0NDX05BUElfRVZFTlRfTVNLKTsKIH0KIAotc3RhdGljIHZvaWQgbmFwaV9kaXNhYmxlX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBuYXBpX2Rpc2FibGVfZnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZnNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXNjY190IF9faW9tZW0gKnNjY3AgPSBmZXAtPnNjYy5zY2NwOwogCi0JQzE2KHNjY3AsIHNjY19zY2NtLCBTQ0NfTkFQSV9SWF9FVkVOVF9NU0spOwotfQotCi1zdGF0aWMgdm9pZCBuYXBpX2NsZWFyX3R4X2V2ZW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGZzX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzY2NfdCBfX2lvbWVtICpzY2NwID0gZmVwLT5zY2Muc2NjcDsKLQotCVcxNihzY2NwLCBzY2Nfc2NjZSwgU0NDX05BUElfVFhfRVZFTlRfTVNLKTsKLX0KLQotc3RhdGljIHZvaWQgbmFwaV9lbmFibGVfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZnNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXNjY190IF9faW9tZW0gKnNjY3AgPSBmZXAtPnNjYy5zY2NwOwotCi0JUzE2KHNjY3AsIHNjY19zY2NtLCBTQ0NfTkFQSV9UWF9FVkVOVF9NU0spOwotfQotCi1zdGF0aWMgdm9pZCBuYXBpX2Rpc2FibGVfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZnNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXNjY190IF9faW9tZW0gKnNjY3AgPSBmZXAtPnNjYy5zY2NwOwotCi0JQzE2KHNjY3AsIHNjY19zY2NtLCBTQ0NfTkFQSV9UWF9FVkVOVF9NU0spOworCUMxNihzY2NwLCBzY2Nfc2NjbSwgU0NDX05BUElfRVZFTlRfTVNLKTsKIH0KIAogc3RhdGljIHZvaWQgcnhfYmRfZG9uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtNDk3LDEyICs0NjksOSBAQAogCS5zZXRfbXVsdGljYXN0X2xpc3QJPSBzZXRfbXVsdGljYXN0X2xpc3QsCiAJLnJlc3RhcnQJCT0gcmVzdGFydCwKIAkuc3RvcAkJCT0gc3RvcCwKLQkubmFwaV9jbGVhcl9yeF9ldmVudAk9IG5hcGlfY2xlYXJfcnhfZXZlbnQsCi0JLm5hcGlfZW5hYmxlX3J4CQk9IG5hcGlfZW5hYmxlX3J4LAotCS5uYXBpX2Rpc2FibGVfcngJPSBuYXBpX2Rpc2FibGVfcngsCi0JLm5hcGlfY2xlYXJfdHhfZXZlbnQJPSBuYXBpX2NsZWFyX3R4X2V2ZW50LAotCS5uYXBpX2VuYWJsZV90eAkJPSBuYXBpX2VuYWJsZV90eCwKLQkubmFwaV9kaXNhYmxlX3R4CT0gbmFwaV9kaXNhYmxlX3R4LAorCS5uYXBpX2NsZWFyX2V2ZW50CT0gbmFwaV9jbGVhcl9ldmVudF9mcywKKwkubmFwaV9lbmFibGUJCT0gbmFwaV9lbmFibGVfZnMsCisJLm5hcGlfZGlzYWJsZQkJPSBuYXBpX2Rpc2FibGVfZnMsCiAJLnJ4X2JkX2RvbmUJCT0gcnhfYmRfZG9uZSwKIAkudHhfa2lja3N0YXJ0CQk9IHR4X2tpY2tzdGFydCwKIAkuZ2V0X2ludF9ldmVudHMJCT0gZ2V0X2ludF9ldmVudHMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNsX3BxX21kaW8uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc2xfcHFfbWRpby5jCmluZGV4IGYzYzYzZGMuLjQ0NmM3YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc2xfcHFfbWRpby5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc2xfcHFfbWRpby5jCkBAIC0xOTUsNyArMTk1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0dJQU5GQVIpIHx8IGRlZmluZWQoQ09ORklHX0dJQU5GQVJfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0dJQU5GQVIpCiAvKgogICogUmV0dXJuIHRoZSBUQklQQSBhZGRyZXNzLCBzdGFydGluZyBmcm9tIHRoZSBhZGRyZXNzCiAgKiBvZiB0aGUgbWFwcGVkIEdGQVIgTURJTyByZWdpc3RlcnMgKHN0cnVjdCBnZmFyKQpAQCAtMjI4LDcgKzIyOCw3IEBACiB9CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX1VDQ19HRVRIKSB8fCBkZWZpbmVkKENPTkZJR19VQ0NfR0VUSF9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfVUNDX0dFVEgpCiAvKgogICogUmV0dXJuIHRoZSBUQklQQVIgYWRkcmVzcyBmb3IgYSBRRSBNRElPIG5vZGUsIHN0YXJ0aW5nIGZyb20gdGhlIGFkZHJlc3MKICAqIG9mIHRoZSBtYXBwZWQgTUlJIHJlZ2lzdGVycyAoc3RydWN0IGZzbF9wcV9taWkpCkBAIC0zMDYsNyArMzA2LDcgQEAKICNlbmRpZgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBmc2xfcHFfbWRpb19tYXRjaFtdID0gewotI2lmIGRlZmluZWQoQ09ORklHX0dJQU5GQVIpIHx8IGRlZmluZWQoQ09ORklHX0dJQU5GQVJfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0dJQU5GQVIpCiAJewogCQkuY29tcGF0aWJsZSA9ICJmc2wsZ2lhbmZhci10YmkiLAogCQkuZGF0YSA9ICYoc3RydWN0IGZzbF9wcV9tZGlvX2RhdGEpIHsKQEAgLTM0NCw3ICszNDQsNyBAQAogCQl9LAogCX0sCiAjZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19VQ0NfR0VUSCkgfHwgZGVmaW5lZChDT05GSUdfVUNDX0dFVEhfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1VDQ19HRVRIKQogCXsKIAkJLmNvbXBhdGlibGUgPSAiZnNsLHVjYy1tZGlvIiwKIAkJLmRhdGEgPSAmKHN0cnVjdCBmc2xfcHFfbWRpb19kYXRhKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZ2lhbmZhci5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2dpYW5mYXIuYwppbmRleCBkMjA5MzVkLi40YjRmNWJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZ2lhbmZhci5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9naWFuZmFyLmMKQEAgLTI5MjIsMTcgKzI5MjIsMjUgQEAKIHsKIAl1bnNpZ25lZCBpbnQgc2l6ZSA9IGxzdGF0dXMgJiBCRF9MRU5HVEhfTUFTSzsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHJ4Yi0+cGFnZTsKKwlib29sIGxhc3QgPSAhIShsc3RhdHVzICYgQkRfTEZMQUcoUlhCRF9MQVNUKSk7CiAKIAkvKiBSZW1vdmUgdGhlIEZDUyBmcm9tIHRoZSBwYWNrZXQgbGVuZ3RoICovCi0JaWYgKGxpa2VseShsc3RhdHVzICYgQkRfTEZMQUcoUlhCRF9MQVNUKSkpCisJaWYgKGxhc3QpCiAJCXNpemUgLT0gRVRIX0ZDU19MRU47CiAKLQlpZiAobGlrZWx5KGZpcnN0KSkKKwlpZiAobGlrZWx5KGZpcnN0KSkgewogCQlza2JfcHV0KHNrYiwgc2l6ZSk7Ci0JZWxzZQotCQlza2JfYWRkX3J4X2ZyYWcoc2tiLCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzLCBwYWdlLAotCQkJCXJ4Yi0+cGFnZV9vZmZzZXQgKyBSWEJVRl9BTElHTk1FTlQsCi0JCQkJc2l6ZSwgR0ZBUl9SWEJfVFJVRVNJWkUpOworCX0gZWxzZSB7CisJCS8qIHRoZSBsYXN0IGZyYWdtZW50cycgbGVuZ3RoIGNvbnRhaW5zIHRoZSBmdWxsIGZyYW1lIGxlbmd0aCAqLworCQlpZiAobGFzdCkKKwkJCXNpemUgLT0gc2tiLT5sZW47CisKKwkJLyogaW4gY2FzZSB0aGUgbGFzdCBmcmFnbWVudCBjb25zaXN0ZWQgb25seSBvZiB0aGUgRkNTICovCisJCWlmIChzaXplID4gMCkKKwkJCXNrYl9hZGRfcnhfZnJhZyhza2IsIHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MsIHBhZ2UsCisJCQkJCXJ4Yi0+cGFnZV9vZmZzZXQgKyBSWEJVRl9BTElHTk1FTlQsCisJCQkJCXNpemUsIEdGQVJfUlhCX1RSVUVTSVpFKTsKKwl9CiAKIAkvKiB0cnkgcmV1c2UgcGFnZSAqLwogCWlmICh1bmxpa2VseShwYWdlX2NvdW50KHBhZ2UpICE9IDEpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2dpYW5mYXIuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9naWFuZmFyLmgKaW5kZXggMzczZmQwOS4uNmU4YTljOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2dpYW5mYXIuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZ2lhbmZhci5oCkBAIC0xMDAsNyArMTAwLDggQEAKICNkZWZpbmUgREVGQVVMVF9SWF9MRkNfVEhSICAxNgogI2RlZmluZSBERUZBVUxUX0xGQ19QVFZWQUwgIDQKIAotI2RlZmluZSBHRkFSX1JYQl9TSVpFIDE1MzYKKy8qIHByZXZlbnQgZnJhZ21lbmF0aW9uIGJ5IEhXIGluIERTQSBlbnZpcm9ubWVudHMgKi8KKyNkZWZpbmUgR0ZBUl9SWEJfU0laRSByb3VuZHVwKDE1MzYgKyA4LCA2NCkKICNkZWZpbmUgR0ZBUl9TS0JGUkFHX1NJWkUgKFJYQlVGX0FMSUdOTUVOVCArIEdGQVJfUlhCX1NJWkUgXAogCQkJICArIFNLQl9EQVRBX0FMSUdOKHNpemVvZihzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvKSkpCiAjZGVmaW5lIEdGQVJfUlhCX1RSVUVTSVpFIDIwNDgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS91Y2NfZ2V0aC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL3VjY19nZXRoLmMKaW5kZXggNWJmMWFkZS4uMTg2ZWY4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL3VjY19nZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL3VjY19nZXRoLmMKQEAgLTM3NTYsNyArMzc1Niw3IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlpZiAoKCpwcm9wIDwgUUVfQ0xLX05PTkUpIHx8ICgqcHJvcCA+IFFFX0NMSzI0KSkgewotCQkJcHJfZXJyKCJpbnZhbGlkIHJ4LWNsb2NrIHByb3BwZXJ0eVxuIik7CisJCQlwcl9lcnIoImludmFsaWQgcngtY2xvY2sgcHJvcGVydHlcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJdWdfaW5mby0+dWZfaW5mby5yeF9jbG9jayA9ICpwcm9wOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL3hnbWFjX21kaW8uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS94Z21hY19tZGlvLmMKaW5kZXggN2I4ZmU4Ni4uZTAzYjMwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL3hnbWFjX21kaW8uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUveGdtYWNfbWRpby5jCkBAIC0yNzEsMTEgKzI3MSw4IEBACiAJCWdvdG8gZXJyX2lvcmVtYXA7CiAJfQogCi0JaWYgKG9mX2dldF9wcm9wZXJ0eShwZGV2LT5kZXYub2Zfbm9kZSwKLQkJCSAgICAibGl0dGxlLWVuZGlhbiIsIE5VTEwpKQotCQlwcml2LT5pc19saXR0bGVfZW5kaWFuID0gdHJ1ZTsKLQllbHNlCi0JCXByaXYtPmlzX2xpdHRsZV9lbmRpYW4gPSBmYWxzZTsKKwlwcml2LT5pc19saXR0bGVfZW5kaWFuID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCQkJICAgICAgICJsaXR0bGUtZW5kaWFuIik7CiAKIAlyZXQgPSBvZl9tZGlvYnVzX3JlZ2lzdGVyKGJ1cywgbnApOwogCWlmIChyZXQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9oaXAwNF9ldGguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9oaXAwNF9ldGguYwppbmRleCAwYzRhZmU5Li4zOTc3ODg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaGlwMDRfZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hpcDA0X2V0aC5jCkBAIC02MDAsNyArNjAwLDcgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLWVudW0gaHJ0aW1lcl9yZXN0YXJ0IHR4X2RvbmUoc3RydWN0IGhydGltZXIgKmhydGltZXIpCitzdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgdHhfZG9uZShzdHJ1Y3QgaHJ0aW1lciAqaHJ0aW1lcikKIHsKIAlzdHJ1Y3QgaGlwMDRfcHJpdiAqcHJpdjsKIApAQCAtNzU1LDEzICs3NTUsMTMgQEAKIAlzdHJsY3B5KGRydmluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OLCBzaXplb2YoZHJ2aW5mby0+dmVyc2lvbikpOwogfQogCi1zdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGhpcDA0X2V0aHRvb2xfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBoaXAwNF9ldGh0b29sX29wcyA9IHsKIAkuZ2V0X2NvYWxlc2NlCQk9IGhpcDA0X2dldF9jb2FsZXNjZSwKIAkuc2V0X2NvYWxlc2NlCQk9IGhpcDA0X3NldF9jb2FsZXNjZSwKIAkuZ2V0X2RydmluZm8JCT0gaGlwMDRfZ2V0X2RydmluZm8sCiB9OwogCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGhpcDA0X25ldGRldl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGhpcDA0X25ldGRldl9vcHMgPSB7CiAJLm5kb19vcGVuCQk9IGhpcDA0X21hY19vcGVuLAogCS5uZG9fc3RvcAkJPSBoaXAwNF9tYWNfc3RvcCwKIAkubmRvX2dldF9zdGF0cwkJPSBoaXAwNF9nZXRfc3RhdHMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaGlzaV9mZW1hYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hpc2lfZmVtYWMuYwppbmRleCBiNWQ3YWQwLi5jZWQxODU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaGlzaV9mZW1hYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9oaXNpX2ZlbWFjLmMKQEAgLTY5OSw3ICs2OTksNyBAQAogCXJldHVybiBwaHlfbWlpX2lvY3RsKGRldi0+cGh5ZGV2LCBpZnJlcSwgY21kKTsKIH0KIAotc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBoaXNpX2ZlbWFjX2V0aHRvb2xzX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgaGlzaV9mZW1hY19ldGh0b29sc19vcHMgPSB7CiAJLmdldF9saW5rCQk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCiAJLmdldF9saW5rX2tzZXR0aW5ncwk9IHBoeV9ldGh0b29sX2dldF9saW5rX2tzZXR0aW5ncywKIAkuc2V0X2xpbmtfa3NldHRpbmdzCT0gcGh5X2V0aHRvb2xfc2V0X2xpbmtfa3NldHRpbmdzLApAQCAtOTQwLDggKzk0MCw4IEBACiB9CiAKICNpZmRlZiBDT05GSUdfUE0KLWludCBoaXNpX2ZlbWFjX2Rydl9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JCQkgICBwbV9tZXNzYWdlX3Qgc3RhdGUpCitzdGF0aWMgaW50IGhpc2lfZmVtYWNfZHJ2X3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBoaXNpX2ZlbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKQEAgLTk1Nyw3ICs5NTcsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgaGlzaV9mZW1hY19kcnZfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IGhpc2lfZmVtYWNfZHJ2X3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IGhpc2lfZmVtYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hpeDVoZDJfZ21hYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hpeDVoZDJfZ21hYy5jCmluZGV4IDI3NTYxOGIuLmU2OWE2YmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9oaXg1aGQyX2dtYWMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaGl4NWhkMl9nbWFjLmMKQEAgLTc1MCw3ICs3NTAsNyBAQAogCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gaGl4NWhkMl9uZXRfc2V0X21hY19hZGRyZXNzLAogfTsKIAotc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBoaXg1aGQyX2V0aHRvb2xzX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgaGl4NWhkMl9ldGh0b29sc19vcHMgPSB7CiAJLmdldF9saW5rCQk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCiAJLmdldF9saW5rX2tzZXR0aW5ncyAgICAgPSBwaHlfZXRodG9vbF9nZXRfbGlua19rc2V0dGluZ3MsCiAJLnNldF9saW5rX2tzZXR0aW5ncyAgICAgPSBwaHlfZXRodG9vbF9zZXRfbGlua19rc2V0dGluZ3MsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19kc2FmX2dtYWMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfZ21hYy5jCmluZGV4IDEyMzVjN2YuLjFlMWViOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfZ21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfZ21hYy5jCkBAIC0xNyw3ICsxNyw3IEBACiAJeyJnbWFjX3J4X29jdGV0c190b3RhbF9vayIsIE1BQ19TVEFUU19GSUVMRF9PRkYocnhfZ29vZF9ieXRlcyl9LAogCXsiZ21hY19yeF9vY3RldHNfYmFkIiwgTUFDX1NUQVRTX0ZJRUxEX09GRihyeF9iYWRfYnl0ZXMpfSwKIAl7ImdtYWNfcnhfdWNfcGt0cyIsIE1BQ19TVEFUU19GSUVMRF9PRkYocnhfdWNfcGt0cyl9LAotCXsiZ2FtY19yeF9tY19wa3RzIiwgTUFDX1NUQVRTX0ZJRUxEX09GRihyeF9tY19wa3RzKX0sCisJeyJnbWFjX3J4X21jX3BrdHMiLCBNQUNfU1RBVFNfRklFTERfT0ZGKHJ4X21jX3BrdHMpfSwKIAl7ImdtYWNfcnhfYmNfcGt0cyIsIE1BQ19TVEFUU19GSUVMRF9PRkYocnhfYmNfcGt0cyl9LAogCXsiZ21hY19yeF9wa3RzXzY0b2N0ZXRzIiwgTUFDX1NUQVRTX0ZJRUxEX09GRihyeF82NGJ5dGVzKX0sCiAJeyJnbWFjX3J4X3BrdHNfNjV0bzEyNyIsIE1BQ19TVEFUU19GSUVMRF9PRkYocnhfNjV0bzEyNyl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZHNhZl9tYWMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfbWFjLmMKaW5kZXggNWM4YWZlMS4uYTgzNDc3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZHNhZl9tYWMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19kc2FmX21hYy5jCkBAIC02ODQsOCArNjg0LDcgQEAKIAlpZiAoIXBoeSB8fCBJU19FUlIocGh5KSkKIAkJcmV0dXJuIC1FSU87CiAKLQlpZiAobWRpby0+aXJxKQotCQlwaHktPmlycSA9IG1kaW8tPmlycVthZGRyXTsKKwlwaHktPmlycSA9IG1kaW8tPmlycVthZGRyXTsKIAogCS8qIEFsbCBkYXRhIGlzIG5vdyBzdG9yZWQgaW4gdGhlIHBoeSBzdHJ1Y3Q7CiAJICogcmVnaXN0ZXIgaXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZHNhZl9tYWluLmMKaW5kZXggYWZiNWRhYS4uZWI0NDhkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZHNhZl9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZHNhZl9tYWluLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KIApAQCAtMTE1LDEwICsxMTYsOCBAQAogCiAJCQlkc2FmX2Rldi0+c2NfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LAogCQkJCQkJCQkgIHJlcyk7Ci0JCQlpZiAoSVNfRVJSKGRzYWZfZGV2LT5zY19iYXNlKSkgewotCQkJCWRldl9lcnIoZHNhZl9kZXYtPmRldiwgInN1YmN0cmwgY2FuIG5vdCBtYXAhXG4iKTsKKwkJCWlmIChJU19FUlIoZHNhZl9kZXYtPnNjX2Jhc2UpKQogCQkJCXJldHVybiBQVFJfRVJSKGRzYWZfZGV2LT5zY19iYXNlKTsKLQkJCX0KIAogCQkJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLAogCQkJCQkJICAgIHJlc19pZHgrKyk7CkBAIC0xMjksMTAgKzEyOCw4IEBACiAKIAkJCWRzYWZfZGV2LT5zZHNfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LAogCQkJCQkJCQkgICByZXMpOwotCQkJaWYgKElTX0VSUihkc2FmX2Rldi0+c2RzX2Jhc2UpKSB7Ci0JCQkJZGV2X2Vycihkc2FmX2Rldi0+ZGV2LCAic2VyZGVzLWN0cmwgY2FuIG5vdCBtYXAhXG4iKTsKKwkJCWlmIChJU19FUlIoZHNhZl9kZXYtPnNkc19iYXNlKSkKIAkJCQlyZXR1cm4gUFRSX0VSUihkc2FmX2Rldi0+c2RzX2Jhc2UpOwotCQkJfQogCQl9IGVsc2UgewogCQkJZHNhZl9kZXYtPnN1Yl9jdHJsID0gc3lzY29uOwogCQl9CkBAIC0xNDcsMTAgKzE0NCw4IEBACiAJCX0KIAl9CiAJZHNhZl9kZXYtPnBwZV9iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7Ci0JaWYgKElTX0VSUihkc2FmX2Rldi0+cHBlX2Jhc2UpKSB7Ci0JCWRldl9lcnIoZHNhZl9kZXYtPmRldiwgInBwZS1iYXNlIHJlc291cmNlIGNhbiBub3QgbWFwIVxuIik7CisJaWYgKElTX0VSUihkc2FmX2Rldi0+cHBlX2Jhc2UpKQogCQlyZXR1cm4gUFRSX0VSUihkc2FmX2Rldi0+cHBlX2Jhc2UpOwotCX0KIAlkc2FmX2Rldi0+cHBlX3BhZGRyID0gcmVzLT5zdGFydDsKIAogCWlmICghSE5TX0RTQUZfSVNfREVCVUcoZHNhZl9kZXYpKSB7CkBAIC0xNjYsMTAgKzE2MSw4IEBACiAJCQl9CiAJCX0KIAkJZHNhZl9kZXYtPmlvX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKLQkJaWYgKElTX0VSUihkc2FmX2Rldi0+aW9fYmFzZSkpIHsKLQkJCWRldl9lcnIoZHNhZl9kZXYtPmRldiwgImRzYWYtYmFzZSByZXNvdXJjZSBjYW4gbm90IG1hcCFcbiIpOworCQlpZiAoSVNfRVJSKGRzYWZfZGV2LT5pb19iYXNlKSkKIAkJCXJldHVybiBQVFJfRVJSKGRzYWZfZGV2LT5pb19iYXNlKTsKLQkJfQogCX0KIAogCXJldCA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMihkc2FmX2Rldi0+ZGV2LCAiZGVzYy1udW0iLCAmZGVzY19udW0pOwpAQCAtMjc4MSw2ICsyNzc0LDg5IEBACiAKIG1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoZ19kc2FmX2RyaXZlcik7CiAKKy8qKgorICogaG5zX2RzYWZfcm9jZV9yZXNldCAtIHJlc2V0IGRzYWYgYW5kIHJvY2UKKyAqIEBkc2FmX2Z3bm9kZTogUG9pbnRlciB0byBmcmFtZXdvcmsgbm9kZSBmb3IgdGhlIGRhc2YKKyAqIEBlbmFibGU6IGZhbHNlIC0gcmVxdWVzdCByZXNldCAsIHRydWUgLSBkcm9wIHJlc2V0CisgKiByZXR1ZW4gMCAtIHN1Y2Nlc3MgLCBuZWdhdGl2ZSAtZmFpbAorICovCitpbnQgaG5zX2RzYWZfcm9jZV9yZXNldChzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZHNhZl9md25vZGUsIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBkc2FmX2RldmljZSAqZHNhZl9kZXY7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwl1MzIgbXA7CisJdTMyIHNsOworCXUzMiBjcmVkaXQ7CisJaW50IGk7CisJY29uc3QgdTMyIHBvcnRfbWFwW0RTQUZfUk9DRV9DUkVESVRfQ0hOXVtEU0FGX1JPQ0VfQ0hBTl9NT0RFX05VTV0gPSB7CisJCXtEU0FGX1JPQ0VfUE9SVF8wLCBEU0FGX1JPQ0VfUE9SVF8wLCBEU0FGX1JPQ0VfUE9SVF8wfSwKKwkJe0RTQUZfUk9DRV9QT1JUXzEsIERTQUZfUk9DRV9QT1JUXzAsIERTQUZfUk9DRV9QT1JUXzB9LAorCQl7RFNBRl9ST0NFX1BPUlRfMiwgRFNBRl9ST0NFX1BPUlRfMSwgRFNBRl9ST0NFX1BPUlRfMH0sCisJCXtEU0FGX1JPQ0VfUE9SVF8zLCBEU0FGX1JPQ0VfUE9SVF8xLCBEU0FGX1JPQ0VfUE9SVF8wfSwKKwkJe0RTQUZfUk9DRV9QT1JUXzQsIERTQUZfUk9DRV9QT1JUXzIsIERTQUZfUk9DRV9QT1JUXzF9LAorCQl7RFNBRl9ST0NFX1BPUlRfNCwgRFNBRl9ST0NFX1BPUlRfMiwgRFNBRl9ST0NFX1BPUlRfMX0sCisJCXtEU0FGX1JPQ0VfUE9SVF81LCBEU0FGX1JPQ0VfUE9SVF8zLCBEU0FGX1JPQ0VfUE9SVF8xfSwKKwkJe0RTQUZfUk9DRV9QT1JUXzUsIERTQUZfUk9DRV9QT1JUXzMsIERTQUZfUk9DRV9QT1JUXzF9LAorCX07CisJY29uc3QgdTMyIHNsX21hcFtEU0FGX1JPQ0VfQ1JFRElUX0NITl1bRFNBRl9ST0NFX0NIQU5fTU9ERV9OVU1dID0geworCQl7RFNBRl9ST0NFX1NMXzAsIERTQUZfUk9DRV9TTF8wLCBEU0FGX1JPQ0VfU0xfMH0sCisJCXtEU0FGX1JPQ0VfU0xfMCwgRFNBRl9ST0NFX1NMXzEsIERTQUZfUk9DRV9TTF8xfSwKKwkJe0RTQUZfUk9DRV9TTF8wLCBEU0FGX1JPQ0VfU0xfMCwgRFNBRl9ST0NFX1NMXzJ9LAorCQl7RFNBRl9ST0NFX1NMXzAsIERTQUZfUk9DRV9TTF8xLCBEU0FGX1JPQ0VfU0xfM30sCisJCXtEU0FGX1JPQ0VfU0xfMCwgRFNBRl9ST0NFX1NMXzAsIERTQUZfUk9DRV9TTF8wfSwKKwkJe0RTQUZfUk9DRV9TTF8xLCBEU0FGX1JPQ0VfU0xfMSwgRFNBRl9ST0NFX1NMXzF9LAorCQl7RFNBRl9ST0NFX1NMXzAsIERTQUZfUk9DRV9TTF8wLCBEU0FGX1JPQ0VfU0xfMn0sCisJCXtEU0FGX1JPQ0VfU0xfMSwgRFNBRl9ST0NFX1NMXzEsIERTQUZfUk9DRV9TTF8zfSwKKwl9OworCisJaWYgKCFpc19vZl9ub2RlKGRzYWZfZndub2RlKSkgeworCQlwcl9lcnIoImhpc2lfZHNhZjogT25seSBzdXBwb3J0IERUIG5vZGUhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBkZXYgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKHRvX29mX25vZGUoZHNhZl9md25vZGUpKTsKKwlkc2FmX2RldiA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlpZiAoQUVfSVNfVkVSMShkc2FmX2Rldi0+ZHNhZl92ZXIpKSB7CisJCWRldl9lcnIoZHNhZl9kZXYtPmRldiwgIiVzIHYxIGNoaXAgZG9lc24ndCBzdXBwb3J0IFJvQ0UhXG4iLAorCQkJZHNhZl9kZXYtPmFlX2Rldi5uYW1lKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCFlbmFibGUpIHsKKwkJLyogUmVzZXQgcm9jZWUtY2hhbm5lbHMgaW4gZHNhZiBhbmQgcm9jZWUgKi8KKwkJaG5zX2RzYWZfc3JzdF9jaG5zKGRzYWZfZGV2LCBEU0FGX0NITlNfTUFTSywgZmFsc2UpOworCQlobnNfZHNhZl9yb2NlX3Nyc3QoZHNhZl9kZXYsIGZhbHNlKTsKKwl9IGVsc2UgeworCQkvKiBDb25maWd1cmUgZHNhZiB0eCByb2NlIGNvcnJlc3BvbmQgdG8gcG9ydCBtYXAgYW5kIHNsIG1hcCAqLworCQltcCA9IGRzYWZfcmVhZF9kZXYoZHNhZl9kZXYsIERTQUZfUk9DRV9QT1JUX01BUF9SRUcpOworCQlmb3IgKGkgPSAwOyBpIDwgRFNBRl9ST0NFX0NSRURJVF9DSE47IGkrKykKKwkJCWRzYWZfc2V0X2ZpZWxkKG1wLCA3IDw8IGkgKiAzLCBpICogMywKKwkJCQkgICAgICAgcG9ydF9tYXBbaV1bRFNBRl9ST0NFXzZQT1JUX01PREVdKTsKKwkJZHNhZl9zZXRfZmllbGQobXAsIDMgPDwgaSAqIDMsIGkgKiAzLCAwKTsKKwkJZHNhZl93cml0ZV9kZXYoZHNhZl9kZXYsIERTQUZfUk9DRV9QT1JUX01BUF9SRUcsIG1wKTsKKworCQlzbCA9IGRzYWZfcmVhZF9kZXYoZHNhZl9kZXYsIERTQUZfUk9DRV9TTF9NQVBfUkVHKTsKKwkJZm9yIChpID0gMDsgaSA8IERTQUZfUk9DRV9DUkVESVRfQ0hOOyBpKyspCisJCQlkc2FmX3NldF9maWVsZChzbCwgMyA8PCBpICogMiwgaSAqIDIsCisJCQkJICAgICAgIHNsX21hcFtpXVtEU0FGX1JPQ0VfNlBPUlRfTU9ERV0pOworCQlkc2FmX3dyaXRlX2Rldihkc2FmX2RldiwgRFNBRl9ST0NFX1NMX01BUF9SRUcsIHNsKTsKKworCQkvKiBEZS1yZXNldCByb2NlZS1jaGFubmVscyBpbiBkc2FmIGFuZCByb2NlZSAqLworCQlobnNfZHNhZl9zcnN0X2NobnMoZHNhZl9kZXYsIERTQUZfQ0hOU19NQVNLLCB0cnVlKTsKKwkJbXNsZWVwKFNSU1RfVElNRV9JTlRFUlZBTCk7CisJCWhuc19kc2FmX3JvY2Vfc3JzdChkc2FmX2RldiwgdHJ1ZSk7CisKKwkJLyogRWFuYmxlIGRzYWYgY2hhbm5lbCByb2NlZSBjcmVkaXQgKi8KKwkJY3JlZGl0ID0gZHNhZl9yZWFkX2Rldihkc2FmX2RldiwgRFNBRl9TQk1fUk9DRUVfQ0ZHX1JFR19SRUcpOworCQlkc2FmX3NldF9iaXQoY3JlZGl0LCBEU0FGX1NCTV9ST0NFRV9DRkdfQ1JEX0VOX0IsIDApOworCQlkc2FmX3dyaXRlX2Rldihkc2FmX2RldiwgRFNBRl9TQk1fUk9DRUVfQ0ZHX1JFR19SRUcsIGNyZWRpdCk7CisKKwkJZHNhZl9zZXRfYml0KGNyZWRpdCwgRFNBRl9TQk1fUk9DRUVfQ0ZHX0NSRF9FTl9CLCAxKTsKKwkJZHNhZl93cml0ZV9kZXYoZHNhZl9kZXYsIERTQUZfU0JNX1JPQ0VFX0NGR19SRUdfUkVHLCBjcmVkaXQpOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaG5zX2RzYWZfcm9jZV9yZXNldCk7CisKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIkh1YXdlaSBUZWNoLiBDby4sIEx0ZC4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiSE5TIERTQUYgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19kc2FmX21haW4uaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfbWFpbi5oCmluZGV4IDFkYWYwMTguLmYzNjgxZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfbWFpbi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfbWFpbi5oCkBAIC00Myw2ICs0MywzMiBAQAogI2RlZmluZSBEU0FGX1BSSU9fTlIJOAogI2RlZmluZSBEU0FGX1JFR19QRVJfWk9ORQkzCiAKKyNkZWZpbmUgRFNBRl9ST0NFX0NSRURJVF9DSE4JOAorI2RlZmluZSBEU0FGX1JPQ0VfQ0hBTl9NT0RFCTMKKworZW51bSBkc2FmX3JvY2VfcG9ydF9tb2RlIHsKKwlEU0FGX1JPQ0VfNlBPUlRfTU9ERSwKKwlEU0FGX1JPQ0VfNFBPUlRfTU9ERSwKKwlEU0FGX1JPQ0VfMlBPUlRfTU9ERSwKKwlEU0FGX1JPQ0VfQ0hBTl9NT0RFX05VTSwKK307CisKK2VudW0gZHNhZl9yb2NlX3BvcnRfbnVtIHsKKwlEU0FGX1JPQ0VfUE9SVF8wLAorCURTQUZfUk9DRV9QT1JUXzEsCisJRFNBRl9ST0NFX1BPUlRfMiwKKwlEU0FGX1JPQ0VfUE9SVF8zLAorCURTQUZfUk9DRV9QT1JUXzQsCisJRFNBRl9ST0NFX1BPUlRfNSwKK307CisKK2VudW0gZHNhZl9yb2NlX3Fvc19zbCB7CisJRFNBRl9ST0NFX1NMXzAsCisJRFNBRl9ST0NFX1NMXzEsCisJRFNBRl9ST0NFX1NMXzIsCisJRFNBRl9ST0NFX1NMXzMsCit9OworCiAjZGVmaW5lIERTQUZfU1RBVFNfUkVBRChwLCBvZmZzZXQpICgqKCh1NjQgKikoKHU4ICopKHApICsgKG9mZnNldCkpKSkKICNkZWZpbmUgSE5TX0RTQUZfSVNfREVCVUcoZGV2KSAoZGV2LT5kc2FmX21vZGUgPT0gRFNBRl9NT0RFX0RJU0FCTEVfU1ApCiAKQEAgLTQxOSw2ICs0NDUsMTAgQEAKIAogdm9pZCBobnNfZHNhZl9maXhfbWFjX21vZGUoc3RydWN0IGhuc19tYWNfY2IgKm1hY19jYik7CiAKK3ZvaWQgaG5zX2RzYWZfc3JzdF9jaG5zKHN0cnVjdCBkc2FmX2RldmljZSAqZHNhZl9kZXYsIHUzMiBtc2ssIGJvb2wgZW5hYmxlKTsKKwordm9pZCBobnNfZHNhZl9yb2NlX3Nyc3Qoc3RydWN0IGRzYWZfZGV2aWNlICpkc2FmX2RldiwgYm9vbCBlbmFibGUpOworCiBpbnQgaG5zX2RzYWZfYWVfaW5pdChzdHJ1Y3QgZHNhZl9kZXZpY2UgKmRzYWZfZGV2KTsKIHZvaWQgaG5zX2RzYWZfYWVfdW5pbml0KHN0cnVjdCBkc2FmX2RldmljZSAqZHNhZl9kZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19kc2FmX21pc2MuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfbWlzYy5jCmluZGV4IDYxMWI2N2IuLjM2YjlmNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfbWlzYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfbWlzYy5jCkBAIC0yMzEsNiArMjMxLDQyIEBACiAJZHNhZl93cml0ZV9zdWIoZHNhZl9kZXYsIHJlZ19hZGRyLCByZWdfdmFsKTsKIH0KIAorLyoqCisgKiBobnNfZHNhZl9zcnN0X2NobnMgLSByZXNldCBkc2FmIGNoYW5uZWxzCisgKiBAZHNhZl9kZXY6IGRzYWYgZGV2aWNlIHN0cnVjdCBwb2ludGVyCisgKiBAbXNrOiB4YmFyIGNoYW5uZWxzIG1hc2sgdmFsdWU6CisgKiBiaXQwLTUgZm9yIHhnZTAtNQorICogYml0Ni0xMSBmb3IgcHBlMC01CisgKiBiaXQxMi0xNyBmb3Igcm9jZTAtNQorICogYml0MTgtMTkgZm9yIGNvbS9kZngKKyAqIEBlbmFibGU6IGZhbHNlIC0gcmVxdWVzdCByZXNldCAsIHRydWUgLSBkcm9wIHJlc2V0CisgKi8KK3ZvaWQgaG5zX2RzYWZfc3JzdF9jaG5zKHN0cnVjdCBkc2FmX2RldmljZSAqZHNhZl9kZXYsIHUzMiBtc2ssIGJvb2wgZW5hYmxlKQoreworCXUzMiByZWdfYWRkcjsKKworCWlmICghZW5hYmxlKQorCQlyZWdfYWRkciA9IERTQUZfU1VCX1NDX0RTQUZfUkVTRVRfUkVRX1JFRzsKKwllbHNlCisJCXJlZ19hZGRyID0gRFNBRl9TVUJfU0NfRFNBRl9SRVNFVF9EUkVRX1JFRzsKKworCWRzYWZfd3JpdGVfc3ViKGRzYWZfZGV2LCByZWdfYWRkciwgbXNrKTsKK30KKwordm9pZCBobnNfZHNhZl9yb2NlX3Nyc3Qoc3RydWN0IGRzYWZfZGV2aWNlICpkc2FmX2RldiwgYm9vbCBlbmFibGUpCit7CisJaWYgKCFlbmFibGUpIHsKKwkJZHNhZl93cml0ZV9zdWIoZHNhZl9kZXYsIERTQUZfU1VCX1NDX1JPQ0VFX1JFU0VUX1JFUV9SRUcsIDEpOworCX0gZWxzZSB7CisJCWRzYWZfd3JpdGVfc3ViKGRzYWZfZGV2LAorCQkJICAgICAgIERTQUZfU1VCX1NDX1JPQ0VFX0NMS19ESVNfUkVHLCAxKTsKKwkJZHNhZl93cml0ZV9zdWIoZHNhZl9kZXYsCisJCQkgICAgICAgRFNBRl9TVUJfU0NfUk9DRUVfUkVTRVRfRFJFUV9SRUcsIDEpOworCQltc2xlZXAoMjApOworCQlkc2FmX3dyaXRlX3N1Yihkc2FmX2RldiwgRFNBRl9TVUJfU0NfUk9DRUVfQ0xLX0VOX1JFRywgMSk7CisJfQorfQorCiBzdGF0aWMgdm9pZAogaG5zX2RzYWZfeGdlX2NvcmVfc3JzdF9ieV9wb3J0X2FjcGkoc3RydWN0IGRzYWZfZGV2aWNlICpkc2FmX2RldiwKIAkJCQkgICAgdTMyIHBvcnQsIGJvb2wgZGVyZXNldCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfcHBlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19kc2FmX3BwZS5jCmluZGV4IGZmOGI2YTQuLjZlYTg3MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfcHBlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZHNhZl9wcGUuYwpAQCAtMzI4LDkgKzMyOCwxMCBAQAogc3RhdGljIHZvaWQgaG5zX3BwZV91bmluaXRfaHcoc3RydWN0IGhuc19wcGVfY2IgKnBwZV9jYikKIHsKIAl1MzIgcG9ydDsKLQlzdHJ1Y3QgZHNhZl9kZXZpY2UgKmRzYWZfZGV2ID0gcHBlX2NiLT5wcGVfY29tbW9uX2NiLT5kc2FmX2RldjsKIAogCWlmIChwcGVfY2ItPnBwZV9jb21tb25fY2IpIHsKKwkJc3RydWN0IGRzYWZfZGV2aWNlICpkc2FmX2RldiA9IHBwZV9jYi0+cHBlX2NvbW1vbl9jYi0+ZHNhZl9kZXY7CisKIAkJcG9ydCA9IHBwZV9jYi0+aW5kZXg7CiAJCWRzYWZfZGV2LT5taXNjX29wLT5wcGVfc3JzdChkc2FmX2RldiwgcG9ydCwgMCk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZHNhZl9yZWcuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfcmVnLmgKaW5kZXggMjM1Zjc0NC4uMTNjMTZhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZHNhZl9yZWcuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19kc2FmX3JlZy5oCkBAIC03Nyw2ICs3NywxMiBAQAogI2RlZmluZSBEU0FGX1NVQl9TQ19QUEVfUkVTRVRfRFJFUV9SRUcJCQkweEE0QwogI2RlZmluZSBEU0FGX1NVQl9TQ19SQ0JfUFBFX0NPTV9SRVNFVF9SRVFfUkVHCQkweEE4OAogI2RlZmluZSBEU0FGX1NVQl9TQ19SQ0JfUFBFX0NPTV9SRVNFVF9EUkVRX1JFRwkJMHhBOEMKKyNkZWZpbmUgRFNBRl9TVUJfU0NfRFNBRl9SRVNFVF9SRVFfUkVHCQkJMHhBQTgKKyNkZWZpbmUgRFNBRl9TVUJfU0NfUk9DRUVfUkVTRVRfUkVRX1JFRwkJCTB4QTUwCisjZGVmaW5lIERTQUZfU1VCX1NDX0RTQUZfUkVTRVRfRFJFUV9SRUcJCQkweEFBQworI2RlZmluZSBEU0FGX1NVQl9TQ19ST0NFRV9DTEtfRElTX1JFRwkJCTB4MzJDCisjZGVmaW5lIERTQUZfU1VCX1NDX1JPQ0VFX1JFU0VUX0RSRVFfUkVHCQkweEE1NAorI2RlZmluZSBEU0FGX1NVQl9TQ19ST0NFRV9DTEtfRU5fUkVHCQkJMHgzMjgKICNkZWZpbmUgRFNBRl9TVUJfU0NfTElHSFRfTU9EVUxFX0RFVEVDVF9FTl9SRUcJCTB4MjA2MAogI2RlZmluZSBEU0FGX1NVQl9TQ19UQ0FNX01CSVNUX0VOX1JFRwkJCTB4MjMwMAogI2RlZmluZSBEU0FGX1NVQl9TQ19EU0FGX0NMS19TVF9SRUcJCQkweDUzMDAKQEAgLTEzMyw2ICsxMzksOCBAQAogI2RlZmluZSBEU0FGX1JPQ0VFX0lOVF9TVFNfMF9SRUcJMHgyMDAKICNkZWZpbmUgRFNBRlYyX1NFUkRFU19MQktfMF9SRUcgICAgICAgICAweDIyMAogI2RlZmluZSBEU0FGX1BBVVNFX0NGR19SRUcJCTB4MjQwCisjZGVmaW5lIERTQUZfUk9DRV9QT1JUX01BUF9SRUcJCTB4MkEwCisjZGVmaW5lIERTQUZfUk9DRV9TTF9NQVBfUkVHCQkweDJBNAogI2RlZmluZSBEU0FGX1BQRV9RSURfQ0ZHXzBfUkVHCQkweDMwMAogI2RlZmluZSBEU0FGX1NXX1BPUlRfVFlQRV8wX1JFRwkJMHgzMjAKICNkZWZpbmUgRFNBRl9TVFBfUE9SVF9UWVBFXzBfUkVHCTB4MzQwCkBAIC0xNzgsNiArMTg2LDcgQEAKICNkZWZpbmUgRFNBRl9TQk1fQlBfQ0ZHXzJfWEdFX1JFR18wX1JFRwkJMHgyMDBDCiAjZGVmaW5lIERTQUZfU0JNX0JQX0NGR18yX1BQRV9SRUdfMF9SRUcJCTB4MjMwQwogI2RlZmluZSBEU0FGX1NCTV9CUF9DRkdfMl9ST0NFRV9SRUdfMF9SRUcJMHgyNjBDCisjZGVmaW5lIERTQUZfU0JNX1JPQ0VFX0NGR19SRUdfUkVHCQkweDIzODAKICNkZWZpbmUgRFNBRlYyX1NCTV9CUF9DRkdfMl9ST0NFRV9SRUdfMF9SRUcJMHgyMzhDCiAjZGVmaW5lIERTQUZfU0JNX0ZSRUVfQ05UXzBfMF9SRUcJCTB4MjAxMAogI2RlZmluZSBEU0FGX1NCTV9GUkVFX0NOVF8xXzBfUkVHCQkweDIwMTQKQEAgLTc5Niw2ICs4MDUsOSBAQAogI2RlZmluZSBEU0FGVjJfU0JNX0NGRzRfUkVTRVRfQlVGX05VTV9OT19QRkNfUyA5CiAjZGVmaW5lIERTQUZWMl9TQk1fQ0ZHNF9SRVNFVF9CVUZfTlVNX05PX1BGQ19NICgoKDFVTEwgPDwgOSkgLSAxKSA8PCA5KQogCisjZGVmaW5lIERTQUZfQ0hOU19NQVNLCQkJMHgzZjAwMAorI2RlZmluZSBEU0FGX1NCTV9ST0NFRV9DRkdfQ1JEX0VOX0IJMgorI2RlZmluZSBTUlNUX1RJTUVfSU5URVJWQUwJCTIwCiAjZGVmaW5lIERTQUZWMl9TQk1fQ0ZHMl9ST0NFRV9TRVRfQlVGX05VTV9TIDAKICNkZWZpbmUgRFNBRlYyX1NCTV9DRkcyX1JPQ0VFX1NFVF9CVUZfTlVNX00gKCgoMVVMTCA8PCA4KSAtIDEpIDw8IDApCiAjZGVmaW5lIERTQUZWMl9TQk1fQ0ZHMl9ST0NFRV9SRVNFVF9CVUZfTlVNX1MgOApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZW5ldC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZW5ldC5jCmluZGV4IGQ3ZTFmOGMuLjA1OWFhZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2VuZXQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19lbmV0LmMKQEAgLTk5NCwxMCArOTk0LDEwIEBACiAJc3RydWN0IGhuYWVfaGFuZGxlICpoID0gcHJpdi0+YWVfaGFuZGxlOwogCWludCBzdGF0ZSA9IDE7CiAKLQlpZiAocHJpdi0+cGh5KSB7CisJaWYgKG5kZXYtPnBoeWRldikgewogCQloLT5kZXYtPm9wcy0+YWRqdXN0X2xpbmsoaCwgbmRldi0+cGh5ZGV2LT5zcGVlZCwKIAkJCQkJIG5kZXYtPnBoeWRldi0+ZHVwbGV4KTsKLQkJc3RhdGUgPSBwcml2LT5waHktPmxpbms7CisJCXN0YXRlID0gbmRldi0+cGh5ZGV2LT5saW5rOwogCX0KIAlzdGF0ZSA9IHN0YXRlICYmIGgtPmRldi0+b3BzLT5nZXRfc3RhdHVzKGgpOwogCkBAIC0xMDIyLDcgKzEwMjIsNiBAQAogICovCiBpbnQgaG5zX25pY19pbml0X3BoeShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGhuYWVfaGFuZGxlICpoKQogewotCXN0cnVjdCBobnNfbmljX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5X2RldiA9IGgtPnBoeV9kZXY7CiAJaW50IHJldDsKIApAQCAtMTA0Niw4ICsxMDQ1LDYgQEAKIAlpZiAoaC0+cGh5X2lmID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9YR01JSSkKIAkJcGh5X2Rldi0+YXV0b25lZyA9IGZhbHNlOwogCi0JcHJpdi0+cGh5ID0gcGh5X2RldjsKLQogCXJldHVybiAwOwogfQogCkBAIC0xMjI0LDggKzEyMjEsOCBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0X3N0YXJ0X2VycjsKIAotCWlmIChwcml2LT5waHkpCi0JCXBoeV9zdGFydChwcml2LT5waHkpOworCWlmIChuZGV2LT5waHlkZXYpCisJCXBoeV9zdGFydChuZGV2LT5waHlkZXYpOwogCiAJY2xlYXJfYml0KE5JQ19TVEFURV9ET1dOLCAmcHJpdi0+c3RhdGUpOwogCSh2b2lkKW1vZF90aW1lcigmcHJpdi0+c2VydmljZV90aW1lciwgamlmZmllcyArIFNFUlZJQ0VfVElNRVJfSFopOwpAQCAtMTI1OSw4ICsxMjU2LDggQEAKIAluZXRpZl90eF9kaXNhYmxlKG5kZXYpOwogCXByaXYtPmxpbmsgPSAwOwogCi0JaWYgKHByaXYtPnBoeSkKLQkJcGh5X3N0b3AocHJpdi0+cGh5KTsKKwlpZiAobmRldi0+cGh5ZGV2KQorCQlwaHlfc3RvcChuZGV2LT5waHlkZXYpOwogCiAJb3BzID0gcHJpdi0+YWVfaGFuZGxlLT5kZXYtPm9wczsKIApAQCAtMTM1OSw4ICsxMzU2LDcgQEAKIHN0YXRpYyBpbnQgaG5zX25pY19kb19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwKIAkJCSAgICBpbnQgY21kKQogewotCXN0cnVjdCBobnNfbmljX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlfZGV2ID0gcHJpdi0+cGh5OworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlfZGV2ID0gbmV0ZGV2LT5waHlkZXY7CiAKIAlpZiAoIW5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMDE3LDkgKzIwMTMsOCBAQAogCQlobnNfbmljX3VuaW5pdF9yaW5nX2RhdGEocHJpdik7CiAJcHJpdi0+cmluZ19kYXRhID0gTlVMTDsKIAotCWlmIChwcml2LT5waHkpCi0JCXBoeV9kaXNjb25uZWN0KHByaXYtPnBoeSk7Ci0JcHJpdi0+cGh5ID0gTlVMTDsKKwlpZiAobmRldi0+cGh5ZGV2KQorCQlwaHlfZGlzY29ubmVjdChuZGV2LT5waHlkZXYpOwogCiAJaWYgKCFJU19FUlJfT1JfTlVMTChwcml2LT5hZV9oYW5kbGUpKQogCQlobmFlX3B1dF9oYW5kbGUocHJpdi0+YWVfaGFuZGxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2VuZXQuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2VuZXQuaAppbmRleCA0NGJiMzAxLi41YjQxMmRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19lbmV0LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZW5ldC5oCkBAIC01OSw3ICs1OSw2IEBACiAJdTMyIHBvcnRfaWQ7CiAJaW50IHBoeV9tb2RlOwogCWludCBwaHlfbGVkX3ZhbDsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5OwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCXN0cnVjdCBobmFlX2hhbmRsZSAqYWVfaGFuZGxlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZXRodG9vbC5jCmluZGV4IGFiMzM0ODcuLjQ3ZTU5YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19ldGh0b29sLmMKQEAgLTQ4LDkgKzQ4LDkgQEAKIAogCWggPSBwcml2LT5hZV9oYW5kbGU7CiAKLQlpZiAocHJpdi0+cGh5KSB7Ci0JCWlmICghZ2VucGh5X3JlYWRfc3RhdHVzKHByaXYtPnBoeSkpCi0JCQlsaW5rX3N0YXQgPSBwcml2LT5waHktPmxpbms7CisJaWYgKG5ldF9kZXYtPnBoeWRldikgeworCQlpZiAoIWdlbnBoeV9yZWFkX3N0YXR1cyhuZXRfZGV2LT5waHlkZXYpKQorCQkJbGlua19zdGF0ID0gbmV0X2Rldi0+cGh5ZGV2LT5saW5rOwogCQllbHNlCiAJCQlsaW5rX3N0YXQgPSAwOwogCX0KQEAgLTY0LDE1ICs2NCwxNCBAQAogfQogCiBzdGF0aWMgdm9pZCBobnNfZ2V0X21kaXhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwKLQkJCSAgICAgIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQorCQkJICAgICAgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKIHsKIAlpbnQgbWRpeF9jdHJsLCBtZGl4LCByZXR2YWwsIGlzX3Jlc29sdmVkOwotCXN0cnVjdCBobnNfbmljX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5X2RldiA9IHByaXYtPnBoeTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5X2RldiA9IG5ldF9kZXYtPnBoeWRldjsKIAogCWlmICghcGh5X2RldiB8fCAhcGh5X2Rldi0+bWRpby5idXMpIHsKLQkJY21kLT5ldGhfdHBfbWRpeF9jdHJsID0gRVRIX1RQX01ESV9JTlZBTElEOwotCQljbWQtPmV0aF90cF9tZGl4ID0gRVRIX1RQX01ESV9JTlZBTElEOworCQljbWQtPmJhc2UuZXRoX3RwX21kaXhfY3RybCA9IEVUSF9UUF9NRElfSU5WQUxJRDsKKwkJY21kLT5iYXNlLmV0aF90cF9tZGl4ID0gRVRIX1RQX01ESV9JTlZBTElEOwogCQlyZXR1cm47CiAJfQogCkBAIC04OSwzNSArODgsMzUgQEAKIAogCXN3aXRjaCAobWRpeF9jdHJsKSB7CiAJY2FzZSAweDA6Ci0JCWNtZC0+ZXRoX3RwX21kaXhfY3RybCA9IEVUSF9UUF9NREk7CisJCWNtZC0+YmFzZS5ldGhfdHBfbWRpeF9jdHJsID0gRVRIX1RQX01ESTsKIAkJYnJlYWs7CiAJY2FzZSAweDE6Ci0JCWNtZC0+ZXRoX3RwX21kaXhfY3RybCA9IEVUSF9UUF9NRElfWDsKKwkJY21kLT5iYXNlLmV0aF90cF9tZGl4X2N0cmwgPSBFVEhfVFBfTURJX1g7CiAJCWJyZWFrOwogCWNhc2UgMHgzOgotCQljbWQtPmV0aF90cF9tZGl4X2N0cmwgPSBFVEhfVFBfTURJX0FVVE87CisJCWNtZC0+YmFzZS5ldGhfdHBfbWRpeF9jdHJsID0gRVRIX1RQX01ESV9BVVRPOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQljbWQtPmV0aF90cF9tZGl4X2N0cmwgPSBFVEhfVFBfTURJX0lOVkFMSUQ7CisJCWNtZC0+YmFzZS5ldGhfdHBfbWRpeF9jdHJsID0gRVRIX1RQX01ESV9JTlZBTElEOwogCQlicmVhazsKIAl9CiAKIAlpZiAoIWlzX3Jlc29sdmVkKQotCQljbWQtPmV0aF90cF9tZGl4ID0gRVRIX1RQX01ESV9JTlZBTElEOworCQljbWQtPmJhc2UuZXRoX3RwX21kaXggPSBFVEhfVFBfTURJX0lOVkFMSUQ7CiAJZWxzZSBpZiAobWRpeCkKLQkJY21kLT5ldGhfdHBfbWRpeCA9IEVUSF9UUF9NRElfWDsKKwkJY21kLT5iYXNlLmV0aF90cF9tZGl4ID0gRVRIX1RQX01ESV9YOwogCWVsc2UKLQkJY21kLT5ldGhfdHBfbWRpeCA9IEVUSF9UUF9NREk7CisJCWNtZC0+YmFzZS5ldGhfdHBfbWRpeCA9IEVUSF9UUF9NREk7CiB9CiAKIC8qKgotICpobnNfbmljX2dldF9zZXR0aW5ncyAtIGltcGxlbWVudCBldGh0b29sIGdldCBzZXR0aW5ncworICpobnNfbmljX2dldF9saW5rX2tzZXR0aW5ncyAtIGltcGxlbWVudCBldGh0b29sIGdldCBsaW5rIGtzZXR0aW5ncwogICpAbmV0X2RldjogbmV0X2RldmljZQotICpAY21kOiBldGh0b29sX2NtZAorICpAY21kOiBldGh0b29sX2xpbmtfa3NldHRpbmdzCiAgKnJldHVlbiAwIC0gc3VjY2VzcyAsIG5lZ2F0aXZlIC0tZmFpbAogICovCi1zdGF0aWMgaW50IGhuc19uaWNfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAotCQkJCXN0cnVjdCBldGh0b29sX2NtZCAqY21kKQorc3RhdGljIGludCBobnNfbmljX2dldF9saW5rX2tzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwKKwkJCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQogewogCXN0cnVjdCBobnNfbmljX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKIAlzdHJ1Y3QgaG5hZV9oYW5kbGUgKmg7CkBAIC0xMjUsNiArMTI0LDcgQEAKIAlpbnQgcmV0OwogCXU4IGR1cGxleDsKIAl1MTYgc3BlZWQ7CisJdTMyIHN1cHBvcnRlZCwgYWR2ZXJ0aXNpbmc7CiAKIAlpZiAoIXByaXYgfHwgIXByaXYtPmFlX2hhbmRsZSkKIAkJcmV0dXJuIC1FU1JDSDsKQEAgLTEzOSwzOCArMTM5LDQzIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCS8qIFdoZW4gdGhlcmUgaXMgbm8gcGh5LCBhdXRvbmVnIGlzIG9mZi4gKi8KLQljbWQtPmF1dG9uZWcgPSBmYWxzZTsKLQlldGh0b29sX2NtZF9zcGVlZF9zZXQoY21kLCBzcGVlZCk7Ci0JY21kLT5kdXBsZXggPSBkdXBsZXg7CisJZXRodG9vbF9jb252ZXJ0X2xpbmtfbW9kZV90b19sZWdhY3lfdTMyKCZzdXBwb3J0ZWQsCisJCQkJCQljbWQtPmxpbmtfbW9kZXMuc3VwcG9ydGVkKTsKKwlldGh0b29sX2NvbnZlcnRfbGlua19tb2RlX3RvX2xlZ2FjeV91MzIoJmFkdmVydGlzaW5nLAorCQkJCQkJY21kLT5saW5rX21vZGVzLmFkdmVydGlzaW5nKTsKIAotCWlmIChwcml2LT5waHkpCi0JCSh2b2lkKXBoeV9ldGh0b29sX2dzZXQocHJpdi0+cGh5LCBjbWQpOworCS8qIFdoZW4gdGhlcmUgaXMgbm8gcGh5LCBhdXRvbmVnIGlzIG9mZi4gKi8KKwljbWQtPmJhc2UuYXV0b25lZyA9IGZhbHNlOworCWNtZC0+YmFzZS5jbWQgPSBzcGVlZDsKKwljbWQtPmJhc2UuZHVwbGV4ID0gZHVwbGV4OworCisJaWYgKG5ldF9kZXYtPnBoeWRldikKKwkJKHZvaWQpcGh5X2V0aHRvb2xfa3NldHRpbmdzX2dldChuZXRfZGV2LT5waHlkZXYsIGNtZCk7CiAKIAlsaW5rX3N0YXQgPSBobnNfbmljX2dldF9saW5rKG5ldF9kZXYpOwogCWlmICghbGlua19zdGF0KSB7Ci0JCWV0aHRvb2xfY21kX3NwZWVkX3NldChjbWQsICh1MzIpU1BFRURfVU5LTk9XTik7Ci0JCWNtZC0+ZHVwbGV4ID0gRFVQTEVYX1VOS05PV047CisJCWNtZC0+YmFzZS5zcGVlZCA9ICh1MzIpU1BFRURfVU5LTk9XTjsKKwkJY21kLT5iYXNlLmR1cGxleCA9IERVUExFWF9VTktOT1dOOwogCX0KIAotCWlmIChjbWQtPmF1dG9uZWcpCi0JCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9BdXRvbmVnOworCWlmIChjbWQtPmJhc2UuYXV0b25lZykKKwkJYWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9BdXRvbmVnOwogCi0JY21kLT5zdXBwb3J0ZWQgfD0gaC0+aWZfc3VwcG9ydDsKKwlzdXBwb3J0ZWQgfD0gaC0+aWZfc3VwcG9ydDsKIAlpZiAoaC0+cGh5X2lmID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9TR01JSSkgewotCQljbWQtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfVFA7Ci0JCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbDsKKwkJc3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9UUDsKKwkJYWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbDsKIAl9IGVsc2UgaWYgKGgtPnBoeV9pZiA9PSBQSFlfSU5URVJGQUNFX01PREVfWEdNSUkpIHsKLQkJY21kLT5zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEX0ZJQlJFOwotCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwMDBiYXNlS1JfRnVsbDsKKwkJc3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9GSUJSRTsKKwkJYWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMDAwMGJhc2VLUl9GdWxsOwogCX0KIAogCXN3aXRjaCAoaC0+bWVkaWFfdHlwZSkgewogCWNhc2UgSE5BRV9NRURJQV9UWVBFX0ZJQkVSOgotCQljbWQtPnBvcnQgPSBQT1JUX0ZJQlJFOworCQljbWQtPmJhc2UucG9ydCA9IFBPUlRfRklCUkU7CiAJCWJyZWFrOwogCWNhc2UgSE5BRV9NRURJQV9UWVBFX0NPUFBFUjoKLQkJY21kLT5wb3J0ID0gUE9SVF9UUDsKKwkJY21kLT5iYXNlLnBvcnQgPSBQT1JUX1RQOwogCQlicmVhazsKIAljYXNlIEhOQUVfTUVESUFfVFlQRV9VTktOT1dOOgogCWRlZmF1bHQ6CkBAIC0xNzgsMjMgKzE4MywyNyBAQAogCX0KIAogCWlmICghKEFFX0lTX1ZFUjEocHJpdi0+ZW5ldF92ZXIpICYmIGgtPnBvcnRfdHlwZSA9PSBITkFFX1BPUlRfREVCVUcpKQotCQljbWQtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfUGF1c2U7CisJCXN1cHBvcnRlZCB8PSBTVVBQT1JURURfUGF1c2U7CiAKLQljbWQtPnRyYW5zY2VpdmVyID0gWENWUl9FWFRFUk5BTDsKLQljbWQtPm1kaW9fc3VwcG9ydCA9IChFVEhfTURJT19TVVBQT1JUU19DNDUgfCBFVEhfTURJT19TVVBQT1JUU19DMjIpOworCWV0aHRvb2xfY29udmVydF9sZWdhY3lfdTMyX3RvX2xpbmtfbW9kZShjbWQtPmxpbmtfbW9kZXMuc3VwcG9ydGVkLAorCQkJCQkJc3VwcG9ydGVkKTsKKwlldGh0b29sX2NvbnZlcnRfbGVnYWN5X3UzMl90b19saW5rX21vZGUoY21kLT5saW5rX21vZGVzLmFkdmVydGlzaW5nLAorCQkJCQkJYWR2ZXJ0aXNpbmcpOworCisJY21kLT5iYXNlLm1kaW9fc3VwcG9ydCA9IEVUSF9NRElPX1NVUFBPUlRTX0M0NSB8IEVUSF9NRElPX1NVUFBPUlRTX0MyMjsKIAlobnNfZ2V0X21kaXhfbW9kZShuZXRfZGV2LCBjbWQpOwogCiAJcmV0dXJuIDA7CiB9CiAKIC8qKgotICpobnNfbmljX3NldF9zZXR0aW5ncyAtIGltcGxlbWVudCBldGh0b29sIHNldCBzZXR0aW5ncworICpobnNfbmljX3NldF9saW5rX3NldHRpbmdzIC0gaW1wbGVtZW50IGV0aHRvb2wgc2V0IGxpbmsga3NldHRpbmdzCiAgKkBuZXRfZGV2OiBuZXRfZGV2aWNlCi0gKkBjbWQ6IGV0aHRvb2xfY21kCisgKkBjbWQ6IGV0aHRvb2xfbGlua19rc2V0dGluZ3MKICAqcmV0dWVuIDAgLSBzdWNjZXNzICwgbmVnYXRpdmUgLS1mYWlsCiAgKi8KLXN0YXRpYyBpbnQgaG5zX25pY19zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsCi0JCQkJc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCitzdGF0aWMgaW50IGhuc19uaWNfc2V0X2xpbmtfa3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCiB7CiAJc3RydWN0IGhuc19uaWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwogCXN0cnVjdCBobmFlX2hhbmRsZSAqaDsKQEAgLTIwOCwyNCArMjE3LDI1IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJaCA9IHByaXYtPmFlX2hhbmRsZTsKLQlzcGVlZCA9IGV0aHRvb2xfY21kX3NwZWVkKGNtZCk7CisJc3BlZWQgPSBjbWQtPmJhc2Uuc3BlZWQ7CiAKIAlpZiAoaC0+cGh5X2lmID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9YR01JSSkgewotCQlpZiAoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFIHx8IHNwZWVkICE9IFNQRUVEXzEwMDAwIHx8Ci0JCSAgICBjbWQtPmR1cGxleCAhPSBEVVBMRVhfRlVMTCkKKwkJaWYgKGNtZC0+YmFzZS5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFIHx8CisJCSAgICBzcGVlZCAhPSBTUEVFRF8xMDAwMCB8fAorCQkgICAgY21kLT5iYXNlLmR1cGxleCAhPSBEVVBMRVhfRlVMTCkKIAkJCXJldHVybiAtRUlOVkFMOwogCX0gZWxzZSBpZiAoaC0+cGh5X2lmID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9TR01JSSkgewotCQlpZiAoIXByaXYtPnBoeSAmJiBjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpCisJCWlmICghbmV0X2Rldi0+cGh5ZGV2ICYmIGNtZC0+YmFzZS5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJaWYgKHNwZWVkID09IFNQRUVEXzEwMDAgJiYgY21kLT5kdXBsZXggPT0gRFVQTEVYX0hBTEYpCisJCWlmIChzcGVlZCA9PSBTUEVFRF8xMDAwICYmIGNtZC0+YmFzZS5kdXBsZXggPT0gRFVQTEVYX0hBTEYpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKHByaXYtPnBoeSkKLQkJCXJldHVybiBwaHlfZXRodG9vbF9zc2V0KHByaXYtPnBoeSwgY21kKTsKKwkJaWYgKG5ldF9kZXYtPnBoeWRldikKKwkJCXJldHVybiBwaHlfZXRodG9vbF9rc2V0dGluZ3Nfc2V0KG5ldF9kZXYtPnBoeWRldiwgY21kKTsKIAogCQlpZiAoKHNwZWVkICE9IFNQRUVEXzEwICYmIHNwZWVkICE9IFNQRUVEXzEwMCAmJgotCQkgICAgIHNwZWVkICE9IFNQRUVEXzEwMDApIHx8IChjbWQtPmR1cGxleCAhPSBEVVBMRVhfSEFMRiAmJgotCQkgICAgIGNtZC0+ZHVwbGV4ICE9IERVUExFWF9GVUxMKSkKKwkJICAgICBzcGVlZCAhPSBTUEVFRF8xMDAwKSB8fCAoY21kLT5iYXNlLmR1cGxleCAhPSBEVVBMRVhfSEFMRiAmJgorCQkgICAgIGNtZC0+YmFzZS5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfSBlbHNlIHsKIAkJbmV0ZGV2X2VycihuZXRfZGV2LCAiTm90IHN1cHBvcnRlZCEiKTsKQEAgLTIzMyw3ICsyNDMsNyBAQAogCX0KIAogCWlmIChoLT5kZXYtPm9wcy0+YWRqdXN0X2xpbmspIHsKLQkJaC0+ZGV2LT5vcHMtPmFkanVzdF9saW5rKGgsIChpbnQpc3BlZWQsIGNtZC0+ZHVwbGV4KTsKKwkJaC0+ZGV2LT5vcHMtPmFkanVzdF9saW5rKGgsIChpbnQpc3BlZWQsIGNtZC0+YmFzZS5kdXBsZXgpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTMwNSw3ICszMTUsNyBAQAogewogCWludCByZXQgPSAwOwogCXN0cnVjdCBobnNfbmljX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5X2RldiA9IHByaXYtPnBoeTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5X2RldiA9IG5kZXYtPnBoeWRldjsKIAlzdHJ1Y3QgaG5hZV9oYW5kbGUgKmggPSBwcml2LT5hZV9oYW5kbGU7CiAKIAlzd2l0Y2ggKGxvb3ApIHsKQEAgLTkxMCw3ICs5MjAsNyBAQAogCQltZW1jcHkoYnVmZiwgaG5zX25pY190ZXN0X3N0cnNbTUFDX0lOVEVSTkFMTE9PUF9TRVJERVNdLAogCQkgICAgICAgRVRIX0dTVFJJTkdfTEVOKTsKIAkJYnVmZiArPSBFVEhfR1NUUklOR19MRU47Ci0JCWlmICgocHJpdi0+cGh5KSAmJiAoIXByaXYtPnBoeS0+aXNfYzQ1KSkKKwkJaWYgKChuZXRkZXYtPnBoeWRldikgJiYgKCFuZXRkZXYtPnBoeWRldi0+aXNfYzQ1KSkKIAkJCW1lbWNweShidWZmLCBobnNfbmljX3Rlc3Rfc3Ryc1tNQUNfSU5URVJOQUxMT09QX1BIWV0sCiAJCQkgICAgICAgRVRIX0dTVFJJTkdfTEVOKTsKIApAQCAtOTk2LDcgKzEwMDYsNyBAQAogCQlpZiAocHJpdi0+YWVfaGFuZGxlLT5waHlfaWYgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1hHTUlJKQogCQkJY250LS07CiAKLQkJaWYgKCghcHJpdi0+cGh5KSB8fCAocHJpdi0+cGh5LT5pc19jNDUpKQorCQlpZiAoKCFuZXRkZXYtPnBoeWRldikgfHwgKG5ldGRldi0+cGh5ZGV2LT5pc19jNDUpKQogCQkJY250LS07CiAKIAkJcmV0dXJuIGNudDsKQEAgLTEwMTUsOCArMTAyNSw3IEBACiBpbnQgaG5zX3BoeV9sZWRfc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2YWx1ZSkKIHsKIAlpbnQgcmV0dmFsOwotCXN0cnVjdCBobnNfbmljX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlfZGV2ID0gcHJpdi0+cGh5OworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlfZGV2ID0gbmV0ZGV2LT5waHlkZXY7CiAKIAlyZXR2YWwgPSBwaHlfd3JpdGUocGh5X2RldiwgSE5TX1BIWV9QQUdFX1JFRywgSE5TX1BIWV9QQUdFX0xFRCk7CiAJcmV0dmFsIHw9IHBoeV93cml0ZShwaHlfZGV2LCBITlNfTEVEX0ZDX1JFRywgdmFsdWUpOwpAQCAtMTAzOSw3ICsxMDQ4LDcgQEAKIHsKIAlzdHJ1Y3QgaG5zX25pY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgaG5hZV9oYW5kbGUgKmggPSBwcml2LT5hZV9oYW5kbGU7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeV9kZXYgPSBwcml2LT5waHk7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeV9kZXYgPSBuZXRkZXYtPnBoeWRldjsKIAlpbnQgcmV0OwogCiAJaWYgKHBoeV9kZXYpCkBAIC0xMTU5LDggKzExNjgsNyBAQAogc3RhdGljIGludCBobnNfbmljX253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKIAlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgaG5zX25pY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ID0gcHJpdi0+cGh5OworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHkgPSBuZXRkZXYtPnBoeWRldjsKIAogCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKIAkJaWYgKHBoeSkKQEAgLTEyNjQsMTEgKzEyNzIsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGhuc19ldGh0b29sX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgaG5zX2V0aHRvb2xfb3BzID0gewogCS5nZXRfZHJ2aW5mbyA9IGhuc19uaWNfZ2V0X2RydmluZm8sCiAJLmdldF9saW5rICA9IGhuc19uaWNfZ2V0X2xpbmssCi0JLmdldF9zZXR0aW5ncyAgPSBobnNfbmljX2dldF9zZXR0aW5ncywKLQkuc2V0X3NldHRpbmdzICA9IGhuc19uaWNfc2V0X3NldHRpbmdzLAogCS5nZXRfcmluZ3BhcmFtID0gaG5zX2dldF9yaW5ncGFyYW0sCiAJLmdldF9wYXVzZXBhcmFtID0gaG5zX2dldF9wYXVzZXBhcmFtLAogCS5zZXRfcGF1c2VwYXJhbSA9IGhuc19zZXRfcGF1c2VwYXJhbSwKQEAgLTEyODgsNiArMTI5NCw4IEBACiAJLmdldF9yeGZoID0gaG5zX2dldF9yc3MsCiAJLnNldF9yeGZoID0gaG5zX3NldF9yc3MsCiAJLmdldF9yeG5mYyA9IGhuc19nZXRfcnhuZmMsCisJLmdldF9saW5rX2tzZXR0aW5ncyAgPSBobnNfbmljX2dldF9saW5rX2tzZXR0aW5ncywKKwkuc2V0X2xpbmtfa3NldHRpbmdzICA9IGhuc19uaWNfc2V0X2xpbmtfa3NldHRpbmdzLAogfTsKIAogdm9pZCBobnNfZXRodG9vbF9zZXRfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaTgyNXh4LzgyNTk2LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pODI1eHgvODI1OTYuYwppbmRleCBiZWZiNGFjLi5jZTIzNWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pODI1eHgvODI1OTYuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pODI1eHgvODI1OTYuYwpAQCAtODksMTAgKzg5LDEwIEBACiAjZGVmaW5lIERFQih4LHkpCWlmIChpNTk2X2RlYnVnICYgKHgpKSB5CiAKIAotI2lmIGRlZmluZWQoQ09ORklHX01WTUUxNnhfTkVUKSB8fCBkZWZpbmVkKENPTkZJR19NVk1FMTZ4X05FVF9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTVZNRTE2eF9ORVQpCiAjZGVmaW5lIEVOQUJMRV9NVk1FMTZ4X05FVAogI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfQlZNRTYwMDBfTkVUKSB8fCBkZWZpbmVkKENPTkZJR19CVk1FNjAwMF9ORVRfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0JWTUU2MDAwX05FVCkKICNkZWZpbmUgRU5BQkxFX0JWTUU2MDAwX05FVAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9lbWFjL2NvcmUuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9lbWFjL2NvcmUuYwppbmRleCA0Yzk3NzFkLi44ZjEzOTE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vZW1hYy9jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VtYWMvY29yZS5jCkBAIC05NzcsNyArOTc3LDM3IEBACiAJCWRldi0+bWNhc3RfcGVuZGluZyA9IDE7CiAJCXJldHVybjsKIAl9CisKKwltdXRleF9sb2NrKCZkZXYtPmxpbmtfbG9jayk7CiAJX19lbWFjX3NldF9tdWx0aWNhc3RfbGlzdChkZXYpOworCW11dGV4X3VubG9jaygmZGV2LT5saW5rX2xvY2spOworfQorCitzdGF0aWMgaW50IGVtYWNfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB2b2lkICpzYSkKK3sKKwlzdHJ1Y3QgZW1hY19pbnN0YW5jZSAqZGV2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IHNvY2thZGRyICphZGRyID0gc2E7CisJc3RydWN0IGVtYWNfcmVncyBfX2lvbWVtICpwID0gZGV2LT5lbWFjcDsKKworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyLT5zYV9kYXRhKSkKKwkgICAgICAgcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCisJbXV0ZXhfbG9jaygmZGV2LT5saW5rX2xvY2spOworCisJbWVtY3B5KG5kZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBuZGV2LT5hZGRyX2xlbik7CisKKwllbWFjX3J4X2Rpc2FibGUoZGV2KTsKKwllbWFjX3R4X2Rpc2FibGUoZGV2KTsKKwlvdXRfYmUzMigmcC0+aWFociwgKG5kZXYtPmRldl9hZGRyWzBdIDw8IDgpIHwgbmRldi0+ZGV2X2FkZHJbMV0pOworCW91dF9iZTMyKCZwLT5pYWxyLCAobmRldi0+ZGV2X2FkZHJbMl0gPDwgMjQpIHwKKwkJKG5kZXYtPmRldl9hZGRyWzNdIDw8IDE2KSB8IChuZGV2LT5kZXZfYWRkcls0XSA8PCA4KSB8CisJCW5kZXYtPmRldl9hZGRyWzVdKTsKKwllbWFjX3R4X2VuYWJsZShkZXYpOworCWVtYWNfcnhfZW5hYmxlKGRldik7CisKKwltdXRleF91bmxvY2soJmRldi0+bGlua19sb2NrKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGVtYWNfcmVzaXplX3J4X3Jpbmcoc3RydWN0IGVtYWNfaW5zdGFuY2UgKmRldiwgaW50IG5ld19tdHUpCkBAIC0yNjg2LDcgKzI3MTYsNyBAQAogCS5uZG9fZG9faW9jdGwJCT0gZW1hY19pb2N0bCwKIAkubmRvX3R4X3RpbWVvdXQJCT0gZW1hY190eF90aW1lb3V0LAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAotCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZXRoX21hY19hZGRyLAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZW1hY19zZXRfbWFjX2FkZHJlc3MsCiAJLm5kb19zdGFydF94bWl0CQk9IGVtYWNfc3RhcnRfeG1pdCwKIAkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCiB9OwpAQCAtMjY5OSw3ICsyNzI5LDcgQEAKIAkubmRvX2RvX2lvY3RsCQk9IGVtYWNfaW9jdGwsCiAJLm5kb190eF90aW1lb3V0CQk9IGVtYWNfdHhfdGltZW91dCwKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKLQkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGV0aF9tYWNfYWRkciwKKwkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGVtYWNfc2V0X21hY19hZGRyZXNzLAogCS5uZG9fc3RhcnRfeG1pdAkJPSBlbWFjX3N0YXJ0X3htaXRfc2csCiAJLm5kb19jaGFuZ2VfbXR1CQk9IGVtYWNfY2hhbmdlX210dSwKIH07CkBAIC0yNzUwLDcgKzI3ODAsNyBAQAogCS8qIEdldCBpbnRlcnJ1cHRzLiBFTUFDIGlycSBpcyBtYW5kYXRvcnksIFdPTCBpcnEgaXMgb3B0aW9uYWwgKi8KIAlkZXYtPmVtYWNfaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOwogCWRldi0+d29sX2lycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAxKTsKLQlpZiAoZGV2LT5lbWFjX2lycSA9PSBOT19JUlEpIHsKKwlpZiAoIWRldi0+ZW1hY19pcnEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2FuJ3QgbWFwIG1haW4gaW50ZXJydXB0XG4iLCBucC0+ZnVsbF9uYW1lKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CkBAIC0yOTEzLDkgKzI5NDMsOSBAQAogIGVycl9yZWdfdW5tYXA6CiAJaW91bm1hcChkZXYtPmVtYWNwKTsKICBlcnJfaXJxX3VubWFwOgotCWlmIChkZXYtPndvbF9pcnEgIT0gTk9fSVJRKQorCWlmIChkZXYtPndvbF9pcnEpCiAJCWlycV9kaXNwb3NlX21hcHBpbmcoZGV2LT53b2xfaXJxKTsKLQlpZiAoZGV2LT5lbWFjX2lycSAhPSBOT19JUlEpCisJaWYgKGRldi0+ZW1hY19pcnEpCiAJCWlycV9kaXNwb3NlX21hcHBpbmcoZGV2LT5lbWFjX2lycSk7CiAgZXJyX2ZyZWU6CiAJZnJlZV9uZXRkZXYobmRldik7CkBAIC0yOTU3LDkgKzI5ODcsOSBAQAogCWVtYWNfZGJnX3VucmVnaXN0ZXIoZGV2KTsKIAlpb3VubWFwKGRldi0+ZW1hY3ApOwogCi0JaWYgKGRldi0+d29sX2lycSAhPSBOT19JUlEpCisJaWYgKGRldi0+d29sX2lycSkKIAkJaXJxX2Rpc3Bvc2VfbWFwcGluZyhkZXYtPndvbF9pcnEpOwotCWlmIChkZXYtPmVtYWNfaXJxICE9IE5PX0lSUSkKKwlpZiAoZGV2LT5lbWFjX2lycSkKIAkJaXJxX2Rpc3Bvc2VfbWFwcGluZyhkZXYtPmVtYWNfaXJxKTsKIAogCWZyZWVfbmV0ZGV2KGRldi0+bmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vZW1hYy9tYWwuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9lbWFjL21hbC5jCmluZGV4IGZkYjVjZGIuLmFhZjZmZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9lbWFjL21hbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9lbWFjL21hbC5jCkBAIC01OTcsOSArNTk3LDggQEAKIAkJbWFsLT5yeGRlX2lycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG9mZGV2LT5kZXYub2Zfbm9kZSwgNCk7CiAJfQogCi0JaWYgKG1hbC0+dHhlb2JfaXJxID09IE5PX0lSUSB8fCBtYWwtPnJ4ZW9iX2lycSA9PSBOT19JUlEgfHwKLQkgICAgbWFsLT5zZXJyX2lycSA9PSBOT19JUlEgfHwgbWFsLT50eGRlX2lycSA9PSBOT19JUlEgfHwKLQkgICAgbWFsLT5yeGRlX2lycSA9PSBOT19JUlEpIHsKKwlpZiAoIW1hbC0+dHhlb2JfaXJxIHx8ICFtYWwtPnJ4ZW9iX2lycSB8fCAhbWFsLT5zZXJyX2lycSB8fAorCSAgICAhbWFsLT50eGRlX2lycSAgfHwgIW1hbC0+cnhkZV9pcnEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCiAJCSAgICAgICAibWFsJWQ6IGZhaWxlZCB0byBtYXAgaW50ZXJydXB0cyAhXG4iLCBpbmRleCk7CiAJCWVyciA9IC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vaWJtdm5pYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2libXZuaWMuYwppbmRleCA4OGYzYzg1Li5iZmUxN2Q5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vaWJtdm5pYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9pYm12bmljLmMKQEAgLTIwMyw3ICsyMDMsOCBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZhZGFwdGVyLT52ZGV2LT5kZXY7CiAKIAlkbWFfZnJlZV9jb2hlcmVudChkZXYsIGx0Yi0+c2l6ZSwgbHRiLT5idWZmLCBsdGItPmFkZHIpOwotCXNlbmRfcmVxdWVzdF91bm1hcChhZGFwdGVyLCBsdGItPm1hcF9pZCk7CisJaWYgKCFhZGFwdGVyLT5mYWlsb3ZlcikKKwkJc2VuZF9yZXF1ZXN0X3VubWFwKGFkYXB0ZXIsIGx0Yi0+bWFwX2lkKTsKIH0KIAogc3RhdGljIGludCBhbGxvY19yeF9wb29sKHN0cnVjdCBpYm12bmljX2FkYXB0ZXIgKmFkYXB0ZXIsCkBAIC01MjIsNyArNTIzLDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+cmVxX3J4X3F1ZXVlczsgaSsrKQogCQluYXBpX2Rpc2FibGUoJmFkYXB0ZXItPm5hcGlbaV0pOwogCi0JbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKG5ldGRldik7CisJaWYgKCFhZGFwdGVyLT5mYWlsb3ZlcikKKwkJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKG5ldGRldik7CiAKIAlpZiAoYWRhcHRlci0+Ym91bmNlX2J1ZmZlcikgewogCQlpZiAoIWRtYV9tYXBwaW5nX2Vycm9yKGRldiwgYWRhcHRlci0+Ym91bmNlX2J1ZmZlcl9kbWEpKSB7CkBAIC0xNDIyLDcgKzE0MjQsNyBAQAogCQlzY3JxID0gYWRhcHRlci0+dHhfc2NycVtpXTsKIAkJc2NycS0+aXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIHNjcnEtPmh3X2lycSk7CiAKLQkJaWYgKHNjcnEtPmlycSA9PSBOT19JUlEpIHsKKwkJaWYgKCFzY3JxLT5pcnEpIHsKIAkJCXJjID0gLUVJTlZBTDsKIAkJCWRldl9lcnIoZGV2LCAiRXJyb3IgbWFwcGluZyBpcnFcbiIpOwogCQkJZ290byByZXFfdHhfaXJxX2ZhaWxlZDsKQEAgLTE0NDIsNyArMTQ0NCw3IEBACiAJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPnJlcV9yeF9xdWV1ZXM7IGkrKykgewogCQlzY3JxID0gYWRhcHRlci0+cnhfc2NycVtpXTsKIAkJc2NycS0+aXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIHNjcnEtPmh3X2lycSk7Ci0JCWlmIChzY3JxLT5pcnEgPT0gTk9fSVJRKSB7CisJCWlmICghc2NycS0+aXJxKSB7CiAJCQlyYyA9IC1FSU5WQUw7CiAJCQlkZXZfZXJyKGRldiwgIkVycm9yIG1hcHBpbmcgaXJxXG4iKTsKIAkJCWdvdG8gcmVxX3J4X2lycV9mYWlsZWQ7CkBAIC0yNzc3LDEyICsyNzc5LDYgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgaWJtdm5pY19md19jb21wX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHNzaXplX3QgdHJhY2VfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgbGVuLAogCQkJICBsb2ZmX3QgKnBwb3MpCiB7CkBAIC0yODM0LDcgKzI4MzAsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0cmFjZV9vcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IGlibXZuaWNfZndfY29tcF9vcGVuLAorCS5vcGVuCQk9IHNpbXBsZV9vcGVuLAogCS5yZWFkCQk9IHRyYWNlX3JlYWQsCiB9OwogCkBAIC0yODg0LDcgKzI4ODAsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwYXVzZWRfb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBpYm12bmljX2Z3X2NvbXBfb3BlbiwKKwkub3BlbgkJPSBzaW1wbGVfb3BlbiwKIAkucmVhZAkJPSBwYXVzZWRfcmVhZCwKIAkud3JpdGUJCT0gcGF1c2VkX3dyaXRlLAogfTsKQEAgLTI5MzIsNyArMjkyOCw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHRyYWNpbmdfb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBpYm12bmljX2Z3X2NvbXBfb3BlbiwKKwkub3BlbgkJPSBzaW1wbGVfb3BlbiwKIAkucmVhZAkJPSB0cmFjaW5nX3JlYWQsCiAJLndyaXRlCQk9IHRyYWNpbmdfd3JpdGUsCiB9OwpAQCAtMjk4NSw3ICsyOTgxLDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXJyb3JfbGV2ZWxfb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBpYm12bmljX2Z3X2NvbXBfb3BlbiwKKwkub3BlbgkJPSBzaW1wbGVfb3BlbiwKIAkucmVhZAkJPSBlcnJvcl9sZXZlbF9yZWFkLAogCS53cml0ZQkJPSBlcnJvcl9sZXZlbF93cml0ZSwKIH07CkBAIC0zMDM2LDcgKzMwMzIsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0cmFjZV9sZXZlbF9vcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IGlibXZuaWNfZndfY29tcF9vcGVuLAorCS5vcGVuCQk9IHNpbXBsZV9vcGVuLAogCS5yZWFkCQk9IHRyYWNlX2xldmVsX3JlYWQsCiAJLndyaXRlCQk9IHRyYWNlX2xldmVsX3dyaXRlLAogfTsKQEAgLTMwODksNyArMzA4NSw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHRyYWNlX3NpemVfb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBpYm12bmljX2Z3X2NvbXBfb3BlbiwKKwkub3BlbgkJPSBzaW1wbGVfb3BlbiwKIAkucmVhZAkJPSB0cmFjZV9idWZmX3NpemVfcmVhZCwKIAkud3JpdGUJCT0gdHJhY2VfYnVmZl9zaXplX3dyaXRlLAogfTsKQEAgLTMyODAsNiArMzI3NiwxMCBAQAogCQkJcmMgPSBpYm12bmljX3NlbmRfY3JxX2luaXQoYWRhcHRlcik7CiAJCQlpZiAocmMpCiAJCQkJZGV2X2VycihkZXYsICJFcnJvciBzZW5kaW5nIGluaXQgcmM9JWxkXG4iLCByYyk7CisJCX0gZWxzZSBpZiAoZ2VuX2NycS0+Y21kID09IElCTVZOSUNfREVWSUNFX0ZBSUxPVkVSKSB7CisJCQlkZXZfaW5mbyhkZXYsICJCYWNraW5nIGRldmljZSBmYWlsb3ZlciBkZXRlY3RlZFxuIik7CisJCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCQkJYWRhcHRlci0+ZmFpbG92ZXIgPSB0cnVlOwogCQl9IGVsc2UgewogCQkJLyogVGhlIGFkYXB0ZXIgbG9zdCB0aGUgY29ubmVjdGlvbiAqLwogCQkJZGV2X2VycihkZXYsICJWaXJ0dWFsIEFkYXB0ZXIgZmFpbGVkIChyYz0lZClcbiIsCkBAIC0zNjE1LDggKzM2MTUsMTggQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYWRhcHRlci0+dmRldi0+ZGV2OwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcygzMDAwMCk7CisJYm9vbCByZXN0YXJ0ID0gZmFsc2U7CiAJaW50IHJjOwogCisJaWYgKGFkYXB0ZXItPmZhaWxvdmVyKSB7CisJCXJlbGVhc2Vfc3ViX2NycXMoYWRhcHRlcik7CisJCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKKwkJCW5ldGlmX3R4X2Rpc2FibGUobmV0ZGV2KTsKKwkJCWlibXZuaWNfY2xvc2UobmV0ZGV2KTsKKwkJCXJlc3RhcnQgPSB0cnVlOworCQl9CisJfQorCiAJc2VuZF92ZXJzaW9uX3hjaGcoYWRhcHRlcik7CiAJcmVpbml0X2NvbXBsZXRpb24oJmFkYXB0ZXItPmluaXRfZG9uZSk7CiAJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmFkYXB0ZXItPmluaXRfZG9uZSwgdGltZW91dCkpIHsKQEAgLTM2NDUsNiArMzY1NSwxNyBAQAogCiAJbmV0ZGV2LT5yZWFsX251bV90eF9xdWV1ZXMgPSBhZGFwdGVyLT5yZXFfdHhfcXVldWVzOwogCisJaWYgKGFkYXB0ZXItPmZhaWxvdmVyKSB7CisJCWFkYXB0ZXItPmZhaWxvdmVyID0gZmFsc2U7CisJCWlmIChyZXN0YXJ0KSB7CisJCQlyYyA9IGlibXZuaWNfb3BlbihuZXRkZXYpOworCQkJaWYgKHJjKQorCQkJCWdvdG8gcmVzdGFydF9mYWlsZWQ7CisJCX0KKwkJbmV0aWZfY2Fycmllcl9vbihuZXRkZXYpOworCQlyZXR1cm47CisJfQorCiAJcmMgPSByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKIAlpZiAocmMpIHsKIAkJZGV2X2VycihkZXYsCkBAIC0zNjU1LDYgKzM2NzYsOCBAQAogCiAJcmV0dXJuOwogCityZXN0YXJ0X2ZhaWxlZDoKKwlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZXN0YXJ0IGlibXZuaWMsIHJjPSVkXG4iLCByYyk7CiByZWdpc3Rlcl9mYWlsZWQ6CiAJcmVsZWFzZV9zdWJfY3JxcyhhZGFwdGVyKTsKIHRhc2tfZmFpbGVkOgpAQCAtMzY5Miw2ICszNzE1LDcgQEAKIAlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBuZXRkZXYpOwogCWFkYXB0ZXItPnZkZXYgPSBkZXY7CiAJYWRhcHRlci0+bmV0ZGV2ID0gbmV0ZGV2OworCWFkYXB0ZXItPmZhaWxvdmVyID0gZmFsc2U7CiAKIAlldGhlcl9hZGRyX2NvcHkoYWRhcHRlci0+bWFjX2FkZHIsIG1hY19hZGRyX3ApOwogCWV0aGVyX2FkZHJfY29weShuZXRkZXYtPmRldl9hZGRyLCBhZGFwdGVyLT5tYWNfYWRkcik7CkBAIC0zNzIxLDYgKzM3NDUsNyBAQAogCWlmIChkbWFfbWFwcGluZ19lcnJvcigmZGV2LT5kZXYsIGFkYXB0ZXItPnN0YXRzX3Rva2VuKSkgewogCQlpZiAoIWZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfQ01PKSkKIAkJCWRldl9lcnIoJmRldi0+ZGV2LCAiQ291bGRuJ3QgbWFwIHN0YXRzIGJ1ZmZlclxuIik7CisJCXJjID0gLUVOT01FTTsKIAkJZ290byBmcmVlX2NycTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9pYm12bmljLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vaWJtdm5pYy5oCmluZGV4IGU4Mjg5OGYuLmJmYzg0YzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9pYm12bmljLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2libXZuaWMuaApAQCAtODMwLDYgKzgzMCw3IEBACiAJSUJNVk5JQ19DUlFfSU5JVCAgICAgICAgICAgICAgICAgPSAweDAxLAogCUlCTVZOSUNfQ1JRX0lOSVRfQ09NUExFVEUgICAgICAgID0gMHgwMiwKIAlJQk1WTklDX1BBUlRJVElPTl9NSUdSQVRFRCAgICAgICA9IDB4MDYsCisJSUJNVk5JQ19ERVZJQ0VfRkFJTE9WRVIgICAgICAgICAgPSAweDA4LAogfTsKIAogc3RydWN0IGlibXZuaWNfY3JxX3F1ZXVlIHsKQEAgLTEwNDcsNCArMTA0OCw1IEBACiAJdTggbWFwX2lkOwogCiAJc3RydWN0IHdvcmtfc3RydWN0IHZuaWNfY3JxX2luaXQ7CisJYm9vbCBmYWlsb3ZlcjsKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvODI1NzEuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS84MjU3MS5jCmluZGV4IDdmZDRkNTQuLjZiMDNjODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS84MjU3MS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS84MjU3MS5jCkBAIC0yMDMyLDcgKzIwMzIsOCBAQAogCQkJCSAgfCBGTEFHMl9ESVNBQkxFX0FTUE1fTDBTCiAJCQkJICB8IEZMQUcyX0RJU0FCTEVfQVNQTV9MMQogCQkJCSAgfCBGTEFHMl9OT19ESVNBQkxFX1JYCi0JCQkJICB8IEZMQUcyX0RNQV9CVVJTVCwKKwkJCQkgIHwgRkxBRzJfRE1BX0JVUlNUCisJCQkJICB8IEZMQUcyX0NIRUNLX1NZU1RJTV9PVkVSRkxPVywKIAkucGJhCQkJPSAzMiwKIAkubWF4X2h3X2ZyYW1lX3NpemUJPSBERUZBVUxUX0pVTUJPLAogCS5nZXRfdmFyaWFudHMJCT0gZTEwMDBfZ2V0X3ZhcmlhbnRzXzgyNTcxLApAQCAtMjA1Myw3ICsyMDU0LDggQEAKIAkJCQkgIHwgRkxBR19IQVNfQ1RSTEVYVF9PTl9MT0FELAogCS5mbGFnczIJCQk9IEZMQUcyX0RJU0FCTEVfQVNQTV9MMFMKIAkJCQkgIHwgRkxBRzJfRElTQUJMRV9BU1BNX0wxCi0JCQkJICB8IEZMQUcyX05PX0RJU0FCTEVfUlgsCisJCQkJICB8IEZMQUcyX05PX0RJU0FCTEVfUlgKKwkJCQkgIHwgRkxBRzJfQ0hFQ0tfU1lTVElNX09WRVJGTE9XLAogCS5wYmEJCQk9IDMyLAogCS5tYXhfaHdfZnJhbWVfc2l6ZQk9IERFRkFVTFRfSlVNQk8sCiAJLmdldF92YXJpYW50cwkJPSBlMTAwMF9nZXRfdmFyaWFudHNfODI1NzEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvZTEwMDAuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9lMTAwMC5oCmluZGV4IGVmOTZjZDEuLjg3OWNjYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9lMTAwMC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9lMTAwMC5oCkBAIC00NTIsNiArNDUyLDcgQEAKICNkZWZpbmUgRkxBRzJfUENJTTJQQ0lfQVJCSVRFUl9XQSAgICAgICAgIEJJVCgxMSkKICNkZWZpbmUgRkxBRzJfREZMVF9DUkNfU1RSSVBQSU5HICAgICAgICAgIEJJVCgxMikKICNkZWZpbmUgRkxBRzJfQ0hFQ0tfUlhfSFdUU1RBTVAgICAgICAgICAgIEJJVCgxMykKKyNkZWZpbmUgRkxBRzJfQ0hFQ0tfU1lTVElNX09WRVJGTE9XICAgICAgIEJJVCgxNCkKIAogI2RlZmluZSBFMTAwMF9SWF9ERVNDX1BTKFIsIGkpCSAgICBcCiAJKCYoKCh1bmlvbiBlMTAwMF9yeF9kZXNjX3BhY2tldF9zcGxpdCAqKSgoUikuZGVzYykpW2ldKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9pY2g4bGFuLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvaWNoOGxhbi5jCmluZGV4IDNlMTEzMjIuLmYzYWFjYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9pY2g4bGFuLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL2ljaDhsYW4uYwpAQCAtNTg4NSw3ICs1ODg1LDggQEAKIAkJCQkgIHwgRkxBR19IQVNfSlVNQk9fRlJBTUVTCiAJCQkJICB8IEZMQUdfQVBNRV9JTl9XVUMsCiAJLmZsYWdzMgkJCT0gRkxBRzJfSEFTX1BIWV9TVEFUUwotCQkJCSAgfCBGTEFHMl9IQVNfRUVFLAorCQkJCSAgfCBGTEFHMl9IQVNfRUVFCisJCQkJICB8IEZMQUcyX0NIRUNLX1NZU1RJTV9PVkVSRkxPVywKIAkucGJhCQkJPSAyNiwKIAkubWF4X2h3X2ZyYW1lX3NpemUJPSA5MDIyLAogCS5nZXRfdmFyaWFudHMJCT0gZTEwMDBfZ2V0X3ZhcmlhbnRzX2ljaDhsYW4sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvbmV0ZGV2LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvbmV0ZGV2LmMKaW5kZXggMDJmNDQzOS4uNzAxNzI4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL25ldGRldi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9uZXRkZXYuYwpAQCAtNDMwMyw2ICs0MzAzLDQyIEBACiB9CiAKIC8qKgorICogZTEwMDBlX3Nhbml0aXplX3N5c3RpbSAtIHNhbml0aXplIHJhdyBjeWNsZSBjb3VudGVyIHJlYWRzCisgKiBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQorICogQHN5c3RpbTogY3ljbGVfdCB2YWx1ZSByZWFkLCBzYW5pdGl6ZWQgYW5kIHJldHVybmVkCisgKgorICogRXJyYXRhIGZvciA4MjU3NC84MjU4MyBwb3NzaWJsZSBiYWQgYml0cyByZWFkIGZyb20gU1lTVElNSC9MOgorICogY2hlY2sgdG8gc2VlIHRoYXQgdGhlIHRpbWUgaXMgaW5jcmVtZW50aW5nIGF0IGEgcmVhc29uYWJsZQorICogcmF0ZSBhbmQgaXMgYSBtdWx0aXBsZSBvZiBpbmN2YWx1ZS4KKyAqKi8KK3N0YXRpYyBjeWNsZV90IGUxMDAwZV9zYW5pdGl6ZV9zeXN0aW0oc3RydWN0IGUxMDAwX2h3ICpodywgY3ljbGVfdCBzeXN0aW0pCit7CisJdTY0IHRpbWVfZGVsdGEsIHJlbSwgdGVtcDsKKwljeWNsZV90IHN5c3RpbV9uZXh0OworCXUzMiBpbmN2YWx1ZTsKKwlpbnQgaTsKKworCWluY3ZhbHVlID0gZXIzMihUSU1JTkNBKSAmIEUxMDAwX1RJTUlOQ0FfSU5DVkFMVUVfTUFTSzsKKwlmb3IgKGkgPSAwOyBpIDwgRTEwMDBfTUFYXzgyNTc0X1NZU1RJTV9SRVJFQURTOyBpKyspIHsKKwkJLyogbGF0Y2ggU1lTVElNSCBvbiByZWFkIG9mIFNZU1RJTUwgKi8KKwkJc3lzdGltX25leHQgPSAoY3ljbGVfdCllcjMyKFNZU1RJTUwpOworCQlzeXN0aW1fbmV4dCB8PSAoY3ljbGVfdCllcjMyKFNZU1RJTUgpIDw8IDMyOworCisJCXRpbWVfZGVsdGEgPSBzeXN0aW1fbmV4dCAtIHN5c3RpbTsKKwkJdGVtcCA9IHRpbWVfZGVsdGE7CisJCS8qIFZNV2FyZSB1c2VycyBoYXZlIHNlZW4gaW5jdmFsdWUgb2YgemVybywgZG9uJ3QgZGl2IC8gMCAqLworCQlyZW0gPSBpbmN2YWx1ZSA/IGRvX2Rpdih0ZW1wLCBpbmN2YWx1ZSkgOiAodGltZV9kZWx0YSAhPSAwKTsKKworCQlzeXN0aW0gPSBzeXN0aW1fbmV4dDsKKworCQlpZiAoKHRpbWVfZGVsdGEgPCBFMTAwMF84MjU3NF9TWVNUSU1fRVBTSUxPTikgJiYgKHJlbSA9PSAwKSkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBzeXN0aW07Cit9CisKKy8qKgogICogZTEwMDBlX2N5Y2xlY291bnRlcl9yZWFkIC0gcmVhZCByYXcgY3ljbGUgY291bnRlciAodXNlZCBieSB0aW1lIGNvdW50ZXIpCiAgKiBAY2M6IGN5Y2xlY291bnRlciBzdHJ1Y3R1cmUKICAqKi8KQEAgLTQzMTIsNyArNDM0OCw3IEBACiAJCQkJCQkgICAgIGNjKTsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCXUzMiBzeXN0aW1lbCwgc3lzdGltZWg7Ci0JY3ljbGVfdCBzeXN0aW0sIHN5c3RpbV9uZXh0OworCWN5Y2xlX3Qgc3lzdGltOwogCS8qIFNZU1RJTUggbGF0Y2hpbmcgdXBvbiBTWVNUSU1MIHJlYWQgZG9lcyBub3Qgd29yayB3ZWxsLgogCSAqIFRoaXMgbWVhbnMgdGhhdCBpZiBTWVNUSU1MIG92ZXJmbG93cyBhZnRlciB3ZSByZWFkIGl0IGJ1dCBiZWZvcmUKIAkgKiB3ZSByZWFkIFNZU1RJTUgsIHRoZSB2YWx1ZSBvZiBTWVNUSU1IIGhhcyBiZWVuIGluY3JlbWVudGVkIGFuZCB3ZQpAQCAtNDMzNSwzMyArNDM3MSw5IEBACiAJc3lzdGltID0gKGN5Y2xlX3Qpc3lzdGltZWw7CiAJc3lzdGltIHw9IChjeWNsZV90KXN5c3RpbWVoIDw8IDMyOwogCi0JaWYgKChody0+bWFjLnR5cGUgPT0gZTEwMDBfODI1NzQpIHx8IChody0+bWFjLnR5cGUgPT0gZTEwMDBfODI1ODMpKSB7Ci0JCXU2NCB0aW1lX2RlbHRhLCByZW0sIHRlbXA7Ci0JCXUzMiBpbmN2YWx1ZTsKLQkJaW50IGk7CisJaWYgKGFkYXB0ZXItPmZsYWdzMiAmIEZMQUcyX0NIRUNLX1NZU1RJTV9PVkVSRkxPVykKKwkJc3lzdGltID0gZTEwMDBlX3Nhbml0aXplX3N5c3RpbShodywgc3lzdGltKTsKIAotCQkvKiBlcnJhdGEgZm9yIDgyNTc0LzgyNTgzIHBvc3NpYmxlIGJhZCBiaXRzIHJlYWQgZnJvbSBTWVNUSU1IL0wKLQkJICogY2hlY2sgdG8gc2VlIHRoYXQgdGhlIHRpbWUgaXMgaW5jcmVtZW50aW5nIGF0IGEgcmVhc29uYWJsZQotCQkgKiByYXRlIGFuZCBpcyBhIG11bHRpcGxlIG9mIGluY3ZhbHVlCi0JCSAqLwotCQlpbmN2YWx1ZSA9IGVyMzIoVElNSU5DQSkgJiBFMTAwMF9USU1JTkNBX0lOQ1ZBTFVFX01BU0s7Ci0JCWZvciAoaSA9IDA7IGkgPCBFMTAwMF9NQVhfODI1NzRfU1lTVElNX1JFUkVBRFM7IGkrKykgewotCQkJLyogbGF0Y2ggU1lTVElNSCBvbiByZWFkIG9mIFNZU1RJTUwgKi8KLQkJCXN5c3RpbV9uZXh0ID0gKGN5Y2xlX3QpZXIzMihTWVNUSU1MKTsKLQkJCXN5c3RpbV9uZXh0IHw9IChjeWNsZV90KWVyMzIoU1lTVElNSCkgPDwgMzI7Ci0KLQkJCXRpbWVfZGVsdGEgPSBzeXN0aW1fbmV4dCAtIHN5c3RpbTsKLQkJCXRlbXAgPSB0aW1lX2RlbHRhOwotCQkJLyogVk1XYXJlIHVzZXJzIGhhdmUgc2VlbiBpbmN2YWx1ZSBvZiB6ZXJvLCBkb24ndCBkaXYgLyAwICovCi0JCQlyZW0gPSBpbmN2YWx1ZSA/IGRvX2Rpdih0ZW1wLCBpbmN2YWx1ZSkgOiAodGltZV9kZWx0YSAhPSAwKTsKLQotCQkJc3lzdGltID0gc3lzdGltX25leHQ7Ci0KLQkJCWlmICgodGltZV9kZWx0YSA8IEUxMDAwXzgyNTc0X1NZU1RJTV9FUFNJTE9OKSAmJgotCQkJICAgIChyZW0gPT0gMCkpCi0JCQkJYnJlYWs7Ci0JCX0KLQl9CiAJcmV0dXJuIHN5c3RpbTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL3B0cC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL3B0cC5jCmluZGV4IDJlMWIxN2EuLmFkMDM3NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9wdHAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvcHRwLmMKQEAgLTMzNCw3ICszMzQsNyBAQAogCWlmIChJU19FUlIoYWRhcHRlci0+cHRwX2Nsb2NrKSkgewogCQlhZGFwdGVyLT5wdHBfY2xvY2sgPSBOVUxMOwogCQllX2VycigicHRwX2Nsb2NrX3JlZ2lzdGVyIGZhaWxlZFxuIik7Ci0JfSBlbHNlIHsKKwl9IGVsc2UgaWYgKGFkYXB0ZXItPnB0cF9jbG9jaykgewogCQllX2luZm8oInJlZ2lzdGVyZWQgUEhDIGNsb2NrXG4iKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEway5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGsuaAppbmRleCBjNGNmMDhkLi40ZDE5ZTQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEway5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrLmgKQEAgLTI0MCw5ICsyNDAsNyBAQAogCXN0cnVjdCBmbTEwa192Zl9pbmZvCXZmX2luZm9bMF07CiB9OwogCi0jZGVmaW5lIGZtMTBrX3Z4bGFuX3BvcnRfZm9yX2VhY2godnAsIGludGZjKSBcCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh2cCwgJihpbnRmYyktPnZ4bGFuX3BvcnQsIGxpc3QpCi1zdHJ1Y3QgZm0xMGtfdnhsYW5fcG9ydCB7CitzdHJ1Y3QgZm0xMGtfdWRwX3BvcnQgewogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKIAlzYV9mYW1pbHlfdAkJc2FfZmFtaWx5OwogCV9fYmUxNgkJCXBvcnQ7CkBAIC0zMzUsOCArMzMzLDkgQEAKIAl1MzIgcmV0YVtGTTEwS19SRVRBX1NJWkVdOwogCXUzMiByc3Nya1tGTTEwS19SU1NSS19TSVpFXTsKIAotCS8qIFZYTEFOIHBvcnQgdHJhY2tpbmcgaW5mb3JtYXRpb24gKi8KKwkvKiBVRFAgZW5jYXBzdWxhdGlvbiBwb3J0IHRyYWNraW5nIGluZm9ybWF0aW9uICovCiAJc3RydWN0IGxpc3RfaGVhZCB2eGxhbl9wb3J0OworCXN0cnVjdCBsaXN0X2hlYWQgZ2VuZXZlX3BvcnQ7CiAKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIAlzdHJ1Y3QgZGVudHJ5ICpkYmdfaW50ZmM7CkBAIC00NTgsNyArNDU3LDcgQEAKIG5ldGRldl90eF90IGZtMTBrX3htaXRfZnJhbWVfcmluZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSAgc3RydWN0IGZtMTBrX3JpbmcgKnR4X3JpbmcpOwogdm9pZCBmbTEwa190eF90aW1lb3V0X3Jlc2V0KHN0cnVjdCBmbTEwa19pbnRmYyAqaW50ZXJmYWNlKTsKLXU2NCBmbTEwa19nZXRfdHhfcGVuZGluZyhzdHJ1Y3QgZm0xMGtfcmluZyAqcmluZyk7Cit1NjQgZm0xMGtfZ2V0X3R4X3BlbmRpbmcoc3RydWN0IGZtMTBrX3JpbmcgKnJpbmcsIGJvb2wgaW5fc3cpOwogYm9vbCBmbTEwa19jaGVja190eF9oYW5nKHN0cnVjdCBmbTEwa19yaW5nICp0eF9yaW5nKTsKIHZvaWQgZm0xMGtfYWxsb2NfcnhfYnVmZmVycyhzdHJ1Y3QgZm0xMGtfcmluZyAqcnhfcmluZywgdTE2IGNsZWFuZWRfY291bnQpOwogCkBAIC00OTYsNyArNDk1LDYgQEAKIAogLyogRXRodG9vbCAqLwogdm9pZCBmbTEwa19zZXRfZXRodG9vbF9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci11MzIgZm0xMGtfZ2V0X3JldGFfc2l6ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKIHZvaWQgZm0xMGtfd3JpdGVfcmV0YShzdHJ1Y3QgZm0xMGtfaW50ZmMgKmludGVyZmFjZSwgY29uc3QgdTMyICppbmRpcik7CiAKIC8qIElPViAqLwpAQCAtNTA5LDcgKzUwNyw3IEBACiBzMzIgZm0xMGtfaW92X3VwZGF0ZV9wdmlkKHN0cnVjdCBmbTEwa19pbnRmYyAqaW50ZXJmYWNlLCB1MTYgZ2xvcnQsIHUxNiBwdmlkKTsKIGludCBmbTEwa19uZG9fc2V0X3ZmX21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmZfaWR4LCB1OCAqbWFjKTsKIGludCBmbTEwa19uZG9fc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCSAgaW50IHZmX2lkeCwgdTE2IHZpZCwgdTggcW9zKTsKKwkJCSAgaW50IHZmX2lkeCwgdTE2IHZpZCwgdTggcW9zLCBfX2JlMTYgdmxhbl9wcm90byk7CiBpbnQgZm0xMGtfbmRvX3NldF92Zl9idyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmZfaWR4LCBpbnQgcmF0ZSwKIAkJCWludCB1bnVzZWQpOwogaW50IGZtMTBrX25kb19nZXRfdmZfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19jb21tb24uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX2NvbW1vbi5jCmluZGV4IGQ2YmFhZWEuLmRkOTVhYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX2NvbW1vbi5jCkBAIC0yMDcsNiArMjA3LDkgQEAKIAkvKiBjbGVhciB0eF9yZWFkeSB0byBwcmV2ZW50IGFueSBmYWxzZSBoaXRzIGZvciByZXNldCAqLwogCWh3LT5tYWMudHhfcmVhZHkgPSBmYWxzZTsKIAorCWlmIChGTTEwS19SRU1PVkVEKGh3LT5od19hZGRyKSkKKwkJcmV0dXJuIDA7CisKIAkvKiBjbGVhciB0aGUgZW5hYmxlIGJpdCBmb3IgYWxsIHJpbmdzICovCiAJZm9yIChpID0gMDsgaSA8IHFfY250OyBpKyspIHsKIAkJcmVnID0gZm0xMGtfcmVhZF9yZWcoaHcsIEZNMTBLX1RYRENUTChpKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19jb21tb24uaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX2NvbW1vbi5oCmluZGV4IDUwZjcxZTkuLmQ1MWY5YzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX2NvbW1vbi5oCkBAIC0zNCw3ICszNCw3IEBACiAvKiB3cml0ZSBvcGVyYXRpb25zLCBpbmRleGVkIHVzaW5nIERXT1JEUyAqLwogI2RlZmluZSBmbTEwa193cml0ZV9yZWcoaHcsIHJlZywgdmFsKSBcCiBkbyB7IFwKLQl1MzIgX19pb21lbSAqaHdfYWRkciA9IEFDQ0VTU19PTkNFKChodyktPmh3X2FkZHIpOyBcCisJdTMyIF9faW9tZW0gKmh3X2FkZHIgPSBSRUFEX09OQ0UoKGh3KS0+aHdfYWRkcik7IFwKIAlpZiAoIUZNMTBLX1JFTU9WRUQoaHdfYWRkcikpIFwKIAkJd3JpdGVsKCh2YWwpLCAmaHdfYWRkclsocmVnKV0pOyBcCiB9IHdoaWxlICgwKQpAQCAtNDIsNyArNDIsNyBAQAogLyogU3dpdGNoIHJlZ2lzdGVyIHdyaXRlIG9wZXJhdGlvbnMsIGluZGV4IHVzaW5nIERXT1JEUyAqLwogI2RlZmluZSBmbTEwa193cml0ZV9zd19yZWcoaHcsIHJlZywgdmFsKSBcCiBkbyB7IFwKLQl1MzIgX19pb21lbSAqc3dfYWRkciA9IEFDQ0VTU19PTkNFKChodyktPnN3X2FkZHIpOyBcCisJdTMyIF9faW9tZW0gKnN3X2FkZHIgPSBSRUFEX09OQ0UoKGh3KS0+c3dfYWRkcik7IFwKIAlpZiAoIUZNMTBLX1JFTU9WRUQoc3dfYWRkcikpIFwKIAkJd3JpdGVsKCh2YWwpLCAmc3dfYWRkclsocmVnKV0pOyBcCiB9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfZXRodG9vbC5jCmluZGV4IGMwNGNiZTkuLjUyNDFlMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19ldGh0b29sLmMKQEAgLTk2Niw3ICs5NjYsNyBAQAogCXJldHVybiAwOwogfQogCi11MzIgZm0xMGtfZ2V0X3JldGFfc2l6ZShzdHJ1Y3QgbmV0X2RldmljZSBfX2Fsd2F5c191bnVzZWQgKm5ldGRldikKK3N0YXRpYyB1MzIgZm0xMGtfZ2V0X3JldGFfc2l6ZShzdHJ1Y3QgbmV0X2RldmljZSBfX2Fsd2F5c191bnVzZWQgKm5ldGRldikKIHsKIAlyZXR1cm4gRk0xMEtfUkVUQV9TSVpFICogRk0xMEtfUkVUQV9FTlRSSUVTX1BFUl9SRUc7CiB9CkBAIC0xMTgyLDYgKzExODIsNyBAQAogCS5zZXRfcnhmaAkJPSBmbTEwa19zZXRfcnNzaCwKIAkuZ2V0X2NoYW5uZWxzCQk9IGZtMTBrX2dldF9jaGFubmVscywKIAkuc2V0X2NoYW5uZWxzCQk9IGZtMTBrX3NldF9jaGFubmVscywKKwkuZ2V0X3RzX2luZm8JCT0gZXRodG9vbF9vcF9nZXRfdHNfaW5mbywKIH07CiAKIHZvaWQgZm0xMGtfc2V0X2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19pb3YuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX2lvdi5jCmluZGV4IDQ3ZjA3NDMuLjVmNGRhYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX2lvdi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX2lvdi5jCkBAIC01MSw3ICs1MSw3IEBACiAJaW50IGk7CiAKIAkvKiBpZiB0aGVyZSBpcyBubyBpb3ZfZGF0YSB0aGVuIHRoZXJlIGlzIG5vIG1haWxib3ggdG8gcHJvY2VzcyAqLwotCWlmICghQUNDRVNTX09OQ0UoaW50ZXJmYWNlLT5pb3ZfZGF0YSkpCisJaWYgKCFSRUFEX09OQ0UoaW50ZXJmYWNlLT5pb3ZfZGF0YSkpCiAJCXJldHVybiAwOwogCiAJcmN1X3JlYWRfbG9jaygpOwpAQCAtOTksNyArOTksNyBAQAogCWludCBpOwogCiAJLyogaWYgdGhlcmUgaXMgbm8gaW92X2RhdGEgdGhlbiB0aGVyZSBpcyBubyBtYWlsYm94IHRvIHByb2Nlc3MgKi8KLQlpZiAoIUFDQ0VTU19PTkNFKGludGVyZmFjZS0+aW92X2RhdGEpKQorCWlmICghUkVBRF9PTkNFKGludGVyZmFjZS0+aW92X2RhdGEpKQogCQlyZXR1cm4gMDsKIAogCXJjdV9yZWFkX2xvY2soKTsKQEAgLTQ0NSw3ICs0NDUsNyBAQAogfQogCiBpbnQgZm0xMGtfbmRvX3NldF92Zl92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2Zl9pZHgsIHUxNiB2aWQsCi0JCQkgIHU4IHFvcykKKwkJCSAgdTggcW9zLCBfX2JlMTYgdmxhbl9wcm90bykKIHsKIAlzdHJ1Y3QgZm0xMGtfaW50ZmMgKmludGVyZmFjZSA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGZtMTBrX2lvdl9kYXRhICppb3ZfZGF0YSA9IGludGVyZmFjZS0+aW92X2RhdGE7CkBAIC00NjAsNiArNDYwLDEwIEBACiAJaWYgKHFvcyB8fCAodmlkID4gKFZMQU5fVklEX01BU0sgLSAxKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCisJLyogVkYgVkxBTiBQcm90b2NvbCBwYXJ0IHRvIGRlZmF1bHQgaXMgdW5zdXBwb3J0ZWQgKi8KKwlpZiAodmxhbl9wcm90byAhPSBodG9ucyhFVEhfUF84MDIxUSkpCisJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOworCiAJdmZfaW5mbyA9ICZpb3ZfZGF0YS0+dmZfaW5mb1t2Zl9pZHhdOwogCiAJLyogZXhpdCBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19tYWluLmMKaW5kZXggZTk3NjdiNi4uNWRlOTM3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX21haW4uYwpAQCAtNTYsNyArNTYsOCBAQAogCXByX2luZm8oIiVzXG4iLCBmbTEwa19jb3B5cmlnaHQpOwogCiAJLyogY3JlYXRlIGRyaXZlciB3b3JrcXVldWUgKi8KLQlmbTEwa193b3JrcXVldWUgPSBhbGxvY193b3JrcXVldWUoImZtMTBrIiwgV1FfTUVNX1JFQ0xBSU0sIDApOworCWZtMTBrX3dvcmtxdWV1ZSA9IGFsbG9jX3dvcmtxdWV1ZSgiJXMiLCBXUV9NRU1fUkVDTEFJTSwgMCwKKwkJCQkJICBmbTEwa19kcml2ZXJfbmFtZSk7CiAKIAlmbTEwa19kYmdfaW5pdCgpOwogCkBAIC02NTEsMTEgKzY1MiwxMSBAQAogc3RhdGljIHN0cnVjdCBldGhoZHIgKmZtMTBrX3BvcnRfaXNfdnhsYW4oc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgZm0xMGtfaW50ZmMgKmludGVyZmFjZSA9IG5ldGRldl9wcml2KHNrYi0+ZGV2KTsKLQlzdHJ1Y3QgZm0xMGtfdnhsYW5fcG9ydCAqdnhsYW5fcG9ydDsKKwlzdHJ1Y3QgZm0xMGtfdWRwX3BvcnQgKnZ4bGFuX3BvcnQ7CiAKIAkvKiB3ZSBjYW4gb25seSBvZmZsb2FkIGEgdnhsYW4gaWYgd2UgcmVjb2duaXplIGl0IGFzIHN1Y2ggKi8KIAl2eGxhbl9wb3J0ID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZpbnRlcmZhY2UtPnZ4bGFuX3BvcnQsCi0JCQkJCSAgICAgIHN0cnVjdCBmbTEwa192eGxhbl9wb3J0LCBsaXN0KTsKKwkJCQkJICAgICAgc3RydWN0IGZtMTBrX3VkcF9wb3J0LCBsaXN0KTsKIAogCWlmICghdnhsYW5fcG9ydCkKIAkJcmV0dXJuIE5VTEw7CkBAIC0xMTI4LDEzICsxMTI5LDI0IEBACiAJcmV0dXJuIHJpbmctPnN0YXRzLnBhY2tldHM7CiB9CiAKLXU2NCBmbTEwa19nZXRfdHhfcGVuZGluZyhzdHJ1Y3QgZm0xMGtfcmluZyAqcmluZykKKy8qKgorICogZm0xMGtfZ2V0X3R4X3BlbmRpbmcgLSBob3cgbWFueSBUeCBkZXNjcmlwdG9ycyBub3QgcHJvY2Vzc2VkCisgKiBAcmluZzogdGhlIHJpbmcgc3RydWN0dXJlCisgKiBAaW5fc3c6IGlzIHR4X3BlbmRpbmcgYmVpbmcgY2hlY2tlZCBpbiBTVyBvciBpbiBIVz8KKyAqLwordTY0IGZtMTBrX2dldF90eF9wZW5kaW5nKHN0cnVjdCBmbTEwa19yaW5nICpyaW5nLCBib29sIGluX3N3KQogewogCXN0cnVjdCBmbTEwa19pbnRmYyAqaW50ZXJmYWNlID0gcmluZy0+cV92ZWN0b3ItPmludGVyZmFjZTsKIAlzdHJ1Y3QgZm0xMGtfaHcgKmh3ID0gJmludGVyZmFjZS0+aHc7CisJdTMyIGhlYWQsIHRhaWw7CiAKLQl1MzIgaGVhZCA9IGZtMTBrX3JlYWRfcmVnKGh3LCBGTTEwS19UREgocmluZy0+cmVnX2lkeCkpOwotCXUzMiB0YWlsID0gZm0xMGtfcmVhZF9yZWcoaHcsIEZNMTBLX1REVChyaW5nLT5yZWdfaWR4KSk7CisJaWYgKGxpa2VseShpbl9zdykpIHsKKwkJaGVhZCA9IHJpbmctPm5leHRfdG9fY2xlYW47CisJCXRhaWwgPSByaW5nLT5uZXh0X3RvX3VzZTsKKwl9IGVsc2UgeworCQloZWFkID0gZm0xMGtfcmVhZF9yZWcoaHcsIEZNMTBLX1RESChyaW5nLT5yZWdfaWR4KSk7CisJCXRhaWwgPSBmbTEwa19yZWFkX3JlZyhodywgRk0xMEtfVERUKHJpbmctPnJlZ19pZHgpKTsKKwl9CiAKIAlyZXR1cm4gKChoZWFkIDw9IHRhaWwpID8gdGFpbCA6IHRhaWwgKyByaW5nLT5jb3VudCkgLSBoZWFkOwogfQpAQCAtMTE0Myw3ICsxMTU1LDcgQEAKIHsKIAl1MzIgdHhfZG9uZSA9IGZtMTBrX2dldF90eF9jb21wbGV0ZWQodHhfcmluZyk7CiAJdTMyIHR4X2RvbmVfb2xkID0gdHhfcmluZy0+dHhfc3RhdHMudHhfZG9uZV9vbGQ7Ci0JdTMyIHR4X3BlbmRpbmcgPSBmbTEwa19nZXRfdHhfcGVuZGluZyh0eF9yaW5nKTsKKwl1MzIgdHhfcGVuZGluZyA9IGZtMTBrX2dldF90eF9wZW5kaW5nKHR4X3JpbmcsIHRydWUpOwogCiAJY2xlYXJfY2hlY2tfZm9yX3R4X2hhbmcodHhfcmluZyk7CiAKQEAgLTEzOTcsNyArMTQwOSw3IEBACiAJICogdGhhdCB0aGUgY2FsY3VsYXRpb24gd2lsbCBuZXZlciBnZXQgYmVsb3cgYSAxLiBUaGUgYml0IHNoaWZ0CiAJICogYWNjb3VudHMgZm9yIGNoYW5nZXMgaW4gdGhlIElUUiBkdWUgdG8gUENJZSBsaW5rIHNwZWVkLgogCSAqLwotCWl0cl9yb3VuZCA9IEFDQ0VTU19PTkNFKHJpbmdfY29udGFpbmVyLT5pdHJfc2NhbGUpICsgODsKKwlpdHJfcm91bmQgPSBSRUFEX09OQ0UocmluZ19jb250YWluZXItPml0cl9zY2FsZSkgKyA4OwogCWF2Z193aXJlX3NpemUgKz0gQklUKGl0cl9yb3VuZCkgLSAxOwogCWF2Z193aXJlX3NpemUgPj49IGl0cl9yb3VuZDsKIApAQCAtMTQ3Myw3ICsxNDg1LDcgQEAKIAkvKiByZS1lbmFibGUgdGhlIHFfdmVjdG9yICovCiAJZm0xMGtfcXZfZW5hYmxlKHFfdmVjdG9yKTsKIAotCXJldHVybiAwOworCXJldHVybiBtaW4od29ya19kb25lLCBidWRnZXQgLSAxKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19uZXRkZXYuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX25ldGRldi5jCmluZGV4IDIwYTViYmUuLjA1NjI5MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX25ldGRldi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX25ldGRldi5jCkBAIC0zODQsMTI5ICszODQsMTcxIEBACiB9CiAKIC8qKgotICogZm0xMGtfZGVsX3Z4bGFuX3BvcnRfYWxsCisgKiBmbTEwa19mcmVlX3VkcF9wb3J0X2luZm8KICAqIEBpbnRlcmZhY2U6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCiAgKgotICogVGhpcyBmdW5jdGlvbiBmcmVlcyB0aGUgZW50aXJlIHZ4bGFuX3BvcnQgbGlzdAorICogVGhpcyBmdW5jdGlvbiBmcmVlcyBib3RoIGdlbmV2ZV9wb3J0IGFuZCB2eGxhbl9wb3J0IHN0cnVjdHVyZXMKICAqKi8KLXN0YXRpYyB2b2lkIGZtMTBrX2RlbF92eGxhbl9wb3J0X2FsbChzdHJ1Y3QgZm0xMGtfaW50ZmMgKmludGVyZmFjZSkKK3N0YXRpYyB2b2lkIGZtMTBrX2ZyZWVfdWRwX3BvcnRfaW5mbyhzdHJ1Y3QgZm0xMGtfaW50ZmMgKmludGVyZmFjZSkKIHsKLQlzdHJ1Y3QgZm0xMGtfdnhsYW5fcG9ydCAqdnhsYW5fcG9ydDsKKwlzdHJ1Y3QgZm0xMGtfdWRwX3BvcnQgKnBvcnQ7CiAKLQkvKiBmbHVzaCBhbGwgZW50cmllcyBmcm9tIGxpc3QgKi8KLQl2eGxhbl9wb3J0ID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZpbnRlcmZhY2UtPnZ4bGFuX3BvcnQsCi0JCQkJCSAgICAgIHN0cnVjdCBmbTEwa192eGxhbl9wb3J0LCBsaXN0KTsKLQl3aGlsZSAodnhsYW5fcG9ydCkgewotCQlsaXN0X2RlbCgmdnhsYW5fcG9ydC0+bGlzdCk7Ci0JCWtmcmVlKHZ4bGFuX3BvcnQpOwotCQl2eGxhbl9wb3J0ID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZpbnRlcmZhY2UtPnZ4bGFuX3BvcnQsCi0JCQkJCQkgICAgICBzdHJ1Y3QgZm0xMGtfdnhsYW5fcG9ydCwKLQkJCQkJCSAgICAgIGxpc3QpOworCS8qIGZsdXNoIGFsbCBlbnRyaWVzIGZyb20gdnhsYW4gbGlzdCAqLworCXBvcnQgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmludGVyZmFjZS0+dnhsYW5fcG9ydCwKKwkJCQkJc3RydWN0IGZtMTBrX3VkcF9wb3J0LCBsaXN0KTsKKwl3aGlsZSAocG9ydCkgeworCQlsaXN0X2RlbCgmcG9ydC0+bGlzdCk7CisJCWtmcmVlKHBvcnQpOworCQlwb3J0ID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZpbnRlcmZhY2UtPnZ4bGFuX3BvcnQsCisJCQkJCQlzdHJ1Y3QgZm0xMGtfdWRwX3BvcnQsCisJCQkJCQlsaXN0KTsKKwl9CisKKwkvKiBmbHVzaCBhbGwgZW50cmllcyBmcm9tIGdlbmV2ZSBsaXN0ICovCisJcG9ydCA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmaW50ZXJmYWNlLT5nZW5ldmVfcG9ydCwKKwkJCQkJc3RydWN0IGZtMTBrX3VkcF9wb3J0LCBsaXN0KTsKKwl3aGlsZSAocG9ydCkgeworCQlsaXN0X2RlbCgmcG9ydC0+bGlzdCk7CisJCWtmcmVlKHBvcnQpOworCQlwb3J0ID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZpbnRlcmZhY2UtPnZ4bGFuX3BvcnQsCisJCQkJCQlzdHJ1Y3QgZm0xMGtfdWRwX3BvcnQsCisJCQkJCQlsaXN0KTsKIAl9CiB9CiAKIC8qKgotICogZm0xMGtfcmVzdG9yZV92eGxhbl9wb3J0CisgKiBmbTEwa19yZXN0b3JlX3VkcF9wb3J0X2luZm8KICAqIEBpbnRlcmZhY2U6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCiAgKgotICogVGhpcyBmdW5jdGlvbiByZXN0b3JlcyB0aGUgdmFsdWUgaW4gdGhlIHR1bm5lbF9jZmcgcmVnaXN0ZXIgYWZ0ZXIgcmVzZXQKKyAqIFRoaXMgZnVuY3Rpb24gcmVzdG9yZXMgdGhlIHZhbHVlIGluIHRoZSB0dW5uZWxfY2ZnIHJlZ2lzdGVyKHMpIGFmdGVyIHJlc2V0CiAgKiovCi1zdGF0aWMgdm9pZCBmbTEwa19yZXN0b3JlX3Z4bGFuX3BvcnQoc3RydWN0IGZtMTBrX2ludGZjICppbnRlcmZhY2UpCitzdGF0aWMgdm9pZCBmbTEwa19yZXN0b3JlX3VkcF9wb3J0X2luZm8oc3RydWN0IGZtMTBrX2ludGZjICppbnRlcmZhY2UpCiB7CiAJc3RydWN0IGZtMTBrX2h3ICpodyA9ICZpbnRlcmZhY2UtPmh3OwotCXN0cnVjdCBmbTEwa192eGxhbl9wb3J0ICp2eGxhbl9wb3J0OworCXN0cnVjdCBmbTEwa191ZHBfcG9ydCAqcG9ydDsKIAogCS8qIG9ubHkgdGhlIFBGIHN1cHBvcnRzIGNvbmZpZ3VyaW5nIHR1bm5lbHMgKi8KIAlpZiAoaHctPm1hYy50eXBlICE9IGZtMTBrX21hY19wZikKIAkJcmV0dXJuOwogCi0JdnhsYW5fcG9ydCA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmaW50ZXJmYWNlLT52eGxhbl9wb3J0LAotCQkJCQkgICAgICBzdHJ1Y3QgZm0xMGtfdnhsYW5fcG9ydCwgbGlzdCk7CisJcG9ydCA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmaW50ZXJmYWNlLT52eGxhbl9wb3J0LAorCQkJCQlzdHJ1Y3QgZm0xMGtfdWRwX3BvcnQsIGxpc3QpOwogCiAJLyogcmVzdG9yZSB0dW5uZWwgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLwogCWZtMTBrX3dyaXRlX3JlZyhodywgRk0xMEtfVFVOTkVMX0NGRywKLQkJCSh2eGxhbl9wb3J0ID8gbnRvaHModnhsYW5fcG9ydC0+cG9ydCkgOiAwKSB8CisJCQkocG9ydCA/IG50b2hzKHBvcnQtPnBvcnQpIDogMCkgfAogCQkJKEVUSF9QX1RFQiA8PCBGTTEwS19UVU5ORUxfQ0ZHX05WR1JFX1NISUZUKSk7CisKKwlwb3J0ID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZpbnRlcmZhY2UtPmdlbmV2ZV9wb3J0LAorCQkJCQlzdHJ1Y3QgZm0xMGtfdWRwX3BvcnQsIGxpc3QpOworCisJLyogcmVzdG9yZSBHZW5ldmUgdHVubmVsIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKwlmbTEwa193cml0ZV9yZWcoaHcsIEZNMTBLX1RVTk5FTF9DRkdfR0VORVZFLAorCQkJKHBvcnQgPyBudG9ocyhwb3J0LT5wb3J0KSA6IDApKTsKK30KKworc3RhdGljIHN0cnVjdCBmbTEwa191ZHBfcG9ydCAqCitmbTEwa19yZW1vdmVfdHVubmVsX3BvcnQoc3RydWN0IGxpc3RfaGVhZCAqcG9ydHMsCisJCQkgc3RydWN0IHVkcF90dW5uZWxfaW5mbyAqdGkpCit7CisJc3RydWN0IGZtMTBrX3VkcF9wb3J0ICpwb3J0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3J0LCBwb3J0cywgbGlzdCkgeworCQlpZiAoKHBvcnQtPnBvcnQgPT0gdGktPnBvcnQpICYmCisJCSAgICAocG9ydC0+c2FfZmFtaWx5ID09IHRpLT5zYV9mYW1pbHkpKSB7CisJCQlsaXN0X2RlbCgmcG9ydC0+bGlzdCk7CisJCQlyZXR1cm4gcG9ydDsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBmbTEwa19pbnNlcnRfdHVubmVsX3BvcnQoc3RydWN0IGxpc3RfaGVhZCAqcG9ydHMsCisJCQkJICAgICBzdHJ1Y3QgdWRwX3R1bm5lbF9pbmZvICp0aSkKK3sKKwlzdHJ1Y3QgZm0xMGtfdWRwX3BvcnQgKnBvcnQ7CisKKwkvKiByZW1vdmUgZXhpc3RpbmcgcG9ydCBlbnRyeSBmcm9tIHRoZSBsaXN0IHNvIHRoYXQgdGhlIG5ld2VzdCBpdGVtcworCSAqIGFyZSBhbHdheXMgYXQgdGhlIHRhaWwgb2YgdGhlIGxpc3QuCisJICovCisJcG9ydCA9IGZtMTBrX3JlbW92ZV90dW5uZWxfcG9ydChwb3J0cywgdGkpOworCWlmICghcG9ydCkgeworCQlwb3J0ID0ga21hbGxvYyhzaXplb2YoKnBvcnQpLCBHRlBfQVRPTUlDKTsKKwkJaWYgICghcG9ydCkKKwkJCXJldHVybjsKKwkJcG9ydC0+cG9ydCA9IHRpLT5wb3J0OworCQlwb3J0LT5zYV9mYW1pbHkgPSB0aS0+c2FfZmFtaWx5OworCX0KKworCWxpc3RfYWRkX3RhaWwoJnBvcnQtPmxpc3QsIHBvcnRzKTsKIH0KIAogLyoqCi0gKiBmbTEwa19hZGRfdnhsYW5fcG9ydAorICogZm0xMGtfdWRwX3R1bm5lbF9hZGQKICAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKICAqIEB0aTogVHVubmVsIGVuZHBvaW50IGluZm9ybWF0aW9uCiAgKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIG5ldyBWWExBTiBpbnRlcmZhY2UgaGFzIGFkZGVkIGEgbmV3IHBvcnQKLSAqIG51bWJlciB0byB0aGUgcmFuZ2UgdGhhdCBpcyBjdXJyZW50bHkgaW4gdXNlIGZvciBWWExBTi4gIFRoZSBuZXcgcG9ydAotICogbnVtYmVyIGlzIGFsd2F5cyBhZGRlZCB0byB0aGUgdGFpbCBzbyB0aGF0IHRoZSBwb3J0IG51bWJlciBsaXN0IHNob3VsZAotICogbWF0Y2ggdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBwb3J0cyB3ZXJlIGFsbG9jYXRlZC4gIFRoZSBoZWFkIG9mIHRoZSBsaXN0Ci0gKiBpcyBhbHdheXMgdXNlZCBhcyB0aGUgVlhMQU4gcG9ydCBudW1iZXIgZm9yIG9mZmxvYWRzLgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIG5ldyBVRFAgdHVubmVsIHBvcnQgaGFzIGJlZW4gYWRkZWQuCisgKiBEdWUgdG8gaGFyZHdhcmUgcmVzdHJpY3Rpb25zLCBvbmx5IG9uZSBwb3J0IHBlciB0eXBlIGNhbiBiZSBvZmZsb2FkZWQgYXQKKyAqIG9uY2UuCiAgKiovCi1zdGF0aWMgdm9pZCBmbTEwa19hZGRfdnhsYW5fcG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorc3RhdGljIHZvaWQgZm0xMGtfdWRwX3R1bm5lbF9hZGQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgc3RydWN0IHVkcF90dW5uZWxfaW5mbyAqdGkpCiB7CiAJc3RydWN0IGZtMTBrX2ludGZjICppbnRlcmZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBmbTEwa192eGxhbl9wb3J0ICp2eGxhbl9wb3J0OwogCi0JaWYgKHRpLT50eXBlICE9IFVEUF9UVU5ORUxfVFlQRV9WWExBTikKLQkJcmV0dXJuOwogCS8qIG9ubHkgdGhlIFBGIHN1cHBvcnRzIGNvbmZpZ3VyaW5nIHR1bm5lbHMgKi8KIAlpZiAoaW50ZXJmYWNlLT5ody5tYWMudHlwZSAhPSBmbTEwa19tYWNfcGYpCiAJCXJldHVybjsKIAotCS8qIGV4aXN0aW5nIHBvcnRzIGFyZSBwdWxsZWQgb3V0IHNvIG91ciBuZXcgZW50cnkgaXMgYWx3YXlzIGxhc3QgKi8KLQlmbTEwa192eGxhbl9wb3J0X2Zvcl9lYWNoKHZ4bGFuX3BvcnQsIGludGVyZmFjZSkgewotCQlpZiAoKHZ4bGFuX3BvcnQtPnBvcnQgPT0gdGktPnBvcnQpICYmCi0JCSAgICAodnhsYW5fcG9ydC0+c2FfZmFtaWx5ID09IHRpLT5zYV9mYW1pbHkpKSB7Ci0JCQlsaXN0X2RlbCgmdnhsYW5fcG9ydC0+bGlzdCk7Ci0JCQlnb3RvIGluc2VydF90YWlsOwotCQl9CisJc3dpdGNoICh0aS0+dHlwZSkgeworCWNhc2UgVURQX1RVTk5FTF9UWVBFX1ZYTEFOOgorCQlmbTEwa19pbnNlcnRfdHVubmVsX3BvcnQoJmludGVyZmFjZS0+dnhsYW5fcG9ydCwgdGkpOworCQlicmVhazsKKwljYXNlIFVEUF9UVU5ORUxfVFlQRV9HRU5FVkU6CisJCWZtMTBrX2luc2VydF90dW5uZWxfcG9ydCgmaW50ZXJmYWNlLT5nZW5ldmVfcG9ydCwgdGkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm47CiAJfQogCi0JLyogYWxsb2NhdGUgbWVtb3J5IHRvIHRyYWNrIHBvcnRzICovCi0JdnhsYW5fcG9ydCA9IGttYWxsb2Moc2l6ZW9mKCp2eGxhbl9wb3J0KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCF2eGxhbl9wb3J0KQotCQlyZXR1cm47Ci0JdnhsYW5fcG9ydC0+cG9ydCA9IHRpLT5wb3J0OwotCXZ4bGFuX3BvcnQtPnNhX2ZhbWlseSA9IHRpLT5zYV9mYW1pbHk7Ci0KLWluc2VydF90YWlsOgotCS8qIGFkZCBuZXcgcG9ydCB2YWx1ZSB0byBsaXN0ICovCi0JbGlzdF9hZGRfdGFpbCgmdnhsYW5fcG9ydC0+bGlzdCwgJmludGVyZmFjZS0+dnhsYW5fcG9ydCk7Ci0KLQlmbTEwa19yZXN0b3JlX3Z4bGFuX3BvcnQoaW50ZXJmYWNlKTsKKwlmbTEwa19yZXN0b3JlX3VkcF9wb3J0X2luZm8oaW50ZXJmYWNlKTsKIH0KIAogLyoqCi0gKiBmbTEwa19kZWxfdnhsYW5fcG9ydAorICogZm0xMGtfdWRwX3R1bm5lbF9kZWwKICAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKICAqIEB0aTogVHVubmVsIGVuZHBvaW50IGluZm9ybWF0aW9uCiAgKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIG5ldyBWWExBTiBpbnRlcmZhY2UgaGFzIGZyZWVkIGEgcG9ydAotICogbnVtYmVyIGZyb20gdGhlIHJhbmdlIHRoYXQgaXMgY3VycmVudGx5IGluIHVzZSBmb3IgVlhMQU4uICBUaGUgZnJlZWQKLSAqIHBvcnQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IGFuZCB0aGUgbmV3IGhlYWQgaXMgdXNlZCB0byBkZXRlcm1pbmUKLSAqIHRoZSBwb3J0IG51bWJlciBmb3Igb2ZmbG9hZHMuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgbmV3IFVEUCB0dW5uZWwgcG9ydCBpcyBkZWxldGVkLiBUaGUgZnJlZWQKKyAqIHBvcnQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3QsIHRoZW4gd2UgcmVwcm9ncmFtIHRoZSBvZmZsb2FkZWQgcG9ydAorICogYmFzZWQgb24gdGhlIGhlYWQgb2YgdGhlIGxpc3QuCiAgKiovCi1zdGF0aWMgdm9pZCBmbTEwa19kZWxfdnhsYW5fcG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorc3RhdGljIHZvaWQgZm0xMGtfdWRwX3R1bm5lbF9kZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgc3RydWN0IHVkcF90dW5uZWxfaW5mbyAqdGkpCiB7CiAJc3RydWN0IGZtMTBrX2ludGZjICppbnRlcmZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBmbTEwa192eGxhbl9wb3J0ICp2eGxhbl9wb3J0OworCXN0cnVjdCBmbTEwa191ZHBfcG9ydCAqcG9ydCA9IE5VTEw7CiAKLQlpZiAodGktPnR5cGUgIT0gVURQX1RVTk5FTF9UWVBFX1ZYTEFOKQotCQlyZXR1cm47CiAJaWYgKGludGVyZmFjZS0+aHcubWFjLnR5cGUgIT0gZm0xMGtfbWFjX3BmKQogCQlyZXR1cm47CiAKLQkvKiBmaW5kIHRoZSBwb3J0IGluIHRoZSBsaXN0IGFuZCBmcmVlIGl0ICovCi0JZm0xMGtfdnhsYW5fcG9ydF9mb3JfZWFjaCh2eGxhbl9wb3J0LCBpbnRlcmZhY2UpIHsKLQkJaWYgKCh2eGxhbl9wb3J0LT5wb3J0ID09IHRpLT5wb3J0KSAmJgotCQkgICAgKHZ4bGFuX3BvcnQtPnNhX2ZhbWlseSA9PSB0aS0+c2FfZmFtaWx5KSkgewotCQkJbGlzdF9kZWwoJnZ4bGFuX3BvcnQtPmxpc3QpOwotCQkJa2ZyZWUodnhsYW5fcG9ydCk7Ci0JCQlicmVhazsKLQkJfQorCXN3aXRjaCAodGktPnR5cGUpIHsKKwljYXNlIFVEUF9UVU5ORUxfVFlQRV9WWExBTjoKKwkJcG9ydCA9IGZtMTBrX3JlbW92ZV90dW5uZWxfcG9ydCgmaW50ZXJmYWNlLT52eGxhbl9wb3J0LCB0aSk7CisJCWJyZWFrOworCWNhc2UgVURQX1RVTk5FTF9UWVBFX0dFTkVWRToKKwkJcG9ydCA9IGZtMTBrX3JlbW92ZV90dW5uZWxfcG9ydCgmaW50ZXJmYWNlLT5nZW5ldmVfcG9ydCwgdGkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm47CiAJfQogCi0JZm0xMGtfcmVzdG9yZV92eGxhbl9wb3J0KGludGVyZmFjZSk7CisJLyogaWYgd2UgZGlkIHJlbW92ZSBhIHBvcnQgd2UgbmVlZCB0byBmcmVlIGl0cyBtZW1vcnkgKi8KKwlrZnJlZShwb3J0KTsKKworCWZtMTBrX3Jlc3RvcmVfdWRwX3BvcnRfaW5mbyhpbnRlcmZhY2UpOwogfQogCiAvKioKQEAgLTU1NSw3ICs1OTcsNiBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXJyX3NldF9xdWV1ZXM7CiAKLQkvKiB1cGRhdGUgVlhMQU4gcG9ydCBjb25maWd1cmF0aW9uICovCiAJdWRwX3R1bm5lbF9nZXRfcnhfaW5mbyhuZXRkZXYpOwogCiAJZm0xMGtfdXAoaW50ZXJmYWNlKTsKQEAgLTU5MSw3ICs2MzIsNyBAQAogCiAJZm0xMGtfcXZfZnJlZV9pcnEoaW50ZXJmYWNlKTsKIAotCWZtMTBrX2RlbF92eGxhbl9wb3J0X2FsbChpbnRlcmZhY2UpOworCWZtMTBrX2ZyZWVfdWRwX3BvcnRfaW5mbyhpbnRlcmZhY2UpOwogCiAJZm0xMGtfZnJlZV9hbGxfdHhfcmVzb3VyY2VzKGludGVyZmFjZSk7CiAJZm0xMGtfZnJlZV9hbGxfcnhfcmVzb3VyY2VzKGludGVyZmFjZSk7CkBAIC0xMDU1LDcgKzEwOTYsNyBAQAogCWludGVyZmFjZS0+eGNhc3RfbW9kZSA9IHhjYXN0X21vZGU7CiAKIAkvKiBSZXN0b3JlIHR1bm5lbCBjb25maWd1cmF0aW9uICovCi0JZm0xMGtfcmVzdG9yZV92eGxhbl9wb3J0KGludGVyZmFjZSk7CisJZm0xMGtfcmVzdG9yZV91ZHBfcG9ydF9pbmZvKGludGVyZmFjZSk7CiB9CiAKIHZvaWQgZm0xMGtfcmVzZXRfcnhfc3RhdGUoc3RydWN0IGZtMTBrX2ludGZjICppbnRlcmZhY2UpCkBAIC0xMDk4LDcgKzExMzksNyBAQAogCXJjdV9yZWFkX2xvY2soKTsKIAogCWZvciAoaSA9IDA7IGkgPCBpbnRlcmZhY2UtPm51bV9yeF9xdWV1ZXM7IGkrKykgewotCQlyaW5nID0gQUNDRVNTX09OQ0UoaW50ZXJmYWNlLT5yeF9yaW5nW2ldKTsKKwkJcmluZyA9IFJFQURfT05DRShpbnRlcmZhY2UtPnJ4X3JpbmdbaV0pOwogCiAJCWlmICghcmluZykKIAkJCWNvbnRpbnVlOwpAQCAtMTExNCw3ICsxMTU1LDcgQEAKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgaW50ZXJmYWNlLT5udW1fdHhfcXVldWVzOyBpKyspIHsKLQkJcmluZyA9IEFDQ0VTU19PTkNFKGludGVyZmFjZS0+dHhfcmluZ1tpXSk7CisJCXJpbmcgPSBSRUFEX09OQ0UoaW50ZXJmYWNlLT50eF9yaW5nW2ldKTsKIAogCQlpZiAoIXJpbmcpCiAJCQljb250aW51ZTsKQEAgLTEyOTksNyArMTM0MCw3IEBACiBzdGF0aWMgdm9pZCBmbTEwa19kZndkX2RlbF9zdGF0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnByaXYpCiB7CiAJc3RydWN0IGZtMTBrX2ludGZjICppbnRlcmZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBmbTEwa19sMl9hY2NlbCAqbDJfYWNjZWwgPSBBQ0NFU1NfT05DRShpbnRlcmZhY2UtPmwyX2FjY2VsKTsKKwlzdHJ1Y3QgZm0xMGtfbDJfYWNjZWwgKmwyX2FjY2VsID0gUkVBRF9PTkNFKGludGVyZmFjZS0+bDJfYWNjZWwpOwogCXN0cnVjdCBmbTEwa19kZ2xvcnRfY2ZnIGRnbG9ydCA9IHsgMCB9OwogCXN0cnVjdCBmbTEwa19odyAqaHcgPSAmaW50ZXJmYWNlLT5odzsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqc2RldiA9IHByaXY7CkBAIC0xMzc1LDggKzE0MTYsOCBAQAogCS5uZG9fc2V0X3ZmX3ZsYW4JPSBmbTEwa19uZG9fc2V0X3ZmX3ZsYW4sCiAJLm5kb19zZXRfdmZfcmF0ZQk9IGZtMTBrX25kb19zZXRfdmZfYncsCiAJLm5kb19nZXRfdmZfY29uZmlnCT0gZm0xMGtfbmRvX2dldF92Zl9jb25maWcsCi0JLm5kb191ZHBfdHVubmVsX2FkZAk9IGZtMTBrX2FkZF92eGxhbl9wb3J0LAotCS5uZG9fdWRwX3R1bm5lbF9kZWwJPSBmbTEwa19kZWxfdnhsYW5fcG9ydCwKKwkubmRvX3VkcF90dW5uZWxfYWRkCT0gZm0xMGtfdWRwX3R1bm5lbF9hZGQsCisJLm5kb191ZHBfdHVubmVsX2RlbAk9IGZtMTBrX3VkcF90dW5uZWxfZGVsLAogCS5uZG9fZGZ3ZF9hZGRfc3RhdGlvbgk9IGZtMTBrX2Rmd2RfYWRkX3N0YXRpb24sCiAJLm5kb19kZndkX2RlbF9zdGF0aW9uCT0gZm0xMGtfZGZ3ZF9kZWxfc3RhdGlvbiwKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfcGNpLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19wY2kuYwppbmRleCA3NzRhNTY1Li5iMWEyZjg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19wY2kuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19wY2kuYwpAQCAtNjIsNyArNjIsNyBAQAogCiB1MzIgZm0xMGtfcmVhZF9yZWcoc3RydWN0IGZtMTBrX2h3ICpodywgaW50IHJlZykKIHsKLQl1MzIgX19pb21lbSAqaHdfYWRkciA9IEFDQ0VTU19PTkNFKGh3LT5od19hZGRyKTsKKwl1MzIgX19pb21lbSAqaHdfYWRkciA9IFJFQURfT05DRShody0+aHdfYWRkcik7CiAJdTMyIHZhbHVlID0gMDsKIAogCWlmIChGTTEwS19SRU1PVkVEKGh3X2FkZHIpKQpAQCAtMTMzLDcgKzEzMyw3IEBACiAJLyogY2hlY2sgdGhlIHJlYWwgYWRkcmVzcyBzcGFjZSB0byBzZWUgaWYgd2UndmUgcmVjb3ZlcmVkICovCiAJaHdfYWRkciA9IFJFQURfT05DRShpbnRlcmZhY2UtPnVjX2FkZHIpOwogCXZhbHVlID0gcmVhZGwoaHdfYWRkcik7Ci0JaWYgKCh+dmFsdWUpKSB7CisJaWYgKH52YWx1ZSkgewogCQlpbnRlcmZhY2UtPmh3Lmh3X2FkZHIgPSBpbnRlcmZhY2UtPnVjX2FkZHI7CiAJCW5ldGlmX2RldmljZV9hdHRhY2gobmV0ZGV2KTsKIAkJaW50ZXJmYWNlLT5mbGFncyB8PSBGTTEwS19GTEFHX1JFU0VUX1JFUVVFU1RFRDsKQEAgLTczNCwxNSArNzM0LDE1IEBACiAJdTY0IHJkYmEgPSByaW5nLT5kbWE7CiAJc3RydWN0IGZtMTBrX2h3ICpodyA9ICZpbnRlcmZhY2UtPmh3OwogCXUzMiBzaXplID0gcmluZy0+Y291bnQgKiBzaXplb2YodW5pb24gZm0xMGtfcnhfZGVzYyk7Ci0JdTMyIHJ4cWN0bCA9IEZNMTBLX1JYUUNUTF9FTkFCTEUgfCBGTTEwS19SWFFDVExfUEY7Ci0JdTMyIHJ4ZGN0bCA9IEZNMTBLX1JYRENUTF9XUklURV9CQUNLX01JTl9ERUxBWTsKKwl1MzIgcnhxY3RsLCByeGRjdGwgPSBGTTEwS19SWERDVExfV1JJVEVfQkFDS19NSU5fREVMQVk7CiAJdTMyIHNycmN0bCA9IEZNMTBLX1NSUkNUTF9CVUZGRVJfQ0hBSU5JTkdfRU47CiAJdTMyIHJ4aW50ID0gRk0xMEtfSU5UX01BUF9ESVNBQkxFOwogCXU4IHJ4X3BhdXNlID0gaW50ZXJmYWNlLT5yeF9wYXVzZTsKIAl1OCByZWdfaWR4ID0gcmluZy0+cmVnX2lkeDsKIAogCS8qIGRpc2FibGUgcXVldWUgdG8gYXZvaWQgaXNzdWVzIHdoaWxlIHVwZGF0aW5nIHN0YXRlICovCi0JZm0xMGtfd3JpdGVfcmVnKGh3LCBGTTEwS19SWFFDVEwocmVnX2lkeCksIDApOworCXJ4cWN0bCA9IGZtMTBrX3JlYWRfcmVnKGh3LCBGTTEwS19SWFFDVEwocmVnX2lkeCkpOworCXJ4cWN0bCAmPSB+Rk0xMEtfUlhRQ1RMX0VOQUJMRTsKIAlmbTEwa193cml0ZV9mbHVzaChodyk7CiAKIAkvKiBwb3NzaWJsZSBwb2xsIGhlcmUgdG8gdmVyaWZ5IHJpbmcgcmVzb3VyY2VzIGhhdmUgYmVlbiBjbGVhbmVkICovCkBAIC03OTcsNiArNzk3LDggQEAKIAlmbTEwa193cml0ZV9yZWcoaHcsIEZNMTBLX1JYSU5UKHJlZ19pZHgpLCByeGludCk7CiAKIAkvKiBlbmFibGUgcXVldWUgKi8KKwlyeHFjdGwgPSBmbTEwa19yZWFkX3JlZyhodywgRk0xMEtfUlhRQ1RMKHJlZ19pZHgpKTsKKwlyeHFjdGwgfD0gRk0xMEtfUlhRQ1RMX0VOQUJMRTsKIAlmbTEwa193cml0ZV9yZWcoaHcsIEZNMTBLX1JYUUNUTChyZWdfaWR4KSwgcnhxY3RsKTsKIAogCS8qIHBsYWNlIGJ1ZmZlcnMgb24gcmluZyBmb3IgcmVjZWl2ZSBkYXRhICovCkBAIC0xNjk5LDcgKzE3MDEsNyBAQAogCiAJCS8qIHN0YXJ0IGNoZWNraW5nIGF0IHRoZSBsYXN0IHJpbmcgdG8gaGF2ZSBwZW5kaW5nIFR4ICovCiAJCWZvciAoOyBpIDwgaW50ZXJmYWNlLT5udW1fdHhfcXVldWVzOyBpKyspCi0JCQlpZiAoZm0xMGtfZ2V0X3R4X3BlbmRpbmcoaW50ZXJmYWNlLT50eF9yaW5nW2ldKSkKKwkJCWlmIChmbTEwa19nZXRfdHhfcGVuZGluZyhpbnRlcmZhY2UtPnR4X3JpbmdbaV0sIGZhbHNlKSkKIAkJCQlicmVhazsKIAogCQkvKiBpZiBhbGwgdGhlIHF1ZXVlcyBhcmUgZHJhaW5lZCwgd2UgY2FuIGJyZWFrIG5vdyAqLwpAQCAtMTgzNSw4ICsxODM3LDkgQEAKIAlpbnRlcmZhY2UtPnR4X2l0ciA9IEZNMTBLX1RYX0lUUl9ERUZBVUxUOwogCWludGVyZmFjZS0+cnhfaXRyID0gRk0xMEtfSVRSX0FEQVBUSVZFIHwgRk0xMEtfUlhfSVRSX0RFRkFVTFQ7CiAKLQkvKiBpbml0aWFsaXplIHZ4bGFuX3BvcnQgbGlzdCAqLworCS8qIGluaXRpYWxpemUgdWRwIHBvcnQgbGlzdHMgKi8KIAlJTklUX0xJU1RfSEVBRCgmaW50ZXJmYWNlLT52eGxhbl9wb3J0KTsKKwlJTklUX0xJU1RfSEVBRCgmaW50ZXJmYWNlLT5nZW5ldmVfcG9ydCk7CiAKIAluZXRkZXZfcnNzX2tleV9maWxsKHJzc19rZXksIHNpemVvZihyc3Nfa2V5KSk7CiAJbWVtY3B5KGludGVyZmFjZS0+cnNzcmssIHJzc19rZXksIHNpemVvZihyc3Nfa2V5KSk7CkBAIC0xOTUwLDkgKzE5NTMsMTggQEAKIAlzdHJ1Y3QgZm0xMGtfaW50ZmMgKmludGVyZmFjZTsKIAlpbnQgZXJyOwogCisJaWYgKHBkZXYtPmVycm9yX3N0YXRlICE9IHBjaV9jaGFubmVsX2lvX25vcm1hbCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiUENJIGRldmljZSBzdGlsbCBpbiBhbiBlcnJvciBzdGF0ZS4gVW5hYmxlIHRvIGxvYWQuLi5cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKIAllcnIgPSBwY2lfZW5hYmxlX2RldmljZV9tZW0ocGRldik7Ci0JaWYgKGVycikKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJQQ0kgZW5hYmxlIGRldmljZSBmYWlsZWQ6ICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOworCX0KIAogCWVyciA9IGRtYV9zZXRfbWFza19hbmRfY29oZXJlbnQoJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDQ4KSk7CiAJaWYgKGVycikKQEAgLTIyNzUsNyArMjI4Nyw3IEBACiB7CiAJcGNpX2Vyc19yZXN1bHRfdCByZXN1bHQ7CiAKLQlpZiAocGNpX2VuYWJsZV9kZXZpY2VfbWVtKHBkZXYpKSB7CisJaWYgKHBjaV9yZWVuYWJsZV9kZXZpY2UocGRldikpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkJIkNhbm5vdCByZS1lbmFibGUgUENJIGRldmljZSBhZnRlciByZXNldC5cbiIpOwogCQlyZXN1bHQgPSBQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfcGYuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX3BmLmMKaW5kZXggNjgyMjk5ZC4uMjNmYjMxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfcGYuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19wZi5jCkBAIC04NjcsMTAgKzg2Nyw2IEBACiAJdmZfcV9pZHggPSBmbTEwa192Zl9xdWV1ZV9pbmRleChodywgdmZfaWR4KTsKIAlxbWFwX2lkeCA9IHFtYXBfc3RyaWRlICogdmZfaWR4OwogCi0JLyogTUFQIFR4IHF1ZXVlIGJhY2sgdG8gMCB0ZW1wb3JhcmlseSwgYW5kIGRpc2FibGUgaXQgKi8KLQlmbTEwa193cml0ZV9yZWcoaHcsIEZNMTBLX1RRTUFQKHFtYXBfaWR4KSwgMCk7Ci0JZm0xMGtfd3JpdGVfcmVnKGh3LCBGTTEwS19UWERDVEwodmZfcV9pZHgpLCAwKTsKLQogCS8qIERldGVybWluZSBjb3JyZWN0IGRlZmF1bHQgVkxBTiBJRC4gVGhlIEZNMTBLX1ZMQU5fT1ZFUlJJREUgYml0IGlzCiAJICogdXNlZCBoZXJlIHRvIGluZGljYXRlIHRvIHRoZSBWRiB0aGF0IGl0IHdpbGwgbm90IGhhdmUgcHJpdmlsZWdlIHRvCiAJICogd3JpdGUgVkxBTl9UQUJMRS4gQWxsIHBvbGljeSBpcyBlbmZvcmNlZCBvbiB0aGUgUEYgYnV0IHRoaXMgYWxsb3dzCkBAIC04ODYsOSArODgyLDM1IEBACiAJZm0xMGtfdGx2X2F0dHJfcHV0X21hY192bGFuKG1zZywgRk0xMEtfTUFDX1ZMQU5fTVNHX0RFRkFVTFRfTUFDLAogCQkJCSAgICB2Zl9pbmZvLT5tYWMsIHZmX3ZpZCk7CiAKLQkvKiBsb2FkIG9udG8gb3V0Z29pbmcgbWFpbGJveCwgaWdub3JlIGFueSBlcnJvcnMgb24gZW5xdWV1ZSAqLwotCWlmICh2Zl9pbmZvLT5tYngub3BzLmVucXVldWVfdHgpCi0JCXZmX2luZm8tPm1ieC5vcHMuZW5xdWV1ZV90eChodywgJnZmX2luZm8tPm1ieCwgbXNnKTsKKwkvKiBDb25maWd1cmUgUXVldWUgY29udHJvbCByZWdpc3RlciB3aXRoIG5ldyBWTEFOIElELiBUaGUgVFhRQ1RMCisJICogcmVnaXN0ZXIgaXMgUk8gZnJvbSB0aGUgVkYsIHNvIHRoZSBQRiBtdXN0IGRvIHRoaXMgZXZlbiBpbiB0aGUKKwkgKiBjYXNlIG9mIG5vdGlmeWluZyB0aGUgVkYgb2YgYSBuZXcgVklEIHZpYSB0aGUgbWFpbGJveC4KKwkgKi8KKwl0eHFjdGwgPSAoKHUzMil2Zl92aWQgPDwgRk0xMEtfVFhRQ1RMX1ZJRF9TSElGVCkgJgorCQkgRk0xMEtfVFhRQ1RMX1ZJRF9NQVNLOworCXR4cWN0bCB8PSAodmZfaWR4IDw8IEZNMTBLX1RYUUNUTF9UQ19TSElGVCkgfAorCQkgIEZNMTBLX1RYUUNUTF9WRiB8IHZmX2lkeDsKKworCWZvciAoaSA9IDA7IGkgPCBxdWV1ZXNfcGVyX3Bvb2w7IGkrKykKKwkJZm0xMGtfd3JpdGVfcmVnKGh3LCBGTTEwS19UWFFDVEwodmZfcV9pZHggKyBpKSwgdHhxY3RsKTsKKworCS8qIHRyeSBsb2FkaW5nIGEgbWVzc2FnZSBvbnRvIG91dGdvaW5nIG1haWxib3ggZmlyc3QgKi8KKwlpZiAodmZfaW5mby0+bWJ4Lm9wcy5lbnF1ZXVlX3R4KSB7CisJCWVyciA9IHZmX2luZm8tPm1ieC5vcHMuZW5xdWV1ZV90eChodywgJnZmX2luZm8tPm1ieCwgbXNnKTsKKwkJaWYgKGVyciAhPSBGTTEwS19NQlhfRVJSX05PX01CWCkKKwkJCXJldHVybiBlcnI7CisJCWVyciA9IDA7CisJfQorCisJLyogSWYgd2UgYXJlbid0IGNvbm5lY3RlZCB0byBhIG1haWxib3gsIHRoaXMgaXMgbW9zdCBsaWtlbHkgYmVjYXVzZQorCSAqIHRoZSBWRiBkcml2ZXIgaXMgbm90IHJ1bm5pbmcuIEl0IHNob3VsZCB0aHVzIGJlIHNhZmUgdG8gcmUtbWFwCisJICogcXVldWVzIGFuZCB1c2UgdGhlIHJlZ2lzdGVycyB0byBwYXNzIHRoZSBNQUMgYWRkcmVzcyBzbyB0aGF0IHRoZSBWRgorCSAqIGRyaXZlciBnZXRzIGNvcnJlY3QgaW5mb3JtYXRpb24gZHVyaW5nIGl0cyBpbml0aWFsaXphdGlvbi4KKwkgKi8KKworCS8qIE1BUCBUeCBxdWV1ZSBiYWNrIHRvIDAgdGVtcG9yYXJpbHksIGFuZCBkaXNhYmxlIGl0ICovCisJZm0xMGtfd3JpdGVfcmVnKGh3LCBGTTEwS19UUU1BUChxbWFwX2lkeCksIDApOworCWZtMTBrX3dyaXRlX3JlZyhodywgRk0xMEtfVFhEQ1RMKHZmX3FfaWR4KSwgMCk7CiAKIAkvKiB2ZXJpZnkgcmluZyBoYXMgZGlzYWJsZWQgYmVmb3JlIG1vZGlmeWluZyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXJzICovCiAJdHhkY3RsID0gZm0xMGtfcmVhZF9yZWcoaHcsIEZNMTBLX1RYRENUTCh2Zl9xX2lkeCkpOwpAQCAtOTI3LDE2ICs5NDksNiBAQAogCQkJCQkJICAgRk0xMEtfVERMRU5fSVRSX1NDQUxFX1NISUZUKTsKIAogZXJyX291dDoKLQkvKiBjb25maWd1cmUgUXVldWUgY29udHJvbCByZWdpc3RlciAqLwotCXR4cWN0bCA9ICgodTMyKXZmX3ZpZCA8PCBGTTEwS19UWFFDVExfVklEX1NISUZUKSAmCi0JCSBGTTEwS19UWFFDVExfVklEX01BU0s7Ci0JdHhxY3RsIHw9ICh2Zl9pZHggPDwgRk0xMEtfVFhRQ1RMX1RDX1NISUZUKSB8Ci0JCSAgRk0xMEtfVFhRQ1RMX1ZGIHwgdmZfaWR4OwotCi0JLyogYXNzaWduIFZMQU4gSUQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcXVldWVzX3Blcl9wb29sOyBpKyspCi0JCWZtMTBrX3dyaXRlX3JlZyhodywgRk0xMEtfVFhRQ1RMKHZmX3FfaWR4ICsgaSksIHR4cWN0bCk7Ci0KIAkvKiByZXN0b3JlIHRoZSBxdWV1ZSBiYWNrIHRvIFZGIG93bmVyc2hpcCAqLwogCWZtMTBrX3dyaXRlX3JlZyhodywgRk0xMEtfVFFNQVAocW1hcF9pZHgpLCB2Zl9xX2lkeCk7CiAJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX3R5cGUuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX3R5cGUuaAppbmRleCBmNGU3NWM0Li42YmIxNmMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa190eXBlLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfdHlwZS5oCkBAIC0xNTQsNiArMTU0LDcgQEAKICNkZWZpbmUgRk0xMEtfREdMT1JUREVDX0lOTkVSUlNTX0VOQUJMRQkJMHgwODAwMDAwMAogI2RlZmluZSBGTTEwS19UVU5ORUxfQ0ZHCTB4MDA0MAogI2RlZmluZSBGTTEwS19UVU5ORUxfQ0ZHX05WR1JFX1NISUZUCQkxNgorI2RlZmluZSBGTTEwS19UVU5ORUxfQ0ZHX0dFTkVWRQkweDAwNDEKICNkZWZpbmUgRk0xMEtfU1dQUklfTUFQKF9uKQkoKF9uKSArIDB4MDA1MCkKICNkZWZpbmUgRk0xMEtfU1dQUklfTUFYCQkxNgogI2RlZmluZSBGTTEwS19SU1NSSyhfbiwgX20pCSgoKF9uKSAqIDB4MTApICsgKF9tKSArIDB4MDgwMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlLmgKaW5kZXggMmE4ODI5MS4uMjAzMGQ3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlLmgKQEAgLTY1LDc2ICs2NSw3MiBAQAogI2luY2x1ZGUgImk0MGVfZGNiLmgiCiAKIC8qIFVzZWZ1bCBpNDBlIGRlZmF1bHRzICovCi0jZGVmaW5lIEk0MEVfTUFYX1ZFQiAgICAgICAgICAxNgorI2RlZmluZSBJNDBFX01BWF9WRUIJCQkxNgogCi0jZGVmaW5lIEk0MEVfTUFYX05VTV9ERVNDUklQVE9SUyAgICAgIDQwOTYKLSNkZWZpbmUgSTQwRV9NQVhfQ1NSX1NQQUNFICg0ICogMTAyNCAqIDEwMjQgLSA2NCAqIDEwMjQpCi0jZGVmaW5lIEk0MEVfREVGQVVMVF9OVU1fREVTQ1JJUFRPUlMgIDUxMgotI2RlZmluZSBJNDBFX1JFUV9ERVNDUklQVE9SX01VTFRJUExFICAzMgotI2RlZmluZSBJNDBFX01JTl9OVU1fREVTQ1JJUFRPUlMgICAgICA2NAotI2RlZmluZSBJNDBFX01JTl9NU0lYICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIEk0MEVfREVGQVVMVF9OVU1fVk1EUV9WU0kgICAgIDggLyogbWF4IDI1NiBWU0lzICovCi0jZGVmaW5lIEk0MEVfTUlOX1ZTSV9BTExPQyAgICAgICAgICAgIDUxIC8qIExBTiwgQVRSLCBGQ09FLCAzMiBWRiwgMTYgVk1EUSAqLworI2RlZmluZSBJNDBFX01BWF9OVU1fREVTQ1JJUFRPUlMJNDA5NgorI2RlZmluZSBJNDBFX01BWF9DU1JfU1BBQ0UJCSg0ICogMTAyNCAqIDEwMjQgLSA2NCAqIDEwMjQpCisjZGVmaW5lIEk0MEVfREVGQVVMVF9OVU1fREVTQ1JJUFRPUlMJNTEyCisjZGVmaW5lIEk0MEVfUkVRX0RFU0NSSVBUT1JfTVVMVElQTEUJMzIKKyNkZWZpbmUgSTQwRV9NSU5fTlVNX0RFU0NSSVBUT1JTCTY0CisjZGVmaW5lIEk0MEVfTUlOX01TSVgJCQkyCisjZGVmaW5lIEk0MEVfREVGQVVMVF9OVU1fVk1EUV9WU0kJOCAvKiBtYXggMjU2IFZTSXMgKi8KKyNkZWZpbmUgSTQwRV9NSU5fVlNJX0FMTE9DCQk4MyAvKiBMQU4sIEFUUiwgRkNPRSwgNjQgVkYgKi8KIC8qIG1heCAxNiBxcHMgKi8KICNkZWZpbmUgaTQwZV9kZWZhdWx0X3F1ZXVlc19wZXJfdm1kcShwZikgXAogCQkoKChwZiktPmZsYWdzICYgSTQwRV9GTEFHX1JTU19BUV9DQVBBQkxFKSA/IDQgOiAxKQotI2RlZmluZSBJNDBFX0RFRkFVTFRfUVVFVUVTX1BFUl9WRiAgICA0Ci0jZGVmaW5lIEk0MEVfREVGQVVMVF9RVUVVRVNfUEVSX1RDICAgIDEgLyogc2hvdWxkIGJlIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBJNDBFX0RFRkFVTFRfUVVFVUVTX1BFUl9WRgk0CisjZGVmaW5lIEk0MEVfREVGQVVMVF9RVUVVRVNfUEVSX1RDCTEgLyogc2hvdWxkIGJlIGEgcG93ZXIgb2YgMiAqLwogI2RlZmluZSBpNDBlX3BmX2dldF9tYXhfcV9wZXJfdGMocGYpIFwKIAkJKCgocGYpLT5mbGFncyAmIEk0MEVfRkxBR18xMjhfUVBfUlNTX0NBUEFCTEUpID8gMTI4IDogNjQpCi0jZGVmaW5lIEk0MEVfRkRJUl9SSU5HICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgSTQwRV9GRElSX1JJTkdfQ09VTlQgICAgICAgICAgMzIKKyNkZWZpbmUgSTQwRV9GRElSX1JJTkcJCQkwCisjZGVmaW5lIEk0MEVfRkRJUl9SSU5HX0NPVU5UCQkzMgogI2lmZGVmIEk0MEVfRkNPRQotI2RlZmluZSBJNDBFX0RFRkFVTFRfRkNPRSAgICAgICAgICAgICA4IC8qIGRlZmF1bHQgbnVtYmVyIG9mIFFQcyBmb3IgRkNvRSAqLwotI2RlZmluZSBJNDBFX01JTklNVU1fRkNPRSAgICAgICAgICAgICAxIC8qIG1pbmltdW0gbnVtYmVyIG9mIFFQcyBmb3IgRkNvRSAqLworI2RlZmluZSBJNDBFX0RFRkFVTFRfRkNPRQkJOCAvKiBkZWZhdWx0IG51bWJlciBvZiBRUHMgZm9yIEZDb0UgKi8KKyNkZWZpbmUgSTQwRV9NSU5JTVVNX0ZDT0UJCTEgLyogbWluaW11bSBudW1iZXIgb2YgUVBzIGZvciBGQ29FICovCiAjZW5kaWYgLyogSTQwRV9GQ09FICovCi0jZGVmaW5lIEk0MEVfTUFYX0FRX0JVRl9TSVpFICAgICAgICAgIDQwOTYKLSNkZWZpbmUgSTQwRV9BUV9MRU4gICAgICAgICAgICAgICAgICAgMjU2Ci0jZGVmaW5lIEk0MEVfQVFfV09SS19MSU1JVCAgICAgICAgICAgIDY2IC8qIG1heCBudW1iZXIgb2YgVkZzICsgYSBsaXR0bGUgKi8KLSNkZWZpbmUgSTQwRV9NQVhfVVNFUl9QUklPUklUWSAgICAgICAgOAotI2RlZmluZSBJNDBFX0RFRkFVTFRfTVNHX0VOQUJMRSAgICAgICA0Ci0jZGVmaW5lIEk0MEVfUVVFVUVfV0FJVF9SRVRSWV9MSU1JVCAgIDEwCi0jZGVmaW5lIEk0MEVfSU5UX05BTUVfU1RSX0xFTiAgICAgICAgKElGTkFNU0laICsgMTYpCisjZGVmaW5lIEk0MEVfTUFYX0FRX0JVRl9TSVpFCQk0MDk2CisjZGVmaW5lIEk0MEVfQVFfTEVOCQkJMjU2CisjZGVmaW5lIEk0MEVfQVFfV09SS19MSU1JVAkJNjYgLyogbWF4IG51bWJlciBvZiBWRnMgKyBhIGxpdHRsZSAqLworI2RlZmluZSBJNDBFX01BWF9VU0VSX1BSSU9SSVRZCQk4CisjZGVmaW5lIEk0MEVfREVGQVVMVF9NU0dfRU5BQkxFCQk0CisjZGVmaW5lIEk0MEVfUVVFVUVfV0FJVF9SRVRSWV9MSU1JVAkxMAorI2RlZmluZSBJNDBFX0lOVF9OQU1FX1NUUl9MRU4JCShJRk5BTVNJWiArIDE2KQogCiAvKiBFdGh0b29sIFByaXZhdGUgRmxhZ3MgKi8KLSNkZWZpbmUJSTQwRV9QUklWX0ZMQUdTX01GUF9GTEFHCQlCSVQoMCkKLSNkZWZpbmUJSTQwRV9QUklWX0ZMQUdTX0xJTktQT0xMX0ZMQUcJCUJJVCgxKQorI2RlZmluZSBJNDBFX1BSSVZfRkxBR1NfTUZQX0ZMQUcJCUJJVCgwKQorI2RlZmluZSBJNDBFX1BSSVZfRkxBR1NfTElOS1BPTExfRkxBRwkJQklUKDEpCiAjZGVmaW5lIEk0MEVfUFJJVl9GTEFHU19GRF9BVFIJCQlCSVQoMikKICNkZWZpbmUgSTQwRV9QUklWX0ZMQUdTX1ZFQl9TVEFUUwkJQklUKDMpCiAjZGVmaW5lIEk0MEVfUFJJVl9GTEFHU19IV19BVFJfRVZJQ1QJCUJJVCg0KQogI2RlZmluZSBJNDBFX1BSSVZfRkxBR1NfVFJVRV9QUk9NSVNDX1NVUFBPUlQJQklUKDUpCiAKLSNkZWZpbmUgSTQwRV9OVk1fVkVSU0lPTl9MT19TSElGVCAgMAotI2RlZmluZSBJNDBFX05WTV9WRVJTSU9OX0xPX01BU0sgICAoMHhmZiA8PCBJNDBFX05WTV9WRVJTSU9OX0xPX1NISUZUKQotI2RlZmluZSBJNDBFX05WTV9WRVJTSU9OX0hJX1NISUZUICAxMgotI2RlZmluZSBJNDBFX05WTV9WRVJTSU9OX0hJX01BU0sgICAoMHhmIDw8IEk0MEVfTlZNX1ZFUlNJT05fSElfU0hJRlQpCi0jZGVmaW5lIEk0MEVfT0VNX1ZFUl9CVUlMRF9NQVNLICAgIDB4ZmZmZgotI2RlZmluZSBJNDBFX09FTV9WRVJfUEFUQ0hfTUFTSyAgICAweGZmCi0jZGVmaW5lIEk0MEVfT0VNX1ZFUl9CVUlMRF9TSElGVCAgIDgKLSNkZWZpbmUgSTQwRV9PRU1fVkVSX1NISUZUICAgICAgICAgMjQKKyNkZWZpbmUgSTQwRV9OVk1fVkVSU0lPTl9MT19TSElGVAkwCisjZGVmaW5lIEk0MEVfTlZNX1ZFUlNJT05fTE9fTUFTSwkoMHhmZiA8PCBJNDBFX05WTV9WRVJTSU9OX0xPX1NISUZUKQorI2RlZmluZSBJNDBFX05WTV9WRVJTSU9OX0hJX1NISUZUCTEyCisjZGVmaW5lIEk0MEVfTlZNX1ZFUlNJT05fSElfTUFTSwkoMHhmIDw8IEk0MEVfTlZNX1ZFUlNJT05fSElfU0hJRlQpCisjZGVmaW5lIEk0MEVfT0VNX1ZFUl9CVUlMRF9NQVNLCQkweGZmZmYKKyNkZWZpbmUgSTQwRV9PRU1fVkVSX1BBVENIX01BU0sJCTB4ZmYKKyNkZWZpbmUgSTQwRV9PRU1fVkVSX0JVSUxEX1NISUZUCTgKKyNkZWZpbmUgSTQwRV9PRU1fVkVSX1NISUZUCQkyNAogI2RlZmluZSBJNDBFX1BIWV9ERUJVR19BTEwgXAogCShJNDBFX0FRX1BIWV9ERUJVR19ESVNBQkxFX0xJTktfRlcgfCBcCiAJSTQwRV9BUV9QSFlfREVCVUdfRElTQUJMRV9BTExfTElOS19GVykKIAogLyogVGhlIHZhbHVlcyBpbiBoZXJlIGFyZSBkZWNpbWFsIGNvZGVkIGFzIGhleCBhcyBpcyB0aGUgY2FzZSBpbiB0aGUgTlZNIG1hcCovCi0jZGVmaW5lIEk0MEVfQ1VSUkVOVF9OVk1fVkVSU0lPTl9ISSAweDIKLSNkZWZpbmUgSTQwRV9DVVJSRU5UX05WTV9WRVJTSU9OX0xPIDB4NDAKKyNkZWZpbmUgSTQwRV9DVVJSRU5UX05WTV9WRVJTSU9OX0hJCTB4MgorI2RlZmluZSBJNDBFX0NVUlJFTlRfTlZNX1ZFUlNJT05fTE8JMHg0MAogCi0vKiBtYWdpYyBmb3IgZ2V0dGluZyBkZWZpbmVzIGludG8gc3RyaW5ncyAqLwotI2RlZmluZSBTVFJJTkdJRlkoZm9vKSAgI2ZvbwotI2RlZmluZSBYU1RSSU5HSUZZKGJhcikgU1RSSU5HSUZZKGJhcikKLQotI2RlZmluZSBJNDBFX1JYX0RFU0MoUiwgaSkJCQlcCisjZGVmaW5lIEk0MEVfUlhfREVTQyhSLCBpKQlcCiAJKCYoKCh1bmlvbiBpNDBlXzMyYnl0ZV9yeF9kZXNjICopKChSKS0+ZGVzYykpW2ldKSkKLSNkZWZpbmUgSTQwRV9UWF9ERVNDKFIsIGkpCQkJXAorI2RlZmluZSBJNDBFX1RYX0RFU0MoUiwgaSkJXAogCSgmKCgoc3RydWN0IGk0MGVfdHhfZGVzYyAqKSgoUiktPmRlc2MpKVtpXSkpCi0jZGVmaW5lIEk0MEVfVFhfQ1RYVERFU0MoUiwgaSkJCQlcCisjZGVmaW5lIEk0MEVfVFhfQ1RYVERFU0MoUiwgaSkJXAogCSgmKCgoc3RydWN0IGk0MGVfdHhfY29udGV4dF9kZXNjICopKChSKS0+ZGVzYykpW2ldKSkKLSNkZWZpbmUgSTQwRV9UWF9GRElSREVTQyhSLCBpKQkJCVwKKyNkZWZpbmUgSTQwRV9UWF9GRElSREVTQyhSLCBpKQlcCiAJKCYoKChzdHJ1Y3QgaTQwZV9maWx0ZXJfcHJvZ3JhbV9kZXNjICopKChSKS0+ZGVzYykpW2ldKSkKIAogLyogZGVmYXVsdCB0byB0cnlpbmcgZm9yIGZvdXIgc2Vjb25kcyAqLwotI2RlZmluZSBJNDBFX1RSWV9MSU5LX1RJTUVPVVQgKDQgKiBIWikKKyNkZWZpbmUgSTQwRV9UUllfTElOS19USU1FT1VUCSg0ICogSFopCiAKIC8qKgogICogaTQwZV9pc19tYWNfNzEwIC0gUmV0dXJuIHRydWUgaWYgTUFDIGlzIFg3MTAvWEw3MTAKQEAgLTE5OSw5ICsxOTUsOSBAQAogI2RlZmluZSBJNDBFX0ZESVJfQlVGRkVSX0hFQURfUk9PTQkzMgogI2RlZmluZSBJNDBFX0ZESVJfQlVGRkVSX0hFQURfUk9PTV9GT1JfQVRSIChJNDBFX0ZESVJfQlVGRkVSX0hFQURfUk9PTSAqIDQpCiAKLSNkZWZpbmUgSTQwRV9IS0VZX0FSUkFZX1NJWkUgKChJNDBFX1BGUUZfSEtFWV9NQVhfSU5ERVggKyAxKSAqIDQpCi0jZGVmaW5lIEk0MEVfSExVVF9BUlJBWV9TSVpFICgoSTQwRV9QRlFGX0hMVVRfTUFYX0lOREVYICsgMSkgKiA0KQotI2RlZmluZSBJNDBFX1ZGX0hMVVRfQVJSQVlfU0laRSAoKEk0MEVfVkZRRl9ITFVUMV9NQVhfSU5ERVggKyAxKSAqIDQpCisjZGVmaW5lIEk0MEVfSEtFWV9BUlJBWV9TSVpFCSgoSTQwRV9QRlFGX0hLRVlfTUFYX0lOREVYICsgMSkgKiA0KQorI2RlZmluZSBJNDBFX0hMVVRfQVJSQVlfU0laRQkoKEk0MEVfUEZRRl9ITFVUX01BWF9JTkRFWCArIDEpICogNCkKKyNkZWZpbmUgSTQwRV9WRl9ITFVUX0FSUkFZX1NJWkUJKChJNDBFX1ZGUUZfSExVVDFfTUFYX0lOREVYICsgMSkgKiA0KQogCiBlbnVtIGk0MGVfZmRfc3RhdF9pZHggewogCUk0MEVfRkRfU1RBVF9BVFIsCkBAIC0zODcsOCArMzgzLDggQEAKIAlzdHJ1Y3QgbXV0ZXggc3dpdGNoX211dGV4OwogCXUxNiBsYW5fdnNpOyAgICAgICAvKiBvdXIgZGVmYXVsdCBMQU4gVlNJICovCiAJdTE2IGxhbl92ZWI7ICAgICAgIC8qIGluaXRpYWwgcmVsYXksIGlmIGV4aXN0cyAqLwotI2RlZmluZSBJNDBFX05PX1ZFQiAgIDB4ZmZmZgotI2RlZmluZSBJNDBFX05PX1ZTSSAgIDB4ZmZmZgorI2RlZmluZSBJNDBFX05PX1ZFQgkweGZmZmYKKyNkZWZpbmUgSTQwRV9OT19WU0kJMHhmZmZmCiAJdTE2IG5leHRfdnNpOyAgICAgIC8qIE5leHQgdW5hbGxvY2F0ZWQgVlNJIC0gMC1iYXNlZCEgKi8KIAlzdHJ1Y3QgaTQwZV92c2kgKip2c2k7CiAJc3RydWN0IGk0MGVfdmViICp2ZWJbSTQwRV9NQVhfVkVCXTsKQEAgLTQyMyw4ICs0MTksOCBAQAogCSAqLwogCXUxNiBkY2J4X2NhcDsKIAotCXUzMglmY29lX2htY19maWx0X251bTsKLQl1MzIJZmNvZV9obWNfY250eF9udW07CisJdTMyIGZjb2VfaG1jX2ZpbHRfbnVtOworCXUzMiBmY29lX2htY19jbnR4X251bTsKIAlzdHJ1Y3QgaTQwZV9maWx0ZXJfY29udHJvbF9zZXR0aW5ncyBmaWx0ZXJfc2V0dGluZ3M7CiAKIAlzdHJ1Y3QgcHRwX2Nsb2NrICpwdHBfY2xvY2s7CkBAIC00NzAsMTAgKzQ2NiwxMCBAQAogc3RydWN0IGk0MGVfdmViIHsKIAlzdHJ1Y3QgaTQwZV9wZiAqcGY7CiAJdTE2IGlkeDsKLQl1MTYgdmViX2lkeDsgICAgICAgICAgIC8qIGluZGV4IG9mIFZFQiBwYXJlbnQgKi8KKwl1MTYgdmViX2lkeDsJCS8qIGluZGV4IG9mIFZFQiBwYXJlbnQgKi8KIAl1MTYgc2VpZDsKIAl1MTYgdXBsaW5rX3NlaWQ7Ci0JdTE2IHN0YXRzX2lkeDsgICAgICAgICAgIC8qIGluZGV4IG9mIFZFQiBwYXJlbnQgKi8KKwl1MTYgc3RhdHNfaWR4OwkJLyogaW5kZXggb2YgVkVCIHBhcmVudCAqLwogCXU4ICBlbmFibGVkX3RjOwogCXUxNiBicmlkZ2VfbW9kZTsJLyogQnJpZGdlIE1vZGUgKFZFQi9WRVBBKSAqLwogCXUxNiBmbGFnczsKQEAgLTUzNCwxMiArNTMwLDEzIEBACiAJdTMyICBwcm9taXNjX3RocmVzaG9sZDsKIAogCXUxNiB3b3JrX2xpbWl0OwotCXUxNiBpbnRfcmF0ZV9saW1pdDsgIC8qIHZhbHVlIGluIHVzZWNzICovCisJdTE2IGludF9yYXRlX2xpbWl0OwkvKiB2YWx1ZSBpbiB1c2VjcyAqLwogCi0JdTE2IHJzc190YWJsZV9zaXplOyAvKiBIVyBSU1MgdGFibGUgc2l6ZSAqLwotCXUxNiByc3Nfc2l6ZTsgICAgICAgLyogQWxsb2NhdGVkIFJTUyBxdWV1ZXMgKi8KLQl1OCAgKnJzc19oa2V5X3VzZXI7IC8qIFVzZXIgY29uZmlndXJlZCBoYXNoIGtleXMgKi8KLQl1OCAgKnJzc19sdXRfdXNlcjsgIC8qIFVzZXIgY29uZmlndXJlZCBsb29rdXAgdGFibGUgZW50cmllcyAqLworCXUxNiByc3NfdGFibGVfc2l6ZTsJLyogSFcgUlNTIHRhYmxlIHNpemUgKi8KKwl1MTYgcnNzX3NpemU7CQkvKiBBbGxvY2F0ZWQgUlNTIHF1ZXVlcyAqLworCXU4ICAqcnNzX2hrZXlfdXNlcjsJLyogVXNlciBjb25maWd1cmVkIGhhc2gga2V5cyAqLworCXU4ICAqcnNzX2x1dF91c2VyOwkvKiBVc2VyIGNvbmZpZ3VyZWQgbG9va3VwIHRhYmxlIGVudHJpZXMgKi8KKwogCiAJdTE2IG1heF9mcmFtZTsKIAl1MTYgcnhfYnVmX2xlbjsKQEAgLTU1MCwxNCArNTQ3LDE0IEBACiAJaW50IGJhc2VfdmVjdG9yOwogCWJvb2wgaXJxc19yZWFkeTsKIAotCXUxNiBzZWlkOyAgICAgICAgICAgIC8qIEhXIGluZGV4IG9mIHRoaXMgVlNJIChhYnNvbHV0ZSBpbmRleCkgKi8KLQl1MTYgaWQ7ICAgICAgICAgICAgICAvKiBWU0kgbnVtYmVyICovCisJdTE2IHNlaWQ7CQkvKiBIVyBpbmRleCBvZiB0aGlzIFZTSSAoYWJzb2x1dGUgaW5kZXgpICovCisJdTE2IGlkOwkJCS8qIFZTSSBudW1iZXIgKi8KIAl1MTYgdXBsaW5rX3NlaWQ7CiAKLQl1MTYgYmFzZV9xdWV1ZTsgICAgICAvKiB2c2kncyBmaXJzdCBxdWV1ZSBpbiBodyBhcnJheSAqLwotCXUxNiBhbGxvY19xdWV1ZV9wYWlyczsgLyogQWxsb2NhdGVkIFR4L1J4IHF1ZXVlcyAqLwotCXUxNiByZXFfcXVldWVfcGFpcnM7IC8qIFVzZXIgcmVxdWVzdGVkIHF1ZXVlIHBhaXJzICovCi0JdTE2IG51bV9xdWV1ZV9wYWlyczsgLyogVXNlZCB0eCBhbmQgcnggcGFpcnMgKi8KKwl1MTYgYmFzZV9xdWV1ZTsJCS8qIHZzaSdzIGZpcnN0IHF1ZXVlIGluIGh3IGFycmF5ICovCisJdTE2IGFsbG9jX3F1ZXVlX3BhaXJzOwkvKiBBbGxvY2F0ZWQgVHgvUnggcXVldWVzICovCisJdTE2IHJlcV9xdWV1ZV9wYWlyczsJLyogVXNlciByZXF1ZXN0ZWQgcXVldWUgcGFpcnMgKi8KKwl1MTYgbnVtX3F1ZXVlX3BhaXJzOwkvKiBVc2VkIHR4IGFuZCByeCBwYWlycyAqLwogCXUxNiBudW1fZGVzYzsKIAllbnVtIGk0MGVfdnNpX3R5cGUgdHlwZTsgIC8qIFZTSSB0eXBlLCBlLmcuLCBMQU4sIEZDb0UsIGV0YyAqLwogCXMxNiB2Zl9pZDsJCS8qIFZpcnR1YWwgZnVuY3Rpb24gSUQgZm9yIFNSSU9WIFZTSXMgKi8KQEAgLTU3NiwxOSArNTczLDE2IEBACiAJLyogVEMgQlcgbGltaXQgbWF4IHF1YW50YSB3aXRoaW4gVlNJICovCiAJdTggIGJ3X2V0c19tYXhfcXVhbnRhW0k0MEVfTUFYX1RSQUZGSUNfQ0xBU1NdOwogCi0Jc3RydWN0IGk0MGVfcGYgKmJhY2s7ICAvKiBCYWNrcmVmZXJlbmNlIHRvIGFzc29jaWF0ZWQgUEYgKi8KLQl1MTYgaWR4OyAgICAgICAgICAgICAgIC8qIGluZGV4IGluIHBmLT52c2lbXSAqLwotCXUxNiB2ZWJfaWR4OyAgICAgICAgICAgLyogaW5kZXggb2YgVkVCIHBhcmVudCAqLwotCXN0cnVjdCBrb2JqZWN0ICprb2JqOyAgLyogc3lzZnMgb2JqZWN0ICovCi0JYm9vbCBjdXJyZW50X2lzdXA7ICAgICAvKiBTeW5jICdsaW5rIHVwJyBsb2dnaW5nICovCisJc3RydWN0IGk0MGVfcGYgKmJhY2s7CS8qIEJhY2tyZWZlcmVuY2UgdG8gYXNzb2NpYXRlZCBQRiAqLworCXUxNiBpZHg7CQkvKiBpbmRleCBpbiBwZi0+dnNpW10gKi8KKwl1MTYgdmViX2lkeDsJCS8qIGluZGV4IG9mIFZFQiBwYXJlbnQgKi8KKwlzdHJ1Y3Qga29iamVjdCAqa29iajsJLyogc3lzZnMgb2JqZWN0ICovCisJYm9vbCBjdXJyZW50X2lzdXA7CS8qIFN5bmMgJ2xpbmsgdXAnIGxvZ2dpbmcgKi8KIAogCXZvaWQgKnByaXY7CS8qIGNsaWVudCBkcml2ZXIgZGF0YSByZWZlcmVuY2UuICovCiAKIAkvKiBWU0kgc3BlY2lmaWMgaGFuZGxlcnMgKi8KIAlpcnFyZXR1cm5fdCAoKmlycV9oYW5kbGVyKShpbnQgaXJxLCB2b2lkICpkYXRhKTsKLQotCS8qIGN1cnJlbnQgcnhuZmMgZGF0YSAqLwotCXN0cnVjdCBldGh0b29sX3J4bmZjIHJ4bmZjOyAvKiBjdXJyZW50IHJzcyBoYXNoIG9wdHMgKi8KIH0gX19fX2NhY2hlbGluZV9pbnRlcm5vZGVhbGlnbmVkX2luX3NtcDsKIAogc3RydWN0IGk0MGVfbmV0ZGV2X3ByaXYgewpAQCAtNzA3LDYgKzcwMSw4IEBACiB2b2lkIGk0MGVfZG9fcmVzZXQoc3RydWN0IGk0MGVfcGYgKnBmLCB1MzIgcmVzZXRfZmxhZ3MpOwogaW50IGk0MGVfY29uZmlnX3JzcyhzdHJ1Y3QgaTQwZV92c2kgKnZzaSwgdTggKnNlZWQsIHU4ICpsdXQsIHUxNiBsdXRfc2l6ZSk7CiBpbnQgaTQwZV9nZXRfcnNzKHN0cnVjdCBpNDBlX3ZzaSAqdnNpLCB1OCAqc2VlZCwgdTggKmx1dCwgdTE2IGx1dF9zaXplKTsKK3ZvaWQgaTQwZV9maWxsX3Jzc19sdXQoc3RydWN0IGk0MGVfcGYgKnBmLCB1OCAqbHV0LAorCQkgICAgICAgdTE2IHJzc190YWJsZV9zaXplLCB1MTYgcnNzX3NpemUpOwogc3RydWN0IGk0MGVfdnNpICppNDBlX2ZpbmRfdnNpX2Zyb21faWQoc3RydWN0IGk0MGVfcGYgKnBmLCB1MTYgaWQpOwogdm9pZCBpNDBlX3VwZGF0ZV9zdGF0cyhzdHJ1Y3QgaTQwZV92c2kgKnZzaSk7CiB2b2lkIGk0MGVfdXBkYXRlX2V0aF9zdGF0cyhzdHJ1Y3QgaTQwZV92c2kgKnZzaSk7CkBAIC03MTQsOCArNzEwLDYgQEAKIGludCBpNDBlX2ZldGNoX3N3aXRjaF9jb25maWd1cmF0aW9uKHN0cnVjdCBpNDBlX3BmICpwZiwKIAkJCQkgICAgYm9vbCBwcmludGNvbmZpZyk7CiAKLWludCBpNDBlX3Byb2dyYW1fZmRpcl9maWx0ZXIoc3RydWN0IGk0MGVfZmRpcl9maWx0ZXIgKmZkaXJfZGF0YSwgdTggKnJhd19wYWNrZXQsCi0JCQkgICAgIHN0cnVjdCBpNDBlX3BmICpwZiwgYm9vbCBhZGQpOwogaW50IGk0MGVfYWRkX2RlbF9mZGlyKHN0cnVjdCBpNDBlX3ZzaSAqdnNpLAogCQkgICAgICBzdHJ1Y3QgaTQwZV9mZGlyX2ZpbHRlciAqaW5wdXQsIGJvb2wgYWRkKTsKIHZvaWQgaTQwZV9mZGlyX2NoZWNrX2FuZF9yZWVuYWJsZShzdHJ1Y3QgaTQwZV9wZiAqcGYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2FkbWlucV9jbWQuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9hZG1pbnFfY21kLmgKaW5kZXggMTFjZjFhNS4uNjdlMzk2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2FkbWlucV9jbWQuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfYWRtaW5xX2NtZC5oCkBAIC0yMDQsNiArMjA0LDkgQEAKIAlpNDBlX2FxY19vcGNfc3VzcGVuZF9wb3J0X3R4CQkJCT0gMHgwNDFCLAogCWk0MGVfYXFjX29wY19yZXN1bWVfcG9ydF90eAkJCQk9IDB4MDQxQywKIAlpNDBlX2FxY19vcGNfY29uZmlndXJlX3BhcnRpdGlvbl9idwkJCT0gMHgwNDFELAorCS8qIGhtYyAqLworCWk0MGVfYXFjX29wY19xdWVyeV9obWNfcmVzb3VyY2VfcHJvZmlsZQk9IDB4MDUwMCwKKwlpNDBlX2FxY19vcGNfc2V0X2htY19yZXNvdXJjZV9wcm9maWxlCT0gMHgwNTAxLAogCiAJLyogcGh5IGNvbW1hbmRzKi8KIAlpNDBlX2FxY19vcGNfZ2V0X3BoeV9hYmlsaXRpZXMJCT0gMHgwNjAwLApAQCAtNDUwLDEzICs0NTMsMTUgQEAKIC8qIFNldCBBUlAgUHJveHkgY29tbWFuZCAvIHJlc3BvbnNlIChpbmRpcmVjdCAweDAxMDQpICovCiBzdHJ1Y3QgaTQwZV9hcWNfYXJwX3Byb3h5X2RhdGEgewogCV9fbGUxNgljb21tYW5kX2ZsYWdzOwotI2RlZmluZSBJNDBFX0FRX0FSUF9JTklUX0lQVjQJMHgwMDA4Ci0jZGVmaW5lIEk0MEVfQVFfQVJQX1VOU1VQX0NUTAkweDAwMTAKLSNkZWZpbmUgSTQwRV9BUV9BUlBfRU5BCQkweDAwMjAKLSNkZWZpbmUgSTQwRV9BUV9BUlBfQUREX0lQVjQJMHgwMDQwCi0jZGVmaW5lIEk0MEVfQVFfQVJQX0RFTF9JUFY0CTB4MDA4MAorI2RlZmluZSBJNDBFX0FRX0FSUF9JTklUX0lQVjQJMHgwODAwCisjZGVmaW5lIEk0MEVfQVFfQVJQX1VOU1VQX0NUTAkweDEwMDAKKyNkZWZpbmUgSTQwRV9BUV9BUlBfRU5BCQkweDIwMDAKKyNkZWZpbmUgSTQwRV9BUV9BUlBfQUREX0lQVjQJMHg0MDAwCisjZGVmaW5lIEk0MEVfQVFfQVJQX0RFTF9JUFY0CTB4ODAwMAogCV9fbGUxNgl0YWJsZV9pZDsKLQlfX2xlMzIJcGZwbV9wcm94eWZjOworCV9fbGUzMgllbmFibGVkX29mZmxvYWRzOworI2RlZmluZSBJNDBFX0FRX0FSUF9ESVJFQ1RFRF9PRkZMT0FEX0VOQUJMRQkweDAwMDAwMDIwCisjZGVmaW5lIEk0MEVfQVFfQVJQX09GRkxPQURfRU5BQkxFCQkweDAwMDAwODAwCiAJX19sZTMyCWlwX2FkZHI7CiAJdTgJbWFjX2FkZHJbNl07CiAJdTgJcmVzZXJ2ZWRbMl07CkBAIC00NzEsMTcgKzQ3NiwxOSBAQAogCV9fbGUxNgl0YWJsZV9pZHhfaXB2Nl8wOwogCV9fbGUxNgl0YWJsZV9pZHhfaXB2Nl8xOwogCV9fbGUxNgljb250cm9sOwotI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0FERF8wCQkweDAxMDAKLSNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9ERUxfMAkJMHgwMjAwCi0jZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfQUREXzEJCTB4MDQwMAotI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0RFTF8xCQkweDA4MDAKLSNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9BRERfSVBWNl8wCTB4MTAwMAotI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0RFTF9JUFY2XzAJMHgyMDAwCi0jZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfQUREX0lQVjZfMQkweDQwMDAKLSNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9ERUxfSVBWNl8xCTB4ODAwMAotI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0NPTU1BTkRfU0VRCTB4MDAwMQotI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0lOSVRfSVBWNl9UQkwJMHgwMDAyCi0jZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfSU5JVF9NQUNfVEJMCTB4MDAwNAorI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0FERF8wCQkweDAwMDEKKyNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9ERUxfMAkJMHgwMDAyCisjZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfQUREXzEJCTB4MDAwNAorI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0RFTF8xCQkweDAwMDgKKyNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9BRERfSVBWNl8wCTB4MDAxMAorI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0RFTF9JUFY2XzAJMHgwMDIwCisjZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfQUREX0lQVjZfMQkweDAwNDAKKyNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9ERUxfSVBWNl8xCTB4MDA4MAorI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0NPTU1BTkRfU0VRCTB4MDEwMAorI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0lOSVRfSVBWNl9UQkwJMHgwMjAwCisjZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfSU5JVF9NQUNfVEJMCTB4MDQwMAorI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX09GRkxPQURfRU5BQkxFCTB4MDgwMAorI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0RJUkVDVEVEX09GRkxPQURfRU5BQkxFCTB4MTAwMAogCXU4CW1hY19hZGRyXzBbNl07CiAJdTgJbWFjX2FkZHJfMVs2XTsKIAl1OAlsb2NhbF9tYWNfYWRkcls2XTsKQEAgLTE1ODIsNiArMTU4OSwyNCBAQAogCiBJNDBFX0NIRUNLX1NUUlVDVF9MRU4oMHgyMiwgaTQwZV9hcWNfY29uZmlndXJlX3BhcnRpdGlvbl9id19kYXRhKTsKIAorLyogR2V0IGFuZCBzZXQgdGhlIGFjdGl2ZSBITUMgcmVzb3VyY2UgcHJvZmlsZSBhbmQgc3RhdHVzLgorICogKGRpcmVjdCAweDA1MDApIGFuZCAoZGlyZWN0IDB4MDUwMSkKKyAqLworc3RydWN0IGk0MGVfYXFfZ2V0X3NldF9obWNfcmVzb3VyY2VfcHJvZmlsZSB7CisJdTgJcG1fcHJvZmlsZTsKKwl1OAlwZV92Zl9lbmFibGVkOworCXU4CXJlc2VydmVkWzE0XTsKK307CisKK0k0MEVfQ0hFQ0tfQ01EX0xFTkdUSChpNDBlX2FxX2dldF9zZXRfaG1jX3Jlc291cmNlX3Byb2ZpbGUpOworCitlbnVtIGk0MGVfYXFfaG1jX3Byb2ZpbGUgeworCS8qIEk0MEVfSE1DX1BST0ZJTEVfTk9fQ0hBTkdFCT0gMCwgcmVzZXJ2ZWQgKi8KKwlJNDBFX0hNQ19QUk9GSUxFX0RFRkFVTFQJPSAxLAorCUk0MEVfSE1DX1BST0ZJTEVfRkFWT1JfVkYJPSAyLAorCUk0MEVfSE1DX1BST0ZJTEVfRVFVQUwJCT0gMywKK307CisKIC8qIEdldCBQSFkgQWJpbGl0aWVzIChpbmRpcmVjdCAweDA2MDApIHVzZXMgdGhlIGdlbmVyaWMgaW5kaXJlY3Qgc3RydWN0ICovCiAKIC8qIHNldCBpbiBwYXJhbTAgZm9yIGdldCBwaHkgYWJpbGl0aWVzIHRvIHJlcG9ydCBxdWFsaWZpZWQgbW9kdWxlcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2NsaWVudC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2NsaWVudC5jCmluZGV4IGUxMzcwYzUuLjI1MGRiMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9jbGllbnQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfY2xpZW50LmMKQEAgLTE0OCw2ICsxNDgsMTEgQEAKIAkJCQkJIkNhbm5vdCBsb2NhdGUgY2xpZW50IGluc3RhbmNlIHZpcnR1YWwgY2hhbm5lbCByZWNlaXZlIHJvdXRpbmVcbiIpOwogCQkJCWNvbnRpbnVlOwogCQkJfQorCQkJaWYgKCF0ZXN0X2JpdChfX0k0MEVfQ0xJRU5UX0lOU1RBTkNFX09QRU5FRCwKKwkJCQkgICAgICAmY2Rldi0+c3RhdGUpKSB7CisJCQkJZGV2X2RiZygmdnNpLT5iYWNrLT5wZGV2LT5kZXYsICJDbGllbnQgaXMgbm90IG9wZW4sIGFib3J0IHZpcnRjaG5sX3JlY2VpdmVcbiIpOworCQkJCWNvbnRpbnVlOworCQkJfQogCQkJY2Rldi0+Y2xpZW50LT5vcHMtPnZpcnRjaG5sX3JlY2VpdmUoJmNkZXYtPmxhbl9pbmZvLAogCQkJCQkJCSAgICBjZGV2LT5jbGllbnQsCiAJCQkJCQkJICAgIHZmX2lkLCBtc2csIGxlbik7CkBAIC0xODEsNiArMTg2LDExIEBACiAJCQkJCSJDYW5ub3QgbG9jYXRlIGNsaWVudCBpbnN0YW5jZSBsMl9wYXJhbV9jaGFuZ2Ugcm91dGluZVxuIik7CiAJCQkJY29udGludWU7CiAJCQl9CisJCQlpZiAoIXRlc3RfYml0KF9fSTQwRV9DTElFTlRfSU5TVEFOQ0VfT1BFTkVELAorCQkJCSAgICAgICZjZGV2LT5zdGF0ZSkpIHsKKwkJCQlkZXZfZGJnKCZ2c2ktPmJhY2stPnBkZXYtPmRldiwgIkNsaWVudCBpcyBub3Qgb3BlbiwgYWJvcnQgbDIgcGFyYW0gY2hhbmdlXG4iKTsKKwkJCQljb250aW51ZTsKKwkJCX0KIAkJCWNkZXYtPmxhbl9pbmZvLnBhcmFtcyA9IHBhcmFtczsKIAkJCWNkZXYtPmNsaWVudC0+b3BzLT5sMl9wYXJhbV9jaGFuZ2UoJmNkZXYtPmxhbl9pbmZvLAogCQkJCQkJCSAgIGNkZXYtPmNsaWVudCwKQEAgLTE5OSw2ICsyMDksNyBAQAogdm9pZCBpNDBlX25vdGlmeV9jbGllbnRfb2ZfbmV0ZGV2X29wZW4oc3RydWN0IGk0MGVfdnNpICp2c2kpCiB7CiAJc3RydWN0IGk0MGVfY2xpZW50X2luc3RhbmNlICpjZGV2OworCWludCByZXQgPSAwOwogCiAJaWYgKCF2c2kpCiAJCXJldHVybjsKQEAgLTIxMSw3ICsyMjIsMTQgQEAKIAkJCQkJIkNhbm5vdCBsb2NhdGUgY2xpZW50IGluc3RhbmNlIG9wZW4gcm91dGluZVxuIik7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQljZGV2LT5jbGllbnQtPm9wcy0+b3BlbigmY2Rldi0+bGFuX2luZm8sIGNkZXYtPmNsaWVudCk7CisJCQlpZiAoISh0ZXN0X2JpdChfX0k0MEVfQ0xJRU5UX0lOU1RBTkNFX09QRU5FRCwKKwkJCQkgICAgICAgJmNkZXYtPnN0YXRlKSkpIHsKKwkJCQlyZXQgPSBjZGV2LT5jbGllbnQtPm9wcy0+b3BlbigmY2Rldi0+bGFuX2luZm8sCisJCQkJCQkJICAgICAgY2Rldi0+Y2xpZW50KTsKKwkJCQlpZiAoIXJldCkKKwkJCQkJc2V0X2JpdChfX0k0MEVfQ0xJRU5UX0lOU1RBTkNFX09QRU5FRCwKKwkJCQkJCSZjZGV2LT5zdGF0ZSk7CisJCQl9CiAJCX0KIAl9CiAJbXV0ZXhfdW5sb2NrKCZpNDBlX2NsaWVudF9pbnN0YW5jZV9tdXRleCk7CkBAIC0yOTgsNiArMzE2LDExIEBACiAJCQkJCSJDYW5ub3QgbG9jYXRlIGNsaWVudCBpbnN0YW5jZSBWRiByZXNldCByb3V0aW5lXG4iKTsKIAkJCQljb250aW51ZTsKIAkJCX0KKwkJCWlmICghdGVzdF9iaXQoX19JNDBFX0NMSUVOVF9JTlNUQU5DRV9PUEVORUQsCisJCQkJICAgICAgJmNkZXYtPnN0YXRlKSkgeworCQkJCWRldl9kYmcoJnBmLT5wZGV2LT5kZXYsICJDbGllbnQgaXMgbm90IG9wZW4sIGFib3J0IHZmLXJlc2V0XG4iKTsKKwkJCQljb250aW51ZTsKKwkJCX0KIAkJCWNkZXYtPmNsaWVudC0+b3BzLT52Zl9yZXNldCgmY2Rldi0+bGFuX2luZm8sCiAJCQkJCQkgICAgY2Rldi0+Y2xpZW50LCB2Zl9pZCk7CiAJCX0KQEAgLTMyOCw2ICszNTEsMTEgQEAKIAkJCQkJIkNhbm5vdCBsb2NhdGUgY2xpZW50IGluc3RhbmNlIFZGIGVuYWJsZSByb3V0aW5lXG4iKTsKIAkJCQljb250aW51ZTsKIAkJCX0KKwkJCWlmICghdGVzdF9iaXQoX19JNDBFX0NMSUVOVF9JTlNUQU5DRV9PUEVORUQsCisJCQkJICAgICAgJmNkZXYtPnN0YXRlKSkgeworCQkJCWRldl9kYmcoJnBmLT5wZGV2LT5kZXYsICJDbGllbnQgaXMgbm90IG9wZW4sIGFib3J0IHZmLWVuYWJsZVxuIik7CisJCQkJY29udGludWU7CisJCQl9CiAJCQljZGV2LT5jbGllbnQtPm9wcy0+dmZfZW5hYmxlKCZjZGV2LT5sYW5faW5mbywKIAkJCQkJCSAgICAgY2Rldi0+Y2xpZW50LCBudW1fdmZzKTsKIAkJfQpAQCAtMzYyLDYgKzM5MCwxMSBAQAogCQkJCQkiQ2Fubm90IGxvY2F0ZSBjbGllbnQgaW5zdGFuY2UgVkYgY2FwYWJpbGl0eSByb3V0aW5lXG4iKTsKIAkJCQljb250aW51ZTsKIAkJCX0KKwkJCWlmICghdGVzdF9iaXQoX19JNDBFX0NMSUVOVF9JTlNUQU5DRV9PUEVORUQsCisJCQkJICAgICAgJmNkZXYtPnN0YXRlKSkgeworCQkJCWRldl9kYmcoJnBmLT5wZGV2LT5kZXYsICJDbGllbnQgaXMgbm90IG9wZW4sIGFib3J0IHZmLWNhcGFibGVcbiIpOworCQkJCWNvbnRpbnVlOworCQkJfQogCQkJY2FwYWJsZSA9IGNkZXYtPmNsaWVudC0+b3BzLT52Zl9jYXBhYmxlKCZjZGV2LT5sYW5faW5mbywKIAkJCQkJCQkJY2Rldi0+Y2xpZW50LAogCQkJCQkJCQl2Zl9pZCk7CkBAIC00MDcsMTIgKzQ0MCwxNCBAQAogICogaTQwZV9jbGllbnRfYWRkX2luc3RhbmNlIC0gYWRkIGEgY2xpZW50IGluc3RhbmNlIHN0cnVjdCB0byB0aGUgaW5zdGFuY2UgbGlzdAogICogQHBmOiBwb2ludGVyIHRvIHRoZSBib2FyZCBzdHJ1Y3QKICAqIEBjbGllbnQ6IHBvaW50ZXIgdG8gYSBjbGllbnQgc3RydWN0IGluIHRoZSBjbGllbnQgbGlzdC4KKyAqIEBleGlzdGluZzogaWYgdGhlcmUgd2FzIGFscmVhZHkgYW4gZXhpc3RpbmcgaW5zdGFuY2UKICAqCi0gKiBSZXR1cm5zIGNkZXYgcHRyIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZQorICogUmV0dXJucyBjZGV2IHB0ciBvbiBzdWNjZXNzIG9yIGlmIGFscmVhZHkgZXhpc3RzLCBOVUxMIG9uIGZhaWx1cmUKICAqKi8KIHN0YXRpYwogc3RydWN0IGk0MGVfY2xpZW50X2luc3RhbmNlICppNDBlX2NsaWVudF9hZGRfaW5zdGFuY2Uoc3RydWN0IGk0MGVfcGYgKnBmLAotCQkJCQkJICAgICAgc3RydWN0IGk0MGVfY2xpZW50ICpjbGllbnQpCisJCQkJCQkgICAgIHN0cnVjdCBpNDBlX2NsaWVudCAqY2xpZW50LAorCQkJCQkJICAgICBib29sICpleGlzdGluZykKIHsKIAlzdHJ1Y3QgaTQwZV9jbGllbnRfaW5zdGFuY2UgKmNkZXY7CiAJc3RydWN0IG5ldGRldl9od19hZGRyICptYWMgPSBOVUxMOwpAQCAtNDIxLDcgKzQ1Niw3IEBACiAJbXV0ZXhfbG9jaygmaTQwZV9jbGllbnRfaW5zdGFuY2VfbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2RldiwgJmk0MGVfY2xpZW50X2luc3RhbmNlcywgbGlzdCkgewogCQlpZiAoKGNkZXYtPmxhbl9pbmZvLnBmID09IHBmKSAmJiAoY2Rldi0+Y2xpZW50ID09IGNsaWVudCkpIHsKLQkJCWNkZXYgPSBOVUxMOworCQkJKmV4aXN0aW5nID0gdHJ1ZTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJfQpAQCAtNTA1LDYgKzU0MCw3IEBACiB7CiAJc3RydWN0IGk0MGVfY2xpZW50X2luc3RhbmNlICpjZGV2OwogCXN0cnVjdCBpNDBlX2NsaWVudCAqY2xpZW50OworCWJvb2wgZXhpc3RpbmcgPSBmYWxzZTsKIAlpbnQgcmV0ID0gMDsKIAogCWlmICghKHBmLT5mbGFncyAmIEk0MEVfRkxBR19TRVJWSUNFX0NMSUVOVF9SRVFVRVNURUQpKQpAQCAtNTI4LDE5ICs1NjQsMjcgQEAKIAkJCS8qIGNoZWNrIGlmIEwyIFZTSSBpcyB1cCwgaWYgbm90IHdlIGFyZSBub3QgcmVhZHkgKi8KIAkJCWlmICh0ZXN0X2JpdChfX0k0MEVfRE9XTiwgJnBmLT52c2lbcGYtPmxhbl92c2ldLT5zdGF0ZSkpCiAJCQkJY29udGludWU7CisJCX0gZWxzZSB7CisJCQlkZXZfd2FybigmcGYtPnBkZXYtPmRldiwgIlRoaXMgY2xpZW50ICVzIGlzIGJlaW5nIGluc3RhbmNpYXRlZCBhdCBwcm9iZVxuIiwKKwkJCQkgY2xpZW50LT5uYW1lKTsKIAkJfQogCiAJCS8qIEFkZCB0aGUgY2xpZW50IGluc3RhbmNlIHRvIHRoZSBpbnN0YW5jZSBsaXN0ICovCi0JCWNkZXYgPSBpNDBlX2NsaWVudF9hZGRfaW5zdGFuY2UocGYsIGNsaWVudCk7CisJCWNkZXYgPSBpNDBlX2NsaWVudF9hZGRfaW5zdGFuY2UocGYsIGNsaWVudCwgJmV4aXN0aW5nKTsKIAkJaWYgKCFjZGV2KQogCQkJY29udGludWU7CiAKLQkJLyogQWxzbyB1cCB0aGUgcmVmX2NudCBvZiBuby4gb2YgaW5zdGFuY2VzIG9mIHRoaXMgY2xpZW50ICovCi0JCWF0b21pY19pbmMoJmNsaWVudC0+cmVmX2NudCk7Ci0JCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiQWRkZWQgaW5zdGFuY2Ugb2YgQ2xpZW50ICVzIHRvIFBGJWQgYnVzPTB4JTAyeCBmdW5jPTB4JTAyeFxuIiwKLQkJCSBjbGllbnQtPm5hbWUsIHBmLT5ody5wZl9pZCwKLQkJCSBwZi0+aHcuYnVzLmRldmljZSwgcGYtPmh3LmJ1cy5mdW5jKTsKKwkJaWYgKCFleGlzdGluZykgeworCQkJLyogQWxzbyB1cCB0aGUgcmVmX2NudCBmb3Igbm8uIG9mIGluc3RhbmNlcyBvZiB0aGlzCisJCQkgKiBjbGllbnQuCisJCQkgKi8KKwkJCWF0b21pY19pbmMoJmNsaWVudC0+cmVmX2NudCk7CisJCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIkFkZGVkIGluc3RhbmNlIG9mIENsaWVudCAlcyB0byBQRiVkIGJ1cz0weCUwMnggZnVuYz0weCUwMnhcbiIsCisJCQkJIGNsaWVudC0+bmFtZSwgcGYtPmh3LnBmX2lkLAorCQkJCSBwZi0+aHcuYnVzLmRldmljZSwgcGYtPmh3LmJ1cy5mdW5jKTsKKwkJfQogCisJCW11dGV4X2xvY2soJmk0MGVfY2xpZW50X2luc3RhbmNlX211dGV4KTsKIAkJLyogU2VuZCBhbiBPcGVuIHJlcXVlc3QgdG8gdGhlIGNsaWVudCAqLwogCQlhdG9taWNfaW5jKCZjZGV2LT5yZWZfY250KTsKIAkJaWYgKGNsaWVudC0+b3BzICYmIGNsaWVudC0+b3BzLT5vcGVuKQpAQCAtNTUwLDEwICs1OTQsMTIgQEAKIAkJCXNldF9iaXQoX19JNDBFX0NMSUVOVF9JTlNUQU5DRV9PUEVORUQsICZjZGV2LT5zdGF0ZSk7CiAJCX0gZWxzZSB7CiAJCQkvKiByZW1vdmUgY2xpZW50IGluc3RhbmNlICovCisJCQltdXRleF91bmxvY2soJmk0MGVfY2xpZW50X2luc3RhbmNlX211dGV4KTsKIAkJCWk0MGVfY2xpZW50X2RlbF9pbnN0YW5jZShwZiwgY2xpZW50KTsKIAkJCWF0b21pY19kZWMoJmNsaWVudC0+cmVmX2NudCk7CiAJCQljb250aW51ZTsKIAkJfQorCQltdXRleF91bmxvY2soJmk0MGVfY2xpZW50X2luc3RhbmNlX211dGV4KTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZpNDBlX2NsaWVudF9tdXRleCk7CiB9CkBAIC01ODgsNyArNjM0LDggQEAKIAkJIHBmLT5ody5wZl9pZCwgcGYtPmh3LmJ1cy5kZXZpY2UsIHBmLT5ody5idXMuZnVuYyk7CiAKIAkvKiBTaW5jZSBpbiBzb21lIGNhc2VzIHJlZ2lzdGVyIG1heSBoYXZlIGhhcHBlbmVkIGJlZm9yZSBhIGRldmljZSBnZXRzCi0JICogYWRkZWQsIHdlIGNhbiBzY2hlZHVsZSBhIHN1YnRhc2sgdG8gZ28gaW5pdGlhdGUgdGhlIGNsaWVudHMuCisJICogYWRkZWQsIHdlIGNhbiBzY2hlZHVsZSBhIHN1YnRhc2sgdG8gZ28gaW5pdGlhdGUgdGhlIGNsaWVudHMgaWYKKwkgKiB0aGV5IGNhbiBiZSBsYXVuY2hlZCBhdCBwcm9iZSB0aW1lLgogCSAqLwogCXBmLT5mbGFncyB8PSBJNDBFX0ZMQUdfU0VSVklDRV9DTElFTlRfUkVRVUVTVEVEOwogCWk0MGVfc2VydmljZV9ldmVudF9zY2hlZHVsZShwZik7CkBAIC02MzUsNyArNjgyLDcgQEAKIHN0YXRpYyBpbnQgaTQwZV9jbGllbnRfcmVsZWFzZShzdHJ1Y3QgaTQwZV9jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgaTQwZV9jbGllbnRfaW5zdGFuY2UgKmNkZXYsICp0bXA7Ci0Jc3RydWN0IGk0MGVfcGYgKnBmID0gTlVMTDsKKwlzdHJ1Y3QgaTQwZV9wZiAqcGY7CiAJaW50IHJldCA9IDA7CiAKIAlMSVNUX0hFQUQoY2RldnNfdG1wKTsKQEAgLTY0NSwxMiArNjkyLDEyIEBACiAJCWlmIChzdHJuY21wKGNkZXYtPmNsaWVudC0+bmFtZSwgY2xpZW50LT5uYW1lLAogCQkJICAgIEk0MEVfQ0xJRU5UX1NUUl9MRU5HVEgpKQogCQkJY29udGludWU7CisJCXBmID0gKHN0cnVjdCBpNDBlX3BmICopY2Rldi0+bGFuX2luZm8ucGY7CiAJCWlmICh0ZXN0X2JpdChfX0k0MEVfQ0xJRU5UX0lOU1RBTkNFX09QRU5FRCwgJmNkZXYtPnN0YXRlKSkgewogCQkJaWYgKGF0b21pY19yZWFkKCZjZGV2LT5yZWZfY250KSA+IDApIHsKIAkJCQlyZXQgPSBJNDBFX0VSUl9OT1RfUkVBRFk7CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCQlwZiA9IChzdHJ1Y3QgaTQwZV9wZiAqKWNkZXYtPmxhbl9pbmZvLnBmOwogCQkJaWYgKGNsaWVudC0+b3BzICYmIGNsaWVudC0+b3BzLT5jbG9zZSkKIAkJCQljbGllbnQtPm9wcy0+Y2xvc2UoJmNkZXYtPmxhbl9pbmZvLCBjbGllbnQsCiAJCQkJCQkgICBmYWxzZSk7CkBAIC02NjIsOCArNzA5LDcgQEAKIAkJCQkgY2xpZW50LT5uYW1lLCBwZi0+aHcucGZfaWQpOwogCQl9CiAJCS8qIGRlbGV0ZSB0aGUgY2xpZW50IGluc3RhbmNlIGZyb20gdGhlIGxpc3QgKi8KLQkJbGlzdF9kZWwoJmNkZXYtPmxpc3QpOwotCQlsaXN0X2FkZCgmY2Rldi0+bGlzdCwgJmNkZXZzX3RtcCk7CisJCWxpc3RfbW92ZSgmY2Rldi0+bGlzdCwgJmNkZXZzX3RtcCk7CiAJCWF0b21pY19kZWMoJmNsaWVudC0+cmVmX2NudCk7CiAJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiRGVsZXRlZCBjbGllbnQgaW5zdGFuY2Ugb2YgQ2xpZW50ICVzXG4iLAogCQkJIGNsaWVudC0+bmFtZSk7CkBAIC03OTIsNyArODM4LDggQEAKIAkJCXdyMzIoaHcsIEk0MEVfUEZJTlRfQUVRQ1RMLCByZWcpOwogCQl9CiAJfQotCisJLyogTWl0aWdhdGUgc3luYyBwcm9ibGVtcyB3aXRoIGl3YXJwIFZGIGRyaXZlciAqLworCWk0MGVfZmx1c2goaHcpOwogCXJldHVybiAwOwogZXJyOgogCWtmcmVlKGxkZXYtPnF2bGlzdF9pbmZvKTsKQEAgLTk5MCw3ICsxMDM3LDYgQEAKIAlpZiAoIWk0MGVfY2xpZW50X2lzX3JlZ2lzdGVyZWQoY2xpZW50KSkgewogCQlwcl9pbmZvKCJpNDBlOiBDbGllbnQgJXMgaGFzIG5vdCBiZWVuIHJlZ2lzdGVyZWRcbiIsCiAJCQljbGllbnQtPm5hbWUpOwotCQltdXRleF91bmxvY2soJmk0MGVfY2xpZW50X211dGV4KTsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBvdXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2NsaWVudC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2NsaWVudC5oCmluZGV4IGE0NjAxZDkuLjM4YTZjMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9jbGllbnQuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfY2xpZW50LmgKQEAgLTM2LDkgKzM2LDkgQEAKICNkZWZpbmUgSTQwRV9DTElFTlRfVkVSU0lPTl9NSU5PUiAwMQogI2RlZmluZSBJNDBFX0NMSUVOVF9WRVJTSU9OX0JVSUxEIDAwCiAjZGVmaW5lIEk0MEVfQ0xJRU5UX1ZFUlNJT05fU1RSICAgICBcCi0JWFNUUklOR0lGWShJNDBFX0NMSUVOVF9WRVJTSU9OX01BSk9SKSAiLiIgXAotCVhTVFJJTkdJRlkoSTQwRV9DTElFTlRfVkVSU0lPTl9NSU5PUikgIi4iIFwKLQlYU1RSSU5HSUZZKEk0MEVfQ0xJRU5UX1ZFUlNJT05fQlVJTEQpCisJX19zdHJpbmdpZnkoSTQwRV9DTElFTlRfVkVSU0lPTl9NQUpPUikgIi4iIFwKKwlfX3N0cmluZ2lmeShJNDBFX0NMSUVOVF9WRVJTSU9OX01JTk9SKSAiLiIgXAorCV9fc3RyaW5naWZ5KEk0MEVfQ0xJRU5UX1ZFUlNJT05fQlVJTEQpCiAKIHN0cnVjdCBpNDBlX2NsaWVudF92ZXJzaW9uIHsKIAl1OCBtYWpvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfZGVidWdmcy5jCmluZGV4IDA1Y2Y5YTcuLjBjMTg3NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2RlYnVnZnMuYwpAQCAtMTA1NCw2ICsxMDU0LDcgQEAKIAkJCXN0cnVjdCBpNDBlX2RjYnhfY29uZmlnICpyX2NmZyA9CiAJCQkJCQkmcGYtPmh3LnJlbW90ZV9kY2J4X2NvbmZpZzsKIAkJCWludCBpLCByZXQ7CisJCQl1MzIgc3dpdGNoX2lkOwogCiAJCQlid19kYXRhID0ga3phbGxvYyhzaXplb2YoCiAJCQkJICAgIHN0cnVjdCBpNDBlX2FxY19xdWVyeV9wb3J0X2V0c19jb25maWdfcmVzcCksCkBAIC0xMDYzLDggKzEwNjQsMTIgQEAKIAkJCQlnb3RvIGNvbW1hbmRfd3JpdGVfZG9uZTsKIAkJCX0KIAorCQkJdnNpID0gcGYtPnZzaVtwZi0+bGFuX3ZzaV07CisJCQlzd2l0Y2hfaWQgPQorCQkJCXZzaS0+aW5mby5zd2l0Y2hfaWQgJiBJNDBFX0FRX1ZTSV9TV19JRF9NQVNLOworCiAJCQlyZXQgPSBpNDBlX2FxX3F1ZXJ5X3BvcnRfZXRzX2NvbmZpZygmcGYtPmh3LAotCQkJCQkJCSAgICBwZi0+bWFjX3NlaWQsCisJCQkJCQkJICAgIHN3aXRjaF9pZCwKIAkJCQkJCQkgICAgYndfZGF0YSwgTlVMTCk7CiAJCQlpZiAocmV0KSB7CiAJCQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsCkBAIC0xNDI1LDg0ICsxNDMwLDYgQEAKIAkJYnVmZiA9IE5VTEw7CiAJCWtmcmVlKGRlc2MpOwogCQlkZXNjID0gTlVMTDsKLQl9IGVsc2UgaWYgKChzdHJuY21wKGNtZF9idWYsICJhZGQgZmRfZmlsdGVyIiwgMTMpID09IDApIHx8Ci0JCSAgIChzdHJuY21wKGNtZF9idWYsICJyZW0gZmRfZmlsdGVyIiwgMTMpID09IDApKSB7Ci0JCXN0cnVjdCBpNDBlX2ZkaXJfZmlsdGVyIGZkX2RhdGE7Ci0JCXUxNiBwYWNrZXRfbGVuLCBpLCBqID0gMDsKLQkJY2hhciAqYXNjX3BhY2tldDsKLQkJdTggKnJhd19wYWNrZXQ7Ci0JCWJvb2wgYWRkID0gZmFsc2U7Ci0JCWludCByZXQ7Ci0KLQkJaWYgKCEocGYtPmZsYWdzICYgSTQwRV9GTEFHX0ZEX1NCX0VOQUJMRUQpKQotCQkJZ290byBjb21tYW5kX3dyaXRlX2RvbmU7Ci0KLQkJaWYgKHN0cm5jbXAoY21kX2J1ZiwgImFkZCIsIDMpID09IDApCi0JCQlhZGQgPSB0cnVlOwotCi0JCWlmIChhZGQgJiYgKHBmLT5hdXRvX2Rpc2FibGVfZmxhZ3MgJiBJNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRCkpCi0JCQlnb3RvIGNvbW1hbmRfd3JpdGVfZG9uZTsKLQotCQlhc2NfcGFja2V0ID0ga3phbGxvYyhJNDBFX0ZESVJfTUFYX1JBV19QQUNLRVRfU0laRSwKLQkJCQkgICAgIEdGUF9LRVJORUwpOwotCQlpZiAoIWFzY19wYWNrZXQpCi0JCQlnb3RvIGNvbW1hbmRfd3JpdGVfZG9uZTsKLQotCQlyYXdfcGFja2V0ID0ga3phbGxvYyhJNDBFX0ZESVJfTUFYX1JBV19QQUNLRVRfU0laRSwKLQkJCQkgICAgIEdGUF9LRVJORUwpOwotCi0JCWlmICghcmF3X3BhY2tldCkgewotCQkJa2ZyZWUoYXNjX3BhY2tldCk7Ci0JCQlhc2NfcGFja2V0ID0gTlVMTDsKLQkJCWdvdG8gY29tbWFuZF93cml0ZV9kb25lOwotCQl9Ci0KLQkJY250ID0gc3NjYW5mKCZjbWRfYnVmWzEzXSwKLQkJCSAgICAgIiVoeCAlMmhoeCAlMmhoeCAlaHggJTJoaHggJTJoaHggJWh4ICV4ICVoZCAlNTExcyIsCi0JCQkgICAgICZmZF9kYXRhLnFfaW5kZXgsCi0JCQkgICAgICZmZF9kYXRhLmZsZXhfb2ZmLCAmZmRfZGF0YS5wY3R5cGUsCi0JCQkgICAgICZmZF9kYXRhLmRlc3RfdnNpLCAmZmRfZGF0YS5kZXN0X2N0bCwKLQkJCSAgICAgJmZkX2RhdGEuZmRfc3RhdHVzLCAmZmRfZGF0YS5jbnRfaW5kZXgsCi0JCQkgICAgICZmZF9kYXRhLmZkX2lkLCAmcGFja2V0X2xlbiwgYXNjX3BhY2tldCk7Ci0JCWlmIChjbnQgIT0gMTApIHsKLQkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LAotCQkJCSAicHJvZ3JhbSBmZF9maWx0ZXI6IGJhZCBjb21tYW5kIHN0cmluZywgY250PSVkXG4iLAotCQkJCSBjbnQpOwotCQkJa2ZyZWUoYXNjX3BhY2tldCk7Ci0JCQlhc2NfcGFja2V0ID0gTlVMTDsKLQkJCWtmcmVlKHJhd19wYWNrZXQpOwotCQkJZ290byBjb21tYW5kX3dyaXRlX2RvbmU7Ci0JCX0KLQotCQkvKiBmaXggcGFja2V0IGxlbmd0aCBpZiB1c2VyIGVudGVyZWQgMCAqLwotCQlpZiAocGFja2V0X2xlbiA9PSAwKQotCQkJcGFja2V0X2xlbiA9IEk0MEVfRkRJUl9NQVhfUkFXX1BBQ0tFVF9TSVpFOwotCi0JCS8qIG1ha2Ugc3VyZSB0byBjaGVjayB0aGUgbWF4IGFzIHdlbGwgKi8KLQkJcGFja2V0X2xlbiA9IG1pbl90KHUxNiwKLQkJCQkgICBwYWNrZXRfbGVuLCBJNDBFX0ZESVJfTUFYX1JBV19QQUNLRVRfU0laRSk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IHBhY2tldF9sZW47IGkrKykgewotCQkJY250ID0gc3NjYW5mKCZhc2NfcGFja2V0W2pdLCAiJTJoaHggIiwgJnJhd19wYWNrZXRbaV0pOwotCQkJaWYgKCFjbnQpCi0JCQkJYnJlYWs7Ci0JCQlqICs9IDM7Ci0JCX0KLQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJGRCByYXcgcGFja2V0IGR1bXBcbiIpOwotCQlwcmludF9oZXhfZHVtcChLRVJOX0lORk8sICJGRCByYXcgcGFja2V0OiAiLAotCQkJICAgICAgIERVTVBfUFJFRklYX09GRlNFVCwgMTYsIDEsCi0JCQkgICAgICAgcmF3X3BhY2tldCwgcGFja2V0X2xlbiwgdHJ1ZSk7Ci0JCXJldCA9IGk0MGVfcHJvZ3JhbV9mZGlyX2ZpbHRlcigmZmRfZGF0YSwgcmF3X3BhY2tldCwgcGYsIGFkZCk7Ci0JCWlmICghcmV0KSB7Ci0JCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIkZpbHRlciBjb21tYW5kIHNlbmQgU3RhdHVzIDogU3VjY2Vzc1xuIik7Ci0JCX0gZWxzZSB7Ci0JCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwKLQkJCQkgIkZpbHRlciBjb21tYW5kIHNlbmQgZmFpbGVkICVkXG4iLCByZXQpOwotCQl9Ci0JCWtmcmVlKHJhd19wYWNrZXQpOwotCQlyYXdfcGFja2V0ID0gTlVMTDsKLQkJa2ZyZWUoYXNjX3BhY2tldCk7Ci0JCWFzY19wYWNrZXQgPSBOVUxMOwogCX0gZWxzZSBpZiAoc3RybmNtcChjbWRfYnVmLCAiZmQgY3VycmVudCBjbnQiLCAxNCkgPT0gMCkgewogCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIkZEIGN1cnJlbnQgdG90YWwgZmlsdGVyIGNvdW50IGZvciB0aGlzIGludGVyZmFjZTogJWRcbiIsCiAJCQkgaTQwZV9nZXRfY3VycmVudF9mZF9jb3VudChwZikpOwpAQCAtMTcyNyw4ICsxNjU0LDYgQEAKIAkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICIgIGdsb2JyXG4iKTsKIAkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICIgIHNlbmQgYXFfY21kIDxmbGFncz4gPG9wY29kZT4gPGRhdGFsZW4+IDxyZXR2YWw+IDxjb29raWVfaD4gPGNvb2tpZV9sPiA8cGFyYW0wPiA8cGFyYW0xPiA8cGFyYW0yPiA8cGFyYW0zPlxuIik7CiAJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiICBzZW5kIGluZGlyZWN0IGFxX2NtZCA8ZmxhZ3M+IDxvcGNvZGU+IDxkYXRhbGVuPiA8cmV0dmFsPiA8Y29va2llX2g+IDxjb29raWVfbD4gPHBhcmFtMD4gPHBhcmFtMT4gPHBhcmFtMj4gPHBhcmFtMz4gPGJ1ZmZlcl9sZW4+XG4iKTsKLQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICIgIGFkZCBmZF9maWx0ZXIgPGRlc3QgcV9pbmRleD4gPGZsZXhfb2ZmPiA8cGN0eXBlPiA8ZGVzdF92c2k+IDxkZXN0X2N0bD4gPGZkX3N0YXR1cz4gPGNudF9pbmRleD4gPGZkX2lkPiA8cGFja2V0X2xlbj4gPHBhY2tldD5cbiIpOwotCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIiAgcmVtIGZkX2ZpbHRlciA8ZGVzdCBxX2luZGV4PiA8ZmxleF9vZmY+IDxwY3R5cGU+IDxkZXN0X3ZzaT4gPGRlc3RfY3RsPiA8ZmRfc3RhdHVzPiA8Y250X2luZGV4PiA8ZmRfaWQ+IDxwYWNrZXRfbGVuPiA8cGFja2V0PlxuIik7CiAJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiICBmZCBjdXJyZW50IGNudCIpOwogCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIiAgbGxkcCBzdGFydFxuIik7CiAJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiICBsbGRwIHN0b3BcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9ldGh0b29sLmMKaW5kZXggYzkxMmUwNC4uOTJiYzg4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfZXRodG9vbC5jCkBAIC0xNTYwLDEzICsxNTYwLDEzIEBACiAJCX0KICNlbmRpZgogCQlmb3IgKGkgPSAwOyBpIDwgdnNpLT5udW1fcXVldWVfcGFpcnM7IGkrKykgewotCQkJc25wcmludGYocCwgRVRIX0dTVFJJTkdfTEVOLCAidHgtJXUudHhfcGFja2V0cyIsIGkpOworCQkJc25wcmludGYocCwgRVRIX0dTVFJJTkdfTEVOLCAidHgtJWQudHhfcGFja2V0cyIsIGkpOwogCQkJcCArPSBFVEhfR1NUUklOR19MRU47Ci0JCQlzbnByaW50ZihwLCBFVEhfR1NUUklOR19MRU4sICJ0eC0ldS50eF9ieXRlcyIsIGkpOworCQkJc25wcmludGYocCwgRVRIX0dTVFJJTkdfTEVOLCAidHgtJWQudHhfYnl0ZXMiLCBpKTsKIAkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwotCQkJc25wcmludGYocCwgRVRIX0dTVFJJTkdfTEVOLCAicngtJXUucnhfcGFja2V0cyIsIGkpOworCQkJc25wcmludGYocCwgRVRIX0dTVFJJTkdfTEVOLCAicngtJWQucnhfcGFja2V0cyIsIGkpOwogCQkJcCArPSBFVEhfR1NUUklOR19MRU47Ci0JCQlzbnByaW50ZihwLCBFVEhfR1NUUklOR19MRU4sICJyeC0ldS5yeF9ieXRlcyIsIGkpOworCQkJc25wcmludGYocCwgRVRIX0dTVFJJTkdfTEVOLCAicngtJWQucnhfYnl0ZXMiLCBpKTsKIAkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwogCQl9CiAJCWlmICh2c2kgIT0gcGYtPnZzaVtwZi0+bGFuX3ZzaV0gfHwgcGYtPmh3LnBhcnRpdGlvbl9pZCAhPSAxKQpAQCAtMTU4MSwxNiArMTU4MSwxNiBAQAogCQkJfQogCQkJZm9yIChpID0gMDsgaSA8IEk0MEVfTUFYX1RSQUZGSUNfQ0xBU1M7IGkrKykgewogCQkJCXNucHJpbnRmKHAsIEVUSF9HU1RSSU5HX0xFTiwKLQkJCQkJICJ2ZWIudGNfJXVfdHhfcGFja2V0cyIsIGkpOworCQkJCQkgInZlYi50Y18lZF90eF9wYWNrZXRzIiwgaSk7CiAJCQkJcCArPSBFVEhfR1NUUklOR19MRU47CiAJCQkJc25wcmludGYocCwgRVRIX0dTVFJJTkdfTEVOLAotCQkJCQkgInZlYi50Y18ldV90eF9ieXRlcyIsIGkpOworCQkJCQkgInZlYi50Y18lZF90eF9ieXRlcyIsIGkpOwogCQkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwogCQkJCXNucHJpbnRmKHAsIEVUSF9HU1RSSU5HX0xFTiwKLQkJCQkJICJ2ZWIudGNfJXVfcnhfcGFja2V0cyIsIGkpOworCQkJCQkgInZlYi50Y18lZF9yeF9wYWNrZXRzIiwgaSk7CiAJCQkJcCArPSBFVEhfR1NUUklOR19MRU47CiAJCQkJc25wcmludGYocCwgRVRIX0dTVFJJTkdfTEVOLAotCQkJCQkgInZlYi50Y18ldV9yeF9ieXRlcyIsIGkpOworCQkJCQkgInZlYi50Y18lZF9yeF9ieXRlcyIsIGkpOwogCQkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwogCQkJfQogCQl9CkBAIC0xNjAxLDIzICsxNjAxLDIzIEBACiAJCX0KIAkJZm9yIChpID0gMDsgaSA8IEk0MEVfTUFYX1VTRVJfUFJJT1JJVFk7IGkrKykgewogCQkJc25wcmludGYocCwgRVRIX0dTVFJJTkdfTEVOLAotCQkJCSAicG9ydC50eF9wcmlvcml0eV8ldV94b24iLCBpKTsKKwkJCQkgInBvcnQudHhfcHJpb3JpdHlfJWRfeG9uIiwgaSk7CiAJCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKIAkJCXNucHJpbnRmKHAsIEVUSF9HU1RSSU5HX0xFTiwKLQkJCQkgInBvcnQudHhfcHJpb3JpdHlfJXVfeG9mZiIsIGkpOworCQkJCSAicG9ydC50eF9wcmlvcml0eV8lZF94b2ZmIiwgaSk7CiAJCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKIAkJfQogCQlmb3IgKGkgPSAwOyBpIDwgSTQwRV9NQVhfVVNFUl9QUklPUklUWTsgaSsrKSB7CiAJCQlzbnByaW50ZihwLCBFVEhfR1NUUklOR19MRU4sCi0JCQkJICJwb3J0LnJ4X3ByaW9yaXR5XyV1X3hvbiIsIGkpOworCQkJCSAicG9ydC5yeF9wcmlvcml0eV8lZF94b24iLCBpKTsKIAkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwogCQkJc25wcmludGYocCwgRVRIX0dTVFJJTkdfTEVOLAotCQkJCSAicG9ydC5yeF9wcmlvcml0eV8ldV94b2ZmIiwgaSk7CisJCQkJICJwb3J0LnJ4X3ByaW9yaXR5XyVkX3hvZmYiLCBpKTsKIAkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwogCQl9CiAJCWZvciAoaSA9IDA7IGkgPCBJNDBFX01BWF9VU0VSX1BSSU9SSVRZOyBpKyspIHsKIAkJCXNucHJpbnRmKHAsIEVUSF9HU1RSSU5HX0xFTiwKLQkJCQkgInBvcnQucnhfcHJpb3JpdHlfJXVfeG9uXzJfeG9mZiIsIGkpOworCQkJCSAicG9ydC5yeF9wcmlvcml0eV8lZF94b25fMl94b2ZmIiwgaSk7CiAJCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKIAkJfQogCQkvKiBCVUdfT04ocCAtIGRhdGEgIT0gSTQwRV9TVEFUU19MRU4gKiBFVEhfR1NUUklOR19MRU4pOyAqLwpAQCAtMTk3MCwxMSArMTk3MCwyMiBAQAogICogMTI1dXMgKDgwMDAgaW50ZXJydXB0cyBwZXIgc2Vjb25kKSA9PSBJVFIoNjIpCiAgKi8KIAorLyoqCisgKiBfX2k0MGVfZ2V0X2NvYWxlc2NlIC0gZ2V0IHBlci1xdWV1ZSBjb2FsZXNjZSBzZXR0aW5ncworICogQG5ldGRldjogdGhlIG5ldGRldiB0byBjaGVjaworICogQGVjOiBldGh0b29sIGNvYWxlc2NlIGRhdGEgc3RydWN0dXJlCisgKiBAcXVldWU6IHdoaWNoIHF1ZXVlIHRvIHBpY2sKKyAqCisgKiBHZXRzIHRoZSBwZXItcXVldWUgc2V0dGluZ3MgZm9yIGNvYWxlc2NlbmNlLiBTcGVjaWZpY2FsbHkgUnggYW5kIFR4IHVzZWNzCisgKiBhcmUgcGVyIHF1ZXVlLiBJZiBxdWV1ZSBpcyA8MCB0aGVuIHdlIGRlZmF1bHQgdG8gcXVldWUgMCBhcyB0aGUKKyAqIHJlcHJlc2VudGF0aXZlIHZhbHVlLgorICoqLwogc3RhdGljIGludCBfX2k0MGVfZ2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmVjLAogCQkJICAgICAgIGludCBxdWV1ZSkKIHsKIAlzdHJ1Y3QgaTQwZV9uZXRkZXZfcHJpdiAqbnAgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBpNDBlX3JpbmcgKnJ4X3JpbmcsICp0eF9yaW5nOwogCXN0cnVjdCBpNDBlX3ZzaSAqdnNpID0gbnAtPnZzaTsKIAogCWVjLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lc19pcnEgPSB2c2ktPndvcmtfbGltaXQ7CkBAIC0xOTg5LDE0ICsyMDAwLDE4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChJVFJfSVNfRFlOQU1JQyh2c2ktPnJ4X3JpbmdzW3F1ZXVlXS0+cnhfaXRyX3NldHRpbmcpKQorCXJ4X3JpbmcgPSB2c2ktPnJ4X3JpbmdzW3F1ZXVlXTsKKwl0eF9yaW5nID0gdnNpLT50eF9yaW5nc1txdWV1ZV07CisKKwlpZiAoSVRSX0lTX0RZTkFNSUMocnhfcmluZy0+cnhfaXRyX3NldHRpbmcpKQogCQllYy0+dXNlX2FkYXB0aXZlX3J4X2NvYWxlc2NlID0gMTsKIAotCWlmIChJVFJfSVNfRFlOQU1JQyh2c2ktPnR4X3JpbmdzW3F1ZXVlXS0+dHhfaXRyX3NldHRpbmcpKQorCWlmIChJVFJfSVNfRFlOQU1JQyh0eF9yaW5nLT50eF9pdHJfc2V0dGluZykpCiAJCWVjLT51c2VfYWRhcHRpdmVfdHhfY29hbGVzY2UgPSAxOwogCi0JZWMtPnJ4X2NvYWxlc2NlX3VzZWNzID0gdnNpLT5yeF9yaW5nc1txdWV1ZV0tPnJ4X2l0cl9zZXR0aW5nICYgfkk0MEVfSVRSX0RZTkFNSUM7Ci0JZWMtPnR4X2NvYWxlc2NlX3VzZWNzID0gdnNpLT50eF9yaW5nc1txdWV1ZV0tPnR4X2l0cl9zZXR0aW5nICYgfkk0MEVfSVRSX0RZTkFNSUM7CisJZWMtPnJ4X2NvYWxlc2NlX3VzZWNzID0gcnhfcmluZy0+cnhfaXRyX3NldHRpbmcgJiB+STQwRV9JVFJfRFlOQU1JQzsKKwllYy0+dHhfY29hbGVzY2VfdXNlY3MgPSB0eF9yaW5nLT50eF9pdHJfc2V0dGluZyAmIH5JNDBFX0lUUl9EWU5BTUlDOworCiAKIAkvKiB3ZSB1c2UgdGhlIF91c2Vjc19oaWdoIHRvIHN0b3JlL3NldCB0aGUgaW50ZXJydXB0IHJhdGUgbGltaXQKIAkgKiB0aGF0IHRoZSBoYXJkd2FyZSBzdXBwb3J0cywgdGhhdCBhbG1vc3QgYnV0IG5vdCBxdWl0ZQpAQCAtMjAxMCwxOCArMjAyNSw0NCBAQAogCXJldHVybiAwOwogfQogCisvKioKKyAqIGk0MGVfZ2V0X2NvYWxlc2NlIC0gZ2V0IGEgbmV0ZGV2J3MgY29hbGVzY2Ugc2V0dGluZ3MKKyAqIEBuZXRkZXY6IHRoZSBuZXRkZXYgdG8gY2hlY2sKKyAqIEBlYzogZXRodG9vbCBjb2FsZXNjZSBkYXRhIHN0cnVjdHVyZQorICoKKyAqIEdldHMgdGhlIGNvYWxlc2NlIHNldHRpbmdzIGZvciBhIHBhcnRpY3VsYXIgbmV0ZGV2LiBOb3RlIHRoYXQgaWYgdXNlciBoYXMKKyAqIG1vZGlmaWVkIHBlci1xdWV1ZSBzZXR0aW5ncywgdGhpcyBvbmx5IGd1YXJhbnRlZXMgdG8gcmVwcmVzZW50IHF1ZXVlIDAuIFNlZQorICogX19pNDBlX2dldF9jb2FsZXNjZSBmb3IgbW9yZSBkZXRhaWxzLgorICoqLwogc3RhdGljIGludCBpNDBlX2dldF9jb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCQkJICAgICBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqZWMpCiB7CiAJcmV0dXJuIF9faTQwZV9nZXRfY29hbGVzY2UobmV0ZGV2LCBlYywgLTEpOwogfQogCisvKioKKyAqIGk0MGVfZ2V0X3Blcl9xdWV1ZV9jb2FsZXNjZSAtIGdldHMgY29hbGVzY2Ugc2V0dGluZ3MgZm9yIHBhcnRpY3VsYXIgcXVldWUKKyAqIEBuZXRkZXY6IG5ldGRldiBzdHJ1Y3R1cmUKKyAqIEBlYzogZXRodG9vbCdzIGNvYWxlc2NlIHNldHRpbmdzCisgKiBAcXVldWU6IHRoZSBwYXJ0aWN1bGFyIHF1ZXVlIHRvIHJlYWQKKyAqCisgKiBXaWxsIHJlYWQgYSBzcGVjaWZpYyBxdWV1ZSdzIGNvYWxlc2NlIHNldHRpbmdzCisgKiovCiBzdGF0aWMgaW50IGk0MGVfZ2V0X3Blcl9xdWV1ZV9jb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgcXVldWUsCiAJCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICplYykKIHsKIAlyZXR1cm4gX19pNDBlX2dldF9jb2FsZXNjZShuZXRkZXYsIGVjLCBxdWV1ZSk7CiB9CiAKKy8qKgorICogaTQwZV9zZXRfaXRyX3Blcl9xdWV1ZSAtIHNldCBJVFIgdmFsdWVzIGZvciBzcGVjaWZpYyBxdWV1ZQorICogQHZzaTogdGhlIFZTSSB0byBzZXQgdmFsdWVzIGZvcgorICogQGVjOiBjb2FsZXNjZSBzZXR0aW5ncyBmcm9tIGV0aHRvb2wKKyAqIEBxdWV1ZTogdGhlIHF1ZXVlIHRvIG1vZGlmeQorICoKKyAqIENoYW5nZSB0aGUgSVRSIHNldHRpbmdzIGZvciBhIHNwZWNpZmljIHF1ZXVlLgorICoqLworCiBzdGF0aWMgdm9pZCBpNDBlX3NldF9pdHJfcGVyX3F1ZXVlKHN0cnVjdCBpNDBlX3ZzaSAqdnNpLAogCQkJCSAgIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICplYywKIAkJCQkgICBpbnQgcXVldWUpCkBAIC0yMDYwLDYgKzIxMDEsMTQgQEAKIAlpNDBlX2ZsdXNoKGh3KTsKIH0KIAorLyoqCisgKiBfX2k0MGVfc2V0X2NvYWxlc2NlIC0gc2V0IGNvYWxlc2NlIHNldHRpbmdzIGZvciBwYXJ0aWN1bGFyIHF1ZXVlCisgKiBAbmV0ZGV2OiB0aGUgbmV0ZGV2IHRvIGNoYW5nZQorICogQGVjOiBldGh0b29sIGNvYWxlc2NlIHNldHRpbmdzCisgKiBAcXVldWU6IHRoZSBxdWV1ZSB0byBjaGFuZ2UKKyAqCisgKiBTZXRzIHRoZSBjb2FsZXNjZSBzZXR0aW5ncyBmb3IgYSBwYXJ0aWN1bGFyIHF1ZXVlLgorICoqLwogc3RhdGljIGludCBfX2k0MGVfc2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmVjLAogCQkJICAgICAgIGludCBxdWV1ZSkKQEAgLTIxMjAsMTIgKzIxNjksMjcgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiBpNDBlX3NldF9jb2FsZXNjZSAtIHNldCBjb2FsZXNjZSBzZXR0aW5ncyBmb3IgZXZlcnkgcXVldWUgb24gdGhlIG5ldGRldgorICogQG5ldGRldjogdGhlIG5ldGRldiB0byBjaGFuZ2UKKyAqIEBlYzogZXRodG9vbCBjb2FsZXNjZSBzZXR0aW5ncworICoKKyAqIFRoaXMgd2lsbCBzZXQgZWFjaCBxdWV1ZSB0byB0aGUgc2FtZSBjb2FsZXNjZSBzZXR0aW5ncy4KKyAqKi8KIHN0YXRpYyBpbnQgaTQwZV9zZXRfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKIAkJCSAgICAgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmVjKQogewogCXJldHVybiBfX2k0MGVfc2V0X2NvYWxlc2NlKG5ldGRldiwgZWMsIC0xKTsKIH0KIAorLyoqCisgKiBpNDBlX3NldF9wZXJfcXVldWVfY29hbGVzY2UgLSBzZXQgc3BlY2lmaWMgcXVldWUncyBjb2FsZXNjZSBzZXR0aW5ncworICogQG5ldGRldjogdGhlIG5ldGRldiB0byBjaGFuZ2UKKyAqIEBlYzogZXRodG9vbCdzIGNvYWxlc2NlIHNldHRpbmdzCisgKiBAcXVldWU6IHRoZSBxdWV1ZSB0byBjaGFuZ2UKKyAqCisgKiBTZXRzIHRoZSBzcGVjaWZpZWQgcXVldWUncyBjb2FsZXNjZSBzZXR0aW5ncy4KKyAqKi8KIHN0YXRpYyBpbnQgaTQwZV9zZXRfcGVyX3F1ZXVlX2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBxdWV1ZSwKIAkJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmVjKQogewpAQCAtMjE0MSw0MSArMjIwNSw3MiBAQAogICoqLwogc3RhdGljIGludCBpNDBlX2dldF9yc3NfaGFzaF9vcHRzKHN0cnVjdCBpNDBlX3BmICpwZiwgc3RydWN0IGV0aHRvb2xfcnhuZmMgKmNtZCkKIHsKKwlzdHJ1Y3QgaTQwZV9odyAqaHcgPSAmcGYtPmh3OworCXU4IGZsb3dfcGN0eXBlID0gMDsKKwl1NjQgaV9zZXQgPSAwOworCiAJY21kLT5kYXRhID0gMDsKIAotCWlmIChwZi0+dnNpW3BmLT5sYW5fdnNpXS0+cnhuZmMuZGF0YSAhPSAwKSB7Ci0JCWNtZC0+ZGF0YSA9IHBmLT52c2lbcGYtPmxhbl92c2ldLT5yeG5mYy5kYXRhOwotCQljbWQtPmZsb3dfdHlwZSA9IHBmLT52c2lbcGYtPmxhbl92c2ldLT5yeG5mYy5mbG93X3R5cGU7Ci0JCXJldHVybiAwOwotCX0KLQkvKiBSZXBvcnQgZGVmYXVsdCBvcHRpb25zIGZvciBSU1Mgb24gaTQwZSAqLwogCXN3aXRjaCAoY21kLT5mbG93X3R5cGUpIHsKIAljYXNlIFRDUF9WNF9GTE9XOgorCQlmbG93X3BjdHlwZSA9IEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX0lQVjRfVENQOworCQlicmVhazsKIAljYXNlIFVEUF9WNF9GTE9XOgotCQljbWQtPmRhdGEgfD0gUlhIX0w0X0JfMF8xIHwgUlhIX0w0X0JfMl8zOwotCS8qIGZhbGwgdGhyb3VnaCB0byBhZGQgSVAgZmllbGRzICovCisJCWZsb3dfcGN0eXBlID0gSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNF9VRFA7CisJCWJyZWFrOworCWNhc2UgVENQX1Y2X0ZMT1c6CisJCWZsb3dfcGN0eXBlID0gSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNl9UQ1A7CisJCWJyZWFrOworCWNhc2UgVURQX1Y2X0ZMT1c6CisJCWZsb3dfcGN0eXBlID0gSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNl9VRFA7CisJCWJyZWFrOwogCWNhc2UgU0NUUF9WNF9GTE9XOgogCWNhc2UgQUhfRVNQX1Y0X0ZMT1c6CiAJY2FzZSBBSF9WNF9GTE9XOgogCWNhc2UgRVNQX1Y0X0ZMT1c6CiAJY2FzZSBJUFY0X0ZMT1c6Ci0JCWNtZC0+ZGF0YSB8PSBSWEhfSVBfU1JDIHwgUlhIX0lQX0RTVDsKLQkJYnJlYWs7Ci0JY2FzZSBUQ1BfVjZfRkxPVzoKLQljYXNlIFVEUF9WNl9GTE9XOgotCQljbWQtPmRhdGEgfD0gUlhIX0w0X0JfMF8xIHwgUlhIX0w0X0JfMl8zOwotCS8qIGZhbGwgdGhyb3VnaCB0byBhZGQgSVAgZmllbGRzICovCiAJY2FzZSBTQ1RQX1Y2X0ZMT1c6CiAJY2FzZSBBSF9FU1BfVjZfRkxPVzoKIAljYXNlIEFIX1Y2X0ZMT1c6CiAJY2FzZSBFU1BfVjZfRkxPVzoKIAljYXNlIElQVjZfRkxPVzoKKwkJLyogRGVmYXVsdCBpcyBzcmMvZGVzdCBmb3IgSVAsIG5vIG1hdHRlciB0aGUgTDQgaGFzaGluZyAqLwogCQljbWQtPmRhdGEgfD0gUlhIX0lQX1NSQyB8IFJYSF9JUF9EU1Q7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCS8qIFJlYWQgZmxvdyBiYXNlZCBoYXNoIGlucHV0IHNldCByZWdpc3RlciAqLworCWlmIChmbG93X3BjdHlwZSkgeworCQlpX3NldCA9ICh1NjQpaTQwZV9yZWFkX3J4X2N0bChodywgSTQwRV9HTFFGX0hBU0hfSU5TRVQoMCwKKwkJCQkJICAgICAgZmxvd19wY3R5cGUpKSB8CisJCQkoKHU2NClpNDBlX3JlYWRfcnhfY3RsKGh3LCBJNDBFX0dMUUZfSEFTSF9JTlNFVCgxLAorCQkJCQkgICAgICAgZmxvd19wY3R5cGUpKSA8PCAzMik7CisJfQorCisJLyogUHJvY2VzcyBiaXRzIG9mIGhhc2ggaW5wdXQgc2V0ICovCisJaWYgKGlfc2V0KSB7CisJCWlmIChpX3NldCAmIEk0MEVfTDRfU1JDX01BU0spCisJCQljbWQtPmRhdGEgfD0gUlhIX0w0X0JfMF8xOworCQlpZiAoaV9zZXQgJiBJNDBFX0w0X0RTVF9NQVNLKQorCQkJY21kLT5kYXRhIHw9IFJYSF9MNF9CXzJfMzsKKworCQlpZiAoY21kLT5mbG93X3R5cGUgPT0gVENQX1Y0X0ZMT1cgfHwKKwkJICAgIGNtZC0+Zmxvd190eXBlID09IFVEUF9WNF9GTE9XKSB7CisJCQlpZiAoaV9zZXQgJiBJNDBFX0wzX1NSQ19NQVNLKQorCQkJCWNtZC0+ZGF0YSB8PSBSWEhfSVBfU1JDOworCQkJaWYgKGlfc2V0ICYgSTQwRV9MM19EU1RfTUFTSykKKwkJCQljbWQtPmRhdGEgfD0gUlhIX0lQX0RTVDsKKwkJfSBlbHNlIGlmIChjbWQtPmZsb3dfdHlwZSA9PSBUQ1BfVjZfRkxPVyB8fAorCQkJICBjbWQtPmZsb3dfdHlwZSA9PSBVRFBfVjZfRkxPVykgeworCQkJaWYgKGlfc2V0ICYgSTQwRV9MM19WNl9TUkNfTUFTSykKKwkJCQljbWQtPmRhdGEgfD0gUlhIX0lQX1NSQzsKKwkJCWlmIChpX3NldCAmIEk0MEVfTDNfVjZfRFNUX01BU0spCisJCQkJY21kLT5kYXRhIHw9IFJYSF9JUF9EU1Q7CisJCX0KKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjMxOCw2ICsyNDEzLDUxIEBACiB9CiAKIC8qKgorICogaTQwZV9nZXRfcnNzX2hhc2hfYml0cyAtIFJlYWQgUlNTIEhhc2ggYml0cyBmcm9tIHJlZ2lzdGVyCisgKiBAbmZjOiBwb2ludGVyIHRvIHVzZXIgcmVxdWVzdAorICogQGlfc2V0YyBiaXRzIGN1cnJlbnRseSBzZXQKKyAqCisgKiBSZXR1cm5zIHZhbHVlIG9mIGJpdHMgdG8gYmUgc2V0IHBlciB1c2VyIHJlcXVlc3QKKyAqKi8KK3N0YXRpYyB1NjQgaTQwZV9nZXRfcnNzX2hhc2hfYml0cyhzdHJ1Y3QgZXRodG9vbF9yeG5mYyAqbmZjLCB1NjQgaV9zZXRjKQoreworCXU2NCBpX3NldCA9IGlfc2V0YzsKKwl1NjQgc3JjX2wzID0gMCwgZHN0X2wzID0gMDsKKworCWlmIChuZmMtPmRhdGEgJiBSWEhfTDRfQl8wXzEpCisJCWlfc2V0IHw9IEk0MEVfTDRfU1JDX01BU0s7CisJZWxzZQorCQlpX3NldCAmPSB+STQwRV9MNF9TUkNfTUFTSzsKKwlpZiAobmZjLT5kYXRhICYgUlhIX0w0X0JfMl8zKQorCQlpX3NldCB8PSBJNDBFX0w0X0RTVF9NQVNLOworCWVsc2UKKwkJaV9zZXQgJj0gfkk0MEVfTDRfRFNUX01BU0s7CisKKwlpZiAobmZjLT5mbG93X3R5cGUgPT0gVENQX1Y2X0ZMT1cgfHwgbmZjLT5mbG93X3R5cGUgPT0gVURQX1Y2X0ZMT1cpIHsKKwkJc3JjX2wzID0gSTQwRV9MM19WNl9TUkNfTUFTSzsKKwkJZHN0X2wzID0gSTQwRV9MM19WNl9EU1RfTUFTSzsKKwl9IGVsc2UgaWYgKG5mYy0+Zmxvd190eXBlID09IFRDUF9WNF9GTE9XIHx8CisJCSAgbmZjLT5mbG93X3R5cGUgPT0gVURQX1Y0X0ZMT1cpIHsKKwkJc3JjX2wzID0gSTQwRV9MM19TUkNfTUFTSzsKKwkJZHN0X2wzID0gSTQwRV9MM19EU1RfTUFTSzsKKwl9IGVsc2UgeworCQkvKiBBbnkgb3RoZXIgZmxvdyB0eXBlIGFyZSBub3Qgc3VwcG9ydGVkIGhlcmUgKi8KKwkJcmV0dXJuIGlfc2V0OworCX0KKworCWlmIChuZmMtPmRhdGEgJiBSWEhfSVBfU1JDKQorCQlpX3NldCB8PSBzcmNfbDM7CisJZWxzZQorCQlpX3NldCAmPSB+c3JjX2wzOworCWlmIChuZmMtPmRhdGEgJiBSWEhfSVBfRFNUKQorCQlpX3NldCB8PSBkc3RfbDM7CisJZWxzZQorCQlpX3NldCAmPSB+ZHN0X2wzOworCisJcmV0dXJuIGlfc2V0OworfQorCisvKioKICAqIGk0MGVfc2V0X3Jzc19oYXNoX29wdCAtIEVuYWJsZS9EaXNhYmxlIGZsb3cgdHlwZXMgZm9yIFJTUyBoYXNoCiAgKiBAcGY6IHBvaW50ZXIgdG8gdGhlIHBoeXNpY2FsIGZ1bmN0aW9uIHN0cnVjdAogICogQGNtZDogZXRodG9vbCByeG5mYyBjb21tYW5kCkBAIC0yMzI5LDYgKzI0NjksOCBAQAogCXN0cnVjdCBpNDBlX2h3ICpodyA9ICZwZi0+aHc7CiAJdTY0IGhlbmEgPSAodTY0KWk0MGVfcmVhZF9yeF9jdGwoaHcsIEk0MEVfUEZRRl9IRU5BKDApKSB8CiAJCSAgICgodTY0KWk0MGVfcmVhZF9yeF9jdGwoaHcsIEk0MEVfUEZRRl9IRU5BKDEpKSA8PCAzMik7CisJdTggZmxvd19wY3R5cGUgPSAwOworCXU2NCBpX3NldCwgaV9zZXRjOwogCiAJLyogUlNTIGRvZXMgbm90IHN1cHBvcnQgYW55dGhpbmcgb3RoZXIgdGhhbiBoYXNoaW5nCiAJICogdG8gcXVldWVzIG9uIHNyYyBhbmQgZHN0IElQcyBhbmQgcG9ydHMKQEAgLTIzMzcsNzUgKzI0NzksMzkgQEAKIAkJCSAgUlhIX0w0X0JfMF8xIHwgUlhIX0w0X0JfMl8zKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkvKiBXZSBuZWVkIGF0IGxlYXN0IHRoZSBJUCBTUkMgYW5kIERFU1QgZmllbGRzIGZvciBoYXNoaW5nICovCi0JaWYgKCEobmZjLT5kYXRhICYgUlhIX0lQX1NSQykgfHwKLQkgICAgIShuZmMtPmRhdGEgJiBSWEhfSVBfRFNUKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAlzd2l0Y2ggKG5mYy0+Zmxvd190eXBlKSB7CiAJY2FzZSBUQ1BfVjRfRkxPVzoKLQkJc3dpdGNoIChuZmMtPmRhdGEgJiAoUlhIX0w0X0JfMF8xIHwgUlhIX0w0X0JfMl8zKSkgewotCQljYXNlIDA6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJY2FzZSAoUlhIX0w0X0JfMF8xIHwgUlhIX0w0X0JfMl8zKToKLQkJCWlmIChwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfTVVMVElQTEVfVENQX1VEUF9SU1NfUENUWVBFKQotCQkJCWhlbmEgfD0KLQkJCSAgIEJJVF9VTEwoSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNF9UQ1BfU1lOX05PX0FDSyk7Ci0KLQkJCWhlbmEgfD0gQklUX1VMTChJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY0X1RDUCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9CisJCWZsb3dfcGN0eXBlID0gSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNF9UQ1A7CisJCWlmIChwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfTVVMVElQTEVfVENQX1VEUF9SU1NfUENUWVBFKQorCQkJaGVuYSB8PQorCQkJICBCSVRfVUxMKEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX0lQVjRfVENQX1NZTl9OT19BQ0spOwogCQlicmVhazsKIAljYXNlIFRDUF9WNl9GTE9XOgotCQlzd2l0Y2ggKG5mYy0+ZGF0YSAmIChSWEhfTDRfQl8wXzEgfCBSWEhfTDRfQl8yXzMpKSB7Ci0JCWNhc2UgMDoKLQkJCXJldHVybiAtRUlOVkFMOwotCQljYXNlIChSWEhfTDRfQl8wXzEgfCBSWEhfTDRfQl8yXzMpOgotCQkJaWYgKHBmLT5mbGFncyAmIEk0MEVfRkxBR19NVUxUSVBMRV9UQ1BfVURQX1JTU19QQ1RZUEUpCi0JCQkJaGVuYSB8PQotCQkJICAgQklUX1VMTChJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY2X1RDUF9TWU5fTk9fQUNLKTsKLQotCQkJaGVuYSB8PSBCSVRfVUxMKEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX0lQVjZfVENQKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KKwkJZmxvd19wY3R5cGUgPSBJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY2X1RDUDsKKwkJaWYgKHBmLT5mbGFncyAmIEk0MEVfRkxBR19NVUxUSVBMRV9UQ1BfVURQX1JTU19QQ1RZUEUpCisJCQloZW5hIHw9CisJCQkgIEJJVF9VTEwoSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNF9UQ1BfU1lOX05PX0FDSyk7CisJCWlmIChwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfTVVMVElQTEVfVENQX1VEUF9SU1NfUENUWVBFKQorCQkJaGVuYSB8PQorCQkJICBCSVRfVUxMKEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX0lQVjZfVENQX1NZTl9OT19BQ0spOwogCQlicmVhazsKIAljYXNlIFVEUF9WNF9GTE9XOgotCQlzd2l0Y2ggKG5mYy0+ZGF0YSAmIChSWEhfTDRfQl8wXzEgfCBSWEhfTDRfQl8yXzMpKSB7Ci0JCWNhc2UgMDoKLQkJCXJldHVybiAtRUlOVkFMOwotCQljYXNlIChSWEhfTDRfQl8wXzEgfCBSWEhfTDRfQl8yXzMpOgotCQkJaWYgKHBmLT5mbGFncyAmIEk0MEVfRkxBR19NVUxUSVBMRV9UQ1BfVURQX1JTU19QQ1RZUEUpCi0JCQkJaGVuYSB8PQotCQkJICAgIEJJVF9VTEwoSTQwRV9GSUxURVJfUENUWVBFX05PTkZfVU5JQ0FTVF9JUFY0X1VEUCkgfAotCQkJICAgIEJJVF9VTEwoSTQwRV9GSUxURVJfUENUWVBFX05PTkZfTVVMVElDQVNUX0lQVjRfVURQKTsKKwkJZmxvd19wY3R5cGUgPSBJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9JUFY0X1VEUDsKKwkJaWYgKHBmLT5mbGFncyAmIEk0MEVfRkxBR19NVUxUSVBMRV9UQ1BfVURQX1JTU19QQ1RZUEUpCisJCQloZW5hIHw9CisJCQkgIEJJVF9VTEwoSTQwRV9GSUxURVJfUENUWVBFX05PTkZfVU5JQ0FTVF9JUFY0X1VEUCkgfAorCQkJICBCSVRfVUxMKEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX01VTFRJQ0FTVF9JUFY0X1VEUCk7CiAKLQkJCWhlbmEgfD0gKEJJVF9VTEwoSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNF9VRFApIHwKLQkJCQkgQklUX1VMTChJNDBFX0ZJTFRFUl9QQ1RZUEVfRlJBR19JUFY0KSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9CisJCWhlbmEgfD0gQklUX1VMTChJNDBFX0ZJTFRFUl9QQ1RZUEVfRlJBR19JUFY0KTsKIAkJYnJlYWs7CiAJY2FzZSBVRFBfVjZfRkxPVzoKLQkJc3dpdGNoIChuZmMtPmRhdGEgJiAoUlhIX0w0X0JfMF8xIHwgUlhIX0w0X0JfMl8zKSkgewotCQljYXNlIDA6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJY2FzZSAoUlhIX0w0X0JfMF8xIHwgUlhIX0w0X0JfMl8zKToKLQkJCWlmIChwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfTVVMVElQTEVfVENQX1VEUF9SU1NfUENUWVBFKQotCQkJCWhlbmEgfD0KLQkJCSAgICBCSVRfVUxMKEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX1VOSUNBU1RfSVBWNl9VRFApIHwKLQkJCSAgICBCSVRfVUxMKEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX01VTFRJQ0FTVF9JUFY2X1VEUCk7CisJCWZsb3dfcGN0eXBlID0gSTQwRV9GSUxURVJfUENUWVBFX05PTkZfSVBWNl9VRFA7CisJCWlmIChwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfTVVMVElQTEVfVENQX1VEUF9SU1NfUENUWVBFKQorCQkJaGVuYSB8PQorCQkJICBCSVRfVUxMKEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX1VOSUNBU1RfSVBWNl9VRFApIHwKKwkJCSAgQklUX1VMTChJNDBFX0ZJTFRFUl9QQ1RZUEVfTk9ORl9NVUxUSUNBU1RfSVBWNl9VRFApOwogCi0JCQloZW5hIHw9IChCSVRfVUxMKEk0MEVfRklMVEVSX1BDVFlQRV9OT05GX0lQVjZfVURQKSB8Ci0JCQkJIEJJVF9VTEwoSTQwRV9GSUxURVJfUENUWVBFX0ZSQUdfSVBWNikpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQorCQloZW5hIHw9IEJJVF9VTEwoSTQwRV9GSUxURVJfUENUWVBFX0ZSQUdfSVBWNik7CiAJCWJyZWFrOwogCWNhc2UgQUhfRVNQX1Y0X0ZMT1c6CiAJY2FzZSBBSF9WNF9GTE9XOgpAQCAtMjQzNywxMyArMjU0MywyMyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAoZmxvd19wY3R5cGUpIHsKKwkJaV9zZXRjID0gKHU2NClpNDBlX3JlYWRfcnhfY3RsKGh3LCBJNDBFX0dMUUZfSEFTSF9JTlNFVCgwLAorCQkJCQkgICAgICAgZmxvd19wY3R5cGUpKSB8CisJCQkoKHU2NClpNDBlX3JlYWRfcnhfY3RsKGh3LCBJNDBFX0dMUUZfSEFTSF9JTlNFVCgxLAorCQkJCQkgICAgICAgZmxvd19wY3R5cGUpKSA8PCAzMik7CisJCWlfc2V0ID0gaTQwZV9nZXRfcnNzX2hhc2hfYml0cyhuZmMsIGlfc2V0Yyk7CisJCWk0MGVfd3JpdGVfcnhfY3RsKGh3LCBJNDBFX0dMUUZfSEFTSF9JTlNFVCgwLCBmbG93X3BjdHlwZSksCisJCQkJICAodTMyKWlfc2V0KTsKKwkJaTQwZV93cml0ZV9yeF9jdGwoaHcsIEk0MEVfR0xRRl9IQVNIX0lOU0VUKDEsIGZsb3dfcGN0eXBlKSwKKwkJCQkgICh1MzIpKGlfc2V0ID4+IDMyKSk7CisJCWhlbmEgfD0gQklUX1VMTChmbG93X3BjdHlwZSk7CisJfQorCiAJaTQwZV93cml0ZV9yeF9jdGwoaHcsIEk0MEVfUEZRRl9IRU5BKDApLCAodTMyKWhlbmEpOwogCWk0MGVfd3JpdGVfcnhfY3RsKGh3LCBJNDBFX1BGUUZfSEVOQSgxKSwgKHUzMikoaGVuYSA+PiAzMikpOwogCWk0MGVfZmx1c2goaHcpOwogCi0JLyogU2F2ZSBzZXR0aW5nIGZvciBmdXR1cmUgb3V0cHV0L3VwZGF0ZSAqLwotCXBmLT52c2lbcGYtPmxhbl92c2ldLT5yeG5mYyA9ICpuZmM7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMjc0NCwxMSArMjg2MCwxNSBAQAogc3RhdGljIGludCBpNDBlX3NldF9jaGFubmVscyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICAgICAgc3RydWN0IGV0aHRvb2xfY2hhbm5lbHMgKmNoKQogeworCWNvbnN0IHU4IGRyb3AgPSBJNDBFX0ZJTFRFUl9QUk9HUkFNX0RFU0NfREVTVF9EUk9QX1BBQ0tFVDsKIAlzdHJ1Y3QgaTQwZV9uZXRkZXZfcHJpdiAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuc2lnbmVkIGludCBjb3VudCA9IGNoLT5jb21iaW5lZF9jb3VudDsKIAlzdHJ1Y3QgaTQwZV92c2kgKnZzaSA9IG5wLT52c2k7CiAJc3RydWN0IGk0MGVfcGYgKnBmID0gdnNpLT5iYWNrOworCXN0cnVjdCBpNDBlX2ZkaXJfZmlsdGVyICpydWxlOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlMjsKIAlpbnQgbmV3X2NvdW50OworCWludCBlcnIgPSAwOwogCiAJLyogV2UgZG8gbm90IHN1cHBvcnQgc2V0dGluZyBjaGFubmVscyBmb3IgYW55IG90aGVyIFZTSSBhdCBwcmVzZW50ICovCiAJaWYgKHZzaS0+dHlwZSAhPSBJNDBFX1ZTSV9NQUlOKQpAQCAtMjc2Niw2ICsyODg2LDI2IEBACiAJaWYgKGNvdW50ID4gaTQwZV9tYXhfY2hhbm5lbHModnNpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwkvKiB2ZXJpZnkgdGhhdCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGRvZXMgbm90IGludmFsaWRhdGUgYW55IGN1cnJlbnQKKwkgKiBmbG93IGRpcmVjdG9yIHJ1bGVzCisJICovCisJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShydWxlLCBub2RlMiwKKwkJCQkgICZwZi0+ZmRpcl9maWx0ZXJfbGlzdCwgZmRpcl9ub2RlKSB7CisJCWlmIChydWxlLT5kZXN0X2N0bCAhPSBkcm9wICYmIGNvdW50IDw9IHJ1bGUtPnFfaW5kZXgpIHsKKwkJCWRldl93YXJuKCZwZi0+cGRldi0+ZGV2LAorCQkJCSAiRXhpc3RpbmcgdXNlciBkZWZpbmVkIGZpbHRlciAlZCBhc3NpZ25zIGZsb3cgdG8gcXVldWUgJWRcbiIsCisJCQkJIHJ1bGUtPmZkX2lkLCBydWxlLT5xX2luZGV4KTsKKwkJCWVyciA9IC1FSU5WQUw7CisJCX0KKwl9CisKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBmLT5wZGV2LT5kZXYsCisJCQkiRXhpc3RpbmcgZmlsdGVyIHJ1bGVzIG11c3QgYmUgZGVsZXRlZCB0byByZWR1Y2UgY29tYmluZWQgY2hhbm5lbCBjb3VudCB0byAlZFxuIiwKKwkJCWNvdW50KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKIAkvKiB1cGRhdGUgZmVhdHVyZSBsaW1pdHMgZnJvbSBsYXJnZXN0IHRvIHNtYWxsZXN0IHN1cHBvcnRlZCB2YWx1ZXMgKi8KIAkvKiBUT0RPOiBGbG93IGRpcmVjdG9yIGxpbWl0LCBEQ0IgZXRjICovCiAKQEAgLTI4NDYsMTUgKzI5ODYsMTMgQEAKIHsKIAlzdHJ1Y3QgaTQwZV9uZXRkZXZfcHJpdiAqbnAgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBpNDBlX3ZzaSAqdnNpID0gbnAtPnZzaTsKKwlzdHJ1Y3QgaTQwZV9wZiAqcGYgPSB2c2ktPmJhY2s7CiAJdTggKnNlZWQgPSBOVUxMOwogCXUxNiBpOwogCiAJaWYgKGhmdW5jICE9IEVUSF9SU1NfSEFTSF9OT19DSEFOR0UgJiYgaGZ1bmMgIT0gRVRIX1JTU19IQVNIX1RPUCkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JaWYgKCFpbmRpcikKLQkJcmV0dXJuIDA7Ci0KIAlpZiAoa2V5KSB7CiAJCWlmICghdnNpLT5yc3NfaGtleV91c2VyKSB7CiAJCQl2c2ktPnJzc19oa2V5X3VzZXIgPSBremFsbG9jKEk0MEVfSEtFWV9BUlJBWV9TSVpFLApAQCAtMjg3Miw4ICszMDEwLDEyIEBACiAJfQogCiAJLyogRWFjaCAzMiBiaXRzIHBvaW50ZWQgYnkgJ2luZGlyJyBpcyBzdG9yZWQgd2l0aCBhIGx1dCBlbnRyeSAqLwotCWZvciAoaSA9IDA7IGkgPCBJNDBFX0hMVVRfQVJSQVlfU0laRTsgaSsrKQotCQl2c2ktPnJzc19sdXRfdXNlcltpXSA9ICh1OCkoaW5kaXJbaV0pOworCWlmIChpbmRpcikKKwkJZm9yIChpID0gMDsgaSA8IEk0MEVfSExVVF9BUlJBWV9TSVpFOyBpKyspCisJCQl2c2ktPnJzc19sdXRfdXNlcltpXSA9ICh1OCkoaW5kaXJbaV0pOworCWVsc2UKKwkJaTQwZV9maWxsX3Jzc19sdXQocGYsIHZzaS0+cnNzX2x1dF91c2VyLCBJNDBFX0hMVVRfQVJSQVlfU0laRSwKKwkJCQkgIHZzaS0+cnNzX3NpemUpOwogCiAJcmV0dXJuIGk0MGVfY29uZmlnX3Jzcyh2c2ksIHNlZWQsIHZzaS0+cnNzX2x1dF91c2VyLAogCQkJICAgICAgIEk0MEVfSExVVF9BUlJBWV9TSVpFKTsKQEAgLTI5NDMsNiArMzA4NSw5IEBACiAJfSBlbHNlIHsKIAkJcGYtPmZsYWdzICY9IH5JNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQ7CiAJCXBmLT5hdXRvX2Rpc2FibGVfZmxhZ3MgfD0gSTQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEOworCisJCS8qIGZsdXNoIGN1cnJlbnQgQVRSIHNldHRpbmdzICovCisJCXNldF9iaXQoX19JNDBFX0ZEX0ZMVVNIX1JFUVVFU1RFRCwgJnBmLT5zdGF0ZSk7CiAJfQogCiAJaWYgKChmbGFncyAmIEk0MEVfUFJJVl9GTEFHU19WRUJfU1RBVFMpICYmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX21haW4uYwppbmRleCA4MWM5OWUxLi5hYzFmYWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9tYWluLmMKQEAgLTQxLDcgKzQxLDcgQEAKIAogI2RlZmluZSBEUlZfVkVSU0lPTl9NQUpPUiAxCiAjZGVmaW5lIERSVl9WRVJTSU9OX01JTk9SIDYKLSNkZWZpbmUgRFJWX1ZFUlNJT05fQlVJTEQgMTEKKyNkZWZpbmUgRFJWX1ZFUlNJT05fQlVJTEQgMTYKICNkZWZpbmUgRFJWX1ZFUlNJT04gX19zdHJpbmdpZnkoRFJWX1ZFUlNJT05fTUFKT1IpICIuIiBcCiAJICAgICBfX3N0cmluZ2lmeShEUlZfVkVSU0lPTl9NSU5PUikgIi4iIFwKIAkgICAgIF9fc3RyaW5naWZ5KERSVl9WRVJTSU9OX0JVSUxEKSAgICBEUlZfS0VSTgpAQCAtNTcsOCArNTcsNiBAQAogc3RhdGljIGludCBpNDBlX3NldHVwX21pc2NfdmVjdG9yKHN0cnVjdCBpNDBlX3BmICpwZik7CiBzdGF0aWMgdm9pZCBpNDBlX2RldGVybWluZV9xdWV1ZV91c2FnZShzdHJ1Y3QgaTQwZV9wZiAqcGYpOwogc3RhdGljIGludCBpNDBlX3NldHVwX3BmX2ZpbHRlcl9jb250cm9sKHN0cnVjdCBpNDBlX3BmICpwZik7Ci1zdGF0aWMgdm9pZCBpNDBlX2ZpbGxfcnNzX2x1dChzdHJ1Y3QgaTQwZV9wZiAqcGYsIHU4ICpsdXQsCi0JCQkgICAgICB1MTYgcnNzX3RhYmxlX3NpemUsIHUxNiByc3Nfc2l6ZSk7CiBzdGF0aWMgdm9pZCBpNDBlX2ZkaXJfc2Jfc2V0dXAoc3RydWN0IGk0MGVfcGYgKnBmKTsKIHN0YXRpYyBpbnQgaTQwZV92ZWJfZ2V0X2J3X2luZm8oc3RydWN0IGk0MGVfdmViICp2ZWIpOwogCkBAIC01MjcsNiArNTI1LDcgQEAKIAkJCXBmLT52ZWJbaV0tPnN0YXRfb2Zmc2V0c19sb2FkZWQgPSBmYWxzZTsKIAkJfQogCX0KKwlwZi0+aHdfY3N1bV9yeF9lcnJvciA9IDA7CiB9CiAKIC8qKgpAQCAtMTMxNiw3ICsxMzE1LDcgQEAKIAllbGVtZW50LnZsYW5fdGFnID0gMDsKIAkvKiAuLi5hbmQgc29tZSBmaXJtd2FyZSBkb2VzIGl0IHRoaXMgd2F5LiAqLwogCWVsZW1lbnQuZmxhZ3MgPSBJNDBFX0FRQ19NQUNWTEFOX0RFTF9QRVJGRUNUX01BVENIIHwKLQkJCUk0MEVfQVFDX01BQ1ZMQU5fQUREX0lHTk9SRV9WTEFOOworCQkJSTQwRV9BUUNfTUFDVkxBTl9ERUxfSUdOT1JFX1ZMQU47CiAJaTQwZV9hcV9yZW1vdmVfbWFjdmxhbigmcGYtPmh3LCB2c2ktPnNlaWQsICZlbGVtZW50LCAxLCBOVUxMKTsKIH0KIApAQCAtMTkwOSw3ICsxOTA4LDcgQEAKIAkJCWV0aGVyX2FkZHJfY29weShkZWxfbGlzdFtudW1fZGVsXS5tYWNfYWRkciwgZi0+bWFjYWRkcik7CiAJCQlpZiAoZi0+dmxhbiA9PSBJNDBFX1ZMQU5fQU5ZKSB7CiAJCQkJZGVsX2xpc3RbbnVtX2RlbF0udmxhbl90YWcgPSAwOwotCQkJCWNtZF9mbGFncyB8PSBJNDBFX0FRQ19NQUNWTEFOX0FERF9JR05PUkVfVkxBTjsKKwkJCQljbWRfZmxhZ3MgfD0gSTQwRV9BUUNfTUFDVkxBTl9ERUxfSUdOT1JFX1ZMQU47CiAJCQl9IGVsc2UgewogCQkJCWRlbF9saXN0W251bV9kZWxdLnZsYW5fdGFnID0KIAkJCQkJY3B1X3RvX2xlMTYoKHUxNikoZi0+dmxhbikpOwpAQCAtNDU1NCwyMyArNDU1MywzOCBAQAogICoqLwogc3RhdGljIHU4IGk0MGVfZGNiX2dldF9udW1fdGMoc3RydWN0IGk0MGVfZGNieF9jb25maWcgKmRjYmNmZykKIHsKKwlpbnQgaSwgdGNfdW51c2VkID0gMDsKIAl1OCBudW1fdGMgPSAwOwotCWludCBpOworCXU4IHJldCA9IDA7CiAKIAkvKiBTY2FuIHRoZSBFVFMgQ29uZmlnIFByaW9yaXR5IFRhYmxlIHRvIGZpbmQKIAkgKiB0cmFmZmljIGNsYXNzIGVuYWJsZWQgZm9yIGEgZ2l2ZW4gcHJpb3JpdHkKLQkgKiBhbmQgdXNlIHRoZSB0cmFmZmljIGNsYXNzIGluZGV4IHRvIGdldCB0aGUKLQkgKiBudW1iZXIgb2YgdHJhZmZpYyBjbGFzc2VzIGVuYWJsZWQKKwkgKiBhbmQgY3JlYXRlIGEgYml0bWFzayBvZiBlbmFibGVkIFRDcwogCSAqLwotCWZvciAoaSA9IDA7IGkgPCBJNDBFX01BWF9VU0VSX1BSSU9SSVRZOyBpKyspIHsKLQkJaWYgKGRjYmNmZy0+ZXRzY2ZnLnByaW9yaXR5dGFibGVbaV0gPiBudW1fdGMpCi0JCQludW1fdGMgPSBkY2JjZmctPmV0c2NmZy5wcmlvcml0eXRhYmxlW2ldOworCWZvciAoaSA9IDA7IGkgPCBJNDBFX01BWF9VU0VSX1BSSU9SSVRZOyBpKyspCisJCW51bV90YyB8PSBCSVQoZGNiY2ZnLT5ldHNjZmcucHJpb3JpdHl0YWJsZVtpXSk7CisKKwkvKiBOb3cgc2NhbiB0aGUgYml0bWFzayB0byBjaGVjayBmb3IKKwkgKiBjb250aWd1b3VzIFRDcyBzdGFydGluZyB3aXRoIFRDMAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBJNDBFX01BWF9UUkFGRklDX0NMQVNTOyBpKyspIHsKKwkJaWYgKG51bV90YyAmIEJJVChpKSkgeworCQkJaWYgKCF0Y191bnVzZWQpIHsKKwkJCQlyZXQrKzsKKwkJCX0gZWxzZSB7CisJCQkJcHJfZXJyKCJOb24tY29udGlndW91cyBUQyAtIERpc2FibGluZyBEQ0JcbiIpOworCQkJCXJldHVybiAxOworCQkJfQorCQl9IGVsc2UgeworCQkJdGNfdW51c2VkID0gMTsKKwkJfQogCX0KIAotCS8qIFRyYWZmaWMgY2xhc3MgaW5kZXggc3RhcnRzIGZyb20gemVybyBzbwotCSAqIGluY3JlbWVudCB0byByZXR1cm4gdGhlIGFjdHVhbCBjb3VudAotCSAqLwotCXJldHVybiBudW1fdGMgKyAxOworCS8qIFRoZXJlIGlzIGFsd2F5cyBhdCBsZWFzdCBUQzAgKi8KKwlpZiAoIXJldCkKKwkJcmV0ID0gMTsKKworCXJldHVybiByZXQ7CiB9CiAKIC8qKgpAQCAtNDYwMSw3ICs0NjE1LDcgQEAKIHN0YXRpYyB1OCBpNDBlX3BmX2dldF9udW1fdGMoc3RydWN0IGk0MGVfcGYgKnBmKQogewogCXN0cnVjdCBpNDBlX2h3ICpodyA9ICZwZi0+aHc7Ci0JdTggaSwgZW5hYmxlZF90YzsKKwl1OCBpLCBlbmFibGVkX3RjID0gMTsKIAl1OCBudW1fdGMgPSAwOwogCXN0cnVjdCBpNDBlX2RjYnhfY29uZmlnICpkY2JjZmcgPSAmaHctPmxvY2FsX2RjYnhfY29uZmlnOwogCkBAIC00NjE5LDggKzQ2MzMsNiBAQAogCWVsc2UKIAkJcmV0dXJuIDE7IC8qIE9ubHkgVEMwICovCiAKLQkvKiBBdCBsZWFzdCBoYXZlIFRDMCAqLwotCWVuYWJsZWRfdGMgPSAoZW5hYmxlZF90YyA/IGVuYWJsZWRfdGMgOiAweDEpOwogCWZvciAoaSA9IDA7IGkgPCBJNDBFX01BWF9UUkFGRklDX0NMQVNTOyBpKyspIHsKIAkJaWYgKGVuYWJsZWRfdGMgJiBCSVQoaSkpCiAJCQludW1fdGMrKzsKQEAgLTUwOTgsOSArNTExMCwxMyBAQAogCQkJCSAgICAgICBEQ0JfQ0FQX0RDQlhfVkVSX0lFRUU7CiAKIAkJCXBmLT5mbGFncyB8PSBJNDBFX0ZMQUdfRENCX0NBUEFCTEU7Ci0JCQkvKiBFbmFibGUgRENCIHRhZ2dpbmcgb25seSB3aGVuIG1vcmUgdGhhbiBvbmUgVEMgKi8KKwkJCS8qIEVuYWJsZSBEQ0IgdGFnZ2luZyBvbmx5IHdoZW4gbW9yZSB0aGFuIG9uZSBUQworCQkJICogb3IgZXhwbGljaXRseSBkaXNhYmxlIGlmIG9ubHkgb25lIFRDCisJCQkgKi8KIAkJCWlmIChpNDBlX2RjYl9nZXRfbnVtX3RjKCZody0+bG9jYWxfZGNieF9jb25maWcpID4gMSkKIAkJCQlwZi0+ZmxhZ3MgfD0gSTQwRV9GTEFHX0RDQl9FTkFCTEVEOworCQkJZWxzZQorCQkJCXBmLT5mbGFncyAmPSB+STQwRV9GTEFHX0RDQl9FTkFCTEVEOwogCQkJZGV2X2RiZygmcGYtPnBkZXYtPmRldiwKIAkJCQkiRENCWCBvZmZsb2FkIGlzIHN1cHBvcnRlZCBmb3IgdGhpcyBQRi5cbiIpOwogCQl9CkBAIC01MjI2LDcgKzUyNDIsNyBAQAogCQkvKiByZXNldCBmZCBjb3VudGVycyAqLwogCQlwZi0+ZmRfYWRkX2VyciA9IHBmLT5mZF9hdHJfY250ID0gMDsKIAkJaWYgKHBmLT5mZF90Y3BfcnVsZSA+IDApIHsKLQkJCXBmLT5mbGFncyAmPSB+STQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEOworCQkJcGYtPmF1dG9fZGlzYWJsZV9mbGFncyB8PSBJNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQ7CiAJCQlpZiAoSTQwRV9ERUJVR19GRCAmIHBmLT5ody5kZWJ1Z19tYXNrKQogCQkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiRm9yY2luZyBBVFIgb2ZmLCBzaWRlYmFuZCBydWxlcyBmb3IgVENQL0lQdjQgZXhpc3RcbiIpOwogCQkJcGYtPmZkX3RjcF9ydWxlID0gMDsKQEAgLTU0MTYsNyArNTQzMiw2IEBACiAJd3IzMigmcGYtPmh3LCBJNDBFX0dMTEFOX1RTT01TS19MLCBiZTMyX3RvX2NwdShUQ1BfRkxBR19DV1IpID4+IDE2KTsKIAogCXVkcF90dW5uZWxfZ2V0X3J4X2luZm8obmV0ZGV2KTsKLQlpNDBlX25vdGlmeV9jbGllbnRfb2ZfbmV0ZGV2X29wZW4odnNpKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTcwMiw3ICs1NzE3LDcgQEAKIAl1OCB0eXBlOwogCiAJLyogTm90IERDQiBjYXBhYmxlIG9yIGNhcGFiaWxpdHkgZGlzYWJsZWQgKi8KLQlpZiAoIShwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfRENCX0NBUEFCTEUpKQorCWlmICghKHBmLT5mbGFncyAmIEk0MEVfRkxBR19EQ0JfRU5BQkxFRCkpCiAJCXJldHVybiByZXQ7CiAKIAkvKiBJZ25vcmUgaWYgZXZlbnQgaXMgbm90IGZvciBOZWFyZXN0IEJyaWRnZSAqLwpAQCAtNTkyNCwxMyArNTkzOSwxNyBAQAogCQkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiRkQgU2lkZWJhbmQvbnR1cGxlIGlzIGJlaW5nIGVuYWJsZWQgc2luY2Ugd2UgaGF2ZSBzcGFjZSBpbiB0aGUgdGFibGUgbm93XG4iKTsKIAkJfQogCX0KLQkvKiBXYWl0IGZvciBzb21lIG1vcmUgc3BhY2UgdG8gYmUgYXZhaWxhYmxlIHRvIHR1cm4gb24gQVRSICovCisKKwkvKiBXYWl0IGZvciBzb21lIG1vcmUgc3BhY2UgdG8gYmUgYXZhaWxhYmxlIHRvIHR1cm4gb24gQVRSLiBXZSBhbHNvCisJICogbXVzdCBjaGVjayB0aGF0IG5vIGV4aXN0aW5nIG50dXBsZSBydWxlcyBmb3IgVENQIGFyZSBpbiBlZmZlY3QKKwkgKi8KIAlpZiAoZmNudF9wcm9nIDwgKGZjbnRfYXZhaWwgLSBJNDBFX0ZESVJfQlVGRkVSX0hFQURfUk9PTSAqIDIpKSB7CiAJCWlmICgocGYtPmZsYWdzICYgSTQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEKSAmJgotCQkgICAgKHBmLT5hdXRvX2Rpc2FibGVfZmxhZ3MgJiBJNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQpKSB7CisJCSAgICAocGYtPmF1dG9fZGlzYWJsZV9mbGFncyAmIEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRCkgJiYKKwkJICAgIChwZi0+ZmRfdGNwX3J1bGUgPT0gMCkpIHsKIAkJCXBmLT5hdXRvX2Rpc2FibGVfZmxhZ3MgJj0gfkk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRDsKIAkJCWlmIChJNDBFX0RFQlVHX0ZEICYgcGYtPmh3LmRlYnVnX21hc2spCi0JCQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJBVFIgaXMgYmVpbmcgZW5hYmxlZCBzaW5jZSB3ZSBoYXZlIHNwYWNlIGluIHRoZSB0YWJsZSBub3dcbiIpOworCQkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiQVRSIGlzIGJlaW5nIGVuYWJsZWQgc2luY2Ugd2UgaGF2ZSBzcGFjZSBpbiB0aGUgdGFibGUgYW5kIHRoZXJlIGFyZSBubyBjb25mbGljdGluZyBudHVwbGUgcnVsZXNcbiIpOwogCQl9CiAJfQogCkBAIC01OTYxLDkgKzU5ODAsNiBAQAogCWludCBmZF9yb29tOwogCWludCByZWc7CiAKLQlpZiAoIShwZi0+ZmxhZ3MgJiAoSTQwRV9GTEFHX0ZEX1NCX0VOQUJMRUQgfCBJNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQpKSkKLQkJcmV0dXJuOwotCiAJaWYgKCF0aW1lX2FmdGVyKGppZmZpZXMsIHBmLT5mZF9mbHVzaF90aW1lc3RhbXAgKwogCQkJCSAoSTQwRV9NSU5fRkRfRkxVU0hfSU5URVJWQUwgKiBIWikpKQogCQlyZXR1cm47CkBAIC01OTgzLDcgKzU5OTksNyBAQAogCX0KIAogCXBmLT5mZF9mbHVzaF90aW1lc3RhbXAgPSBqaWZmaWVzOwotCXBmLT5mbGFncyAmPSB+STQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEOworCXBmLT5hdXRvX2Rpc2FibGVfZmxhZ3MgfD0gSTQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEOwogCS8qIGZsdXNoIGFsbCBmaWx0ZXJzICovCiAJd3IzMigmcGYtPmh3LCBJNDBFX1BGUUZfQ1RMXzEsCiAJICAgICBJNDBFX1BGUUZfQ1RMXzFfQ0xFQVJGRFRBQkxFX01BU0spOwpAQCAtNjAwMyw3ICs2MDE5LDcgQEAKIAkJLyogcmVwbGF5IHNpZGViYW5kIGZpbHRlcnMgKi8KIAkJaTQwZV9mZGlyX2ZpbHRlcl9yZXN0b3JlKHBmLT52c2lbcGYtPmxhbl92c2ldKTsKIAkJaWYgKCFkaXNhYmxlX2F0cikKLQkJCXBmLT5mbGFncyB8PSBJNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQ7CisJCQlwZi0+YXV0b19kaXNhYmxlX2ZsYWdzICY9IH5JNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQ7CiAJCWNsZWFyX2JpdChfX0k0MEVfRkRfRkxVU0hfUkVRVUVTVEVELCAmcGYtPnN0YXRlKTsKIAkJaWYgKEk0MEVfREVCVUdfRkQgJiBwZi0+aHcuZGVidWdfbWFzaykKIAkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiRkQgRmlsdGVyIHRhYmxlIGZsdXNoZWQgYW5kIEZELVNCIHJlcGxheWVkLlxuIik7CkBAIC02MDM3LDkgKzYwNTMsNiBAQAogCWlmICh0ZXN0X2JpdChfX0k0MEVfRE9XTiwgJnBmLT5zdGF0ZSkpCiAJCXJldHVybjsKIAotCWlmICghKHBmLT5mbGFncyAmIChJNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRCB8IEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRCkpKQotCQlyZXR1cm47Ci0KIAlpZiAodGVzdF9iaXQoX19JNDBFX0ZEX0ZMVVNIX1JFUVVFU1RFRCwgJnBmLT5zdGF0ZSkpCiAJCWk0MGVfZmRpcl9mbHVzaF9hbmRfcmVwbGF5KHBmKTsKIApAQCAtNzEzOSw5ICs3MTUyLDkgQEAKIAkJCXBmLT5wZW5kaW5nX3VkcF9iaXRtYXAgJj0gfkJJVF9VTEwoaSk7CiAJCQlwb3J0ID0gcGYtPnVkcF9wb3J0c1tpXS5pbmRleDsKIAkJCWlmIChwb3J0KQotCQkJCXJldCA9IGk0MGVfYXFfYWRkX3VkcF90dW5uZWwoaHcsIG50b2hzKHBvcnQpLAotCQkJCQkJICAgICBwZi0+dWRwX3BvcnRzW2ldLnR5cGUsCi0JCQkJCQkgICAgIE5VTEwsIE5VTEwpOworCQkJCXJldCA9IGk0MGVfYXFfYWRkX3VkcF90dW5uZWwoaHcsIHBvcnQsCisJCQkJCQkJcGYtPnVkcF9wb3J0c1tpXS50eXBlLAorCQkJCQkJCU5VTEwsIE5VTEwpOwogCQkJZWxzZQogCQkJCXJldCA9IGk0MGVfYXFfZGVsX3VkcF90dW5uZWwoaHcsIGksIE5VTEwpOwogCkBAIC03NjI4LDcgKzc2NDEsNiBAQAogCQkJdmVjdG9yc19sZWZ0LS07CiAJCX0gZWxzZSB7CiAJCQlwZi0+bnVtX2Zkc2JfbXNpeCA9IDA7Ci0JCQlwZi0+ZmxhZ3MgJj0gfkk0MEVfRkxBR19GRF9TQl9FTkFCTEVEOwogCQl9CiAJfQogCkBAIC03NjQ4LDYgKzc2NjAsOCBAQAogI2VuZGlmCiAJLyogY2FuIHdlIHJlc2VydmUgZW5vdWdoIGZvciBpV0FSUD8gKi8KIAlpZiAocGYtPmZsYWdzICYgSTQwRV9GTEFHX0lXQVJQX0VOQUJMRUQpIHsKKwkJaXdhcnBfcmVxdWVzdGVkID0gcGYtPm51bV9pd2FycF9tc2l4OworCiAJCWlmICghdmVjdG9yc19sZWZ0KQogCQkJcGYtPm51bV9pd2FycF9tc2l4ID0gMDsKIAkJZWxzZSBpZiAodmVjdG9yc19sZWZ0IDwgcGYtPm51bV9pd2FycF9tc2l4KQpAQCAtNzY2MSwxOCArNzY3NSwyMyBAQAogCQlpbnQgdm1kcV92ZWNzX3dhbnRlZCA9IHBmLT5udW1fdm1kcV92c2lzICogcGYtPm51bV92bWRxX3FwczsKIAkJaW50IHZtZHFfdmVjcyA9IG1pbl90KGludCwgdmVjdG9yc19sZWZ0LCB2bWRxX3ZlY3Nfd2FudGVkKTsKIAotCQkvKiBpZiB3ZSdyZSBzaG9ydCBvbiB2ZWN0b3JzIGZvciB3aGF0J3MgZGVzaXJlZCwgd2UgbGltaXQKLQkJICogdGhlIHF1ZXVlcyBwZXIgdm1kcS4gIElmIHRoaXMgaXMgc3RpbGwgbW9yZSB0aGFuIGFyZQotCQkgKiBhdmFpbGFibGUsIHRoZSB1c2VyIHdpbGwgbmVlZCB0byBjaGFuZ2UgdGhlIG51bWJlciBvZgotCQkgKiBxdWV1ZXMvdmVjdG9ycyB1c2VkIGJ5IHRoZSBQRiBsYXRlciB3aXRoIHRoZSBldGh0b29sCi0JCSAqIGNoYW5uZWxzIGNvbW1hbmQKLQkJICovCi0JCWlmICh2bWRxX3ZlY3MgPCB2bWRxX3ZlY3Nfd2FudGVkKQotCQkJcGYtPm51bV92bWRxX3FwcyA9IDE7Ci0JCXBmLT5udW1fdm1kcV9tc2l4ID0gcGYtPm51bV92bWRxX3FwczsKKwkJaWYgKCF2ZWN0b3JzX2xlZnQpIHsKKwkJCXBmLT5udW1fdm1kcV9tc2l4ID0gMDsKKwkJCXBmLT5udW1fdm1kcV9xcHMgPSAwOworCQl9IGVsc2UgeworCQkJLyogaWYgd2UncmUgc2hvcnQgb24gdmVjdG9ycyBmb3Igd2hhdCdzIGRlc2lyZWQsIHdlIGxpbWl0CisJCQkgKiB0aGUgcXVldWVzIHBlciB2bWRxLiAgSWYgdGhpcyBpcyBzdGlsbCBtb3JlIHRoYW4gYXJlCisJCQkgKiBhdmFpbGFibGUsIHRoZSB1c2VyIHdpbGwgbmVlZCB0byBjaGFuZ2UgdGhlIG51bWJlciBvZgorCQkJICogcXVldWVzL3ZlY3RvcnMgdXNlZCBieSB0aGUgUEYgbGF0ZXIgd2l0aCB0aGUgZXRodG9vbAorCQkJICogY2hhbm5lbHMgY29tbWFuZAorCQkJICovCisJCQlpZiAodm1kcV92ZWNzIDwgdm1kcV92ZWNzX3dhbnRlZCkKKwkJCQlwZi0+bnVtX3ZtZHFfcXBzID0gMTsKKwkJCXBmLT5udW1fdm1kcV9tc2l4ID0gcGYtPm51bV92bWRxX3FwczsKIAotCQl2X2J1ZGdldCArPSB2bWRxX3ZlY3M7Ci0JCXZlY3RvcnNfbGVmdCAtPSB2bWRxX3ZlY3M7CisJCQl2X2J1ZGdldCArPSB2bWRxX3ZlY3M7CisJCQl2ZWN0b3JzX2xlZnQgLT0gdm1kcV92ZWNzOworCQl9CiAJfQogCiAJcGYtPm1zaXhfZW50cmllcyA9IGtjYWxsb2Modl9idWRnZXQsIHNpemVvZihzdHJ1Y3QgbXNpeF9lbnRyeSksCkBAIC03Njg0LDIxICs3NzAzLDYgQEAKIAkJcGYtPm1zaXhfZW50cmllc1tpXS5lbnRyeSA9IGk7CiAJdl9hY3R1YWwgPSBpNDBlX3Jlc2VydmVfbXNpeF92ZWN0b3JzKHBmLCB2X2J1ZGdldCk7CiAKLQlpZiAodl9hY3R1YWwgIT0gdl9idWRnZXQpIHsKLQkJLyogSWYgd2UgaGF2ZSBsaW1pdGVkIHJlc291cmNlcywgd2Ugd2lsbCBzdGFydCB3aXRoIG5vIHZlY3RvcnMKLQkJICogZm9yIHRoZSBzcGVjaWFsIGZlYXR1cmVzIGFuZCB0aGVuIGFsbG9jYXRlIHZlY3RvcnMgdG8gc29tZQotCQkgKiBvZiB0aGVzZSBmZWF0dXJlcyBiYXNlZCBvbiB0aGUgcG9saWN5IGFuZCBhdCB0aGUgZW5kIGRpc2FibGUKLQkJICogdGhlIGZlYXR1cmVzIHRoYXQgZGlkIG5vdCBnZXQgYW55IHZlY3RvcnMuCi0JCSAqLwotCQlpd2FycF9yZXF1ZXN0ZWQgPSBwZi0+bnVtX2l3YXJwX21zaXg7Ci0JCXBmLT5udW1faXdhcnBfbXNpeCA9IDA7Ci0jaWZkZWYgSTQwRV9GQ09FCi0JCXBmLT5udW1fZmNvZV9xcHMgPSAwOwotCQlwZi0+bnVtX2Zjb2VfbXNpeCA9IDA7Ci0jZW5kaWYKLQkJcGYtPm51bV92bWRxX21zaXggPSAwOwotCX0KLQogCWlmICh2X2FjdHVhbCA8IEk0MEVfTUlOX01TSVgpIHsKIAkJcGYtPmZsYWdzICY9IH5JNDBFX0ZMQUdfTVNJWF9FTkFCTEVEOwogCQlrZnJlZShwZi0+bXNpeF9lbnRyaWVzKTsKQEAgLTc3MTIsOSArNzcxNiwxNiBAQAogCQlwZi0+bnVtX2xhbl9xcHMgPSAxOwogCQlwZi0+bnVtX2xhbl9tc2l4ID0gMTsKIAotCX0gZWxzZSBpZiAodl9hY3R1YWwgIT0gdl9idWRnZXQpIHsKKwl9IGVsc2UgaWYgKCF2ZWN0b3JzX2xlZnQpIHsKKwkJLyogSWYgd2UgaGF2ZSBsaW1pdGVkIHJlc291cmNlcywgd2Ugd2lsbCBzdGFydCB3aXRoIG5vIHZlY3RvcnMKKwkJICogZm9yIHRoZSBzcGVjaWFsIGZlYXR1cmVzIGFuZCB0aGVuIGFsbG9jYXRlIHZlY3RvcnMgdG8gc29tZQorCQkgKiBvZiB0aGVzZSBmZWF0dXJlcyBiYXNlZCBvbiB0aGUgcG9saWN5IGFuZCBhdCB0aGUgZW5kIGRpc2FibGUKKwkJICogdGhlIGZlYXR1cmVzIHRoYXQgZGlkIG5vdCBnZXQgYW55IHZlY3RvcnMuCisJCSAqLwogCQlpbnQgdmVjOwogCisJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LAorCQkJICJNU0ktWCB2ZWN0b3IgbGltaXQgcmVhY2hlZCwgYXR0ZW1wdGluZyB0byByZWRpc3RyaWJ1dGUgdmVjdG9yc1xuIik7CiAJCS8qIHJlc2VydmUgdGhlIG1pc2MgdmVjdG9yICovCiAJCXZlYyA9IHZfYWN0dWFsIC0gMTsKIApAQCAtNzcyMiw3ICs3NzMzLDEwIEBACiAJCXBmLT5udW1fdm1kcV9tc2l4ID0gMTsgICAgLyogZm9yY2UgVk1EcXMgdG8gb25seSBvbmUgdmVjdG9yICovCiAJCXBmLT5udW1fdm1kcV92c2lzID0gMTsKIAkJcGYtPm51bV92bWRxX3FwcyA9IDE7Ci0JCXBmLT5mbGFncyAmPSB+STQwRV9GTEFHX0ZEX1NCX0VOQUJMRUQ7CisjaWZkZWYgSTQwRV9GQ09FCisJCXBmLT5udW1fZmNvZV9xcHMgPSAwOworCQlwZi0+bnVtX2Zjb2VfbXNpeCA9IDA7CisjZW5kaWYKIAogCQkvKiBwYXJ0aXRpb24gb3V0IHRoZSByZW1haW5pbmcgdmVjdG9ycyAqLwogCQlzd2l0Y2ggKHZlYykgewpAQCAtNzc1NCw5ICs3NzY4LDE0IEBACiAJCQkJcGYtPm51bV92bWRxX3ZzaXMgPSBtaW5fdChpbnQsICh2ZWMgLyAyKSwKIAkJCQkJCSAgSTQwRV9ERUZBVUxUX05VTV9WTURRX1ZTSSk7CiAJCQl9CisJCQlpZiAocGYtPmZsYWdzICYgSTQwRV9GTEFHX0ZEX1NCX0VOQUJMRUQpIHsKKwkJCQlwZi0+bnVtX2Zkc2JfbXNpeCA9IDE7CisJCQkJdmVjLS07CisJCQl9CiAJCQlwZi0+bnVtX2xhbl9tc2l4ID0gbWluX3QoaW50LAogCQkJICAgICAgICh2ZWMgLSAocGYtPm51bV9pd2FycF9tc2l4ICsgcGYtPm51bV92bWRxX3ZzaXMpKSwKIAkJCQkJCQkgICAgICBwZi0+bnVtX2xhbl9tc2l4KTsKKwkJCXBmLT5udW1fbGFuX3FwcyA9IHBmLT5udW1fbGFuX21zaXg7CiAjaWZkZWYgSTQwRV9GQ09FCiAJCQkvKiBnaXZlIG9uZSB2ZWN0b3IgdG8gRkNvRSAqLwogCQkJaWYgKHBmLT5mbGFncyAmIEk0MEVfRkxBR19GQ09FX0VOQUJMRUQpIHsKQEAgLTc3NjgsNiArNzc4NywxMSBAQAogCQl9CiAJfQogCisJaWYgKChwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRCkgJiYKKwkgICAgKHBmLT5udW1fZmRzYl9tc2l4ID09IDApKSB7CisJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiU2lkZWJhbmQgRmxvd2RpciBkaXNhYmxlZCwgbm90IGVub3VnaCBNU0ktWCB2ZWN0b3JzXG4iKTsKKwkJcGYtPmZsYWdzICY9IH5JNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRDsKKwl9CiAJaWYgKChwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfVk1EUV9FTkFCTEVEKSAmJgogCSAgICAocGYtPm51bV92bWRxX21zaXggPT0gMCkpIHsKIAkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJWTURxIGRpc2FibGVkLCBub3QgZW5vdWdoIE1TSS1YIHZlY3RvcnNcbiIpOwpAQCAtNzc4Niw2ICs3ODEwLDEzIEBACiAJCXBmLT5mbGFncyAmPSB+STQwRV9GTEFHX0ZDT0VfRU5BQkxFRDsKIAl9CiAjZW5kaWYKKwlpNDBlX2RlYnVnKCZwZi0+aHcsIEk0MEVfREVCVUdfSU5JVCwKKwkJICAgIk1TSS1YIHZlY3RvciBkaXN0cmlidXRpb246IFBGICVkLCBWTURxICVkLCBGRFNCICVkLCBpV0FSUCAlZFxuIiwKKwkJICAgcGYtPm51bV9sYW5fbXNpeCwKKwkJICAgcGYtPm51bV92bWRxX21zaXggKiBwZi0+bnVtX3ZtZHFfdnNpcywKKwkJICAgcGYtPm51bV9mZHNiX21zaXgsCisJCSAgIHBmLT5udW1faXdhcnBfbXNpeCk7CisKIAlyZXR1cm4gdl9hY3R1YWw7CiB9CiAKQEAgLTc4ODIsNiArNzkxMyw3IEBACiAjZW5kaWYKIAkJCQkgICAgICAgSTQwRV9GTEFHX1JTU19FTkFCTEVECXwKIAkJCQkgICAgICAgSTQwRV9GTEFHX0RDQl9DQVBBQkxFCXwKKwkJCQkgICAgICAgSTQwRV9GTEFHX0RDQl9FTkFCTEVECXwKIAkJCQkgICAgICAgSTQwRV9GTEFHX1NSSU9WX0VOQUJMRUQJfAogCQkJCSAgICAgICBJNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRAl8CiAJCQkJICAgICAgIEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRAl8CkBAIC03OTcxLDcyICs4MDAzLDM0IEBACiBzdGF0aWMgaW50IGk0MGVfY29uZmlnX3Jzc19hcShzdHJ1Y3QgaTQwZV92c2kgKnZzaSwgY29uc3QgdTggKnNlZWQsCiAJCQkgICAgICB1OCAqbHV0LCB1MTYgbHV0X3NpemUpCiB7Ci0Jc3RydWN0IGk0MGVfYXFjX2dldF9zZXRfcnNzX2tleV9kYXRhIHJzc19rZXk7CiAJc3RydWN0IGk0MGVfcGYgKnBmID0gdnNpLT5iYWNrOwogCXN0cnVjdCBpNDBlX2h3ICpodyA9ICZwZi0+aHc7Ci0JYm9vbCBwZl9sdXQgPSBmYWxzZTsKLQl1OCAqcnNzX2x1dDsKLQlpbnQgcmV0LCBpOworCWludCByZXQgPSAwOwogCi0JbWVtY3B5KCZyc3Nfa2V5LCBzZWVkLCBzaXplb2YocnNzX2tleSkpOwotCi0JcnNzX2x1dCA9IGt6YWxsb2MocGYtPnJzc190YWJsZV9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJzc19sdXQpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyogUG9wdWxhdGUgdGhlIExVVCB3aXRoIG1heCBuby4gb2YgcXVldWVzIGluIHJvdW5kIHJvYmluIGZhc2hpb24gKi8KLQlmb3IgKGkgPSAwOyBpIDwgdnNpLT5yc3NfdGFibGVfc2l6ZTsgaSsrKQotCQlyc3NfbHV0W2ldID0gaSAlIHZzaS0+cnNzX3NpemU7Ci0KLQlyZXQgPSBpNDBlX2FxX3NldF9yc3Nfa2V5KGh3LCB2c2ktPmlkLCAmcnNzX2tleSk7Ci0JaWYgKHJldCkgewotCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwKLQkJCSAiQ2Fubm90IHNldCBSU1Mga2V5LCBlcnIgJXMgYXFfZXJyICVzXG4iLAotCQkJIGk0MGVfc3RhdF9zdHIoJnBmLT5odywgcmV0KSwKLQkJCSBpNDBlX2FxX3N0cigmcGYtPmh3LCBwZi0+aHcuYXEuYXNxX2xhc3Rfc3RhdHVzKSk7Ci0JCWdvdG8gY29uZmlnX3Jzc19hcV9vdXQ7CisJaWYgKHNlZWQpIHsKKwkJc3RydWN0IGk0MGVfYXFjX2dldF9zZXRfcnNzX2tleV9kYXRhICpzZWVkX2R3ID0KKwkJCShzdHJ1Y3QgaTQwZV9hcWNfZ2V0X3NldF9yc3Nfa2V5X2RhdGEgKilzZWVkOworCQlyZXQgPSBpNDBlX2FxX3NldF9yc3Nfa2V5KGh3LCB2c2ktPmlkLCBzZWVkX2R3KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsCisJCQkJICJDYW5ub3Qgc2V0IFJTUyBrZXksIGVyciAlcyBhcV9lcnIgJXNcbiIsCisJCQkJIGk0MGVfc3RhdF9zdHIoaHcsIHJldCksCisJCQkJIGk0MGVfYXFfc3RyKGh3LCBody0+YXEuYXNxX2xhc3Rfc3RhdHVzKSk7CisJCQlyZXR1cm4gcmV0OworCQl9CiAJfQorCWlmIChsdXQpIHsKKwkJYm9vbCBwZl9sdXQgPSB2c2ktPnR5cGUgPT0gSTQwRV9WU0lfTUFJTiA/IHRydWUgOiBmYWxzZTsKIAotCWlmICh2c2ktPnR5cGUgPT0gSTQwRV9WU0lfTUFJTikKLQkJcGZfbHV0ID0gdHJ1ZTsKLQotCXJldCA9IGk0MGVfYXFfc2V0X3Jzc19sdXQoaHcsIHZzaS0+aWQsIHBmX2x1dCwgcnNzX2x1dCwKLQkJCQkgIHZzaS0+cnNzX3RhYmxlX3NpemUpOwotCWlmIChyZXQpCi0JCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LAotCQkJICJDYW5ub3Qgc2V0IFJTUyBsdXQsIGVyciAlcyBhcV9lcnIgJXNcbiIsCi0JCQkgaTQwZV9zdGF0X3N0cigmcGYtPmh3LCByZXQpLAotCQkJIGk0MGVfYXFfc3RyKCZwZi0+aHcsIHBmLT5ody5hcS5hc3FfbGFzdF9zdGF0dXMpKTsKLQotY29uZmlnX3Jzc19hcV9vdXQ6Ci0Ja2ZyZWUocnNzX2x1dCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBpNDBlX3ZzaV9jb25maWdfcnNzIC0gUHJlcGFyZSBmb3IgVlNJKFZNRHEpIFJTUyBpZiB1c2VkCi0gKiBAdnNpOiBWU0kgc3RydWN0dXJlCi0gKiovCi1zdGF0aWMgaW50IGk0MGVfdnNpX2NvbmZpZ19yc3Moc3RydWN0IGk0MGVfdnNpICp2c2kpCi17Ci0JdTggc2VlZFtJNDBFX0hLRVlfQVJSQVlfU0laRV07Ci0Jc3RydWN0IGk0MGVfcGYgKnBmID0gdnNpLT5iYWNrOwotCXU4ICpsdXQ7Ci0JaW50IHJldDsKLQotCWlmICghKHBmLT5mbGFncyAmIEk0MEVfRkxBR19SU1NfQVFfQ0FQQUJMRSkpCi0JCXJldHVybiAwOwotCi0JbHV0ID0ga3phbGxvYyh2c2ktPnJzc190YWJsZV9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWx1dCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpNDBlX2ZpbGxfcnNzX2x1dChwZiwgbHV0LCB2c2ktPnJzc190YWJsZV9zaXplLCB2c2ktPnJzc19zaXplKTsKLQluZXRkZXZfcnNzX2tleV9maWxsKCh2b2lkICopc2VlZCwgSTQwRV9IS0VZX0FSUkFZX1NJWkUpOwotCXZzaS0+cnNzX3NpemUgPSBtaW5fdChpbnQsIHBmLT5hbGxvY19yc3Nfc2l6ZSwgdnNpLT5udW1fcXVldWVfcGFpcnMpOwotCXJldCA9IGk0MGVfY29uZmlnX3Jzc19hcSh2c2ksIHNlZWQsIGx1dCwgdnNpLT5yc3NfdGFibGVfc2l6ZSk7Ci0Ja2ZyZWUobHV0KTsKLQorCQlyZXQgPSBpNDBlX2FxX3NldF9yc3NfbHV0KGh3LCB2c2ktPmlkLCBwZl9sdXQsIGx1dCwgbHV0X3NpemUpOworCQlpZiAocmV0KSB7CisJCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwKKwkJCQkgIkNhbm5vdCBzZXQgUlNTIGx1dCwgZXJyICVzIGFxX2VyciAlc1xuIiwKKwkJCQkgaTQwZV9zdGF0X3N0cihodywgcmV0KSwKKwkJCQkgaTQwZV9hcV9zdHIoaHcsIGh3LT5hcS5hc3FfbGFzdF9zdGF0dXMpKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtODA4Nyw2ICs4MDgxLDQ2IEBACiB9CiAKIC8qKgorICogaTQwZV92c2lfY29uZmlnX3JzcyAtIFByZXBhcmUgZm9yIFZTSShWTURxKSBSU1MgaWYgdXNlZAorICogQHZzaTogVlNJIHN0cnVjdHVyZQorICoqLworc3RhdGljIGludCBpNDBlX3ZzaV9jb25maWdfcnNzKHN0cnVjdCBpNDBlX3ZzaSAqdnNpKQoreworCXU4IHNlZWRbSTQwRV9IS0VZX0FSUkFZX1NJWkVdOworCXN0cnVjdCBpNDBlX3BmICpwZiA9IHZzaS0+YmFjazsKKwl1OCAqbHV0OworCWludCByZXQ7CisKKwlpZiAoIShwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfUlNTX0FRX0NBUEFCTEUpKQorCQlyZXR1cm4gMDsKKworCWlmICghdnNpLT5yc3Nfc2l6ZSkKKwkJdnNpLT5yc3Nfc2l6ZSA9IG1pbl90KGludCwgcGYtPmFsbG9jX3Jzc19zaXplLAorCQkJCSAgICAgIHZzaS0+bnVtX3F1ZXVlX3BhaXJzKTsKKwlpZiAoIXZzaS0+cnNzX3NpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJbHV0ID0ga3phbGxvYyh2c2ktPnJzc190YWJsZV9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWx1dCkKKwkJcmV0dXJuIC1FTk9NRU07CisJLyogVXNlIHRoZSB1c2VyIGNvbmZpZ3VyZWQgaGFzaCBrZXlzIGFuZCBsb29rdXAgdGFibGUgaWYgdGhlcmUgaXMgb25lLAorCSAqIG90aGVyd2lzZSB1c2UgZGVmYXVsdAorCSAqLworCWlmICh2c2ktPnJzc19sdXRfdXNlcikKKwkJbWVtY3B5KGx1dCwgdnNpLT5yc3NfbHV0X3VzZXIsIHZzaS0+cnNzX3RhYmxlX3NpemUpOworCWVsc2UKKwkJaTQwZV9maWxsX3Jzc19sdXQocGYsIGx1dCwgdnNpLT5yc3NfdGFibGVfc2l6ZSwgdnNpLT5yc3Nfc2l6ZSk7CisJaWYgKHZzaS0+cnNzX2hrZXlfdXNlcikKKwkJbWVtY3B5KHNlZWQsIHZzaS0+cnNzX2hrZXlfdXNlciwgSTQwRV9IS0VZX0FSUkFZX1NJWkUpOworCWVsc2UKKwkJbmV0ZGV2X3Jzc19rZXlfZmlsbCgodm9pZCAqKXNlZWQsIEk0MEVfSEtFWV9BUlJBWV9TSVpFKTsKKwlyZXQgPSBpNDBlX2NvbmZpZ19yc3NfYXEodnNpLCBzZWVkLCBsdXQsIHZzaS0+cnNzX3RhYmxlX3NpemUpOworCWtmcmVlKGx1dCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKICAqIGk0MGVfY29uZmlnX3Jzc19yZWcgLSBDb25maWd1cmUgUlNTIGtleXMgYW5kIGx1dCBieSB3cml0aW5nIHJlZ2lzdGVycwogICogQHZzaTogUG9pbnRlciB0byB2c2kgc3RydWN0dXJlCiAgKiBAc2VlZDogUlNTIGhhc2ggc2VlZApAQCAtODIyNCw4ICs4MjU4LDggQEAKICAqIEByc3NfdGFibGVfc2l6ZTogTG9va3VwIHRhYmxlIHNpemUKICAqIEByc3Nfc2l6ZTogUmFuZ2Ugb2YgcXVldWUgbnVtYmVyIGZvciBoYXNoaW5nCiAgKi8KLXN0YXRpYyB2b2lkIGk0MGVfZmlsbF9yc3NfbHV0KHN0cnVjdCBpNDBlX3BmICpwZiwgdTggKmx1dCwKLQkJCSAgICAgIHUxNiByc3NfdGFibGVfc2l6ZSwgdTE2IHJzc19zaXplKQordm9pZCBpNDBlX2ZpbGxfcnNzX2x1dChzdHJ1Y3QgaTQwZV9wZiAqcGYsIHU4ICpsdXQsCisJCSAgICAgICB1MTYgcnNzX3RhYmxlX3NpemUsIHUxNiByc3Nfc2l6ZSkKIHsKIAl1MTYgaTsKIApAQCAtODI2Niw2ICs4MzAwLDggQEAKIAlpZiAoIXZzaS0+cnNzX3NpemUpCiAJCXZzaS0+cnNzX3NpemUgPSBtaW5fdChpbnQsIHBmLT5hbGxvY19yc3Nfc2l6ZSwKIAkJCQkgICAgICB2c2ktPm51bV9xdWV1ZV9wYWlycyk7CisJaWYgKCF2c2ktPnJzc19zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWx1dCA9IGt6YWxsb2ModnNpLT5yc3NfdGFibGVfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFsdXQpCkBAIC04NTkwLDcgKzg2MjYsNiBAQAogCQkJICAgICBJNDBFX0ZMQUdfV0JfT05fSVRSX0NBUEFCTEUgfAogCQkJICAgICBJNDBFX0ZMQUdfTVVMVElQTEVfVENQX1VEUF9SU1NfUENUWVBFIHwKIAkJCSAgICAgSTQwRV9GTEFHX05PX1BDSV9MSU5LX0NIRUNLIHwKLQkJCSAgICAgSTQwRV9GTEFHXzEwME1fU0dNSUlfQ0FQQUJMRSB8CiAJCQkgICAgIEk0MEVfRkxBR19VU0VfU0VUX0xMRFBfTUlCIHwKIAkJCSAgICAgSTQwRV9GTEFHX0dFTkVWRV9PRkZMT0FEX0NBUEFCTEU7CiAJfSBlbHNlIGlmICgocGYtPmh3LmFxLmFwaV9tYWpfdmVyID4gMSkgfHwKQEAgLTg2NjUsMTggKzg3MDAsNDAgQEAKIAkJLyogcmVzZXQgZmQgY291bnRlcnMgKi8KIAkJcGYtPmZkX2FkZF9lcnIgPSBwZi0+ZmRfYXRyX2NudCA9IHBmLT5mZF90Y3BfcnVsZSA9IDA7CiAJCXBmLT5mZGlyX3BmX2FjdGl2ZV9maWx0ZXJzID0gMDsKLQkJcGYtPmZsYWdzIHw9IEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRDsKLQkJaWYgKEk0MEVfREVCVUdfRkQgJiBwZi0+aHcuZGVidWdfbWFzaykKLQkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiQVRSIHJlLWVuYWJsZWQuXG4iKTsKIAkJLyogaWYgQVRSIHdhcyBhdXRvIGRpc2FibGVkIGl0IGNhbiBiZSByZS1lbmFibGVkLiAqLwogCQlpZiAoKHBmLT5mbGFncyAmIEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRCkgJiYKLQkJICAgIChwZi0+YXV0b19kaXNhYmxlX2ZsYWdzICYgSTQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEKSkKKwkJICAgIChwZi0+YXV0b19kaXNhYmxlX2ZsYWdzICYgSTQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEKSkgewogCQkJcGYtPmF1dG9fZGlzYWJsZV9mbGFncyAmPSB+STQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEOworCQkJaWYgKEk0MEVfREVCVUdfRkQgJiBwZi0+aHcuZGVidWdfbWFzaykKKwkJCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIkFUUiByZS1lbmFibGVkLlxuIik7CisJCX0KIAl9CiAJcmV0dXJuIG5lZWRfcmVzZXQ7CiB9CiAKIC8qKgorICogaTQwZV9jbGVhcl9yc3NfbHV0IC0gY2xlYXIgdGhlIHJ4IGhhc2ggbG9va3VwIHRhYmxlCisgKiBAdnNpOiB0aGUgVlNJIGJlaW5nIGNvbmZpZ3VyZWQKKyAqKi8KK3N0YXRpYyB2b2lkIGk0MGVfY2xlYXJfcnNzX2x1dChzdHJ1Y3QgaTQwZV92c2kgKnZzaSkKK3sKKwlzdHJ1Y3QgaTQwZV9wZiAqcGYgPSB2c2ktPmJhY2s7CisJc3RydWN0IGk0MGVfaHcgKmh3ID0gJnBmLT5odzsKKwl1MTYgdmZfaWQgPSB2c2ktPnZmX2lkOworCXU4IGk7CisKKwlpZiAodnNpLT50eXBlID09IEk0MEVfVlNJX01BSU4pIHsKKwkJZm9yIChpID0gMDsgaSA8PSBJNDBFX1BGUUZfSExVVF9NQVhfSU5ERVg7IGkrKykKKwkJCXdyMzIoaHcsIEk0MEVfUEZRRl9ITFVUKGkpLCAwKTsKKwl9IGVsc2UgaWYgKHZzaS0+dHlwZSA9PSBJNDBFX1ZTSV9TUklPVikgeworCQlmb3IgKGkgPSAwOyBpIDw9IEk0MEVfVkZRRl9ITFVUX01BWF9JTkRFWDsgaSsrKQorCQkJaTQwZV93cml0ZV9yeF9jdGwoaHcsIEk0MEVfVkZRRl9ITFVUMShpLCB2Zl9pZCksIDApOworCX0gZWxzZSB7CisJCWRldl9lcnIoJnBmLT5wZGV2LT5kZXYsICJDYW5ub3Qgc2V0IFJTUyBMVVQgLSBpbnZhbGlkIFZTSSB0eXBlXG4iKTsKKwl9Cit9CisKKy8qKgogICogaTQwZV9zZXRfZmVhdHVyZXMgLSBzZXQgdGhlIG5ldGRldiBmZWF0dXJlIGZsYWdzCiAgKiBAbmV0ZGV2OiBwdHIgdG8gdGhlIG5ldGRldiBiZWluZyBhZGp1c3RlZAogICogQGZlYXR1cmVzOiB0aGUgZmVhdHVyZSBzZXQgdGhhdCB0aGUgc3RhY2sgaXMgc3VnZ2VzdGluZwpAQCAtODY4OSw2ICs4NzQ2LDEyIEBACiAJc3RydWN0IGk0MGVfcGYgKnBmID0gdnNpLT5iYWNrOwogCWJvb2wgbmVlZF9yZXNldDsKIAorCWlmIChmZWF0dXJlcyAmIE5FVElGX0ZfUlhIQVNIICYmICEobmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfUlhIQVNIKSkKKwkJaTQwZV9wZl9jb25maWdfcnNzKHBmKTsKKwllbHNlIGlmICghKGZlYXR1cmVzICYgTkVUSUZfRl9SWEhBU0gpICYmCisJCSBuZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9SWEhBU0gpCisJCWk0MGVfY2xlYXJfcnNzX2x1dCh2c2kpOworCiAJaWYgKGZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX0NUQUdfUlgpCiAJCWk0MGVfdmxhbl9zdHJpcHBpbmdfZW5hYmxlKHZzaSk7CiAJZWxzZQpAQCAtMTA0ODgsNiArMTA1NTEsNyBAQAogCQkJICAgICAgIEk0MEVfRkxBR19GRF9TQl9FTkFCTEVECXwKIAkJCSAgICAgICBJNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQJfAogCQkJICAgICAgIEk0MEVfRkxBR19EQ0JfQ0FQQUJMRQl8CisJCQkgICAgICAgSTQwRV9GTEFHX0RDQl9FTkFCTEVECXwKIAkJCSAgICAgICBJNDBFX0ZMQUdfU1JJT1ZfRU5BQkxFRAl8CiAJCQkgICAgICAgSTQwRV9GTEFHX1ZNRFFfRU5BQkxFRCk7CiAJfSBlbHNlIGlmICghKHBmLT5mbGFncyAmIChJNDBFX0ZMQUdfUlNTX0VOQUJMRUQgfApAQCAtMTA1MTEsNyArMTA1NzUsOCBAQAogCQkvKiBOb3QgZW5vdWdoIHF1ZXVlcyBmb3IgYWxsIFRDcyAqLwogCQlpZiAoKHBmLT5mbGFncyAmIEk0MEVfRkxBR19EQ0JfQ0FQQUJMRSkgJiYKIAkJICAgIChxdWV1ZXNfbGVmdCA8IEk0MEVfTUFYX1RSQUZGSUNfQ0xBU1MpKSB7Ci0JCQlwZi0+ZmxhZ3MgJj0gfkk0MEVfRkxBR19EQ0JfQ0FQQUJMRTsKKwkJCXBmLT5mbGFncyAmPSB+KEk0MEVfRkxBR19EQ0JfQ0FQQUJMRSB8CisJCQkJCUk0MEVfRkxBR19EQ0JfRU5BQkxFRCk7CiAJCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIm5vdCBlbm91Z2ggcXVldWVzIGZvciBEQ0IuIERDQiBpcyBkaXNhYmxlZC5cbiIpOwogCQl9CiAJCXBmLT5udW1fbGFuX3FwcyA9IG1heF90KGludCwgcGYtPnJzc19zaXplX21heCwKQEAgLTEwOTA4LDcgKzEwOTczLDcgQEAKIAllcnIgPSBpNDBlX2luaXRfcGZfZGNiKHBmKTsKIAlpZiAoZXJyKSB7CiAJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJEQ0IgaW5pdCBmYWlsZWQgJWQsIGRpc2FibGVkXG4iLCBlcnIpOwotCQlwZi0+ZmxhZ3MgJj0gfkk0MEVfRkxBR19EQ0JfQ0FQQUJMRTsKKwkJcGYtPmZsYWdzICY9IH4oSTQwRV9GTEFHX0RDQl9DQVBBQkxFICYgSTQwRV9GTEFHX0RDQl9FTkFCTEVEKTsKIAkJLyogQ29udGludWUgd2l0aG91dCBEQ0IgZW5hYmxlZCAqLwogCX0KICNlbmRpZiAvKiBDT05GSUdfSTQwRV9EQ0IgKi8KQEAgLTExMjg4LDExICsxMTM1Myw3IEBACiAJfQogCiAJLyogc2h1dGRvd24gdGhlIGFkbWlucSAqLwotCXJldF9jb2RlID0gaTQwZV9zaHV0ZG93bl9hZG1pbnEoaHcpOwotCWlmIChyZXRfY29kZSkKLQkJZGV2X3dhcm4oJnBkZXYtPmRldiwKLQkJCSAiRmFpbGVkIHRvIGRlc3Ryb3kgdGhlIEFkbWluIFF1ZXVlIHJlc291cmNlczogJWRcbiIsCi0JCQkgcmV0X2NvZGUpOworCWk0MGVfc2h1dGRvd25fYWRtaW5xKGh3KTsKIAogCS8qIGRlc3Ryb3kgdGhlIGxvY2tzIG9ubHkgb25jZSwgaGVyZSAqLwogCW11dGV4X2Rlc3Ryb3koJmh3LT5hcS5hcnFfbXV0ZXgpOwpAQCAtMTEzMzksNiArMTE0MDAsMTIgQEAKIAogCWRldl9pbmZvKCZwZGV2LT5kZXYsICIlczogZXJyb3IgJWRcbiIsIF9fZnVuY19fLCBlcnJvcik7CiAKKwlpZiAoIXBmKSB7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCQkgIkNhbm5vdCByZWNvdmVyIC0gZXJyb3IgaGFwcGVuZWQgZHVyaW5nIGRldmljZSBwcm9iZVxuIik7CisJCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUOworCX0KKwogCS8qIHNodXRkb3duIGFsbCBvcGVyYXRpb25zICovCiAJaWYgKCF0ZXN0X2JpdChfX0k0MEVfU1VTUEVOREVELCAmcGYtPnN0YXRlKSkgewogCQlydG5sX2xvY2soKTsKQEAgLTExNTYxLDcgKzExNjI4LDggQEAKIAkgKiBpdCBjYW4ndCBiZSBhbnkgd29yc2UgdGhhbiB1c2luZyB0aGUgc3lzdGVtIHdvcmtxdWV1ZSB3aGljaAogCSAqIHdhcyBhbHJlYWR5IHNpbmdsZSB0aHJlYWRlZAogCSAqLwotCWk0MGVfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShpNDBlX2RyaXZlcl9uYW1lKTsKKwlpNDBlX3dxID0gYWxsb2Nfd29ya3F1ZXVlKCIlcyIsIFdRX1VOQk9VTkQgfCBXUV9NRU1fUkVDTEFJTSwgMSwKKwkJCQkgIGk0MGVfZHJpdmVyX25hbWUpOwogCWlmICghaTQwZV93cSkgewogCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIHdvcmtxdWV1ZVxuIiwgaTQwZV9kcml2ZXJfbmFtZSk7CiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3B0cC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3B0cC5jCmluZGV4IGVkMzljYmEuLmYxZmVjZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9wdHAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfcHRwLmMKQEAgLTY2OSw3ICs2NjksNyBAQAogCQlwZi0+cHRwX2Nsb2NrID0gTlVMTDsKIAkJZGV2X2VycigmcGYtPnBkZXYtPmRldiwgIiVzOiBwdHBfY2xvY2tfcmVnaXN0ZXIgZmFpbGVkXG4iLAogCQkJX19mdW5jX18pOwotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChwZi0+cHRwX2Nsb2NrKSB7CiAJCXN0cnVjdCB0aW1lc3BlYzY0IHRzOwogCQl1MzIgcmVndmFsOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdHhyeC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3R4cnguYwppbmRleCBkZjdlY2M5Li42Mjg3YmY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdHhyeC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV90eHJ4LmMKQEAgLTQwLDYgKzQwLDY5IEBACiB9CiAKICNkZWZpbmUgSTQwRV9UWERfQ01EIChJNDBFX1RYX0RFU0NfQ01EX0VPUCB8IEk0MEVfVFhfREVTQ19DTURfUlMpCisvKioKKyAqIGk0MGVfZmRpciAtIEdlbmVyYXRlIGEgRmxvdyBEaXJlY3RvciBkZXNjcmlwdG9yIGJhc2VkIG9uIGZkYXRhCisgKiBAdHhfcmluZzogVHggcmluZyB0byBzZW5kIGJ1ZmZlciBvbgorICogQGZkYXRhOiBGbG93IGRpcmVjdG9yIGZpbHRlciBkYXRhCisgKiBAYWRkOiBJbmRpY2F0ZSBpZiB3ZSBhcmUgYWRkaW5nIGEgcnVsZSBvciBkZWxldGluZyBvbmUKKyAqCisgKiovCitzdGF0aWMgdm9pZCBpNDBlX2ZkaXIoc3RydWN0IGk0MGVfcmluZyAqdHhfcmluZywKKwkJICAgICAgc3RydWN0IGk0MGVfZmRpcl9maWx0ZXIgKmZkYXRhLCBib29sIGFkZCkKK3sKKwlzdHJ1Y3QgaTQwZV9maWx0ZXJfcHJvZ3JhbV9kZXNjICpmZGlyX2Rlc2M7CisJc3RydWN0IGk0MGVfcGYgKnBmID0gdHhfcmluZy0+dnNpLT5iYWNrOworCXUzMiBmbGV4X3B0eXBlLCBkdHlwZV9jbWQ7CisJdTE2IGk7CisKKwkvKiBncmFiIHRoZSBuZXh0IGRlc2NyaXB0b3IgKi8KKwlpID0gdHhfcmluZy0+bmV4dF90b191c2U7CisJZmRpcl9kZXNjID0gSTQwRV9UWF9GRElSREVTQyh0eF9yaW5nLCBpKTsKKworCWkrKzsKKwl0eF9yaW5nLT5uZXh0X3RvX3VzZSA9IChpIDwgdHhfcmluZy0+Y291bnQpID8gaSA6IDA7CisKKwlmbGV4X3B0eXBlID0gSTQwRV9UWERfRkxUUl9RVzBfUUlOREVYX01BU0sgJgorCQkgICAgIChmZGF0YS0+cV9pbmRleCA8PCBJNDBFX1RYRF9GTFRSX1FXMF9RSU5ERVhfU0hJRlQpOworCisJZmxleF9wdHlwZSB8PSBJNDBFX1RYRF9GTFRSX1FXMF9GTEVYT0ZGX01BU0sgJgorCQkgICAgICAoZmRhdGEtPmZsZXhfb2ZmIDw8IEk0MEVfVFhEX0ZMVFJfUVcwX0ZMRVhPRkZfU0hJRlQpOworCisJZmxleF9wdHlwZSB8PSBJNDBFX1RYRF9GTFRSX1FXMF9QQ1RZUEVfTUFTSyAmCisJCSAgICAgIChmZGF0YS0+cGN0eXBlIDw8IEk0MEVfVFhEX0ZMVFJfUVcwX1BDVFlQRV9TSElGVCk7CisKKwkvKiBVc2UgTEFOIFZTSSBJZCBpZiBub3QgcHJvZ3JhbW1lZCBieSB1c2VyICovCisJZmxleF9wdHlwZSB8PSBJNDBFX1RYRF9GTFRSX1FXMF9ERVNUX1ZTSV9NQVNLICYKKwkJICAgICAgKCh1MzIpKGZkYXRhLT5kZXN0X3ZzaSA/IDogcGYtPnZzaVtwZi0+bGFuX3ZzaV0tPmlkKSA8PAorCQkgICAgICAgSTQwRV9UWERfRkxUUl9RVzBfREVTVF9WU0lfU0hJRlQpOworCisJZHR5cGVfY21kID0gSTQwRV9UWF9ERVNDX0RUWVBFX0ZJTFRFUl9QUk9HOworCisJZHR5cGVfY21kIHw9IGFkZCA/CisJCSAgICAgSTQwRV9GSUxURVJfUFJPR1JBTV9ERVNDX1BDTURfQUREX1VQREFURSA8PAorCQkgICAgIEk0MEVfVFhEX0ZMVFJfUVcxX1BDTURfU0hJRlQgOgorCQkgICAgIEk0MEVfRklMVEVSX1BST0dSQU1fREVTQ19QQ01EX1JFTU9WRSA8PAorCQkgICAgIEk0MEVfVFhEX0ZMVFJfUVcxX1BDTURfU0hJRlQ7CisKKwlkdHlwZV9jbWQgfD0gSTQwRV9UWERfRkxUUl9RVzFfREVTVF9NQVNLICYKKwkJICAgICAoZmRhdGEtPmRlc3RfY3RsIDw8IEk0MEVfVFhEX0ZMVFJfUVcxX0RFU1RfU0hJRlQpOworCisJZHR5cGVfY21kIHw9IEk0MEVfVFhEX0ZMVFJfUVcxX0ZEX1NUQVRVU19NQVNLICYKKwkJICAgICAoZmRhdGEtPmZkX3N0YXR1cyA8PCBJNDBFX1RYRF9GTFRSX1FXMV9GRF9TVEFUVVNfU0hJRlQpOworCisJaWYgKGZkYXRhLT5jbnRfaW5kZXgpIHsKKwkJZHR5cGVfY21kIHw9IEk0MEVfVFhEX0ZMVFJfUVcxX0NOVF9FTkFfTUFTSzsKKwkJZHR5cGVfY21kIHw9IEk0MEVfVFhEX0ZMVFJfUVcxX0NOVElOREVYX01BU0sgJgorCQkJICAgICAoKHUzMilmZGF0YS0+Y250X2luZGV4IDw8CisJCQkgICAgICBJNDBFX1RYRF9GTFRSX1FXMV9DTlRJTkRFWF9TSElGVCk7CisJfQorCisJZmRpcl9kZXNjLT5xaW5kZXhfZmxleF9wdHlwZV92c2kgPSBjcHVfdG9fbGUzMihmbGV4X3B0eXBlKTsKKwlmZGlyX2Rlc2MtPnJzdmQgPSBjcHVfdG9fbGUzMigwKTsKKwlmZGlyX2Rlc2MtPmR0eXBlX2NtZF9jbnRpbmRleCA9IGNwdV90b19sZTMyKGR0eXBlX2NtZCk7CisJZmRpcl9kZXNjLT5mZF9pZCA9IGNwdV90b19sZTMyKGZkYXRhLT5mZF9pZCk7Cit9CisKICNkZWZpbmUgSTQwRV9GRF9DTEVBTl9ERUxBWSAxMAogLyoqCiAgKiBpNDBlX3Byb2dyYW1fZmRpcl9maWx0ZXIgLSBQcm9ncmFtIGEgRmxvdyBEaXJlY3RvciBmaWx0ZXIKQEAgLTQ4LDE0ICsxMTEsMTMgQEAKICAqIEBwZjogVGhlIFBGIHBvaW50ZXIKICAqIEBhZGQ6IFRydWUgZm9yIGFkZC91cGRhdGUsIEZhbHNlIGZvciByZW1vdmUKICAqKi8KLWludCBpNDBlX3Byb2dyYW1fZmRpcl9maWx0ZXIoc3RydWN0IGk0MGVfZmRpcl9maWx0ZXIgKmZkaXJfZGF0YSwgdTggKnJhd19wYWNrZXQsCi0JCQkgICAgIHN0cnVjdCBpNDBlX3BmICpwZiwgYm9vbCBhZGQpCitzdGF0aWMgaW50IGk0MGVfcHJvZ3JhbV9mZGlyX2ZpbHRlcihzdHJ1Y3QgaTQwZV9mZGlyX2ZpbHRlciAqZmRpcl9kYXRhLAorCQkJCSAgICB1OCAqcmF3X3BhY2tldCwgc3RydWN0IGk0MGVfcGYgKnBmLAorCQkJCSAgICBib29sIGFkZCkKIHsKLQlzdHJ1Y3QgaTQwZV9maWx0ZXJfcHJvZ3JhbV9kZXNjICpmZGlyX2Rlc2M7CiAJc3RydWN0IGk0MGVfdHhfYnVmZmVyICp0eF9idWYsICpmaXJzdDsKIAlzdHJ1Y3QgaTQwZV90eF9kZXNjICp0eF9kZXNjOwogCXN0cnVjdCBpNDBlX3JpbmcgKnR4X3Jpbmc7Ci0JdW5zaWduZWQgaW50IGZwdCwgZGNjOwogCXN0cnVjdCBpNDBlX3ZzaSAqdnNpOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlkbWFfYWRkcl90IGRtYTsKQEAgLTkyLDU2ICsxNTQsOCBAQAogCiAJLyogZ3JhYiB0aGUgbmV4dCBkZXNjcmlwdG9yICovCiAJaSA9IHR4X3JpbmctPm5leHRfdG9fdXNlOwotCWZkaXJfZGVzYyA9IEk0MEVfVFhfRkRJUkRFU0ModHhfcmluZywgaSk7CiAJZmlyc3QgPSAmdHhfcmluZy0+dHhfYmlbaV07Ci0JbWVtc2V0KGZpcnN0LCAwLCBzaXplb2Yoc3RydWN0IGk0MGVfdHhfYnVmZmVyKSk7Ci0KLQl0eF9yaW5nLT5uZXh0X3RvX3VzZSA9ICgoaSArIDEpIDwgdHhfcmluZy0+Y291bnQpID8gaSArIDEgOiAwOwotCi0JZnB0ID0gKGZkaXJfZGF0YS0+cV9pbmRleCA8PCBJNDBFX1RYRF9GTFRSX1FXMF9RSU5ERVhfU0hJRlQpICYKLQkgICAgICBJNDBFX1RYRF9GTFRSX1FXMF9RSU5ERVhfTUFTSzsKLQotCWZwdCB8PSAoZmRpcl9kYXRhLT5mbGV4X29mZiA8PCBJNDBFX1RYRF9GTFRSX1FXMF9GTEVYT0ZGX1NISUZUKSAmCi0JICAgICAgIEk0MEVfVFhEX0ZMVFJfUVcwX0ZMRVhPRkZfTUFTSzsKLQotCWZwdCB8PSAoZmRpcl9kYXRhLT5wY3R5cGUgPDwgSTQwRV9UWERfRkxUUl9RVzBfUENUWVBFX1NISUZUKSAmCi0JICAgICAgIEk0MEVfVFhEX0ZMVFJfUVcwX1BDVFlQRV9NQVNLOwotCi0JLyogVXNlIExBTiBWU0kgSWQgaWYgbm90IHByb2dyYW1tZWQgYnkgdXNlciAqLwotCWlmIChmZGlyX2RhdGEtPmRlc3RfdnNpID09IDApCi0JCWZwdCB8PSAocGYtPnZzaVtwZi0+bGFuX3ZzaV0tPmlkKSA8PAotCQkgICAgICAgSTQwRV9UWERfRkxUUl9RVzBfREVTVF9WU0lfU0hJRlQ7Ci0JZWxzZQotCQlmcHQgfD0gKCh1MzIpZmRpcl9kYXRhLT5kZXN0X3ZzaSA8PAotCQkJSTQwRV9UWERfRkxUUl9RVzBfREVTVF9WU0lfU0hJRlQpICYKLQkJICAgICAgIEk0MEVfVFhEX0ZMVFJfUVcwX0RFU1RfVlNJX01BU0s7Ci0KLQlkY2MgPSBJNDBFX1RYX0RFU0NfRFRZUEVfRklMVEVSX1BST0c7Ci0KLQlpZiAoYWRkKQotCQlkY2MgfD0gSTQwRV9GSUxURVJfUFJPR1JBTV9ERVNDX1BDTURfQUREX1VQREFURSA8PAotCQkgICAgICAgSTQwRV9UWERfRkxUUl9RVzFfUENNRF9TSElGVDsKLQllbHNlCi0JCWRjYyB8PSBJNDBFX0ZJTFRFUl9QUk9HUkFNX0RFU0NfUENNRF9SRU1PVkUgPDwKLQkJICAgICAgIEk0MEVfVFhEX0ZMVFJfUVcxX1BDTURfU0hJRlQ7Ci0KLQlkY2MgfD0gKGZkaXJfZGF0YS0+ZGVzdF9jdGwgPDwgSTQwRV9UWERfRkxUUl9RVzFfREVTVF9TSElGVCkgJgotCSAgICAgICBJNDBFX1RYRF9GTFRSX1FXMV9ERVNUX01BU0s7Ci0KLQlkY2MgfD0gKGZkaXJfZGF0YS0+ZmRfc3RhdHVzIDw8IEk0MEVfVFhEX0ZMVFJfUVcxX0ZEX1NUQVRVU19TSElGVCkgJgotCSAgICAgICBJNDBFX1RYRF9GTFRSX1FXMV9GRF9TVEFUVVNfTUFTSzsKLQotCWlmIChmZGlyX2RhdGEtPmNudF9pbmRleCAhPSAwKSB7Ci0JCWRjYyB8PSBJNDBFX1RYRF9GTFRSX1FXMV9DTlRfRU5BX01BU0s7Ci0JCWRjYyB8PSAoKHUzMilmZGlyX2RhdGEtPmNudF9pbmRleCA8PAotCQkJSTQwRV9UWERfRkxUUl9RVzFfQ05USU5ERVhfU0hJRlQpICYKLQkJCUk0MEVfVFhEX0ZMVFJfUVcxX0NOVElOREVYX01BU0s7Ci0JfQotCi0JZmRpcl9kZXNjLT5xaW5kZXhfZmxleF9wdHlwZV92c2kgPSBjcHVfdG9fbGUzMihmcHQpOwotCWZkaXJfZGVzYy0+cnN2ZCA9IGNwdV90b19sZTMyKDApOwotCWZkaXJfZGVzYy0+ZHR5cGVfY21kX2NudGluZGV4ID0gY3B1X3RvX2xlMzIoZGNjKTsKLQlmZGlyX2Rlc2MtPmZkX2lkID0gY3B1X3RvX2xlMzIoZmRpcl9kYXRhLT5mZF9pZCk7CisJaTQwZV9mZGlyKHR4X3JpbmcsIGZkaXJfZGF0YSwgYWRkKTsKIAogCS8qIE5vdyBwcm9ncmFtIGEgZHVtbXkgZGVzY3JpcHRvciAqLwogCWkgPSB0eF9yaW5nLT5uZXh0X3RvX3VzZTsKQEAgLTI4MiwxOCArMjk2LDE4IEBACiAKIAlpZiAoYWRkKSB7CiAJCXBmLT5mZF90Y3BfcnVsZSsrOwotCQlpZiAocGYtPmZsYWdzICYgSTQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEKSB7Ci0JCQlpZiAoSTQwRV9ERUJVR19GRCAmIHBmLT5ody5kZWJ1Z19tYXNrKQotCQkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiRm9yY2luZyBBVFIgb2ZmLCBzaWRlYmFuZCBydWxlcyBmb3IgVENQL0lQdjQgZmxvdyBiZWluZyBhcHBsaWVkXG4iKTsKLQkJCXBmLT5mbGFncyAmPSB+STQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEOwotCQl9CisJCWlmICgocGYtPmZsYWdzICYgSTQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEKSAmJgorCQkgICAgSTQwRV9ERUJVR19GRCAmIHBmLT5ody5kZWJ1Z19tYXNrKQorCQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJGb3JjaW5nIEFUUiBvZmYsIHNpZGViYW5kIHJ1bGVzIGZvciBUQ1AvSVB2NCBmbG93IGJlaW5nIGFwcGxpZWRcbiIpOworCQlwZi0+YXV0b19kaXNhYmxlX2ZsYWdzIHw9IEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRDsKIAl9IGVsc2UgewogCQlwZi0+ZmRfdGNwX3J1bGUgPSAocGYtPmZkX3RjcF9ydWxlID4gMCkgPwogCQkJCSAgKHBmLT5mZF90Y3BfcnVsZSAtIDEpIDogMDsKIAkJaWYgKHBmLT5mZF90Y3BfcnVsZSA9PSAwKSB7Ci0JCQlwZi0+ZmxhZ3MgfD0gSTQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEOwotCQkJaWYgKEk0MEVfREVCVUdfRkQgJiBwZi0+aHcuZGVidWdfbWFzaykKKwkJCWlmICgocGYtPmZsYWdzICYgSTQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEKSAmJgorCQkJICAgIEk0MEVfREVCVUdfRkQgJiBwZi0+aHcuZGVidWdfbWFzaykKIAkJCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIkFUUiByZS1lbmFibGVkIGR1ZSB0byBubyBzaWRlYmFuZCBUQ1AvSVB2NCBydWxlc1xuIik7CisJCQlwZi0+YXV0b19kaXNhYmxlX2ZsYWdzICY9IH5JNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQ7CiAJCX0KIAl9CiAKQEAgLTUzMiw3ICs1NDYsMTAgQEAKIAkJCQkJICAgIHN0cnVjdCBpNDBlX3R4X2J1ZmZlciAqdHhfYnVmZmVyKQogewogCWlmICh0eF9idWZmZXItPnNrYikgewotCQlkZXZfa2ZyZWVfc2tiX2FueSh0eF9idWZmZXItPnNrYik7CisJCWlmICh0eF9idWZmZXItPnR4X2ZsYWdzICYgSTQwRV9UWF9GTEFHU19GRF9TQikKKwkJCWtmcmVlKHR4X2J1ZmZlci0+cmF3X2J1Zik7CisJCWVsc2UKKwkJCWRldl9rZnJlZV9za2JfYW55KHR4X2J1ZmZlci0+c2tiKTsKIAkJaWYgKGRtYV91bm1hcF9sZW4odHhfYnVmZmVyLCBsZW4pKQogCQkJZG1hX3VubWFwX3NpbmdsZShyaW5nLT5kZXYsCiAJCQkJCSBkbWFfdW5tYXBfYWRkcih0eF9idWZmZXIsIGRtYSksCkBAIC01NDUsOSArNTYyLDYgQEAKIAkJCSAgICAgICBETUFfVE9fREVWSUNFKTsKIAl9CiAKLQlpZiAodHhfYnVmZmVyLT50eF9mbGFncyAmIEk0MEVfVFhfRkxBR1NfRkRfU0IpCi0JCWtmcmVlKHR4X2J1ZmZlci0+cmF3X2J1Zik7Ci0KIAl0eF9idWZmZXItPm5leHRfdG9fd2F0Y2ggPSBOVUxMOwogCXR4X2J1ZmZlci0+c2tiID0gTlVMTDsKIAlkbWFfdW5tYXBfbGVuX3NldCh0eF9idWZmZXIsIGxlbiwgMCk7CkBAIC01ODQsOCArNTk4LDcgQEAKIAkJcmV0dXJuOwogCiAJLyogY2xlYW51cCBUeCBxdWV1ZSBzdGF0aXN0aWNzICovCi0JbmV0ZGV2X3R4X3Jlc2V0X3F1ZXVlKG5ldGRldl9nZXRfdHhfcXVldWUodHhfcmluZy0+bmV0ZGV2LAotCQkJCQkJICB0eF9yaW5nLT5xdWV1ZV9pbmRleCkpOworCW5ldGRldl90eF9yZXNldF9xdWV1ZSh0eHJpbmdfdHhxKHR4X3JpbmcpKTsKIH0KIAogLyoqCkBAIC03NTQsOCArNzY3LDggQEAKIAkJCXR4X3JpbmctPmFybV93YiA9IHRydWU7CiAJfQogCi0JbmV0ZGV2X3R4X2NvbXBsZXRlZF9xdWV1ZShuZXRkZXZfZ2V0X3R4X3F1ZXVlKHR4X3JpbmctPm5ldGRldiwKLQkJCQkJCSAgICAgIHR4X3JpbmctPnF1ZXVlX2luZGV4KSwKKwkvKiBub3RpZnkgbmV0ZGV2IG9mIGNvbXBsZXRlZCBidWZmZXJzICovCisJbmV0ZGV2X3R4X2NvbXBsZXRlZF9xdWV1ZSh0eHJpbmdfdHhxKHR4X3JpbmcpLAogCQkJCSAgdG90YWxfcGFja2V0cywgdG90YWxfYnl0ZXMpOwogCiAjZGVmaW5lIFRYX1dBS0VfVEhSRVNIT0xEIChERVNDX05FRURFRCAqIDIpCkBAIC0xODY0LDYgKzE4NzcsMTUgQEAKIAogLyogYSBzbWFsbCBtYWNybyB0byBzaG9ydGVuIHVwIHNvbWUgbG9uZyBsaW5lcyAqLwogI2RlZmluZSBJTlRSRUcgSTQwRV9QRklOVF9EWU5fQ1RMTgorc3RhdGljIGlubGluZSBpbnQgZ2V0X3J4X2l0cl9lbmFibGVkKHN0cnVjdCBpNDBlX3ZzaSAqdnNpLCBpbnQgaWR4KQoreworCXJldHVybiAhISh2c2ktPnJ4X3JpbmdzW2lkeF0tPnJ4X2l0cl9zZXR0aW5nKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0X3R4X2l0cl9lbmFibGVkKHN0cnVjdCBpNDBlX3ZzaSAqdnNpLCBpbnQgaWR4KQoreworCXJldHVybiAhISh2c2ktPnR4X3JpbmdzW2lkeF0tPnR4X2l0cl9zZXR0aW5nKTsKK30KIAogLyoqCiAgKiBpNDBlX3VwZGF0ZV9lbmFibGVfaXRyIC0gVXBkYXRlIGl0ciBhbmQgcmUtZW5hYmxlIE1TSVggaW50ZXJydXB0CkBAIC0xODc5LDYgKzE5MDEsNyBAQAogCXUzMiByeHZhbCwgdHh2YWw7CiAJaW50IHZlY3RvcjsKIAlpbnQgaWR4ID0gcV92ZWN0b3ItPnZfaWR4OworCWludCByeF9pdHJfc2V0dGluZywgdHhfaXRyX3NldHRpbmc7CiAKIAl2ZWN0b3IgPSAocV92ZWN0b3ItPnZfaWR4ICsgdnNpLT5iYXNlX3ZlY3Rvcik7CiAKQEAgLTE4ODcsMTggKzE5MTAsMjEgQEAKIAkgKi8KIAlyeHZhbCA9IHR4dmFsID0gaTQwZV9idWlsZHJlZ19pdHIoSTQwRV9JVFJfTk9ORSwgMCk7CiAKKwlyeF9pdHJfc2V0dGluZyA9IGdldF9yeF9pdHJfZW5hYmxlZCh2c2ksIGlkeCk7CisJdHhfaXRyX3NldHRpbmcgPSBnZXRfdHhfaXRyX2VuYWJsZWQodnNpLCBpZHgpOworCiAJaWYgKHFfdmVjdG9yLT5pdHJfY291bnRkb3duID4gMCB8fAotCSAgICAoIUlUUl9JU19EWU5BTUlDKHZzaS0+cnhfcmluZ3NbaWR4XS0+cnhfaXRyX3NldHRpbmcpICYmCi0JICAgICAhSVRSX0lTX0RZTkFNSUModnNpLT50eF9yaW5nc1tpZHhdLT50eF9pdHJfc2V0dGluZykpKSB7CisJICAgICghSVRSX0lTX0RZTkFNSUMocnhfaXRyX3NldHRpbmcpICYmCisJICAgICAhSVRSX0lTX0RZTkFNSUModHhfaXRyX3NldHRpbmcpKSkgewogCQlnb3RvIGVuYWJsZV9pbnQ7CiAJfQogCi0JaWYgKElUUl9JU19EWU5BTUlDKHZzaS0+cnhfcmluZ3NbaWR4XS0+cnhfaXRyX3NldHRpbmcpKSB7CisJaWYgKElUUl9JU19EWU5BTUlDKHR4X2l0cl9zZXR0aW5nKSkgewogCQlyeCA9IGk0MGVfc2V0X25ld19keW5hbWljX2l0cigmcV92ZWN0b3ItPnJ4KTsKIAkJcnh2YWwgPSBpNDBlX2J1aWxkcmVnX2l0cihJNDBFX1JYX0lUUiwgcV92ZWN0b3ItPnJ4Lml0cik7CiAJfQogCi0JaWYgKElUUl9JU19EWU5BTUlDKHZzaS0+dHhfcmluZ3NbaWR4XS0+dHhfaXRyX3NldHRpbmcpKSB7CisJaWYgKElUUl9JU19EWU5BTUlDKHR4X2l0cl9zZXR0aW5nKSkgewogCQl0eCA9IGk0MGVfc2V0X25ld19keW5hbWljX2l0cigmcV92ZWN0b3ItPnR4KTsKIAkJdHh2YWwgPSBpNDBlX2J1aWxkcmVnX2l0cihJNDBFX1RYX0lUUiwgcV92ZWN0b3ItPnR4Lml0cik7CiAJfQpAQCAtMjYyMSw5ICsyNjQ3LDcgQEAKIAkJcmV0dXJuIGZhbHNlOwogCiAJLyogV2UgbmVlZCB0byB3YWxrIHRocm91Z2ggdGhlIGxpc3QgYW5kIHZhbGlkYXRlIHRoYXQgZWFjaCBncm91cAotCSAqIG9mIDYgZnJhZ21lbnRzIHRvdGFscyBhdCBsZWFzdCBnc29fc2l6ZS4gIEhvd2V2ZXIgd2UgZG9uJ3QgbmVlZAotCSAqIHRvIHBlcmZvcm0gc3VjaCB2YWxpZGF0aW9uIG9uIHRoZSBsYXN0IDYgc2luY2UgdGhlIGxhc3QgNiBjYW5ub3QKLQkgKiBpbmhlcml0IGFueSBkYXRhIGZyb20gYSBkZXNjcmlwdG9yIGFmdGVyIHRoZW0uCisJICogb2YgNiBmcmFnbWVudHMgdG90YWxzIGF0IGxlYXN0IGdzb19zaXplLgogCSAqLwogCW5yX2ZyYWdzIC09IEk0MEVfTUFYX0JVRkZFUl9UWEQgLSAyOwogCWZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1swXTsKQEAgLTI2NTQsOCArMjY3OCw3IEBACiAJCWlmIChzdW0gPCAwKQogCQkJcmV0dXJuIHRydWU7CiAKLQkJLyogdXNlIHByZS1kZWNyZW1lbnQgdG8gYXZvaWQgcHJvY2Vzc2luZyBsYXN0IGZyYWdtZW50ICovCi0JCWlmICghLS1ucl9mcmFncykKKwkJaWYgKCFucl9mcmFncy0tKQogCQkJYnJlYWs7CiAKIAkJc3VtIC09IHNrYl9mcmFnX3NpemUoc3RhbGUrKyk7CkBAIC0yNzg3LDkgKzI4MTAsNyBAQAogCiAJdHhfcmluZy0+bmV4dF90b191c2UgPSBpOwogCi0JbmV0ZGV2X3R4X3NlbnRfcXVldWUobmV0ZGV2X2dldF90eF9xdWV1ZSh0eF9yaW5nLT5uZXRkZXYsCi0JCQkJCQkgdHhfcmluZy0+cXVldWVfaW5kZXgpLAotCQkJCQkJIGZpcnN0LT5ieXRlY291bnQpOworCW5ldGRldl90eF9zZW50X3F1ZXVlKHR4cmluZ190eHEodHhfcmluZyksIGZpcnN0LT5ieXRlY291bnQpOwogCWk0MGVfbWF5YmVfc3RvcF90eCh0eF9yaW5nLCBERVNDX05FRURFRCk7CiAKIAkvKiBBbGdvcml0aG0gdG8gb3B0aW1pemUgdGFpbCBhbmQgUlMgYml0IHNldHRpbmc6CkBAIC0yODE0LDEzICsyODM1LDExIEBACiAJICogdHJpZ2dlciBhIGZvcmNlIFdCLgogCSAqLwogCWlmIChza2ItPnhtaXRfbW9yZSAgJiYKLQkgICAgIW5ldGlmX3htaXRfc3RvcHBlZChuZXRkZXZfZ2V0X3R4X3F1ZXVlKHR4X3JpbmctPm5ldGRldiwKLQkJCQkJCSAgICB0eF9yaW5nLT5xdWV1ZV9pbmRleCkpKSB7CisJICAgICFuZXRpZl94bWl0X3N0b3BwZWQodHhyaW5nX3R4cSh0eF9yaW5nKSkpIHsKIAkJdHhfcmluZy0+ZmxhZ3MgfD0gSTQwRV9UWFJfRkxBR1NfTEFTVF9YTUlUX01PUkVfU0VUOwogCQl0YWlsX2J1bXAgPSBmYWxzZTsKIAl9IGVsc2UgaWYgKCFza2ItPnhtaXRfbW9yZSAmJgotCQkgICAhbmV0aWZfeG1pdF9zdG9wcGVkKG5ldGRldl9nZXRfdHhfcXVldWUodHhfcmluZy0+bmV0ZGV2LAotCQkJCQkJICAgICAgIHR4X3JpbmctPnF1ZXVlX2luZGV4KSkgJiYKKwkJICAgIW5ldGlmX3htaXRfc3RvcHBlZCh0eHJpbmdfdHhxKHR4X3JpbmcpKSAmJgogCQkgICAoISh0eF9yaW5nLT5mbGFncyAmIEk0MEVfVFhSX0ZMQUdTX0xBU1RfWE1JVF9NT1JFX1NFVCkpICYmCiAJCSAgICh0eF9yaW5nLT5wYWNrZXRfc3RyaWRlIDwgV0JfU1RSSURFKSAmJgogCQkgICAoZGVzY19jb3VudCA8IFdCX1NUUklERSkpIHsKQEAgLTI4NDAsMTAgKzI4NTksOSBAQAogCQkJCQkJICBJNDBFX1RYRF9RVzFfQ01EX1NISUZUKTsKIAogCS8qIG5vdGlmeSBIVyBvZiBwYWNrZXQgKi8KLQlpZiAoIXRhaWxfYnVtcCkKKwlpZiAoIXRhaWxfYnVtcCkgewogCQlwcmVmZXRjaHcodHhfZGVzYyArIDEpOwotCi0JaWYgKHRhaWxfYnVtcCkgeworCX0gZWxzZSB7CiAJCS8qIEZvcmNlIG1lbW9yeSB3cml0ZXMgdG8gY29tcGxldGUgYmVmb3JlIGxldHRpbmcgaC93CiAJCSAqIGtub3cgdGhlcmUgYXJlIG5ldyBkZXNjcmlwdG9ycyB0byBmZXRjaC4gIChPbmx5CiAJCSAqIGFwcGxpY2FibGUgZm9yIHdlYWstb3JkZXJlZCBtZW1vcnkgbW9kZWwgYXJjaHMsCkBAIC0yODUyLDcgKzI4NzAsNiBAQAogCQl3bWIoKTsKIAkJd3JpdGVsKGksIHR4X3JpbmctPnRhaWwpOwogCX0KLQogCXJldHVybjsKIAogZG1hX2Vycm9yOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3R4cnguaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV90eHJ4LmgKaW5kZXggYjc4YzgxMC4uNTA4ODQwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3R4cnguaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdHhyeC5oCkBAIC00NjMsNCArNDYzLDEzIEBACiAJcmV0dXJuIChwdHlwZSA+PSBJNDBFX1JYX1BUWVBFX0wyX0ZDT0VfUEFZMykgJiYKIAkgICAgICAgKHB0eXBlIDw9IEk0MEVfUlhfUFRZUEVfTDJfRkNPRV9WRlRfRkNPVEhFUik7CiB9CisKKy8qKgorICogdHhyaW5nX3R4cSAtIEZpbmQgdGhlIG5ldGRldiBUeCByaW5nIGJhc2VkIG9uIHRoZSBpNDBlIFR4IHJpbmcKKyAqIEByaW5nOiBUeCByaW5nIHRvIGZpbmQgdGhlIG5ldGRldiBlcXVpdmFsZW50IG9mCisgKiovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cmluZ190eHEoY29uc3Qgc3RydWN0IGk0MGVfcmluZyAqcmluZykKK3sKKwlyZXR1cm4gbmV0ZGV2X2dldF90eF9xdWV1ZShyaW5nLT5uZXRkZXYsIHJpbmctPnF1ZXVlX2luZGV4KTsKK30KICNlbmRpZiAvKiBfSTQwRV9UWFJYX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdmlydGNobmwuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV92aXJ0Y2hubC5oCmluZGV4IGM5MmEzYmQuLmY4NjFkMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV92aXJ0Y2hubC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV92aXJ0Y2hubC5oCkBAIC0xNjMsNiArMTYzLDcgQEAKICNkZWZpbmUgSTQwRV9WSVJUQ0hOTF9WRl9PRkZMT0FEX1JYX1BPTExJTkcJMHgwMDAyMDAwMAogI2RlZmluZSBJNDBFX1ZJUlRDSE5MX1ZGX09GRkxPQURfUlNTX1BDVFlQRV9WMgkweDAwMDQwMDAwCiAjZGVmaW5lIEk0MEVfVklSVENITkxfVkZfT0ZGTE9BRF9SU1NfUEYJCTBYMDAwODAwMDAKKyNkZWZpbmUgSTQwRV9WSVJUQ0hOTF9WRl9PRkZMT0FEX0VOQ0FQX0NTVU0JMFgwMDEwMDAwMAogCiBzdHJ1Y3QgaTQwZV92aXJ0Y2hubF92Zl9yZXNvdXJjZSB7CiAJdTE2IG51bV92c2lzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3ZpcnRjaG5sX3BmLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdmlydGNobmxfcGYuYwppbmRleCA2ZmNiZjc2Li41NGI4ZWUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdmlydGNobmxfcGYuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdmlydGNobmxfcGYuYwpAQCAtNTAyLDggKzUwMiwxNiBAQAogCXUzMiBxdHhfY3RsOwogCWludCByZXQgPSAwOwogCisJaWYgKCFpNDBlX3ZjX2lzdmFsaWRfdnNpX2lkKHZmLCBpbmZvLT52c2lfaWQpKSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyb3JfY29udGV4dDsKKwl9CiAJcGZfcXVldWVfaWQgPSBpNDBlX3ZjX2dldF9wZl9xdWV1ZV9pZCh2ZiwgdnNpX2lkLCB2c2lfcXVldWVfaWQpOwogCXZzaSA9IGk0MGVfZmluZF92c2lfZnJvbV9pZChwZiwgdnNpX2lkKTsKKwlpZiAoIXZzaSkgeworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGVycm9yX2NvbnRleHQ7CisJfQogCiAJLyogY2xlYXIgdGhlIGNvbnRleHQgc3RydWN0dXJlIGZpcnN0ICovCiAJbWVtc2V0KCZ0eF9jdHgsIDAsIHNpemVvZihzdHJ1Y3QgaTQwZV9obWNfb2JqX3R4cSkpOwpAQCAtOTkxLDcgKzk5OSwxMCBAQAogCQlpNDBlX2VuYWJsZV92Zl9tYXBwaW5ncyh2Zik7CiAJCXNldF9iaXQoSTQwRV9WRl9TVEFUX0FDVElWRSwgJnZmLT52Zl9zdGF0ZXMpOwogCQljbGVhcl9iaXQoSTQwRV9WRl9TVEFUX0RJU0FCTEVELCAmdmYtPnZmX3N0YXRlcyk7Ci0JCWk0MGVfbm90aWZ5X2NsaWVudF9vZl92Zl9yZXNldChwZiwgYWJzX3ZmX2lkKTsKKwkJLyogRG8gbm90IG5vdGlmeSB0aGUgY2xpZW50IGR1cmluZyBWRiBpbml0ICovCisJCWlmICh2Zi0+cGYtPm51bV9hbGxvY192ZnMpCisJCQlpNDBlX25vdGlmeV9jbGllbnRfb2ZfdmZfcmVzZXQocGYsIGFic192Zl9pZCk7CisJCXZmLT5udW1fdmxhbiA9IDA7CiAJfQogCS8qIHRlbGwgdGhlIFZGIHRoZSByZXNldCBpcyBkb25lICovCiAJd3IzMihodywgSTQwRV9WRkdFTl9SU1RBVDEodmYtPnZmX2lkKSwgSTQwRV9WRlJfVkZBQ1RJVkUpOwpAQCAtMTA4OSw3ICsxMTAwLDYgQEAKIAkJCWdvdG8gZXJyX2lvdjsKIAkJfQogCX0KLQlpNDBlX25vdGlmeV9jbGllbnRfb2ZfdmZfZW5hYmxlKHBmLCBudW1fYWxsb2NfdmZzKTsKIAkvKiBhbGxvY2F0ZSBtZW1vcnkgKi8KIAl2ZnMgPSBrY2FsbG9jKG51bV9hbGxvY192ZnMsIHNpemVvZihzdHJ1Y3QgaTQwZV92ZiksIEdGUF9LRVJORUwpOwogCWlmICghdmZzKSB7CkBAIC0xMTEzLDYgKzExMjMsOCBAQAogCX0KIAlwZi0+bnVtX2FsbG9jX3ZmcyA9IG51bV9hbGxvY192ZnM7CiAKKwlpNDBlX25vdGlmeV9jbGllbnRfb2ZfdmZfZW5hYmxlKHBmLCBudW1fYWxsb2NfdmZzKTsKKwogZXJyX2FsbG9jOgogCWlmIChyZXQpCiAJCWk0MGVfZnJlZV92ZnMocGYpOwpAQCAtMTQ3Miw3ICsxNDg0LDggQEAKIAogCXZzaSA9IGk0MGVfZmluZF92c2lfZnJvbV9pZChwZiwgaW5mby0+dnNpX2lkKTsKIAlpZiAoIXRlc3RfYml0KEk0MEVfVkZfU1RBVF9BQ1RJVkUsICZ2Zi0+dmZfc3RhdGVzKSB8fAotCSAgICAhaTQwZV92Y19pc3ZhbGlkX3ZzaV9pZCh2ZiwgaW5mby0+dnNpX2lkKSkgeworCSAgICAhaTQwZV92Y19pc3ZhbGlkX3ZzaV9pZCh2ZiwgaW5mby0+dnNpX2lkKSB8fAorCSAgICAhdnNpKSB7CiAJCWFxX3JldCA9IEk0MEVfRVJSX1BBUkFNOwogCQlnb3RvIGVycm9yX3BhcmFtOwogCX0KQEAgLTIyMTMsOCArMjIyNiw4IEBACiBlcnJvcl9wYXJhbToKIAkvKiBzZW5kIHRoZSByZXNwb25zZSB0byB0aGUgVkYgKi8KIAlyZXR1cm4gaTQwZV92Y19zZW5kX3Jlc3BfdG9fdmYodmYsCi0JCQkgICAgICAgY29uZmlnID8gSTQwRV9WSVJUQ0hOTF9PUF9SRUxFQVNFX0lXQVJQX0lSUV9NQVAgOgotCQkJICAgICAgIEk0MEVfVklSVENITkxfT1BfQ09ORklHX0lXQVJQX0lSUV9NQVAsCisJCQkgICAgICAgY29uZmlnID8gSTQwRV9WSVJUQ0hOTF9PUF9DT05GSUdfSVdBUlBfSVJRX01BUCA6CisJCQkgICAgICAgSTQwRV9WSVJUQ0hOTF9PUF9SRUxFQVNFX0lXQVJQX0lSUV9NQVAsCiAJCQkgICAgICAgYXFfcmV0KTsKIH0KIApAQCAtMjMxNCw2ICsyMzI3LDcgQEAKIAkvKiBzZW5kIHRoZSByZXNwb25zZSBiYWNrIHRvIHRoZSBWRiAqLwogCWFxX3JldCA9IGk0MGVfdmNfc2VuZF9tc2dfdG9fdmYodmYsIEk0MEVfVklSVENITkxfT1BfR0VUX1JTU19IRU5BX0NBUFMsCiAJCQkJCWFxX3JldCwgKHU4ICopdnJoLCBsZW4pOworCWtmcmVlKHZyaCk7CiAJcmV0dXJuIGFxX3JldDsKIH0KIApAQCAtMjc0MiwxMSArMjc1NiwxMiBAQAogICogQHZmX2lkOiBWRiBpZGVudGlmaWVyCiAgKiBAdmxhbl9pZDogbWFjIGFkZHJlc3MKICAqIEBxb3M6IHByaW9yaXR5IHNldHRpbmcKKyAqIEB2bGFuX3Byb3RvOiB2bGFuIHByb3RvY29sCiAgKgogICogcHJvZ3JhbSBWRiB2bGFuIGlkIGFuZC9vciBxb3MKICAqKi8KLWludCBpNDBlX25kb19zZXRfdmZfcG9ydF92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkgICAgICBpbnQgdmZfaWQsIHUxNiB2bGFuX2lkLCB1OCBxb3MpCitpbnQgaTQwZV9uZG9fc2V0X3ZmX3BvcnRfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmZfaWQsCisJCQkgICAgICB1MTYgdmxhbl9pZCwgdTggcW9zLCBfX2JlMTYgdmxhbl9wcm90bykKIHsKIAl1MTYgdmxhbnByaW8gPSB2bGFuX2lkIHwgKHFvcyA8PCBJNDBFX1ZMQU5fUFJJT1JJVFlfU0hJRlQpOwogCXN0cnVjdCBpNDBlX25ldGRldl9wcml2ICpucCA9IG5ldGRldl9wcml2KG5ldGRldik7CkBAIC0yNzY5LDYgKzI3ODQsMTIgQEAKIAkJZ290byBlcnJvcl9wdmlkOwogCX0KIAorCWlmICh2bGFuX3Byb3RvICE9IGh0b25zKEVUSF9QXzgwMjFRKSkgeworCQlkZXZfZXJyKCZwZi0+cGRldi0+ZGV2LCAiVkYgVkxBTiBwcm90b2NvbCBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0ID0gLUVQUk9UT05PU1VQUE9SVDsKKwkJZ290byBlcnJvcl9wdmlkOworCX0KKwogCXZmID0gJihwZi0+dmZbdmZfaWRdKTsKIAl2c2kgPSBwZi0+dnNpW3ZmLT5sYW5fdnNpX2lkeF07CiAJaWYgKCF0ZXN0X2JpdChJNDBFX1ZGX1NUQVRfSU5JVCwgJnZmLT52Zl9zdGF0ZXMpKSB7CkBAIC0yOTk1LDYgKzMwMTYsNyBAQAogCWVsc2UKIAkJaXZpLT5saW5rc3RhdGUgPSBJRkxBX1ZGX0xJTktfU1RBVEVfRElTQUJMRTsKIAlpdmktPnNwb29mY2hrID0gdmYtPnNwb29mY2hrOworCWl2aS0+dHJ1c3RlZCA9IHZmLT50cnVzdGVkOwogCXJldCA9IDA7CiAKIGVycm9yX3BhcmFtOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3ZpcnRjaG5sX3BmLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdmlydGNobmxfcGYuaAppbmRleCA4NzUxNzQxLi40MDEyZDA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdmlydGNobmxfcGYuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdmlydGNobmxfcGYuaApAQCAtMTI5LDggKzEyOSw4IEBACiAKIC8qIFZGIGNvbmZpZ3VyYXRpb24gcmVsYXRlZCBpcGxpbmsgaGFuZGxlcnMgKi8KIGludCBpNDBlX25kb19zZXRfdmZfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2Zl9pZCwgdTggKm1hYyk7Ci1pbnQgaTQwZV9uZG9fc2V0X3ZmX3BvcnRfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJICAgICAgaW50IHZmX2lkLCB1MTYgdmxhbl9pZCwgdTggcW9zKTsKK2ludCBpNDBlX25kb19zZXRfdmZfcG9ydF92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2Zl9pZCwKKwkJCSAgICAgIHUxNiB2bGFuX2lkLCB1OCBxb3MsIF9fYmUxNiB2bGFuX3Byb3RvKTsKIGludCBpNDBlX25kb19zZXRfdmZfYncoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmX2lkLCBpbnQgbWluX3R4X3JhdGUsCiAJCSAgICAgICBpbnQgbWF4X3R4X3JhdGUpOwogaW50IGk0MGVfbmRvX3NldF92Zl90cnVzdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmZfaWQsIGJvb2wgc2V0dGluZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9hZG1pbnFfY21kLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9hZG1pbnFfY21kLmgKaW5kZXggMzExNGRjZi4uNDBiMGVhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfYWRtaW5xX2NtZC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX2FkbWlucV9jbWQuaApAQCAtMjA0LDYgKzIwNCw5IEBACiAJaTQwZV9hcWNfb3BjX3N1c3BlbmRfcG9ydF90eAkJCQk9IDB4MDQxQiwKIAlpNDBlX2FxY19vcGNfcmVzdW1lX3BvcnRfdHgJCQkJPSAweDA0MUMsCiAJaTQwZV9hcWNfb3BjX2NvbmZpZ3VyZV9wYXJ0aXRpb25fYncJCQk9IDB4MDQxRCwKKwkvKiBobWMgKi8KKwlpNDBlX2FxY19vcGNfcXVlcnlfaG1jX3Jlc291cmNlX3Byb2ZpbGUJPSAweDA1MDAsCisJaTQwZV9hcWNfb3BjX3NldF9obWNfcmVzb3VyY2VfcHJvZmlsZQk9IDB4MDUwMSwKIAogCS8qIHBoeSBjb21tYW5kcyovCiAJaTQwZV9hcWNfb3BjX2dldF9waHlfYWJpbGl0aWVzCQk9IDB4MDYwMCwKQEAgLTQ0NywxMyArNDUwLDE1IEBACiAvKiBTZXQgQVJQIFByb3h5IGNvbW1hbmQgLyByZXNwb25zZSAoaW5kaXJlY3QgMHgwMTA0KSAqLwogc3RydWN0IGk0MGVfYXFjX2FycF9wcm94eV9kYXRhIHsKIAlfX2xlMTYJY29tbWFuZF9mbGFnczsKLSNkZWZpbmUgSTQwRV9BUV9BUlBfSU5JVF9JUFY0CTB4MDAwOAotI2RlZmluZSBJNDBFX0FRX0FSUF9VTlNVUF9DVEwJMHgwMDEwCi0jZGVmaW5lIEk0MEVfQVFfQVJQX0VOQQkJMHgwMDIwCi0jZGVmaW5lIEk0MEVfQVFfQVJQX0FERF9JUFY0CTB4MDA0MAotI2RlZmluZSBJNDBFX0FRX0FSUF9ERUxfSVBWNAkweDAwODAKKyNkZWZpbmUgSTQwRV9BUV9BUlBfSU5JVF9JUFY0CTB4MDgwMAorI2RlZmluZSBJNDBFX0FRX0FSUF9VTlNVUF9DVEwJMHgxMDAwCisjZGVmaW5lIEk0MEVfQVFfQVJQX0VOQQkJMHgyMDAwCisjZGVmaW5lIEk0MEVfQVFfQVJQX0FERF9JUFY0CTB4NDAwMAorI2RlZmluZSBJNDBFX0FRX0FSUF9ERUxfSVBWNAkweDgwMDAKIAlfX2xlMTYJdGFibGVfaWQ7Ci0JX19sZTMyCXBmcG1fcHJveHlmYzsKKwlfX2xlMzIJZW5hYmxlZF9vZmZsb2FkczsKKyNkZWZpbmUgSTQwRV9BUV9BUlBfRElSRUNURURfT0ZGTE9BRF9FTkFCTEUJMHgwMDAwMDAyMAorI2RlZmluZSBJNDBFX0FRX0FSUF9PRkZMT0FEX0VOQUJMRQkJMHgwMDAwMDgwMAogCV9fbGUzMglpcF9hZGRyOwogCXU4CW1hY19hZGRyWzZdOwogCXU4CXJlc2VydmVkWzJdOwpAQCAtNDY4LDE3ICs0NzMsMTkgQEAKIAlfX2xlMTYJdGFibGVfaWR4X2lwdjZfMDsKIAlfX2xlMTYJdGFibGVfaWR4X2lwdjZfMTsKIAlfX2xlMTYJY29udHJvbDsKLSNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9BRERfMAkJMHgwMTAwCi0jZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfREVMXzAJCTB4MDIwMAotI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0FERF8xCQkweDA0MDAKLSNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9ERUxfMQkJMHgwODAwCi0jZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfQUREX0lQVjZfMAkweDEwMDAKLSNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9ERUxfSVBWNl8wCTB4MjAwMAotI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0FERF9JUFY2XzEJMHg0MDAwCi0jZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfREVMX0lQVjZfMQkweDgwMDAKLSNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9DT01NQU5EX1NFUQkweDAwMDEKLSNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9JTklUX0lQVjZfVEJMCTB4MDAwMgotI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0lOSVRfTUFDX1RCTAkweDAwMDQKKyNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9BRERfMAkJMHgwMDAxCisjZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfREVMXzAJCTB4MDAwMgorI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0FERF8xCQkweDAwMDQKKyNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9ERUxfMQkJMHgwMDA4CisjZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfQUREX0lQVjZfMAkweDAwMTAKKyNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9ERUxfSVBWNl8wCTB4MDAyMAorI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0FERF9JUFY2XzEJMHgwMDQwCisjZGVmaW5lIEk0MEVfQVFfTlNfUFJPWFlfREVMX0lQVjZfMQkweDAwODAKKyNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9DT01NQU5EX1NFUQkweDAxMDAKKyNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9JTklUX0lQVjZfVEJMCTB4MDIwMAorI2RlZmluZSBJNDBFX0FRX05TX1BST1hZX0lOSVRfTUFDX1RCTAkweDA0MDAKKyNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9PRkZMT0FEX0VOQUJMRQkweDA4MDAKKyNkZWZpbmUgSTQwRV9BUV9OU19QUk9YWV9ESVJFQ1RFRF9PRkZMT0FEX0VOQUJMRQkweDEwMDAKIAl1OAltYWNfYWRkcl8wWzZdOwogCXU4CW1hY19hZGRyXzFbNl07CiAJdTgJbG9jYWxfbWFjX2FkZHJbNl07CkBAIC0xNTc5LDYgKzE1ODYsMjQgQEAKIAogSTQwRV9DSEVDS19TVFJVQ1RfTEVOKDB4MjIsIGk0MGVfYXFjX2NvbmZpZ3VyZV9wYXJ0aXRpb25fYndfZGF0YSk7CiAKKy8qIEdldCBhbmQgc2V0IHRoZSBhY3RpdmUgSE1DIHJlc291cmNlIHByb2ZpbGUgYW5kIHN0YXR1cy4KKyAqIChkaXJlY3QgMHgwNTAwKSBhbmQgKGRpcmVjdCAweDA1MDEpCisgKi8KK3N0cnVjdCBpNDBlX2FxX2dldF9zZXRfaG1jX3Jlc291cmNlX3Byb2ZpbGUgeworCXU4CXBtX3Byb2ZpbGU7CisJdTgJcGVfdmZfZW5hYmxlZDsKKwl1OAlyZXNlcnZlZFsxNF07Cit9OworCitJNDBFX0NIRUNLX0NNRF9MRU5HVEgoaTQwZV9hcV9nZXRfc2V0X2htY19yZXNvdXJjZV9wcm9maWxlKTsKKworZW51bSBpNDBlX2FxX2htY19wcm9maWxlIHsKKwkvKiBJNDBFX0hNQ19QUk9GSUxFX05PX0NIQU5HRQk9IDAsIHJlc2VydmVkICovCisJSTQwRV9ITUNfUFJPRklMRV9ERUZBVUxUCT0gMSwKKwlJNDBFX0hNQ19QUk9GSUxFX0ZBVk9SX1ZGCT0gMiwKKwlJNDBFX0hNQ19QUk9GSUxFX0VRVUFMCQk9IDMsCit9OworCiAvKiBHZXQgUEhZIEFiaWxpdGllcyAoaW5kaXJlY3QgMHgwNjAwKSB1c2VzIHRoZSBnZW5lcmljIGluZGlyZWN0IHN0cnVjdCAqLwogCiAvKiBzZXQgaW4gcGFyYW0wIGZvciBnZXQgcGh5IGFiaWxpdGllcyB0byByZXBvcnQgcXVhbGlmaWVkIG1vZHVsZXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX2NvbW1vbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfY29tbW9uLmMKaW5kZXggNGRiMGMwMy4uNzk1M2MxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfY29tbW9uLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfY29tbW9uLmMKQEAgLTMwMiw3ICszMDIsNiBAQAogCQkgICB2b2lkICpidWZmZXIsIHUxNiBidWZfbGVuKQogewogCXN0cnVjdCBpNDBlX2FxX2Rlc2MgKmFxX2Rlc2MgPSAoc3RydWN0IGk0MGVfYXFfZGVzYyAqKWRlc2M7Ci0JdTE2IGxlbiA9IGxlMTZfdG9fY3B1KGFxX2Rlc2MtPmRhdGFsZW4pOwogCXU4ICpidWYgPSAodTggKilidWZmZXI7CiAJdTE2IGkgPSAwOwogCkBAIC0zMjYsNiArMzI1LDggQEAKIAkJICAgbGUzMl90b19jcHUoYXFfZGVzYy0+cGFyYW1zLmV4dGVybmFsLmFkZHJfbG93KSk7CiAKIAlpZiAoKGJ1ZmZlciAhPSBOVUxMKSAmJiAoYXFfZGVzYy0+ZGF0YWxlbiAhPSAwKSkgeworCQl1MTYgbGVuID0gbGUxNl90b19jcHUoYXFfZGVzYy0+ZGF0YWxlbik7CisKIAkJaTQwZV9kZWJ1ZyhodywgbWFzaywgIkFRIENNRCBCdWZmZXI6XG4iKTsKIAkJaWYgKGJ1Zl9sZW4gPCBsZW4pCiAJCQlsZW4gPSBidWZfbGVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfdHhyeC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfdHhyeC5jCmluZGV4IGE1NzkxOTMuLjc1ZjJhMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX3R4cnguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV90eHJ4LmMKQEAgLTUxLDcgKzUxLDEwIEBACiAJCQkJCSAgICBzdHJ1Y3QgaTQwZV90eF9idWZmZXIgKnR4X2J1ZmZlcikKIHsKIAlpZiAodHhfYnVmZmVyLT5za2IpIHsKLQkJZGV2X2tmcmVlX3NrYl9hbnkodHhfYnVmZmVyLT5za2IpOworCQlpZiAodHhfYnVmZmVyLT50eF9mbGFncyAmIEk0MEVfVFhfRkxBR1NfRkRfU0IpCisJCQlrZnJlZSh0eF9idWZmZXItPnJhd19idWYpOworCQllbHNlCisJCQlkZXZfa2ZyZWVfc2tiX2FueSh0eF9idWZmZXItPnNrYik7CiAJCWlmIChkbWFfdW5tYXBfbGVuKHR4X2J1ZmZlciwgbGVuKSkKIAkJCWRtYV91bm1hcF9zaW5nbGUocmluZy0+ZGV2LAogCQkJCQkgZG1hX3VubWFwX2FkZHIodHhfYnVmZmVyLCBkbWEpLApAQCAtNjQsOSArNjcsNiBAQAogCQkJICAgICAgIERNQV9UT19ERVZJQ0UpOwogCX0KIAotCWlmICh0eF9idWZmZXItPnR4X2ZsYWdzICYgSTQwRV9UWF9GTEFHU19GRF9TQikKLQkJa2ZyZWUodHhfYnVmZmVyLT5yYXdfYnVmKTsKLQogCXR4X2J1ZmZlci0+bmV4dF90b193YXRjaCA9IE5VTEw7CiAJdHhfYnVmZmVyLT5za2IgPSBOVUxMOwogCWRtYV91bm1hcF9sZW5fc2V0KHR4X2J1ZmZlciwgbGVuLCAwKTsKQEAgLTEwMyw4ICsxMDMsNyBAQAogCQlyZXR1cm47CiAKIAkvKiBjbGVhbnVwIFR4IHF1ZXVlIHN0YXRpc3RpY3MgKi8KLQluZXRkZXZfdHhfcmVzZXRfcXVldWUobmV0ZGV2X2dldF90eF9xdWV1ZSh0eF9yaW5nLT5uZXRkZXYsCi0JCQkJCQkgIHR4X3JpbmctPnF1ZXVlX2luZGV4KSk7CisJbmV0ZGV2X3R4X3Jlc2V0X3F1ZXVlKHR4cmluZ190eHEodHhfcmluZykpOwogfQogCiAvKioKQEAgLTI3Myw4ICsyNzIsOCBAQAogCQkJdHhfcmluZy0+YXJtX3diID0gdHJ1ZTsKIAl9CiAKLQluZXRkZXZfdHhfY29tcGxldGVkX3F1ZXVlKG5ldGRldl9nZXRfdHhfcXVldWUodHhfcmluZy0+bmV0ZGV2LAotCQkJCQkJICAgICAgdHhfcmluZy0+cXVldWVfaW5kZXgpLAorCS8qIG5vdGlmeSBuZXRkZXYgb2YgY29tcGxldGVkIGJ1ZmZlcnMgKi8KKwluZXRkZXZfdHhfY29tcGxldGVkX3F1ZXVlKHR4cmluZ190eHEodHhfcmluZyksCiAJCQkJICB0b3RhbF9wYWNrZXRzLCB0b3RhbF9ieXRlcyk7CiAKICNkZWZpbmUgVFhfV0FLRV9USFJFU0hPTEQgKERFU0NfTkVFREVEICogMikKQEAgLTEzMTIsNiArMTMxMSwxOSBAQAogCiAvKiBhIHNtYWxsIG1hY3JvIHRvIHNob3J0ZW4gdXAgc29tZSBsb25nIGxpbmVzICovCiAjZGVmaW5lIElOVFJFRyBJNDBFX1ZGSU5UX0RZTl9DVExOMQorc3RhdGljIGlubGluZSBpbnQgZ2V0X3J4X2l0cl9lbmFibGVkKHN0cnVjdCBpNDBlX3ZzaSAqdnNpLCBpbnQgaWR4KQoreworCXN0cnVjdCBpNDBldmZfYWRhcHRlciAqYWRhcHRlciA9IHZzaS0+YmFjazsKKworCXJldHVybiAhIShhZGFwdGVyLT5yeF9yaW5nc1tpZHhdLnJ4X2l0cl9zZXR0aW5nKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0X3R4X2l0cl9lbmFibGVkKHN0cnVjdCBpNDBlX3ZzaSAqdnNpLCBpbnQgaWR4KQoreworCXN0cnVjdCBpNDBldmZfYWRhcHRlciAqYWRhcHRlciA9IHZzaS0+YmFjazsKKworCXJldHVybiAhIShhZGFwdGVyLT50eF9yaW5nc1tpZHhdLnR4X2l0cl9zZXR0aW5nKTsKK30KIAogLyoqCiAgKiBpNDBlX3VwZGF0ZV9lbmFibGVfaXRyIC0gVXBkYXRlIGl0ciBhbmQgcmUtZW5hYmxlIE1TSVggaW50ZXJydXB0CkBAIC0xMzI2LDYgKzEzMzgsOCBAQAogCWJvb2wgcnggPSBmYWxzZSwgdHggPSBmYWxzZTsKIAl1MzIgcnh2YWwsIHR4dmFsOwogCWludCB2ZWN0b3I7CisJaW50IGlkeCA9IHFfdmVjdG9yLT52X2lkeDsKKwlpbnQgcnhfaXRyX3NldHRpbmcsIHR4X2l0cl9zZXR0aW5nOwogCiAJdmVjdG9yID0gKHFfdmVjdG9yLT52X2lkeCArIHZzaS0+YmFzZV92ZWN0b3IpOwogCkBAIC0xMzM0LDE4ICsxMzQ4LDIxIEBACiAJICovCiAJcnh2YWwgPSB0eHZhbCA9IGk0MGVfYnVpbGRyZWdfaXRyKEk0MEVfSVRSX05PTkUsIDApOwogCisJcnhfaXRyX3NldHRpbmcgPSBnZXRfcnhfaXRyX2VuYWJsZWQodnNpLCBpZHgpOworCXR4X2l0cl9zZXR0aW5nID0gZ2V0X3R4X2l0cl9lbmFibGVkKHZzaSwgaWR4KTsKKwogCWlmIChxX3ZlY3Rvci0+aXRyX2NvdW50ZG93biA+IDAgfHwKLQkgICAgKCFJVFJfSVNfRFlOQU1JQyh2c2ktPnJ4X2l0cl9zZXR0aW5nKSAmJgotCSAgICAgIUlUUl9JU19EWU5BTUlDKHZzaS0+dHhfaXRyX3NldHRpbmcpKSkgeworCSAgICAoIUlUUl9JU19EWU5BTUlDKHJ4X2l0cl9zZXR0aW5nKSAmJgorCSAgICAgIUlUUl9JU19EWU5BTUlDKHR4X2l0cl9zZXR0aW5nKSkpIHsKIAkJZ290byBlbmFibGVfaW50OwogCX0KIAotCWlmIChJVFJfSVNfRFlOQU1JQyh2c2ktPnJ4X2l0cl9zZXR0aW5nKSkgeworCWlmIChJVFJfSVNfRFlOQU1JQyhyeF9pdHJfc2V0dGluZykpIHsKIAkJcnggPSBpNDBlX3NldF9uZXdfZHluYW1pY19pdHIoJnFfdmVjdG9yLT5yeCk7CiAJCXJ4dmFsID0gaTQwZV9idWlsZHJlZ19pdHIoSTQwRV9SWF9JVFIsIHFfdmVjdG9yLT5yeC5pdHIpOwogCX0KIAotCWlmIChJVFJfSVNfRFlOQU1JQyh2c2ktPnR4X2l0cl9zZXR0aW5nKSkgeworCWlmIChJVFJfSVNfRFlOQU1JQyh0eF9pdHJfc2V0dGluZykpIHsKIAkJdHggPSBpNDBlX3NldF9uZXdfZHluYW1pY19pdHIoJnFfdmVjdG9yLT50eCk7CiAJCXR4dmFsID0gaTQwZV9idWlsZHJlZ19pdHIoSTQwRV9UWF9JVFIsIHFfdmVjdG9yLT50eC5pdHIpOwogCX0KQEAgLTE4MzIsOSArMTg0OSw3IEBACiAJCXJldHVybiBmYWxzZTsKIAogCS8qIFdlIG5lZWQgdG8gd2FsayB0aHJvdWdoIHRoZSBsaXN0IGFuZCB2YWxpZGF0ZSB0aGF0IGVhY2ggZ3JvdXAKLQkgKiBvZiA2IGZyYWdtZW50cyB0b3RhbHMgYXQgbGVhc3QgZ3NvX3NpemUuICBIb3dldmVyIHdlIGRvbid0IG5lZWQKLQkgKiB0byBwZXJmb3JtIHN1Y2ggdmFsaWRhdGlvbiBvbiB0aGUgbGFzdCA2IHNpbmNlIHRoZSBsYXN0IDYgY2Fubm90Ci0JICogaW5oZXJpdCBhbnkgZGF0YSBmcm9tIGEgZGVzY3JpcHRvciBhZnRlciB0aGVtLgorCSAqIG9mIDYgZnJhZ21lbnRzIHRvdGFscyBhdCBsZWFzdCBnc29fc2l6ZS4KIAkgKi8KIAlucl9mcmFncyAtPSBJNDBFX01BWF9CVUZGRVJfVFhEIC0gMjsKIAlmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbMF07CkBAIC0xODY1LDggKzE4ODAsNyBAQAogCQlpZiAoc3VtIDwgMCkKIAkJCXJldHVybiB0cnVlOwogCi0JCS8qIHVzZSBwcmUtZGVjcmVtZW50IHRvIGF2b2lkIHByb2Nlc3NpbmcgbGFzdCBmcmFnbWVudCAqLwotCQlpZiAoIS0tbnJfZnJhZ3MpCisJCWlmICghbnJfZnJhZ3MtLSkKIAkJCWJyZWFrOwogCiAJCXN1bSAtPSBza2JfZnJhZ19zaXplKHN0YWxlKyspOwpAQCAtMjAxNSw5ICsyMDI5LDcgQEAKIAogCXR4X3JpbmctPm5leHRfdG9fdXNlID0gaTsKIAotCW5ldGRldl90eF9zZW50X3F1ZXVlKG5ldGRldl9nZXRfdHhfcXVldWUodHhfcmluZy0+bmV0ZGV2LAotCQkJCQkJIHR4X3JpbmctPnF1ZXVlX2luZGV4KSwKLQkJCQkJCSBmaXJzdC0+Ynl0ZWNvdW50KTsKKwluZXRkZXZfdHhfc2VudF9xdWV1ZSh0eHJpbmdfdHhxKHR4X3JpbmcpLCBmaXJzdC0+Ynl0ZWNvdW50KTsKIAlpNDBlX21heWJlX3N0b3BfdHgodHhfcmluZywgREVTQ19ORUVERUQpOwogCiAJLyogQWxnb3JpdGhtIHRvIG9wdGltaXplIHRhaWwgYW5kIFJTIGJpdCBzZXR0aW5nOgpAQCAtMjA0MiwxMyArMjA1NCwxMSBAQAogCSAqIHRyaWdnZXIgYSBmb3JjZSBXQi4KIAkgKi8KIAlpZiAoc2tiLT54bWl0X21vcmUgICYmCi0JICAgICFuZXRpZl94bWl0X3N0b3BwZWQobmV0ZGV2X2dldF90eF9xdWV1ZSh0eF9yaW5nLT5uZXRkZXYsCi0JCQkJCQkgICAgdHhfcmluZy0+cXVldWVfaW5kZXgpKSkgeworCSAgICAhbmV0aWZfeG1pdF9zdG9wcGVkKHR4cmluZ190eHEodHhfcmluZykpKSB7CiAJCXR4X3JpbmctPmZsYWdzIHw9IEk0MEVfVFhSX0ZMQUdTX0xBU1RfWE1JVF9NT1JFX1NFVDsKIAkJdGFpbF9idW1wID0gZmFsc2U7CiAJfSBlbHNlIGlmICghc2tiLT54bWl0X21vcmUgJiYKLQkJICAgIW5ldGlmX3htaXRfc3RvcHBlZChuZXRkZXZfZ2V0X3R4X3F1ZXVlKHR4X3JpbmctPm5ldGRldiwKLQkJCQkJCSAgICAgICB0eF9yaW5nLT5xdWV1ZV9pbmRleCkpICYmCisJCSAgICFuZXRpZl94bWl0X3N0b3BwZWQodHhyaW5nX3R4cSh0eF9yaW5nKSkgJiYKIAkJICAgKCEodHhfcmluZy0+ZmxhZ3MgJiBJNDBFX1RYUl9GTEFHU19MQVNUX1hNSVRfTU9SRV9TRVQpKSAmJgogCQkgICAodHhfcmluZy0+cGFja2V0X3N0cmlkZSA8IFdCX1NUUklERSkgJiYKIAkJICAgKGRlc2NfY291bnQgPCBXQl9TVFJJREUpKSB7CkBAIC0yMDY4LDEwICsyMDc4LDkgQEAKIAkJCQkJCSAgSTQwRV9UWERfUVcxX0NNRF9TSElGVCk7CiAKIAkvKiBub3RpZnkgSFcgb2YgcGFja2V0ICovCi0JaWYgKCF0YWlsX2J1bXApCisJaWYgKCF0YWlsX2J1bXApIHsKIAkJcHJlZmV0Y2h3KHR4X2Rlc2MgKyAxKTsKLQotCWlmICh0YWlsX2J1bXApIHsKKwl9IGVsc2UgewogCQkvKiBGb3JjZSBtZW1vcnkgd3JpdGVzIHRvIGNvbXBsZXRlIGJlZm9yZSBsZXR0aW5nIGgvdwogCQkgKiBrbm93IHRoZXJlIGFyZSBuZXcgZGVzY3JpcHRvcnMgdG8gZmV0Y2guICAoT25seQogCQkgKiBhcHBsaWNhYmxlIGZvciB3ZWFrLW9yZGVyZWQgbWVtb3J5IG1vZGVsIGFyY2hzLApAQCAtMjA4MCw3ICsyMDg5LDYgQEAKIAkJd21iKCk7CiAJCXdyaXRlbChpLCB0eF9yaW5nLT50YWlsKTsKIAl9Ci0KIAlyZXR1cm47CiAKIGRtYV9lcnJvcjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX3R4cnguaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX3R4cnguaAppbmRleCAwMTEyMjc3Li5hYmNkZWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV90eHJ4LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfdHhyeC5oCkBAIC0yODcsNiArMjg3LDE0IEBACiAJdTggZGNiX3RjOwkJCS8qIFRyYWZmaWMgY2xhc3Mgb2YgcmluZyAqLwogCXU4IF9faW9tZW0gKnRhaWw7CiAKKwkvKiBoaWdoIGJpdCBzZXQgbWVhbnMgZHluYW1pYywgdXNlIGFjY2Vzc29ycyByb3V0aW5lcyB0byByZWFkL3dyaXRlLgorCSAqIGhhcmR3YXJlIG9ubHkgc3VwcG9ydHMgMnVzIHJlc29sdXRpb24gZm9yIHRoZSBJVFIgcmVnaXN0ZXJzLgorCSAqIHRoZXNlIHZhbHVlcyBhbHdheXMgc3RvcmUgdGhlIFVTRVIgc2V0dGluZywgYW5kIG11c3QgYmUgY29udmVydGVkCisJICogYmVmb3JlIHByb2dyYW1taW5nIHRvIGEgcmVnaXN0ZXIuCisJICovCisJdTE2IHJ4X2l0cl9zZXR0aW5nOworCXUxNiB0eF9pdHJfc2V0dGluZzsKKwogCXUxNiBjb3VudDsJCQkvKiBOdW1iZXIgb2YgZGVzY3JpcHRvcnMgKi8KIAl1MTYgcmVnX2lkeDsJCQkvKiBIVyByZWdpc3RlciBpbmRleCBvZiB0aGUgcmluZyAqLwogCXUxNiByeF9idWZfbGVuOwpAQCAtNDQ1LDQgKzQ1MywxMyBAQAogCXJldHVybiAocHR5cGUgPj0gSTQwRV9SWF9QVFlQRV9MMl9GQ09FX1BBWTMpICYmCiAJICAgICAgIChwdHlwZSA8PSBJNDBFX1JYX1BUWVBFX0wyX0ZDT0VfVkZUX0ZDT1RIRVIpOwogfQorCisvKioKKyAqIHR4cmluZ190eHEgLSBGaW5kIHRoZSBuZXRkZXYgVHggcmluZyBiYXNlZCBvbiB0aGUgaTQwZSBUeCByaW5nCisgKiBAcmluZzogVHggcmluZyB0byBmaW5kIHRoZSBuZXRkZXYgZXF1aXZhbGVudCBvZgorICoqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHJpbmdfdHhxKGNvbnN0IHN0cnVjdCBpNDBlX3JpbmcgKnJpbmcpCit7CisJcmV0dXJuIG5ldGRldl9nZXRfdHhfcXVldWUocmluZy0+bmV0ZGV2LCByaW5nLT5xdWV1ZV9pbmRleCk7Cit9CiAjZW5kaWYgLyogX0k0MEVfVFhSWF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfdmlydGNobmwuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX3ZpcnRjaG5sLmgKaW5kZXggZjA0Y2U2Yy4uYmQ2OTFhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfdmlydGNobmwuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV92aXJ0Y2hubC5oCkBAIC0xNjAsNiArMTYwLDcgQEAKICNkZWZpbmUgSTQwRV9WSVJUQ0hOTF9WRl9PRkZMT0FEX1JYX1BPTExJTkcJMHgwMDAyMDAwMAogI2RlZmluZSBJNDBFX1ZJUlRDSE5MX1ZGX09GRkxPQURfUlNTX1BDVFlQRV9WMgkweDAwMDQwMDAwCiAjZGVmaW5lIEk0MEVfVklSVENITkxfVkZfT0ZGTE9BRF9SU1NfUEYJCTBYMDAwODAwMDAKKyNkZWZpbmUgSTQwRV9WSVJUQ0hOTF9WRl9PRkZMT0FEX0VOQ0FQX0NTVU0JMFgwMDEwMDAwMAogCiBzdHJ1Y3QgaTQwZV92aXJ0Y2hubF92Zl9yZXNvdXJjZSB7CiAJdTE2IG51bV92c2lzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGV2Zi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGV2Zi5oCmluZGV4IDc2ZWQ5N2QuLmM1ZmQ3MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBldmYuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZXZmLmgKQEAgLTU5LDMyICs1OSwyNSBAQAogCXVuc2lnbmVkIGxvbmcgc3RhdGU7CiAJaW50IGJhc2VfdmVjdG9yOwogCXUxNiB3b3JrX2xpbWl0OwotCS8qIGhpZ2ggYml0IHNldCBtZWFucyBkeW5hbWljLCB1c2UgYWNjZXNzb3Igcm91dGluZXMgdG8gcmVhZC93cml0ZS4KLQkgKiBoYXJkd2FyZSBvbmx5IHN1cHBvcnRzIDJ1cyByZXNvbHV0aW9uIGZvciB0aGUgSVRSIHJlZ2lzdGVycy4KLQkgKiB0aGVzZSB2YWx1ZXMgYWx3YXlzIHN0b3JlIHRoZSBVU0VSIHNldHRpbmcsIGFuZCBtdXN0IGJlIGNvbnZlcnRlZAotCSAqIGJlZm9yZSBwcm9ncmFtbWluZyB0byBhIHJlZ2lzdGVyLgotCSAqLwotCXUxNiByeF9pdHJfc2V0dGluZzsKLQl1MTYgdHhfaXRyX3NldHRpbmc7CiAJdTE2IHFzX2hhbmRsZTsKIH07CiAKIC8qIEhvdyBtYW55IFJ4IEJ1ZmZlcnMgZG8gd2UgYnVuZGxlIGludG8gb25lIHdyaXRlIHRvIHRoZSBoYXJkd2FyZSA/ICovCiAjZGVmaW5lIEk0MEVWRl9SWF9CVUZGRVJfV1JJVEUJMTYJLyogTXVzdCBiZSBwb3dlciBvZiAyICovCi0jZGVmaW5lIEk0MEVWRl9ERUZBVUxUX1RYRCAgIDUxMgotI2RlZmluZSBJNDBFVkZfREVGQVVMVF9SWEQgICA1MTIKLSNkZWZpbmUgSTQwRVZGX01BWF9UWEQgICAgICAgNDA5NgotI2RlZmluZSBJNDBFVkZfTUlOX1RYRCAgICAgICA2NAotI2RlZmluZSBJNDBFVkZfTUFYX1JYRCAgICAgICA0MDk2Ci0jZGVmaW5lIEk0MEVWRl9NSU5fUlhEICAgICAgIDY0Ci0jZGVmaW5lIEk0MEVWRl9SRVFfREVTQ1JJUFRPUl9NVUxUSVBMRSAgMzIKKyNkZWZpbmUgSTQwRVZGX0RFRkFVTFRfVFhECTUxMgorI2RlZmluZSBJNDBFVkZfREVGQVVMVF9SWEQJNTEyCisjZGVmaW5lIEk0MEVWRl9NQVhfVFhECQk0MDk2CisjZGVmaW5lIEk0MEVWRl9NSU5fVFhECQk2NAorI2RlZmluZSBJNDBFVkZfTUFYX1JYRAkJNDA5NgorI2RlZmluZSBJNDBFVkZfTUlOX1JYRAkJNjQKKyNkZWZpbmUgSTQwRVZGX1JFUV9ERVNDUklQVE9SX01VTFRJUExFCTMyCiAKIC8qIFN1cHBvcnRlZCBSeCBCdWZmZXIgU2l6ZXMgKi8KLSNkZWZpbmUgSTQwRVZGX1JYQlVGRkVSXzIwNDggIDIwNDgKLSNkZWZpbmUgSTQwRVZGX01BWF9SWEJVRkZFUiAgIDE2Mzg0ICAvKiBsYXJnZXN0IHNpemUgZm9yIHNpbmdsZSBkZXNjcmlwdG9yICovCi0jZGVmaW5lIEk0MEVWRl9NQVhfQVFfQlVGX1NJWkUgICAgNDA5NgotI2RlZmluZSBJNDBFVkZfQVFfTEVOICAgICAgICAgICAgIDMyCi0jZGVmaW5lIEk0MEVWRl9BUV9NQVhfRVJSICAgICAgICAgMjAgLyogdGltZXMgdG8gdHJ5IGJlZm9yZSByZXNldHRpbmcgQVEgKi8KKyNkZWZpbmUgSTQwRVZGX1JYQlVGRkVSXzIwNDgJMjA0OAorI2RlZmluZSBJNDBFVkZfTUFYX1JYQlVGRkVSCTE2Mzg0ICAvKiBsYXJnZXN0IHNpemUgZm9yIHNpbmdsZSBkZXNjcmlwdG9yICovCisjZGVmaW5lIEk0MEVWRl9NQVhfQVFfQlVGX1NJWkUJNDA5NgorI2RlZmluZSBJNDBFVkZfQVFfTEVOCQkzMgorI2RlZmluZSBJNDBFVkZfQVFfTUFYX0VSUgkyMCAvKiB0aW1lcyB0byB0cnkgYmVmb3JlIHJlc2V0dGluZyBBUSAqLwogCiAjZGVmaW5lIE1BWElNVU1fRVRIRVJORVRfVkxBTl9TSVpFIChWTEFOX0VUSF9GUkFNRV9MRU4gKyBFVEhfRkNTX0xFTikKIApAQCAtMTExLDcgKzEwNCw3IEBACiAJdTggbnVtX3JpbmdwYWlyczsJLyogdG90YWwgbnVtYmVyIG9mIHJpbmcgcGFpcnMgaW4gdmVjdG9yICovCiAjZGVmaW5lIElUUl9DT1VOVERPV05fU1RBUlQgMTAwCiAJdTggaXRyX2NvdW50ZG93bjsJLyogd2hlbiAwIG9yIDEgdXBkYXRlIElUUiAqLwotCWludCB2X2lkeDsJICAvKiB2ZWN0b3IgaW5kZXggaW4gbGlzdCAqLworCWludCB2X2lkeDsJLyogdmVjdG9yIGluZGV4IGluIGxpc3QgKi8KIAljaGFyIG5hbWVbSUZOQU1TSVogKyA5XTsKIAlib29sIGFybV93Yl9zdGF0ZTsKIAljcHVtYXNrX3Zhcl90IGFmZmluaXR5X21hc2s7CkBAIC0xMjksMTEgKzEyMiwxMSBAQAogCSgoKChSKS0+bmV4dF90b19jbGVhbiA+IChSKS0+bmV4dF90b191c2UpID8gMCA6IChSKS0+Y291bnQpICsgXAogCShSKS0+bmV4dF90b19jbGVhbiAtIChSKS0+bmV4dF90b191c2UgLSAxKQogCi0jZGVmaW5lIEk0MEVWRl9SWF9ERVNDX0FEVihSLCBpKQkgICAgXAorI2RlZmluZSBJNDBFVkZfUlhfREVTQ19BRFYoUiwgaSkJXAogCSgmKCgodW5pb24gaTQwZV9hZHZfcnhfZGVzYyAqKSgoUikuZGVzYykpW2ldKSkKLSNkZWZpbmUgSTQwRVZGX1RYX0RFU0NfQURWKFIsIGkpCSAgICBcCisjZGVmaW5lIEk0MEVWRl9UWF9ERVNDX0FEVihSLCBpKQlcCiAJKCYoKCh1bmlvbiBpNDBlX2Fkdl90eF9kZXNjICopKChSKS5kZXNjKSlbaV0pKQotI2RlZmluZSBJNDBFVkZfVFhfQ1RYVERFU0NfQURWKFIsIGkpCSAgICBcCisjZGVmaW5lIEk0MEVWRl9UWF9DVFhUREVTQ19BRFYoUiwgaSkJXAogCSgmKCgoc3RydWN0IGk0MGVfYWR2X3R4X2NvbnRleHRfZGVzYyAqKSgoUikuZGVzYykpW2ldKSkKIAogI2RlZmluZSBPVEhFUl9WRUNUT1IgMQpAQCAtMjA0LDIyICsxOTcsMjUgQEAKIAlzdHJ1Y3QgbXNpeF9lbnRyeSAqbXNpeF9lbnRyaWVzOwogCiAJdTMyIGZsYWdzOwotI2RlZmluZSBJNDBFVkZfRkxBR19SWF9DU1VNX0VOQUJMRUQgICAgICAgICAgICAgIEJJVCgwKQotI2RlZmluZSBJNDBFVkZfRkxBR19JTUlSX0VOQUJMRUQgICAgICAgICAgICAgICAgIEJJVCg1KQotI2RlZmluZSBJNDBFVkZfRkxBR19NUV9DQVBBQkxFICAgICAgICAgICAgICAgICAgIEJJVCg2KQotI2RlZmluZSBJNDBFVkZfRkxBR19ORUVEX0xJTktfVVBEQVRFICAgICAgICAgICAgIEJJVCg3KQotI2RlZmluZSBJNDBFVkZfRkxBR19QRl9DT01NU19GQUlMRUQgICAgICAgICAgICAgIEJJVCg4KQotI2RlZmluZSBJNDBFVkZfRkxBR19SRVNFVF9QRU5ESU5HICAgICAgICAgICAgICAgIEJJVCg5KQotI2RlZmluZSBJNDBFVkZfRkxBR19SRVNFVF9ORUVERUQgICAgICAgICAgICAgICAgIEJJVCgxMCkKKyNkZWZpbmUgSTQwRVZGX0ZMQUdfUlhfQ1NVTV9FTkFCTEVECQlCSVQoMCkKKyNkZWZpbmUgSTQwRVZGX0ZMQUdfSU5fTkVUUE9MTAkJCUJJVCg0KQorI2RlZmluZSBJNDBFVkZfRkxBR19JTUlSX0VOQUJMRUQJCUJJVCg1KQorI2RlZmluZSBJNDBFVkZfRkxBR19NUV9DQVBBQkxFCQkJQklUKDYpCisjZGVmaW5lIEk0MEVWRl9GTEFHX05FRURfTElOS19VUERBVEUJCUJJVCg3KQorI2RlZmluZSBJNDBFVkZfRkxBR19QRl9DT01NU19GQUlMRUQJCUJJVCg4KQorI2RlZmluZSBJNDBFVkZfRkxBR19SRVNFVF9QRU5ESU5HCQlCSVQoOSkKKyNkZWZpbmUgSTQwRVZGX0ZMQUdfUkVTRVRfTkVFREVECQlCSVQoMTApCiAjZGVmaW5lIEk0MEVWRl9GTEFHX1dCX09OX0lUUl9DQVBBQkxFCQlCSVQoMTEpCiAjZGVmaW5lIEk0MEVWRl9GTEFHX09VVEVSX1VEUF9DU1VNX0NBUEFCTEUJQklUKDEyKQogI2RlZmluZSBJNDBFVkZfRkxBR19BRERSX1NFVF9CWV9QRgkJQklUKDEzKQorI2RlZmluZSBJNDBFVkZfRkxBR19TRVJWSUNFX0NMSUVOVF9SRVFVRVNURUQJQklUKDE0KQogI2RlZmluZSBJNDBFVkZfRkxBR19QUk9NSVNDX09OCQkJQklUKDE1KQogI2RlZmluZSBJNDBFVkZfRkxBR19BTExNVUxUSV9PTgkJCUJJVCgxNikKIC8qIGR1cGxpY2F0ZXMgZm9yIGNvbW1vbiBjb2RlICovCi0jZGVmaW5lIEk0MEVfRkxBR19GRElSX0FUUl9FTkFCTEVECQkgMAotI2RlZmluZSBJNDBFX0ZMQUdfRENCX0VOQUJMRUQJCQkgMAotI2RlZmluZSBJNDBFX0ZMQUdfUlhfQ1NVTV9FTkFCTEVEICAgICAgICAgICAgICAgIEk0MEVWRl9GTEFHX1JYX0NTVU1fRU5BQkxFRAorI2RlZmluZSBJNDBFX0ZMQUdfRkRJUl9BVFJfRU5BQkxFRAkJMAorI2RlZmluZSBJNDBFX0ZMQUdfRENCX0VOQUJMRUQJCQkwCisjZGVmaW5lIEk0MEVfRkxBR19JTl9ORVRQT0xMCQkJSTQwRVZGX0ZMQUdfSU5fTkVUUE9MTAorI2RlZmluZSBJNDBFX0ZMQUdfUlhfQ1NVTV9FTkFCTEVECQlJNDBFVkZfRkxBR19SWF9DU1VNX0VOQUJMRUQKICNkZWZpbmUgSTQwRV9GTEFHX1dCX09OX0lUUl9DQVBBQkxFCQlJNDBFVkZfRkxBR19XQl9PTl9JVFJfQ0FQQUJMRQogI2RlZmluZSBJNDBFX0ZMQUdfT1VURVJfVURQX0NTVU1fQ0FQQUJMRQlJNDBFVkZfRkxBR19PVVRFUl9VRFBfQ1NVTV9DQVBBQkxFCiAJLyogZmxhZ3MgZm9yIGFkbWluIHF1ZXVlIHNlcnZpY2UgdGFzayAqLwpAQCAtMjMzLDcgKzIyOSw3IEBACiAjZGVmaW5lIEk0MEVWRl9GTEFHX0FRX0NPTkZJR1VSRV9RVUVVRVMJCUJJVCg2KQogI2RlZmluZSBJNDBFVkZfRkxBR19BUV9NQVBfVkVDVE9SUwkJQklUKDcpCiAjZGVmaW5lIEk0MEVWRl9GTEFHX0FRX0hBTkRMRV9SRVNFVAkJQklUKDgpCi0jZGVmaW5lIEk0MEVWRl9GTEFHX0FRX0NPTkZJR1VSRV9SU1MJCUJJVCg5KQkvKiBkaXJlY3QgQVEgY29uZmlnICovCisjZGVmaW5lIEk0MEVWRl9GTEFHX0FRX0NPTkZJR1VSRV9SU1MJCUJJVCg5KSAvKiBkaXJlY3QgQVEgY29uZmlnICovCiAjZGVmaW5lIEk0MEVWRl9GTEFHX0FRX0dFVF9DT05GSUcJCUJJVCgxMCkKIC8qIE5ld2VyIHN0eWxlLCBSU1MgZG9uZSBieSB0aGUgUEYgc28gd2UgY2FuIGlnbm9yZSBoYXJkd2FyZSB2YWdhcmllcy4gKi8KICNkZWZpbmUgSTQwRVZGX0ZMQUdfQVFfR0VUX0hFTkEJCQlCSVQoMTEpCkBAIC0yNTgsNiArMjU0LDcgQEAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd2F0Y2hkb2dfdGFzazsKIAlib29sIG5ldGRldl9yZWdpc3RlcmVkOwogCWJvb2wgbGlua191cDsKKwllbnVtIGk0MGVfYXFfbGlua19zcGVlZCBsaW5rX3NwZWVkOwogCWVudW0gaTQwZV92aXJ0Y2hubF9vcHMgY3VycmVudF9vcDsKICNkZWZpbmUgQ0xJRU5UX0VOQUJMRUQoX2EpICgoX2EpLT52Zl9yZXMgPyBcCiAJCQkgICAgKF9hKS0+dmZfcmVzLT52Zl9vZmZsb2FkX2ZsYWdzICYgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGV2Zl9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZXZmX2V0aHRvb2wuYwppbmRleCBjOWMyMDJmNi4uYTk5NDAxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGV2Zl9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGV2Zl9ldGh0b29sLmMKQEAgLTc0LDEzICs3NCwzMyBAQAogc3RhdGljIGludCBpNDBldmZfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQogewotCS8qIEluIHRoZSBmdXR1cmUgdGhlIFZGIHdpbGwgYmUgYWJsZSB0byBxdWVyeSB0aGUgUEYgZm9yCi0JICogc29tZSBpbmZvcm1hdGlvbiAtIGZvciBub3cgdXNlIGEgZHVtbXkgdmFsdWUKLQkgKi8KKwlzdHJ1Y3QgaTQwZXZmX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCiAJZWNtZC0+c3VwcG9ydGVkID0gMDsKIAllY21kLT5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOwogCWVjbWQtPnRyYW5zY2VpdmVyID0gWENWUl9EVU1NWTE7CiAJZWNtZC0+cG9ydCA9IFBPUlRfTk9ORTsKKwkvKiBTZXQgc3BlZWQgYW5kIGR1cGxleCAqLworCXN3aXRjaCAoYWRhcHRlci0+bGlua19zcGVlZCkgeworCWNhc2UgSTQwRV9MSU5LX1NQRUVEXzQwR0I6CisJCWV0aHRvb2xfY21kX3NwZWVkX3NldChlY21kLCBTUEVFRF80MDAwMCk7CisJCWJyZWFrOworCWNhc2UgSTQwRV9MSU5LX1NQRUVEXzIwR0I6CisJCWV0aHRvb2xfY21kX3NwZWVkX3NldChlY21kLCBTUEVFRF8yMDAwMCk7CisJCWJyZWFrOworCWNhc2UgSTQwRV9MSU5LX1NQRUVEXzEwR0I6CisJCWV0aHRvb2xfY21kX3NwZWVkX3NldChlY21kLCBTUEVFRF8xMDAwMCk7CisJCWJyZWFrOworCWNhc2UgSTQwRV9MSU5LX1NQRUVEXzFHQjoKKwkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGVjbWQsIFNQRUVEXzEwMDApOworCQlicmVhazsKKwljYXNlIEk0MEVfTElOS19TUEVFRF8xMDBNQjoKKwkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGVjbWQsIFNQRUVEXzEwMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwllY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKIAogCXJldHVybiAwOwogfQpAQCAtMjc2LDMxICsyOTYsMTc0IEBACiB9CiAKIC8qKgorICogX19pNDBldmZfZ2V0X2NvYWxlc2NlIC0gZ2V0IHBlci1xdWV1ZSBjb2FsZXNjZSBzZXR0aW5ncworICogQG5ldGRldjogdGhlIG5ldGRldiB0byBjaGVjaworICogQGVjOiBldGh0b29sIGNvYWxlc2NlIGRhdGEgc3RydWN0dXJlCisgKiBAcXVldWU6IHdoaWNoIHF1ZXVlIHRvIHBpY2sKKyAqCisgKiBHZXRzIHRoZSBwZXItcXVldWUgc2V0dGluZ3MgZm9yIGNvYWxlc2NlbmNlLiBTcGVjaWZpY2FsbHkgUnggYW5kIFR4IHVzZWNzCisgKiBhcmUgcGVyIHF1ZXVlLiBJZiBxdWV1ZSBpcyA8MCB0aGVuIHdlIGRlZmF1bHQgdG8gcXVldWUgMCBhcyB0aGUKKyAqIHJlcHJlc2VudGF0aXZlIHZhbHVlLgorICoqLworc3RhdGljIGludCBfX2k0MGV2Zl9nZXRfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQkgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmVjLAorCQkJCSBpbnQgcXVldWUpCit7CisJc3RydWN0IGk0MGV2Zl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgaTQwZV92c2kgKnZzaSA9ICZhZGFwdGVyLT52c2k7CisJc3RydWN0IGk0MGVfcmluZyAqcnhfcmluZywgKnR4X3Jpbmc7CisKKwllYy0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPSB2c2ktPndvcmtfbGltaXQ7CisJZWMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzID0gdnNpLT53b3JrX2xpbWl0OworCisJLyogUnggYW5kIFR4IHVzZWNzIHBlciBxdWV1ZSB2YWx1ZS4gSWYgdXNlciBkb2Vzbid0IHNwZWNpZnkgdGhlCisJICogcXVldWUsIHJldHVybiBxdWV1ZSAwJ3MgdmFsdWUgdG8gcmVwcmVzZW50LgorCSAqLworCWlmIChxdWV1ZSA8IDApCisJCXF1ZXVlID0gMDsKKwllbHNlIGlmIChxdWV1ZSA+PSBhZGFwdGVyLT5udW1fYWN0aXZlX3F1ZXVlcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyeF9yaW5nID0gJmFkYXB0ZXItPnJ4X3JpbmdzW3F1ZXVlXTsKKwl0eF9yaW5nID0gJmFkYXB0ZXItPnR4X3JpbmdzW3F1ZXVlXTsKKworCWlmIChJVFJfSVNfRFlOQU1JQyhyeF9yaW5nLT5yeF9pdHJfc2V0dGluZykpCisJCWVjLT51c2VfYWRhcHRpdmVfcnhfY29hbGVzY2UgPSAxOworCisJaWYgKElUUl9JU19EWU5BTUlDKHR4X3JpbmctPnR4X2l0cl9zZXR0aW5nKSkKKwkJZWMtPnVzZV9hZGFwdGl2ZV90eF9jb2FsZXNjZSA9IDE7CisKKwllYy0+cnhfY29hbGVzY2VfdXNlY3MgPSByeF9yaW5nLT5yeF9pdHJfc2V0dGluZyAmIH5JNDBFX0lUUl9EWU5BTUlDOworCWVjLT50eF9jb2FsZXNjZV91c2VjcyA9IHR4X3JpbmctPnR4X2l0cl9zZXR0aW5nICYgfkk0MEVfSVRSX0RZTkFNSUM7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCiAgKiBpNDBldmZfZ2V0X2NvYWxlc2NlIC0gR2V0IGludGVycnVwdCBjb2FsZXNjaW5nIHNldHRpbmdzCiAgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCiAgKiBAZWM6IGV0aHRvb2wgY29hbGVzY2Ugc3RydWN0dXJlCiAgKgogICogUmV0dXJucyBjdXJyZW50IGNvYWxlc2Npbmcgc2V0dGluZ3MuIFRoaXMgaXMgcmVmZXJyZWQgdG8gZWxzZXdoZXJlIGluIHRoZQogICogZHJpdmVyIGFzIEludGVycnVwdCBUaHJvdHRsZSBSYXRlLCBhcyB0aGlzIGlzIGhvdyB0aGUgaGFyZHdhcmUgZGVzY3JpYmVzCi0gKiB0aGlzIGZ1bmN0aW9uYWxpdHkuCisgKiB0aGlzIGZ1bmN0aW9uYWxpdHkuIE5vdGUgdGhhdCBpZiBwZXItcXVldWUgc2V0dGluZ3MgaGF2ZSBiZWVuIG1vZGlmaWVkIHRoaXMKKyAqIG9ubHkgcmVwcmVzZW50cyB0aGUgc2V0dGluZ3Mgb2YgcXVldWUgMC4KICAqKi8KIHN0YXRpYyBpbnQgaTQwZXZmX2dldF9jb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICplYykKIHsKKwlyZXR1cm4gX19pNDBldmZfZ2V0X2NvYWxlc2NlKG5ldGRldiwgZWMsIC0xKTsKK30KKworLyoqCisgKiBpNDBldmZfZ2V0X3Blcl9xdWV1ZV9jb2FsZXNjZSAtIGdldCBjb2FsZXNjZSB2YWx1ZXMgZm9yIHNwZWNpZmljIHF1ZXVlCisgKiBAbmV0ZGV2OiBuZXRkZXYgdG8gcmVhZAorICogQGVjOiBjb2FsZXNjZSBzZXR0aW5ncyBmcm9tIGV0aHRvb2wKKyAqIEBxdWV1ZTogdGhlIHF1ZXVlIHRvIHJlYWQKKyAqCisgKiBSZWFkIHNwZWNpZmljIHF1ZXVlJ3MgY29hbGVzY2Ugc2V0dGluZ3MuCisgKiovCitzdGF0aWMgaW50IGk0MGV2Zl9nZXRfcGVyX3F1ZXVlX2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJCSB1MzIgcXVldWUsCisJCQkJCSBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqZWMpCit7CisJcmV0dXJuIF9faTQwZXZmX2dldF9jb2FsZXNjZShuZXRkZXYsIGVjLCBxdWV1ZSk7Cit9CisKKy8qKgorICogaTQwZXZmX3NldF9pdHJfcGVyX3F1ZXVlIC0gc2V0IElUUiB2YWx1ZXMgZm9yIHNwZWNpZmljIHF1ZXVlCisgKiBAdnNpOiB0aGUgVlNJIHRvIHNldCB2YWx1ZXMgZm9yCisgKiBAZWM6IGNvYWxlc2NlIHNldHRpbmdzIGZyb20gZXRodG9vbAorICogQHF1ZXVlOiB0aGUgcXVldWUgdG8gbW9kaWZ5CisgKgorICogQ2hhbmdlIHRoZSBJVFIgc2V0dGluZ3MgZm9yIGEgc3BlY2lmaWMgcXVldWUuCisgKiovCitzdGF0aWMgdm9pZCBpNDBldmZfc2V0X2l0cl9wZXJfcXVldWUoc3RydWN0IGk0MGV2Zl9hZGFwdGVyICphZGFwdGVyLAorCQkJCSAgICAgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmVjLAorCQkJCSAgICAgaW50IHF1ZXVlKQoreworCXN0cnVjdCBpNDBlX3ZzaSAqdnNpID0gJmFkYXB0ZXItPnZzaTsKKwlzdHJ1Y3QgaTQwZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJc3RydWN0IGk0MGVfcV92ZWN0b3IgKnFfdmVjdG9yOworCXUxNiB2ZWN0b3I7CisKKwlhZGFwdGVyLT5yeF9yaW5nc1txdWV1ZV0ucnhfaXRyX3NldHRpbmcgPSBlYy0+cnhfY29hbGVzY2VfdXNlY3M7CisJYWRhcHRlci0+dHhfcmluZ3NbcXVldWVdLnR4X2l0cl9zZXR0aW5nID0gZWMtPnR4X2NvYWxlc2NlX3VzZWNzOworCisJaWYgKGVjLT51c2VfYWRhcHRpdmVfcnhfY29hbGVzY2UpCisJCWFkYXB0ZXItPnJ4X3JpbmdzW3F1ZXVlXS5yeF9pdHJfc2V0dGluZyB8PSBJNDBFX0lUUl9EWU5BTUlDOworCWVsc2UKKwkJYWRhcHRlci0+cnhfcmluZ3NbcXVldWVdLnJ4X2l0cl9zZXR0aW5nICY9IH5JNDBFX0lUUl9EWU5BTUlDOworCisJaWYgKGVjLT51c2VfYWRhcHRpdmVfdHhfY29hbGVzY2UpCisJCWFkYXB0ZXItPnR4X3JpbmdzW3F1ZXVlXS50eF9pdHJfc2V0dGluZyB8PSBJNDBFX0lUUl9EWU5BTUlDOworCWVsc2UKKwkJYWRhcHRlci0+dHhfcmluZ3NbcXVldWVdLnR4X2l0cl9zZXR0aW5nICY9IH5JNDBFX0lUUl9EWU5BTUlDOworCisJcV92ZWN0b3IgPSBhZGFwdGVyLT5yeF9yaW5nc1txdWV1ZV0ucV92ZWN0b3I7CisJcV92ZWN0b3ItPnJ4Lml0ciA9IElUUl9UT19SRUcoYWRhcHRlci0+cnhfcmluZ3NbcXVldWVdLnJ4X2l0cl9zZXR0aW5nKTsKKwl2ZWN0b3IgPSB2c2ktPmJhc2VfdmVjdG9yICsgcV92ZWN0b3ItPnZfaWR4OworCXdyMzIoaHcsIEk0MEVfVkZJTlRfSVRSTjEoSTQwRV9SWF9JVFIsIHZlY3RvciAtIDEpLCBxX3ZlY3Rvci0+cnguaXRyKTsKKworCXFfdmVjdG9yID0gYWRhcHRlci0+dHhfcmluZ3NbcXVldWVdLnFfdmVjdG9yOworCXFfdmVjdG9yLT50eC5pdHIgPSBJVFJfVE9fUkVHKGFkYXB0ZXItPnR4X3JpbmdzW3F1ZXVlXS50eF9pdHJfc2V0dGluZyk7CisJdmVjdG9yID0gdnNpLT5iYXNlX3ZlY3RvciArIHFfdmVjdG9yLT52X2lkeDsKKwl3cjMyKGh3LCBJNDBFX1ZGSU5UX0lUUk4xKEk0MEVfVFhfSVRSLCB2ZWN0b3IgLSAxKSwgcV92ZWN0b3ItPnR4Lml0cik7CisKKwlpNDBlX2ZsdXNoKGh3KTsKK30KKworLyoqCisgKiBfX2k0MGV2Zl9zZXRfY29hbGVzY2UgLSBzZXQgY29hbGVzY2Ugc2V0dGluZ3MgZm9yIHBhcnRpY3VsYXIgcXVldWUKKyAqIEBuZXRkZXY6IHRoZSBuZXRkZXYgdG8gY2hhbmdlCisgKiBAZWM6IGV0aHRvb2wgY29hbGVzY2Ugc2V0dGluZ3MKKyAqIEBxdWV1ZTogdGhlIHF1ZXVlIHRvIGNoYW5nZQorICoKKyAqIFNldHMgdGhlIGNvYWxlc2NlIHNldHRpbmdzIGZvciBhIHBhcnRpY3VsYXIgcXVldWUuCisgKiovCitzdGF0aWMgaW50IF9faTQwZXZmX3NldF9jb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJCSBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqZWMsCisJCQkJIGludCBxdWV1ZSkKK3sKIAlzdHJ1Y3QgaTQwZXZmX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBpNDBlX3ZzaSAqdnNpID0gJmFkYXB0ZXItPnZzaTsKKwlpbnQgaTsKIAotCWVjLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA9IHZzaS0+d29ya19saW1pdDsKLQllYy0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPSB2c2ktPndvcmtfbGltaXQ7CisJaWYgKGVjLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lc19pcnEgfHwgZWMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycSkKKwkJdnNpLT53b3JrX2xpbWl0ID0gZWMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycTsKIAotCWlmIChJVFJfSVNfRFlOQU1JQyh2c2ktPnJ4X2l0cl9zZXR0aW5nKSkKLQkJZWMtPnVzZV9hZGFwdGl2ZV9yeF9jb2FsZXNjZSA9IDE7CisJaWYgKGVjLT5yeF9jb2FsZXNjZV91c2VjcyA9PSAwKSB7CisJCWlmIChlYy0+dXNlX2FkYXB0aXZlX3J4X2NvYWxlc2NlKQorCQkJbmV0aWZfaW5mbyhhZGFwdGVyLCBkcnYsIG5ldGRldiwgInJ4LXVzZWNzPTAsIG5lZWQgdG8gZGlzYWJsZSBhZGFwdGl2ZS1yeCBmb3IgYSBjb21wbGV0ZSBkaXNhYmxlXG4iKTsKKwl9IGVsc2UgaWYgKChlYy0+cnhfY29hbGVzY2VfdXNlY3MgPCAoSTQwRV9NSU5fSVRSIDw8IDEpKSB8fAorCQkgICAoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzID4gKEk0MEVfTUFYX0lUUiA8PCAxKSkpIHsKKwkJbmV0aWZfaW5mbyhhZGFwdGVyLCBkcnYsIG5ldGRldiwgIkludmFsaWQgdmFsdWUsIHJ4LXVzZWNzIHJhbmdlIGlzIDAtODE2MFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAotCWlmIChJVFJfSVNfRFlOQU1JQyh2c2ktPnR4X2l0cl9zZXR0aW5nKSkKLQkJZWMtPnVzZV9hZGFwdGl2ZV90eF9jb2FsZXNjZSA9IDE7CisJZWxzZQorCWlmIChlYy0+dHhfY29hbGVzY2VfdXNlY3MgPT0gMCkgeworCQlpZiAoZWMtPnVzZV9hZGFwdGl2ZV90eF9jb2FsZXNjZSkKKwkJCW5ldGlmX2luZm8oYWRhcHRlciwgZHJ2LCBuZXRkZXYsICJ0eC11c2Vjcz0wLCBuZWVkIHRvIGRpc2FibGUgYWRhcHRpdmUtdHggZm9yIGEgY29tcGxldGUgZGlzYWJsZVxuIik7CisJfSBlbHNlIGlmICgoZWMtPnR4X2NvYWxlc2NlX3VzZWNzIDwgKEk0MEVfTUlOX0lUUiA8PCAxKSkgfHwKKwkJICAgKGVjLT50eF9jb2FsZXNjZV91c2VjcyA+IChJNDBFX01BWF9JVFIgPDwgMSkpKSB7CisJCW5ldGlmX2luZm8oYWRhcHRlciwgZHJ2LCBuZXRkZXYsICJJbnZhbGlkIHZhbHVlLCB0eC11c2VjcyByYW5nZSBpcyAwLTgxNjBcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKLQllYy0+cnhfY29hbGVzY2VfdXNlY3MgPSB2c2ktPnJ4X2l0cl9zZXR0aW5nICYgfkk0MEVfSVRSX0RZTkFNSUM7Ci0JZWMtPnR4X2NvYWxlc2NlX3VzZWNzID0gdnNpLT50eF9pdHJfc2V0dGluZyAmIH5JNDBFX0lUUl9EWU5BTUlDOworCS8qIFJ4IGFuZCBUeCB1c2VjcyBoYXMgcGVyIHF1ZXVlIHZhbHVlLiBJZiB1c2VyIGRvZXNuJ3Qgc3BlY2lmeSB0aGUKKwkgKiBxdWV1ZSwgYXBwbHkgdG8gYWxsIHF1ZXVlcy4KKwkgKi8KKwlpZiAocXVldWUgPCAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fYWN0aXZlX3F1ZXVlczsgaSsrKQorCQkJaTQwZXZmX3NldF9pdHJfcGVyX3F1ZXVlKGFkYXB0ZXIsIGVjLCBpKTsKKwl9IGVsc2UgaWYgKHF1ZXVlIDwgYWRhcHRlci0+bnVtX2FjdGl2ZV9xdWV1ZXMpIHsKKwkJaTQwZXZmX3NldF9pdHJfcGVyX3F1ZXVlKGFkYXB0ZXIsIGVjLCBxdWV1ZSk7CisJfSBlbHNlIHsKKwkJbmV0aWZfaW5mbyhhZGFwdGVyLCBkcnYsIG5ldGRldiwgIkludmFsaWQgcXVldWUgdmFsdWUsIHF1ZXVlIHJhbmdlIGlzIDAgLSAlZFxuIiwKKwkJCSAgIGFkYXB0ZXItPm51bV9hY3RpdmVfcXVldWVzIC0gMSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtMzEwLDU2ICs0NzMsMjcgQEAKICAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKICAqIEBlYzogZXRodG9vbCBjb2FsZXNjZSBzdHJ1Y3R1cmUKICAqCi0gKiBDaGFuZ2UgY3VycmVudCBjb2FsZXNjaW5nIHNldHRpbmdzLgorICogQ2hhbmdlIGN1cnJlbnQgY29hbGVzY2luZyBzZXR0aW5ncyBmb3IgZXZlcnkgcXVldWUuCiAgKiovCiBzdGF0aWMgaW50IGk0MGV2Zl9zZXRfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKIAkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqZWMpCiB7Ci0Jc3RydWN0IGk0MGV2Zl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlzdHJ1Y3QgaTQwZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7Ci0Jc3RydWN0IGk0MGVfdnNpICp2c2kgPSAmYWRhcHRlci0+dnNpOwotCXN0cnVjdCBpNDBlX3FfdmVjdG9yICpxX3ZlY3RvcjsKLQlpbnQgaTsKKwlyZXR1cm4gX19pNDBldmZfc2V0X2NvYWxlc2NlKG5ldGRldiwgZWMsIC0xKTsKK30KIAotCWlmIChlYy0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaXJxIHx8IGVjLT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lc19pcnEpCi0JCXZzaS0+d29ya19saW1pdCA9IGVjLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lc19pcnE7Ci0KLQlpZiAoKGVjLT5yeF9jb2FsZXNjZV91c2VjcyA+PSAoSTQwRV9NSU5fSVRSIDw8IDEpKSAmJgotCSAgICAoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzIDw9IChJNDBFX01BWF9JVFIgPDwgMSkpKQotCQl2c2ktPnJ4X2l0cl9zZXR0aW5nID0gZWMtPnJ4X2NvYWxlc2NlX3VzZWNzOwotCi0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICgoZWMtPnR4X2NvYWxlc2NlX3VzZWNzID49IChJNDBFX01JTl9JVFIgPDwgMSkpICYmCi0JICAgIChlYy0+dHhfY29hbGVzY2VfdXNlY3MgPD0gKEk0MEVfTUFYX0lUUiA8PCAxKSkpCi0JCXZzaS0+dHhfaXRyX3NldHRpbmcgPSBlYy0+dHhfY29hbGVzY2VfdXNlY3M7Ci0JZWxzZSBpZiAoZWMtPnVzZV9hZGFwdGl2ZV90eF9jb2FsZXNjZSkKLQkJdnNpLT50eF9pdHJfc2V0dGluZyA9IChJNDBFX0lUUl9EWU5BTUlDIHwKLQkJCQkgICAgICAgSVRSX1JFR19UT19VU0VDKEk0MEVfSVRSX1JYX0RFRikpOwotCWVsc2UKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoZWMtPnVzZV9hZGFwdGl2ZV9yeF9jb2FsZXNjZSkKLQkJdnNpLT5yeF9pdHJfc2V0dGluZyB8PSBJNDBFX0lUUl9EWU5BTUlDOwotCWVsc2UKLQkJdnNpLT5yeF9pdHJfc2V0dGluZyAmPSB+STQwRV9JVFJfRFlOQU1JQzsKLQotCWlmIChlYy0+dXNlX2FkYXB0aXZlX3R4X2NvYWxlc2NlKQotCQl2c2ktPnR4X2l0cl9zZXR0aW5nIHw9IEk0MEVfSVRSX0RZTkFNSUM7Ci0JZWxzZQotCQl2c2ktPnR4X2l0cl9zZXR0aW5nICY9IH5JNDBFX0lUUl9EWU5BTUlDOwotCi0JZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9tc2l4X3ZlY3RvcnMgLSBOT05RX1ZFQ1M7IGkrKykgewotCQlxX3ZlY3RvciA9ICZhZGFwdGVyLT5xX3ZlY3RvcnNbaV07Ci0JCXFfdmVjdG9yLT5yeC5pdHIgPSBJVFJfVE9fUkVHKHZzaS0+cnhfaXRyX3NldHRpbmcpOwotCQl3cjMyKGh3LCBJNDBFX1ZGSU5UX0lUUk4xKDAsIGkpLCBxX3ZlY3Rvci0+cnguaXRyKTsKLQkJcV92ZWN0b3ItPnR4Lml0ciA9IElUUl9UT19SRUcodnNpLT50eF9pdHJfc2V0dGluZyk7Ci0JCXdyMzIoaHcsIEk0MEVfVkZJTlRfSVRSTjEoMSwgaSksIHFfdmVjdG9yLT50eC5pdHIpOwotCQlpNDBlX2ZsdXNoKGh3KTsKLQl9Ci0KLQlyZXR1cm4gMDsKKy8qKgorICogaTQwZXZmX3NldF9wZXJfcXVldWVfY29hbGVzY2UgLSBzZXQgc3BlY2lmaWMgcXVldWUncyBjb2FsZXNjZSBzZXR0aW5ncworICogQG5ldGRldjogdGhlIG5ldGRldiB0byBjaGFuZ2UKKyAqIEBlYzogZXRodG9vbCdzIGNvYWxlc2NlIHNldHRpbmdzCisgKiBAcXVldWU6IHRoZSBxdWV1ZSB0byBtb2RpZnkKKyAqCisgKiBNb2RpZmllcyBhIHNwZWNpZmljIHF1ZXVlJ3MgY29hbGVzY2Ugc2V0dGluZ3MuCisgKi8KK3N0YXRpYyBpbnQgaTQwZXZmX3NldF9wZXJfcXVldWVfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQkJIHUzMiBxdWV1ZSwKKwkJCQkJIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICplYykKK3sKKwlyZXR1cm4gX19pNDBldmZfc2V0X2NvYWxlc2NlKG5ldGRldiwgZWMsIHF1ZXVlKTsKIH0KIAogLyoqCkBAIC01MTMsNiArNjQ3LDggQEAKIAkuc2V0X21zZ2xldmVsCQk9IGk0MGV2Zl9zZXRfbXNnbGV2ZWwsCiAJLmdldF9jb2FsZXNjZQkJPSBpNDBldmZfZ2V0X2NvYWxlc2NlLAogCS5zZXRfY29hbGVzY2UJCT0gaTQwZXZmX3NldF9jb2FsZXNjZSwKKwkuZ2V0X3Blcl9xdWV1ZV9jb2FsZXNjZSA9IGk0MGV2Zl9nZXRfcGVyX3F1ZXVlX2NvYWxlc2NlLAorCS5zZXRfcGVyX3F1ZXVlX2NvYWxlc2NlID0gaTQwZXZmX3NldF9wZXJfcXVldWVfY29hbGVzY2UsCiAJLmdldF9yeG5mYwkJPSBpNDBldmZfZ2V0X3J4bmZjLAogCS5nZXRfcnhmaF9pbmRpcl9zaXplCT0gaTQwZXZmX2dldF9yeGZoX2luZGlyX3NpemUsCiAJLmdldF9yeGZoCQk9IGk0MGV2Zl9nZXRfcnhmaCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBldmZfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGV2Zl9tYWluLmMKaW5kZXggNjAwZmI5Yy4uMTQzNzI4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGV2Zl9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGV2Zl9tYWluLmMKQEAgLTM4LDcgKzM4LDcgQEAKIAogI2RlZmluZSBEUlZfVkVSU0lPTl9NQUpPUiAxCiAjZGVmaW5lIERSVl9WRVJTSU9OX01JTk9SIDYKLSNkZWZpbmUgRFJWX1ZFUlNJT05fQlVJTEQgMTEKKyNkZWZpbmUgRFJWX1ZFUlNJT05fQlVJTEQgMTYKICNkZWZpbmUgRFJWX1ZFUlNJT04gX19zdHJpbmdpZnkoRFJWX1ZFUlNJT05fTUFKT1IpICIuIiBcCiAJICAgICBfX3N0cmluZ2lmeShEUlZfVkVSU0lPTl9NSU5PUikgIi4iIFwKIAkgICAgIF9fc3RyaW5naWZ5KERSVl9WRVJTSU9OX0JVSUxEKSBcCkBAIC0zNzAsNiArMzcwLDcgQEAKIHsKIAlzdHJ1Y3QgaTQwZV9xX3ZlY3RvciAqcV92ZWN0b3IgPSAmYWRhcHRlci0+cV92ZWN0b3JzW3ZfaWR4XTsKIAlzdHJ1Y3QgaTQwZV9yaW5nICpyeF9yaW5nID0gJmFkYXB0ZXItPnJ4X3JpbmdzW3JfaWR4XTsKKwlzdHJ1Y3QgaTQwZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAKIAlyeF9yaW5nLT5xX3ZlY3RvciA9IHFfdmVjdG9yOwogCXJ4X3JpbmctPm5leHQgPSBxX3ZlY3Rvci0+cngucmluZzsKQEAgLTM3Nyw3ICszNzgsMTAgQEAKIAlxX3ZlY3Rvci0+cngucmluZyA9IHJ4X3Jpbmc7CiAJcV92ZWN0b3ItPnJ4LmNvdW50Kys7CiAJcV92ZWN0b3ItPnJ4LmxhdGVuY3lfcmFuZ2UgPSBJNDBFX0xPV19MQVRFTkNZOworCXFfdmVjdG9yLT5yeC5pdHIgPSBJVFJfVE9fUkVHKHJ4X3JpbmctPnJ4X2l0cl9zZXR0aW5nKTsKKwlxX3ZlY3Rvci0+cmluZ19tYXNrIHw9IEJJVChyX2lkeCk7CiAJcV92ZWN0b3ItPml0cl9jb3VudGRvd24gPSBJVFJfQ09VTlRET1dOX1NUQVJUOworCXdyMzIoaHcsIEk0MEVfVkZJTlRfSVRSTjEoSTQwRV9SWF9JVFIsIHZfaWR4IC0gMSksIHFfdmVjdG9yLT5yeC5pdHIpOwogfQogCiAvKioKQEAgLTM5MSw2ICszOTUsNyBAQAogewogCXN0cnVjdCBpNDBlX3FfdmVjdG9yICpxX3ZlY3RvciA9ICZhZGFwdGVyLT5xX3ZlY3RvcnNbdl9pZHhdOwogCXN0cnVjdCBpNDBlX3JpbmcgKnR4X3JpbmcgPSAmYWRhcHRlci0+dHhfcmluZ3NbdF9pZHhdOworCXN0cnVjdCBpNDBlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAogCXR4X3JpbmctPnFfdmVjdG9yID0gcV92ZWN0b3I7CiAJdHhfcmluZy0+bmV4dCA9IHFfdmVjdG9yLT50eC5yaW5nOwpAQCAtMzk4LDkgKzQwMywxMCBAQAogCXFfdmVjdG9yLT50eC5yaW5nID0gdHhfcmluZzsKIAlxX3ZlY3Rvci0+dHguY291bnQrKzsKIAlxX3ZlY3Rvci0+dHgubGF0ZW5jeV9yYW5nZSA9IEk0MEVfTE9XX0xBVEVOQ1k7CisJcV92ZWN0b3ItPnR4Lml0ciA9IElUUl9UT19SRUcodHhfcmluZy0+dHhfaXRyX3NldHRpbmcpOwogCXFfdmVjdG9yLT5pdHJfY291bnRkb3duID0gSVRSX0NPVU5URE9XTl9TVEFSVDsKIAlxX3ZlY3Rvci0+bnVtX3JpbmdwYWlycysrOwotCXFfdmVjdG9yLT5yaW5nX21hc2sgfD0gQklUKHRfaWR4KTsKKwl3cjMyKGh3LCBJNDBFX1ZGSU5UX0lUUk4xKEk0MEVfVFhfSVRSLCB2X2lkeCAtIDEpLCBxX3ZlY3Rvci0+dHguaXRyKTsKIH0KIAogLyoqCkBAIC0xMDA3LDcgKzEwMTMsNyBAQAogICogaTQwZXZmX3VwX2NvbXBsZXRlIC0gRmluaXNoIHRoZSBsYXN0IHN0ZXBzIG9mIGJyaW5naW5nIHVwIGEgY29ubmVjdGlvbgogICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCiAgKiovCi1zdGF0aWMgaW50IGk0MGV2Zl91cF9jb21wbGV0ZShzdHJ1Y3QgaTQwZXZmX2FkYXB0ZXIgKmFkYXB0ZXIpCitzdGF0aWMgdm9pZCBpNDBldmZfdXBfY29tcGxldGUoc3RydWN0IGk0MGV2Zl9hZGFwdGVyICphZGFwdGVyKQogewogCWFkYXB0ZXItPnN0YXRlID0gX19JNDBFVkZfUlVOTklORzsKIAljbGVhcl9iaXQoX19JNDBFX0RPV04sICZhZGFwdGVyLT52c2kuc3RhdGUpOwpAQCAtMTAxNiw3ICsxMDIyLDYgQEAKIAogCWFkYXB0ZXItPmFxX3JlcXVpcmVkIHw9IEk0MEVWRl9GTEFHX0FRX0VOQUJMRV9RVUVVRVM7CiAJbW9kX3RpbWVyX3BlbmRpbmcoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyLCBqaWZmaWVzICsgMSk7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtMTAzNyw2ICsxMDQyLDcgQEAKIAogCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CiAJbmV0aWZfdHhfZGlzYWJsZShuZXRkZXYpOworCWFkYXB0ZXItPmxpbmtfdXAgPSBmYWxzZTsKIAlpNDBldmZfbmFwaV9kaXNhYmxlX2FsbChhZGFwdGVyKTsKIAlpNDBldmZfaXJxX2Rpc2FibGUoYWRhcHRlcik7CiAKQEAgLTExNTQsNiArMTE2MCw3IEBACiAJCXR4X3JpbmctPm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAkJdHhfcmluZy0+ZGV2ID0gJmFkYXB0ZXItPnBkZXYtPmRldjsKIAkJdHhfcmluZy0+Y291bnQgPSBhZGFwdGVyLT50eF9kZXNjX2NvdW50OworCQl0eF9yaW5nLT50eF9pdHJfc2V0dGluZyA9IChJNDBFX0lUUl9EWU5BTUlDIHwgSTQwRV9JVFJfVFhfREVGKTsKIAkJaWYgKGFkYXB0ZXItPmZsYWdzICYgSTQwRV9GTEFHX1dCX09OX0lUUl9DQVBBQkxFKQogCQkJdHhfcmluZy0+ZmxhZ3MgfD0gSTQwRV9UWFJfRkxBR1NfV0JfT05fSVRSOwogCkBAIC0xMTYyLDYgKzExNjksNyBAQAogCQlyeF9yaW5nLT5uZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CiAJCXJ4X3JpbmctPmRldiA9ICZhZGFwdGVyLT5wZGV2LT5kZXY7CiAJCXJ4X3JpbmctPmNvdW50ID0gYWRhcHRlci0+cnhfZGVzY19jb3VudDsKKwkJcnhfcmluZy0+cnhfaXRyX3NldHRpbmcgPSAoSTQwRV9JVFJfRFlOQU1JQyB8IEk0MEVfSVRSX1JYX0RFRik7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xNDIwLDcgKzE0MjgsOSBAQAogewogCWludCBlcnI7CiAKKwlydG5sX2xvY2soKTsKIAllcnIgPSBpNDBldmZfc2V0X2ludGVycnVwdF9jYXBhYmlsaXR5KGFkYXB0ZXIpOworCXJ0bmxfdW5sb2NrKCk7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCiAJCQkiVW5hYmxlIHRvIHNldHVwIGludGVycnVwdCBjYXBhYmlsaXRpZXNcbiIpOwpAQCAtMTcyOSw2ICsxNzM5LDcgQEAKIAkJCXNldF9iaXQoX19JNDBFX0RPV04sICZhZGFwdGVyLT52c2kuc3RhdGUpOwogCQkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKIAkJCW5ldGlmX3R4X2Rpc2FibGUobmV0ZGV2KTsKKwkJCWFkYXB0ZXItPmxpbmtfdXAgPSBmYWxzZTsKIAkJCWk0MGV2Zl9uYXBpX2Rpc2FibGVfYWxsKGFkYXB0ZXIpOwogCQkJaTQwZXZmX2lycV9kaXNhYmxlKGFkYXB0ZXIpOwogCQkJaTQwZXZmX2ZyZWVfdHJhZmZpY19pcnFzKGFkYXB0ZXIpOwpAQCAtMTc2Nyw2ICsxNzc4LDcgQEAKIAlpZiAobmV0aWZfcnVubmluZyhhZGFwdGVyLT5uZXRkZXYpKSB7CiAJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CiAJCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhuZXRkZXYpOworCQlhZGFwdGVyLT5saW5rX3VwID0gZmFsc2U7CiAJCWk0MGV2Zl9uYXBpX2Rpc2FibGVfYWxsKGFkYXB0ZXIpOwogCX0KIAlpNDBldmZfaXJxX2Rpc2FibGUoYWRhcHRlcik7CkBAIC0xNzgxLDggKzE3OTMsNyBAQAogCWk0MGV2Zl9mcmVlX2FsbF90eF9yZXNvdXJjZXMoYWRhcHRlcik7CiAKIAkvKiBraWxsIGFuZCByZWluaXQgdGhlIGFkbWluIHF1ZXVlICovCi0JaWYgKGk0MGV2Zl9zaHV0ZG93bl9hZG1pbnEoaHcpKQotCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LCAiRmFpbGVkIHRvIHNodXQgZG93biBhZG1pbnFcbiIpOworCWk0MGV2Zl9zaHV0ZG93bl9hZG1pbnEoaHcpOwogCWFkYXB0ZXItPmN1cnJlbnRfb3AgPSBJNDBFX1ZJUlRDSE5MX09QX1VOS05PV047CiAJZXJyID0gaTQwZXZmX2luaXRfYWRtaW5xKGh3KTsKIAlpZiAoZXJyKQpAQCAtMTgwMiw2ICsxODEzLDggQEAKIAl9CiAJYWRhcHRlci0+YXFfcmVxdWlyZWQgfD0gSTQwRVZGX0ZMQUdfQVFfQUREX01BQ19GSUxURVI7CiAJYWRhcHRlci0+YXFfcmVxdWlyZWQgfD0gSTQwRVZGX0ZMQUdfQVFfQUREX1ZMQU5fRklMVEVSOworCS8qIE9wZW4gUkRNQSBDbGllbnQgYWdhaW4gKi8KKwlhZGFwdGVyLT5hcV9yZXF1aXJlZCB8PSBJNDBFVkZfRkxBR19TRVJWSUNFX0NMSUVOVF9SRVFVRVNURUQ7CiAJY2xlYXJfYml0KF9fSTQwRVZGX0lOX0NSSVRJQ0FMX1RBU0ssICZhZGFwdGVyLT5jcml0X3NlY3Rpb24pOwogCWk0MGV2Zl9taXNjX2lycV9lbmFibGUoYWRhcHRlcik7CiAKQEAgLTE4MjAsOSArMTgzMyw3IEBACiAKIAkJaTQwZXZmX2NvbmZpZ3VyZShhZGFwdGVyKTsKIAotCQllcnIgPSBpNDBldmZfdXBfY29tcGxldGUoYWRhcHRlcik7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIHJlc2V0X2VycjsKKwkJaTQwZXZmX3VwX2NvbXBsZXRlKGFkYXB0ZXIpOwogCiAJCWk0MGV2Zl9pcnFfZW5hYmxlKGFkYXB0ZXIsIHRydWUpOwogCX0gZWxzZSB7CkBAIC0yMDUyLDkgKzIwNjMsNyBAQAogCWk0MGV2Zl9hZGRfZmlsdGVyKGFkYXB0ZXIsIGFkYXB0ZXItPmh3Lm1hYy5hZGRyKTsKIAlpNDBldmZfY29uZmlndXJlKGFkYXB0ZXIpOwogCi0JZXJyID0gaTQwZXZmX3VwX2NvbXBsZXRlKGFkYXB0ZXIpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX3JlcV9pcnE7CisJaTQwZXZmX3VwX2NvbXBsZXRlKGFkYXB0ZXIpOwogCiAJaTQwZXZmX2lycV9lbmFibGUoYWRhcHRlciwgdHJ1ZSk7CiAKQEAgLTIyNjgsMTAgKzIyNzcsNiBAQAogCWFkYXB0ZXItPnZzaS5iYWNrID0gYWRhcHRlcjsKIAlhZGFwdGVyLT52c2kuYmFzZV92ZWN0b3IgPSAxOwogCWFkYXB0ZXItPnZzaS53b3JrX2xpbWl0ID0gSTQwRV9ERUZBVUxUX0lSUV9XT1JLOwotCWFkYXB0ZXItPnZzaS5yeF9pdHJfc2V0dGluZyA9IChJNDBFX0lUUl9EWU5BTUlDIHwKLQkJCQkgICAgICAgSVRSX1JFR19UT19VU0VDKEk0MEVfSVRSX1JYX0RFRikpOwotCWFkYXB0ZXItPnZzaS50eF9pdHJfc2V0dGluZyA9IChJNDBFX0lUUl9EWU5BTUlDIHwKLQkJCQkgICAgICAgSVRSX1JFR19UT19VU0VDKEk0MEVfSVRSX1RYX0RFRikpOwogCXZzaS0+bmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwogCXZzaS0+cXNfaGFuZGxlID0gYWRhcHRlci0+dnNpX3Jlcy0+cXNldF9oYW5kbGU7CiAJaWYgKHZmcmVzLT52Zl9vZmZsb2FkX2ZsYWdzICYgSTQwRV9WSVJUQ0hOTF9WRl9PRkZMT0FEX1JTU19QRikgewpAQCAtMjQ1Myw2ICsyNDU4LDcgQEAKIAkJZ290byBlcnJfc3dfaW5pdDsKIAogCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisJYWRhcHRlci0+bGlua191cCA9IGZhbHNlOwogCiAJaWYgKCFhZGFwdGVyLT5uZXRkZXZfcmVnaXN0ZXJlZCkgewogCQllcnIgPSByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKQEAgLTI4MzEsNyArMjgzNyw4IEBACiAKIAlwcl9pbmZvKCIlc1xuIiwgaTQwZXZmX2NvcHlyaWdodCk7CiAKLQlpNDBldmZfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShpNDBldmZfZHJpdmVyX25hbWUpOworCWk0MGV2Zl93cSA9IGFsbG9jX3dvcmtxdWV1ZSgiJXMiLCBXUV9VTkJPVU5EIHwgV1FfTUVNX1JFQ0xBSU0sIDEsCisJCQkJICAgIGk0MGV2Zl9kcml2ZXJfbmFtZSk7CiAJaWYgKCFpNDBldmZfd3EpIHsKIAkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGNyZWF0ZSB3b3JrcXVldWVcbiIsIGk0MGV2Zl9kcml2ZXJfbmFtZSk7CiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGV2Zl92aXJ0Y2hubC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGV2Zl92aXJ0Y2hubC5jCmluZGV4IGQ3NmMyMjEuLmRkZjQ3OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBldmZfdmlydGNobmwuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZXZmX3ZpcnRjaG5sLmMKQEAgLTgxNyw2ICs4MTcsNDUgQEAKIH0KIAogLyoqCisgKiBpNDBldmZfcHJpbnRfbGlua19tZXNzYWdlIC0gcHJpbnQgbGluayB1cCBvciBkb3duCisgKiBAYWRhcHRlcjogYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiBMb2cgYSBtZXNzYWdlIHRlbGxpbmcgdGhlIHdvcmxkIG9mIG91ciB3b25kZXJvdXMgbGluayBzdGF0dXMKKyAqLworc3RhdGljIHZvaWQgaTQwZXZmX3ByaW50X2xpbmtfbWVzc2FnZShzdHJ1Y3QgaTQwZXZmX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwljaGFyICpzcGVlZCA9ICJVbmtub3duICI7CisKKwlpZiAoIWFkYXB0ZXItPmxpbmtfdXApIHsKKwkJbmV0ZGV2X2luZm8obmV0ZGV2LCAiTklDIExpbmsgaXMgRG93blxuIik7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKGFkYXB0ZXItPmxpbmtfc3BlZWQpIHsKKwljYXNlIEk0MEVfTElOS19TUEVFRF80MEdCOgorCQlzcGVlZCA9ICI0MCBHIjsKKwkJYnJlYWs7CisJY2FzZSBJNDBFX0xJTktfU1BFRURfMjBHQjoKKwkJc3BlZWQgPSAiMjAgRyI7CisJCWJyZWFrOworCWNhc2UgSTQwRV9MSU5LX1NQRUVEXzEwR0I6CisJCXNwZWVkID0gIjEwIEciOworCQlicmVhazsKKwljYXNlIEk0MEVfTElOS19TUEVFRF8xR0I6CisJCXNwZWVkID0gIjEwMDAgTSI7CisJCWJyZWFrOworCWNhc2UgSTQwRV9MSU5LX1NQRUVEXzEwME1COgorCQlzcGVlZCA9ICIxMDAgTSI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCW5ldGRldl9pbmZvKG5ldGRldiwgIk5JQyBMaW5rIGlzIFVwICVzYnBzIEZ1bGwgRHVwbGV4XG4iLCBzcGVlZCk7Cit9CisKKy8qKgogICogaTQwZXZmX3JlcXVlc3RfcmVzZXQKICAqIEBhZGFwdGVyOiBhZGFwdGVyIHN0cnVjdHVyZQogICoKQEAgLTg1MywxNiArODkyLDIwIEBACiAJCQkoc3RydWN0IGk0MGVfdmlydGNobmxfcGZfZXZlbnQgKiltc2c7CiAJCXN3aXRjaCAodnBlLT5ldmVudCkgewogCQljYXNlIEk0MEVfVklSVENITkxfRVZFTlRfTElOS19DSEFOR0U6Ci0JCQlhZGFwdGVyLT5saW5rX3VwID0KLQkJCQl2cGUtPmV2ZW50X2RhdGEubGlua19ldmVudC5saW5rX3N0YXR1czsKLQkJCWlmIChhZGFwdGVyLT5saW5rX3VwICYmICFuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKLQkJCQlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCAiTklDIExpbmsgaXMgVXBcbiIpOwotCQkJCW5ldGlmX2NhcnJpZXJfb24obmV0ZGV2KTsKLQkJCQluZXRpZl90eF93YWtlX2FsbF9xdWV1ZXMobmV0ZGV2KTsKLQkJCX0gZWxzZSBpZiAoIWFkYXB0ZXItPmxpbmtfdXApIHsKLQkJCQlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCAiTklDIExpbmsgaXMgRG93blxuIik7Ci0JCQkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKLQkJCQluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMobmV0ZGV2KTsKKwkJCWFkYXB0ZXItPmxpbmtfc3BlZWQgPQorCQkJCXZwZS0+ZXZlbnRfZGF0YS5saW5rX2V2ZW50Lmxpbmtfc3BlZWQ7CisJCQlpZiAoYWRhcHRlci0+bGlua191cCAhPQorCQkJICAgIHZwZS0+ZXZlbnRfZGF0YS5saW5rX2V2ZW50Lmxpbmtfc3RhdHVzKSB7CisJCQkJYWRhcHRlci0+bGlua191cCA9CisJCQkJCXZwZS0+ZXZlbnRfZGF0YS5saW5rX2V2ZW50Lmxpbmtfc3RhdHVzOworCQkJCWlmIChhZGFwdGVyLT5saW5rX3VwKSB7CisJCQkJCW5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXMobmV0ZGV2KTsKKwkJCQkJbmV0aWZfY2Fycmllcl9vbihuZXRkZXYpOworCQkJCX0gZWxzZSB7CisJCQkJCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhuZXRkZXYpOworCQkJCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCQkJCX0KKwkJCQlpNDBldmZfcHJpbnRfbGlua19tZXNzYWdlKGFkYXB0ZXIpOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgSTQwRV9WSVJUQ0hOTF9FVkVOVF9SRVNFVF9JTVBFTkRJTkc6CkBAIC05MzcsOCArOTgwLDYgQEAKIAljYXNlIEk0MEVfVklSVENITkxfT1BfRU5BQkxFX1FVRVVFUzoKIAkJLyogZW5hYmxlIHRyYW5zbWl0cyAqLwogCQlpNDBldmZfaXJxX2VuYWJsZShhZGFwdGVyLCB0cnVlKTsKLQkJbmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyhhZGFwdGVyLT5uZXRkZXYpOwotCQluZXRpZl9jYXJyaWVyX29uKGFkYXB0ZXItPm5ldGRldik7CiAJCWJyZWFrOwogCWNhc2UgSTQwRV9WSVJUQ0hOTF9PUF9ESVNBQkxFX1FVRVVFUzoKIAkJaTQwZXZmX2ZyZWVfYWxsX3R4X3Jlc291cmNlcyhhZGFwdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF84MjU3NS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwXzgyNTc1LmgKaW5kZXggMTk5ZmY5OC4uYWNmMDYwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwXzgyNTc1LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwXzgyNTc1LmgKQEAgLTE4OCw2ICsxODgsMTEgQEAKIC8qIEVUUUYgcmVnaXN0ZXIgYml0IGRlZmluaXRpb25zICovCiAjZGVmaW5lIEUxMDAwX0VUUUZfRklMVEVSX0VOQUJMRSAgIEJJVCgyNikKICNkZWZpbmUgRTEwMDBfRVRRRl8xNTg4ICAgICAgICAgICAgQklUKDMwKQorI2RlZmluZSBFMTAwMF9FVFFGX0lNTV9JTlQgICAgICAgICBCSVQoMjkpCisjZGVmaW5lIEUxMDAwX0VUUUZfUVVFVUVfRU5BQkxFICAgIEJJVCgzMSkKKyNkZWZpbmUgRTEwMDBfRVRRRl9RVUVVRV9TSElGVCAgICAgMTYKKyNkZWZpbmUgRTEwMDBfRVRRRl9RVUVVRV9NQVNLICAgICAgMHgwMDA3MDAwMAorI2RlZmluZSBFMTAwMF9FVFFGX0VUWVBFX01BU0sgICAgICAweDAwMDBGRkZGCiAKIC8qIEZUUUYgcmVnaXN0ZXIgYml0IGRlZmluaXRpb25zICovCiAjZGVmaW5lIEUxMDAwX0ZUUUZfVkZfQlAgICAgICAgICAgICAgICAweDAwMDA4MDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfZGVmaW5lcy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwX2RlZmluZXMuaAppbmRleCAyOTk3YzQ0Li4yNjg4MTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfZGVmaW5lcy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9kZWZpbmVzLmgKQEAgLTEwMjQsNCArMTAyNCw4IEBACiAjZGVmaW5lIEUxMDAwX1JUVEJDTlJDX1JGX0lOVF9NQVNLCVwKIAkoRTEwMDBfUlRUQkNOUkNfUkZfREVDX01BU0sgPDwgRTEwMDBfUlRUQkNOUkNfUkZfSU5UX1NISUZUKQogCisjZGVmaW5lIEUxMDAwX1ZMQVBRRl9RVUVVRV9TRUwoX24sIHFfaWR4KSAocV9pZHggPDwgKChfbikgKiA0KSkKKyNkZWZpbmUgRTEwMDBfVkxBUFFGX1BfVkFMSUQoX24pCSgweDEgPDwgKDMgKyAoX24pICogNCkpCisjZGVmaW5lIEUxMDAwX1ZMQVBRRl9RVUVVRV9NQVNLCTB4MDMKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfcmVncy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2UxMDAwX3JlZ3MuaAppbmRleCAyMWQ5ZDAyLi5kODRhZmRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfcmVncy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF9yZWdzLmgKQEAgLTMwOSw2ICszMDksNyBAQAogCQkJCQkoMHgwNTRFMCArICgoX2kgLSAxNikgKiA4KSkpCiAjZGVmaW5lIEUxMDAwX1JBSChfaSkgICgoKF9pKSA8PSAxNSkgPyAoMHgwNTQwNCArICgoX2kpICogOCkpIDogXAogCQkJCQkoMHgwNTRFNCArICgoX2kgLSAxNikgKiA4KSkpCisjZGVmaW5lIEUxMDAwX1ZMQVBRRgkweDA1NUIwICAvKiBWTEFOIFByaW9yaXR5IFF1ZXVlIEZpbHRlciBWTEFQUUYgKi8KICNkZWZpbmUgRTEwMDBfSVA0QVRfUkVHKF9pKSAgICAgKDB4MDU4NDAgKyAoKF9pKSAqIDgpKQogI2RlZmluZSBFMTAwMF9JUDZBVF9SRUcoX2kpICAgICAoMHgwNTg4MCArICgoX2kpICogNCkpCiAjZGVmaW5lIEUxMDAwX1dVUE1fUkVHKF9pKSAgICAgICgweDA1QTAwICsgKChfaSkgKiA0KSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9pZ2IuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9pZ2IuaAppbmRleCA1Mzg3YjNhLi5kMTEwOTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvaWdiLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYi5oCkBAIC0zNTAsMTEgKzM1MCw0OSBAQAogCX07CiAjZW5kaWYKIAorLyogVGhlIG51bWJlciBvZiBMMiBldGhlci10eXBlIGZpbHRlciByZWdpc3RlcnMsIEluZGV4IDMgaXMgcmVzZXJ2ZWQKKyAqIGZvciBQVFAgMTU4OCB0aW1lc3RhbXAKKyAqLworI2RlZmluZSBNQVhfRVRZUEVfRklMVEVSCSg0IC0gMSkKKy8qIEVUUUYgZmlsdGVyIGxpc3Q6IG9uZSBzdGF0aWMgZmlsdGVyIHBlciBmaWx0ZXIgY29uc3VtZXIuIFRoaXMgaXMKKyAqIHRvIGF2b2lkIGZpbHRlciBjb2xsaXNpb25zIGxhdGVyLiBBZGQgbmV3IGZpbHRlcnMgaGVyZSEhCisgKgorICogQ3VycmVudCBmaWx0ZXJzOgkJRmlsdGVyIDMKKyAqLworI2RlZmluZSBJR0JfRVRRRl9GSUxURVJfMTU4OAkzCisKICNkZWZpbmUgSUdCX05fRVhUVFMJMgogI2RlZmluZSBJR0JfTl9QRVJPVVQJMgogI2RlZmluZSBJR0JfTl9TRFAJNAogI2RlZmluZSBJR0JfUkVUQV9TSVpFCTEyOAogCitlbnVtIGlnYl9maWx0ZXJfbWF0Y2hfZmxhZ3MgeworCUlHQl9GSUxURVJfRkxBR19FVEhFUl9UWVBFID0gMHgxLAorCUlHQl9GSUxURVJfRkxBR19WTEFOX1RDSSAgID0gMHgyLAorfTsKKworI2RlZmluZSBJR0JfTUFYX1JYTkZDX0ZJTFRFUlMgMTYKKworLyogUlggbmV0d29yayBmbG93IGNsYXNzaWZpY2F0aW9uIGRhdGEgc3RydWN0dXJlICovCitzdHJ1Y3QgaWdiX25mY19pbnB1dCB7CisJLyogQnl0ZSBsYXlvdXQgaW4gb3JkZXIsIGFsbCB2YWx1ZXMgd2l0aCBNU0IgZmlyc3Q6CisJICogbWF0Y2hfZmxhZ3MgLSAxIGJ5dGUKKwkgKiBldHlwZSAtIDIgYnl0ZXMKKwkgKiB2bGFuX3RjaSAtIDIgYnl0ZXMKKwkgKi8KKwl1OCBtYXRjaF9mbGFnczsKKwlfX2JlMTYgZXR5cGU7CisJX19iZTE2IHZsYW5fdGNpOworfTsKKworc3RydWN0IGlnYl9uZmNfZmlsdGVyIHsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBuZmNfbm9kZTsKKwlzdHJ1Y3QgaWdiX25mY19pbnB1dCBmaWx0ZXI7CisJdTE2IGV0eXBlX3JlZ19pbmRleDsKKwl1MTYgc3dfaWR4OworCXUxNiBhY3Rpb247Cit9OworCiAvKiBib2FyZCBzcGVjaWZpYyBwcml2YXRlIGRhdGEgc3RydWN0dXJlICovCiBzdHJ1Y3QgaWdiX2FkYXB0ZXIgewogCXVuc2lnbmVkIGxvbmcgYWN0aXZlX3ZsYW5zW0JJVFNfVE9fTE9OR1MoVkxBTl9OX1ZJRCldOwpAQCAtNDUxLDYgKzQ4OSw3IEBACiAJc3RydWN0IHRpbWVjb3VudGVyIHRjOwogCXUzMiB0eF9od3RzdGFtcF90aW1lb3V0czsKIAl1MzIgcnhfaHd0c3RhbXBfY2xlYXJlZDsKKwlib29sIHBwc19zeXNfd3JhcF9vbjsKIAogCXN0cnVjdCBwdHBfcGluX2Rlc2Mgc2RwX2NvbmZpZ1tJR0JfTl9TRFBdOwogCXN0cnVjdCB7CkBAIC00NzMsNiArNTEyLDEzIEBACiAJaW50IGNvcHBlcl90cmllczsKIAlzdHJ1Y3QgZTEwMDBfaW5mbyBlaTsKIAl1MTYgZWVlX2FkdmVydDsKKworCS8qIFJYIG5ldHdvcmsgZmxvdyBjbGFzc2lmaWNhdGlvbiBzdXBwb3J0ICovCisJc3RydWN0IGhsaXN0X2hlYWQgbmZjX2ZpbHRlcl9saXN0OworCXVuc2lnbmVkIGludCBuZmNfZmlsdGVyX2NvdW50OworCS8qIGxvY2sgZm9yIFJYIG5ldHdvcmsgZmxvdyBjbGFzc2lmaWNhdGlvbiBmaWx0ZXIgKi8KKwlzcGlubG9ja190IG5mY19sb2NrOworCWJvb2wgZXR5cGVfYml0bWFwW01BWF9FVFlQRV9GSUxURVJdOwogfTsKIAogLyogZmxhZ3MgY29udHJvbGxpbmcgUFRQLzE1ODggZnVuY3Rpb24gKi8KQEAgLTU5OSw0ICs2NDUsOSBAQAogCXJldHVybiBuZXRkZXZfZ2V0X3R4X3F1ZXVlKHR4X3JpbmctPm5ldGRldiwgdHhfcmluZy0+cXVldWVfaW5kZXgpOwogfQogCitpbnQgaWdiX2FkZF9maWx0ZXIoc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyLAorCQkgICBzdHJ1Y3QgaWdiX25mY19maWx0ZXIgKmlucHV0KTsKK2ludCBpZ2JfZXJhc2VfZmlsdGVyKHN0cnVjdCBpZ2JfYWRhcHRlciAqYWRhcHRlciwKKwkJICAgICBzdHJ1Y3QgaWdiX25mY19maWx0ZXIgKmlucHV0KTsKKwogI2VuZGlmIC8qIF9JR0JfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9pZ2JfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYl9ldGh0b29sLmMKaW5kZXggNjRlOTFjNS4uNzM3YjY2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYl9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYl9ldGh0b29sLmMKQEAgLTI0MzEsNiArMjQzMSw2MyBAQAogCX0KIH0KIAorI2RlZmluZSBFVEhFUl9UWVBFX0ZVTExfTUFTSyAoKF9fZm9yY2UgX19iZTE2KX4wKQorc3RhdGljIGludCBpZ2JfZ2V0X2V0aHRvb2xfbmZjX2VudHJ5KHN0cnVjdCBpZ2JfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgICAgIHN0cnVjdCBldGh0b29sX3J4bmZjICpjbWQpCit7CisJc3RydWN0IGV0aHRvb2xfcnhfZmxvd19zcGVjICpmc3AgPSAmY21kLT5mczsKKwlzdHJ1Y3QgaWdiX25mY19maWx0ZXIgKnJ1bGUgPSBOVUxMOworCisJLyogcmVwb3J0IHRvdGFsIHJ1bGUgY291bnQgKi8KKwljbWQtPmRhdGEgPSBJR0JfTUFYX1JYTkZDX0ZJTFRFUlM7CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShydWxlLCAmYWRhcHRlci0+bmZjX2ZpbHRlcl9saXN0LCBuZmNfbm9kZSkgeworCQlpZiAoZnNwLT5sb2NhdGlvbiA8PSBydWxlLT5zd19pZHgpCisJCQlicmVhazsKKwl9CisKKwlpZiAoIXJ1bGUgfHwgZnNwLT5sb2NhdGlvbiAhPSBydWxlLT5zd19pZHgpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHJ1bGUtPmZpbHRlci5tYXRjaF9mbGFncykgeworCQlmc3AtPmZsb3dfdHlwZSA9IEVUSEVSX0ZMT1c7CisJCWZzcC0+cmluZ19jb29raWUgPSBydWxlLT5hY3Rpb247CisJCWlmIChydWxlLT5maWx0ZXIubWF0Y2hfZmxhZ3MgJiBJR0JfRklMVEVSX0ZMQUdfRVRIRVJfVFlQRSkgeworCQkJZnNwLT5oX3UuZXRoZXJfc3BlYy5oX3Byb3RvID0gcnVsZS0+ZmlsdGVyLmV0eXBlOworCQkJZnNwLT5tX3UuZXRoZXJfc3BlYy5oX3Byb3RvID0gRVRIRVJfVFlQRV9GVUxMX01BU0s7CisJCX0KKwkJaWYgKHJ1bGUtPmZpbHRlci5tYXRjaF9mbGFncyAmIElHQl9GSUxURVJfRkxBR19WTEFOX1RDSSkgeworCQkJZnNwLT5mbG93X3R5cGUgfD0gRkxPV19FWFQ7CisJCQlmc3AtPmhfZXh0LnZsYW5fdGNpID0gcnVsZS0+ZmlsdGVyLnZsYW5fdGNpOworCQkJZnNwLT5tX2V4dC52bGFuX3RjaSA9IGh0b25zKFZMQU5fUFJJT19NQVNLKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgaWdiX2dldF9ldGh0b29sX25mY19hbGwoc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyLAorCQkJCSAgIHN0cnVjdCBldGh0b29sX3J4bmZjICpjbWQsCisJCQkJICAgdTMyICpydWxlX2xvY3MpCit7CisJc3RydWN0IGlnYl9uZmNfZmlsdGVyICpydWxlOworCWludCBjbnQgPSAwOworCisJLyogcmVwb3J0IHRvdGFsIHJ1bGUgY291bnQgKi8KKwljbWQtPmRhdGEgPSBJR0JfTUFYX1JYTkZDX0ZJTFRFUlM7CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShydWxlLCAmYWRhcHRlci0+bmZjX2ZpbHRlcl9saXN0LCBuZmNfbm9kZSkgeworCQlpZiAoY250ID09IGNtZC0+cnVsZV9jbnQpCisJCQlyZXR1cm4gLUVNU0dTSVpFOworCQlydWxlX2xvY3NbY250XSA9IHJ1bGUtPnN3X2lkeDsKKwkJY250Kys7CisJfQorCisJY21kLT5ydWxlX2NudCA9IGNudDsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGlnYl9nZXRfcnNzX2hhc2hfb3B0cyhzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIsCiAJCQkJIHN0cnVjdCBldGh0b29sX3J4bmZjICpjbWQpCiB7CkBAIC0yNDg0LDYgKzI1NDEsMTYgQEAKIAkJY21kLT5kYXRhID0gYWRhcHRlci0+bnVtX3J4X3F1ZXVlczsKIAkJcmV0ID0gMDsKIAkJYnJlYWs7CisJY2FzZSBFVEhUT09MX0dSWENMU1JMQ05UOgorCQljbWQtPnJ1bGVfY250ID0gYWRhcHRlci0+bmZjX2ZpbHRlcl9jb3VudDsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBFVEhUT09MX0dSWENMU1JVTEU6CisJCXJldCA9IGlnYl9nZXRfZXRodG9vbF9uZmNfZW50cnkoYWRhcHRlciwgY21kKTsKKwkJYnJlYWs7CisJY2FzZSBFVEhUT09MX0dSWENMU1JMQUxMOgorCQlyZXQgPSBpZ2JfZ2V0X2V0aHRvb2xfbmZjX2FsbChhZGFwdGVyLCBjbWQsIHJ1bGVfbG9jcyk7CisJCWJyZWFrOwogCWNhc2UgRVRIVE9PTF9HUlhGSDoKIAkJcmV0ID0gaWdiX2dldF9yc3NfaGFzaF9vcHRzKGFkYXB0ZXIsIGNtZCk7CiAJCWJyZWFrOwpAQCAtMjU5OCw2ICsyNjY1LDI3OSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGlnYl9yeG5mY193cml0ZV9ldHlwZV9maWx0ZXIoc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyLAorCQkJCQlzdHJ1Y3QgaWdiX25mY19maWx0ZXIgKmlucHV0KQoreworCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJdTggaTsKKwl1MzIgZXRxZjsKKwl1MTYgZXR5cGU7CisKKwkvKiBmaW5kIGFuIGVtcHR5IGV0eXBlIGZpbHRlciByZWdpc3RlciAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfRVRZUEVfRklMVEVSOyArK2kpIHsKKwkJaWYgKCFhZGFwdGVyLT5ldHlwZV9iaXRtYXBbaV0pCisJCQlicmVhazsKKwl9CisJaWYgKGkgPT0gTUFYX0VUWVBFX0ZJTFRFUikgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJldGh0b29sIC1OOiBldHlwZSBmaWx0ZXJzIGFyZSBhbGwgdXNlZC5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlhZGFwdGVyLT5ldHlwZV9iaXRtYXBbaV0gPSB0cnVlOworCisJZXRxZiA9IHJkMzIoRTEwMDBfRVRRRihpKSk7CisJZXR5cGUgPSBudG9ocyhpbnB1dC0+ZmlsdGVyLmV0eXBlICYgRVRIRVJfVFlQRV9GVUxMX01BU0spOworCisJZXRxZiB8PSBFMTAwMF9FVFFGX0ZJTFRFUl9FTkFCTEU7CisJZXRxZiAmPSB+RTEwMDBfRVRRRl9FVFlQRV9NQVNLOworCWV0cWYgfD0gKGV0eXBlICYgRTEwMDBfRVRRRl9FVFlQRV9NQVNLKTsKKworCWV0cWYgJj0gfkUxMDAwX0VUUUZfUVVFVUVfTUFTSzsKKwlldHFmIHw9ICgoaW5wdXQtPmFjdGlvbiA8PCBFMTAwMF9FVFFGX1FVRVVFX1NISUZUKQorCQkmIEUxMDAwX0VUUUZfUVVFVUVfTUFTSyk7CisJZXRxZiB8PSBFMTAwMF9FVFFGX1FVRVVFX0VOQUJMRTsKKworCXdyMzIoRTEwMDBfRVRRRihpKSwgZXRxZik7CisKKwlpbnB1dC0+ZXR5cGVfcmVnX2luZGV4ID0gaTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlnYl9yeG5mY193cml0ZV92bGFuX3ByaW9fZmlsdGVyKHN0cnVjdCBpZ2JfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJICAgIHN0cnVjdCBpZ2JfbmZjX2ZpbHRlciAqaW5wdXQpCit7CisJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwl1OCB2bGFuX3ByaW9yaXR5OworCXUxNiBxdWV1ZV9pbmRleDsKKwl1MzIgdmxhcHFmOworCisJdmxhcHFmID0gcmQzMihFMTAwMF9WTEFQUUYpOworCXZsYW5fcHJpb3JpdHkgPSAobnRvaHMoaW5wdXQtPmZpbHRlci52bGFuX3RjaSkgJiBWTEFOX1BSSU9fTUFTSykKKwkJCQk+PiBWTEFOX1BSSU9fU0hJRlQ7CisJcXVldWVfaW5kZXggPSAodmxhcHFmID4+ICh2bGFuX3ByaW9yaXR5ICogNCkpICYgRTEwMDBfVkxBUFFGX1FVRVVFX01BU0s7CisKKwkvKiBjaGVjayB3aGV0aGVyIHRoaXMgdmxhbiBwcmlvIGlzIGFscmVhZHkgc2V0ICovCisJaWYgKCh2bGFwcWYgJiBFMTAwMF9WTEFQUUZfUF9WQUxJRCh2bGFuX3ByaW9yaXR5KSkgJiYKKwkgICAgKHF1ZXVlX2luZGV4ICE9IGlucHV0LT5hY3Rpb24pKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgImV0aHRvb2wgcnhuZmMgc2V0IHZsYW4gcHJpbyBmaWx0ZXIgZmFpbGVkLlxuIik7CisJCXJldHVybiAtRUVYSVNUOworCX0KKworCXZsYXBxZiB8PSBFMTAwMF9WTEFQUUZfUF9WQUxJRCh2bGFuX3ByaW9yaXR5KTsKKwl2bGFwcWYgfD0gRTEwMDBfVkxBUFFGX1FVRVVFX1NFTCh2bGFuX3ByaW9yaXR5LCBpbnB1dC0+YWN0aW9uKTsKKworCXdyMzIoRTEwMDBfVkxBUFFGLCB2bGFwcWYpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpZ2JfYWRkX2ZpbHRlcihzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBpZ2JfbmZjX2ZpbHRlciAqaW5wdXQpCit7CisJaW50IGVyciA9IC1FSU5WQUw7CisKKwlpZiAoaW5wdXQtPmZpbHRlci5tYXRjaF9mbGFncyAmIElHQl9GSUxURVJfRkxBR19FVEhFUl9UWVBFKSB7CisJCWVyciA9IGlnYl9yeG5mY193cml0ZV9ldHlwZV9maWx0ZXIoYWRhcHRlciwgaW5wdXQpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoaW5wdXQtPmZpbHRlci5tYXRjaF9mbGFncyAmIElHQl9GSUxURVJfRkxBR19WTEFOX1RDSSkKKwkJZXJyID0gaWdiX3J4bmZjX3dyaXRlX3ZsYW5fcHJpb19maWx0ZXIoYWRhcHRlciwgaW5wdXQpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgaWdiX2NsZWFyX2V0eXBlX2ZpbHRlcl9yZWdzKHN0cnVjdCBpZ2JfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJdTE2IHJlZ19pbmRleCkKK3sKKwlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXUzMiBldHFmID0gcmQzMihFMTAwMF9FVFFGKHJlZ19pbmRleCkpOworCisJZXRxZiAmPSB+RTEwMDBfRVRRRl9RVUVVRV9FTkFCTEU7CisJZXRxZiAmPSB+RTEwMDBfRVRRRl9RVUVVRV9NQVNLOworCWV0cWYgJj0gfkUxMDAwX0VUUUZfRklMVEVSX0VOQUJMRTsKKworCXdyMzIoRTEwMDBfRVRRRihyZWdfaW5kZXgpLCBldHFmKTsKKworCWFkYXB0ZXItPmV0eXBlX2JpdG1hcFtyZWdfaW5kZXhdID0gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIGlnYl9jbGVhcl92bGFuX3ByaW9fZmlsdGVyKHN0cnVjdCBpZ2JfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgICAgICAgdTE2IHZsYW5fdGNpKQoreworCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJdTggdmxhbl9wcmlvcml0eTsKKwl1MzIgdmxhcHFmOworCisJdmxhbl9wcmlvcml0eSA9ICh2bGFuX3RjaSAmIFZMQU5fUFJJT19NQVNLKSA+PiBWTEFOX1BSSU9fU0hJRlQ7CisKKwl2bGFwcWYgPSByZDMyKEUxMDAwX1ZMQVBRRik7CisJdmxhcHFmICY9IH5FMTAwMF9WTEFQUUZfUF9WQUxJRCh2bGFuX3ByaW9yaXR5KTsKKwl2bGFwcWYgJj0gfkUxMDAwX1ZMQVBRRl9RVUVVRV9TRUwodmxhbl9wcmlvcml0eSwKKwkJCQkJCUUxMDAwX1ZMQVBRRl9RVUVVRV9NQVNLKTsKKworCXdyMzIoRTEwMDBfVkxBUFFGLCB2bGFwcWYpOworfQorCitpbnQgaWdiX2VyYXNlX2ZpbHRlcihzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBpZ2JfbmZjX2ZpbHRlciAqaW5wdXQpCit7CisJaWYgKGlucHV0LT5maWx0ZXIubWF0Y2hfZmxhZ3MgJiBJR0JfRklMVEVSX0ZMQUdfRVRIRVJfVFlQRSkKKwkJaWdiX2NsZWFyX2V0eXBlX2ZpbHRlcl9yZWdzKGFkYXB0ZXIsCisJCQkJCSAgICBpbnB1dC0+ZXR5cGVfcmVnX2luZGV4KTsKKworCWlmIChpbnB1dC0+ZmlsdGVyLm1hdGNoX2ZsYWdzICYgSUdCX0ZJTFRFUl9GTEFHX1ZMQU5fVENJKQorCQlpZ2JfY2xlYXJfdmxhbl9wcmlvX2ZpbHRlcihhZGFwdGVyLAorCQkJCQkgICBudG9ocyhpbnB1dC0+ZmlsdGVyLnZsYW5fdGNpKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpZ2JfdXBkYXRlX2V0aHRvb2xfbmZjX2VudHJ5KHN0cnVjdCBpZ2JfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJc3RydWN0IGlnYl9uZmNfZmlsdGVyICppbnB1dCwKKwkJCQkJdTE2IHN3X2lkeCkKK3sKKwlzdHJ1Y3QgaWdiX25mY19maWx0ZXIgKnJ1bGUsICpwYXJlbnQ7CisJaW50IGVyciA9IC1FSU5WQUw7CisKKwlwYXJlbnQgPSBOVUxMOworCXJ1bGUgPSBOVUxMOworCisJaGxpc3RfZm9yX2VhY2hfZW50cnkocnVsZSwgJmFkYXB0ZXItPm5mY19maWx0ZXJfbGlzdCwgbmZjX25vZGUpIHsKKwkJLyogaGFzaCBmb3VuZCwgb3Igbm8gbWF0Y2hpbmcgZW50cnkgKi8KKwkJaWYgKHJ1bGUtPnN3X2lkeCA+PSBzd19pZHgpCisJCQlicmVhazsKKwkJcGFyZW50ID0gcnVsZTsKKwl9CisKKwkvKiBpZiB0aGVyZSBpcyBhbiBvbGQgcnVsZSBvY2N1cHlpbmcgb3VyIHBsYWNlIHJlbW92ZSBpdCAqLworCWlmIChydWxlICYmIChydWxlLT5zd19pZHggPT0gc3dfaWR4KSkgeworCQlpZiAoIWlucHV0KQorCQkJZXJyID0gaWdiX2VyYXNlX2ZpbHRlcihhZGFwdGVyLCBydWxlKTsKKworCQlobGlzdF9kZWwoJnJ1bGUtPm5mY19ub2RlKTsKKwkJa2ZyZWUocnVsZSk7CisJCWFkYXB0ZXItPm5mY19maWx0ZXJfY291bnQtLTsKKwl9CisKKwkvKiBJZiBubyBpbnB1dCB0aGlzIHdhcyBhIGRlbGV0ZSwgZXJyIHNob3VsZCBiZSAwIGlmIGEgcnVsZSB3YXMKKwkgKiBzdWNjZXNzZnVsbHkgZm91bmQgYW5kIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBlbHNlIC1FSU5WQUwKKwkgKi8KKwlpZiAoIWlucHV0KQorCQlyZXR1cm4gZXJyOworCisJLyogaW5pdGlhbGl6ZSBub2RlICovCisJSU5JVF9ITElTVF9OT0RFKCZpbnB1dC0+bmZjX25vZGUpOworCisJLyogYWRkIGZpbHRlciB0byB0aGUgbGlzdCAqLworCWlmIChwYXJlbnQpCisJCWhsaXN0X2FkZF9iZWhpbmQoJnBhcmVudC0+bmZjX25vZGUsICZpbnB1dC0+bmZjX25vZGUpOworCWVsc2UKKwkJaGxpc3RfYWRkX2hlYWQoJmlucHV0LT5uZmNfbm9kZSwgJmFkYXB0ZXItPm5mY19maWx0ZXJfbGlzdCk7CisKKwkvKiB1cGRhdGUgY291bnRzICovCisJYWRhcHRlci0+bmZjX2ZpbHRlcl9jb3VudCsrOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWdiX2FkZF9ldGh0b29sX25mY19lbnRyeShzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJICAgICBzdHJ1Y3QgZXRodG9vbF9yeG5mYyAqY21kKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJc3RydWN0IGV0aHRvb2xfcnhfZmxvd19zcGVjICpmc3AgPQorCQkoc3RydWN0IGV0aHRvb2xfcnhfZmxvd19zcGVjICopJmNtZC0+ZnM7CisJc3RydWN0IGlnYl9uZmNfZmlsdGVyICppbnB1dCwgKnJ1bGU7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIShuZXRkZXYtPmh3X2ZlYXR1cmVzICYgTkVUSUZfRl9OVFVQTEUpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkvKiBEb24ndCBhbGxvdyBwcm9ncmFtbWluZyBpZiB0aGUgYWN0aW9uIGlzIGEgcXVldWUgZ3JlYXRlciB0aGFuCisJICogdGhlIG51bWJlciBvZiBvbmxpbmUgUnggcXVldWVzLgorCSAqLworCWlmICgoZnNwLT5yaW5nX2Nvb2tpZSA9PSBSWF9DTFNfRkxPV19ESVNDKSB8fAorCSAgICAoZnNwLT5yaW5nX2Nvb2tpZSA+PSBhZGFwdGVyLT5udW1fcnhfcXVldWVzKSkgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJldGh0b29sIC1OOiBUaGUgc3BlY2lmaWVkIGFjdGlvbiBpcyBpbnZhbGlkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogRG9uJ3QgYWxsb3cgaW5kZXhlcyB0byBleGlzdCBvdXRzaWRlIG9mIGF2YWlsYWJsZSBzcGFjZSAqLworCWlmIChmc3AtPmxvY2F0aW9uID49IElHQl9NQVhfUlhORkNfRklMVEVSUykgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJMb2NhdGlvbiBvdXQgb2YgcmFuZ2VcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKGZzcC0+Zmxvd190eXBlICYgfkZMT1dfRVhUKSAhPSBFVEhFUl9GTE9XKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChmc3AtPm1fdS5ldGhlcl9zcGVjLmhfcHJvdG8gIT0gRVRIRVJfVFlQRV9GVUxMX01BU0sgJiYKKwkgICAgZnNwLT5tX2V4dC52bGFuX3RjaSAhPSBodG9ucyhWTEFOX1BSSU9fTUFTSykpCisJCXJldHVybiAtRUlOVkFMOworCisJaW5wdXQgPSBremFsbG9jKHNpemVvZigqaW5wdXQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlucHV0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChmc3AtPm1fdS5ldGhlcl9zcGVjLmhfcHJvdG8gPT0gRVRIRVJfVFlQRV9GVUxMX01BU0spIHsKKwkJaW5wdXQtPmZpbHRlci5ldHlwZSA9IGZzcC0+aF91LmV0aGVyX3NwZWMuaF9wcm90bzsKKwkJaW5wdXQtPmZpbHRlci5tYXRjaF9mbGFncyA9IElHQl9GSUxURVJfRkxBR19FVEhFUl9UWVBFOworCX0KKworCWlmICgoZnNwLT5mbG93X3R5cGUgJiBGTE9XX0VYVCkgJiYgZnNwLT5tX2V4dC52bGFuX3RjaSkgeworCQlpZiAoZnNwLT5tX2V4dC52bGFuX3RjaSAhPSBodG9ucyhWTEFOX1BSSU9fTUFTSykpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwkJaW5wdXQtPmZpbHRlci52bGFuX3RjaSA9IGZzcC0+aF9leHQudmxhbl90Y2k7CisJCWlucHV0LT5maWx0ZXIubWF0Y2hfZmxhZ3MgfD0gSUdCX0ZJTFRFUl9GTEFHX1ZMQU5fVENJOworCX0KKworCWlucHV0LT5hY3Rpb24gPSBmc3AtPnJpbmdfY29va2llOworCWlucHV0LT5zd19pZHggPSBmc3AtPmxvY2F0aW9uOworCisJc3Bpbl9sb2NrKCZhZGFwdGVyLT5uZmNfbG9jayk7CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShydWxlLCAmYWRhcHRlci0+bmZjX2ZpbHRlcl9saXN0LCBuZmNfbm9kZSkgeworCQlpZiAoIW1lbWNtcCgmaW5wdXQtPmZpbHRlciwgJnJ1bGUtPmZpbHRlciwKKwkJCSAgICBzaXplb2YoaW5wdXQtPmZpbHRlcikpKSB7CisJCQllcnIgPSAtRUVYSVNUOworCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJCSJldGh0b29sOiB0aGlzIGZpbHRlciBpcyBhbHJlYWR5IHNldFxuIik7CisJCQlnb3RvIGVycl9vdXRfd19sb2NrOworCQl9CisJfQorCisJZXJyID0gaWdiX2FkZF9maWx0ZXIoYWRhcHRlciwgaW5wdXQpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dF93X2xvY2s7CisKKwlpZ2JfdXBkYXRlX2V0aHRvb2xfbmZjX2VudHJ5KGFkYXB0ZXIsIGlucHV0LCBpbnB1dC0+c3dfaWR4KTsKKworCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5uZmNfbG9jayk7CisJcmV0dXJuIDA7CisKK2Vycl9vdXRfd19sb2NrOgorCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5uZmNfbG9jayk7CitlcnJfb3V0OgorCWtmcmVlKGlucHV0KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGlnYl9kZWxfZXRodG9vbF9uZmNfZW50cnkoc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyLAorCQkJCSAgICAgc3RydWN0IGV0aHRvb2xfcnhuZmMgKmNtZCkKK3sKKwlzdHJ1Y3QgZXRodG9vbF9yeF9mbG93X3NwZWMgKmZzcCA9CisJCShzdHJ1Y3QgZXRodG9vbF9yeF9mbG93X3NwZWMgKikmY21kLT5mczsKKwlpbnQgZXJyOworCisJc3Bpbl9sb2NrKCZhZGFwdGVyLT5uZmNfbG9jayk7CisJZXJyID0gaWdiX3VwZGF0ZV9ldGh0b29sX25mY19lbnRyeShhZGFwdGVyLCBOVUxMLCBmc3AtPmxvY2F0aW9uKTsKKwlzcGluX3VubG9jaygmYWRhcHRlci0+bmZjX2xvY2spOworCisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIGludCBpZ2Jfc2V0X3J4bmZjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3J4bmZjICpjbWQpCiB7CiAJc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTI2MDcsNiArMjk0NywxMSBAQAogCWNhc2UgRVRIVE9PTF9TUlhGSDoKIAkJcmV0ID0gaWdiX3NldF9yc3NfaGFzaF9vcHQoYWRhcHRlciwgY21kKTsKIAkJYnJlYWs7CisJY2FzZSBFVEhUT09MX1NSWENMU1JMSU5TOgorCQlyZXQgPSBpZ2JfYWRkX2V0aHRvb2xfbmZjX2VudHJ5KGFkYXB0ZXIsIGNtZCk7CisJCWJyZWFrOworCWNhc2UgRVRIVE9PTF9TUlhDTFNSTERFTDoKKwkJcmV0ID0gaWdiX2RlbF9ldGh0b29sX25mY19lbnRyeShhZGFwdGVyLCBjbWQpOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9pZ2JfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYl9tYWluLmMKaW5kZXggOTQyYTg5Zi4uZWRjOWE2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYl9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYl9tYWluLmMKQEAgLTU4LDcgKzU4LDcgQEAKICNpbmNsdWRlICJpZ2IuaCIKIAogI2RlZmluZSBNQUogNQotI2RlZmluZSBNSU4gMworI2RlZmluZSBNSU4gNAogI2RlZmluZSBCVUlMRCAwCiAjZGVmaW5lIERSVl9WRVJTSU9OIF9fc3RyaW5naWZ5KE1BSikgIi4iIF9fc3RyaW5naWZ5KE1JTikgIi4iIFwKIF9fc3RyaW5naWZ5KEJVSUxEKSAiLWsiCkBAIC0xNjksMTMgKzE2OSwxNSBAQAogc3RhdGljIHZvaWQgaWdiX3Jlc3RvcmVfdmZfbXVsdGljYXN0cyhzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIpOwogc3RhdGljIGludCBpZ2JfbmRvX3NldF92Zl9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmLCB1OCAqbWFjKTsKIHN0YXRpYyBpbnQgaWdiX25kb19zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJICAgICAgIGludCB2ZiwgdTE2IHZsYW4sIHU4IHFvcyk7CisJCQkgICAgICAgaW50IHZmLCB1MTYgdmxhbiwgdTggcW9zLCBfX2JlMTYgdmxhbl9wcm90byk7CiBzdGF0aWMgaW50IGlnYl9uZG9fc2V0X3ZmX2J3KHN0cnVjdCBuZXRfZGV2aWNlICosIGludCwgaW50LCBpbnQpOwogc3RhdGljIGludCBpZ2JfbmRvX3NldF92Zl9zcG9vZmNoayhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmYsCiAJCQkJICAgYm9vbCBzZXR0aW5nKTsKIHN0YXRpYyBpbnQgaWdiX25kb19nZXRfdmZfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2ZiwKIAkJCQkgc3RydWN0IGlmbGFfdmZfaW5mbyAqaXZpKTsKIHN0YXRpYyB2b2lkIGlnYl9jaGVja192Zl9yYXRlX2xpbWl0KHN0cnVjdCBpZ2JfYWRhcHRlciAqKTsKK3N0YXRpYyB2b2lkIGlnYl9uZmNfZmlsdGVyX2V4aXQoc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyB2b2lkIGlnYl9uZmNfZmlsdGVyX3Jlc3RvcmUoc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyKTsKIAogI2lmZGVmIENPTkZJR19QQ0lfSU9WCiBzdGF0aWMgaW50IGlnYl92Zl9jb25maWd1cmUoc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyLCBpbnQgdmYpOwpAQCAtMTYxMSw2ICsxNjEzLDcgQEAKIAlpZ2Jfc2V0dXBfbXJxYyhhZGFwdGVyKTsKIAlpZ2Jfc2V0dXBfcmN0bChhZGFwdGVyKTsKIAorCWlnYl9uZmNfZmlsdGVyX3Jlc3RvcmUoYWRhcHRlcik7CiAJaWdiX2NvbmZpZ3VyZV90eChhZGFwdGVyKTsKIAlpZ2JfY29uZmlndXJlX3J4KGFkYXB0ZXIpOwogCkBAIC0yMDU5LDYgKzIwNjIsMjEgQEAKIAlpZiAoIShjaGFuZ2VkICYgKE5FVElGX0ZfUlhBTEwgfCBORVRJRl9GX05UVVBMRSkpKQogCQlyZXR1cm4gMDsKIAorCWlmICghKGZlYXR1cmVzICYgTkVUSUZfRl9OVFVQTEUpKSB7CisJCXN0cnVjdCBobGlzdF9ub2RlICpub2RlMjsKKwkJc3RydWN0IGlnYl9uZmNfZmlsdGVyICpydWxlOworCisJCXNwaW5fbG9jaygmYWRhcHRlci0+bmZjX2xvY2spOworCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJ1bGUsIG5vZGUyLAorCQkJCQkgICZhZGFwdGVyLT5uZmNfZmlsdGVyX2xpc3QsIG5mY19ub2RlKSB7CisJCQlpZ2JfZXJhc2VfZmlsdGVyKGFkYXB0ZXIsIHJ1bGUpOworCQkJaGxpc3RfZGVsKCZydWxlLT5uZmNfbm9kZSk7CisJCQlrZnJlZShydWxlKTsKKwkJfQorCQlzcGluX3VubG9jaygmYWRhcHRlci0+bmZjX2xvY2spOworCQlhZGFwdGVyLT5uZmNfZmlsdGVyX2NvdW50ID0gMDsKKwl9CisKIAluZXRkZXYtPmZlYXR1cmVzID0gZmVhdHVyZXM7CiAKIAlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQpAQCAtMzA1Myw2ICszMDcxLDcgQEAKIAkJCQkgIFZMQU5fSExFTjsKIAlhZGFwdGVyLT5taW5fZnJhbWVfc2l6ZSA9IEVUSF9aTEVOICsgRVRIX0ZDU19MRU47CiAKKwlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+bmZjX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5zdGF0czY0X2xvY2spOwogI2lmZGVmIENPTkZJR19QQ0lfSU9WCiAJc3dpdGNoIChody0+bWFjLnR5cGUpIHsKQEAgLTMyNDAsNiArMzI1OSw4IEBACiAJaWdiX2Rvd24oYWRhcHRlcik7CiAJaWdiX2ZyZWVfaXJxKGFkYXB0ZXIpOwogCisJaWdiX25mY19maWx0ZXJfZXhpdChhZGFwdGVyKTsKKwogCWlnYl9mcmVlX2FsbF90eF9yZXNvdXJjZXMoYWRhcHRlcik7CiAJaWdiX2ZyZWVfYWxsX3J4X3Jlc291cmNlcyhhZGFwdGVyKTsKIApAQCAtNjIwMSwxNCArNjIyMiwxNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGlnYl9uZG9fc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCSAgICAgICBpbnQgdmYsIHUxNiB2bGFuLCB1OCBxb3MpCitzdGF0aWMgaW50IGlnYl9uZG9fc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmLAorCQkJICAgICAgIHUxNiB2bGFuLCB1OCBxb3MsIF9fYmUxNiB2bGFuX3Byb3RvKQogewogCXN0cnVjdCBpZ2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKIAlpZiAoKHZmID49IGFkYXB0ZXItPnZmc19hbGxvY2F0ZWRfY291bnQpIHx8ICh2bGFuID4gNDA5NSkgfHwgKHFvcyA+IDcpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWlmICh2bGFuX3Byb3RvICE9IGh0b25zKEVUSF9QXzgwMjFRKSkKKwkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CisKIAlyZXR1cm4gKHZsYW4gfHwgcW9zKSA/IGlnYl9lbmFibGVfcG9ydF92bGFuKGFkYXB0ZXIsIHZmLCB2bGFuLCBxb3MpIDoKIAkJCSAgICAgICBpZ2JfZGlzYWJsZV9wb3J0X3ZsYW4oYWRhcHRlciwgdmYpOwogfQpAQCAtODMwNiw0ICs4MzMwLDI4IEBACiAKIAlyZXR1cm4gZXJyOwogfQorCitzdGF0aWMgdm9pZCBpZ2JfbmZjX2ZpbHRlcl9leGl0KHN0cnVjdCBpZ2JfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgaWdiX25mY19maWx0ZXIgKnJ1bGU7CisKKwlzcGluX2xvY2soJmFkYXB0ZXItPm5mY19sb2NrKTsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHJ1bGUsICZhZGFwdGVyLT5uZmNfZmlsdGVyX2xpc3QsIG5mY19ub2RlKQorCQlpZ2JfZXJhc2VfZmlsdGVyKGFkYXB0ZXIsIHJ1bGUpOworCisJc3Bpbl91bmxvY2soJmFkYXB0ZXItPm5mY19sb2NrKTsKK30KKworc3RhdGljIHZvaWQgaWdiX25mY19maWx0ZXJfcmVzdG9yZShzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGlnYl9uZmNfZmlsdGVyICpydWxlOworCisJc3Bpbl9sb2NrKCZhZGFwdGVyLT5uZmNfbG9jayk7CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShydWxlLCAmYWRhcHRlci0+bmZjX2ZpbHRlcl9saXN0LCBuZmNfbm9kZSkKKwkJaWdiX2FkZF9maWx0ZXIoYWRhcHRlciwgcnVsZSk7CisKKwlzcGluX3VubG9jaygmYWRhcHRlci0+bmZjX2xvY2spOworfQogLyogaWdiX21haW4uYyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYl9wdHAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9pZ2JfcHRwLmMKaW5kZXggZTYxYjY0Ny4uYTc4OTVjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYl9wdHAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvaWdiX3B0cC5jCkBAIC01OTEsNiArNTkxLDcgQEAKIAkJCXRzaW0gfD0gVFNJTlRSX1NZU19XUkFQOwogCQllbHNlCiAJCQl0c2ltICY9IH5UU0lOVFJfU1lTX1dSQVA7CisJCWlnYi0+cHBzX3N5c193cmFwX29uID0gISFvbjsKIAkJd3IzMihFMTAwMF9UU0lNLCB0c2ltKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWdiLT50bXJlZ19sb2NrLCBmbGFncyk7CiAJCXJldHVybiAwOwpAQCAtNzQ0LDcgKzc0NSw4IEBACiAJCX0KIAl9CiAKLQlzaGh3dHN0YW1wcy5od3RzdGFtcCA9IGt0aW1lX3N1Yl9ucyhzaGh3dHN0YW1wcy5od3RzdGFtcCwgYWRqdXN0KTsKKwlzaGh3dHN0YW1wcy5od3RzdGFtcCA9CisJCWt0aW1lX2FkZF9ucyhzaGh3dHN0YW1wcy5od3RzdGFtcCwgYWRqdXN0KTsKIAogCXNrYl90c3RhbXBfdHgoYWRhcHRlci0+cHRwX3R4X3NrYiwgJnNoaHd0c3RhbXBzKTsKIAlkZXZfa2ZyZWVfc2tiX2FueShhZGFwdGVyLT5wdHBfdHhfc2tiKTsKQEAgLTc2NywxMyArNzY5LDMyIEBACiAJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlfX2xlNjQgKnJlZ3ZhbCA9IChfX2xlNjQgKil2YTsKKwlzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBxX3ZlY3Rvci0+YWRhcHRlcjsKKwlpbnQgYWRqdXN0ID0gMDsKIAogCS8qIFRoZSB0aW1lc3RhbXAgaXMgcmVjb3JkZWQgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQuCiAJICogRFdPUkQ6IDAgICAgICAgIDEgICAgICAgIDIgICAgICAgIDMKIAkgKiBGaWVsZDogUmVzZXJ2ZWQgUmVzZXJ2ZWQgU1lTVElNTCAgU1lTVElNSAogCSAqLwotCWlnYl9wdHBfc3lzdGltX3RvX2h3dHN0YW1wKHFfdmVjdG9yLT5hZGFwdGVyLCBza2JfaHd0c3RhbXBzKHNrYiksCisJaWdiX3B0cF9zeXN0aW1fdG9faHd0c3RhbXAoYWRhcHRlciwgc2tiX2h3dHN0YW1wcyhza2IpLAogCQkJCSAgIGxlNjRfdG9fY3B1KHJlZ3ZhbFsxXSkpOworCisJLyogYWRqdXN0IHRpbWVzdGFtcCBmb3IgdGhlIFJYIGxhdGVuY3kgYmFzZWQgb24gbGluayBzcGVlZCAqLworCWlmIChhZGFwdGVyLT5ody5tYWMudHlwZSA9PSBlMTAwMF9pMjEwKSB7CisJCXN3aXRjaCAoYWRhcHRlci0+bGlua19zcGVlZCkgeworCQljYXNlIFNQRUVEXzEwOgorCQkJYWRqdXN0ID0gSUdCX0kyMTBfUlhfTEFURU5DWV8xMDsKKwkJCWJyZWFrOworCQljYXNlIFNQRUVEXzEwMDoKKwkJCWFkanVzdCA9IElHQl9JMjEwX1JYX0xBVEVOQ1lfMTAwOworCQkJYnJlYWs7CisJCWNhc2UgU1BFRURfMTAwMDoKKwkJCWFkanVzdCA9IElHQl9JMjEwX1JYX0xBVEVOQ1lfMTAwMDsKKwkJCWJyZWFrOworCQl9CisJfQorCXNrYl9od3RzdGFtcHMoc2tiKS0+aHd0c3RhbXAgPQorCQlrdGltZV9zdWJfbnMoc2tiX2h3dHN0YW1wcyhza2IpLT5od3RzdGFtcCwgYWRqdXN0KTsKIH0KIAogLyoqCkBAIC04MjUsNyArODQ2LDcgQEAKIAkJfQogCX0KIAlza2JfaHd0c3RhbXBzKHNrYiktPmh3dHN0YW1wID0KLQkJa3RpbWVfYWRkX25zKHNrYl9od3RzdGFtcHMoc2tiKS0+aHd0c3RhbXAsIGFkanVzdCk7CisJCWt0aW1lX3N1Yl9ucyhza2JfaHd0c3RhbXBzKHNrYiktPmh3dHN0YW1wLCBhZGp1c3QpOwogCiAJLyogVXBkYXRlIHRoZSBsYXN0X3J4X3RpbWVzdGFtcCB0aW1lciBpbiBvcmRlciB0byBlbmFibGUgd2F0Y2hkb2cgY2hlY2sKIAkgKiBmb3IgZXJyb3IgY2FzZSBvZiBsYXRjaGVkIHRpbWVzdGFtcCBvbiBhIGRyb3BwZWQgcGFja2V0LgpAQCAtOTc4LDEyICs5OTksMTIgQEAKIAogCS8qIGRlZmluZSBldGhlcnR5cGUgZmlsdGVyIGZvciB0aW1lc3RhbXBlZCBwYWNrZXRzICovCiAJaWYgKGlzX2wyKQotCQl3cjMyKEUxMDAwX0VUUUYoMyksCisJCXdyMzIoRTEwMDBfRVRRRihJR0JfRVRRRl9GSUxURVJfMTU4OCksCiAJCSAgICAgKEUxMDAwX0VUUUZfRklMVEVSX0VOQUJMRSB8IC8qIGVuYWJsZSBmaWx0ZXIgKi8KIAkJICAgICAgRTEwMDBfRVRRRl8xNTg4IHwgLyogZW5hYmxlIHRpbWVzdGFtcGluZyAqLwogCQkgICAgICBFVEhfUF8xNTg4KSk7ICAgICAvKiAxNTg4IGV0aCBwcm90b2NvbCB0eXBlICovCiAJZWxzZQotCQl3cjMyKEUxMDAwX0VUUUYoMyksIDApOworCQl3cjMyKEUxMDAwX0VUUUYoSUdCX0VUUUZfRklMVEVSXzE1ODgpLCAwKTsKIAogCS8qIEw0IFF1ZXVlIEZpbHRlclszXTogZmlsdGVyIGJ5IGRlc3RpbmF0aW9uIHBvcnQgYW5kIHByb3RvY29sICovCiAJaWYgKGlzX2w0KSB7CkBAIC0xMTM5LDcgKzExNjAsNyBAQAogCWlmIChJU19FUlIoYWRhcHRlci0+cHRwX2Nsb2NrKSkgewogCQlhZGFwdGVyLT5wdHBfY2xvY2sgPSBOVUxMOwogCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJwdHBfY2xvY2tfcmVnaXN0ZXIgZmFpbGVkXG4iKTsKLQl9IGVsc2UgeworCX0gZWxzZSBpZiAoYWRhcHRlci0+cHRwX2Nsb2NrKSB7CiAJCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJhZGRlZCBQSEMgb24gJXNcbiIsCiAJCQkgYWRhcHRlci0+bmV0ZGV2LT5uYW1lKTsKIAkJYWRhcHRlci0+cHRwX2ZsYWdzIHw9IElHQl9QVFBfRU5BQkxFRDsKQEAgLTEyMTUsNyArMTIzNiw5IEBACiAJY2FzZSBlMTAwMF9pMjExOgogCQl3cjMyKEUxMDAwX1RTQVVYQywgMHgwKTsKIAkJd3IzMihFMTAwMF9UU1NEUCwgMHgwKTsKLQkJd3IzMihFMTAwMF9UU0lNLCBUU1lOQ19JTlRFUlJVUFRTKTsKKwkJd3IzMihFMTAwMF9UU0lNLAorCQkgICAgIFRTWU5DX0lOVEVSUlVQVFMgfAorCQkgICAgIChhZGFwdGVyLT5wcHNfc3lzX3dyYXBfb24gPyBUU0lOVFJfU1lTX1dSQVAgOiAwKSk7CiAJCXdyMzIoRTEwMDBfSU1TLCBFMTAwMF9JTVNfVFMpOwogCQlicmVhazsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdidmYvbmV0ZGV2LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2J2Zi9uZXRkZXYuYwppbmRleCBiMDc3OGJhLi4xMmJiODc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2J2Zi9uZXRkZXYuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2J2Zi9uZXRkZXYuYwpAQCAtNDcsNyArNDcsNyBAQAogCiAjaW5jbHVkZSAiaWdidmYuaCIKIAotI2RlZmluZSBEUlZfVkVSU0lPTiAiMi4wLjItayIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjIuNC4wLWsiCiBjaGFyIGlnYnZmX2RyaXZlcl9uYW1lW10gPSAiaWdidmYiOwogY29uc3QgY2hhciBpZ2J2Zl9kcml2ZXJfdmVyc2lvbltdID0gRFJWX1ZFUlNJT047CiBzdGF0aWMgY29uc3QgY2hhciBpZ2J2Zl9kcml2ZXJfc3RyaW5nW10gPQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmUuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlLmgKaW5kZXggOTQ3NWZmOS4uYjA2ZTMyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmUuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZS5oCkBAIC00NSwxMCArNDUsMTAgQEAKICNpbmNsdWRlICJpeGdiZV90eXBlLmgiCiAjaW5jbHVkZSAiaXhnYmVfY29tbW9uLmgiCiAjaW5jbHVkZSAiaXhnYmVfZGNiLmgiCi0jaWYgZGVmaW5lZChDT05GSUdfRkNPRSkgfHwgZGVmaW5lZChDT05GSUdfRkNPRV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfRkNPRSkKICNkZWZpbmUgSVhHQkVfRkNPRQogI2luY2x1ZGUgIml4Z2JlX2Zjb2UuaCIKLSNlbmRpZiAvKiBDT05GSUdfRkNPRSBvciBDT05GSUdfRkNPRV9NT0RVTEUgKi8KKyNlbmRpZiAvKiBJU19FTkFCTEVEKENPTkZJR19GQ09FKSAqLwogI2lmZGVmIENPTkZJR19JWEdCRV9EQ0EKICNpbmNsdWRlIDxsaW51eC9kY2EuaD4KICNlbmRpZgpAQCAtNjQ1LDYgKzY0NSw3IEBACiAjZGVmaW5lIElYR0JFX0ZMQUdfUlhfSFdUU1RBTVBfRU5BQkxFRAkJQklUKDI1KQogI2RlZmluZSBJWEdCRV9GTEFHX1JYX0hXVFNUQU1QX0lOX1JFR0lTVEVSCUJJVCgyNikKICNkZWZpbmUgSVhHQkVfRkxBR19EQ0JfQ0FQQUJMRQkJCUJJVCgyNykKKyNkZWZpbmUgSVhHQkVfRkxBR19HRU5FVkVfT0ZGTE9BRF9DQVBBQkxFCUJJVCgyOCkKIAogCXUzMiBmbGFnczI7CiAjZGVmaW5lIElYR0JFX0ZMQUcyX1JTQ19DQVBBQkxFCQkJQklUKDApCkBAIC02NTMsMTMgKzY1NCwxMiBAQAogI2RlZmluZSBJWEdCRV9GTEFHMl9URU1QX1NFTlNPUl9FVkVOVAkJQklUKDMpCiAjZGVmaW5lIElYR0JFX0ZMQUcyX1NFQVJDSF9GT1JfU0ZQCQlCSVQoNCkKICNkZWZpbmUgSVhHQkVfRkxBRzJfU0ZQX05FRURTX1JFU0VUCQlCSVQoNSkKLSNkZWZpbmUgSVhHQkVfRkxBRzJfUkVTRVRfUkVRVUVTVEVECQlCSVQoNikKICNkZWZpbmUgSVhHQkVfRkxBRzJfRkRJUl9SRVFVSVJFU19SRUlOSVQJQklUKDcpCiAjZGVmaW5lIElYR0JFX0ZMQUcyX1JTU19GSUVMRF9JUFY0X1VEUAkJQklUKDgpCiAjZGVmaW5lIElYR0JFX0ZMQUcyX1JTU19GSUVMRF9JUFY2X1VEUAkJQklUKDkpCiAjZGVmaW5lIElYR0JFX0ZMQUcyX1BUUF9QUFNfRU5BQkxFRAkJQklUKDEwKQogI2RlZmluZSBJWEdCRV9GTEFHMl9QSFlfSU5URVJSVVBUCQlCSVQoMTEpCi0jZGVmaW5lIElYR0JFX0ZMQUcyX1ZYTEFOX1JFUkVHX05FRURFRAkJQklUKDEyKQorI2RlZmluZSBJWEdCRV9GTEFHMl9VRFBfVFVOX1JFUkVHX05FRURFRAlCSVQoMTIpCiAjZGVmaW5lIElYR0JFX0ZMQUcyX1ZMQU5fUFJPTUlTQwkJQklUKDEzKQogCiAJLyogVHggZmFzdCBwYXRoIGRhdGEgKi8KQEAgLTY3Myw2ICs2NzMsNyBAQAogCiAJLyogUG9ydCBudW1iZXIgdXNlZCB0byBpZGVudGlmeSBWWExBTiB0cmFmZmljICovCiAJX19iZTE2IHZ4bGFuX3BvcnQ7CisJX19iZTE2IGdlbmV2ZV9wb3J0OwogCiAJLyogVFggKi8KIAlzdHJ1Y3QgaXhnYmVfcmluZyAqdHhfcmluZ1tNQVhfVFhfUVVFVUVTXSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwpAQCAtODQwLDYgKzg0MSw3IEBACiAJX19JWEdCRV9JTl9TRlBfSU5JVCwKIAlfX0lYR0JFX1BUUF9SVU5OSU5HLAogCV9fSVhHQkVfUFRQX1RYX0lOX1BST0dSRVNTLAorCV9fSVhHQkVfUkVTRVRfUkVRVUVTVEVELAogfTsKIAogc3RydWN0IGl4Z2JlX2NiIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2NvbW1vbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfY29tbW9uLmMKaW5kZXggYjQyMTdmMy4uNzdkMzAzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfY29tbW9uLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfY29tbW9uLmMKQEAgLTk5LDYgKzk5LDcgQEAKIAkJY2FzZSBJWEdCRV9ERVZfSURfWDU1MFQ6CiAJCWNhc2UgSVhHQkVfREVWX0lEX1g1NTBUMToKIAkJY2FzZSBJWEdCRV9ERVZfSURfWDU1MEVNX1hfMTBHX1Q6CisJCWNhc2UgSVhHQkVfREVWX0lEX1g1NTBFTV9BXzEwR19UOgogCQkJc3VwcG9ydGVkID0gdHJ1ZTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgpAQCAtMjk1OCw4ICsyOTU5LDEwIEBACiAJfQogCiAJLyogd2FzIHRoYXQgdGhlIGxhc3QgcG9vbCB1c2luZyB0aGlzIHJhcj8gKi8KLQlpZiAobXBzYXJfbG8gPT0gMCAmJiBtcHNhcl9oaSA9PSAwICYmIHJhciAhPSAwKQorCWlmIChtcHNhcl9sbyA9PSAwICYmIG1wc2FyX2hpID09IDAgJiYKKwkgICAgcmFyICE9IDAgJiYgcmFyICE9IGh3LT5tYWMuc2FuX21hY19yYXJfaW5kZXgpCiAJCWh3LT5tYWMub3BzLmNsZWFyX3JhcihodywgcmFyKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9ldGh0b29sLmMKaW5kZXggMGQ3MjA5ZS4uZjQ5ZjgwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2V0aHRvb2wuYwpAQCAtMTkzLDcgKzE5Myw5IEBACiAJaWYgKHN1cHBvcnRlZF9saW5rICYgSVhHQkVfTElOS19TUEVFRF8xMEdCX0ZVTEwpCiAJCWVjbWQtPnN1cHBvcnRlZCB8PSBpeGdiZV9nZXRfc3VwcG9ydGVkXzEwZ3R5cGVzKGh3KTsKIAlpZiAoc3VwcG9ydGVkX2xpbmsgJiBJWEdCRV9MSU5LX1NQRUVEXzFHQl9GVUxMKQotCQllY21kLT5zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsOworCQllY21kLT5zdXBwb3J0ZWQgfD0gKGl4Z2JlX2lzYmFja3BsYW5lKGh3LT5waHkubWVkaWFfdHlwZSkpID8KKwkJCQkgICBTVVBQT1JURURfMTAwMGJhc2VLWF9GdWxsIDoKKwkJCQkgICBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGw7CiAJaWYgKHN1cHBvcnRlZF9saW5rICYgSVhHQkVfTElOS19TUEVFRF8xMDBfRlVMTCkKIAkJZWNtZC0+c3VwcG9ydGVkIHw9IGl4Z2JlX2lzYmFja3BsYW5lKGh3LT5waHkubWVkaWFfdHlwZSkgPwogCQkJCSAgIFNVUFBPUlRFRF8xMDAwYmFzZUtYX0Z1bGwgOgpAQCAtMzExLDYgKzMxMywyNSBAQAogCQlicmVhazsKIAl9CiAKKwkvKiBJbmRpY2F0ZSBwYXVzZSBzdXBwb3J0ICovCisJZWNtZC0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9QYXVzZTsKKworCXN3aXRjaCAoaHctPmZjLnJlcXVlc3RlZF9tb2RlKSB7CisJY2FzZSBpeGdiZV9mY19mdWxsOgorCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX1BhdXNlOworCQlicmVhazsKKwljYXNlIGl4Z2JlX2ZjX3J4X3BhdXNlOgorCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX1BhdXNlIHwKKwkJCQkgICAgIEFEVkVSVElTRURfQXN5bV9QYXVzZTsKKwkJYnJlYWs7CisJY2FzZSBpeGdiZV9mY190eF9wYXVzZToKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9Bc3ltX1BhdXNlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllY21kLT5hZHZlcnRpc2luZyAmPSB+KEFEVkVSVElTRURfUGF1c2UgfAorCQkJCSAgICAgICBBRFZFUlRJU0VEX0FzeW1fUGF1c2UpOworCX0KKwogCWlmIChuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKIAkJc3dpdGNoIChhZGFwdGVyLT5saW5rX3NwZWVkKSB7CiAJCWNhc2UgSVhHQkVfTElOS19TUEVFRF8xMEdCX0ZVTEw6CkBAIC0yOTI2LDkgKzI5NDcsMTMgQEAKIHN0YXRpYyB2b2lkIGl4Z2JlX2dldF9yZXRhKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLCB1MzIgKmluZGlyKQogewogCWludCBpLCByZXRhX3NpemUgPSBpeGdiZV9yc3NfaW5kaXJfdGJsX2VudHJpZXMoYWRhcHRlcik7CisJdTE2IHJzc19tID0gYWRhcHRlci0+cmluZ19mZWF0dXJlW1JJTkdfRl9SU1NdLm1hc2s7CisKKwlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX1NSSU9WX0VOQUJMRUQpCisJCXJzc19tID0gYWRhcHRlci0+cmluZ19mZWF0dXJlW1JJTkdfRl9SU1NdLmluZGljZXMgLSAxOwogCiAJZm9yIChpID0gMDsgaSA8IHJldGFfc2l6ZTsgaSsrKQotCQlpbmRpcltpXSA9IGFkYXB0ZXItPnJzc19pbmRpcl90YmxbaV07CisJCWluZGlyW2ldID0gYWRhcHRlci0+cnNzX2luZGlyX3RibFtpXSAmIHJzc19tOwogfQogCiBzdGF0aWMgaW50IGl4Z2JlX2dldF9yeGZoKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiAqaW5kaXIsIHU4ICprZXksCkBAIC0zMDM5LDggKzMwNjQsOCBAQAogCQkvKiBXZSBvbmx5IHN1cHBvcnQgb25lIHFfdmVjdG9yIHdpdGhvdXQgTVNJLVggKi8KIAkJbWF4X2NvbWJpbmVkID0gMTsKIAl9IGVsc2UgaWYgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19TUklPVl9FTkFCTEVEKSB7Ci0JCS8qIFNSLUlPViBjdXJyZW50bHkgb25seSBhbGxvd3Mgb25lIHF1ZXVlIG9uIHRoZSBQRiAqLwotCQltYXhfY29tYmluZWQgPSAxOworCQkvKiBMaW1pdCB2YWx1ZSBiYXNlZCBvbiB0aGUgcXVldWUgbWFzayAqLworCQltYXhfY29tYmluZWQgPSBhZGFwdGVyLT5yaW5nX2ZlYXR1cmVbUklOR19GX1JTU10ubWFzayArIDE7CiAJfSBlbHNlIGlmICh0Y3MgPiAxKSB7CiAJCS8qIEZvciBEQ0IgcmVwb3J0IGNoYW5uZWxzIHBlciB0cmFmZmljIGNsYXNzICovCiAJCWlmIChhZGFwdGVyLT5ody5tYWMudHlwZSA9PSBpeGdiZV9tYWNfODI1OThFQikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfbGliLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9saWIuYwppbmRleCBiY2RjODg0Li4xNWFiMzM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9saWIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9saWIuYwpAQCAtNTE1LDE1ICs1MTUsMTYgQEAKIAl2bWRxX2kgPSBtaW5fdCh1MTYsIElYR0JFX01BWF9WTURRX0lORElDRVMsIHZtZHFfaSk7CiAKIAkvKiA2NCBwb29sIG1vZGUgd2l0aCAyIHF1ZXVlcyBwZXIgcG9vbCAqLwotCWlmICgodm1kcV9pID4gMzIpIHx8IChyc3NfaSA8IDQpIHx8ICh2bWRxX2kgPiAxNiAmJiBwb29scykpIHsKKwlpZiAoKHZtZHFfaSA+IDMyKSB8fCAodm1kcV9pID4gMTYgJiYgcG9vbHMpKSB7CiAJCXZtZHFfbSA9IElYR0JFXzgyNTk5X1ZNRFFfMlFfTUFTSzsKIAkJcnNzX20gPSBJWEdCRV9SU1NfMlFfTUFTSzsKIAkJcnNzX2kgPSBtaW5fdCh1MTYsIHJzc19pLCAyKTsKLQkvKiAzMiBwb29sIG1vZGUgd2l0aCA0IHF1ZXVlcyBwZXIgcG9vbCAqLworCS8qIDMyIHBvb2wgbW9kZSB3aXRoIHVwIHRvIDQgcXVldWVzIHBlciBwb29sICovCiAJfSBlbHNlIHsKIAkJdm1kcV9tID0gSVhHQkVfODI1OTlfVk1EUV80UV9NQVNLOwogCQlyc3NfbSA9IElYR0JFX1JTU180UV9NQVNLOwotCQlyc3NfaSA9IDQ7CisJCS8qIFdlIGNhbiBzdXBwb3J0IDQsIDIsIG9yIDEgcXVldWVzICovCisJCXJzc19pID0gKHJzc19pID4gMykgPyA0IDogKHJzc19pID4gMSkgPyAyIDogMTsKIAl9CiAKICNpZmRlZiBJWEdCRV9GQ09FCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9tYWluLmMKaW5kZXggNTQxOGM2OWEuLmEyNDRkOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9tYWluLmMKQEAgLTEzNyw2ICsxMzcsNyBAQAogCXtQQ0lfVkRFVklDRShJTlRFTCwgSVhHQkVfREVWX0lEX1g1NTBFTV9BX1NGUF9OKSwgYm9hcmRfeDU1MGVtX2EgfSwKIAl7UENJX1ZERVZJQ0UoSU5URUwsIElYR0JFX0RFVl9JRF9YNTUwRU1fQV9TR01JSSksIGJvYXJkX3g1NTBlbV9hIH0sCiAJe1BDSV9WREVWSUNFKElOVEVMLCBJWEdCRV9ERVZfSURfWDU1MEVNX0FfU0dNSUlfTCksIGJvYXJkX3g1NTBlbV9hIH0sCisJe1BDSV9WREVWSUNFKElOVEVMLCBJWEdCRV9ERVZfSURfWDU1MEVNX0FfMTBHX1QpLCBib2FyZF94NTUwZW1fYX0sCiAJe1BDSV9WREVWSUNFKElOVEVMLCBJWEdCRV9ERVZfSURfWDU1MEVNX0FfU0ZQKSwgYm9hcmRfeDU1MGVtX2EgfSwKIAkvKiByZXF1aXJlZCBsYXN0IGVudHJ5ICovCiAJezAsIH0KQEAgLTExMDMsNyArMTEwNCw3IEBACiAKIAkvKiBEbyB0aGUgcmVzZXQgb3V0c2lkZSBvZiBpbnRlcnJ1cHQgY29udGV4dCAqLwogCWlmICghdGVzdF9iaXQoX19JWEdCRV9ET1dOLCAmYWRhcHRlci0+c3RhdGUpKSB7Ci0JCWFkYXB0ZXItPmZsYWdzMiB8PSBJWEdCRV9GTEFHMl9SRVNFVF9SRVFVRVNURUQ7CisJCXNldF9iaXQoX19JWEdCRV9SRVNFVF9SRVFVRVNURUQsICZhZGFwdGVyLT5zdGF0ZSk7CiAJCWVfd2FybihkcnYsICJpbml0aWF0aW5nIHJlc2V0IGR1ZSB0byB0eCB0aW1lb3V0XG4iKTsKIAkJaXhnYmVfc2VydmljZV9ldmVudF9zY2hlZHVsZShhZGFwdGVyKTsKIAl9CkBAIC0xNDk1LDcgKzE0OTYsNiBAQAogCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlfX2xlMTYgcGt0X2luZm8gPSByeF9kZXNjLT53Yi5sb3dlci5sb19kd29yZC5oc19yc3MucGt0X2luZm87Ci0JX19sZTE2IGhkcl9pbmZvID0gcnhfZGVzYy0+d2IubG93ZXIubG9fZHdvcmQuaHNfcnNzLmhkcl9pbmZvOwogCWJvb2wgZW5jYXBfcGt0ID0gZmFsc2U7CiAKIAlza2JfY2hlY2tzdW1fbm9uZV9hc3NlcnQoc2tiKTsKQEAgLTE1MDQsOCArMTUwNCw4IEBACiAJaWYgKCEocmluZy0+bmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfUlhDU1VNKSkKIAkJcmV0dXJuOwogCi0JaWYgKChwa3RfaW5mbyAmIGNwdV90b19sZTE2KElYR0JFX1JYREFEVl9QS1RUWVBFX1ZYTEFOKSkgJiYKLQkgICAgKGhkcl9pbmZvICYgY3B1X3RvX2xlMTYoSVhHQkVfUlhEQURWX1BLVFRZUEVfVFVOTkVMID4+IDE2KSkpIHsKKwkvKiBjaGVjayBmb3IgVlhMQU4gYW5kIEdlbmV2ZSBwYWNrZXRzICovCisJaWYgKHBrdF9pbmZvICYgY3B1X3RvX2xlMTYoSVhHQkVfUlhEQURWX1BLVFRZUEVfVlhMQU4pKSB7CiAJCWVuY2FwX3BrdCA9IHRydWU7CiAJCXNrYi0+ZW5jYXBzdWxhdGlvbiA9IDE7CiAJfQpAQCAtMjc3Nyw3ICsyNzc3LDcgQEAKIAkJfQogCQlpZiAoZWljciAmIElYR0JFX0VJQ1JfRUNDKSB7CiAJCQllX2luZm8obGluaywgIlJlY2VpdmVkIEVDQyBFcnIsIGluaXRpYXRpbmcgcmVzZXRcbiIpOwotCQkJYWRhcHRlci0+ZmxhZ3MyIHw9IElYR0JFX0ZMQUcyX1JFU0VUX1JFUVVFU1RFRDsKKwkJCXNldF9iaXQoX19JWEdCRV9SRVNFVF9SRVFVRVNURUQsICZhZGFwdGVyLT5zdGF0ZSk7CiAJCQlpeGdiZV9zZXJ2aWNlX2V2ZW50X3NjaGVkdWxlKGFkYXB0ZXIpOwogCQkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9FSUNSLCBJWEdCRV9FSUNSX0VDQyk7CiAJCX0KQEAgLTMwMDcsNyArMzAwNyw3IEBACiAJY2FzZSBpeGdiZV9tYWNfeDU1MGVtX2E6CiAJCWlmIChlaWNyICYgSVhHQkVfRUlDUl9FQ0MpIHsKIAkJCWVfaW5mbyhsaW5rLCAiUmVjZWl2ZWQgRUNDIEVyciwgaW5pdGlhdGluZyByZXNldFxuIik7Ci0JCQlhZGFwdGVyLT5mbGFnczIgfD0gSVhHQkVfRkxBRzJfUkVTRVRfUkVRVUVTVEVEOworCQkJc2V0X2JpdChfX0lYR0JFX1JFU0VUX1JFUVVFU1RFRCwgJmFkYXB0ZXItPnN0YXRlKTsKIAkJCWl4Z2JlX3NlcnZpY2VfZXZlbnRfc2NoZWR1bGUoYWRhcHRlcik7CiAJCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0VJQ1IsIElYR0JFX0VJQ1JfRUNDKTsKIAkJfQpAQCAtMzIyNCw3ICszMjI0LDcgQEAKIAkJdHhkY3RsID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1RYRENUTChyZWdfaWR4KSk7CiAJfSB3aGlsZSAoLS13YWl0X2xvb3AgJiYgISh0eGRjdGwgJiBJWEdCRV9UWERDVExfRU5BQkxFKSk7CiAJaWYgKCF3YWl0X2xvb3ApCi0JCWVfZXJyKGRydiwgIkNvdWxkIG5vdCBlbmFibGUgVHggUXVldWUgJWRcbiIsIHJlZ19pZHgpOworCQlod19kYmcoaHcsICJDb3VsZCBub3QgZW5hYmxlIFR4IFF1ZXVlICVkXG4iLCByZWdfaWR4KTsKIH0KIAogc3RhdGljIHZvaWQgaXhnYmVfc2V0dXBfbXRxYyhzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcikKQEAgLTMyNDgsNyArMzI0OCw4IEBACiAJCQltdHFjIHw9IElYR0JFX01UUUNfUlRfRU5BIHwgSVhHQkVfTVRRQ184VENfOFRROwogCQllbHNlIGlmICh0Y3MgPiAxKQogCQkJbXRxYyB8PSBJWEdCRV9NVFFDX1JUX0VOQSB8IElYR0JFX01UUUNfNFRDXzRUUTsKLQkJZWxzZSBpZiAoYWRhcHRlci0+cmluZ19mZWF0dXJlW1JJTkdfRl9SU1NdLmluZGljZXMgPT0gNCkKKwkJZWxzZSBpZiAoYWRhcHRlci0+cmluZ19mZWF0dXJlW1JJTkdfRl9WTURRXS5tYXNrID09CisJCQkgSVhHQkVfODI1OTlfVk1EUV80UV9NQVNLKQogCQkJbXRxYyB8PSBJWEdCRV9NVFFDXzMyVkY7CiAJCWVsc2UKIAkJCW10cWMgfD0gSVhHQkVfTVRRQ182NFZGOwpAQCAtMzQ3NSwxMiArMzQ3NiwxMiBAQAogCXUzMiByZXRhX2VudHJpZXMgPSBpeGdiZV9yc3NfaW5kaXJfdGJsX2VudHJpZXMoYWRhcHRlcik7CiAJdTE2IHJzc19pID0gYWRhcHRlci0+cmluZ19mZWF0dXJlW1JJTkdfRl9SU1NdLmluZGljZXM7CiAKLQkvKiBQcm9ncmFtIHRhYmxlIGZvciBhdCBsZWFzdCAyIHF1ZXVlcyB3LyBTUi1JT1Ygc28gdGhhdCBWRnMgY2FuCisJLyogUHJvZ3JhbSB0YWJsZSBmb3IgYXQgbGVhc3QgNCBxdWV1ZXMgdy8gU1ItSU9WIHNvIHRoYXQgVkZzIGNhbgogCSAqIG1ha2UgZnVsbCB1c2Ugb2YgYW55IHJpbmdzIHRoZXkgbWF5IGhhdmUuICBXZSB3aWxsIHVzZSB0aGUKIAkgKiBQU1JUWVBFIHJlZ2lzdGVyIHRvIGNvbnRyb2wgaG93IG1hbnkgcmluZ3Mgd2UgdXNlIHdpdGhpbiB0aGUgUEYuCiAJICovCi0JaWYgKChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfU1JJT1ZfRU5BQkxFRCkgJiYgKHJzc19pIDwgMikpCi0JCXJzc19pID0gMjsKKwlpZiAoKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19TUklPVl9FTkFCTEVEKSAmJiAocnNzX2kgPCA0KSkKKwkJcnNzX2kgPSA0OwogCiAJLyogRmlsbCBvdXQgaGFzaCBmdW5jdGlvbiBzZWVkcyAqLwogCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQpAQCAtMzU0NCw3ICszNTQ1LDggQEAKIAkJCQltcnFjID0gSVhHQkVfTVJRQ19WTURRUlQ4VENFTjsJLyogOCBUQ3MgKi8KIAkJCWVsc2UgaWYgKHRjcyA+IDEpCiAJCQkJbXJxYyA9IElYR0JFX01SUUNfVk1EUVJUNFRDRU47CS8qIDQgVENzICovCi0JCQllbHNlIGlmIChhZGFwdGVyLT5yaW5nX2ZlYXR1cmVbUklOR19GX1JTU10uaW5kaWNlcyA9PSA0KQorCQkJZWxzZSBpZiAoYWRhcHRlci0+cmluZ19mZWF0dXJlW1JJTkdfRl9WTURRXS5tYXNrID09CisJCQkJIElYR0JFXzgyNTk5X1ZNRFFfNFFfTUFTSykKIAkJCQltcnFjID0gSVhHQkVfTVJRQ19WTURRUlNTMzJFTjsKIAkJCWVsc2UKIAkJCQltcnFjID0gSVhHQkVfTVJRQ19WTURRUlNTNjRFTjsKQEAgLTM5MjIsNiArMzkyNCw5IEBACiAJcmZjdGwgJj0gfklYR0JFX1JGQ1RMX1JTQ19ESVM7CiAJaWYgKCEoYWRhcHRlci0+ZmxhZ3MyICYgSVhHQkVfRkxBRzJfUlNDX0VOQUJMRUQpKQogCQlyZmN0bCB8PSBJWEdCRV9SRkNUTF9SU0NfRElTOworCisJLyogZGlzYWJsZSBORlMgZmlsdGVyaW5nICovCisJcmZjdGwgfD0gKElYR0JFX1JGQ1RMX05GU1dfRElTIHwgSVhHQkVfUkZDVExfTkZTUl9ESVMpOwogCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUkZDVEwsIHJmY3RsKTsKIAogCS8qIFByb2dyYW0gcmVnaXN0ZXJzIGZvciB0aGUgZGlzdHJpYnV0aW9uIG9mIHF1ZXVlcyAqLwpAQCAtNDEwMCwyNCArNDEwNSwyMiBAQAogCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAJdTMyIHZsbmN0cmwsIGk7CiAKLQlzd2l0Y2ggKGh3LT5tYWMudHlwZSkgewotCWNhc2UgaXhnYmVfbWFjXzgyNTk5RUI6Ci0JY2FzZSBpeGdiZV9tYWNfWDU0MDoKLQljYXNlIGl4Z2JlX21hY19YNTUwOgotCWNhc2UgaXhnYmVfbWFjX1g1NTBFTV94OgotCWNhc2UgaXhnYmVfbWFjX3g1NTBlbV9hOgotCWRlZmF1bHQ6Ci0JCWlmIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfVk1EUV9FTkFCTEVEKQotCQkJYnJlYWs7Ci0JCS8qIGZhbGwgdGhyb3VnaCAqLwotCWNhc2UgaXhnYmVfbWFjXzgyNTk4RUI6Ci0JCS8qIGxlZ2FjeSBjYXNlLCB3ZSBjYW4ganVzdCBkaXNhYmxlIFZMQU4gZmlsdGVyaW5nICovCi0JCXZsbmN0cmwgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfVkxOQ1RSTCk7Ci0JCXZsbmN0cmwgJj0gfihJWEdCRV9WTE5DVFJMX1ZGRSB8IElYR0JFX1ZMTkNUUkxfQ0ZJRU4pOworCXZsbmN0cmwgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfVkxOQ1RSTCk7CisKKwlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX1ZNRFFfRU5BQkxFRCkgeworCS8qIEZvciBWTURxIGFuZCBTUi1JT1Ygd2UgbXVzdCBsZWF2ZSBWTEFOIGZpbHRlcmluZyBlbmFibGVkICovCisJCXZsbmN0cmwgfD0gSVhHQkVfVkxOQ1RSTF9WRkU7CisJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfVkxOQ1RSTCwgdmxuY3RybCk7CisJfSBlbHNlIHsKKwkJdmxuY3RybCAmPSB+SVhHQkVfVkxOQ1RSTF9WRkU7CiAJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfVkxOQ1RSTCwgdmxuY3RybCk7CiAJCXJldHVybjsKIAl9CiAKKwkvKiBOb3RoaW5nIHRvIGRvIGZvciA4MjU5OCAqLworCWlmIChody0+bWFjLnR5cGUgPT0gaXhnYmVfbWFjXzgyNTk4RUIpCisJCXJldHVybjsKKwogCS8qIFdlIGFyZSBhbHJlYWR5IGluIFZMQU4gcHJvbWlzYywgbm90aGluZyB0byBkbyAqLwogCWlmIChhZGFwdGVyLT5mbGFnczIgJiBJWEdCRV9GTEFHMl9WTEFOX1BST01JU0MpCiAJCXJldHVybjsKQEAgLTQxOTEsMjMgKzQxOTQsMTQgQEAKIAlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCXUzMiB2bG5jdHJsLCBpOwogCi0Jc3dpdGNoIChody0+bWFjLnR5cGUpIHsKLQljYXNlIGl4Z2JlX21hY184MjU5OUVCOgotCWNhc2UgaXhnYmVfbWFjX1g1NDA6Ci0JY2FzZSBpeGdiZV9tYWNfWDU1MDoKLQljYXNlIGl4Z2JlX21hY19YNTUwRU1feDoKLQljYXNlIGl4Z2JlX21hY194NTUwZW1fYToKLQlkZWZhdWx0OgotCQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX1ZNRFFfRU5BQkxFRCkKLQkJCWJyZWFrOwotCQkvKiBmYWxsIHRocm91Z2ggKi8KLQljYXNlIGl4Z2JlX21hY184MjU5OEVCOgotCQl2bG5jdHJsID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1ZMTkNUUkwpOwotCQl2bG5jdHJsICY9IH5JWEdCRV9WTE5DVFJMX0NGSUVOOwotCQl2bG5jdHJsIHw9IElYR0JFX1ZMTkNUUkxfVkZFOwotCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1ZMTkNUUkwsIHZsbmN0cmwpOworCS8qIFNldCBWTEFOIGZpbHRlcmluZyB0byBlbmFibGVkICovCisJdmxuY3RybCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9WTE5DVFJMKTsKKwl2bG5jdHJsIHw9IElYR0JFX1ZMTkNUUkxfVkZFOworCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfVkxOQ1RSTCwgdmxuY3RybCk7CisKKwlpZiAoIShhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfVk1EUV9FTkFCTEVEKSB8fAorCSAgICBody0+bWFjLnR5cGUgPT0gaXhnYmVfbWFjXzgyNTk4RUIpCiAJCXJldHVybjsKLQl9CiAKIAkvKiBXZSBhcmUgbm90IGluIFZMQU4gcHJvbWlzYywgbm90aGluZyB0byBkbyAqLwogCWlmICghKGFkYXB0ZXItPmZsYWdzMiAmIElYR0JFX0ZMQUcyX1ZMQU5fUFJPTUlTQykpCkBAIC00NTgwLDE4ICs0NTc0LDIzIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBpeGdiZV9jbGVhcl92eGxhbl9wb3J0KHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIHZvaWQgaXhnYmVfY2xlYXJfdWRwX3R1bm5lbF9wb3J0KHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLCB1MzIgbWFzaykKIHsKLQlzd2l0Y2ggKGFkYXB0ZXItPmh3Lm1hYy50eXBlKSB7Ci0JY2FzZSBpeGdiZV9tYWNfWDU1MDoKLQljYXNlIGl4Z2JlX21hY19YNTUwRU1feDoKLQljYXNlIGl4Z2JlX21hY194NTUwZW1fYToKLQkJSVhHQkVfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSVhHQkVfVlhMQU5DVFJMLCAwKTsKKwlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXUzMiB2eGxhbmN0cmw7CisKKwlpZiAoIShhZGFwdGVyLT5mbGFncyAmIChJWEdCRV9GTEFHX1ZYTEFOX09GRkxPQURfQ0FQQUJMRSB8CisJCQkJSVhHQkVfRkxBR19HRU5FVkVfT0ZGTE9BRF9DQVBBQkxFKSkpCisJCXJldHVybjsKKworCXZ4bGFuY3RybCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9WWExBTkNUUkwpICYmIH5tYXNrOworCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfVlhMQU5DVFJMLCB2eGxhbmN0cmwpOworCisJaWYgKG1hc2sgJiBJWEdCRV9WWExBTkNUUkxfVlhMQU5fVURQUE9SVF9NQVNLKQogCQlhZGFwdGVyLT52eGxhbl9wb3J0ID0gMDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQorCisJaWYgKG1hc2sgJiBJWEdCRV9WWExBTkNUUkxfR0VORVZFX1VEUFBPUlRfTUFTSykKKwkJYWRhcHRlci0+Z2VuZXZlX3BvcnQgPSAwOwogfQogCiAjaWZkZWYgQ09ORklHX0lYR0JFX0RDQgpAQCAtNTQ5NCw4ICs1NDkzLDggQEAKIAogCWl4Z2JlX25hcGlfZGlzYWJsZV9hbGwoYWRhcHRlcik7CiAKLQlhZGFwdGVyLT5mbGFnczIgJj0gfihJWEdCRV9GTEFHMl9GRElSX1JFUVVJUkVTX1JFSU5JVCB8Ci0JCQkgICAgIElYR0JFX0ZMQUcyX1JFU0VUX1JFUVVFU1RFRCk7CisJY2xlYXJfYml0KF9fSVhHQkVfUkVTRVRfUkVRVUVTVEVELCAmYWRhcHRlci0+c3RhdGUpOworCWFkYXB0ZXItPmZsYWdzMiAmPSB+SVhHQkVfRkxBRzJfRkRJUl9SRVFVSVJFU19SRUlOSVQ7CiAJYWRhcHRlci0+ZmxhZ3MgJj0gfklYR0JFX0ZMQUdfTkVFRF9MSU5LX1VQREFURTsKIAogCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT5zZXJ2aWNlX3RpbWVyKTsKQEAgLTU3MDUsOCArNTcwNCwxMCBAQAogCQlpZiAoZndzbSAmIElYR0JFX0ZXU01fVFNfRU5BQkxFRCkKIAkJCWFkYXB0ZXItPmZsYWdzMiB8PSBJWEdCRV9GTEFHMl9URU1QX1NFTlNPUl9DQVBBQkxFOwogCQlicmVhazsKLQljYXNlIGl4Z2JlX21hY19YNTUwRU1feDoKIAljYXNlIGl4Z2JlX21hY194NTUwZW1fYToKKwkJYWRhcHRlci0+ZmxhZ3MgfD0gSVhHQkVfRkxBR19HRU5FVkVfT0ZGTE9BRF9DQVBBQkxFOworCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgaXhnYmVfbWFjX1g1NTBFTV94OgogI2lmZGVmIENPTkZJR19JWEdCRV9EQ0IKIAkJYWRhcHRlci0+ZmxhZ3MgJj0gfklYR0JFX0ZMQUdfRENCX0NBUEFCTEU7CiAjZW5kaWYKQEAgLTYxMzgsNyArNjEzOSw3IEBACiAKIAlpeGdiZV91cF9jb21wbGV0ZShhZGFwdGVyKTsKIAotCWl4Z2JlX2NsZWFyX3Z4bGFuX3BvcnQoYWRhcHRlcik7CisJaXhnYmVfY2xlYXJfdWRwX3R1bm5lbF9wb3J0KGFkYXB0ZXIsIElYR0JFX1ZYTEFOQ1RSTF9BTExfVURQUE9SVF9NQVNLKTsKIAl1ZHBfdHVubmVsX2dldF9yeF9pbmZvKG5ldGRldik7CiAKIAlyZXR1cm4gMDsKQEAgLTY5MTUsNyArNjkxNiw3IEBACiAJCQkgKiAoRG8gdGhlIHJlc2V0IG91dHNpZGUgb2YgaW50ZXJydXB0IGNvbnRleHQpLgogCQkJICovCiAJCQllX3dhcm4oZHJ2LCAiaW5pdGlhdGluZyByZXNldCB0byBjbGVhciBUeCB3b3JrIGFmdGVyIGxpbmsgbG9zc1xuIik7Ci0JCQlhZGFwdGVyLT5mbGFnczIgfD0gSVhHQkVfRkxBRzJfUkVTRVRfUkVRVUVTVEVEOworCQkJc2V0X2JpdChfX0lYR0JFX1JFU0VUX1JFUVVFU1RFRCwgJmFkYXB0ZXItPnN0YXRlKTsKIAkJfQogCX0KIH0KQEAgLTcxODEsMTEgKzcxODIsOSBAQAogCiBzdGF0aWMgdm9pZCBpeGdiZV9yZXNldF9zdWJ0YXNrKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQogewotCWlmICghKGFkYXB0ZXItPmZsYWdzMiAmIElYR0JFX0ZMQUcyX1JFU0VUX1JFUVVFU1RFRCkpCisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoX19JWEdCRV9SRVNFVF9SRVFVRVNURUQsICZhZGFwdGVyLT5zdGF0ZSkpCiAJCXJldHVybjsKIAotCWFkYXB0ZXItPmZsYWdzMiAmPSB+SVhHQkVfRkxBRzJfUkVTRVRfUkVRVUVTVEVEOwotCiAJLyogSWYgd2UncmUgYWxyZWFkeSBkb3duLCByZW1vdmluZyBvciByZXNldHRpbmcsIGp1c3QgYmFpbCAqLwogCWlmICh0ZXN0X2JpdChfX0lYR0JFX0RPV04sICZhZGFwdGVyLT5zdGF0ZSkgfHwKIAkgICAgdGVzdF9iaXQoX19JWEdCRV9SRU1PVklORywgJmFkYXB0ZXItPnN0YXRlKSB8fApAQCAtNzIxOSw5ICs3MjE4LDkgQEAKIAkJaXhnYmVfc2VydmljZV9ldmVudF9jb21wbGV0ZShhZGFwdGVyKTsKIAkJcmV0dXJuOwogCX0KLQlpZiAoYWRhcHRlci0+ZmxhZ3MyICYgSVhHQkVfRkxBRzJfVlhMQU5fUkVSRUdfTkVFREVEKSB7CisJaWYgKGFkYXB0ZXItPmZsYWdzMiAmIElYR0JFX0ZMQUcyX1VEUF9UVU5fUkVSRUdfTkVFREVEKSB7CiAJCXJ0bmxfbG9jaygpOwotCQlhZGFwdGVyLT5mbGFnczIgJj0gfklYR0JFX0ZMQUcyX1ZYTEFOX1JFUkVHX05FRURFRDsKKwkJYWRhcHRlci0+ZmxhZ3MyICY9IH5JWEdCRV9GTEFHMl9VRFBfVFVOX1JFUkVHX05FRURFRDsKIAkJdWRwX3R1bm5lbF9nZXRfcnhfaW5mbyhhZGFwdGVyLT5uZXRkZXYpOwogCQlydG5sX3VubG9jaygpOwogCX0KQEAgLTc2NjEsNiArNzY2MCwxMCBAQAogCQlpZiAoYWRhcHRlci0+dnhsYW5fcG9ydCAmJgogCQkgICAgdWRwX2hkcihza2IpLT5kZXN0ID09IGFkYXB0ZXItPnZ4bGFuX3BvcnQpCiAJCQloZHIubmV0d29yayA9IHNrYl9pbm5lcl9uZXR3b3JrX2hlYWRlcihza2IpOworCisJCWlmIChhZGFwdGVyLT5nZW5ldmVfcG9ydCAmJgorCQkgICAgdWRwX2hkcihza2IpLT5kZXN0ID09IGFkYXB0ZXItPmdlbmV2ZV9wb3J0KQorCQkJaGRyLm5ldHdvcmsgPSBza2JfaW5uZXJfbmV0d29ya19oZWFkZXIoc2tiKTsKIAl9CiAKIAkvKiBDdXJyZW50bHkgb25seSBJUHY0L0lQdjYgd2l0aCBUQ1AgaXMgc3VwcG9ydGVkICovCkBAIC04MzkwLDEyICs4MzkzLDE0IEBACiAJCQkgICAgc3RydWN0IHRjZl9leHRzICpleHRzLCB1NjQgKmFjdGlvbiwgdTggKnF1ZXVlKQogewogCWNvbnN0IHN0cnVjdCB0Y19hY3Rpb24gKmE7CisJTElTVF9IRUFEKGFjdGlvbnMpOwogCWludCBlcnI7CiAKIAlpZiAodGNfbm9fYWN0aW9ucyhleHRzKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl0Y19mb3JfZWFjaF9hY3Rpb24oYSwgZXh0cykgeworCXRjZl9leHRzX3RvX2xpc3QoZXh0cywgJmFjdGlvbnMpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYSwgJmFjdGlvbnMsIGxpc3QpIHsKIAogCQkvKiBEcm9wIGFjdGlvbiAqLwogCQlpZiAoaXNfdGNmX2dhY3Rfc2hvdChhKSkgewpAQCAtODc5NCwxMCArODc5OSwyMyBAQAogCW5ldGRldi0+ZmVhdHVyZXMgPSBmZWF0dXJlczsKIAogCWlmICgoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX1ZYTEFOX09GRkxPQURfQ0FQQUJMRSkpIHsKLQkJaWYgKGZlYXR1cmVzICYgTkVUSUZfRl9SWENTVU0pCi0JCQlhZGFwdGVyLT5mbGFnczIgfD0gSVhHQkVfRkxBRzJfVlhMQU5fUkVSRUdfTkVFREVEOwotCQllbHNlCi0JCQlpeGdiZV9jbGVhcl92eGxhbl9wb3J0KGFkYXB0ZXIpOworCQlpZiAoZmVhdHVyZXMgJiBORVRJRl9GX1JYQ1NVTSkgeworCQkJYWRhcHRlci0+ZmxhZ3MyIHw9IElYR0JFX0ZMQUcyX1VEUF9UVU5fUkVSRUdfTkVFREVEOworCQl9IGVsc2UgeworCQkJdTMyIHBvcnRfbWFzayA9IElYR0JFX1ZYTEFOQ1RSTF9WWExBTl9VRFBQT1JUX01BU0s7CisKKwkJCWl4Z2JlX2NsZWFyX3VkcF90dW5uZWxfcG9ydChhZGFwdGVyLCBwb3J0X21hc2spOworCQl9CisJfQorCisJaWYgKChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfR0VORVZFX09GRkxPQURfQ0FQQUJMRSkpIHsKKwkJaWYgKGZlYXR1cmVzICYgTkVUSUZfRl9SWENTVU0pIHsKKwkJCWFkYXB0ZXItPmZsYWdzMiB8PSBJWEdCRV9GTEFHMl9VRFBfVFVOX1JFUkVHX05FRURFRDsKKwkJfSBlbHNlIHsKKwkJCXUzMiBwb3J0X21hc2sgPSBJWEdCRV9WWExBTkNUUkxfR0VORVZFX1VEUFBPUlRfTUFTSzsKKworCQkJaXhnYmVfY2xlYXJfdWRwX3R1bm5lbF9wb3J0KGFkYXB0ZXIsIHBvcnRfbWFzayk7CisJCX0KIAl9CiAKIAlpZiAobmVlZF9yZXNldCkKQEAgLTg4MTAsNjcgKzg4MjgsMTE1IEBACiB9CiAKIC8qKgotICogaXhnYmVfYWRkX3Z4bGFuX3BvcnQgLSBHZXQgbm90aWZpY2F0aW9ucyBhYm91dCBWWExBTiBwb3J0cyB0aGF0IGNvbWUgdXAKKyAqIGl4Z2JlX2FkZF91ZHBfdHVubmVsX3BvcnQgLSBHZXQgbm90aWZpY2F0aW9ucyBhYm91dCBhZGRpbmcgVURQIHR1bm5lbCBwb3J0cwogICogQGRldjogVGhlIHBvcnQncyBuZXRkZXYKICAqIEB0aTogVHVubmVsIGVuZHBvaW50IGluZm9ybWF0aW9uCiAgKiovCi1zdGF0aWMgdm9pZCBpeGdiZV9hZGRfdnhsYW5fcG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgdWRwX3R1bm5lbF9pbmZvICp0aSkKK3N0YXRpYyB2b2lkIGl4Z2JlX2FkZF91ZHBfdHVubmVsX3BvcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgdWRwX3R1bm5lbF9pbmZvICp0aSkKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAlfX2JlMTYgcG9ydCA9IHRpLT5wb3J0OwotCi0JaWYgKHRpLT50eXBlICE9IFVEUF9UVU5ORUxfVFlQRV9WWExBTikKLQkJcmV0dXJuOworCXUzMiBwb3J0X3NoaWZ0ID0gMDsKKwl1MzIgcmVnOwogCiAJaWYgKHRpLT5zYV9mYW1pbHkgIT0gQUZfSU5FVCkKIAkJcmV0dXJuOwogCi0JaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX1ZYTEFOX09GRkxPQURfQ0FQQUJMRSkpCi0JCXJldHVybjsKKwlzd2l0Y2ggKHRpLT50eXBlKSB7CisJY2FzZSBVRFBfVFVOTkVMX1RZUEVfVlhMQU46CisJCWlmICghKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19WWExBTl9PRkZMT0FEX0NBUEFCTEUpKQorCQkJcmV0dXJuOwogCi0JaWYgKGFkYXB0ZXItPnZ4bGFuX3BvcnQgPT0gcG9ydCkKLQkJcmV0dXJuOworCQlpZiAoYWRhcHRlci0+dnhsYW5fcG9ydCA9PSBwb3J0KQorCQkJcmV0dXJuOwogCi0JaWYgKGFkYXB0ZXItPnZ4bGFuX3BvcnQpIHsKLQkJbmV0ZGV2X2luZm8oZGV2LAotCQkJICAgICJIaXQgTWF4IG51bSBvZiBWWExBTiBwb3J0cywgbm90IGFkZGluZyBwb3J0ICVkXG4iLAotCQkJICAgIG50b2hzKHBvcnQpKTsKKwkJaWYgKGFkYXB0ZXItPnZ4bGFuX3BvcnQpIHsKKwkJCW5ldGRldl9pbmZvKGRldiwKKwkJCQkgICAgIlZYTEFOIHBvcnQgJWQgc2V0LCBub3QgYWRkaW5nIHBvcnQgJWRcbiIsCisJCQkJICAgIG50b2hzKGFkYXB0ZXItPnZ4bGFuX3BvcnQpLAorCQkJCSAgICBudG9ocyhwb3J0KSk7CisJCQlyZXR1cm47CisJCX0KKworCQlhZGFwdGVyLT52eGxhbl9wb3J0ID0gcG9ydDsKKwkJYnJlYWs7CisJY2FzZSBVRFBfVFVOTkVMX1RZUEVfR0VORVZFOgorCQlpZiAoIShhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfR0VORVZFX09GRkxPQURfQ0FQQUJMRSkpCisJCQlyZXR1cm47CisKKwkJaWYgKGFkYXB0ZXItPmdlbmV2ZV9wb3J0ID09IHBvcnQpCisJCQlyZXR1cm47CisKKwkJaWYgKGFkYXB0ZXItPmdlbmV2ZV9wb3J0KSB7CisJCQluZXRkZXZfaW5mbyhkZXYsCisJCQkJICAgICJHRU5FVkUgcG9ydCAlZCBzZXQsIG5vdCBhZGRpbmcgcG9ydCAlZFxuIiwKKwkJCQkgICAgbnRvaHMoYWRhcHRlci0+Z2VuZXZlX3BvcnQpLAorCQkJCSAgICBudG9ocyhwb3J0KSk7CisJCQlyZXR1cm47CisJCX0KKworCQlwb3J0X3NoaWZ0ID0gSVhHQkVfVlhMQU5DVFJMX0dFTkVWRV9VRFBQT1JUX1NISUZUOworCQlhZGFwdGVyLT5nZW5ldmVfcG9ydCA9IHBvcnQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CiAJCXJldHVybjsKIAl9CiAKLQlhZGFwdGVyLT52eGxhbl9wb3J0ID0gcG9ydDsKLQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1ZYTEFOQ1RSTCwgbnRvaHMocG9ydCkpOworCXJlZyA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9WWExBTkNUUkwpIHwgbnRvaHMocG9ydCkgPDwgcG9ydF9zaGlmdDsKKwlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1ZYTEFOQ1RSTCwgcmVnKTsKIH0KIAogLyoqCi0gKiBpeGdiZV9kZWxfdnhsYW5fcG9ydCAtIEdldCBub3RpZmljYXRpb25zIGFib3V0IFZYTEFOIHBvcnRzIHRoYXQgZ28gYXdheQorICogaXhnYmVfZGVsX3VkcF90dW5uZWxfcG9ydCAtIEdldCBub3RpZmljYXRpb25zIGFib3V0IHJlbW92aW5nIFVEUCB0dW5uZWwgcG9ydHMKICAqIEBkZXY6IFRoZSBwb3J0J3MgbmV0ZGV2CiAgKiBAdGk6IFR1bm5lbCBlbmRwb2ludCBpbmZvcm1hdGlvbgogICoqLwotc3RhdGljIHZvaWQgaXhnYmVfZGVsX3Z4bGFuX3BvcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IHVkcF90dW5uZWxfaW5mbyAqdGkpCitzdGF0aWMgdm9pZCBpeGdiZV9kZWxfdWRwX3R1bm5lbF9wb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgc3RydWN0IHVkcF90dW5uZWxfaW5mbyAqdGkpCiB7CiAJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiBwb3J0X21hc2s7CiAKLQlpZiAodGktPnR5cGUgIT0gVURQX1RVTk5FTF9UWVBFX1ZYTEFOKQorCWlmICh0aS0+dHlwZSAhPSBVRFBfVFVOTkVMX1RZUEVfVlhMQU4gJiYKKwkgICAgdGktPnR5cGUgIT0gVURQX1RVTk5FTF9UWVBFX0dFTkVWRSkKIAkJcmV0dXJuOwogCiAJaWYgKHRpLT5zYV9mYW1pbHkgIT0gQUZfSU5FVCkKIAkJcmV0dXJuOwogCi0JaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX1ZYTEFOX09GRkxPQURfQ0FQQUJMRSkpCi0JCXJldHVybjsKKwlzd2l0Y2ggKHRpLT50eXBlKSB7CisJY2FzZSBVRFBfVFVOTkVMX1RZUEVfVlhMQU46CisJCWlmICghKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19WWExBTl9PRkZMT0FEX0NBUEFCTEUpKQorCQkJcmV0dXJuOwogCi0JaWYgKGFkYXB0ZXItPnZ4bGFuX3BvcnQgIT0gdGktPnBvcnQpIHsKLQkJbmV0ZGV2X2luZm8oZGV2LCAiUG9ydCAlZCB3YXMgbm90IGZvdW5kLCBub3QgZGVsZXRpbmdcbiIsCi0JCQkgICAgbnRvaHModGktPnBvcnQpKTsKKwkJaWYgKGFkYXB0ZXItPnZ4bGFuX3BvcnQgIT0gdGktPnBvcnQpIHsKKwkJCW5ldGRldl9pbmZvKGRldiwgIlZYTEFOIHBvcnQgJWQgbm90IGZvdW5kXG4iLAorCQkJCSAgICBudG9ocyh0aS0+cG9ydCkpOworCQkJcmV0dXJuOworCQl9CisKKwkJcG9ydF9tYXNrID0gSVhHQkVfVlhMQU5DVFJMX1ZYTEFOX1VEUFBPUlRfTUFTSzsKKwkJYnJlYWs7CisJY2FzZSBVRFBfVFVOTkVMX1RZUEVfR0VORVZFOgorCQlpZiAoIShhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfR0VORVZFX09GRkxPQURfQ0FQQUJMRSkpCisJCQlyZXR1cm47CisKKwkJaWYgKGFkYXB0ZXItPmdlbmV2ZV9wb3J0ICE9IHRpLT5wb3J0KSB7CisJCQluZXRkZXZfaW5mbyhkZXYsICJHRU5FVkUgcG9ydCAlZCBub3QgZm91bmRcbiIsCisJCQkJICAgIG50b2hzKHRpLT5wb3J0KSk7CisJCQlyZXR1cm47CisJCX0KKworCQlwb3J0X21hc2sgPSBJWEdCRV9WWExBTkNUUkxfR0VORVZFX1VEUFBPUlRfTUFTSzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJcmV0dXJuOwogCX0KIAotCWl4Z2JlX2NsZWFyX3Z4bGFuX3BvcnQoYWRhcHRlcik7Ci0JYWRhcHRlci0+ZmxhZ3MyIHw9IElYR0JFX0ZMQUcyX1ZYTEFOX1JFUkVHX05FRURFRDsKKwlpeGdiZV9jbGVhcl91ZHBfdHVubmVsX3BvcnQoYWRhcHRlciwgcG9ydF9tYXNrKTsKKwlhZGFwdGVyLT5mbGFnczIgfD0gSVhHQkVfRkxBRzJfVURQX1RVTl9SRVJFR19ORUVERUQ7CiB9CiAKIHN0YXRpYyBpbnQgaXhnYmVfbmRvX2ZkYl9hZGQoc3RydWN0IG5kbXNnICpuZG0sIHN0cnVjdCBubGF0dHIgKnRiW10sCkBAIC05MTg0LDggKzkyNTAsOCBAQAogCS5uZG9fYnJpZGdlX2dldGxpbmsJPSBpeGdiZV9uZG9fYnJpZGdlX2dldGxpbmssCiAJLm5kb19kZndkX2FkZF9zdGF0aW9uCT0gaXhnYmVfZndkX2FkZCwKIAkubmRvX2Rmd2RfZGVsX3N0YXRpb24JPSBpeGdiZV9md2RfZGVsLAotCS5uZG9fdWRwX3R1bm5lbF9hZGQJPSBpeGdiZV9hZGRfdnhsYW5fcG9ydCwKLQkubmRvX3VkcF90dW5uZWxfZGVsCT0gaXhnYmVfZGVsX3Z4bGFuX3BvcnQsCisJLm5kb191ZHBfdHVubmVsX2FkZAk9IGl4Z2JlX2FkZF91ZHBfdHVubmVsX3BvcnQsCisJLm5kb191ZHBfdHVubmVsX2RlbAk9IGl4Z2JlX2RlbF91ZHBfdHVubmVsX3BvcnQsCiAJLm5kb19mZWF0dXJlc19jaGVjawk9IGl4Z2JlX2ZlYXR1cmVzX2NoZWNrLAogfTsKIApAQCAtOTUxNyw2ICs5NTgzLDcgQEAKIAogCS8qIGNvcHkgbmV0ZGV2IGZlYXR1cmVzIGludG8gbGlzdCBvZiB1c2VyIHNlbGVjdGFibGUgZmVhdHVyZXMgKi8KIAluZXRkZXYtPmh3X2ZlYXR1cmVzIHw9IG5ldGRldi0+ZmVhdHVyZXMgfAorCQkJICAgICAgIE5FVElGX0ZfSFdfVkxBTl9DVEFHX0ZJTFRFUiB8CiAJCQkgICAgICAgTkVUSUZfRl9IV19WTEFOX0NUQUdfUlggfAogCQkJICAgICAgIE5FVElGX0ZfSFdfVkxBTl9DVEFHX1RYIHwKIAkJCSAgICAgICBORVRJRl9GX1JYQUxMIHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3BoeS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfcGh5LmMKaW5kZXggZGIwNzMxZS4uMDIxYWI5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfcGh5LmMKQEAgLTM0Niw4ICszNDYsOCBAQAogCQkJCXJldHVybiAwOwogCQkJfQogCQl9Ci0JCS8qIGNsZWFyIHZhbHVlIGlmIG5vdGhpbmcgZm91bmQgKi8KLQkJaHctPnBoeS5tZGlvLnBydGFkID0gMDsKKwkJLyogaW5kaWNhdGUgbm8gUEhZIGZvdW5kICovCisJCWh3LT5waHkubWRpby5wcnRhZCA9IE1ESU9fUFJUQURfTk9ORTsKIAkJcmV0dXJuIElYR0JFX0VSUl9QSFlfQUREUl9JTlZBTElEOwogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3B0cC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfcHRwLmMKaW5kZXggZTU0MzFiZi4uYTkyMjc3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfcHRwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfcHRwLmMKQEAgLTEyNTQsNyArMTI1NCw3IEBACiAJCWFkYXB0ZXItPnB0cF9jbG9jayA9IE5VTEw7CiAJCWVfZGV2X2VycigicHRwX2Nsb2NrX3JlZ2lzdGVyIGZhaWxlZFxuIik7CiAJCXJldHVybiBlcnI7Ci0JfSBlbHNlCisJfSBlbHNlIGlmIChhZGFwdGVyLT5wdHBfY2xvY2spCiAJCWVfZGV2X2luZm8oInJlZ2lzdGVyZWQgUEhDIGRldmljZSBvbiAlc1xuIiwgbmV0ZGV2LT5uYW1lKTsKIAogCS8qIHNldCBkZWZhdWx0IHRpbWVzdGFtcCBtb2RlIHRvIGRpc2FibGVkIGhlcmUuIFdlIGRvIHRoaXMgaW4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3NyaW92LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9zcmlvdi5jCmluZGV4IDg2MTg1OTkuLjdlNWQ5ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3NyaW92LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfc3Jpb3YuYwpAQCAtMzI5LDEzICszMjksMTUgQEAKIAlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3ZmczsgaSsrKQogCQlpeGdiZV92Zl9jb25maWd1cmF0aW9uKGRldiwgKGkgfCAweDEwMDAwMDAwKSk7CiAKKwkvKiByZXNldCBiZWZvcmUgZW5hYmxpbmcgU1JJT1YgdG8gYXZvaWQgbWFpbGJveCBpc3N1ZXMgKi8KKwlpeGdiZV9zcmlvdl9yZWluaXQoYWRhcHRlcik7CisKIAllcnIgPSBwY2lfZW5hYmxlX3NyaW92KGRldiwgbnVtX3Zmcyk7CiAJaWYgKGVycikgewogCQllX2Rldl93YXJuKCJGYWlsZWQgdG8gZW5hYmxlIFBDSSBzcmlvdjogJWRcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCWl4Z2JlX2dldF92ZnMoYWRhcHRlcik7Ci0JaXhnYmVfc3Jpb3ZfcmVpbml0KGFkYXB0ZXIpOwogCiAJcmV0dXJuIG51bV92ZnM7CiAjZWxzZQpAQCAtMTM1NCwxMyArMTM1NiwxNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCBpeGdiZV9uZG9fc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmLCB1MTYgdmxhbiwgdTggcW9zKQoraW50IGl4Z2JlX25kb19zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmYsIHUxNiB2bGFuLAorCQkJICB1OCBxb3MsIF9fYmUxNiB2bGFuX3Byb3RvKQogewogCWludCBlcnIgPSAwOwogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAogCWlmICgodmYgPj0gYWRhcHRlci0+bnVtX3ZmcykgfHwgKHZsYW4gPiA0MDk1KSB8fCAocW9zID4gNykpCiAJCXJldHVybiAtRUlOVkFMOworCWlmICh2bGFuX3Byb3RvICE9IGh0b25zKEVUSF9QXzgwMjFRKSkKKwkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CiAJaWYgKHZsYW4gfHwgcW9zKSB7CiAJCS8qIENoZWNrIGlmIHRoZXJlIGlzIGFscmVhZHkgYSBwb3J0IFZMQU4gc2V0LCBpZiBzbwogCQkgKiB3ZSBoYXZlIHRvIGRlbGV0ZSB0aGUgb2xkIG9uZSBmaXJzdCBiZWZvcmUgd2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3NyaW92LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9zcmlvdi5oCmluZGV4IDQ3ZTY1ZTIuLjBjNzk3N2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3NyaW92LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfc3Jpb3YuaApAQCAtNDMsNyArNDMsNyBAQAogdm9pZCBpeGdiZV9waW5nX2FsbF92ZnMoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpOwogaW50IGl4Z2JlX25kb19zZXRfdmZfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBxdWV1ZSwgdTggKm1hYyk7CiBpbnQgaXhnYmVfbmRvX3NldF92Zl92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBxdWV1ZSwgdTE2IHZsYW4sCi0JCQkgICB1OCBxb3MpOworCQkJICAgdTggcW9zLCBfX2JlMTYgdmxhbl9wcm90byk7CiBpbnQgaXhnYmVfbGlua19tYnBzKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKTsKIGludCBpeGdiZV9uZG9fc2V0X3ZmX2J3KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2ZiwgaW50IG1pbl90eF9yYXRlLAogCQkJaW50IG1heF90eF9yYXRlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3R5cGUuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3R5cGUuaAppbmRleCAxMjQ4YTk5Li4zMWQ4MmUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV90eXBlLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfdHlwZS5oCkBAIC05MCw2ICs5MCw3IEBACiAjZGVmaW5lIElYR0JFX0RFVl9JRF9YNTUwRU1fQV9TRlBfTgkweDE1QzQKICNkZWZpbmUgSVhHQkVfREVWX0lEX1g1NTBFTV9BX1NHTUlJCTB4MTVDNgogI2RlZmluZSBJWEdCRV9ERVZfSURfWDU1MEVNX0FfU0dNSUlfTAkweDE1QzcKKyNkZWZpbmUgSVhHQkVfREVWX0lEX1g1NTBFTV9BXzEwR19UCTB4MTVDOAogI2RlZmluZSBJWEdCRV9ERVZfSURfWDU1MEVNX0FfU0ZQCTB4MTVDRQogCiAvKiBWRiBEZXZpY2UgSURzICovCkBAIC00ODcsNiArNDg4LDEzIEBACiAjZGVmaW5lIElYR0JFX0ZIRlRfRVhUKF9uKQkoMHgwOTgwMCArICgoX24pICogMHgxMDApKSAvKiBFeHQgRmxleGlibGUgSG9zdAogCQkJCQkJCSAgICAqIEZpbHRlciBUYWJsZSAqLwogCisvKiBtYXNrcyBmb3IgYWNjZXNzaW5nIFZYTEFOIGFuZCBHRU5FVkUgVURQIHBvcnRzICovCisjZGVmaW5lIElYR0JFX1ZYTEFOQ1RSTF9WWExBTl9VRFBQT1JUX01BU0sgICAgIDB4MDAwMGZmZmYgLyogVlhMQU4gcG9ydCAqLworI2RlZmluZSBJWEdCRV9WWExBTkNUUkxfR0VORVZFX1VEUFBPUlRfTUFTSyAgICAweGZmZmYwMDAwIC8qIEdFTkVWRSBwb3J0ICovCisjZGVmaW5lIElYR0JFX1ZYTEFOQ1RSTF9BTExfVURQUE9SVF9NQVNLICAgICAgIDB4ZmZmZmZmZmYgLyogR0VORVZFL1ZYTEFOICovCisKKyNkZWZpbmUgSVhHQkVfVlhMQU5DVFJMX0dFTkVWRV9VRFBQT1JUX1NISUZUICAgMTYKKwogI2RlZmluZSBJWEdCRV9GTEVYSUJMRV9GSUxURVJfQ09VTlRfTUFYICAgICAgICAgNAogI2RlZmluZSBJWEdCRV9FWFRfRkxFWElCTEVfRklMVEVSX0NPVU5UX01BWCAgICAgMgogCkBAIC0xODIzLDYgKzE4MzEsOSBAQAogI2RlZmluZSBJWEdCRV9MRURfSVZSVChfaSkgICAgICAgSVhHQkVfTEVEX09GRlNFVChJWEdCRV9MRURfSVZSVF9CQVNFLCBfaSkKICNkZWZpbmUgSVhHQkVfTEVEX0JMSU5LKF9pKSAgICAgIElYR0JFX0xFRF9PRkZTRVQoSVhHQkVfTEVEX0JMSU5LX0JBU0UsIF9pKQogI2RlZmluZSBJWEdCRV9MRURfTU9ERV9NQVNLKF9pKSAgSVhHQkVfTEVEX09GRlNFVChJWEdCRV9MRURfTU9ERV9NQVNLX0JBU0UsIF9pKQorI2RlZmluZSBJWEdCRV9YNTU3X0xFRF9NQU5VQUxfU0VUX01BU0sJQklUKDgpCisjZGVmaW5lIElYR0JFX1g1NTdfTUFYX0xFRF9JTkRFWAkzCisjZGVmaW5lIElYR0JFX1g1NTdfTEVEX1BST1ZJU0lPTklORwkweEM0MzAKIAogLyogTEVEIG1vZGVzICovCiAjZGVmaW5lIElYR0JFX0xFRF9MSU5LX1VQICAgICAgIDB4MApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfeDU1MC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfeDU1MC5jCmluZGV4IDQ3MTZjYTQuLjdlNmI5MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3g1NTAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV94NTUwLmMKQEAgLTI5NSw2ICsyOTUsMTIgQEAKIAljYXNlIElYR0JFX0RFVl9JRF9YNTUwRU1fQV9LUl9MOgogCQlody0+cGh5LnR5cGUgPSBpeGdiZV9waHlfeDU1MGVtX2tyOwogCQlicmVhazsKKwljYXNlIElYR0JFX0RFVl9JRF9YNTUwRU1fQV8xMEdfVDoKKwkJaWYgKGh3LT5idXMubGFuX2lkKQorCQkJaHctPnBoeS5waHlfc2VtYXBob3JlX21hc2sgPSBJWEdCRV9HU1NSX1BIWTFfU007CisJCWVsc2UKKwkJCWh3LT5waHkucGh5X3NlbWFwaG9yZV9tYXNrID0gSVhHQkVfR1NTUl9QSFkwX1NNOworCQkvKiBGYWxsdGhyb3VnaCAqLwogCWNhc2UgSVhHQkVfREVWX0lEX1g1NTBFTV9YXzFHX1Q6CiAJY2FzZSBJWEdCRV9ERVZfSURfWDU1MEVNX1hfMTBHX1Q6CiAJCXJldHVybiBpeGdiZV9pZGVudGlmeV9waHlfZ2VuZXJpYyhodyk7CkBAIC0xNDUzLDcgKzE0NTksNyBAQAogCS8qIENvbmZpZ3VyZSBpbnRlcm5hbCBQSFkgZm9yIEtSL0tYLiAqLwogCWl4Z2JlX3NldHVwX2tyX3NwZWVkX3g1NTBlbShodywgc3BlZWQpOwogCi0JaWYgKCFody0+cGh5Lm1kaW8ucHJ0YWQgfHwgaHctPnBoeS5tZGlvLnBydGFkID09IDB4RkZGRikKKwlpZiAoaHctPnBoeS5tZGlvLnBydGFkID09IE1ESU9fUFJUQURfTk9ORSkKIAkJcmV0dXJuIElYR0JFX0VSUl9QSFlfQUREUl9JTlZBTElEOwogCiAJLyogR2V0IGV4dGVybmFsIFBIWSBkZXZpY2UgaWQgKi8KQEAgLTIxMTQsNiArMjEyMCw1MCBAQAogCXJldHVybiBpeGdiZV9lbmFibGVfbGFzaV9leHRfdF94NTUwZW0oaHcpOwogfQogCisvKioKKyAqICBpeGdiZV9sZWRfb25fdF94NTUwZW0gLSBUdXJucyBvbiB0aGUgc29mdHdhcmUgY29udHJvbGxhYmxlIExFRHMuCisgKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQorICogIEBsZWRfaWR4OiBsZWQgbnVtYmVyIHRvIHR1cm4gb24KKyAqKi8KK3N0YXRpYyBzMzIgaXhnYmVfbGVkX29uX3RfeDU1MGVtKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiBsZWRfaWR4KQoreworCXUxNiBwaHlfZGF0YTsKKworCWlmIChsZWRfaWR4ID49IElYR0JFX1g1NTdfTUFYX0xFRF9JTkRFWCkKKwkJcmV0dXJuIElYR0JFX0VSUl9QQVJBTTsKKworCS8qIFRvIHR1cm4gb24gdGhlIExFRCwgc2V0IG1vZGUgdG8gT04uICovCisJaHctPnBoeS5vcHMucmVhZF9yZWcoaHcsIElYR0JFX1g1NTdfTEVEX1BST1ZJU0lPTklORyArIGxlZF9pZHgsCisJCQkgICAgIElYR0JFX01ESU9fVkVORE9SX1NQRUNJRklDXzFfREVWX1RZUEUsICZwaHlfZGF0YSk7CisJcGh5X2RhdGEgfD0gSVhHQkVfWDU1N19MRURfTUFOVUFMX1NFVF9NQVNLOworCWh3LT5waHkub3BzLndyaXRlX3JlZyhodywgSVhHQkVfWDU1N19MRURfUFJPVklTSU9OSU5HICsgbGVkX2lkeCwKKwkJCSAgICAgIElYR0JFX01ESU9fVkVORE9SX1NQRUNJRklDXzFfREVWX1RZUEUsIHBoeV9kYXRhKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqICBpeGdiZV9sZWRfb2ZmX3RfeDU1MGVtIC0gVHVybnMgb2ZmIHRoZSBzb2Z0d2FyZSBjb250cm9sbGFibGUgTEVEcy4KKyAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCisgKiAgQGxlZF9pZHg6IGxlZCBudW1iZXIgdG8gdHVybiBvZmYKKyAqKi8KK3N0YXRpYyBzMzIgaXhnYmVfbGVkX29mZl90X3g1NTBlbShzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgbGVkX2lkeCkKK3sKKwl1MTYgcGh5X2RhdGE7CisKKwlpZiAobGVkX2lkeCA+PSBJWEdCRV9YNTU3X01BWF9MRURfSU5ERVgpCisJCXJldHVybiBJWEdCRV9FUlJfUEFSQU07CisKKwkvKiBUbyB0dXJuIG9uIHRoZSBMRUQsIHNldCBtb2RlIHRvIE9OLiAqLworCWh3LT5waHkub3BzLnJlYWRfcmVnKGh3LCBJWEdCRV9YNTU3X0xFRF9QUk9WSVNJT05JTkcgKyBsZWRfaWR4LAorCQkJICAgICBJWEdCRV9NRElPX1ZFTkRPUl9TUEVDSUZJQ18xX0RFVl9UWVBFLCAmcGh5X2RhdGEpOworCXBoeV9kYXRhICY9IH5JWEdCRV9YNTU3X0xFRF9NQU5VQUxfU0VUX01BU0s7CisJaHctPnBoeS5vcHMud3JpdGVfcmVnKGh3LCBJWEdCRV9YNTU3X0xFRF9QUk9WSVNJT05JTkcgKyBsZWRfaWR4LAorCQkJICAgICAgSVhHQkVfTURJT19WRU5ET1JfU1BFQ0lGSUNfMV9ERVZfVFlQRSwgcGh5X2RhdGEpOworCisJcmV0dXJuIDA7Cit9CisKIC8qKiBpeGdiZV9nZXRfbGNkX3g1NTBlbSAtIERldGVybWluZSBsb3dlc3QgY29tbW9uIGRlbm9taW5hdG9yCiAgKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQogICogIEBsY2Rfc3BlZWQ6IHBvaW50ZXIgdG8gbG93ZXN0IGNvbW1vbiBsaW5rIHNwZWVkCkBAIC0yMzQ0LDE4ICsyMzk0LDEyIEBACiAJLyogSWYgWDU1MiAoWDU1MEVNX2EpIGFuZCBNRElPIGlzIGNvbm5lY3RlZCB0byBleHRlcm5hbCBQSFksIHRoZW4gc2V0CiAJICogUEhZIGFkZHJlc3MuIFRoaXMgcmVnaXN0ZXIgZmllbGQgd2FzIGhhcyBvbmx5IGJlZW4gdXNlZCBmb3IgWDU1Mi4KIAkgKi8KLQlpZiAoIWh3LT5waHkubndfbW5nX2lmX3NlbCkgewotCQlpZiAoaHctPm1hYy50eXBlID09IGl4Z2JlX21hY194NTUwZW1fYSkgewotCQkJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBody0+YmFjazsKLQotCQkJZV93YXJuKGRydiwgIm53X21uZ19pZl9zZWwgbm90IHNldFxuIik7Ci0JCX0KLQkJcmV0dXJuOworCWlmIChody0+bWFjLnR5cGUgPT0gaXhnYmVfbWFjX3g1NTBlbV9hICYmCisJICAgIGh3LT5waHkubndfbW5nX2lmX3NlbCAmIElYR0JFX05XX01OR19JRl9TRUxfTURJT19BQ1QpIHsKKwkJaHctPnBoeS5tZGlvLnBydGFkID0gKGh3LT5waHkubndfbW5nX2lmX3NlbCAmCisJCQkJICAgICAgSVhHQkVfTldfTU5HX0lGX1NFTF9NRElPX1BIWV9BREQpID4+CisJCQkJICAgICBJWEdCRV9OV19NTkdfSUZfU0VMX01ESU9fUEhZX0FERF9TSElGVDsKIAl9Ci0KLQlody0+cGh5Lm1kaW8ucHJ0YWQgPSAoaHctPnBoeS5ud19tbmdfaWZfc2VsICYKLQkJCSAgICAgIElYR0JFX05XX01OR19JRl9TRUxfTURJT19QSFlfQUREKSA+PgotCQkJICAgICBJWEdCRV9OV19NTkdfSUZfU0VMX01ESU9fUEhZX0FERF9TSElGVDsKIH0KIAogLyoqIGl4Z2JlX2luaXRfcGh5X29wc19YNTUwZW0gLSBQSFkvU0ZQIHNwZWNpZmljIGluaXQKQEAgLTI0NTYsNiArMjUwMCw3IEBACiAJCWJyZWFrOwogCWNhc2UgSVhHQkVfREVWX0lEX1g1NTBFTV9YXzFHX1Q6CiAJY2FzZSBJWEdCRV9ERVZfSURfWDU1MEVNX1hfMTBHX1Q6CisJY2FzZSBJWEdCRV9ERVZfSURfWDU1MEVNX0FfMTBHX1Q6CiAJCW1lZGlhX3R5cGUgPSBpeGdiZV9tZWRpYV90eXBlX2NvcHBlcjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTI1MTQsNiArMjU1OSw5IEBACiAKIAlzd2l0Y2ggKGh3LT5kZXZpY2VfaWQpIHsKIAljYXNlIElYR0JFX0RFVl9JRF9YNTUwRU1fWF8xMEdfVDoKKwljYXNlIElYR0JFX0RFVl9JRF9YNTUwRU1fQV9TR01JSToKKwljYXNlIElYR0JFX0RFVl9JRF9YNTUwRU1fQV9TR01JSV9MOgorCWNhc2UgSVhHQkVfREVWX0lEX1g1NTBFTV9BXzEwR19UOgogCWNhc2UgSVhHQkVfREVWX0lEX1g1NTBFTV9BX1NGUDoKIAkJLyogQ29uZmlnIE1ESU8gY2xvY2sgc3BlZWQgYmVmb3JlIHRoZSBmaXJzdCBNRElPIFBIWSBhY2Nlc3MgKi8KIAkJaGxyZWcwID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX0hMUkVHMCk7CkBAIC0yODUzLDggKzI5MDEsNiBAQAogCS53cml0ZV9hbmFsb2dfcmVnOAkJPSBOVUxMLCBcCiAJLnNldF9yeHBiYQkJCT0gJml4Z2JlX3NldF9yeHBiYV9nZW5lcmljLCBcCiAJLmNoZWNrX2xpbmsJCQk9ICZpeGdiZV9jaGVja19tYWNfbGlua19nZW5lcmljLCBcCi0JLmxlZF9vbgkJCQk9ICZpeGdiZV9sZWRfb25fZ2VuZXJpYywgXAotCS5sZWRfb2ZmCQkJPSAmaXhnYmVfbGVkX29mZl9nZW5lcmljLCBcCiAJLmJsaW5rX2xlZF9zdGFydAkJPSAmaXhnYmVfYmxpbmtfbGVkX3N0YXJ0X1g1NDAsIFwKIAkuYmxpbmtfbGVkX3N0b3AJCQk9ICZpeGdiZV9ibGlua19sZWRfc3RvcF9YNTQwLCBcCiAJLnNldF9yYXIJCQk9ICZpeGdiZV9zZXRfcmFyX2dlbmVyaWMsIFwKQEAgLTI4ODYsNiArMjkzMiw4IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaXhnYmVfbWFjX29wZXJhdGlvbnMgbWFjX29wc19YNTUwID0gewogCVg1NTBfQ09NTU9OX01BQworCS5sZWRfb24JCQk9IGl4Z2JlX2xlZF9vbl9nZW5lcmljLAorCS5sZWRfb2ZmCQk9IGl4Z2JlX2xlZF9vZmZfZ2VuZXJpYywKIAkucmVzZXRfaHcJCT0gJml4Z2JlX3Jlc2V0X2h3X1g1NDAsCiAJLmdldF9tZWRpYV90eXBlCQk9ICZpeGdiZV9nZXRfbWVkaWFfdHlwZV9YNTQwLAogCS5nZXRfc2FuX21hY19hZGRyCT0gJml4Z2JlX2dldF9zYW5fbWFjX2FkZHJfZ2VuZXJpYywKQEAgLTI5MDQsNiArMjk1Miw4IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaXhnYmVfbWFjX29wZXJhdGlvbnMgbWFjX29wc19YNTUwRU1feCA9IHsKIAlYNTUwX0NPTU1PTl9NQUMKKwkubGVkX29uCQkJPSBpeGdiZV9sZWRfb25fdF94NTUwZW0sCisJLmxlZF9vZmYJCT0gaXhnYmVfbGVkX29mZl90X3g1NTBlbSwKIAkucmVzZXRfaHcJCT0gJml4Z2JlX3Jlc2V0X2h3X1g1NTBlbSwKIAkuZ2V0X21lZGlhX3R5cGUJCT0gJml4Z2JlX2dldF9tZWRpYV90eXBlX1g1NTBlbSwKIAkuZ2V0X3Nhbl9tYWNfYWRkcgk9IE5VTEwsCkBAIC0yOTIyLDYgKzI5NzIsOCBAQAogCiBzdGF0aWMgc3RydWN0IGl4Z2JlX21hY19vcGVyYXRpb25zIG1hY19vcHNfeDU1MGVtX2EgPSB7CiAJWDU1MF9DT01NT05fTUFDCisJLmxlZF9vbgkJCT0gaXhnYmVfbGVkX29uX3RfeDU1MGVtLAorCS5sZWRfb2ZmCQk9IGl4Z2JlX2xlZF9vZmZfdF94NTUwZW0sCiAJLnJlc2V0X2h3CQk9IGl4Z2JlX3Jlc2V0X2h3X1g1NTBlbSwKIAkuZ2V0X21lZGlhX3R5cGUJCT0gaXhnYmVfZ2V0X21lZGlhX3R5cGVfWDU1MGVtLAogCS5nZXRfc2FuX21hY19hZGRyCT0gTlVMTCwKQEAgLTI5OTcsNiArMzA0OSw4IEBACiAJLmlkZW50aWZ5CQk9ICZpeGdiZV9pZGVudGlmeV9waHlfeDU1MGVtLAogCS5yZWFkX3JlZwkJPSAmaXhnYmVfcmVhZF9waHlfcmVnX3g1NTBhLAogCS53cml0ZV9yZWcJCT0gJml4Z2JlX3dyaXRlX3BoeV9yZWdfeDU1MGEsCisJLnJlYWRfcmVnX21kaQkJPSAmaXhnYmVfcmVhZF9waHlfcmVnX21kaSwKKwkud3JpdGVfcmVnX21kaQkJPSAmaXhnYmVfd3JpdGVfcGh5X3JlZ19tZGksCiB9OwogCiBzdGF0aWMgY29uc3QgdTMyIGl4Z2JlX212YWxzX1g1NTBbSVhHQkVfTVZBTFNfSURYX0xJTUlUXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvaXhnYmV2Zi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi9peGdiZXZmLmgKaW5kZXggYmU1MmY1OS4uNTYzOWZiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi9peGdiZXZmLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi9peGdiZXZmLmgKQEAgLTUwMiwxMiArNTAyLDkgQEAKIHZvaWQgaXhnYmVfbmFwaV9hZGRfYWxsKHN0cnVjdCBpeGdiZXZmX2FkYXB0ZXIgKmFkYXB0ZXIpOwogdm9pZCBpeGdiZV9uYXBpX2RlbF9hbGwoc3RydWN0IGl4Z2JldmZfYWRhcHRlciAqYWRhcHRlcik7CiAKLSNpZmRlZiBERUJVRwotY2hhciAqaXhnYmV2Zl9nZXRfaHdfZGV2X25hbWUoc3RydWN0IGl4Z2JlX2h3ICpodyk7Ci0jZGVmaW5lIGh3X2RiZyhodywgZm9ybWF0LCBhcmcuLi4pIFwKLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm9ybWF0LCBpeGdiZXZmX2dldF9od19kZXZfbmFtZShodyksICMjYXJnKQotI2Vsc2UKLSNkZWZpbmUgaHdfZGJnKGh3LCBmb3JtYXQsIGFyZy4uLikgZG8ge30gd2hpbGUgKDApCi0jZW5kaWYKKyNkZWZpbmUgaXhnYmV2Zl9od190b19uZXRkZXYoaHcpIFwKKwkoKChzdHJ1Y3QgaXhnYmV2Zl9hZGFwdGVyICopKGh3KS0+YmFjayktPm5ldGRldikKIAorI2RlZmluZSBod19kYmcoaHcsIGZvcm1hdCwgYXJnLi4uKSBcCisJbmV0ZGV2X2RiZyhpeGdiZXZmX2h3X3RvX25ldGRldihodyksIGZvcm1hdCwgIyMgYXJnKQogI2VuZGlmIC8qIF9JWEdCRVZGX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL2l4Z2JldmZfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi9peGdiZXZmX21haW4uYwppbmRleCBkOWQ2NjE2Li43ZWFhYzMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL2l4Z2JldmZfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvaXhnYmV2Zl9tYWluLmMKQEAgLTE2MTIsNyArMTYxMiw3IEBACiAJCXR4ZGN0bCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9WRlRYRENUTChyZWdfaWR4KSk7CiAJfSAgd2hpbGUgKC0td2FpdF9sb29wICYmICEodHhkY3RsICYgSVhHQkVfVFhEQ1RMX0VOQUJMRSkpOwogCWlmICghd2FpdF9sb29wKQotCQlwcl9lcnIoIkNvdWxkIG5vdCBlbmFibGUgVHggUXVldWUgJWRcbiIsIHJlZ19pZHgpOworCQlod19kYmcoaHcsICJDb3VsZCBub3QgZW5hYmxlIFR4IFF1ZXVlICVkXG4iLCByZWdfaWR4KTsKIH0KIAogLyoqCkBAIC0xODEwLDggKzE4MTAsMTAgQEAKIAlpZiAoaHctPm1hYy50eXBlID49IGl4Z2JlX21hY19YNTUwX3ZmKQogCQlpeGdiZXZmX3NldHVwX3ZmbXJxYyhhZGFwdGVyKTsKIAorCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWJ4X2xvY2spOwogCS8qIG5vdGlmeSB0aGUgUEYgb2Ygb3VyIGludGVudCB0byB1c2UgdGhpcyBzaXplIG9mIGZyYW1lICovCiAJcmV0ID0gaHctPm1hYy5vcHMuc2V0X3JscG1sKGh3LCBuZXRkZXYtPm10dSArIEVUSF9ITEVOICsgRVRIX0ZDU19MRU4pOworCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tYnhfbG9jayk7CiAJaWYgKHJldCkKIAkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAogCQkJIkZhaWxlZCB0byBzZXQgTVRVIGF0ICVkXG4iLCBuZXRkZXYtPm10dSk7CkBAIC0yOTkzLDYgKzI5OTUsNyBAQAogICoqLwogaW50IGl4Z2JldmZfc2V0dXBfdHhfcmVzb3VyY2VzKHN0cnVjdCBpeGdiZXZmX3JpbmcgKnR4X3JpbmcpCiB7CisJc3RydWN0IGl4Z2JldmZfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KHR4X3JpbmctPm5ldGRldik7CiAJaW50IHNpemU7CiAKIAlzaXplID0gc2l6ZW9mKHN0cnVjdCBpeGdiZXZmX3R4X2J1ZmZlcikgKiB0eF9yaW5nLT5jb3VudDsKQEAgLTM3NTcsOCArMzc2MCwxMCBAQAogCWlmICgobmV3X210dSA8IDY4KSB8fCAobWF4X2ZyYW1lID4gbWF4X3Bvc3NpYmxlX2ZyYW1lKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1ieF9sb2NrKTsKIAkvKiBub3RpZnkgdGhlIFBGIG9mIG91ciBpbnRlbnQgdG8gdXNlIHRoaXMgc2l6ZSBvZiBmcmFtZSAqLwogCXJldCA9IGh3LT5tYWMub3BzLnNldF9ybHBtbChodywgbWF4X2ZyYW1lKTsKKwlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWJ4X2xvY2spOwogCWlmIChyZXQpCiAJCXJldHVybiAtRUlOVkFMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL3ZmLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL3ZmLmMKaW5kZXggYTUyZjcwZS4uZDQ2YmExZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi92Zi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvdmYuYwpAQCAtMjg0LDcgKzI4NCw4IEBACiAJaWYgKGFkZHIpCiAJCWV0aGVyX2FkZHJfY29weShtc2dfYWRkciwgYWRkcik7CiAKLQlyZXRfdmFsID0gaXhnYmV2Zl93cml0ZV9tc2dfcmVhZF9hY2soaHcsIG1zZ2J1ZiwgbXNnYnVmLCAzKTsKKwlyZXRfdmFsID0gaXhnYmV2Zl93cml0ZV9tc2dfcmVhZF9hY2soaHcsIG1zZ2J1ZiwgbXNnYnVmLAorCQkJCQkgICAgIHNpemVvZihtc2didWYpIC8gc2l6ZW9mKHUzMikpOwogCWlmICghcmV0X3ZhbCkgewogCQltc2didWZbMF0gJj0gfklYR0JFX1ZUX01TR1RZUEVfQ1RTOwogCkBAIC00NDEsNyArNDQyLDggQEAKIAltc2didWZbMF0gPSBJWEdCRV9WRl9TRVRfTUFDX0FERFI7CiAJZXRoZXJfYWRkcl9jb3B5KG1zZ19hZGRyLCBhZGRyKTsKIAotCXJldF92YWwgPSBpeGdiZXZmX3dyaXRlX21zZ19yZWFkX2FjayhodywgbXNnYnVmLCBtc2didWYsIDIpOworCXJldF92YWwgPSBpeGdiZXZmX3dyaXRlX21zZ19yZWFkX2FjayhodywgbXNnYnVmLCBtc2didWYsCisJCQkJCSAgICAgc2l6ZW9mKG1zZ2J1ZikgLyBzaXplb2YodTMyKSk7CiAKIAltc2didWZbMF0gJj0gfklYR0JFX1ZUX01TR1RZUEVfQ1RTOwogCkBAIC01NTEsNyArNTUzLDggQEAKIAltc2didWZbMF0gPSBJWEdCRV9WRl9VUERBVEVfWENBU1RfTU9ERTsKIAltc2didWZbMV0gPSB4Y2FzdF9tb2RlOwogCi0JZXJyID0gaXhnYmV2Zl93cml0ZV9tc2dfcmVhZF9hY2soaHcsIG1zZ2J1ZiwgbXNnYnVmLCAyKTsKKwllcnIgPSBpeGdiZXZmX3dyaXRlX21zZ19yZWFkX2FjayhodywgbXNnYnVmLCBtc2didWYsCisJCQkJCSBzaXplb2YobXNnYnVmKSAvIHNpemVvZih1MzIpKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCkBAIC01ODgsNyArNTkxLDggQEAKIAkvKiBTZXR0aW5nIHRoZSA4IGJpdCBmaWVsZCBNU0cgSU5GTyB0byBUUlVFIGluZGljYXRlcyAiYWRkIiAqLwogCW1zZ2J1ZlswXSB8PSB2bGFuX29uIDw8IElYR0JFX1ZUX01TR0lORk9fU0hJRlQ7CiAKLQllcnIgPSBpeGdiZXZmX3dyaXRlX21zZ19yZWFkX2FjayhodywgbXNnYnVmLCBtc2didWYsIDIpOworCWVyciA9IGl4Z2JldmZfd3JpdGVfbXNnX3JlYWRfYWNrKGh3LCBtc2didWYsIG1zZ2J1ZiwKKwkJCQkJIHNpemVvZihtc2didWYpIC8gc2l6ZW9mKHUzMikpOwogCWlmIChlcnIpCiAJCWdvdG8gbWJ4X2VycjsKIApAQCAtNzkxLDcgKzc5NSw4IEBACiAJbXNnYnVmWzBdID0gSVhHQkVfVkZfU0VUX0xQRTsKIAltc2didWZbMV0gPSBtYXhfc2l6ZTsKIAotCXJldF92YWwgPSBpeGdiZXZmX3dyaXRlX21zZ19yZWFkX2FjayhodywgbXNnYnVmLCBtc2didWYsIDIpOworCXJldF92YWwgPSBpeGdiZXZmX3dyaXRlX21zZ19yZWFkX2FjayhodywgbXNnYnVmLCBtc2didWYsCisJCQkJCSAgICAgc2l6ZW9mKG1zZ2J1ZikgLyBzaXplb2YodTMyKSk7CiAJaWYgKHJldF92YWwpCiAJCXJldHVybiByZXRfdmFsOwogCWlmICgobXNnYnVmWzBdICYgSVhHQkVfVkZfU0VUX0xQRSkgJiYKQEAgLTgzNyw3ICs4NDIsOCBAQAogCW1zZ1sxXSA9IGFwaTsKIAltc2dbMl0gPSAwOwogCi0JZXJyID0gaXhnYmV2Zl93cml0ZV9tc2dfcmVhZF9hY2soaHcsIG1zZywgbXNnLCAzKTsKKwllcnIgPSBpeGdiZXZmX3dyaXRlX21zZ19yZWFkX2FjayhodywgbXNnLCBtc2csCisJCQkJCSBzaXplb2YobXNnKSAvIHNpemVvZih1MzIpKTsKIAlpZiAoIWVycikgewogCQltc2dbMF0gJj0gfklYR0JFX1ZUX01TR1RZUEVfQ1RTOwogCkBAIC04ODcsNyArODkzLDggQEAKIAltc2dbMF0gPSBJWEdCRV9WRl9HRVRfUVVFVUU7CiAJbXNnWzFdID0gbXNnWzJdID0gbXNnWzNdID0gbXNnWzRdID0gMDsKIAotCWVyciA9IGl4Z2JldmZfd3JpdGVfbXNnX3JlYWRfYWNrKGh3LCBtc2csIG1zZywgNSk7CisJZXJyID0gaXhnYmV2Zl93cml0ZV9tc2dfcmVhZF9hY2soaHcsIG1zZywgbXNnLAorCQkJCQkgc2l6ZW9mKG1zZykgLyBzaXplb2YodTMyKSk7CiAJaWYgKCFlcnIpIHsKIAkJbXNnWzBdICY9IH5JWEdCRV9WVF9NU0dUWVBFX0NUUzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9tdm1kaW8uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvbXZtZGlvLmMKaW5kZXggODk4MmM4OC4uYTBkMWIwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9tdm1kaW8uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL212bWRpby5jCkBAIC0yMTEsOCArMjExLDcgQEAKIAlkZXYtPnJlZ3MgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgci0+c3RhcnQsIHJlc291cmNlX3NpemUocikpOwogCWlmICghZGV2LT5yZWdzKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byByZW1hcCBTTUkgcmVnaXN0ZXJcbiIpOwotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIG91dF9tZGlvOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPnNtaV9idXN5X3dhaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9tdm5ldGEuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvbXZuZXRhLmMKaW5kZXggZDQxYzI4ZC4uNWNiMDdjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9tdm5ldGEuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL212bmV0YS5jCkBAIC0zODIsNyArMzgyLDggQEAKIAlzdHJ1Y3QgbXZuZXRhX3J4X3F1ZXVlICpyeHFzOwogCXN0cnVjdCBtdm5ldGFfdHhfcXVldWUgKnR4cXM7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgY3B1X25vdGlmaWVyOworCXN0cnVjdCBobGlzdF9ub2RlIG5vZGVfb25saW5lOworCXN0cnVjdCBobGlzdF9ub2RlIG5vZGVfZGVhZDsKIAlpbnQgcnhxX2RlZjsKIAkvKiBQcm90ZWN0IHRoZSBhY2Nlc3MgdG8gdGhlIHBlcmNwdSBpbnRlcnJ1cHQgcmVnaXN0ZXJzLAogCSAqIGVuc3VyaW5nIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gcmVtYWlucyBjb2hlcmVudC4KQEAgLTM5OSw3ICs0MDAsNiBAQAogCXUxNiByeF9yaW5nX3NpemU7CiAKIAlzdHJ1Y3QgbWlpX2J1cyAqbWlpX2J1czsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5X2RldjsKIAlwaHlfaW50ZXJmYWNlX3QgcGh5X2ludGVyZmFjZTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBoeV9ub2RlOwogCXVuc2lnbmVkIGludCBsaW5rOwpAQCAtNTc0LDYgKzU3NCw3IEBACiAJaW50IG5leHRfZGVzY190b19wcm9jOwogfTsKIAorc3RhdGljIGVudW0gY3B1aHBfc3RhdGUgb25saW5lX2hwc3RhdGU7CiAvKiBUaGUgaGFyZHdhcmUgc3VwcG9ydHMgZWlnaHQgKDgpIHJ4IHF1ZXVlcywgYnV0IHdlIGFyZSBvbmx5IGFsbG93aW5nCiAgKiB0aGUgZmlyc3Qgb25lIHRvIGJlIHVzZWQuIFRoZXJlZm9yZSwgbGV0J3MganVzdCBhbGxvY2F0ZSBvbmUgcXVldWUuCiAgKi8KQEAgLTYzNSw4ICs2MzYsOSBAQAogfQogCiAvKiBHZXQgU3lzdGVtIE5ldHdvcmsgU3RhdGlzdGljcyAqLwotc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICptdm5ldGFfZ2V0X3N0YXRzNjQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJICAgICBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzKQorc3RhdGljIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqCittdm5ldGFfZ2V0X3N0YXRzNjQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpzdGF0cykKIHsKIAlzdHJ1Y3QgbXZuZXRhX3BvcnQgKnBwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBpbnQgc3RhcnQ7CkBAIC0yNjUxLDYgKzI2NTMsNyBAQAogCXUzMiBjYXVzZV9yeF90eDsKIAlpbnQgcnhfcXVldWU7CiAJc3RydWN0IG12bmV0YV9wb3J0ICpwcCA9IG5ldGRldl9wcml2KG5hcGktPmRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwcC0+ZGV2OwogCXN0cnVjdCBtdm5ldGFfcGNwdV9wb3J0ICpwb3J0ID0gdGhpc19jcHVfcHRyKHBwLT5wb3J0cyk7CiAKIAlpZiAoIW5ldGlmX3J1bm5pbmcocHAtPmRldikpIHsKQEAgLTI2NjgsNyArMjY3MSw3IEBACiAJCQkJKE1WTkVUQV9DQVVTRV9QSFlfU1RBVFVTX0NIQU5HRSB8CiAJCQkJIE1WTkVUQV9DQVVTRV9MSU5LX0NIQU5HRSB8CiAJCQkJIE1WTkVUQV9DQVVTRV9QU0NfU1lOQ19DSEFOR0UpKSkgewotCQkJbXZuZXRhX2ZpeGVkX2xpbmtfdXBkYXRlKHBwLCBwcC0+cGh5X2Rldik7CisJCQltdm5ldGFfZml4ZWRfbGlua191cGRhdGUocHAsIG5kZXYtPnBoeWRldik7CiAJCX0KIAl9CiAKQEAgLTI5NjMsNiArMjk2Niw3IEBACiBzdGF0aWMgdm9pZCBtdm5ldGFfc3RhcnRfZGV2KHN0cnVjdCBtdm5ldGFfcG9ydCAqcHApCiB7CiAJaW50IGNwdTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBwLT5kZXY7CiAKIAltdm5ldGFfbWF4X3J4X3NpemVfc2V0KHBwLCBwcC0+cGt0X3NpemUpOwogCW12bmV0YV90eHFfbWF4X3R4X3NpemVfc2V0KHBwLCBwcC0+cGt0X3NpemUpOwpAQCAtMjk4NSwxNSArMjk4OSwxNiBAQAogCQkgICAgTVZORVRBX0NBVVNFX0xJTktfQ0hBTkdFIHwKIAkJICAgIE1WTkVUQV9DQVVTRV9QU0NfU1lOQ19DSEFOR0UpOwogCi0JcGh5X3N0YXJ0KHBwLT5waHlfZGV2KTsKKwlwaHlfc3RhcnQobmRldi0+cGh5ZGV2KTsKIAluZXRpZl90eF9zdGFydF9hbGxfcXVldWVzKHBwLT5kZXYpOwogfQogCiBzdGF0aWMgdm9pZCBtdm5ldGFfc3RvcF9kZXYoc3RydWN0IG12bmV0YV9wb3J0ICpwcCkKIHsKIAl1bnNpZ25lZCBpbnQgY3B1OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcHAtPmRldjsKIAotCXBoeV9zdG9wKHBwLT5waHlfZGV2KTsKKwlwaHlfc3RvcChuZGV2LT5waHlkZXYpOwogCiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKIAkJc3RydWN0IG12bmV0YV9wY3B1X3BvcnQgKnBvcnQgPSBwZXJfY3B1X3B0cihwcC0+cG9ydHMsIGNwdSk7CkBAIC0zMTY2LDcgKzMxNzEsNyBAQAogc3RhdGljIHZvaWQgbXZuZXRhX2FkanVzdF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewogCXN0cnVjdCBtdm5ldGFfcG9ydCAqcHAgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gcHAtPnBoeV9kZXY7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IG5kZXYtPnBoeWRldjsKIAlpbnQgc3RhdHVzX2NoYW5nZSA9IDA7CiAKIAlpZiAocGh5ZGV2LT5saW5rKSB7CkBAIC0zMjQ0LDcgKzMyNDksNiBAQAogCXBoeV9kZXYtPnN1cHBvcnRlZCAmPSBQSFlfR0JJVF9GRUFUVVJFUzsKIAlwaHlfZGV2LT5hZHZlcnRpc2luZyA9IHBoeV9kZXYtPnN1cHBvcnRlZDsKIAotCXBwLT5waHlfZGV2ID0gcGh5X2RldjsKIAlwcC0+bGluayAgICA9IDA7CiAJcHAtPmR1cGxleCAgPSAwOwogCXBwLT5zcGVlZCAgID0gMDsKQEAgLTMyNTQsOCArMzI1OCw5IEBACiAKIHN0YXRpYyB2b2lkIG12bmV0YV9tZGlvX3JlbW92ZShzdHJ1Y3QgbXZuZXRhX3BvcnQgKnBwKQogewotCXBoeV9kaXNjb25uZWN0KHBwLT5waHlfZGV2KTsKLQlwcC0+cGh5X2RldiA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwcC0+ZGV2OworCisJcGh5X2Rpc2Nvbm5lY3QobmRldi0+cGh5ZGV2KTsKIH0KIAogLyogRWxlY3RpbmcgYSBDUFUgbXVzdCBiZSBkb25lIGluIGFuIGF0b21pYyB3YXk6IGl0IHNob3VsZCBiZSBkb25lCkBAIC0zMzExLDEwMSArMzMxNiwxMDQgQEAKIAl9CiB9OwogCi1zdGF0aWMgaW50IG12bmV0YV9wZXJjcHVfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCi0JCQkJICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQgbXZuZXRhX2NwdV9vbmxpbmUodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUpCiB7Ci0Jc3RydWN0IG12bmV0YV9wb3J0ICpwcCA9IGNvbnRhaW5lcl9vZihuZmIsIHN0cnVjdCBtdm5ldGFfcG9ydCwKLQkJCQkJICAgICAgY3B1X25vdGlmaWVyKTsKLQlpbnQgY3B1ID0gKHVuc2lnbmVkIGxvbmcpaGNwdSwgb3RoZXJfY3B1OworCWludCBvdGhlcl9jcHU7CisJc3RydWN0IG12bmV0YV9wb3J0ICpwcCA9IGhsaXN0X2VudHJ5X3NhZmUobm9kZSwgc3RydWN0IG12bmV0YV9wb3J0LAorCQkJCQkJICBub2RlX29ubGluZSk7CiAJc3RydWN0IG12bmV0YV9wY3B1X3BvcnQgKnBvcnQgPSBwZXJfY3B1X3B0cihwcC0+cG9ydHMsIGNwdSk7CiAKLQlzd2l0Y2ggKGFjdGlvbikgewotCWNhc2UgQ1BVX09OTElORToKLQljYXNlIENQVV9PTkxJTkVfRlJPWkVOOgotCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgotCWNhc2UgQ1BVX0RPV05fRkFJTEVEX0ZST1pFTjoKLQkJc3Bpbl9sb2NrKCZwcC0+bG9jayk7Ci0JCS8qIENvbmZpZ3VyaW5nIHRoZSBkcml2ZXIgZm9yIGEgbmV3IENQVSB3aGlsZSB0aGUKLQkJICogZHJpdmVyIGlzIHN0b3BwaW5nIGlzIHJhY3ksIHNvIGp1c3QgYXZvaWQgaXQuCi0JCSAqLwotCQlpZiAocHAtPmlzX3N0b3BwZWQpIHsKLQkJCXNwaW5fdW5sb2NrKCZwcC0+bG9jayk7Ci0JCQlicmVhazsKKworCXNwaW5fbG9jaygmcHAtPmxvY2spOworCS8qCisJICogQ29uZmlndXJpbmcgdGhlIGRyaXZlciBmb3IgYSBuZXcgQ1BVIHdoaWxlIHRoZSBkcml2ZXIgaXMKKwkgKiBzdG9wcGluZyBpcyByYWN5LCBzbyBqdXN0IGF2b2lkIGl0LgorCSAqLworCWlmIChwcC0+aXNfc3RvcHBlZCkgeworCQlzcGluX3VubG9jaygmcHAtPmxvY2spOworCQlyZXR1cm4gMDsKKwl9CisJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKHBwLT5kZXYpOworCisJLyoKKwkgKiBXZSBoYXZlIHRvIHN5bmNocm9uaXNlIG9uIHRoYSBuYXBpIG9mIGVhY2ggQ1BVIGV4Y2VwdCB0aGUgb25lCisJICoganVzdCBiZWluZyB3b2tlbiB1cAorCSAqLworCWZvcl9lYWNoX29ubGluZV9jcHUob3RoZXJfY3B1KSB7CisJCWlmIChvdGhlcl9jcHUgIT0gY3B1KSB7CisJCQlzdHJ1Y3QgbXZuZXRhX3BjcHVfcG9ydCAqb3RoZXJfcG9ydCA9CisJCQkJcGVyX2NwdV9wdHIocHAtPnBvcnRzLCBvdGhlcl9jcHUpOworCisJCQluYXBpX3N5bmNocm9uaXplKCZvdGhlcl9wb3J0LT5uYXBpKTsKIAkJfQotCQluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMocHAtPmRldik7Ci0KLQkJLyogV2UgaGF2ZSB0byBzeW5jaHJvbmlzZSBvbiB0aGEgbmFwaSBvZiBlYWNoIENQVQotCQkgKiBleGNlcHQgdGhlIG9uZSBqdXN0IGJlaW5nIHdha2VkIHVwCi0JCSAqLwotCQlmb3JfZWFjaF9vbmxpbmVfY3B1KG90aGVyX2NwdSkgewotCQkJaWYgKG90aGVyX2NwdSAhPSBjcHUpIHsKLQkJCQlzdHJ1Y3QgbXZuZXRhX3BjcHVfcG9ydCAqb3RoZXJfcG9ydCA9Ci0JCQkJCXBlcl9jcHVfcHRyKHBwLT5wb3J0cywgb3RoZXJfY3B1KTsKLQotCQkJCW5hcGlfc3luY2hyb25pemUoJm90aGVyX3BvcnQtPm5hcGkpOwotCQkJfQotCQl9Ci0KLQkJLyogTWFzayBhbGwgZXRoZXJuZXQgcG9ydCBpbnRlcnJ1cHRzICovCi0JCW9uX2VhY2hfY3B1KG12bmV0YV9wZXJjcHVfbWFza19pbnRlcnJ1cHQsIHBwLCB0cnVlKTsKLQkJbmFwaV9lbmFibGUoJnBvcnQtPm5hcGkpOwotCi0KLQkJLyogRW5hYmxlIHBlci1DUFUgaW50ZXJydXB0cyBvbiB0aGUgQ1BVIHRoYXQgaXMKLQkJICogYnJvdWdodCB1cC4KLQkJICovCi0JCW12bmV0YV9wZXJjcHVfZW5hYmxlKHBwKTsKLQotCQkvKiBFbmFibGUgcGVyLUNQVSBpbnRlcnJ1cHQgb24gdGhlIG9uZSBDUFUgd2UgY2FyZQotCQkgKiBhYm91dC4KLQkJICovCi0JCW12bmV0YV9wZXJjcHVfZWxlY3QocHApOwotCi0JCS8qIFVubWFzayBhbGwgZXRoZXJuZXQgcG9ydCBpbnRlcnJ1cHRzICovCi0JCW9uX2VhY2hfY3B1KG12bmV0YV9wZXJjcHVfdW5tYXNrX2ludGVycnVwdCwgcHAsIHRydWUpOwotCQltdnJlZ193cml0ZShwcCwgTVZORVRBX0lOVFJfTUlTQ19NQVNLLAotCQkJTVZORVRBX0NBVVNFX1BIWV9TVEFUVVNfQ0hBTkdFIHwKLQkJCU1WTkVUQV9DQVVTRV9MSU5LX0NIQU5HRSB8Ci0JCQlNVk5FVEFfQ0FVU0VfUFNDX1NZTkNfQ0hBTkdFKTsKLQkJbmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyhwcC0+ZGV2KTsKLQkJc3Bpbl91bmxvY2soJnBwLT5sb2NrKTsKLQkJYnJlYWs7Ci0JY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgotCWNhc2UgQ1BVX0RPV05fUFJFUEFSRV9GUk9aRU46Ci0JCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhwcC0+ZGV2KTsKLQkJLyogVGhhbmtzIHRvIHRoaXMgbG9jayB3ZSBhcmUgc3VyZSB0aGF0IGFueSBwZW5kaW5nCi0JCSAqIGNwdSBlbGVjdGlvbiBpcyBkb25lCi0JCSAqLwotCQlzcGluX2xvY2soJnBwLT5sb2NrKTsKLQkJLyogTWFzayBhbGwgZXRoZXJuZXQgcG9ydCBpbnRlcnJ1cHRzICovCi0JCW9uX2VhY2hfY3B1KG12bmV0YV9wZXJjcHVfbWFza19pbnRlcnJ1cHQsIHBwLCB0cnVlKTsKLQkJc3Bpbl91bmxvY2soJnBwLT5sb2NrKTsKLQotCQluYXBpX3N5bmNocm9uaXplKCZwb3J0LT5uYXBpKTsKLQkJbmFwaV9kaXNhYmxlKCZwb3J0LT5uYXBpKTsKLQkJLyogRGlzYWJsZSBwZXItQ1BVIGludGVycnVwdHMgb24gdGhlIENQVSB0aGF0IGlzCi0JCSAqIGJyb3VnaHQgZG93bi4KLQkJICovCi0JCW12bmV0YV9wZXJjcHVfZGlzYWJsZShwcCk7Ci0KLQkJYnJlYWs7Ci0JY2FzZSBDUFVfREVBRDoKLQljYXNlIENQVV9ERUFEX0ZST1pFTjoKLQkJLyogQ2hlY2sgaWYgYSBuZXcgQ1BVIG11c3QgYmUgZWxlY3RlZCBub3cgdGhpcyBvbiBpcyBkb3duICovCi0JCXNwaW5fbG9jaygmcHAtPmxvY2spOwotCQltdm5ldGFfcGVyY3B1X2VsZWN0KHBwKTsKLQkJc3Bpbl91bmxvY2soJnBwLT5sb2NrKTsKLQkJLyogVW5tYXNrIGFsbCBldGhlcm5ldCBwb3J0IGludGVycnVwdHMgKi8KLQkJb25fZWFjaF9jcHUobXZuZXRhX3BlcmNwdV91bm1hc2tfaW50ZXJydXB0LCBwcCwgdHJ1ZSk7Ci0JCW12cmVnX3dyaXRlKHBwLCBNVk5FVEFfSU5UUl9NSVNDX01BU0ssCi0JCQlNVk5FVEFfQ0FVU0VfUEhZX1NUQVRVU19DSEFOR0UgfAotCQkJTVZORVRBX0NBVVNFX0xJTktfQ0hBTkdFIHwKLQkJCU1WTkVUQV9DQVVTRV9QU0NfU1lOQ19DSEFOR0UpOwotCQluZXRpZl90eF9zdGFydF9hbGxfcXVldWVzKHBwLT5kZXYpOwotCQlicmVhazsKIAl9CiAKLQlyZXR1cm4gTk9USUZZX09LOworCS8qIE1hc2sgYWxsIGV0aGVybmV0IHBvcnQgaW50ZXJydXB0cyAqLworCW9uX2VhY2hfY3B1KG12bmV0YV9wZXJjcHVfbWFza19pbnRlcnJ1cHQsIHBwLCB0cnVlKTsKKwluYXBpX2VuYWJsZSgmcG9ydC0+bmFwaSk7CisKKwkvKgorCSAqIEVuYWJsZSBwZXItQ1BVIGludGVycnVwdHMgb24gdGhlIENQVSB0aGF0IGlzCisJICogYnJvdWdodCB1cC4KKwkgKi8KKwltdm5ldGFfcGVyY3B1X2VuYWJsZShwcCk7CisKKwkvKgorCSAqIEVuYWJsZSBwZXItQ1BVIGludGVycnVwdCBvbiB0aGUgb25lIENQVSB3ZSBjYXJlCisJICogYWJvdXQuCisJICovCisJbXZuZXRhX3BlcmNwdV9lbGVjdChwcCk7CisKKwkvKiBVbm1hc2sgYWxsIGV0aGVybmV0IHBvcnQgaW50ZXJydXB0cyAqLworCW9uX2VhY2hfY3B1KG12bmV0YV9wZXJjcHVfdW5tYXNrX2ludGVycnVwdCwgcHAsIHRydWUpOworCW12cmVnX3dyaXRlKHBwLCBNVk5FVEFfSU5UUl9NSVNDX01BU0ssCisJCSAgICBNVk5FVEFfQ0FVU0VfUEhZX1NUQVRVU19DSEFOR0UgfAorCQkgICAgTVZORVRBX0NBVVNFX0xJTktfQ0hBTkdFIHwKKwkJICAgIE1WTkVUQV9DQVVTRV9QU0NfU1lOQ19DSEFOR0UpOworCW5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXMocHAtPmRldik7CisJc3Bpbl91bmxvY2soJnBwLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdm5ldGFfY3B1X2Rvd25fcHJlcGFyZSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgbXZuZXRhX3BvcnQgKnBwID0gaGxpc3RfZW50cnlfc2FmZShub2RlLCBzdHJ1Y3QgbXZuZXRhX3BvcnQsCisJCQkJCQkgIG5vZGVfb25saW5lKTsKKwlzdHJ1Y3QgbXZuZXRhX3BjcHVfcG9ydCAqcG9ydCA9IHBlcl9jcHVfcHRyKHBwLT5wb3J0cywgY3B1KTsKKworCS8qCisJICogVGhhbmtzIHRvIHRoaXMgbG9jayB3ZSBhcmUgc3VyZSB0aGF0IGFueSBwZW5kaW5nIGNwdSBlbGVjdGlvbiBpcworCSAqIGRvbmUuCisJICovCisJc3Bpbl9sb2NrKCZwcC0+bG9jayk7CisJLyogTWFzayBhbGwgZXRoZXJuZXQgcG9ydCBpbnRlcnJ1cHRzICovCisJb25fZWFjaF9jcHUobXZuZXRhX3BlcmNwdV9tYXNrX2ludGVycnVwdCwgcHAsIHRydWUpOworCXNwaW5fdW5sb2NrKCZwcC0+bG9jayk7CisKKwluYXBpX3N5bmNocm9uaXplKCZwb3J0LT5uYXBpKTsKKwluYXBpX2Rpc2FibGUoJnBvcnQtPm5hcGkpOworCS8qIERpc2FibGUgcGVyLUNQVSBpbnRlcnJ1cHRzIG9uIHRoZSBDUFUgdGhhdCBpcyBicm91Z2h0IGRvd24uICovCisJbXZuZXRhX3BlcmNwdV9kaXNhYmxlKHBwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdm5ldGFfY3B1X2RlYWQodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUpCit7CisJc3RydWN0IG12bmV0YV9wb3J0ICpwcCA9IGhsaXN0X2VudHJ5X3NhZmUobm9kZSwgc3RydWN0IG12bmV0YV9wb3J0LAorCQkJCQkJICBub2RlX2RlYWQpOworCisJLyogQ2hlY2sgaWYgYSBuZXcgQ1BVIG11c3QgYmUgZWxlY3RlZCBub3cgdGhpcyBvbiBpcyBkb3duICovCisJc3Bpbl9sb2NrKCZwcC0+bG9jayk7CisJbXZuZXRhX3BlcmNwdV9lbGVjdChwcCk7CisJc3Bpbl91bmxvY2soJnBwLT5sb2NrKTsKKwkvKiBVbm1hc2sgYWxsIGV0aGVybmV0IHBvcnQgaW50ZXJydXB0cyAqLworCW9uX2VhY2hfY3B1KG12bmV0YV9wZXJjcHVfdW5tYXNrX2ludGVycnVwdCwgcHAsIHRydWUpOworCW12cmVnX3dyaXRlKHBwLCBNVk5FVEFfSU5UUl9NSVNDX01BU0ssCisJCSAgICBNVk5FVEFfQ0FVU0VfUEhZX1NUQVRVU19DSEFOR0UgfAorCQkgICAgTVZORVRBX0NBVVNFX0xJTktfQ0hBTkdFIHwKKwkJICAgIE1WTkVUQV9DQVVTRV9QU0NfU1lOQ19DSEFOR0UpOworCW5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXMocHAtPmRldik7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgbXZuZXRhX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTM0NDIsNyArMzQ1MCwxNSBAQAogCS8qIFJlZ2lzdGVyIGEgQ1BVIG5vdGlmaWVyIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBvdXIgQ1BVCiAJICogbWlnaHQgYmUgdGFrZW4gb2ZmbGluZS4KIAkgKi8KLQlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnBwLT5jcHVfbm90aWZpZXIpOworCXJldCA9IGNwdWhwX3N0YXRlX2FkZF9pbnN0YW5jZV9ub2NhbGxzKG9ubGluZV9ocHN0YXRlLAorCQkJCQkgICAgICAgJnBwLT5ub2RlX29ubGluZSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZnJlZV9pcnE7CisKKwlyZXQgPSBjcHVocF9zdGF0ZV9hZGRfaW5zdGFuY2Vfbm9jYWxscyhDUFVIUF9ORVRfTVZORVRBX0RFQUQsCisJCQkJCSAgICAgICAmcHAtPm5vZGVfZGVhZCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZnJlZV9vbmxpbmVfaHA7CiAKIAkvKiBJbiBkZWZhdWx0IGxpbmsgaXMgZG93biAqLwogCW5ldGlmX2NhcnJpZXJfb2ZmKHBwLT5kZXYpOwpAQCAtMzQ1MCwxNSArMzQ2NiwxOSBAQAogCXJldCA9IG12bmV0YV9tZGlvX3Byb2JlKHBwKTsKIAlpZiAocmV0IDwgMCkgewogCQluZXRkZXZfZXJyKGRldiwgImNhbm5vdCBwcm9iZSBNRElPIGJ1c1xuIik7Ci0JCWdvdG8gZXJyX2ZyZWVfaXJxOworCQlnb3RvIGVycl9mcmVlX2RlYWRfaHA7CiAJfQogCiAJbXZuZXRhX3N0YXJ0X2RldihwcCk7CiAKIAlyZXR1cm4gMDsKIAorZXJyX2ZyZWVfZGVhZF9ocDoKKwljcHVocF9zdGF0ZV9yZW1vdmVfaW5zdGFuY2Vfbm9jYWxscyhDUFVIUF9ORVRfTVZORVRBX0RFQUQsCisJCQkJCSAgICAmcHAtPm5vZGVfZGVhZCk7CitlcnJfZnJlZV9vbmxpbmVfaHA6CisJY3B1aHBfc3RhdGVfcmVtb3ZlX2luc3RhbmNlX25vY2FsbHMob25saW5lX2hwc3RhdGUsICZwcC0+bm9kZV9vbmxpbmUpOwogZXJyX2ZyZWVfaXJxOgotCXVucmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZwcC0+Y3B1X25vdGlmaWVyKTsKIAlvbl9lYWNoX2NwdShtdm5ldGFfcGVyY3B1X2Rpc2FibGUsIHBwLCB0cnVlKTsKIAlmcmVlX3BlcmNwdV9pcnEocHAtPmRldi0+aXJxLCBwcC0+cG9ydHMpOwogZXJyX2NsZWFudXBfdHhxczoKQEAgLTM0ODQsNyArMzUwNCwxMCBAQAogCiAJbXZuZXRhX3N0b3BfZGV2KHBwKTsKIAltdm5ldGFfbWRpb19yZW1vdmUocHApOwotCXVucmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZwcC0+Y3B1X25vdGlmaWVyKTsKKworCWNwdWhwX3N0YXRlX3JlbW92ZV9pbnN0YW5jZV9ub2NhbGxzKG9ubGluZV9ocHN0YXRlLCAmcHAtPm5vZGVfb25saW5lKTsKKwljcHVocF9zdGF0ZV9yZW1vdmVfaW5zdGFuY2Vfbm9jYWxscyhDUFVIUF9ORVRfTVZORVRBX0RFQUQsCisJCQkJCSAgICAmcHAtPm5vZGVfZGVhZCk7CiAJb25fZWFjaF9jcHUobXZuZXRhX3BlcmNwdV9kaXNhYmxlLCBwcCwgdHJ1ZSk7CiAJZnJlZV9wZXJjcHVfaXJxKGRldi0+aXJxLCBwcC0+cG9ydHMpOwogCW12bmV0YV9jbGVhbnVwX3J4cXMocHApOwpAQCAtMzQ5NSw0MiArMzUxOCwzMSBAQAogCiBzdGF0aWMgaW50IG12bmV0YV9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKIHsKLQlzdHJ1Y3QgbXZuZXRhX3BvcnQgKnBwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWlmICghcHAtPnBoeV9kZXYpCisJaWYgKCFkZXYtPnBoeWRldikKIAkJcmV0dXJuIC1FTk9UU1VQUDsKIAotCXJldHVybiBwaHlfbWlpX2lvY3RsKHBwLT5waHlfZGV2LCBpZnIsIGNtZCk7CisJcmV0dXJuIHBoeV9taWlfaW9jdGwoZGV2LT5waHlkZXYsIGlmciwgY21kKTsKIH0KIAogLyogRXRodG9vbCBtZXRob2RzICovCiAKLS8qIEdldCBzZXR0aW5ncyAocGh5IGFkZHJlc3MsIHNwZWVkKSBmb3IgZXRodG9vbHMgKi8KLWludCBtdm5ldGFfZXRodG9vbF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCisvKiBTZXQgbGluayBrc2V0dGluZ3MgKHBoeSBhZGRyZXNzLCBzcGVlZCkgZm9yIGV0aHRvb2xzICovCitzdGF0aWMgaW50Cittdm5ldGFfZXRodG9vbF9zZXRfbGlua19rc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCisJCQkJICBjb25zdCBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQogewotCXN0cnVjdCBtdm5ldGFfcG9ydCAqcHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JaWYgKCFwcC0+cGh5X2RldikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlyZXR1cm4gcGh5X2V0aHRvb2xfZ3NldChwcC0+cGh5X2RldiwgY21kKTsKLX0KLQotLyogU2V0IHNldHRpbmdzIChwaHkgYWRkcmVzcywgc3BlZWQpIGZvciBldGh0b29scyAqLwotaW50IG12bmV0YV9ldGh0b29sX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKLXsKLQlzdHJ1Y3QgbXZuZXRhX3BvcnQgKnBwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gcHAtPnBoeV9kZXY7CisJc3RydWN0IG12bmV0YV9wb3J0ICpwcCA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBuZGV2LT5waHlkZXY7CiAKIAlpZiAoIXBoeWRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoKGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgIT0gcHAtPnVzZV9pbmJhbmRfc3RhdHVzKSB7CisJaWYgKChjbWQtPmJhc2UuYXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgIT0gcHAtPnVzZV9pbmJhbmRfc3RhdHVzKSB7CiAJCXUzMiB2YWw7CiAKLQkJbXZuZXRhX3NldF9hdXRvbmVnKHBwLCBjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpOworCQltdm5ldGFfc2V0X2F1dG9uZWcocHAsIGNtZC0+YmFzZS5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKTsKIAotCQlpZiAoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRElTQUJMRSkgeworCQlpZiAoY21kLT5iYXNlLmF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFKSB7CiAJCQl2YWwgPSBtdnJlZ19yZWFkKHBwLCBNVk5FVEFfR01BQ19BVVRPTkVHX0NPTkZJRyk7CiAJCQl2YWwgJj0gfihNVk5FVEFfR01BQ19DT05GSUdfTUlJX1NQRUVEIHwKIAkJCQkgTVZORVRBX0dNQUNfQ09ORklHX0dNSUlfU1BFRUQgfApAQCAtMzU0NywxNyArMzU1OSwxNyBAQAogCQkJbXZyZWdfd3JpdGUocHAsIE1WTkVUQV9HTUFDX0FVVE9ORUdfQ09ORklHLCB2YWwpOwogCQl9CiAKLQkJcHAtPnVzZV9pbmJhbmRfc3RhdHVzID0gKGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSk7CisJCXBwLT51c2VfaW5iYW5kX3N0YXR1cyA9IChjbWQtPmJhc2UuYXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSk7CiAJCW5ldGRldl9pbmZvKHBwLT5kZXYsICJhdXRvbmVnIHN0YXR1cyBzZXQgdG8gJWlcbiIsCiAJCQkgICAgcHAtPnVzZV9pbmJhbmRfc3RhdHVzKTsKIAotCQlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCWlmIChuZXRpZl9ydW5uaW5nKG5kZXYpKSB7CiAJCQltdm5ldGFfcG9ydF9kb3duKHBwKTsKIAkJCW12bmV0YV9wb3J0X3VwKHBwKTsKIAkJfQogCX0KIAotCXJldHVybiBwaHlfZXRodG9vbF9zc2V0KHBwLT5waHlfZGV2LCBjbWQpOworCXJldHVybiBwaHlfZXRodG9vbF9rc2V0dGluZ3Nfc2V0KG5kZXYtPnBoeWRldiwgY21kKTsKIH0KIAogLyogU2V0IGludGVycnVwdCBjb2FsZXNjaW5nIGZvciBldGh0b29scyAqLwpAQCAtMzgyMSw4ICszODMzLDYgQEAKIAogY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIG12bmV0YV9ldGhfdG9vbF9vcHMgPSB7CiAJLmdldF9saW5rICAgICAgID0gZXRodG9vbF9vcF9nZXRfbGluaywKLQkuZ2V0X3NldHRpbmdzICAgPSBtdm5ldGFfZXRodG9vbF9nZXRfc2V0dGluZ3MsCi0JLnNldF9zZXR0aW5ncyAgID0gbXZuZXRhX2V0aHRvb2xfc2V0X3NldHRpbmdzLAogCS5zZXRfY29hbGVzY2UgICA9IG12bmV0YV9ldGh0b29sX3NldF9jb2FsZXNjZSwKIAkuZ2V0X2NvYWxlc2NlICAgPSBtdm5ldGFfZXRodG9vbF9nZXRfY29hbGVzY2UsCiAJLmdldF9kcnZpbmZvICAgID0gbXZuZXRhX2V0aHRvb2xfZ2V0X2RydmluZm8sCkBAIC0zODM1LDYgKzM4NDUsOCBAQAogCS5nZXRfcnhuZmMJPSBtdm5ldGFfZXRodG9vbF9nZXRfcnhuZmMsCiAJLmdldF9yeGZoCT0gbXZuZXRhX2V0aHRvb2xfZ2V0X3J4ZmgsCiAJLnNldF9yeGZoCT0gbXZuZXRhX2V0aHRvb2xfc2V0X3J4ZmgsCisJLmdldF9saW5rX2tzZXR0aW5ncyA9IHBoeV9ldGh0b29sX2dldF9saW5rX2tzZXR0aW5ncywKKwkuc2V0X2xpbmtfa3NldHRpbmdzID0gbXZuZXRhX2V0aHRvb2xfc2V0X2xpbmtfa3NldHRpbmdzLAogfTsKIAogLyogSW5pdGlhbGl6ZSBodyAqLwpAQCAtNDAyNCw3ICs0MDM2LDYgQEAKIAllcnIgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhkbiwgIm1hbmFnZWQiLCAmbWFuYWdlZCk7CiAJcHAtPnVzZV9pbmJhbmRfc3RhdHVzID0gKGVyciA9PSAwICYmCiAJCQkJIHN0cmNtcChtYW5hZ2VkLCAiaW4tYmFuZC1zdGF0dXMiKSA9PSAwKTsKLQlwcC0+Y3B1X25vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSBtdm5ldGFfcGVyY3B1X25vdGlmaWVyOwogCiAJcHAtPnJ4cV9kZWYgPSByeHFfZGVmOwogCkBAIC00MjI3LDcgKzQyMzgsNDIgQEAKIAl9LAogfTsKIAotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihtdm5ldGFfZHJpdmVyKTsKK3N0YXRpYyBpbnQgX19pbml0IG12bmV0YV9kcml2ZXJfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBjcHVocF9zZXR1cF9zdGF0ZV9tdWx0aShDUFVIUF9BUF9PTkxJTkVfRFlOLCAibmV0L212bWV0YTpvbmxpbmUiLAorCQkJCSAgICAgIG12bmV0YV9jcHVfb25saW5lLAorCQkJCSAgICAgIG12bmV0YV9jcHVfZG93bl9wcmVwYXJlKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJb25saW5lX2hwc3RhdGUgPSByZXQ7CisJcmV0ID0gY3B1aHBfc2V0dXBfc3RhdGVfbXVsdGkoQ1BVSFBfTkVUX01WTkVUQV9ERUFELCAibmV0L212bmV0YTpkZWFkIiwKKwkJCQkgICAgICBOVUxMLCBtdm5ldGFfY3B1X2RlYWQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2RlYWQ7CisKKwlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm12bmV0YV9kcml2ZXIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCXJldHVybiAwOworCitlcnI6CisJY3B1aHBfcmVtb3ZlX211bHRpX3N0YXRlKENQVUhQX05FVF9NVk5FVEFfREVBRCk7CitlcnJfZGVhZDoKKwljcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUob25saW5lX2hwc3RhdGUpOworb3V0OgorCXJldHVybiByZXQ7Cit9Cittb2R1bGVfaW5pdChtdm5ldGFfZHJpdmVyX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbXZuZXRhX2RyaXZlcl9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm12bmV0YV9kcml2ZXIpOworCWNwdWhwX3JlbW92ZV9tdWx0aV9zdGF0ZShDUFVIUF9ORVRfTVZORVRBX0RFQUQpOworCWNwdWhwX3JlbW92ZV9tdWx0aV9zdGF0ZShvbmxpbmVfaHBzdGF0ZSk7Cit9Cittb2R1bGVfZXhpdChtdm5ldGFfZHJpdmVyX2V4aXQpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIk1hcnZlbGwgTkVUQSBFdGhlcm5ldCBEcml2ZXIgLSB3d3cubWFydmVsbC5jb20iKTsKIE1PRFVMRV9BVVRIT1IoIlJhbWkgUm9zZW4gPHJvc2VuckBtYXJ2ZWxsLmNvbT4sIFRob21hcyBQZXRhenpvbmkgPHRob21hcy5wZXRhenpvbmlAZnJlZS1lbGVjdHJvbnMuY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9tdm5ldGFfYm0uaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvbXZuZXRhX2JtLmgKaW5kZXggZTc0ZmQ0NC4uYTMyZGU0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9tdm5ldGFfYm0uaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL212bmV0YV9ibS5oCkBAIC0xMzMsNyArMTMzLDcgQEAKIHZvaWQgKm12bmV0YV9mcmFnX2FsbG9jKHVuc2lnbmVkIGludCBmcmFnX3NpemUpOwogdm9pZCBtdm5ldGFfZnJhZ19mcmVlKHVuc2lnbmVkIGludCBmcmFnX3NpemUsIHZvaWQgKmRhdGEpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfTVZORVRBX0JNKSB8fCBkZWZpbmVkKENPTkZJR19NVk5FVEFfQk1fTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX01WTkVUQV9CTSkKIHZvaWQgbXZuZXRhX2JtX3Bvb2xfZGVzdHJveShzdHJ1Y3QgbXZuZXRhX2JtICpwcml2LAogCQkJICAgIHN0cnVjdCBtdm5ldGFfYm1fcG9vbCAqYm1fcG9vbCwgdTggcG9ydF9tYXApOwogdm9pZCBtdm5ldGFfYm1fYnVmc19mcmVlKHN0cnVjdCBtdm5ldGFfYm0gKnByaXYsIHN0cnVjdCBtdm5ldGFfYm1fcG9vbCAqYm1fcG9vbCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvc2t5Mi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9za3kyLmMKaW5kZXggNDY3MTM4Yi4uZjA1ZWE1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9za3kyLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9za3kyLmMKQEAgLTMwNzAsNyArMzA3MCw3IEBACiAJCQlnb3RvIGRvbmU7CiAJfQogCi0JbmFwaV9jb21wbGV0ZShuYXBpKTsKKwluYXBpX2NvbXBsZXRlX2RvbmUobmFwaSwgd29ya19kb25lKTsKIAlza3kyX3JlYWQzMihodywgQjBfWTJfU1BfTElTUik7CiBkb25lOgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWRpYXRlay9tdGtfZXRoX3NvYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVkaWF0ZWsvbXRrX2V0aF9zb2MuYwppbmRleCBiNTdhZTNhLi5hZDRhYjk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWRpYXRlay9tdGtfZXRoX3NvYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lZGlhdGVrL210a19ldGhfc29jLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tZmQvc3lzY29uLmg+CiAjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlIDxsaW51eC9yZXNldC5oPgogI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgpAQCAtNTAsNiArNTEsMTAgQEAKIAlNVEtfRVRIVE9PTF9TVEFUKHJ4X2Zsb3dfY29udHJvbF9wYWNrZXRzKSwKIH07CiAKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbXRrX2Nsa3Nfc291cmNlX25hbWVbXSA9IHsKKwkiZXRoaWYiLCAiZXN3IiwgImdwMSIsICJncDIiLCAidHJncGxsIgorfTsKKwogdm9pZCBtdGtfdzMyKHN0cnVjdCBtdGtfZXRoICpldGgsIHUzMiB2YWwsIHVuc2lnbmVkIHJlZykKIHsKIAlfX3Jhd193cml0ZWwodmFsLCBldGgtPmJhc2UgKyByZWcpOwpAQCAtMTMwLDYgKzEzNSwzMyBAQAogCXJldHVybiBfbXRrX21kaW9fcmVhZChldGgsIHBoeV9hZGRyLCBwaHlfcmVnKTsKIH0KIAorc3RhdGljIHZvaWQgbXRrX2dtYWMwX3JnbWlpX2FkanVzdChzdHJ1Y3QgbXRrX2V0aCAqZXRoLCBpbnQgc3BlZWQpCit7CisJdTMyIHZhbDsKKwlpbnQgcmV0OworCisJdmFsID0gKHNwZWVkID09IFNQRUVEXzEwMDApID8KKwkJSU5URl9NT0RFX1JHTUlJXzEwMDAgOiBJTlRGX01PREVfUkdNSUlfMTBfMTAwOworCW10a193MzIoZXRoLCB2YWwsIElOVEZfTU9ERSk7CisKKwlyZWdtYXBfdXBkYXRlX2JpdHMoZXRoLT5ldGhzeXMsIEVUSFNZU19DTEtDRkcwLAorCQkJICAgRVRIU1lTX1RSR01JSV9DTEtfU0VMMzYyXzUsCisJCQkgICBFVEhTWVNfVFJHTUlJX0NMS19TRUwzNjJfNSk7CisKKwl2YWwgPSAoc3BlZWQgPT0gU1BFRURfMTAwMCkgPyAyNTAwMDAwMDAgOiA1MDAwMDAwMDA7CisJcmV0ID0gY2xrX3NldF9yYXRlKGV0aC0+Y2xrc1tNVEtfQ0xLX1RSR1BMTF0sIHZhbCk7CisJaWYgKHJldCkKKwkJZGV2X2VycihldGgtPmRldiwgIkZhaWxlZCB0byBzZXQgdHJnbWlpIHBsbDogJWRcbiIsIHJldCk7CisKKwl2YWwgPSAoc3BlZWQgPT0gU1BFRURfMTAwMCkgPworCQlSQ0tfQ1RSTF9SR01JSV8xMDAwIDogUkNLX0NUUkxfUkdNSUlfMTBfMTAwOworCW10a193MzIoZXRoLCB2YWwsIFRSR01JSV9SQ0tfQ1RSTCk7CisKKwl2YWwgPSAoc3BlZWQgPT0gU1BFRURfMTAwMCkgPworCQlUQ0tfQ1RSTF9SR01JSV8xMDAwIDogVENLX0NUUkxfUkdNSUlfMTBfMTAwOworCW10a193MzIoZXRoLCB2YWwsIFRSR01JSV9UQ0tfQ1RSTCk7Cit9CisKIHN0YXRpYyB2b2lkIG10a19waHlfbGlua19hZGp1c3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbXRrX21hYyAqbWFjID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTE0MCw3ICsxNzIsMTAgQEAKIAkJICBNQUNfTUNSX1JYX0VOIHwgTUFDX01DUl9CQUNLT0ZGX0VOIHwKIAkJICBNQUNfTUNSX0JBQ0tQUl9FTjsKIAotCXN3aXRjaCAobWFjLT5waHlfZGV2LT5zcGVlZCkgeworCWlmICh1bmxpa2VseSh0ZXN0X2JpdChNVEtfUkVTRVRUSU5HLCAmbWFjLT5ody0+c3RhdGUpKSkKKwkJcmV0dXJuOworCisJc3dpdGNoIChkZXYtPnBoeWRldi0+c3BlZWQpIHsKIAljYXNlIFNQRUVEXzEwMDA6CiAJCW1jciB8PSBNQUNfTUNSX1NQRUVEXzEwMDA7CiAJCWJyZWFrOwpAQCAtMTQ5LDIwICsxODQsMjMgQEAKIAkJYnJlYWs7CiAJfTsKIAotCWlmIChtYWMtPnBoeV9kZXYtPmxpbmspCisJaWYgKG1hYy0+aWQgPT0gMCAmJiAhbWFjLT50cmdtaWkpCisJCW10a19nbWFjMF9yZ21paV9hZGp1c3QobWFjLT5odywgZGV2LT5waHlkZXYtPnNwZWVkKTsKKworCWlmIChkZXYtPnBoeWRldi0+bGluaykKIAkJbWNyIHw9IE1BQ19NQ1JfRk9SQ0VfTElOSzsKIAotCWlmIChtYWMtPnBoeV9kZXYtPmR1cGxleCkgeworCWlmIChkZXYtPnBoeWRldi0+ZHVwbGV4KSB7CiAJCW1jciB8PSBNQUNfTUNSX0ZPUkNFX0RQWDsKIAotCQlpZiAobWFjLT5waHlfZGV2LT5wYXVzZSkKKwkJaWYgKGRldi0+cGh5ZGV2LT5wYXVzZSkKIAkJCXJtdF9hZHYgPSBMUEFfUEFVU0VfQ0FQOwotCQlpZiAobWFjLT5waHlfZGV2LT5hc3ltX3BhdXNlKQorCQlpZiAoZGV2LT5waHlkZXYtPmFzeW1fcGF1c2UpCiAJCQlybXRfYWR2IHw9IExQQV9QQVVTRV9BU1lNOwogCi0JCWlmIChtYWMtPnBoeV9kZXYtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF9QYXVzZSkKKwkJaWYgKGRldi0+cGh5ZGV2LT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfUGF1c2UpCiAJCQlsY2xfYWR2IHw9IEFEVkVSVElTRV9QQVVTRV9DQVA7Ci0JCWlmIChtYWMtPnBoeV9kZXYtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF9Bc3ltX1BhdXNlKQorCQlpZiAoZGV2LT5waHlkZXYtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF9Bc3ltX1BhdXNlKQogCQkJbGNsX2FkdiB8PSBBRFZFUlRJU0VfUEFVU0VfQVNZTTsKIAogCQlmbG93Y3RybCA9IG1paV9yZXNvbHZlX2Zsb3djdHJsX2ZkeChsY2xfYWR2LCBybXRfYWR2KTsKQEAgLTE3OSw3ICsyMTcsNyBAQAogCiAJbXRrX3czMihtYWMtPmh3LCBtY3IsIE1US19NQUNfTUNSKG1hYy0+aWQpKTsKIAotCWlmIChtYWMtPnBoeV9kZXYtPmxpbmspCisJaWYgKGRldi0+cGh5ZGV2LT5saW5rKQogCQluZXRpZl9jYXJyaWVyX29uKGRldik7CiAJZWxzZQogCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOwpAQCAtMTg4LDE3ICsyMjYsOSBAQAogc3RhdGljIGludCBtdGtfcGh5X2Nvbm5lY3Rfbm9kZShzdHJ1Y3QgbXRrX2V0aCAqZXRoLCBzdHJ1Y3QgbXRrX21hYyAqbWFjLAogCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGh5X25vZGUpCiB7Ci0JY29uc3QgX19iZTMyICpfYWRkciA9IE5VTEw7CiAJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKLQlpbnQgcGh5X21vZGUsIGFkZHI7CisJaW50IHBoeV9tb2RlOwogCi0JX2FkZHIgPSBvZl9nZXRfcHJvcGVydHkocGh5X25vZGUsICJyZWciLCBOVUxMKTsKLQotCWlmICghX2FkZHIgfHwgKGJlMzJfdG9fY3B1KCpfYWRkcikgPj0gMHgyMCkpIHsKLQkJcHJfZXJyKCIlczogaW52YWxpZCBwaHkgYWRkcmVzc1xuIiwgcGh5X25vZGUtPm5hbWUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JYWRkciA9IGJlMzJfdG9fY3B1KCpfYWRkcik7CiAJcGh5X21vZGUgPSBvZl9nZXRfcGh5X21vZGUocGh5X25vZGUpOwogCWlmIChwaHlfbW9kZSA8IDApIHsKIAkJZGV2X2VycihldGgtPmRldiwgImluY29ycmVjdCBwaHktbW9kZSAlZFxuIiwgcGh5X21vZGUpOwpAQCAtMjE3LDE3ICsyNDcsMTcgQEAKIAkJIG1hYy0+aWQsIHBoeWRldl9uYW1lKHBoeWRldiksIHBoeWRldi0+cGh5X2lkLAogCQkgcGh5ZGV2LT5kcnYtPm5hbWUpOwogCi0JbWFjLT5waHlfZGV2ID0gcGh5ZGV2OwotCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbXRrX3BoeV9jb25uZWN0KHN0cnVjdCBtdGtfbWFjICptYWMpCitzdGF0aWMgaW50IG10a19waHlfY29ubmVjdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBtdGtfZXRoICpldGggPSBtYWMtPmh3OworCXN0cnVjdCBtdGtfbWFjICptYWMgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBtdGtfZXRoICpldGg7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKLQl1MzIgdmFsLCBnZV9tb2RlOworCXUzMiB2YWw7CiAKKwlldGggPSBtYWMtPmh3OwogCW5wID0gb2ZfcGFyc2VfcGhhbmRsZShtYWMtPm9mX25vZGUsICJwaHktaGFuZGxlIiwgMCk7CiAJaWYgKCFucCAmJiBvZl9waHlfaXNfZml4ZWRfbGluayhtYWMtPm9mX25vZGUpKQogCQlpZiAoIW9mX3BoeV9yZWdpc3Rlcl9maXhlZF9saW5rKG1hYy0+b2Zfbm9kZSkpCkBAIC0yMzYsNDYgKzI2Niw2NyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXN3aXRjaCAob2ZfZ2V0X3BoeV9tb2RlKG5wKSkgeworCWNhc2UgUEhZX0lOVEVSRkFDRV9NT0RFX1RSR01JSToKKwkJbWFjLT50cmdtaWkgPSB0cnVlOwogCWNhc2UgUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJX1RYSUQ6CiAJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUlfUlhJRDoKIAljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSV9JRDoKIAljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSToKLQkJZ2VfbW9kZSA9IDA7CisJCW1hYy0+Z2VfbW9kZSA9IDA7CiAJCWJyZWFrOwogCWNhc2UgUEhZX0lOVEVSRkFDRV9NT0RFX01JSToKLQkJZ2VfbW9kZSA9IDE7CisJCW1hYy0+Z2VfbW9kZSA9IDE7CisJCWJyZWFrOworCWNhc2UgUEhZX0lOVEVSRkFDRV9NT0RFX1JFVk1JSToKKwkJbWFjLT5nZV9tb2RlID0gMjsKIAkJYnJlYWs7CiAJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfUk1JSToKLQkJZ2VfbW9kZSA9IDI7CisJCWlmICghbWFjLT5pZCkKKwkJCWdvdG8gZXJyX3BoeTsKKwkJbWFjLT5nZV9tb2RlID0gMzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2VycihldGgtPmRldiwgImludmFsaWQgcGh5X21vZGVcbiIpOwotCQlyZXR1cm4gLTE7CisJCWdvdG8gZXJyX3BoeTsKIAl9CiAKIAkvKiBwdXQgdGhlIGdtYWMgaW50byB0aGUgcmlnaHQgbW9kZSAqLwogCXJlZ21hcF9yZWFkKGV0aC0+ZXRoc3lzLCBFVEhTWVNfU1lTQ0ZHMCwgJnZhbCk7CiAJdmFsICY9IH5TWVNDRkcwX0dFX01PREUoU1lTQ0ZHMF9HRV9NQVNLLCBtYWMtPmlkKTsKLQl2YWwgfD0gU1lTQ0ZHMF9HRV9NT0RFKGdlX21vZGUsIG1hYy0+aWQpOworCXZhbCB8PSBTWVNDRkcwX0dFX01PREUobWFjLT5nZV9tb2RlLCBtYWMtPmlkKTsKIAlyZWdtYXBfd3JpdGUoZXRoLT5ldGhzeXMsIEVUSFNZU19TWVNDRkcwLCB2YWwpOwogCi0JbXRrX3BoeV9jb25uZWN0X25vZGUoZXRoLCBtYWMsIG5wKTsKLQltYWMtPnBoeV9kZXYtPmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKLQltYWMtPnBoeV9kZXYtPnNwZWVkID0gMDsKLQltYWMtPnBoeV9kZXYtPmR1cGxleCA9IDA7Ci0JbWFjLT5waHlfZGV2LT5zdXBwb3J0ZWQgJj0gUEhZX0dCSVRfRkVBVFVSRVMgfCBTVVBQT1JURURfUGF1c2UgfAorCS8qIGNvdXBsZSBwaHlkZXYgdG8gbmV0X2RldmljZSAqLworCWlmIChtdGtfcGh5X2Nvbm5lY3Rfbm9kZShldGgsIG1hYywgbnApKQorCQlnb3RvIGVycl9waHk7CisKKwlkZXYtPnBoeWRldi0+YXV0b25lZyA9IEFVVE9ORUdfRU5BQkxFOworCWRldi0+cGh5ZGV2LT5zcGVlZCA9IDA7CisJZGV2LT5waHlkZXYtPmR1cGxleCA9IDA7CisKKwlpZiAob2ZfcGh5X2lzX2ZpeGVkX2xpbmsobWFjLT5vZl9ub2RlKSkKKwkJZGV2LT5waHlkZXYtPnN1cHBvcnRlZCB8PQorCQlTVVBQT1JURURfUGF1c2UgfCBTVVBQT1JURURfQXN5bV9QYXVzZTsKKworCWRldi0+cGh5ZGV2LT5zdXBwb3J0ZWQgJj0gUEhZX0dCSVRfRkVBVFVSRVMgfCBTVVBQT1JURURfUGF1c2UgfAogCQkJCSAgIFNVUFBPUlRFRF9Bc3ltX1BhdXNlOwotCW1hYy0+cGh5X2Rldi0+YWR2ZXJ0aXNpbmcgPSBtYWMtPnBoeV9kZXYtPnN1cHBvcnRlZCB8CisJZGV2LT5waHlkZXYtPmFkdmVydGlzaW5nID0gZGV2LT5waHlkZXYtPnN1cHBvcnRlZCB8CiAJCQkJICAgIEFEVkVSVElTRURfQXV0b25lZzsKLQlwaHlfc3RhcnRfYW5lZyhtYWMtPnBoeV9kZXYpOworCXBoeV9zdGFydF9hbmVnKGRldi0+cGh5ZGV2KTsKKworCW9mX25vZGVfcHV0KG5wKTsKIAogCXJldHVybiAwOworCitlcnJfcGh5OgorCW9mX25vZGVfcHV0KG5wKTsKKwlkZXZfZXJyKGV0aC0+ZGV2LCAiJXM6IGludmFsaWQgcGh5XG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIC1FSU5WQUw7CiB9CiAKIHN0YXRpYyBpbnQgbXRrX21kaW9faW5pdChzdHJ1Y3QgbXRrX2V0aCAqZXRoKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbWlpX25wOwotCWludCBlcnI7CisJaW50IHJldDsKIAogCW1paV9ucCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKGV0aC0+ZGV2LT5vZl9ub2RlLCAibWRpby1idXMiKTsKIAlpZiAoIW1paV9ucCkgewpAQCAtMjg0LDEzICszMzUsMTMgQEAKIAl9CiAKIAlpZiAoIW9mX2RldmljZV9pc19hdmFpbGFibGUobWlpX25wKSkgewotCQllcnIgPSAwOworCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIGVycl9wdXRfbm9kZTsKIAl9CiAKLQlldGgtPm1paV9idXMgPSBtZGlvYnVzX2FsbG9jKCk7CisJZXRoLT5taWlfYnVzID0gZGV2bV9tZGlvYnVzX2FsbG9jKGV0aC0+ZGV2KTsKIAlpZiAoIWV0aC0+bWlpX2J1cykgewotCQllcnIgPSAtRU5PTUVNOworCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9wdXRfbm9kZTsKIAl9CiAKQEAgLTMwMSwxOSArMzUyLDExIEBACiAJZXRoLT5taWlfYnVzLT5wYXJlbnQgPSBldGgtPmRldjsKIAogCXNucHJpbnRmKGV0aC0+bWlpX2J1cy0+aWQsIE1JSV9CVVNfSURfU0laRSwgIiVzIiwgbWlpX25wLT5uYW1lKTsKLQllcnIgPSBvZl9tZGlvYnVzX3JlZ2lzdGVyKGV0aC0+bWlpX2J1cywgbWlpX25wKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9mcmVlX2J1czsKLQotCXJldHVybiAwOwotCi1lcnJfZnJlZV9idXM6Ci0JbWRpb2J1c19mcmVlKGV0aC0+bWlpX2J1cyk7CisJcmV0ID0gb2ZfbWRpb2J1c19yZWdpc3RlcihldGgtPm1paV9idXMsIG1paV9ucCk7CiAKIGVycl9wdXRfbm9kZToKIAlvZl9ub2RlX3B1dChtaWlfbnApOwotCWV0aC0+bWlpX2J1cyA9IE5VTEw7Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBtdGtfbWRpb19jbGVhbnVwKHN0cnVjdCBtdGtfZXRoICpldGgpCkBAIC0zMjIsMjkgKzM2NSwyOSBAQAogCQlyZXR1cm47CiAKIAltZGlvYnVzX3VucmVnaXN0ZXIoZXRoLT5taWlfYnVzKTsKLQlvZl9ub2RlX3B1dChldGgtPm1paV9idXMtPmRldi5vZl9ub2RlKTsKLQltZGlvYnVzX2ZyZWUoZXRoLT5taWlfYnVzKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIG10a19pcnFfZGlzYWJsZShzdHJ1Y3QgbXRrX2V0aCAqZXRoLCB1MzIgbWFzaykKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdGtfaXJxX2Rpc2FibGUoc3RydWN0IG10a19ldGggKmV0aCwKKwkJCQkgICB1bnNpZ25lZCByZWcsIHUzMiBtYXNrKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTMyIHZhbDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZldGgtPmlycV9sb2NrLCBmbGFncyk7Ci0JdmFsID0gbXRrX3IzMihldGgsIE1US19RRE1BX0lOVF9NQVNLKTsKLQltdGtfdzMyKGV0aCwgdmFsICYgfm1hc2ssIE1US19RRE1BX0lOVF9NQVNLKTsKKwl2YWwgPSBtdGtfcjMyKGV0aCwgcmVnKTsKKwltdGtfdzMyKGV0aCwgdmFsICYgfm1hc2ssIHJlZyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRoLT5pcnFfbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbXRrX2lycV9lbmFibGUoc3RydWN0IG10a19ldGggKmV0aCwgdTMyIG1hc2spCitzdGF0aWMgaW5saW5lIHZvaWQgbXRrX2lycV9lbmFibGUoc3RydWN0IG10a19ldGggKmV0aCwKKwkJCQkgIHVuc2lnbmVkIHJlZywgdTMyIG1hc2spCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgdmFsOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmV0aC0+aXJxX2xvY2ssIGZsYWdzKTsKLQl2YWwgPSBtdGtfcjMyKGV0aCwgTVRLX1FETUFfSU5UX01BU0spOwotCW10a193MzIoZXRoLCB2YWwgfCBtYXNrLCBNVEtfUURNQV9JTlRfTUFTSyk7CisJdmFsID0gbXRrX3IzMihldGgsIHJlZyk7CisJbXRrX3czMihldGgsIHZhbCB8IG1hc2ssIHJlZyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRoLT5pcnFfbG9jaywgZmxhZ3MpOwogfQogCkBAIC0zNTMsMTggKzM5NiwyMCBAQAogCWludCByZXQgPSBldGhfbWFjX2FkZHIoZGV2LCBwKTsKIAlzdHJ1Y3QgbXRrX21hYyAqbWFjID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAljb25zdCBjaGFyICptYWNhZGRyID0gZGV2LT5kZXZfYWRkcjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtYWMtPmh3LT5wYWdlX2xvY2ssIGZsYWdzKTsKKwlpZiAodW5saWtlbHkodGVzdF9iaXQoTVRLX1JFU0VUVElORywgJm1hYy0+aHctPnN0YXRlKSkpCisJCXJldHVybiAtRUJVU1k7CisKKwlzcGluX2xvY2tfYmgoJm1hYy0+aHctPnBhZ2VfbG9jayk7CiAJbXRrX3czMihtYWMtPmh3LCAobWFjYWRkclswXSA8PCA4KSB8IG1hY2FkZHJbMV0sCiAJCU1US19HRE1BX01BQ19BRFJIKG1hYy0+aWQpKTsKIAltdGtfdzMyKG1hYy0+aHcsIChtYWNhZGRyWzJdIDw8IDI0KSB8IChtYWNhZGRyWzNdIDw8IDE2KSB8CiAJCShtYWNhZGRyWzRdIDw8IDgpIHwgbWFjYWRkcls1XSwKIAkJTVRLX0dETUFfTUFDX0FEUkwobWFjLT5pZCkpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hYy0+aHctPnBhZ2VfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2JoKCZtYWMtPmh3LT5wYWdlX2xvY2spOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01NDIsMTUgKzU4NywxNSBAQAogCXJldHVybiAmcmluZy0+YnVmW2lkeF07CiB9CiAKLXN0YXRpYyB2b2lkIG10a190eF91bm1hcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBtdGtfdHhfYnVmICp0eF9idWYpCitzdGF0aWMgdm9pZCBtdGtfdHhfdW5tYXAoc3RydWN0IG10a19ldGggKmV0aCwgc3RydWN0IG10a190eF9idWYgKnR4X2J1ZikKIHsKIAlpZiAodHhfYnVmLT5mbGFncyAmIE1US19UWF9GTEFHU19TSU5HTEUwKSB7Ci0JCWRtYV91bm1hcF9zaW5nbGUoZGV2LAorCQlkbWFfdW5tYXBfc2luZ2xlKGV0aC0+ZGV2LAogCQkJCSBkbWFfdW5tYXBfYWRkcih0eF9idWYsIGRtYV9hZGRyMCksCiAJCQkJIGRtYV91bm1hcF9sZW4odHhfYnVmLCBkbWFfbGVuMCksCiAJCQkJIERNQV9UT19ERVZJQ0UpOwogCX0gZWxzZSBpZiAodHhfYnVmLT5mbGFncyAmIE1US19UWF9GTEFHU19QQUdFMCkgewotCQlkbWFfdW5tYXBfcGFnZShkZXYsCisJCWRtYV91bm1hcF9wYWdlKGV0aC0+ZGV2LAogCQkJICAgICAgIGRtYV91bm1hcF9hZGRyKHR4X2J1ZiwgZG1hX2FkZHIwKSwKIAkJCSAgICAgICBkbWFfdW5tYXBfbGVuKHR4X2J1ZiwgZG1hX2xlbjApLAogCQkJICAgICAgIERNQV9UT19ERVZJQ0UpOwpAQCAtNTcyLDE0ICs2MTcsMTUgQEAKIAlkbWFfYWRkcl90IG1hcHBlZF9hZGRyOwogCXVuc2lnbmVkIGludCBucl9mcmFnczsKIAlpbnQgaSwgbl9kZXNjID0gMTsKLQl1MzIgdHhkNCA9IDA7CisJdTMyIHR4ZDQgPSAwLCBmcG9ydDsKIAogCWl0eGQgPSByaW5nLT5uZXh0X2ZyZWU7CiAJaWYgKGl0eGQgPT0gcmluZy0+bGFzdF9mcmVlKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qIHNldCB0aGUgZm9yd2FyZCBwb3J0ICovCi0JdHhkNCB8PSAobWFjLT5pZCArIDEpIDw8IFRYX0RNQV9GUE9SVF9TSElGVDsKKwlmcG9ydCA9IChtYWMtPmlkICsgMSkgPDwgVFhfRE1BX0ZQT1JUX1NISUZUOworCXR4ZDQgfD0gZnBvcnQ7CiAKIAl0eF9idWYgPSBtdGtfZGVzY190b190eF9idWYocmluZywgaXR4ZCk7CiAJbWVtc2V0KHR4X2J1ZiwgMCwgc2l6ZW9mKCp0eF9idWYpKTsKQEAgLTU5NSw5ICs2NDEsOSBAQAogCWlmIChza2Jfdmxhbl90YWdfcHJlc2VudChza2IpKQogCQl0eGQ0IHw9IFRYX0RNQV9JTlNfVkxBTiB8IHNrYl92bGFuX3RhZ19nZXQoc2tiKTsKIAotCW1hcHBlZF9hZGRyID0gZG1hX21hcF9zaW5nbGUoJmRldi0+ZGV2LCBza2ItPmRhdGEsCisJbWFwcGVkX2FkZHIgPSBkbWFfbWFwX3NpbmdsZShldGgtPmRldiwgc2tiLT5kYXRhLAogCQkJCSAgICAgc2tiX2hlYWRsZW4oc2tiKSwgRE1BX1RPX0RFVklDRSk7Ci0JaWYgKHVubGlrZWx5KGRtYV9tYXBwaW5nX2Vycm9yKCZkZXYtPmRldiwgbWFwcGVkX2FkZHIpKSkKKwlpZiAodW5saWtlbHkoZG1hX21hcHBpbmdfZXJyb3IoZXRoLT5kZXYsIG1hcHBlZF9hZGRyKSkpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJV1JJVEVfT05DRShpdHhkLT50eGQxLCBtYXBwZWRfYWRkcik7CkBAIC02MjMsMTAgKzY2OSwxMCBAQAogCiAJCQluX2Rlc2MrKzsKIAkJCWZyYWdfbWFwX3NpemUgPSBtaW4oZnJhZ19zaXplLCBNVEtfVFhfRE1BX0JVRl9MRU4pOwotCQkJbWFwcGVkX2FkZHIgPSBza2JfZnJhZ19kbWFfbWFwKCZkZXYtPmRldiwgZnJhZywgb2Zmc2V0LAorCQkJbWFwcGVkX2FkZHIgPSBza2JfZnJhZ19kbWFfbWFwKGV0aC0+ZGV2LCBmcmFnLCBvZmZzZXQsCiAJCQkJCQkgICAgICAgZnJhZ19tYXBfc2l6ZSwKIAkJCQkJCSAgICAgICBETUFfVE9fREVWSUNFKTsKLQkJCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcigmZGV2LT5kZXYsIG1hcHBlZF9hZGRyKSkpCisJCQlpZiAodW5saWtlbHkoZG1hX21hcHBpbmdfZXJyb3IoZXRoLT5kZXYsIG1hcHBlZF9hZGRyKSkpCiAJCQkJZ290byBlcnJfZG1hOwogCiAJCQlpZiAoaSA9PSBucl9mcmFncyAtIDEgJiYKQEAgLTYzNyw3ICs2ODMsNyBAQAogCQkJV1JJVEVfT05DRSh0eGQtPnR4ZDMsIChUWF9ETUFfU1dDIHwKIAkJCQkJICAgICAgIFRYX0RNQV9QTEVOMChmcmFnX21hcF9zaXplKSB8CiAJCQkJCSAgICAgICBsYXN0X2ZyYWcgKiBUWF9ETUFfTFMwKSk7Ci0JCQlXUklURV9PTkNFKHR4ZC0+dHhkNCwgMCk7CisJCQlXUklURV9PTkNFKHR4ZC0+dHhkNCwgZnBvcnQpOwogCiAJCQl0eF9idWYtPnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKU1US19ETUFfRFVNTVlfREVTQzsKIAkJCXR4X2J1ZiA9IG10a19kZXNjX3RvX3R4X2J1ZihyaW5nLCB0eGQpOwpAQCAtNjc5LDcgKzcyNSw3IEBACiAJCXR4X2J1ZiA9IG10a19kZXNjX3RvX3R4X2J1ZihyaW5nLCBpdHhkKTsKIAogCQkvKiB1bm1hcCBkbWEgKi8KLQkJbXRrX3R4X3VubWFwKCZkZXYtPmRldiwgdHhfYnVmKTsKKwkJbXRrX3R4X3VubWFwKGV0aCwgdHhfYnVmKTsKIAogCQlpdHhkLT50eGQzID0gVFhfRE1BX0xTMCB8IFRYX0RNQV9PV05FUl9DUFU7CiAJCWl0eGQgPSBtdGtfcWRtYV9waHlzX3RvX3ZpcnQocmluZywgaXR4ZC0+dHhkMik7CkBAIC03NDgsNyArNzk0LDYgQEAKIAlzdHJ1Y3QgbXRrX2V0aCAqZXRoID0gbWFjLT5odzsKIAlzdHJ1Y3QgbXRrX3R4X3JpbmcgKnJpbmcgPSAmZXRoLT50eF9yaW5nOwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZkZXYtPnN0YXRzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJYm9vbCBnc28gPSBmYWxzZTsKIAlpbnQgdHhfbnVtOwogCkBAIC03NTYsMTQgKzgwMSwxNyBAQAogCSAqIGhvd2V2ZXIgd2UgaGF2ZSAyIHF1ZXVlcyBydW5uaW5nIG9uIHRoZSBzYW1lIHJpbmcgc28gd2UgbmVlZCB0byBsb2NrCiAJICogdGhlIHJpbmcgYWNjZXNzCiAJICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmV0aC0+cGFnZV9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrKCZldGgtPnBhZ2VfbG9jayk7CisKKwlpZiAodW5saWtlbHkodGVzdF9iaXQoTVRLX1JFU0VUVElORywgJmV0aC0+c3RhdGUpKSkKKwkJZ290byBkcm9wOwogCiAJdHhfbnVtID0gbXRrX2NhbF90eGRfcmVxKHNrYik7CiAJaWYgKHVubGlrZWx5KGF0b21pY19yZWFkKCZyaW5nLT5mcmVlX2NvdW50KSA8PSB0eF9udW0pKSB7CiAJCW10a19zdG9wX3F1ZXVlKGV0aCk7CiAJCW5ldGlmX2VycihldGgsIHR4X3F1ZXVlZCwgZGV2LAogCQkJICAiVHggUmluZyBmdWxsIHdoZW4gcXVldWUgYXdha2UhXG4iKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRoLT5wYWdlX2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2soJmV0aC0+cGFnZV9sb2NrKTsKIAkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwogCX0KIApAQCAtNzg4LDIyICs4MzYsNjIgQEAKIAlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJnJpbmctPmZyZWVfY291bnQpIDw9IHJpbmctPnRocmVzaCkpCiAJCW10a19zdG9wX3F1ZXVlKGV0aCk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGgtPnBhZ2VfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrKCZldGgtPnBhZ2VfbG9jayk7CiAKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogCiBkcm9wOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0aC0+cGFnZV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2soJmV0aC0+cGFnZV9sb2NrKTsKIAlzdGF0cy0+dHhfZHJvcHBlZCsrOwogCWRldl9rZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogfQogCitzdGF0aWMgc3RydWN0IG10a19yeF9yaW5nICptdGtfZ2V0X3J4X3Jpbmcoc3RydWN0IG10a19ldGggKmV0aCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbXRrX3J4X3JpbmcgKnJpbmc7CisJaW50IGlkeDsKKworCWlmICghZXRoLT5od2xybykKKwkJcmV0dXJuICZldGgtPnJ4X3JpbmdbMF07CisKKwlmb3IgKGkgPSAwOyBpIDwgTVRLX01BWF9SWF9SSU5HX05VTTsgaSsrKSB7CisJCXJpbmcgPSAmZXRoLT5yeF9yaW5nW2ldOworCQlpZHggPSBORVhUX1JYX0RFU1BfSURYKHJpbmctPmNhbGNfaWR4LCByaW5nLT5kbWFfc2l6ZSk7CisJCWlmIChyaW5nLT5kbWFbaWR4XS5yeGQyICYgUlhfRE1BX0RPTkUpIHsKKwkJCXJpbmctPmNhbGNfaWR4X3VwZGF0ZSA9IHRydWU7CisJCQlyZXR1cm4gcmluZzsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBtdGtfdXBkYXRlX3J4X2NwdV9pZHgoc3RydWN0IG10a19ldGggKmV0aCkKK3sKKwlzdHJ1Y3QgbXRrX3J4X3JpbmcgKnJpbmc7CisJaW50IGk7CisKKwlpZiAoIWV0aC0+aHdscm8pIHsKKwkJcmluZyA9ICZldGgtPnJ4X3JpbmdbMF07CisJCW10a193MzIoZXRoLCByaW5nLT5jYWxjX2lkeCwgcmluZy0+Y3J4X2lkeF9yZWcpOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBNVEtfTUFYX1JYX1JJTkdfTlVNOyBpKyspIHsKKwkJCXJpbmcgPSAmZXRoLT5yeF9yaW5nW2ldOworCQkJaWYgKHJpbmctPmNhbGNfaWR4X3VwZGF0ZSkgeworCQkJCXJpbmctPmNhbGNfaWR4X3VwZGF0ZSA9IGZhbHNlOworCQkJCW10a193MzIoZXRoLCByaW5nLT5jYWxjX2lkeCwgcmluZy0+Y3J4X2lkeF9yZWcpOworCQkJfQorCQl9CisJfQorfQorCiBzdGF0aWMgaW50IG10a19wb2xsX3J4KHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCwKIAkJICAgICAgIHN0cnVjdCBtdGtfZXRoICpldGgpCiB7Ci0Jc3RydWN0IG10a19yeF9yaW5nICpyaW5nID0gJmV0aC0+cnhfcmluZzsKLQlpbnQgaWR4ID0gcmluZy0+Y2FsY19pZHg7CisJc3RydWN0IG10a19yeF9yaW5nICpyaW5nOworCWludCBpZHg7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1OCAqZGF0YSwgKm5ld19kYXRhOwogCXN0cnVjdCBtdGtfcnhfZG1hICpyeGQsIHRyeGQ7CkBAIC04MTUsNyArOTAzLDExIEBACiAJCWRtYV9hZGRyX3QgZG1hX2FkZHI7CiAJCWludCBtYWMgPSAwOwogCi0JCWlkeCA9IE5FWFRfUlhfREVTUF9JRFgoaWR4KTsKKwkJcmluZyA9IG10a19nZXRfcnhfcmluZyhldGgpOworCQlpZiAodW5saWtlbHkoIXJpbmcpKQorCQkJZ290byByeF9kb25lOworCisJCWlkeCA9IE5FWFRfUlhfREVTUF9JRFgocmluZy0+Y2FsY19pZHgsIHJpbmctPmRtYV9zaXplKTsKIAkJcnhkID0gJnJpbmctPmRtYVtpZHhdOwogCQlkYXRhID0gcmluZy0+ZGF0YVtpZHhdOwogCkBAIC04MzAsMTcgKzkyMiwyMCBAQAogCiAJCW5ldGRldiA9IGV0aC0+bmV0ZGV2W21hY107CiAKKwkJaWYgKHVubGlrZWx5KHRlc3RfYml0KE1US19SRVNFVFRJTkcsICZldGgtPnN0YXRlKSkpCisJCQlnb3RvIHJlbGVhc2VfZGVzYzsKKwogCQkvKiBhbGxvYyBuZXcgYnVmZmVyICovCiAJCW5ld19kYXRhID0gbmFwaV9hbGxvY19mcmFnKHJpbmctPmZyYWdfc2l6ZSk7CiAJCWlmICh1bmxpa2VseSghbmV3X2RhdGEpKSB7CiAJCQluZXRkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCWdvdG8gcmVsZWFzZV9kZXNjOwogCQl9Ci0JCWRtYV9hZGRyID0gZG1hX21hcF9zaW5nbGUoJmV0aC0+bmV0ZGV2W21hY10tPmRldiwKKwkJZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZShldGgtPmRldiwKIAkJCQkJICBuZXdfZGF0YSArIE5FVF9TS0JfUEFELAogCQkJCQkgIHJpbmctPmJ1Zl9zaXplLAogCQkJCQkgIERNQV9GUk9NX0RFVklDRSk7Ci0JCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcigmbmV0ZGV2LT5kZXYsIGRtYV9hZGRyKSkpIHsKKwkJaWYgKHVubGlrZWx5KGRtYV9tYXBwaW5nX2Vycm9yKGV0aC0+ZGV2LCBkbWFfYWRkcikpKSB7CiAJCQlza2JfZnJlZV9mcmFnKG5ld19kYXRhKTsKIAkJCW5ldGRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQkJZ290byByZWxlYXNlX2Rlc2M7CkBAIC04NDksMTMgKzk0NCwxMyBAQAogCQkvKiByZWNlaXZlIGRhdGEgKi8KIAkJc2tiID0gYnVpbGRfc2tiKGRhdGEsIHJpbmctPmZyYWdfc2l6ZSk7CiAJCWlmICh1bmxpa2VseSghc2tiKSkgewotCQkJcHV0X3BhZ2UodmlydF90b19oZWFkX3BhZ2UobmV3X2RhdGEpKTsKKwkJCXNrYl9mcmVlX2ZyYWcobmV3X2RhdGEpOwogCQkJbmV0ZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQlnb3RvIHJlbGVhc2VfZGVzYzsKIAkJfQogCQlza2JfcmVzZXJ2ZShza2IsIE5FVF9TS0JfUEFEICsgTkVUX0lQX0FMSUdOKTsKIAotCQlkbWFfdW5tYXBfc2luZ2xlKCZuZXRkZXYtPmRldiwgdHJ4ZC5yeGQxLAorCQlkbWFfdW5tYXBfc2luZ2xlKGV0aC0+ZGV2LCB0cnhkLnJ4ZDEsCiAJCQkJIHJpbmctPmJ1Zl9zaXplLCBETUFfRlJPTV9ERVZJQ0UpOwogCQlwa3RsZW4gPSBSWF9ETUFfR0VUX1BMRU4wKHRyeGQucnhkMik7CiAJCXNrYi0+ZGV2ID0gbmV0ZGV2OwpAQCAtODc5LDE3ICs5NzQsMTkgQEAKIAkJcnhkLT5yeGQyID0gUlhfRE1BX1BMRU4wKHJpbmctPmJ1Zl9zaXplKTsKIAogCQlyaW5nLT5jYWxjX2lkeCA9IGlkeDsKKworCQlkb25lKys7CisJfQorCityeF9kb25lOgorCWlmIChkb25lKSB7CiAJCS8qIG1ha2Ugc3VyZSB0aGF0IGFsbCBjaGFuZ2VzIHRvIHRoZSBkbWEgcmluZyBhcmUgZmx1c2hlZCBiZWZvcmUKIAkJICogd2UgY29udGludWUKIAkJICovCiAJCXdtYigpOwotCQltdGtfdzMyKGV0aCwgcmluZy0+Y2FsY19pZHgsIE1US19RUlhfQ1JYX0lEWDApOwotCQlkb25lKys7CisJCW10a191cGRhdGVfcnhfY3B1X2lkeChldGgpOwogCX0KIAotCWlmIChkb25lIDwgYnVkZ2V0KQotCQltdGtfdzMyKGV0aCwgTVRLX1JYX0RPTkVfSU5ULCBNVEtfUU1US19JTlRfU1RBVFVTKTsKLQogCXJldHVybiBkb25lOwogfQogCkBAIC05MzcsNyArMTAzNCw3IEBACiAJCQlkb25lW21hY10rKzsKIAkJCWJ1ZGdldC0tOwogCQl9Ci0JCW10a190eF91bm1hcChldGgtPmRldiwgdHhfYnVmKTsKKwkJbXRrX3R4X3VubWFwKGV0aCwgdHhfYnVmKTsKIAogCQlyaW5nLT5sYXN0X2ZyZWUgPSBkZXNjOwogCQlhdG9taWNfaW5jKCZyaW5nLT5mcmVlX2NvdW50KTsKQEAgLTk5OCw3ICsxMDk1LDcgQEAKIAkJcmV0dXJuIGJ1ZGdldDsKIAogCW5hcGlfY29tcGxldGUobmFwaSk7Ci0JbXRrX2lycV9lbmFibGUoZXRoLCBNVEtfVFhfRE9ORV9JTlQpOworCW10a19pcnFfZW5hYmxlKGV0aCwgTVRLX1FETUFfSU5UX01BU0ssIE1US19UWF9ET05FX0lOVCk7CiAKIAlyZXR1cm4gdHhfZG9uZTsKIH0KQEAgLTEwMDgsMzAgKzExMDUsMzMgQEAKIAlzdHJ1Y3QgbXRrX2V0aCAqZXRoID0gY29udGFpbmVyX29mKG5hcGksIHN0cnVjdCBtdGtfZXRoLCByeF9uYXBpKTsKIAl1MzIgc3RhdHVzLCBtYXNrOwogCWludCByeF9kb25lID0gMDsKKwlpbnQgcmVtYWluX2J1ZGdldCA9IGJ1ZGdldDsKIAogCW10a19oYW5kbGVfc3RhdHVzX2lycShldGgpOwotCW10a193MzIoZXRoLCBNVEtfUlhfRE9ORV9JTlQsIE1US19RTVRLX0lOVF9TVEFUVVMpOwotCXJ4X2RvbmUgPSBtdGtfcG9sbF9yeChuYXBpLCBidWRnZXQsIGV0aCk7CisKK3BvbGxfYWdhaW46CisJbXRrX3czMihldGgsIE1US19SWF9ET05FX0lOVCwgTVRLX1BETUFfSU5UX1NUQVRVUyk7CisJcnhfZG9uZSA9IG10a19wb2xsX3J4KG5hcGksIHJlbWFpbl9idWRnZXQsIGV0aCk7CiAKIAlpZiAodW5saWtlbHkobmV0aWZfbXNnX2ludHIoZXRoKSkpIHsKLQkJc3RhdHVzID0gbXRrX3IzMihldGgsIE1US19RTVRLX0lOVF9TVEFUVVMpOwotCQltYXNrID0gbXRrX3IzMihldGgsIE1US19RRE1BX0lOVF9NQVNLKTsKKwkJc3RhdHVzID0gbXRrX3IzMihldGgsIE1US19QRE1BX0lOVF9TVEFUVVMpOworCQltYXNrID0gbXRrX3IzMihldGgsIE1US19QRE1BX0lOVF9NQVNLKTsKIAkJZGV2X2luZm8oZXRoLT5kZXYsCiAJCQkgImRvbmUgcnggJWQsIGludHIgMHglMDh4LzB4JXhcbiIsCiAJCQkgcnhfZG9uZSwgc3RhdHVzLCBtYXNrKTsKIAl9Ci0KLQlpZiAocnhfZG9uZSA9PSBidWRnZXQpCisJaWYgKHJ4X2RvbmUgPT0gcmVtYWluX2J1ZGdldCkKIAkJcmV0dXJuIGJ1ZGdldDsKIAotCXN0YXR1cyA9IG10a19yMzIoZXRoLCBNVEtfUU1US19JTlRfU1RBVFVTKTsKLQlpZiAoc3RhdHVzICYgTVRLX1JYX0RPTkVfSU5UKQotCQlyZXR1cm4gYnVkZ2V0OwotCisJc3RhdHVzID0gbXRrX3IzMihldGgsIE1US19QRE1BX0lOVF9TVEFUVVMpOworCWlmIChzdGF0dXMgJiBNVEtfUlhfRE9ORV9JTlQpIHsKKwkJcmVtYWluX2J1ZGdldCAtPSByeF9kb25lOworCQlnb3RvIHBvbGxfYWdhaW47CisJfQogCW5hcGlfY29tcGxldGUobmFwaSk7Ci0JbXRrX2lycV9lbmFibGUoZXRoLCBNVEtfUlhfRE9ORV9JTlQpOworCW10a19pcnFfZW5hYmxlKGV0aCwgTVRLX1BETUFfSU5UX01BU0ssIE1US19SWF9ET05FX0lOVCk7CiAKLQlyZXR1cm4gcnhfZG9uZTsKKwlyZXR1cm4gcnhfZG9uZSArIGJ1ZGdldCAtIHJlbWFpbl9idWRnZXQ7CiB9CiAKIHN0YXRpYyBpbnQgbXRrX3R4X2FsbG9jKHN0cnVjdCBtdGtfZXRoICpldGgpCkBAIC0xMDc4LDYgKzExNzgsNyBAQAogCW10a193MzIoZXRoLAogCQlyaW5nLT5waHlzICsgKChNVEtfRE1BX1NJWkUgLSAxKSAqIHN6KSwKIAkJTVRLX1FUWF9EUlhfUFRSKTsKKwltdGtfdzMyKGV0aCwgKFFETUFfUkVTX1RIUkVTIDw8IDgpIHwgUURNQV9SRVNfVEhSRVMsIE1US19RVFhfQ0ZHKDApKTsKIAogCXJldHVybiAwOwogCkBAIC0xMDkyLDcgKzExOTMsNyBAQAogCiAJaWYgKHJpbmctPmJ1ZikgewogCQlmb3IgKGkgPSAwOyBpIDwgTVRLX0RNQV9TSVpFOyBpKyspCi0JCQltdGtfdHhfdW5tYXAoZXRoLT5kZXYsICZyaW5nLT5idWZbaV0pOworCQkJbXRrX3R4X3VubWFwKGV0aCwgJnJpbmctPmJ1ZltpXSk7CiAJCWtmcmVlKHJpbmctPmJ1Zik7CiAJCXJpbmctPmJ1ZiA9IE5VTEw7CiAJfQpAQCAtMTEwNiwzMiArMTIwNyw0MSBAQAogCX0KIH0KIAotc3RhdGljIGludCBtdGtfcnhfYWxsb2Moc3RydWN0IG10a19ldGggKmV0aCkKK3N0YXRpYyBpbnQgbXRrX3J4X2FsbG9jKHN0cnVjdCBtdGtfZXRoICpldGgsIGludCByaW5nX25vLCBpbnQgcnhfZmxhZykKIHsKLQlzdHJ1Y3QgbXRrX3J4X3JpbmcgKnJpbmcgPSAmZXRoLT5yeF9yaW5nOworCXN0cnVjdCBtdGtfcnhfcmluZyAqcmluZyA9ICZldGgtPnJ4X3JpbmdbcmluZ19ub107CisJaW50IHJ4X2RhdGFfbGVuLCByeF9kbWFfc2l6ZTsKIAlpbnQgaTsKIAotCXJpbmctPmZyYWdfc2l6ZSA9IG10a19tYXhfZnJhZ19zaXplKEVUSF9EQVRBX0xFTik7CisJaWYgKHJ4X2ZsYWcgPT0gTVRLX1JYX0ZMQUdTX0hXTFJPKSB7CisJCXJ4X2RhdGFfbGVuID0gTVRLX01BWF9MUk9fUlhfTEVOR1RIOworCQlyeF9kbWFfc2l6ZSA9IE1US19IV19MUk9fRE1BX1NJWkU7CisJfSBlbHNlIHsKKwkJcnhfZGF0YV9sZW4gPSBFVEhfREFUQV9MRU47CisJCXJ4X2RtYV9zaXplID0gTVRLX0RNQV9TSVpFOworCX0KKworCXJpbmctPmZyYWdfc2l6ZSA9IG10a19tYXhfZnJhZ19zaXplKHJ4X2RhdGFfbGVuKTsKIAlyaW5nLT5idWZfc2l6ZSA9IG10a19tYXhfYnVmX3NpemUocmluZy0+ZnJhZ19zaXplKTsKLQlyaW5nLT5kYXRhID0ga2NhbGxvYyhNVEtfRE1BX1NJWkUsIHNpemVvZigqcmluZy0+ZGF0YSksCisJcmluZy0+ZGF0YSA9IGtjYWxsb2MocnhfZG1hX3NpemUsIHNpemVvZigqcmluZy0+ZGF0YSksCiAJCQkgICAgIEdGUF9LRVJORUwpOwogCWlmICghcmluZy0+ZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlmb3IgKGkgPSAwOyBpIDwgTVRLX0RNQV9TSVpFOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgcnhfZG1hX3NpemU7IGkrKykgewogCQlyaW5nLT5kYXRhW2ldID0gbmV0ZGV2X2FsbG9jX2ZyYWcocmluZy0+ZnJhZ19zaXplKTsKIAkJaWYgKCFyaW5nLT5kYXRhW2ldKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJcmluZy0+ZG1hID0gZG1hX2FsbG9jX2NvaGVyZW50KGV0aC0+ZGV2LAotCQkJCSAgICAgICBNVEtfRE1BX1NJWkUgKiBzaXplb2YoKnJpbmctPmRtYSksCisJCQkJICAgICAgIHJ4X2RtYV9zaXplICogc2l6ZW9mKCpyaW5nLT5kbWEpLAogCQkJCSAgICAgICAmcmluZy0+cGh5cywKIAkJCQkgICAgICAgR0ZQX0FUT01JQyB8IF9fR0ZQX1pFUk8pOwogCWlmICghcmluZy0+ZG1hKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWZvciAoaSA9IDA7IGkgPCBNVEtfRE1BX1NJWkU7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCByeF9kbWFfc2l6ZTsgaSsrKSB7CiAJCWRtYV9hZGRyX3QgZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZShldGgtPmRldiwKIAkJCQlyaW5nLT5kYXRhW2ldICsgTkVUX1NLQl9QQUQsCiAJCQkJcmluZy0+YnVmX3NpemUsCkBAIC0xMTQyLDI4ICsxMjUyLDMwIEBACiAKIAkJcmluZy0+ZG1hW2ldLnJ4ZDIgPSBSWF9ETUFfUExFTjAocmluZy0+YnVmX3NpemUpOwogCX0KLQlyaW5nLT5jYWxjX2lkeCA9IE1US19ETUFfU0laRSAtIDE7CisJcmluZy0+ZG1hX3NpemUgPSByeF9kbWFfc2l6ZTsKKwlyaW5nLT5jYWxjX2lkeF91cGRhdGUgPSBmYWxzZTsKKwlyaW5nLT5jYWxjX2lkeCA9IHJ4X2RtYV9zaXplIC0gMTsKKwlyaW5nLT5jcnhfaWR4X3JlZyA9IE1US19QUlhfQ1JYX0lEWF9DRkcocmluZ19ubyk7CiAJLyogbWFrZSBzdXJlIHRoYXQgYWxsIGNoYW5nZXMgdG8gdGhlIGRtYSByaW5nIGFyZSBmbHVzaGVkIGJlZm9yZSB3ZQogCSAqIGNvbnRpbnVlCiAJICovCiAJd21iKCk7CiAKLQltdGtfdzMyKGV0aCwgZXRoLT5yeF9yaW5nLnBoeXMsIE1US19RUlhfQkFTRV9QVFIwKTsKLQltdGtfdzMyKGV0aCwgTVRLX0RNQV9TSVpFLCBNVEtfUVJYX01BWF9DTlQwKTsKLQltdGtfdzMyKGV0aCwgZXRoLT5yeF9yaW5nLmNhbGNfaWR4LCBNVEtfUVJYX0NSWF9JRFgwKTsKLQltdGtfdzMyKGV0aCwgTVRLX1BTVF9EUlhfSURYMCwgTVRLX1FETUFfUlNUX0lEWCk7Ci0JbXRrX3czMihldGgsIChRRE1BX1JFU19USFJFUyA8PCA4KSB8IFFETUFfUkVTX1RIUkVTLCBNVEtfUVRYX0NGRygwKSk7CisJbXRrX3czMihldGgsIHJpbmctPnBoeXMsIE1US19QUlhfQkFTRV9QVFJfQ0ZHKHJpbmdfbm8pKTsKKwltdGtfdzMyKGV0aCwgcnhfZG1hX3NpemUsIE1US19QUlhfTUFYX0NOVF9DRkcocmluZ19ubykpOworCW10a193MzIoZXRoLCByaW5nLT5jYWxjX2lkeCwgcmluZy0+Y3J4X2lkeF9yZWcpOworCW10a193MzIoZXRoLCBNVEtfUFNUX0RSWF9JRFhfQ0ZHKHJpbmdfbm8pLCBNVEtfUERNQV9SU1RfSURYKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBtdGtfcnhfY2xlYW4oc3RydWN0IG10a19ldGggKmV0aCkKK3N0YXRpYyB2b2lkIG10a19yeF9jbGVhbihzdHJ1Y3QgbXRrX2V0aCAqZXRoLCBpbnQgcmluZ19ubykKIHsKLQlzdHJ1Y3QgbXRrX3J4X3JpbmcgKnJpbmcgPSAmZXRoLT5yeF9yaW5nOworCXN0cnVjdCBtdGtfcnhfcmluZyAqcmluZyA9ICZldGgtPnJ4X3JpbmdbcmluZ19ub107CiAJaW50IGk7CiAKIAlpZiAocmluZy0+ZGF0YSAmJiByaW5nLT5kbWEpIHsKLQkJZm9yIChpID0gMDsgaSA8IE1US19ETUFfU0laRTsgaSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCByaW5nLT5kbWFfc2l6ZTsgaSsrKSB7CiAJCQlpZiAoIXJpbmctPmRhdGFbaV0pCiAJCQkJY29udGludWU7CiAJCQlpZiAoIXJpbmctPmRtYVtpXS5yeGQxKQpAQCAtMTE4MCwxMyArMTI5MiwyNzUgQEAKIAogCWlmIChyaW5nLT5kbWEpIHsKIAkJZG1hX2ZyZWVfY29oZXJlbnQoZXRoLT5kZXYsCi0JCQkJICBNVEtfRE1BX1NJWkUgKiBzaXplb2YoKnJpbmctPmRtYSksCisJCQkJICByaW5nLT5kbWFfc2l6ZSAqIHNpemVvZigqcmluZy0+ZG1hKSwKIAkJCQkgIHJpbmctPmRtYSwKIAkJCQkgIHJpbmctPnBoeXMpOwogCQlyaW5nLT5kbWEgPSBOVUxMOwogCX0KIH0KIAorc3RhdGljIGludCBtdGtfaHdscm9fcnhfaW5pdChzdHJ1Y3QgbXRrX2V0aCAqZXRoKQoreworCWludCBpOworCXUzMiByaW5nX2N0cmxfZHcxID0gMCwgcmluZ19jdHJsX2R3MiA9IDAsIHJpbmdfY3RybF9kdzMgPSAwOworCXUzMiBscm9fY3RybF9kdzAgPSAwLCBscm9fY3RybF9kdzMgPSAwOworCisJLyogc2V0IExSTyByaW5ncyB0byBhdXRvLWxlYXJuIG1vZGVzICovCisJcmluZ19jdHJsX2R3MiB8PSBNVEtfUklOR19BVVRPX0xFUkFOX01PREU7CisKKwkvKiB2YWxpZGF0ZSBMUk8gcmluZyAqLworCXJpbmdfY3RybF9kdzIgfD0gTVRLX1JJTkdfVkxEOworCisJLyogc2V0IEFHRSB0aW1lciAodW5pdDogMjB1cykgKi8KKwlyaW5nX2N0cmxfZHcyIHw9IE1US19SSU5HX0FHRV9USU1FX0g7CisJcmluZ19jdHJsX2R3MSB8PSBNVEtfUklOR19BR0VfVElNRV9MOworCisJLyogc2V0IG1heCBBR0cgdGltZXIgKHVuaXQ6IDIwdXMpICovCisJcmluZ19jdHJsX2R3MiB8PSBNVEtfUklOR19NQVhfQUdHX1RJTUU7CisKKwkvKiBzZXQgbWF4IExSTyBBR0cgY291bnQgKi8KKwlyaW5nX2N0cmxfZHcyIHw9IE1US19SSU5HX01BWF9BR0dfQ05UX0w7CisJcmluZ19jdHJsX2R3MyB8PSBNVEtfUklOR19NQVhfQUdHX0NOVF9IOworCisJZm9yIChpID0gMTsgaSA8IE1US19NQVhfUlhfUklOR19OVU07IGkrKykgeworCQltdGtfdzMyKGV0aCwgcmluZ19jdHJsX2R3MSwgTVRLX0xST19DVFJMX0RXMV9DRkcoaSkpOworCQltdGtfdzMyKGV0aCwgcmluZ19jdHJsX2R3MiwgTVRLX0xST19DVFJMX0RXMl9DRkcoaSkpOworCQltdGtfdzMyKGV0aCwgcmluZ19jdHJsX2R3MywgTVRLX0xST19DVFJMX0RXM19DRkcoaSkpOworCX0KKworCS8qIElQdjQgY2hlY2tzdW0gdXBkYXRlIGVuYWJsZSAqLworCWxyb19jdHJsX2R3MCB8PSBNVEtfTDNfQ0tTX1VQRF9FTjsKKworCS8qIHN3aXRjaCBwcmlvcml0eSBjb21wYXJpc29uIHRvIHBhY2tldCBjb3VudCBtb2RlICovCisJbHJvX2N0cmxfZHcwIHw9IE1US19MUk9fQUxUX1BLVF9DTlRfTU9ERTsKKworCS8qIGJhbmR3aWR0aCB0aHJlc2hvbGQgc2V0dGluZyAqLworCW10a193MzIoZXRoLCBNVEtfSFdfTFJPX0JXX1RIUkUsIE1US19QRE1BX0xST19DVFJMX0RXMik7CisKKwkvKiBhdXRvLWxlYXJuIHNjb3JlIGRlbHRhIHNldHRpbmcgKi8KKwltdGtfdzMyKGV0aCwgTVRLX0hXX0xST19SRVBMQUNFX0RFTFRBLCBNVEtfUERNQV9MUk9fQUxUX1NDT1JFX0RFTFRBKTsKKworCS8qIHNldCByZWZyZXNoIHRpbWVyIGZvciBhbHRlcmluZyBmbG93cyB0byAxIHNlYy4gKHVuaXQ6IDIwdXMpICovCisJbXRrX3czMihldGgsIChNVEtfSFdfTFJPX1RJTUVSX1VOSVQgPDwgMTYpIHwgTVRLX0hXX0xST19SRUZSRVNIX1RJTUUsCisJCU1US19QRE1BX0xST19BTFRfUkVGUkVTSF9USU1FUik7CisKKwkvKiBzZXQgSFcgTFJPIG1vZGUgJiB0aGUgbWF4IGFnZ3JlZ2F0aW9uIGNvdW50IGZvciByeCBwYWNrZXRzICovCisJbHJvX2N0cmxfZHczIHw9IE1US19BRE1BX01PREUgfCAoTVRLX0hXX0xST19NQVhfQUdHX0NOVCAmIDB4ZmYpOworCisJLyogdGhlIG1pbmltYWwgcmVtYWluaW5nIHJvb20gb2YgU0RMMCBpbiBSWEQgZm9yIGxybyBhZ2dyZWdhdGlvbiAqLworCWxyb19jdHJsX2R3MyB8PSBNVEtfTFJPX01JTl9SWERfU0RMOworCisJLyogZW5hYmxlIEhXIExSTyAqLworCWxyb19jdHJsX2R3MCB8PSBNVEtfTFJPX0VOOworCisJbXRrX3czMihldGgsIGxyb19jdHJsX2R3MywgTVRLX1BETUFfTFJPX0NUUkxfRFczKTsKKwltdGtfdzMyKGV0aCwgbHJvX2N0cmxfZHcwLCBNVEtfUERNQV9MUk9fQ1RSTF9EVzApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG10a19od2xyb19yeF91bmluaXQoc3RydWN0IG10a19ldGggKmV0aCkKK3sKKwlpbnQgaTsKKwl1MzIgdmFsOworCisJLyogcmVsaW5xdWlzaCBscm8gcmluZ3MsIGZsdXNoIGFnZ3JlZ2F0ZWQgcGFja2V0cyAqLworCW10a193MzIoZXRoLCBNVEtfTFJPX1JJTkdfUkVMSU5RVUlTSF9SRVEsIE1US19QRE1BX0xST19DVFJMX0RXMCk7CisKKwkvKiB3YWl0IGZvciByZWxpbnF1aXNobWVudHMgZG9uZSAqLworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCXZhbCA9IG10a19yMzIoZXRoLCBNVEtfUERNQV9MUk9fQ1RSTF9EVzApOworCQlpZiAodmFsICYgTVRLX0xST19SSU5HX1JFTElOUVVJU0hfRE9ORSkgeworCQkJbXNsZWVwKDIwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJyZWFrOworCX0KKworCS8qIGludmFsaWRhdGUgbHJvIHJpbmdzICovCisJZm9yIChpID0gMTsgaSA8IE1US19NQVhfUlhfUklOR19OVU07IGkrKykKKwkJbXRrX3czMihldGgsIDAsIE1US19MUk9fQ1RSTF9EVzJfQ0ZHKGkpKTsKKworCS8qIGRpc2FibGUgSFcgTFJPICovCisJbXRrX3czMihldGgsIDAsIE1US19QRE1BX0xST19DVFJMX0RXMCk7Cit9CisKK3N0YXRpYyB2b2lkIG10a19od2xyb192YWxfaXBhZGRyKHN0cnVjdCBtdGtfZXRoICpldGgsIGludCBpZHgsIF9fYmUzMiBpcCkKK3sKKwl1MzIgcmVnX3ZhbDsKKworCXJlZ192YWwgPSBtdGtfcjMyKGV0aCwgTVRLX0xST19DVFJMX0RXMl9DRkcoaWR4KSk7CisKKwkvKiBpbnZhbGlkYXRlIHRoZSBJUCBzZXR0aW5nICovCisJbXRrX3czMihldGgsIChyZWdfdmFsICYgfk1US19SSU5HX01ZSVBfVkxEKSwgTVRLX0xST19DVFJMX0RXMl9DRkcoaWR4KSk7CisKKwltdGtfdzMyKGV0aCwgaXAsIE1US19MUk9fRElQX0RXMF9DRkcoaWR4KSk7CisKKwkvKiB2YWxpZGF0ZSB0aGUgSVAgc2V0dGluZyAqLworCW10a193MzIoZXRoLCAocmVnX3ZhbCB8IE1US19SSU5HX01ZSVBfVkxEKSwgTVRLX0xST19DVFJMX0RXMl9DRkcoaWR4KSk7Cit9CisKK3N0YXRpYyB2b2lkIG10a19od2xyb19pbnZhbF9pcGFkZHIoc3RydWN0IG10a19ldGggKmV0aCwgaW50IGlkeCkKK3sKKwl1MzIgcmVnX3ZhbDsKKworCXJlZ192YWwgPSBtdGtfcjMyKGV0aCwgTVRLX0xST19DVFJMX0RXMl9DRkcoaWR4KSk7CisKKwkvKiBpbnZhbGlkYXRlIHRoZSBJUCBzZXR0aW5nICovCisJbXRrX3czMihldGgsIChyZWdfdmFsICYgfk1US19SSU5HX01ZSVBfVkxEKSwgTVRLX0xST19DVFJMX0RXMl9DRkcoaWR4KSk7CisKKwltdGtfdzMyKGV0aCwgMCwgTVRLX0xST19ESVBfRFcwX0NGRyhpZHgpKTsKK30KKworc3RhdGljIGludCBtdGtfaHdscm9fZ2V0X2lwX2NudChzdHJ1Y3QgbXRrX21hYyAqbWFjKQoreworCWludCBjbnQgPSAwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1US19NQVhfTFJPX0lQX0NOVDsgaSsrKSB7CisJCWlmIChtYWMtPmh3bHJvX2lwW2ldKQorCQkJY250Kys7CisJfQorCisJcmV0dXJuIGNudDsKK30KKworc3RhdGljIGludCBtdGtfaHdscm9fYWRkX2lwYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBldGh0b29sX3J4bmZjICpjbWQpCit7CisJc3RydWN0IGV0aHRvb2xfcnhfZmxvd19zcGVjICpmc3AgPQorCQkoc3RydWN0IGV0aHRvb2xfcnhfZmxvd19zcGVjICopJmNtZC0+ZnM7CisJc3RydWN0IG10a19tYWMgKm1hYyA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG10a19ldGggKmV0aCA9IG1hYy0+aHc7CisJaW50IGh3bHJvX2lkeDsKKworCWlmICgoZnNwLT5mbG93X3R5cGUgIT0gVENQX1Y0X0ZMT1cpIHx8CisJICAgICghZnNwLT5oX3UudGNwX2lwNF9zcGVjLmlwNGRzdCkgfHwKKwkgICAgKGZzcC0+bG9jYXRpb24gPiAxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltYWMtPmh3bHJvX2lwW2ZzcC0+bG9jYXRpb25dID0gaHRvbmwoZnNwLT5oX3UudGNwX2lwNF9zcGVjLmlwNGRzdCk7CisJaHdscm9faWR4ID0gKG1hYy0+aWQgKiBNVEtfTUFYX0xST19JUF9DTlQpICsgZnNwLT5sb2NhdGlvbjsKKworCW1hYy0+aHdscm9faXBfY250ID0gbXRrX2h3bHJvX2dldF9pcF9jbnQobWFjKTsKKworCW10a19od2xyb192YWxfaXBhZGRyKGV0aCwgaHdscm9faWR4LCBtYWMtPmh3bHJvX2lwW2ZzcC0+bG9jYXRpb25dKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG10a19od2xyb19kZWxfaXBhZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGV0aHRvb2xfcnhuZmMgKmNtZCkKK3sKKwlzdHJ1Y3QgZXRodG9vbF9yeF9mbG93X3NwZWMgKmZzcCA9CisJCShzdHJ1Y3QgZXRodG9vbF9yeF9mbG93X3NwZWMgKikmY21kLT5mczsKKwlzdHJ1Y3QgbXRrX21hYyAqbWFjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbXRrX2V0aCAqZXRoID0gbWFjLT5odzsKKwlpbnQgaHdscm9faWR4OworCisJaWYgKGZzcC0+bG9jYXRpb24gPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1hYy0+aHdscm9faXBbZnNwLT5sb2NhdGlvbl0gPSAwOworCWh3bHJvX2lkeCA9IChtYWMtPmlkICogTVRLX01BWF9MUk9fSVBfQ05UKSArIGZzcC0+bG9jYXRpb247CisKKwltYWMtPmh3bHJvX2lwX2NudCA9IG10a19od2xyb19nZXRfaXBfY250KG1hYyk7CisKKwltdGtfaHdscm9faW52YWxfaXBhZGRyKGV0aCwgaHdscm9faWR4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtdGtfaHdscm9fbmV0ZGV2X2Rpc2FibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbXRrX21hYyAqbWFjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbXRrX2V0aCAqZXRoID0gbWFjLT5odzsKKwlpbnQgaSwgaHdscm9faWR4OworCisJZm9yIChpID0gMDsgaSA8IE1US19NQVhfTFJPX0lQX0NOVDsgaSsrKSB7CisJCW1hYy0+aHdscm9faXBbaV0gPSAwOworCQlod2xyb19pZHggPSAobWFjLT5pZCAqIE1US19NQVhfTFJPX0lQX0NOVCkgKyBpOworCisJCW10a19od2xyb19pbnZhbF9pcGFkZHIoZXRoLCBod2xyb19pZHgpOworCX0KKworCW1hYy0+aHdscm9faXBfY250ID0gMDsKK30KKworc3RhdGljIGludCBtdGtfaHdscm9fZ2V0X2ZkaXJfZW50cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGV0aHRvb2xfcnhuZmMgKmNtZCkKK3sKKwlzdHJ1Y3QgbXRrX21hYyAqbWFjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZXRodG9vbF9yeF9mbG93X3NwZWMgKmZzcCA9CisJCShzdHJ1Y3QgZXRodG9vbF9yeF9mbG93X3NwZWMgKikmY21kLT5mczsKKworCS8qIG9ubHkgdGNwIGRzdCBpcHY0IGlzIG1lYW5pbmdmdWwsIG90aGVycyBhcmUgbWVhbmluZ2xlc3MgKi8KKwlmc3AtPmZsb3dfdHlwZSA9IFRDUF9WNF9GTE9XOworCWZzcC0+aF91LnRjcF9pcDRfc3BlYy5pcDRkc3QgPSBudG9obChtYWMtPmh3bHJvX2lwW2ZzcC0+bG9jYXRpb25dKTsKKwlmc3AtPm1fdS50Y3BfaXA0X3NwZWMuaXA0ZHN0ID0gMDsKKworCWZzcC0+aF91LnRjcF9pcDRfc3BlYy5pcDRzcmMgPSAwOworCWZzcC0+bV91LnRjcF9pcDRfc3BlYy5pcDRzcmMgPSAweGZmZmZmZmZmOworCWZzcC0+aF91LnRjcF9pcDRfc3BlYy5wc3JjID0gMDsKKwlmc3AtPm1fdS50Y3BfaXA0X3NwZWMucHNyYyA9IDB4ZmZmZjsKKwlmc3AtPmhfdS50Y3BfaXA0X3NwZWMucGRzdCA9IDA7CisJZnNwLT5tX3UudGNwX2lwNF9zcGVjLnBkc3QgPSAweGZmZmY7CisJZnNwLT5oX3UudGNwX2lwNF9zcGVjLnRvcyA9IDA7CisJZnNwLT5tX3UudGNwX2lwNF9zcGVjLnRvcyA9IDB4ZmY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdGtfaHdscm9fZ2V0X2ZkaXJfYWxsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgZXRodG9vbF9yeG5mYyAqY21kLAorCQkJCSAgdTMyICpydWxlX2xvY3MpCit7CisJc3RydWN0IG10a19tYWMgKm1hYyA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGNudCA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTVRLX01BWF9MUk9fSVBfQ05UOyBpKyspIHsKKwkJaWYgKG1hYy0+aHdscm9faXBbaV0pIHsKKwkJCXJ1bGVfbG9jc1tjbnRdID0gaTsKKwkJCWNudCsrOworCQl9CisJfQorCisJY21kLT5ydWxlX2NudCA9IGNudDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgbmV0ZGV2X2ZlYXR1cmVzX3QgbXRrX2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQoreworCWlmICghKGZlYXR1cmVzICYgTkVUSUZfRl9MUk8pKSB7CisJCXN0cnVjdCBtdGtfbWFjICptYWMgPSBuZXRkZXZfcHJpdihkZXYpOworCQlpbnQgaXBfY250ID0gbXRrX2h3bHJvX2dldF9pcF9jbnQobWFjKTsKKworCQlpZiAoaXBfY250KSB7CisJCQluZXRkZXZfaW5mbyhkZXYsICJSWCBmbG93IGlzIHByb2dyYW1tZWQsIExSTyBzaG91bGQga2VlcCBvblxuIik7CisKKwkJCWZlYXR1cmVzIHw9IE5FVElGX0ZfTFJPOworCQl9CisJfQorCisJcmV0dXJuIGZlYXR1cmVzOworfQorCitzdGF0aWMgaW50IG10a19zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCit7CisJaW50IGVyciA9IDA7CisKKwlpZiAoISgoZGV2LT5mZWF0dXJlcyBeIGZlYXR1cmVzKSAmIE5FVElGX0ZfTFJPKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIShmZWF0dXJlcyAmIE5FVElGX0ZfTFJPKSkKKwkJbXRrX2h3bHJvX25ldGRldl9kaXNhYmxlKGRldik7CisKKwlyZXR1cm4gZXJyOworfQorCiAvKiB3YWl0IGZvciBETUEgdG8gZmluaXNoIHdoYXRldmVyIGl0IGlzIGRvaW5nIGJlZm9yZSB3ZSBzdGFydCB1c2luZyBpdCBhZ2FpbiAqLwogc3RhdGljIGludCBtdGtfZG1hX2J1c3lfd2FpdChzdHJ1Y3QgbXRrX2V0aCAqZXRoKQogewpAQCAtMTIwNyw2ICsxNTgxLDcgQEAKIHN0YXRpYyBpbnQgbXRrX2RtYV9pbml0KHN0cnVjdCBtdGtfZXRoICpldGgpCiB7CiAJaW50IGVycjsKKwl1MzIgaTsKIAogCWlmIChtdGtfZG1hX2J1c3lfd2FpdChldGgpKQogCQlyZXR1cm4gLUVCVVNZOwpAQCAtMTIyMiwxMCArMTU5NywyMSBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQllcnIgPSBtdGtfcnhfYWxsb2MoZXRoKTsKKwllcnIgPSBtdGtfcnhfYWxsb2MoZXRoLCAwLCBNVEtfUlhfRkxBR1NfTk9STUFMKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCisJaWYgKGV0aC0+aHdscm8pIHsKKwkJZm9yIChpID0gMTsgaSA8IE1US19NQVhfUlhfUklOR19OVU07IGkrKykgeworCQkJZXJyID0gbXRrX3J4X2FsbG9jKGV0aCwgaSwgTVRLX1JYX0ZMQUdTX0hXTFJPKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCQllcnIgPSBtdGtfaHdscm9fcnhfaW5pdChldGgpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKIAkvKiBFbmFibGUgcmFuZG9tIGVhcmx5IGRyb3AgYW5kIHNldCBkcm9wIHRocmVzaG9sZCBhdXRvbWF0aWNhbGx5ICovCiAJbXRrX3czMihldGgsIEZDX1RIUkVTX0RST1BfTU9ERSB8IEZDX1RIUkVTX0RST1BfRU4gfCBGQ19USFJFU19NSU4sCiAJCU1US19RRE1BX0ZDX1RIUkVTKTsKQEAgLTEyNTAsNyArMTYzNiwxNCBAQAogCQlldGgtPnBoeV9zY3JhdGNoX3JpbmcgPSAwOwogCX0KIAltdGtfdHhfY2xlYW4oZXRoKTsKLQltdGtfcnhfY2xlYW4oZXRoKTsKKwltdGtfcnhfY2xlYW4oZXRoLCAwKTsKKworCWlmIChldGgtPmh3bHJvKSB7CisJCW10a19od2xyb19yeF91bmluaXQoZXRoKTsKKwkJZm9yIChpID0gMTsgaSA8IE1US19NQVhfUlhfUklOR19OVU07IGkrKykKKwkJCW10a19yeF9jbGVhbihldGgsIGkpOworCX0KKwogCWtmcmVlKGV0aC0+c2NyYXRjaF9oZWFkKTsKIH0KIApAQCAtMTI3MSw3ICsxNjY0LDcgQEAKIAogCWlmIChsaWtlbHkobmFwaV9zY2hlZHVsZV9wcmVwKCZldGgtPnJ4X25hcGkpKSkgewogCQlfX25hcGlfc2NoZWR1bGUoJmV0aC0+cnhfbmFwaSk7Ci0JCW10a19pcnFfZGlzYWJsZShldGgsIE1US19SWF9ET05FX0lOVCk7CisJCW10a19pcnFfZGlzYWJsZShldGgsIE1US19QRE1BX0lOVF9NQVNLLCBNVEtfUlhfRE9ORV9JTlQpOwogCX0KIAogCXJldHVybiBJUlFfSEFORExFRDsKQEAgLTEyODMsNyArMTY3Niw3IEBACiAKIAlpZiAobGlrZWx5KG5hcGlfc2NoZWR1bGVfcHJlcCgmZXRoLT50eF9uYXBpKSkpIHsKIAkJX19uYXBpX3NjaGVkdWxlKCZldGgtPnR4X25hcGkpOwotCQltdGtfaXJxX2Rpc2FibGUoZXRoLCBNVEtfVFhfRE9ORV9JTlQpOworCQltdGtfaXJxX2Rpc2FibGUoZXRoLCBNVEtfUURNQV9JTlRfTUFTSywgTVRLX1RYX0RPTkVfSU5UKTsKIAl9CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC0xMjk0LDExICsxNjg3LDEyIEBACiB7CiAJc3RydWN0IG10a19tYWMgKm1hYyA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG10a19ldGggKmV0aCA9IG1hYy0+aHc7Ci0JdTMyIGludF9tYXNrID0gTVRLX1RYX0RPTkVfSU5UIHwgTVRLX1JYX0RPTkVfSU5UOwogCi0JbXRrX2lycV9kaXNhYmxlKGV0aCwgaW50X21hc2spOworCW10a19pcnFfZGlzYWJsZShldGgsIE1US19RRE1BX0lOVF9NQVNLLCBNVEtfVFhfRE9ORV9JTlQpOworCW10a19pcnFfZGlzYWJsZShldGgsIE1US19QRE1BX0lOVF9NQVNLLCBNVEtfUlhfRE9ORV9JTlQpOwogCW10a19oYW5kbGVfaXJxX3J4KGV0aC0+aXJxWzJdLCBkZXYpOwotCW10a19pcnFfZW5hYmxlKGV0aCwgaW50X21hc2spOworCW10a19pcnFfZW5hYmxlKGV0aCwgTVRLX1FETUFfSU5UX01BU0ssIE1US19UWF9ET05FX0lOVCk7CisJbXRrX2lycV9lbmFibGUoZXRoLCBNVEtfUERNQV9JTlRfTUFTSywgTVRLX1JYX0RPTkVfSU5UKTsKIH0KICNlbmRpZgogCkBAIC0xMzEzLDExICsxNzA3LDE1IEBACiAJfQogCiAJbXRrX3czMihldGgsCi0JCU1US19UWF9XQl9ERE9ORSB8IE1US19SWF9ETUFfRU4gfCBNVEtfVFhfRE1BX0VOIHwKLQkJTVRLX1JYXzJCX09GRlNFVCB8IE1US19ETUFfU0laRV8xNkRXT1JEUyB8Ci0JCU1US19SWF9CVF8zMkRXT1JEUyB8IE1US19ORFBfQ09fUFJPLAorCQlNVEtfVFhfV0JfRERPTkUgfCBNVEtfVFhfRE1BX0VOIHwKKwkJTVRLX0RNQV9TSVpFXzE2RFdPUkRTIHwgTVRLX05EUF9DT19QUk8sCiAJCU1US19RRE1BX0dMT19DRkcpOwogCisJbXRrX3czMihldGgsCisJCU1US19SWF9ETUFfRU4gfCBNVEtfUlhfMkJfT0ZGU0VUIHwKKwkJTVRLX1JYX0JUXzMyRFdPUkRTIHwgTVRLX01VTFRJX0VOLAorCQlNVEtfUERNQV9HTE9fQ0ZHKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMzM1LDExICsxNzMzLDEyIEBACiAKIAkJbmFwaV9lbmFibGUoJmV0aC0+dHhfbmFwaSk7CiAJCW5hcGlfZW5hYmxlKCZldGgtPnJ4X25hcGkpOwotCQltdGtfaXJxX2VuYWJsZShldGgsIE1US19UWF9ET05FX0lOVCB8IE1US19SWF9ET05FX0lOVCk7CisJCW10a19pcnFfZW5hYmxlKGV0aCwgTVRLX1FETUFfSU5UX01BU0ssIE1US19UWF9ET05FX0lOVCk7CisJCW10a19pcnFfZW5hYmxlKGV0aCwgTVRLX1BETUFfSU5UX01BU0ssIE1US19SWF9ET05FX0lOVCk7CiAJfQogCWF0b21pY19pbmMoJmV0aC0+ZG1hX3JlZmNudCk7CiAKLQlwaHlfc3RhcnQobWFjLT5waHlfZGV2KTsKKwlwaHlfc3RhcnQoZGV2LT5waHlkZXYpOwogCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CiAKIAlyZXR1cm4gMDsKQEAgLTEzNDcsMTYgKzE3NDYsMTUgQEAKIAogc3RhdGljIHZvaWQgbXRrX3N0b3BfZG1hKHN0cnVjdCBtdGtfZXRoICpldGgsIHUzMiBnbG9fY2ZnKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTMyIHZhbDsKIAlpbnQgaTsKIAogCS8qIHN0b3AgdGhlIGRtYSBlbmdpbmUgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZXRoLT5wYWdlX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfYmgoJmV0aC0+cGFnZV9sb2NrKTsKIAl2YWwgPSBtdGtfcjMyKGV0aCwgZ2xvX2NmZyk7CiAJbXRrX3czMihldGgsIHZhbCAmIH4oTVRLX1RYX1dCX0RET05FIHwgTVRLX1JYX0RNQV9FTiB8IE1US19UWF9ETUFfRU4pLAogCQlnbG9fY2ZnKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGgtPnBhZ2VfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2JoKCZldGgtPnBhZ2VfbG9jayk7CiAKIAkvKiB3YWl0IGZvciBkbWEgc3RvcCAqLwogCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CkBAIC0xMzc1LDMyICsxNzczLDYzIEBACiAJc3RydWN0IG10a19ldGggKmV0aCA9IG1hYy0+aHc7CiAKIAluZXRpZl90eF9kaXNhYmxlKGRldik7Ci0JcGh5X3N0b3AobWFjLT5waHlfZGV2KTsKKwlwaHlfc3RvcChkZXYtPnBoeWRldik7CiAKIAkvKiBvbmx5IHNodXRkb3duIERNQSBpZiB0aGlzIGlzIHRoZSBsYXN0IHVzZXIgKi8KIAlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmV0aC0+ZG1hX3JlZmNudCkpCiAJCXJldHVybiAwOwogCi0JbXRrX2lycV9kaXNhYmxlKGV0aCwgTVRLX1RYX0RPTkVfSU5UIHwgTVRLX1JYX0RPTkVfSU5UKTsKKwltdGtfaXJxX2Rpc2FibGUoZXRoLCBNVEtfUURNQV9JTlRfTUFTSywgTVRLX1RYX0RPTkVfSU5UKTsKKwltdGtfaXJxX2Rpc2FibGUoZXRoLCBNVEtfUERNQV9JTlRfTUFTSywgTVRLX1JYX0RPTkVfSU5UKTsKIAluYXBpX2Rpc2FibGUoJmV0aC0+dHhfbmFwaSk7CiAJbmFwaV9kaXNhYmxlKCZldGgtPnJ4X25hcGkpOwogCiAJbXRrX3N0b3BfZG1hKGV0aCwgTVRLX1FETUFfR0xPX0NGRyk7CisJbXRrX3N0b3BfZG1hKGV0aCwgTVRLX1BETUFfR0xPX0NGRyk7CiAKIAltdGtfZG1hX2ZyZWUoZXRoKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBtdGtfaHdfaW5pdChzdHJ1Y3QgbXRrX2V0aCAqZXRoKQorc3RhdGljIHZvaWQgZXRoc3lzX3Jlc2V0KHN0cnVjdCBtdGtfZXRoICpldGgsIHUzMiByZXNldF9iaXRzKQogewotCWludCBlcnIsIGk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKGV0aC0+ZXRoc3lzLCBFVEhTWVNfUlNUQ1RSTCwKKwkJCSAgIHJlc2V0X2JpdHMsCisJCQkgICByZXNldF9iaXRzKTsKIAotCS8qIHJlc2V0IHRoZSBmcmFtZSBlbmdpbmUgKi8KLQlyZXNldF9jb250cm9sX2Fzc2VydChldGgtPnJzdGMpOwotCXVzbGVlcF9yYW5nZSgxMCwgMjApOwotCXJlc2V0X2NvbnRyb2xfZGVhc3NlcnQoZXRoLT5yc3RjKTsKLQl1c2xlZXBfcmFuZ2UoMTAsIDIwKTsKKwl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKGV0aC0+ZXRoc3lzLCBFVEhTWVNfUlNUQ1RSTCwKKwkJCSAgIHJlc2V0X2JpdHMsCisJCQkgICB+cmVzZXRfYml0cyk7CisJbWRlbGF5KDEwKTsKK30KKworc3RhdGljIGludCBtdGtfaHdfaW5pdChzdHJ1Y3QgbXRrX2V0aCAqZXRoKQoreworCWludCBpLCB2YWw7CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChNVEtfSFdfSU5JVCwgJmV0aC0+c3RhdGUpKQorCQlyZXR1cm4gMDsKKworCXBtX3J1bnRpbWVfZW5hYmxlKGV0aC0+ZGV2KTsKKwlwbV9ydW50aW1lX2dldF9zeW5jKGV0aC0+ZGV2KTsKKworCWNsa19wcmVwYXJlX2VuYWJsZShldGgtPmNsa3NbTVRLX0NMS19FVEhJRl0pOworCWNsa19wcmVwYXJlX2VuYWJsZShldGgtPmNsa3NbTVRLX0NMS19FU1ddKTsKKwljbGtfcHJlcGFyZV9lbmFibGUoZXRoLT5jbGtzW01US19DTEtfR1AxXSk7CisJY2xrX3ByZXBhcmVfZW5hYmxlKGV0aC0+Y2xrc1tNVEtfQ0xLX0dQMl0pOworCWV0aHN5c19yZXNldChldGgsIFJTVENUUkxfRkUpOworCWV0aHN5c19yZXNldChldGgsIFJTVENUUkxfUFBFKTsKKworCXJlZ21hcF9yZWFkKGV0aC0+ZXRoc3lzLCBFVEhTWVNfU1lTQ0ZHMCwgJnZhbCk7CisJZm9yIChpID0gMDsgaSA8IE1US19NQUNfQ09VTlQ7IGkrKykgeworCQlpZiAoIWV0aC0+bWFjW2ldKQorCQkJY29udGludWU7CisJCXZhbCAmPSB+U1lTQ0ZHMF9HRV9NT0RFKFNZU0NGRzBfR0VfTUFTSywgZXRoLT5tYWNbaV0tPmlkKTsKKwkJdmFsIHw9IFNZU0NGRzBfR0VfTU9ERShldGgtPm1hY1tpXS0+Z2VfbW9kZSwgZXRoLT5tYWNbaV0tPmlkKTsKKwl9CisJcmVnbWFwX3dyaXRlKGV0aC0+ZXRoc3lzLCBFVEhTWVNfU1lTQ0ZHMCwgdmFsKTsKIAogCS8qIFNldCBHRTIgZHJpdmluZyBhbmQgc2xldyByYXRlICovCiAJcmVnbWFwX3dyaXRlKGV0aC0+cGN0bCwgR1BJT19EUlZfU0VMMTAsIDB4YTAwKTsKQEAgLTE0MjAsMjIgKzE4NDksMTEgQEAKIAkvKiBFbmFibGUgUlggVkxhbiBPZmZsb2FkaW5nICovCiAJbXRrX3czMihldGgsIDEsIE1US19DRE1QX0VHX0NUUkwpOwogCi0JZXJyID0gZGV2bV9yZXF1ZXN0X2lycShldGgtPmRldiwgZXRoLT5pcnFbMV0sIG10a19oYW5kbGVfaXJxX3R4LCAwLAotCQkJICAgICAgIGRldl9uYW1lKGV0aC0+ZGV2KSwgZXRoKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCWVyciA9IGRldm1fcmVxdWVzdF9pcnEoZXRoLT5kZXYsIGV0aC0+aXJxWzJdLCBtdGtfaGFuZGxlX2lycV9yeCwgMCwKLQkJCSAgICAgICBkZXZfbmFtZShldGgtPmRldiksIGV0aCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWVyciA9IG10a19tZGlvX2luaXQoZXRoKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCiAJLyogZGlzYWJsZSBkZWxheSBhbmQgbm9ybWFsIGludGVycnVwdCAqLwogCW10a193MzIoZXRoLCAwLCBNVEtfUURNQV9ERUxBWV9JTlQpOwotCW10a19pcnFfZGlzYWJsZShldGgsIH4wKTsKKwltdGtfdzMyKGV0aCwgMCwgTVRLX1BETUFfREVMQVlfSU5UKTsKKwltdGtfaXJxX2Rpc2FibGUoZXRoLCBNVEtfUURNQV9JTlRfTUFTSywgfjApOworCW10a19pcnFfZGlzYWJsZShldGgsIE1US19QRE1BX0lOVF9NQVNLLCB+MCk7CiAJbXRrX3czMihldGgsIFJTVF9HTF9QU0UsIE1US19SU1RfR0wpOwogCW10a193MzIoZXRoLCAwLCBNVEtfUlNUX0dMKTsKIApAQCAtMTQ0OSw5ICsxODY3LDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAJCXUzMiB2YWwgPSBtdGtfcjMyKGV0aCwgTVRLX0dETUFfRldEX0NGRyhpKSk7CiAKLQkJLyogc2V0dXAgdGhlIGZvcndhcmQgcG9ydCB0byBzZW5kIGZyYW1lIHRvIFFETUEgKi8KKwkJLyogc2V0dXAgdGhlIGZvcndhcmQgcG9ydCB0byBzZW5kIGZyYW1lIHRvIFBETUEgKi8KIAkJdmFsICY9IH4weGZmZmY7Ci0JCXZhbCB8PSAweDU1NTU7CiAKIAkJLyogRW5hYmxlIFJYIGNoZWNrc3VtICovCiAJCXZhbCB8PSBNVEtfR0RNQV9JQ1NfRU4gfCBNVEtfR0RNQV9UQ1NfRU4gfCBNVEtfR0RNQV9VQ1NfRU47CkBAIC0xNDYzLDYgKzE4ODAsMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBtdGtfaHdfZGVpbml0KHN0cnVjdCBtdGtfZXRoICpldGgpCit7CisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoTVRLX0hXX0lOSVQsICZldGgtPnN0YXRlKSkKKwkJcmV0dXJuIDA7CisKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoZXRoLT5jbGtzW01US19DTEtfR1AyXSk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGV0aC0+Y2xrc1tNVEtfQ0xLX0dQMV0pOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShldGgtPmNsa3NbTVRLX0NMS19FU1ddKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoZXRoLT5jbGtzW01US19DTEtfRVRISUZdKTsKKworCXBtX3J1bnRpbWVfcHV0X3N5bmMoZXRoLT5kZXYpOworCXBtX3J1bnRpbWVfZGlzYWJsZShldGgtPmRldik7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBfX2luaXQgbXRrX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbXRrX21hYyAqbWFjID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTE0ODEsNyArMTkxNCw3IEBACiAJCWRldi0+YWRkcl9hc3NpZ25fdHlwZSA9IE5FVF9BRERSX1JBTkRPTTsKIAl9CiAKLQlyZXR1cm4gbXRrX3BoeV9jb25uZWN0KG1hYyk7CisJcmV0dXJuIG10a19waHlfY29ubmVjdChkZXYpOwogfQogCiBzdGF0aWMgdm9pZCBtdGtfdW5pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0xNDg5LDIyICsxOTIyLDE4IEBACiAJc3RydWN0IG10a19tYWMgKm1hYyA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG10a19ldGggKmV0aCA9IG1hYy0+aHc7CiAKLQlwaHlfZGlzY29ubmVjdChtYWMtPnBoeV9kZXYpOwotCW10a19tZGlvX2NsZWFudXAoZXRoKTsKLQltdGtfaXJxX2Rpc2FibGUoZXRoLCB+MCk7Ci0JZnJlZV9pcnEoZXRoLT5pcnFbMV0sIGRldik7Ci0JZnJlZV9pcnEoZXRoLT5pcnFbMl0sIGRldik7CisJcGh5X2Rpc2Nvbm5lY3QoZGV2LT5waHlkZXYpOworCW10a19pcnFfZGlzYWJsZShldGgsIE1US19RRE1BX0lOVF9NQVNLLCB+MCk7CisJbXRrX2lycV9kaXNhYmxlKGV0aCwgTVRLX1BETUFfSU5UX01BU0ssIH4wKTsKIH0KIAogc3RhdGljIGludCBtdGtfZG9faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCiB7Ci0Jc3RydWN0IG10a19tYWMgKm1hYyA9IG5ldGRldl9wcml2KGRldik7Ci0KIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU0lPQ0dNSUlQSFk6CiAJY2FzZSBTSU9DR01JSVJFRzoKIAljYXNlIFNJT0NTTUlJUkVHOgotCQlyZXR1cm4gcGh5X21paV9pb2N0bChtYWMtPnBoeV9kZXYsIGlmciwgY21kKTsKKwkJcmV0dXJuIHBoeV9taWlfaW9jdGwoZGV2LT5waHlkZXYsIGlmciwgY21kKTsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CkBAIC0xNTIwLDYgKzE5NDksMTIgQEAKIAogCXJ0bmxfbG9jaygpOwogCisJZGV2X2RiZyhldGgtPmRldiwgIlslc11bJWRdIHJlc2V0XG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJd2hpbGUgKHRlc3RfYW5kX3NldF9iaXRfbG9jayhNVEtfUkVTRVRUSU5HLCAmZXRoLT5zdGF0ZSkpCisJCWNwdV9yZWxheCgpOworCisJZGV2X2RiZyhldGgtPmRldiwgIlslc11bJWRdIG10a19zdG9wIHN0YXJ0c1xuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAkvKiBzdG9wIGFsbCBkZXZpY2VzIHRvIG1ha2Ugc3VyZSB0aGF0IGRtYSBpcyBwcm9wZXJseSBzaHV0IGRvd24gKi8KIAlmb3IgKGkgPSAwOyBpIDwgTVRLX01BQ19DT1VOVDsgaSsrKSB7CiAJCWlmICghZXRoLT5uZXRkZXZbaV0pCkBAIC0xNTI3LDYgKzE5NjIsMjcgQEAKIAkJbXRrX3N0b3AoZXRoLT5uZXRkZXZbaV0pOwogCQlfX3NldF9iaXQoaSwgJnJlc3RhcnQpOwogCX0KKwlkZXZfZGJnKGV0aC0+ZGV2LCAiWyVzXVslZF0gbXRrX3N0b3AgZW5kc1xuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCS8qIHJlc3RhcnQgdW5kZXJseWluZyBoYXJkd2FyZSBzdWNoIGFzIHBvd2VyLCBjbG9jaywgcGluIG11eAorCSAqIGFuZCB0aGUgY29ubmVjdGVkIHBoeQorCSAqLworCW10a19od19kZWluaXQoZXRoKTsKKworCWlmIChldGgtPmRldi0+cGlucykKKwkJcGluY3RybF9zZWxlY3Rfc3RhdGUoZXRoLT5kZXYtPnBpbnMtPnAsCisJCQkJICAgICBldGgtPmRldi0+cGlucy0+ZGVmYXVsdF9zdGF0ZSk7CisJbXRrX2h3X2luaXQoZXRoKTsKKworCWZvciAoaSA9IDA7IGkgPCBNVEtfTUFDX0NPVU5UOyBpKyspIHsKKwkJaWYgKCFldGgtPm1hY1tpXSB8fAorCQkgICAgb2ZfcGh5X2lzX2ZpeGVkX2xpbmsoZXRoLT5tYWNbaV0tPm9mX25vZGUpKQorCQkJY29udGludWU7CisJCWVyciA9IHBoeV9pbml0X2h3KGV0aC0+bmV0ZGV2W2ldLT5waHlkZXYpOworCQlpZiAoZXJyKQorCQkJZGV2X2VycihldGgtPmRldiwgIiVzOiBQSFkgaW5pdCBmYWlsZWQuXG4iLAorCQkJCWV0aC0+bmV0ZGV2W2ldLT5uYW1lKTsKKwl9CiAKIAkvKiByZXN0YXJ0IERNQSBhbmQgZW5hYmxlIElSUXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTVRLX01BQ19DT1VOVDsgaSsrKSB7CkBAIC0xNTM5LDUxICsxOTk1LDY5IEBACiAJCQlkZXZfY2xvc2UoZXRoLT5uZXRkZXZbaV0pOwogCQl9CiAJfQorCisJZGV2X2RiZyhldGgtPmRldiwgIlslc11bJWRdIHJlc2V0IGRvbmVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwljbGVhcl9iaXRfdW5sb2NrKE1US19SRVNFVFRJTkcsICZldGgtPnN0YXRlKTsKKwogCXJ0bmxfdW5sb2NrKCk7CiB9CiAKLXN0YXRpYyBpbnQgbXRrX2NsZWFudXAoc3RydWN0IG10a19ldGggKmV0aCkKK3N0YXRpYyBpbnQgbXRrX2ZyZWVfZGV2KHN0cnVjdCBtdGtfZXRoICpldGgpCiB7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTVRLX01BQ19DT1VOVDsgaSsrKSB7CiAJCWlmICghZXRoLT5uZXRkZXZbaV0pCiAJCQljb250aW51ZTsKLQotCQl1bnJlZ2lzdGVyX25ldGRldihldGgtPm5ldGRldltpXSk7CiAJCWZyZWVfbmV0ZGV2KGV0aC0+bmV0ZGV2W2ldKTsKIAl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdGtfdW5yZWdfZGV2KHN0cnVjdCBtdGtfZXRoICpldGgpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTVRLX01BQ19DT1VOVDsgaSsrKSB7CisJCWlmICghZXRoLT5uZXRkZXZbaV0pCisJCQljb250aW51ZTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZXRoLT5uZXRkZXZbaV0pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG10a19jbGVhbnVwKHN0cnVjdCBtdGtfZXRoICpldGgpCit7CisJbXRrX3VucmVnX2RldihldGgpOworCW10a19mcmVlX2RldihldGgpOwogCWNhbmNlbF93b3JrX3N5bmMoJmV0aC0+cGVuZGluZ193b3JrKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG10a19nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3N0YXRpYyBpbnQgbXRrX2dldF9saW5rX2tzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwkJCQkgIHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCiB7Ci0Jc3RydWN0IG10a19tYWMgKm1hYyA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IGVycjsKKwlzdHJ1Y3QgbXRrX21hYyAqbWFjID0gbmV0ZGV2X3ByaXYobmRldik7CiAKLQllcnIgPSBwaHlfcmVhZF9zdGF0dXMobWFjLT5waHlfZGV2KTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAodW5saWtlbHkodGVzdF9iaXQoTVRLX1JFU0VUVElORywgJm1hYy0+aHctPnN0YXRlKSkpCisJCXJldHVybiAtRUJVU1k7CiAKLQlyZXR1cm4gcGh5X2V0aHRvb2xfZ3NldChtYWMtPnBoeV9kZXYsIGNtZCk7CisJcmV0dXJuIHBoeV9ldGh0b29sX2tzZXR0aW5nc19nZXQobmRldi0+cGh5ZGV2LCBjbWQpOwogfQogCi1zdGF0aWMgaW50IG10a19zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3N0YXRpYyBpbnQgbXRrX3NldF9saW5rX2tzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwkJCQkgIGNvbnN0IHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCiB7Ci0Jc3RydWN0IG10a19tYWMgKm1hYyA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG10a19tYWMgKm1hYyA9IG5ldGRldl9wcml2KG5kZXYpOwogCi0JaWYgKGNtZC0+cGh5X2FkZHJlc3MgIT0gbWFjLT5waHlfZGV2LT5tZGlvLmFkZHIpIHsKLQkJbWFjLT5waHlfZGV2ID0gbWRpb2J1c19nZXRfcGh5KG1hYy0+aHctPm1paV9idXMsCi0JCQkJCSAgICAgICBjbWQtPnBoeV9hZGRyZXNzKTsKLQkJaWYgKCFtYWMtPnBoeV9kZXYpCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQl9CisJaWYgKHVubGlrZWx5KHRlc3RfYml0KE1US19SRVNFVFRJTkcsICZtYWMtPmh3LT5zdGF0ZSkpKQorCQlyZXR1cm4gLUVCVVNZOwogCi0JcmV0dXJuIHBoeV9ldGh0b29sX3NzZXQobWFjLT5waHlfZGV2LCBjbWQpOworCXJldHVybiBwaHlfZXRodG9vbF9rc2V0dGluZ3Nfc2V0KG5kZXYtPnBoeWRldiwgY21kKTsKIH0KIAogc3RhdGljIHZvaWQgbXRrX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC0xNjE0LDcgKzIwODgsMTAgQEAKIHsKIAlzdHJ1Y3QgbXRrX21hYyAqbWFjID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCXJldHVybiBnZW5waHlfcmVzdGFydF9hbmVnKG1hYy0+cGh5X2Rldik7CisJaWYgKHVubGlrZWx5KHRlc3RfYml0KE1US19SRVNFVFRJTkcsICZtYWMtPmh3LT5zdGF0ZSkpKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmV0dXJuIGdlbnBoeV9yZXN0YXJ0X2FuZWcoZGV2LT5waHlkZXYpOwogfQogCiBzdGF0aWMgdTMyIG10a19nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMTYyMiwxMSArMjA5OSwxNCBAQAogCXN0cnVjdCBtdGtfbWFjICptYWMgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBlcnI7CiAKLQllcnIgPSBnZW5waHlfdXBkYXRlX2xpbmsobWFjLT5waHlfZGV2KTsKKwlpZiAodW5saWtlbHkodGVzdF9iaXQoTVRLX1JFU0VUVElORywgJm1hYy0+aHctPnN0YXRlKSkpCisJCXJldHVybiAtRUJVU1k7CisKKwllcnIgPSBnZW5waHlfdXBkYXRlX2xpbmsoZGV2LT5waHlkZXYpOwogCWlmIChlcnIpCiAJCXJldHVybiBldGh0b29sX29wX2dldF9saW5rKGRldik7CiAKLQlyZXR1cm4gbWFjLT5waHlfZGV2LT5saW5rOworCXJldHVybiBkZXYtPnBoeWRldi0+bGluazsKIH0KIAogc3RhdGljIHZvaWQgbXRrX2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICpkYXRhKQpAQCAtMTY2Miw2ICsyMTQyLDkgQEAKIAl1bnNpZ25lZCBpbnQgc3RhcnQ7CiAJaW50IGk7CiAKKwlpZiAodW5saWtlbHkodGVzdF9iaXQoTVRLX1JFU0VUVElORywgJm1hYy0+aHctPnN0YXRlKSkpCisJCXJldHVybjsKKwogCWlmIChuZXRpZl9ydW5uaW5nKGRldikgJiYgbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkgewogCQlpZiAoc3Bpbl90cnlsb2NrKCZod3N0YXRzLT5zdGF0c19sb2NrKSkgewogCQkJbXRrX3N0YXRzX3VwZGF0ZV9tYWMobWFjKTsKQEAgLTE2NjksOCArMjE1Miw5IEBACiAJCX0KIAl9CiAKKwlkYXRhX3NyYyA9ICh1NjQgKilod3N0YXRzOworCiAJZG8gewotCQlkYXRhX3NyYyA9ICh1NjQqKWh3c3RhdHM7CiAJCWRhdGFfZHN0ID0gZGF0YTsKIAkJc3RhcnQgPSB1NjRfc3RhdHNfZmV0Y2hfYmVnaW5faXJxKCZod3N0YXRzLT5zeW5jcCk7CiAKQEAgLTE2NzksOSArMjE2Myw2NSBAQAogCX0gd2hpbGUgKHU2NF9zdGF0c19mZXRjaF9yZXRyeV9pcnEoJmh3c3RhdHMtPnN5bmNwLCBzdGFydCkpOwogfQogCi1zdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG10a19ldGh0b29sX29wcyA9IHsKLQkuZ2V0X3NldHRpbmdzCQk9IG10a19nZXRfc2V0dGluZ3MsCi0JLnNldF9zZXR0aW5ncwkJPSBtdGtfc2V0X3NldHRpbmdzLAorc3RhdGljIGludCBtdGtfZ2V0X3J4bmZjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3J4bmZjICpjbWQsCisJCQkgdTMyICpydWxlX2xvY3MpCit7CisJaW50IHJldCA9IC1FT1BOT1RTVVBQOworCisJc3dpdGNoIChjbWQtPmNtZCkgeworCWNhc2UgRVRIVE9PTF9HUlhSSU5HUzoKKwkJaWYgKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0xSTykgeworCQkJY21kLT5kYXRhID0gTVRLX01BWF9SWF9SSU5HX05VTTsKKwkJCXJldCA9IDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFVEhUT09MX0dSWENMU1JMQ05UOgorCQlpZiAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfTFJPKSB7CisJCQlzdHJ1Y3QgbXRrX21hYyAqbWFjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCQkJY21kLT5ydWxlX2NudCA9IG1hYy0+aHdscm9faXBfY250OworCQkJcmV0ID0gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIEVUSFRPT0xfR1JYQ0xTUlVMRToKKwkJaWYgKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0xSTykKKwkJCXJldCA9IG10a19od2xyb19nZXRfZmRpcl9lbnRyeShkZXYsIGNtZCk7CisJCWJyZWFrOworCWNhc2UgRVRIVE9PTF9HUlhDTFNSTEFMTDoKKwkJaWYgKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0xSTykKKwkJCXJldCA9IG10a19od2xyb19nZXRfZmRpcl9hbGwoZGV2LCBjbWQsCisJCQkJCQkgICAgIHJ1bGVfbG9jcyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXRrX3NldF9yeG5mYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yeG5mYyAqY21kKQoreworCWludCByZXQgPSAtRU9QTk9UU1VQUDsKKworCXN3aXRjaCAoY21kLT5jbWQpIHsKKwljYXNlIEVUSFRPT0xfU1JYQ0xTUkxJTlM6CisJCWlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9MUk8pCisJCQlyZXQgPSBtdGtfaHdscm9fYWRkX2lwYWRkcihkZXYsIGNtZCk7CisJCWJyZWFrOworCWNhc2UgRVRIVE9PTF9TUlhDTFNSTERFTDoKKwkJaWYgKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0xSTykKKwkJCXJldCA9IG10a19od2xyb19kZWxfaXBhZGRyKGRldiwgY21kKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBtdGtfZXRodG9vbF9vcHMgPSB7CisJLmdldF9saW5rX2tzZXR0aW5ncwk9IG10a19nZXRfbGlua19rc2V0dGluZ3MsCisJLnNldF9saW5rX2tzZXR0aW5ncwk9IG10a19zZXRfbGlua19rc2V0dGluZ3MsCiAJLmdldF9kcnZpbmZvCQk9IG10a19nZXRfZHJ2aW5mbywKIAkuZ2V0X21zZ2xldmVsCQk9IG10a19nZXRfbXNnbGV2ZWwsCiAJLnNldF9tc2dsZXZlbAkJPSBtdGtfc2V0X21zZ2xldmVsLApAQCAtMTY5MCw2ICsyMjMwLDggQEAKIAkuZ2V0X3N0cmluZ3MJCT0gbXRrX2dldF9zdHJpbmdzLAogCS5nZXRfc3NldF9jb3VudAkJPSBtdGtfZ2V0X3NzZXRfY291bnQsCiAJLmdldF9ldGh0b29sX3N0YXRzCT0gbXRrX2dldF9ldGh0b29sX3N0YXRzLAorCS5nZXRfcnhuZmMJCT0gbXRrX2dldF9yeG5mYywKKwkuc2V0X3J4bmZjICAgICAgICAgICAgICA9IG10a19zZXRfcnhuZmMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIG10a19uZXRkZXZfb3BzID0gewpAQCAtMTcwNCw2ICsyMjQ2LDggQEAKIAkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCiAJLm5kb190eF90aW1lb3V0CQk9IG10a190eF90aW1lb3V0LAogCS5uZG9fZ2V0X3N0YXRzNjQgICAgICAgID0gbXRrX2dldF9zdGF0czY0LAorCS5uZG9fZml4X2ZlYXR1cmVzCT0gbXRrX2ZpeF9mZWF0dXJlcywKKwkubmRvX3NldF9mZWF0dXJlcwk9IG10a19zZXRfZmVhdHVyZXMsCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIAkubmRvX3BvbGxfY29udHJvbGxlcgk9IG10a19wb2xsX2NvbnRyb2xsZXIsCiAjZW5kaWYKQEAgLTE3NDIsNiArMjI4Niw5IEBACiAJbWFjLT5odyA9IGV0aDsKIAltYWMtPm9mX25vZGUgPSBucDsKIAorCW1lbXNldChtYWMtPmh3bHJvX2lwLCAwLCBzaXplb2YobWFjLT5od2xyb19pcCkpOworCW1hYy0+aHdscm9faXBfY250ID0gMDsKKwogCW1hYy0+aHdfc3RhdHMgPSBkZXZtX2t6YWxsb2MoZXRoLT5kZXYsCiAJCQkJICAgICBzaXplb2YoKm1hYy0+aHdfc3RhdHMpLAogCQkJCSAgICAgR0ZQX0tFUk5FTCk7CkBAIC0xNzUxLDI3ICsyMjk4LDI0IEBACiAJCWdvdG8gZnJlZV9uZXRkZXY7CiAJfQogCXNwaW5fbG9ja19pbml0KCZtYWMtPmh3X3N0YXRzLT5zdGF0c19sb2NrKTsKKwl1NjRfc3RhdHNfaW5pdCgmbWFjLT5od19zdGF0cy0+c3luY3ApOwogCW1hYy0+aHdfc3RhdHMtPnJlZ19vZmZzZXQgPSBpZCAqIE1US19TVEFUX09GRlNFVDsKIAogCVNFVF9ORVRERVZfREVWKGV0aC0+bmV0ZGV2W2lkXSwgZXRoLT5kZXYpOwogCWV0aC0+bmV0ZGV2W2lkXS0+d2F0Y2hkb2dfdGltZW8gPSA1ICogSFo7CiAJZXRoLT5uZXRkZXZbaWRdLT5uZXRkZXZfb3BzID0gJm10a19uZXRkZXZfb3BzOwogCWV0aC0+bmV0ZGV2W2lkXS0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpZXRoLT5iYXNlOworCisJZXRoLT5uZXRkZXZbaWRdLT5od19mZWF0dXJlcyA9IE1US19IV19GRUFUVVJFUzsKKwlpZiAoZXRoLT5od2xybykKKwkJZXRoLT5uZXRkZXZbaWRdLT5od19mZWF0dXJlcyB8PSBORVRJRl9GX0xSTzsKKwogCWV0aC0+bmV0ZGV2W2lkXS0+dmxhbl9mZWF0dXJlcyA9IE1US19IV19GRUFUVVJFUyAmCiAJCX4oTkVUSUZfRl9IV19WTEFOX0NUQUdfVFggfCBORVRJRl9GX0hXX1ZMQU5fQ1RBR19SWCk7CiAJZXRoLT5uZXRkZXZbaWRdLT5mZWF0dXJlcyB8PSBNVEtfSFdfRkVBVFVSRVM7CiAJZXRoLT5uZXRkZXZbaWRdLT5ldGh0b29sX29wcyA9ICZtdGtfZXRodG9vbF9vcHM7CiAKLQllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZXRoLT5uZXRkZXZbaWRdKTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoZXRoLT5kZXYsICJlcnJvciBicmluZ2luZyB1cCBkZXZpY2VcbiIpOwotCQlnb3RvIGZyZWVfbmV0ZGV2OwotCX0KIAlldGgtPm5ldGRldltpZF0tPmlycSA9IGV0aC0+aXJxWzBdOwotCW5ldGlmX2luZm8oZXRoLCBwcm9iZSwgZXRoLT5uZXRkZXZbaWRdLAotCQkgICAibWVkaWF0ZWsgZnJhbWUgZW5naW5lIGF0IDB4JTA4bHgsIGlycSAlZFxuIiwKLQkJICAgZXRoLT5uZXRkZXZbaWRdLT5iYXNlX2FkZHIsIGV0aC0+aXJxWzBdKTsKLQogCXJldHVybiAwOwogCiBmcmVlX25ldGRldjoKQEAgLTE3OTYsNiArMjM0MCw3IEBACiAJaWYgKCFldGgpCiAJCXJldHVybiAtRU5PTUVNOwogCisJZXRoLT5kZXYgPSAmcGRldi0+ZGV2OwogCWV0aC0+YmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwogCWlmIChJU19FUlIoZXRoLT5iYXNlKSkKIAkJcmV0dXJuIFBUUl9FUlIoZXRoLT5iYXNlKTsKQEAgLTE4MTcsMTEgKzIzNjIsNyBAQAogCQlyZXR1cm4gUFRSX0VSUihldGgtPnBjdGwpOwogCX0KIAotCWV0aC0+cnN0YyA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoJnBkZXYtPmRldiwgImV0aCIpOwotCWlmIChJU19FUlIoZXRoLT5yc3RjKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBldGggcmVzZXQgZm91bmRcbiIpOwotCQlyZXR1cm4gUFRSX0VSUihldGgtPnJzdGMpOwotCX0KKwlldGgtPmh3bHJvID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKHBkZXYtPmRldi5vZl9ub2RlLCAibWVkaWF0ZWssaHdscm8iKTsKIAogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKIAkJZXRoLT5pcnFbaV0gPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIGkpOwpAQCAtMTgzMCwyMSArMjM3MSwxNiBAQAogCQkJcmV0dXJuIC1FTlhJTzsKIAkJfQogCX0KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShldGgtPmNsa3MpOyBpKyspIHsKKwkJZXRoLT5jbGtzW2ldID0gZGV2bV9jbGtfZ2V0KGV0aC0+ZGV2LAorCQkJCQkgICAgbXRrX2Nsa3Nfc291cmNlX25hbWVbaV0pOworCQlpZiAoSVNfRVJSKGV0aC0+Y2xrc1tpXSkpIHsKKwkJCWlmIChQVFJfRVJSKGV0aC0+Y2xrc1tpXSkgPT0gLUVQUk9CRV9ERUZFUikKKwkJCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQogCi0JZXRoLT5jbGtfZXRoaWYgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgImV0aGlmIik7Ci0JZXRoLT5jbGtfZXN3ID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJlc3ciKTsKLQlldGgtPmNsa19ncDEgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgImdwMSIpOwotCWV0aC0+Y2xrX2dwMiA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAiZ3AyIik7Ci0JaWYgKElTX0VSUihldGgtPmNsa19lc3cpIHx8IElTX0VSUihldGgtPmNsa19ncDEpIHx8Ci0JICAgIElTX0VSUihldGgtPmNsa19ncDIpIHx8IElTX0VSUihldGgtPmNsa19ldGhpZikpCi0JCXJldHVybiAtRU5PREVWOwotCi0JY2xrX3ByZXBhcmVfZW5hYmxlKGV0aC0+Y2xrX2V0aGlmKTsKLQljbGtfcHJlcGFyZV9lbmFibGUoZXRoLT5jbGtfZXN3KTsKLQljbGtfcHJlcGFyZV9lbmFibGUoZXRoLT5jbGtfZ3AxKTsKLQljbGtfcHJlcGFyZV9lbmFibGUoZXRoLT5jbGtfZ3AyKTsKLQotCWV0aC0+ZGV2ID0gJnBkZXYtPmRldjsKIAlldGgtPm1zZ19lbmFibGUgPSBuZXRpZl9tc2dfaW5pdChtdGtfbXNnX2xldmVsLCBNVEtfREVGQVVMVF9NU0dfRU5BQkxFKTsKIAlJTklUX1dPUksoJmV0aC0+cGVuZGluZ193b3JrLCBtdGtfcGVuZGluZ193b3JrKTsKIApAQCAtMTg2Miw3ICsyMzk4LDM1IEBACiAKIAkJZXJyID0gbXRrX2FkZF9tYWMoZXRoLCBtYWNfbnApOwogCQlpZiAoZXJyKQotCQkJZ290byBlcnJfZnJlZV9kZXY7CisJCQlnb3RvIGVycl9kZWluaXRfaHc7CisJfQorCisJZXJyID0gZGV2bV9yZXF1ZXN0X2lycShldGgtPmRldiwgZXRoLT5pcnFbMV0sIG10a19oYW5kbGVfaXJxX3R4LCAwLAorCQkJICAgICAgIGRldl9uYW1lKGV0aC0+ZGV2KSwgZXRoKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mcmVlX2RldjsKKworCWVyciA9IGRldm1fcmVxdWVzdF9pcnEoZXRoLT5kZXYsIGV0aC0+aXJxWzJdLCBtdGtfaGFuZGxlX2lycV9yeCwgMCwKKwkJCSAgICAgICBkZXZfbmFtZShldGgtPmRldiksIGV0aCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfZnJlZV9kZXY7CisKKwllcnIgPSBtdGtfbWRpb19pbml0KGV0aCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfZnJlZV9kZXY7CisKKwlmb3IgKGkgPSAwOyBpIDwgTVRLX01BWF9ERVZTOyBpKyspIHsKKwkJaWYgKCFldGgtPm5ldGRldltpXSkKKwkJCWNvbnRpbnVlOworCisJCWVyciA9IHJlZ2lzdGVyX25ldGRldihldGgtPm5ldGRldltpXSk7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoZXRoLT5kZXYsICJlcnJvciBicmluZ2luZyB1cCBkZXZpY2VcbiIpOworCQkJZ290byBlcnJfZGVpbml0X21kaW87CisJCX0gZWxzZQorCQkJbmV0aWZfaW5mbyhldGgsIHByb2JlLCBldGgtPm5ldGRldltpXSwKKwkJCQkgICAibWVkaWF0ZWsgZnJhbWUgZW5naW5lIGF0IDB4JTA4bHgsIGlycSAlZFxuIiwKKwkJCQkgICBldGgtPm5ldGRldltpXS0+YmFzZV9hZGRyLCBldGgtPmlycVswXSk7CiAJfQogCiAJLyogd2UgcnVuIDIgZGV2aWNlcyBvbiB0aGUgc2FtZSBETUEgcmluZyBzbyB3ZSBuZWVkIGEgZHVtbXkgZGV2aWNlCkBAIC0xODc4LDI0ICsyNDQyLDM0IEBACiAKIAlyZXR1cm4gMDsKIAorZXJyX2RlaW5pdF9tZGlvOgorCW10a19tZGlvX2NsZWFudXAoZXRoKTsKIGVycl9mcmVlX2RldjoKLQltdGtfY2xlYW51cChldGgpOworCW10a19mcmVlX2RldihldGgpOworZXJyX2RlaW5pdF9odzoKKwltdGtfaHdfZGVpbml0KGV0aCk7CisKIAlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IG10a19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgbXRrX2V0aCAqZXRoID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IGk7CiAKLQljbGtfZGlzYWJsZV91bnByZXBhcmUoZXRoLT5jbGtfZXRoaWYpOwotCWNsa19kaXNhYmxlX3VucHJlcGFyZShldGgtPmNsa19lc3cpOwotCWNsa19kaXNhYmxlX3VucHJlcGFyZShldGgtPmNsa19ncDEpOwotCWNsa19kaXNhYmxlX3VucHJlcGFyZShldGgtPmNsa19ncDIpOworCS8qIHN0b3AgYWxsIGRldmljZXMgdG8gbWFrZSBzdXJlIHRoYXQgZG1hIGlzIHByb3Blcmx5IHNodXQgZG93biAqLworCWZvciAoaSA9IDA7IGkgPCBNVEtfTUFDX0NPVU5UOyBpKyspIHsKKwkJaWYgKCFldGgtPm5ldGRldltpXSkKKwkJCWNvbnRpbnVlOworCQltdGtfc3RvcChldGgtPm5ldGRldltpXSk7CisJfQorCisJbXRrX2h3X2RlaW5pdChldGgpOwogCiAJbmV0aWZfbmFwaV9kZWwoJmV0aC0+dHhfbmFwaSk7CiAJbmV0aWZfbmFwaV9kZWwoJmV0aC0+cnhfbmFwaSk7CiAJbXRrX2NsZWFudXAoZXRoKTsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwltdGtfbWRpb19jbGVhbnVwKGV0aCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE5MDQsNiArMjQ3OCw3IEBACiAJeyAuY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDc2MjMtZXRoIiB9LAogCXt9LAogfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG9mX210a19tYXRjaCk7CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG10a19kcml2ZXIgPSB7CiAJLnByb2JlID0gbXRrX3Byb2JlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVkaWF0ZWsvbXRrX2V0aF9zb2MuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lZGlhdGVrL210a19ldGhfc29jLmgKaW5kZXggZjgyZTNhYy4uMzAwMzE5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVkaWF0ZWsvbXRrX2V0aF9zb2MuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWRpYXRlay9tdGtfZXRoX3NvYy5oCkBAIC0zOSw3ICszOSwyMSBAQAogCQkJCSBORVRJRl9GX1NHIHwgTkVUSUZfRl9UU08gfCBcCiAJCQkJIE5FVElGX0ZfVFNPNiB8IFwKIAkJCQkgTkVUSUZfRl9JUFY2X0NTVU0pCi0jZGVmaW5lIE5FWFRfUlhfREVTUF9JRFgoWCkJKCgoWCkgKyAxKSAmIChNVEtfRE1BX1NJWkUgLSAxKSkKKyNkZWZpbmUgTkVYVF9SWF9ERVNQX0lEWChYLCBZKQkoKChYKSArIDEpICYgKChZKSAtIDEpKQorCisjZGVmaW5lIE1US19NQVhfUlhfUklOR19OVU0JNAorI2RlZmluZSBNVEtfSFdfTFJPX0RNQV9TSVpFCTgKKworI2RlZmluZQlNVEtfTUFYX0xST19SWF9MRU5HVEgJCSg0MDk2ICogMykKKyNkZWZpbmUJTVRLX01BWF9MUk9fSVBfQ05UCQkyCisjZGVmaW5lCU1US19IV19MUk9fVElNRVJfVU5JVAkJMQkvKiAyMCB1cyAqLworI2RlZmluZQlNVEtfSFdfTFJPX1JFRlJFU0hfVElNRQkJNTAwMDAJLyogMSBzZWMuICovCisjZGVmaW5lCU1US19IV19MUk9fQUdHX1RJTUUJCTEwCS8qIDIwMHVzICovCisjZGVmaW5lCU1US19IV19MUk9fQUdFX1RJTUUJCTUwCS8qIDFtcyAqLworI2RlZmluZQlNVEtfSFdfTFJPX01BWF9BR0dfQ05UCQk2NAorI2RlZmluZQlNVEtfSFdfTFJPX0JXX1RIUkUJCTMwMDAKKyNkZWZpbmUJTVRLX0hXX0xST19SRVBMQUNFX0RFTFRBCTEwMDAKKyNkZWZpbmUJTVRLX0hXX0xST19TRExfUkVNQUlOX1JPT00JMTUyMgogCiAvKiBGcmFtZSBFbmdpbmUgR2xvYmFsIFJlc2V0IFJlZ2lzdGVyICovCiAjZGVmaW5lIE1US19SU1RfR0wJCTB4MDQKQEAgLTUwLDYgKzY0LDkgQEAKICNkZWZpbmUgTVRLX0dETTFfQUYJCUJJVCgyOCkKICNkZWZpbmUgTVRLX0dETTJfQUYJCUJJVCgyOSkKIAorLyogUERNQSBIVyBMUk8gQWx0ZXIgRmxvdyBUaW1lciBSZWdpc3RlciAqLworI2RlZmluZSBNVEtfUERNQV9MUk9fQUxUX1JFRlJFU0hfVElNRVIJMHgxYworCiAvKiBGcmFtZSBFbmdpbmUgSW50ZXJydXB0IEdyb3VwaW5nIFJlZ2lzdGVyICovCiAjZGVmaW5lIE1US19GRV9JTlRfR1JQCQkweDIwCiAKQEAgLTY4LDEwICs4NSw3NyBAQAogLyogVW5pY2FzdCBGaWx0ZXIgTUFDIEFkZHJlc3MgUmVnaXN0ZXIgLSBIaWdoICovCiAjZGVmaW5lIE1US19HRE1BX01BQ19BRFJIKHgpCSgweDUwQyArICh4ICogMHgxMDAwKSkKIAorLyogUERNQSBSWCBCYXNlIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTVRLX1BSWF9CQVNFX1BUUjAJMHg5MDAKKyNkZWZpbmUgTVRLX1BSWF9CQVNFX1BUUl9DRkcoeCkJKE1US19QUlhfQkFTRV9QVFIwICsgKHggKiAweDEwKSkKKworLyogUERNQSBSWCBNYXhpbXVtIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lIE1US19QUlhfTUFYX0NOVDAJMHg5MDQKKyNkZWZpbmUgTVRLX1BSWF9NQVhfQ05UX0NGRyh4KQkoTVRLX1BSWF9NQVhfQ05UMCArICh4ICogMHgxMCkpCisKKy8qIFBETUEgUlggQ1BVIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTVRLX1BSWF9DUlhfSURYMAkweDkwOAorI2RlZmluZSBNVEtfUFJYX0NSWF9JRFhfQ0ZHKHgpCShNVEtfUFJYX0NSWF9JRFgwICsgKHggKiAweDEwKSkKKworLyogUERNQSBIVyBMUk8gQ29udHJvbCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgTVRLX1BETUFfTFJPX0NUUkxfRFcwCTB4OTgwCisjZGVmaW5lIE1US19MUk9fRU4JCQlCSVQoMCkKKyNkZWZpbmUgTVRLX0wzX0NLU19VUERfRU4JCUJJVCg3KQorI2RlZmluZSBNVEtfTFJPX0FMVF9QS1RfQ05UX01PREUJQklUKDIxKQorI2RlZmluZSBNVEtfTFJPX1JJTkdfUkVMSU5RVUlTSF9SRVEJKDB4NyA8PCAyNikKKyNkZWZpbmUgTVRLX0xST19SSU5HX1JFTElOUVVJU0hfRE9ORQkoMHg3IDw8IDI5KQorCisjZGVmaW5lIE1US19QRE1BX0xST19DVFJMX0RXMQkweDk4NAorI2RlZmluZSBNVEtfUERNQV9MUk9fQ1RSTF9EVzIJMHg5ODgKKyNkZWZpbmUgTVRLX1BETUFfTFJPX0NUUkxfRFczCTB4OThjCisjZGVmaW5lIE1US19BRE1BX01PREUJCUJJVCgxNSkKKyNkZWZpbmUgTVRLX0xST19NSU5fUlhEX1NETAkoTVRLX0hXX0xST19TRExfUkVNQUlOX1JPT00gPDwgMTYpCisKKy8qIFBETUEgR2xvYmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTVRLX1BETUFfR0xPX0NGRwkweGEwNAorI2RlZmluZSBNVEtfTVVMVElfRU4JCUJJVCgxMCkKKworLyogUERNQSBSZXNldCBJbmRleCBSZWdpc3RlciAqLworI2RlZmluZSBNVEtfUERNQV9SU1RfSURYCTB4YTA4CisjZGVmaW5lIE1US19QU1RfRFJYX0lEWDAJQklUKDE2KQorI2RlZmluZSBNVEtfUFNUX0RSWF9JRFhfQ0ZHKHgpCShNVEtfUFNUX0RSWF9JRFgwIDw8ICh4KSkKKworLyogUERNQSBEZWxheSBJbnRlcnJ1cHQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTVRLX1BETUFfREVMQVlfSU5UCTB4YTBjCisKKy8qIFBETUEgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBNVEtfUERNQV9JTlRfU1RBVFVTCTB4YTIwCisKKy8qIFBETUEgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTVRLX1BETUFfSU5UX01BU0sJMHhhMjgKKworLyogUERNQSBIVyBMUk8gQWx0ZXIgRmxvdyBEZWx0YSBSZWdpc3RlciAqLworI2RlZmluZSBNVEtfUERNQV9MUk9fQUxUX1NDT1JFX0RFTFRBCTB4YTRjCisKIC8qIFBETUEgSW50ZXJydXB0IGdyb3VwaW5nIHJlZ2lzdGVycyAqLwogI2RlZmluZSBNVEtfUERNQV9JTlRfR1JQMQkweGE1MAogI2RlZmluZSBNVEtfUERNQV9JTlRfR1JQMgkweGE1NAogCisvKiBQRE1BIEhXIExSTyBJUCBTZXR0aW5nIFJlZ2lzdGVycyAqLworI2RlZmluZSBNVEtfTFJPX1JYX1JJTkcwX0RJUF9EVzAJMHhiMDQKKyNkZWZpbmUgTVRLX0xST19ESVBfRFcwX0NGRyh4KQkJKE1US19MUk9fUlhfUklORzBfRElQX0RXMCArICh4ICogMHg0MCkpCisjZGVmaW5lIE1US19SSU5HX01ZSVBfVkxECQlCSVQoOSkKKworLyogUERNQSBIVyBMUk8gUmluZyBDb250cm9sIFJlZ2lzdGVycyAqLworI2RlZmluZSBNVEtfTFJPX1JYX1JJTkcwX0NUUkxfRFcxCTB4YjI4CisjZGVmaW5lIE1US19MUk9fUlhfUklORzBfQ1RSTF9EVzIJMHhiMmMKKyNkZWZpbmUgTVRLX0xST19SWF9SSU5HMF9DVFJMX0RXMwkweGIzMAorI2RlZmluZSBNVEtfTFJPX0NUUkxfRFcxX0NGRyh4KQkJKE1US19MUk9fUlhfUklORzBfQ1RSTF9EVzEgKyAoeCAqIDB4NDApKQorI2RlZmluZSBNVEtfTFJPX0NUUkxfRFcyX0NGRyh4KQkJKE1US19MUk9fUlhfUklORzBfQ1RSTF9EVzIgKyAoeCAqIDB4NDApKQorI2RlZmluZSBNVEtfTFJPX0NUUkxfRFczX0NGRyh4KQkJKE1US19MUk9fUlhfUklORzBfQ1RSTF9EVzMgKyAoeCAqIDB4NDApKQorI2RlZmluZSBNVEtfUklOR19BR0VfVElNRV9MCQkoKE1US19IV19MUk9fQUdFX1RJTUUgJiAweDNmZikgPDwgMjIpCisjZGVmaW5lIE1US19SSU5HX0FHRV9USU1FX0gJCSgoTVRLX0hXX0xST19BR0VfVElNRSA+PiAxMCkgJiAweDNmKQorI2RlZmluZSBNVEtfUklOR19BVVRPX0xFUkFOX01PREUJKDMgPDwgNikKKyNkZWZpbmUgTVRLX1JJTkdfVkxECQkJQklUKDgpCisjZGVmaW5lIE1US19SSU5HX01BWF9BR0dfVElNRQkJKChNVEtfSFdfTFJPX0FHR19USU1FICYgMHhmZmZmKSA8PCAxMCkKKyNkZWZpbmUgTVRLX1JJTkdfTUFYX0FHR19DTlRfTAkJKChNVEtfSFdfTFJPX01BWF9BR0dfQ05UICYgMHgzZikgPDwgMjYpCisjZGVmaW5lIE1US19SSU5HX01BWF9BR0dfQ05UX0gJCSgoTVRLX0hXX0xST19NQVhfQUdHX0NOVCA+PiA2KSAmIDB4MykKKwogLyogUURNQSBUWCBRdWV1ZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVycyAqLwogI2RlZmluZSBNVEtfUVRYX0NGRyh4KQkJKDB4MTgwMCArICh4ICogMHgxMCkpCiAjZGVmaW5lIFFETUFfUkVTX1RIUkVTCQk0CkBAIC0xMDYsNyArMTkwLDYgQEAKIAogLyogUURNQSBSZXNldCBJbmRleCBSZWdpc3RlciAqLwogI2RlZmluZSBNVEtfUURNQV9SU1RfSURYCTB4MUEwOAotI2RlZmluZSBNVEtfUFNUX0RSWF9JRFgwCUJJVCgxNikKIAogLyogUURNQSBEZWxheSBJbnRlcnJ1cHQgUmVnaXN0ZXIgKi8KICNkZWZpbmUgTVRLX1FETUFfREVMQVlfSU5UCTB4MUEwQwpAQCAtMTE5LDEzICsyMDIsMTYgQEAKIAogLyogUURNQSBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCiAjZGVmaW5lIE1US19RTVRLX0lOVF9TVEFUVVMJMHgxQTE4CisjZGVmaW5lIE1US19SWF9ET05FX0lOVDMJQklUKDE5KQorI2RlZmluZSBNVEtfUlhfRE9ORV9JTlQyCUJJVCgxOCkKICNkZWZpbmUgTVRLX1JYX0RPTkVfSU5UMQlCSVQoMTcpCiAjZGVmaW5lIE1US19SWF9ET05FX0lOVDAJQklUKDE2KQogI2RlZmluZSBNVEtfVFhfRE9ORV9JTlQzCUJJVCgzKQogI2RlZmluZSBNVEtfVFhfRE9ORV9JTlQyCUJJVCgyKQogI2RlZmluZSBNVEtfVFhfRE9ORV9JTlQxCUJJVCgxKQogI2RlZmluZSBNVEtfVFhfRE9ORV9JTlQwCUJJVCgwKQotI2RlZmluZSBNVEtfUlhfRE9ORV9JTlQJCShNVEtfUlhfRE9ORV9JTlQwIHwgTVRLX1JYX0RPTkVfSU5UMSkKKyNkZWZpbmUgTVRLX1JYX0RPTkVfSU5UCQkoTVRLX1JYX0RPTkVfSU5UMCB8IE1US19SWF9ET05FX0lOVDEgfCBcCisJCQkJIE1US19SWF9ET05FX0lOVDIgfCBNVEtfUlhfRE9ORV9JTlQzKQogI2RlZmluZSBNVEtfVFhfRE9ORV9JTlQJCShNVEtfVFhfRE9ORV9JTlQwIHwgTVRLX1RYX0RPTkVfSU5UMSB8IFwKIAkJCQkgTVRLX1RYX0RPTkVfSU5UMiB8IE1US19UWF9ET05FX0lOVDMpCiAKQEAgLTIyNyw2ICszMTMsMzAgQEAKIAkJCQkgTUFDX01DUl9GT1JDRV9UWF9GQyB8IE1BQ19NQ1JfU1BFRURfMTAwMCB8IFwKIAkJCQkgTUFDX01DUl9GT1JDRV9EUFggfCBNQUNfTUNSX0ZPUkNFX0xJTkspCiAKKy8qIFRSR01JSSBSWEMgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBUUkdNSUlfUkNLX0NUUkwJCTB4MTAzMDAKKyNkZWZpbmUgRFFTSTAoeCkJCSgoeCA8PCAwKSAmIEdFTk1BU0soNiwgMCkpCisjZGVmaW5lIERRU0kxKHgpCQkoKHggPDwgOCkgJiBHRU5NQVNLKDE0LCA4KSkKKyNkZWZpbmUgUlhDVExfRE1XVExBVCh4KQkoKHggPDwgMTYpICYgR0VOTUFTSygxOCwgMTYpKQorI2RlZmluZSBSWENfRFFTSVNFTAkJQklUKDMwKQorI2RlZmluZSBSQ0tfQ1RSTF9SR01JSV8xMDAwCShSWENfRFFTSVNFTCB8IFJYQ1RMX0RNV1RMQVQoMikgfCBEUVNJMSgxNikpCisjZGVmaW5lIFJDS19DVFJMX1JHTUlJXzEwXzEwMAlSWENUTF9ETVdUTEFUKDIpCisKKy8qIFRSR01JSSBSWEMgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBUUkdNSUlfVENLX0NUUkwJCTB4MTAzNDAKKyNkZWZpbmUgVFhDVExfRE1XVExBVCh4KQkoKHggPDwgMTYpICYgR0VOTUFTSygxOCwgMTYpKQorI2RlZmluZSBUWENfSU5WCQkJQklUKDMwKQorI2RlZmluZSBUQ0tfQ1RSTF9SR01JSV8xMDAwCVRYQ1RMX0RNV1RMQVQoMikKKyNkZWZpbmUgVENLX0NUUkxfUkdNSUlfMTBfMTAwCShUWENfSU5WIHwgVFhDVExfRE1XVExBVCgyKSkKKworLyogVFJHTUlJIEludGVyZmFjZSBtb2RlIHJlZ2lzdGVyICovCisjZGVmaW5lIElOVEZfTU9ERQkJMHgxMDM5MAorI2RlZmluZSBUUkdNSUlfSU5URl9ESVMJCUJJVCgwKQorI2RlZmluZSBUUkdNSUlfTU9ERQkJQklUKDEpCisjZGVmaW5lIFRSR01JSV9DRU5UUkFMX0FMSUdORUQJQklUKDIpCisjZGVmaW5lIElOVEZfTU9ERV9SR01JSV8xMDAwICAgIChUUkdNSUlfTU9ERSB8IFRSR01JSV9DRU5UUkFMX0FMSUdORUQpCisjZGVmaW5lIElOVEZfTU9ERV9SR01JSV8xMF8xMDAgIDAKKwogLyogR1BJTyBwb3J0IGNvbnRyb2wgcmVnaXN0ZXJzIGZvciBHTUFDIDIqLwogI2RlZmluZSBHUElPX09EMzNfQ1RSTDgJCTB4NGMwCiAjZGVmaW5lIEdQSU9fQklBU19DVFJMCQkweGVkMApAQCAtMjM3LDYgKzM0NywxNSBAQAogI2RlZmluZSBTWVNDRkcwX0dFX01BU0sJCTB4MwogI2RlZmluZSBTWVNDRkcwX0dFX01PREUoeCwgeSkJKHggPDwgKDEyICsgKHkgKiAyKSkpCiAKKy8qIGV0aGVybmV0IHN1YnN5c3RlbSBjbG9jayByZWdpc3RlciAqLworI2RlZmluZSBFVEhTWVNfQ0xLQ0ZHMAkJMHgyYworI2RlZmluZSBFVEhTWVNfVFJHTUlJX0NMS19TRUwzNjJfNQlCSVQoMTEpCisKKy8qIGV0aGVybmV0IHJlc2V0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRVRIU1lTX1JTVENUUkwJCTB4MzQKKyNkZWZpbmUgUlNUQ1RSTF9GRQkJQklUKDYpCisjZGVmaW5lIFJTVENUUkxfUFBFCQlCSVQoMzEpCisKIHN0cnVjdCBtdGtfcnhfZG1hIHsKIAl1bnNpZ25lZCBpbnQgcnhkMTsKIAl1bnNpZ25lZCBpbnQgcnhkMjsKQEAgLTI5MCw2ICs0MDksMjMgQEAKIAlNVEtfVFhfRkxBR1NfUEFHRTAJPSAweDAyLAogfTsKIAorLyogVGhpcyBlbnVtIGFsbG93cyB1cyB0byBpZGVudGlmeSBob3cgdGhlIGNsb2NrIGlzIGRlZmluZWQgb24gdGhlIGFycmF5IG9mIHRoZQorICogY2xvY2sgaW4gdGhlIG9yZGVyCisgKi8KK2VudW0gbXRrX2Nsa3NfbWFwIHsKKwlNVEtfQ0xLX0VUSElGLAorCU1US19DTEtfRVNXLAorCU1US19DTEtfR1AxLAorCU1US19DTEtfR1AyLAorCU1US19DTEtfVFJHUExMLAorCU1US19DTEtfTUFYCit9OworCitlbnVtIG10a19kZXZfc3RhdGUgeworCU1US19IV19JTklULAorCU1US19SRVNFVFRJTkcKK307CisKIC8qIHN0cnVjdCBtdGtfdHhfYnVmIC0JVGhpcyBzdHJ1Y3QgaG9sZHMgdGhlIHBvaW50ZXJzIHRvIHRoZSBtZW1vcnkgcG9pbnRlZCBhdAogICoJCQlieSB0aGUgVFggZGVzY3JpcHRvcglzCiAgKiBAc2tiOgkJVGhlIFNLQiBwb2ludGVyIG9mIHRoZSBwYWNrZXQgYmVpbmcgc2VudApAQCAtMzI3LDYgKzQ2MywxMiBAQAogCWF0b21pY190IGZyZWVfY291bnQ7CiB9OwogCisvKiBQRE1BIHJ4IHJpbmcgbW9kZSAqLworZW51bSBtdGtfcnhfZmxhZ3MgeworCU1US19SWF9GTEFHU19OT1JNQUwgPSAwLAorCU1US19SWF9GTEFHU19IV0xSTywKK307CisKIC8qIHN0cnVjdCBtdGtfcnhfcmluZyAtCVRoaXMgc3RydWN0IGhvbGRzIGluZm8gZGVzY3JpYmluZyBhIFJYIHJpbmcKICAqIEBkbWE6CQlUaGUgZGVzY3JpcHRvciByaW5nCiAgKiBAZGF0YToJCVRoZSBtZW1vcnkgcG9pbnRlZCBhdCBieSB0aGUgcmluZwpAQCAtMzQxLDcgKzQ4MywxMCBAQAogCWRtYV9hZGRyX3QgcGh5czsKIAl1MTYgZnJhZ19zaXplOwogCXUxNiBidWZfc2l6ZTsKKwl1MTYgZG1hX3NpemU7CisJYm9vbCBjYWxjX2lkeF91cGRhdGU7CiAJdTE2IGNhbGNfaWR4OworCXUzMiBjcnhfaWR4X3JlZzsKIH07CiAKIC8qIGN1cnJlbnRseSBubyBTb0MgaGFzIG1vcmUgdGhhbiAyIG1hY3MgKi8KQEAgLTM3MCwxOCArNTE1LDE1IEBACiAgKiBAc2NyYXRjaF9yaW5nOglOZXdlciBTb0NzIG5lZWQgbWVtb3J5IGZvciBhIHNlY29uZCBIVyBtYW5hZ2VkIFRYIHJpbmcKICAqIEBwaHlfc2NyYXRjaF9yaW5nOglwaHlzaWNhbCBhZGRyZXNzIG9mIHNjcmF0Y2hfcmluZwogICogQHNjcmF0Y2hfaGVhZDoJVGhlIHNjcmF0Y2ggbWVtb3J5IHRoYXQgc2NyYXRjaF9yaW5nIHBvaW50cyB0by4KLSAqIEBjbGtfZXRoaWY6CQlUaGUgZXRoaWYgY2xvY2sKLSAqIEBjbGtfZXN3OgkJVGhlIHN3aXRjaCBjbG9jawotICogQGNsa19ncDE6CQlUaGUgZ21hYzEgY2xvY2sKLSAqIEBjbGtfZ3AyOgkJVGhlIGdtYWMyIGNsb2NrCisgKiBAY2xrczoJCWNsb2NrIGFycmF5IGZvciBhbGwgY2xvY2tzIHJlcXVpcmVkCiAgKiBAbWlpX2J1czoJCUlmIHRoZXJlIGlzIGEgYnVzIHdlIG5lZWQgdG8gY3JlYXRlIGFuIGluc3RhbmNlIGZvciBpdAogICogQHBlbmRpbmdfd29yazoJVGhlIHdvcmtxdWV1ZSB1c2VkIHRvIHJlc2V0IHRoZSBkbWEgcmluZworICogQHN0YXRlICAgICAgICAgICAgICAgSW5pdGlhbGl6YXRpb24gYW5kIHJ1bnRpbWUgc3RhdGUgb2YgdGhlIGRldmljZS4KICAqLwogCiBzdHJ1Y3QgbXRrX2V0aCB7CiAJc3RydWN0IGRldmljZQkJCSpkZXY7CiAJdm9pZCBfX2lvbWVtCQkJKmJhc2U7Ci0Jc3RydWN0IHJlc2V0X2NvbnRyb2wJCSpyc3RjOwogCXNwaW5sb2NrX3QJCQlwYWdlX2xvY2s7CiAJc3BpbmxvY2tfdAkJCWlycV9sb2NrOwogCXN0cnVjdCBuZXRfZGV2aWNlCQlkdW1teV9kZXY7CkBAIC0zOTIsMzYgKzUzNCw0MSBAQAogCXVuc2lnbmVkIGxvbmcJCQlzeXNjbGs7CiAJc3RydWN0IHJlZ21hcAkJCSpldGhzeXM7CiAJc3RydWN0IHJlZ21hcAkJCSpwY3RsOworCWJvb2wJCQkJaHdscm87CiAJYXRvbWljX3QJCQlkbWFfcmVmY250OwogCXN0cnVjdCBtdGtfdHhfcmluZwkJdHhfcmluZzsKLQlzdHJ1Y3QgbXRrX3J4X3JpbmcJCXJ4X3Jpbmc7CisJc3RydWN0IG10a19yeF9yaW5nCQlyeF9yaW5nW01US19NQVhfUlhfUklOR19OVU1dOwogCXN0cnVjdCBuYXBpX3N0cnVjdAkJdHhfbmFwaTsKIAlzdHJ1Y3QgbmFwaV9zdHJ1Y3QJCXJ4X25hcGk7CiAJc3RydWN0IG10a190eF9kbWEJCSpzY3JhdGNoX3Jpbmc7CiAJZG1hX2FkZHJfdAkJCXBoeV9zY3JhdGNoX3Jpbmc7CiAJdm9pZAkJCQkqc2NyYXRjaF9oZWFkOwotCXN0cnVjdCBjbGsJCQkqY2xrX2V0aGlmOwotCXN0cnVjdCBjbGsJCQkqY2xrX2VzdzsKLQlzdHJ1Y3QgY2xrCQkJKmNsa19ncDE7Ci0Jc3RydWN0IGNsawkJCSpjbGtfZ3AyOworCXN0cnVjdCBjbGsJCQkqY2xrc1tNVEtfQ0xLX01BWF07CisKIAlzdHJ1Y3QgbWlpX2J1cwkJCSptaWlfYnVzOwogCXN0cnVjdCB3b3JrX3N0cnVjdAkJcGVuZGluZ193b3JrOworCXVuc2lnbmVkIGxvbmcJCQlzdGF0ZTsKIH07CiAKIC8qIHN0cnVjdCBtdGtfbWFjIC0JdGhlIHN0cnVjdHVyZSB0aGF0IGhvbGRzIHRoZSBpbmZvIGFib3V0IHRoZSBNQUNzIG9mIHRoZQogICoJCQlTb0MKICAqIEBpZDoJCQlUaGUgbnVtYmVyIG9mIHRoZSBNQUMKKyAqIEBnZV9tb2RlOiAgICAgICAgICAgIEludGVyZmFjZSBtb2RlIGtlcHQgZm9yIHNldHVwIHJlc3RvcmluZwogICogQG9mX25vZGU6CQlPdXIgZGV2aWNldHJlZSBub2RlCiAgKiBAaHc6CQkJQmFja3BvaW50ZXIgdG8gb3VyIG1haW4gZGF0YXN0cnV0dXJlCiAgKiBAaHdfc3RhdHM6CQlQYWNrZXQgc3RhdGlzdGljcyBjb3VudGVyCi0gKiBAcGh5X2RldjoJCVRoZSBhdHRhY2hlZCBQSFkgaWYgYXZhaWxhYmxlCisgKiBAdHJnbWlpCQlJbmRpY2F0ZSBpZiB0aGUgTUFDIHVzZXMgVFJHTUlJIGNvbm5lY3RlZCB0byBpbnRlcm5hbAorCQkJc3dpdGNoCiAgKi8KIHN0cnVjdCBtdGtfbWFjIHsKIAlpbnQJCQkJaWQ7CisJaW50CQkJCWdlX21vZGU7CiAJc3RydWN0IGRldmljZV9ub2RlCQkqb2Zfbm9kZTsKIAlzdHJ1Y3QgbXRrX2V0aAkJCSpodzsKIAlzdHJ1Y3QgbXRrX2h3X3N0YXRzCQkqaHdfc3RhdHM7Ci0Jc3RydWN0IHBoeV9kZXZpY2UJCSpwaHlfZGV2OworCV9fYmUzMgkJCQlod2xyb19pcFtNVEtfTUFYX0xST19JUF9DTlRdOworCWludAkJCQlod2xyb19pcF9jbnQ7CisJYm9vbAkJCQl0cmdtaWk7CiB9OwogCiAvKiB0aGUgc3RydWN0IGRlc2NyaWJpbmcgdGhlIFNvQy4gdGhlc2UgYXJlIGRlY2xhcmVkIGluIHRoZSBzb2NfeHl6LmMgZmlsZXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvY21kLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2NtZC5jCmluZGV4IGYwNGE0MjMuLmIxY2VmN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvY21kLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9jbWQuYwpAQCAtNzg1LDE3ICs3ODUsMjMgQEAKIAkJcmV0dXJuIG1seDRfY21kX3Jlc2V0X2Zsb3coZGV2LCBvcCwgb3BfbW9kaWZpZXIsIC1FSU8pOwogCiAJaWYgKCFtbHg0X2lzX21mdW5jKGRldikgfHwgKG5hdGl2ZSAmJiBtbHg0X2lzX21hc3RlcihkZXYpKSkgeworCQlpbnQgcmV0OworCiAJCWlmIChkZXYtPnBlcnNpc3QtPnN0YXRlICYgTUxYNF9ERVZJQ0VfU1RBVEVfSU5URVJOQUxfRVJST1IpCiAJCQlyZXR1cm4gbWx4NF9pbnRlcm5hbF9lcnJfcmV0X3ZhbHVlKGRldiwgb3AsCiAJCQkJCQkJICBvcF9tb2RpZmllcik7CisJCWRvd25fcmVhZCgmbWx4NF9wcml2KGRldiktPmNtZC5zd2l0Y2hfc2VtKTsKIAkJaWYgKG1seDRfcHJpdihkZXYpLT5jbWQudXNlX2V2ZW50cykKLQkJCXJldHVybiBtbHg0X2NtZF93YWl0KGRldiwgaW5fcGFyYW0sIG91dF9wYXJhbSwKLQkJCQkJICAgICBvdXRfaXNfaW1tLCBpbl9tb2RpZmllciwKLQkJCQkJICAgICBvcF9tb2RpZmllciwgb3AsIHRpbWVvdXQpOworCQkJcmV0ID0gbWx4NF9jbWRfd2FpdChkZXYsIGluX3BhcmFtLCBvdXRfcGFyYW0sCisJCQkJCSAgICBvdXRfaXNfaW1tLCBpbl9tb2RpZmllciwKKwkJCQkJICAgIG9wX21vZGlmaWVyLCBvcCwgdGltZW91dCk7CiAJCWVsc2UKLQkJCXJldHVybiBtbHg0X2NtZF9wb2xsKGRldiwgaW5fcGFyYW0sIG91dF9wYXJhbSwKLQkJCQkJICAgICBvdXRfaXNfaW1tLCBpbl9tb2RpZmllciwKLQkJCQkJICAgICBvcF9tb2RpZmllciwgb3AsIHRpbWVvdXQpOworCQkJcmV0ID0gbWx4NF9jbWRfcG9sbChkZXYsIGluX3BhcmFtLCBvdXRfcGFyYW0sCisJCQkJCSAgICBvdXRfaXNfaW1tLCBpbl9tb2RpZmllciwKKwkJCQkJICAgIG9wX21vZGlmaWVyLCBvcCwgdGltZW91dCk7CisKKwkJdXBfcmVhZCgmbWx4NF9wcml2KGRldiktPmNtZC5zd2l0Y2hfc2VtKTsKKwkJcmV0dXJuIHJldDsKIAl9CiAJcmV0dXJuIG1seDRfc2xhdmVfY21kKGRldiwgaW5fcGFyYW0sIG91dF9wYXJhbSwgb3V0X2lzX2ltbSwKIAkJCSAgICAgIGluX21vZGlmaWVyLCBvcF9tb2RpZmllciwgb3AsIHRpbWVvdXQpOwpAQCAtMTg0NSw2ICsxODUxLDcgQEAKIAogCWlmICh2cF9vcGVyLT5zdGF0ZS5kZWZhdWx0X3ZsYW4gPT0gdnBfYWRtaW4tPmRlZmF1bHRfdmxhbiAmJgogCSAgICB2cF9vcGVyLT5zdGF0ZS5kZWZhdWx0X3FvcyA9PSB2cF9hZG1pbi0+ZGVmYXVsdF9xb3MgJiYKKwkgICAgdnBfb3Blci0+c3RhdGUudmxhbl9wcm90byA9PSB2cF9hZG1pbi0+dmxhbl9wcm90byAmJgogCSAgICB2cF9vcGVyLT5zdGF0ZS5saW5rX3N0YXRlID09IHZwX2FkbWluLT5saW5rX3N0YXRlICYmCiAJICAgIHZwX29wZXItPnN0YXRlLnFvc192cG9ydCA9PSB2cF9hZG1pbi0+cW9zX3Zwb3J0KQogCQlyZXR1cm4gMDsKQEAgLTE5MDMsNiArMTkxMCw3IEBACiAKIAl2cF9vcGVyLT5zdGF0ZS5kZWZhdWx0X3ZsYW4gPSB2cF9hZG1pbi0+ZGVmYXVsdF92bGFuOwogCXZwX29wZXItPnN0YXRlLmRlZmF1bHRfcW9zID0gdnBfYWRtaW4tPmRlZmF1bHRfcW9zOworCXZwX29wZXItPnN0YXRlLnZsYW5fcHJvdG8gPSB2cF9hZG1pbi0+dmxhbl9wcm90bzsKIAl2cF9vcGVyLT5zdGF0ZS5saW5rX3N0YXRlID0gdnBfYWRtaW4tPmxpbmtfc3RhdGU7CiAJdnBfb3Blci0+c3RhdGUucW9zX3Zwb3J0ID0gdnBfYWRtaW4tPnFvc192cG9ydDsKIApAQCAtMTkxNiw2ICsxOTI0LDcgQEAKIAl3b3JrLT5xb3NfdnBvcnQgPSB2cF9vcGVyLT5zdGF0ZS5xb3NfdnBvcnQ7CiAJd29yay0+dmxhbl9pZCA9IHZwX29wZXItPnN0YXRlLmRlZmF1bHRfdmxhbjsKIAl3b3JrLT52bGFuX2l4ID0gdnBfb3Blci0+dmxhbl9pZHg7CisJd29yay0+dmxhbl9wcm90byA9IHZwX29wZXItPnN0YXRlLnZsYW5fcHJvdG87CiAJd29yay0+cHJpdiA9IHByaXY7CiAJSU5JVF9XT1JLKCZ3b3JrLT53b3JrLCBtbHg0X3ZmX2ltbWVkX3ZsYW5fd29ya19oYW5kbGVyKTsKIAlxdWV1ZV93b3JrKHByaXYtPm1mdW5jLm1hc3Rlci5jb21tX3dxLCAmd29yay0+d29yayk7CkBAIC0xOTg2LDYgKzE5OTUsOCBAQAogCWludCBwb3J0LCBlcnI7CiAJc3RydWN0IG1seDRfdnBvcnRfc3RhdGUgKnZwX2FkbWluOwogCXN0cnVjdCBtbHg0X3Zwb3J0X29wZXJfc3RhdGUgKnZwX29wZXI7CisJc3RydWN0IG1seDRfc2xhdmVfc3RhdGUgKnNsYXZlX3N0YXRlID0KKwkJJnByaXYtPm1mdW5jLm1hc3Rlci5zbGF2ZV9zdGF0ZVtzbGF2ZV07CiAJc3RydWN0IG1seDRfYWN0aXZlX3BvcnRzIGFjdHZfcG9ydHMgPSBtbHg0X2dldF9hY3RpdmVfcG9ydHMoCiAJCQkmcHJpdi0+ZGV2LCBzbGF2ZSk7CiAJaW50IG1pbl9wb3J0ID0gZmluZF9maXJzdF9iaXQoYWN0dl9wb3J0cy5wb3J0cywKQEAgLTIwMDAsMTIgKzIwMTEsMjYgQEAKIAkJCXByaXYtPm1mdW5jLm1hc3Rlci52Zl9hZG1pbltzbGF2ZV0uZW5hYmxlX3NtaVtwb3J0XTsKIAkJdnBfb3BlciA9ICZwcml2LT5tZnVuYy5tYXN0ZXIudmZfb3BlcltzbGF2ZV0udnBvcnRbcG9ydF07CiAJCXZwX2FkbWluID0gJnByaXYtPm1mdW5jLm1hc3Rlci52Zl9hZG1pbltzbGF2ZV0udnBvcnRbcG9ydF07Ci0JCXZwX29wZXItPnN0YXRlID0gKnZwX2FkbWluOworCQlpZiAodnBfYWRtaW4tPnZsYW5fcHJvdG8gIT0gaHRvbnMoRVRIX1BfODAyMUFEKSB8fAorCQkgICAgc2xhdmVfc3RhdGUtPnZzdF9xaW5xX3N1cHBvcnRlZCkgeworCQkJdnBfb3Blci0+c3RhdGUudmxhbl9wcm90byAgID0gdnBfYWRtaW4tPnZsYW5fcHJvdG87CisJCQl2cF9vcGVyLT5zdGF0ZS5kZWZhdWx0X3ZsYW4gPSB2cF9hZG1pbi0+ZGVmYXVsdF92bGFuOworCQkJdnBfb3Blci0+c3RhdGUuZGVmYXVsdF9xb3MgID0gdnBfYWRtaW4tPmRlZmF1bHRfcW9zOworCQl9CisJCXZwX29wZXItPnN0YXRlLmxpbmtfc3RhdGUgPSB2cF9hZG1pbi0+bGlua19zdGF0ZTsKKwkJdnBfb3Blci0+c3RhdGUubWFjICAgICAgICA9IHZwX2FkbWluLT5tYWM7CisJCXZwX29wZXItPnN0YXRlLnNwb29mY2hrICAgPSB2cF9hZG1pbi0+c3Bvb2ZjaGs7CisJCXZwX29wZXItPnN0YXRlLnR4X3JhdGUgICAgPSB2cF9hZG1pbi0+dHhfcmF0ZTsKKwkJdnBfb3Blci0+c3RhdGUucW9zX3Zwb3J0ICA9IHZwX2FkbWluLT5xb3NfdnBvcnQ7CisJCXZwX29wZXItPnN0YXRlLmd1aWQgICAgICAgPSB2cF9hZG1pbi0+Z3VpZDsKKwogCQlpZiAoTUxYNF9WR1QgIT0gdnBfYWRtaW4tPmRlZmF1bHRfdmxhbikgewogCQkJZXJyID0gX19tbHg0X3JlZ2lzdGVyX3ZsYW4oJnByaXYtPmRldiwgcG9ydCwKIAkJCQkJCSAgIHZwX2FkbWluLT5kZWZhdWx0X3ZsYW4sICYodnBfb3Blci0+dmxhbl9pZHgpKTsKIAkJCWlmIChlcnIpIHsKIAkJCQl2cF9vcGVyLT52bGFuX2lkeCA9IE5PX0lORFg7CisJCQkJdnBfb3Blci0+c3RhdGUuZGVmYXVsdF92bGFuID0gTUxYNF9WR1Q7CisJCQkJdnBfb3Blci0+c3RhdGUudmxhbl9wcm90byA9IGh0b25zKEVUSF9QXzgwMjFRKTsKIAkJCQltbHg0X3dhcm4oJnByaXYtPmRldiwKIAkJCQkJICAiTm8gdmxhbiByZXNvdXJjZXMgc2xhdmUgJWQsIHBvcnQgJWRcbiIsCiAJCQkJCSAgc2xhdmUsIHBvcnQpOwpAQCAtMjA4Niw2ICsyMTExLDcgQEAKIAkJbWx4NF93YXJuKGRldiwgIlJlY2VpdmVkIHJlc2V0IGZyb20gc2xhdmU6JWRcbiIsIHNsYXZlKTsKIAkJc2xhdmVfc3RhdGVbc2xhdmVdLmFjdGl2ZSA9IGZhbHNlOwogCQlzbGF2ZV9zdGF0ZVtzbGF2ZV0ub2xkX3ZsYW5fYXBpID0gZmFsc2U7CisJCXNsYXZlX3N0YXRlW3NsYXZlXS52c3RfcWlucV9zdXBwb3J0ZWQgPSBmYWxzZTsKIAkJbWx4NF9tYXN0ZXJfZGVhY3RpdmF0ZV9hZG1pbl9zdGF0ZShwcml2LCBzbGF2ZSk7CiAJCWZvciAoaSA9IDA7IGkgPCBNTFg0X0VWRU5UX1RZUEVTX05VTTsgKytpKSB7CiAJCQkJc2xhdmVfc3RhdGVbc2xhdmVdLmV2ZW50X2VxW2ldLmVxbiA9IC0xOwpAQCAtMjM1Myw2ICsyMzc5LDcgQEAKIAkJCXZmX29wZXIgPSAmcHJpdi0+bWZ1bmMubWFzdGVyLnZmX29wZXJbaV07CiAJCQlzX3N0YXRlID0gJnByaXYtPm1mdW5jLm1hc3Rlci5zbGF2ZV9zdGF0ZVtpXTsKIAkJCXNfc3RhdGUtPmxhc3RfY21kID0gTUxYNF9DT01NX0NNRF9SRVNFVDsKKwkJCXNfc3RhdGUtPnZzdF9xaW5xX3N1cHBvcnRlZCA9IGZhbHNlOwogCQkJbXV0ZXhfaW5pdCgmcHJpdi0+bWZ1bmMubWFzdGVyLmdlbl9lcWVfbXV0ZXhbaV0pOwogCQkJZm9yIChqID0gMDsgaiA8IE1MWDRfRVZFTlRfVFlQRVNfTlVNOyArK2opCiAJCQkJc19zdGF0ZS0+ZXZlbnRfZXFbal0uZXFuID0gLTE7CkBAIC0yMzgyLDYgKzI0MDksOCBAQAogCQkJCWFkbWluX3Zwb3J0LT5xb3NfdnBvcnQgPQogCQkJCQkJTUxYNF9WUFBfREVGQVVMVF9WUE9SVDsKIAkJCQlvcGVyX3Zwb3J0LT5xb3NfdnBvcnQgPSBNTFg0X1ZQUF9ERUZBVUxUX1ZQT1JUOworCQkJCWFkbWluX3Zwb3J0LT52bGFuX3Byb3RvID0gaHRvbnMoRVRIX1BfODAyMVEpOworCQkJCW9wZXJfdnBvcnQtPnZsYW5fcHJvdG8gPSBodG9ucyhFVEhfUF84MDIxUSk7CiAJCQkJdmZfb3Blci0+dnBvcnRbcG9ydF0udmxhbl9pZHggPSBOT19JTkRYOwogCQkJCXZmX29wZXItPnZwb3J0W3BvcnRdLm1hY19pZHggPSBOT19JTkRYOwogCQkJCW1seDRfc2V0X3JhbmRvbV9hZG1pbl9ndWlkKGRldiwgaSwgcG9ydCk7CkBAIC0yNDU0LDYgKzI0ODMsNyBAQAogCWludCBmbGFncyA9IDA7CiAKIAlpZiAoIXByaXYtPmNtZC5pbml0aWFsaXplZCkgeworCQlpbml0X3J3c2VtKCZwcml2LT5jbWQuc3dpdGNoX3NlbSk7CiAJCW11dGV4X2luaXQoJnByaXYtPmNtZC5zbGF2ZV9jbWRfbXV0ZXgpOwogCQlzZW1hX2luaXQoJnByaXYtPmNtZC5wb2xsX3NlbSwgMSk7CiAJCXByaXYtPmNtZC51c2VfZXZlbnRzID0gMDsKQEAgLTI1ODMsNiArMjYxMyw3IEBACiAJaWYgKCFwcml2LT5jbWQuY29udGV4dCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlkb3duX3dyaXRlKCZwcml2LT5jbWQuc3dpdGNoX3NlbSk7CiAJZm9yIChpID0gMDsgaSA8IHByaXYtPmNtZC5tYXhfY21kczsgKytpKSB7CiAJCXByaXYtPmNtZC5jb250ZXh0W2ldLnRva2VuID0gaTsKIAkJcHJpdi0+Y21kLmNvbnRleHRbaV0ubmV4dCAgPSBpICsgMTsKQEAgLTI2MDYsNiArMjYzNyw3IEBACiAKIAlkb3duKCZwcml2LT5jbWQucG9sbF9zZW0pOwogCXByaXYtPmNtZC51c2VfZXZlbnRzID0gMTsKKwl1cF93cml0ZSgmcHJpdi0+Y21kLnN3aXRjaF9zZW0pOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTI2MTgsNiArMjY1MCw3IEBACiAJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOwogCWludCBpOwogCisJZG93bl93cml0ZSgmcHJpdi0+Y21kLnN3aXRjaF9zZW0pOwogCXByaXYtPmNtZC51c2VfZXZlbnRzID0gMDsKIAogCWZvciAoaSA9IDA7IGkgPCBwcml2LT5jbWQubWF4X2NtZHM7ICsraSkKQEAgLTI2MjYsNiArMjY1OSw3IEBACiAJa2ZyZWUocHJpdi0+Y21kLmNvbnRleHQpOwogCiAJdXAoJnByaXYtPmNtZC5wb2xsX3NlbSk7CisJdXBfd3JpdGUoJnByaXYtPmNtZC5zd2l0Y2hfc2VtKTsKIH0KIAogc3RydWN0IG1seDRfY21kX21haWxib3ggKm1seDRfYWxsb2NfY21kX21haWxib3goc3RydWN0IG1seDRfZGV2ICpkZXYpCkBAIC0yOTM3LDEwICsyOTcxLDEzIEBACiBFWFBPUlRfU1lNQk9MX0dQTChtbHg0X3NldF92Zl9tYWMpOwogCiAKLWludCBtbHg0X3NldF92Zl92bGFuKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgcG9ydCwgaW50IHZmLCB1MTYgdmxhbiwgdTggcW9zKQoraW50IG1seDRfc2V0X3ZmX3ZsYW4oc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBwb3J0LCBpbnQgdmYsIHUxNiB2bGFuLCB1OCBxb3MsCisJCSAgICAgX19iZTE2IHByb3RvKQogewogCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbWx4NF92cG9ydF9zdGF0ZSAqdmZfYWRtaW47CisJc3RydWN0IG1seDRfc2xhdmVfc3RhdGUgKnNsYXZlX3N0YXRlOworCXN0cnVjdCBtbHg0X3Zwb3J0X29wZXJfc3RhdGUgKnZmX29wZXI7CiAJaW50IHNsYXZlOwogCiAJaWYgKCghbWx4NF9pc19tYXN0ZXIoZGV2KSkgfHwKQEAgLTI5NTAsMTIgKzI5ODcsMzEgQEAKIAlpZiAoKHZsYW4gPiA0MDk1KSB8fCAocW9zID4gNykpCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKHByb3RvID09IGh0b25zKEVUSF9QXzgwMjFBRCkgJiYKKwkgICAgIShkZXYtPmNhcHMuZmxhZ3MyICYgTUxYNF9ERVZfQ0FQX0ZMQUcyX1NWTEFOX0JZX1FQKSkKKwkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CisKKwlpZiAocHJvdG8gIT0gaHRvbnMoRVRIX1BfODAyMVEpICYmCisJICAgIHByb3RvICE9IGh0b25zKEVUSF9QXzgwMjFBRCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChwcm90byA9PSBodG9ucyhFVEhfUF84MDIxQUQpKSAmJgorCSAgICAoKHZsYW4gPT0gMCkgfHwgKHZsYW4gPT0gTUxYNF9WR1QpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlzbGF2ZSA9IG1seDRfZ2V0X3NsYXZlX2luZHgoZGV2LCB2Zik7CiAJaWYgKHNsYXZlIDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlzbGF2ZV9zdGF0ZSA9ICZwcml2LT5tZnVuYy5tYXN0ZXIuc2xhdmVfc3RhdGVbc2xhdmVdOworCWlmICgocHJvdG8gPT0gaHRvbnMoRVRIX1BfODAyMUFEKSkgJiYgKHNsYXZlX3N0YXRlLT5hY3RpdmUpICYmCisJICAgICghc2xhdmVfc3RhdGUtPnZzdF9xaW5xX3N1cHBvcnRlZCkpIHsKKwkJbWx4NF9lcnIoZGV2LCAidmYgJWQgZG9lcyBub3Qgc3VwcG9ydCBWU1QgUWluUSBtb2RlXG4iLCB2Zik7CisJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOworCX0KIAlwb3J0ID0gbWx4NF9zbGF2ZXNfY2xvc2VzdF9wb3J0KGRldiwgc2xhdmUsIHBvcnQpOwogCXZmX2FkbWluID0gJnByaXYtPm1mdW5jLm1hc3Rlci52Zl9hZG1pbltzbGF2ZV0udnBvcnRbcG9ydF07CisJdmZfb3BlciA9ICZwcml2LT5tZnVuYy5tYXN0ZXIudmZfb3BlcltzbGF2ZV0udnBvcnRbcG9ydF07CiAKIAlpZiAoIW1seDRfdmFsaWRfdmZfc3RhdGVfY2hhbmdlKGRldiwgcG9ydCwgdmZfYWRtaW4sIHZsYW4sIHFvcykpCiAJCXJldHVybiAtRVBFUk07CkBAIC0yOTY1LDYgKzMwMjEsNyBAQAogCWVsc2UKIAkJdmZfYWRtaW4tPmRlZmF1bHRfdmxhbiA9IHZsYW47CiAJdmZfYWRtaW4tPmRlZmF1bHRfcW9zID0gcW9zOworCXZmX2FkbWluLT52bGFuX3Byb3RvID0gcHJvdG87CiAKIAkvKiBJZiByYXRlIHdhcyBjb25maWd1cmVkIHByaW9yIHRvIFZTVCwgd2Ugc2F2ZWQgdGhlIGNvbmZpZ3VyZWQgcmF0ZQogCSAqIGluIHZmX2FkbWluLT5yYXRlIGFuZCBub3csIGlmIHByaW9yaXR5IHN1cHBvcnRlZCB3ZSBlbmZvcmNlIHRoZSBRb1MKQEAgLTI5NzMsNyArMzAzMCwxMiBAQAogCSAgICB2Zl9hZG1pbi0+dHhfcmF0ZSkKIAkJdmZfYWRtaW4tPnFvc192cG9ydCA9IHNsYXZlOwogCi0JaWYgKG1seDRfbWFzdGVyX2ltbWVkaWF0ZV9hY3RpdmF0ZV92bGFuX3Fvcyhwcml2LCBzbGF2ZSwgcG9ydCkpCisJLyogVHJ5IHRvIGFjdGl2YXRlIG5ldyB2ZiBzdGF0ZSB3aXRob3V0IHJlc3RhcnQsCisJICogdGhpcyBvcHRpb24gaXMgbm90IHN1cHBvcnRlZCB3aGlsZSBtb3ZpbmcgdG8gVlNUIFFpblEgbW9kZS4KKwkgKi8KKwlpZiAoKHByb3RvID09IGh0b25zKEVUSF9QXzgwMjFBRCkgJiYKKwkgICAgIHZmX29wZXItPnN0YXRlLnZsYW5fcHJvdG8gIT0gcHJvdG8pIHx8CisJICAgIG1seDRfbWFzdGVyX2ltbWVkaWF0ZV9hY3RpdmF0ZV92bGFuX3Fvcyhwcml2LCBzbGF2ZSwgcG9ydCkpCiAJCW1seDRfaW5mbyhkZXYsCiAJCQkgICJ1cGRhdGluZyB2ZiAlZCBwb3J0ICVkIGNvbmZpZyB3aWxsIHRha2UgZWZmZWN0IG9uIG5leHQgVkYgcmVzdGFydFxuIiwKIAkJCSAgdmYsIHBvcnQpOwpAQCAtMzExNyw2ICszMTc5LDcgQEAKIAogCWl2Zi0+dmxhbgkJPSBzX2luZm8tPmRlZmF1bHRfdmxhbjsKIAlpdmYtPnFvcwkJPSBzX2luZm8tPmRlZmF1bHRfcW9zOworCWl2Zi0+dmxhbl9wcm90bwkJPSBzX2luZm8tPnZsYW5fcHJvdG87CiAKIAlpZiAobWx4NF9pc192Zl92c3RfYW5kX3ByaW9fcW9zKGRldiwgcG9ydCwgc19pbmZvKSkKIAkJaXZmLT5tYXhfdHhfcmF0ZSA9IHNfaW5mby0+dHhfcmF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fY2xvY2suYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fY2xvY2suYwppbmRleCAxNDk0OTk3Li4wOGZjNWZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX2Nsb2NrLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9jbG9jay5jCkBAIC0yOTgsNyArMjk4LDcgQEAKIAlpZiAoSVNfRVJSKG1kZXYtPnB0cF9jbG9jaykpIHsKIAkJbWRldi0+cHRwX2Nsb2NrID0gTlVMTDsKIAkJbWx4NF9lcnIobWRldiwgInB0cF9jbG9ja19yZWdpc3RlciBmYWlsZWRcbiIpOwotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChtZGV2LT5wdHBfY2xvY2spIHsKIAkJbWx4NF9pbmZvKG1kZXYsICJyZWdpc3RlcmVkIFBIQyBjbG9ja1xuIik7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX2RjYl9ubC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9kY2JfbmwuYwppbmRleCA5OWM2YmJkLi5iMDQ3NjBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX2RjYl9ubC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fZGNiX25sLmMKQEAgLTk0LDcgKzk0LDcgQEAKIAkJKmNhcCA9IHRydWU7CiAJCWJyZWFrOwogCWNhc2UgRENCX0NBUF9BVFRSX0RDQlg6Ci0JCSpjYXAgPSBwcml2LT5jZWVfcGFyYW1zLmRjYnhfY2FwOworCQkqY2FwID0gcHJpdi0+ZGNieF9jYXA7CiAJCWJyZWFrOwogCWNhc2UgRENCX0NBUF9BVFRSX1BGQ19UQ1M6CiAJCSpjYXAgPSAxIDw8ICBtbHg0X21heF90Yyhwcml2LT5tZGV2LT5kZXYpOwpAQCAtMTExLDE0ICsxMTEsMTQgQEAKIHsKIAlzdHJ1Y3QgbWx4NF9lbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAotCXJldHVybiBwcml2LT5jZWVfcGFyYW1zLmRjYl9jZmcucGZjX3N0YXRlOworCXJldHVybiBwcml2LT5jZWVfY29uZmlnLnBmY19zdGF0ZTsKIH0KIAogc3RhdGljIHZvaWQgbWx4NF9lbl9kY2JubF9zZXRwZmNzdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1OCBzdGF0ZSkKIHsKIAlzdHJ1Y3QgbWx4NF9lbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAotCXByaXYtPmNlZV9wYXJhbXMuZGNiX2NmZy5wZmNfc3RhdGUgPSBzdGF0ZTsKKwlwcml2LT5jZWVfY29uZmlnLnBmY19zdGF0ZSA9IHN0YXRlOwogfQogCiBzdGF0aWMgdm9pZCBtbHg0X2VuX2RjYm5sX2dldF9wZmNfY2ZnKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBwcmlvcml0eSwKQEAgLTEyNiw3ICsxMjYsNyBAQAogewogCXN0cnVjdCBtbHg0X2VuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCi0JKnNldHRpbmcgPSBwcml2LT5jZWVfcGFyYW1zLmRjYl9jZmcudGNfY29uZmlnW3ByaW9yaXR5XS5kY2JfcGZjOworCSpzZXR0aW5nID0gcHJpdi0+Y2VlX2NvbmZpZy5kY2JfcGZjW3ByaW9yaXR5XTsKIH0KIAogc3RhdGljIHZvaWQgbWx4NF9lbl9kY2JubF9zZXRfcGZjX2NmZyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgcHJpb3JpdHksCkBAIC0xMzQsOCArMTM0LDggQEAKIHsKIAlzdHJ1Y3QgbWx4NF9lbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAotCXByaXYtPmNlZV9wYXJhbXMuZGNiX2NmZy50Y19jb25maWdbcHJpb3JpdHldLmRjYl9wZmMgPSBzZXR0aW5nOwotCXByaXYtPmNlZV9wYXJhbXMuZGNiX2NmZy5wZmNfc3RhdGUgPSB0cnVlOworCXByaXYtPmNlZV9jb25maWcuZGNiX3BmY1twcmlvcml0eV0gPSBzZXR0aW5nOworCXByaXYtPmNlZV9jb25maWcucGZjX3N0YXRlID0gdHJ1ZTsKIH0KIAogc3RhdGljIGludCBtbHg0X2VuX2RjYm5sX2dldG51bXRjcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdGNpZCwgdTggKm51bSkKQEAgLTE1NywxMyArMTU3LDExIEBACiB7CiAJc3RydWN0IG1seDRfZW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IG1seDRfZW5fZGV2ICptZGV2ID0gcHJpdi0+bWRldjsKLQlzdHJ1Y3QgbWx4NF9lbl9jZWVfY29uZmlnICpkY2JfY2ZnID0gJnByaXYtPmNlZV9wYXJhbXMuZGNiX2NmZzsKLQlpbnQgZXJyID0gMDsKIAotCWlmICghKHByaXYtPmNlZV9wYXJhbXMuZGNieF9jYXAgJiBEQ0JfQ0FQX0RDQlhfVkVSX0NFRSkpCi0JCXJldHVybiAtRUlOVkFMOworCWlmICghKHByaXYtPmRjYnhfY2FwICYgRENCX0NBUF9EQ0JYX1ZFUl9DRUUpKQorCQlyZXR1cm4gMTsKIAotCWlmIChkY2JfY2ZnLT5wZmNfc3RhdGUpIHsKKwlpZiAocHJpdi0+Y2VlX2NvbmZpZy5wZmNfc3RhdGUpIHsKIAkJaW50IHRjOwogCiAJCXByaXYtPnByb2YtPnJ4X3BhdXNlID0gMDsKQEAgLTE3MSw3ICsxNjksNyBAQAogCQlmb3IgKHRjID0gMDsgdGMgPCBDRUVfRENCWF9NQVhfUFJJTzsgdGMrKykgewogCQkJdTggdGNfbWFzayA9IDEgPDwgdGM7CiAKLQkJCXN3aXRjaCAoZGNiX2NmZy0+dGNfY29uZmlnW3RjXS5kY2JfcGZjKSB7CisJCQlzd2l0Y2ggKHByaXYtPmNlZV9jb25maWcuZGNiX3BmY1t0Y10pIHsKIAkJCWNhc2UgcGZjX2Rpc2FibGVkOgogCQkJCXByaXYtPnByb2YtPnR4X3BwcCAmPSB+dGNfbWFzazsKIAkJCQlwcml2LT5wcm9mLT5yeF9wcHAgJj0gfnRjX21hc2s7CkBAIC0xOTksMTUgKzE5NywxNyBAQAogCQllbl9kYmcoRFJWLCBwcml2LCAiU2V0IHBmYyBvZmZcbiIpOwogCX0KIAotCWVyciA9IG1seDRfU0VUX1BPUlRfZ2VuZXJhbChtZGV2LT5kZXYsIHByaXYtPnBvcnQsCi0JCQkJICAgIHByaXYtPnJ4X3NrYl9zaXplICsgRVRIX0ZDU19MRU4sCi0JCQkJICAgIHByaXYtPnByb2YtPnR4X3BhdXNlLAotCQkJCSAgICBwcml2LT5wcm9mLT50eF9wcHAsCi0JCQkJICAgIHByaXYtPnByb2YtPnJ4X3BhdXNlLAotCQkJCSAgICBwcml2LT5wcm9mLT5yeF9wcHApOwotCWlmIChlcnIpCisJaWYgKG1seDRfU0VUX1BPUlRfZ2VuZXJhbChtZGV2LT5kZXYsIHByaXYtPnBvcnQsCisJCQkJICBwcml2LT5yeF9za2Jfc2l6ZSArIEVUSF9GQ1NfTEVOLAorCQkJCSAgcHJpdi0+cHJvZi0+dHhfcGF1c2UsCisJCQkJICBwcml2LT5wcm9mLT50eF9wcHAsCisJCQkJICBwcml2LT5wcm9mLT5yeF9wYXVzZSwKKwkJCQkgIHByaXYtPnByb2YtPnJ4X3BwcCkpIHsKIAkJZW5fZXJyKHByaXYsICJGYWlsZWQgc2V0dGluZyBwYXVzZSBwYXJhbXNcbiIpOwotCXJldHVybiBlcnI7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdTggbWx4NF9lbl9kY2JubF9nZXRfc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTIyNSw3ICsyMjUsNyBAQAogCXN0cnVjdCBtbHg0X2VuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBudW1fdGNzID0gMDsKIAotCWlmICghKHByaXYtPmNlZV9wYXJhbXMuZGNieF9jYXAgJiBEQ0JfQ0FQX0RDQlhfVkVSX0NFRSkpCisJaWYgKCEocHJpdi0+ZGNieF9jYXAgJiBEQ0JfQ0FQX0RDQlhfVkVSX0NFRSkpCiAJCXJldHVybiAxOwogCiAJaWYgKCEhKHN0YXRlKSA9PSAhIShwcml2LT5mbGFncyAmIE1MWDRfRU5fRkxBR19EQ0JfRU5BQkxFRCkpCkBAIC0yMzgsNyArMjM4LDEwIEBACiAJCXByaXYtPmZsYWdzICY9IH5NTFg0X0VOX0ZMQUdfRENCX0VOQUJMRUQ7CiAJfQogCi0JcmV0dXJuIG1seDRfZW5fc2V0dXBfdGMoZGV2LCBudW1fdGNzKTsKKwlpZiAobWx4NF9lbl9zZXR1cF90YyhkZXYsIG51bV90Y3MpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOwogfQogCiAvKiBPbiBzdWNjZXNzIHJldHVybnMgYSBub24temVybyA4MDIuMXAgdXNlciBwcmlvcml0eSBiaXRtYXAKQEAgLTI1Miw3ICsyNTUsNyBAQAogCQkJCS5zZWxlY3RvciA9IGlkdHlwZSwKIAkJCQkucHJvdG9jb2wgPSBpZCwKIAkJCSAgICAgfTsKLQlpZiAoIShwcml2LT5jZWVfcGFyYW1zLmRjYnhfY2FwICYgRENCX0NBUF9EQ0JYX1ZFUl9DRUUpKQorCWlmICghKHByaXYtPmRjYnhfY2FwICYgRENCX0NBUF9EQ0JYX1ZFUl9DRUUpKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiBkY2JfZ2V0YXBwKG5ldGRldiwgJmFwcCk7CkBAIC0yNjQsNyArMjY3LDcgQEAKIAlzdHJ1Y3QgbWx4NF9lbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgZGNiX2FwcCBhcHA7CiAKLQlpZiAoIShwcml2LT5jZWVfcGFyYW1zLmRjYnhfY2FwICYgRENCX0NBUF9EQ0JYX1ZFUl9DRUUpKQorCWlmICghKHByaXYtPmRjYnhfY2FwICYgRENCX0NBUF9EQ0JYX1ZFUl9DRUUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW1lbXNldCgmYXBwLCAwLCBzaXplb2Yoc3RydWN0IGRjYl9hcHApKTsKQEAgLTQzMyw3ICs0MzYsNyBAQAogewogCXN0cnVjdCBtbHg0X2VuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JcmV0dXJuIHByaXYtPmNlZV9wYXJhbXMuZGNieF9jYXA7CisJcmV0dXJuIHByaXYtPmRjYnhfY2FwOwogfQogCiBzdGF0aWMgdTggbWx4NF9lbl9kY2JubF9zZXRkY2J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IG1vZGUpCkBAIC00NDIsNyArNDQ1LDcgQEAKIAlzdHJ1Y3QgaWVlZV9ldHMgZXRzID0gezB9OwogCXN0cnVjdCBpZWVlX3BmYyBwZmMgPSB7MH07CiAKLQlpZiAobW9kZSA9PSBwcml2LT5jZWVfcGFyYW1zLmRjYnhfY2FwKQorCWlmIChtb2RlID09IHByaXYtPmRjYnhfY2FwKQogCQlyZXR1cm4gMDsKIAogCWlmICgobW9kZSAmIERDQl9DQVBfRENCWF9MTERfTUFOQUdFRCkgfHwKQEAgLTQ1MSw3ICs0NTQsNyBAQAogCSAgICAhKG1vZGUgJiBEQ0JfQ0FQX0RDQlhfSE9TVCkpCiAJCWdvdG8gZXJyOwogCi0JcHJpdi0+Y2VlX3BhcmFtcy5kY2J4X2NhcCA9IG1vZGU7CisJcHJpdi0+ZGNieF9jYXAgPSBtb2RlOwogCiAJZXRzLmV0c19jYXAgPSBJRUVFXzgwMjFRQVpfTUFYX1RDUzsKIAlwZmMucGZjX2NhcCA9IElFRUVfODAyMVFBWl9NQVhfVENTOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9uZXRkZXYuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fbmV0ZGV2LmMKaW5kZXggNDE5OGU5Yi4uN2U3MDNiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9uZXRkZXYuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX25ldGRldi5jCkBAIC03MSwxMCArNzEsMTEgQEAKICNpZmRlZiBDT05GSUdfTUxYNF9FTl9EQ0IKIAlpZiAoIW1seDRfaXNfc2xhdmUocHJpdi0+bWRldi0+ZGV2KSkgewogCQlpZiAodXApIHsKLQkJCXByaXYtPmZsYWdzIHw9IE1MWDRfRU5fRkxBR19EQ0JfRU5BQkxFRDsKKwkJCWlmIChwcml2LT5kY2J4X2NhcCkKKwkJCQlwcml2LT5mbGFncyB8PSBNTFg0X0VOX0ZMQUdfRENCX0VOQUJMRUQ7CiAJCX0gZWxzZSB7CiAJCQlwcml2LT5mbGFncyAmPSB+TUxYNF9FTl9GTEFHX0RDQl9FTkFCTEVEOwotCQkJcHJpdi0+Y2VlX3BhcmFtcy5kY2JfY2ZnLnBmY19zdGF0ZSA9IGZhbHNlOworCQkJcHJpdi0+Y2VlX2NvbmZpZy5wZmNfc3RhdGUgPSBmYWxzZTsKIAkJfQogCX0KICNlbmRpZiAvKiBDT05GSUdfTUxYNF9FTl9EQ0IgKi8KQEAgLTIzOTksMTIgKzI0MDAsMTQgQEAKIAlyZXR1cm4gbWx4NF9zZXRfdmZfbWFjKG1kZXYtPmRldiwgZW5fcHJpdi0+cG9ydCwgcXVldWUsIG1hY191NjQpOwogfQogCi1zdGF0aWMgaW50IG1seDRfZW5fc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHZmLCB1MTYgdmxhbiwgdTggcW9zKQorc3RhdGljIGludCBtbHg0X2VuX3NldF92Zl92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB2ZiwgdTE2IHZsYW4sIHU4IHFvcywKKwkJCSAgICAgICBfX2JlMTYgdmxhbl9wcm90bykKIHsKIAlzdHJ1Y3QgbWx4NF9lbl9wcml2ICplbl9wcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbWx4NF9lbl9kZXYgKm1kZXYgPSBlbl9wcml2LT5tZGV2OwogCi0JcmV0dXJuIG1seDRfc2V0X3ZmX3ZsYW4obWRldi0+ZGV2LCBlbl9wcml2LT5wb3J0LCB2ZiwgdmxhbiwgcW9zKTsKKwlyZXR1cm4gbWx4NF9zZXRfdmZfdmxhbihtZGV2LT5kZXYsIGVuX3ByaXYtPnBvcnQsIHZmLCB2bGFuLCBxb3MsCisJCQkJdmxhbl9wcm90byk7CiB9CiAKIHN0YXRpYyBpbnQgbWx4NF9lbl9zZXRfdmZfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdmYsIGludCBtaW5fdHhfcmF0ZSwKQEAgLTI2NDIsMTIgKzI2NDUsMTYgQEAKIAkJCWlmIChJU19FUlIocHJvZykpCiAJCQkJcmV0dXJuIFBUUl9FUlIocHJvZyk7CiAJCX0KKwkJbXV0ZXhfbG9jaygmbWRldi0+c3RhdGVfbG9jayk7CiAJCWZvciAoaSA9IDA7IGkgPCBwcml2LT5yeF9yaW5nX251bTsgaSsrKSB7Ci0JCQkvKiBUaGlzIHhjaGcgaXMgcGFpcmVkIHdpdGggUkVBRF9PTkNFIGluIHRoZSBmYXN0cGF0aCAqLwotCQkJb2xkX3Byb2cgPSB4Y2hnKCZwcml2LT5yeF9yaW5nW2ldLT54ZHBfcHJvZywgcHJvZyk7CisJCQlvbGRfcHJvZyA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoCisJCQkJCXByaXYtPnJ4X3JpbmdbaV0tPnhkcF9wcm9nLAorCQkJCQlsb2NrZGVwX2lzX2hlbGQoJm1kZXYtPnN0YXRlX2xvY2spKTsKKwkJCXJjdV9hc3NpZ25fcG9pbnRlcihwcml2LT5yeF9yaW5nW2ldLT54ZHBfcHJvZywgcHJvZyk7CiAJCQlpZiAob2xkX3Byb2cpCiAJCQkJYnBmX3Byb2dfcHV0KG9sZF9wcm9nKTsKIAkJfQorCQltdXRleF91bmxvY2soJm1kZXYtPnN0YXRlX2xvY2spOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTI2ODAsNyArMjY4NywxMCBAQAogCQkJCQkJCXByaXYtPnhkcF9yaW5nX251bSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+cnhfcmluZ19udW07IGkrKykgewotCQlvbGRfcHJvZyA9IHhjaGcoJnByaXYtPnJ4X3JpbmdbaV0tPnhkcF9wcm9nLCBwcm9nKTsKKwkJb2xkX3Byb2cgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKAorCQkJCQlwcml2LT5yeF9yaW5nW2ldLT54ZHBfcHJvZywKKwkJCQkJbG9ja2RlcF9pc19oZWxkKCZtZGV2LT5zdGF0ZV9sb2NrKSk7CisJCXJjdV9hc3NpZ25fcG9pbnRlcihwcml2LT5yeF9yaW5nW2ldLT54ZHBfcHJvZywgcHJvZyk7CiAJCWlmIChvbGRfcHJvZykKIAkJCWJwZl9wcm9nX3B1dChvbGRfcHJvZyk7CiAJfQpAQCAtMzA0OCw5ICszMDU4LDYgQEAKIAlzdHJ1Y3QgbWx4NF9lbl9wcml2ICpwcml2OwogCWludCBpOwogCWludCBlcnI7Ci0jaWZkZWYgQ09ORklHX01MWDRfRU5fRENCCi0Jc3RydWN0IHRjX2NvbmZpZ3VyYXRpb24gKnRjOwotI2VuZGlmCiAKIAlkZXYgPSBhbGxvY19ldGhlcmRldl9tcXMoc2l6ZW9mKHN0cnVjdCBtbHg0X2VuX3ByaXYpLAogCQkJCSBNQVhfVFhfUklOR1MsIE1BWF9SWF9SSU5HUyk7CkBAIC0zMTE3LDE2ICszMTI0LDEzIEBACiAJcHJpdi0+bXNnX2VuYWJsZSA9IE1MWDRfRU5fTVNHX0xFVkVMOwogI2lmZGVmIENPTkZJR19NTFg0X0VOX0RDQgogCWlmICghbWx4NF9pc19zbGF2ZShwcml2LT5tZGV2LT5kZXYpKSB7Ci0JCXByaXYtPmNlZV9wYXJhbXMuZGNieF9jYXAgPSBEQ0JfQ0FQX0RDQlhfVkVSX0NFRSB8Ci0JCQkJCSAgICBEQ0JfQ0FQX0RDQlhfSE9TVCB8Ci0JCQkJCSAgICBEQ0JfQ0FQX0RDQlhfVkVSX0lFRUU7CisJCXByaXYtPmRjYnhfY2FwID0gRENCX0NBUF9EQ0JYX1ZFUl9DRUUgfCBEQ0JfQ0FQX0RDQlhfSE9TVCB8CisJCQlEQ0JfQ0FQX0RDQlhfVkVSX0lFRUU7CiAJCXByaXYtPmZsYWdzIHw9IE1MWDRfRU5fRENCX0VOQUJMRUQ7Ci0JCXByaXYtPmNlZV9wYXJhbXMuZGNiX2NmZy5wZmNfc3RhdGUgPSBmYWxzZTsKKwkJcHJpdi0+Y2VlX2NvbmZpZy5wZmNfc3RhdGUgPSBmYWxzZTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgTUxYNF9FTl9OVU1fVVA7IGkrKykgewotCQkJdGMgPSAmcHJpdi0+Y2VlX3BhcmFtcy5kY2JfY2ZnLnRjX2NvbmZpZ1tpXTsKLQkJCXRjLT5kY2JfcGZjID0gcGZjX2Rpc2FibGVkOwotCQl9CisJCWZvciAoaSA9IDA7IGkgPCBNTFg0X0VOX05VTV9VUDsgaSsrKQorCQkJcHJpdi0+Y2VlX2NvbmZpZy5kY2JfcGZjW2ldID0gcGZjX2Rpc2FibGVkOwogCiAJCWlmIChtZGV2LT5kZXYtPmNhcHMuZmxhZ3MyICYgTUxYNF9ERVZfQ0FQX0ZMQUcyX0VUU19DRkcpIHsKIAkJCWRldi0+ZGNibmxfb3BzID0gJm1seDRfZW5fZGNibmxfb3BzOwpAQCAtMzIyMiw2ICszMjI2LDcgQEAKIAl9CiAKIAlpZiAobWx4NF9pc19zbGF2ZShtZGV2LT5kZXYpKSB7CisJCWJvb2wgdmxhbl9vZmZsb2FkX2Rpc2FibGVkOwogCQlpbnQgcGh2OwogCiAJCWVyciA9IGdldF9waHZfYml0KG1kZXYtPmRldiwgcG9ydCwgJnBodik7CkBAIC0zMjI5LDYgKzMyMzQsMTggQEAKIAkJCWRldi0+aHdfZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1NUQUdfVFg7CiAJCQlwcml2LT5wZmxhZ3MgfD0gTUxYNF9FTl9QUklWX0ZMQUdTX1BIVjsKIAkJfQorCQllcnIgPSBtbHg0X2dldF9pc192bGFuX29mZmxvYWRfZGlzYWJsZWQobWRldi0+ZGV2LCBwb3J0LAorCQkJCQkJCSZ2bGFuX29mZmxvYWRfZGlzYWJsZWQpOworCQlpZiAoIWVyciAmJiB2bGFuX29mZmxvYWRfZGlzYWJsZWQpIHsKKwkJCWRldi0+aHdfZmVhdHVyZXMgJj0gfihORVRJRl9GX0hXX1ZMQU5fQ1RBR19UWCB8CisJCQkJCSAgICAgIE5FVElGX0ZfSFdfVkxBTl9DVEFHX1JYIHwKKwkJCQkJICAgICAgTkVUSUZfRl9IV19WTEFOX1NUQUdfVFggfAorCQkJCQkgICAgICBORVRJRl9GX0hXX1ZMQU5fU1RBR19SWCk7CisJCQlkZXYtPmZlYXR1cmVzICY9IH4oTkVUSUZfRl9IV19WTEFOX0NUQUdfVFggfAorCQkJCQkgICBORVRJRl9GX0hXX1ZMQU5fQ1RBR19SWCB8CisJCQkJCSAgIE5FVElGX0ZfSFdfVkxBTl9TVEFHX1RYIHwKKwkJCQkJICAgTkVUSUZfRl9IV19WTEFOX1NUQUdfUlgpOworCQl9CiAJfSBlbHNlIHsKIAkJaWYgKG1kZXYtPmRldi0+Y2Fwcy5mbGFnczIgJiBNTFg0X0RFVl9DQVBfRkxBRzJfUEhWX0VOICYmCiAJCSAgICAhKG1kZXYtPmRldi0+Y2Fwcy5mbGFnczIgJgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9yeC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9yeC5jCmluZGV4IDIwNDBkYWQuLmYyZThiZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fcnguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX3J4LmMKQEAgLTcyLDcgKzcyLDcgQEAKIAl9CiAJZG1hID0gZG1hX21hcF9wYWdlKHByaXYtPmRkZXYsIHBhZ2UsIDAsIFBBR0VfU0laRSA8PCBvcmRlciwKIAkJCSAgIGZyYWdfaW5mby0+ZG1hX2Rpcik7Ci0JaWYgKGRtYV9tYXBwaW5nX2Vycm9yKHByaXYtPmRkZXYsIGRtYSkpIHsKKwlpZiAodW5saWtlbHkoZG1hX21hcHBpbmdfZXJyb3IocHJpdi0+ZGRldiwgZG1hKSkpIHsKIAkJcHV0X3BhZ2UocGFnZSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTEwOCw3ICsxMDgsOCBAQAogCQkgICAgcmluZ19hbGxvY1tpXS5wYWdlX3NpemUpCiAJCQljb250aW51ZTsKIAotCQlpZiAobWx4NF9hbGxvY19wYWdlcyhwcml2LCAmcGFnZV9hbGxvY1tpXSwgZnJhZ19pbmZvLCBnZnApKQorCQlpZiAodW5saWtlbHkobWx4NF9hbGxvY19wYWdlcyhwcml2LCAmcGFnZV9hbGxvY1tpXSwKKwkJCQkJICAgICAgZnJhZ19pbmZvLCBnZnApKSkKIAkJCWdvdG8gb3V0OwogCX0KIApAQCAtNTM3LDcgKzUzOCw5IEBACiAJc3RydWN0IG1seDRfZW5fcnhfcmluZyAqcmluZyA9ICpwcmluZzsKIAlzdHJ1Y3QgYnBmX3Byb2cgKm9sZF9wcm9nOwogCi0Jb2xkX3Byb2cgPSBSRUFEX09OQ0UocmluZy0+eGRwX3Byb2cpOworCW9sZF9wcm9nID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZCgKKwkJCQkJcmluZy0+eGRwX3Byb2csCisJCQkJCWxvY2tkZXBfaXNfaGVsZCgmbWRldi0+c3RhdGVfbG9jaykpOwogCWlmIChvbGRfcHJvZykKIAkJYnBmX3Byb2dfcHV0KG9sZF9wcm9nKTsKIAltbHg0X2ZyZWVfaHdxX3JlcyhtZGV2LT5kZXYsICZyaW5nLT53cXJlcywgc2l6ZSAqIHN0cmlkZSArIFRYQkJfU0laRSk7CkBAIC01ODMsNyArNTg2LDcgQEAKIAkJZnJhZ19pbmZvID0gJnByaXYtPmZyYWdfaW5mb1tucl07CiAJCWlmIChsZW5ndGggPD0gZnJhZ19pbmZvLT5mcmFnX3ByZWZpeF9zaXplKQogCQkJYnJlYWs7Ci0JCWlmICghZnJhZ3NbbnJdLnBhZ2UpCisJCWlmICh1bmxpa2VseSghZnJhZ3NbbnJdLnBhZ2UpKQogCQkJZ290byBmYWlsOwogCiAJCWRtYSA9IGJlNjRfdG9fY3B1KHJ4X2Rlc2MtPmRhdGFbbnJdLmFkZHIpOwpAQCAtNjIzLDcgKzYyNiw3IEBACiAJZG1hX2FkZHJfdCBkbWE7CiAKIAlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKHByaXYtPmRldiwgU01BTExfUEFDS0VUX1NJWkUgKyBORVRfSVBfQUxJR04pOwotCWlmICghc2tiKSB7CisJaWYgKHVubGlrZWx5KCFza2IpKSB7CiAJCWVuX2RiZyhSWF9FUlIsIHByaXYsICJGYWlsZWQgYWxsb2NhdGluZyBza2JcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC03MzQsNyArNzM3LDggQEAKIHsKIAlfX3dzdW0gY3N1bV9wc2V1ZG9faGRyID0gMDsKIAotCWlmIChpcHY2aC0+bmV4dGhkciA9PSBJUFBST1RPX0ZSQUdNRU5UIHx8IGlwdjZoLT5uZXh0aGRyID09IElQUFJPVE9fSE9QT1BUUykKKwlpZiAodW5saWtlbHkoaXB2NmgtPm5leHRoZHIgPT0gSVBQUk9UT19GUkFHTUVOVCB8fAorCQkgICAgIGlwdjZoLT5uZXh0aGRyID09IElQUFJPVE9fSE9QT1BUUykpCiAJCXJldHVybiAtMTsKIAlod19jaGVja3N1bSA9IGNzdW1fYWRkKGh3X2NoZWNrc3VtLCAoX19mb3JjZSBfX3dzdW0paHRvbnMoaXB2NmgtPm5leHRoZHIpKTsKIApAQCAtNzY3LDcgKzc3MSw3IEBACiAJCWdldF9maXhlZF9pcHY0X2NzdW0oaHdfY2hlY2tzdW0sIHNrYiwgaGRyKTsKICNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCWVsc2UgaWYgKGNxZS0+c3RhdHVzICYgY3B1X3RvX2JlMTYoTUxYNF9DUUVfU1RBVFVTX0lQVjYpKQotCQlpZiAoZ2V0X2ZpeGVkX2lwdjZfY3N1bShod19jaGVja3N1bSwgc2tiLCBoZHIpKQorCQlpZiAodW5saWtlbHkoZ2V0X2ZpeGVkX2lwdjZfY3N1bShod19jaGVja3N1bSwgc2tiLCBoZHIpKSkKIAkJCXJldHVybiAtMTsKICNlbmRpZgogCXJldHVybiAwOwpAQCAtNzk0LDEzICs3OTgsMTUgQEAKIAl1NjQgdGltZXN0YW1wOwogCWJvb2wgbDJfdHVubmVsOwogCi0JaWYgKCFwcml2LT5wb3J0X3VwKQorCWlmICh1bmxpa2VseSghcHJpdi0+cG9ydF91cCkpCiAJCXJldHVybiAwOwogCi0JaWYgKGJ1ZGdldCA8PSAwKQorCWlmICh1bmxpa2VseShidWRnZXQgPD0gMCkpCiAJCXJldHVybiBwb2xsZWQ7CiAKLQl4ZHBfcHJvZyA9IFJFQURfT05DRShyaW5nLT54ZHBfcHJvZyk7CisJLyogUHJvdGVjdCBhY2Nlc3NlcyB0bzogcmluZy0+eGRwX3Byb2csIHByaXYtPm1hY19oYXNoIGxpc3QgKi8KKwlyY3VfcmVhZF9sb2NrKCk7CisJeGRwX3Byb2cgPSByY3VfZGVyZWZlcmVuY2UocmluZy0+eGRwX3Byb2cpOwogCWRvb3JiZWxsX3BlbmRpbmcgPSAwOwogCXR4X2luZGV4ID0gKHByaXYtPnR4X3JpbmdfbnVtIC0gcHJpdi0+eGRwX3JpbmdfbnVtKSArIGNxLT5yaW5nOwogCkBAIC04NTgsMTUgKzg2NCwxMSBAQAogCQkJCS8qIERyb3AgdGhlIHBhY2tldCwgc2luY2UgSFcgbG9vcGJhY2stZWQgaXQgKi8KIAkJCQltYWNfaGFzaCA9IGV0aGgtPmhfc291cmNlW01MWDRfRU5fTUFDX0hBU0hfSURYXTsKIAkJCQlidWNrZXQgPSAmcHJpdi0+bWFjX2hhc2hbbWFjX2hhc2hdOwotCQkJCXJjdV9yZWFkX2xvY2soKTsKIAkJCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZW50cnksIGJ1Y2tldCwgaGxpc3QpIHsKIAkJCQkJaWYgKGV0aGVyX2FkZHJfZXF1YWxfNjRiaXRzKGVudHJ5LT5tYWMsCi0JCQkJCQkJCSAgICBldGhoLT5oX3NvdXJjZSkpIHsKLQkJCQkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJCQkJCQkgICAgZXRoaC0+aF9zb3VyY2UpKQogCQkJCQkJZ290byBuZXh0OwotCQkJCQl9CiAJCQkJfQotCQkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJfQogCQl9CiAKQEAgLTkwMiwxNiArOTA0LDE3IEBACiAJCQljYXNlIFhEUF9QQVNTOgogCQkJCWJyZWFrOwogCQkJY2FzZSBYRFBfVFg6Ci0JCQkJaWYgKCFtbHg0X2VuX3htaXRfZnJhbWUoZnJhZ3MsIGRldiwKKwkJCQlpZiAobGlrZWx5KCFtbHg0X2VuX3htaXRfZnJhbWUoZnJhZ3MsIGRldiwKIAkJCQkJCQlsZW5ndGgsIHR4X2luZGV4LAotCQkJCQkJCSZkb29yYmVsbF9wZW5kaW5nKSkKKwkJCQkJCQkmZG9vcmJlbGxfcGVuZGluZykpKQogCQkJCQlnb3RvIGNvbnN1bWVkOwotCQkJCWJyZWFrOworCQkJCWdvdG8geGRwX2Ryb3A7IC8qIERyb3Agb24geG1pdCBmYWlsdXJlICovCiAJCQlkZWZhdWx0OgogCQkJCWJwZl93YXJuX2ludmFsaWRfeGRwX2FjdGlvbihhY3QpOwogCQkJY2FzZSBYRFBfQUJPUlRFRDoKIAkJCWNhc2UgWERQX0RST1A6Ci0JCQkJaWYgKG1seDRfZW5fcnhfcmVjeWNsZShyaW5nLCBmcmFncykpCit4ZHBfZHJvcDoKKwkJCQlpZiAobGlrZWx5KG1seDRfZW5fcnhfcmVjeWNsZShyaW5nLCBmcmFncykpKQogCQkJCQlnb3RvIGNvbnN1bWVkOwogCQkJCWdvdG8gbmV4dDsKIAkJCX0KQEAgLTEwMTUsMTIgKzEwMTgsMTIgQEAKIAogCQkvKiBHUk8gbm90IHBvc3NpYmxlLCBjb21wbGV0ZSBwcm9jZXNzaW5nIGhlcmUgKi8KIAkJc2tiID0gbWx4NF9lbl9yeF9za2IocHJpdiwgcnhfZGVzYywgZnJhZ3MsIGxlbmd0aCk7Ci0JCWlmICghc2tiKSB7CisJCWlmICh1bmxpa2VseSghc2tiKSkgewogCQkJcmluZy0+ZHJvcHBlZCsrOwogCQkJZ290byBuZXh0OwogCQl9CiAKLSAgICAgICAgICAgICAgICBpZiAodW5saWtlbHkocHJpdi0+dmFsaWRhdGVfbG9vcGJhY2spKSB7CisJCWlmICh1bmxpa2VseShwcml2LT52YWxpZGF0ZV9sb29wYmFjaykpIHsKIAkJCXZhbGlkYXRlX2xvb3BiYWNrKHByaXYsIHNrYik7CiAJCQlnb3RvIG5leHQ7CiAJCX0KQEAgLTEwNzcsNiArMTA4MCw3IEBACiAJfQogCiBvdXQ6CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAJaWYgKGRvb3JiZWxsX3BlbmRpbmcpCiAJCW1seDRfZW5feG1pdF9kb29yYmVsbChwcml2LT50eF9yaW5nW3R4X2luZGV4XSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fdHguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fdHguYwppbmRleCA5ZGY4N2NhLi5lMjUwOWJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX3R4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl90eC5jCkBAIC04MTgsNyArODE4LDcgQEAKIAlyZWFsX3NpemUgPSBnZXRfcmVhbF9zaXplKHNrYiwgc2hpbmZvLCBkZXYsICZsc29faGVhZGVyX3NpemUsCiAJCQkJICAmaW5saW5lX29rLCAmZnJhZ3B0cik7CiAJaWYgKHVubGlrZWx5KCFyZWFsX3NpemUpKQotCQlnb3RvIHR4X2Ryb3A7CisJCWdvdG8gdHhfZHJvcF9jb3VudDsKIAogCS8qIEFsaWduIGRlc2NyaXB0b3IgdG8gVFhCQiBzaXplICovCiAJZGVzY19zaXplID0gQUxJR04ocmVhbF9zaXplLCBUWEJCX1NJWkUpOwpAQCAtODI2LDcgKzgyNiw3IEBACiAJaWYgKHVubGlrZWx5KG5yX3R4YmIgPiBNQVhfREVTQ19UWEJCUykpIHsKIAkJaWYgKG5ldGlmX21zZ190eF9lcnIocHJpdikpCiAJCQllbl93YXJuKHByaXYsICJPdmVyc2l6ZWQgaGVhZGVyIG9yIFNHIGxpc3RcbiIpOwotCQlnb3RvIHR4X2Ryb3A7CisJCWdvdG8gdHhfZHJvcF9jb3VudDsKIAl9CiAKIAliZl9vayA9IHJpbmctPmJmX2VuYWJsZWQ7CkBAIC0xMDcxLDkgKzEwNzEsMTAgQEAKIAkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKIAl9CiAKK3R4X2Ryb3BfY291bnQ6CisJcmluZy0+dHhfZHJvcHBlZCsrOwogdHhfZHJvcDoKIAlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCXJpbmctPnR4X2Ryb3BwZWQrKzsKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogfQogCkBAIC0xMTA2LDcgKzExMDcsNyBAQAogCQlnb3RvIHR4X2Ryb3A7CiAKIAlpZiAobWx4NF9lbl9pc190eF9yaW5nX2Z1bGwocmluZykpCi0JCWdvdG8gdHhfZHJvcDsKKwkJZ290byB0eF9kcm9wX2NvdW50OwogCiAJLyogZmV0Y2ggcmluZy0+Y29ucyBmYXIgYWhlYWQgYmVmb3JlIG5lZWRpbmcgaXQgdG8gYXZvaWQgc3RhbGwgKi8KIAlyaW5nX2NvbnMgPSBSRUFEX09OQ0UocmluZy0+Y29ucyk7CkBAIC0xMTc2LDcgKzExNzcsOCBAQAogCiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAotdHhfZHJvcDoKK3R4X2Ryb3BfY291bnQ6CiAJcmluZy0+dHhfZHJvcHBlZCsrOwordHhfZHJvcDoKIAlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VxLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VxLmMKaW5kZXggZjYxMzk3Ny4uY2Y4ZjhhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lcS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZXEuYwpAQCAtMTMwNSw4ICsxMzA1LDggQEAKIAlyZXR1cm4gMDsKIAogZXJyX291dF91bm1hcDoKLQl3aGlsZSAoaSA+PSAwKQotCQltbHg0X2ZyZWVfZXEoZGV2LCAmcHJpdi0+ZXFfdGFibGUuZXFbaS0tXSk7CisJd2hpbGUgKGkgPiAwKQorCQltbHg0X2ZyZWVfZXEoZGV2LCAmcHJpdi0+ZXFfdGFibGUuZXFbLS1pXSk7CiAjaWZkZWYgQ09ORklHX1JGU19BQ0NFTAogCWZvciAoaSA9IDE7IGkgPD0gZGV2LT5jYXBzLm51bV9wb3J0czsgaSsrKSB7CiAJCWlmIChtbHg0X3ByaXYoZGV2KS0+cG9ydFtpXS5ybWFwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2Z3LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2Z3LmMKaW5kZXggZDcyODcwNC4uZjljYmM2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9mdy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZncuYwpAQCAtMTU4LDcgKzE1OCw4IEBACiAJCVszMV0gPSAiTW9kaWZ5aW5nIGxvb3BiYWNrIHNvdXJjZSBjaGVja3MgdXNpbmcgVVBEQVRFX1FQIHN1cHBvcnQiLAogCQlbMzJdID0gIkxvb3BiYWNrIHNvdXJjZSBjaGVja3Mgc3VwcG9ydCIsCiAJCVszM10gPSAiUm9DRXYyIHN1cHBvcnQiLAotCQlbMzRdID0gIkRNRlMgU25pZmZlciBzdXBwb3J0IChVQyAmIE1DKSIKKwkJWzM0XSA9ICJETUZTIFNuaWZmZXIgc3VwcG9ydCAoVUMgJiBNQykiLAorCQlbMzVdID0gIlFpblEgVlNUIG1vZGUgc3VwcG9ydCIsCiAJfTsKIAlpbnQgaTsKIApAQCAtMjQ4LDYgKzI0OSw3MiBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgbWx4NF9hY3RpdmF0ZV92c3RfcWlucShzdHJ1Y3QgbWx4NF9wcml2ICpwcml2LCBpbnQgc2xhdmUsIGludCBwb3J0KQoreworCXN0cnVjdCBtbHg0X3Zwb3J0X29wZXJfc3RhdGUgKnZwX29wZXI7CisJc3RydWN0IG1seDRfdnBvcnRfc3RhdGUgKnZwX2FkbWluOworCWludCBlcnI7CisKKwl2cF9vcGVyID0gJnByaXYtPm1mdW5jLm1hc3Rlci52Zl9vcGVyW3NsYXZlXS52cG9ydFtwb3J0XTsKKwl2cF9hZG1pbiA9ICZwcml2LT5tZnVuYy5tYXN0ZXIudmZfYWRtaW5bc2xhdmVdLnZwb3J0W3BvcnRdOworCisJaWYgKHZwX2FkbWluLT5kZWZhdWx0X3ZsYW4gIT0gdnBfb3Blci0+c3RhdGUuZGVmYXVsdF92bGFuKSB7CisJCWVyciA9IF9fbWx4NF9yZWdpc3Rlcl92bGFuKCZwcml2LT5kZXYsIHBvcnQsCisJCQkJCSAgIHZwX2FkbWluLT5kZWZhdWx0X3ZsYW4sCisJCQkJCSAgICZ2cF9vcGVyLT52bGFuX2lkeCk7CisJCWlmIChlcnIpIHsKKwkJCXZwX29wZXItPnZsYW5faWR4ID0gTk9fSU5EWDsKKwkJCW1seDRfd2FybigmcHJpdi0+ZGV2LAorCQkJCSAgIk5vIHZsYW4gcmVzb3VyY2VzIHNsYXZlICVkLCBwb3J0ICVkXG4iLAorCQkJCSAgc2xhdmUsIHBvcnQpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQltbHg0X2RiZygmcHJpdi0+ZGV2LCAiYWxsb2MgdmxhbiAlZCBpZHggICVkIHNsYXZlICVkIHBvcnQgJWRcbiIsCisJCQkgKGludCkodnBfb3Blci0+c3RhdGUuZGVmYXVsdF92bGFuKSwKKwkJCSB2cF9vcGVyLT52bGFuX2lkeCwgc2xhdmUsIHBvcnQpOworCX0KKwl2cF9vcGVyLT5zdGF0ZS52bGFuX3Byb3RvICAgPSB2cF9hZG1pbi0+dmxhbl9wcm90bzsKKwl2cF9vcGVyLT5zdGF0ZS5kZWZhdWx0X3ZsYW4gPSB2cF9hZG1pbi0+ZGVmYXVsdF92bGFuOworCXZwX29wZXItPnN0YXRlLmRlZmF1bHRfcW9zICA9IHZwX2FkbWluLT5kZWZhdWx0X3FvczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1seDRfaGFuZGxlX3ZzdF9xaW5xKHN0cnVjdCBtbHg0X3ByaXYgKnByaXYsIGludCBzbGF2ZSwgaW50IHBvcnQpCit7CisJc3RydWN0IG1seDRfdnBvcnRfb3Blcl9zdGF0ZSAqdnBfb3BlcjsKKwlzdHJ1Y3QgbWx4NF9zbGF2ZV9zdGF0ZSAqc2xhdmVfc3RhdGU7CisJc3RydWN0IG1seDRfdnBvcnRfc3RhdGUgKnZwX2FkbWluOworCWludCBlcnI7CisKKwl2cF9vcGVyID0gJnByaXYtPm1mdW5jLm1hc3Rlci52Zl9vcGVyW3NsYXZlXS52cG9ydFtwb3J0XTsKKwl2cF9hZG1pbiA9ICZwcml2LT5tZnVuYy5tYXN0ZXIudmZfYWRtaW5bc2xhdmVdLnZwb3J0W3BvcnRdOworCXNsYXZlX3N0YXRlID0gJnByaXYtPm1mdW5jLm1hc3Rlci5zbGF2ZV9zdGF0ZVtzbGF2ZV07CisKKwlpZiAoKHZwX2FkbWluLT52bGFuX3Byb3RvICE9IGh0b25zKEVUSF9QXzgwMjFBRCkpIHx8CisJICAgICghc2xhdmVfc3RhdGUtPmFjdGl2ZSkpCisJCXJldHVybiAwOworCisJaWYgKHZwX29wZXItPnN0YXRlLnZsYW5fcHJvdG8gPT0gdnBfYWRtaW4tPnZsYW5fcHJvdG8gJiYKKwkgICAgdnBfb3Blci0+c3RhdGUuZGVmYXVsdF92bGFuID09IHZwX2FkbWluLT5kZWZhdWx0X3ZsYW4gJiYKKwkgICAgdnBfb3Blci0+c3RhdGUuZGVmYXVsdF9xb3MgPT0gdnBfYWRtaW4tPmRlZmF1bHRfcW9zKQorCQlyZXR1cm4gMDsKKworCWlmICghc2xhdmVfc3RhdGUtPnZzdF9xaW5xX3N1cHBvcnRlZCkgeworCQkvKiBXYXJuIGFuZCByZXZlcnQgdGhlIHJlcXVlc3QgdG8gc2V0IHZzdCBRaW5RIG1vZGUgKi8KKwkJdnBfYWRtaW4tPnZsYW5fcHJvdG8gICA9IHZwX29wZXItPnN0YXRlLnZsYW5fcHJvdG87CisJCXZwX2FkbWluLT5kZWZhdWx0X3ZsYW4gPSB2cF9vcGVyLT5zdGF0ZS5kZWZhdWx0X3ZsYW47CisJCXZwX2FkbWluLT5kZWZhdWx0X3FvcyAgPSB2cF9vcGVyLT5zdGF0ZS5kZWZhdWx0X3FvczsKKworCQltbHg0X3dhcm4oJnByaXYtPmRldiwKKwkJCSAgIlNsYXZlICVkIGRvZXMgbm90IHN1cHBvcnQgVlNUIFFpblEgbW9kZVxuIiwgc2xhdmUpOworCQlyZXR1cm4gMDsKKwl9CisKKwllcnIgPSBtbHg0X2FjdGl2YXRlX3ZzdF9xaW5xKHByaXYsIHNsYXZlLCBwb3J0KTsKKwlyZXR1cm4gZXJyOworfQorCiBpbnQgbWx4NF9RVUVSWV9GVU5DX0NBUF93cmFwcGVyKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCiAJCQkJc3RydWN0IG1seDRfdmhjciAqdmhjciwKIAkJCQlzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqaW5ib3gsCkBAIC0zMTEsMTQgKzM3OCwxOCBAQAogI2RlZmluZSBRVUVSWV9GVU5DX0NBUF9WRl9FTkFCTEVfUVAwCQkweDA4CiAKICNkZWZpbmUgUVVFUllfRlVOQ19DQVBfRkxBR1MwX0ZPUkNFX1BIWV9XUUVfR0lEIDB4ODAKLSNkZWZpbmUgUVVFUllfRlVOQ19DQVBfU1VQUE9SVFNfTk9OX1BPV0VSX09GXzJfTlVNX0VRUyAoMSA8PCAzMSkKICNkZWZpbmUgUVVFUllfRlVOQ19DQVBfUEhWX0JJVAkJCTB4NDAKKyNkZWZpbmUgUVVFUllfRlVOQ19DQVBfVkxBTl9PRkZMT0FEX0RJU0FCTEUJMHgyMAorCisjZGVmaW5lIFFVRVJZX0ZVTkNfQ0FQX1NVUFBPUlRTX1ZTVF9RSU5RCUJJVCgzMCkKKyNkZWZpbmUgUVVFUllfRlVOQ19DQVBfU1VQUE9SVFNfTk9OX1BPV0VSX09GXzJfTlVNX0VRUyBCSVQoMzEpCiAKIAlpZiAodmhjci0+b3BfbW9kaWZpZXIgPT0gMSkgewogCQlzdHJ1Y3QgbWx4NF9hY3RpdmVfcG9ydHMgYWN0dl9wb3J0cyA9CiAJCQltbHg0X2dldF9hY3RpdmVfcG9ydHMoZGV2LCBzbGF2ZSk7CiAJCWludCBjb252ZXJ0ZWRfcG9ydCA9IG1seDRfc2xhdmVfY29udmVydF9wb3J0KAogCQkJCWRldiwgc2xhdmUsIHZoY3ItPmluX21vZGlmaWVyKTsKKwkJc3RydWN0IG1seDRfdnBvcnRfb3Blcl9zdGF0ZSAqdnBfb3BlcjsKIAogCQlpZiAoY29udmVydGVkX3BvcnQgPCAwKQogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zNTcsMTUgKzQyOCwyNCBAQAogCQlNTFg0X1BVVChvdXRib3gtPmJ1ZiwgZGV2LT5jYXBzLnBoeXNfcG9ydF9pZFt2aGNyLT5pbl9tb2RpZmllcl0sCiAJCQkgUVVFUllfRlVOQ19DQVBfUEhZU19QT1JUX0lEKTsKIAotCQlpZiAoZGV2LT5jYXBzLnBodl9iaXRbcG9ydF0pIHsKLQkJCWZpZWxkID0gUVVFUllfRlVOQ19DQVBfUEhWX0JJVDsKLQkJCU1MWDRfUFVUKG91dGJveC0+YnVmLCBmaWVsZCwKLQkJCQkgUVVFUllfRlVOQ19DQVBfRkxBR1MwX09GRlNFVCk7Ci0JCX0KKwkJdnBfb3BlciA9ICZwcml2LT5tZnVuYy5tYXN0ZXIudmZfb3BlcltzbGF2ZV0udnBvcnRbcG9ydF07CisJCWVyciA9IG1seDRfaGFuZGxlX3ZzdF9xaW5xKHByaXYsIHNsYXZlLCBwb3J0KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJZmllbGQgPSAwOworCQlpZiAoZGV2LT5jYXBzLnBodl9iaXRbcG9ydF0pCisJCQlmaWVsZCB8PSBRVUVSWV9GVU5DX0NBUF9QSFZfQklUOworCQlpZiAodnBfb3Blci0+c3RhdGUudmxhbl9wcm90byA9PSBodG9ucyhFVEhfUF84MDIxQUQpKQorCQkJZmllbGQgfD0gUVVFUllfRlVOQ19DQVBfVkxBTl9PRkZMT0FEX0RJU0FCTEU7CisJCU1MWDRfUFVUKG91dGJveC0+YnVmLCBmaWVsZCwgUVVFUllfRlVOQ19DQVBfRkxBR1MwX09GRlNFVCk7CiAKIAl9IGVsc2UgaWYgKHZoY3ItPm9wX21vZGlmaWVyID09IDApIHsKIAkJc3RydWN0IG1seDRfYWN0aXZlX3BvcnRzIGFjdHZfcG9ydHMgPQogCQkJbWx4NF9nZXRfYWN0aXZlX3BvcnRzKGRldiwgc2xhdmUpOworCQlzdHJ1Y3QgbWx4NF9zbGF2ZV9zdGF0ZSAqc2xhdmVfc3RhdGUgPQorCQkJJnByaXYtPm1mdW5jLm1hc3Rlci5zbGF2ZV9zdGF0ZVtzbGF2ZV07CisKIAkJLyogZW5hYmxlIHJkbWEgYW5kIGV0aGVybmV0IGludGVyZmFjZXMsIG5ldyBxdW90YSBsb2NhdGlvbnMsCiAJCSAqIGFuZCByZXNlcnZlZCBsa2V5CiAJCSAqLwpAQCAtNDM5LDYgKzUxOSwxMCBAQAogCiAJCXNpemUgPSBkZXYtPmNhcHMucmVzZXJ2ZWRfbGtleSArICgoc2xhdmUgPDwgOCkgJiAweEZGMDApOwogCQlNTFg0X1BVVChvdXRib3gtPmJ1Ziwgc2l6ZSwgUVVFUllfRlVOQ19DQVBfUVBfUkVTRF9MS0VZX09GRlNFVCk7CisKKwkJaWYgKHZoY3ItPmluX21vZGlmaWVyICYgUVVFUllfRlVOQ19DQVBfU1VQUE9SVFNfVlNUX1FJTlEpCisJCQlzbGF2ZV9zdGF0ZS0+dnN0X3FpbnFfc3VwcG9ydGVkID0gdHJ1ZTsKKwogCX0gZWxzZQogCQllcnIgPSAtRUlOVkFMOwogCkBAIC00NTQsMTAgKzUzOCwxMiBAQAogCXUzMgkJCXNpemUsIHFrZXk7CiAJaW50CQkJZXJyID0gMCwgcXVvdGFzID0gMDsKIAl1MzIgICAgICAgICAgICAgICAgICAgICBpbl9tb2RpZmllcjsKKwl1MzIJCQlzbGF2ZV9jYXBzOwogCiAJb3BfbW9kaWZpZXIgPSAhIWdlbl9vcl9wb3J0OyAvKiAwID0gZ2VuZXJhbCwgMSA9IGxvZ2ljYWwgcG9ydCAqLwotCWluX21vZGlmaWVyID0gb3BfbW9kaWZpZXIgPyBnZW5fb3JfcG9ydCA6CisJc2xhdmVfY2FwcyA9IFFVRVJZX0ZVTkNfQ0FQX1NVUFBPUlRTX1ZTVF9RSU5RIHwKIAkJUVVFUllfRlVOQ19DQVBfU1VQUE9SVFNfTk9OX1BPV0VSX09GXzJfTlVNX0VRUzsKKwlpbl9tb2RpZmllciA9IG9wX21vZGlmaWVyID8gZ2VuX29yX3BvcnQgOiBzbGF2ZV9jYXBzOwogCiAJbWFpbGJveCA9IG1seDRfYWxsb2NfY21kX21haWxib3goZGV2KTsKIAlpZiAoSVNfRVJSKG1haWxib3gpKQpAQCAtNjEyLDggKzY5OCw3IEBACiAJCU1MWDRfR0VUKGZ1bmNfY2FwLT5waHlzX3BvcnRfaWQsIG91dGJveCwKIAkJCSBRVUVSWV9GVU5DX0NBUF9QSFlTX1BPUlRfSUQpOwogCi0JTUxYNF9HRVQoZmllbGQsIG91dGJveCwgUVVFUllfRlVOQ19DQVBfRkxBR1MwX09GRlNFVCk7Ci0JZnVuY19jYXAtPmZsYWdzIHw9IChmaWVsZCAmIFFVRVJZX0ZVTkNfQ0FQX1BIVl9CSVQpOworCU1MWDRfR0VUKGZ1bmNfY2FwLT5mbGFnczAsIG91dGJveCwgUVVFUllfRlVOQ19DQVBfRkxBR1MwX09GRlNFVCk7CiAKIAkvKiBBbGwgb3RoZXIgcmVzb3VyY2VzIGFyZSBhbGxvY2F0ZWQgYnkgdGhlIG1hc3RlciwgYnV0IHdlIHN0aWxsIHJlcG9ydAogCSAqICdudW0nIGFuZCAncmVzZXJ2ZWQnIGNhcGFiaWxpdGllcyBhcyBmb2xsb3dzOgpAQCAtNjkwLDYgKzc3NSw3IEBACiAjZGVmaW5lIFFVRVJZX0RFVl9DQVBfTUFYX0RFU0NfU1pfU1FfT0ZGU0VUCTB4NTIKICNkZWZpbmUgUVVFUllfREVWX0NBUF9NQVhfU0dfUlFfT0ZGU0VUCQkweDU1CiAjZGVmaW5lIFFVRVJZX0RFVl9DQVBfTUFYX0RFU0NfU1pfUlFfT0ZGU0VUCTB4NTYKKyNkZWZpbmUgUVVFUllfREVWX0NBUF9TVkxBTl9CWV9RUF9PRkZTRVQJMHg1RAogI2RlZmluZSBRVUVSWV9ERVZfQ0FQX01BWF9RUF9NQ0dfT0ZGU0VUCQkweDYxCiAjZGVmaW5lIFFVRVJZX0RFVl9DQVBfUlNWRF9NQ0dfT0ZGU0VUCQkweDYyCiAjZGVmaW5lIFFVRVJZX0RFVl9DQVBfTUFYX01DR19PRkZTRVQJCTB4NjMKQEAgLTc2NywxMiArODUzLDggQEAKIAlkZXZfY2FwLT5tYXhfZXFzID0gMSA8PCAoZmllbGQgJiAweGYpOwogCU1MWDRfR0VUKGZpZWxkLCBvdXRib3gsIFFVRVJZX0RFVl9DQVBfUlNWRF9NVFRfT0ZGU0VUKTsKIAlkZXZfY2FwLT5yZXNlcnZlZF9tdHRzID0gMSA8PCAoZmllbGQgPj4gNCk7Ci0JTUxYNF9HRVQoZmllbGQsIG91dGJveCwgUVVFUllfREVWX0NBUF9NQVhfTVJXX1NaX09GRlNFVCk7Ci0JZGV2X2NhcC0+bWF4X21yd19zeiA9IDEgPDwgZmllbGQ7CiAJTUxYNF9HRVQoZmllbGQsIG91dGJveCwgUVVFUllfREVWX0NBUF9SU1ZEX01SV19PRkZTRVQpOwogCWRldl9jYXAtPnJlc2VydmVkX21yd3MgPSAxIDw8IChmaWVsZCAmIDB4Zik7Ci0JTUxYNF9HRVQoZmllbGQsIG91dGJveCwgUVVFUllfREVWX0NBUF9NQVhfTVRUX1NFR19PRkZTRVQpOwotCWRldl9jYXAtPm1heF9tdHRfc2VnID0gMSA8PCAoZmllbGQgJiAweDNmKTsKIAlNTFg0X0dFVChzaXplLCBvdXRib3gsIFFVRVJZX0RFVl9DQVBfTlVNX1NZU19FUV9PRkZTRVQpOwogCWRldl9jYXAtPm51bV9zeXNfZXFzID0gc2l6ZSAmIDB4ZmZmOwogCU1MWDRfR0VUKGZpZWxkLCBvdXRib3gsIFFVRVJZX0RFVl9DQVBfTUFYX1JFUV9RUF9PRkZTRVQpOwpAQCAtODU3LDYgKzkzOSw5IEBACiAJTUxYNF9HRVQoc2l6ZSwgb3V0Ym94LCBRVUVSWV9ERVZfQ0FQX01BWF9ERVNDX1NaX1NRX09GRlNFVCk7CiAJZGV2X2NhcC0+bWF4X3NxX2Rlc2Nfc3ogPSBzaXplOwogCisJTUxYNF9HRVQoZmllbGQsIG91dGJveCwgUVVFUllfREVWX0NBUF9TVkxBTl9CWV9RUF9PRkZTRVQpOworCWlmIChmaWVsZCAmIDB4MSkKKwkJZGV2X2NhcC0+ZmxhZ3MyIHw9IE1MWDRfREVWX0NBUF9GTEFHMl9TVkxBTl9CWV9RUDsKIAlNTFg0X0dFVChmaWVsZCwgb3V0Ym94LCBRVUVSWV9ERVZfQ0FQX01BWF9RUF9NQ0dfT0ZGU0VUKTsKIAlkZXZfY2FwLT5tYXhfcXBfcGVyX21jZyA9IDEgPDwgZmllbGQ7CiAJTUxYNF9HRVQoZmllbGQsIG91dGJveCwgUVVFUllfREVWX0NBUF9SU1ZEX01DR19PRkZTRVQpOwpAQCAtMjkxNCw3ICsyOTk5LDcgQEAKIAltZW1zZXQoJmZ1bmNfY2FwLCAwLCBzaXplb2YoZnVuY19jYXApKTsKIAllcnIgPSBtbHg0X1FVRVJZX0ZVTkNfQ0FQKGRldiwgcG9ydCwgJmZ1bmNfY2FwKTsKIAlpZiAoIWVycikKLQkJKnBodiA9IGZ1bmNfY2FwLmZsYWdzICYgUVVFUllfRlVOQ19DQVBfUEhWX0JJVDsKKwkJKnBodiA9IGZ1bmNfY2FwLmZsYWdzMCAmIFFVRVJZX0ZVTkNfQ0FQX1BIVl9CSVQ7CiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0woZ2V0X3Bodl9iaXQpOwpAQCAtMjkzOCw2ICszMDIzLDIyIEBACiB9CiBFWFBPUlRfU1lNQk9MKHNldF9waHZfYml0KTsKIAoraW50IG1seDRfZ2V0X2lzX3ZsYW5fb2ZmbG9hZF9kaXNhYmxlZChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwKKwkJCQkgICAgICBib29sICp2bGFuX29mZmxvYWRfZGlzYWJsZWQpCit7CisJc3RydWN0IG1seDRfZnVuY19jYXAgZnVuY19jYXA7CisJaW50IGVycjsKKworCW1lbXNldCgmZnVuY19jYXAsIDAsIHNpemVvZihmdW5jX2NhcCkpOworCWVyciA9IG1seDRfUVVFUllfRlVOQ19DQVAoZGV2LCBwb3J0LCAmZnVuY19jYXApOworCWlmICghZXJyKQorCQkqdmxhbl9vZmZsb2FkX2Rpc2FibGVkID0KKwkJCSEhKGZ1bmNfY2FwLmZsYWdzMCAmCisJCQkgICBRVUVSWV9GVU5DX0NBUF9WTEFOX09GRkxPQURfRElTQUJMRSk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0wobWx4NF9nZXRfaXNfdmxhbl9vZmZsb2FkX2Rpc2FibGVkKTsKKwogdm9pZCBtbHg0X3JlcGxhY2VfemVyb19tYWNzKHN0cnVjdCBtbHg0X2RldiAqZGV2KQogewogCWludCBpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9mdy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9mdy5oCmluZGV4IGNkYmQ3NmYuLjUzNDNhMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZncuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2Z3LmgKQEAgLTgwLDkgKzgwLDcgQEAKIAlpbnQgbWF4X2VxczsKIAlpbnQgbnVtX3N5c19lcXM7CiAJaW50IHJlc2VydmVkX210dHM7Ci0JaW50IG1heF9tcndfc3o7CiAJaW50IHJlc2VydmVkX21yd3M7Ci0JaW50IG1heF9tdHRfc2VnOwogCWludCBtYXhfcmVxdWVzdGVyX3Blcl9xcDsKIAlpbnQgbWF4X3Jlc3BvbmRlcl9wZXJfcXA7CiAJaW50IG1heF9yZG1hX2dsb2JhbDsKQEAgLTE1Miw3ICsxNTAsNyBAQAogCXUzMglxcDFfcHJveHlfcXBuOwogCXUzMglyZXNlcnZlZF9sa2V5OwogCXU4CXBoeXNpY2FsX3BvcnQ7Ci0JdTgJcG9ydF9mbGFnczsKKwl1OAlmbGFnczA7CiAJdTgJZmxhZ3MxOwogCXU2NAlwaHlzX3BvcnRfaWQ7CiAJdTMyCWV4dHJhX2ZsYWdzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21haW4uYwppbmRleCA3NWRkMmUzLi43MTgzYWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21haW4uYwpAQCAtMjk3MCw2ICsyOTcwLDcgQEAKIAkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBtdHUgZmlsZSBmb3IgcG9ydCAlZFxuIiwgcG9ydCk7CiAJCWRldmljZV9yZW1vdmVfZmlsZSgmaW5mby0+ZGV2LT5wZXJzaXN0LT5wZGV2LT5kZXYsCiAJCQkJICAgJmluZm8tPnBvcnRfYXR0cik7CisJCWRldmxpbmtfcG9ydF91bnJlZ2lzdGVyKCZpbmZvLT5kZXZsaW5rX3BvcnQpOwogCQlpbmZvLT5wb3J0ID0gLTE7CiAJfQogCkBAIC0yOTg0LDYgKzI5ODUsOCBAQAogCWRldmljZV9yZW1vdmVfZmlsZSgmaW5mby0+ZGV2LT5wZXJzaXN0LT5wZGV2LT5kZXYsICZpbmZvLT5wb3J0X2F0dHIpOwogCWRldmljZV9yZW1vdmVfZmlsZSgmaW5mby0+ZGV2LT5wZXJzaXN0LT5wZGV2LT5kZXYsCiAJCQkgICAmaW5mby0+cG9ydF9tdHVfYXR0cik7CisJZGV2bGlua19wb3J0X3VucmVnaXN0ZXIoJmluZm8tPmRldmxpbmtfcG9ydCk7CisKICNpZmRlZiBDT05GSUdfUkZTX0FDQ0VMCiAJZnJlZV9pcnFfY3B1X3JtYXAoaW5mby0+cm1hcCk7CiAJaW5mby0+cm1hcCA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21seDQuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWx4NC5oCmluZGV4IGM5ZDdmYzUxLi5lNDg3OGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21seDQuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21seDQuaApAQCAtNDYsNiArNDYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bmV0L2RldmxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgogCiAjaW5jbHVkZSA8bGludXgvbWx4NC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tbHg0L2RyaXZlci5oPgpAQCAtNDgyLDYgKzQ4Myw3IEBACiAJdTggaW5pdF9wb3J0X21hc2s7CiAJYm9vbCBhY3RpdmU7CiAJYm9vbCBvbGRfdmxhbl9hcGk7CisJYm9vbCB2c3RfcWlucV9zdXBwb3J0ZWQ7CiAJdTggZnVuY3Rpb247CiAJZG1hX2FkZHJfdCB2aGNyX2RtYTsKIAl1MTYgbXR1W01MWDRfTUFYX1BPUlRTICsgMV07CkBAIC01MDcsNiArNTA5LDcgQEAKIAl1NjQgbWFjOwogCXUxNiBkZWZhdWx0X3ZsYW47CiAJdTggIGRlZmF1bHRfcW9zOworCV9fYmUxNiB2bGFuX3Byb3RvOwogCXUzMiB0eF9yYXRlOwogCWJvb2wgc3Bvb2ZjaGs7CiAJdTMyIGxpbmtfc3RhdGU7CkBAIC02MjcsNiArNjMwLDcgQEAKIAlzdHJ1Y3QgbXV0ZXgJCXNsYXZlX2NtZF9tdXRleDsKIAlzdHJ1Y3Qgc2VtYXBob3JlCXBvbGxfc2VtOwogCXN0cnVjdCBzZW1hcGhvcmUJZXZlbnRfc2VtOworCXN0cnVjdCByd19zZW1hcGhvcmUJc3dpdGNoX3NlbTsKIAlpbnQJCQltYXhfY21kczsKIAlzcGlubG9ja190CQljb250ZXh0X2xvY2s7CiAJaW50CQkJZnJlZV9oZWFkOwpAQCAtNjU1LDYgKzY1OSw3IEBACiAJdTggICAgICAgICAgICAgICAgICAgICAgcW9zX3Zwb3J0OwogCXUxNgkJCXZsYW5faWQ7CiAJdTE2CQkJb3JpZ192bGFuX2lkOworCV9fYmUxNgkJCXZsYW5fcHJvdG87CiB9OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWx4NF9lbi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tbHg0X2VuLmgKaW5kZXggMmMyOTEzZC4uYTM1MjhkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tbHg0X2VuLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tbHg0X2VuLmgKQEAgLTM0MCw3ICszNDAsNyBAQAogCXU4ICBmY3NfZGVsOwogCXZvaWQgKmJ1ZjsKIAl2b2lkICpyeF9pbmZvOwotCXN0cnVjdCBicGZfcHJvZyAqeGRwX3Byb2c7CisJc3RydWN0IGJwZl9wcm9nIF9fcmN1ICp4ZHBfcHJvZzsKIAlzdHJ1Y3QgbWx4NF9lbl9wYWdlX2NhY2hlIHBhZ2VfY2FjaGU7CiAJdW5zaWduZWQgbG9uZyBieXRlczsKIAl1bnNpZ25lZCBsb25nIHBhY2tldHM7CkBAIC00ODIsMjAgKzQ4MiwxMCBAQAogCXBmY19lbmFibGVkX3J4CiB9OwogCi1zdHJ1Y3QgdGNfY29uZmlndXJhdGlvbiB7Ci0JZW51bSBkY2JfcGZjX3R5cGUgIGRjYl9wZmM7Ci19OwotCiBzdHJ1Y3QgbWx4NF9lbl9jZWVfY29uZmlnIHsKIAlib29sCXBmY19zdGF0ZTsKLQlzdHJ1Y3QJdGNfY29uZmlndXJhdGlvbiB0Y19jb25maWdbTUxYNF9FTl9OVU1fVVBdOworCWVudW0JZGNiX3BmY190eXBlIGRjYl9wZmNbTUxYNF9FTl9OVU1fVVBdOwogfTsKLQotc3RydWN0IG1seDRfZW5fY2VlX3BhcmFtcyB7Ci0JdTggZGNieF9jYXA7Ci0Jc3RydWN0IG1seDRfZW5fY2VlX2NvbmZpZyBkY2JfY2ZnOwotfTsKLQogI2VuZGlmCiAKIHN0cnVjdCBldGh0b29sX2Zsb3dfaWQgewpAQCAtNjI0LDcgKzYxNCw4IEBACiAJc3RydWN0IGllZWVfZXRzIGV0czsKIAl1MTYgbWF4cmF0ZVtJRUVFXzgwMjFRQVpfTUFYX1RDU107CiAJZW51bSBkY2JubF9jbmRkX3N0YXRlcyBjbmRkX3N0YXRlW0lFRUVfODAyMVFBWl9NQVhfVENTXTsKLQlzdHJ1Y3QgbWx4NF9lbl9jZWVfcGFyYW1zIGNlZV9wYXJhbXM7CisJc3RydWN0IG1seDRfZW5fY2VlX2NvbmZpZyBjZWVfY29uZmlnOworCXU4IGRjYnhfY2FwOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1JGU19BQ0NFTAogCXNwaW5sb2NrX3QgZmlsdGVyc19sb2NrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9wb3J0LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3BvcnQuYwppbmRleCAzZDIwOTVlLi5jNWIyMDY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3BvcnQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3BvcnQuYwpAQCAtNTIsNyArNTIsNyBAQAogCiAjZGVmaW5lIE1MWDRfRkxBR19WX0lHTk9SRV9GQ1NfTUFTSwkJMHgyCiAjZGVmaW5lIE1MWDRfSUdOT1JFX0ZDU19NQVNLCQkJMHgxCi0jZGVmaW5lIE1MTlg0X1RYX01BWF9OVU1CRVIJCQk4CisjZGVmaW5lIE1MWDRfVENfTUFYX05VTUJFUgkJCTgKIAogdm9pZCBtbHg0X2luaXRfbWFjX3RhYmxlKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF9tYWNfdGFibGUgKnRhYmxlKQogewpAQCAtMjAyMiw3ICsyMDIyLDcgQEAKIAl1OCBudW1fdGMgPSBkZXYtPmNhcHMubWF4X3RjX2V0aDsKIAogCWlmICghbnVtX3RjKQotCQludW1fdGMgPSBNTE5YNF9UWF9NQVhfTlVNQkVSOworCQludW1fdGMgPSBNTFg0X1RDX01BWF9OVU1CRVI7CiAKIAlyZXR1cm4gbnVtX3RjOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9yZXNvdXJjZV90cmFja2VyLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3Jlc291cmNlX3RyYWNrZXIuYwppbmRleCA4YjgxMTE0Li44NGQ3ODU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3Jlc291cmNlX3RyYWNrZXIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3Jlc291cmNlX3RyYWNrZXIuYwpAQCAtNzkwLDEwICs3OTAsMjIgQEAKIAkJCQlNTFg0X1ZMQU5fQ1RSTF9FVEhfUlhfQkxPQ0tfVU5UQUdHRUQgfAogCQkJCU1MWDRfVkxBTl9DVFJMX0VUSF9SWF9CTE9DS19UQUdHRUQ7CiAJCX0gZWxzZSBpZiAoMCAhPSB2cF9vcGVyLT5zdGF0ZS5kZWZhdWx0X3ZsYW4pIHsKLQkJCXFwYy0+cHJpX3BhdGgudmxhbl9jb250cm9sIHw9Ci0JCQkJTUxYNF9WTEFOX0NUUkxfRVRIX1RYX0JMT0NLX1RBR0dFRCB8Ci0JCQkJTUxYNF9WTEFOX0NUUkxfRVRIX1JYX0JMT0NLX1BSSU9fVEFHR0VEIHwKLQkJCQlNTFg0X1ZMQU5fQ1RSTF9FVEhfUlhfQkxPQ0tfVU5UQUdHRUQ7CisJCQlpZiAodnBfb3Blci0+c3RhdGUudmxhbl9wcm90byA9PSBodG9ucyhFVEhfUF84MDIxQUQpKSB7CisJCQkJLyogdnN0IFFpblEgc2hvdWxkIGJsb2NrIHVudGFnZ2VkIG9uIFRYLAorCQkJCSAqIGJ1dCBjdmxhbiBpcyBpbiBwYXlsb2FkIGFuZCBwaHYgaXMgc2V0IHNvCisJCQkJICogaHcgc2VlIGl0IGFzIHVudGFnZ2VkLiBCbG9jayB0YWdnZWQgaW5zdGVhZC4KKwkJCQkgKi8KKwkJCQlxcGMtPnByaV9wYXRoLnZsYW5fY29udHJvbCB8PQorCQkJCQlNTFg0X1ZMQU5fQ1RSTF9FVEhfVFhfQkxPQ0tfUFJJT19UQUdHRUQgfAorCQkJCQlNTFg0X1ZMQU5fQ1RSTF9FVEhfVFhfQkxPQ0tfVEFHR0VEIHwKKwkJCQkJTUxYNF9WTEFOX0NUUkxfRVRIX1JYX0JMT0NLX1BSSU9fVEFHR0VEIHwKKwkJCQkJTUxYNF9WTEFOX0NUUkxfRVRIX1JYX0JMT0NLX1VOVEFHR0VEOworCQkJfSBlbHNlIHsgLyogdnN0IDgwMi4xUSAqLworCQkJCXFwYy0+cHJpX3BhdGgudmxhbl9jb250cm9sIHw9CisJCQkJCU1MWDRfVkxBTl9DVFJMX0VUSF9UWF9CTE9DS19UQUdHRUQgfAorCQkJCQlNTFg0X1ZMQU5fQ1RSTF9FVEhfUlhfQkxPQ0tfUFJJT19UQUdHRUQgfAorCQkJCQlNTFg0X1ZMQU5fQ1RSTF9FVEhfUlhfQkxPQ0tfVU5UQUdHRUQ7CisJCQl9CiAJCX0gZWxzZSB7IC8qIHByaW9yaXR5IHRhZ2dlZCAqLwogCQkJcXBjLT5wcmlfcGF0aC52bGFuX2NvbnRyb2wgfD0KIAkJCQlNTFg0X1ZMQU5fQ1RSTF9FVEhfVFhfQkxPQ0tfVEFHR0VEIHwKQEAgLTgwMiw3ICs4MTQsMTEgQEAKIAogCQlxcGMtPnByaV9wYXRoLmZ2bF9yeCB8PSBNTFg0X0ZWTF9SWF9GT1JDRV9FVEhfVkxBTjsKIAkJcXBjLT5wcmlfcGF0aC52bGFuX2luZGV4ID0gdnBfb3Blci0+dmxhbl9pZHg7Ci0JCXFwYy0+cHJpX3BhdGguZmwgfD0gTUxYNF9GTF9DViB8IE1MWDRfRkxfRVRIX0hJREVfQ1FFX1ZMQU47CisJCXFwYy0+cHJpX3BhdGguZmwgfD0gTUxYNF9GTF9FVEhfSElERV9DUUVfVkxBTjsKKwkJaWYgKHZwX29wZXItPnN0YXRlLnZsYW5fcHJvdG8gPT0gaHRvbnMoRVRIX1BfODAyMUFEKSkKKwkJCXFwYy0+cHJpX3BhdGguZmwgfD0gTUxYNF9GTF9TVjsKKwkJZWxzZQorCQkJcXBjLT5wcmlfcGF0aC5mbCB8PSBNTFg0X0ZMX0NWOwogCQlxcGMtPnByaV9wYXRoLmZldXAgfD0gTUxYNF9GRVVQX0ZPUkNFX0VUSF9VUCB8IE1MWDRfRlZMX0ZPUkNFX0VUSF9WTEFOOwogCQlxcGMtPnByaV9wYXRoLnNjaGVkX3F1ZXVlICY9IDB4Qzc7CiAJCXFwYy0+cHJpX3BhdGguc2NoZWRfcXVldWUgfD0gKHZwX29wZXItPnN0YXRlLmRlZmF1bHRfcW9zKSA8PCAzOwpAQCAtNTIzOCw2ICs1MjU0LDcgQEAKIAl1NjQgcXBfcGF0aF9tYXNrID0gKCgxVUxMIDw8IE1MWDRfVVBEX1FQX1BBVEhfTUFTS19WTEFOX0lOREVYKSB8CiAJCSAgICAgICAoMVVMTCA8PCBNTFg0X1VQRF9RUF9QQVRIX01BU0tfRlZMKSB8CiAJCSAgICAgICAoMVVMTCA8PCBNTFg0X1VQRF9RUF9QQVRIX01BU0tfQ1YpIHwKKwkJICAgICAgICgxVUxMIDw8IE1MWDRfVVBEX1FQX1BBVEhfTUFTS19TVikgfAogCQkgICAgICAgKDFVTEwgPDwgTUxYNF9VUERfUVBfUEFUSF9NQVNLX0VUSF9ISURFX0NRRV9WTEFOKSB8CiAJCSAgICAgICAoMVVMTCA8PCBNTFg0X1VQRF9RUF9QQVRIX01BU0tfRkVVUCkgfAogCQkgICAgICAgKDFVTEwgPDwgTUxYNF9VUERfUVBfUEFUSF9NQVNLX0ZWTF9SWCkgfApAQCAtNTI2Niw3ICs1MjgzLDEyIEBACiAJZWxzZSBpZiAoIXdvcmstPnZsYW5faWQpCiAJCXZsYW5fY29udHJvbCA9IE1MWDRfVkxBTl9DVFJMX0VUSF9UWF9CTE9DS19UQUdHRUQgfAogCQkJTUxYNF9WTEFOX0NUUkxfRVRIX1JYX0JMT0NLX1RBR0dFRDsKLQllbHNlCisJZWxzZSBpZiAod29yay0+dmxhbl9wcm90byA9PSBodG9ucyhFVEhfUF84MDIxQUQpKQorCQl2bGFuX2NvbnRyb2wgPSBNTFg0X1ZMQU5fQ1RSTF9FVEhfVFhfQkxPQ0tfUFJJT19UQUdHRUQgfAorCQkJTUxYNF9WTEFOX0NUUkxfRVRIX1RYX0JMT0NLX1RBR0dFRCB8CisJCQlNTFg0X1ZMQU5fQ1RSTF9FVEhfUlhfQkxPQ0tfUFJJT19UQUdHRUQgfAorCQkJTUxYNF9WTEFOX0NUUkxfRVRIX1JYX0JMT0NLX1VOVEFHR0VEOworCWVsc2UgIC8qIHZzdCA4MDIuMVEgKi8KIAkJdmxhbl9jb250cm9sID0gTUxYNF9WTEFOX0NUUkxfRVRIX1RYX0JMT0NLX1RBR0dFRCB8CiAJCQlNTFg0X1ZMQU5fQ1RSTF9FVEhfUlhfQkxPQ0tfUFJJT19UQUdHRUQgfAogCQkJTUxYNF9WTEFOX0NUUkxfRVRIX1JYX0JMT0NLX1VOVEFHR0VEOwpAQCAtNTMxMSw3ICs1MzMzLDExIEBACiAJCQkJdXBkX2NvbnRleHQtPnFwX2NvbnRleHQucHJpX3BhdGguZnZsX3J4ID0KIAkJCQkJcXAtPmZ2bF9yeCB8IE1MWDRfRlZMX1JYX0ZPUkNFX0VUSF9WTEFOOwogCQkJCXVwZF9jb250ZXh0LT5xcF9jb250ZXh0LnByaV9wYXRoLmZsID0KLQkJCQkJcXAtPnByaV9wYXRoX2ZsIHwgTUxYNF9GTF9DViB8IE1MWDRfRkxfRVRIX0hJREVfQ1FFX1ZMQU47CisJCQkJCXFwLT5wcmlfcGF0aF9mbCB8IE1MWDRfRkxfRVRIX0hJREVfQ1FFX1ZMQU47CisJCQkJaWYgKHdvcmstPnZsYW5fcHJvdG8gPT0gaHRvbnMoRVRIX1BfODAyMUFEKSkKKwkJCQkJdXBkX2NvbnRleHQtPnFwX2NvbnRleHQucHJpX3BhdGguZmwgfD0gTUxYNF9GTF9TVjsKKwkJCQllbHNlCisJCQkJCXVwZF9jb250ZXh0LT5xcF9jb250ZXh0LnByaV9wYXRoLmZsIHw9IE1MWDRfRkxfQ1Y7CiAJCQkJdXBkX2NvbnRleHQtPnFwX2NvbnRleHQucHJpX3BhdGguZmV1cCA9CiAJCQkJCXFwLT5mZXVwIHwgTUxYNF9GRVVQX0ZPUkNFX0VUSF9VUCB8IE1MWDRfRlZMX0ZPUkNFX0VUSF9WTEFOOwogCQkJCXVwZF9jb250ZXh0LT5xcF9jb250ZXh0LnByaV9wYXRoLnNjaGVkX3F1ZXVlID0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvc3JxLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3NycS5jCmluZGV4IDY3MTQ2NjIuLmY0NGQwODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvc3JxLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9zcnEuYwpAQCAtNDUsMTUgKzQ1LDEyIEBACiAJc3RydWN0IG1seDRfc3JxX3RhYmxlICpzcnFfdGFibGUgPSAmbWx4NF9wcml2KGRldiktPnNycV90YWJsZTsKIAlzdHJ1Y3QgbWx4NF9zcnEgKnNycTsKIAotCXNwaW5fbG9jaygmc3JxX3RhYmxlLT5sb2NrKTsKLQorCXJjdV9yZWFkX2xvY2soKTsKIAlzcnEgPSByYWRpeF90cmVlX2xvb2t1cCgmc3JxX3RhYmxlLT50cmVlLCBzcnFuICYgKGRldi0+Y2Fwcy5udW1fc3JxcyAtIDEpKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKIAlpZiAoc3JxKQogCQlhdG9taWNfaW5jKCZzcnEtPnJlZmNvdW50KTsKLQotCXNwaW5fdW5sb2NrKCZzcnFfdGFibGUtPmxvY2spOwotCi0JaWYgKCFzcnEpIHsKKwllbHNlIHsKIAkJbWx4NF93YXJuKGRldiwgIkFzeW5jIGV2ZW50IGZvciBib2d1cyBTUlEgJTA4eFxuIiwgc3Jxbik7CiAJCXJldHVybjsKIAl9CkBAIC0zMDEsMTIgKzI5OCwxMSBAQAogewogCXN0cnVjdCBtbHg0X3NycV90YWJsZSAqc3JxX3RhYmxlID0gJm1seDRfcHJpdihkZXYpLT5zcnFfdGFibGU7CiAJc3RydWN0IG1seDRfc3JxICpzcnE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZzcnFfdGFibGUtPmxvY2ssIGZsYWdzKTsKKwlyY3VfcmVhZF9sb2NrKCk7CiAJc3JxID0gcmFkaXhfdHJlZV9sb29rdXAoJnNycV90YWJsZS0+dHJlZSwKIAkJCQlzcnFuICYgKGRldi0+Y2Fwcy5udW1fc3JxcyAtIDEpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcnFfdGFibGUtPmxvY2ssIGZsYWdzKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKIAogCXJldHVybiBzcnE7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvTWFrZWZpbGUKaW5kZXggMDVjYzFlZi4uMDM0MzcyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9NYWtlZmlsZQpAQCAtMyw3ICszLDcgQEAKIG1seDVfY29yZS15IDo9CW1haW4ubyBjbWQubyBkZWJ1Z2ZzLm8gZncubyBlcS5vIHVhci5vIHBhZ2VhbGxvYy5vIFwKIAkJaGVhbHRoLm8gbWNnLm8gY3EubyBzcnEubyBhbGxvYy5vIHFwLm8gcG9ydC5vIG1yLm8gcGQubyBcCiAJCW1hZC5vIHRyYW5zb2JqLm8gdnBvcnQubyBzcmlvdi5vIGZzX2NtZC5vIGZzX2NvcmUubyBcCi0JCWZzX2NvdW50ZXJzLm8gcmwubworCQlmc19jb3VudGVycy5vIHJsLm8gbGFnLm8gZGV2Lm8KIAogbWx4NV9jb3JlLSQoQ09ORklHX01MWDVfQ09SRV9FTikgKz0gd3EubyBlc3dpdGNoLm8gZXN3aXRjaF9vZmZsb2Fkcy5vIFwKIAkJZW5fbWFpbi5vIGVuX2NvbW1vbi5vIGVuX2ZzLm8gZW5fZXRodG9vbC5vIGVuX3R4Lm8gXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2NtZC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2NtZC5jCmluZGV4IGQ2ZTJhMWMuLjFlNjM5ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9jbWQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvY21kLmMKQEAgLTE0MywxMyArMTQzLDE0IEBACiAJcmV0dXJuIGNtZC0+Y21kX2J1ZiArIChpZHggPDwgY21kLT5sb2dfc3RyaWRlKTsKIH0KIAotc3RhdGljIHU4IHhvcjhfYnVmKHZvaWQgKmJ1ZiwgaW50IGxlbikKK3N0YXRpYyB1OCB4b3I4X2J1Zih2b2lkICpidWYsIHNpemVfdCBvZmZzZXQsIGludCBsZW4pCiB7CiAJdTggKnB0ciA9IGJ1ZjsKIAl1OCBzdW0gPSAwOwogCWludCBpOworCWludCBlbmQgPSBsZW4gKyBvZmZzZXQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJZm9yIChpID0gb2Zmc2V0OyBpIDwgZW5kOyBpKyspCiAJCXN1bSBePSBwdHJbaV07CiAKIAlyZXR1cm4gc3VtOwpAQCAtMTU3LDQxICsxNTgsNDkgQEAKIAogc3RhdGljIGludCB2ZXJpZnlfYmxvY2tfc2lnKHN0cnVjdCBtbHg1X2NtZF9wcm90X2Jsb2NrICpibG9jaykKIHsKLQlpZiAoeG9yOF9idWYoYmxvY2stPnJzdmQwLCBzaXplb2YoKmJsb2NrKSAtIHNpemVvZihibG9jay0+ZGF0YSkgLSAxKSAhPSAweGZmKQorCXNpemVfdCByc3ZkMF9vZmYgPSBvZmZzZXRvZihzdHJ1Y3QgbWx4NV9jbWRfcHJvdF9ibG9jaywgcnN2ZDApOworCWludCB4b3JfbGVuID0gc2l6ZW9mKCpibG9jaykgLSBzaXplb2YoYmxvY2stPmRhdGEpIC0gMTsKKworCWlmICh4b3I4X2J1ZihibG9jaywgcnN2ZDBfb2ZmLCB4b3JfbGVuKSAhPSAweGZmKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICh4b3I4X2J1ZihibG9jaywgc2l6ZW9mKCpibG9jaykpICE9IDB4ZmYpCisJaWYgKHhvcjhfYnVmKGJsb2NrLCAwLCBzaXplb2YoKmJsb2NrKSkgIT0gMHhmZikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgY2FsY19ibG9ja19zaWcoc3RydWN0IG1seDVfY21kX3Byb3RfYmxvY2sgKmJsb2NrLCB1OCB0b2tlbiwKLQkJCSAgIGludCBjc3VtKQorc3RhdGljIHZvaWQgY2FsY19ibG9ja19zaWcoc3RydWN0IG1seDVfY21kX3Byb3RfYmxvY2sgKmJsb2NrKQogewotCWJsb2NrLT50b2tlbiA9IHRva2VuOwotCWlmIChjc3VtKSB7Ci0JCWJsb2NrLT5jdHJsX3NpZyA9IH54b3I4X2J1ZihibG9jay0+cnN2ZDAsIHNpemVvZigqYmxvY2spIC0KLQkJCQkJICAgIHNpemVvZihibG9jay0+ZGF0YSkgLSAyKTsKLQkJYmxvY2stPnNpZyA9IH54b3I4X2J1ZihibG9jaywgc2l6ZW9mKCpibG9jaykgLSAxKTsKLQl9CisJaW50IGN0cmxfeG9yX2xlbiA9IHNpemVvZigqYmxvY2spIC0gc2l6ZW9mKGJsb2NrLT5kYXRhKSAtIDI7CisJc2l6ZV90IHJzdmQwX29mZiA9IG9mZnNldG9mKHN0cnVjdCBtbHg1X2NtZF9wcm90X2Jsb2NrLCByc3ZkMCk7CisKKwlibG9jay0+Y3RybF9zaWcgPSB+eG9yOF9idWYoYmxvY2ssIHJzdmQwX29mZiwgY3RybF94b3JfbGVuKTsKKwlibG9jay0+c2lnID0gfnhvcjhfYnVmKGJsb2NrLCAwLCBzaXplb2YoKmJsb2NrKSAtIDEpOwogfQogCi1zdGF0aWMgdm9pZCBjYWxjX2NoYWluX3NpZyhzdHJ1Y3QgbWx4NV9jbWRfbXNnICptc2csIHU4IHRva2VuLCBpbnQgY3N1bSkKK3N0YXRpYyB2b2lkIGNhbGNfY2hhaW5fc2lnKHN0cnVjdCBtbHg1X2NtZF9tc2cgKm1zZykKIHsKIAlzdHJ1Y3QgbWx4NV9jbWRfbWFpbGJveCAqbmV4dCA9IG1zZy0+bmV4dDsKKwlpbnQgc2l6ZSA9IG1zZy0+bGVuOworCWludCBibGVuID0gc2l6ZSAtIG1pbl90KGludCwgc2l6ZW9mKG1zZy0+Zmlyc3QuZGF0YSksIHNpemUpOworCWludCBuID0gKGJsZW4gKyBNTFg1X0NNRF9EQVRBX0JMT0NLX1NJWkUgLSAxKQorCQkvIE1MWDVfQ01EX0RBVEFfQkxPQ0tfU0laRTsKKwlpbnQgaSA9IDA7CiAKLQl3aGlsZSAobmV4dCkgewotCQljYWxjX2Jsb2NrX3NpZyhuZXh0LT5idWYsIHRva2VuLCBjc3VtKTsKKwlmb3IgKGkgPSAwOyBpIDwgbiAmJiBuZXh0OyBpKyspICB7CisJCWNhbGNfYmxvY2tfc2lnKG5leHQtPmJ1Zik7CiAJCW5leHQgPSBuZXh0LT5uZXh0OwogCX0KIH0KIAogc3RhdGljIHZvaWQgc2V0X3NpZ25hdHVyZShzdHJ1Y3QgbWx4NV9jbWRfd29ya19lbnQgKmVudCwgaW50IGNzdW0pCiB7Ci0JZW50LT5sYXktPnNpZyA9IH54b3I4X2J1ZihlbnQtPmxheSwgc2l6ZW9mKCplbnQtPmxheSkpOwotCWNhbGNfY2hhaW5fc2lnKGVudC0+aW4sIGVudC0+dG9rZW4sIGNzdW0pOwotCWNhbGNfY2hhaW5fc2lnKGVudC0+b3V0LCBlbnQtPnRva2VuLCBjc3VtKTsKKwllbnQtPmxheS0+c2lnID0gfnhvcjhfYnVmKGVudC0+bGF5LCAwLCAgc2l6ZW9mKCplbnQtPmxheSkpOworCWlmIChjc3VtKSB7CisJCWNhbGNfY2hhaW5fc2lnKGVudC0+aW4pOworCQljYWxjX2NoYWluX3NpZyhlbnQtPm91dCk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBwb2xsX3RpbWVvdXQoc3RydWN0IG1seDVfY21kX3dvcmtfZW50ICplbnQpCkBAIC0yMjIsMTIgKzIzMSwxNyBAQAogCXN0cnVjdCBtbHg1X2NtZF9tYWlsYm94ICpuZXh0ID0gZW50LT5vdXQtPm5leHQ7CiAJaW50IGVycjsKIAl1OCBzaWc7CisJaW50IHNpemUgPSBlbnQtPm91dC0+bGVuOworCWludCBibGVuID0gc2l6ZSAtIG1pbl90KGludCwgc2l6ZW9mKGVudC0+b3V0LT5maXJzdC5kYXRhKSwgc2l6ZSk7CisJaW50IG4gPSAoYmxlbiArIE1MWDVfQ01EX0RBVEFfQkxPQ0tfU0laRSAtIDEpCisJCS8gTUxYNV9DTURfREFUQV9CTE9DS19TSVpFOworCWludCBpID0gMDsKIAotCXNpZyA9IHhvcjhfYnVmKGVudC0+bGF5LCBzaXplb2YoKmVudC0+bGF5KSk7CisJc2lnID0geG9yOF9idWYoZW50LT5sYXksIDAsIHNpemVvZigqZW50LT5sYXkpKTsKIAlpZiAoc2lnICE9IDB4ZmYpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jd2hpbGUgKG5leHQpIHsKKwlmb3IgKGkgPSAwOyBpIDwgbiAmJiBuZXh0OyBpKyspIHsKIAkJZXJyID0gdmVyaWZ5X2Jsb2NrX3NpZyhuZXh0LT5idWYpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKQEAgLTI4MCwxMSArMjk0LDEzIEBACiAJY2FzZSBNTFg1X0NNRF9PUF9ERUFMTE9DX1FfQ09VTlRFUjoKIAljYXNlIE1MWDVfQ01EX09QX0RFQUxMT0NfUEQ6CiAJY2FzZSBNTFg1X0NNRF9PUF9ERUFMTE9DX1VBUjoKLQljYXNlIE1MWDVfQ01EX09QX0RFVFRBQ0hfRlJPTV9NQ0c6CisJY2FzZSBNTFg1X0NNRF9PUF9ERVRBQ0hfRlJPTV9NQ0c6CiAJY2FzZSBNTFg1X0NNRF9PUF9ERUFMTE9DX1hSQ0Q6CiAJY2FzZSBNTFg1X0NNRF9PUF9ERUFMTE9DX1RSQU5TUE9SVF9ET01BSU46CiAJY2FzZSBNTFg1X0NNRF9PUF9ERUxFVEVfVlhMQU5fVURQX0RQT1JUOgogCWNhc2UgTUxYNV9DTURfT1BfREVMRVRFX0wyX1RBQkxFX0VOVFJZOgorCWNhc2UgTUxYNV9DTURfT1BfREVTVFJPWV9MQUc6CisJY2FzZSBNTFg1X0NNRF9PUF9ERVNUUk9ZX1ZQT1JUX0xBRzoKIAljYXNlIE1MWDVfQ01EX09QX0RFU1RST1lfVElSOgogCWNhc2UgTUxYNV9DTURfT1BfREVTVFJPWV9TUToKIAljYXNlIE1MWDVfQ01EX09QX0RFU1RST1lfUlE6CkBAIC0zMDEsNiArMzE3LDcgQEAKIAljYXNlIE1MWDVfQ01EX09QX01PRElGWV9GTE9XX1RBQkxFOgogCWNhc2UgTUxYNV9DTURfT1BfU0VUX0ZMT1dfVEFCTEVfRU5UUlk6CiAJY2FzZSBNTFg1X0NNRF9PUF9TRVRfRkxPV19UQUJMRV9ST09UOgorCWNhc2UgTUxYNV9DTURfT1BfREVBTExPQ19FTkNBUF9IRUFERVI6CiAJCXJldHVybiBNTFg1X0NNRF9TVEFUX09LOwogCiAJY2FzZSBNTFg1X0NNRF9PUF9RVUVSWV9IQ0FfQ0FQOgpAQCAtMzc1LDYgKzM5MiwxMCBAQAogCWNhc2UgTUxYNV9DTURfT1BfQUREX1ZYTEFOX1VEUF9EUE9SVDoKIAljYXNlIE1MWDVfQ01EX09QX1NFVF9MMl9UQUJMRV9FTlRSWToKIAljYXNlIE1MWDVfQ01EX09QX1FVRVJZX0wyX1RBQkxFX0VOVFJZOgorCWNhc2UgTUxYNV9DTURfT1BfQ1JFQVRFX0xBRzoKKwljYXNlIE1MWDVfQ01EX09QX01PRElGWV9MQUc6CisJY2FzZSBNTFg1X0NNRF9PUF9RVUVSWV9MQUc6CisJY2FzZSBNTFg1X0NNRF9PUF9DUkVBVEVfVlBPUlRfTEFHOgogCWNhc2UgTUxYNV9DTURfT1BfQ1JFQVRFX1RJUjoKIAljYXNlIE1MWDVfQ01EX09QX01PRElGWV9USVI6CiAJY2FzZSBNTFg1X0NNRF9PUF9RVUVSWV9USVI6CkBAIC00MDIsNiArNDIzLDcgQEAKIAljYXNlIE1MWDVfQ01EX09QX1FVRVJZX0ZMT1dfVEFCTEVfRU5UUlk6CiAJY2FzZSBNTFg1X0NNRF9PUF9BTExPQ19GTE9XX0NPVU5URVI6CiAJY2FzZSBNTFg1X0NNRF9PUF9RVUVSWV9GTE9XX0NPVU5URVI6CisJY2FzZSBNTFg1X0NNRF9PUF9BTExPQ19FTkNBUF9IRUFERVI6CiAJCSpzdGF0dXMgPSBNTFg1X0RSSVZFUl9TVEFUVVNfQUJPUlRFRDsKIAkJKnN5bmQgPSBNTFg1X0RSSVZFUl9TWU5EOwogCQlyZXR1cm4gLUVJTzsKQEAgLTQ5MCw3ICs1MTIsNyBAQAogCU1MWDVfQ09NTUFORF9TVFJfQ0FTRShDT05GSUdfSU5UX01PREVSQVRJT04pOwogCU1MWDVfQ09NTUFORF9TVFJfQ0FTRShBQ0NFU1NfUkVHKTsKIAlNTFg1X0NPTU1BTkRfU1RSX0NBU0UoQVRUQUNIX1RPX01DRyk7Ci0JTUxYNV9DT01NQU5EX1NUUl9DQVNFKERFVFRBQ0hfRlJPTV9NQ0cpOworCU1MWDVfQ09NTUFORF9TVFJfQ0FTRShERVRBQ0hfRlJPTV9NQ0cpOwogCU1MWDVfQ09NTUFORF9TVFJfQ0FTRShHRVRfRFJPUFBFRF9QQUNLRVRfTE9HKTsKIAlNTFg1X0NPTU1BTkRfU1RSX0NBU0UoTUFEX0lGQyk7CiAJTUxYNV9DT01NQU5EX1NUUl9DQVNFKFFVRVJZX01BRF9ERU1VWCk7CkBAIC01MTIsNiArNTM0LDEyIEBACiAJTUxYNV9DT01NQU5EX1NUUl9DQVNFKERFTEVURV9MMl9UQUJMRV9FTlRSWSk7CiAJTUxYNV9DT01NQU5EX1NUUl9DQVNFKFNFVF9XT0xfUk9MKTsKIAlNTFg1X0NPTU1BTkRfU1RSX0NBU0UoUVVFUllfV09MX1JPTCk7CisJTUxYNV9DT01NQU5EX1NUUl9DQVNFKENSRUFURV9MQUcpOworCU1MWDVfQ09NTUFORF9TVFJfQ0FTRShNT0RJRllfTEFHKTsKKwlNTFg1X0NPTU1BTkRfU1RSX0NBU0UoUVVFUllfTEFHKTsKKwlNTFg1X0NPTU1BTkRfU1RSX0NBU0UoREVTVFJPWV9MQUcpOworCU1MWDVfQ09NTUFORF9TVFJfQ0FTRShDUkVBVEVfVlBPUlRfTEFHKTsKKwlNTFg1X0NPTU1BTkRfU1RSX0NBU0UoREVTVFJPWV9WUE9SVF9MQUcpOwogCU1MWDVfQ09NTUFORF9TVFJfQ0FTRShDUkVBVEVfVElSKTsKIAlNTFg1X0NPTU1BTkRfU1RSX0NBU0UoTU9ESUZZX1RJUik7CiAJTUxYNV9DT01NQU5EX1NUUl9DQVNFKERFU1RST1lfVElSKTsKQEAgLTU1MCwxNSArNTc4LDEzMCBAQAogCU1MWDVfQ09NTUFORF9TVFJfQ0FTRShERUFMTE9DX0ZMT1dfQ09VTlRFUik7CiAJTUxYNV9DT01NQU5EX1NUUl9DQVNFKFFVRVJZX0ZMT1dfQ09VTlRFUik7CiAJTUxYNV9DT01NQU5EX1NUUl9DQVNFKE1PRElGWV9GTE9XX1RBQkxFKTsKKwlNTFg1X0NPTU1BTkRfU1RSX0NBU0UoQUxMT0NfRU5DQVBfSEVBREVSKTsKKwlNTFg1X0NPTU1BTkRfU1RSX0NBU0UoREVBTExPQ19FTkNBUF9IRUFERVIpOwogCWRlZmF1bHQ6IHJldHVybiAidW5rbm93biBjb21tYW5kIG9wY29kZSI7CiAJfQogfQogCitzdGF0aWMgY29uc3QgY2hhciAqY21kX3N0YXR1c19zdHIodTggc3RhdHVzKQoreworCXN3aXRjaCAoc3RhdHVzKSB7CisJY2FzZSBNTFg1X0NNRF9TVEFUX09LOgorCQlyZXR1cm4gIk9LIjsKKwljYXNlIE1MWDVfQ01EX1NUQVRfSU5UX0VSUjoKKwkJcmV0dXJuICJpbnRlcm5hbCBlcnJvciI7CisJY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9PUF9FUlI6CisJCXJldHVybiAiYmFkIG9wZXJhdGlvbiI7CisJY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9QQVJBTV9FUlI6CisJCXJldHVybiAiYmFkIHBhcmFtZXRlciI7CisJY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9TWVNfU1RBVEVfRVJSOgorCQlyZXR1cm4gImJhZCBzeXN0ZW0gc3RhdGUiOworCWNhc2UgTUxYNV9DTURfU1RBVF9CQURfUkVTX0VSUjoKKwkJcmV0dXJuICJiYWQgcmVzb3VyY2UiOworCWNhc2UgTUxYNV9DTURfU1RBVF9SRVNfQlVTWToKKwkJcmV0dXJuICJyZXNvdXJjZSBidXN5IjsKKwljYXNlIE1MWDVfQ01EX1NUQVRfTElNX0VSUjoKKwkJcmV0dXJuICJsaW1pdHMgZXhjZWVkZWQiOworCWNhc2UgTUxYNV9DTURfU1RBVF9CQURfUkVTX1NUQVRFX0VSUjoKKwkJcmV0dXJuICJiYWQgcmVzb3VyY2Ugc3RhdGUiOworCWNhc2UgTUxYNV9DTURfU1RBVF9JWF9FUlI6CisJCXJldHVybiAiYmFkIGluZGV4IjsKKwljYXNlIE1MWDVfQ01EX1NUQVRfTk9fUkVTX0VSUjoKKwkJcmV0dXJuICJubyByZXNvdXJjZXMiOworCWNhc2UgTUxYNV9DTURfU1RBVF9CQURfSU5QX0xFTl9FUlI6CisJCXJldHVybiAiYmFkIGlucHV0IGxlbmd0aCI7CisJY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9PVVRQX0xFTl9FUlI6CisJCXJldHVybiAiYmFkIG91dHB1dCBsZW5ndGgiOworCWNhc2UgTUxYNV9DTURfU1RBVF9CQURfUVBfU1RBVEVfRVJSOgorCQlyZXR1cm4gImJhZCBRUCBzdGF0ZSI7CisJY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9QS1RfRVJSOgorCQlyZXR1cm4gImJhZCBwYWNrZXQgKGRpc2NhcmRlZCkiOworCWNhc2UgTUxYNV9DTURfU1RBVF9CQURfU0laRV9PVVRTX0NRRVNfRVJSOgorCQlyZXR1cm4gImJhZCBzaXplIHRvbyBtYW55IG91dHN0YW5kaW5nIENRRXMiOworCWRlZmF1bHQ6CisJCXJldHVybiAidW5rbm93biBzdGF0dXMiOworCX0KK30KKworc3RhdGljIGludCBjbWRfc3RhdHVzX3RvX2Vycih1OCBzdGF0dXMpCit7CisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIE1MWDVfQ01EX1NUQVRfT0s6CQkJCXJldHVybiAwOworCWNhc2UgTUxYNV9DTURfU1RBVF9JTlRfRVJSOgkJCXJldHVybiAtRUlPOworCWNhc2UgTUxYNV9DTURfU1RBVF9CQURfT1BfRVJSOgkJCXJldHVybiAtRUlOVkFMOworCWNhc2UgTUxYNV9DTURfU1RBVF9CQURfUEFSQU1fRVJSOgkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9TWVNfU1RBVEVfRVJSOgkJcmV0dXJuIC1FSU87CisJY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9SRVNfRVJSOgkJCXJldHVybiAtRUlOVkFMOworCWNhc2UgTUxYNV9DTURfU1RBVF9SRVNfQlVTWToJCQlyZXR1cm4gLUVCVVNZOworCWNhc2UgTUxYNV9DTURfU1RBVF9MSU1fRVJSOgkJCXJldHVybiAtRU5PTUVNOworCWNhc2UgTUxYNV9DTURfU1RBVF9CQURfUkVTX1NUQVRFX0VSUjoJCXJldHVybiAtRUlOVkFMOworCWNhc2UgTUxYNV9DTURfU1RBVF9JWF9FUlI6CQkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBNTFg1X0NNRF9TVEFUX05PX1JFU19FUlI6CQkJcmV0dXJuIC1FQUdBSU47CisJY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9JTlBfTEVOX0VSUjoJCXJldHVybiAtRUlPOworCWNhc2UgTUxYNV9DTURfU1RBVF9CQURfT1VUUF9MRU5fRVJSOgkJcmV0dXJuIC1FSU87CisJY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9RUF9TVEFURV9FUlI6CQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX1BLVF9FUlI6CQkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9TSVpFX09VVFNfQ1FFU19FUlI6CXJldHVybiAtRUlOVkFMOworCWRlZmF1bHQ6CQkJCQlyZXR1cm4gLUVJTzsKKwl9Cit9CisKK3N0cnVjdCBtbHg1X2lmY19tYm94X291dF9iaXRzIHsKKwl1OCAgICAgICAgIHN0YXR1c1sweDhdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfOFsweDE4XTsKKworCXU4ICAgICAgICAgc3luZHJvbWVbMHgyMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzQwWzB4NDBdOworfTsKKworc3RydWN0IG1seDVfaWZjX21ib3hfaW5fYml0cyB7CisJdTggICAgICAgICBvcGNvZGVbMHgxMF07CisJdTggICAgICAgICByZXNlcnZlZF9hdF8xMFsweDEwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMjBbMHgxMF07CisJdTggICAgICAgICBvcF9tb2RbMHgxMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzQwWzB4NDBdOworfTsKKwordm9pZCBtbHg1X2NtZF9tYm94X3N0YXR1cyh2b2lkICpvdXQsIHU4ICpzdGF0dXMsIHUzMiAqc3luZHJvbWUpCit7CisJKnN0YXR1cyA9IE1MWDVfR0VUKG1ib3hfb3V0LCBvdXQsIHN0YXR1cyk7CisJKnN5bmRyb21lID0gTUxYNV9HRVQobWJveF9vdXQsIG91dCwgc3luZHJvbWUpOworfQorCitzdGF0aWMgaW50IG1seDVfY21kX2NoZWNrKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHZvaWQgKmluLCB2b2lkICpvdXQpCit7CisJdTMyIHN5bmRyb21lOworCXU4ICBzdGF0dXM7CisJdTE2IG9wY29kZTsKKwl1MTYgb3BfbW9kOworCisJbWx4NV9jbWRfbWJveF9zdGF0dXMob3V0LCAmc3RhdHVzLCAmc3luZHJvbWUpOworCWlmICghc3RhdHVzKQorCQlyZXR1cm4gMDsKKworCW9wY29kZSA9IE1MWDVfR0VUKG1ib3hfaW4sIGluLCBvcGNvZGUpOworCW9wX21vZCA9IE1MWDVfR0VUKG1ib3hfaW4sIGluLCBvcF9tb2QpOworCisJbWx4NV9jb3JlX2VycihkZXYsCisJCSAgICAgICIlcygweCV4KSBvcF9tb2QoMHgleCkgZmFpbGVkLCBzdGF0dXMgJXMoMHgleCksIHN5bmRyb21lICgweCV4KVxuIiwKKwkJICAgICAgbWx4NV9jb21tYW5kX3N0cihvcGNvZGUpLAorCQkgICAgICBvcGNvZGUsIG9wX21vZCwKKwkJICAgICAgY21kX3N0YXR1c19zdHIoc3RhdHVzKSwKKwkJICAgICAgc3RhdHVzLAorCQkgICAgICBzeW5kcm9tZSk7CisKKwlyZXR1cm4gY21kX3N0YXR1c190b19lcnIoc3RhdHVzKTsKK30KKwogc3RhdGljIHZvaWQgZHVtcF9jb21tYW5kKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCiAJCQkgc3RydWN0IG1seDVfY21kX3dvcmtfZW50ICplbnQsIGludCBpbnB1dCkKIHsKLQl1MTYgb3AgPSBiZTE2X3RvX2NwdSgoKHN0cnVjdCBtbHg1X2luYm94X2hkciAqKShlbnQtPmxheS0+aW4pKS0+b3Bjb2RlKTsKIAlzdHJ1Y3QgbWx4NV9jbWRfbXNnICptc2cgPSBpbnB1dCA/IGVudC0+aW4gOiBlbnQtPm91dDsKKwl1MTYgb3AgPSBNTFg1X0dFVChtYm94X2luLCBlbnQtPmxheS0+aW4sIG9wY29kZSk7CiAJc3RydWN0IG1seDVfY21kX21haWxib3ggKm5leHQgPSBtc2ctPm5leHQ7CiAJaW50IGRhdGFfb25seTsKIAl1MzIgb2Zmc2V0ID0gMDsKQEAgLTYwOCw5ICs3NTEsNyBAQAogCiBzdGF0aWMgdTE2IG1zZ190b19vcGNvZGUoc3RydWN0IG1seDVfY21kX21zZyAqaW4pCiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyICpoZHIgPSAoc3RydWN0IG1seDVfaW5ib3hfaGRyICopKGluLT5maXJzdC5kYXRhKTsKLQotCXJldHVybiBiZTE2X3RvX2NwdShoZHItPm9wY29kZSk7CisJcmV0dXJuIE1MWDVfR0VUKG1ib3hfaW4sIGluLT5maXJzdC5kYXRhLCBvcGNvZGUpOwogfQogCiBzdGF0aWMgdm9pZCBjYl90aW1lb3V0X2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtNjU2LDcgKzc5Nyw2IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNtZC0+YWxsb2NfbG9jaywgZmxhZ3MpOwogCX0KIAotCWVudC0+dG9rZW4gPSBhbGxvY190b2tlbihjbWQpOwogCWNtZC0+ZW50X2FycltlbnQtPmlkeF0gPSBlbnQ7CiAJbGF5ID0gZ2V0X2luc3QoY21kLCBlbnQtPmlkeCk7CiAJZW50LT5sYXkgPSBsYXk7CkBAIC03NDksMTYgKzg4OSw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIF9fYmUzMiAqZ2V0X3N5bmRfcHRyKHN0cnVjdCBtbHg1X291dGJveF9oZHIgKm91dCkKLXsKLQlyZXR1cm4gJm91dC0+c3luZHJvbWU7Ci19Ci0KLXN0YXRpYyB1OCAqZ2V0X3N0YXR1c19wdHIoc3RydWN0IG1seDVfb3V0Ym94X2hkciAqb3V0KQotewotCXJldHVybiAmb3V0LT5zdGF0dXM7Ci19Ci0KIC8qICBOb3RlczoKICAqICAgIDEuIENhbGxiYWNrIGZ1bmN0aW9ucyBtYXkgbm90IHNsZWVwCiAgKiAgICAyLiBwYWdlIHF1ZXVlIGNvbW1hbmRzIGRvIG5vdCBzdXBwb3J0IGFzeW5jaHJvdXMgY29tcGxldGlvbgpAQCAtNzY2LDcgKzg5Niw4IEBACiBzdGF0aWMgaW50IG1seDVfY21kX2ludm9rZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9jbWRfbXNnICppbiwKIAkJCSAgIHN0cnVjdCBtbHg1X2NtZF9tc2cgKm91dCwgdm9pZCAqdW91dCwgaW50IHVvdXRfc2l6ZSwKIAkJCSAgIG1seDVfY21kX2Nia190IGNhbGxiYWNrLAotCQkJICAgdm9pZCAqY29udGV4dCwgaW50IHBhZ2VfcXVldWUsIHU4ICpzdGF0dXMpCisJCQkgICB2b2lkICpjb250ZXh0LCBpbnQgcGFnZV9xdWV1ZSwgdTggKnN0YXR1cywKKwkJCSAgIHU4IHRva2VuKQogewogCXN0cnVjdCBtbHg1X2NtZCAqY21kID0gJmRldi0+Y21kOwogCXN0cnVjdCBtbHg1X2NtZF93b3JrX2VudCAqZW50OwpAQCAtNzgzLDYgKzkxNCw4IEBACiAJaWYgKElTX0VSUihlbnQpKQogCQlyZXR1cm4gUFRSX0VSUihlbnQpOwogCisJZW50LT50b2tlbiA9IHRva2VuOworCiAJaWYgKCFjYWxsYmFjaykKIAkJaW5pdF9jb21wbGV0aW9uKCZlbnQtPmRvbmUpOwogCkBAIC04MDQsNyArOTM3LDcgQEAKIAkJZ290byBvdXRfZnJlZTsKIAogCWRzID0gZW50LT50czIgLSBlbnQtPnRzMTsKLQlvcCA9IGJlMTZfdG9fY3B1KCgoc3RydWN0IG1seDVfaW5ib3hfaGRyICopaW4tPmZpcnN0LmRhdGEpLT5vcGNvZGUpOworCW9wID0gTUxYNV9HRVQobWJveF9pbiwgaW4tPmZpcnN0LmRhdGEsIG9wY29kZSk7CiAJaWYgKG9wIDwgQVJSQVlfU0laRShjbWQtPnN0YXRzKSkgewogCQlzdGF0cyA9ICZjbWQtPnN0YXRzW29wXTsKIAkJc3Bpbl9sb2NrX2lycSgmc3RhdHMtPmxvY2spOwpAQCAtODU0LDcgKzk4Nyw4IEBACiAJLndyaXRlCT0gZGJnX3dyaXRlLAogfTsKIAotc3RhdGljIGludCBtbHg1X2NvcHlfdG9fbXNnKHN0cnVjdCBtbHg1X2NtZF9tc2cgKnRvLCB2b2lkICpmcm9tLCBpbnQgc2l6ZSkKK3N0YXRpYyBpbnQgbWx4NV9jb3B5X3RvX21zZyhzdHJ1Y3QgbWx4NV9jbWRfbXNnICp0bywgdm9pZCAqZnJvbSwgaW50IHNpemUsCisJCQkgICAgdTggdG9rZW4pCiB7CiAJc3RydWN0IG1seDVfY21kX3Byb3RfYmxvY2sgKmJsb2NrOwogCXN0cnVjdCBtbHg1X2NtZF9tYWlsYm94ICpuZXh0OwpAQCAtODgwLDYgKzEwMTQsNyBAQAogCQltZW1jcHkoYmxvY2stPmRhdGEsIGZyb20sIGNvcHkpOwogCQlmcm9tICs9IGNvcHk7CiAJCXNpemUgLT0gY29weTsKKwkJYmxvY2stPnRva2VuID0gdG9rZW47CiAJCW5leHQgPSBuZXh0LT5uZXh0OwogCX0KIApAQCAtOTQ5LDcgKzEwODQsOCBAQAogfQogCiBzdGF0aWMgc3RydWN0IG1seDVfY21kX21zZyAqbWx4NV9hbGxvY19jbWRfbXNnKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCi0JCQkJCSAgICAgICBnZnBfdCBmbGFncywgaW50IHNpemUpCisJCQkJCSAgICAgICBnZnBfdCBmbGFncywgaW50IHNpemUsCisJCQkJCSAgICAgICB1OCB0b2tlbikKIHsKIAlzdHJ1Y3QgbWx4NV9jbWRfbWFpbGJveCAqdG1wLCAqaGVhZCA9IE5VTEw7CiAJc3RydWN0IG1seDVfY21kX3Byb3RfYmxvY2sgKmJsb2NrOwpAQCAtOTc4LDYgKzExMTQsNyBAQAogCQl0bXAtPm5leHQgPSBoZWFkOwogCQlibG9jay0+bmV4dCA9IGNwdV90b19iZTY0KHRtcC0+bmV4dCA/IHRtcC0+bmV4dC0+ZG1hIDogMCk7CiAJCWJsb2NrLT5ibG9ja19udW0gPSBjcHVfdG9fYmUzMihuIC0gaSAtIDEpOworCQlibG9jay0+dG9rZW4gPSB0b2tlbjsKIAkJaGVhZCA9IHRtcDsKIAl9CiAJbXNnLT5uZXh0ID0gaGVhZDsKQEAgLTEwMTUsNyArMTE1Miw2IEBACiAJc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgbWx4NV9jbWRfZGVidWcgKmRiZyA9ICZkZXYtPmNtZC5kYmc7CiAJdm9pZCAqcHRyOwotCWludCBlcnI7CiAKIAlpZiAoKnBvcyAhPSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEwMjMsMjUgKzExNTksMTUgQEAKIAlrZnJlZShkYmctPmluX21zZyk7CiAJZGJnLT5pbl9tc2cgPSBOVUxMOwogCWRiZy0+aW5sZW4gPSAwOwotCi0JcHRyID0ga3phbGxvYyhjb3VudCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwdHIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKHB0ciwgYnVmLCBjb3VudCkpIHsKLQkJZXJyID0gLUVGQVVMVDsKLQkJZ290byBvdXQ7Ci0JfQorCXB0ciA9IG1lbWR1cF91c2VyKGJ1ZiwgY291bnQpOworCWlmIChJU19FUlIocHRyKSkKKwkJcmV0dXJuIFBUUl9FUlIocHRyKTsKIAlkYmctPmluX21zZyA9IHB0cjsKIAlkYmctPmlubGVuID0gY291bnQ7CiAKIAkqcG9zID0gY291bnQ7CiAKIAlyZXR1cm4gY291bnQ7Ci0KLW91dDoKLQlrZnJlZShwdHIpOwotCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGRhdGFfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LApAQCAtMTMwMSwxMSArMTQyNywxNiBAQAogCQkJCWNhbGxiYWNrID0gZW50LT5jYWxsYmFjazsKIAkJCQljb250ZXh0ID0gZW50LT5jb250ZXh0OwogCQkJCWVyciA9IGVudC0+cmV0OwotCQkJCWlmICghZXJyKQorCQkJCWlmICghZXJyKSB7CiAJCQkJCWVyciA9IG1seDVfY29weV9mcm9tX21zZyhlbnQtPnVvdXQsCiAJCQkJCQkJCSBlbnQtPm91dCwKIAkJCQkJCQkJIGVudC0+dW91dF9zaXplKTsKIAorCQkJCQllcnIgPSBlcnIgPyBlcnIgOiBtbHg1X2NtZF9jaGVjayhkZXYsCisJCQkJCQkJCQllbnQtPmluLT5maXJzdC5kYXRhLAorCQkJCQkJCQkJZW50LT51b3V0KTsKKwkJCQl9CisKIAkJCQltbHg1X2ZyZWVfY21kX21zZyhkZXYsIGVudC0+b3V0KTsKIAkJCQlmcmVlX21zZyhkZXYsIGVudC0+aW4pOwogCkBAIC0xMzUyLDE5ICsxNDgzLDE0IEBACiAJfQogCiAJaWYgKElTX0VSUihtc2cpKQotCQltc2cgPSBtbHg1X2FsbG9jX2NtZF9tc2coZGV2LCBnZnAsIGluX3NpemUpOworCQltc2cgPSBtbHg1X2FsbG9jX2NtZF9tc2coZGV2LCBnZnAsIGluX3NpemUsIDApOwogCiAJcmV0dXJuIG1zZzsKIH0KIAotc3RhdGljIHUxNiBvcGNvZGVfZnJvbV9pbihzdHJ1Y3QgbWx4NV9pbmJveF9oZHIgKmluKQorc3RhdGljIGludCBpc19tYW5hZ2VfcGFnZXModm9pZCAqaW4pCiB7Ci0JcmV0dXJuIGJlMTZfdG9fY3B1KGluLT5vcGNvZGUpOwotfQotCi1zdGF0aWMgaW50IGlzX21hbmFnZV9wYWdlcyhzdHJ1Y3QgbWx4NV9pbmJveF9oZHIgKmluKQotewotCXJldHVybiBiZTE2X3RvX2NwdShpbi0+b3Bjb2RlKSA9PSBNTFg1X0NNRF9PUF9NQU5BR0VfUEFHRVM7CisJcmV0dXJuIE1MWDVfR0VUKG1ib3hfaW4sIGluLCBvcGNvZGUpID09IE1MWDVfQ01EX09QX01BTkFHRV9QQUdFUzsKIH0KIAogc3RhdGljIGludCBjbWRfZXhlYyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB2b2lkICppbiwgaW50IGluX3NpemUsIHZvaWQgKm91dCwKQEAgLTEzNzcsMTIgKzE1MDMsMTUgQEAKIAlpbnQgZXJyOwogCXU4IHN0YXR1cyA9IDA7CiAJdTMyIGRydl9zeW5kOworCXU4IHRva2VuOwogCiAJaWYgKHBjaV9jaGFubmVsX29mZmxpbmUoZGV2LT5wZGV2KSB8fAogCSAgICBkZXYtPnN0YXRlID09IE1MWDVfREVWSUNFX1NUQVRFX0lOVEVSTkFMX0VSUk9SKSB7Ci0JCWVyciA9IG1seDVfaW50ZXJuYWxfZXJyX3JldF92YWx1ZShkZXYsIG9wY29kZV9mcm9tX2luKGluKSwgJmRydl9zeW5kLCAmc3RhdHVzKTsKLQkJKmdldF9zeW5kX3B0cihvdXQpID0gY3B1X3RvX2JlMzIoZHJ2X3N5bmQpOwotCQkqZ2V0X3N0YXR1c19wdHIob3V0KSA9IHN0YXR1czsKKwkJdTE2IG9wY29kZSA9IE1MWDVfR0VUKG1ib3hfaW4sIGluLCBvcGNvZGUpOworCisJCWVyciA9IG1seDVfaW50ZXJuYWxfZXJyX3JldF92YWx1ZShkZXYsIG9wY29kZSwgJmRydl9zeW5kLCAmc3RhdHVzKTsKKwkJTUxYNV9TRVQobWJveF9vdXQsIG91dCwgc3RhdHVzLCBzdGF0dXMpOworCQlNTFg1X1NFVChtYm94X291dCwgb3V0LCBzeW5kcm9tZSwgZHJ2X3N5bmQpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtMTM5NSwyMCArMTUyNCwyMiBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCWVyciA9IG1seDVfY29weV90b19tc2coaW5iLCBpbiwgaW5fc2l6ZSk7CisJdG9rZW4gPSBhbGxvY190b2tlbigmZGV2LT5jbWQpOworCisJZXJyID0gbWx4NV9jb3B5X3RvX21zZyhpbmIsIGluLCBpbl9zaXplLCB0b2tlbik7CiAJaWYgKGVycikgewogCQltbHg1X2NvcmVfd2FybihkZXYsICJlcnIgJWRcbiIsIGVycik7CiAJCWdvdG8gb3V0X2luOwogCX0KIAotCW91dGIgPSBtbHg1X2FsbG9jX2NtZF9tc2coZGV2LCBnZnAsIG91dF9zaXplKTsKKwlvdXRiID0gbWx4NV9hbGxvY19jbWRfbXNnKGRldiwgZ2ZwLCBvdXRfc2l6ZSwgdG9rZW4pOwogCWlmIChJU19FUlIob3V0YikpIHsKIAkJZXJyID0gUFRSX0VSUihvdXRiKTsKIAkJZ290byBvdXRfaW47CiAJfQogCiAJZXJyID0gbWx4NV9jbWRfaW52b2tlKGRldiwgaW5iLCBvdXRiLCBvdXQsIG91dF9zaXplLCBjYWxsYmFjaywgY29udGV4dCwKLQkJCSAgICAgIHBhZ2VzX3F1ZXVlLCAmc3RhdHVzKTsKKwkJCSAgICAgIHBhZ2VzX3F1ZXVlLCAmc3RhdHVzLCB0b2tlbik7CiAJaWYgKGVycikKIAkJZ290byBvdXRfb3V0OwogCkBAIC0xNDM0LDcgKzE1NjUsMTAgQEAKIGludCBtbHg1X2NtZF9leGVjKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHZvaWQgKmluLCBpbnQgaW5fc2l6ZSwgdm9pZCAqb3V0LAogCQkgIGludCBvdXRfc2l6ZSkKIHsKLQlyZXR1cm4gY21kX2V4ZWMoZGV2LCBpbiwgaW5fc2l6ZSwgb3V0LCBvdXRfc2l6ZSwgTlVMTCwgTlVMTCk7CisJaW50IGVycjsKKworCWVyciA9IGNtZF9leGVjKGRldiwgaW4sIGluX3NpemUsIG91dCwgb3V0X3NpemUsIE5VTEwsIE5VTEwpOworCXJldHVybiBlcnIgPyA6IG1seDVfY21kX2NoZWNrKGRldiwgaW4sIG91dCk7CiB9CiBFWFBPUlRfU1lNQk9MKG1seDVfY21kX2V4ZWMpOwogCkBAIC0xNDc2LDcgKzE2MTAsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZjbWQtPmNhY2hlLm1lZC5oZWFkKTsKIAogCWZvciAoaSA9IDA7IGkgPCBOVU1fTE9OR19MSVNUUzsgaSsrKSB7Ci0JCW1zZyA9IG1seDVfYWxsb2NfY21kX21zZyhkZXYsIEdGUF9LRVJORUwsIExPTkdfTElTVF9TSVpFKTsKKwkJbXNnID0gbWx4NV9hbGxvY19jbWRfbXNnKGRldiwgR0ZQX0tFUk5FTCwgTE9OR19MSVNUX1NJWkUsIDApOwogCQlpZiAoSVNfRVJSKG1zZykpIHsKIAkJCWVyciA9IFBUUl9FUlIobXNnKTsKIAkJCWdvdG8gZXhfZXJyOwpAQCAtMTQ4Niw3ICsxNjIwLDcgQEAKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgTlVNX01FRF9MSVNUUzsgaSsrKSB7Ci0JCW1zZyA9IG1seDVfYWxsb2NfY21kX21zZyhkZXYsIEdGUF9LRVJORUwsIE1FRF9MSVNUX1NJWkUpOworCQltc2cgPSBtbHg1X2FsbG9jX2NtZF9tc2coZGV2LCBHRlBfS0VSTkVMLCBNRURfTElTVF9TSVpFLCAwKTsKIAkJaWYgKElTX0VSUihtc2cpKSB7CiAJCQllcnIgPSBQVFJfRVJSKG1zZyk7CiAJCQlnb3RvIGV4X2VycjsKQEAgLTE2NzEsOTYgKzE4MDUsMyBAQAogCXBjaV9wb29sX2Rlc3Ryb3koY21kLT5wb29sKTsKIH0KIEVYUE9SVF9TWU1CT0wobWx4NV9jbWRfY2xlYW51cCk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjbWRfc3RhdHVzX3N0cih1OCBzdGF0dXMpCi17Ci0Jc3dpdGNoIChzdGF0dXMpIHsKLQljYXNlIE1MWDVfQ01EX1NUQVRfT0s6Ci0JCXJldHVybiAiT0siOwotCWNhc2UgTUxYNV9DTURfU1RBVF9JTlRfRVJSOgotCQlyZXR1cm4gImludGVybmFsIGVycm9yIjsKLQljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX09QX0VSUjoKLQkJcmV0dXJuICJiYWQgb3BlcmF0aW9uIjsKLQljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX1BBUkFNX0VSUjoKLQkJcmV0dXJuICJiYWQgcGFyYW1ldGVyIjsKLQljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX1NZU19TVEFURV9FUlI6Ci0JCXJldHVybiAiYmFkIHN5c3RlbSBzdGF0ZSI7Ci0JY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9SRVNfRVJSOgotCQlyZXR1cm4gImJhZCByZXNvdXJjZSI7Ci0JY2FzZSBNTFg1X0NNRF9TVEFUX1JFU19CVVNZOgotCQlyZXR1cm4gInJlc291cmNlIGJ1c3kiOwotCWNhc2UgTUxYNV9DTURfU1RBVF9MSU1fRVJSOgotCQlyZXR1cm4gImxpbWl0cyBleGNlZWRlZCI7Ci0JY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9SRVNfU1RBVEVfRVJSOgotCQlyZXR1cm4gImJhZCByZXNvdXJjZSBzdGF0ZSI7Ci0JY2FzZSBNTFg1X0NNRF9TVEFUX0lYX0VSUjoKLQkJcmV0dXJuICJiYWQgaW5kZXgiOwotCWNhc2UgTUxYNV9DTURfU1RBVF9OT19SRVNfRVJSOgotCQlyZXR1cm4gIm5vIHJlc291cmNlcyI7Ci0JY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9JTlBfTEVOX0VSUjoKLQkJcmV0dXJuICJiYWQgaW5wdXQgbGVuZ3RoIjsKLQljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX09VVFBfTEVOX0VSUjoKLQkJcmV0dXJuICJiYWQgb3V0cHV0IGxlbmd0aCI7Ci0JY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9RUF9TVEFURV9FUlI6Ci0JCXJldHVybiAiYmFkIFFQIHN0YXRlIjsKLQljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX1BLVF9FUlI6Ci0JCXJldHVybiAiYmFkIHBhY2tldCAoZGlzY2FyZGVkKSI7Ci0JY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9TSVpFX09VVFNfQ1FFU19FUlI6Ci0JCXJldHVybiAiYmFkIHNpemUgdG9vIG1hbnkgb3V0c3RhbmRpbmcgQ1FFcyI7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuICJ1bmtub3duIHN0YXR1cyI7Ci0JfQotfQotCi1zdGF0aWMgaW50IGNtZF9zdGF0dXNfdG9fZXJyKHU4IHN0YXR1cykKLXsKLQlzd2l0Y2ggKHN0YXR1cykgewotCWNhc2UgTUxYNV9DTURfU1RBVF9PSzoJCQkJcmV0dXJuIDA7Ci0JY2FzZSBNTFg1X0NNRF9TVEFUX0lOVF9FUlI6CQkJcmV0dXJuIC1FSU87Ci0JY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9PUF9FUlI6CQkJcmV0dXJuIC1FSU5WQUw7Ci0JY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9QQVJBTV9FUlI6CQlyZXR1cm4gLUVJTlZBTDsKLQljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX1NZU19TVEFURV9FUlI6CQlyZXR1cm4gLUVJTzsKLQljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX1JFU19FUlI6CQkJcmV0dXJuIC1FSU5WQUw7Ci0JY2FzZSBNTFg1X0NNRF9TVEFUX1JFU19CVVNZOgkJCXJldHVybiAtRUJVU1k7Ci0JY2FzZSBNTFg1X0NNRF9TVEFUX0xJTV9FUlI6CQkJcmV0dXJuIC1FTk9NRU07Ci0JY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9SRVNfU1RBVEVfRVJSOgkJcmV0dXJuIC1FSU5WQUw7Ci0JY2FzZSBNTFg1X0NNRF9TVEFUX0lYX0VSUjoJCQlyZXR1cm4gLUVJTlZBTDsKLQljYXNlIE1MWDVfQ01EX1NUQVRfTk9fUkVTX0VSUjoJCQlyZXR1cm4gLUVBR0FJTjsKLQljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX0lOUF9MRU5fRVJSOgkJcmV0dXJuIC1FSU87Ci0JY2FzZSBNTFg1X0NNRF9TVEFUX0JBRF9PVVRQX0xFTl9FUlI6CQlyZXR1cm4gLUVJTzsKLQljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX1FQX1NUQVRFX0VSUjoJCXJldHVybiAtRUlOVkFMOwotCWNhc2UgTUxYNV9DTURfU1RBVF9CQURfUEtUX0VSUjoJCQlyZXR1cm4gLUVJTlZBTDsKLQljYXNlIE1MWDVfQ01EX1NUQVRfQkFEX1NJWkVfT1VUU19DUUVTX0VSUjoJcmV0dXJuIC1FSU5WQUw7Ci0JZGVmYXVsdDoJCQkJCXJldHVybiAtRUlPOwotCX0KLX0KLQotLyogdGhpcyB3aWxsIGJlIGF2YWlsYWJsZSB0aWxsIGFsbCB0aGUgY29tbWFuZHMgdXNlIHNldC9nZXQgbWFjcm9zICovCi1pbnQgbWx4NV9jbWRfc3RhdHVzX3RvX2VycihzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyICpoZHIpCi17Ci0JaWYgKCFoZHItPnN0YXR1cykKLQkJcmV0dXJuIDA7Ci0KLQlwcl93YXJuKCJjb21tYW5kIGZhaWxlZCwgc3RhdHVzICVzKDB4JXgpLCBzeW5kcm9tZSAweCV4XG4iLAotCQljbWRfc3RhdHVzX3N0cihoZHItPnN0YXR1cyksIGhkci0+c3RhdHVzLAotCQliZTMyX3RvX2NwdShoZHItPnN5bmRyb21lKSk7Ci0KLQlyZXR1cm4gY21kX3N0YXR1c190b19lcnIoaGRyLT5zdGF0dXMpOwotfQotCi1pbnQgbWx4NV9jbWRfc3RhdHVzX3RvX2Vycl92Mih2b2lkICpwdHIpCi17Ci0JdTMyCXN5bmRyb21lOwotCXU4CXN0YXR1czsKLQotCXN0YXR1cyA9IGJlMzJfdG9fY3B1KCooX19iZTMyICopcHRyKSA+PiAyNDsKLQlpZiAoIXN0YXR1cykKLQkJcmV0dXJuIDA7Ci0KLQlzeW5kcm9tZSA9IGJlMzJfdG9fY3B1KCooX19iZTMyICopKHB0ciArIDQpKTsKLQotCXByX3dhcm4oImNvbW1hbmQgZmFpbGVkLCBzdGF0dXMgJXMoMHgleCksIHN5bmRyb21lIDB4JXhcbiIsCi0JCWNtZF9zdGF0dXNfc3RyKHN0YXR1cyksIHN0YXR1cywgc3luZHJvbWUpOwotCi0JcmV0dXJuIGNtZF9zdGF0dXNfdG9fZXJyKHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvY3EuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9jcS5jCmluZGV4IDg3M2E2MzEuLjMyZDRhZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9jcS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9jcS5jCkBAIC0xMzQsMzMgKzEzNCwyOSBAQAogCQljb21wbGV0ZSgmY3EtPmZyZWUpOwogfQogCi0KIGludCBtbHg1X2NvcmVfY3JlYXRlX2NxKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X2NvcmVfY3EgKmNxLAotCQkJc3RydWN0IG1seDVfY3JlYXRlX2NxX21ib3hfaW4gKmluLCBpbnQgaW5sZW4pCisJCQl1MzIgKmluLCBpbnQgaW5sZW4pCiB7Ci0JaW50IGVycjsKIAlzdHJ1Y3QgbWx4NV9jcV90YWJsZSAqdGFibGUgPSAmZGV2LT5wcml2LmNxX3RhYmxlOwotCXN0cnVjdCBtbHg1X2NyZWF0ZV9jcV9tYm94X291dCBvdXQ7Ci0Jc3RydWN0IG1seDVfZGVzdHJveV9jcV9tYm94X2luIGRpbjsKLQlzdHJ1Y3QgbWx4NV9kZXN0cm95X2NxX21ib3hfb3V0IGRvdXQ7CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGNyZWF0ZV9jcV9vdXQpXTsKKwl1MzIgZGluW01MWDVfU1RfU1pfRFcoZGVzdHJveV9jcV9pbildOworCXUzMiBkb3V0W01MWDVfU1RfU1pfRFcoZGVzdHJveV9jcV9vdXQpXTsKIAlpbnQgZXFuID0gTUxYNV9HRVQoY3FjLCBNTFg1X0FERFJfT0YoY3JlYXRlX2NxX2luLCBpbiwgY3FfY29udGV4dCksCiAJCQkgICBjX2Vxbik7CiAJc3RydWN0IG1seDVfZXEgKmVxOworCWludCBlcnI7CiAKIAllcSA9IG1seDVfZXFuMmVxKGRldiwgZXFuKTsKIAlpZiAoSVNfRVJSKGVxKSkKIAkJcmV0dXJuIFBUUl9FUlIoZXEpOwogCi0JaW4tPmhkci5vcGNvZGUgPSBjcHVfdG9fYmUxNihNTFg1X0NNRF9PUF9DUkVBVEVfQ1EpOwotCW1lbXNldCgmb3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0JZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbmxlbiwgJm91dCwgc2l6ZW9mKG91dCkpOworCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKKwlNTFg1X1NFVChjcmVhdGVfY3FfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX0NSRUFURV9DUSk7CisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWlmIChvdXQuaGRyLnN0YXR1cykKLQkJcmV0dXJuIG1seDVfY21kX3N0YXR1c190b19lcnIoJm91dC5oZHIpOwotCi0JY3EtPmNxbiA9IGJlMzJfdG9fY3B1KG91dC5jcW4pICYgMHhmZmZmZmY7CisJY3EtPmNxbiA9IE1MWDVfR0VUKGNyZWF0ZV9jcV9vdXQsIG91dCwgY3FuKTsKIAljcS0+Y29uc19pbmRleCA9IDA7CiAJY3EtPmFybV9zbiAgICAgPSAwOwogCWF0b21pY19zZXQoJmNxLT5yZWZjb3VudCwgMSk7CkBAIC0xODYsMTAgKzE4MiwxMSBAQAogCXJldHVybiAwOwogCiBlcnJfY21kOgotCW1lbXNldCgmZGluLCAwLCBzaXplb2YoZGluKSk7Ci0JbWVtc2V0KCZkb3V0LCAwLCBzaXplb2YoZG91dCkpOwotCWRpbi5oZHIub3Bjb2RlID0gY3B1X3RvX2JlMTYoTUxYNV9DTURfT1BfREVTVFJPWV9DUSk7Ci0JbWx4NV9jbWRfZXhlYyhkZXYsICZkaW4sIHNpemVvZihkaW4pLCAmZG91dCwgc2l6ZW9mKGRvdXQpKTsKKwltZW1zZXQoZGluLCAwLCBzaXplb2YoZGluKSk7CisJbWVtc2V0KGRvdXQsIDAsIHNpemVvZihkb3V0KSk7CisJTUxYNV9TRVQoZGVzdHJveV9jcV9pbiwgZGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX0RFU1RST1lfQ1EpOworCU1MWDVfU0VUKGRlc3Ryb3lfY3FfaW4sIGRpbiwgY3FuLCBjcS0+Y3FuKTsKKwltbHg1X2NtZF9leGVjKGRldiwgZGluLCBzaXplb2YoZGluKSwgZG91dCwgc2l6ZW9mKGRvdXQpKTsKIAlyZXR1cm4gZXJyOwogfQogRVhQT1JUX1NZTUJPTChtbHg1X2NvcmVfY3JlYXRlX2NxKTsKQEAgLTE5Nyw4ICsxOTQsOCBAQAogaW50IG1seDVfY29yZV9kZXN0cm95X2NxKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X2NvcmVfY3EgKmNxKQogewogCXN0cnVjdCBtbHg1X2NxX3RhYmxlICp0YWJsZSA9ICZkZXYtPnByaXYuY3FfdGFibGU7Ci0Jc3RydWN0IG1seDVfZGVzdHJveV9jcV9tYm94X2luIGluOwotCXN0cnVjdCBtbHg1X2Rlc3Ryb3lfY3FfbWJveF9vdXQgb3V0OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZXN0cm95X2NxX291dCldID0gezB9OworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfY3FfaW4pXSA9IHswfTsKIAlzdHJ1Y3QgbWx4NV9jb3JlX2NxICp0bXA7CiAJaW50IGVycjsKIApAQCAtMjE0LDE3ICsyMTEsMTIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbWVtc2V0KCZpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KCZvdXQsIDAsIHNpemVvZihvdXQpKTsKLQlpbi5oZHIub3Bjb2RlID0gY3B1X3RvX2JlMTYoTUxYNV9DTURfT1BfREVTVFJPWV9DUSk7Ci0JaW4uY3FuID0gY3B1X3RvX2JlMzIoY3EtPmNxbik7Ci0JZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsICZpbiwgc2l6ZW9mKGluKSwgJm91dCwgc2l6ZW9mKG91dCkpOworCU1MWDVfU0VUKGRlc3Ryb3lfY3FfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX0RFU1RST1lfQ1EpOworCU1MWDVfU0VUKGRlc3Ryb3lfY3FfaW4sIGluLCBjcW4sIGNxLT5jcW4pOworCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWlmIChvdXQuaGRyLnN0YXR1cykKLQkJcmV0dXJuIG1seDVfY21kX3N0YXR1c190b19lcnIoJm91dC5oZHIpOwotCiAJc3luY2hyb25pemVfaXJxKGNxLT5pcnFuKTsKIAogCW1seDVfZGVidWdfY3FfcmVtb3ZlKGRldiwgY3EpOwpAQCAtMjM3LDQ0ICsyMjksMjMgQEAKIEVYUE9SVF9TWU1CT0wobWx4NV9jb3JlX2Rlc3Ryb3lfY3EpOwogCiBpbnQgbWx4NV9jb3JlX3F1ZXJ5X2NxKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X2NvcmVfY3EgKmNxLAotCQkgICAgICAgc3RydWN0IG1seDVfcXVlcnlfY3FfbWJveF9vdXQgKm91dCkKKwkJICAgICAgIHUzMiAqb3V0LCBpbnQgb3V0bGVuKQogewotCXN0cnVjdCBtbHg1X3F1ZXJ5X2NxX21ib3hfaW4gaW47Ci0JaW50IGVycjsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhxdWVyeV9jcV9pbildID0gezB9OwogCi0JbWVtc2V0KCZpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKCpvdXQpKTsKLQotCWluLmhkci5vcGNvZGUgPSBjcHVfdG9fYmUxNihNTFg1X0NNRF9PUF9RVUVSWV9DUSk7Ci0JaW4uY3FuID0gY3B1X3RvX2JlMzIoY3EtPmNxbik7Ci0JZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsICZpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2YoKm91dCkpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlpZiAob3V0LT5oZHIuc3RhdHVzKQotCQlyZXR1cm4gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycigmb3V0LT5oZHIpOwotCi0JcmV0dXJuIGVycjsKKwlNTFg1X1NFVChxdWVyeV9jcV9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfUVVFUllfQ1EpOworCU1MWDVfU0VUKHF1ZXJ5X2NxX2luLCBpbiwgY3FuLCBjcS0+Y3FuKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIG91dGxlbik7CiB9CiBFWFBPUlRfU1lNQk9MKG1seDVfY29yZV9xdWVyeV9jcSk7CiAKLQogaW50IG1seDVfY29yZV9tb2RpZnlfY3Eoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG1seDVfY29yZV9jcSAqY3EsCi0JCQlzdHJ1Y3QgbWx4NV9tb2RpZnlfY3FfbWJveF9pbiAqaW4sIGludCBpbl9zeikKKwkJCXUzMiAqaW4sIGludCBpbmxlbikKIHsKLQlzdHJ1Y3QgbWx4NV9tb2RpZnlfY3FfbWJveF9vdXQgb3V0OwotCWludCBlcnI7CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKG1vZGlmeV9jcV9vdXQpXSA9IHswfTsKIAotCW1lbXNldCgmb3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0JaW4tPmhkci5vcGNvZGUgPSBjcHVfdG9fYmUxNihNTFg1X0NNRF9PUF9NT0RJRllfQ1EpOwotCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgaW5fc3osICZvdXQsIHNpemVvZihvdXQpKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKG91dC5oZHIuc3RhdHVzKQotCQlyZXR1cm4gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycigmb3V0Lmhkcik7Ci0KLQlyZXR1cm4gMDsKKwlNTFg1X1NFVChtb2RpZnlfY3FfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX01PRElGWV9DUSk7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgaW5sZW4sIG91dCwgc2l6ZW9mKG91dCkpOwogfQogRVhQT1JUX1NZTUJPTChtbHg1X2NvcmVfbW9kaWZ5X2NxKTsKIApAQCAtMjgzLDE4ICsyNTQsMjAgQEAKIAkJCQkgICB1MTYgY3FfcGVyaW9kLAogCQkJCSAgIHUxNiBjcV9tYXhfY291bnQpCiB7Ci0Jc3RydWN0IG1seDVfbW9kaWZ5X2NxX21ib3hfaW4gaW47CisJdTMyIGluW01MWDVfU1RfU1pfRFcobW9kaWZ5X2NxX2luKV0gPSB7MH07CisJdm9pZCAqY3FjOwogCi0JbWVtc2V0KCZpbiwgMCwgc2l6ZW9mKGluKSk7CisJTUxYNV9TRVQobW9kaWZ5X2NxX2luLCBpbiwgY3FuLCBjcS0+Y3FuKTsKKwljcWMgPSBNTFg1X0FERFJfT0YobW9kaWZ5X2NxX2luLCBpbiwgY3FfY29udGV4dCk7CisJTUxYNV9TRVQoY3FjLCBjcWMsIGNxX3BlcmlvZCwgY3FfcGVyaW9kKTsKKwlNTFg1X1NFVChjcWMsIGNxYywgY3FfbWF4X2NvdW50LCBjcV9tYXhfY291bnQpOworCU1MWDVfU0VUKG1vZGlmeV9jcV9pbiwgaW4sCisJCSBtb2RpZnlfZmllbGRfc2VsZWN0X3Jlc2l6ZV9maWVsZF9zZWxlY3QubW9kaWZ5X2ZpZWxkX3NlbGVjdC5tb2RpZnlfZmllbGRfc2VsZWN0LAorCQkgTUxYNV9DUV9NT0RJRllfUEVSSU9EIHwgTUxYNV9DUV9NT0RJRllfQ09VTlQpOwogCi0JaW4uY3FuICAgICAgICAgICAgICA9IGNwdV90b19iZTMyKGNxLT5jcW4pOwotCWluLmN0eC5jcV9wZXJpb2QgICAgPSBjcHVfdG9fYmUxNihjcV9wZXJpb2QpOwotCWluLmN0eC5jcV9tYXhfY291bnQgPSBjcHVfdG9fYmUxNihjcV9tYXhfY291bnQpOwotCWluLmZpZWxkX3NlbGVjdCAgICAgPSBjcHVfdG9fYmUzMihNTFg1X0NRX01PRElGWV9QRVJJT0QgfAotCQkJCQkgIE1MWDVfQ1FfTU9ESUZZX0NPVU5UKTsKLQotCXJldHVybiBtbHg1X2NvcmVfbW9kaWZ5X2NxKGRldiwgY3EsICZpbiwgc2l6ZW9mKGluKSk7CisJcmV0dXJuIG1seDVfY29yZV9tb2RpZnlfY3EoZGV2LCBjcSwgaW4sIHNpemVvZihpbikpOwogfQorRVhQT1JUX1NZTUJPTChtbHg1X2NvcmVfbW9kaWZ5X2NxX21vZGVyYXRpb24pOwogCiBpbnQgbWx4NV9pbml0X2NxX3RhYmxlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZGVidWdmcy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2RlYnVnZnMuYwppbmRleCA1MjEwZDkyLi5lOTRhOTUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9kZWJ1Z2ZzLmMKQEAgLTI3NywyNCArMjc3LDI4IEBACiBzdGF0aWMgdTY0IHFwX3JlYWRfZmllbGQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG1seDVfY29yZV9xcCAqcXAsCiAJCQkgaW50IGluZGV4LCBpbnQgKmlzX3N0cikKIHsKLQlzdHJ1Y3QgbWx4NV9xdWVyeV9xcF9tYm94X291dCAqb3V0OworCWludCBvdXRsZW4gPSBNTFg1X1NUX1NaX0JZVEVTKHF1ZXJ5X3FwX291dCk7CiAJc3RydWN0IG1seDVfcXBfY29udGV4dCAqY3R4OwogCXU2NCBwYXJhbSA9IDA7CisJdTMyICpvdXQ7CiAJaW50IGVycjsKIAlpbnQgbm9fc3E7CiAKLQlvdXQgPSBremFsbG9jKHNpemVvZigqb3V0KSwgR0ZQX0tFUk5FTCk7CisJb3V0ID0ga3phbGxvYyhvdXRsZW4sIEdGUF9LRVJORUwpOwogCWlmICghb3V0KQogCQlyZXR1cm4gcGFyYW07CiAKLQllcnIgPSBtbHg1X2NvcmVfcXBfcXVlcnkoZGV2LCBxcCwgb3V0LCBzaXplb2YoKm91dCkpOworCWVyciA9IG1seDVfY29yZV9xcF9xdWVyeShkZXYsIHFwLCBvdXQsIG91dGxlbik7CiAJaWYgKGVycikgewotCQltbHg1X2NvcmVfd2FybihkZXYsICJmYWlsZWQgdG8gcXVlcnkgcXBcbiIpOworCQltbHg1X2NvcmVfd2FybihkZXYsICJmYWlsZWQgdG8gcXVlcnkgcXAgZXJyPSVkXG4iLCBlcnIpOwogCQlnb3RvIG91dDsKIAl9CiAKIAkqaXNfc3RyID0gMDsKLQljdHggPSAmb3V0LT5jdHg7CisKKwkvKiBGSVhNRTogdXNlIE1MWDVfR0VUIHJhdGhlciB0aGFuIG1seDVfcXBfY29udGV4dCBtYW51YWwgc3RydWN0ICovCisJY3R4ID0gKHN0cnVjdCBtbHg1X3FwX2NvbnRleHQgKilNTFg1X0FERFJfT0YocXVlcnlfcXBfb3V0LCBvdXQsIHFwYyk7CisKIAlzd2l0Y2ggKGluZGV4KSB7CiAJY2FzZSBRUF9QSUQ6CiAJCXBhcmFtID0gcXAtPnBpZDsKQEAgLTM1OCwzMiArMzYyLDMyIEBACiBzdGF0aWMgdTY0IGVxX3JlYWRfZmllbGQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG1seDVfZXEgKmVxLAogCQkJIGludCBpbmRleCkKIHsKLQlzdHJ1Y3QgbWx4NV9xdWVyeV9lcV9tYm94X291dCAqb3V0OwotCXN0cnVjdCBtbHg1X2VxX2NvbnRleHQgKmN0eDsKKwlpbnQgb3V0bGVuID0gTUxYNV9TVF9TWl9CWVRFUyhxdWVyeV9lcV9vdXQpOwogCXU2NCBwYXJhbSA9IDA7CisJdm9pZCAqY3R4OworCXUzMiAqb3V0OwogCWludCBlcnI7CiAKLQlvdXQgPSBremFsbG9jKHNpemVvZigqb3V0KSwgR0ZQX0tFUk5FTCk7CisJb3V0ID0ga3phbGxvYyhvdXRsZW4sIEdGUF9LRVJORUwpOwogCWlmICghb3V0KQogCQlyZXR1cm4gcGFyYW07CiAKLQljdHggPSAmb3V0LT5jdHg7Ci0KLQllcnIgPSBtbHg1X2NvcmVfZXFfcXVlcnkoZGV2LCBlcSwgb3V0LCBzaXplb2YoKm91dCkpOworCWVyciA9IG1seDVfY29yZV9lcV9xdWVyeShkZXYsIGVxLCBvdXQsIG91dGxlbik7CiAJaWYgKGVycikgewogCQltbHg1X2NvcmVfd2FybihkZXYsICJmYWlsZWQgdG8gcXVlcnkgZXFcbiIpOwogCQlnb3RvIG91dDsKIAl9CisJY3R4ID0gTUxYNV9BRERSX09GKHF1ZXJ5X2VxX291dCwgb3V0LCBlcV9jb250ZXh0X2VudHJ5KTsKIAogCXN3aXRjaCAoaW5kZXgpIHsKIAljYXNlIEVRX05VTV9FUUVTOgotCQlwYXJhbSA9IDEgPDwgKChiZTMyX3RvX2NwdShjdHgtPmxvZ19zel91c3JfcGFnZSkgPj4gMjQpICYgMHgxZik7CisJCXBhcmFtID0gMSA8PCBNTFg1X0dFVChlcWMsIGN0eCwgbG9nX2VxX3NpemUpOwogCQlicmVhazsKIAljYXNlIEVRX0lOVFI6Ci0JCXBhcmFtID0gY3R4LT5pbnRyOworCQlwYXJhbSA9IE1MWDVfR0VUKGVxYywgY3R4LCBpbnRyKTsKIAkJYnJlYWs7CiAJY2FzZSBFUV9MT0dfUEdfU1o6Ci0JCXBhcmFtID0gKGN0eC0+bG9nX3BhZ2Vfc2l6ZSAmIDB4MWYpICsgMTI7CisJCXBhcmFtID0gTUxYNV9HRVQoZXFjLCBjdHgsIGxvZ19wYWdlX3NpemUpICsgMTI7CiAJCWJyZWFrOwogCX0KIApAQCAtMzk1LDM3ICszOTksMzcgQEAKIHN0YXRpYyB1NjQgY3FfcmVhZF9maWVsZChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9jb3JlX2NxICpjcSwKIAkJCSBpbnQgaW5kZXgpCiB7Ci0Jc3RydWN0IG1seDVfcXVlcnlfY3FfbWJveF9vdXQgKm91dDsKLQlzdHJ1Y3QgbWx4NV9jcV9jb250ZXh0ICpjdHg7CisJaW50IG91dGxlbiA9IE1MWDVfU1RfU1pfQllURVMocXVlcnlfY3Ffb3V0KTsKIAl1NjQgcGFyYW0gPSAwOworCXZvaWQgKmN0eDsKKwl1MzIgKm91dDsKIAlpbnQgZXJyOwogCi0Jb3V0ID0ga3phbGxvYyhzaXplb2YoKm91dCksIEdGUF9LRVJORUwpOworCW91dCA9IG1seDVfdnphbGxvYyhvdXRsZW4pOwogCWlmICghb3V0KQogCQlyZXR1cm4gcGFyYW07CiAKLQljdHggPSAmb3V0LT5jdHg7Ci0KLQllcnIgPSBtbHg1X2NvcmVfcXVlcnlfY3EoZGV2LCBjcSwgb3V0KTsKKwllcnIgPSBtbHg1X2NvcmVfcXVlcnlfY3EoZGV2LCBjcSwgb3V0LCBvdXRsZW4pOwogCWlmIChlcnIpIHsKIAkJbWx4NV9jb3JlX3dhcm4oZGV2LCAiZmFpbGVkIHRvIHF1ZXJ5IGNxXG4iKTsKIAkJZ290byBvdXQ7CiAJfQorCWN0eCA9IE1MWDVfQUREUl9PRihxdWVyeV9jcV9vdXQsIG91dCwgY3FfY29udGV4dCk7CiAKIAlzd2l0Y2ggKGluZGV4KSB7CiAJY2FzZSBDUV9QSUQ6CiAJCXBhcmFtID0gY3EtPnBpZDsKIAkJYnJlYWs7CiAJY2FzZSBDUV9OVU1fQ1FFUzoKLQkJcGFyYW0gPSAxIDw8ICgoYmUzMl90b19jcHUoY3R4LT5sb2dfc3pfdXNyX3BhZ2UpID4+IDI0KSAmIDB4MWYpOworCQlwYXJhbSA9IDEgPDwgTUxYNV9HRVQoY3FjLCBjdHgsIGxvZ19jcV9zaXplKTsKIAkJYnJlYWs7CiAJY2FzZSBDUV9MT0dfUEdfU1o6Ci0JCXBhcmFtID0gKGN0eC0+bG9nX3BnX3N6ICYgMHgxZikgKyAxMjsKKwkJcGFyYW0gPSBNTFg1X0dFVChjcWMsIGN0eCwgbG9nX3BhZ2Vfc2l6ZSk7CiAJCWJyZWFrOwogCX0KIAogb3V0OgotCWtmcmVlKG91dCk7CisJa3ZmcmVlKG91dCk7CiAJcmV0dXJuIHBhcmFtOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZGV2LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlkYmMyOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9kZXYuYwpAQCAtMCwwICsxLDM0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1LCBNZWxsYW5veCBUZWNobm9sb2dpZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbWx4NS9kcml2ZXIuaD4KKyNpbmNsdWRlICJtbHg1X2NvcmUuaCIKKworc3RhdGljIExJU1RfSEVBRChpbnRmX2xpc3QpOworc3RhdGljIExJU1RfSEVBRChtbHg1X2Rldl9saXN0KTsKKy8qIGludGYgZGV2IGxpc3QgbXV0ZXggKi8KK3N0YXRpYyBERUZJTkVfTVVURVgobWx4NV9pbnRmX211dGV4KTsKKworc3RydWN0IG1seDVfZGV2aWNlX2NvbnRleHQgeworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwlzdHJ1Y3QgbWx4NV9pbnRlcmZhY2UgICppbnRmOworCXZvaWQJCSAgICAgICAqY29udGV4dDsKKwl1bnNpZ25lZCBsb25nCQlzdGF0ZTsKK307CisKK2VudW0geworCU1MWDVfSU5URVJGQUNFX0FEREVELAorCU1MWDVfSU5URVJGQUNFX0FUVEFDSEVELAorfTsKKwordm9pZCBtbHg1X2FkZF9kZXZpY2Uoc3RydWN0IG1seDVfaW50ZXJmYWNlICppbnRmLCBzdHJ1Y3QgbWx4NV9wcml2ICpwcml2KQoreworCXN0cnVjdCBtbHg1X2RldmljZV9jb250ZXh0ICpkZXZfY3R4OworCXN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYgPSBjb250YWluZXJfb2YocHJpdiwgc3RydWN0IG1seDVfY29yZV9kZXYsIHByaXYpOworCisJaWYgKCFtbHg1X2xhZ19pbnRmX2FkZChpbnRmLCBwcml2KSkKKwkJcmV0dXJuOworCisJZGV2X2N0eCA9IGt6YWxsb2Moc2l6ZW9mKCpkZXZfY3R4KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXZfY3R4KQorCQlyZXR1cm47CisKKwlkZXZfY3R4LT5pbnRmID0gaW50ZjsKKwlkZXZfY3R4LT5jb250ZXh0ID0gaW50Zi0+YWRkKGRldik7CisJc2V0X2JpdChNTFg1X0lOVEVSRkFDRV9BRERFRCwgJmRldl9jdHgtPnN0YXRlKTsKKwlpZiAoaW50Zi0+YXR0YWNoKQorCQlzZXRfYml0KE1MWDVfSU5URVJGQUNFX0FUVEFDSEVELCAmZGV2X2N0eC0+c3RhdGUpOworCisJaWYgKGRldl9jdHgtPmNvbnRleHQpIHsKKwkJc3Bpbl9sb2NrX2lycSgmcHJpdi0+Y3R4X2xvY2spOworCQlsaXN0X2FkZF90YWlsKCZkZXZfY3R4LT5saXN0LCAmcHJpdi0+Y3R4X2xpc3QpOworCQlzcGluX3VubG9ja19pcnEoJnByaXYtPmN0eF9sb2NrKTsKKwl9IGVsc2UgeworCQlrZnJlZShkZXZfY3R4KTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWx4NV9kZXZpY2VfY29udGV4dCAqbWx4NV9nZXRfZGV2aWNlKHN0cnVjdCBtbHg1X2ludGVyZmFjZSAqaW50ZiwKKwkJCQkJCSAgIHN0cnVjdCBtbHg1X3ByaXYgKnByaXYpCit7CisJc3RydWN0IG1seDVfZGV2aWNlX2NvbnRleHQgKmRldl9jdHg7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldl9jdHgsICZwcml2LT5jdHhfbGlzdCwgbGlzdCkKKwkJaWYgKGRldl9jdHgtPmludGYgPT0gaW50ZikKKwkJCXJldHVybiBkZXZfY3R4OworCXJldHVybiBOVUxMOworfQorCit2b2lkIG1seDVfcmVtb3ZlX2RldmljZShzdHJ1Y3QgbWx4NV9pbnRlcmZhY2UgKmludGYsIHN0cnVjdCBtbHg1X3ByaXYgKnByaXYpCit7CisJc3RydWN0IG1seDVfZGV2aWNlX2NvbnRleHQgKmRldl9jdHg7CisJc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiA9IGNvbnRhaW5lcl9vZihwcml2LCBzdHJ1Y3QgbWx4NV9jb3JlX2RldiwgcHJpdik7CisKKwlkZXZfY3R4ID0gbWx4NV9nZXRfZGV2aWNlKGludGYsIHByaXYpOworCWlmICghZGV2X2N0eCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycSgmcHJpdi0+Y3R4X2xvY2spOworCWxpc3RfZGVsKCZkZXZfY3R4LT5saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJnByaXYtPmN0eF9sb2NrKTsKKworCWlmICh0ZXN0X2JpdChNTFg1X0lOVEVSRkFDRV9BRERFRCwgJmRldl9jdHgtPnN0YXRlKSkKKwkJaW50Zi0+cmVtb3ZlKGRldiwgZGV2X2N0eC0+Y29udGV4dCk7CisKKwlrZnJlZShkZXZfY3R4KTsKK30KKworc3RhdGljIHZvaWQgbWx4NV9hdHRhY2hfaW50ZXJmYWNlKHN0cnVjdCBtbHg1X2ludGVyZmFjZSAqaW50Ziwgc3RydWN0IG1seDVfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgbWx4NV9kZXZpY2VfY29udGV4dCAqZGV2X2N0eDsKKwlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2ID0gY29udGFpbmVyX29mKHByaXYsIHN0cnVjdCBtbHg1X2NvcmVfZGV2LCBwcml2KTsKKworCWRldl9jdHggPSBtbHg1X2dldF9kZXZpY2UoaW50ZiwgcHJpdik7CisJaWYgKCFkZXZfY3R4KQorCQlyZXR1cm47CisKKwlpZiAoaW50Zi0+YXR0YWNoKSB7CisJCWlmICh0ZXN0X2JpdChNTFg1X0lOVEVSRkFDRV9BVFRBQ0hFRCwgJmRldl9jdHgtPnN0YXRlKSkKKwkJCXJldHVybjsKKwkJaW50Zi0+YXR0YWNoKGRldiwgZGV2X2N0eC0+Y29udGV4dCk7CisJCXNldF9iaXQoTUxYNV9JTlRFUkZBQ0VfQVRUQUNIRUQsICZkZXZfY3R4LT5zdGF0ZSk7CisJfSBlbHNlIHsKKwkJaWYgKHRlc3RfYml0KE1MWDVfSU5URVJGQUNFX0FEREVELCAmZGV2X2N0eC0+c3RhdGUpKQorCQkJcmV0dXJuOworCQlkZXZfY3R4LT5jb250ZXh0ID0gaW50Zi0+YWRkKGRldik7CisJCXNldF9iaXQoTUxYNV9JTlRFUkZBQ0VfQURERUQsICZkZXZfY3R4LT5zdGF0ZSk7CisJfQorfQorCit2b2lkIG1seDVfYXR0YWNoX2RldmljZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KQoreworCXN0cnVjdCBtbHg1X3ByaXYgKnByaXYgPSAmZGV2LT5wcml2OworCXN0cnVjdCBtbHg1X2ludGVyZmFjZSAqaW50ZjsKKworCW11dGV4X2xvY2soJm1seDVfaW50Zl9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpbnRmLCAmaW50Zl9saXN0LCBsaXN0KQorCQltbHg1X2F0dGFjaF9pbnRlcmZhY2UoaW50ZiwgcHJpdik7CisJbXV0ZXhfdW5sb2NrKCZtbHg1X2ludGZfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBtbHg1X2RldGFjaF9pbnRlcmZhY2Uoc3RydWN0IG1seDVfaW50ZXJmYWNlICppbnRmLCBzdHJ1Y3QgbWx4NV9wcml2ICpwcml2KQoreworCXN0cnVjdCBtbHg1X2RldmljZV9jb250ZXh0ICpkZXZfY3R4OworCXN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYgPSBjb250YWluZXJfb2YocHJpdiwgc3RydWN0IG1seDVfY29yZV9kZXYsIHByaXYpOworCisJZGV2X2N0eCA9IG1seDVfZ2V0X2RldmljZShpbnRmLCBwcml2KTsKKwlpZiAoIWRldl9jdHgpCisJCXJldHVybjsKKworCWlmIChpbnRmLT5kZXRhY2gpIHsKKwkJaWYgKCF0ZXN0X2JpdChNTFg1X0lOVEVSRkFDRV9BVFRBQ0hFRCwgJmRldl9jdHgtPnN0YXRlKSkKKwkJCXJldHVybjsKKwkJaW50Zi0+ZGV0YWNoKGRldiwgZGV2X2N0eC0+Y29udGV4dCk7CisJCWNsZWFyX2JpdChNTFg1X0lOVEVSRkFDRV9BVFRBQ0hFRCwgJmRldl9jdHgtPnN0YXRlKTsKKwl9IGVsc2UgeworCQlpZiAoIXRlc3RfYml0KE1MWDVfSU5URVJGQUNFX0FEREVELCAmZGV2X2N0eC0+c3RhdGUpKQorCQkJcmV0dXJuOworCQlpbnRmLT5yZW1vdmUoZGV2LCBkZXZfY3R4LT5jb250ZXh0KTsKKwkJY2xlYXJfYml0KE1MWDVfSU5URVJGQUNFX0FEREVELCAmZGV2X2N0eC0+c3RhdGUpOworCX0KK30KKwordm9pZCBtbHg1X2RldGFjaF9kZXZpY2Uoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgbWx4NV9wcml2ICpwcml2ID0gJmRldi0+cHJpdjsKKwlzdHJ1Y3QgbWx4NV9pbnRlcmZhY2UgKmludGY7CisKKwltdXRleF9sb2NrKCZtbHg1X2ludGZfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoaW50ZiwgJmludGZfbGlzdCwgbGlzdCkKKwkJbWx4NV9kZXRhY2hfaW50ZXJmYWNlKGludGYsIHByaXYpOworCW11dGV4X3VubG9jaygmbWx4NV9pbnRmX211dGV4KTsKK30KKworYm9vbCBtbHg1X2RldmljZV9yZWdpc3RlcmVkKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpCit7CisJc3RydWN0IG1seDVfcHJpdiAqcHJpdjsKKwlib29sIGZvdW5kID0gZmFsc2U7CisKKwltdXRleF9sb2NrKCZtbHg1X2ludGZfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocHJpdiwgJm1seDVfZGV2X2xpc3QsIGRldl9saXN0KQorCQlpZiAocHJpdiA9PSAmZGV2LT5wcml2KQorCQkJZm91bmQgPSB0cnVlOworCW11dGV4X3VubG9jaygmbWx4NV9pbnRmX211dGV4KTsKKworCXJldHVybiBmb3VuZDsKK30KKworaW50IG1seDVfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpCit7CisJc3RydWN0IG1seDVfcHJpdiAqcHJpdiA9ICZkZXYtPnByaXY7CisJc3RydWN0IG1seDVfaW50ZXJmYWNlICppbnRmOworCisJbXV0ZXhfbG9jaygmbWx4NV9pbnRmX211dGV4KTsKKwlsaXN0X2FkZF90YWlsKCZwcml2LT5kZXZfbGlzdCwgJm1seDVfZGV2X2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoaW50ZiwgJmludGZfbGlzdCwgbGlzdCkKKwkJbWx4NV9hZGRfZGV2aWNlKGludGYsIHByaXYpOworCW11dGV4X3VubG9jaygmbWx4NV9pbnRmX211dGV4KTsKKworCXJldHVybiAwOworfQorCit2b2lkIG1seDVfdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgbWx4NV9wcml2ICpwcml2ID0gJmRldi0+cHJpdjsKKwlzdHJ1Y3QgbWx4NV9pbnRlcmZhY2UgKmludGY7CisKKwltdXRleF9sb2NrKCZtbHg1X2ludGZfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoaW50ZiwgJmludGZfbGlzdCwgbGlzdCkKKwkJbWx4NV9yZW1vdmVfZGV2aWNlKGludGYsIHByaXYpOworCWxpc3RfZGVsKCZwcml2LT5kZXZfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZtbHg1X2ludGZfbXV0ZXgpOworfQorCitpbnQgbWx4NV9yZWdpc3Rlcl9pbnRlcmZhY2Uoc3RydWN0IG1seDVfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBtbHg1X3ByaXYgKnByaXY7CisKKwlpZiAoIWludGYtPmFkZCB8fCAhaW50Zi0+cmVtb3ZlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJm1seDVfaW50Zl9tdXRleCk7CisJbGlzdF9hZGRfdGFpbCgmaW50Zi0+bGlzdCwgJmludGZfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwcml2LCAmbWx4NV9kZXZfbGlzdCwgZGV2X2xpc3QpCisJCW1seDVfYWRkX2RldmljZShpbnRmLCBwcml2KTsKKwltdXRleF91bmxvY2soJm1seDVfaW50Zl9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wobWx4NV9yZWdpc3Rlcl9pbnRlcmZhY2UpOworCit2b2lkIG1seDVfdW5yZWdpc3Rlcl9pbnRlcmZhY2Uoc3RydWN0IG1seDVfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBtbHg1X3ByaXYgKnByaXY7CisKKwltdXRleF9sb2NrKCZtbHg1X2ludGZfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocHJpdiwgJm1seDVfZGV2X2xpc3QsIGRldl9saXN0KQorCQltbHg1X3JlbW92ZV9kZXZpY2UoaW50ZiwgcHJpdik7CisJbGlzdF9kZWwoJmludGYtPmxpc3QpOworCW11dGV4X3VubG9jaygmbWx4NV9pbnRmX211dGV4KTsKK30KK0VYUE9SVF9TWU1CT0wobWx4NV91bnJlZ2lzdGVyX2ludGVyZmFjZSk7CisKK3ZvaWQgKm1seDVfZ2V0X3Byb3RvY29sX2RldihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwgaW50IHByb3RvY29sKQoreworCXN0cnVjdCBtbHg1X3ByaXYgKnByaXYgPSAmbWRldi0+cHJpdjsKKwlzdHJ1Y3QgbWx4NV9kZXZpY2VfY29udGV4dCAqZGV2X2N0eDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvaWQgKnJlc3VsdCA9IE5VTEw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+Y3R4X2xvY2ssIGZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2X2N0eCwgJm1kZXYtPnByaXYuY3R4X2xpc3QsIGxpc3QpCisJCWlmICgoZGV2X2N0eC0+aW50Zi0+cHJvdG9jb2wgPT0gcHJvdG9jb2wpICYmCisJCSAgICBkZXZfY3R4LT5pbnRmLT5nZXRfZGV2KSB7CisJCQlyZXN1bHQgPSBkZXZfY3R4LT5pbnRmLT5nZXRfZGV2KGRldl9jdHgtPmNvbnRleHQpOworCQkJYnJlYWs7CisJCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmN0eF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTChtbHg1X2dldF9wcm90b2NvbF9kZXYpOworCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGludGZfbXV0ZXggaGVsZCAqLwordm9pZCBtbHg1X2FkZF9kZXZfYnlfcHJvdG9jb2woc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgaW50IHByb3RvY29sKQoreworCXN0cnVjdCBtbHg1X2ludGVyZmFjZSAqaW50ZjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaW50ZiwgJmludGZfbGlzdCwgbGlzdCkKKwkJaWYgKGludGYtPnByb3RvY29sID09IHByb3RvY29sKSB7CisJCQltbHg1X2FkZF9kZXZpY2UoaW50ZiwgJmRldi0+cHJpdik7CisJCQlicmVhazsKKwkJfQorfQorCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGludGZfbXV0ZXggaGVsZCAqLwordm9pZCBtbHg1X3JlbW92ZV9kZXZfYnlfcHJvdG9jb2woc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgaW50IHByb3RvY29sKQoreworCXN0cnVjdCBtbHg1X2ludGVyZmFjZSAqaW50ZjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaW50ZiwgJmludGZfbGlzdCwgbGlzdCkKKwkJaWYgKGludGYtPnByb3RvY29sID09IHByb3RvY29sKSB7CisJCQltbHg1X3JlbW92ZV9kZXZpY2UoaW50ZiwgJmRldi0+cHJpdik7CisJCQlicmVhazsKKwkJfQorfQorCitzdGF0aWMgdTE2IG1seDVfZ2VuX3BjaV9pZChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KQoreworCXJldHVybiAodTE2KSgoZGV2LT5wZGV2LT5idXMtPm51bWJlciA8PCA4KSB8CisJCSAgICAgUENJX1NMT1QoZGV2LT5wZGV2LT5kZXZmbikpOworfQorCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGludGZfbXV0ZXggaGVsZCAqLworc3RydWN0IG1seDVfY29yZV9kZXYgKm1seDVfZ2V0X25leHRfcGh5c19kZXYoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKK3sKKwl1MTYgcGNpX2lkID0gbWx4NV9nZW5fcGNpX2lkKGRldik7CisJc3RydWN0IG1seDVfY29yZV9kZXYgKnJlcyA9IE5VTEw7CisJc3RydWN0IG1seDVfY29yZV9kZXYgKnRtcF9kZXY7CisJc3RydWN0IG1seDVfcHJpdiAqcHJpdjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocHJpdiwgJm1seDVfZGV2X2xpc3QsIGRldl9saXN0KSB7CisJCXRtcF9kZXYgPSBjb250YWluZXJfb2YocHJpdiwgc3RydWN0IG1seDVfY29yZV9kZXYsIHByaXYpOworCQlpZiAoKGRldiAhPSB0bXBfZGV2KSAmJiAobWx4NV9nZW5fcGNpX2lkKHRtcF9kZXYpID09IHBjaV9pZCkpIHsKKwkJCXJlcyA9IHRtcF9kZXY7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByZXM7Cit9CisKK3ZvaWQgbWx4NV9jb3JlX2V2ZW50KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIGVudW0gbWx4NV9kZXZfZXZlbnQgZXZlbnQsCisJCSAgICAgdW5zaWduZWQgbG9uZyBwYXJhbSkKK3sKKwlzdHJ1Y3QgbWx4NV9wcml2ICpwcml2ID0gJmRldi0+cHJpdjsKKwlzdHJ1Y3QgbWx4NV9kZXZpY2VfY29udGV4dCAqZGV2X2N0eDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmN0eF9sb2NrLCBmbGFncyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldl9jdHgsICZwcml2LT5jdHhfbGlzdCwgbGlzdCkKKwkJaWYgKGRldl9jdHgtPmludGYtPmV2ZW50KQorCQkJZGV2X2N0eC0+aW50Zi0+ZXZlbnQoZGV2LCBkZXZfY3R4LT5jb250ZXh0LCBldmVudCwgcGFyYW0pOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+Y3R4X2xvY2ssIGZsYWdzKTsKK30KKwordm9pZCBtbHg1X2Rldl9saXN0X2xvY2sodm9pZCkKK3sKKwltdXRleF9sb2NrKCZtbHg1X2ludGZfbXV0ZXgpOworfQorCit2b2lkIG1seDVfZGV2X2xpc3RfdW5sb2NrKHZvaWQpCit7CisJbXV0ZXhfdW5sb2NrKCZtbHg1X2ludGZfbXV0ZXgpOworfQorCitpbnQgbWx4NV9kZXZfbGlzdF90cnlsb2NrKHZvaWQpCit7CisJcmV0dXJuIG11dGV4X3RyeWxvY2soJm1seDVfaW50Zl9tdXRleCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW4uaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbi5oCmluZGV4IDFiNDk1ZWYuLjQ2MDM2M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbi5oCkBAIC02MiwxOSArNjIsMjUgQEAKICNkZWZpbmUgTUxYNUVfUEFSQU1TX01BWElNVU1fTE9HX1JRX1NJWkUgICAgICAgICAgICAgICAgMHhkCiAKICNkZWZpbmUgTUxYNUVfUEFSQU1TX01JTklNVU1fTE9HX1JRX1NJWkVfTVBXICAgICAgICAgICAgMHgxCi0jZGVmaW5lIE1MWDVFX1BBUkFNU19ERUZBVUxUX0xPR19SUV9TSVpFX01QVyAgICAgICAgICAgIDB4NAorI2RlZmluZSBNTFg1RV9QQVJBTVNfREVGQVVMVF9MT0dfUlFfU0laRV9NUFcgICAgICAgICAgICAweDMKICNkZWZpbmUgTUxYNUVfUEFSQU1TX01BWElNVU1fTE9HX1JRX1NJWkVfTVBXICAgICAgICAgICAgMHg2CiAKKyNkZWZpbmUgTUxYNV9SWF9IRUFEUk9PTSBORVRfU0tCX1BBRAorCiAjZGVmaW5lIE1MWDVfTVBXUlFfTE9HX1NUUklERV9TSVpFCQk2ICAvKiA+PSA2LCBIVyByZXN0cmljdGlvbiAqLwogI2RlZmluZSBNTFg1X01QV1JRX0xPR19TVFJJREVfU0laRV9DUUVfQ09NUFJFU1MJOCAgLyogPj0gNiwgSFcgcmVzdHJpY3Rpb24gKi8KLSNkZWZpbmUgTUxYNV9NUFdSUV9MT0dfV1FFX1NaCQkJMTcKKyNkZWZpbmUgTUxYNV9NUFdSUV9MT0dfV1FFX1NaCQkJMTgKICNkZWZpbmUgTUxYNV9NUFdSUV9XUUVfUEFHRV9PUkRFUiAgKE1MWDVfTVBXUlFfTE9HX1dRRV9TWiAtIFBBR0VfU0hJRlQgPiAwID8gXAogCQkJCSAgICBNTFg1X01QV1JRX0xPR19XUUVfU1ogLSBQQUdFX1NISUZUIDogMCkKICNkZWZpbmUgTUxYNV9NUFdSUV9QQUdFU19QRVJfV1FFCQlCSVQoTUxYNV9NUFdSUV9XUUVfUEFHRV9PUkRFUikKICNkZWZpbmUgTUxYNV9NUFdSUV9TVFJJREVTX1BFUl9QQUdFCQkoTUxYNV9NUFdSUV9OVU1fU1RSSURFUyA+PiBcCiAJCQkJCQkgTUxYNV9NUFdSUV9XUUVfUEFHRV9PUkRFUikKLSNkZWZpbmUgTUxYNV9DSEFOTkVMX01BWF9OVU1fTVRUUyAoQUxJR04oTUxYNV9NUFdSUV9QQUdFU19QRVJfV1FFLCA4KSAqIFwKLQkJCQkgICBCSVQoTUxYNUVfUEFSQU1TX01BWElNVU1fTE9HX1JRX1NJWkVfTVBXKSkKKworI2RlZmluZSBNTFg1X01UVF9PQ1RXKG5wYWdlcykgKEFMSUdOKG5wYWdlcywgOCkgLyAyKQorI2RlZmluZSBNTFg1RV9SRVFVSVJFRF9NVFRTKHJxcywgd3FlcylcCisJKHJxcyAqIHdxZXMgKiBBTElHTihNTFg1X01QV1JRX1BBR0VTX1BFUl9XUUUsIDgpKQorI2RlZmluZSBNTFg1RV9WQUxJRF9OVU1fTVRUUyhudW1fbXR0cykgKE1MWDVfTVRUX09DVFcobnVtX210dHMpIDw9IFUxNl9NQVgpCisKICNkZWZpbmUgTUxYNV9VTVJfQUxJR04JCQkJKDIwNDgpCiAjZGVmaW5lIE1MWDVfTVBXUlFfU01BTExfUEFDS0VUX1RIUkVTSE9MRAkoMTI4KQogCkBAIC05NSw2ICsxMDEsMTggQEAKICNkZWZpbmUgTUxYNUVfVVBEQVRFX1NUQVRTX0lOVEVSVkFMICAgIDIwMCAvKiBtc2VjcyAqLwogI2RlZmluZSBNTFg1RV9TUV9CRl9CVURHRVQgICAgICAgICAgICAgMTYKIAorI2RlZmluZSBNTFg1RV9JQ09TUV9NQVhfV1FFQkJTIFwKKwkoRElWX1JPVU5EX1VQKHNpemVvZihzdHJ1Y3QgbWx4NWVfdW1yX3dxZSksIE1MWDVfU0VORF9XUUVfQkIpKQorCisjZGVmaW5lIE1MWDVFX1hEUF9NSU5fSU5MSU5FIChFVEhfSExFTiArIFZMQU5fSExFTikKKyNkZWZpbmUgTUxYNUVfWERQX0lIU19EU19DT1VOVCBcCisJRElWX1JPVU5EX1VQKE1MWDVFX1hEUF9NSU5fSU5MSU5FIC0gMiwgTUxYNV9TRU5EX1dRRV9EUykKKyNkZWZpbmUgTUxYNUVfWERQX1RYX0RTX0NPVU5UIFwKKwkoTUxYNUVfWERQX0lIU19EU19DT1VOVCArIFwKKwkgKHNpemVvZihzdHJ1Y3QgbWx4NWVfdHhfd3FlKSAvIE1MWDVfU0VORF9XUUVfRFMpICsgMSAvKiBTRyBEUyAqLykKKyNkZWZpbmUgTUxYNUVfWERQX1RYX1dRRUJCUyBcCisJRElWX1JPVU5EX1VQKE1MWDVFX1hEUF9UWF9EU19DT1VOVCwgTUxYNV9TRU5EX1dRRUJCX05VTV9EUykKKwogI2RlZmluZSBNTFg1RV9OVU1fTUFJTl9HUk9VUFMgOQogCiBzdGF0aWMgaW5saW5lIHUxNiBtbHg1X21pbl9yeF93cWVzKGludCB3cV90eXBlLCB1MzIgd3Ffc2l6ZSkKQEAgLTIxOSw5ICsyMzcsOCBAQAogfTsKIAogZW51bSB7Ci0JTUxYNUVfUlFfU1RBVEVfUE9TVF9XUUVTX0VOQUJMRSwKKwlNTFg1RV9SUV9TVEFURV9GTFVTSCwKIAlNTFg1RV9SUV9TVEFURV9VTVJfV1FFX0lOX1BST0dSRVNTLAotCU1MWDVFX1JRX1NUQVRFX0ZMVVNIX1RJTUVPVVQsCiAJTUxYNUVfUlFfU1RBVEVfQU0sCiB9OwogCkBAIC0yODQsMjAgKzMwMSw0NCBAQAogCXU4CQkJCQl0aXJlZDsKIH07CiAKKy8qIGEgc2luZ2xlIGNhY2hlIHVuaXQgaXMgY2FwYWJsZSB0byBzZXJ2ZSBvbmUgbmFwaSBjYWxsIChmb3Igbm9uLXN0cmlkaW5nIHJxKQorICogb3IgYSBNUFdRRSAoZm9yIHN0cmlkaW5nIHJxKS4KKyAqLworI2RlZmluZSBNTFg1RV9DQUNIRV9VTklUCShNTFg1X01QV1JRX1BBR0VTX1BFUl9XUUUgPiBOQVBJX1BPTExfV0VJR0hUID8gXAorCQkJCSBNTFg1X01QV1JRX1BBR0VTX1BFUl9XUUUgOiBOQVBJX1BPTExfV0VJR0hUKQorI2RlZmluZSBNTFg1RV9DQUNIRV9TSVpFCSgyICogcm91bmR1cF9wb3dfb2ZfdHdvKE1MWDVFX0NBQ0hFX1VOSVQpKQorc3RydWN0IG1seDVlX3BhZ2VfY2FjaGUgeworCXUzMiBoZWFkOworCXUzMiB0YWlsOworCXN0cnVjdCBtbHg1ZV9kbWFfaW5mbyBwYWdlX2NhY2hlW01MWDVFX0NBQ0hFX1NJWkVdOworfTsKKwogc3RydWN0IG1seDVlX3JxIHsKIAkvKiBkYXRhIHBhdGggKi8KIAlzdHJ1Y3QgbWx4NV93cV9sbCAgICAgIHdxOwotCXUzMiAgICAgICAgICAgICAgICAgICAgd3FlX3N6OwotCXN0cnVjdCBza19idWZmICAgICAgICoqc2tiOwotCXN0cnVjdCBtbHg1ZV9tcHdfaW5mbyAqd3FlX2luZm87CisKKwl1bmlvbiB7CisJCXN0cnVjdCBtbHg1ZV9kbWFfaW5mbyAqZG1hX2luZm87CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgbWx4NWVfbXB3X2luZm8gKmluZm87CisJCQl2b2lkICAgICAgICAgICAgICAgICAgKm10dF9ub19hbGlnbjsKKwkJCXUzMiAgICAgICAgICAgICAgICAgICAgbXR0X29mZnNldDsKKwkJfSBtcHdxZTsKKwl9OworCXN0cnVjdCB7CisJCXU4ICAgICAgICAgICAgIHBhZ2Vfb3JkZXI7CisJCXUzMiAgICAgICAgICAgIHdxZV9zejsgICAgLyogd3FlIGRhdGEgYnVmZmVyIHNpemUgKi8KKwkJdTggICAgICAgICAgICAgbWFwX2RpcjsgICAvKiBkbWEgbWFwIGRpcmVjdGlvbiAqLworCX0gYnVmZjsKIAlfX2JlMzIgICAgICAgICAgICAgICAgIG1rZXlfYmU7Ci0JX19iZTMyICAgICAgICAgICAgICAgICB1bXJfbWtleV9iZTsKIAogCXN0cnVjdCBkZXZpY2UgICAgICAgICAqcGRldjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAgICAgKm5ldGRldjsKIAlzdHJ1Y3QgbWx4NWVfdHN0YW1wICAgKnRzdGFtcDsKIAlzdHJ1Y3QgbWx4NWVfcnFfc3RhdHMgIHN0YXRzOwogCXN0cnVjdCBtbHg1ZV9jcSAgICAgICAgY3E7CisJc3RydWN0IG1seDVlX3BhZ2VfY2FjaGUgcGFnZV9jYWNoZTsKKwogCW1seDVlX2ZwX2hhbmRsZV9yeF9jcWUgaGFuZGxlX3J4X2NxZTsKIAltbHg1ZV9mcF9hbGxvY193cWUgICAgIGFsbG9jX3dxZTsKIAltbHg1ZV9mcF9kZWFsbG9jX3dxZSAgIGRlYWxsb2Nfd3FlOwpAQCAtMzA2LDYgKzM0Nyw3IEBACiAJaW50ICAgICAgICAgICAgICAgICAgICBpeDsKIAogCXN0cnVjdCBtbHg1ZV9yeF9hbSAgICAgYW07IC8qIEFkYXB0aXZlIE1vZGVyYXRpb24gKi8KKwlzdHJ1Y3QgYnBmX3Byb2cgICAgICAgKnhkcF9wcm9nOwogCiAJLyogY29udHJvbCAqLwogCXN0cnVjdCBtbHg1X3dxX2N0cmwgICAgd3FfY3RybDsKQEAgLTMxOSwzMiArMzYxLDE1IEBACiAKIHN0cnVjdCBtbHg1ZV91bXJfZG1hX2luZm8gewogCV9fYmU2NCAgICAgICAgICAgICAgICAqbXR0OwotCV9fYmU2NCAgICAgICAgICAgICAgICAqbXR0X25vX2FsaWduOwogCWRtYV9hZGRyX3QgICAgICAgICAgICAgbXR0X2FkZHI7Ci0Jc3RydWN0IG1seDVlX2RtYV9pbmZvICpkbWFfaW5mbzsKKwlzdHJ1Y3QgbWx4NWVfZG1hX2luZm8gIGRtYV9pbmZvW01MWDVfTVBXUlFfUEFHRVNfUEVSX1dRRV07CisJc3RydWN0IG1seDVlX3Vtcl93cWUgICB3cWU7CiB9OwogCiBzdHJ1Y3QgbWx4NWVfbXB3X2luZm8gewotCXVuaW9uIHsKLQkJc3RydWN0IG1seDVlX2RtYV9pbmZvICAgICBkbWFfaW5mbzsKLQkJc3RydWN0IG1seDVlX3Vtcl9kbWFfaW5mbyB1bXI7Ci0JfTsKKwlzdHJ1Y3QgbWx4NWVfdW1yX2RtYV9pbmZvIHVtcjsKIAl1MTYgY29uc3VtZWRfc3RyaWRlczsKIAl1MTYgc2tic19mcmFnc1tNTFg1X01QV1JRX1BBR0VTX1BFUl9XUUVdOwotCi0Jdm9pZCAoKmRtYV9wcmVfc3luYykoc3RydWN0IGRldmljZSAqcGRldiwKLQkJCSAgICAgc3RydWN0IG1seDVlX21wd19pbmZvICp3aSwKLQkJCSAgICAgdTMyIHdxZV9vZmZzZXQsIHUzMiBsZW4pOwotCXZvaWQgKCphZGRfc2tiX2ZyYWcpKHN0cnVjdCBtbHg1ZV9ycSAqcnEsCi0JCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgIHN0cnVjdCBtbHg1ZV9tcHdfaW5mbyAqd2ksCi0JCQkgICAgIHUzMiBwYWdlX2lkeCwgdTMyIGZyYWdfb2Zmc2V0LCB1MzIgbGVuKTsKLQl2b2lkICgqY29weV9za2JfaGVhZGVyKShzdHJ1Y3QgZGV2aWNlICpwZGV2LAotCQkJCXN0cnVjdCBza19idWZmICpza2IsCi0JCQkJc3RydWN0IG1seDVlX21wd19pbmZvICp3aSwKLQkJCQl1MzIgcGFnZV9pZHgsIHUzMiBvZmZzZXQsCi0JCQkJdTMyIGhlYWRsZW4pOwotCXZvaWQgKCpmcmVlX3dxZSkoc3RydWN0IG1seDVlX3JxICpycSwgc3RydWN0IG1seDVlX21wd19pbmZvICp3aSk7CiB9OwogCiBzdHJ1Y3QgbWx4NWVfdHhfd3FlX2luZm8gewpAQCAtMzY1LDE2ICszOTAsMjEgQEAKIH07CiAKIGVudW0gewotCU1MWDVFX1NRX1NUQVRFX1dBS0VfVFhRX0VOQUJMRSwKKwlNTFg1RV9TUV9TVEFURV9GTFVTSCwKIAlNTFg1RV9TUV9TVEFURV9CRl9FTkFCTEUsCi0JTUxYNUVfU1FfU1RBVEVfVFhfVElNRU9VVCwKIH07CiAKLXN0cnVjdCBtbHg1ZV9pY29fd3FlX2luZm8geworc3RydWN0IG1seDVlX3NxX3dxZV9pbmZvIHsKIAl1OCAgb3Bjb2RlOwogCXU4ICBudW1fd3FlYmJzOwogfTsKIAorZW51bSBtbHg1ZV9zcV90eXBlIHsKKwlNTFg1RV9TUV9UWFEsCisJTUxYNUVfU1FfSUNPLAorCU1MWDVFX1NRX1hEUAorfTsKKwogc3RydWN0IG1seDVlX3NxIHsKIAkvKiBkYXRhIHBhdGggKi8KIApAQCAtMzkyLDEwICs0MjIsMjAgQEAKIAogCXN0cnVjdCBtbHg1ZV9jcSAgICAgICAgICAgIGNxOwogCi0JLyogcG9pbnRlcnMgdG8gcGVyIHBhY2tldCBpbmZvOiB3cml0ZUB4bWl0LCByZWFkQGNvbXBsZXRpb24gKi8KLQlzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAgKipza2I7Ci0Jc3RydWN0IG1seDVlX3NxX2RtYSAgICAgICAqZG1hX2ZpZm87Ci0Jc3RydWN0IG1seDVlX3R4X3dxZV9pbmZvICAqd3FlX2luZm87CisJLyogcG9pbnRlcnMgdG8gcGVyIHR4IGVsZW1lbnQgaW5mbzogd3JpdGVAeG1pdCwgcmVhZEBjb21wbGV0aW9uICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHNrX2J1ZmYgICAgICAgICAgICoqc2tiOworCQkJc3RydWN0IG1seDVlX3NxX2RtYSAgICAgICAqZG1hX2ZpZm87CisJCQlzdHJ1Y3QgbWx4NWVfdHhfd3FlX2luZm8gICp3cWVfaW5mbzsKKwkJfSB0eHE7CisJCXN0cnVjdCBtbHg1ZV9zcV93cWVfaW5mbyAqaWNvX3dxZTsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBtbHg1ZV9zcV93cWVfaW5mbyAgKndxZV9pbmZvOworCQkJc3RydWN0IG1seDVlX2RtYV9pbmZvICAgICAqZGk7CisJCQlib29sICAgICAgICAgICAgICAgICAgICAgICBkb29yYmVsbDsKKwkJfSB4ZHA7CisJfSBkYjsKIAogCS8qIHJlYWQgb25seSAqLwogCXN0cnVjdCBtbHg1X3dxX2N5YyAgICAgICAgIHdxOwpAQCAtNDE3LDggKzQ1Nyw4IEBACiAJc3RydWN0IG1seDVfdWFyICAgICAgICAgICAgdWFyOwogCXN0cnVjdCBtbHg1ZV9jaGFubmVsICAgICAgKmNoYW5uZWw7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgICAgdGM7Ci0Jc3RydWN0IG1seDVlX2ljb193cWVfaW5mbyAqaWNvX3dxZV9pbmZvOwogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgIHJhdGVfbGltaXQ7CisJdTggICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTsKIH0gX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKIAogc3RhdGljIGlubGluZSBib29sIG1seDVlX3NxX2hhc19yb29tX2ZvcihzdHJ1Y3QgbWx4NWVfc3EgKnNxLCB1MTYgbikKQEAgLTQzNCw4ICs0NzQsMTAgQEAKIHN0cnVjdCBtbHg1ZV9jaGFubmVsIHsKIAkvKiBkYXRhIHBhdGggKi8KIAlzdHJ1Y3QgbWx4NWVfcnEgICAgICAgICAgICBycTsKKwlzdHJ1Y3QgbWx4NWVfc3EgICAgICAgICAgICB4ZHBfc3E7CiAJc3RydWN0IG1seDVlX3NxICAgICAgICAgICAgc3FbTUxYNUVfTUFYX05VTV9UQ107CiAJc3RydWN0IG1seDVlX3NxICAgICAgICAgICAgaWNvc3E7ICAgLyogaW50ZXJuYWwgY29udHJvbCBvcGVyYXRpb25zICovCisJYm9vbCAgICAgICAgICAgICAgICAgICAgICAgeGRwOwogCXN0cnVjdCBuYXBpX3N0cnVjdCAgICAgICAgIG5hcGk7CiAJc3RydWN0IGRldmljZSAgICAgICAgICAgICAqcGRldjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAgICAgICAgICpuZXRkZXY7CkBAIC02MTcsNiArNjU5LDcgQEAKIAkvKiBwcml2IGRhdGEgcGF0aCBmaWVsZHMgLSBzdGFydCAqLwogCXN0cnVjdCBtbHg1ZV9zcSAgICAgICAgICAgICoqdHhxX3RvX3NxX21hcDsKIAlpbnQgY2hhbm5lbHRjX3RvX3R4cV9tYXBbTUxYNUVfTUFYX05VTV9DSEFOTkVMU11bTUxYNUVfTUFYX05VTV9UQ107CisJc3RydWN0IGJwZl9wcm9nICp4ZHBfcHJvZzsKIAkvKiBwcml2IGRhdGEgcGF0aCBmaWVsZHMgLSBlbmQgKi8KIAogCXVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgIHN0YXRlOwpAQCAtNjUxLDQwICs2OTQsNiBAQAogCXZvaWQgICAgICAgICAgICAgICAgICAgICAgKnBwcml2OwogfTsKIAotZW51bSBtbHg1ZV9saW5rX21vZGUgewotCU1MWDVFXzEwMDBCQVNFX0NYX1NHTUlJCSA9IDAsCi0JTUxYNUVfMTAwMEJBU0VfS1gJID0gMSwKLQlNTFg1RV8xMEdCQVNFX0NYNAkgPSAyLAotCU1MWDVFXzEwR0JBU0VfS1g0CSA9IDMsCi0JTUxYNUVfMTBHQkFTRV9LUgkgPSA0LAotCU1MWDVFXzIwR0JBU0VfS1IyCSA9IDUsCi0JTUxYNUVfNDBHQkFTRV9DUjQJID0gNiwKLQlNTFg1RV80MEdCQVNFX0tSNAkgPSA3LAotCU1MWDVFXzU2R0JBU0VfUjQJID0gOCwKLQlNTFg1RV8xMEdCQVNFX0NSCSA9IDEyLAotCU1MWDVFXzEwR0JBU0VfU1IJID0gMTMsCi0JTUxYNUVfMTBHQkFTRV9FUgkgPSAxNCwKLQlNTFg1RV80MEdCQVNFX1NSNAkgPSAxNSwKLQlNTFg1RV80MEdCQVNFX0xSNAkgPSAxNiwKLQlNTFg1RV81MEdCQVNFX1NSMgkgPSAxOCwKLQlNTFg1RV8xMDBHQkFTRV9DUjQJID0gMjAsCi0JTUxYNUVfMTAwR0JBU0VfU1I0CSA9IDIxLAotCU1MWDVFXzEwMEdCQVNFX0tSNAkgPSAyMiwKLQlNTFg1RV8xMDBHQkFTRV9MUjQJID0gMjMsCi0JTUxYNUVfMTAwQkFTRV9UWAkgPSAyNCwKLQlNTFg1RV8xMDAwQkFTRV9UCSA9IDI1LAotCU1MWDVFXzEwR0JBU0VfVAkJID0gMjYsCi0JTUxYNUVfMjVHQkFTRV9DUgkgPSAyNywKLQlNTFg1RV8yNUdCQVNFX0tSCSA9IDI4LAotCU1MWDVFXzI1R0JBU0VfU1IJID0gMjksCi0JTUxYNUVfNTBHQkFTRV9DUjIJID0gMzAsCi0JTUxYNUVfNTBHQkFTRV9LUjIJID0gMzEsCi0JTUxYNUVfTElOS19NT0RFU19OVU1CRVIsCi19OwotCi0jZGVmaW5lIE1MWDVFX1BST1RfTUFTSyhsaW5rX21vZGUpICgxIDw8IGxpbmtfbW9kZSkKLQotCiB2b2lkIG1seDVlX2J1aWxkX3B0eXMyZXRodG9vbF9tYXAodm9pZCk7CiAKIHZvaWQgbWx4NWVfc2VuZF9ub3Aoc3RydWN0IG1seDVlX3NxICpzcSwgYm9vbCBub3RpZnlfaHcpOwpAQCAtNjk3LDMxICs3MDYsMTkgQEAKIGludCBtbHg1ZV9uYXBpX3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KTsKIGJvb2wgbWx4NWVfcG9sbF90eF9jcShzdHJ1Y3QgbWx4NWVfY3EgKmNxLCBpbnQgbmFwaV9idWRnZXQpOwogaW50IG1seDVlX3BvbGxfcnhfY3Eoc3RydWN0IG1seDVlX2NxICpjcSwgaW50IGJ1ZGdldCk7Ci12b2lkIG1seDVlX2ZyZWVfdHhfZGVzY3Moc3RydWN0IG1seDVlX3NxICpzcSk7Ci12b2lkIG1seDVlX2ZyZWVfcnhfZGVzY3Moc3RydWN0IG1seDVlX3JxICpycSk7Cit2b2lkIG1seDVlX2ZyZWVfc3FfZGVzY3Moc3RydWN0IG1seDVlX3NxICpzcSk7CiAKK3ZvaWQgbWx4NWVfcGFnZV9yZWxlYXNlKHN0cnVjdCBtbHg1ZV9ycSAqcnEsIHN0cnVjdCBtbHg1ZV9kbWFfaW5mbyAqZG1hX2luZm8sCisJCQlib29sIHJlY3ljbGUpOwogdm9pZCBtbHg1ZV9oYW5kbGVfcnhfY3FlKHN0cnVjdCBtbHg1ZV9ycSAqcnEsIHN0cnVjdCBtbHg1X2NxZTY0ICpjcWUpOwogdm9pZCBtbHg1ZV9oYW5kbGVfcnhfY3FlX21wd3JxKHN0cnVjdCBtbHg1ZV9ycSAqcnEsIHN0cnVjdCBtbHg1X2NxZTY0ICpjcWUpOwogYm9vbCBtbHg1ZV9wb3N0X3J4X3dxZXMoc3RydWN0IG1seDVlX3JxICpycSk7CiBpbnQgbWx4NWVfYWxsb2Nfcnhfd3FlKHN0cnVjdCBtbHg1ZV9ycSAqcnEsIHN0cnVjdCBtbHg1ZV9yeF93cWUgKndxZSwgdTE2IGl4KTsKLWludCBtbHg1ZV9hbGxvY19yeF9tcHdxZShzdHJ1Y3QgbWx4NWVfcnEgKnJxLCBzdHJ1Y3QgbWx4NWVfcnhfd3FlICp3cWUsIHUxNiBpeCk7CitpbnQgbWx4NWVfYWxsb2NfcnhfbXB3cWUoc3RydWN0IG1seDVlX3JxICpycSwgc3RydWN0IG1seDVlX3J4X3dxZSAqd3FlLAl1MTYgaXgpOwogdm9pZCBtbHg1ZV9kZWFsbG9jX3J4X3dxZShzdHJ1Y3QgbWx4NWVfcnEgKnJxLCB1MTYgaXgpOwogdm9pZCBtbHg1ZV9kZWFsbG9jX3J4X21wd3FlKHN0cnVjdCBtbHg1ZV9ycSAqcnEsIHUxNiBpeCk7Ci12b2lkIG1seDVlX3Bvc3RfcnhfZnJhZ21lbnRlZF9tcHdxZShzdHJ1Y3QgbWx4NWVfcnEgKnJxKTsKLXZvaWQgbWx4NWVfY29tcGxldGVfcnhfbGluZWFyX21wd3FlKHN0cnVjdCBtbHg1ZV9ycSAqcnEsCi0JCQkJICAgIHN0cnVjdCBtbHg1X2NxZTY0ICpjcWUsCi0JCQkJICAgIHUxNiBieXRlX2NudCwKLQkJCQkgICAgc3RydWN0IG1seDVlX21wd19pbmZvICp3aSwKLQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci12b2lkIG1seDVlX2NvbXBsZXRlX3J4X2ZyYWdtZW50ZWRfbXB3cWUoc3RydWN0IG1seDVlX3JxICpycSwKLQkJCQkJc3RydWN0IG1seDVfY3FlNjQgKmNxZSwKLQkJCQkJdTE2IGJ5dGVfY250LAotCQkJCQlzdHJ1Y3QgbWx4NWVfbXB3X2luZm8gKndpLAotCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLXZvaWQgbWx4NWVfZnJlZV9yeF9saW5lYXJfbXB3cWUoc3RydWN0IG1seDVlX3JxICpycSwKLQkJCQlzdHJ1Y3QgbWx4NWVfbXB3X2luZm8gKndpKTsKLXZvaWQgbWx4NWVfZnJlZV9yeF9mcmFnbWVudGVkX21wd3FlKHN0cnVjdCBtbHg1ZV9ycSAqcnEsCi0JCQkJICAgIHN0cnVjdCBtbHg1ZV9tcHdfaW5mbyAqd2kpOwordm9pZCBtbHg1ZV9wb3N0X3J4X21wd3FlKHN0cnVjdCBtbHg1ZV9ycSAqcnEpOwordm9pZCBtbHg1ZV9mcmVlX3J4X21wd3FlKHN0cnVjdCBtbHg1ZV9ycSAqcnEsIHN0cnVjdCBtbHg1ZV9tcHdfaW5mbyAqd2kpOwogc3RydWN0IG1seDVfY3FlNjQgKm1seDVlX2dldF9jcWUoc3RydWN0IG1seDVlX2NxICpjcSk7CiAKIHZvaWQgbWx4NWVfcnhfYW0oc3RydWN0IG1seDVlX3JxICpycSk7CkBAIC04MDgsMTcgKzgwNSwxOCBAQAogCW1seDVfY3FfYXJtKG1jcSwgTUxYNV9DUV9EQl9SRVFfTk9ULCBtY3EtPnVhci0+bWFwLCBOVUxMLCBjcS0+d3EuY2MpOwogfQogCitzdGF0aWMgaW5saW5lIHUzMiBtbHg1ZV9nZXRfd3FlX210dF9vZmZzZXQoc3RydWN0IG1seDVlX3JxICpycSwgdTE2IHdxZV9peCkKK3sKKwlyZXR1cm4gcnEtPm1wd3FlLm10dF9vZmZzZXQgKworCQl3cWVfaXggKiBBTElHTihNTFg1X01QV1JRX1BBR0VTX1BFUl9XUUUsIDgpOworfQorCiBzdGF0aWMgaW5saW5lIGludCBtbHg1ZV9nZXRfbWF4X251bV9jaGFubmVscyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldikKIHsKIAlyZXR1cm4gbWluX3QoaW50LCBtZGV2LT5wcml2LmVxX3RhYmxlLm51bV9jb21wX3ZlY3RvcnMsCiAJCSAgICAgTUxYNUVfTUFYX05VTV9DSEFOTkVMUyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IG1seDVlX2dldF9tdHRfb2N0dyhpbnQgbnBhZ2VzKQotewotCXJldHVybiBBTElHTihucGFnZXMsIDgpIC8gMjsKLX0KLQogZXh0ZXJuIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBtbHg1ZV9ldGh0b29sX29wczsKICNpZmRlZiBDT05GSUdfTUxYNV9DT1JFX0VOX0RDQgogZXh0ZXJuIGNvbnN0IHN0cnVjdCBkY2JubF9ydG5sX29wcyBtbHg1ZV9kY2JubF9vcHM7CkBAIC04NzEsNiArODY5LDcgQEAKIGludCBtbHg1ZV9hZGRfc3FzX2Z3ZF9ydWxlcyhzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdik7CiB2b2lkIG1seDVlX3JlbW92ZV9zcXNfZndkX3J1bGVzKHN0cnVjdCBtbHg1ZV9wcml2ICpwcml2KTsKIGludCBtbHg1ZV9hdHRyX2dldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc3dpdGNoZGV2X2F0dHIgKmF0dHIpOwordm9pZCBtbHg1ZV9oYW5kbGVfcnhfY3FlX3JlcChzdHJ1Y3QgbWx4NWVfcnEgKnJxLCBzdHJ1Y3QgbWx4NV9jcWU2NCAqY3FlKTsKIAogaW50IG1seDVlX2NyZWF0ZV9kaXJlY3RfcnF0cyhzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdik7CiB2b2lkIG1seDVlX2Rlc3Ryb3lfcnF0KHN0cnVjdCBtbHg1ZV9wcml2ICpwcml2LCBzdHJ1Y3QgbWx4NWVfcnF0ICpycXQpOwpAQCAtODgxLDkgKzg4MCwxMiBAQAogaW50IG1seDVlX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwogaW50IG1seDVlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CiB2b2lkIG1seDVlX3VwZGF0ZV9zdGF0c193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci12b2lkICptbHg1ZV9jcmVhdGVfbmV0ZGV2KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LAotCQkJICBjb25zdCBzdHJ1Y3QgbWx4NWVfcHJvZmlsZSAqcHJvZmlsZSwgdm9pZCAqcHByaXYpOworc3RydWN0IG5ldF9kZXZpY2UgKm1seDVlX2NyZWF0ZV9uZXRkZXYoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBtbHg1ZV9wcm9maWxlICpwcm9maWxlLAorCQkJCSAgICAgICB2b2lkICpwcHJpdik7CiB2b2lkIG1seDVlX2Rlc3Ryb3lfbmV0ZGV2KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LCBzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdik7CitpbnQgbWx4NWVfYXR0YWNoX25ldGRldihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7Cit2b2lkIG1seDVlX2RldGFjaF9uZXRkZXYoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwogc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICoKIG1seDVlX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX2Nsb2NrLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fY2xvY2suYwppbmRleCA4NDdhOGYzLi4xM2RjMzg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fY2xvY2suYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fY2xvY2suYwpAQCAtMjczLDcgKzI3Myw3IEBACiAKIAl0c3RhbXAtPnB0cCA9IHB0cF9jbG9ja19yZWdpc3RlcigmdHN0YW1wLT5wdHBfaW5mbywKIAkJCQkJICZwcml2LT5tZGV2LT5wZGV2LT5kZXYpOwotCWlmIChJU19FUlJfT1JfTlVMTCh0c3RhbXAtPnB0cCkpIHsKKwlpZiAoSVNfRVJSKHRzdGFtcC0+cHRwKSkgewogCQltbHg1X2NvcmVfd2Fybihwcml2LT5tZGV2LCAicHRwX2Nsb2NrX3JlZ2lzdGVyIGZhaWxlZCAlbGRcbiIsCiAJCQkgICAgICAgUFRSX0VSUih0c3RhbXAtPnB0cCkpOwogCQl0c3RhbXAtPnB0cCA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fY29tbW9uLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fY29tbW9uLmMKaW5kZXggNjczMDQzYy4uMDI5ZTg1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9jb21tb24uYwpAQCAtNjAsMjQgKzYwLDI3IEBACiBzdGF0aWMgaW50IG1seDVlX2NyZWF0ZV9ta2V5KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LCB1MzIgcGRuLAogCQkJICAgICBzdHJ1Y3QgbWx4NV9jb3JlX21rZXkgKm1rZXkpCiB7Ci0Jc3RydWN0IG1seDVfY3JlYXRlX21rZXlfbWJveF9pbiAqaW47CisJaW50IGlubGVuID0gTUxYNV9TVF9TWl9CWVRFUyhjcmVhdGVfbWtleV9pbik7CisJdm9pZCAqbWtjOworCXUzMiAqaW47CiAJaW50IGVycjsKIAotCWluID0gbWx4NV92emFsbG9jKHNpemVvZigqaW4pKTsKKwlpbiA9IG1seDVfdnphbGxvYyhpbmxlbik7CiAJaWYgKCFpbikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpbi0+c2VnLmZsYWdzID0gTUxYNV9QRVJNX0xPQ0FMX1dSSVRFIHwKLQkJCU1MWDVfUEVSTV9MT0NBTF9SRUFEICB8Ci0JCQlNTFg1X0FDQ0VTU19NT0RFX1BBOwotCWluLT5zZWcuZmxhZ3NfcGQgPSBjcHVfdG9fYmUzMihwZG4gfCBNTFg1X01LRVlfTEVONjQpOwotCWluLT5zZWcucXBuX21rZXk3XzAgPSBjcHVfdG9fYmUzMigweGZmZmZmZiA8PCA4KTsKKwlta2MgPSBNTFg1X0FERFJfT0YoY3JlYXRlX21rZXlfaW4sIGluLCBtZW1vcnlfa2V5X21rZXlfZW50cnkpOworCU1MWDVfU0VUKG1rYywgbWtjLCBhY2Nlc3NfbW9kZSwgTUxYNV9NS0NfQUNDRVNTX01PREVfUEEpOworCU1MWDVfU0VUKG1rYywgbWtjLCBsdywgMSk7CisJTUxYNV9TRVQobWtjLCBta2MsIGxyLCAxKTsKIAotCWVyciA9IG1seDVfY29yZV9jcmVhdGVfbWtleShtZGV2LCBta2V5LCBpbiwgc2l6ZW9mKCppbiksIE5VTEwsIE5VTEwsCi0JCQkJICAgIE5VTEwpOworCU1MWDVfU0VUKG1rYywgbWtjLCBwZCwgcGRuKTsKKwlNTFg1X1NFVChta2MsIG1rYywgbGVuZ3RoNjQsIDEpOworCU1MWDVfU0VUKG1rYywgbWtjLCBxcG4sIDB4ZmZmZmZmKTsKKworCWVyciA9IG1seDVfY29yZV9jcmVhdGVfbWtleShtZGV2LCBta2V5LCBpbiwgaW5sZW4pOwogCiAJa3ZmcmVlKGluKTsKLQogCXJldHVybiBlcnI7CiB9CiAKQEAgLTEzOSw3ICsxNDIsNyBAQAogCXN0cnVjdCBtbHg1ZV90aXIgKnRpcjsKIAl2b2lkICppbjsKIAlpbnQgaW5sZW47Ci0JaW50IGVycjsKKwlpbnQgZXJyID0gMDsKIAogCWlubGVuID0gTUxYNV9TVF9TWl9CWVRFUyhtb2RpZnlfdGlyX2luKTsKIAlpbiA9IG1seDVfdnphbGxvYyhpbmxlbik7CkBAIC0xNTEsMTAgKzE1NCwxMSBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkodGlyLCAmbWRldi0+bWx4NWVfcmVzLnRkLnRpcnNfbGlzdCwgbGlzdCkgewogCQllcnIgPSBtbHg1X2NvcmVfbW9kaWZ5X3RpcihtZGV2LCB0aXItPnRpcm4sIGluLCBpbmxlbik7CiAJCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOworCQkJZ290byBvdXQ7CiAJfQogCitvdXQ6CiAJa3ZmcmVlKGluKTsKIAotCXJldHVybiAwOworCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fZGNibmwuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9kY2JubC5jCmluZGV4IGNhYTlhM2MuLjc2MmFmMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9kY2JubC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9kY2JubC5jCkBAIC0xMjcsMjkgKzEyNyw0MCBAQAogCXJldHVybiBtbHg1X3NldF9wb3J0X3RjX2J3X2FsbG9jKG1kZXYsIHRjX3R4X2J3KTsKIH0KIAotc3RhdGljIGludCBtbHg1ZV9kYmNubF92YWxpZGF0ZV9ldHMoc3RydWN0IGllZWVfZXRzICpldHMpCitzdGF0aWMgaW50IG1seDVlX2RiY25sX3ZhbGlkYXRlX2V0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJCSAgICBzdHJ1Y3QgaWVlZV9ldHMgKmV0cykKIHsKIAlpbnQgYndfc3VtID0gMDsKIAlpbnQgaTsKIAogCS8qIFZhbGlkYXRlIFByaW9yaXR5ICovCiAJZm9yIChpID0gMDsgaSA8IElFRUVfODAyMVFBWl9NQVhfVENTOyBpKyspIHsKLQkJaWYgKGV0cy0+cHJpb190Y1tpXSA+PSBNTFg1RV9NQVhfUFJJT1JJVFkpCisJCWlmIChldHMtPnByaW9fdGNbaV0gPj0gTUxYNUVfTUFYX1BSSU9SSVRZKSB7CisJCQluZXRkZXZfZXJyKG5ldGRldiwKKwkJCQkgICAiRmFpbGVkIHRvIHZhbGlkYXRlIEVUUzogcHJpb3JpdHkgdmFsdWUgZ3JlYXRlciB0aGFuIG1heCglZClcbiIsCisJCQkJICAgIE1MWDVFX01BWF9QUklPUklUWSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCX0KIAogCS8qIFZhbGlkYXRlIEJhbmR3aWR0aCBTdW0gKi8KIAlmb3IgKGkgPSAwOyBpIDwgSUVFRV84MDIxUUFaX01BWF9UQ1M7IGkrKykgewogCQlpZiAoZXRzLT50Y190c2FbaV0gPT0gSUVFRV84MDIxUUFaX1RTQV9FVFMpIHsKLQkJCWlmICghZXRzLT50Y190eF9id1tpXSkKKwkJCWlmICghZXRzLT50Y190eF9id1tpXSkgeworCQkJCW5ldGRldl9lcnIobmV0ZGV2LAorCQkJCQkgICAiRmFpbGVkIHRvIHZhbGlkYXRlIEVUUzogQlcgMCBpcyBpbGxlZ2FsXG4iKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KIAogCQkJYndfc3VtICs9IGV0cy0+dGNfdHhfYndbaV07CiAJCX0KIAl9CiAKLQlpZiAoYndfc3VtICE9IDAgJiYgYndfc3VtICE9IDEwMCkKKwlpZiAoYndfc3VtICE9IDAgJiYgYndfc3VtICE9IDEwMCkgeworCQluZXRkZXZfZXJyKG5ldGRldiwKKwkJCSAgICJGYWlsZWQgdG8gdmFsaWRhdGUgRVRTOiBCVyBzdW0gaXMgaWxsZWdhbFxuIik7CiAJCXJldHVybiAtRUlOVkFMOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU5LDcgKzE3MCw3IEBACiAJc3RydWN0IG1seDVlX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCWludCBlcnI7CiAKLQllcnIgPSBtbHg1ZV9kYmNubF92YWxpZGF0ZV9ldHMoZXRzKTsKKwllcnIgPSBtbHg1ZV9kYmNubF92YWxpZGF0ZV9ldHMobmV0ZGV2LCBldHMpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fZXRodG9vbC5jCmluZGV4IDRhMzc1N2UuLjI3ZmY0MDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX2V0aHRvb2wuYwpAQCAtMzMxLDcgKzMzMSw3IEBACiAJaWYgKG1seDVlX3F1ZXJ5X2dsb2JhbF9wYXVzZV9jb21iaW5lZChwcml2KSkgewogCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1BQT1JUX1BFUl9QUklPX1BGQ19DT1VOVEVSUzsgaSsrKSB7CiAJCQlkYXRhW2lkeCsrXSA9IE1MWDVFX1JFQURfQ1RSNjRfQkUoJnByaXYtPnN0YXRzLnBwb3J0LnBlcl9wcmlvX2NvdW50ZXJzWzBdLAotCQkJCQkJCSAgcHBvcnRfcGVyX3ByaW9fcGZjX3N0YXRzX2Rlc2MsIDApOworCQkJCQkJCSAgcHBvcnRfcGVyX3ByaW9fcGZjX3N0YXRzX2Rlc2MsIGkpOwogCQl9CiAJfQogCkBAIC0zNTIsMTUgKzM1Miw2MSBAQAogCQkJCQkJCQkgICBzcV9zdGF0c19kZXNjLCBqKTsKIH0KIAorc3RhdGljIHUzMiBtbHg1ZV9yeF93cWVzX3RvX3BhY2tldHMoc3RydWN0IG1seDVlX3ByaXYgKnByaXYsIGludCBycV93cV90eXBlLAorCQkJCSAgICBpbnQgbnVtX3dxZSkKK3sKKwlpbnQgcGFja2V0c19wZXJfd3FlOworCWludCBzdHJpZGVfc2l6ZTsKKwlpbnQgbnVtX3N0cmlkZXM7CisJaW50IHdxZV9zaXplOworCisJaWYgKHJxX3dxX3R5cGUgIT0gTUxYNV9XUV9UWVBFX0xJTktFRF9MSVNUX1NUUklESU5HX1JRKQorCQlyZXR1cm4gbnVtX3dxZTsKKworCXN0cmlkZV9zaXplID0gMSA8PCBwcml2LT5wYXJhbXMubXB3cWVfbG9nX3N0cmlkZV9zejsKKwludW1fc3RyaWRlcyA9IDEgPDwgcHJpdi0+cGFyYW1zLm1wd3FlX2xvZ19udW1fc3RyaWRlczsKKwl3cWVfc2l6ZSA9IHN0cmlkZV9zaXplICogbnVtX3N0cmlkZXM7CisKKwlwYWNrZXRzX3Blcl93cWUgPSB3cWVfc2l6ZSAvCisJCQkgIEFMSUdOKEVUSF9EQVRBX0xFTiwgc3RyaWRlX3NpemUpOworCXJldHVybiAoMSA8PCAob3JkZXJfYmFzZV8yKG51bV93cWUgKiBwYWNrZXRzX3Blcl93cWUpIC0gMSkpOworfQorCitzdGF0aWMgdTMyIG1seDVlX3BhY2tldHNfdG9fcnhfd3FlcyhzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdiwgaW50IHJxX3dxX3R5cGUsCisJCQkJICAgIGludCBudW1fcGFja2V0cykKK3sKKwlpbnQgcGFja2V0c19wZXJfd3FlOworCWludCBzdHJpZGVfc2l6ZTsKKwlpbnQgbnVtX3N0cmlkZXM7CisJaW50IHdxZV9zaXplOworCWludCBudW1fd3FlczsKKworCWlmIChycV93cV90eXBlICE9IE1MWDVfV1FfVFlQRV9MSU5LRURfTElTVF9TVFJJRElOR19SUSkKKwkJcmV0dXJuIG51bV9wYWNrZXRzOworCisJc3RyaWRlX3NpemUgPSAxIDw8IHByaXYtPnBhcmFtcy5tcHdxZV9sb2dfc3RyaWRlX3N6OworCW51bV9zdHJpZGVzID0gMSA8PCBwcml2LT5wYXJhbXMubXB3cWVfbG9nX251bV9zdHJpZGVzOworCXdxZV9zaXplID0gc3RyaWRlX3NpemUgKiBudW1fc3RyaWRlczsKKworCW51bV9wYWNrZXRzID0gKDEgPDwgb3JkZXJfYmFzZV8yKG51bV9wYWNrZXRzKSk7CisKKwlwYWNrZXRzX3Blcl93cWUgPSB3cWVfc2l6ZSAvCisJCQkgIEFMSUdOKEVUSF9EQVRBX0xFTiwgc3RyaWRlX3NpemUpOworCW51bV93cWVzID0gRElWX1JPVU5EX1VQKG51bV9wYWNrZXRzLCBwYWNrZXRzX3Blcl93cWUpOworCXJldHVybiAxIDw8IChvcmRlcl9iYXNlXzIobnVtX3dxZXMpKTsKK30KKwogc3RhdGljIHZvaWQgbWx4NWVfZ2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCXN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcGFyYW0pCiB7CiAJc3RydWN0IG1seDVlX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBycV93cV90eXBlID0gcHJpdi0+cGFyYW1zLnJxX3dxX3R5cGU7CiAKLQlwYXJhbS0+cnhfbWF4X3BlbmRpbmcgPSAxIDw8IG1seDVfbWF4X2xvZ19ycV9zaXplKHJxX3dxX3R5cGUpOworCXBhcmFtLT5yeF9tYXhfcGVuZGluZyA9IG1seDVlX3J4X3dxZXNfdG9fcGFja2V0cyhwcml2LCBycV93cV90eXBlLAorCQkJCQkJCSAxIDw8IG1seDVfbWF4X2xvZ19ycV9zaXplKHJxX3dxX3R5cGUpKTsKIAlwYXJhbS0+dHhfbWF4X3BlbmRpbmcgPSAxIDw8IE1MWDVFX1BBUkFNU19NQVhJTVVNX0xPR19TUV9TSVpFOwotCXBhcmFtLT5yeF9wZW5kaW5nICAgICA9IDEgPDwgcHJpdi0+cGFyYW1zLmxvZ19ycV9zaXplOworCXBhcmFtLT5yeF9wZW5kaW5nID0gbWx4NWVfcnhfd3Flc190b19wYWNrZXRzKHByaXYsIHJxX3dxX3R5cGUsCisJCQkJCQkgICAgIDEgPDwgcHJpdi0+cGFyYW1zLmxvZ19ycV9zaXplKTsKIAlwYXJhbS0+dHhfcGVuZGluZyAgICAgPSAxIDw8IHByaXYtPnBhcmFtcy5sb2dfc3Ffc2l6ZTsKIH0KIApAQCAtMzcwLDkgKzQxNiwxMyBAQAogCXN0cnVjdCBtbHg1ZV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlib29sIHdhc19vcGVuZWQ7CiAJaW50IHJxX3dxX3R5cGUgPSBwcml2LT5wYXJhbXMucnFfd3FfdHlwZTsKKwl1MzIgcnhfcGVuZGluZ193cWVzOworCXUzMiBtaW5fcnFfc2l6ZTsKKwl1MzIgbWF4X3JxX3NpemU7CiAJdTE2IG1pbl9yeF93cWVzOwogCXU4IGxvZ19ycV9zaXplOwogCXU4IGxvZ19zcV9zaXplOworCXUzMiBudW1fbXR0czsKIAlpbnQgZXJyID0gMDsKIAogCWlmIChwYXJhbS0+cnhfanVtYm9fcGVuZGluZykgewpAQCAtMzg1LDE4ICs0MzUsMzYgQEAKIAkJCSAgICBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAocGFyYW0tPnJ4X3BlbmRpbmcgPCAoMSA8PCBtbHg1X21pbl9sb2dfcnFfc2l6ZShycV93cV90eXBlKSkpIHsKKworCW1pbl9ycV9zaXplID0gbWx4NWVfcnhfd3Flc190b19wYWNrZXRzKHByaXYsIHJxX3dxX3R5cGUsCisJCQkJCSAgICAgICAxIDw8IG1seDVfbWluX2xvZ19ycV9zaXplKHJxX3dxX3R5cGUpKTsKKwltYXhfcnFfc2l6ZSA9IG1seDVlX3J4X3dxZXNfdG9fcGFja2V0cyhwcml2LCBycV93cV90eXBlLAorCQkJCQkgICAgICAgMSA8PCBtbHg1X21heF9sb2dfcnFfc2l6ZShycV93cV90eXBlKSk7CisJcnhfcGVuZGluZ193cWVzID0gbWx4NWVfcGFja2V0c190b19yeF93cWVzKHByaXYsIHJxX3dxX3R5cGUsCisJCQkJCQkgICBwYXJhbS0+cnhfcGVuZGluZyk7CisKKwlpZiAocGFyYW0tPnJ4X3BlbmRpbmcgPCBtaW5fcnFfc2l6ZSkgewogCQluZXRkZXZfaW5mbyhkZXYsICIlczogcnhfcGVuZGluZyAoJWQpIDwgbWluICglZClcbiIsCiAJCQkgICAgX19mdW5jX18sIHBhcmFtLT5yeF9wZW5kaW5nLAotCQkJICAgIDEgPDwgbWx4NV9taW5fbG9nX3JxX3NpemUocnFfd3FfdHlwZSkpOworCQkJICAgIG1pbl9ycV9zaXplKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWlmIChwYXJhbS0+cnhfcGVuZGluZyA+ICgxIDw8IG1seDVfbWF4X2xvZ19ycV9zaXplKHJxX3dxX3R5cGUpKSkgeworCWlmIChwYXJhbS0+cnhfcGVuZGluZyA+IG1heF9ycV9zaXplKSB7CiAJCW5ldGRldl9pbmZvKGRldiwgIiVzOiByeF9wZW5kaW5nICglZCkgPiBtYXggKCVkKVxuIiwKIAkJCSAgICBfX2Z1bmNfXywgcGFyYW0tPnJ4X3BlbmRpbmcsCi0JCQkgICAgMSA8PCBtbHg1X21heF9sb2dfcnFfc2l6ZShycV93cV90eXBlKSk7CisJCQkgICAgbWF4X3JxX3NpemUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisKKwludW1fbXR0cyA9IE1MWDVFX1JFUVVJUkVEX01UVFMocHJpdi0+cGFyYW1zLm51bV9jaGFubmVscywKKwkJCQkgICAgICAgcnhfcGVuZGluZ193cWVzKTsKKwlpZiAocHJpdi0+cGFyYW1zLnJxX3dxX3R5cGUgPT0gTUxYNV9XUV9UWVBFX0xJTktFRF9MSVNUX1NUUklESU5HX1JRICYmCisJICAgICFNTFg1RV9WQUxJRF9OVU1fTVRUUyhudW1fbXR0cykpIHsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiJXM6IHJ4X3BlbmRpbmcgKCVkKSByZXF1ZXN0IGNhbid0IGJlIHNhdGlzZmllZCwgdHJ5IHRvIHJlZHVjZS5cbiIsCisJCQkgICAgX19mdW5jX18sIHBhcmFtLT5yeF9wZW5kaW5nKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJaWYgKHBhcmFtLT50eF9wZW5kaW5nIDwgKDEgPDwgTUxYNUVfUEFSQU1TX01JTklNVU1fTE9HX1NRX1NJWkUpKSB7CiAJCW5ldGRldl9pbmZvKGRldiwgIiVzOiB0eF9wZW5kaW5nICglZCkgPCBtaW4gKCVkKVxuIiwKIAkJCSAgICBfX2Z1bmNfXywgcGFyYW0tPnR4X3BlbmRpbmcsCkBAIC00MTAsOSArNDc4LDkgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbG9nX3JxX3NpemUgPSBvcmRlcl9iYXNlXzIocGFyYW0tPnJ4X3BlbmRpbmcpOworCWxvZ19ycV9zaXplID0gb3JkZXJfYmFzZV8yKHJ4X3BlbmRpbmdfd3Flcyk7CiAJbG9nX3NxX3NpemUgPSBvcmRlcl9iYXNlXzIocGFyYW0tPnR4X3BlbmRpbmcpOwotCW1pbl9yeF93cWVzID0gbWx4NV9taW5fcnhfd3FlcyhycV93cV90eXBlLCBwYXJhbS0+cnhfcGVuZGluZyk7CisJbWluX3J4X3dxZXMgPSBtbHg1X21pbl9yeF93cWVzKHJxX3dxX3R5cGUsIHJ4X3BlbmRpbmdfd3Flcyk7CiAKIAlpZiAobG9nX3JxX3NpemUgPT0gcHJpdi0+cGFyYW1zLmxvZ19ycV9zaXplICYmCiAJICAgIGxvZ19zcV9zaXplID09IHByaXYtPnBhcmFtcy5sb2dfc3Ffc2l6ZSAmJgpAQCAtNDU0LDYgKzUyMiw3IEBACiAJdW5zaWduZWQgaW50IGNvdW50ID0gY2gtPmNvbWJpbmVkX2NvdW50OwogCWJvb2wgYXJmc19lbmFibGVkOwogCWJvb2wgd2FzX29wZW5lZDsKKwl1MzIgbnVtX210dHM7CiAJaW50IGVyciA9IDA7CiAKIAlpZiAoIWNvdW50KSB7CkBAIC00NzIsNiArNTQxLDE0IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCW51bV9tdHRzID0gTUxYNUVfUkVRVUlSRURfTVRUUyhjb3VudCwgQklUKHByaXYtPnBhcmFtcy5sb2dfcnFfc2l6ZSkpOworCWlmIChwcml2LT5wYXJhbXMucnFfd3FfdHlwZSA9PSBNTFg1X1dRX1RZUEVfTElOS0VEX0xJU1RfU1RSSURJTkdfUlEgJiYKKwkgICAgIU1MWDVFX1ZBTElEX05VTV9NVFRTKG51bV9tdHRzKSkgeworCQluZXRkZXZfaW5mbyhkZXYsICIlczogcnggY291bnQgKCVkKSByZXF1ZXN0IGNhbid0IGJlIHNhdGlzZmllZCwgdHJ5IHRvIHJlZHVjZS5cbiIsCisJCQkgICAgX19mdW5jX18sIGNvdW50KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJaWYgKHByaXYtPnBhcmFtcy5udW1fY2hhbm5lbHMgPT0gY291bnQpCiAJCXJldHVybiAwOwogCkBAIC01ODIsOSArNjU5LDEwIEBACiBzdGF0aWMgdm9pZCBwdHlzMmV0aHRvb2xfc3VwcG9ydGVkX2xpbmsodW5zaWduZWQgbG9uZyAqc3VwcG9ydGVkX21vZGVzLAogCQkJCQl1MzIgZXRoX3Byb3RvX2NhcCkKIHsKKwl1bnNpZ25lZCBsb25nIHByb3RvX2NhcCA9IGV0aF9wcm90b19jYXA7CiAJaW50IHByb3RvOwogCi0JZm9yX2VhY2hfc2V0X2JpdChwcm90bywgKHVuc2lnbmVkIGxvbmcgKikmZXRoX3Byb3RvX2NhcCwgTUxYNUVfTElOS19NT0RFU19OVU1CRVIpCisJZm9yX2VhY2hfc2V0X2JpdChwcm90bywgJnByb3RvX2NhcCwgTUxYNUVfTElOS19NT0RFU19OVU1CRVIpCiAJCWJpdG1hcF9vcihzdXBwb3J0ZWRfbW9kZXMsIHN1cHBvcnRlZF9tb2RlcywKIAkJCSAgcHR5czJldGh0b29sX3RhYmxlW3Byb3RvXS5zdXBwb3J0ZWQsCiAJCQkgIF9fRVRIVE9PTF9MSU5LX01PREVfTUFTS19OQklUUyk7CkBAIC01OTMsOSArNjcxLDEwIEBACiBzdGF0aWMgdm9pZCBwdHlzMmV0aHRvb2xfYWR2ZXJfbGluayh1bnNpZ25lZCBsb25nICphZHZlcnRpc2luZ19tb2RlcywKIAkJCQkgICAgdTMyIGV0aF9wcm90b19jYXApCiB7CisJdW5zaWduZWQgbG9uZyBwcm90b19jYXAgPSBldGhfcHJvdG9fY2FwOwogCWludCBwcm90bzsKIAotCWZvcl9lYWNoX3NldF9iaXQocHJvdG8sICh1bnNpZ25lZCBsb25nICopJmV0aF9wcm90b19jYXAsIE1MWDVFX0xJTktfTU9ERVNfTlVNQkVSKQorCWZvcl9lYWNoX3NldF9iaXQocHJvdG8sICZwcm90b19jYXAsIE1MWDVFX0xJTktfTU9ERVNfTlVNQkVSKQogCQliaXRtYXBfb3IoYWR2ZXJ0aXNpbmdfbW9kZXMsIGFkdmVydGlzaW5nX21vZGVzLAogCQkJICBwdHlzMmV0aHRvb2xfdGFibGVbcHJvdG9dLmFkdmVydGlzZWQsCiAJCQkgIF9fRVRIVE9PTF9MSU5LX01PREVfTUFTS19OQklUUyk7CkBAIC03MjYsNyArODA1LDcgQEAKIHsKIAlzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdiAgICA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYgPSBwcml2LT5tZGV2OwotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhwdHlzX3JlZyldOworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhwdHlzX3JlZyldID0gezB9OwogCXUzMiBldGhfcHJvdG9fY2FwOwogCXUzMiBldGhfcHJvdG9fYWRtaW47CiAJdTMyIGV0aF9wcm90b19scDsKQEAgLTczNiw3ICs4MTUsNiBAQAogCWludCBlcnI7CiAKIAllcnIgPSBtbHg1X3F1ZXJ5X3BvcnRfcHR5cyhtZGV2LCBvdXQsIHNpemVvZihvdXQpLCBNTFg1X1BUWVNfRU4sIDEpOwotCiAJaWYgKGVycikgewogCQluZXRkZXZfZXJyKG5ldGRldiwgIiVzOiBxdWVyeSBwb3J0IHB0eXMgZmFpbGVkOiAlZFxuIiwKIAkJCSAgIF9fZnVuY19fLCBlcnIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX2ZzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fZnMuYwppbmRleCAxNTg3YTlmLi4zNmZiYzZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fZnMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fZnMuYwpAQCAtMjk0LDYgKzI5NCwzNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBtbHg1ZV9hZGRfdmxhbl9ydWxlcyhzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdikKK3sKKwlpbnQgaTsKKworCW1seDVlX2FkZF92bGFuX3J1bGUocHJpdiwgTUxYNUVfVkxBTl9SVUxFX1RZUEVfVU5UQUdHRUQsIDApOworCisJZm9yX2VhY2hfc2V0X2JpdChpLCBwcml2LT5mcy52bGFuLmFjdGl2ZV92bGFucywgVkxBTl9OX1ZJRCkgeworCQltbHg1ZV9hZGRfdmxhbl9ydWxlKHByaXYsIE1MWDVFX1ZMQU5fUlVMRV9UWVBFX01BVENIX1ZJRCwgaSk7CisJfQorCisJaWYgKHByaXYtPmZzLnZsYW4uZmlsdGVyX2Rpc2FibGVkICYmCisJICAgICEocHJpdi0+bmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSkKKwkJbWx4NWVfYWRkX3ZsYW5fcnVsZShwcml2LCBNTFg1RV9WTEFOX1JVTEVfVFlQRV9BTllfVklELCAwKTsKK30KKworc3RhdGljIHZvaWQgbWx4NWVfZGVsX3ZsYW5fcnVsZXMoc3RydWN0IG1seDVlX3ByaXYgKnByaXYpCit7CisJaW50IGk7CisKKwltbHg1ZV9kZWxfdmxhbl9ydWxlKHByaXYsIE1MWDVFX1ZMQU5fUlVMRV9UWVBFX1VOVEFHR0VELCAwKTsKKworCWZvcl9lYWNoX3NldF9iaXQoaSwgcHJpdi0+ZnMudmxhbi5hY3RpdmVfdmxhbnMsIFZMQU5fTl9WSUQpIHsKKwkJbWx4NWVfZGVsX3ZsYW5fcnVsZShwcml2LCBNTFg1RV9WTEFOX1JVTEVfVFlQRV9NQVRDSF9WSUQsIGkpOworCX0KKworCWlmIChwcml2LT5mcy52bGFuLmZpbHRlcl9kaXNhYmxlZCAmJgorCSAgICAhKHByaXYtPm5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykpCisJCW1seDVlX2RlbF92bGFuX3J1bGUocHJpdiwgTUxYNUVfVkxBTl9SVUxFX1RZUEVfQU5ZX1ZJRCwgMCk7Cit9CisKICNkZWZpbmUgbWx4NWVfZm9yX2VhY2hfaGFzaF9ub2RlKGhuLCB0bXAsIGhhc2gsIGkpIFwKIAlmb3IgKGkgPSAwOyBpIDwgTUxYNUVfTDJfQUREUl9IQVNIX1NJWkU7IGkrKykgXAogCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhuLCB0bXAsICZoYXNoW2ldLCBobGlzdCkKQEAgLTEwMjQsMTQgKzEwNTQsMTAgQEAKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9mcmVlX2c7CiAKLQllcnIgPSBtbHg1ZV9hZGRfdmxhbl9ydWxlKHByaXYsIE1MWDVFX1ZMQU5fUlVMRV9UWVBFX1VOVEFHR0VELCAwKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9kZXN0cm95X3ZsYW5fZmxvd19ncm91cHM7CisJbWx4NWVfYWRkX3ZsYW5fcnVsZXMocHJpdik7CiAKIAlyZXR1cm4gMDsKIAotZXJyX2Rlc3Ryb3lfdmxhbl9mbG93X2dyb3VwczoKLQltbHg1ZV9kZXN0cm95X2dyb3VwcyhmdCk7CiBlcnJfZnJlZV9nOgogCWtmcmVlKGZ0LT5nKTsKIGVycl9kZXN0cm95X3ZsYW5fdGFibGU6CkBAIC0xMDQzLDYgKzEwNjksNyBAQAogCiBzdGF0aWMgdm9pZCBtbHg1ZV9kZXN0cm95X3ZsYW5fdGFibGUoc3RydWN0IG1seDVlX3ByaXYgKnByaXYpCiB7CisJbWx4NWVfZGVsX3ZsYW5fcnVsZXMocHJpdik7CiAJbWx4NWVfZGVzdHJveV9mbG93X3RhYmxlKCZwcml2LT5mcy52bGFuLmZ0KTsKIH0KIApAQCAtMTEwMCw3ICsxMTI3LDYgQEAKIAogdm9pZCBtbHg1ZV9kZXN0cm95X2Zsb3dfc3RlZXJpbmcoc3RydWN0IG1seDVlX3ByaXYgKnByaXYpCiB7Ci0JbWx4NWVfZGVsX3ZsYW5fcnVsZShwcml2LCBNTFg1RV9WTEFOX1JVTEVfVFlQRV9VTlRBR0dFRCwgMCk7CiAJbWx4NWVfZGVzdHJveV92bGFuX3RhYmxlKHByaXYpOwogCW1seDVlX2Rlc3Ryb3lfbDJfdGFibGUocHJpdik7CiAJbWx4NWVfZGVzdHJveV90dGNfdGFibGUocHJpdik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX21haW4uYwppbmRleCA4NzBiZWEzLi43ZWFmMzgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9tYWluLmMKQEAgLTM0LDE4ICszNCwxMiBAQAogI2luY2x1ZGUgPG5ldC9wa3RfY2xzLmg+CiAjaW5jbHVkZSA8bGludXgvbWx4NS9mcy5oPgogI2luY2x1ZGUgPG5ldC92eGxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2JwZi5oPgogI2luY2x1ZGUgImVuLmgiCiAjaW5jbHVkZSAiZW5fdGMuaCIKICNpbmNsdWRlICJlc3dpdGNoLmgiCiAjaW5jbHVkZSAidnhsYW4uaCIKIAotZW51bSB7Ci0JTUxYNV9FTl9RUF9GTFVTSF9USU1FT1VUX01TCT0gNTAwMCwKLQlNTFg1X0VOX1FQX0ZMVVNIX01TTEVFUF9RVUFOVAk9IDIwLAotCU1MWDVfRU5fUVBfRkxVU0hfTUFYX0lURVIJPSBNTFg1X0VOX1FQX0ZMVVNIX1RJTUVPVVRfTVMgLwotCQkJCQkgIE1MWDVfRU5fUVBfRkxVU0hfTVNMRUVQX1FVQU5ULAotfTsKLQogc3RydWN0IG1seDVlX3JxX3BhcmFtIHsKIAl1MzIJCQlycWNbTUxYNV9TVF9TWl9EVyhycWMpXTsKIAlzdHJ1Y3QgbWx4NV93cV9wYXJhbQl3cTsKQEAgLTU3LDcgKzUxLDcgQEAKIAlzdHJ1Y3QgbWx4NV93cV9wYXJhbSAgICAgICB3cTsKIAl1MTYgICAgICAgICAgICAgICAgICAgICAgICBtYXhfaW5saW5lOwogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9pbmxpbmVfbW9kZTsKLQlib29sICAgICAgICAgICAgICAgICAgICAgICBpY29zcTsKKwllbnVtIG1seDVlX3NxX3R5cGUgICAgICAgICB0eXBlOwogfTsKIAogc3RydWN0IG1seDVlX2NxX3BhcmFtIHsKQEAgLTcwLDEyICs2NCw1NSBAQAogc3RydWN0IG1seDVlX2NoYW5uZWxfcGFyYW0gewogCXN0cnVjdCBtbHg1ZV9ycV9wYXJhbSAgICAgIHJxOwogCXN0cnVjdCBtbHg1ZV9zcV9wYXJhbSAgICAgIHNxOworCXN0cnVjdCBtbHg1ZV9zcV9wYXJhbSAgICAgIHhkcF9zcTsKIAlzdHJ1Y3QgbWx4NWVfc3FfcGFyYW0gICAgICBpY29zcTsKIAlzdHJ1Y3QgbWx4NWVfY3FfcGFyYW0gICAgICByeF9jcTsKIAlzdHJ1Y3QgbWx4NWVfY3FfcGFyYW0gICAgICB0eF9jcTsKIAlzdHJ1Y3QgbWx4NWVfY3FfcGFyYW0gICAgICBpY29zcV9jcTsKIH07CiAKK3N0YXRpYyBib29sIG1seDVlX2NoZWNrX2ZyYWdtZW50ZWRfc3RyaWRpbmdfcnFfY2FwKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2KQoreworCXJldHVybiBNTFg1X0NBUF9HRU4obWRldiwgc3RyaWRpbmdfcnEpICYmCisJCU1MWDVfQ0FQX0dFTihtZGV2LCB1bXJfcHRyX3Jsa3kpICYmCisJCU1MWDVfQ0FQX0VUSChtZGV2LCByZWdfdW1yX3NxKTsKK30KKworc3RhdGljIHZvaWQgbWx4NWVfc2V0X3JxX3R5cGVfcGFyYW1zKHN0cnVjdCBtbHg1ZV9wcml2ICpwcml2LCB1OCBycV90eXBlKQoreworCXByaXYtPnBhcmFtcy5ycV93cV90eXBlID0gcnFfdHlwZTsKKwlzd2l0Y2ggKHByaXYtPnBhcmFtcy5ycV93cV90eXBlKSB7CisJY2FzZSBNTFg1X1dRX1RZUEVfTElOS0VEX0xJU1RfU1RSSURJTkdfUlE6CisJCXByaXYtPnBhcmFtcy5sb2dfcnFfc2l6ZSA9IE1MWDVFX1BBUkFNU19ERUZBVUxUX0xPR19SUV9TSVpFX01QVzsKKwkJcHJpdi0+cGFyYW1zLm1wd3FlX2xvZ19zdHJpZGVfc3ogPSBwcml2LT5wYXJhbXMucnhfY3FlX2NvbXByZXNzID8KKwkJCU1MWDVfTVBXUlFfTE9HX1NUUklERV9TSVpFX0NRRV9DT01QUkVTUyA6CisJCQlNTFg1X01QV1JRX0xPR19TVFJJREVfU0laRTsKKwkJcHJpdi0+cGFyYW1zLm1wd3FlX2xvZ19udW1fc3RyaWRlcyA9IE1MWDVfTVBXUlFfTE9HX1dRRV9TWiAtCisJCQlwcml2LT5wYXJhbXMubXB3cWVfbG9nX3N0cmlkZV9zejsKKwkJYnJlYWs7CisJZGVmYXVsdDogLyogTUxYNV9XUV9UWVBFX0xJTktFRF9MSVNUICovCisJCXByaXYtPnBhcmFtcy5sb2dfcnFfc2l6ZSA9IE1MWDVFX1BBUkFNU19ERUZBVUxUX0xPR19SUV9TSVpFOworCX0KKwlwcml2LT5wYXJhbXMubWluX3J4X3dxZXMgPSBtbHg1X21pbl9yeF93cWVzKHByaXYtPnBhcmFtcy5ycV93cV90eXBlLAorCQkJCQkgICAgICAgQklUKHByaXYtPnBhcmFtcy5sb2dfcnFfc2l6ZSkpOworCisJbWx4NV9jb3JlX2luZm8ocHJpdi0+bWRldiwKKwkJICAgICAgICJNTFg1RTogU3RyZFJxKCVkKSBScVN6KCVsZCkgU3RyZFN6KCVsZCkgUnhDcWVDbXByc3MoJWQpXG4iLAorCQkgICAgICAgcHJpdi0+cGFyYW1zLnJxX3dxX3R5cGUgPT0gTUxYNV9XUV9UWVBFX0xJTktFRF9MSVNUX1NUUklESU5HX1JRLAorCQkgICAgICAgQklUKHByaXYtPnBhcmFtcy5sb2dfcnFfc2l6ZSksCisJCSAgICAgICBCSVQocHJpdi0+cGFyYW1zLm1wd3FlX2xvZ19zdHJpZGVfc3opLAorCQkgICAgICAgcHJpdi0+cGFyYW1zLnJ4X2NxZV9jb21wcmVzc19hZG1pbik7Cit9CisKK3N0YXRpYyB2b2lkIG1seDVlX3NldF9ycV9wcml2X3BhcmFtcyhzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdikKK3sKKwl1OCBycV90eXBlID0gbWx4NWVfY2hlY2tfZnJhZ21lbnRlZF9zdHJpZGluZ19ycV9jYXAocHJpdi0+bWRldikgJiYKKwkJICAgICFwcml2LT54ZHBfcHJvZyA/CisJCSAgICBNTFg1X1dRX1RZUEVfTElOS0VEX0xJU1RfU1RSSURJTkdfUlEgOgorCQkgICAgTUxYNV9XUV9UWVBFX0xJTktFRF9MSVNUOworCW1seDVlX3NldF9ycV90eXBlX3BhcmFtcyhwcml2LCBycV90eXBlKTsKK30KKwogc3RhdGljIHZvaWQgbWx4NWVfdXBkYXRlX2NhcnJpZXIoc3RydWN0IG1seDVlX3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYgPSBwcml2LT5tZGV2OwpAQCAtMTQzLDEyICsxODAsMTggQEAKIAkJcy0+cnhfY3N1bV9ub25lCSs9IHJxX3N0YXRzLT5jc3VtX25vbmU7CiAJCXMtPnJ4X2NzdW1fY29tcGxldGUgKz0gcnFfc3RhdHMtPmNzdW1fY29tcGxldGU7CiAJCXMtPnJ4X2NzdW1fdW5uZWNlc3NhcnlfaW5uZXIgKz0gcnFfc3RhdHMtPmNzdW1fdW5uZWNlc3NhcnlfaW5uZXI7CisJCXMtPnJ4X3hkcF9kcm9wICs9IHJxX3N0YXRzLT54ZHBfZHJvcDsKKwkJcy0+cnhfeGRwX3R4ICs9IHJxX3N0YXRzLT54ZHBfdHg7CisJCXMtPnJ4X3hkcF90eF9mdWxsICs9IHJxX3N0YXRzLT54ZHBfdHhfZnVsbDsKIAkJcy0+cnhfd3FlX2VyciAgICs9IHJxX3N0YXRzLT53cWVfZXJyOwogCQlzLT5yeF9tcHdxZV9maWxsZXIgKz0gcnFfc3RhdHMtPm1wd3FlX2ZpbGxlcjsKLQkJcy0+cnhfbXB3cWVfZnJhZyAgICs9IHJxX3N0YXRzLT5tcHdxZV9mcmFnOwogCQlzLT5yeF9idWZmX2FsbG9jX2VyciArPSBycV9zdGF0cy0+YnVmZl9hbGxvY19lcnI7CiAJCXMtPnJ4X2NxZV9jb21wcmVzc19ibGtzICs9IHJxX3N0YXRzLT5jcWVfY29tcHJlc3NfYmxrczsKIAkJcy0+cnhfY3FlX2NvbXByZXNzX3BrdHMgKz0gcnFfc3RhdHMtPmNxZV9jb21wcmVzc19wa3RzOworCQlzLT5yeF9jYWNoZV9yZXVzZSArPSBycV9zdGF0cy0+Y2FjaGVfcmV1c2U7CisJCXMtPnJ4X2NhY2hlX2Z1bGwgICs9IHJxX3N0YXRzLT5jYWNoZV9mdWxsOworCQlzLT5yeF9jYWNoZV9lbXB0eSArPSBycV9zdGF0cy0+Y2FjaGVfZW1wdHk7CisJCXMtPnJ4X2NhY2hlX2J1c3kgICs9IHJxX3N0YXRzLT5jYWNoZV9idXN5OwogCiAJCWZvciAoaiA9IDA7IGogPCBwcml2LT5wYXJhbXMubnVtX3RjOyBqKyspIHsKIAkJCXNxX3N0YXRzID0gJnByaXYtPmNoYW5uZWxbaV0tPnNxW2pdLnN0YXRzOwpAQCAtMTYyLDYgKzIwNSw3IEBACiAJCQlzLT50eF9xdWV1ZV9zdG9wcGVkCSs9IHNxX3N0YXRzLT5zdG9wcGVkOwogCQkJcy0+dHhfcXVldWVfd2FrZQkrPSBzcV9zdGF0cy0+d2FrZTsKIAkJCXMtPnR4X3F1ZXVlX2Ryb3BwZWQJKz0gc3Ffc3RhdHMtPmRyb3BwZWQ7CisJCQlzLT50eF94bWl0X21vcmUJCSs9IHNxX3N0YXRzLT54bWl0X21vcmU7CiAJCQlzLT50eF9jc3VtX3BhcnRpYWxfaW5uZXIgKz0gc3Ffc3RhdHMtPmNzdW1fcGFydGlhbF9pbm5lcjsKIAkJCXR4X29mZmxvYWRfbm9uZQkJKz0gc3Ffc3RhdHMtPmNzdW1fbm9uZTsKIAkJfQpAQCAtMTgwLDE4ICsyMjQsMTUgQEAKIHsKIAlpbnQgb3V0bGVuID0gTUxYNV9TVF9TWl9CWVRFUyhxdWVyeV92cG9ydF9jb3VudGVyX291dCk7CiAJdTMyICpvdXQgPSAodTMyICopcHJpdi0+c3RhdHMudnBvcnQucXVlcnlfdnBvcnRfb3V0OwotCXUzMiBpbltNTFg1X1NUX1NaX0RXKHF1ZXJ5X3Zwb3J0X2NvdW50ZXJfaW4pXTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhxdWVyeV92cG9ydF9jb3VudGVyX2luKV0gPSB7MH07CiAJc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYgPSBwcml2LT5tZGV2OwogCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKLQogCU1MWDVfU0VUKHF1ZXJ5X3Zwb3J0X2NvdW50ZXJfaW4sIGluLCBvcGNvZGUsCiAJCSBNTFg1X0NNRF9PUF9RVUVSWV9WUE9SVF9DT1VOVEVSKTsKIAlNTFg1X1NFVChxdWVyeV92cG9ydF9jb3VudGVyX2luLCBpbiwgb3BfbW9kLCAwKTsKIAlNTFg1X1NFVChxdWVyeV92cG9ydF9jb3VudGVyX2luLCBpbiwgb3RoZXJfdnBvcnQsIDApOwogCiAJbWVtc2V0KG91dCwgMCwgb3V0bGVuKTsKLQogCW1seDVfY21kX2V4ZWMobWRldiwgaW4sIHNpemVvZihpbiksIG91dCwgb3V0bGVuKTsKIH0KIApAQCAtMzA0LDYgKzM0NSwxMTcgQEAKICNkZWZpbmUgTUxYNUVfSFcyU1dfTVRVKGh3bXR1KSAoaHdtdHUgLSAoRVRIX0hMRU4gKyBWTEFOX0hMRU4gKyBFVEhfRkNTX0xFTikpCiAjZGVmaW5lIE1MWDVFX1NXMkhXX01UVShzd210dSkgKHN3bXR1ICsgKEVUSF9ITEVOICsgVkxBTl9ITEVOICsgRVRIX0ZDU19MRU4pKQogCitzdGF0aWMgaW5saW5lIGludCBtbHg1ZV9nZXRfd3FlX210dF9zeih2b2lkKQoreworCS8qIFVNUiBjb3BpZXMgTVRUcyBpbiB1bml0cyBvZiBNTFg1X1VNUl9NVFRfQUxJR05NRU5UIGJ5dGVzLgorCSAqIFRvIGF2b2lkIGNvcHlpbmcgZ2FyYmFnZSBhZnRlciB0aGUgbXR0IGFycmF5LCB3ZSBhbGxvY2F0ZQorCSAqIGEgbGl0dGxlIG1vcmUuCisJICovCisJcmV0dXJuIEFMSUdOKE1MWDVfTVBXUlFfUEFHRVNfUEVSX1dRRSAqIHNpemVvZihfX2JlNjQpLAorCQkgICAgIE1MWDVfVU1SX01UVF9BTElHTk1FTlQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWx4NWVfYnVpbGRfdW1yX3dxZShzdHJ1Y3QgbWx4NWVfcnEgKnJxLCBzdHJ1Y3QgbWx4NWVfc3EgKnNxLAorCQkJCSAgICAgICBzdHJ1Y3QgbWx4NWVfdW1yX3dxZSAqd3FlLCB1MTYgaXgpCit7CisJc3RydWN0IG1seDVfd3FlX2N0cmxfc2VnICAgICAgKmNzZWcgPSAmd3FlLT5jdHJsOworCXN0cnVjdCBtbHg1X3dxZV91bXJfY3RybF9zZWcgKnVjc2VnID0gJndxZS0+dWN0cmw7CisJc3RydWN0IG1seDVfd3FlX2RhdGFfc2VnICAgICAgKmRzZWcgPSAmd3FlLT5kYXRhOworCXN0cnVjdCBtbHg1ZV9tcHdfaW5mbyAqd2kgPSAmcnEtPm1wd3FlLmluZm9baXhdOworCXU4IGRzX2NudCA9IERJVl9ST1VORF9VUChzaXplb2YoKndxZSksIE1MWDVfU0VORF9XUUVfRFMpOworCXUzMiB1bXJfd3FlX210dF9vZmZzZXQgPSBtbHg1ZV9nZXRfd3FlX210dF9vZmZzZXQocnEsIGl4KTsKKworCWNzZWctPnFwbl9kcyAgICA9IGNwdV90b19iZTMyKChzcS0+c3FuIDw8IE1MWDVfV1FFX0NUUkxfUVBOX1NISUZUKSB8CisJCQkJICAgICAgZHNfY250KTsKKwljc2VnLT5mbV9jZV9zZSAgPSBNTFg1X1dRRV9DVFJMX0NRX1VQREFURTsKKwljc2VnLT5pbW0gICAgICAgPSBycS0+bWtleV9iZTsKKworCXVjc2VnLT5mbGFncyA9IE1MWDVfVU1SX1RSQU5TTEFUSU9OX09GRlNFVF9FTjsKKwl1Y3NlZy0+a2xtX29jdG93b3JkcyA9CisJCWNwdV90b19iZTE2KE1MWDVfTVRUX09DVFcoTUxYNV9NUFdSUV9QQUdFU19QRVJfV1FFKSk7CisJdWNzZWctPmJzZl9vY3Rvd29yZHMgPQorCQljcHVfdG9fYmUxNihNTFg1X01UVF9PQ1RXKHVtcl93cWVfbXR0X29mZnNldCkpOworCXVjc2VnLT5ta2V5X21hc2sgICAgID0gY3B1X3RvX2JlNjQoTUxYNV9NS0VZX01BU0tfRlJFRSk7CisKKwlkc2VnLT5sa2V5ID0gc3EtPm1rZXlfYmU7CisJZHNlZy0+YWRkciA9IGNwdV90b19iZTY0KHdpLT51bXIubXR0X2FkZHIpOworfQorCitzdGF0aWMgaW50IG1seDVlX3JxX2FsbG9jX21wd3FlX2luZm8oc3RydWN0IG1seDVlX3JxICpycSwKKwkJCQkgICAgIHN0cnVjdCBtbHg1ZV9jaGFubmVsICpjKQoreworCWludCB3cV9zeiA9IG1seDVfd3FfbGxfZ2V0X3NpemUoJnJxLT53cSk7CisJaW50IG10dF9zeiA9IG1seDVlX2dldF93cWVfbXR0X3N6KCk7CisJaW50IG10dF9hbGxvYyA9IG10dF9zeiArIE1MWDVfVU1SX0FMSUdOIC0gMTsKKwlpbnQgaTsKKworCXJxLT5tcHdxZS5pbmZvID0ga3phbGxvY19ub2RlKHdxX3N6ICogc2l6ZW9mKCpycS0+bXB3cWUuaW5mbyksCisJCQkJICAgICAgR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoYy0+Y3B1KSk7CisJaWYgKCFycS0+bXB3cWUuaW5mbykKKwkJZ290byBlcnJfb3V0OworCisJLyogV2UgYWxsb2NhdGUgbW9yZSB0aGFuIG10dF9zeiBhcyB3ZSB3aWxsIGFsaWduIHRoZSBwb2ludGVyICovCisJcnEtPm1wd3FlLm10dF9ub19hbGlnbiA9IGt6YWxsb2Nfbm9kZShtdHRfYWxsb2MgKiB3cV9zeiwgR0ZQX0tFUk5FTCwKKwkJCQkJY3B1X3RvX25vZGUoYy0+Y3B1KSk7CisJaWYgKHVubGlrZWx5KCFycS0+bXB3cWUubXR0X25vX2FsaWduKSkKKwkJZ290byBlcnJfZnJlZV93cWVfaW5mbzsKKworCWZvciAoaSA9IDA7IGkgPCB3cV9zejsgaSsrKSB7CisJCXN0cnVjdCBtbHg1ZV9tcHdfaW5mbyAqd2kgPSAmcnEtPm1wd3FlLmluZm9baV07CisKKwkJd2ktPnVtci5tdHQgPSBQVFJfQUxJR04ocnEtPm1wd3FlLm10dF9ub19hbGlnbiArIGkgKiBtdHRfYWxsb2MsCisJCQkJCU1MWDVfVU1SX0FMSUdOKTsKKwkJd2ktPnVtci5tdHRfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGMtPnBkZXYsIHdpLT51bXIubXR0LCBtdHRfc3osCisJCQkJCQkgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlpZiAodW5saWtlbHkoZG1hX21hcHBpbmdfZXJyb3IoYy0+cGRldiwgd2ktPnVtci5tdHRfYWRkcikpKQorCQkJZ290byBlcnJfdW5tYXBfbXR0czsKKworCQltbHg1ZV9idWlsZF91bXJfd3FlKHJxLCAmYy0+aWNvc3EsICZ3aS0+dW1yLndxZSwgaSk7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl91bm1hcF9tdHRzOgorCXdoaWxlICgtLWkgPj0gMCkgeworCQlzdHJ1Y3QgbWx4NWVfbXB3X2luZm8gKndpID0gJnJxLT5tcHdxZS5pbmZvW2ldOworCisJCWRtYV91bm1hcF9zaW5nbGUoYy0+cGRldiwgd2ktPnVtci5tdHRfYWRkciwgbXR0X3N6LAorCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwl9CisJa2ZyZWUocnEtPm1wd3FlLm10dF9ub19hbGlnbik7CitlcnJfZnJlZV93cWVfaW5mbzoKKwlrZnJlZShycS0+bXB3cWUuaW5mbyk7CisKK2Vycl9vdXQ6CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIG1seDVlX3JxX2ZyZWVfbXB3cWVfaW5mbyhzdHJ1Y3QgbWx4NWVfcnEgKnJxKQoreworCWludCB3cV9zeiA9IG1seDVfd3FfbGxfZ2V0X3NpemUoJnJxLT53cSk7CisJaW50IG10dF9zeiA9IG1seDVlX2dldF93cWVfbXR0X3N6KCk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgd3Ffc3o7IGkrKykgeworCQlzdHJ1Y3QgbWx4NWVfbXB3X2luZm8gKndpID0gJnJxLT5tcHdxZS5pbmZvW2ldOworCisJCWRtYV91bm1hcF9zaW5nbGUocnEtPnBkZXYsIHdpLT51bXIubXR0X2FkZHIsIG10dF9zeiwKKwkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJfQorCWtmcmVlKHJxLT5tcHdxZS5tdHRfbm9fYWxpZ24pOworCWtmcmVlKHJxLT5tcHdxZS5pbmZvKTsKK30KKworc3RhdGljIGJvb2wgbWx4NWVfaXNfdmZfdnBvcnRfcmVwKHN0cnVjdCBtbHg1ZV9wcml2ICpwcml2KQoreworCXN0cnVjdCBtbHg1X2Vzd2l0Y2hfcmVwICpyZXAgPSAoc3RydWN0IG1seDVfZXN3aXRjaF9yZXAgKilwcml2LT5wcHJpdjsKKworCWlmIChyZXAgJiYgcmVwLT52cG9ydCAhPSBGREJfVVBMSU5LX1ZQT1JUKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKwogc3RhdGljIGludCBtbHg1ZV9jcmVhdGVfcnEoc3RydWN0IG1seDVlX2NoYW5uZWwgKmMsCiAJCQkgICBzdHJ1Y3QgbWx4NWVfcnFfcGFyYW0gKnBhcmFtLAogCQkJICAgc3RydWN0IG1seDVlX3JxICpycSkKQEAgLTMxMyw2ICs0NjUsOCBAQAogCXZvaWQgKnJxYyA9IHBhcmFtLT5ycWM7CiAJdm9pZCAqcnFjX3dxID0gTUxYNV9BRERSX09GKHJxYywgcnFjLCB3cSk7CiAJdTMyIGJ5dGVfY291bnQ7CisJdTMyIGZyYWdfc3o7CisJaW50IG5wYWdlczsKIAlpbnQgd3Ffc3o7CiAJaW50IGVycjsKIAlpbnQgaTsKQEAgLTMyOCw1MSArNDgyLDYgQEAKIAogCXdxX3N6ID0gbWx4NV93cV9sbF9nZXRfc2l6ZSgmcnEtPndxKTsKIAotCXN3aXRjaCAocHJpdi0+cGFyYW1zLnJxX3dxX3R5cGUpIHsKLQljYXNlIE1MWDVfV1FfVFlQRV9MSU5LRURfTElTVF9TVFJJRElOR19SUToKLQkJcnEtPndxZV9pbmZvID0ga3phbGxvY19ub2RlKHdxX3N6ICogc2l6ZW9mKCpycS0+d3FlX2luZm8pLAotCQkJCQkgICAgR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoYy0+Y3B1KSk7Ci0JCWlmICghcnEtPndxZV9pbmZvKSB7Ci0JCQllcnIgPSAtRU5PTUVNOwotCQkJZ290byBlcnJfcnFfd3FfZGVzdHJveTsKLQkJfQotCQlycS0+aGFuZGxlX3J4X2NxZSA9IG1seDVlX2hhbmRsZV9yeF9jcWVfbXB3cnE7Ci0JCXJxLT5hbGxvY193cWUgPSBtbHg1ZV9hbGxvY19yeF9tcHdxZTsKLQkJcnEtPmRlYWxsb2Nfd3FlID0gbWx4NWVfZGVhbGxvY19yeF9tcHdxZTsKLQotCQlycS0+bXB3cWVfc3RyaWRlX3N6ID0gQklUKHByaXYtPnBhcmFtcy5tcHdxZV9sb2dfc3RyaWRlX3N6KTsKLQkJcnEtPm1wd3FlX251bV9zdHJpZGVzID0gQklUKHByaXYtPnBhcmFtcy5tcHdxZV9sb2dfbnVtX3N0cmlkZXMpOwotCQlycS0+d3FlX3N6ID0gcnEtPm1wd3FlX3N0cmlkZV9zeiAqIHJxLT5tcHdxZV9udW1fc3RyaWRlczsKLQkJYnl0ZV9jb3VudCA9IHJxLT53cWVfc3o7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6IC8qIE1MWDVfV1FfVFlQRV9MSU5LRURfTElTVCAqLwotCQlycS0+c2tiID0ga3phbGxvY19ub2RlKHdxX3N6ICogc2l6ZW9mKCpycS0+c2tiKSwgR0ZQX0tFUk5FTCwKLQkJCQkgICAgICAgY3B1X3RvX25vZGUoYy0+Y3B1KSk7Ci0JCWlmICghcnEtPnNrYikgewotCQkJZXJyID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyX3JxX3dxX2Rlc3Ryb3k7Ci0JCX0KLQkJcnEtPmhhbmRsZV9yeF9jcWUgPSBtbHg1ZV9oYW5kbGVfcnhfY3FlOwotCQlycS0+YWxsb2Nfd3FlID0gbWx4NWVfYWxsb2Nfcnhfd3FlOwotCQlycS0+ZGVhbGxvY193cWUgPSBtbHg1ZV9kZWFsbG9jX3J4X3dxZTsKLQotCQlycS0+d3FlX3N6ID0gKHByaXYtPnBhcmFtcy5scm9fZW4pID8KLQkJCQlwcml2LT5wYXJhbXMubHJvX3dxZV9zeiA6Ci0JCQkJTUxYNUVfU1cySFdfTVRVKHByaXYtPm5ldGRldi0+bXR1KTsKLQkJcnEtPndxZV9zeiA9IFNLQl9EQVRBX0FMSUdOKHJxLT53cWVfc3opOwotCQlieXRlX2NvdW50ID0gcnEtPndxZV9zejsKLQkJYnl0ZV9jb3VudCB8PSBNTFg1X0hXX1NUQVJUX1BBRERJTkc7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IHdxX3N6OyBpKyspIHsKLQkJc3RydWN0IG1seDVlX3J4X3dxZSAqd3FlID0gbWx4NV93cV9sbF9nZXRfd3FlKCZycS0+d3EsIGkpOwotCi0JCXdxZS0+ZGF0YS5ieXRlX2NvdW50ID0gY3B1X3RvX2JlMzIoYnl0ZV9jb3VudCk7Ci0JfQotCi0JSU5JVF9XT1JLKCZycS0+YW0ud29yaywgbWx4NWVfcnhfYW1fd29yayk7Ci0JcnEtPmFtLm1vZGUgPSBwcml2LT5wYXJhbXMucnhfY3FfcGVyaW9kX21vZGU7Ci0KIAlycS0+d3FfdHlwZSA9IHByaXYtPnBhcmFtcy5ycV93cV90eXBlOwogCXJxLT5wZGV2ICAgID0gYy0+cGRldjsKIAlycS0+bmV0ZGV2ICA9IGMtPm5ldGRldjsKQEAgLTM4MCw4ICs0ODksODUgQEAKIAlycS0+Y2hhbm5lbCA9IGM7CiAJcnEtPml4ICAgICAgPSBjLT5peDsKIAlycS0+cHJpdiAgICA9IGMtPnByaXY7Ci0JcnEtPm1rZXlfYmUgPSBjLT5ta2V5X2JlOwotCXJxLT51bXJfbWtleV9iZSA9IGNwdV90b19iZTMyKGMtPnByaXYtPnVtcl9ta2V5LmtleSk7CisJcnEtPnhkcF9wcm9nID0gcHJpdi0+eGRwX3Byb2c7CisKKwlycS0+YnVmZi5tYXBfZGlyID0gRE1BX0ZST01fREVWSUNFOworCWlmIChycS0+eGRwX3Byb2cpCisJCXJxLT5idWZmLm1hcF9kaXIgPSBETUFfQklESVJFQ1RJT05BTDsKKworCXN3aXRjaCAocHJpdi0+cGFyYW1zLnJxX3dxX3R5cGUpIHsKKwljYXNlIE1MWDVfV1FfVFlQRV9MSU5LRURfTElTVF9TVFJJRElOR19SUToKKwkJaWYgKG1seDVlX2lzX3ZmX3Zwb3J0X3JlcChwcml2KSkgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyX3JxX3dxX2Rlc3Ryb3k7CisJCX0KKworCQlycS0+aGFuZGxlX3J4X2NxZSA9IG1seDVlX2hhbmRsZV9yeF9jcWVfbXB3cnE7CisJCXJxLT5hbGxvY193cWUgPSBtbHg1ZV9hbGxvY19yeF9tcHdxZTsKKwkJcnEtPmRlYWxsb2Nfd3FlID0gbWx4NWVfZGVhbGxvY19yeF9tcHdxZTsKKworCQlycS0+bXB3cWUubXR0X29mZnNldCA9IGMtPml4ICoKKwkJCU1MWDVFX1JFUVVJUkVEX01UVFMoMSwgQklUKHByaXYtPnBhcmFtcy5sb2dfcnFfc2l6ZSkpOworCisJCXJxLT5tcHdxZV9zdHJpZGVfc3ogPSBCSVQocHJpdi0+cGFyYW1zLm1wd3FlX2xvZ19zdHJpZGVfc3opOworCQlycS0+bXB3cWVfbnVtX3N0cmlkZXMgPSBCSVQocHJpdi0+cGFyYW1zLm1wd3FlX2xvZ19udW1fc3RyaWRlcyk7CisKKwkJcnEtPmJ1ZmYud3FlX3N6ID0gcnEtPm1wd3FlX3N0cmlkZV9zeiAqIHJxLT5tcHdxZV9udW1fc3RyaWRlczsKKwkJYnl0ZV9jb3VudCA9IHJxLT5idWZmLndxZV9zejsKKwkJcnEtPm1rZXlfYmUgPSBjcHVfdG9fYmUzMihjLT5wcml2LT51bXJfbWtleS5rZXkpOworCQllcnIgPSBtbHg1ZV9ycV9hbGxvY19tcHdxZV9pbmZvKHJxLCBjKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX3JxX3dxX2Rlc3Ryb3k7CisJCWJyZWFrOworCWRlZmF1bHQ6IC8qIE1MWDVfV1FfVFlQRV9MSU5LRURfTElTVCAqLworCQlycS0+ZG1hX2luZm8gPSBremFsbG9jX25vZGUod3Ffc3ogKiBzaXplb2YoKnJxLT5kbWFfaW5mbyksCisJCQkJCSAgICBHRlBfS0VSTkVMLCBjcHVfdG9fbm9kZShjLT5jcHUpKTsKKwkJaWYgKCFycS0+ZG1hX2luZm8pIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIGVycl9ycV93cV9kZXN0cm95OworCQl9CisKKwkJaWYgKG1seDVlX2lzX3ZmX3Zwb3J0X3JlcChwcml2KSkKKwkJCXJxLT5oYW5kbGVfcnhfY3FlID0gbWx4NWVfaGFuZGxlX3J4X2NxZV9yZXA7CisJCWVsc2UKKwkJCXJxLT5oYW5kbGVfcnhfY3FlID0gbWx4NWVfaGFuZGxlX3J4X2NxZTsKKworCQlycS0+YWxsb2Nfd3FlID0gbWx4NWVfYWxsb2Nfcnhfd3FlOworCQlycS0+ZGVhbGxvY193cWUgPSBtbHg1ZV9kZWFsbG9jX3J4X3dxZTsKKworCQlycS0+YnVmZi53cWVfc3ogPSAocHJpdi0+cGFyYW1zLmxyb19lbikgPworCQkJCXByaXYtPnBhcmFtcy5scm9fd3FlX3N6IDoKKwkJCQlNTFg1RV9TVzJIV19NVFUocHJpdi0+bmV0ZGV2LT5tdHUpOworCQlieXRlX2NvdW50ID0gcnEtPmJ1ZmYud3FlX3N6OworCisJCS8qIGNhbGMgdGhlIHJlcXVpcmVkIHBhZ2Ugb3JkZXIgKi8KKwkJZnJhZ19zeiA9IE1MWDVfUlhfSEVBRFJPT00gKworCQkJICBieXRlX2NvdW50IC8qIHBhY2tldCBkYXRhICovICsKKwkJCSAgU0tCX0RBVEFfQUxJR04oc2l6ZW9mKHN0cnVjdCBza2Jfc2hhcmVkX2luZm8pKTsKKwkJZnJhZ19zeiA9IFNLQl9EQVRBX0FMSUdOKGZyYWdfc3opOworCisJCW5wYWdlcyA9IERJVl9ST1VORF9VUChmcmFnX3N6LCBQQUdFX1NJWkUpOworCQlycS0+YnVmZi5wYWdlX29yZGVyID0gb3JkZXJfYmFzZV8yKG5wYWdlcyk7CisKKwkJYnl0ZV9jb3VudCB8PSBNTFg1X0hXX1NUQVJUX1BBRERJTkc7CisJCXJxLT5ta2V5X2JlID0gYy0+bWtleV9iZTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgd3Ffc3o7IGkrKykgeworCQlzdHJ1Y3QgbWx4NWVfcnhfd3FlICp3cWUgPSBtbHg1X3dxX2xsX2dldF93cWUoJnJxLT53cSwgaSk7CisKKwkJd3FlLT5kYXRhLmJ5dGVfY291bnQgPSBjcHVfdG9fYmUzMihieXRlX2NvdW50KTsKKwkJd3FlLT5kYXRhLmxrZXkgPSBycS0+bWtleV9iZTsKKwl9CisKKwlJTklUX1dPUksoJnJxLT5hbS53b3JrLCBtbHg1ZV9yeF9hbV93b3JrKTsKKwlycS0+YW0ubW9kZSA9IHByaXYtPnBhcmFtcy5yeF9jcV9wZXJpb2RfbW9kZTsKKworCXJxLT5wYWdlX2NhY2hlLmhlYWQgPSAwOworCXJxLT5wYWdlX2NhY2hlLnRhaWwgPSAwOworCisJaWYgKHJxLT54ZHBfcHJvZykKKwkJYnBmX3Byb2dfYWRkKHJxLT54ZHBfcHJvZywgMSk7CiAKIAlyZXR1cm4gMDsKIApAQCAtMzkzLDE0ICs1NzksMjUgQEAKIAogc3RhdGljIHZvaWQgbWx4NWVfZGVzdHJveV9ycShzdHJ1Y3QgbWx4NWVfcnEgKnJxKQogeworCWludCBpOworCisJaWYgKHJxLT54ZHBfcHJvZykKKwkJYnBmX3Byb2dfcHV0KHJxLT54ZHBfcHJvZyk7CisKIAlzd2l0Y2ggKHJxLT53cV90eXBlKSB7CiAJY2FzZSBNTFg1X1dRX1RZUEVfTElOS0VEX0xJU1RfU1RSSURJTkdfUlE6Ci0JCWtmcmVlKHJxLT53cWVfaW5mbyk7CisJCW1seDVlX3JxX2ZyZWVfbXB3cWVfaW5mbyhycSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6IC8qIE1MWDVfV1FfVFlQRV9MSU5LRURfTElTVCAqLwotCQlrZnJlZShycS0+c2tiKTsKKwkJa2ZyZWUocnEtPmRtYV9pbmZvKTsKIAl9CiAKKwlmb3IgKGkgPSBycS0+cGFnZV9jYWNoZS5oZWFkOyBpICE9IHJxLT5wYWdlX2NhY2hlLnRhaWw7CisJICAgICBpID0gKGkgKyAxKSAmIChNTFg1RV9DQUNIRV9TSVpFIC0gMSkpIHsKKwkJc3RydWN0IG1seDVlX2RtYV9pbmZvICpkbWFfaW5mbyA9ICZycS0+cGFnZV9jYWNoZS5wYWdlX2NhY2hlW2ldOworCisJCW1seDVlX3BhZ2VfcmVsZWFzZShycSwgZG1hX2luZm8sIGZhbHNlKTsKKwl9CiAJbWx4NV93cV9kZXN0cm95KCZycS0+d3FfY3RybCk7CiB9CiAKQEAgLTQyOCw3ICs2MjUsNiBAQAogCiAJTUxYNV9TRVQocnFjLCAgcnFjLCBjcW4sCQlycS0+Y3EubWNxLmNxbik7CiAJTUxYNV9TRVQocnFjLCAgcnFjLCBzdGF0ZSwJCU1MWDVfUlFDX1NUQVRFX1JTVCk7Ci0JTUxYNV9TRVQocnFjLCAgcnFjLCBmbHVzaF9pbl9lcnJvcl9lbiwJMSk7CiAJTUxYNV9TRVQocnFjLCAgcnFjLCB2c2QsIHByaXYtPnBhcmFtcy52bGFuX3N0cmlwX2Rpc2FibGUpOwogCU1MWDVfU0VUKHdxLCAgIHdxLCAgbG9nX3dxX3BnX3N6LAlycS0+d3FfY3RybC5idWYucGFnZV9zaGlmdCAtCiAJCQkJCQlNTFg1X0FEQVBURVJfUEFHRV9TSElGVCk7CkBAIC00OTIsNyArNjg4LDggQEAKIAlycWMgPSBNTFg1X0FERFJfT0YobW9kaWZ5X3JxX2luLCBpbiwgY3R4KTsKIAogCU1MWDVfU0VUKG1vZGlmeV9ycV9pbiwgaW4sIHJxX3N0YXRlLCBNTFg1X1JRQ19TVEFURV9SRFkpOwotCU1MWDVfU0VUNjQobW9kaWZ5X3JxX2luLCBpbiwgbW9kaWZ5X2JpdG1hc2ssIE1MWDVfUlFfQklUTUFTS19WU0QpOworCU1MWDVfU0VUNjQobW9kaWZ5X3JxX2luLCBpbiwgbW9kaWZ5X2JpdG1hc2ssCisJCSAgIE1MWDVfTU9ESUZZX1JRX0lOX01PRElGWV9CSVRNQVNLX1ZTRCk7CiAJTUxYNV9TRVQocnFjLCBycWMsIHZzZCwgdnNkKTsKIAlNTFg1X1NFVChycWMsIHJxYywgc3RhdGUsIE1MWDVfUlFDX1NUQVRFX1JEWSk7CiAKQEAgLTUyNSw2ICs3MjIsMjcgQEAKIAlyZXR1cm4gLUVUSU1FRE9VVDsKIH0KIAorc3RhdGljIHZvaWQgbWx4NWVfZnJlZV9yeF9kZXNjcyhzdHJ1Y3QgbWx4NWVfcnEgKnJxKQoreworCXN0cnVjdCBtbHg1X3dxX2xsICp3cSA9ICZycS0+d3E7CisJc3RydWN0IG1seDVlX3J4X3dxZSAqd3FlOworCV9fYmUxNiB3cWVfaXhfYmU7CisJdTE2IHdxZV9peDsKKworCS8qIFVNUiBXUUUgKGlmIGluIHByb2dyZXNzKSBpcyBhbHdheXMgYXQgd3EtPmhlYWQgKi8KKwlpZiAodGVzdF9iaXQoTUxYNUVfUlFfU1RBVEVfVU1SX1dRRV9JTl9QUk9HUkVTUywgJnJxLT5zdGF0ZSkpCisJCW1seDVlX2ZyZWVfcnhfbXB3cWUocnEsICZycS0+bXB3cWUuaW5mb1t3cS0+aGVhZF0pOworCisJd2hpbGUgKCFtbHg1X3dxX2xsX2lzX2VtcHR5KHdxKSkgeworCQl3cWVfaXhfYmUgPSAqd3EtPnRhaWxfbmV4dDsKKwkJd3FlX2l4ICAgID0gYmUxNl90b19jcHUod3FlX2l4X2JlKTsKKwkJd3FlICAgICAgID0gbWx4NV93cV9sbF9nZXRfd3FlKCZycS0+d3EsIHdxZV9peCk7CisJCXJxLT5kZWFsbG9jX3dxZShycSwgd3FlX2l4KTsKKwkJbWx4NV93cV9sbF9wb3AoJnJxLT53cSwgd3FlX2l4X2JlLAorCQkJICAgICAgICZ3cWUtPm5leHQubmV4dF93cWVfaW5kZXgpOworCX0KK30KKwogc3RhdGljIGludCBtbHg1ZV9vcGVuX3JxKHN0cnVjdCBtbHg1ZV9jaGFubmVsICpjLAogCQkJIHN0cnVjdCBtbHg1ZV9ycV9wYXJhbSAqcGFyYW0sCiAJCQkgc3RydWN0IG1seDVlX3JxICpycSkKQEAgLTU0OCwxMCArNzY2LDggQEAKIAlpZiAocGFyYW0tPmFtX2VuYWJsZWQpCiAJCXNldF9iaXQoTUxYNUVfUlFfU1RBVEVfQU0sICZjLT5ycS5zdGF0ZSk7CiAKLQlzZXRfYml0KE1MWDVFX1JRX1NUQVRFX1BPU1RfV1FFU19FTkFCTEUsICZycS0+c3RhdGUpOwotCi0Jc3EtPmljb193cWVfaW5mb1twaV0ub3Bjb2RlICAgICA9IE1MWDVfT1BDT0RFX05PUDsKLQlzcS0+aWNvX3dxZV9pbmZvW3BpXS5udW1fd3FlYmJzID0gMTsKKwlzcS0+ZGIuaWNvX3dxZVtwaV0ub3Bjb2RlICAgICA9IE1MWDVfT1BDT0RFX05PUDsKKwlzcS0+ZGIuaWNvX3dxZVtwaV0ubnVtX3dxZWJicyA9IDE7CiAJbWx4NWVfc2VuZF9ub3Aoc3EsIHRydWUpOyAvKiB0cmlnZ2VyIG1seDVlX3Bvc3Rfcnhfd3FlcygpICovCiAKIAlyZXR1cm4gMDsKQEAgLTU2NiwyMyArNzgyLDggQEAKIAogc3RhdGljIHZvaWQgbWx4NWVfY2xvc2VfcnEoc3RydWN0IG1seDVlX3JxICpycSkKIHsKLQlpbnQgdG91dCA9IDA7Ci0JaW50IGVycjsKLQotCWNsZWFyX2JpdChNTFg1RV9SUV9TVEFURV9QT1NUX1dRRVNfRU5BQkxFLCAmcnEtPnN0YXRlKTsKKwlzZXRfYml0KE1MWDVFX1JRX1NUQVRFX0ZMVVNILCAmcnEtPnN0YXRlKTsKIAluYXBpX3N5bmNocm9uaXplKCZycS0+Y2hhbm5lbC0+bmFwaSk7IC8qIHByZXZlbnQgbWx4NWVfcG9zdF9yeF93cWVzICovCi0KLQllcnIgPSBtbHg1ZV9tb2RpZnlfcnFfc3RhdGUocnEsIE1MWDVfUlFDX1NUQVRFX1JEWSwgTUxYNV9SUUNfU1RBVEVfRVJSKTsKLQl3aGlsZSAoIW1seDVfd3FfbGxfaXNfZW1wdHkoJnJxLT53cSkgJiYgIWVyciAmJgotCSAgICAgICB0b3V0KysgPCBNTFg1X0VOX1FQX0ZMVVNIX01BWF9JVEVSKQotCQltc2xlZXAoTUxYNV9FTl9RUF9GTFVTSF9NU0xFRVBfUVVBTlQpOwotCi0JaWYgKGVyciB8fCB0b3V0ID09IE1MWDVfRU5fUVBfRkxVU0hfTUFYX0lURVIpCi0JCXNldF9iaXQoTUxYNUVfUlFfU1RBVEVfRkxVU0hfVElNRU9VVCwgJnJxLT5zdGF0ZSk7Ci0KLQkvKiBhdm9pZCBkZXN0cm95aW5nIHJxIGJlZm9yZSBtbHg1ZV9wb2xsX3J4X2NxKCkgaXMgZG9uZSB3aXRoIGl0ICovCi0JbmFwaV9zeW5jaHJvbml6ZSgmcnEtPmNoYW5uZWwtPm5hcGkpOwotCiAJY2FuY2VsX3dvcmtfc3luYygmcnEtPmFtLndvcmspOwogCiAJbWx4NWVfZGlzYWJsZV9ycShycSk7CkBAIC01OTAsMjYgKzc5MSw2NSBAQAogCW1seDVlX2Rlc3Ryb3lfcnEocnEpOwogfQogCi1zdGF0aWMgdm9pZCBtbHg1ZV9mcmVlX3NxX2RiKHN0cnVjdCBtbHg1ZV9zcSAqc3EpCitzdGF0aWMgdm9pZCBtbHg1ZV9mcmVlX3NxX3hkcF9kYihzdHJ1Y3QgbWx4NWVfc3EgKnNxKQogewotCWtmcmVlKHNxLT53cWVfaW5mbyk7Ci0Ja2ZyZWUoc3EtPmRtYV9maWZvKTsKLQlrZnJlZShzcS0+c2tiKTsKKwlrZnJlZShzcS0+ZGIueGRwLmRpKTsKKwlrZnJlZShzcS0+ZGIueGRwLndxZV9pbmZvKTsKIH0KIAotc3RhdGljIGludCBtbHg1ZV9hbGxvY19zcV9kYihzdHJ1Y3QgbWx4NWVfc3EgKnNxLCBpbnQgbnVtYSkKK3N0YXRpYyBpbnQgbWx4NWVfYWxsb2Nfc3FfeGRwX2RiKHN0cnVjdCBtbHg1ZV9zcSAqc3EsIGludCBudW1hKQoreworCWludCB3cV9zeiA9IG1seDVfd3FfY3ljX2dldF9zaXplKCZzcS0+d3EpOworCisJc3EtPmRiLnhkcC5kaSA9IGt6YWxsb2Nfbm9kZShzaXplb2YoKnNxLT5kYi54ZHAuZGkpICogd3Ffc3osCisJCQkJICAgICBHRlBfS0VSTkVMLCBudW1hKTsKKwlzcS0+ZGIueGRwLndxZV9pbmZvID0ga3phbGxvY19ub2RlKHNpemVvZigqc3EtPmRiLnhkcC53cWVfaW5mbykgKiB3cV9zeiwKKwkJCQkJICAgR0ZQX0tFUk5FTCwgbnVtYSk7CisJaWYgKCFzcS0+ZGIueGRwLmRpIHx8ICFzcS0+ZGIueGRwLndxZV9pbmZvKSB7CisJCW1seDVlX2ZyZWVfc3FfeGRwX2RiKHNxKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1seDVlX2ZyZWVfc3FfaWNvX2RiKHN0cnVjdCBtbHg1ZV9zcSAqc3EpCit7CisJa2ZyZWUoc3EtPmRiLmljb193cWUpOworfQorCitzdGF0aWMgaW50IG1seDVlX2FsbG9jX3NxX2ljb19kYihzdHJ1Y3QgbWx4NWVfc3EgKnNxLCBpbnQgbnVtYSkKK3sKKwl1OCB3cV9zeiA9IG1seDVfd3FfY3ljX2dldF9zaXplKCZzcS0+d3EpOworCisJc3EtPmRiLmljb193cWUgPSBremFsbG9jX25vZGUoc2l6ZW9mKCpzcS0+ZGIuaWNvX3dxZSkgKiB3cV9zeiwKKwkJCQkgICAgICBHRlBfS0VSTkVMLCBudW1hKTsKKwlpZiAoIXNxLT5kYi5pY29fd3FlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtbHg1ZV9mcmVlX3NxX3R4cV9kYihzdHJ1Y3QgbWx4NWVfc3EgKnNxKQoreworCWtmcmVlKHNxLT5kYi50eHEud3FlX2luZm8pOworCWtmcmVlKHNxLT5kYi50eHEuZG1hX2ZpZm8pOworCWtmcmVlKHNxLT5kYi50eHEuc2tiKTsKK30KKworc3RhdGljIGludCBtbHg1ZV9hbGxvY19zcV90eHFfZGIoc3RydWN0IG1seDVlX3NxICpzcSwgaW50IG51bWEpCiB7CiAJaW50IHdxX3N6ID0gbWx4NV93cV9jeWNfZ2V0X3NpemUoJnNxLT53cSk7CiAJaW50IGRmX3N6ID0gd3Ffc3ogKiBNTFg1X1NFTkRfV1FFQkJfTlVNX0RTOwogCi0Jc3EtPnNrYiA9IGt6YWxsb2Nfbm9kZSh3cV9zeiAqIHNpemVvZigqc3EtPnNrYiksIEdGUF9LRVJORUwsIG51bWEpOwotCXNxLT5kbWFfZmlmbyA9IGt6YWxsb2Nfbm9kZShkZl9zeiAqIHNpemVvZigqc3EtPmRtYV9maWZvKSwgR0ZQX0tFUk5FTCwKLQkJCQkgICAgbnVtYSk7Ci0Jc3EtPndxZV9pbmZvID0ga3phbGxvY19ub2RlKHdxX3N6ICogc2l6ZW9mKCpzcS0+d3FlX2luZm8pLCBHRlBfS0VSTkVMLAotCQkJCSAgICBudW1hKTsKLQotCWlmICghc3EtPnNrYiB8fCAhc3EtPmRtYV9maWZvIHx8ICFzcS0+d3FlX2luZm8pIHsKLQkJbWx4NWVfZnJlZV9zcV9kYihzcSk7CisJc3EtPmRiLnR4cS5za2IgPSBremFsbG9jX25vZGUod3Ffc3ogKiBzaXplb2YoKnNxLT5kYi50eHEuc2tiKSwKKwkJCQkgICAgICBHRlBfS0VSTkVMLCBudW1hKTsKKwlzcS0+ZGIudHhxLmRtYV9maWZvID0ga3phbGxvY19ub2RlKGRmX3N6ICogc2l6ZW9mKCpzcS0+ZGIudHhxLmRtYV9maWZvKSwKKwkJCQkJICAgR0ZQX0tFUk5FTCwgbnVtYSk7CisJc3EtPmRiLnR4cS53cWVfaW5mbyA9IGt6YWxsb2Nfbm9kZSh3cV9zeiAqIHNpemVvZigqc3EtPmRiLnR4cS53cWVfaW5mbyksCisJCQkJCSAgIEdGUF9LRVJORUwsIG51bWEpOworCWlmICghc3EtPmRiLnR4cS5za2IgfHwgIXNxLT5kYi50eHEuZG1hX2ZpZm8gfHwgIXNxLT5kYi50eHEud3FlX2luZm8pIHsKKwkJbWx4NWVfZnJlZV9zcV90eHFfZGIoc3EpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTYxOCw2ICs4NTgsNDYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgbWx4NWVfZnJlZV9zcV9kYihzdHJ1Y3QgbWx4NWVfc3EgKnNxKQoreworCXN3aXRjaCAoc3EtPnR5cGUpIHsKKwljYXNlIE1MWDVFX1NRX1RYUToKKwkJbWx4NWVfZnJlZV9zcV90eHFfZGIoc3EpOworCQlicmVhazsKKwljYXNlIE1MWDVFX1NRX0lDTzoKKwkJbWx4NWVfZnJlZV9zcV9pY29fZGIoc3EpOworCQlicmVhazsKKwljYXNlIE1MWDVFX1NRX1hEUDoKKwkJbWx4NWVfZnJlZV9zcV94ZHBfZGIoc3EpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbWx4NWVfYWxsb2Nfc3FfZGIoc3RydWN0IG1seDVlX3NxICpzcSwgaW50IG51bWEpCit7CisJc3dpdGNoIChzcS0+dHlwZSkgeworCWNhc2UgTUxYNUVfU1FfVFhROgorCQlyZXR1cm4gbWx4NWVfYWxsb2Nfc3FfdHhxX2RiKHNxLCBudW1hKTsKKwljYXNlIE1MWDVFX1NRX0lDTzoKKwkJcmV0dXJuIG1seDVlX2FsbG9jX3NxX2ljb19kYihzcSwgbnVtYSk7CisJY2FzZSBNTFg1RV9TUV9YRFA6CisJCXJldHVybiBtbHg1ZV9hbGxvY19zcV94ZHBfZGIoc3EsIG51bWEpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1seDVlX3NxX2dldF9tYXhfd3FlYmJzKHU4IHNxX3R5cGUpCit7CisJc3dpdGNoIChzcV90eXBlKSB7CisJY2FzZSBNTFg1RV9TUV9JQ086CisJCXJldHVybiBNTFg1RV9JQ09TUV9NQVhfV1FFQkJTOworCWNhc2UgTUxYNUVfU1FfWERQOgorCQlyZXR1cm4gTUxYNUVfWERQX1RYX1dRRUJCUzsKKwl9CisJcmV0dXJuIE1MWDVfU0VORF9XUUVfTUFYX1dRRUJCUzsKK30KKwogc3RhdGljIGludCBtbHg1ZV9jcmVhdGVfc3Eoc3RydWN0IG1seDVlX2NoYW5uZWwgKmMsCiAJCQkgICBpbnQgdGMsCiAJCQkgICBzdHJ1Y3QgbWx4NWVfc3FfcGFyYW0gKnBhcmFtLApAQCAtNjMwLDYgKzkxMCwxMyBAQAogCXZvaWQgKnNxY193cSA9IE1MWDVfQUREUl9PRihzcWMsIHNxYywgd3EpOwogCWludCBlcnI7CiAKKwlzcS0+dHlwZSAgICAgID0gcGFyYW0tPnR5cGU7CisJc3EtPnBkZXYgICAgICA9IGMtPnBkZXY7CisJc3EtPnRzdGFtcCAgICA9ICZwcml2LT50c3RhbXA7CisJc3EtPm1rZXlfYmUgICA9IGMtPm1rZXlfYmU7CisJc3EtPmNoYW5uZWwgICA9IGM7CisJc3EtPnRjICAgICAgICA9IHRjOworCiAJZXJyID0gbWx4NV9hbGxvY19tYXBfdWFyKG1kZXYsICZzcS0+dWFyLCAhIU1MWDVfQ0FQX0dFTihtZGV2LCBiZikpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CkBAIC02NTgsMTggKzk0NSw3IEBACiAJaWYgKGVycikKIAkJZ290byBlcnJfc3Ffd3FfZGVzdHJveTsKIAotCWlmIChwYXJhbS0+aWNvc3EpIHsKLQkJdTggd3Ffc3ogPSBtbHg1X3dxX2N5Y19nZXRfc2l6ZSgmc3EtPndxKTsKLQotCQlzcS0+aWNvX3dxZV9pbmZvID0ga3phbGxvY19ub2RlKHNpemVvZigqc3EtPmljb193cWVfaW5mbykgKgotCQkJCQkJd3Ffc3osCi0JCQkJCQlHRlBfS0VSTkVMLAotCQkJCQkJY3B1X3RvX25vZGUoYy0+Y3B1KSk7Ci0JCWlmICghc3EtPmljb193cWVfaW5mbykgewotCQkJZXJyID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyX2ZyZWVfc3FfZGI7Ci0JCX0KLQl9IGVsc2UgeworCWlmIChzcS0+dHlwZSA9PSBNTFg1RV9TUV9UWFEpIHsKIAkJaW50IHR4cV9peDsKIAogCQl0eHFfaXggPSBjLT5peCArIHRjICogcHJpdi0+cGFyYW1zLm51bV9jaGFubmVsczsKQEAgLTY3NywxOSArOTUzLDExIEBACiAJCXByaXYtPnR4cV90b19zcV9tYXBbdHhxX2l4XSA9IHNxOwogCX0KIAotCXNxLT5wZGV2ICAgICAgPSBjLT5wZGV2OwotCXNxLT50c3RhbXAgICAgPSAmcHJpdi0+dHN0YW1wOwotCXNxLT5ta2V5X2JlICAgPSBjLT5ta2V5X2JlOwotCXNxLT5jaGFubmVsICAgPSBjOwotCXNxLT50YyAgICAgICAgPSB0YzsKLQlzcS0+ZWRnZSAgICAgID0gKHNxLT53cS5zel9tMSArIDEpIC0gTUxYNV9TRU5EX1dRRV9NQVhfV1FFQkJTOworCXNxLT5lZGdlID0gKHNxLT53cS5zel9tMSArIDEpIC0gbWx4NWVfc3FfZ2V0X21heF93cWViYnMoc3EtPnR5cGUpOwogCXNxLT5iZl9idWRnZXQgPSBNTFg1RV9TUV9CRl9CVURHRVQ7CiAKIAlyZXR1cm4gMDsKIAotZXJyX2ZyZWVfc3FfZGI6Ci0JbWx4NWVfZnJlZV9zcV9kYihzcSk7Ci0KIGVycl9zcV93cV9kZXN0cm95OgogCW1seDVfd3FfZGVzdHJveSgmc3EtPndxX2N0cmwpOwogCkBAIC03MDQsNyArOTcyLDYgQEAKIAlzdHJ1Y3QgbWx4NWVfY2hhbm5lbCAqYyA9IHNxLT5jaGFubmVsOwogCXN0cnVjdCBtbHg1ZV9wcml2ICpwcml2ID0gYy0+cHJpdjsKIAotCWtmcmVlKHNxLT5pY29fd3FlX2luZm8pOwogCW1seDVlX2ZyZWVfc3FfZGIoc3EpOwogCW1seDVfd3FfZGVzdHJveSgmc3EtPndxX2N0cmwpOwogCW1seDVfdW5tYXBfZnJlZV91YXIocHJpdi0+bWRldiwgJnNxLT51YXIpOwpAQCAtNzMzLDExICsxMDAwLDEyIEBACiAKIAltZW1jcHkoc3FjLCBwYXJhbS0+c3FjLCBzaXplb2YocGFyYW0tPnNxYykpOwogCi0JTUxYNV9TRVQoc3FjLCAgc3FjLCB0aXNfbnVtXzAsIHBhcmFtLT5pY29zcSA/IDAgOiBwcml2LT50aXNuW3NxLT50Y10pOworCU1MWDVfU0VUKHNxYywgIHNxYywgdGlzX251bV8wLCBwYXJhbS0+dHlwZSA9PSBNTFg1RV9TUV9JQ08gPworCQkJCSAgICAgICAwIDogcHJpdi0+dGlzbltzcS0+dGNdKTsKIAlNTFg1X1NFVChzcWMsICBzcWMsIGNxbiwJCXNxLT5jcS5tY3EuY3FuKTsKIAlNTFg1X1NFVChzcWMsICBzcWMsIG1pbl93cWVfaW5saW5lX21vZGUsIHNxLT5taW5faW5saW5lX21vZGUpOwogCU1MWDVfU0VUKHNxYywgIHNxYywgc3RhdGUsCQlNTFg1X1NRQ19TVEFURV9SU1QpOwotCU1MWDVfU0VUKHNxYywgIHNxYywgdGlzX2xzdF9zeiwJCXBhcmFtLT5pY29zcSA/IDAgOiAxKTsKKwlNTFg1X1NFVChzcWMsICBzcWMsIHRpc19sc3Rfc3osIHBhcmFtLT50eXBlID09IE1MWDVFX1NRX0lDTyA/IDAgOiAxKTsKIAlNTFg1X1NFVChzcWMsICBzcWMsIGZsdXNoX2luX2Vycm9yX2VuLAkxKTsKIAogCU1MWDVfU0VUKHdxLCAgIHdxLCB3cV90eXBlLCAgICAgICBNTFg1X1dRX1RZUEVfQ1lDTElDKTsKQEAgLTgyMSw3ICsxMDg5LDYgQEAKIAkJZ290byBlcnJfZGlzYWJsZV9zcTsKIAogCWlmIChzcS0+dHhxKSB7Ci0JCXNldF9iaXQoTUxYNUVfU1FfU1RBVEVfV0FLRV9UWFFfRU5BQkxFLCAmc3EtPnN0YXRlKTsKIAkJbmV0ZGV2X3R4X3Jlc2V0X3F1ZXVlKHNxLT50eHEpOwogCQluZXRpZl90eF9zdGFydF9xdWV1ZShzcS0+dHhxKTsKIAl9CkBAIC04NDUsMzggKzExMTIsMjIgQEAKIAogc3RhdGljIHZvaWQgbWx4NWVfY2xvc2Vfc3Eoc3RydWN0IG1seDVlX3NxICpzcSkKIHsKLQlpbnQgdG91dCA9IDA7Ci0JaW50IGVycjsKLQotCWlmIChzcS0+dHhxKSB7Ci0JCWNsZWFyX2JpdChNTFg1RV9TUV9TVEFURV9XQUtFX1RYUV9FTkFCTEUsICZzcS0+c3RhdGUpOwotCQkvKiBwcmV2ZW50IG5ldGlmX3R4X3dha2VfcXVldWUgKi8KLQkJbmFwaV9zeW5jaHJvbml6ZSgmc3EtPmNoYW5uZWwtPm5hcGkpOwotCQluZXRpZl90eF9kaXNhYmxlX3F1ZXVlKHNxLT50eHEpOwotCi0JCS8qIGVuc3VyZSBodyBpcyBub3RpZmllZCBvZiBhbGwgcGVuZGluZyB3cWVzICovCi0JCWlmIChtbHg1ZV9zcV9oYXNfcm9vbV9mb3Ioc3EsIDEpKQotCQkJbWx4NWVfc2VuZF9ub3Aoc3EsIHRydWUpOwotCi0JCWVyciA9IG1seDVlX21vZGlmeV9zcShzcSwgTUxYNV9TUUNfU1RBVEVfUkRZLAotCQkJCSAgICAgIE1MWDVfU1FDX1NUQVRFX0VSUiwgZmFsc2UsIDApOwotCQlpZiAoZXJyKQotCQkJc2V0X2JpdChNTFg1RV9TUV9TVEFURV9UWF9USU1FT1VULCAmc3EtPnN0YXRlKTsKLQl9Ci0KLQkvKiB3YWl0IHRpbGwgc3EgaXMgZW1wdHksIHVubGVzcyBhIFRYIHRpbWVvdXQgb2NjdXJyZWQgb24gdGhpcyBTUSAqLwotCXdoaWxlIChzcS0+Y2MgIT0gc3EtPnBjICYmCi0JICAgICAgICF0ZXN0X2JpdChNTFg1RV9TUV9TVEFURV9UWF9USU1FT1VULCAmc3EtPnN0YXRlKSkgewotCQltc2xlZXAoTUxYNV9FTl9RUF9GTFVTSF9NU0xFRVBfUVVBTlQpOwotCQlpZiAodG91dCsrID4gTUxYNV9FTl9RUF9GTFVTSF9NQVhfSVRFUikKLQkJCXNldF9iaXQoTUxYNUVfU1FfU1RBVEVfVFhfVElNRU9VVCwgJnNxLT5zdGF0ZSk7Ci0JfQotCi0JLyogYXZvaWQgZGVzdHJveWluZyBzcSBiZWZvcmUgbWx4NWVfcG9sbF90eF9jcSgpIGlzIGRvbmUgd2l0aCBpdCAqLworCXNldF9iaXQoTUxYNUVfU1FfU1RBVEVfRkxVU0gsICZzcS0+c3RhdGUpOworCS8qIHByZXZlbnQgbmV0aWZfdHhfd2FrZV9xdWV1ZSAqLwogCW5hcGlfc3luY2hyb25pemUoJnNxLT5jaGFubmVsLT5uYXBpKTsKIAotCW1seDVlX2ZyZWVfdHhfZGVzY3Moc3EpOworCWlmIChzcS0+dHhxKSB7CisJCW5ldGlmX3R4X2Rpc2FibGVfcXVldWUoc3EtPnR4cSk7CisKKwkJLyogbGFzdCBkb29yYmVsbCBvdXQsIGdvZHNwZWVkIC4uICovCisJCWlmIChtbHg1ZV9zcV9oYXNfcm9vbV9mb3Ioc3EsIDEpKSB7CisJCQlzcS0+ZGIudHhxLnNrYlsoc3EtPnBjICYgc3EtPndxLnN6X20xKV0gPSBOVUxMOworCQkJbWx4NWVfc2VuZF9ub3Aoc3EsIHRydWUpOworCQl9CisJfQorCiAJbWx4NWVfZGlzYWJsZV9zcShzcSk7CisJbWx4NWVfZnJlZV9zcV9kZXNjcyhzcSk7CiAJbWx4NWVfZGVzdHJveV9zcShzcSk7CiB9CiAKQEAgLTEyMzcsMTQgKzE0ODgsMzEgQEAKIAkJfQogCX0KIAorCWlmIChwcml2LT54ZHBfcHJvZykgeworCQkvKiBYRFAgU1EgQ1EgcGFyYW1zIGFyZSBzYW1lIGFzIG5vcm1hbCBUWFEgc3EgQ1EgcGFyYW1zICovCisJCWVyciA9IG1seDVlX29wZW5fY3EoYywgJmNwYXJhbS0+dHhfY3EsICZjLT54ZHBfc3EuY3EsCisJCQkJICAgIHByaXYtPnBhcmFtcy50eF9jcV9tb2RlcmF0aW9uKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX2Nsb3NlX3NxczsKKworCQllcnIgPSBtbHg1ZV9vcGVuX3NxKGMsIDAsICZjcGFyYW0tPnhkcF9zcSwgJmMtPnhkcF9zcSk7CisJCWlmIChlcnIpIHsKKwkJCW1seDVlX2Nsb3NlX2NxKCZjLT54ZHBfc3EuY3EpOworCQkJZ290byBlcnJfY2xvc2Vfc3FzOworCQl9CisJfQorCisJYy0+eGRwID0gISFwcml2LT54ZHBfcHJvZzsKIAllcnIgPSBtbHg1ZV9vcGVuX3JxKGMsICZjcGFyYW0tPnJxLCAmYy0+cnEpOwogCWlmIChlcnIpCi0JCWdvdG8gZXJyX2Nsb3NlX3NxczsKKwkJZ290byBlcnJfY2xvc2VfeGRwX3NxOwogCiAJbmV0aWZfc2V0X3hwc19xdWV1ZShuZXRkZXYsIGdldF9jcHVfbWFzayhjLT5jcHUpLCBpeCk7CiAJKmNwID0gYzsKIAogCXJldHVybiAwOworZXJyX2Nsb3NlX3hkcF9zcToKKwltbHg1ZV9jbG9zZV9zcSgmYy0+eGRwX3NxKTsKIAogZXJyX2Nsb3NlX3NxczoKIAltbHg1ZV9jbG9zZV9zcXMoYyk7CkBAIC0xMjczLDkgKzE1NDEsMTMgQEAKIHN0YXRpYyB2b2lkIG1seDVlX2Nsb3NlX2NoYW5uZWwoc3RydWN0IG1seDVlX2NoYW5uZWwgKmMpCiB7CiAJbWx4NWVfY2xvc2VfcnEoJmMtPnJxKTsKKwlpZiAoYy0+eGRwKQorCQltbHg1ZV9jbG9zZV9zcSgmYy0+eGRwX3NxKTsKIAltbHg1ZV9jbG9zZV9zcXMoYyk7CiAJbWx4NWVfY2xvc2Vfc3EoJmMtPmljb3NxKTsKIAluYXBpX2Rpc2FibGUoJmMtPm5hcGkpOworCWlmIChjLT54ZHApCisJCW1seDVlX2Nsb3NlX2NxKCZjLT54ZHBfc3EuY3EpOwogCW1seDVlX2Nsb3NlX2NxKCZjLT5ycS5jcSk7CiAJbWx4NWVfY2xvc2VfdHhfY3FzKGMpOwogCW1seDVlX2Nsb3NlX2NxKCZjLT5pY29zcS5jcSk7CkBAIC0xMzQ5LDYgKzE2MjEsNyBAQAogCiAJcGFyYW0tPm1heF9pbmxpbmUgPSBwcml2LT5wYXJhbXMudHhfbWF4X2lubGluZTsKIAlwYXJhbS0+bWluX2lubGluZV9tb2RlID0gcHJpdi0+cGFyYW1zLnR4X21pbl9pbmxpbmVfbW9kZTsKKwlwYXJhbS0+dHlwZSA9IE1MWDVFX1NRX1RYUTsKIH0KIAogc3RhdGljIHZvaWQgbWx4NWVfYnVpbGRfY29tbW9uX2NxX3BhcmFtKHN0cnVjdCBtbHg1ZV9wcml2ICpwcml2LApAQCAtMTQyMiw3ICsxNjk1LDIyIEBACiAJTUxYNV9TRVQod3EsIHdxLCBsb2dfd3Ffc3osIGxvZ193cV9zaXplKTsKIAlNTFg1X1NFVChzcWMsIHNxYywgcmVnX3VtciwgTUxYNV9DQVBfRVRIKHByaXYtPm1kZXYsIHJlZ191bXJfc3EpKTsKIAotCXBhcmFtLT5pY29zcSA9IHRydWU7CisJcGFyYW0tPnR5cGUgPSBNTFg1RV9TUV9JQ087Cit9CisKK3N0YXRpYyB2b2lkIG1seDVlX2J1aWxkX3hkcHNxX3BhcmFtKHN0cnVjdCBtbHg1ZV9wcml2ICpwcml2LAorCQkJCSAgICBzdHJ1Y3QgbWx4NWVfc3FfcGFyYW0gKnBhcmFtKQoreworCXZvaWQgKnNxYyA9IHBhcmFtLT5zcWM7CisJdm9pZCAqd3EgPSBNTFg1X0FERFJfT0Yoc3FjLCBzcWMsIHdxKTsKKworCW1seDVlX2J1aWxkX3NxX3BhcmFtX2NvbW1vbihwcml2LCBwYXJhbSk7CisJTUxYNV9TRVQod3EsIHdxLCBsb2dfd3Ffc3osICAgICBwcml2LT5wYXJhbXMubG9nX3NxX3NpemUpOworCisJcGFyYW0tPm1heF9pbmxpbmUgPSBwcml2LT5wYXJhbXMudHhfbWF4X2lubGluZTsKKwkvKiBGT1IgWERQIFNRcyB3aWxsIHN1cHBvcnQgb25seSBMMiBpbmxpbmUgbW9kZSAqLworCXBhcmFtLT5taW5faW5saW5lX21vZGUgPSBNTFg1X0lOTElORV9NT0RFX05PTkU7CisJcGFyYW0tPnR5cGUgPSBNTFg1RV9TUV9YRFA7CiB9CiAKIHN0YXRpYyB2b2lkIG1seDVlX2J1aWxkX2NoYW5uZWxfcGFyYW0oc3RydWN0IG1seDVlX3ByaXYgKnByaXYsIHN0cnVjdCBtbHg1ZV9jaGFubmVsX3BhcmFtICpjcGFyYW0pCkBAIC0xNDMxLDYgKzE3MTksNyBAQAogCiAJbWx4NWVfYnVpbGRfcnFfcGFyYW0ocHJpdiwgJmNwYXJhbS0+cnEpOwogCW1seDVlX2J1aWxkX3NxX3BhcmFtKHByaXYsICZjcGFyYW0tPnNxKTsKKwltbHg1ZV9idWlsZF94ZHBzcV9wYXJhbShwcml2LCAmY3BhcmFtLT54ZHBfc3EpOwogCW1seDVlX2J1aWxkX2ljb3NxX3BhcmFtKHByaXYsICZjcGFyYW0tPmljb3NxLCBpY29zcV9sb2dfd3Ffc3opOwogCW1seDVlX2J1aWxkX3J4X2NxX3BhcmFtKHByaXYsICZjcGFyYW0tPnJ4X2NxKTsKIAltbHg1ZV9idWlsZF90eF9jcV9wYXJhbShwcml2LCAmY3BhcmFtLT50eF9jcSk7CkBAIC0xODI2LDEwICsyMTE1LDYgQEAKIAluZXRpZl9zZXRfcmVhbF9udW1fdHhfcXVldWVzKG5ldGRldiwgbnVtX3R4cXMpOwogCW5ldGlmX3NldF9yZWFsX251bV9yeF9xdWV1ZXMobmV0ZGV2LCBwcml2LT5wYXJhbXMubnVtX2NoYW5uZWxzKTsKIAotCWVyciA9IG1seDVlX3NldF9kZXZfcG9ydF9tdHUobmV0ZGV2KTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9jbGVhcl9zdGF0ZV9vcGVuZWRfZmxhZzsKLQogCWVyciA9IG1seDVlX29wZW5fY2hhbm5lbHMocHJpdik7CiAJaWYgKGVycikgewogCQluZXRkZXZfZXJyKG5ldGRldiwgIiVzOiBtbHg1ZV9vcGVuX2NoYW5uZWxzIGZhaWxlZCwgJWRcbiIsCkBAIC0xOTA4LDYgKzIxOTMsOSBAQAogCXN0cnVjdCBtbHg1ZV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlpbnQgZXJyOwogCisJaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChuZXRkZXYpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCW11dGV4X2xvY2soJnByaXYtPnN0YXRlX2xvY2spOwogCWVyciA9IG1seDVlX2Nsb3NlX2xvY2tlZChuZXRkZXYpOwogCW11dGV4X3VubG9jaygmcHJpdi0+c3RhdGVfbG9jayk7CkBAIC0yMDIyLDE0ICsyMzEwLDE1IEBACiBzdGF0aWMgaW50IG1seDVlX2NyZWF0ZV90aXMoc3RydWN0IG1seDVlX3ByaXYgKnByaXYsIGludCB0YykKIHsKIAlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiA9IHByaXYtPm1kZXY7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcoY3JlYXRlX3Rpc19pbildOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGNyZWF0ZV90aXNfaW4pXSA9IHswfTsKIAl2b2lkICp0aXNjID0gTUxYNV9BRERSX09GKGNyZWF0ZV90aXNfaW4sIGluLCBjdHgpOwogCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKLQogCU1MWDVfU0VUKHRpc2MsIHRpc2MsIHByaW8sIHRjIDw8IDEpOwogCU1MWDVfU0VUKHRpc2MsIHRpc2MsIHRyYW5zcG9ydF9kb21haW4sIG1kZXYtPm1seDVlX3Jlcy50ZC50ZG4pOwogCisJaWYgKG1seDVfbGFnX2lzX2xhY3Bfb3duZXIobWRldikpCisJCU1MWDVfU0VUKHRpc2MsIHRpc2MsIHN0cmljdF9sYWdfdHhfcG9ydF9hZmZpbml0eSwgMSk7CisKIAlyZXR1cm4gbWx4NV9jb3JlX2NyZWF0ZV90aXMobWRldiwgaW4sIHNpemVvZihpbiksICZwcml2LT50aXNuW3RjXSk7CiB9CiAKQEAgLTI1NzMsNiArMjg2Miw3IEBACiAJdTE2IG1heF9tdHU7CiAJdTE2IG1pbl9tdHU7CiAJaW50IGVyciA9IDA7CisJYm9vbCByZXNldDsKIAogCW1seDVfcXVlcnlfcG9ydF9tYXhfbXR1KG1kZXYsICZtYXhfbXR1LCAxKTsKIApAQCAtMjU4OCwxMyArMjg3OCwxOCBAQAogCiAJbXV0ZXhfbG9jaygmcHJpdi0+c3RhdGVfbG9jayk7CiAKKwlyZXNldCA9ICFwcml2LT5wYXJhbXMubHJvX2VuICYmCisJCShwcml2LT5wYXJhbXMucnFfd3FfdHlwZSAhPQorCQkgTUxYNV9XUV9UWVBFX0xJTktFRF9MSVNUX1NUUklESU5HX1JRKTsKKwogCXdhc19vcGVuZWQgPSB0ZXN0X2JpdChNTFg1RV9TVEFURV9PUEVORUQsICZwcml2LT5zdGF0ZSk7Ci0JaWYgKHdhc19vcGVuZWQpCisJaWYgKHdhc19vcGVuZWQgJiYgcmVzZXQpCiAJCW1seDVlX2Nsb3NlX2xvY2tlZChuZXRkZXYpOwogCiAJbmV0ZGV2LT5tdHUgPSBuZXdfbXR1OworCW1seDVlX3NldF9kZXZfcG9ydF9tdHUobmV0ZGV2KTsKIAotCWlmICh3YXNfb3BlbmVkKQorCWlmICh3YXNfb3BlbmVkICYmIHJlc2V0KQogCQllcnIgPSBtbHg1ZV9vcGVuX2xvY2tlZChuZXRkZXYpOwogCiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5zdGF0ZV9sb2NrKTsKQEAgLTI2MjIsMTEgKzI5MTcsMTUgQEAKIAlyZXR1cm4gbWx4NV9lc3dpdGNoX3NldF92cG9ydF9tYWMobWRldi0+cHJpdi5lc3dpdGNoLCB2ZiArIDEsIG1hYyk7CiB9CiAKLXN0YXRpYyBpbnQgbWx4NWVfc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHZmLCB1MTYgdmxhbiwgdTggcW9zKQorc3RhdGljIGludCBtbHg1ZV9zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdmYsIHUxNiB2bGFuLCB1OCBxb3MsCisJCQkgICAgIF9fYmUxNiB2bGFuX3Byb3RvKQogewogCXN0cnVjdCBtbHg1ZV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiA9IHByaXYtPm1kZXY7CiAKKwlpZiAodmxhbl9wcm90byAhPSBodG9ucyhFVEhfUF84MDIxUSkpCisJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOworCiAJcmV0dXJuIG1seDVfZXN3aXRjaF9zZXRfdnBvcnRfdmxhbihtZGV2LT5wcml2LmVzd2l0Y2gsIHZmICsgMSwKIAkJCQkJICAgdmxhbiwgcW9zKTsKIH0KQEAgLTI3OTQsNyArMzA5Myw3IEBACiAJCWlmICghbmV0aWZfeG1pdF9zdG9wcGVkKG5ldGRldl9nZXRfdHhfcXVldWUoZGV2LCBpKSkpCiAJCQljb250aW51ZTsKIAkJc2NoZWRfd29yayA9IHRydWU7Ci0JCXNldF9iaXQoTUxYNUVfU1FfU1RBVEVfVFhfVElNRU9VVCwgJnNxLT5zdGF0ZSk7CisJCXNldF9iaXQoTUxYNUVfU1FfU1RBVEVfRkxVU0gsICZzcS0+c3RhdGUpOwogCQluZXRkZXZfZXJyKGRldiwgIlRYIHRpbWVvdXQgb24gcXVldWU6ICVkLCBTUTogMHgleCwgQ1E6IDB4JXgsIFNRIENvbnM6IDB4JXggU1EgUHJvZDogMHgleFxuIiwKIAkJCSAgIGksIHNxLT5zcW4sIHNxLT5jcS5tY3EuY3FuLCBzcS0+Y2MsIHNxLT5wYyk7CiAJfQpAQCAtMjgwMyw2ICszMTAyLDEwNiBAQAogCQlzY2hlZHVsZV93b3JrKCZwcml2LT50eF90aW1lb3V0X3dvcmspOwogfQogCitzdGF0aWMgaW50IG1seDVlX3hkcF9zZXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGJwZl9wcm9nICpwcm9nKQoreworCXN0cnVjdCBtbHg1ZV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYnBmX3Byb2cgKm9sZF9wcm9nOworCWludCBlcnIgPSAwOworCWJvb2wgcmVzZXQsIHdhc19vcGVuZWQ7CisJaW50IGk7CisKKwltdXRleF9sb2NrKCZwcml2LT5zdGF0ZV9sb2NrKTsKKworCWlmICgobmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfTFJPKSAmJiBwcm9nKSB7CisJCW5ldGRldl93YXJuKG5ldGRldiwgImNhbid0IHNldCBYRFAgd2hpbGUgTFJPIGlzIG9uLCBkaXNhYmxlIExSTyBmaXJzdFxuIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gdW5sb2NrOworCX0KKworCXdhc19vcGVuZWQgPSB0ZXN0X2JpdChNTFg1RV9TVEFURV9PUEVORUQsICZwcml2LT5zdGF0ZSk7CisJLyogbm8gbmVlZCBmb3IgZnVsbCByZXNldCB3aGVuIGV4Y2hhbmdpbmcgcHJvZ3JhbXMgKi8KKwlyZXNldCA9ICghcHJpdi0+eGRwX3Byb2cgfHwgIXByb2cpOworCisJaWYgKHdhc19vcGVuZWQgJiYgcmVzZXQpCisJCW1seDVlX2Nsb3NlX2xvY2tlZChuZXRkZXYpOworCisJLyogZXhjaGFuZ2UgcHJvZ3JhbXMgKi8KKwlvbGRfcHJvZyA9IHhjaGcoJnByaXYtPnhkcF9wcm9nLCBwcm9nKTsKKwlpZiAocHJvZykKKwkJYnBmX3Byb2dfYWRkKHByb2csIDEpOworCWlmIChvbGRfcHJvZykKKwkJYnBmX3Byb2dfcHV0KG9sZF9wcm9nKTsKKworCWlmIChyZXNldCkgLyogY2hhbmdlIFJRIHR5cGUgYWNjb3JkaW5nIHRvIHByaXYtPnhkcF9wcm9nICovCisJCW1seDVlX3NldF9ycV9wcml2X3BhcmFtcyhwcml2KTsKKworCWlmICh3YXNfb3BlbmVkICYmIHJlc2V0KQorCQltbHg1ZV9vcGVuX2xvY2tlZChuZXRkZXYpOworCisJaWYgKCF0ZXN0X2JpdChNTFg1RV9TVEFURV9PUEVORUQsICZwcml2LT5zdGF0ZSkgfHwgcmVzZXQpCisJCWdvdG8gdW5sb2NrOworCisJLyogZXhjaGFuZ2luZyBwcm9ncmFtcyB3L28gcmVzZXQsIHdlIHVwZGF0ZSByZWYgY291bnRzIG9uIGJlaGFsZgorCSAqIG9mIHRoZSBjaGFubmVscyBSUXMgaGVyZS4KKwkgKi8KKwlicGZfcHJvZ19hZGQocHJvZywgcHJpdi0+cGFyYW1zLm51bV9jaGFubmVscyk7CisJZm9yIChpID0gMDsgaSA8IHByaXYtPnBhcmFtcy5udW1fY2hhbm5lbHM7IGkrKykgeworCQlzdHJ1Y3QgbWx4NWVfY2hhbm5lbCAqYyA9IHByaXYtPmNoYW5uZWxbaV07CisKKwkJc2V0X2JpdChNTFg1RV9SUV9TVEFURV9GTFVTSCwgJmMtPnJxLnN0YXRlKTsKKwkJbmFwaV9zeW5jaHJvbml6ZSgmYy0+bmFwaSk7CisJCS8qIHByZXZlbnQgbWx4NWVfcG9sbF9yeF9jcSBmcm9tIGFjY2Vzc2luZyBycS0+eGRwX3Byb2cgKi8KKworCQlvbGRfcHJvZyA9IHhjaGcoJmMtPnJxLnhkcF9wcm9nLCBwcm9nKTsKKworCQljbGVhcl9iaXQoTUxYNUVfUlFfU1RBVEVfRkxVU0gsICZjLT5ycS5zdGF0ZSk7CisJCS8qIG5hcGlfc2NoZWR1bGUgaW4gY2FzZSB3ZSBoYXZlIG1pc3NlZCBhbnl0aGluZyAqLworCQlzZXRfYml0KE1MWDVFX0NIQU5ORUxfTkFQSV9TQ0hFRCwgJmMtPmZsYWdzKTsKKwkJbmFwaV9zY2hlZHVsZSgmYy0+bmFwaSk7CisKKwkJaWYgKG9sZF9wcm9nKQorCQkJYnBmX3Byb2dfcHV0KG9sZF9wcm9nKTsKKwl9CisKK3VubG9jazoKKwltdXRleF91bmxvY2soJnByaXYtPnN0YXRlX2xvY2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBib29sIG1seDVlX3hkcF9hdHRhY2hlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtbHg1ZV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiAhIXByaXYtPnhkcF9wcm9nOworfQorCitzdGF0aWMgaW50IG1seDVlX3hkcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmV0ZGV2X3hkcCAqeGRwKQoreworCXN3aXRjaCAoeGRwLT5jb21tYW5kKSB7CisJY2FzZSBYRFBfU0VUVVBfUFJPRzoKKwkJcmV0dXJuIG1seDVlX3hkcF9zZXQoZGV2LCB4ZHAtPnByb2cpOworCWNhc2UgWERQX1FVRVJZX1BST0c6CisJCXhkcC0+cHJvZ19hdHRhY2hlZCA9IG1seDVlX3hkcF9hdHRhY2hlZChkZXYpOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorLyogRmFrZSAiaW50ZXJydXB0IiBjYWxsZWQgYnkgbmV0cG9sbCAoZWcgbmV0Y29uc29sZSkgdG8gc2VuZCBza2JzIHdpdGhvdXQKKyAqIHJlZW5hYmxpbmcgaW50ZXJydXB0cy4KKyAqLworc3RhdGljIHZvaWQgbWx4NWVfbmV0cG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtbHg1ZV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwcml2LT5wYXJhbXMubnVtX2NoYW5uZWxzOyBpKyspCisJCW5hcGlfc2NoZWR1bGUoJnByaXYtPmNoYW5uZWxbaV0tPm5hcGkpOworfQorI2VuZGlmCisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgbWx4NWVfbmV0ZGV2X29wc19iYXNpYyA9IHsKIAkubmRvX29wZW4gICAgICAgICAgICAgICAgPSBtbHg1ZV9vcGVuLAogCS5uZG9fc3RvcCAgICAgICAgICAgICAgICA9IG1seDVlX2Nsb3NlLApAQCAtMjgyMiw2ICszMjIxLDEwIEBACiAJLm5kb19yeF9mbG93X3N0ZWVyCSA9IG1seDVlX3J4X2Zsb3dfc3RlZXIsCiAjZW5kaWYKIAkubmRvX3R4X3RpbWVvdXQgICAgICAgICAgPSBtbHg1ZV90eF90aW1lb3V0LAorCS5uZG9feGRwCQkgPSBtbHg1ZV94ZHAsCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwkubmRvX3BvbGxfY29udHJvbGxlciAgICAgPSBtbHg1ZV9uZXRwb2xsLAorI2VuZGlmCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIG1seDVlX25ldGRldl9vcHNfc3Jpb3YgPSB7CkBAIC0yODUzLDYgKzMyNTYsMTAgQEAKIAkubmRvX3NldF92Zl9saW5rX3N0YXRlICAgPSBtbHg1ZV9zZXRfdmZfbGlua19zdGF0ZSwKIAkubmRvX2dldF92Zl9zdGF0cyAgICAgICAgPSBtbHg1ZV9nZXRfdmZfc3RhdHMsCiAJLm5kb190eF90aW1lb3V0ICAgICAgICAgID0gbWx4NWVfdHhfdGltZW91dCwKKwkubmRvX3hkcAkJID0gbWx4NWVfeGRwLAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJLm5kb19wb2xsX2NvbnRyb2xsZXIgICAgID0gbWx4NWVfbmV0cG9sbCwKKyNlbmRpZgogfTsKIAogc3RhdGljIGludCBtbHg1ZV9jaGVja19yZXF1aXJlZF9oY2FfY2FwKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2KQpAQCAtMjkyNywxMyArMzMzNCw2IEBACiAJCWluZGlyZWN0aW9uX3JxdFtpXSA9IGkgJSBudW1fY2hhbm5lbHM7CiB9CiAKLXN0YXRpYyBib29sIG1seDVlX2NoZWNrX2ZyYWdtZW50ZWRfc3RyaWRpbmdfcnFfY2FwKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2KQotewotCXJldHVybiBNTFg1X0NBUF9HRU4obWRldiwgc3RyaWRpbmdfcnEpICYmCi0JCU1MWDVfQ0FQX0dFTihtZGV2LCB1bXJfcHRyX3Jsa3kpICYmCi0JCU1MWDVfQ0FQX0VUSChtZGV2LCByZWdfdW1yX3NxKTsKLX0KLQogc3RhdGljIGludCBtbHg1ZV9nZXRfcGNpX2J3KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LCB1MzIgKnBjaV9idykKIHsKIAllbnVtIHBjaWVfbGlua193aWR0aCB3aWR0aDsKQEAgLTMwMTMsMTEgKzM0MTMsMTMgQEAKIAkJCQkJIE1MWDVfQ1FfUEVSSU9EX01PREVfU1RBUlRfRlJPTV9DUUUgOgogCQkJCQkgTUxYNV9DUV9QRVJJT0RfTU9ERV9TVEFSVF9GUk9NX0VRRTsKIAotCXByaXYtPnBhcmFtcy5sb2dfc3Ffc2l6ZSAgICAgICAgICAgPQotCQlNTFg1RV9QQVJBTVNfREVGQVVMVF9MT0dfU1FfU0laRTsKLQlwcml2LT5wYXJhbXMucnFfd3FfdHlwZSA9IG1seDVlX2NoZWNrX2ZyYWdtZW50ZWRfc3RyaWRpbmdfcnFfY2FwKG1kZXYpID8KLQkJTUxYNV9XUV9UWVBFX0xJTktFRF9MSVNUX1NUUklESU5HX1JRIDoKLQkJTUxYNV9XUV9UWVBFX0xJTktFRF9MSVNUOworCXByaXYtPm1kZXYgICAgICAgICAgICAgICAgICAgICAgICAgPSBtZGV2OworCXByaXYtPm5ldGRldiAgICAgICAgICAgICAgICAgICAgICAgPSBuZXRkZXY7CisJcHJpdi0+cGFyYW1zLm51bV9jaGFubmVscyAgICAgICAgICA9IHByb2ZpbGUtPm1heF9uY2gobWRldik7CisJcHJpdi0+cHJvZmlsZSAgICAgICAgICAgICAgICAgICAgICA9IHByb2ZpbGU7CisJcHJpdi0+cHByaXYgICAgICAgICAgICAgICAgICAgICAgICA9IHBwcml2OworCisJcHJpdi0+cGFyYW1zLmxvZ19zcV9zaXplID0gTUxYNUVfUEFSQU1TX0RFRkFVTFRfTE9HX1NRX1NJWkU7CiAKIAkvKiBzZXQgQ1FFIGNvbXByZXNzaW9uICovCiAJcHJpdi0+cGFyYW1zLnJ4X2NxZV9jb21wcmVzc19hZG1pbiA9IGZhbHNlOwpAQCAtMzAzMCwzMyArMzQzMiwxMSBAQAogCQlwcml2LT5wYXJhbXMucnhfY3FlX2NvbXByZXNzX2FkbWluID0KIAkJCWNxZV9jb21wcmVzc19oZXVyaXN0aWMobGlua19zcGVlZCwgcGNpX2J3KTsKIAl9Ci0KIAlwcml2LT5wYXJhbXMucnhfY3FlX2NvbXByZXNzID0gcHJpdi0+cGFyYW1zLnJ4X2NxZV9jb21wcmVzc19hZG1pbjsKIAotCXN3aXRjaCAocHJpdi0+cGFyYW1zLnJxX3dxX3R5cGUpIHsKLQljYXNlIE1MWDVfV1FfVFlQRV9MSU5LRURfTElTVF9TVFJJRElOR19SUToKLQkJcHJpdi0+cGFyYW1zLmxvZ19ycV9zaXplID0gTUxYNUVfUEFSQU1TX0RFRkFVTFRfTE9HX1JRX1NJWkVfTVBXOwotCQlwcml2LT5wYXJhbXMubXB3cWVfbG9nX3N0cmlkZV9zeiA9Ci0JCQlwcml2LT5wYXJhbXMucnhfY3FlX2NvbXByZXNzID8KLQkJCU1MWDVfTVBXUlFfTE9HX1NUUklERV9TSVpFX0NRRV9DT01QUkVTUyA6Ci0JCQlNTFg1X01QV1JRX0xPR19TVFJJREVfU0laRTsKLQkJcHJpdi0+cGFyYW1zLm1wd3FlX2xvZ19udW1fc3RyaWRlcyA9IE1MWDVfTVBXUlFfTE9HX1dRRV9TWiAtCi0JCQlwcml2LT5wYXJhbXMubXB3cWVfbG9nX3N0cmlkZV9zejsKKwltbHg1ZV9zZXRfcnFfcHJpdl9wYXJhbXMocHJpdik7CisJaWYgKHByaXYtPnBhcmFtcy5ycV93cV90eXBlID09IE1MWDVfV1FfVFlQRV9MSU5LRURfTElTVF9TVFJJRElOR19SUSkKIAkJcHJpdi0+cGFyYW1zLmxyb19lbiA9IHRydWU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6IC8qIE1MWDVfV1FfVFlQRV9MSU5LRURfTElTVCAqLwotCQlwcml2LT5wYXJhbXMubG9nX3JxX3NpemUgPSBNTFg1RV9QQVJBTVNfREVGQVVMVF9MT0dfUlFfU0laRTsKLQl9Ci0KLQltbHg1X2NvcmVfaW5mbyhtZGV2LAotCQkgICAgICAgIk1MWDVFOiBTdHJkUnEoJWQpIFJxU3ooJWxkKSBTdHJkU3ooJWxkKSBSeENxZUNtcHJzcyglZClcbiIsCi0JCSAgICAgICBwcml2LT5wYXJhbXMucnFfd3FfdHlwZSA9PSBNTFg1X1dRX1RZUEVfTElOS0VEX0xJU1RfU1RSSURJTkdfUlEsCi0JCSAgICAgICBCSVQocHJpdi0+cGFyYW1zLmxvZ19ycV9zaXplKSwKLQkJICAgICAgIEJJVChwcml2LT5wYXJhbXMubXB3cWVfbG9nX3N0cmlkZV9zeiksCi0JCSAgICAgICBwcml2LT5wYXJhbXMucnhfY3FlX2NvbXByZXNzX2FkbWluKTsKLQotCXByaXYtPnBhcmFtcy5taW5fcnhfd3FlcyA9IG1seDVfbWluX3J4X3dxZXMocHJpdi0+cGFyYW1zLnJxX3dxX3R5cGUsCi0JCQkJCSAgICBCSVQocHJpdi0+cGFyYW1zLmxvZ19ycV9zaXplKSk7CiAKIAlwcml2LT5wYXJhbXMucnhfYW1fZW5hYmxlZCA9IE1MWDVfQ0FQX0dFTihtZGV2LCBjcV9tb2RlcmF0aW9uKTsKIAltbHg1ZV9zZXRfcnhfY3FfbW9kZV9wYXJhbXMoJnByaXYtPnBhcmFtcywgY3FfcGVyaW9kX21vZGUpOwpAQCAtMzA3NiwxOSArMzQ1NiwxNiBAQAogCW1seDVlX2J1aWxkX2RlZmF1bHRfaW5kaXJfcnF0KG1kZXYsIHByaXYtPnBhcmFtcy5pbmRpcmVjdGlvbl9ycXQsCiAJCQkJICAgICAgTUxYNUVfSU5ESVJfUlFUX1NJWkUsIHByb2ZpbGUtPm1heF9uY2gobWRldikpOwogCi0JcHJpdi0+cGFyYW1zLmxyb193cWVfc3ogICAgICAgICAgICA9Ci0JCU1MWDVFX1BBUkFNU19ERUZBVUxUX0xST19XUUVfU1o7CisJcHJpdi0+cGFyYW1zLmxyb193cWVfc3ogPQorCQlNTFg1RV9QQVJBTVNfREVGQVVMVF9MUk9fV1FFX1NaIC0KKwkJLyogRXh0cmEgcm9vbSBuZWVkZWQgZm9yIGJ1aWxkX3NrYiAqLworCQlNTFg1X1JYX0hFQURST09NIC0KKwkJU0tCX0RBVEFfQUxJR04oc2l6ZW9mKHN0cnVjdCBza2Jfc2hhcmVkX2luZm8pKTsKIAogCS8qIEluaXRpYWxpemUgcGZsYWdzICovCiAJTUxYNUVfU0VUX1BSSVZfRkxBRyhwcml2LCBNTFg1RV9QRkxBR19SWF9DUUVfQkFTRURfTU9ERVIsCiAJCQkgICAgcHJpdi0+cGFyYW1zLnJ4X2NxX3BlcmlvZF9tb2RlID09IE1MWDVfQ1FfUEVSSU9EX01PREVfU1RBUlRfRlJPTV9DUUUpOwogCi0JcHJpdi0+bWRldiAgICAgICAgICAgICAgICAgICAgICAgICA9IG1kZXY7Ci0JcHJpdi0+bmV0ZGV2ICAgICAgICAgICAgICAgICAgICAgICA9IG5ldGRldjsKLQlwcml2LT5wYXJhbXMubnVtX2NoYW5uZWxzICAgICAgICAgID0gcHJvZmlsZS0+bWF4X25jaChtZGV2KTsKLQlwcml2LT5wcm9maWxlICAgICAgICAgICAgICAgICAgICAgID0gcHJvZmlsZTsKLQlwcml2LT5wcHJpdiAgICAgICAgICAgICAgICAgICAgICAgID0gcHByaXY7Ci0KICNpZmRlZiBDT05GSUdfTUxYNV9DT1JFX0VOX0RDQgogCW1seDVlX2V0c19pbml0KHByaXYpOwogI2VuZGlmCkBAIC0zMjI4LDM1ICszNjA1LDM3IEBACiBzdGF0aWMgaW50IG1seDVlX2NyZWF0ZV91bXJfbWtleShzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdikKIHsKIAlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiA9IHByaXYtPm1kZXY7Ci0Jc3RydWN0IG1seDVfY3JlYXRlX21rZXlfbWJveF9pbiAqaW47Ci0Jc3RydWN0IG1seDVfbWtleV9zZWcgKm1rYzsKLQlpbnQgaW5sZW4gPSBzaXplb2YoKmluKTsKLQl1NjQgbnBhZ2VzID0KLQkJcHJpdi0+cHJvZmlsZS0+bWF4X25jaChtZGV2KSAqIE1MWDVfQ0hBTk5FTF9NQVhfTlVNX01UVFM7CisJdTY0IG5wYWdlcyA9IE1MWDVFX1JFUVVJUkVEX01UVFMocHJpdi0+cHJvZmlsZS0+bWF4X25jaChtZGV2KSwKKwkJCQkJIEJJVChNTFg1RV9QQVJBTVNfTUFYSU1VTV9MT0dfUlFfU0laRV9NUFcpKTsKKwlpbnQgaW5sZW4gPSBNTFg1X1NUX1NaX0JZVEVTKGNyZWF0ZV9ta2V5X2luKTsKKwl2b2lkICpta2M7CisJdTMyICppbjsKIAlpbnQgZXJyOwogCiAJaW4gPSBtbHg1X3Z6YWxsb2MoaW5sZW4pOwogCWlmICghaW4pCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbWtjID0gJmluLT5zZWc7Ci0JbWtjLT5zdGF0dXMgPSBNTFg1X01LRVlfU1RBVFVTX0ZSRUU7Ci0JbWtjLT5mbGFncyA9IE1MWDVfUEVSTV9VTVJfRU4gfAotCQkgICAgIE1MWDVfUEVSTV9MT0NBTF9SRUFEIHwKLQkJICAgICBNTFg1X1BFUk1fTE9DQUxfV1JJVEUgfAotCQkgICAgIE1MWDVfQUNDRVNTX01PREVfTVRUOworCW1rYyA9IE1MWDVfQUREUl9PRihjcmVhdGVfbWtleV9pbiwgaW4sIG1lbW9yeV9rZXlfbWtleV9lbnRyeSk7CiAKLQlta2MtPnFwbl9ta2V5N18wID0gY3B1X3RvX2JlMzIoMHhmZmZmZmYgPDwgOCk7Ci0JbWtjLT5mbGFnc19wZCA9IGNwdV90b19iZTMyKG1kZXYtPm1seDVlX3Jlcy5wZG4pOwotCW1rYy0+bGVuID0gY3B1X3RvX2JlNjQobnBhZ2VzIDw8IFBBR0VfU0hJRlQpOwotCW1rYy0+eGx0X29jdF9zaXplID0gY3B1X3RvX2JlMzIobWx4NWVfZ2V0X210dF9vY3R3KG5wYWdlcykpOwotCW1rYy0+bG9nMl9wYWdlX3NpemUgPSBQQUdFX1NISUZUOworCW5wYWdlcyA9IG1pbl90KHUzMiwgQUxJR04oVTE2X01BWCwgNCkgKiAyLCBucGFnZXMpOwogCi0JZXJyID0gbWx4NV9jb3JlX2NyZWF0ZV9ta2V5KG1kZXYsICZwcml2LT51bXJfbWtleSwgaW4sIGlubGVuLCBOVUxMLAotCQkJCSAgICBOVUxMLCBOVUxMKTsKKwlNTFg1X1NFVChta2MsIG1rYywgZnJlZSwgMSk7CisJTUxYNV9TRVQobWtjLCBta2MsIHVtcl9lbiwgMSk7CisJTUxYNV9TRVQobWtjLCBta2MsIGx3LCAxKTsKKwlNTFg1X1NFVChta2MsIG1rYywgbHIsIDEpOworCU1MWDVfU0VUKG1rYywgbWtjLCBhY2Nlc3NfbW9kZSwgTUxYNV9NS0NfQUNDRVNTX01PREVfTVRUKTsKKworCU1MWDVfU0VUKG1rYywgbWtjLCBxcG4sIDB4ZmZmZmZmKTsKKwlNTFg1X1NFVChta2MsIG1rYywgcGQsIG1kZXYtPm1seDVlX3Jlcy5wZG4pOworCU1MWDVfU0VUNjQobWtjLCBta2MsIGxlbiwgbnBhZ2VzIDw8IFBBR0VfU0hJRlQpOworCU1MWDVfU0VUKG1rYywgbWtjLCB0cmFuc2xhdGlvbnNfb2N0d29yZF9zaXplLAorCQkgTUxYNV9NVFRfT0NUVyhucGFnZXMpKTsKKwlNTFg1X1NFVChta2MsIG1rYywgbG9nX3BhZ2Vfc2l6ZSwgUEFHRV9TSElGVCk7CisKKwllcnIgPSBtbHg1X2NvcmVfY3JlYXRlX21rZXkobWRldiwgJnByaXYtPnVtcl9ta2V5LCBpbiwgaW5sZW4pOwogCiAJa3ZmcmVlKGluKTsKLQogCXJldHVybiBlcnI7CiB9CiAKQEAgLTMzNzUsNiArMzc1NCw4IEBACiAJc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3ID0gbWRldi0+cHJpdi5lc3dpdGNoOwogCXN0cnVjdCBtbHg1X2Vzd2l0Y2hfcmVwIHJlcDsKIAorCW1seDVfbGFnX2FkZChtZGV2LCBuZXRkZXYpOworCiAJaWYgKG1seDVlX3Z4bGFuX2FsbG93ZWQobWRldikpIHsKIAkJcnRubF9sb2NrKCk7CiAJCXVkcF90dW5uZWxfZ2V0X3J4X2luZm8obmV0ZGV2KTsKQEAgLTMzODUsMTEgKzM3NjYsMTIgQEAKIAlxdWV1ZV93b3JrKHByaXYtPndxLCAmcHJpdi0+c2V0X3J4X21vZGVfd29yayk7CiAKIAlpZiAoTUxYNV9DQVBfR0VOKG1kZXYsIHZwb3J0X2dyb3VwX21hbmFnZXIpKSB7CisJCW1seDVfcXVlcnlfbmljX3Zwb3J0X21hY19hZGRyZXNzKG1kZXYsIDAsIHJlcC5od19pZCk7CiAJCXJlcC5sb2FkID0gbWx4NWVfbmljX3JlcF9sb2FkOwogCQlyZXAudW5sb2FkID0gbWx4NWVfbmljX3JlcF91bmxvYWQ7Ci0JCXJlcC52cG9ydCA9IDA7CisJCXJlcC52cG9ydCA9IEZEQl9VUExJTktfVlBPUlQ7CiAJCXJlcC5wcml2X2RhdGEgPSBwcml2OwotCQltbHg1X2Vzd2l0Y2hfcmVnaXN0ZXJfdnBvcnRfcmVwKGVzdywgJnJlcCk7CisJCW1seDVfZXN3aXRjaF9yZWdpc3Rlcl92cG9ydF9yZXAoZXN3LCAwLCAmcmVwKTsKIAl9CiB9CiAKQEAgLTMzOTcsNiArMzc3OSw3IEBACiB7CiAJcXVldWVfd29yayhwcml2LT53cSwgJnByaXYtPnNldF9yeF9tb2RlX3dvcmspOwogCW1seDVlX2Rpc2FibGVfYXN5bmNfZXZlbnRzKHByaXYpOworCW1seDVfbGFnX3JlbW92ZShwcml2LT5tZGV2KTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBtbHg1ZV9wcm9maWxlIG1seDVlX25pY19wcm9maWxlID0gewpAQCAtMzQxMywxMyArMzc5NiwxMyBAQAogCS5tYXhfdGMJCSAgID0gTUxYNUVfTUFYX05VTV9UQywKIH07CiAKLXZvaWQgKm1seDVlX2NyZWF0ZV9uZXRkZXYoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsCi0JCQkgIGNvbnN0IHN0cnVjdCBtbHg1ZV9wcm9maWxlICpwcm9maWxlLCB2b2lkICpwcHJpdikKK3N0cnVjdCBuZXRfZGV2aWNlICptbHg1ZV9jcmVhdGVfbmV0ZGV2KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbWx4NWVfcHJvZmlsZSAqcHJvZmlsZSwKKwkJCQkgICAgICAgdm9pZCAqcHByaXYpCiB7CisJaW50IG5jaCA9IHByb2ZpbGUtPm1heF9uY2gobWRldik7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKIAlzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdjsKLQlpbnQgbmNoID0gcHJvZmlsZS0+bWF4X25jaChtZGV2KTsKLQlpbnQgZXJyOwogCiAJbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXZfbXFzKHNpemVvZihzdHJ1Y3QgbWx4NWVfcHJpdiksCiAJCQkJICAgIG5jaCAqIHByb2ZpbGUtPm1heF90YywKQEAgLTM0MzcsMTIgKzM4MjAsMzEgQEAKIAogCXByaXYtPndxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoIm1seDVlIik7CiAJaWYgKCFwcml2LT53cSkKLQkJZ290byBlcnJfZnJlZV9uZXRkZXY7CisJCWdvdG8gZXJyX2NsZWFudXBfbmljOworCisJcmV0dXJuIG5ldGRldjsKKworZXJyX2NsZWFudXBfbmljOgorCXByb2ZpbGUtPmNsZWFudXAocHJpdik7CisJZnJlZV9uZXRkZXYobmV0ZGV2KTsKKworCXJldHVybiBOVUxMOworfQorCitpbnQgbWx4NWVfYXR0YWNoX25ldGRldihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwljb25zdCBzdHJ1Y3QgbWx4NWVfcHJvZmlsZSAqcHJvZmlsZTsKKwlzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdjsKKwlpbnQgZXJyOworCisJcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJcHJvZmlsZSA9IHByaXYtPnByb2ZpbGU7CisJY2xlYXJfYml0KE1MWDVFX1NUQVRFX0RFU1RST1lJTkcsICZwcml2LT5zdGF0ZSk7CiAKIAllcnIgPSBtbHg1ZV9jcmVhdGVfdW1yX21rZXkocHJpdik7CiAJaWYgKGVycikgewogCQltbHg1X2NvcmVfZXJyKG1kZXYsICJjcmVhdGUgdW1yIG1rZXkgZmFpbGVkLCAlZFxuIiwgZXJyKTsKLQkJZ290byBlcnJfZGVzdHJveV93cTsKKwkJZ290byBvdXQ7CiAJfQogCiAJZXJyID0gcHJvZmlsZS0+aW5pdF90eChwcml2KTsKQEAgLTM0NjMsMjAgKzM4NjUsMTggQEAKIAogCW1seDVlX2luaXRfbDJfYWRkcihwcml2KTsKIAotCWVyciA9IHJlZ2lzdGVyX25ldGRldihuZXRkZXYpOwotCWlmIChlcnIpIHsKLQkJbWx4NV9jb3JlX2VycihtZGV2LCAicmVnaXN0ZXJfbmV0ZGV2IGZhaWxlZCwgJWRcbiIsIGVycik7Ci0JCWdvdG8gZXJyX2RlYWxsb2NfcV9jb3VudGVyczsKLQl9CisJbWx4NWVfc2V0X2Rldl9wb3J0X210dShuZXRkZXYpOwogCiAJaWYgKHByb2ZpbGUtPmVuYWJsZSkKIAkJcHJvZmlsZS0+ZW5hYmxlKHByaXYpOwogCi0JcmV0dXJuIHByaXY7CisJcnRubF9sb2NrKCk7CisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJbWx4NWVfb3BlbihuZXRkZXYpOworCW5ldGlmX2RldmljZV9hdHRhY2gobmV0ZGV2KTsKKwlydG5sX3VubG9jaygpOwogCi1lcnJfZGVhbGxvY19xX2NvdW50ZXJzOgotCW1seDVlX2Rlc3Ryb3lfcV9jb3VudGVyKHByaXYpOwotCXByb2ZpbGUtPmNsZWFudXBfcngocHJpdik7CisJcmV0dXJuIDA7CiAKIGVycl9jbG9zZV9kcm9wX3JxOgogCW1seDVlX2Nsb3NlX2Ryb3BfcnEocHJpdik7CkBAIC0zNDg3LDEzICszODg3LDggQEAKIGVycl9kZXN0cm95X3Vtcl9ta2V5OgogCW1seDVfY29yZV9kZXN0cm95X21rZXkobWRldiwgJnByaXYtPnVtcl9ta2V5KTsKIAotZXJyX2Rlc3Ryb3lfd3E6Ci0JZGVzdHJveV93b3JrcXVldWUocHJpdi0+d3EpOwotCi1lcnJfZnJlZV9uZXRkZXY6Ci0JZnJlZV9uZXRkZXYobmV0ZGV2KTsKLQotCXJldHVybiBOVUxMOworb3V0OgorCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIG1seDVlX3JlZ2lzdGVyX3Zwb3J0X3JlcChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldikKQEAgLTM1MDEsNjEgKzM4OTYsNDAgQEAKIAlzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3cgPSBtZGV2LT5wcml2LmVzd2l0Y2g7CiAJaW50IHRvdGFsX3ZmcyA9IE1MWDVfVE9UQUxfVlBPUlRTKG1kZXYpOwogCWludCB2cG9ydDsKKwl1OCBtYWNbRVRIX0FMRU5dOwogCiAJaWYgKCFNTFg1X0NBUF9HRU4obWRldiwgdnBvcnRfZ3JvdXBfbWFuYWdlcikpCiAJCXJldHVybjsKIAorCW1seDVfcXVlcnlfbmljX3Zwb3J0X21hY19hZGRyZXNzKG1kZXYsIDAsIG1hYyk7CisKIAlmb3IgKHZwb3J0ID0gMTsgdnBvcnQgPCB0b3RhbF92ZnM7IHZwb3J0KyspIHsKIAkJc3RydWN0IG1seDVfZXN3aXRjaF9yZXAgcmVwOwogCiAJCXJlcC5sb2FkID0gbWx4NWVfdnBvcnRfcmVwX2xvYWQ7CiAJCXJlcC51bmxvYWQgPSBtbHg1ZV92cG9ydF9yZXBfdW5sb2FkOwogCQlyZXAudnBvcnQgPSB2cG9ydDsKLQkJbWx4NV9lc3dpdGNoX3JlZ2lzdGVyX3Zwb3J0X3JlcChlc3csICZyZXApOworCQlldGhlcl9hZGRyX2NvcHkocmVwLmh3X2lkLCBtYWMpOworCQltbHg1X2Vzd2l0Y2hfcmVnaXN0ZXJfdnBvcnRfcmVwKGVzdywgdnBvcnQsICZyZXApOwogCX0KIH0KIAotc3RhdGljIHZvaWQgKm1seDVlX2FkZChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldikKK3ZvaWQgbWx4NWVfZGV0YWNoX25ldGRldihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKLQlzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3cgPSBtZGV2LT5wcml2LmVzd2l0Y2g7Ci0Jdm9pZCAqcHByaXYgPSBOVUxMOwotCXZvaWQgKnJldDsKLQotCWlmIChtbHg1ZV9jaGVja19yZXF1aXJlZF9oY2FfY2FwKG1kZXYpKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChtbHg1ZV9jcmVhdGVfbWRldl9yZXNvdXJjZXMobWRldikpCi0JCXJldHVybiBOVUxMOwotCi0JbWx4NWVfcmVnaXN0ZXJfdnBvcnRfcmVwKG1kZXYpOwotCi0JaWYgKE1MWDVfQ0FQX0dFTihtZGV2LCB2cG9ydF9ncm91cF9tYW5hZ2VyKSkKLQkJcHByaXYgPSAmZXN3LT5vZmZsb2Fkcy52cG9ydF9yZXBzWzBdOwotCi0JcmV0ID0gbWx4NWVfY3JlYXRlX25ldGRldihtZGV2LCAmbWx4NWVfbmljX3Byb2ZpbGUsIHBwcml2KTsKLQlpZiAoIXJldCkgewotCQltbHg1ZV9kZXN0cm95X21kZXZfcmVzb3VyY2VzKG1kZXYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBtbHg1ZV9kZXN0cm95X25ldGRldihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwgc3RydWN0IG1seDVlX3ByaXYgKnByaXYpCi17CisJc3RydWN0IG1seDVlX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCWNvbnN0IHN0cnVjdCBtbHg1ZV9wcm9maWxlICpwcm9maWxlID0gcHJpdi0+cHJvZmlsZTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcHJpdi0+bmV0ZGV2OwogCiAJc2V0X2JpdChNTFg1RV9TVEFURV9ERVNUUk9ZSU5HLCAmcHJpdi0+c3RhdGUpOwogCWlmIChwcm9maWxlLT5kaXNhYmxlKQogCQlwcm9maWxlLT5kaXNhYmxlKHByaXYpOwogCiAJZmx1c2hfd29ya3F1ZXVlKHByaXYtPndxKTsKLQlpZiAodGVzdF9iaXQoTUxYNV9JTlRFUkZBQ0VfU1RBVEVfU0hVVERPV04sICZtZGV2LT5pbnRmX3N0YXRlKSkgewotCQluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldGRldik7CisKKwlydG5sX2xvY2soKTsKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQogCQltbHg1ZV9jbG9zZShuZXRkZXYpOwotCX0gZWxzZSB7Ci0JCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7Ci0JfQorCW5ldGlmX2RldmljZV9kZXRhY2gobmV0ZGV2KTsKKwlydG5sX3VubG9jaygpOwogCiAJbWx4NWVfZGVzdHJveV9xX2NvdW50ZXIocHJpdik7CiAJcHJvZmlsZS0+Y2xlYW51cF9yeChwcml2KTsKQEAgLTM1NjMsMTIgKzM5MzcsMTA5IEBACiAJcHJvZmlsZS0+Y2xlYW51cF90eChwcml2KTsKIAltbHg1X2NvcmVfZGVzdHJveV9ta2V5KHByaXYtPm1kZXYsICZwcml2LT51bXJfbWtleSk7CiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwcml2LT51cGRhdGVfc3RhdHNfd29yayk7Cit9CisKKy8qIG1seDVlX2F0dGFjaCBhbmQgbWx4NWVfZGV0YWNoIHNjb3BlIHNob3VsZCBiZSBvbmx5IGNyZWF0aW5nL2Rlc3Ryb3lpbmcKKyAqIGhhcmR3YXJlIGNvbnRleHRzIGFuZCB0byBjb25uZWN0IGl0IHRvIHRoZSBjdXJyZW50IG5ldGRldi4KKyAqLworc3RhdGljIGludCBtbHg1ZV9hdHRhY2goc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsIHZvaWQgKnZwcml2KQoreworCXN0cnVjdCBtbHg1ZV9wcml2ICpwcml2ID0gdnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHByaXYtPm5ldGRldjsKKwlpbnQgZXJyOworCisJaWYgKG5ldGlmX2RldmljZV9wcmVzZW50KG5ldGRldikpCisJCXJldHVybiAwOworCisJZXJyID0gbWx4NWVfY3JlYXRlX21kZXZfcmVzb3VyY2VzKG1kZXYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBtbHg1ZV9hdHRhY2hfbmV0ZGV2KG1kZXYsIG5ldGRldik7CisJaWYgKGVycikgeworCQltbHg1ZV9kZXN0cm95X21kZXZfcmVzb3VyY2VzKG1kZXYpOworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtbHg1ZV9kZXRhY2goc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsIHZvaWQgKnZwcml2KQoreworCXN0cnVjdCBtbHg1ZV9wcml2ICpwcml2ID0gdnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHByaXYtPm5ldGRldjsKKworCWlmICghbmV0aWZfZGV2aWNlX3ByZXNlbnQobmV0ZGV2KSkKKwkJcmV0dXJuOworCisJbWx4NWVfZGV0YWNoX25ldGRldihtZGV2LCBuZXRkZXYpOworCW1seDVlX2Rlc3Ryb3lfbWRldl9yZXNvdXJjZXMobWRldik7Cit9CisKK3N0YXRpYyB2b2lkICptbHg1ZV9hZGQoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYpCit7CisJc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3ID0gbWRldi0+cHJpdi5lc3dpdGNoOworCWludCB0b3RhbF92ZnMgPSBNTFg1X1RPVEFMX1ZQT1JUUyhtZGV2KTsKKwl2b2lkICpwcHJpdiA9IE5VTEw7CisJdm9pZCAqcHJpdjsKKwlpbnQgdnBvcnQ7CisJaW50IGVycjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCisJZXJyID0gbWx4NWVfY2hlY2tfcmVxdWlyZWRfaGNhX2NhcChtZGV2KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gTlVMTDsKKworCW1seDVlX3JlZ2lzdGVyX3Zwb3J0X3JlcChtZGV2KTsKKworCWlmIChNTFg1X0NBUF9HRU4obWRldiwgdnBvcnRfZ3JvdXBfbWFuYWdlcikpCisJCXBwcml2ID0gJmVzdy0+b2ZmbG9hZHMudnBvcnRfcmVwc1swXTsKKworCW5ldGRldiA9IG1seDVlX2NyZWF0ZV9uZXRkZXYobWRldiwgJm1seDVlX25pY19wcm9maWxlLCBwcHJpdik7CisJaWYgKCFuZXRkZXYpIHsKKwkJbWx4NV9jb3JlX2VycihtZGV2LCAibWx4NWVfY3JlYXRlX25ldGRldiBmYWlsZWRcbiIpOworCQlnb3RvIGVycl91bnJlZ2lzdGVyX3JlcHM7CisJfQorCisJcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwllcnIgPSBtbHg1ZV9hdHRhY2gobWRldiwgcHJpdik7CisJaWYgKGVycikgeworCQltbHg1X2NvcmVfZXJyKG1kZXYsICJtbHg1ZV9hdHRhY2ggZmFpbGVkLCAlZFxuIiwgZXJyKTsKKwkJZ290byBlcnJfZGVzdHJveV9uZXRkZXY7CisJfQorCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisJaWYgKGVycikgeworCQltbHg1X2NvcmVfZXJyKG1kZXYsICJyZWdpc3Rlcl9uZXRkZXYgZmFpbGVkLCAlZFxuIiwgZXJyKTsKKwkJZ290byBlcnJfZGV0YWNoOworCX0KKworCXJldHVybiBwcml2OworCitlcnJfZGV0YWNoOgorCW1seDVlX2RldGFjaChtZGV2LCBwcml2KTsKKworZXJyX2Rlc3Ryb3lfbmV0ZGV2OgorCW1seDVlX2Rlc3Ryb3lfbmV0ZGV2KG1kZXYsIHByaXYpOworCitlcnJfdW5yZWdpc3Rlcl9yZXBzOgorCWZvciAodnBvcnQgPSAxOyB2cG9ydCA8IHRvdGFsX3ZmczsgdnBvcnQrKykKKwkJbWx4NV9lc3dpdGNoX3VucmVnaXN0ZXJfdnBvcnRfcmVwKGVzdywgdnBvcnQpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgbWx4NWVfZGVzdHJveV9uZXRkZXYoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsIHN0cnVjdCBtbHg1ZV9wcml2ICpwcml2KQoreworCWNvbnN0IHN0cnVjdCBtbHg1ZV9wcm9maWxlICpwcm9maWxlID0gcHJpdi0+cHJvZmlsZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcHJpdi0+bmV0ZGV2OworCisJdW5yZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKIAlkZXN0cm95X3dvcmtxdWV1ZShwcml2LT53cSk7CiAJaWYgKHByb2ZpbGUtPmNsZWFudXApCiAJCXByb2ZpbGUtPmNsZWFudXAocHJpdik7Ci0KLQlpZiAoIXRlc3RfYml0KE1MWDVfSU5URVJGQUNFX1NUQVRFX1NIVVRET1dOLCAmbWRldi0+aW50Zl9zdGF0ZSkpCi0JCWZyZWVfbmV0ZGV2KG5ldGRldik7CisJZnJlZV9uZXRkZXYobmV0ZGV2KTsKIH0KIAogc3RhdGljIHZvaWQgbWx4NWVfcmVtb3ZlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LCB2b2lkICp2cHJpdikKQEAgLTM1NzgsMTIgKzQwNDksMTEgQEAKIAlzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdiA9IHZwcml2OwogCWludCB2cG9ydDsKIAotCW1seDVlX2Rlc3Ryb3lfbmV0ZGV2KG1kZXYsIHByaXYpOwotCiAJZm9yICh2cG9ydCA9IDE7IHZwb3J0IDwgdG90YWxfdmZzOyB2cG9ydCsrKQogCQltbHg1X2Vzd2l0Y2hfdW5yZWdpc3Rlcl92cG9ydF9yZXAoZXN3LCB2cG9ydCk7CiAKLQltbHg1ZV9kZXN0cm95X21kZXZfcmVzb3VyY2VzKG1kZXYpOworCW1seDVlX2RldGFjaChtZGV2LCB2cHJpdik7CisJbWx4NWVfZGVzdHJveV9uZXRkZXYobWRldiwgcHJpdik7CiB9CiAKIHN0YXRpYyB2b2lkICptbHg1ZV9nZXRfbmV0ZGV2KHZvaWQgKnZwcml2KQpAQCAtMzU5Niw2ICs0MDY2LDggQEAKIHN0YXRpYyBzdHJ1Y3QgbWx4NV9pbnRlcmZhY2UgbWx4NWVfaW50ZXJmYWNlID0gewogCS5hZGQgICAgICAgPSBtbHg1ZV9hZGQsCiAJLnJlbW92ZSAgICA9IG1seDVlX3JlbW92ZSwKKwkuYXR0YWNoICAgID0gbWx4NWVfYXR0YWNoLAorCS5kZXRhY2ggICAgPSBtbHg1ZV9kZXRhY2gsCiAJLmV2ZW50ICAgICA9IG1seDVlX2FzeW5jX2V2ZW50LAogCS5wcm90b2NvbCAgPSBNTFg1X0lOVEVSRkFDRV9QUk9UT0NPTF9FVEgsCiAJLmdldF9kZXYgICA9IG1seDVlX2dldF9uZXRkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fcmVwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fcmVwLmMKaW5kZXggMWM3ZDhiOC4uM2M5N2RhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX3JlcC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9yZXAuYwpAQCAtMTM1LDE3ICsxMzUsMTYgQEAKIGludCBtbHg1ZV9hdHRyX2dldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc3dpdGNoZGV2X2F0dHIgKmF0dHIpCiB7CiAJc3RydWN0IG1seDVlX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBtbHg1X2Vzd2l0Y2hfcmVwICpyZXAgPSBwcml2LT5wcHJpdjsKIAlzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3cgPSBwcml2LT5tZGV2LT5wcml2LmVzd2l0Y2g7Ci0JdTggbWFjW0VUSF9BTEVOXTsKIAogCWlmIChlc3ctPm1vZGUgPT0gU1JJT1ZfTk9ORSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJc3dpdGNoIChhdHRyLT5pZCkgewogCWNhc2UgU1dJVENIREVWX0FUVFJfSURfUE9SVF9QQVJFTlRfSUQ6Ci0JCW1seDVfcXVlcnlfbmljX3Zwb3J0X21hY19hZGRyZXNzKHByaXYtPm1kZXYsIDAsIG1hYyk7CiAJCWF0dHItPnUucHBpZC5pZF9sZW4gPSBFVEhfQUxFTjsKLQkJbWVtY3B5KCZhdHRyLT51LnBwaWQuaWQsICZtYWMsIEVUSF9BTEVOKTsKKwkJZXRoZXJfYWRkcl9jb3B5KGF0dHItPnUucHBpZC5pZCwgcmVwLT5od19pZCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKQEAgLTQxNCwxOSArNDEzLDUwIEBACiBpbnQgbWx4NWVfdnBvcnRfcmVwX2xvYWQoc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3LAogCQkJIHN0cnVjdCBtbHg1X2Vzd2l0Y2hfcmVwICpyZXApCiB7Ci0JcmVwLT5wcml2X2RhdGEgPSBtbHg1ZV9jcmVhdGVfbmV0ZGV2KGVzdy0+ZGV2LCAmbWx4NWVfcmVwX3Byb2ZpbGUsIHJlcCk7Ci0JaWYgKCFyZXAtPnByaXZfZGF0YSkgewotCQlwcl93YXJuKCJGYWlsZWQgdG8gY3JlYXRlIHJlcHJlc2VudG9yIGZvciB2cG9ydCAlZFxuIiwKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCWludCBlcnI7CisKKwluZXRkZXYgPSBtbHg1ZV9jcmVhdGVfbmV0ZGV2KGVzdy0+ZGV2LCAmbWx4NWVfcmVwX3Byb2ZpbGUsIHJlcCk7CisJaWYgKCFuZXRkZXYpIHsKKwkJcHJfd2FybigiRmFpbGVkIHRvIGNyZWF0ZSByZXByZXNlbnRvciBuZXRkZXYgZm9yIHZwb3J0ICVkXG4iLAogCQkJcmVwLT52cG9ydCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KKworCXJlcC0+cHJpdl9kYXRhID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWVyciA9IG1seDVlX2F0dGFjaF9uZXRkZXYoZXN3LT5kZXYsIG5ldGRldik7CisJaWYgKGVycikgeworCQlwcl93YXJuKCJGYWlsZWQgdG8gYXR0YWNoIHJlcHJlc2VudG9yIG5ldGRldiBmb3IgdnBvcnQgJWRcbiIsCisJCQlyZXAtPnZwb3J0KTsKKwkJZ290byBlcnJfZGVzdHJveV9uZXRkZXY7CisJfQorCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisJaWYgKGVycikgeworCQlwcl93YXJuKCJGYWlsZWQgdG8gcmVnaXN0ZXIgcmVwcmVzZW50b3IgbmV0ZGV2IGZvciB2cG9ydCAlZFxuIiwKKwkJCXJlcC0+dnBvcnQpOworCQlnb3RvIGVycl9kZXRhY2hfbmV0ZGV2OworCX0KKwogCXJldHVybiAwOworCitlcnJfZGV0YWNoX25ldGRldjoKKwltbHg1ZV9kZXRhY2hfbmV0ZGV2KGVzdy0+ZGV2LCBuZXRkZXYpOworCitlcnJfZGVzdHJveV9uZXRkZXY6CisJbWx4NWVfZGVzdHJveV9uZXRkZXYoZXN3LT5kZXYsIHJlcC0+cHJpdl9kYXRhKTsKKworCXJldHVybiBlcnI7CisKIH0KIAogdm9pZCBtbHg1ZV92cG9ydF9yZXBfdW5sb2FkKHN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdywKIAkJCSAgICBzdHJ1Y3QgbWx4NV9lc3dpdGNoX3JlcCAqcmVwKQogewogCXN0cnVjdCBtbHg1ZV9wcml2ICpwcml2ID0gcmVwLT5wcml2X2RhdGE7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHByaXYtPm5ldGRldjsKIAorCW1seDVlX2RldGFjaF9uZXRkZXYoZXN3LT5kZXYsIG5ldGRldik7CiAJbWx4NWVfZGVzdHJveV9uZXRkZXYoZXN3LT5kZXYsIHByaXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX3J4LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fcnguYwppbmRleCA5ZjJhMTZhLi5jNmRlNmZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fcnguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fcnguYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPG5ldC9idXN5X3BvbGwuaD4KICNpbmNsdWRlICJlbi5oIgogI2luY2x1ZGUgImVuX3RjLmgiCisjaW5jbHVkZSAiZXN3aXRjaC5oIgogCiBzdGF0aWMgaW5saW5lIGJvb2wgbWx4NWVfcnhfaHdfc3RhbXAoc3RydWN0IG1seDVlX3RzdGFtcCAqdHN0YW1wKQogewpAQCAtMTc5LDUxICsxODAsOTkgQEAKIAltdXRleF91bmxvY2soJnByaXYtPnN0YXRlX2xvY2spOwogfQogCi1pbnQgbWx4NWVfYWxsb2Nfcnhfd3FlKHN0cnVjdCBtbHg1ZV9ycSAqcnEsIHN0cnVjdCBtbHg1ZV9yeF93cWUgKndxZSwgdTE2IGl4KQotewotCXN0cnVjdCBza19idWZmICpza2I7Ci0JZG1hX2FkZHJfdCBkbWFfYWRkcjsKKyNkZWZpbmUgUlFfUEFHRV9TSVpFKHJxKSAoKDEgPDwgcnEtPmJ1ZmYucGFnZV9vcmRlcikgPDwgUEFHRV9TSElGVCkKIAotCXNrYiA9IG5hcGlfYWxsb2Nfc2tiKHJxLT5jcS5uYXBpLCBycS0+d3FlX3N6KTsKLQlpZiAodW5saWtlbHkoIXNrYikpCitzdGF0aWMgaW5saW5lIGJvb2wgbWx4NWVfcnhfY2FjaGVfcHV0KHN0cnVjdCBtbHg1ZV9ycSAqcnEsCisJCQkJICAgICAgc3RydWN0IG1seDVlX2RtYV9pbmZvICpkbWFfaW5mbykKK3sKKwlzdHJ1Y3QgbWx4NWVfcGFnZV9jYWNoZSAqY2FjaGUgPSAmcnEtPnBhZ2VfY2FjaGU7CisJdTMyIHRhaWxfbmV4dCA9IChjYWNoZS0+dGFpbCArIDEpICYgKE1MWDVFX0NBQ0hFX1NJWkUgLSAxKTsKKworCWlmICh0YWlsX25leHQgPT0gY2FjaGUtPmhlYWQpIHsKKwkJcnEtPnN0YXRzLmNhY2hlX2Z1bGwrKzsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWNhY2hlLT5wYWdlX2NhY2hlW2NhY2hlLT50YWlsXSA9ICpkbWFfaW5mbzsKKwljYWNoZS0+dGFpbCA9IHRhaWxfbmV4dDsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGlubGluZSBib29sIG1seDVlX3J4X2NhY2hlX2dldChzdHJ1Y3QgbWx4NWVfcnEgKnJxLAorCQkJCSAgICAgIHN0cnVjdCBtbHg1ZV9kbWFfaW5mbyAqZG1hX2luZm8pCit7CisJc3RydWN0IG1seDVlX3BhZ2VfY2FjaGUgKmNhY2hlID0gJnJxLT5wYWdlX2NhY2hlOworCisJaWYgKHVubGlrZWx5KGNhY2hlLT5oZWFkID09IGNhY2hlLT50YWlsKSkgeworCQlycS0+c3RhdHMuY2FjaGVfZW1wdHkrKzsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChwYWdlX3JlZl9jb3VudChjYWNoZS0+cGFnZV9jYWNoZVtjYWNoZS0+aGVhZF0ucGFnZSkgIT0gMSkgeworCQlycS0+c3RhdHMuY2FjaGVfYnVzeSsrOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJKmRtYV9pbmZvID0gY2FjaGUtPnBhZ2VfY2FjaGVbY2FjaGUtPmhlYWRdOworCWNhY2hlLT5oZWFkID0gKGNhY2hlLT5oZWFkICsgMSkgJiAoTUxYNUVfQ0FDSEVfU0laRSAtIDEpOworCXJxLT5zdGF0cy5jYWNoZV9yZXVzZSsrOworCisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UocnEtPnBkZXYsIGRtYV9pbmZvLT5hZGRyLAorCQkJCSAgIFJRX1BBR0VfU0laRShycSksCisJCQkJICAgRE1BX0ZST01fREVWSUNFKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbWx4NWVfcGFnZV9hbGxvY19tYXBwZWQoc3RydWN0IG1seDVlX3JxICpycSwKKwkJCQkJICBzdHJ1Y3QgbWx4NWVfZG1hX2luZm8gKmRtYV9pbmZvKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCisJaWYgKG1seDVlX3J4X2NhY2hlX2dldChycSwgZG1hX2luZm8pKQorCQlyZXR1cm4gMDsKKworCXBhZ2UgPSBkZXZfYWxsb2NfcGFnZXMocnEtPmJ1ZmYucGFnZV9vcmRlcik7CisJaWYgKHVubGlrZWx5KCFwYWdlKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlkbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKHJxLT5wZGV2LAotCQkJCSAgLyogaHcgc3RhcnQgcGFkZGluZyAqLwotCQkJCSAgc2tiLT5kYXRhLAotCQkJCSAgLyogaHcgZW5kIHBhZGRpbmcgKi8KLQkJCQkgIHJxLT53cWVfc3osCi0JCQkJICBETUFfRlJPTV9ERVZJQ0UpOwotCi0JaWYgKHVubGlrZWx5KGRtYV9tYXBwaW5nX2Vycm9yKHJxLT5wZGV2LCBkbWFfYWRkcikpKQotCQlnb3RvIGVycl9mcmVlX3NrYjsKLQotCSooKGRtYV9hZGRyX3QgKilza2ItPmNiKSA9IGRtYV9hZGRyOwotCXdxZS0+ZGF0YS5hZGRyID0gY3B1X3RvX2JlNjQoZG1hX2FkZHIpOwotCXdxZS0+ZGF0YS5sa2V5ID0gcnEtPm1rZXlfYmU7Ci0KLQlycS0+c2tiW2l4XSA9IHNrYjsKKwlkbWFfaW5mby0+cGFnZSA9IHBhZ2U7CisJZG1hX2luZm8tPmFkZHIgPSBkbWFfbWFwX3BhZ2UocnEtPnBkZXYsIHBhZ2UsIDAsCisJCQkJICAgICAgUlFfUEFHRV9TSVpFKHJxKSwgcnEtPmJ1ZmYubWFwX2Rpcik7CisJaWYgKHVubGlrZWx5KGRtYV9tYXBwaW5nX2Vycm9yKHJxLT5wZGV2LCBkbWFfaW5mby0+YWRkcikpKSB7CisJCXB1dF9wYWdlKHBhZ2UpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKIAlyZXR1cm4gMDsKK30KIAotZXJyX2ZyZWVfc2tiOgotCWRldl9rZnJlZV9za2Ioc2tiKTsKK3ZvaWQgbWx4NWVfcGFnZV9yZWxlYXNlKHN0cnVjdCBtbHg1ZV9ycSAqcnEsIHN0cnVjdCBtbHg1ZV9kbWFfaW5mbyAqZG1hX2luZm8sCisJCQlib29sIHJlY3ljbGUpCit7CisJaWYgKGxpa2VseShyZWN5Y2xlKSAmJiBtbHg1ZV9yeF9jYWNoZV9wdXQocnEsIGRtYV9pbmZvKSkKKwkJcmV0dXJuOwogCi0JcmV0dXJuIC1FTk9NRU07CisJZG1hX3VubWFwX3BhZ2UocnEtPnBkZXYsIGRtYV9pbmZvLT5hZGRyLCBSUV9QQUdFX1NJWkUocnEpLAorCQkgICAgICAgcnEtPmJ1ZmYubWFwX2Rpcik7CisJcHV0X3BhZ2UoZG1hX2luZm8tPnBhZ2UpOworfQorCitpbnQgbWx4NWVfYWxsb2Nfcnhfd3FlKHN0cnVjdCBtbHg1ZV9ycSAqcnEsIHN0cnVjdCBtbHg1ZV9yeF93cWUgKndxZSwgdTE2IGl4KQoreworCXN0cnVjdCBtbHg1ZV9kbWFfaW5mbyAqZGkgPSAmcnEtPmRtYV9pbmZvW2l4XTsKKworCWlmICh1bmxpa2VseShtbHg1ZV9wYWdlX2FsbG9jX21hcHBlZChycSwgZGkpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3cWUtPmRhdGEuYWRkciA9IGNwdV90b19iZTY0KGRpLT5hZGRyICsgTUxYNV9SWF9IRUFEUk9PTSk7CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgbWx4NWVfZGVhbGxvY19yeF93cWUoc3RydWN0IG1seDVlX3JxICpycSwgdTE2IGl4KQogewotCXN0cnVjdCBza19idWZmICpza2IgPSBycS0+c2tiW2l4XTsKKwlzdHJ1Y3QgbWx4NWVfZG1hX2luZm8gKmRpID0gJnJxLT5kbWFfaW5mb1tpeF07CiAKLQlpZiAoc2tiKSB7Ci0JCXJxLT5za2JbaXhdID0gTlVMTDsKLQkJZG1hX3VubWFwX3NpbmdsZShycS0+cGRldiwKLQkJCQkgKigoZG1hX2FkZHJfdCAqKXNrYi0+Y2IpLAotCQkJCSBycS0+d3FlX3N6LAotCQkJCSBETUFfRlJPTV9ERVZJQ0UpOwotCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JfQorCW1seDVlX3BhZ2VfcmVsZWFzZShycSwgZGksIHRydWUpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBtbHg1ZV9tcHdxZV9zdHJpZGVzX3Blcl9wYWdlKHN0cnVjdCBtbHg1ZV9ycSAqcnEpCkBAIC0yMzEsNDQgKzI4MCwxMSBAQAogCXJldHVybiBycS0+bXB3cWVfbnVtX3N0cmlkZXMgPj4gTUxYNV9NUFdSUV9XUUVfUEFHRV9PUkRFUjsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCi1tbHg1ZV9kbWFfcHJlX3N5bmNfbGluZWFyX21wd3FlKHN0cnVjdCBkZXZpY2UgKnBkZXYsCi0JCQkJc3RydWN0IG1seDVlX21wd19pbmZvICp3aSwKLQkJCQl1MzIgd3FlX29mZnNldCwgdTMyIGxlbikKLXsKLQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShwZGV2LCB3aS0+ZG1hX2luZm8uYWRkciArIHdxZV9vZmZzZXQsCi0JCQkJbGVuLCBETUFfRlJPTV9ERVZJQ0UpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLW1seDVlX2RtYV9wcmVfc3luY19mcmFnbWVudGVkX21wd3FlKHN0cnVjdCBkZXZpY2UgKnBkZXYsCi0JCQkJICAgIHN0cnVjdCBtbHg1ZV9tcHdfaW5mbyAqd2ksCi0JCQkJICAgIHUzMiB3cWVfb2Zmc2V0LCB1MzIgbGVuKQotewotCS8qIE5vIGRtYSBwcmUgc3luYyBmb3IgZnJhZ21lbnRlZCBNUFdRRSAqLwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLW1seDVlX2FkZF9za2JfZnJhZ19saW5lYXJfbXB3cWUoc3RydWN0IG1seDVlX3JxICpycSwKLQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCXN0cnVjdCBtbHg1ZV9tcHdfaW5mbyAqd2ksCi0JCQkJdTMyIHBhZ2VfaWR4LCB1MzIgZnJhZ19vZmZzZXQsCi0JCQkJdTMyIGxlbikKLXsKLQl1bnNpZ25lZCBpbnQgdHJ1ZXNpemUgPQlBTElHTihsZW4sIHJxLT5tcHdxZV9zdHJpZGVfc3opOwotCi0Jd2ktPnNrYnNfZnJhZ3NbcGFnZV9pZHhdKys7Ci0Jc2tiX2FkZF9yeF9mcmFnKHNrYiwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncywKLQkJCSZ3aS0+ZG1hX2luZm8ucGFnZVtwYWdlX2lkeF0sIGZyYWdfb2Zmc2V0LAotCQkJbGVuLCB0cnVlc2l6ZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotbWx4NWVfYWRkX3NrYl9mcmFnX2ZyYWdtZW50ZWRfbXB3cWUoc3RydWN0IG1seDVlX3JxICpycSwKLQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgc3RydWN0IG1seDVlX21wd19pbmZvICp3aSwKLQkJCQkgICAgdTMyIHBhZ2VfaWR4LCB1MzIgZnJhZ19vZmZzZXQsCi0JCQkJICAgIHUzMiBsZW4pCitzdGF0aWMgaW5saW5lIHZvaWQgbWx4NWVfYWRkX3NrYl9mcmFnX21wd3FlKHN0cnVjdCBtbHg1ZV9ycSAqcnEsCisJCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgICAgc3RydWN0IG1seDVlX21wd19pbmZvICp3aSwKKwkJCQkJICAgIHUzMiBwYWdlX2lkeCwgdTMyIGZyYWdfb2Zmc2V0LAorCQkJCQkgICAgdTMyIGxlbikKIHsKIAl1bnNpZ25lZCBpbnQgdHJ1ZXNpemUgPQlBTElHTihsZW4sIHJxLT5tcHdxZV9zdHJpZGVfc3opOwogCkBAIC0yODIsMjQgKzI5OCwxMSBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKLW1seDVlX2NvcHlfc2tiX2hlYWRlcl9saW5lYXJfbXB3cWUoc3RydWN0IGRldmljZSAqcGRldiwKLQkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgIHN0cnVjdCBtbHg1ZV9tcHdfaW5mbyAqd2ksCi0JCQkJICAgdTMyIHBhZ2VfaWR4LCB1MzIgb2Zmc2V0LAotCQkJCSAgIHUzMiBoZWFkbGVuKQotewotCXN0cnVjdCBwYWdlICpwYWdlID0gJndpLT5kbWFfaW5mby5wYWdlW3BhZ2VfaWR4XTsKLQotCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgcGFnZV9hZGRyZXNzKHBhZ2UpICsgb2Zmc2V0LAotCQkJCUFMSUdOKGhlYWRsZW4sIHNpemVvZihsb25nKSkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLW1seDVlX2NvcHlfc2tiX2hlYWRlcl9mcmFnbWVudGVkX21wd3FlKHN0cnVjdCBkZXZpY2UgKnBkZXYsCi0JCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgICAgIHN0cnVjdCBtbHg1ZV9tcHdfaW5mbyAqd2ksCi0JCQkJICAgICAgIHUzMiBwYWdlX2lkeCwgdTMyIG9mZnNldCwKLQkJCQkgICAgICAgdTMyIGhlYWRsZW4pCittbHg1ZV9jb3B5X3NrYl9oZWFkZXJfbXB3cWUoc3RydWN0IGRldmljZSAqcGRldiwKKwkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgIHN0cnVjdCBtbHg1ZV9tcHdfaW5mbyAqd2ksCisJCQkgICAgdTMyIHBhZ2VfaWR4LCB1MzIgb2Zmc2V0LAorCQkJICAgIHUzMiBoZWFkbGVuKQogewogCXUxNiBoZWFkbGVuX3BnID0gbWluX3QodTMyLCBoZWFkbGVuLCBQQUdFX1NJWkUgLSBvZmZzZXQpOwogCXN0cnVjdCBtbHg1ZV9kbWFfaW5mbyAqZG1hX2luZm8gPSAmd2ktPnVtci5kbWFfaW5mb1twYWdlX2lkeF07CkBAIC0zMjQsNDYgKzMyNyw5IEBACiAJfQogfQogCi1zdGF0aWMgdTE2IG1seDVlX2dldF93cWVfbXR0X29mZnNldCh1MTYgcnFfaXgsIHUxNiB3cWVfaXgpCitzdGF0aWMgaW5saW5lIHZvaWQgbWx4NWVfcG9zdF91bXJfd3FlKHN0cnVjdCBtbHg1ZV9ycSAqcnEsIHUxNiBpeCkKIHsKLQlyZXR1cm4gcnFfaXggKiBNTFg1X0NIQU5ORUxfTUFYX05VTV9NVFRTICsKLQkJd3FlX2l4ICogQUxJR04oTUxYNV9NUFdSUV9QQUdFU19QRVJfV1FFLCA4KTsKLX0KLQotc3RhdGljIHZvaWQgbWx4NWVfYnVpbGRfdW1yX3dxZShzdHJ1Y3QgbWx4NWVfcnEgKnJxLAotCQkJCXN0cnVjdCBtbHg1ZV9zcSAqc3EsCi0JCQkJc3RydWN0IG1seDVlX3Vtcl93cWUgKndxZSwKLQkJCQl1MTYgaXgpCi17Ci0Jc3RydWN0IG1seDVfd3FlX2N0cmxfc2VnICAgICAgKmNzZWcgPSAmd3FlLT5jdHJsOwotCXN0cnVjdCBtbHg1X3dxZV91bXJfY3RybF9zZWcgKnVjc2VnID0gJndxZS0+dWN0cmw7Ci0Jc3RydWN0IG1seDVfd3FlX2RhdGFfc2VnICAgICAgKmRzZWcgPSAmd3FlLT5kYXRhOwotCXN0cnVjdCBtbHg1ZV9tcHdfaW5mbyAqd2kgPSAmcnEtPndxZV9pbmZvW2l4XTsKLQl1OCBkc19jbnQgPSBESVZfUk9VTkRfVVAoc2l6ZW9mKCp3cWUpLCBNTFg1X1NFTkRfV1FFX0RTKTsKLQl1MTYgdW1yX3dxZV9tdHRfb2Zmc2V0ID0gbWx4NWVfZ2V0X3dxZV9tdHRfb2Zmc2V0KHJxLT5peCwgaXgpOwotCi0JbWVtc2V0KHdxZSwgMCwgc2l6ZW9mKCp3cWUpKTsKLQljc2VnLT5vcG1vZF9pZHhfb3Bjb2RlID0KLQkJY3B1X3RvX2JlMzIoKHNxLT5wYyA8PCBNTFg1X1dRRV9DVFJMX1dRRV9JTkRFWF9TSElGVCkgfAotCQkJICAgIE1MWDVfT1BDT0RFX1VNUik7Ci0JY3NlZy0+cXBuX2RzICAgID0gY3B1X3RvX2JlMzIoKHNxLT5zcW4gPDwgTUxYNV9XUUVfQ1RSTF9RUE5fU0hJRlQpIHwKLQkJCQkgICAgICBkc19jbnQpOwotCWNzZWctPmZtX2NlX3NlICA9IE1MWDVfV1FFX0NUUkxfQ1FfVVBEQVRFOwotCWNzZWctPmltbSAgICAgICA9IHJxLT51bXJfbWtleV9iZTsKLQotCXVjc2VnLT5mbGFncyA9IE1MWDVfVU1SX1RSQU5TTEFUSU9OX09GRlNFVF9FTjsKLQl1Y3NlZy0+a2xtX29jdG93b3JkcyA9Ci0JCWNwdV90b19iZTE2KG1seDVlX2dldF9tdHRfb2N0dyhNTFg1X01QV1JRX1BBR0VTX1BFUl9XUUUpKTsKLQl1Y3NlZy0+YnNmX29jdG93b3JkcyA9Ci0JCWNwdV90b19iZTE2KG1seDVlX2dldF9tdHRfb2N0dyh1bXJfd3FlX210dF9vZmZzZXQpKTsKLQl1Y3NlZy0+bWtleV9tYXNrICAgICA9IGNwdV90b19iZTY0KE1MWDVfTUtFWV9NQVNLX0ZSRUUpOwotCi0JZHNlZy0+bGtleSA9IHNxLT5ta2V5X2JlOwotCWRzZWctPmFkZHIgPSBjcHVfdG9fYmU2NCh3aS0+dW1yLm10dF9hZGRyKTsKLX0KLQotc3RhdGljIHZvaWQgbWx4NWVfcG9zdF91bXJfd3FlKHN0cnVjdCBtbHg1ZV9ycSAqcnEsIHUxNiBpeCkKLXsKKwlzdHJ1Y3QgbWx4NWVfbXB3X2luZm8gKndpID0gJnJxLT5tcHdxZS5pbmZvW2l4XTsKIAlzdHJ1Y3QgbWx4NWVfc3EgKnNxID0gJnJxLT5jaGFubmVsLT5pY29zcTsKIAlzdHJ1Y3QgbWx4NV93cV9jeWMgKndxID0gJnNxLT53cTsKIAlzdHJ1Y3QgbWx4NWVfdW1yX3dxZSAqd3FlOwpAQCAtMzcyLDE0MiArMzM4LDg2IEBACiAKIAkvKiBmaWxsIHNxIGVkZ2Ugd2l0aCBub3BzIHRvIGF2b2lkIHdxZSB3cmFwIGFyb3VuZCAqLwogCXdoaWxlICgocGkgPSAoc3EtPnBjICYgd3EtPnN6X20xKSkgPiBzcS0+ZWRnZSkgewotCQlzcS0+aWNvX3dxZV9pbmZvW3BpXS5vcGNvZGUgPSBNTFg1X09QQ09ERV9OT1A7Ci0JCXNxLT5pY29fd3FlX2luZm9bcGldLm51bV93cWViYnMgPSAxOworCQlzcS0+ZGIuaWNvX3dxZVtwaV0ub3Bjb2RlID0gTUxYNV9PUENPREVfTk9QOworCQlzcS0+ZGIuaWNvX3dxZVtwaV0ubnVtX3dxZWJicyA9IDE7CiAJCW1seDVlX3NlbmRfbm9wKHNxLCB0cnVlKTsKIAl9CiAKIAl3cWUgPSBtbHg1X3dxX2N5Y19nZXRfd3FlKHdxLCBwaSk7Ci0JbWx4NWVfYnVpbGRfdW1yX3dxZShycSwgc3EsIHdxZSwgaXgpOwotCXNxLT5pY29fd3FlX2luZm9bcGldLm9wY29kZSA9IE1MWDVfT1BDT0RFX1VNUjsKLQlzcS0+aWNvX3dxZV9pbmZvW3BpXS5udW1fd3FlYmJzID0gbnVtX3dxZWJiczsKKwltZW1jcHkod3FlLCAmd2ktPnVtci53cWUsIHNpemVvZigqd3FlKSk7CisJd3FlLT5jdHJsLm9wbW9kX2lkeF9vcGNvZGUgPQorCQljcHVfdG9fYmUzMigoc3EtPnBjIDw8IE1MWDVfV1FFX0NUUkxfV1FFX0lOREVYX1NISUZUKSB8CisJCQkgICAgTUxYNV9PUENPREVfVU1SKTsKKworCXNxLT5kYi5pY29fd3FlW3BpXS5vcGNvZGUgPSBNTFg1X09QQ09ERV9VTVI7CisJc3EtPmRiLmljb193cWVbcGldLm51bV93cWViYnMgPSBudW1fd3FlYmJzOwogCXNxLT5wYyArPSBudW1fd3FlYmJzOwogCW1seDVlX3R4X25vdGlmeV9odyhzcSwgJndxZS0+Y3RybCwgMCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IG1seDVlX2dldF93cWVfbXR0X3N6KHZvaWQpCitzdGF0aWMgaW50IG1seDVlX2FsbG9jX3J4X3Vtcl9tcHdxZShzdHJ1Y3QgbWx4NWVfcnEgKnJxLAorCQkJCSAgICBzdHJ1Y3QgbWx4NWVfcnhfd3FlICp3cWUsCisJCQkJICAgIHUxNiBpeCkKIHsKLQkvKiBVTVIgY29waWVzIE1UVHMgaW4gdW5pdHMgb2YgTUxYNV9VTVJfTVRUX0FMSUdOTUVOVCBieXRlcy4KLQkgKiBUbyBhdm9pZCBjb3B5aW5nIGdhcmJhZ2UgYWZ0ZXIgdGhlIG10dCBhcnJheSwgd2UgYWxsb2NhdGUKLQkgKiBhIGxpdHRsZSBtb3JlLgotCSAqLwotCXJldHVybiBBTElHTihNTFg1X01QV1JRX1BBR0VTX1BFUl9XUUUgKiBzaXplb2YoX19iZTY0KSwKLQkJICAgICBNTFg1X1VNUl9NVFRfQUxJR05NRU5UKTsKLX0KLQotc3RhdGljIGludCBtbHg1ZV9hbGxvY19hbmRfbWFwX3BhZ2Uoc3RydWN0IG1seDVlX3JxICpycSwKLQkJCQkgICAgc3RydWN0IG1seDVlX21wd19pbmZvICp3aSwKLQkJCQkgICAgaW50IGkpCi17Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0KLQlwYWdlID0gZGV2X2FsbG9jX3BhZ2UoKTsKLQlpZiAodW5saWtlbHkoIXBhZ2UpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXdpLT51bXIuZG1hX2luZm9baV0ucGFnZSA9IHBhZ2U7Ci0Jd2ktPnVtci5kbWFfaW5mb1tpXS5hZGRyID0gZG1hX21hcF9wYWdlKHJxLT5wZGV2LCBwYWdlLCAwLCBQQUdFX1NJWkUsCi0JCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcihycS0+cGRldiwgd2ktPnVtci5kbWFfaW5mb1tpXS5hZGRyKSkpIHsKLQkJcHV0X3BhZ2UocGFnZSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQl3aS0+dW1yLm10dFtpXSA9IGNwdV90b19iZTY0KHdpLT51bXIuZG1hX2luZm9baV0uYWRkciB8IE1MWDVfRU5fV1IpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbWx4NWVfYWxsb2NfcnhfZnJhZ21lbnRlZF9tcHdxZShzdHJ1Y3QgbWx4NWVfcnEgKnJxLAotCQkJCQkgICBzdHJ1Y3QgbWx4NWVfcnhfd3FlICp3cWUsCi0JCQkJCSAgIHUxNiBpeCkKLXsKLQlzdHJ1Y3QgbWx4NWVfbXB3X2luZm8gKndpID0gJnJxLT53cWVfaW5mb1tpeF07Ci0JaW50IG10dF9zeiA9IG1seDVlX2dldF93cWVfbXR0X3N6KCk7Ci0JdTMyIGRtYV9vZmZzZXQgPSBtbHg1ZV9nZXRfd3FlX210dF9vZmZzZXQocnEtPml4LCBpeCkgPDwgUEFHRV9TSElGVDsKKwlzdHJ1Y3QgbWx4NWVfbXB3X2luZm8gKndpID0gJnJxLT5tcHdxZS5pbmZvW2l4XTsKKwl1NjQgZG1hX29mZnNldCA9ICh1NjQpbWx4NWVfZ2V0X3dxZV9tdHRfb2Zmc2V0KHJxLCBpeCkgPDwgUEFHRV9TSElGVDsKKwlpbnQgcGdfc3RyaWRlcyA9IG1seDVlX21wd3FlX3N0cmlkZXNfcGVyX3BhZ2UocnEpOworCWludCBlcnI7CiAJaW50IGk7CiAKLQl3aS0+dW1yLmRtYV9pbmZvID0ga21hbGxvYyhzaXplb2YoKndpLT51bXIuZG1hX2luZm8pICoKLQkJCQkgICBNTFg1X01QV1JRX1BBR0VTX1BFUl9XUUUsCi0JCQkJICAgR0ZQX0FUT01JQyk7Ci0JaWYgKHVubGlrZWx5KCF3aS0+dW1yLmRtYV9pbmZvKSkKLQkJZ290byBlcnJfb3V0OwotCi0JLyogV2UgYWxsb2NhdGUgbW9yZSB0aGFuIG10dF9zeiBhcyB3ZSB3aWxsIGFsaWduIHRoZSBwb2ludGVyICovCi0Jd2ktPnVtci5tdHRfbm9fYWxpZ24gPSBremFsbG9jKG10dF9zeiArIE1MWDVfVU1SX0FMSUdOIC0gMSwKLQkJCQkgICAgICAgR0ZQX0FUT01JQyk7Ci0JaWYgKHVubGlrZWx5KCF3aS0+dW1yLm10dF9ub19hbGlnbikpCi0JCWdvdG8gZXJyX2ZyZWVfdW1yOwotCi0Jd2ktPnVtci5tdHQgPSBQVFJfQUxJR04od2ktPnVtci5tdHRfbm9fYWxpZ24sIE1MWDVfVU1SX0FMSUdOKTsKLQl3aS0+dW1yLm10dF9hZGRyID0gZG1hX21hcF9zaW5nbGUocnEtPnBkZXYsIHdpLT51bXIubXR0LCBtdHRfc3osCi0JCQkJCSAgUENJX0RNQV9UT0RFVklDRSk7Ci0JaWYgKHVubGlrZWx5KGRtYV9tYXBwaW5nX2Vycm9yKHJxLT5wZGV2LCB3aS0+dW1yLm10dF9hZGRyKSkpCi0JCWdvdG8gZXJyX2ZyZWVfbXR0OwotCiAJZm9yIChpID0gMDsgaSA8IE1MWDVfTVBXUlFfUEFHRVNfUEVSX1dRRTsgaSsrKSB7Ci0JCWlmICh1bmxpa2VseShtbHg1ZV9hbGxvY19hbmRfbWFwX3BhZ2UocnEsIHdpLCBpKSkpCisJCXN0cnVjdCBtbHg1ZV9kbWFfaW5mbyAqZG1hX2luZm8gPSAmd2ktPnVtci5kbWFfaW5mb1tpXTsKKworCQllcnIgPSBtbHg1ZV9wYWdlX2FsbG9jX21hcHBlZChycSwgZG1hX2luZm8pOworCQlpZiAodW5saWtlbHkoZXJyKSkKIAkJCWdvdG8gZXJyX3VubWFwOwotCQlwYWdlX3JlZl9hZGQod2ktPnVtci5kbWFfaW5mb1tpXS5wYWdlLAotCQkJICAgICBtbHg1ZV9tcHdxZV9zdHJpZGVzX3Blcl9wYWdlKHJxKSk7CisJCXdpLT51bXIubXR0W2ldID0gY3B1X3RvX2JlNjQoZG1hX2luZm8tPmFkZHIgfCBNTFg1X0VOX1dSKTsKKwkJcGFnZV9yZWZfYWRkKGRtYV9pbmZvLT5wYWdlLCBwZ19zdHJpZGVzKTsKIAkJd2ktPnNrYnNfZnJhZ3NbaV0gPSAwOwogCX0KIAogCXdpLT5jb25zdW1lZF9zdHJpZGVzID0gMDsKLQl3aS0+ZG1hX3ByZV9zeW5jID0gbWx4NWVfZG1hX3ByZV9zeW5jX2ZyYWdtZW50ZWRfbXB3cWU7Ci0Jd2ktPmFkZF9za2JfZnJhZyA9IG1seDVlX2FkZF9za2JfZnJhZ19mcmFnbWVudGVkX21wd3FlOwotCXdpLT5jb3B5X3NrYl9oZWFkZXIgPSBtbHg1ZV9jb3B5X3NrYl9oZWFkZXJfZnJhZ21lbnRlZF9tcHdxZTsKLQl3aS0+ZnJlZV93cWUgICAgID0gbWx4NWVfZnJlZV9yeF9mcmFnbWVudGVkX21wd3FlOwotCXdxZS0+ZGF0YS5sa2V5ID0gcnEtPnVtcl9ta2V5X2JlOwogCXdxZS0+ZGF0YS5hZGRyID0gY3B1X3RvX2JlNjQoZG1hX29mZnNldCk7CiAKIAlyZXR1cm4gMDsKIAogZXJyX3VubWFwOgogCXdoaWxlICgtLWkgPj0gMCkgewotCQlkbWFfdW5tYXBfcGFnZShycS0+cGRldiwgd2ktPnVtci5kbWFfaW5mb1tpXS5hZGRyLCBQQUdFX1NJWkUsCi0JCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJcGFnZV9yZWZfc3ViKHdpLT51bXIuZG1hX2luZm9baV0ucGFnZSwKLQkJCSAgICAgbWx4NWVfbXB3cWVfc3RyaWRlc19wZXJfcGFnZShycSkpOwotCQlwdXRfcGFnZSh3aS0+dW1yLmRtYV9pbmZvW2ldLnBhZ2UpOworCQlzdHJ1Y3QgbWx4NWVfZG1hX2luZm8gKmRtYV9pbmZvID0gJndpLT51bXIuZG1hX2luZm9baV07CisKKwkJcGFnZV9yZWZfc3ViKGRtYV9pbmZvLT5wYWdlLCBwZ19zdHJpZGVzKTsKKwkJbWx4NWVfcGFnZV9yZWxlYXNlKHJxLCBkbWFfaW5mbywgdHJ1ZSk7CiAJfQotCWRtYV91bm1hcF9zaW5nbGUocnEtPnBkZXYsIHdpLT51bXIubXR0X2FkZHIsIG10dF9zeiwgUENJX0RNQV9UT0RFVklDRSk7CiAKLWVycl9mcmVlX210dDoKLQlrZnJlZSh3aS0+dW1yLm10dF9ub19hbGlnbik7Ci0KLWVycl9mcmVlX3VtcjoKLQlrZnJlZSh3aS0+dW1yLmRtYV9pbmZvKTsKLQotZXJyX291dDoKLQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gZXJyOwogfQogCi12b2lkIG1seDVlX2ZyZWVfcnhfZnJhZ21lbnRlZF9tcHdxZShzdHJ1Y3QgbWx4NWVfcnEgKnJxLAotCQkJCSAgICBzdHJ1Y3QgbWx4NWVfbXB3X2luZm8gKndpKQordm9pZCBtbHg1ZV9mcmVlX3J4X21wd3FlKHN0cnVjdCBtbHg1ZV9ycSAqcnEsIHN0cnVjdCBtbHg1ZV9tcHdfaW5mbyAqd2kpCiB7Ci0JaW50IG10dF9zeiA9IG1seDVlX2dldF93cWVfbXR0X3N6KCk7CisJaW50IHBnX3N0cmlkZXMgPSBtbHg1ZV9tcHdxZV9zdHJpZGVzX3Blcl9wYWdlKHJxKTsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBNTFg1X01QV1JRX1BBR0VTX1BFUl9XUUU7IGkrKykgewotCQlkbWFfdW5tYXBfcGFnZShycS0+cGRldiwgd2ktPnVtci5kbWFfaW5mb1tpXS5hZGRyLCBQQUdFX1NJWkUsCi0JCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJcGFnZV9yZWZfc3ViKHdpLT51bXIuZG1hX2luZm9baV0ucGFnZSwKLQkJCW1seDVlX21wd3FlX3N0cmlkZXNfcGVyX3BhZ2UocnEpIC0gd2ktPnNrYnNfZnJhZ3NbaV0pOwotCQlwdXRfcGFnZSh3aS0+dW1yLmRtYV9pbmZvW2ldLnBhZ2UpOworCQlzdHJ1Y3QgbWx4NWVfZG1hX2luZm8gKmRtYV9pbmZvID0gJndpLT51bXIuZG1hX2luZm9baV07CisKKwkJcGFnZV9yZWZfc3ViKGRtYV9pbmZvLT5wYWdlLCBwZ19zdHJpZGVzIC0gd2ktPnNrYnNfZnJhZ3NbaV0pOworCQltbHg1ZV9wYWdlX3JlbGVhc2UocnEsIGRtYV9pbmZvLCB0cnVlKTsKIAl9Ci0JZG1hX3VubWFwX3NpbmdsZShycS0+cGRldiwgd2ktPnVtci5tdHRfYWRkciwgbXR0X3N6LCBQQ0lfRE1BX1RPREVWSUNFKTsKLQlrZnJlZSh3aS0+dW1yLm10dF9ub19hbGlnbik7Ci0Ja2ZyZWUod2ktPnVtci5kbWFfaW5mbyk7CiB9CiAKLXZvaWQgbWx4NWVfcG9zdF9yeF9mcmFnbWVudGVkX21wd3FlKHN0cnVjdCBtbHg1ZV9ycSAqcnEpCit2b2lkIG1seDVlX3Bvc3RfcnhfbXB3cWUoc3RydWN0IG1seDVlX3JxICpycSkKIHsKIAlzdHJ1Y3QgbWx4NV93cV9sbCAqd3EgPSAmcnEtPndxOwogCXN0cnVjdCBtbHg1ZV9yeF93cWUgKndxZSA9IG1seDVfd3FfbGxfZ2V0X3dxZSh3cSwgd3EtPmhlYWQpOwogCiAJY2xlYXJfYml0KE1MWDVFX1JRX1NUQVRFX1VNUl9XUUVfSU5fUFJPR1JFU1MsICZycS0+c3RhdGUpOworCisJaWYgKHVubGlrZWx5KHRlc3RfYml0KE1MWDVFX1JRX1NUQVRFX0ZMVVNILCAmcnEtPnN0YXRlKSkpIHsKKwkJbWx4NWVfZnJlZV9yeF9tcHdxZShycSwgJnJxLT5tcHdxZS5pbmZvW3dxLT5oZWFkXSk7CisJCXJldHVybjsKKwl9CisKIAltbHg1X3dxX2xsX3B1c2god3EsIGJlMTZfdG9fY3B1KHdxZS0+bmV4dC5uZXh0X3dxZV9pbmRleCkpOwotCXJxLT5zdGF0cy5tcHdxZV9mcmFnKys7CiAKIAkvKiBlbnN1cmUgd3FlcyBhcmUgdmlzaWJsZSB0byBkZXZpY2UgYmVmb3JlIHVwZGF0aW5nIGRvb3JiZWxsIHJlY29yZCAqLwogCWRtYV93bWIoKTsKQEAgLTUxNSwxMDYgKzQyNSwyOCBAQAogCW1seDVfd3FfbGxfdXBkYXRlX2RiX3JlY29yZCh3cSk7CiB9CiAKLXN0YXRpYyBpbnQgbWx4NWVfYWxsb2NfcnhfbGluZWFyX21wd3FlKHN0cnVjdCBtbHg1ZV9ycSAqcnEsCi0JCQkJICAgICAgIHN0cnVjdCBtbHg1ZV9yeF93cWUgKndxZSwKLQkJCQkgICAgICAgdTE2IGl4KQotewotCXN0cnVjdCBtbHg1ZV9tcHdfaW5mbyAqd2kgPSAmcnEtPndxZV9pbmZvW2l4XTsKLQlnZnBfdCBnZnBfbWFzazsKLQlpbnQgaTsKLQotCWdmcF9tYXNrID0gR0ZQX0FUT01JQyB8IF9fR0ZQX0NPTEQgfCBfX0dGUF9NRU1BTExPQzsKLQl3aS0+ZG1hX2luZm8ucGFnZSA9IGFsbG9jX3BhZ2VzX25vZGUoTlVNQV9OT19OT0RFLCBnZnBfbWFzaywKLQkJCQkJICAgICBNTFg1X01QV1JRX1dRRV9QQUdFX09SREVSKTsKLQlpZiAodW5saWtlbHkoIXdpLT5kbWFfaW5mby5wYWdlKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQl3aS0+ZG1hX2luZm8uYWRkciA9IGRtYV9tYXBfcGFnZShycS0+cGRldiwgd2ktPmRtYV9pbmZvLnBhZ2UsIDAsCi0JCQkJCSBycS0+d3FlX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcihycS0+cGRldiwgd2ktPmRtYV9pbmZvLmFkZHIpKSkgewotCQlwdXRfcGFnZSh3aS0+ZG1hX2luZm8ucGFnZSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCS8qIFdlIHNwbGl0IHRoZSBoaWdoLW9yZGVyIHBhZ2UgaW50byBvcmRlci0wIG9uZXMgYW5kIG1hbmFnZSB0aGVpcgotCSAqIHJlZmVyZW5jZSBjb3VudGVyIHRvIG1pbmltaXplIHRoZSBtZW1vcnkgaGVsZCBieSBzbWFsbCBza2IgZnJhZ21lbnRzCi0JICovCi0Jc3BsaXRfcGFnZSh3aS0+ZG1hX2luZm8ucGFnZSwgTUxYNV9NUFdSUV9XUUVfUEFHRV9PUkRFUik7Ci0JZm9yIChpID0gMDsgaSA8IE1MWDVfTVBXUlFfUEFHRVNfUEVSX1dRRTsgaSsrKSB7Ci0JCXBhZ2VfcmVmX2FkZCgmd2ktPmRtYV9pbmZvLnBhZ2VbaV0sCi0JCQkgICAgIG1seDVlX21wd3FlX3N0cmlkZXNfcGVyX3BhZ2UocnEpKTsKLQkJd2ktPnNrYnNfZnJhZ3NbaV0gPSAwOwotCX0KLQotCXdpLT5jb25zdW1lZF9zdHJpZGVzID0gMDsKLQl3aS0+ZG1hX3ByZV9zeW5jID0gbWx4NWVfZG1hX3ByZV9zeW5jX2xpbmVhcl9tcHdxZTsKLQl3aS0+YWRkX3NrYl9mcmFnID0gbWx4NWVfYWRkX3NrYl9mcmFnX2xpbmVhcl9tcHdxZTsKLQl3aS0+Y29weV9za2JfaGVhZGVyID0gbWx4NWVfY29weV9za2JfaGVhZGVyX2xpbmVhcl9tcHdxZTsKLQl3aS0+ZnJlZV93cWUgICAgID0gbWx4NWVfZnJlZV9yeF9saW5lYXJfbXB3cWU7Ci0Jd3FlLT5kYXRhLmxrZXkgPSBycS0+bWtleV9iZTsKLQl3cWUtPmRhdGEuYWRkciA9IGNwdV90b19iZTY0KHdpLT5kbWFfaW5mby5hZGRyKTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIG1seDVlX2ZyZWVfcnhfbGluZWFyX21wd3FlKHN0cnVjdCBtbHg1ZV9ycSAqcnEsCi0JCQkJc3RydWN0IG1seDVlX21wd19pbmZvICp3aSkKLXsKLQlpbnQgaTsKLQotCWRtYV91bm1hcF9wYWdlKHJxLT5wZGV2LCB3aS0+ZG1hX2luZm8uYWRkciwgcnEtPndxZV9zeiwKLQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JZm9yIChpID0gMDsgaSA8IE1MWDVfTVBXUlFfUEFHRVNfUEVSX1dRRTsgaSsrKSB7Ci0JCXBhZ2VfcmVmX3N1Yigmd2ktPmRtYV9pbmZvLnBhZ2VbaV0sCi0JCQltbHg1ZV9tcHdxZV9zdHJpZGVzX3Blcl9wYWdlKHJxKSAtIHdpLT5za2JzX2ZyYWdzW2ldKTsKLQkJcHV0X3BhZ2UoJndpLT5kbWFfaW5mby5wYWdlW2ldKTsKLQl9Ci19Ci0KIGludCBtbHg1ZV9hbGxvY19yeF9tcHdxZShzdHJ1Y3QgbWx4NWVfcnEgKnJxLCBzdHJ1Y3QgbWx4NWVfcnhfd3FlICp3cWUsIHUxNiBpeCkKIHsKIAlpbnQgZXJyOwogCi0JZXJyID0gbWx4NWVfYWxsb2NfcnhfbGluZWFyX21wd3FlKHJxLCB3cWUsIGl4KTsKLQlpZiAodW5saWtlbHkoZXJyKSkgewotCQllcnIgPSBtbHg1ZV9hbGxvY19yeF9mcmFnbWVudGVkX21wd3FlKHJxLCB3cWUsIGl4KTsKLQkJaWYgKHVubGlrZWx5KGVycikpCi0JCQlyZXR1cm4gZXJyOwotCQlzZXRfYml0KE1MWDVFX1JRX1NUQVRFX1VNUl9XUUVfSU5fUFJPR1JFU1MsICZycS0+c3RhdGUpOwotCQltbHg1ZV9wb3N0X3Vtcl93cWUocnEsIGl4KTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlyZXR1cm4gMDsKKwllcnIgPSBtbHg1ZV9hbGxvY19yeF91bXJfbXB3cWUocnEsIHdxZSwgaXgpOworCWlmICh1bmxpa2VseShlcnIpKQorCQlyZXR1cm4gZXJyOworCXNldF9iaXQoTUxYNUVfUlFfU1RBVEVfVU1SX1dRRV9JTl9QUk9HUkVTUywgJnJxLT5zdGF0ZSk7CisJbWx4NWVfcG9zdF91bXJfd3FlKHJxLCBpeCk7CisJcmV0dXJuIC1FQlVTWTsKIH0KIAogdm9pZCBtbHg1ZV9kZWFsbG9jX3J4X21wd3FlKHN0cnVjdCBtbHg1ZV9ycSAqcnEsIHUxNiBpeCkKIHsKLQlzdHJ1Y3QgbWx4NWVfbXB3X2luZm8gKndpID0gJnJxLT53cWVfaW5mb1tpeF07CisJc3RydWN0IG1seDVlX21wd19pbmZvICp3aSA9ICZycS0+bXB3cWUuaW5mb1tpeF07CiAKLQl3aS0+ZnJlZV93cWUocnEsIHdpKTsKLX0KLQotdm9pZCBtbHg1ZV9mcmVlX3J4X2Rlc2NzKHN0cnVjdCBtbHg1ZV9ycSAqcnEpCi17Ci0Jc3RydWN0IG1seDVfd3FfbGwgKndxID0gJnJxLT53cTsKLQlzdHJ1Y3QgbWx4NWVfcnhfd3FlICp3cWU7Ci0JX19iZTE2IHdxZV9peF9iZTsKLQl1MTYgd3FlX2l4OwotCi0Jd2hpbGUgKCFtbHg1X3dxX2xsX2lzX2VtcHR5KHdxKSkgewotCQl3cWVfaXhfYmUgPSAqd3EtPnRhaWxfbmV4dDsKLQkJd3FlX2l4ICAgID0gYmUxNl90b19jcHUod3FlX2l4X2JlKTsKLQkJd3FlICAgICAgID0gbWx4NV93cV9sbF9nZXRfd3FlKCZycS0+d3EsIHdxZV9peCk7Ci0JCXJxLT5kZWFsbG9jX3dxZShycSwgd3FlX2l4KTsKLQkJbWx4NV93cV9sbF9wb3AoJnJxLT53cSwgd3FlX2l4X2JlLAotCQkJICAgICAgICZ3cWUtPm5leHQubmV4dF93cWVfaW5kZXgpOwotCX0KKwltbHg1ZV9mcmVlX3J4X21wd3FlKHJxLCB3aSk7CiB9CiAKICNkZWZpbmUgUlFfQ0FOTk9UX1BPU1QocnEpIFwKLQkJKCF0ZXN0X2JpdChNTFg1RV9SUV9TVEFURV9QT1NUX1dRRVNfRU5BQkxFLCAmcnEtPnN0YXRlKSB8fCBcCi0JCSB0ZXN0X2JpdChNTFg1RV9SUV9TVEFURV9VTVJfV1FFX0lOX1BST0dSRVNTLCAmcnEtPnN0YXRlKSkKKwkodGVzdF9iaXQoTUxYNUVfUlFfU1RBVEVfRkxVU0gsICZycS0+c3RhdGUpIHx8IFwKKwkgdGVzdF9iaXQoTUxYNUVfUlFfU1RBVEVfVU1SX1dRRV9JTl9QUk9HUkVTUywgJnJxLT5zdGF0ZSkpCiAKIGJvb2wgbWx4NWVfcG9zdF9yeF93cWVzKHN0cnVjdCBtbHg1ZV9ycSAqcnEpCiB7CkBAIC02MjgsOSArNDYwLDEwIEBACiAJCWludCBlcnI7CiAKIAkJZXJyID0gcnEtPmFsbG9jX3dxZShycSwgd3FlLCB3cS0+aGVhZCk7CisJCWlmIChlcnIgPT0gLUVCVVNZKQorCQkJcmV0dXJuIHRydWU7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlpZiAoZXJyICE9IC1FQlVTWSkKLQkJCQlycS0+c3RhdHMuYnVmZl9hbGxvY19lcnIrKzsKKwkJCXJxLT5zdGF0cy5idWZmX2FsbG9jX2VycisrOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtNjQ4LDI0ICs0ODEsMzIgQEAKIHN0YXRpYyB2b2lkIG1seDVlX2xyb191cGRhdGVfaGRyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBtbHg1X2NxZTY0ICpjcWUsCiAJCQkJIHUzMiBjcWVfYmNudCkKIHsKLQlzdHJ1Y3QgZXRoaGRyCSpldGgJPSAoc3RydWN0IGV0aGhkciAqKShza2ItPmRhdGEpOwotCXN0cnVjdCBpcGhkcgkqaXB2NAk9IChzdHJ1Y3QgaXBoZHIgKikoc2tiLT5kYXRhICsgRVRIX0hMRU4pOwotCXN0cnVjdCBpcHY2aGRyCSppcHY2CT0gKHN0cnVjdCBpcHY2aGRyICopKHNrYi0+ZGF0YSArIEVUSF9ITEVOKTsKKwlzdHJ1Y3QgZXRoaGRyCSpldGggPSAoc3RydWN0IGV0aGhkciAqKShza2ItPmRhdGEpOworCXN0cnVjdCBpcGhkcgkqaXB2NDsKKwlzdHJ1Y3QgaXB2NmhkcgkqaXB2NjsKIAlzdHJ1Y3QgdGNwaGRyCSp0Y3A7CisJaW50IG5ldHdvcmtfZGVwdGggPSAwOworCV9fYmUxNiBwcm90bzsKKwl1MTYgdG90X2xlbjsKIAogCXU4IGw0X2hkcl90eXBlID0gZ2V0X2NxZV9sNF9oZHJfdHlwZShjcWUpOwogCWludCB0Y3BfYWNrID0gKChDUUVfTDRfSERSX1RZUEVfVENQX0FDS19OT19EQVRBICA9PSBsNF9oZHJfdHlwZSkgfHwKIAkJICAgICAgIChDUUVfTDRfSERSX1RZUEVfVENQX0FDS19BTkRfREFUQSA9PSBsNF9oZHJfdHlwZSkpOwogCi0JdTE2IHRvdF9sZW4gPSBjcWVfYmNudCAtIEVUSF9ITEVOOworCXNrYi0+bWFjX2xlbiA9IEVUSF9ITEVOOworCXByb3RvID0gX192bGFuX2dldF9wcm90b2NvbChza2IsIGV0aC0+aF9wcm90bywgJm5ldHdvcmtfZGVwdGgpOwogCi0JaWYgKGV0aC0+aF9wcm90byA9PSBodG9ucyhFVEhfUF9JUCkpIHsKLQkJdGNwID0gKHN0cnVjdCB0Y3BoZHIgKikoc2tiLT5kYXRhICsgRVRIX0hMRU4gKworCWlwdjQgPSAoc3RydWN0IGlwaGRyICopKHNrYi0+ZGF0YSArIG5ldHdvcmtfZGVwdGgpOworCWlwdjYgPSAoc3RydWN0IGlwdjZoZHIgKikoc2tiLT5kYXRhICsgbmV0d29ya19kZXB0aCk7CisJdG90X2xlbiA9IGNxZV9iY250IC0gbmV0d29ya19kZXB0aDsKKworCWlmIChwcm90byA9PSBodG9ucyhFVEhfUF9JUCkpIHsKKwkJdGNwID0gKHN0cnVjdCB0Y3BoZHIgKikoc2tiLT5kYXRhICsgbmV0d29ya19kZXB0aCArCiAJCQkJCXNpemVvZihzdHJ1Y3QgaXBoZHIpKTsKIAkJaXB2NiA9IE5VTEw7CiAJCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUgPSBTS0JfR1NPX1RDUFY0OwogCX0gZWxzZSB7Ci0JCXRjcCA9IChzdHJ1Y3QgdGNwaGRyICopKHNrYi0+ZGF0YSArIEVUSF9ITEVOICsKKwkJdGNwID0gKHN0cnVjdCB0Y3BoZHIgKikoc2tiLT5kYXRhICsgbmV0d29ya19kZXB0aCArCiAJCQkJCXNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOwogCQlpcHY0ID0gTlVMTDsKIAkJc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSA9IFNLQl9HU09fVENQVjY7CkBAIC03ODksMTIgKzYzMCwxODYgQEAKIAlycS0+c3RhdHMucGFja2V0cysrOwogCXJxLT5zdGF0cy5ieXRlcyArPSBjcWVfYmNudDsKIAltbHg1ZV9idWlsZF9yeF9za2IoY3FlLCBjcWVfYmNudCwgcnEsIHNrYik7Ci0JbmFwaV9ncm9fcmVjZWl2ZShycS0+Y3EubmFwaSwgc2tiKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1seDVlX3htaXRfeGRwX2Rvb3JiZWxsKHN0cnVjdCBtbHg1ZV9zcSAqc3EpCit7CisJc3RydWN0IG1seDVfd3FfY3ljICp3cSA9ICZzcS0+d3E7CisJc3RydWN0IG1seDVlX3R4X3dxZSAqd3FlOworCXUxNiBwaSA9IChzcS0+cGMgLSBNTFg1RV9YRFBfVFhfV1FFQkJTKSAmIHdxLT5zel9tMTsgLyogbGFzdCBwaSAqLworCisJd3FlICA9IG1seDVfd3FfY3ljX2dldF93cWUod3EsIHBpKTsKKworCXdxZS0+Y3RybC5mbV9jZV9zZSA9IE1MWDVfV1FFX0NUUkxfQ1FfVVBEQVRFOworCW1seDVlX3R4X25vdGlmeV9odyhzcSwgJndxZS0+Y3RybCwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtbHg1ZV94bWl0X3hkcF9mcmFtZShzdHJ1Y3QgbWx4NWVfcnEgKnJxLAorCQkJCQlzdHJ1Y3QgbWx4NWVfZG1hX2luZm8gKmRpLAorCQkJCQl1bnNpZ25lZCBpbnQgZGF0YV9vZmZzZXQsCisJCQkJCWludCBsZW4pCit7CisJc3RydWN0IG1seDVlX3NxICAgICAgICAgICpzcSAgID0gJnJxLT5jaGFubmVsLT54ZHBfc3E7CisJc3RydWN0IG1seDVfd3FfY3ljICAgICAgICp3cSAgID0gJnNxLT53cTsKKwl1MTYgICAgICAgICAgICAgICAgICAgICAgcGkgICAgPSBzcS0+cGMgJiB3cS0+c3pfbTE7CisJc3RydWN0IG1seDVlX3R4X3dxZSAgICAgICp3cWUgID0gbWx4NV93cV9jeWNfZ2V0X3dxZSh3cSwgcGkpOworCXN0cnVjdCBtbHg1ZV9zcV93cWVfaW5mbyAqd2kgICA9ICZzcS0+ZGIueGRwLndxZV9pbmZvW3BpXTsKKworCXN0cnVjdCBtbHg1X3dxZV9jdHJsX3NlZyAqY3NlZyA9ICZ3cWUtPmN0cmw7CisJc3RydWN0IG1seDVfd3FlX2V0aF9zZWcgICplc2VnID0gJndxZS0+ZXRoOworCXN0cnVjdCBtbHg1X3dxZV9kYXRhX3NlZyAqZHNlZzsKKworCWRtYV9hZGRyX3QgZG1hX2FkZHIgID0gZGktPmFkZHIgKyBkYXRhX29mZnNldCArIE1MWDVFX1hEUF9NSU5fSU5MSU5FOworCXVuc2lnbmVkIGludCBkbWFfbGVuID0gbGVuIC0gTUxYNUVfWERQX01JTl9JTkxJTkU7CisJdm9pZCAqZGF0YSAgICAgICAgICAgPSBwYWdlX2FkZHJlc3MoZGktPnBhZ2UpICsgZGF0YV9vZmZzZXQ7CisKKwlpZiAodW5saWtlbHkoIW1seDVlX3NxX2hhc19yb29tX2ZvcihzcSwgTUxYNUVfWERQX1RYX1dRRUJCUykpKSB7CisJCWlmIChzcS0+ZGIueGRwLmRvb3JiZWxsKSB7CisJCQkvKiBTUSBpcyBmdWxsLCByaW5nIGRvb3JiZWxsICovCisJCQltbHg1ZV94bWl0X3hkcF9kb29yYmVsbChzcSk7CisJCQlzcS0+ZGIueGRwLmRvb3JiZWxsID0gZmFsc2U7CisJCX0KKwkJcnEtPnN0YXRzLnhkcF90eF9mdWxsKys7CisJCW1seDVlX3BhZ2VfcmVsZWFzZShycSwgZGksIHRydWUpOworCQlyZXR1cm47CisJfQorCisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3EtPnBkZXYsIGRtYV9hZGRyLCBkbWFfbGVuLAorCQkJCSAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJbWVtc2V0KHdxZSwgMCwgc2l6ZW9mKCp3cWUpKTsKKworCS8qIGNvcHkgdGhlIGlubGluZSBwYXJ0ICovCisJbWVtY3B5KGVzZWctPmlubGluZV9oZHJfc3RhcnQsIGRhdGEsIE1MWDVFX1hEUF9NSU5fSU5MSU5FKTsKKwllc2VnLT5pbmxpbmVfaGRyX3N6ID0gY3B1X3RvX2JlMTYoTUxYNUVfWERQX01JTl9JTkxJTkUpOworCisJZHNlZyA9IChzdHJ1Y3QgbWx4NV93cWVfZGF0YV9zZWcgKiljc2VnICsgKE1MWDVFX1hEUF9UWF9EU19DT1VOVCAtIDEpOworCisJLyogd3JpdGUgdGhlIGRtYSBwYXJ0ICovCisJZHNlZy0+YWRkciAgICAgICA9IGNwdV90b19iZTY0KGRtYV9hZGRyKTsKKwlkc2VnLT5ieXRlX2NvdW50ID0gY3B1X3RvX2JlMzIoZG1hX2xlbik7CisJZHNlZy0+bGtleSAgICAgICA9IHNxLT5ta2V5X2JlOworCisJY3NlZy0+b3Btb2RfaWR4X29wY29kZSA9IGNwdV90b19iZTMyKChzcS0+cGMgPDwgOCkgfCBNTFg1X09QQ09ERV9TRU5EKTsKKwljc2VnLT5xcG5fZHMgPSBjcHVfdG9fYmUzMigoc3EtPnNxbiA8PCA4KSB8IE1MWDVFX1hEUF9UWF9EU19DT1VOVCk7CisKKwlzcS0+ZGIueGRwLmRpW3BpXSA9ICpkaTsKKwl3aS0+b3Bjb2RlICAgICA9IE1MWDVfT1BDT0RFX1NFTkQ7CisJd2ktPm51bV93cWViYnMgPSBNTFg1RV9YRFBfVFhfV1FFQkJTOworCXNxLT5wYyArPSBNTFg1RV9YRFBfVFhfV1FFQkJTOworCisJc3EtPmRiLnhkcC5kb29yYmVsbCA9IHRydWU7CisJcnEtPnN0YXRzLnhkcF90eCsrOworfQorCisvKiByZXR1cm5zIHRydWUgaWYgcGFja2V0IHdhcyBjb25zdW1lZCBieSB4ZHAgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBtbHg1ZV94ZHBfaGFuZGxlKHN0cnVjdCBtbHg1ZV9ycSAqcnEsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZywKKwkJCQkgICAgc3RydWN0IG1seDVlX2RtYV9pbmZvICpkaSwKKwkJCQkgICAgdm9pZCAqZGF0YSwgdTE2IGxlbikKK3sKKwlzdHJ1Y3QgeGRwX2J1ZmYgeGRwOworCXUzMiBhY3Q7CisKKwlpZiAoIXByb2cpCisJCXJldHVybiBmYWxzZTsKKworCXhkcC5kYXRhID0gZGF0YTsKKwl4ZHAuZGF0YV9lbmQgPSB4ZHAuZGF0YSArIGxlbjsKKwlhY3QgPSBicGZfcHJvZ19ydW5feGRwKHByb2csICZ4ZHApOworCXN3aXRjaCAoYWN0KSB7CisJY2FzZSBYRFBfUEFTUzoKKwkJcmV0dXJuIGZhbHNlOworCWNhc2UgWERQX1RYOgorCQltbHg1ZV94bWl0X3hkcF9mcmFtZShycSwgZGksIE1MWDVfUlhfSEVBRFJPT00sIGxlbik7CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCWJwZl93YXJuX2ludmFsaWRfeGRwX2FjdGlvbihhY3QpOworCWNhc2UgWERQX0FCT1JURUQ6CisJY2FzZSBYRFBfRFJPUDoKKwkJcnEtPnN0YXRzLnhkcF9kcm9wKys7CisJCW1seDVlX3BhZ2VfcmVsZWFzZShycSwgZGksIHRydWUpOworCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBza19idWZmICpza2JfZnJvbV9jcWUoc3RydWN0IG1seDVlX3JxICpycSwgc3RydWN0IG1seDVfY3FlNjQgKmNxZSwKKwkJCSAgICAgdTE2IHdxZV9jb3VudGVyLCB1MzIgY3FlX2JjbnQpCit7CisJc3RydWN0IGJwZl9wcm9nICp4ZHBfcHJvZyA9IFJFQURfT05DRShycS0+eGRwX3Byb2cpOworCXN0cnVjdCBtbHg1ZV9kbWFfaW5mbyAqZGk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl2b2lkICp2YSwgKmRhdGE7CisKKwlkaSAgICAgICAgICAgICA9ICZycS0+ZG1hX2luZm9bd3FlX2NvdW50ZXJdOworCXZhICAgICAgICAgICAgID0gcGFnZV9hZGRyZXNzKGRpLT5wYWdlKTsKKwlkYXRhICAgICAgICAgICA9IHZhICsgTUxYNV9SWF9IRUFEUk9PTTsKKworCWRtYV9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfY3B1KHJxLT5wZGV2LAorCQkJCSAgICAgIGRpLT5hZGRyLAorCQkJCSAgICAgIE1MWDVfUlhfSEVBRFJPT00sCisJCQkJICAgICAgcnEtPmJ1ZmYud3FlX3N6LAorCQkJCSAgICAgIERNQV9GUk9NX0RFVklDRSk7CisJcHJlZmV0Y2goZGF0YSk7CisKKwlpZiAodW5saWtlbHkoKGNxZS0+b3Bfb3duID4+IDQpICE9IE1MWDVfQ1FFX1JFU1BfU0VORCkpIHsKKwkJcnEtPnN0YXRzLndxZV9lcnIrKzsKKwkJbWx4NWVfcGFnZV9yZWxlYXNlKHJxLCBkaSwgdHJ1ZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChtbHg1ZV94ZHBfaGFuZGxlKHJxLCB4ZHBfcHJvZywgZGksIGRhdGEsIGNxZV9iY250KSkKKwkJcmV0dXJuIE5VTEw7IC8qIHBhZ2UvcGFja2V0IHdhcyBjb25zdW1lZCBieSBYRFAgKi8KKworCXNrYiA9IGJ1aWxkX3NrYih2YSwgUlFfUEFHRV9TSVpFKHJxKSk7CisJaWYgKHVubGlrZWx5KCFza2IpKSB7CisJCXJxLT5zdGF0cy5idWZmX2FsbG9jX2VycisrOworCQltbHg1ZV9wYWdlX3JlbGVhc2UocnEsIGRpLCB0cnVlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogcXVldWUgdXAgZm9yIHJlY3ljbGluZyAuLiovCisJcGFnZV9yZWZfaW5jKGRpLT5wYWdlKTsKKwltbHg1ZV9wYWdlX3JlbGVhc2UocnEsIGRpLCB0cnVlKTsKKworCXNrYl9yZXNlcnZlKHNrYiwgTUxYNV9SWF9IRUFEUk9PTSk7CisJc2tiX3B1dChza2IsIGNxZV9iY250KTsKKworCXJldHVybiBza2I7CiB9CiAKIHZvaWQgbWx4NWVfaGFuZGxlX3J4X2NxZShzdHJ1Y3QgbWx4NWVfcnEgKnJxLCBzdHJ1Y3QgbWx4NV9jcWU2NCAqY3FlKQogewogCXN0cnVjdCBtbHg1ZV9yeF93cWUgKndxZTsKKwlfX2JlMTYgd3FlX2NvdW50ZXJfYmU7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1MTYgd3FlX2NvdW50ZXI7CisJdTMyIGNxZV9iY250OworCisJd3FlX2NvdW50ZXJfYmUgPSBjcWUtPndxZV9jb3VudGVyOworCXdxZV9jb3VudGVyICAgID0gYmUxNl90b19jcHUod3FlX2NvdW50ZXJfYmUpOworCXdxZSAgICAgICAgICAgID0gbWx4NV93cV9sbF9nZXRfd3FlKCZycS0+d3EsIHdxZV9jb3VudGVyKTsKKwljcWVfYmNudCAgICAgICA9IGJlMzJfdG9fY3B1KGNxZS0+Ynl0ZV9jbnQpOworCisJc2tiID0gc2tiX2Zyb21fY3FlKHJxLCBjcWUsIHdxZV9jb3VudGVyLCBjcWVfYmNudCk7CisJaWYgKCFza2IpCisJCWdvdG8gd3FfbGxfcG9wOworCisJbWx4NWVfY29tcGxldGVfcnhfY3FlKHJxLCBjcWUsIGNxZV9iY250LCBza2IpOworCW5hcGlfZ3JvX3JlY2VpdmUocnEtPmNxLm5hcGksIHNrYik7CisKK3dxX2xsX3BvcDoKKwltbHg1X3dxX2xsX3BvcCgmcnEtPndxLCB3cWVfY291bnRlcl9iZSwKKwkJICAgICAgICZ3cWUtPm5leHQubmV4dF93cWVfaW5kZXgpOworfQorCit2b2lkIG1seDVlX2hhbmRsZV9yeF9jcWVfcmVwKHN0cnVjdCBtbHg1ZV9ycSAqcnEsIHN0cnVjdCBtbHg1X2NxZTY0ICpjcWUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHJxLT5uZXRkZXY7CisJc3RydWN0IG1seDVlX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBtbHg1X2Vzd2l0Y2hfcmVwICpyZXAgPSBwcml2LT5wcHJpdjsKKwlzdHJ1Y3QgbWx4NWVfcnhfd3FlICp3cWU7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlfX2JlMTYgd3FlX2NvdW50ZXJfYmU7CiAJdTE2IHdxZV9jb3VudGVyOwpAQCAtODAzLDI2ICs4MTgsMTkgQEAKIAl3cWVfY291bnRlcl9iZSA9IGNxZS0+d3FlX2NvdW50ZXI7CiAJd3FlX2NvdW50ZXIgICAgPSBiZTE2X3RvX2NwdSh3cWVfY291bnRlcl9iZSk7CiAJd3FlICAgICAgICAgICAgPSBtbHg1X3dxX2xsX2dldF93cWUoJnJxLT53cSwgd3FlX2NvdW50ZXIpOwotCXNrYiAgICAgICAgICAgID0gcnEtPnNrYlt3cWVfY291bnRlcl07Ci0JcHJlZmV0Y2goc2tiLT5kYXRhKTsKLQlycS0+c2tiW3dxZV9jb3VudGVyXSA9IE5VTEw7CisJY3FlX2JjbnQgICAgICAgPSBiZTMyX3RvX2NwdShjcWUtPmJ5dGVfY250KTsKIAotCWRtYV91bm1hcF9zaW5nbGUocnEtPnBkZXYsCi0JCQkgKigoZG1hX2FkZHJfdCAqKXNrYi0+Y2IpLAotCQkJIHJxLT53cWVfc3osCi0JCQkgRE1BX0ZST01fREVWSUNFKTsKLQotCWlmICh1bmxpa2VseSgoY3FlLT5vcF9vd24gPj4gNCkgIT0gTUxYNV9DUUVfUkVTUF9TRU5EKSkgewotCQlycS0+c3RhdHMud3FlX2VycisrOwotCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJc2tiID0gc2tiX2Zyb21fY3FlKHJxLCBjcWUsIHdxZV9jb3VudGVyLCBjcWVfYmNudCk7CisJaWYgKCFza2IpCiAJCWdvdG8gd3FfbGxfcG9wOwotCX0KLQotCWNxZV9iY250ID0gYmUzMl90b19jcHUoY3FlLT5ieXRlX2NudCk7Ci0Jc2tiX3B1dChza2IsIGNxZV9iY250KTsKIAogCW1seDVlX2NvbXBsZXRlX3J4X2NxZShycSwgY3FlLCBjcWVfYmNudCwgc2tiKTsKIAorCWlmIChyZXAtPnZsYW4gJiYgc2tiX3ZsYW5fdGFnX3ByZXNlbnQoc2tiKSkKKwkJc2tiX3ZsYW5fcG9wKHNrYik7CisKKwluYXBpX2dyb19yZWNlaXZlKHJxLT5jcS5uYXBpLCBza2IpOworCiB3cV9sbF9wb3A6CiAJbWx4NV93cV9sbF9wb3AoJnJxLT53cSwgd3FlX2NvdW50ZXJfYmUsCiAJCSAgICAgICAmd3FlLT5uZXh0Lm5leHRfd3FlX2luZGV4KTsKQEAgLTgzNCw3ICs4NDIsNiBAQAogCQkJCQkgICB1MzIgY3FlX2JjbnQsCiAJCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JdTMyIGNvbnN1bWVkX2J5dGVzID0gQUxJR04oY3FlX2JjbnQsIHJxLT5tcHdxZV9zdHJpZGVfc3opOwogCXUxNiBzdHJpZGVfaXggICAgICA9IG1wd3JxX2dldF9jcWVfc3RyaWRlX2luZGV4KGNxZSk7CiAJdTMyIHdxZV9vZmZzZXQgICAgID0gc3RyaWRlX2l4ICogcnEtPm1wd3FlX3N0cmlkZV9zejsKIAl1MzIgaGVhZF9vZmZzZXQgICAgPSB3cWVfb2Zmc2V0ICYgKFBBR0VfU0laRSAtIDEpOwpAQCAtODQ4LDIxICs4NTUsMjAgQEAKIAkJcGFnZV9pZHgrKzsKIAkJZnJhZ19vZmZzZXQgLT0gUEFHRV9TSVpFOwogCX0KLQl3aS0+ZG1hX3ByZV9zeW5jKHJxLT5wZGV2LCB3aSwgd3FlX29mZnNldCwgY29uc3VtZWRfYnl0ZXMpOwogCiAJd2hpbGUgKGJ5dGVfY250KSB7CiAJCXUzMiBwZ19jb25zdW1lZF9ieXRlcyA9CiAJCQltaW5fdCh1MzIsIFBBR0VfU0laRSAtIGZyYWdfb2Zmc2V0LCBieXRlX2NudCk7CiAKLQkJd2ktPmFkZF9za2JfZnJhZyhycSwgc2tiLCB3aSwgcGFnZV9pZHgsIGZyYWdfb2Zmc2V0LAotCQkJCSBwZ19jb25zdW1lZF9ieXRlcyk7CisJCW1seDVlX2FkZF9za2JfZnJhZ19tcHdxZShycSwgc2tiLCB3aSwgcGFnZV9pZHgsIGZyYWdfb2Zmc2V0LAorCQkJCQkgcGdfY29uc3VtZWRfYnl0ZXMpOwogCQlieXRlX2NudCAtPSBwZ19jb25zdW1lZF9ieXRlczsKIAkJZnJhZ19vZmZzZXQgPSAwOwogCQlwYWdlX2lkeCsrOwogCX0KIAkvKiBjb3B5IGhlYWRlciAqLwotCXdpLT5jb3B5X3NrYl9oZWFkZXIocnEtPnBkZXYsIHNrYiwgd2ksIGhlYWRfcGFnZV9pZHgsIGhlYWRfb2Zmc2V0LAotCQkJICAgIGhlYWRsZW4pOworCW1seDVlX2NvcHlfc2tiX2hlYWRlcl9tcHdxZShycS0+cGRldiwgc2tiLCB3aSwgaGVhZF9wYWdlX2lkeCwKKwkJCQkgICAgaGVhZF9vZmZzZXQsIGhlYWRsZW4pOwogCS8qIHNrYiBsaW5lYXIgcGFydCB3YXMgYWxsb2NhdGVkIHdpdGggaGVhZGxlbiBhbmQgYWxpZ25lZCB0byBsb25nICovCiAJc2tiLT50YWlsICs9IGhlYWRsZW47CiAJc2tiLT5sZW4gICs9IGhlYWRsZW47CkBAIC04NzIsNyArODc4LDcgQEAKIHsKIAl1MTYgY3N0cmlkZXMgICAgICAgPSBtcHdycV9nZXRfY3FlX2NvbnN1bWVkX3N0cmlkZXMoY3FlKTsKIAl1MTYgd3FlX2lkICAgICAgICAgPSBiZTE2X3RvX2NwdShjcWUtPndxZV9pZCk7Ci0Jc3RydWN0IG1seDVlX21wd19pbmZvICp3aSA9ICZycS0+d3FlX2luZm9bd3FlX2lkXTsKKwlzdHJ1Y3QgbWx4NWVfbXB3X2luZm8gKndpID0gJnJxLT5tcHdxZS5pbmZvW3dxZV9pZF07CiAJc3RydWN0IG1seDVlX3J4X3dxZSAgKndxZSA9IG1seDVfd3FfbGxfZ2V0X3dxZSgmcnEtPndxLCB3cWVfaWQpOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJdTE2IGNxZV9iY250OwpAQCAtOTAyLDIxICs5MDgsMjMgQEAKIAogCW1seDVlX21wd3FlX2ZpbGxfcnhfc2tiKHJxLCBjcWUsIHdpLCBjcWVfYmNudCwgc2tiKTsKIAltbHg1ZV9jb21wbGV0ZV9yeF9jcWUocnEsIGNxZSwgY3FlX2JjbnQsIHNrYik7CisJbmFwaV9ncm9fcmVjZWl2ZShycS0+Y3EubmFwaSwgc2tiKTsKIAogbXB3cnFfY3FlX291dDoKIAlpZiAobGlrZWx5KHdpLT5jb25zdW1lZF9zdHJpZGVzIDwgcnEtPm1wd3FlX251bV9zdHJpZGVzKSkKIAkJcmV0dXJuOwogCi0Jd2ktPmZyZWVfd3FlKHJxLCB3aSk7CisJbWx4NWVfZnJlZV9yeF9tcHdxZShycSwgd2kpOwogCW1seDVfd3FfbGxfcG9wKCZycS0+d3EsIGNxZS0+d3FlX2lkLCAmd3FlLT5uZXh0Lm5leHRfd3FlX2luZGV4KTsKIH0KIAogaW50IG1seDVlX3BvbGxfcnhfY3Eoc3RydWN0IG1seDVlX2NxICpjcSwgaW50IGJ1ZGdldCkKIHsKIAlzdHJ1Y3QgbWx4NWVfcnEgKnJxID0gY29udGFpbmVyX29mKGNxLCBzdHJ1Y3QgbWx4NWVfcnEsIGNxKTsKKwlzdHJ1Y3QgbWx4NWVfc3EgKnhkcF9zcSA9ICZycS0+Y2hhbm5lbC0+eGRwX3NxOwogCWludCB3b3JrX2RvbmUgPSAwOwogCi0JaWYgKHVubGlrZWx5KHRlc3RfYml0KE1MWDVFX1JRX1NUQVRFX0ZMVVNIX1RJTUVPVVQsICZycS0+c3RhdGUpKSkKKwlpZiAodW5saWtlbHkodGVzdF9iaXQoTUxYNUVfUlFfU1RBVEVfRkxVU0gsICZycS0+c3RhdGUpKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoY3EtPmRlY21wcnNfbGVmdCkKQEAgLTk0MCw2ICs5NDgsMTEgQEAKIAkJcnEtPmhhbmRsZV9yeF9jcWUocnEsIGNxZSk7CiAJfQogCisJaWYgKHhkcF9zcS0+ZGIueGRwLmRvb3JiZWxsKSB7CisJCW1seDVlX3htaXRfeGRwX2Rvb3JiZWxsKHhkcF9zcSk7CisJCXhkcF9zcS0+ZGIueGRwLmRvb3JiZWxsID0gZmFsc2U7CisJfQorCiAJbWx4NV9jcXdxX3VwZGF0ZV9kYl9yZWNvcmQoJmNxLT53cSk7CiAKIAkvKiBlbnN1cmUgY3Egc3BhY2UgaXMgZnJlZWQgYmVmb3JlIGVuYWJsaW5nIG1vcmUgY3FlcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX3N0YXRzLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fc3RhdHMuaAppbmRleCA3YjlkOGE5Li41NzQ1MmZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fc3RhdHMuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fc3RhdHMuaApAQCAtNjUsMTcgKzY1LDI0IEBACiAJdTY0IHJ4X2NzdW1fbm9uZTsKIAl1NjQgcnhfY3N1bV9jb21wbGV0ZTsKIAl1NjQgcnhfY3N1bV91bm5lY2Vzc2FyeV9pbm5lcjsKKwl1NjQgcnhfeGRwX2Ryb3A7CisJdTY0IHJ4X3hkcF90eDsKKwl1NjQgcnhfeGRwX3R4X2Z1bGw7CiAJdTY0IHR4X2NzdW1fcGFydGlhbDsKIAl1NjQgdHhfY3N1bV9wYXJ0aWFsX2lubmVyOwogCXU2NCB0eF9xdWV1ZV9zdG9wcGVkOwogCXU2NCB0eF9xdWV1ZV93YWtlOwogCXU2NCB0eF9xdWV1ZV9kcm9wcGVkOworCXU2NCB0eF94bWl0X21vcmU7CiAJdTY0IHJ4X3dxZV9lcnI7CiAJdTY0IHJ4X21wd3FlX2ZpbGxlcjsKLQl1NjQgcnhfbXB3cWVfZnJhZzsKIAl1NjQgcnhfYnVmZl9hbGxvY19lcnI7CiAJdTY0IHJ4X2NxZV9jb21wcmVzc19ibGtzOwogCXU2NCByeF9jcWVfY29tcHJlc3NfcGt0czsKKwl1NjQgcnhfY2FjaGVfcmV1c2U7CisJdTY0IHJ4X2NhY2hlX2Z1bGw7CisJdTY0IHJ4X2NhY2hlX2VtcHR5OworCXU2NCByeF9jYWNoZV9idXN5OwogCiAJLyogU3BlY2lhbCBoYW5kbGluZyBjb3VudGVycyAqLwogCXU2NCBsaW5rX2Rvd25fZXZlbnRzX3BoeTsKQEAgLTk2LDE3ICsxMDMsMjQgQEAKIAl7IE1MWDVFX0RFQ0xBUkVfU1RBVChzdHJ1Y3QgbWx4NWVfc3dfc3RhdHMsIHJ4X2NzdW1fbm9uZSkgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfU1RBVChzdHJ1Y3QgbWx4NWVfc3dfc3RhdHMsIHJ4X2NzdW1fY29tcGxldGUpIH0sCiAJeyBNTFg1RV9ERUNMQVJFX1NUQVQoc3RydWN0IG1seDVlX3N3X3N0YXRzLCByeF9jc3VtX3VubmVjZXNzYXJ5X2lubmVyKSB9LAorCXsgTUxYNUVfREVDTEFSRV9TVEFUKHN0cnVjdCBtbHg1ZV9zd19zdGF0cywgcnhfeGRwX2Ryb3ApIH0sCisJeyBNTFg1RV9ERUNMQVJFX1NUQVQoc3RydWN0IG1seDVlX3N3X3N0YXRzLCByeF94ZHBfdHgpIH0sCisJeyBNTFg1RV9ERUNMQVJFX1NUQVQoc3RydWN0IG1seDVlX3N3X3N0YXRzLCByeF94ZHBfdHhfZnVsbCkgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfU1RBVChzdHJ1Y3QgbWx4NWVfc3dfc3RhdHMsIHR4X2NzdW1fcGFydGlhbCkgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfU1RBVChzdHJ1Y3QgbWx4NWVfc3dfc3RhdHMsIHR4X2NzdW1fcGFydGlhbF9pbm5lcikgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfU1RBVChzdHJ1Y3QgbWx4NWVfc3dfc3RhdHMsIHR4X3F1ZXVlX3N0b3BwZWQpIH0sCiAJeyBNTFg1RV9ERUNMQVJFX1NUQVQoc3RydWN0IG1seDVlX3N3X3N0YXRzLCB0eF9xdWV1ZV93YWtlKSB9LAogCXsgTUxYNUVfREVDTEFSRV9TVEFUKHN0cnVjdCBtbHg1ZV9zd19zdGF0cywgdHhfcXVldWVfZHJvcHBlZCkgfSwKKwl7IE1MWDVFX0RFQ0xBUkVfU1RBVChzdHJ1Y3QgbWx4NWVfc3dfc3RhdHMsIHR4X3htaXRfbW9yZSkgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfU1RBVChzdHJ1Y3QgbWx4NWVfc3dfc3RhdHMsIHJ4X3dxZV9lcnIpIH0sCiAJeyBNTFg1RV9ERUNMQVJFX1NUQVQoc3RydWN0IG1seDVlX3N3X3N0YXRzLCByeF9tcHdxZV9maWxsZXIpIH0sCi0JeyBNTFg1RV9ERUNMQVJFX1NUQVQoc3RydWN0IG1seDVlX3N3X3N0YXRzLCByeF9tcHdxZV9mcmFnKSB9LAogCXsgTUxYNUVfREVDTEFSRV9TVEFUKHN0cnVjdCBtbHg1ZV9zd19zdGF0cywgcnhfYnVmZl9hbGxvY19lcnIpIH0sCiAJeyBNTFg1RV9ERUNMQVJFX1NUQVQoc3RydWN0IG1seDVlX3N3X3N0YXRzLCByeF9jcWVfY29tcHJlc3NfYmxrcykgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfU1RBVChzdHJ1Y3QgbWx4NWVfc3dfc3RhdHMsIHJ4X2NxZV9jb21wcmVzc19wa3RzKSB9LAorCXsgTUxYNUVfREVDTEFSRV9TVEFUKHN0cnVjdCBtbHg1ZV9zd19zdGF0cywgcnhfY2FjaGVfcmV1c2UpIH0sCisJeyBNTFg1RV9ERUNMQVJFX1NUQVQoc3RydWN0IG1seDVlX3N3X3N0YXRzLCByeF9jYWNoZV9mdWxsKSB9LAorCXsgTUxYNUVfREVDTEFSRV9TVEFUKHN0cnVjdCBtbHg1ZV9zd19zdGF0cywgcnhfY2FjaGVfZW1wdHkpIH0sCisJeyBNTFg1RV9ERUNMQVJFX1NUQVQoc3RydWN0IG1seDVlX3N3X3N0YXRzLCByeF9jYWNoZV9idXN5KSB9LAogCXsgTUxYNUVfREVDTEFSRV9TVEFUKHN0cnVjdCBtbHg1ZV9zd19zdGF0cywgbGlua19kb3duX2V2ZW50c19waHkpIH0sCiB9OwogCkBAIC0yNzAsMTIgKzI4NCwxOCBAQAogCXU2NCBjc3VtX25vbmU7CiAJdTY0IGxyb19wYWNrZXRzOwogCXU2NCBscm9fYnl0ZXM7CisJdTY0IHhkcF9kcm9wOworCXU2NCB4ZHBfdHg7CisJdTY0IHhkcF90eF9mdWxsOwogCXU2NCB3cWVfZXJyOwogCXU2NCBtcHdxZV9maWxsZXI7Ci0JdTY0IG1wd3FlX2ZyYWc7CiAJdTY0IGJ1ZmZfYWxsb2NfZXJyOwogCXU2NCBjcWVfY29tcHJlc3NfYmxrczsKIAl1NjQgY3FlX2NvbXByZXNzX3BrdHM7CisJdTY0IGNhY2hlX3JldXNlOworCXU2NCBjYWNoZV9mdWxsOworCXU2NCBjYWNoZV9lbXB0eTsKKwl1NjQgY2FjaGVfYnVzeTsKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY291bnRlcl9kZXNjIHJxX3N0YXRzX2Rlc2NbXSA9IHsKQEAgLTI4NCwyMCArMzA0LDI3IEBACiAJeyBNTFg1RV9ERUNMQVJFX1JYX1NUQVQoc3RydWN0IG1seDVlX3JxX3N0YXRzLCBjc3VtX2NvbXBsZXRlKSB9LAogCXsgTUxYNUVfREVDTEFSRV9SWF9TVEFUKHN0cnVjdCBtbHg1ZV9ycV9zdGF0cywgY3N1bV91bm5lY2Vzc2FyeV9pbm5lcikgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfUlhfU1RBVChzdHJ1Y3QgbWx4NWVfcnFfc3RhdHMsIGNzdW1fbm9uZSkgfSwKKwl7IE1MWDVFX0RFQ0xBUkVfUlhfU1RBVChzdHJ1Y3QgbWx4NWVfcnFfc3RhdHMsIHhkcF9kcm9wKSB9LAorCXsgTUxYNUVfREVDTEFSRV9SWF9TVEFUKHN0cnVjdCBtbHg1ZV9ycV9zdGF0cywgeGRwX3R4KSB9LAorCXsgTUxYNUVfREVDTEFSRV9SWF9TVEFUKHN0cnVjdCBtbHg1ZV9ycV9zdGF0cywgeGRwX3R4X2Z1bGwpIH0sCiAJeyBNTFg1RV9ERUNMQVJFX1JYX1NUQVQoc3RydWN0IG1seDVlX3JxX3N0YXRzLCBscm9fcGFja2V0cykgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfUlhfU1RBVChzdHJ1Y3QgbWx4NWVfcnFfc3RhdHMsIGxyb19ieXRlcykgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfUlhfU1RBVChzdHJ1Y3QgbWx4NWVfcnFfc3RhdHMsIHdxZV9lcnIpIH0sCiAJeyBNTFg1RV9ERUNMQVJFX1JYX1NUQVQoc3RydWN0IG1seDVlX3JxX3N0YXRzLCBtcHdxZV9maWxsZXIpIH0sCi0JeyBNTFg1RV9ERUNMQVJFX1JYX1NUQVQoc3RydWN0IG1seDVlX3JxX3N0YXRzLCBtcHdxZV9mcmFnKSB9LAogCXsgTUxYNUVfREVDTEFSRV9SWF9TVEFUKHN0cnVjdCBtbHg1ZV9ycV9zdGF0cywgYnVmZl9hbGxvY19lcnIpIH0sCiAJeyBNTFg1RV9ERUNMQVJFX1JYX1NUQVQoc3RydWN0IG1seDVlX3JxX3N0YXRzLCBjcWVfY29tcHJlc3NfYmxrcykgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfUlhfU1RBVChzdHJ1Y3QgbWx4NWVfcnFfc3RhdHMsIGNxZV9jb21wcmVzc19wa3RzKSB9LAorCXsgTUxYNUVfREVDTEFSRV9SWF9TVEFUKHN0cnVjdCBtbHg1ZV9ycV9zdGF0cywgY2FjaGVfcmV1c2UpIH0sCisJeyBNTFg1RV9ERUNMQVJFX1JYX1NUQVQoc3RydWN0IG1seDVlX3JxX3N0YXRzLCBjYWNoZV9mdWxsKSB9LAorCXsgTUxYNUVfREVDTEFSRV9SWF9TVEFUKHN0cnVjdCBtbHg1ZV9ycV9zdGF0cywgY2FjaGVfZW1wdHkpIH0sCisJeyBNTFg1RV9ERUNMQVJFX1JYX1NUQVQoc3RydWN0IG1seDVlX3JxX3N0YXRzLCBjYWNoZV9idXN5KSB9LAogfTsKIAogc3RydWN0IG1seDVlX3NxX3N0YXRzIHsKIAkvKiBjb21tb25seSBhY2Nlc3NlZCBpbiBkYXRhIHBhdGggKi8KIAl1NjQgcGFja2V0czsKIAl1NjQgYnl0ZXM7CisJdTY0IHhtaXRfbW9yZTsKIAl1NjQgdHNvX3BhY2tldHM7CiAJdTY0IHRzb19ieXRlczsKIAl1NjQgdHNvX2lubmVyX3BhY2tldHM7CkBAIC0zMjQsNiArMzUxLDcgQEAKIAl7IE1MWDVFX0RFQ0xBUkVfVFhfU1RBVChzdHJ1Y3QgbWx4NWVfc3Ffc3RhdHMsIHN0b3BwZWQpIH0sCiAJeyBNTFg1RV9ERUNMQVJFX1RYX1NUQVQoc3RydWN0IG1seDVlX3NxX3N0YXRzLCB3YWtlKSB9LAogCXsgTUxYNUVfREVDTEFSRV9UWF9TVEFUKHN0cnVjdCBtbHg1ZV9zcV9zdGF0cywgZHJvcHBlZCkgfSwKKwl7IE1MWDVFX0RFQ0xBUkVfVFhfU1RBVChzdHJ1Y3QgbWx4NWVfc3Ffc3RhdHMsIHhtaXRfbW9yZSkgfSwKIH07CiAKICNkZWZpbmUgTlVNX1NXX0NPVU5URVJTCQkJQVJSQVlfU0laRShzd19zdGF0c19kZXNjKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX3RjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fdGMuYwppbmRleCAwZjE5YjAxLi5jZThjNTRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fdGMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fdGMuYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JoYXNodGFibGUuaD4KICNpbmNsdWRlIDxuZXQvc3dpdGNoZGV2Lmg+CiAjaW5jbHVkZSA8bmV0L3RjX2FjdC90Y19taXJyZWQuaD4KKyNpbmNsdWRlIDxuZXQvdGNfYWN0L3RjX3ZsYW4uaD4KICNpbmNsdWRlICJlbi5oIgogI2luY2x1ZGUgImVuX3RjLmgiCiAjaW5jbHVkZSAiZXN3aXRjaC5oIgpAQCAtNDcsNiArNDgsNyBAQAogCXN0cnVjdCByaGFzaF9oZWFkCW5vZGU7CiAJdTY0CQkJY29va2llOwogCXN0cnVjdCBtbHg1X2Zsb3dfcnVsZQkqcnVsZTsKKwlzdHJ1Y3QgbWx4NV9lc3dfZmxvd19hdHRyICphdHRyOwogfTsKIAogI2RlZmluZSBNTFg1RV9UQ19UQUJMRV9OVU1fRU5UUklFUyAxMDI0CkBAIC0xMTQsMjcgKzExNiwzMCBAQAogCiBzdGF0aWMgc3RydWN0IG1seDVfZmxvd19ydWxlICptbHg1ZV90Y19hZGRfZmRiX2Zsb3coc3RydWN0IG1seDVlX3ByaXYgKnByaXYsCiAJCQkJCQkgICAgc3RydWN0IG1seDVfZmxvd19zcGVjICpzcGVjLAotCQkJCQkJICAgIHUzMiBhY3Rpb24sIHUzMiBkc3RfdnBvcnQpCisJCQkJCQkgICAgc3RydWN0IG1seDVfZXN3X2Zsb3dfYXR0ciAqYXR0cikKIHsKIAlzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3cgPSBwcml2LT5tZGV2LT5wcml2LmVzd2l0Y2g7Ci0Jc3RydWN0IG1seDVfZXN3aXRjaF9yZXAgKnJlcCA9IHByaXYtPnBwcml2OwotCXUzMiBzcmNfdnBvcnQ7CisJaW50IGVycjsKIAotCWlmIChyZXAtPnZwb3J0KSAvKiBzZXQgc291cmNlIHZwb3J0IGZvciB0aGUgZmxvdyAqLwotCQlzcmNfdnBvcnQgPSByZXAtPnZwb3J0OwotCWVsc2UKLQkJc3JjX3Zwb3J0ID0gRkRCX1VQTElOS19WUE9SVDsKKwllcnIgPSBtbHg1X2Vzd2l0Y2hfYWRkX3ZsYW5fYWN0aW9uKGVzdywgYXR0cik7CisJaWYgKGVycikKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIAotCXJldHVybiBtbHg1X2Vzd2l0Y2hfYWRkX29mZmxvYWRlZF9ydWxlKGVzdywgc3BlYywgYWN0aW9uLCBzcmNfdnBvcnQsIGRzdF92cG9ydCk7CisJcmV0dXJuIG1seDVfZXN3aXRjaF9hZGRfb2ZmbG9hZGVkX3J1bGUoZXN3LCBzcGVjLCBhdHRyKTsKIH0KIAogc3RhdGljIHZvaWQgbWx4NWVfdGNfZGVsX2Zsb3coc3RydWN0IG1seDVlX3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgbWx4NV9mbG93X3J1bGUgKnJ1bGUpCisJCQkgICAgICBzdHJ1Y3QgbWx4NV9mbG93X3J1bGUgKnJ1bGUsCisJCQkgICAgICBzdHJ1Y3QgbWx4NV9lc3dfZmxvd19hdHRyICphdHRyKQogeworCXN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdyA9IHByaXYtPm1kZXYtPnByaXYuZXN3aXRjaDsKIAlzdHJ1Y3QgbWx4NV9mYyAqY291bnRlciA9IE5VTEw7CiAKIAljb3VudGVyID0gbWx4NV9mbG93X3J1bGVfY291bnRlcihydWxlKTsKIAorCWlmIChlc3cgJiYgZXN3LT5tb2RlID09IFNSSU9WX09GRkxPQURTKQorCQltbHg1X2Vzd2l0Y2hfZGVsX3ZsYW5fYWN0aW9uKGVzdywgYXR0cik7CisKIAltbHg1X2RlbF9mbG93X3J1bGUocnVsZSk7CiAKIAltbHg1X2ZjX2Rlc3Ryb3kocHJpdi0+bWRldiwgY291bnRlcik7CkBAIC0xNTksNiArMTY0LDcgQEAKIAkgICAgfihCSVQoRkxPV19ESVNTRUNUT1JfS0VZX0NPTlRST0wpIHwKIAkgICAgICBCSVQoRkxPV19ESVNTRUNUT1JfS0VZX0JBU0lDKSB8CiAJICAgICAgQklUKEZMT1dfRElTU0VDVE9SX0tFWV9FVEhfQUREUlMpIHwKKwkgICAgICBCSVQoRkxPV19ESVNTRUNUT1JfS0VZX1ZMQU4pIHwKIAkgICAgICBCSVQoRkxPV19ESVNTRUNUT1JfS0VZX0lQVjRfQUREUlMpIHwKIAkgICAgICBCSVQoRkxPV19ESVNTRUNUT1JfS0VZX0lQVjZfQUREUlMpIHwKIAkgICAgICBCSVQoRkxPV19ESVNTRUNUT1JfS0VZX1BPUlRTKSkpIHsKQEAgLTE3MCw3ICsxNzYsNyBAQAogCWlmIChkaXNzZWN0b3JfdXNlc19rZXkoZi0+ZGlzc2VjdG9yLCBGTE9XX0RJU1NFQ1RPUl9LRVlfQ09OVFJPTCkpIHsKIAkJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9jb250cm9sICprZXkgPQogCQkJc2tiX2Zsb3dfZGlzc2VjdG9yX3RhcmdldChmLT5kaXNzZWN0b3IsCi0JCQkJCQkgIEZMT1dfRElTU0VDVE9SX0tFWV9CQVNJQywKKwkJCQkJCSAgRkxPV19ESVNTRUNUT1JfS0VZX0NPTlRST0wsCiAJCQkJCQkgIGYtPmtleSk7CiAJCWFkZHJfdHlwZSA9IGtleS0+YWRkcl90eXBlOwogCX0KQEAgLTIyMiw2ICsyMjgsMjQgQEAKIAkJCQlrZXktPnNyYyk7CiAJfQogCisJaWYgKGRpc3NlY3Rvcl91c2VzX2tleShmLT5kaXNzZWN0b3IsIEZMT1dfRElTU0VDVE9SX0tFWV9WTEFOKSkgeworCQlzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X3ZsYW4gKmtleSA9CisJCQlza2JfZmxvd19kaXNzZWN0b3JfdGFyZ2V0KGYtPmRpc3NlY3RvciwKKwkJCQkJCSAgRkxPV19ESVNTRUNUT1JfS0VZX1ZMQU4sCisJCQkJCQkgIGYtPmtleSk7CisJCXN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfdmxhbiAqbWFzayA9CisJCQlza2JfZmxvd19kaXNzZWN0b3JfdGFyZ2V0KGYtPmRpc3NlY3RvciwKKwkJCQkJCSAgRkxPV19ESVNTRUNUT1JfS0VZX1ZMQU4sCisJCQkJCQkgIGYtPm1hc2spOworCQlpZiAobWFzay0+dmxhbl9pZCkgeworCQkJTUxYNV9TRVQoZnRlX21hdGNoX3NldF9seXJfMl80LCBoZWFkZXJzX2MsIHZsYW5fdGFnLCAxKTsKKwkJCU1MWDVfU0VUKGZ0ZV9tYXRjaF9zZXRfbHlyXzJfNCwgaGVhZGVyc192LCB2bGFuX3RhZywgMSk7CisKKwkJCU1MWDVfU0VUKGZ0ZV9tYXRjaF9zZXRfbHlyXzJfNCwgaGVhZGVyc19jLCBmaXJzdF92aWQsIG1hc2stPnZsYW5faWQpOworCQkJTUxYNV9TRVQoZnRlX21hdGNoX3NldF9seXJfMl80LCBoZWFkZXJzX3YsIGZpcnN0X3ZpZCwga2V5LT52bGFuX2lkKTsKKwkJfQorCX0KKwogCWlmIChhZGRyX3R5cGUgPT0gRkxPV19ESVNTRUNUT1JfS0VZX0lQVjRfQUREUlMpIHsKIAkJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9pcHY0X2FkZHJzICprZXkgPQogCQkJc2tiX2Zsb3dfZGlzc2VjdG9yX3RhcmdldChmLT5kaXNzZWN0b3IsCkBAIC0zMTgsNiArMzQyLDcgQEAKIAkJCQl1MzIgKmFjdGlvbiwgdTMyICpmbG93X3RhZykKIHsKIAljb25zdCBzdHJ1Y3QgdGNfYWN0aW9uICphOworCUxJU1RfSEVBRChhY3Rpb25zKTsKIAogCWlmICh0Y19ub19hY3Rpb25zKGV4dHMpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTMyNSw3ICszNTAsOCBAQAogCSpmbG93X3RhZyA9IE1MWDVfRlNfREVGQVVMVF9GTE9XX1RBRzsKIAkqYWN0aW9uID0gMDsKIAotCXRjX2Zvcl9lYWNoX2FjdGlvbihhLCBleHRzKSB7CisJdGNmX2V4dHNfdG9fbGlzdChleHRzLCAmYWN0aW9ucyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShhLCAmYWN0aW9ucywgbGlzdCkgewogCQkvKiBPbmx5IHN1cHBvcnQgYSBzaW5nbGUgYWN0aW9uIHBlciBydWxlICovCiAJCWlmICgqYWN0aW9uKQogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zNTksMjMgKzM4NSwyMiBAQAogfQogCiBzdGF0aWMgaW50IHBhcnNlX3RjX2ZkYl9hY3Rpb25zKHN0cnVjdCBtbHg1ZV9wcml2ICpwcml2LCBzdHJ1Y3QgdGNmX2V4dHMgKmV4dHMsCi0JCQkJdTMyICphY3Rpb24sIHUzMiAqZGVzdF92cG9ydCkKKwkJCQlzdHJ1Y3QgbWx4NV9lc3dfZmxvd19hdHRyICphdHRyKQogewogCWNvbnN0IHN0cnVjdCB0Y19hY3Rpb24gKmE7CisJTElTVF9IRUFEKGFjdGlvbnMpOwogCiAJaWYgKHRjX25vX2FjdGlvbnMoZXh0cykpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JKmFjdGlvbiA9IDA7CisJbWVtc2V0KGF0dHIsIDAsIHNpemVvZigqYXR0cikpOworCWF0dHItPmluX3JlcCA9IHByaXYtPnBwcml2OwogCi0JdGNfZm9yX2VhY2hfYWN0aW9uKGEsIGV4dHMpIHsKLQkJLyogT25seSBzdXBwb3J0IGEgc2luZ2xlIGFjdGlvbiBwZXIgcnVsZSAqLwotCQlpZiAoKmFjdGlvbikKLQkJCXJldHVybiAtRUlOVkFMOwotCisJdGNmX2V4dHNfdG9fbGlzdChleHRzLCAmYWN0aW9ucyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShhLCAmYWN0aW9ucywgbGlzdCkgewogCQlpZiAoaXNfdGNmX2dhY3Rfc2hvdChhKSkgewotCQkJKmFjdGlvbiA9IE1MWDVfRkxPV19DT05URVhUX0FDVElPTl9EUk9QIHwKLQkJCQkgIE1MWDVfRkxPV19DT05URVhUX0FDVElPTl9DT1VOVDsKKwkJCWF0dHItPmFjdGlvbiB8PSBNTFg1X0ZMT1dfQ09OVEVYVF9BQ1RJT05fRFJPUCB8CisJCQkJCU1MWDVfRkxPV19DT05URVhUX0FDVElPTl9DT1VOVDsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTM4Myw3ICs0MDgsNiBAQAogCQkJaW50IGlmaW5kZXggPSB0Y2ZfbWlycmVkX2lmaW5kZXgoYSk7CiAJCQlzdHJ1Y3QgbmV0X2RldmljZSAqb3V0X2RldjsKIAkJCXN0cnVjdCBtbHg1ZV9wcml2ICpvdXRfcHJpdjsKLQkJCXN0cnVjdCBtbHg1X2Vzd2l0Y2hfcmVwICpvdXRfcmVwOwogCiAJCQlvdXRfZGV2ID0gX19kZXZfZ2V0X2J5X2luZGV4KGRldl9uZXQocHJpdi0+bmV0ZGV2KSwgaWZpbmRleCk7CiAKQEAgLTM5MywxMyArNDE3LDIyIEBACiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAKKwkJCWF0dHItPmFjdGlvbiB8PSBNTFg1X0ZMT1dfQ09OVEVYVF9BQ1RJT05fRldEX0RFU1Q7CiAJCQlvdXRfcHJpdiA9IG5ldGRldl9wcml2KG91dF9kZXYpOwotCQkJb3V0X3JlcCAgPSBvdXRfcHJpdi0+cHByaXY7Ci0JCQlpZiAob3V0X3JlcC0+dnBvcnQgPT0gMCkKLQkJCQkqZGVzdF92cG9ydCA9IEZEQl9VUExJTktfVlBPUlQ7Ci0JCQllbHNlCi0JCQkJKmRlc3RfdnBvcnQgPSBvdXRfcmVwLT52cG9ydDsKLQkJCSphY3Rpb24gPSBNTFg1X0ZMT1dfQ09OVEVYVF9BQ1RJT05fRldEX0RFU1Q7CisJCQlhdHRyLT5vdXRfcmVwID0gb3V0X3ByaXYtPnBwcml2OworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoaXNfdGNmX3ZsYW4oYSkpIHsKKwkJCWlmICh0Y2Zfdmxhbl9hY3Rpb24oYSkgPT0gVkxBTl9GX1BPUCkgeworCQkJCWF0dHItPmFjdGlvbiB8PSBNTFg1X0ZMT1dfQ09OVEVYVF9BQ1RJT05fVkxBTl9QT1A7CisJCQl9IGVsc2UgaWYgKHRjZl92bGFuX2FjdGlvbihhKSA9PSBWTEFOX0ZfUFVTSCkgeworCQkJCWlmICh0Y2Zfdmxhbl9wdXNoX3Byb3RvKGEpICE9IGh0b25zKEVUSF9QXzgwMjFRKSkKKwkJCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJCQkJYXR0ci0+YWN0aW9uIHw9IE1MWDVfRkxPV19DT05URVhUX0FDVElPTl9WTEFOX1BVU0g7CisJCQkJYXR0ci0+dmxhbiA9IHRjZl92bGFuX3B1c2hfdmlkKGEpOworCQkJfQogCQkJY29udGludWU7CiAJCX0KIApAQCAtNDEzLDE4ICs0NDYsMjkgQEAKIHsKIAlzdHJ1Y3QgbWx4NWVfdGNfdGFibGUgKnRjID0gJnByaXYtPmZzLnRjOwogCWludCBlcnIgPSAwOwotCXUzMiBmbG93X3RhZywgYWN0aW9uLCBkZXN0X3Zwb3J0ID0gMDsKKwlib29sIGZkYl9mbG93ID0gZmFsc2U7CisJdTMyIGZsb3dfdGFnLCBhY3Rpb247CiAJc3RydWN0IG1seDVlX3RjX2Zsb3cgKmZsb3c7CiAJc3RydWN0IG1seDVfZmxvd19zcGVjICpzcGVjOwogCXN0cnVjdCBtbHg1X2Zsb3dfcnVsZSAqb2xkID0gTlVMTDsKKwlzdHJ1Y3QgbWx4NV9lc3dfZmxvd19hdHRyICpvbGRfYXR0ciA9IE5VTEw7CiAJc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3ID0gcHJpdi0+bWRldi0+cHJpdi5lc3dpdGNoOwogCisJaWYgKGVzdyAmJiBlc3ctPm1vZGUgPT0gU1JJT1ZfT0ZGTE9BRFMpCisJCWZkYl9mbG93ID0gdHJ1ZTsKKwogCWZsb3cgPSByaGFzaHRhYmxlX2xvb2t1cF9mYXN0KCZ0Yy0+aHQsICZmLT5jb29raWUsCiAJCQkJICAgICAgdGMtPmh0X3BhcmFtcyk7Ci0JaWYgKGZsb3cpCisJaWYgKGZsb3cpIHsKIAkJb2xkID0gZmxvdy0+cnVsZTsKLQllbHNlCi0JCWZsb3cgPSBremFsbG9jKHNpemVvZigqZmxvdyksIEdGUF9LRVJORUwpOworCQlvbGRfYXR0ciA9IGZsb3ctPmF0dHI7CisJfSBlbHNlIHsKKwkJaWYgKGZkYl9mbG93KQorCQkJZmxvdyA9IGt6YWxsb2Moc2l6ZW9mKCpmbG93KSArIHNpemVvZihzdHJ1Y3QgbWx4NV9lc3dfZmxvd19hdHRyKSwKKwkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJCWVsc2UKKwkJCWZsb3cgPSBremFsbG9jKHNpemVvZigqZmxvdyksIEdGUF9LRVJORUwpOworCX0KIAogCXNwZWMgPSBtbHg1X3Z6YWxsb2Moc2l6ZW9mKCpzcGVjKSk7CiAJaWYgKCFzcGVjIHx8ICFmbG93KSB7CkBAIC00MzgsMTEgKzQ4MiwxMiBAQAogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycl9mcmVlOwogCi0JaWYgKGVzdyAmJiBlc3ctPm1vZGUgPT0gU1JJT1ZfT0ZGTE9BRFMpIHsKLQkJZXJyID0gcGFyc2VfdGNfZmRiX2FjdGlvbnMocHJpdiwgZi0+ZXh0cywgJmFjdGlvbiwgJmRlc3RfdnBvcnQpOworCWlmIChmZGJfZmxvdykgeworCQlmbG93LT5hdHRyICA9IChzdHJ1Y3QgbWx4NV9lc3dfZmxvd19hdHRyICopKGZsb3cgKyAxKTsKKwkJZXJyID0gcGFyc2VfdGNfZmRiX2FjdGlvbnMocHJpdiwgZi0+ZXh0cywgZmxvdy0+YXR0cik7CiAJCWlmIChlcnIgPCAwKQogCQkJZ290byBlcnJfZnJlZTsKLQkJZmxvdy0+cnVsZSA9IG1seDVlX3RjX2FkZF9mZGJfZmxvdyhwcml2LCBzcGVjLCBhY3Rpb24sIGRlc3RfdnBvcnQpOworCQlmbG93LT5ydWxlID0gbWx4NWVfdGNfYWRkX2ZkYl9mbG93KHByaXYsIHNwZWMsIGZsb3ctPmF0dHIpOwogCX0gZWxzZSB7CiAJCWVyciA9IHBhcnNlX3RjX25pY19hY3Rpb25zKHByaXYsIGYtPmV4dHMsICZhY3Rpb24sICZmbG93X3RhZyk7CiAJCWlmIChlcnIgPCAwKQpAQCAtNDYxLDcgKzUwNiw3IEBACiAJCWdvdG8gZXJyX2RlbF9ydWxlOwogCiAJaWYgKG9sZCkKLQkJbWx4NWVfdGNfZGVsX2Zsb3cocHJpdiwgb2xkKTsKKwkJbWx4NWVfdGNfZGVsX2Zsb3cocHJpdiwgb2xkLCBvbGRfYXR0cik7CiAKIAlnb3RvIG91dDsKIApAQCAtNDg5LDcgKzUzNCw3IEBACiAKIAlyaGFzaHRhYmxlX3JlbW92ZV9mYXN0KCZ0Yy0+aHQsICZmbG93LT5ub2RlLCB0Yy0+aHRfcGFyYW1zKTsKIAotCW1seDVlX3RjX2RlbF9mbG93KHByaXYsIGZsb3ctPnJ1bGUpOworCW1seDVlX3RjX2RlbF9mbG93KHByaXYsIGZsb3ctPnJ1bGUsIGZsb3ctPmF0dHIpOwogCiAJa2ZyZWUoZmxvdyk7CiAKQEAgLTUwMyw2ICs1NDgsNyBAQAogCXN0cnVjdCBtbHg1ZV90Y19mbG93ICpmbG93OwogCXN0cnVjdCB0Y19hY3Rpb24gKmE7CiAJc3RydWN0IG1seDVfZmMgKmNvdW50ZXI7CisJTElTVF9IRUFEKGFjdGlvbnMpOwogCXU2NCBieXRlczsKIAl1NjQgcGFja2V0czsKIAl1NjQgbGFzdHVzZTsKQEAgLTUxOCw3ICs1NjQsOCBAQAogCiAJbWx4NV9mY19xdWVyeV9jYWNoZWQoY291bnRlciwgJmJ5dGVzLCAmcGFja2V0cywgJmxhc3R1c2UpOwogCi0JdGNfZm9yX2VhY2hfYWN0aW9uKGEsIGYtPmV4dHMpCisJdGNmX2V4dHNfdG9fbGlzdChmLT5leHRzLCAmYWN0aW9ucyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShhLCAmYWN0aW9ucywgbGlzdCkKIAkJdGNmX2FjdGlvbl9zdGF0c191cGRhdGUoYSwgYnl0ZXMsIHBhY2tldHMsIGxhc3R1c2UpOwogCiAJcmV0dXJuIDA7CkBAIC01NDQsNyArNTkxLDcgQEAKIAlzdHJ1Y3QgbWx4NWVfdGNfZmxvdyAqZmxvdyA9IHB0cjsKIAlzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdiA9IGFyZzsKIAotCW1seDVlX3RjX2RlbF9mbG93KHByaXYsIGZsb3ctPnJ1bGUpOworCW1seDVlX3RjX2RlbF9mbG93KHByaXYsIGZsb3ctPnJ1bGUsIGZsb3ctPmF0dHIpOwogCWtmcmVlKGZsb3cpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fdHguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl90eC5jCmluZGV4IGUwNzNiZjU5Li43MGE3MTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fdHguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fdHguYwpAQCAtNTIsNyArNTIsNiBAQAogCWNzZWctPm9wbW9kX2lkeF9vcGNvZGUgPSBjcHVfdG9fYmUzMigoc3EtPnBjIDw8IDgpIHwgTUxYNV9PUENPREVfTk9QKTsKIAljc2VnLT5xcG5fZHMgICAgICAgICAgID0gY3B1X3RvX2JlMzIoKHNxLT5zcW4gPDwgOCkgfCAweDAxKTsKIAotCXNxLT5za2JbcGldID0gTlVMTDsKIAlzcS0+cGMrKzsKIAlzcS0+c3RhdHMubm9wKys7CiAKQEAgLTgyLDE1ICs4MSwxNyBAQAogCQkJCSAgdTMyIHNpemUsCiAJCQkJICBlbnVtIG1seDVlX2RtYV9tYXBfdHlwZSBtYXBfdHlwZSkKIHsKLQlzcS0+ZG1hX2ZpZm9bc3EtPmRtYV9maWZvX3BjICYgc3EtPmRtYV9maWZvX21hc2tdLmFkZHIgPSBhZGRyOwotCXNxLT5kbWFfZmlmb1tzcS0+ZG1hX2ZpZm9fcGMgJiBzcS0+ZG1hX2ZpZm9fbWFza10uc2l6ZSA9IHNpemU7Ci0Jc3EtPmRtYV9maWZvW3NxLT5kbWFfZmlmb19wYyAmIHNxLT5kbWFfZmlmb19tYXNrXS50eXBlID0gbWFwX3R5cGU7CisJdTMyIGkgPSBzcS0+ZG1hX2ZpZm9fcGMgJiBzcS0+ZG1hX2ZpZm9fbWFzazsKKworCXNxLT5kYi50eHEuZG1hX2ZpZm9baV0uYWRkciA9IGFkZHI7CisJc3EtPmRiLnR4cS5kbWFfZmlmb1tpXS5zaXplID0gc2l6ZTsKKwlzcS0+ZGIudHhxLmRtYV9maWZvW2ldLnR5cGUgPSBtYXBfdHlwZTsKIAlzcS0+ZG1hX2ZpZm9fcGMrKzsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgbWx4NWVfc3FfZG1hICptbHg1ZV9kbWFfZ2V0KHN0cnVjdCBtbHg1ZV9zcSAqc3EsIHUzMiBpKQogewotCXJldHVybiAmc3EtPmRtYV9maWZvW2kgJiBzcS0+ZG1hX2ZpZm9fbWFza107CisJcmV0dXJuICZzcS0+ZGIudHhxLmRtYV9maWZvW2kgJiBzcS0+ZG1hX2ZpZm9fbWFza107CiB9CiAKIHN0YXRpYyB2b2lkIG1seDVlX2RtYV91bm1hcF93cWVfZXJyKHN0cnVjdCBtbHg1ZV9zcSAqc3EsIHU4IG51bV9kbWEpCkBAIC0yMjEsNyArMjIyLDcgQEAKIAogCXUxNiBwaSA9IHNxLT5wYyAmIHdxLT5zel9tMTsKIAlzdHJ1Y3QgbWx4NWVfdHhfd3FlICAgICAgKndxZSAgPSBtbHg1X3dxX2N5Y19nZXRfd3FlKHdxLCBwaSk7Ci0Jc3RydWN0IG1seDVlX3R4X3dxZV9pbmZvICp3aSAgID0gJnNxLT53cWVfaW5mb1twaV07CisJc3RydWN0IG1seDVlX3R4X3dxZV9pbmZvICp3aSAgID0gJnNxLT5kYi50eHEud3FlX2luZm9bcGldOwogCiAJc3RydWN0IG1seDVfd3FlX2N0cmxfc2VnICpjc2VnID0gJndxZS0+Y3RybDsKIAlzdHJ1Y3QgbWx4NV93cWVfZXRoX3NlZyAgKmVzZWcgPSAmd3FlLT5ldGg7CkBAIC0zNDEsNyArMzQyLDcgQEAKIAljc2VnLT5vcG1vZF9pZHhfb3Bjb2RlID0gY3B1X3RvX2JlMzIoKHNxLT5wYyA8PCA4KSB8IG9wY29kZSk7CiAJY3NlZy0+cXBuX2RzICAgICAgICAgICA9IGNwdV90b19iZTMyKChzcS0+c3FuIDw8IDgpIHwgZHNfY250KTsKIAotCXNxLT5za2JbcGldID0gc2tiOworCXNxLT5kYi50eHEuc2tiW3BpXSA9IHNrYjsKIAogCXdpLT5udW1fd3FlYmJzID0gRElWX1JPVU5EX1VQKGRzX2NudCwgTUxYNV9TRU5EX1dRRUJCX05VTV9EUyk7CiAJc3EtPnBjICs9IHdpLT5udW1fd3FlYmJzOwpAQCAtMzU2LDYgKzM1Nyw3IEBACiAJCXNxLT5zdGF0cy5zdG9wcGVkKys7CiAJfQogCisJc3EtPnN0YXRzLnhtaXRfbW9yZSArPSBza2ItPnhtaXRfbW9yZTsKIAlpZiAoIXNrYi0+eG1pdF9tb3JlIHx8IG5ldGlmX3htaXRfc3RvcHBlZChzcS0+dHhxKSkgewogCQlpbnQgYmZfc3ogPSAwOwogCkBAIC0zNjcsOCArMzY5LDEwIEBACiAJfQogCiAJLyogZmlsbCBzcSBlZGdlIHdpdGggbm9wcyB0byBhdm9pZCB3cWUgd3JhcCBhcm91bmQgKi8KLQl3aGlsZSAoKHNxLT5wYyAmIHdxLT5zel9tMSkgPiBzcS0+ZWRnZSkKKwl3aGlsZSAoKHBpID0gKHNxLT5wYyAmIHdxLT5zel9tMSkpID4gc3EtPmVkZ2UpIHsKKwkJc3EtPmRiLnR4cS5za2JbcGldID0gTlVMTDsKIAkJbWx4NWVfc2VuZF9ub3Aoc3EsIGZhbHNlKTsKKwl9CiAKIAlpZiAoYmYpCiAJCXNxLT5iZl9idWRnZXQtLTsKQEAgLTM5NCwzNSArMzk4LDYgQEAKIAlyZXR1cm4gbWx4NWVfc3FfeG1pdChzcSwgc2tiKTsKIH0KIAotdm9pZCBtbHg1ZV9mcmVlX3R4X2Rlc2NzKHN0cnVjdCBtbHg1ZV9zcSAqc3EpCi17Ci0Jc3RydWN0IG1seDVlX3R4X3dxZV9pbmZvICp3aTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXUxNiBjaTsKLQlpbnQgaTsKLQotCXdoaWxlIChzcS0+Y2MgIT0gc3EtPnBjKSB7Ci0JCWNpID0gc3EtPmNjICYgc3EtPndxLnN6X20xOwotCQlza2IgPSBzcS0+c2tiW2NpXTsKLQkJd2kgPSAmc3EtPndxZV9pbmZvW2NpXTsKLQotCQlpZiAoIXNrYikgeyAvKiBub3AgKi8KLQkJCXNxLT5jYysrOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlmb3IgKGkgPSAwOyBpIDwgd2ktPm51bV9kbWE7IGkrKykgewotCQkJc3RydWN0IG1seDVlX3NxX2RtYSAqZG1hID0KLQkJCQltbHg1ZV9kbWFfZ2V0KHNxLCBzcS0+ZG1hX2ZpZm9fY2MrKyk7Ci0KLQkJCW1seDVlX3R4X2RtYV91bm1hcChzcS0+cGRldiwgZG1hKTsKLQkJfQotCi0JCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCXNxLT5jYyArPSB3aS0+bnVtX3dxZWJiczsKLQl9Ci19Ci0KIGJvb2wgbWx4NWVfcG9sbF90eF9jcShzdHJ1Y3QgbWx4NWVfY3EgKmNxLCBpbnQgbmFwaV9idWRnZXQpCiB7CiAJc3RydWN0IG1seDVlX3NxICpzcTsKQEAgLTQzNCw3ICs0MDksNyBAQAogCiAJc3EgPSBjb250YWluZXJfb2YoY3EsIHN0cnVjdCBtbHg1ZV9zcSwgY3EpOwogCi0JaWYgKHVubGlrZWx5KHRlc3RfYml0KE1MWDVFX1NRX1NUQVRFX1RYX1RJTUVPVVQsICZzcS0+c3RhdGUpKSkKKwlpZiAodW5saWtlbHkodGVzdF9iaXQoTUxYNUVfU1FfU1RBVEVfRkxVU0gsICZzcS0+c3RhdGUpKSkKIAkJcmV0dXJuIGZhbHNlOwogCiAJbnBrdHMgPSAwOwpAQCAtNDcwLDggKzQ0NSw4IEBACiAJCQlsYXN0X3dxZSA9IChzcWNjID09IHdxZV9jb3VudGVyKTsKIAogCQkJY2kgPSBzcWNjICYgc3EtPndxLnN6X20xOwotCQkJc2tiID0gc3EtPnNrYltjaV07Ci0JCQl3aSA9ICZzcS0+d3FlX2luZm9bY2ldOworCQkJc2tiID0gc3EtPmRiLnR4cS5za2JbY2ldOworCQkJd2kgPSAmc3EtPmRiLnR4cS53cWVfaW5mb1tjaV07CiAKIAkJCWlmICh1bmxpa2VseSghc2tiKSkgeyAvKiBub3AgKi8KIAkJCQlzcWNjKys7CkBAIC01MTIsMTEgKzQ4Nyw3MyBAQAogCW5ldGRldl90eF9jb21wbGV0ZWRfcXVldWUoc3EtPnR4cSwgbnBrdHMsIG5ieXRlcyk7CiAKIAlpZiAobmV0aWZfdHhfcXVldWVfc3RvcHBlZChzcS0+dHhxKSAmJgotCSAgICBtbHg1ZV9zcV9oYXNfcm9vbV9mb3Ioc3EsIE1MWDVFX1NRX1NUT1BfUk9PTSkgJiYKLQkgICAgbGlrZWx5KHRlc3RfYml0KE1MWDVFX1NRX1NUQVRFX1dBS0VfVFhRX0VOQUJMRSwgJnNxLT5zdGF0ZSkpKSB7Ci0JCQkJbmV0aWZfdHhfd2FrZV9xdWV1ZShzcS0+dHhxKTsKLQkJCQlzcS0+c3RhdHMud2FrZSsrOworCSAgICBtbHg1ZV9zcV9oYXNfcm9vbV9mb3Ioc3EsIE1MWDVFX1NRX1NUT1BfUk9PTSkpIHsKKwkJbmV0aWZfdHhfd2FrZV9xdWV1ZShzcS0+dHhxKTsKKwkJc3EtPnN0YXRzLndha2UrKzsKIAl9CiAKIAlyZXR1cm4gKGkgPT0gTUxYNUVfVFhfQ1FfUE9MTF9CVURHRVQpOwogfQorCitzdGF0aWMgdm9pZCBtbHg1ZV9mcmVlX3R4cV9zcV9kZXNjcyhzdHJ1Y3QgbWx4NWVfc3EgKnNxKQoreworCXN0cnVjdCBtbHg1ZV90eF93cWVfaW5mbyAqd2k7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1MTYgY2k7CisJaW50IGk7CisKKwl3aGlsZSAoc3EtPmNjICE9IHNxLT5wYykgeworCQljaSA9IHNxLT5jYyAmIHNxLT53cS5zel9tMTsKKwkJc2tiID0gc3EtPmRiLnR4cS5za2JbY2ldOworCQl3aSA9ICZzcS0+ZGIudHhxLndxZV9pbmZvW2NpXTsKKworCQlpZiAoIXNrYikgeyAvKiBub3AgKi8KKwkJCXNxLT5jYysrOworCQkJY29udGludWU7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgd2ktPm51bV9kbWE7IGkrKykgeworCQkJc3RydWN0IG1seDVlX3NxX2RtYSAqZG1hID0KKwkJCQltbHg1ZV9kbWFfZ2V0KHNxLCBzcS0+ZG1hX2ZpZm9fY2MrKyk7CisKKwkJCW1seDVlX3R4X2RtYV91bm1hcChzcS0+cGRldiwgZG1hKTsKKwkJfQorCisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXNxLT5jYyArPSB3aS0+bnVtX3dxZWJiczsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1seDVlX2ZyZWVfeGRwX3NxX2Rlc2NzKHN0cnVjdCBtbHg1ZV9zcSAqc3EpCit7CisJc3RydWN0IG1seDVlX3NxX3dxZV9pbmZvICp3aTsKKwlzdHJ1Y3QgbWx4NWVfZG1hX2luZm8gKmRpOworCXUxNiBjaTsKKworCXdoaWxlIChzcS0+Y2MgIT0gc3EtPnBjKSB7CisJCWNpID0gc3EtPmNjICYgc3EtPndxLnN6X20xOworCQlkaSA9ICZzcS0+ZGIueGRwLmRpW2NpXTsKKwkJd2kgPSAmc3EtPmRiLnhkcC53cWVfaW5mb1tjaV07CisKKwkJaWYgKHdpLT5vcGNvZGUgPT0gTUxYNV9PUENPREVfTk9QKSB7CisJCQlzcS0+Y2MrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3EtPmNjICs9IHdpLT5udW1fd3FlYmJzOworCisJCW1seDVlX3BhZ2VfcmVsZWFzZSgmc3EtPmNoYW5uZWwtPnJxLCBkaSwgZmFsc2UpOworCX0KK30KKwordm9pZCBtbHg1ZV9mcmVlX3NxX2Rlc2NzKHN0cnVjdCBtbHg1ZV9zcSAqc3EpCit7CisJc3dpdGNoIChzcS0+dHlwZSkgeworCWNhc2UgTUxYNUVfU1FfVFhROgorCQltbHg1ZV9mcmVlX3R4cV9zcV9kZXNjcyhzcSk7CisJCWJyZWFrOworCWNhc2UgTUxYNUVfU1FfWERQOgorCQltbHg1ZV9mcmVlX3hkcF9zcV9kZXNjcyhzcSk7CisJCWJyZWFrOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl90eHJ4LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fdHhyeC5jCmluZGV4IDY0YWUyZTguLjU3MDNmMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl90eHJ4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX3R4cnguYwpAQCAtNTEsMTYgKzUxLDE4IEBACiAKIHN0YXRpYyB2b2lkIG1seDVlX3BvbGxfaWNvX2NxKHN0cnVjdCBtbHg1ZV9jcSAqY3EpCiB7CisJc3RydWN0IG1seDVlX3NxICpzcSA9IGNvbnRhaW5lcl9vZihjcSwgc3RydWN0IG1seDVlX3NxLCBjcSk7CiAJc3RydWN0IG1seDVfd3FfY3ljICp3cTsKIAlzdHJ1Y3QgbWx4NV9jcWU2NCAqY3FlOwotCXN0cnVjdCBtbHg1ZV9zcSAqc3E7CiAJdTE2IHNxY2M7CiAKKwlpZiAodW5saWtlbHkodGVzdF9iaXQoTUxYNUVfU1FfU1RBVEVfRkxVU0gsICZzcS0+c3RhdGUpKSkKKwkJcmV0dXJuOworCiAJY3FlID0gbWx4NWVfZ2V0X2NxZShjcSk7CiAJaWYgKGxpa2VseSghY3FlKSkKIAkJcmV0dXJuOwogCi0Jc3EgPSBjb250YWluZXJfb2YoY3EsIHN0cnVjdCBtbHg1ZV9zcSwgY3EpOwogCXdxID0gJnNxLT53cTsKIAogCS8qIHNxLT5jYyBtdXN0IGJlIHVwZGF0ZWQgb25seSBhZnRlciBtbHg1X2Nxd3FfdXBkYXRlX2RiX3JlY29yZCgpLApAQCAtNzAsNyArNzIsNyBAQAogCiAJZG8gewogCQl1MTYgY2kgPSBiZTE2X3RvX2NwdShjcWUtPndxZV9jb3VudGVyKSAmIHdxLT5zel9tMTsKLQkJc3RydWN0IG1seDVlX2ljb193cWVfaW5mbyAqaWNvd2kgPSAmc3EtPmljb193cWVfaW5mb1tjaV07CisJCXN0cnVjdCBtbHg1ZV9zcV93cWVfaW5mbyAqaWNvd2kgPSAmc3EtPmRiLmljb193cWVbY2ldOwogCiAJCW1seDVfY3F3cV9wb3AoJmNxLT53cSk7CiAJCXNxY2MgKz0gaWNvd2ktPm51bV93cWViYnM7CkBAIC04NSw3ICs4Nyw3IEBACiAJCWNhc2UgTUxYNV9PUENPREVfTk9QOgogCQkJYnJlYWs7CiAJCWNhc2UgTUxYNV9PUENPREVfVU1SOgotCQkJbWx4NWVfcG9zdF9yeF9mcmFnbWVudGVkX21wd3FlKCZzcS0+Y2hhbm5lbC0+cnEpOworCQkJbWx4NWVfcG9zdF9yeF9tcHdxZSgmc3EtPmNoYW5uZWwtPnJxKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJV0FSTl9PTkNFKHRydWUsCkBAIC0xMDMsNiArMTA1LDY2IEBACiAJc3EtPmNjID0gc3FjYzsKIH0KIAorc3RhdGljIGlubGluZSBib29sIG1seDVlX3BvbGxfeGRwX3R4X2NxKHN0cnVjdCBtbHg1ZV9jcSAqY3EpCit7CisJc3RydWN0IG1seDVlX3NxICpzcTsKKwl1MTYgc3FjYzsKKwlpbnQgaTsKKworCXNxID0gY29udGFpbmVyX29mKGNxLCBzdHJ1Y3QgbWx4NWVfc3EsIGNxKTsKKworCWlmICh1bmxpa2VseSh0ZXN0X2JpdChNTFg1RV9TUV9TVEFURV9GTFVTSCwgJnNxLT5zdGF0ZSkpKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBzcS0+Y2MgbXVzdCBiZSB1cGRhdGVkIG9ubHkgYWZ0ZXIgbWx4NV9jcXdxX3VwZGF0ZV9kYl9yZWNvcmQoKSwKKwkgKiBvdGhlcndpc2UgYSBjcSBvdmVycnVuIG1heSBvY2N1cgorCSAqLworCXNxY2MgPSBzcS0+Y2M7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUxYNUVfVFhfQ1FfUE9MTF9CVURHRVQ7IGkrKykgeworCQlzdHJ1Y3QgbWx4NV9jcWU2NCAqY3FlOworCQl1MTYgd3FlX2NvdW50ZXI7CisJCWJvb2wgbGFzdF93cWU7CisKKwkJY3FlID0gbWx4NWVfZ2V0X2NxZShjcSk7CisJCWlmICghY3FlKQorCQkJYnJlYWs7CisKKwkJbWx4NV9jcXdxX3BvcCgmY3EtPndxKTsKKworCQl3cWVfY291bnRlciA9IGJlMTZfdG9fY3B1KGNxZS0+d3FlX2NvdW50ZXIpOworCisJCWRvIHsKKwkJCXN0cnVjdCBtbHg1ZV9zcV93cWVfaW5mbyAqd2k7CisJCQlzdHJ1Y3QgbWx4NWVfZG1hX2luZm8gKmRpOworCQkJdTE2IGNpOworCisJCQlsYXN0X3dxZSA9IChzcWNjID09IHdxZV9jb3VudGVyKTsKKworCQkJY2kgPSBzcWNjICYgc3EtPndxLnN6X20xOworCQkJZGkgPSAmc3EtPmRiLnhkcC5kaVtjaV07CisJCQl3aSA9ICZzcS0+ZGIueGRwLndxZV9pbmZvW2NpXTsKKworCQkJaWYgKHVubGlrZWx5KHdpLT5vcGNvZGUgPT0gTUxYNV9PUENPREVfTk9QKSkgeworCQkJCXNxY2MrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJc3FjYyArPSB3aS0+bnVtX3dxZWJiczsKKwkJCS8qIFJlY3ljbGUgUlggcGFnZSAqLworCQkJbWx4NWVfcGFnZV9yZWxlYXNlKCZzcS0+Y2hhbm5lbC0+cnEsIGRpLCB0cnVlKTsKKwkJfSB3aGlsZSAoIWxhc3Rfd3FlKTsKKwl9CisKKwltbHg1X2Nxd3FfdXBkYXRlX2RiX3JlY29yZCgmY3EtPndxKTsKKworCS8qIGVuc3VyZSBjcSBzcGFjZSBpcyBmcmVlZCBiZWZvcmUgZW5hYmxpbmcgbW9yZSBjcWVzICovCisJd21iKCk7CisKKwlzcS0+Y2MgPSBzcWNjOworCXJldHVybiAoaSA9PSBNTFg1RV9UWF9DUV9QT0xMX0JVREdFVCk7Cit9CisKIGludCBtbHg1ZV9uYXBpX3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQogewogCXN0cnVjdCBtbHg1ZV9jaGFubmVsICpjID0gY29udGFpbmVyX29mKG5hcGksIHN0cnVjdCBtbHg1ZV9jaGFubmVsLApAQCAtMTE5LDYgKzE4MSw5IEBACiAJd29ya19kb25lID0gbWx4NWVfcG9sbF9yeF9jcSgmYy0+cnEuY3EsIGJ1ZGdldCk7CiAJYnVzeSB8PSB3b3JrX2RvbmUgPT0gYnVkZ2V0OwogCisJaWYgKGMtPnhkcCkKKwkJYnVzeSB8PSBtbHg1ZV9wb2xsX3hkcF90eF9jcSgmYy0+eGRwX3NxLmNxKTsKKwogCW1seDVlX3BvbGxfaWNvX2NxKCZjLT5pY29zcS5jcSk7CiAKIAlidXN5IHw9IG1seDVlX3Bvc3Rfcnhfd3FlcygmYy0+cnEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VxLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZXEuYwppbmRleCAwZTMwNjAyLi5hYWNhMDkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZXEuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZXEuYwpAQCAtODYsMjMgKzg2LDEyIEBACiAKIHN0YXRpYyBpbnQgbWx4NV9jbWRfZGVzdHJveV9lcShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1OCBlcW4pCiB7Ci0Jc3RydWN0IG1seDVfZGVzdHJveV9lcV9tYm94X2luIGluOwotCXN0cnVjdCBtbHg1X2Rlc3Ryb3lfZXFfbWJveF9vdXQgb3V0OwotCWludCBlcnI7CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfZXFfb3V0KV0gPSB7MH07CisJdTMyIGluW01MWDVfU1RfU1pfRFcoZGVzdHJveV9lcV9pbildICAgPSB7MH07CiAKLQltZW1zZXQoJmluLCAwLCBzaXplb2YoaW4pKTsKLQltZW1zZXQoJm91dCwgMCwgc2l6ZW9mKG91dCkpOwotCWluLmhkci5vcGNvZGUgPSBjcHVfdG9fYmUxNihNTFg1X0NNRF9PUF9ERVNUUk9ZX0VRKTsKLQlpbi5lcW4gPSBlcW47Ci0JZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsICZpbiwgc2l6ZW9mKGluKSwgJm91dCwgc2l6ZW9mKG91dCkpOwotCWlmICghZXJyKQotCQlnb3RvIGV4OwotCi0JaWYgKG91dC5oZHIuc3RhdHVzKQotCQllcnIgPSBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyKCZvdXQuaGRyKTsKLQotZXg6Ci0JcmV0dXJuIGVycjsKKwlNTFg1X1NFVChkZXN0cm95X2VxX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9ERVNUUk9ZX0VRKTsKKwlNTFg1X1NFVChkZXN0cm95X2VxX2luLCBpbiwgZXFfbnVtYmVyLCBlcW4pOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQogCiBzdGF0aWMgc3RydWN0IG1seDVfZXFlICpnZXRfZXFlKHN0cnVjdCBtbHg1X2VxICplcSwgdTMyIGVudHJ5KQpAQCAtMzUxLDExICszNDAsMTMgQEAKIGludCBtbHg1X2NyZWF0ZV9tYXBfZXEoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG1seDVfZXEgKmVxLCB1OCB2ZWNpZHgsCiAJCSAgICAgICBpbnQgbmVudCwgdTY0IG1hc2ssIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBtbHg1X3VhciAqdWFyKQogeworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhjcmVhdGVfZXFfb3V0KV0gPSB7MH07CiAJc3RydWN0IG1seDVfcHJpdiAqcHJpdiA9ICZkZXYtPnByaXY7Ci0Jc3RydWN0IG1seDVfY3JlYXRlX2VxX21ib3hfaW4gKmluOwotCXN0cnVjdCBtbHg1X2NyZWF0ZV9lcV9tYm94X291dCBvdXQ7Ci0JaW50IGVycjsKKwlfX2JlNjQgKnBhczsKKwl2b2lkICplcWM7CiAJaW50IGlubGVuOworCXUzMiAqaW47CisJaW50IGVycjsKIAogCWVxLT5uZW50ID0gcm91bmR1cF9wb3dfb2ZfdHdvKG5lbnQgKyBNTFg1X05VTV9TUEFSRV9FUUUpOwogCWVxLT5jb25zX2luZGV4ID0gMDsKQEAgLTM2NSwzNSArMzU2LDM2IEBACiAKIAlpbml0X2VxX2J1ZihlcSk7CiAKLQlpbmxlbiA9IHNpemVvZigqaW4pICsgc2l6ZW9mKGluLT5wYXNbMF0pICogZXEtPmJ1Zi5ucGFnZXM7CisJaW5sZW4gPSBNTFg1X1NUX1NaX0JZVEVTKGNyZWF0ZV9lcV9pbikgKworCQlNTFg1X0ZMRF9TWl9CWVRFUyhjcmVhdGVfZXFfaW4sIHBhc1swXSkgKiBlcS0+YnVmLm5wYWdlczsKKwogCWluID0gbWx4NV92emFsbG9jKGlubGVuKTsKIAlpZiAoIWluKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX2J1ZjsKIAl9Ci0JbWVtc2V0KCZvdXQsIDAsIHNpemVvZihvdXQpKTsKIAotCW1seDVfZmlsbF9wYWdlX2FycmF5KCZlcS0+YnVmLCBpbi0+cGFzKTsKKwlwYXMgPSAoX19iZTY0ICopTUxYNV9BRERSX09GKGNyZWF0ZV9lcV9pbiwgaW4sIHBhcyk7CisJbWx4NV9maWxsX3BhZ2VfYXJyYXkoJmVxLT5idWYsIHBhcyk7CiAKLQlpbi0+aGRyLm9wY29kZSA9IGNwdV90b19iZTE2KE1MWDVfQ01EX09QX0NSRUFURV9FUSk7Ci0JaW4tPmN0eC5sb2dfc3pfdXNyX3BhZ2UgPSBjcHVfdG9fYmUzMihpbG9nMihlcS0+bmVudCkgPDwgMjQgfCB1YXItPmluZGV4KTsKLQlpbi0+Y3R4LmludHIgPSB2ZWNpZHg7Ci0JaW4tPmN0eC5sb2dfcGFnZV9zaXplID0gZXEtPmJ1Zi5wYWdlX3NoaWZ0IC0gTUxYNV9BREFQVEVSX1BBR0VfU0hJRlQ7Ci0JaW4tPmV2ZW50c19tYXNrID0gY3B1X3RvX2JlNjQobWFzayk7CisJTUxYNV9TRVQoY3JlYXRlX2VxX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9DUkVBVEVfRVEpOworCU1MWDVfU0VUNjQoY3JlYXRlX2VxX2luLCBpbiwgZXZlbnRfYml0bWFzaywgbWFzayk7CiAKLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIGlubGVuLCAmb3V0LCBzaXplb2Yob3V0KSk7CisJZXFjID0gTUxYNV9BRERSX09GKGNyZWF0ZV9lcV9pbiwgaW4sIGVxX2NvbnRleHRfZW50cnkpOworCU1MWDVfU0VUKGVxYywgZXFjLCBsb2dfZXFfc2l6ZSwgaWxvZzIoZXEtPm5lbnQpKTsKKwlNTFg1X1NFVChlcWMsIGVxYywgdWFyX3BhZ2UsIHVhci0+aW5kZXgpOworCU1MWDVfU0VUKGVxYywgZXFjLCBpbnRyLCB2ZWNpZHgpOworCU1MWDVfU0VUKGVxYywgZXFjLCBsb2dfcGFnZV9zaXplLAorCQkgZXEtPmJ1Zi5wYWdlX3NoaWZ0IC0gTUxYNV9BREFQVEVSX1BBR0VfU0hJRlQpOworCisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CiAJaWYgKGVycikKIAkJZ290byBlcnJfaW47CiAKLQlpZiAob3V0Lmhkci5zdGF0dXMpIHsKLQkJZXJyID0gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycigmb3V0Lmhkcik7Ci0JCWdvdG8gZXJyX2luOwotCX0KLQogCXNucHJpbnRmKHByaXYtPmlycV9pbmZvW3ZlY2lkeF0ubmFtZSwgTUxYNV9NQVhfSVJRX05BTUUsICIlc0BwY2k6JXMiLAogCQkgbmFtZSwgcGNpX25hbWUoZGV2LT5wZGV2KSk7CiAKLQllcS0+ZXFuID0gb3V0LmVxX251bWJlcjsKKwllcS0+ZXFuID0gTUxYNV9HRVQoY3JlYXRlX2VxX291dCwgb3V0LCBlcV9udW1iZXIpOwogCWVxLT5pcnFuID0gcHJpdi0+bXNpeF9hcnJbdmVjaWR4XS52ZWN0b3I7CiAJZXEtPmRldiA9IGRldjsKIAllcS0+ZG9vcmJlbGwgPSB1YXItPm1hcCArIE1MWDVfRVFfRE9PUkJFTF9PRkZTRVQ7CkBAIC01NDcsMjIgKzUzOSwxMiBAQAogfQogCiBpbnQgbWx4NV9jb3JlX2VxX3F1ZXJ5KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X2VxICplcSwKLQkJICAgICAgIHN0cnVjdCBtbHg1X3F1ZXJ5X2VxX21ib3hfb3V0ICpvdXQsIGludCBvdXRsZW4pCisJCSAgICAgICB1MzIgKm91dCwgaW50IG91dGxlbikKIHsKLQlzdHJ1Y3QgbWx4NV9xdWVyeV9lcV9tYm94X2luIGluOwotCWludCBlcnI7CisJdTMyIGluW01MWDVfU1RfU1pfRFcocXVlcnlfZXFfaW4pXSA9IHswfTsKIAotCW1lbXNldCgmaW4sIDAsIHNpemVvZihpbikpOwotCW1lbXNldChvdXQsIDAsIG91dGxlbik7Ci0JaW4uaGRyLm9wY29kZSA9IGNwdV90b19iZTE2KE1MWDVfQ01EX09QX1FVRVJZX0VRKTsKLQlpbi5lcW4gPSBlcS0+ZXFuOwotCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCAmaW4sIHNpemVvZihpbiksIG91dCwgb3V0bGVuKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKG91dC0+aGRyLnN0YXR1cykKLQkJZXJyID0gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycigmb3V0LT5oZHIpOwotCi0JcmV0dXJuIGVycjsKKwlNTFg1X1NFVChxdWVyeV9lcV9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfUVVFUllfRVEpOworCU1MWDVfU0VUKHF1ZXJ5X2VxX2luLCBpbiwgZXFfbnVtYmVyLCBlcS0+ZXFuKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIG91dGxlbik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtbHg1X2NvcmVfZXFfcXVlcnkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2Vzd2l0Y2guYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lc3dpdGNoLmMKaW5kZXggZjZkNjY3Ny4uYWJiZjJjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2Vzd2l0Y2guYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZXN3aXRjaC5jCkBAIC04MSwxOSArODEsMTIgQEAKIAkJCSAgICBNQ19BRERSX0NIQU5HRSB8IFwKIAkJCSAgICBQUk9NSVNDX0NIQU5HRSkKIAotaW50IGVzd19vZmZsb2Fkc19pbml0KHN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdywgaW50IG52cG9ydHMpOwotdm9pZCBlc3dfb2ZmbG9hZHNfY2xlYW51cChzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3csIGludCBudnBvcnRzKTsKLQogc3RhdGljIGludCBhcm1fdnBvcnRfY29udGV4dF9ldmVudHNfY21kKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUxNiB2cG9ydCwKIAkJCQkJdTMyIGV2ZW50c19tYXNrKQogewotCWludCBpbltNTFg1X1NUX1NaX0RXKG1vZGlmeV9uaWNfdnBvcnRfY29udGV4dF9pbildOwotCWludCBvdXRbTUxYNV9TVF9TWl9EVyhtb2RpZnlfbmljX3Zwb3J0X2NvbnRleHRfb3V0KV07CisJaW50IGluW01MWDVfU1RfU1pfRFcobW9kaWZ5X25pY192cG9ydF9jb250ZXh0X2luKV0gICA9IHswfTsKKwlpbnQgb3V0W01MWDVfU1RfU1pfRFcobW9kaWZ5X25pY192cG9ydF9jb250ZXh0X291dCldID0gezB9OwogCXZvaWQgKm5pY192cG9ydF9jdHg7Ci0JaW50IGVycjsKLQotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwogCiAJTUxYNV9TRVQobW9kaWZ5X25pY192cG9ydF9jb250ZXh0X2luLCBpbiwKIAkJIG9wY29kZSwgTUxYNV9DTURfT1BfTU9ESUZZX05JQ19WUE9SVF9DT05URVhUKTsKQEAgLTExNiwxMTMgKzEwOSw0NCBAQAogCQlNTFg1X1NFVChuaWNfdnBvcnRfY29udGV4dCwgbmljX3Zwb3J0X2N0eCwKIAkJCSBldmVudF9vbl9wcm9taXNjX2NoYW5nZSwgMSk7CiAKLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwotCWlmIChlcnIpCi0JCWdvdG8gZXg7Ci0JZXJyID0gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycl92MihvdXQpOwotCWlmIChlcnIpCi0JCWdvdG8gZXg7Ci0JcmV0dXJuIDA7Ci1leDoKLQlyZXR1cm4gZXJyOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQogCiAvKiBFLVN3aXRjaCB2cG9ydCBjb250ZXh0IEhXIGNvbW1hbmRzICovCi1zdGF0aWMgaW50IHF1ZXJ5X2Vzd192cG9ydF9jb250ZXh0X2NtZChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwgdTMyIHZwb3J0LAotCQkJCSAgICAgICB1MzIgKm91dCwgaW50IG91dGxlbikKLXsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhxdWVyeV9lc3dfdnBvcnRfY29udGV4dF9pbildOwotCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKLQotCU1MWDVfU0VUKHF1ZXJ5X25pY192cG9ydF9jb250ZXh0X2luLCBpbiwgb3Bjb2RlLAotCQkgTUxYNV9DTURfT1BfUVVFUllfRVNXX1ZQT1JUX0NPTlRFWFQpOwotCi0JTUxYNV9TRVQocXVlcnlfZXN3X3Zwb3J0X2NvbnRleHRfaW4sIGluLCB2cG9ydF9udW1iZXIsIHZwb3J0KTsKLQlpZiAodnBvcnQpCi0JCU1MWDVfU0VUKHF1ZXJ5X2Vzd192cG9ydF9jb250ZXh0X2luLCBpbiwgb3RoZXJfdnBvcnQsIDEpOwotCi0JcmV0dXJuIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKG1kZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIG91dGxlbik7Ci19Ci0KLXN0YXRpYyBpbnQgcXVlcnlfZXN3X3Zwb3J0X2N2bGFuKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiB2cG9ydCwKLQkJCQkgdTE2ICp2bGFuLCB1OCAqcW9zKQotewotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhxdWVyeV9lc3dfdnBvcnRfY29udGV4dF9vdXQpXTsKLQlpbnQgZXJyOwotCWJvb2wgY3ZsYW5fc3RyaXA7Ci0JYm9vbCBjdmxhbl9pbnNlcnQ7Ci0KLQltZW1zZXQob3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0KLQkqdmxhbiA9IDA7Ci0JKnFvcyA9IDA7Ci0KLQlpZiAoIU1MWDVfQ0FQX0VTVyhkZXYsIHZwb3J0X2N2bGFuX3N0cmlwKSB8fAotCSAgICAhTUxYNV9DQVBfRVNXKGRldiwgdnBvcnRfY3ZsYW5faW5zZXJ0X2lmX25vdF9leGlzdCkpCi0JCXJldHVybiAtRU5PVFNVUFA7Ci0KLQllcnIgPSBxdWVyeV9lc3dfdnBvcnRfY29udGV4dF9jbWQoZGV2LCB2cG9ydCwgb3V0LCBzaXplb2Yob3V0KSk7Ci0JaWYgKGVycikKLQkJZ290byBvdXQ7Ci0KLQljdmxhbl9zdHJpcCA9IE1MWDVfR0VUKHF1ZXJ5X2Vzd192cG9ydF9jb250ZXh0X291dCwgb3V0LAotCQkJICAgICAgIGVzd192cG9ydF9jb250ZXh0LnZwb3J0X2N2bGFuX3N0cmlwKTsKLQotCWN2bGFuX2luc2VydCA9IE1MWDVfR0VUKHF1ZXJ5X2Vzd192cG9ydF9jb250ZXh0X291dCwgb3V0LAotCQkJCWVzd192cG9ydF9jb250ZXh0LnZwb3J0X2N2bGFuX2luc2VydCk7Ci0KLQlpZiAoY3ZsYW5fc3RyaXAgfHwgY3ZsYW5faW5zZXJ0KSB7Ci0JCSp2bGFuID0gTUxYNV9HRVQocXVlcnlfZXN3X3Zwb3J0X2NvbnRleHRfb3V0LCBvdXQsCi0JCQkJIGVzd192cG9ydF9jb250ZXh0LmN2bGFuX2lkKTsKLQkJKnFvcyA9IE1MWDVfR0VUKHF1ZXJ5X2Vzd192cG9ydF9jb250ZXh0X291dCwgb3V0LAotCQkJCWVzd192cG9ydF9jb250ZXh0LmN2bGFuX3BjcCk7Ci0JfQotCi0JZXN3X2RlYnVnKGRldiwgIlF1ZXJ5IFZwb3J0WyVkXSBjdmxhbjogVkxBTiAlZCBxb3M9JWRcbiIsCi0JCSAgdnBvcnQsICp2bGFuLCAqcW9zKTsKLW91dDoKLQlyZXR1cm4gZXJyOwotfQotCiBzdGF0aWMgaW50IG1vZGlmeV9lc3dfdnBvcnRfY29udGV4dF9jbWQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTE2IHZwb3J0LAogCQkJCQl2b2lkICppbiwgaW50IGlubGVuKQogewotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhtb2RpZnlfZXN3X3Zwb3J0X2NvbnRleHRfb3V0KV07Ci0KLQltZW1zZXQob3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0KLQlNTFg1X1NFVChtb2RpZnlfZXN3X3Zwb3J0X2NvbnRleHRfaW4sIGluLCB2cG9ydF9udW1iZXIsIHZwb3J0KTsKLQlpZiAodnBvcnQpCi0JCU1MWDVfU0VUKG1vZGlmeV9lc3dfdnBvcnRfY29udGV4dF9pbiwgaW4sIG90aGVyX3Zwb3J0LCAxKTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcobW9kaWZ5X2Vzd192cG9ydF9jb250ZXh0X291dCldID0gezB9OwogCiAJTUxYNV9TRVQobW9kaWZ5X2Vzd192cG9ydF9jb250ZXh0X2luLCBpbiwgb3Bjb2RlLAogCQkgTUxYNV9DTURfT1BfTU9ESUZZX0VTV19WUE9SVF9DT05URVhUKTsKLQotCXJldHVybiBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBpbmxlbiwKLQkJCQkJICBvdXQsIHNpemVvZihvdXQpKTsKKwlNTFg1X1NFVChtb2RpZnlfZXN3X3Zwb3J0X2NvbnRleHRfaW4sIGluLCB2cG9ydF9udW1iZXIsIHZwb3J0KTsKKwlpZiAodnBvcnQpCisJCU1MWDVfU0VUKG1vZGlmeV9lc3dfdnBvcnRfY29udGV4dF9pbiwgaW4sIG90aGVyX3Zwb3J0LCAxKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiAKIHN0YXRpYyBpbnQgbW9kaWZ5X2Vzd192cG9ydF9jdmxhbihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgdnBvcnQsCi0JCQkJICB1MTYgdmxhbiwgdTggcW9zLCBib29sIHNldCkKKwkJCQkgIHUxNiB2bGFuLCB1OCBxb3MsIHU4IHNldF9mbGFncykKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhtb2RpZnlfZXN3X3Zwb3J0X2NvbnRleHRfaW4pXTsKLQotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7CisJdTMyIGluW01MWDVfU1RfU1pfRFcobW9kaWZ5X2Vzd192cG9ydF9jb250ZXh0X2luKV0gPSB7MH07CiAKIAlpZiAoIU1MWDVfQ0FQX0VTVyhkZXYsIHZwb3J0X2N2bGFuX3N0cmlwKSB8fAogCSAgICAhTUxYNV9DQVBfRVNXKGRldiwgdnBvcnRfY3ZsYW5faW5zZXJ0X2lmX25vdF9leGlzdCkpCiAJCXJldHVybiAtRU5PVFNVUFA7CiAKLQllc3dfZGVidWcoZGV2LCAiU2V0IFZwb3J0WyVkXSBWTEFOICVkIHFvcyAlZCBzZXQ9JWRcbiIsCi0JCSAgdnBvcnQsIHZsYW4sIHFvcywgc2V0KTsKKwllc3dfZGVidWcoZGV2LCAiU2V0IFZwb3J0WyVkXSBWTEFOICVkIHFvcyAlZCBzZXQ9JXhcbiIsCisJCSAgdnBvcnQsIHZsYW4sIHFvcywgc2V0X2ZsYWdzKTsKIAotCWlmIChzZXQpIHsKKwlpZiAoc2V0X2ZsYWdzICYgU0VUX1ZMQU5fU1RSSVApCiAJCU1MWDVfU0VUKG1vZGlmeV9lc3dfdnBvcnRfY29udGV4dF9pbiwgaW4sCiAJCQkgZXN3X3Zwb3J0X2NvbnRleHQudnBvcnRfY3ZsYW5fc3RyaXAsIDEpOworCisJaWYgKHNldF9mbGFncyAmIFNFVF9WTEFOX0lOU0VSVCkgewogCQkvKiBpbnNlcnQgb25seSBpZiBubyB2bGFuIGluIHBhY2tldCAqLwogCQlNTFg1X1NFVChtb2RpZnlfZXN3X3Zwb3J0X2NvbnRleHRfaW4sIGluLAogCQkJIGVzd192cG9ydF9jb250ZXh0LnZwb3J0X2N2bGFuX2luc2VydCwgMSk7CisKIAkJTUxYNV9TRVQobW9kaWZ5X2Vzd192cG9ydF9jb250ZXh0X2luLCBpbiwKIAkJCSBlc3dfdnBvcnRfY29udGV4dC5jdmxhbl9wY3AsIHFvcyk7CiAJCU1MWDVfU0VUKG1vZGlmeV9lc3dfdnBvcnRfY29udGV4dF9pbiwgaW4sCkBAIC0yNDEsMTMgKzE2NSwxMCBAQAogc3RhdGljIGludCBzZXRfbDJfdGFibGVfZW50cnlfY21kKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiBpbmRleCwKIAkJCQkgIHU4ICptYWMsIHU4IHZsYW5fdmFsaWQsIHUxNiB2bGFuKQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKHNldF9sMl90YWJsZV9lbnRyeV9pbildOwotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhzZXRfbDJfdGFibGVfZW50cnlfb3V0KV07CisJdTMyIGluW01MWDVfU1RfU1pfRFcoc2V0X2wyX3RhYmxlX2VudHJ5X2luKV0gICA9IHswfTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoc2V0X2wyX3RhYmxlX2VudHJ5X291dCldID0gezB9OwogCXU4ICppbl9tYWNfYWRkcjsKIAotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOwotCiAJTUxYNV9TRVQoc2V0X2wyX3RhYmxlX2VudHJ5X2luLCBpbiwgb3Bjb2RlLAogCQkgTUxYNV9DTURfT1BfU0VUX0wyX1RBQkxFX0VOVFJZKTsKIAlNTFg1X1NFVChzZXRfbDJfdGFibGVfZW50cnlfaW4sIGluLCB0YWJsZV9pbmRleCwgaW5kZXgpOwpAQCAtMjU3LDIzICsxNzgsMTggQEAKIAlpbl9tYWNfYWRkciA9IE1MWDVfQUREUl9PRihzZXRfbDJfdGFibGVfZW50cnlfaW4sIGluLCBtYWNfYWRkcmVzcyk7CiAJZXRoZXJfYWRkcl9jb3B5KCZpbl9tYWNfYWRkclsyXSwgbWFjKTsKIAotCXJldHVybiBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBzaXplb2YoaW4pLAotCQkJCQkgIG91dCwgc2l6ZW9mKG91dCkpOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQogCiBzdGF0aWMgaW50IGRlbF9sMl90YWJsZV9lbnRyeV9jbWQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyIGluZGV4KQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlbGV0ZV9sMl90YWJsZV9lbnRyeV9pbildOwotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZWxldGVfbDJfdGFibGVfZW50cnlfb3V0KV07Ci0KLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhkZWxldGVfbDJfdGFibGVfZW50cnlfaW4pXSAgID0gezB9OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZWxldGVfbDJfdGFibGVfZW50cnlfb3V0KV0gPSB7MH07CiAKIAlNTFg1X1NFVChkZWxldGVfbDJfdGFibGVfZW50cnlfaW4sIGluLCBvcGNvZGUsCiAJCSBNTFg1X0NNRF9PUF9ERUxFVEVfTDJfVEFCTEVfRU5UUlkpOwogCU1MWDVfU0VUKGRlbGV0ZV9sMl90YWJsZV9lbnRyeV9pbiwgaW4sIHRhYmxlX2luZGV4LCBpbmRleCk7Ci0JcmV0dXJuIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksCi0JCQkJCSAgb3V0LCBzaXplb2Yob3V0KSk7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiAKIHN0YXRpYyBpbnQgYWxsb2NfbDJfdGFibGVfaW5kZXgoc3RydWN0IG1seDVfbDJfdGFibGUgKmwyX3RhYmxlLCB1MzIgKml4KQpAQCAtMzQwLDcgKzI1Niw3IEBACiAKIAlzcGVjID0gbWx4NV92emFsbG9jKHNpemVvZigqc3BlYykpOwogCWlmICghc3BlYykgewotCQlwcl93YXJuKCJGREI6IEZhaWxlZCB0byBhbGxvYyBtYXRjaCBwYXJhbWV0ZXJzXG4iKTsKKwkJZXN3X3dhcm4oZXN3LT5kZXYsICJGREI6IEZhaWxlZCB0byBhbGxvYyBtYXRjaCBwYXJhbWV0ZXJzXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCWRtYWNfdiA9IE1MWDVfQUREUl9PRihmdGVfbWF0Y2hfcGFyYW0sIHNwZWMtPm1hdGNoX3ZhbHVlLApAQCAtMzc0LDggKzI5MCw4IEBACiAJCQkJICAgTUxYNV9GTE9XX0NPTlRFWFRfQUNUSU9OX0ZXRF9ERVNULAogCQkJCSAgIDAsICZkZXN0KTsKIAlpZiAoSVNfRVJSKGZsb3dfcnVsZSkpIHsKLQkJcHJfd2FybigKLQkJCSJGREI6IEZhaWxlZCB0byBhZGQgZmxvdyBydWxlOiBkbWFjX3YoJXBNKSBkbWFjX2MoJXBNKSAtPiB2cG9ydCglZCksIGVyciglbGQpXG4iLAorCQllc3dfd2Fybihlc3ctPmRldiwKKwkJCSAiRkRCOiBGYWlsZWQgdG8gYWRkIGZsb3cgcnVsZTogZG1hY192KCVwTSkgZG1hY19jKCVwTSkgLT4gdnBvcnQoJWQpLCBlcnIoJWxkKVxuIiwKIAkJCSBkbWFjX3YsIGRtYWNfYywgdnBvcnQsIFBUUl9FUlIoZmxvd19ydWxlKSk7CiAJCWZsb3dfcnVsZSA9IE5VTEw7CiAJfQpAQCAtOTU1LDcgKzg3MSw3IEBACiAJZXN3X2RlYnVnKGVzdy0+ZGV2LCAidnBvcnRbJWRdIGNvbnRleHQgdXBkYXRlIHJ4IG1vZGUgcHJvbWlzY19hbGw9JWQsIGFsbF9tdWx0aT0lZFxuIiwKIAkJICB2cG9ydF9udW0sIHByb21pc2NfYWxsLCBwcm9taXNjX21jKTsKIAotCWlmICghdnBvcnQtPnRydXN0ZWQgfHwgIXZwb3J0LT5lbmFibGVkKSB7CisJaWYgKCF2cG9ydC0+aW5mby50cnVzdGVkIHx8ICF2cG9ydC0+ZW5hYmxlZCkgewogCQlwcm9taXNjX3VjID0gMDsKIAkJcHJvbWlzY19tYyA9IDA7CiAJCXByb21pc2NfYWxsID0gMDsKQEAgLTEyOTEsMzAgKzEyMDcsMjAgQEAKIAkJCQkgICAgc3RydWN0IG1seDVfdnBvcnQgKnZwb3J0KQogewogCXN0cnVjdCBtbHg1X2Zsb3dfc3BlYyAqc3BlYzsKLQl1OCBzbWFjW0VUSF9BTEVOXTsKIAlpbnQgZXJyID0gMDsKIAl1OCAqc21hY192OwogCi0JaWYgKHZwb3J0LT5zcG9vZmNoaykgewotCQllcnIgPSBtbHg1X3F1ZXJ5X25pY192cG9ydF9tYWNfYWRkcmVzcyhlc3ctPmRldiwgdnBvcnQtPnZwb3J0LCBzbWFjKTsKLQkJaWYgKGVycikgewotCQkJZXN3X3dhcm4oZXN3LT5kZXYsCi0JCQkJICJ2cG9ydFslZF0gY29uZmlndXJlIGluZ3Jlc3MgcnVsZXMgZmFpbGVkLCBxdWVyeSBzbWFjIGZhaWxlZCwgZXJyKCVkKVxuIiwKLQkJCQkgdnBvcnQtPnZwb3J0LCBlcnIpOwotCQkJcmV0dXJuIGVycjsKLQkJfQorCWlmICh2cG9ydC0+aW5mby5zcG9vZmNoayAmJiAhaXNfdmFsaWRfZXRoZXJfYWRkcih2cG9ydC0+aW5mby5tYWMpKSB7CisJCW1seDVfY29yZV93YXJuKGVzdy0+ZGV2LAorCQkJICAgICAgICJ2cG9ydFslZF0gY29uZmlndXJlIGluZ3Jlc3MgcnVsZXMgZmFpbGVkLCBpbGxlZ2FsIG1hYyB3aXRoIHNwb29mY2hrXG4iLAorCQkJICAgICAgIHZwb3J0LT52cG9ydCk7CisJCXJldHVybiAtRVBFUk07CiAKLQkJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKHNtYWMpKSB7Ci0JCQltbHg1X2NvcmVfd2Fybihlc3ctPmRldiwKLQkJCQkgICAgICAgInZwb3J0WyVkXSBjb25maWd1cmUgaW5ncmVzcyBydWxlcyBmYWlsZWQsIGlsbGVnYWwgbWFjIHdpdGggc3Bvb2ZjaGtcbiIsCi0JCQkJICAgICAgIHZwb3J0LT52cG9ydCk7Ci0JCQlyZXR1cm4gLUVQRVJNOwotCQl9CiAJfQogCiAJZXN3X3Zwb3J0X2NsZWFudXBfaW5ncmVzc19ydWxlcyhlc3csIHZwb3J0KTsKIAotCWlmICghdnBvcnQtPnZsYW4gJiYgIXZwb3J0LT5xb3MgJiYgIXZwb3J0LT5zcG9vZmNoaykgeworCWlmICghdnBvcnQtPmluZm8udmxhbiAmJiAhdnBvcnQtPmluZm8ucW9zICYmICF2cG9ydC0+aW5mby5zcG9vZmNoaykgewogCQllc3dfdnBvcnRfZGlzYWJsZV9pbmdyZXNzX2FjbChlc3csIHZwb3J0KTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTMyMyw3ICsxMjI5LDcgQEAKIAogCWVzd19kZWJ1Zyhlc3ctPmRldiwKIAkJICAidnBvcnRbJWRdIGNvbmZpZ3VyZSBpbmdyZXNzIHJ1bGVzLCB2bGFuKCVkKSBxb3MoJWQpXG4iLAotCQkgIHZwb3J0LT52cG9ydCwgdnBvcnQtPnZsYW4sIHZwb3J0LT5xb3MpOworCQkgIHZwb3J0LT52cG9ydCwgdnBvcnQtPmluZm8udmxhbiwgdnBvcnQtPmluZm8ucW9zKTsKIAogCXNwZWMgPSBtbHg1X3Z6YWxsb2Moc2l6ZW9mKCpzcGVjKSk7CiAJaWYgKCFzcGVjKSB7CkBAIC0xMzMzLDE2ICsxMjM5LDE2IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWlmICh2cG9ydC0+dmxhbiB8fCB2cG9ydC0+cW9zKQorCWlmICh2cG9ydC0+aW5mby52bGFuIHx8IHZwb3J0LT5pbmZvLnFvcykKIAkJTUxYNV9TRVRfVE9fT05FUyhmdGVfbWF0Y2hfcGFyYW0sIHNwZWMtPm1hdGNoX2NyaXRlcmlhLCBvdXRlcl9oZWFkZXJzLnZsYW5fdGFnKTsKIAotCWlmICh2cG9ydC0+c3Bvb2ZjaGspIHsKKwlpZiAodnBvcnQtPmluZm8uc3Bvb2ZjaGspIHsKIAkJTUxYNV9TRVRfVE9fT05FUyhmdGVfbWF0Y2hfcGFyYW0sIHNwZWMtPm1hdGNoX2NyaXRlcmlhLCBvdXRlcl9oZWFkZXJzLnNtYWNfNDdfMTYpOwogCQlNTFg1X1NFVF9UT19PTkVTKGZ0ZV9tYXRjaF9wYXJhbSwgc3BlYy0+bWF0Y2hfY3JpdGVyaWEsIG91dGVyX2hlYWRlcnMuc21hY18xNV8wKTsKIAkJc21hY192ID0gTUxYNV9BRERSX09GKGZ0ZV9tYXRjaF9wYXJhbSwKIAkJCQkgICAgICBzcGVjLT5tYXRjaF92YWx1ZSwKIAkJCQkgICAgICBvdXRlcl9oZWFkZXJzLnNtYWNfNDdfMTYpOwotCQlldGhlcl9hZGRyX2NvcHkoc21hY192LCBzbWFjKTsKKwkJZXRoZXJfYWRkcl9jb3B5KHNtYWNfdiwgdnBvcnQtPmluZm8ubWFjKTsKIAl9CiAKIAlzcGVjLT5tYXRjaF9jcml0ZXJpYV9lbmFibGUgPSBNTFg1X01BVENIX09VVEVSX0hFQURFUlM7CkBAIC0xMzUyLDggKzEyNTgsOSBAQAogCQkJCSAgIDAsIE5VTEwpOwogCWlmIChJU19FUlIodnBvcnQtPmluZ3Jlc3MuYWxsb3dfcnVsZSkpIHsKIAkJZXJyID0gUFRSX0VSUih2cG9ydC0+aW5ncmVzcy5hbGxvd19ydWxlKTsKLQkJcHJfd2FybigidnBvcnRbJWRdIGNvbmZpZ3VyZSBpbmdyZXNzIGFsbG93IHJ1bGUsIGVyciglZClcbiIsCi0JCQl2cG9ydC0+dnBvcnQsIGVycik7CisJCWVzd193YXJuKGVzdy0+ZGV2LAorCQkJICJ2cG9ydFslZF0gY29uZmlndXJlIGluZ3Jlc3MgYWxsb3cgcnVsZSwgZXJyKCVkKVxuIiwKKwkJCSB2cG9ydC0+dnBvcnQsIGVycik7CiAJCXZwb3J0LT5pbmdyZXNzLmFsbG93X3J1bGUgPSBOVUxMOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xMzY1LDggKzEyNzIsOSBAQAogCQkJCSAgIDAsIE5VTEwpOwogCWlmIChJU19FUlIodnBvcnQtPmluZ3Jlc3MuZHJvcF9ydWxlKSkgewogCQllcnIgPSBQVFJfRVJSKHZwb3J0LT5pbmdyZXNzLmRyb3BfcnVsZSk7Ci0JCXByX3dhcm4oInZwb3J0WyVkXSBjb25maWd1cmUgaW5ncmVzcyBkcm9wIHJ1bGUsIGVyciglZClcbiIsCi0JCQl2cG9ydC0+dnBvcnQsIGVycik7CisJCWVzd193YXJuKGVzdy0+ZGV2LAorCQkJICJ2cG9ydFslZF0gY29uZmlndXJlIGluZ3Jlc3MgZHJvcCBydWxlLCBlcnIoJWQpXG4iLAorCQkJIHZwb3J0LT52cG9ydCwgZXJyKTsKIAkJdnBvcnQtPmluZ3Jlc3MuZHJvcF9ydWxlID0gTlVMTDsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTM4Niw3ICsxMjk0LDcgQEAKIAogCWVzd192cG9ydF9jbGVhbnVwX2VncmVzc19ydWxlcyhlc3csIHZwb3J0KTsKIAotCWlmICghdnBvcnQtPnZsYW4gJiYgIXZwb3J0LT5xb3MpIHsKKwlpZiAoIXZwb3J0LT5pbmZvLnZsYW4gJiYgIXZwb3J0LT5pbmZvLnFvcykgewogCQllc3dfdnBvcnRfZGlzYWJsZV9lZ3Jlc3NfYWNsKGVzdywgdnBvcnQpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xMzk1LDcgKzEzMDMsNyBAQAogCiAJZXN3X2RlYnVnKGVzdy0+ZGV2LAogCQkgICJ2cG9ydFslZF0gY29uZmlndXJlIGVncmVzcyBydWxlcywgdmxhbiglZCkgcW9zKCVkKVxuIiwKLQkJICB2cG9ydC0+dnBvcnQsIHZwb3J0LT52bGFuLCB2cG9ydC0+cW9zKTsKKwkJICB2cG9ydC0+dnBvcnQsIHZwb3J0LT5pbmZvLnZsYW4sIHZwb3J0LT5pbmZvLnFvcyk7CiAKIAlzcGVjID0gbWx4NV92emFsbG9jKHNpemVvZigqc3BlYykpOwogCWlmICghc3BlYykgewpAQCAtMTQwOSw3ICsxMzE3LDcgQEAKIAlNTFg1X1NFVF9UT19PTkVTKGZ0ZV9tYXRjaF9wYXJhbSwgc3BlYy0+bWF0Y2hfY3JpdGVyaWEsIG91dGVyX2hlYWRlcnMudmxhbl90YWcpOwogCU1MWDVfU0VUX1RPX09ORVMoZnRlX21hdGNoX3BhcmFtLCBzcGVjLT5tYXRjaF92YWx1ZSwgb3V0ZXJfaGVhZGVycy52bGFuX3RhZyk7CiAJTUxYNV9TRVRfVE9fT05FUyhmdGVfbWF0Y2hfcGFyYW0sIHNwZWMtPm1hdGNoX2NyaXRlcmlhLCBvdXRlcl9oZWFkZXJzLmZpcnN0X3ZpZCk7Ci0JTUxYNV9TRVQoZnRlX21hdGNoX3BhcmFtLCBzcGVjLT5tYXRjaF92YWx1ZSwgb3V0ZXJfaGVhZGVycy5maXJzdF92aWQsIHZwb3J0LT52bGFuKTsKKwlNTFg1X1NFVChmdGVfbWF0Y2hfcGFyYW0sIHNwZWMtPm1hdGNoX3ZhbHVlLCBvdXRlcl9oZWFkZXJzLmZpcnN0X3ZpZCwgdnBvcnQtPmluZm8udmxhbik7CiAKIAlzcGVjLT5tYXRjaF9jcml0ZXJpYV9lbmFibGUgPSBNTFg1X01BVENIX09VVEVSX0hFQURFUlM7CiAJdnBvcnQtPmVncmVzcy5hbGxvd2VkX3ZsYW4gPQpAQCAtMTQxOCw4ICsxMzI2LDkgQEAKIAkJCQkgICAwLCBOVUxMKTsKIAlpZiAoSVNfRVJSKHZwb3J0LT5lZ3Jlc3MuYWxsb3dlZF92bGFuKSkgewogCQllcnIgPSBQVFJfRVJSKHZwb3J0LT5lZ3Jlc3MuYWxsb3dlZF92bGFuKTsKLQkJcHJfd2FybigidnBvcnRbJWRdIGNvbmZpZ3VyZSBlZ3Jlc3MgYWxsb3dlZCB2bGFuIHJ1bGUgZmFpbGVkLCBlcnIoJWQpXG4iLAotCQkJdnBvcnQtPnZwb3J0LCBlcnIpOworCQllc3dfd2Fybihlc3ctPmRldiwKKwkJCSAidnBvcnRbJWRdIGNvbmZpZ3VyZSBlZ3Jlc3MgYWxsb3dlZCB2bGFuIHJ1bGUgZmFpbGVkLCBlcnIoJWQpXG4iLAorCQkJIHZwb3J0LT52cG9ydCwgZXJyKTsKIAkJdnBvcnQtPmVncmVzcy5hbGxvd2VkX3ZsYW4gPSBOVUxMOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xNDMyLDggKzEzNDEsOSBAQAogCQkJCSAgIDAsIE5VTEwpOwogCWlmIChJU19FUlIodnBvcnQtPmVncmVzcy5kcm9wX3J1bGUpKSB7CiAJCWVyciA9IFBUUl9FUlIodnBvcnQtPmVncmVzcy5kcm9wX3J1bGUpOwotCQlwcl93YXJuKCJ2cG9ydFslZF0gY29uZmlndXJlIGVncmVzcyBkcm9wIHJ1bGUgZmFpbGVkLCBlcnIoJWQpXG4iLAotCQkJdnBvcnQtPnZwb3J0LCBlcnIpOworCQllc3dfd2Fybihlc3ctPmRldiwKKwkJCSAidnBvcnRbJWRdIGNvbmZpZ3VyZSBlZ3Jlc3MgZHJvcCBydWxlIGZhaWxlZCwgZXJyKCVkKVxuIiwKKwkJCSB2cG9ydC0+dnBvcnQsIGVycik7CiAJCXZwb3J0LT5lZ3Jlc3MuZHJvcF9ydWxlID0gTlVMTDsKIAl9CiBvdXQ6CkBAIC0xNDQxLDYgKzEzNTEsNDEgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgdm9pZCBub2RlX2d1aWRfZ2VuX2Zyb21fbWFjKHU2NCAqbm9kZV9ndWlkLCB1OCBtYWNbRVRIX0FMRU5dKQoreworCSgodTggKilub2RlX2d1aWQpWzddID0gbWFjWzBdOworCSgodTggKilub2RlX2d1aWQpWzZdID0gbWFjWzFdOworCSgodTggKilub2RlX2d1aWQpWzVdID0gbWFjWzJdOworCSgodTggKilub2RlX2d1aWQpWzRdID0gMHhmZjsKKwkoKHU4ICopbm9kZV9ndWlkKVszXSA9IDB4ZmU7CisJKCh1OCAqKW5vZGVfZ3VpZClbMl0gPSBtYWNbM107CisJKCh1OCAqKW5vZGVfZ3VpZClbMV0gPSBtYWNbNF07CisJKCh1OCAqKW5vZGVfZ3VpZClbMF0gPSBtYWNbNV07Cit9CisKK3N0YXRpYyB2b2lkIGVzd19hcHBseV92cG9ydF9jb25mKHN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdywKKwkJCQkgc3RydWN0IG1seDVfdnBvcnQgKnZwb3J0KQoreworCWludCB2cG9ydF9udW0gPSB2cG9ydC0+dnBvcnQ7CisKKwlpZiAoIXZwb3J0X251bSkKKwkJcmV0dXJuOworCisJbWx4NV9tb2RpZnlfdnBvcnRfYWRtaW5fc3RhdGUoZXN3LT5kZXYsCisJCQkJICAgICAgTUxYNV9RVUVSWV9WUE9SVF9TVEFURV9JTl9PUF9NT0RfRVNXX1ZQT1JULAorCQkJCSAgICAgIHZwb3J0X251bSwKKwkJCQkgICAgICB2cG9ydC0+aW5mby5saW5rX3N0YXRlKTsKKwltbHg1X21vZGlmeV9uaWNfdnBvcnRfbWFjX2FkZHJlc3MoZXN3LT5kZXYsIHZwb3J0X251bSwgdnBvcnQtPmluZm8ubWFjKTsKKwltbHg1X21vZGlmeV9uaWNfdnBvcnRfbm9kZV9ndWlkKGVzdy0+ZGV2LCB2cG9ydF9udW0sIHZwb3J0LT5pbmZvLm5vZGVfZ3VpZCk7CisJbW9kaWZ5X2Vzd192cG9ydF9jdmxhbihlc3ctPmRldiwgdnBvcnRfbnVtLCB2cG9ydC0+aW5mby52bGFuLCB2cG9ydC0+aW5mby5xb3MsCisJCQkgICAgICAgKHZwb3J0LT5pbmZvLnZsYW4gfHwgdnBvcnQtPmluZm8ucW9zKSk7CisKKwkvKiBPbmx5IGxlZ2FjeSBtb2RlIG5lZWRzIEFDTHMgKi8KKwlpZiAoZXN3LT5tb2RlID09IFNSSU9WX0xFR0FDWSkgeworCQllc3dfdnBvcnRfaW5ncmVzc19jb25maWcoZXN3LCB2cG9ydCk7CisJCWVzd192cG9ydF9lZ3Jlc3NfY29uZmlnKGVzdywgdnBvcnQpOworCX0KK30KIHN0YXRpYyB2b2lkIGVzd19lbmFibGVfdnBvcnQoc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3LCBpbnQgdnBvcnRfbnVtLAogCQkJICAgICBpbnQgZW5hYmxlX2V2ZW50cykKIHsKQEAgLTE0NTEsMjIgKzEzOTYsMTcgQEAKIAogCWVzd19kZWJ1Zyhlc3ctPmRldiwgIkVuYWJsaW5nIFZQT1JUKCVkKVxuIiwgdnBvcnRfbnVtKTsKIAotCWlmICh2cG9ydF9udW0pIHsgLyogT25seSBWRnMgbmVlZCBBQ0xzIGZvciBWU1QgYW5kIHNwb29mY2hrIGZpbHRlcmluZyAqLwotCQllc3dfdnBvcnRfaW5ncmVzc19jb25maWcoZXN3LCB2cG9ydCk7Ci0JCWVzd192cG9ydF9lZ3Jlc3NfY29uZmlnKGVzdywgdnBvcnQpOwotCX0KLQotCW1seDVfbW9kaWZ5X3Zwb3J0X2FkbWluX3N0YXRlKGVzdy0+ZGV2LAotCQkJCSAgICAgIE1MWDVfUVVFUllfVlBPUlRfU1RBVEVfSU5fT1BfTU9EX0VTV19WUE9SVCwKLQkJCQkgICAgICB2cG9ydF9udW0sCi0JCQkJICAgICAgTUxYNV9FU1dfVlBPUlRfQURNSU5fU1RBVEVfQVVUTyk7CisJLyogUmVzdG9yZSBvbGQgdnBvcnQgY29uZmlndXJhdGlvbiAqLworCWVzd19hcHBseV92cG9ydF9jb25mKGVzdywgdnBvcnQpOwogCiAJLyogU3luYyB3aXRoIGN1cnJlbnQgdnBvcnQgY29udGV4dCAqLwogCXZwb3J0LT5lbmFibGVkX2V2ZW50cyA9IGVuYWJsZV9ldmVudHM7CiAJdnBvcnQtPmVuYWJsZWQgPSB0cnVlOwogCiAJLyogb25seSBQRiBpcyB0cnVzdGVkIGJ5IGRlZmF1bHQgKi8KLQl2cG9ydC0+dHJ1c3RlZCA9ICh2cG9ydF9udW0pID8gZmFsc2UgOiB0cnVlOworCWlmICghdnBvcnRfbnVtKQorCQl2cG9ydC0+aW5mby50cnVzdGVkID0gdHJ1ZTsKKwogCWVzd192cG9ydF9jaGFuZ2VfaGFuZGxlX2xvY2tlZCh2cG9ydCk7CiAKIAllc3ctPmVuYWJsZWRfdnBvcnRzKys7CkBAIC0xNDg2LDExICsxNDI2LDYgQEAKIAl2cG9ydC0+ZW5hYmxlZCA9IGZhbHNlOwogCiAJc3luY2hyb25pemVfaXJxKG1seDVfZ2V0X21zaXhfdmVjKGVzdy0+ZGV2LCBNTFg1X0VRX1ZFQ19BU1lOQykpOwotCi0JbWx4NV9tb2RpZnlfdnBvcnRfYWRtaW5fc3RhdGUoZXN3LT5kZXYsCi0JCQkJICAgICAgTUxYNV9RVUVSWV9WUE9SVF9TVEFURV9JTl9PUF9NT0RfRVNXX1ZQT1JULAotCQkJCSAgICAgIHZwb3J0X251bSwKLQkJCQkgICAgICBNTFg1X0VTV19WUE9SVF9BRE1JTl9TVEFURV9ET1dOKTsKIAkvKiBXYWl0IGZvciBjdXJyZW50IGFscmVhZHkgc2NoZWR1bGVkIGV2ZW50cyB0byBjb21wbGV0ZSAqLwogCWZsdXNoX3dvcmtxdWV1ZShlc3ctPndvcmtfcXVldWUpOwogCS8qIERpc2FibGUgZXZlbnRzIGZyb20gdGhpcyB2cG9ydCAqLwpAQCAtMTUwMiw3ICsxNDM3LDEyIEBACiAJICovCiAJZXN3X3Zwb3J0X2NoYW5nZV9oYW5kbGVfbG9ja2VkKHZwb3J0KTsKIAl2cG9ydC0+ZW5hYmxlZF9ldmVudHMgPSAwOwotCWlmICh2cG9ydF9udW0pIHsKKworCWlmICh2cG9ydF9udW0gJiYgZXN3LT5tb2RlID09IFNSSU9WX0xFR0FDWSkgeworCQltbHg1X21vZGlmeV92cG9ydF9hZG1pbl9zdGF0ZShlc3ctPmRldiwKKwkJCQkJICAgICAgTUxYNV9RVUVSWV9WUE9SVF9TVEFURV9JTl9PUF9NT0RfRVNXX1ZQT1JULAorCQkJCQkgICAgICB2cG9ydF9udW0sCisJCQkJCSAgICAgIE1MWDVfRVNXX1ZQT1JUX0FETUlOX1NUQVRFX0RPV04pOwogCQllc3dfdnBvcnRfZGlzYWJsZV9lZ3Jlc3NfYWNsKGVzdywgdnBvcnQpOwogCQllc3dfdnBvcnRfZGlzYWJsZV9pbmdyZXNzX2FjbChlc3csIHZwb3J0KTsKIAl9CkBAIC0xNTUzLDYgKzE0OTMsNyBAQAogCiBhYm9ydDoKIAllc3dfZW5hYmxlX3Zwb3J0KGVzdywgMCwgVUNfQUREUl9DSEFOR0UpOworCWVzdy0+bW9kZSA9IFNSSU9WX05PTkU7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTU4OCw2ICsxNTI5LDI1IEBACiAJZXN3X2VuYWJsZV92cG9ydChlc3csIDAsIFVDX0FERFJfQ0hBTkdFKTsKIH0KIAordm9pZCBtbHg1X2Vzd2l0Y2hfYXR0YWNoKHN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdykKK3sKKwlpZiAoIWVzdyB8fCAhTUxYNV9DQVBfR0VOKGVzdy0+ZGV2LCB2cG9ydF9ncm91cF9tYW5hZ2VyKSB8fAorCSAgICBNTFg1X0NBUF9HRU4oZXN3LT5kZXYsIHBvcnRfdHlwZSkgIT0gTUxYNV9DQVBfUE9SVF9UWVBFX0VUSCkKKwkJcmV0dXJuOworCisJZXN3X2VuYWJsZV92cG9ydChlc3csIDAsIFVDX0FERFJfQ0hBTkdFKTsKKwkvKiBWRiBWcG9ydHMgd2lsbCBiZSBlbmFibGVkIHdoZW4gU1JJT1YgaXMgZW5hYmxlZCAqLworfQorCit2b2lkIG1seDVfZXN3aXRjaF9kZXRhY2goc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3KQoreworCWlmICghZXN3IHx8ICFNTFg1X0NBUF9HRU4oZXN3LT5kZXYsIHZwb3J0X2dyb3VwX21hbmFnZXIpIHx8CisJICAgIE1MWDVfQ0FQX0dFTihlc3ctPmRldiwgcG9ydF90eXBlKSAhPSBNTFg1X0NBUF9QT1JUX1RZUEVfRVRIKQorCQlyZXR1cm47CisKKwllc3dfZGlzYWJsZV92cG9ydChlc3csIDApOworfQorCiBpbnQgbWx4NV9lc3dpdGNoX2luaXQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKIHsKIAlpbnQgbDJfdGFibGVfc2l6ZSA9IDEgPDwgTUxYNV9DQVBfR0VOKGRldiwgbG9nX21heF9sMl90YWJsZSk7CkBAIC0xNjU1LDYgKzE2MTUsNyBAQAogCQlzdHJ1Y3QgbWx4NV92cG9ydCAqdnBvcnQgPSAmZXN3LT52cG9ydHNbdnBvcnRfbnVtXTsKIAogCQl2cG9ydC0+dnBvcnQgPSB2cG9ydF9udW07CisJCXZwb3J0LT5pbmZvLmxpbmtfc3RhdGUgPSBNTFg1X0VTV19WUE9SVF9BRE1JTl9TVEFURV9BVVRPOwogCQl2cG9ydC0+ZGV2ID0gZGV2OwogCQlJTklUX1dPUksoJnZwb3J0LT52cG9ydF9jaGFuZ2VfaGFuZGxlciwKIAkJCSAgZXN3X3Zwb3J0X2NoYW5nZV9oYW5kbGVyKTsKQEAgLTE2NjUsOCArMTYyNiw2IEBACiAJZXN3LT5tb2RlID0gU1JJT1ZfTk9ORTsKIAogCWRldi0+cHJpdi5lc3dpdGNoID0gZXN3OwotCWVzd19lbmFibGVfdnBvcnQoZXN3LCAwLCBVQ19BRERSX0NIQU5HRSk7Ci0JLyogVkYgVnBvcnRzIHdpbGwgYmUgZW5hYmxlZCB3aGVuIFNSSU9WIGlzIGVuYWJsZWQgKi8KIAlyZXR1cm4gMDsKIGFib3J0OgogCWlmIChlc3ctPndvcmtfcXVldWUpCkBAIC0xNjg1LDcgKzE2NDQsNiBAQAogCQlyZXR1cm47CiAKIAllc3dfaW5mbyhlc3ctPmRldiwgImNsZWFudXBcbiIpOwotCWVzd19kaXNhYmxlX3Zwb3J0KGVzdywgMCk7CiAKIAllc3ctPmRldi0+cHJpdi5lc3dpdGNoID0gTlVMTDsKIAlkZXN0cm95X3dvcmtxdWV1ZShlc3ctPndvcmtfcXVldWUpOwpAQCAtMTcxOCwxOCArMTY3Niw2IEBACiAJKGVzdyAmJiBNTFg1X0NBUF9HRU4oZXN3LT5kZXYsIHZwb3J0X2dyb3VwX21hbmFnZXIpICYmIG1seDVfY29yZV9pc19wZihlc3ctPmRldikpCiAjZGVmaW5lIExFR0FMX1ZQT1JUKGVzdywgdnBvcnQpICh2cG9ydCA+PSAwICYmIHZwb3J0IDwgZXN3LT50b3RhbF92cG9ydHMpCiAKLXN0YXRpYyB2b2lkIG5vZGVfZ3VpZF9nZW5fZnJvbV9tYWModTY0ICpub2RlX2d1aWQsIHU4IG1hY1tFVEhfQUxFTl0pCi17Ci0JKCh1OCAqKW5vZGVfZ3VpZClbN10gPSBtYWNbMF07Ci0JKCh1OCAqKW5vZGVfZ3VpZClbNl0gPSBtYWNbMV07Ci0JKCh1OCAqKW5vZGVfZ3VpZClbNV0gPSBtYWNbMl07Ci0JKCh1OCAqKW5vZGVfZ3VpZClbNF0gPSAweGZmOwotCSgodTggKilub2RlX2d1aWQpWzNdID0gMHhmZTsKLQkoKHU4ICopbm9kZV9ndWlkKVsyXSA9IG1hY1szXTsKLQkoKHU4ICopbm9kZV9ndWlkKVsxXSA9IG1hY1s0XTsKLQkoKHU4ICopbm9kZV9ndWlkKVswXSA9IG1hY1s1XTsKLX0KLQogaW50IG1seDVfZXN3aXRjaF9zZXRfdnBvcnRfbWFjKHN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdywKIAkJCSAgICAgICBpbnQgdnBvcnQsIHU4IG1hY1tFVEhfQUxFTl0pCiB7CkBAIC0xNzQyLDEzICsxNjg4LDE1IEBACiAJaWYgKCFMRUdBTF9WUE9SVChlc3csIHZwb3J0KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwltdXRleF9sb2NrKCZlc3ctPnN0YXRlX2xvY2spOwogCWV2cG9ydCA9ICZlc3ctPnZwb3J0c1t2cG9ydF07CiAKLQlpZiAoZXZwb3J0LT5zcG9vZmNoayAmJiAhaXNfdmFsaWRfZXRoZXJfYWRkcihtYWMpKSB7CisJaWYgKGV2cG9ydC0+aW5mby5zcG9vZmNoayAmJiAhaXNfdmFsaWRfZXRoZXJfYWRkcihtYWMpKSB7CiAJCW1seDVfY29yZV93YXJuKGVzdy0+ZGV2LAogCQkJICAgICAgICJNQUMgaW52YWxpZGF0aW9uIGlzIG5vdCBhbGxvd2VkIHdoZW4gc3Bvb2ZjaGsgaXMgb24sIHZwb3J0KCVkKVxuIiwKIAkJCSAgICAgICB2cG9ydCk7Ci0JCXJldHVybiAtRVBFUk07CisJCWVyciA9IC1FUEVSTTsKKwkJZ290byB1bmxvY2s7CiAJfQogCiAJZXJyID0gbWx4NV9tb2RpZnlfbmljX3Zwb3J0X21hY19hZGRyZXNzKGVzdy0+ZGV2LCB2cG9ydCwgbWFjKTsKQEAgLTE3NTYsNyArMTcwNCw3IEBACiAJCW1seDVfY29yZV93YXJuKGVzdy0+ZGV2LAogCQkJICAgICAgICJGYWlsZWQgdG8gbWx4NV9tb2RpZnlfbmljX3Zwb3J0X21hYyB2cG9ydCglZCkgZXJyPSglZClcbiIsCiAJCQkgICAgICAgdnBvcnQsIGVycik7Ci0JCXJldHVybiBlcnI7CisJCWdvdG8gdW5sb2NrOwogCX0KIAogCW5vZGVfZ3VpZF9nZW5fZnJvbV9tYWMoJm5vZGVfZ3VpZCwgbWFjKTsKQEAgLTE3NjYsOSArMTcxNCwxMiBAQAogCQkJICAgICAgICJGYWlsZWQgdG8gc2V0IHZwb3J0ICVkIG5vZGUgZ3VpZCwgZXJyID0gJWQuIFJETUFfQ00gd2lsbCBub3QgZnVuY3Rpb24gcHJvcGVybHkgZm9yIHRoaXMgVkYuXG4iLAogCQkJICAgICAgIHZwb3J0LCBlcnIpOwogCi0JbXV0ZXhfbG9jaygmZXN3LT5zdGF0ZV9sb2NrKTsKLQlpZiAoZXZwb3J0LT5lbmFibGVkKQorCWV0aGVyX2FkZHJfY29weShldnBvcnQtPmluZm8ubWFjLCBtYWMpOworCWV2cG9ydC0+aW5mby5ub2RlX2d1aWQgPSBub2RlX2d1aWQ7CisJaWYgKGV2cG9ydC0+ZW5hYmxlZCAmJiBlc3ctPm1vZGUgPT0gU1JJT1ZfTEVHQUNZKQogCQllcnIgPSBlc3dfdnBvcnRfaW5ncmVzc19jb25maWcoZXN3LCBldnBvcnQpOworCit1bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZlc3ctPnN0YXRlX2xvY2spOwogCXJldHVybiBlcnI7CiB9CkBAIC0xNzc2LDIyICsxNzI3LDM4IEBACiBpbnQgbWx4NV9lc3dpdGNoX3NldF92cG9ydF9zdGF0ZShzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3csCiAJCQkJIGludCB2cG9ydCwgaW50IGxpbmtfc3RhdGUpCiB7CisJc3RydWN0IG1seDVfdnBvcnQgKmV2cG9ydDsKKwlpbnQgZXJyID0gMDsKKwogCWlmICghRVNXX0FMTE9XRUQoZXN3KSkKIAkJcmV0dXJuIC1FUEVSTTsKIAlpZiAoIUxFR0FMX1ZQT1JUKGVzdywgdnBvcnQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldHVybiBtbHg1X21vZGlmeV92cG9ydF9hZG1pbl9zdGF0ZShlc3ctPmRldiwKLQkJCQkJICAgICBNTFg1X1FVRVJZX1ZQT1JUX1NUQVRFX0lOX09QX01PRF9FU1dfVlBPUlQsCi0JCQkJCSAgICAgdnBvcnQsIGxpbmtfc3RhdGUpOworCW11dGV4X2xvY2soJmVzdy0+c3RhdGVfbG9jayk7CisJZXZwb3J0ID0gJmVzdy0+dnBvcnRzW3Zwb3J0XTsKKworCWVyciA9IG1seDVfbW9kaWZ5X3Zwb3J0X2FkbWluX3N0YXRlKGVzdy0+ZGV2LAorCQkJCQkgICAgTUxYNV9RVUVSWV9WUE9SVF9TVEFURV9JTl9PUF9NT0RfRVNXX1ZQT1JULAorCQkJCQkgICAgdnBvcnQsIGxpbmtfc3RhdGUpOworCWlmIChlcnIpIHsKKwkJbWx4NV9jb3JlX3dhcm4oZXN3LT5kZXYsCisJCQkgICAgICAgIkZhaWxlZCB0byBzZXQgdnBvcnQgJWQgbGluayBzdGF0ZSwgZXJyID0gJWQiLAorCQkJICAgICAgIHZwb3J0LCBlcnIpOworCQlnb3RvIHVubG9jazsKKwl9CisKKwlldnBvcnQtPmluZm8ubGlua19zdGF0ZSA9IGxpbmtfc3RhdGU7CisKK3VubG9jazoKKwltdXRleF91bmxvY2soJmVzdy0+c3RhdGVfbG9jayk7CisJcmV0dXJuIDA7CiB9CiAKIGludCBtbHg1X2Vzd2l0Y2hfZ2V0X3Zwb3J0X2NvbmZpZyhzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3csCiAJCQkJICBpbnQgdnBvcnQsIHN0cnVjdCBpZmxhX3ZmX2luZm8gKml2aSkKIHsKIAlzdHJ1Y3QgbWx4NV92cG9ydCAqZXZwb3J0OwotCXUxNiB2bGFuOwotCXU4IHFvczsKIAogCWlmICghRVNXX0FMTE9XRUQoZXN3KSkKIAkJcmV0dXJuIC1FUEVSTTsKQEAgLTE4MDMsNTQgKzE3NzAsNjEgQEAKIAltZW1zZXQoaXZpLCAwLCBzaXplb2YoKml2aSkpOwogCWl2aS0+dmYgPSB2cG9ydCAtIDE7CiAKLQltbHg1X3F1ZXJ5X25pY192cG9ydF9tYWNfYWRkcmVzcyhlc3ctPmRldiwgdnBvcnQsIGl2aS0+bWFjKTsKLQlpdmktPmxpbmtzdGF0ZSA9IG1seDVfcXVlcnlfdnBvcnRfYWRtaW5fc3RhdGUoZXN3LT5kZXYsCi0JCQkJCQkgICAgICBNTFg1X1FVRVJZX1ZQT1JUX1NUQVRFX0lOX09QX01PRF9FU1dfVlBPUlQsCi0JCQkJCQkgICAgICB2cG9ydCk7Ci0JcXVlcnlfZXN3X3Zwb3J0X2N2bGFuKGVzdy0+ZGV2LCB2cG9ydCwgJnZsYW4sICZxb3MpOwotCWl2aS0+dmxhbiA9IHZsYW47Ci0JaXZpLT5xb3MgPSBxb3M7Ci0JaXZpLT5zcG9vZmNoayA9IGV2cG9ydC0+c3Bvb2ZjaGs7CisJbXV0ZXhfbG9jaygmZXN3LT5zdGF0ZV9sb2NrKTsKKwlldGhlcl9hZGRyX2NvcHkoaXZpLT5tYWMsIGV2cG9ydC0+aW5mby5tYWMpOworCWl2aS0+bGlua3N0YXRlID0gZXZwb3J0LT5pbmZvLmxpbmtfc3RhdGU7CisJaXZpLT52bGFuID0gZXZwb3J0LT5pbmZvLnZsYW47CisJaXZpLT5xb3MgPSBldnBvcnQtPmluZm8ucW9zOworCWl2aS0+c3Bvb2ZjaGsgPSBldnBvcnQtPmluZm8uc3Bvb2ZjaGs7CisJaXZpLT50cnVzdGVkID0gZXZwb3J0LT5pbmZvLnRydXN0ZWQ7CisJbXV0ZXhfdW5sb2NrKCZlc3ctPnN0YXRlX2xvY2spOwogCiAJcmV0dXJuIDA7CiB9CiAKLWludCBtbHg1X2Vzd2l0Y2hfc2V0X3Zwb3J0X3ZsYW4oc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3LAotCQkJCWludCB2cG9ydCwgdTE2IHZsYW4sIHU4IHFvcykKK2ludCBfX21seDVfZXN3aXRjaF9zZXRfdnBvcnRfdmxhbihzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3csCisJCQkJICBpbnQgdnBvcnQsIHUxNiB2bGFuLCB1OCBxb3MsIHU4IHNldF9mbGFncykKIHsKIAlzdHJ1Y3QgbWx4NV92cG9ydCAqZXZwb3J0OwogCWludCBlcnIgPSAwOwotCWludCBzZXQgPSAwOwogCiAJaWYgKCFFU1dfQUxMT1dFRChlc3cpKQogCQlyZXR1cm4gLUVQRVJNOwogCWlmICghTEVHQUxfVlBPUlQoZXN3LCB2cG9ydCkgfHwgKHZsYW4gPiA0MDk1KSB8fCAocW9zID4gNykpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKHZsYW4gfHwgcW9zKQotCQlzZXQgPSAxOwotCisJbXV0ZXhfbG9jaygmZXN3LT5zdGF0ZV9sb2NrKTsKIAlldnBvcnQgPSAmZXN3LT52cG9ydHNbdnBvcnRdOwogCi0JZXJyID0gbW9kaWZ5X2Vzd192cG9ydF9jdmxhbihlc3ctPmRldiwgdnBvcnQsIHZsYW4sIHFvcywgc2V0KTsKKwllcnIgPSBtb2RpZnlfZXN3X3Zwb3J0X2N2bGFuKGVzdy0+ZGV2LCB2cG9ydCwgdmxhbiwgcW9zLCBzZXRfZmxhZ3MpOwogCWlmIChlcnIpCi0JCXJldHVybiBlcnI7CisJCWdvdG8gdW5sb2NrOwogCi0JbXV0ZXhfbG9jaygmZXN3LT5zdGF0ZV9sb2NrKTsKLQlldnBvcnQtPnZsYW4gPSB2bGFuOwotCWV2cG9ydC0+cW9zID0gcW9zOwotCWlmIChldnBvcnQtPmVuYWJsZWQpIHsKKwlldnBvcnQtPmluZm8udmxhbiA9IHZsYW47CisJZXZwb3J0LT5pbmZvLnFvcyA9IHFvczsKKwlpZiAoZXZwb3J0LT5lbmFibGVkICYmIGVzdy0+bW9kZSA9PSBTUklPVl9MRUdBQ1kpIHsKIAkJZXJyID0gZXN3X3Zwb3J0X2luZ3Jlc3NfY29uZmlnKGVzdywgZXZwb3J0KTsKIAkJaWYgKGVycikKLQkJCWdvdG8gb3V0OworCQkJZ290byB1bmxvY2s7CiAJCWVyciA9IGVzd192cG9ydF9lZ3Jlc3NfY29uZmlnKGVzdywgZXZwb3J0KTsKIAl9CiAKLW91dDoKK3VubG9jazoKIAltdXRleF91bmxvY2soJmVzdy0+c3RhdGVfbG9jayk7CiAJcmV0dXJuIGVycjsKIH0KIAoraW50IG1seDVfZXN3aXRjaF9zZXRfdnBvcnRfdmxhbihzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3csCisJCQkJaW50IHZwb3J0LCB1MTYgdmxhbiwgdTggcW9zKQoreworCXU4IHNldF9mbGFncyA9IDA7CisKKwlpZiAodmxhbiB8fCBxb3MpCisJCXNldF9mbGFncyA9IFNFVF9WTEFOX1NUUklQIHwgU0VUX1ZMQU5fSU5TRVJUOworCisJcmV0dXJuIF9fbWx4NV9lc3dpdGNoX3NldF92cG9ydF92bGFuKGVzdywgdnBvcnQsIHZsYW4sIHFvcywgc2V0X2ZsYWdzKTsKK30KKwogaW50IG1seDVfZXN3aXRjaF9zZXRfdnBvcnRfc3Bvb2ZjaGsoc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3LAogCQkJCSAgICBpbnQgdnBvcnQsIGJvb2wgc3Bvb2ZjaGspCiB7CkBAIC0xODYzLDE1ICsxODM3LDE0IEBACiAJaWYgKCFMRUdBTF9WUE9SVChlc3csIHZwb3J0KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlldnBvcnQgPSAmZXN3LT52cG9ydHNbdnBvcnRdOwotCiAJbXV0ZXhfbG9jaygmZXN3LT5zdGF0ZV9sb2NrKTsKLQlwc2NoayA9IGV2cG9ydC0+c3Bvb2ZjaGs7Ci0JZXZwb3J0LT5zcG9vZmNoayA9IHNwb29mY2hrOwotCWlmIChldnBvcnQtPmVuYWJsZWQpCisJZXZwb3J0ID0gJmVzdy0+dnBvcnRzW3Zwb3J0XTsKKwlwc2NoayA9IGV2cG9ydC0+aW5mby5zcG9vZmNoazsKKwlldnBvcnQtPmluZm8uc3Bvb2ZjaGsgPSBzcG9vZmNoazsKKwlpZiAoZXZwb3J0LT5lbmFibGVkICYmIGVzdy0+bW9kZSA9PSBTUklPVl9MRUdBQ1kpCiAJCWVyciA9IGVzd192cG9ydF9pbmdyZXNzX2NvbmZpZyhlc3csIGV2cG9ydCk7CiAJaWYgKGVycikKLQkJZXZwb3J0LT5zcG9vZmNoayA9IHBzY2hrOworCQlldnBvcnQtPmluZm8uc3Bvb2ZjaGsgPSBwc2NoazsKIAltdXRleF91bmxvY2soJmVzdy0+c3RhdGVfbG9jayk7CiAKIAlyZXR1cm4gZXJyOwpAQCAtMTg4NywxMCArMTg2MCw5IEBACiAJaWYgKCFMRUdBTF9WUE9SVChlc3csIHZwb3J0KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlldnBvcnQgPSAmZXN3LT52cG9ydHNbdnBvcnRdOwotCiAJbXV0ZXhfbG9jaygmZXN3LT5zdGF0ZV9sb2NrKTsKLQlldnBvcnQtPnRydXN0ZWQgPSBzZXR0aW5nOworCWV2cG9ydCA9ICZlc3ctPnZwb3J0c1t2cG9ydF07CisJZXZwb3J0LT5pbmZvLnRydXN0ZWQgPSBzZXR0aW5nOwogCWlmIChldnBvcnQtPmVuYWJsZWQpCiAJCWVzd192cG9ydF9jaGFuZ2VfaGFuZGxlX2xvY2tlZChldnBvcnQpOwogCW11dGV4X3VubG9jaygmZXN3LT5zdGF0ZV9sb2NrKTsKQEAgLTE5MDMsNyArMTg3NSw3IEBACiAJCQkJIHN0cnVjdCBpZmxhX3ZmX3N0YXRzICp2Zl9zdGF0cykKIHsKIAlpbnQgb3V0bGVuID0gTUxYNV9TVF9TWl9CWVRFUyhxdWVyeV92cG9ydF9jb3VudGVyX291dCk7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcocXVlcnlfdnBvcnRfY291bnRlcl9pbildOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKHF1ZXJ5X3Zwb3J0X2NvdW50ZXJfaW4pXSA9IHswfTsKIAlpbnQgZXJyID0gMDsKIAl1MzIgKm91dDsKIApAQCAtMTkxNiw4ICsxODg4LDYgQEAKIAlpZiAoIW91dCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwotCiAJTUxYNV9TRVQocXVlcnlfdnBvcnRfY291bnRlcl9pbiwgaW4sIG9wY29kZSwKIAkJIE1MWDVfQ01EX09QX1FVRVJZX1ZQT1JUX0NPVU5URVIpOwogCU1MWDVfU0VUKHF1ZXJ5X3Zwb3J0X2NvdW50ZXJfaW4sIGluLCBvcF9tb2QsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2Vzd2l0Y2guaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lc3dpdGNoLmgKaW5kZXggYzBiMDU2MC4uMmUyOTM4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2Vzd2l0Y2guaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZXN3aXRjaC5oCkBAIC0xMDksNiArMTA5LDE2IEBACiAJc3RydWN0IG1seDVfZmxvd19ydWxlICAqZHJvcF9ydWxlOwogfTsKIAorc3RydWN0IG1seDVfdnBvcnRfaW5mbyB7CisJdTggICAgICAgICAgICAgICAgICAgICAgbWFjW0VUSF9BTEVOXTsKKwl1MTYgICAgICAgICAgICAgICAgICAgICB2bGFuOworCXU4ICAgICAgICAgICAgICAgICAgICAgIHFvczsKKwl1NjQgICAgICAgICAgICAgICAgICAgICBub2RlX2d1aWQ7CisJaW50ICAgICAgICAgICAgICAgICAgICAgbGlua19zdGF0ZTsKKwlib29sICAgICAgICAgICAgICAgICAgICBzcG9vZmNoazsKKwlib29sICAgICAgICAgICAgICAgICAgICB0cnVzdGVkOworfTsKKwogc3RydWN0IG1seDVfdnBvcnQgewogCXN0cnVjdCBtbHg1X2NvcmVfZGV2ICAgICpkZXY7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgdnBvcnQ7CkBAIC0xMjEsMTAgKzEzMSw4IEBACiAJc3RydWN0IHZwb3J0X2luZ3Jlc3MgICAgaW5ncmVzczsKIAlzdHJ1Y3QgdnBvcnRfZWdyZXNzICAgICBlZ3Jlc3M7CiAKLQl1MTYgICAgICAgICAgICAgICAgICAgICB2bGFuOwotCXU4ICAgICAgICAgICAgICAgICAgICAgIHFvczsKLQlib29sICAgICAgICAgICAgICAgICAgICBzcG9vZmNoazsKLQlib29sICAgICAgICAgICAgICAgICAgICB0cnVzdGVkOworCXN0cnVjdCBtbHg1X3Zwb3J0X2luZm8gIGluZm87CisKIAlib29sICAgICAgICAgICAgICAgICAgICBlbmFibGVkOwogCXUxNiAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWRfZXZlbnRzOwogfTsKQEAgLTE0OSw2ICsxNTcsNyBAQAogCQkJc3RydWN0IG1seDVfZmxvd19ncm91cCAqc2VuZF90b192cG9ydF9ncnA7CiAJCQlzdHJ1Y3QgbWx4NV9mbG93X2dyb3VwICptaXNzX2dycDsKIAkJCXN0cnVjdCBtbHg1X2Zsb3dfcnVsZSAgKm1pc3NfcnVsZTsKKwkJCWludCB2bGFuX3B1c2hfcG9wX3JlZmNvdW50OwogCQl9IG9mZmxvYWRzOwogCX07CiB9OwpAQCAtMTcwLDkgKzE3OSwxMyBAQAogCXZvaWQJCSAgICAgICAoKnVubG9hZCkoc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3LAogCQkJCQkgc3RydWN0IG1seDVfZXN3aXRjaF9yZXAgKnJlcCk7CiAJdTE2CQkgICAgICAgdnBvcnQ7Ci0Jc3RydWN0IG1seDVfZmxvd19ydWxlICp2cG9ydF9yeF9ydWxlOworCXU4CQkgICAgICAgaHdfaWRbRVRIX0FMRU5dOwogCXZvaWQJCSAgICAgICpwcml2X2RhdGE7CisKKwlzdHJ1Y3QgbWx4NV9mbG93X3J1bGUgKnZwb3J0X3J4X3J1bGU7CiAJc3RydWN0IGxpc3RfaGVhZCAgICAgICB2cG9ydF9zcXNfbGlzdDsKKwl1MTYJCSAgICAgICB2bGFuOworCXUzMgkJICAgICAgIHZsYW5fcmVmY291bnQ7CiAJYm9vbAkJICAgICAgIHZhbGlkOwogfTsKIApAQCAtMjAwLDkgKzIxMywxNCBAQAogCWludCAgICAgICAgICAgICAgICAgICAgIG1vZGU7CiB9OwogCit2b2lkIGVzd19vZmZsb2Fkc19jbGVhbnVwKHN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdywgaW50IG52cG9ydHMpOworaW50IGVzd19vZmZsb2Fkc19pbml0KHN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdywgaW50IG52cG9ydHMpOworCiAvKiBFLVN3aXRjaCBBUEkgKi8KIGludCBtbHg1X2Vzd2l0Y2hfaW5pdChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKIHZvaWQgbWx4NV9lc3dpdGNoX2NsZWFudXAoc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3KTsKK3ZvaWQgbWx4NV9lc3dpdGNoX2F0dGFjaChzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3cpOwordm9pZCBtbHg1X2Vzd2l0Y2hfZGV0YWNoKHN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdyk7CiB2b2lkIG1seDVfZXN3aXRjaF92cG9ydF9ldmVudChzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3csIHN0cnVjdCBtbHg1X2VxZSAqZXFlKTsKIGludCBtbHg1X2Vzd2l0Y2hfZW5hYmxlX3NyaW92KHN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdywgaW50IG52ZnMsIGludCBtb2RlKTsKIHZvaWQgbWx4NV9lc3dpdGNoX2Rpc2FibGVfc3Jpb3Yoc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3KTsKQEAgLTIyMywxNCArMjQxLDMyIEBACiAJCQkJIHN0cnVjdCBpZmxhX3ZmX3N0YXRzICp2Zl9zdGF0cyk7CiAKIHN0cnVjdCBtbHg1X2Zsb3dfc3BlYzsKK3N0cnVjdCBtbHg1X2Vzd19mbG93X2F0dHI7CiAKIHN0cnVjdCBtbHg1X2Zsb3dfcnVsZSAqCiBtbHg1X2Vzd2l0Y2hfYWRkX29mZmxvYWRlZF9ydWxlKHN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdywKIAkJCQlzdHJ1Y3QgbWx4NV9mbG93X3NwZWMgKnNwZWMsCi0JCQkJdTMyIGFjdGlvbiwgdTMyIHNyY192cG9ydCwgdTMyIGRzdF92cG9ydCk7CisJCQkJc3RydWN0IG1seDVfZXN3X2Zsb3dfYXR0ciAqYXR0cik7CiBzdHJ1Y3QgbWx4NV9mbG93X3J1bGUgKgogbWx4NV9lc3dpdGNoX2NyZWF0ZV92cG9ydF9yeF9ydWxlKHN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdywgaW50IHZwb3J0LCB1MzIgdGlybik7CiAKK2VudW0geworCVNFVF9WTEFOX1NUUklQCT0gQklUKDApLAorCVNFVF9WTEFOX0lOU0VSVAk9IEJJVCgxKQorfTsKKworI2RlZmluZSBNTFg1X0ZMT1dfQ09OVEVYVF9BQ1RJT05fVkxBTl9QT1AgIDB4NDAKKyNkZWZpbmUgTUxYNV9GTE9XX0NPTlRFWFRfQUNUSU9OX1ZMQU5fUFVTSCAweDgwCisKK3N0cnVjdCBtbHg1X2Vzd19mbG93X2F0dHIgeworCXN0cnVjdCBtbHg1X2Vzd2l0Y2hfcmVwICppbl9yZXA7CisJc3RydWN0IG1seDVfZXN3aXRjaF9yZXAgKm91dF9yZXA7CisKKwlpbnQJYWN0aW9uOworCXUxNgl2bGFuOworCWJvb2wJdmxhbl9oYW5kbGVkOworfTsKKwogaW50IG1seDVfZXN3aXRjaF9zcXMydnBvcnRfc3RhcnQoc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3LAogCQkJCSBzdHJ1Y3QgbWx4NV9lc3dpdGNoX3JlcCAqcmVwLAogCQkJCSB1MTYgKnNxbnNfYXJyYXksIGludCBzcW5zX251bSk7CkBAIC0yNDAsOSArMjc2LDE3IEBACiBpbnQgbWx4NV9kZXZsaW5rX2Vzd2l0Y2hfbW9kZV9zZXQoc3RydWN0IGRldmxpbmsgKmRldmxpbmssIHUxNiBtb2RlKTsKIGludCBtbHg1X2RldmxpbmtfZXN3aXRjaF9tb2RlX2dldChzdHJ1Y3QgZGV2bGluayAqZGV2bGluaywgdTE2ICptb2RlKTsKIHZvaWQgbWx4NV9lc3dpdGNoX3JlZ2lzdGVyX3Zwb3J0X3JlcChzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3csCisJCQkJICAgICBpbnQgdnBvcnRfaW5kZXgsCiAJCQkJICAgICBzdHJ1Y3QgbWx4NV9lc3dpdGNoX3JlcCAqcmVwKTsKIHZvaWQgbWx4NV9lc3dpdGNoX3VucmVnaXN0ZXJfdnBvcnRfcmVwKHN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdywKLQkJCQkgICAgICAgaW50IHZwb3J0KTsKKwkJCQkgICAgICAgaW50IHZwb3J0X2luZGV4KTsKKworaW50IG1seDVfZXN3aXRjaF9hZGRfdmxhbl9hY3Rpb24oc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3LAorCQkJCSBzdHJ1Y3QgbWx4NV9lc3dfZmxvd19hdHRyICphdHRyKTsKK2ludCBtbHg1X2Vzd2l0Y2hfZGVsX3ZsYW5fYWN0aW9uKHN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdywKKwkJCQkgc3RydWN0IG1seDVfZXN3X2Zsb3dfYXR0ciAqYXR0cik7CitpbnQgX19tbHg1X2Vzd2l0Y2hfc2V0X3Zwb3J0X3ZsYW4oc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3LAorCQkJCSAgaW50IHZwb3J0LCB1MTYgdmxhbiwgdTggcW9zLCB1OCBzZXRfZmxhZ3MpOwogCiAjZGVmaW5lIE1MWDVfREVCVUdfRVNXSVRDSF9NQVNLIEJJVCgzKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZXN3aXRjaF9vZmZsb2Fkcy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2Vzd2l0Y2hfb2ZmbG9hZHMuYwppbmRleCBhMzU3ZThlLi5jNTVhZDhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZXN3aXRjaF9vZmZsb2Fkcy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lc3dpdGNoX29mZmxvYWRzLmMKQEAgLTQ2LDE5ICs0NiwyMiBAQAogc3RydWN0IG1seDVfZmxvd19ydWxlICoKIG1seDVfZXN3aXRjaF9hZGRfb2ZmbG9hZGVkX3J1bGUoc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3LAogCQkJCXN0cnVjdCBtbHg1X2Zsb3dfc3BlYyAqc3BlYywKLQkJCQl1MzIgYWN0aW9uLCB1MzIgc3JjX3Zwb3J0LCB1MzIgZHN0X3Zwb3J0KQorCQkJCXN0cnVjdCBtbHg1X2Vzd19mbG93X2F0dHIgKmF0dHIpCiB7CiAJc3RydWN0IG1seDVfZmxvd19kZXN0aW5hdGlvbiBkZXN0ID0geyAwIH07CiAJc3RydWN0IG1seDVfZmMgKmNvdW50ZXIgPSBOVUxMOwogCXN0cnVjdCBtbHg1X2Zsb3dfcnVsZSAqcnVsZTsKIAl2b2lkICptaXNjOworCWludCBhY3Rpb247CiAKIAlpZiAoZXN3LT5tb2RlICE9IFNSSU9WX09GRkxPQURTKQogCQlyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7CiAKKwlhY3Rpb24gPSBhdHRyLT5hY3Rpb247CisKIAlpZiAoYWN0aW9uICYgTUxYNV9GTE9XX0NPTlRFWFRfQUNUSU9OX0ZXRF9ERVNUKSB7CiAJCWRlc3QudHlwZSA9IE1MWDVfRkxPV19ERVNUSU5BVElPTl9UWVBFX1ZQT1JUOwotCQlkZXN0LnZwb3J0X251bSA9IGRzdF92cG9ydDsKKwkJZGVzdC52cG9ydF9udW0gPSBhdHRyLT5vdXRfcmVwLT52cG9ydDsKIAkJYWN0aW9uID0gTUxYNV9GTE9XX0NPTlRFWFRfQUNUSU9OX0ZXRF9ERVNUOwogCX0gZWxzZSBpZiAoYWN0aW9uICYgTUxYNV9GTE9XX0NPTlRFWFRfQUNUSU9OX0NPVU5UKSB7CiAJCWNvdW50ZXIgPSBtbHg1X2ZjX2NyZWF0ZShlc3ctPmRldiwgdHJ1ZSk7CkBAIC02OSw3ICs3Miw3IEBACiAJfQogCiAJbWlzYyA9IE1MWDVfQUREUl9PRihmdGVfbWF0Y2hfcGFyYW0sIHNwZWMtPm1hdGNoX3ZhbHVlLCBtaXNjX3BhcmFtZXRlcnMpOwotCU1MWDVfU0VUKGZ0ZV9tYXRjaF9zZXRfbWlzYywgbWlzYywgc291cmNlX3BvcnQsIHNyY192cG9ydCk7CisJTUxYNV9TRVQoZnRlX21hdGNoX3NldF9taXNjLCBtaXNjLCBzb3VyY2VfcG9ydCwgYXR0ci0+aW5fcmVwLT52cG9ydCk7CiAKIAltaXNjID0gTUxYNV9BRERSX09GKGZ0ZV9tYXRjaF9wYXJhbSwgc3BlYy0+bWF0Y2hfY3JpdGVyaWEsIG1pc2NfcGFyYW1ldGVycyk7CiAJTUxYNV9TRVRfVE9fT05FUyhmdGVfbWF0Y2hfc2V0X21pc2MsIG1pc2MsIHNvdXJjZV9wb3J0KTsKQEAgLTg2LDYgKzg5LDE4NiBAQAogCXJldHVybiBydWxlOwogfQogCitzdGF0aWMgaW50IGVzd19zZXRfZ2xvYmFsX3ZsYW5fcG9wKHN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdywgdTggdmFsKQoreworCXN0cnVjdCBtbHg1X2Vzd2l0Y2hfcmVwICpyZXA7CisJaW50IHZmX3Zwb3J0LCBlcnIgPSAwOworCisJZXN3X2RlYnVnKGVzdy0+ZGV2LCAiJXMgYXBwbHlpbmcgZ2xvYmFsICVzIHBvbGljeVxuIiwgX19mdW5jX18sIHZhbCA/ICJwb3AiIDogIm5vbmUiKTsKKwlmb3IgKHZmX3Zwb3J0ID0gMTsgdmZfdnBvcnQgPCBlc3ctPmVuYWJsZWRfdnBvcnRzOyB2Zl92cG9ydCsrKSB7CisJCXJlcCA9ICZlc3ctPm9mZmxvYWRzLnZwb3J0X3JlcHNbdmZfdnBvcnRdOworCQlpZiAoIXJlcC0+dmFsaWQpCisJCQljb250aW51ZTsKKworCQllcnIgPSBfX21seDVfZXN3aXRjaF9zZXRfdnBvcnRfdmxhbihlc3csIHJlcC0+dnBvcnQsIDAsIDAsIHZhbCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwl9CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IG1seDVfZXN3aXRjaF9yZXAgKgorZXN3X3ZsYW5fYWN0aW9uX2dldF92cG9ydChzdHJ1Y3QgbWx4NV9lc3dfZmxvd19hdHRyICphdHRyLCBib29sIHB1c2gsIGJvb2wgcG9wKQoreworCXN0cnVjdCBtbHg1X2Vzd2l0Y2hfcmVwICppbl9yZXAsICpvdXRfcmVwLCAqdnBvcnQgPSBOVUxMOworCisJaW5fcmVwICA9IGF0dHItPmluX3JlcDsKKwlvdXRfcmVwID0gYXR0ci0+b3V0X3JlcDsKKworCWlmIChwdXNoKQorCQl2cG9ydCA9IGluX3JlcDsKKwllbHNlIGlmIChwb3ApCisJCXZwb3J0ID0gb3V0X3JlcDsKKwllbHNlCisJCXZwb3J0ID0gaW5fcmVwOworCisJcmV0dXJuIHZwb3J0OworfQorCitzdGF0aWMgaW50IGVzd19hZGRfdmxhbl9hY3Rpb25fY2hlY2soc3RydWN0IG1seDVfZXN3X2Zsb3dfYXR0ciAqYXR0ciwKKwkJCQkgICAgIGJvb2wgcHVzaCwgYm9vbCBwb3AsIGJvb2wgZndkKQoreworCXN0cnVjdCBtbHg1X2Vzd2l0Y2hfcmVwICppbl9yZXAsICpvdXRfcmVwOworCisJaWYgKChwdXNoIHx8IHBvcCkgJiYgIWZ3ZCkKKwkJZ290byBvdXRfbm90c3VwcDsKKworCWluX3JlcCAgPSBhdHRyLT5pbl9yZXA7CisJb3V0X3JlcCA9IGF0dHItPm91dF9yZXA7CisKKwlpZiAocHVzaCAmJiBpbl9yZXAtPnZwb3J0ID09IEZEQl9VUExJTktfVlBPUlQpCisJCWdvdG8gb3V0X25vdHN1cHA7CisKKwlpZiAocG9wICYmIG91dF9yZXAtPnZwb3J0ID09IEZEQl9VUExJTktfVlBPUlQpCisJCWdvdG8gb3V0X25vdHN1cHA7CisKKwkvKiB2cG9ydCBoYXMgdmxhbiBwdXNoIGNvbmZpZ3VyZWQsIGNhbid0IG9mZmxvYWQgVkYgLS0+IHdpcmUgcnVsZXMgdy5vIGl0ICovCisJaWYgKCFwdXNoICYmICFwb3AgJiYgZndkKQorCQlpZiAoaW5fcmVwLT52bGFuICYmIG91dF9yZXAtPnZwb3J0ID09IEZEQl9VUExJTktfVlBPUlQpCisJCQlnb3RvIG91dF9ub3RzdXBwOworCisJLyogcHJvdGVjdHMgYWdhaW5zdCAoMSkgc2V0dGluZyBydWxlcyB3aXRoIGRpZmZlcmVudCB2bGFucyB0byBwdXNoIGFuZAorCSAqICgyKSBzZXR0aW5nIHJ1bGVzIHcubyB2bGFucyAoYXR0ci0+dmxhbiA9IDApICYmIHcuIHZsYW5zIHRvIHB1c2ggKCE9IDApCisJICovCisJaWYgKHB1c2ggJiYgaW5fcmVwLT52bGFuX3JlZmNvdW50ICYmIChpbl9yZXAtPnZsYW4gIT0gYXR0ci0+dmxhbikpCisJCWdvdG8gb3V0X25vdHN1cHA7CisKKwlyZXR1cm4gMDsKKworb3V0X25vdHN1cHA6CisJcmV0dXJuIC1FTk9UU1VQUDsKK30KKworaW50IG1seDVfZXN3aXRjaF9hZGRfdmxhbl9hY3Rpb24oc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3LAorCQkJCSBzdHJ1Y3QgbWx4NV9lc3dfZmxvd19hdHRyICphdHRyKQoreworCXN0cnVjdCBvZmZsb2Fkc19mZGIgKm9mZmxvYWRzID0gJmVzdy0+ZmRiX3RhYmxlLm9mZmxvYWRzOworCXN0cnVjdCBtbHg1X2Vzd2l0Y2hfcmVwICp2cG9ydCA9IE5VTEw7CisJYm9vbCBwdXNoLCBwb3AsIGZ3ZDsKKwlpbnQgZXJyID0gMDsKKworCXB1c2ggPSAhIShhdHRyLT5hY3Rpb24gJiBNTFg1X0ZMT1dfQ09OVEVYVF9BQ1RJT05fVkxBTl9QVVNIKTsKKwlwb3AgID0gISEoYXR0ci0+YWN0aW9uICYgTUxYNV9GTE9XX0NPTlRFWFRfQUNUSU9OX1ZMQU5fUE9QKTsKKwlmd2QgID0gISEoYXR0ci0+YWN0aW9uICYgTUxYNV9GTE9XX0NPTlRFWFRfQUNUSU9OX0ZXRF9ERVNUKTsKKworCWVyciA9IGVzd19hZGRfdmxhbl9hY3Rpb25fY2hlY2soYXR0ciwgcHVzaCwgcG9wLCBmd2QpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlhdHRyLT52bGFuX2hhbmRsZWQgPSBmYWxzZTsKKworCXZwb3J0ID0gZXN3X3ZsYW5fYWN0aW9uX2dldF92cG9ydChhdHRyLCBwdXNoLCBwb3ApOworCisJaWYgKCFwdXNoICYmICFwb3AgJiYgZndkKSB7CisJCS8qIHRyYWNrcyBWRiAtLT4gd2lyZSBydWxlcyB3aXRob3V0IHZsYW4gcHVzaCBhY3Rpb24gKi8KKwkJaWYgKGF0dHItPm91dF9yZXAtPnZwb3J0ID09IEZEQl9VUExJTktfVlBPUlQpIHsKKwkJCXZwb3J0LT52bGFuX3JlZmNvdW50Kys7CisJCQlhdHRyLT52bGFuX2hhbmRsZWQgPSB0cnVlOworCQl9CisKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFwdXNoICYmICFwb3ApCisJCXJldHVybiAwOworCisJaWYgKCEob2ZmbG9hZHMtPnZsYW5fcHVzaF9wb3BfcmVmY291bnQpKSB7CisJCS8qIGl0J3MgdGhlIDFzdCB2bGFuIHJ1bGUsIGFwcGx5IGdsb2JhbCB2bGFuIHBvcCBwb2xpY3kgKi8KKwkJZXJyID0gZXN3X3NldF9nbG9iYWxfdmxhbl9wb3AoZXN3LCBTRVRfVkxBTl9TVFJJUCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwl9CisJb2ZmbG9hZHMtPnZsYW5fcHVzaF9wb3BfcmVmY291bnQrKzsKKworCWlmIChwdXNoKSB7CisJCWlmICh2cG9ydC0+dmxhbl9yZWZjb3VudCkKKwkJCWdvdG8gc2tpcF9zZXRfcHVzaDsKKworCQllcnIgPSBfX21seDVfZXN3aXRjaF9zZXRfdnBvcnRfdmxhbihlc3csIHZwb3J0LT52cG9ydCwgYXR0ci0+dmxhbiwgMCwKKwkJCQkJCSAgICBTRVRfVkxBTl9JTlNFUlQgfCBTRVRfVkxBTl9TVFJJUCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwkJdnBvcnQtPnZsYW4gPSBhdHRyLT52bGFuOworc2tpcF9zZXRfcHVzaDoKKwkJdnBvcnQtPnZsYW5fcmVmY291bnQrKzsKKwl9CitvdXQ6CisJaWYgKCFlcnIpCisJCWF0dHItPnZsYW5faGFuZGxlZCA9IHRydWU7CisJcmV0dXJuIGVycjsKK30KKworaW50IG1seDVfZXN3aXRjaF9kZWxfdmxhbl9hY3Rpb24oc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3LAorCQkJCSBzdHJ1Y3QgbWx4NV9lc3dfZmxvd19hdHRyICphdHRyKQoreworCXN0cnVjdCBvZmZsb2Fkc19mZGIgKm9mZmxvYWRzID0gJmVzdy0+ZmRiX3RhYmxlLm9mZmxvYWRzOworCXN0cnVjdCBtbHg1X2Vzd2l0Y2hfcmVwICp2cG9ydCA9IE5VTEw7CisJYm9vbCBwdXNoLCBwb3AsIGZ3ZDsKKwlpbnQgZXJyID0gMDsKKworCWlmICghYXR0ci0+dmxhbl9oYW5kbGVkKQorCQlyZXR1cm4gMDsKKworCXB1c2ggPSAhIShhdHRyLT5hY3Rpb24gJiBNTFg1X0ZMT1dfQ09OVEVYVF9BQ1RJT05fVkxBTl9QVVNIKTsKKwlwb3AgID0gISEoYXR0ci0+YWN0aW9uICYgTUxYNV9GTE9XX0NPTlRFWFRfQUNUSU9OX1ZMQU5fUE9QKTsKKwlmd2QgID0gISEoYXR0ci0+YWN0aW9uICYgTUxYNV9GTE9XX0NPTlRFWFRfQUNUSU9OX0ZXRF9ERVNUKTsKKworCXZwb3J0ID0gZXN3X3ZsYW5fYWN0aW9uX2dldF92cG9ydChhdHRyLCBwdXNoLCBwb3ApOworCisJaWYgKCFwdXNoICYmICFwb3AgJiYgZndkKSB7CisJCS8qIHRyYWNrcyBWRiAtLT4gd2lyZSBydWxlcyB3aXRob3V0IHZsYW4gcHVzaCBhY3Rpb24gKi8KKwkJaWYgKGF0dHItPm91dF9yZXAtPnZwb3J0ID09IEZEQl9VUExJTktfVlBPUlQpCisJCQl2cG9ydC0+dmxhbl9yZWZjb3VudC0tOworCisJCXJldHVybiAwOworCX0KKworCWlmIChwdXNoKSB7CisJCXZwb3J0LT52bGFuX3JlZmNvdW50LS07CisJCWlmICh2cG9ydC0+dmxhbl9yZWZjb3VudCkKKwkJCWdvdG8gc2tpcF91bnNldF9wdXNoOworCisJCXZwb3J0LT52bGFuID0gMDsKKwkJZXJyID0gX19tbHg1X2Vzd2l0Y2hfc2V0X3Zwb3J0X3ZsYW4oZXN3LCB2cG9ydC0+dnBvcnQsCisJCQkJCQkgICAgMCwgMCwgU0VUX1ZMQU5fU1RSSVApOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJfQorCitza2lwX3Vuc2V0X3B1c2g6CisJb2ZmbG9hZHMtPnZsYW5fcHVzaF9wb3BfcmVmY291bnQtLTsKKwlpZiAob2ZmbG9hZHMtPnZsYW5fcHVzaF9wb3BfcmVmY291bnQpCisJCXJldHVybiAwOworCisJLyogbm8gbW9yZSB2bGFuIHJ1bGVzLCBzdG9wIGdsb2JhbCB2bGFuIHBvcCBwb2xpY3kgKi8KKwllcnIgPSBlc3dfc2V0X2dsb2JhbF92bGFuX3BvcChlc3csIDApOworCitvdXQ6CisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIHN0cnVjdCBtbHg1X2Zsb3dfcnVsZSAqCiBtbHg1X2Vzd2l0Y2hfYWRkX3NlbmRfdG9fdnBvcnRfcnVsZShzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3csIGludCB2cG9ydCwgdTMyIHNxbikKIHsKQEAgLTExMyw3ICsyOTYsNyBAQAogCWRlc3QudHlwZSA9IE1MWDVfRkxPV19ERVNUSU5BVElPTl9UWVBFX1ZQT1JUOwogCWRlc3QudnBvcnRfbnVtID0gdnBvcnQ7CiAKLQlmbG93X3J1bGUgPSBtbHg1X2FkZF9mbG93X3J1bGUoZXN3LT5mZGJfdGFibGUuZmRiLCBzcGVjLAorCWZsb3dfcnVsZSA9IG1seDVfYWRkX2Zsb3dfcnVsZShlc3ctPmZkYl90YWJsZS5vZmZsb2Fkcy5mZGIsIHNwZWMsCiAJCQkJICAgICAgIE1MWDVfRkxPV19DT05URVhUX0FDVElPTl9GV0RfREVTVCwKIAkJCQkgICAgICAgMCwgJmRlc3QpOwogCWlmIChJU19FUlIoZmxvd19ydWxlKSkKQEAgLTE0NCwxNiArMzI3LDEyIEBACiB7CiAJc3RydWN0IG1seDVfZmxvd19ydWxlICpmbG93X3J1bGU7CiAJc3RydWN0IG1seDVfZXN3X3NxICplc3dfc3E7Ci0JaW50IHZwb3J0OwogCWludCBlcnI7CiAJaW50IGk7CiAKIAlpZiAoZXN3LT5tb2RlICE9IFNSSU9WX09GRkxPQURTKQogCQlyZXR1cm4gMDsKIAotCXZwb3J0ID0gcmVwLT52cG9ydCA9PSAwID8KLQkJRkRCX1VQTElOS19WUE9SVCA6IHJlcC0+dnBvcnQ7Ci0KIAlmb3IgKGkgPSAwOyBpIDwgc3Fuc19udW07IGkrKykgewogCQllc3dfc3EgPSBremFsbG9jKHNpemVvZigqZXN3X3NxKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghZXN3X3NxKSB7CkBAIC0xNjMsNyArMzQyLDcgQEAKIAogCQkvKiBBZGQgcmUtaW5qZWN0IHJ1bGUgdG8gdGhlIFBGL3JlcHJlc2VudG9yIHNxcyAqLwogCQlmbG93X3J1bGUgPSBtbHg1X2Vzd2l0Y2hfYWRkX3NlbmRfdG9fdnBvcnRfcnVsZShlc3csCi0JCQkJCQkJCXZwb3J0LAorCQkJCQkJCQlyZXAtPnZwb3J0LAogCQkJCQkJCQlzcW5zX2FycmF5W2ldKTsKIAkJaWYgKElTX0VSUihmbG93X3J1bGUpKSB7CiAJCQllcnIgPSBQVFJfRVJSKGZsb3dfcnVsZSk7CkBAIC00NDYsNyArNjI1LDcgQEAKIAogc3RhdGljIGludCBlc3dfb2ZmbG9hZHNfc3RhcnQoc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3KQogewotCWludCBlcnIsIG51bV92ZnMgPSBlc3ctPmRldi0+cHJpdi5zcmlvdi5udW1fdmZzOworCWludCBlcnIsIGVycjEsIG51bV92ZnMgPSBlc3ctPmRldi0+cHJpdi5zcmlvdi5udW1fdmZzOwogCiAJaWYgKGVzdy0+bW9kZSAhPSBTUklPVl9MRUdBQ1kpIHsKIAkJZXN3X3dhcm4oZXN3LT5kZXYsICJDYW4ndCBzZXQgb2ZmbG9hZHMgbW9kZSwgU1JJT1YgbGVnYWN5IG5vdCBlbmFibGVkXG4iKTsKQEAgLTQ1NSw4ICs2MzQsMTIgQEAKIAogCW1seDVfZXN3aXRjaF9kaXNhYmxlX3NyaW92KGVzdyk7CiAJZXJyID0gbWx4NV9lc3dpdGNoX2VuYWJsZV9zcmlvdihlc3csIG51bV92ZnMsIFNSSU9WX09GRkxPQURTKTsKLQlpZiAoZXJyKQotCQllc3dfd2Fybihlc3ctPmRldiwgIkZhaWxlZCBzZXQgZXN3aXRjaCB0byBvZmZsb2FkcywgZXJyICVkXG4iLCBlcnIpOworCWlmIChlcnIpIHsKKwkJZXN3X3dhcm4oZXN3LT5kZXYsICJGYWlsZWQgc2V0dGluZyBlc3dpdGNoIHRvIG9mZmxvYWRzLCBlcnIgJWRcbiIsIGVycik7CisJCWVycjEgPSBtbHg1X2Vzd2l0Y2hfZW5hYmxlX3NyaW92KGVzdywgbnVtX3ZmcywgU1JJT1ZfTEVHQUNZKTsKKwkJaWYgKGVycjEpCisJCQllc3dfd2Fybihlc3ctPmRldiwgIkZhaWxlZCBzZXR0aW5nIGVzd2l0Y2ggYmFjayB0byBsZWdhY3ksIGVyciAlZFxuIiwgZXJyKTsKKwl9CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNTA4LDEyICs2OTEsMTYgQEAKIAogc3RhdGljIGludCBlc3dfb2ZmbG9hZHNfc3RvcChzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3cpCiB7Ci0JaW50IGVyciwgbnVtX3ZmcyA9IGVzdy0+ZGV2LT5wcml2LnNyaW92Lm51bV92ZnM7CisJaW50IGVyciwgZXJyMSwgbnVtX3ZmcyA9IGVzdy0+ZGV2LT5wcml2LnNyaW92Lm51bV92ZnM7CiAKIAltbHg1X2Vzd2l0Y2hfZGlzYWJsZV9zcmlvdihlc3cpOwogCWVyciA9IG1seDVfZXN3aXRjaF9lbmFibGVfc3Jpb3YoZXN3LCBudW1fdmZzLCBTUklPVl9MRUdBQ1kpOwotCWlmIChlcnIpCi0JCWVzd193YXJuKGVzdy0+ZGV2LCAiRmFpbGVkIHNldCBlc3dpdGNoIGxlZ2FjeSBtb2RlLiBlcnIgJWRcbiIsIGVycik7CisJaWYgKGVycikgeworCQllc3dfd2Fybihlc3ctPmRldiwgIkZhaWxlZCBzZXR0aW5nIGVzd2l0Y2ggdG8gbGVnYWN5LCBlcnIgJWRcbiIsIGVycik7CisJCWVycjEgPSBtbHg1X2Vzd2l0Y2hfZW5hYmxlX3NyaW92KGVzdywgbnVtX3ZmcywgU1JJT1ZfT0ZGTE9BRFMpOworCQlpZiAoZXJyMSkKKwkJCWVzd193YXJuKGVzdy0+ZGV2LCAiRmFpbGVkIHNldHRpbmcgZXN3aXRjaCBiYWNrIHRvIG9mZmxvYWRzLCBlcnIgJWRcbiIsIGVycik7CisJfQogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTUzNSw3ICs3MjIsNyBAQAogCWVzd19kZXN0cm95X29mZmxvYWRzX2ZkYl90YWJsZShlc3cpOwogfQogCi1zdGF0aWMgaW50IG1seDVfZXN3X21vZGVfZnJvbV9kZXZsaW5rKHUxNiBtb2RlLCB1MTYgKm1seDVfbW9kZSkKK3N0YXRpYyBpbnQgZXN3X21vZGVfZnJvbV9kZXZsaW5rKHUxNiBtb2RlLCB1MTYgKm1seDVfbW9kZSkKIHsKIAlzd2l0Y2ggKG1vZGUpIHsKIAljYXNlIERFVkxJTktfRVNXSVRDSF9NT0RFX0xFR0FDWToKQEAgLTU1MSw2ICs3MzgsMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBlc3dfbW9kZV90b19kZXZsaW5rKHUxNiBtbHg1X21vZGUsIHUxNiAqbW9kZSkKK3sKKwlzd2l0Y2ggKG1seDVfbW9kZSkgeworCWNhc2UgU1JJT1ZfTEVHQUNZOgorCQkqbW9kZSA9IERFVkxJTktfRVNXSVRDSF9NT0RFX0xFR0FDWTsKKwkJYnJlYWs7CisJY2FzZSBTUklPVl9PRkZMT0FEUzoKKwkJKm1vZGUgPSBERVZMSU5LX0VTV0lUQ0hfTU9ERV9TV0lUQ0hERVY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCiBpbnQgbWx4NV9kZXZsaW5rX2Vzd2l0Y2hfbW9kZV9zZXQoc3RydWN0IGRldmxpbmsgKmRldmxpbmssIHUxNiBtb2RlKQogewogCXN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXY7CkBAIC01NjYsNyArNzY5LDcgQEAKIAlpZiAoY3VyX21seDVfbW9kZSA9PSBTUklPVl9OT05FKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlpZiAobWx4NV9lc3dfbW9kZV9mcm9tX2RldmxpbmsobW9kZSwgJm1seDVfbW9kZSkpCisJaWYgKGVzd19tb2RlX2Zyb21fZGV2bGluayhtb2RlLCAmbWx4NV9tb2RlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoY3VyX21seDVfbW9kZSA9PSBtbHg1X21vZGUpCkBAIC01OTIsMzMgKzc5NSw0MCBAQAogCWlmIChkZXYtPnByaXYuZXN3aXRjaC0+bW9kZSA9PSBTUklPVl9OT05FKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQkqbW9kZSA9IGRldi0+cHJpdi5lc3dpdGNoLT5tb2RlOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGVzd19tb2RlX3RvX2RldmxpbmsoZGV2LT5wcml2LmVzd2l0Y2gtPm1vZGUsIG1vZGUpOwogfQogCiB2b2lkIG1seDVfZXN3aXRjaF9yZWdpc3Rlcl92cG9ydF9yZXAoc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3LAotCQkJCSAgICAgc3RydWN0IG1seDVfZXN3aXRjaF9yZXAgKnJlcCkKLXsKLQlzdHJ1Y3QgbWx4NV9lc3dfb2ZmbG9hZCAqb2ZmbG9hZHMgPSAmZXN3LT5vZmZsb2FkczsKLQotCW1lbWNweSgmb2ZmbG9hZHMtPnZwb3J0X3JlcHNbcmVwLT52cG9ydF0sIHJlcCwKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCBtbHg1X2Vzd2l0Y2hfcmVwKSk7Ci0KLQlJTklUX0xJU1RfSEVBRCgmb2ZmbG9hZHMtPnZwb3J0X3JlcHNbcmVwLT52cG9ydF0udnBvcnRfc3FzX2xpc3QpOwotCW9mZmxvYWRzLT52cG9ydF9yZXBzW3JlcC0+dnBvcnRdLnZhbGlkID0gdHJ1ZTsKLX0KLQotdm9pZCBtbHg1X2Vzd2l0Y2hfdW5yZWdpc3Rlcl92cG9ydF9yZXAoc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3LAotCQkJCSAgICAgICBpbnQgdnBvcnQpCisJCQkJICAgICBpbnQgdnBvcnRfaW5kZXgsCisJCQkJICAgICBzdHJ1Y3QgbWx4NV9lc3dpdGNoX3JlcCAqX19yZXApCiB7CiAJc3RydWN0IG1seDVfZXN3X29mZmxvYWQgKm9mZmxvYWRzID0gJmVzdy0+b2ZmbG9hZHM7CiAJc3RydWN0IG1seDVfZXN3aXRjaF9yZXAgKnJlcDsKIAotCXJlcCA9ICZvZmZsb2Fkcy0+dnBvcnRfcmVwc1t2cG9ydF07CisJcmVwID0gJm9mZmxvYWRzLT52cG9ydF9yZXBzW3Zwb3J0X2luZGV4XTsKIAotCWlmIChlc3ctPm1vZGUgPT0gU1JJT1ZfT0ZGTE9BRFMgJiYgZXN3LT52cG9ydHNbdnBvcnRdLmVuYWJsZWQpCisJbWVtc2V0KHJlcCwgMCwgc2l6ZW9mKCpyZXApKTsKKworCXJlcC0+bG9hZCAgID0gX19yZXAtPmxvYWQ7CisJcmVwLT51bmxvYWQgPSBfX3JlcC0+dW5sb2FkOworCXJlcC0+dnBvcnQgID0gX19yZXAtPnZwb3J0OworCXJlcC0+cHJpdl9kYXRhID0gX19yZXAtPnByaXZfZGF0YTsKKwlldGhlcl9hZGRyX2NvcHkocmVwLT5od19pZCwgX19yZXAtPmh3X2lkKTsKKworCUlOSVRfTElTVF9IRUFEKCZyZXAtPnZwb3J0X3Nxc19saXN0KTsKKwlyZXAtPnZhbGlkID0gdHJ1ZTsKK30KKwordm9pZCBtbHg1X2Vzd2l0Y2hfdW5yZWdpc3Rlcl92cG9ydF9yZXAoc3RydWN0IG1seDVfZXN3aXRjaCAqZXN3LAorCQkJCSAgICAgICBpbnQgdnBvcnRfaW5kZXgpCit7CisJc3RydWN0IG1seDVfZXN3X29mZmxvYWQgKm9mZmxvYWRzID0gJmVzdy0+b2ZmbG9hZHM7CisJc3RydWN0IG1seDVfZXN3aXRjaF9yZXAgKnJlcDsKKworCXJlcCA9ICZvZmZsb2Fkcy0+dnBvcnRfcmVwc1t2cG9ydF9pbmRleF07CisKKwlpZiAoZXN3LT5tb2RlID09IFNSSU9WX09GRkxPQURTICYmIGVzdy0+dnBvcnRzW3Zwb3J0X2luZGV4XS5lbmFibGVkKQogCQlyZXAtPnVubG9hZChlc3csIHJlcCk7CiAKLQlvZmZsb2Fkcy0+dnBvcnRfcmVwc1t2cG9ydF0udmFsaWQgPSBmYWxzZTsKKwlyZXAtPnZhbGlkID0gZmFsc2U7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZnNfY21kLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZnNfY21kLmMKaW5kZXggOTEzNDAxMC4uMTEzYzMyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2ZzX2NtZC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9mc19jbWQuYwpAQCAtNDEsMTAgKzQxLDggQEAKIGludCBtbHg1X2NtZF91cGRhdGVfcm9vdF9mdChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAogCQkJICAgIHN0cnVjdCBtbHg1X2Zsb3dfdGFibGUgKmZ0KQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKHNldF9mbG93X3RhYmxlX3Jvb3RfaW4pXTsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcoc2V0X2Zsb3dfdGFibGVfcm9vdF9vdXQpXTsKLQotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7CisJdTMyIGluW01MWDVfU1RfU1pfRFcoc2V0X2Zsb3dfdGFibGVfcm9vdF9pbildICAgPSB7MH07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKHNldF9mbG93X3RhYmxlX3Jvb3Rfb3V0KV0gPSB7MH07CiAKIAlNTFg1X1NFVChzZXRfZmxvd190YWJsZV9yb290X2luLCBpbiwgb3Bjb2RlLAogCQkgTUxYNV9DTURfT1BfU0VUX0ZMT1dfVEFCTEVfUk9PVCk7CkBAIC01NSwzMCArNTMsMjMgQEAKIAkJTUxYNV9TRVQoc2V0X2Zsb3dfdGFibGVfcm9vdF9pbiwgaW4sIG90aGVyX3Zwb3J0LCAxKTsKIAl9CiAKLQltZW1zZXQob3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0JcmV0dXJuIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwKLQkJCQkJICBzaXplb2Yob3V0KSk7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiAKIGludCBtbHg1X2NtZF9jcmVhdGVfZmxvd190YWJsZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAogCQkJICAgICAgIHUxNiB2cG9ydCwKKwkJCSAgICAgICBlbnVtIGZzX2Zsb3dfdGFibGVfb3BfbW9kIG9wX21vZCwKIAkJCSAgICAgICBlbnVtIGZzX2Zsb3dfdGFibGVfdHlwZSB0eXBlLCB1bnNpZ25lZCBpbnQgbGV2ZWwsCiAJCQkgICAgICAgdW5zaWduZWQgaW50IGxvZ19zaXplLCBzdHJ1Y3QgbWx4NV9mbG93X3RhYmxlCiAJCQkgICAgICAgKm5leHRfZnQsIHVuc2lnbmVkIGludCAqdGFibGVfaWQpCiB7Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKGNyZWF0ZV9mbG93X3RhYmxlX291dCldOwotCXUzMiBpbltNTFg1X1NUX1NaX0RXKGNyZWF0ZV9mbG93X3RhYmxlX2luKV07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGNyZWF0ZV9mbG93X3RhYmxlX291dCldID0gezB9OworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGNyZWF0ZV9mbG93X3RhYmxlX2luKV0gICA9IHswfTsKIAlpbnQgZXJyOwogCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKLQogCU1MWDVfU0VUKGNyZWF0ZV9mbG93X3RhYmxlX2luLCBpbiwgb3Bjb2RlLAogCQkgTUxYNV9DTURfT1BfQ1JFQVRFX0ZMT1dfVEFCTEUpOwogCi0JaWYgKG5leHRfZnQpIHsKLQkJTUxYNV9TRVQoY3JlYXRlX2Zsb3dfdGFibGVfaW4sIGluLCB0YWJsZV9taXNzX21vZGUsIDEpOwotCQlNTFg1X1NFVChjcmVhdGVfZmxvd190YWJsZV9pbiwgaW4sIHRhYmxlX21pc3NfaWQsIG5leHRfZnQtPmlkKTsKLQl9CiAJTUxYNV9TRVQoY3JlYXRlX2Zsb3dfdGFibGVfaW4sIGluLCB0YWJsZV90eXBlLCB0eXBlKTsKIAlNTFg1X1NFVChjcmVhdGVfZmxvd190YWJsZV9pbiwgaW4sIGxldmVsLCBsZXZlbCk7CiAJTUxYNV9TRVQoY3JlYXRlX2Zsb3dfdGFibGVfaW4sIGluLCBsb2dfc2l6ZSwgbG9nX3NpemUpOwpAQCAtODcsMTAgKzc4LDIzIEBACiAJCU1MWDVfU0VUKGNyZWF0ZV9mbG93X3RhYmxlX2luLCBpbiwgb3RoZXJfdnBvcnQsIDEpOwogCX0KIAotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsCi0JCQkJCSBzaXplb2Yob3V0KSk7CisJc3dpdGNoIChvcF9tb2QpIHsKKwljYXNlIEZTX0ZUX09QX01PRF9OT1JNQUw6CisJCWlmIChuZXh0X2Z0KSB7CisJCQlNTFg1X1NFVChjcmVhdGVfZmxvd190YWJsZV9pbiwgaW4sIHRhYmxlX21pc3NfbW9kZSwgMSk7CisJCQlNTFg1X1NFVChjcmVhdGVfZmxvd190YWJsZV9pbiwgaW4sIHRhYmxlX21pc3NfaWQsIG5leHRfZnQtPmlkKTsKKwkJfQorCQlicmVhazsKIAorCWNhc2UgRlNfRlRfT1BfTU9EX0xBR19ERU1VWDoKKwkJTUxYNV9TRVQoY3JlYXRlX2Zsb3dfdGFibGVfaW4sIGluLCBvcF9tb2QsIDB4MSk7CisJCWlmIChuZXh0X2Z0KQorCQkJTUxYNV9TRVQoY3JlYXRlX2Zsb3dfdGFibGVfaW4sIGluLCBsYWdfbWFzdGVyX25leHRfdGFibGVfaWQsCisJCQkJIG5leHRfZnQtPmlkKTsKKwkJYnJlYWs7CisJfQorCisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKIAlpZiAoIWVycikKIAkJKnRhYmxlX2lkID0gTUxYNV9HRVQoY3JlYXRlX2Zsb3dfdGFibGVfb3V0LCBvdXQsCiAJCQkJICAgICB0YWJsZV9pZCk7CkBAIC0xMDAsMTEgKzEwNCw4IEBACiBpbnQgbWx4NV9jbWRfZGVzdHJveV9mbG93X3RhYmxlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCiAJCQkJc3RydWN0IG1seDVfZmxvd190YWJsZSAqZnQpCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcoZGVzdHJveV9mbG93X3RhYmxlX2luKV07Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfZmxvd190YWJsZV9vdXQpXTsKLQotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfZmxvd190YWJsZV9pbildICAgPSB7MH07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfZmxvd190YWJsZV9vdXQpXSA9IHswfTsKIAogCU1MWDVfU0VUKGRlc3Ryb3lfZmxvd190YWJsZV9pbiwgaW4sIG9wY29kZSwKIAkJIE1MWDVfQ01EX09QX0RFU1RST1lfRkxPV19UQUJMRSk7CkBAIC0xMTUsMzkgKzExNiw0OSBAQAogCQlNTFg1X1NFVChkZXN0cm95X2Zsb3dfdGFibGVfaW4sIGluLCBvdGhlcl92cG9ydCwgMSk7CiAJfQogCi0JcmV0dXJuIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwKLQkJCQkJICBzaXplb2Yob3V0KSk7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiAKIGludCBtbHg1X2NtZF9tb2RpZnlfZmxvd190YWJsZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAogCQkJICAgICAgIHN0cnVjdCBtbHg1X2Zsb3dfdGFibGUgKmZ0LAogCQkJICAgICAgIHN0cnVjdCBtbHg1X2Zsb3dfdGFibGUgKm5leHRfZnQpCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcobW9kaWZ5X2Zsb3dfdGFibGVfaW4pXTsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcobW9kaWZ5X2Zsb3dfdGFibGVfb3V0KV07Ci0KLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhtb2RpZnlfZmxvd190YWJsZV9pbildICAgPSB7MH07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKG1vZGlmeV9mbG93X3RhYmxlX291dCldID0gezB9OwogCiAJTUxYNV9TRVQobW9kaWZ5X2Zsb3dfdGFibGVfaW4sIGluLCBvcGNvZGUsCiAJCSBNTFg1X0NNRF9PUF9NT0RJRllfRkxPV19UQUJMRSk7CiAJTUxYNV9TRVQobW9kaWZ5X2Zsb3dfdGFibGVfaW4sIGluLCB0YWJsZV90eXBlLCBmdC0+dHlwZSk7CiAJTUxYNV9TRVQobW9kaWZ5X2Zsb3dfdGFibGVfaW4sIGluLCB0YWJsZV9pZCwgZnQtPmlkKTsKLQlpZiAoZnQtPnZwb3J0KSB7Ci0JCU1MWDVfU0VUKG1vZGlmeV9mbG93X3RhYmxlX2luLCBpbiwgdnBvcnRfbnVtYmVyLCBmdC0+dnBvcnQpOwotCQlNTFg1X1NFVChtb2RpZnlfZmxvd190YWJsZV9pbiwgaW4sIG90aGVyX3Zwb3J0LCAxKTsKLQl9Ci0JTUxYNV9TRVQobW9kaWZ5X2Zsb3dfdGFibGVfaW4sIGluLCBtb2RpZnlfZmllbGRfc2VsZWN0LAotCQkgTUxYNV9NT0RJRllfRkxPV19UQUJMRV9NSVNTX1RBQkxFX0lEKTsKLQlpZiAobmV4dF9mdCkgewotCQlNTFg1X1NFVChtb2RpZnlfZmxvd190YWJsZV9pbiwgaW4sIHRhYmxlX21pc3NfbW9kZSwgMSk7Ci0JCU1MWDVfU0VUKG1vZGlmeV9mbG93X3RhYmxlX2luLCBpbiwgdGFibGVfbWlzc19pZCwgbmV4dF9mdC0+aWQpOworCisJaWYgKGZ0LT5vcF9tb2QgPT0gRlNfRlRfT1BfTU9EX0xBR19ERU1VWCkgeworCQlNTFg1X1NFVChtb2RpZnlfZmxvd190YWJsZV9pbiwgaW4sIG1vZGlmeV9maWVsZF9zZWxlY3QsCisJCQkgTUxYNV9NT0RJRllfRkxPV19UQUJMRV9MQUdfTkVYVF9UQUJMRV9JRCk7CisJCWlmIChuZXh0X2Z0KSB7CisJCQlNTFg1X1NFVChtb2RpZnlfZmxvd190YWJsZV9pbiwgaW4sCisJCQkJIGxhZ19tYXN0ZXJfbmV4dF90YWJsZV9pZCwgbmV4dF9mdC0+aWQpOworCQl9IGVsc2UgeworCQkJTUxYNV9TRVQobW9kaWZ5X2Zsb3dfdGFibGVfaW4sIGluLAorCQkJCSBsYWdfbWFzdGVyX25leHRfdGFibGVfaWQsIDApOworCQl9CiAJfSBlbHNlIHsKLQkJTUxYNV9TRVQobW9kaWZ5X2Zsb3dfdGFibGVfaW4sIGluLCB0YWJsZV9taXNzX21vZGUsIDApOworCQlpZiAoZnQtPnZwb3J0KSB7CisJCQlNTFg1X1NFVChtb2RpZnlfZmxvd190YWJsZV9pbiwgaW4sIHZwb3J0X251bWJlciwKKwkJCQkgZnQtPnZwb3J0KTsKKwkJCU1MWDVfU0VUKG1vZGlmeV9mbG93X3RhYmxlX2luLCBpbiwgb3RoZXJfdnBvcnQsIDEpOworCQl9CisJCU1MWDVfU0VUKG1vZGlmeV9mbG93X3RhYmxlX2luLCBpbiwgbW9kaWZ5X2ZpZWxkX3NlbGVjdCwKKwkJCSBNTFg1X01PRElGWV9GTE9XX1RBQkxFX01JU1NfVEFCTEVfSUQpOworCQlpZiAobmV4dF9mdCkgeworCQkJTUxYNV9TRVQobW9kaWZ5X2Zsb3dfdGFibGVfaW4sIGluLCB0YWJsZV9taXNzX21vZGUsIDEpOworCQkJTUxYNV9TRVQobW9kaWZ5X2Zsb3dfdGFibGVfaW4sIGluLCB0YWJsZV9taXNzX2lkLAorCQkJCSBuZXh0X2Z0LT5pZCk7CisJCX0gZWxzZSB7CisJCQlNTFg1X1NFVChtb2RpZnlfZmxvd190YWJsZV9pbiwgaW4sIHRhYmxlX21pc3NfbW9kZSwgMCk7CisJCX0KIAl9CiAKLQlyZXR1cm4gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LAotCQkJCQkgIHNpemVvZihvdXQpKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKIH0KIAogaW50IG1seDVfY21kX2NyZWF0ZV9mbG93X2dyb3VwKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCkBAIC0xNTUsMTIgKzE2NiwxMCBAQAogCQkJICAgICAgIHUzMiAqaW4sCiAJCQkgICAgICAgdW5zaWduZWQgaW50ICpncm91cF9pZCkKIHsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoY3JlYXRlX2Zsb3dfZ3JvdXBfb3V0KV0gPSB7MH07CiAJaW50IGlubGVuID0gTUxYNV9TVF9TWl9CWVRFUyhjcmVhdGVfZmxvd19ncm91cF9pbik7Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKGNyZWF0ZV9mbG93X2dyb3VwX291dCldOwogCWludCBlcnI7CiAKLQltZW1zZXQob3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0KIAlNTFg1X1NFVChjcmVhdGVfZmxvd19ncm91cF9pbiwgaW4sIG9wY29kZSwKIAkJIE1MWDVfQ01EX09QX0NSRUFURV9GTE9XX0dST1VQKTsKIAlNTFg1X1NFVChjcmVhdGVfZmxvd19ncm91cF9pbiwgaW4sIHRhYmxlX3R5cGUsIGZ0LT50eXBlKTsKQEAgLTE3MCwxMyArMTc5LDEwIEBACiAJCU1MWDVfU0VUKGNyZWF0ZV9mbG93X2dyb3VwX2luLCBpbiwgb3RoZXJfdnBvcnQsIDEpOwogCX0KIAotCWVyciA9IG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sCi0JCQkJCSBpbmxlbiwgb3V0LAotCQkJCQkgc2l6ZW9mKG91dCkpOworCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgaW5sZW4sIG91dCwgc2l6ZW9mKG91dCkpOwogCWlmICghZXJyKQogCQkqZ3JvdXBfaWQgPSBNTFg1X0dFVChjcmVhdGVfZmxvd19ncm91cF9vdXQsIG91dCwKIAkJCQkgICAgIGdyb3VwX2lkKTsKLQogCXJldHVybiBlcnI7CiB9CiAKQEAgLTE4NCwxMSArMTkwLDggQEAKIAkJCQlzdHJ1Y3QgbWx4NV9mbG93X3RhYmxlICpmdCwKIAkJCQl1bnNpZ25lZCBpbnQgZ3JvdXBfaWQpCiB7Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfZmxvd19ncm91cF9vdXQpXTsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhkZXN0cm95X2Zsb3dfZ3JvdXBfaW4pXTsKLQotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZXN0cm95X2Zsb3dfZ3JvdXBfb3V0KV0gPSB7MH07CisJdTMyIGluW01MWDVfU1RfU1pfRFcoZGVzdHJveV9mbG93X2dyb3VwX2luKV0gICA9IHswfTsKIAogCU1MWDVfU0VUKGRlc3Ryb3lfZmxvd19ncm91cF9pbiwgaW4sIG9wY29kZSwKIAkJIE1MWDVfQ01EX09QX0RFU1RST1lfRkxPV19HUk9VUCk7CkBAIC0yMDAsOCArMjAzLDcgQEAKIAkJTUxYNV9TRVQoZGVzdHJveV9mbG93X2dyb3VwX2luLCBpbiwgb3RoZXJfdnBvcnQsIDEpOwogCX0KIAotCXJldHVybiBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsCi0JCQkJCSAgc2l6ZW9mKG91dCkpOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQogCiBzdGF0aWMgaW50IG1seDVfY21kX3NldF9mdGUoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKQEAgLTIxMiw3ICsyMTQsNyBAQAogewogCXVuc2lnbmVkIGludCBpbmxlbiA9IE1MWDVfU1RfU1pfQllURVMoc2V0X2Z0ZV9pbikgKwogCQlmdGUtPmRlc3RzX3NpemUgKiBNTFg1X1NUX1NaX0JZVEVTKGRlc3RfZm9ybWF0X3N0cnVjdCk7Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKHNldF9mdGVfb3V0KV07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKHNldF9mdGVfb3V0KV0gPSB7MH07CiAJc3RydWN0IG1seDVfZmxvd19ydWxlICpkc3Q7CiAJdm9pZCAqaW5fZmxvd19jb250ZXh0OwogCXZvaWQgKmluX21hdGNoX3ZhbHVlOwpAQCAtMjkwLDExICsyOTIsOCBAQAogCQkJIGxpc3Rfc2l6ZSk7CiAJfQogCi0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOwotCWVyciA9IG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIGlubGVuLCBvdXQsCi0JCQkJCSBzaXplb2Yob3V0KSk7CisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CiAJa3ZmcmVlKGluKTsKLQogCXJldHVybiBlcnI7CiB9CiAKQEAgLTMwMyw3ICszMDIsNyBAQAogCQkJdW5zaWduZWQgZ3JvdXBfaWQsCiAJCQlzdHJ1Y3QgZnNfZnRlICpmdGUpCiB7Ci0JcmV0dXJuCW1seDVfY21kX3NldF9mdGUoZGV2LCAwLCAwLCBmdCwgZ3JvdXBfaWQsIGZ0ZSk7CisJcmV0dXJuIG1seDVfY21kX3NldF9mdGUoZGV2LCAwLCAwLCBmdCwgZ3JvdXBfaWQsIGZ0ZSk7CiB9CiAKIGludCBtbHg1X2NtZF91cGRhdGVfZnRlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCkBAIC0zMjcsMTIgKzMyNiw4IEBACiAJCQlzdHJ1Y3QgbWx4NV9mbG93X3RhYmxlICpmdCwKIAkJCXVuc2lnbmVkIGludCBpbmRleCkKIHsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcoZGVsZXRlX2Z0ZV9vdXQpXTsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhkZWxldGVfZnRlX2luKV07Ci0JaW50IGVycjsKLQotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZWxldGVfZnRlX291dCldID0gezB9OworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlbGV0ZV9mdGVfaW4pXSAgID0gezB9OwogCiAJTUxYNV9TRVQoZGVsZXRlX2Z0ZV9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfREVMRVRFX0ZMT1dfVEFCTEVfRU5UUlkpOwogCU1MWDVfU0VUKGRlbGV0ZV9mdGVfaW4sIGluLCB0YWJsZV90eXBlLCBmdC0+dHlwZSk7CkBAIC0zNDMsNzQgKzMzOCw1NSBAQAogCQlNTFg1X1NFVChkZWxldGVfZnRlX2luLCBpbiwgb3RoZXJfdnBvcnQsIDEpOwogCX0KIAotCWVyciA9ICBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKLQotCXJldHVybiBlcnI7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiAKIGludCBtbHg1X2NtZF9mY19hbGxvYyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MTYgKmlkKQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKGFsbG9jX2Zsb3dfY291bnRlcl9pbildOwotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhhbGxvY19mbG93X2NvdW50ZXJfb3V0KV07CisJdTMyIGluW01MWDVfU1RfU1pfRFcoYWxsb2NfZmxvd19jb3VudGVyX2luKV0gICA9IHswfTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoYWxsb2NfZmxvd19jb3VudGVyX291dCldID0gezB9OwogCWludCBlcnI7CiAKLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKLQogCU1MWDVfU0VUKGFsbG9jX2Zsb3dfY291bnRlcl9pbiwgaW4sIG9wY29kZSwKIAkJIE1MWDVfQ01EX09QX0FMTE9DX0ZMT1dfQ09VTlRFUik7CiAKLQllcnIgPSBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsCi0JCQkJCSBzaXplb2Yob3V0KSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCSppZCA9IE1MWDVfR0VUKGFsbG9jX2Zsb3dfY291bnRlcl9vdXQsIG91dCwgZmxvd19jb3VudGVyX2lkKTsKLQotCXJldHVybiAwOworCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CisJaWYgKCFlcnIpCisJCSppZCA9IE1MWDVfR0VUKGFsbG9jX2Zsb3dfY291bnRlcl9vdXQsIG91dCwgZmxvd19jb3VudGVyX2lkKTsKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgbWx4NV9jbWRfZmNfZnJlZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MTYgaWQpCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcoZGVhbGxvY19mbG93X2NvdW50ZXJfaW4pXTsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcoZGVhbGxvY19mbG93X2NvdW50ZXJfb3V0KV07Ci0KLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhkZWFsbG9jX2Zsb3dfY291bnRlcl9pbildICAgPSB7MH07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlYWxsb2NfZmxvd19jb3VudGVyX291dCldID0gezB9OwogCiAJTUxYNV9TRVQoZGVhbGxvY19mbG93X2NvdW50ZXJfaW4sIGluLCBvcGNvZGUsCiAJCSBNTFg1X0NNRF9PUF9ERUFMTE9DX0ZMT1dfQ09VTlRFUik7CiAJTUxYNV9TRVQoZGVhbGxvY19mbG93X2NvdW50ZXJfaW4sIGluLCBmbG93X2NvdW50ZXJfaWQsIGlkKTsKLQotCXJldHVybiBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsCi0JCQkJCSAgc2l6ZW9mKG91dCkpOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQogCiBpbnQgbWx4NV9jbWRfZmNfcXVlcnkoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTE2IGlkLAogCQkgICAgICB1NjQgKnBhY2tldHMsIHU2NCAqYnl0ZXMpCiB7CiAJdTMyIG91dFtNTFg1X1NUX1NaX0JZVEVTKHF1ZXJ5X2Zsb3dfY291bnRlcl9vdXQpICsKLQkJTUxYNV9TVF9TWl9CWVRFUyh0cmFmZmljX2NvdW50ZXIpXTsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhxdWVyeV9mbG93X2NvdW50ZXJfaW4pXTsKKwkJTUxYNV9TVF9TWl9CWVRFUyh0cmFmZmljX2NvdW50ZXIpXSAgID0gezB9OworCXUzMiBpbltNTFg1X1NUX1NaX0RXKHF1ZXJ5X2Zsb3dfY291bnRlcl9pbildID0gezB9OwogCXZvaWQgKnN0YXRzOwogCWludCBlcnIgPSAwOwogCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKLQltZW1zZXQob3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0KIAlNTFg1X1NFVChxdWVyeV9mbG93X2NvdW50ZXJfaW4sIGluLCBvcGNvZGUsCiAJCSBNTFg1X0NNRF9PUF9RVUVSWV9GTE9XX0NPVU5URVIpOwogCU1MWDVfU0VUKHF1ZXJ5X2Zsb3dfY291bnRlcl9pbiwgaW4sIG9wX21vZCwgMCk7CiAJTUxYNV9TRVQocXVlcnlfZmxvd19jb3VudGVyX2luLCBpbiwgZmxvd19jb3VudGVyX2lkLCBpZCk7Ci0KLQllcnIgPSBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKKwllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKIAlzdGF0cyA9IE1MWDVfQUREUl9PRihxdWVyeV9mbG93X2NvdW50ZXJfb3V0LCBvdXQsIGZsb3dfc3RhdGlzdGljcyk7CiAJKnBhY2tldHMgPSBNTFg1X0dFVDY0KHRyYWZmaWNfY291bnRlciwgc3RhdHMsIHBhY2tldHMpOwogCSpieXRlcyA9IE1MWDVfR0VUNjQodHJhZmZpY19jb3VudGVyLCBzdGF0cywgb2N0ZXRzKTsKLQogCXJldHVybiAwOwogfQogCkBAIC00MjUsMTEgKzQwMSwxMSBAQAogbWx4NV9jbWRfZmNfYnVsa19hbGxvYyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MTYgaWQsIGludCBudW0pCiB7CiAJc3RydWN0IG1seDVfY21kX2ZjX2J1bGsgKmI7Ci0JaW50IG91dGxlbiA9IHNpemVvZigqYikgKworCWludCBvdXRsZW4gPQogCQlNTFg1X1NUX1NaX0JZVEVTKHF1ZXJ5X2Zsb3dfY291bnRlcl9vdXQpICsKIAkJTUxYNV9TVF9TWl9CWVRFUyh0cmFmZmljX2NvdW50ZXIpICogbnVtOwogCi0JYiA9IGt6YWxsb2Mob3V0bGVuLCBHRlBfS0VSTkVMKTsKKwliID0ga3phbGxvYyhzaXplb2YoKmIpICsgb3V0bGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWIpCiAJCXJldHVybiBOVUxMOwogCkBAIC00NDgsMTggKzQyNCwxNCBAQAogaW50CiBtbHg1X2NtZF9mY19idWxrX3F1ZXJ5KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X2NtZF9mY19idWxrICpiKQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKHF1ZXJ5X2Zsb3dfY291bnRlcl9pbildOwotCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhxdWVyeV9mbG93X2NvdW50ZXJfaW4pXSA9IHswfTsKIAogCU1MWDVfU0VUKHF1ZXJ5X2Zsb3dfY291bnRlcl9pbiwgaW4sIG9wY29kZSwKIAkJIE1MWDVfQ01EX09QX1FVRVJZX0ZMT1dfQ09VTlRFUik7CiAJTUxYNV9TRVQocXVlcnlfZmxvd19jb3VudGVyX2luLCBpbiwgb3BfbW9kLCAwKTsKIAlNTFg1X1NFVChxdWVyeV9mbG93X2NvdW50ZXJfaW4sIGluLCBmbG93X2NvdW50ZXJfaWQsIGItPmlkKTsKIAlNTFg1X1NFVChxdWVyeV9mbG93X2NvdW50ZXJfaW4sIGluLCBudW1fb2ZfY291bnRlcnMsIGItPm51bSk7Ci0KLQlyZXR1cm4gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBpbiwgc2l6ZW9mKGluKSwKLQkJCQkJICBiLT5vdXQsIGItPm91dGxlbik7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgYi0+b3V0LCBiLT5vdXRsZW4pOwogfQogCiB2b2lkIG1seDVfY21kX2ZjX2J1bGtfZ2V0KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCkBAIC00ODAsMyArNDUyLDUxIEBACiAJKnBhY2tldHMgPSBNTFg1X0dFVDY0KHRyYWZmaWNfY291bnRlciwgc3RhdHMsIHBhY2tldHMpOwogCSpieXRlcyA9IE1MWDVfR0VUNjQodHJhZmZpY19jb3VudGVyLCBzdGF0cywgb2N0ZXRzKTsKIH0KKworI2RlZmluZSBNQVhfRU5DQVBfU0laRSAoMTI4KQorCitpbnQgbWx4NV9jbWRfYWxsb2NfZW5jYXAoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKKwkJCSBpbnQgaGVhZGVyX3R5cGUsCisJCQkgc2l6ZV90IHNpemUsCisJCQkgdm9pZCAqZW5jYXBfaGVhZGVyLAorCQkJIHUzMiAqZW5jYXBfaWQpCit7CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGFsbG9jX2VuY2FwX2hlYWRlcl9vdXQpXTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhhbGxvY19lbmNhcF9oZWFkZXJfaW4pICsKKwkgICAgICAoTUFYX0VOQ0FQX1NJWkUgLyBzaXplb2YodTMyKSldOworCXZvaWQgKmVuY2FwX2hlYWRlcl9pbiA9IE1MWDVfQUREUl9PRihhbGxvY19lbmNhcF9oZWFkZXJfaW4sIGluLAorCQkJCQkgICAgIGVuY2FwX2hlYWRlcik7CisJdm9pZCAqaGVhZGVyID0gTUxYNV9BRERSX09GKGVuY2FwX2hlYWRlcl9pbiwgZW5jYXBfaGVhZGVyX2luLAorCQkJCSAgICBlbmNhcF9oZWFkZXIpOworCWludCBpbmxlbiA9IGhlYWRlciAtICh2b2lkICopaW4gICsgc2l6ZTsKKwlpbnQgZXJyOworCisJaWYgKHNpemUgPiBNQVhfRU5DQVBfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQoaW4sIDAsIGlubGVuKTsKKwlNTFg1X1NFVChhbGxvY19lbmNhcF9oZWFkZXJfaW4sIGluLCBvcGNvZGUsCisJCSBNTFg1X0NNRF9PUF9BTExPQ19FTkNBUF9IRUFERVIpOworCU1MWDVfU0VUKGVuY2FwX2hlYWRlcl9pbiwgZW5jYXBfaGVhZGVyX2luLCBlbmNhcF9oZWFkZXJfc2l6ZSwgc2l6ZSk7CisJTUxYNV9TRVQoZW5jYXBfaGVhZGVyX2luLCBlbmNhcF9oZWFkZXJfaW4sIGhlYWRlcl90eXBlLCBoZWFkZXJfdHlwZSk7CisJbWVtY3B5KGhlYWRlciwgZW5jYXBfaGVhZGVyLCBzaXplKTsKKworCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKKwllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIGlubGVuLCBvdXQsIHNpemVvZihvdXQpKTsKKworCSplbmNhcF9pZCA9IE1MWDVfR0VUKGFsbG9jX2VuY2FwX2hlYWRlcl9vdXQsIG91dCwgZW5jYXBfaWQpOworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgbWx4NV9jbWRfZGVhbGxvY19lbmNhcChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgZW5jYXBfaWQpCit7CisJdTMyIGluW01MWDVfU1RfU1pfRFcoZGVhbGxvY19lbmNhcF9oZWFkZXJfaW4pXTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoZGVhbGxvY19lbmNhcF9oZWFkZXJfb3V0KV07CisKKwltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOworCU1MWDVfU0VUKGRlYWxsb2NfZW5jYXBfaGVhZGVyX2luLCBpbiwgb3Bjb2RlLAorCQkgTUxYNV9DTURfT1BfREVBTExPQ19FTkNBUF9IRUFERVIpOworCU1MWDVfU0VUKGRlYWxsb2NfZW5jYXBfaGVhZGVyX2luLCBpbiwgZW5jYXBfaWQsIGVuY2FwX2lkKTsKKworCW1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZnNfY21kLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZnNfY21kLmgKaW5kZXggMTU4ODQ0Yy4uYzViYzQ2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2ZzX2NtZC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9mc19jbWQuaApAQCAtMzUsNiArMzUsNyBAQAogCiBpbnQgbWx4NV9jbWRfY3JlYXRlX2Zsb3dfdGFibGUoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKIAkJCSAgICAgICB1MTYgdnBvcnQsCisJCQkgICAgICAgZW51bSBmc19mbG93X3RhYmxlX29wX21vZCBvcF9tb2QsCiAJCQkgICAgICAgZW51bSBmc19mbG93X3RhYmxlX3R5cGUgdHlwZSwgdW5zaWduZWQgaW50IGxldmVsLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBsb2dfc2l6ZSwgc3RydWN0IG1seDVfZmxvd190YWJsZQogCQkJICAgICAgICpuZXh0X2Z0LCB1bnNpZ25lZCBpbnQgKnRhYmxlX2lkKTsKQEAgLTg4LDQgKzg5LDExIEBACiAJCQkgIHN0cnVjdCBtbHg1X2NtZF9mY19idWxrICpiLCB1MTYgaWQsCiAJCQkgIHU2NCAqcGFja2V0cywgdTY0ICpieXRlcyk7CiAKK2ludCBtbHg1X2NtZF9hbGxvY19lbmNhcChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAorCQkJIGludCBoZWFkZXJfdHlwZSwKKwkJCSBzaXplX3Qgc2l6ZSwKKwkJCSB2b2lkICplbmNhcF9oZWFkZXIsCisJCQkgdTMyICplbmNhcF9pZCk7Cit2b2lkIG1seDVfY21kX2RlYWxsb2NfZW5jYXAoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyIGVuY2FwX2lkKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZnNfY29yZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2ZzX2NvcmUuYwppbmRleCA3NWJiOGM4Li41ZGEyY2M4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZnNfY29yZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9mc19jb3JlLmMKQEAgLTgwLDcgKzgwLDcgQEAKIAkJCSAgIExFRlRPVkVSU19OVU1fUFJJT1MpCiAKICNkZWZpbmUgRVRIVE9PTF9QUklPX05VTV9MRVZFTFMgMQotI2RlZmluZSBFVEhUT09MX05VTV9QUklPUyAxMAorI2RlZmluZSBFVEhUT09MX05VTV9QUklPUyAxMQogI2RlZmluZSBFVEhUT09MX01JTl9MRVZFTCAoS0VSTkVMX01JTl9MRVZFTCArIEVUSFRPT0xfTlVNX1BSSU9TKQogLyogVmxhbiwgbWFjLCB0dGMsIGFSRlMgKi8KICNkZWZpbmUgS0VSTkVMX05JQ19QUklPX05VTV9MRVZFTFMgNApAQCAtOTYsNiArOTYsMTAgQEAKICNkZWZpbmUgT0ZGTE9BRFNfTlVNX1BSSU9TIDEKICNkZWZpbmUgT0ZGTE9BRFNfTUlOX0xFVkVMIChBTkNIT1JfTUlOX0xFVkVMICsgMSkKIAorI2RlZmluZSBMQUdfUFJJT19OVU1fTEVWRUxTIDEKKyNkZWZpbmUgTEFHX05VTV9QUklPUyAxCisjZGVmaW5lIExBR19NSU5fTEVWRUwgKE9GRkxPQURTX01JTl9MRVZFTCArIDEpCisKIHN0cnVjdCBub2RlX2NhcHMgewogCXNpemVfdAlhcnJfc3o7CiAJbG9uZwkqY2FwczsKQEAgLTExMSwxMiArMTE1LDE2IEBACiAJaW50IG51bV9sZXZlbHM7CiB9IHJvb3RfZnMgPSB7CiAJLnR5cGUgPSBGU19UWVBFX05BTUVTUEFDRSwKLQkuYXJfc2l6ZSA9IDYsCisJLmFyX3NpemUgPSA3LAogCS5jaGlsZHJlbiA9IChzdHJ1Y3QgaW5pdF90cmVlX25vZGVbXSkgewogCQlBRERfUFJJTygwLCBCWV9QQVNTX01JTl9MRVZFTCwgMCwKIAkJCSBGU19DSEFJTklOR19DQVBTLAogCQkJIEFERF9OUyhBRERfTVVMVElQTEVfUFJJTyhNTFg1X0JZX1BBU1NfTlVNX1BSSU9TLAogCQkJCQkJICBCWV9QQVNTX1BSSU9fTlVNX0xFVkVMUykpKSwKKwkJQUREX1BSSU8oMCwgTEFHX01JTl9MRVZFTCwgMCwKKwkJCSBGU19DSEFJTklOR19DQVBTLAorCQkJIEFERF9OUyhBRERfTVVMVElQTEVfUFJJTyhMQUdfTlVNX1BSSU9TLAorCQkJCQkJICBMQUdfUFJJT19OVU1fTEVWRUxTKSkpLAogCQlBRERfUFJJTygwLCBPRkZMT0FEU19NSU5fTEVWRUwsIDAsIHt9LAogCQkJIEFERF9OUyhBRERfTVVMVElQTEVfUFJJTyhPRkZMT0FEU19OVU1fUFJJT1MsIE9GRkxPQURTX01BWF9GVCkpKSwKIAkJQUREX1BSSU8oMCwgRVRIVE9PTF9NSU5fTEVWRUwsIDAsCkBAIC0zNDUsNyArMzUzLDcgQEAKIAogCWVyciA9IG1seDVfY21kX2Rlc3Ryb3lfZmxvd190YWJsZShkZXYsIGZ0KTsKIAlpZiAoZXJyKQotCQlwcl93YXJuKCJmbG93IHN0ZWVyaW5nIGNhbid0IGRlc3Ryb3kgZnRcbiIpOworCQltbHg1X2NvcmVfd2FybihkZXYsICJmbG93IHN0ZWVyaW5nIGNhbid0IGRlc3Ryb3kgZnRcbiIpOwogCWZzX2dldF9vYmoocHJpbywgZnQtPm5vZGUucGFyZW50KTsKIAlwcmlvLT5udW1fZnQtLTsKIH0KQEAgLTM2NCw3ICszNzIsNyBAQAogCiAJbWF0Y2hfdmFsdWUgPSBtbHg1X3Z6YWxsb2MobWF0Y2hfbGVuKTsKIAlpZiAoIW1hdGNoX3ZhbHVlKSB7Ci0JCXByX3dhcm4oImZhaWxlZCB0byBhbGxvY2F0ZSBpbmJveFxuIik7CisJCW1seDVfY29yZV93YXJuKGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBpbmJveFxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTM4Nyw4ICszOTUsOSBAQAogCQkJCQkgIG1vZGlmeV9tYXNrLAogCQkJCQkgIGZ0ZSk7CiAJCWlmIChlcnIpCi0JCQlwcl93YXJuKCIlcyBjYW4ndCBkZWwgcnVsZSBmZyBpZD0lZCBmdGVfaW5kZXg9JWRcbiIsCi0JCQkJX19mdW5jX18sIGZnLT5pZCwgZnRlLT5pbmRleCk7CisJCQltbHg1X2NvcmVfd2FybihkZXYsCisJCQkJICAgICAgICIlcyBjYW4ndCBkZWwgcnVsZSBmZyBpZD0lZCBmdGVfaW5kZXg9JWRcbiIsCisJCQkJICAgICAgIF9fZnVuY19fLCBmZy0+aWQsIGZ0ZS0+aW5kZXgpOwogCX0KIAlrdmZyZWUobWF0Y2hfdmFsdWUpOwogfQpAQCAtNDA5LDggKzQxOCw5IEBACiAJZXJyID0gbWx4NV9jbWRfZGVsZXRlX2Z0ZShkZXYsIGZ0LAogCQkJCSAgZnRlLT5pbmRleCk7CiAJaWYgKGVycikKLQkJcHJfd2FybigiZmxvdyBzdGVlcmluZyBjYW4ndCBkZWxldGUgZnRlIGluIGluZGV4ICVkIG9mIGZsb3cgZ3JvdXAgaWQgJWRcbiIsCi0JCQlmdGUtPmluZGV4LCBmZy0+aWQpOworCQltbHg1X2NvcmVfd2FybihkZXYsCisJCQkgICAgICAgImZsb3cgc3RlZXJpbmcgY2FuJ3QgZGVsZXRlIGZ0ZSBpbiBpbmRleCAlZCBvZiBmbG93IGdyb3VwIGlkICVkXG4iLAorCQkJICAgICAgIGZ0ZS0+aW5kZXgsIGZnLT5pZCk7CiAKIAlmdGUtPnN0YXR1cyA9IDA7CiAJZmctPm51bV9mdGVzLS07CkBAIC00MjcsOCArNDM3LDggQEAKIAlkZXYgPSBnZXRfZGV2KCZmdC0+bm9kZSk7CiAKIAlpZiAobWx4NV9jbWRfZGVzdHJveV9mbG93X2dyb3VwKGRldiwgZnQsIGZnLT5pZCkpCi0JCXByX3dhcm4oImZsb3cgc3RlZXJpbmcgY2FuJ3QgZGVzdHJveSBmZyAlZCBvZiBmdCAlZFxuIiwKLQkJCWZnLT5pZCwgZnQtPmlkKTsKKwkJbWx4NV9jb3JlX3dhcm4oZGV2LCAiZmxvdyBzdGVlcmluZyBjYW4ndCBkZXN0cm95IGZnICVkIG9mIGZ0ICVkXG4iLAorCQkJICAgICAgIGZnLT5pZCwgZnQtPmlkKTsKIH0KIAogc3RhdGljIHN0cnVjdCBmc19mdGUgKmFsbG9jX2Z0ZSh1OCBhY3Rpb24sCkBAIC00NzUsNyArNDg1LDggQEAKIH0KIAogc3RhdGljIHN0cnVjdCBtbHg1X2Zsb3dfdGFibGUgKmFsbG9jX2Zsb3dfdGFibGUoaW50IGxldmVsLCB1MTYgdnBvcnQsIGludCBtYXhfZnRlLAotCQkJCQkJZW51bSBmc19mbG93X3RhYmxlX3R5cGUgdGFibGVfdHlwZSkKKwkJCQkJCWVudW0gZnNfZmxvd190YWJsZV90eXBlIHRhYmxlX3R5cGUsCisJCQkJCQllbnVtIGZzX2Zsb3dfdGFibGVfb3BfbW9kIG9wX21vZCkKIHsKIAlzdHJ1Y3QgbWx4NV9mbG93X3RhYmxlICpmdDsKIApAQCAtNDg1LDYgKzQ5Niw3IEBACiAKIAlmdC0+bGV2ZWwgPSBsZXZlbDsKIAlmdC0+bm9kZS50eXBlID0gRlNfVFlQRV9GTE9XX1RBQkxFOworCWZ0LT5vcF9tb2QgPSBvcF9tb2Q7CiAJZnQtPnR5cGUgPSB0YWJsZV90eXBlOwogCWZ0LT52cG9ydCA9IHZwb3J0OwogCWZ0LT5tYXhfZnRlID0gbWF4X2Z0ZTsKQEAgLTcyMiw2ICs3MzQsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IG1seDVfZmxvd190YWJsZSAqX19tbHg1X2NyZWF0ZV9mbG93X3RhYmxlKHN0cnVjdCBtbHg1X2Zsb3dfbmFtZXNwYWNlICpucywKKwkJCQkJCQllbnVtIGZzX2Zsb3dfdGFibGVfb3BfbW9kIG9wX21vZCwKIAkJCQkJCQl1MTYgdnBvcnQsIGludCBwcmlvLAogCQkJCQkJCWludCBtYXhfZnRlLCB1MzIgbGV2ZWwpCiB7CkBAIC03NTQsMTggKzc2NywxOSBAQAogCWxldmVsICs9IGZzX3ByaW8tPnN0YXJ0X2xldmVsOwogCWZ0ID0gYWxsb2NfZmxvd190YWJsZShsZXZlbCwKIAkJCSAgICAgIHZwb3J0LAotCQkJICAgICAgcm91bmR1cF9wb3dfb2ZfdHdvKG1heF9mdGUpLAotCQkJICAgICAgcm9vdC0+dGFibGVfdHlwZSk7CisJCQkgICAgICBtYXhfZnRlID8gcm91bmR1cF9wb3dfb2ZfdHdvKG1heF9mdGUpIDogMCwKKwkJCSAgICAgIHJvb3QtPnRhYmxlX3R5cGUsCisJCQkgICAgICBvcF9tb2QpOwogCWlmICghZnQpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byB1bmxvY2tfcm9vdDsKIAl9CiAKIAl0cmVlX2luaXRfbm9kZSgmZnQtPm5vZGUsIDEsIGRlbF9mbG93X3RhYmxlKTsKLQlsb2dfdGFibGVfc3ogPSBpbG9nMihmdC0+bWF4X2Z0ZSk7CisJbG9nX3RhYmxlX3N6ID0gZnQtPm1heF9mdGUgPyBpbG9nMihmdC0+bWF4X2Z0ZSkgOiAwOwogCW5leHRfZnQgPSBmaW5kX25leHRfY2hhaW5lZF9mdChmc19wcmlvKTsKLQllcnIgPSBtbHg1X2NtZF9jcmVhdGVfZmxvd190YWJsZShyb290LT5kZXYsIGZ0LT52cG9ydCwgZnQtPnR5cGUsIGZ0LT5sZXZlbCwKLQkJCQkJIGxvZ190YWJsZV9zeiwgbmV4dF9mdCwgJmZ0LT5pZCk7CisJZXJyID0gbWx4NV9jbWRfY3JlYXRlX2Zsb3dfdGFibGUocm9vdC0+ZGV2LCBmdC0+dnBvcnQsIGZ0LT5vcF9tb2QsIGZ0LT50eXBlLAorCQkJCQkgZnQtPmxldmVsLCBsb2dfdGFibGVfc3osIG5leHRfZnQsICZmdC0+aWQpOwogCWlmIChlcnIpCiAJCWdvdG8gZnJlZV9mdDsKIApAQCAtNzkyLDE2ICs4MDYsMjcgQEAKIAkJCQkJICAgICAgIGludCBwcmlvLCBpbnQgbWF4X2Z0ZSwKIAkJCQkJICAgICAgIHUzMiBsZXZlbCkKIHsKLQlyZXR1cm4gX19tbHg1X2NyZWF0ZV9mbG93X3RhYmxlKG5zLCAwLCBwcmlvLCBtYXhfZnRlLCBsZXZlbCk7CisJcmV0dXJuIF9fbWx4NV9jcmVhdGVfZmxvd190YWJsZShucywgRlNfRlRfT1BfTU9EX05PUk1BTCwgMCwgcHJpbywKKwkJCQkJbWF4X2Z0ZSwgbGV2ZWwpOwogfQogCiBzdHJ1Y3QgbWx4NV9mbG93X3RhYmxlICptbHg1X2NyZWF0ZV92cG9ydF9mbG93X3RhYmxlKHN0cnVjdCBtbHg1X2Zsb3dfbmFtZXNwYWNlICpucywKIAkJCQkJCSAgICAgaW50IHByaW8sIGludCBtYXhfZnRlLAogCQkJCQkJICAgICB1MzIgbGV2ZWwsIHUxNiB2cG9ydCkKIHsKLQlyZXR1cm4gX19tbHg1X2NyZWF0ZV9mbG93X3RhYmxlKG5zLCB2cG9ydCwgcHJpbywgbWF4X2Z0ZSwgbGV2ZWwpOworCXJldHVybiBfX21seDVfY3JlYXRlX2Zsb3dfdGFibGUobnMsIEZTX0ZUX09QX01PRF9OT1JNQUwsIHZwb3J0LCBwcmlvLAorCQkJCQltYXhfZnRlLCBsZXZlbCk7CiB9CiAKK3N0cnVjdCBtbHg1X2Zsb3dfdGFibGUgKm1seDVfY3JlYXRlX2xhZ19kZW11eF9mbG93X3RhYmxlKAorCQkJCQkgICAgICAgc3RydWN0IG1seDVfZmxvd19uYW1lc3BhY2UgKm5zLAorCQkJCQkgICAgICAgaW50IHByaW8sIHUzMiBsZXZlbCkKK3sKKwlyZXR1cm4gX19tbHg1X2NyZWF0ZV9mbG93X3RhYmxlKG5zLCBGU19GVF9PUF9NT0RfTEFHX0RFTVVYLCAwLCBwcmlvLCAwLAorCQkJCQlsZXZlbCk7Cit9CitFWFBPUlRfU1lNQk9MKG1seDVfY3JlYXRlX2xhZ19kZW11eF9mbG93X3RhYmxlKTsKKwogc3RydWN0IG1seDVfZmxvd190YWJsZSAqbWx4NV9jcmVhdGVfYXV0b19ncm91cGVkX2Zsb3dfdGFibGUoc3RydWN0IG1seDVfZmxvd19uYW1lc3BhY2UgKm5zLAogCQkJCQkJCSAgICBpbnQgcHJpbywKIAkJCQkJCQkgICAgaW50IG51bV9mbG93X3RhYmxlX2VudHJpZXMsCkBAIC0xMzc5LDYgKzE0MDQsNyBAQAogCiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBNTFg1X0ZMT1dfTkFNRVNQQUNFX0JZUEFTUzoKKwljYXNlIE1MWDVfRkxPV19OQU1FU1BBQ0VfTEFHOgogCWNhc2UgTUxYNV9GTE9XX05BTUVTUEFDRV9PRkZMT0FEUzoKIAljYXNlIE1MWDVfRkxPV19OQU1FU1BBQ0VfRVRIVE9PTDoKIAljYXNlIE1MWDVfRkxPV19OQU1FU1BBQ0VfS0VSTkVMOgpAQCAtMTQwMSw2ICsxNDI3LDE2IEBACiAJCQlyZXR1cm4gJnN0ZWVyaW5nLT5lc3dfaW5ncmVzc19yb290X25zLT5uczsKIAkJZWxzZQogCQkJcmV0dXJuIE5VTEw7CisJY2FzZSBNTFg1X0ZMT1dfTkFNRVNQQUNFX1NOSUZGRVJfUlg6CisJCWlmIChzdGVlcmluZy0+c25pZmZlcl9yeF9yb290X25zKQorCQkJcmV0dXJuICZzdGVlcmluZy0+c25pZmZlcl9yeF9yb290X25zLT5uczsKKwkJZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJY2FzZSBNTFg1X0ZMT1dfTkFNRVNQQUNFX1NOSUZGRVJfVFg6CisJCWlmIChzdGVlcmluZy0+c25pZmZlcl90eF9yb290X25zKQorCQkJcmV0dXJuICZzdGVlcmluZy0+c25pZmZlcl90eF9yb290X25zLT5uczsKKwkJZWxzZQorCQkJcmV0dXJuIE5VTEw7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMTcwMCwxMCArMTczNiw0NiBAQAogCWNsZWFudXBfcm9vdF9ucyhzdGVlcmluZy0+ZXN3X2VncmVzc19yb290X25zKTsKIAljbGVhbnVwX3Jvb3RfbnMoc3RlZXJpbmctPmVzd19pbmdyZXNzX3Jvb3RfbnMpOwogCWNsZWFudXBfcm9vdF9ucyhzdGVlcmluZy0+ZmRiX3Jvb3RfbnMpOworCWNsZWFudXBfcm9vdF9ucyhzdGVlcmluZy0+c25pZmZlcl9yeF9yb290X25zKTsKKwljbGVhbnVwX3Jvb3RfbnMoc3RlZXJpbmctPnNuaWZmZXJfdHhfcm9vdF9ucyk7CiAJbWx4NV9jbGVhbnVwX2ZjX3N0YXRzKGRldik7CiAJa2ZyZWUoc3RlZXJpbmcpOwogfQogCitzdGF0aWMgaW50IGluaXRfc25pZmZlcl90eF9yb290X25zKHN0cnVjdCBtbHg1X2Zsb3dfc3RlZXJpbmcgKnN0ZWVyaW5nKQoreworCXN0cnVjdCBmc19wcmlvICpwcmlvOworCisJc3RlZXJpbmctPnNuaWZmZXJfdHhfcm9vdF9ucyA9IGNyZWF0ZV9yb290X25zKHN0ZWVyaW5nLCBGU19GVF9TTklGRkVSX1RYKTsKKwlpZiAoIXN0ZWVyaW5nLT5zbmlmZmVyX3R4X3Jvb3RfbnMpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogQ3JlYXRlIHNpbmdsZSBwcmlvICovCisJcHJpbyA9IGZzX2NyZWF0ZV9wcmlvKCZzdGVlcmluZy0+c25pZmZlcl90eF9yb290X25zLT5ucywgMCwgMSk7CisJaWYgKElTX0VSUihwcmlvKSkgeworCQljbGVhbnVwX3Jvb3RfbnMoc3RlZXJpbmctPnNuaWZmZXJfdHhfcm9vdF9ucyk7CisJCXJldHVybiBQVFJfRVJSKHByaW8pOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbml0X3NuaWZmZXJfcnhfcm9vdF9ucyhzdHJ1Y3QgbWx4NV9mbG93X3N0ZWVyaW5nICpzdGVlcmluZykKK3sKKwlzdHJ1Y3QgZnNfcHJpbyAqcHJpbzsKKworCXN0ZWVyaW5nLT5zbmlmZmVyX3J4X3Jvb3RfbnMgPSBjcmVhdGVfcm9vdF9ucyhzdGVlcmluZywgRlNfRlRfU05JRkZFUl9SWCk7CisJaWYgKCFzdGVlcmluZy0+c25pZmZlcl9yeF9yb290X25zKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIENyZWF0ZSBzaW5nbGUgcHJpbyAqLworCXByaW8gPSBmc19jcmVhdGVfcHJpbygmc3RlZXJpbmctPnNuaWZmZXJfcnhfcm9vdF9ucy0+bnMsIDAsIDEpOworCWlmIChJU19FUlIocHJpbykpIHsKKwkJY2xlYW51cF9yb290X25zKHN0ZWVyaW5nLT5zbmlmZmVyX3J4X3Jvb3RfbnMpOworCQlyZXR1cm4gUFRSX0VSUihwcmlvKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgaW5pdF9mZGJfcm9vdF9ucyhzdHJ1Y3QgbWx4NV9mbG93X3N0ZWVyaW5nICpzdGVlcmluZykKIHsKIAlzdHJ1Y3QgZnNfcHJpbyAqcHJpbzsKQEAgLTE4MDAsNiArMTg3MiwxOCBAQAogCQl9CiAJfQogCisJaWYgKE1MWDVfQ0FQX0ZMT1dUQUJMRV9TTklGRkVSX1JYKGRldiwgZnRfc3VwcG9ydCkpIHsKKwkJZXJyID0gaW5pdF9zbmlmZmVyX3J4X3Jvb3RfbnMoc3RlZXJpbmcpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnI7CisJfQorCisJaWYgKE1MWDVfQ0FQX0ZMT1dUQUJMRV9TTklGRkVSX1RYKGRldiwgZnRfc3VwcG9ydCkpIHsKKwkJZXJyID0gaW5pdF9zbmlmZmVyX3R4X3Jvb3RfbnMoc3RlZXJpbmcpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnI7CisJfQorCiAJcmV0dXJuIDA7CiBlcnI6CiAJbWx4NV9jbGVhbnVwX2ZzKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZnNfY29yZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2ZzX2NvcmUuaAppbmRleCA5Y2ZmYjZhLi43MWZmMDNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZnNfY29yZS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9mc19jb3JlLmgKQEAgLTQ5LDYgKzQ5LDEzIEBACiAJRlNfRlRfRVNXX0VHUkVTU19BQ0wgID0gMHgyLAogCUZTX0ZUX0VTV19JTkdSRVNTX0FDTCA9IDB4MywKIAlGU19GVF9GREIgICAgICAgICAgICAgPSAwWDQsCisJRlNfRlRfU05JRkZFUl9SWAk9IDBYNSwKKwlGU19GVF9TTklGRkVSX1RYCT0gMFg2LAorfTsKKworZW51bSBmc19mbG93X3RhYmxlX29wX21vZCB7CisJRlNfRlRfT1BfTU9EX05PUk1BTCwKKwlGU19GVF9PUF9NT0RfTEFHX0RFTVVYLAogfTsKIAogZW51bSBmc19mdGVfc3RhdHVzIHsKQEAgLTYxLDYgKzY4LDggQEAKIAlzdHJ1Y3QgbWx4NV9mbG93X3Jvb3RfbmFtZXNwYWNlICpmZGJfcm9vdF9uczsKIAlzdHJ1Y3QgbWx4NV9mbG93X3Jvb3RfbmFtZXNwYWNlICplc3dfZWdyZXNzX3Jvb3RfbnM7CiAJc3RydWN0IG1seDVfZmxvd19yb290X25hbWVzcGFjZSAqZXN3X2luZ3Jlc3Nfcm9vdF9uczsKKwlzdHJ1Y3QgbWx4NV9mbG93X3Jvb3RfbmFtZXNwYWNlCSpzbmlmZmVyX3R4X3Jvb3RfbnM7CisJc3RydWN0IG1seDVfZmxvd19yb290X25hbWVzcGFjZQkqc25pZmZlcl9yeF9yb290X25zOwogfTsKIAogc3RydWN0IGZzX25vZGUgewpAQCAtOTMsNiArMTAyLDcgQEAKIAl1bnNpZ25lZCBpbnQJCQltYXhfZnRlOwogCXVuc2lnbmVkIGludAkJCWxldmVsOwogCWVudW0gZnNfZmxvd190YWJsZV90eXBlCQl0eXBlOworCWVudW0gZnNfZmxvd190YWJsZV9vcF9tb2QJb3BfbW9kOwogCXN0cnVjdCB7CiAJCWJvb2wJCQlhY3RpdmU7CiAJCXVuc2lnbmVkIGludAkJcmVxdWlyZWRfZ3JvdXBzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2ZzX2NvdW50ZXJzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZnNfY291bnRlcnMuYwppbmRleCBjMjg3N2U5Li4zYTkxOTViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZnNfY291bnRlcnMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZnNfY291bnRlcnMuYwpAQCAtMTI2LDEyICsxMjYsMjEgQEAKIAlmb3IgKG5vZGUgPSAmZmlyc3QtPm5vZGU7IG5vZGU7IG5vZGUgPSByYl9uZXh0KG5vZGUpKSB7CiAJCXN0cnVjdCBtbHg1X2ZjICpjb3VudGVyID0gcmJfZW50cnkobm9kZSwgc3RydWN0IG1seDVfZmMsIG5vZGUpOwogCQlzdHJ1Y3QgbWx4NV9mY19jYWNoZSAqYyA9ICZjb3VudGVyLT5jYWNoZTsKKwkJdTY0IHBhY2tldHM7CisJCXU2NCBieXRlczsKIAogCQlpZiAoY291bnRlci0+aWQgPiBsYXN0X2lkKQogCQkJYnJlYWs7CiAKIAkJbWx4NV9jbWRfZmNfYnVsa19nZXQoZGV2LCBiLAotCQkJCSAgICAgY291bnRlci0+aWQsICZjLT5wYWNrZXRzLCAmYy0+Ynl0ZXMpOworCQkJCSAgICAgY291bnRlci0+aWQsICZwYWNrZXRzLCAmYnl0ZXMpOworCisJCWlmIChjLT5wYWNrZXRzID09IHBhY2tldHMpCisJCQljb250aW51ZTsKKworCQljLT5wYWNrZXRzID0gcGFja2V0czsKKwkJYy0+Ynl0ZXMgPSBieXRlczsKKwkJYy0+bGFzdHVzZSA9IGppZmZpZXM7CiAJfQogCiBvdXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZncuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9mdy5jCmluZGV4IDc3ZmMxYWEuLjU3MThhYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9mdy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9mdy5jCkBAIC0zOCwxMyArMzgsMTAgQEAKIHN0YXRpYyBpbnQgbWx4NV9jbWRfcXVlcnlfYWRhcHRlcihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgKm91dCwKIAkJCQkgIGludCBvdXRsZW4pCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcocXVlcnlfYWRhcHRlcl9pbildOwotCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhxdWVyeV9hZGFwdGVyX2luKV0gPSB7MH07CiAKIAlNTFg1X1NFVChxdWVyeV9hZGFwdGVyX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9RVUVSWV9BREFQVEVSKTsKLQotCXJldHVybiBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIG91dGxlbik7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBvdXRsZW4pOwogfQogCiBpbnQgbWx4NV9xdWVyeV9ib2FyZF9pZChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KQpAQCAtMTYyLDM4ICsxNTksMTggQEAKIAogaW50IG1seDVfY21kX2luaXRfaGNhKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IG1seDVfY21kX2luaXRfaGNhX21ib3hfaW4gaW47Ci0Jc3RydWN0IG1seDVfY21kX2luaXRfaGNhX21ib3hfb3V0IG91dDsKLQlpbnQgZXJyOworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhpbml0X2hjYV9vdXQpXSA9IHswfTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhpbml0X2hjYV9pbildICAgPSB7MH07CiAKLQltZW1zZXQoJmluLCAwLCBzaXplb2YoaW4pKTsKLQltZW1zZXQoJm91dCwgMCwgc2l6ZW9mKG91dCkpOwotCWluLmhkci5vcGNvZGUgPSBjcHVfdG9fYmUxNihNTFg1X0NNRF9PUF9JTklUX0hDQSk7Ci0JZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsICZpbiwgc2l6ZW9mKGluKSwgJm91dCwgc2l6ZW9mKG91dCkpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlpZiAob3V0Lmhkci5zdGF0dXMpCi0JCWVyciA9IG1seDVfY21kX3N0YXR1c190b19lcnIoJm91dC5oZHIpOwotCi0JcmV0dXJuIGVycjsKKwlNTFg1X1NFVChpbml0X2hjYV9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfSU5JVF9IQ0EpOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQogCiBpbnQgbWx4NV9jbWRfdGVhcmRvd25faGNhKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IG1seDVfY21kX3RlYXJkb3duX2hjYV9tYm94X2luIGluOwotCXN0cnVjdCBtbHg1X2NtZF90ZWFyZG93bl9oY2FfbWJveF9vdXQgb3V0OwotCWludCBlcnI7CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKHRlYXJkb3duX2hjYV9vdXQpXSA9IHswfTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyh0ZWFyZG93bl9oY2FfaW4pXSAgID0gezB9OwogCi0JbWVtc2V0KCZpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KCZvdXQsIDAsIHNpemVvZihvdXQpKTsKLQlpbi5oZHIub3Bjb2RlID0gY3B1X3RvX2JlMTYoTUxYNV9DTURfT1BfVEVBUkRPV05fSENBKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgJmluLCBzaXplb2YoaW4pLCAmb3V0LCBzaXplb2Yob3V0KSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWlmIChvdXQuaGRyLnN0YXR1cykKLQkJZXJyID0gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycigmb3V0Lmhkcik7Ci0KLQlyZXR1cm4gZXJyOworCU1MWDVfU0VUKHRlYXJkb3duX2hjYV9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfVEVBUkRPV05fSENBKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9sYWcuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9sYWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTk1NzI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2xhZy5jCkBAIC0wLDAgKzEsNTg4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2LCBNZWxsYW5veCBUZWNobm9sb2dpZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbWx4NS9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbHg1L3Zwb3J0Lmg+CisjaW5jbHVkZSAibWx4NV9jb3JlLmgiCisKK2VudW0geworCU1MWDVfTEFHX0ZMQUdfQk9OREVEID0gMSA8PCAwLAorfTsKKworc3RydWN0IGxhZ19mdW5jIHsKKwlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICAgICpuZXRkZXY7Cit9OworCisvKiBVc2VkIGZvciBjb2xsZWN0aW9uIG9mIG5ldGRldiBldmVudCBpbmZvLiAqLworc3RydWN0IGxhZ190cmFja2VyIHsKKwllbnVtICAgbmV0ZGV2X2xhZ190eF90eXBlICAgICAgICAgICB0eF90eXBlOworCXN0cnVjdCBuZXRkZXZfbGFnX2xvd2VyX3N0YXRlX2luZm8gIG5ldGRldl9zdGF0ZVtNTFg1X01BWF9QT1JUU107CisJYm9vbCBpc19ib25kZWQ7Cit9OworCisvKiBMQUcgZGF0YSBvZiBhIENvbm5lY3RYIGNhcmQuCisgKiBJdCBzZXJ2ZXMgYm90aCBpdHMgcGh5cyBmdW5jdGlvbnMuCisgKi8KK3N0cnVjdCBtbHg1X2xhZyB7CisJdTggICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgIHYycF9tYXBbTUxYNV9NQVhfUE9SVFNdOworCXN0cnVjdCBsYWdfZnVuYyAgICAgICAgICAgcGZbTUxYNV9NQVhfUE9SVFNdOworCXN0cnVjdCBsYWdfdHJhY2tlciAgICAgICAgdHJhY2tlcjsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICAgICAgIGJvbmRfd29yazsKKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgICAgIG5iOworfTsKKworLyogR2VuZXJhbCBwdXJwb3NlLCB1c2UgZm9yIHNob3J0IHBlcmlvZHMgb2YgdGltZS4KKyAqIEJld2FyZSBvZiBsb2NrIGRlcGVuZGVuY2llcyAocHJlZmVyYWJseSwgbm8gbG9ja3Mgc2hvdWxkIGJlIGFjcXVpcmVkCisgKiB1bmRlciBpdCkuCisgKi8KK3N0YXRpYyBERUZJTkVfTVVURVgobGFnX211dGV4KTsKKworc3RhdGljIGludCBtbHg1X2NtZF9jcmVhdGVfbGFnKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHU4IHJlbWFwX3BvcnQxLAorCQkJICAgICAgIHU4IHJlbWFwX3BvcnQyKQoreworCXUzMiAgIGluW01MWDVfU1RfU1pfRFcoY3JlYXRlX2xhZ19pbildICAgPSB7MH07CisJdTMyICAgb3V0W01MWDVfU1RfU1pfRFcoY3JlYXRlX2xhZ19vdXQpXSA9IHswfTsKKwl2b2lkICpsYWdfY3R4ID0gTUxYNV9BRERSX09GKGNyZWF0ZV9sYWdfaW4sIGluLCBjdHgpOworCisJTUxYNV9TRVQoY3JlYXRlX2xhZ19pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfQ1JFQVRFX0xBRyk7CisKKwlNTFg1X1NFVChsYWdjLCBsYWdfY3R4LCB0eF9yZW1hcF9hZmZpbml0eV8xLCByZW1hcF9wb3J0MSk7CisJTUxYNV9TRVQobGFnYywgbGFnX2N0eCwgdHhfcmVtYXBfYWZmaW5pdHlfMiwgcmVtYXBfcG9ydDIpOworCisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7Cit9CisKK3N0YXRpYyBpbnQgbWx4NV9jbWRfbW9kaWZ5X2xhZyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1OCByZW1hcF9wb3J0MSwKKwkJCSAgICAgICB1OCByZW1hcF9wb3J0MikKK3sKKwl1MzIgICBpbltNTFg1X1NUX1NaX0RXKG1vZGlmeV9sYWdfaW4pXSAgID0gezB9OworCXUzMiAgIG91dFtNTFg1X1NUX1NaX0RXKG1vZGlmeV9sYWdfb3V0KV0gPSB7MH07CisJdm9pZCAqbGFnX2N0eCA9IE1MWDVfQUREUl9PRihtb2RpZnlfbGFnX2luLCBpbiwgY3R4KTsKKworCU1MWDVfU0VUKG1vZGlmeV9sYWdfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX01PRElGWV9MQUcpOworCU1MWDVfU0VUKG1vZGlmeV9sYWdfaW4sIGluLCBmaWVsZF9zZWxlY3QsIDB4MSk7CisKKwlNTFg1X1NFVChsYWdjLCBsYWdfY3R4LCB0eF9yZW1hcF9hZmZpbml0eV8xLCByZW1hcF9wb3J0MSk7CisJTUxYNV9TRVQobGFnYywgbGFnX2N0eCwgdHhfcmVtYXBfYWZmaW5pdHlfMiwgcmVtYXBfcG9ydDIpOworCisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7Cit9CisKK3N0YXRpYyBpbnQgbWx4NV9jbWRfZGVzdHJveV9sYWcoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKK3sKKwl1MzIgIGluW01MWDVfU1RfU1pfRFcoZGVzdHJveV9sYWdfaW4pXSAgPSB7MH07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfbGFnX291dCldID0gezB9OworCisJTUxYNV9TRVQoZGVzdHJveV9sYWdfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX0RFU1RST1lfTEFHKTsKKworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOworfQorCitpbnQgbWx4NV9jbWRfY3JlYXRlX3Zwb3J0X2xhZyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KQoreworCXUzMiAgaW5bTUxYNV9TVF9TWl9EVyhjcmVhdGVfdnBvcnRfbGFnX2luKV0gID0gezB9OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhjcmVhdGVfdnBvcnRfbGFnX291dCldID0gezB9OworCisJTUxYNV9TRVQoY3JlYXRlX3Zwb3J0X2xhZ19pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfQ1JFQVRFX1ZQT1JUX0xBRyk7CisKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKK30KK0VYUE9SVF9TWU1CT0wobWx4NV9jbWRfY3JlYXRlX3Zwb3J0X2xhZyk7CisKK2ludCBtbHg1X2NtZF9kZXN0cm95X3Zwb3J0X2xhZyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KQoreworCXUzMiAgaW5bTUxYNV9TVF9TWl9EVyhkZXN0cm95X3Zwb3J0X2xhZ19pbildICA9IHswfTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoZGVzdHJveV92cG9ydF9sYWdfb3V0KV0gPSB7MH07CisKKwlNTFg1X1NFVChkZXN0cm95X3Zwb3J0X2xhZ19pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfREVTVFJPWV9WUE9SVF9MQUcpOworCisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7Cit9CitFWFBPUlRfU1lNQk9MKG1seDVfY21kX2Rlc3Ryb3lfdnBvcnRfbGFnKTsKKworc3RhdGljIHN0cnVjdCBtbHg1X2xhZyAqbWx4NV9sYWdfZGV2X2dldChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KQoreworCXJldHVybiBkZXYtPnByaXYubGFnOworfQorCitzdGF0aWMgaW50IG1seDVfbGFnX2Rldl9nZXRfbmV0ZGV2X2lkeChzdHJ1Y3QgbWx4NV9sYWcgKmxkZXYsCisJCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1MWDVfTUFYX1BPUlRTOyBpKyspCisJCWlmIChsZGV2LT5wZltpXS5uZXRkZXYgPT0gbmRldikKKwkJCXJldHVybiBpOworCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgYm9vbCBtbHg1X2xhZ19pc19ib25kZWQoc3RydWN0IG1seDVfbGFnICpsZGV2KQoreworCXJldHVybiAhIShsZGV2LT5mbGFncyAmIE1MWDVfTEFHX0ZMQUdfQk9OREVEKTsKK30KKworc3RhdGljIHZvaWQgbWx4NV9pbmZlcl90eF9hZmZpbml0eV9tYXBwaW5nKHN0cnVjdCBsYWdfdHJhY2tlciAqdHJhY2tlciwKKwkJCQkJICAgdTggKnBvcnQxLCB1OCAqcG9ydDIpCit7CisJaWYgKHRyYWNrZXItPnR4X3R5cGUgPT0gTkVUREVWX0xBR19UWF9UWVBFX0FDVElWRUJBQ0tVUCkgeworCQlpZiAodHJhY2tlci0+bmV0ZGV2X3N0YXRlWzBdLnR4X2VuYWJsZWQpIHsKKwkJCSpwb3J0MSA9IDE7CisJCQkqcG9ydDIgPSAxOworCQl9IGVsc2UgeworCQkJKnBvcnQxID0gMjsKKwkJCSpwb3J0MiA9IDI7CisJCX0KKwl9IGVsc2UgeworCQkqcG9ydDEgPSAxOworCQkqcG9ydDIgPSAyOworCQlpZiAoIXRyYWNrZXItPm5ldGRldl9zdGF0ZVswXS5saW5rX3VwKQorCQkJKnBvcnQxID0gMjsKKwkJZWxzZSBpZiAoIXRyYWNrZXItPm5ldGRldl9zdGF0ZVsxXS5saW5rX3VwKQorCQkJKnBvcnQyID0gMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1seDVfYWN0aXZhdGVfbGFnKHN0cnVjdCBtbHg1X2xhZyAqbGRldiwKKwkJCSAgICAgIHN0cnVjdCBsYWdfdHJhY2tlciAqdHJhY2tlcikKK3sKKwlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2MCA9IGxkZXYtPnBmWzBdLmRldjsKKwlpbnQgZXJyOworCisJbGRldi0+ZmxhZ3MgfD0gTUxYNV9MQUdfRkxBR19CT05ERUQ7CisKKwltbHg1X2luZmVyX3R4X2FmZmluaXR5X21hcHBpbmcodHJhY2tlciwgJmxkZXYtPnYycF9tYXBbMF0sCisJCQkJICAgICAgICZsZGV2LT52MnBfbWFwWzFdKTsKKworCWVyciA9IG1seDVfY21kX2NyZWF0ZV9sYWcoZGV2MCwgbGRldi0+djJwX21hcFswXSwgbGRldi0+djJwX21hcFsxXSk7CisJaWYgKGVycikKKwkJbWx4NV9jb3JlX2VycihkZXYwLAorCQkJICAgICAgIkZhaWxlZCB0byBjcmVhdGUgTEFHICglZClcbiIsCisJCQkgICAgICBlcnIpOworfQorCitzdGF0aWMgdm9pZCBtbHg1X2RlYWN0aXZhdGVfbGFnKHN0cnVjdCBtbHg1X2xhZyAqbGRldikKK3sKKwlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2MCA9IGxkZXYtPnBmWzBdLmRldjsKKwlpbnQgZXJyOworCisJbGRldi0+ZmxhZ3MgJj0gfk1MWDVfTEFHX0ZMQUdfQk9OREVEOworCisJZXJyID0gbWx4NV9jbWRfZGVzdHJveV9sYWcoZGV2MCk7CisJaWYgKGVycikKKwkJbWx4NV9jb3JlX2VycihkZXYwLAorCQkJICAgICAgIkZhaWxlZCB0byBkZXN0cm95IExBRyAoJWQpXG4iLAorCQkJICAgICAgZXJyKTsKK30KKworc3RhdGljIHZvaWQgbWx4NV9kb19ib25kKHN0cnVjdCBtbHg1X2xhZyAqbGRldikKK3sKKwlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2MCA9IGxkZXYtPnBmWzBdLmRldjsKKwlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2MSA9IGxkZXYtPnBmWzFdLmRldjsKKwlzdHJ1Y3QgbGFnX3RyYWNrZXIgdHJhY2tlcjsKKwl1OCB2MnBfcG9ydDEsIHYycF9wb3J0MjsKKwlpbnQgaSwgZXJyOworCisJaWYgKCFkZXYwIHx8ICFkZXYxKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZsYWdfbXV0ZXgpOworCXRyYWNrZXIgPSBsZGV2LT50cmFja2VyOworCW11dGV4X3VubG9jaygmbGFnX211dGV4KTsKKworCWlmICh0cmFja2VyLmlzX2JvbmRlZCAmJiAhbWx4NV9sYWdfaXNfYm9uZGVkKGxkZXYpKSB7CisJCWlmIChtbHg1X3NyaW92X2lzX2VuYWJsZWQoZGV2MCkgfHwKKwkJICAgIG1seDVfc3Jpb3ZfaXNfZW5hYmxlZChkZXYxKSkgeworCQkJbWx4NV9jb3JlX3dhcm4oZGV2MCwgIkxBRyBpcyBub3Qgc3VwcG9ydGVkIHdpdGggU1JJT1YiKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBNTFg1X01BWF9QT1JUUzsgaSsrKQorCQkJbWx4NV9yZW1vdmVfZGV2X2J5X3Byb3RvY29sKGxkZXYtPnBmW2ldLmRldiwKKwkJCQkJCSAgICBNTFg1X0lOVEVSRkFDRV9QUk9UT0NPTF9JQik7CisKKwkJbWx4NV9hY3RpdmF0ZV9sYWcobGRldiwgJnRyYWNrZXIpOworCisJCW1seDVfYWRkX2Rldl9ieV9wcm90b2NvbChkZXYwLCBNTFg1X0lOVEVSRkFDRV9QUk9UT0NPTF9JQik7CisJCW1seDVfbmljX3Zwb3J0X2VuYWJsZV9yb2NlKGRldjEpOworCX0gZWxzZSBpZiAodHJhY2tlci5pc19ib25kZWQgJiYgbWx4NV9sYWdfaXNfYm9uZGVkKGxkZXYpKSB7CisJCW1seDVfaW5mZXJfdHhfYWZmaW5pdHlfbWFwcGluZygmdHJhY2tlciwgJnYycF9wb3J0MSwKKwkJCQkJICAgICAgICZ2MnBfcG9ydDIpOworCisJCWlmICgodjJwX3BvcnQxICE9IGxkZXYtPnYycF9tYXBbMF0pIHx8CisJCSAgICAodjJwX3BvcnQyICE9IGxkZXYtPnYycF9tYXBbMV0pKSB7CisJCQlsZGV2LT52MnBfbWFwWzBdID0gdjJwX3BvcnQxOworCQkJbGRldi0+djJwX21hcFsxXSA9IHYycF9wb3J0MjsKKworCQkJZXJyID0gbWx4NV9jbWRfbW9kaWZ5X2xhZyhkZXYwLCB2MnBfcG9ydDEsIHYycF9wb3J0Mik7CisJCQlpZiAoZXJyKQorCQkJCW1seDVfY29yZV9lcnIoZGV2MCwKKwkJCQkJICAgICAgIkZhaWxlZCB0byBtb2RpZnkgTEFHICglZClcbiIsCisJCQkJCSAgICAgIGVycik7CisJCX0KKwl9IGVsc2UgaWYgKCF0cmFja2VyLmlzX2JvbmRlZCAmJiBtbHg1X2xhZ19pc19ib25kZWQobGRldikpIHsKKwkJbWx4NV9yZW1vdmVfZGV2X2J5X3Byb3RvY29sKGRldjAsIE1MWDVfSU5URVJGQUNFX1BST1RPQ09MX0lCKTsKKwkJbWx4NV9uaWNfdnBvcnRfZGlzYWJsZV9yb2NlKGRldjEpOworCisJCW1seDVfZGVhY3RpdmF0ZV9sYWcobGRldik7CisKKwkJZm9yIChpID0gMDsgaSA8IE1MWDVfTUFYX1BPUlRTOyBpKyspCisJCQlpZiAobGRldi0+cGZbaV0uZGV2KQorCQkJCW1seDVfYWRkX2Rldl9ieV9wcm90b2NvbChsZGV2LT5wZltpXS5kZXYsCisJCQkJCQkJIE1MWDVfSU5URVJGQUNFX1BST1RPQ09MX0lCKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1seDVfcXVldWVfYm9uZF93b3JrKHN0cnVjdCBtbHg1X2xhZyAqbGRldiwgdW5zaWduZWQgbG9uZyBkZWxheSkKK3sKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmxkZXYtPmJvbmRfd29yaywgZGVsYXkpOworfQorCitzdGF0aWMgdm9pZCBtbHg1X2RvX2JvbmRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZGVsYXllZF93b3JrID0gdG9fZGVsYXllZF93b3JrKHdvcmspOworCXN0cnVjdCBtbHg1X2xhZyAqbGRldiA9IGNvbnRhaW5lcl9vZihkZWxheWVkX3dvcmssIHN0cnVjdCBtbHg1X2xhZywKKwkJCQkJICAgICBib25kX3dvcmspOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBtbHg1X2Rldl9saXN0X3RyeWxvY2soKTsKKwlpZiAoIXN0YXR1cykgeworCQkvKiAxIHNlYyBkZWxheS4gKi8KKwkJbWx4NV9xdWV1ZV9ib25kX3dvcmsobGRldiwgSFopOworCQlyZXR1cm47CisJfQorCisJbWx4NV9kb19ib25kKGxkZXYpOworCW1seDVfZGV2X2xpc3RfdW5sb2NrKCk7Cit9CisKK3N0YXRpYyBpbnQgbWx4NV9oYW5kbGVfY2hhbmdldXBwZXJfZXZlbnQoc3RydWN0IG1seDVfbGFnICpsZGV2LAorCQkJCQkgc3RydWN0IGxhZ190cmFja2VyICp0cmFja2VyLAorCQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCisJCQkJCSBzdHJ1Y3QgbmV0ZGV2X25vdGlmaWVyX2NoYW5nZXVwcGVyX2luZm8gKmluZm8pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKnVwcGVyID0gaW5mby0+dXBwZXJfZGV2LCAqbmRldl90bXA7CisJc3RydWN0IG5ldGRldl9sYWdfdXBwZXJfaW5mbyAqbGFnX3VwcGVyX2luZm87CisJYm9vbCBpc19ib25kZWQ7CisJaW50IGJvbmRfc3RhdHVzID0gMDsKKwlpbnQgbnVtX3NsYXZlcyA9IDA7CisJaW50IGlkeDsKKworCWlmICghbmV0aWZfaXNfbGFnX21hc3Rlcih1cHBlcikpCisJCXJldHVybiAwOworCisJbGFnX3VwcGVyX2luZm8gPSBpbmZvLT51cHBlcl9pbmZvOworCisJLyogVGhlIGV2ZW50IG1heSBzdGlsbCBiZSBvZiBpbnRlcmVzdCBpZiB0aGUgc2xhdmUgZG9lcyBub3QgYmVsb25nIHRvCisJICogdXMsIGJ1dCBpcyBlbnNsYXZlZCB0byBhIG1hc3RlciB3aGljaCBoYXMgb25lIG9yIG1vcmUgb2Ygb3VyIG5ldGRldnMKKwkgKiBhcyBzbGF2ZXMgKGUuZy4sIGlmIGEgbmV3IHNsYXZlIGlzIGFkZGVkIHRvIGEgbWFzdGVyIHRoYXQgYm9uZHMgdHdvCisJICogb2Ygb3VyIG5ldGRldnMsIHdlIHNob3VsZCB1bmJvbmQpLgorCSAqLworCXJjdV9yZWFkX2xvY2soKTsKKwlmb3JfZWFjaF9uZXRkZXZfaW5fYm9uZF9yY3UodXBwZXIsIG5kZXZfdG1wKSB7CisJCWlkeCA9IG1seDVfbGFnX2Rldl9nZXRfbmV0ZGV2X2lkeChsZGV2LCBuZGV2X3RtcCk7CisJCWlmIChpZHggPiAtMSkKKwkJCWJvbmRfc3RhdHVzIHw9ICgxIDw8IGlkeCk7CisKKwkJbnVtX3NsYXZlcysrOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCS8qIE5vbmUgb2YgdGhpcyBsYWdkZXYncyBuZXRkZXZzIGFyZSBzbGF2ZXMgb2YgdGhpcyBtYXN0ZXIuICovCisJaWYgKCEoYm9uZF9zdGF0dXMgJiAweDMpKQorCQlyZXR1cm4gMDsKKworCWlmIChsYWdfdXBwZXJfaW5mbykKKwkJdHJhY2tlci0+dHhfdHlwZSA9IGxhZ191cHBlcl9pbmZvLT50eF90eXBlOworCisJLyogRGV0ZXJtaW5lIGJvbmRpbmcgc3RhdHVzOgorCSAqIEEgZGV2aWNlIGlzIGNvbnNpZGVyZWQgYm9uZGVkIGlmIGJvdGggaXRzIHBoeXNpY2FsIHBvcnRzIGFyZSBzbGF2ZXMKKwkgKiBvZiB0aGUgc2FtZSBsYWcgbWFzdGVyLCBhbmQgb25seSB0aGVtLgorCSAqIExhZyBtb2RlIG11c3QgYmUgYWN0aXZlYmFja3VwIG9yIGhhc2guCisJICovCisJaXNfYm9uZGVkID0gKG51bV9zbGF2ZXMgPT0gTUxYNV9NQVhfUE9SVFMpICYmCisJCSAgICAoYm9uZF9zdGF0dXMgPT0gMHgzKSAmJgorCQkgICAgKCh0cmFja2VyLT50eF90eXBlID09IE5FVERFVl9MQUdfVFhfVFlQRV9BQ1RJVkVCQUNLVVApIHx8CisJCSAgICAgKHRyYWNrZXItPnR4X3R5cGUgPT0gTkVUREVWX0xBR19UWF9UWVBFX0hBU0gpKTsKKworCWlmICh0cmFja2VyLT5pc19ib25kZWQgIT0gaXNfYm9uZGVkKSB7CisJCXRyYWNrZXItPmlzX2JvbmRlZCA9IGlzX2JvbmRlZDsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWx4NV9oYW5kbGVfY2hhbmdlbG93ZXJzdGF0ZV9ldmVudChzdHJ1Y3QgbWx4NV9sYWcgKmxkZXYsCisJCQkJCSAgICAgIHN0cnVjdCBsYWdfdHJhY2tlciAqdHJhY2tlciwKKwkJCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCisJCQkJCSAgICAgIHN0cnVjdCBuZXRkZXZfbm90aWZpZXJfY2hhbmdlbG93ZXJzdGF0ZV9pbmZvICppbmZvKQoreworCXN0cnVjdCBuZXRkZXZfbGFnX2xvd2VyX3N0YXRlX2luZm8gKmxhZ19sb3dlcl9pbmZvOworCWludCBpZHg7CisKKwlpZiAoIW5ldGlmX2lzX2xhZ19wb3J0KG5kZXYpKQorCQlyZXR1cm4gMDsKKworCWlkeCA9IG1seDVfbGFnX2Rldl9nZXRfbmV0ZGV2X2lkeChsZGV2LCBuZGV2KTsKKwlpZiAoaWR4ID09IC0xKQorCQlyZXR1cm4gMDsKKworCS8qIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBkZXRlcm1pbmUgdmlydHVhbCB0byBwaHlzaWNhbAorCSAqIHBvcnQgbWFwcGluZy4KKwkgKi8KKwlsYWdfbG93ZXJfaW5mbyA9IGluZm8tPmxvd2VyX3N0YXRlX2luZm87CisJaWYgKCFsYWdfbG93ZXJfaW5mbykKKwkJcmV0dXJuIDA7CisKKwl0cmFja2VyLT5uZXRkZXZfc3RhdGVbaWR4XSA9ICpsYWdfbG93ZXJfaW5mbzsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1seDVfbGFnX25ldGRldl9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCisJCQkJIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IG5ldGRldl9ub3RpZmllcl9pbmZvX3RvX2RldihwdHIpOworCXN0cnVjdCBsYWdfdHJhY2tlciB0cmFja2VyOworCXN0cnVjdCBtbHg1X2xhZyAqbGRldjsKKwlpbnQgY2hhbmdlZCA9IDA7CisKKwlpZiAoIW5ldF9lcShkZXZfbmV0KG5kZXYpLCAmaW5pdF9uZXQpKQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisKKwlpZiAoKGV2ZW50ICE9IE5FVERFVl9DSEFOR0VVUFBFUikgJiYgKGV2ZW50ICE9IE5FVERFVl9DSEFOR0VMT1dFUlNUQVRFKSkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCisJbGRldiAgICA9IGNvbnRhaW5lcl9vZih0aGlzLCBzdHJ1Y3QgbWx4NV9sYWcsIG5iKTsKKwl0cmFja2VyID0gbGRldi0+dHJhY2tlcjsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5FVERFVl9DSEFOR0VVUFBFUjoKKwkJY2hhbmdlZCA9IG1seDVfaGFuZGxlX2NoYW5nZXVwcGVyX2V2ZW50KGxkZXYsICZ0cmFja2VyLCBuZGV2LAorCQkJCQkJCXB0cik7CisJCWJyZWFrOworCWNhc2UgTkVUREVWX0NIQU5HRUxPV0VSU1RBVEU6CisJCWNoYW5nZWQgPSBtbHg1X2hhbmRsZV9jaGFuZ2Vsb3dlcnN0YXRlX2V2ZW50KGxkZXYsICZ0cmFja2VyLAorCQkJCQkJCSAgICAgbmRldiwgcHRyKTsKKwkJYnJlYWs7CisJfQorCisJbXV0ZXhfbG9jaygmbGFnX211dGV4KTsKKwlsZGV2LT50cmFja2VyID0gdHJhY2tlcjsKKwltdXRleF91bmxvY2soJmxhZ19tdXRleCk7CisKKwlpZiAoY2hhbmdlZCkKKwkJbWx4NV9xdWV1ZV9ib25kX3dvcmsobGRldiwgMCk7CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWx4NV9sYWcgKm1seDVfbGFnX2Rldl9hbGxvYyh2b2lkKQoreworCXN0cnVjdCBtbHg1X2xhZyAqbGRldjsKKworCWxkZXYgPSBremFsbG9jKHNpemVvZigqbGRldiksIEdGUF9LRVJORUwpOworCWlmICghbGRldikKKwkJcmV0dXJuIE5VTEw7CisKKwlJTklUX0RFTEFZRURfV09SSygmbGRldi0+Ym9uZF93b3JrLCBtbHg1X2RvX2JvbmRfd29yayk7CisKKwlyZXR1cm4gbGRldjsKK30KKworc3RhdGljIHZvaWQgbWx4NV9sYWdfZGV2X2ZyZWUoc3RydWN0IG1seDVfbGFnICpsZGV2KQoreworCWtmcmVlKGxkZXYpOworfQorCitzdGF0aWMgdm9pZCBtbHg1X2xhZ19kZXZfYWRkX3BmKHN0cnVjdCBtbHg1X2xhZyAqbGRldiwKKwkJCQlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAorCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJdW5zaWduZWQgaW50IGZuID0gUENJX0ZVTkMoZGV2LT5wZGV2LT5kZXZmbik7CisKKwlpZiAoZm4gPj0gTUxYNV9NQVhfUE9SVFMpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmxhZ19tdXRleCk7CisJbGRldi0+cGZbZm5dLmRldiAgICA9IGRldjsKKwlsZGV2LT5wZltmbl0ubmV0ZGV2ID0gbmV0ZGV2OworCWxkZXYtPnRyYWNrZXIubmV0ZGV2X3N0YXRlW2ZuXS5saW5rX3VwID0gMDsKKwlsZGV2LT50cmFja2VyLm5ldGRldl9zdGF0ZVtmbl0udHhfZW5hYmxlZCA9IDA7CisKKwlkZXYtPnByaXYubGFnID0gbGRldjsKKwltdXRleF91bmxvY2soJmxhZ19tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIG1seDVfbGFnX2Rldl9yZW1vdmVfcGYoc3RydWN0IG1seDVfbGFnICpsZGV2LAorCQkJCSAgIHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUxYNV9NQVhfUE9SVFM7IGkrKykKKwkJaWYgKGxkZXYtPnBmW2ldLmRldiA9PSBkZXYpCisJCQlicmVhazsKKworCWlmIChpID09IE1MWDVfTUFYX1BPUlRTKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZsYWdfbXV0ZXgpOworCW1lbXNldCgmbGRldi0+cGZbaV0sIDAsIHNpemVvZigqbGRldi0+cGYpKTsKKworCWRldi0+cHJpdi5sYWcgPSBOVUxMOworCW11dGV4X3VubG9jaygmbGFnX211dGV4KTsKK30KKworCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGludGZfbXV0ZXggaGVsZCAqLwordm9pZCBtbHg1X2xhZ19hZGQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgbWx4NV9sYWcgKmxkZXYgPSBOVUxMOworCXN0cnVjdCBtbHg1X2NvcmVfZGV2ICp0bXBfZGV2OworCisJaWYgKCFNTFg1X0NBUF9HRU4oZGV2LCB2cG9ydF9ncm91cF9tYW5hZ2VyKSB8fAorCSAgICAhTUxYNV9DQVBfR0VOKGRldiwgbGFnX21hc3RlcikgfHwKKwkgICAgKE1MWDVfQ0FQX0dFTihkZXYsIG51bV9sYWdfcG9ydHMpICE9IE1MWDVfTUFYX1BPUlRTKSkKKwkJcmV0dXJuOworCisJdG1wX2RldiA9IG1seDVfZ2V0X25leHRfcGh5c19kZXYoZGV2KTsKKwlpZiAodG1wX2RldikKKwkJbGRldiA9IHRtcF9kZXYtPnByaXYubGFnOworCisJaWYgKCFsZGV2KSB7CisJCWxkZXYgPSBtbHg1X2xhZ19kZXZfYWxsb2MoKTsKKwkJaWYgKCFsZGV2KSB7CisJCQltbHg1X2NvcmVfZXJyKGRldiwgIkZhaWxlZCB0byBhbGxvYyBsYWcgZGV2XG4iKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCW1seDVfbGFnX2Rldl9hZGRfcGYobGRldiwgZGV2LCBuZXRkZXYpOworCisJaWYgKCFsZGV2LT5uYi5ub3RpZmllcl9jYWxsKSB7CisJCWxkZXYtPm5iLm5vdGlmaWVyX2NhbGwgPSBtbHg1X2xhZ19uZXRkZXZfZXZlbnQ7CisJCWlmIChyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmxkZXYtPm5iKSkgeworCQkJbGRldi0+bmIubm90aWZpZXJfY2FsbCA9IE5VTEw7CisJCQltbHg1X2NvcmVfZXJyKGRldiwgIkZhaWxlZCB0byByZWdpc3RlciBMQUcgbmV0ZGV2IG5vdGlmaWVyXG4iKTsKKwkJfQorCX0KK30KKworLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRmX211dGV4IGhlbGQgKi8KK3ZvaWQgbWx4NV9sYWdfcmVtb3ZlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpCit7CisJc3RydWN0IG1seDVfbGFnICpsZGV2OworCWludCBpOworCisJbGRldiA9IG1seDVfbGFnX2Rldl9nZXQoZGV2KTsKKwlpZiAoIWxkZXYpCisJCXJldHVybjsKKworCWlmIChtbHg1X2xhZ19pc19ib25kZWQobGRldikpCisJCW1seDVfZGVhY3RpdmF0ZV9sYWcobGRldik7CisKKwltbHg1X2xhZ19kZXZfcmVtb3ZlX3BmKGxkZXYsIGRldik7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUxYNV9NQVhfUE9SVFM7IGkrKykKKwkJaWYgKGxkZXYtPnBmW2ldLmRldikKKwkJCWJyZWFrOworCisJaWYgKGkgPT0gTUxYNV9NQVhfUE9SVFMpIHsKKwkJaWYgKGxkZXYtPm5iLm5vdGlmaWVyX2NhbGwpCisJCQl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmbGRldi0+bmIpOworCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmxkZXYtPmJvbmRfd29yayk7CisJCW1seDVfbGFnX2Rldl9mcmVlKGxkZXYpOworCX0KK30KKworYm9vbCBtbHg1X2xhZ19pc19hY3RpdmUoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgbWx4NV9sYWcgKmxkZXY7CisJYm9vbCByZXM7CisKKwltdXRleF9sb2NrKCZsYWdfbXV0ZXgpOworCWxkZXYgPSBtbHg1X2xhZ19kZXZfZ2V0KGRldik7CisJcmVzICA9IGxkZXYgJiYgbWx4NV9sYWdfaXNfYm9uZGVkKGxkZXYpOworCW11dGV4X3VubG9jaygmbGFnX211dGV4KTsKKworCXJldHVybiByZXM7Cit9CitFWFBPUlRfU1lNQk9MKG1seDVfbGFnX2lzX2FjdGl2ZSk7CisKK3N0cnVjdCBuZXRfZGV2aWNlICptbHg1X2xhZ19nZXRfcm9jZV9uZXRkZXYoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IE5VTEw7CisJc3RydWN0IG1seDVfbGFnICpsZGV2OworCisJbXV0ZXhfbG9jaygmbGFnX211dGV4KTsKKwlsZGV2ID0gbWx4NV9sYWdfZGV2X2dldChkZXYpOworCisJaWYgKCEobGRldiAmJiBtbHg1X2xhZ19pc19ib25kZWQobGRldikpKQorCQlnb3RvIHVubG9jazsKKworCWlmIChsZGV2LT50cmFja2VyLnR4X3R5cGUgPT0gTkVUREVWX0xBR19UWF9UWVBFX0FDVElWRUJBQ0tVUCkgeworCQluZGV2ID0gbGRldi0+dHJhY2tlci5uZXRkZXZfc3RhdGVbMF0udHhfZW5hYmxlZCA/CisJCSAgICAgICBsZGV2LT5wZlswXS5uZXRkZXYgOiBsZGV2LT5wZlsxXS5uZXRkZXY7CisJfSBlbHNlIHsKKwkJbmRldiA9IGxkZXYtPnBmWzBdLm5ldGRldjsKKwl9CisJaWYgKG5kZXYpCisJCWRldl9ob2xkKG5kZXYpOworCit1bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZsYWdfbXV0ZXgpOworCisJcmV0dXJuIG5kZXY7Cit9CitFWFBPUlRfU1lNQk9MKG1seDVfbGFnX2dldF9yb2NlX25ldGRldik7CisKK2Jvb2wgbWx4NV9sYWdfaW50Zl9hZGQoc3RydWN0IG1seDVfaW50ZXJmYWNlICppbnRmLCBzdHJ1Y3QgbWx4NV9wcml2ICpwcml2KQoreworCXN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYgPSBjb250YWluZXJfb2YocHJpdiwgc3RydWN0IG1seDVfY29yZV9kZXYsCisJCQkJCQkgcHJpdik7CisJc3RydWN0IG1seDVfbGFnICpsZGV2OworCisJaWYgKGludGYtPnByb3RvY29sICE9IE1MWDVfSU5URVJGQUNFX1BST1RPQ09MX0lCKQorCQlyZXR1cm4gdHJ1ZTsKKworCWxkZXYgPSBtbHg1X2xhZ19kZXZfZ2V0KGRldik7CisJaWYgKCFsZGV2IHx8ICFtbHg1X2xhZ19pc19ib25kZWQobGRldikgfHwgbGRldi0+cGZbMF0uZGV2ID09IGRldikKKwkJcmV0dXJuIHRydWU7CisKKwkvKiBJZiBib25kZWQsIHdlIGRvIG5vdCBhZGQgYW4gSUIgZGV2aWNlIGZvciBQRjEuICovCisJcmV0dXJuIGZhbHNlOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvbWFkLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvbWFkLmMKaW5kZXggMTM2OGRhYy4uM2EzYjAwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL21hZC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9tYWQuYwpAQCAtMzksMzYgKzM5LDMzIEBACiBpbnQgbWx4NV9jb3JlX21hZF9pZmMoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgY29uc3Qgdm9pZCAqaW5iLCB2b2lkICpvdXRiLAogCQkgICAgICB1MTYgb3Btb2QsIHU4IHBvcnQpCiB7Ci0Jc3RydWN0IG1seDVfbWFkX2lmY19tYm94X2luICppbiA9IE5VTEw7Ci0Jc3RydWN0IG1seDVfbWFkX2lmY19tYm94X291dCAqb3V0ID0gTlVMTDsKLQlpbnQgZXJyOworCWludCBvdXRsZW4gPSBNTFg1X1NUX1NaX0JZVEVTKG1hZF9pZmNfb3V0KTsKKwlpbnQgaW5sZW4gPSBNTFg1X1NUX1NaX0JZVEVTKG1hZF9pZmNfaW4pOworCWludCBlcnIgPSAtRU5PTUVNOworCXZvaWQgKmRhdGE7CisJdm9pZCAqcmVzcDsKKwl1MzIgKm91dDsKKwl1MzIgKmluOwogCi0JaW4gPSBremFsbG9jKHNpemVvZigqaW4pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWluKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW91dCA9IGt6YWxsb2Moc2l6ZW9mKCpvdXQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW91dCkgewotCQllcnIgPSAtRU5PTUVNOworCWluID0ga3phbGxvYyhpbmxlbiwgR0ZQX0tFUk5FTCk7CisJb3V0ID0ga3phbGxvYyhvdXRsZW4sIEdGUF9LRVJORUwpOworCWlmICghaW4gfHwgIW91dCkKIAkJZ290byBvdXQ7Ci0JfQogCi0JaW4tPmhkci5vcGNvZGUgPSBjcHVfdG9fYmUxNihNTFg1X0NNRF9PUF9NQURfSUZDKTsKLQlpbi0+aGRyLm9wbW9kID0gY3B1X3RvX2JlMTYob3Btb2QpOwotCWluLT5wb3J0ID0gcG9ydDsKKwlNTFg1X1NFVChtYWRfaWZjX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9NQURfSUZDKTsKKwlNTFg1X1NFVChtYWRfaWZjX2luLCBpbiwgb3BfbW9kLCBvcG1vZCk7CisJTUxYNV9TRVQobWFkX2lmY19pbiwgaW4sIHBvcnQsIHBvcnQpOwogCi0JbWVtY3B5KGluLT5kYXRhLCBpbmIsIHNpemVvZihpbi0+ZGF0YSkpOworCWRhdGEgPSBNTFg1X0FERFJfT0YobWFkX2lmY19pbiwgaW4sIG1hZCk7CisJbWVtY3B5KGRhdGEsIGluYiwgTUxYNV9GTERfU1pfQllURVMobWFkX2lmY19pbiwgbWFkKSk7CiAKLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZigqaW4pLCBvdXQsIHNpemVvZigqb3V0KSk7CisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbmxlbiwgb3V0LCBvdXRsZW4pOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCi0JaWYgKG91dC0+aGRyLnN0YXR1cykgewotCQllcnIgPSBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyKCZvdXQtPmhkcik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCW1lbWNweShvdXRiLCBvdXQtPmRhdGEsIHNpemVvZihvdXQtPmRhdGEpKTsKKwlyZXNwID0gTUxYNV9BRERSX09GKG1hZF9pZmNfb3V0LCBvdXQsIHJlc3BvbnNlX21hZF9wYWNrZXQpOworCW1lbWNweShvdXRiLCByZXNwLAorCSAgICAgICBNTFg1X0ZMRF9TWl9CWVRFUyhtYWRfaWZjX291dCwgcmVzcG9uc2VfbWFkX3BhY2tldCkpOwogCiBvdXQ6CiAJa2ZyZWUob3V0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvbWFpbi5jCmluZGV4IDRmNDkxZDQuLmQ5YzNjNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL21haW4uYwpAQCAtNzIsMTYgKzcyLDYgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChwcm9mX3NlbCwgcHJvZl9zZWwsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHByb2Zfc2VsLCAicHJvZmlsZSBzZWxlY3Rvci4gVmFsaWQgcmFuZ2UgMCAtIDIiKTsKIAotc3RhdGljIExJU1RfSEVBRChpbnRmX2xpc3QpOwotc3RhdGljIExJU1RfSEVBRChkZXZfbGlzdCk7Ci1zdGF0aWMgREVGSU5FX01VVEVYKGludGZfbXV0ZXgpOwotCi1zdHJ1Y3QgbWx4NV9kZXZpY2VfY29udGV4dCB7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0OwotCXN0cnVjdCBtbHg1X2ludGVyZmFjZSAgKmludGY7Ci0Jdm9pZAkJICAgICAgICpjb250ZXh0OwotfTsKLQogZW51bSB7CiAJTUxYNV9BVE9NSUNfUkVRX01PREVfQkUgPSAweDAsCiAJTUxYNV9BVE9NSUNfUkVRX01PREVfSE9TVF9FTkRJQU5ORVNTID0gMHgxLApAQCAtMzI0LDcgKzMxNCw3IEBACiAJCQkJTUxYNV9ERVZfQ0FQX0ZMQUdfRENULAogfTsKIAotc3RhdGljIHUxNiB0b19md19wa2V5X3N6KHUzMiBzaXplKQorc3RhdGljIHUxNiB0b19md19wa2V5X3N6KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiBzaXplKQogewogCXN3aXRjaCAoc2l6ZSkgewogCWNhc2UgMTI4OgpAQCAtMzQwLDcgKzMzMCw3IEBACiAJY2FzZSA0MDk2OgogCQlyZXR1cm4gNTsKIAlkZWZhdWx0OgotCQlwcl93YXJuKCJpbnZhbGlkIHBrZXkgdGFibGUgc2l6ZSAlZFxuIiwgc2l6ZSk7CisJCW1seDVfY29yZV93YXJuKGRldiwgImludmFsaWQgcGtleSB0YWJsZSBzaXplICVkXG4iLCBzaXplKTsKIAkJcmV0dXJuIDA7CiAJfQogfQpAQCAtMzYzLDEwICszNTMsNiBAQAogCU1MWDVfU0VUKHF1ZXJ5X2hjYV9jYXBfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX1FVRVJZX0hDQV9DQVApOwogCU1MWDVfU0VUKHF1ZXJ5X2hjYV9jYXBfaW4sIGluLCBvcF9tb2QsIG9wbW9kKTsKIAllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgb3V0X3N6KTsKLQlpZiAoZXJyKQotCQlnb3RvIHF1ZXJ5X2V4OwotCi0JZXJyID0gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycl92MihvdXQpOwogCWlmIChlcnIpIHsKIAkJbWx4NV9jb3JlX3dhcm4oZGV2LAogCQkJICAgICAgICJRVUVSWV9IQ0FfQ0FQIDogdHlwZSgleCkgb3Btb2RlKCV4KSBGYWlsZWQoJWQpXG4iLApAQCAtNDA5LDIwICszOTUsMTEgQEAKIAogc3RhdGljIGludCBzZXRfY2FwcyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB2b2lkICppbiwgaW50IGluX3N6LCBpbnQgb3Btb2QpCiB7Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKHNldF9oY2FfY2FwX291dCldOwotCWludCBlcnI7Ci0KLQltZW1zZXQob3V0LCAwLCBzaXplb2Yob3V0KSk7CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKHNldF9oY2FfY2FwX291dCldID0gezB9OwogCiAJTUxYNV9TRVQoc2V0X2hjYV9jYXBfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX1NFVF9IQ0FfQ0FQKTsKIAlNTFg1X1NFVChzZXRfaGNhX2NhcF9pbiwgaW4sIG9wX21vZCwgb3Btb2QgPDwgMSk7Ci0JZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbl9zeiwgb3V0LCBzaXplb2Yob3V0KSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWVyciA9IG1seDVfY21kX3N0YXR1c190b19lcnJfdjIob3V0KTsKLQotCXJldHVybiBlcnI7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgaW5fc3osIG91dCwgc2l6ZW9mKG91dCkpOwogfQogCiBzdGF0aWMgaW50IGhhbmRsZV9oY2FfY2FwX2F0b21pYyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KQpAQCAtNDkwLDcgKzQ2Nyw3IEBACiAJCSAgICAgIDEyOCk7CiAJLyogd2UgbGltaXQgdGhlIHNpemUgb2YgdGhlIHBrZXkgdGFibGUgdG8gMTI4IGVudHJpZXMgZm9yIG5vdyAqLwogCU1MWDVfU0VUKGNtZF9oY2FfY2FwLCBzZXRfaGNhX2NhcCwgcGtleV90YWJsZV9zaXplLAotCQkgdG9fZndfcGtleV9zeigxMjgpKTsKKwkJIHRvX2Z3X3BrZXlfc3ooZGV2LCAxMjgpKTsKIAogCWlmIChwcm9mLT5tYXNrICYgTUxYNV9QUk9GX01BU0tfUVBfU0laRSkKIAkJTUxYNV9TRVQoY21kX2hjYV9jYXAsIHNldF9oY2FfY2FwLCBsb2dfbWF4X3FwLApAQCAtNTI4LDM3ICs1MDUsMjIgQEAKIAogaW50IG1seDVfY29yZV9lbmFibGVfaGNhKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUxNiBmdW5jX2lkKQogewotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhlbmFibGVfaGNhX291dCldOwotCXUzMiBpbltNTFg1X1NUX1NaX0RXKGVuYWJsZV9oY2FfaW4pXTsKLQlpbnQgZXJyOworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhlbmFibGVfaGNhX291dCldID0gezB9OworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGVuYWJsZV9oY2FfaW4pXSAgID0gezB9OwogCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKIAlNTFg1X1NFVChlbmFibGVfaGNhX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9FTkFCTEVfSENBKTsKIAlNTFg1X1NFVChlbmFibGVfaGNhX2luLCBpbiwgZnVuY3Rpb25faWQsIGZ1bmNfaWQpOwotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKLQotCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCAmaW4sIHNpemVvZihpbiksICZvdXQsIHNpemVvZihvdXQpKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JcmV0dXJuIG1seDVfY21kX3N0YXR1c190b19lcnJfdjIob3V0KTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsICZpbiwgc2l6ZW9mKGluKSwgJm91dCwgc2l6ZW9mKG91dCkpOwogfQogCiBpbnQgbWx4NV9jb3JlX2Rpc2FibGVfaGNhKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUxNiBmdW5jX2lkKQogewotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkaXNhYmxlX2hjYV9vdXQpXTsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhkaXNhYmxlX2hjYV9pbildOwotCWludCBlcnI7CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRpc2FibGVfaGNhX291dCldID0gezB9OworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRpc2FibGVfaGNhX2luKV0gICA9IHswfTsKIAotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7CiAJTUxYNV9TRVQoZGlzYWJsZV9oY2FfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX0RJU0FCTEVfSENBKTsKIAlNTFg1X1NFVChkaXNhYmxlX2hjYV9pbiwgaW4sIGZ1bmN0aW9uX2lkLCBmdW5jX2lkKTsKLQltZW1zZXQob3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0JZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JcmV0dXJuIG1seDVfY21kX3N0YXR1c190b19lcnJfdjIob3V0KTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKIH0KIAogY3ljbGVfdCBtbHg1X3JlYWRfaW50ZXJuYWxfdGltZXIoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKQEAgLTc1OCw0NCArNzIwLDQwIEBACiAKIHN0YXRpYyBpbnQgbWx4NV9jb3JlX3NldF9pc3NpKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpCiB7Ci0JdTMyIHF1ZXJ5X2luW01MWDVfU1RfU1pfRFcocXVlcnlfaXNzaV9pbildOwotCXUzMiBxdWVyeV9vdXRbTUxYNV9TVF9TWl9EVyhxdWVyeV9pc3NpX291dCldOwotCXUzMiBzZXRfaW5bTUxYNV9TVF9TWl9EVyhzZXRfaXNzaV9pbildOwotCXUzMiBzZXRfb3V0W01MWDVfU1RfU1pfRFcoc2V0X2lzc2lfb3V0KV07Ci0JaW50IGVycjsKKwl1MzIgcXVlcnlfaW5bTUxYNV9TVF9TWl9EVyhxdWVyeV9pc3NpX2luKV0gICA9IHswfTsKKwl1MzIgcXVlcnlfb3V0W01MWDVfU1RfU1pfRFcocXVlcnlfaXNzaV9vdXQpXSA9IHswfTsKIAl1MzIgc3VwX2lzc2k7Ci0KLQltZW1zZXQocXVlcnlfaW4sIDAsIHNpemVvZihxdWVyeV9pbikpOwotCW1lbXNldChxdWVyeV9vdXQsIDAsIHNpemVvZihxdWVyeV9vdXQpKTsKKwlpbnQgZXJyOwogCiAJTUxYNV9TRVQocXVlcnlfaXNzaV9pbiwgcXVlcnlfaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfUVVFUllfSVNTSSk7Ci0KLQllcnIgPSBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIHF1ZXJ5X2luLCBzaXplb2YocXVlcnlfaW4pLAotCQkJCQkgcXVlcnlfb3V0LCBzaXplb2YocXVlcnlfb3V0KSk7CisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIHF1ZXJ5X2luLCBzaXplb2YocXVlcnlfaW4pLAorCQkJICAgIHF1ZXJ5X291dCwgc2l6ZW9mKHF1ZXJ5X291dCkpOwogCWlmIChlcnIpIHsKLQkJaWYgKCgoc3RydWN0IG1seDVfb3V0Ym94X2hkciAqKXF1ZXJ5X291dCktPnN0YXR1cyA9PQotCQkgICAgTUxYNV9DTURfU1RBVF9CQURfT1BfRVJSKSB7CisJCXUzMiBzeW5kcm9tZTsKKwkJdTggc3RhdHVzOworCisJCW1seDVfY21kX21ib3hfc3RhdHVzKHF1ZXJ5X291dCwgJnN0YXR1cywgJnN5bmRyb21lKTsKKwkJaWYgKHN0YXR1cyA9PSBNTFg1X0NNRF9TVEFUX0JBRF9PUF9FUlIpIHsKIAkJCXByX2RlYnVnKCJPbmx5IElTU0kgMCBpcyBzdXBwb3J0ZWRcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAotCQlwcl9lcnIoImZhaWxlZCB0byBxdWVyeSBJU1NJXG4iKTsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gcXVlcnkgSVNTSSBlcnIoJWQpXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAogCXN1cF9pc3NpID0gTUxYNV9HRVQocXVlcnlfaXNzaV9vdXQsIHF1ZXJ5X291dCwgc3VwcG9ydGVkX2lzc2lfZHcwKTsKIAogCWlmIChzdXBfaXNzaSAmICgxIDw8IDEpKSB7Ci0JCW1lbXNldChzZXRfaW4sIDAsIHNpemVvZihzZXRfaW4pKTsKLQkJbWVtc2V0KHNldF9vdXQsIDAsIHNpemVvZihzZXRfb3V0KSk7CisJCXUzMiBzZXRfaW5bTUxYNV9TVF9TWl9EVyhzZXRfaXNzaV9pbildICAgPSB7MH07CisJCXUzMiBzZXRfb3V0W01MWDVfU1RfU1pfRFcoc2V0X2lzc2lfb3V0KV0gPSB7MH07CiAKIAkJTUxYNV9TRVQoc2V0X2lzc2lfaW4sIHNldF9pbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9TRVRfSVNTSSk7CiAJCU1MWDVfU0VUKHNldF9pc3NpX2luLCBzZXRfaW4sIGN1cnJlbnRfaXNzaSwgMSk7Ci0KLQkJZXJyID0gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBzZXRfaW4sIHNpemVvZihzZXRfaW4pLAotCQkJCQkJIHNldF9vdXQsIHNpemVvZihzZXRfb3V0KSk7CisJCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBzZXRfaW4sIHNpemVvZihzZXRfaW4pLAorCQkJCSAgICBzZXRfb3V0LCBzaXplb2Yoc2V0X291dCkpOwogCQlpZiAoZXJyKSB7Ci0JCQlwcl9lcnIoImZhaWxlZCB0byBzZXQgSVNTST0xXG4iKTsKKwkJCXByX2VycigiZmFpbGVkIHRvIHNldCBJU1NJPTEgZXJyKCVkKVxuIiwgZXJyKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIApAQCAtODA5LDEyMCArNzY3LDYgQEAKIAlyZXR1cm4gLUVOT1RTVVBQOwogfQogCi1zdGF0aWMgdm9pZCBtbHg1X2FkZF9kZXZpY2Uoc3RydWN0IG1seDVfaW50ZXJmYWNlICppbnRmLCBzdHJ1Y3QgbWx4NV9wcml2ICpwcml2KQotewotCXN0cnVjdCBtbHg1X2RldmljZV9jb250ZXh0ICpkZXZfY3R4OwotCXN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYgPSBjb250YWluZXJfb2YocHJpdiwgc3RydWN0IG1seDVfY29yZV9kZXYsIHByaXYpOwotCi0JZGV2X2N0eCA9IGttYWxsb2Moc2l6ZW9mKCpkZXZfY3R4KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXZfY3R4KQotCQlyZXR1cm47Ci0KLQlkZXZfY3R4LT5pbnRmICAgID0gaW50ZjsKLQlkZXZfY3R4LT5jb250ZXh0ID0gaW50Zi0+YWRkKGRldik7Ci0KLQlpZiAoZGV2X2N0eC0+Y29udGV4dCkgewotCQlzcGluX2xvY2tfaXJxKCZwcml2LT5jdHhfbG9jayk7Ci0JCWxpc3RfYWRkX3RhaWwoJmRldl9jdHgtPmxpc3QsICZwcml2LT5jdHhfbGlzdCk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+Y3R4X2xvY2spOwotCX0gZWxzZSB7Ci0JCWtmcmVlKGRldl9jdHgpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgbWx4NV9yZW1vdmVfZGV2aWNlKHN0cnVjdCBtbHg1X2ludGVyZmFjZSAqaW50Ziwgc3RydWN0IG1seDVfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgbWx4NV9kZXZpY2VfY29udGV4dCAqZGV2X2N0eDsKLQlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2ID0gY29udGFpbmVyX29mKHByaXYsIHN0cnVjdCBtbHg1X2NvcmVfZGV2LCBwcml2KTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2X2N0eCwgJnByaXYtPmN0eF9saXN0LCBsaXN0KQotCQlpZiAoZGV2X2N0eC0+aW50ZiA9PSBpbnRmKSB7Ci0JCQlzcGluX2xvY2tfaXJxKCZwcml2LT5jdHhfbG9jayk7Ci0JCQlsaXN0X2RlbCgmZGV2X2N0eC0+bGlzdCk7Ci0JCQlzcGluX3VubG9ja19pcnEoJnByaXYtPmN0eF9sb2NrKTsKLQotCQkJaW50Zi0+cmVtb3ZlKGRldiwgZGV2X2N0eC0+Y29udGV4dCk7Ci0JCQlrZnJlZShkZXZfY3R4KTsKLQkJCXJldHVybjsKLQkJfQotfQotCi1zdGF0aWMgaW50IG1seDVfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpCi17Ci0Jc3RydWN0IG1seDVfcHJpdiAqcHJpdiA9ICZkZXYtPnByaXY7Ci0Jc3RydWN0IG1seDVfaW50ZXJmYWNlICppbnRmOwotCi0JbXV0ZXhfbG9jaygmaW50Zl9tdXRleCk7Ci0JbGlzdF9hZGRfdGFpbCgmcHJpdi0+ZGV2X2xpc3QsICZkZXZfbGlzdCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShpbnRmLCAmaW50Zl9saXN0LCBsaXN0KQotCQltbHg1X2FkZF9kZXZpY2UoaW50ZiwgcHJpdik7Ci0JbXV0ZXhfdW5sb2NrKCZpbnRmX211dGV4KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBtbHg1X3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpCi17Ci0Jc3RydWN0IG1seDVfcHJpdiAqcHJpdiA9ICZkZXYtPnByaXY7Ci0Jc3RydWN0IG1seDVfaW50ZXJmYWNlICppbnRmOwotCi0JbXV0ZXhfbG9jaygmaW50Zl9tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShpbnRmLCAmaW50Zl9saXN0LCBsaXN0KQotCQltbHg1X3JlbW92ZV9kZXZpY2UoaW50ZiwgcHJpdik7Ci0JbGlzdF9kZWwoJnByaXYtPmRldl9saXN0KTsKLQltdXRleF91bmxvY2soJmludGZfbXV0ZXgpOwotfQotCi1pbnQgbWx4NV9yZWdpc3Rlcl9pbnRlcmZhY2Uoc3RydWN0IG1seDVfaW50ZXJmYWNlICppbnRmKQotewotCXN0cnVjdCBtbHg1X3ByaXYgKnByaXY7Ci0KLQlpZiAoIWludGYtPmFkZCB8fCAhaW50Zi0+cmVtb3ZlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJmludGZfbXV0ZXgpOwotCWxpc3RfYWRkX3RhaWwoJmludGYtPmxpc3QsICZpbnRmX2xpc3QpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkocHJpdiwgJmRldl9saXN0LCBkZXZfbGlzdCkKLQkJbWx4NV9hZGRfZGV2aWNlKGludGYsIHByaXYpOwotCW11dGV4X3VubG9jaygmaW50Zl9tdXRleCk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wobWx4NV9yZWdpc3Rlcl9pbnRlcmZhY2UpOwotCi12b2lkIG1seDVfdW5yZWdpc3Rlcl9pbnRlcmZhY2Uoc3RydWN0IG1seDVfaW50ZXJmYWNlICppbnRmKQotewotCXN0cnVjdCBtbHg1X3ByaXYgKnByaXY7Ci0KLQltdXRleF9sb2NrKCZpbnRmX211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHByaXYsICZkZXZfbGlzdCwgZGV2X2xpc3QpCi0JCW1seDVfcmVtb3ZlX2RldmljZShpbnRmLCBwcml2KTsKLQlsaXN0X2RlbCgmaW50Zi0+bGlzdCk7Ci0JbXV0ZXhfdW5sb2NrKCZpbnRmX211dGV4KTsKLX0KLUVYUE9SVF9TWU1CT0wobWx4NV91bnJlZ2lzdGVyX2ludGVyZmFjZSk7Ci0KLXZvaWQgKm1seDVfZ2V0X3Byb3RvY29sX2RldihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwgaW50IHByb3RvY29sKQotewotCXN0cnVjdCBtbHg1X3ByaXYgKnByaXYgPSAmbWRldi0+cHJpdjsKLQlzdHJ1Y3QgbWx4NV9kZXZpY2VfY29udGV4dCAqZGV2X2N0eDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXZvaWQgKnJlc3VsdCA9IE5VTEw7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+Y3R4X2xvY2ssIGZsYWdzKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2X2N0eCwgJm1kZXYtPnByaXYuY3R4X2xpc3QsIGxpc3QpCi0JCWlmICgoZGV2X2N0eC0+aW50Zi0+cHJvdG9jb2wgPT0gcHJvdG9jb2wpICYmCi0JCSAgICBkZXZfY3R4LT5pbnRmLT5nZXRfZGV2KSB7Ci0JCQlyZXN1bHQgPSBkZXZfY3R4LT5pbnRmLT5nZXRfZGV2KGRldl9jdHgtPmNvbnRleHQpOwotCQkJYnJlYWs7Ci0JCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmN0eF9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotRVhQT1JUX1NZTUJPTChtbHg1X2dldF9wcm90b2NvbF9kZXYpOwogCiBzdGF0aWMgaW50IG1seDVfcGNpX2luaXQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG1seDVfcHJpdiAqcHJpdikKIHsKQEAgLTk5NSw4ICs4MzksMTAyIEBACiAJZGVidWdmc19yZW1vdmUocHJpdi0+ZGJnX3Jvb3QpOwogfQogCi0jZGVmaW5lIE1MWDVfSUJfTU9EICJtbHg1X2liIgotc3RhdGljIGludCBtbHg1X2xvYWRfb25lKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X3ByaXYgKnByaXYpCitzdGF0aWMgaW50IG1seDVfaW5pdF9vbmNlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X3ByaXYgKnByaXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkZXYtPnBkZXY7CisJaW50IGVycjsKKworCWVyciA9IG1seDVfcXVlcnlfaGNhX2NhcHMoZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInF1ZXJ5IGhjYSBmYWlsZWRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSBtbHg1X3F1ZXJ5X2JvYXJkX2lkKGRldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJxdWVyeSBib2FyZCBpZCBmYWlsZWRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSBtbHg1X2VxX2luaXQoZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIGVxXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJTUxYNV9JTklUX0RPT1JCRUxMX0xPQ0soJnByaXYtPmNxX3Vhcl9sb2NrKTsKKworCWVyciA9IG1seDVfaW5pdF9jcV90YWJsZShkZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgY3EgdGFibGVcbiIpOworCQlnb3RvIGVycl9lcV9jbGVhbnVwOworCX0KKworCW1seDVfaW5pdF9xcF90YWJsZShkZXYpOworCisJbWx4NV9pbml0X3NycV90YWJsZShkZXYpOworCisJbWx4NV9pbml0X21rZXlfdGFibGUoZGV2KTsKKworCWVyciA9IG1seDVfaW5pdF9ybF90YWJsZShkZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGluaXQgcmF0ZSBsaW1pdGluZ1xuIik7CisJCWdvdG8gZXJyX3RhYmxlc19jbGVhbnVwOworCX0KKworI2lmZGVmIENPTkZJR19NTFg1X0NPUkVfRU4KKwllcnIgPSBtbHg1X2Vzd2l0Y2hfaW5pdChkZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGluaXQgZXN3aXRjaCAlZFxuIiwgZXJyKTsKKwkJZ290byBlcnJfcmxfY2xlYW51cDsKKwl9CisjZW5kaWYKKworCWVyciA9IG1seDVfc3Jpb3ZfaW5pdChkZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGluaXQgc3Jpb3YgJWRcbiIsIGVycik7CisJCWdvdG8gZXJyX2Vzd2l0Y2hfY2xlYW51cDsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2Vzd2l0Y2hfY2xlYW51cDoKKyNpZmRlZiBDT05GSUdfTUxYNV9DT1JFX0VOCisJbWx4NV9lc3dpdGNoX2NsZWFudXAoZGV2LT5wcml2LmVzd2l0Y2gpOworCitlcnJfcmxfY2xlYW51cDoKKyNlbmRpZgorCW1seDVfY2xlYW51cF9ybF90YWJsZShkZXYpOworCitlcnJfdGFibGVzX2NsZWFudXA6CisJbWx4NV9jbGVhbnVwX21rZXlfdGFibGUoZGV2KTsKKwltbHg1X2NsZWFudXBfc3JxX3RhYmxlKGRldik7CisJbWx4NV9jbGVhbnVwX3FwX3RhYmxlKGRldik7CisJbWx4NV9jbGVhbnVwX2NxX3RhYmxlKGRldik7CisKK2Vycl9lcV9jbGVhbnVwOgorCW1seDVfZXFfY2xlYW51cChkZXYpOworCitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgbWx4NV9jbGVhbnVwX29uY2Uoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKK3sKKwltbHg1X3NyaW92X2NsZWFudXAoZGV2KTsKKyNpZmRlZiBDT05GSUdfTUxYNV9DT1JFX0VOCisJbWx4NV9lc3dpdGNoX2NsZWFudXAoZGV2LT5wcml2LmVzd2l0Y2gpOworI2VuZGlmCisJbWx4NV9jbGVhbnVwX3JsX3RhYmxlKGRldik7CisJbWx4NV9jbGVhbnVwX21rZXlfdGFibGUoZGV2KTsKKwltbHg1X2NsZWFudXBfc3JxX3RhYmxlKGRldik7CisJbWx4NV9jbGVhbnVwX3FwX3RhYmxlKGRldik7CisJbWx4NV9jbGVhbnVwX2NxX3RhYmxlKGRldik7CisJbWx4NV9lcV9jbGVhbnVwKGRldik7Cit9CisKK3N0YXRpYyBpbnQgbWx4NV9sb2FkX29uZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9wcml2ICpwcml2LAorCQkJIGJvb2wgYm9vdCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldi0+cGRldjsKIAlpbnQgZXJyOwpAQCAtMTAyOSwxMiArOTY3LDEwIEBACiAJCWdvdG8gb3V0X2VycjsKIAl9CiAKLQltbHg1X3BhZ2VhbGxvY19pbml0KGRldik7Ci0KIAllcnIgPSBtbHg1X2NvcmVfZW5hYmxlX2hjYShkZXYsIDApOwogCWlmIChlcnIpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZW5hYmxlIGhjYSBmYWlsZWRcbiIpOwotCQlnb3RvIGVycl9wYWdlYWxsb2NfY2xlYW51cDsKKwkJZ290byBlcnJfY21kX2NsZWFudXA7CiAJfQogCiAJZXJyID0gbWx4NV9jb3JlX3NldF9pc3NpKGRldik7CkBAIC0xMDg3LDM0ICsxMDIzLDIxIEBACiAKIAltbHg1X3N0YXJ0X2hlYWx0aF9wb2xsKGRldik7CiAKLQllcnIgPSBtbHg1X3F1ZXJ5X2hjYV9jYXBzKGRldik7Ci0JaWYgKGVycikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJxdWVyeSBoY2EgZmFpbGVkXG4iKTsKLQkJZ290byBlcnJfc3RvcF9wb2xsOwotCX0KLQotCWVyciA9IG1seDVfcXVlcnlfYm9hcmRfaWQoZGV2KTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInF1ZXJ5IGJvYXJkIGlkIGZhaWxlZFxuIik7CisJaWYgKGJvb3QgJiYgbWx4NV9pbml0X29uY2UoZGV2LCBwcml2KSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJzdyBvYmpzIGluaXQgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfc3RvcF9wb2xsOwogCX0KIAogCWVyciA9IG1seDVfZW5hYmxlX21zaXgoZGV2KTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImVuYWJsZSBtc2l4IGZhaWxlZFxuIik7Ci0JCWdvdG8gZXJyX3N0b3BfcG9sbDsKLQl9Ci0KLQllcnIgPSBtbHg1X2VxX2luaXQoZGV2KTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIGVxXG4iKTsKLQkJZ290byBkaXNhYmxlX21zaXg7CisJCWdvdG8gZXJyX2NsZWFudXBfb25jZTsKIAl9CiAKIAllcnIgPSBtbHg1X2FsbG9jX3V1YXJzKGRldiwgJnByaXYtPnV1YXJpKTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCBhbGxvY2F0aW5nIHVhciwgYWJvcnRpbmdcbiIpOwotCQlnb3RvIGVycl9lcV9jbGVhbnVwOworCQlnb3RvIGVycl9kaXNhYmxlX21zaXg7CiAJfQogCiAJZXJyID0gbWx4NV9zdGFydF9lcXMoZGV2KTsKQEAgLTExMzAsMTUgKzEwNTMsMTAgQEAKIAl9CiAKIAllcnIgPSBtbHg1X2lycV9zZXRfYWZmaW5pdHlfaGludHMoZGV2KTsKLQlpZiAoZXJyKQorCWlmIChlcnIpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jIGFmZmluaXR5IGhpbnQgY3B1bWFza1xuIik7Ci0KLQlNTFg1X0lOSVRfRE9PUkJFTExfTE9DSygmcHJpdi0+Y3FfdWFyX2xvY2spOwotCi0JbWx4NV9pbml0X2NxX3RhYmxlKGRldik7Ci0JbWx4NV9pbml0X3FwX3RhYmxlKGRldik7Ci0JbWx4NV9pbml0X3NycV90YWJsZShkZXYpOwotCW1seDVfaW5pdF9ta2V5X3RhYmxlKGRldik7CisJCWdvdG8gZXJyX2FmZmluaXR5X2hpbnRzOworCX0KIAogCWVyciA9IG1seDVfaW5pdF9mcyhkZXYpOwogCWlmIChlcnIpIHsKQEAgLTExNDYsMzYgKzEwNjQsMjYgQEAKIAkJZ290byBlcnJfZnM7CiAJfQogCi0JZXJyID0gbWx4NV9pbml0X3JsX3RhYmxlKGRldik7Ci0JaWYgKGVycikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gaW5pdCByYXRlIGxpbWl0aW5nXG4iKTsKLQkJZ290byBlcnJfcmw7Ci0JfQotCiAjaWZkZWYgQ09ORklHX01MWDVfQ09SRV9FTgotCWVyciA9IG1seDVfZXN3aXRjaF9pbml0KGRldik7Ci0JaWYgKGVycikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJlc3dpdGNoIGluaXQgZmFpbGVkICVkXG4iLCBlcnIpOwotCQlnb3RvIGVycl9yZWdfZGV2OwotCX0KKwltbHg1X2Vzd2l0Y2hfYXR0YWNoKGRldi0+cHJpdi5lc3dpdGNoKTsKICNlbmRpZgogCi0JZXJyID0gbWx4NV9zcmlvdl9pbml0KGRldik7CisJZXJyID0gbWx4NV9zcmlvdl9hdHRhY2goZGV2KTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgInNyaW92IGluaXQgZmFpbGVkICVkXG4iLCBlcnIpOwogCQlnb3RvIGVycl9zcmlvdjsKIAl9CiAKLQllcnIgPSBtbHg1X3JlZ2lzdGVyX2RldmljZShkZXYpOwotCWlmIChlcnIpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAibWx4NV9yZWdpc3Rlcl9kZXZpY2UgZmFpbGVkICVkXG4iLCBlcnIpOwotCQlnb3RvIGVycl9yZWdfZGV2OworCWlmIChtbHg1X2RldmljZV9yZWdpc3RlcmVkKGRldikpIHsKKwkJbWx4NV9hdHRhY2hfZGV2aWNlKGRldik7CisJfSBlbHNlIHsKKwkJZXJyID0gbWx4NV9yZWdpc3Rlcl9kZXZpY2UoZGV2KTsKKwkJaWYgKGVycikgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAibWx4NV9yZWdpc3Rlcl9kZXZpY2UgZmFpbGVkICVkXG4iLCBlcnIpOworCQkJZ290byBlcnJfcmVnX2RldjsKKwkJfQogCX0KIAotCWVyciA9IHJlcXVlc3RfbW9kdWxlX25vd2FpdChNTFg1X0lCX01PRCk7Ci0JaWYgKGVycikKLQkJcHJfaW5mbygiZmFpbGVkIHJlcXVlc3QgbW9kdWxlIG9uICVzXG4iLCBNTFg1X0lCX01PRCk7Ci0KIAljbGVhcl9iaXQoTUxYNV9JTlRFUkZBQ0VfU1RBVEVfRE9XTiwgJmRldi0+aW50Zl9zdGF0ZSk7CiAJc2V0X2JpdChNTFg1X0lOVEVSRkFDRV9TVEFURV9VUCwgJmRldi0+aW50Zl9zdGF0ZSk7CiBvdXQ6CkBAIC0xMTgzLDIzICsxMDkxLDE5IEBACiAKIAlyZXR1cm4gMDsKIAotZXJyX3NyaW92OgotCWlmIChtbHg1X3NyaW92X2NsZWFudXAoZGV2KSkKLQkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJzcmlvdiBjbGVhbnVwIGZhaWxlZFxuIik7Ci0KLSNpZmRlZiBDT05GSUdfTUxYNV9DT1JFX0VOCi0JbWx4NV9lc3dpdGNoX2NsZWFudXAoZGV2LT5wcml2LmVzd2l0Y2gpOwotI2VuZGlmCiBlcnJfcmVnX2RldjoKLQltbHg1X2NsZWFudXBfcmxfdGFibGUoZGV2KTsKLWVycl9ybDoKKwltbHg1X3NyaW92X2RldGFjaChkZXYpOworCitlcnJfc3Jpb3Y6CisjaWZkZWYgQ09ORklHX01MWDVfQ09SRV9FTgorCW1seDVfZXN3aXRjaF9kZXRhY2goZGV2LT5wcml2LmVzd2l0Y2gpOworI2VuZGlmCiAJbWx4NV9jbGVhbnVwX2ZzKGRldik7CisKIGVycl9mczoKLQltbHg1X2NsZWFudXBfbWtleV90YWJsZShkZXYpOwotCW1seDVfY2xlYW51cF9zcnFfdGFibGUoZGV2KTsKLQltbHg1X2NsZWFudXBfcXBfdGFibGUoZGV2KTsKLQltbHg1X2NsZWFudXBfY3FfdGFibGUoZGV2KTsKIAltbHg1X2lycV9jbGVhcl9hZmZpbml0eV9oaW50cyhkZXYpOworCitlcnJfYWZmaW5pdHlfaGludHM6CiAJZnJlZV9jb21wX2VxcyhkZXYpOwogCiBlcnJfc3RvcF9lcXM6CkBAIC0xMjA4LDEyICsxMTEyLDEzIEBACiBlcnJfZnJlZV91YXI6CiAJbWx4NV9mcmVlX3V1YXJzKGRldiwgJnByaXYtPnV1YXJpKTsKIAotZXJyX2VxX2NsZWFudXA6Ci0JbWx4NV9lcV9jbGVhbnVwKGRldik7Ci0KLWRpc2FibGVfbXNpeDoKK2Vycl9kaXNhYmxlX21zaXg6CiAJbWx4NV9kaXNhYmxlX21zaXgoZGV2KTsKIAorZXJyX2NsZWFudXBfb25jZToKKwlpZiAoYm9vdCkKKwkJbWx4NV9jbGVhbnVwX29uY2UoZGV2KTsKKwogZXJyX3N0b3BfcG9sbDoKIAltbHg1X3N0b3BfaGVhbHRoX3BvbGwoZGV2KTsKIAlpZiAobWx4NV9jbWRfdGVhcmRvd25faGNhKGRldikpIHsKQEAgLTEyMzAsOCArMTEzNSw3IEBACiBlcnJfZGlzYWJsZV9oY2E6CiAJbWx4NV9jb3JlX2Rpc2FibGVfaGNhKGRldiwgMCk7CiAKLWVycl9wYWdlYWxsb2NfY2xlYW51cDoKLQltbHg1X3BhZ2VhbGxvY19jbGVhbnVwKGRldik7CitlcnJfY21kX2NsZWFudXA6CiAJbWx4NV9jbWRfY2xlYW51cChkZXYpOwogCiBvdXRfZXJyOgpAQCAtMTI0MSw0MCArMTE0NSwzNSBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgbWx4NV91bmxvYWRfb25lKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X3ByaXYgKnByaXYpCitzdGF0aWMgaW50IG1seDVfdW5sb2FkX29uZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9wcml2ICpwcml2LAorCQkJICAgYm9vbCBjbGVhbnVwKQogewogCWludCBlcnIgPSAwOwogCi0JZXJyID0gbWx4NV9zcmlvdl9jbGVhbnVwKGRldik7Ci0JaWYgKGVycikgewotCQlkZXZfd2FybigmZGV2LT5wZGV2LT5kZXYsICIlczogc3Jpb3YgY2xlYW51cCBmYWlsZWQgLSBhYm9ydFxuIiwKLQkJCSBfX2Z1bmNfXyk7Ci0JCXJldHVybiBlcnI7Ci0JfQotCiAJbXV0ZXhfbG9jaygmZGV2LT5pbnRmX3N0YXRlX211dGV4KTsKIAlpZiAodGVzdF9iaXQoTUxYNV9JTlRFUkZBQ0VfU1RBVEVfRE9XTiwgJmRldi0+aW50Zl9zdGF0ZSkpIHsKIAkJZGV2X3dhcm4oJmRldi0+cGRldi0+ZGV2LCAiJXM6IGludGVyZmFjZSBpcyBkb3duLCBOT1BcbiIsCiAJCQkgX19mdW5jX18pOworCQlpZiAoY2xlYW51cCkKKwkJCW1seDVfY2xlYW51cF9vbmNlKGRldik7CiAJCWdvdG8gb3V0OwogCX0KLQltbHg1X3VucmVnaXN0ZXJfZGV2aWNlKGRldik7Ci0jaWZkZWYgQ09ORklHX01MWDVfQ09SRV9FTgotCW1seDVfZXN3aXRjaF9jbGVhbnVwKGRldi0+cHJpdi5lc3dpdGNoKTsKLSNlbmRpZgogCi0JbWx4NV9jbGVhbnVwX3JsX3RhYmxlKGRldik7CisJaWYgKG1seDVfZGV2aWNlX3JlZ2lzdGVyZWQoZGV2KSkKKwkJbWx4NV9kZXRhY2hfZGV2aWNlKGRldik7CisKKwltbHg1X3NyaW92X2RldGFjaChkZXYpOworI2lmZGVmIENPTkZJR19NTFg1X0NPUkVfRU4KKwltbHg1X2Vzd2l0Y2hfZGV0YWNoKGRldi0+cHJpdi5lc3dpdGNoKTsKKyNlbmRpZgogCW1seDVfY2xlYW51cF9mcyhkZXYpOwotCW1seDVfY2xlYW51cF9ta2V5X3RhYmxlKGRldik7Ci0JbWx4NV9jbGVhbnVwX3NycV90YWJsZShkZXYpOwotCW1seDVfY2xlYW51cF9xcF90YWJsZShkZXYpOwotCW1seDVfY2xlYW51cF9jcV90YWJsZShkZXYpOwogCW1seDVfaXJxX2NsZWFyX2FmZmluaXR5X2hpbnRzKGRldik7CiAJZnJlZV9jb21wX2VxcyhkZXYpOwogCW1seDVfc3RvcF9lcXMoZGV2KTsKIAltbHg1X2ZyZWVfdXVhcnMoZGV2LCAmcHJpdi0+dXVhcmkpOwotCW1seDVfZXFfY2xlYW51cChkZXYpOwogCW1seDVfZGlzYWJsZV9tc2l4KGRldik7CisJaWYgKGNsZWFudXApCisJCW1seDVfY2xlYW51cF9vbmNlKGRldik7CiAJbWx4NV9zdG9wX2hlYWx0aF9wb2xsKGRldik7CiAJZXJyID0gbWx4NV9jbWRfdGVhcmRvd25faGNhKGRldik7CiAJaWYgKGVycikgewpAQCAtMTI4NCw3ICsxMTgzLDYgQEAKIAltbHg1X3BhZ2VhbGxvY19zdG9wKGRldik7CiAJbWx4NV9yZWNsYWltX3N0YXJ0dXBfcGFnZXMoZGV2KTsKIAltbHg1X2NvcmVfZGlzYWJsZV9oY2EoZGV2LCAwKTsKLQltbHg1X3BhZ2VhbGxvY19jbGVhbnVwKGRldik7CiAJbWx4NV9jbWRfY2xlYW51cChkZXYpOwogCiBvdXQ6CkBAIC0xMjk0LDIyICsxMTkyLDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi12b2lkIG1seDVfY29yZV9ldmVudChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBlbnVtIG1seDVfZGV2X2V2ZW50IGV2ZW50LAotCQkgICAgIHVuc2lnbmVkIGxvbmcgcGFyYW0pCi17Ci0Jc3RydWN0IG1seDVfcHJpdiAqcHJpdiA9ICZkZXYtPnByaXY7Ci0Jc3RydWN0IG1seDVfZGV2aWNlX2NvbnRleHQgKmRldl9jdHg7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5jdHhfbG9jaywgZmxhZ3MpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZfY3R4LCAmcHJpdi0+Y3R4X2xpc3QsIGxpc3QpCi0JCWlmIChkZXZfY3R4LT5pbnRmLT5ldmVudCkKLQkJCWRldl9jdHgtPmludGYtPmV2ZW50KGRldiwgZGV2X2N0eC0+Y29udGV4dCwgZXZlbnQsIHBhcmFtKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmN0eF9sb2NrLCBmbGFncyk7Ci19Ci0KIHN0cnVjdCBtbHg1X2NvcmVfZXZlbnRfaGFuZGxlciB7CiAJdm9pZCAoKmV2ZW50KShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAogCQkgICAgICBlbnVtIG1seDVfZGV2X2V2ZW50IGV2ZW50LApAQCAtMTMyMyw2ICsxMjA1LDcgQEAKICNlbmRpZgogfTsKIAorI2RlZmluZSBNTFg1X0lCX01PRCAibWx4NV9pYiIKIHN0YXRpYyBpbnQgaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CkBAIC0xMzQ0LDggKzEyMjcsOSBAQAogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOwogCiAJaWYgKHByb2Zfc2VsIDwgMCB8fCBwcm9mX3NlbCA+PSBBUlJBWV9TSVpFKHByb2ZpbGUpKSB7Ci0JCXByX3dhcm4oInNlbGVjdGVkIHByb2ZpbGUgb3V0IG9mIHJhbmdlLCBzZWxlY3RpbmcgZGVmYXVsdCAoJWQpXG4iLAotCQkJTUxYNV9ERUZBVUxUX1BST0YpOworCQltbHg1X2NvcmVfd2FybihkZXYsCisJCQkgICAgICAgInNlbGVjdGVkIHByb2ZpbGUgb3V0IG9mIHJhbmdlLCBzZWxlY3RpbmcgZGVmYXVsdCAoJWQpXG4iLAorCQkJICAgICAgIE1MWDVfREVGQVVMVF9QUk9GKTsKIAkJcHJvZl9zZWwgPSBNTFg1X0RFRkFVTFRfUFJPRjsKIAl9CiAJZGV2LT5wcm9maWxlID0gJnByb2ZpbGVbcHJvZl9zZWxdOwpAQCAtMTM2OCwxMiArMTI1MiwxOCBAQAogCQlnb3RvIGNsb3NlX3BjaTsKIAl9CiAKLQllcnIgPSBtbHg1X2xvYWRfb25lKGRldiwgcHJpdik7CisJbWx4NV9wYWdlYWxsb2NfaW5pdChkZXYpOworCisJZXJyID0gbWx4NV9sb2FkX29uZShkZXYsIHByaXYsIHRydWUpOwogCWlmIChlcnIpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAibWx4NV9sb2FkX29uZSBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVkXG4iLCBlcnIpOwogCQlnb3RvIGNsZWFuX2hlYWx0aDsKIAl9CiAKKwllcnIgPSByZXF1ZXN0X21vZHVsZV9ub3dhaXQoTUxYNV9JQl9NT0QpOworCWlmIChlcnIpCisJCXByX2luZm8oImZhaWxlZCByZXF1ZXN0IG1vZHVsZSBvbiAlc1xuIiwgTUxYNV9JQl9NT0QpOworCiAJZXJyID0gZGV2bGlua19yZWdpc3RlcihkZXZsaW5rLCAmcGRldi0+ZGV2KTsKIAlpZiAoZXJyKQogCQlnb3RvIGNsZWFuX2xvYWQ7CkBAIC0xMzgxLDggKzEyNzEsOSBAQAogCXJldHVybiAwOwogCiBjbGVhbl9sb2FkOgotCW1seDVfdW5sb2FkX29uZShkZXYsIHByaXYpOworCW1seDVfdW5sb2FkX29uZShkZXYsIHByaXYsIHRydWUpOwogY2xlYW5faGVhbHRoOgorCW1seDVfcGFnZWFsbG9jX2NsZWFudXAoZGV2KTsKIAltbHg1X2hlYWx0aF9jbGVhbnVwKGRldik7CiBjbG9zZV9wY2k6CiAJbWx4NV9wY2lfY2xvc2UoZGV2LCBwcml2KTsKQEAgLTE0MDAsMTEgKzEyOTEsMTUgQEAKIAlzdHJ1Y3QgbWx4NV9wcml2ICpwcml2ID0gJmRldi0+cHJpdjsKIAogCWRldmxpbmtfdW5yZWdpc3RlcihkZXZsaW5rKTsKLQlpZiAobWx4NV91bmxvYWRfb25lKGRldiwgcHJpdikpIHsKKwltbHg1X3VucmVnaXN0ZXJfZGV2aWNlKGRldik7CisKKwlpZiAobWx4NV91bmxvYWRfb25lKGRldiwgcHJpdiwgdHJ1ZSkpIHsKIAkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJtbHg1X3VubG9hZF9vbmUgZmFpbGVkXG4iKTsKIAkJbWx4NV9oZWFsdGhfY2xlYW51cChkZXYpOwogCQlyZXR1cm47CiAJfQorCisJbWx4NV9wYWdlYWxsb2NfY2xlYW51cChkZXYpOwogCW1seDVfaGVhbHRoX2NsZWFudXAoZGV2KTsKIAltbHg1X3BjaV9jbG9zZShkZXYsIHByaXYpOwogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKQEAgLTE0MTksMzcgKzEzMTQsMTMgQEAKIAogCWRldl9pbmZvKCZwZGV2LT5kZXYsICIlcyB3YXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CiAJbWx4NV9lbnRlcl9lcnJvcl9zdGF0ZShkZXYpOwotCW1seDVfdW5sb2FkX29uZShkZXYsIHByaXYpOworCW1seDVfdW5sb2FkX29uZShkZXYsIHByaXYsIGZhbHNlKTsKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKIAltbHg1X3BjaV9kaXNhYmxlX2RldmljZShkZXYpOwogCXJldHVybiBzdGF0ZSA9PSBwY2lfY2hhbm5lbF9pb19wZXJtX2ZhaWx1cmUgPwogCQlQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUIDogUENJX0VSU19SRVNVTFRfTkVFRF9SRVNFVDsKIH0KIAotc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QgbWx4NV9wY2lfc2xvdF9yZXNldChzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCWludCBlcnIgPSAwOwotCi0JZGV2X2luZm8oJnBkZXYtPmRldiwgIiVzIHdhcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKLQotCWVyciA9IG1seDVfcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBtbHg1X3BjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCB3aXRoIGVycm9yIGNvZGU6ICVkXG4iCi0JCQksIF9fZnVuY19fLCBlcnIpOwotCQlyZXR1cm4gUENJX0VSU19SRVNVTFRfRElTQ09OTkVDVDsKLQl9Ci0JcGNpX3NldF9tYXN0ZXIocGRldik7Ci0JcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOwotCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOwotCi0JcmV0dXJuIGVyciA/IFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1QgOiBQQ0lfRVJTX1JFU1VMVF9SRUNPVkVSRUQ7Ci19Ci0KLXZvaWQgbWx4NV9kaXNhYmxlX2RldmljZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KQotewotCW1seDVfcGNpX2Vycl9kZXRlY3RlZChkZXYtPnBkZXYsIDApOwotfQotCiAvKiB3YWl0IGZvciB0aGUgZGV2aWNlIHRvIHNob3cgdml0YWwgc2lnbnMgYnkgd2FpdGluZwogICogZm9yIHRoZSBoZWFsdGggY291bnRlciB0byBzdGFydCBjb3VudGluZy4KICAqLwpAQCAtMTQ3Nyw2ICsxMzQ4LDM2IEBACiAJcmV0dXJuIC1FVElNRURPVVQ7CiB9CiAKK3N0YXRpYyBwY2lfZXJzX3Jlc3VsdF90IG1seDVfcGNpX3Nsb3RfcmVzZXQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgZXJyOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIiVzIHdhcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKKworCWVyciA9IG1seDVfcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBtbHg1X3BjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCB3aXRoIGVycm9yIGNvZGU6ICVkXG4iCisJCQksIF9fZnVuY19fLCBlcnIpOworCQlyZXR1cm4gUENJX0VSU19SRVNVTFRfRElTQ09OTkVDVDsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKworCWlmICh3YWl0X3ZpdGFsKHBkZXYpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiB3YWl0X3ZpdGFsIHRpbWVkIG91dFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gUENJX0VSU19SRVNVTFRfRElTQ09OTkVDVDsKKwl9CisKKwlyZXR1cm4gUENJX0VSU19SRVNVTFRfUkVDT1ZFUkVEOworfQorCit2b2lkIG1seDVfZGlzYWJsZV9kZXZpY2Uoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKK3sKKwltbHg1X3BjaV9lcnJfZGV0ZWN0ZWQoZGV2LT5wZGV2LCAwKTsKK30KKwogc3RhdGljIHZvaWQgbWx4NV9wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CkBAIC0xNDg1LDE0ICsxMzg2LDcgQEAKIAogCWRldl9pbmZvKCZwZGV2LT5kZXYsICIlcyB3YXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CiAKLQlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKLQllcnIgPSB3YWl0X3ZpdGFsKHBkZXYpOwotCWlmIChlcnIpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IHdhaXRfdml0YWwgdGltZWQgb3V0XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQllcnIgPSBtbHg1X2xvYWRfb25lKGRldiwgcHJpdik7CisJZXJyID0gbWx4NV9sb2FkX29uZShkZXYsIHByaXYsIGZhbHNlKTsKIAlpZiAoZXJyKQogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogbWx4NV9sb2FkX29uZSBmYWlsZWQgd2l0aCBlcnJvciBjb2RlOiAlZFxuIgogCQkJLCBfX2Z1bmNfXywgZXJyKTsKQEAgLTE1MTQsNyArMTQwOCw3IEBACiAJZGV2X2luZm8oJnBkZXYtPmRldiwgIlNodXRkb3duIHdhcyBjYWxsZWRcbiIpOwogCS8qIE5vdGlmeSBtbHg1IGNsaWVudHMgdGhhdCB0aGUga2VybmVsIGlzIGJlaW5nIHNodXQgZG93biAqLwogCXNldF9iaXQoTUxYNV9JTlRFUkZBQ0VfU1RBVEVfU0hVVERPV04sICZkZXYtPmludGZfc3RhdGUpOwotCW1seDVfdW5sb2FkX29uZShkZXYsIHByaXYpOworCW1seDVfdW5sb2FkX29uZShkZXYsIHByaXYsIGZhbHNlKTsKIAltbHg1X3BjaV9kaXNhYmxlX2RldmljZShkZXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvbWNnLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvbWNnLmMKaW5kZXggZDVhMGMyZC4uYmEyYjA5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL21jZy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9tY2cuYwpAQCAtMzcsNzAgKzM3LDMwIEBACiAjaW5jbHVkZSA8cmRtYS9pYl92ZXJicy5oPgogI2luY2x1ZGUgIm1seDVfY29yZS5oIgogCi1zdHJ1Y3QgbWx4NV9hdHRhY2hfbWNnX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JX19iZTMyCQkJcXBuOwotCV9fYmUzMgkJCXJzdmQ7Ci0JdTgJCQlnaWRbMTZdOwotfTsKLQotc3RydWN0IG1seDVfYXR0YWNoX21jZ19tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JdTgJCQlyc3ZmWzhdOwotfTsKLQotc3RydWN0IG1seDVfZGV0YWNoX21jZ19tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCV9fYmUzMgkJCXFwbjsKLQlfX2JlMzIJCQlyc3ZkOwotCXU4CQkJZ2lkWzE2XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2RldGFjaF9tY2dfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCXU4CQkJcnN2Zls4XTsKLX07Ci0KIGludCBtbHg1X2NvcmVfYXR0YWNoX21jZyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1bmlvbiBpYl9naWQgKm1naWQsIHUzMiBxcG4pCiB7Ci0Jc3RydWN0IG1seDVfYXR0YWNoX21jZ19tYm94X2luIGluOwotCXN0cnVjdCBtbHg1X2F0dGFjaF9tY2dfbWJveF9vdXQgb3V0OwotCWludCBlcnI7CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGF0dGFjaF90b19tY2dfb3V0KV0gPSB7MH07CisJdTMyIGluW01MWDVfU1RfU1pfRFcoYXR0YWNoX3RvX21jZ19pbildICAgPSB7MH07CisJdm9pZCAqZ2lkOwogCi0JbWVtc2V0KCZpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KCZvdXQsIDAsIHNpemVvZihvdXQpKTsKLQlpbi5oZHIub3Bjb2RlID0gY3B1X3RvX2JlMTYoTUxYNV9DTURfT1BfQVRUQUNIX1RPX01DRyk7Ci0JbWVtY3B5KGluLmdpZCwgbWdpZCwgc2l6ZW9mKCptZ2lkKSk7Ci0JaW4ucXBuID0gY3B1X3RvX2JlMzIocXBuKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgJmluLCBzaXplb2YoaW4pLCAmb3V0LCBzaXplb2Yob3V0KSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWlmIChvdXQuaGRyLnN0YXR1cykKLQkJZXJyID0gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycigmb3V0Lmhkcik7Ci0KLQlyZXR1cm4gZXJyOworCU1MWDVfU0VUKGF0dGFjaF90b19tY2dfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX0FUVEFDSF9UT19NQ0cpOworCU1MWDVfU0VUKGF0dGFjaF90b19tY2dfaW4sIGluLCBxcG4sIHFwbik7CisJZ2lkID0gTUxYNV9BRERSX09GKGF0dGFjaF90b19tY2dfaW4sIGluLCBtdWx0aWNhc3RfZ2lkKTsKKwltZW1jcHkoZ2lkLCBtZ2lkLCBzaXplb2YoKm1naWQpKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKIH0KIEVYUE9SVF9TWU1CT0wobWx4NV9jb3JlX2F0dGFjaF9tY2cpOwogCiBpbnQgbWx4NV9jb3JlX2RldGFjaF9tY2coc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdW5pb24gaWJfZ2lkICptZ2lkLCB1MzIgcXBuKQogewotCXN0cnVjdCBtbHg1X2RldGFjaF9tY2dfbWJveF9pbiBpbjsKLQlzdHJ1Y3QgbWx4NV9kZXRhY2hfbWNnX21ib3hfb3V0IG91dDsKLQlpbnQgZXJyOworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZXRhY2hfZnJvbV9tY2dfb3V0KV0gPSB7MH07CisJdTMyIGluW01MWDVfU1RfU1pfRFcoZGV0YWNoX2Zyb21fbWNnX2luKV0gICA9IHswfTsKKwl2b2lkICpnaWQ7CiAKLQltZW1zZXQoJmluLCAwLCBzaXplb2YoaW4pKTsKLQltZW1zZXQoJm91dCwgMCwgc2l6ZW9mKG91dCkpOwotCWluLmhkci5vcGNvZGUgPSBjcHVfdG9fYmUxNihNTFg1X0NNRF9PUF9ERVRUQUNIX0ZST01fTUNHKTsKLQltZW1jcHkoaW4uZ2lkLCBtZ2lkLCBzaXplb2YoKm1naWQpKTsKLQlpbi5xcG4gPSBjcHVfdG9fYmUzMihxcG4pOwotCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCAmaW4sIHNpemVvZihpbiksICZvdXQsIHNpemVvZihvdXQpKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKG91dC5oZHIuc3RhdHVzKQotCQllcnIgPSBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyKCZvdXQuaGRyKTsKLQotCXJldHVybiBlcnI7CisJTUxYNV9TRVQoZGV0YWNoX2Zyb21fbWNnX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9ERVRBQ0hfRlJPTV9NQ0cpOworCU1MWDVfU0VUKGRldGFjaF9mcm9tX21jZ19pbiwgaW4sIHFwbiwgcXBuKTsKKwlnaWQgPSBNTFg1X0FERFJfT0YoZGV0YWNoX2Zyb21fbWNnX2luLCBpbiwgbXVsdGljYXN0X2dpZCk7CisJbWVtY3B5KGdpZCwgbWdpZCwgc2l6ZW9mKCptZ2lkKSk7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiBFWFBPUlRfU1lNQk9MKG1seDVfY29yZV9kZXRhY2hfbWNnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9tbHg1X2NvcmUuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9tbHg1X2NvcmUuaAppbmRleCAyZjg2ZWM2Li4zZDBjZmI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvbWx4NV9jb3JlLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL21seDVfY29yZS5oCkBAIC01OCw4ICs1OCw4IEBACiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIG1seDVfY29yZV9lcnIoX19kZXYsIGZvcm1hdCwgLi4uKQkJCQlcCi0JZGV2X2VycigmKF9fZGV2KS0+cGRldi0+ZGV2LCAiJXM6JXM6JWQ6KHBpZCAlZCk6ICIgZm9ybWF0LAlcCi0JICAgICAgIChfX2RldiktPnByaXYubmFtZSwgX19mdW5jX18sIF9fTElORV9fLCBjdXJyZW50LT5waWQsCVwKKwlkZXZfZXJyKCYoX19kZXYpLT5wZGV2LT5kZXYsICIlczolZDoocGlkICVkKTogIiBmb3JtYXQsCVwKKwkJX19mdW5jX18sIF9fTElORV9fLCBjdXJyZW50LT5waWQsCVwKIAkgICAgICAgIyNfX1ZBX0FSR1NfXykKIAogI2RlZmluZSBtbHg1X2NvcmVfd2FybihfX2RldiwgZm9ybWF0LCAuLi4pCQkJCVwKQEAgLTc1LDE5ICs3NSw2IEBACiAJTUxYNV9DTURfVElNRSwgLyogcHJpbnQgY29tbWFuZCBleGVjdXRpb24gdGltZSAqLwogfTsKIAotc3RhdGljIGlubGluZSBpbnQgbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyICppbiwKLQkJCQkJICAgICBpbnQgaW5fc2l6ZSwgdTMyICpvdXQsCi0JCQkJCSAgICAgaW50IG91dF9zaXplKQotewotCWludCBlcnI7Ci0KLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIGluX3NpemUsIG91dCwgb3V0X3NpemUpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlyZXR1cm4gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycigoc3RydWN0IG1seDVfb3V0Ym94X2hkciAqKW91dCk7Ci19Ci0KIGludCBtbHg1X3F1ZXJ5X2hjYV9jYXBzKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOwogaW50IG1seDVfcXVlcnlfYm9hcmRfaWQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7CiBpbnQgbWx4NV9jbWRfaW5pdF9oY2Eoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7CkBAIC05Niw3ICs4MywxMiBAQAogCQkgICAgIHVuc2lnbmVkIGxvbmcgcGFyYW0pOwogdm9pZCBtbHg1X2VudGVyX2Vycm9yX3N0YXRlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOwogdm9pZCBtbHg1X2Rpc2FibGVfZGV2aWNlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOworaW50IG1seDVfc3Jpb3ZfaW5pdChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKK3ZvaWQgbWx4NV9zcmlvdl9jbGVhbnVwKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOworaW50IG1seDVfc3Jpb3ZfYXR0YWNoKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOwordm9pZCBtbHg1X3NyaW92X2RldGFjaChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKIGludCBtbHg1X2NvcmVfc3Jpb3ZfY29uZmlndXJlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBudW1fdmZzKTsKK2Jvb2wgbWx4NV9zcmlvdl9pc19lbmFibGVkKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOwogaW50IG1seDVfY29yZV9lbmFibGVfaGNhKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUxNiBmdW5jX2lkKTsKIGludCBtbHg1X2NvcmVfZGlzYWJsZV9oY2Eoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTE2IGZ1bmNfaWQpOwogaW50IG1seDVfd2FpdF9mb3JfdmZfcGFnZXMoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7CkBAIC0xMDUsNyArOTcsMzggQEAKIHN0cnVjdCBtbHg1X2VxICptbHg1X2VxbjJlcShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBpbnQgZXFuKTsKIHZvaWQgbWx4NV9jcV90YXNrbGV0X2NiKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKK3ZvaWQgbWx4NV9sYWdfYWRkKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwordm9pZCBtbHg1X2xhZ19yZW1vdmUoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7CisKK3ZvaWQgbWx4NV9hZGRfZGV2aWNlKHN0cnVjdCBtbHg1X2ludGVyZmFjZSAqaW50Ziwgc3RydWN0IG1seDVfcHJpdiAqcHJpdik7Cit2b2lkIG1seDVfcmVtb3ZlX2RldmljZShzdHJ1Y3QgbWx4NV9pbnRlcmZhY2UgKmludGYsIHN0cnVjdCBtbHg1X3ByaXYgKnByaXYpOwordm9pZCBtbHg1X2F0dGFjaF9kZXZpY2Uoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7Cit2b2lkIG1seDVfZGV0YWNoX2RldmljZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKK2Jvb2wgbWx4NV9kZXZpY2VfcmVnaXN0ZXJlZChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKK2ludCBtbHg1X3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKK3ZvaWQgbWx4NV91bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKK3ZvaWQgbWx4NV9hZGRfZGV2X2J5X3Byb3RvY29sKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIGludCBwcm90b2NvbCk7Cit2b2lkIG1seDVfcmVtb3ZlX2Rldl9ieV9wcm90b2NvbChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBpbnQgcHJvdG9jb2wpOworc3RydWN0IG1seDVfY29yZV9kZXYgKm1seDVfZ2V0X25leHRfcGh5c19kZXYoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7Cit2b2lkIG1seDVfZGV2X2xpc3RfbG9jayh2b2lkKTsKK3ZvaWQgbWx4NV9kZXZfbGlzdF91bmxvY2sodm9pZCk7CitpbnQgbWx4NV9kZXZfbGlzdF90cnlsb2NrKHZvaWQpOworCitib29sIG1seDVfbGFnX2ludGZfYWRkKHN0cnVjdCBtbHg1X2ludGVyZmFjZSAqaW50Ziwgc3RydWN0IG1seDVfcHJpdiAqcHJpdik7CisKIHZvaWQgbWx4NWVfaW5pdCh2b2lkKTsKIHZvaWQgbWx4NWVfY2xlYW51cCh2b2lkKTsKIAorc3RhdGljIGlubGluZSBpbnQgbWx4NV9sYWdfaXNfbGFjcF9vd25lcihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KQoreworCS8qIExBQ1Agb3duZXIgY29uZGl0aW9uczoKKwkgKiAxKSBGdW5jdGlvbiBpcyBwaHlzaWNhbC4KKwkgKiAyKSBMQUcgaXMgc3VwcG9ydGVkIGJ5IEZXLgorCSAqIDMpIExBRyBpcyBtYW5hZ2VkIGJ5IGRyaXZlciAoY3VycmVudGx5IHRoZSBvbmx5IG9wdGlvbikuCisJICovCisJcmV0dXJuICBNTFg1X0NBUF9HRU4oZGV2LCB2cG9ydF9ncm91cF9tYW5hZ2VyKSAmJgorCQkgICAoTUxYNV9DQVBfR0VOKGRldiwgbnVtX2xhZ19wb3J0cykgPiAxKSAmJgorCQkgICAgTUxYNV9DQVBfR0VOKGRldiwgbGFnX21hc3Rlcik7Cit9CisKICNlbmRpZiAvKiBfX01MWDVfQ09SRV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9tci5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL21yLmMKaW5kZXggNzdhNzI5MzkuLmI5NzM2ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9tci5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9tci5jCkBAIC00OSw0OCArNDksNDMgQEAKIHsKIH0KIAotaW50IG1seDVfY29yZV9jcmVhdGVfbWtleShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAotCQkJICBzdHJ1Y3QgbWx4NV9jb3JlX21rZXkgKm1rZXksCi0JCQkgIHN0cnVjdCBtbHg1X2NyZWF0ZV9ta2V5X21ib3hfaW4gKmluLCBpbnQgaW5sZW4sCi0JCQkgIG1seDVfY21kX2Nia190IGNhbGxiYWNrLCB2b2lkICpjb250ZXh0LAotCQkJICBzdHJ1Y3QgbWx4NV9jcmVhdGVfbWtleV9tYm94X291dCAqb3V0KQoraW50IG1seDVfY29yZV9jcmVhdGVfbWtleV9jYihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAorCQkJICAgICBzdHJ1Y3QgbWx4NV9jb3JlX21rZXkgKm1rZXksCisJCQkgICAgIHUzMiAqaW4sIGludCBpbmxlbiwKKwkJCSAgICAgdTMyICpvdXQsIGludCBvdXRsZW4sCisJCQkgICAgIG1seDVfY21kX2Nia190IGNhbGxiYWNrLCB2b2lkICpjb250ZXh0KQogewogCXN0cnVjdCBtbHg1X21rZXlfdGFibGUgKnRhYmxlID0gJmRldi0+cHJpdi5ta2V5X3RhYmxlOwotCXN0cnVjdCBtbHg1X2NyZWF0ZV9ta2V5X21ib3hfb3V0IGxvdXQ7CisJdTMyIGxvdXRbTUxYNV9TVF9TWl9EVyhjcmVhdGVfbWtleV9vdXQpXSA9IHswfTsKKwl1MzIgbWtleV9pbmRleDsKKwl2b2lkICpta2M7CiAJaW50IGVycjsKIAl1OCBrZXk7CiAKLQltZW1zZXQoJmxvdXQsIDAsIHNpemVvZihsb3V0KSk7CiAJc3Bpbl9sb2NrX2lycSgmZGV2LT5wcml2Lm1rZXlfbG9jayk7CiAJa2V5ID0gZGV2LT5wcml2Lm1rZXlfa2V5Kys7CiAJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPnByaXYubWtleV9sb2NrKTsKLQlpbi0+c2VnLnFwbl9ta2V5N18wIHw9IGNwdV90b19iZTMyKGtleSk7Ci0JaW4tPmhkci5vcGNvZGUgPSBjcHVfdG9fYmUxNihNTFg1X0NNRF9PUF9DUkVBVEVfTUtFWSk7Ci0JaWYgKGNhbGxiYWNrKSB7Ci0JCWVyciA9IG1seDVfY21kX2V4ZWNfY2IoZGV2LCBpbiwgaW5sZW4sIG91dCwgc2l6ZW9mKCpvdXQpLAotCQkJCSAgICAgICBjYWxsYmFjaywgY29udGV4dCk7CisJbWtjID0gTUxYNV9BRERSX09GKGNyZWF0ZV9ta2V5X2luLCBpbiwgbWVtb3J5X2tleV9ta2V5X2VudHJ5KTsKKworCU1MWDVfU0VUKGNyZWF0ZV9ta2V5X2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9DUkVBVEVfTUtFWSk7CisJTUxYNV9TRVQobWtjLCBta2MsIG1rZXlfN18wLCBrZXkpOworCisJaWYgKGNhbGxiYWNrKQorCQlyZXR1cm4gbWx4NV9jbWRfZXhlY19jYihkZXYsIGluLCBpbmxlbiwgb3V0LCBvdXRsZW4sCisJCQkJCWNhbGxiYWNrLCBjb250ZXh0KTsKKworCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgaW5sZW4sIGxvdXQsIHNpemVvZihsb3V0KSk7CisJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQl9IGVsc2UgewotCQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIGlubGVuLCAmbG91dCwgc2l6ZW9mKGxvdXQpKTsKLQl9CiAKLQlpZiAoZXJyKSB7Ci0JCW1seDVfY29yZV9kYmcoZGV2LCAiY21kIGV4ZWMgZmFpbGVkICVkXG4iLCBlcnIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCWlmIChsb3V0Lmhkci5zdGF0dXMpIHsKLQkJbWx4NV9jb3JlX2RiZyhkZXYsICJzdGF0dXMgJWRcbiIsIGxvdXQuaGRyLnN0YXR1cyk7Ci0JCXJldHVybiBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyKCZsb3V0Lmhkcik7Ci0JfQotCi0JbWtleS0+aW92YSA9IGJlNjRfdG9fY3B1KGluLT5zZWcuc3RhcnRfYWRkcik7Ci0JbWtleS0+c2l6ZSA9IGJlNjRfdG9fY3B1KGluLT5zZWcubGVuKTsKLQlta2V5LT5rZXkgPSBtbHg1X2lkeF90b19ta2V5KGJlMzJfdG9fY3B1KGxvdXQubWtleSkgJiAweGZmZmZmZikgfCBrZXk7Ci0JbWtleS0+cGQgPSBiZTMyX3RvX2NwdShpbi0+c2VnLmZsYWdzX3BkKSAmIDB4ZmZmZmZmOworCW1rZXlfaW5kZXggPSBNTFg1X0dFVChjcmVhdGVfbWtleV9vdXQsIGxvdXQsIG1rZXlfaW5kZXgpOworCW1rZXktPmlvdmEgPSBNTFg1X0dFVDY0KG1rYywgbWtjLCBzdGFydF9hZGRyKTsKKwlta2V5LT5zaXplID0gTUxYNV9HRVQ2NChta2MsIG1rYywgbGVuKTsKKwlta2V5LT5rZXkgPSBtbHg1X2lkeF90b19ta2V5KG1rZXlfaW5kZXgpIHwga2V5OworCW1rZXktPnBkID0gTUxYNV9HRVQobWtjLCBta2MsIHBkKTsKIAogCW1seDVfY29yZV9kYmcoZGV2LCAib3V0IDB4JXgsIGtleSAweCV4LCBta2V5IDB4JXhcbiIsCi0JCSAgICAgIGJlMzJfdG9fY3B1KGxvdXQubWtleSksIGtleSwgbWtleS0+a2V5KTsKKwkJICAgICAgbWtleV9pbmRleCwga2V5LCBta2V5LT5rZXkpOwogCiAJLyogY29ubmVjdCB0byBta2V5IHRyZWUgKi8KIAl3cml0ZV9sb2NrX2lycSgmdGFibGUtPmxvY2spOwpAQCAtMTA0LDIwICs5OSwyNSBAQAogCiAJcmV0dXJuIGVycjsKIH0KK0VYUE9SVF9TWU1CT0wobWx4NV9jb3JlX2NyZWF0ZV9ta2V5X2NiKTsKKworaW50IG1seDVfY29yZV9jcmVhdGVfbWtleShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAorCQkJICBzdHJ1Y3QgbWx4NV9jb3JlX21rZXkgKm1rZXksCisJCQkgIHUzMiAqaW4sIGludCBpbmxlbikKK3sKKwlyZXR1cm4gbWx4NV9jb3JlX2NyZWF0ZV9ta2V5X2NiKGRldiwgbWtleSwgaW4sIGlubGVuLAorCQkJCQlOVUxMLCAwLCBOVUxMLCBOVUxMKTsKK30KIEVYUE9SVF9TWU1CT0wobWx4NV9jb3JlX2NyZWF0ZV9ta2V5KTsKIAogaW50IG1seDVfY29yZV9kZXN0cm95X21rZXkoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKIAkJCSAgIHN0cnVjdCBtbHg1X2NvcmVfbWtleSAqbWtleSkKIHsKIAlzdHJ1Y3QgbWx4NV9ta2V5X3RhYmxlICp0YWJsZSA9ICZkZXYtPnByaXYubWtleV90YWJsZTsKLQlzdHJ1Y3QgbWx4NV9kZXN0cm95X21rZXlfbWJveF9pbiBpbjsKLQlzdHJ1Y3QgbWx4NV9kZXN0cm95X21rZXlfbWJveF9vdXQgb3V0OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZXN0cm95X21rZXlfb3V0KV0gPSB7MH07CisJdTMyIGluW01MWDVfU1RfU1pfRFcoZGVzdHJveV9ta2V5X2luKV0gICA9IHswfTsKIAlzdHJ1Y3QgbWx4NV9jb3JlX21rZXkgKmRlbGV0ZWRfbWtleTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBlcnI7Ci0KLQltZW1zZXQoJmluLCAwLCBzaXplb2YoaW4pKTsKLQltZW1zZXQoJm91dCwgMCwgc2l6ZW9mKG91dCkpOwogCiAJd3JpdGVfbG9ja19pcnFzYXZlKCZ0YWJsZS0+bG9jaywgZmxhZ3MpOwogCWRlbGV0ZWRfbWtleSA9IHJhZGl4X3RyZWVfZGVsZXRlKCZ0YWJsZS0+dHJlZSwgbWx4NV9iYXNlX21rZXkobWtleS0+a2V5KSk7CkBAIC0xMjgsOTQgKzEyOCw3MSBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQlpbi5oZHIub3Bjb2RlID0gY3B1X3RvX2JlMTYoTUxYNV9DTURfT1BfREVTVFJPWV9NS0VZKTsKLQlpbi5ta2V5ID0gY3B1X3RvX2JlMzIobWx4NV9ta2V5X3RvX2lkeChta2V5LT5rZXkpKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgJmluLCBzaXplb2YoaW4pLCAmb3V0LCBzaXplb2Yob3V0KSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWlmIChvdXQuaGRyLnN0YXR1cykKLQkJcmV0dXJuIG1seDVfY21kX3N0YXR1c190b19lcnIoJm91dC5oZHIpOwotCi0JcmV0dXJuIGVycjsKKwlNTFg1X1NFVChkZXN0cm95X21rZXlfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX0RFU1RST1lfTUtFWSk7CisJTUxYNV9TRVQoZGVzdHJveV9ta2V5X2luLCBpbiwgbWtleV9pbmRleCwgbWx4NV9ta2V5X3RvX2lkeChta2V5LT5rZXkpKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKIH0KIEVYUE9SVF9TWU1CT0wobWx4NV9jb3JlX2Rlc3Ryb3lfbWtleSk7CiAKIGludCBtbHg1X2NvcmVfcXVlcnlfbWtleShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9jb3JlX21rZXkgKm1rZXksCi0JCQkgc3RydWN0IG1seDVfcXVlcnlfbWtleV9tYm94X291dCAqb3V0LCBpbnQgb3V0bGVuKQorCQkJIHUzMiAqb3V0LCBpbnQgb3V0bGVuKQogewotCXN0cnVjdCBtbHg1X3F1ZXJ5X21rZXlfbWJveF9pbiBpbjsKLQlpbnQgZXJyOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKHF1ZXJ5X21rZXlfaW4pXSA9IHswfTsKIAotCW1lbXNldCgmaW4sIDAsIHNpemVvZihpbikpOwogCW1lbXNldChvdXQsIDAsIG91dGxlbik7Ci0KLQlpbi5oZHIub3Bjb2RlID0gY3B1X3RvX2JlMTYoTUxYNV9DTURfT1BfUVVFUllfTUtFWSk7Ci0JaW4ubWtleSA9IGNwdV90b19iZTMyKG1seDVfbWtleV90b19pZHgobWtleS0+a2V5KSk7Ci0JZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsICZpbiwgc2l6ZW9mKGluKSwgb3V0LCBvdXRsZW4pOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlpZiAob3V0LT5oZHIuc3RhdHVzKQotCQlyZXR1cm4gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycigmb3V0LT5oZHIpOwotCi0JcmV0dXJuIGVycjsKKwlNTFg1X1NFVChxdWVyeV9ta2V5X2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9RVUVSWV9NS0VZKTsKKwlNTFg1X1NFVChxdWVyeV9ta2V5X2luLCBpbiwgbWtleV9pbmRleCwgbWx4NV9ta2V5X3RvX2lkeChta2V5LT5rZXkpKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIG91dGxlbik7CiB9CiBFWFBPUlRfU1lNQk9MKG1seDVfY29yZV9xdWVyeV9ta2V5KTsKIAogaW50IG1seDVfY29yZV9kdW1wX2ZpbGxfbWtleShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9jb3JlX21rZXkgKl9ta2V5LAogCQkJICAgICB1MzIgKm1rZXkpCiB7Ci0Jc3RydWN0IG1seDVfcXVlcnlfc3BlY2lhbF9jdHhzX21ib3hfaW4gaW47Ci0Jc3RydWN0IG1seDVfcXVlcnlfc3BlY2lhbF9jdHhzX21ib3hfb3V0IG91dDsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcocXVlcnlfc3BlY2lhbF9jb250ZXh0c19vdXQpXSA9IHswfTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhxdWVyeV9zcGVjaWFsX2NvbnRleHRzX2luKV0gICA9IHswfTsKIAlpbnQgZXJyOwogCi0JbWVtc2V0KCZpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KCZvdXQsIDAsIHNpemVvZihvdXQpKTsKLQotCWluLmhkci5vcGNvZGUgPSBjcHVfdG9fYmUxNihNTFg1X0NNRF9PUF9RVUVSWV9TUEVDSUFMX0NPTlRFWFRTKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgJmluLCBzaXplb2YoaW4pLCAmb3V0LCBzaXplb2Yob3V0KSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWlmIChvdXQuaGRyLnN0YXR1cykKLQkJcmV0dXJuIG1seDVfY21kX3N0YXR1c190b19lcnIoJm91dC5oZHIpOwotCi0JKm1rZXkgPSBiZTMyX3RvX2NwdShvdXQuZHVtcF9maWxsX21rZXkpOwotCisJTUxYNV9TRVQocXVlcnlfc3BlY2lhbF9jb250ZXh0c19pbiwgaW4sIG9wY29kZSwKKwkJIE1MWDVfQ01EX09QX1FVRVJZX1NQRUNJQUxfQ09OVEVYVFMpOworCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CisJaWYgKCFlcnIpCisJCSpta2V5ID0gTUxYNV9HRVQocXVlcnlfc3BlY2lhbF9jb250ZXh0c19vdXQsIG91dCwKKwkJCQkgZHVtcF9maWxsX21rZXkpOwogCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MKG1seDVfY29yZV9kdW1wX2ZpbGxfbWtleSk7CiAKK3N0YXRpYyBpbmxpbmUgdTMyIG1seDVfZ2V0X3Bzdih1MzIgKm91dCwgaW50IHBzdl9pbmRleCkKK3sKKwlzd2l0Y2ggKHBzdl9pbmRleCkgeworCWNhc2UgMTogcmV0dXJuIE1MWDVfR0VUKGNyZWF0ZV9wc3Zfb3V0LCBvdXQsIHBzdjFfaW5kZXgpOworCWNhc2UgMjogcmV0dXJuIE1MWDVfR0VUKGNyZWF0ZV9wc3Zfb3V0LCBvdXQsIHBzdjJfaW5kZXgpOworCWNhc2UgMzogcmV0dXJuIE1MWDVfR0VUKGNyZWF0ZV9wc3Zfb3V0LCBvdXQsIHBzdjNfaW5kZXgpOworCWRlZmF1bHQ6IHJldHVybiBNTFg1X0dFVChjcmVhdGVfcHN2X291dCwgb3V0LCBwc3YwX2luZGV4KTsKKwl9Cit9CisKIGludCBtbHg1X2NvcmVfY3JlYXRlX3BzdihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgcGRuLAogCQkJIGludCBucHN2cywgdTMyICpzaWdfaW5kZXgpCiB7Ci0Jc3RydWN0IG1seDVfYWxsb2NhdGVfcHN2X2luIGluOwotCXN0cnVjdCBtbHg1X2FsbG9jYXRlX3Bzdl9vdXQgb3V0OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhjcmVhdGVfcHN2X291dCldID0gezB9OworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGNyZWF0ZV9wc3ZfaW4pXSAgID0gezB9OwogCWludCBpLCBlcnI7CiAKIAlpZiAobnBzdnMgPiBNTFg1X01BWF9QU1ZTKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW1lbXNldCgmaW4sIDAsIHNpemVvZihpbikpOwotCW1lbXNldCgmb3V0LCAwLCBzaXplb2Yob3V0KSk7CisJTUxYNV9TRVQoY3JlYXRlX3Bzdl9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfQ1JFQVRFX1BTVik7CisJTUxYNV9TRVQoY3JlYXRlX3Bzdl9pbiwgaW4sIHBkLCBwZG4pOworCU1MWDVfU0VUKGNyZWF0ZV9wc3ZfaW4sIGluLCBudW1fcHN2LCBucHN2cyk7CiAKLQlpbi5oZHIub3Bjb2RlID0gY3B1X3RvX2JlMTYoTUxYNV9DTURfT1BfQ1JFQVRFX1BTVik7Ci0JaW4ubnBzdl9wZCA9IGNwdV90b19iZTMyKChucHN2cyA8PCAyOCkgfCBwZG4pOwotCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCAmaW4sIHNpemVvZihpbiksICZvdXQsIHNpemVvZihvdXQpKTsKLQlpZiAoZXJyKSB7Ci0JCW1seDVfY29yZV9lcnIoZGV2LCAiY21kIGV4ZWMgZmFpbGVkICVkXG4iLCBlcnIpOworCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CisJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQl9Ci0KLQlpZiAob3V0Lmhkci5zdGF0dXMpIHsKLQkJbWx4NV9jb3JlX2VycihkZXYsICJjcmVhdGVfcHN2IGJhZCBzdGF0dXMgJWRcbiIsCi0JCQkgICAgICBvdXQuaGRyLnN0YXR1cyk7Ci0JCXJldHVybiBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyKCZvdXQuaGRyKTsKLQl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnBzdnM7IGkrKykKLQkJc2lnX2luZGV4W2ldID0gYmUzMl90b19jcHUob3V0LnBzdl9pZHhbaV0pICYgMHhmZmZmZmY7CisJCXNpZ19pbmRleFtpXSA9IG1seDVfZ2V0X3BzdihvdXQsIGkpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTIyMywyOSArMjAwLDExIEBACiAKIGludCBtbHg1X2NvcmVfZGVzdHJveV9wc3Yoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgaW50IHBzdl9udW0pCiB7Ci0Jc3RydWN0IG1seDVfZGVzdHJveV9wc3ZfaW4gaW47Ci0Jc3RydWN0IG1seDVfZGVzdHJveV9wc3Zfb3V0IG91dDsKLQlpbnQgZXJyOworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZXN0cm95X3Bzdl9vdXQpXSA9IHswfTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhkZXN0cm95X3Bzdl9pbildICAgPSB7MH07CiAKLQltZW1zZXQoJmluLCAwLCBzaXplb2YoaW4pKTsKLQltZW1zZXQoJm91dCwgMCwgc2l6ZW9mKG91dCkpOwotCi0JaW4ucHN2X251bWJlciA9IGNwdV90b19iZTMyKHBzdl9udW0pOwotCWluLmhkci5vcGNvZGUgPSBjcHVfdG9fYmUxNihNTFg1X0NNRF9PUF9ERVNUUk9ZX1BTVik7Ci0JZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsICZpbiwgc2l6ZW9mKGluKSwgJm91dCwgc2l6ZW9mKG91dCkpOwotCWlmIChlcnIpIHsKLQkJbWx4NV9jb3JlX2VycihkZXYsICJkZXN0cm95X3BzdiBjbWQgZXhlYyBmYWlsZWQgJWRcbiIsIGVycik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmIChvdXQuaGRyLnN0YXR1cykgewotCQltbHg1X2NvcmVfZXJyKGRldiwgImRlc3Ryb3lfcHN2IGJhZCBzdGF0dXMgJWRcbiIsCi0JCQkgICAgICBvdXQuaGRyLnN0YXR1cyk7Ci0JCWVyciA9IG1seDVfY21kX3N0YXR1c190b19lcnIoJm91dC5oZHIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLW91dDoKLQlyZXR1cm4gZXJyOworCU1MWDVfU0VUKGRlc3Ryb3lfcHN2X2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9ERVNUUk9ZX1BTVik7CisJTUxYNV9TRVQoZGVzdHJveV9wc3ZfaW4sIGluLCBwc3ZuLCBwc3ZfbnVtKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKIH0KIEVYUE9SVF9TWU1CT0wobWx4NV9jb3JlX2Rlc3Ryb3lfcHN2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9wYWdlYWxsb2MuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9wYWdlYWxsb2MuYwppbmRleCAzMmRlYTM1Li5kNDU4NTE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvcGFnZWFsbG9jLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3BhZ2VhbGxvYy5jCkBAIC00NCwxMiArNDQsNiBAQAogCU1MWDVfUEFHRVNfVEFLRQkJPSAyCiB9OwogCi1lbnVtIHsKLQlNTFg1X0JPT1RfUEFHRVMJCT0gMSwKLQlNTFg1X0lOSVRfUEFHRVMJCT0gMiwKLQlNTFg1X1BPU1RfSU5JVF9QQUdFUwk9IDMKLX07Ci0KIHN0cnVjdCBtbHg1X3BhZ2VzX3JlcSB7CiAJc3RydWN0IG1seDVfY29yZV9kZXYgKmRldjsKIAl1MTYJZnVuY19pZDsKQEAgLTY3LDMzICs2MSw2IEBACiAJdW5zaWduZWQJCWZyZWVfY291bnQ7CiB9OwogCi1zdHJ1Y3QgbWx4NV9xdWVyeV9wYWdlc19pbmJveCB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmRbOF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9xdWVyeV9wYWdlc19vdXRib3ggewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCV9fYmUxNgkJCXJzdmQ7Ci0JX19iZTE2CQkJZnVuY19pZDsKLQlfX2JlMzIJCQludW1fcGFnZXM7Ci19OwotCi1zdHJ1Y3QgbWx4NV9tYW5hZ2VfcGFnZXNfaW5ib3ggewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JX19iZTE2CQkJcnN2ZDsKLQlfX2JlMTYJCQlmdW5jX2lkOwotCV9fYmUzMgkJCW51bV9lbnRyaWVzOwotCV9fYmU2NAkJCXBhc1swXTsKLX07Ci0KLXN0cnVjdCBtbHg1X21hbmFnZV9wYWdlc19vdXRib3ggewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCV9fYmUzMgkJCW51bV9lbnRyaWVzOwotCXU4CQkJcnN2ZFs0XTsKLQlfX2JlNjQJCQlwYXNbMF07Ci19OwotCiBlbnVtIHsKIAlNQVhfUkVDTEFJTV9USU1FX01TRUNTCT0gNTAwMCwKIAlNQVhfUkVDTEFJTV9WRlNfUEFHRVNfVElNRV9NU0VDUyA9IDIgKiAxMDAwICogNjAsCkBAIC0xNjcsMjQgKzEzNCwyMSBAQAogc3RhdGljIGludCBtbHg1X2NtZF9xdWVyeV9wYWdlcyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MTYgKmZ1bmNfaWQsCiAJCQkJczMyICpucGFnZXMsIGludCBib290KQogewotCXN0cnVjdCBtbHg1X3F1ZXJ5X3BhZ2VzX2luYm94CWluOwotCXN0cnVjdCBtbHg1X3F1ZXJ5X3BhZ2VzX291dGJveAlvdXQ7CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKHF1ZXJ5X3BhZ2VzX291dCldID0gezB9OworCXUzMiBpbltNTFg1X1NUX1NaX0RXKHF1ZXJ5X3BhZ2VzX2luKV0gICA9IHswfTsKIAlpbnQgZXJyOwogCi0JbWVtc2V0KCZpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KCZvdXQsIDAsIHNpemVvZihvdXQpKTsKLQlpbi5oZHIub3Bjb2RlID0gY3B1X3RvX2JlMTYoTUxYNV9DTURfT1BfUVVFUllfUEFHRVMpOwotCWluLmhkci5vcG1vZCA9IGJvb3QgPyBjcHVfdG9fYmUxNihNTFg1X0JPT1RfUEFHRVMpIDogY3B1X3RvX2JlMTYoTUxYNV9JTklUX1BBR0VTKTsKKwlNTFg1X1NFVChxdWVyeV9wYWdlc19pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfUVVFUllfUEFHRVMpOworCU1MWDVfU0VUKHF1ZXJ5X3BhZ2VzX2luLCBpbiwgb3BfbW9kLCBib290ID8KKwkJIE1MWDVfUVVFUllfUEFHRVNfSU5fT1BfTU9EX0JPT1RfUEFHRVMgOgorCQkgTUxYNV9RVUVSWV9QQUdFU19JTl9PUF9NT0RfSU5JVF9QQUdFUyk7CiAKLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgJmluLCBzaXplb2YoaW4pLCAmb3V0LCBzaXplb2Yob3V0KSk7CisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JaWYgKG91dC5oZHIuc3RhdHVzKQotCQlyZXR1cm4gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycigmb3V0Lmhkcik7Ci0KLQkqbnBhZ2VzID0gYmUzMl90b19jcHUob3V0Lm51bV9wYWdlcyk7Ci0JKmZ1bmNfaWQgPSBiZTE2X3RvX2NwdShvdXQuZnVuY19pZCk7CisJKm5wYWdlcyA9IE1MWDVfR0VUKHF1ZXJ5X3BhZ2VzX291dCwgb3V0LCBudW1fcGFnZXMpOworCSpmdW5jX2lkID0gTUxYNV9HRVQocXVlcnlfcGFnZXNfb3V0LCBvdXQsIGZ1bmN0aW9uX2lkKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC0yODAsNDYgKzI0NCwzNyBAQAogCiBzdGF0aWMgdm9pZCBwYWdlX25vdGlmeV9mYWlsKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUxNiBmdW5jX2lkKQogewotCXN0cnVjdCBtbHg1X21hbmFnZV9wYWdlc19pbmJveCAqaW47Ci0Jc3RydWN0IG1seDVfbWFuYWdlX3BhZ2VzX291dGJveCBvdXQ7CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKG1hbmFnZV9wYWdlc19vdXQpXSA9IHswfTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhtYW5hZ2VfcGFnZXNfaW4pXSAgID0gezB9OwogCWludCBlcnI7CiAKLQlpbiA9IGt6YWxsb2Moc2l6ZW9mKCppbiksIEdGUF9LRVJORUwpOwotCWlmICghaW4pCi0JCXJldHVybjsKKwlNTFg1X1NFVChtYW5hZ2VfcGFnZXNfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX01BTkFHRV9QQUdFUyk7CisJTUxYNV9TRVQobWFuYWdlX3BhZ2VzX2luLCBpbiwgb3BfbW9kLCBNTFg1X1BBR0VTX0NBTlRfR0lWRSk7CisJTUxYNV9TRVQobWFuYWdlX3BhZ2VzX2luLCBpbiwgZnVuY3Rpb25faWQsIGZ1bmNfaWQpOwogCi0JbWVtc2V0KCZvdXQsIDAsIHNpemVvZihvdXQpKTsKLQlpbi0+aGRyLm9wY29kZSA9IGNwdV90b19iZTE2KE1MWDVfQ01EX09QX01BTkFHRV9QQUdFUyk7Ci0JaW4tPmhkci5vcG1vZCA9IGNwdV90b19iZTE2KE1MWDVfUEFHRVNfQ0FOVF9HSVZFKTsKLQlpbi0+ZnVuY19pZCA9IGNwdV90b19iZTE2KGZ1bmNfaWQpOwotCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKCppbiksICZvdXQsIHNpemVvZihvdXQpKTsKLQlpZiAoIWVycikKLQkJZXJyID0gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycigmb3V0Lmhkcik7Ci0KKwllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogCWlmIChlcnIpCi0JCW1seDVfY29yZV93YXJuKGRldiwgInBhZ2Ugbm90aWZ5IGZhaWxlZFxuIik7Ci0KLQlrZnJlZShpbik7CisJCW1seDVfY29yZV93YXJuKGRldiwgInBhZ2Ugbm90aWZ5IGZhaWxlZCBmdW5jX2lkKCVkKSBlcnIoJWQpXG4iLAorCQkJICAgICAgIGZ1bmNfaWQsIGVycik7CiB9CiAKIHN0YXRpYyBpbnQgZ2l2ZV9wYWdlcyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MTYgZnVuY19pZCwgaW50IG5wYWdlcywKIAkJICAgICAgaW50IG5vdGlmeV9mYWlsKQogewotCXN0cnVjdCBtbHg1X21hbmFnZV9wYWdlc19pbmJveCAqaW47Ci0Jc3RydWN0IG1seDVfbWFuYWdlX3BhZ2VzX291dGJveCBvdXQ7Ci0JaW50IGlubGVuOworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhtYW5hZ2VfcGFnZXNfb3V0KV0gPSB7MH07CisJaW50IGlubGVuID0gTUxYNV9TVF9TWl9CWVRFUyhtYW5hZ2VfcGFnZXNfaW4pOwogCXU2NCBhZGRyOwogCWludCBlcnI7CisJdTMyICppbjsKIAlpbnQgaTsKIAotCWlubGVuID0gc2l6ZW9mKCppbikgKyBucGFnZXMgKiBzaXplb2YoaW4tPnBhc1swXSk7CisJaW5sZW4gKz0gbnBhZ2VzICogTUxYNV9GTERfU1pfQllURVMobWFuYWdlX3BhZ2VzX2luLCBwYXNbMF0pOwogCWluID0gbWx4NV92emFsbG9jKGlubGVuKTsKIAlpZiAoIWluKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCW1seDVfY29yZV93YXJuKGRldiwgInZ6YWxsb2MgZmFpbGVkICVkXG4iLCBpbmxlbik7CiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQotCW1lbXNldCgmb3V0LCAwLCBzaXplb2Yob3V0KSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyBpKyspIHsKIHJldHJ5OgpAQCAtMzMyLDI3ICsyODcsMjEgQEAKIAogCQkJZ290byByZXRyeTsKIAkJfQotCQlpbi0+cGFzW2ldID0gY3B1X3RvX2JlNjQoYWRkcik7CisJCU1MWDVfU0VUNjQobWFuYWdlX3BhZ2VzX2luLCBpbiwgcGFzW2ldLCBhZGRyKTsKIAl9CiAKLQlpbi0+aGRyLm9wY29kZSA9IGNwdV90b19iZTE2KE1MWDVfQ01EX09QX01BTkFHRV9QQUdFUyk7Ci0JaW4tPmhkci5vcG1vZCA9IGNwdV90b19iZTE2KE1MWDVfUEFHRVNfR0lWRSk7Ci0JaW4tPmZ1bmNfaWQgPSBjcHVfdG9fYmUxNihmdW5jX2lkKTsKLQlpbi0+bnVtX2VudHJpZXMgPSBjcHVfdG9fYmUzMihucGFnZXMpOwotCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgaW5sZW4sICZvdXQsIHNpemVvZihvdXQpKTsKKwlNTFg1X1NFVChtYW5hZ2VfcGFnZXNfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX01BTkFHRV9QQUdFUyk7CisJTUxYNV9TRVQobWFuYWdlX3BhZ2VzX2luLCBpbiwgb3BfbW9kLCBNTFg1X1BBR0VTX0dJVkUpOworCU1MWDVfU0VUKG1hbmFnZV9wYWdlc19pbiwgaW4sIGZ1bmN0aW9uX2lkLCBmdW5jX2lkKTsKKwlNTFg1X1NFVChtYW5hZ2VfcGFnZXNfaW4sIGluLCBpbnB1dF9udW1fZW50cmllcywgbnBhZ2VzKTsKKworCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgaW5sZW4sIG91dCwgc2l6ZW9mKG91dCkpOwogCWlmIChlcnIpIHsKIAkJbWx4NV9jb3JlX3dhcm4oZGV2LCAiZnVuY19pZCAweCV4LCBucGFnZXMgJWQsIGVyciAlZFxuIiwKIAkJCSAgICAgICBmdW5jX2lkLCBucGFnZXMsIGVycik7CiAJCWdvdG8gb3V0XzRrOwogCX0KIAotCWVyciA9IG1seDVfY21kX3N0YXR1c190b19lcnIoJm91dC5oZHIpOwotCWlmIChlcnIpIHsKLQkJbWx4NV9jb3JlX3dhcm4oZGV2LCAiZnVuY19pZCAweCV4LCBucGFnZXMgJWQsIHN0YXR1cyAlZFxuIiwKLQkJCSAgICAgICBmdW5jX2lkLCBucGFnZXMsIG91dC5oZHIuc3RhdHVzKTsKLQkJZ290byBvdXRfNGs7Ci0JfQotCiAJZGV2LT5wcml2LmZ3X3BhZ2VzICs9IG5wYWdlczsKIAlpZiAoZnVuY19pZCkKIAkJZGV2LT5wcml2LnZmc19wYWdlcyArPSBucGFnZXM7CkBAIC0zNjQsNyArMzEzLDcgQEAKIAogb3V0XzRrOgogCWZvciAoaS0tOyBpID49IDA7IGktLSkKLQkJZnJlZV80ayhkZXYsIGJlNjRfdG9fY3B1KGluLT5wYXNbaV0pKTsKKwkJZnJlZV80ayhkZXYsIE1MWDVfR0VUNjQobWFuYWdlX3BhZ2VzX2luLCBpbiwgcGFzW2ldKSk7CiBvdXRfZnJlZToKIAlrdmZyZWUoaW4pOwogCWlmIChub3RpZnlfZmFpbCkKQEAgLTM3Myw2NCArMzIyLDY3IEBACiB9CiAKIHN0YXRpYyBpbnQgcmVjbGFpbV9wYWdlc19jbWQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKLQkJCSAgICAgc3RydWN0IG1seDVfbWFuYWdlX3BhZ2VzX2luYm94ICppbiwgaW50IGluX3NpemUsCi0JCQkgICAgIHN0cnVjdCBtbHg1X21hbmFnZV9wYWdlc19vdXRib3ggKm91dCwgaW50IG91dF9zaXplKQorCQkJICAgICB1MzIgKmluLCBpbnQgaW5fc2l6ZSwgdTMyICpvdXQsIGludCBvdXRfc2l6ZSkKIHsKIAlzdHJ1Y3QgZndfcGFnZSAqZndwOwogCXN0cnVjdCByYl9ub2RlICpwOworCXUzMiBmdW5jX2lkOwogCXUzMiBucGFnZXM7CiAJdTMyIGkgPSAwOwogCiAJaWYgKGRldi0+c3RhdGUgIT0gTUxYNV9ERVZJQ0VfU1RBVEVfSU5URVJOQUxfRVJST1IpCi0JCXJldHVybiBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsICh1MzIgKilpbiwgaW5fc2l6ZSwKLQkJCQkJCSAgKHUzMiAqKW91dCwgb3V0X3NpemUpOworCQlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbl9zaXplLCBvdXQsIG91dF9zaXplKTsKIAotCW5wYWdlcyA9IGJlMzJfdG9fY3B1KGluLT5udW1fZW50cmllcyk7CisJLyogTm8gaGFyZCBmZWVsaW5ncywgd2Ugd2FudCBvdXIgcGFnZXMgYmFjayEgKi8KKwlucGFnZXMgPSBNTFg1X0dFVChtYW5hZ2VfcGFnZXNfaW4sIGluLCBpbnB1dF9udW1fZW50cmllcyk7CisJZnVuY19pZCA9IE1MWDVfR0VUKG1hbmFnZV9wYWdlc19pbiwgaW4sIGZ1bmN0aW9uX2lkKTsKIAogCXAgPSByYl9maXJzdCgmZGV2LT5wcml2LnBhZ2Vfcm9vdCk7CiAJd2hpbGUgKHAgJiYgaSA8IG5wYWdlcykgewogCQlmd3AgPSByYl9lbnRyeShwLCBzdHJ1Y3QgZndfcGFnZSwgcmJfbm9kZSk7Ci0JCW91dC0+cGFzW2ldID0gY3B1X3RvX2JlNjQoZndwLT5hZGRyKTsKIAkJcCA9IHJiX25leHQocCk7CisJCWlmIChmd3AtPmZ1bmNfaWQgIT0gZnVuY19pZCkKKwkJCWNvbnRpbnVlOworCisJCU1MWDVfU0VUNjQobWFuYWdlX3BhZ2VzX291dCwgb3V0LCBwYXNbaV0sIGZ3cC0+YWRkcik7CiAJCWkrKzsKIAl9CiAKLQlvdXQtPm51bV9lbnRyaWVzID0gY3B1X3RvX2JlMzIoaSk7CisJTUxYNV9TRVQobWFuYWdlX3BhZ2VzX291dCwgb3V0LCBvdXRwdXRfbnVtX2VudHJpZXMsIGkpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHJlY2xhaW1fcGFnZXMoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyIGZ1bmNfaWQsIGludCBucGFnZXMsCiAJCQkgaW50ICpuY2xhaW1lZCkKIHsKLQlzdHJ1Y3QgbWx4NV9tYW5hZ2VfcGFnZXNfaW5ib3ggICBpbjsKLQlzdHJ1Y3QgbWx4NV9tYW5hZ2VfcGFnZXNfb3V0Ym94ICpvdXQ7CisJaW50IG91dGxlbiA9IE1MWDVfU1RfU1pfQllURVMobWFuYWdlX3BhZ2VzX291dCk7CisJdTMyIGluW01MWDVfU1RfU1pfRFcobWFuYWdlX3BhZ2VzX2luKV0gPSB7MH07CiAJaW50IG51bV9jbGFpbWVkOwotCWludCBvdXRsZW47Ci0JdTY0IGFkZHI7CisJdTMyICpvdXQ7CiAJaW50IGVycjsKIAlpbnQgaTsKIAogCWlmIChuY2xhaW1lZCkKIAkJKm5jbGFpbWVkID0gMDsKIAotCW1lbXNldCgmaW4sIDAsIHNpemVvZihpbikpOwotCW91dGxlbiA9IHNpemVvZigqb3V0KSArIG5wYWdlcyAqIHNpemVvZihvdXQtPnBhc1swXSk7CisJb3V0bGVuICs9IG5wYWdlcyAqIE1MWDVfRkxEX1NaX0JZVEVTKG1hbmFnZV9wYWdlc19vdXQsIHBhc1swXSk7CiAJb3V0ID0gbWx4NV92emFsbG9jKG91dGxlbik7CiAJaWYgKCFvdXQpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaW4uaGRyLm9wY29kZSA9IGNwdV90b19iZTE2KE1MWDVfQ01EX09QX01BTkFHRV9QQUdFUyk7Ci0JaW4uaGRyLm9wbW9kID0gY3B1X3RvX2JlMTYoTUxYNV9QQUdFU19UQUtFKTsKLQlpbi5mdW5jX2lkID0gY3B1X3RvX2JlMTYoZnVuY19pZCk7Ci0JaW4ubnVtX2VudHJpZXMgPSBjcHVfdG9fYmUzMihucGFnZXMpOworCU1MWDVfU0VUKG1hbmFnZV9wYWdlc19pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfTUFOQUdFX1BBR0VTKTsKKwlNTFg1X1NFVChtYW5hZ2VfcGFnZXNfaW4sIGluLCBvcF9tb2QsIE1MWDVfUEFHRVNfVEFLRSk7CisJTUxYNV9TRVQobWFuYWdlX3BhZ2VzX2luLCBpbiwgZnVuY3Rpb25faWQsIGZ1bmNfaWQpOworCU1MWDVfU0VUKG1hbmFnZV9wYWdlc19pbiwgaW4sIGlucHV0X251bV9lbnRyaWVzLCBucGFnZXMpOworCiAJbWx4NV9jb3JlX2RiZyhkZXYsICJucGFnZXMgJWQsIG91dGxlbiAlZFxuIiwgbnBhZ2VzLCBvdXRsZW4pOwotCWVyciA9IHJlY2xhaW1fcGFnZXNfY21kKGRldiwgJmluLCBzaXplb2YoaW4pLCBvdXQsIG91dGxlbik7CisJZXJyID0gcmVjbGFpbV9wYWdlc19jbWQoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBvdXRsZW4pOwogCWlmIChlcnIpIHsKIAkJbWx4NV9jb3JlX2VycihkZXYsICJmYWlsZWQgcmVjbGFpbWluZyBwYWdlczogZXJyICVkXG4iLCBlcnIpOwogCQlnb3RvIG91dF9mcmVlOwogCX0KIAotCW51bV9jbGFpbWVkID0gYmUzMl90b19jcHUob3V0LT5udW1fZW50cmllcyk7CisJbnVtX2NsYWltZWQgPSBNTFg1X0dFVChtYW5hZ2VfcGFnZXNfb3V0LCBvdXQsIG91dHB1dF9udW1fZW50cmllcyk7CiAJaWYgKG51bV9jbGFpbWVkID4gbnBhZ2VzKSB7CiAJCW1seDVfY29yZV93YXJuKGRldiwgImZ3IHJldHVybmVkICVkLCBkcml2ZXIgYXNrZWQgJWQgPT4gY29ycnVwdGlvblxuIiwKIAkJCSAgICAgICBudW1fY2xhaW1lZCwgbnBhZ2VzKTsKQEAgLTQzOCwxMCArMzkwLDkgQEAKIAkJZ290byBvdXRfZnJlZTsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NsYWltZWQ7IGkrKykgewotCQlhZGRyID0gYmU2NF90b19jcHUob3V0LT5wYXNbaV0pOwotCQlmcmVlXzRrKGRldiwgYWRkcik7Ci0JfQorCWZvciAoaSA9IDA7IGkgPCBudW1fY2xhaW1lZDsgaSsrKQorCQlmcmVlXzRrKGRldiwgTUxYNV9HRVQ2NChtYW5hZ2VfcGFnZXNfb3V0LCBvdXQsIHBhc1tpXSkpOworCiAKIAlpZiAobmNsYWltZWQpCiAJCSpuY2xhaW1lZCA9IG51bV9jbGFpbWVkOwpAQCAtNTE4LDggKzQ2OSw4IEBACiAJaW50IHJldDsKIAogCXJldCA9IChzaXplb2YobGF5LT5vdXQpICsgTUxYNV9CTEtTX0ZPUl9SRUNMQUlNX1BBR0VTICogc2l6ZW9mKGJsb2NrLT5kYXRhKSAtCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgbWx4NV9tYW5hZ2VfcGFnZXNfb3V0Ym94KSkgLwotCSAgICAgICBGSUVMRF9TSVpFT0Yoc3RydWN0IG1seDVfbWFuYWdlX3BhZ2VzX291dGJveCwgcGFzWzBdKTsKKwkgICAgICAgTUxYNV9TVF9TWl9CWVRFUyhtYW5hZ2VfcGFnZXNfb3V0KSkgLworCSAgICAgICBNTFg1X0ZMRF9TWl9CWVRFUyhtYW5hZ2VfcGFnZXNfb3V0LCBwYXNbMF0pOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTU5NCw2ICs1NDUsMTIgQEAKIAl1bnNpZ25lZCBsb25nIGVuZCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKE1BWF9SRUNMQUlNX1ZGU19QQUdFU19USU1FX01TRUNTKTsKIAlpbnQgcHJldl92ZnNfcGFnZXMgPSBkZXYtPnByaXYudmZzX3BhZ2VzOwogCisJLyogSW4gY2FzZSBvZiBpbnRlcm5hbCBlcnJvciB3ZSB3aWxsIGZyZWUgdGhlIHBhZ2VzIG1hbnVhbGx5IGxhdGVyICovCisJaWYgKGRldi0+c3RhdGUgPT0gTUxYNV9ERVZJQ0VfU1RBVEVfSU5URVJOQUxfRVJST1IpIHsKKwkJbWx4NV9jb3JlX3dhcm4oZGV2LCAiU2tpcHBpbmcgd2FpdCBmb3IgdmYgcGFnZXMgc3RhZ2UiKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJbWx4NV9jb3JlX2RiZyhkZXYsICJXYWl0aW5nIGZvciAlZCBwYWdlcyBmcm9tICVzXG4iLCBwcmV2X3Zmc19wYWdlcywKIAkJICAgICAgZGV2LT5wcml2Lm5hbWUpOwogCXdoaWxlIChkZXYtPnByaXYudmZzX3BhZ2VzKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvcGQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9wZC5jCmluZGV4IGYyZDNhZWUuLmJkODMwZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9wZC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9wZC5jCkBAIC0zNiw2NiArMzYsMjcgQEAKICNpbmNsdWRlIDxsaW51eC9tbHg1L2NtZC5oPgogI2luY2x1ZGUgIm1seDVfY29yZS5oIgogCi1zdHJ1Y3QgbWx4NV9hbGxvY19wZF9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZFs4XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2FsbG9jX3BkX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQlwZG47Ci0JdTgJCQlyc3ZkWzRdOwotfTsKLQotc3RydWN0IG1seDVfZGVhbGxvY19wZF9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCV9fYmUzMgkJCXBkbjsKLQl1OAkJCXJzdmRbNF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9kZWFsbG9jX3BkX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmRbOF07Ci19OwotCiBpbnQgbWx4NV9jb3JlX2FsbG9jX3BkKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiAqcGRuKQogewotCXN0cnVjdCBtbHg1X2FsbG9jX3BkX21ib3hfaW4JaW47Ci0Jc3RydWN0IG1seDVfYWxsb2NfcGRfbWJveF9vdXQJb3V0OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhhbGxvY19wZF9vdXQpXSA9IHswfTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhhbGxvY19wZF9pbildICAgPSB7MH07CiAJaW50IGVycjsKIAotCW1lbXNldCgmaW4sIDAsIHNpemVvZihpbikpOwotCW1lbXNldCgmb3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0JaW4uaGRyLm9wY29kZSA9IGNwdV90b19iZTE2KE1MWDVfQ01EX09QX0FMTE9DX1BEKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgJmluLCBzaXplb2YoaW4pLCAmb3V0LCBzaXplb2Yob3V0KSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWlmIChvdXQuaGRyLnN0YXR1cykKLQkJcmV0dXJuIG1seDVfY21kX3N0YXR1c190b19lcnIoJm91dC5oZHIpOwotCi0JKnBkbiA9IGJlMzJfdG9fY3B1KG91dC5wZG4pICYgMHhmZmZmZmY7CisJTUxYNV9TRVQoYWxsb2NfcGRfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX0FMTE9DX1BEKTsKKwllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOworCWlmICghZXJyKQorCQkqcGRuID0gTUxYNV9HRVQoYWxsb2NfcGRfb3V0LCBvdXQsIHBkKTsKIAlyZXR1cm4gZXJyOwogfQogRVhQT1JUX1NZTUJPTChtbHg1X2NvcmVfYWxsb2NfcGQpOwogCiBpbnQgbWx4NV9jb3JlX2RlYWxsb2NfcGQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyIHBkbikKIHsKLQlzdHJ1Y3QgbWx4NV9kZWFsbG9jX3BkX21ib3hfaW4JaW47Ci0Jc3RydWN0IG1seDVfZGVhbGxvY19wZF9tYm94X291dAlvdXQ7Ci0JaW50IGVycjsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoZGVhbGxvY19wZF9vdXQpXSA9IHswfTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhkZWFsbG9jX3BkX2luKV0gICA9IHswfTsKIAotCW1lbXNldCgmaW4sIDAsIHNpemVvZihpbikpOwotCW1lbXNldCgmb3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0JaW4uaGRyLm9wY29kZSA9IGNwdV90b19iZTE2KE1MWDVfQ01EX09QX0RFQUxMT0NfUEQpOwotCWluLnBkbiA9IGNwdV90b19iZTMyKHBkbik7Ci0JZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsICZpbiwgc2l6ZW9mKGluKSwgJm91dCwgc2l6ZW9mKG91dCkpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlpZiAob3V0Lmhkci5zdGF0dXMpCi0JCXJldHVybiBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyKCZvdXQuaGRyKTsKLQotCXJldHVybiBlcnI7CisJTUxYNV9TRVQoZGVhbGxvY19wZF9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfREVBTExPQ19QRCk7CisJTUxYNV9TRVQoZGVhbGxvY19wZF9pbiwgaW4sIHBkLCBwZG4pOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQogRVhQT1JUX1NZTUJPTChtbHg1X2NvcmVfZGVhbGxvY19wZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvcG9ydC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3BvcnQuYwppbmRleCA3NTJjMDgxLi4zNGU3MTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvcG9ydC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9wb3J0LmMKQEAgLTM4LDQ1ICszOCw0MiBAQAogCiBpbnQgbWx4NV9jb3JlX2FjY2Vzc19yZWcoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdm9pZCAqZGF0YV9pbiwKIAkJCSBpbnQgc2l6ZV9pbiwgdm9pZCAqZGF0YV9vdXQsIGludCBzaXplX291dCwKLQkJCSB1MTYgcmVnX251bSwgaW50IGFyZywgaW50IHdyaXRlKQorCQkJIHUxNiByZWdfaWQsIGludCBhcmcsIGludCB3cml0ZSkKIHsKLQlzdHJ1Y3QgbWx4NV9hY2Nlc3NfcmVnX21ib3hfaW4gKmluID0gTlVMTDsKLQlzdHJ1Y3QgbWx4NV9hY2Nlc3NfcmVnX21ib3hfb3V0ICpvdXQgPSBOVUxMOworCWludCBvdXRsZW4gPSBNTFg1X1NUX1NaX0JZVEVTKGFjY2Vzc19yZWdpc3Rlcl9vdXQpICsgc2l6ZV9vdXQ7CisJaW50IGlubGVuID0gTUxYNV9TVF9TWl9CWVRFUyhhY2Nlc3NfcmVnaXN0ZXJfaW4pICsgc2l6ZV9pbjsKIAlpbnQgZXJyID0gLUVOT01FTTsKKwl1MzIgKm91dCA9IE5VTEw7CisJdTMyICppbiA9IE5VTEw7CisJdm9pZCAqZGF0YTsKIAotCWluID0gbWx4NV92emFsbG9jKHNpemVvZigqaW4pICsgc2l6ZV9pbik7Ci0JaWYgKCFpbikKLQkJcmV0dXJuIC1FTk9NRU07CisJaW4gPSBtbHg1X3Z6YWxsb2MoaW5sZW4pOworCW91dCA9IG1seDVfdnphbGxvYyhvdXRsZW4pOworCWlmICghaW4gfHwgIW91dCkKKwkJZ290byBvdXQ7CiAKLQlvdXQgPSBtbHg1X3Z6YWxsb2Moc2l6ZW9mKCpvdXQpICsgc2l6ZV9vdXQpOwotCWlmICghb3V0KQotCQlnb3RvIGV4MTsKKwlkYXRhID0gTUxYNV9BRERSX09GKGFjY2Vzc19yZWdpc3Rlcl9pbiwgaW4sIHJlZ2lzdGVyX2RhdGEpOworCW1lbWNweShkYXRhLCBkYXRhX2luLCBzaXplX2luKTsKIAotCW1lbWNweShpbi0+ZGF0YSwgZGF0YV9pbiwgc2l6ZV9pbik7Ci0JaW4tPmhkci5vcGNvZGUgPSBjcHVfdG9fYmUxNihNTFg1X0NNRF9PUF9BQ0NFU1NfUkVHKTsKLQlpbi0+aGRyLm9wbW9kID0gY3B1X3RvX2JlMTYoIXdyaXRlKTsKLQlpbi0+YXJnID0gY3B1X3RvX2JlMzIoYXJnKTsKLQlpbi0+cmVnaXN0ZXJfaWQgPSBjcHVfdG9fYmUxNihyZWdfbnVtKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZigqaW4pICsgc2l6ZV9pbiwgb3V0LAotCQkJICAgIHNpemVvZigqb3V0KSArIHNpemVfb3V0KTsKKwlNTFg1X1NFVChhY2Nlc3NfcmVnaXN0ZXJfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX0FDQ0VTU19SRUcpOworCU1MWDVfU0VUKGFjY2Vzc19yZWdpc3Rlcl9pbiwgaW4sIG9wX21vZCwgIXdyaXRlKTsKKwlNTFg1X1NFVChhY2Nlc3NfcmVnaXN0ZXJfaW4sIGluLCBhcmd1bWVudCwgYXJnKTsKKwlNTFg1X1NFVChhY2Nlc3NfcmVnaXN0ZXJfaW4sIGluLCByZWdpc3Rlcl9pZCwgcmVnX2lkKTsKKworCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgaW5sZW4sIG91dCwgb3V0bGVuKTsKIAlpZiAoZXJyKQotCQlnb3RvIGV4MjsKKwkJZ290byBvdXQ7CiAKLQlpZiAob3V0LT5oZHIuc3RhdHVzKQotCQllcnIgPSBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyKCZvdXQtPmhkcik7CisJZGF0YSA9IE1MWDVfQUREUl9PRihhY2Nlc3NfcmVnaXN0ZXJfb3V0LCBvdXQsIHJlZ2lzdGVyX2RhdGEpOworCW1lbWNweShkYXRhX291dCwgZGF0YSwgc2l6ZV9vdXQpOwogCi0JaWYgKCFlcnIpCi0JCW1lbWNweShkYXRhX291dCwgb3V0LT5kYXRhLCBzaXplX291dCk7Ci0KLWV4MjoKK291dDoKIAlrdmZyZWUob3V0KTsKLWV4MToKIAlrdmZyZWUoaW4pOwogCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtbHg1X2NvcmVfYWNjZXNzX3JlZyk7CiAKLQogc3RydWN0IG1seDVfcmVnX3BjYXAgewogCXU4CQkJcnN2ZDA7CiAJdTgJCQlwb3J0X251bTsKQEAgLTEwNCwxMiArMTAxLDEwIEBACiBpbnQgbWx4NV9xdWVyeV9wb3J0X3B0eXMoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyICpwdHlzLAogCQkJIGludCBwdHlzX3NpemUsIGludCBwcm90b19tYXNrLCB1OCBsb2NhbF9wb3J0KQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKHB0eXNfcmVnKV07CisJdTMyIGluW01MWDVfU1RfU1pfRFcocHR5c19yZWcpXSA9IHswfTsKIAotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7CiAJTUxYNV9TRVQocHR5c19yZWcsIGluLCBsb2NhbF9wb3J0LCBsb2NhbF9wb3J0KTsKIAlNTFg1X1NFVChwdHlzX3JlZywgaW4sIHByb3RvX21hc2ssIHByb3RvX21hc2spOwotCiAJcmV0dXJuIG1seDVfY29yZV9hY2Nlc3NfcmVnKGRldiwgaW4sIHNpemVvZihpbiksIHB0eXMsCiAJCQkJICAgIHB0eXNfc2l6ZSwgTUxYNV9SRUdfUFRZUywgMCwgMCk7CiB9CkBAIC0xMTcsMTMgKzExMiwxMSBAQAogCiBpbnQgbWx4NV9zZXRfcG9ydF9iZWFjb24oc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTE2IGJlYWNvbl9kdXJhdGlvbikKIHsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhtbGNyX3JlZyldICA9IHswfTsKIAl1MzIgb3V0W01MWDVfU1RfU1pfRFcobWxjcl9yZWcpXTsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhtbGNyX3JlZyldOwogCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKIAlNTFg1X1NFVChtbGNyX3JlZywgaW4sIGxvY2FsX3BvcnQsIDEpOwogCU1MWDVfU0VUKG1sY3JfcmVnLCBpbiwgYmVhY29uX2R1cmF0aW9uLCBiZWFjb25fZHVyYXRpb24pOwotCiAJcmV0dXJuIG1seDVfY29yZV9hY2Nlc3NfcmVnKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwKIAkJCQkgICAgc2l6ZW9mKG91dCksIE1MWDVfUkVHX01MQ1IsIDAsIDEpOwogfQpAQCAtMTgyLDI1ICsxNzUsMzkgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDVfcXVlcnlfcG9ydF9saW5rX3dpZHRoX29wZXIpOwogCi1pbnQgbWx4NV9xdWVyeV9wb3J0X3Byb3RvX29wZXIoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKLQkJCSAgICAgICB1OCAqcHJvdG9fb3BlciwgaW50IHByb3RvX21hc2ssCi0JCQkgICAgICAgdTggbG9jYWxfcG9ydCkKK2ludCBtbHg1X3F1ZXJ5X3BvcnRfZXRoX3Byb3RvX29wZXIoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKKwkJCQkgICB1MzIgKnByb3RvX29wZXIsIHU4IGxvY2FsX3BvcnQpCiB7CiAJdTMyIG91dFtNTFg1X1NUX1NaX0RXKHB0eXNfcmVnKV07CiAJaW50IGVycjsKIAotCWVyciA9IG1seDVfcXVlcnlfcG9ydF9wdHlzKGRldiwgb3V0LCBzaXplb2Yob3V0KSwgcHJvdG9fbWFzaywgbG9jYWxfcG9ydCk7CisJZXJyID0gbWx4NV9xdWVyeV9wb3J0X3B0eXMoZGV2LCBvdXQsIHNpemVvZihvdXQpLCBNTFg1X1BUWVNfRU4sCisJCQkJICAgbG9jYWxfcG9ydCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWlmIChwcm90b19tYXNrID09IE1MWDVfUFRZU19FTikKLQkJKnByb3RvX29wZXIgPSBNTFg1X0dFVChwdHlzX3JlZywgb3V0LCBldGhfcHJvdG9fb3Blcik7Ci0JZWxzZQotCQkqcHJvdG9fb3BlciA9IE1MWDVfR0VUKHB0eXNfcmVnLCBvdXQsIGliX3Byb3RvX29wZXIpOworCSpwcm90b19vcGVyID0gTUxYNV9HRVQocHR5c19yZWcsIG91dCwgZXRoX3Byb3RvX29wZXIpOwogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChtbHg1X3F1ZXJ5X3BvcnRfcHJvdG9fb3Blcik7CitFWFBPUlRfU1lNQk9MKG1seDVfcXVlcnlfcG9ydF9ldGhfcHJvdG9fb3Blcik7CisKK2ludCBtbHg1X3F1ZXJ5X3BvcnRfaWJfcHJvdG9fb3BlcihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAorCQkJCSAgdTggKnByb3RvX29wZXIsIHU4IGxvY2FsX3BvcnQpCit7CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKHB0eXNfcmVnKV07CisJaW50IGVycjsKKworCWVyciA9IG1seDVfcXVlcnlfcG9ydF9wdHlzKGRldiwgb3V0LCBzaXplb2Yob3V0KSwgTUxYNV9QVFlTX0lCLAorCQkJCSAgIGxvY2FsX3BvcnQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkqcHJvdG9fb3BlciA9IE1MWDVfR0VUKHB0eXNfcmVnLCBvdXQsIGliX3Byb3RvX29wZXIpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKG1seDVfcXVlcnlfcG9ydF9pYl9wcm90b19vcGVyKTsKIAogaW50IG1seDVfc2V0X3BvcnRfcHR5cyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBib29sIGFuX2Rpc2FibGUsCiAJCSAgICAgICB1MzIgcHJvdG9fYWRtaW4sIGludCBwcm90b19tYXNrKQpAQCAtMjQ2LDE1ICsyNTMsMTIgQEAKIGludCBtbHg1X3NldF9wb3J0X2FkbWluX3N0YXR1cyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAogCQkJICAgICAgIGVudW0gbWx4NV9wb3J0X3N0YXR1cyBzdGF0dXMpCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcocGFvc19yZWcpXTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhwYW9zX3JlZyldID0gezB9OwogCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhwYW9zX3JlZyldOwogCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKLQogCU1MWDVfU0VUKHBhb3NfcmVnLCBpbiwgbG9jYWxfcG9ydCwgMSk7CiAJTUxYNV9TRVQocGFvc19yZWcsIGluLCBhZG1pbl9zdGF0dXMsIHN0YXR1cyk7CiAJTUxYNV9TRVQocGFvc19yZWcsIGluLCBhc2UsIDEpOwotCiAJcmV0dXJuIG1seDVfY29yZV9hY2Nlc3NfcmVnKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwKIAkJCQkgICAgc2l6ZW9mKG91dCksIE1MWDVfUkVHX1BBT1MsIDAsIDEpOwogfQpAQCAtMjYzLDE5ICsyNjcsMTUgQEAKIGludCBtbHg1X3F1ZXJ5X3BvcnRfYWRtaW5fc3RhdHVzKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCiAJCQkJIGVudW0gbWx4NV9wb3J0X3N0YXR1cyAqc3RhdHVzKQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKHBhb3NfcmVnKV07CisJdTMyIGluW01MWDVfU1RfU1pfRFcocGFvc19yZWcpXSA9IHswfTsKIAl1MzIgb3V0W01MWDVfU1RfU1pfRFcocGFvc19yZWcpXTsKIAlpbnQgZXJyOwogCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKLQogCU1MWDVfU0VUKHBhb3NfcmVnLCBpbiwgbG9jYWxfcG9ydCwgMSk7Ci0KIAllcnIgPSBtbHg1X2NvcmVfYWNjZXNzX3JlZyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsCiAJCQkJICAgc2l6ZW9mKG91dCksIE1MWDVfUkVHX1BBT1MsIDAsIDApOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7Ci0KIAkqc3RhdHVzID0gTUxYNV9HRVQocGFvc19yZWcsIG91dCwgYWRtaW5fc3RhdHVzKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTI4NCwxMyArMjg0LDEwIEBACiBzdGF0aWMgdm9pZCBtbHg1X3F1ZXJ5X3BvcnRfbXR1KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUxNiAqYWRtaW5fbXR1LAogCQkJCXUxNiAqbWF4X210dSwgdTE2ICpvcGVyX210dSwgdTggcG9ydCkKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhwbXR1X3JlZyldOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKHBtdHVfcmVnKV0gPSB7MH07CiAJdTMyIG91dFtNTFg1X1NUX1NaX0RXKHBtdHVfcmVnKV07CiAKLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwotCiAJTUxYNV9TRVQocG10dV9yZWcsIGluLCBsb2NhbF9wb3J0LCBwb3J0KTsKLQogCW1seDVfY29yZV9hY2Nlc3NfcmVnKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwKIAkJCSAgICAgc2l6ZW9mKG91dCksIE1MWDVfUkVHX1BNVFUsIDAsIDApOwogCkBAIC0zMDQsMTQgKzMwMSwxMSBAQAogCiBpbnQgbWx4NV9zZXRfcG9ydF9tdHUoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTE2IG10dSwgdTggcG9ydCkKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhwbXR1X3JlZyldOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKHBtdHVfcmVnKV0gPSB7MH07CiAJdTMyIG91dFtNTFg1X1NUX1NaX0RXKHBtdHVfcmVnKV07CiAKLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwotCiAJTUxYNV9TRVQocG10dV9yZWcsIGluLCBhZG1pbl9tdHUsIG10dSk7CiAJTUxYNV9TRVQocG10dV9yZWcsIGluLCBsb2NhbF9wb3J0LCBwb3J0KTsKLQogCXJldHVybiBtbHg1X2NvcmVfYWNjZXNzX3JlZyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsCiAJCQkJICAgc2l6ZW9mKG91dCksIE1MWDVfUkVHX1BNVFUsIDAsIDEpOwogfQpAQCAtMzMzLDE1ICszMjcsMTIgQEAKIAogc3RhdGljIGludCBtbHg1X3F1ZXJ5X21vZHVsZV9udW0oc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgaW50ICptb2R1bGVfbnVtKQogeworCXUzMiBpbltNTFg1X1NUX1NaX0RXKHBtbHBfcmVnKV0gPSB7MH07CiAJdTMyIG91dFtNTFg1X1NUX1NaX0RXKHBtbHBfcmVnKV07Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcocG1scF9yZWcpXTsKIAlpbnQgbW9kdWxlX21hcHBpbmc7CiAJaW50IGVycjsKIAotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7Ci0KIAlNTFg1X1NFVChwbWxwX3JlZywgaW4sIGxvY2FsX3BvcnQsIDEpOwotCiAJZXJyID0gbWx4NV9jb3JlX2FjY2Vzc19yZWcoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSwKIAkJCQkgICBNTFg1X1JFR19QTUxQLCAwLCAwKTsKIAlpZiAoZXJyKQpAQCAtNDEwLDExICs0MDEsOSBAQAogc3RhdGljIGludCBtbHg1X3F1ZXJ5X3BvcnRfcHZsYyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgKnB2bGMsCiAJCQkJaW50IHB2bGNfc2l6ZSwgIHU4IGxvY2FsX3BvcnQpCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcocHZsY19yZWcpXTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhwdmxjX3JlZyldID0gezB9OwogCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKIAlNTFg1X1NFVChwdmxjX3JlZywgaW4sIGxvY2FsX3BvcnQsIGxvY2FsX3BvcnQpOwotCiAJcmV0dXJuIG1seDVfY29yZV9hY2Nlc3NfcmVnKGRldiwgaW4sIHNpemVvZihpbiksIHB2bGMsCiAJCQkJICAgIHB2bGNfc2l6ZSwgTUxYNV9SRUdfUFZMQywgMCwgMCk7CiB9CkBAIC00NjAsMTAgKzQ0OSw5IEBACiAKIGludCBtbHg1X3NldF9wb3J0X3BhdXNlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiByeF9wYXVzZSwgdTMyIHR4X3BhdXNlKQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKHBmY2NfcmVnKV07CisJdTMyIGluW01MWDVfU1RfU1pfRFcocGZjY19yZWcpXSA9IHswfTsKIAl1MzIgb3V0W01MWDVfU1RfU1pfRFcocGZjY19yZWcpXTsKIAotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7CiAJTUxYNV9TRVQocGZjY19yZWcsIGluLCBsb2NhbF9wb3J0LCAxKTsKIAlNTFg1X1NFVChwZmNjX3JlZywgaW4sIHBwdHgsIHR4X3BhdXNlKTsKIAlNTFg1X1NFVChwZmNjX3JlZywgaW4sIHBwcngsIHJ4X3BhdXNlKTsKQEAgLTQ3NiwxMyArNDY0LDExIEBACiBpbnQgbWx4NV9xdWVyeV9wb3J0X3BhdXNlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCiAJCQkgIHUzMiAqcnhfcGF1c2UsIHUzMiAqdHhfcGF1c2UpCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcocGZjY19yZWcpXTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhwZmNjX3JlZyldID0gezB9OwogCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhwZmNjX3JlZyldOwogCWludCBlcnI7CiAKLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwogCU1MWDVfU0VUKHBmY2NfcmVnLCBpbiwgbG9jYWxfcG9ydCwgMSk7Ci0KIAllcnIgPSBtbHg1X2NvcmVfYWNjZXNzX3JlZyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsCiAJCQkJICAgc2l6ZW9mKG91dCksIE1MWDVfUkVHX1BGQ0MsIDAsIDApOwogCWlmIChlcnIpCkBAIC01MDAsMTAgKzQ4Niw5IEBACiAKIGludCBtbHg1X3NldF9wb3J0X3BmYyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1OCBwZmNfZW5fdHgsIHU4IHBmY19lbl9yeCkKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhwZmNjX3JlZyldOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKHBmY2NfcmVnKV0gPSB7MH07CiAJdTMyIG91dFtNTFg1X1NUX1NaX0RXKHBmY2NfcmVnKV07CiAKLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwogCU1MWDVfU0VUKHBmY2NfcmVnLCBpbiwgbG9jYWxfcG9ydCwgMSk7CiAJTUxYNV9TRVQocGZjY19yZWcsIGluLCBwZmN0eCwgcGZjX2VuX3R4KTsKIAlNTFg1X1NFVChwZmNjX3JlZywgaW4sIHBmY3J4LCBwZmNfZW5fcngpOwpAQCAtNTE3LDEzICs1MDIsMTEgQEAKIAogaW50IG1seDVfcXVlcnlfcG9ydF9wZmMoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTggKnBmY19lbl90eCwgdTggKnBmY19lbl9yeCkKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhwZmNjX3JlZyldOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKHBmY2NfcmVnKV0gPSB7MH07CiAJdTMyIG91dFtNTFg1X1NUX1NaX0RXKHBmY2NfcmVnKV07CiAJaW50IGVycjsKIAotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7CiAJTUxYNV9TRVQocGZjY19yZWcsIGluLCBsb2NhbF9wb3J0LCAxKTsKLQogCWVyciA9IG1seDVfY29yZV9hY2Nlc3NfcmVnKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwKIAkJCQkgICBzaXplb2Yob3V0KSwgTUxYNV9SRUdfUEZDQywgMCwgMCk7CiAJaWYgKGVycikKQEAgLTU2NywxMiArNTUwLDExIEBACiAKIGludCBtbHg1X3NldF9wb3J0X3ByaW9fdGMoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsIHU4ICpwcmlvX3RjKQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKHF0Y3RfcmVnKV07CisJdTMyIGluW01MWDVfU1RfU1pfRFcocXRjdF9yZWcpXSA9IHswfTsKIAl1MzIgb3V0W01MWDVfU1RfU1pfRFcocXRjdF9yZWcpXTsKIAlpbnQgZXJyOwogCWludCBpOwogCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAJCWlmIChwcmlvX3RjW2ldID4gbWx4NV9tYXhfdGMobWRldikpCiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTYxNywxMSArNTk5LDkgQEAKIAogaW50IG1seDVfc2V0X3BvcnRfdGNfZ3JvdXAoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsIHU4ICp0Y19ncm91cCkKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhxZXRjX3JlZyldOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKHFldGNfcmVnKV0gPSB7MH07CiAJaW50IGk7CiAKLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwotCiAJZm9yIChpID0gMDsgaSA8PSBtbHg1X21heF90YyhtZGV2KTsgaSsrKSB7CiAJCU1MWDVfU0VUKHFldGNfcmVnLCBpbiwgdGNfY29uZmlndXJhdGlvbltpXS5nLCAxKTsKIAkJTUxYNV9TRVQocWV0Y19yZWcsIGluLCB0Y19jb25maWd1cmF0aW9uW2ldLmdyb3VwLCB0Y19ncm91cFtpXSk7CkBAIC02MzMsMTEgKzYxMyw5IEBACiAKIGludCBtbHg1X3NldF9wb3J0X3RjX2J3X2FsbG9jKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LCB1OCAqdGNfYncpCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcocWV0Y19yZWcpXTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhxZXRjX3JlZyldID0gezB9OwogCWludCBpOwogCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKLQogCWZvciAoaSA9IDA7IGkgPD0gbWx4NV9tYXhfdGMobWRldik7IGkrKykgewogCQlNTFg1X1NFVChxZXRjX3JlZywgaW4sIHRjX2NvbmZpZ3VyYXRpb25baV0uYiwgMSk7CiAJCU1MWDVfU0VUKHFldGNfcmVnLCBpbiwgdGNfY29uZmlndXJhdGlvbltpXS5id19hbGxvY2F0aW9uLCB0Y19id1tpXSk7CkBAIC02NTEsMTIgKzYyOSwxMCBAQAogCQkJCSAgICB1OCAqbWF4X2J3X3ZhbHVlLAogCQkJCSAgICB1OCAqbWF4X2J3X3VuaXRzKQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKHFldGNfcmVnKV07CisJdTMyIGluW01MWDVfU1RfU1pfRFcocWV0Y19yZWcpXSA9IHswfTsKIAl2b2lkICpldHNfdGNuX2NvbmY7CiAJaW50IGk7CiAKLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwotCiAJTUxYNV9TRVQocWV0Y19yZWcsIGluLCBwb3J0X251bWJlciwgMSk7CiAKIAlmb3IgKGkgPSAwOyBpIDw9IG1seDVfbWF4X3RjKG1kZXYpOyBpKyspIHsKQEAgLTcwMSwzNSArNjc3LDI0IEBACiAKIGludCBtbHg1X3NldF9wb3J0X3dvbChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwgdTggd29sX21vZGUpCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcoc2V0X3dvbF9yb2xfaW4pXTsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcoc2V0X3dvbF9yb2xfb3V0KV07Ci0KLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhzZXRfd29sX3JvbF9pbildICAgPSB7MH07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKHNldF93b2xfcm9sX291dCldID0gezB9OwogCiAJTUxYNV9TRVQoc2V0X3dvbF9yb2xfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX1NFVF9XT0xfUk9MKTsKIAlNTFg1X1NFVChzZXRfd29sX3JvbF9pbiwgaW4sIHdvbF9tb2RlX3ZhbGlkLCAxKTsKIAlNTFg1X1NFVChzZXRfd29sX3JvbF9pbiwgaW4sIHdvbF9tb2RlLCB3b2xfbW9kZSk7Ci0KLQlyZXR1cm4gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMobWRldiwgaW4sIHNpemVvZihpbiksCi0JCQkJCSAgb3V0LCBzaXplb2Yob3V0KSk7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMobWRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobWx4NV9zZXRfcG9ydF93b2wpOwogCiBpbnQgbWx4NV9xdWVyeV9wb3J0X3dvbChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwgdTggKndvbF9tb2RlKQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKHF1ZXJ5X3dvbF9yb2xfaW4pXTsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcocXVlcnlfd29sX3JvbF9vdXQpXTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhxdWVyeV93b2xfcm9sX2luKV0gICA9IHswfTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcocXVlcnlfd29sX3JvbF9vdXQpXSA9IHswfTsKIAlpbnQgZXJyOwogCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKLQltZW1zZXQob3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0KIAlNTFg1X1NFVChxdWVyeV93b2xfcm9sX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9RVUVSWV9XT0xfUk9MKTsKLQotCWVyciA9IG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKG1kZXYsIGluLCBzaXplb2YoaW4pLAotCQkJCQkgb3V0LCBzaXplb2Yob3V0KSk7Ci0KKwllcnIgPSBtbHg1X2NtZF9leGVjKG1kZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKIAlpZiAoIWVycikKIAkJKndvbF9tb2RlID0gTUxYNV9HRVQocXVlcnlfd29sX3JvbF9vdXQsIG91dCwgd29sX21vZGUpOwogCkBAIC03NDAsMTEgKzcwNSw5IEBACiBzdGF0aWMgaW50IG1seDVfcXVlcnlfcG9ydHNfY2hlY2soc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsIHUzMiAqb3V0LAogCQkJCSAgaW50IG91dGxlbikKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhwY21yX3JlZyldOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKHBjbXJfcmVnKV0gPSB7MH07CiAKLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwogCU1MWDVfU0VUKHBjbXJfcmVnLCBpbiwgbG9jYWxfcG9ydCwgMSk7Ci0KIAlyZXR1cm4gbWx4NV9jb3JlX2FjY2Vzc19yZWcobWRldiwgaW4sIHNpemVvZihpbiksIG91dCwKIAkJCQkgICAgb3V0bGVuLCBNTFg1X1JFR19QQ01SLCAwLCAwKTsKIH0KQEAgLTc1OSwxMiArNzIyLDEwIEBACiAKIGludCBtbHg1X3NldF9wb3J0X2ZjcyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwgdTggZW5hYmxlKQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKHBjbXJfcmVnKV07CisJdTMyIGluW01MWDVfU1RfU1pfRFcocGNtcl9yZWcpXSA9IHswfTsKIAotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7CiAJTUxYNV9TRVQocGNtcl9yZWcsIGluLCBsb2NhbF9wb3J0LCAxKTsKIAlNTFg1X1NFVChwY21yX3JlZywgaW4sIGZjc19jaGssIGVuYWJsZSk7Ci0KIAlyZXR1cm4gbWx4NV9zZXRfcG9ydHNfY2hlY2sobWRldiwgaW4sIHNpemVvZihpbikpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvcXAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9xcC5jCmluZGV4IGI4MmQ2NTguLmQwYTQwMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9xcC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9xcC5jCkBAIC0yNzEsMzAgKzI3MSwyMCBAQAogCiBpbnQgbWx4NV9jb3JlX2NyZWF0ZV9xcChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAogCQkJc3RydWN0IG1seDVfY29yZV9xcCAqcXAsCi0JCQlzdHJ1Y3QgbWx4NV9jcmVhdGVfcXBfbWJveF9pbiAqaW4sCi0JCQlpbnQgaW5sZW4pCisJCQl1MzIgKmluLCBpbnQgaW5sZW4pCiB7Ci0Jc3RydWN0IG1seDVfY3JlYXRlX3FwX21ib3hfb3V0IG91dDsKLQlzdHJ1Y3QgbWx4NV9kZXN0cm95X3FwX21ib3hfaW4gZGluOwotCXN0cnVjdCBtbHg1X2Rlc3Ryb3lfcXBfbWJveF9vdXQgZG91dDsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoY3JlYXRlX3FwX291dCldID0gezB9OworCXUzMiBkb3V0W01MWDVfU1RfU1pfRFcoZGVzdHJveV9xcF9vdXQpXTsKKwl1MzIgZGluW01MWDVfU1RfU1pfRFcoZGVzdHJveV9xcF9pbildOwogCWludCBlcnI7CiAKLQltZW1zZXQoJm91dCwgMCwgc2l6ZW9mKG91dCkpOwotCWluLT5oZHIub3Bjb2RlID0gY3B1X3RvX2JlMTYoTUxYNV9DTURfT1BfQ1JFQVRFX1FQKTsKKwlNTFg1X1NFVChjcmVhdGVfcXBfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX0NSRUFURV9RUCk7CiAKLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIGlubGVuLCAmb3V0LCBzaXplb2Yob3V0KSk7Ci0JaWYgKGVycikgewotCQltbHg1X2NvcmVfd2FybihkZXYsICJyZXQgJWRcbiIsIGVycik7CisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CisJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQl9CiAKLQlpZiAob3V0Lmhkci5zdGF0dXMpIHsKLQkJbWx4NV9jb3JlX3dhcm4oZGV2LCAiY3VycmVudCBudW0gb2YgUVBzIDB4JXhcbiIsCi0JCQkgICAgICAgYXRvbWljX3JlYWQoJmRldi0+bnVtX3FwcykpOwotCQlyZXR1cm4gbWx4NV9jbWRfc3RhdHVzX3RvX2Vycigmb3V0Lmhkcik7Ci0JfQotCi0JcXAtPnFwbiA9IGJlMzJfdG9fY3B1KG91dC5xcG4pICYgMHhmZmZmZmY7CisJcXAtPnFwbiA9IE1MWDVfR0VUKGNyZWF0ZV9xcF9vdXQsIG91dCwgcXBuKTsKIAltbHg1X2NvcmVfZGJnKGRldiwgInFwbiA9IDB4JXhcbiIsIHFwLT5xcG4pOwogCiAJZXJyID0gY3JlYXRlX3FwcnFzcV9jb21tb24oZGV2LCBxcCwgTUxYNV9SRVNfUVApOwpAQCAtMzExLDEyICszMDEsMTEgQEAKIAlyZXR1cm4gMDsKIAogZXJyX2NtZDoKLQltZW1zZXQoJmRpbiwgMCwgc2l6ZW9mKGRpbikpOwotCW1lbXNldCgmZG91dCwgMCwgc2l6ZW9mKGRvdXQpKTsKLQlkaW4uaGRyLm9wY29kZSA9IGNwdV90b19iZTE2KE1MWDVfQ01EX09QX0RFU1RST1lfUVApOwotCWRpbi5xcG4gPSBjcHVfdG9fYmUzMihxcC0+cXBuKTsKLQltbHg1X2NtZF9leGVjKGRldiwgJmRpbiwgc2l6ZW9mKGRpbiksICZvdXQsIHNpemVvZihkb3V0KSk7Ci0KKwltZW1zZXQoZGluLCAwLCBzaXplb2YoZGluKSk7CisJbWVtc2V0KGRvdXQsIDAsIHNpemVvZihkb3V0KSk7CisJTUxYNV9TRVQoZGVzdHJveV9xcF9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfREVTVFJPWV9RUCk7CisJTUxYNV9TRVQoZGVzdHJveV9xcF9pbiwgaW4sIHFwbiwgcXAtPnFwbik7CisJbWx4NV9jbWRfZXhlYyhkZXYsIGRpbiwgc2l6ZW9mKGRpbiksIGRvdXQsIHNpemVvZihkb3V0KSk7CiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDVfY29yZV9jcmVhdGVfcXApOwpAQCAtMzI0LDQ1ICszMTMsMTQ1IEBACiBpbnQgbWx4NV9jb3JlX2Rlc3Ryb3lfcXAoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKIAkJCSBzdHJ1Y3QgbWx4NV9jb3JlX3FwICpxcCkKIHsKLQlzdHJ1Y3QgbWx4NV9kZXN0cm95X3FwX21ib3hfaW4gaW47Ci0Jc3RydWN0IG1seDVfZGVzdHJveV9xcF9tYm94X291dCBvdXQ7CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfcXBfb3V0KV0gPSB7MH07CisJdTMyIGluW01MWDVfU1RfU1pfRFcoZGVzdHJveV9xcF9pbildICAgPSB7MH07CiAJaW50IGVycjsKIAogCW1seDVfZGVidWdfcXBfcmVtb3ZlKGRldiwgcXApOwogCiAJZGVzdHJveV9xcHJxc3FfY29tbW9uKGRldiwgcXApOwogCi0JbWVtc2V0KCZpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KCZvdXQsIDAsIHNpemVvZihvdXQpKTsKLQlpbi5oZHIub3Bjb2RlID0gY3B1X3RvX2JlMTYoTUxYNV9DTURfT1BfREVTVFJPWV9RUCk7Ci0JaW4ucXBuID0gY3B1X3RvX2JlMzIocXAtPnFwbik7Ci0JZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsICZpbiwgc2l6ZW9mKGluKSwgJm91dCwgc2l6ZW9mKG91dCkpOworCU1MWDVfU0VUKGRlc3Ryb3lfcXBfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX0RFU1RST1lfUVApOworCU1MWDVfU0VUKGRlc3Ryb3lfcXBfaW4sIGluLCBxcG4sIHFwLT5xcG4pOworCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWlmIChvdXQuaGRyLnN0YXR1cykKLQkJcmV0dXJuIG1seDVfY21kX3N0YXR1c190b19lcnIoJm91dC5oZHIpOwotCiAJYXRvbWljX2RlYygmZGV2LT5udW1fcXBzKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDVfY29yZV9kZXN0cm95X3FwKTsKIAotaW50IG1seDVfY29yZV9xcF9tb2RpZnkoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTE2IG9wZXJhdGlvbiwKLQkJCXN0cnVjdCBtbHg1X21vZGlmeV9xcF9tYm94X2luICppbiwgaW50IHNxZF9ldmVudCwKK3N0cnVjdCBtYm94X2luZm8geworCXUzMiAqaW47CisJdTMyICpvdXQ7CisJaW50IGlubGVuOworCWludCBvdXRsZW47Cit9OworCitzdGF0aWMgaW50IG1ib3hfYWxsb2Moc3RydWN0IG1ib3hfaW5mbyAqbWJveCwgaW50IGlubGVuLCBpbnQgb3V0bGVuKQoreworCW1ib3gtPmlubGVuICA9IGlubGVuOworCW1ib3gtPm91dGxlbiA9IG91dGxlbjsKKwltYm94LT5pbiA9IGt6YWxsb2MobWJveC0+aW5sZW4sIEdGUF9LRVJORUwpOworCW1ib3gtPm91dCA9IGt6YWxsb2MobWJveC0+b3V0bGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1ib3gtPmluIHx8ICFtYm94LT5vdXQpIHsKKwkJa2ZyZWUobWJveC0+aW4pOworCQlrZnJlZShtYm94LT5vdXQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbWJveF9mcmVlKHN0cnVjdCBtYm94X2luZm8gKm1ib3gpCit7CisJa2ZyZWUobWJveC0+aW4pOworCWtmcmVlKG1ib3gtPm91dCk7Cit9CisKK3N0YXRpYyBpbnQgbW9kaWZ5X3FwX21ib3hfYWxsb2Moc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTE2IG9wY29kZSwgaW50IHFwbiwKKwkJCQl1MzIgb3B0X3BhcmFtX21hc2ssIHZvaWQgKnFwYywKKwkJCQlzdHJ1Y3QgbWJveF9pbmZvICptYm94KQoreworCW1ib3gtPm91dCA9IE5VTEw7CisJbWJveC0+aW4gPSBOVUxMOworCisjZGVmaW5lIE1CT1hfQUxMT0MobWJveCwgdHlwKSAgXAorCW1ib3hfYWxsb2MobWJveCwgTUxYNV9TVF9TWl9CWVRFUyh0eXAjI19pbiksIE1MWDVfU1RfU1pfQllURVModHlwIyNfb3V0KSkKKworI2RlZmluZSBNT0RfUVBfSU5fU0VUKHR5cCwgaW4sIF9vcGNvZGUsIF9xcG4pIFwKKwlNTFg1X1NFVCh0eXAjI19pbiwgaW4sIG9wY29kZSwgX29wY29kZSk7IFwKKwlNTFg1X1NFVCh0eXAjI19pbiwgaW4sIHFwbiwgX3FwbikKKworI2RlZmluZSBNT0RfUVBfSU5fU0VUX1FQQyh0eXAsIGluLCBfb3Bjb2RlLCBfcXBuLCBfb3B0X3AsIF9xcGMpIFwKKwlNT0RfUVBfSU5fU0VUKHR5cCwgaW4sIF9vcGNvZGUsIF9xcG4pOyBcCisJTUxYNV9TRVQodHlwIyNfaW4sIGluLCBvcHRfcGFyYW1fbWFzaywgX29wdF9wKTsgXAorCW1lbWNweShNTFg1X0FERFJfT0YodHlwIyNfaW4sIGluLCBxcGMpLCBfcXBjLCBNTFg1X1NUX1NaX0JZVEVTKHFwYykpCisKKwlzd2l0Y2ggKG9wY29kZSkgeworCS8qIDJSU1QgJiAyRVJSICovCisJY2FzZSBNTFg1X0NNRF9PUF8yUlNUX1FQOgorCQlpZiAoTUJPWF9BTExPQyhtYm94LCBxcF8ycnN0KSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlNT0RfUVBfSU5fU0VUKHFwXzJyc3QsIG1ib3gtPmluLCBvcGNvZGUsIHFwbik7CisJCWJyZWFrOworCWNhc2UgTUxYNV9DTURfT1BfMkVSUl9RUDoKKwkJaWYgKE1CT1hfQUxMT0MobWJveCwgcXBfMmVycikpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJTU9EX1FQX0lOX1NFVChxcF8yZXJyLCBtYm94LT5pbiwgb3Bjb2RlLCBxcG4pOworCQlicmVhazsKKworCS8qIE1PRElGWSB3aXRoIFFQQyAqLworCWNhc2UgTUxYNV9DTURfT1BfUlNUMklOSVRfUVA6CisJCWlmIChNQk9YX0FMTE9DKG1ib3gsIHJzdDJpbml0X3FwKSkKKwkJCXJldHVybiAtRU5PTUVNOworCQkgTU9EX1FQX0lOX1NFVF9RUEMocnN0MmluaXRfcXAsIG1ib3gtPmluLCBvcGNvZGUsIHFwbiwKKwkJCQkgICBvcHRfcGFyYW1fbWFzaywgcXBjKTsKKwkJIGJyZWFrOworCWNhc2UgTUxYNV9DTURfT1BfSU5JVDJSVFJfUVA6CisJCWlmIChNQk9YX0FMTE9DKG1ib3gsIGluaXQycnRyX3FwKSkKKwkJCXJldHVybiAtRU5PTUVNOworCQkgTU9EX1FQX0lOX1NFVF9RUEMoaW5pdDJydHJfcXAsIG1ib3gtPmluLCBvcGNvZGUsIHFwbiwKKwkJCQkgICBvcHRfcGFyYW1fbWFzaywgcXBjKTsKKwkJIGJyZWFrOworCWNhc2UgTUxYNV9DTURfT1BfUlRSMlJUU19RUDoKKwkJaWYgKE1CT1hfQUxMT0MobWJveCwgcnRyMnJ0c19xcCkpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJIE1PRF9RUF9JTl9TRVRfUVBDKHJ0cjJydHNfcXAsIG1ib3gtPmluLCBvcGNvZGUsIHFwbiwKKwkJCQkgICBvcHRfcGFyYW1fbWFzaywgcXBjKTsKKwkJIGJyZWFrOworCWNhc2UgTUxYNV9DTURfT1BfUlRTMlJUU19RUDoKKwkJaWYgKE1CT1hfQUxMT0MobWJveCwgcnRzMnJ0c19xcCkpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJTU9EX1FQX0lOX1NFVF9RUEMocnRzMnJ0c19xcCwgbWJveC0+aW4sIG9wY29kZSwgcXBuLAorCQkJCSAgb3B0X3BhcmFtX21hc2ssIHFwYyk7CisJCWJyZWFrOworCWNhc2UgTUxYNV9DTURfT1BfU1FFUlIyUlRTX1FQOgorCQlpZiAoTUJPWF9BTExPQyhtYm94LCBzcWVycjJydHNfcXApKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCU1PRF9RUF9JTl9TRVRfUVBDKHNxZXJyMnJ0c19xcCwgbWJveC0+aW4sIG9wY29kZSwgcXBuLAorCQkJCSAgb3B0X3BhcmFtX21hc2ssIHFwYyk7CisJCWJyZWFrOworCWNhc2UgTUxYNV9DTURfT1BfSU5JVDJJTklUX1FQOgorCQlpZiAoTUJPWF9BTExPQyhtYm94LCBpbml0MmluaXRfcXApKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCU1PRF9RUF9JTl9TRVRfUVBDKGluaXQyaW5pdF9xcCwgbWJveC0+aW4sIG9wY29kZSwgcXBuLAorCQkJCSAgb3B0X3BhcmFtX21hc2ssIHFwYyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW1seDVfY29yZV9lcnIoZGV2LCAiVW5rbm93biB0cmFuc2l0aW9uIGZvciBtb2RpZnkgUVA6IE9QKDB4JXgpIFFQTigweCV4KVxuIiwKKwkJCSAgICAgIG9wY29kZSwgcXBuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitpbnQgbWx4NV9jb3JlX3FwX21vZGlmeShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MTYgb3Bjb2RlLAorCQkJdTMyIG9wdF9wYXJhbV9tYXNrLCB2b2lkICpxcGMsCiAJCQlzdHJ1Y3QgbWx4NV9jb3JlX3FwICpxcCkKIHsKLQlzdHJ1Y3QgbWx4NV9tb2RpZnlfcXBfbWJveF9vdXQgb3V0OwotCWludCBlcnIgPSAwOworCXN0cnVjdCBtYm94X2luZm8gbWJveDsKKwlpbnQgZXJyOwogCi0JbWVtc2V0KCZvdXQsIDAsIHNpemVvZihvdXQpKTsKLQlpbi0+aGRyLm9wY29kZSA9IGNwdV90b19iZTE2KG9wZXJhdGlvbik7Ci0JaW4tPnFwbiA9IGNwdV90b19iZTMyKHFwLT5xcG4pOwotCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKCppbiksICZvdXQsIHNpemVvZihvdXQpKTsKKwllcnIgPSBtb2RpZnlfcXBfbWJveF9hbGxvYyhkZXYsIG9wY29kZSwgcXAtPnFwbiwKKwkJCQkgICBvcHRfcGFyYW1fbWFzaywgcXBjLCAmbWJveCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCXJldHVybiBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyKCZvdXQuaGRyKTsKKwllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgbWJveC5pbiwgbWJveC5pbmxlbiwgbWJveC5vdXQsIG1ib3gub3V0bGVuKTsKKwltYm94X2ZyZWUoJm1ib3gpOworCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtbHg1X2NvcmVfcXBfbW9kaWZ5KTsKIApAQCAtMzgyLDY2ICs0NzEsMzggQEAKIH0KIAogaW50IG1seDVfY29yZV9xcF9xdWVyeShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9jb3JlX3FwICpxcCwKLQkJICAgICAgIHN0cnVjdCBtbHg1X3F1ZXJ5X3FwX21ib3hfb3V0ICpvdXQsIGludCBvdXRsZW4pCisJCSAgICAgICB1MzIgKm91dCwgaW50IG91dGxlbikKIHsKLQlzdHJ1Y3QgbWx4NV9xdWVyeV9xcF9tYm94X2luIGluOwotCWludCBlcnI7CisJdTMyIGluW01MWDVfU1RfU1pfRFcocXVlcnlfcXBfaW4pXSA9IHswfTsKIAotCW1lbXNldCgmaW4sIDAsIHNpemVvZihpbikpOwotCW1lbXNldChvdXQsIDAsIG91dGxlbik7Ci0JaW4uaGRyLm9wY29kZSA9IGNwdV90b19iZTE2KE1MWDVfQ01EX09QX1FVRVJZX1FQKTsKLQlpbi5xcG4gPSBjcHVfdG9fYmUzMihxcC0+cXBuKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgJmluLCBzaXplb2YoaW4pLCBvdXQsIG91dGxlbik7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWlmIChvdXQtPmhkci5zdGF0dXMpCi0JCXJldHVybiBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyKCZvdXQtPmhkcik7Ci0KLQlyZXR1cm4gZXJyOworCU1MWDVfU0VUKHF1ZXJ5X3FwX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9RVUVSWV9RUCk7CisJTUxYNV9TRVQocXVlcnlfcXBfaW4sIGluLCBxcG4sIHFwLT5xcG4pOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgb3V0bGVuKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDVfY29yZV9xcF9xdWVyeSk7CiAKIGludCBtbHg1X2NvcmVfeHJjZF9hbGxvYyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgKnhyY2RuKQogewotCXN0cnVjdCBtbHg1X2FsbG9jX3hyY2RfbWJveF9pbiBpbjsKLQlzdHJ1Y3QgbWx4NV9hbGxvY194cmNkX21ib3hfb3V0IG91dDsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoYWxsb2NfeHJjZF9vdXQpXSA9IHswfTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhhbGxvY194cmNkX2luKV0gICA9IHswfTsKIAlpbnQgZXJyOwogCi0JbWVtc2V0KCZpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KCZvdXQsIDAsIHNpemVvZihvdXQpKTsKLQlpbi5oZHIub3Bjb2RlID0gY3B1X3RvX2JlMTYoTUxYNV9DTURfT1BfQUxMT0NfWFJDRCk7Ci0JZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsICZpbiwgc2l6ZW9mKGluKSwgJm91dCwgc2l6ZW9mKG91dCkpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlpZiAob3V0Lmhkci5zdGF0dXMpCi0JCWVyciA9IG1seDVfY21kX3N0YXR1c190b19lcnIoJm91dC5oZHIpOwotCWVsc2UKLQkJKnhyY2RuID0gYmUzMl90b19jcHUob3V0LnhyY2RuKSAmIDB4ZmZmZmZmOwotCisJTUxYNV9TRVQoYWxsb2NfeHJjZF9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfQUxMT0NfWFJDRCk7CisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKKwlpZiAoIWVycikKKwkJKnhyY2RuID0gTUxYNV9HRVQoYWxsb2NfeHJjZF9vdXQsIG91dCwgeHJjZCk7CiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDVfY29yZV94cmNkX2FsbG9jKTsKIAogaW50IG1seDVfY29yZV94cmNkX2RlYWxsb2Moc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyIHhyY2RuKQogewotCXN0cnVjdCBtbHg1X2RlYWxsb2NfeHJjZF9tYm94X2luIGluOwotCXN0cnVjdCBtbHg1X2RlYWxsb2NfeHJjZF9tYm94X291dCBvdXQ7Ci0JaW50IGVycjsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoZGVhbGxvY194cmNkX291dCldID0gezB9OworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlYWxsb2NfeHJjZF9pbildICAgPSB7MH07CiAKLQltZW1zZXQoJmluLCAwLCBzaXplb2YoaW4pKTsKLQltZW1zZXQoJm91dCwgMCwgc2l6ZW9mKG91dCkpOwotCWluLmhkci5vcGNvZGUgPSBjcHVfdG9fYmUxNihNTFg1X0NNRF9PUF9ERUFMTE9DX1hSQ0QpOwotCWluLnhyY2RuID0gY3B1X3RvX2JlMzIoeHJjZG4pOwotCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCAmaW4sIHNpemVvZihpbiksICZvdXQsIHNpemVvZihvdXQpKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKG91dC5oZHIuc3RhdHVzKQotCQllcnIgPSBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyKCZvdXQuaGRyKTsKLQotCXJldHVybiBlcnI7CisJTUxYNV9TRVQoZGVhbGxvY194cmNkX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9ERUFMTE9DX1hSQ0QpOworCU1MWDVfU0VUKGRlYWxsb2NfeHJjZF9pbiwgaW4sIHhyY2QsIHhyY2RuKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDVfY29yZV94cmNkX2RlYWxsb2MpOwogCkBAIC00NDksMjggKzUxMCwyMyBAQAogaW50IG1seDVfY29yZV9wYWdlX2ZhdWx0X3Jlc3VtZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgcXBuLAogCQkJCXU4IGZsYWdzLCBpbnQgZXJyb3IpCiB7Ci0Jc3RydWN0IG1seDVfcGFnZV9mYXVsdF9yZXN1bWVfbWJveF9pbiBpbjsKLQlzdHJ1Y3QgbWx4NV9wYWdlX2ZhdWx0X3Jlc3VtZV9tYm94X291dCBvdXQ7Ci0JaW50IGVycjsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcocGFnZV9mYXVsdF9yZXN1bWVfb3V0KV0gPSB7MH07CisJdTMyIGluW01MWDVfU1RfU1pfRFcocGFnZV9mYXVsdF9yZXN1bWVfaW4pXSAgID0gezB9OwogCi0JbWVtc2V0KCZpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KCZvdXQsIDAsIHNpemVvZihvdXQpKTsKLQlpbi5oZHIub3Bjb2RlID0gY3B1X3RvX2JlMTYoTUxYNV9DTURfT1BfUEFHRV9GQVVMVF9SRVNVTUUpOwotCWluLmhkci5vcG1vZCA9IDA7Ci0JZmxhZ3MgJj0gKE1MWDVfUEFHRV9GQVVMVF9SRVNVTUVfUkVRVUVTVE9SIHwKLQkJICBNTFg1X1BBR0VfRkFVTFRfUkVTVU1FX1dSSVRFCSAgIHwKLQkJICBNTFg1X1BBR0VfRkFVTFRfUkVTVU1FX1JETUEpOwotCWZsYWdzIHw9IChlcnJvciA/IE1MWDVfUEFHRV9GQVVMVF9SRVNVTUVfRVJST1IgOiAwKTsKLQlpbi5mbGFnc19xcG4gPSBjcHVfdG9fYmUzMigocXBuICYgTUxYNV9RUE5fTUFTSykgfAotCQkJCSAgIChmbGFncyA8PCBNTFg1X1FQTl9CSVRTKSk7Ci0JZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsICZpbiwgc2l6ZW9mKGluKSwgJm91dCwgc2l6ZW9mKG91dCkpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7CisJTUxYNV9TRVQocGFnZV9mYXVsdF9yZXN1bWVfaW4sIGluLCBvcGNvZGUsCisJCSBNTFg1X0NNRF9PUF9QQUdFX0ZBVUxUX1JFU1VNRSk7CisJTUxYNV9TRVQocGFnZV9mYXVsdF9yZXN1bWVfaW4sIGluLCBxcG4sIHFwbik7CiAKLQlpZiAob3V0Lmhkci5zdGF0dXMpCi0JCWVyciA9IG1seDVfY21kX3N0YXR1c190b19lcnIoJm91dC5oZHIpOworCWlmIChmbGFncyAmIE1MWDVfUEFHRV9GQVVMVF9SRVNVTUVfUkVRVUVTVE9SKQorCQlNTFg1X1NFVChwYWdlX2ZhdWx0X3Jlc3VtZV9pbiwgaW4sIHJlcV9yZXMsIDEpOworCWlmIChmbGFncyAmIE1MWDVfUEFHRV9GQVVMVF9SRVNVTUVfV1JJVEUpCisJCU1MWDVfU0VUKHBhZ2VfZmF1bHRfcmVzdW1lX2luLCBpbiwgcmVhZF93cml0ZSwgMSk7CisJaWYgKGZsYWdzICYgTUxYNV9QQUdFX0ZBVUxUX1JFU1VNRV9SRE1BKQorCQlNTFg1X1NFVChwYWdlX2ZhdWx0X3Jlc3VtZV9pbiwgaW4sIHJkbWEsIDEpOworCWlmIChlcnJvcikKKwkJTUxYNV9TRVQocGFnZV9mYXVsdF9yZXN1bWVfaW4sIGluLCBlcnJvciwgMSk7CiAKLQlyZXR1cm4gZXJyOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobWx4NV9jb3JlX3BhZ2VfZmF1bHRfcmVzdW1lKTsKICNlbmRpZgpAQCAtNTQxLDE1ICs1OTcsMTIgQEAKIAogaW50IG1seDVfY29yZV9hbGxvY19xX2NvdW50ZXIoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTE2ICpjb3VudGVyX2lkKQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKGFsbG9jX3FfY291bnRlcl9pbildOwotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhhbGxvY19xX2NvdW50ZXJfb3V0KV07CisJdTMyIGluW01MWDVfU1RfU1pfRFcoYWxsb2NfcV9jb3VudGVyX2luKV0gICA9IHswfTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoYWxsb2NfcV9jb3VudGVyX291dCldID0gezB9OwogCWludCBlcnI7CiAKLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKLQogCU1MWDVfU0VUKGFsbG9jX3FfY291bnRlcl9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfQUxMT0NfUV9DT1VOVEVSKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKKwllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogCWlmICghZXJyKQogCQkqY291bnRlcl9pZCA9IE1MWDVfR0VUKGFsbG9jX3FfY291bnRlcl9vdXQsIG91dCwKIAkJCQkgICAgICAgY291bnRlcl9zZXRfaWQpOwpAQCAtNTU5LDMxICs2MTIsMjUgQEAKIAogaW50IG1seDVfY29yZV9kZWFsbG9jX3FfY291bnRlcihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MTYgY291bnRlcl9pZCkKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhkZWFsbG9jX3FfY291bnRlcl9pbildOwotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZWFsbG9jX3FfY291bnRlcl9vdXQpXTsKLQotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlYWxsb2NfcV9jb3VudGVyX2luKV0gICA9IHswfTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoZGVhbGxvY19xX2NvdW50ZXJfb3V0KV0gPSB7MH07CiAKIAlNTFg1X1NFVChkZWFsbG9jX3FfY291bnRlcl9pbiwgaW4sIG9wY29kZSwKIAkJIE1MWDVfQ01EX09QX0RFQUxMT0NfUV9DT1VOVEVSKTsKIAlNTFg1X1NFVChkZWFsbG9jX3FfY291bnRlcl9pbiwgaW4sIGNvdW50ZXJfc2V0X2lkLCBjb3VudGVyX2lkKTsKLQlyZXR1cm4gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LAotCQkJCQkgIHNpemVvZihvdXQpKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDVfY29yZV9kZWFsbG9jX3FfY291bnRlcik7CiAKIGludCBtbHg1X2NvcmVfcXVlcnlfcV9jb3VudGVyKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUxNiBjb3VudGVyX2lkLAogCQkJICAgICAgaW50IHJlc2V0LCB2b2lkICpvdXQsIGludCBvdXRfc2l6ZSkKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhxdWVyeV9xX2NvdW50ZXJfaW4pXTsKLQotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7CisJdTMyIGluW01MWDVfU1RfU1pfRFcocXVlcnlfcV9jb3VudGVyX2luKV0gPSB7MH07CiAKIAlNTFg1X1NFVChxdWVyeV9xX2NvdW50ZXJfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX1FVRVJZX1FfQ09VTlRFUik7CiAJTUxYNV9TRVQocXVlcnlfcV9jb3VudGVyX2luLCBpbiwgY2xlYXIsIHJlc2V0KTsKIAlNTFg1X1NFVChxdWVyeV9xX2NvdW50ZXJfaW4sIGluLCBjb3VudGVyX3NldF9pZCwgY291bnRlcl9pZCk7Ci0JcmV0dXJuIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgb3V0X3NpemUpOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgb3V0X3NpemUpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobWx4NV9jb3JlX3F1ZXJ5X3FfY291bnRlcik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9ybC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3JsLmMKaW5kZXggYzA3YzI4Yi4uMTA0OTAyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3JsLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3JsLmMKQEAgLTYzLDE5ICs2MywxNCBAQAogc3RhdGljIGludCBtbHg1X3NldF9yYXRlX2xpbWl0X2NtZChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAogCQkJCSAgIHUzMiByYXRlLCB1MTYgaW5kZXgpCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcoc2V0X3JhdGVfbGltaXRfaW4pXTsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcoc2V0X3JhdGVfbGltaXRfb3V0KV07Ci0KLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhzZXRfcmF0ZV9saW1pdF9pbildICAgPSB7MH07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKHNldF9yYXRlX2xpbWl0X291dCldID0gezB9OwogCiAJTUxYNV9TRVQoc2V0X3JhdGVfbGltaXRfaW4sIGluLCBvcGNvZGUsCiAJCSBNTFg1X0NNRF9PUF9TRVRfUkFURV9MSU1JVCk7CiAJTUxYNV9TRVQoc2V0X3JhdGVfbGltaXRfaW4sIGluLCByYXRlX2xpbWl0X2luZGV4LCBpbmRleCk7CiAJTUxYNV9TRVQoc2V0X3JhdGVfbGltaXRfaW4sIGluLCByYXRlX2xpbWl0LCByYXRlKTsKLQotCXJldHVybiBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBzaXplb2YoaW4pLAotCQkJCQkgIG91dCwgc2l6ZW9mKG91dCkpOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQogCiBib29sIG1seDVfcmxfaXNfaW5fcmFuZ2Uoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyIHJhdGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvc3Jpb3YuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9zcmlvdi5jCmluZGV4IGIzODBhNmIuLmUwODYyNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9zcmlvdi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9zcmlvdi5jCkBAIC0zNywxOTggKzM3LDIwMCBAQAogI2luY2x1ZGUgImVzd2l0Y2guaCIKICNlbmRpZgogCi1zdGF0aWMgdm9pZCBlbmFibGVfdmZzKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIGludCBudW1fdmZzKQorYm9vbCBtbHg1X3NyaW92X2lzX2VuYWJsZWQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgbWx4NV9jb3JlX3NyaW92ICpzcmlvdiA9ICZkZXYtPnByaXYuc3Jpb3Y7CisKKwlyZXR1cm4gISFzcmlvdi0+bnVtX3ZmczsKK30KKworc3RhdGljIGludCBtbHg1X2RldmljZV9lbmFibGVfc3Jpb3Yoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgaW50IG51bV92ZnMpCiB7CiAJc3RydWN0IG1seDVfY29yZV9zcmlvdiAqc3Jpb3YgPSAmZGV2LT5wcml2LnNyaW92OwogCWludCBlcnI7CiAJaW50IHZmOwogCi0JZm9yICh2ZiA9IDE7IHZmIDw9IG51bV92ZnM7IHZmKyspIHsKLQkJZXJyID0gbWx4NV9jb3JlX2VuYWJsZV9oY2EoZGV2LCB2Zik7Ci0JCWlmIChlcnIpIHsKLQkJCW1seDVfY29yZV93YXJuKGRldiwgImZhaWxlZCB0byBlbmFibGUgVkYgJWRcbiIsIHZmIC0gMSk7Ci0JCX0gZWxzZSB7Ci0JCQlzcmlvdi0+dmZzX2N0eFt2ZiAtIDFdLmVuYWJsZWQgPSAxOwotCQkJbWx4NV9jb3JlX2RiZyhkZXYsICJzdWNjZXNzZnVsbHkgZW5hYmxlZCBWRiAlZFxuIiwgdmYgLSAxKTsKLQkJfQorCWlmIChzcmlvdi0+ZW5hYmxlZF92ZnMpIHsKKwkJbWx4NV9jb3JlX3dhcm4oZGV2LAorCQkJICAgICAgICJmYWlsZWQgdG8gZW5hYmxlIFNSSU9WIG9uIGRldmljZSwgYWxyZWFkeSBlbmFibGVkIHdpdGggJWQgdmZzXG4iLAorCQkJICAgICAgIHNyaW92LT5lbmFibGVkX3Zmcyk7CisJCXJldHVybiAtRUJVU1k7CiAJfQotfQogCi1zdGF0aWMgdm9pZCBkaXNhYmxlX3ZmcyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBpbnQgbnVtX3ZmcykKLXsKLQlzdHJ1Y3QgbWx4NV9jb3JlX3NyaW92ICpzcmlvdiA9ICZkZXYtPnByaXYuc3Jpb3Y7Ci0JaW50IHZmOwotCi0JZm9yICh2ZiA9IDE7IHZmIDw9IG51bV92ZnM7IHZmKyspIHsKLQkJaWYgKHNyaW92LT52ZnNfY3R4W3ZmIC0gMV0uZW5hYmxlZCkgewotCQkJaWYgKG1seDVfY29yZV9kaXNhYmxlX2hjYShkZXYsIHZmKSkKLQkJCQltbHg1X2NvcmVfd2FybihkZXYsICJmYWlsZWQgdG8gZGlzYWJsZSBWRiAlZFxuIiwgdmYgLSAxKTsKLQkJCWVsc2UKLQkJCQlzcmlvdi0+dmZzX2N0eFt2ZiAtIDFdLmVuYWJsZWQgPSAwOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgaW50IG1seDVfY29yZV9jcmVhdGVfdmZzKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgbnVtX3ZmcykKLXsKLQlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2ICA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlpbnQgZXJyOwotCi0JaWYgKHBjaV9udW1fdmYocGRldikpCi0JCXBjaV9kaXNhYmxlX3NyaW92KHBkZXYpOwotCi0JZW5hYmxlX3ZmcyhkZXYsIG51bV92ZnMpOwotCi0JZXJyID0gcGNpX2VuYWJsZV9zcmlvdihwZGV2LCBudW1fdmZzKTsKKyNpZmRlZiBDT05GSUdfTUxYNV9DT1JFX0VOCisJZXJyID0gbWx4NV9lc3dpdGNoX2VuYWJsZV9zcmlvdihkZXYtPnByaXYuZXN3aXRjaCwgbnVtX3ZmcywgU1JJT1ZfTEVHQUNZKTsKIAlpZiAoZXJyKSB7Ci0JCWRldl93YXJuKCZwZGV2LT5kZXYsICJlbmFibGUgc3Jpb3YgZmFpbGVkICVkXG4iLCBlcnIpOwotCQlnb3RvIGV4OworCQltbHg1X2NvcmVfd2FybihkZXYsCisJCQkgICAgICAgImZhaWxlZCB0byBlbmFibGUgZXN3aXRjaCBTUklPViAoJWQpXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKyNlbmRpZgorCisJZm9yICh2ZiA9IDA7IHZmIDwgbnVtX3ZmczsgdmYrKykgeworCQllcnIgPSBtbHg1X2NvcmVfZW5hYmxlX2hjYShkZXYsIHZmICsgMSk7CisJCWlmIChlcnIpIHsKKwkJCW1seDVfY29yZV93YXJuKGRldiwgImZhaWxlZCB0byBlbmFibGUgVkYgJWQgKCVkKVxuIiwgdmYsIGVycik7CisJCQljb250aW51ZTsKKwkJfQorCQlzcmlvdi0+dmZzX2N0eFt2Zl0uZW5hYmxlZCA9IDE7CisJCXNyaW92LT5lbmFibGVkX3ZmcysrOworCQltbHg1X2NvcmVfZGJnKGRldiwgInN1Y2Nlc3NmdWxseSBlbmFibGVkIFZGKiAlZFxuIiwgdmYpOworCiAJfQogCiAJcmV0dXJuIDA7Cit9CiAKLWV4OgotCWRpc2FibGVfdmZzKGRldiwgbnVtX3Zmcyk7CitzdGF0aWMgdm9pZCBtbHg1X2RldmljZV9kaXNhYmxlX3NyaW92KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpCit7CisJc3RydWN0IG1seDVfY29yZV9zcmlvdiAqc3Jpb3YgPSAmZGV2LT5wcml2LnNyaW92OworCWludCBlcnI7CisJaW50IHZmOworCisJaWYgKCFzcmlvdi0+ZW5hYmxlZF92ZnMpCisJCXJldHVybjsKKworCWZvciAodmYgPSAwOyB2ZiA8IHNyaW92LT5udW1fdmZzOyB2ZisrKSB7CisJCWlmICghc3Jpb3YtPnZmc19jdHhbdmZdLmVuYWJsZWQpCisJCQljb250aW51ZTsKKwkJZXJyID0gbWx4NV9jb3JlX2Rpc2FibGVfaGNhKGRldiwgdmYgKyAxKTsKKwkJaWYgKGVycikgeworCQkJbWx4NV9jb3JlX3dhcm4oZGV2LCAiZmFpbGVkIHRvIGRpc2FibGUgVkYgJWRcbiIsIHZmKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXNyaW92LT52ZnNfY3R4W3ZmXS5lbmFibGVkID0gMDsKKwkJc3Jpb3YtPmVuYWJsZWRfdmZzLS07CisJfQorCisjaWZkZWYgQ09ORklHX01MWDVfQ09SRV9FTgorCW1seDVfZXN3aXRjaF9kaXNhYmxlX3NyaW92KGRldi0+cHJpdi5lc3dpdGNoKTsKKyNlbmRpZgorCisJaWYgKG1seDVfd2FpdF9mb3JfdmZfcGFnZXMoZGV2KSkKKwkJbWx4NV9jb3JlX3dhcm4oZGV2LCAidGltZW91dCByZWNsYWltaW5nIFZGcyBwYWdlc1xuIik7Cit9CisKK3N0YXRpYyBpbnQgbWx4NV9wY2lfZW5hYmxlX3NyaW92KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgbnVtX3ZmcykKK3sKKwlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2ICA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgZXJyID0gMDsKKworCWlmIChwY2lfbnVtX3ZmKHBkZXYpKSB7CisJCW1seDVfY29yZV93YXJuKGRldiwgIlVuYWJsZSB0byBlbmFibGUgcGNpIHNyaW92LCBhbHJlYWR5IGVuYWJsZWRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWVyciA9IHBjaV9lbmFibGVfc3Jpb3YocGRldiwgbnVtX3Zmcyk7CisJaWYgKGVycikKKwkJbWx4NV9jb3JlX3dhcm4oZGV2LCAicGNpX2VuYWJsZV9zcmlvdiBmYWlsZWQgOiAlZFxuIiwgZXJyKTsKKwogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgbWx4NV9jb3JlX3NyaW92X2VuYWJsZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IG51bV92ZnMpCitzdGF0aWMgdm9pZCBtbHg1X3BjaV9kaXNhYmxlX3NyaW92KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXBjaV9kaXNhYmxlX3NyaW92KHBkZXYpOworfQorCitzdGF0aWMgaW50IG1seDVfc3Jpb3ZfZW5hYmxlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgbnVtX3ZmcykKIHsKIAlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2ICA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgbWx4NV9jb3JlX3NyaW92ICpzcmlvdiA9ICZkZXYtPnByaXYuc3Jpb3Y7Ci0JaW50IGVycjsKKwlpbnQgZXJyID0gMDsKIAotCWtmcmVlKHNyaW92LT52ZnNfY3R4KTsKLQlzcmlvdi0+dmZzX2N0eCA9IGtjYWxsb2MobnVtX3Zmcywgc2l6ZW9mKCpzcmlvdi0+dmZzX2N0eCksIEdGUF9BVE9NSUMpOwotCWlmICghc3Jpb3YtPnZmc19jdHgpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc3Jpb3YtPmVuYWJsZWRfdmZzID0gbnVtX3ZmczsKLQllcnIgPSBtbHg1X2NvcmVfY3JlYXRlX3ZmcyhwZGV2LCBudW1fdmZzKTsKKwllcnIgPSBtbHg1X2RldmljZV9lbmFibGVfc3Jpb3YoZGV2LCBudW1fdmZzKTsKIAlpZiAoZXJyKSB7Ci0JCWtmcmVlKHNyaW92LT52ZnNfY3R4KTsKLQkJc3Jpb3YtPnZmc19jdHggPSBOVUxMOworCQltbHg1X2NvcmVfd2FybihkZXYsICJtbHg1X2RldmljZV9lbmFibGVfc3Jpb3YgZmFpbGVkIDogJWRcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCisJZXJyID0gbWx4NV9wY2lfZW5hYmxlX3NyaW92KHBkZXYsIG51bV92ZnMpOworCWlmIChlcnIpIHsKKwkJbWx4NV9jb3JlX3dhcm4oZGV2LCAibWx4NV9wY2lfZW5hYmxlX3NyaW92IGZhaWxlZCA6ICVkXG4iLCBlcnIpOworCQltbHg1X2RldmljZV9kaXNhYmxlX3NyaW92KGRldik7CisJCXJldHVybiBlcnI7CisJfQorCisJc3Jpb3YtPm51bV92ZnMgPSBudW1fdmZzOworCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIG1seDVfY29yZV9pbml0X3ZmcyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBpbnQgbnVtX3ZmcykKK3N0YXRpYyB2b2lkIG1seDVfc3Jpb3ZfZGlzYWJsZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKKwlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2ICA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgbWx4NV9jb3JlX3NyaW92ICpzcmlvdiA9ICZkZXYtPnByaXYuc3Jpb3Y7CiAKLQlzcmlvdi0+bnVtX3ZmcyA9IG51bV92ZnM7Ci19Ci0KLXN0YXRpYyB2b2lkIG1seDVfY29yZV9jbGVhbnVwX3ZmcyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KQotewotCXN0cnVjdCBtbHg1X2NvcmVfc3Jpb3YgKnNyaW92OwotCi0Jc3Jpb3YgPSAmZGV2LT5wcml2LnNyaW92OwotCWRpc2FibGVfdmZzKGRldiwgc3Jpb3YtPm51bV92ZnMpOwotCi0JaWYgKG1seDVfd2FpdF9mb3JfdmZfcGFnZXMoZGV2KSkKLQkJbWx4NV9jb3JlX3dhcm4oZGV2LCAidGltZW91dCBjbGFpbWluZyBWRnMgcGFnZXNcbiIpOwotCisJbWx4NV9wY2lfZGlzYWJsZV9zcmlvdihwZGV2KTsKKwltbHg1X2RldmljZV9kaXNhYmxlX3NyaW92KGRldik7CiAJc3Jpb3YtPm51bV92ZnMgPSAwOwogfQogCiBpbnQgbWx4NV9jb3JlX3NyaW92X2NvbmZpZ3VyZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IG51bV92ZnMpCiB7CiAJc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiAgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IG1seDVfY29yZV9zcmlvdiAqc3Jpb3YgPSAmZGV2LT5wcml2LnNyaW92OwotCWludCBlcnI7CisJaW50IGVyciA9IDA7CiAKIAltbHg1X2NvcmVfZGJnKGRldiwgInJlcXVlc3RlZCBudW1fdmZzICVkXG4iLCBudW1fdmZzKTsKIAlpZiAoIW1seDVfY29yZV9pc19wZihkZXYpKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JbWx4NV9jb3JlX2NsZWFudXBfdmZzKGRldik7Ci0KLQlpZiAoIW51bV92ZnMpIHsKLSNpZmRlZiBDT05GSUdfTUxYNV9DT1JFX0VOCi0JCW1seDVfZXN3aXRjaF9kaXNhYmxlX3NyaW92KGRldi0+cHJpdi5lc3dpdGNoKTsKLSNlbmRpZgotCQlrZnJlZShzcmlvdi0+dmZzX2N0eCk7Ci0JCXNyaW92LT52ZnNfY3R4ID0gTlVMTDsKLQkJaWYgKCFwY2lfdmZzX2Fzc2lnbmVkKHBkZXYpKQotCQkJcGNpX2Rpc2FibGVfc3Jpb3YocGRldik7Ci0JCWVsc2UKLQkJCXByX2luZm8oInVubG9hZGluZyBQRiBkcml2ZXIgd2hpbGUgbGVhdmluZyBvcnBoYW4gVkZzXG4iKTsKLQkJcmV0dXJuIDA7CisJaWYgKG51bV92ZnMgJiYgbWx4NV9sYWdfaXNfYWN0aXZlKGRldikpIHsKKwkJbWx4NV9jb3JlX3dhcm4oZGV2LCAiY2FuJ3QgdHVybiBzcmlvdiBvbiB3aGlsZSBMQUcgaXMgYWN0aXZlIik7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWVyciA9IG1seDVfY29yZV9zcmlvdl9lbmFibGUocGRldiwgbnVtX3Zmcyk7Ci0JaWYgKGVycikgewotCQlkZXZfd2FybigmcGRldi0+ZGV2LCAibWx4NV9jb3JlX3NyaW92X2VuYWJsZSBmYWlsZWQgJWRcbiIsIGVycik7Ci0JCXJldHVybiBlcnI7Ci0JfQorCWlmIChudW1fdmZzKQorCQllcnIgPSBtbHg1X3NyaW92X2VuYWJsZShwZGV2LCBudW1fdmZzKTsKKwllbHNlCisJCW1seDVfc3Jpb3ZfZGlzYWJsZShwZGV2KTsKIAotCW1seDVfY29yZV9pbml0X3ZmcyhkZXYsIG51bV92ZnMpOwotI2lmZGVmIENPTkZJR19NTFg1X0NPUkVfRU4KLQltbHg1X2Vzd2l0Y2hfZW5hYmxlX3NyaW92KGRldi0+cHJpdi5lc3dpdGNoLCBudW1fdmZzLCBTUklPVl9MRUdBQ1kpOwotI2VuZGlmCi0KLQlyZXR1cm4gbnVtX3ZmczsKKwlyZXR1cm4gZXJyID8gZXJyIDogbnVtX3ZmczsKIH0KIAotc3RhdGljIGludCBzeW5jX3JlcXVpcmVkKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoraW50IG1seDVfc3Jpb3ZfYXR0YWNoKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiAgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IG1seDVfY29yZV9zcmlvdiAqc3Jpb3YgPSAmZGV2LT5wcml2LnNyaW92OwotCWludCBjdXJfdmZzID0gcGNpX251bV92ZihwZGV2KTsKIAotCWlmIChjdXJfdmZzICE9IHNyaW92LT5udW1fdmZzKSB7Ci0JCXByX2luZm8oImN1cnJlbnQgVkZzICVkLCByZWdpc3RlcmVkICVkIC0gc3luYyBuZWVkZWRcbiIsIGN1cl92ZnMsIHNyaW92LT5udW1fdmZzKTsKLQkJcmV0dXJuIDE7Ci0JfQorCWlmICghbWx4NV9jb3JlX2lzX3BmKGRldikgfHwgIXNyaW92LT5udW1fdmZzKQorCQlyZXR1cm4gMDsKIAotCXJldHVybiAwOworCS8qIElmIHNyaW92IFZGcyBleGlzdCBpbiBQQ0kgbGV2ZWwsIGVuYWJsZSB0aGVtIGluIGRldmljZSBsZXZlbCAqLworCXJldHVybiBtbHg1X2RldmljZV9lbmFibGVfc3Jpb3YoZGV2LCBzcmlvdi0+bnVtX3Zmcyk7Cit9CisKK3ZvaWQgbWx4NV9zcmlvdl9kZXRhY2goc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKK3sKKwlpZiAoIW1seDVfY29yZV9pc19wZihkZXYpKQorCQlyZXR1cm47CisKKwltbHg1X2RldmljZV9kaXNhYmxlX3NyaW92KGRldik7CiB9CiAKIGludCBtbHg1X3NyaW92X2luaXQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgbWx4NV9jb3JlX3NyaW92ICpzcmlvdiA9ICZkZXYtPnByaXYuc3Jpb3Y7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkZXYtPnBkZXY7Ci0JaW50IGN1cl92ZnM7CisJaW50IHRvdGFsX3ZmczsKIAogCWlmICghbWx4NV9jb3JlX2lzX3BmKGRldikpCiAJCXJldHVybiAwOwogCi0JaWYgKCFzeW5jX3JlcXVpcmVkKGRldi0+cGRldikpCi0JCXJldHVybiAwOwotCi0JY3VyX3ZmcyA9IHBjaV9udW1fdmYocGRldik7Ci0Jc3Jpb3YtPnZmc19jdHggPSBrY2FsbG9jKGN1cl92ZnMsIHNpemVvZigqc3Jpb3YtPnZmc19jdHgpLCBHRlBfS0VSTkVMKTsKKwl0b3RhbF92ZnMgPSBwY2lfc3Jpb3ZfZ2V0X3RvdGFsdmZzKHBkZXYpOworCXNyaW92LT5udW1fdmZzID0gcGNpX251bV92ZihwZGV2KTsKKwlzcmlvdi0+dmZzX2N0eCA9IGtjYWxsb2ModG90YWxfdmZzLCBzaXplb2YoKnNyaW92LT52ZnNfY3R4KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzcmlvdi0+dmZzX2N0eCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzcmlvdi0+ZW5hYmxlZF92ZnMgPSBjdXJfdmZzOwotCi0JbWx4NV9jb3JlX2luaXRfdmZzKGRldiwgY3VyX3Zmcyk7Ci0jaWZkZWYgQ09ORklHX01MWDVfQ09SRV9FTgotCWlmIChjdXJfdmZzKQotCQltbHg1X2Vzd2l0Y2hfZW5hYmxlX3NyaW92KGRldi0+cHJpdi5lc3dpdGNoLCBjdXJfdmZzLAotCQkJCQkgIFNSSU9WX0xFR0FDWSk7Ci0jZW5kaWYKLQotCWVuYWJsZV92ZnMoZGV2LCBjdXJfdmZzKTsKLQogCXJldHVybiAwOwogfQogCi1pbnQgbWx4NV9zcmlvdl9jbGVhbnVwKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpCit2b2lkIG1seDVfc3Jpb3ZfY2xlYW51cChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KQogewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2LT5wZGV2OwotCWludCBlcnI7CisJc3RydWN0IG1seDVfY29yZV9zcmlvdiAqc3Jpb3YgPSAmZGV2LT5wcml2LnNyaW92OwogCiAJaWYgKCFtbHg1X2NvcmVfaXNfcGYoZGV2KSkKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAotCWVyciA9IG1seDVfY29yZV9zcmlvdl9jb25maWd1cmUocGRldiwgMCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCXJldHVybiAwOworCWtmcmVlKHNyaW92LT52ZnNfY3R4KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9zcnEuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9zcnEuYwppbmRleCBjMDdmNGQwLi4zMDk5NjMwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3NycS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9zcnEuYwpAQCAtMTc1LDggKzE3NSw4IEBACiAJTUxYNV9TRVQoY3JlYXRlX3NycV9pbiwgY3JlYXRlX2luLCBvcGNvZGUsCiAJCSBNTFg1X0NNRF9PUF9DUkVBVEVfU1JRKTsKIAotCWVyciA9IG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgY3JlYXRlX2luLCBpbmxlbiwgY3JlYXRlX291dCwKLQkJCQkJIHNpemVvZihjcmVhdGVfb3V0KSk7CisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGNyZWF0ZV9pbiwgaW5sZW4sIGNyZWF0ZV9vdXQsCisJCQkgICAgc2l6ZW9mKGNyZWF0ZV9vdXQpKTsKIAlrdmZyZWUoY3JlYXRlX2luKTsKIAlpZiAoIWVycikKIAkJc3JxLT5zcnFuID0gTUxYNV9HRVQoY3JlYXRlX3NycV9vdXQsIGNyZWF0ZV9vdXQsIHNycW4pOwpAQCAtMTk0LDggKzE5NCw4IEBACiAJCSBNTFg1X0NNRF9PUF9ERVNUUk9ZX1NSUSk7CiAJTUxYNV9TRVQoZGVzdHJveV9zcnFfaW4sIHNycV9pbiwgc3Jxbiwgc3JxLT5zcnFuKTsKIAotCXJldHVybiBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIHNycV9pbiwgc2l6ZW9mKHNycV9pbiksCi0JCQkJCSAgc3JxX291dCwgc2l6ZW9mKHNycV9vdXQpKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIHNycV9pbiwgc2l6ZW9mKHNycV9pbiksCisJCQkgICAgIHNycV9vdXQsIHNpemVvZihzcnFfb3V0KSk7CiB9CiAKIHN0YXRpYyBpbnQgYXJtX3NycV9jbWQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG1seDVfY29yZV9zcnEgKnNycSwKQEAgLTIwOSw4ICsyMDksOCBAQAogCU1MWDVfU0VUKGFybV94cmNfc3JxX2luLCBzcnFfaW4sIHhyY19zcnFuLCBzcnEtPnNycW4pOwogCU1MWDVfU0VUKGFybV94cmNfc3JxX2luLCBzcnFfaW4sIGx3bSwgICAgICBsd20pOwogCi0JcmV0dXJuICBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIHNycV9pbiwgc2l6ZW9mKHNycV9pbiksCi0JCQkJCSAgIHNycV9vdXQsIHNpemVvZihzcnFfb3V0KSk7CisJcmV0dXJuICBtbHg1X2NtZF9leGVjKGRldiwgc3JxX2luLCBzaXplb2Yoc3JxX2luKSwKKwkJCSAgICAgIHNycV9vdXQsIHNpemVvZihzcnFfb3V0KSk7CiB9CiAKIHN0YXRpYyBpbnQgcXVlcnlfc3JxX2NtZChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9jb3JlX3NycSAqc3JxLApAQCAtMjI4LDkgKzIyOCw4IEBACiAJTUxYNV9TRVQocXVlcnlfc3JxX2luLCBzcnFfaW4sIG9wY29kZSwKIAkJIE1MWDVfQ01EX09QX1FVRVJZX1NSUSk7CiAJTUxYNV9TRVQocXVlcnlfc3JxX2luLCBzcnFfaW4sIHNycW4sIHNycS0+c3Jxbik7Ci0JZXJyID0gIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgc3JxX2luLCBzaXplb2Yoc3JxX2luKSwKLQkJCQkJICBzcnFfb3V0LAotCQkJCQkgIE1MWDVfU1RfU1pfQllURVMocXVlcnlfc3JxX291dCkpOworCWVyciA9ICBtbHg1X2NtZF9leGVjKGRldiwgc3JxX2luLCBzaXplb2Yoc3JxX2luKSwKKwkJCSAgICAgc3JxX291dCwgTUxYNV9TVF9TWl9CWVRFUyhxdWVyeV9zcnFfb3V0KSk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKQEAgLTI3Miw4ICsyNzEsOCBAQAogCQkgTUxYNV9DTURfT1BfQ1JFQVRFX1hSQ19TUlEpOwogCiAJbWVtc2V0KGNyZWF0ZV9vdXQsIDAsIHNpemVvZihjcmVhdGVfb3V0KSk7Ci0JZXJyID0gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBjcmVhdGVfaW4sIGlubGVuLCBjcmVhdGVfb3V0LAotCQkJCQkgc2l6ZW9mKGNyZWF0ZV9vdXQpKTsKKwllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgY3JlYXRlX2luLCBpbmxlbiwgY3JlYXRlX291dCwKKwkJCSAgICBzaXplb2YoY3JlYXRlX291dCkpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCkBAIC0yODYsMzYgKzI4NSwzMCBAQAogc3RhdGljIGludCBkZXN0cm95X3hyY19zcnFfY21kKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCiAJCQkgICAgICAgc3RydWN0IG1seDVfY29yZV9zcnEgKnNycSkKIHsKLQl1MzIgeHJjc3JxX2luW01MWDVfU1RfU1pfRFcoZGVzdHJveV94cmNfc3JxX2luKV07Ci0JdTMyIHhyY3NycV9vdXRbTUxYNV9TVF9TWl9EVyhkZXN0cm95X3hyY19zcnFfb3V0KV07Ci0KLQltZW1zZXQoeHJjc3JxX2luLCAwLCBzaXplb2YoeHJjc3JxX2luKSk7Ci0JbWVtc2V0KHhyY3NycV9vdXQsIDAsIHNpemVvZih4cmNzcnFfb3V0KSk7CisJdTMyIHhyY3NycV9pbltNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfeHJjX3NycV9pbildICAgPSB7MH07CisJdTMyIHhyY3NycV9vdXRbTUxYNV9TVF9TWl9EVyhkZXN0cm95X3hyY19zcnFfb3V0KV0gPSB7MH07CiAKIAlNTFg1X1NFVChkZXN0cm95X3hyY19zcnFfaW4sIHhyY3NycV9pbiwgb3Bjb2RlLAogCQkgTUxYNV9DTURfT1BfREVTVFJPWV9YUkNfU1JRKTsKIAlNTFg1X1NFVChkZXN0cm95X3hyY19zcnFfaW4sIHhyY3NycV9pbiwgeHJjX3NycW4sIHNycS0+c3Jxbik7CiAKLQlyZXR1cm4gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCB4cmNzcnFfaW4sIHNpemVvZih4cmNzcnFfaW4pLAotCQkJCQkgIHhyY3NycV9vdXQsIHNpemVvZih4cmNzcnFfb3V0KSk7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCB4cmNzcnFfaW4sIHNpemVvZih4cmNzcnFfaW4pLAorCQkJICAgICB4cmNzcnFfb3V0LCBzaXplb2YoeHJjc3JxX291dCkpOwogfQogCiBzdGF0aWMgaW50IGFybV94cmNfc3JxX2NtZChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAogCQkJICAgc3RydWN0IG1seDVfY29yZV9zcnEgKnNycSwgdTE2IGx3bSkKIHsKLQl1MzIgeHJjc3JxX2luW01MWDVfU1RfU1pfRFcoYXJtX3hyY19zcnFfaW4pXTsKLQl1MzIgeHJjc3JxX291dFtNTFg1X1NUX1NaX0RXKGFybV94cmNfc3JxX291dCldOwotCi0JbWVtc2V0KHhyY3NycV9pbiwgMCwgc2l6ZW9mKHhyY3NycV9pbikpOwotCW1lbXNldCh4cmNzcnFfb3V0LCAwLCBzaXplb2YoeHJjc3JxX291dCkpOworCXUzMiB4cmNzcnFfaW5bTUxYNV9TVF9TWl9EVyhhcm1feHJjX3NycV9pbildICAgPSB7MH07CisJdTMyIHhyY3NycV9vdXRbTUxYNV9TVF9TWl9EVyhhcm1feHJjX3NycV9vdXQpXSA9IHswfTsKIAogCU1MWDVfU0VUKGFybV94cmNfc3JxX2luLCB4cmNzcnFfaW4sIG9wY29kZSwgICBNTFg1X0NNRF9PUF9BUk1fWFJDX1NSUSk7CiAJTUxYNV9TRVQoYXJtX3hyY19zcnFfaW4sIHhyY3NycV9pbiwgb3BfbW9kLCAgIE1MWDVfQVJNX1hSQ19TUlFfSU5fT1BfTU9EX1hSQ19TUlEpOwogCU1MWDVfU0VUKGFybV94cmNfc3JxX2luLCB4cmNzcnFfaW4sIHhyY19zcnFuLCBzcnEtPnNycW4pOwogCU1MWDVfU0VUKGFybV94cmNfc3JxX2luLCB4cmNzcnFfaW4sIGx3bSwgICAgICBsd20pOwogCi0JcmV0dXJuICBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIHhyY3NycV9pbiwgc2l6ZW9mKHhyY3NycV9pbiksCi0JCQkJCSAgIHhyY3NycV9vdXQsIHNpemVvZih4cmNzcnFfb3V0KSk7CisJcmV0dXJuICBtbHg1X2NtZF9leGVjKGRldiwgeHJjc3JxX2luLCBzaXplb2YoeHJjc3JxX2luKSwKKwkJCSAgICAgIHhyY3NycV9vdXQsIHNpemVvZih4cmNzcnFfb3V0KSk7CiB9CiAKIHN0YXRpYyBpbnQgcXVlcnlfeHJjX3NycV9jbWQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKQEAgLTMzNSw5ICszMjgsOSBAQAogCU1MWDVfU0VUKHF1ZXJ5X3hyY19zcnFfaW4sIHhyY3NycV9pbiwgb3Bjb2RlLAogCQkgTUxYNV9DTURfT1BfUVVFUllfWFJDX1NSUSk7CiAJTUxYNV9TRVQocXVlcnlfeHJjX3NycV9pbiwgeHJjc3JxX2luLCB4cmNfc3Jxbiwgc3JxLT5zcnFuKTsKLQllcnIgPSAgbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCB4cmNzcnFfaW4sIHNpemVvZih4cmNzcnFfaW4pLAotCQkJCQkgIHhyY3NycV9vdXQsCi0JCQkJCSAgTUxYNV9TVF9TWl9CWVRFUyhxdWVyeV94cmNfc3JxX291dCkpOworCisJZXJyID0gIG1seDVfY21kX2V4ZWMoZGV2LCB4cmNzcnFfaW4sIHNpemVvZih4cmNzcnFfaW4pLCB4cmNzcnFfb3V0LAorCQkJICAgICBNTFg1X1NUX1NaX0JZVEVTKHF1ZXJ5X3hyY19zcnFfb3V0KSk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS90cmFuc29iai5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3RyYW5zb2JqLmMKaW5kZXggMjgyNzRhNi4uYTAwZmY0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3RyYW5zb2JqLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3RyYW5zb2JqLmMKQEAgLTM2LDE3ICszNiwxNCBAQAogCiBpbnQgbWx4NV9jb3JlX2FsbG9jX3RyYW5zcG9ydF9kb21haW4oc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyICp0ZG4pCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcoYWxsb2NfdHJhbnNwb3J0X2RvbWFpbl9pbildOwotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhhbGxvY190cmFuc3BvcnRfZG9tYWluX291dCldOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGFsbG9jX3RyYW5zcG9ydF9kb21haW5faW4pXSAgID0gezB9OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhhbGxvY190cmFuc3BvcnRfZG9tYWluX291dCldID0gezB9OwogCWludCBlcnI7CiAKLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKLQogCU1MWDVfU0VUKGFsbG9jX3RyYW5zcG9ydF9kb21haW5faW4sIGluLCBvcGNvZGUsCiAJCSBNTFg1X0NNRF9PUF9BTExPQ19UUkFOU1BPUlRfRE9NQUlOKTsKIAotCWVyciA9IG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOworCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiAJaWYgKCFlcnIpCiAJCSp0ZG4gPSBNTFg1X0dFVChhbGxvY190cmFuc3BvcnRfZG9tYWluX291dCwgb3V0LAogCQkJCXRyYW5zcG9ydF9kb21haW4pOwpAQCAtNTcsMjkgKzU0LDIzIEBACiAKIHZvaWQgbWx4NV9jb3JlX2RlYWxsb2NfdHJhbnNwb3J0X2RvbWFpbihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgdGRuKQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlYWxsb2NfdHJhbnNwb3J0X2RvbWFpbl9pbildOwotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZWFsbG9jX3RyYW5zcG9ydF9kb21haW5fb3V0KV07Ci0KLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhkZWFsbG9jX3RyYW5zcG9ydF9kb21haW5faW4pXSAgID0gezB9OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZWFsbG9jX3RyYW5zcG9ydF9kb21haW5fb3V0KV0gPSB7MH07CiAKIAlNTFg1X1NFVChkZWFsbG9jX3RyYW5zcG9ydF9kb21haW5faW4sIGluLCBvcGNvZGUsCiAJCSBNTFg1X0NNRF9PUF9ERUFMTE9DX1RSQU5TUE9SVF9ET01BSU4pOwogCU1MWDVfU0VUKGRlYWxsb2NfdHJhbnNwb3J0X2RvbWFpbl9pbiwgaW4sIHRyYW5zcG9ydF9kb21haW4sIHRkbik7Ci0KLQltbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKKwltbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQogRVhQT1JUX1NZTUJPTChtbHg1X2NvcmVfZGVhbGxvY190cmFuc3BvcnRfZG9tYWluKTsKIAogaW50IG1seDVfY29yZV9jcmVhdGVfcnEoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyICppbiwgaW50IGlubGVuLCB1MzIgKnJxbikKIHsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcoY3JlYXRlX3JxX291dCldOworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhjcmVhdGVfcnFfb3V0KV0gPSB7MH07CiAJaW50IGVycjsKIAogCU1MWDVfU0VUKGNyZWF0ZV9ycV9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfQ1JFQVRFX1JRKTsKLQotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CiAJaWYgKCFlcnIpCiAJCSpycW4gPSBNTFg1X0dFVChjcmVhdGVfcnFfb3V0LCBvdXQsIHJxbik7CiAKQEAgLTk1LDIxICs4NiwxOCBAQAogCU1MWDVfU0VUKG1vZGlmeV9ycV9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfTU9ESUZZX1JRKTsKIAogCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKLQlyZXR1cm4gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBpbiwgaW5sZW4sIG91dCwgc2l6ZW9mKG91dCkpOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIGlubGVuLCBvdXQsIHNpemVvZihvdXQpKTsKIH0KIEVYUE9SVF9TWU1CT0wobWx4NV9jb3JlX21vZGlmeV9ycSk7CiAKIHZvaWQgbWx4NV9jb3JlX2Rlc3Ryb3lfcnEoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyIHJxbikKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhkZXN0cm95X3JxX2luKV07Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfcnFfb3V0KV07Ci0KLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfcnFfaW4pXSAgID0gezB9OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZXN0cm95X3JxX291dCldID0gezB9OwogCiAJTUxYNV9TRVQoZGVzdHJveV9ycV9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfREVTVFJPWV9SUSk7CiAJTUxYNV9TRVQoZGVzdHJveV9ycV9pbiwgaW4sIHJxbiwgcnFuKTsKLQotCW1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOworCW1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiBFWFBPUlRfU1lNQk9MKG1seDVfY29yZV9kZXN0cm95X3JxKTsKIApAQCAtMTIxLDE5ICsxMDksMTcgQEAKIAlNTFg1X1NFVChxdWVyeV9ycV9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfUVVFUllfUlEpOwogCU1MWDVfU0VUKHF1ZXJ5X3JxX2luLCBpbiwgcnFuLCBycW4pOwogCi0JcmV0dXJuIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgb3V0bGVuKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIG91dGxlbik7CiB9CiBFWFBPUlRfU1lNQk9MKG1seDVfY29yZV9xdWVyeV9ycSk7CiAKIGludCBtbHg1X2NvcmVfY3JlYXRlX3NxKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiAqaW4sIGludCBpbmxlbiwgdTMyICpzcW4pCiB7Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKGNyZWF0ZV9zcV9vdXQpXTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoY3JlYXRlX3NxX291dCldID0gezB9OwogCWludCBlcnI7CiAKIAlNTFg1X1NFVChjcmVhdGVfc3FfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX0NSRUFURV9TUSk7Ci0KLQltZW1zZXQob3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0JZXJyID0gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBpbiwgaW5sZW4sIG91dCwgc2l6ZW9mKG91dCkpOworCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgaW5sZW4sIG91dCwgc2l6ZW9mKG91dCkpOwogCWlmICghZXJyKQogCQkqc3FuID0gTUxYNV9HRVQoY3JlYXRlX3NxX291dCwgb3V0LCBzcW4pOwogCkBAIC0xNDIsMjcgKzEyOCwyMiBAQAogCiBpbnQgbWx4NV9jb3JlX21vZGlmeV9zcShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgc3FuLCB1MzIgKmluLCBpbnQgaW5sZW4pCiB7Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKG1vZGlmeV9zcV9vdXQpXTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcobW9kaWZ5X3NxX291dCldID0gezB9OwogCiAJTUxYNV9TRVQobW9kaWZ5X3NxX2luLCBpbiwgc3FuLCBzcW4pOwogCU1MWDVfU0VUKG1vZGlmeV9zcV9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfTU9ESUZZX1NRKTsKLQotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKLQlyZXR1cm4gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBpbiwgaW5sZW4sIG91dCwgc2l6ZW9mKG91dCkpOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIGlubGVuLCBvdXQsIHNpemVvZihvdXQpKTsKIH0KIEVYUE9SVF9TWU1CT0wobWx4NV9jb3JlX21vZGlmeV9zcSk7CiAKIHZvaWQgbWx4NV9jb3JlX2Rlc3Ryb3lfc3Eoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyIHNxbikKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhkZXN0cm95X3NxX2luKV07Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfc3Ffb3V0KV07Ci0KLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfc3FfaW4pXSAgID0gezB9OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZXN0cm95X3NxX291dCldID0gezB9OwogCiAJTUxYNV9TRVQoZGVzdHJveV9zcV9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfREVTVFJPWV9TUSk7CiAJTUxYNV9TRVQoZGVzdHJveV9zcV9pbiwgaW4sIHNxbiwgc3FuKTsKLQotCW1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOworCW1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiAKIGludCBtbHg1X2NvcmVfcXVlcnlfc3Eoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyIHNxbiwgdTMyICpvdXQpCkBAIC0xNzIsMjEgKzE1MywyMCBAQAogCiAJTUxYNV9TRVQocXVlcnlfc3FfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX1FVRVJZX1NRKTsKIAlNTFg1X1NFVChxdWVyeV9zcV9pbiwgaW4sIHNxbiwgc3FuKTsKLQotCXJldHVybiBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIG91dGxlbik7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBvdXRsZW4pOwogfQogRVhQT1JUX1NZTUJPTChtbHg1X2NvcmVfcXVlcnlfc3EpOwogCiBpbnQgbWx4NV9jb3JlX2NyZWF0ZV90aXIoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyICppbiwgaW50IGlubGVuLAogCQkJIHUzMiAqdGlybikKIHsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcoY3JlYXRlX3Rpcl9vdXQpXTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoY3JlYXRlX3Rpcl9vdXQpXSA9IHswfTsKIAlpbnQgZXJyOwogCiAJTUxYNV9TRVQoY3JlYXRlX3Rpcl9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfQ1JFQVRFX1RJUik7CiAKIAltZW1zZXQob3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0JZXJyID0gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBpbiwgaW5sZW4sIG91dCwgc2l6ZW9mKG91dCkpOworCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgaW5sZW4sIG91dCwgc2l6ZW9mKG91dCkpOwogCWlmICghZXJyKQogCQkqdGlybiA9IE1MWDVfR0VUKGNyZWF0ZV90aXJfb3V0LCBvdXQsIHRpcm4pOwogCkBAIC0xOTcsMzkgKzE3NywzMiBAQAogaW50IG1seDVfY29yZV9tb2RpZnlfdGlyKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiB0aXJuLCB1MzIgKmluLAogCQkJIGludCBpbmxlbikKIHsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcobW9kaWZ5X3Rpcl9vdXQpXTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcobW9kaWZ5X3Rpcl9vdXQpXSA9IHswfTsKIAogCU1MWDVfU0VUKG1vZGlmeV90aXJfaW4sIGluLCB0aXJuLCB0aXJuKTsKIAlNTFg1X1NFVChtb2RpZnlfdGlyX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9NT0RJRllfVElSKTsKLQotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKLQlyZXR1cm4gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBpbiwgaW5sZW4sIG91dCwgc2l6ZW9mKG91dCkpOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIGlubGVuLCBvdXQsIHNpemVvZihvdXQpKTsKIH0KIAogdm9pZCBtbHg1X2NvcmVfZGVzdHJveV90aXIoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyIHRpcm4pCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcoZGVzdHJveV90aXJfaW4pXTsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcoZGVzdHJveV90aXJfb3V0KV07Ci0KLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfdGlyX2luKV0gICA9IHswfTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoZGVzdHJveV90aXJfb3V0KV0gPSB7MH07CiAKIAlNTFg1X1NFVChkZXN0cm95X3Rpcl9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfREVTVFJPWV9USVIpOwogCU1MWDVfU0VUKGRlc3Ryb3lfdGlyX2luLCBpbiwgdGlybiwgdGlybik7Ci0KLQltbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKKwltbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQogRVhQT1JUX1NZTUJPTChtbHg1X2NvcmVfZGVzdHJveV90aXIpOwogCiBpbnQgbWx4NV9jb3JlX2NyZWF0ZV90aXMoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyICppbiwgaW50IGlubGVuLAogCQkJIHUzMiAqdGlzbikKIHsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcoY3JlYXRlX3Rpc19vdXQpXTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoY3JlYXRlX3Rpc19vdXQpXSA9IHswfTsKIAlpbnQgZXJyOwogCiAJTUxYNV9TRVQoY3JlYXRlX3Rpc19pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfQ1JFQVRFX1RJUyk7Ci0KLQltZW1zZXQob3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0JZXJyID0gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBpbiwgaW5sZW4sIG91dCwgc2l6ZW9mKG91dCkpOworCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgaW5sZW4sIG91dCwgc2l6ZW9mKG91dCkpOwogCWlmICghZXJyKQogCQkqdGlzbiA9IE1MWDVfR0VUKGNyZWF0ZV90aXNfb3V0LCBvdXQsIHRpc24pOwogCkBAIC0yNDUsMzQgKzIxOCwyOSBAQAogCU1MWDVfU0VUKG1vZGlmeV90aXNfaW4sIGluLCB0aXNuLCB0aXNuKTsKIAlNTFg1X1NFVChtb2RpZnlfdGlzX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9NT0RJRllfVElTKTsKIAotCXJldHVybiBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgaW5sZW4sIG91dCwgc2l6ZW9mKG91dCkpOwogfQogRVhQT1JUX1NZTUJPTChtbHg1X2NvcmVfbW9kaWZ5X3Rpcyk7CiAKIHZvaWQgbWx4NV9jb3JlX2Rlc3Ryb3lfdGlzKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiB0aXNuKQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfdGlzX2luKV07Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfdGlzX291dCldOwotCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhkZXN0cm95X3Rpc19pbildICAgPSB7MH07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfdGlzX291dCldID0gezB9OwogCiAJTUxYNV9TRVQoZGVzdHJveV90aXNfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX0RFU1RST1lfVElTKTsKIAlNTFg1X1NFVChkZXN0cm95X3Rpc19pbiwgaW4sIHRpc24sIHRpc24pOwotCi0JbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CisJbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKIH0KIEVYUE9SVF9TWU1CT0wobWx4NV9jb3JlX2Rlc3Ryb3lfdGlzKTsKIAogaW50IG1seDVfY29yZV9jcmVhdGVfcm1wKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiAqaW4sIGludCBpbmxlbiwKIAkJCSB1MzIgKnJtcG4pCiB7Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKGNyZWF0ZV9ybXBfb3V0KV07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGNyZWF0ZV9ybXBfb3V0KV0gPSB7MH07CiAJaW50IGVycjsKIAogCU1MWDVfU0VUKGNyZWF0ZV9ybXBfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX0NSRUFURV9STVApOwotCi0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOwotCWVyciA9IG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIGlubGVuLCBvdXQsIHNpemVvZihvdXQpKTsKKwllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIGlubGVuLCBvdXQsIHNpemVvZihvdXQpKTsKIAlpZiAoIWVycikKIAkJKnJtcG4gPSBNTFg1X0dFVChjcmVhdGVfcm1wX291dCwgb3V0LCBybXBuKTsKIApAQCAtMjgxLDM4ICsyNDksMzEgQEAKIAogaW50IG1seDVfY29yZV9tb2RpZnlfcm1wKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiAqaW4sIGludCBpbmxlbikKIHsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcobW9kaWZ5X3JtcF9vdXQpXTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcobW9kaWZ5X3JtcF9vdXQpXSA9IHswfTsKIAogCU1MWDVfU0VUKG1vZGlmeV9ybXBfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX01PRElGWV9STVApOwotCi0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOwotCXJldHVybiBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgaW5sZW4sIG91dCwgc2l6ZW9mKG91dCkpOwogfQogCiBpbnQgbWx4NV9jb3JlX2Rlc3Ryb3lfcm1wKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiBybXBuKQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfcm1wX2luKV07Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfcm1wX291dCldOwotCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhkZXN0cm95X3JtcF9pbildICAgPSB7MH07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlc3Ryb3lfcm1wX291dCldID0gezB9OwogCiAJTUxYNV9TRVQoZGVzdHJveV9ybXBfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX0RFU1RST1lfUk1QKTsKIAlNTFg1X1NFVChkZXN0cm95X3JtcF9pbiwgaW4sIHJtcG4sIHJtcG4pOwotCi0JcmV0dXJuIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsCiAJCQkJCSAgc2l6ZW9mKG91dCkpOwogfQogCiBpbnQgbWx4NV9jb3JlX3F1ZXJ5X3JtcChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgcm1wbiwgdTMyICpvdXQpCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcocXVlcnlfcm1wX2luKV07CisJdTMyIGluW01MWDVfU1RfU1pfRFcocXVlcnlfcm1wX2luKV0gPSB7MH07CiAJaW50IG91dGxlbiA9IE1MWDVfU1RfU1pfQllURVMocXVlcnlfcm1wX291dCk7CiAKLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOwogCU1MWDVfU0VUKHF1ZXJ5X3JtcF9pbiwgaW4sIG9wY29kZSwgTUxYNV9DTURfT1BfUVVFUllfUk1QKTsKIAlNTFg1X1NFVChxdWVyeV9ybXBfaW4sIGluLCBybXBuLCAgIHJtcG4pOwotCi0JcmV0dXJuIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgb3V0bGVuKTsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIG91dGxlbik7CiB9CiAKIGludCBtbHg1X2NvcmVfYXJtX3JtcChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgcm1wbiwgdTE2IGx3bSkKQEAgLTM0NywxMyArMzA4LDExIEBACiBpbnQgbWx4NV9jb3JlX2NyZWF0ZV94c3JxKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiAqaW4sIGludCBpbmxlbiwKIAkJCSAgdTMyICp4c3JxbikKIHsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcoY3JlYXRlX3hyY19zcnFfb3V0KV07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGNyZWF0ZV94cmNfc3JxX291dCldID0gezB9OwogCWludCBlcnI7CiAKIAlNTFg1X1NFVChjcmVhdGVfeHJjX3NycV9pbiwgaW4sIG9wY29kZSwgICAgIE1MWDVfQ01EX09QX0NSRUFURV9YUkNfU1JRKTsKLQotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CiAJaWYgKCFlcnIpCiAJCSp4c3JxbiA9IE1MWDVfR0VUKGNyZWF0ZV94cmNfc3JxX291dCwgb3V0LCB4cmNfc3Jxbik7CiAKQEAgLTM2MiwzMyArMzIxLDI1IEBACiAKIGludCBtbHg1X2NvcmVfZGVzdHJveV94c3JxKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiB4c3JxbikKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhkZXN0cm95X3hyY19zcnFfaW4pXTsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcoZGVzdHJveV94cmNfc3JxX291dCldOwotCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKLQltZW1zZXQob3V0LCAwLCBzaXplb2Yob3V0KSk7CisJdTMyIGluW01MWDVfU1RfU1pfRFcoZGVzdHJveV94cmNfc3JxX2luKV0gICA9IHswfTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoZGVzdHJveV94cmNfc3JxX291dCldID0gezB9OwogCiAJTUxYNV9TRVQoZGVzdHJveV94cmNfc3JxX2luLCBpbiwgb3Bjb2RlLCAgIE1MWDVfQ01EX09QX0RFU1RST1lfWFJDX1NSUSk7CiAJTUxYNV9TRVQoZGVzdHJveV94cmNfc3JxX2luLCBpbiwgeHJjX3NycW4sIHhzcnFuKTsKLQotCXJldHVybiBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsCi0JCQkJCSAgc2l6ZW9mKG91dCkpOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQogCiBpbnQgbWx4NV9jb3JlX3F1ZXJ5X3hzcnEoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyIHhzcnFuLCB1MzIgKm91dCkKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhxdWVyeV94cmNfc3JxX2luKV07CisJdTMyIGluW01MWDVfU1RfU1pfRFcocXVlcnlfeHJjX3NycV9pbildID0gezB9OwogCXZvaWQgKnNycWM7CiAJdm9pZCAqeHJjX3NycWM7CiAJaW50IGVycjsKIAotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7CiAJTUxYNV9TRVQocXVlcnlfeHJjX3NycV9pbiwgaW4sIG9wY29kZSwgICBNTFg1X0NNRF9PUF9RVUVSWV9YUkNfU1JRKTsKIAlNTFg1X1NFVChxdWVyeV94cmNfc3JxX2luLCBpbiwgeHJjX3NycW4sIHhzcnFuKTsKLQotCWVyciA9ICBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBzaXplb2YoaW4pLAotCQkJCQkgIG91dCwKLQkJCQkJICBNTFg1X1NUX1NaX0JZVEVTKHF1ZXJ5X3hyY19zcnFfb3V0KSk7CisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsCisJCQkgICAgTUxYNV9TVF9TWl9CWVRFUyhxdWVyeV94cmNfc3JxX291dCkpOwogCWlmICghZXJyKSB7CiAJCXhyY19zcnFjID0gTUxYNV9BRERSX09GKHF1ZXJ5X3hyY19zcnFfb3V0LCBvdXQsCiAJCQkJCXhyY19zcnFfY29udGV4dF9lbnRyeSk7CkBAIC00MDEsMzIgKzM1MiwyNSBAQAogCiBpbnQgbWx4NV9jb3JlX2FybV94c3JxKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiB4c3JxbiwgdTE2IGx3bSkKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhhcm1feHJjX3NycV9pbildOwotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhhcm1feHJjX3NycV9vdXQpXTsKLQotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGFybV94cmNfc3JxX2luKV0gICA9IHswfTsKKwl1MzIgb3V0W01MWDVfU1RfU1pfRFcoYXJtX3hyY19zcnFfb3V0KV0gPSB7MH07CiAKIAlNTFg1X1NFVChhcm1feHJjX3NycV9pbiwgaW4sIG9wY29kZSwgICBNTFg1X0NNRF9PUF9BUk1fWFJDX1NSUSk7CiAJTUxYNV9TRVQoYXJtX3hyY19zcnFfaW4sIGluLCB4cmNfc3JxbiwgeHNycW4pOwogCU1MWDVfU0VUKGFybV94cmNfc3JxX2luLCBpbiwgbHdtLCAgICAgIGx3bSk7CiAJTUxYNV9TRVQoYXJtX3hyY19zcnFfaW4sIGluLCBvcF9tb2QsCiAJCSBNTFg1X0FSTV9YUkNfU1JRX0lOX09QX01PRF9YUkNfU1JRKTsKLQotCXJldHVybiAgbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LAotCQkJCQkgICBzaXplb2Yob3V0KSk7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiAKIGludCBtbHg1X2NvcmVfY3JlYXRlX3JxdChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgKmluLCBpbnQgaW5sZW4sCiAJCQkgdTMyICpycXRuKQogewotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhjcmVhdGVfcnF0X291dCldOworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhjcmVhdGVfcnF0X291dCldID0gezB9OwogCWludCBlcnI7CiAKIAlNTFg1X1NFVChjcmVhdGVfcnF0X2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9DUkVBVEVfUlFUKTsKLQotCW1lbXNldChvdXQsIDAsIHNpemVvZihvdXQpKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CiAJaWYgKCFlcnIpCiAJCSpycXRuID0gTUxYNV9HRVQoY3JlYXRlX3JxdF9vdXQsIG91dCwgcnF0bik7CiAKQEAgLTQzNywyNSArMzgxLDIwIEBACiBpbnQgbWx4NV9jb3JlX21vZGlmeV9ycXQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyIHJxdG4sIHUzMiAqaW4sCiAJCQkgaW50IGlubGVuKQogewotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhtb2RpZnlfcnF0X291dCldOworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhtb2RpZnlfcnF0X291dCldID0gezB9OwogCiAJTUxYNV9TRVQobW9kaWZ5X3JxdF9pbiwgaW4sIHJxdG4sIHJxdG4pOwogCU1MWDVfU0VUKG1vZGlmeV9ycXRfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX01PRElGWV9SUVQpOwotCi0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOwotCXJldHVybiBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgaW5sZW4sIG91dCwgc2l6ZW9mKG91dCkpOwogfQogCiB2b2lkIG1seDVfY29yZV9kZXN0cm95X3JxdChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgcnF0bikKIHsKLQl1MzIgaW5bTUxYNV9TVF9TWl9EVyhkZXN0cm95X3JxdF9pbildOwotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZXN0cm95X3JxdF9vdXQpXTsKLQotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7CisJdTMyIGluW01MWDVfU1RfU1pfRFcoZGVzdHJveV9ycXRfaW4pXSAgID0gezB9OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZXN0cm95X3JxdF9vdXQpXSA9IHswfTsKIAogCU1MWDVfU0VUKGRlc3Ryb3lfcnF0X2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9ERVNUUk9ZX1JRVCk7CiAJTUxYNV9TRVQoZGVzdHJveV9ycXRfaW4sIGluLCBycXRuLCBycXRuKTsKLQotCW1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOworCW1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiBFWFBPUlRfU1lNQk9MKG1seDVfY29yZV9kZXN0cm95X3JxdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvdWFyLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvdWFyLmMKaW5kZXggNWZmOGFmNC4uYWIwYjg5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3Vhci5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS91YXIuYwpAQCAtNDIsNzMgKzQyLDI4IEBACiAJTlVNX0xPV19MQVRfVVVBUlMJPSA0LAogfTsKIAotCi1zdHJ1Y3QgbWx4NV9hbGxvY191YXJfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmRbOF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9hbGxvY191YXJfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCV9fYmUzMgkJCXVhcm47Ci0JdTgJCQlyc3ZkWzRdOwotfTsKLQotc3RydWN0IG1seDVfZnJlZV91YXJfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQl1YXJuOwotCXU4CQkJcnN2ZFs0XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2ZyZWVfdWFyX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmRbOF07Ci19OwotCiBpbnQgbWx4NV9jbWRfYWxsb2NfdWFyKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiAqdWFybikKIHsKLQlzdHJ1Y3QgbWx4NV9hbGxvY191YXJfbWJveF9pbglpbjsKLQlzdHJ1Y3QgbWx4NV9hbGxvY191YXJfbWJveF9vdXQJb3V0OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhhbGxvY191YXJfb3V0KV0gPSB7MH07CisJdTMyIGluW01MWDVfU1RfU1pfRFcoYWxsb2NfdWFyX2luKV0gICA9IHswfTsKIAlpbnQgZXJyOwogCi0JbWVtc2V0KCZpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KCZvdXQsIDAsIHNpemVvZihvdXQpKTsKLQlpbi5oZHIub3Bjb2RlID0gY3B1X3RvX2JlMTYoTUxYNV9DTURfT1BfQUxMT0NfVUFSKTsKLQllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgJmluLCBzaXplb2YoaW4pLCAmb3V0LCBzaXplb2Yob3V0KSk7Ci0JaWYgKGVycikKLQkJZ290byBleDsKLQotCWlmIChvdXQuaGRyLnN0YXR1cykgewotCQllcnIgPSBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyKCZvdXQuaGRyKTsKLQkJZ290byBleDsKLQl9Ci0KLQkqdWFybiA9IGJlMzJfdG9fY3B1KG91dC51YXJuKSAmIDB4ZmZmZmZmOwotCi1leDoKKwlNTFg1X1NFVChhbGxvY191YXJfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX0FMTE9DX1VBUik7CisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKKwlpZiAoIWVycikKKwkJKnVhcm4gPSBNTFg1X0dFVChhbGxvY191YXJfb3V0LCBvdXQsIHVhcik7CiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0wobWx4NV9jbWRfYWxsb2NfdWFyKTsKIAogaW50IG1seDVfY21kX2ZyZWVfdWFyKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiB1YXJuKQogewotCXN0cnVjdCBtbHg1X2ZyZWVfdWFyX21ib3hfaW4JaW47Ci0Jc3RydWN0IG1seDVfZnJlZV91YXJfbWJveF9vdXQJb3V0OwotCWludCBlcnI7CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGRlYWxsb2NfdWFyX291dCldID0gezB9OworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlYWxsb2NfdWFyX2luKV0gICA9IHswfTsKIAotCW1lbXNldCgmaW4sIDAsIHNpemVvZihpbikpOwotCW1lbXNldCgmb3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0JaW4uaGRyLm9wY29kZSA9IGNwdV90b19iZTE2KE1MWDVfQ01EX09QX0RFQUxMT0NfVUFSKTsKLQlpbi51YXJuID0gY3B1X3RvX2JlMzIodWFybik7Ci0JZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsICZpbiwgc2l6ZW9mKGluKSwgJm91dCwgc2l6ZW9mKG91dCkpOwotCWlmIChlcnIpCi0JCWdvdG8gZXg7Ci0KLQlpZiAob3V0Lmhkci5zdGF0dXMpCi0JCWVyciA9IG1seDVfY21kX3N0YXR1c190b19lcnIoJm91dC5oZHIpOwotCi1leDoKLQlyZXR1cm4gZXJyOworCU1MWDVfU0VUKGRlYWxsb2NfdWFyX2luLCBpbiwgb3Bjb2RlLCBNTFg1X0NNRF9PUF9ERUFMTE9DX1VBUik7CisJTUxYNV9TRVQoZGVhbGxvY191YXJfaW4sIGluLCB1YXIsIHVhcm4pOworCXJldHVybiBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQogRVhQT1JUX1NZTUJPTChtbHg1X2NtZF9mcmVlX3Vhcik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS92cG9ydC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3Zwb3J0LmMKaW5kZXggMjEzNjVkMC4uNTI1ZjE3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3Zwb3J0LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3Zwb3J0LmMKQEAgLTM5LDEwICszOSw3IEBACiBzdGF0aWMgaW50IF9tbHg1X3F1ZXJ5X3Zwb3J0X3N0YXRlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LCB1OCBvcG1vZCwKIAkJCQkgICB1MTYgdnBvcnQsIHUzMiAqb3V0LCBpbnQgb3V0bGVuKQogewotCWludCBlcnI7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcocXVlcnlfdnBvcnRfc3RhdGVfaW4pXTsKLQotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7CisJdTMyIGluW01MWDVfU1RfU1pfRFcocXVlcnlfdnBvcnRfc3RhdGVfaW4pXSA9IHswfTsKIAogCU1MWDVfU0VUKHF1ZXJ5X3Zwb3J0X3N0YXRlX2luLCBpbiwgb3Bjb2RlLAogCQkgTUxYNV9DTURfT1BfUVVFUllfVlBPUlRfU1RBVEUpOwpAQCAtNTEsMTEgKzQ4LDcgQEAKIAlpZiAodnBvcnQpCiAJCU1MWDVfU0VUKHF1ZXJ5X3Zwb3J0X3N0YXRlX2luLCBpbiwgb3RoZXJfdnBvcnQsIDEpOwogCi0JZXJyID0gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMobWRldiwgaW4sIHNpemVvZihpbiksIG91dCwgb3V0bGVuKTsKLQlpZiAoZXJyKQotCQltbHg1X2NvcmVfd2FybihtZGV2LCAiTUxYNV9DTURfT1BfUVVFUllfVlBPUlRfU1RBVEUgZmFpbGVkXG4iKTsKLQotCXJldHVybiBlcnI7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMobWRldiwgaW4sIHNpemVvZihpbiksIG91dCwgb3V0bGVuKTsKIH0KIAogdTggbWx4NV9xdWVyeV92cG9ydF9zdGF0ZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwgdTggb3Btb2QsIHUxNiB2cG9ydCkKQEAgLTgxLDU4ICs3NCw0MyBAQAogaW50IG1seDVfbW9kaWZ5X3Zwb3J0X2FkbWluX3N0YXRlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LCB1OCBvcG1vZCwKIAkJCQkgIHUxNiB2cG9ydCwgdTggc3RhdGUpCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcobW9kaWZ5X3Zwb3J0X3N0YXRlX2luKV07Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKG1vZGlmeV92cG9ydF9zdGF0ZV9vdXQpXTsKLQlpbnQgZXJyOwotCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhtb2RpZnlfdnBvcnRfc3RhdGVfaW4pXSAgID0gezB9OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhtb2RpZnlfdnBvcnRfc3RhdGVfb3V0KV0gPSB7MH07CiAKIAlNTFg1X1NFVChtb2RpZnlfdnBvcnRfc3RhdGVfaW4sIGluLCBvcGNvZGUsCiAJCSBNTFg1X0NNRF9PUF9NT0RJRllfVlBPUlRfU1RBVEUpOwogCU1MWDVfU0VUKG1vZGlmeV92cG9ydF9zdGF0ZV9pbiwgaW4sIG9wX21vZCwgb3Btb2QpOwogCU1MWDVfU0VUKG1vZGlmeV92cG9ydF9zdGF0ZV9pbiwgaW4sIHZwb3J0X251bWJlciwgdnBvcnQpOwotCiAJaWYgKHZwb3J0KQogCQlNTFg1X1NFVChtb2RpZnlfdnBvcnRfc3RhdGVfaW4sIGluLCBvdGhlcl92cG9ydCwgMSk7Ci0KIAlNTFg1X1NFVChtb2RpZnlfdnBvcnRfc3RhdGVfaW4sIGluLCBhZG1pbl9zdGF0ZSwgc3RhdGUpOwogCi0JZXJyID0gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMobWRldiwgaW4sIHNpemVvZihpbiksIG91dCwKLQkJCQkJIHNpemVvZihvdXQpKTsKLQlpZiAoZXJyKQotCQltbHg1X2NvcmVfd2FybihtZGV2LCAiTUxYNV9DTURfT1BfTU9ESUZZX1ZQT1JUX1NUQVRFIGZhaWxlZFxuIik7Ci0KLQlyZXR1cm4gZXJyOworCXJldHVybiBtbHg1X2NtZF9leGVjKG1kZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIHNpemVvZihvdXQpKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDVfbW9kaWZ5X3Zwb3J0X2FkbWluX3N0YXRlKTsKIAogc3RhdGljIGludCBtbHg1X3F1ZXJ5X25pY192cG9ydF9jb250ZXh0KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LCB1MTYgdnBvcnQsCiAJCQkJCXUzMiAqb3V0LCBpbnQgb3V0bGVuKQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKHF1ZXJ5X25pY192cG9ydF9jb250ZXh0X2luKV07Ci0KLQltZW1zZXQoaW4sIDAsIHNpemVvZihpbikpOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKHF1ZXJ5X25pY192cG9ydF9jb250ZXh0X2luKV0gPSB7MH07CiAKIAlNTFg1X1NFVChxdWVyeV9uaWNfdnBvcnRfY29udGV4dF9pbiwgaW4sIG9wY29kZSwKIAkJIE1MWDVfQ01EX09QX1FVRVJZX05JQ19WUE9SVF9DT05URVhUKTsKLQogCU1MWDVfU0VUKHF1ZXJ5X25pY192cG9ydF9jb250ZXh0X2luLCBpbiwgdnBvcnRfbnVtYmVyLCB2cG9ydCk7CiAJaWYgKHZwb3J0KQogCQlNTFg1X1NFVChxdWVyeV9uaWNfdnBvcnRfY29udGV4dF9pbiwgaW4sIG90aGVyX3Zwb3J0LCAxKTsKIAotCXJldHVybiBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhtZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBvdXRsZW4pOworCXJldHVybiBtbHg1X2NtZF9leGVjKG1kZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIG91dGxlbik7CiB9CiAKIHN0YXRpYyBpbnQgbWx4NV9tb2RpZnlfbmljX3Zwb3J0X2NvbnRleHQoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsIHZvaWQgKmluLAogCQkJCQkgaW50IGlubGVuKQogewotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhtb2RpZnlfbmljX3Zwb3J0X2NvbnRleHRfb3V0KV07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKG1vZGlmeV9uaWNfdnBvcnRfY29udGV4dF9vdXQpXSA9IHswfTsKIAogCU1MWDVfU0VUKG1vZGlmeV9uaWNfdnBvcnRfY29udGV4dF9pbiwgaW4sIG9wY29kZSwKIAkJIE1MWDVfQ01EX09QX01PRElGWV9OSUNfVlBPUlRfQ09OVEVYVCk7Ci0KLQltZW1zZXQob3V0LCAwLCBzaXplb2Yob3V0KSk7Ci0JcmV0dXJuIG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKG1kZXYsIGluLCBpbmxlbiwgb3V0LCBzaXplb2Yob3V0KSk7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMobWRldiwgaW4sIGlubGVuLCBvdXQsIHNpemVvZihvdXQpKTsKIH0KIAogdm9pZCBtbHg1X3F1ZXJ5X25pY192cG9ydF9taW5faW5saW5lKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LApAQCAtMTQ3LDYgKzEyNSwyNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobWx4NV9xdWVyeV9uaWNfdnBvcnRfbWluX2lubGluZSk7CiAKK2ludCBtbHg1X21vZGlmeV9uaWNfdnBvcnRfbWluX2lubGluZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwKKwkJCQkgICAgIHUxNiB2cG9ydCwgdTggbWluX2lubGluZSkKK3sKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhtb2RpZnlfbmljX3Zwb3J0X2NvbnRleHRfaW4pXSA9IHswfTsKKwlpbnQgaW5sZW4gPSBNTFg1X1NUX1NaX0JZVEVTKG1vZGlmeV9uaWNfdnBvcnRfY29udGV4dF9pbik7CisJdm9pZCAqbmljX3Zwb3J0X2N0eDsKKworCU1MWDVfU0VUKG1vZGlmeV9uaWNfdnBvcnRfY29udGV4dF9pbiwgaW4sCisJCSBmaWVsZF9zZWxlY3QubWluX2lubGluZSwgMSk7CisJTUxYNV9TRVQobW9kaWZ5X25pY192cG9ydF9jb250ZXh0X2luLCBpbiwgdnBvcnRfbnVtYmVyLCB2cG9ydCk7CisJTUxYNV9TRVQobW9kaWZ5X25pY192cG9ydF9jb250ZXh0X2luLCBpbiwgb3RoZXJfdnBvcnQsIDEpOworCisJbmljX3Zwb3J0X2N0eCA9IE1MWDVfQUREUl9PRihtb2RpZnlfbmljX3Zwb3J0X2NvbnRleHRfaW4sCisJCQkJICAgICBpbiwgbmljX3Zwb3J0X2NvbnRleHQpOworCU1MWDVfU0VUKG5pY192cG9ydF9jb250ZXh0LCBuaWNfdnBvcnRfY3R4LAorCQkgbWluX3dxZV9pbmxpbmVfbW9kZSwgbWluX2lubGluZSk7CisKKwlyZXR1cm4gbWx4NV9tb2RpZnlfbmljX3Zwb3J0X2NvbnRleHQobWRldiwgaW4sIGlubGVuKTsKK30KKwogaW50IG1seDVfcXVlcnlfbmljX3Zwb3J0X21hY19hZGRyZXNzKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LAogCQkJCSAgICAgdTE2IHZwb3J0LCB1OCAqYWRkcikKIHsKQEAgLTI1NCw3ICsyNTIsNyBAQAogCQkJCSAgdTggYWRkcl9saXN0W11bRVRIX0FMRU5dLAogCQkJCSAgaW50ICpsaXN0X3NpemUpCiB7Ci0JdTMyIGluW01MWDVfU1RfU1pfRFcocXVlcnlfbmljX3Zwb3J0X2NvbnRleHRfaW4pXTsKKwl1MzIgaW5bTUxYNV9TVF9TWl9EVyhxdWVyeV9uaWNfdnBvcnRfY29udGV4dF9pbildID0gezB9OwogCXZvaWQgKm5pY192cG9ydF9jdHg7CiAJaW50IG1heF9saXN0X3NpemU7CiAJaW50IHJlcV9saXN0X3NpemU7CkBAIC0yNzgsNyArMjc2LDYgQEAKIAlvdXRfc3ogPSBNTFg1X1NUX1NaX0JZVEVTKG1vZGlmeV9uaWNfdnBvcnRfY29udGV4dF9pbikgKwogCQkJcmVxX2xpc3Rfc2l6ZSAqIE1MWDVfU1RfU1pfQllURVMobWFjX2FkZHJlc3NfbGF5b3V0KTsKIAotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7CiAJb3V0ID0ga3phbGxvYyhvdXRfc3osIEdGUF9LRVJORUwpOwogCWlmICghb3V0KQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTI5MSw3ICsyODgsNyBAQAogCWlmICh2cG9ydCkKIAkJTUxYNV9TRVQocXVlcnlfbmljX3Zwb3J0X2NvbnRleHRfaW4sIGluLCBvdGhlcl92cG9ydCwgMSk7CiAKLQllcnIgPSBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIG91dF9zeik7CisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBzaXplb2YoaW4pLCBvdXQsIG91dF9zeik7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKQEAgLTM2MSw3ICszNTgsNyBAQAogCQlldGhlcl9hZGRyX2NvcHkoY3Vycl9tYWMsIGFkZHJfbGlzdFtpXSk7CiAJfQogCi0JZXJyID0gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMoZGV2LCBpbiwgaW5fc3osIG91dCwgc2l6ZW9mKG91dCkpOworCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgaW5fc3osIG91dCwgc2l6ZW9mKG91dCkpOwogCWtmcmVlKGluKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtNDA2LDcgKzQwMyw3IEBACiAJaWYgKHZwb3J0KQogCQlNTFg1X1NFVChxdWVyeV9uaWNfdnBvcnRfY29udGV4dF9pbiwgaW4sIG90aGVyX3Zwb3J0LCAxKTsKIAotCWVyciA9IG1seDVfY21kX2V4ZWNfY2hlY2tfc3RhdHVzKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgb3V0X3N6KTsKKwllcnIgPSBtbHg1X2NtZF9leGVjKGRldiwgaW4sIHNpemVvZihpbiksIG91dCwgb3V0X3N6KTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIApAQCAtNDczLDcgKzQ3MCw3IEBACiAJCU1MWDVfU0VUKHZsYW5fbGF5b3V0LCB2bGFuX2FkZHIsIHZsYW4sIHZsYW5zW2ldKTsKIAl9CiAKLQllcnIgPSBtbHg1X2NtZF9leGVjX2NoZWNrX3N0YXR1cyhkZXYsIGluLCBpbl9zeiwgb3V0LCBzaXplb2Yob3V0KSk7CisJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbl9zeiwgb3V0LCBzaXplb2Yob3V0KSk7CiAJa2ZyZWUoaW4pOwogCXJldHVybiBlcnI7CiB9CkBAIC02MzEsMTAgKzYyOCw2IEBACiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKLQllcnIgPSBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyX3YyKG91dCk7Ci0JaWYgKGVycikKLQkJZ290byBvdXQ7Ci0KIAl0bXAgPSBvdXQgKyBNTFg1X1NUX1NaX0JZVEVTKHF1ZXJ5X2hjYV92cG9ydF9naWRfb3V0KTsKIAlnaWQtPmdsb2JhbC5zdWJuZXRfcHJlZml4ID0gdG1wLT5nbG9iYWwuc3VibmV0X3ByZWZpeDsKIAlnaWQtPmdsb2JhbC5pbnRlcmZhY2VfaWQgPSB0bXAtPmdsb2JhbC5pbnRlcmZhY2VfaWQ7CkBAIC03MDAsMTAgKzY5Myw2IEBACiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKLQllcnIgPSBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyX3YyKG91dCk7Ci0JaWYgKGVycikKLQkJZ290byBvdXQ7Ci0KIAlwa2FyciA9IE1MWDVfQUREUl9PRihxdWVyeV9oY2FfdnBvcnRfcGtleV9vdXQsIG91dCwgcGtleSk7CiAJZm9yIChpID0gMDsgaSA8IG5vdXQ7IGkrKywgcGtleSsrLCBwa2FyciArPSBNTFg1X1NUX1NaX0JZVEVTKHBrZXkpKQogCQkqcGtleSA9IE1MWDVfR0VUX1BSKHBrZXksIHBrYXJyLCBwa2V5KTsKQEAgLTcyMSw3ICs3MTAsNyBAQAogCQkJCSBzdHJ1Y3QgbWx4NV9oY2FfdnBvcnRfY29udGV4dCAqcmVwKQogewogCWludCBvdXRfc3ogPSBNTFg1X1NUX1NaX0JZVEVTKHF1ZXJ5X2hjYV92cG9ydF9jb250ZXh0X291dCk7Ci0JaW50IGluW01MWDVfU1RfU1pfRFcocXVlcnlfaGNhX3Zwb3J0X2NvbnRleHRfaW4pXTsKKwlpbnQgaW5bTUxYNV9TVF9TWl9EVyhxdWVyeV9oY2FfdnBvcnRfY29udGV4dF9pbildID0gezB9OwogCWludCBpc19ncm91cF9tYW5hZ2VyOwogCXZvaWQgKm91dDsKIAl2b2lkICpjdHg7CkBAIC03MjksNyArNzE4LDYgQEAKIAogCWlzX2dyb3VwX21hbmFnZXIgPSBNTFg1X0NBUF9HRU4oZGV2LCB2cG9ydF9ncm91cF9tYW5hZ2VyKTsKIAotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7CiAJb3V0ID0ga3phbGxvYyhvdXRfc3osIEdGUF9LRVJORUwpOwogCWlmICghb3V0KQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTc1Miw5ICs3NDAsNiBAQAogCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCAgb3V0X3N6KTsKIAlpZiAoZXJyKQogCQlnb3RvIGV4OwotCWVyciA9IG1seDVfY21kX3N0YXR1c190b19lcnJfdjIob3V0KTsKLQlpZiAoZXJyKQotCQlnb3RvIGV4OwogCiAJY3R4ID0gTUxYNV9BRERSX09GKHF1ZXJ5X2hjYV92cG9ydF9jb250ZXh0X291dCwgb3V0LCBoY2FfdnBvcnRfY29udGV4dCk7CiAJcmVwLT5maWVsZF9zZWxlY3QgPSBNTFg1X0dFVF9QUihoY2FfdnBvcnRfY29udGV4dCwgY3R4LCBmaWVsZF9zZWxlY3QpOwpAQCAtOTY5LDEwICs5NTQsNiBAQAogCQlNTFg1X1NFVChxdWVyeV92cG9ydF9jb3VudGVyX2luLCBpbiwgcG9ydF9udW0sIHBvcnRfbnVtKTsKIAogCWVyciA9IG1seDVfY21kX2V4ZWMoZGV2LCBpbiwgaW5fc3osIG91dCwgIG91dF9zeik7Ci0JaWYgKGVycikKLQkJZ290byBmcmVlOwotCWVyciA9IG1seDVfY21kX3N0YXR1c190b19lcnJfdjIob3V0KTsKLQogZnJlZToKIAlrdmZyZWUoaW4pOwogCXJldHVybiBlcnI7CkBAIC0xMDM1LDExICsxMDE2LDYgQEAKIAlNTFg1X1NFVChoY2FfdnBvcnRfY29udGV4dCwgY3R4LCBxa2V5X3Zpb2xhdGlvbl9jb3VudGVyLCByZXEtPnFrZXlfdmlvbGF0aW9uX2NvdW50ZXIpOwogCU1MWDVfU0VUKGhjYV92cG9ydF9jb250ZXh0LCBjdHgsIHBrZXlfdmlvbGF0aW9uX2NvdW50ZXIsIHJlcS0+cGtleV92aW9sYXRpb25fY291bnRlcik7CiAJZXJyID0gbWx4NV9jbWRfZXhlYyhkZXYsIGluLCBpbl9zeiwgb3V0LCBzaXplb2Yob3V0KSk7Ci0JaWYgKGVycikKLQkJZ290byBleDsKLQotCWVyciA9IG1seDVfY21kX3N0YXR1c190b19lcnJfdjIob3V0KTsKLQogZXg6CiAJa2ZyZWUoaW4pOwogCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvdnhsYW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS92eGxhbi5jCmluZGV4IGUyNWE3M2VkLi4wN2E5YmE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvdnhsYW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvdnhsYW4uYwpAQCAtNDYsNDEgKzQ2LDI0IEBACiAKIHN0YXRpYyBpbnQgbWx4NWVfdnhsYW5fY29yZV9hZGRfcG9ydF9jbWQoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsIHUxNiBwb3J0KQogewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIgKmhkcjsKLQlpbnQgZXJyOwotCi0JdTMyIGluW01MWDVfU1RfU1pfRFcoYWRkX3Z4bGFuX3VkcF9kcG9ydF9pbildOwotCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhhZGRfdnhsYW5fdWRwX2Rwb3J0X291dCldOwotCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKLQltZW1zZXQob3V0LCAwLCBzaXplb2Yob3V0KSk7CisJdTMyIGluW01MWDVfU1RfU1pfRFcoYWRkX3Z4bGFuX3VkcF9kcG9ydF9pbildICAgPSB7MH07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKGFkZF92eGxhbl91ZHBfZHBvcnRfb3V0KV0gPSB7MH07CiAKIAlNTFg1X1NFVChhZGRfdnhsYW5fdWRwX2Rwb3J0X2luLCBpbiwgb3Bjb2RlLAogCQkgTUxYNV9DTURfT1BfQUREX1ZYTEFOX1VEUF9EUE9SVCk7CiAJTUxYNV9TRVQoYWRkX3Z4bGFuX3VkcF9kcG9ydF9pbiwgaW4sIHZ4bGFuX3VkcF9wb3J0LCBwb3J0KTsKLQotCWVyciA9IG1seDVfY21kX2V4ZWMobWRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQloZHIgPSAoc3RydWN0IG1seDVfb3V0Ym94X2hkciAqKW91dDsKLQlyZXR1cm4gaGRyLT5zdGF0dXMgPyAtRU5PTUVNIDogMDsKKwlyZXR1cm4gbWx4NV9jbWRfZXhlYyhtZGV2LCBpbiwgc2l6ZW9mKGluKSwgb3V0LCBzaXplb2Yob3V0KSk7CiB9CiAKIHN0YXRpYyBpbnQgbWx4NWVfdnhsYW5fY29yZV9kZWxfcG9ydF9jbWQoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsIHUxNiBwb3J0KQogewotCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlbGV0ZV92eGxhbl91ZHBfZHBvcnRfaW4pXTsKLQl1MzIgb3V0W01MWDVfU1RfU1pfRFcoZGVsZXRlX3Z4bGFuX3VkcF9kcG9ydF9vdXQpXTsKLQotCW1lbXNldChpbiwgMCwgc2l6ZW9mKGluKSk7Ci0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOworCXUzMiBpbltNTFg1X1NUX1NaX0RXKGRlbGV0ZV92eGxhbl91ZHBfZHBvcnRfaW4pXSAgID0gezB9OworCXUzMiBvdXRbTUxYNV9TVF9TWl9EVyhkZWxldGVfdnhsYW5fdWRwX2Rwb3J0X291dCldID0gezB9OwogCiAJTUxYNV9TRVQoZGVsZXRlX3Z4bGFuX3VkcF9kcG9ydF9pbiwgaW4sIG9wY29kZSwKIAkJIE1MWDVfQ01EX09QX0RFTEVURV9WWExBTl9VRFBfRFBPUlQpOwogCU1MWDVfU0VUKGRlbGV0ZV92eGxhbl91ZHBfZHBvcnRfaW4sIGluLCB2eGxhbl91ZHBfcG9ydCwgcG9ydCk7Ci0KLQlyZXR1cm4gbWx4NV9jbWRfZXhlY19jaGVja19zdGF0dXMobWRldiwgaW4sIHNpemVvZihpbiksIG91dCwKLQkJCQkJICBzaXplb2Yob3V0KSk7CisJcmV0dXJuIG1seDVfY21kX2V4ZWMobWRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQogCiBzdHJ1Y3QgbWx4NWVfdnhsYW4gKm1seDVlX3Z4bGFuX2xvb2t1cF9wb3J0KHN0cnVjdCBtbHg1ZV9wcml2ICpwcml2LCB1MTYgcG9ydCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L2NvcmUuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L2NvcmUuYwppbmRleCAwNjhlZTY1YS4uYWEzM2Q1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvY29yZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L2NvcmUuYwpAQCAtMTEwMCwxMCArMTEwMCwxNSBAQAogCQlnb3RvIGVycl9hbGxvY19zdGF0czsKIAl9CiAKLQlpZiAobWx4c3dfZHJpdmVyLT5wcm9maWxlLT51c2VkX21heF9sYWcgJiYKLQkgICAgbWx4c3dfZHJpdmVyLT5wcm9maWxlLT51c2VkX21heF9wb3J0X3Blcl9sYWcpIHsKLQkJYWxsb2Nfc2l6ZSA9IHNpemVvZih1OCkgKiBtbHhzd19kcml2ZXItPnByb2ZpbGUtPm1heF9sYWcgKgotCQkJICAgICBtbHhzd19kcml2ZXItPnByb2ZpbGUtPm1heF9wb3J0X3Blcl9sYWc7CisJZXJyID0gbWx4c3dfYnVzLT5pbml0KGJ1c19wcml2LCBtbHhzd19jb3JlLCBtbHhzd19kcml2ZXItPnByb2ZpbGUsCisJCQkgICAgICAmbWx4c3dfY29yZS0+cmVzb3VyY2VzKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9idXNfaW5pdDsKKworCWlmIChtbHhzd19jb3JlLT5yZXNvdXJjZXMubWF4X2xhZ192YWxpZCAmJgorCSAgICBtbHhzd19jb3JlLT5yZXNvdXJjZXMubWF4X3BvcnRzX2luX2xhZ192YWxpZCkgeworCQlhbGxvY19zaXplID0gc2l6ZW9mKHU4KSAqIG1seHN3X2NvcmUtPnJlc291cmNlcy5tYXhfbGFnICoKKwkJCW1seHN3X2NvcmUtPnJlc291cmNlcy5tYXhfcG9ydHNfaW5fbGFnOwogCQltbHhzd19jb3JlLT5sYWcubWFwcGluZyA9IGt6YWxsb2MoYWxsb2Nfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghbWx4c3dfY29yZS0+bGFnLm1hcHBpbmcpIHsKIAkJCWVyciA9IC1FTk9NRU07CkBAIC0xMTExLDExICsxMTE2LDYgQEAKIAkJfQogCX0KIAotCWVyciA9IG1seHN3X2J1cy0+aW5pdChidXNfcHJpdiwgbWx4c3dfY29yZSwgbWx4c3dfZHJpdmVyLT5wcm9maWxlLAotCQkJICAgICAgJm1seHN3X2NvcmUtPnJlc291cmNlcyk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfYnVzX2luaXQ7Ci0KIAllcnIgPSBtbHhzd19lbWFkX2luaXQobWx4c3dfY29yZSk7CiAJaWYgKGVycikKIAkJZ290byBlcnJfZW1hZF9pbml0OwpAQCAtMTE0NiwxMCArMTE0NiwxMCBAQAogZXJyX2RldmxpbmtfcmVnaXN0ZXI6CiAJbWx4c3dfZW1hZF9maW5pKG1seHN3X2NvcmUpOwogZXJyX2VtYWRfaW5pdDoKLQltbHhzd19idXMtPmZpbmkoYnVzX3ByaXYpOwotZXJyX2J1c19pbml0OgogCWtmcmVlKG1seHN3X2NvcmUtPmxhZy5tYXBwaW5nKTsKIGVycl9hbGxvY19sYWdfbWFwcGluZzoKKwltbHhzd19idXMtPmZpbmkoYnVzX3ByaXYpOworZXJyX2J1c19pbml0OgogCWZyZWVfcGVyY3B1KG1seHN3X2NvcmUtPnBjcHVfc3RhdHMpOwogZXJyX2FsbG9jX3N0YXRzOgogCWRldmxpbmtfZnJlZShkZXZsaW5rKTsKQEAgLTE2MTUsNyArMTYxNSw3IEBACiBzdGF0aWMgaW50IG1seHN3X2NvcmVfbGFnX21hcHBpbmdfaW5kZXgoc3RydWN0IG1seHN3X2NvcmUgKm1seHN3X2NvcmUsCiAJCQkJCXUxNiBsYWdfaWQsIHU4IHBvcnRfaW5kZXgpCiB7Ci0JcmV0dXJuIG1seHN3X2NvcmUtPmRyaXZlci0+cHJvZmlsZS0+bWF4X3BvcnRfcGVyX2xhZyAqIGxhZ19pZCArCisJcmV0dXJuIG1seHN3X2NvcmUtPnJlc291cmNlcy5tYXhfcG9ydHNfaW5fbGFnICogbGFnX2lkICsKIAkgICAgICAgcG9ydF9pbmRleDsKIH0KIApAQCAtMTY0NCw3ICsxNjQ0LDcgQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBtbHhzd19jb3JlLT5kcml2ZXItPnByb2ZpbGUtPm1heF9wb3J0X3Blcl9sYWc7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBtbHhzd19jb3JlLT5yZXNvdXJjZXMubWF4X3BvcnRzX2luX2xhZzsgaSsrKSB7CiAJCWludCBpbmRleCA9IG1seHN3X2NvcmVfbGFnX21hcHBpbmdfaW5kZXgobWx4c3dfY29yZSwKIAkJCQkJCQkgbGFnX2lkLCBpKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvY29yZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvY29yZS5oCmluZGV4IGQzNDc2ZWEuLmM0ZjU1MGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L2NvcmUuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9jb3JlLmgKQEAgLTg3LDYgKzg3LDcgQEAKIAl2b2lkICgqZnVuYykoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggbG9jYWxfcG9ydCwgdm9pZCAqcHJpdik7CiAJdTggbG9jYWxfcG9ydDsKIAl1MTYgdHJhcF9pZDsKKwllbnVtIG1seHN3X3JlZ19ocGt0X2FjdGlvbiBhY3Rpb247CiB9OwogCiBzdHJ1Y3QgbWx4c3dfZXZlbnRfbGlzdGVuZXIgewpAQCAtMTc4LDggKzE3OSw2IEBACiAKIHN0cnVjdCBtbHhzd19jb25maWdfcHJvZmlsZSB7CiAJdTE2CXVzZWRfbWF4X3ZlcGFfY2hhbm5lbHM6MSwKLQkJdXNlZF9tYXhfbGFnOjEsCi0JCXVzZWRfbWF4X3BvcnRfcGVyX2xhZzoxLAogCQl1c2VkX21heF9taWQ6MSwKIAkJdXNlZF9tYXhfcGd0OjEsCiAJCXVzZWRfbWF4X3N5c3RlbV9wb3J0OjEsCkBAIC0xOTEsMTAgKzE5MCw5IEBACiAJCXVzZWRfbWF4X3BrZXk6MSwKIAkJdXNlZF9hcl9zZWM6MSwKIAkJdXNlZF9hZGFwdGl2ZV9yb3V0aW5nX2dyb3VwX2NhcDoxLAotCQl1c2VkX2t2ZF9zaXplczoxOworCQl1c2VkX2t2ZF9zcGxpdF9kYXRhOjE7IC8qIGluZGljYXRlIGZvciB0aGUga3ZkJ3MgdmFsdWVzICovCisKIAl1OAltYXhfdmVwYV9jaGFubmVsczsKLQl1MTYJbWF4X2xhZzsKLQl1MTYJbWF4X3BvcnRfcGVyX2xhZzsKIAl1MTYJbWF4X21pZDsKIAl1MTYJbWF4X3BndDsKIAl1MTYJbWF4X3N5c3RlbV9wb3J0OwpAQCAtMjEzLDggKzIxMSw5IEBACiAJdTE2CWFkYXB0aXZlX3JvdXRpbmdfZ3JvdXBfY2FwOwogCXU4CWFybjsKIAl1MzIJa3ZkX2xpbmVhcl9zaXplOwotCXUzMglrdmRfaGFzaF9zaW5nbGVfc2l6ZTsKLQl1MzIJa3ZkX2hhc2hfZG91YmxlX3NpemU7CisJdTE2CWt2ZF9oYXNoX2dyYW51bGFyaXR5OworCXU4CWt2ZF9oYXNoX3NpbmdsZV9wYXJ0czsKKwl1OAlrdmRfaGFzaF9kb3VibGVfcGFydHM7CiAJdTgJcmVzb3VyY2VfcXVlcnlfZW5hYmxlOwogCXN0cnVjdCBtbHhzd19zd2lkX2NvbmZpZyBzd2lkX2NvbmZpZ1tNTFhTV19DT05GSUdfUFJPRklMRV9TV0lEX0NPVU5UXTsKIH07CkBAIC0yNjgsOCArMjY3LDM1IEBACiB9OwogCiBzdHJ1Y3QgbWx4c3dfcmVzb3VyY2VzIHsKLQl1OAltYXhfc3Bhbl92YWxpZDoxOworCXUzMgltYXhfc3Bhbl92YWxpZDoxLAorCQltYXhfbGFnX3ZhbGlkOjEsCisJCW1heF9wb3J0c19pbl9sYWdfdmFsaWQ6MSwKKwkJa3ZkX3NpemVfdmFsaWQ6MSwKKwkJa3ZkX3NpbmdsZV9taW5fc2l6ZV92YWxpZDoxLAorCQlrdmRfZG91YmxlX21pbl9zaXplX3ZhbGlkOjEsCisJCW1heF92aXJ0dWFsX3JvdXRlcnNfdmFsaWQ6MSwKKwkJbWF4X3N5c3RlbV9wb3J0c192YWxpZDoxLAorCQltYXhfdmxhbl9ncm91cHNfdmFsaWQ6MSwKKwkJbWF4X3JlZ2lvbnNfdmFsaWQ6MSwKKwkJbWF4X3JpZl92YWxpZDoxOwogCXU4ICAgICAgbWF4X3NwYW47CisJdTgJbWF4X2xhZzsKKwl1OAltYXhfcG9ydHNfaW5fbGFnOworCXUzMglrdmRfc2l6ZTsKKwl1MzIJa3ZkX3NpbmdsZV9taW5fc2l6ZTsKKwl1MzIJa3ZkX2RvdWJsZV9taW5fc2l6ZTsKKwl1MTYgICAgIG1heF92aXJ0dWFsX3JvdXRlcnM7CisJdTE2CW1heF9zeXN0ZW1fcG9ydHM7CisJdTE2CW1heF92bGFuX2dyb3VwczsKKwl1MTYJbWF4X3JlZ2lvbnM7CisJdTE2CW1heF9yaWY7CisKKwkvKiBJbnRlcm5hbCByZXNvdXJjZXMuCisJICogRGV0ZXJtaW5lZCBieSB0aGUgU1csIG5vdCBxdWVyaWVkIGZyb20gdGhlIEhXLgorCSAqLworCXUzMglrdmRfc2luZ2xlX3NpemU7CisJdTMyCWt2ZF9kb3VibGVfc2l6ZTsKKwl1MzIJa3ZkX2xpbmVhcl9zaXplOwogfTsKIAogc3RydWN0IG1seHN3X3Jlc291cmNlcyAqbWx4c3dfY29yZV9yZXNvdXJjZXNfZ2V0KHN0cnVjdCBtbHhzd19jb3JlICptbHhzd19jb3JlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3BjaS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvcGNpLmMKaW5kZXggMWQxMzYwYy4uZTc0MmJkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvcGNpLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvcGNpLmMKQEAgLTExNTYsNiArMTE1NiwxNiBAQAogCiAjZGVmaW5lIE1MWFNXX1JFU09VUkNFU19UQUJMRV9FTkRfSUQgMHhmZmZmCiAjZGVmaW5lIE1MWFNXX01BWF9TUEFOX0lEIDB4MjQyMAorI2RlZmluZSBNTFhTV19NQVhfTEFHX0lEIDB4MjUyMAorI2RlZmluZSBNTFhTV19NQVhfUE9SVFNfSU5fTEFHX0lEIDB4MjUyMQorI2RlZmluZSBNTFhTV19LVkRfU0laRV9JRCAweDEwMDEKKyNkZWZpbmUgTUxYU1dfS1ZEX1NJTkdMRV9NSU5fU0laRV9JRCAweDEwMDIKKyNkZWZpbmUgTUxYU1dfS1ZEX0RPVUJMRV9NSU5fU0laRV9JRCAweDEwMDMKKyNkZWZpbmUgTUxYU1dfTUFYX1ZJUlRVQUxfUk9VVEVSU19JRCAweDJDMDEKKyNkZWZpbmUgTUxYU1dfTUFYX1NZU1RFTV9QT1JUX0lEIDB4MjUwMgorI2RlZmluZSBNTFhTV19NQVhfVkxBTl9HUk9VUFNfSUQgMHgyOTA2CisjZGVmaW5lIE1MWFNXX01BWF9SRUdJT05TX0lEIDB4MjkwMQorI2RlZmluZSBNTFhTV19NQVhfUklGX0lEIDB4MkMwMgogI2RlZmluZSBNTFhTV19SRVNPVVJDRVNfUVVFUllfTUFYX1FVRVJJRVMgMTAwCiAjZGVmaW5lIE1MWFNXX1JFU09VUkNFU19QRVJfUVVFUlkgMzIKIApAQCAtMTE2Nyw2ICsxMTc3LDQ2IEBACiAJCXJlc291cmNlcy0+bWF4X3NwYW4gPSB2YWw7CiAJCXJlc291cmNlcy0+bWF4X3NwYW5fdmFsaWQgPSAxOwogCQlicmVhazsKKwljYXNlIE1MWFNXX01BWF9MQUdfSUQ6CisJCXJlc291cmNlcy0+bWF4X2xhZyA9IHZhbDsKKwkJcmVzb3VyY2VzLT5tYXhfbGFnX3ZhbGlkID0gMTsKKwkJYnJlYWs7CisJY2FzZSBNTFhTV19NQVhfUE9SVFNfSU5fTEFHX0lEOgorCQlyZXNvdXJjZXMtPm1heF9wb3J0c19pbl9sYWcgPSB2YWw7CisJCXJlc291cmNlcy0+bWF4X3BvcnRzX2luX2xhZ192YWxpZCA9IDE7CisJCWJyZWFrOworCWNhc2UgTUxYU1dfS1ZEX1NJWkVfSUQ6CisJCXJlc291cmNlcy0+a3ZkX3NpemUgPSB2YWw7CisJCXJlc291cmNlcy0+a3ZkX3NpemVfdmFsaWQgPSAxOworCQlicmVhazsKKwljYXNlIE1MWFNXX0tWRF9TSU5HTEVfTUlOX1NJWkVfSUQ6CisJCXJlc291cmNlcy0+a3ZkX3NpbmdsZV9taW5fc2l6ZSA9IHZhbDsKKwkJcmVzb3VyY2VzLT5rdmRfc2luZ2xlX21pbl9zaXplX3ZhbGlkID0gMTsKKwkJYnJlYWs7CisJY2FzZSBNTFhTV19LVkRfRE9VQkxFX01JTl9TSVpFX0lEOgorCQlyZXNvdXJjZXMtPmt2ZF9kb3VibGVfbWluX3NpemUgPSB2YWw7CisJCXJlc291cmNlcy0+a3ZkX2RvdWJsZV9taW5fc2l6ZV92YWxpZCA9IDE7CisJCWJyZWFrOworCWNhc2UgTUxYU1dfTUFYX1ZJUlRVQUxfUk9VVEVSU19JRDoKKwkJcmVzb3VyY2VzLT5tYXhfdmlydHVhbF9yb3V0ZXJzID0gdmFsOworCQlyZXNvdXJjZXMtPm1heF92aXJ0dWFsX3JvdXRlcnNfdmFsaWQgPSAxOworCQlicmVhazsKKwljYXNlIE1MWFNXX01BWF9TWVNURU1fUE9SVF9JRDoKKwkJcmVzb3VyY2VzLT5tYXhfc3lzdGVtX3BvcnRzID0gdmFsOworCQlyZXNvdXJjZXMtPm1heF9zeXN0ZW1fcG9ydHNfdmFsaWQgPSAxOworCQlicmVhazsKKwljYXNlIE1MWFNXX01BWF9WTEFOX0dST1VQU19JRDoKKwkJcmVzb3VyY2VzLT5tYXhfdmxhbl9ncm91cHMgPSB2YWw7CisJCXJlc291cmNlcy0+bWF4X3ZsYW5fZ3JvdXBzX3ZhbGlkID0gMTsKKwkJYnJlYWs7CisJY2FzZSBNTFhTV19NQVhfUkVHSU9OU19JRDoKKwkJcmVzb3VyY2VzLT5tYXhfcmVnaW9ucyA9IHZhbDsKKwkJcmVzb3VyY2VzLT5tYXhfcmVnaW9uc192YWxpZCA9IDE7CisJCWJyZWFrOworCWNhc2UgTUxYU1dfTUFYX1JJRl9JRDoKKwkJcmVzb3VyY2VzLT5tYXhfcmlmID0gdmFsOworCQlyZXNvdXJjZXMtPm1heF9yaWZfdmFsaWQgPSAxOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CkBAIC0xMjA5LDEwICsxMjU5LDUyIEBACiAJcmV0dXJuIC1FSU87CiB9CiAKK3N0YXRpYyBpbnQgbWx4c3dfcGNpX3Byb2ZpbGVfZ2V0X2t2ZF9zaXplcyhjb25zdCBzdHJ1Y3QgbWx4c3dfY29uZmlnX3Byb2ZpbGUgKnByb2ZpbGUsCisJCQkJCSAgIHN0cnVjdCBtbHhzd19yZXNvdXJjZXMgKnJlc291cmNlcykKK3sKKwl1MzIgc2luZ2xlc19zaXplLCBkb3VibGVzX3NpemUsIGxpbmVhcl9zaXplOworCisJaWYgKCFyZXNvdXJjZXMtPmt2ZF9zaW5nbGVfbWluX3NpemVfdmFsaWQgfHwKKwkgICAgIXJlc291cmNlcy0+a3ZkX2RvdWJsZV9taW5fc2l6ZV92YWxpZCB8fAorCSAgICAhcHJvZmlsZS0+dXNlZF9rdmRfc3BsaXRfZGF0YSkKKwkJcmV0dXJuIC1FSU87CisKKwlsaW5lYXJfc2l6ZSA9IHByb2ZpbGUtPmt2ZF9saW5lYXJfc2l6ZTsKKworCS8qIFRoZSBoYXNoIHBhcnQgaXMgd2hhdCBsZWZ0IG9mIHRoZSBrdmQgd2l0aG91dCB0aGUKKwkgKiBsaW5lYXIgcGFydC4gSXQgaXMgc3BsaXQgdG8gdGhlIHNpbmdsZSBzaXplIGFuZAorCSAqIGRvdWJsZSBzaXplIGJ5IHRoZSBwYXJ0cyByYXRpbyBmcm9tIHRoZSBwcm9maWxlLgorCSAqIEJvdGggc2l6ZXMgbXVzdCBiZSBhIG11bHRpcGxpY2F0aW9ucyBvZiB0aGUKKwkgKiBncmFudWxhcml0eSBmcm9tIHRoZSBwcm9maWxlLgorCSAqLworCWRvdWJsZXNfc2l6ZSA9IChyZXNvdXJjZXMtPmt2ZF9zaXplIC0gbGluZWFyX3NpemUpOworCWRvdWJsZXNfc2l6ZSAqPSBwcm9maWxlLT5rdmRfaGFzaF9kb3VibGVfcGFydHM7CisJZG91Ymxlc19zaXplIC89IChwcm9maWxlLT5rdmRfaGFzaF9kb3VibGVfcGFydHMgKworCQkJIHByb2ZpbGUtPmt2ZF9oYXNoX3NpbmdsZV9wYXJ0cyk7CisJZG91Ymxlc19zaXplIC89IHByb2ZpbGUtPmt2ZF9oYXNoX2dyYW51bGFyaXR5OworCWRvdWJsZXNfc2l6ZSAqPSBwcm9maWxlLT5rdmRfaGFzaF9ncmFudWxhcml0eTsKKwlzaW5nbGVzX3NpemUgPSByZXNvdXJjZXMtPmt2ZF9zaXplIC0gZG91Ymxlc19zaXplIC0KKwkJICAgICAgIGxpbmVhcl9zaXplOworCisJLyogQ2hlY2sgcmVzdWx0cyBhcmUgbGVnYWwuICovCisJaWYgKHNpbmdsZXNfc2l6ZSA8IHJlc291cmNlcy0+a3ZkX3NpbmdsZV9taW5fc2l6ZSB8fAorCSAgICBkb3VibGVzX3NpemUgPCByZXNvdXJjZXMtPmt2ZF9kb3VibGVfbWluX3NpemUgfHwKKwkgICAgcmVzb3VyY2VzLT5rdmRfc2l6ZSA8IGxpbmVhcl9zaXplKQorCQlyZXR1cm4gLUVJTzsKKworCXJlc291cmNlcy0+a3ZkX3NpbmdsZV9zaXplID0gc2luZ2xlc19zaXplOworCXJlc291cmNlcy0+a3ZkX2RvdWJsZV9zaXplID0gZG91Ymxlc19zaXplOworCXJlc291cmNlcy0+a3ZkX2xpbmVhcl9zaXplID0gbGluZWFyX3NpemU7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBtbHhzd19wY2lfY29uZmlnX3Byb2ZpbGUoc3RydWN0IG1seHN3X3BjaSAqbWx4c3dfcGNpLCBjaGFyICptYm94LAotCQkJCSAgICBjb25zdCBzdHJ1Y3QgbWx4c3dfY29uZmlnX3Byb2ZpbGUgKnByb2ZpbGUpCisJCQkJICAgIGNvbnN0IHN0cnVjdCBtbHhzd19jb25maWdfcHJvZmlsZSAqcHJvZmlsZSwKKwkJCQkgICAgc3RydWN0IG1seHN3X3Jlc291cmNlcyAqcmVzb3VyY2VzKQogewogCWludCBpOworCWludCBlcnI7CiAKIAltbHhzd19jbWRfbWJveF96ZXJvKG1ib3gpOwogCkBAIC0xMjIyLDE4ICsxMzE0LDYgQEAKIAkJbWx4c3dfY21kX21ib3hfY29uZmlnX3Byb2ZpbGVfbWF4X3ZlcGFfY2hhbm5lbHNfc2V0KAogCQkJbWJveCwgcHJvZmlsZS0+bWF4X3ZlcGFfY2hhbm5lbHMpOwogCX0KLQlpZiAocHJvZmlsZS0+dXNlZF9tYXhfbGFnKSB7Ci0JCW1seHN3X2NtZF9tYm94X2NvbmZpZ19wcm9maWxlX3NldF9tYXhfbGFnX3NldCgKLQkJCW1ib3gsIDEpOwotCQltbHhzd19jbWRfbWJveF9jb25maWdfcHJvZmlsZV9tYXhfbGFnX3NldCgKLQkJCW1ib3gsIHByb2ZpbGUtPm1heF9sYWcpOwotCX0KLQlpZiAocHJvZmlsZS0+dXNlZF9tYXhfcG9ydF9wZXJfbGFnKSB7Ci0JCW1seHN3X2NtZF9tYm94X2NvbmZpZ19wcm9maWxlX3NldF9tYXhfcG9ydF9wZXJfbGFnX3NldCgKLQkJCW1ib3gsIDEpOwotCQltbHhzd19jbWRfbWJveF9jb25maWdfcHJvZmlsZV9tYXhfcG9ydF9wZXJfbGFnX3NldCgKLQkJCW1ib3gsIHByb2ZpbGUtPm1heF9wb3J0X3Blcl9sYWcpOwotCX0KIAlpZiAocHJvZmlsZS0+dXNlZF9tYXhfbWlkKSB7CiAJCW1seHN3X2NtZF9tYm94X2NvbmZpZ19wcm9maWxlX3NldF9tYXhfbWlkX3NldCgKIAkJCW1ib3gsIDEpOwpAQCAtMTMxMCwxOSArMTM5MCwyMiBAQAogCQltbHhzd19jbWRfbWJveF9jb25maWdfcHJvZmlsZV9hZGFwdGl2ZV9yb3V0aW5nX2dyb3VwX2NhcF9zZXQoCiAJCQltYm94LCBwcm9maWxlLT5hZGFwdGl2ZV9yb3V0aW5nX2dyb3VwX2NhcCk7CiAJfQotCWlmIChwcm9maWxlLT51c2VkX2t2ZF9zaXplcykgewotCQltbHhzd19jbWRfbWJveF9jb25maWdfcHJvZmlsZV9zZXRfa3ZkX2xpbmVhcl9zaXplX3NldCgKLQkJCW1ib3gsIDEpOwotCQltbHhzd19jbWRfbWJveF9jb25maWdfcHJvZmlsZV9rdmRfbGluZWFyX3NpemVfc2V0KAotCQkJbWJveCwgcHJvZmlsZS0+a3ZkX2xpbmVhcl9zaXplKTsKLQkJbWx4c3dfY21kX21ib3hfY29uZmlnX3Byb2ZpbGVfc2V0X2t2ZF9oYXNoX3NpbmdsZV9zaXplX3NldCgKLQkJCW1ib3gsIDEpOwotCQltbHhzd19jbWRfbWJveF9jb25maWdfcHJvZmlsZV9rdmRfaGFzaF9zaW5nbGVfc2l6ZV9zZXQoCi0JCQltYm94LCBwcm9maWxlLT5rdmRfaGFzaF9zaW5nbGVfc2l6ZSk7CisJaWYgKHJlc291cmNlcy0+a3ZkX3NpemVfdmFsaWQpIHsKKwkJZXJyID0gbWx4c3dfcGNpX3Byb2ZpbGVfZ2V0X2t2ZF9zaXplcyhwcm9maWxlLCByZXNvdXJjZXMpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQltbHhzd19jbWRfbWJveF9jb25maWdfcHJvZmlsZV9zZXRfa3ZkX2xpbmVhcl9zaXplX3NldChtYm94LCAxKTsKKwkJbWx4c3dfY21kX21ib3hfY29uZmlnX3Byb2ZpbGVfa3ZkX2xpbmVhcl9zaXplX3NldChtYm94LAorCQkJCQkJcmVzb3VyY2VzLT5rdmRfbGluZWFyX3NpemUpOworCQltbHhzd19jbWRfbWJveF9jb25maWdfcHJvZmlsZV9zZXRfa3ZkX2hhc2hfc2luZ2xlX3NpemVfc2V0KG1ib3gsCisJCQkJCQkJCQkgICAxKTsKKwkJbWx4c3dfY21kX21ib3hfY29uZmlnX3Byb2ZpbGVfa3ZkX2hhc2hfc2luZ2xlX3NpemVfc2V0KG1ib3gsCisJCQkJCQlyZXNvdXJjZXMtPmt2ZF9zaW5nbGVfc2l6ZSk7CiAJCW1seHN3X2NtZF9tYm94X2NvbmZpZ19wcm9maWxlX3NldF9rdmRfaGFzaF9kb3VibGVfc2l6ZV9zZXQoCi0JCQltYm94LCAxKTsKLQkJbWx4c3dfY21kX21ib3hfY29uZmlnX3Byb2ZpbGVfa3ZkX2hhc2hfZG91YmxlX3NpemVfc2V0KAotCQkJbWJveCwgcHJvZmlsZS0+a3ZkX2hhc2hfZG91YmxlX3NpemUpOworCQkJCQkJCQltYm94LCAxKTsKKwkJbWx4c3dfY21kX21ib3hfY29uZmlnX3Byb2ZpbGVfa3ZkX2hhc2hfZG91YmxlX3NpemVfc2V0KG1ib3gsCisJCQkJCQlyZXNvdXJjZXMtPmt2ZF9kb3VibGVfc2l6ZSk7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IE1MWFNXX0NPTkZJR19QUk9GSUxFX1NXSURfQ09VTlQ7IGkrKykKQEAgLTE1MjQsNyArMTYwNyw3IEBACiAJaWYgKGVycikKIAkJZ290byBlcnJfcXVlcnlfcmVzb3VyY2VzOwogCi0JZXJyID0gbWx4c3dfcGNpX2NvbmZpZ19wcm9maWxlKG1seHN3X3BjaSwgbWJveCwgcHJvZmlsZSk7CisJZXJyID0gbWx4c3dfcGNpX2NvbmZpZ19wcm9maWxlKG1seHN3X3BjaSwgbWJveCwgcHJvZmlsZSwgcmVzb3VyY2VzKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9jb25maWdfcHJvZmlsZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvcG9ydC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvcG9ydC5oCmluZGV4IGYzM2I5OTcuLmFmMzcxYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3BvcnQuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9wb3J0LmgKQEAgLTU2LDYgKzU2LDcgQEAKICNkZWZpbmUgTUxYU1dfUE9SVF9QSFlfQklUU19NQVNLCShNTFhTV19QT1JUX01BWF9QSFlfUE9SVFMgLSAxKQogCiAjZGVmaW5lIE1MWFNXX1BPUlRfQ1BVX1BPUlQJCTB4MAorI2RlZmluZSBNTFhTV19QT1JUX1JPVVRFUl9QT1JUCQkoTUxYU1dfUE9SVF9NQVhfUEhZX1BPUlRTICsgMikKIAogI2RlZmluZSBNTFhTV19QT1JUX0RPTlRfQ0FSRQkJKE1MWFNXX1BPUlRfTUFYX1BPUlRTKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9yZWcuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3JlZy5oCmluZGV4IDdjYTkyMDEuLjY0NjBjNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3JlZy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3JlZy5oCkBAIC01OTEsNiArNTkxLDEyIEBACiAgKi8KIE1MWFNXX0lURU0zMihyZWcsIHNmbiwgc3dpZCwgMHgwMCwgMjQsIDgpOwogCisvKiByZWdfc2ZuX2VuZAorICogRm9yY2VzIHRoZSBjdXJyZW50IHNlc3Npb24gdG8gZW5kLgorICogQWNjZXNzOiBPUAorICovCitNTFhTV19JVEVNMzIocmVnLCBzZm4sIGVuZCwgMHgwNCwgMjAsIDEpOworCiAvKiByZWdfc2ZuX251bV9yZWMKICAqIFJlcXVlc3Q6IE51bWJlciBvZiBsZWFybmVkIG5vdGlmaWNhdGlvbnMgYW5kIGFnZWQtb3V0IG5vdGlmaWNhdGlvbgogICogcmVjb3JkcyByZXF1ZXN0ZWQuCkBAIC02MDUsNiArNjExLDcgQEAKIHsKIAlNTFhTV19SRUdfWkVSTyhzZm4sIHBheWxvYWQpOwogCW1seHN3X3JlZ19zZm5fc3dpZF9zZXQocGF5bG9hZCwgMCk7CisJbWx4c3dfcmVnX3Nmbl9lbmRfc2V0KHBheWxvYWQsIDEpOwogCW1seHN3X3JlZ19zZm5fbnVtX3JlY19zZXQocGF5bG9hZCwgTUxYU1dfUkVHX1NGTl9SRUNfTUFYX0NPVU5UKTsKIH0KIApAQCAtMTM4NSw3ICsxMzkyLDcgQEAKIHsKIAlNTFhTV19SRUdfWkVSTyhzbGNyLCBwYXlsb2FkKTsKIAltbHhzd19yZWdfc2xjcl9wcF9zZXQocGF5bG9hZCwgTUxYU1dfUkVHX1NMQ1JfUFBfR0xPQkFMKTsKLQltbHhzd19yZWdfc2xjcl90eXBlX3NldChwYXlsb2FkLCBNTFhTV19SRUdfU0xDUl9UWVBFX1hPUik7CisJbWx4c3dfcmVnX3NsY3JfdHlwZV9zZXQocGF5bG9hZCwgTUxYU1dfUkVHX1NMQ1JfVFlQRV9DUkMpOwogCW1seHN3X3JlZ19zbGNyX2xhZ19oYXNoX3NldChwYXlsb2FkLCBsYWdfaGFzaCk7CiB9CiAKQEAgLTIxMzEsNiArMjEzOCwxOCBAQAogICovCiBNTFhTV19JVEVNMzIocmVnLCBwdHlzLCBwcm90b19tYXNrLCAweDAwLCAwLCAzKTsKIAorZW51bSB7CisJTUxYU1dfUkVHX1BUWVNfQU5fU1RBVFVTX05BLAorCU1MWFNXX1JFR19QVFlTX0FOX1NUQVRVU19PSywKKwlNTFhTV19SRUdfUFRZU19BTl9TVEFUVVNfRkFJTCwKK307CisKKy8qIHJlZ19wdHlzX2FuX3N0YXR1cworICogQXV0b25lZ290aWF0aW9uIHN0YXR1cy4KKyAqIEFjY2VzczogUk8KKyAqLworTUxYU1dfSVRFTTMyKHJlZywgcHR5cywgYW5fc3RhdHVzLCAweDA0LCAyOCwgNCk7CisKICNkZWZpbmUgTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEX1NHTUlJCQkJQklUKDApCiAjZGVmaW5lIE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMDAwQkFTRV9LWAkJQklUKDEpCiAjZGVmaW5lIE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMEdCQVNFX0NYNAkJQklUKDIpCkBAIC0yMTQ1LDYgKzIxNjQsNyBAQAogI2RlZmluZSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTBHQkFTRV9FUl9MUgkJQklUKDE0KQogI2RlZmluZSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfNDBHQkFTRV9TUjQJCUJJVCgxNSkKICNkZWZpbmUgTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzQwR0JBU0VfTFI0X0VSNAlCSVQoMTYpCisjZGVmaW5lIE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF81MEdCQVNFX1NSMgkJQklUKDE4KQogI2RlZmluZSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfNTBHQkFTRV9LUjQJCUJJVCgxOSkKICNkZWZpbmUgTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzEwMEdCQVNFX0NSNAkJQklUKDIwKQogI2RlZmluZSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTAwR0JBU0VfU1I0CQlCSVQoMjEpCkBAIC0yMTc3LDYgKzIxOTcsMTMgQEAKICAqLwogTUxYU1dfSVRFTTMyKHJlZywgcHR5cywgZXRoX3Byb3RvX29wZXIsIDB4MjQsIDAsIDMyKTsKIAorLyogcmVnX3B0eXNfZXRoX3Byb3RvX2xwX2FkdmVydGlzZQorICogVGhlIHByb3RvY29scyB0aGF0IHdlcmUgYWR2ZXJ0aXNlZCBieSB0aGUgbGluayBwYXJ0bmVyIGR1cmluZworICogYXV0b25lZ290aWF0aW9uLgorICogQWNjZXNzOiBSTworICovCitNTFhTV19JVEVNMzIocmVnLCBwdHlzLCBldGhfcHJvdG9fbHBfYWR2ZXJ0aXNlLCAweDMwLCAwLCAzMik7CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBtbHhzd19yZWdfcHR5c19wYWNrKGNoYXIgKnBheWxvYWQsIHU4IGxvY2FsX3BvcnQsCiAJCQkJICAgICAgIHUzMiBwcm90b19hZG1pbikKIHsKQEAgLTMzODMsNiArMzQxMCwxNSBAQAogICovCiBNTFhTV19JVEVNMzIocmVnLCByaXRyLCBpcHY2X2ZlLCAweDA0LCAyOCwgMSk7CiAKKy8qIHJlZ19yaXRyX2xiX2VuCisgKiBMb29wLWJhY2sgZmlsdGVyIGVuYWJsZSBmb3IgdW5pY2FzdCBwYWNrZXRzLgorICogSWYgdGhlIGZsYWcgaXMgc2V0IHRoZW4gbG9vcC1iYWNrIGZpbHRlciBmb3IgdW5pY2FzdCBwYWNrZXRzIGlzCisgKiBpbXBsZW1lbnRlZCBvbiB0aGUgUklGLiBNdWx0aWNhc3QgcGFja2V0cyBhcmUgYWx3YXlzIHN1YmplY3QgdG8KKyAqIGxvb3AtYmFjayBmaWx0ZXJpbmcuCisgKiBBY2Nlc3M6IFJXCisgKi8KK01MWFNXX0lURU0zMihyZWcsIHJpdHIsIGxiX2VuLCAweDA0LCAyNCwgMSk7CisKIC8qIHJlZ19yaXRyX3ZpcnR1YWxfcm91dGVyCiAgKiBWaXJ0dWFsIHJvdXRlciBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIHJvdXRlciBpbnRlcmZhY2UuCiAgKiBBY2Nlc3M6IFJXCkBAIC0zNDg0LDYgKzM1MjAsNyBAQAogCW1seHN3X3JlZ19yaXRyX29wX3NldChwYXlsb2FkLCBvcCk7CiAJbWx4c3dfcmVnX3JpdHJfcmlmX3NldChwYXlsb2FkLCByaWYpOwogCW1seHN3X3JlZ19yaXRyX2lwdjRfZmVfc2V0KHBheWxvYWQsIDEpOworCW1seHN3X3JlZ19yaXRyX2xiX2VuX3NldChwYXlsb2FkLCAxKTsKIAltbHhzd19yZWdfcml0cl9tdHVfc2V0KHBheWxvYWQsIG10dSk7CiAJbWx4c3dfcmVnX3JpdHJfaWZfbWFjX21lbWNweV90byhwYXlsb2FkLCBtYWMpOwogfQpAQCAtNDAwMCw2ICs0MDM3LDcgQEAKIHsKIAlNTFhTV19SRUdfWkVSTyhyYWx1ZSwgcGF5bG9hZCk7CiAJbWx4c3dfcmVnX3JhbHVlX3Byb3RvY29sX3NldChwYXlsb2FkLCBwcm90b2NvbCk7CisJbWx4c3dfcmVnX3JhbHVlX29wX3NldChwYXlsb2FkLCBvcCk7CiAJbWx4c3dfcmVnX3JhbHVlX3ZpcnR1YWxfcm91dGVyX3NldChwYXlsb2FkLCB2aXJ0dWFsX3JvdXRlcik7CiAJbWx4c3dfcmVnX3JhbHVlX3ByZWZpeF9sZW5fc2V0KHBheWxvYWQsIHByZWZpeF9sZW4pOwogCW1seHN3X3JlZ19yYWx1ZV9lbnRyeV90eXBlX3NldChwYXlsb2FkLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3BlY3RydW0uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3NwZWN0cnVtLmMKaW5kZXggYzNlNjE1MC4uMWVjMGE0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3BlY3RydW0uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9zcGVjdHJ1bS5jCkBAIC01Niw2ICs1Niw3IEBACiAjaW5jbHVkZSA8Z2VuZXJhdGVkL3V0c3JlbGVhc2UuaD4KICNpbmNsdWRlIDxuZXQvcGt0X2Nscy5oPgogI2luY2x1ZGUgPG5ldC90Y19hY3QvdGNfbWlycmVkLmg+CisjaW5jbHVkZSA8bmV0L25ldGV2ZW50Lmg+CiAKICNpbmNsdWRlICJzcGVjdHJ1bS5oIgogI2luY2x1ZGUgImNvcmUuaCIKQEAgLTI0Nyw3ICsyNDgsOCBAQAogCXNwYW5fZW50cnktPnVzZWQgPSBmYWxzZTsKIH0KIAotc3RydWN0IG1seHN3X3NwX3NwYW5fZW50cnkgKm1seHN3X3NwX3NwYW5fZW50cnlfZmluZChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqcG9ydCkKK3N0YXRpYyBzdHJ1Y3QgbWx4c3dfc3Bfc3Bhbl9lbnRyeSAqCittbHhzd19zcF9zcGFuX2VudHJ5X2ZpbmQoc3RydWN0IG1seHN3X3NwX3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IG1seHN3X3NwICptbHhzd19zcCA9IHBvcnQtPm1seHN3X3NwOwogCWludCBpOwpAQCAtMjYxLDcgKzI2Myw4IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0cnVjdCBtbHhzd19zcF9zcGFuX2VudHJ5ICptbHhzd19zcF9zcGFuX2VudHJ5X2dldChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqcG9ydCkKK3N0YXRpYyBzdHJ1Y3QgbWx4c3dfc3Bfc3Bhbl9lbnRyeQorKm1seHN3X3NwX3NwYW5fZW50cnlfZ2V0KHN0cnVjdCBtbHhzd19zcF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCBtbHhzd19zcF9zcGFuX2VudHJ5ICpzcGFuX2VudHJ5OwogCkBAIC0zNjMsNyArMzY2LDggQEAKIAl9CiAKIAkvKiBiaW5kIHRoZSBwb3J0IHRvIHRoZSBTUEFOIGVudHJ5ICovCi0JbWx4c3dfcmVnX21wYXJfcGFjayhtcGFyX3BsLCBwb3J0LT5sb2NhbF9wb3J0LCB0eXBlLCB0cnVlLCBwYV9pZCk7CisJbWx4c3dfcmVnX21wYXJfcGFjayhtcGFyX3BsLCBwb3J0LT5sb2NhbF9wb3J0LAorCQkJICAgIChlbnVtIG1seHN3X3JlZ19tcGFyX2lfZSkgdHlwZSwgdHJ1ZSwgcGFfaWQpOwogCWVyciA9IG1seHN3X3JlZ193cml0ZShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKG1wYXIpLCBtcGFyX3BsKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9tcGFyX3JlZ193cml0ZTsKQEAgLTQwNCw3ICs0MDgsOCBAQAogCQlyZXR1cm47CiAKIAkvKiByZW1vdmUgdGhlIGluc3BlY3RlZCBwb3J0ICovCi0JbWx4c3dfcmVnX21wYXJfcGFjayhtcGFyX3BsLCBwb3J0LT5sb2NhbF9wb3J0LCB0eXBlLCBmYWxzZSwgcGFfaWQpOworCW1seHN3X3JlZ19tcGFyX3BhY2sobXBhcl9wbCwgcG9ydC0+bG9jYWxfcG9ydCwKKwkJCSAgICAoZW51bSBtbHhzd19yZWdfbXBhcl9pX2UpIHR5cGUsIGZhbHNlLCBwYV9pZCk7CiAJbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcobXBhciksIG1wYXJfcGwpOwogCiAJLyogcmVtb3ZlIHRoZSBTQklCIGJ1ZmZlciBpZiBpdCB3YXMgZWdyZXNzIFNQQU4gKi8KQEAgLTU1NSw4ICs1NjAsOSBAQAogCXJldHVybiBtbHhzd19yZWdfd3JpdGUobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhzdmZhKSwgc3ZmYV9wbCk7CiB9CiAKLXN0YXRpYyBpbnQgbWx4c3dfc3BfcG9ydF92aWRfbGVhcm5pbmdfc2V0KHN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0LAotCQkJCQkgIHUxNiB2aWQsIGJvb2wgbGVhcm5fZW5hYmxlKQoraW50IF9fbWx4c3dfc3BfcG9ydF92aWRfbGVhcm5pbmdfc2V0KHN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0LAorCQkJCSAgICAgdTE2IHZpZF9iZWdpbiwgdTE2IHZpZF9lbmQsCisJCQkJICAgICBib29sIGxlYXJuX2VuYWJsZSkKIHsKIAlzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwID0gbWx4c3dfc3BfcG9ydC0+bWx4c3dfc3A7CiAJY2hhciAqc3B2bWxyX3BsOwpAQCAtNTY1LDEzICs1NzEsMjAgQEAKIAlzcHZtbHJfcGwgPSBrbWFsbG9jKE1MWFNXX1JFR19TUFZNTFJfTEVOLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNwdm1scl9wbCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWx4c3dfcmVnX3Nwdm1scl9wYWNrKHNwdm1scl9wbCwgbWx4c3dfc3BfcG9ydC0+bG9jYWxfcG9ydCwgdmlkLCB2aWQsCi0JCQkgICAgICBsZWFybl9lbmFibGUpOworCW1seHN3X3JlZ19zcHZtbHJfcGFjayhzcHZtbHJfcGwsIG1seHN3X3NwX3BvcnQtPmxvY2FsX3BvcnQsIHZpZF9iZWdpbiwKKwkJCSAgICAgIHZpZF9lbmQsIGxlYXJuX2VuYWJsZSk7CiAJZXJyID0gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcoc3B2bWxyKSwgc3B2bWxyX3BsKTsKIAlrZnJlZShzcHZtbHJfcGwpOwogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgbWx4c3dfc3BfcG9ydF92aWRfbGVhcm5pbmdfc2V0KHN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0LAorCQkJCQkgIHUxNiB2aWQsIGJvb2wgbGVhcm5fZW5hYmxlKQoreworCXJldHVybiBfX21seHN3X3NwX3BvcnRfdmlkX2xlYXJuaW5nX3NldChtbHhzd19zcF9wb3J0LCB2aWQsIHZpZCwKKwkJCQkJCWxlYXJuX2VuYWJsZSk7Cit9CisKIHN0YXRpYyBpbnQKIG1seHN3X3NwX3BvcnRfc3lzdGVtX3BvcnRfbWFwcGluZ19zZXQoc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQpCiB7CkBAIC04MTAsOSArODIzLDkgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICoKLW1seHN3X3NwX3BvcnRfZ2V0X3N0YXRzNjQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpzdGF0cykKK3N0YXRpYyBpbnQKK21seHN3X3NwX3BvcnRfZ2V0X3N3X3N0YXRzNjQoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpzdGF0cykKIHsKIAlzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG1seHN3X3NwX3BvcnRfcGNwdV9zdGF0cyAqcDsKQEAgLTgzOSw2ICs4NTIsMTA3IEBACiAJCXR4X2Ryb3BwZWQJKz0gcC0+dHhfZHJvcHBlZDsKIAl9CiAJc3RhdHMtPnR4X2Ryb3BwZWQJPSB0eF9kcm9wcGVkOworCXJldHVybiAwOworfQorCitzdGF0aWMgYm9vbCBtbHhzd19zcF9wb3J0X2hhc19vZmZsb2FkX3N0YXRzKGludCBhdHRyX2lkKQoreworCXN3aXRjaCAoYXR0cl9pZCkgeworCWNhc2UgSUZMQV9PRkZMT0FEX1hTVEFUU19DUFVfSElUOgorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgbWx4c3dfc3BfcG9ydF9nZXRfb2ZmbG9hZF9zdGF0cyhpbnQgYXR0cl9pZCwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgdm9pZCAqc3ApCit7CisJc3dpdGNoIChhdHRyX2lkKSB7CisJY2FzZSBJRkxBX09GRkxPQURfWFNUQVRTX0NQVV9ISVQ6CisJCXJldHVybiBtbHhzd19zcF9wb3J0X2dldF9zd19zdGF0czY0KGRldiwgc3ApOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IG1seHN3X3NwX3BvcnRfZ2V0X3N0YXRzX3JhdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZ3JwLAorCQkJCSAgICAgICBpbnQgcHJpbywgY2hhciAqcHBjbnRfcGwpCit7CisJc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3AgPSBtbHhzd19zcF9wb3J0LT5tbHhzd19zcDsKKworCW1seHN3X3JlZ19wcGNudF9wYWNrKHBwY250X3BsLCBtbHhzd19zcF9wb3J0LT5sb2NhbF9wb3J0LCBncnAsIHByaW8pOworCXJldHVybiBtbHhzd19yZWdfcXVlcnkobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhwcGNudCksIHBwY250X3BsKTsKK30KKworc3RhdGljIGludCBtbHhzd19zcF9wb3J0X2dldF9od19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqc3RhdHMpCit7CisJY2hhciBwcGNudF9wbFtNTFhTV19SRUdfUFBDTlRfTEVOXTsKKwlpbnQgZXJyOworCisJZXJyID0gbWx4c3dfc3BfcG9ydF9nZXRfc3RhdHNfcmF3KGRldiwgTUxYU1dfUkVHX1BQQ05UX0lFRUVfODAyM19DTlQsCisJCQkJCSAgMCwgcHBjbnRfcGwpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJc3RhdHMtPnR4X3BhY2tldHMgPQorCQltbHhzd19yZWdfcHBjbnRfYV9mcmFtZXNfdHJhbnNtaXR0ZWRfb2tfZ2V0KHBwY250X3BsKTsKKwlzdGF0cy0+cnhfcGFja2V0cyA9CisJCW1seHN3X3JlZ19wcGNudF9hX2ZyYW1lc19yZWNlaXZlZF9va19nZXQocHBjbnRfcGwpOworCXN0YXRzLT50eF9ieXRlcyA9CisJCW1seHN3X3JlZ19wcGNudF9hX29jdGV0c190cmFuc21pdHRlZF9va19nZXQocHBjbnRfcGwpOworCXN0YXRzLT5yeF9ieXRlcyA9CisJCW1seHN3X3JlZ19wcGNudF9hX29jdGV0c19yZWNlaXZlZF9va19nZXQocHBjbnRfcGwpOworCXN0YXRzLT5tdWx0aWNhc3QgPQorCQltbHhzd19yZWdfcHBjbnRfYV9tdWx0aWNhc3RfZnJhbWVzX3JlY2VpdmVkX29rX2dldChwcGNudF9wbCk7CisKKwlzdGF0cy0+cnhfY3JjX2Vycm9ycyA9CisJCW1seHN3X3JlZ19wcGNudF9hX2ZyYW1lX2NoZWNrX3NlcXVlbmNlX2Vycm9yc19nZXQocHBjbnRfcGwpOworCXN0YXRzLT5yeF9mcmFtZV9lcnJvcnMgPQorCQltbHhzd19yZWdfcHBjbnRfYV9hbGlnbm1lbnRfZXJyb3JzX2dldChwcGNudF9wbCk7CisKKwlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycyA9ICgKKwkJbWx4c3dfcmVnX3BwY250X2FfaW5fcmFuZ2VfbGVuZ3RoX2Vycm9yc19nZXQocHBjbnRfcGwpICsKKwkJbWx4c3dfcmVnX3BwY250X2Ffb3V0X29mX3JhbmdlX2xlbmd0aF9maWVsZF9nZXQocHBjbnRfcGwpICsKKwkJbWx4c3dfcmVnX3BwY250X2FfZnJhbWVfdG9vX2xvbmdfZXJyb3JzX2dldChwcGNudF9wbCkpOworCisJc3RhdHMtPnJ4X2Vycm9ycyA9IChzdGF0cy0+cnhfY3JjX2Vycm9ycyArCisJCXN0YXRzLT5yeF9mcmFtZV9lcnJvcnMgKyBzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycyk7CisKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfc3RhdHNfY2FjaGUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBtbHhzd19zcF9wb3J0LAorCQkJICAgICBod19zdGF0cy51cGRhdGVfZHcud29yayk7CisKKwlpZiAoIW5ldGlmX2NhcnJpZXJfb2sobWx4c3dfc3BfcG9ydC0+ZGV2KSkKKwkJZ290byBvdXQ7CisKKwltbHhzd19zcF9wb3J0X2dldF9od19zdGF0cyhtbHhzd19zcF9wb3J0LT5kZXYsCisJCQkJICAgbWx4c3dfc3BfcG9ydC0+aHdfc3RhdHMuY2FjaGUpOworCitvdXQ6CisJbWx4c3dfY29yZV9zY2hlZHVsZV9kdygmbWx4c3dfc3BfcG9ydC0+aHdfc3RhdHMudXBkYXRlX2R3LAorCQkJICAgICAgIE1MWFNXX0hXX1NUQVRTX1VQREFURV9USU1FKTsKK30KKworLyogUmV0dXJuIHRoZSBzdGF0cyBmcm9tIGEgY2FjaGUgdGhhdCBpcyB1cGRhdGVkIHBlcmlvZGljYWxseSwKKyAqIGFzIHRoaXMgZnVuY3Rpb24gbWlnaHQgZ2V0IGNhbGxlZCBpbiBhbiBhdG9taWMgY29udGV4dC4KKyAqLworc3RhdGljIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqCittbHhzd19zcF9wb3J0X2dldF9zdGF0czY0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqc3RhdHMpCit7CisJc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQgPSBuZXRkZXZfcHJpdihkZXYpOworCisJbWVtY3B5KHN0YXRzLCBtbHhzd19zcF9wb3J0LT5od19zdGF0cy5jYWNoZSwgc2l6ZW9mKCpzdGF0cykpOworCiAJcmV0dXJuIHN0YXRzOwogfQogCkBAIC05NDIsOCArMTA1Niw4IEBACiAJa2ZyZWUobWx4c3dfc3BfdnBvcnQpOwogfQogCi1pbnQgbWx4c3dfc3BfcG9ydF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fYmUxNiBfX2Fsd2F5c191bnVzZWQgcHJvdG8sCi0JCQkgIHUxNiB2aWQpCitzdGF0aWMgaW50IG1seHN3X3NwX3BvcnRfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSBfX2JlMTYgX19hbHdheXNfdW51c2VkIHByb3RvLCB1MTYgdmlkKQogewogCXN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfdnBvcnQ7CkBAIC05NTYsMTYgKzEwNzAsMTIgQEAKIAlpZiAoIXZpZCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAobWx4c3dfc3BfcG9ydF92cG9ydF9maW5kKG1seHN3X3NwX3BvcnQsIHZpZCkpIHsKLQkJbmV0ZGV2X3dhcm4oZGV2LCAiVklEPSVkIGFscmVhZHkgY29uZmlndXJlZFxuIiwgdmlkKTsKKwlpZiAobWx4c3dfc3BfcG9ydF92cG9ydF9maW5kKG1seHN3X3NwX3BvcnQsIHZpZCkpCiAJCXJldHVybiAwOwotCX0KIAogCW1seHN3X3NwX3Zwb3J0ID0gbWx4c3dfc3BfcG9ydF92cG9ydF9jcmVhdGUobWx4c3dfc3BfcG9ydCwgdmlkKTsKLQlpZiAoIW1seHN3X3NwX3Zwb3J0KSB7Ci0JCW5ldGRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSB2UG9ydCBmb3IgVklEPSVkXG4iLCB2aWQpOworCWlmICghbWx4c3dfc3BfdnBvcnQpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCS8qIFdoZW4gYWRkaW5nIHRoZSBmaXJzdCBWTEFOIGludGVyZmFjZSBvbiBhIGJyaWRnZWQgcG9ydCB3ZSBuZWVkIHRvCiAJICogdHJhbnNpdGlvbiBhbGwgdGhlIGFjdGl2ZSA4MDIuMVEgYnJpZGdlIFZMQU5zIHRvIHVzZSBleHBsaWNpdApAQCAtOTczLDMwICsxMDgzLDE3IEBACiAJICovCiAJaWYgKGxpc3RfaXNfc2luZ3VsYXIoJm1seHN3X3NwX3BvcnQtPnZwb3J0c19saXN0KSkgewogCQllcnIgPSBtbHhzd19zcF9wb3J0X3ZwX21vZGVfdHJhbnMobWx4c3dfc3BfcG9ydCk7Ci0JCWlmIChlcnIpIHsKLQkJCW5ldGRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHNldCB0byBWaXJ0dWFsIG1vZGVcbiIpOworCQlpZiAoZXJyKQogCQkJZ290byBlcnJfcG9ydF92cF9tb2RlX3RyYW5zOwotCQl9Ci0JfQotCi0JZXJyID0gbWx4c3dfc3BfcG9ydF92aWRfbGVhcm5pbmdfc2V0KG1seHN3X3NwX3Zwb3J0LCB2aWQsIGZhbHNlKTsKLQlpZiAoZXJyKSB7Ci0JCW5ldGRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGRpc2FibGUgbGVhcm5pbmcgZm9yIFZJRD0lZFxuIiwgdmlkKTsKLQkJZ290byBlcnJfcG9ydF92aWRfbGVhcm5pbmdfc2V0OwogCX0KIAogCWVyciA9IG1seHN3X3NwX3BvcnRfdmxhbl9zZXQobWx4c3dfc3BfdnBvcnQsIHZpZCwgdmlkLCB0cnVlLCB1bnRhZ2dlZCk7Ci0JaWYgKGVycikgewotCQluZXRkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBzZXQgVkxBTiBtZW1iZXJzaGlwIGZvciBWSUQ9JWRcbiIsCi0JCQkgICB2aWQpOworCWlmIChlcnIpCiAJCWdvdG8gZXJyX3BvcnRfYWRkX3ZpZDsKLQl9CiAKIAlyZXR1cm4gMDsKIAogZXJyX3BvcnRfYWRkX3ZpZDoKLQltbHhzd19zcF9wb3J0X3ZpZF9sZWFybmluZ19zZXQobWx4c3dfc3BfdnBvcnQsIHZpZCwgdHJ1ZSk7Ci1lcnJfcG9ydF92aWRfbGVhcm5pbmdfc2V0OgogCWlmIChsaXN0X2lzX3Npbmd1bGFyKCZtbHhzd19zcF9wb3J0LT52cG9ydHNfbGlzdCkpCiAJCW1seHN3X3NwX3BvcnRfdmxhbl9tb2RlX3RyYW5zKG1seHN3X3NwX3BvcnQpOwogZXJyX3BvcnRfdnBfbW9kZV90cmFuczoKQEAgLTEwMTAsNyArMTEwNyw2IEBACiAJc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF92cG9ydDsKIAlzdHJ1Y3QgbWx4c3dfc3BfZmlkICpmOwotCWludCBlcnI7CiAKIAkvKiBWTEFOIDAgaXMgcmVtb3ZlZCBmcm9tIEhXIGZpbHRlciB3aGVuIGRldmljZSBnb2VzIGRvd24sIGJ1dAogCSAqIGl0IGlzIHJlc2VydmVkIGluIG91ciBjYXNlLCBzbyBzaW1wbHkgcmV0dXJuLgpAQCAtMTAxOSwyMyArMTExNSwxMCBAQAogCQlyZXR1cm4gMDsKIAogCW1seHN3X3NwX3Zwb3J0ID0gbWx4c3dfc3BfcG9ydF92cG9ydF9maW5kKG1seHN3X3NwX3BvcnQsIHZpZCk7Ci0JaWYgKCFtbHhzd19zcF92cG9ydCkgewotCQluZXRkZXZfd2FybihkZXYsICJWSUQ9JWQgZG9lcyBub3QgZXhpc3RcbiIsIHZpZCk7CisJaWYgKFdBUk5fT04oIW1seHN3X3NwX3Zwb3J0KSkKIAkJcmV0dXJuIDA7Ci0JfQogCi0JZXJyID0gbWx4c3dfc3BfcG9ydF92bGFuX3NldChtbHhzd19zcF92cG9ydCwgdmlkLCB2aWQsIGZhbHNlLCBmYWxzZSk7Ci0JaWYgKGVycikgewotCQluZXRkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBzZXQgVkxBTiBtZW1iZXJzaGlwIGZvciBWSUQ9JWRcbiIsCi0JCQkgICB2aWQpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCWVyciA9IG1seHN3X3NwX3BvcnRfdmlkX2xlYXJuaW5nX3NldChtbHhzd19zcF92cG9ydCwgdmlkLCB0cnVlKTsKLQlpZiAoZXJyKSB7Ci0JCW5ldGRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBsZWFybmluZyBmb3IgVklEPSVkXG4iLCB2aWQpOwotCQlyZXR1cm4gZXJyOwotCX0KKwltbHhzd19zcF9wb3J0X3ZsYW5fc2V0KG1seHN3X3NwX3Zwb3J0LCB2aWQsIHZpZCwgZmFsc2UsIGZhbHNlKTsKIAogCS8qIERyb3AgRklEIHJlZmVyZW5jZS4gSWYgdGhpcyB3YXMgdGhlIGxhc3QgcmVmZXJlbmNlIHRoZQogCSAqIHJlc291cmNlcyB3aWxsIGJlIGZyZWVkLgpAQCAtMTA0OCwxMyArMTEzMSw4IEBACiAJICogdHJhbnNpdGlvbiBhbGwgYWN0aXZlIDgwMi4xUSBicmlkZ2UgVkxBTnMgdG8gdXNlIFZJRCB0byBGSUQKIAkgKiBtYXBwaW5ncyBhbmQgc2V0IHBvcnQncyBtb2RlIHRvIFZMQU4gbW9kZS4KIAkgKi8KLQlpZiAobGlzdF9pc19zaW5ndWxhcigmbWx4c3dfc3BfcG9ydC0+dnBvcnRzX2xpc3QpKSB7Ci0JCWVyciA9IG1seHN3X3NwX3BvcnRfdmxhbl9tb2RlX3RyYW5zKG1seHN3X3NwX3BvcnQpOwotCQlpZiAoZXJyKSB7Ci0JCQluZXRkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBzZXQgdG8gVkxBTiBtb2RlXG4iKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KLQl9CisJaWYgKGxpc3RfaXNfc2luZ3VsYXIoJm1seHN3X3NwX3BvcnQtPnZwb3J0c19saXN0KSkKKwkJbWx4c3dfc3BfcG9ydF92bGFuX21vZGVfdHJhbnMobWx4c3dfc3BfcG9ydCk7CiAKIAltbHhzd19zcF9wb3J0X3Zwb3J0X2Rlc3Ryb3kobWx4c3dfc3BfdnBvcnQpOwogCkBAIC0xMTQ5LDYgKzEyMjcsNyBAQAogCQkJCQkgIGJvb2wgaW5ncmVzcykKIHsKIAljb25zdCBzdHJ1Y3QgdGNfYWN0aW9uICphOworCUxJU1RfSEVBRChhY3Rpb25zKTsKIAlpbnQgZXJyOwogCiAJaWYgKCF0Y19zaW5nbGVfYWN0aW9uKGNscy0+ZXh0cykpIHsKQEAgLTExNTYsNyArMTIzNSw4IEBACiAJCXJldHVybiAtRU5PVFNVUFA7CiAJfQogCi0JdGNfZm9yX2VhY2hfYWN0aW9uKGEsIGNscy0+ZXh0cykgeworCXRjZl9leHRzX3RvX2xpc3QoY2xzLT5leHRzLCAmYWN0aW9ucyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShhLCAmYWN0aW9ucywgbGlzdCkgewogCQlpZiAoIWlzX3RjZl9taXJyZWRfbWlycm9yKGEpIHx8IHByb3RvY29sICE9IGh0b25zKEVUSF9QX0FMTCkpCiAJCQlyZXR1cm4gLUVOT1RTVVBQOwogCkBAIC0xMjM0LDYgKzEzMTQsOCBAQAogCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gbWx4c3dfc3BfcG9ydF9zZXRfbWFjX2FkZHJlc3MsCiAJLm5kb19jaGFuZ2VfbXR1CQk9IG1seHN3X3NwX3BvcnRfY2hhbmdlX210dSwKIAkubmRvX2dldF9zdGF0czY0CT0gbWx4c3dfc3BfcG9ydF9nZXRfc3RhdHM2NCwKKwkubmRvX2hhc19vZmZsb2FkX3N0YXRzCT0gbWx4c3dfc3BfcG9ydF9oYXNfb2ZmbG9hZF9zdGF0cywKKwkubmRvX2dldF9vZmZsb2FkX3N0YXRzCT0gbWx4c3dfc3BfcG9ydF9nZXRfb2ZmbG9hZF9zdGF0cywKIAkubmRvX3ZsYW5fcnhfYWRkX3ZpZAk9IG1seHN3X3NwX3BvcnRfYWRkX3ZpZCwKIAkubmRvX3ZsYW5fcnhfa2lsbF92aWQJPSBtbHhzd19zcF9wb3J0X2tpbGxfdmlkLAogCS5uZG9fbmVpZ2hfY29uc3RydWN0CT0gbWx4c3dfc3Bfcm91dGVyX25laWdoX2NvbnN0cnVjdCwKQEAgLTE1NzIsOCArMTY1NCw2IEBACiAJCQkJICAgICAgZW51bSBtbHhzd19yZWdfcHBjbnRfZ3JwIGdycCwgaW50IHByaW8sCiAJCQkJICAgICAgdTY0ICpkYXRhLCBpbnQgZGF0YV9pbmRleCkKIHsKLQlzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IG1seHN3X3NwICptbHhzd19zcCA9IG1seHN3X3NwX3BvcnQtPm1seHN3X3NwOwogCXN0cnVjdCBtbHhzd19zcF9wb3J0X2h3X3N0YXRzICpod19zdGF0czsKIAljaGFyIHBwY250X3BsW01MWFNXX1JFR19QUENOVF9MRU5dOwogCWludCBpLCBsZW47CkBAIC0xNTgyLDEwICsxNjYyLDkgQEAKIAllcnIgPSBtbHhzd19zcF9nZXRfaHdfc3RhdHNfYnlfZ3JvdXAoJmh3X3N0YXRzLCAmbGVuLCBncnApOwogCWlmIChlcnIpCiAJCXJldHVybjsKLQltbHhzd19yZWdfcHBjbnRfcGFjayhwcGNudF9wbCwgbWx4c3dfc3BfcG9ydC0+bG9jYWxfcG9ydCwgZ3JwLCBwcmlvKTsKLQllcnIgPSBtbHhzd19yZWdfcXVlcnkobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhwcGNudCksIHBwY250X3BsKTsKKwltbHhzd19zcF9wb3J0X2dldF9zdGF0c19yYXcoZGV2LCBncnAsIHByaW8sIHBwY250X3BsKTsKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCWRhdGFbZGF0YV9pbmRleCArIGldID0gIWVyciA/IGh3X3N0YXRzW2ldLmdldHRlcihwcGNudF9wbCkgOiAwOworCQlkYXRhW2RhdGFfaW5kZXggKyBpXSA9IGh3X3N0YXRzW2ldLmdldHRlcihwcGNudF9wbCk7CiB9CiAKIHN0YXRpYyB2b2lkIG1seHN3X3NwX3BvcnRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC0xNjI0LDExMiArMTcwMywxNDkgQEAKIH0KIAogc3RydWN0IG1seHN3X3NwX3BvcnRfbGlua19tb2RlIHsKKwllbnVtIGV0aHRvb2xfbGlua19tb2RlX2JpdF9pbmRpY2VzIG1hc2tfZXRodG9vbDsKIAl1MzIgbWFzazsKLQl1MzIgc3VwcG9ydGVkOwotCXUzMiBhZHZlcnRpc2VkOwogCXUzMiBzcGVlZDsKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbWx4c3dfc3BfcG9ydF9saW5rX21vZGUgbWx4c3dfc3BfcG9ydF9saW5rX21vZGVbXSA9IHsKIAl7CiAJCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMDBCQVNFX1QsCi0JCS5zdXBwb3J0ZWQJPSBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCwKLQkJLmFkdmVydGlzZWQJPSBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwsCi0JCS5zcGVlZAkJPSAxMDAsCi0JfSwKLQl7Ci0JCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMDBCQVNFX1RYLAotCQkuc3BlZWQJCT0gMTAwLAorCQkubWFza19ldGh0b29sCT0gRVRIVE9PTF9MSU5LX01PREVfMTAwYmFzZVRfRnVsbF9CSVQsCisJCS5zcGVlZAkJPSBTUEVFRF8xMDAsCiAJfSwKIAl7CiAJCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF9TR01JSSB8CiAJCQkJICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTAwMEJBU0VfS1gsCi0JCS5zdXBwb3J0ZWQJPSBTVVBQT1JURURfMTAwMGJhc2VLWF9GdWxsLAotCQkuYWR2ZXJ0aXNlZAk9IEFEVkVSVElTRURfMTAwMGJhc2VLWF9GdWxsLAotCQkuc3BlZWQJCT0gMTAwMCwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzEwMDBiYXNlS1hfRnVsbF9CSVQsCisJCS5zcGVlZAkJPSBTUEVFRF8xMDAwLAogCX0sCiAJewogCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTBHQkFTRV9ULAotCQkuc3VwcG9ydGVkCT0gU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCwKLQkJLmFkdmVydGlzZWQJPSBBRFZFUlRJU0VEXzEwMDAwYmFzZVRfRnVsbCwKLQkJLnNwZWVkCQk9IDEwMDAwLAorCQkubWFza19ldGh0b29sCT0gRVRIVE9PTF9MSU5LX01PREVfMTAwMDBiYXNlVF9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzEwMDAwLAogCX0sCiAJewogCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTBHQkFTRV9DWDQgfAogCQkJCSAgTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzEwR0JBU0VfS1g0LAotCQkuc3VwcG9ydGVkCT0gU1VQUE9SVEVEXzEwMDAwYmFzZUtYNF9GdWxsLAotCQkuYWR2ZXJ0aXNlZAk9IEFEVkVSVElTRURfMTAwMDBiYXNlS1g0X0Z1bGwsCi0JCS5zcGVlZAkJPSAxMDAwMCwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzEwMDAwYmFzZUtYNF9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzEwMDAwLAogCX0sCiAJewogCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTBHQkFTRV9LUiB8CiAJCQkJICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTBHQkFTRV9DUiB8CiAJCQkJICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTBHQkFTRV9TUiB8CiAJCQkJICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTBHQkFTRV9FUl9MUiwKLQkJLnN1cHBvcnRlZAk9IFNVUFBPUlRFRF8xMDAwMGJhc2VLUl9GdWxsLAotCQkuYWR2ZXJ0aXNlZAk9IEFEVkVSVElTRURfMTAwMDBiYXNlS1JfRnVsbCwKLQkJLnNwZWVkCQk9IDEwMDAwLAorCQkubWFza19ldGh0b29sCT0gRVRIVE9PTF9MSU5LX01PREVfMTAwMDBiYXNlS1JfRnVsbF9CSVQsCisJCS5zcGVlZAkJPSBTUEVFRF8xMDAwMCwKIAl9LAogCXsKIAkJLm1hc2sJCT0gTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzIwR0JBU0VfS1IyLAotCQkuc3VwcG9ydGVkCT0gU1VQUE9SVEVEXzIwMDAwYmFzZUtSMl9GdWxsLAotCQkuYWR2ZXJ0aXNlZAk9IEFEVkVSVElTRURfMjAwMDBiYXNlS1IyX0Z1bGwsCi0JCS5zcGVlZAkJPSAyMDAwMCwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzIwMDAwYmFzZUtSMl9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzIwMDAwLAogCX0sCiAJewogCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfNDBHQkFTRV9DUjQsCi0JCS5zdXBwb3J0ZWQJPSBTVVBQT1JURURfNDAwMDBiYXNlQ1I0X0Z1bGwsCi0JCS5hZHZlcnRpc2VkCT0gQURWRVJUSVNFRF80MDAwMGJhc2VDUjRfRnVsbCwKLQkJLnNwZWVkCQk9IDQwMDAwLAorCQkubWFza19ldGh0b29sCT0gRVRIVE9PTF9MSU5LX01PREVfNDAwMDBiYXNlQ1I0X0Z1bGxfQklULAorCQkuc3BlZWQJCT0gU1BFRURfNDAwMDAsCiAJfSwKIAl7CiAJCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF80MEdCQVNFX0tSNCwKLQkJLnN1cHBvcnRlZAk9IFNVUFBPUlRFRF80MDAwMGJhc2VLUjRfRnVsbCwKLQkJLmFkdmVydGlzZWQJPSBBRFZFUlRJU0VEXzQwMDAwYmFzZUtSNF9GdWxsLAotCQkuc3BlZWQJCT0gNDAwMDAsCisJCS5tYXNrX2V0aHRvb2wJPSBFVEhUT09MX0xJTktfTU9ERV80MDAwMGJhc2VLUjRfRnVsbF9CSVQsCisJCS5zcGVlZAkJPSBTUEVFRF80MDAwMCwKIAl9LAogCXsKIAkJLm1hc2sJCT0gTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzQwR0JBU0VfU1I0LAotCQkuc3VwcG9ydGVkCT0gU1VQUE9SVEVEXzQwMDAwYmFzZVNSNF9GdWxsLAotCQkuYWR2ZXJ0aXNlZAk9IEFEVkVSVElTRURfNDAwMDBiYXNlU1I0X0Z1bGwsCi0JCS5zcGVlZAkJPSA0MDAwMCwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzQwMDAwYmFzZVNSNF9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzQwMDAwLAogCX0sCiAJewogCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfNDBHQkFTRV9MUjRfRVI0LAotCQkuc3VwcG9ydGVkCT0gU1VQUE9SVEVEXzQwMDAwYmFzZUxSNF9GdWxsLAotCQkuYWR2ZXJ0aXNlZAk9IEFEVkVSVElTRURfNDAwMDBiYXNlTFI0X0Z1bGwsCi0JCS5zcGVlZAkJPSA0MDAwMCwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzQwMDAwYmFzZUxSNF9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzQwMDAwLAogCX0sCiAJewotCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMjVHQkFTRV9DUiB8Ci0JCQkJICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMjVHQkFTRV9LUiB8Ci0JCQkJICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMjVHQkFTRV9TUiwKLQkJLnNwZWVkCQk9IDI1MDAwLAorCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMjVHQkFTRV9DUiwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzI1MDAwYmFzZUNSX0Z1bGxfQklULAorCQkuc3BlZWQJCT0gU1BFRURfMjUwMDAsCiAJfSwKIAl7Ci0JCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF81MEdCQVNFX0tSNCB8Ci0JCQkJICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfNTBHQkFTRV9DUjIgfAotCQkJCSAgTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzUwR0JBU0VfS1IyLAotCQkuc3BlZWQJCT0gNTAwMDAsCisJCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8yNUdCQVNFX0tSLAorCQkubWFza19ldGh0b29sCT0gRVRIVE9PTF9MSU5LX01PREVfMjUwMDBiYXNlS1JfRnVsbF9CSVQsCisJCS5zcGVlZAkJPSBTUEVFRF8yNTAwMCwKKwl9LAorCXsKKwkJLm1hc2sJCT0gTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzI1R0JBU0VfU1IsCisJCS5tYXNrX2V0aHRvb2wJPSBFVEhUT09MX0xJTktfTU9ERV8yNTAwMGJhc2VTUl9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzI1MDAwLAorCX0sCisJeworCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMjVHQkFTRV9TUiwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzI1MDAwYmFzZVNSX0Z1bGxfQklULAorCQkuc3BlZWQJCT0gU1BFRURfMjUwMDAsCisJfSwKKwl7CisJCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF81MEdCQVNFX0NSMiwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzUwMDAwYmFzZUNSMl9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzUwMDAwLAorCX0sCisJeworCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfNTBHQkFTRV9LUjIsCisJCS5tYXNrX2V0aHRvb2wJPSBFVEhUT09MX0xJTktfTU9ERV81MDAwMGJhc2VLUjJfRnVsbF9CSVQsCisJCS5zcGVlZAkJPSBTUEVFRF81MDAwMCwKKwl9LAorCXsKKwkJLm1hc2sJCT0gTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzUwR0JBU0VfU1IyLAorCQkubWFza19ldGh0b29sCT0gRVRIVE9PTF9MSU5LX01PREVfNTAwMDBiYXNlU1IyX0Z1bGxfQklULAorCQkuc3BlZWQJCT0gU1BFRURfNTAwMDAsCiAJfSwKIAl7CiAJCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF81NkdCQVNFX1I0LAotCQkuc3VwcG9ydGVkCT0gU1VQUE9SVEVEXzU2MDAwYmFzZUtSNF9GdWxsLAotCQkuYWR2ZXJ0aXNlZAk9IEFEVkVSVElTRURfNTYwMDBiYXNlS1I0X0Z1bGwsCi0JCS5zcGVlZAkJPSA1NjAwMCwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzU2MDAwYmFzZUtSNF9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzU2MDAwLAogCX0sCiAJewotCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTAwR0JBU0VfQ1I0IHwKLQkJCQkgIE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMDBHQkFTRV9TUjQgfAotCQkJCSAgTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzEwMEdCQVNFX0tSNCB8Ci0JCQkJICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTAwR0JBU0VfTFI0X0VSNCwKLQkJLnNwZWVkCQk9IDEwMDAwMCwKKwkJLm1hc2sJCT0gTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzU2R0JBU0VfUjQsCisJCS5tYXNrX2V0aHRvb2wJPSBFVEhUT09MX0xJTktfTU9ERV81NjAwMGJhc2VDUjRfRnVsbF9CSVQsCisJCS5zcGVlZAkJPSBTUEVFRF81NjAwMCwKKwl9LAorCXsKKwkJLm1hc2sJCT0gTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzU2R0JBU0VfUjQsCisJCS5tYXNrX2V0aHRvb2wJPSBFVEhUT09MX0xJTktfTU9ERV81NjAwMGJhc2VTUjRfRnVsbF9CSVQsCisJCS5zcGVlZAkJPSBTUEVFRF81NjAwMCwKKwl9LAorCXsKKwkJLm1hc2sJCT0gTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzU2R0JBU0VfUjQsCisJCS5tYXNrX2V0aHRvb2wJPSBFVEhUT09MX0xJTktfTU9ERV81NjAwMGJhc2VMUjRfRnVsbF9CSVQsCisJCS5zcGVlZAkJPSBTUEVFRF81NjAwMCwKKwl9LAorCXsKKwkJLm1hc2sJCT0gTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzEwMEdCQVNFX0NSNCwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzEwMDAwMGJhc2VDUjRfRnVsbF9CSVQsCisJCS5zcGVlZAkJPSBTUEVFRF8xMDAwMDAsCisJfSwKKwl7CisJCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMDBHQkFTRV9TUjQsCisJCS5tYXNrX2V0aHRvb2wJPSBFVEhUT09MX0xJTktfTU9ERV8xMDAwMDBiYXNlU1I0X0Z1bGxfQklULAorCQkuc3BlZWQJCT0gU1BFRURfMTAwMDAwLAorCX0sCisJeworCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTAwR0JBU0VfS1I0LAorCQkubWFza19ldGh0b29sCT0gRVRIVE9PTF9MSU5LX01PREVfMTAwMDAwYmFzZUtSNF9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzEwMDAwMCwKKwl9LAorCXsKKwkJLm1hc2sJCT0gTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzEwMEdCQVNFX0xSNF9FUjQsCisJCS5tYXNrX2V0aHRvb2wJPSBFVEhUT09MX0xJTktfTU9ERV8xMDAwMDBiYXNlTFI0X0VSNF9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzEwMDAwMCwKIAl9LAogfTsKIAogI2RlZmluZSBNTFhTV19TUF9QT1JUX0xJTktfTU9ERV9MRU4gQVJSQVlfU0laRShtbHhzd19zcF9wb3J0X2xpbmtfbW9kZSkKIAotc3RhdGljIHUzMiBtbHhzd19zcF9mcm9tX3B0eXNfc3VwcG9ydGVkX3BvcnQodTMyIHB0eXNfZXRoX3Byb3RvKQorc3RhdGljIHZvaWQKK21seHN3X3NwX2Zyb21fcHR5c19zdXBwb3J0ZWRfcG9ydCh1MzIgcHR5c19ldGhfcHJvdG8sCisJCQkJICBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQogewogCWlmIChwdHlzX2V0aF9wcm90byAmIChNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTBHQkFTRV9DUiB8CiAJCQkgICAgICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTBHQkFTRV9TUiB8CkBAIC0xNzM3LDQzICsxODUzLDI5IEBACiAJCQkgICAgICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfNDBHQkFTRV9TUjQgfAogCQkJICAgICAgTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzEwMEdCQVNFX1NSNCB8CiAJCQkgICAgICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfU0dNSUkpKQotCQlyZXR1cm4gU1VQUE9SVEVEX0ZJQlJFOworCQlldGh0b29sX2xpbmtfa3NldHRpbmdzX2FkZF9saW5rX21vZGUoY21kLCBzdXBwb3J0ZWQsIEZJQlJFKTsKIAogCWlmIChwdHlzX2V0aF9wcm90byAmIChNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTBHQkFTRV9LUiB8CiAJCQkgICAgICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTBHQkFTRV9LWDQgfAogCQkJICAgICAgTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzQwR0JBU0VfS1I0IHwKIAkJCSAgICAgIE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMDBHQkFTRV9LUjQgfAogCQkJICAgICAgTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzEwMDBCQVNFX0tYKSkKLQkJcmV0dXJuIFNVUFBPUlRFRF9CYWNrcGxhbmU7Ci0JcmV0dXJuIDA7CisJCWV0aHRvb2xfbGlua19rc2V0dGluZ3NfYWRkX2xpbmtfbW9kZShjbWQsIHN1cHBvcnRlZCwgQmFja3BsYW5lKTsKIH0KIAotc3RhdGljIHUzMiBtbHhzd19zcF9mcm9tX3B0eXNfc3VwcG9ydGVkX2xpbmsodTMyIHB0eXNfZXRoX3Byb3RvKQorc3RhdGljIHZvaWQgbWx4c3dfc3BfZnJvbV9wdHlzX2xpbmsodTMyIHB0eXNfZXRoX3Byb3RvLCB1bnNpZ25lZCBsb25nICptb2RlKQogewotCXUzMiBtb2RlcyA9IDA7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTUxYU1dfU1BfUE9SVF9MSU5LX01PREVfTEVOOyBpKyspIHsKIAkJaWYgKHB0eXNfZXRoX3Byb3RvICYgbWx4c3dfc3BfcG9ydF9saW5rX21vZGVbaV0ubWFzaykKLQkJCW1vZGVzIHw9IG1seHN3X3NwX3BvcnRfbGlua19tb2RlW2ldLnN1cHBvcnRlZDsKKwkJCV9fc2V0X2JpdChtbHhzd19zcF9wb3J0X2xpbmtfbW9kZVtpXS5tYXNrX2V0aHRvb2wsCisJCQkJICBtb2RlKTsKIAl9Ci0JcmV0dXJuIG1vZGVzOwotfQotCi1zdGF0aWMgdTMyIG1seHN3X3NwX2Zyb21fcHR5c19hZHZlcnRfbGluayh1MzIgcHR5c19ldGhfcHJvdG8pCi17Ci0JdTMyIG1vZGVzID0gMDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBNTFhTV19TUF9QT1JUX0xJTktfTU9ERV9MRU47IGkrKykgewotCQlpZiAocHR5c19ldGhfcHJvdG8gJiBtbHhzd19zcF9wb3J0X2xpbmtfbW9kZVtpXS5tYXNrKQotCQkJbW9kZXMgfD0gbWx4c3dfc3BfcG9ydF9saW5rX21vZGVbaV0uYWR2ZXJ0aXNlZDsKLQl9Ci0JcmV0dXJuIG1vZGVzOwogfQogCiBzdGF0aWMgdm9pZCBtbHhzd19zcF9mcm9tX3B0eXNfc3BlZWRfZHVwbGV4KGJvb2wgY2Fycmllcl9vaywgdTMyIHB0eXNfZXRoX3Byb3RvLAotCQkJCQkgICAgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCisJCQkJCSAgICBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQogewogCXUzMiBzcGVlZCA9IFNQRUVEX1VOS05PV047CiAJdTggZHVwbGV4ID0gRFVQTEVYX1VOS05PV047CkBAIC0xNzkwLDggKzE4OTIsOCBAQAogCQl9CiAJfQogb3V0OgotCWV0aHRvb2xfY21kX3NwZWVkX3NldChjbWQsIHNwZWVkKTsKLQljbWQtPmR1cGxleCA9IGR1cGxleDsKKwljbWQtPmJhc2Uuc3BlZWQgPSBzcGVlZDsKKwljbWQtPmJhc2UuZHVwbGV4ID0gZHVwbGV4OwogfQogCiBzdGF0aWMgdTggbWx4c3dfc3BfcG9ydF9jb25uZWN0b3JfcG9ydCh1MzIgcHR5c19ldGhfcHJvdG8pCkBAIC0xODE2LDQ5ICsxOTE4LDE1IEBACiAJcmV0dXJuIFBPUlRfT1RIRVI7CiB9CiAKLXN0YXRpYyBpbnQgbWx4c3dfc3BfcG9ydF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKLXsKLQlzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IG1seHN3X3NwICptbHhzd19zcCA9IG1seHN3X3NwX3BvcnQtPm1seHN3X3NwOwotCWNoYXIgcHR5c19wbFtNTFhTV19SRUdfUFRZU19MRU5dOwotCXUzMiBldGhfcHJvdG9fY2FwOwotCXUzMiBldGhfcHJvdG9fYWRtaW47Ci0JdTMyIGV0aF9wcm90b19vcGVyOwotCWludCBlcnI7Ci0KLQltbHhzd19yZWdfcHR5c19wYWNrKHB0eXNfcGwsIG1seHN3X3NwX3BvcnQtPmxvY2FsX3BvcnQsIDApOwotCWVyciA9IG1seHN3X3JlZ19xdWVyeShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHB0eXMpLCBwdHlzX3BsKTsKLQlpZiAoZXJyKSB7Ci0JCW5ldGRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGdldCBwcm90byIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQltbHhzd19yZWdfcHR5c191bnBhY2socHR5c19wbCwgJmV0aF9wcm90b19jYXAsCi0JCQkgICAgICAmZXRoX3Byb3RvX2FkbWluLCAmZXRoX3Byb3RvX29wZXIpOwotCi0JY21kLT5zdXBwb3J0ZWQgPSBtbHhzd19zcF9mcm9tX3B0eXNfc3VwcG9ydGVkX3BvcnQoZXRoX3Byb3RvX2NhcCkgfAotCQkJIG1seHN3X3NwX2Zyb21fcHR5c19zdXBwb3J0ZWRfbGluayhldGhfcHJvdG9fY2FwKSB8Ci0JCQkgU1VQUE9SVEVEX1BhdXNlIHwgU1VQUE9SVEVEX0FzeW1fUGF1c2UgfAotCQkJIFNVUFBPUlRFRF9BdXRvbmVnOwotCWNtZC0+YWR2ZXJ0aXNpbmcgPSBtbHhzd19zcF9mcm9tX3B0eXNfYWR2ZXJ0X2xpbmsoZXRoX3Byb3RvX2FkbWluKTsKLQltbHhzd19zcF9mcm9tX3B0eXNfc3BlZWRfZHVwbGV4KG5ldGlmX2NhcnJpZXJfb2soZGV2KSwKLQkJCQkJZXRoX3Byb3RvX29wZXIsIGNtZCk7Ci0KLQlldGhfcHJvdG9fb3BlciA9IGV0aF9wcm90b19vcGVyID8gZXRoX3Byb3RvX29wZXIgOiBldGhfcHJvdG9fY2FwOwotCWNtZC0+cG9ydCA9IG1seHN3X3NwX3BvcnRfY29ubmVjdG9yX3BvcnQoZXRoX3Byb3RvX29wZXIpOwotCWNtZC0+bHBfYWR2ZXJ0aXNpbmcgPSBtbHhzd19zcF9mcm9tX3B0eXNfYWR2ZXJ0X2xpbmsoZXRoX3Byb3RvX29wZXIpOwotCi0JY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1MzIgbWx4c3dfc3BfdG9fcHR5c19hZHZlcnRfbGluayh1MzIgYWR2ZXJ0aXNpbmcpCitzdGF0aWMgdTMyCittbHhzd19zcF90b19wdHlzX2FkdmVydF9saW5rKGNvbnN0IHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCiB7CiAJdTMyIHB0eXNfcHJvdG8gPSAwOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IE1MWFNXX1NQX1BPUlRfTElOS19NT0RFX0xFTjsgaSsrKSB7Ci0JCWlmIChhZHZlcnRpc2luZyAmIG1seHN3X3NwX3BvcnRfbGlua19tb2RlW2ldLmFkdmVydGlzZWQpCisJCWlmICh0ZXN0X2JpdChtbHhzd19zcF9wb3J0X2xpbmtfbW9kZVtpXS5tYXNrX2V0aHRvb2wsCisJCQkgICAgIGNtZC0+bGlua19tb2Rlcy5hZHZlcnRpc2luZykpCiAJCQlwdHlzX3Byb3RvIHw9IG1seHN3X3NwX3BvcnRfbGlua19tb2RlW2ldLm1hc2s7CiAJfQogCXJldHVybiBwdHlzX3Byb3RvOwpAQCAtMTg4OCw2MSArMTk1NiwxMTMgQEAKIAlyZXR1cm4gcHR5c19wcm90bzsKIH0KIAotc3RhdGljIGludCBtbHhzd19zcF9wb3J0X3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgICAgIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQorc3RhdGljIHZvaWQgbWx4c3dfc3BfcG9ydF9nZXRfbGlua19zdXBwb3J0ZWQodTMyIGV0aF9wcm90b19jYXAsCisJCQkJCSAgICAgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKK3sKKwlldGh0b29sX2xpbmtfa3NldHRpbmdzX2FkZF9saW5rX21vZGUoY21kLCBzdXBwb3J0ZWQsIEFzeW1fUGF1c2UpOworCWV0aHRvb2xfbGlua19rc2V0dGluZ3NfYWRkX2xpbmtfbW9kZShjbWQsIHN1cHBvcnRlZCwgQXV0b25lZyk7CisJZXRodG9vbF9saW5rX2tzZXR0aW5nc19hZGRfbGlua19tb2RlKGNtZCwgc3VwcG9ydGVkLCBQYXVzZSk7CisKKwltbHhzd19zcF9mcm9tX3B0eXNfc3VwcG9ydGVkX3BvcnQoZXRoX3Byb3RvX2NhcCwgY21kKTsKKwltbHhzd19zcF9mcm9tX3B0eXNfbGluayhldGhfcHJvdG9fY2FwLCBjbWQtPmxpbmtfbW9kZXMuc3VwcG9ydGVkKTsKK30KKworc3RhdGljIHZvaWQgbWx4c3dfc3BfcG9ydF9nZXRfbGlua19hZHZlcnRpc2UodTMyIGV0aF9wcm90b19hZG1pbiwgYm9vbCBhdXRvbmVnLAorCQkJCQkgICAgIHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCit7CisJaWYgKCFhdXRvbmVnKQorCQlyZXR1cm47CisKKwlldGh0b29sX2xpbmtfa3NldHRpbmdzX2FkZF9saW5rX21vZGUoY21kLCBhZHZlcnRpc2luZywgQXV0b25lZyk7CisJbWx4c3dfc3BfZnJvbV9wdHlzX2xpbmsoZXRoX3Byb3RvX2FkbWluLCBjbWQtPmxpbmtfbW9kZXMuYWR2ZXJ0aXNpbmcpOworfQorCitzdGF0aWMgdm9pZAorbWx4c3dfc3BfcG9ydF9nZXRfbGlua19scF9hZHZlcnRpc2UodTMyIGV0aF9wcm90b19scCwgdTggYXV0b25lZ19zdGF0dXMsCisJCQkJICAgIHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCit7CisJaWYgKGF1dG9uZWdfc3RhdHVzICE9IE1MWFNXX1JFR19QVFlTX0FOX1NUQVRVU19PSyB8fCAhZXRoX3Byb3RvX2xwKQorCQlyZXR1cm47CisKKwlldGh0b29sX2xpbmtfa3NldHRpbmdzX2FkZF9saW5rX21vZGUoY21kLCBscF9hZHZlcnRpc2luZywgQXV0b25lZyk7CisJbWx4c3dfc3BfZnJvbV9wdHlzX2xpbmsoZXRoX3Byb3RvX2xwLCBjbWQtPmxpbmtfbW9kZXMubHBfYWR2ZXJ0aXNpbmcpOworfQorCitzdGF0aWMgaW50IG1seHN3X3NwX3BvcnRfZ2V0X2xpbmtfa3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgICBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQoreworCXUzMiBldGhfcHJvdG9fY2FwLCBldGhfcHJvdG9fYWRtaW4sIGV0aF9wcm90b19vcGVyLCBldGhfcHJvdG9fbHA7CisJc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3AgPSBtbHhzd19zcF9wb3J0LT5tbHhzd19zcDsKKwljaGFyIHB0eXNfcGxbTUxYU1dfUkVHX1BUWVNfTEVOXTsKKwl1OCBhdXRvbmVnX3N0YXR1czsKKwlib29sIGF1dG9uZWc7CisJaW50IGVycjsKKworCWF1dG9uZWcgPSBtbHhzd19zcF9wb3J0LT5saW5rLmF1dG9uZWc7CisJbWx4c3dfcmVnX3B0eXNfcGFjayhwdHlzX3BsLCBtbHhzd19zcF9wb3J0LT5sb2NhbF9wb3J0LCAwKTsKKwllcnIgPSBtbHhzd19yZWdfcXVlcnkobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhwdHlzKSwgcHR5c19wbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwltbHhzd19yZWdfcHR5c191bnBhY2socHR5c19wbCwgJmV0aF9wcm90b19jYXAsICZldGhfcHJvdG9fYWRtaW4sCisJCQkgICAgICAmZXRoX3Byb3RvX29wZXIpOworCisJbWx4c3dfc3BfcG9ydF9nZXRfbGlua19zdXBwb3J0ZWQoZXRoX3Byb3RvX2NhcCwgY21kKTsKKworCW1seHN3X3NwX3BvcnRfZ2V0X2xpbmtfYWR2ZXJ0aXNlKGV0aF9wcm90b19hZG1pbiwgYXV0b25lZywgY21kKTsKKworCWV0aF9wcm90b19scCA9IG1seHN3X3JlZ19wdHlzX2V0aF9wcm90b19scF9hZHZlcnRpc2VfZ2V0KHB0eXNfcGwpOworCWF1dG9uZWdfc3RhdHVzID0gbWx4c3dfcmVnX3B0eXNfYW5fc3RhdHVzX2dldChwdHlzX3BsKTsKKwltbHhzd19zcF9wb3J0X2dldF9saW5rX2xwX2FkdmVydGlzZShldGhfcHJvdG9fbHAsIGF1dG9uZWdfc3RhdHVzLCBjbWQpOworCisJY21kLT5iYXNlLmF1dG9uZWcgPSBhdXRvbmVnID8gQVVUT05FR19FTkFCTEUgOiBBVVRPTkVHX0RJU0FCTEU7CisJY21kLT5iYXNlLnBvcnQgPSBtbHhzd19zcF9wb3J0X2Nvbm5lY3Rvcl9wb3J0KGV0aF9wcm90b19vcGVyKTsKKwltbHhzd19zcF9mcm9tX3B0eXNfc3BlZWRfZHVwbGV4KG5ldGlmX2NhcnJpZXJfb2soZGV2KSwgZXRoX3Byb3RvX29wZXIsCisJCQkJCWNtZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbWx4c3dfc3BfcG9ydF9zZXRfbGlua19rc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgY29uc3Qgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKIHsKIAlzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG1seHN3X3NwICptbHhzd19zcCA9IG1seHN3X3NwX3BvcnQtPm1seHN3X3NwOwogCWNoYXIgcHR5c19wbFtNTFhTV19SRUdfUFRZU19MRU5dOwotCXUzMiBzcGVlZDsKLQl1MzIgZXRoX3Byb3RvX25ldzsKLQl1MzIgZXRoX3Byb3RvX2NhcDsKLQl1MzIgZXRoX3Byb3RvX2FkbWluOworCXUzMiBldGhfcHJvdG9fY2FwLCBldGhfcHJvdG9fbmV3OworCWJvb2wgYXV0b25lZzsKIAlpbnQgZXJyOwogCi0Jc3BlZWQgPSBldGh0b29sX2NtZF9zcGVlZChjbWQpOwotCi0JZXRoX3Byb3RvX25ldyA9IGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSA/Ci0JCW1seHN3X3NwX3RvX3B0eXNfYWR2ZXJ0X2xpbmsoY21kLT5hZHZlcnRpc2luZykgOgotCQltbHhzd19zcF90b19wdHlzX3NwZWVkKHNwZWVkKTsKLQogCW1seHN3X3JlZ19wdHlzX3BhY2socHR5c19wbCwgbWx4c3dfc3BfcG9ydC0+bG9jYWxfcG9ydCwgMCk7CiAJZXJyID0gbWx4c3dfcmVnX3F1ZXJ5KG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcocHR5cyksIHB0eXNfcGwpOwotCWlmIChlcnIpIHsKLQkJbmV0ZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZ2V0IHByb3RvIik7CisJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQl9Ci0JbWx4c3dfcmVnX3B0eXNfdW5wYWNrKHB0eXNfcGwsICZldGhfcHJvdG9fY2FwLCAmZXRoX3Byb3RvX2FkbWluLCBOVUxMKTsKKwltbHhzd19yZWdfcHR5c191bnBhY2socHR5c19wbCwgJmV0aF9wcm90b19jYXAsIE5VTEwsIE5VTEwpOworCisJYXV0b25lZyA9IGNtZC0+YmFzZS5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFOworCWV0aF9wcm90b19uZXcgPSBhdXRvbmVnID8KKwkJbWx4c3dfc3BfdG9fcHR5c19hZHZlcnRfbGluayhjbWQpIDoKKwkJbWx4c3dfc3BfdG9fcHR5c19zcGVlZChjbWQtPmJhc2Uuc3BlZWQpOwogCiAJZXRoX3Byb3RvX25ldyA9IGV0aF9wcm90b19uZXcgJiBldGhfcHJvdG9fY2FwOwogCWlmICghZXRoX3Byb3RvX25ldykgewotCQluZXRkZXZfZXJyKGRldiwgIk5vdCBzdXBwb3J0ZWQgcHJvdG8gYWRtaW4gcmVxdWVzdGVkIik7CisJCW5ldGRldl9lcnIoZGV2LCAiTm8gc3VwcG9ydGVkIHNwZWVkIHJlcXVlc3RlZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoZXRoX3Byb3RvX25ldyA9PSBldGhfcHJvdG9fYWRtaW4pCi0JCXJldHVybiAwOwogCiAJbWx4c3dfcmVnX3B0eXNfcGFjayhwdHlzX3BsLCBtbHhzd19zcF9wb3J0LT5sb2NhbF9wb3J0LCBldGhfcHJvdG9fbmV3KTsKIAllcnIgPSBtbHhzd19yZWdfd3JpdGUobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhwdHlzKSwgcHR5c19wbCk7Ci0JaWYgKGVycikgewotCQluZXRkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBzZXQgcHJvdG8gYWRtaW4iKTsKKwlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCX0KIAogCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQogCQlyZXR1cm4gMDsKIAotCWVyciA9IG1seHN3X3NwX3BvcnRfYWRtaW5fc3RhdHVzX3NldChtbHhzd19zcF9wb3J0LCBmYWxzZSk7Ci0JaWYgKGVycikgewotCQluZXRkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBzZXQgYWRtaW4gc3RhdHVzIik7Ci0JCXJldHVybiBlcnI7Ci0JfQorCW1seHN3X3NwX3BvcnQtPmxpbmsuYXV0b25lZyA9IGF1dG9uZWc7CiAKLQllcnIgPSBtbHhzd19zcF9wb3J0X2FkbWluX3N0YXR1c19zZXQobWx4c3dfc3BfcG9ydCwgdHJ1ZSk7Ci0JaWYgKGVycikgewotCQluZXRkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBzZXQgYWRtaW4gc3RhdHVzIik7Ci0JCXJldHVybiBlcnI7Ci0JfQorCW1seHN3X3NwX3BvcnRfYWRtaW5fc3RhdHVzX3NldChtbHhzd19zcF9wb3J0LCBmYWxzZSk7CisJbWx4c3dfc3BfcG9ydF9hZG1pbl9zdGF0dXNfc2V0KG1seHN3X3NwX3BvcnQsIHRydWUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xOTU2LDggKzIwNzYsOCBAQAogCS5zZXRfcGh5c19pZAkJPSBtbHhzd19zcF9wb3J0X3NldF9waHlzX2lkLAogCS5nZXRfZXRodG9vbF9zdGF0cwk9IG1seHN3X3NwX3BvcnRfZ2V0X3N0YXRzLAogCS5nZXRfc3NldF9jb3VudAkJPSBtbHhzd19zcF9wb3J0X2dldF9zc2V0X2NvdW50LAotCS5nZXRfc2V0dGluZ3MJCT0gbWx4c3dfc3BfcG9ydF9nZXRfc2V0dGluZ3MsCi0JLnNldF9zZXR0aW5ncwkJPSBtbHhzd19zcF9wb3J0X3NldF9zZXR0aW5ncywKKwkuZ2V0X2xpbmtfa3NldHRpbmdzCT0gbWx4c3dfc3BfcG9ydF9nZXRfbGlua19rc2V0dGluZ3MsCisJLnNldF9saW5rX2tzZXR0aW5ncwk9IG1seHN3X3NwX3BvcnRfc2V0X2xpbmtfa3NldHRpbmdzLAogfTsKIAogc3RhdGljIGludApAQCAtMjA3Niw2ICsyMTk2LDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgbWx4c3dfc3BfcG9ydF9wdmlkX3Zwb3J0X2NyZWF0ZShzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCkKK3sKKwltbHhzd19zcF9wb3J0LT5wdmlkID0gMTsKKworCXJldHVybiBtbHhzd19zcF9wb3J0X2FkZF92aWQobWx4c3dfc3BfcG9ydC0+ZGV2LCAwLCAxKTsKK30KKworc3RhdGljIGludCBtbHhzd19zcF9wb3J0X3B2aWRfdnBvcnRfZGVzdHJveShzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCkKK3sKKwlyZXR1cm4gbWx4c3dfc3BfcG9ydF9raWxsX3ZpZChtbHhzd19zcF9wb3J0LT5kZXYsIDAsIDEpOworfQorCiBzdGF0aWMgaW50IG1seHN3X3NwX3BvcnRfY3JlYXRlKHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3AsIHU4IGxvY2FsX3BvcnQsCiAJCQkJYm9vbCBzcGxpdCwgdTggbW9kdWxlLCB1OCB3aWR0aCwgdTggbGFuZSkKIHsKQEAgLTIwOTUsNiArMjIyNyw3IEBACiAJbWx4c3dfc3BfcG9ydC0+bWFwcGluZy5tb2R1bGUgPSBtb2R1bGU7CiAJbWx4c3dfc3BfcG9ydC0+bWFwcGluZy53aWR0aCA9IHdpZHRoOwogCW1seHN3X3NwX3BvcnQtPm1hcHBpbmcubGFuZSA9IGxhbmU7CisJbWx4c3dfc3BfcG9ydC0+bGluay5hdXRvbmVnID0gMTsKIAlieXRlcyA9IERJVl9ST1VORF9VUChWTEFOX05fVklELCBCSVRTX1BFUl9CWVRFKTsKIAltbHhzd19zcF9wb3J0LT5hY3RpdmVfdmxhbnMgPSBremFsbG9jKGJ5dGVzLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1seHN3X3NwX3BvcnQtPmFjdGl2ZV92bGFucykgewpAQCAtMjExNiw5ICsyMjQ5LDI2IEBACiAJCWdvdG8gZXJyX2FsbG9jX3N0YXRzOwogCX0KIAorCW1seHN3X3NwX3BvcnQtPmh3X3N0YXRzLmNhY2hlID0KKwkJa3phbGxvYyhzaXplb2YoKm1seHN3X3NwX3BvcnQtPmh3X3N0YXRzLmNhY2hlKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW1seHN3X3NwX3BvcnQtPmh3X3N0YXRzLmNhY2hlKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2FsbG9jX2h3X3N0YXRzOworCX0KKwlJTklUX0RFTEFZRURfV09SSygmbWx4c3dfc3BfcG9ydC0+aHdfc3RhdHMudXBkYXRlX2R3LAorCQkJICAmdXBkYXRlX3N0YXRzX2NhY2hlKTsKKwogCWRldi0+bmV0ZGV2X29wcyA9ICZtbHhzd19zcF9wb3J0X25ldGRldl9vcHM7CiAJZGV2LT5ldGh0b29sX29wcyA9ICZtbHhzd19zcF9wb3J0X2V0aHRvb2xfb3BzOwogCisJZXJyID0gbWx4c3dfc3BfcG9ydF9zd2lkX3NldChtbHhzd19zcF9wb3J0LCAwKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIobWx4c3dfc3AtPmJ1c19pbmZvLT5kZXYsICJQb3J0ICVkOiBGYWlsZWQgdG8gc2V0IFNXSURcbiIsCisJCQltbHhzd19zcF9wb3J0LT5sb2NhbF9wb3J0KTsKKwkJZ290byBlcnJfcG9ydF9zd2lkX3NldDsKKwl9CisKIAllcnIgPSBtbHhzd19zcF9wb3J0X2Rldl9hZGRyX2luaXQobWx4c3dfc3BfcG9ydCk7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKG1seHN3X3NwLT5idXNfaW5mby0+ZGV2LCAiUG9ydCAlZDogVW5hYmxlIHRvIGluaXQgcG9ydCBtYWMgYWRkcmVzc1xuIiwKQEAgLTIxMzUsNyArMjI4NSw3IEBACiAJLyogRWFjaCBwYWNrZXQgbmVlZHMgdG8gaGF2ZSBhIFR4IGhlYWRlciAobWV0YWRhdGEpIG9uIHRvcCBhbGwgb3RoZXIKIAkgKiBoZWFkZXJzLgogCSAqLwotCWRldi0+aGFyZF9oZWFkZXJfbGVuICs9IE1MWFNXX1RYSERSX0xFTjsKKwlkZXYtPm5lZWRlZF9oZWFkcm9vbSA9IE1MWFNXX1RYSERSX0xFTjsKIAogCWVyciA9IG1seHN3X3NwX3BvcnRfc3lzdGVtX3BvcnRfbWFwcGluZ19zZXQobWx4c3dfc3BfcG9ydCk7CiAJaWYgKGVycikgewpAQCAtMjE0NCwxMyArMjI5NCw2IEBACiAJCWdvdG8gZXJyX3BvcnRfc3lzdGVtX3BvcnRfbWFwcGluZ19zZXQ7CiAJfQogCi0JZXJyID0gbWx4c3dfc3BfcG9ydF9zd2lkX3NldChtbHhzd19zcF9wb3J0LCAwKTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIobWx4c3dfc3AtPmJ1c19pbmZvLT5kZXYsICJQb3J0ICVkOiBGYWlsZWQgdG8gc2V0IFNXSURcbiIsCi0JCQltbHhzd19zcF9wb3J0LT5sb2NhbF9wb3J0KTsKLQkJZ290byBlcnJfcG9ydF9zd2lkX3NldDsKLQl9Ci0KIAllcnIgPSBtbHhzd19zcF9wb3J0X3NwZWVkX2J5X3dpZHRoX3NldChtbHhzd19zcF9wb3J0LCB3aWR0aCk7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKG1seHN3X3NwLT5idXNfaW5mby0+ZGV2LCAiUG9ydCAlZDogRmFpbGVkIHRvIGVuYWJsZSBzcGVlZHNcbiIsCkBAIC0yMTkxLDcgKzIzMzQsMTUgQEAKIAkJZ290byBlcnJfcG9ydF9kY2JfaW5pdDsKIAl9CiAKKwllcnIgPSBtbHhzd19zcF9wb3J0X3B2aWRfdnBvcnRfY3JlYXRlKG1seHN3X3NwX3BvcnQpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihtbHhzd19zcC0+YnVzX2luZm8tPmRldiwgIlBvcnQgJWQ6IEZhaWxlZCB0byBjcmVhdGUgUFZJRCB2UG9ydFxuIiwKKwkJCW1seHN3X3NwX3BvcnQtPmxvY2FsX3BvcnQpOworCQlnb3RvIGVycl9wb3J0X3B2aWRfdnBvcnRfY3JlYXRlOworCX0KKwogCW1seHN3X3NwX3BvcnRfc3dpdGNoZGV2X2luaXQobWx4c3dfc3BfcG9ydCk7CisJbWx4c3dfc3AtPnBvcnRzW2xvY2FsX3BvcnRdID0gbWx4c3dfc3BfcG9ydDsKIAllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIobWx4c3dfc3AtPmJ1c19pbmZvLT5kZXYsICJQb3J0ICVkOiBGYWlsZWQgdG8gcmVnaXN0ZXIgbmV0ZGV2XG4iLApAQCAtMjIwOCwyNyArMjM1OSwyOSBAQAogCQlnb3RvIGVycl9jb3JlX3BvcnRfaW5pdDsKIAl9CiAKLQllcnIgPSBtbHhzd19zcF9wb3J0X3ZsYW5faW5pdChtbHhzd19zcF9wb3J0KTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9wb3J0X3ZsYW5faW5pdDsKLQotCW1seHN3X3NwLT5wb3J0c1tsb2NhbF9wb3J0XSA9IG1seHN3X3NwX3BvcnQ7CisJbWx4c3dfY29yZV9zY2hlZHVsZV9kdygmbWx4c3dfc3BfcG9ydC0+aHdfc3RhdHMudXBkYXRlX2R3LCAwKTsKIAlyZXR1cm4gMDsKIAotZXJyX3BvcnRfdmxhbl9pbml0OgotCW1seHN3X2NvcmVfcG9ydF9maW5pKCZtbHhzd19zcF9wb3J0LT5jb3JlX3BvcnQpOwogZXJyX2NvcmVfcG9ydF9pbml0OgogCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CiBlcnJfcmVnaXN0ZXJfbmV0ZGV2OgorCW1seHN3X3NwLT5wb3J0c1tsb2NhbF9wb3J0XSA9IE5VTEw7CisJbWx4c3dfc3BfcG9ydF9zd2l0Y2hkZXZfZmluaShtbHhzd19zcF9wb3J0KTsKKwltbHhzd19zcF9wb3J0X3B2aWRfdnBvcnRfZGVzdHJveShtbHhzd19zcF9wb3J0KTsKK2Vycl9wb3J0X3B2aWRfdnBvcnRfY3JlYXRlOgorCW1seHN3X3NwX3BvcnRfZGNiX2ZpbmkobWx4c3dfc3BfcG9ydCk7CiBlcnJfcG9ydF9kY2JfaW5pdDoKIGVycl9wb3J0X2V0c19pbml0OgogZXJyX3BvcnRfYnVmZmVyc19pbml0OgogZXJyX3BvcnRfYWRtaW5fc3RhdHVzX3NldDoKIGVycl9wb3J0X210dV9zZXQ6CiBlcnJfcG9ydF9zcGVlZF9ieV93aWR0aF9zZXQ6Ci1lcnJfcG9ydF9zd2lkX3NldDoKIGVycl9wb3J0X3N5c3RlbV9wb3J0X21hcHBpbmdfc2V0OgogZXJyX2Rldl9hZGRyX2luaXQ6CisJbWx4c3dfc3BfcG9ydF9zd2lkX3NldChtbHhzd19zcF9wb3J0LCBNTFhTV19QT1JUX1NXSURfRElTQUJMRURfUE9SVCk7CitlcnJfcG9ydF9zd2lkX3NldDoKKwlrZnJlZShtbHhzd19zcF9wb3J0LT5od19zdGF0cy5jYWNoZSk7CitlcnJfYWxsb2NfaHdfc3RhdHM6CiAJZnJlZV9wZXJjcHUobWx4c3dfc3BfcG9ydC0+cGNwdV9zdGF0cyk7CiBlcnJfYWxsb2Nfc3RhdHM6CiAJa2ZyZWUobWx4c3dfc3BfcG9ydC0+dW50YWdnZWRfdmxhbnMpOwpAQCAtMjI0NSwxNSArMjM5OCwxNyBAQAogCiAJaWYgKCFtbHhzd19zcF9wb3J0KQogCQlyZXR1cm47Ci0JbWx4c3dfc3AtPnBvcnRzW2xvY2FsX3BvcnRdID0gTlVMTDsKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJm1seHN3X3NwX3BvcnQtPmh3X3N0YXRzLnVwZGF0ZV9kdyk7CiAJbWx4c3dfY29yZV9wb3J0X2ZpbmkoJm1seHN3X3NwX3BvcnQtPmNvcmVfcG9ydCk7CiAJdW5yZWdpc3Rlcl9uZXRkZXYobWx4c3dfc3BfcG9ydC0+ZGV2KTsgLyogVGhpcyBjYWxscyBuZG9fc3RvcCAqLwotCW1seHN3X3NwX3BvcnRfZGNiX2ZpbmkobWx4c3dfc3BfcG9ydCk7Ci0JbWx4c3dfc3BfcG9ydF9raWxsX3ZpZChtbHhzd19zcF9wb3J0LT5kZXYsIDAsIDEpOworCW1seHN3X3NwLT5wb3J0c1tsb2NhbF9wb3J0XSA9IE5VTEw7CiAJbWx4c3dfc3BfcG9ydF9zd2l0Y2hkZXZfZmluaShtbHhzd19zcF9wb3J0KTsKKwltbHhzd19zcF9wb3J0X3B2aWRfdnBvcnRfZGVzdHJveShtbHhzd19zcF9wb3J0KTsKKwltbHhzd19zcF9wb3J0X2RjYl9maW5pKG1seHN3X3NwX3BvcnQpOwogCW1seHN3X3NwX3BvcnRfc3dpZF9zZXQobWx4c3dfc3BfcG9ydCwgTUxYU1dfUE9SVF9TV0lEX0RJU0FCTEVEX1BPUlQpOwogCW1seHN3X3NwX3BvcnRfbW9kdWxlX3VubWFwKG1seHN3X3NwLCBtbHhzd19zcF9wb3J0LT5sb2NhbF9wb3J0KTsKIAlmcmVlX3BlcmNwdShtbHhzd19zcF9wb3J0LT5wY3B1X3N0YXRzKTsKKwlrZnJlZShtbHhzd19zcF9wb3J0LT5od19zdGF0cy5jYWNoZSk7CiAJa2ZyZWUobWx4c3dfc3BfcG9ydC0+dW50YWdnZWRfdmxhbnMpOwogCWtmcmVlKG1seHN3X3NwX3BvcnQtPmFjdGl2ZV92bGFucyk7CiAJV0FSTl9PTl9PTkNFKCFsaXN0X2VtcHR5KCZtbHhzd19zcF9wb3J0LT52cG9ydHNfbGlzdCkpOwpAQCAtMjU3NywxMDMgKzI3MzIsNDcgQEAKIAluZXRpZl9yZWNlaXZlX3NrYihza2IpOwogfQogCitzdGF0aWMgdm9pZCBtbHhzd19zcF9yeF9saXN0ZW5lcl9tYXJrX2Z1bmMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggbG9jYWxfcG9ydCwKKwkJCQkJICAgdm9pZCAqcHJpdikKK3sKKwlza2ItPm9mZmxvYWRfZndkX21hcmsgPSAxOworCXJldHVybiBtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jKHNrYiwgbG9jYWxfcG9ydCwgcHJpdik7Cit9CisKKyNkZWZpbmUgTUxYU1dfU1BfUlhMKF9mdW5jLCBfdHJhcF9pZCwgX2FjdGlvbikJCQlcCisJewkJCQkJCQlcCisJCS5mdW5jID0gX2Z1bmMsCQkJCQlcCisJCS5sb2NhbF9wb3J0ID0gTUxYU1dfUE9SVF9ET05UX0NBUkUsCQlcCisJCS50cmFwX2lkID0gTUxYU1dfVFJBUF9JRF8jI190cmFwX2lkLAkJXAorCQkuYWN0aW9uID0gTUxYU1dfUkVHX0hQS1RfQUNUSU9OXyMjX2FjdGlvbiwJXAorCX0KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBtbHhzd19yeF9saXN0ZW5lciBtbHhzd19zcF9yeF9saXN0ZW5lcltdID0gewotCXsKLQkJLmZ1bmMgPSBtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLAotCQkubG9jYWxfcG9ydCA9IE1MWFNXX1BPUlRfRE9OVF9DQVJFLAotCQkudHJhcF9pZCA9IE1MWFNXX1RSQVBfSURfRkRCX01DLAotCX0sCisJTUxYU1dfU1BfUlhMKG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsIEZEQl9NQywgVFJBUF9UT19DUFUpLAogCS8qIFRyYXBzIGZvciBzcGVjaWZpYyBMMiBwYWNrZXQgdHlwZXMsIG5vdCB0cmFwcGVkIGFzIEZEQiBNQyAqLwotCXsKLQkJLmZ1bmMgPSBtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLAotCQkubG9jYWxfcG9ydCA9IE1MWFNXX1BPUlRfRE9OVF9DQVJFLAotCQkudHJhcF9pZCA9IE1MWFNXX1RSQVBfSURfU1RQLAotCX0sCi0JewotCQkuZnVuYyA9IG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsCi0JCS5sb2NhbF9wb3J0ID0gTUxYU1dfUE9SVF9ET05UX0NBUkUsCi0JCS50cmFwX2lkID0gTUxYU1dfVFJBUF9JRF9MQUNQLAotCX0sCi0JewotCQkuZnVuYyA9IG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsCi0JCS5sb2NhbF9wb3J0ID0gTUxYU1dfUE9SVF9ET05UX0NBUkUsCi0JCS50cmFwX2lkID0gTUxYU1dfVFJBUF9JRF9FQVBPTCwKLQl9LAotCXsKLQkJLmZ1bmMgPSBtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLAotCQkubG9jYWxfcG9ydCA9IE1MWFNXX1BPUlRfRE9OVF9DQVJFLAotCQkudHJhcF9pZCA9IE1MWFNXX1RSQVBfSURfTExEUCwKLQl9LAotCXsKLQkJLmZ1bmMgPSBtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLAotCQkubG9jYWxfcG9ydCA9IE1MWFNXX1BPUlRfRE9OVF9DQVJFLAotCQkudHJhcF9pZCA9IE1MWFNXX1RSQVBfSURfTU1SUCwKLQl9LAotCXsKLQkJLmZ1bmMgPSBtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLAotCQkubG9jYWxfcG9ydCA9IE1MWFNXX1BPUlRfRE9OVF9DQVJFLAotCQkudHJhcF9pZCA9IE1MWFNXX1RSQVBfSURfTVZSUCwKLQl9LAotCXsKLQkJLmZ1bmMgPSBtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLAotCQkubG9jYWxfcG9ydCA9IE1MWFNXX1BPUlRfRE9OVF9DQVJFLAotCQkudHJhcF9pZCA9IE1MWFNXX1RSQVBfSURfUlBWU1QsCi0JfSwKLQl7Ci0JCS5mdW5jID0gbWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywKLQkJLmxvY2FsX3BvcnQgPSBNTFhTV19QT1JUX0RPTlRfQ0FSRSwKLQkJLnRyYXBfaWQgPSBNTFhTV19UUkFQX0lEX0RIQ1AsCi0JfSwKLQl7Ci0JCS5mdW5jID0gbWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywKLQkJLmxvY2FsX3BvcnQgPSBNTFhTV19QT1JUX0RPTlRfQ0FSRSwKLQkJLnRyYXBfaWQgPSBNTFhTV19UUkFQX0lEX0lHTVBfUVVFUlksCi0JfSwKLQl7Ci0JCS5mdW5jID0gbWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywKLQkJLmxvY2FsX3BvcnQgPSBNTFhTV19QT1JUX0RPTlRfQ0FSRSwKLQkJLnRyYXBfaWQgPSBNTFhTV19UUkFQX0lEX0lHTVBfVjFfUkVQT1JULAotCX0sCi0JewotCQkuZnVuYyA9IG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsCi0JCS5sb2NhbF9wb3J0ID0gTUxYU1dfUE9SVF9ET05UX0NBUkUsCi0JCS50cmFwX2lkID0gTUxYU1dfVFJBUF9JRF9JR01QX1YyX1JFUE9SVCwKLQl9LAotCXsKLQkJLmZ1bmMgPSBtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLAotCQkubG9jYWxfcG9ydCA9IE1MWFNXX1BPUlRfRE9OVF9DQVJFLAotCQkudHJhcF9pZCA9IE1MWFNXX1RSQVBfSURfSUdNUF9WMl9MRUFWRSwKLQl9LAotCXsKLQkJLmZ1bmMgPSBtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLAotCQkubG9jYWxfcG9ydCA9IE1MWFNXX1BPUlRfRE9OVF9DQVJFLAotCQkudHJhcF9pZCA9IE1MWFNXX1RSQVBfSURfSUdNUF9WM19SRVBPUlQsCi0JfSwKLQl7Ci0JCS5mdW5jID0gbWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywKLQkJLmxvY2FsX3BvcnQgPSBNTFhTV19QT1JUX0RPTlRfQ0FSRSwKLQkJLnRyYXBfaWQgPSBNTFhTV19UUkFQX0lEX0FSUEJDLAotCX0sCi0JewotCQkuZnVuYyA9IG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsCi0JCS5sb2NhbF9wb3J0ID0gTUxYU1dfUE9SVF9ET05UX0NBUkUsCi0JCS50cmFwX2lkID0gTUxYU1dfVFJBUF9JRF9BUlBVQywKLQl9LAotCXsKLQkJLmZ1bmMgPSBtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLAotCQkubG9jYWxfcG9ydCA9IE1MWFNXX1BPUlRfRE9OVF9DQVJFLAotCQkudHJhcF9pZCA9IE1MWFNXX1RSQVBfSURfSVAyTUUsCi0JfSwKLQl7Ci0JCS5mdW5jID0gbWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywKLQkJLmxvY2FsX3BvcnQgPSBNTFhTV19QT1JUX0RPTlRfQ0FSRSwKLQkJLnRyYXBfaWQgPSBNTFhTV19UUkFQX0lEX1JUUl9JTkdSRVNTMCwKLQl9LAotCXsKLQkJLmZ1bmMgPSBtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLAotCQkubG9jYWxfcG9ydCA9IE1MWFNXX1BPUlRfRE9OVF9DQVJFLAotCQkudHJhcF9pZCA9IE1MWFNXX1RSQVBfSURfSE9TVF9NSVNTX0lQVjQsCi0JfSwKKwlNTFhTV19TUF9SWEwobWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywgU1RQLCBUUkFQX1RPX0NQVSksCisJTUxYU1dfU1BfUlhMKG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsIExBQ1AsIFRSQVBfVE9fQ1BVKSwKKwlNTFhTV19TUF9SWEwobWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywgRUFQT0wsIFRSQVBfVE9fQ1BVKSwKKwlNTFhTV19TUF9SWEwobWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywgTExEUCwgVFJBUF9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLCBNTVJQLCBUUkFQX1RPX0NQVSksCisJTUxYU1dfU1BfUlhMKG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsIE1WUlAsIFRSQVBfVE9fQ1BVKSwKKwlNTFhTV19TUF9SWEwobWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywgUlBWU1QsIFRSQVBfVE9fQ1BVKSwKKwlNTFhTV19TUF9SWEwobWx4c3dfc3BfcnhfbGlzdGVuZXJfbWFya19mdW5jLCBESENQLCBNSVJST1JfVE9fQ1BVKSwKKwlNTFhTV19TUF9SWEwobWx4c3dfc3BfcnhfbGlzdGVuZXJfbWFya19mdW5jLCBJR01QX1FVRVJZLCBNSVJST1JfVE9fQ1BVKSwKKwlNTFhTV19TUF9SWEwobWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywgSUdNUF9WMV9SRVBPUlQsIFRSQVBfVE9fQ1BVKSwKKwlNTFhTV19TUF9SWEwobWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywgSUdNUF9WMl9SRVBPUlQsIFRSQVBfVE9fQ1BVKSwKKwlNTFhTV19TUF9SWEwobWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywgSUdNUF9WMl9MRUFWRSwgVFJBUF9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLCBJR01QX1YzX1JFUE9SVCwgVFJBUF9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9tYXJrX2Z1bmMsIEFSUEJDLCBNSVJST1JfVE9fQ1BVKSwKKwlNTFhTV19TUF9SWEwobWx4c3dfc3BfcnhfbGlzdGVuZXJfbWFya19mdW5jLCBBUlBVQywgTUlSUk9SX1RPX0NQVSksCisJLyogTDMgdHJhcHMgKi8KKwlNTFhTV19TUF9SWEwobWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywgTVRVRVJST1IsIFRSQVBfVE9fQ1BVKSwKKwlNTFhTV19TUF9SWEwobWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywgVFRMRVJST1IsIFRSQVBfVE9fQ1BVKSwKKwlNTFhTV19TUF9SWEwobWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywgTEJFUlJPUiwgVFJBUF9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9tYXJrX2Z1bmMsIE9TUEYsIFRSQVBfVE9fQ1BVKSwKKwlNTFhTV19TUF9SWEwobWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywgSVAyTUUsIFRSQVBfVE9fQ1BVKSwKKwlNTFhTV19TUF9SWEwobWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywgUlRSX0lOR1JFU1MwLCBUUkFQX1RPX0NQVSksCisJTUxYU1dfU1BfUlhMKG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsIEhPU1RfTUlTU19JUFY0LCBUUkFQX1RPX0NQVSksCiB9OwogCiBzdGF0aWMgaW50IG1seHN3X3NwX3RyYXBzX2luaXQoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCkKQEAgLTI3MDAsNyArMjc5OSw3IEBACiAJCWlmIChlcnIpCiAJCQlnb3RvIGVycl9yeF9saXN0ZW5lcl9yZWdpc3RlcjsKIAotCQltbHhzd19yZWdfaHBrdF9wYWNrKGhwa3RfcGwsIE1MWFNXX1JFR19IUEtUX0FDVElPTl9UUkFQX1RPX0NQVSwKKwkJbWx4c3dfcmVnX2hwa3RfcGFjayhocGt0X3BsLCBtbHhzd19zcF9yeF9saXN0ZW5lcltpXS5hY3Rpb24sCiAJCQkJICAgIG1seHN3X3NwX3J4X2xpc3RlbmVyW2ldLnRyYXBfaWQpOwogCQllcnIgPSBtbHhzd19yZWdfd3JpdGUobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhocGt0KSwgaHBrdF9wbCk7CiAJCWlmIChlcnIpCkBAIC0yNzg4LDcgKzI4ODcsOSBAQAogCiBzdGF0aWMgaW50IG1seHN3X3NwX2xhZ19pbml0KHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3ApCiB7CisJc3RydWN0IG1seHN3X3Jlc291cmNlcyAqcmVzb3VyY2VzOwogCWNoYXIgc2xjcl9wbFtNTFhTV19SRUdfU0xDUl9MRU5dOworCWludCBlcnI7CiAKIAltbHhzd19yZWdfc2xjcl9wYWNrKHNsY3JfcGwsIE1MWFNXX1JFR19TTENSX0xBR19IQVNIX1NNQUMgfAogCQkJCSAgICAgTUxYU1dfUkVHX1NMQ1JfTEFHX0hBU0hfRE1BQyB8CkBAIC0yNzk5LDcgKzI5MDAsMjYgQEAKIAkJCQkgICAgIE1MWFNXX1JFR19TTENSX0xBR19IQVNIX1NQT1JUIHwKIAkJCQkgICAgIE1MWFNXX1JFR19TTENSX0xBR19IQVNIX0RQT1JUIHwKIAkJCQkgICAgIE1MWFNXX1JFR19TTENSX0xBR19IQVNIX0lQUFJPVE8pOwotCXJldHVybiBtbHhzd19yZWdfd3JpdGUobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhzbGNyKSwgc2xjcl9wbCk7CisJZXJyID0gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcoc2xjciksIHNsY3JfcGwpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXNvdXJjZXMgPSBtbHhzd19jb3JlX3Jlc291cmNlc19nZXQobWx4c3dfc3AtPmNvcmUpOworCWlmICghKHJlc291cmNlcy0+bWF4X2xhZ192YWxpZCAmJiByZXNvdXJjZXMtPm1heF9wb3J0c19pbl9sYWdfdmFsaWQpKQorCQlyZXR1cm4gLUVJTzsKKworCW1seHN3X3NwLT5sYWdzID0ga2NhbGxvYyhyZXNvdXJjZXMtPm1heF9sYWcsCisJCQkJIHNpemVvZihzdHJ1Y3QgbWx4c3dfc3BfdXBwZXIpLAorCQkJCSBHRlBfS0VSTkVMKTsKKwlpZiAoIW1seHN3X3NwLT5sYWdzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtbHhzd19zcF9sYWdfZmluaShzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwKQoreworCWtmcmVlKG1seHN3X3NwLT5sYWdzKTsKIH0KIAogc3RhdGljIGludCBtbHhzd19zcF9pbml0KHN0cnVjdCBtbHhzd19jb3JlICptbHhzd19jb3JlLApAQCAtMjg4Myw2ICszMDAzLDcgQEAKIGVycl9yb3V0ZXJfaW5pdDoKIAltbHhzd19zcF9zd2l0Y2hkZXZfZmluaShtbHhzd19zcCk7CiBlcnJfc3dpdGNoZGV2X2luaXQ6CisJbWx4c3dfc3BfbGFnX2ZpbmkobWx4c3dfc3ApOwogZXJyX2xhZ19pbml0OgogCW1seHN3X3NwX2J1ZmZlcnNfZmluaShtbHhzd19zcCk7CiBlcnJfYnVmZmVyc19pbml0OgpAQCAtMjg5NiwzOCArMzAxNywyNiBAQAogc3RhdGljIHZvaWQgbWx4c3dfc3BfZmluaShzdHJ1Y3QgbWx4c3dfY29yZSAqbWx4c3dfY29yZSkKIHsKIAlzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwID0gbWx4c3dfY29yZV9kcml2ZXJfcHJpdihtbHhzd19jb3JlKTsKLQlpbnQgaTsKIAogCW1seHN3X3NwX3BvcnRzX3JlbW92ZShtbHhzd19zcCk7CiAJbWx4c3dfc3Bfc3Bhbl9maW5pKG1seHN3X3NwKTsKIAltbHhzd19zcF9yb3V0ZXJfZmluaShtbHhzd19zcCk7CiAJbWx4c3dfc3Bfc3dpdGNoZGV2X2ZpbmkobWx4c3dfc3ApOworCW1seHN3X3NwX2xhZ19maW5pKG1seHN3X3NwKTsKIAltbHhzd19zcF9idWZmZXJzX2ZpbmkobWx4c3dfc3ApOwogCW1seHN3X3NwX3RyYXBzX2ZpbmkobWx4c3dfc3ApOwogCW1seHN3X3NwX2V2ZW50X3VucmVnaXN0ZXIobWx4c3dfc3AsIE1MWFNXX1RSQVBfSURfUFVERSk7CiAJV0FSTl9PTighbGlzdF9lbXB0eSgmbWx4c3dfc3AtPnZmaWRzLmxpc3QpKTsKIAlXQVJOX09OKCFsaXN0X2VtcHR5KCZtbHhzd19zcC0+ZmlkcykpOwotCWZvciAoaSA9IDA7IGkgPCBNTFhTV19TUF9SSUZfTUFYOyBpKyspCi0JCVdBUk5fT05fT05DRShtbHhzd19zcC0+cmlmc1tpXSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbWx4c3dfY29uZmlnX3Byb2ZpbGUgbWx4c3dfc3BfY29uZmlnX3Byb2ZpbGUgPSB7CiAJLnVzZWRfbWF4X3ZlcGFfY2hhbm5lbHMJCT0gMSwKIAkubWF4X3ZlcGFfY2hhbm5lbHMJCT0gMCwKLQkudXNlZF9tYXhfbGFnCQkJPSAxLAotCS5tYXhfbGFnCQkJPSBNTFhTV19TUF9MQUdfTUFYLAotCS51c2VkX21heF9wb3J0X3Blcl9sYWcJCT0gMSwKLQkubWF4X3BvcnRfcGVyX2xhZwkJPSBNTFhTV19TUF9QT1JUX1BFUl9MQUdfTUFYLAogCS51c2VkX21heF9taWQJCQk9IDEsCiAJLm1heF9taWQJCQk9IE1MWFNXX1NQX01JRF9NQVgsCiAJLnVzZWRfbWF4X3BndAkJCT0gMSwKIAkubWF4X3BndAkJCT0gMCwKLQkudXNlZF9tYXhfc3lzdGVtX3BvcnQJCT0gMSwKLQkubWF4X3N5c3RlbV9wb3J0CQk9IDY0LAotCS51c2VkX21heF92bGFuX2dyb3VwcwkJPSAxLAotCS5tYXhfdmxhbl9ncm91cHMJCT0gMTI3LAotCS51c2VkX21heF9yZWdpb25zCQk9IDEsCi0JLm1heF9yZWdpb25zCQkJPSA0MDAsCiAJLnVzZWRfZmxvb2RfdGFibGVzCQk9IDEsCiAJLnVzZWRfZmxvb2RfbW9kZQkJPSAxLAogCS5mbG9vZF9tb2RlCQkJPSAzLApAQCAtMjkzOSwxMCArMzA0OCwxMSBAQAogCS5tYXhfaWJfbWMJCQk9IDAsCiAJLnVzZWRfbWF4X3BrZXkJCQk9IDEsCiAJLm1heF9wa2V5CQkJPSAwLAotCS51c2VkX2t2ZF9zaXplcwkJCT0gMSwKKwkudXNlZF9rdmRfc3BsaXRfZGF0YQkJPSAxLAorCS5rdmRfaGFzaF9ncmFudWxhcml0eQkJPSBNTFhTV19TUF9LVkRfR1JBTlVMQVJJVFksCisJLmt2ZF9oYXNoX3NpbmdsZV9wYXJ0cwkJPSAyLAorCS5rdmRfaGFzaF9kb3VibGVfcGFydHMJCT0gMSwKIAkua3ZkX2xpbmVhcl9zaXplCQk9IE1MWFNXX1NQX0tWRF9MSU5FQVJfU0laRSwKLQkua3ZkX2hhc2hfc2luZ2xlX3NpemUJCT0gTUxYU1dfU1BfS1ZEX0hBU0hfU0lOR0xFX1NJWkUsCi0JLmt2ZF9oYXNoX2RvdWJsZV9zaXplCQk9IE1MWFNXX1NQX0tWRF9IQVNIX0RPVUJMRV9TSVpFLAogCS5zd2lkX2NvbmZpZwkJCT0gewogCQl7CiAJCQkudXNlZF90eXBlCT0gMSwKQEAgLTMwNTksMTMgKzMxNjksMTUgQEAKIAogc3RhdGljIGludCBtbHhzd19zcF9hdmFpbF9yaWZfZ2V0KHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3ApCiB7CisJc3RydWN0IG1seHN3X3Jlc291cmNlcyAqcmVzb3VyY2VzOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE1MWFNXX1NQX1JJRl9NQVg7IGkrKykKKwlyZXNvdXJjZXMgPSBtbHhzd19jb3JlX3Jlc291cmNlc19nZXQobWx4c3dfc3AtPmNvcmUpOworCWZvciAoaSA9IDA7IGkgPCByZXNvdXJjZXMtPm1heF9yaWY7IGkrKykKIAkJaWYgKCFtbHhzd19zcC0+cmlmc1tpXSkKIAkJCXJldHVybiBpOwogCi0JcmV0dXJuIE1MWFNXX1NQX1JJRl9NQVg7CisJcmV0dXJuIE1MWFNXX1NQX0lOVkFMSURfUklGOwogfQogCiBzdGF0aWMgdm9pZCBtbHhzd19zcF92cG9ydF9yaWZfc3BfYXR0cl9nZXQoc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3Zwb3J0LApAQCAtMzE0NSw3ICszMjU3LDcgQEAKIAlpbnQgZXJyOwogCiAJcmlmID0gbWx4c3dfc3BfYXZhaWxfcmlmX2dldChtbHhzd19zcCk7Ci0JaWYgKHJpZiA9PSBNTFhTV19TUF9SSUZfTUFYKQorCWlmIChyaWYgPT0gTUxYU1dfU1BfSU5WQUxJRF9SSUYpCiAJCXJldHVybiBFUlJfUFRSKC1FUkFOR0UpOwogCiAJZXJyID0gbWx4c3dfc3BfdnBvcnRfcmlmX3NwX29wKG1seHN3X3NwX3Zwb3J0LCBsM19kZXYsIHJpZiwgdHJ1ZSk7CkBAIC0zMzExLDYgKzM0MjMsMzkgQEAKIAlyZXR1cm4gbWx4c3dfc3BfZmlkX2ZpbmQobWx4c3dfc3AsIGZpZCk7CiB9CiAKK3N0YXRpYyBlbnVtIG1seHN3X2Zsb29kX3RhYmxlX3R5cGUgbWx4c3dfc3BfZmxvb2RfdGFibGVfdHlwZV9nZXQodTE2IGZpZCkKK3sKKwlyZXR1cm4gbWx4c3dfc3BfZmlkX2lzX3ZmaWQoZmlkKSA/IE1MWFNXX1JFR19TRkdDX1RBQkxFX1RZUEVfRklEIDoKKwkgICAgICAgTUxYU1dfUkVHX1NGR0NfVEFCTEVfVFlQRV9GSURfT0ZGRVNUOworfQorCitzdGF0aWMgdTE2IG1seHN3X3NwX2Zsb29kX3RhYmxlX2luZGV4X2dldCh1MTYgZmlkKQoreworCXJldHVybiBtbHhzd19zcF9maWRfaXNfdmZpZChmaWQpID8gbWx4c3dfc3BfZmlkX3RvX3ZmaWQoZmlkKSA6IGZpZDsKK30KKworc3RhdGljIGludCBtbHhzd19zcF9yb3V0ZXJfcG9ydF9mbG9vZF9zZXQoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCwgdTE2IGZpZCwKKwkJCQkJICBib29sIHNldCkKK3sKKwllbnVtIG1seHN3X2Zsb29kX3RhYmxlX3R5cGUgdGFibGVfdHlwZTsKKwljaGFyICpzZnRyX3BsOworCXUxNiBpbmRleDsKKwlpbnQgZXJyOworCisJc2Z0cl9wbCA9IGttYWxsb2MoTUxYU1dfUkVHX1NGVFJfTEVOLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNmdHJfcGwpCisJCXJldHVybiAtRU5PTUVNOworCisJdGFibGVfdHlwZSA9IG1seHN3X3NwX2Zsb29kX3RhYmxlX3R5cGVfZ2V0KGZpZCk7CisJaW5kZXggPSBtbHhzd19zcF9mbG9vZF90YWJsZV9pbmRleF9nZXQoZmlkKTsKKwltbHhzd19yZWdfc2Z0cl9wYWNrKHNmdHJfcGwsIE1MWFNXX1NQX0ZMT09EX1RBQkxFX0JNLCBpbmRleCwgdGFibGVfdHlwZSwKKwkJCSAgICAxLCBNTFhTV19QT1JUX1JPVVRFUl9QT1JULCBzZXQpOworCWVyciA9IG1seHN3X3JlZ193cml0ZShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHNmdHIpLCBzZnRyX3BsKTsKKworCWtmcmVlKHNmdHJfcGwpOworCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyBlbnVtIG1seHN3X3JlZ19yaXRyX2lmX3R5cGUgbWx4c3dfc3BfcmlmX3R5cGVfZ2V0KHUxNiBmaWQpCiB7CiAJaWYgKG1seHN3X3NwX2ZpZF9pc192ZmlkKGZpZCkpCkBAIC0zMzQ0LDEyICszNDg5LDE2IEBACiAJaW50IGVycjsKIAogCXJpZiA9IG1seHN3X3NwX2F2YWlsX3JpZl9nZXQobWx4c3dfc3ApOwotCWlmIChyaWYgPT0gTUxYU1dfU1BfUklGX01BWCkKKwlpZiAocmlmID09IE1MWFNXX1NQX0lOVkFMSURfUklGKQogCQlyZXR1cm4gLUVSQU5HRTsKIAorCWVyciA9IG1seHN3X3NwX3JvdXRlcl9wb3J0X2Zsb29kX3NldChtbHhzd19zcCwgZi0+ZmlkLCB0cnVlKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCiAJZXJyID0gbWx4c3dfc3BfcmlmX2JyaWRnZV9vcChtbHhzd19zcCwgbDNfZGV2LCBmLT5maWQsIHJpZiwgdHJ1ZSk7CiAJaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwkJZ290byBlcnJfcmlmX2JyaWRnZV9vcDsKIAogCWVyciA9IG1seHN3X3NwX3JpZl9mZGJfb3AobWx4c3dfc3AsIGwzX2Rldi0+ZGV2X2FkZHIsIGYtPmZpZCwgdHJ1ZSk7CiAJaWYgKGVycikKQEAgLTMzNzIsNiArMzUyMSw4IEBACiAJbWx4c3dfc3BfcmlmX2ZkYl9vcChtbHhzd19zcCwgbDNfZGV2LT5kZXZfYWRkciwgZi0+ZmlkLCBmYWxzZSk7CiBlcnJfcmlmX2ZkYl9vcDoKIAltbHhzd19zcF9yaWZfYnJpZGdlX29wKG1seHN3X3NwLCBsM19kZXYsIGYtPmZpZCwgcmlmLCBmYWxzZSk7CitlcnJfcmlmX2JyaWRnZV9vcDoKKwltbHhzd19zcF9yb3V0ZXJfcG9ydF9mbG9vZF9zZXQobWx4c3dfc3AsIGYtPmZpZCwgZmFsc2UpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTMzOTEsNiArMzU0Miw4IEBACiAKIAltbHhzd19zcF9yaWZfYnJpZGdlX29wKG1seHN3X3NwLCBsM19kZXYsIGYtPmZpZCwgcmlmLCBmYWxzZSk7CiAKKwltbHhzd19zcF9yb3V0ZXJfcG9ydF9mbG9vZF9zZXQobWx4c3dfc3AsIGYtPmZpZCwgZmFsc2UpOworCiAJbmV0ZGV2X2RiZyhsM19kZXYsICJSSUY9JWQgZGVzdHJveWVkXG4iLCByaWYpOwogfQogCkBAIC0zNTQzLDEyICszNjk2LDE0IEBACiAJc3RydWN0IG1seHN3X3NwICptbHhzd19zcCA9IG1seHN3X3NwX3BvcnQtPm1seHN3X3NwOwogCXU4IGxvY2FsX3BvcnQgPSBtbHhzd19zcF9wb3J0LT5sb2NhbF9wb3J0OwogCXUxNiBsYWdfaWQgPSBtbHhzd19zcF9wb3J0LT5sYWdfaWQ7CisJc3RydWN0IG1seHN3X3Jlc291cmNlcyAqcmVzb3VyY2VzOwogCWludCBpLCBjb3VudCA9IDA7CiAKIAlpZiAoIW1seHN3X3NwX3BvcnQtPmxhZ2dlZCkKIAkJcmV0dXJuIHRydWU7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUxYU1dfU1BfUE9SVF9QRVJfTEFHX01BWDsgaSsrKSB7CisJcmVzb3VyY2VzID0gbWx4c3dfY29yZV9yZXNvdXJjZXNfZ2V0KG1seHN3X3NwLT5jb3JlKTsKKwlmb3IgKGkgPSAwOyBpIDwgcmVzb3VyY2VzLT5tYXhfcG9ydHNfaW5fbGFnOyBpKyspIHsKIAkJc3RydWN0IG1seHN3X3NwX3BvcnQgKmxhZ19wb3J0OwogCiAJCWxhZ19wb3J0ID0gbWx4c3dfc3BfcG9ydF9sYWdnZWRfZ2V0KG1seHN3X3NwLCBsYWdfaWQsIGkpOwpAQCAtMzc1NCwxMSArMzkwOSwxMyBAQAogCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmxhZ19kZXYsCiAJCQkJICB1MTYgKnBfbGFnX2lkKQogeworCXN0cnVjdCBtbHhzd19yZXNvdXJjZXMgKnJlc291cmNlczsKIAlzdHJ1Y3QgbWx4c3dfc3BfdXBwZXIgKmxhZzsKIAlpbnQgZnJlZV9sYWdfaWQgPSAtMTsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBNTFhTV19TUF9MQUdfTUFYOyBpKyspIHsKKwlyZXNvdXJjZXMgPSBtbHhzd19jb3JlX3Jlc291cmNlc19nZXQobWx4c3dfc3AtPmNvcmUpOworCWZvciAoaSA9IDA7IGkgPCByZXNvdXJjZXMtPm1heF9sYWc7IGkrKykgewogCQlsYWcgPSBtbHhzd19zcF9sYWdfZ2V0KG1seHN3X3NwLCBpKTsKIAkJaWYgKGxhZy0+cmVmX2NvdW50KSB7CiAJCQlpZiAobGFnLT5kZXYgPT0gbGFnX2RldikgewpAQCAtMzc5Miw5ICszOTQ5LDExIEBACiBzdGF0aWMgaW50IG1seHN3X3NwX3BvcnRfbGFnX2luZGV4X2dldChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwLAogCQkJCSAgICAgICB1MTYgbGFnX2lkLCB1OCAqcF9wb3J0X2luZGV4KQogeworCXN0cnVjdCBtbHhzd19yZXNvdXJjZXMgKnJlc291cmNlczsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBNTFhTV19TUF9QT1JUX1BFUl9MQUdfTUFYOyBpKyspIHsKKwlyZXNvdXJjZXMgPSBtbHhzd19jb3JlX3Jlc291cmNlc19nZXQobWx4c3dfc3AtPmNvcmUpOworCWZvciAoaSA9IDA7IGkgPCByZXNvdXJjZXMtPm1heF9wb3J0c19pbl9sYWc7IGkrKykgewogCQlpZiAoIW1seHN3X3NwX3BvcnRfbGFnZ2VkX2dldChtbHhzd19zcCwgbGFnX2lkLCBpKSkgewogCQkJKnBfcG9ydF9pbmRleCA9IGk7CiAJCQlyZXR1cm4gMDsKQEAgLTQ0ODcsMTggKzQ2NDYsMjYgQEAKIAkucHJpb3JpdHkgPSAxMCwJLyogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIEZJQiBub3RpZmllciBibG9jayAqLwogfTsKIAorc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBtbHhzd19zcF9yb3V0ZXJfbmV0ZXZlbnRfbmIgX19yZWFkX21vc3RseSA9IHsKKwkubm90aWZpZXJfY2FsbCA9IG1seHN3X3NwX3JvdXRlcl9uZXRldmVudF9ldmVudCwKK307CisKIHN0YXRpYyBpbnQgX19pbml0IG1seHN3X3NwX21vZHVsZV9pbml0KHZvaWQpCiB7CiAJaW50IGVycjsKIAogCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmbWx4c3dfc3BfbmV0ZGV2aWNlX25iKTsKIAlyZWdpc3Rlcl9pbmV0YWRkcl9ub3RpZmllcigmbWx4c3dfc3BfaW5ldGFkZHJfbmIpOworCXJlZ2lzdGVyX25ldGV2ZW50X25vdGlmaWVyKCZtbHhzd19zcF9yb3V0ZXJfbmV0ZXZlbnRfbmIpOworCiAJZXJyID0gbWx4c3dfY29yZV9kcml2ZXJfcmVnaXN0ZXIoJm1seHN3X3NwX2RyaXZlcik7CiAJaWYgKGVycikKIAkJZ290byBlcnJfY29yZV9kcml2ZXJfcmVnaXN0ZXI7CiAJcmV0dXJuIDA7CiAKIGVycl9jb3JlX2RyaXZlcl9yZWdpc3RlcjoKKwl1bnJlZ2lzdGVyX25ldGV2ZW50X25vdGlmaWVyKCZtbHhzd19zcF9yb3V0ZXJfbmV0ZXZlbnRfbmIpOworCXVucmVnaXN0ZXJfaW5ldGFkZHJfbm90aWZpZXIoJm1seHN3X3NwX2luZXRhZGRyX25iKTsKIAl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmbWx4c3dfc3BfbmV0ZGV2aWNlX25iKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtNDUwNiw2ICs0NjczLDcgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBtbHhzd19zcF9tb2R1bGVfZXhpdCh2b2lkKQogewogCW1seHN3X2NvcmVfZHJpdmVyX3VucmVnaXN0ZXIoJm1seHN3X3NwX2RyaXZlcik7CisJdW5yZWdpc3Rlcl9uZXRldmVudF9ub3RpZmllcigmbWx4c3dfc3Bfcm91dGVyX25ldGV2ZW50X25iKTsKIAl1bnJlZ2lzdGVyX2luZXRhZGRyX25vdGlmaWVyKCZtbHhzd19zcF9pbmV0YWRkcl9uYik7CiAJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJm1seHN3X3NwX25ldGRldmljZV9uYik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9zcGVjdHJ1bS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3BlY3RydW0uaAppbmRleCBmNjlhYTM3Li45YjIyODYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9zcGVjdHJ1bS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3NwZWN0cnVtLmgKQEAgLTQ1LDcgKzQ1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGNibmwuaD4KICNpbmNsdWRlIDxsaW51eC9pbjYuaD4KLSNpbmNsdWRlIDxuZXQvc3dpdGNoZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KIAogI2luY2x1ZGUgInBvcnQuaCIKICNpbmNsdWRlICJjb3JlLmgiCkBAIC01NCwxMCArNTQsNyBAQAogI2RlZmluZSBNTFhTV19TUF9WRklEX01BWCA2NjU2CS8qIEJyaWRnZWQgVkxBTiBpbnRlcmZhY2VzICovCiAKICNkZWZpbmUgTUxYU1dfU1BfUkZJRF9CQVNFIDE1MzYwCi0jZGVmaW5lIE1MWFNXX1NQX1JJRl9NQVggODAwCi0KLSNkZWZpbmUgTUxYU1dfU1BfTEFHX01BWCA2NAotI2RlZmluZSBNTFhTV19TUF9QT1JUX1BFUl9MQUdfTUFYIDE2CisjZGVmaW5lIE1MWFNXX1NQX0lOVkFMSURfUklGIDB4ZmZmZgogCiAjZGVmaW5lIE1MWFNXX1NQX01JRF9NQVggNzAwMAogCkBAIC02Nyw4ICs2NCw2IEBACiAjZGVmaW5lIE1MWFNXX1NQX0xQTV9UUkVFX01BWCAyMgogI2RlZmluZSBNTFhTV19TUF9MUE1fVFJFRV9DT1VOVCAoTUxYU1dfU1BfTFBNX1RSRUVfTUFYIC0gTUxYU1dfU1BfTFBNX1RSRUVfTUlOKQogCi0jZGVmaW5lIE1MWFNXX1NQX1ZJUlRVQUxfUk9VVEVSX01BWCAyNTYKLQogI2RlZmluZSBNTFhTV19TUF9QT1JUX0JBU0VfU1BFRUQgMjUwMDAJLyogTWIvcyAqLwogCiAjZGVmaW5lIE1MWFNXX1NQX0JZVEVTX1BFUl9DRUxMIDk2CkBAIC03Nyw4ICs3Miw3IEBACiAjZGVmaW5lIE1MWFNXX1NQX0NFTExTX1RPX0JZVEVTKGMpIChjICogTUxYU1dfU1BfQllURVNfUEVSX0NFTEwpCiAKICNkZWZpbmUgTUxYU1dfU1BfS1ZEX0xJTkVBUl9TSVpFIDY1NTM2IC8qIGVudHJpZXMgKi8KLSNkZWZpbmUgTUxYU1dfU1BfS1ZEX0hBU0hfU0lOR0xFX1NJWkUgMTYzODQwIC8qIGVudHJpZXMgKi8KLSNkZWZpbmUgTUxYU1dfU1BfS1ZEX0hBU0hfRE9VQkxFX1NJWkUgMzI3NjggLyogZW50cmllcyAqLworI2RlZmluZSBNTFhTV19TUF9LVkRfR1JBTlVMQVJJVFkgMTI4CiAKIC8qIE1heGltdW0gZGVsYXkgYnVmZmVyIG5lZWRlZCBpbiBjYXNlIG9mIFBBVVNFIGZyYW1lcywgaW4gY2VsbHMuCiAgKiBBc3N1bWVzIDEwMG0gY2FibGUgYW5kIG1heGltdW0gTVRVLgpAQCAtMjUzLDcgKzI0Nyw3IEBACiAKIHN0cnVjdCBtbHhzd19zcF9yb3V0ZXIgewogCXN0cnVjdCBtbHhzd19zcF9scG1fdHJlZSBscG1fdHJlZXNbTUxYU1dfU1BfTFBNX1RSRUVfQ09VTlRdOwotCXN0cnVjdCBtbHhzd19zcF92ciB2cnNbTUxYU1dfU1BfVklSVFVBTF9ST1VURVJfTUFYXTsKKwlzdHJ1Y3QgbWx4c3dfc3BfdnIgKnZyczsKIAlzdHJ1Y3Qgcmhhc2h0YWJsZSBuZWlnaF9odDsKIAlzdHJ1Y3QgewogCQlzdHJ1Y3QgZGVsYXllZF93b3JrIGR3OwpAQCAtMjYzLDYgKzI1Nyw3IEBACiAjZGVmaW5lIE1MWFNXX1NQX1VOUkVTT0xWRURfTkhfUFJPQkVfSU5URVJWQUwgNTAwMCAvKiBtcyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbmV4dGhvcF9ncm91cF9saXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgbmV4dGhvcF9uZWlnaHNfbGlzdDsKKwlib29sIGFib3J0ZWQ7CiB9OwogCiBzdHJ1Y3QgbWx4c3dfc3AgewpAQCAtMjc1LDcgKzI3MCw3IEBACiAJCURFQ0xBUkVfQklUTUFQKG1hcHBlZCwgTUxYU1dfU1BfTUlEX01BWCk7CiAJfSBicl9taWRzOwogCXN0cnVjdCBsaXN0X2hlYWQgZmlkczsJLyogVkxBTi1hd2FyZSBicmlkZ2UgRklEcyAqLwotCXN0cnVjdCBtbHhzd19zcF9yaWYgKnJpZnNbTUxYU1dfU1BfUklGX01BWF07CisJc3RydWN0IG1seHN3X3NwX3JpZiAqKnJpZnM7CiAJc3RydWN0IG1seHN3X3NwX3BvcnQgKipwb3J0czsKIAlzdHJ1Y3QgbWx4c3dfY29yZSAqY29yZTsKIAljb25zdCBzdHJ1Y3QgbWx4c3dfYnVzX2luZm8gKmJ1c19pbmZvOwpAQCAtMjkwLDcgKzI4NSw3IEBACiAjZGVmaW5lIE1MWFNXX1NQX0RFRkFVTFRfQUdFSU5HX1RJTUUgMzAwCiAJdTMyIGFnZWluZ190aW1lOwogCXN0cnVjdCBtbHhzd19zcF91cHBlciBtYXN0ZXJfYnJpZGdlOwotCXN0cnVjdCBtbHhzd19zcF91cHBlciBsYWdzW01MWFNXX1NQX0xBR19NQVhdOworCXN0cnVjdCBtbHhzd19zcF91cHBlciAqbGFnczsKIAl1OCBwb3J0X3RvX21vZHVsZVtNTFhTV19QT1JUX01BWF9QT1JUU107CiAJc3RydWN0IG1seHN3X3NwX3NiIHNiOwogCXN0cnVjdCBtbHhzd19zcF9yb3V0ZXIgcm91dGVyOwpAQCAtMzAyLDYgKzI5Nyw3IEBACiAJCXN0cnVjdCBtbHhzd19zcF9zcGFuX2VudHJ5ICplbnRyaWVzOwogCQlpbnQgZW50cmllc19jb3VudDsKIAl9IHNwYW47CisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGZpYl9uYjsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG1seHN3X3NwX3VwcGVyICoKQEAgLTM0MSw3ICszMzcsOCBAQAogCX0gdnBvcnQ7CiAJc3RydWN0IHsKIAkJdTggdHhfcGF1c2U6MSwKLQkJICAgcnhfcGF1c2U6MTsKKwkJICAgcnhfcGF1c2U6MSwKKwkJICAgYXV0b25lZzoxOwogCX0gbGluazsKIAlzdHJ1Y3QgewogCQlzdHJ1Y3QgaWVlZV9ldHMgKmV0czsKQEAgLTM2MCw2ICszNTcsMTEgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIHZwb3J0c19saXN0OwogCS8qIFRDIGhhbmRsZXMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIG1hbGxfdGNfbGlzdDsKKwlzdHJ1Y3QgeworCQkjZGVmaW5lIE1MWFNXX0hXX1NUQVRTX1VQREFURV9USU1FIEhaCisJCXN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqY2FjaGU7CisJCXN0cnVjdCBkZWxheWVkX3dvcmsgdXBkYXRlX2R3OworCX0gaHdfc3RhdHM7CiB9OwogCiBzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydF9sb3dlcl9kZXZfaG9sZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKQEAgLTQ3Nyw5ICs0NzksMTIgQEAKIG1seHN3X3NwX3JpZl9maW5kX2J5X2Rldihjb25zdCBzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwLAogCQkJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IG1seHN3X3Jlc291cmNlcyAqcmVzb3VyY2VzOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE1MWFNXX1NQX1JJRl9NQVg7IGkrKykKKwlyZXNvdXJjZXMgPSBtbHhzd19jb3JlX3Jlc291cmNlc19nZXQobWx4c3dfc3AtPmNvcmUpOworCisJZm9yIChpID0gMDsgaSA8IHJlc291cmNlcy0+bWF4X3JpZjsgaSsrKQogCQlpZiAobWx4c3dfc3AtPnJpZnNbaV0gJiYgbWx4c3dfc3AtPnJpZnNbaV0tPmRldiA9PSBkZXYpCiAJCQlyZXR1cm4gbWx4c3dfc3AtPnJpZnNbaV07CiAKQEAgLTUzNiw4ICs1NDEsNiBAQAogCQkJCSB1MTYgdmlkKTsKIGludCBtbHhzd19zcF9wb3J0X3ZsYW5fc2V0KHN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0LCB1MTYgdmlkX2JlZ2luLAogCQkJICAgdTE2IHZpZF9lbmQsIGJvb2wgaXNfbWVtYmVyLCBib29sIHVudGFnZ2VkKTsKLWludCBtbHhzd19zcF9wb3J0X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX19iZTE2IF9fYWx3YXlzX3VudXNlZCBwcm90bywKLQkJCSAgdTE2IHZpZCk7CiBpbnQgbWx4c3dfc3BfdnBvcnRfZmxvb2Rfc2V0KHN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF92cG9ydCwgdTE2IGZpZCwKIAkJCSAgICAgYm9vbCBzZXQpOwogdm9pZCBtbHhzd19zcF9wb3J0X2FjdGl2ZV92bGFuc19kZWwoc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQpOwpAQCAtNTYwLDYgKzU2Myw5IEBACiBpbnQgbWx4c3dfc3BfcG9ydF9ldHNfbWF4cmF0ZV9zZXQoc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQsCiAJCQkJICBlbnVtIG1seHN3X3JlZ19xZWVjX2hyIGhyLCB1OCBpbmRleCwKIAkJCQkgIHU4IG5leHRfaW5kZXgsIHUzMiBtYXhyYXRlKTsKK2ludCBfX21seHN3X3NwX3BvcnRfdmlkX2xlYXJuaW5nX3NldChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCwKKwkJCQkgICAgIHUxNiB2aWRfYmVnaW4sIHUxNiB2aWRfZW5kLAorCQkJCSAgICAgYm9vbCBsZWFybl9lbmFibGUpOwogCiAjaWZkZWYgQ09ORklHX01MWFNXX1NQRUNUUlVNX0RDQgogCkBAIC01ODAsMTUgKzU4NiwxMiBAQAogCiBpbnQgbWx4c3dfc3Bfcm91dGVyX2luaXQoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCk7CiB2b2lkIG1seHN3X3NwX3JvdXRlcl9maW5pKHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3ApOwotaW50IG1seHN3X3NwX3JvdXRlcl9maWI0X2FkZChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCwKLQkJCSAgICAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfaXB2NF9maWIgKmZpYjQsCi0JCQkgICAgIHN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zKTsKLWludCBtbHhzd19zcF9yb3V0ZXJfZmliNF9kZWwoc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX2lwdjRfZmliICpmaWI0KTsKIGludCBtbHhzd19zcF9yb3V0ZXJfbmVpZ2hfY29uc3RydWN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJICAgIHN0cnVjdCBuZWlnaGJvdXIgKm4pOwogdm9pZCBtbHhzd19zcF9yb3V0ZXJfbmVpZ2hfZGVzdHJveShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgIHN0cnVjdCBuZWlnaGJvdXIgKm4pOworaW50IG1seHN3X3NwX3JvdXRlcl9uZXRldmVudF9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnVudXNlZCwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpOwogCiBpbnQgbWx4c3dfc3Bfa3ZkbF9hbGxvYyhzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwLCB1bnNpZ25lZCBpbnQgZW50cnlfY291bnQpOwogdm9pZCBtbHhzd19zcF9rdmRsX2ZyZWUoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCwgaW50IGVudHJ5X2luZGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3NwZWN0cnVtX2J1ZmZlcnMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3NwZWN0cnVtX2J1ZmZlcnMuYwppbmRleCAwNzRjZGRhLi5iY2FlZDhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9zcGVjdHJ1bV9idWZmZXJzLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3BlY3RydW1fYnVmZmVycy5jCkBAIC0zMzAsNyArMzMwLDcgQEAKIAlNTFhTV19TUF9DUFVfUE9SVF9TQl9DTSwKIAlNTFhTV19TUF9DUFVfUE9SVF9TQl9DTSwKIAlNTFhTV19TUF9DUFVfUE9SVF9TQl9DTSwKLQlNTFhTV19TUF9DUFVfUE9SVF9TQl9DTSwKKwlNTFhTV19TUF9TQl9DTShNTFhTV19TUF9CWVRFU19UT19DRUxMUygxMDAwMCksIDAsIDApLAogCU1MWFNXX1NQX0NQVV9QT1JUX1NCX0NNLAogCU1MWFNXX1NQX0NQVV9QT1JUX1NCX0NNLAogCU1MWFNXX1NQX0NQVV9QT1JUX1NCX0NNLApAQCAtNTk1LDkgKzU5NSw5IEBACiAJZW51bSBtbHhzd19yZWdfc2J4eF9kaXIgZGlyID0gZGlyX2dldChwb29sX2luZGV4KTsKIAlzdHJ1Y3QgbWx4c3dfc3Bfc2JfcHIgKnByID0gbWx4c3dfc3Bfc2JfcHJfZ2V0KG1seHN3X3NwLCBwb29sLCBkaXIpOwogCi0JcG9vbF9pbmZvLT5wb29sX3R5cGUgPSBkaXI7CisJcG9vbF9pbmZvLT5wb29sX3R5cGUgPSAoZW51bSBkZXZsaW5rX3NiX3Bvb2xfdHlwZSkgZGlyOwogCXBvb2xfaW5mby0+c2l6ZSA9IE1MWFNXX1NQX0NFTExTX1RPX0JZVEVTKHByLT5zaXplKTsKLQlwb29sX2luZm8tPnRocmVzaG9sZF90eXBlID0gcHItPm1vZGU7CisJcG9vbF9pbmZvLT50aHJlc2hvbGRfdHlwZSA9IChlbnVtIGRldmxpbmtfc2JfdGhyZXNob2xkX3R5cGUpIHByLT5tb2RlOwogCXJldHVybiAwOwogfQogCkBAIC02MDgsOSArNjA4LDEwIEBACiAJc3RydWN0IG1seHN3X3NwICptbHhzd19zcCA9IG1seHN3X2NvcmVfZHJpdmVyX3ByaXYobWx4c3dfY29yZSk7CiAJdTggcG9vbCA9IHBvb2xfZ2V0KHBvb2xfaW5kZXgpOwogCWVudW0gbWx4c3dfcmVnX3NieHhfZGlyIGRpciA9IGRpcl9nZXQocG9vbF9pbmRleCk7Ci0JZW51bSBtbHhzd19yZWdfc2Jwcl9tb2RlIG1vZGUgPSB0aHJlc2hvbGRfdHlwZTsKIAl1MzIgcG9vbF9zaXplID0gTUxYU1dfU1BfQllURVNfVE9fQ0VMTFMoc2l6ZSk7CisJZW51bSBtbHhzd19yZWdfc2Jwcl9tb2RlIG1vZGU7CiAKKwltb2RlID0gKGVudW0gbWx4c3dfcmVnX3NicHJfbW9kZSkgdGhyZXNob2xkX3R5cGU7CiAJcmV0dXJuIG1seHN3X3NwX3NiX3ByX3dyaXRlKG1seHN3X3NwLCBwb29sLCBkaXIsIG1vZGUsIHBvb2xfc2l6ZSk7CiB9CiAKQEAgLTY5NiwxMyArNjk3LDEzIEBACiAJc3RydWN0IG1seHN3X3NwICptbHhzd19zcCA9IG1seHN3X3NwX3BvcnQtPm1seHN3X3NwOwogCXU4IGxvY2FsX3BvcnQgPSBtbHhzd19zcF9wb3J0LT5sb2NhbF9wb3J0OwogCXU4IHBnX2J1ZmYgPSB0Y19pbmRleDsKLQllbnVtIG1seHN3X3JlZ19zYnh4X2RpciBkaXIgPSBwb29sX3R5cGU7CisJZW51bSBtbHhzd19yZWdfc2J4eF9kaXIgZGlyID0gKGVudW0gbWx4c3dfcmVnX3NieHhfZGlyKSBwb29sX3R5cGU7CiAJc3RydWN0IG1seHN3X3NwX3NiX2NtICpjbSA9IG1seHN3X3NwX3NiX2NtX2dldChtbHhzd19zcCwgbG9jYWxfcG9ydCwKIAkJCQkJCSAgICAgICBwZ19idWZmLCBkaXIpOwogCiAJKnBfdGhyZXNob2xkID0gbWx4c3dfc3Bfc2JfdGhyZXNob2xkX291dChtbHhzd19zcCwgY20tPnBvb2wsIGRpciwKIAkJCQkJCSBjbS0+bWF4X2J1ZmYpOwotCSpwX3Bvb2xfaW5kZXggPSBwb29sX2luZGV4X2dldChjbS0+cG9vbCwgcG9vbF90eXBlKTsKKwkqcF9wb29sX2luZGV4ID0gcG9vbF9pbmRleF9nZXQoY20tPnBvb2wsIGRpcik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTcxNiwyMyArNzE3LDE5IEBACiAJc3RydWN0IG1seHN3X3NwICptbHhzd19zcCA9IG1seHN3X3NwX3BvcnQtPm1seHN3X3NwOwogCXU4IGxvY2FsX3BvcnQgPSBtbHhzd19zcF9wb3J0LT5sb2NhbF9wb3J0OwogCXU4IHBnX2J1ZmYgPSB0Y19pbmRleDsKLQllbnVtIG1seHN3X3JlZ19zYnh4X2RpciBkaXIgPSBwb29sX3R5cGU7Ci0JdTggcG9vbCA9IHBvb2xfaW5kZXg7CisJZW51bSBtbHhzd19yZWdfc2J4eF9kaXIgZGlyID0gKGVudW0gbWx4c3dfcmVnX3NieHhfZGlyKSBwb29sX3R5cGU7CisJdTggcG9vbCA9IHBvb2xfZ2V0KHBvb2xfaW5kZXgpOwogCXUzMiBtYXhfYnVmZjsKIAlpbnQgZXJyOwogCisJaWYgKGRpciAhPSBkaXJfZ2V0KHBvb2xfaW5kZXgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWVyciA9IG1seHN3X3NwX3NiX3RocmVzaG9sZF9pbihtbHhzd19zcCwgcG9vbCwgZGlyLAogCQkJCSAgICAgICB0aHJlc2hvbGQsICZtYXhfYnVmZik7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWlmIChwb29sX3R5cGUgPT0gREVWTElOS19TQl9QT09MX1RZUEVfRUdSRVNTKSB7Ci0JCWlmIChwb29sIDwgTUxYU1dfU1BfU0JfUE9PTF9DT1VOVCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlwb29sIC09IE1MWFNXX1NQX1NCX1BPT0xfQ09VTlQ7Ci0JfSBlbHNlIGlmIChwb29sID49IE1MWFNXX1NQX1NCX1BPT0xfQ09VTlQpIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCXJldHVybiBtbHhzd19zcF9zYl9jbV93cml0ZShtbHhzd19zcCwgbG9jYWxfcG9ydCwgcGdfYnVmZiwgZGlyLAogCQkJCSAgICAwLCBtYXhfYnVmZiwgcG9vbCk7CiB9CkBAIC05NDcsNyArOTQ0LDcgQEAKIAlzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwID0gbWx4c3dfc3BfcG9ydC0+bWx4c3dfc3A7CiAJdTggbG9jYWxfcG9ydCA9IG1seHN3X3NwX3BvcnQtPmxvY2FsX3BvcnQ7CiAJdTggcGdfYnVmZiA9IHRjX2luZGV4OwotCWVudW0gbWx4c3dfcmVnX3NieHhfZGlyIGRpciA9IHBvb2xfdHlwZTsKKwllbnVtIG1seHN3X3JlZ19zYnh4X2RpciBkaXIgPSAoZW51bSBtbHhzd19yZWdfc2J4eF9kaXIpIHBvb2xfdHlwZTsKIAlzdHJ1Y3QgbWx4c3dfc3Bfc2JfY20gKmNtID0gbWx4c3dfc3Bfc2JfY21fZ2V0KG1seHN3X3NwLCBsb2NhbF9wb3J0LAogCQkJCQkJICAgICAgIHBnX2J1ZmYsIGRpcik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3NwZWN0cnVtX2RjYi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3BlY3RydW1fZGNiLmMKaW5kZXggMDFjZmI3NS4uYjZlZDdmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3BlY3RydW1fZGNiLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3BlY3RydW1fZGNiLmMKQEAgLTM0MSw2ICszNDEsOCBAQAogCWNoYXIgcGZjY19wbFtNTFhTV19SRUdfUEZDQ19MRU5dOwogCiAJbWx4c3dfcmVnX3BmY2NfcGFjayhwZmNjX3BsLCBtbHhzd19zcF9wb3J0LT5sb2NhbF9wb3J0KTsKKwltbHhzd19yZWdfcGZjY19wcHJ4X3NldChwZmNjX3BsLCBtbHhzd19zcF9wb3J0LT5saW5rLnJ4X3BhdXNlKTsKKwltbHhzd19yZWdfcGZjY19wcHR4X3NldChwZmNjX3BsLCBtbHhzd19zcF9wb3J0LT5saW5rLnR4X3BhdXNlKTsKIAltbHhzd19yZWdfcGZjY19wcmlvX3BhY2socGZjY19wbCwgcGZjLT5wZmNfZW4pOwogCiAJcmV0dXJuIG1seHN3X3JlZ193cml0ZShtbHhzd19zcF9wb3J0LT5tbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHBmY2MpLApAQCAtMzUxLDE3ICszNTMsMTcgQEAKIAkJCQkgICAgICBzdHJ1Y3QgaWVlZV9wZmMgKnBmYykKIHsKIAlzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCA9IG5ldGRldl9wcml2KGRldik7CisJYm9vbCBwYXVzZV9lbiA9IG1seHN3X3NwX3BvcnRfaXNfcGF1c2VfZW4obWx4c3dfc3BfcG9ydCk7CiAJaW50IGVycjsKIAotCWlmICgobWx4c3dfc3BfcG9ydC0+bGluay50eF9wYXVzZSB8fCBtbHhzd19zcF9wb3J0LT5saW5rLnJ4X3BhdXNlKSAmJgotCSAgICBwZmMtPnBmY19lbikgeworCWlmIChwYXVzZV9lbiAmJiBwZmMtPnBmY19lbikgewogCQluZXRkZXZfZXJyKGRldiwgIlBBVVNFIGZyYW1lcyBhbHJlYWR5IGVuYWJsZWQgb24gcG9ydFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWVyciA9IF9fbWx4c3dfc3BfcG9ydF9oZWFkcm9vbV9zZXQobWx4c3dfc3BfcG9ydCwgZGV2LT5tdHUsCiAJCQkJCSAgIG1seHN3X3NwX3BvcnQtPmRjYi5ldHMtPnByaW9fdGMsCi0JCQkJCSAgIGZhbHNlLCBwZmMpOworCQkJCQkgICBwYXVzZV9lbiwgcGZjKTsKIAlpZiAoZXJyKSB7CiAJCW5ldGRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBwb3J0J3MgaGVhZHJvb20gZm9yIFBGQ1xuIik7CiAJCXJldHVybiBlcnI7CkBAIC0zODAsNyArMzgyLDcgQEAKIAogZXJyX3BvcnRfcGZjX3NldDoKIAlfX21seHN3X3NwX3BvcnRfaGVhZHJvb21fc2V0KG1seHN3X3NwX3BvcnQsIGRldi0+bXR1LAotCQkJCSAgICAgbWx4c3dfc3BfcG9ydC0+ZGNiLmV0cy0+cHJpb190YywgZmFsc2UsCisJCQkJICAgICBtbHhzd19zcF9wb3J0LT5kY2IuZXRzLT5wcmlvX3RjLCBwYXVzZV9lbiwKIAkJCQkgICAgIG1seHN3X3NwX3BvcnQtPmRjYi5wZmMpOwogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9zcGVjdHJ1bV9yb3V0ZXIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3NwZWN0cnVtX3JvdXRlci5jCmluZGV4IDgxNDE4ZDYuLjc4ZmM1NTdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9zcGVjdHJ1bV9yb3V0ZXIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9zcGVjdHJ1bV9yb3V0ZXIuYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPG5ldC9uZXRldmVudC5oPgogI2luY2x1ZGUgPG5ldC9uZWlnaGJvdXIuaD4KICNpbmNsdWRlIDxuZXQvYXJwLmg+CisjaW5jbHVkZSA8bmV0L2lwX2ZpYi5oPgogCiAjaW5jbHVkZSAic3BlY3RydW0uaCIKICNpbmNsdWRlICJjb3JlLmgiCkBAIC0xMDcsNiArMTA4LDcgQEAKIH0KIAogc3RydWN0IG1seHN3X3NwX2ZpYl9rZXkgeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJdW5zaWduZWQgY2hhciBhZGRyW3NpemVvZihzdHJ1Y3QgaW42X2FkZHIpXTsKIAl1bnNpZ25lZCBjaGFyIHByZWZpeF9sZW47CiB9OwpAQCAtMTIxLDE3ICsxMjMsMjAgQEAKIAogc3RydWN0IG1seHN3X3NwX2ZpYl9lbnRyeSB7CiAJc3RydWN0IHJoYXNoX2hlYWQgaHRfbm9kZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJc3RydWN0IG1seHN3X3NwX2ZpYl9rZXkga2V5OwogCWVudW0gbWx4c3dfc3BfZmliX2VudHJ5X3R5cGUgdHlwZTsKLQl1OCBhZGRlZDoxOworCXVuc2lnbmVkIGludCByZWZfY291bnQ7CiAJdTE2IHJpZjsgLyogdXNlZCBmb3IgYWN0aW9uIGxvY2FsICovCiAJc3RydWN0IG1seHN3X3NwX3ZyICp2cjsKKwlzdHJ1Y3QgZmliX2luZm8gKmZpOwogCXN0cnVjdCBsaXN0X2hlYWQgbmV4dGhvcF9ncm91cF9ub2RlOwogCXN0cnVjdCBtbHhzd19zcF9uZXh0aG9wX2dyb3VwICpuaF9ncm91cDsKIH07CiAKIHN0cnVjdCBtbHhzd19zcF9maWIgewogCXN0cnVjdCByaGFzaHRhYmxlIGh0OworCXN0cnVjdCBsaXN0X2hlYWQgZW50cnlfbGlzdDsKIAl1bnNpZ25lZCBsb25nIHByZWZpeF9yZWZfY291bnRbTUxYU1dfU1BfUFJFRklYX0NPVU5UXTsKIAlzdHJ1Y3QgbWx4c3dfc3BfcHJlZml4X3VzYWdlIHByZWZpeF91c2FnZTsKIH07CkBAIC0xNTMsNiArMTU4LDcgQEAKIAkJCQkgICAgIG1seHN3X3NwX2ZpYl9odF9wYXJhbXMpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CisJbGlzdF9hZGRfdGFpbCgmZmliX2VudHJ5LT5saXN0LCAmZmliLT5lbnRyeV9saXN0KTsKIAlpZiAoZmliLT5wcmVmaXhfcmVmX2NvdW50W3ByZWZpeF9sZW5dKysgPT0gMCkKIAkJbWx4c3dfc3BfcHJlZml4X3VzYWdlX3NldCgmZmliLT5wcmVmaXhfdXNhZ2UsIHByZWZpeF9sZW4pOwogCXJldHVybiAwOwpAQCAtMTY1LDE5ICsxNzEsMjIgQEAKIAogCWlmICgtLWZpYi0+cHJlZml4X3JlZl9jb3VudFtwcmVmaXhfbGVuXSA9PSAwKQogCQltbHhzd19zcF9wcmVmaXhfdXNhZ2VfY2xlYXIoJmZpYi0+cHJlZml4X3VzYWdlLCBwcmVmaXhfbGVuKTsKKwlsaXN0X2RlbCgmZmliX2VudHJ5LT5saXN0KTsKIAlyaGFzaHRhYmxlX3JlbW92ZV9mYXN0KCZmaWItPmh0LCAmZmliX2VudHJ5LT5odF9ub2RlLAogCQkJICAgICAgIG1seHN3X3NwX2ZpYl9odF9wYXJhbXMpOwogfQogCiBzdGF0aWMgc3RydWN0IG1seHN3X3NwX2ZpYl9lbnRyeSAqCiBtbHhzd19zcF9maWJfZW50cnlfY3JlYXRlKHN0cnVjdCBtbHhzd19zcF9maWIgKmZpYiwgY29uc3Qgdm9pZCAqYWRkciwKLQkJCSAgc2l6ZV90IGFkZHJfbGVuLCB1bnNpZ25lZCBjaGFyIHByZWZpeF9sZW4pCisJCQkgIHNpemVfdCBhZGRyX2xlbiwgdW5zaWduZWQgY2hhciBwcmVmaXhfbGVuLAorCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBtbHhzd19zcF9maWJfZW50cnkgKmZpYl9lbnRyeTsKIAogCWZpYl9lbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKCpmaWJfZW50cnkpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWZpYl9lbnRyeSkKIAkJcmV0dXJuIE5VTEw7CisJZmliX2VudHJ5LT5rZXkuZGV2ID0gZGV2OwogCW1lbWNweShmaWJfZW50cnktPmtleS5hZGRyLCBhZGRyLCBhZGRyX2xlbik7CiAJZmliX2VudHJ5LT5rZXkucHJlZml4X2xlbiA9IHByZWZpeF9sZW47CiAJcmV0dXJuIGZpYl9lbnRyeTsKQEAgLTE5MCwxMCArMTk5LDEzIEBACiAKIHN0YXRpYyBzdHJ1Y3QgbWx4c3dfc3BfZmliX2VudHJ5ICoKIG1seHN3X3NwX2ZpYl9lbnRyeV9sb29rdXAoc3RydWN0IG1seHN3X3NwX2ZpYiAqZmliLCBjb25zdCB2b2lkICphZGRyLAotCQkJICBzaXplX3QgYWRkcl9sZW4sIHVuc2lnbmVkIGNoYXIgcHJlZml4X2xlbikKKwkJCSAgc2l6ZV90IGFkZHJfbGVuLCB1bnNpZ25lZCBjaGFyIHByZWZpeF9sZW4sCisJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG1seHN3X3NwX2ZpYl9rZXkga2V5ID0ge3sgMCB9IH07CisJc3RydWN0IG1seHN3X3NwX2ZpYl9rZXkga2V5OwogCisJbWVtc2V0KCZrZXksIDAsIHNpemVvZihrZXkpKTsKKwlrZXkuZGV2ID0gZGV2OwogCW1lbWNweShrZXkuYWRkciwgYWRkciwgYWRkcl9sZW4pOwogCWtleS5wcmVmaXhfbGVuID0gcHJlZml4X2xlbjsKIAlyZXR1cm4gcmhhc2h0YWJsZV9sb29rdXBfZmFzdCgmZmliLT5odCwgJmtleSwgbWx4c3dfc3BfZmliX2h0X3BhcmFtcyk7CkBAIC0yMTAsNiArMjIyLDcgQEAKIAllcnIgPSByaGFzaHRhYmxlX2luaXQoJmZpYi0+aHQsICZtbHhzd19zcF9maWJfaHRfcGFyYW1zKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9yaGFzaHRhYmxlX2luaXQ7CisJSU5JVF9MSVNUX0hFQUQoJmZpYi0+ZW50cnlfbGlzdCk7CiAJcmV0dXJuIGZpYjsKIAogZXJyX3JoYXNodGFibGVfaW5pdDoKQEAgLTI0Niw3ICsyNTksOSBAQAogewogCWNoYXIgcmFsdGFfcGxbTUxYU1dfUkVHX1JBTFRBX0xFTl07CiAKLQltbHhzd19yZWdfcmFsdGFfcGFjayhyYWx0YV9wbCwgdHJ1ZSwgbHBtX3RyZWUtPnByb3RvLCBscG1fdHJlZS0+aWQpOworCW1seHN3X3JlZ19yYWx0YV9wYWNrKHJhbHRhX3BsLCB0cnVlLAorCQkJICAgICAoZW51bSBtbHhzd19yZWdfcmFseHhfcHJvdG9jb2wpIGxwbV90cmVlLT5wcm90bywKKwkJCSAgICAgbHBtX3RyZWUtPmlkKTsKIAlyZXR1cm4gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcocmFsdGEpLCByYWx0YV9wbCk7CiB9CiAKQEAgLTI1NSw3ICsyNzAsOSBAQAogewogCWNoYXIgcmFsdGFfcGxbTUxYU1dfUkVHX1JBTFRBX0xFTl07CiAKLQltbHhzd19yZWdfcmFsdGFfcGFjayhyYWx0YV9wbCwgZmFsc2UsIGxwbV90cmVlLT5wcm90bywgbHBtX3RyZWUtPmlkKTsKKwltbHhzd19yZWdfcmFsdGFfcGFjayhyYWx0YV9wbCwgZmFsc2UsCisJCQkgICAgIChlbnVtIG1seHN3X3JlZ19yYWx4eF9wcm90b2NvbCkgbHBtX3RyZWUtPnByb3RvLAorCQkJICAgICBscG1fdHJlZS0+aWQpOwogCXJldHVybiBtbHhzd19yZWdfd3JpdGUobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhyYWx0YSksIHJhbHRhX3BsKTsKIH0KIApAQCAtMzYyLDEwICszNzksMTIgQEAKIAogc3RhdGljIHN0cnVjdCBtbHhzd19zcF92ciAqbWx4c3dfc3BfdnJfZmluZF91bnVzZWQoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCkKIHsKKwlzdHJ1Y3QgbWx4c3dfcmVzb3VyY2VzICpyZXNvdXJjZXM7CiAJc3RydWN0IG1seHN3X3NwX3ZyICp2cjsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBNTFhTV19TUF9WSVJUVUFMX1JPVVRFUl9NQVg7IGkrKykgeworCXJlc291cmNlcyA9IG1seHN3X2NvcmVfcmVzb3VyY2VzX2dldChtbHhzd19zcC0+Y29yZSk7CisJZm9yIChpID0gMDsgaSA8IHJlc291cmNlcy0+bWF4X3ZpcnR1YWxfcm91dGVyczsgaSsrKSB7CiAJCXZyID0gJm1seHN3X3NwLT5yb3V0ZXIudnJzW2ldOwogCQlpZiAoIXZyLT51c2VkKQogCQkJcmV0dXJuIHZyOwpAQCAtMzc4LDcgKzM5Nyw5IEBACiB7CiAJY2hhciByYWx0Yl9wbFtNTFhTV19SRUdfUkFMVEJfTEVOXTsKIAotCW1seHN3X3JlZ19yYWx0Yl9wYWNrKHJhbHRiX3BsLCB2ci0+aWQsIHZyLT5wcm90bywgdnItPmxwbV90cmVlLT5pZCk7CisJbWx4c3dfcmVnX3JhbHRiX3BhY2socmFsdGJfcGwsIHZyLT5pZCwKKwkJCSAgICAgKGVudW0gbWx4c3dfcmVnX3JhbHh4X3Byb3RvY29sKSB2ci0+cHJvdG8sCisJCQkgICAgIHZyLT5scG1fdHJlZS0+aWQpOwogCXJldHVybiBtbHhzd19yZWdfd3JpdGUobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhyYWx0YiksIHJhbHRiX3BsKTsKIH0KIApAQCAtMzg4LDcgKzQwOSw4IEBACiAJY2hhciByYWx0Yl9wbFtNTFhTV19SRUdfUkFMVEJfTEVOXTsKIAogCS8qIEJpbmQgdG8gdHJlZSAwIHdoaWNoIGlzIGRlZmF1bHQgKi8KLQltbHhzd19yZWdfcmFsdGJfcGFjayhyYWx0Yl9wbCwgdnItPmlkLCB2ci0+cHJvdG8sIDApOworCW1seHN3X3JlZ19yYWx0Yl9wYWNrKHJhbHRiX3BsLCB2ci0+aWQsCisJCQkgICAgIChlbnVtIG1seHN3X3JlZ19yYWx4eF9wcm90b2NvbCkgdnItPnByb3RvLCAwKTsKIAlyZXR1cm4gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcocmFsdGIpLCByYWx0Yl9wbCk7CiB9CiAKQEAgLTQwNCwxMSArNDI2LDE0IEBACiAJCQkJCSAgICB1MzIgdGJfaWQsCiAJCQkJCSAgICBlbnVtIG1seHN3X3NwX2wzcHJvdG8gcHJvdG8pCiB7CisJc3RydWN0IG1seHN3X3Jlc291cmNlcyAqcmVzb3VyY2VzOwogCXN0cnVjdCBtbHhzd19zcF92ciAqdnI7CiAJaW50IGk7CiAKIAl0Yl9pZCA9IG1seHN3X3NwX2ZpeF90Yl9pZCh0Yl9pZCk7Ci0JZm9yIChpID0gMDsgaSA8IE1MWFNXX1NQX1ZJUlRVQUxfUk9VVEVSX01BWDsgaSsrKSB7CisKKwlyZXNvdXJjZXMgPSBtbHhzd19jb3JlX3Jlc291cmNlc19nZXQobWx4c3dfc3AtPmNvcmUpOworCWZvciAoaSA9IDA7IGkgPCByZXNvdXJjZXMtPm1heF92aXJ0dWFsX3JvdXRlcnM7IGkrKykgewogCQl2ciA9ICZtbHhzd19zcC0+cm91dGVyLnZyc1tpXTsKIAkJaWYgKHZyLT51c2VkICYmIHZyLT5wcm90byA9PSBwcm90byAmJiB2ci0+dGJfaWQgPT0gdGJfaWQpCiAJCQlyZXR1cm4gdnI7CkBAIC01NDIsMTUgKzU2NywzMyBAQAogCQkJCQkgICAmdnItPmZpYi0+cHJlZml4X3VzYWdlKTsKIH0KIAotc3RhdGljIHZvaWQgbWx4c3dfc3BfdnJzX2luaXQoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCkKK3N0YXRpYyBpbnQgbWx4c3dfc3BfdnJzX2luaXQoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCkKIHsKKwlzdHJ1Y3QgbWx4c3dfcmVzb3VyY2VzICpyZXNvdXJjZXM7CiAJc3RydWN0IG1seHN3X3NwX3ZyICp2cjsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBNTFhTV19TUF9WSVJUVUFMX1JPVVRFUl9NQVg7IGkrKykgeworCXJlc291cmNlcyA9IG1seHN3X2NvcmVfcmVzb3VyY2VzX2dldChtbHhzd19zcC0+Y29yZSk7CisJaWYgKCFyZXNvdXJjZXMtPm1heF92aXJ0dWFsX3JvdXRlcnNfdmFsaWQpCisJCXJldHVybiAtRUlPOworCisJbWx4c3dfc3AtPnJvdXRlci52cnMgPSBrY2FsbG9jKHJlc291cmNlcy0+bWF4X3ZpcnR1YWxfcm91dGVycywKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBtbHhzd19zcF92ciksCisJCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmICghbWx4c3dfc3AtPnJvdXRlci52cnMpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IHJlc291cmNlcy0+bWF4X3ZpcnR1YWxfcm91dGVyczsgaSsrKSB7CiAJCXZyID0gJm1seHN3X3NwLT5yb3V0ZXIudnJzW2ldOwogCQl2ci0+aWQgPSBpOwogCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtbHhzd19zcF92cnNfZmluaShzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwKQoreworCWtmcmVlKG1seHN3X3NwLT5yb3V0ZXIudnJzKTsKIH0KIAogc3RydWN0IG1seHN3X3NwX25laWdoX2tleSB7CkBAIC02NTcsNyArNzAwLDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JciA9IG1seHN3X3NwX3JpZl9maW5kX2J5X2RldihtbHhzd19zcCwgZGV2KTsKKwlyID0gbWx4c3dfc3BfcmlmX2ZpbmRfYnlfZGV2KG1seHN3X3NwLCBuLT5kZXYpOwogCWlmIChXQVJOX09OKCFyKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTkzOCw4ICs5ODEsOCBAQAogCW1seHN3X3NwX3BvcnRfZGV2X3B1dChtbHhzd19zcF9wb3J0KTsKIH0KIAotc3RhdGljIGludCBtbHhzd19zcF9yb3V0ZXJfbmV0ZXZlbnRfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp1bnVzZWQsCi0JCQkJCSAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQoraW50IG1seHN3X3NwX3JvdXRlcl9uZXRldmVudF9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnVudXNlZCwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCiB7CiAJc3RydWN0IG1seHN3X3NwX25laWdoX2VudHJ5ICpuZWlnaF9lbnRyeTsKIAlzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydDsKQEAgLTEwMDksMTAgKzEwNTIsNiBAQAogCXJldHVybiBOT1RJRllfRE9ORTsKIH0KIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBtbHhzd19zcF9yb3V0ZXJfbmV0ZXZlbnRfbmIgX19yZWFkX21vc3RseSA9IHsKLQkubm90aWZpZXJfY2FsbCA9IG1seHN3X3NwX3JvdXRlcl9uZXRldmVudF9ldmVudCwKLX07Ci0KIHN0YXRpYyBpbnQgbWx4c3dfc3BfbmVpZ2hfaW5pdChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwKQogewogCWludCBlcnI7CkBAIC0xMDI3LDEwICsxMDY2LDYgQEAKIAkgKi8KIAltbHhzd19zcF9yb3V0ZXJfbmVpZ2hzX3VwZGF0ZV9pbnRlcnZhbF9pbml0KG1seHN3X3NwKTsKIAotCWVyciA9IHJlZ2lzdGVyX25ldGV2ZW50X25vdGlmaWVyKCZtbHhzd19zcF9yb3V0ZXJfbmV0ZXZlbnRfbmIpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX3JlZ2lzdGVyX25ldGV2ZW50X25vdGlmaWVyOwotCiAJLyogQ3JlYXRlIHRoZSBkZWxheWVkIHdvcmtzIGZvciB0aGUgYWN0aXZpdHlfdXBkYXRlICovCiAJSU5JVF9ERUxBWUVEX1dPUksoJm1seHN3X3NwLT5yb3V0ZXIubmVpZ2hzX3VwZGF0ZS5kdywKIAkJCSAgbWx4c3dfc3Bfcm91dGVyX25laWdoc191cGRhdGVfd29yayk7CkBAIC0xMDM5LDE3ICsxMDc0LDEyIEBACiAJbWx4c3dfY29yZV9zY2hlZHVsZV9kdygmbWx4c3dfc3AtPnJvdXRlci5uZWlnaHNfdXBkYXRlLmR3LCAwKTsKIAltbHhzd19jb3JlX3NjaGVkdWxlX2R3KCZtbHhzd19zcC0+cm91dGVyLm5leHRob3BfcHJvYmVfZHcsIDApOwogCXJldHVybiAwOwotCi1lcnJfcmVnaXN0ZXJfbmV0ZXZlbnRfbm90aWZpZXI6Ci0Jcmhhc2h0YWJsZV9kZXN0cm95KCZtbHhzd19zcC0+cm91dGVyLm5laWdoX2h0KTsKLQlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBtbHhzd19zcF9uZWlnaF9maW5pKHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3ApCiB7CiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZtbHhzd19zcC0+cm91dGVyLm5laWdoc191cGRhdGUuZHcpOwogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbWx4c3dfc3AtPnJvdXRlci5uZXh0aG9wX3Byb2JlX2R3KTsKLQl1bnJlZ2lzdGVyX25ldGV2ZW50X25vdGlmaWVyKCZtbHhzd19zcF9yb3V0ZXJfbmV0ZXZlbnRfbmIpOwogCXJoYXNodGFibGVfZGVzdHJveSgmbWx4c3dfc3AtPnJvdXRlci5uZWlnaF9odCk7CiB9CiAKQEAgLTEwODgsOSArMTExOCwxMCBAQAogewogCWNoYXIgcmFsZXVfcGxbTUxYU1dfUkVHX1JBTEVVX0xFTl07CiAKLQltbHhzd19yZWdfcmFsZXVfcGFjayhyYWxldV9wbCwgdnItPnByb3RvLCB2ci0+aWQsCi0JCQkgICAgIGFkal9pbmRleCwgZWNtcF9zaXplLAotCQkJICAgICBuZXdfYWRqX2luZGV4LCBuZXdfZWNtcF9zaXplKTsKKwltbHhzd19yZWdfcmFsZXVfcGFjayhyYWxldV9wbCwKKwkJCSAgICAgKGVudW0gbWx4c3dfcmVnX3JhbHh4X3Byb3RvY29sKSB2ci0+cHJvdG8sIHZyLT5pZCwKKwkJCSAgICAgYWRqX2luZGV4LCBlY21wX3NpemUsIG5ld19hZGpfaW5kZXgsCisJCQkgICAgIG5ld19lY21wX3NpemUpOwogCXJldHVybiBtbHhzd19yZWdfd3JpdGUobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhyYWxldSksIHJhbGV1X3BsKTsKIH0KIApAQCAtMTQ5Niw0MyArMTUyNyw2IEBACiAJbWx4c3dfc3BfbmV4dGhvcF9ncm91cF9kZXN0cm95KG1seHN3X3NwLCBuaF9ncnApOwogfQogCi1zdGF0aWMgaW50IF9fbWx4c3dfc3Bfcm91dGVyX2luaXQoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCkKLXsKLQljaGFyIHJnY3JfcGxbTUxYU1dfUkVHX1JHQ1JfTEVOXTsKLQotCW1seHN3X3JlZ19yZ2NyX3BhY2socmdjcl9wbCwgdHJ1ZSk7Ci0JbWx4c3dfcmVnX3JnY3JfbWF4X3JvdXRlcl9pbnRlcmZhY2VzX3NldChyZ2NyX3BsLCBNTFhTV19TUF9SSUZfTUFYKTsKLQlyZXR1cm4gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcocmdjciksIHJnY3JfcGwpOwotfQotCi1zdGF0aWMgdm9pZCBfX21seHN3X3NwX3JvdXRlcl9maW5pKHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3ApCi17Ci0JY2hhciByZ2NyX3BsW01MWFNXX1JFR19SR0NSX0xFTl07Ci0KLQltbHhzd19yZWdfcmdjcl9wYWNrKHJnY3JfcGwsIGZhbHNlKTsKLQltbHhzd19yZWdfd3JpdGUobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhyZ2NyKSwgcmdjcl9wbCk7Ci19Ci0KLWludCBtbHhzd19zcF9yb3V0ZXJfaW5pdChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwKQotewotCWludCBlcnI7Ci0KLQlJTklUX0xJU1RfSEVBRCgmbWx4c3dfc3AtPnJvdXRlci5uZXh0aG9wX25laWdoc19saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmbWx4c3dfc3AtPnJvdXRlci5uZXh0aG9wX2dyb3VwX2xpc3QpOwotCWVyciA9IF9fbWx4c3dfc3Bfcm91dGVyX2luaXQobWx4c3dfc3ApOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0JbWx4c3dfc3BfbHBtX2luaXQobWx4c3dfc3ApOwotCW1seHN3X3NwX3Zyc19pbml0KG1seHN3X3NwKTsKLQlyZXR1cm4gbWx4c3dfc3BfbmVpZ2hfaW5pdChtbHhzd19zcCk7Ci19Ci0KLXZvaWQgbWx4c3dfc3Bfcm91dGVyX2Zpbmkoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCkKLXsKLQltbHhzd19zcF9uZWlnaF9maW5pKG1seHN3X3NwKTsKLQlfX21seHN3X3NwX3JvdXRlcl9maW5pKG1seHN3X3NwKTsKLX0KLQogc3RhdGljIGludCBtbHhzd19zcF9maWJfZW50cnlfb3A0X3JlbW90ZShzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwLAogCQkJCQkgc3RydWN0IG1seHN3X3NwX2ZpYl9lbnRyeSAqZmliX2VudHJ5LAogCQkJCQkgZW51bSBtbHhzd19yZWdfcmFsdWVfb3Agb3ApCkBAIC0xNTU4LDggKzE1NTIsOSBAQAogCQl0cmFwX2lkID0gTUxYU1dfVFJBUF9JRF9SVFJfSU5HUkVTUzA7CiAJfQogCi0JbWx4c3dfcmVnX3JhbHVlX3BhY2s0KHJhbHVlX3BsLCB2ci0+cHJvdG8sIG9wLCB2ci0+aWQsCi0JCQkgICAgICBmaWJfZW50cnktPmtleS5wcmVmaXhfbGVuLCAqcF9kaXApOworCW1seHN3X3JlZ19yYWx1ZV9wYWNrNChyYWx1ZV9wbCwKKwkJCSAgICAgIChlbnVtIG1seHN3X3JlZ19yYWx4eF9wcm90b2NvbCkgdnItPnByb3RvLCBvcCwKKwkJCSAgICAgIHZyLT5pZCwgZmliX2VudHJ5LT5rZXkucHJlZml4X2xlbiwgKnBfZGlwKTsKIAltbHhzd19yZWdfcmFsdWVfYWN0X3JlbW90ZV9wYWNrKHJhbHVlX3BsLCB0cmFwX2FjdGlvbiwgdHJhcF9pZCwKIAkJCQkJYWRqYWNlbmN5X2luZGV4LCBlY21wX3NpemUpOwogCXJldHVybiBtbHhzd19yZWdfd3JpdGUobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhyYWx1ZSksIHJhbHVlX3BsKTsKQEAgLTE1NzMsOCArMTU2OCw5IEBACiAJdTMyICpwX2RpcCA9ICh1MzIgKikgZmliX2VudHJ5LT5rZXkuYWRkcjsKIAlzdHJ1Y3QgbWx4c3dfc3BfdnIgKnZyID0gZmliX2VudHJ5LT52cjsKIAotCW1seHN3X3JlZ19yYWx1ZV9wYWNrNChyYWx1ZV9wbCwgdnItPnByb3RvLCBvcCwgdnItPmlkLAotCQkJICAgICAgZmliX2VudHJ5LT5rZXkucHJlZml4X2xlbiwgKnBfZGlwKTsKKwltbHhzd19yZWdfcmFsdWVfcGFjazQocmFsdWVfcGwsCisJCQkgICAgICAoZW51bSBtbHhzd19yZWdfcmFseHhfcHJvdG9jb2wpIHZyLT5wcm90bywgb3AsCisJCQkgICAgICB2ci0+aWQsIGZpYl9lbnRyeS0+a2V5LnByZWZpeF9sZW4sICpwX2RpcCk7CiAJbWx4c3dfcmVnX3JhbHVlX2FjdF9sb2NhbF9wYWNrKHJhbHVlX3BsLAogCQkJCSAgICAgICBNTFhTV19SRUdfUkFMVUVfVFJBUF9BQ1RJT05fTk9QLCAwLAogCQkJCSAgICAgICBmaWJfZW50cnktPnJpZik7CkBAIC0xNTg5LDggKzE1ODUsOSBAQAogCXUzMiAqcF9kaXAgPSAodTMyICopIGZpYl9lbnRyeS0+a2V5LmFkZHI7CiAJc3RydWN0IG1seHN3X3NwX3ZyICp2ciA9IGZpYl9lbnRyeS0+dnI7CiAKLQltbHhzd19yZWdfcmFsdWVfcGFjazQocmFsdWVfcGwsIHZyLT5wcm90bywgb3AsIHZyLT5pZCwKLQkJCSAgICAgIGZpYl9lbnRyeS0+a2V5LnByZWZpeF9sZW4sICpwX2RpcCk7CisJbWx4c3dfcmVnX3JhbHVlX3BhY2s0KHJhbHVlX3BsLAorCQkJICAgICAgKGVudW0gbWx4c3dfcmVnX3JhbHh4X3Byb3RvY29sKSB2ci0+cHJvdG8sIG9wLAorCQkJICAgICAgdnItPmlkLCBmaWJfZW50cnktPmtleS5wcmVmaXhfbGVuLCAqcF9kaXApOwogCW1seHN3X3JlZ19yYWx1ZV9hY3RfaXAybWVfcGFjayhyYWx1ZV9wbCk7CiAJcmV0dXJuIG1seHN3X3JlZ193cml0ZShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHJhbHVlKSwgcmFsdWVfcGwpOwogfQpAQCAtMTYyNiwxMSArMTYyMyw4IEBACiBzdGF0aWMgaW50IG1seHN3X3NwX2ZpYl9lbnRyeV91cGRhdGUoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCwKIAkJCQkgICAgIHN0cnVjdCBtbHhzd19zcF9maWJfZW50cnkgKmZpYl9lbnRyeSkKIHsKLQllbnVtIG1seHN3X3JlZ19yYWx1ZV9vcCBvcDsKLQotCW9wID0gIWZpYl9lbnRyeS0+YWRkZWQgPyBNTFhTV19SRUdfUkFMVUVfT1BfV1JJVEVfV1JJVEUgOgotCQkJCSBNTFhTV19SRUdfUkFMVUVfT1BfV1JJVEVfVVBEQVRFOwotCXJldHVybiBtbHhzd19zcF9maWJfZW50cnlfb3AobWx4c3dfc3AsIGZpYl9lbnRyeSwgb3ApOworCXJldHVybiBtbHhzd19zcF9maWJfZW50cnlfb3AobWx4c3dfc3AsIGZpYl9lbnRyeSwKKwkJCQkgICAgIE1MWFNXX1JFR19SQUxVRV9PUF9XUklURV9XUklURSk7CiB9CiAKIHN0YXRpYyBpbnQgbWx4c3dfc3BfZmliX2VudHJ5X2RlbChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwLApAQCAtMTY0MCwxMjggKzE2MzQsMTgwIEBACiAJCQkJICAgICBNTFhTV19SRUdfUkFMVUVfT1BfV1JJVEVfREVMRVRFKTsKIH0KIAotc3RydWN0IG1seHN3X3NwX3JvdXRlcl9maWI0X2FkZF9pbmZvIHsKLQlzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zX2l0ZW0gdHJpdGVtOwotCXN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3A7Ci0Jc3RydWN0IG1seHN3X3NwX2ZpYl9lbnRyeSAqZmliX2VudHJ5OwotfTsKLQotc3RhdGljIHZvaWQgbWx4c3dfc3Bfcm91dGVyX2ZpYjRfYWRkX2luZm9fZGVzdHJveSh2b2lkIGNvbnN0ICpkYXRhKQotewotCWNvbnN0IHN0cnVjdCBtbHhzd19zcF9yb3V0ZXJfZmliNF9hZGRfaW5mbyAqaW5mbyA9IGRhdGE7Ci0Jc3RydWN0IG1seHN3X3NwX2ZpYl9lbnRyeSAqZmliX2VudHJ5ID0gaW5mby0+ZmliX2VudHJ5OwotCXN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3AgPSBpbmZvLT5tbHhzd19zcDsKLQotCW1seHN3X3NwX2ZpYl9lbnRyeV9kZXN0cm95KGZpYl9lbnRyeSk7Ci0JbWx4c3dfc3BfdnJfcHV0KG1seHN3X3NwLCBmaWJfZW50cnktPnZyKTsKLQlrZnJlZShpbmZvKTsKLX0KLQogc3RhdGljIGludAogbWx4c3dfc3Bfcm91dGVyX2ZpYjRfZW50cnlfaW5pdChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwLAotCQkJCWNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX2lwdjRfZmliICpmaWI0LAorCQkJCWNvbnN0IHN0cnVjdCBmaWJfZW50cnlfbm90aWZpZXJfaW5mbyAqZmVuX2luZm8sCiAJCQkJc3RydWN0IG1seHN3X3NwX2ZpYl9lbnRyeSAqZmliX2VudHJ5KQogewotCXN0cnVjdCBmaWJfaW5mbyAqZmkgPSBmaWI0LT5maTsKKwlzdHJ1Y3QgZmliX2luZm8gKmZpID0gZmVuX2luZm8tPmZpOworCXN0cnVjdCBtbHhzd19zcF9yaWYgKnIgPSBOVUxMOworCWludCBuaHNlbDsKKwlpbnQgZXJyOwogCi0JaWYgKGZpYjQtPnR5cGUgPT0gUlROX0xPQ0FMIHx8IGZpYjQtPnR5cGUgPT0gUlROX0JST0FEQ0FTVCkgeworCWlmIChmZW5faW5mby0+dHlwZSA9PSBSVE5fTE9DQUwgfHwgZmVuX2luZm8tPnR5cGUgPT0gUlROX0JST0FEQ0FTVCkgewogCQlmaWJfZW50cnktPnR5cGUgPSBNTFhTV19TUF9GSUJfRU5UUllfVFlQRV9UUkFQOwogCQlyZXR1cm4gMDsKIAl9Ci0JaWYgKGZpYjQtPnR5cGUgIT0gUlROX1VOSUNBU1QpCisJaWYgKGZlbl9pbmZvLT50eXBlICE9IFJUTl9VTklDQVNUKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChmaS0+ZmliX3Njb3BlICE9IFJUX1NDT1BFX1VOSVZFUlNFKSB7Ci0JCXN0cnVjdCBtbHhzd19zcF9yaWYgKnI7CisJZm9yIChuaHNlbCA9IDA7IG5oc2VsIDwgZmktPmZpYl9uaHM7IG5oc2VsKyspIHsKKwkJY29uc3Qgc3RydWN0IGZpYl9uaCAqbmggPSAmZmktPmZpYl9uaFtuaHNlbF07CiAKLQkJZmliX2VudHJ5LT50eXBlID0gTUxYU1dfU1BfRklCX0VOVFJZX1RZUEVfTE9DQUw7Ci0JCXIgPSBtbHhzd19zcF9yaWZfZmluZF9ieV9kZXYobWx4c3dfc3AsIGZpLT5maWJfZGV2KTsKLQkJaWYgKCFyKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWZpYl9lbnRyeS0+cmlmID0gci0+cmlmOworCQlpZiAoIW5oLT5uaF9kZXYpCisJCQljb250aW51ZTsKKwkJciA9IG1seHN3X3NwX3JpZl9maW5kX2J5X2RldihtbHhzd19zcCwgbmgtPm5oX2Rldik7CisJCWlmICghcikgeworCQkJLyogSW4gY2FzZSByb3V0ZXIgaW50ZXJmYWNlIGlzIG5vdCBmb3VuZCBmb3IKKwkJCSAqIGF0IGxlYXN0IG9uZSBvZiB0aGUgbmV4dGhvcHMsIHRoYXQgbWVhbnMKKwkJCSAqIHRoZSBuZXh0aG9wIHBvaW50cyB0byBzb21lIGRldmljZSB1bnJlbGF0ZWQKKwkJCSAqIHRvIHVzLiBTZXQgdHJhcCBhbmQgcGFzcyB0aGUgcGFja2V0cyBmb3IKKwkJCSAqIHRoaXMgcHJlZml4IHRvIGtlcm5lbC4KKwkJCSAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIXIpIHsKKwkJZmliX2VudHJ5LT50eXBlID0gTUxYU1dfU1BfRklCX0VOVFJZX1RZUEVfVFJBUDsKIAkJcmV0dXJuIDA7CiAJfQotCWZpYl9lbnRyeS0+dHlwZSA9IE1MWFNXX1NQX0ZJQl9FTlRSWV9UWVBFX1JFTU9URTsKLQlyZXR1cm4gbWx4c3dfc3BfbmV4dGhvcF9ncm91cF9nZXQobWx4c3dfc3AsIGZpYl9lbnRyeSwgZmkpOworCisJaWYgKGZpLT5maWJfc2NvcGUgIT0gUlRfU0NPUEVfVU5JVkVSU0UpIHsKKwkJZmliX2VudHJ5LT50eXBlID0gTUxYU1dfU1BfRklCX0VOVFJZX1RZUEVfTE9DQUw7CisJCWZpYl9lbnRyeS0+cmlmID0gci0+cmlmOworCX0gZWxzZSB7CisJCWZpYl9lbnRyeS0+dHlwZSA9IE1MWFNXX1NQX0ZJQl9FTlRSWV9UWVBFX1JFTU9URTsKKwkJZXJyID0gbWx4c3dfc3BfbmV4dGhvcF9ncm91cF9nZXQobWx4c3dfc3AsIGZpYl9lbnRyeSwgZmkpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisJZmliX2luZm9fb2ZmbG9hZF9pbmMoZmVuX2luZm8tPmZpKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKIG1seHN3X3NwX3JvdXRlcl9maWI0X2VudHJ5X2Zpbmkoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCwKIAkJCQlzdHJ1Y3QgbWx4c3dfc3BfZmliX2VudHJ5ICpmaWJfZW50cnkpCiB7Ci0JaWYgKGZpYl9lbnRyeS0+dHlwZSAhPSBNTFhTV19TUF9GSUJfRU5UUllfVFlQRV9SRU1PVEUpCi0JCXJldHVybjsKLQltbHhzd19zcF9uZXh0aG9wX2dyb3VwX3B1dChtbHhzd19zcCwgZmliX2VudHJ5KTsKKwlpZiAoZmliX2VudHJ5LT50eXBlICE9IE1MWFNXX1NQX0ZJQl9FTlRSWV9UWVBFX1RSQVApCisJCWZpYl9pbmZvX29mZmxvYWRfZGVjKGZpYl9lbnRyeS0+ZmkpOworCWlmIChmaWJfZW50cnktPnR5cGUgPT0gTUxYU1dfU1BfRklCX0VOVFJZX1RZUEVfUkVNT1RFKQorCQltbHhzd19zcF9uZXh0aG9wX2dyb3VwX3B1dChtbHhzd19zcCwgZmliX2VudHJ5KTsKIH0KIAotc3RhdGljIGludAotbWx4c3dfc3Bfcm91dGVyX2ZpYjRfYWRkX3ByZXBhcmUoc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQsCi0JCQkJIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX2lwdjRfZmliICpmaWI0LAotCQkJCSBzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zICp0cmFucykKK3N0YXRpYyBzdHJ1Y3QgbWx4c3dfc3BfZmliX2VudHJ5ICoKK21seHN3X3NwX2ZpYl9lbnRyeV9nZXQoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBmaWJfZW50cnlfbm90aWZpZXJfaW5mbyAqZmVuX2luZm8pCiB7Ci0Jc3RydWN0IG1seHN3X3NwICptbHhzd19zcCA9IG1seHN3X3NwX3BvcnQtPm1seHN3X3NwOwotCXN0cnVjdCBtbHhzd19zcF9yb3V0ZXJfZmliNF9hZGRfaW5mbyAqaW5mbzsKIAlzdHJ1Y3QgbWx4c3dfc3BfZmliX2VudHJ5ICpmaWJfZW50cnk7CisJc3RydWN0IGZpYl9pbmZvICpmaSA9IGZlbl9pbmZvLT5maTsKIAlzdHJ1Y3QgbWx4c3dfc3BfdnIgKnZyOwogCWludCBlcnI7CiAKLQl2ciA9IG1seHN3X3NwX3ZyX2dldChtbHhzd19zcCwgZmliNC0+ZHN0X2xlbiwgZmliNC0+dGJfaWQsCisJdnIgPSBtbHhzd19zcF92cl9nZXQobWx4c3dfc3AsIGZlbl9pbmZvLT5kc3RfbGVuLCBmZW5faW5mby0+dGJfaWQsCiAJCQkgICAgIE1MWFNXX1NQX0wzX1BST1RPX0lQVjQpOwogCWlmIChJU19FUlIodnIpKQotCQlyZXR1cm4gUFRSX0VSUih2cik7CisJCXJldHVybiBFUlJfQ0FTVCh2cik7CiAKLQlmaWJfZW50cnkgPSBtbHhzd19zcF9maWJfZW50cnlfY3JlYXRlKHZyLT5maWIsICZmaWI0LT5kc3QsCi0JCQkJCSAgICAgIHNpemVvZihmaWI0LT5kc3QpLCBmaWI0LT5kc3RfbGVuKTsKKwlmaWJfZW50cnkgPSBtbHhzd19zcF9maWJfZW50cnlfbG9va3VwKHZyLT5maWIsICZmZW5faW5mby0+ZHN0LAorCQkJCQkgICAgICBzaXplb2YoZmVuX2luZm8tPmRzdCksCisJCQkJCSAgICAgIGZlbl9pbmZvLT5kc3RfbGVuLCBmaS0+ZmliX2Rldik7CisJaWYgKGZpYl9lbnRyeSkgeworCQkvKiBBbHJlYWR5IGV4aXN0cywganVzdCB0YWtlIGEgcmVmZXJlbmNlICovCisJCWZpYl9lbnRyeS0+cmVmX2NvdW50Kys7CisJCXJldHVybiBmaWJfZW50cnk7CisJfQorCWZpYl9lbnRyeSA9IG1seHN3X3NwX2ZpYl9lbnRyeV9jcmVhdGUodnItPmZpYiwgJmZlbl9pbmZvLT5kc3QsCisJCQkJCSAgICAgIHNpemVvZihmZW5faW5mby0+ZHN0KSwKKwkJCQkJICAgICAgZmVuX2luZm8tPmRzdF9sZW4sIGZpLT5maWJfZGV2KTsKIAlpZiAoIWZpYl9lbnRyeSkgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9maWJfZW50cnlfY3JlYXRlOwogCX0KIAlmaWJfZW50cnktPnZyID0gdnI7CisJZmliX2VudHJ5LT5maSA9IGZpOworCWZpYl9lbnRyeS0+cmVmX2NvdW50ID0gMTsKIAotCWVyciA9IG1seHN3X3NwX3JvdXRlcl9maWI0X2VudHJ5X2luaXQobWx4c3dfc3AsIGZpYjQsIGZpYl9lbnRyeSk7CisJZXJyID0gbWx4c3dfc3Bfcm91dGVyX2ZpYjRfZW50cnlfaW5pdChtbHhzd19zcCwgZmVuX2luZm8sIGZpYl9lbnRyeSk7CiAJaWYgKGVycikKIAkJZ290byBlcnJfZmliNF9lbnRyeV9pbml0OwogCi0JaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpbmZvKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2FsbG9jX2luZm87Ci0JfQotCWluZm8tPm1seHN3X3NwID0gbWx4c3dfc3A7Ci0JaW5mby0+ZmliX2VudHJ5ID0gZmliX2VudHJ5OwotCXN3aXRjaGRldl90cmFuc19pdGVtX2VucXVldWUodHJhbnMsIGluZm8sCi0JCQkJICAgICBtbHhzd19zcF9yb3V0ZXJfZmliNF9hZGRfaW5mb19kZXN0cm95LAotCQkJCSAgICAgJmluZm8tPnRyaXRlbSk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGZpYl9lbnRyeTsKIAotZXJyX2FsbG9jX2luZm86Ci0JbWx4c3dfc3Bfcm91dGVyX2ZpYjRfZW50cnlfZmluaShtbHhzd19zcCwgZmliX2VudHJ5KTsKIGVycl9maWI0X2VudHJ5X2luaXQ6CiAJbWx4c3dfc3BfZmliX2VudHJ5X2Rlc3Ryb3koZmliX2VudHJ5KTsKIGVycl9maWJfZW50cnlfY3JlYXRlOgogCW1seHN3X3NwX3ZyX3B1dChtbHhzd19zcCwgdnIpOwotCXJldHVybiBlcnI7CisKKwlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQogCi1zdGF0aWMgaW50Ci1tbHhzd19zcF9yb3V0ZXJfZmliNF9hZGRfY29tbWl0KHN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0LAotCQkJCWNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX2lwdjRfZmliICpmaWI0LAotCQkJCXN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zKQorc3RhdGljIHN0cnVjdCBtbHhzd19zcF9maWJfZW50cnkgKgorbWx4c3dfc3BfZmliX2VudHJ5X2ZpbmQoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCwKKwkJCWNvbnN0IHN0cnVjdCBmaWJfZW50cnlfbm90aWZpZXJfaW5mbyAqZmVuX2luZm8pCiB7Ci0Jc3RydWN0IG1seHN3X3NwICptbHhzd19zcCA9IG1seHN3X3NwX3BvcnQtPm1seHN3X3NwOwotCXN0cnVjdCBtbHhzd19zcF9yb3V0ZXJfZmliNF9hZGRfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgbWx4c3dfc3BfdnIgKnZyOworCisJdnIgPSBtbHhzd19zcF92cl9maW5kKG1seHN3X3NwLCBmZW5faW5mby0+dGJfaWQsCisJCQkgICAgICBNTFhTV19TUF9MM19QUk9UT19JUFY0KTsKKwlpZiAoIXZyKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBtbHhzd19zcF9maWJfZW50cnlfbG9va3VwKHZyLT5maWIsICZmZW5faW5mby0+ZHN0LAorCQkJCQkgc2l6ZW9mKGZlbl9pbmZvLT5kc3QpLAorCQkJCQkgZmVuX2luZm8tPmRzdF9sZW4sCisJCQkJCSBmZW5faW5mby0+ZmktPmZpYl9kZXYpOworfQorCitzdGF0aWMgdm9pZCBtbHhzd19zcF9maWJfZW50cnlfcHV0KHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3AsCisJCQkJICAgc3RydWN0IG1seHN3X3NwX2ZpYl9lbnRyeSAqZmliX2VudHJ5KQoreworCXN0cnVjdCBtbHhzd19zcF92ciAqdnIgPSBmaWJfZW50cnktPnZyOworCisJaWYgKC0tZmliX2VudHJ5LT5yZWZfY291bnQgPT0gMCkgeworCQltbHhzd19zcF9yb3V0ZXJfZmliNF9lbnRyeV9maW5pKG1seHN3X3NwLCBmaWJfZW50cnkpOworCQltbHhzd19zcF9maWJfZW50cnlfZGVzdHJveShmaWJfZW50cnkpOworCX0KKwltbHhzd19zcF92cl9wdXQobWx4c3dfc3AsIHZyKTsKK30KKworc3RhdGljIHZvaWQgbWx4c3dfc3BfZmliX2VudHJ5X3B1dF9hbGwoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCwKKwkJCQkgICAgICAgc3RydWN0IG1seHN3X3NwX2ZpYl9lbnRyeSAqZmliX2VudHJ5KQoreworCXVuc2lnbmVkIGludCBsYXN0X3JlZl9jb3VudDsKKworCWRvIHsKKwkJbGFzdF9yZWZfY291bnQgPSBmaWJfZW50cnktPnJlZl9jb3VudDsKKwkJbWx4c3dfc3BfZmliX2VudHJ5X3B1dChtbHhzd19zcCwgZmliX2VudHJ5KTsKKwl9IHdoaWxlIChsYXN0X3JlZl9jb3VudCAhPSAxKTsKK30KKworc3RhdGljIGludCBtbHhzd19zcF9yb3V0ZXJfZmliNF9hZGQoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCwKKwkJCQkgICAgc3RydWN0IGZpYl9lbnRyeV9ub3RpZmllcl9pbmZvICpmZW5faW5mbykKK3sKIAlzdHJ1Y3QgbWx4c3dfc3BfZmliX2VudHJ5ICpmaWJfZW50cnk7CiAJc3RydWN0IG1seHN3X3NwX3ZyICp2cjsKIAlpbnQgZXJyOwogCi0JaW5mbyA9IHN3aXRjaGRldl90cmFuc19pdGVtX2RlcXVldWUodHJhbnMpOwotCWZpYl9lbnRyeSA9IGluZm8tPmZpYl9lbnRyeTsKLQlrZnJlZShpbmZvKTsKKwlpZiAobWx4c3dfc3AtPnJvdXRlci5hYm9ydGVkKQorCQlyZXR1cm4gMDsKKworCWZpYl9lbnRyeSA9IG1seHN3X3NwX2ZpYl9lbnRyeV9nZXQobWx4c3dfc3AsIGZlbl9pbmZvKTsKKwlpZiAoSVNfRVJSKGZpYl9lbnRyeSkpIHsKKwkJZGV2X3dhcm4obWx4c3dfc3AtPmJ1c19pbmZvLT5kZXYsICJGYWlsZWQgdG8gZ2V0IEZJQjQgZW50cnkgYmVpbmcgYWRkZWQuXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZmliX2VudHJ5KTsKKwl9CisKKwlpZiAoZmliX2VudHJ5LT5yZWZfY291bnQgIT0gMSkKKwkJcmV0dXJuIDA7CiAKIAl2ciA9IGZpYl9lbnRyeS0+dnI7Ci0JZXJyID0gbWx4c3dfc3BfZmliX2VudHJ5X2luc2VydChmaWJfZW50cnktPnZyLT5maWIsIGZpYl9lbnRyeSk7Ci0JaWYgKGVycikKKwllcnIgPSBtbHhzd19zcF9maWJfZW50cnlfaW5zZXJ0KHZyLT5maWIsIGZpYl9lbnRyeSk7CisJaWYgKGVycikgeworCQlkZXZfd2FybihtbHhzd19zcC0+YnVzX2luZm8tPmRldiwgIkZhaWxlZCB0byBpbnNlcnQgRklCNCBlbnRyeSBiZWluZyBhZGRlZC5cbiIpOwogCQlnb3RvIGVycl9maWJfZW50cnlfaW5zZXJ0OworCX0KIAllcnIgPSBtbHhzd19zcF9maWJfZW50cnlfdXBkYXRlKG1seHN3X3NwLCBmaWJfZW50cnkpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX2ZpYl9lbnRyeV9hZGQ7CkBAIC0xNzcwLDQ1ICsxODE2LDE5OCBAQAogZXJyX2ZpYl9lbnRyeV9hZGQ6CiAJbWx4c3dfc3BfZmliX2VudHJ5X3JlbW92ZSh2ci0+ZmliLCBmaWJfZW50cnkpOwogZXJyX2ZpYl9lbnRyeV9pbnNlcnQ6Ci0JbWx4c3dfc3Bfcm91dGVyX2ZpYjRfZW50cnlfZmluaShtbHhzd19zcCwgZmliX2VudHJ5KTsKLQltbHhzd19zcF9maWJfZW50cnlfZGVzdHJveShmaWJfZW50cnkpOwotCW1seHN3X3NwX3ZyX3B1dChtbHhzd19zcCwgdnIpOworCW1seHN3X3NwX2ZpYl9lbnRyeV9wdXQobWx4c3dfc3AsIGZpYl9lbnRyeSk7CiAJcmV0dXJuIGVycjsKIH0KIAotaW50IG1seHN3X3NwX3JvdXRlcl9maWI0X2FkZChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCwKLQkJCSAgICAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfaXB2NF9maWIgKmZpYjQsCi0JCQkgICAgIHN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zKQorc3RhdGljIGludCBtbHhzd19zcF9yb3V0ZXJfZmliNF9kZWwoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCwKKwkJCQkgICAgc3RydWN0IGZpYl9lbnRyeV9ub3RpZmllcl9pbmZvICpmZW5faW5mbykKIHsKLQlpZiAoc3dpdGNoZGV2X3RyYW5zX3BoX3ByZXBhcmUodHJhbnMpKQotCQlyZXR1cm4gbWx4c3dfc3Bfcm91dGVyX2ZpYjRfYWRkX3ByZXBhcmUobWx4c3dfc3BfcG9ydCwKLQkJCQkJCQlmaWI0LCB0cmFucyk7Ci0JcmV0dXJuIG1seHN3X3NwX3JvdXRlcl9maWI0X2FkZF9jb21taXQobWx4c3dfc3BfcG9ydCwKLQkJCQkJICAgICAgIGZpYjQsIHRyYW5zKTsKLX0KLQotaW50IG1seHN3X3NwX3JvdXRlcl9maWI0X2RlbChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCwKLQkJCSAgICAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfaXB2NF9maWIgKmZpYjQpCi17Ci0Jc3RydWN0IG1seHN3X3NwICptbHhzd19zcCA9IG1seHN3X3NwX3BvcnQtPm1seHN3X3NwOwogCXN0cnVjdCBtbHhzd19zcF9maWJfZW50cnkgKmZpYl9lbnRyeTsKLQlzdHJ1Y3QgbWx4c3dfc3BfdnIgKnZyOwogCi0JdnIgPSBtbHhzd19zcF92cl9maW5kKG1seHN3X3NwLCBmaWI0LT50Yl9pZCwgTUxYU1dfU1BfTDNfUFJPVE9fSVBWNCk7Ci0JaWYgKCF2cikgewotCQlkZXZfd2FybihtbHhzd19zcC0+YnVzX2luZm8tPmRldiwgIkZhaWxlZCB0byBmaW5kIHZpcnR1YWwgcm91dGVyIGZvciBGSUI0IGVudHJ5IGJlaW5nIHJlbW92ZWQuXG4iKTsKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQotCWZpYl9lbnRyeSA9IG1seHN3X3NwX2ZpYl9lbnRyeV9sb29rdXAodnItPmZpYiwgJmZpYjQtPmRzdCwKLQkJCQkJICAgICAgc2l6ZW9mKGZpYjQtPmRzdCksIGZpYjQtPmRzdF9sZW4pOworCWlmIChtbHhzd19zcC0+cm91dGVyLmFib3J0ZWQpCisJCXJldHVybiAwOworCisJZmliX2VudHJ5ID0gbWx4c3dfc3BfZmliX2VudHJ5X2ZpbmQobWx4c3dfc3AsIGZlbl9pbmZvKTsKIAlpZiAoIWZpYl9lbnRyeSkgewogCQlkZXZfd2FybihtbHhzd19zcC0+YnVzX2luZm8tPmRldiwgIkZhaWxlZCB0byBmaW5kIEZJQjQgZW50cnkgYmVpbmcgcmVtb3ZlZC5cbiIpOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9Ci0JbWx4c3dfc3BfZmliX2VudHJ5X2RlbChtbHhzd19zcF9wb3J0LT5tbHhzd19zcCwgZmliX2VudHJ5KTsKLQltbHhzd19zcF9maWJfZW50cnlfcmVtb3ZlKHZyLT5maWIsIGZpYl9lbnRyeSk7Ci0JbWx4c3dfc3Bfcm91dGVyX2ZpYjRfZW50cnlfZmluaShtbHhzd19zcCwgZmliX2VudHJ5KTsKLQltbHhzd19zcF9maWJfZW50cnlfZGVzdHJveShmaWJfZW50cnkpOwotCW1seHN3X3NwX3ZyX3B1dChtbHhzd19zcCwgdnIpOworCisJaWYgKGZpYl9lbnRyeS0+cmVmX2NvdW50ID09IDEpIHsKKwkJbWx4c3dfc3BfZmliX2VudHJ5X2RlbChtbHhzd19zcCwgZmliX2VudHJ5KTsKKwkJbWx4c3dfc3BfZmliX2VudHJ5X3JlbW92ZShmaWJfZW50cnktPnZyLT5maWIsIGZpYl9lbnRyeSk7CisJfQorCisJbWx4c3dfc3BfZmliX2VudHJ5X3B1dChtbHhzd19zcCwgZmliX2VudHJ5KTsKIAlyZXR1cm4gMDsKIH0KKworc3RhdGljIGludCBtbHhzd19zcF9yb3V0ZXJfc2V0X2Fib3J0X3RyYXAoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCkKK3sKKwljaGFyIHJhbHRhX3BsW01MWFNXX1JFR19SQUxUQV9MRU5dOworCWNoYXIgcmFsc3RfcGxbTUxYU1dfUkVHX1JBTFNUX0xFTl07CisJY2hhciByYWx0Yl9wbFtNTFhTV19SRUdfUkFMVEJfTEVOXTsKKwljaGFyIHJhbHVlX3BsW01MWFNXX1JFR19SQUxVRV9MRU5dOworCWludCBlcnI7CisKKwltbHhzd19yZWdfcmFsdGFfcGFjayhyYWx0YV9wbCwgdHJ1ZSwgTUxYU1dfUkVHX1JBTFhYX1BST1RPQ09MX0lQVjQsCisJCQkgICAgIE1MWFNXX1NQX0xQTV9UUkVFX01JTik7CisJZXJyID0gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcocmFsdGEpLCByYWx0YV9wbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCW1seHN3X3JlZ19yYWxzdF9wYWNrKHJhbHN0X3BsLCAweGZmLCBNTFhTV19TUF9MUE1fVFJFRV9NSU4pOworCWVyciA9IG1seHN3X3JlZ193cml0ZShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHJhbHN0KSwgcmFsc3RfcGwpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwltbHhzd19yZWdfcmFsdGJfcGFjayhyYWx0Yl9wbCwgMCwgTUxYU1dfUkVHX1JBTFhYX1BST1RPQ09MX0lQVjQsIDApOworCWVyciA9IG1seHN3X3JlZ193cml0ZShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHJhbHRiKSwgcmFsdGJfcGwpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwltbHhzd19yZWdfcmFsdWVfcGFjazQocmFsdWVfcGwsIE1MWFNXX1NQX0wzX1BST1RPX0lQVjQsCisJCQkgICAgICBNTFhTV19SRUdfUkFMVUVfT1BfV1JJVEVfV1JJVEUsIDAsIDAsIDApOworCW1seHN3X3JlZ19yYWx1ZV9hY3RfaXAybWVfcGFjayhyYWx1ZV9wbCk7CisJcmV0dXJuIG1seHN3X3JlZ193cml0ZShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHJhbHVlKSwgcmFsdWVfcGwpOworfQorCitzdGF0aWMgdm9pZCBtbHhzd19zcF9yb3V0ZXJfZmliNF9hYm9ydChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwKQoreworCXN0cnVjdCBtbHhzd19yZXNvdXJjZXMgKnJlc291cmNlczsKKwlzdHJ1Y3QgbWx4c3dfc3BfZmliX2VudHJ5ICpmaWJfZW50cnk7CisJc3RydWN0IG1seHN3X3NwX2ZpYl9lbnRyeSAqdG1wOworCXN0cnVjdCBtbHhzd19zcF92ciAqdnI7CisJaW50IGk7CisJaW50IGVycjsKKworCXJlc291cmNlcyA9IG1seHN3X2NvcmVfcmVzb3VyY2VzX2dldChtbHhzd19zcC0+Y29yZSk7CisJZm9yIChpID0gMDsgaSA8IHJlc291cmNlcy0+bWF4X3ZpcnR1YWxfcm91dGVyczsgaSsrKSB7CisJCXZyID0gJm1seHN3X3NwLT5yb3V0ZXIudnJzW2ldOworCQlpZiAoIXZyLT51c2VkKQorCQkJY29udGludWU7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZpYl9lbnRyeSwgdG1wLAorCQkJCQkgJnZyLT5maWItPmVudHJ5X2xpc3QsIGxpc3QpIHsKKwkJCWJvb2wgZG9fYnJlYWsgPSAmdG1wLT5saXN0ID09ICZ2ci0+ZmliLT5lbnRyeV9saXN0OworCisJCQltbHhzd19zcF9maWJfZW50cnlfZGVsKG1seHN3X3NwLCBmaWJfZW50cnkpOworCQkJbWx4c3dfc3BfZmliX2VudHJ5X3JlbW92ZShmaWJfZW50cnktPnZyLT5maWIsCisJCQkJCQkgIGZpYl9lbnRyeSk7CisJCQltbHhzd19zcF9maWJfZW50cnlfcHV0X2FsbChtbHhzd19zcCwgZmliX2VudHJ5KTsKKwkJCWlmIChkb19icmVhaykKKwkJCQlicmVhazsKKwkJfQorCX0KKwltbHhzd19zcC0+cm91dGVyLmFib3J0ZWQgPSB0cnVlOworCWVyciA9IG1seHN3X3NwX3JvdXRlcl9zZXRfYWJvcnRfdHJhcChtbHhzd19zcCk7CisJaWYgKGVycikKKwkJZGV2X3dhcm4obWx4c3dfc3AtPmJ1c19pbmZvLT5kZXYsICJGYWlsZWQgdG8gc2V0IGFib3J0IHRyYXAuXG4iKTsKK30KKworc3RhdGljIGludCBfX21seHN3X3NwX3JvdXRlcl9pbml0KHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3ApCit7CisJc3RydWN0IG1seHN3X3Jlc291cmNlcyAqcmVzb3VyY2VzOworCWNoYXIgcmdjcl9wbFtNTFhTV19SRUdfUkdDUl9MRU5dOworCWludCBlcnI7CisKKwlyZXNvdXJjZXMgPSBtbHhzd19jb3JlX3Jlc291cmNlc19nZXQobWx4c3dfc3AtPmNvcmUpOworCWlmICghcmVzb3VyY2VzLT5tYXhfcmlmX3ZhbGlkKQorCQlyZXR1cm4gLUVJTzsKKworCW1seHN3X3NwLT5yaWZzID0ga2NhbGxvYyhyZXNvdXJjZXMtPm1heF9yaWYsCisJCQkJIHNpemVvZihzdHJ1Y3QgbWx4c3dfc3BfcmlmICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1seHN3X3NwLT5yaWZzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1seHN3X3JlZ19yZ2NyX3BhY2socmdjcl9wbCwgdHJ1ZSk7CisJbWx4c3dfcmVnX3JnY3JfbWF4X3JvdXRlcl9pbnRlcmZhY2VzX3NldChyZ2NyX3BsLCByZXNvdXJjZXMtPm1heF9yaWYpOworCWVyciA9IG1seHN3X3JlZ193cml0ZShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHJnY3IpLCByZ2NyX3BsKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9yZ2NyX2ZhaWw7CisKKwlyZXR1cm4gMDsKKworZXJyX3JnY3JfZmFpbDoKKwlrZnJlZShtbHhzd19zcC0+cmlmcyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19tbHhzd19zcF9yb3V0ZXJfZmluaShzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwKQoreworCXN0cnVjdCBtbHhzd19yZXNvdXJjZXMgKnJlc291cmNlczsKKwljaGFyIHJnY3JfcGxbTUxYU1dfUkVHX1JHQ1JfTEVOXTsKKwlpbnQgaTsKKworCW1seHN3X3JlZ19yZ2NyX3BhY2socmdjcl9wbCwgZmFsc2UpOworCW1seHN3X3JlZ193cml0ZShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHJnY3IpLCByZ2NyX3BsKTsKKworCXJlc291cmNlcyA9IG1seHN3X2NvcmVfcmVzb3VyY2VzX2dldChtbHhzd19zcC0+Y29yZSk7CisJZm9yIChpID0gMDsgaSA8IHJlc291cmNlcy0+bWF4X3JpZjsgaSsrKQorCQlXQVJOX09OX09OQ0UobWx4c3dfc3AtPnJpZnNbaV0pOworCisJa2ZyZWUobWx4c3dfc3AtPnJpZnMpOworfQorCitzdGF0aWMgaW50IG1seHN3X3NwX3JvdXRlcl9maWJfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwID0gY29udGFpbmVyX29mKG5iLCBzdHJ1Y3QgbWx4c3dfc3AsIGZpYl9uYik7CisJc3RydWN0IGZpYl9lbnRyeV9ub3RpZmllcl9pbmZvICpmZW5faW5mbyA9IHB0cjsKKwlpbnQgZXJyOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgRklCX0VWRU5UX0VOVFJZX0FERDoKKwkJZXJyID0gbWx4c3dfc3Bfcm91dGVyX2ZpYjRfYWRkKG1seHN3X3NwLCBmZW5faW5mbyk7CisJCWlmIChlcnIpCisJCQltbHhzd19zcF9yb3V0ZXJfZmliNF9hYm9ydChtbHhzd19zcCk7CisJCWJyZWFrOworCWNhc2UgRklCX0VWRU5UX0VOVFJZX0RFTDoKKwkJbWx4c3dfc3Bfcm91dGVyX2ZpYjRfZGVsKG1seHN3X3NwLCBmZW5faW5mbyk7CisJCWJyZWFrOworCWNhc2UgRklCX0VWRU5UX1JVTEVfQUREOiAvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIEZJQl9FVkVOVF9SVUxFX0RFTDoKKwkJbWx4c3dfc3Bfcm91dGVyX2ZpYjRfYWJvcnQobWx4c3dfc3ApOworCQlicmVhazsKKwl9CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitpbnQgbWx4c3dfc3Bfcm91dGVyX2luaXQoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCkKK3sKKwlpbnQgZXJyOworCisJSU5JVF9MSVNUX0hFQUQoJm1seHN3X3NwLT5yb3V0ZXIubmV4dGhvcF9uZWlnaHNfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJm1seHN3X3NwLT5yb3V0ZXIubmV4dGhvcF9ncm91cF9saXN0KTsKKwllcnIgPSBfX21seHN3X3NwX3JvdXRlcl9pbml0KG1seHN3X3NwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJbWx4c3dfc3BfbHBtX2luaXQobWx4c3dfc3ApOworCWVyciA9IG1seHN3X3NwX3Zyc19pbml0KG1seHN3X3NwKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl92cnNfaW5pdDsKKworCWVyciA9ICBtbHhzd19zcF9uZWlnaF9pbml0KG1seHN3X3NwKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9uZWlnaF9pbml0OworCisJbWx4c3dfc3AtPmZpYl9uYi5ub3RpZmllcl9jYWxsID0gbWx4c3dfc3Bfcm91dGVyX2ZpYl9ldmVudDsKKwlyZWdpc3Rlcl9maWJfbm90aWZpZXIoJm1seHN3X3NwLT5maWJfbmIpOworCXJldHVybiAwOworCitlcnJfbmVpZ2hfaW5pdDoKKwltbHhzd19zcF92cnNfZmluaShtbHhzd19zcCk7CitlcnJfdnJzX2luaXQ6CisJX19tbHhzd19zcF9yb3V0ZXJfZmluaShtbHhzd19zcCk7CisJcmV0dXJuIGVycjsKK30KKwordm9pZCBtbHhzd19zcF9yb3V0ZXJfZmluaShzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwKQoreworCXVucmVnaXN0ZXJfZmliX25vdGlmaWVyKCZtbHhzd19zcC0+ZmliX25iKTsKKwltbHhzd19zcF9uZWlnaF9maW5pKG1seHN3X3NwKTsKKwltbHhzd19zcF92cnNfZmluaShtbHhzd19zcCk7CisJX19tbHhzd19zcF9yb3V0ZXJfZmluaShtbHhzd19zcCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9zcGVjdHJ1bV9zd2l0Y2hkZXYuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3NwZWN0cnVtX3N3aXRjaGRldi5jCmluZGV4IGExYWQ1ZTYuLjVlMDBjNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3NwZWN0cnVtX3N3aXRjaGRldi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3NwZWN0cnVtX3N3aXRjaGRldi5jCkBAIC0xNjcsOCArMTY3LDggQEAKIH0KIAogc3RhdGljIGludCBfX21seHN3X3NwX3BvcnRfZmxvb2Rfc2V0KHN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0LAotCQkJCSAgICAgdTE2IGlkeF9iZWdpbiwgdTE2IGlkeF9lbmQsIGJvb2wgc2V0LAotCQkJCSAgICAgYm9vbCBvbmx5X3VjKQorCQkJCSAgICAgdTE2IGlkeF9iZWdpbiwgdTE2IGlkeF9lbmQsIGJvb2wgdWNfc2V0LAorCQkJCSAgICAgYm9vbCBibV9zZXQpCiB7CiAJc3RydWN0IG1seHN3X3NwICptbHhzd19zcCA9IG1seHN3X3NwX3BvcnQtPm1seHN3X3NwOwogCXUxNiBsb2NhbF9wb3J0ID0gbWx4c3dfc3BfcG9ydC0+bG9jYWxfcG9ydDsKQEAgLTE4NywyOCArMTg3LDIyIEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJbWx4c3dfcmVnX3NmdHJfcGFjayhzZnRyX3BsLCBNTFhTV19TUF9GTE9PRF9UQUJMRV9VQywgaWR4X2JlZ2luLAotCQkJICAgIHRhYmxlX3R5cGUsIHJhbmdlLCBsb2NhbF9wb3J0LCBzZXQpOworCQkJICAgIHRhYmxlX3R5cGUsIHJhbmdlLCBsb2NhbF9wb3J0LCB1Y19zZXQpOwogCWVyciA9IG1seHN3X3JlZ193cml0ZShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHNmdHIpLCBzZnRyX3BsKTsKIAlpZiAoZXJyKQogCQlnb3RvIGJ1ZmZlcl9vdXQ7CiAKLQkvKiBGbG9vZGluZyBjb250cm9sIGFsbG93cyBvbmUgdG8gZGVjaWRlIHdoZXRoZXIgYSBnaXZlbiBwb3J0IHdpbGwKLQkgKiBmbG9vZCB1bmljYXN0IHRyYWZmaWMgZm9yIHdoaWNoIHRoZXJlIGlzIG5vIEZEQiBlbnRyeS4KLQkgKi8KLQlpZiAob25seV91YykKLQkJZ290byBidWZmZXJfb3V0OwotCiAJbWx4c3dfcmVnX3NmdHJfcGFjayhzZnRyX3BsLCBNTFhTV19TUF9GTE9PRF9UQUJMRV9CTSwgaWR4X2JlZ2luLAotCQkJICAgIHRhYmxlX3R5cGUsIHJhbmdlLCBsb2NhbF9wb3J0LCBzZXQpOworCQkJICAgIHRhYmxlX3R5cGUsIHJhbmdlLCBsb2NhbF9wb3J0LCBibV9zZXQpOwogCWVyciA9IG1seHN3X3JlZ193cml0ZShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHNmdHIpLCBzZnRyX3BsKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9mbG9vZF9ibV9zZXQ7Ci0JZWxzZQotCQlnb3RvIGJ1ZmZlcl9vdXQ7CisKKwlnb3RvIGJ1ZmZlcl9vdXQ7CiAKIGVycl9mbG9vZF9ibV9zZXQ6CiAJbWx4c3dfcmVnX3NmdHJfcGFjayhzZnRyX3BsLCBNTFhTV19TUF9GTE9PRF9UQUJMRV9VQywgaWR4X2JlZ2luLAotCQkJICAgIHRhYmxlX3R5cGUsIHJhbmdlLCBsb2NhbF9wb3J0LCAhc2V0KTsKKwkJCSAgICB0YWJsZV90eXBlLCByYW5nZSwgbG9jYWxfcG9ydCwgIXVjX3NldCk7CiAJbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcoc2Z0ciksIHNmdHJfcGwpOwogYnVmZmVyX291dDoKIAlrZnJlZShzZnRyX3BsKTsKQEAgLTI1NywxNiArMjUxLDQzIEBACiAJICogdGhlIHN0YXJ0IG9mIHRoZSB2RklEcyByYW5nZS4KIAkgKi8KIAl2ZmlkID0gbWx4c3dfc3BfZmlkX3RvX3ZmaWQoZmlkKTsKLQlyZXR1cm4gX19tbHhzd19zcF9wb3J0X2Zsb29kX3NldChtbHhzd19zcF92cG9ydCwgdmZpZCwgdmZpZCwgc2V0LAotCQkJCQkgZmFsc2UpOworCXJldHVybiBfX21seHN3X3NwX3BvcnRfZmxvb2Rfc2V0KG1seHN3X3NwX3Zwb3J0LCB2ZmlkLCB2ZmlkLCBzZXQsIHNldCk7Cit9CisKK3N0YXRpYyBpbnQgbWx4c3dfc3BfcG9ydF9sZWFybmluZ19zZXQoc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQsCisJCQkJICAgICAgYm9vbCBzZXQpCit7CisJdTE2IHZpZDsKKwlpbnQgZXJyOworCisJaWYgKG1seHN3X3NwX3BvcnRfaXNfdnBvcnQobWx4c3dfc3BfcG9ydCkpIHsKKwkJdmlkID0gbWx4c3dfc3BfdnBvcnRfdmlkX2dldChtbHhzd19zcF9wb3J0KTsKKworCQlyZXR1cm4gX19tbHhzd19zcF9wb3J0X3ZpZF9sZWFybmluZ19zZXQobWx4c3dfc3BfcG9ydCwgdmlkLCB2aWQsCisJCQkJCQkJc2V0KTsKKwl9CisKKwlmb3JfZWFjaF9zZXRfYml0KHZpZCwgbWx4c3dfc3BfcG9ydC0+YWN0aXZlX3ZsYW5zLCBWTEFOX05fVklEKSB7CisJCWVyciA9IF9fbWx4c3dfc3BfcG9ydF92aWRfbGVhcm5pbmdfc2V0KG1seHN3X3NwX3BvcnQsIHZpZCwgdmlkLAorCQkJCQkJICAgICAgIHNldCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9wb3J0X3ZpZF9sZWFybmluZ19zZXQ7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9wb3J0X3ZpZF9sZWFybmluZ19zZXQ6CisJZm9yX2VhY2hfc2V0X2JpdCh2aWQsIG1seHN3X3NwX3BvcnQtPmFjdGl2ZV92bGFucywgVkxBTl9OX1ZJRCkKKwkJX19tbHhzd19zcF9wb3J0X3ZpZF9sZWFybmluZ19zZXQobWx4c3dfc3BfcG9ydCwgdmlkLCB2aWQsICFzZXQpOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgbWx4c3dfc3BfcG9ydF9hdHRyX2JyX2ZsYWdzX3NldChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCwKIAkJCQkJICAgc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMsCiAJCQkJCSAgIHVuc2lnbmVkIGxvbmcgYnJwb3J0X2ZsYWdzKQogeworCXVuc2lnbmVkIGxvbmcgbGVhcm5pbmcgPSBtbHhzd19zcF9wb3J0LT5sZWFybmluZyA/IEJSX0xFQVJOSU5HIDogMDsKIAl1bnNpZ25lZCBsb25nIHVjX2Zsb29kID0gbWx4c3dfc3BfcG9ydC0+dWNfZmxvb2QgPyBCUl9GTE9PRCA6IDA7Ci0JYm9vbCBzZXQ7CiAJaW50IGVycjsKIAogCWlmICghbWx4c3dfc3BfcG9ydC0+YnJpZGdlZCkKQEAgLTI3NiwxNyArMjk3LDMwIEBACiAJCXJldHVybiAwOwogCiAJaWYgKCh1Y19mbG9vZCBeIGJycG9ydF9mbGFncykgJiBCUl9GTE9PRCkgewotCQlzZXQgPSBtbHhzd19zcF9wb3J0LT51Y19mbG9vZCA/IGZhbHNlIDogdHJ1ZTsKLQkJZXJyID0gbWx4c3dfc3BfcG9ydF91Y19mbG9vZF9zZXQobWx4c3dfc3BfcG9ydCwgc2V0KTsKKwkJZXJyID0gbWx4c3dfc3BfcG9ydF91Y19mbG9vZF9zZXQobWx4c3dfc3BfcG9ydCwKKwkJCQkJCSAhbWx4c3dfc3BfcG9ydC0+dWNfZmxvb2QpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAl9CiAKKwlpZiAoKGxlYXJuaW5nIF4gYnJwb3J0X2ZsYWdzKSAmIEJSX0xFQVJOSU5HKSB7CisJCWVyciA9IG1seHN3X3NwX3BvcnRfbGVhcm5pbmdfc2V0KG1seHN3X3NwX3BvcnQsCisJCQkJCQkgIW1seHN3X3NwX3BvcnQtPmxlYXJuaW5nKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX3BvcnRfbGVhcm5pbmdfc2V0OworCX0KKwogCW1seHN3X3NwX3BvcnQtPnVjX2Zsb29kID0gYnJwb3J0X2ZsYWdzICYgQlJfRkxPT0QgPyAxIDogMDsKIAltbHhzd19zcF9wb3J0LT5sZWFybmluZyA9IGJycG9ydF9mbGFncyAmIEJSX0xFQVJOSU5HID8gMSA6IDA7CiAJbWx4c3dfc3BfcG9ydC0+bGVhcm5pbmdfc3luYyA9IGJycG9ydF9mbGFncyAmIEJSX0xFQVJOSU5HX1NZTkMgPyAxIDogMDsKIAogCXJldHVybiAwOworCitlcnJfcG9ydF9sZWFybmluZ19zZXQ6CisJaWYgKCh1Y19mbG9vZCBeIGJycG9ydF9mbGFncykgJiBCUl9GTE9PRCkKKwkJbWx4c3dfc3BfcG9ydF91Y19mbG9vZF9zZXQobWx4c3dfc3BfcG9ydCwKKwkJCQkJICAgbWx4c3dfc3BfcG9ydC0+dWNfZmxvb2QpOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgbWx4c3dfc3BfYWdlaW5nX3NldChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwLCB1MzIgYWdlaW5nX3RpbWUpCkBAIC00NTAsNiArNDg0LDggQEAKIAogCWtmcmVlKGYpOwogCisJbWx4c3dfc3BfZmlkX21hcChtbHhzd19zcCwgZmlkLCBmYWxzZSk7CisKIAltbHhzd19zcF9maWRfb3AobWx4c3dfc3AsIGZpZCwgZmFsc2UpOwogfQogCkBAIC00NTgsNiArNDk0LDkgQEAKIHsKIAlzdHJ1Y3QgbWx4c3dfc3BfZmlkICpmOwogCisJaWYgKHRlc3RfYml0KGZpZCwgbWx4c3dfc3BfcG9ydC0+YWN0aXZlX3ZsYW5zKSkKKwkJcmV0dXJuIDA7CisKIAlmID0gbWx4c3dfc3BfZmlkX2ZpbmQobWx4c3dfc3BfcG9ydC0+bWx4c3dfc3AsIGZpZCk7CiAJaWYgKCFmKSB7CiAJCWYgPSBtbHhzd19zcF9maWRfY3JlYXRlKG1seHN3X3NwX3BvcnQtPm1seHN3X3NwLCBmaWQpOwpAQCAtNTE1LDcgKzU1NCw3IEBACiAJfQogCiAJZXJyID0gX19tbHhzd19zcF9wb3J0X2Zsb29kX3NldChtbHhzd19zcF9wb3J0LCBmaWRfYmVnaW4sIGZpZF9lbmQsCi0JCQkJCXRydWUsIGZhbHNlKTsKKwkJCQkJbWx4c3dfc3BfcG9ydC0+dWNfZmxvb2QsIHRydWUpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX3BvcnRfZmxvb2Rfc2V0OwogCkBAIC02MzMsNiArNjcyLDI3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgbWx4c3dfc3BfcG9ydF92aWRfbGVhcm5pbmdfc2V0KHN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0LAorCQkJCQkgIHUxNiB2aWRfYmVnaW4sIHUxNiB2aWRfZW5kLAorCQkJCQkgIGJvb2wgbGVhcm5fZW5hYmxlKQoreworCXUxNiB2aWQsIHZpZF9lOworCWludCBlcnI7CisKKwlmb3IgKHZpZCA9IHZpZF9iZWdpbjsgdmlkIDw9IHZpZF9lbmQ7CisJICAgICB2aWQgKz0gTUxYU1dfUkVHX1NQVk1MUl9SRUNfTUFYX0NPVU5UKSB7CisJCXZpZF9lID0gbWluKCh1MTYpICh2aWQgKyBNTFhTV19SRUdfU1BWTUxSX1JFQ19NQVhfQ09VTlQgLSAxKSwKKwkJCSAgICB2aWRfZW5kKTsKKworCQllcnIgPSBfX21seHN3X3NwX3BvcnRfdmlkX2xlYXJuaW5nX3NldChtbHhzd19zcF9wb3J0LCB2aWQsCisJCQkJCQkgICAgICAgdmlkX2UsIGxlYXJuX2VuYWJsZSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IF9fbWx4c3dfc3BfcG9ydF92bGFuc19hZGQoc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQsCiAJCQkJICAgICB1MTYgdmlkX2JlZ2luLCB1MTYgdmlkX2VuZCwKIAkJCQkgICAgIGJvb2wgZmxhZ191bnRhZ2dlZCwgYm9vbCBmbGFnX3B2aWQpCkBAIC02NzMsNiArNzMzLDE0IEBACiAJCX0KIAl9CiAKKwllcnIgPSBtbHhzd19zcF9wb3J0X3ZpZF9sZWFybmluZ19zZXQobWx4c3dfc3BfcG9ydCwgdmlkX2JlZ2luLCB2aWRfZW5kLAorCQkJCQkgICAgIG1seHN3X3NwX3BvcnQtPmxlYXJuaW5nKTsKKwlpZiAoZXJyKSB7CisJCW5ldGRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHNldCBsZWFybmluZyBmb3IgVklEcyAlZC0lZFxuIiwKKwkJCSAgIHZpZF9iZWdpbiwgdmlkX2VuZCk7CisJCWdvdG8gZXJyX3BvcnRfdmlkX2xlYXJuaW5nX3NldDsKKwl9CisKIAkvKiBDaGFuZ2luZyBhY3Rpdml0eSBiaXRzIG9ubHkgaWYgSFcgb3BlcmF0aW9uIHN1Y2NlZGVkICovCiAJZm9yICh2aWQgPSB2aWRfYmVnaW47IHZpZCA8PSB2aWRfZW5kOyB2aWQrKykgewogCQlzZXRfYml0KHZpZCwgbWx4c3dfc3BfcG9ydC0+YWN0aXZlX3ZsYW5zKTsKQEAgLTY5NSw2ICs3NjMsOSBAQAogZXJyX3BvcnRfc3RwX3N0YXRlX3NldDoKIAlmb3IgKHZpZCA9IHZpZF9iZWdpbjsgdmlkIDw9IHZpZF9lbmQ7IHZpZCsrKQogCQljbGVhcl9iaXQodmlkLCBtbHhzd19zcF9wb3J0LT5hY3RpdmVfdmxhbnMpOworCW1seHN3X3NwX3BvcnRfdmlkX2xlYXJuaW5nX3NldChtbHhzd19zcF9wb3J0LCB2aWRfYmVnaW4sIHZpZF9lbmQsCisJCQkJICAgICAgIGZhbHNlKTsKK2Vycl9wb3J0X3ZpZF9sZWFybmluZ19zZXQ6CiAJaWYgKG9sZF9wdmlkICE9IG1seHN3X3NwX3BvcnQtPnB2aWQpCiAJCW1seHN3X3NwX3BvcnRfcHZpZF9zZXQobWx4c3dfc3BfcG9ydCwgb2xkX3B2aWQpOwogZXJyX3BvcnRfcHZpZF9zZXQ6CkBAIC05NzMsMTEgKzEwNDQsNiBAQAogCQkJCQkgICAgICBTV0lUQ0hERVZfT0JKX1BPUlRfVkxBTihvYmopLAogCQkJCQkgICAgICB0cmFucyk7CiAJCWJyZWFrOwotCWNhc2UgU1dJVENIREVWX09CSl9JRF9JUFY0X0ZJQjoKLQkJZXJyID0gbWx4c3dfc3Bfcm91dGVyX2ZpYjRfYWRkKG1seHN3X3NwX3BvcnQsCi0JCQkJCSAgICAgICBTV0lUQ0hERVZfT0JKX0lQVjRfRklCKG9iaiksCi0JCQkJCSAgICAgICB0cmFucyk7Ci0JCWJyZWFrOwogCWNhc2UgU1dJVENIREVWX09CSl9JRF9QT1JUX0ZEQjoKIAkJZXJyID0gbWx4c3dfc3BfcG9ydF9mZGJfc3RhdGljX2FkZChtbHhzd19zcF9wb3J0LAogCQkJCQkJICAgU1dJVENIREVWX09CSl9QT1JUX0ZEQihvYmopLApAQCAtOTk3LDM4ICsxMDYzLDI1IEBACiB9CiAKIHN0YXRpYyBpbnQgX19tbHhzd19zcF9wb3J0X3ZsYW5zX2RlbChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCwKLQkJCQkgICAgIHUxNiB2aWRfYmVnaW4sIHUxNiB2aWRfZW5kLCBib29sIGluaXQpCisJCQkJICAgICB1MTYgdmlkX2JlZ2luLCB1MTYgdmlkX2VuZCkKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbWx4c3dfc3BfcG9ydC0+ZGV2OwogCXUxNiB2aWQsIHB2aWQ7Ci0JaW50IGVycjsKIAotCWlmICghaW5pdCAmJiAhbWx4c3dfc3BfcG9ydC0+YnJpZGdlZCkKKwlpZiAoIW1seHN3X3NwX3BvcnQtPmJyaWRnZWQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZXJyID0gX19tbHhzd19zcF9wb3J0X3ZsYW5zX3NldChtbHhzd19zcF9wb3J0LCB2aWRfYmVnaW4sIHZpZF9lbmQsCi0JCQkJCWZhbHNlLCBmYWxzZSk7Ci0JaWYgKGVycikgewotCQluZXRkZXZfZXJyKGRldiwgIlVuYWJsZSB0byBkZWwgVklEcyAlZC0lZFxuIiwgdmlkX2JlZ2luLAotCQkJICAgdmlkX2VuZCk7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JaWYgKGluaXQpCi0JCWdvdG8gb3V0OworCW1seHN3X3NwX3BvcnRfdmlkX2xlYXJuaW5nX3NldChtbHhzd19zcF9wb3J0LCB2aWRfYmVnaW4sIHZpZF9lbmQsCisJCQkJICAgICAgIGZhbHNlKTsKIAogCXB2aWQgPSBtbHhzd19zcF9wb3J0LT5wdmlkOwotCWlmIChwdmlkID49IHZpZF9iZWdpbiAmJiBwdmlkIDw9IHZpZF9lbmQpIHsKLQkJZXJyID0gbWx4c3dfc3BfcG9ydF9wdmlkX3NldChtbHhzd19zcF9wb3J0LCAwKTsKLQkJaWYgKGVycikgewotCQkJbmV0ZGV2X2VycihkZXYsICJVbmFibGUgdG8gZGVsIFBWSUQgJWRcbiIsIHB2aWQpOwotCQkJcmV0dXJuIGVycjsKLQkJfQotCX0KKwlpZiAocHZpZCA+PSB2aWRfYmVnaW4gJiYgcHZpZCA8PSB2aWRfZW5kKQorCQltbHhzd19zcF9wb3J0X3B2aWRfc2V0KG1seHN3X3NwX3BvcnQsIDApOworCisJX19tbHhzd19zcF9wb3J0X3ZsYW5zX3NldChtbHhzd19zcF9wb3J0LCB2aWRfYmVnaW4sIHZpZF9lbmQsIGZhbHNlLAorCQkJCSAgZmFsc2UpOwogCiAJbWx4c3dfc3BfcG9ydF9maWRfbGVhdmUobWx4c3dfc3BfcG9ydCwgdmlkX2JlZ2luLCB2aWRfZW5kKTsKIAotb3V0OgogCS8qIENoYW5naW5nIGFjdGl2aXR5IGJpdHMgb25seSBpZiBIVyBvcGVyYXRpb24gc3VjY2VkZWQgKi8KIAlmb3IgKHZpZCA9IHZpZF9iZWdpbjsgdmlkIDw9IHZpZF9lbmQ7IHZpZCsrKQogCQljbGVhcl9iaXQodmlkLCBtbHhzd19zcF9wb3J0LT5hY3RpdmVfdmxhbnMpOwpAQCAtMTAzOSw4ICsxMDkyLDggQEAKIHN0YXRpYyBpbnQgbWx4c3dfc3BfcG9ydF92bGFuc19kZWwoc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQsCiAJCQkJICAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF92bGFuICp2bGFuKQogewotCXJldHVybiBfX21seHN3X3NwX3BvcnRfdmxhbnNfZGVsKG1seHN3X3NwX3BvcnQsCi0JCQkJCSB2bGFuLT52aWRfYmVnaW4sIHZsYW4tPnZpZF9lbmQsIGZhbHNlKTsKKwlyZXR1cm4gX19tbHhzd19zcF9wb3J0X3ZsYW5zX2RlbChtbHhzd19zcF9wb3J0LCB2bGFuLT52aWRfYmVnaW4sCisJCQkJCSB2bGFuLT52aWRfZW5kKTsKIH0KIAogdm9pZCBtbHhzd19zcF9wb3J0X2FjdGl2ZV92bGFuc19kZWwoc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQpCkBAIC0xMDQ4LDcgKzExMDEsNyBAQAogCXUxNiB2aWQ7CiAKIAlmb3JfZWFjaF9zZXRfYml0KHZpZCwgbWx4c3dfc3BfcG9ydC0+YWN0aXZlX3ZsYW5zLCBWTEFOX05fVklEKQotCQlfX21seHN3X3NwX3BvcnRfdmxhbnNfZGVsKG1seHN3X3NwX3BvcnQsIHZpZCwgdmlkLCBmYWxzZSk7CisJCV9fbWx4c3dfc3BfcG9ydF92bGFuc19kZWwobWx4c3dfc3BfcG9ydCwgdmlkLCB2aWQpOwogfQogCiBzdGF0aWMgaW50CkBAIC0xMTIzLDEwICsxMTc2LDYgQEAKIAkJZXJyID0gbWx4c3dfc3BfcG9ydF92bGFuc19kZWwobWx4c3dfc3BfcG9ydCwKIAkJCQkJICAgICAgU1dJVENIREVWX09CSl9QT1JUX1ZMQU4ob2JqKSk7CiAJCWJyZWFrOwotCWNhc2UgU1dJVENIREVWX09CSl9JRF9JUFY0X0ZJQjoKLQkJZXJyID0gbWx4c3dfc3Bfcm91dGVyX2ZpYjRfZGVsKG1seHN3X3NwX3BvcnQsCi0JCQkJCSAgICAgICBTV0lUQ0hERVZfT0JKX0lQVjRfRklCKG9iaikpOwotCQlicmVhazsKIAljYXNlIFNXSVRDSERFVl9PQkpfSURfUE9SVF9GREI6CiAJCWVyciA9IG1seHN3X3NwX3BvcnRfZmRiX3N0YXRpY19kZWwobWx4c3dfc3BfcG9ydCwKIAkJCQkJCSAgIFNXSVRDSERFVl9PQkpfUE9SVF9GREIob2JqKSk7CkBAIC0xMTQ3LDkgKzExOTYsMTEgQEAKIAkJCQkJCSAgIHUxNiBsYWdfaWQpCiB7CiAJc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQ7CisJc3RydWN0IG1seHN3X3Jlc291cmNlcyAqcmVzb3VyY2VzOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE1MWFNXX1NQX1BPUlRfUEVSX0xBR19NQVg7IGkrKykgeworCXJlc291cmNlcyA9IG1seHN3X2NvcmVfcmVzb3VyY2VzX2dldChtbHhzd19zcC0+Y29yZSk7CisJZm9yIChpID0gMDsgaSA8IHJlc291cmNlcy0+bWF4X3BvcnRzX2luX2xhZzsgaSsrKSB7CiAJCW1seHN3X3NwX3BvcnQgPSBtbHhzd19zcF9wb3J0X2xhZ2dlZF9nZXQobWx4c3dfc3AsIGxhZ19pZCwgaSk7CiAJCWlmIChtbHhzd19zcF9wb3J0KQogCQkJcmV0dXJuIG1seHN3X3NwX3BvcnQ7CkBAIC0xMzY4LDggKzE0MTksNiBAQAogCQl2aWQgPSBmaWQ7CiAJfQogCi0JYWRkaW5nID0gYWRkaW5nICYmIG1seHN3X3NwX3BvcnQtPmxlYXJuaW5nOwotCiBkb19mZGJfb3A6CiAJZXJyID0gbWx4c3dfc3BfcG9ydF9mZGJfdWNfb3AobWx4c3dfc3AsIGxvY2FsX3BvcnQsIG1hYywgZmlkLAogCQkJCSAgICAgIGFkZGluZywgdHJ1ZSk7CkBAIC0xNDMxLDggKzE0ODAsNiBAQAogCQl2aWQgPSBmaWQ7CiAJfQogCi0JYWRkaW5nID0gYWRkaW5nICYmIG1seHN3X3NwX3BvcnQtPmxlYXJuaW5nOwotCiBkb19mZGJfb3A6CiAJZXJyID0gbWx4c3dfc3BfcG9ydF9mZGJfdWNfbGFnX29wKG1seHN3X3NwLCBsYWdfaWQsIG1hYywgZmlkLCBsYWdfdmlkLAogCQkJCQkgIGFkZGluZywgdHJ1ZSk7CkBAIC0xNDk4LDIwICsxNTQ1LDE4IEBACiAJbWx4c3dfc3AgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG1seHN3X3NwLCBmZGJfbm90aWZ5LmR3LndvcmspOwogCiAJcnRubF9sb2NrKCk7Ci0JZG8gewotCQltbHhzd19yZWdfc2ZuX3BhY2soc2ZuX3BsKTsKLQkJZXJyID0gbWx4c3dfcmVnX3F1ZXJ5KG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcoc2ZuKSwgc2ZuX3BsKTsKLQkJaWYgKGVycikgewotCQkJZGV2X2Vycl9yYXRlbGltaXRlZChtbHhzd19zcC0+YnVzX2luZm8tPmRldiwgIkZhaWxlZCB0byBnZXQgRkRCIG5vdGlmaWNhdGlvbnNcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJbnVtX3JlYyA9IG1seHN3X3JlZ19zZm5fbnVtX3JlY19nZXQoc2ZuX3BsKTsKLQkJZm9yIChpID0gMDsgaSA8IG51bV9yZWM7IGkrKykKLQkJCW1seHN3X3NwX2ZkYl9ub3RpZnlfcmVjX3Byb2Nlc3MobWx4c3dfc3AsIHNmbl9wbCwgaSk7CisJbWx4c3dfcmVnX3Nmbl9wYWNrKHNmbl9wbCk7CisJZXJyID0gbWx4c3dfcmVnX3F1ZXJ5KG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcoc2ZuKSwgc2ZuX3BsKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQobWx4c3dfc3AtPmJ1c19pbmZvLT5kZXYsICJGYWlsZWQgdG8gZ2V0IEZEQiBub3RpZmljYXRpb25zXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCW51bV9yZWMgPSBtbHhzd19yZWdfc2ZuX251bV9yZWNfZ2V0KHNmbl9wbCk7CisJZm9yIChpID0gMDsgaSA8IG51bV9yZWM7IGkrKykKKwkJbWx4c3dfc3BfZmRiX25vdGlmeV9yZWNfcHJvY2VzcyhtbHhzd19zcCwgc2ZuX3BsLCBpKTsKIAotCX0gd2hpbGUgKG51bV9yZWMpOworb3V0OgogCXJ0bmxfdW5sb2NrKCk7Ci0KIAlrZnJlZShzZm5fcGwpOwogCW1seHN3X3NwX2ZkYl9ub3RpZnlfd29ya19zY2hlZHVsZShtbHhzd19zcCk7CiB9CkBAIC0xNTQ2LDMyICsxNTkxLDYgQEAKIAltbHhzd19zcF9mZGJfZmluaShtbHhzd19zcCk7CiB9CiAKLWludCBtbHhzd19zcF9wb3J0X3ZsYW5faW5pdChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbWx4c3dfc3BfcG9ydC0+ZGV2OwotCWludCBlcnI7Ci0KLQkvKiBBbGxvdyBvbmx5IHVudGFnZ2VkIHBhY2tldHMgdG8gaW5ncmVzcyBhbmQgdGFnIHRoZW0gaW50ZXJuYWxseQotCSAqIHdpdGggVklEIDEuCi0JICovCi0JbWx4c3dfc3BfcG9ydC0+cHZpZCA9IDE7Ci0JZXJyID0gX19tbHhzd19zcF9wb3J0X3ZsYW5zX2RlbChtbHhzd19zcF9wb3J0LCAwLCBWTEFOX05fVklEIC0gMSwKLQkJCQkJdHJ1ZSk7Ci0JaWYgKGVycikgewotCQluZXRkZXZfZXJyKGRldiwgIlVuYWJsZSB0byBpbml0IFZMQU5zXG4iKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQkvKiBBZGQgaW1wbGljaXQgVkxBTiBpbnRlcmZhY2UgaW4gdGhlIGRldmljZSwgc28gdGhhdCB1bnRhZ2dlZAotCSAqIHBhY2tldHMgd2lsbCBiZSBjbGFzc2lmaWVkIHRvIHRoZSBkZWZhdWx0IHZGSUQuCi0JICovCi0JZXJyID0gbWx4c3dfc3BfcG9ydF9hZGRfdmlkKGRldiwgMCwgMSk7Ci0JaWYgKGVycikKLQkJbmV0ZGV2X2VycihkZXYsICJGYWlsZWQgdG8gY29uZmlndXJlIGRlZmF1bHQgdkZJRFxuIik7Ci0KLQlyZXR1cm4gZXJyOwotfQotCiB2b2lkIG1seHN3X3NwX3BvcnRfc3dpdGNoZGV2X2luaXQoc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQpCiB7CiAJbWx4c3dfc3BfcG9ydC0+ZGV2LT5zd2l0Y2hkZXZfb3BzID0gJm1seHN3X3NwX3BvcnRfc3dpdGNoZGV2X29wczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3N3aXRjaHgyLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9zd2l0Y2h4Mi5jCmluZGV4IDM3N2RhYTQuLmMwYzIzZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3N3aXRjaHgyLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3dpdGNoeDIuYwpAQCAtOTk3LDcgKzk5Nyw3IEBACiAJLyogRWFjaCBwYWNrZXQgbmVlZHMgdG8gaGF2ZSBhIFR4IGhlYWRlciAobWV0YWRhdGEpIG9uIHRvcCBhbGwgb3RoZXIKIAkgKiBoZWFkZXJzLgogCSAqLwotCWRldi0+aGFyZF9oZWFkZXJfbGVuICs9IE1MWFNXX1RYSERSX0xFTjsKKwlkZXYtPm5lZWRlZF9oZWFkcm9vbSA9IE1MWFNXX1RYSERSX0xFTjsKIAogCWVyciA9IG1seHN3X3N4X3BvcnRfbW9kdWxlX2NoZWNrKG1seHN3X3N4X3BvcnQsICZ1c2FibGUpOwogCWlmIChlcnIpIHsKQEAgLTE1MTIsMTAgKzE1MTIsNiBAQAogc3RhdGljIHN0cnVjdCBtbHhzd19jb25maWdfcHJvZmlsZSBtbHhzd19zeF9jb25maWdfcHJvZmlsZSA9IHsKIAkudXNlZF9tYXhfdmVwYV9jaGFubmVscwkJPSAxLAogCS5tYXhfdmVwYV9jaGFubmVscwkJPSAwLAotCS51c2VkX21heF9sYWcJCQk9IDEsCi0JLm1heF9sYWcJCQk9IDY0LAotCS51c2VkX21heF9wb3J0X3Blcl9sYWcJCT0gMSwKLQkubWF4X3BvcnRfcGVyX2xhZwkJPSAxNiwKIAkudXNlZF9tYXhfbWlkCQkJPSAxLAogCS5tYXhfbWlkCQkJPSA3MDAwLAogCS51c2VkX21heF9wZ3QJCQk9IDEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy90cmFwLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy90cmFwLmgKaW5kZXggNDcwZDc2OS4uZWQ4ZTMwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvdHJhcC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3RyYXAuaApAQCAtNTYsNiArNTYsMTAgQEAKIAlNTFhTV19UUkFQX0lEX0lHTVBfVjNfUkVQT1JUID0gMHgzNCwKIAlNTFhTV19UUkFQX0lEX0FSUEJDID0gMHg1MCwKIAlNTFhTV19UUkFQX0lEX0FSUFVDID0gMHg1MSwKKwlNTFhTV19UUkFQX0lEX01UVUVSUk9SID0gMHg1MiwKKwlNTFhTV19UUkFQX0lEX1RUTEVSUk9SID0gMHg1MywKKwlNTFhTV19UUkFQX0lEX0xCRVJST1IgPSAweDU0LAorCU1MWFNXX1RSQVBfSURfT1NQRiA9IDB4NTUsCiAJTUxYU1dfVFJBUF9JRF9JUDJNRSA9IDB4NUYsCiAJTUxYU1dfVFJBUF9JRF9SVFJfSU5HUkVTUzAgPSAweDcwLAogCU1MWFNXX1RSQVBfSURfSE9TVF9NSVNTX0lQVjQgPSAweDkwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmF0c2VtaS9uczgzODIwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uYXRzZW1pL25zODM4MjAuYwppbmRleCBlYjgwN2IwLi41NjlhZGU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9uYXRzZW1pL25zODM4MjAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uYXRzZW1pL25zODM4MjAuYwpAQCAtMTM0LDcgKzEzNCw3IEBACiAKIC8qIHR1bmFibGVzICovCiAjZGVmaW5lIFJYX0JVRl9TSVpFCTE1MDAJLyogODE5MiAqLwotI2lmIGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1ZMQU5fODAyMVEpCiAjZGVmaW5lIE5TODM4MjBfVkxBTl9BQ0NFTF9TVVBQT1JUCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvTWFrZWZpbGUKaW5kZXggNjgxNzg4MS4uMGVmYjJiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRyb25vbWUvbmZwL01ha2VmaWxlCkBAIC0zLDYgKzMsMTMgQEAKIG5mcF9uZXR2Zi1vYmpzIDo9IFwKIAkgICAgbmZwX25ldF9jb21tb24ubyBcCiAJICAgIG5mcF9uZXRfZXRodG9vbC5vIFwKKwkgICAgbmZwX25ldF9vZmZsb2FkLm8gXAogCSAgICBuZnBfbmV0dmZfbWFpbi5vCiAKK2lmZXEgKCQoQ09ORklHX0JQRl9TWVNDQUxMKSx5KQorbmZwX25ldHZmLW9ianMgKz0gXAorCSAgICBuZnBfYnBmX3ZlcmlmaWVyLm8gXAorCSAgICBuZnBfYnBmX2ppdC5vCitlbmRpZgorCiBuZnBfbmV0dmYtJChDT05GSUdfTkZQX05FVF9ERUJVRykgKz0gbmZwX25ldF9kZWJ1Z2ZzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX2FzbS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9uZnBfYXNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI0ODRiNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX2FzbS5oCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IE5ldHJvbm9tZSBTeXN0ZW1zLCBJbmMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBMaWNlbnNlIFZlcnNpb24gMiwKKyAqIEp1bmUgMTk5MSBhcyBzaG93biBpbiB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5IG9mIHRoaXMKKyAqIHNvdXJjZSB0cmVlIG9yIHRoZSBCU0QgMi1DbGF1c2UgTGljZW5zZSBwcm92aWRlZCBiZWxvdy4gIFlvdSBoYXZlIHRoZQorICogb3B0aW9uIHRvIGxpY2Vuc2UgdGhpcyBzb2Z0d2FyZSB1bmRlciB0aGUgY29tcGxldGUgdGVybXMgb2YgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogVGhlIEJTRCAyLUNsYXVzZSBMaWNlbnNlOgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfX05GUF9BU01fSF9fCisjZGVmaW5lIF9fTkZQX0FTTV9IX18gMQorCisjaW5jbHVkZSAibmZwX2JwZi5oIgorCisjZGVmaW5lIFJFR19OT05FCTAKKworI2RlZmluZSBSRV9SRUdfTk9fRFNUCTB4MDIwCisjZGVmaW5lIFJFX1JFR19JTU0JMHgwMjAKKyNkZWZpbmUgUkVfUkVHX0lNTV9lbmNvZGUoeCkJCQkJCVwKKwkoUkVfUkVHX0lNTSB8ICgoeCkgJiAweDFmKSB8ICgoKHgpICYgMHg2MCkgPDwgMSkpCisjZGVmaW5lIFJFX1JFR19JTU1fTUFYCSAweDA3ZlVMTAorI2RlZmluZSBSRV9SRUdfWEZSCTB4MDgwCisKKyNkZWZpbmUgVVJfUkVHX1hGUgkweDE4MAorI2RlZmluZSBVUl9SRUdfTk4JMHgyODAKKyNkZWZpbmUgVVJfUkVHX05PX0RTVAkweDMwMAorI2RlZmluZSBVUl9SRUdfSU1NCVVSX1JFR19OT19EU1QKKyNkZWZpbmUgVVJfUkVHX0lNTV9lbmNvZGUoeCkgKFVSX1JFR19JTU0gfCAoeCkpCisjZGVmaW5lIFVSX1JFR19JTU1fTUFYCSAweDBmZlVMTAorCisjZGVmaW5lIE9QX0JSX0JBU0UJMHgwZDgwMDAwMDAyMFVMTAorI2RlZmluZSBPUF9CUl9CQVNFX01BU0sJMHgwZjgwMDBjM2NlMFVMTAorI2RlZmluZSBPUF9CUl9NQVNLCTB4MDAwMDAwMDAwMWZVTEwKKyNkZWZpbmUgT1BfQlJfRVZfUElQCTB4MDAwMDAwMDAzMDBVTEwKKyNkZWZpbmUgT1BfQlJfQ1NTCTB4MDAwMDAwM2MwMDBVTEwKKyNkZWZpbmUgT1BfQlJfREVGQlIJMHgwMDAwMDMwMDAwMFVMTAorI2RlZmluZSBPUF9CUl9BRERSX0xPCTB4MDA3ZmZjMDAwMDBVTEwKKyNkZWZpbmUgT1BfQlJfQUREUl9ISQkweDEwMDAwMDAwMDAwVUxMCisKKyNkZWZpbmUgbmZwX2lzX2JyKF9pbnNuKQkJCQlcCisJKCgoX2luc24pICYgT1BfQlJfQkFTRV9NQVNLKSA9PSBPUF9CUl9CQVNFKQorCitlbnVtIGJyX21hc2sgeworCUJSX0JFUSA9IDB4MDAsCisJQlJfQk5FID0gMHgwMSwKKwlCUl9CSFMgPSAweDA0LAorCUJSX0JMTyA9IDB4MDUsCisJQlJfQkdFID0gMHgwOCwKKwlCUl9VTkMgPSAweDE4LAorfTsKKworZW51bSBicl9ldl9waXAgeworCUJSX0VWX1BJUF9VTkNPTkQgPSAwLAorCUJSX0VWX1BJUF9DT05EID0gMSwKK307CisKK2VudW0gYnJfY3R4X3NpZ25hbF9zdGF0ZSB7CisJQlJfQ1NTX05PTkUgPSAyLAorfTsKKworI2RlZmluZSBPUF9CQllURV9CQVNFCTB4MGM4MDAwMDAwMDBVTEwKKyNkZWZpbmUgT1BfQkJfQV9TUkMJMHgwMDAwMDAwMDBmZlVMTAorI2RlZmluZSBPUF9CQl9CWVRFCTB4MDAwMDAwMDAzMDBVTEwKKyNkZWZpbmUgT1BfQkJfQl9TUkMJMHgwMDAwMDAzZmMwMFVMTAorI2RlZmluZSBPUF9CQl9JOAkweDAwMDAwMDQwMDAwVUxMCisjZGVmaW5lIE9QX0JCX0VRCTB4MDAwMDAwODAwMDBVTEwKKyNkZWZpbmUgT1BfQkJfREVGQlIJMHgwMDAwMDMwMDAwMFVMTAorI2RlZmluZSBPUF9CQl9BRERSX0xPCTB4MDA3ZmZjMDAwMDBVTEwKKyNkZWZpbmUgT1BfQkJfQUREUl9ISQkweDEwMDAwMDAwMDAwVUxMCisKKyNkZWZpbmUgT1BfQkFMVV9CQVNFCTB4MGU4MDAwMDAwMDBVTEwKKyNkZWZpbmUgT1BfQkFfQV9TUkMJMHgwMDAwMDAwMDNmZlVMTAorI2RlZmluZSBPUF9CQV9CX1NSQwkweDAwMDAwMGZmYzAwVUxMCisjZGVmaW5lIE9QX0JBX0RFRkJSCTB4MDAwMDAzMDAwMDBVTEwKKyNkZWZpbmUgT1BfQkFfQUREUl9ISQkweDAwMDdmYzAwMDAwVUxMCisKKyNkZWZpbmUgT1BfSU1NRURfQV9TUkMJMHgwMDAwMDAwMDNmZlVMTAorI2RlZmluZSBPUF9JTU1FRF9CX1NSQwkweDAwMDAwMGZmYzAwVUxMCisjZGVmaW5lIE9QX0lNTUVEX0lNTQkweDAwMDBmZjAwMDAwVUxMCisjZGVmaW5lIE9QX0lNTUVEX1dJRFRICTB4MDAwNjAwMDAwMDBVTEwKKyNkZWZpbmUgT1BfSU1NRURfSU5WCTB4MDAwODAwMDAwMDBVTEwKKyNkZWZpbmUgT1BfSU1NRURfU0hJRlQJMHgwMDYwMDAwMDAwMFVMTAorI2RlZmluZSBPUF9JTU1FRF9CQVNFCTB4MGYwMDAwMDAwMDBVTEwKKyNkZWZpbmUgT1BfSU1NRURfV1JfQUIJMHgyMDAwMDAwMDAwMFVMTAorCitlbnVtIGltbWVkX3dpZHRoIHsKKwlJTU1FRF9XSURUSF9BTEwgPSAwLAorCUlNTUVEX1dJRFRIX0JZVEUgPSAxLAorCUlNTUVEX1dJRFRIX1dPUkQgPSAyLAorfTsKKworZW51bSBpbW1lZF9zaGlmdCB7CisJSU1NRURfU0hJRlRfMEIgPSAwLAorCUlNTUVEX1NISUZUXzFCID0gMSwKKwlJTU1FRF9TSElGVF8yQiA9IDIsCit9OworCisjZGVmaW5lIE9QX1NIRl9CQVNFCTB4MDgwMDAwMDAwMDBVTEwKKyNkZWZpbmUgT1BfU0hGX0FfU1JDCTB4MDAwMDAwMDAwZmZVTEwKKyNkZWZpbmUgT1BfU0hGX1NDCTB4MDAwMDAwMDAzMDBVTEwKKyNkZWZpbmUgT1BfU0hGX0JfU1JDCTB4MDAwMDAwM2ZjMDBVTEwKKyNkZWZpbmUgT1BfU0hGX0k4CTB4MDAwMDAwNDAwMDBVTEwKKyNkZWZpbmUgT1BfU0hGX1NXCTB4MDAwMDAwODAwMDBVTEwKKyNkZWZpbmUgT1BfU0hGX0RTVAkweDAwMDBmZjAwMDAwVUxMCisjZGVmaW5lIE9QX1NIRl9TSElGVAkweDAwMWYwMDAwMDAwVUxMCisjZGVmaW5lIE9QX1NIRl9PUAkweDAwZTAwMDAwMDAwVUxMCisjZGVmaW5lIE9QX1NIRl9EU1RfQUIJMHgwMTAwMDAwMDAwMFVMTAorI2RlZmluZSBPUF9TSEZfV1JfQUIJMHgyMDAwMDAwMDAwMFVMTAorCitlbnVtIHNoZl9vcCB7CisJU0hGX09QX05PTkUgPSAwLAorCVNIRl9PUF9BTkQgPSAyLAorCVNIRl9PUF9PUiA9IDUsCit9OworCitlbnVtIHNoZl9zYyB7CisJU0hGX1NDX1JfUk9UID0gMCwKKwlTSEZfU0NfUl9TSEYgPSAxLAorCVNIRl9TQ19MX1NIRiA9IDIsCisJU0hGX1NDX1JfRFNIRiA9IDMsCit9OworCisjZGVmaW5lIE9QX0FMVV9BX1NSQwkweDAwMDAwMDAwM2ZmVUxMCisjZGVmaW5lIE9QX0FMVV9CX1NSQwkweDAwMDAwMGZmYzAwVUxMCisjZGVmaW5lIE9QX0FMVV9EU1QJMHgwMDAzZmYwMDAwMFVMTAorI2RlZmluZSBPUF9BTFVfU1cJMHgwMDA0MDAwMDAwMFVMTAorI2RlZmluZSBPUF9BTFVfT1AJMHgwMGY4MDAwMDAwMFVMTAorI2RlZmluZSBPUF9BTFVfRFNUX0FCCTB4MDEwMDAwMDAwMDBVTEwKKyNkZWZpbmUgT1BfQUxVX0JBU0UJMHgwYTAwMDAwMDAwMFVMTAorI2RlZmluZSBPUF9BTFVfV1JfQUIJMHgyMDAwMDAwMDAwMFVMTAorCitlbnVtIGFsdV9vcCB7CisJQUxVX09QX05PTkUJPSAweDAwLAorCUFMVV9PUF9BREQJPSAweDAxLAorCUFMVV9PUF9ORUcJPSAweDA0LAorCUFMVV9PUF9BTkQJPSAweDA4LAorCUFMVV9PUF9TVUJfQwk9IDB4MGQsCisJQUxVX09QX0FERF9DCT0gMHgxMSwKKwlBTFVfT1BfT1IJPSAweDE0LAorCUFMVV9PUF9TVUIJPSAweDE1LAorCUFMVV9PUF9YT1IJPSAweDE4LAorfTsKKworZW51bSBhbHVfZHN0X2FiIHsKKwlBTFVfRFNUX0EgPSAwLAorCUFMVV9EU1RfQiA9IDEsCit9OworCisjZGVmaW5lIE9QX0xERl9CQVNFCTB4MGMwMDAwMDAwMDBVTEwKKyNkZWZpbmUgT1BfTERGX0FfU1JDCTB4MDAwMDAwMDAwZmZVTEwKKyNkZWZpbmUgT1BfTERGX1NDCTB4MDAwMDAwMDAzMDBVTEwKKyNkZWZpbmUgT1BfTERGX0JfU1JDCTB4MDAwMDAwM2ZjMDBVTEwKKyNkZWZpbmUgT1BfTERGX0k4CTB4MDAwMDAwNDAwMDBVTEwKKyNkZWZpbmUgT1BfTERGX1NXCTB4MDAwMDAwODAwMDBVTEwKKyNkZWZpbmUgT1BfTERGX1pGCTB4MDAwMDAxMDAwMDBVTEwKKyNkZWZpbmUgT1BfTERGX0JNQVNLCTB4MDAwMGYwMDAwMDBVTEwKKyNkZWZpbmUgT1BfTERGX1NIRgkweDAwMWYwMDAwMDAwVUxMCisjZGVmaW5lIE9QX0xERl9XUl9BQgkweDIwMDAwMDAwMDAwVUxMCisKKyNkZWZpbmUgT1BfQ01EX0FfU1JDCSAweDAwMDAwMDAwMGZmVUxMCisjZGVmaW5lIE9QX0NNRF9DVFgJIDB4MDAwMDAwMDAzMDBVTEwKKyNkZWZpbmUgT1BfQ01EX0JfU1JDCSAweDAwMDAwMDNmYzAwVUxMCisjZGVmaW5lIE9QX0NNRF9UT0tFTgkgMHgwMDAwMDBjMDAwMFVMTAorI2RlZmluZSBPUF9DTURfWEZFUgkgMHgwMDAwMWYwMDAwMFVMTAorI2RlZmluZSBPUF9DTURfQ05UCSAweDAwMDBlMDAwMDAwVUxMCisjZGVmaW5lIE9QX0NNRF9TSUcJIDB4MDAwZjAwMDAwMDBVTEwKKyNkZWZpbmUgT1BfQ01EX1RHVF9DTUQJIDB4MDdmMDAwMDAwMDBVTEwKKyNkZWZpbmUgT1BfQ01EX01PREUJMHgxYzAwMDAwMDAwMDBVTEwKKworc3RydWN0IGNtZF90Z3RfYWN0IHsKKwl1OCB0b2tlbjsKKwl1OCB0Z3RfY21kOworfTsKKworZW51bSBjbWRfdGd0X21hcCB7CisJQ01EX1RHVF9SRUFEOCwKKwlDTURfVEdUX1dSSVRFOCwKKwlDTURfVEdUX1JFQURfTEUsCisJQ01EX1RHVF9SRUFEX1NXQVBfTEUsCisJX19DTURfVEdUX01BUF9TSVpFLAorfTsKKworZW51bSBjbWRfbW9kZSB7CisJQ01EX01PREVfNDBiX0FCCT0gMCwKKwlDTURfTU9ERV80MGJfQkEJPSAxLAorCUNNRF9NT0RFXzMyYgk9IDQsCit9OworCitlbnVtIGNtZF9jdHhfc3dhcCB7CisJQ01EX0NUWF9TV0FQID0gMCwKKwlDTURfQ1RYX05PX1NXQVAgPSAzLAorfTsKKworI2RlZmluZSBPUF9MQ1NSX0JBU0UJMHgwZmMwMDAwMDAwMFVMTAorI2RlZmluZSBPUF9MQ1NSX0FfU1JDCTB4MDAwMDAwMDAzZmZVTEwKKyNkZWZpbmUgT1BfTENTUl9CX1NSQwkweDAwMDAwMGZmYzAwVUxMCisjZGVmaW5lIE9QX0xDU1JfV1JJVEUJMHgwMDAwMDIwMDAwMFVMTAorI2RlZmluZSBPUF9MQ1NSX0FERFIJMHgwMDFmZmMwMDAwMFVMTAorCitlbnVtIGxjc3Jfd3Jfc3JjIHsKKwlMQ1NSX1dSX0FSRUcsCisJTENTUl9XUl9CUkVHLAorCUxDU1JfV1JfSU1NLAorfTsKKworI2RlZmluZSBPUF9DQVJCX0JBU0UJMHgwZTAwMDAwMDAwMFVMTAorI2RlZmluZSBPUF9DQVJCX09SCTB4MDAwMDAwMTAwMDBVTEwKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRyb25vbWUvbmZwL25mcF9icGYuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX2JwZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YWE4YTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRyb25vbWUvbmZwL25mcF9icGYuaApAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBOZXRyb25vbWUgU3lzdGVtcywgSW5jLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgTGljZW5zZSBWZXJzaW9uIDIsCisgKiBKdW5lIDE5OTEgYXMgc2hvd24gaW4gdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeSBvZiB0aGlzCisgKiBzb3VyY2UgdHJlZSBvciB0aGUgQlNEIDItQ2xhdXNlIExpY2Vuc2UgcHJvdmlkZWQgYmVsb3cuICBZb3UgaGF2ZSB0aGUKKyAqIG9wdGlvbiB0byBsaWNlbnNlIHRoaXMgc29mdHdhcmUgdW5kZXIgdGhlIGNvbXBsZXRlIHRlcm1zIG9mIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIFRoZSBCU0QgMi1DbGF1c2UgTGljZW5zZToKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19ORlBfQlBGX0hfXworI2RlZmluZSBfX05GUF9CUEZfSF9fIDEKKworI2luY2x1ZGUgPGxpbnV4L2JpdGZpZWxkLmg+CisjaW5jbHVkZSA8bGludXgvYnBmLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgRklFTERfRklUKG1hc2ssIHZhbCkgICghKCgoKHU2NCl2YWwpIDw8IF9fYmZfc2hmKG1hc2spKSAmIH4obWFzaykpKQorCisvKiBGb3IgYnJhbmNoIGZpeHVwIGxvZ2ljIHVzZSB1cC1tb3N0IGJ5dGUgb2YgYnJhbmNoIGluc3RydWN0aW9uIGFzIHNjcmF0Y2gKKyAqIGFyZWEuICBSZW1lbWJlciB0byBjbGVhciB0aGlzIGJlZm9yZSBzZW5kaW5nIGluc3RydWN0aW9ucyB0byBIVyEKKyAqLworI2RlZmluZSBPUF9CUl9TUEVDSUFMCTB4ZmYwMDAwMDAwMDAwMDAwMFVMTAorCitlbnVtIGJyX3NwZWNpYWwgeworCU9QX0JSX05PUk1BTCA9IDAsCisJT1BfQlJfR09fT1VULAorCU9QX0JSX0dPX0FCT1JULAorfTsKKworZW51bSBzdGF0aWNfcmVncyB7CisJU1RBVElDX1JFR19QS1QJCT0gMSwKKyNkZWZpbmUgUkVHX1BLVF9CQU5LCUFMVV9EU1RfQQorCVNUQVRJQ19SRUdfSU1NCQk9IDIsIC8qIEJhbmsgQUIgKi8KK307CisKK2VudW0gbmZwX2JwZl9hY3Rpb25fdHlwZSB7CisJTk5fQUNUX1RDX0RST1AsCisJTk5fQUNUX1RDX1JFRElSLAorCU5OX0FDVF9ESVJFQ1QsCit9OworCisvKiBTb2Z0d2FyZSByZWdpc3RlciByZXByZXNlbnRhdGlvbiwgaGFyZHdhcmUgZW5jb2RpbmcgaW4gYXNtLmggKi8KKyNkZWZpbmUgTk5fUkVHX1RZUEUJR0VOTUFTSygzMSwgMjQpCisjZGVmaW5lIE5OX1JFR19WQUwJR0VOTUFTSyg3LCAwKQorCitlbnVtIG5mcF9icGZfcmVnX3R5cGUgeworCU5OX1JFR19HUFJfQSA9CUJJVCgwKSwKKwlOTl9SRUdfR1BSX0IgPQlCSVQoMSksCisJTk5fUkVHX05OUiA9CUJJVCgyKSwKKwlOTl9SRUdfWEZFUiA9CUJJVCgzKSwKKwlOTl9SRUdfSU1NID0JQklUKDQpLAorCU5OX1JFR19OT05FID0JQklUKDUpLAorfTsKKworI2RlZmluZSBOTl9SRUdfR1BSX0JPVEgJKE5OX1JFR19HUFJfQSB8IE5OX1JFR19HUFJfQikKKworI2RlZmluZSByZWdfYm90aCh4KQkoKHgpIHwgRklFTERfUFJFUChOTl9SRUdfVFlQRSwgTk5fUkVHX0dQUl9CT1RIKSkKKyNkZWZpbmUgcmVnX2EoeCkJKCh4KSB8IEZJRUxEX1BSRVAoTk5fUkVHX1RZUEUsIE5OX1JFR19HUFJfQSkpCisjZGVmaW5lIHJlZ19iKHgpCSgoeCkgfCBGSUVMRF9QUkVQKE5OX1JFR19UWVBFLCBOTl9SRUdfR1BSX0IpKQorI2RlZmluZSByZWdfbm5yKHgpCSgoeCkgfCBGSUVMRF9QUkVQKE5OX1JFR19UWVBFLCBOTl9SRUdfTk5SKSkKKyNkZWZpbmUgcmVnX3hmZXIoeCkJKCh4KSB8IEZJRUxEX1BSRVAoTk5fUkVHX1RZUEUsIE5OX1JFR19YRkVSKSkKKyNkZWZpbmUgcmVnX2ltbSh4KQkoKHgpIHwgRklFTERfUFJFUChOTl9SRUdfVFlQRSwgTk5fUkVHX0lNTSkpCisjZGVmaW5lIHJlZ19ub25lKCkJKEZJRUxEX1BSRVAoTk5fUkVHX1RZUEUsIE5OX1JFR19OT05FKSkKKworI2RlZmluZSBwa3RfcmVnKG5wKQlyZWdfYSgobnApLT5yZWdzX3Blcl90aHJlYWQgLSBTVEFUSUNfUkVHX1BLVCkKKyNkZWZpbmUgaW1tX2EobnApCXJlZ19hKChucCktPnJlZ3NfcGVyX3RocmVhZCAtIFNUQVRJQ19SRUdfSU1NKQorI2RlZmluZSBpbW1fYihucCkJcmVnX2IoKG5wKS0+cmVnc19wZXJfdGhyZWFkIC0gU1RBVElDX1JFR19JTU0pCisjZGVmaW5lIGltbV9ib3RoKG5wKQlyZWdfYm90aCgobnApLT5yZWdzX3Blcl90aHJlYWQgLSBTVEFUSUNfUkVHX0lNTSkKKworI2RlZmluZSBORlBfQlBGX0FCSV9GTEFHUwlyZWdfbm5yKDApCisjZGVmaW5lICAgTkZQX0JQRl9BQklfRkxBR19NQVJLCTEKKyNkZWZpbmUgTkZQX0JQRl9BQklfTUFSSwlyZWdfbm5yKDEpCisjZGVmaW5lIE5GUF9CUEZfQUJJX1BLVAkJcmVnX25ucigyKQorI2RlZmluZSBORlBfQlBGX0FCSV9MRU4JCXJlZ19ubnIoMykKKworc3RydWN0IG5mcF9wcm9nOworc3RydWN0IG5mcF9pbnNuX21ldGE7Cit0eXBlZGVmIGludCAoKmluc3RyX2NiX3QpKHN0cnVjdCBuZnBfcHJvZyAqLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqKTsKKworI2RlZmluZSBuZnBfcHJvZ19maXJzdF9tZXRhKG5mcF9wcm9nKQkJCQkJXAorCWxpc3RfZmlyc3RfZW50cnkoJihuZnBfcHJvZyktPmluc25zLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSwgbCkKKyNkZWZpbmUgbmZwX3Byb2dfbGFzdF9tZXRhKG5mcF9wcm9nKQkJCQkJXAorCWxpc3RfbGFzdF9lbnRyeSgmKG5mcF9wcm9nKS0+aW5zbnMsIHN0cnVjdCBuZnBfaW5zbl9tZXRhLCBsKQorI2RlZmluZSBuZnBfbWV0YV9uZXh0KG1ldGEpCWxpc3RfbmV4dF9lbnRyeShtZXRhLCBsKQorI2RlZmluZSBuZnBfbWV0YV9wcmV2KG1ldGEpCWxpc3RfcHJldl9lbnRyeShtZXRhLCBsKQorCisvKioKKyAqIHN0cnVjdCBuZnBfaW5zbl9tZXRhIC0gQlBGIGluc3RydWN0aW9uIHdyYXBwZXIKKyAqIEBpbnNuOiBCUEYgaW5zdHJ1Y3Rpb24KKyAqIEBvZmY6IGluZGV4IG9mIGZpcnN0IGdlbmVyYXRlZCBtYWNoaW5lIGluc3RydWN0aW9uIChpbiBuZnBfcHJvZy5wcm9nKQorICogQG46IGVCUEYgaW5zdHJ1Y3Rpb24gbnVtYmVyCisgKiBAc2tpcDogc2tpcCB0aGlzIGluc3RydWN0aW9uIChvcHRpbWl6ZWQgb3V0KQorICogQGRvdWJsZV9jYjogY2FsbGJhY2sgZm9yIHNlY29uZCBwYXJ0IG9mIHRoZSBpbnN0cnVjdGlvbgorICogQGw6IGxpbmsgb24gbmZwX3Byb2ctPmluc25zIGxpc3QKKyAqLworc3RydWN0IG5mcF9pbnNuX21ldGEgeworCXN0cnVjdCBicGZfaW5zbiBpbnNuOworCXVuc2lnbmVkIGludCBvZmY7CisJdW5zaWduZWQgc2hvcnQgbjsKKwlib29sIHNraXA7CisJaW5zdHJfY2JfdCBkb3VibGVfY2I7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGw7Cit9OworCisjZGVmaW5lIEJQRl9TSVpFX01BU0sJMHgxOAorCitzdGF0aWMgaW5saW5lIHU4IG1icGZfY2xhc3MoY29uc3Qgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJcmV0dXJuIEJQRl9DTEFTUyhtZXRhLT5pbnNuLmNvZGUpOworfQorCitzdGF0aWMgaW5saW5lIHU4IG1icGZfc3JjKGNvbnN0IHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCXJldHVybiBCUEZfU1JDKG1ldGEtPmluc24uY29kZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggbWJwZl9vcChjb25zdCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlyZXR1cm4gQlBGX09QKG1ldGEtPmluc24uY29kZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggbWJwZl9tb2RlKGNvbnN0IHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCXJldHVybiBCUEZfTU9ERShtZXRhLT5pbnNuLmNvZGUpOworfQorCisvKioKKyAqIHN0cnVjdCBuZnBfcHJvZyAtIG5mcCBCUEYgcHJvZ3JhbQorICogQHByb2c6IG1hY2hpbmUgY29kZQorICogQHByb2dfbGVuOiBudW1iZXIgb2YgdmFsaWQgaW5zdHJ1Y3Rpb25zIGluIEBwcm9nIGFycmF5CisgKiBAX19wcm9nX2FsbG9jX2xlbjogYWxsb2Mgc2l6ZSBvZiBAcHJvZyBhcnJheQorICogQGFjdDogQlBGIHByb2dyYW0vYWN0aW9uIHR5cGUgKFRDIERBLCBUQyB3aXRoIGFjdGlvbiwgWERQIGV0Yy4pCisgKiBAbnVtX3JlZ3M6IG51bWJlciBvZiByZWdpc3RlcnMgdXNlZCBieSB0aGlzIHByb2dyYW0KKyAqIEByZWdzX3Blcl90aHJlYWQ6IG51bWJlciBvZiBiYXNpYyByZWdpc3RlcnMgYWxsb2NhdGVkIHBlciB0aHJlYWQKKyAqIEBzdGFydF9vZmY6IGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGluc3RydWN0aW9uIGluIHRoZSBtZW1vcnkKKyAqIEB0Z3Rfb3V0OiBqdW1wIHRhcmdldCBmb3Igbm9ybWFsIGV4aXQKKyAqIEB0Z3RfYWJvcnQ6IGp1bXAgdGFyZ2V0IGZvciBhYm9ydCAoZS5nLiBhY2Nlc3Mgb3V0c2lkZSBvZiBwYWNrZXQgYnVmZmVyKQorICogQHRndF9kb25lOiBqdW1wIHRhcmdldCB0byBnZXQgdGhlIG5leHQgcGFja2V0CisgKiBAbl90cmFuc2xhdGVkOiBudW1iZXIgb2Ygc3VjY2Vzc2Z1bGx5IHRyYW5zbGF0ZWQgaW5zdHJ1Y3Rpb25zIChmb3IgZXJyb3JzKQorICogQGVycm9yOiBlcnJvciBjb2RlIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nCisgKiBAaW5zbnM6IGxpc3Qgb2YgQlBGIGluc3RydWN0aW9uIHdyYXBwZXJzIChzdHJ1Y3QgbmZwX2luc25fbWV0YSkKKyAqLworc3RydWN0IG5mcF9wcm9nIHsKKwl1NjQgKnByb2c7CisJdW5zaWduZWQgaW50IHByb2dfbGVuOworCXVuc2lnbmVkIGludCBfX3Byb2dfYWxsb2NfbGVuOworCisJZW51bSBuZnBfYnBmX2FjdGlvbl90eXBlIGFjdDsKKworCXVuc2lnbmVkIGludCBudW1fcmVnczsKKwl1bnNpZ25lZCBpbnQgcmVnc19wZXJfdGhyZWFkOworCisJdW5zaWduZWQgaW50IHN0YXJ0X29mZjsKKwl1bnNpZ25lZCBpbnQgdGd0X291dDsKKwl1bnNpZ25lZCBpbnQgdGd0X2Fib3J0OworCXVuc2lnbmVkIGludCB0Z3RfZG9uZTsKKworCXVuc2lnbmVkIGludCBuX3RyYW5zbGF0ZWQ7CisJaW50IGVycm9yOworCisJc3RydWN0IGxpc3RfaGVhZCBpbnNuczsKK307CisKK3N0cnVjdCBuZnBfYnBmX3Jlc3VsdCB7CisJdW5zaWduZWQgaW50IG5faW5zdHI7CisJYm9vbCBkZW5zZV9tb2RlOworfTsKKworaW50CituZnBfYnBmX2ppdChzdHJ1Y3QgYnBmX3Byb2cgKmZpbHRlciwgdm9pZCAqcHJvZywgZW51bSBuZnBfYnBmX2FjdGlvbl90eXBlIGFjdCwKKwkgICAgdW5zaWduZWQgaW50IHByb2dfc3RhcnQsIHVuc2lnbmVkIGludCBwcm9nX2RvbmUsCisJICAgIHVuc2lnbmVkIGludCBwcm9nX3N6LCBzdHJ1Y3QgbmZwX2JwZl9yZXN1bHQgKnJlcyk7CisKK2ludCBuZnBfcHJvZ192ZXJpZnkoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IGJwZl9wcm9nICpwcm9nKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRyb25vbWUvbmZwL25mcF9icGZfaml0LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRyb25vbWUvbmZwL25mcF9icGZfaml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhkZjUzMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX2JwZl9qaXQuYwpAQCAtMCwwICsxLDE4MTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgTmV0cm9ub21lIFN5c3RlbXMsIEluYy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIExpY2Vuc2UgVmVyc2lvbiAyLAorICogSnVuZSAxOTkxIGFzIHNob3duIGluIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3Rvcnkgb2YgdGhpcworICogc291cmNlIHRyZWUgb3IgdGhlIEJTRCAyLUNsYXVzZSBMaWNlbnNlIHByb3ZpZGVkIGJlbG93LiAgWW91IGhhdmUgdGhlCisgKiBvcHRpb24gdG8gbGljZW5zZSB0aGlzIHNvZnR3YXJlIHVuZGVyIHRoZSBjb21wbGV0ZSB0ZXJtcyBvZiBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBUaGUgQlNEIDItQ2xhdXNlIExpY2Vuc2U6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpCSJORlAgbmV0IGJwZjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2JwZi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L3BrdF9jbHMuaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKworI2luY2x1ZGUgIm5mcF9hc20uaCIKKyNpbmNsdWRlICJuZnBfYnBmLmgiCisKKy8qIC0tLSBORlAgcHJvZyAtLS0gKi8KKy8qIEZvcmVhY2ggIm11bHRpcGxlIiBlbnRyaWVzIG1hY3JvcyBwcm92aWRlIHBvcyBhbmQgbmV4dDxuPiBwb2ludGVycy4KKyAqIEl0J3Mgc2FmZSB0byBtb2RpZnkgdGhlIG5leHQgcG9pbnRlcnMgKGJ1dCBub3QgcG9zKS4KKyAqLworI2RlZmluZSBuZnBfZm9yX2VhY2hfaW5zbl93YWxrMihuZnBfcHJvZywgcG9zLCBuZXh0KQkJCVwKKwlmb3IgKHBvcyA9IGxpc3RfZmlyc3RfZW50cnkoJihuZnBfcHJvZyktPmluc25zLCB0eXBlb2YoKnBvcyksIGwpLCBcCisJICAgICBuZXh0ID0gbGlzdF9uZXh0X2VudHJ5KHBvcywgbCk7CQkJXAorCSAgICAgJihuZnBfcHJvZyktPmluc25zICE9ICZwb3MtPmwgJiYJCQlcCisJICAgICAmKG5mcF9wcm9nKS0+aW5zbnMgIT0gJm5leHQtPmw7CQkJXAorCSAgICAgcG9zID0gbmZwX21ldGFfbmV4dChwb3MpLAkJCQlcCisJICAgICBuZXh0ID0gbmZwX21ldGFfbmV4dChwb3MpKQorCisjZGVmaW5lIG5mcF9mb3JfZWFjaF9pbnNuX3dhbGszKG5mcF9wcm9nLCBwb3MsIG5leHQsIG5leHQyKQkJXAorCWZvciAocG9zID0gbGlzdF9maXJzdF9lbnRyeSgmKG5mcF9wcm9nKS0+aW5zbnMsIHR5cGVvZigqcG9zKSwgbCksIFwKKwkgICAgIG5leHQgPSBsaXN0X25leHRfZW50cnkocG9zLCBsKSwJCQlcCisJICAgICBuZXh0MiA9IGxpc3RfbmV4dF9lbnRyeShuZXh0LCBsKTsJCQlcCisJICAgICAmKG5mcF9wcm9nKS0+aW5zbnMgIT0gJnBvcy0+bCAmJgkJCVwKKwkgICAgICYobmZwX3Byb2cpLT5pbnNucyAhPSAmbmV4dC0+bCAmJgkJCVwKKwkgICAgICYobmZwX3Byb2cpLT5pbnNucyAhPSAmbmV4dDItPmw7CQkJXAorCSAgICAgcG9zID0gbmZwX21ldGFfbmV4dChwb3MpLAkJCQlcCisJICAgICBuZXh0ID0gbmZwX21ldGFfbmV4dChwb3MpLAkJCQlcCisJICAgICBuZXh0MiA9IG5mcF9tZXRhX25leHQobmV4dCkpCisKK3N0YXRpYyBib29sCituZnBfbWV0YV9oYXNfbmV4dChzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlyZXR1cm4gbWV0YS0+bC5uZXh0ICE9ICZuZnBfcHJvZy0+aW5zbnM7Cit9CisKK3N0YXRpYyBib29sCituZnBfbWV0YV9oYXNfcHJldihzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlyZXR1cm4gbWV0YS0+bC5wcmV2ICE9ICZuZnBfcHJvZy0+aW5zbnM7Cit9CisKK3N0YXRpYyB2b2lkIG5mcF9wcm9nX2ZyZWUoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZykKK3sKKwlzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSwgKnRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtZXRhLCB0bXAsICZuZnBfcHJvZy0+aW5zbnMsIGwpIHsKKwkJbGlzdF9kZWwoJm1ldGEtPmwpOworCQlrZnJlZShtZXRhKTsKKwl9CisJa2ZyZWUobmZwX3Byb2cpOworfQorCitzdGF0aWMgdm9pZCBuZnBfcHJvZ19wdXNoKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHU2NCBpbnNuKQoreworCWlmIChuZnBfcHJvZy0+X19wcm9nX2FsbG9jX2xlbiA9PSBuZnBfcHJvZy0+cHJvZ19sZW4pIHsKKwkJbmZwX3Byb2ctPmVycm9yID0gLUVOT1NQQzsKKwkJcmV0dXJuOworCX0KKworCW5mcF9wcm9nLT5wcm9nW25mcF9wcm9nLT5wcm9nX2xlbl0gPSBpbnNuOworCW5mcF9wcm9nLT5wcm9nX2xlbisrOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IG5mcF9wcm9nX2N1cnJlbnRfb2Zmc2V0KHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2cpCit7CisJcmV0dXJuIG5mcF9wcm9nLT5zdGFydF9vZmYgKyBuZnBfcHJvZy0+cHJvZ19sZW47Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK25mcF9wcm9nX29mZnNldF90b19pbmRleChzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXJldHVybiBvZmZzZXQgLSBuZnBfcHJvZy0+c3RhcnRfb2ZmOworfQorCisvKiAtLS0gU1cgcmVnIC0tLSAqLworc3RydWN0IG5mcF9pbnNuX3VyX3JlZ3MgeworCWVudW0gYWx1X2RzdF9hYiBkc3RfYWI7CisJdTE2IGRzdDsKKwl1MTYgYXJlZywgYnJlZzsKKwlib29sIHN3YXA7CisJYm9vbCB3cl9ib3RoOworfTsKKworc3RydWN0IG5mcF9pbnNuX3JlX3JlZ3MgeworCWVudW0gYWx1X2RzdF9hYiBkc3RfYWI7CisJdTggZHN0OworCXU4IGFyZWcsIGJyZWc7CisJYm9vbCBzd2FwOworCWJvb2wgd3JfYm90aDsKKwlib29sIGk4OworfTsKKworc3RhdGljIHUxNiBuZnBfc3dyZWdfdG9fdW5yZWcodTMyIHN3cmVnLCBib29sIGlzX2RzdCkKK3sKKwl1MTYgdmFsID0gRklFTERfR0VUKE5OX1JFR19WQUwsIHN3cmVnKTsKKworCXN3aXRjaCAoRklFTERfR0VUKE5OX1JFR19UWVBFLCBzd3JlZykpIHsKKwljYXNlIE5OX1JFR19HUFJfQToKKwljYXNlIE5OX1JFR19HUFJfQjoKKwljYXNlIE5OX1JFR19HUFJfQk9USDoKKwkJcmV0dXJuIHZhbDsKKwljYXNlIE5OX1JFR19OTlI6CisJCXJldHVybiBVUl9SRUdfTk4gfCB2YWw7CisJY2FzZSBOTl9SRUdfWEZFUjoKKwkJcmV0dXJuIFVSX1JFR19YRlIgfCB2YWw7CisJY2FzZSBOTl9SRUdfSU1NOgorCQlpZiAodmFsICYgfjB4ZmYpIHsKKwkJCXByX2VycigiaW1tZWRpYXRlIHRvbyBsYXJnZVxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gVVJfUkVHX0lNTV9lbmNvZGUodmFsKTsKKwljYXNlIE5OX1JFR19OT05FOgorCQlyZXR1cm4gaXNfZHN0ID8gVVJfUkVHX05PX0RTVCA6IFJFR19OT05FOworCWRlZmF1bHQ6CisJCXByX2VycigidW5yZWNvZ25pemVkIHJlZyBlbmNvZGluZyAlMDh4XG4iLCBzd3JlZyk7CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGludAorc3dyZWdfdG9fdW5yZXN0cmljdGVkKHUzMiBkc3QsIHUzMiBscmVnLCB1MzIgcnJlZywgc3RydWN0IG5mcF9pbnNuX3VyX3JlZ3MgKnJlZykKK3sKKwltZW1zZXQocmVnLCAwLCBzaXplb2YoKnJlZykpOworCisJLyogRGVjb2RlIGRlc3RpbmF0aW9uICovCisJaWYgKEZJRUxEX0dFVChOTl9SRUdfVFlQRSwgZHN0KSA9PSBOTl9SRUdfSU1NKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChGSUVMRF9HRVQoTk5fUkVHX1RZUEUsIGRzdCkgPT0gTk5fUkVHX0dQUl9CKQorCQlyZWctPmRzdF9hYiA9IEFMVV9EU1RfQjsKKwlpZiAoRklFTERfR0VUKE5OX1JFR19UWVBFLCBkc3QpID09IE5OX1JFR19HUFJfQk9USCkKKwkJcmVnLT53cl9ib3RoID0gdHJ1ZTsKKwlyZWctPmRzdCA9IG5mcF9zd3JlZ190b191bnJlZyhkc3QsIHRydWUpOworCisJLyogRGVjb2RlIHNvdXJjZSBvcGVyYW5kcyAqLworCWlmIChGSUVMRF9HRVQoTk5fUkVHX1RZUEUsIGxyZWcpID09IEZJRUxEX0dFVChOTl9SRUdfVFlQRSwgcnJlZykpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKEZJRUxEX0dFVChOTl9SRUdfVFlQRSwgbHJlZykgPT0gTk5fUkVHX0dQUl9CIHx8CisJICAgIEZJRUxEX0dFVChOTl9SRUdfVFlQRSwgcnJlZykgPT0gTk5fUkVHX0dQUl9BKSB7CisJCXJlZy0+YXJlZyA9IG5mcF9zd3JlZ190b191bnJlZyhycmVnLCBmYWxzZSk7CisJCXJlZy0+YnJlZyA9IG5mcF9zd3JlZ190b191bnJlZyhscmVnLCBmYWxzZSk7CisJCXJlZy0+c3dhcCA9IHRydWU7CisJfSBlbHNlIHsKKwkJcmVnLT5hcmVnID0gbmZwX3N3cmVnX3RvX3VucmVnKGxyZWcsIGZhbHNlKTsKKwkJcmVnLT5icmVnID0gbmZwX3N3cmVnX3RvX3VucmVnKHJyZWcsIGZhbHNlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUxNiBuZnBfc3dyZWdfdG9fcmVyZWcodTMyIHN3cmVnLCBib29sIGlzX2RzdCwgYm9vbCBoYXNfaW1tOCwgYm9vbCAqaTgpCit7CisJdTE2IHZhbCA9IEZJRUxEX0dFVChOTl9SRUdfVkFMLCBzd3JlZyk7CisKKwlzd2l0Y2ggKEZJRUxEX0dFVChOTl9SRUdfVFlQRSwgc3dyZWcpKSB7CisJY2FzZSBOTl9SRUdfR1BSX0E6CisJY2FzZSBOTl9SRUdfR1BSX0I6CisJY2FzZSBOTl9SRUdfR1BSX0JPVEg6CisJCXJldHVybiB2YWw7CisJY2FzZSBOTl9SRUdfWEZFUjoKKwkJcmV0dXJuIFJFX1JFR19YRlIgfCB2YWw7CisJY2FzZSBOTl9SRUdfSU1NOgorCQlpZiAodmFsICYgfigweDdmIHwgaGFzX2ltbTggPDwgNykpIHsKKwkJCXByX2VycigiaW1tZWRpYXRlIHRvbyBsYXJnZVxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkqaTggPSB2YWwgJiAweDgwOworCQlyZXR1cm4gUkVfUkVHX0lNTV9lbmNvZGUodmFsICYgMHg3Zik7CisJY2FzZSBOTl9SRUdfTk9ORToKKwkJcmV0dXJuIGlzX2RzdCA/IFJFX1JFR19OT19EU1QgOiBSRUdfTk9ORTsKKwlkZWZhdWx0OgorCQlwcl9lcnIoInVucmVjb2duaXplZCByZWcgZW5jb2RpbmdcbiIpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3N3cmVnX3RvX3Jlc3RyaWN0ZWQodTMyIGRzdCwgdTMyIGxyZWcsIHUzMiBycmVnLCBzdHJ1Y3QgbmZwX2luc25fcmVfcmVncyAqcmVnLAorCQkgICAgYm9vbCBoYXNfaW1tOCkKK3sKKwltZW1zZXQocmVnLCAwLCBzaXplb2YoKnJlZykpOworCisJLyogRGVjb2RlIGRlc3RpbmF0aW9uICovCisJaWYgKEZJRUxEX0dFVChOTl9SRUdfVFlQRSwgZHN0KSA9PSBOTl9SRUdfSU1NKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChGSUVMRF9HRVQoTk5fUkVHX1RZUEUsIGRzdCkgPT0gTk5fUkVHX0dQUl9CKQorCQlyZWctPmRzdF9hYiA9IEFMVV9EU1RfQjsKKwlpZiAoRklFTERfR0VUKE5OX1JFR19UWVBFLCBkc3QpID09IE5OX1JFR19HUFJfQk9USCkKKwkJcmVnLT53cl9ib3RoID0gdHJ1ZTsKKwlyZWctPmRzdCA9IG5mcF9zd3JlZ190b19yZXJlZyhkc3QsIHRydWUsIGZhbHNlLCBOVUxMKTsKKworCS8qIERlY29kZSBzb3VyY2Ugb3BlcmFuZHMgKi8KKwlpZiAoRklFTERfR0VUKE5OX1JFR19UWVBFLCBscmVnKSA9PSBGSUVMRF9HRVQoTk5fUkVHX1RZUEUsIHJyZWcpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChGSUVMRF9HRVQoTk5fUkVHX1RZUEUsIGxyZWcpID09IE5OX1JFR19HUFJfQiB8fAorCSAgICBGSUVMRF9HRVQoTk5fUkVHX1RZUEUsIHJyZWcpID09IE5OX1JFR19HUFJfQSkgeworCQlyZWctPmFyZWcgPSBuZnBfc3dyZWdfdG9fcmVyZWcocnJlZywgZmFsc2UsIGhhc19pbW04LCAmcmVnLT5pOCk7CisJCXJlZy0+YnJlZyA9IG5mcF9zd3JlZ190b19yZXJlZyhscmVnLCBmYWxzZSwgaGFzX2ltbTgsICZyZWctPmk4KTsKKwkJcmVnLT5zd2FwID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlyZWctPmFyZWcgPSBuZnBfc3dyZWdfdG9fcmVyZWcobHJlZywgZmFsc2UsIGhhc19pbW04LCAmcmVnLT5pOCk7CisJCXJlZy0+YnJlZyA9IG5mcF9zd3JlZ190b19yZXJlZyhycmVnLCBmYWxzZSwgaGFzX2ltbTgsICZyZWctPmk4KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tIEVtaXR0ZXJzIC0tLSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjbWRfdGd0X2FjdCBjbWRfdGd0X2FjdFtfX0NNRF9UR1RfTUFQX1NJWkVdID0geworCVtDTURfVEdUX1dSSVRFOF0gPQkJeyAweDAwLCAweDQyIH0sCisJW0NNRF9UR1RfUkVBRDhdID0JCXsgMHgwMSwgMHg0MyB9LAorCVtDTURfVEdUX1JFQURfTEVdID0JCXsgMHgwMSwgMHg0MCB9LAorCVtDTURfVEdUX1JFQURfU1dBUF9MRV0gPQl7IDB4MDMsIDB4NDAgfSwKK307CisKK3N0YXRpYyB2b2lkCitfX2VtaXRfY21kKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIGVudW0gY21kX3RndF9tYXAgb3AsCisJICAgdTggbW9kZSwgdTggeGZlciwgdTggYXJlZywgdTggYnJlZywgdTggc2l6ZSwgYm9vbCBzeW5jKQoreworCWVudW0gY21kX2N0eF9zd2FwIGN0eDsKKwl1NjQgaW5zbjsKKworCWlmIChzeW5jKQorCQljdHggPSBDTURfQ1RYX1NXQVA7CisJZWxzZQorCQljdHggPSBDTURfQ1RYX05PX1NXQVA7CisKKwlpbnNuID0JRklFTERfUFJFUChPUF9DTURfQV9TUkMsIGFyZWcpIHwKKwkJRklFTERfUFJFUChPUF9DTURfQ1RYLCBjdHgpIHwKKwkJRklFTERfUFJFUChPUF9DTURfQl9TUkMsIGJyZWcpIHwKKwkJRklFTERfUFJFUChPUF9DTURfVE9LRU4sIGNtZF90Z3RfYWN0W29wXS50b2tlbikgfAorCQlGSUVMRF9QUkVQKE9QX0NNRF9YRkVSLCB4ZmVyKSB8CisJCUZJRUxEX1BSRVAoT1BfQ01EX0NOVCwgc2l6ZSkgfAorCQlGSUVMRF9QUkVQKE9QX0NNRF9TSUcsIHN5bmMpIHwKKwkJRklFTERfUFJFUChPUF9DTURfVEdUX0NNRCwgY21kX3RndF9hY3Rbb3BdLnRndF9jbWQpIHwKKwkJRklFTERfUFJFUChPUF9DTURfTU9ERSwgbW9kZSk7CisKKwluZnBfcHJvZ19wdXNoKG5mcF9wcm9nLCBpbnNuKTsKK30KKworc3RhdGljIHZvaWQKK2VtaXRfY21kKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIGVudW0gY21kX3RndF9tYXAgb3AsCisJIHU4IG1vZGUsIHU4IHhmZXIsIHUzMiBscmVnLCB1MzIgcnJlZywgdTggc2l6ZSwgYm9vbCBzeW5jKQoreworCXN0cnVjdCBuZnBfaW5zbl9yZV9yZWdzIHJlZzsKKwlpbnQgZXJyOworCisJZXJyID0gc3dyZWdfdG9fcmVzdHJpY3RlZChyZWdfbm9uZSgpLCBscmVnLCBycmVnLCAmcmVnLCBmYWxzZSk7CisJaWYgKGVycikgeworCQluZnBfcHJvZy0+ZXJyb3IgPSBlcnI7CisJCXJldHVybjsKKwl9CisJaWYgKHJlZy5zd2FwKSB7CisJCXByX2VycigiY21kIGNhbid0IHN3YXAgYXJndW1lbnRzXG4iKTsKKwkJbmZwX3Byb2ctPmVycm9yID0gLUVGQVVMVDsKKwkJcmV0dXJuOworCX0KKworCV9fZW1pdF9jbWQobmZwX3Byb2csIG9wLCBtb2RlLCB4ZmVyLCByZWcuYXJlZywgcmVnLmJyZWcsIHNpemUsIHN5bmMpOworfQorCitzdGF0aWMgdm9pZAorX19lbWl0X2JyKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIGVudW0gYnJfbWFzayBtYXNrLCBlbnVtIGJyX2V2X3BpcCBldl9waXAsCisJICBlbnVtIGJyX2N0eF9zaWduYWxfc3RhdGUgY3NzLCB1MTYgYWRkciwgdTggZGVmZXIpCit7CisJdTE2IGFkZHJfbG8sIGFkZHJfaGk7CisJdTY0IGluc247CisKKwlhZGRyX2xvID0gYWRkciAmIChPUF9CUl9BRERSX0xPID4+IF9fYmZfc2hmKE9QX0JSX0FERFJfTE8pKTsKKwlhZGRyX2hpID0gYWRkciAhPSBhZGRyX2xvOworCisJaW5zbiA9IE9QX0JSX0JBU0UgfAorCQlGSUVMRF9QUkVQKE9QX0JSX01BU0ssIG1hc2spIHwKKwkJRklFTERfUFJFUChPUF9CUl9FVl9QSVAsIGV2X3BpcCkgfAorCQlGSUVMRF9QUkVQKE9QX0JSX0NTUywgY3NzKSB8CisJCUZJRUxEX1BSRVAoT1BfQlJfREVGQlIsIGRlZmVyKSB8CisJCUZJRUxEX1BSRVAoT1BfQlJfQUREUl9MTywgYWRkcl9sbykgfAorCQlGSUVMRF9QUkVQKE9QX0JSX0FERFJfSEksIGFkZHJfaGkpOworCisJbmZwX3Byb2dfcHVzaChuZnBfcHJvZywgaW5zbik7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfYnJfZGVmKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHUxNiBhZGRyLCB1OCBkZWZlcikKK3sKKwlpZiAoZGVmZXIgPiAyKSB7CisJCXByX2VycigiQlVHOiBicmFuY2ggZGVmZXIgb3V0IG9mIGJvdW5kcyAlZFxuIiwgZGVmZXIpOworCQluZnBfcHJvZy0+ZXJyb3IgPSAtRUZBVUxUOworCQlyZXR1cm47CisJfQorCV9fZW1pdF9icihuZnBfcHJvZywgQlJfVU5DLCBCUl9FVl9QSVBfVU5DT05ELCBCUl9DU1NfTk9ORSwgYWRkciwgZGVmZXIpOworfQorCitzdGF0aWMgdm9pZAorZW1pdF9icihzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBlbnVtIGJyX21hc2sgbWFzaywgdTE2IGFkZHIsIHU4IGRlZmVyKQoreworCV9fZW1pdF9icihuZnBfcHJvZywgbWFzaywKKwkJICBtYXNrICE9IEJSX1VOQyA/IEJSX0VWX1BJUF9DT05EIDogQlJfRVZfUElQX1VOQ09ORCwKKwkJICBCUl9DU1NfTk9ORSwgYWRkciwgZGVmZXIpOworfQorCitzdGF0aWMgdm9pZAorX19lbWl0X2JyX2J5dGUoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgdTggYXJlZywgdTggYnJlZywgYm9vbCBpbW04LAorCSAgICAgICB1OCBieXRlLCBib29sIGVxdWFsLCB1MTYgYWRkciwgdTggZGVmZXIpCit7CisJdTE2IGFkZHJfbG8sIGFkZHJfaGk7CisJdTY0IGluc247CisKKwlhZGRyX2xvID0gYWRkciAmIChPUF9CQl9BRERSX0xPID4+IF9fYmZfc2hmKE9QX0JCX0FERFJfTE8pKTsKKwlhZGRyX2hpID0gYWRkciAhPSBhZGRyX2xvOworCisJaW5zbiA9IE9QX0JCWVRFX0JBU0UgfAorCQlGSUVMRF9QUkVQKE9QX0JCX0FfU1JDLCBhcmVnKSB8CisJCUZJRUxEX1BSRVAoT1BfQkJfQllURSwgYnl0ZSkgfAorCQlGSUVMRF9QUkVQKE9QX0JCX0JfU1JDLCBicmVnKSB8CisJCUZJRUxEX1BSRVAoT1BfQkJfSTgsIGltbTgpIHwKKwkJRklFTERfUFJFUChPUF9CQl9FUSwgZXF1YWwpIHwKKwkJRklFTERfUFJFUChPUF9CQl9ERUZCUiwgZGVmZXIpIHwKKwkJRklFTERfUFJFUChPUF9CQl9BRERSX0xPLCBhZGRyX2xvKSB8CisJCUZJRUxEX1BSRVAoT1BfQkJfQUREUl9ISSwgYWRkcl9oaSk7CisKKwluZnBfcHJvZ19wdXNoKG5mcF9wcm9nLCBpbnNuKTsKK30KKworc3RhdGljIHZvaWQKK2VtaXRfYnJfYnl0ZV9uZXEoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywKKwkJIHUzMiBkc3QsIHU4IGltbSwgdTggYnl0ZSwgdTE2IGFkZHIsIHU4IGRlZmVyKQoreworCXN0cnVjdCBuZnBfaW5zbl9yZV9yZWdzIHJlZzsKKwlpbnQgZXJyOworCisJZXJyID0gc3dyZWdfdG9fcmVzdHJpY3RlZChyZWdfbm9uZSgpLCBkc3QsIHJlZ19pbW0oaW1tKSwgJnJlZywgdHJ1ZSk7CisJaWYgKGVycikgeworCQluZnBfcHJvZy0+ZXJyb3IgPSBlcnI7CisJCXJldHVybjsKKwl9CisKKwlfX2VtaXRfYnJfYnl0ZShuZnBfcHJvZywgcmVnLmFyZWcsIHJlZy5icmVnLCByZWcuaTgsIGJ5dGUsIGZhbHNlLCBhZGRyLAorCQkgICAgICAgZGVmZXIpOworfQorCitzdGF0aWMgdm9pZAorX19lbWl0X2ltbWVkKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHUxNiBhcmVnLCB1MTYgYnJlZywgdTE2IGltbV9oaSwKKwkgICAgIGVudW0gaW1tZWRfd2lkdGggd2lkdGgsIGJvb2wgaW52ZXJ0LAorCSAgICAgZW51bSBpbW1lZF9zaGlmdCBzaGlmdCwgYm9vbCB3cl9ib3RoKQoreworCXU2NCBpbnNuOworCisJaW5zbiA9IE9QX0lNTUVEX0JBU0UgfAorCQlGSUVMRF9QUkVQKE9QX0lNTUVEX0FfU1JDLCBhcmVnKSB8CisJCUZJRUxEX1BSRVAoT1BfSU1NRURfQl9TUkMsIGJyZWcpIHwKKwkJRklFTERfUFJFUChPUF9JTU1FRF9JTU0sIGltbV9oaSkgfAorCQlGSUVMRF9QUkVQKE9QX0lNTUVEX1dJRFRILCB3aWR0aCkgfAorCQlGSUVMRF9QUkVQKE9QX0lNTUVEX0lOViwgaW52ZXJ0KSB8CisJCUZJRUxEX1BSRVAoT1BfSU1NRURfU0hJRlQsIHNoaWZ0KSB8CisJCUZJRUxEX1BSRVAoT1BfSU1NRURfV1JfQUIsIHdyX2JvdGgpOworCisJbmZwX3Byb2dfcHVzaChuZnBfcHJvZywgaW5zbik7Cit9CisKK3N0YXRpYyB2b2lkCitlbWl0X2ltbWVkKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHUzMiBkc3QsIHUxNiBpbW0sCisJICAgZW51bSBpbW1lZF93aWR0aCB3aWR0aCwgYm9vbCBpbnZlcnQsIGVudW0gaW1tZWRfc2hpZnQgc2hpZnQpCit7CisJc3RydWN0IG5mcF9pbnNuX3VyX3JlZ3MgcmVnOworCWludCBlcnI7CisKKwlpZiAoRklFTERfR0VUKE5OX1JFR19UWVBFLCBkc3QpID09IE5OX1JFR19JTU0pIHsKKwkJbmZwX3Byb2ctPmVycm9yID0gLUVGQVVMVDsKKwkJcmV0dXJuOworCX0KKworCWVyciA9IHN3cmVnX3RvX3VucmVzdHJpY3RlZChkc3QsIGRzdCwgcmVnX2ltbShpbW0gJiAweGZmKSwgJnJlZyk7CisJaWYgKGVycikgeworCQluZnBfcHJvZy0+ZXJyb3IgPSBlcnI7CisJCXJldHVybjsKKwl9CisKKwlfX2VtaXRfaW1tZWQobmZwX3Byb2csIHJlZy5hcmVnLCByZWcuYnJlZywgaW1tID4+IDgsIHdpZHRoLAorCQkgICAgIGludmVydCwgc2hpZnQsIHJlZy53cl9ib3RoKTsKK30KKworc3RhdGljIHZvaWQKK19fZW1pdF9zaGYoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgdTE2IGRzdCwgZW51bSBhbHVfZHN0X2FiIGRzdF9hYiwKKwkgICBlbnVtIHNoZl9zYyBzYywgdTggc2hpZnQsCisJICAgdTE2IGFyZWcsIGVudW0gc2hmX29wIG9wLCB1MTYgYnJlZywgYm9vbCBpOCwgYm9vbCBzdywgYm9vbCB3cl9ib3RoKQoreworCXU2NCBpbnNuOworCisJaWYgKCFGSUVMRF9GSVQoT1BfU0hGX1NISUZULCBzaGlmdCkpIHsKKwkJbmZwX3Byb2ctPmVycm9yID0gLUVGQVVMVDsKKwkJcmV0dXJuOworCX0KKworCWlmIChzYyA9PSBTSEZfU0NfTF9TSEYpCisJCXNoaWZ0ID0gMzIgLSBzaGlmdDsKKworCWluc24gPSBPUF9TSEZfQkFTRSB8CisJCUZJRUxEX1BSRVAoT1BfU0hGX0FfU1JDLCBhcmVnKSB8CisJCUZJRUxEX1BSRVAoT1BfU0hGX1NDLCBzYykgfAorCQlGSUVMRF9QUkVQKE9QX1NIRl9CX1NSQywgYnJlZykgfAorCQlGSUVMRF9QUkVQKE9QX1NIRl9JOCwgaTgpIHwKKwkJRklFTERfUFJFUChPUF9TSEZfU1csIHN3KSB8CisJCUZJRUxEX1BSRVAoT1BfU0hGX0RTVCwgZHN0KSB8CisJCUZJRUxEX1BSRVAoT1BfU0hGX1NISUZULCBzaGlmdCkgfAorCQlGSUVMRF9QUkVQKE9QX1NIRl9PUCwgb3ApIHwKKwkJRklFTERfUFJFUChPUF9TSEZfRFNUX0FCLCBkc3RfYWIpIHwKKwkJRklFTERfUFJFUChPUF9TSEZfV1JfQUIsIHdyX2JvdGgpOworCisJbmZwX3Byb2dfcHVzaChuZnBfcHJvZywgaW5zbik7Cit9CisKK3N0YXRpYyB2b2lkCitlbWl0X3NoZihzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCB1MzIgZHN0LCB1MzIgbHJlZywgZW51bSBzaGZfb3Agb3AsIHUzMiBycmVnLAorCSBlbnVtIHNoZl9zYyBzYywgdTggc2hpZnQpCit7CisJc3RydWN0IG5mcF9pbnNuX3JlX3JlZ3MgcmVnOworCWludCBlcnI7CisKKwllcnIgPSBzd3JlZ190b19yZXN0cmljdGVkKGRzdCwgbHJlZywgcnJlZywgJnJlZywgdHJ1ZSk7CisJaWYgKGVycikgeworCQluZnBfcHJvZy0+ZXJyb3IgPSBlcnI7CisJCXJldHVybjsKKwl9CisKKwlfX2VtaXRfc2hmKG5mcF9wcm9nLCByZWcuZHN0LCByZWcuZHN0X2FiLCBzYywgc2hpZnQsCisJCSAgIHJlZy5hcmVnLCBvcCwgcmVnLmJyZWcsIHJlZy5pOCwgcmVnLnN3YXAsIHJlZy53cl9ib3RoKTsKK30KKworc3RhdGljIHZvaWQKK19fZW1pdF9hbHUoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgdTE2IGRzdCwgZW51bSBhbHVfZHN0X2FiIGRzdF9hYiwKKwkgICB1MTYgYXJlZywgZW51bSBhbHVfb3Agb3AsIHUxNiBicmVnLCBib29sIHN3YXAsIGJvb2wgd3JfYm90aCkKK3sKKwl1NjQgaW5zbjsKKworCWluc24gPSBPUF9BTFVfQkFTRSB8CisJCUZJRUxEX1BSRVAoT1BfQUxVX0FfU1JDLCBhcmVnKSB8CisJCUZJRUxEX1BSRVAoT1BfQUxVX0JfU1JDLCBicmVnKSB8CisJCUZJRUxEX1BSRVAoT1BfQUxVX0RTVCwgZHN0KSB8CisJCUZJRUxEX1BSRVAoT1BfQUxVX1NXLCBzd2FwKSB8CisJCUZJRUxEX1BSRVAoT1BfQUxVX09QLCBvcCkgfAorCQlGSUVMRF9QUkVQKE9QX0FMVV9EU1RfQUIsIGRzdF9hYikgfAorCQlGSUVMRF9QUkVQKE9QX0FMVV9XUl9BQiwgd3JfYm90aCk7CisKKwluZnBfcHJvZ19wdXNoKG5mcF9wcm9nLCBpbnNuKTsKK30KKworc3RhdGljIHZvaWQKK2VtaXRfYWx1KHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHUzMiBkc3QsIHUzMiBscmVnLCBlbnVtIGFsdV9vcCBvcCwgdTMyIHJyZWcpCit7CisJc3RydWN0IG5mcF9pbnNuX3VyX3JlZ3MgcmVnOworCWludCBlcnI7CisKKwllcnIgPSBzd3JlZ190b191bnJlc3RyaWN0ZWQoZHN0LCBscmVnLCBycmVnLCAmcmVnKTsKKwlpZiAoZXJyKSB7CisJCW5mcF9wcm9nLT5lcnJvciA9IGVycjsKKwkJcmV0dXJuOworCX0KKworCV9fZW1pdF9hbHUobmZwX3Byb2csIHJlZy5kc3QsIHJlZy5kc3RfYWIsCisJCSAgIHJlZy5hcmVnLCBvcCwgcmVnLmJyZWcsIHJlZy5zd2FwLCByZWcud3JfYm90aCk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2VtaXRfbGRfZmllbGQoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgZW51bSBzaGZfc2Mgc2MsCisJCXU4IGFyZWcsIHU4IGJtYXNrLCB1OCBicmVnLCB1OCBzaGlmdCwgYm9vbCBpbW04LAorCQlib29sIHplcm8sIGJvb2wgc3dhcCwgYm9vbCB3cl9ib3RoKQoreworCXU2NCBpbnNuOworCisJaW5zbiA9IE9QX0xERl9CQVNFIHwKKwkJRklFTERfUFJFUChPUF9MREZfQV9TUkMsIGFyZWcpIHwKKwkJRklFTERfUFJFUChPUF9MREZfU0MsIHNjKSB8CisJCUZJRUxEX1BSRVAoT1BfTERGX0JfU1JDLCBicmVnKSB8CisJCUZJRUxEX1BSRVAoT1BfTERGX0k4LCBpbW04KSB8CisJCUZJRUxEX1BSRVAoT1BfTERGX1NXLCBzd2FwKSB8CisJCUZJRUxEX1BSRVAoT1BfTERGX1pGLCB6ZXJvKSB8CisJCUZJRUxEX1BSRVAoT1BfTERGX0JNQVNLLCBibWFzaykgfAorCQlGSUVMRF9QUkVQKE9QX0xERl9TSEYsIHNoaWZ0KSB8CisJCUZJRUxEX1BSRVAoT1BfTERGX1dSX0FCLCB3cl9ib3RoKTsKKworCW5mcF9wcm9nX3B1c2gobmZwX3Byb2csIGluc24pOworfQorCitzdGF0aWMgdm9pZAorZW1pdF9sZF9maWVsZF9hbnkoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgZW51bSBzaGZfc2Mgc2MsIHU4IHNoaWZ0LAorCQkgIHUzMiBkc3QsIHU4IGJtYXNrLCB1MzIgc3JjLCBib29sIHplcm8pCit7CisJc3RydWN0IG5mcF9pbnNuX3JlX3JlZ3MgcmVnOworCWludCBlcnI7CisKKwllcnIgPSBzd3JlZ190b19yZXN0cmljdGVkKHJlZ19ub25lKCksIGRzdCwgc3JjLCAmcmVnLCB0cnVlKTsKKwlpZiAoZXJyKSB7CisJCW5mcF9wcm9nLT5lcnJvciA9IGVycjsKKwkJcmV0dXJuOworCX0KKworCV9fZW1pdF9sZF9maWVsZChuZnBfcHJvZywgc2MsIHJlZy5hcmVnLCBibWFzaywgcmVnLmJyZWcsIHNoaWZ0LAorCQkJcmVnLmk4LCB6ZXJvLCByZWcuc3dhcCwgcmVnLndyX2JvdGgpOworfQorCitzdGF0aWMgdm9pZAorZW1pdF9sZF9maWVsZChzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCB1MzIgZHN0LCB1OCBibWFzaywgdTMyIHNyYywKKwkgICAgICBlbnVtIHNoZl9zYyBzYywgdTggc2hpZnQpCit7CisJZW1pdF9sZF9maWVsZF9hbnkobmZwX3Byb2csIHNjLCBzaGlmdCwgZHN0LCBibWFzaywgc3JjLCBmYWxzZSk7Cit9CisKKy8qIC0tLSBXcmFwcGVycyAtLS0gKi8KK3N0YXRpYyBib29sIHBhY2tfaW1tZWQodTMyIGltbSwgdTE2ICp2YWwsIGVudW0gaW1tZWRfc2hpZnQgKnNoaWZ0KQoreworCWlmICghKGltbSAmIDB4ZmZmZjAwMDApKSB7CisJCSp2YWwgPSBpbW07CisJCSpzaGlmdCA9IElNTUVEX1NISUZUXzBCOworCX0gZWxzZSBpZiAoIShpbW0gJiAweGZmMDAwMGZmKSkgeworCQkqdmFsID0gaW1tID4+IDg7CisJCSpzaGlmdCA9IElNTUVEX1NISUZUXzFCOworCX0gZWxzZSBpZiAoIShpbW0gJiAweDAwMDBmZmZmKSkgeworCQkqdmFsID0gaW1tID4+IDE2OworCQkqc2hpZnQgPSBJTU1FRF9TSElGVF8yQjsKKwl9IGVsc2UgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIHdycF9pbW1lZChzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCB1MzIgZHN0LCB1MzIgaW1tKQoreworCWVudW0gaW1tZWRfc2hpZnQgc2hpZnQ7CisJdTE2IHZhbDsKKworCWlmIChwYWNrX2ltbWVkKGltbSwgJnZhbCwgJnNoaWZ0KSkgeworCQllbWl0X2ltbWVkKG5mcF9wcm9nLCBkc3QsIHZhbCwgSU1NRURfV0lEVEhfQUxMLCBmYWxzZSwgc2hpZnQpOworCX0gZWxzZSBpZiAocGFja19pbW1lZCh+aW1tLCAmdmFsLCAmc2hpZnQpKSB7CisJCWVtaXRfaW1tZWQobmZwX3Byb2csIGRzdCwgdmFsLCBJTU1FRF9XSURUSF9BTEwsIHRydWUsIHNoaWZ0KTsKKwl9IGVsc2UgeworCQllbWl0X2ltbWVkKG5mcF9wcm9nLCBkc3QsIGltbSAmIDB4ZmZmZiwgSU1NRURfV0lEVEhfQUxMLAorCQkJICAgZmFsc2UsIElNTUVEX1NISUZUXzBCKTsKKwkJZW1pdF9pbW1lZChuZnBfcHJvZywgZHN0LCBpbW0gPj4gMTYsIElNTUVEX1dJRFRIX1dPUkQsCisJCQkgICBmYWxzZSwgSU1NRURfU0hJRlRfMkIpOworCX0KK30KKworLyogdXJfbG9hZF9pbW1fYW55KCkgLSBlbmNvZGUgaW1tZWRpYXRlIG9yIHVzZSB0bXAgcmVnaXN0ZXIgKHVucmVzdHJpY3RlZCkKKyAqIElmIHRoZSBAaW1tIGlzIHNtYWxsIGVub3VnaCBlbmNvZGUgaXQgZGlyZWN0bHkgaW4gb3BlcmFuZCBhbmQgcmV0dXJuCisgKiBvdGhlcndpc2UgbG9hZCBAaW1tIHRvIGEgc3BhcmUgcmVnaXN0ZXIgYW5kIHJldHVybiBpdHMgZW5jb2RpbmcuCisgKi8KK3N0YXRpYyB1MzIgdXJfbG9hZF9pbW1fYW55KHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHUzMiBpbW0sIHUzMiB0bXBfcmVnKQoreworCWlmIChGSUVMRF9GSVQoVVJfUkVHX0lNTV9NQVgsIGltbSkpCisJCXJldHVybiByZWdfaW1tKGltbSk7CisKKwl3cnBfaW1tZWQobmZwX3Byb2csIHRtcF9yZWcsIGltbSk7CisJcmV0dXJuIHRtcF9yZWc7Cit9CisKKy8qIHJlX2xvYWRfaW1tX2FueSgpIC0gZW5jb2RlIGltbWVkaWF0ZSBvciB1c2UgdG1wIHJlZ2lzdGVyIChyZXN0cmljdGVkKQorICogSWYgdGhlIEBpbW0gaXMgc21hbGwgZW5vdWdoIGVuY29kZSBpdCBkaXJlY3RseSBpbiBvcGVyYW5kIGFuZCByZXR1cm4KKyAqIG90aGVyd2lzZSBsb2FkIEBpbW0gdG8gYSBzcGFyZSByZWdpc3RlciBhbmQgcmV0dXJuIGl0cyBlbmNvZGluZy4KKyAqLworc3RhdGljIHUzMiByZV9sb2FkX2ltbV9hbnkoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgdTMyIGltbSwgdTMyIHRtcF9yZWcpCit7CisJaWYgKEZJRUxEX0ZJVChSRV9SRUdfSU1NX01BWCwgaW1tKSkKKwkJcmV0dXJuIHJlZ19pbW0oaW1tKTsKKworCXdycF9pbW1lZChuZnBfcHJvZywgdG1wX3JlZywgaW1tKTsKKwlyZXR1cm4gdG1wX3JlZzsKK30KKworc3RhdGljIHZvaWQKK3dycF9icl9zcGVjaWFsKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIGVudW0gYnJfbWFzayBtYXNrLAorCSAgICAgICBlbnVtIGJyX3NwZWNpYWwgc3BlY2lhbCkKK3sKKwllbWl0X2JyKG5mcF9wcm9nLCBtYXNrLCAwLCAwKTsKKworCW5mcF9wcm9nLT5wcm9nW25mcF9wcm9nLT5wcm9nX2xlbiAtIDFdIHw9CisJCUZJRUxEX1BSRVAoT1BfQlJfU1BFQ0lBTCwgc3BlY2lhbCk7Cit9CisKK3N0YXRpYyB2b2lkIHdycF9yZWdfbW92KHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHUxNiBkc3QsIHUxNiBzcmMpCit7CisJZW1pdF9hbHUobmZwX3Byb2csIHJlZ19ib3RoKGRzdCksIHJlZ19ub25lKCksIEFMVV9PUF9OT05FLCByZWdfYihzcmMpKTsKK30KKworc3RhdGljIGludAorY29uc3RydWN0X2RhdGFfaW5kX2xkKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHUxNiBvZmZzZXQsCisJCSAgICAgIHUxNiBzcmMsIGJvb2wgc3JjX3ZhbGlkLCB1OCBzaXplKQoreworCXVuc2lnbmVkIGludCBpOworCXUxNiBzaGlmdCwgc3o7CisJdTMyIHRtcF9yZWc7CisKKwkvKiBXZSBsb2FkIHRoZSB2YWx1ZSBmcm9tIHRoZSBhZGRyZXNzIGluZGljYXRlZCBpbiBAb2Zmc2V0IGFuZCB0aGVuCisJICogc2hpZnQgb3V0IHRoZSBkYXRhIHdlIGRvbid0IG5lZWQuICBOb3RlOiB0aGlzIGlzIGJpZyBlbmRpYW4hCisJICovCisJc3ogPSBzaXplIDwgNCA/IDQgOiBzaXplOworCXNoaWZ0ID0gc2l6ZSA8IDQgPyA0IC0gc2l6ZSA6IDA7CisKKwlpZiAoc3JjX3ZhbGlkKSB7CisJCS8qIENhbGN1bGF0ZSB0aGUgdHJ1ZSBvZmZzZXQgKHNyY19yZWcgKyBpbW0pICovCisJCXRtcF9yZWcgPSB1cl9sb2FkX2ltbV9hbnkobmZwX3Byb2csIG9mZnNldCwgaW1tX2IobmZwX3Byb2cpKTsKKwkJZW1pdF9hbHUobmZwX3Byb2csIGltbV9ib3RoKG5mcF9wcm9nKSwKKwkJCSByZWdfYShzcmMpLCBBTFVfT1BfQURELCB0bXBfcmVnKTsKKwkJLyogQ2hlY2sgcGFja2V0IGxlbmd0aCAoc2l6ZSBndWFyYW50ZWVkIHRvIGZpdCBiL2MgaXQncyB1OCkgKi8KKwkJZW1pdF9hbHUobmZwX3Byb2csIGltbV9hKG5mcF9wcm9nKSwKKwkJCSBpbW1fYShuZnBfcHJvZyksIEFMVV9PUF9BREQsIHJlZ19pbW0oc2l6ZSkpOworCQllbWl0X2FsdShuZnBfcHJvZywgcmVnX25vbmUoKSwKKwkJCSBORlBfQlBGX0FCSV9MRU4sIEFMVV9PUF9TVUIsIGltbV9hKG5mcF9wcm9nKSk7CisJCXdycF9icl9zcGVjaWFsKG5mcF9wcm9nLCBCUl9CTE8sIE9QX0JSX0dPX0FCT1JUKTsKKwkJLyogTG9hZCBkYXRhICovCisJCWVtaXRfY21kKG5mcF9wcm9nLCBDTURfVEdUX1JFQUQ4LCBDTURfTU9ERV8zMmIsIDAsCisJCQkgcGt0X3JlZyhuZnBfcHJvZyksIGltbV9iKG5mcF9wcm9nKSwgc3ogLSAxLCB0cnVlKTsKKwl9IGVsc2UgeworCQkvKiBDaGVjayBwYWNrZXQgbGVuZ3RoICovCisJCXRtcF9yZWcgPSB1cl9sb2FkX2ltbV9hbnkobmZwX3Byb2csIG9mZnNldCArIHNpemUsCisJCQkJCSAgaW1tX2EobmZwX3Byb2cpKTsKKwkJZW1pdF9hbHUobmZwX3Byb2csIHJlZ19ub25lKCksCisJCQkgTkZQX0JQRl9BQklfTEVOLCBBTFVfT1BfU1VCLCB0bXBfcmVnKTsKKwkJd3JwX2JyX3NwZWNpYWwobmZwX3Byb2csIEJSX0JMTywgT1BfQlJfR09fQUJPUlQpOworCQkvKiBMb2FkIGRhdGEgKi8KKwkJdG1wX3JlZyA9IHJlX2xvYWRfaW1tX2FueShuZnBfcHJvZywgb2Zmc2V0LCBpbW1fYihuZnBfcHJvZykpOworCQllbWl0X2NtZChuZnBfcHJvZywgQ01EX1RHVF9SRUFEOCwgQ01EX01PREVfMzJiLCAwLAorCQkJIHBrdF9yZWcobmZwX3Byb2cpLCB0bXBfcmVnLCBzeiAtIDEsIHRydWUpOworCX0KKworCWkgPSAwOworCWlmIChzaGlmdCkKKwkJZW1pdF9zaGYobmZwX3Byb2csIHJlZ19ib3RoKDApLCByZWdfbm9uZSgpLCBTSEZfT1BfTk9ORSwKKwkJCSByZWdfeGZlcigwKSwgU0hGX1NDX1JfU0hGLCBzaGlmdCAqIDgpOworCWVsc2UKKwkJZm9yICg7IGkgKiA0IDwgc2l6ZTsgaSsrKQorCQkJZW1pdF9hbHUobmZwX3Byb2csIHJlZ19ib3RoKGkpLAorCQkJCSByZWdfbm9uZSgpLCBBTFVfT1BfTk9ORSwgcmVnX3hmZXIoaSkpOworCisJaWYgKGkgPCAyKQorCQl3cnBfaW1tZWQobmZwX3Byb2csIHJlZ19ib3RoKDEpLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbnN0cnVjdF9kYXRhX2xkKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHUxNiBvZmZzZXQsIHU4IHNpemUpCit7CisJcmV0dXJuIGNvbnN0cnVjdF9kYXRhX2luZF9sZChuZnBfcHJvZywgb2Zmc2V0LCAwLCBmYWxzZSwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgd3JwX3NldF9tYXJrKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHU4IHNyYykKK3sKKwllbWl0X2FsdShuZnBfcHJvZywgTkZQX0JQRl9BQklfTUFSSywKKwkJIHJlZ19ub25lKCksIEFMVV9PUF9OT05FLCByZWdfYihzcmMpKTsKKwllbWl0X2FsdShuZnBfcHJvZywgTkZQX0JQRl9BQklfRkxBR1MsCisJCSBORlBfQlBGX0FCSV9GTEFHUywgQUxVX09QX09SLCByZWdfaW1tKE5GUF9CUEZfQUJJX0ZMQUdfTUFSSykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit3cnBfYWx1X2ltbShzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCB1OCBkc3QsIGVudW0gYWx1X29wIGFsdV9vcCwgdTMyIGltbSkKK3sKKwl1MzIgdG1wX3JlZzsKKworCWlmIChhbHVfb3AgPT0gQUxVX09QX0FORCkgeworCQlpZiAoIWltbSkKKwkJCXdycF9pbW1lZChuZnBfcHJvZywgcmVnX2JvdGgoZHN0KSwgMCk7CisJCWlmICghaW1tIHx8ICF+aW1tKQorCQkJcmV0dXJuOworCX0KKwlpZiAoYWx1X29wID09IEFMVV9PUF9PUikgeworCQlpZiAoIX5pbW0pCisJCQl3cnBfaW1tZWQobmZwX3Byb2csIHJlZ19ib3RoKGRzdCksIH4wVSk7CisJCWlmICghaW1tIHx8ICF+aW1tKQorCQkJcmV0dXJuOworCX0KKwlpZiAoYWx1X29wID09IEFMVV9PUF9YT1IpIHsKKwkJaWYgKCF+aW1tKQorCQkJZW1pdF9hbHUobmZwX3Byb2csIHJlZ19ib3RoKGRzdCksIHJlZ19ub25lKCksCisJCQkJIEFMVV9PUF9ORUcsIHJlZ19iKGRzdCkpOworCQlpZiAoIWltbSB8fCAhfmltbSkKKwkJCXJldHVybjsKKwl9CisKKwl0bXBfcmVnID0gdXJfbG9hZF9pbW1fYW55KG5mcF9wcm9nLCBpbW0sIGltbV9iKG5mcF9wcm9nKSk7CisJZW1pdF9hbHUobmZwX3Byb2csIHJlZ19ib3RoKGRzdCksIHJlZ19hKGRzdCksIGFsdV9vcCwgdG1wX3JlZyk7Cit9CisKK3N0YXRpYyBpbnQKK3dycF9hbHU2NF9pbW0oc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEsCisJICAgICAgZW51bSBhbHVfb3AgYWx1X29wLCBib29sIHNraXApCit7CisJY29uc3Qgc3RydWN0IGJwZl9pbnNuICppbnNuID0gJm1ldGEtPmluc247CisJdTY0IGltbSA9IGluc24tPmltbTsgLyogc2lnbiBleHRlbmQgKi8KKworCWlmIChza2lwKSB7CisJCW1ldGEtPnNraXAgPSB0cnVlOworCQlyZXR1cm4gMDsKKwl9CisKKwl3cnBfYWx1X2ltbShuZnBfcHJvZywgaW5zbi0+ZHN0X3JlZyAqIDIsIGFsdV9vcCwgaW1tICYgfjBVKTsKKwl3cnBfYWx1X2ltbShuZnBfcHJvZywgaW5zbi0+ZHN0X3JlZyAqIDIgKyAxLCBhbHVfb3AsIGltbSA+PiAzMik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAord3JwX2FsdTY0X3JlZyhzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSwKKwkgICAgICBlbnVtIGFsdV9vcCBhbHVfb3ApCit7CisJdTggZHN0ID0gbWV0YS0+aW5zbi5kc3RfcmVnICogMiwgc3JjID0gbWV0YS0+aW5zbi5zcmNfcmVnICogMjsKKworCWVtaXRfYWx1KG5mcF9wcm9nLCByZWdfYm90aChkc3QpLCByZWdfYShkc3QpLCBhbHVfb3AsIHJlZ19iKHNyYykpOworCWVtaXRfYWx1KG5mcF9wcm9nLCByZWdfYm90aChkc3QgKyAxKSwKKwkJIHJlZ19hKGRzdCArIDEpLCBhbHVfb3AsIHJlZ19iKHNyYyArIDEpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit3cnBfYWx1MzJfaW1tKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhLAorCSAgICAgIGVudW0gYWx1X29wIGFsdV9vcCwgYm9vbCBza2lwKQoreworCWNvbnN0IHN0cnVjdCBicGZfaW5zbiAqaW5zbiA9ICZtZXRhLT5pbnNuOworCisJaWYgKHNraXApIHsKKwkJbWV0YS0+c2tpcCA9IHRydWU7CisJCXJldHVybiAwOworCX0KKworCXdycF9hbHVfaW1tKG5mcF9wcm9nLCBpbnNuLT5kc3RfcmVnICogMiwgYWx1X29wLCBpbnNuLT5pbW0pOworCXdycF9pbW1lZChuZnBfcHJvZywgcmVnX2JvdGgoaW5zbi0+ZHN0X3JlZyAqIDIgKyAxKSwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAord3JwX2FsdTMyX3JlZyhzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSwKKwkgICAgICBlbnVtIGFsdV9vcCBhbHVfb3ApCit7CisJdTggZHN0ID0gbWV0YS0+aW5zbi5kc3RfcmVnICogMiwgc3JjID0gbWV0YS0+aW5zbi5zcmNfcmVnICogMjsKKworCWVtaXRfYWx1KG5mcF9wcm9nLCByZWdfYm90aChkc3QpLCByZWdfYShkc3QpLCBhbHVfb3AsIHJlZ19iKHNyYykpOworCXdycF9pbW1lZChuZnBfcHJvZywgcmVnX2JvdGgobWV0YS0+aW5zbi5kc3RfcmVnICogMiArIDEpLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAord3JwX3Rlc3RfcmVnX29uZShzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCB1OCBkc3QsIGVudW0gYWx1X29wIGFsdV9vcCwgdTggc3JjLAorCQkgZW51bSBicl9tYXNrIGJyX21hc2ssIHUxNiBvZmYpCit7CisJZW1pdF9hbHUobmZwX3Byb2csIHJlZ19ub25lKCksIHJlZ19hKGRzdCksIGFsdV9vcCwgcmVnX2Ioc3JjKSk7CisJZW1pdF9icihuZnBfcHJvZywgYnJfbWFzaywgb2ZmLCAwKTsKK30KKworc3RhdGljIGludAord3JwX3Rlc3RfcmVnKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhLAorCSAgICAgZW51bSBhbHVfb3AgYWx1X29wLCBlbnVtIGJyX21hc2sgYnJfbWFzaykKK3sKKwljb25zdCBzdHJ1Y3QgYnBmX2luc24gKmluc24gPSAmbWV0YS0+aW5zbjsKKworCWlmIChpbnNuLT5vZmYgPCAwKSAvKiBUT0RPICovCisJCXJldHVybiAtRU5PVFNVUFA7CisKKwl3cnBfdGVzdF9yZWdfb25lKG5mcF9wcm9nLCBpbnNuLT5kc3RfcmVnICogMiwgYWx1X29wLAorCQkJIGluc24tPnNyY19yZWcgKiAyLCBicl9tYXNrLCBpbnNuLT5vZmYpOworCXdycF90ZXN0X3JlZ19vbmUobmZwX3Byb2csIGluc24tPmRzdF9yZWcgKiAyICsgMSwgYWx1X29wLAorCQkJIGluc24tPnNyY19yZWcgKiAyICsgMSwgYnJfbWFzaywgaW5zbi0+b2ZmKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit3cnBfY21wX2ltbShzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSwKKwkgICAgZW51bSBicl9tYXNrIGJyX21hc2ssIGJvb2wgc3dhcCkKK3sKKwljb25zdCBzdHJ1Y3QgYnBmX2luc24gKmluc24gPSAmbWV0YS0+aW5zbjsKKwl1NjQgaW1tID0gaW5zbi0+aW1tOyAvKiBzaWduIGV4dGVuZCAqLworCXU4IHJlZyA9IGluc24tPmRzdF9yZWcgKiAyOworCXUzMiB0bXBfcmVnOworCisJaWYgKGluc24tPm9mZiA8IDApIC8qIFRPRE8gKi8KKwkJcmV0dXJuIC1FTk9UU1VQUDsKKworCXRtcF9yZWcgPSB1cl9sb2FkX2ltbV9hbnkobmZwX3Byb2csIGltbSAmIH4wVSwgaW1tX2IobmZwX3Byb2cpKTsKKwlpZiAoIXN3YXApCisJCWVtaXRfYWx1KG5mcF9wcm9nLCByZWdfbm9uZSgpLCByZWdfYShyZWcpLCBBTFVfT1BfU1VCLCB0bXBfcmVnKTsKKwllbHNlCisJCWVtaXRfYWx1KG5mcF9wcm9nLCByZWdfbm9uZSgpLCB0bXBfcmVnLCBBTFVfT1BfU1VCLCByZWdfYShyZWcpKTsKKworCXRtcF9yZWcgPSB1cl9sb2FkX2ltbV9hbnkobmZwX3Byb2csIGltbSA+PiAzMiwgaW1tX2IobmZwX3Byb2cpKTsKKwlpZiAoIXN3YXApCisJCWVtaXRfYWx1KG5mcF9wcm9nLCByZWdfbm9uZSgpLAorCQkJIHJlZ19hKHJlZyArIDEpLCBBTFVfT1BfU1VCX0MsIHRtcF9yZWcpOworCWVsc2UKKwkJZW1pdF9hbHUobmZwX3Byb2csIHJlZ19ub25lKCksCisJCQkgdG1wX3JlZywgQUxVX09QX1NVQl9DLCByZWdfYShyZWcgKyAxKSk7CisKKwllbWl0X2JyKG5mcF9wcm9nLCBicl9tYXNrLCBpbnNuLT5vZmYsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3dycF9jbXBfcmVnKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhLAorCSAgICBlbnVtIGJyX21hc2sgYnJfbWFzaywgYm9vbCBzd2FwKQoreworCWNvbnN0IHN0cnVjdCBicGZfaW5zbiAqaW5zbiA9ICZtZXRhLT5pbnNuOworCXU4IGFyZWcgPSBpbnNuLT5zcmNfcmVnICogMiwgYnJlZyA9IGluc24tPmRzdF9yZWcgKiAyOworCisJaWYgKGluc24tPm9mZiA8IDApIC8qIFRPRE8gKi8KKwkJcmV0dXJuIC1FTk9UU1VQUDsKKworCWlmIChzd2FwKSB7CisJCWFyZWcgXj0gYnJlZzsKKwkJYnJlZyBePSBhcmVnOworCQlhcmVnIF49IGJyZWc7CisJfQorCisJZW1pdF9hbHUobmZwX3Byb2csIHJlZ19ub25lKCksIHJlZ19hKGFyZWcpLCBBTFVfT1BfU1VCLCByZWdfYihicmVnKSk7CisJZW1pdF9hbHUobmZwX3Byb2csIHJlZ19ub25lKCksCisJCSByZWdfYShhcmVnICsgMSksIEFMVV9PUF9TVUJfQywgcmVnX2IoYnJlZyArIDEpKTsKKwllbWl0X2JyKG5mcF9wcm9nLCBicl9tYXNrLCBpbnNuLT5vZmYsIDApOworCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLSBDYWxsYmFja3MgLS0tICovCitzdGF0aWMgaW50IG1vdl9yZWc2NChzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwljb25zdCBzdHJ1Y3QgYnBmX2luc24gKmluc24gPSAmbWV0YS0+aW5zbjsKKworCXdycF9yZWdfbW92KG5mcF9wcm9nLCBpbnNuLT5kc3RfcmVnICogMiwgaW5zbi0+c3JjX3JlZyAqIDIpOworCXdycF9yZWdfbW92KG5mcF9wcm9nLCBpbnNuLT5kc3RfcmVnICogMiArIDEsIGluc24tPnNyY19yZWcgKiAyICsgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfaW1tNjQoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJdTY0IGltbSA9IG1ldGEtPmluc24uaW1tOyAvKiBzaWduIGV4dGVuZCAqLworCisJd3JwX2ltbWVkKG5mcF9wcm9nLCByZWdfYm90aChtZXRhLT5pbnNuLmRzdF9yZWcgKiAyKSwgaW1tICYgfjBVKTsKKwl3cnBfaW1tZWQobmZwX3Byb2csIHJlZ19ib3RoKG1ldGEtPmluc24uZHN0X3JlZyAqIDIgKyAxKSwgaW1tID4+IDMyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhvcl9yZWc2NChzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlyZXR1cm4gd3JwX2FsdTY0X3JlZyhuZnBfcHJvZywgbWV0YSwgQUxVX09QX1hPUik7Cit9CisKK3N0YXRpYyBpbnQgeG9yX2ltbTY0KHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCXJldHVybiB3cnBfYWx1NjRfaW1tKG5mcF9wcm9nLCBtZXRhLCBBTFVfT1BfWE9SLCAhbWV0YS0+aW5zbi5pbW0pOworfQorCitzdGF0aWMgaW50IGFuZF9yZWc2NChzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlyZXR1cm4gd3JwX2FsdTY0X3JlZyhuZnBfcHJvZywgbWV0YSwgQUxVX09QX0FORCk7Cit9CisKK3N0YXRpYyBpbnQgYW5kX2ltbTY0KHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCXJldHVybiB3cnBfYWx1NjRfaW1tKG5mcF9wcm9nLCBtZXRhLCBBTFVfT1BfQU5ELCAhfm1ldGEtPmluc24uaW1tKTsKK30KKworc3RhdGljIGludCBvcl9yZWc2NChzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlyZXR1cm4gd3JwX2FsdTY0X3JlZyhuZnBfcHJvZywgbWV0YSwgQUxVX09QX09SKTsKK30KKworc3RhdGljIGludCBvcl9pbW02NChzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlyZXR1cm4gd3JwX2FsdTY0X2ltbShuZnBfcHJvZywgbWV0YSwgQUxVX09QX09SLCAhbWV0YS0+aW5zbi5pbW0pOworfQorCitzdGF0aWMgaW50IGFkZF9yZWc2NChzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwljb25zdCBzdHJ1Y3QgYnBmX2luc24gKmluc24gPSAmbWV0YS0+aW5zbjsKKworCWVtaXRfYWx1KG5mcF9wcm9nLCByZWdfYm90aChpbnNuLT5kc3RfcmVnICogMiksCisJCSByZWdfYShpbnNuLT5kc3RfcmVnICogMiksIEFMVV9PUF9BREQsCisJCSByZWdfYihpbnNuLT5zcmNfcmVnICogMikpOworCWVtaXRfYWx1KG5mcF9wcm9nLCByZWdfYm90aChpbnNuLT5kc3RfcmVnICogMiArIDEpLAorCQkgcmVnX2EoaW5zbi0+ZHN0X3JlZyAqIDIgKyAxKSwgQUxVX09QX0FERF9DLAorCQkgcmVnX2IoaW5zbi0+c3JjX3JlZyAqIDIgKyAxKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGRfaW1tNjQoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJY29uc3Qgc3RydWN0IGJwZl9pbnNuICppbnNuID0gJm1ldGEtPmluc247CisJdTY0IGltbSA9IGluc24tPmltbTsgLyogc2lnbiBleHRlbmQgKi8KKworCXdycF9hbHVfaW1tKG5mcF9wcm9nLCBpbnNuLT5kc3RfcmVnICogMiwgQUxVX09QX0FERCwgaW1tICYgfjBVKTsKKwl3cnBfYWx1X2ltbShuZnBfcHJvZywgaW5zbi0+ZHN0X3JlZyAqIDIgKyAxLCBBTFVfT1BfQUREX0MsIGltbSA+PiAzMik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdWJfcmVnNjQoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJY29uc3Qgc3RydWN0IGJwZl9pbnNuICppbnNuID0gJm1ldGEtPmluc247CisKKwllbWl0X2FsdShuZnBfcHJvZywgcmVnX2JvdGgoaW5zbi0+ZHN0X3JlZyAqIDIpLAorCQkgcmVnX2EoaW5zbi0+ZHN0X3JlZyAqIDIpLCBBTFVfT1BfU1VCLAorCQkgcmVnX2IoaW5zbi0+c3JjX3JlZyAqIDIpKTsKKwllbWl0X2FsdShuZnBfcHJvZywgcmVnX2JvdGgoaW5zbi0+ZHN0X3JlZyAqIDIgKyAxKSwKKwkJIHJlZ19hKGluc24tPmRzdF9yZWcgKiAyICsgMSksIEFMVV9PUF9TVUJfQywKKwkJIHJlZ19iKGluc24tPnNyY19yZWcgKiAyICsgMSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3ViX2ltbTY0KHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCWNvbnN0IHN0cnVjdCBicGZfaW5zbiAqaW5zbiA9ICZtZXRhLT5pbnNuOworCXU2NCBpbW0gPSBpbnNuLT5pbW07IC8qIHNpZ24gZXh0ZW5kICovCisKKwl3cnBfYWx1X2ltbShuZnBfcHJvZywgaW5zbi0+ZHN0X3JlZyAqIDIsIEFMVV9PUF9TVUIsIGltbSAmIH4wVSk7CisJd3JwX2FsdV9pbW0obmZwX3Byb2csIGluc24tPmRzdF9yZWcgKiAyICsgMSwgQUxVX09QX1NVQl9DLCBpbW0gPj4gMzIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2hsX2ltbTY0KHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCWNvbnN0IHN0cnVjdCBicGZfaW5zbiAqaW5zbiA9ICZtZXRhLT5pbnNuOworCisJaWYgKGluc24tPmltbSAhPSAzMikKKwkJcmV0dXJuIDE7IC8qIFRPRE8gKi8KKworCXdycF9yZWdfbW92KG5mcF9wcm9nLCBpbnNuLT5kc3RfcmVnICogMiArIDEsIGluc24tPmRzdF9yZWcgKiAyKTsKKwl3cnBfaW1tZWQobmZwX3Byb2csIHJlZ19ib3RoKGluc24tPmRzdF9yZWcgKiAyKSwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaHJfaW1tNjQoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJY29uc3Qgc3RydWN0IGJwZl9pbnNuICppbnNuID0gJm1ldGEtPmluc247CisKKwlpZiAoaW5zbi0+aW1tICE9IDMyKQorCQlyZXR1cm4gMTsgLyogVE9ETyAqLworCisJd3JwX3JlZ19tb3YobmZwX3Byb2csIGluc24tPmRzdF9yZWcgKiAyLCBpbnNuLT5kc3RfcmVnICogMiArIDEpOworCXdycF9pbW1lZChuZnBfcHJvZywgcmVnX2JvdGgoaW5zbi0+ZHN0X3JlZyAqIDIgKyAxKSwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfcmVnKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCWNvbnN0IHN0cnVjdCBicGZfaW5zbiAqaW5zbiA9ICZtZXRhLT5pbnNuOworCisJd3JwX3JlZ19tb3YobmZwX3Byb2csIGluc24tPmRzdF9yZWcgKiAyLCAgaW5zbi0+c3JjX3JlZyAqIDIpOworCXdycF9pbW1lZChuZnBfcHJvZywgcmVnX2JvdGgoaW5zbi0+ZHN0X3JlZyAqIDIgKyAxKSwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfaW1tKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCWNvbnN0IHN0cnVjdCBicGZfaW5zbiAqaW5zbiA9ICZtZXRhLT5pbnNuOworCisJd3JwX2ltbWVkKG5mcF9wcm9nLCByZWdfYm90aChpbnNuLT5kc3RfcmVnICogMiksIGluc24tPmltbSk7CisJd3JwX2ltbWVkKG5mcF9wcm9nLCByZWdfYm90aChpbnNuLT5kc3RfcmVnICogMiArIDEpLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhvcl9yZWcoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJcmV0dXJuIHdycF9hbHUzMl9yZWcobmZwX3Byb2csIG1ldGEsIEFMVV9PUF9YT1IpOworfQorCitzdGF0aWMgaW50IHhvcl9pbW0oc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJcmV0dXJuIHdycF9hbHUzMl9pbW0obmZwX3Byb2csIG1ldGEsIEFMVV9PUF9YT1IsICF+bWV0YS0+aW5zbi5pbW0pOworfQorCitzdGF0aWMgaW50IGFuZF9yZWcoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJcmV0dXJuIHdycF9hbHUzMl9yZWcobmZwX3Byb2csIG1ldGEsIEFMVV9PUF9BTkQpOworfQorCitzdGF0aWMgaW50IGFuZF9pbW0oc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJcmV0dXJuIHdycF9hbHUzMl9pbW0obmZwX3Byb2csIG1ldGEsIEFMVV9PUF9BTkQsICF+bWV0YS0+aW5zbi5pbW0pOworfQorCitzdGF0aWMgaW50IG9yX3JlZyhzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlyZXR1cm4gd3JwX2FsdTMyX3JlZyhuZnBfcHJvZywgbWV0YSwgQUxVX09QX09SKTsKK30KKworc3RhdGljIGludCBvcl9pbW0oc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJcmV0dXJuIHdycF9hbHUzMl9pbW0obmZwX3Byb2csIG1ldGEsIEFMVV9PUF9PUiwgIW1ldGEtPmluc24uaW1tKTsKK30KKworc3RhdGljIGludCBhZGRfcmVnKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCXJldHVybiB3cnBfYWx1MzJfcmVnKG5mcF9wcm9nLCBtZXRhLCBBTFVfT1BfQUREKTsKK30KKworc3RhdGljIGludCBhZGRfaW1tKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCXJldHVybiB3cnBfYWx1MzJfaW1tKG5mcF9wcm9nLCBtZXRhLCBBTFVfT1BfQURELCAhbWV0YS0+aW5zbi5pbW0pOworfQorCitzdGF0aWMgaW50IHN1Yl9yZWcoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJcmV0dXJuIHdycF9hbHUzMl9yZWcobmZwX3Byb2csIG1ldGEsIEFMVV9PUF9TVUIpOworfQorCitzdGF0aWMgaW50IHN1Yl9pbW0oc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJcmV0dXJuIHdycF9hbHUzMl9pbW0obmZwX3Byb2csIG1ldGEsIEFMVV9PUF9TVUIsICFtZXRhLT5pbnNuLmltbSk7Cit9CisKK3N0YXRpYyBpbnQgc2hsX2ltbShzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwljb25zdCBzdHJ1Y3QgYnBmX2luc24gKmluc24gPSAmbWV0YS0+aW5zbjsKKworCWlmICghaW5zbi0+aW1tKQorCQlyZXR1cm4gMTsgLyogVE9ETzogemVybyBzaGlmdCBtZWFucyBpbmRpcmVjdCAqLworCisJZW1pdF9zaGYobmZwX3Byb2csIHJlZ19ib3RoKGluc24tPmRzdF9yZWcgKiAyKSwKKwkJIHJlZ19ub25lKCksIFNIRl9PUF9OT05FLCByZWdfYihpbnNuLT5kc3RfcmVnICogMiksCisJCSBTSEZfU0NfTF9TSEYsIGluc24tPmltbSk7CisJd3JwX2ltbWVkKG5mcF9wcm9nLCByZWdfYm90aChpbnNuLT5kc3RfcmVnICogMiArIDEpLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGltbV9sZDhfcGFydDIoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJd3JwX2ltbWVkKG5mcF9wcm9nLCByZWdfYm90aChuZnBfbWV0YV9wcmV2KG1ldGEpLT5pbnNuLmRzdF9yZWcgKiAyICsgMSksCisJCSAgbWV0YS0+aW5zbi5pbW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW1tX2xkOChzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwljb25zdCBzdHJ1Y3QgYnBmX2luc24gKmluc24gPSAmbWV0YS0+aW5zbjsKKworCW1ldGEtPmRvdWJsZV9jYiA9IGltbV9sZDhfcGFydDI7CisJd3JwX2ltbWVkKG5mcF9wcm9nLCByZWdfYm90aChpbnNuLT5kc3RfcmVnICogMiksIGluc24tPmltbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkYXRhX2xkMShzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlyZXR1cm4gY29uc3RydWN0X2RhdGFfbGQobmZwX3Byb2csIG1ldGEtPmluc24uaW1tLCAxKTsKK30KKworc3RhdGljIGludCBkYXRhX2xkMihzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlyZXR1cm4gY29uc3RydWN0X2RhdGFfbGQobmZwX3Byb2csIG1ldGEtPmluc24uaW1tLCAyKTsKK30KKworc3RhdGljIGludCBkYXRhX2xkNChzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlyZXR1cm4gY29uc3RydWN0X2RhdGFfbGQobmZwX3Byb2csIG1ldGEtPmluc24uaW1tLCA0KTsKK30KKworc3RhdGljIGludCBkYXRhX2luZF9sZDEoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJcmV0dXJuIGNvbnN0cnVjdF9kYXRhX2luZF9sZChuZnBfcHJvZywgbWV0YS0+aW5zbi5pbW0sCisJCQkJICAgICBtZXRhLT5pbnNuLnNyY19yZWcgKiAyLCB0cnVlLCAxKTsKK30KKworc3RhdGljIGludCBkYXRhX2luZF9sZDIoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJcmV0dXJuIGNvbnN0cnVjdF9kYXRhX2luZF9sZChuZnBfcHJvZywgbWV0YS0+aW5zbi5pbW0sCisJCQkJICAgICBtZXRhLT5pbnNuLnNyY19yZWcgKiAyLCB0cnVlLCAyKTsKK30KKworc3RhdGljIGludCBkYXRhX2luZF9sZDQoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJcmV0dXJuIGNvbnN0cnVjdF9kYXRhX2luZF9sZChuZnBfcHJvZywgbWV0YS0+aW5zbi5pbW0sCisJCQkJICAgICBtZXRhLT5pbnNuLnNyY19yZWcgKiAyLCB0cnVlLCA0KTsKK30KKworc3RhdGljIGludCBtZW1fbGR4NChzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlpZiAobWV0YS0+aW5zbi5vZmYgPT0gb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIGxlbikpCisJCWVtaXRfYWx1KG5mcF9wcm9nLCByZWdfYm90aChtZXRhLT5pbnNuLmRzdF9yZWcgKiAyKSwKKwkJCSByZWdfbm9uZSgpLCBBTFVfT1BfTk9ORSwgTkZQX0JQRl9BQklfTEVOKTsKKwllbHNlCisJCXJldHVybiAtRU5PVFNVUFA7CisKKwl3cnBfaW1tZWQobmZwX3Byb2csIHJlZ19ib3RoKG1ldGEtPmluc24uZHN0X3JlZyAqIDIgKyAxKSwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtZW1fc3R4NChzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlpZiAobWV0YS0+aW5zbi5vZmYgPT0gb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIG1hcmspKQorCQlyZXR1cm4gd3JwX3NldF9tYXJrKG5mcF9wcm9nLCBtZXRhLT5pbnNuLnNyY19yZWcgKiAyKTsKKworCXJldHVybiAtRU5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbnQganVtcChzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlpZiAobWV0YS0+aW5zbi5vZmYgPCAwKSAvKiBUT0RPICovCisJCXJldHVybiAtRU5PVFNVUFA7CisJZW1pdF9icihuZnBfcHJvZywgQlJfVU5DLCBtZXRhLT5pbnNuLm9mZiwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqZXFfaW1tKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCWNvbnN0IHN0cnVjdCBicGZfaW5zbiAqaW5zbiA9ICZtZXRhLT5pbnNuOworCXU2NCBpbW0gPSBpbnNuLT5pbW07IC8qIHNpZ24gZXh0ZW5kICovCisJdTMyIG9yMSA9IHJlZ19hKGluc24tPmRzdF9yZWcgKiAyKSwgb3IyID0gcmVnX2IoaW5zbi0+ZHN0X3JlZyAqIDIgKyAxKTsKKwl1MzIgdG1wX3JlZzsKKworCWlmIChpbnNuLT5vZmYgPCAwKSAvKiBUT0RPICovCisJCXJldHVybiAtRU5PVFNVUFA7CisKKwlpZiAoaW1tICYgfjBVKSB7CisJCXRtcF9yZWcgPSB1cl9sb2FkX2ltbV9hbnkobmZwX3Byb2csIGltbSAmIH4wVSwgaW1tX2IobmZwX3Byb2cpKTsKKwkJZW1pdF9hbHUobmZwX3Byb2csIGltbV9hKG5mcF9wcm9nKSwKKwkJCSByZWdfYShpbnNuLT5kc3RfcmVnICogMiksIEFMVV9PUF9YT1IsIHRtcF9yZWcpOworCQlvcjEgPSBpbW1fYShuZnBfcHJvZyk7CisJfQorCisJaWYgKGltbSA+PiAzMikgeworCQl0bXBfcmVnID0gdXJfbG9hZF9pbW1fYW55KG5mcF9wcm9nLCBpbW0gPj4gMzIsIGltbV9iKG5mcF9wcm9nKSk7CisJCWVtaXRfYWx1KG5mcF9wcm9nLCBpbW1fYihuZnBfcHJvZyksCisJCQkgcmVnX2EoaW5zbi0+ZHN0X3JlZyAqIDIgKyAxKSwgQUxVX09QX1hPUiwgdG1wX3JlZyk7CisJCW9yMiA9IGltbV9iKG5mcF9wcm9nKTsKKwl9CisKKwllbWl0X2FsdShuZnBfcHJvZywgcmVnX25vbmUoKSwgb3IxLCBBTFVfT1BfT1IsIG9yMik7CisJZW1pdF9icihuZnBfcHJvZywgQlJfQkVRLCBpbnNuLT5vZmYsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgamd0X2ltbShzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlyZXR1cm4gd3JwX2NtcF9pbW0obmZwX3Byb2csIG1ldGEsIEJSX0JMTywgZmFsc2UpOworfQorCitzdGF0aWMgaW50IGpnZV9pbW0oc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJcmV0dXJuIHdycF9jbXBfaW1tKG5mcF9wcm9nLCBtZXRhLCBCUl9CSFMsIHRydWUpOworfQorCitzdGF0aWMgaW50IGpzZXRfaW1tKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCWNvbnN0IHN0cnVjdCBicGZfaW5zbiAqaW5zbiA9ICZtZXRhLT5pbnNuOworCXU2NCBpbW0gPSBpbnNuLT5pbW07IC8qIHNpZ24gZXh0ZW5kICovCisJdTMyIHRtcF9yZWc7CisKKwlpZiAoaW5zbi0+b2ZmIDwgMCkgLyogVE9ETyAqLworCQlyZXR1cm4gLUVOT1RTVVBQOworCisJaWYgKCFpbW0pIHsKKwkJbWV0YS0+c2tpcCA9IHRydWU7CisJCXJldHVybiAwOworCX0KKworCWlmIChpbW0gJiB+MFUpIHsKKwkJdG1wX3JlZyA9IHVyX2xvYWRfaW1tX2FueShuZnBfcHJvZywgaW1tICYgfjBVLCBpbW1fYihuZnBfcHJvZykpOworCQllbWl0X2FsdShuZnBfcHJvZywgcmVnX25vbmUoKSwKKwkJCSByZWdfYShpbnNuLT5kc3RfcmVnICogMiksIEFMVV9PUF9BTkQsIHRtcF9yZWcpOworCQllbWl0X2JyKG5mcF9wcm9nLCBCUl9CTkUsIGluc24tPm9mZiwgMCk7CisJfQorCisJaWYgKGltbSA+PiAzMikgeworCQl0bXBfcmVnID0gdXJfbG9hZF9pbW1fYW55KG5mcF9wcm9nLCBpbW0gPj4gMzIsIGltbV9iKG5mcF9wcm9nKSk7CisJCWVtaXRfYWx1KG5mcF9wcm9nLCByZWdfbm9uZSgpLAorCQkJIHJlZ19hKGluc24tPmRzdF9yZWcgKiAyICsgMSksIEFMVV9PUF9BTkQsIHRtcF9yZWcpOworCQllbWl0X2JyKG5mcF9wcm9nLCBCUl9CTkUsIGluc24tPm9mZiwgMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgam5lX2ltbShzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwljb25zdCBzdHJ1Y3QgYnBmX2luc24gKmluc24gPSAmbWV0YS0+aW5zbjsKKwl1NjQgaW1tID0gaW5zbi0+aW1tOyAvKiBzaWduIGV4dGVuZCAqLworCXUzMiB0bXBfcmVnOworCisJaWYgKGluc24tPm9mZiA8IDApIC8qIFRPRE8gKi8KKwkJcmV0dXJuIC1FTk9UU1VQUDsKKworCWlmICghaW1tKSB7CisJCWVtaXRfYWx1KG5mcF9wcm9nLCByZWdfbm9uZSgpLCByZWdfYShpbnNuLT5kc3RfcmVnICogMiksCisJCQkgQUxVX09QX09SLCByZWdfYihpbnNuLT5kc3RfcmVnICogMiArIDEpKTsKKwkJZW1pdF9icihuZnBfcHJvZywgQlJfQk5FLCBpbnNuLT5vZmYsIDApOworCX0KKworCXRtcF9yZWcgPSB1cl9sb2FkX2ltbV9hbnkobmZwX3Byb2csIGltbSAmIH4wVSwgaW1tX2IobmZwX3Byb2cpKTsKKwllbWl0X2FsdShuZnBfcHJvZywgcmVnX25vbmUoKSwKKwkJIHJlZ19hKGluc24tPmRzdF9yZWcgKiAyKSwgQUxVX09QX1hPUiwgdG1wX3JlZyk7CisJZW1pdF9icihuZnBfcHJvZywgQlJfQk5FLCBpbnNuLT5vZmYsIDApOworCisJdG1wX3JlZyA9IHVyX2xvYWRfaW1tX2FueShuZnBfcHJvZywgaW1tID4+IDMyLCBpbW1fYihuZnBfcHJvZykpOworCWVtaXRfYWx1KG5mcF9wcm9nLCByZWdfbm9uZSgpLAorCQkgcmVnX2EoaW5zbi0+ZHN0X3JlZyAqIDIgKyAxKSwgQUxVX09QX1hPUiwgdG1wX3JlZyk7CisJZW1pdF9icihuZnBfcHJvZywgQlJfQk5FLCBpbnNuLT5vZmYsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgamVxX3JlZyhzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwljb25zdCBzdHJ1Y3QgYnBmX2luc24gKmluc24gPSAmbWV0YS0+aW5zbjsKKworCWlmIChpbnNuLT5vZmYgPCAwKSAvKiBUT0RPICovCisJCXJldHVybiAtRU5PVFNVUFA7CisKKwllbWl0X2FsdShuZnBfcHJvZywgaW1tX2EobmZwX3Byb2cpLCByZWdfYShpbnNuLT5kc3RfcmVnICogMiksCisJCSBBTFVfT1BfWE9SLCByZWdfYihpbnNuLT5zcmNfcmVnICogMikpOworCWVtaXRfYWx1KG5mcF9wcm9nLCBpbW1fYihuZnBfcHJvZyksIHJlZ19hKGluc24tPmRzdF9yZWcgKiAyICsgMSksCisJCSBBTFVfT1BfWE9SLCByZWdfYihpbnNuLT5zcmNfcmVnICogMiArIDEpKTsKKwllbWl0X2FsdShuZnBfcHJvZywgcmVnX25vbmUoKSwKKwkJIGltbV9hKG5mcF9wcm9nKSwgQUxVX09QX09SLCBpbW1fYihuZnBfcHJvZykpOworCWVtaXRfYnIobmZwX3Byb2csIEJSX0JFUSwgaW5zbi0+b2ZmLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGpndF9yZWcoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJcmV0dXJuIHdycF9jbXBfcmVnKG5mcF9wcm9nLCBtZXRhLCBCUl9CTE8sIGZhbHNlKTsKK30KKworc3RhdGljIGludCBqZ2VfcmVnKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csIHN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhKQoreworCXJldHVybiB3cnBfY21wX3JlZyhuZnBfcHJvZywgbWV0YSwgQlJfQkhTLCB0cnVlKTsKK30KKworc3RhdGljIGludCBqc2V0X3JlZyhzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwlyZXR1cm4gd3JwX3Rlc3RfcmVnKG5mcF9wcm9nLCBtZXRhLCBBTFVfT1BfQU5ELCBCUl9CTkUpOworfQorCitzdGF0aWMgaW50IGpuZV9yZWcoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEpCit7CisJcmV0dXJuIHdycF90ZXN0X3JlZyhuZnBfcHJvZywgbWV0YSwgQUxVX09QX1hPUiwgQlJfQk5FKTsKK30KKworc3RhdGljIGludCBnb3RvX291dChzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLCBzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSkKK3sKKwl3cnBfYnJfc3BlY2lhbChuZnBfcHJvZywgQlJfVU5DLCBPUF9CUl9HT19PVVQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBpbnN0cl9jYl90IGluc3RyX2NiWzI1Nl0gPSB7CisJW0JQRl9BTFU2NCB8IEJQRl9NT1YgfCBCUEZfWF0gPQltb3ZfcmVnNjQsCisJW0JQRl9BTFU2NCB8IEJQRl9NT1YgfCBCUEZfS10gPQltb3ZfaW1tNjQsCisJW0JQRl9BTFU2NCB8IEJQRl9YT1IgfCBCUEZfWF0gPQl4b3JfcmVnNjQsCisJW0JQRl9BTFU2NCB8IEJQRl9YT1IgfCBCUEZfS10gPQl4b3JfaW1tNjQsCisJW0JQRl9BTFU2NCB8IEJQRl9BTkQgfCBCUEZfWF0gPQlhbmRfcmVnNjQsCisJW0JQRl9BTFU2NCB8IEJQRl9BTkQgfCBCUEZfS10gPQlhbmRfaW1tNjQsCisJW0JQRl9BTFU2NCB8IEJQRl9PUiB8IEJQRl9YXSA9CW9yX3JlZzY0LAorCVtCUEZfQUxVNjQgfCBCUEZfT1IgfCBCUEZfS10gPQlvcl9pbW02NCwKKwlbQlBGX0FMVTY0IHwgQlBGX0FERCB8IEJQRl9YXSA9CWFkZF9yZWc2NCwKKwlbQlBGX0FMVTY0IHwgQlBGX0FERCB8IEJQRl9LXSA9CWFkZF9pbW02NCwKKwlbQlBGX0FMVTY0IHwgQlBGX1NVQiB8IEJQRl9YXSA9CXN1Yl9yZWc2NCwKKwlbQlBGX0FMVTY0IHwgQlBGX1NVQiB8IEJQRl9LXSA9CXN1Yl9pbW02NCwKKwlbQlBGX0FMVTY0IHwgQlBGX0xTSCB8IEJQRl9LXSA9CXNobF9pbW02NCwKKwlbQlBGX0FMVTY0IHwgQlBGX1JTSCB8IEJQRl9LXSA9CXNocl9pbW02NCwKKwlbQlBGX0FMVSB8IEJQRl9NT1YgfCBCUEZfWF0gPQltb3ZfcmVnLAorCVtCUEZfQUxVIHwgQlBGX01PViB8IEJQRl9LXSA9CW1vdl9pbW0sCisJW0JQRl9BTFUgfCBCUEZfWE9SIHwgQlBGX1hdID0JeG9yX3JlZywKKwlbQlBGX0FMVSB8IEJQRl9YT1IgfCBCUEZfS10gPQl4b3JfaW1tLAorCVtCUEZfQUxVIHwgQlBGX0FORCB8IEJQRl9YXSA9CWFuZF9yZWcsCisJW0JQRl9BTFUgfCBCUEZfQU5EIHwgQlBGX0tdID0JYW5kX2ltbSwKKwlbQlBGX0FMVSB8IEJQRl9PUiB8IEJQRl9YXSA9CW9yX3JlZywKKwlbQlBGX0FMVSB8IEJQRl9PUiB8IEJQRl9LXSA9CW9yX2ltbSwKKwlbQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfWF0gPQlhZGRfcmVnLAorCVtCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9LXSA9CWFkZF9pbW0sCisJW0JQRl9BTFUgfCBCUEZfU1VCIHwgQlBGX1hdID0Jc3ViX3JlZywKKwlbQlBGX0FMVSB8IEJQRl9TVUIgfCBCUEZfS10gPQlzdWJfaW1tLAorCVtCUEZfQUxVIHwgQlBGX0xTSCB8IEJQRl9LXSA9CXNobF9pbW0sCisJW0JQRl9MRCB8IEJQRl9JTU0gfCBCUEZfRFddID0JaW1tX2xkOCwKKwlbQlBGX0xEIHwgQlBGX0FCUyB8IEJQRl9CXSA9CWRhdGFfbGQxLAorCVtCUEZfTEQgfCBCUEZfQUJTIHwgQlBGX0hdID0JZGF0YV9sZDIsCisJW0JQRl9MRCB8IEJQRl9BQlMgfCBCUEZfV10gPQlkYXRhX2xkNCwKKwlbQlBGX0xEIHwgQlBGX0lORCB8IEJQRl9CXSA9CWRhdGFfaW5kX2xkMSwKKwlbQlBGX0xEIHwgQlBGX0lORCB8IEJQRl9IXSA9CWRhdGFfaW5kX2xkMiwKKwlbQlBGX0xEIHwgQlBGX0lORCB8IEJQRl9XXSA9CWRhdGFfaW5kX2xkNCwKKwlbQlBGX0xEWCB8IEJQRl9NRU0gfCBCUEZfV10gPQltZW1fbGR4NCwKKwlbQlBGX1NUWCB8IEJQRl9NRU0gfCBCUEZfV10gPQltZW1fc3R4NCwKKwlbQlBGX0pNUCB8IEJQRl9KQSB8IEJQRl9LXSA9CWp1bXAsCisJW0JQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX0tdID0JamVxX2ltbSwKKwlbQlBGX0pNUCB8IEJQRl9KR1QgfCBCUEZfS10gPQlqZ3RfaW1tLAorCVtCUEZfSk1QIHwgQlBGX0pHRSB8IEJQRl9LXSA9CWpnZV9pbW0sCisJW0JQRl9KTVAgfCBCUEZfSlNFVCB8IEJQRl9LXSA9CWpzZXRfaW1tLAorCVtCUEZfSk1QIHwgQlBGX0pORSB8IEJQRl9LXSA9CWpuZV9pbW0sCisJW0JQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX1hdID0JamVxX3JlZywKKwlbQlBGX0pNUCB8IEJQRl9KR1QgfCBCUEZfWF0gPQlqZ3RfcmVnLAorCVtCUEZfSk1QIHwgQlBGX0pHRSB8IEJQRl9YXSA9CWpnZV9yZWcsCisJW0JQRl9KTVAgfCBCUEZfSlNFVCB8IEJQRl9YXSA9CWpzZXRfcmVnLAorCVtCUEZfSk1QIHwgQlBGX0pORSB8IEJQRl9YXSA9CWpuZV9yZWcsCisJW0JQRl9KTVAgfCBCUEZfRVhJVF0gPQkJZ290b19vdXQsCit9OworCisvKiAtLS0gTWlzYyBjb2RlIC0tLSAqLworc3RhdGljIHZvaWQgYnJfc2V0X29mZnNldCh1NjQgKmluc3RyLCB1MTYgb2Zmc2V0KQoreworCXUxNiBhZGRyX2xvLCBhZGRyX2hpOworCisJYWRkcl9sbyA9IG9mZnNldCAmIChPUF9CUl9BRERSX0xPID4+IF9fYmZfc2hmKE9QX0JSX0FERFJfTE8pKTsKKwlhZGRyX2hpID0gb2Zmc2V0ICE9IGFkZHJfbG87CisJKmluc3RyICY9IH4oT1BfQlJfQUREUl9ISSB8IE9QX0JSX0FERFJfTE8pOworCSppbnN0ciB8PSBGSUVMRF9QUkVQKE9QX0JSX0FERFJfSEksIGFkZHJfaGkpOworCSppbnN0ciB8PSBGSUVMRF9QUkVQKE9QX0JSX0FERFJfTE8sIGFkZHJfbG8pOworfQorCisvKiAtLS0gQXNzZW1ibGVyIGxvZ2ljIC0tLSAqLworc3RhdGljIGludCBuZnBfZml4dXBfYnJhbmNoZXMoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZykKK3sKKwlzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSwgKm5leHQ7CisJdTMyIG9mZiwgYnJfaWR4OworCXUzMiBpZHg7CisKKwluZnBfZm9yX2VhY2hfaW5zbl93YWxrMihuZnBfcHJvZywgbWV0YSwgbmV4dCkgeworCQlpZiAobWV0YS0+c2tpcCkKKwkJCWNvbnRpbnVlOworCQlpZiAoQlBGX0NMQVNTKG1ldGEtPmluc24uY29kZSkgIT0gQlBGX0pNUCkKKwkJCWNvbnRpbnVlOworCisJCWJyX2lkeCA9IG5mcF9wcm9nX29mZnNldF90b19pbmRleChuZnBfcHJvZywgbmV4dC0+b2ZmKSAtIDE7CisJCWlmICghbmZwX2lzX2JyKG5mcF9wcm9nLT5wcm9nW2JyX2lkeF0pKSB7CisJCQlwcl9lcnIoIkZpeHVwIGZvdW5kIGJsb2NrIG5vdCBlbmRpbmcgaW4gYnJhbmNoICVkICUwMnggJTAxNmxseCEhXG4iLAorCQkJICAgICAgIGJyX2lkeCwgbWV0YS0+aW5zbi5jb2RlLCBuZnBfcHJvZy0+cHJvZ1ticl9pZHhdKTsKKwkJCXJldHVybiAtRUxPT1A7CisJCX0KKwkJLyogTGVhdmUgc3BlY2lhbCBicmFuY2hlcyBmb3IgbGF0ZXIgKi8KKwkJaWYgKEZJRUxEX0dFVChPUF9CUl9TUEVDSUFMLCBuZnBfcHJvZy0+cHJvZ1ticl9pZHhdKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIEZpbmQgdGhlIHRhcmdldCBvZmZzZXQgaW4gYXNzZW1ibGVyIHJlYWxtICovCisJCW9mZiA9IG1ldGEtPmluc24ub2ZmOworCQlpZiAoIW9mZikgeworCQkJcHJfZXJyKCJGaXh1cCBmb3VuZCB6ZXJvIG9mZnNldCEhXG4iKTsKKwkJCXJldHVybiAtRUxPT1A7CisJCX0KKworCQl3aGlsZSAob2ZmICYmIG5mcF9tZXRhX2hhc19uZXh0KG5mcF9wcm9nLCBuZXh0KSkgeworCQkJbmV4dCA9IG5mcF9tZXRhX25leHQobmV4dCk7CisJCQlvZmYtLTsKKwkJfQorCQlpZiAob2ZmKSB7CisJCQlwcl9lcnIoIkZpeHVwIGZvdW5kIHRvbyBsYXJnZSBqdW1wISEgJWRcbiIsIG9mZik7CisJCQlyZXR1cm4gLUVMT09QOworCQl9CisKKwkJaWYgKG5leHQtPnNraXApIHsKKwkJCXByX2VycigiQnJhbmNoIGxhbmRpbmcgb24gcmVtb3ZlZCBpbnN0cnVjdGlvbiEhXG4iKTsKKwkJCXJldHVybiAtRUxPT1A7CisJCX0KKworCQlmb3IgKGlkeCA9IG5mcF9wcm9nX29mZnNldF90b19pbmRleChuZnBfcHJvZywgbWV0YS0+b2ZmKTsKKwkJICAgICBpZHggPD0gYnJfaWR4OyBpZHgrKykgeworCQkJaWYgKCFuZnBfaXNfYnIobmZwX3Byb2ctPnByb2dbaWR4XSkpCisJCQkJY29udGludWU7CisJCQlicl9zZXRfb2Zmc2V0KCZuZnBfcHJvZy0+cHJvZ1tpZHhdLCBuZXh0LT5vZmYpOworCQl9CisJfQorCisJLyogRml4dXAgJ2dvdG8gb3V0J3Mgc2VwYXJhdGVseSwgdGhleSBjYW4gYmUgc2NhdHRlcmVkIGFyb3VuZCAqLworCWZvciAoYnJfaWR4ID0gMDsgYnJfaWR4IDwgbmZwX3Byb2ctPnByb2dfbGVuOyBicl9pZHgrKykgeworCQllbnVtIGJyX3NwZWNpYWwgc3BlY2lhbDsKKworCQlpZiAoKG5mcF9wcm9nLT5wcm9nW2JyX2lkeF0gJiBPUF9CUl9CQVNFX01BU0spICE9IE9QX0JSX0JBU0UpCisJCQljb250aW51ZTsKKworCQlzcGVjaWFsID0gRklFTERfR0VUKE9QX0JSX1NQRUNJQUwsIG5mcF9wcm9nLT5wcm9nW2JyX2lkeF0pOworCQlzd2l0Y2ggKHNwZWNpYWwpIHsKKwkJY2FzZSBPUF9CUl9OT1JNQUw6CisJCQlicmVhazsKKwkJY2FzZSBPUF9CUl9HT19PVVQ6CisJCQlicl9zZXRfb2Zmc2V0KCZuZnBfcHJvZy0+cHJvZ1ticl9pZHhdLAorCQkJCSAgICAgIG5mcF9wcm9nLT50Z3Rfb3V0KTsKKwkJCWJyZWFrOworCQljYXNlIE9QX0JSX0dPX0FCT1JUOgorCQkJYnJfc2V0X29mZnNldCgmbmZwX3Byb2ctPnByb2dbYnJfaWR4XSwKKwkJCQkgICAgICBuZnBfcHJvZy0+dGd0X2Fib3J0KTsKKwkJCWJyZWFrOworCQl9CisKKwkJbmZwX3Byb2ctPnByb2dbYnJfaWR4XSAmPSB+T1BfQlJfU1BFQ0lBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbmZwX2ludHJvKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2cpCit7CisJZW1pdF9hbHUobmZwX3Byb2csIHBrdF9yZWcobmZwX3Byb2cpLAorCQkgcmVnX25vbmUoKSwgQUxVX09QX05PTkUsIE5GUF9CUEZfQUJJX1BLVCk7Cit9CisKK3N0YXRpYyB2b2lkIG5mcF9vdXRyb190Y19sZWdhY3koc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZykKK3sKKwljb25zdCB1OCBhY3QyY29kZVtdID0geworCQlbTk5fQUNUX1RDX0RST1BdICA9IDB4MjIsCisJCVtOTl9BQ1RfVENfUkVESVJdID0gMHgyNAorCX07CisJLyogVGFyZ2V0IGZvciBhYm9ydHMgKi8KKwluZnBfcHJvZy0+dGd0X2Fib3J0ID0gbmZwX3Byb2dfY3VycmVudF9vZmZzZXQobmZwX3Byb2cpOworCXdycF9pbW1lZChuZnBfcHJvZywgcmVnX2JvdGgoMCksIDApOworCisJLyogVGFyZ2V0IGZvciBub3JtYWwgZXhpdHMgKi8KKwluZnBfcHJvZy0+dGd0X291dCA9IG5mcF9wcm9nX2N1cnJlbnRfb2Zmc2V0KG5mcF9wcm9nKTsKKwkvKiBMZWdhY3kgVEMgbW9kZToKKwkgKiAgIDAgICAgICAgIDB4MTEgLT4gcGFzcywgIGNvdW50IGFzIHN0YXQwCisJICogIC0xICBkcm9wICAweDIyIC0+IGRyb3AsICBjb3VudCBhcyBzdGF0MQorCSAqICAgICByZWRpciAgMHgyNCAtPiByZWRpciwgY291bnQgYXMgc3RhdDEKKwkgKiAgaWZlIG1hcmsgIDB4MjEgLT4gcGFzcywgIGNvdW50IGFzIHN0YXQxCisJICogIGlmZSArIHR4ICAweDI0IC0+IHJlZGlyLCBjb3VudCBhcyBzdGF0MQorCSAqLworCWVtaXRfYnJfYnl0ZV9uZXEobmZwX3Byb2csIHJlZ19iKDApLCAweGZmLCAwLCBuZnBfcHJvZy0+dGd0X2RvbmUsIDIpOworCWVtaXRfYWx1KG5mcF9wcm9nLCByZWdfYSgwKSwKKwkJIHJlZ19ub25lKCksIEFMVV9PUF9OT05FLCBORlBfQlBGX0FCSV9GTEFHUyk7CisJZW1pdF9sZF9maWVsZChuZnBfcHJvZywgcmVnX2EoMCksIDB4YywgcmVnX2ltbSgweDExKSwgU0hGX1NDX0xfU0hGLCAxNik7CisKKwllbWl0X2JyKG5mcF9wcm9nLCBCUl9VTkMsIG5mcF9wcm9nLT50Z3RfZG9uZSwgMSk7CisJZW1pdF9sZF9maWVsZChuZnBfcHJvZywgcmVnX2EoMCksIDB4YywgcmVnX2ltbShhY3QyY29kZVtuZnBfcHJvZy0+YWN0XSksCisJCSAgICAgIFNIRl9TQ19MX1NIRiwgMTYpOworfQorCitzdGF0aWMgdm9pZCBuZnBfb3V0cm9fdGNfZGEoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZykKK3sKKwkvKiBUQyBkaXJlY3QtYWN0aW9uIG1vZGU6CisJICogICAwLDEgICBvayAgICAgICAgTk9UIFNVUFBPUlRFRFsxXQorCSAqICAgMiAgIGRyb3AgIDB4MjIgLT4gZHJvcCwgIGNvdW50IGFzIHN0YXQxCisJICogICA0LDUgbnVrZSAgMHgwMiAtPiBkcm9wCisJICogICA3ICByZWRpciAgMHg0NCAtPiByZWRpciwgY291bnQgYXMgc3RhdDIKKwkgKiAgICogdW5zcGVjICAweDExIC0+IHBhc3MsICBjb3VudCBhcyBzdGF0MAorCSAqCisJICogWzFdIFdlIGNhbid0IHN1cHBvcnQgT0sgYW5kIFJFQ0xBU1NJRlkgYmVjYXVzZSB3ZSBjYW4ndCB0ZWxsIFRDCisJICogICAgIHRoZSBleGFjdCBkZWNpc2lvbiBtYWRlLiAgV2UgYXJlIGZvcmNlZCB0byBzdXBwb3J0IFVOU1BFQworCSAqICAgICB0byBoYW5kbGUgYWJvcnRzIHNvIHRoYXQncyB0aGUgb25seSBvbmUgd2UgaGFuZGxlIGZvciBwYXNzaW5nCisJICogICAgIHBhY2tldHMgdXAgdGhlIHN0YWNrLgorCSAqLworCS8qIFRhcmdldCBmb3IgYWJvcnRzICovCisJbmZwX3Byb2ctPnRndF9hYm9ydCA9IG5mcF9wcm9nX2N1cnJlbnRfb2Zmc2V0KG5mcF9wcm9nKTsKKworCWVtaXRfYnJfZGVmKG5mcF9wcm9nLCBuZnBfcHJvZy0+dGd0X2RvbmUsIDIpOworCisJZW1pdF9hbHUobmZwX3Byb2csIHJlZ19hKDApLAorCQkgcmVnX25vbmUoKSwgQUxVX09QX05PTkUsIE5GUF9CUEZfQUJJX0ZMQUdTKTsKKwllbWl0X2xkX2ZpZWxkKG5mcF9wcm9nLCByZWdfYSgwKSwgMHhjLCByZWdfaW1tKDB4MTEpLCBTSEZfU0NfTF9TSEYsIDE2KTsKKworCS8qIFRhcmdldCBmb3Igbm9ybWFsIGV4aXRzICovCisJbmZwX3Byb2ctPnRndF9vdXQgPSBuZnBfcHJvZ19jdXJyZW50X29mZnNldChuZnBfcHJvZyk7CisKKwkvKiBpZiBSMCA+IDcganVtcCB0byBhYm9ydCAqLworCWVtaXRfYWx1KG5mcF9wcm9nLCByZWdfbm9uZSgpLCByZWdfaW1tKDcpLCBBTFVfT1BfU1VCLCByZWdfYigwKSk7CisJZW1pdF9icihuZnBfcHJvZywgQlJfQkxPLCBuZnBfcHJvZy0+dGd0X2Fib3J0LCAwKTsKKwllbWl0X2FsdShuZnBfcHJvZywgcmVnX2EoMCksCisJCSByZWdfbm9uZSgpLCBBTFVfT1BfTk9ORSwgTkZQX0JQRl9BQklfRkxBR1MpOworCisJd3JwX2ltbWVkKG5mcF9wcm9nLCByZWdfYigyKSwgMHg0MTIyMTIxMSk7CisJd3JwX2ltbWVkKG5mcF9wcm9nLCByZWdfYigzKSwgMHg0MTAwMTIxMSk7CisKKwllbWl0X3NoZihuZnBfcHJvZywgcmVnX2EoMSksCisJCSByZWdfbm9uZSgpLCBTSEZfT1BfTk9ORSwgcmVnX2IoMCksIFNIRl9TQ19MX1NIRiwgMik7CisKKwllbWl0X2FsdShuZnBfcHJvZywgcmVnX25vbmUoKSwgcmVnX2EoMSksIEFMVV9PUF9PUiwgcmVnX2ltbSgwKSk7CisJZW1pdF9zaGYobmZwX3Byb2csIHJlZ19hKDIpLAorCQkgcmVnX2ltbSgweGYpLCBTSEZfT1BfQU5ELCByZWdfYigyKSwgU0hGX1NDX1JfU0hGLCAwKTsKKworCWVtaXRfYWx1KG5mcF9wcm9nLCByZWdfbm9uZSgpLCByZWdfYSgxKSwgQUxVX09QX09SLCByZWdfaW1tKDApKTsKKwllbWl0X3NoZihuZnBfcHJvZywgcmVnX2IoMiksCisJCSByZWdfaW1tKDB4ZiksIFNIRl9PUF9BTkQsIHJlZ19iKDMpLCBTSEZfU0NfUl9TSEYsIDApOworCisJZW1pdF9icl9kZWYobmZwX3Byb2csIG5mcF9wcm9nLT50Z3RfZG9uZSwgMik7CisKKwllbWl0X3NoZihuZnBfcHJvZywgcmVnX2IoMiksCisJCSByZWdfYSgyKSwgU0hGX09QX09SLCByZWdfYigyKSwgU0hGX1NDX0xfU0hGLCA0KTsKKwllbWl0X2xkX2ZpZWxkKG5mcF9wcm9nLCByZWdfYSgwKSwgMHhjLCByZWdfYigyKSwgU0hGX1NDX0xfU0hGLCAxNik7Cit9CisKK3N0YXRpYyB2b2lkIG5mcF9vdXRybyhzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nKQoreworCXN3aXRjaCAobmZwX3Byb2ctPmFjdCkgeworCWNhc2UgTk5fQUNUX0RJUkVDVDoKKwkJbmZwX291dHJvX3RjX2RhKG5mcF9wcm9nKTsKKwkJYnJlYWs7CisJY2FzZSBOTl9BQ1RfVENfRFJPUDoKKwljYXNlIE5OX0FDVF9UQ19SRURJUjoKKwkJbmZwX291dHJvX3RjX2xlZ2FjeShuZnBfcHJvZyk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBuZnBfdHJhbnNsYXRlKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2cpCit7CisJc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGE7CisJaW50IGVycjsKKworCW5mcF9pbnRybyhuZnBfcHJvZyk7CisJaWYgKG5mcF9wcm9nLT5lcnJvcikKKwkJcmV0dXJuIG5mcF9wcm9nLT5lcnJvcjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobWV0YSwgJm5mcF9wcm9nLT5pbnNucywgbCkgeworCQlpbnN0cl9jYl90IGNiID0gaW5zdHJfY2JbbWV0YS0+aW5zbi5jb2RlXTsKKworCQltZXRhLT5vZmYgPSBuZnBfcHJvZ19jdXJyZW50X29mZnNldChuZnBfcHJvZyk7CisKKwkJaWYgKG1ldGEtPnNraXApIHsKKwkJCW5mcF9wcm9nLT5uX3RyYW5zbGF0ZWQrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKG5mcF9tZXRhX2hhc19wcmV2KG5mcF9wcm9nLCBtZXRhKSAmJgorCQkgICAgbmZwX21ldGFfcHJldihtZXRhKS0+ZG91YmxlX2NiKQorCQkJY2IgPSBuZnBfbWV0YV9wcmV2KG1ldGEpLT5kb3VibGVfY2I7CisJCWlmICghY2IpCisJCQlyZXR1cm4gLUVOT0VOVDsKKwkJZXJyID0gY2IobmZwX3Byb2csIG1ldGEpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQluZnBfcHJvZy0+bl90cmFuc2xhdGVkKys7CisJfQorCisJbmZwX291dHJvKG5mcF9wcm9nKTsKKwlpZiAobmZwX3Byb2ctPmVycm9yKQorCQlyZXR1cm4gbmZwX3Byb2ctPmVycm9yOworCisJcmV0dXJuIG5mcF9maXh1cF9icmFuY2hlcyhuZnBfcHJvZyk7Cit9CisKK3N0YXRpYyBpbnQKK25mcF9wcm9nX3ByZXBhcmUoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgY29uc3Qgc3RydWN0IGJwZl9pbnNuICpwcm9nLAorCQkgdW5zaWduZWQgaW50IGNudCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworCQlzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YTsKKworCQltZXRhID0ga3phbGxvYyhzaXplb2YoKm1ldGEpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFtZXRhKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJbWV0YS0+aW5zbiA9IHByb2dbaV07CisJCW1ldGEtPm4gPSBpOworCisJCWxpc3RfYWRkX3RhaWwoJm1ldGEtPmwsICZuZnBfcHJvZy0+aW5zbnMpOworCX0KKworCXJldHVybiAwOworfQorCisvKiAtLS0gT3B0aW1pemF0aW9ucyAtLS0gKi8KK3N0YXRpYyB2b2lkIG5mcF9icGZfb3B0X3JlZ19pbml0KHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2cpCit7CisJc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGE7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1ldGEsICZuZnBfcHJvZy0+aW5zbnMsIGwpIHsKKwkJc3RydWN0IGJwZl9pbnNuIGluc24gPSBtZXRhLT5pbnNuOworCisJCS8qIFByb2dyYW1zIGNvbnZlcnRlZCBmcm9tIGNCUEYgc3RhcnQgd2l0aCByZWdpc3RlciB4b3JpbmcgKi8KKwkJaWYgKGluc24uY29kZSA9PSAoQlBGX0FMVTY0IHwgQlBGX1hPUiB8IEJQRl9YKSAmJgorCQkgICAgaW5zbi5zcmNfcmVnID09IGluc24uZHN0X3JlZykKKwkJCWNvbnRpbnVlOworCisJCS8qIFByb2dyYW1zIHN0YXJ0IHdpdGggUjYgPSBSMSBidXQgd2UgaWdub3JlIHRoZSBza2IgcG9pbnRlciAqLworCQlpZiAoaW5zbi5jb2RlID09IChCUEZfQUxVNjQgfCBCUEZfTU9WIHwgQlBGX1gpICYmCisJCSAgICBpbnNuLnNyY19yZWcgPT0gMSAmJiBpbnNuLmRzdF9yZWcgPT0gNikKKwkJCW1ldGEtPnNraXAgPSB0cnVlOworCisJCS8qIFJldHVybiBhcyBzb29uIGFzIHNvbWV0aGluZyBkb2Vzbid0IG1hdGNoICovCisJCWlmICghbWV0YS0+c2tpcCkKKwkJCXJldHVybjsKKwl9Cit9CisKKy8qIFRyeSB0byByZW5hbWUgcmVnaXN0ZXJzIHNvIHRoYXQgcHJvZ3JhbSB1c2VzIG9ubHkgbG93IG9uZXMgKi8KK3N0YXRpYyBpbnQgbmZwX2JwZl9vcHRfcmVnX3JlbmFtZShzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nKQoreworCWJvb2wgcmVnX3VzZWRbTUFYX0JQRl9SRUddID0ge307CisJdTggdGd0X3JlZ1tNQVhfQlBGX1JFR10gPSB7fTsKKwlzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YTsKKwl1bnNpZ25lZCBpbnQgaSwgajsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobWV0YSwgJm5mcF9wcm9nLT5pbnNucywgbCkgeworCQlpZiAobWV0YS0+c2tpcCkKKwkJCWNvbnRpbnVlOworCisJCXJlZ191c2VkW21ldGEtPmluc24uc3JjX3JlZ10gPSB0cnVlOworCQlyZWdfdXNlZFttZXRhLT5pbnNuLmRzdF9yZWddID0gdHJ1ZTsKKwl9CisKKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IEFSUkFZX1NJWkUodGd0X3JlZyk7IGkrKykgeworCQlpZiAoIXJlZ191c2VkW2ldKQorCQkJY29udGludWU7CisKKwkJdGd0X3JlZ1tpXSA9IGorKzsKKwl9CisJbmZwX3Byb2ctPm51bV9yZWdzID0gajsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobWV0YSwgJm5mcF9wcm9nLT5pbnNucywgbCkgeworCQltZXRhLT5pbnNuLnNyY19yZWcgPSB0Z3RfcmVnW21ldGEtPmluc24uc3JjX3JlZ107CisJCW1ldGEtPmluc24uZHN0X3JlZyA9IHRndF9yZWdbbWV0YS0+aW5zbi5kc3RfcmVnXTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVtb3ZlIG1hc2tpbmcgYWZ0ZXIgbG9hZCBzaW5jZSBvdXIgbG9hZCBndWFyYW50ZWVzIHRoaXMgaXMgbm90IG5lZWRlZCAqLworc3RhdGljIHZvaWQgbmZwX2JwZl9vcHRfbGRfbWFzayhzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nKQoreworCXN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhMSwgKm1ldGEyOworCWNvbnN0IHMzMiBleHBfbWFza1tdID0geworCQlbQlBGX0JdID0gMHgwMDAwMDBmZlUsCisJCVtCUEZfSF0gPSAweDAwMDBmZmZmVSwKKwkJW0JQRl9XXSA9IDB4ZmZmZmZmZmZVLAorCX07CisKKwluZnBfZm9yX2VhY2hfaW5zbl93YWxrMihuZnBfcHJvZywgbWV0YTEsIG1ldGEyKSB7CisJCXN0cnVjdCBicGZfaW5zbiBpbnNuLCBuZXh0OworCisJCWluc24gPSBtZXRhMS0+aW5zbjsKKwkJbmV4dCA9IG1ldGEyLT5pbnNuOworCisJCWlmIChCUEZfQ0xBU1MoaW5zbi5jb2RlKSAhPSBCUEZfTEQpCisJCQljb250aW51ZTsKKwkJaWYgKEJQRl9NT0RFKGluc24uY29kZSkgIT0gQlBGX0FCUyAmJgorCQkgICAgQlBGX01PREUoaW5zbi5jb2RlKSAhPSBCUEZfSU5EKQorCQkJY29udGludWU7CisKKwkJaWYgKG5leHQuY29kZSAhPSAoQlBGX0FMVTY0IHwgQlBGX0FORCB8IEJQRl9LKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghZXhwX21hc2tbQlBGX1NJWkUoaW5zbi5jb2RlKV0pCisJCQljb250aW51ZTsKKwkJaWYgKGV4cF9tYXNrW0JQRl9TSVpFKGluc24uY29kZSldICE9IG5leHQuaW1tKQorCQkJY29udGludWU7CisKKwkJaWYgKG5leHQuc3JjX3JlZyB8fCBuZXh0LmRzdF9yZWcpCisJCQljb250aW51ZTsKKworCQltZXRhMi0+c2tpcCA9IHRydWU7CisJfQorfQorCitzdGF0aWMgdm9pZCBuZnBfYnBmX29wdF9sZF9zaGlmdChzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nKQoreworCXN0cnVjdCBuZnBfaW5zbl9tZXRhICptZXRhMSwgKm1ldGEyLCAqbWV0YTM7CisKKwluZnBfZm9yX2VhY2hfaW5zbl93YWxrMyhuZnBfcHJvZywgbWV0YTEsIG1ldGEyLCBtZXRhMykgeworCQlzdHJ1Y3QgYnBmX2luc24gaW5zbiwgbmV4dDEsIG5leHQyOworCisJCWluc24gPSBtZXRhMS0+aW5zbjsKKwkJbmV4dDEgPSBtZXRhMi0+aW5zbjsKKwkJbmV4dDIgPSBtZXRhMy0+aW5zbjsKKworCQlpZiAoQlBGX0NMQVNTKGluc24uY29kZSkgIT0gQlBGX0xEKQorCQkJY29udGludWU7CisJCWlmIChCUEZfTU9ERShpbnNuLmNvZGUpICE9IEJQRl9BQlMgJiYKKwkJICAgIEJQRl9NT0RFKGluc24uY29kZSkgIT0gQlBGX0lORCkKKwkJCWNvbnRpbnVlOworCQlpZiAoQlBGX1NJWkUoaW5zbi5jb2RlKSAhPSBCUEZfVykKKwkJCWNvbnRpbnVlOworCisJCWlmICghKG5leHQxLmNvZGUgPT0gKEJQRl9MU0ggfCBCUEZfSyB8IEJQRl9BTFU2NCkgJiYKKwkJICAgICAgbmV4dDIuY29kZSA9PSAoQlBGX1JTSCB8IEJQRl9LIHwgQlBGX0FMVTY0KSkgJiYKKwkJICAgICEobmV4dDEuY29kZSA9PSAoQlBGX1JTSCB8IEJQRl9LIHwgQlBGX0FMVTY0KSAmJgorCQkgICAgICBuZXh0Mi5jb2RlID09IChCUEZfTFNIIHwgQlBGX0sgfCBCUEZfQUxVNjQpKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChuZXh0MS5zcmNfcmVnIHx8IG5leHQxLmRzdF9yZWcgfHwKKwkJICAgIG5leHQyLnNyY19yZWcgfHwgbmV4dDIuZHN0X3JlZykKKwkJCWNvbnRpbnVlOworCisJCWlmIChuZXh0MS5pbW0gIT0gMHgyMCB8fCBuZXh0Mi5pbW0gIT0gMHgyMCkKKwkJCWNvbnRpbnVlOworCisJCW1ldGEyLT5za2lwID0gdHJ1ZTsKKwkJbWV0YTMtPnNraXAgPSB0cnVlOworCX0KK30KKworc3RhdGljIGludCBuZnBfYnBmX29wdGltaXplKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2cpCit7CisJaW50IHJldDsKKworCW5mcF9icGZfb3B0X3JlZ19pbml0KG5mcF9wcm9nKTsKKworCXJldCA9IG5mcF9icGZfb3B0X3JlZ19yZW5hbWUobmZwX3Byb2cpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwluZnBfYnBmX29wdF9sZF9tYXNrKG5mcF9wcm9nKTsKKwluZnBfYnBmX29wdF9sZF9zaGlmdChuZnBfcHJvZyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBuZnBfYnBmX2ppdCgpIC0gdHJhbnNsYXRlIEJQRiBjb2RlIGludG8gTkZQIGFzc2VtYmx5CisgKiBAZmlsdGVyOglrZXJuZWwgQlBGIGZpbHRlciBzdHJ1Y3QKKyAqIEBwcm9nX21lbToJbWVtb3J5IHRvIHN0b3JlIGFzc2VtYmxlciBpbnN0cnVjdGlvbnMKKyAqIEBhY3Q6CWFjdGlvbiBhdHRhY2hlZCB0byB0aGlzIGVCUEYgcHJvZ3JhbQorICogQHByb2dfc3RhcnQ6CW9mZnNldCBvZiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gd2hlbiBsb2FkZWQKKyAqIEBwcm9nX2RvbmU6CXdoZXJlIHRvIGp1bXAgb24gZXhpdAorICogQHByb2dfc3o6CXNpemUgb2YgQHByb2dfbWVtIGluIGluc3RydWN0aW9ucworICogQHJlczoJYWNoaWV2ZWQgcGFyYW1ldGVycyBvZiB0cmFuc2xhdGlvbiByZXN1bHRzCisgKi8KK2ludAorbmZwX2JwZl9qaXQoc3RydWN0IGJwZl9wcm9nICpmaWx0ZXIsIHZvaWQgKnByb2dfbWVtLAorCSAgICBlbnVtIG5mcF9icGZfYWN0aW9uX3R5cGUgYWN0LAorCSAgICB1bnNpZ25lZCBpbnQgcHJvZ19zdGFydCwgdW5zaWduZWQgaW50IHByb2dfZG9uZSwKKwkgICAgdW5zaWduZWQgaW50IHByb2dfc3osIHN0cnVjdCBuZnBfYnBmX3Jlc3VsdCAqcmVzKQoreworCXN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2c7CisJaW50IHJldDsKKworCW5mcF9wcm9nID0ga3phbGxvYyhzaXplb2YoKm5mcF9wcm9nKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZnBfcHJvZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlJTklUX0xJU1RfSEVBRCgmbmZwX3Byb2ctPmluc25zKTsKKwluZnBfcHJvZy0+YWN0ID0gYWN0OworCW5mcF9wcm9nLT5zdGFydF9vZmYgPSBwcm9nX3N0YXJ0OworCW5mcF9wcm9nLT50Z3RfZG9uZSA9IHByb2dfZG9uZTsKKworCXJldCA9IG5mcF9wcm9nX3ByZXBhcmUobmZwX3Byb2csIGZpbHRlci0+aW5zbnNpLCBmaWx0ZXItPmxlbik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBuZnBfcHJvZ192ZXJpZnkobmZwX3Byb2csIGZpbHRlcik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBuZnBfYnBmX29wdGltaXplKG5mcF9wcm9nKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWlmIChuZnBfcHJvZy0+bnVtX3JlZ3MgPD0gNykKKwkJbmZwX3Byb2ctPnJlZ3NfcGVyX3RocmVhZCA9IDE2OworCWVsc2UKKwkJbmZwX3Byb2ctPnJlZ3NfcGVyX3RocmVhZCA9IDMyOworCisJbmZwX3Byb2ctPnByb2cgPSBwcm9nX21lbTsKKwluZnBfcHJvZy0+X19wcm9nX2FsbG9jX2xlbiA9IHByb2dfc3o7CisKKwlyZXQgPSBuZnBfdHJhbnNsYXRlKG5mcF9wcm9nKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiVHJhbnNsYXRpb24gZmFpbGVkIHdpdGggZXJyb3IgJWQgKHRyYW5zbGF0ZWQ6ICV1KVxuIiwKKwkJICAgICAgIHJldCwgbmZwX3Byb2ctPm5fdHJhbnNsYXRlZCk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmVzLT5uX2luc3RyID0gbmZwX3Byb2ctPnByb2dfbGVuOworCXJlcy0+ZGVuc2VfbW9kZSA9IG5mcF9wcm9nLT5udW1fcmVncyA8PSA3Oworb3V0OgorCW5mcF9wcm9nX2ZyZWUobmZwX3Byb2cpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX2JwZl92ZXJpZmllci5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9uZnBfYnBmX3ZlcmlmaWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ0Y2FlOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX2JwZl92ZXJpZmllci5jCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IE5ldHJvbm9tZSBTeXN0ZW1zLCBJbmMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBMaWNlbnNlIFZlcnNpb24gMiwKKyAqIEp1bmUgMTk5MSBhcyBzaG93biBpbiB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5IG9mIHRoaXMKKyAqIHNvdXJjZSB0cmVlIG9yIHRoZSBCU0QgMi1DbGF1c2UgTGljZW5zZSBwcm92aWRlZCBiZWxvdy4gIFlvdSBoYXZlIHRoZQorICogb3B0aW9uIHRvIGxpY2Vuc2UgdGhpcyBzb2Z0d2FyZSB1bmRlciB0aGUgY29tcGxldGUgdGVybXMgb2YgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogVGhlIEJTRCAyLUNsYXVzZSBMaWNlbnNlOgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KQkiTkZQIG5ldCBicGY6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9icGYuaD4KKyNpbmNsdWRlIDxsaW51eC9icGZfdmVyaWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wa3RfY2xzLmg+CisKKyNpbmNsdWRlICJuZnBfYnBmLmgiCisKKy8qIEFuYWx5emVyL3ZlcmlmaWVyIGRlZmluaXRpb25zICovCitzdHJ1Y3QgbmZwX2JwZl9hbmFseXplcl9wcml2IHsKKwlzdHJ1Y3QgbmZwX3Byb2cgKnByb2c7CisJc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGE7Cit9OworCitzdGF0aWMgc3RydWN0IG5mcF9pbnNuX21ldGEgKgorbmZwX2JwZl9nb3RvX21ldGEoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IG5mcF9pbnNuX21ldGEgKm1ldGEsCisJCSAgdW5zaWduZWQgaW50IGluc25faWR4LCB1bnNpZ25lZCBpbnQgbl9pbnNucykKK3sKKwl1bnNpZ25lZCBpbnQgZm9yd2FyZCwgYmFja3dhcmQsIGk7CisKKwliYWNrd2FyZCA9IG1ldGEtPm4gLSBpbnNuX2lkeDsKKwlmb3J3YXJkID0gaW5zbl9pZHggLSBtZXRhLT5uOworCisJaWYgKG1pbihmb3J3YXJkLCBiYWNrd2FyZCkgPiBuX2luc25zIC0gaW5zbl9pZHggLSAxKSB7CisJCWJhY2t3YXJkID0gbl9pbnNucyAtIGluc25faWR4IC0gMTsKKwkJbWV0YSA9IG5mcF9wcm9nX2xhc3RfbWV0YShuZnBfcHJvZyk7CisJfQorCWlmIChtaW4oZm9yd2FyZCwgYmFja3dhcmQpID4gaW5zbl9pZHggJiYgYmFja3dhcmQgPiBpbnNuX2lkeCkgeworCQlmb3J3YXJkID0gaW5zbl9pZHg7CisJCW1ldGEgPSBuZnBfcHJvZ19maXJzdF9tZXRhKG5mcF9wcm9nKTsKKwl9CisKKwlpZiAoZm9yd2FyZCA8IGJhY2t3YXJkKQorCQlmb3IgKGkgPSAwOyBpIDwgZm9yd2FyZDsgaSsrKQorCQkJbWV0YSA9IG5mcF9tZXRhX25leHQobWV0YSk7CisJZWxzZQorCQlmb3IgKGkgPSAwOyBpIDwgYmFja3dhcmQ7IGkrKykKKwkJCW1ldGEgPSBuZnBfbWV0YV9wcmV2KG1ldGEpOworCisJcmV0dXJuIG1ldGE7Cit9CisKK3N0YXRpYyBpbnQKK25mcF9icGZfY2hlY2tfZXhpdChzdHJ1Y3QgbmZwX3Byb2cgKm5mcF9wcm9nLAorCQkgICBjb25zdCBzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KQoreworCWNvbnN0IHN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWcwID0gJmVudi0+Y3VyX3N0YXRlLnJlZ3NbMF07CisKKwlpZiAocmVnMC0+dHlwZSAhPSBDT05TVF9JTU0pIHsKKwkJcHJfaW5mbygidW5zdXBwb3J0ZWQgZXhpdCBzdGF0ZTogJWQsIGltbTogJWxseFxuIiwKKwkJCXJlZzAtPnR5cGUsIHJlZzAtPmltbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChuZnBfcHJvZy0+YWN0ICE9IE5OX0FDVF9ESVJFQ1QgJiYKKwkgICAgcmVnMC0+aW1tICE9IDAgJiYgKHJlZzAtPmltbSAmIH4wVSkgIT0gfjBVKSB7CisJCXByX2luZm8oInVuc3VwcG9ydGVkIGV4aXQgc3RhdGU6ICVkLCBpbW06ICVsbHhcbiIsCisJCQlyZWcwLT50eXBlLCByZWcwLT5pbW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobmZwX3Byb2ctPmFjdCA9PSBOTl9BQ1RfRElSRUNUICYmIHJlZzAtPmltbSA8PSBUQ19BQ1RfUkVESVJFQ1QgJiYKKwkgICAgcmVnMC0+aW1tICE9IFRDX0FDVF9TSE9UICYmIHJlZzAtPmltbSAhPSBUQ19BQ1RfU1RPTEVOICYmCisJICAgIHJlZzAtPmltbSAhPSBUQ19BQ1RfUVVFVUVEKSB7CisJCXByX2luZm8oInVuc3VwcG9ydGVkIGV4aXQgc3RhdGU6ICVkLCBpbW06ICVsbHhcbiIsCisJCQlyZWcwLT50eXBlLCByZWcwLT5pbW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbmZwX2JwZl9jaGVja19jdHhfcHRyKHN0cnVjdCBuZnBfcHJvZyAqbmZwX3Byb2csCisJCSAgICAgIGNvbnN0IHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHU4IHJlZykKK3sKKwlpZiAoZW52LT5jdXJfc3RhdGUucmVnc1tyZWddLnR5cGUgIT0gUFRSX1RPX0NUWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbmZwX3ZlcmlmeV9pbnNuKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIGludCBpbnNuX2lkeCwgaW50IHByZXZfaW5zbl9pZHgpCit7CisJc3RydWN0IG5mcF9icGZfYW5hbHl6ZXJfcHJpdiAqcHJpdiA9IGVudi0+YW5hbHl6ZXJfcHJpdjsKKwlzdHJ1Y3QgbmZwX2luc25fbWV0YSAqbWV0YSA9IHByaXYtPm1ldGE7CisKKwltZXRhID0gbmZwX2JwZl9nb3RvX21ldGEocHJpdi0+cHJvZywgbWV0YSwgaW5zbl9pZHgsIGVudi0+cHJvZy0+bGVuKTsKKwlwcml2LT5tZXRhID0gbWV0YTsKKworCWlmIChtZXRhLT5pbnNuLnNyY19yZWcgPT0gQlBGX1JFR18xMCB8fAorCSAgICBtZXRhLT5pbnNuLmRzdF9yZWcgPT0gQlBGX1JFR18xMCkgeworCQlwcl9lcnIoInN0YWNrIG5vdCB5ZXQgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChtZXRhLT5pbnNuLnNyY19yZWcgPj0gTUFYX0JQRl9SRUcgfHwKKwkgICAgbWV0YS0+aW5zbi5kc3RfcmVnID49IE1BWF9CUEZfUkVHKSB7CisJCXByX2VycigicHJvZ3JhbSB1c2VzIGV4dGVuZGVkIHJlZ2lzdGVycyAtIGppdCBoYXJkZW5pbmc/XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG1ldGEtPmluc24uY29kZSA9PSAoQlBGX0pNUCB8IEJQRl9FWElUKSkKKwkJcmV0dXJuIG5mcF9icGZfY2hlY2tfZXhpdChwcml2LT5wcm9nLCBlbnYpOworCisJaWYgKChtZXRhLT5pbnNuLmNvZGUgJiB+QlBGX1NJWkVfTUFTSykgPT0gKEJQRl9MRFggfCBCUEZfTUVNKSkKKwkJcmV0dXJuIG5mcF9icGZfY2hlY2tfY3R4X3B0cihwcml2LT5wcm9nLCBlbnYsCisJCQkJCSAgICAgbWV0YS0+aW5zbi5zcmNfcmVnKTsKKwlpZiAoKG1ldGEtPmluc24uY29kZSAmIH5CUEZfU0laRV9NQVNLKSA9PSAoQlBGX1NUWCB8IEJQRl9NRU0pKQorCQlyZXR1cm4gbmZwX2JwZl9jaGVja19jdHhfcHRyKHByaXYtPnByb2csIGVudiwKKwkJCQkJICAgICBtZXRhLT5pbnNuLmRzdF9yZWcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2V4dF9hbmFseXplcl9vcHMgbmZwX2JwZl9hbmFseXplcl9vcHMgPSB7CisJLmluc25faG9vayA9IG5mcF92ZXJpZnlfaW5zbiwKK307CisKK2ludCBuZnBfcHJvZ192ZXJpZnkoc3RydWN0IG5mcF9wcm9nICpuZnBfcHJvZywgc3RydWN0IGJwZl9wcm9nICpwcm9nKQoreworCXN0cnVjdCBuZnBfYnBmX2FuYWx5emVyX3ByaXYgKnByaXY7CisJaW50IHJldDsKKworCXByaXYgPSBremFsbG9jKHNpemVvZigqcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcml2LT5wcm9nID0gbmZwX3Byb2c7CisJcHJpdi0+bWV0YSA9IG5mcF9wcm9nX2ZpcnN0X21ldGEobmZwX3Byb2cpOworCisJcmV0ID0gYnBmX2FuYWx5emVyKHByb2csICZuZnBfYnBmX2FuYWx5emVyX29wcywgcHJpdik7CisKKwlrZnJlZShwcml2KTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRyb25vbWUvbmZwL25mcF9uZXQuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX25ldC5oCmluZGV4IDY5MDYzNTYuLmVkODI0ZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX25ldC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX25ldC5oCkBAIC02Miw2ICs2Miw5IEBACiAvKiBNYXggdGltZSB0byB3YWl0IGZvciBORlAgdG8gcmVzcG9uZCBvbiB1cGRhdGVzIChpbiBzZWNvbmRzKSAqLwogI2RlZmluZSBORlBfTkVUX1BPTExfVElNRU9VVAk1CiAKKy8qIEludGVydmFsIGZvciByZWFkaW5nIG9mZmxvYWRlZCBmaWx0ZXIgc3RhdHMgKi8KKyNkZWZpbmUgTkZQX05FVF9TVEFUX1BPTExfSVZMCW1zZWNzX3RvX2ppZmZpZXMoMTAwKQorCiAvKiBCYXIgYWxsb2NhdGlvbiAqLwogI2RlZmluZSBORlBfTkVUX0NUUkxfQkFSCTAKICNkZWZpbmUgTkZQX05FVF9RMF9CQVIJCTIKQEAgLTIyMCw3ICsyMjMsNyBAQAogI2RlZmluZSBQQ0lFX0RFU0NfUlhfSV9UQ1BfQ1NVTV9PSwljcHVfdG9fbGUxNihCSVQoMTEpKQogI2RlZmluZSBQQ0lFX0RFU0NfUlhfSV9VRFBfQ1NVTQkJY3B1X3RvX2xlMTYoQklUKDEwKSkKICNkZWZpbmUgUENJRV9ERVNDX1JYX0lfVURQX0NTVU1fT0sJY3B1X3RvX2xlMTYoQklUKDkpKQotI2RlZmluZSBQQ0lFX0RFU0NfUlhfU1BBUkUJCWNwdV90b19sZTE2KEJJVCg4KSkKKyNkZWZpbmUgUENJRV9ERVNDX1JYX0JQRgkJY3B1X3RvX2xlMTYoQklUKDgpKQogI2RlZmluZSBQQ0lFX0RFU0NfUlhfRU9QCQljcHVfdG9fbGUxNihCSVQoNykpCiAjZGVmaW5lIFBDSUVfREVTQ19SWF9JUDRfQ1NVTQkJY3B1X3RvX2xlMTYoQklUKDYpKQogI2RlZmluZSBQQ0lFX0RFU0NfUlhfSVA0X0NTVU1fT0sJY3B1X3RvX2xlMTYoQklUKDUpKQpAQCAtMjY2LDYgKzI2OSw4IEBACiAJfTsKIH07CiAKKyNkZWZpbmUgTkZQX05FVF9NRVRBX0ZJRUxEX01BU0sgR0VOTUFTSyhORlBfTkVUX01FVEFfRklFTERfU0laRSAtIDEsIDApCisKIHN0cnVjdCBuZnBfbmV0X3J4X2hhc2ggewogCV9fYmUzMiBoYXNoX3R5cGU7CiAJX19iZTMyIGhhc2g7CkBAIC00MDUsNiArNDEwLDExIEBACiAJICAgICAgIGZ3X3Zlci0+bWlub3IgPT0gbWlub3I7CiB9CiAKK3N0cnVjdCBuZnBfc3RhdF9wYWlyIHsKKwl1NjQgcGt0czsKKwl1NjQgYnl0ZXM7Cit9OworCiAvKioKICAqIHN0cnVjdCBuZnBfbmV0IC0gTkZQIG5ldHdvcmsgZGV2aWNlIHN0cnVjdHVyZQogICogQHBkZXY6ICAgICAgICAgICAgICAgQmFja3BvaW50ZXIgdG8gUENJIGRldmljZQpAQCAtNDEzLDYgKzQyMyw3IEBACiAgKiBAaXNfdmY6ICAgICAgICAgICAgICBJcyB0aGUgZHJpdmVyIGF0dGFjaGVkIHRvIGEgVkY/CiAgKiBAaXNfbmZwMzIwMDogICAgICAgICBJcyB0aGUgZHJpdmVyIGZvciBhIE5GUC0zMjAwIGNhcmQ/CiAgKiBAZndfbG9hZGVkOiAgICAgICAgICBJcyB0aGUgZmlybXdhcmUgbG9hZGVkPworICogQGJwZl9vZmZsb2FkX3NraXBfc3c6ICBPZmZsb2FkZWQgQlBGIHByb2dyYW0gd2lsbCBub3QgYmUgcmVydW4gYnkgY2xzX2JwZgogICogQGN0cmw6ICAgICAgICAgICAgICAgTG9jYWwgY29weSBvZiB0aGUgY29udHJvbCByZWdpc3Rlci93b3JkLgogICogQGZsX2J1ZnN6OiAgICAgICAgICAgQ3VycmVudGx5IGNvbmZpZ3VyZWQgc2l6ZSBvZiB0aGUgZnJlZWxpc3QgYnVmZmVycwogICogQHJ4X29mZnNldDoJCU9mZnNldCBpbiB0aGUgUlggYnVmZmVycyB3aGVyZSBwYWNrZXQgZGF0YSBzdGFydHMKQEAgLTQyNyw2ICs0MzgsMTEgQEAKICAqIEByc3NfY2ZnOiAgICAgICAgICAgIFJTUyBjb25maWd1cmF0aW9uCiAgKiBAcnNzX2tleTogICAgICAgICAgICBSU1Mgc2VjcmV0IGtleQogICogQHJzc19pdGJsOiAgICAgICAgICAgUlNTIGluZGlyZWN0aW9uIHRhYmxlCisgKiBAcnhfZmlsdGVyOgkJRmlsdGVyIG9mZmxvYWQgc3RhdGlzdGljcyAtIGRyb3BwZWQgcGFja2V0cy9ieXRlcworICogQHJ4X2ZpbHRlcl9wcmV2OglGaWx0ZXIgb2ZmbG9hZCBzdGF0aXN0aWNzIC0gdmFsdWVzIGZyb20gcHJldmlvdXMgdXBkYXRlCisgKiBAcnhfZmlsdGVyX2NoYW5nZToJSmlmZmllcyB3aGVuIHN0YXRpc3RpY3MgbGFzdCBjaGFuZ2VkCisgKiBAcnhfZmlsdGVyX3N0YXRzX3RpbWVyOiAgVGltZXIgZm9yIHBvbGxpbmcgZmlsdGVyIG9mZmxvYWQgc3RhdGlzdGljcworICogQHJ4X2ZpbHRlcl9sb2NrOglMb2NrIHByb3RlY3RpbmcgdGltZXIgc3RhdGUgY2hhbmdlcyAodGVhcmRvd24pCiAgKiBAbWF4X3R4X3JpbmdzOiAgICAgICBNYXhpbXVtIG51bWJlciBvZiBUWCByaW5ncyBzdXBwb3J0ZWQgYnkgdGhlIEZpcm13YXJlCiAgKiBAbWF4X3J4X3JpbmdzOiAgICAgICBNYXhpbXVtIG51bWJlciBvZiBSWCByaW5ncyBzdXBwb3J0ZWQgYnkgdGhlIEZpcm13YXJlCiAgKiBAbnVtX3R4X3JpbmdzOiAgICAgICBDdXJyZW50bHkgY29uZmlndXJlZCBudW1iZXIgb2YgVFggcmluZ3MKQEAgLTQ3Myw2ICs0ODksNyBAQAogCXVuc2lnbmVkIGlzX3ZmOjE7CiAJdW5zaWduZWQgaXNfbmZwMzIwMDoxOwogCXVuc2lnbmVkIGZ3X2xvYWRlZDoxOworCXVuc2lnbmVkIGJwZl9vZmZsb2FkX3NraXBfc3c6MTsKIAogCXUzMiBjdHJsOwogCXUzMiBmbF9idWZzejsKQEAgLTUwMiw2ICs1MTksMTEgQEAKIAl1OCByc3Nfa2V5W05GUF9ORVRfQ0ZHX1JTU19LRVlfU1pdOwogCXU4IHJzc19pdGJsW05GUF9ORVRfQ0ZHX1JTU19JVEJMX1NaXTsKIAorCXN0cnVjdCBuZnBfc3RhdF9wYWlyIHJ4X2ZpbHRlciwgcnhfZmlsdGVyX3ByZXY7CisJdW5zaWduZWQgbG9uZyByeF9maWx0ZXJfY2hhbmdlOworCXN0cnVjdCB0aW1lcl9saXN0IHJ4X2ZpbHRlcl9zdGF0c190aW1lcjsKKwlzcGlubG9ja190IHJ4X2ZpbHRlcl9sb2NrOworCiAJaW50IG1heF90eF9yaW5nczsKIAlpbnQgbWF4X3J4X3JpbmdzOwogCkBAIC01NjEsMTIgKzU4MywyOCBAQAogLyogRnVuY3Rpb25zIHRvIHJlYWQvd3JpdGUgZnJvbS90byBhIEJBUgogICogUGVyZm9ybXMgYW55IGVuZGlhbiBjb252ZXJzaW9uIG5lY2Vzc2FyeS4KICAqLworc3RhdGljIGlubGluZSB1MTYgbm5fcmVhZGIoc3RydWN0IG5mcF9uZXQgKm5uLCBpbnQgb2ZmKQoreworCXJldHVybiByZWFkYihubi0+Y3RybF9iYXIgKyBvZmYpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgbm5fd3JpdGViKHN0cnVjdCBuZnBfbmV0ICpubiwgaW50IG9mZiwgdTggdmFsKQogewogCXdyaXRlYih2YWwsIG5uLT5jdHJsX2JhciArIG9mZik7CiB9CiAKLS8qIE5GUC0zMjAwIGNhbid0IGhhbmRsZSAxNi1iaXQgYWNjZXNzZXMgdG9vIHdlbGwgLSBoZW5jZSBubyByZWFkdy93cml0ZXcgKi8KKy8qIE5GUC0zMjAwIGNhbid0IGhhbmRsZSAxNi1iaXQgYWNjZXNzZXMgdG9vIHdlbGwgKi8KK3N0YXRpYyBpbmxpbmUgdTE2IG5uX3JlYWR3KHN0cnVjdCBuZnBfbmV0ICpubiwgaW50IG9mZikKK3sKKwlXQVJOX09OX09OQ0Uobm4tPmlzX25mcDMyMDApOworCXJldHVybiByZWFkdyhubi0+Y3RybF9iYXIgKyBvZmYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbm5fd3JpdGV3KHN0cnVjdCBuZnBfbmV0ICpubiwgaW50IG9mZiwgdTE2IHZhbCkKK3sKKwlXQVJOX09OX09OQ0Uobm4tPmlzX25mcDMyMDApOworCXdyaXRldyh2YWwsIG5uLT5jdHJsX2JhciArIG9mZik7Cit9CiAKIHN0YXRpYyBpbmxpbmUgdTMyIG5uX3JlYWRsKHN0cnVjdCBuZnBfbmV0ICpubiwgaW50IG9mZikKIHsKQEAgLTc1Nyw0ICs3OTUsOSBAQAogfQogI2VuZGlmIC8qIENPTkZJR19ORlBfTkVUX0RFQlVHICovCiAKK3ZvaWQgbmZwX25ldF9maWx0ZXJfc3RhdHNfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKK2ludAorbmZwX25ldF9icGZfb2ZmbG9hZChzdHJ1Y3QgbmZwX25ldCAqbm4sIHUzMiBoYW5kbGUsIF9fYmUxNiBwcm90bywKKwkJICAgIHN0cnVjdCB0Y19jbHNfYnBmX29mZmxvYWQgKmNsc19icGYpOworCiAjZW5kaWYgLyogX05GUF9ORVRfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX25ldF9jb21tb24uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX25ldF9jb21tb24uYwppbmRleCA4ODY3OGMxLi5hZWUzZmQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRyb25vbWUvbmZwL25mcF9uZXRfY29tbW9uLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9uZnBfbmV0X2NvbW1vbi5jCkBAIC00MSw3ICs0MSw2IEBACiAgKiAgICAgICAgICBDaHJpcyBUZWxmZXIgPGNocmlzLnRlbGZlckBuZXRyb25vbWUuY29tPgogICovCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtNjEsNiArNjAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KIAorI2luY2x1ZGUgPG5ldC9wa3RfY2xzLmg+CiAjaW5jbHVkZSA8bmV0L3Z4bGFuLmg+CiAKICNpbmNsdWRlICJuZnBfbmV0X2N0cmwuaCIKQEAgLTEyOTMsMzYgKzEyOTMsNzAgQEAKIAl9CiB9CiAKLS8qKgotICogbmZwX25ldF9zZXRfaGFzaCgpIC0gU2V0IFNLQiBoYXNoIGRhdGEKLSAqIEBuZXRkZXY6IGFkYXB0ZXIncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQotICogQHNrYjogICBTS0IgdG8gc2V0IHRoZSBoYXNoIGRhdGEgb24KLSAqIEByeGQ6ICAgUlggZGVzY3JpcHRvcgotICoKLSAqIFRoZSBSU1MgaGFzaCBhbmQgaGFzaC10eXBlIGFyZSBwcmUtcGVuZGVkIHRvIHRoZSBwYWNrZXQgZGF0YS4KLSAqIEV4dHJhY3QgYW5kIGRlY29kZSBpdCBhbmQgc2V0IHRoZSBza2IgZmllbGRzLgotICovCiBzdGF0aWMgdm9pZCBuZnBfbmV0X3NldF9oYXNoKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgIHN0cnVjdCBuZnBfbmV0X3J4X2Rlc2MgKnJ4ZCkKKwkJCSAgICAgdW5zaWduZWQgaW50IHR5cGUsIF9fYmUzMiAqaGFzaCkKK3sKKwlpZiAoIShuZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9SWEhBU0gpKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIE5GUF9ORVRfUlNTX0lQVjQ6CisJY2FzZSBORlBfTkVUX1JTU19JUFY2OgorCWNhc2UgTkZQX05FVF9SU1NfSVBWNl9FWDoKKwkJc2tiX3NldF9oYXNoKHNrYiwgZ2V0X3VuYWxpZ25lZF9iZTMyKGhhc2gpLCBQS1RfSEFTSF9UWVBFX0wzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2tiX3NldF9oYXNoKHNrYiwgZ2V0X3VuYWxpZ25lZF9iZTMyKGhhc2gpLCBQS1RfSEFTSF9UWVBFX0w0KTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZAorbmZwX25ldF9zZXRfaGFzaF9kZXNjKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBza19idWZmICpza2IsCisJCSAgICAgIHN0cnVjdCBuZnBfbmV0X3J4X2Rlc2MgKnJ4ZCkKIHsKIAlzdHJ1Y3QgbmZwX25ldF9yeF9oYXNoICpyeF9oYXNoOwogCi0JaWYgKCEocnhkLT5yeGQuZmxhZ3MgJiBQQ0lFX0RFU0NfUlhfUlNTKSB8fAotCSAgICAhKG5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1JYSEFTSCkpCisJaWYgKCEocnhkLT5yeGQuZmxhZ3MgJiBQQ0lFX0RFU0NfUlhfUlNTKSkKIAkJcmV0dXJuOwogCiAJcnhfaGFzaCA9IChzdHJ1Y3QgbmZwX25ldF9yeF9oYXNoICopKHNrYi0+ZGF0YSAtIHNpemVvZigqcnhfaGFzaCkpOwogCi0Jc3dpdGNoIChiZTMyX3RvX2NwdShyeF9oYXNoLT5oYXNoX3R5cGUpKSB7Ci0JY2FzZSBORlBfTkVUX1JTU19JUFY0OgotCWNhc2UgTkZQX05FVF9SU1NfSVBWNjoKLQljYXNlIE5GUF9ORVRfUlNTX0lQVjZfRVg6Ci0JCXNrYl9zZXRfaGFzaChza2IsIGJlMzJfdG9fY3B1KHJ4X2hhc2gtPmhhc2gpLCBQS1RfSEFTSF9UWVBFX0wzKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJc2tiX3NldF9oYXNoKHNrYiwgYmUzMl90b19jcHUocnhfaGFzaC0+aGFzaCksIFBLVF9IQVNIX1RZUEVfTDQpOwotCQlicmVhazsKKwluZnBfbmV0X3NldF9oYXNoKG5ldGRldiwgc2tiLCBnZXRfdW5hbGlnbmVkX2JlMzIoJnJ4X2hhc2gtPmhhc2hfdHlwZSksCisJCQkgJnJ4X2hhc2gtPmhhc2gpOworfQorCitzdGF0aWMgdm9pZCAqCituZnBfbmV0X3BhcnNlX21ldGEoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgaW50IG1ldGFfbGVuKQoreworCXU4ICpkYXRhID0gc2tiLT5kYXRhIC0gbWV0YV9sZW47CisJdTMyIG1ldGFfaW5mbzsKKworCW1ldGFfaW5mbyA9IGdldF91bmFsaWduZWRfYmUzMihkYXRhKTsKKwlkYXRhICs9IDQ7CisKKwl3aGlsZSAobWV0YV9pbmZvKSB7CisJCXN3aXRjaCAobWV0YV9pbmZvICYgTkZQX05FVF9NRVRBX0ZJRUxEX01BU0spIHsKKwkJY2FzZSBORlBfTkVUX01FVEFfSEFTSDoKKwkJCW1ldGFfaW5mbyA+Pj0gTkZQX05FVF9NRVRBX0ZJRUxEX1NJWkU7CisJCQluZnBfbmV0X3NldF9oYXNoKG5ldGRldiwgc2tiLAorCQkJCQkgbWV0YV9pbmZvICYgTkZQX05FVF9NRVRBX0ZJRUxEX01BU0ssCisJCQkJCSAoX19iZTMyICopZGF0YSk7CisJCQlkYXRhICs9IDQ7CisJCQlicmVhazsKKwkJY2FzZSBORlBfTkVUX01FVEFfTUFSSzoKKwkJCXNrYi0+bWFyayA9IGdldF91bmFsaWduZWRfYmUzMihkYXRhKTsKKwkJCWRhdGEgKz0gNDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltZXRhX2luZm8gPj49IE5GUF9ORVRfTUVUQV9GSUVMRF9TSVpFOwogCX0KKworCXJldHVybiBkYXRhOwogfQogCiAvKioKQEAgLTE0MzksMTggKzE0NzMsMjkgQEAKIAkJCXNrYl9yZXNlcnZlKHNrYiwgbm4tPnJ4X29mZnNldCk7CiAJCXNrYl9wdXQoc2tiLCBkYXRhX2xlbiAtIG1ldGFfbGVuKTsKIAotCQluZnBfbmV0X3NldF9oYXNoKG5uLT5uZXRkZXYsIHNrYiwgcnhkKTsKLQotCQkvKiBQYWQgc21hbGwgZnJhbWVzIHRvIG1pbmltdW0gKi8KLQkJaWYgKHNrYl9wdXRfcGFkdG8oc2tiLCA2MCkpCi0JCQlicmVhazsKLQogCQkvKiBTdGF0cyB1cGRhdGUgKi8KIAkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmcl92ZWMtPnJ4X3N5bmMpOwogCQlyX3ZlYy0+cnhfcGt0cysrOwogCQlyX3ZlYy0+cnhfYnl0ZXMgKz0gc2tiLT5sZW47CiAJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZyX3ZlYy0+cnhfc3luYyk7CiAKKwkJaWYgKG5uLT5md192ZXIubWFqb3IgPD0gMykgeworCQkJbmZwX25ldF9zZXRfaGFzaF9kZXNjKG5uLT5uZXRkZXYsIHNrYiwgcnhkKTsKKwkJfSBlbHNlIGlmIChtZXRhX2xlbikgeworCQkJdm9pZCAqZW5kOworCisJCQllbmQgPSBuZnBfbmV0X3BhcnNlX21ldGEobm4tPm5ldGRldiwgc2tiLCBtZXRhX2xlbik7CisJCQlpZiAodW5saWtlbHkoZW5kICE9IHNrYi0+ZGF0YSkpIHsKKwkJCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZyX3ZlYy0+cnhfc3luYyk7CisJCQkJcl92ZWMtPnJ4X2Ryb3BzKys7CisJCQkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnJfdmVjLT5yeF9zeW5jKTsKKworCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQkJbm5fd2Fybl9yYXRlbGltaXQobm4sICJpbnZhbGlkIFJYIHBhY2tldCBtZXRhZGF0YVxuIik7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwogCQlza2JfcmVjb3JkX3J4X3F1ZXVlKHNrYiwgcnhfcmluZy0+aWR4KTsKIAkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgbm4tPm5ldGRldik7CiAKQEAgLTIwNDksMTIgKzIwOTQsMTYgQEAKIAogCW5uLT5yeF9yaW5ncyA9IGtjYWxsb2Mobm4tPm51bV9yeF9yaW5ncywgc2l6ZW9mKCpubi0+cnhfcmluZ3MpLAogCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmICghbm4tPnJ4X3JpbmdzKQorCWlmICghbm4tPnJ4X3JpbmdzKSB7CisJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX2ZyZWVfbHNjOworCX0KIAlubi0+dHhfcmluZ3MgPSBrY2FsbG9jKG5uLT5udW1fdHhfcmluZ3MsIHNpemVvZigqbm4tPnR4X3JpbmdzKSwKIAkJCSAgICAgICBHRlBfS0VSTkVMKTsKLQlpZiAoIW5uLT50eF9yaW5ncykKKwlpZiAoIW5uLT50eF9yaW5ncykgeworCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9mcmVlX3J4X3JpbmdzOworCX0KIAogCWZvciAociA9IDA7IHIgPCBubi0+bnVtX3JfdmVjczsgcisrKSB7CiAJCWVyciA9IG5mcF9uZXRfcHJlcGFyZV92ZWN0b3Iobm4sICZubi0+cl92ZWNzW3JdLCByKTsKQEAgLTIzODcsNiArMjQzNiwzMSBAQAogCXJldHVybiBzdGF0czsKIH0KIAorc3RhdGljIGJvb2wgbmZwX25ldF9lYnBmX2NhcGFibGUoc3RydWN0IG5mcF9uZXQgKm5uKQoreworCWlmIChubi0+Y2FwICYgTkZQX05FVF9DRkdfQ1RSTF9CUEYgJiYKKwkgICAgbm5fcmVhZGIobm4sIE5GUF9ORVRfQ0ZHX0JQRl9BQkkpID09IE5GUF9ORVRfQlBGX0FCSSkKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50CituZnBfbmV0X3NldHVwX3RjKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBoYW5kbGUsIF9fYmUxNiBwcm90bywKKwkJIHN0cnVjdCB0Y190b19uZXRkZXYgKnRjKQoreworCXN0cnVjdCBuZnBfbmV0ICpubiA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlpZiAoVENfSF9NQUooaGFuZGxlKSAhPSBUQ19IX01BSihUQ19IX0lOR1JFU1MpKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCWlmIChwcm90byAhPSBodG9ucyhFVEhfUF9BTEwpKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCisJaWYgKHRjLT50eXBlID09IFRDX1NFVFVQX0NMU0JQRiAmJiBuZnBfbmV0X2VicGZfY2FwYWJsZShubikpCisJCXJldHVybiBuZnBfbmV0X2JwZl9vZmZsb2FkKG5uLCBoYW5kbGUsIHByb3RvLCB0Yy0+Y2xzX2JwZik7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKwogc3RhdGljIGludCBuZnBfbmV0X3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCQkJCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewpAQCAtMjQ0MSw2ICsyNTE1LDExIEBACiAJCQluZXdfY3RybCAmPSB+TkZQX05FVF9DRkdfQ1RSTF9HQVRIRVI7CiAJfQogCisJaWYgKGNoYW5nZWQgJiBORVRJRl9GX0hXX1RDICYmIG5uLT5jdHJsICYgTkZQX05FVF9DRkdfQ1RSTF9CUEYpIHsKKwkJbm5fZXJyKG5uLCAiQ2Fubm90IGRpc2FibGUgSFcgVEMgb2ZmbG9hZCB3aGlsZSBpbiB1c2VcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwogCW5uX2RiZyhubiwgIkZlYXR1cmUgY2hhbmdlIDB4JWxseCAtPiAweCVsbHggKGNoYW5nZWQ9MHglbGx4KVxuIiwKIAkgICAgICAgbmV0ZGV2LT5mZWF0dXJlcywgZmVhdHVyZXMsIGNoYW5nZWQpOwogCkBAIC0yNTkwLDYgKzI2NjksNyBAQAogCS5uZG9fc3RvcAkJPSBuZnBfbmV0X25ldGRldl9jbG9zZSwKIAkubmRvX3N0YXJ0X3htaXQJCT0gbmZwX25ldF90eCwKIAkubmRvX2dldF9zdGF0czY0CT0gbmZwX25ldF9zdGF0NjQsCisJLm5kb19zZXR1cF90YwkJPSBuZnBfbmV0X3NldHVwX3RjLAogCS5uZG9fdHhfdGltZW91dAkJPSBuZnBfbmV0X3R4X3RpbWVvdXQsCiAJLm5kb19zZXRfcnhfbW9kZQk9IG5mcF9uZXRfc2V0X3J4X21vZGUsCiAJLm5kb19jaGFuZ2VfbXR1CQk9IG5mcF9uZXRfY2hhbmdlX210dSwKQEAgLTI2MTUsNyArMjY5NSw3IEBACiAJCW5uLT5md192ZXIucmVzdiwgbm4tPmZ3X3Zlci5jbGFzcywKIAkJbm4tPmZ3X3Zlci5tYWpvciwgbm4tPmZ3X3Zlci5taW5vciwKIAkJbm4tPm1heF9tdHUpOwotCW5uX2luZm8obm4sICJDQVA6ICUjeCAlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlc1xuIiwKKwlubl9pbmZvKG5uLCAiQ0FQOiAlI3ggJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlc1xuIiwKIAkJbm4tPmNhcCwKIAkJbm4tPmNhcCAmIE5GUF9ORVRfQ0ZHX0NUUkxfUFJPTUlTQyAgPyAiUFJPTUlTQyAiICA6ICIiLAogCQlubi0+Y2FwICYgTkZQX05FVF9DRkdfQ1RSTF9MMkJDICAgICA/ICJMMkJDRklMVCAiIDogIiIsCkBAIC0yNjMyLDcgKzI3MTIsOCBAQAogCQlubi0+Y2FwICYgTkZQX05FVF9DRkdfQ1RSTF9NU0lYQVVUTyA/ICJBVVRPTUFTSyAiIDogIiIsCiAJCW5uLT5jYXAgJiBORlBfTkVUX0NGR19DVFJMX0lSUU1PRCAgID8gIklSUU1PRCAiICAgOiAiIiwKIAkJbm4tPmNhcCAmIE5GUF9ORVRfQ0ZHX0NUUkxfVlhMQU4gICAgPyAiVlhMQU4gIiAgICA6ICIiLAotCQlubi0+Y2FwICYgTkZQX05FVF9DRkdfQ1RSTF9OVkdSRSAgICA/ICJOVkdSRSAiCSAgOiAiIik7CisJCW5uLT5jYXAgJiBORlBfTkVUX0NGR19DVFJMX05WR1JFICAgID8gIk5WR1JFICIJICA6ICIiLAorCQluZnBfbmV0X2VicGZfY2FwYWJsZShubikgICAgICAgICAgICA/ICJCUEYgIgkgIDogIiIpOwogfQogCiAvKioKQEAgLTI2NzUsMTAgKzI3NTYsMTMgQEAKIAlubi0+cnhkX2NudCA9IE5GUF9ORVRfUlhfREVTQ1NfREVGQVVMVDsKIAogCXNwaW5fbG9ja19pbml0KCZubi0+cmVjb25maWdfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJm5uLT5yeF9maWx0ZXJfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJm5uLT5saW5rX3N0YXR1c19sb2NrKTsKIAogCXNldHVwX3RpbWVyKCZubi0+cmVjb25maWdfdGltZXIsCiAJCSAgICBuZnBfbmV0X3JlY29uZmlnX3RpbWVyLCAodW5zaWduZWQgbG9uZylubik7CisJc2V0dXBfdGltZXIoJm5uLT5yeF9maWx0ZXJfc3RhdHNfdGltZXIsCisJCSAgICBuZnBfbmV0X2ZpbHRlcl9zdGF0c190aW1lciwgKHVuc2lnbmVkIGxvbmcpbm4pOwogCiAJcmV0dXJuIG5uOwogfQpAQCAtMjgwMCw2ICsyODg0LDkgQEAKIAogCW5ldGRldi0+ZmVhdHVyZXMgPSBuZXRkZXYtPmh3X2ZlYXR1cmVzOwogCisJaWYgKG5mcF9uZXRfZWJwZl9jYXBhYmxlKG5uKSkKKwkJbmV0ZGV2LT5od19mZWF0dXJlcyB8PSBORVRJRl9GX0hXX1RDOworCiAJLyogQWR2ZXJ0aXNlIGJ1dCBkaXNhYmxlIFRTTyBieSBkZWZhdWx0LiAqLwogCW5ldGRldi0+ZmVhdHVyZXMgJj0gfihORVRJRl9GX1RTTyB8IE5FVElGX0ZfVFNPNik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX25ldF9jdHJsLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRyb25vbWUvbmZwL25mcF9uZXRfY3RybC5oCmluZGV4IGFkNmM0ZTMuLjkzYjEwYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX25ldF9jdHJsLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9uZnBfbmV0X2N0cmwuaApAQCAtNjYsNiArNjYsMTMgQEAKICNkZWZpbmUgTkZQX05FVF9MU09fTUFYX0hEUl9TWgkJMjU1CiAKIC8qKgorICogUHJlcGVuZCBmaWVsZCB0eXBlcworICovCisjZGVmaW5lIE5GUF9ORVRfTUVUQV9GSUVMRF9TSVpFCQk0CisjZGVmaW5lIE5GUF9ORVRfTUVUQV9IQVNICQkxIC8qIG5leHQgZmllbGQgY2FycmllcyBoYXNoIHR5cGUgKi8KKyNkZWZpbmUgTkZQX05FVF9NRVRBX01BUksJCTIKKworLyoqCiAgKiBIYXNoIHR5cGUgcHJlLXBlbmRlZCB3aGVuIGEgUlNTIGhhc2ggd2FzIGNvbXB1dGVkCiAgKi8KICNkZWZpbmUgTkZQX05FVF9SU1NfTk9ORSAgICAgICAgICAgICAgICAwCkBAIC0xMjMsNiArMTMwLDcgQEAKICNkZWZpbmUgICBORlBfTkVUX0NGR19DVFJMX0wyU1dJVENIX0xPQ0FMICgweDEgPDwgMjMpIC8qIFN3aXRjaCB0byBsb2NhbCAqLwogI2RlZmluZSAgIE5GUF9ORVRfQ0ZHX0NUUkxfVlhMQU4JICAoMHgxIDw8IDI0KSAvKiBWWExBTiB0dW5uZWwgc3VwcG9ydCAqLwogI2RlZmluZSAgIE5GUF9ORVRfQ0ZHX0NUUkxfTlZHUkUJICAoMHgxIDw8IDI1KSAvKiBOVkdSRSB0dW5uZWwgc3VwcG9ydCAqLworI2RlZmluZSAgIE5GUF9ORVRfQ0ZHX0NUUkxfQlBGCQkgICgweDEgPDwgMjcpIC8qIEJQRiBvZmZsb2FkIGNhcGFibGUgKi8KICNkZWZpbmUgTkZQX05FVF9DRkdfVVBEQVRFICAgICAgICAgICAgICAweDAwMDQKICNkZWZpbmUgICBORlBfTkVUX0NGR19VUERBVEVfR0VOICAgICAgICAgICgweDEgPDwgIDApIC8qIEdlbmVyYWwgdXBkYXRlICovCiAjZGVmaW5lICAgTkZQX05FVF9DRkdfVVBEQVRFX1JJTkcgICAgICAgICAoMHgxIDw8ICAxKSAvKiBSaW5nIGNvbmZpZyBjaGFuZ2UgKi8KQEAgLTEzNCw2ICsxNDIsNyBAQAogI2RlZmluZSAgIE5GUF9ORVRfQ0ZHX1VQREFURV9SRVNFVCAgICAgICAgKDB4MSA8PCAgNykgLyogVXBkYXRlIGR1ZSB0byBGTFIgKi8KICNkZWZpbmUgICBORlBfTkVUX0NGR19VUERBVEVfSVJRTU9EICAgICAgICgweDEgPDwgIDgpIC8qIElSUSBtb2QgY2hhbmdlICovCiAjZGVmaW5lICAgTkZQX05FVF9DRkdfVVBEQVRFX1ZYTEFOCSAgKDB4MSA8PCAgOSkgLyogVlhMQU4gcG9ydCBjaGFuZ2UgKi8KKyNkZWZpbmUgICBORlBfTkVUX0NGR19VUERBVEVfQlBGCSAgKDB4MSA8PCAxMCkgLyogQlBGIHByb2dyYW0gbG9hZCAqLwogI2RlZmluZSAgIE5GUF9ORVRfQ0ZHX1VQREFURV9FUlIgICAgICAgICAgKDB4MSA8PCAzMSkgLyogQSBlcnJvciBvY2N1cnJlZCAqLwogI2RlZmluZSBORlBfTkVUX0NGR19UWFJTX0VOQUJMRSAgICAgICAgIDB4MDAwOAogI2RlZmluZSBORlBfTkVUX0NGR19SWFJTX0VOQUJMRSAgICAgICAgIDB4MDAxMApAQCAtMTk2LDEwICsyMDUsMzcgQEAKICNkZWZpbmUgTkZQX05FVF9DRkdfVlhMQU5fU1oJCSAgMHgwMDA4CiAKIC8qKgotICogNjRCIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICgweDAwODAgLSAweDAwYzApCisgKiBORlA2MDAwIC0gQlBGIHNlY3Rpb24KKyAqIEBORlBfTkVUX0NGR19CUEZfQUJJOglCUEYgQUJJIHZlcnNpb24KKyAqIEBORlBfTkVUX0NGR19CUEZfQ0FQOglCUEYgY2FwYWJpbGl0aWVzCisgKiBATkZQX05FVF9DRkdfQlBGX01BWF9MRU46CU1heGltdW0gc2l6ZSBvZiBKSVRlZCBCUEYgY29kZSBpbiBieXRlcworICogQE5GUF9ORVRfQ0ZHX0JQRl9TVEFSVDoJT2Zmc2V0IGF0IHdoaWNoIEJQRiB3aWxsIGJlIGxvYWRlZAorICogQE5GUF9ORVRfQ0ZHX0JQRl9ET05FOglPZmZzZXQgdG8ganVtcCB0byBvbiBleGl0CisgKiBATkZQX05FVF9DRkdfQlBGX1NUQUNLX1NaOglUb3RhbCBzaXplIG9mIHN0YWNrIGFyZWEgaW4gNjRCIGNodW5rcworICogQE5GUF9ORVRfQ0ZHX0JQRl9JTkxfTVRVOglQYWNrZXQgZGF0YSBzcGxpdCBvZmZzZXQgaW4gNjRCIGNodW5rcworICogQE5GUF9ORVRfQ0ZHX0JQRl9TSVpFOglTaXplIG9mIHRoZSBKSVRlZCBCUEYgY29kZSBpbiBpbnN0cnVjdGlvbnMKKyAqIEBORlBfTkVUX0NGR19CUEZfQUREUjoJRE1BIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciB3aXRoIEpJVGVkIEJQRiBjb2RlCiAgKi8KLSNkZWZpbmUgTkZQX05FVF9DRkdfUkVTRVJWRUQgICAgICAgICAgICAweDAwODAKLSNkZWZpbmUgTkZQX05FVF9DRkdfUkVTRVJWRURfU1ogICAgICAgICAweDAwNDAKKyNkZWZpbmUgTkZQX05FVF9DRkdfQlBGX0FCSQkJMHgwMDgwCisjZGVmaW5lICAgTkZQX05FVF9CUEZfQUJJCQkxCisjZGVmaW5lIE5GUF9ORVRfQ0ZHX0JQRl9DQVAJCTB4MDA4MQorI2RlZmluZSAgIE5GUF9ORVRfQlBGX0NBUF9SRUxPCQkoMSA8PCAwKSAvKiBzZWFtbGVzcyByZWxvYWQgKi8KKyNkZWZpbmUgTkZQX05FVF9DRkdfQlBGX01BWF9MRU4JCTB4MDA4MgorI2RlZmluZSBORlBfTkVUX0NGR19CUEZfU1RBUlQJCTB4MDA4NAorI2RlZmluZSBORlBfTkVUX0NGR19CUEZfRE9ORQkJMHgwMDg2CisjZGVmaW5lIE5GUF9ORVRfQ0ZHX0JQRl9TVEFDS19TWgkweDAwODgKKyNkZWZpbmUgTkZQX05FVF9DRkdfQlBGX0lOTF9NVFUJCTB4MDA4OQorI2RlZmluZSBORlBfTkVUX0NGR19CUEZfU0laRQkJMHgwMDhlCisjZGVmaW5lIE5GUF9ORVRfQ0ZHX0JQRl9BRERSCQkweDAwOTAKKyNkZWZpbmUgICBORlBfTkVUX0NGR19CUEZfQ0ZHXzhDVFgJKDEgPDwgMCkgLyogOGN0eCBtb2RlICovCisjZGVmaW5lICAgTkZQX05FVF9DRkdfQlBGX0NGR19NQVNLCTdVTEwKKyNkZWZpbmUgICBORlBfTkVUX0NGR19CUEZfQUREUl9NQVNLCSh+TkZQX05FVF9DRkdfQlBGX0NGR19NQVNLKQorCisvKioKKyAqIDQwQiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAoMHgwMDk4IC0gMHgwMGMwKQorICovCisjZGVmaW5lIE5GUF9ORVRfQ0ZHX1JFU0VSVkVEICAgICAgICAgICAgMHgwMDk4CisjZGVmaW5lIE5GUF9ORVRfQ0ZHX1JFU0VSVkVEX1NaICAgICAgICAgMHgwMDI4CiAKIC8qKgogICogUlNTIGNvbmZpZ3VyYXRpb24gKDB4MDEwMCAtIDB4MDFhYyk6CkBAIC0zMDMsNiArMzM5LDE1IEBACiAjZGVmaW5lIE5GUF9ORVRfQ0ZHX1NUQVRTX1RYX01DX0ZSQU1FUyAgKE5GUF9ORVRfQ0ZHX1NUQVRTX0JBU0UgKyAweDgwKQogI2RlZmluZSBORlBfTkVUX0NGR19TVEFUU19UWF9CQ19GUkFNRVMgIChORlBfTkVUX0NGR19TVEFUU19CQVNFICsgMHg4OCkKIAorI2RlZmluZSBORlBfTkVUX0NGR19TVEFUU19BUFAwX0ZSQU1FUwkoTkZQX05FVF9DRkdfU1RBVFNfQkFTRSArIDB4OTApCisjZGVmaW5lIE5GUF9ORVRfQ0ZHX1NUQVRTX0FQUDBfQllURVMJKE5GUF9ORVRfQ0ZHX1NUQVRTX0JBU0UgKyAweDk4KQorI2RlZmluZSBORlBfTkVUX0NGR19TVEFUU19BUFAxX0ZSQU1FUwkoTkZQX05FVF9DRkdfU1RBVFNfQkFTRSArIDB4YTApCisjZGVmaW5lIE5GUF9ORVRfQ0ZHX1NUQVRTX0FQUDFfQllURVMJKE5GUF9ORVRfQ0ZHX1NUQVRTX0JBU0UgKyAweGE4KQorI2RlZmluZSBORlBfTkVUX0NGR19TVEFUU19BUFAyX0ZSQU1FUwkoTkZQX05FVF9DRkdfU1RBVFNfQkFTRSArIDB4YjApCisjZGVmaW5lIE5GUF9ORVRfQ0ZHX1NUQVRTX0FQUDJfQllURVMJKE5GUF9ORVRfQ0ZHX1NUQVRTX0JBU0UgKyAweGI4KQorI2RlZmluZSBORlBfTkVUX0NGR19TVEFUU19BUFAzX0ZSQU1FUwkoTkZQX05FVF9DRkdfU1RBVFNfQkFTRSArIDB4YzApCisjZGVmaW5lIE5GUF9ORVRfQ0ZHX1NUQVRTX0FQUDNfQllURVMJKE5GUF9ORVRfQ0ZHX1NUQVRTX0JBU0UgKyAweGM4KQorCiAvKioKICAqIFBlciByaW5nIHN0YXRzICgweDEwMDAgLSAweDE4MDApCiAgKiBvcHRpb25zLCA2NGJpdCBwZXIgZW50cnkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX25ldF9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRyb25vbWUvbmZwL25mcF9uZXRfZXRodG9vbC5jCmluZGV4IDdkNzkzM2QuLjM0MThmMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX25ldF9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9uZnBfbmV0X2V0aHRvb2wuYwpAQCAtNDAsNyArNDAsNiBAQAogICogICAgICAgICAgQnJhZCBQZXRydXMgPGJyYWQucGV0cnVzQG5ldHJvbm9tZS5jb20+CiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgpAQCAtMTA3LDYgKzEwNiwxOCBAQAogCXsiZGV2X3R4X3BrdHMiLCBOTl9FVF9ERVZfU1RBVChORlBfTkVUX0NGR19TVEFUU19UWF9GUkFNRVMpfSwKIAl7ImRldl90eF9tY19wa3RzIiwgTk5fRVRfREVWX1NUQVQoTkZQX05FVF9DRkdfU1RBVFNfVFhfTUNfRlJBTUVTKX0sCiAJeyJkZXZfdHhfYmNfcGt0cyIsIE5OX0VUX0RFVl9TVEFUKE5GUF9ORVRfQ0ZHX1NUQVRTX1RYX0JDX0ZSQU1FUyl9LAorCisJeyJicGZfcGFzc19wa3RzIiwgTk5fRVRfREVWX1NUQVQoTkZQX05FVF9DRkdfU1RBVFNfQVBQMF9GUkFNRVMpfSwKKwl7ImJwZl9wYXNzX2J5dGVzIiwgTk5fRVRfREVWX1NUQVQoTkZQX05FVF9DRkdfU1RBVFNfQVBQMF9CWVRFUyl9LAorCS8qIHNlZSBjb21tZW50cyBpbiBvdXRybyBmdW5jdGlvbnMgaW4gbmZwX2JwZl9qaXQuYyB0byBmaW5kIG91dAorCSAqIGhvdyBkaWZmZXJlbnQgQlBGIG1vZGVzIHVzZSBhcHAtc3BlY2lmaWMgY291bnRlcnMKKwkgKi8KKwl7ImJwZl9hcHAxX3BrdHMiLCBOTl9FVF9ERVZfU1RBVChORlBfTkVUX0NGR19TVEFUU19BUFAxX0ZSQU1FUyl9LAorCXsiYnBmX2FwcDFfYnl0ZXMiLCBOTl9FVF9ERVZfU1RBVChORlBfTkVUX0NGR19TVEFUU19BUFAxX0JZVEVTKX0sCisJeyJicGZfYXBwMl9wa3RzIiwgTk5fRVRfREVWX1NUQVQoTkZQX05FVF9DRkdfU1RBVFNfQVBQMl9GUkFNRVMpfSwKKwl7ImJwZl9hcHAyX2J5dGVzIiwgTk5fRVRfREVWX1NUQVQoTkZQX05FVF9DRkdfU1RBVFNfQVBQMl9CWVRFUyl9LAorCXsiYnBmX2FwcDNfcGt0cyIsIE5OX0VUX0RFVl9TVEFUKE5GUF9ORVRfQ0ZHX1NUQVRTX0FQUDNfRlJBTUVTKX0sCisJeyJicGZfYXBwM19ieXRlcyIsIE5OX0VUX0RFVl9TVEFUKE5GUF9ORVRfQ0ZHX1NUQVRTX0FQUDNfQllURVMpfSwKIH07CiAKICNkZWZpbmUgTk5fRVRfR0xPQkFMX1NUQVRTX0xFTiBBUlJBWV9TSVpFKG5mcF9uZXRfZXRfc3RhdHMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRyb25vbWUvbmZwL25mcF9uZXRfb2ZmbG9hZC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9uZnBfbmV0X29mZmxvYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWNmYjYzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9uZnBfbmV0X29mZmxvYWQuYwpAQCAtMCwwICsxLDI5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBOZXRyb25vbWUgU3lzdGVtcywgSW5jLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgTGljZW5zZSBWZXJzaW9uIDIsCisgKiBKdW5lIDE5OTEgYXMgc2hvd24gaW4gdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeSBvZiB0aGlzCisgKiBzb3VyY2UgdHJlZSBvciB0aGUgQlNEIDItQ2xhdXNlIExpY2Vuc2UgcHJvdmlkZWQgYmVsb3cuICBZb3UgaGF2ZSB0aGUKKyAqIG9wdGlvbiB0byBsaWNlbnNlIHRoaXMgc29mdHdhcmUgdW5kZXIgdGhlIGNvbXBsZXRlIHRlcm1zIG9mIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIFRoZSBCU0QgMi1DbGF1c2UgTGljZW5zZToKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBuZnBfbmV0X29mZmxvYWQuYworICogTmV0cm9ub21lIG5ldHdvcmsgZGV2aWNlIGRyaXZlcjogVEMgb2ZmbG9hZCBmdW5jdGlvbnMgZm9yIFBGIGFuZCBWRgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlIDxuZXQvcGt0X2Nscy5oPgorI2luY2x1ZGUgPG5ldC90Y19hY3QvdGNfZ2FjdC5oPgorI2luY2x1ZGUgPG5ldC90Y19hY3QvdGNfbWlycmVkLmg+CisKKyNpbmNsdWRlICJuZnBfYnBmLmgiCisjaW5jbHVkZSAibmZwX25ldF9jdHJsLmgiCisjaW5jbHVkZSAibmZwX25ldC5oIgorCit2b2lkIG5mcF9uZXRfZmlsdGVyX3N0YXRzX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbmZwX25ldCAqbm4gPSAodm9pZCAqKWRhdGE7CisJc3RydWN0IG5mcF9zdGF0X3BhaXIgbGF0ZXN0OworCisJc3Bpbl9sb2NrX2JoKCZubi0+cnhfZmlsdGVyX2xvY2spOworCisJaWYgKG5uLT5jdHJsICYgTkZQX05FVF9DRkdfQ1RSTF9CUEYpCisJCW1vZF90aW1lcigmbm4tPnJ4X2ZpbHRlcl9zdGF0c190aW1lciwKKwkJCSAgamlmZmllcyArIE5GUF9ORVRfU1RBVF9QT0xMX0lWTCk7CisKKwlzcGluX3VubG9ja19iaCgmbm4tPnJ4X2ZpbHRlcl9sb2NrKTsKKworCWxhdGVzdC5wa3RzID0gbm5fcmVhZHEobm4sIE5GUF9ORVRfQ0ZHX1NUQVRTX0FQUDFfRlJBTUVTKTsKKwlsYXRlc3QuYnl0ZXMgPSBubl9yZWFkcShubiwgTkZQX05FVF9DRkdfU1RBVFNfQVBQMV9CWVRFUyk7CisKKwlpZiAobGF0ZXN0LnBrdHMgIT0gbm4tPnJ4X2ZpbHRlci5wa3RzKQorCQlubi0+cnhfZmlsdGVyX2NoYW5nZSA9IGppZmZpZXM7CisKKwlubi0+cnhfZmlsdGVyID0gbGF0ZXN0OworfQorCitzdGF0aWMgdm9pZCBuZnBfbmV0X2JwZl9zdGF0c19yZXNldChzdHJ1Y3QgbmZwX25ldCAqbm4pCit7CisJbm4tPnJ4X2ZpbHRlci5wa3RzID0gbm5fcmVhZHEobm4sIE5GUF9ORVRfQ0ZHX1NUQVRTX0FQUDFfRlJBTUVTKTsKKwlubi0+cnhfZmlsdGVyLmJ5dGVzID0gbm5fcmVhZHEobm4sIE5GUF9ORVRfQ0ZHX1NUQVRTX0FQUDFfQllURVMpOworCW5uLT5yeF9maWx0ZXJfcHJldiA9IG5uLT5yeF9maWx0ZXI7CisJbm4tPnJ4X2ZpbHRlcl9jaGFuZ2UgPSBqaWZmaWVzOworfQorCitzdGF0aWMgaW50CituZnBfbmV0X2JwZl9zdGF0c191cGRhdGUoc3RydWN0IG5mcF9uZXQgKm5uLCBzdHJ1Y3QgdGNfY2xzX2JwZl9vZmZsb2FkICpjbHNfYnBmKQoreworCXN0cnVjdCB0Y19hY3Rpb24gKmE7CisJTElTVF9IRUFEKGFjdGlvbnMpOworCXU2NCBieXRlcywgcGt0czsKKworCXBrdHMgPSBubi0+cnhfZmlsdGVyLnBrdHMgLSBubi0+cnhfZmlsdGVyX3ByZXYucGt0czsKKwlieXRlcyA9IG5uLT5yeF9maWx0ZXIuYnl0ZXMgLSBubi0+cnhfZmlsdGVyX3ByZXYuYnl0ZXM7CisJYnl0ZXMgLT0gcGt0cyAqIEVUSF9ITEVOOworCisJbm4tPnJ4X2ZpbHRlcl9wcmV2ID0gbm4tPnJ4X2ZpbHRlcjsKKworCXByZWVtcHRfZGlzYWJsZSgpOworCisJdGNmX2V4dHNfdG9fbGlzdChjbHNfYnBmLT5leHRzLCAmYWN0aW9ucyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShhLCAmYWN0aW9ucywgbGlzdCkKKwkJdGNmX2FjdGlvbl9zdGF0c191cGRhdGUoYSwgYnl0ZXMsIHBrdHMsIG5uLT5yeF9maWx0ZXJfY2hhbmdlKTsKKworCXByZWVtcHRfZW5hYmxlKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbmZwX25ldF9icGZfZ2V0X2FjdChzdHJ1Y3QgbmZwX25ldCAqbm4sIHN0cnVjdCB0Y19jbHNfYnBmX29mZmxvYWQgKmNsc19icGYpCit7CisJY29uc3Qgc3RydWN0IHRjX2FjdGlvbiAqYTsKKwlMSVNUX0hFQUQoYWN0aW9ucyk7CisKKwkvKiBUQyBkaXJlY3QgYWN0aW9uICovCisJaWYgKGNsc19icGYtPmV4dHNfaW50ZWdyYXRlZCkgeworCQlpZiAodGNfbm9fYWN0aW9ucyhjbHNfYnBmLT5leHRzKSkKKwkJCXJldHVybiBOTl9BQ1RfRElSRUNUOworCisJCXJldHVybiAtRU5PVFNVUFA7CisJfQorCisJLyogVEMgbGVnYWN5IG1vZGUgKi8KKwlpZiAoIXRjX3NpbmdsZV9hY3Rpb24oY2xzX2JwZi0+ZXh0cykpCisJCXJldHVybiAtRU5PVFNVUFA7CisKKwl0Y2ZfZXh0c190b19saXN0KGNsc19icGYtPmV4dHMsICZhY3Rpb25zKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGEsICZhY3Rpb25zLCBsaXN0KSB7CisJCWlmIChpc190Y2ZfZ2FjdF9zaG90KGEpKQorCQkJcmV0dXJuIE5OX0FDVF9UQ19EUk9QOworCisJCWlmIChpc190Y2ZfbWlycmVkX3JlZGlyZWN0KGEpICYmCisJCSAgICB0Y2ZfbWlycmVkX2lmaW5kZXgoYSkgPT0gbm4tPm5ldGRldi0+aWZpbmRleCkKKwkJCXJldHVybiBOTl9BQ1RfVENfUkVESVI7CisJfQorCisJcmV0dXJuIC1FTk9UU1VQUDsKK30KKworc3RhdGljIGludAorbmZwX25ldF9icGZfb2ZmbG9hZF9wcmVwYXJlKHN0cnVjdCBuZnBfbmV0ICpubiwKKwkJCSAgICBzdHJ1Y3QgdGNfY2xzX2JwZl9vZmZsb2FkICpjbHNfYnBmLAorCQkJICAgIHN0cnVjdCBuZnBfYnBmX3Jlc3VsdCAqcmVzLAorCQkJICAgIHZvaWQgKipjb2RlLCBkbWFfYWRkcl90ICpkbWFfYWRkciwgdTE2IG1heF9pbnN0cikKK3sKKwl1bnNpZ25lZCBpbnQgY29kZV9zeiA9IG1heF9pbnN0ciAqIHNpemVvZih1NjQpOworCWVudW0gbmZwX2JwZl9hY3Rpb25fdHlwZSBhY3Q7CisJdTE2IHN0YXJ0X29mZiwgZG9uZV9vZmY7CisJdW5zaWduZWQgaW50IG1heF9tdHU7CisJaW50IHJldDsKKworCWlmICghSVNfRU5BQkxFRChDT05GSUdfQlBGX1NZU0NBTEwpKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCisJcmV0ID0gbmZwX25ldF9icGZfZ2V0X2FjdChubiwgY2xzX2JwZik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJYWN0ID0gcmV0OworCisJbWF4X210dSA9IG5uX3JlYWRiKG5uLCBORlBfTkVUX0NGR19CUEZfSU5MX01UVSkgKiA2NCAtIDMyOworCWlmIChtYXhfbXR1IDwgbm4tPm5ldGRldi0+bXR1KSB7CisJCW5uX2luZm8obm4sICJCUEYgb2ZmbG9hZCBub3Qgc3VwcG9ydGVkIHdpdGggTVRVIGxhcmdlciB0aGFuIEhXIHBhY2tldCBzcGxpdCBib3VuZGFyeVxuIik7CisJCXJldHVybiAtRU5PVFNVUFA7CisJfQorCisJc3RhcnRfb2ZmID0gbm5fcmVhZHcobm4sIE5GUF9ORVRfQ0ZHX0JQRl9TVEFSVCk7CisJZG9uZV9vZmYgPSBubl9yZWFkdyhubiwgTkZQX05FVF9DRkdfQlBGX0RPTkUpOworCisJKmNvZGUgPSBkbWFfemFsbG9jX2NvaGVyZW50KCZubi0+cGRldi0+ZGV2LCBjb2RlX3N6LCBkbWFfYWRkciwKKwkJCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCEqY29kZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBuZnBfYnBmX2ppdChjbHNfYnBmLT5wcm9nLCAqY29kZSwgYWN0LCBzdGFydF9vZmYsIGRvbmVfb2ZmLAorCQkJICBtYXhfaW5zdHIsIHJlcyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXR1cm4gMDsKKworb3V0OgorCWRtYV9mcmVlX2NvaGVyZW50KCZubi0+cGRldi0+ZGV2LCBjb2RlX3N6LCAqY29kZSwgKmRtYV9hZGRyKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorbmZwX25ldF9icGZfbG9hZF9hbmRfc3RhcnQoc3RydWN0IG5mcF9uZXQgKm5uLCB1MzIgdGNfZmxhZ3MsCisJCQkgICB2b2lkICpjb2RlLCBkbWFfYWRkcl90IGRtYV9hZGRyLAorCQkJICAgdW5zaWduZWQgaW50IGNvZGVfc3osIHVuc2lnbmVkIGludCBuX2luc3RyLAorCQkJICAgYm9vbCBkZW5zZV9tb2RlKQoreworCXU2NCBicGZfYWRkciA9IGRtYV9hZGRyOworCWludCBlcnI7CisKKwlubi0+YnBmX29mZmxvYWRfc2tpcF9zdyA9ICEhKHRjX2ZsYWdzICYgVENBX0NMU19GTEFHU19TS0lQX1NXKTsKKworCWlmIChkZW5zZV9tb2RlKQorCQlicGZfYWRkciB8PSBORlBfTkVUX0NGR19CUEZfQ0ZHXzhDVFg7CisKKwlubl93cml0ZXcobm4sIE5GUF9ORVRfQ0ZHX0JQRl9TSVpFLCBuX2luc3RyKTsKKwlubl93cml0ZXEobm4sIE5GUF9ORVRfQ0ZHX0JQRl9BRERSLCBicGZfYWRkcik7CisKKwkvKiBMb2FkIHVwIHRoZSBKSVRlZCBjb2RlICovCisJZXJyID0gbmZwX25ldF9yZWNvbmZpZyhubiwgTkZQX05FVF9DRkdfVVBEQVRFX0JQRik7CisJaWYgKGVycikKKwkJbm5fZXJyKG5uLCAiRlcgY29tbWFuZCBlcnJvciB3aGlsZSBsb2FkaW5nIEJQRjogJWRcbiIsIGVycik7CisKKwkvKiBFbmFibGUgcGFzc2luZyBwYWNrZXRzIHRocm91Z2ggQlBGIGZ1bmN0aW9uICovCisJbm4tPmN0cmwgfD0gTkZQX05FVF9DRkdfQ1RSTF9CUEY7CisJbm5fd3JpdGVsKG5uLCBORlBfTkVUX0NGR19DVFJMLCBubi0+Y3RybCk7CisJZXJyID0gbmZwX25ldF9yZWNvbmZpZyhubiwgTkZQX05FVF9DRkdfVVBEQVRFX0dFTik7CisJaWYgKGVycikKKwkJbm5fZXJyKG5uLCAiRlcgY29tbWFuZCBlcnJvciB3aGlsZSBlbmFibGluZyBCUEY6ICVkXG4iLCBlcnIpOworCisJZG1hX2ZyZWVfY29oZXJlbnQoJm5uLT5wZGV2LT5kZXYsIGNvZGVfc3osIGNvZGUsIGRtYV9hZGRyKTsKKworCW5mcF9uZXRfYnBmX3N0YXRzX3Jlc2V0KG5uKTsKKwltb2RfdGltZXIoJm5uLT5yeF9maWx0ZXJfc3RhdHNfdGltZXIsIGppZmZpZXMgKyBORlBfTkVUX1NUQVRfUE9MTF9JVkwpOworfQorCitzdGF0aWMgaW50IG5mcF9uZXRfYnBmX3N0b3Aoc3RydWN0IG5mcF9uZXQgKm5uKQoreworCWlmICghKG5uLT5jdHJsICYgTkZQX05FVF9DRkdfQ1RSTF9CUEYpKQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9ja19iaCgmbm4tPnJ4X2ZpbHRlcl9sb2NrKTsKKwlubi0+Y3RybCAmPSB+TkZQX05FVF9DRkdfQ1RSTF9CUEY7CisJc3Bpbl91bmxvY2tfYmgoJm5uLT5yeF9maWx0ZXJfbG9jayk7CisJbm5fd3JpdGVsKG5uLCBORlBfTkVUX0NGR19DVFJMLCBubi0+Y3RybCk7CisKKwlkZWxfdGltZXJfc3luYygmbm4tPnJ4X2ZpbHRlcl9zdGF0c190aW1lcik7CisJbm4tPmJwZl9vZmZsb2FkX3NraXBfc3cgPSAwOworCisJcmV0dXJuIG5mcF9uZXRfcmVjb25maWcobm4sIE5GUF9ORVRfQ0ZHX1VQREFURV9HRU4pOworfQorCitpbnQKK25mcF9uZXRfYnBmX29mZmxvYWQoc3RydWN0IG5mcF9uZXQgKm5uLCB1MzIgaGFuZGxlLCBfX2JlMTYgcHJvdG8sCisJCSAgICBzdHJ1Y3QgdGNfY2xzX2JwZl9vZmZsb2FkICpjbHNfYnBmKQoreworCXN0cnVjdCBuZnBfYnBmX3Jlc3VsdCByZXM7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwl1MTYgbWF4X2luc3RyOworCXZvaWQgKmNvZGU7CisJaW50IGVycjsKKworCW1heF9pbnN0ciA9IG5uX3JlYWR3KG5uLCBORlBfTkVUX0NGR19CUEZfTUFYX0xFTik7CisKKwlzd2l0Y2ggKGNsc19icGYtPmNvbW1hbmQpIHsKKwljYXNlIFRDX0NMU0JQRl9SRVBMQUNFOgorCQkvKiBUaGVyZSBpcyBub3RoaW5nIHN0b3BwaW5nIHVzIGZyb20gaW1wbGVtZW50aW5nIHNlYW1sZXNzCisJCSAqIHJlcGxhY2UgYnV0IHRoZSBzaW1wbGUgbWV0aG9kIG9mIGxvYWRpbmcgSSBhZG9wdGVkIGluCisJCSAqIHRoZSBmaXJtd2FyZSBkb2VzIG5vdCBoYW5kbGUgYXRvbWljIHJlcGxhY2UgKGkuZS4gd2UgaGF2ZSB0bworCQkgKiBzdG9wIHRoZSBCUEYgb2ZmbG9hZCBhbmQgcmUtZW5hYmxlIGl0KS4gIExlYWtpbmctaW4gYSBmZXcKKwkJICogZnJhbWVzIHdoaWNoIGRpZG4ndCBoYXZlIEJQRiBhcHBsaWVkIGluIHRoZSBoYXJkd2FyZSBzaG91bGQKKwkJICogYmUgZmluZSBpZiBzb2Z0d2FyZSBmYWxsYmFjayBpcyBhdmFpbGFibGUsIHRob3VnaC4KKwkJICovCisJCWlmIChubi0+YnBmX29mZmxvYWRfc2tpcF9zdykKKwkJCXJldHVybiAtRUJVU1k7CisKKwkJZXJyID0gbmZwX25ldF9icGZfb2ZmbG9hZF9wcmVwYXJlKG5uLCBjbHNfYnBmLCAmcmVzLCAmY29kZSwKKwkJCQkJCSAgJmRtYV9hZGRyLCBtYXhfaW5zdHIpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQluZnBfbmV0X2JwZl9zdG9wKG5uKTsKKwkJbmZwX25ldF9icGZfbG9hZF9hbmRfc3RhcnQobm4sIGNsc19icGYtPmdlbl9mbGFncywgY29kZSwKKwkJCQkJICAgZG1hX2FkZHIsIG1heF9pbnN0ciAqIHNpemVvZih1NjQpLAorCQkJCQkgICByZXMubl9pbnN0ciwgcmVzLmRlbnNlX21vZGUpOworCQlyZXR1cm4gMDsKKworCWNhc2UgVENfQ0xTQlBGX0FERDoKKwkJaWYgKG5uLT5jdHJsICYgTkZQX05FVF9DRkdfQ1RSTF9CUEYpCisJCQlyZXR1cm4gLUVCVVNZOworCisJCWVyciA9IG5mcF9uZXRfYnBmX29mZmxvYWRfcHJlcGFyZShubiwgY2xzX2JwZiwgJnJlcywgJmNvZGUsCisJCQkJCQkgICZkbWFfYWRkciwgbWF4X2luc3RyKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJbmZwX25ldF9icGZfbG9hZF9hbmRfc3RhcnQobm4sIGNsc19icGYtPmdlbl9mbGFncywgY29kZSwKKwkJCQkJICAgZG1hX2FkZHIsIG1heF9pbnN0ciAqIHNpemVvZih1NjQpLAorCQkJCQkgICByZXMubl9pbnN0ciwgcmVzLmRlbnNlX21vZGUpOworCQlyZXR1cm4gMDsKKworCWNhc2UgVENfQ0xTQlBGX0RFU1RST1k6CisJCXJldHVybiBuZnBfbmV0X2JwZl9zdG9wKG5uKTsKKworCWNhc2UgVENfQ0xTQlBGX1NUQVRTOgorCQlyZXR1cm4gbmZwX25ldF9icGZfc3RhdHNfdXBkYXRlKG5uLCBjbHNfYnBmKTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFNVUFA7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9uZnBfbmV0dmZfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9uZnBfbmV0dmZfbWFpbi5jCmluZGV4IDM3YWJlZjAuLjI4MDBiYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX25ldHZmX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRyb25vbWUvbmZwL25mcF9uZXR2Zl9tYWluLmMKQEAgLTM4LDcgKzM4LDYgQEAKICAqICAgICAgICAgUm9sZiBOZXVnZWJhdWVyIDxyb2xmLm5ldWdlYmF1ZXJAbmV0cm9ub21lLmNvbT4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTEzNCw3ICsxMzMsNyBAQAogCX0KIAogCW5mcF9uZXRfZ2V0X2Z3X3ZlcnNpb24oJmZ3X3ZlciwgY3RybF9iYXIpOwotCWlmIChmd192ZXIuY2xhc3MgIT0gTkZQX05FVF9DRkdfVkVSU0lPTl9DTEFTU19HRU5FUklDKSB7CisJaWYgKGZ3X3Zlci5yZXN2IHx8IGZ3X3Zlci5jbGFzcyAhPSBORlBfTkVUX0NGR19WRVJTSU9OX0NMQVNTX0dFTkVSSUMpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5rbm93biBGaXJtd2FyZSBBQkkgJWQuJWQuJWQuJWRcbiIsCiAJCQlmd192ZXIucmVzdiwgZndfdmVyLmNsYXNzLCBmd192ZXIubWFqb3IsIGZ3X3Zlci5taW5vcik7CiAJCWVyciA9IC1FSU5WQUw7CkBAIC0xNDIsMTYgKzE0MSwxNCBAQAogCX0KIAogCS8qIERldGVybWluZSBzdHJpZGUgKi8KLQlpZiAobmZwX25ldF9md192ZXJfZXEoJmZ3X3ZlciwgMCwgMCwgMCwgMCkgfHwKLQkgICAgbmZwX25ldF9md192ZXJfZXEoJmZ3X3ZlciwgMCwgMCwgMCwgMSkgfHwKLQkgICAgbmZwX25ldF9md192ZXJfZXEoJmZ3X3ZlciwgMCwgMCwgMHgxMiwgMHg0OCkpIHsKKwlpZiAobmZwX25ldF9md192ZXJfZXEoJmZ3X3ZlciwgMCwgMCwgMCwgMSkpIHsKIAkJc3RyaWRlID0gMjsKIAkJdHhfYmFyX25vID0gTkZQX05FVF9RMF9CQVI7CiAJCXJ4X2Jhcl9ubyA9IE5GUF9ORVRfUTFfQkFSOwogCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiT0JTT0xFVEUgRmlybXdhcmUgZGV0ZWN0ZWQgLSBWRiBpc29sYXRpb24gbm90IGF2YWlsYWJsZVxuIik7CiAJfSBlbHNlIHsKIAkJc3dpdGNoIChmd192ZXIubWFqb3IpIHsKLQkJY2FzZSAxIC4uLiAzOgorCQljYXNlIDEgLi4uIDQ6CiAJCQlpZiAoaXNfbmZwMzIwMCkgewogCQkJCXN0cmlkZSA9IDI7CiAJCQkJdHhfYmFyX25vID0gTkZQX05FVF9RMF9CQVI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9udXZvdG9uL3c5MHA5MTBfZXRoZXIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L251dm90b24vdzkwcDkxMF9ldGhlci5jCmluZGV4IDg3YjdiODEuLjcxMmQ4YmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L251dm90b24vdzkwcDkxMF9ldGhlci5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L251dm90b24vdzkwcDkxMF9ldGhlci5jCkBAIC03NTEsNyArNzUxLDcgQEAKIAkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJyeCBjcmMgZXJyXG4iKTsKIAkJCQlldGhlci0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwogCQkJfSBlbHNlIGlmIChzdGF0dXMgJiBSWERTX0FMSUUpIHsKLQkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJyeCBhbGlnbWVudCBlcnJcbiIpOworCQkJCWRldl9lcnIoJnBkZXYtPmRldiwgInJ4IGFsaWdubWVudCBlcnJcbiIpOwogCQkJCWV0aGVyLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKIAkJCX0gZWxzZSBpZiAoc3RhdHVzICYgUlhEU19QVExFKSB7CiAJCQkJZGV2X2VycigmcGRldi0+ZGV2LCAicnggbG9uZ2VyIGVyclxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9ueHAvbHBjX2V0aC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbnhwL2xwY19ldGguYwppbmRleCA0ZDRlY2JhLi44ZTEzZWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9ueHAvbHBjX2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L254cC9scGNfZXRoLmMKQEAgLTQ3NSwxNCArNDc1LDYgQEAKIAltYWNbNV0gPSB0bXAgPj4gODsKIH0KIAotc3RhdGljIHZvaWQgX19scGNfZXRoX2Nsb2NrX2VuYWJsZShzdHJ1Y3QgbmV0ZGF0YV9sb2NhbCAqcGxkYXQsIGJvb2wgZW5hYmxlKQotewotCWlmIChlbmFibGUpCi0JCWNsa19wcmVwYXJlX2VuYWJsZShwbGRhdC0+Y2xrKTsKLQllbHNlCi0JCWNsa19kaXNhYmxlX3VucHJlcGFyZShwbGRhdC0+Y2xrKTsKLX0KLQogc3RhdGljIHZvaWQgX19scGNfcGFyYW1zX3NldHVwKHN0cnVjdCBuZXRkYXRhX2xvY2FsICpwbGRhdCkKIHsKIAl1MzIgdG1wOwpAQCAtMTA1Niw3ICsxMDQ4LDcgQEAKIAl3cml0ZWwoMCwgTFBDX0VORVRfTUFDMihwbGRhdC0+bmV0X2Jhc2UpKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbGRhdC0+bG9jaywgZmxhZ3MpOwogCi0JX19scGNfZXRoX2Nsb2NrX2VuYWJsZShwbGRhdCwgZmFsc2UpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShwbGRhdC0+Y2xrKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTE5NywxMSArMTE4OSwxNCBAQAogc3RhdGljIGludCBscGNfZXRoX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7CiAJc3RydWN0IG5ldGRhdGFfbG9jYWwgKnBsZGF0ID0gbmV0ZGV2X3ByaXYobmRldik7CisJaW50IHJldDsKIAogCWlmIChuZXRpZl9tc2dfaWZ1cChwbGRhdCkpCiAJCWRldl9kYmcoJnBsZGF0LT5wZGV2LT5kZXYsICJlbmFibGluZyAlc1xuIiwgbmRldi0+bmFtZSk7CiAKLQlfX2xwY19ldGhfY2xvY2tfZW5hYmxlKHBsZGF0LCB0cnVlKTsKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocGxkYXQtPmNsayk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCS8qIFN1c3BlbmRlZCBQSFkgbWFrZXMgTFBDIGV0aGVybmV0IGNvcmUgYmxvY2ssIHNvIHJlc3VtZSBub3cgKi8KIAlwaHlfcmVzdW1lKG5kZXYtPnBoeWRldik7CkBAIC0xMzIwLDcgKzEzMTUsOSBAQAogCX0KIAogCS8qIEVuYWJsZSBuZXR3b3JrIGNsb2NrICovCi0JX19scGNfZXRoX2Nsb2NrX2VuYWJsZShwbGRhdCwgdHJ1ZSk7CisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHBsZGF0LT5jbGspOworCWlmIChyZXQpCisJCWdvdG8gZXJyX291dF9jbGtfcHV0OwogCiAJLyogTWFwIElPIHNwYWNlICovCiAJcGxkYXQtPm5ldF9iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwpAQCAtMTQ1NCw2ICsxNDUxLDcgQEAKIAlpb3VubWFwKHBsZGF0LT5uZXRfYmFzZSk7CiBlcnJfb3V0X2Rpc2FibGVfY2xvY2tzOgogCWNsa19kaXNhYmxlX3VucHJlcGFyZShwbGRhdC0+Y2xrKTsKK2Vycl9vdXRfY2xrX3B1dDoKIAljbGtfcHV0KHBsZGF0LT5jbGspOwogZXJyX291dF9mcmVlX2RldjoKIAlmcmVlX25ldGRldihuZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9LY29uZmlnIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL0tjb25maWcKaW5kZXggNmJhNDg0MC4uMGRmMTM5MWY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvS2NvbmZpZwpAQCAtODgsNiArODgsOSBAQAogCS0tLWhlbHAtLS0KIAkgIFRoaXMgZW5hYmxlcyB0aGUgc3VwcG9ydCBmb3IgLi4uCiAKK2NvbmZpZyBRRURfTEwyCisJYm9vbAorCiBjb25maWcgUUVEX1NSSU9WCiAJYm9vbCAiUUxvZ2ljIFFFRCAyNS80MC8xMDBHYiBTUi1JT1Ygc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFFFRCAmJiBQQ0lfSU9WCkBAIC0xMDQsNCArMTA3LDE1IEBACiAJLS0taGVscC0tLQogCSAgVGhpcyBlbmFibGVzIHRoZSBzdXBwb3J0IGZvciAuLi4KIAorY29uZmlnIElORklOSUJBTkRfUUVEUgorCXRyaXN0YXRlICJRTG9naWMgcWVkZSBSb0NFIHNvdXJjZXMgW2RlYnVnXSIKKwlkZXBlbmRzIG9uIFFFREUgJiYgNjRCSVQKKwlzZWxlY3QgUUVEX0xMMgorCWRlZmF1bHQgbgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgcHJvdmlkZXMgYSB0ZW1wb3Jhcnkgbm9kZSB0aGF0IGFsbG93cyB0aGUgY29tcGlsYXRpb24KKwkgIGFuZCBsb2dpY2FsIHRlc3Rpbmcgb2YgdGhlIEluZmluaUJhbmQgb3ZlciBFdGhlcm5ldCBzdXBwb3J0CisJICBmb3IgUUxvZ2ljIFFFRC4gVGhpcyB3b3VsZCBiZSByZXBsYWNlZCBieSB0aGUgJ3JlYWwnIG9wdGlvbgorCSAgb25jZSB0aGUgUUVEUiBkcml2ZXIgaXMgYWRkZWQgWytyZWxvY2F0ZWRdLgorCiBlbmRpZiAjIE5FVF9WRU5ET1JfUUxPR0lDCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9NYWtlZmlsZQppbmRleCBkMWYxNTdlLi5jZGEwYWY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvTWFrZWZpbGUKQEAgLTIsNSArMiw3IEBACiAKIHFlZC15IDo9IHFlZF9jeHQubyBxZWRfZGV2Lm8gcWVkX2h3Lm8gcWVkX2luaXRfZndfZnVuY3MubyBxZWRfaW5pdF9vcHMubyBcCiAJIHFlZF9pbnQubyBxZWRfbWFpbi5vIHFlZF9tY3AubyBxZWRfc3BfY29tbWFuZHMubyBxZWRfc3BxLm8gcWVkX2wyLm8gXAotCSBxZWRfc2VsZnRlc3QubyBxZWRfZGNieC5vCisJIHFlZF9zZWxmdGVzdC5vIHFlZF9kY2J4Lm8gcWVkX2RlYnVnLm8KIHFlZC0kKENPTkZJR19RRURfU1JJT1YpICs9IHFlZF9zcmlvdi5vIHFlZF92Zi5vCitxZWQtJChDT05GSUdfUUVEX0xMMikgKz0gcWVkX2xsMi5vCitxZWQtJChDT05GSUdfSU5GSU5JQkFORF9RRURSKSArPSBxZWRfcm9jZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWQuaAppbmRleCAzNWU1Mzc3Li42NTNiYjU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkLmgKQEAgLTIzLDEwICsyMywxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3psaWIuaD4KICNpbmNsdWRlIDxsaW51eC9oYXNodGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9xZWQvcWVkX2lmLmg+CisjaW5jbHVkZSAicWVkX2RlYnVnLmgiCiAjaW5jbHVkZSAicWVkX2hzaS5oIgogCiBleHRlcm4gY29uc3Qgc3RydWN0IHFlZF9jb21tb25fb3BzIHFlZF9jb21tb25fb3BzX3Bhc3M7Ci0jZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTiAiOC43LjEuMjAiCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTiAiOC4xMC45LjIwIgogCiAjZGVmaW5lIE1BWF9IV0ZOU19QRVJfREVWSUNFICAgICg0KQogI2RlZmluZSBOQU1FX1NJWkUgMTYKQEAgLTM0LDYgKzM1LDkgQEAKIAogI2RlZmluZSBRRURfV0ZRX1VOSVQJMTAwCiAKKyNkZWZpbmUgUUVEX1dJRF9TSVpFICAgICAgICAgICAgKDEwMjQpCisjZGVmaW5lIFFFRF9QRl9ERU1TX1NJWkUgICAgICAgICg0KQorCiAvKiBjYXUgc3RhdGVzICovCiBlbnVtIHFlZF9jb2FsZXNjaW5nX21vZGUgewogCVFFRF9DT0FMX01PREVfRElTQUJMRSwKQEAgLTQyLDExICs0NiwyMSBAQAogCiBzdHJ1Y3QgcWVkX2V0aF9jYl9vcHM7CiBzdHJ1Y3QgcWVkX2Rldl9pbmZvOwordW5pb24gcWVkX21jcF9wcm90b2NvbF9zdGF0czsKK2VudW0gcWVkX21jcF9wcm90b2NvbF90eXBlOwogCiAvKiBoZWxwZXJzICovCiBzdGF0aWMgaW5saW5lIHUzMiBxZWRfZGJfYWRkcih1MzIgY2lkLCB1MzIgREVNUykKIHsKIAl1MzIgZGJfYWRkciA9IEZJRUxEX1ZBTFVFKERCX0xFR0FDWV9BRERSX0RFTVMsIERFTVMpIHwKKwkJICAgICAgKGNpZCAqIFFFRF9QRl9ERU1TX1NJWkUpOworCisJcmV0dXJuIGRiX2FkZHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHFlZF9kYl9hZGRyX3ZmKHUzMiBjaWQsIHUzMiBERU1TKQoreworCXUzMiBkYl9hZGRyID0gRklFTERfVkFMVUUoREJfTEVHQUNZX0FERFJfREVNUywgREVNUykgfAogCQkgICAgICBGSUVMRF9WQUxVRShEQl9MRUdBQ1lfQUREUl9JQ0lELCBjaWQpOwogCiAJcmV0dXJuIGRiX2FkZHI7CkBAIC02OSw2ICs4Myw3IEBACiBzdHJ1Y3QgcWVkX3NiX2F0dG5faW5mbzsKIHN0cnVjdCBxZWRfY3h0X21uZ3I7CiBzdHJ1Y3QgcWVkX3NiX3NwX2luZm87CitzdHJ1Y3QgcWVkX2xsMl9pbmZvOwogc3RydWN0IHFlZF9tY3BfaW5mbzsKIAogc3RydWN0IHFlZF9ydF9kYXRhIHsKQEAgLTE0OCwxMyArMTYzLDE3IEBACiAJUUVEX1JMLAogCVFFRF9NQUMsCiAJUUVEX1ZMQU4sCisJUUVEX1JETUFfQ05RX1JBTSwKIAlRRURfSUxULAorCVFFRF9MTDJfUVVFVUUsCisJUUVEX1JETUFfU1RBVFNfUVVFVUUsCiAJUUVEX01BWF9SRVNDLAogfTsKIAogZW51bSBRRURfRkVBVFVSRSB7CiAJUUVEX1BGX0wyX1FVRSwKIAlRRURfVkYsCisJUUVEX1JETUFfQ05RLAogCVFFRF9NQVhfRkVBVFVSRVMsCiB9OwogCkBAIC0zNTcsNiArMzc2LDkgQEAKIAlzdHJ1Y3QgcWVkX3NiX2F0dG5faW5mbwkJKnBfc2JfYXR0bjsKIAogCS8qIFByb3RvY29sIHJlbGF0ZWQgKi8KKwlib29sCQkJCXVzaW5nX2xsMjsKKwlzdHJ1Y3QgcWVkX2xsMl9pbmZvCQkqcF9sbDJfaW5mbzsKKwlzdHJ1Y3QgcWVkX3JkbWFfaW5mbwkJKnBfcmRtYV9pbmZvOwogCXN0cnVjdCBxZWRfcGZfcGFyYW1zCQlwZl9wYXJhbXM7CiAKIAlib29sIGJfcmRtYV9lbmFibGVkX2luX3ByczsKQEAgLTM5Myw2ICs0MTUsMTkgQEAKIAkvKiBCdWZmZXIgZm9yIHVuemlwcGluZyBmaXJtd2FyZSBkYXRhICovCiAJdm9pZAkJCQkqdW56aXBfYnVmOwogCisJc3RydWN0IGRiZ190b29sc19kYXRhCQlkYmdfaW5mbzsKKworCS8qIFBXTSByZWdpb24gc3BlY2lmaWMgZGF0YSAqLworCXUzMgkJCQlkcGlfc2l6ZTsKKwl1MzIJCQkJZHBpX2NvdW50OworCisJLyogVGhpcyBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgZG9vcmJlbGwgYWRkcmVzcyAqLworCXUzMiBkcGlfc3RhcnRfb2Zmc2V0OworCisJLyogSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgc2V0IHRoZW4gRURQTSBzaG91bGRuJ3QgYmUgdXNlZCAqLworCXU4IGRjYnhfbm9fZWRwbTsKKwl1OCBkYl9iYXJfbm9fZWRwbTsKKwogCXN0cnVjdCBxZWRfc2ltZF9mcF9oYW5kbGVyCXNpbWRfcHJvdG9faGFuZGxlcls2NF07CiAKICNpZmRlZiBDT05GSUdfUUVEX1NSSU9WCkBAIC00MDIsNiArNDM3LDcgQEAKICNlbmRpZgogCiAJc3RydWN0IHpfc3RyZWFtX3MJCSpzdHJlYW07CisJc3RydWN0IHFlZF9yb2NlX2xsMl9pbmZvCSpsbDI7CiB9OwogCiBzdHJ1Y3QgcGNpX3BhcmFtcyB7CkBAIC00MjYsNiArNDYyLDIxIEBACiAJYm9vbAkJCWZwX2luaXRpYWxpemVkOwogCXU4CQkJZnBfbXNpeF9iYXNlOwogCXU4CQkJZnBfbXNpeF9jbnQ7CisJdTgJCQlyZG1hX21zaXhfYmFzZTsKKwl1OAkJCXJkbWFfbXNpeF9jbnQ7Cit9OworCitzdHJ1Y3QgcWVkX2RiZ19mZWF0dXJlIHsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJdTggKmR1bXBfYnVmOworCXUzMiBidWZfc2l6ZTsKKwl1MzIgZHVtcGVkX2R3b3JkczsKK307CisKK3N0cnVjdCBxZWRfZGJnX3BhcmFtcyB7CisJc3RydWN0IHFlZF9kYmdfZmVhdHVyZSBmZWF0dXJlc1tEQkdfRkVBVFVSRV9OVU1dOworCXU4IGVuZ2luZV9mb3JfZGVidWc7CisJYm9vbCBwcmludF9kYXRhOwogfTsKIAogc3RydWN0IHFlZF9kZXYgewpAQCAtNDQyLDYgKzQ5Myw4IEBACiAJCQkJIENISVBfUkVWX0lTX0EwKGRldikpCiAjZGVmaW5lIFFFRF9JU19CQl9CMChkZXYpICAgICAgIChRRURfSVNfQkIoZGV2KSAmJiBcCiAJCQkJIENISVBfUkVWX0lTX0IwKGRldikpCisjZGVmaW5lIFFFRF9JU19BSChkZXYpICAoKGRldiktPnR5cGUgPT0gUUVEX0RFVl9UWVBFX0FIKQorI2RlZmluZSBRRURfSVNfSzIoZGV2KSAgUUVEX0lTX0FIKGRldikKIAogI2RlZmluZSBRRURfR0VUX1RZUEUoZGV2KSAgICAgICAoUUVEX0lTX0JCX0EwKGRldikgPyBDSElQX0JCX0EwIDogXAogCQkJCSBRRURfSVNfQkJfQjAoZGV2KSA/IENISVBfQkJfQjAgOiBDSElQX0syKQpAQCAtNTE3LDcgKzU3MCw2IEBACiAKIAlib29sCQkJCWJfaXNfdmY7CiAJdTMyCQkJCWRydl90eXBlOwotCiAJc3RydWN0IHFlZF9ldGhfc3RhdHMJCSpyZXNldF9zdGF0czsKIAlzdHJ1Y3QgcWVkX2Z3X2RhdGEJCSpmd19kYXRhOwogCkBAIC01NDIsNyArNTk0LDE4IEBACiAJfSBwcm90b2NvbF9vcHM7CiAJdm9pZAkJCQkqb3BzX2Nvb2tpZTsKIAorCXN0cnVjdCBxZWRfZGJnX3BhcmFtcwkJZGJnX3BhcmFtczsKKworI2lmZGVmIENPTkZJR19RRURfTEwyCisJc3RydWN0IHFlZF9jYl9sbDJfaW5mbwkJKmxsMjsKKwl1OAkJCQlsbDJfbWFjX2FkZHJlc3NbRVRIX0FMRU5dOworI2VuZGlmCisKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUJCSpmaXJtd2FyZTsKKworCXUzMiByZG1hX21heF9zZ2U7CisJdTMyIHJkbWFfbWF4X2lubGluZTsKKwl1MzIgcmRtYV9tYXhfc3JxX3NnZTsKIH07CiAKICNkZWZpbmUgTlVNX09GX1ZGUyhkZXYpICAgICAgICAgTUFYX05VTV9WRlNfQkIKQEAgLTU2MSw5ICs2MjQsMTggQEAKIHN0YXRpYyBpbmxpbmUgdTggcWVkX2NvbmNyZXRlX3RvX3N3X2ZpZChzdHJ1Y3QgcWVkX2RldiAqY2RldiwKIAkJCQkJdTMyIGNvbmNyZXRlX2ZpZCkKIHsKKwl1OCB2ZmlkID0gR0VUX0ZJRUxEKGNvbmNyZXRlX2ZpZCwgUFhQX0NPTkNSRVRFX0ZJRF9WRklEKTsKIAl1OCBwZmlkID0gR0VUX0ZJRUxEKGNvbmNyZXRlX2ZpZCwgUFhQX0NPTkNSRVRFX0ZJRF9QRklEKTsKKwl1OCB2Zl92YWxpZCA9IEdFVF9GSUVMRChjb25jcmV0ZV9maWQsCisJCQkJUFhQX0NPTkNSRVRFX0ZJRF9WRlZBTElEKTsKKwl1OCBzd19maWQ7CiAKLQlyZXR1cm4gcGZpZDsKKwlpZiAodmZfdmFsaWQpCisJCXN3X2ZpZCA9IHZmaWQgKyBNQVhfTlVNX1BGUzsKKwllbHNlCisJCXN3X2ZpZCA9IHBmaWQ7CisKKwlyZXR1cm4gc3dfZmlkOwogfQogCiAjZGVmaW5lIFBVUkVfTEJfVEMgOApAQCAtNTk3LDcgKzY2OSw5IEBACiB1MzIgcWVkX3VuemlwX2RhdGEoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCiAJCSAgIHUzMiBpbnB1dF9sZW4sIHU4ICppbnB1dF9idWYsCiAJCSAgIHUzMiBtYXhfc2l6ZSwgdTggKnVuemlwX2J1Zik7Ci0KK3ZvaWQgcWVkX2dldF9wcm90b2NvbF9zdGF0cyhzdHJ1Y3QgcWVkX2RldiAqY2RldiwKKwkJCSAgICBlbnVtIHFlZF9tY3BfcHJvdG9jb2xfdHlwZSB0eXBlLAorCQkJICAgIHVuaW9uIHFlZF9tY3BfcHJvdG9jb2xfc3RhdHMgKnN0YXRzKTsKIGludCBxZWRfc2xvd3BhdGhfaXJxX3JlcShzdHJ1Y3QgcWVkX2h3Zm4gKmh3Zm4pOwogCiAjZW5kaWYgLyogX1FFRF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9jeHQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2N4dC5jCmluZGV4IDFjMzVmMzcuLjgyMzcwYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2N4dC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2N4dC5jCkBAIC00OCw3ICs0OCwxMyBAQAogI2RlZmluZSBUTV9FTEVNX1NJWkUgICAgNAogCiAvKiBJTFQgY29uc3RhbnRzICovCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSU5GSU5JQkFORF9RRURSKQorLyogRm9yIFJvQ0Ugd2UgY29uZmlndXJlIHRvIDY0SyB0byBjb3ZlciBmb3IgUm9DRSBtYXggdGFza3MgMjU2SyBwdXJwb3NlLiAqLworI2RlZmluZSBJTFRfREVGQVVMVF9IV19QX1NJWkUJCTQKKyNlbHNlCiAjZGVmaW5lIElMVF9ERUZBVUxUX0hXX1BfU0laRQkJMworI2VuZGlmCisKICNkZWZpbmUgSUxUX1BBR0VfSU5fQllURVMoaHdfcF9zaXplKQkoMVUgPDwgKChod19wX3NpemUpICsgMTIpKQogI2RlZmluZSBJTFRfQ0ZHX1JFRyhjbGksIHJlZykJUFNXUlEyX1JFR18gIyMgY2xpICMjIF8gIyMgcmVnICMjIF9SVF9PRkZTRVQKIApAQCAtMzc3LDkgKzM4Myw4IEBACiAJfQogfQogCi11MzIgcWVkX2N4dF9nZXRfcHJvdG9fY2lkX2NvdW50KHN0cnVjdCBxZWRfaHdmbgkJKnBfaHdmbiwKLQkJCQllbnVtIHByb3RvY29sX3R5cGUJdHlwZSwKLQkJCQl1MzIJCQkqdmZfY2lkKQordTMyIHFlZF9jeHRfZ2V0X3Byb3RvX2NpZF9jb3VudChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQllbnVtIHByb3RvY29sX3R5cGUgdHlwZSwgdTMyICp2Zl9jaWQpCiB7CiAJaWYgKHZmX2NpZCkKIAkJKnZmX2NpZCA9IHBfaHdmbi0+cF9jeHRfbW5nci0+Y29ubl9jZmdbdHlwZV0uY2lkc19wZXJfdmY7CkBAIC00MDUsMTAgKzQxMCwxMCBAQAogCXJldHVybiBjbnQ7CiB9CiAKLXN0YXRpYyB2b2lkCi1xZWRfY3h0X3NldF9wcm90b190aWRfY291bnQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCQkgICAgZW51bSBwcm90b2NvbF90eXBlIHByb3RvLAotCQkJICAgIHU4IHNlZywgdTggc2VnX3R5cGUsIHUzMiBjb3VudCwgYm9vbCBoYXNfZmwpCitzdGF0aWMgdm9pZCBxZWRfY3h0X3NldF9wcm90b190aWRfY291bnQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCWVudW0gcHJvdG9jb2xfdHlwZSBwcm90bywKKwkJCQkJdTggc2VnLAorCQkJCQl1OCBzZWdfdHlwZSwgdTMyIGNvdW50LCBib29sIGhhc19mbCkKIHsKIAlzdHJ1Y3QgcWVkX2N4dF9tbmdyICpwX21uZ3IgPSBwX2h3Zm4tPnBfY3h0X21uZ3I7CiAJc3RydWN0IHFlZF90aWRfc2VnICpwX3NlZyA9ICZwX21uZ3ItPmNvbm5fY2ZnW3Byb3RvXS50aWRfc2VnW3NlZ107CkBAIC00MjAsOCArNDI1LDcgQEAKIAogc3RhdGljIHZvaWQgcWVkX2lsdF9jbGlfYmxrX2ZpbGwoc3RydWN0IHFlZF9pbHRfY2xpZW50X2NmZyAqcF9jbGksCiAJCQkJIHN0cnVjdCBxZWRfaWx0X2NsaV9ibGsgKnBfYmxrLAotCQkJCSB1MzIgc3RhcnRfbGluZSwgdTMyIHRvdGFsX3NpemUsCi0JCQkJIHUzMiBlbGVtX3NpemUpCisJCQkJIHUzMiBzdGFydF9saW5lLCB1MzIgdG90YWxfc2l6ZSwgdTMyIGVsZW1fc2l6ZSkKIHsKIAl1MzIgaWx0X3NpemUgPSBJTFRfUEFHRV9JTl9CWVRFUyhwX2NsaS0+cF9zaXplLnZhbCk7CiAKQEAgLTQ0OCw4ICs0NTIsNyBAQAogCQlwX2NsaS0+Zmlyc3QudmFsID0gKnBfbGluZTsKIAogCXBfY2xpLT5hY3RpdmUgPSB0cnVlOwotCSpwX2xpbmUgKz0gRElWX1JPVU5EX1VQKHBfYmxrLT50b3RhbF9zaXplLAotCQkJCXBfYmxrLT5yZWFsX3NpemVfaW5fcGFnZSk7CisJKnBfbGluZSArPSBESVZfUk9VTkRfVVAocF9ibGstPnRvdGFsX3NpemUsIHBfYmxrLT5yZWFsX3NpemVfaW5fcGFnZSk7CiAJcF9jbGktPmxhc3QudmFsID0gKnBfbGluZSAtIDE7CiAKIAlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19JTFQsCkBAIC03OTUsMTAgKzc5OCw5IEBACiAJcF9tbmdyLT50Ml9udW1fcGFnZXMgPSBESVZfUk9VTkRfVVAodG90YWxfc2l6ZSwgcHN6KTsKIAogCS8qIGFsbG9jYXRlIHQyICovCi0JcF9tbmdyLT50MiA9IGt6YWxsb2MocF9tbmdyLT50Ml9udW1fcGFnZXMgKiBzaXplb2Yoc3RydWN0IHFlZF9kbWFfbWVtKSwKKwlwX21uZ3ItPnQyID0ga2NhbGxvYyhwX21uZ3ItPnQyX251bV9wYWdlcywgc2l6ZW9mKHN0cnVjdCBxZWRfZG1hX21lbSksCiAJCQkgICAgIEdGUF9LRVJORUwpOwogCWlmICghcF9tbmdyLT50MikgewotCQlEUF9OT1RJQ0UocF9od2ZuLCAiRmFpbGVkIHRvIGFsbG9jYXRlIHQyIHRhYmxlXG4iKTsKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIHQyX2ZhaWw7CiAJfQpAQCAtOTI2LDEyICs5MjgsOSBAQAogCQl2b2lkICpwX3ZpcnQ7CiAJCXUzMiBzaXplOwogCi0JCXNpemUgPSBtaW5fdCh1MzIsIHN6X2xlZnQsCi0JCQkgICAgIHBfYmxrLT5yZWFsX3NpemVfaW5fcGFnZSk7CisJCXNpemUgPSBtaW5fdCh1MzIsIHN6X2xlZnQsIHBfYmxrLT5yZWFsX3NpemVfaW5fcGFnZSk7CiAJCXBfdmlydCA9IGRtYV9hbGxvY19jb2hlcmVudCgmcF9od2ZuLT5jZGV2LT5wZGV2LT5kZXYsCi0JCQkJCSAgICBzaXplLAotCQkJCQkgICAgJnBfcGh5cywKLQkJCQkJICAgIEdGUF9LRVJORUwpOworCQkJCQkgICAgc2l6ZSwgJnBfcGh5cywgR0ZQX0tFUk5FTCk7CiAJCWlmICghcF92aXJ0KQogCQkJcmV0dXJuIC1FTk9NRU07CiAJCW1lbXNldChwX3ZpcnQsIDAsIHNpemUpOwpAQCAtOTYzLDcgKzk2Miw2IEBACiAJcF9tbmdyLT5pbHRfc2hhZG93ID0ga2NhbGxvYyhzaXplLCBzaXplb2Yoc3RydWN0IHFlZF9kbWFfbWVtKSwKIAkJCQkgICAgIEdGUF9LRVJORUwpOwogCWlmICghcF9tbmdyLT5pbHRfc2hhZG93KSB7Ci0JCURQX05PVElDRShwX2h3Zm4sICJGYWlsZWQgdG8gYWxsb2NhdGUgaWx0IHNoYWRvdyB0YWJsZVxuIik7CiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBpbHRfc2hhZG93X2ZhaWw7CiAJfQpAQCAtOTc2LDcgKzk3NCw3IEBACiAJCWZvciAoaiA9IDA7IGogPCBJTFRfQ0xJX1BGX0JMT0NLUzsgaisrKSB7CiAJCQlwX2JsayA9ICZjbGllbnRzW2ldLnBmX2Jsa3Nbal07CiAJCQlyYyA9IHFlZF9pbHRfYmxrX2FsbG9jKHBfaHdmbiwgcF9ibGssIGksIDApOwotCQkJaWYgKHJjICE9IDApCisJCQlpZiAocmMpCiAJCQkJZ290byBpbHRfc2hhZG93X2ZhaWw7CiAJCX0KIAkJZm9yIChrID0gMDsgayA8IHBfbW5nci0+dmZfY291bnQ7IGsrKykgewpAQCAtOTg1LDcgKzk4Myw3IEBACiAKIAkJCQlwX2JsayA9ICZjbGllbnRzW2ldLnZmX2Jsa3Nbal07CiAJCQkJcmMgPSBxZWRfaWx0X2Jsa19hbGxvYyhwX2h3Zm4sIHBfYmxrLCBpLCBsaW5lcyk7Ci0JCQkJaWYgKHJjICE9IDApCisJCQkJaWYgKHJjKQogCQkJCQlnb3RvIGlsdF9zaGFkb3dfZmFpbDsKIAkJCX0KIAkJfQpAQCAtMTA1NiwxMCArMTA1NCw4IEBACiAJdTMyIGk7CiAKIAlwX21uZ3IgPSBremFsbG9jKHNpemVvZigqcF9tbmdyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwX21uZ3IpIHsKLQkJRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBgc3RydWN0IHFlZF9jeHRfbW5ncidcbiIpOworCWlmICghcF9tbmdyKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAkvKiBJbml0aWFsaXplIElMVCBjbGllbnQgcmVnaXN0ZXJzICovCiAJY2xpZW50cyA9IHBfbW5nci0+Y2xpZW50czsKQEAgLTExMTEsMjQgKzExMDcsMTggQEAKIAogCS8qIEFsbG9jYXRlIHRoZSBJTFQgc2hhZG93IHRhYmxlICovCiAJcmMgPSBxZWRfaWx0X3NoYWRvd19hbGxvYyhwX2h3Zm4pOwotCWlmIChyYykgewotCQlEUF9OT1RJQ0UocF9od2ZuLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGlsdCBtZW1vcnlcbiIpOworCWlmIChyYykKIAkJZ290byB0YWJsZXNfYWxsb2NfZmFpbDsKLQl9CiAKIAkvKiBBbGxvY2F0ZSB0aGUgVDIgIHRhYmxlICovCiAJcmMgPSBxZWRfY3h0X3NyY190Ml9hbGxvYyhwX2h3Zm4pOwotCWlmIChyYykgewotCQlEUF9OT1RJQ0UocF9od2ZuLCAiRmFpbGVkIHRvIGFsbG9jYXRlIFQyIG1lbW9yeVxuIik7CisJaWYgKHJjKQogCQlnb3RvIHRhYmxlc19hbGxvY19mYWlsOwotCX0KIAogCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBhY3F1aXJlZCBjaWRzIGJpdG1hcHMgKi8KIAlyYyA9IHFlZF9jaWRfbWFwX2FsbG9jKHBfaHdmbik7Ci0JaWYgKHJjKSB7Ci0JCURQX05PVElDRShwX2h3Zm4sICJGYWlsZWQgdG8gYWxsb2NhdGUgY2lkIG1hcHNcbiIpOworCWlmIChyYykKIAkJZ290byB0YWJsZXNfYWxsb2NfZmFpbDsKLQl9CiAKIAlyZXR1cm4gMDsKIApAQCAtMTY3Miw3ICsxNjYyLDcgQEAKIAkJICAgICBwX2h3Zm4tPnJlbF9wZl9pZCAqIE5VTV9UQVNLX1BGX1NFR01FTlRTICsgaSk7CiAKIAkJU1RPUkVfUlRfUkVHX0FHRyhwX2h3Zm4sIHJ0X3JlZywgY2ZnX3dvcmQpOwotCQlhY3RpdmVfc2VnX21hc2sgfD0gKHRtX2lpZHMucGZfdGlkc1tpXSA/ICgxIDw8IGkpIDogMCk7CisJCWFjdGl2ZV9zZWdfbWFzayB8PSAodG1faWlkcy5wZl90aWRzW2ldID8gQklUKGkpIDogMCk7CiAKIAkJdG1fb2Zmc2V0ICs9IHRtX2lpZHMucGZfdGlkc1tpXTsKIAl9CkBAIC0xNzAyLDggKzE2OTIsNyBAQAogfQogCiBpbnQgcWVkX2N4dF9hY3F1aXJlX2NpZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCWVudW0gcHJvdG9jb2xfdHlwZSB0eXBlLAotCQkJdTMyICpwX2NpZCkKKwkJCWVudW0gcHJvdG9jb2xfdHlwZSB0eXBlLCB1MzIgKnBfY2lkKQogewogCXN0cnVjdCBxZWRfY3h0X21uZ3IgKnBfbW5nciA9IHBfaHdmbi0+cF9jeHRfbW5ncjsKIAl1MzIgcmVsX2NpZDsKQEAgLTE3MTcsOCArMTcwNiw3IEBACiAJCQkJICAgICAgcF9tbmdyLT5hY3F1aXJlZFt0eXBlXS5tYXhfY291bnQpOwogCiAJaWYgKHJlbF9jaWQgPj0gcF9tbmdyLT5hY3F1aXJlZFt0eXBlXS5tYXhfY291bnQpIHsKLQkJRFBfTk9USUNFKHBfaHdmbiwgIm5vIENJRCBhdmFpbGFibGUgZm9yIHByb3RvY29sICVkXG4iLAotCQkJICB0eXBlKTsKKwkJRFBfTk9USUNFKHBfaHdmbiwgIm5vIENJRCBhdmFpbGFibGUgZm9yIHByb3RvY29sICVkXG4iLCB0eXBlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xNzMwLDggKzE3MTgsNyBAQAogfQogCiBzdGF0aWMgYm9vbCBxZWRfY3h0X3Rlc3RfY2lkX2FjcXVpcmVkKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJCSAgICAgIHUzMiBjaWQsCi0JCQkJICAgICAgZW51bSBwcm90b2NvbF90eXBlICpwX3R5cGUpCisJCQkJICAgICAgdTMyIGNpZCwgZW51bSBwcm90b2NvbF90eXBlICpwX3R5cGUpCiB7CiAJc3RydWN0IHFlZF9jeHRfbW5nciAqcF9tbmdyID0gcF9od2ZuLT5wX2N4dF9tbmdyOwogCXN0cnVjdCBxZWRfY2lkX2FjcXVpcmVkX21hcCAqcF9tYXA7CkBAIC0xNzYzLDggKzE3NTAsNyBAQAogCXJldHVybiB0cnVlOwogfQogCi12b2lkIHFlZF9jeHRfcmVsZWFzZV9jaWQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCQkgdTMyIGNpZCkKK3ZvaWQgcWVkX2N4dF9yZWxlYXNlX2NpZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgdTMyIGNpZCkKIHsKIAlzdHJ1Y3QgcWVkX2N4dF9tbmdyICpwX21uZ3IgPSBwX2h3Zm4tPnBfY3h0X21uZ3I7CiAJZW51bSBwcm90b2NvbF90eXBlIHR5cGU7CkBAIC0xNzgxLDggKzE3NjcsNyBAQAogCV9fY2xlYXJfYml0KHJlbF9jaWQsIHBfbW5nci0+YWNxdWlyZWRbdHlwZV0uY2lkX21hcCk7CiB9CiAKLWludCBxZWRfY3h0X2dldF9jaWRfaW5mbyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCSBzdHJ1Y3QgcWVkX2N4dF9pbmZvICpwX2luZm8pCitpbnQgcWVkX2N4dF9nZXRfY2lkX2luZm8oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfY3h0X2luZm8gKnBfaW5mbykKIHsKIAlzdHJ1Y3QgcWVkX2N4dF9tbmdyICpwX21uZ3IgPSBwX2h3Zm4tPnBfY3h0X21uZ3I7CiAJdTMyIGNvbm5fY3h0X3NpemUsIGh3X3Bfc2l6ZSwgY3h0c19wZXJfcCwgbGluZTsKQEAgLTE4NjAsNiArMTg0NSw4IEBACiAJLyogU2V0IHRoZSBudW1iZXIgb2YgcmVxdWlyZWQgQ09SRSBjb25uZWN0aW9ucyAqLwogCXUzMiBjb3JlX2NpZHMgPSAxOyAvKiBTUFEgKi8KIAorCWlmIChwX2h3Zm4tPnVzaW5nX2xsMikKKwkJY29yZV9jaWRzICs9IDQ7CiAJcWVkX2N4dF9zZXRfcHJvdG9fY2lkX2NvdW50KHBfaHdmbiwgUFJPVE9DT0xJRF9DT1JFLCBjb3JlX2NpZHMsIDApOwogCiAJc3dpdGNoIChwX2h3Zm4tPmh3X2luZm8ucGVyc29uYWxpdHkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2N4dC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfY3h0LmgKaW5kZXggYzZmNmYyZS4uMmI4YmRhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfY3h0LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfY3h0LmgKQEAgLTE3MCw2ICsxNzAsMTMgQEAKICAqLwogdm9pZCBxZWRfY3h0X3JlbGVhc2VfY2lkKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAogCQkJIHUzMiBjaWQpOworaW50IHFlZF9jeHRfZHluYW1pY19pbHRfYWxsb2Moc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICAgICBlbnVtIHFlZF9jeHRfZWxlbV90eXBlIGVsZW1fdHlwZSwgdTMyIGlpZCk7Cit1MzIgcWVkX2N4dF9nZXRfcHJvdG9fdGlkX2NvdW50KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCWVudW0gcHJvdG9jb2xfdHlwZSB0eXBlKTsKK3UzMiBxZWRfY3h0X2dldF9wcm90b19jaWRfc3RhcnQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJZW51bSBwcm90b2NvbF90eXBlIHR5cGUpOworaW50IHFlZF9jeHRfZnJlZV9wcm90b19pbHQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIGVudW0gcHJvdG9jb2xfdHlwZSBwcm90byk7CiAKICNkZWZpbmUgUUVEX0NUWF9XT1JLSU5HX01FTSAwCiAjZGVmaW5lIFFFRF9DVFhfRkxfTUVNIDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2RjYnguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2RjYnguYwppbmRleCBkMGRjMjhmLi4xMzBkYTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9kY2J4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfZGNieC5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSAicWVkX2RjYnguaCIKICNpbmNsdWRlICJxZWRfaHNpLmgiCiAjaW5jbHVkZSAicWVkX3NwLmgiCisjaW5jbHVkZSAicWVkX3NyaW92LmgiCiAjaWZkZWYgQ09ORklHX0RDQgogI2luY2x1ZGUgPGxpbnV4L3FlZC9xZWRfZXRoX2lmLmg+CiAjZW5kaWYKQEAgLTUyLDQwICs1Myw5NCBAQAogCQkgIERDQlhfQVBQX1NGX0VUSFRZUEUpOwogfQogCitzdGF0aWMgYm9vbCBxZWRfZGNieF9pZWVlX2FwcF9ldGh0eXBlKHUzMiBhcHBfaW5mb19iaXRtYXApCit7CisJdTggbWZ3X3ZhbCA9IFFFRF9NRldfR0VUX0ZJRUxEKGFwcF9pbmZvX2JpdG1hcCwgRENCWF9BUFBfU0ZfSUVFRSk7CisKKwkvKiBPbGQgTUZXICovCisJaWYgKG1md192YWwgPT0gRENCWF9BUFBfU0ZfSUVFRV9SRVNFUlZFRCkKKwkJcmV0dXJuIHFlZF9kY2J4X2FwcF9ldGh0eXBlKGFwcF9pbmZvX2JpdG1hcCk7CisKKwlyZXR1cm4gISEobWZ3X3ZhbCA9PSBEQ0JYX0FQUF9TRl9JRUVFX0VUSFRZUEUpOworfQorCiBzdGF0aWMgYm9vbCBxZWRfZGNieF9hcHBfcG9ydCh1MzIgYXBwX2luZm9fYml0bWFwKQogewogCXJldHVybiAhIShRRURfTUZXX0dFVF9GSUVMRChhcHBfaW5mb19iaXRtYXAsIERDQlhfQVBQX1NGKSA9PQogCQkgIERDQlhfQVBQX1NGX1BPUlQpOwogfQogCi1zdGF0aWMgYm9vbCBxZWRfZGNieF9kZWZhdWx0X3Rsdih1MzIgYXBwX2luZm9fYml0bWFwLCB1MTYgcHJvdG9faWQpCitzdGF0aWMgYm9vbCBxZWRfZGNieF9pZWVlX2FwcF9wb3J0KHUzMiBhcHBfaW5mb19iaXRtYXAsIHU4IHR5cGUpCiB7Ci0JcmV0dXJuICEhKHFlZF9kY2J4X2FwcF9ldGh0eXBlKGFwcF9pbmZvX2JpdG1hcCkgJiYKLQkJICBwcm90b19pZCA9PSBRRURfRVRIX1RZUEVfREVGQVVMVCk7CisJdTggbWZ3X3ZhbCA9IFFFRF9NRldfR0VUX0ZJRUxEKGFwcF9pbmZvX2JpdG1hcCwgRENCWF9BUFBfU0ZfSUVFRSk7CisKKwkvKiBPbGQgTUZXICovCisJaWYgKG1md192YWwgPT0gRENCWF9BUFBfU0ZfSUVFRV9SRVNFUlZFRCkKKwkJcmV0dXJuIHFlZF9kY2J4X2FwcF9wb3J0KGFwcF9pbmZvX2JpdG1hcCk7CisKKwlyZXR1cm4gISEobWZ3X3ZhbCA9PSB0eXBlIHx8IG1md192YWwgPT0gRENCWF9BUFBfU0ZfSUVFRV9UQ1BfVURQX1BPUlQpOwogfQogCi1zdGF0aWMgYm9vbCBxZWRfZGNieF9pc2NzaV90bHYodTMyIGFwcF9pbmZvX2JpdG1hcCwgdTE2IHByb3RvX2lkKQorc3RhdGljIGJvb2wgcWVkX2RjYnhfZGVmYXVsdF90bHYodTMyIGFwcF9pbmZvX2JpdG1hcCwgdTE2IHByb3RvX2lkLCBib29sIGllZWUpCiB7Ci0JcmV0dXJuICEhKHFlZF9kY2J4X2FwcF9wb3J0KGFwcF9pbmZvX2JpdG1hcCkgJiYKLQkJICBwcm90b19pZCA9PSBRRURfVENQX1BPUlRfSVNDU0kpOworCWJvb2wgZXRodHlwZTsKKworCWlmIChpZWVlKQorCQlldGh0eXBlID0gcWVkX2RjYnhfaWVlZV9hcHBfZXRodHlwZShhcHBfaW5mb19iaXRtYXApOworCWVsc2UKKwkJZXRodHlwZSA9IHFlZF9kY2J4X2FwcF9ldGh0eXBlKGFwcF9pbmZvX2JpdG1hcCk7CisKKwlyZXR1cm4gISEoZXRodHlwZSAmJiAocHJvdG9faWQgPT0gUUVEX0VUSF9UWVBFX0RFRkFVTFQpKTsKIH0KIAotc3RhdGljIGJvb2wgcWVkX2RjYnhfZmNvZV90bHYodTMyIGFwcF9pbmZvX2JpdG1hcCwgdTE2IHByb3RvX2lkKQorc3RhdGljIGJvb2wgcWVkX2RjYnhfaXNjc2lfdGx2KHUzMiBhcHBfaW5mb19iaXRtYXAsIHUxNiBwcm90b19pZCwgYm9vbCBpZWVlKQogewotCXJldHVybiAhIShxZWRfZGNieF9hcHBfZXRodHlwZShhcHBfaW5mb19iaXRtYXApICYmCi0JCSAgcHJvdG9faWQgPT0gUUVEX0VUSF9UWVBFX0ZDT0UpOworCWJvb2wgcG9ydDsKKworCWlmIChpZWVlKQorCQlwb3J0ID0gcWVkX2RjYnhfaWVlZV9hcHBfcG9ydChhcHBfaW5mb19iaXRtYXAsCisJCQkJCSAgICAgIERDQlhfQVBQX1NGX0lFRUVfVENQX1BPUlQpOworCWVsc2UKKwkJcG9ydCA9IHFlZF9kY2J4X2FwcF9wb3J0KGFwcF9pbmZvX2JpdG1hcCk7CisKKwlyZXR1cm4gISEocG9ydCAmJiAocHJvdG9faWQgPT0gUUVEX1RDUF9QT1JUX0lTQ1NJKSk7CiB9CiAKLXN0YXRpYyBib29sIHFlZF9kY2J4X3JvY2VfdGx2KHUzMiBhcHBfaW5mb19iaXRtYXAsIHUxNiBwcm90b19pZCkKK3N0YXRpYyBib29sIHFlZF9kY2J4X2Zjb2VfdGx2KHUzMiBhcHBfaW5mb19iaXRtYXAsIHUxNiBwcm90b19pZCwgYm9vbCBpZWVlKQogewotCXJldHVybiAhIShxZWRfZGNieF9hcHBfZXRodHlwZShhcHBfaW5mb19iaXRtYXApICYmCi0JCSAgcHJvdG9faWQgPT0gUUVEX0VUSF9UWVBFX1JPQ0UpOworCWJvb2wgZXRodHlwZTsKKworCWlmIChpZWVlKQorCQlldGh0eXBlID0gcWVkX2RjYnhfaWVlZV9hcHBfZXRodHlwZShhcHBfaW5mb19iaXRtYXApOworCWVsc2UKKwkJZXRodHlwZSA9IHFlZF9kY2J4X2FwcF9ldGh0eXBlKGFwcF9pbmZvX2JpdG1hcCk7CisKKwlyZXR1cm4gISEoZXRodHlwZSAmJiAocHJvdG9faWQgPT0gUUVEX0VUSF9UWVBFX0ZDT0UpKTsKIH0KIAotc3RhdGljIGJvb2wgcWVkX2RjYnhfcm9jZV92Ml90bHYodTMyIGFwcF9pbmZvX2JpdG1hcCwgdTE2IHByb3RvX2lkKQorc3RhdGljIGJvb2wgcWVkX2RjYnhfcm9jZV90bHYodTMyIGFwcF9pbmZvX2JpdG1hcCwgdTE2IHByb3RvX2lkLCBib29sIGllZWUpCiB7Ci0JcmV0dXJuICEhKHFlZF9kY2J4X2FwcF9wb3J0KGFwcF9pbmZvX2JpdG1hcCkgJiYKLQkJICBwcm90b19pZCA9PSBRRURfVURQX1BPUlRfVFlQRV9ST0NFX1YyKTsKKwlib29sIGV0aHR5cGU7CisKKwlpZiAoaWVlZSkKKwkJZXRodHlwZSA9IHFlZF9kY2J4X2llZWVfYXBwX2V0aHR5cGUoYXBwX2luZm9fYml0bWFwKTsKKwllbHNlCisJCWV0aHR5cGUgPSBxZWRfZGNieF9hcHBfZXRodHlwZShhcHBfaW5mb19iaXRtYXApOworCisJcmV0dXJuICEhKGV0aHR5cGUgJiYgKHByb3RvX2lkID09IFFFRF9FVEhfVFlQRV9ST0NFKSk7Cit9CisKK3N0YXRpYyBib29sIHFlZF9kY2J4X3JvY2VfdjJfdGx2KHUzMiBhcHBfaW5mb19iaXRtYXAsIHUxNiBwcm90b19pZCwgYm9vbCBpZWVlKQoreworCWJvb2wgcG9ydDsKKworCWlmIChpZWVlKQorCQlwb3J0ID0gcWVkX2RjYnhfaWVlZV9hcHBfcG9ydChhcHBfaW5mb19iaXRtYXAsCisJCQkJCSAgICAgIERDQlhfQVBQX1NGX0lFRUVfVURQX1BPUlQpOworCWVsc2UKKwkJcG9ydCA9IHFlZF9kY2J4X2FwcF9wb3J0KGFwcF9pbmZvX2JpdG1hcCk7CisKKwlyZXR1cm4gISEocG9ydCAmJiAocHJvdG9faWQgPT0gUUVEX1VEUF9QT1JUX1RZUEVfUk9DRV9WMikpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTY0LDE3ICsyMTksMTcgQEAKIHN0YXRpYyBib29sCiBxZWRfZGNieF9nZXRfYXBwX3Byb3RvY29sX3R5cGUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCiAJCQkgICAgICAgdTMyIGFwcF9wcmlvX2JpdG1hcCwKLQkJCSAgICAgICB1MTYgaWQsIGVudW0gZGNieF9wcm90b2NvbF90eXBlICp0eXBlKQorCQkJICAgICAgIHUxNiBpZCwgZW51bSBkY2J4X3Byb3RvY29sX3R5cGUgKnR5cGUsIGJvb2wgaWVlZSkKIHsKLQlpZiAocWVkX2RjYnhfZmNvZV90bHYoYXBwX3ByaW9fYml0bWFwLCBpZCkpIHsKKwlpZiAocWVkX2RjYnhfZmNvZV90bHYoYXBwX3ByaW9fYml0bWFwLCBpZCwgaWVlZSkpIHsKIAkJKnR5cGUgPSBEQ0JYX1BST1RPQ09MX0ZDT0U7Ci0JfSBlbHNlIGlmIChxZWRfZGNieF9yb2NlX3RsdihhcHBfcHJpb19iaXRtYXAsIGlkKSkgeworCX0gZWxzZSBpZiAocWVkX2RjYnhfcm9jZV90bHYoYXBwX3ByaW9fYml0bWFwLCBpZCwgaWVlZSkpIHsKIAkJKnR5cGUgPSBEQ0JYX1BST1RPQ09MX1JPQ0U7Ci0JfSBlbHNlIGlmIChxZWRfZGNieF9pc2NzaV90bHYoYXBwX3ByaW9fYml0bWFwLCBpZCkpIHsKKwl9IGVsc2UgaWYgKHFlZF9kY2J4X2lzY3NpX3RsdihhcHBfcHJpb19iaXRtYXAsIGlkLCBpZWVlKSkgewogCQkqdHlwZSA9IERDQlhfUFJPVE9DT0xfSVNDU0k7Ci0JfSBlbHNlIGlmIChxZWRfZGNieF9kZWZhdWx0X3RsdihhcHBfcHJpb19iaXRtYXAsIGlkKSkgeworCX0gZWxzZSBpZiAocWVkX2RjYnhfZGVmYXVsdF90bHYoYXBwX3ByaW9fYml0bWFwLCBpZCwgaWVlZSkpIHsKIAkJKnR5cGUgPSBEQ0JYX1BST1RPQ09MX0VUSDsKLQl9IGVsc2UgaWYgKHFlZF9kY2J4X3JvY2VfdjJfdGx2KGFwcF9wcmlvX2JpdG1hcCwgaWQpKSB7CisJfSBlbHNlIGlmIChxZWRfZGNieF9yb2NlX3YyX3RsdihhcHBfcHJpb19iaXRtYXAsIGlkLCBpZWVlKSkgewogCQkqdHlwZSA9IERDQlhfUFJPVE9DT0xfUk9DRV9WMjsKIAl9IGVsc2UgewogCQkqdHlwZSA9IERDQlhfTUFYX1BST1RPQ09MX1RZUEU7CkBAIC0xOTQsMTcgKzI0OSwxOCBAQAogcWVkX2RjYnhfcHJvY2Vzc190bHYoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCiAJCSAgICAgc3RydWN0IHFlZF9kY2J4X3Jlc3VsdHMgKnBfZGF0YSwKIAkJICAgICBzdHJ1Y3QgZGNieF9hcHBfcHJpb3JpdHlfZW50cnkgKnBfdGJsLAotCQkgICAgIHUzMiBwcmlfdGNfdGJsLCBpbnQgY291bnQsIGJvb2wgZGNieF9lbmFibGVkKQorCQkgICAgIHUzMiBwcmlfdGNfdGJsLCBpbnQgY291bnQsIHU4IGRjYnhfdmVyc2lvbikKIHsKIAl1OCB0YywgcHJpb3JpdHlfbWFwOwogCWVudW0gZGNieF9wcm90b2NvbF90eXBlIHR5cGU7CisJYm9vbCBlbmFibGUsIGllZWU7CiAJdTE2IHByb3RvY29sX2lkOwogCWludCBwcmlvcml0eTsKLQlib29sIGVuYWJsZTsKIAlpbnQgaTsKIAogCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX0RDQiwgIk51bSBBUFAgZW50cmllcyA9ICVkXG4iLCBjb3VudCk7CiAKKwlpZWVlID0gKGRjYnhfdmVyc2lvbiA9PSBEQ0JYX0NPTkZJR19WRVJTSU9OX0lFRUUpOwogCS8qIFBhcnNlIEFQUCBUTFYgKi8KIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogCQlwcm90b2NvbF9pZCA9IFFFRF9NRldfR0VUX0ZJRUxEKHBfdGJsW2ldLmVudHJ5LApAQCAtMjE5LDcgKzI3NSw3IEBACiAKIAkJdGMgPSBRRURfRENCWF9QUklPMlRDKHByaV90Y190YmwsIHByaW9yaXR5KTsKIAkJaWYgKHFlZF9kY2J4X2dldF9hcHBfcHJvdG9jb2xfdHlwZShwX2h3Zm4sIHBfdGJsW2ldLmVudHJ5LAotCQkJCQkJICAgcHJvdG9jb2xfaWQsICZ0eXBlKSkgeworCQkJCQkJICAgcHJvdG9jb2xfaWQsICZ0eXBlLCBpZWVlKSkgewogCQkJLyogRVRIIGFsd2F5cyBoYXZlIHRoZSBlbmFibGUgYml0IHJlc2V0LCBhcyBpdCBnZXRzCiAJCQkgKiB2bGFuIGluZm9ybWF0aW9uIHBlciBwYWNrZXQuIEZvciBvdGhlciBwcm90b2NvbHMsCiAJCQkgKiBzaG91bGQgYmUgc2V0IGFjY29yZGluZyB0byB0aGUgZGNieF9lbmFibGVkCkBAIC0yNzUsMTUgKzMzMSwxMiBAQAogCXN0cnVjdCBkY2J4X2V0c19mZWF0dXJlICpwX2V0czsKIAlzdHJ1Y3QgcWVkX2h3X2luZm8gKnBfaW5mbzsKIAl1MzIgcHJpX3RjX3RibCwgZmxhZ3M7Ci0JYm9vbCBkY2J4X2VuYWJsZWQ7CisJdTggZGNieF92ZXJzaW9uOwogCWludCBudW1fZW50cmllczsKIAlpbnQgcmMgPSAwOwogCi0JLyogSWYgRENCeCB2ZXJzaW9uIGlzIG5vbiB6ZXJvLCB0aGVuIG5lZ290aWF0aW9uIHdhcwotCSAqIHN1Y2Nlc3NmdWx5IHBlcmZvcm1lZAotCSAqLwogCWZsYWdzID0gcF9od2ZuLT5wX2RjYnhfaW5mby0+b3BlcmF0aW9uYWwuZmxhZ3M7Ci0JZGNieF9lbmFibGVkID0gISFRRURfTUZXX0dFVF9GSUVMRChmbGFncywgRENCWF9DT05GSUdfVkVSU0lPTik7CisJZGNieF92ZXJzaW9uID0gUUVEX01GV19HRVRfRklFTEQoZmxhZ3MsIERDQlhfQ09ORklHX1ZFUlNJT04pOwogCiAJcF9hcHAgPSAmcF9od2ZuLT5wX2RjYnhfaW5mby0+b3BlcmF0aW9uYWwuZmVhdHVyZXMuYXBwOwogCXBfdGJsID0gcF9hcHAtPmFwcF9wcmlfdGJsOwpAQCAtMjk1LDEzICszNDgsMTMgQEAKIAludW1fZW50cmllcyA9IFFFRF9NRldfR0VUX0ZJRUxEKHBfYXBwLT5mbGFncywgRENCWF9BUFBfTlVNX0VOVFJJRVMpOwogCiAJcmMgPSBxZWRfZGNieF9wcm9jZXNzX3RsdihwX2h3Zm4sICZkYXRhLCBwX3RibCwgcHJpX3RjX3RibCwKLQkJCQkgIG51bV9lbnRyaWVzLCBkY2J4X2VuYWJsZWQpOworCQkJCSAgbnVtX2VudHJpZXMsIGRjYnhfdmVyc2lvbik7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKIAlwX2luZm8tPm51bV90YyA9IFFFRF9NRldfR0VUX0ZJRUxEKHBfZXRzLT5mbGFncywgRENCWF9FVFNfTUFYX1RDUyk7CiAJZGF0YS5wZl9pZCA9IHBfaHdmbi0+cmVsX3BmX2lkOwotCWRhdGEuZGNieF9lbmFibGVkID0gZGNieF9lbmFibGVkOworCWRhdGEuZGNieF9lbmFibGVkID0gISFkY2J4X3ZlcnNpb247CiAKIAlxZWRfZGNieF9kcF9wcm90b2NvbChwX2h3Zm4sICZkYXRhKTsKIApAQCAtNDAwLDcgKzQ1Myw3IEBACiBxZWRfZGNieF9nZXRfYXBwX2RhdGEoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCiAJCSAgICAgIHN0cnVjdCBkY2J4X2FwcF9wcmlvcml0eV9mZWF0dXJlICpwX2FwcCwKIAkJICAgICAgc3RydWN0IGRjYnhfYXBwX3ByaW9yaXR5X2VudHJ5ICpwX3RibCwKLQkJICAgICAgc3RydWN0IHFlZF9kY2J4X3BhcmFtcyAqcF9wYXJhbXMpCisJCSAgICAgIHN0cnVjdCBxZWRfZGNieF9wYXJhbXMgKnBfcGFyYW1zLCBib29sIGllZWUpCiB7CiAJc3RydWN0IHFlZF9hcHBfZW50cnkgKmVudHJ5OwogCXU4IHByaV9tYXA7CkBAIC00MTQsMTUgKzQ2Nyw0NiBAQAogCQkJCQkJICAgICAgRENCWF9BUFBfTlVNX0VOVFJJRVMpOwogCWZvciAoaSA9IDA7IGkgPCBEQ0JYX01BWF9BUFBfUFJPVE9DT0w7IGkrKykgewogCQllbnRyeSA9ICZwX3BhcmFtcy0+YXBwX2VudHJ5W2ldOwotCQllbnRyeS0+ZXRodHlwZSA9ICEoUUVEX01GV19HRVRfRklFTEQocF90YmxbaV0uZW50cnksCi0JCQkJCQkgICAgIERDQlhfQVBQX1NGKSk7CisJCWlmIChpZWVlKSB7CisJCQl1OCBzZl9pZWVlOworCQkJdTMyIHZhbDsKKworCQkJc2ZfaWVlZSA9IFFFRF9NRldfR0VUX0ZJRUxEKHBfdGJsW2ldLmVudHJ5LAorCQkJCQkJICAgIERDQlhfQVBQX1NGX0lFRUUpOworCQkJc3dpdGNoIChzZl9pZWVlKSB7CisJCQljYXNlIERDQlhfQVBQX1NGX0lFRUVfUkVTRVJWRUQ6CisJCQkJLyogT2xkIE1GVyAqLworCQkJCXZhbCA9IFFFRF9NRldfR0VUX0ZJRUxEKHBfdGJsW2ldLmVudHJ5LAorCQkJCQkJCURDQlhfQVBQX1NGKTsKKwkJCQllbnRyeS0+c2ZfaWVlZSA9IHZhbCA/CisJCQkJICAgIFFFRF9EQ0JYX1NGX0lFRUVfVENQX1VEUF9QT1JUIDoKKwkJCQkgICAgUUVEX0RDQlhfU0ZfSUVFRV9FVEhUWVBFOworCQkJCWJyZWFrOworCQkJY2FzZSBEQ0JYX0FQUF9TRl9JRUVFX0VUSFRZUEU6CisJCQkJZW50cnktPnNmX2llZWUgPSBRRURfRENCWF9TRl9JRUVFX0VUSFRZUEU7CisJCQkJYnJlYWs7CisJCQljYXNlIERDQlhfQVBQX1NGX0lFRUVfVENQX1BPUlQ6CisJCQkJZW50cnktPnNmX2llZWUgPSBRRURfRENCWF9TRl9JRUVFX1RDUF9QT1JUOworCQkJCWJyZWFrOworCQkJY2FzZSBEQ0JYX0FQUF9TRl9JRUVFX1VEUF9QT1JUOgorCQkJCWVudHJ5LT5zZl9pZWVlID0gUUVEX0RDQlhfU0ZfSUVFRV9VRFBfUE9SVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgRENCWF9BUFBfU0ZfSUVFRV9UQ1BfVURQX1BPUlQ6CisJCQkJZW50cnktPnNmX2llZWUgPSBRRURfRENCWF9TRl9JRUVFX1RDUF9VRFBfUE9SVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWVudHJ5LT5ldGh0eXBlID0gIShRRURfTUZXX0dFVF9GSUVMRChwX3RibFtpXS5lbnRyeSwKKwkJCQkJCQkgICAgIERDQlhfQVBQX1NGKSk7CisJCX0KKwogCQlwcmlfbWFwID0gUUVEX01GV19HRVRfRklFTEQocF90YmxbaV0uZW50cnksIERDQlhfQVBQX1BSSV9NQVApOwogCQllbnRyeS0+cHJpbyA9IGZmcyhwcmlfbWFwKSAtIDE7CiAJCWVudHJ5LT5wcm90b19pZCA9IFFFRF9NRldfR0VUX0ZJRUxEKHBfdGJsW2ldLmVudHJ5LAogCQkJCQkJICAgIERDQlhfQVBQX1BST1RPQ09MX0lEKTsKIAkJcWVkX2RjYnhfZ2V0X2FwcF9wcm90b2NvbF90eXBlKHBfaHdmbiwgcF90YmxbaV0uZW50cnksCiAJCQkJCSAgICAgICBlbnRyeS0+cHJvdG9faWQsCi0JCQkJCSAgICAgICAmZW50cnktPnByb3RvX3R5cGUpOworCQkJCQkgICAgICAgJmVudHJ5LT5wcm90b190eXBlLCBpZWVlKTsKIAl9CiAKIAlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19EQ0IsCkBAIC00ODMsNyArNTY3LDcgQEAKIAlid19tYXBbMV0gPSBiZTMyX3RvX2NwdShwX2V0cy0+dGNfYndfdGJsWzFdKTsKIAl0c2FfbWFwWzBdID0gYmUzMl90b19jcHUocF9ldHMtPnRjX3RzYV90YmxbMF0pOwogCXRzYV9tYXBbMV0gPSBiZTMyX3RvX2NwdShwX2V0cy0+dGNfdHNhX3RibFsxXSk7Ci0JcHJpX21hcCA9IGJlMzJfdG9fY3B1KHBfZXRzLT5wcmlfdGNfdGJsWzBdKTsKKwlwcmlfbWFwID0gcF9ldHMtPnByaV90Y190YmxbMF07CiAJZm9yIChpID0gMDsgaSA8IFFFRF9NQVhfUEZDX1BSSU9SSVRJRVM7IGkrKykgewogCQlwX3BhcmFtcy0+ZXRzX3RjX2J3X3RibFtpXSA9ICgodTggKilid19tYXApW2ldOwogCQlwX3BhcmFtcy0+ZXRzX3RjX3RzYV90YmxbaV0gPSAoKHU4ICopdHNhX21hcClbaV07CkBAIC01MDAsOSArNTg0LDkgQEAKIAkJCSAgIHN0cnVjdCBkY2J4X2FwcF9wcmlvcml0eV9mZWF0dXJlICpwX2FwcCwKIAkJCSAgIHN0cnVjdCBkY2J4X2FwcF9wcmlvcml0eV9lbnRyeSAqcF90YmwsCiAJCQkgICBzdHJ1Y3QgZGNieF9ldHNfZmVhdHVyZSAqcF9ldHMsCi0JCQkgICB1MzIgcGZjLCBzdHJ1Y3QgcWVkX2RjYnhfcGFyYW1zICpwX3BhcmFtcykKKwkJCSAgIHUzMiBwZmMsIHN0cnVjdCBxZWRfZGNieF9wYXJhbXMgKnBfcGFyYW1zLCBib29sIGllZWUpCiB7Ci0JcWVkX2RjYnhfZ2V0X2FwcF9kYXRhKHBfaHdmbiwgcF9hcHAsIHBfdGJsLCBwX3BhcmFtcyk7CisJcWVkX2RjYnhfZ2V0X2FwcF9kYXRhKHBfaHdmbiwgcF9hcHAsIHBfdGJsLCBwX3BhcmFtcywgaWVlZSk7CiAJcWVkX2RjYnhfZ2V0X2V0c19kYXRhKHBfaHdmbiwgcF9ldHMsIHBfcGFyYW1zKTsKIAlxZWRfZGNieF9nZXRfcGZjX2RhdGEocF9od2ZuLCBwZmMsIHBfcGFyYW1zKTsKIH0KQEAgLTUxNiw3ICs2MDAsNyBAQAogCXBfZmVhdCA9ICZwX2h3Zm4tPnBfZGNieF9pbmZvLT5sb2NhbF9hZG1pbi5mZWF0dXJlczsKIAlxZWRfZGNieF9nZXRfY29tbW9uX3BhcmFtcyhwX2h3Zm4sICZwX2ZlYXQtPmFwcCwKIAkJCQkgICBwX2ZlYXQtPmFwcC5hcHBfcHJpX3RibCwgJnBfZmVhdC0+ZXRzLAotCQkJCSAgIHBfZmVhdC0+cGZjLCAmcGFyYW1zLT5sb2NhbC5wYXJhbXMpOworCQkJCSAgIHBfZmVhdC0+cGZjLCAmcGFyYW1zLT5sb2NhbC5wYXJhbXMsIGZhbHNlKTsKIAlwYXJhbXMtPmxvY2FsLnZhbGlkID0gdHJ1ZTsKIH0KIApAQCAtNTI5LDcgKzYxMyw3IEBACiAJcF9mZWF0ID0gJnBfaHdmbi0+cF9kY2J4X2luZm8tPnJlbW90ZS5mZWF0dXJlczsKIAlxZWRfZGNieF9nZXRfY29tbW9uX3BhcmFtcyhwX2h3Zm4sICZwX2ZlYXQtPmFwcCwKIAkJCQkgICBwX2ZlYXQtPmFwcC5hcHBfcHJpX3RibCwgJnBfZmVhdC0+ZXRzLAotCQkJCSAgIHBfZmVhdC0+cGZjLCAmcGFyYW1zLT5yZW1vdGUucGFyYW1zKTsKKwkJCQkgICBwX2ZlYXQtPnBmYywgJnBhcmFtcy0+cmVtb3RlLnBhcmFtcywgZmFsc2UpOwogCXBhcmFtcy0+cmVtb3RlLnZhbGlkID0gdHJ1ZTsKIH0KIApAQCAtNTc0LDcgKzY1OCw4IEBACiAKIAlxZWRfZGNieF9nZXRfY29tbW9uX3BhcmFtcyhwX2h3Zm4sICZwX2ZlYXQtPmFwcCwKIAkJCQkgICBwX2ZlYXQtPmFwcC5hcHBfcHJpX3RibCwgJnBfZmVhdC0+ZXRzLAotCQkJCSAgIHBfZmVhdC0+cGZjLCAmcGFyYW1zLT5vcGVyYXRpb25hbC5wYXJhbXMpOworCQkJCSAgIHBfZmVhdC0+cGZjLCAmcGFyYW1zLT5vcGVyYXRpb25hbC5wYXJhbXMsCisJCQkJICAgcF9vcGVyYXRpb25hbC0+aWVlZSk7CiAJcWVkX2RjYnhfZ2V0X3ByaW9yaXR5X2luZm8ocF9od2ZuLCAmcF9vcGVyYXRpb25hbC0+YXBwX3ByaW8sIHBfcmVzdWx0cyk7CiAJZXJyID0gUUVEX01GV19HRVRfRklFTEQocF9mZWF0LT5hcHAuZmxhZ3MsIERDQlhfQVBQX0VSUk9SKTsKIAlwX29wZXJhdGlvbmFsLT5lcnIgPSBlcnI7CkBAIC03OTAsMTEgKzg3NSw4IEBACiAJaW50IHJjID0gMDsKIAogCXBfaHdmbi0+cF9kY2J4X2luZm8gPSBremFsbG9jKHNpemVvZigqcF9od2ZuLT5wX2RjYnhfaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICghcF9od2ZuLT5wX2RjYnhfaW5mbykgewotCQlEUF9OT1RJQ0UocF9od2ZuLAotCQkJICAiRmFpbGVkIHRvIGFsbG9jYXRlICdzdHJ1Y3QgcWVkX2RjYnhfaW5mbydcbiIpOworCWlmICghcF9od2ZuLT5wX2RjYnhfaW5mbykKIAkJcmMgPSAtRU5PTUVNOwotCX0KIAogCXJldHVybiByYzsKIH0KQEAgLTg2MSw2ICs5NDMsOSBAQAogCXN0cnVjdCBxZWRfcHR0ICpwX3B0dDsKIAlpbnQgcmM7CiAKKwlpZiAoSVNfVkYocF9od2ZuLT5jZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlwX3B0dCA9IHFlZF9wdHRfYWNxdWlyZShwX2h3Zm4pOwogCWlmICghcF9wdHQpCiAJCXJldHVybiAtRUJVU1k7CkBAIC05MDAsNiArOTg1LDcgQEAKIAkJaWYgKHBfcGFyYW1zLT5wZmMucHJpb1tpXSkKIAkJCXBmY19tYXAgfD0gQklUKGkpOwogCisJKnBmYyAmPSB+RENCWF9QRkNfUFJJX0VOX0JJVE1BUF9NQVNLOwogCSpwZmMgfD0gKHBmY19tYXAgPDwgRENCWF9QRkNfUFJJX0VOX0JJVE1BUF9TSElGVCk7CiAKIAlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19EQ0IsICJwZmMgPSAweCV4XG4iLCAqcGZjKTsKQEAgLTk0NCw3ICsxMDMwLDYgQEAKIAkJdmFsID0gKCgodTMyKXBfcGFyYW1zLT5ldHNfcHJpX3RjX3RibFtpXSkgPDwgKCg3IC0gaSkgKiA0KSk7CiAJCXBfZXRzLT5wcmlfdGNfdGJsWzBdIHw9IHZhbDsKIAl9Ci0JcF9ldHMtPnByaV90Y190YmxbMF0gPSBjcHVfdG9fYmUzMihwX2V0cy0+cHJpX3RjX3RibFswXSk7CiAJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogCQlwX2V0cy0+dGNfYndfdGJsW2ldID0gY3B1X3RvX2JlMzIocF9ldHMtPnRjX2J3X3RibFtpXSk7CiAJCXBfZXRzLT50Y190c2FfdGJsW2ldID0gY3B1X3RvX2JlMzIocF9ldHMtPnRjX3RzYV90YmxbaV0pOwpAQCAtOTU0LDcgKzEwMzksNyBAQAogc3RhdGljIHZvaWQKIHFlZF9kY2J4X3NldF9hcHBfZGF0YShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKIAkJICAgICAgc3RydWN0IGRjYnhfYXBwX3ByaW9yaXR5X2ZlYXR1cmUgKnBfYXBwLAotCQkgICAgICBzdHJ1Y3QgcWVkX2RjYnhfcGFyYW1zICpwX3BhcmFtcykKKwkJICAgICAgc3RydWN0IHFlZF9kY2J4X3BhcmFtcyAqcF9wYXJhbXMsIGJvb2wgaWVlZSkKIHsKIAl1MzIgKmVudHJ5OwogCWludCBpOwpAQCAtOTc1LDEyICsxMDYwLDQ1IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgRENCWF9NQVhfQVBQX1BST1RPQ09MOyBpKyspIHsKIAkJZW50cnkgPSAmcF9hcHAtPmFwcF9wcmlfdGJsW2ldLmVudHJ5OwotCQkqZW50cnkgJj0gfkRDQlhfQVBQX1NGX01BU0s7Ci0JCWlmIChwX3BhcmFtcy0+YXBwX2VudHJ5W2ldLmV0aHR5cGUpCi0JCQkqZW50cnkgfD0gKCh1MzIpRENCWF9BUFBfU0ZfRVRIVFlQRSA8PAotCQkJCSAgIERDQlhfQVBQX1NGX1NISUZUKTsKLQkJZWxzZQotCQkJKmVudHJ5IHw9ICgodTMyKURDQlhfQVBQX1NGX1BPUlQgPDwgRENCWF9BUFBfU0ZfU0hJRlQpOworCQkqZW50cnkgPSAwOworCQlpZiAoaWVlZSkgeworCQkJKmVudHJ5ICY9IH4oRENCWF9BUFBfU0ZfSUVFRV9NQVNLIHwgRENCWF9BUFBfU0ZfTUFTSyk7CisJCQlzd2l0Y2ggKHBfcGFyYW1zLT5hcHBfZW50cnlbaV0uc2ZfaWVlZSkgeworCQkJY2FzZSBRRURfRENCWF9TRl9JRUVFX0VUSFRZUEU6CisJCQkJKmVudHJ5IHw9ICgodTMyKURDQlhfQVBQX1NGX0lFRUVfRVRIVFlQRSA8PAorCQkJCQkgICBEQ0JYX0FQUF9TRl9JRUVFX1NISUZUKTsKKwkJCQkqZW50cnkgfD0gKCh1MzIpRENCWF9BUFBfU0ZfRVRIVFlQRSA8PAorCQkJCQkgICBEQ0JYX0FQUF9TRl9TSElGVCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFFFRF9EQ0JYX1NGX0lFRUVfVENQX1BPUlQ6CisJCQkJKmVudHJ5IHw9ICgodTMyKURDQlhfQVBQX1NGX0lFRUVfVENQX1BPUlQgPDwKKwkJCQkJICAgRENCWF9BUFBfU0ZfSUVFRV9TSElGVCk7CisJCQkJKmVudHJ5IHw9ICgodTMyKURDQlhfQVBQX1NGX1BPUlQgPDwKKwkJCQkJICAgRENCWF9BUFBfU0ZfU0hJRlQpOworCQkJCWJyZWFrOworCQkJY2FzZSBRRURfRENCWF9TRl9JRUVFX1VEUF9QT1JUOgorCQkJCSplbnRyeSB8PSAoKHUzMilEQ0JYX0FQUF9TRl9JRUVFX1VEUF9QT1JUIDw8CisJCQkJCSAgIERDQlhfQVBQX1NGX0lFRUVfU0hJRlQpOworCQkJCSplbnRyeSB8PSAoKHUzMilEQ0JYX0FQUF9TRl9QT1JUIDw8CisJCQkJCSAgIERDQlhfQVBQX1NGX1NISUZUKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUUVEX0RDQlhfU0ZfSUVFRV9UQ1BfVURQX1BPUlQ6CisJCQkJKmVudHJ5IHw9ICgodTMyKURDQlhfQVBQX1NGX0lFRUVfVENQX1VEUF9QT1JUIDw8CisJCQkJCSAgIERDQlhfQVBQX1NGX0lFRUVfU0hJRlQpOworCQkJCSplbnRyeSB8PSAoKHUzMilEQ0JYX0FQUF9TRl9QT1JUIDw8CisJCQkJCSAgIERDQlhfQVBQX1NGX1NISUZUKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCSplbnRyeSAmPSB+RENCWF9BUFBfU0ZfTUFTSzsKKwkJCWlmIChwX3BhcmFtcy0+YXBwX2VudHJ5W2ldLmV0aHR5cGUpCisJCQkJKmVudHJ5IHw9ICgodTMyKURDQlhfQVBQX1NGX0VUSFRZUEUgPDwKKwkJCQkJICAgRENCWF9BUFBfU0ZfU0hJRlQpOworCQkJZWxzZQorCQkJCSplbnRyeSB8PSAoKHUzMilEQ0JYX0FQUF9TRl9QT1JUIDw8CisJCQkJCSAgIERDQlhfQVBQX1NGX1NISUZUKTsKKwkJfQorCiAJCSplbnRyeSAmPSB+RENCWF9BUFBfUFJPVE9DT0xfSURfTUFTSzsKIAkJKmVudHJ5IHw9ICgodTMyKXBfcGFyYW1zLT5hcHBfZW50cnlbaV0ucHJvdG9faWQgPDwKIAkJCSAgIERDQlhfQVBQX1BST1RPQ09MX0lEX1NISUZUKTsKQEAgLTk5NSwxNSArMTExMywxOSBAQAogCQkJICBzdHJ1Y3QgZGNieF9sb2NhbF9wYXJhbXMgKmxvY2FsX2FkbWluLAogCQkJICBzdHJ1Y3QgcWVkX2RjYnhfc2V0ICpwYXJhbXMpCiB7CisJYm9vbCBpZWVlID0gZmFsc2U7CisKIAlsb2NhbF9hZG1pbi0+ZmxhZ3MgPSAwOwogCW1lbWNweSgmbG9jYWxfYWRtaW4tPmZlYXR1cmVzLAogCSAgICAgICAmcF9od2ZuLT5wX2RjYnhfaW5mby0+b3BlcmF0aW9uYWwuZmVhdHVyZXMsCiAJICAgICAgIHNpemVvZihsb2NhbF9hZG1pbi0+ZmVhdHVyZXMpKTsKIAotCWlmIChwYXJhbXMtPmVuYWJsZWQpCisJaWYgKHBhcmFtcy0+ZW5hYmxlZCkgewogCQlsb2NhbF9hZG1pbi0+Y29uZmlnID0gcGFyYW1zLT52ZXJfbnVtOwotCWVsc2UKKwkJaWVlZSA9ICEhKHBhcmFtcy0+dmVyX251bSAmIERDQlhfQ09ORklHX1ZFUlNJT05fSUVFRSk7CisJfSBlbHNlIHsKIAkJbG9jYWxfYWRtaW4tPmNvbmZpZyA9IERDQlhfQ09ORklHX1ZFUlNJT05fRElTQUJMRUQ7CisJfQogCiAJaWYgKHBhcmFtcy0+b3ZlcnJpZGVfZmxhZ3MgJiBRRURfRENCWF9PVkVSUklERV9QRkNfQ0ZHKQogCQlxZWRfZGNieF9zZXRfcGZjX2RhdGEocF9od2ZuLCAmbG9jYWxfYWRtaW4tPmZlYXR1cmVzLnBmYywKQEAgLTEwMTUsNyArMTEzNyw3IEBACiAKIAlpZiAocGFyYW1zLT5vdmVycmlkZV9mbGFncyAmIFFFRF9EQ0JYX09WRVJSSURFX0FQUF9DRkcpCiAJCXFlZF9kY2J4X3NldF9hcHBfZGF0YShwX2h3Zm4sICZsb2NhbF9hZG1pbi0+ZmVhdHVyZXMuYXBwLAotCQkJCSAgICAgICZwYXJhbXMtPmNvbmZpZy5wYXJhbXMpOworCQkJCSAgICAgICZwYXJhbXMtPmNvbmZpZy5wYXJhbXMsIGllZWUpOwogfQogCiBpbnQgcWVkX2RjYnhfY29uZmlnX3BhcmFtcyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0LApAQCAtMTA2NCwxMSArMTE4Niw5IEBACiAJCXJldHVybiAwOwogCX0KIAotCWRjYnhfaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCpkY2J4X2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRjYnhfaW5mbykgewotCQlEUF9FUlIocF9od2ZuLCAiRmFpbGVkIHRvIGFsbG9jYXRlIHN0cnVjdCBxZWRfZGNieF9pbmZvXG4iKTsKKwlkY2J4X2luZm8gPSBremFsbG9jKHNpemVvZigqZGNieF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkY2J4X2luZm8pCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXJjID0gcWVkX2RjYnhfcXVlcnlfcGFyYW1zKHBfaHdmbiwgZGNieF9pbmZvLCBRRURfRENCWF9PUEVSQVRJT05BTF9NSUIpOwogCWlmIChyYykgewpAQCAtMTEwMSwxMSArMTIyMSw5IEBACiB7CiAJc3RydWN0IHFlZF9kY2J4X2dldCAqZGNieF9pbmZvOwogCi0JZGNieF9pbmZvID0ga21hbGxvYyhzaXplb2YoKmRjYnhfaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICghZGNieF9pbmZvKSB7Ci0JCURQX0VSUihod2ZuLT5jZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZGNieF9pbmZvXG4iKTsKKwlkY2J4X2luZm8gPSBremFsbG9jKHNpemVvZigqZGNieF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkY2J4X2luZm8pCiAJCXJldHVybiBOVUxMOwotCX0KIAogCWlmIChxZWRfZGNieF9xdWVyeV9wYXJhbXMoaHdmbiwgZGNieF9pbmZvLCB0eXBlKSkgewogCQlrZnJlZShkY2J4X2luZm8pOwpAQCAtMTU5Niw4ICsxNzE0LDEwIEBACiAJCWlmICgoZW50cnktPmV0aHR5cGUgPT0gZXRodHlwZSkgJiYgKGVudHJ5LT5wcm90b19pZCA9PSBpZHZhbCkpCiAJCQlicmVhazsKIAkJLyogRmlyc3QgZW1wdHkgc2xvdCAqLwotCQlpZiAoIWVudHJ5LT5wcm90b19pZCkKKwkJaWYgKCFlbnRyeS0+cHJvdG9faWQpIHsKKwkJCWRjYnhfc2V0LmNvbmZpZy5wYXJhbXMubnVtX2FwcF9lbnRyaWVzKys7CiAJCQlicmVhazsKKwkJfQogCX0KIAogCWlmIChpID09IFFFRF9EQ0JYX01BWF9BUFBfUFJPVE9DT0wpIHsKQEAgLTE4NTUsNiArMTk3NSw3IEBACiAKIAlpZiAoIWRjYnhfaW5mby0+b3BlcmF0aW9uYWwuaWVlZSkgewogCQlEUF9JTkZPKGh3Zm4sICJEQ0JYIGlzIG5vdCBlbmFibGVkL29wZXJhdGlvbmFsIGluIElFRUUgbW9kZVxuIik7CisJCWtmcmVlKGRjYnhfaW5mbyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjAyMywxNyArMjE0NCwxOSBAQAogCXJldHVybiByYzsKIH0KIAotaW50IHFlZF9kY2JubF9pZWVlX3BlZXJfZ2V0ZXRzKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCBzdHJ1Y3QgaWVlZV9ldHMgKmV0cykKK3N0YXRpYyBpbnQKK3FlZF9kY2JubF9pZWVlX3BlZXJfZ2V0ZXRzKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCBzdHJ1Y3QgaWVlZV9ldHMgKmV0cykKIHsKIAlyZXR1cm4gcWVkX2RjYm5sX2dldF9pZWVlX2V0cyhjZGV2LCBldHMsIHRydWUpOwogfQogCi1pbnQgcWVkX2RjYm5sX2llZWVfcGVlcl9nZXRwZmMoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHN0cnVjdCBpZWVlX3BmYyAqcGZjKQorc3RhdGljIGludAorcWVkX2RjYm5sX2llZWVfcGVlcl9nZXRwZmMoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHN0cnVjdCBpZWVlX3BmYyAqcGZjKQogewogCXJldHVybiBxZWRfZGNibmxfZ2V0X2llZWVfcGZjKGNkZXYsIHBmYywgdHJ1ZSk7CiB9CiAKLWludCBxZWRfZGNibmxfaWVlZV9nZXRhcHAoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHN0cnVjdCBkY2JfYXBwICphcHApCitzdGF0aWMgaW50IHFlZF9kY2JubF9pZWVlX2dldGFwcChzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgc3RydWN0IGRjYl9hcHAgKmFwcCkKIHsKIAlzdHJ1Y3QgcWVkX2h3Zm4gKmh3Zm4gPSBRRURfTEVBRElOR19IV0ZOKGNkZXYpOwogCXN0cnVjdCBxZWRfZGNieF9nZXQgKmRjYnhfaW5mbzsKQEAgLTIwNzcsNyArMjIwMCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBxZWRfZGNibmxfaWVlZV9zZXRhcHAoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHN0cnVjdCBkY2JfYXBwICphcHApCitzdGF0aWMgaW50IHFlZF9kY2JubF9pZWVlX3NldGFwcChzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgc3RydWN0IGRjYl9hcHAgKmFwcCkKIHsKIAlzdHJ1Y3QgcWVkX2h3Zm4gKmh3Zm4gPSBRRURfTEVBRElOR19IV0ZOKGNkZXYpOwogCXN0cnVjdCBxZWRfZGNieF9nZXQgKmRjYnhfaW5mbzsKQEAgLTIxMTcsOCArMjI0MCwxMCBAQAogCQkgICAgKGVudHJ5LT5wcm90b19pZCA9PSBhcHAtPnByb3RvY29sKSkKIAkJCWJyZWFrOwogCQkvKiBGaXJzdCBlbXB0eSBzbG90ICovCi0JCWlmICghZW50cnktPnByb3RvX2lkKQorCQlpZiAoIWVudHJ5LT5wcm90b19pZCkgeworCQkJZGNieF9zZXQuY29uZmlnLnBhcmFtcy5udW1fYXBwX2VudHJpZXMrKzsKIAkJCWJyZWFrOworCQl9CiAJfQogCiAJaWYgKGkgPT0gUUVEX0RDQlhfTUFYX0FQUF9QUk9UT0NPTCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfZGVidWcuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhlN2Q1YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2RlYnVnLmMKQEAgLTAsMCArMSw2ODk4IEBACisvKiBRTG9naWMgcWVkIE5JQyBEcml2ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNSBRTG9naWMgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mCisgKiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlICJxZWQuaCIKKyNpbmNsdWRlICJxZWRfaHNpLmgiCisjaW5jbHVkZSAicWVkX2h3LmgiCisjaW5jbHVkZSAicWVkX21jcC5oIgorI2luY2x1ZGUgInFlZF9yZWdfYWRkci5oIgorCisvKiBDaGlwIElEcyBlbnVtICovCitlbnVtIGNoaXBfaWRzIHsKKwlDSElQX1JFU0VSVkVELAorCUNISVBfQkJfQjAsCisJQ0hJUF9LMiwKKwlNQVhfQ0hJUF9JRFMKK307CisKKy8qIE1lbW9yeSBncm91cHMgZW51bSAqLworZW51bSBtZW1fZ3JvdXBzIHsKKwlNRU1fR1JPVVBfUFhQX01FTSwKKwlNRU1fR1JPVVBfRE1BRV9NRU0sCisJTUVNX0dST1VQX0NNX01FTSwKKwlNRU1fR1JPVVBfUU1fTUVNLAorCU1FTV9HUk9VUF9UTV9NRU0sCisJTUVNX0dST1VQX0JSQl9SQU0sCisJTUVNX0dST1VQX0JSQl9NRU0sCisJTUVNX0dST1VQX1BSU19NRU0sCisJTUVNX0dST1VQX1NETV9NRU0sCisJTUVNX0dST1VQX1BCVUYsCisJTUVNX0dST1VQX0lPUiwKKwlNRU1fR1JPVVBfUkFNLAorCU1FTV9HUk9VUF9CVEJfUkFNLAorCU1FTV9HUk9VUF9SRElGX0NUWCwKKwlNRU1fR1JPVVBfVERJRl9DVFgsCisJTUVNX0dST1VQX0NPTk5fQ0ZDX01FTSwKKwlNRU1fR1JPVVBfVEFTS19DRkNfTUVNLAorCU1FTV9HUk9VUF9DQVVfUEksCisJTUVNX0dST1VQX0NBVV9NRU0sCisJTUVNX0dST1VQX1BYUF9JTFQsCisJTUVNX0dST1VQX01VTERfTUVNLAorCU1FTV9HUk9VUF9CVEJfTUVNLAorCU1FTV9HUk9VUF9JR1VfTUVNLAorCU1FTV9HUk9VUF9JR1VfTVNJWCwKKwlNRU1fR1JPVVBfQ0FVX1NCLAorCU1FTV9HUk9VUF9CTUJfUkFNLAorCU1FTV9HUk9VUF9CTUJfTUVNLAorCU1FTV9HUk9VUFNfTlVNCit9OworCisvKiBNZW1vcnkgZ3JvdXBzIG5hbWVzICovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNfbWVtX2dyb3VwX25hbWVzW10gPSB7CisJIlBYUF9NRU0iLAorCSJETUFFX01FTSIsCisJIkNNX01FTSIsCisJIlFNX01FTSIsCisJIlRNX01FTSIsCisJIkJSQl9SQU0iLAorCSJCUkJfTUVNIiwKKwkiUFJTX01FTSIsCisJIlNETV9NRU0iLAorCSJQQlVGIiwKKwkiSU9SIiwKKwkiUkFNIiwKKwkiQlRCX1JBTSIsCisJIlJESUZfQ1RYIiwKKwkiVERJRl9DVFgiLAorCSJDT05OX0NGQ19NRU0iLAorCSJUQVNLX0NGQ19NRU0iLAorCSJDQVVfUEkiLAorCSJDQVVfTUVNIiwKKwkiUFhQX0lMVCIsCisJIk1VTERfTUVNIiwKKwkiQlRCX01FTSIsCisJIklHVV9NRU0iLAorCSJJR1VfTVNJWCIsCisJIkNBVV9TQiIsCisJIkJNQl9SQU0iLAorCSJCTUJfTUVNIiwKK307CisKKy8qIElkbGUgY2hlY2sgY29uZGl0aW9ucyAqLworc3RhdGljIHUzMiBjb25kNChjb25zdCB1MzIgKnIsIGNvbnN0IHUzMiAqaW1tKQoreworCXJldHVybiAoKHJbMF0gJiBpbW1bMF0pICE9IGltbVsxXSkgJiYgKChyWzFdICYgaW1tWzJdKSAhPSBpbW1bM10pOworfQorCitzdGF0aWMgdTMyIGNvbmQ2KGNvbnN0IHUzMiAqciwgY29uc3QgdTMyICppbW0pCit7CisJcmV0dXJuICgoclswXSA+PiBpbW1bMF0pICYgaW1tWzFdKSAhPSBpbW1bMl07Cit9CisKK3N0YXRpYyB1MzIgY29uZDUoY29uc3QgdTMyICpyLCBjb25zdCB1MzIgKmltbSkKK3sKKwlyZXR1cm4gKHJbMF0gJiBpbW1bMF0pICE9IGltbVsxXTsKK30KKworc3RhdGljIHUzMiBjb25kOChjb25zdCB1MzIgKnIsIGNvbnN0IHUzMiAqaW1tKQoreworCXJldHVybiAoKHJbMF0gJiBpbW1bMF0pID4+IGltbVsxXSkgIT0KKwkgICAgKCgoclswXSAmIGltbVsyXSkgPj4gaW1tWzNdKSB8ICgoclsxXSAmIGltbVs0XSkgPDwgaW1tWzVdKSk7Cit9CisKK3N0YXRpYyB1MzIgY29uZDkoY29uc3QgdTMyICpyLCBjb25zdCB1MzIgKmltbSkKK3sKKwlyZXR1cm4gKChyWzBdICYgaW1tWzBdKSA+PiBpbW1bMV0pICE9IChyWzBdICYgaW1tWzJdKTsKK30KKworc3RhdGljIHUzMiBjb25kMShjb25zdCB1MzIgKnIsIGNvbnN0IHUzMiAqaW1tKQoreworCXJldHVybiAoclswXSAmIH5pbW1bMF0pICE9IGltbVsxXTsKK30KKworc3RhdGljIHUzMiBjb25kMChjb25zdCB1MzIgKnIsIGNvbnN0IHUzMiAqaW1tKQoreworCXJldHVybiByWzBdICE9IGltbVswXTsKK30KKworc3RhdGljIHUzMiBjb25kMTAoY29uc3QgdTMyICpyLCBjb25zdCB1MzIgKmltbSkKK3sKKwlyZXR1cm4gclswXSAhPSByWzFdICYmIHJbMl0gPT0gaW1tWzBdOworfQorCitzdGF0aWMgdTMyIGNvbmQxMShjb25zdCB1MzIgKnIsIGNvbnN0IHUzMiAqaW1tKQoreworCXJldHVybiByWzBdICE9IHJbMV0gJiYgclsyXSA+IGltbVswXTsKK30KKworc3RhdGljIHUzMiBjb25kMyhjb25zdCB1MzIgKnIsIGNvbnN0IHUzMiAqaW1tKQoreworCXJldHVybiByWzBdICE9IHJbMV07Cit9CisKK3N0YXRpYyB1MzIgY29uZDEyKGNvbnN0IHUzMiAqciwgY29uc3QgdTMyICppbW0pCit7CisJcmV0dXJuIHJbMF0gJiBpbW1bMF07Cit9CisKK3N0YXRpYyB1MzIgY29uZDcoY29uc3QgdTMyICpyLCBjb25zdCB1MzIgKmltbSkKK3sKKwlyZXR1cm4gclswXSA8IChyWzFdIC0gaW1tWzBdKTsKK30KKworc3RhdGljIHUzMiBjb25kMihjb25zdCB1MzIgKnIsIGNvbnN0IHUzMiAqaW1tKQoreworCXJldHVybiByWzBdID4gaW1tWzBdOworfQorCisvKiBBcnJheSBvZiBJZGxlIENoZWNrIGNvbmRpdGlvbnMgKi8KK3N0YXRpYyB1MzIoKmNvbmRfYXJyW10pIChjb25zdCB1MzIgKnIsIGNvbnN0IHUzMiAqaW1tKSA9IHsKKwljb25kMCwKKwljb25kMSwKKwljb25kMiwKKwljb25kMywKKwljb25kNCwKKwljb25kNSwKKwljb25kNiwKKwljb25kNywKKwljb25kOCwKKwljb25kOSwKKwljb25kMTAsCisJY29uZDExLAorCWNvbmQxMiwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIERhdGEgVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZW51bSBwbGF0Zm9ybV9pZHMgeworCVBMQVRGT1JNX0FTSUMsCisJUExBVEZPUk1fUkVTRVJWRUQsCisJUExBVEZPUk1fUkVTRVJWRUQyLAorCVBMQVRGT1JNX1JFU0VSVkVEMywKKwlNQVhfUExBVEZPUk1fSURTCit9OworCitzdHJ1Y3QgZGJnX2FycmF5IHsKKwljb25zdCB1MzIgKnB0cjsKKwl1MzIgc2l6ZV9pbl9kd29yZHM7Cit9OworCisvKiBDaGlwIGNvbnN0YW50IGRlZmluaXRpb25zICovCitzdHJ1Y3QgY2hpcF9kZWZzIHsKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCB7CisJCXU4IG51bV9wb3J0czsKKwkJdTggbnVtX3BmczsKKwl9IHBlcl9wbGF0Zm9ybVtNQVhfUExBVEZPUk1fSURTXTsKK307CisKKy8qIFBsYXRmb3JtIGNvbnN0YW50IGRlZmluaXRpb25zICovCitzdHJ1Y3QgcGxhdGZvcm1fZGVmcyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1MzIgZGVsYXlfZmFjdG9yOworfTsKKworLyogU3Rvcm0gY29uc3RhbnQgZGVmaW5pdGlvbnMgKi8KK3N0cnVjdCBzdG9ybV9kZWZzIHsKKwljaGFyIGxldHRlcjsKKwllbnVtIGJsb2NrX2lkIGJsb2NrX2lkOworCWVudW0gZGJnX2J1c19jbGllbnRzIGRiZ19jbGllbnRfaWRbTUFYX0NISVBfSURTXTsKKwlib29sIGhhc192ZmM7CisJdTMyIHNlbV9mYXN0X21lbV9hZGRyOworCXUzMiBzZW1fZnJhbWVfbW9kZV9hZGRyOworCXUzMiBzZW1fc2xvd19lbmFibGVfYWRkcjsKKwl1MzIgc2VtX3Nsb3dfbW9kZV9hZGRyOworCXUzMiBzZW1fc2xvd19tb2RlMV9jb25mX2FkZHI7CisJdTMyIHNlbV9zeW5jX2RiZ19lbXB0eV9hZGRyOworCXUzMiBzZW1fc2xvd19kYmdfZW1wdHlfYWRkcjsKKwl1MzIgY21fY3R4X3dyX2FkZHI7CisJdTMyIGNtX2Nvbm5fYWdfY3R4X2xpZF9zaXplOyAvKiBJbiBxdWFkLXJlZ3MgKi8KKwl1MzIgY21fY29ubl9hZ19jdHhfcmRfYWRkcjsKKwl1MzIgY21fY29ubl9zdF9jdHhfbGlkX3NpemU7IC8qIEluIHF1YWQtcmVncyAqLworCXUzMiBjbV9jb25uX3N0X2N0eF9yZF9hZGRyOworCXUzMiBjbV90YXNrX2FnX2N0eF9saWRfc2l6ZTsgLyogSW4gcXVhZC1yZWdzICovCisJdTMyIGNtX3Rhc2tfYWdfY3R4X3JkX2FkZHI7CisJdTMyIGNtX3Rhc2tfc3RfY3R4X2xpZF9zaXplOyAvKiBJbiBxdWFkLXJlZ3MgKi8KKwl1MzIgY21fdGFza19zdF9jdHhfcmRfYWRkcjsKK307CisKKy8qIEJsb2NrIGNvbnN0YW50IGRlZmluaXRpb25zICovCitzdHJ1Y3QgYmxvY2tfZGVmcyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlib29sIGhhc19kYmdfYnVzW01BWF9DSElQX0lEU107CisJYm9vbCBhc3NvY2lhdGVkX3RvX3N0b3JtOworCXUzMiBzdG9ybV9pZDsgLyogVmFsaWQgb25seSBpZiBhc3NvY2lhdGVkX3RvX3N0b3JtIGlzIHRydWUgKi8KKwllbnVtIGRiZ19idXNfY2xpZW50cyBkYmdfY2xpZW50X2lkW01BWF9DSElQX0lEU107CisJdTMyIGRiZ19zZWxlY3RfYWRkcjsKKwl1MzIgZGJnX2N5Y2xlX2VuYWJsZV9hZGRyOworCXUzMiBkYmdfc2hpZnRfYWRkcjsKKwl1MzIgZGJnX2ZvcmNlX3ZhbGlkX2FkZHI7CisJdTMyIGRiZ19mb3JjZV9mcmFtZV9hZGRyOworCWJvb2wgaGFzX3Jlc2V0X2JpdDsKKwlib29sIHVucmVzZXQ7IC8qIElmIHRydWUsIHRoZSBibG9jayBpcyB0YWtlbiBvdXQgb2YgcmVzZXQgYmVmb3JlIGR1bXAgKi8KKwllbnVtIGRiZ19yZXNldF9yZWdzIHJlc2V0X3JlZzsKKwl1OCByZXNldF9iaXRfb2Zmc2V0OyAvKiBCaXQgb2Zmc2V0IGluIHJlc2V0IHJlZ2lzdGVyICovCit9OworCisvKiBSZXNldCByZWdpc3RlciBkZWZpbml0aW9ucyAqLworc3RydWN0IHJlc2V0X3JlZ19kZWZzIHsKKwl1MzIgYWRkcjsKKwl1MzIgdW5yZXNldF92YWw7CisJYm9vbCBleGlzdHNbTUFYX0NISVBfSURTXTsKK307CisKK3N0cnVjdCBncmNfcGFyYW1fZGVmcyB7CisJdTMyIGRlZmF1bHRfdmFsW01BWF9DSElQX0lEU107CisJdTMyIG1pbjsKKwl1MzIgbWF4OworCWJvb2wgaXNfcHJlc2V0OworCXUzMiBleGNsdWRlX2FsbF9wcmVzZXRfdmFsOworCXUzMiBjcmFzaF9wcmVzZXRfdmFsOworfTsKKworc3RydWN0IHJzc19tZW1fZGVmcyB7CisJY29uc3QgY2hhciAqbWVtX25hbWU7CisJY29uc3QgY2hhciAqdHlwZV9uYW1lOworCXUzMiBhZGRyOyAvKiBJbiAxMjhiIHVuaXRzICovCisJdTMyIG51bV9lbnRyaWVzW01BWF9DSElQX0lEU107CisJdTMyIGVudHJ5X3dpZHRoW01BWF9DSElQX0lEU107IC8qIEluIGJpdHMgKi8KK307CisKK3N0cnVjdCB2ZmNfcmFtX2RlZnMgeworCWNvbnN0IGNoYXIgKm1lbV9uYW1lOworCWNvbnN0IGNoYXIgKnR5cGVfbmFtZTsKKwl1MzIgYmFzZV9yb3c7CisJdTMyIG51bV9yb3dzOworfTsKKworc3RydWN0IGJpZ19yYW1fZGVmcyB7CisJY29uc3QgY2hhciAqaW5zdGFuY2VfbmFtZTsKKwllbnVtIG1lbV9ncm91cHMgbWVtX2dyb3VwX2lkOworCWVudW0gbWVtX2dyb3VwcyByYW1fbWVtX2dyb3VwX2lkOworCWVudW0gZGJnX2dyY19wYXJhbXMgZ3JjX3BhcmFtOworCXUzMiBhZGRyX3JlZ19hZGRyOworCXUzMiBkYXRhX3JlZ19hZGRyOworCXUzMiBudW1fb2ZfYmxvY2tzW01BWF9DSElQX0lEU107Cit9OworCitzdHJ1Y3QgcGh5X2RlZnMgeworCWNvbnN0IGNoYXIgKnBoeV9uYW1lOworCXUzMiBiYXNlX2FkZHI7CisJdTMyIHRidXNfYWRkcl9sb19hZGRyOworCXUzMiB0YnVzX2FkZHJfaGlfYWRkcjsKKwl1MzIgdGJ1c19kYXRhX2xvX2FkZHI7CisJdTMyIHRidXNfZGF0YV9oaV9hZGRyOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1BWF9MQ0lEUwkJCTMyMAorI2RlZmluZSBNQVhfTFRJRFMJCQkzMjAKKyNkZWZpbmUgTlVNX0lPUl9TRVRTCQkJMgorI2RlZmluZSBJT1JTX1BFUl9TRVQJCQkxNzYKKyNkZWZpbmUgSU9SX1NFVF9PRkZTRVQoc2V0X2lkKQkJKChzZXRfaWQpICogMjU2KQorI2RlZmluZSBCWVRFU19JTl9EV09SRAkJCXNpemVvZih1MzIpCisKKy8qIEluIHRoZSBtYWNyb3MgYmVsb3csIHNpemUgYW5kIG9mZnNldCBhcmUgc3BlY2lmaWVkIGluIGJpdHMgKi8KKyNkZWZpbmUgQ0VJTF9EV09SRFMoc2l6ZSkJCURJVl9ST1VORF9VUChzaXplLCAzMikKKyNkZWZpbmUgRklFTERfQklUX09GRlNFVCh0eXBlLCBmaWVsZCkJdHlwZSAjIyBfICMjIGZpZWxkICMjIF8gIyMgT0ZGU0VUCisjZGVmaW5lIEZJRUxEX0JJVF9TSVpFKHR5cGUsIGZpZWxkKQl0eXBlICMjIF8gIyMgZmllbGQgIyMgXyAjIyBTSVpFCisjZGVmaW5lIEZJRUxEX0RXT1JEX09GRlNFVCh0eXBlLCBmaWVsZCkgXAorCSAoaW50KShGSUVMRF9CSVRfT0ZGU0VUKHR5cGUsIGZpZWxkKSAvIDMyKQorI2RlZmluZSBGSUVMRF9EV09SRF9TSElGVCh0eXBlLCBmaWVsZCkJKEZJRUxEX0JJVF9PRkZTRVQodHlwZSwgZmllbGQpICUgMzIpCisjZGVmaW5lIEZJRUxEX0JJVF9NQVNLKHR5cGUsIGZpZWxkKSBcCisJKCgoMSA8PCBGSUVMRF9CSVRfU0laRSh0eXBlLCBmaWVsZCkpIC0gMSkgPDwgXAorCSBGSUVMRF9EV09SRF9TSElGVCh0eXBlLCBmaWVsZCkpCisjZGVmaW5lIFNFVF9WQVJfRklFTEQodmFyLCB0eXBlLCBmaWVsZCwgdmFsKSBcCisJZG8geyBcCisJCXZhcltGSUVMRF9EV09SRF9PRkZTRVQodHlwZSwgZmllbGQpXSAmPQlcCisJCSh+RklFTERfQklUX01BU0sodHlwZSwgZmllbGQpKTsJXAorCQl2YXJbRklFTERfRFdPUkRfT0ZGU0VUKHR5cGUsIGZpZWxkKV0gfD0gXAorCQkodmFsKSA8PCBGSUVMRF9EV09SRF9TSElGVCh0eXBlLCBmaWVsZCk7IFwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBBUlJfUkVHX1dSKGRldiwgcHR0LCBhZGRyLCBhcnIsIGFycl9zaXplKSBcCisJZG8geyBcCisJCWZvciAoaSA9IDA7IGkgPCAoYXJyX3NpemUpOyBpKyspIFwKKwkJCXFlZF93cihkZXYsIHB0dCwgYWRkciwJKGFycilbaV0pOyBcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgQVJSX1JFR19SRChkZXYsIHB0dCwgYWRkciwgYXJyLCBhcnJfc2l6ZSkgXAorCWRvIHsgXAorCQlmb3IgKGkgPSAwOyBpIDwgKGFycl9zaXplKTsgaSsrKSBcCisJCQkoYXJyKVtpXSA9IHFlZF9yZChkZXYsIHB0dCwgYWRkcik7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIERXT1JEU19UT19CWVRFUyhkd29yZHMpCQkoKGR3b3JkcykgKiBCWVRFU19JTl9EV09SRCkKKyNkZWZpbmUgQllURVNfVE9fRFdPUkRTKGJ5dGVzKQkJKChieXRlcykgLyBCWVRFU19JTl9EV09SRCkKKyNkZWZpbmUgUkFNX0xJTkVTX1RPX0RXT1JEUyhsaW5lcykJKChsaW5lcykgKiAyKQorI2RlZmluZSBSQU1fTElORVNfVE9fQllURVMobGluZXMpIFwKKwlEV09SRFNfVE9fQllURVMoUkFNX0xJTkVTX1RPX0RXT1JEUyhsaW5lcykpCisjZGVmaW5lIFJFR19EVU1QX0xFTl9TSElGVAkJMjQKKyNkZWZpbmUgTUVNX0RVTVBfRU5UUllfU0laRV9EV09SRFMgXAorCUJZVEVTX1RPX0RXT1JEUyhzaXplb2Yoc3RydWN0IGRiZ19kdW1wX21lbSkpCisjZGVmaW5lIElETEVfQ0hLX1JVTEVfU0laRV9EV09SRFMgXAorCUJZVEVTX1RPX0RXT1JEUyhzaXplb2Yoc3RydWN0IGRiZ19pZGxlX2Noa19ydWxlKSkKKyNkZWZpbmUgSURMRV9DSEtfUkVTVUxUX0hEUl9EV09SRFMgXAorCUJZVEVTX1RPX0RXT1JEUyhzaXplb2Yoc3RydWN0IGRiZ19pZGxlX2Noa19yZXN1bHRfaGRyKSkKKyNkZWZpbmUgSURMRV9DSEtfUkVTVUxUX1JFR19IRFJfRFdPUkRTIFwKKwlCWVRFU19UT19EV09SRFMoc2l6ZW9mKHN0cnVjdCBkYmdfaWRsZV9jaGtfcmVzdWx0X3JlZ19oZHIpKQorI2RlZmluZSBJRExFX0NIS19NQVhfRU5UUklFU19TSVpFCTMyCisKKy8qIFRoZSBzaXplcyBhbmQgb2Zmc2V0cyBiZWxvdyBhcmUgc3BlY2lmaWVkIGluIGJpdHMgKi8KKyNkZWZpbmUgVkZDX0NBTV9DTURfU1RSVUNUX1NJWkUJCTY0CisjZGVmaW5lIFZGQ19DQU1fQ01EX1JPV19PRkZTRVQJCTQ4CisjZGVmaW5lIFZGQ19DQU1fQ01EX1JPV19TSVpFCQk5CisjZGVmaW5lIFZGQ19DQU1fQUREUl9TVFJVQ1RfU0laRQkxNgorI2RlZmluZSBWRkNfQ0FNX0FERFJfT1BfT0ZGU0VUCQkwCisjZGVmaW5lIFZGQ19DQU1fQUREUl9PUF9TSVpFCQk0CisjZGVmaW5lIFZGQ19DQU1fUkVTUF9TVFJVQ1RfU0laRQkyNTYKKyNkZWZpbmUgVkZDX1JBTV9BRERSX1NUUlVDVF9TSVpFCTE2CisjZGVmaW5lIFZGQ19SQU1fQUREUl9PUF9PRkZTRVQJCTAKKyNkZWZpbmUgVkZDX1JBTV9BRERSX09QX1NJWkUJCTIKKyNkZWZpbmUgVkZDX1JBTV9BRERSX1JPV19PRkZTRVQJCTIKKyNkZWZpbmUgVkZDX1JBTV9BRERSX1JPV19TSVpFCQkxMAorI2RlZmluZSBWRkNfUkFNX1JFU1BfU1RSVUNUX1NJWkUJMjU2CisjZGVmaW5lIFZGQ19DQU1fQ01EX0RXT1JEUwkJQ0VJTF9EV09SRFMoVkZDX0NBTV9DTURfU1RSVUNUX1NJWkUpCisjZGVmaW5lIFZGQ19DQU1fQUREUl9EV09SRFMJCUNFSUxfRFdPUkRTKFZGQ19DQU1fQUREUl9TVFJVQ1RfU0laRSkKKyNkZWZpbmUgVkZDX0NBTV9SRVNQX0RXT1JEUwkJQ0VJTF9EV09SRFMoVkZDX0NBTV9SRVNQX1NUUlVDVF9TSVpFKQorI2RlZmluZSBWRkNfUkFNX0NNRF9EV09SRFMJCVZGQ19DQU1fQ01EX0RXT1JEUworI2RlZmluZSBWRkNfUkFNX0FERFJfRFdPUkRTCQlDRUlMX0RXT1JEUyhWRkNfUkFNX0FERFJfU1RSVUNUX1NJWkUpCisjZGVmaW5lIFZGQ19SQU1fUkVTUF9EV09SRFMJCUNFSUxfRFdPUkRTKFZGQ19SQU1fUkVTUF9TVFJVQ1RfU0laRSkKKyNkZWZpbmUgTlVNX1ZGQ19SQU1fVFlQRVMJCTQKKyNkZWZpbmUgVkZDX0NBTV9OVU1fUk9XUwkJNTEyCisjZGVmaW5lIFZGQ19PUENPREVfQ0FNX1JECQkxNAorI2RlZmluZSBWRkNfT1BDT0RFX1JBTV9SRAkJMAorI2RlZmluZSBOVU1fUlNTX01FTV9UWVBFUwkJNQorI2RlZmluZSBOVU1fQklHX1JBTV9UWVBFUwkJMworI2RlZmluZSBCSUdfUkFNX0JMT0NLX1NJWkVfQllURVMJMTI4CisjZGVmaW5lIEJJR19SQU1fQkxPQ0tfU0laRV9EV09SRFMgXAorCUJZVEVTX1RPX0RXT1JEUyhCSUdfUkFNX0JMT0NLX1NJWkVfQllURVMpCisjZGVmaW5lIE5VTV9QSFlfVEJVU19BRERSRVNTRVMJCTIwNDgKKyNkZWZpbmUgUEhZX0RVTVBfU0laRV9EV09SRFMJCShOVU1fUEhZX1RCVVNfQUREUkVTU0VTIC8gMikKKyNkZWZpbmUgUkVTRVRfUkVHX1VOUkVTRVRfT0ZGU0VUCTQKKyNkZWZpbmUgU1RBTExfREVMQVlfTVMJCQk1MDAKKyNkZWZpbmUgU1RBVElDX0RFQlVHX0xJTkVfRFdPUkRTCTkKKyNkZWZpbmUgTlVNX0RCR19CVVNfTElORVMJCTI1NgorI2RlZmluZSBOVU1fQ09NTU9OX0dMT0JBTF9QQVJBTVMJOAorI2RlZmluZSBGV19JTUdfTUFJTgkJCTEKKyNkZWZpbmUgUkVHX0ZJRk9fREVQVEhfRUxFTUVOVFMJCTMyCisjZGVmaW5lIFJFR19GSUZPX0VMRU1FTlRfRFdPUkRTCQkyCisjZGVmaW5lIFJFR19GSUZPX0RFUFRIX0RXT1JEUyBcCisJKFJFR19GSUZPX0VMRU1FTlRfRFdPUkRTICogUkVHX0ZJRk9fREVQVEhfRUxFTUVOVFMpCisjZGVmaW5lIElHVV9GSUZPX0RFUFRIX0VMRU1FTlRTCQk2NAorI2RlZmluZSBJR1VfRklGT19FTEVNRU5UX0RXT1JEUwkJNAorI2RlZmluZSBJR1VfRklGT19ERVBUSF9EV09SRFMgXAorCShJR1VfRklGT19FTEVNRU5UX0RXT1JEUyAqIElHVV9GSUZPX0RFUFRIX0VMRU1FTlRTKQorI2RlZmluZSBQUk9URUNUSU9OX09WRVJSSURFX0RFUFRIX0VMRU1FTlRTCTIwCisjZGVmaW5lIFBST1RFQ1RJT05fT1ZFUlJJREVfRUxFTUVOVF9EV09SRFMJMgorI2RlZmluZSBQUk9URUNUSU9OX09WRVJSSURFX0RFUFRIX0RXT1JEUyBcCisJKFBST1RFQ1RJT05fT1ZFUlJJREVfREVQVEhfRUxFTUVOVFMgKiBcCisJIFBST1RFQ1RJT05fT1ZFUlJJREVfRUxFTUVOVF9EV09SRFMpCisjZGVmaW5lIE1DUF9TUEFEX1RSQUNFX09GRlNJWkVfQUREUiBcCisJKE1DUF9SRUdfU0NSQVRDSCArIFwKKwkgb2Zmc2V0b2Yoc3RydWN0IHN0YXRpY19pbml0LCBzZWN0aW9uc1tTUEFEX1NFQ1RJT05fVFJBQ0VdKSkKKyNkZWZpbmUgTUNQX1RSQUNFX01FVEFfSU1BR0VfU0lHTkFUVVJFICAweDY2OTk1NWFhCisjZGVmaW5lIEVNUFRZX0ZXX1ZFUlNJT05fU1RSCQkiPz8/Xz8/P18/Pz9fPz8/IgorI2RlZmluZSBFTVBUWV9GV19JTUFHRV9TVFIJCSI/Pz8/Pz8/Pz8/Pz8/Pz8iCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDb25zdGFudCBBcnJheXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGVidWcgYXJyYXlzICovCitzdGF0aWMgc3RydWN0IGRiZ19hcnJheSBzX2RiZ19hcnJheXNbTUFYX0JJTl9EQkdfQlVGRkVSX1RZUEVdID0geyB7MH0gfTsKKworLyogQ2hpcCBjb25zdGFudCBkZWZpbml0aW9ucyBhcnJheSAqLworc3RhdGljIHN0cnVjdCBjaGlwX2RlZnMgc19jaGlwX2RlZnNbTUFYX0NISVBfSURTXSA9IHsKKwl7ICJyZXNlcnZlZCIsIHsgezAsIDB9LCB7MCwgMH0sIHswLCAwfSwgezAsIDB9IH0gfSwKKwl7ICJiYl9iMCIsCisJICB7IHtNQVhfTlVNX1BPUlRTX0JCLCBNQVhfTlVNX1BGU19CQn0sIHswLCAwfSwgezAsIDB9LCB7MCwgMH0gfSB9LAorCXsgImsyIiwgeyB7TUFYX05VTV9QT1JUU19LMiwgTUFYX05VTV9QRlNfSzJ9LCB7MCwgMH0sIHswLCAwfSwgezAsIDB9IH0gfQorfTsKKworLyogU3Rvcm0gY29uc3RhbnQgZGVmaW5pdGlvbnMgYXJyYXkgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3Rvcm1fZGVmcyBzX3N0b3JtX2RlZnNbXSA9IHsKKwkvKiBUc3Rvcm0gKi8KKwl7J1QnLCBCTE9DS19UU0VNLAorCSB7REJHX0JVU19DTElFTlRfUkJDVCwgREJHX0JVU19DTElFTlRfUkJDVCwKKwkgIERCR19CVVNfQ0xJRU5UX1JCQ1R9LCB0cnVlLAorCSBUU0VNX1JFR19GQVNUX01FTU9SWSwKKwkgVFNFTV9SRUdfREJHX0ZSQU1FX01PREUsIFRTRU1fUkVHX1NMT1dfREJHX0FDVElWRSwKKwkgVFNFTV9SRUdfU0xPV19EQkdfTU9ERSwgVFNFTV9SRUdfREJHX01PREUxX0NGRywKKwkgVFNFTV9SRUdfU1lOQ19EQkdfRU1QVFksIFRTRU1fUkVHX1NMT1dfREJHX0VNUFRZLAorCSBUQ01fUkVHX0NUWF9SQkNfQUNDUywKKwkgNCwgVENNX1JFR19BR0dfQ09OX0NUWCwKKwkgMTYsIFRDTV9SRUdfU01fQ09OX0NUWCwKKwkgMiwgVENNX1JFR19BR0dfVEFTS19DVFgsCisJIDQsIFRDTV9SRUdfU01fVEFTS19DVFh9LAorCS8qIE1zdG9ybSAqLworCXsnTScsIEJMT0NLX01TRU0sCisJIHtEQkdfQlVTX0NMSUVOVF9SQkNULCBEQkdfQlVTX0NMSUVOVF9SQkNULAorCSAgREJHX0JVU19DTElFTlRfUkJDTX0sIGZhbHNlLAorCSBNU0VNX1JFR19GQVNUX01FTU9SWSwKKwkgTVNFTV9SRUdfREJHX0ZSQU1FX01PREUsIE1TRU1fUkVHX1NMT1dfREJHX0FDVElWRSwKKwkgTVNFTV9SRUdfU0xPV19EQkdfTU9ERSwgTVNFTV9SRUdfREJHX01PREUxX0NGRywKKwkgTVNFTV9SRUdfU1lOQ19EQkdfRU1QVFksIE1TRU1fUkVHX1NMT1dfREJHX0VNUFRZLAorCSBNQ01fUkVHX0NUWF9SQkNfQUNDUywKKwkgMSwgTUNNX1JFR19BR0dfQ09OX0NUWCwKKwkgMTAsIE1DTV9SRUdfU01fQ09OX0NUWCwKKwkgMiwgTUNNX1JFR19BR0dfVEFTS19DVFgsCisJIDcsIE1DTV9SRUdfU01fVEFTS19DVFh9LAorCS8qIFVzdG9ybSAqLworCXsnVScsIEJMT0NLX1VTRU0sCisJIHtEQkdfQlVTX0NMSUVOVF9SQkNVLCBEQkdfQlVTX0NMSUVOVF9SQkNVLAorCSAgREJHX0JVU19DTElFTlRfUkJDVX0sIGZhbHNlLAorCSBVU0VNX1JFR19GQVNUX01FTU9SWSwKKwkgVVNFTV9SRUdfREJHX0ZSQU1FX01PREUsIFVTRU1fUkVHX1NMT1dfREJHX0FDVElWRSwKKwkgVVNFTV9SRUdfU0xPV19EQkdfTU9ERSwgVVNFTV9SRUdfREJHX01PREUxX0NGRywKKwkgVVNFTV9SRUdfU1lOQ19EQkdfRU1QVFksIFVTRU1fUkVHX1NMT1dfREJHX0VNUFRZLAorCSBVQ01fUkVHX0NUWF9SQkNfQUNDUywKKwkgMiwgVUNNX1JFR19BR0dfQ09OX0NUWCwKKwkgMTMsIFVDTV9SRUdfU01fQ09OX0NUWCwKKwkgMywgVUNNX1JFR19BR0dfVEFTS19DVFgsCisJIDMsIFVDTV9SRUdfU01fVEFTS19DVFh9LAorCS8qIFhzdG9ybSAqLworCXsnWCcsIEJMT0NLX1hTRU0sCisJIHtEQkdfQlVTX0NMSUVOVF9SQkNYLCBEQkdfQlVTX0NMSUVOVF9SQkNYLAorCSAgREJHX0JVU19DTElFTlRfUkJDWH0sIGZhbHNlLAorCSBYU0VNX1JFR19GQVNUX01FTU9SWSwKKwkgWFNFTV9SRUdfREJHX0ZSQU1FX01PREUsIFhTRU1fUkVHX1NMT1dfREJHX0FDVElWRSwKKwkgWFNFTV9SRUdfU0xPV19EQkdfTU9ERSwgWFNFTV9SRUdfREJHX01PREUxX0NGRywKKwkgWFNFTV9SRUdfU1lOQ19EQkdfRU1QVFksIFhTRU1fUkVHX1NMT1dfREJHX0VNUFRZLAorCSBYQ01fUkVHX0NUWF9SQkNfQUNDUywKKwkgOSwgWENNX1JFR19BR0dfQ09OX0NUWCwKKwkgMTUsIFhDTV9SRUdfU01fQ09OX0NUWCwKKwkgMCwgMCwKKwkgMCwgMH0sCisJLyogWXN0b3JtICovCisJeydZJywgQkxPQ0tfWVNFTSwKKwkge0RCR19CVVNfQ0xJRU5UX1JCQ1gsIERCR19CVVNfQ0xJRU5UX1JCQ1gsCisJICBEQkdfQlVTX0NMSUVOVF9SQkNZfSwgZmFsc2UsCisJIFlTRU1fUkVHX0ZBU1RfTUVNT1JZLAorCSBZU0VNX1JFR19EQkdfRlJBTUVfTU9ERSwgWVNFTV9SRUdfU0xPV19EQkdfQUNUSVZFLAorCSBZU0VNX1JFR19TTE9XX0RCR19NT0RFLCBZU0VNX1JFR19EQkdfTU9ERTFfQ0ZHLAorCSBZU0VNX1JFR19TWU5DX0RCR19FTVBUWSwgVFNFTV9SRUdfU0xPV19EQkdfRU1QVFksCisJIFlDTV9SRUdfQ1RYX1JCQ19BQ0NTLAorCSAyLCBZQ01fUkVHX0FHR19DT05fQ1RYLAorCSAzLCBZQ01fUkVHX1NNX0NPTl9DVFgsCisJIDIsIFlDTV9SRUdfQUdHX1RBU0tfQ1RYLAorCSAxMiwgWUNNX1JFR19TTV9UQVNLX0NUWH0sCisJLyogUHN0b3JtICovCisJeydQJywgQkxPQ0tfUFNFTSwKKwkge0RCR19CVVNfQ0xJRU5UX1JCQ1MsIERCR19CVVNfQ0xJRU5UX1JCQ1MsCisJICBEQkdfQlVTX0NMSUVOVF9SQkNTfSwgdHJ1ZSwKKwkgUFNFTV9SRUdfRkFTVF9NRU1PUlksCisJIFBTRU1fUkVHX0RCR19GUkFNRV9NT0RFLCBQU0VNX1JFR19TTE9XX0RCR19BQ1RJVkUsCisJIFBTRU1fUkVHX1NMT1dfREJHX01PREUsIFBTRU1fUkVHX0RCR19NT0RFMV9DRkcsCisJIFBTRU1fUkVHX1NZTkNfREJHX0VNUFRZLCBQU0VNX1JFR19TTE9XX0RCR19FTVBUWSwKKwkgUENNX1JFR19DVFhfUkJDX0FDQ1MsCisJIDAsIDAsCisJIDEwLCBQQ01fUkVHX1NNX0NPTl9DVFgsCisJIDAsIDAsCisJIDAsIDB9Cit9OworCisvKiBCbG9jayBkZWZpbml0aW9ucyBhcnJheSAqLworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX2dyY19kZWZzID0geworCSJncmMiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNOLCBEQkdfQlVTX0NMSUVOVF9SQkNOLCBEQkdfQlVTX0NMSUVOVF9SQkNOfSwKKwlHUkNfUkVHX0RCR19TRUxFQ1QsIEdSQ19SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlHUkNfUkVHX0RCR19TSElGVCwgR1JDX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJR1JDX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgZmFsc2UsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9VQSwgMQorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX21pc2NzX2RlZnMgPSB7CisJIm1pc2NzIiwge2ZhbHNlLCBmYWxzZSwgZmFsc2V9LCBmYWxzZSwgMCwKKwl7TUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UU30sCisJMCwgMCwgMCwgMCwgMCwKKwlmYWxzZSwgZmFsc2UsIE1BWF9EQkdfUkVTRVRfUkVHUywgMAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX21pc2NfZGVmcyA9IHsKKwkibWlzYyIsIHtmYWxzZSwgZmFsc2UsIGZhbHNlfSwgZmFsc2UsIDAsCisJe01BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFN9LAorCTAsIDAsIDAsIDAsIDAsCisJZmFsc2UsIGZhbHNlLCBNQVhfREJHX1JFU0VUX1JFR1MsIDAKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19kYnVfZGVmcyA9IHsKKwkiZGJ1Iiwge2ZhbHNlLCBmYWxzZSwgZmFsc2V9LCBmYWxzZSwgMCwKKwl7TUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UU30sCisJMCwgMCwgMCwgMCwgMCwKKwlmYWxzZSwgZmFsc2UsIE1BWF9EQkdfUkVTRVRfUkVHUywgMAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3BnbHVlX2JfZGVmcyA9IHsKKwkicGdsdWVfYiIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ0gsIERCR19CVVNfQ0xJRU5UX1JCQ0gsIERCR19CVVNfQ0xJRU5UX1JCQ0h9LAorCVBHTFVFX0JfUkVHX0RCR19TRUxFQ1QsIFBHTFVFX0JfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJUEdMVUVfQl9SRUdfREJHX1NISUZULCBQR0xVRV9CX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJUEdMVUVfQl9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIGZhbHNlLCBEQkdfUkVTRVRfUkVHX01JU0NTX1BMX0hWLCAxCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfY25pZ19kZWZzID0geworCSJjbmlnIiwge2ZhbHNlLCBmYWxzZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTLCBEQkdfQlVTX0NMSUVOVF9SQkNXfSwKKwlDTklHX1JFR19EQkdfU0VMRUNUX0syLCBDTklHX1JFR19EQkdfRFdPUkRfRU5BQkxFX0syLAorCUNOSUdfUkVHX0RCR19TSElGVF9LMiwgQ05JR19SRUdfREJHX0ZPUkNFX1ZBTElEX0syLAorCUNOSUdfUkVHX0RCR19GT1JDRV9GUkFNRV9LMiwKKwl0cnVlLCBmYWxzZSwgREJHX1JFU0VUX1JFR19NSVNDU19QTF9IViwgMAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX2NwbXVfZGVmcyA9IHsKKwkiY3BtdSIsIHtmYWxzZSwgZmFsc2UsIGZhbHNlfSwgZmFsc2UsIDAsCisJe01BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFN9LAorCTAsIDAsIDAsIDAsIDAsCisJdHJ1ZSwgZmFsc2UsIERCR19SRVNFVF9SRUdfTUlTQ1NfUExfSFYsIDgKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19uY3NpX2RlZnMgPSB7CisJIm5jc2kiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNaLCBEQkdfQlVTX0NMSUVOVF9SQkNaLCBEQkdfQlVTX0NMSUVOVF9SQkNafSwKKwlOQ1NJX1JFR19EQkdfU0VMRUNULCBOQ1NJX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCU5DU0lfUkVHX0RCR19TSElGVCwgTkNTSV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCU5DU0lfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCBmYWxzZSwgREJHX1JFU0VUX1JFR19NSVNDU19QTF9IViwgNQorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX29wdGVfZGVmcyA9IHsKKwkib3B0ZSIsIHtmYWxzZSwgZmFsc2UsIGZhbHNlfSwgZmFsc2UsIDAsCisJe01BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFN9LAorCTAsIDAsIDAsIDAsIDAsCisJdHJ1ZSwgZmFsc2UsIERCR19SRVNFVF9SRUdfTUlTQ1NfUExfSFYsIDQKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19ibWJfZGVmcyA9IHsKKwkiYm1iIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDWiwgREJHX0JVU19DTElFTlRfUkJDWiwgREJHX0JVU19DTElFTlRfUkJDQn0sCisJQk1CX1JFR19EQkdfU0VMRUNULCBCTUJfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJQk1CX1JFR19EQkdfU0hJRlQsIEJNQl9SRUdfREJHX0ZPUkNFX1ZBTElELAorCUJNQl9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIGZhbHNlLCBEQkdfUkVTRVRfUkVHX01JU0NTX1BMX1VBLCA3Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfcGNpZV9kZWZzID0geworCSJwY2llIiwge2ZhbHNlLCBmYWxzZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTLCBEQkdfQlVTX0NMSUVOVF9SQkNIfSwKKwlQQ0lFX1JFR19EQkdfQ09NTU9OX1NFTEVDVCwgUENJRV9SRUdfREJHX0NPTU1PTl9EV09SRF9FTkFCTEUsCisJUENJRV9SRUdfREJHX0NPTU1PTl9TSElGVCwgUENJRV9SRUdfREJHX0NPTU1PTl9GT1JDRV9WQUxJRCwKKwlQQ0lFX1JFR19EQkdfQ09NTU9OX0ZPUkNFX0ZSQU1FLAorCWZhbHNlLCBmYWxzZSwgTUFYX0RCR19SRVNFVF9SRUdTLCAwCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfbWNwX2RlZnMgPSB7CisJIm1jcCIsIHtmYWxzZSwgZmFsc2UsIGZhbHNlfSwgZmFsc2UsIDAsCisJe01BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFN9LAorCTAsIDAsIDAsIDAsIDAsCisJZmFsc2UsIGZhbHNlLCBNQVhfREJHX1JFU0VUX1JFR1MsIDAKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19tY3AyX2RlZnMgPSB7CisJIm1jcDIiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNaLCBEQkdfQlVTX0NMSUVOVF9SQkNaLCBEQkdfQlVTX0NMSUVOVF9SQkNafSwKKwlNQ1AyX1JFR19EQkdfU0VMRUNULCBNQ1AyX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCU1DUDJfUkVHX0RCR19TSElGVCwgTUNQMl9SRUdfREJHX0ZPUkNFX1ZBTElELAorCU1DUDJfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwlmYWxzZSwgZmFsc2UsIE1BWF9EQkdfUkVTRVRfUkVHUywgMAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3Bzd2hzdF9kZWZzID0geworCSJwc3doc3QiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNQLCBEQkdfQlVTX0NMSUVOVF9SQkNQLCBEQkdfQlVTX0NMSUVOVF9SQkNQfSwKKwlQU1dIU1RfUkVHX0RCR19TRUxFQ1QsIFBTV0hTVF9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlQU1dIU1RfUkVHX0RCR19TSElGVCwgUFNXSFNUX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJUFNXSFNUX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgZmFsc2UsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9IViwgMAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3Bzd2hzdDJfZGVmcyA9IHsKKwkicHN3aHN0MiIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1AsIERCR19CVVNfQ0xJRU5UX1JCQ1AsIERCR19CVVNfQ0xJRU5UX1JCQ1B9LAorCVBTV0hTVDJfUkVHX0RCR19TRUxFQ1QsIFBTV0hTVDJfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJUFNXSFNUMl9SRUdfREJHX1NISUZULCBQU1dIU1QyX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJUFNXSFNUMl9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIGZhbHNlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfSFYsIDAKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19wc3dyZF9kZWZzID0geworCSJwc3dyZCIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1AsIERCR19CVVNfQ0xJRU5UX1JCQ1AsIERCR19CVVNfQ0xJRU5UX1JCQ1B9LAorCVBTV1JEX1JFR19EQkdfU0VMRUNULCBQU1dSRF9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlQU1dSRF9SRUdfREJHX1NISUZULCBQU1dSRF9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVBTV1JEX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgZmFsc2UsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9IViwgMgorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3Bzd3JkMl9kZWZzID0geworCSJwc3dyZDIiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNQLCBEQkdfQlVTX0NMSUVOVF9SQkNQLCBEQkdfQlVTX0NMSUVOVF9SQkNQfSwKKwlQU1dSRDJfUkVHX0RCR19TRUxFQ1QsIFBTV1JEMl9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlQU1dSRDJfUkVHX0RCR19TSElGVCwgUFNXUkQyX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJUFNXUkQyX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgZmFsc2UsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9IViwgMgorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3Bzd3dyX2RlZnMgPSB7CisJInBzd3dyIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDUCwgREJHX0JVU19DTElFTlRfUkJDUCwgREJHX0JVU19DTElFTlRfUkJDUH0sCisJUFNXV1JfUkVHX0RCR19TRUxFQ1QsIFBTV1dSX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVBTV1dSX1JFR19EQkdfU0hJRlQsIFBTV1dSX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJUFNXV1JfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCBmYWxzZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX0hWLCAzCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfcHN3d3IyX2RlZnMgPSB7CisJInBzd3dyMiIsIHtmYWxzZSwgZmFsc2UsIGZhbHNlfSwgZmFsc2UsIDAsCisJe01BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFN9LAorCTAsIDAsIDAsIDAsIDAsCisJdHJ1ZSwgZmFsc2UsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9IViwgMworfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3Bzd3JxX2RlZnMgPSB7CisJInBzd3JxIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDUCwgREJHX0JVU19DTElFTlRfUkJDUCwgREJHX0JVU19DTElFTlRfUkJDUH0sCisJUFNXUlFfUkVHX0RCR19TRUxFQ1QsIFBTV1JRX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVBTV1JRX1JFR19EQkdfU0hJRlQsIFBTV1JRX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJUFNXUlFfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCBmYWxzZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX0hWLCAxCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfcHN3cnEyX2RlZnMgPSB7CisJInBzd3JxMiIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1AsIERCR19CVVNfQ0xJRU5UX1JCQ1AsIERCR19CVVNfQ0xJRU5UX1JCQ1B9LAorCVBTV1JRMl9SRUdfREJHX1NFTEVDVCwgUFNXUlEyX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVBTV1JRMl9SRUdfREJHX1NISUZULCBQU1dSUTJfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlQU1dSUTJfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCBmYWxzZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX0hWLCAxCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfcGdsY3NfZGVmcyA9IHsKKwkicGdsY3MiLCB7ZmFsc2UsIGZhbHNlLCB0cnVlfSwgZmFsc2UsIDAsCisJe01BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFMsIERCR19CVVNfQ0xJRU5UX1JCQ0h9LAorCVBHTENTX1JFR19EQkdfU0VMRUNULCBQR0xDU19SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlQR0xDU19SRUdfREJHX1NISUZULCBQR0xDU19SRUdfREJHX0ZPUkNFX1ZBTElELAorCVBHTENTX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgZmFsc2UsIERCR19SRVNFVF9SRUdfTUlTQ1NfUExfSFYsIDIKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19wdHVfZGVmcyA9IHsKKwkicHR1Iiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDUCwgREJHX0JVU19DTElFTlRfUkJDUCwgREJHX0JVU19DTElFTlRfUkJDUH0sCisJUFRVX1JFR19EQkdfU0VMRUNULCBQVFVfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJUFRVX1JFR19EQkdfU0hJRlQsIFBUVV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVBUVV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMiwgMjAKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19kbWFlX2RlZnMgPSB7CisJImRtYWUiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNQLCBEQkdfQlVTX0NMSUVOVF9SQkNQLCBEQkdfQlVTX0NMSUVOVF9SQkNQfSwKKwlETUFFX1JFR19EQkdfU0VMRUNULCBETUFFX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCURNQUVfUkVHX0RCR19TSElGVCwgRE1BRV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCURNQUVfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzEsIDI4Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfdGNtX2RlZnMgPSB7CisJInRjbSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgdHJ1ZSwgREJHX1RTVE9STV9JRCwKKwl7REJHX0JVU19DTElFTlRfUkJDVCwgREJHX0JVU19DTElFTlRfUkJDVCwgREJHX0JVU19DTElFTlRfUkJDVH0sCisJVENNX1JFR19EQkdfU0VMRUNULCBUQ01fUkVHX0RCR19EV09SRF9FTkFCTEUsCisJVENNX1JFR19EQkdfU0hJRlQsIFRDTV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVRDTV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMSwgNQorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX21jbV9kZWZzID0geworCSJtY20iLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIHRydWUsIERCR19NU1RPUk1fSUQsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1QsIERCR19CVVNfQ0xJRU5UX1JCQ1QsIERCR19CVVNfQ0xJRU5UX1JCQ019LAorCU1DTV9SRUdfREJHX1NFTEVDVCwgTUNNX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCU1DTV9SRUdfREJHX1NISUZULCBNQ01fUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlNQ01fUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzIsIDMKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja191Y21fZGVmcyA9IHsKKwkidWNtIiwge3RydWUsIHRydWUsIHRydWV9LCB0cnVlLCBEQkdfVVNUT1JNX0lELAorCXtEQkdfQlVTX0NMSUVOVF9SQkNVLCBEQkdfQlVTX0NMSUVOVF9SQkNVLCBEQkdfQlVTX0NMSUVOVF9SQkNVfSwKKwlVQ01fUkVHX0RCR19TRUxFQ1QsIFVDTV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlVQ01fUkVHX0RCR19TSElGVCwgVUNNX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJVUNNX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8xLCA4Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfeGNtX2RlZnMgPSB7CisJInhjbSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgdHJ1ZSwgREJHX1hTVE9STV9JRCwKKwl7REJHX0JVU19DTElFTlRfUkJDWCwgREJHX0JVU19DTElFTlRfUkJDWCwgREJHX0JVU19DTElFTlRfUkJDWH0sCisJWENNX1JFR19EQkdfU0VMRUNULCBYQ01fUkVHX0RCR19EV09SRF9FTkFCTEUsCisJWENNX1JFR19EQkdfU0hJRlQsIFhDTV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVhDTV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMSwgMTkKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja195Y21fZGVmcyA9IHsKKwkieWNtIiwge3RydWUsIHRydWUsIHRydWV9LCB0cnVlLCBEQkdfWVNUT1JNX0lELAorCXtEQkdfQlVTX0NMSUVOVF9SQkNYLCBEQkdfQlVTX0NMSUVOVF9SQkNYLCBEQkdfQlVTX0NMSUVOVF9SQkNZfSwKKwlZQ01fUkVHX0RCR19TRUxFQ1QsIFlDTV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlZQ01fUkVHX0RCR19TSElGVCwgWUNNX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJWUNNX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8yLCA1Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfcGNtX2RlZnMgPSB7CisJInBjbSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgdHJ1ZSwgREJHX1BTVE9STV9JRCwKKwl7REJHX0JVU19DTElFTlRfUkJDUywgREJHX0JVU19DTElFTlRfUkJDUywgREJHX0JVU19DTElFTlRfUkJDU30sCisJUENNX1JFR19EQkdfU0VMRUNULCBQQ01fUkVHX0RCR19EV09SRF9FTkFCTEUsCisJUENNX1JFR19EQkdfU0hJRlQsIFBDTV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVBDTV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMiwgNAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3FtX2RlZnMgPSB7CisJInFtIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDUCwgREJHX0JVU19DTElFTlRfUkJDUCwgREJHX0JVU19DTElFTlRfUkJDUX0sCisJUU1fUkVHX0RCR19TRUxFQ1QsIFFNX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVFNX1JFR19EQkdfU0hJRlQsIFFNX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJUU1fUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzEsIDE2Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfdG1fZGVmcyA9IHsKKwkidG0iLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNTLCBEQkdfQlVTX0NMSUVOVF9SQkNTLCBEQkdfQlVTX0NMSUVOVF9SQkNTfSwKKwlUTV9SRUdfREJHX1NFTEVDVCwgVE1fUkVHX0RCR19EV09SRF9FTkFCTEUsCisJVE1fUkVHX0RCR19TSElGVCwgVE1fUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlUTV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMSwgMTcKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19kb3JxX2RlZnMgPSB7CisJImRvcnEiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNYLCBEQkdfQlVTX0NMSUVOVF9SQkNYLCBEQkdfQlVTX0NMSUVOVF9SQkNZfSwKKwlET1JRX1JFR19EQkdfU0VMRUNULCBET1JRX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCURPUlFfUkVHX0RCR19TSElGVCwgRE9SUV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCURPUlFfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzEsIDE4Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfYnJiX2RlZnMgPSB7CisJImJyYiIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1IsIERCR19CVVNfQ0xJRU5UX1JCQ1IsIERCR19CVVNfQ0xJRU5UX1JCQ1J9LAorCUJSQl9SRUdfREJHX1NFTEVDVCwgQlJCX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCUJSQl9SRUdfREJHX1NISUZULCBCUkJfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlCUkJfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzEsIDAKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19zcmNfZGVmcyA9IHsKKwkic3JjIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDRiwgREJHX0JVU19DTElFTlRfUkJDRiwgREJHX0JVU19DTElFTlRfUkJDRn0sCisJU1JDX1JFR19EQkdfU0VMRUNULCBTUkNfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJU1JDX1JFR19EQkdfU0hJRlQsIFNSQ19SRUdfREJHX0ZPUkNFX1ZBTElELAorCVNSQ19SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMSwgMgorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3Byc19kZWZzID0geworCSJwcnMiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNSLCBEQkdfQlVTX0NMSUVOVF9SQkNSLCBEQkdfQlVTX0NMSUVOVF9SQkNSfSwKKwlQUlNfUkVHX0RCR19TRUxFQ1QsIFBSU19SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlQUlNfUkVHX0RCR19TSElGVCwgUFJTX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJUFJTX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8xLCAxCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfdHNkbV9kZWZzID0geworCSJ0c2RtIiwge3RydWUsIHRydWUsIHRydWV9LCB0cnVlLCBEQkdfVFNUT1JNX0lELAorCXtEQkdfQlVTX0NMSUVOVF9SQkNULCBEQkdfQlVTX0NMSUVOVF9SQkNULCBEQkdfQlVTX0NMSUVOVF9SQkNUfSwKKwlUU0RNX1JFR19EQkdfU0VMRUNULCBUU0RNX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVRTRE1fUkVHX0RCR19TSElGVCwgVFNETV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVRTRE1fUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzEsIDMKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19tc2RtX2RlZnMgPSB7CisJIm1zZG0iLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIHRydWUsIERCR19NU1RPUk1fSUQsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1QsIERCR19CVVNfQ0xJRU5UX1JCQ1QsIERCR19CVVNfQ0xJRU5UX1JCQ019LAorCU1TRE1fUkVHX0RCR19TRUxFQ1QsIE1TRE1fUkVHX0RCR19EV09SRF9FTkFCTEUsCisJTVNETV9SRUdfREJHX1NISUZULCBNU0RNX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJTVNETV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMiwgNgorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3VzZG1fZGVmcyA9IHsKKwkidXNkbSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgdHJ1ZSwgREJHX1VTVE9STV9JRCwKKwl7REJHX0JVU19DTElFTlRfUkJDVSwgREJHX0JVU19DTElFTlRfUkJDVSwgREJHX0JVU19DTElFTlRfUkJDVX0sCisJVVNETV9SRUdfREJHX1NFTEVDVCwgVVNETV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlVU0RNX1JFR19EQkdfU0hJRlQsIFVTRE1fUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlVU0RNX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8xLCA3Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfeHNkbV9kZWZzID0geworCSJ4c2RtIiwge3RydWUsIHRydWUsIHRydWV9LCB0cnVlLCBEQkdfWFNUT1JNX0lELAorCXtEQkdfQlVTX0NMSUVOVF9SQkNYLCBEQkdfQlVTX0NMSUVOVF9SQkNYLCBEQkdfQlVTX0NMSUVOVF9SQkNYfSwKKwlYU0RNX1JFR19EQkdfU0VMRUNULCBYU0RNX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVhTRE1fUkVHX0RCR19TSElGVCwgWFNETV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVhTRE1fUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzEsIDIwCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfeXNkbV9kZWZzID0geworCSJ5c2RtIiwge3RydWUsIHRydWUsIHRydWV9LCB0cnVlLCBEQkdfWVNUT1JNX0lELAorCXtEQkdfQlVTX0NMSUVOVF9SQkNYLCBEQkdfQlVTX0NMSUVOVF9SQkNYLCBEQkdfQlVTX0NMSUVOVF9SQkNZfSwKKwlZU0RNX1JFR19EQkdfU0VMRUNULCBZU0RNX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVlTRE1fUkVHX0RCR19TSElGVCwgWVNETV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVlTRE1fUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzIsIDgKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19wc2RtX2RlZnMgPSB7CisJInBzZG0iLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIHRydWUsIERCR19QU1RPUk1fSUQsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1MsIERCR19CVVNfQ0xJRU5UX1JCQ1MsIERCR19CVVNfQ0xJRU5UX1JCQ1N9LAorCVBTRE1fUkVHX0RCR19TRUxFQ1QsIFBTRE1fUkVHX0RCR19EV09SRF9FTkFCTEUsCisJUFNETV9SRUdfREJHX1NISUZULCBQU0RNX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJUFNETV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMiwgNworfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3RzZW1fZGVmcyA9IHsKKwkidHNlbSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgdHJ1ZSwgREJHX1RTVE9STV9JRCwKKwl7REJHX0JVU19DTElFTlRfUkJDVCwgREJHX0JVU19DTElFTlRfUkJDVCwgREJHX0JVU19DTElFTlRfUkJDVH0sCisJVFNFTV9SRUdfREJHX1NFTEVDVCwgVFNFTV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlUU0VNX1JFR19EQkdfU0hJRlQsIFRTRU1fUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlUU0VNX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8xLCA0Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfbXNlbV9kZWZzID0geworCSJtc2VtIiwge3RydWUsIHRydWUsIHRydWV9LCB0cnVlLCBEQkdfTVNUT1JNX0lELAorCXtEQkdfQlVTX0NMSUVOVF9SQkNULCBEQkdfQlVTX0NMSUVOVF9SQkNULCBEQkdfQlVTX0NMSUVOVF9SQkNNfSwKKwlNU0VNX1JFR19EQkdfU0VMRUNULCBNU0VNX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCU1TRU1fUkVHX0RCR19TSElGVCwgTVNFTV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCU1TRU1fUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzIsIDkKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja191c2VtX2RlZnMgPSB7CisJInVzZW0iLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIHRydWUsIERCR19VU1RPUk1fSUQsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1UsIERCR19CVVNfQ0xJRU5UX1JCQ1UsIERCR19CVVNfQ0xJRU5UX1JCQ1V9LAorCVVTRU1fUkVHX0RCR19TRUxFQ1QsIFVTRU1fUkVHX0RCR19EV09SRF9FTkFCTEUsCisJVVNFTV9SRUdfREJHX1NISUZULCBVU0VNX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJVVNFTV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMSwgOQorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3hzZW1fZGVmcyA9IHsKKwkieHNlbSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgdHJ1ZSwgREJHX1hTVE9STV9JRCwKKwl7REJHX0JVU19DTElFTlRfUkJDWCwgREJHX0JVU19DTElFTlRfUkJDWCwgREJHX0JVU19DTElFTlRfUkJDWH0sCisJWFNFTV9SRUdfREJHX1NFTEVDVCwgWFNFTV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlYU0VNX1JFR19EQkdfU0hJRlQsIFhTRU1fUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlYU0VNX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8xLCAyMQorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3lzZW1fZGVmcyA9IHsKKwkieXNlbSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgdHJ1ZSwgREJHX1lTVE9STV9JRCwKKwl7REJHX0JVU19DTElFTlRfUkJDWCwgREJHX0JVU19DTElFTlRfUkJDWCwgREJHX0JVU19DTElFTlRfUkJDWX0sCisJWVNFTV9SRUdfREJHX1NFTEVDVCwgWVNFTV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlZU0VNX1JFR19EQkdfU0hJRlQsIFlTRU1fUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlZU0VNX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8yLCAxMQorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3BzZW1fZGVmcyA9IHsKKwkicHNlbSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgdHJ1ZSwgREJHX1BTVE9STV9JRCwKKwl7REJHX0JVU19DTElFTlRfUkJDUywgREJHX0JVU19DTElFTlRfUkJDUywgREJHX0JVU19DTElFTlRfUkJDU30sCisJUFNFTV9SRUdfREJHX1NFTEVDVCwgUFNFTV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlQU0VNX1JFR19EQkdfU0hJRlQsIFBTRU1fUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlQU0VNX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8yLCAxMAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3Jzc19kZWZzID0geworCSJyc3MiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNULCBEQkdfQlVTX0NMSUVOVF9SQkNULCBEQkdfQlVTX0NMSUVOVF9SQkNUfSwKKwlSU1NfUkVHX0RCR19TRUxFQ1QsIFJTU19SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlSU1NfUkVHX0RCR19TSElGVCwgUlNTX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJUlNTX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8yLCAxOAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3RtbGRfZGVmcyA9IHsKKwkidG1sZCIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1QsIERCR19CVVNfQ0xJRU5UX1JCQ1QsIERCR19CVVNfQ0xJRU5UX1JCQ019LAorCVRNTERfUkVHX0RCR19TRUxFQ1QsIFRNTERfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJVE1MRF9SRUdfREJHX1NISUZULCBUTUxEX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJVE1MRF9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMiwgMTMKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19tdWxkX2RlZnMgPSB7CisJIm11bGQiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNVLCBEQkdfQlVTX0NMSUVOVF9SQkNVLCBEQkdfQlVTX0NMSUVOVF9SQkNVfSwKKwlNVUxEX1JFR19EQkdfU0VMRUNULCBNVUxEX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCU1VTERfUkVHX0RCR19TSElGVCwgTVVMRF9SRUdfREJHX0ZPUkNFX1ZBTElELAorCU1VTERfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzIsIDE0Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfeXVsZF9kZWZzID0geworCSJ5dWxkIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDVSwgREJHX0JVU19DTElFTlRfUkJDVSwgREJHX0JVU19DTElFTlRfUkJDVX0sCisJWVVMRF9SRUdfREJHX1NFTEVDVCwgWVVMRF9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlZVUxEX1JFR19EQkdfU0hJRlQsIFlVTERfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlZVUxEX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8yLCAxNQorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3h5bGRfZGVmcyA9IHsKKwkieHlsZCIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1gsIERCR19CVVNfQ0xJRU5UX1JCQ1gsIERCR19CVVNfQ0xJRU5UX1JCQ1h9LAorCVhZTERfUkVHX0RCR19TRUxFQ1QsIFhZTERfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJWFlMRF9SRUdfREJHX1NISUZULCBYWUxEX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJWFlMRF9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMiwgMTIKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19wcm1fZGVmcyA9IHsKKwkicHJtIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDVCwgREJHX0JVU19DTElFTlRfUkJDVCwgREJHX0JVU19DTElFTlRfUkJDTX0sCisJUFJNX1JFR19EQkdfU0VMRUNULCBQUk1fUkVHX0RCR19EV09SRF9FTkFCTEUsCisJUFJNX1JFR19EQkdfU0hJRlQsIFBSTV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVBSTV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMiwgMjEKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19wYmZfcGIxX2RlZnMgPSB7CisJInBiZl9wYjEiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNTLCBEQkdfQlVTX0NMSUVOVF9SQkNTLCBEQkdfQlVTX0NMSUVOVF9SQkNWfSwKKwlQQkZfUEIxX1JFR19EQkdfU0VMRUNULCBQQkZfUEIxX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVBCRl9QQjFfUkVHX0RCR19TSElGVCwgUEJGX1BCMV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVBCRl9QQjFfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzEsCisJMTEKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19wYmZfcGIyX2RlZnMgPSB7CisJInBiZl9wYjIiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNTLCBEQkdfQlVTX0NMSUVOVF9SQkNTLCBEQkdfQlVTX0NMSUVOVF9SQkNWfSwKKwlQQkZfUEIyX1JFR19EQkdfU0VMRUNULCBQQkZfUEIyX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVBCRl9QQjJfUkVHX0RCR19TSElGVCwgUEJGX1BCMl9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVBCRl9QQjJfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzEsCisJMTIKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19ycGJfZGVmcyA9IHsKKwkicnBiIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDVCwgREJHX0JVU19DTElFTlRfUkJDVCwgREJHX0JVU19DTElFTlRfUkJDTX0sCisJUlBCX1JFR19EQkdfU0VMRUNULCBSUEJfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJUlBCX1JFR19EQkdfU0hJRlQsIFJQQl9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVJQQl9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMSwgMTMKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19idGJfZGVmcyA9IHsKKwkiYnRiIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDUiwgREJHX0JVU19DTElFTlRfUkJDUiwgREJHX0JVU19DTElFTlRfUkJDVn0sCisJQlRCX1JFR19EQkdfU0VMRUNULCBCVEJfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJQlRCX1JFR19EQkdfU0hJRlQsIEJUQl9SRUdfREJHX0ZPUkNFX1ZBTElELAorCUJUQl9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMSwgMTAKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19wYmZfZGVmcyA9IHsKKwkicGJmIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDUywgREJHX0JVU19DTElFTlRfUkJDUywgREJHX0JVU19DTElFTlRfUkJDVn0sCisJUEJGX1JFR19EQkdfU0VMRUNULCBQQkZfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJUEJGX1JFR19EQkdfU0hJRlQsIFBCRl9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVBCRl9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMSwgMTUKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19yZGlmX2RlZnMgPSB7CisJInJkaWYiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNULCBEQkdfQlVTX0NMSUVOVF9SQkNULCBEQkdfQlVTX0NMSUVOVF9SQkNNfSwKKwlSRElGX1JFR19EQkdfU0VMRUNULCBSRElGX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVJESUZfUkVHX0RCR19TSElGVCwgUkRJRl9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVJESUZfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzIsIDE2Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfdGRpZl9kZWZzID0geworCSJ0ZGlmIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDUywgREJHX0JVU19DTElFTlRfUkJDUywgREJHX0JVU19DTElFTlRfUkJDU30sCisJVERJRl9SRUdfREJHX1NFTEVDVCwgVERJRl9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlURElGX1JFR19EQkdfU0hJRlQsIFRESUZfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlURElGX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8yLCAxNworfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX2NkdV9kZWZzID0geworCSJjZHUiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNGLCBEQkdfQlVTX0NMSUVOVF9SQkNGLCBEQkdfQlVTX0NMSUVOVF9SQkNGfSwKKwlDRFVfUkVHX0RCR19TRUxFQ1QsIENEVV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlDRFVfUkVHX0RCR19TSElGVCwgQ0RVX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJQ0RVX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8xLCAyMworfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX2NjZmNfZGVmcyA9IHsKKwkiY2NmYyIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ0YsIERCR19CVVNfQ0xJRU5UX1JCQ0YsIERCR19CVVNfQ0xJRU5UX1JCQ0Z9LAorCUNDRkNfUkVHX0RCR19TRUxFQ1QsIENDRkNfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJQ0NGQ19SRUdfREJHX1NISUZULCBDQ0ZDX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJQ0NGQ19SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMSwgMjQKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja190Y2ZjX2RlZnMgPSB7CisJInRjZmMiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNGLCBEQkdfQlVTX0NMSUVOVF9SQkNGLCBEQkdfQlVTX0NMSUVOVF9SQkNGfSwKKwlUQ0ZDX1JFR19EQkdfU0VMRUNULCBUQ0ZDX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVRDRkNfUkVHX0RCR19TSElGVCwgVENGQ19SRUdfREJHX0ZPUkNFX1ZBTElELAorCVRDRkNfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzEsIDI1Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfaWd1X2RlZnMgPSB7CisJImlndSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1AsIERCR19CVVNfQ0xJRU5UX1JCQ1AsIERCR19CVVNfQ0xJRU5UX1JCQ1B9LAorCUlHVV9SRUdfREJHX1NFTEVDVCwgSUdVX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCUlHVV9SRUdfREJHX1NISUZULCBJR1VfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlJR1VfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzEsIDI3Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfY2F1X2RlZnMgPSB7CisJImNhdSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1AsIERCR19CVVNfQ0xJRU5UX1JCQ1AsIERCR19CVVNfQ0xJRU5UX1JCQ1B9LAorCUNBVV9SRUdfREJHX1NFTEVDVCwgQ0FVX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCUNBVV9SRUdfREJHX1NISUZULCBDQVVfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlDQVVfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzIsIDE5Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfdW1hY19kZWZzID0geworCSJ1bWFjIiwge2ZhbHNlLCBmYWxzZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTLCBEQkdfQlVTX0NMSUVOVF9SQkNafSwKKwlVTUFDX1JFR19EQkdfU0VMRUNULCBVTUFDX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVVNQUNfUkVHX0RCR19TSElGVCwgVU1BQ19SRUdfREJHX0ZPUkNFX1ZBTElELAorCVVNQUNfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCBmYWxzZSwgREJHX1JFU0VUX1JFR19NSVNDU19QTF9IViwgNgorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3htYWNfZGVmcyA9IHsKKwkieG1hYyIsIHtmYWxzZSwgZmFsc2UsIGZhbHNlfSwgZmFsc2UsIDAsCisJe01BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFN9LAorCTAsIDAsIDAsIDAsIDAsCisJZmFsc2UsIGZhbHNlLCBNQVhfREJHX1JFU0VUX1JFR1MsIDAKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19kYmdfZGVmcyA9IHsKKwkiZGJnIiwge2ZhbHNlLCBmYWxzZSwgZmFsc2V9LCBmYWxzZSwgMCwKKwl7TUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UU30sCisJMCwgMCwgMCwgMCwgMCwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZBVVgsIDMKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19uaWdfZGVmcyA9IHsKKwkibmlnIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDTiwgREJHX0JVU19DTElFTlRfUkJDTiwgREJHX0JVU19DTElFTlRfUkJDTn0sCisJTklHX1JFR19EQkdfU0VMRUNULCBOSUdfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJTklHX1JFR19EQkdfU0hJRlQsIE5JR19SRUdfREJHX0ZPUkNFX1ZBTElELAorCU5JR19SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVkFVWCwgMAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3dvbF9kZWZzID0geworCSJ3b2wiLCB7ZmFsc2UsIGZhbHNlLCB0cnVlfSwgZmFsc2UsIDAsCisJe01BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFMsIERCR19CVVNfQ0xJRU5UX1JCQ1p9LAorCVdPTF9SRUdfREJHX1NFTEVDVCwgV09MX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVdPTF9SRUdfREJHX1NISUZULCBXT0xfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlXT0xfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZBVVgsIDcKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19ibWJuX2RlZnMgPSB7CisJImJtYm4iLCB7ZmFsc2UsIGZhbHNlLCB0cnVlfSwgZmFsc2UsIDAsCisJe01BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFMsIERCR19CVVNfQ0xJRU5UX1JCQ0J9LAorCUJNQk5fUkVHX0RCR19TRUxFQ1QsIEJNQk5fUkVHX0RCR19EV09SRF9FTkFCTEUsCisJQk1CTl9SRUdfREJHX1NISUZULCBCTUJOX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJQk1CTl9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCWZhbHNlLCBmYWxzZSwgTUFYX0RCR19SRVNFVF9SRUdTLCAwCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfaXBjX2RlZnMgPSB7CisJImlwYyIsIHtmYWxzZSwgZmFsc2UsIGZhbHNlfSwgZmFsc2UsIDAsCisJe01BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFN9LAorCTAsIDAsIDAsIDAsIDAsCisJdHJ1ZSwgZmFsc2UsIERCR19SRVNFVF9SRUdfTUlTQ1NfUExfVUEsIDgKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19ud21fZGVmcyA9IHsKKwkibndtIiwge2ZhbHNlLCBmYWxzZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTLCBEQkdfQlVTX0NMSUVOVF9SQkNXfSwKKwlOV01fUkVHX0RCR19TRUxFQ1QsIE5XTV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlOV01fUkVHX0RCR19TSElGVCwgTldNX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJTldNX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgZmFsc2UsIERCR19SRVNFVF9SRUdfTUlTQ1NfUExfSFZfMiwgMAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX253c19kZWZzID0geworCSJud3MiLCB7ZmFsc2UsIGZhbHNlLCBmYWxzZX0sIGZhbHNlLCAwLAorCXtNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTfSwKKwkwLCAwLCAwLCAwLCAwLAorCXRydWUsIGZhbHNlLCBEQkdfUkVTRVRfUkVHX01JU0NTX1BMX0hWLCAxMgorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX21zX2RlZnMgPSB7CisJIm1zIiwge2ZhbHNlLCBmYWxzZSwgZmFsc2V9LCBmYWxzZSwgMCwKKwl7TUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UU30sCisJMCwgMCwgMCwgMCwgMCwKKwl0cnVlLCBmYWxzZSwgREJHX1JFU0VUX1JFR19NSVNDU19QTF9IViwgMTMKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19waHlfcGNpZV9kZWZzID0geworCSJwaHlfcGNpZSIsIHtmYWxzZSwgZmFsc2UsIHRydWV9LCBmYWxzZSwgMCwKKwl7TUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UUywgREJHX0JVU19DTElFTlRfUkJDSH0sCisJUENJRV9SRUdfREJHX0NPTU1PTl9TRUxFQ1QsIFBDSUVfUkVHX0RCR19DT01NT05fRFdPUkRfRU5BQkxFLAorCVBDSUVfUkVHX0RCR19DT01NT05fU0hJRlQsIFBDSUVfUkVHX0RCR19DT01NT05fRk9SQ0VfVkFMSUQsCisJUENJRV9SRUdfREJHX0NPTU1PTl9GT1JDRV9GUkFNRSwKKwlmYWxzZSwgZmFsc2UsIE1BWF9EQkdfUkVTRVRfUkVHUywgMAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX2xlZF9kZWZzID0geworCSJsZWQiLCB7ZmFsc2UsIGZhbHNlLCBmYWxzZX0sIGZhbHNlLCAwLAorCXtNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTfSwKKwkwLCAwLCAwLCAwLCAwLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ1NfUExfSFYsIDE0Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfbWlzY19hZXVfZGVmcyA9IHsKKwkibWlzY19hZXUiLCB7ZmFsc2UsIGZhbHNlLCBmYWxzZX0sIGZhbHNlLCAwLAorCXtNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTfSwKKwkwLCAwLCAwLCAwLCAwLAorCWZhbHNlLCBmYWxzZSwgTUFYX0RCR19SRVNFVF9SRUdTLCAwCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfYmFyMF9tYXBfZGVmcyA9IHsKKwkiYmFyMF9tYXAiLCB7ZmFsc2UsIGZhbHNlLCBmYWxzZX0sIGZhbHNlLCAwLAorCXtNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTfSwKKwkwLCAwLCAwLCAwLCAwLAorCWZhbHNlLCBmYWxzZSwgTUFYX0RCR19SRVNFVF9SRUdTLCAwCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgKnNfYmxvY2tfZGVmc1tNQVhfQkxPQ0tfSURdID0geworCSZibG9ja19ncmNfZGVmcywKKwkmYmxvY2tfbWlzY3NfZGVmcywKKwkmYmxvY2tfbWlzY19kZWZzLAorCSZibG9ja19kYnVfZGVmcywKKwkmYmxvY2tfcGdsdWVfYl9kZWZzLAorCSZibG9ja19jbmlnX2RlZnMsCisJJmJsb2NrX2NwbXVfZGVmcywKKwkmYmxvY2tfbmNzaV9kZWZzLAorCSZibG9ja19vcHRlX2RlZnMsCisJJmJsb2NrX2JtYl9kZWZzLAorCSZibG9ja19wY2llX2RlZnMsCisJJmJsb2NrX21jcF9kZWZzLAorCSZibG9ja19tY3AyX2RlZnMsCisJJmJsb2NrX3Bzd2hzdF9kZWZzLAorCSZibG9ja19wc3doc3QyX2RlZnMsCisJJmJsb2NrX3Bzd3JkX2RlZnMsCisJJmJsb2NrX3Bzd3JkMl9kZWZzLAorCSZibG9ja19wc3d3cl9kZWZzLAorCSZibG9ja19wc3d3cjJfZGVmcywKKwkmYmxvY2tfcHN3cnFfZGVmcywKKwkmYmxvY2tfcHN3cnEyX2RlZnMsCisJJmJsb2NrX3BnbGNzX2RlZnMsCisJJmJsb2NrX2RtYWVfZGVmcywKKwkmYmxvY2tfcHR1X2RlZnMsCisJJmJsb2NrX3RjbV9kZWZzLAorCSZibG9ja19tY21fZGVmcywKKwkmYmxvY2tfdWNtX2RlZnMsCisJJmJsb2NrX3hjbV9kZWZzLAorCSZibG9ja195Y21fZGVmcywKKwkmYmxvY2tfcGNtX2RlZnMsCisJJmJsb2NrX3FtX2RlZnMsCisJJmJsb2NrX3RtX2RlZnMsCisJJmJsb2NrX2RvcnFfZGVmcywKKwkmYmxvY2tfYnJiX2RlZnMsCisJJmJsb2NrX3NyY19kZWZzLAorCSZibG9ja19wcnNfZGVmcywKKwkmYmxvY2tfdHNkbV9kZWZzLAorCSZibG9ja19tc2RtX2RlZnMsCisJJmJsb2NrX3VzZG1fZGVmcywKKwkmYmxvY2tfeHNkbV9kZWZzLAorCSZibG9ja195c2RtX2RlZnMsCisJJmJsb2NrX3BzZG1fZGVmcywKKwkmYmxvY2tfdHNlbV9kZWZzLAorCSZibG9ja19tc2VtX2RlZnMsCisJJmJsb2NrX3VzZW1fZGVmcywKKwkmYmxvY2tfeHNlbV9kZWZzLAorCSZibG9ja195c2VtX2RlZnMsCisJJmJsb2NrX3BzZW1fZGVmcywKKwkmYmxvY2tfcnNzX2RlZnMsCisJJmJsb2NrX3RtbGRfZGVmcywKKwkmYmxvY2tfbXVsZF9kZWZzLAorCSZibG9ja195dWxkX2RlZnMsCisJJmJsb2NrX3h5bGRfZGVmcywKKwkmYmxvY2tfcHJtX2RlZnMsCisJJmJsb2NrX3BiZl9wYjFfZGVmcywKKwkmYmxvY2tfcGJmX3BiMl9kZWZzLAorCSZibG9ja19ycGJfZGVmcywKKwkmYmxvY2tfYnRiX2RlZnMsCisJJmJsb2NrX3BiZl9kZWZzLAorCSZibG9ja19yZGlmX2RlZnMsCisJJmJsb2NrX3RkaWZfZGVmcywKKwkmYmxvY2tfY2R1X2RlZnMsCisJJmJsb2NrX2NjZmNfZGVmcywKKwkmYmxvY2tfdGNmY19kZWZzLAorCSZibG9ja19pZ3VfZGVmcywKKwkmYmxvY2tfY2F1X2RlZnMsCisJJmJsb2NrX3VtYWNfZGVmcywKKwkmYmxvY2tfeG1hY19kZWZzLAorCSZibG9ja19kYmdfZGVmcywKKwkmYmxvY2tfbmlnX2RlZnMsCisJJmJsb2NrX3dvbF9kZWZzLAorCSZibG9ja19ibWJuX2RlZnMsCisJJmJsb2NrX2lwY19kZWZzLAorCSZibG9ja19ud21fZGVmcywKKwkmYmxvY2tfbndzX2RlZnMsCisJJmJsb2NrX21zX2RlZnMsCisJJmJsb2NrX3BoeV9wY2llX2RlZnMsCisJJmJsb2NrX2xlZF9kZWZzLAorCSZibG9ja19taXNjX2FldV9kZWZzLAorCSZibG9ja19iYXIwX21hcF9kZWZzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZWZzIHNfcGxhdGZvcm1fZGVmc1tdID0geworCXsiYXNpYyIsIDF9LAorCXsicmVzZXJ2ZWQiLCAwfSwKKwl7InJlc2VydmVkMiIsIDB9LAorCXsicmVzZXJ2ZWQzIiwgMH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3JjX3BhcmFtX2RlZnMgc19ncmNfcGFyYW1fZGVmc1tdID0geworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAxLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX1RTVE9STSAqLworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAxLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX01TVE9STSAqLworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAxLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX1VTVE9STSAqLworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAxLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX1hTVE9STSAqLworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAxLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX1lTVE9STSAqLworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAxLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX1BTVE9STSAqLworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAwLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX1JFR1MgKi8KKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMCwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9SQU0gKi8KKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMCwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9QQlVGICovCisJe3swLCAwLCAwfSwgMCwgMSwgZmFsc2UsIDAsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfSU9SICovCisJe3swLCAwLCAwfSwgMCwgMSwgZmFsc2UsIDAsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfVkZDICovCisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDAsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfQ01fQ1RYICovCisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDAsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfSUxUICovCisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDAsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfUlNTICovCisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDAsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfQ0FVICovCisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDAsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfUU0gKi8KKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMCwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9NQ1AgKi8KKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMCwgMX0sCS8qIERCR19HUkNfUEFSQU1fUkVTRVJWRUQgKi8KKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMCwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9DRkMgKi8KKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMCwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9JR1UgKi8KKwl7ezAsIDAsIDB9LCAwLCAxLCBmYWxzZSwgMCwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9CUkIgKi8KKwl7ezAsIDAsIDB9LCAwLCAxLCBmYWxzZSwgMCwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9CVEIgKi8KKwl7ezAsIDAsIDB9LCAwLCAxLCBmYWxzZSwgMCwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9CTUIgKi8KKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMCwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9OSUcgKi8KKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMCwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9NVUxEICovCisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDAsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfUFJTICovCisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDAsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfRE1BRSAqLworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAwLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX1RNICovCisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDAsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfU0RNICovCisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDAsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfRElGICovCisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDAsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfU1RBVElDICovCisJe3swLCAwLCAwfSwgMCwgMSwgZmFsc2UsIDAsIDB9LAkvKiBEQkdfR1JDX1BBUkFNX1VOU1RBTEwgKi8KKwl7e01BWF9MQ0lEUywgTUFYX0xDSURTLCBNQVhfTENJRFN9LCAxLCBNQVhfTENJRFMsIGZhbHNlLCBNQVhfTENJRFMsCisJIE1BWF9MQ0lEU30sCQkJLyogREJHX0dSQ19QQVJBTV9OVU1fTENJRFMgKi8KKwl7e01BWF9MVElEUywgTUFYX0xUSURTLCBNQVhfTFRJRFN9LCAxLCBNQVhfTFRJRFMsIGZhbHNlLCBNQVhfTFRJRFMsCisJIE1BWF9MVElEU30sCQkJLyogREJHX0dSQ19QQVJBTV9OVU1fTFRJRFMgKi8KKwl7ezAsIDAsIDB9LCAwLCAxLCB0cnVlLCAwLCAwfSwJLyogREJHX0dSQ19QQVJBTV9FWENMVURFX0FMTCAqLworCXt7MCwgMCwgMH0sIDAsIDEsIHRydWUsIDAsIDB9LAkvKiBEQkdfR1JDX1BBUkFNX0NSQVNIICovCisJe3swLCAwLCAwfSwgMCwgMSwgZmFsc2UsIDEsIDB9LAkvKiBEQkdfR1JDX1BBUkFNX1BBUklUWV9TQUZFICovCisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDAsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfQ00gKi8KKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMCwgMX0JLyogREJHX0dSQ19QQVJBTV9EVU1QX1BIWSAqLworfTsKKworc3RhdGljIHN0cnVjdCByc3NfbWVtX2RlZnMgc19yc3NfbWVtX2RlZnNbXSA9IHsKKwl7ICJyc3NfbWVtX2NpZCIsICJyc3NfY2lkIiwgMCwKKwkgIHsyNTYsIDI1NiwgMzIwfSwKKwkgIHszMiwgMzIsIDMyfSB9LAorCXsgInJzc19tZW1fa2V5X21zYiIsICJyc3Nfa2V5IiwgMTAyNCwKKwkgIHsxMjgsIDEyOCwgMjA4fSwKKwkgIHsyNTYsIDI1NiwgMjU2fSB9LAorCXsgInJzc19tZW1fa2V5X2xzYiIsICJyc3Nfa2V5IiwgMjA0OCwKKwkgIHsxMjgsIDEyOCwgMjA4fSwKKwkgIHs2NCwgNjQsIDY0fSB9LAorCXsgInJzc19tZW1faW5mbyIsICJyc3NfaW5mbyIsIDMwNzIsCisJICB7MTI4LCAxMjgsIDIwOH0sCisJICB7MTYsIDE2LCAxNn0gfSwKKwl7ICJyc3NfbWVtX2luZCIsICJyc3NfaW5kIiwgNDA5NiwKKwkgIHsoMTI4ICogMTI4KSwgKDEyOCAqIDEyOCksICgxMjggKiAyMDgpfSwKKwkgIHsxNiwgMTYsIDE2fSB9Cit9OworCitzdGF0aWMgc3RydWN0IHZmY19yYW1fZGVmcyBzX3ZmY19yYW1fZGVmc1tdID0geworCXsidmZjX3JhbV90dDEiLCAidmZjX3JhbSIsIDAsIDUxMn0sCisJeyJ2ZmNfcmFtX210dDIiLCAidmZjX3JhbSIsIDUxMiwgMTI4fSwKKwl7InZmY19yYW1fc3R0MiIsICJ2ZmNfcmFtIiwgNjQwLCAzMn0sCisJeyJ2ZmNfcmFtX3JvX3ZlY3QiLCAidmZjX3JhbSIsIDY3MiwgMzJ9Cit9OworCitzdGF0aWMgc3RydWN0IGJpZ19yYW1fZGVmcyBzX2JpZ19yYW1fZGVmc1tdID0geworCXsgIkJSQiIsIE1FTV9HUk9VUF9CUkJfTUVNLCBNRU1fR1JPVVBfQlJCX1JBTSwgREJHX0dSQ19QQVJBTV9EVU1QX0JSQiwKKwkgIEJSQl9SRUdfQklHX1JBTV9BRERSRVNTLCBCUkJfUkVHX0JJR19SQU1fREFUQSwKKwkgIHs0ODAwLCA0ODAwLCA1NjMyfSB9LAorCXsgIkJUQiIsIE1FTV9HUk9VUF9CVEJfTUVNLCBNRU1fR1JPVVBfQlRCX1JBTSwgREJHX0dSQ19QQVJBTV9EVU1QX0JUQiwKKwkgIEJUQl9SRUdfQklHX1JBTV9BRERSRVNTLCBCVEJfUkVHX0JJR19SQU1fREFUQSwKKwkgIHsyODgwLCAyODgwLCAzNjgwfSB9LAorCXsgIkJNQiIsIE1FTV9HUk9VUF9CTUJfTUVNLCBNRU1fR1JPVVBfQk1CX1JBTSwgREJHX0dSQ19QQVJBTV9EVU1QX0JNQiwKKwkgIEJNQl9SRUdfQklHX1JBTV9BRERSRVNTLCBCTUJfUkVHX0JJR19SQU1fREFUQSwKKwkgIHsxMTUyLCAxMTUyLCAxMTUyfSB9Cit9OworCitzdGF0aWMgc3RydWN0IHJlc2V0X3JlZ19kZWZzIHNfcmVzZXRfcmVnc19kZWZzW10gPSB7CisJeyBNSVNDU19SRUdfUkVTRVRfUExfVUEsIDB4MCwKKwkgIHt0cnVlLCB0cnVlLCB0cnVlfSB9LAkJLyogREJHX1JFU0VUX1JFR19NSVNDU19QTF9VQSAqLworCXsgTUlTQ1NfUkVHX1JFU0VUX1BMX0hWLCAweDAsCisJICB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0gfSwJCS8qIERCR19SRVNFVF9SRUdfTUlTQ1NfUExfSFYgKi8KKwl7IE1JU0NTX1JFR19SRVNFVF9QTF9IVl8yLCAweDAsCisJICB7ZmFsc2UsIGZhbHNlLCB0cnVlfSB9LAkvKiBEQkdfUkVTRVRfUkVHX01JU0NTX1BMX0hWXzIgKi8KKwl7IE1JU0NfUkVHX1JFU0VUX1BMX1VBLCAweDAsCisJICB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0gfSwJCS8qIERCR19SRVNFVF9SRUdfTUlTQ19QTF9VQSAqLworCXsgTUlTQ19SRUdfUkVTRVRfUExfSFYsIDB4MCwKKwkgIHt0cnVlLCB0cnVlLCB0cnVlfSB9LAkJLyogREJHX1JFU0VUX1JFR19NSVNDX1BMX0hWICovCisJeyBNSVNDX1JFR19SRVNFVF9QTF9QREFfVk1BSU5fMSwgMHg0NDA0MDQwLAorCSAge3RydWUsIHRydWUsIHRydWV9IH0sCQkvKiBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzEgKi8KKwl7IE1JU0NfUkVHX1JFU0VUX1BMX1BEQV9WTUFJTl8yLCAweDdjMDAwMDcsCisJICB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0gfSwJCS8qIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMiAqLworCXsgTUlTQ19SRUdfUkVTRVRfUExfUERBX1ZBVVgsIDB4MiwKKwkgIHt0cnVlLCB0cnVlLCB0cnVlfSB9LAkJLyogREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WQVVYICovCit9OworCitzdGF0aWMgc3RydWN0IHBoeV9kZWZzIHNfcGh5X2RlZnNbXSA9IHsKKwl7Im53X3BoeSIsIE5XU19SRUdfTldTX0NNVSwgUEhZX05XX0lQX1JFR19QSFkwX1RPUF9UQlVTX0FERFJfN18wLAorCSBQSFlfTldfSVBfUkVHX1BIWTBfVE9QX1RCVVNfQUREUl8xNV84LAorCSBQSFlfTldfSVBfUkVHX1BIWTBfVE9QX1RCVVNfREFUQV83XzAsCisJIFBIWV9OV19JUF9SRUdfUEhZMF9UT1BfVEJVU19EQVRBXzExXzh9LAorCXsic2dtaWlfcGh5IiwgTVNfUkVHX01TX0NNVSwgUEhZX1NHTUlJX0lQX1JFR19BSEJfQ01VX0NTUl8wX1gxMzIsCisJIFBIWV9TR01JSV9JUF9SRUdfQUhCX0NNVV9DU1JfMF9YMTMzLAorCSBQSFlfU0dNSUlfSVBfUkVHX0FIQl9DTVVfQ1NSXzBfWDEzMCwKKwkgUEhZX1NHTUlJX0lQX1JFR19BSEJfQ01VX0NTUl8wX1gxMzF9LAorCXsicGNpZV9waHkwIiwgUEhZX1BDSUVfUkVHX1BIWTAsIFBIWV9QQ0lFX0lQX1JFR19BSEJfQ01VX0NTUl8wX1gxMzIsCisJIFBIWV9QQ0lFX0lQX1JFR19BSEJfQ01VX0NTUl8wX1gxMzMsCisJIFBIWV9QQ0lFX0lQX1JFR19BSEJfQ01VX0NTUl8wX1gxMzAsCisJIFBIWV9QQ0lFX0lQX1JFR19BSEJfQ01VX0NTUl8wX1gxMzF9LAorCXsicGNpZV9waHkxIiwgUEhZX1BDSUVfUkVHX1BIWTEsIFBIWV9QQ0lFX0lQX1JFR19BSEJfQ01VX0NTUl8wX1gxMzIsCisJIFBIWV9QQ0lFX0lQX1JFR19BSEJfQ01VX0NTUl8wX1gxMzMsCisJIFBIWV9QQ0lFX0lQX1JFR19BSEJfQ01VX0NTUl8wX1gxMzAsCisJIFBIWV9QQ0lFX0lQX1JFR19BSEJfQ01VX0NTUl8wX1gxMzF9LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogUHJpdmF0ZSBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBSZWFkcyBhbmQgcmV0dXJucyBhIHNpbmdsZSBkd29yZCBmcm9tIHRoZSBzcGVjaWZpZWQgdW5hbGlnbmVkIGJ1ZmZlciAqLworc3RhdGljIHUzMiBxZWRfcmVhZF91bmFsaWduZWRfZHdvcmQodTggKmJ1ZikKK3sKKwl1MzIgZHdvcmQ7CisKKwltZW1jcHkoKHU4ICopJmR3b3JkLCBidWYsIHNpemVvZihkd29yZCkpOworCXJldHVybiBkd29yZDsKK30KKworLyogSW5pdGlhbGl6ZXMgZGVidWcgZGF0YSBmb3IgdGhlIHNwZWNpZmllZCBkZXZpY2UgKi8KK3N0YXRpYyBlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19kZXZfaW5pdChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJc3RydWN0IHFlZF9wdHQgKnBfcHR0KQoreworCXN0cnVjdCBkYmdfdG9vbHNfZGF0YSAqZGV2X2RhdGEgPSAmcF9od2ZuLT5kYmdfaW5mbzsKKworCWlmIChkZXZfZGF0YS0+aW5pdGlhbGl6ZWQpCisJCXJldHVybiBEQkdfU1RBVFVTX09LOworCisJaWYgKFFFRF9JU19LMihwX2h3Zm4tPmNkZXYpKSB7CisJCWRldl9kYXRhLT5jaGlwX2lkID0gQ0hJUF9LMjsKKwkJZGV2X2RhdGEtPm1vZGVfZW5hYmxlW01PREVfSzJdID0gMTsKKwl9IGVsc2UgaWYgKFFFRF9JU19CQl9CMChwX2h3Zm4tPmNkZXYpKSB7CisJCWRldl9kYXRhLT5jaGlwX2lkID0gQ0hJUF9CQl9CMDsKKwkJZGV2X2RhdGEtPm1vZGVfZW5hYmxlW01PREVfQkJfQjBdID0gMTsKKwl9IGVsc2UgeworCQlyZXR1cm4gREJHX1NUQVRVU19VTktOT1dOX0NISVA7CisJfQorCisJZGV2X2RhdGEtPnBsYXRmb3JtX2lkID0gUExBVEZPUk1fQVNJQzsKKwlkZXZfZGF0YS0+bW9kZV9lbmFibGVbTU9ERV9BU0lDXSA9IDE7CisJZGV2X2RhdGEtPmluaXRpYWxpemVkID0gdHJ1ZTsKKwlyZXR1cm4gREJHX1NUQVRVU19PSzsKK30KKworLyogUmVhZHMgdGhlIEZXIGluZm8gc3RydWN0dXJlIGZvciB0aGUgc3BlY2lmaWVkIFN0b3JtIGZyb20gdGhlIGNoaXAsCisgKiBhbmQgd3JpdGVzIGl0IHRvIHRoZSBzcGVjaWZpZWQgZndfaW5mbyBwb2ludGVyLgorICovCitzdGF0aWMgdm9pZCBxZWRfcmVhZF9md19pbmZvKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkgICAgIHU4IHN0b3JtX2lkLCBzdHJ1Y3QgZndfaW5mbyAqZndfaW5mbykKK3sKKwkvKiBSZWFkIGZpcnN0IHRoZSBhZGRyZXNzIHRoYXQgcG9pbnRzIHRvIGZ3X2luZm8gbG9jYXRpb24uCisJICogVGhlIGFkZHJlc3MgaXMgbG9jYXRlZCBpbiB0aGUgbGFzdCBsaW5lIG9mIHRoZSBTdG9ybSBSQU0uCisJICovCisJdTMyIGFkZHIgPSBzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLnNlbV9mYXN0X21lbV9hZGRyICsKKwkJICAgU0VNX0ZBU1RfUkVHX0lOVF9SQU0gKworCQkgICBEV09SRFNfVE9fQllURVMoU0VNX0ZBU1RfUkVHX0lOVF9SQU1fU0laRSkgLQorCQkgICBzaXplb2Yoc3RydWN0IGZ3X2luZm9fbG9jYXRpb24pOworCXN0cnVjdCBmd19pbmZvX2xvY2F0aW9uIGZ3X2luZm9fbG9jYXRpb247CisJdTMyICpkZXN0ID0gKHUzMiAqKSZmd19pbmZvX2xvY2F0aW9uOworCXUzMiBpOworCisJbWVtc2V0KCZmd19pbmZvX2xvY2F0aW9uLCAwLCBzaXplb2YoZndfaW5mb19sb2NhdGlvbikpOworCW1lbXNldChmd19pbmZvLCAwLCBzaXplb2YoKmZ3X2luZm8pKTsKKwlmb3IgKGkgPSAwOyBpIDwgQllURVNfVE9fRFdPUkRTKHNpemVvZihmd19pbmZvX2xvY2F0aW9uKSk7CisJICAgICBpKyssIGFkZHIgKz0gQllURVNfSU5fRFdPUkQpCisJCWRlc3RbaV0gPSBxZWRfcmQocF9od2ZuLCBwX3B0dCwgYWRkcik7CisJaWYgKGZ3X2luZm9fbG9jYXRpb24uc2l6ZSA+IDAgJiYgZndfaW5mb19sb2NhdGlvbi5zaXplIDw9CisJICAgIHNpemVvZigqZndfaW5mbykpIHsKKwkJLyogUmVhZCBGVyB2ZXJzaW9uIGluZm8gZnJvbSBTdG9ybSBSQU0gKi8KKwkJYWRkciA9IGZ3X2luZm9fbG9jYXRpb24uZ3JjX2FkZHI7CisJCWRlc3QgPSAodTMyICopZndfaW5mbzsKKwkJZm9yIChpID0gMDsgaSA8IEJZVEVTX1RPX0RXT1JEUyhmd19pbmZvX2xvY2F0aW9uLnNpemUpOworCQkgICAgIGkrKywgYWRkciArPSBCWVRFU19JTl9EV09SRCkKKwkJCWRlc3RbaV0gPSBxZWRfcmQocF9od2ZuLCBwX3B0dCwgYWRkcik7CisJfQorfQorCisvKiBEdW1wcyB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4gUmV0dXJucyB0aGUgZHVtcGVkIHNpemUKKyAqIGluIGJ5dGVzIChhY3R1YWwgbGVuZ3RoICsgMSBmb3IgdGhlIG51bGwgY2hhcmFjdGVyIHRlcm1pbmF0aW9uKS4KKyAqLworc3RhdGljIHUzMiBxZWRfZHVtcF9zdHIoY2hhciAqZHVtcF9idWYsIGJvb2wgZHVtcCwgY29uc3QgY2hhciAqc3RyKQoreworCWlmIChkdW1wKQorCQlzdHJjcHkoZHVtcF9idWYsIHN0cik7CisJcmV0dXJuICh1MzIpc3RybGVuKHN0cikgKyAxOworfQorCisvKiBEdW1wcyB6ZXJvcyB0byBhbGlnbiB0aGUgc3BlY2lmaWVkIGJ1ZmZlciB0byBkd29yZHMuIFJldHVybnMgdGhlIGR1bXBlZCBzaXplCisgKiBpbiBieXRlcy4KKyAqLworc3RhdGljIHUzMiBxZWRfZHVtcF9hbGlnbihjaGFyICpkdW1wX2J1ZiwgYm9vbCBkdW1wLCB1MzIgYnl0ZV9vZmZzZXQpCit7CisJdTggb2Zmc2V0X2luX2R3b3JkID0gKHU4KShieXRlX29mZnNldCAmIDB4MyksIGFsaWduX3NpemU7CisKKwlhbGlnbl9zaXplID0gb2Zmc2V0X2luX2R3b3JkID8gQllURVNfSU5fRFdPUkQgLSBvZmZzZXRfaW5fZHdvcmQgOiAwOworCisJaWYgKGR1bXAgJiYgYWxpZ25fc2l6ZSkKKwkJbWVtc2V0KGR1bXBfYnVmLCAwLCBhbGlnbl9zaXplKTsKKwlyZXR1cm4gYWxpZ25fc2l6ZTsKK30KKworLyogV3JpdGVzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHBhcmFtIHRvIHRoZSBzcGVjaWZpZWQgYnVmZmVyLgorICogUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLgorICovCitzdGF0aWMgdTMyIHFlZF9kdW1wX3N0cl9wYXJhbSh1MzIgKmR1bXBfYnVmLAorCQkJICAgICAgYm9vbCBkdW1wLAorCQkJICAgICAgY29uc3QgY2hhciAqcGFyYW1fbmFtZSwgY29uc3QgY2hhciAqcGFyYW1fdmFsKQoreworCWNoYXIgKmNoYXJfYnVmID0gKGNoYXIgKilkdW1wX2J1ZjsKKwl1MzIgb2Zmc2V0ID0gMDsKKworCS8qIER1bXAgcGFyYW0gbmFtZSAqLworCW9mZnNldCArPSBxZWRfZHVtcF9zdHIoY2hhcl9idWYgKyBvZmZzZXQsIGR1bXAsIHBhcmFtX25hbWUpOworCisJLyogSW5kaWNhdGUgYSBzdHJpbmcgcGFyYW0gdmFsdWUgKi8KKwlpZiAoZHVtcCkKKwkJKihjaGFyX2J1ZiArIG9mZnNldCkgPSAxOworCW9mZnNldCsrOworCisJLyogRHVtcCBwYXJhbSB2YWx1ZSAqLworCW9mZnNldCArPSBxZWRfZHVtcF9zdHIoY2hhcl9idWYgKyBvZmZzZXQsIGR1bXAsIHBhcmFtX3ZhbCk7CisKKwkvKiBBbGlnbiBidWZmZXIgdG8gbmV4dCBkd29yZCAqLworCW9mZnNldCArPSBxZWRfZHVtcF9hbGlnbihjaGFyX2J1ZiArIG9mZnNldCwgZHVtcCwgb2Zmc2V0KTsKKwlyZXR1cm4gQllURVNfVE9fRFdPUkRTKG9mZnNldCk7Cit9CisKKy8qIFdyaXRlcyB0aGUgc3BlY2lmaWVkIG51bWVyaWMgcGFyYW0gdG8gdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuCisgKi8KK3N0YXRpYyB1MzIgcWVkX2R1bXBfbnVtX3BhcmFtKHUzMiAqZHVtcF9idWYsCisJCQkgICAgICBib29sIGR1bXAsIGNvbnN0IGNoYXIgKnBhcmFtX25hbWUsIHUzMiBwYXJhbV92YWwpCit7CisJY2hhciAqY2hhcl9idWYgPSAoY2hhciAqKWR1bXBfYnVmOworCXUzMiBvZmZzZXQgPSAwOworCisJLyogRHVtcCBwYXJhbSBuYW1lICovCisJb2Zmc2V0ICs9IHFlZF9kdW1wX3N0cihjaGFyX2J1ZiArIG9mZnNldCwgZHVtcCwgcGFyYW1fbmFtZSk7CisKKwkvKiBJbmRpY2F0ZSBhIG51bWVyaWMgcGFyYW0gdmFsdWUgKi8KKwlpZiAoZHVtcCkKKwkJKihjaGFyX2J1ZiArIG9mZnNldCkgPSAwOworCW9mZnNldCsrOworCisJLyogQWxpZ24gYnVmZmVyIHRvIG5leHQgZHdvcmQgKi8KKwlvZmZzZXQgKz0gcWVkX2R1bXBfYWxpZ24oY2hhcl9idWYgKyBvZmZzZXQsIGR1bXAsIG9mZnNldCk7CisKKwkvKiBEdW1wIHBhcmFtIHZhbHVlIChhbmQgY2hhbmdlIG9mZnNldCBmcm9tIGJ5dGVzIHRvIGR3b3JkcykgKi8KKwlvZmZzZXQgPSBCWVRFU19UT19EV09SRFMob2Zmc2V0KTsKKwlpZiAoZHVtcCkKKwkJKihkdW1wX2J1ZiArIG9mZnNldCkgPSBwYXJhbV92YWw7CisJb2Zmc2V0Kys7CisJcmV0dXJuIG9mZnNldDsKK30KKworLyogUmVhZHMgdGhlIEZXIHZlcnNpb24gYW5kIHdyaXRlcyBpdCBhcyBhIHBhcmFtIHRvIHRoZSBzcGVjaWZpZWQgYnVmZmVyLgorICogUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLgorICovCitzdGF0aWMgdTMyIHFlZF9kdW1wX2Z3X3Zlcl9wYXJhbShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSB1MzIgKmR1bXBfYnVmLCBib29sIGR1bXApCit7CisJc3RydWN0IGRiZ190b29sc19kYXRhICpkZXZfZGF0YSA9ICZwX2h3Zm4tPmRiZ19pbmZvOworCWNoYXIgZndfdmVyX3N0clsxNl0gPSBFTVBUWV9GV19WRVJTSU9OX1NUUjsKKwljaGFyIGZ3X2ltZ19zdHJbMTZdID0gRU1QVFlfRldfSU1BR0VfU1RSOworCXN0cnVjdCBmd19pbmZvIGZ3X2luZm8gPSB7IHswfSwgezB9IH07CisJaW50IHByaW50ZWRfY2hhcnM7CisJdTMyIG9mZnNldCA9IDA7CisKKwlpZiAoZHVtcCkgeworCQkvKiBSZWFkIEZXIGltYWdlL3ZlcnNpb24gZnJvbSBQUkFNIGluIGEgbm9uLXJlc2V0IFNFTUkgKi8KKwkJYm9vbCBmb3VuZCA9IGZhbHNlOworCQl1OCBzdG9ybV9pZDsKKworCQlmb3IgKHN0b3JtX2lkID0gMDsgc3Rvcm1faWQgPCBNQVhfREJHX1NUT1JNUyAmJiAhZm91bmQ7CisJCSAgICAgc3Rvcm1faWQrKykgeworCQkJLyogUmVhZCBGVyB2ZXJzaW9uL2ltYWdlICAqLworCQkJaWYgKCFkZXZfZGF0YS0+YmxvY2tfaW5fcmVzZXQKKwkJCSAgICBbc19zdG9ybV9kZWZzW3N0b3JtX2lkXS5ibG9ja19pZF0pIHsKKwkJCQkvKiByZWFkIEZXIGluZm8gZm9yIHRoZSBjdXJyZW50IFN0b3JtICovCisJCQkJcWVkX3JlYWRfZndfaW5mbyhwX2h3Zm4sCisJCQkJCQkgcF9wdHQsIHN0b3JtX2lkLCAmZndfaW5mbyk7CisKKwkJCQkvKiBDcmVhdGUgRlcgdmVyc2lvbi9pbWFnZSBzdHJpbmdzICovCisJCQkJcHJpbnRlZF9jaGFycyA9CisJCQkJICAgIHNucHJpbnRmKGZ3X3Zlcl9zdHIsCisJCQkJCSAgICAgc2l6ZW9mKGZ3X3Zlcl9zdHIpLAorCQkJCQkgICAgICIlZF8lZF8lZF8lZCIsCisJCQkJCSAgICAgZndfaW5mby52ZXIubnVtLm1ham9yLAorCQkJCQkgICAgIGZ3X2luZm8udmVyLm51bS5taW5vciwKKwkJCQkJICAgICBmd19pbmZvLnZlci5udW0ucmV2LAorCQkJCQkgICAgIGZ3X2luZm8udmVyLm51bS5lbmcpOworCQkJCWlmIChwcmludGVkX2NoYXJzIDwgMCB8fCBwcmludGVkX2NoYXJzID49CisJCQkJICAgIHNpemVvZihmd192ZXJfc3RyKSkKKwkJCQkJRFBfTk9USUNFKHBfaHdmbiwKKwkJCQkJCSAgIlVuZXhwZWN0ZWQgZGVidWcgZXJyb3I6IGludmFsaWQgRlcgdmVyc2lvbiBzdHJpbmdcbiIpOworCQkJCXN3aXRjaCAoZndfaW5mby52ZXIuaW1hZ2VfaWQpIHsKKwkJCQljYXNlIEZXX0lNR19NQUlOOgorCQkJCQlzdHJjcHkoZndfaW1nX3N0ciwgIm1haW4iKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJc3RyY3B5KGZ3X2ltZ19zdHIsICJ1bmtub3duIik7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCX0KKwkJfQorCX0KKworCS8qIER1bXAgRlcgdmVyc2lvbiwgaW1hZ2UgYW5kIHRpbWVzdGFtcCAqLworCW9mZnNldCArPSBxZWRfZHVtcF9zdHJfcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICBkdW1wLCAiZnctdmVyc2lvbiIsIGZ3X3Zlcl9zdHIpOworCW9mZnNldCArPSBxZWRfZHVtcF9zdHJfcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICBkdW1wLCAiZnctaW1hZ2UiLCBmd19pbWdfc3RyKTsKKwlvZmZzZXQgKz0gcWVkX2R1bXBfbnVtX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgZHVtcCwKKwkJCQkgICAgICJmdy10aW1lc3RhbXAiLCBmd19pbmZvLnZlci50aW1lc3RhbXApOworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qIFJlYWRzIHRoZSBNRlcgdmVyc2lvbiBhbmQgd3JpdGVzIGl0IGFzIGEgcGFyYW0gdG8gdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuCisgKi8KK3N0YXRpYyB1MzIgcWVkX2R1bXBfbWZ3X3Zlcl9wYXJhbShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgIHUzMiAqZHVtcF9idWYsIGJvb2wgZHVtcCkKK3sKKwljaGFyIG1md192ZXJfc3RyWzE2XSA9IEVNUFRZX0ZXX1ZFUlNJT05fU1RSOworCisJaWYgKGR1bXApIHsKKwkJdTMyIGdsb2JhbF9zZWN0aW9uX29mZnNpemUsIGdsb2JhbF9zZWN0aW9uX2FkZHIsIG1md192ZXI7CisJCXUzMiBwdWJsaWNfZGF0YV9hZGRyLCBnbG9iYWxfc2VjdGlvbl9vZmZzaXplX2FkZHI7CisJCWludCBwcmludGVkX2NoYXJzOworCisJCS8qIEZpbmQgTUNQIHB1YmxpYyBkYXRhIEdSQyBhZGRyZXNzLgorCQkgKiBOZWVkcyB0byBiZSBPUmVkIHdpdGggTUNQX1JFR19TQ1JBVENIIGR1ZSB0byBhIEhXIGJ1Zy4KKwkJICovCisJCXB1YmxpY19kYXRhX2FkZHIgPSBxZWRfcmQocF9od2ZuLCBwX3B0dCwKKwkJCQkJICBNSVNDX1JFR19TSEFSRURfTUVNX0FERFIpIHwKKwkJCQkJICBNQ1BfUkVHX1NDUkFUQ0g7CisKKwkJLyogRmluZCBNQ1AgcHVibGljIGdsb2JhbCBzZWN0aW9uIG9mZnNldCAqLworCQlnbG9iYWxfc2VjdGlvbl9vZmZzaXplX2FkZHIgPSBwdWJsaWNfZGF0YV9hZGRyICsKKwkJCQkJICAgICAgb2Zmc2V0b2Yoc3RydWN0IG1jcF9wdWJsaWNfZGF0YSwKKwkJCQkJCSAgICAgICBzZWN0aW9ucykgKworCQkJCQkgICAgICBzaXplb2Yob2Zmc2l6ZV90KSAqIFBVQkxJQ19HTE9CQUw7CisJCWdsb2JhbF9zZWN0aW9uX29mZnNpemUgPSBxZWRfcmQocF9od2ZuLCBwX3B0dCwKKwkJCQkJCWdsb2JhbF9zZWN0aW9uX29mZnNpemVfYWRkcik7CisJCWdsb2JhbF9zZWN0aW9uX2FkZHIgPSBNQ1BfUkVHX1NDUkFUQ0ggKworCQkJCSAgICAgIChnbG9iYWxfc2VjdGlvbl9vZmZzaXplICYKKwkJCQkgICAgICAgT0ZGU0laRV9PRkZTRVRfTUFTSykgKiA0OworCisJCS8qIFJlYWQgTUZXIHZlcnNpb24gZnJvbSBNQ1AgcHVibGljIGdsb2JhbCBzZWN0aW9uICovCisJCW1md192ZXIgPSBxZWRfcmQocF9od2ZuLCBwX3B0dCwKKwkJCQkgZ2xvYmFsX3NlY3Rpb25fYWRkciArCisJCQkJIG9mZnNldG9mKHN0cnVjdCBwdWJsaWNfZ2xvYmFsLCBtZndfdmVyKSk7CisKKwkJLyogRHVtcCBNRlcgdmVyc2lvbiBwYXJhbSAqLworCQlwcmludGVkX2NoYXJzID0gc25wcmludGYobWZ3X3Zlcl9zdHIsIHNpemVvZihtZndfdmVyX3N0ciksCisJCQkJCSAiJWRfJWRfJWRfJWQiLAorCQkJCQkgKHU4KSAobWZ3X3ZlciA+PiAyNCksCisJCQkJCSAodTgpIChtZndfdmVyID4+IDE2KSwKKwkJCQkJICh1OCkgKG1md192ZXIgPj4gOCksCisJCQkJCSAodTgpIG1md192ZXIpOworCQlpZiAocHJpbnRlZF9jaGFycyA8IDAgfHwgcHJpbnRlZF9jaGFycyA+PSBzaXplb2YobWZ3X3Zlcl9zdHIpKQorCQkJRFBfTk9USUNFKHBfaHdmbiwKKwkJCQkgICJVbmV4cGVjdGVkIGRlYnVnIGVycm9yOiBpbnZhbGlkIE1GVyB2ZXJzaW9uIHN0cmluZ1xuIik7CisJfQorCisJcmV0dXJuIHFlZF9kdW1wX3N0cl9wYXJhbShkdW1wX2J1ZiwgZHVtcCwgIm1mdy12ZXJzaW9uIiwgbWZ3X3Zlcl9zdHIpOworfQorCisvKiBXcml0ZXMgYSBzZWN0aW9uIGhlYWRlciB0byB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAqIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4KKyAqLworc3RhdGljIHUzMiBxZWRfZHVtcF9zZWN0aW9uX2hkcih1MzIgKmR1bXBfYnVmLAorCQkJCWJvb2wgZHVtcCwgY29uc3QgY2hhciAqbmFtZSwgdTMyIG51bV9wYXJhbXMpCit7CisJcmV0dXJuIHFlZF9kdW1wX251bV9wYXJhbShkdW1wX2J1ZiwgZHVtcCwgbmFtZSwgbnVtX3BhcmFtcyk7Cit9CisKKy8qIFdyaXRlcyB0aGUgY29tbW9uIGdsb2JhbCBwYXJhbXMgdG8gdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuCisgKi8KK3N0YXRpYyB1MzIgcWVkX2R1bXBfY29tbW9uX2dsb2JhbF9wYXJhbXMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJCSB1MzIgKmR1bXBfYnVmLAorCQkJCQkgYm9vbCBkdW1wLAorCQkJCQkgdTggbnVtX3NwZWNpZmljX2dsb2JhbF9wYXJhbXMpCit7CisJc3RydWN0IGRiZ190b29sc19kYXRhICpkZXZfZGF0YSA9ICZwX2h3Zm4tPmRiZ19pbmZvOworCXUzMiBvZmZzZXQgPSAwOworCisJLyogRmluZCBwbGF0Zm9ybSBzdHJpbmcgYW5kIGR1bXAgZ2xvYmFsIHBhcmFtcyBzZWN0aW9uIGhlYWRlciAqLworCW9mZnNldCArPSBxZWRfZHVtcF9zZWN0aW9uX2hkcihkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgICAgZHVtcCwKKwkJCQkgICAgICAgImdsb2JhbF9wYXJhbXMiLAorCQkJCSAgICAgICBOVU1fQ09NTU9OX0dMT0JBTF9QQVJBTVMgKworCQkJCSAgICAgICBudW1fc3BlY2lmaWNfZ2xvYmFsX3BhcmFtcyk7CisKKwkvKiBTdG9yZSBwYXJhbXMgKi8KKwlvZmZzZXQgKz0gcWVkX2R1bXBfZndfdmVyX3BhcmFtKHBfaHdmbiwgcF9wdHQsIGR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wKTsKKwlvZmZzZXQgKz0gcWVkX2R1bXBfbWZ3X3Zlcl9wYXJhbShwX2h3Zm4sCisJCQkJCSBwX3B0dCwgZHVtcF9idWYgKyBvZmZzZXQsIGR1bXApOworCW9mZnNldCArPSBxZWRfZHVtcF9udW1fcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICBkdW1wLCAidG9vbHMtdmVyc2lvbiIsIFRPT0xTX1ZFUlNJT04pOworCW9mZnNldCArPSBxZWRfZHVtcF9zdHJfcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICBkdW1wLAorCQkJCSAgICAgImNoaXAiLAorCQkJCSAgICAgc19jaGlwX2RlZnNbZGV2X2RhdGEtPmNoaXBfaWRdLm5hbWUpOworCW9mZnNldCArPSBxZWRfZHVtcF9zdHJfcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICBkdW1wLAorCQkJCSAgICAgInBsYXRmb3JtIiwKKwkJCQkgICAgIHNfcGxhdGZvcm1fZGVmc1tkZXZfZGF0YS0+cGxhdGZvcm1faWRdLgorCQkJCSAgICAgbmFtZSk7CisJb2Zmc2V0ICs9CisJICAgIHFlZF9kdW1wX251bV9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCwgInBjaS1mdW5jIiwKKwkJCSAgICAgICBwX2h3Zm4tPmFic19wZl9pZCk7CisJcmV0dXJuIG9mZnNldDsKK30KKworLyogV3JpdGVzIHRoZSBsYXN0IHNlY3Rpb24gdG8gdGhlIHNwZWNpZmllZCBidWZmZXIgYXQgdGhlIGdpdmVuIG9mZnNldC4KKyAqIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4KKyAqLworc3RhdGljIHUzMiBxZWRfZHVtcF9sYXN0X3NlY3Rpb24odTMyICpkdW1wX2J1ZiwgdTMyIG9mZnNldCwgYm9vbCBkdW1wKQoreworCXUzMiBzdGFydF9vZmZzZXQgPSBvZmZzZXQsIGNyYyA9IH4wOworCisJLyogRHVtcCBDUkMgc2VjdGlvbiBoZWFkZXIgKi8KKwlvZmZzZXQgKz0gcWVkX2R1bXBfc2VjdGlvbl9oZHIoZHVtcF9idWYgKyBvZmZzZXQsIGR1bXAsICJsYXN0IiwgMCk7CisKKwkvKiBDYWxjdWxhdGUgQ1JDMzIgYW5kIGFkZCBpdCB0byB0aGUgZHdvcmQgZm9sbG93aW5nIHRoZSAibGFzdCIgc2VjdGlvbi4KKwkgKi8KKwlpZiAoZHVtcCkKKwkJKihkdW1wX2J1ZiArIG9mZnNldCkgPSB+Y3JjMzIoY3JjLCAodTggKilkdW1wX2J1ZiwKKwkJCQkJICAgICAgRFdPUkRTX1RPX0JZVEVTKG9mZnNldCkpOworCW9mZnNldCsrOworCXJldHVybiBvZmZzZXQgLSBzdGFydF9vZmZzZXQ7Cit9CisKKy8qIFVwZGF0ZSBibG9ja3MgcmVzZXQgc3RhdGUgICovCitzdGF0aWMgdm9pZCBxZWRfdXBkYXRlX2Jsb2Nrc19yZXNldF9zdGF0ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCit7CisJc3RydWN0IGRiZ190b29sc19kYXRhICpkZXZfZGF0YSA9ICZwX2h3Zm4tPmRiZ19pbmZvOworCXUzMiByZWdfdmFsW01BWF9EQkdfUkVTRVRfUkVHU10gPSB7IDAgfTsKKwl1MzIgaTsKKworCS8qIFJlYWQgcmVzZXQgcmVnaXN0ZXJzICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9EQkdfUkVTRVRfUkVHUzsgaSsrKQorCQlpZiAoc19yZXNldF9yZWdzX2RlZnNbaV0uZXhpc3RzW2Rldl9kYXRhLT5jaGlwX2lkXSkKKwkJCXJlZ192YWxbaV0gPSBxZWRfcmQocF9od2ZuLAorCQkJCQkgICAgcF9wdHQsIHNfcmVzZXRfcmVnc19kZWZzW2ldLmFkZHIpOworCisJLyogQ2hlY2sgaWYgYmxvY2tzIGFyZSBpbiByZXNldCAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfQkxPQ0tfSUQ7IGkrKykKKwkJZGV2X2RhdGEtPmJsb2NrX2luX3Jlc2V0W2ldID0KKwkJICAgIHNfYmxvY2tfZGVmc1tpXS0+aGFzX3Jlc2V0X2JpdCAmJgorCQkgICAgIShyZWdfdmFsW3NfYmxvY2tfZGVmc1tpXS0+cmVzZXRfcmVnXSAmCisJCSAgICAgIEJJVChzX2Jsb2NrX2RlZnNbaV0tPnJlc2V0X2JpdF9vZmZzZXQpKTsKK30KKworLyogRW5hYmxlIC8gZGlzYWJsZSB0aGUgRGVidWcgYmxvY2sgKi8KK3N0YXRpYyB2b2lkIHFlZF9idXNfZW5hYmxlX2RiZ19ibG9jayhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgYm9vbCBlbmFibGUpCit7CisJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIERCR19SRUdfREJHX0JMT0NLX09OLCBlbmFibGUgPyAxIDogMCk7Cit9CisKKy8qIFJlc2V0cyB0aGUgRGVidWcgYmxvY2sgKi8KK3N0YXRpYyB2b2lkIHFlZF9idXNfcmVzZXRfZGJnX2Jsb2NrKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCit7CisJdTMyIGRiZ19yZXNldF9yZWdfYWRkciwgb2xkX3Jlc2V0X3JlZ192YWwsIG5ld19yZXNldF9yZWdfdmFsOworCisJZGJnX3Jlc2V0X3JlZ19hZGRyID0KKwkJc19yZXNldF9yZWdzX2RlZnNbc19ibG9ja19kZWZzW0JMT0NLX0RCR10tPnJlc2V0X3JlZ10uYWRkcjsKKwlvbGRfcmVzZXRfcmVnX3ZhbCA9IHFlZF9yZChwX2h3Zm4sIHBfcHR0LCBkYmdfcmVzZXRfcmVnX2FkZHIpOworCW5ld19yZXNldF9yZWdfdmFsID0gb2xkX3Jlc2V0X3JlZ192YWwgJgorCQkJICAgIH5CSVQoc19ibG9ja19kZWZzW0JMT0NLX0RCR10tPnJlc2V0X2JpdF9vZmZzZXQpOworCisJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIGRiZ19yZXNldF9yZWdfYWRkciwgbmV3X3Jlc2V0X3JlZ192YWwpOworCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBkYmdfcmVzZXRfcmVnX2FkZHIsIG9sZF9yZXNldF9yZWdfdmFsKTsKK30KKworc3RhdGljIHZvaWQgcWVkX2J1c19zZXRfZnJhbWluZ19tb2RlKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSAgICAgZW51bSBkYmdfYnVzX2ZyYW1lX21vZGVzIG1vZGUpCit7CisJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIERCR19SRUdfRlJBTUlOR19NT0RFLCAodTgpbW9kZSk7Cit9CisKKy8qIEVuYWJsZSAvIGRpc2FibGUgRGVidWcgQnVzIGNsaWVudHMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgbWFzay4KKyAqICgxID0gZW5hYmxlLCAwID0gZGlzYWJsZSkKKyAqLworc3RhdGljIHZvaWQgcWVkX2J1c19lbmFibGVfY2xpZW50cyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHUzMiBjbGllbnRfbWFzaykKK3sKKwlxZWRfd3IocF9od2ZuLCBwX3B0dCwgREJHX1JFR19DTElFTlRfRU5BQkxFLCBjbGllbnRfbWFzayk7Cit9CisKK3N0YXRpYyBib29sIHFlZF9pc19tb2RlX21hdGNoKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCB1MTYgKm1vZGVzX2J1Zl9vZmZzZXQpCit7CisJY29uc3QgdTMyICpwdHIgPSBzX2RiZ19hcnJheXNbQklOX0JVRl9EQkdfTU9ERV9UUkVFXS5wdHI7CisJc3RydWN0IGRiZ190b29sc19kYXRhICpkZXZfZGF0YSA9ICZwX2h3Zm4tPmRiZ19pbmZvOworCXU4IHRyZWVfdmFsID0gKCh1OCAqKXB0cilbKCptb2Rlc19idWZfb2Zmc2V0KSsrXTsKKwlib29sIGFyZzEsIGFyZzI7CisKKwlzd2l0Y2ggKHRyZWVfdmFsKSB7CisJY2FzZSBJTklUX01PREVfT1BfTk9UOgorCQlyZXR1cm4gIXFlZF9pc19tb2RlX21hdGNoKHBfaHdmbiwgbW9kZXNfYnVmX29mZnNldCk7CisJY2FzZSBJTklUX01PREVfT1BfT1I6CisJY2FzZSBJTklUX01PREVfT1BfQU5EOgorCQlhcmcxID0gcWVkX2lzX21vZGVfbWF0Y2gocF9od2ZuLCBtb2Rlc19idWZfb2Zmc2V0KTsKKwkJYXJnMiA9IHFlZF9pc19tb2RlX21hdGNoKHBfaHdmbiwgbW9kZXNfYnVmX29mZnNldCk7CisJCXJldHVybiAodHJlZV92YWwgPT0gSU5JVF9NT0RFX09QX09SKSA/IChhcmcxIHx8CisJCQkJCQkJYXJnMikgOiAoYXJnMSAmJiBhcmcyKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZGV2X2RhdGEtPm1vZGVfZW5hYmxlW3RyZWVfdmFsIC0gTUFYX0lOSVRfTU9ERV9PUFNdID4gMDsKKwl9Cit9CisKKy8qIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgR1JDIHBhcmFtICovCitzdGF0aWMgdTMyIHFlZF9ncmNfZ2V0X3BhcmFtKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgICBlbnVtIGRiZ19ncmNfcGFyYW1zIGdyY19wYXJhbSkKK3sKKwlzdHJ1Y3QgZGJnX3Rvb2xzX2RhdGEgKmRldl9kYXRhID0gJnBfaHdmbi0+ZGJnX2luZm87CisKKwlyZXR1cm4gZGV2X2RhdGEtPmdyYy5wYXJhbV92YWxbZ3JjX3BhcmFtXTsKK30KKworLyogQ2xlYXIgYWxsIEdSQyBwYXJhbXMgKi8KK3N0YXRpYyB2b2lkIHFlZF9kYmdfZ3JjX2NsZWFyX3BhcmFtcyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbikKK3sKKwlzdHJ1Y3QgZGJnX3Rvb2xzX2RhdGEgKmRldl9kYXRhID0gJnBfaHdmbi0+ZGJnX2luZm87CisJdTMyIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0RCR19HUkNfUEFSQU1TOyBpKyspCisJCWRldl9kYXRhLT5ncmMucGFyYW1fc2V0X2J5X3VzZXJbaV0gPSAwOworfQorCisvKiBBc3NpZ24gZGVmYXVsdCBHUkMgcGFyYW0gdmFsdWVzICovCitzdGF0aWMgdm9pZCBxZWRfZGJnX2dyY19zZXRfcGFyYW1zX2RlZmF1bHQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4pCit7CisJc3RydWN0IGRiZ190b29sc19kYXRhICpkZXZfZGF0YSA9ICZwX2h3Zm4tPmRiZ19pbmZvOworCXUzMiBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9EQkdfR1JDX1BBUkFNUzsgaSsrKQorCQlpZiAoIWRldl9kYXRhLT5ncmMucGFyYW1fc2V0X2J5X3VzZXJbaV0pCisJCQlkZXZfZGF0YS0+Z3JjLnBhcmFtX3ZhbFtpXSA9CisJCQkgICAgc19ncmNfcGFyYW1fZGVmc1tpXS5kZWZhdWx0X3ZhbFtkZXZfZGF0YS0+Y2hpcF9pZF07Cit9CisKKy8qIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGVudGl0eSAoaW5kaWNhdGVkIGJ5IEdSQyBwYXJhbSkgc2hvdWxkIGJlCisgKiBpbmNsdWRlZCBpbiB0aGUgZHVtcCwgZmFsc2Ugb3RoZXJ3aXNlLgorICovCitzdGF0aWMgYm9vbCBxZWRfZ3JjX2lzX2luY2x1ZGVkKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCWVudW0gZGJnX2dyY19wYXJhbXMgZ3JjX3BhcmFtKQoreworCXJldHVybiBxZWRfZ3JjX2dldF9wYXJhbShwX2h3Zm4sIGdyY19wYXJhbSkgPiAwOworfQorCisvKiBSZXR1cm5zIHRydWUgb2YgdGhlIHNwZWNpZmllZCBTdG9ybSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGR1bXAsIGZhbHNlCisgKiBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBib29sIHFlZF9ncmNfaXNfc3Rvcm1faW5jbHVkZWQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgICAgZW51bSBkYmdfc3Rvcm1zIHN0b3JtKQoreworCXJldHVybiBxZWRfZ3JjX2dldF9wYXJhbShwX2h3Zm4sIChlbnVtIGRiZ19ncmNfcGFyYW1zKXN0b3JtKSA+IDA7Cit9CisKKy8qIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG1lbW9yeSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGR1bXAsIGZhbHNlCisgKiBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBib29sIHFlZF9ncmNfaXNfbWVtX2luY2x1ZGVkKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICBlbnVtIGJsb2NrX2lkIGJsb2NrX2lkLCB1OCBtZW1fZ3JvdXBfaWQpCit7CisJdTggaTsKKworCS8qIENoZWNrIFN0b3JtIG1hdGNoICovCisJaWYgKHNfYmxvY2tfZGVmc1tibG9ja19pZF0tPmFzc29jaWF0ZWRfdG9fc3Rvcm0gJiYKKwkgICAgIXFlZF9ncmNfaXNfc3Rvcm1faW5jbHVkZWQocF9od2ZuLAorCQkJKGVudW0gZGJnX3N0b3JtcylzX2Jsb2NrX2RlZnNbYmxvY2tfaWRdLT5zdG9ybV9pZCkpCisJCXJldHVybiBmYWxzZTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fQklHX1JBTV9UWVBFUzsgaSsrKQorCQlpZiAobWVtX2dyb3VwX2lkID09IHNfYmlnX3JhbV9kZWZzW2ldLm1lbV9ncm91cF9pZCB8fAorCQkgICAgbWVtX2dyb3VwX2lkID09IHNfYmlnX3JhbV9kZWZzW2ldLnJhbV9tZW1fZ3JvdXBfaWQpCisJCQlyZXR1cm4gcWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sCisJCQkJCQkgICBzX2JpZ19yYW1fZGVmc1tpXS5ncmNfcGFyYW0pOworCWlmIChtZW1fZ3JvdXBfaWQgPT0gTUVNX0dST1VQX1BYUF9JTFQgfHwgbWVtX2dyb3VwX2lkID09CisJICAgIE1FTV9HUk9VUF9QWFBfTUVNKQorCQlyZXR1cm4gcWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sIERCR19HUkNfUEFSQU1fRFVNUF9QWFApOworCWlmIChtZW1fZ3JvdXBfaWQgPT0gTUVNX0dST1VQX1JBTSkKKwkJcmV0dXJuIHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLCBEQkdfR1JDX1BBUkFNX0RVTVBfUkFNKTsKKwlpZiAobWVtX2dyb3VwX2lkID09IE1FTV9HUk9VUF9QQlVGKQorCQlyZXR1cm4gcWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sIERCR19HUkNfUEFSQU1fRFVNUF9QQlVGKTsKKwlpZiAobWVtX2dyb3VwX2lkID09IE1FTV9HUk9VUF9DQVVfTUVNIHx8CisJICAgIG1lbV9ncm91cF9pZCA9PSBNRU1fR1JPVVBfQ0FVX1NCIHx8CisJICAgIG1lbV9ncm91cF9pZCA9PSBNRU1fR1JPVVBfQ0FVX1BJKQorCQlyZXR1cm4gcWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sIERCR19HUkNfUEFSQU1fRFVNUF9DQVUpOworCWlmIChtZW1fZ3JvdXBfaWQgPT0gTUVNX0dST1VQX1FNX01FTSkKKwkJcmV0dXJuIHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLCBEQkdfR1JDX1BBUkFNX0RVTVBfUU0pOworCWlmIChtZW1fZ3JvdXBfaWQgPT0gTUVNX0dST1VQX0NPTk5fQ0ZDX01FTSB8fAorCSAgICBtZW1fZ3JvdXBfaWQgPT0gTUVNX0dST1VQX1RBU0tfQ0ZDX01FTSkKKwkJcmV0dXJuIHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLCBEQkdfR1JDX1BBUkFNX0RVTVBfQ0ZDKTsKKwlpZiAobWVtX2dyb3VwX2lkID09IE1FTV9HUk9VUF9JR1VfTUVNIHx8IG1lbV9ncm91cF9pZCA9PQorCSAgICBNRU1fR1JPVVBfSUdVX01TSVgpCisJCXJldHVybiBxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwgREJHX0dSQ19QQVJBTV9EVU1QX0lHVSk7CisJaWYgKG1lbV9ncm91cF9pZCA9PSBNRU1fR1JPVVBfTVVMRF9NRU0pCisJCXJldHVybiBxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwgREJHX0dSQ19QQVJBTV9EVU1QX01VTEQpOworCWlmIChtZW1fZ3JvdXBfaWQgPT0gTUVNX0dST1VQX1BSU19NRU0pCisJCXJldHVybiBxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwgREJHX0dSQ19QQVJBTV9EVU1QX1BSUyk7CisJaWYgKG1lbV9ncm91cF9pZCA9PSBNRU1fR1JPVVBfRE1BRV9NRU0pCisJCXJldHVybiBxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwgREJHX0dSQ19QQVJBTV9EVU1QX0RNQUUpOworCWlmIChtZW1fZ3JvdXBfaWQgPT0gTUVNX0dST1VQX1RNX01FTSkKKwkJcmV0dXJuIHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLCBEQkdfR1JDX1BBUkFNX0RVTVBfVE0pOworCWlmIChtZW1fZ3JvdXBfaWQgPT0gTUVNX0dST1VQX1NETV9NRU0pCisJCXJldHVybiBxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwgREJHX0dSQ19QQVJBTV9EVU1QX1NETSk7CisJaWYgKG1lbV9ncm91cF9pZCA9PSBNRU1fR1JPVVBfVERJRl9DVFggfHwgbWVtX2dyb3VwX2lkID09CisJICAgIE1FTV9HUk9VUF9SRElGX0NUWCkKKwkJcmV0dXJuIHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLCBEQkdfR1JDX1BBUkFNX0RVTVBfRElGKTsKKwlpZiAobWVtX2dyb3VwX2lkID09IE1FTV9HUk9VUF9DTV9NRU0pCisJCXJldHVybiBxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwgREJHX0dSQ19QQVJBTV9EVU1QX0NNKTsKKwlpZiAobWVtX2dyb3VwX2lkID09IE1FTV9HUk9VUF9JT1IpCisJCXJldHVybiBxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwgREJHX0dSQ19QQVJBTV9EVU1QX0lPUik7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyogU3RhbGxzIGFsbCBTdG9ybXMgKi8KK3N0YXRpYyB2b2lkIHFlZF9ncmNfc3RhbGxfc3Rvcm1zKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIGJvb2wgc3RhbGwpCit7CisJdTggcmVnX3ZhbCA9IHN0YWxsID8gMSA6IDA7CisJdTggc3Rvcm1faWQ7CisKKwlmb3IgKHN0b3JtX2lkID0gMDsgc3Rvcm1faWQgPCBNQVhfREJHX1NUT1JNUzsgc3Rvcm1faWQrKykgeworCQlpZiAocWVkX2dyY19pc19zdG9ybV9pbmNsdWRlZChwX2h3Zm4sCisJCQkJCSAgICAgIChlbnVtIGRiZ19zdG9ybXMpc3Rvcm1faWQpKSB7CisJCQl1MzIgcmVnX2FkZHIgPQorCQkJICAgIHNfc3Rvcm1fZGVmc1tzdG9ybV9pZF0uc2VtX2Zhc3RfbWVtX2FkZHIgKworCQkJICAgIFNFTV9GQVNUX1JFR19TVEFMTF8wOworCisJCQlxZWRfd3IocF9od2ZuLCBwX3B0dCwgcmVnX2FkZHIsIHJlZ192YWwpOworCQl9CisJfQorCisJbXNsZWVwKFNUQUxMX0RFTEFZX01TKTsKK30KKworLyogVGFrZXMgYWxsIGJsb2NrcyBvdXQgb2YgcmVzZXQgKi8KK3N0YXRpYyB2b2lkIHFlZF9ncmNfdW5yZXNldF9ibG9ja3Moc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQoreworCXN0cnVjdCBkYmdfdG9vbHNfZGF0YSAqZGV2X2RhdGEgPSAmcF9od2ZuLT5kYmdfaW5mbzsKKwl1MzIgcmVnX3ZhbFtNQVhfREJHX1JFU0VUX1JFR1NdID0geyAwIH07CisJdTMyIGk7CisKKwkvKiBGaWxsIHJlc2V0IHJlZ3MgdmFsdWVzICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9CTE9DS19JRDsgaSsrKQorCQlpZiAoc19ibG9ja19kZWZzW2ldLT5oYXNfcmVzZXRfYml0ICYmIHNfYmxvY2tfZGVmc1tpXS0+dW5yZXNldCkKKwkJCXJlZ192YWxbc19ibG9ja19kZWZzW2ldLT5yZXNldF9yZWddIHw9CisJCQkgICAgQklUKHNfYmxvY2tfZGVmc1tpXS0+cmVzZXRfYml0X29mZnNldCk7CisKKwkvKiBXcml0ZSByZXNldCByZWdpc3RlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0RCR19SRVNFVF9SRUdTOyBpKyspIHsKKwkJaWYgKHNfcmVzZXRfcmVnc19kZWZzW2ldLmV4aXN0c1tkZXZfZGF0YS0+Y2hpcF9pZF0pIHsKKwkJCXJlZ192YWxbaV0gfD0gc19yZXNldF9yZWdzX2RlZnNbaV0udW5yZXNldF92YWw7CisJCQlpZiAocmVnX3ZhbFtpXSkKKwkJCQlxZWRfd3IocF9od2ZuLAorCQkJCSAgICAgICBwX3B0dCwKKwkJCQkgICAgICAgc19yZXNldF9yZWdzX2RlZnNbaV0uYWRkciArCisJCQkJICAgICAgIFJFU0VUX1JFR19VTlJFU0VUX09GRlNFVCwgcmVnX3ZhbFtpXSk7CisJCX0KKwl9Cit9CisKKy8qIFJldHVybnMgdGhlIGF0dGVudGlvbiBuYW1lIG9mZnNldHMgb2YgdGhlIHNwZWNpZmllZCBibG9jayAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBkYmdfYXR0bl9ibG9ja190eXBlX2RhdGEgKgorcWVkX2dldF9ibG9ja19hdHRuX2RhdGEoZW51bSBibG9ja19pZCBibG9ja19pZCwgZW51bSBkYmdfYXR0bl90eXBlIGF0dG5fdHlwZSkKK3sKKwljb25zdCBzdHJ1Y3QgZGJnX2F0dG5fYmxvY2sgKmJhc2VfYXR0bl9ibG9ja19hcnIgPQorCQkoY29uc3Qgc3RydWN0IGRiZ19hdHRuX2Jsb2NrICopCisJCXNfZGJnX2FycmF5c1tCSU5fQlVGX0RCR19BVFROX0JMT0NLU10ucHRyOworCisJcmV0dXJuICZiYXNlX2F0dG5fYmxvY2tfYXJyW2Jsb2NrX2lkXS5wZXJfdHlwZV9kYXRhW2F0dG5fdHlwZV07Cit9CisKKy8qIFJldHVybnMgdGhlIGF0dGVudGlvbiByZWdpc3RlcnMgb2YgdGhlIHNwZWNpZmllZCBibG9jayAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBkYmdfYXR0bl9yZWcgKgorcWVkX2dldF9ibG9ja19hdHRuX3JlZ3MoZW51bSBibG9ja19pZCBibG9ja19pZCwgZW51bSBkYmdfYXR0bl90eXBlIGF0dG5fdHlwZSwKKwkJCXU4ICpudW1fYXR0bl9yZWdzKQoreworCWNvbnN0IHN0cnVjdCBkYmdfYXR0bl9ibG9ja190eXBlX2RhdGEgKmJsb2NrX3R5cGVfZGF0YSA9CisJCXFlZF9nZXRfYmxvY2tfYXR0bl9kYXRhKGJsb2NrX2lkLCBhdHRuX3R5cGUpOworCisJKm51bV9hdHRuX3JlZ3MgPSBibG9ja190eXBlX2RhdGEtPm51bV9yZWdzOworCXJldHVybiAmKChjb25zdCBzdHJ1Y3QgZGJnX2F0dG5fcmVnICopCisJCSBzX2RiZ19hcnJheXNbQklOX0JVRl9EQkdfQVRUTl9SRUdTXS5wdHIpW2Jsb2NrX3R5cGVfZGF0YS0+CisJCQkJCQkJICByZWdzX29mZnNldF07Cit9CisKKy8qIEZvciBlYWNoIGJsb2NrLCBjbGVhciB0aGUgc3RhdHVzIG9mIGFsbCBwYXJpdGllcyAqLworc3RhdGljIHZvaWQgcWVkX2dyY19jbGVhcl9hbGxfcHJ0eShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCit7CisJc3RydWN0IGRiZ190b29sc19kYXRhICpkZXZfZGF0YSA9ICZwX2h3Zm4tPmRiZ19pbmZvOworCXU4IHJlZ19pZHgsIG51bV9hdHRuX3JlZ3M7CisJdTMyIGJsb2NrX2lkOworCisJZm9yIChibG9ja19pZCA9IDA7IGJsb2NrX2lkIDwgTUFYX0JMT0NLX0lEOyBibG9ja19pZCsrKSB7CisJCWNvbnN0IHN0cnVjdCBkYmdfYXR0bl9yZWcgKmF0dG5fcmVnX2FycjsKKworCQlpZiAoZGV2X2RhdGEtPmJsb2NrX2luX3Jlc2V0W2Jsb2NrX2lkXSkKKwkJCWNvbnRpbnVlOworCisJCWF0dG5fcmVnX2FyciA9IHFlZF9nZXRfYmxvY2tfYXR0bl9yZWdzKChlbnVtIGJsb2NrX2lkKWJsb2NrX2lkLAorCQkJCQkJICAgICAgIEFUVE5fVFlQRV9QQVJJVFksCisJCQkJCQkgICAgICAgJm51bV9hdHRuX3JlZ3MpOworCQlmb3IgKHJlZ19pZHggPSAwOyByZWdfaWR4IDwgbnVtX2F0dG5fcmVnczsgcmVnX2lkeCsrKSB7CisJCQljb25zdCBzdHJ1Y3QgZGJnX2F0dG5fcmVnICpyZWdfZGF0YSA9CisJCQkJJmF0dG5fcmVnX2FycltyZWdfaWR4XTsKKworCQkJLyogQ2hlY2sgbW9kZSAqLworCQkJYm9vbCBldmFsX21vZGUgPSBHRVRfRklFTEQocmVnX2RhdGEtPm1vZGUuZGF0YSwKKwkJCQkJCSAgIERCR19NT0RFX0hEUl9FVkFMX01PREUpID4gMDsKKwkJCXUxNiBtb2Rlc19idWZfb2Zmc2V0ID0KKwkJCQlHRVRfRklFTEQocmVnX2RhdGEtPm1vZGUuZGF0YSwKKwkJCQkJICBEQkdfTU9ERV9IRFJfTU9ERVNfQlVGX09GRlNFVCk7CisKKwkJCWlmICghZXZhbF9tb2RlIHx8CisJCQkgICAgcWVkX2lzX21vZGVfbWF0Y2gocF9od2ZuLCAmbW9kZXNfYnVmX29mZnNldCkpCisJCQkJLyogTW9kZSBtYXRjaCAtIHJlYWQgcGFyaXR5IHN0YXR1cyByZWFkLWNsZWFyCisJCQkJICogcmVnaXN0ZXIuCisJCQkJICovCisJCQkJcWVkX3JkKHBfaHdmbiwgcF9wdHQsCisJCQkJICAgICAgIERXT1JEU19UT19CWVRFUyhyZWdfZGF0YS0+CisJCQkJCQkgICAgICAgc3RzX2Nscl9hZGRyZXNzKSk7CisJCX0KKwl9Cit9CisKKy8qIER1bXBzIEdSQyByZWdpc3RlcnMgc2VjdGlvbiBoZWFkZXIuIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4KKyAqIFRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgZHVtcGVkOgorICogLSAnY291bnQnID0gbnVtX2R1bXBlZF9lbnRyaWVzCisgKiAtICdzcGxpdCcgPSBzcGxpdF90eXBlCisgKiAtICdpZCdpID0gc3BsaXRfaWQgKGR1bXBlZCBvbmx5IGlmIHNwbGl0X2lkID49IDApCisgKiAtICdwYXJhbV9uYW1lJyA9IHBhcmFtX3ZhbCAodXNlciBwYXJhbSwgZHVtcGVkIG9ubHkgaWYgcGFyYW1fbmFtZSAhPSBOVUxMIGFuZAorICoJcGFyYW1fdmFsICE9IE5VTEwpCisgKi8KK3N0YXRpYyB1MzIgcWVkX2dyY19kdW1wX3JlZ3NfaGRyKHUzMiAqZHVtcF9idWYsCisJCQkJIGJvb2wgZHVtcCwKKwkJCQkgdTMyIG51bV9yZWdfZW50cmllcywKKwkJCQkgY29uc3QgY2hhciAqc3BsaXRfdHlwZSwKKwkJCQkgaW50IHNwbGl0X2lkLAorCQkJCSBjb25zdCBjaGFyICpwYXJhbV9uYW1lLCBjb25zdCBjaGFyICpwYXJhbV92YWwpCit7CisJdTggbnVtX3BhcmFtcyA9IDIgKyAoc3BsaXRfaWQgPj0gMCA/IDEgOiAwKSArIChwYXJhbV9uYW1lID8gMSA6IDApOworCXUzMiBvZmZzZXQgPSAwOworCisJb2Zmc2V0ICs9IHFlZF9kdW1wX3NlY3Rpb25faGRyKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgICBkdW1wLCAiZ3JjX3JlZ3MiLCBudW1fcGFyYW1zKTsKKwlvZmZzZXQgKz0gcWVkX2R1bXBfbnVtX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgZHVtcCwgImNvdW50IiwgbnVtX3JlZ19lbnRyaWVzKTsKKwlvZmZzZXQgKz0gcWVkX2R1bXBfc3RyX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgZHVtcCwgInNwbGl0Iiwgc3BsaXRfdHlwZSk7CisJaWYgKHNwbGl0X2lkID49IDApCisJCW9mZnNldCArPSBxZWRfZHVtcF9udW1fcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCSAgICAgZHVtcCwgImlkIiwgc3BsaXRfaWQpOworCWlmIChwYXJhbV9uYW1lICYmIHBhcmFtX3ZhbCkKKwkJb2Zmc2V0ICs9IHFlZF9kdW1wX3N0cl9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJICAgICBkdW1wLCBwYXJhbV9uYW1lLCBwYXJhbV92YWwpOworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qIER1bXBzIEdSQyByZWdpc3Rlci9tZW1vcnkuIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4gKi8KK3N0YXRpYyB1MzIgcWVkX2dyY19kdW1wX3JlZ19lbnRyeShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgdTMyICpkdW1wX2J1ZiwKKwkJCQkgIGJvb2wgZHVtcCwgdTMyIGFkZHIsIHUzMiBsZW4pCit7CisJdTMyIG9mZnNldCA9IDAsIGk7CisKKwlpZiAoZHVtcCkgeworCQkqKGR1bXBfYnVmICsgb2Zmc2V0KyspID0gYWRkciB8IChsZW4gPDwgUkVHX0RVTVBfTEVOX1NISUZUKTsKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrLCBhZGRyKyssIG9mZnNldCsrKQorCQkJKihkdW1wX2J1ZiArIG9mZnNldCkgPSBxZWRfcmQocF9od2ZuLAorCQkJCQkJICAgICAgcF9wdHQsCisJCQkJCQkgICAgICBEV09SRFNfVE9fQllURVMoYWRkcikpOworCX0gZWxzZSB7CisJCW9mZnNldCArPSBsZW4gKyAxOworCX0KKworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qIER1bXBzIEdSQyByZWdpc3RlcnMgZW50cmllcy4gUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLiAqLworc3RhdGljIHUzMiBxZWRfZ3JjX2R1bXBfcmVnc19lbnRyaWVzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSAgICAgc3RydWN0IGRiZ19hcnJheSBpbnB1dF9yZWdzX2FyciwKKwkJCQkgICAgIHUzMiAqZHVtcF9idWYsCisJCQkJICAgICBib29sIGR1bXAsCisJCQkJICAgICBib29sIGJsb2NrX2VuYWJsZVtNQVhfQkxPQ0tfSURdLAorCQkJCSAgICAgdTMyICpudW1fZHVtcGVkX3JlZ19lbnRyaWVzKQoreworCXUzMiBpLCBvZmZzZXQgPSAwLCBpbnB1dF9vZmZzZXQgPSAwOworCWJvb2wgbW9kZV9tYXRjaCA9IHRydWU7CisKKwkqbnVtX2R1bXBlZF9yZWdfZW50cmllcyA9IDA7CisJd2hpbGUgKGlucHV0X29mZnNldCA8IGlucHV0X3JlZ3NfYXJyLnNpemVfaW5fZHdvcmRzKSB7CisJCWNvbnN0IHN0cnVjdCBkYmdfZHVtcF9jb25kX2hkciAqY29uZF9oZHIgPQorCQkgICAgKGNvbnN0IHN0cnVjdCBkYmdfZHVtcF9jb25kX2hkciAqKQorCQkgICAgJmlucHV0X3JlZ3NfYXJyLnB0cltpbnB1dF9vZmZzZXQrK107CisJCWJvb2wgZXZhbF9tb2RlID0gR0VUX0ZJRUxEKGNvbmRfaGRyLT5tb2RlLmRhdGEsCisJCQkJCSAgIERCR19NT0RFX0hEUl9FVkFMX01PREUpID4gMDsKKworCQkvKiBDaGVjayBtb2RlL2Jsb2NrICovCisJCWlmIChldmFsX21vZGUpIHsKKwkJCXUxNiBtb2Rlc19idWZfb2Zmc2V0ID0KKwkJCQlHRVRfRklFTEQoY29uZF9oZHItPm1vZGUuZGF0YSwKKwkJCQkJICBEQkdfTU9ERV9IRFJfTU9ERVNfQlVGX09GRlNFVCk7CisJCQltb2RlX21hdGNoID0gcWVkX2lzX21vZGVfbWF0Y2gocF9od2ZuLAorCQkJCQkJICAgICAgICZtb2Rlc19idWZfb2Zmc2V0KTsKKwkJfQorCisJCWlmIChtb2RlX21hdGNoICYmIGJsb2NrX2VuYWJsZVtjb25kX2hkci0+YmxvY2tfaWRdKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgY29uZF9oZHItPmRhdGFfc2l6ZTsKKwkJCSAgICAgaSsrLCBpbnB1dF9vZmZzZXQrKykgeworCQkJCWNvbnN0IHN0cnVjdCBkYmdfZHVtcF9yZWcgKnJlZyA9CisJCQkJICAgIChjb25zdCBzdHJ1Y3QgZGJnX2R1bXBfcmVnICopCisJCQkJICAgICZpbnB1dF9yZWdzX2Fyci5wdHJbaW5wdXRfb2Zmc2V0XTsKKworCQkJCW9mZnNldCArPQorCQkJCQlxZWRfZ3JjX2R1bXBfcmVnX2VudHJ5KHBfaHdmbiwgcF9wdHQsCisJCQkJCQkgICAgZHVtcF9idWYgKyBvZmZzZXQsIGR1bXAsCisJCQkJCQkgICAgR0VUX0ZJRUxEKHJlZy0+ZGF0YSwKKwkJCQkJCQlEQkdfRFVNUF9SRUdfQUREUkVTUyksCisJCQkJCQkgICAgR0VUX0ZJRUxEKHJlZy0+ZGF0YSwKKwkJCQkJCQlEQkdfRFVNUF9SRUdfTEVOR1RIKSk7CisJCQkJKCpudW1fZHVtcGVkX3JlZ19lbnRyaWVzKSsrOworCQkJfQorCQl9IGVsc2UgeworCQkJaW5wdXRfb2Zmc2V0ICs9IGNvbmRfaGRyLT5kYXRhX3NpemU7CisJCX0KKwl9CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKiBEdW1wcyBHUkMgcmVnaXN0ZXJzIGVudHJpZXMuIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4gKi8KK3N0YXRpYyB1MzIgcWVkX2dyY19kdW1wX3NwbGl0X2RhdGEoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSAgIHN0cnVjdCBkYmdfYXJyYXkgaW5wdXRfcmVnc19hcnIsCisJCQkJICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkgICBib29sIGR1bXAsCisJCQkJICAgYm9vbCBibG9ja19lbmFibGVbTUFYX0JMT0NLX0lEXSwKKwkJCQkgICBjb25zdCBjaGFyICpzcGxpdF90eXBlX25hbWUsCisJCQkJICAgdTMyIHNwbGl0X2lkLAorCQkJCSAgIGNvbnN0IGNoYXIgKnBhcmFtX25hbWUsCisJCQkJICAgY29uc3QgY2hhciAqcGFyYW1fdmFsKQoreworCXUzMiBudW1fZHVtcGVkX3JlZ19lbnRyaWVzLCBvZmZzZXQ7CisKKwkvKiBDYWxjdWxhdGUgcmVnaXN0ZXIgZHVtcCBoZWFkZXIgc2l6ZSAoYW5kIHNraXAgaXQgZm9yIG5vdykgKi8KKwlvZmZzZXQgPSBxZWRfZ3JjX2R1bXBfcmVnc19oZHIoZHVtcF9idWYsCisJCQkJICAgICAgIGZhbHNlLAorCQkJCSAgICAgICAwLAorCQkJCSAgICAgICBzcGxpdF90eXBlX25hbWUsCisJCQkJICAgICAgIHNwbGl0X2lkLCBwYXJhbV9uYW1lLCBwYXJhbV92YWwpOworCisJLyogRHVtcCByZWdpc3RlcnMgKi8KKwlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX3JlZ3NfZW50cmllcyhwX2h3Zm4sCisJCQkJCSAgICBwX3B0dCwKKwkJCQkJICAgIGlucHV0X3JlZ3NfYXJyLAorCQkJCQkgICAgZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCSAgICBkdW1wLAorCQkJCQkgICAgYmxvY2tfZW5hYmxlLAorCQkJCQkgICAgJm51bV9kdW1wZWRfcmVnX2VudHJpZXMpOworCisJLyogV3JpdGUgcmVnaXN0ZXIgZHVtcCBoZWFkZXIgKi8KKwlpZiAoZHVtcCAmJiBudW1fZHVtcGVkX3JlZ19lbnRyaWVzID4gMCkKKwkJcWVkX2dyY19kdW1wX3JlZ3NfaGRyKGR1bXBfYnVmLAorCQkJCSAgICAgIGR1bXAsCisJCQkJICAgICAgbnVtX2R1bXBlZF9yZWdfZW50cmllcywKKwkJCQkgICAgICBzcGxpdF90eXBlX25hbWUsCisJCQkJICAgICAgc3BsaXRfaWQsIHBhcmFtX25hbWUsIHBhcmFtX3ZhbCk7CisKKwlyZXR1cm4gbnVtX2R1bXBlZF9yZWdfZW50cmllcyA+IDAgPyBvZmZzZXQgOiAwOworfQorCisvKiBEdW1wcyByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIHRoZSBpbnB1dCByZWdpc3RlcnMgYXJyYXkuCisgKiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuCisgKi8KK3N0YXRpYyB1MzIgcWVkX2dyY19kdW1wX3JlZ2lzdGVycyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgIHUzMiAqZHVtcF9idWYsCisJCQkJICBib29sIGR1bXAsCisJCQkJICBib29sIGJsb2NrX2VuYWJsZVtNQVhfQkxPQ0tfSURdLAorCQkJCSAgY29uc3QgY2hhciAqcGFyYW1fbmFtZSwgY29uc3QgY2hhciAqcGFyYW1fdmFsKQoreworCXN0cnVjdCBkYmdfdG9vbHNfZGF0YSAqZGV2X2RhdGEgPSAmcF9od2ZuLT5kYmdfaW5mbzsKKwl1MzIgb2Zmc2V0ID0gMCwgaW5wdXRfb2Zmc2V0ID0gMDsKKwl1OCBwb3J0X2lkLCBwZl9pZDsKKworCWlmIChkdW1wKQorCQlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19ERUJVRywgIkR1bXBpbmcgcmVnaXN0ZXJzLi4uXG4iKTsKKwl3aGlsZSAoaW5wdXRfb2Zmc2V0IDwKKwkgICAgICAgc19kYmdfYXJyYXlzW0JJTl9CVUZfREJHX0RVTVBfUkVHXS5zaXplX2luX2R3b3JkcykgeworCQljb25zdCBzdHJ1Y3QgZGJnX2R1bXBfc3BsaXRfaGRyICpzcGxpdF9oZHIgPQorCQkJKGNvbnN0IHN0cnVjdCBkYmdfZHVtcF9zcGxpdF9oZHIgKikKKwkJCSZzX2RiZ19hcnJheXNbQklOX0JVRl9EQkdfRFVNUF9SRUddLnB0cltpbnB1dF9vZmZzZXQrK107CisJCXU4IHNwbGl0X3R5cGVfaWQgPSBHRVRfRklFTEQoc3BsaXRfaGRyLT5oZHIsCisJCQkJCSAgICAgREJHX0RVTVBfU1BMSVRfSERSX1NQTElUX1RZUEVfSUQpOworCQl1MzIgc3BsaXRfZGF0YV9zaXplID0gR0VUX0ZJRUxEKHNwbGl0X2hkci0+aGRyLAorCQkJCQkJREJHX0RVTVBfU1BMSVRfSERSX0RBVEFfU0laRSk7CisJCXN0cnVjdCBkYmdfYXJyYXkgY3Vycl9pbnB1dF9yZWdzX2FyciA9IHsKKwkJCSZzX2RiZ19hcnJheXNbQklOX0JVRl9EQkdfRFVNUF9SRUddLnB0cltpbnB1dF9vZmZzZXRdLAorCQkJc3BsaXRfZGF0YV9zaXplfTsKKworCQlzd2l0Y2ggKHNwbGl0X3R5cGVfaWQpIHsKKwkJY2FzZSBTUExJVF9UWVBFX05PTkU6CisJCWNhc2UgU1BMSVRfVFlQRV9WRjoKKwkJCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfc3BsaXRfZGF0YShwX2h3Zm4sCisJCQkJCQkJICBwX3B0dCwKKwkJCQkJCQkgIGN1cnJfaW5wdXRfcmVnc19hcnIsCisJCQkJCQkJICBkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJCQkgIGR1bXAsCisJCQkJCQkJICBibG9ja19lbmFibGUsCisJCQkJCQkJICAiZW5nIiwKKwkJCQkJCQkgICh1MzIpKC0xKSwKKwkJCQkJCQkgIHBhcmFtX25hbWUsCisJCQkJCQkJICBwYXJhbV92YWwpOworCQkJYnJlYWs7CisJCWNhc2UgU1BMSVRfVFlQRV9QT1JUOgorCQkJZm9yIChwb3J0X2lkID0gMDsKKwkJCSAgICAgcG9ydF9pZCA8CisJCQkgICAgIHNfY2hpcF9kZWZzW2Rldl9kYXRhLT5jaGlwX2lkXS4KKwkJCSAgICAgcGVyX3BsYXRmb3JtW2Rldl9kYXRhLT5wbGF0Zm9ybV9pZF0ubnVtX3BvcnRzOworCQkJICAgICBwb3J0X2lkKyspIHsKKwkJCQlpZiAoZHVtcCkKKwkJCQkJcWVkX3BvcnRfcHJldGVuZChwX2h3Zm4sIHBfcHR0LAorCQkJCQkJCSBwb3J0X2lkKTsKKwkJCQlvZmZzZXQgKz0KKwkJCQkgICAgcWVkX2dyY19kdW1wX3NwbGl0X2RhdGEocF9od2ZuLCBwX3B0dCwKKwkJCQkJCQkgICAgY3Vycl9pbnB1dF9yZWdzX2FyciwKKwkJCQkJCQkgICAgZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCQkJICAgIGR1bXAsIGJsb2NrX2VuYWJsZSwKKwkJCQkJCQkgICAgInBvcnQiLCBwb3J0X2lkLAorCQkJCQkJCSAgICBwYXJhbV9uYW1lLAorCQkJCQkJCSAgICBwYXJhbV92YWwpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU1BMSVRfVFlQRV9QRjoKKwkJY2FzZSBTUExJVF9UWVBFX1BPUlRfUEY6CisJCQlmb3IgKHBmX2lkID0gMDsKKwkJCSAgICAgcGZfaWQgPAorCQkJICAgICBzX2NoaXBfZGVmc1tkZXZfZGF0YS0+Y2hpcF9pZF0uCisJCQkgICAgIHBlcl9wbGF0Zm9ybVtkZXZfZGF0YS0+cGxhdGZvcm1faWRdLm51bV9wZnM7CisJCQkgICAgIHBmX2lkKyspIHsKKwkJCQlpZiAoZHVtcCkKKwkJCQkJcWVkX2ZpZF9wcmV0ZW5kKHBfaHdmbiwgcF9wdHQsIHBmX2lkKTsKKwkJCQlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX3NwbGl0X2RhdGEocF9od2ZuLAorCQkJCQkJCXBfcHR0LAorCQkJCQkJCWN1cnJfaW5wdXRfcmVnc19hcnIsCisJCQkJCQkJZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCQkJZHVtcCwgYmxvY2tfZW5hYmxlLAorCQkJCQkJCSJwZiIsIHBmX2lkLCBwYXJhbV9uYW1lLAorCQkJCQkJCXBhcmFtX3ZhbCk7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJaW5wdXRfb2Zmc2V0ICs9IHNwbGl0X2RhdGFfc2l6ZTsKKwl9CisKKwkvKiBQcmV0ZW5kIHRvIG9yaWdpbmFsIFBGICovCisJaWYgKGR1bXApCisJCXFlZF9maWRfcHJldGVuZChwX2h3Zm4sIHBfcHR0LCBwX2h3Zm4tPnJlbF9wZl9pZCk7CisJcmV0dXJuIG9mZnNldDsKK30KKworLyogRHVtcCByZXNldCByZWdpc3RlcnMuIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4gKi8KK3N0YXRpYyB1MzIgcWVkX2dyY19kdW1wX3Jlc2V0X3JlZ3Moc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSAgIHUzMiAqZHVtcF9idWYsIGJvb2wgZHVtcCkKK3sKKwlzdHJ1Y3QgZGJnX3Rvb2xzX2RhdGEgKmRldl9kYXRhID0gJnBfaHdmbi0+ZGJnX2luZm87CisJdTMyIGksIG9mZnNldCA9IDAsIG51bV9yZWdzID0gMDsKKworCS8qIENhbGN1bGF0ZSBoZWFkZXIgc2l6ZSAqLworCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfcmVnc19oZHIoZHVtcF9idWYsCisJCQkJCWZhbHNlLCAwLCAiZW5nIiwgLTEsIE5VTEwsIE5VTEwpOworCisJLyogV3JpdGUgcmVzZXQgcmVnaXN0ZXJzICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9EQkdfUkVTRVRfUkVHUzsgaSsrKSB7CisJCWlmIChzX3Jlc2V0X3JlZ3NfZGVmc1tpXS5leGlzdHNbZGV2X2RhdGEtPmNoaXBfaWRdKSB7CisJCQlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX3JlZ19lbnRyeShwX2h3Zm4sCisJCQkJCQkJIHBfcHR0LAorCQkJCQkJCSBkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJCQkgZHVtcCwKKwkJCQkJCQkgQllURVNfVE9fRFdPUkRTCisJCQkJCQkJIChzX3Jlc2V0X3JlZ3NfZGVmcworCQkJCQkJCSAgW2ldLmFkZHIpLCAxKTsKKwkJCW51bV9yZWdzKys7CisJCX0KKwl9CisKKwkvKiBXcml0ZSBoZWFkZXIgKi8KKwlpZiAoZHVtcCkKKwkJcWVkX2dyY19kdW1wX3JlZ3NfaGRyKGR1bXBfYnVmLAorCQkJCSAgICAgIHRydWUsIG51bV9yZWdzLCAiZW5nIiwgLTEsIE5VTEwsIE5VTEwpOworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qIER1bXAgcmVnaXN0ZXJzIHRoYXQgYXJlIG1vZGlmaWVkIGR1cmluZyBHUkMgRHVtcCBhbmQgdGhlcmVmb3JlIG11c3QgYmUgZHVtcGVkCisgKiBmaXJzdC4gUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLgorICovCitzdGF0aWMgdTMyIHFlZF9ncmNfZHVtcF9tb2RpZmllZF9yZWdzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgICAgICB1MzIgKmR1bXBfYnVmLCBib29sIGR1bXApCit7CisJc3RydWN0IGRiZ190b29sc19kYXRhICpkZXZfZGF0YSA9ICZwX2h3Zm4tPmRiZ19pbmZvOworCXUzMiBvZmZzZXQgPSAwLCBudW1fcmVnX2VudHJpZXMgPSAwLCBibG9ja19pZDsKKwl1OCBzdG9ybV9pZCwgcmVnX2lkeCwgbnVtX2F0dG5fcmVnczsKKworCS8qIENhbGN1bGF0ZSBoZWFkZXIgc2l6ZSAqLworCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfcmVnc19oZHIoZHVtcF9idWYsCisJCQkJCWZhbHNlLCAwLCAiZW5nIiwgLTEsIE5VTEwsIE5VTEwpOworCisJLyogV3JpdGUgcGFyaXR5IHJlZ2lzdGVycyAqLworCWZvciAoYmxvY2tfaWQgPSAwOyBibG9ja19pZCA8IE1BWF9CTE9DS19JRDsgYmxvY2tfaWQrKykgeworCQljb25zdCBzdHJ1Y3QgZGJnX2F0dG5fcmVnICphdHRuX3JlZ19hcnI7CisKKwkJaWYgKGRldl9kYXRhLT5ibG9ja19pbl9yZXNldFtibG9ja19pZF0gJiYgZHVtcCkKKwkJCWNvbnRpbnVlOworCisJCWF0dG5fcmVnX2FyciA9IHFlZF9nZXRfYmxvY2tfYXR0bl9yZWdzKChlbnVtIGJsb2NrX2lkKWJsb2NrX2lkLAorCQkJCQkJICAgICAgIEFUVE5fVFlQRV9QQVJJVFksCisJCQkJCQkgICAgICAgJm51bV9hdHRuX3JlZ3MpOworCQlmb3IgKHJlZ19pZHggPSAwOyByZWdfaWR4IDwgbnVtX2F0dG5fcmVnczsgcmVnX2lkeCsrKSB7CisJCQljb25zdCBzdHJ1Y3QgZGJnX2F0dG5fcmVnICpyZWdfZGF0YSA9CisJCQkJJmF0dG5fcmVnX2FycltyZWdfaWR4XTsKKwkJCXUxNiBtb2Rlc19idWZfb2Zmc2V0OworCQkJYm9vbCBldmFsX21vZGU7CisKKwkJCS8qIENoZWNrIG1vZGUgKi8KKwkJCWV2YWxfbW9kZSA9IEdFVF9GSUVMRChyZWdfZGF0YS0+bW9kZS5kYXRhLAorCQkJCQkgICAgICBEQkdfTU9ERV9IRFJfRVZBTF9NT0RFKSA+IDA7CisJCQltb2Rlc19idWZfb2Zmc2V0ID0KKwkJCQlHRVRfRklFTEQocmVnX2RhdGEtPm1vZGUuZGF0YSwKKwkJCQkJICBEQkdfTU9ERV9IRFJfTU9ERVNfQlVGX09GRlNFVCk7CisJCQlpZiAoIWV2YWxfbW9kZSB8fAorCQkJICAgIHFlZF9pc19tb2RlX21hdGNoKHBfaHdmbiwgJm1vZGVzX2J1Zl9vZmZzZXQpKSB7CisJCQkJLyogTW9kZSBtYXRjaCAtIHJlYWQgYW5kIGR1bXAgcmVnaXN0ZXJzICovCisJCQkJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9yZWdfZW50cnkocF9od2ZuLAorCQkJCQkJCXBfcHR0LAorCQkJCQkJCWR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQkJCWR1bXAsCisJCQkJCQkJcmVnX2RhdGEtPm1hc2tfYWRkcmVzcywKKwkJCQkJCQkxKTsKKwkJCQlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX3JlZ19lbnRyeShwX2h3Zm4sCisJCQkJCQlwX3B0dCwKKwkJCQkJCWR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQkJZHVtcCwKKwkJCQkJCUdFVF9GSUVMRChyZWdfZGF0YS0+ZGF0YSwKKwkJCQkJCSAgICBEQkdfQVRUTl9SRUdfU1RTX0FERFJFU1MpLAorCQkJCQkJMSk7CisJCQkJbnVtX3JlZ19lbnRyaWVzICs9IDI7CisJCQl9CisJCX0KKwl9CisKKwkvKiBXcml0ZSBzdG9ybSBzdGFsbCBzdGF0dXMgcmVnaXN0ZXJzICovCisJZm9yIChzdG9ybV9pZCA9IDA7IHN0b3JtX2lkIDwgTUFYX0RCR19TVE9STVM7IHN0b3JtX2lkKyspIHsKKwkJaWYgKGRldl9kYXRhLT5ibG9ja19pbl9yZXNldFtzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLmJsb2NrX2lkXSAmJgorCQkgICAgZHVtcCkKKwkJCWNvbnRpbnVlOworCisJCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfcmVnX2VudHJ5KHBfaHdmbiwKKwkJCQkJcF9wdHQsCisJCQkJCWR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQlkdW1wLAorCQkJCQlCWVRFU19UT19EV09SRFMoc19zdG9ybV9kZWZzW3N0b3JtX2lkXS4KKwkJCQkJCQlzZW1fZmFzdF9tZW1fYWRkciArCisJCQkJCQkJU0VNX0ZBU1RfUkVHX1NUQUxMRUQpLAorCQkJCQkxKTsKKwkJbnVtX3JlZ19lbnRyaWVzKys7CisJfQorCisJLyogV3JpdGUgaGVhZGVyICovCisJaWYgKGR1bXApCisJCXFlZF9ncmNfZHVtcF9yZWdzX2hkcihkdW1wX2J1ZiwKKwkJCQkgICAgICB0cnVlLAorCQkJCSAgICAgIG51bV9yZWdfZW50cmllcywgImVuZyIsIC0xLCBOVUxMLCBOVUxMKTsKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKiBEdW1wcyBhIEdSQyBtZW1vcnkgaGVhZGVyIChzZWN0aW9uIGFuZCBwYXJhbXMpLgorICogVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSBkdW1wZWQ6CisgKiBuYW1lIC0gbmFtZSBpcyBkdW1wZWQgb25seSBpZiBpdCdzIG5vdCBOVUxMLgorICogYWRkciAtIGJ5dGVfYWRkciBpcyBkdW1wZWQgb25seSBpZiBuYW1lIGlzIE5VTEwuCisgKiBsZW4gLSBkd29yZF9sZW4gaXMgYWx3YXlzIGR1bXBlZC4KKyAqIHdpZHRoIC0gYml0X3dpZHRoIGlzIGR1bXBlZCBpZiBpdCdzIG5vdCB6ZXJvLgorICogcGFja2VkIC0gcGFja2VkPTEgaXMgZHVtcGVkIGlmIGl0J3Mgbm90IGZhbHNlLgorICogbWVtX2dyb3VwIC0gbWVtX2dyb3VwIGlzIGFsd2F5cyBkdW1wZWQuCisgKiBpc19zdG9ybSAtIHRydWUgb25seSBpZiB0aGUgbWVtb3J5IGlzIHJlbGF0ZWQgdG8gYSBTdG9ybS4KKyAqIHN0b3JtX2xldHRlciAtIHN0b3JtIGxldHRlciAodmFsaWQgb25seSBpZiBpc19zdG9ybSBpcyB0cnVlKS4KKyAqIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4KKyAqLworc3RhdGljIHUzMiBxZWRfZ3JjX2R1bXBfbWVtX2hkcihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQl1MzIgKmR1bXBfYnVmLAorCQkJCWJvb2wgZHVtcCwKKwkJCQljb25zdCBjaGFyICpuYW1lLAorCQkJCXUzMiBieXRlX2FkZHIsCisJCQkJdTMyIGR3b3JkX2xlbiwKKwkJCQl1MzIgYml0X3dpZHRoLAorCQkJCWJvb2wgcGFja2VkLAorCQkJCWNvbnN0IGNoYXIgKm1lbV9ncm91cCwKKwkJCQlib29sIGlzX3N0b3JtLCBjaGFyIHN0b3JtX2xldHRlcikKK3sKKwl1OCBudW1fcGFyYW1zID0gMzsKKwl1MzIgb2Zmc2V0ID0gMDsKKwljaGFyIGJ1Zls2NF07CisKKwlpZiAoIWR3b3JkX2xlbikKKwkJRFBfTk9USUNFKHBfaHdmbiwKKwkJCSAgIlVuZXhwZWN0ZWQgR1JDIER1bXAgZXJyb3I6IGR1bXBlZCBtZW1vcnkgc2l6ZSBtdXN0IGJlIG5vbi16ZXJvXG4iKTsKKwlpZiAoYml0X3dpZHRoKQorCQludW1fcGFyYW1zKys7CisJaWYgKHBhY2tlZCkKKwkJbnVtX3BhcmFtcysrOworCisJLyogRHVtcCBzZWN0aW9uIGhlYWRlciAqLworCW9mZnNldCArPSBxZWRfZHVtcF9zZWN0aW9uX2hkcihkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgICAgZHVtcCwgImdyY19tZW0iLCBudW1fcGFyYW1zKTsKKwlpZiAobmFtZSkgeworCQkvKiBEdW1wIG5hbWUgKi8KKwkJaWYgKGlzX3N0b3JtKSB7CisJCQlzdHJjcHkoYnVmLCAiP1NUT1JNXyIpOworCQkJYnVmWzBdID0gc3Rvcm1fbGV0dGVyOworCQkJc3RyY3B5KGJ1ZiArIHN0cmxlbihidWYpLCBuYW1lKTsKKwkJfSBlbHNlIHsKKwkJCXN0cmNweShidWYsIG5hbWUpOworCQl9CisKKwkJb2Zmc2V0ICs9IHFlZF9kdW1wX3N0cl9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJICAgICBkdW1wLCAibmFtZSIsIGJ1Zik7CisJCWlmIChkdW1wKQorCQkJRFBfVkVSQk9TRShwX2h3Zm4sCisJCQkJICAgUUVEX01TR19ERUJVRywKKwkJCQkgICAiRHVtcGluZyAlZCByZWdpc3RlcnMgZnJvbSAlcy4uLlxuIiwKKwkJCQkgICBkd29yZF9sZW4sIGJ1Zik7CisJfSBlbHNlIHsKKwkJLyogRHVtcCBhZGRyZXNzICovCisJCW9mZnNldCArPSBxZWRfZHVtcF9udW1fcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCSAgICAgZHVtcCwgImFkZHIiLCBieXRlX2FkZHIpOworCQlpZiAoZHVtcCAmJiBkd29yZF9sZW4gPiA2NCkKKwkJCURQX1ZFUkJPU0UocF9od2ZuLAorCQkJCSAgIFFFRF9NU0dfREVCVUcsCisJCQkJICAgIkR1bXBpbmcgJWQgcmVnaXN0ZXJzIGZyb20gYWRkcmVzcyAweCV4Li4uXG4iLAorCQkJCSAgIGR3b3JkX2xlbiwgYnl0ZV9hZGRyKTsKKwl9CisKKwkvKiBEdW1wIGxlbiAqLworCW9mZnNldCArPSBxZWRfZHVtcF9udW1fcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsIGR1bXAsICJsZW4iLCBkd29yZF9sZW4pOworCisJLyogRHVtcCBiaXQgd2lkdGggKi8KKwlpZiAoYml0X3dpZHRoKQorCQlvZmZzZXQgKz0gcWVkX2R1bXBfbnVtX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQkgICAgIGR1bXAsICJ3aWR0aCIsIGJpdF93aWR0aCk7CisKKwkvKiBEdW1wIHBhY2tlZCAqLworCWlmIChwYWNrZWQpCisJCW9mZnNldCArPSBxZWRfZHVtcF9udW1fcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCSAgICAgZHVtcCwgInBhY2tlZCIsIDEpOworCisJLyogRHVtcCByZWcgdHlwZSAqLworCWlmIChpc19zdG9ybSkgeworCQlzdHJjcHkoYnVmLCAiP1NUT1JNXyIpOworCQlidWZbMF0gPSBzdG9ybV9sZXR0ZXI7CisJCXN0cmNweShidWYgKyBzdHJsZW4oYnVmKSwgbWVtX2dyb3VwKTsKKwl9IGVsc2UgeworCQlzdHJjcHkoYnVmLCBtZW1fZ3JvdXApOworCX0KKworCW9mZnNldCArPSBxZWRfZHVtcF9zdHJfcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsIGR1bXAsICJ0eXBlIiwgYnVmKTsKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKiBEdW1wcyBhIHNpbmdsZSBHUkMgbWVtb3J5LiBJZiBuYW1lIGlzIE5VTEwsIHRoZSBtZW1vcnkgaXMgc3RvcmVkIGJ5IGFkZHJlc3MuCisgKiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuCisgKi8KK3N0YXRpYyB1MzIgcWVkX2dyY19kdW1wX21lbShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkgICAgdTMyICpkdW1wX2J1ZiwKKwkJCSAgICBib29sIGR1bXAsCisJCQkgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICB1MzIgYnl0ZV9hZGRyLAorCQkJICAgIHUzMiBkd29yZF9sZW4sCisJCQkgICAgdTMyIGJpdF93aWR0aCwKKwkJCSAgICBib29sIHBhY2tlZCwKKwkJCSAgICBjb25zdCBjaGFyICptZW1fZ3JvdXAsCisJCQkgICAgYm9vbCBpc19zdG9ybSwgY2hhciBzdG9ybV9sZXR0ZXIpCit7CisJdTMyIG9mZnNldCA9IDA7CisKKwlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX21lbV9oZHIocF9od2ZuLAorCQkJCSAgICAgICBkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgICAgZHVtcCwKKwkJCQkgICAgICAgbmFtZSwKKwkJCQkgICAgICAgYnl0ZV9hZGRyLAorCQkJCSAgICAgICBkd29yZF9sZW4sCisJCQkJICAgICAgIGJpdF93aWR0aCwKKwkJCQkgICAgICAgcGFja2VkLAorCQkJCSAgICAgICBtZW1fZ3JvdXAsIGlzX3N0b3JtLCBzdG9ybV9sZXR0ZXIpOworCWlmIChkdW1wKSB7CisJCXUzMiBpOworCisJCWZvciAoaSA9IDA7IGkgPCBkd29yZF9sZW47CisJCSAgICAgaSsrLCBieXRlX2FkZHIgKz0gQllURVNfSU5fRFdPUkQsIG9mZnNldCsrKQorCQkJKihkdW1wX2J1ZiArIG9mZnNldCkgPSBxZWRfcmQocF9od2ZuLCBwX3B0dCwgYnl0ZV9hZGRyKTsKKwl9IGVsc2UgeworCQlvZmZzZXQgKz0gZHdvcmRfbGVuOworCX0KKworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qIER1bXBzIEdSQyBtZW1vcmllcyBlbnRyaWVzLiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuICovCitzdGF0aWMgdTMyIHFlZF9ncmNfZHVtcF9tZW1fZW50cmllcyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSAgICBzdHJ1Y3QgZGJnX2FycmF5IGlucHV0X21lbXNfYXJyLAorCQkJCSAgICB1MzIgKmR1bXBfYnVmLCBib29sIGR1bXApCit7CisJdTMyIGksIG9mZnNldCA9IDAsIGlucHV0X29mZnNldCA9IDA7CisJYm9vbCBtb2RlX21hdGNoID0gdHJ1ZTsKKworCXdoaWxlIChpbnB1dF9vZmZzZXQgPCBpbnB1dF9tZW1zX2Fyci5zaXplX2luX2R3b3JkcykgeworCQljb25zdCBzdHJ1Y3QgZGJnX2R1bXBfY29uZF9oZHIgKmNvbmRfaGRyOworCQl1MzIgbnVtX2VudHJpZXM7CisJCWJvb2wgZXZhbF9tb2RlOworCisJCWNvbmRfaGRyID0gKGNvbnN0IHN0cnVjdCBkYmdfZHVtcF9jb25kX2hkciAqKQorCQkJICAgJmlucHV0X21lbXNfYXJyLnB0cltpbnB1dF9vZmZzZXQrK107CisJCWV2YWxfbW9kZSA9IEdFVF9GSUVMRChjb25kX2hkci0+bW9kZS5kYXRhLAorCQkJCSAgICAgIERCR19NT0RFX0hEUl9FVkFMX01PREUpID4gMDsKKworCQkvKiBDaGVjayByZXF1aXJlZCBtb2RlICovCisJCWlmIChldmFsX21vZGUpIHsKKwkJCXUxNiBtb2Rlc19idWZfb2Zmc2V0ID0KKwkJCQlHRVRfRklFTEQoY29uZF9oZHItPm1vZGUuZGF0YSwKKwkJCQkJICBEQkdfTU9ERV9IRFJfTU9ERVNfQlVGX09GRlNFVCk7CisKKwkJCW1vZGVfbWF0Y2ggPSBxZWRfaXNfbW9kZV9tYXRjaChwX2h3Zm4sCisJCQkJCQkgICAgICAgJm1vZGVzX2J1Zl9vZmZzZXQpOworCQl9CisKKwkJaWYgKCFtb2RlX21hdGNoKSB7CisJCQlpbnB1dF9vZmZzZXQgKz0gY29uZF9oZHItPmRhdGFfc2l6ZTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbnVtX2VudHJpZXMgPSBjb25kX2hkci0+ZGF0YV9zaXplIC8gTUVNX0RVTVBfRU5UUllfU0laRV9EV09SRFM7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fZW50cmllczsKKwkJICAgICBpKyssIGlucHV0X29mZnNldCArPSBNRU1fRFVNUF9FTlRSWV9TSVpFX0RXT1JEUykgeworCQkJY29uc3Qgc3RydWN0IGRiZ19kdW1wX21lbSAqbWVtID0KKwkJCQkoY29uc3Qgc3RydWN0IGRiZ19kdW1wX21lbSAqKQorCQkJCSZpbnB1dF9tZW1zX2Fyci5wdHJbaW5wdXRfb2Zmc2V0XTsKKwkJCXU4IG1lbV9ncm91cF9pZDsKKworCQkJbWVtX2dyb3VwX2lkID0gR0VUX0ZJRUxEKG1lbS0+ZHdvcmQwLAorCQkJCQkJIERCR19EVU1QX01FTV9NRU1fR1JPVVBfSUQpOworCQkJaWYgKG1lbV9ncm91cF9pZCA+PSBNRU1fR1JPVVBTX05VTSkgeworCQkJCURQX05PVElDRShwX2h3Zm4sICJJbnZhbGlkIG1lbV9ncm91cF9pZFxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCWlmIChxZWRfZ3JjX2lzX21lbV9pbmNsdWRlZChwX2h3Zm4sCisJCQkJCShlbnVtIGJsb2NrX2lkKWNvbmRfaGRyLT5ibG9ja19pZCwKKwkJCQkJbWVtX2dyb3VwX2lkKSkgeworCQkJCXUzMiBtZW1fYnl0ZV9hZGRyID0KKwkJCQkJRFdPUkRTX1RPX0JZVEVTKEdFVF9GSUVMRChtZW0tPmR3b3JkMCwKKwkJCQkJCQlEQkdfRFVNUF9NRU1fQUREUkVTUykpOworCQkJCXUzMiBtZW1fbGVuID0gR0VUX0ZJRUxEKG1lbS0+ZHdvcmQxLAorCQkJCQkJCURCR19EVU1QX01FTV9MRU5HVEgpOworCQkJCWNoYXIgc3Rvcm1fbGV0dGVyID0gJ2EnOworCQkJCWJvb2wgaXNfc3Rvcm0gPSBmYWxzZTsKKworCQkJCS8qIFVwZGF0ZSBtZW1vcnkgbGVuZ3RoIGZvciBDQ0ZDL1RDRkMgbWVtb3JpZXMKKwkJCQkgKiBhY2NvcmRpbmcgdG8gbnVtYmVyIG9mIExDSURzL0xUSURzLgorCQkJCSAqLworCQkJCWlmIChtZW1fZ3JvdXBfaWQgPT0gTUVNX0dST1VQX0NPTk5fQ0ZDX01FTSkKKwkJCQkJbWVtX2xlbiA9IHFlZF9ncmNfZ2V0X3BhcmFtKHBfaHdmbiwKKwkJCQkJCQlEQkdfR1JDX1BBUkFNX05VTV9MQ0lEUykKKwkJCQkJCQkqIChtZW1fbGVuIC8gTUFYX0xDSURTKTsKKwkJCQllbHNlIGlmIChtZW1fZ3JvdXBfaWQgPT0gTUVNX0dST1VQX1RBU0tfQ0ZDX01FTSkKKwkJCQkJbWVtX2xlbiA9IHFlZF9ncmNfZ2V0X3BhcmFtKHBfaHdmbiwKKwkJCQkJCQlEQkdfR1JDX1BBUkFNX05VTV9MVElEUykKKwkJCQkJCQkqIChtZW1fbGVuIC8gTUFYX0xUSURTKTsKKworCQkJCS8qIElmIG1lbW9yeSBpcyBhc3NvY2lhdGVkIHdpdGggU3Rvcm0sIHVwZGF0ZQorCQkJCSAqIFN0b3JtIGRldGFpbHMuCisJCQkJICovCisJCQkJaWYgKHNfYmxvY2tfZGVmc1tjb25kX2hkci0+YmxvY2tfaWRdLT4KKwkJCQkJCQlhc3NvY2lhdGVkX3RvX3N0b3JtKSB7CisJCQkJCWlzX3N0b3JtID0gdHJ1ZTsKKwkJCQkJc3Rvcm1fbGV0dGVyID0KKwkJCQkJCXNfc3Rvcm1fZGVmc1tzX2Jsb2NrX2RlZnNbCisJCQkJCQljb25kX2hkci0+YmxvY2tfaWRdLT4KKwkJCQkJCXN0b3JtX2lkXS5sZXR0ZXI7CisJCQkJfQorCisJCQkJLyogRHVtcCBtZW1vcnkgKi8KKwkJCQlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX21lbShwX2h3Zm4sIHBfcHR0LAorCQkJCQkJZHVtcF9idWYgKyBvZmZzZXQsIGR1bXAsIE5VTEwsCisJCQkJCQltZW1fYnl0ZV9hZGRyLCBtZW1fbGVuLCAwLAorCQkJCQkJZmFsc2UsCisJCQkJCQlzX21lbV9ncm91cF9uYW1lc1ttZW1fZ3JvdXBfaWRdLAorCQkJCQkJaXNfc3Rvcm0sIHN0b3JtX2xldHRlcik7CisJCQkJfQorCQkJfQorCX0KKworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qIER1bXBzIEdSQyBtZW1vcmllcyBhY2NvcmRpbmcgdG8gdGhlIGlucHV0IGFycmF5IGR1bXBfbWVtLgorICogUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLgorICovCitzdGF0aWMgdTMyIHFlZF9ncmNfZHVtcF9tZW1vcmllcyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSB1MzIgKmR1bXBfYnVmLCBib29sIGR1bXApCit7CisJdTMyIG9mZnNldCA9IDAsIGlucHV0X29mZnNldCA9IDA7CisKKwl3aGlsZSAoaW5wdXRfb2Zmc2V0IDwKKwkgICAgICAgc19kYmdfYXJyYXlzW0JJTl9CVUZfREJHX0RVTVBfTUVNXS5zaXplX2luX2R3b3JkcykgeworCQljb25zdCBzdHJ1Y3QgZGJnX2R1bXBfc3BsaXRfaGRyICpzcGxpdF9oZHIgPQorCQkJKGNvbnN0IHN0cnVjdCBkYmdfZHVtcF9zcGxpdF9oZHIgKikKKwkJCSZzX2RiZ19hcnJheXNbQklOX0JVRl9EQkdfRFVNUF9NRU1dLnB0cltpbnB1dF9vZmZzZXQrK107CisJCXU4IHNwbGl0X3R5cGVfaWQgPSBHRVRfRklFTEQoc3BsaXRfaGRyLT5oZHIsCisJCQkJCSAgICAgREJHX0RVTVBfU1BMSVRfSERSX1NQTElUX1RZUEVfSUQpOworCQl1MzIgc3BsaXRfZGF0YV9zaXplID0gR0VUX0ZJRUxEKHNwbGl0X2hkci0+aGRyLAorCQkJCQkJREJHX0RVTVBfU1BMSVRfSERSX0RBVEFfU0laRSk7CisJCXN0cnVjdCBkYmdfYXJyYXkgY3Vycl9pbnB1dF9tZW1zX2FyciA9IHsKKwkJCSZzX2RiZ19hcnJheXNbQklOX0JVRl9EQkdfRFVNUF9NRU1dLnB0cltpbnB1dF9vZmZzZXRdLAorCQkJc3BsaXRfZGF0YV9zaXplfTsKKworCQlzd2l0Y2ggKHNwbGl0X3R5cGVfaWQpIHsKKwkJY2FzZSBTUExJVF9UWVBFX05PTkU6CisJCQlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX21lbV9lbnRyaWVzKHBfaHdmbiwKKwkJCQkJCQkgICBwX3B0dCwKKwkJCQkJCQkgICBjdXJyX2lucHV0X21lbXNfYXJyLAorCQkJCQkJCSAgIGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQkJCSAgIGR1bXApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJCSAgIkR1bXBpbmcgc3BsaXQgbWVtb3JpZXMgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQlpbnB1dF9vZmZzZXQgKz0gc3BsaXRfZGF0YV9zaXplOworCX0KKworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qIER1bXBzIEdSQyBjb250ZXh0IGRhdGEgZm9yIHRoZSBzcGVjaWZpZWQgU3Rvcm0uCisgKiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuCisgKi8KK3N0YXRpYyB1MzIgcWVkX2dyY19kdW1wX2N0eF9kYXRhKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJIHUzMiAqZHVtcF9idWYsCisJCQkJIGJvb2wgZHVtcCwKKwkJCQkgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgdTMyIG51bV9saWRzLAorCQkJCSB1MzIgbGlkX3NpemUsCisJCQkJIHUzMiByZF9yZWdfYWRkciwKKwkJCQkgdTggc3Rvcm1faWQpCit7CisJdTMyIGksIGxpZCwgdG90YWxfc2l6ZTsKKwl1MzIgb2Zmc2V0ID0gMDsKKworCWlmICghbGlkX3NpemUpCisJCXJldHVybiAwOworCWxpZF9zaXplICo9IEJZVEVTX0lOX0RXT1JEOworCXRvdGFsX3NpemUgPSBudW1fbGlkcyAqIGxpZF9zaXplOworCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfbWVtX2hkcihwX2h3Zm4sCisJCQkJICAgICAgIGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgICBkdW1wLAorCQkJCSAgICAgICBuYW1lLAorCQkJCSAgICAgICAwLAorCQkJCSAgICAgICB0b3RhbF9zaXplLAorCQkJCSAgICAgICBsaWRfc2l6ZSAqIDMyLAorCQkJCSAgICAgICBmYWxzZSwKKwkJCQkgICAgICAgbmFtZSwKKwkJCQkgICAgICAgdHJ1ZSwgc19zdG9ybV9kZWZzW3N0b3JtX2lkXS5sZXR0ZXIpOworCisJLyogRHVtcCBjb250ZXh0IGRhdGEgKi8KKwlpZiAoZHVtcCkgeworCQlmb3IgKGxpZCA9IDA7IGxpZCA8IG51bV9saWRzOyBsaWQrKykgeworCQkJZm9yIChpID0gMDsgaSA8IGxpZF9zaXplOyBpKyssIG9mZnNldCsrKSB7CisJCQkJcWVkX3dyKHBfaHdmbiwKKwkJCQkgICAgICAgcF9wdHQsCisJCQkJICAgICAgIHNfc3Rvcm1fZGVmc1tzdG9ybV9pZF0uY21fY3R4X3dyX2FkZHIsCisJCQkJICAgICAgIEJJVCg5KSB8IGxpZCk7CisJCQkJKihkdW1wX2J1ZiArIG9mZnNldCkgPSBxZWRfcmQocF9od2ZuLAorCQkJCQkJCSAgICAgIHBfcHR0LAorCQkJCQkJCSAgICAgIHJkX3JlZ19hZGRyKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCW9mZnNldCArPSB0b3RhbF9zaXplOworCX0KKworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qIER1bXBzIEdSQyBjb250ZXh0cy4gUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLiAqLworc3RhdGljIHUzMiBxZWRfZ3JjX2R1bXBfY3R4KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgdTMyICpkdW1wX2J1ZiwgYm9vbCBkdW1wKQoreworCXUzMiBvZmZzZXQgPSAwOworCXU4IHN0b3JtX2lkOworCisJZm9yIChzdG9ybV9pZCA9IDA7IHN0b3JtX2lkIDwgTUFYX0RCR19TVE9STVM7IHN0b3JtX2lkKyspIHsKKwkJaWYgKCFxZWRfZ3JjX2lzX3N0b3JtX2luY2x1ZGVkKHBfaHdmbiwKKwkJCQkJICAgICAgIChlbnVtIGRiZ19zdG9ybXMpc3Rvcm1faWQpKQorCQkJY29udGludWU7CisKKwkJLyogRHVtcCBDb25uIEFHIGNvbnRleHQgc2l6ZSAqLworCQlvZmZzZXQgKz0KKwkJCXFlZF9ncmNfZHVtcF9jdHhfZGF0YShwX2h3Zm4sCisJCQkJCSAgICAgIHBfcHR0LAorCQkJCQkgICAgICBkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJICAgICAgZHVtcCwKKwkJCQkJICAgICAgIkNPTk5fQUdfQ1RYIiwKKwkJCQkJICAgICAgcWVkX2dyY19nZXRfcGFyYW0ocF9od2ZuLAorCQkJCQkJICAgIERCR19HUkNfUEFSQU1fTlVNX0xDSURTKSwKKwkJCQkJICAgICAgc19zdG9ybV9kZWZzW3N0b3JtX2lkXS4KKwkJCQkJCSAgICBjbV9jb25uX2FnX2N0eF9saWRfc2l6ZSwKKwkJCQkJICAgICAgc19zdG9ybV9kZWZzW3N0b3JtX2lkXS4KKwkJCQkJCSAgICBjbV9jb25uX2FnX2N0eF9yZF9hZGRyLAorCQkJCQkgICAgICBzdG9ybV9pZCk7CisKKwkJLyogRHVtcCBDb25uIFNUIGNvbnRleHQgc2l6ZSAqLworCQlvZmZzZXQgKz0KKwkJCXFlZF9ncmNfZHVtcF9jdHhfZGF0YShwX2h3Zm4sCisJCQkJCSAgICAgIHBfcHR0LAorCQkJCQkgICAgICBkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJICAgICAgZHVtcCwKKwkJCQkJICAgICAgIkNPTk5fU1RfQ1RYIiwKKwkJCQkJICAgICAgcWVkX2dyY19nZXRfcGFyYW0ocF9od2ZuLAorCQkJCQkJICAgIERCR19HUkNfUEFSQU1fTlVNX0xDSURTKSwKKwkJCQkJICAgICAgc19zdG9ybV9kZWZzW3N0b3JtX2lkXS4KKwkJCQkJCSAgICBjbV9jb25uX3N0X2N0eF9saWRfc2l6ZSwKKwkJCQkJICAgICAgc19zdG9ybV9kZWZzW3N0b3JtX2lkXS4KKwkJCQkJCSAgICBjbV9jb25uX3N0X2N0eF9yZF9hZGRyLAorCQkJCQkgICAgICBzdG9ybV9pZCk7CisKKwkJLyogRHVtcCBUYXNrIEFHIGNvbnRleHQgc2l6ZSAqLworCQlvZmZzZXQgKz0KKwkJCXFlZF9ncmNfZHVtcF9jdHhfZGF0YShwX2h3Zm4sCisJCQkJCSAgICAgIHBfcHR0LAorCQkJCQkgICAgICBkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJICAgICAgZHVtcCwKKwkJCQkJICAgICAgIlRBU0tfQUdfQ1RYIiwKKwkJCQkJICAgICAgcWVkX2dyY19nZXRfcGFyYW0ocF9od2ZuLAorCQkJCQkJICAgIERCR19HUkNfUEFSQU1fTlVNX0xUSURTKSwKKwkJCQkJICAgICAgc19zdG9ybV9kZWZzW3N0b3JtX2lkXS4KKwkJCQkJCSAgICBjbV90YXNrX2FnX2N0eF9saWRfc2l6ZSwKKwkJCQkJICAgICAgc19zdG9ybV9kZWZzW3N0b3JtX2lkXS4KKwkJCQkJCSAgICBjbV90YXNrX2FnX2N0eF9yZF9hZGRyLAorCQkJCQkgICAgICBzdG9ybV9pZCk7CisKKwkJLyogRHVtcCBUYXNrIFNUIGNvbnRleHQgc2l6ZSAqLworCQlvZmZzZXQgKz0KKwkJCXFlZF9ncmNfZHVtcF9jdHhfZGF0YShwX2h3Zm4sCisJCQkJCSAgICAgIHBfcHR0LAorCQkJCQkgICAgICBkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJICAgICAgZHVtcCwKKwkJCQkJICAgICAgIlRBU0tfU1RfQ1RYIiwKKwkJCQkJICAgICAgcWVkX2dyY19nZXRfcGFyYW0ocF9od2ZuLAorCQkJCQkJICAgIERCR19HUkNfUEFSQU1fTlVNX0xUSURTKSwKKwkJCQkJICAgICAgc19zdG9ybV9kZWZzW3N0b3JtX2lkXS4KKwkJCQkJCSAgICBjbV90YXNrX3N0X2N0eF9saWRfc2l6ZSwKKwkJCQkJICAgICAgc19zdG9ybV9kZWZzW3N0b3JtX2lkXS4KKwkJCQkJCSAgICBjbV90YXNrX3N0X2N0eF9yZF9hZGRyLAorCQkJCQkgICAgICBzdG9ybV9pZCk7CisJfQorCisJcmV0dXJuIG9mZnNldDsKK30KKworLyogRHVtcHMgR1JDIElPUnMgZGF0YS4gUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLiAqLworc3RhdGljIHUzMiBxZWRfZ3JjX2R1bXBfaW9ycyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1MzIgKmR1bXBfYnVmLCBib29sIGR1bXApCit7CisJY2hhciBidWZbMTBdID0gIklPUl9TRVRfPyI7CisJdTggc3Rvcm1faWQsIHNldF9pZDsKKwl1MzIgb2Zmc2V0ID0gMDsKKworCWZvciAoc3Rvcm1faWQgPSAwOyBzdG9ybV9pZCA8IE1BWF9EQkdfU1RPUk1TOyBzdG9ybV9pZCsrKSB7CisJCWlmIChxZWRfZ3JjX2lzX3N0b3JtX2luY2x1ZGVkKHBfaHdmbiwKKwkJCQkJICAgICAgKGVudW0gZGJnX3N0b3JtcylzdG9ybV9pZCkpIHsKKwkJCWZvciAoc2V0X2lkID0gMDsgc2V0X2lkIDwgTlVNX0lPUl9TRVRTOyBzZXRfaWQrKykgeworCQkJCXUzMiBhZGRyID0KKwkJCQkgICAgc19zdG9ybV9kZWZzW3N0b3JtX2lkXS5zZW1fZmFzdF9tZW1fYWRkciArCisJCQkJICAgIFNFTV9GQVNUX1JFR19TVE9STV9SRUdfRklMRSArCisJCQkJICAgIERXT1JEU19UT19CWVRFUyhJT1JfU0VUX09GRlNFVChzZXRfaWQpKTsKKworCQkJCWJ1ZltzdHJsZW4oYnVmKSAtIDFdID0gJzAnICsgc2V0X2lkOworCQkJCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfbWVtKHBfaHdmbiwKKwkJCQkJCQkgICBwX3B0dCwKKwkJCQkJCQkgICBkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJCQkgICBkdW1wLAorCQkJCQkJCSAgIGJ1ZiwKKwkJCQkJCQkgICBhZGRyLAorCQkJCQkJCSAgIElPUlNfUEVSX1NFVCwKKwkJCQkJCQkgICAzMiwKKwkJCQkJCQkgICBmYWxzZSwKKwkJCQkJCQkgICAiaW9yIiwKKwkJCQkJCQkgICB0cnVlLAorCQkJCQkJCSAgIHNfc3Rvcm1fZGVmcworCQkJCQkJCSAgIFtzdG9ybV9pZF0ubGV0dGVyKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qIER1bXAgVkZDIENBTS4gUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLiAqLworc3RhdGljIHUzMiBxZWRfZ3JjX2R1bXBfdmZjX2NhbShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQlzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJdTMyICpkdW1wX2J1ZiwgYm9vbCBkdW1wLCB1OCBzdG9ybV9pZCkKK3sKKwl1MzIgdG90YWxfc2l6ZSA9IFZGQ19DQU1fTlVNX1JPV1MgKiBWRkNfQ0FNX1JFU1BfRFdPUkRTOworCXUzMiBjYW1fYWRkcltWRkNfQ0FNX0FERFJfRFdPUkRTXSA9IHsgMCB9OworCXUzMiBjYW1fY21kW1ZGQ19DQU1fQ01EX0RXT1JEU10gPSB7IDAgfTsKKwl1MzIgb2Zmc2V0ID0gMDsKKwl1MzIgcm93LCBpOworCisJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9tZW1faGRyKHBfaHdmbiwKKwkJCQkgICAgICAgZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICAgIGR1bXAsCisJCQkJICAgICAgICJ2ZmNfY2FtIiwKKwkJCQkgICAgICAgMCwKKwkJCQkgICAgICAgdG90YWxfc2l6ZSwKKwkJCQkgICAgICAgMjU2LAorCQkJCSAgICAgICBmYWxzZSwKKwkJCQkgICAgICAgInZmY19jYW0iLAorCQkJCSAgICAgICB0cnVlLCBzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLmxldHRlcik7CisJaWYgKGR1bXApIHsKKwkJLyogUHJlcGFyZSBDQU0gYWRkcmVzcyAqLworCQlTRVRfVkFSX0ZJRUxEKGNhbV9hZGRyLCBWRkNfQ0FNX0FERFIsIE9QLCBWRkNfT1BDT0RFX0NBTV9SRCk7CisJCWZvciAocm93ID0gMDsgcm93IDwgVkZDX0NBTV9OVU1fUk9XUzsKKwkJICAgICByb3crKywgb2Zmc2V0ICs9IFZGQ19DQU1fUkVTUF9EV09SRFMpIHsKKwkJCS8qIFdyaXRlIFZGQyBDQU0gY29tbWFuZCAqLworCQkJU0VUX1ZBUl9GSUVMRChjYW1fY21kLCBWRkNfQ0FNX0NNRCwgUk9XLCByb3cpOworCQkJQVJSX1JFR19XUihwX2h3Zm4sCisJCQkJICAgcF9wdHQsCisJCQkJICAgc19zdG9ybV9kZWZzW3N0b3JtX2lkXS5zZW1fZmFzdF9tZW1fYWRkciArCisJCQkJICAgU0VNX0ZBU1RfUkVHX1ZGQ19EQVRBX1dSLAorCQkJCSAgIGNhbV9jbWQsIFZGQ19DQU1fQ01EX0RXT1JEUyk7CisKKwkJCS8qIFdyaXRlIFZGQyBDQU0gYWRkcmVzcyAqLworCQkJQVJSX1JFR19XUihwX2h3Zm4sCisJCQkJICAgcF9wdHQsCisJCQkJICAgc19zdG9ybV9kZWZzW3N0b3JtX2lkXS5zZW1fZmFzdF9tZW1fYWRkciArCisJCQkJICAgU0VNX0ZBU1RfUkVHX1ZGQ19BRERSLAorCQkJCSAgIGNhbV9hZGRyLCBWRkNfQ0FNX0FERFJfRFdPUkRTKTsKKworCQkJLyogUmVhZCBWRkMgQ0FNIHJlYWQgcmVzcG9uc2UgKi8KKwkJCUFSUl9SRUdfUkQocF9od2ZuLAorCQkJCSAgIHBfcHR0LAorCQkJCSAgIHNfc3Rvcm1fZGVmc1tzdG9ybV9pZF0uc2VtX2Zhc3RfbWVtX2FkZHIgKworCQkJCSAgIFNFTV9GQVNUX1JFR19WRkNfREFUQV9SRCwKKwkJCQkgICBkdW1wX2J1ZiArIG9mZnNldCwgVkZDX0NBTV9SRVNQX0RXT1JEUyk7CisJCX0KKwl9IGVsc2UgeworCQlvZmZzZXQgKz0gdG90YWxfc2l6ZTsKKwl9CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKiBEdW1wIFZGQyBSQU0uIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4gKi8KK3N0YXRpYyB1MzIgcWVkX2dyY19kdW1wX3ZmY19yYW0oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCXUzMiAqZHVtcF9idWYsCisJCQkJYm9vbCBkdW1wLAorCQkJCXU4IHN0b3JtX2lkLCBzdHJ1Y3QgdmZjX3JhbV9kZWZzICpyYW1fZGVmcykKK3sKKwl1MzIgdG90YWxfc2l6ZSA9IHJhbV9kZWZzLT5udW1fcm93cyAqIFZGQ19SQU1fUkVTUF9EV09SRFM7CisJdTMyIHJhbV9hZGRyW1ZGQ19SQU1fQUREUl9EV09SRFNdID0geyAwIH07CisJdTMyIHJhbV9jbWRbVkZDX1JBTV9DTURfRFdPUkRTXSA9IHsgMCB9OworCXUzMiBvZmZzZXQgPSAwOworCXUzMiByb3csIGk7CisKKwlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX21lbV9oZHIocF9od2ZuLAorCQkJCSAgICAgICBkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgICAgZHVtcCwKKwkJCQkgICAgICAgcmFtX2RlZnMtPm1lbV9uYW1lLAorCQkJCSAgICAgICAwLAorCQkJCSAgICAgICB0b3RhbF9zaXplLAorCQkJCSAgICAgICAyNTYsCisJCQkJICAgICAgIGZhbHNlLAorCQkJCSAgICAgICByYW1fZGVmcy0+dHlwZV9uYW1lLAorCQkJCSAgICAgICB0cnVlLCBzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLmxldHRlcik7CisKKwkvKiBQcmVwYXJlIFJBTSBhZGRyZXNzICovCisJU0VUX1ZBUl9GSUVMRChyYW1fYWRkciwgVkZDX1JBTV9BRERSLCBPUCwgVkZDX09QQ09ERV9SQU1fUkQpOworCisJaWYgKCFkdW1wKQorCQlyZXR1cm4gb2Zmc2V0ICsgdG90YWxfc2l6ZTsKKworCWZvciAocm93ID0gcmFtX2RlZnMtPmJhc2Vfcm93OworCSAgICAgcm93IDwgcmFtX2RlZnMtPmJhc2Vfcm93ICsgcmFtX2RlZnMtPm51bV9yb3dzOworCSAgICAgcm93KyssIG9mZnNldCArPSBWRkNfUkFNX1JFU1BfRFdPUkRTKSB7CisJCS8qIFdyaXRlIFZGQyBSQU0gY29tbWFuZCAqLworCQlBUlJfUkVHX1dSKHBfaHdmbiwKKwkJCSAgIHBfcHR0LAorCQkJICAgc19zdG9ybV9kZWZzW3N0b3JtX2lkXS5zZW1fZmFzdF9tZW1fYWRkciArCisJCQkgICBTRU1fRkFTVF9SRUdfVkZDX0RBVEFfV1IsCisJCQkgICByYW1fY21kLCBWRkNfUkFNX0NNRF9EV09SRFMpOworCisJCS8qIFdyaXRlIFZGQyBSQU0gYWRkcmVzcyAqLworCQlTRVRfVkFSX0ZJRUxEKHJhbV9hZGRyLCBWRkNfUkFNX0FERFIsIFJPVywgcm93KTsKKwkJQVJSX1JFR19XUihwX2h3Zm4sCisJCQkgICBwX3B0dCwKKwkJCSAgIHNfc3Rvcm1fZGVmc1tzdG9ybV9pZF0uc2VtX2Zhc3RfbWVtX2FkZHIgKworCQkJICAgU0VNX0ZBU1RfUkVHX1ZGQ19BRERSLAorCQkJICAgcmFtX2FkZHIsIFZGQ19SQU1fQUREUl9EV09SRFMpOworCisJCS8qIFJlYWQgVkZDIFJBTSByZWFkIHJlc3BvbnNlICovCisJCUFSUl9SRUdfUkQocF9od2ZuLAorCQkJICAgcF9wdHQsCisJCQkgICBzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLnNlbV9mYXN0X21lbV9hZGRyICsKKwkJCSAgIFNFTV9GQVNUX1JFR19WRkNfREFUQV9SRCwKKwkJCSAgIGR1bXBfYnVmICsgb2Zmc2V0LCBWRkNfUkFNX1JFU1BfRFdPUkRTKTsKKwl9CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKiBEdW1wcyBHUkMgVkZDIGRhdGEuIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4gKi8KK3N0YXRpYyB1MzIgcWVkX2dyY19kdW1wX3ZmYyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHUzMiAqZHVtcF9idWYsIGJvb2wgZHVtcCkKK3sKKwlzdHJ1Y3QgZGJnX3Rvb2xzX2RhdGEgKmRldl9kYXRhID0gJnBfaHdmbi0+ZGJnX2luZm87CisJdTggc3Rvcm1faWQsIGk7CisJdTMyIG9mZnNldCA9IDA7CisKKwlmb3IgKHN0b3JtX2lkID0gMDsgc3Rvcm1faWQgPCBNQVhfREJHX1NUT1JNUzsgc3Rvcm1faWQrKykgeworCQlpZiAocWVkX2dyY19pc19zdG9ybV9pbmNsdWRlZChwX2h3Zm4sCisJCQkJCSAgICAgIChlbnVtIGRiZ19zdG9ybXMpc3Rvcm1faWQpICYmCisJCSAgICBzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLmhhc192ZmMgJiYKKwkJICAgIChzdG9ybV9pZCAhPSBEQkdfUFNUT1JNX0lEIHx8CisJCSAgICAgZGV2X2RhdGEtPnBsYXRmb3JtX2lkID09IFBMQVRGT1JNX0FTSUMpKSB7CisJCQkvKiBSZWFkIENBTSAqLworCQkJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF92ZmNfY2FtKHBfaHdmbiwKKwkJCQkJCSAgICAgICBwX3B0dCwKKwkJCQkJCSAgICAgICBkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJCSAgICAgICBkdW1wLCBzdG9ybV9pZCk7CisKKwkJCS8qIFJlYWQgUkFNICovCisJCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1ZGQ19SQU1fVFlQRVM7IGkrKykKKwkJCQlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX3ZmY19yYW0ocF9od2ZuLAorCQkJCQkJCSAgICAgICBwX3B0dCwKKwkJCQkJCQkgICAgICAgZHVtcF9idWYgKworCQkJCQkJCSAgICAgICBvZmZzZXQsCisJCQkJCQkJICAgICAgIGR1bXAsCisJCQkJCQkJICAgICAgIHN0b3JtX2lkLAorCQkJCQkJCSAgICAgICAmc192ZmNfcmFtX2RlZnMKKwkJCQkJCQkgICAgICAgW2ldKTsKKwkJfQorCX0KKworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qIER1bXBzIEdSQyBSU1MgZGF0YS4gUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLiAqLworc3RhdGljIHUzMiBxZWRfZ3JjX2R1bXBfcnNzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgdTMyICpkdW1wX2J1ZiwgYm9vbCBkdW1wKQoreworCXN0cnVjdCBkYmdfdG9vbHNfZGF0YSAqZGV2X2RhdGEgPSAmcF9od2ZuLT5kYmdfaW5mbzsKKwl1MzIgb2Zmc2V0ID0gMDsKKwl1OCByc3NfbWVtX2lkOworCisJZm9yIChyc3NfbWVtX2lkID0gMDsgcnNzX21lbV9pZCA8IE5VTV9SU1NfTUVNX1RZUEVTOyByc3NfbWVtX2lkKyspIHsKKwkJc3RydWN0IHJzc19tZW1fZGVmcyAqcnNzX2RlZnMgPSAmc19yc3NfbWVtX2RlZnNbcnNzX21lbV9pZF07CisJCXUzMiBudW1fZW50cmllcyA9IHJzc19kZWZzLT5udW1fZW50cmllc1tkZXZfZGF0YS0+Y2hpcF9pZF07CisJCXUzMiBlbnRyeV93aWR0aCA9IHJzc19kZWZzLT5lbnRyeV93aWR0aFtkZXZfZGF0YS0+Y2hpcF9pZF07CisJCXUzMiB0b3RhbF9zaXplID0gKG51bV9lbnRyaWVzICogZW50cnlfd2lkdGgpIC8gMzI7CisJCWJvb2wgcGFja2VkID0gKGVudHJ5X3dpZHRoID09IDE2KTsKKwkJdTMyIGFkZHIgPSByc3NfZGVmcy0+YWRkcjsKKwkJdTMyIGksIGo7CisKKwkJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9tZW1faGRyKHBfaHdmbiwKKwkJCQkJICAgICAgIGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQkgICAgICAgZHVtcCwKKwkJCQkJICAgICAgIHJzc19kZWZzLT5tZW1fbmFtZSwKKwkJCQkJICAgICAgIGFkZHIsCisJCQkJCSAgICAgICB0b3RhbF9zaXplLAorCQkJCQkgICAgICAgZW50cnlfd2lkdGgsCisJCQkJCSAgICAgICBwYWNrZWQsCisJCQkJCSAgICAgICByc3NfZGVmcy0+dHlwZV9uYW1lLCBmYWxzZSwgMCk7CisKKwkJaWYgKCFkdW1wKSB7CisJCQlvZmZzZXQgKz0gdG90YWxfc2l6ZTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogRHVtcCBSU1MgZGF0YSAqLworCQlmb3IgKGkgPSAwOyBpIDwgQllURVNfVE9fRFdPUkRTKHRvdGFsX3NpemUpOyBpKyssIGFkZHIrKykgeworCQkJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIFJTU19SRUdfUlNTX1JBTV9BRERSLCBhZGRyKTsKKwkJCWZvciAoaiA9IDA7IGogPCBCWVRFU19JTl9EV09SRDsgaisrLCBvZmZzZXQrKykKKwkJCQkqKGR1bXBfYnVmICsgb2Zmc2V0KSA9CisJCQkJCXFlZF9yZChwX2h3Zm4sIHBfcHR0LAorCQkJCQkgICAgICAgUlNTX1JFR19SU1NfUkFNX0RBVEEgKworCQkJCQkgICAgICAgRFdPUkRTX1RPX0JZVEVTKGopKTsKKwkJfQorCX0KKworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qIER1bXBzIEdSQyBCaWcgUkFNLiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuICovCitzdGF0aWMgdTMyIHFlZF9ncmNfZHVtcF9iaWdfcmFtKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCXN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQl1MzIgKmR1bXBfYnVmLCBib29sIGR1bXAsIHU4IGJpZ19yYW1faWQpCit7CisJc3RydWN0IGRiZ190b29sc19kYXRhICpkZXZfZGF0YSA9ICZwX2h3Zm4tPmRiZ19pbmZvOworCWNoYXIgbWVtX25hbWVbMTJdID0gIj8/P19CSUdfUkFNIjsKKwljaGFyIHR5cGVfbmFtZVs4XSA9ICI/Pz9fUkFNIjsKKwl1MzIgcmFtX3NpemUsIHRvdGFsX2Jsb2NrczsKKwl1MzIgb2Zmc2V0ID0gMCwgaSwgajsKKworCXRvdGFsX2Jsb2NrcyA9CisJCXNfYmlnX3JhbV9kZWZzW2JpZ19yYW1faWRdLm51bV9vZl9ibG9ja3NbZGV2X2RhdGEtPmNoaXBfaWRdOworCXJhbV9zaXplID0gdG90YWxfYmxvY2tzICogQklHX1JBTV9CTE9DS19TSVpFX0RXT1JEUzsKKworCXN0cm5jcHkodHlwZV9uYW1lLCBzX2JpZ19yYW1fZGVmc1tiaWdfcmFtX2lkXS5pbnN0YW5jZV9uYW1lLAorCQlzdHJsZW4oc19iaWdfcmFtX2RlZnNbYmlnX3JhbV9pZF0uaW5zdGFuY2VfbmFtZSkpOworCXN0cm5jcHkobWVtX25hbWUsIHNfYmlnX3JhbV9kZWZzW2JpZ19yYW1faWRdLmluc3RhbmNlX25hbWUsCisJCXN0cmxlbihzX2JpZ19yYW1fZGVmc1tiaWdfcmFtX2lkXS5pbnN0YW5jZV9uYW1lKSk7CisKKwkvKiBEdW1wIG1lbW9yeSBoZWFkZXIgKi8KKwlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX21lbV9oZHIocF9od2ZuLAorCQkJCSAgICAgICBkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgICAgZHVtcCwKKwkJCQkgICAgICAgbWVtX25hbWUsCisJCQkJICAgICAgIDAsCisJCQkJICAgICAgIHJhbV9zaXplLAorCQkJCSAgICAgICBCSUdfUkFNX0JMT0NLX1NJWkVfQllURVMgKiA4LAorCQkJCSAgICAgICBmYWxzZSwgdHlwZV9uYW1lLCBmYWxzZSwgMCk7CisKKwlpZiAoIWR1bXApCisJCXJldHVybiBvZmZzZXQgKyByYW1fc2l6ZTsKKworCS8qIFJlYWQgYW5kIGR1bXAgQmlnIFJBTSBkYXRhICovCisJZm9yIChpID0gMDsgaSA8IHRvdGFsX2Jsb2NrcyAvIDI7IGkrKykgeworCQlxZWRfd3IocF9od2ZuLCBwX3B0dCwgc19iaWdfcmFtX2RlZnNbYmlnX3JhbV9pZF0uYWRkcl9yZWdfYWRkciwKKwkJICAgICAgIGkpOworCQlmb3IgKGogPSAwOyBqIDwgMiAqIEJJR19SQU1fQkxPQ0tfU0laRV9EV09SRFM7IGorKywgb2Zmc2V0KyspCisJCQkqKGR1bXBfYnVmICsgb2Zmc2V0KSA9IHFlZF9yZChwX2h3Zm4sIHBfcHR0LAorCQkJCQkJc19iaWdfcmFtX2RlZnNbYmlnX3JhbV9pZF0uCisJCQkJCQkJZGF0YV9yZWdfYWRkciArCisJCQkJCQlEV09SRFNfVE9fQllURVMoaikpOworCX0KKworCXJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyB1MzIgcWVkX2dyY19kdW1wX21jcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHUzMiAqZHVtcF9idWYsIGJvb2wgZHVtcCkKK3sKKwlib29sIGJsb2NrX2VuYWJsZVtNQVhfQkxPQ0tfSURdID0geyAwIH07CisJYm9vbCBoYWx0ZWQgPSBmYWxzZTsKKwl1MzIgb2Zmc2V0ID0gMDsKKworCS8qIEhhbHQgTUNQICovCisJaWYgKGR1bXApIHsKKwkJaGFsdGVkID0gIXFlZF9tY3BfaGFsdChwX2h3Zm4sIHBfcHR0KTsKKwkJaWYgKCFoYWx0ZWQpCisJCQlEUF9OT1RJQ0UocF9od2ZuLCAiTUNQIGhhbHQgZmFpbGVkIVxuIik7CisJfQorCisJLyogRHVtcCBNQ1Agc2NyYXRjaHBhZCAqLworCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfbWVtKHBfaHdmbiwKKwkJCQkgICBwX3B0dCwKKwkJCQkgICBkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICBkdW1wLAorCQkJCSAgIE5VTEwsCisJCQkJICAgTUNQX1JFR19TQ1JBVENILAorCQkJCSAgIE1DUF9SRUdfU0NSQVRDSF9TSVpFLAorCQkJCSAgIDAsIGZhbHNlLCAiTUNQIiwgZmFsc2UsIDApOworCisJLyogRHVtcCBNQ1AgY3B1X3JlZ19maWxlICovCisJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9tZW0ocF9od2ZuLAorCQkJCSAgIHBfcHR0LAorCQkJCSAgIGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgIGR1bXAsCisJCQkJICAgTlVMTCwKKwkJCQkgICBNQ1BfUkVHX0NQVV9SRUdfRklMRSwKKwkJCQkgICBNQ1BfUkVHX0NQVV9SRUdfRklMRV9TSVpFLAorCQkJCSAgIDAsIGZhbHNlLCAiTUNQIiwgZmFsc2UsIDApOworCisJLyogRHVtcCBNQ1AgcmVnaXN0ZXJzICovCisJYmxvY2tfZW5hYmxlW0JMT0NLX01DUF0gPSB0cnVlOworCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfcmVnaXN0ZXJzKHBfaHdmbiwKKwkJCQkJIHBfcHR0LAorCQkJCQkgZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCSBkdW1wLCBibG9ja19lbmFibGUsICJibG9jayIsICJNQ1AiKTsKKworCS8qIER1bXAgcmVxdWlyZWQgbm9uLU1DUCByZWdpc3RlcnMgKi8KKwlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX3JlZ3NfaGRyKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQlkdW1wLCAxLCAiZW5nIiwgLTEsICJibG9jayIsICJNQ1AiKTsKKwlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX3JlZ19lbnRyeShwX2h3Zm4sCisJCQkJCSBwX3B0dCwKKwkJCQkJIGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQkgZHVtcCwKKwkJCQkJIEJZVEVTX1RPX0RXT1JEUworCQkJCQkgKE1JU0NfUkVHX1NIQVJFRF9NRU1fQUREUiksIDEpOworCisJLyogUmVsZWFzZSBNQ1AgKi8KKwlpZiAoaGFsdGVkICYmIHFlZF9tY3BfcmVzdW1lKHBfaHdmbiwgcF9wdHQpKQorCQlEUF9OT1RJQ0UocF9od2ZuLCAiRmFpbGVkIHRvIHJlc3VtZSBNQ1AgYWZ0ZXIgaGFsdCFcbiIpOworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qIER1bXBzIHRoZSB0YnVzIGluZGlyZWN0IG1lbW9yeSBmb3IgYWxsIFBIWXMuICovCitzdGF0aWMgdTMyIHFlZF9ncmNfZHVtcF9waHkoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1MzIgKmR1bXBfYnVmLCBib29sIGR1bXApCit7CisJdTMyIG9mZnNldCA9IDAsIHRidXNfbG9fb2Zmc2V0LCB0YnVzX2hpX29mZnNldDsKKwljaGFyIG1lbV9uYW1lWzMyXTsKKwl1OCBwaHlfaWQ7CisKKwlmb3IgKHBoeV9pZCA9IDA7IHBoeV9pZCA8IEFSUkFZX1NJWkUoc19waHlfZGVmcyk7IHBoeV9pZCsrKSB7CisJCXN0cnVjdCBwaHlfZGVmcyAqcGh5X2RlZnMgPSAmc19waHlfZGVmc1twaHlfaWRdOworCQlpbnQgcHJpbnRlZF9jaGFyczsKKworCQlwcmludGVkX2NoYXJzID0gc25wcmludGYobWVtX25hbWUsIHNpemVvZihtZW1fbmFtZSksICJ0YnVzXyVzIiwKKwkJCQkJIHBoeV9kZWZzLT5waHlfbmFtZSk7CisJCWlmIChwcmludGVkX2NoYXJzIDwgMCB8fCBwcmludGVkX2NoYXJzID49IHNpemVvZihtZW1fbmFtZSkpCisJCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJCSAgIlVuZXhwZWN0ZWQgZGVidWcgZXJyb3I6IGludmFsaWQgUEhZIG1lbW9yeSBuYW1lXG4iKTsKKwkJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9tZW1faGRyKHBfaHdmbiwKKwkJCQkJICAgICAgIGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQkgICAgICAgZHVtcCwKKwkJCQkJICAgICAgIG1lbV9uYW1lLAorCQkJCQkgICAgICAgMCwKKwkJCQkJICAgICAgIFBIWV9EVU1QX1NJWkVfRFdPUkRTLAorCQkJCQkgICAgICAgMTYsIHRydWUsIG1lbV9uYW1lLCBmYWxzZSwgMCk7CisJCWlmIChkdW1wKSB7CisJCQl1MzIgYWRkcl9sb19hZGRyID0gcGh5X2RlZnMtPmJhc2VfYWRkciArCisJCQkJCSAgIHBoeV9kZWZzLT50YnVzX2FkZHJfbG9fYWRkcjsKKwkJCXUzMiBhZGRyX2hpX2FkZHIgPSBwaHlfZGVmcy0+YmFzZV9hZGRyICsKKwkJCQkJICAgcGh5X2RlZnMtPnRidXNfYWRkcl9oaV9hZGRyOworCQkJdTMyIGRhdGFfbG9fYWRkciA9IHBoeV9kZWZzLT5iYXNlX2FkZHIgKworCQkJCQkgICBwaHlfZGVmcy0+dGJ1c19kYXRhX2xvX2FkZHI7CisJCQl1MzIgZGF0YV9oaV9hZGRyID0gcGh5X2RlZnMtPmJhc2VfYWRkciArCisJCQkJCSAgIHBoeV9kZWZzLT50YnVzX2RhdGFfaGlfYWRkcjsKKwkJCXU4ICpieXRlc19idWYgPSAodTggKikoZHVtcF9idWYgKyBvZmZzZXQpOworCisJCQlmb3IgKHRidXNfaGlfb2Zmc2V0ID0gMDsKKwkJCSAgICAgdGJ1c19oaV9vZmZzZXQgPCAoTlVNX1BIWV9UQlVTX0FERFJFU1NFUyA+PiA4KTsKKwkJCSAgICAgdGJ1c19oaV9vZmZzZXQrKykgeworCQkJCXFlZF93cihwX2h3Zm4sCisJCQkJICAgICAgIHBfcHR0LCBhZGRyX2hpX2FkZHIsIHRidXNfaGlfb2Zmc2V0KTsKKwkJCQlmb3IgKHRidXNfbG9fb2Zmc2V0ID0gMDsgdGJ1c19sb19vZmZzZXQgPCAyNTY7CisJCQkJICAgICB0YnVzX2xvX29mZnNldCsrKSB7CisJCQkJCXFlZF93cihwX2h3Zm4sCisJCQkJCSAgICAgICBwX3B0dCwKKwkJCQkJICAgICAgIGFkZHJfbG9fYWRkciwgdGJ1c19sb19vZmZzZXQpOworCQkJCQkqKGJ5dGVzX2J1ZisrKSA9CisJCQkJCQkodTgpcWVkX3JkKHBfaHdmbiwgcF9wdHQsCisJCQkJCQkJICAgZGF0YV9sb19hZGRyKTsKKwkJCQkJKihieXRlc19idWYrKykgPQorCQkJCQkJKHU4KXFlZF9yZChwX2h3Zm4sIHBfcHR0LAorCQkJCQkJCSAgIGRhdGFfaGlfYWRkcik7CisJCQkJfQorCQkJfQorCQl9CisKKwkJb2Zmc2V0ICs9IFBIWV9EVU1QX1NJWkVfRFdPUkRTOworCX0KKworCXJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHFlZF9jb25maWdfZGJnX2xpbmUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCWVudW0gYmxvY2tfaWQgYmxvY2tfaWQsCisJCQkJdTggbGluZV9pZCwKKwkJCQl1OCBjeWNsZV9lbiwKKwkJCQl1OCByaWdodF9zaGlmdCwgdTggZm9yY2VfdmFsaWQsIHU4IGZvcmNlX2ZyYW1lKQoreworCXN0cnVjdCBibG9ja19kZWZzICpwX2Jsb2NrX2RlZnMgPSBzX2Jsb2NrX2RlZnNbYmxvY2tfaWRdOworCisJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIHBfYmxvY2tfZGVmcy0+ZGJnX3NlbGVjdF9hZGRyLCBsaW5lX2lkKTsKKwlxZWRfd3IocF9od2ZuLCBwX3B0dCwgcF9ibG9ja19kZWZzLT5kYmdfY3ljbGVfZW5hYmxlX2FkZHIsIGN5Y2xlX2VuKTsKKwlxZWRfd3IocF9od2ZuLCBwX3B0dCwgcF9ibG9ja19kZWZzLT5kYmdfc2hpZnRfYWRkciwgcmlnaHRfc2hpZnQpOworCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBwX2Jsb2NrX2RlZnMtPmRiZ19mb3JjZV92YWxpZF9hZGRyLCBmb3JjZV92YWxpZCk7CisJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIHBfYmxvY2tfZGVmcy0+ZGJnX2ZvcmNlX2ZyYW1lX2FkZHIsIGZvcmNlX2ZyYW1lKTsKK30KKworLyogRHVtcHMgU3RhdGljIERlYnVnIGRhdGEuIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4gKi8KK3N0YXRpYyB1MzIgcWVkX2dyY19kdW1wX3N0YXRpY19kZWJ1ZyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgICAgIHUzMiAqZHVtcF9idWYsIGJvb2wgZHVtcCkKK3sKKwl1MzIgYmxvY2tfZHdvcmRzID0gTlVNX0RCR19CVVNfTElORVMgKiBTVEFUSUNfREVCVUdfTElORV9EV09SRFM7CisJc3RydWN0IGRiZ190b29sc19kYXRhICpkZXZfZGF0YSA9ICZwX2h3Zm4tPmRiZ19pbmZvOworCXUzMiBvZmZzZXQgPSAwLCBibG9ja19pZCwgbGluZV9pZCwgYWRkciwgaTsKKwlzdHJ1Y3QgYmxvY2tfZGVmcyAqcF9ibG9ja19kZWZzOworCisJaWYgKGR1bXApIHsKKwkJRFBfVkVSQk9TRShwX2h3Zm4sCisJCQkgICBRRURfTVNHX0RFQlVHLCAiRHVtcGluZyBzdGF0aWMgZGVidWcgZGF0YS4uLlxuIik7CisKKwkJLyogRGlzYWJsZSBhbGwgYmxvY2tzIGRlYnVnIG91dHB1dCAqLworCQlmb3IgKGJsb2NrX2lkID0gMDsgYmxvY2tfaWQgPCBNQVhfQkxPQ0tfSUQ7IGJsb2NrX2lkKyspIHsKKwkJCXBfYmxvY2tfZGVmcyA9IHNfYmxvY2tfZGVmc1tibG9ja19pZF07CisKKwkJCWlmIChwX2Jsb2NrX2RlZnMtPmhhc19kYmdfYnVzW2Rldl9kYXRhLT5jaGlwX2lkXSkKKwkJCQlxZWRfd3IocF9od2ZuLCBwX3B0dCwKKwkJCQkgICAgICAgcF9ibG9ja19kZWZzLT5kYmdfY3ljbGVfZW5hYmxlX2FkZHIsIDApOworCQl9CisKKwkJcWVkX2J1c19yZXNldF9kYmdfYmxvY2socF9od2ZuLCBwX3B0dCk7CisJCXFlZF9idXNfc2V0X2ZyYW1pbmdfbW9kZShwX2h3Zm4sCisJCQkJCSBwX3B0dCwgREJHX0JVU19GUkFNRV9NT0RFXzhIV18wU1QpOworCQlxZWRfd3IocF9od2ZuLAorCQkgICAgICAgcF9wdHQsIERCR19SRUdfREVCVUdfVEFSR0VULCBEQkdfQlVTX1RBUkdFVF9JRF9JTlRfQlVGKTsKKwkJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIERCR19SRUdfRlVMTF9NT0RFLCAxKTsKKwkJcWVkX2J1c19lbmFibGVfZGJnX2Jsb2NrKHBfaHdmbiwgcF9wdHQsIHRydWUpOworCX0KKworCS8qIER1bXAgYWxsIHN0YXRpYyBkZWJ1ZyBsaW5lcyBmb3IgZWFjaCByZWxldmFudCBibG9jayAqLworCWZvciAoYmxvY2tfaWQgPSAwOyBibG9ja19pZCA8IE1BWF9CTE9DS19JRDsgYmxvY2tfaWQrKykgeworCQlwX2Jsb2NrX2RlZnMgPSBzX2Jsb2NrX2RlZnNbYmxvY2tfaWRdOworCisJCWlmICghcF9ibG9ja19kZWZzLT5oYXNfZGJnX2J1c1tkZXZfZGF0YS0+Y2hpcF9pZF0pCisJCQljb250aW51ZTsKKworCQkvKiBEdW1wIHN0YXRpYyBzZWN0aW9uIHBhcmFtcyAqLworCQlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX21lbV9oZHIocF9od2ZuLAorCQkJCQkgICAgICAgZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCSAgICAgICBkdW1wLAorCQkJCQkgICAgICAgcF9ibG9ja19kZWZzLT5uYW1lLCAwLAorCQkJCQkgICAgICAgYmxvY2tfZHdvcmRzLCAzMiwgZmFsc2UsCisJCQkJCSAgICAgICAiU1RBVElDIiwgZmFsc2UsIDApOworCisJCWlmIChkdW1wICYmICFkZXZfZGF0YS0+YmxvY2tfaW5fcmVzZXRbYmxvY2tfaWRdKSB7CisJCQl1OCBkYmdfY2xpZW50X2lkID0KKwkJCQlwX2Jsb2NrX2RlZnMtPmRiZ19jbGllbnRfaWRbZGV2X2RhdGEtPmNoaXBfaWRdOworCisJCQkvKiBFbmFibGUgYmxvY2sncyBjbGllbnQgKi8KKwkJCXFlZF9idXNfZW5hYmxlX2NsaWVudHMocF9od2ZuLCBwX3B0dCwKKwkJCQkJICAgICAgIEJJVChkYmdfY2xpZW50X2lkKSk7CisKKwkJCWZvciAobGluZV9pZCA9IDA7IGxpbmVfaWQgPCBOVU1fREJHX0JVU19MSU5FUzsKKwkJCSAgICAgbGluZV9pZCsrKSB7CisJCQkJLyogQ29uZmlndXJlIGRlYnVnIGxpbmUgSUQgKi8KKwkJCQlxZWRfY29uZmlnX2RiZ19saW5lKHBfaHdmbiwKKwkJCQkJCSAgICBwX3B0dCwKKwkJCQkJCSAgICAoZW51bSBibG9ja19pZClibG9ja19pZCwKKwkJCQkJCSAgICAodTgpbGluZV9pZCwKKwkJCQkJCSAgICAweGYsIDAsIDAsIDApOworCisJCQkJLyogUmVhZCBkZWJ1ZyBsaW5lIGluZm8gKi8KKwkJCQlmb3IgKGkgPSAwLCBhZGRyID0gREJHX1JFR19DQUxFTkRBUl9PVVRfREFUQTsKKwkJCQkgICAgIGkgPCBTVEFUSUNfREVCVUdfTElORV9EV09SRFM7CisJCQkJICAgICBpKyssIG9mZnNldCsrLCBhZGRyICs9IEJZVEVTX0lOX0RXT1JEKQorCQkJCQlkdW1wX2J1ZltvZmZzZXRdID0gcWVkX3JkKHBfaHdmbiwgcF9wdHQsCisJCQkJCQkJCSAgYWRkcik7CisJCQl9CisKKwkJCS8qIERpc2FibGUgYmxvY2sncyBjbGllbnQgYW5kIGRlYnVnIG91dHB1dCAqLworCQkJcWVkX2J1c19lbmFibGVfY2xpZW50cyhwX2h3Zm4sIHBfcHR0LCAwKTsKKwkJCXFlZF93cihwX2h3Zm4sIHBfcHR0LAorCQkJICAgICAgIHBfYmxvY2tfZGVmcy0+ZGJnX2N5Y2xlX2VuYWJsZV9hZGRyLCAwKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEFsbCBsaW5lcyBhcmUgaW52YWxpZCAtIGR1bXAgemVyb3MgKi8KKwkJCWlmIChkdW1wKQorCQkJCW1lbXNldChkdW1wX2J1ZiArIG9mZnNldCwgMCwKKwkJCQkgICAgICAgRFdPUkRTX1RPX0JZVEVTKGJsb2NrX2R3b3JkcykpOworCQkJb2Zmc2V0ICs9IGJsb2NrX2R3b3JkczsKKwkJfQorCX0KKworCWlmIChkdW1wKSB7CisJCXFlZF9idXNfZW5hYmxlX2RiZ19ibG9jayhwX2h3Zm4sIHBfcHR0LCBmYWxzZSk7CisJCXFlZF9idXNfZW5hYmxlX2NsaWVudHMocF9od2ZuLCBwX3B0dCwgMCk7CisJfQorCisJcmV0dXJuIG9mZnNldDsKK30KKworLyogUGVyZm9ybXMgR1JDIER1bXAgdG8gdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuCisgKi8KK3N0YXRpYyBlbnVtIGRiZ19zdGF0dXMgcWVkX2dyY19kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJICAgIHUzMiAqZHVtcF9idWYsCisJCQkJICAgIGJvb2wgZHVtcCwgdTMyICpudW1fZHVtcGVkX2R3b3JkcykKK3sKKwlzdHJ1Y3QgZGJnX3Rvb2xzX2RhdGEgKmRldl9kYXRhID0gJnBfaHdmbi0+ZGJnX2luZm87CisJYm9vbCBwYXJpdGllc19tYXNrZWQgPSBmYWxzZTsKKwl1OCBpLCBwb3J0X21vZGUgPSAwOworCXUzMiBvZmZzZXQgPSAwOworCisJLyogQ2hlY2sgaWYgZW11bGF0aW9uIHBsYXRmb3JtICovCisJKm51bV9kdW1wZWRfZHdvcmRzID0gMDsKKworCS8qIEZpbGwgR1JDIHBhcmFtZXRlcnMgdGhhdCB3ZXJlIG5vdCBzZXQgYnkgdGhlIHVzZXIgd2l0aCB0aGVpciBkZWZhdWx0CisJICogdmFsdWUuCisJICovCisJcWVkX2RiZ19ncmNfc2V0X3BhcmFtc19kZWZhdWx0KHBfaHdmbik7CisKKwkvKiBGaW5kIHBvcnQgbW9kZSAqLworCWlmIChkdW1wKSB7CisJCXN3aXRjaCAocWVkX3JkKHBfaHdmbiwgcF9wdHQsIE1JU0NfUkVHX1BPUlRfTU9ERSkpIHsKKwkJY2FzZSAwOgorCQkJcG9ydF9tb2RlID0gMTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlwb3J0X21vZGUgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXBvcnRfbW9kZSA9IDQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIFVwZGF0ZSByZXNldCBzdGF0ZSAqLworCWlmIChkdW1wKQorCQlxZWRfdXBkYXRlX2Jsb2Nrc19yZXNldF9zdGF0ZShwX2h3Zm4sIHBfcHR0KTsKKworCS8qIER1bXAgZ2xvYmFsIHBhcmFtcyAqLworCW9mZnNldCArPSBxZWRfZHVtcF9jb21tb25fZ2xvYmFsX3BhcmFtcyhwX2h3Zm4sCisJCQkJCQlwX3B0dCwKKwkJCQkJCWR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wLCA0KTsKKwlvZmZzZXQgKz0gcWVkX2R1bXBfc3RyX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgZHVtcCwgImR1bXAtdHlwZSIsICJncmMtZHVtcCIpOworCW9mZnNldCArPSBxZWRfZHVtcF9udW1fcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICBkdW1wLAorCQkJCSAgICAgIm51bS1sY2lkcyIsCisJCQkJICAgICBxZWRfZ3JjX2dldF9wYXJhbShwX2h3Zm4sCisJCQkJCQlEQkdfR1JDX1BBUkFNX05VTV9MQ0lEUykpOworCW9mZnNldCArPSBxZWRfZHVtcF9udW1fcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICBkdW1wLAorCQkJCSAgICAgIm51bS1sdGlkcyIsCisJCQkJICAgICBxZWRfZ3JjX2dldF9wYXJhbShwX2h3Zm4sCisJCQkJCQlEQkdfR1JDX1BBUkFNX05VTV9MVElEUykpOworCW9mZnNldCArPSBxZWRfZHVtcF9udW1fcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICBkdW1wLCAibnVtLXBvcnRzIiwgcG9ydF9tb2RlKTsKKworCS8qIER1bXAgcmVzZXQgcmVnaXN0ZXJzIChkdW1wZWQgYmVmb3JlIHRha2luZyBibG9ja3Mgb3V0IG9mIHJlc2V0ICkgKi8KKwlpZiAocWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sIERCR19HUkNfUEFSQU1fRFVNUF9SRUdTKSkKKwkJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9yZXNldF9yZWdzKHBfaHdmbiwKKwkJCQkJCSAgcF9wdHQsCisJCQkJCQkgIGR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wKTsKKworCS8qIFRha2UgYWxsIGJsb2NrcyBvdXQgb2YgcmVzZXQgKHVzaW5nIHJlc2V0IHJlZ2lzdGVycykgKi8KKwlpZiAoZHVtcCkgeworCQlxZWRfZ3JjX3VucmVzZXRfYmxvY2tzKHBfaHdmbiwgcF9wdHQpOworCQlxZWRfdXBkYXRlX2Jsb2Nrc19yZXNldF9zdGF0ZShwX2h3Zm4sIHBfcHR0KTsKKwl9CisKKwkvKiBEaXNhYmxlIGFsbCBwYXJpdGllcyB1c2luZyBNRlcgY29tbWFuZCAqLworCWlmIChkdW1wKSB7CisJCXBhcml0aWVzX21hc2tlZCA9ICFxZWRfbWNwX21hc2tfcGFyaXRpZXMocF9od2ZuLCBwX3B0dCwgMSk7CisJCWlmICghcGFyaXRpZXNfbWFza2VkKSB7CisJCQlpZiAocWVkX2dyY19nZXRfcGFyYW0KKwkJCSAgICAocF9od2ZuLCBEQkdfR1JDX1BBUkFNX1BBUklUWV9TQUZFKSkKKwkJCQlyZXR1cm4gREJHX1NUQVRVU19NQ1BfQ09VTERfTk9UX01BU0tfUFJUWTsKKwkJCWVsc2UKKwkJCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJCQkgICJGYWlsZWQgdG8gbWFzayBwYXJpdGllcyB1c2luZyBNRldcbiIpOworCQl9CisJfQorCisJLyogRHVtcCBtb2RpZmllZCByZWdpc3RlcnMgKGR1bXBlZCBiZWZvcmUgbW9kaWZ5aW5nIHRoZW0pICovCisJaWYgKHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLCBEQkdfR1JDX1BBUkFNX0RVTVBfUkVHUykpCisJCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfbW9kaWZpZWRfcmVncyhwX2h3Zm4sCisJCQkJCQkgICAgIHBfcHR0LAorCQkJCQkJICAgICBkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCk7CisKKwkvKiBTdGFsbCBzdG9ybXMgKi8KKwlpZiAoZHVtcCAmJgorCSAgICAocWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sCisJCQkJIERCR19HUkNfUEFSQU1fRFVNUF9JT1IpIHx8CisJICAgICBxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwgREJHX0dSQ19QQVJBTV9EVU1QX1ZGQykpKQorCQlxZWRfZ3JjX3N0YWxsX3N0b3JtcyhwX2h3Zm4sIHBfcHR0LCB0cnVlKTsKKworCS8qIER1bXAgYWxsIHJlZ3MgICovCisJaWYgKHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLCBEQkdfR1JDX1BBUkFNX0RVTVBfUkVHUykpIHsKKwkJLyogRHVtcCBhbGwgYmxvY2tzIGV4Y2VwdCBNQ1AgKi8KKwkJYm9vbCBibG9ja19lbmFibGVbTUFYX0JMT0NLX0lEXTsKKworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0JMT0NLX0lEOyBpKyspCisJCQlibG9ja19lbmFibGVbaV0gPSB0cnVlOworCQlibG9ja19lbmFibGVbQkxPQ0tfTUNQXSA9IGZhbHNlOworCQlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX3JlZ2lzdGVycyhwX2h3Zm4sCisJCQkJCQkgcF9wdHQsCisJCQkJCQkgZHVtcF9idWYgKworCQkJCQkJIG9mZnNldCwKKwkJCQkJCSBkdW1wLAorCQkJCQkJIGJsb2NrX2VuYWJsZSwgTlVMTCwgTlVMTCk7CisJfQorCisJLyogRHVtcCBtZW1vcmllcyAqLworCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfbWVtb3JpZXMocF9od2ZuLCBwX3B0dCwgZHVtcF9idWYgKyBvZmZzZXQsIGR1bXApOworCisJLyogRHVtcCBNQ1AgKi8KKwlpZiAocWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sIERCR19HUkNfUEFSQU1fRFVNUF9NQ1ApKQorCQlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX21jcChwX2h3Zm4sCisJCQkJCSAgIHBfcHR0LCBkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCk7CisKKwkvKiBEdW1wIGNvbnRleHQgKi8KKwlpZiAocWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sIERCR19HUkNfUEFSQU1fRFVNUF9DTV9DVFgpKQorCQlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX2N0eChwX2h3Zm4sCisJCQkJCSAgIHBfcHR0LCBkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCk7CisKKwkvKiBEdW1wIFJTUyBtZW1vcmllcyAqLworCWlmIChxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwgREJHX0dSQ19QQVJBTV9EVU1QX1JTUykpCisJCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfcnNzKHBfaHdmbiwKKwkJCQkJICAgcF9wdHQsIGR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wKTsKKworCS8qIER1bXAgQmlnIFJBTSAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fQklHX1JBTV9UWVBFUzsgaSsrKQorCQlpZiAocWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sIHNfYmlnX3JhbV9kZWZzW2ldLmdyY19wYXJhbSkpCisJCQlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX2JpZ19yYW0ocF9od2ZuLAorCQkJCQkJICAgICAgIHBfcHR0LAorCQkJCQkJICAgICAgIGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQkJICAgICAgIGR1bXAsIGkpOworCisJLyogRHVtcCBJT1JzICovCisJaWYgKHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLCBEQkdfR1JDX1BBUkFNX0RVTVBfSU9SKSkKKwkJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9pb3JzKHBfaHdmbiwKKwkJCQkJICAgIHBfcHR0LCBkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCk7CisKKwkvKiBEdW1wIFZGQyAqLworCWlmIChxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwgREJHX0dSQ19QQVJBTV9EVU1QX1ZGQykpCisJCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfdmZjKHBfaHdmbiwKKwkJCQkJICAgcF9wdHQsIGR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wKTsKKworCS8qIER1bXAgUEhZIHRidXMgKi8KKwlpZiAocWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sCisJCQkJREJHX0dSQ19QQVJBTV9EVU1QX1BIWSkgJiYgZGV2X2RhdGEtPmNoaXBfaWQgPT0KKwkgICAgQ0hJUF9LMiAmJiBkZXZfZGF0YS0+cGxhdGZvcm1faWQgPT0gUExBVEZPUk1fQVNJQykKKwkJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9waHkocF9od2ZuLAorCQkJCQkgICBwX3B0dCwgZHVtcF9idWYgKyBvZmZzZXQsIGR1bXApOworCisJLyogRHVtcCBzdGF0aWMgZGVidWcgZGF0YSAgKi8KKwlpZiAocWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sCisJCQkJREJHX0dSQ19QQVJBTV9EVU1QX1NUQVRJQykgJiYKKwkgICAgZGV2X2RhdGEtPmJ1cy5zdGF0ZSA9PSBEQkdfQlVTX1NUQVRFX0lETEUpCisJCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfc3RhdGljX2RlYnVnKHBfaHdmbiwKKwkJCQkJCSAgICBwX3B0dCwKKwkJCQkJCSAgICBkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCk7CisKKwkvKiBEdW1wIGxhc3Qgc2VjdGlvbiAqLworCW9mZnNldCArPSBxZWRfZHVtcF9sYXN0X3NlY3Rpb24oZHVtcF9idWYsIG9mZnNldCwgZHVtcCk7CisJaWYgKGR1bXApIHsKKwkJLyogVW5zdGFsbCBzdG9ybXMgKi8KKwkJaWYgKHFlZF9ncmNfZ2V0X3BhcmFtKHBfaHdmbiwgREJHX0dSQ19QQVJBTV9VTlNUQUxMKSkKKwkJCXFlZF9ncmNfc3RhbGxfc3Rvcm1zKHBfaHdmbiwgcF9wdHQsIGZhbHNlKTsKKworCQkvKiBDbGVhciBwYXJpdHkgc3RhdHVzICovCisJCXFlZF9ncmNfY2xlYXJfYWxsX3BydHkocF9od2ZuLCBwX3B0dCk7CisKKwkJLyogRW5hYmxlIGFsbCBwYXJpdGllcyB1c2luZyBNRlcgY29tbWFuZCAqLworCQlpZiAocGFyaXRpZXNfbWFza2VkKQorCQkJcWVkX21jcF9tYXNrX3Bhcml0aWVzKHBfaHdmbiwgcF9wdHQsIDApOworCX0KKworCSpudW1fZHVtcGVkX2R3b3JkcyA9IG9mZnNldDsKKworCXJldHVybiBEQkdfU1RBVFVTX09LOworfQorCisvKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBmYWlsaW5nIElkbGUgQ2hlY2sgcnVsZSB0byB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAqIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4KKyAqLworc3RhdGljIHUzMiBxZWRfaWRsZV9jaGtfZHVtcF9mYWlsdXJlKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSAgICAgdTMyICoKKwkJCQkgICAgIGR1bXBfYnVmLAorCQkJCSAgICAgYm9vbCBkdW1wLAorCQkJCSAgICAgdTE2IHJ1bGVfaWQsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgZGJnX2lkbGVfY2hrX3J1bGUgKnJ1bGUsCisJCQkJICAgICB1MTYgZmFpbF9lbnRyeV9pZCwgdTMyICpjb25kX3JlZ192YWx1ZXMpCit7CisJY29uc3QgdW5pb24gZGJnX2lkbGVfY2hrX3JlZyAqcmVncyA9ICYoKGNvbnN0IHVuaW9uIGRiZ19pZGxlX2Noa19yZWcgKikKKwkJCQkJICAgICAgIHNfZGJnX2FycmF5cworCQkJCQkgICAgICAgW0JJTl9CVUZfREJHX0lETEVfQ0hLX1JFR1NdLgorCQkJCQkgICAgICAgcHRyKVtydWxlLT5yZWdfb2Zmc2V0XTsKKwljb25zdCBzdHJ1Y3QgZGJnX2lkbGVfY2hrX2NvbmRfcmVnICpjb25kX3JlZ3MgPSAmcmVnc1swXS5jb25kX3JlZzsKKwlzdHJ1Y3QgZGJnX3Rvb2xzX2RhdGEgKmRldl9kYXRhID0gJnBfaHdmbi0+ZGJnX2luZm87CisJc3RydWN0IGRiZ19pZGxlX2Noa19yZXN1bHRfaGRyICpoZHIgPQorCQkoc3RydWN0IGRiZ19pZGxlX2Noa19yZXN1bHRfaGRyICopZHVtcF9idWY7CisJY29uc3Qgc3RydWN0IGRiZ19pZGxlX2Noa19pbmZvX3JlZyAqaW5mb19yZWdzID0KKwkJJnJlZ3NbcnVsZS0+bnVtX2NvbmRfcmVnc10uaW5mb19yZWc7CisJdTMyIG5leHRfcmVnX29mZnNldCA9IDAsIGksIG9mZnNldCA9IDA7CisJdTggcmVnX2lkOworCisJLyogRHVtcCBydWxlIGRhdGEgKi8KKwlpZiAoZHVtcCkgeworCQltZW1zZXQoaGRyLCAwLCBzaXplb2YoKmhkcikpOworCQloZHItPnJ1bGVfaWQgPSBydWxlX2lkOworCQloZHItPm1lbV9lbnRyeV9pZCA9IGZhaWxfZW50cnlfaWQ7CisJCWhkci0+c2V2ZXJpdHkgPSBydWxlLT5zZXZlcml0eTsKKwkJaGRyLT5udW1fZHVtcGVkX2NvbmRfcmVncyA9IHJ1bGUtPm51bV9jb25kX3JlZ3M7CisJfQorCisJb2Zmc2V0ICs9IElETEVfQ0hLX1JFU1VMVF9IRFJfRFdPUkRTOworCisJLyogRHVtcCBjb25kaXRpb24gcmVnaXN0ZXIgdmFsdWVzICovCisJZm9yIChyZWdfaWQgPSAwOyByZWdfaWQgPCBydWxlLT5udW1fY29uZF9yZWdzOyByZWdfaWQrKykgeworCQljb25zdCBzdHJ1Y3QgZGJnX2lkbGVfY2hrX2NvbmRfcmVnICpyZWcgPSAmY29uZF9yZWdzW3JlZ19pZF07CisKKwkJLyogV3JpdGUgcmVnaXN0ZXIgaGVhZGVyICovCisJCWlmIChkdW1wKSB7CisJCQlzdHJ1Y3QgZGJnX2lkbGVfY2hrX3Jlc3VsdF9yZWdfaGRyICpyZWdfaGRyID0KKwkJCSAgICAoc3RydWN0IGRiZ19pZGxlX2Noa19yZXN1bHRfcmVnX2hkciAqKShkdW1wX2J1ZgorCQkJCQkJCQkgICArIG9mZnNldCk7CisJCQlvZmZzZXQgKz0gSURMRV9DSEtfUkVTVUxUX1JFR19IRFJfRFdPUkRTOworCQkJbWVtc2V0KHJlZ19oZHIsIDAsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBkYmdfaWRsZV9jaGtfcmVzdWx0X3JlZ19oZHIpKTsKKwkJCXJlZ19oZHItPnN0YXJ0X2VudHJ5ID0gcmVnLT5zdGFydF9lbnRyeTsKKwkJCXJlZ19oZHItPnNpemUgPSByZWctPmVudHJ5X3NpemU7CisJCQlTRVRfRklFTEQocmVnX2hkci0+ZGF0YSwKKwkJCQkgIERCR19JRExFX0NIS19SRVNVTFRfUkVHX0hEUl9JU19NRU0sCisJCQkJICByZWctPm51bV9lbnRyaWVzID4gMSB8fCByZWctPnN0YXJ0X2VudHJ5ID4gMAorCQkJCSAgPyAxIDogMCk7CisJCQlTRVRfRklFTEQocmVnX2hkci0+ZGF0YSwKKwkJCQkgIERCR19JRExFX0NIS19SRVNVTFRfUkVHX0hEUl9SRUdfSUQsIHJlZ19pZCk7CisKKwkJCS8qIFdyaXRlIHJlZ2lzdGVyIHZhbHVlcyAqLworCQkJZm9yIChpID0gMDsgaSA8IHJlZ19oZHItPnNpemU7CisJCQkgICAgIGkrKywgbmV4dF9yZWdfb2Zmc2V0KyssIG9mZnNldCsrKQorCQkJCWR1bXBfYnVmW29mZnNldF0gPQorCQkJCSAgICBjb25kX3JlZ192YWx1ZXNbbmV4dF9yZWdfb2Zmc2V0XTsKKwkJfSBlbHNlIHsKKwkJCW9mZnNldCArPSBJRExFX0NIS19SRVNVTFRfUkVHX0hEUl9EV09SRFMgKworCQkJICAgIHJlZy0+ZW50cnlfc2l6ZTsKKwkJfQorCX0KKworCS8qIER1bXAgaW5mbyByZWdpc3RlciB2YWx1ZXMgKi8KKwlmb3IgKHJlZ19pZCA9IDA7IHJlZ19pZCA8IHJ1bGUtPm51bV9pbmZvX3JlZ3M7IHJlZ19pZCsrKSB7CisJCWNvbnN0IHN0cnVjdCBkYmdfaWRsZV9jaGtfaW5mb19yZWcgKnJlZyA9ICZpbmZvX3JlZ3NbcmVnX2lkXTsKKwkJdTMyIGJsb2NrX2lkOworCisJCWlmICghZHVtcCkgeworCQkJb2Zmc2V0ICs9IElETEVfQ0hLX1JFU1VMVF9SRUdfSERSX0RXT1JEUyArIHJlZy0+c2l6ZTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogQ2hlY2sgaWYgcmVnaXN0ZXIncyBibG9jayBpcyBpbiByZXNldCAqLworCQlibG9ja19pZCA9IEdFVF9GSUVMRChyZWctPmRhdGEsIERCR19JRExFX0NIS19JTkZPX1JFR19CTE9DS19JRCk7CisJCWlmIChibG9ja19pZCA+PSBNQVhfQkxPQ0tfSUQpIHsKKwkJCURQX05PVElDRShwX2h3Zm4sICJJbnZhbGlkIGJsb2NrX2lkXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFkZXZfZGF0YS0+YmxvY2tfaW5fcmVzZXRbYmxvY2tfaWRdKSB7CisJCQlib29sIGV2YWxfbW9kZSA9IEdFVF9GSUVMRChyZWctPm1vZGUuZGF0YSwKKwkJCQkJCSAgIERCR19NT0RFX0hEUl9FVkFMX01PREUpID4gMDsKKwkJCWJvb2wgbW9kZV9tYXRjaCA9IHRydWU7CisKKwkJCS8qIENoZWNrIG1vZGUgKi8KKwkJCWlmIChldmFsX21vZGUpIHsKKwkJCQl1MTYgbW9kZXNfYnVmX29mZnNldCA9CisJCQkJCUdFVF9GSUVMRChyZWctPm1vZGUuZGF0YSwKKwkJCQkJCURCR19NT0RFX0hEUl9NT0RFU19CVUZfT0ZGU0VUKTsKKwkJCQltb2RlX21hdGNoID0KKwkJCQkJcWVkX2lzX21vZGVfbWF0Y2gocF9od2ZuLAorCQkJCQkJCSAgJm1vZGVzX2J1Zl9vZmZzZXQpOworCQkJfQorCisJCQlpZiAobW9kZV9tYXRjaCkgeworCQkJCXUzMiBncmNfYWRkciA9CisJCQkJCURXT1JEU19UT19CWVRFUyhHRVRfRklFTEQocmVnLT5kYXRhLAorCQkJCQkJREJHX0lETEVfQ0hLX0lORk9fUkVHX0FERFJFU1MpKTsKKworCQkJCS8qIFdyaXRlIHJlZ2lzdGVyIGhlYWRlciAqLworCQkJCXN0cnVjdCBkYmdfaWRsZV9jaGtfcmVzdWx0X3JlZ19oZHIgKnJlZ19oZHIgPQorCQkJCQkoc3RydWN0IGRiZ19pZGxlX2Noa19yZXN1bHRfcmVnX2hkciAqKQorCQkJCQkoZHVtcF9idWYgKyBvZmZzZXQpOworCisJCQkJb2Zmc2V0ICs9IElETEVfQ0hLX1JFU1VMVF9SRUdfSERSX0RXT1JEUzsKKwkJCQloZHItPm51bV9kdW1wZWRfaW5mb19yZWdzKys7CisJCQkJbWVtc2V0KHJlZ19oZHIsIDAsIHNpemVvZigqcmVnX2hkcikpOworCQkJCXJlZ19oZHItPnNpemUgPSByZWctPnNpemU7CisJCQkJU0VUX0ZJRUxEKHJlZ19oZHItPmRhdGEsCisJCQkJCURCR19JRExFX0NIS19SRVNVTFRfUkVHX0hEUl9SRUdfSUQsCisJCQkJCXJ1bGUtPm51bV9jb25kX3JlZ3MgKyByZWdfaWQpOworCisJCQkJLyogV3JpdGUgcmVnaXN0ZXIgdmFsdWVzICovCisJCQkJZm9yIChpID0gMDsgaSA8IHJlZy0+c2l6ZTsKKwkJCQkgICAgIGkrKywgb2Zmc2V0KyssIGdyY19hZGRyICs9IDQpCisJCQkJCWR1bXBfYnVmW29mZnNldF0gPQorCQkJCQkJcWVkX3JkKHBfaHdmbiwgcF9wdHQsIGdyY19hZGRyKTsKKwkJCQl9CisJCQl9CisJfQorCisJcmV0dXJuIG9mZnNldDsKK30KKworLyogRHVtcHMgaWRsZSBjaGVjayBydWxlIGVudHJpZXMuIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4gKi8KK3N0YXRpYyB1MzIKK3FlZF9pZGxlX2Noa19kdW1wX3J1bGVfZW50cmllcyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJICAgICAgIHUzMiAqZHVtcF9idWYsIGJvb2wgZHVtcCwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZGJnX2lkbGVfY2hrX3J1bGUgKmlucHV0X3J1bGVzLAorCQkJICAgICAgIHUzMiBudW1faW5wdXRfcnVsZXMsIHUzMiAqbnVtX2ZhaWxpbmdfcnVsZXMpCit7CisJc3RydWN0IGRiZ190b29sc19kYXRhICpkZXZfZGF0YSA9ICZwX2h3Zm4tPmRiZ19pbmZvOworCXUzMiBjb25kX3JlZ192YWx1ZXNbSURMRV9DSEtfTUFYX0VOVFJJRVNfU0laRV07CisJdTMyIGksIGosIG9mZnNldCA9IDA7CisJdTE2IGVudHJ5X2lkOworCXU4IHJlZ19pZDsKKworCSpudW1fZmFpbGluZ19ydWxlcyA9IDA7CisJZm9yIChpID0gMDsgaSA8IG51bV9pbnB1dF9ydWxlczsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBkYmdfaWRsZV9jaGtfY29uZF9yZWcgKmNvbmRfcmVnczsKKwkJY29uc3Qgc3RydWN0IGRiZ19pZGxlX2Noa19ydWxlICpydWxlOworCQljb25zdCB1bmlvbiBkYmdfaWRsZV9jaGtfcmVnICpyZWdzOworCQl1MTYgbnVtX3JlZ19lbnRyaWVzID0gMTsKKwkJYm9vbCBjaGVja19ydWxlID0gdHJ1ZTsKKwkJY29uc3QgdTMyICppbW1fdmFsdWVzOworCisJCXJ1bGUgPSAmaW5wdXRfcnVsZXNbaV07CisJCXJlZ3MgPSAmKChjb25zdCB1bmlvbiBkYmdfaWRsZV9jaGtfcmVnICopCisJCQkgc19kYmdfYXJyYXlzW0JJTl9CVUZfREJHX0lETEVfQ0hLX1JFR1NdLnB0cikKKwkJCVtydWxlLT5yZWdfb2Zmc2V0XTsKKwkJY29uZF9yZWdzID0gJnJlZ3NbMF0uY29uZF9yZWc7CisJCWltbV92YWx1ZXMgPSAmc19kYmdfYXJyYXlzW0JJTl9CVUZfREJHX0lETEVfQ0hLX0lNTVNdLnB0cgorCQkJICAgICBbcnVsZS0+aW1tX29mZnNldF07CisKKwkJLyogQ2hlY2sgaWYgYWxsIGNvbmRpdGlvbiByZWdpc3RlciBibG9ja3MgYXJlIG91dCBvZiByZXNldCwgYW5kCisJCSAqIGZpbmQgbWF4aW1hbCBudW1iZXIgb2YgZW50cmllcyAoYWxsIGNvbmRpdGlvbiByZWdpc3RlcnMgdGhhdAorCQkgKiBhcmUgbWVtb3JpZXMgbXVzdCBoYXZlIHRoZSBzYW1lIHNpemUsIHdoaWNoIGlzID4gMSkuCisJCSAqLworCQlmb3IgKHJlZ19pZCA9IDA7IHJlZ19pZCA8IHJ1bGUtPm51bV9jb25kX3JlZ3MgJiYgY2hlY2tfcnVsZTsKKwkJICAgICByZWdfaWQrKykgeworCQkJdTMyIGJsb2NrX2lkID0gR0VUX0ZJRUxEKGNvbmRfcmVnc1tyZWdfaWRdLmRhdGEsCisJCQkJCQlEQkdfSURMRV9DSEtfQ09ORF9SRUdfQkxPQ0tfSUQpOworCisJCQlpZiAoYmxvY2tfaWQgPj0gTUFYX0JMT0NLX0lEKSB7CisJCQkJRFBfTk9USUNFKHBfaHdmbiwgIkludmFsaWQgYmxvY2tfaWRcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQljaGVja19ydWxlID0gIWRldl9kYXRhLT5ibG9ja19pbl9yZXNldFtibG9ja19pZF07CisJCQlpZiAoY29uZF9yZWdzW3JlZ19pZF0ubnVtX2VudHJpZXMgPiBudW1fcmVnX2VudHJpZXMpCisJCQkJbnVtX3JlZ19lbnRyaWVzID0gY29uZF9yZWdzW3JlZ19pZF0ubnVtX2VudHJpZXM7CisJCX0KKworCQlpZiAoIWNoZWNrX3J1bGUgJiYgZHVtcCkKKwkJCWNvbnRpbnVlOworCisJCS8qIEdvIG92ZXIgYWxsIHJlZ2lzdGVyIGVudHJpZXMgKG51bWJlciBvZiBlbnRyaWVzIGlzIHRoZSBzYW1lCisJCSAqIGZvciBhbGwgY29uZGl0aW9uIHJlZ2lzdGVycykuCisJCSAqLworCQlmb3IgKGVudHJ5X2lkID0gMDsgZW50cnlfaWQgPCBudW1fcmVnX2VudHJpZXM7IGVudHJ5X2lkKyspIHsKKwkJCS8qIFJlYWQgY3VycmVudCBlbnRyeSBvZiBhbGwgY29uZGl0aW9uIHJlZ2lzdGVycyAqLworCQkJaWYgKGR1bXApIHsKKwkJCQl1MzIgbmV4dF9yZWdfb2Zmc2V0ID0gMDsKKworCQkJCWZvciAocmVnX2lkID0gMDsKKwkJCQkgICAgIHJlZ19pZCA8IHJ1bGUtPm51bV9jb25kX3JlZ3M7CisJCQkJICAgICByZWdfaWQrKykgeworCQkJCQljb25zdCBzdHJ1Y3QgZGJnX2lkbGVfY2hrX2NvbmRfcmVnCisJCQkJCQkqcmVnID0gJmNvbmRfcmVnc1tyZWdfaWRdOworCisJCQkJCS8qIEZpbmQgR1JDIGFkZHJlc3MgKGlmIGl0J3MgYSBtZW1vcnksCisJCQkJCSAqIHRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpYyBlbnRyeSBpcworCQkJCQkgKiBjYWxjdWxhdGVkKS4KKwkJCQkJICovCisJCQkJCXUzMiBncmNfYWRkciA9CisJCQkJCSAgIERXT1JEU19UT19CWVRFUygKKwkJCQkJCUdFVF9GSUVMRChyZWctPmRhdGEsCisJCQkJCQkgICAgREJHX0lETEVfQ0hLX0NPTkRfUkVHX0FERFJFU1MpKTsKKworCQkJCQlpZiAocmVnLT5udW1fZW50cmllcyA+IDEgfHwKKwkJCQkJICAgIHJlZy0+c3RhcnRfZW50cnkgPiAwKSB7CisJCQkJCQl1MzIgcGFkZGVkX2VudHJ5X3NpemUgPQorCQkJCQkJCXJlZy0+ZW50cnlfc2l6ZSA+IDEgPworCQkJCQkJCXJvdW5kdXBfcG93X29mX3R3bworCQkJCQkJCShyZWctPmVudHJ5X3NpemUpIDogMTsKKworCQkJCQkJZ3JjX2FkZHIgKz0KKwkJCQkJCQlEV09SRFNfVE9fQllURVMoCisJCQkJCQkJCShyZWctPnN0YXJ0X2VudHJ5ICsKKwkJCQkJCQkJZW50cnlfaWQpCisJCQkJCQkJCSogcGFkZGVkX2VudHJ5X3NpemUpOworCQkJCQl9CisKKwkJCQkJLyogUmVhZCByZWdpc3RlcnMgKi8KKwkJCQkJaWYgKG5leHRfcmVnX29mZnNldCArIHJlZy0+ZW50cnlfc2l6ZSA+PQorCQkJCQkgICAgSURMRV9DSEtfTUFYX0VOVFJJRVNfU0laRSkgeworCQkJCQkJRFBfTk9USUNFKHBfaHdmbiwKKwkJCQkJCQkgICJpZGxlIGNoZWNrIHJlZ2lzdGVycyBlbnRyeSBpcyB0b28gbGFyZ2VcbiIpOworCQkJCQkJcmV0dXJuIDA7CisJCQkJCX0KKworCQkJCQlmb3IgKGogPSAwOyBqIDwgcmVnLT5lbnRyeV9zaXplOworCQkJCQkgICAgIGorKywgbmV4dF9yZWdfb2Zmc2V0KyssCisJCQkJCSAgICAgZ3JjX2FkZHIgKz0gNCkKKwkJCQkJICAgICBjb25kX3JlZ192YWx1ZXNbbmV4dF9yZWdfb2Zmc2V0XSA9CisJCQkJCQlxZWRfcmQocF9od2ZuLCBwX3B0dCwgZ3JjX2FkZHIpOworCQkJCX0KKwkJCX0KKworCQkJLyogQ2FsbCBydWxlJ3MgY29uZGl0aW9uIGZ1bmN0aW9uIC0gYSByZXR1cm4gdmFsdWUgb2YKKwkJCSAqIHRydWUgaW5kaWNhdGVzIGZhaWx1cmUuCisJCQkgKi8KKwkJCWlmICgoKmNvbmRfYXJyW3J1bGUtPmNvbmRfaWRdKShjb25kX3JlZ192YWx1ZXMsCisJCQkJCQkgICAgICAgaW1tX3ZhbHVlcykgfHwgIWR1bXApIHsKKwkJCQlvZmZzZXQgKz0KKwkJCQkJcWVkX2lkbGVfY2hrX2R1bXBfZmFpbHVyZShwX2h3Zm4sCisJCQkJCQkJcF9wdHQsCisJCQkJCQkJZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCQkJZHVtcCwKKwkJCQkJCQlydWxlLT5ydWxlX2lkLAorCQkJCQkJCXJ1bGUsCisJCQkJCQkJZW50cnlfaWQsCisJCQkJCQkJY29uZF9yZWdfdmFsdWVzKTsKKwkJCQkoKm51bV9mYWlsaW5nX3J1bGVzKSsrOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIG9mZnNldDsKK30KKworLyogUGVyZm9ybXMgSWRsZSBDaGVjayBEdW1wIHRvIHRoZSBzcGVjaWZpZWQgYnVmZmVyLgorICogUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLgorICovCitzdGF0aWMgdTMyIHFlZF9pZGxlX2Noa19kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHUzMiAqZHVtcF9idWYsIGJvb2wgZHVtcCkKK3sKKwl1MzIgb2Zmc2V0ID0gMCwgaW5wdXRfb2Zmc2V0ID0gMCwgbnVtX2ZhaWxpbmdfcnVsZXMgPSAwOworCXUzMiBudW1fZmFpbGluZ19ydWxlc19vZmZzZXQ7CisKKwkvKiBEdW1wIGdsb2JhbCBwYXJhbXMgKi8KKwlvZmZzZXQgKz0gcWVkX2R1bXBfY29tbW9uX2dsb2JhbF9wYXJhbXMocF9od2ZuLAorCQkJCQkJcF9wdHQsCisJCQkJCQlkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCwgMSk7CisJb2Zmc2V0ICs9IHFlZF9kdW1wX3N0cl9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgIGR1bXAsICJkdW1wLXR5cGUiLCAiaWRsZS1jaGsiKTsKKworCS8qIER1bXAgaWRsZSBjaGVjayBzZWN0aW9uIGhlYWRlciB3aXRoIGEgc2luZ2xlIHBhcmFtZXRlciAqLworCW9mZnNldCArPSBxZWRfZHVtcF9zZWN0aW9uX2hkcihkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCwgImlkbGVfY2hrIiwgMSk7CisJbnVtX2ZhaWxpbmdfcnVsZXNfb2Zmc2V0ID0gb2Zmc2V0OworCW9mZnNldCArPSBxZWRfZHVtcF9udW1fcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsIGR1bXAsICJudW1fcnVsZXMiLCAwKTsKKwl3aGlsZSAoaW5wdXRfb2Zmc2V0IDwKKwkgICAgICAgc19kYmdfYXJyYXlzW0JJTl9CVUZfREJHX0lETEVfQ0hLX1JVTEVTXS5zaXplX2luX2R3b3JkcykgeworCQljb25zdCBzdHJ1Y3QgZGJnX2lkbGVfY2hrX2NvbmRfaGRyICpjb25kX2hkciA9CisJCQkoY29uc3Qgc3RydWN0IGRiZ19pZGxlX2Noa19jb25kX2hkciAqKQorCQkJJnNfZGJnX2FycmF5c1tCSU5fQlVGX0RCR19JRExFX0NIS19SVUxFU10ucHRyCisJCQlbaW5wdXRfb2Zmc2V0KytdOworCQlib29sIGV2YWxfbW9kZSA9IEdFVF9GSUVMRChjb25kX2hkci0+bW9kZS5kYXRhLAorCQkJCQkgICBEQkdfTU9ERV9IRFJfRVZBTF9NT0RFKSA+IDA7CisJCWJvb2wgbW9kZV9tYXRjaCA9IHRydWU7CisKKwkJLyogQ2hlY2sgbW9kZSAqLworCQlpZiAoZXZhbF9tb2RlKSB7CisJCQl1MTYgbW9kZXNfYnVmX29mZnNldCA9CisJCQkJR0VUX0ZJRUxEKGNvbmRfaGRyLT5tb2RlLmRhdGEsCisJCQkJCSAgREJHX01PREVfSERSX01PREVTX0JVRl9PRkZTRVQpOworCisJCQltb2RlX21hdGNoID0gcWVkX2lzX21vZGVfbWF0Y2gocF9od2ZuLAorCQkJCQkJICAgICAgICZtb2Rlc19idWZfb2Zmc2V0KTsKKwkJfQorCisJCWlmIChtb2RlX21hdGNoKSB7CisJCQl1MzIgY3Vycl9mYWlsaW5nX3J1bGVzOworCisJCQlvZmZzZXQgKz0KKwkJCSAgICBxZWRfaWRsZV9jaGtfZHVtcF9ydWxlX2VudHJpZXMocF9od2ZuLAorCQkJCXBfcHR0LAorCQkJCWR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCWR1bXAsCisJCQkJKGNvbnN0IHN0cnVjdCBkYmdfaWRsZV9jaGtfcnVsZSAqKQorCQkJCSZzX2RiZ19hcnJheXNbQklOX0JVRl9EQkdfSURMRV9DSEtfUlVMRVNdLgorCQkJCXB0cltpbnB1dF9vZmZzZXRdLAorCQkJCWNvbmRfaGRyLT5kYXRhX3NpemUgLyBJRExFX0NIS19SVUxFX1NJWkVfRFdPUkRTLAorCQkJCSZjdXJyX2ZhaWxpbmdfcnVsZXMpOworCQkJbnVtX2ZhaWxpbmdfcnVsZXMgKz0gY3Vycl9mYWlsaW5nX3J1bGVzOworCQl9CisKKwkJaW5wdXRfb2Zmc2V0ICs9IGNvbmRfaGRyLT5kYXRhX3NpemU7CisJfQorCisJLyogT3ZlcndyaXRlIG51bV9ydWxlcyBwYXJhbWV0ZXIgKi8KKwlpZiAoZHVtcCkKKwkJcWVkX2R1bXBfbnVtX3BhcmFtKGR1bXBfYnVmICsgbnVtX2ZhaWxpbmdfcnVsZXNfb2Zmc2V0LAorCQkJCSAgIGR1bXAsICJudW1fcnVsZXMiLCBudW1fZmFpbGluZ19ydWxlcyk7CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKiBGaW5kcyB0aGUgbWV0YSBkYXRhIGltYWdlIGluIE5WUkFNLiAqLworc3RhdGljIGVudW0gZGJnX3N0YXR1cyBxZWRfZmluZF9udnJhbV9pbWFnZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkJICAgIHUzMiBpbWFnZV90eXBlLAorCQkJCQkgICAgdTMyICpudnJhbV9vZmZzZXRfYnl0ZXMsCisJCQkJCSAgICB1MzIgKm52cmFtX3NpemVfYnl0ZXMpCit7CisJdTMyIHJldF9tY3BfcmVzcCwgcmV0X21jcF9wYXJhbSwgcmV0X3R4bl9zaXplOworCXN0cnVjdCBtY3BfZmlsZV9hdHQgZmlsZV9hdHQ7CisKKwkvKiBDYWxsIE5WUkFNIGdldCBmaWxlIGNvbW1hbmQgKi8KKwlpZiAocWVkX21jcF9udm1fcmRfY21kKHBfaHdmbiwgcF9wdHQsIERSVl9NU0dfQ09ERV9OVk1fR0VUX0ZJTEVfQVRULAorCQkJICAgICAgIGltYWdlX3R5cGUsICZyZXRfbWNwX3Jlc3AsICZyZXRfbWNwX3BhcmFtLAorCQkJICAgICAgICZyZXRfdHhuX3NpemUsICh1MzIgKikmZmlsZV9hdHQpICE9IDApCisJCXJldHVybiBEQkdfU1RBVFVTX05WUkFNX0dFVF9JTUFHRV9GQUlMRUQ7CisKKwkvKiBDaGVjayByZXNwb25zZSAqLworCWlmICgocmV0X21jcF9yZXNwICYgRldfTVNHX0NPREVfTUFTSykgIT0gRldfTVNHX0NPREVfTlZNX09LKQorCQlyZXR1cm4gREJHX1NUQVRVU19OVlJBTV9HRVRfSU1BR0VfRkFJTEVEOworCisJLyogVXBkYXRlIHJldHVybiB2YWx1ZXMgKi8KKwkqbnZyYW1fb2Zmc2V0X2J5dGVzID0gZmlsZV9hdHQubnZtX3N0YXJ0X2FkZHI7CisJKm52cmFtX3NpemVfYnl0ZXMgPSBmaWxlX2F0dC5sZW47CisJRFBfVkVSQk9TRShwX2h3Zm4sCisJCSAgIFFFRF9NU0dfREVCVUcsCisJCSAgICJmaW5kX252cmFtX2ltYWdlOiBmb3VuZCBOVlJBTSBpbWFnZSBvZiB0eXBlICVkIGluIE5WUkFNIG9mZnNldCAlZCBieXRlcyB3aXRoIHNpemUgJWQgYnl0ZXNcbiIsCisJCSAgIGltYWdlX3R5cGUsICpudnJhbV9vZmZzZXRfYnl0ZXMsICpudnJhbV9zaXplX2J5dGVzKTsKKworCS8qIENoZWNrIGFsaWdubWVudCAqLworCWlmICgqbnZyYW1fc2l6ZV9ieXRlcyAmIDB4MykKKwkJcmV0dXJuIERCR19TVEFUVVNfTk9OX0FMSUdORURfTlZSQU1fSU1BR0U7CisJcmV0dXJuIERCR19TVEFUVVNfT0s7Cit9CisKK3N0YXRpYyBlbnVtIGRiZ19zdGF0dXMgcWVkX252cmFtX3JlYWQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSAgICAgIHUzMiBudnJhbV9vZmZzZXRfYnl0ZXMsCisJCQkJICAgICAgdTMyIG52cmFtX3NpemVfYnl0ZXMsIHUzMiAqcmV0X2J1ZikKK3sKKwl1MzIgcmV0X21jcF9yZXNwLCByZXRfbWNwX3BhcmFtLCByZXRfcmVhZF9zaXplOworCXUzMiBieXRlc190b19jb3B5LCByZWFkX29mZnNldCA9IDA7CisJczMyIGJ5dGVzX2xlZnQgPSBudnJhbV9zaXplX2J5dGVzOworCisJRFBfVkVSQk9TRShwX2h3Zm4sCisJCSAgIFFFRF9NU0dfREVCVUcsCisJCSAgICJudnJhbV9yZWFkOiByZWFkaW5nIGltYWdlIG9mIHNpemUgJWQgYnl0ZXMgZnJvbSBOVlJBTVxuIiwKKwkJICAgbnZyYW1fc2l6ZV9ieXRlcyk7CisJZG8geworCQlieXRlc190b19jb3B5ID0KKwkJICAgIChieXRlc19sZWZ0ID4KKwkJICAgICBNQ1BfRFJWX05WTV9CVUZfTEVOKSA/IE1DUF9EUlZfTlZNX0JVRl9MRU4gOiBieXRlc19sZWZ0OworCisJCS8qIENhbGwgTlZSQU0gcmVhZCBjb21tYW5kICovCisJCWlmIChxZWRfbWNwX252bV9yZF9jbWQocF9od2ZuLCBwX3B0dCwKKwkJCQkgICAgICAgRFJWX01TR19DT0RFX05WTV9SRUFEX05WUkFNLAorCQkJCSAgICAgICAobnZyYW1fb2Zmc2V0X2J5dGVzICsKKwkJCQkJcmVhZF9vZmZzZXQpIHwKKwkJCQkgICAgICAgKGJ5dGVzX3RvX2NvcHkgPDwKKwkJCQkJRFJWX01CX1BBUkFNX05WTV9MRU5fU0hJRlQpLAorCQkJCSAgICAgICAmcmV0X21jcF9yZXNwLCAmcmV0X21jcF9wYXJhbSwKKwkJCQkgICAgICAgJnJldF9yZWFkX3NpemUsCisJCQkJICAgICAgICh1MzIgKikoKHU4ICopcmV0X2J1ZiArCisJCQkJCSAgICAgICByZWFkX29mZnNldCkpICE9IDApCisJCQlyZXR1cm4gREJHX1NUQVRVU19OVlJBTV9SRUFEX0ZBSUxFRDsKKworCQkvKiBDaGVjayByZXNwb25zZSAqLworCQlpZiAoKHJldF9tY3BfcmVzcCAmIEZXX01TR19DT0RFX01BU0spICE9IEZXX01TR19DT0RFX05WTV9PSykKKwkJCXJldHVybiBEQkdfU1RBVFVTX05WUkFNX1JFQURfRkFJTEVEOworCisJCS8qIFVwZGF0ZSByZWFkIG9mZnNldCAqLworCQlyZWFkX29mZnNldCArPSByZXRfcmVhZF9zaXplOworCQlieXRlc19sZWZ0IC09IHJldF9yZWFkX3NpemU7CisJfSB3aGlsZSAoYnl0ZXNfbGVmdCA+IDApOworCisJcmV0dXJuIERCR19TVEFUVVNfT0s7Cit9CisKKy8qIEdldCBpbmZvIG9uIHRoZSBNQ1AgVHJhY2UgZGF0YSBpbiB0aGUgc2NyYXRjaHBhZDoKKyAqIC0gdHJhY2VfZGF0YV9ncmNfYWRkciAtIHRoZSBHUkMgYWRkcmVzcyBvZiB0aGUgdHJhY2UgZGF0YQorICogLSB0cmFjZV9kYXRhX3NpemVfYnl0ZXMgLSB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgTUNQIFRyYWNlIGRhdGEgKHdpdGhvdXQKKyAqCXRoZSBoZWFkZXIpCisgKi8KK3N0YXRpYyBlbnVtIGRiZ19zdGF0dXMgcWVkX21jcF90cmFjZV9nZXRfZGF0YV9pbmZvKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCQkJICAgdTMyICp0cmFjZV9kYXRhX2dyY19hZGRyLAorCQkJCQkJICAgdTMyICp0cmFjZV9kYXRhX3NpemVfYnl0ZXMpCit7CisJLyogUmVhZCBNQ1AgdHJhY2Ugc2VjdGlvbiBvZmZzaXplIHN0cnVjdHVyZSBmcm9tIE1DUCBzY3JhdGNocGFkICovCisJdTMyIHNwYWRfdHJhY2Vfb2Zmc2l6ZSA9IHFlZF9yZChwX2h3Zm4sCisJCQkJCXBfcHR0LAorCQkJCQlNQ1BfU1BBRF9UUkFDRV9PRkZTSVpFX0FERFIpOworCXUzMiBzaWduYXR1cmU7CisKKwkvKiBFeHRyYWN0IE1DUCB0cmFjZSBzZWN0aW9uIEdSQyBhZGRyZXNzIGZyb20gb2Zmc2l6ZSBzdHJ1Y3R1cmUgKHdpdGhpbgorCSAqIHNjcmF0Y2hwYWQpLgorCSAqLworCSp0cmFjZV9kYXRhX2dyY19hZGRyID0KKwkJTUNQX1JFR19TQ1JBVENIICsgU0VDVElPTl9PRkZTRVQoc3BhZF90cmFjZV9vZmZzaXplKTsKKworCS8qIFJlYWQgc2lnbmF0dXJlIGZyb20gTUNQIHRyYWNlIHNlY3Rpb24gKi8KKwlzaWduYXR1cmUgPSBxZWRfcmQocF9od2ZuLCBwX3B0dCwKKwkJCSAgICp0cmFjZV9kYXRhX2dyY19hZGRyICsKKwkJCSAgIG9mZnNldG9mKHN0cnVjdCBtY3BfdHJhY2UsIHNpZ25hdHVyZSkpOworCWlmIChzaWduYXR1cmUgIT0gTUZXX1RSQUNFX1NJR05BVFVSRSkKKwkJcmV0dXJuIERCR19TVEFUVVNfSU5WQUxJRF9UUkFDRV9TSUdOQVRVUkU7CisKKwkvKiBSZWFkIHRyYWNlIHNpemUgZnJvbSBNQ1AgdHJhY2Ugc2VjdGlvbiAqLworCSp0cmFjZV9kYXRhX3NpemVfYnl0ZXMgPSBxZWRfcmQocF9od2ZuLAorCQkJCQlwX3B0dCwKKwkJCQkJKnRyYWNlX2RhdGFfZ3JjX2FkZHIgKworCQkJCQlvZmZzZXRvZihzdHJ1Y3QgbWNwX3RyYWNlLCBzaXplKSk7CisJcmV0dXJuIERCR19TVEFUVVNfT0s7Cit9CisKKy8qIFJlYWRzIE1DUCB0cmFjZSBtZXRhIGRhdGEgaW1hZ2UgZnJvbSBOVlJBTS4KKyAqIC0gcnVubmluZ19idW5kbGVfaWQgKE9VVCkgLSB0aGUgcnVubmluZyBidW5kbGUgSUQgKGludmFsaWQgd2hlbiBsb2FkZWQgZnJvbQorICoJZmlsZSkKKyAqIC0gdHJhY2VfbWV0YV9vZmZzZXRfYnl0ZXMgKE9VVCkgLSB0aGUgTlZSQU0gb2Zmc2V0IGluIGJ5dGVzIGluIHdoaWNoIHRoZSBNQ1AKKyAqCVRyYWNlIG1ldGEgZGF0YSBzdGFydHMgKGludmFsaWQgd2hlbiBsb2FkZWQgZnJvbSBmaWxlKQorICogLSB0cmFjZV9tZXRhX3NpemVfYnl0ZXMgKE9VVCkgLSB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgTUNQIFRyYWNlIG1ldGEgZGF0YQorICovCitzdGF0aWMgZW51bSBkYmdfc3RhdHVzIHFlZF9tY3BfdHJhY2VfZ2V0X21ldGFfaW5mbyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkJCSAgIHUzMiB0cmFjZV9kYXRhX3NpemVfYnl0ZXMsCisJCQkJCQkgICB1MzIgKnJ1bm5pbmdfYnVuZGxlX2lkLAorCQkJCQkJICAgdTMyICp0cmFjZV9tZXRhX29mZnNldF9ieXRlcywKKwkJCQkJCSAgIHUzMiAqdHJhY2VfbWV0YV9zaXplX2J5dGVzKQoreworCS8qIFJlYWQgTUNQIHRyYWNlIHNlY3Rpb24gb2Zmc2l6ZSBzdHJ1Y3R1cmUgZnJvbSBNQ1Agc2NyYXRjaHBhZCAqLworCXUzMiBzcGFkX3RyYWNlX29mZnNpemUgPSBxZWRfcmQocF9od2ZuLAorCQkJCQlwX3B0dCwKKwkJCQkJTUNQX1NQQURfVFJBQ0VfT0ZGU0laRV9BRERSKTsKKworCS8qIEZpbmQgcnVubmluZyBidW5kbGUgSUQgKi8KKwl1MzIgcnVubmluZ19tZndfYWRkciA9CisJCU1DUF9SRUdfU0NSQVRDSCArIFNFQ1RJT05fT0ZGU0VUKHNwYWRfdHJhY2Vfb2Zmc2l6ZSkgKworCQlRRURfU0VDVElPTl9TSVpFKHNwYWRfdHJhY2Vfb2Zmc2l6ZSkgKyB0cmFjZV9kYXRhX3NpemVfYnl0ZXM7CisJZW51bSBkYmdfc3RhdHVzIHN0YXR1czsKKwl1MzIgbnZyYW1faW1hZ2VfdHlwZTsKKworCSpydW5uaW5nX2J1bmRsZV9pZCA9IHFlZF9yZChwX2h3Zm4sIHBfcHR0LCBydW5uaW5nX21md19hZGRyKTsKKwlpZiAoKnJ1bm5pbmdfYnVuZGxlX2lkID4gMSkKKwkJcmV0dXJuIERCR19TVEFUVVNfSU5WQUxJRF9OVlJBTV9CVU5ETEU7CisKKwkvKiBGaW5kIGltYWdlIGluIE5WUkFNICovCisJbnZyYW1faW1hZ2VfdHlwZSA9CisJICAgICgqcnVubmluZ19idW5kbGVfaWQgPT0KKwkgICAgIERJUl9JRF8xKSA/IE5WTV9UWVBFX01GV19UUkFDRTEgOiBOVk1fVFlQRV9NRldfVFJBQ0UyOworCXN0YXR1cyA9IHFlZF9maW5kX252cmFtX2ltYWdlKHBfaHdmbiwKKwkJCQkgICAgICBwX3B0dCwKKwkJCQkgICAgICBudnJhbV9pbWFnZV90eXBlLAorCQkJCSAgICAgIHRyYWNlX21ldGFfb2Zmc2V0X2J5dGVzLAorCQkJCSAgICAgIHRyYWNlX21ldGFfc2l6ZV9ieXRlcyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBSZWFkcyB0aGUgTUNQIFRyYWNlIGRhdGEgZnJvbSB0aGUgc3BlY2lmaWVkIEdSQyBhZGRyZXNzIGludG8gdGhlIHNwZWNpZmllZAorICogYnVmZmVyLgorICovCitzdGF0aWMgdm9pZCBxZWRfbWNwX3RyYWNlX3JlYWRfZGF0YShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSAgICB1MzIgZ3JjX2FkZHIsIHUzMiBzaXplX2luX2R3b3JkcywgdTMyICpidWYpCit7CisJdTMyIGk7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwKKwkJICAgUUVEX01TR19ERUJVRywKKwkJICAgIm1jcF90cmFjZV9yZWFkX2RhdGE6IHJlYWRpbmcgdHJhY2UgZGF0YSBvZiBzaXplICVkIGR3b3JkcyBmcm9tIEdSQyBhZGRyZXNzIDB4JXhcbiIsCisJCSAgIHNpemVfaW5fZHdvcmRzLCBncmNfYWRkcik7CisJZm9yIChpID0gMDsgaSA8IHNpemVfaW5fZHdvcmRzOyBpKyssIGdyY19hZGRyICs9IEJZVEVTX0lOX0RXT1JEKQorCQlidWZbaV0gPSBxZWRfcmQocF9od2ZuLCBwX3B0dCwgZ3JjX2FkZHIpOworfQorCisvKiBSZWFkcyB0aGUgTUNQIFRyYWNlIG1ldGEgZGF0YSAoZnJvbSBOVlJBTSBvciBidWZmZXIpIGludG8gdGhlIHNwZWNpZmllZAorICogYnVmZmVyLgorICovCitzdGF0aWMgZW51bSBkYmdfc3RhdHVzIHFlZF9tY3BfdHJhY2VfcmVhZF9tZXRhKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCQkgICAgICAgdTMyIG52cmFtX29mZnNldF9pbl9ieXRlcywKKwkJCQkJICAgICAgIHUzMiBzaXplX2luX2J5dGVzLCB1MzIgKmJ1ZikKK3sKKwl1OCAqYnl0ZV9idWYgPSAodTggKilidWY7CisJdTggbW9kdWxlc19udW0sIGk7CisJdTMyIHNpZ25hdHVyZTsKKworCS8qIFJlYWQgbWV0YSBkYXRhIGZyb20gTlZSQU0gKi8KKwllbnVtIGRiZ19zdGF0dXMgc3RhdHVzID0gcWVkX252cmFtX3JlYWQocF9od2ZuLAorCQkJCQkJcF9wdHQsCisJCQkJCQludnJhbV9vZmZzZXRfaW5fYnl0ZXMsCisJCQkJCQlzaXplX2luX2J5dGVzLAorCQkJCQkJYnVmKTsKKworCWlmIChzdGF0dXMgIT0gREJHX1NUQVRVU19PSykKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qIEV4dHJhY3QgYW5kIGNoZWNrIGZpcnN0IHNpZ25hdHVyZSAqLworCXNpZ25hdHVyZSA9IHFlZF9yZWFkX3VuYWxpZ25lZF9kd29yZChieXRlX2J1Zik7CisJYnl0ZV9idWYgKz0gc2l6ZW9mKHUzMik7CisJaWYgKHNpZ25hdHVyZSAhPSBNQ1BfVFJBQ0VfTUVUQV9JTUFHRV9TSUdOQVRVUkUpCisJCXJldHVybiBEQkdfU1RBVFVTX0lOVkFMSURfVFJBQ0VfU0lHTkFUVVJFOworCisJLyogRXh0cmFjdCBudW1iZXIgb2YgbW9kdWxlcyAqLworCW1vZHVsZXNfbnVtID0gKihieXRlX2J1ZisrKTsKKworCS8qIFNraXAgYWxsIG1vZHVsZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbW9kdWxlc19udW07IGkrKykgeworCQl1OCBtb2R1bGVfbGVuID0gKihieXRlX2J1ZisrKTsKKworCQlieXRlX2J1ZiArPSBtb2R1bGVfbGVuOworCX0KKworCS8qIEV4dHJhY3QgYW5kIGNoZWNrIHNlY29uZCBzaWduYXR1cmUgKi8KKwlzaWduYXR1cmUgPSBxZWRfcmVhZF91bmFsaWduZWRfZHdvcmQoYnl0ZV9idWYpOworCWJ5dGVfYnVmICs9IHNpemVvZih1MzIpOworCWlmIChzaWduYXR1cmUgIT0gTUNQX1RSQUNFX01FVEFfSU1BR0VfU0lHTkFUVVJFKQorCQlyZXR1cm4gREJHX1NUQVRVU19JTlZBTElEX1RSQUNFX1NJR05BVFVSRTsKKwlyZXR1cm4gREJHX1NUQVRVU19PSzsKK30KKworLyogRHVtcCBNQ1AgVHJhY2UgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfbWNwX3RyYWNlX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSAgIHUzMiAqZHVtcF9idWYsCisJCQkJICAgYm9vbCBkdW1wLCB1MzIgKm51bV9kdW1wZWRfZHdvcmRzKQoreworCXUzMiB0cmFjZV9kYXRhX2dyY19hZGRyLCB0cmFjZV9kYXRhX3NpemVfYnl0ZXMsIHRyYWNlX2RhdGFfc2l6ZV9kd29yZHM7CisJdTMyIHRyYWNlX21ldGFfc2l6ZV9kd29yZHMsIHJ1bm5pbmdfYnVuZGxlX2lkLCBvZmZzZXQgPSAwOworCXUzMiB0cmFjZV9tZXRhX29mZnNldF9ieXRlcywgdHJhY2VfbWV0YV9zaXplX2J5dGVzOworCWVudW0gZGJnX3N0YXR1cyBzdGF0dXM7CisJaW50IGhhbHRlZCA9IDA7CisKKwkqbnVtX2R1bXBlZF9kd29yZHMgPSAwOworCisJLyogR2V0IHRyYWNlIGRhdGEgaW5mbyAqLworCXN0YXR1cyA9IHFlZF9tY3BfdHJhY2VfZ2V0X2RhdGFfaW5mbyhwX2h3Zm4sCisJCQkJCSAgICAgcF9wdHQsCisJCQkJCSAgICAgJnRyYWNlX2RhdGFfZ3JjX2FkZHIsCisJCQkJCSAgICAgJnRyYWNlX2RhdGFfc2l6ZV9ieXRlcyk7CisJaWYgKHN0YXR1cyAhPSBEQkdfU1RBVFVTX09LKQorCQlyZXR1cm4gc3RhdHVzOworCisJLyogRHVtcCBnbG9iYWwgcGFyYW1zICovCisJb2Zmc2V0ICs9IHFlZF9kdW1wX2NvbW1vbl9nbG9iYWxfcGFyYW1zKHBfaHdmbiwKKwkJCQkJCXBfcHR0LAorCQkJCQkJZHVtcF9idWYgKyBvZmZzZXQsIGR1bXAsIDEpOworCW9mZnNldCArPSBxZWRfZHVtcF9zdHJfcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICBkdW1wLCAiZHVtcC10eXBlIiwgIm1jcC10cmFjZSIpOworCisJLyogSGFsdCBNQ1Agd2hpbGUgcmVhZGluZyBmcm9tIHNjcmF0Y2hwYWQgc28gdGhlIHJlYWQgZGF0YSB3aWxsIGJlCisJICogY29uc2lzdGVudCBpZiBoYWx0IGZhaWxzLCBNQ1AgdHJhY2UgaXMgdGFrZW4gYW55d2F5LCB3aXRoIGEgc21hbGwKKwkgKiByaXNrIHRoYXQgaXQgbWF5IGJlIGNvcnJ1cHQuCisJICovCisJaWYgKGR1bXApIHsKKwkJaGFsdGVkID0gIXFlZF9tY3BfaGFsdChwX2h3Zm4sIHBfcHR0KTsKKwkJaWYgKCFoYWx0ZWQpCisJCQlEUF9OT1RJQ0UocF9od2ZuLCAiTUNQIGhhbHQgZmFpbGVkIVxuIik7CisJfQorCisJLyogRmluZCB0cmFjZSBkYXRhIHNpemUgKi8KKwl0cmFjZV9kYXRhX3NpemVfZHdvcmRzID0KKwkJRElWX1JPVU5EX1VQKHRyYWNlX2RhdGFfc2l6ZV9ieXRlcyArIHNpemVvZihzdHJ1Y3QgbWNwX3RyYWNlKSwKKwkJCSAgICAgQllURVNfSU5fRFdPUkQpOworCisJLyogRHVtcCB0cmFjZSBkYXRhIHNlY3Rpb24gaGVhZGVyIGFuZCBwYXJhbSAqLworCW9mZnNldCArPSBxZWRfZHVtcF9zZWN0aW9uX2hkcihkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgICAgZHVtcCwgIm1jcF90cmFjZV9kYXRhIiwgMSk7CisJb2Zmc2V0ICs9IHFlZF9kdW1wX251bV9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgIGR1bXAsICJzaXplIiwgdHJhY2VfZGF0YV9zaXplX2R3b3Jkcyk7CisKKwkvKiBSZWFkIHRyYWNlIGRhdGEgZnJvbSBzY3JhdGNocGFkIGludG8gZHVtcCBidWZmZXIgKi8KKwlpZiAoZHVtcCkKKwkJcWVkX21jcF90cmFjZV9yZWFkX2RhdGEocF9od2ZuLAorCQkJCQlwX3B0dCwKKwkJCQkJdHJhY2VfZGF0YV9ncmNfYWRkciwKKwkJCQkJdHJhY2VfZGF0YV9zaXplX2R3b3JkcywKKwkJCQkJZHVtcF9idWYgKyBvZmZzZXQpOworCW9mZnNldCArPSB0cmFjZV9kYXRhX3NpemVfZHdvcmRzOworCisJLyogUmVzdW1lIE1DUCAob25seSBpZiBoYWx0IHN1Y2NlZWRlZCkgKi8KKwlpZiAoaGFsdGVkICYmIHFlZF9tY3BfcmVzdW1lKHBfaHdmbiwgcF9wdHQpICE9IDApCisJCURQX05PVElDRShwX2h3Zm4sICJGYWlsZWQgdG8gcmVzdW1lIE1DUCBhZnRlciBoYWx0IVxuIik7CisKKwkvKiBEdW1wIHRyYWNlIG1ldGEgc2VjdGlvbiBoZWFkZXIgKi8KKwlvZmZzZXQgKz0gcWVkX2R1bXBfc2VjdGlvbl9oZHIoZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICAgIGR1bXAsICJtY3BfdHJhY2VfbWV0YSIsIDEpOworCisJLyogUmVhZCB0cmFjZSBtZXRhIGluZm8gKi8KKwlzdGF0dXMgPSBxZWRfbWNwX3RyYWNlX2dldF9tZXRhX2luZm8ocF9od2ZuLAorCQkJCQkgICAgIHBfcHR0LAorCQkJCQkgICAgIHRyYWNlX2RhdGFfc2l6ZV9ieXRlcywKKwkJCQkJICAgICAmcnVubmluZ19idW5kbGVfaWQsCisJCQkJCSAgICAgJnRyYWNlX21ldGFfb2Zmc2V0X2J5dGVzLAorCQkJCQkgICAgICZ0cmFjZV9tZXRhX3NpemVfYnl0ZXMpOworCWlmIChzdGF0dXMgIT0gREJHX1NUQVRVU19PSykKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qIER1bXAgdHJhY2UgbWV0YSBzaXplIHBhcmFtICh0cmFjZV9tZXRhX3NpemVfYnl0ZXMgaXMgYWx3YXlzCisJICogZHdvcmQtYWxpZ25lZCkuCisJICovCisJdHJhY2VfbWV0YV9zaXplX2R3b3JkcyA9IEJZVEVTX1RPX0RXT1JEUyh0cmFjZV9tZXRhX3NpemVfYnl0ZXMpOworCW9mZnNldCArPSBxZWRfZHVtcF9udW1fcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsCWR1bXAsICJzaXplIiwKKwkJCQkgICAgIHRyYWNlX21ldGFfc2l6ZV9kd29yZHMpOworCisJLyogUmVhZCB0cmFjZSBtZXRhIGltYWdlIGludG8gZHVtcCBidWZmZXIgKi8KKwlpZiAoZHVtcCkgeworCQlzdGF0dXMgPSBxZWRfbWNwX3RyYWNlX3JlYWRfbWV0YShwX2h3Zm4sCisJCQkJCQlwX3B0dCwKKwkJCQkJCXRyYWNlX21ldGFfb2Zmc2V0X2J5dGVzLAorCQkJCQkJdHJhY2VfbWV0YV9zaXplX2J5dGVzLAorCQkJCQkJZHVtcF9idWYgKyBvZmZzZXQpOworCQlpZiAoc3RhdHVzICE9IERCR19TVEFUVVNfT0spCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKworCW9mZnNldCArPSB0cmFjZV9tZXRhX3NpemVfZHdvcmRzOworCisJKm51bV9kdW1wZWRfZHdvcmRzID0gb2Zmc2V0OworCisJcmV0dXJuIERCR19TVEFUVVNfT0s7Cit9CisKKy8qIER1bXAgR1JDIEZJRk8gKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfcmVnX2ZpZm9fZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgIHUzMiAqZHVtcF9idWYsCisJCQkJICBib29sIGR1bXAsIHUzMiAqbnVtX2R1bXBlZF9kd29yZHMpCit7CisJdTMyIG9mZnNldCA9IDAsIGR3b3Jkc19yZWFkLCBzaXplX3BhcmFtX29mZnNldDsKKwlib29sIGZpZm9faGFzX2RhdGE7CisKKwkqbnVtX2R1bXBlZF9kd29yZHMgPSAwOworCisJLyogRHVtcCBnbG9iYWwgcGFyYW1zICovCisJb2Zmc2V0ICs9IHFlZF9kdW1wX2NvbW1vbl9nbG9iYWxfcGFyYW1zKHBfaHdmbiwKKwkJCQkJCXBfcHR0LAorCQkJCQkJZHVtcF9idWYgKyBvZmZzZXQsIGR1bXAsIDEpOworCW9mZnNldCArPSBxZWRfZHVtcF9zdHJfcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICBkdW1wLCAiZHVtcC10eXBlIiwgInJlZy1maWZvIik7CisKKwkvKiBEdW1wIGZpZm8gZGF0YSBzZWN0aW9uIGhlYWRlciBhbmQgcGFyYW0uIFRoZSBzaXplIHBhcmFtIGlzIDAgZm9yIG5vdywKKwkgKiBhbmQgaXMgb3ZlcndyaXR0ZW4gYWZ0ZXIgcmVhZGluZyB0aGUgRklGTy4KKwkgKi8KKwlvZmZzZXQgKz0gcWVkX2R1bXBfc2VjdGlvbl9oZHIoZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICAgIGR1bXAsICJyZWdfZmlmb19kYXRhIiwgMSk7CisJc2l6ZV9wYXJhbV9vZmZzZXQgPSBvZmZzZXQ7CisJb2Zmc2V0ICs9IHFlZF9kdW1wX251bV9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCwgInNpemUiLCAwKTsKKworCWlmICghZHVtcCkgeworCQkvKiBGSUZPIG1heCBzaXplIGlzIFJFR19GSUZPX0RFUFRIX0RXT1JEUy4gVGhlcmUgaXMgbm8gd2F5IHRvCisJCSAqIHRlc3QgaG93IG11Y2ggZGF0YSBpcyBhdmFpbGFibGUsIGV4Y2VwdCBmb3IgcmVhZGluZyBpdC4KKwkJICovCisJCW9mZnNldCArPSBSRUdfRklGT19ERVBUSF9EV09SRFM7CisJCSpudW1fZHVtcGVkX2R3b3JkcyA9IG9mZnNldDsKKwkJcmV0dXJuIERCR19TVEFUVVNfT0s7CisJfQorCisJZmlmb19oYXNfZGF0YSA9IHFlZF9yZChwX2h3Zm4sIHBfcHR0LAorCQkJICAgICAgIEdSQ19SRUdfVFJBQ0VfRklGT19WQUxJRF9EQVRBKSA+IDA7CisKKwkvKiBQdWxsIGF2YWlsYWJsZSBkYXRhIGZyb20gZmlmby4gVXNlIERNQUUgc2luY2UgdGhpcyBpcyB3aWRlYnVzIG1lbW9yeQorCSAqIGFuZCBtdXN0IGJlIGFjY2Vzc2VkIGF0b21pY2FsbHkuIFRlc3QgZm9yIGR3b3Jkc19yZWFkIG5vdCBwYXNzaW5nCisJICogYnVmZmVyIHNpemUgc2luY2UgbW9yZSBlbnRyaWVzIGNvdWxkIGJlIGFkZGVkIHRvIHRoZSBidWZmZXIgYXMgd2UgYXJlCisJICogZW1wdHlpbmcgaXQuCisJICovCisJZm9yIChkd29yZHNfcmVhZCA9IDA7CisJICAgICBmaWZvX2hhc19kYXRhICYmIGR3b3Jkc19yZWFkIDwgUkVHX0ZJRk9fREVQVEhfRFdPUkRTOworCSAgICAgZHdvcmRzX3JlYWQgKz0gUkVHX0ZJRk9fRUxFTUVOVF9EV09SRFMsIG9mZnNldCArPQorCSAgICAgUkVHX0ZJRk9fRUxFTUVOVF9EV09SRFMpIHsKKwkJaWYgKHFlZF9kbWFlX2dyYzJob3N0KHBfaHdmbiwgcF9wdHQsIEdSQ19SRUdfVFJBQ0VfRklGTywKKwkJCQkgICAgICAodTY0KSh1aW50cHRyX3QpKCZkdW1wX2J1ZltvZmZzZXRdKSwKKwkJCQkgICAgICBSRUdfRklGT19FTEVNRU5UX0RXT1JEUywgMCkpCisJCQlyZXR1cm4gREJHX1NUQVRVU19ETUFFX0ZBSUxFRDsKKwkJZmlmb19oYXNfZGF0YSA9IHFlZF9yZChwX2h3Zm4sIHBfcHR0LAorCQkJCSAgICAgICBHUkNfUkVHX1RSQUNFX0ZJRk9fVkFMSURfREFUQSkgPiAwOworCX0KKworCXFlZF9kdW1wX251bV9wYXJhbShkdW1wX2J1ZiArIHNpemVfcGFyYW1fb2Zmc2V0LCBkdW1wLCAic2l6ZSIsCisJCQkgICBkd29yZHNfcmVhZCk7CisKKwkqbnVtX2R1bXBlZF9kd29yZHMgPSBvZmZzZXQ7CisJcmV0dXJuIERCR19TVEFUVVNfT0s7Cit9CisKKy8qIER1bXAgSUdVIEZJRk8gKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfaWd1X2ZpZm9fZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgIHUzMiAqZHVtcF9idWYsCisJCQkJICBib29sIGR1bXAsIHUzMiAqbnVtX2R1bXBlZF9kd29yZHMpCit7CisJdTMyIG9mZnNldCA9IDAsIGR3b3Jkc19yZWFkLCBzaXplX3BhcmFtX29mZnNldDsKKwlib29sIGZpZm9faGFzX2RhdGE7CisKKwkqbnVtX2R1bXBlZF9kd29yZHMgPSAwOworCisJLyogRHVtcCBnbG9iYWwgcGFyYW1zICovCisJb2Zmc2V0ICs9IHFlZF9kdW1wX2NvbW1vbl9nbG9iYWxfcGFyYW1zKHBfaHdmbiwKKwkJCQkJCXBfcHR0LAorCQkJCQkJZHVtcF9idWYgKyBvZmZzZXQsIGR1bXAsIDEpOworCW9mZnNldCArPSBxZWRfZHVtcF9zdHJfcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICBkdW1wLCAiZHVtcC10eXBlIiwgImlndS1maWZvIik7CisKKwkvKiBEdW1wIGZpZm8gZGF0YSBzZWN0aW9uIGhlYWRlciBhbmQgcGFyYW0uIFRoZSBzaXplIHBhcmFtIGlzIDAgZm9yIG5vdywKKwkgKiBhbmQgaXMgb3ZlcndyaXR0ZW4gYWZ0ZXIgcmVhZGluZyB0aGUgRklGTy4KKwkgKi8KKwlvZmZzZXQgKz0gcWVkX2R1bXBfc2VjdGlvbl9oZHIoZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICAgIGR1bXAsICJpZ3VfZmlmb19kYXRhIiwgMSk7CisJc2l6ZV9wYXJhbV9vZmZzZXQgPSBvZmZzZXQ7CisJb2Zmc2V0ICs9IHFlZF9kdW1wX251bV9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCwgInNpemUiLCAwKTsKKworCWlmICghZHVtcCkgeworCQkvKiBGSUZPIG1heCBzaXplIGlzIElHVV9GSUZPX0RFUFRIX0RXT1JEUy4gVGhlcmUgaXMgbm8gd2F5IHRvCisJCSAqIHRlc3QgaG93IG11Y2ggZGF0YSBpcyBhdmFpbGFibGUsIGV4Y2VwdCBmb3IgcmVhZGluZyBpdC4KKwkJICovCisJCW9mZnNldCArPSBJR1VfRklGT19ERVBUSF9EV09SRFM7CisJCSpudW1fZHVtcGVkX2R3b3JkcyA9IG9mZnNldDsKKwkJcmV0dXJuIERCR19TVEFUVVNfT0s7CisJfQorCisJZmlmb19oYXNfZGF0YSA9IHFlZF9yZChwX2h3Zm4sIHBfcHR0LAorCQkJICAgICAgIElHVV9SRUdfRVJST1JfSEFORExJTkdfREFUQV9WQUxJRCkgPiAwOworCisJLyogUHVsbCBhdmFpbGFibGUgZGF0YSBmcm9tIGZpZm8uIFVzZSBETUFFIHNpbmNlIHRoaXMgaXMgd2lkZWJ1cyBtZW1vcnkKKwkgKiBhbmQgbXVzdCBiZSBhY2Nlc3NlZCBhdG9taWNhbGx5LiBUZXN0IGZvciBkd29yZHNfcmVhZCBub3QgcGFzc2luZworCSAqIGJ1ZmZlciBzaXplIHNpbmNlIG1vcmUgZW50cmllcyBjb3VsZCBiZSBhZGRlZCB0byB0aGUgYnVmZmVyIGFzIHdlIGFyZQorCSAqIGVtcHR5aW5nIGl0LgorCSAqLworCWZvciAoZHdvcmRzX3JlYWQgPSAwOworCSAgICAgZmlmb19oYXNfZGF0YSAmJiBkd29yZHNfcmVhZCA8IElHVV9GSUZPX0RFUFRIX0RXT1JEUzsKKwkgICAgIGR3b3Jkc19yZWFkICs9IElHVV9GSUZPX0VMRU1FTlRfRFdPUkRTLCBvZmZzZXQgKz0KKwkgICAgIElHVV9GSUZPX0VMRU1FTlRfRFdPUkRTKSB7CisJCWlmIChxZWRfZG1hZV9ncmMyaG9zdChwX2h3Zm4sIHBfcHR0LAorCQkJCSAgICAgIElHVV9SRUdfRVJST1JfSEFORExJTkdfTUVNT1JZLAorCQkJCSAgICAgICh1NjQpKHVpbnRwdHJfdCkoJmR1bXBfYnVmW29mZnNldF0pLAorCQkJCSAgICAgIElHVV9GSUZPX0VMRU1FTlRfRFdPUkRTLCAwKSkKKwkJCXJldHVybiBEQkdfU1RBVFVTX0RNQUVfRkFJTEVEOworCQlmaWZvX2hhc19kYXRhID0JcWVkX3JkKHBfaHdmbiwgcF9wdHQsCisJCQkJICAgICAgIElHVV9SRUdfRVJST1JfSEFORExJTkdfREFUQV9WQUxJRCkgPiAwOworCX0KKworCXFlZF9kdW1wX251bV9wYXJhbShkdW1wX2J1ZiArIHNpemVfcGFyYW1fb2Zmc2V0LCBkdW1wLCAic2l6ZSIsCisJCQkgICBkd29yZHNfcmVhZCk7CisKKwkqbnVtX2R1bXBlZF9kd29yZHMgPSBvZmZzZXQ7CisJcmV0dXJuIERCR19TVEFUVVNfT0s7Cit9CisKKy8qIFByb3RlY3Rpb24gT3ZlcnJpZGUgZHVtcCAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9wcm90ZWN0aW9uX292ZXJyaWRlX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCQkgICAgIHUzMiAqZHVtcF9idWYsCisJCQkJCSAgICAgYm9vbCBkdW1wLCB1MzIgKm51bV9kdW1wZWRfZHdvcmRzKQoreworCXUzMiBvZmZzZXQgPSAwLCBzaXplX3BhcmFtX29mZnNldCwgb3ZlcnJpZGVfd2luZG93X2R3b3JkczsKKworCSpudW1fZHVtcGVkX2R3b3JkcyA9IDA7CisKKwkvKiBEdW1wIGdsb2JhbCBwYXJhbXMgKi8KKwlvZmZzZXQgKz0gcWVkX2R1bXBfY29tbW9uX2dsb2JhbF9wYXJhbXMocF9od2ZuLAorCQkJCQkJcF9wdHQsCisJCQkJCQlkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCwgMSk7CisJb2Zmc2V0ICs9IHFlZF9kdW1wX3N0cl9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgIGR1bXAsICJkdW1wLXR5cGUiLCAicHJvdGVjdGlvbi1vdmVycmlkZSIpOworCisJLyogRHVtcCBkYXRhIHNlY3Rpb24gaGVhZGVyIGFuZCBwYXJhbS4gVGhlIHNpemUgcGFyYW0gaXMgMCBmb3Igbm93LCBhbmQKKwkgKiBpcyBvdmVyd3JpdHRlbiBhZnRlciByZWFkaW5nIHRoZSBkYXRhLgorCSAqLworCW9mZnNldCArPSBxZWRfZHVtcF9zZWN0aW9uX2hkcihkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgICAgZHVtcCwgInByb3RlY3Rpb25fb3ZlcnJpZGVfZGF0YSIsIDEpOworCXNpemVfcGFyYW1fb2Zmc2V0ID0gb2Zmc2V0OworCW9mZnNldCArPSBxZWRfZHVtcF9udW1fcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsIGR1bXAsICJzaXplIiwgMCk7CisKKwlpZiAoIWR1bXApIHsKKwkJb2Zmc2V0ICs9IFBST1RFQ1RJT05fT1ZFUlJJREVfREVQVEhfRFdPUkRTOworCQkqbnVtX2R1bXBlZF9kd29yZHMgPSBvZmZzZXQ7CisJCXJldHVybiBEQkdfU1RBVFVTX09LOworCX0KKworCS8qIEFkZCBvdmVycmlkZSB3aW5kb3cgaW5mbyB0byBidWZmZXIgKi8KKwlvdmVycmlkZV93aW5kb3dfZHdvcmRzID0KKwkJcWVkX3JkKHBfaHdmbiwgcF9wdHQsCisJCSAgICAgICBHUkNfUkVHX05VTUJFUl9WQUxJRF9PVkVSUklERV9XSU5ET1cpICoKKwkJICAgICAgIFBST1RFQ1RJT05fT1ZFUlJJREVfRUxFTUVOVF9EV09SRFM7CisJaWYgKHFlZF9kbWFlX2dyYzJob3N0KHBfaHdmbiwgcF9wdHQsCisJCQkgICAgICBHUkNfUkVHX1BST1RFQ1RJT05fT1ZFUlJJREVfV0lORE9XLAorCQkJICAgICAgKHU2NCkodWludHB0cl90KShkdW1wX2J1ZiArIG9mZnNldCksCisJCQkgICAgICBvdmVycmlkZV93aW5kb3dfZHdvcmRzLCAwKSkKKwkJcmV0dXJuIERCR19TVEFUVVNfRE1BRV9GQUlMRUQ7CisJb2Zmc2V0ICs9IG92ZXJyaWRlX3dpbmRvd19kd29yZHM7CisJcWVkX2R1bXBfbnVtX3BhcmFtKGR1bXBfYnVmICsgc2l6ZV9wYXJhbV9vZmZzZXQsIGR1bXAsICJzaXplIiwKKwkJCSAgIG92ZXJyaWRlX3dpbmRvd19kd29yZHMpOworCisJKm51bV9kdW1wZWRfZHdvcmRzID0gb2Zmc2V0OworCXJldHVybiBEQkdfU1RBVFVTX09LOworfQorCisvKiBQZXJmb3JtcyBGVyBBc3NlcnRzIER1bXAgdG8gdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuCisgKi8KK3N0YXRpYyB1MzIgcWVkX2Z3X2Fzc2VydHNfZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHUzMiAqZHVtcF9idWYsIGJvb2wgZHVtcCkKK3sKKwlzdHJ1Y3QgZGJnX3Rvb2xzX2RhdGEgKmRldl9kYXRhID0gJnBfaHdmbi0+ZGJnX2luZm87CisJY2hhciBzdG9ybV9sZXR0ZXJfc3RyWzJdID0gIj8iOworCXN0cnVjdCBmd19pbmZvIGZ3X2luZm87CisJdTMyIG9mZnNldCA9IDAsIGk7CisJdTggc3Rvcm1faWQ7CisKKwkvKiBEdW1wIGdsb2JhbCBwYXJhbXMgKi8KKwlvZmZzZXQgKz0gcWVkX2R1bXBfY29tbW9uX2dsb2JhbF9wYXJhbXMocF9od2ZuLAorCQkJCQkJcF9wdHQsCisJCQkJCQlkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCwgMSk7CisJb2Zmc2V0ICs9IHFlZF9kdW1wX3N0cl9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgIGR1bXAsICJkdW1wLXR5cGUiLCAiZnctYXNzZXJ0cyIpOworCWZvciAoc3Rvcm1faWQgPSAwOyBzdG9ybV9pZCA8IE1BWF9EQkdfU1RPUk1TOyBzdG9ybV9pZCsrKSB7CisJCXUzMiBmd19hc3NlcnRzX3NlY3Rpb25fYWRkciwgbmV4dF9saXN0X2lkeF9hZGRyLCBuZXh0X2xpc3RfaWR4LAorCQkJbGFzdF9saXN0X2lkeCwgZWxlbWVudF9hZGRyOworCisJCWlmIChkZXZfZGF0YS0+YmxvY2tfaW5fcmVzZXRbc19zdG9ybV9kZWZzW3N0b3JtX2lkXS5ibG9ja19pZF0pCisJCQljb250aW51ZTsKKworCQkvKiBSZWFkIEZXIGluZm8gZm9yIHRoZSBjdXJyZW50IFN0b3JtICovCisJCXFlZF9yZWFkX2Z3X2luZm8ocF9od2ZuLCBwX3B0dCwgc3Rvcm1faWQsICZmd19pbmZvKTsKKworCQkvKiBEdW1wIEZXIEFzc2VydHMgc2VjdGlvbiBoZWFkZXIgYW5kIHBhcmFtcyAqLworCQlzdG9ybV9sZXR0ZXJfc3RyWzBdID0gc19zdG9ybV9kZWZzW3N0b3JtX2lkXS5sZXR0ZXI7CisJCW9mZnNldCArPSBxZWRfZHVtcF9zZWN0aW9uX2hkcihkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCwKKwkJCQkJICAgICAgICJmd19hc3NlcnRzIiwgMik7CisJCW9mZnNldCArPSBxZWRfZHVtcF9zdHJfcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsIGR1bXAsICJzdG9ybSIsCisJCQkJCSAgICAgc3Rvcm1fbGV0dGVyX3N0cik7CisJCW9mZnNldCArPSBxZWRfZHVtcF9udW1fcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsIGR1bXAsICJzaXplIiwKKwkJCQkJICAgICBmd19pbmZvLmZ3X2Fzc2VydHNfc2VjdGlvbi4KKwkJCQkJICAgICBsaXN0X2VsZW1lbnRfZHdvcmRfc2l6ZSk7CisKKwkJaWYgKCFkdW1wKSB7CisJCQlvZmZzZXQgKz0gZndfaW5mby5md19hc3NlcnRzX3NlY3Rpb24uCisJCQkJICBsaXN0X2VsZW1lbnRfZHdvcmRfc2l6ZTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogUmVhZCBhbmQgZHVtcCBGVyBBc3NlcnRzIGRhdGEgKi8KKwkJZndfYXNzZXJ0c19zZWN0aW9uX2FkZHIgPQorCQkJc19zdG9ybV9kZWZzW3N0b3JtX2lkXS5zZW1fZmFzdF9tZW1fYWRkciArCisJCQlTRU1fRkFTVF9SRUdfSU5UX1JBTSArCisJCQlSQU1fTElORVNfVE9fQllURVMoZndfaW5mby5md19hc3NlcnRzX3NlY3Rpb24uCisJCQkJCSAgIHNlY3Rpb25fcmFtX2xpbmVfb2Zmc2V0KTsKKwkJbmV4dF9saXN0X2lkeF9hZGRyID0KKwkJCWZ3X2Fzc2VydHNfc2VjdGlvbl9hZGRyICsKKwkJCURXT1JEU19UT19CWVRFUyhmd19pbmZvLmZ3X2Fzc2VydHNfc2VjdGlvbi4KKwkJCQkJbGlzdF9uZXh0X2luZGV4X2R3b3JkX29mZnNldCk7CisJCW5leHRfbGlzdF9pZHggPSBxZWRfcmQocF9od2ZuLCBwX3B0dCwgbmV4dF9saXN0X2lkeF9hZGRyKTsKKwkJbGFzdF9saXN0X2lkeCA9IChuZXh0X2xpc3RfaWR4ID4gMAorCQkJCSA/IG5leHRfbGlzdF9pZHgKKwkJCQkgOiBmd19pbmZvLmZ3X2Fzc2VydHNfc2VjdGlvbi5saXN0X251bV9lbGVtZW50cykKKwkJCQktIDE7CisJCWVsZW1lbnRfYWRkciA9CisJCQlmd19hc3NlcnRzX3NlY3Rpb25fYWRkciArCisJCQlEV09SRFNfVE9fQllURVMoZndfaW5mby5md19hc3NlcnRzX3NlY3Rpb24uCisJCQkJCWxpc3RfZHdvcmRfb2Zmc2V0KSArCisJCQlsYXN0X2xpc3RfaWR4ICoKKwkJCURXT1JEU19UT19CWVRFUyhmd19pbmZvLmZ3X2Fzc2VydHNfc2VjdGlvbi4KKwkJCQkJbGlzdF9lbGVtZW50X2R3b3JkX3NpemUpOworCQlmb3IgKGkgPSAwOworCQkgICAgIGkgPCBmd19pbmZvLmZ3X2Fzc2VydHNfc2VjdGlvbi5saXN0X2VsZW1lbnRfZHdvcmRfc2l6ZTsKKwkJICAgICBpKyssIG9mZnNldCsrLCBlbGVtZW50X2FkZHIgKz0gQllURVNfSU5fRFdPUkQpCisJCQlkdW1wX2J1ZltvZmZzZXRdID0gcWVkX3JkKHBfaHdmbiwgcF9wdHQsIGVsZW1lbnRfYWRkcik7CisJfQorCisJLyogRHVtcCBsYXN0IHNlY3Rpb24gKi8KKwlvZmZzZXQgKz0gcWVkX2R1bXBfc2VjdGlvbl9oZHIoZHVtcF9idWYgKyBvZmZzZXQsIGR1bXAsICJsYXN0IiwgMCk7CisJcmV0dXJuIG9mZnNldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFB1YmxpYyBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfc2V0X2Jpbl9wdHIoY29uc3QgdTggKiBjb25zdCBiaW5fcHRyKQoreworCS8qIENvbnZlcnQgYmluYXJ5IGRhdGEgdG8gZGVidWcgYXJyYXlzICovCisJdTMyIG51bV9vZl9idWZmZXJzID0gKih1MzIgKiliaW5fcHRyOworCXN0cnVjdCBiaW5fYnVmZmVyX2hkciAqYnVmX2FycmF5OworCXU4IGJ1Zl9pZDsKKworCWJ1Zl9hcnJheSA9IChzdHJ1Y3QgYmluX2J1ZmZlcl9oZHIgKikoKHUzMiAqKWJpbl9wdHIgKyAxKTsKKworCWZvciAoYnVmX2lkID0gMDsgYnVmX2lkIDwgbnVtX29mX2J1ZmZlcnM7IGJ1Zl9pZCsrKSB7CisJCXNfZGJnX2FycmF5c1tidWZfaWRdLnB0ciA9CisJCSAgICAodTMyICopKGJpbl9wdHIgKyBidWZfYXJyYXlbYnVmX2lkXS5vZmZzZXQpOworCQlzX2RiZ19hcnJheXNbYnVmX2lkXS5zaXplX2luX2R3b3JkcyA9CisJCSAgICBCWVRFU19UT19EV09SRFMoYnVmX2FycmF5W2J1Zl9pZF0ubGVuZ3RoKTsKKwl9CisKKwlyZXR1cm4gREJHX1NUQVRVU19PSzsKK30KKworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfZ3JjX2dldF9kdW1wX2J1Zl9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJCSAgICAgIHUzMiAqYnVmX3NpemUpCit7CisJZW51bSBkYmdfc3RhdHVzIHN0YXR1cyA9IHFlZF9kYmdfZGV2X2luaXQocF9od2ZuLCBwX3B0dCk7CisKKwkqYnVmX3NpemUgPSAwOworCWlmIChzdGF0dXMgIT0gREJHX1NUQVRVU19PSykKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAoIXNfZGJnX2FycmF5c1tCSU5fQlVGX0RCR19NT0RFX1RSRUVdLnB0ciB8fAorCSAgICAhc19kYmdfYXJyYXlzW0JJTl9CVUZfREJHX0RVTVBfUkVHXS5wdHIgfHwKKwkgICAgIXNfZGJnX2FycmF5c1tCSU5fQlVGX0RCR19EVU1QX01FTV0ucHRyIHx8CisJICAgICFzX2RiZ19hcnJheXNbQklOX0JVRl9EQkdfQVRUTl9CTE9DS1NdLnB0ciB8fAorCSAgICAhc19kYmdfYXJyYXlzW0JJTl9CVUZfREJHX0FUVE5fUkVHU10ucHRyKQorCQlyZXR1cm4gREJHX1NUQVRVU19EQkdfQVJSQVlfTk9UX1NFVDsKKwlyZXR1cm4gcWVkX2dyY19kdW1wKHBfaHdmbiwgcF9wdHQsIE5VTEwsIGZhbHNlLCBidWZfc2l6ZSk7Cit9CisKK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX2dyY19kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJIHUzMiAqZHVtcF9idWYsCisJCQkJIHUzMiBidWZfc2l6ZV9pbl9kd29yZHMsCisJCQkJIHUzMiAqbnVtX2R1bXBlZF9kd29yZHMpCit7CisJdTMyIG5lZWRlZF9idWZfc2l6ZV9pbl9kd29yZHM7CisJZW51bSBkYmdfc3RhdHVzIHN0YXR1czsKKworCXN0YXR1cyA9IHFlZF9kYmdfZ3JjX2dldF9kdW1wX2J1Zl9zaXplKHBfaHdmbiwgcF9wdHQsCisJCQkJCSAgICAgICAmbmVlZGVkX2J1Zl9zaXplX2luX2R3b3Jkcyk7CisKKwkqbnVtX2R1bXBlZF9kd29yZHMgPSAwOworCWlmIChzdGF0dXMgIT0gREJHX1NUQVRVU19PSykKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAoYnVmX3NpemVfaW5fZHdvcmRzIDwgbmVlZGVkX2J1Zl9zaXplX2luX2R3b3JkcykKKwkJcmV0dXJuIERCR19TVEFUVVNfRFVNUF9CVUZfVE9PX1NNQUxMOworCisJLyogR1JDIER1bXAgKi8KKwlzdGF0dXMgPSBxZWRfZ3JjX2R1bXAocF9od2ZuLCBwX3B0dCwgZHVtcF9idWYsIHRydWUsIG51bV9kdW1wZWRfZHdvcmRzKTsKKworCS8qIENsZWFyIGFsbCBHUkMgcGFyYW1zICovCisJcWVkX2RiZ19ncmNfY2xlYXJfcGFyYW1zKHBfaHdmbik7CisJcmV0dXJuIHN0YXR1czsKK30KKworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfaWRsZV9jaGtfZ2V0X2R1bXBfYnVmX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJCQkgICB1MzIgKmJ1Zl9zaXplKQoreworCWVudW0gZGJnX3N0YXR1cyBzdGF0dXMgPSBxZWRfZGJnX2Rldl9pbml0KHBfaHdmbiwgcF9wdHQpOworCXN0cnVjdCBkYmdfdG9vbHNfZGF0YSAqZGV2X2RhdGEgPSAmcF9od2ZuLT5kYmdfaW5mbzsKKworCSpidWZfc2l6ZSA9IDA7CisJaWYgKHN0YXR1cyAhPSBEQkdfU1RBVFVTX09LKQorCQlyZXR1cm4gc3RhdHVzOworCWlmICghc19kYmdfYXJyYXlzW0JJTl9CVUZfREJHX01PREVfVFJFRV0ucHRyIHx8CisJICAgICFzX2RiZ19hcnJheXNbQklOX0JVRl9EQkdfSURMRV9DSEtfUkVHU10ucHRyIHx8CisJICAgICFzX2RiZ19hcnJheXNbQklOX0JVRl9EQkdfSURMRV9DSEtfSU1NU10ucHRyIHx8CisJICAgICFzX2RiZ19hcnJheXNbQklOX0JVRl9EQkdfSURMRV9DSEtfUlVMRVNdLnB0cikKKwkJcmV0dXJuIERCR19TVEFUVVNfREJHX0FSUkFZX05PVF9TRVQ7CisJaWYgKCFkZXZfZGF0YS0+aWRsZV9jaGsuYnVmX3NpemVfc2V0KSB7CisJCWRldl9kYXRhLT5pZGxlX2Noay5idWZfc2l6ZSA9IHFlZF9pZGxlX2Noa19kdW1wKHBfaHdmbiwKKwkJCQkJCQkJcF9wdHQsCisJCQkJCQkJCU5VTEwsIGZhbHNlKTsKKwkJZGV2X2RhdGEtPmlkbGVfY2hrLmJ1Zl9zaXplX3NldCA9IHRydWU7CisJfQorCisJKmJ1Zl9zaXplID0gZGV2X2RhdGEtPmlkbGVfY2hrLmJ1Zl9zaXplOworCXJldHVybiBEQkdfU1RBVFVTX09LOworfQorCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19pZGxlX2Noa19kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgICAgICB1MzIgKmR1bXBfYnVmLAorCQkJCSAgICAgIHUzMiBidWZfc2l6ZV9pbl9kd29yZHMsCisJCQkJICAgICAgdTMyICpudW1fZHVtcGVkX2R3b3JkcykKK3sKKwl1MzIgbmVlZGVkX2J1Zl9zaXplX2luX2R3b3JkczsKKwllbnVtIGRiZ19zdGF0dXMgc3RhdHVzOworCisJc3RhdHVzID0gcWVkX2RiZ19pZGxlX2Noa19nZXRfZHVtcF9idWZfc2l6ZShwX2h3Zm4sIHBfcHR0LAorCQkJCQkJICAgICZuZWVkZWRfYnVmX3NpemVfaW5fZHdvcmRzKTsKKworCSpudW1fZHVtcGVkX2R3b3JkcyA9IDA7CisJaWYgKHN0YXR1cyAhPSBEQkdfU1RBVFVTX09LKQorCQlyZXR1cm4gc3RhdHVzOworCWlmIChidWZfc2l6ZV9pbl9kd29yZHMgPCBuZWVkZWRfYnVmX3NpemVfaW5fZHdvcmRzKQorCQlyZXR1cm4gREJHX1NUQVRVU19EVU1QX0JVRl9UT09fU01BTEw7CisKKwkvKiBVcGRhdGUgcmVzZXQgc3RhdGUgKi8KKwlxZWRfdXBkYXRlX2Jsb2Nrc19yZXNldF9zdGF0ZShwX2h3Zm4sIHBfcHR0KTsKKworCS8qIElkbGUgQ2hlY2sgRHVtcCAqLworCSpudW1fZHVtcGVkX2R3b3JkcyA9IHFlZF9pZGxlX2Noa19kdW1wKHBfaHdmbiwgcF9wdHQsIGR1bXBfYnVmLCB0cnVlKTsKKwlyZXR1cm4gREJHX1NUQVRVU19PSzsKK30KKworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfbWNwX3RyYWNlX2dldF9kdW1wX2J1Zl9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkJCSAgICB1MzIgKmJ1Zl9zaXplKQoreworCWVudW0gZGJnX3N0YXR1cyBzdGF0dXMgPSBxZWRfZGJnX2Rldl9pbml0KHBfaHdmbiwgcF9wdHQpOworCisJKmJ1Zl9zaXplID0gMDsKKwlpZiAoc3RhdHVzICE9IERCR19TVEFUVVNfT0spCisJCXJldHVybiBzdGF0dXM7CisJcmV0dXJuIHFlZF9tY3BfdHJhY2VfZHVtcChwX2h3Zm4sIHBfcHR0LCBOVUxMLCBmYWxzZSwgYnVmX3NpemUpOworfQorCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19tY3BfdHJhY2VfZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSAgICAgICB1MzIgKmR1bXBfYnVmLAorCQkJCSAgICAgICB1MzIgYnVmX3NpemVfaW5fZHdvcmRzLAorCQkJCSAgICAgICB1MzIgKm51bV9kdW1wZWRfZHdvcmRzKQoreworCXUzMiBuZWVkZWRfYnVmX3NpemVfaW5fZHdvcmRzOworCWVudW0gZGJnX3N0YXR1cyBzdGF0dXM7CisKKwlzdGF0dXMgPSBxZWRfZGJnX21jcF90cmFjZV9nZXRfZHVtcF9idWZfc2l6ZShwX2h3Zm4sIHBfcHR0LAorCQkJCQkJJm5lZWRlZF9idWZfc2l6ZV9pbl9kd29yZHMpOworCisJaWYgKHN0YXR1cyAhPSBEQkdfU1RBVFVTX09LKQorCQlyZXR1cm4gc3RhdHVzOworCWlmIChidWZfc2l6ZV9pbl9kd29yZHMgPCBuZWVkZWRfYnVmX3NpemVfaW5fZHdvcmRzKQorCQlyZXR1cm4gREJHX1NUQVRVU19EVU1QX0JVRl9UT09fU01BTEw7CisKKwkvKiBVcGRhdGUgcmVzZXQgc3RhdGUgKi8KKwlxZWRfdXBkYXRlX2Jsb2Nrc19yZXNldF9zdGF0ZShwX2h3Zm4sIHBfcHR0KTsKKworCS8qIFBlcmZvcm0gZHVtcCAqLworCXJldHVybiBxZWRfbWNwX3RyYWNlX2R1bXAocF9od2ZuLAorCQkJCSAgcF9wdHQsIGR1bXBfYnVmLCB0cnVlLCBudW1fZHVtcGVkX2R3b3Jkcyk7Cit9CisKK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX3JlZ19maWZvX2dldF9kdW1wX2J1Zl9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCQkJICAgdTMyICpidWZfc2l6ZSkKK3sKKwllbnVtIGRiZ19zdGF0dXMgc3RhdHVzID0gcWVkX2RiZ19kZXZfaW5pdChwX2h3Zm4sIHBfcHR0KTsKKworCSpidWZfc2l6ZSA9IDA7CisJaWYgKHN0YXR1cyAhPSBEQkdfU1RBVFVTX09LKQorCQlyZXR1cm4gc3RhdHVzOworCXJldHVybiBxZWRfcmVnX2ZpZm9fZHVtcChwX2h3Zm4sIHBfcHR0LCBOVUxMLCBmYWxzZSwgYnVmX3NpemUpOworfQorCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19yZWdfZmlmb19kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgICAgICB1MzIgKmR1bXBfYnVmLAorCQkJCSAgICAgIHUzMiBidWZfc2l6ZV9pbl9kd29yZHMsCisJCQkJICAgICAgdTMyICpudW1fZHVtcGVkX2R3b3JkcykKK3sKKwl1MzIgbmVlZGVkX2J1Zl9zaXplX2luX2R3b3JkczsKKwllbnVtIGRiZ19zdGF0dXMgc3RhdHVzOworCisJc3RhdHVzID0gcWVkX2RiZ19yZWdfZmlmb19nZXRfZHVtcF9idWZfc2l6ZShwX2h3Zm4sIHBfcHR0LAorCQkJCQkJICAgICZuZWVkZWRfYnVmX3NpemVfaW5fZHdvcmRzKTsKKworCSpudW1fZHVtcGVkX2R3b3JkcyA9IDA7CisJaWYgKHN0YXR1cyAhPSBEQkdfU1RBVFVTX09LKQorCQlyZXR1cm4gc3RhdHVzOworCWlmIChidWZfc2l6ZV9pbl9kd29yZHMgPCBuZWVkZWRfYnVmX3NpemVfaW5fZHdvcmRzKQorCQlyZXR1cm4gREJHX1NUQVRVU19EVU1QX0JVRl9UT09fU01BTEw7CisKKwkvKiBVcGRhdGUgcmVzZXQgc3RhdGUgKi8KKwlxZWRfdXBkYXRlX2Jsb2Nrc19yZXNldF9zdGF0ZShwX2h3Zm4sIHBfcHR0KTsKKwlyZXR1cm4gcWVkX3JlZ19maWZvX2R1bXAocF9od2ZuLAorCQkJCSBwX3B0dCwgZHVtcF9idWYsIHRydWUsIG51bV9kdW1wZWRfZHdvcmRzKTsKK30KKworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfaWd1X2ZpZm9fZ2V0X2R1bXBfYnVmX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJCQkgICB1MzIgKmJ1Zl9zaXplKQoreworCWVudW0gZGJnX3N0YXR1cyBzdGF0dXMgPSBxZWRfZGJnX2Rldl9pbml0KHBfaHdmbiwgcF9wdHQpOworCisJKmJ1Zl9zaXplID0gMDsKKwlpZiAoc3RhdHVzICE9IERCR19TVEFUVVNfT0spCisJCXJldHVybiBzdGF0dXM7CisJcmV0dXJuIHFlZF9pZ3VfZmlmb19kdW1wKHBfaHdmbiwgcF9wdHQsIE5VTEwsIGZhbHNlLCBidWZfc2l6ZSk7Cit9CisKK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX2lndV9maWZvX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSAgICAgIHUzMiAqZHVtcF9idWYsCisJCQkJICAgICAgdTMyIGJ1Zl9zaXplX2luX2R3b3JkcywKKwkJCQkgICAgICB1MzIgKm51bV9kdW1wZWRfZHdvcmRzKQoreworCXUzMiBuZWVkZWRfYnVmX3NpemVfaW5fZHdvcmRzOworCWVudW0gZGJnX3N0YXR1cyBzdGF0dXM7CisKKwlzdGF0dXMgPSBxZWRfZGJnX2lndV9maWZvX2dldF9kdW1wX2J1Zl9zaXplKHBfaHdmbiwgcF9wdHQsCisJCQkJCQkgICAgJm5lZWRlZF9idWZfc2l6ZV9pbl9kd29yZHMpOworCisJKm51bV9kdW1wZWRfZHdvcmRzID0gMDsKKwlpZiAoc3RhdHVzICE9IERCR19TVEFUVVNfT0spCisJCXJldHVybiBzdGF0dXM7CisJaWYgKGJ1Zl9zaXplX2luX2R3b3JkcyA8IG5lZWRlZF9idWZfc2l6ZV9pbl9kd29yZHMpCisJCXJldHVybiBEQkdfU1RBVFVTX0RVTVBfQlVGX1RPT19TTUFMTDsKKworCS8qIFVwZGF0ZSByZXNldCBzdGF0ZSAqLworCXFlZF91cGRhdGVfYmxvY2tzX3Jlc2V0X3N0YXRlKHBfaHdmbiwgcF9wdHQpOworCXJldHVybiBxZWRfaWd1X2ZpZm9fZHVtcChwX2h3Zm4sCisJCQkJIHBfcHR0LCBkdW1wX2J1ZiwgdHJ1ZSwgbnVtX2R1bXBlZF9kd29yZHMpOworfQorCitlbnVtIGRiZ19zdGF0dXMKK3FlZF9kYmdfcHJvdGVjdGlvbl9vdmVycmlkZV9nZXRfZHVtcF9idWZfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCQkgICAgICB1MzIgKmJ1Zl9zaXplKQoreworCWVudW0gZGJnX3N0YXR1cyBzdGF0dXMgPSBxZWRfZGJnX2Rldl9pbml0KHBfaHdmbiwgcF9wdHQpOworCisJKmJ1Zl9zaXplID0gMDsKKwlpZiAoc3RhdHVzICE9IERCR19TVEFUVVNfT0spCisJCXJldHVybiBzdGF0dXM7CisJcmV0dXJuIHFlZF9wcm90ZWN0aW9uX292ZXJyaWRlX2R1bXAocF9od2ZuLAorCQkJCQkgICAgcF9wdHQsIE5VTEwsIGZhbHNlLCBidWZfc2l6ZSk7Cit9CisKK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX3Byb3RlY3Rpb25fb3ZlcnJpZGVfZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJCQkgdTMyICpkdW1wX2J1ZiwKKwkJCQkJCSB1MzIgYnVmX3NpemVfaW5fZHdvcmRzLAorCQkJCQkJIHUzMiAqbnVtX2R1bXBlZF9kd29yZHMpCit7CisJdTMyIG5lZWRlZF9idWZfc2l6ZV9pbl9kd29yZHM7CisJZW51bSBkYmdfc3RhdHVzIHN0YXR1czsKKworCXN0YXR1cyA9IHFlZF9kYmdfcHJvdGVjdGlvbl9vdmVycmlkZV9nZXRfZHVtcF9idWZfc2l6ZShwX2h3Zm4sIHBfcHR0LAorCQkJCQkJJm5lZWRlZF9idWZfc2l6ZV9pbl9kd29yZHMpOworCisJKm51bV9kdW1wZWRfZHdvcmRzID0gMDsKKwlpZiAoc3RhdHVzICE9IERCR19TVEFUVVNfT0spCisJCXJldHVybiBzdGF0dXM7CisJaWYgKGJ1Zl9zaXplX2luX2R3b3JkcyA8IG5lZWRlZF9idWZfc2l6ZV9pbl9kd29yZHMpCisJCXJldHVybiBEQkdfU1RBVFVTX0RVTVBfQlVGX1RPT19TTUFMTDsKKworCS8qIFVwZGF0ZSByZXNldCBzdGF0ZSAqLworCXFlZF91cGRhdGVfYmxvY2tzX3Jlc2V0X3N0YXRlKHBfaHdmbiwgcF9wdHQpOworCXJldHVybiBxZWRfcHJvdGVjdGlvbl9vdmVycmlkZV9kdW1wKHBfaHdmbiwKKwkJCQkJICAgIHBfcHR0LAorCQkJCQkgICAgZHVtcF9idWYsIHRydWUsIG51bV9kdW1wZWRfZHdvcmRzKTsKK30KKworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfZndfYXNzZXJ0c19nZXRfZHVtcF9idWZfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCQkJICAgICB1MzIgKmJ1Zl9zaXplKQoreworCWVudW0gZGJnX3N0YXR1cyBzdGF0dXMgPSBxZWRfZGJnX2Rldl9pbml0KHBfaHdmbiwgcF9wdHQpOworCisJKmJ1Zl9zaXplID0gMDsKKwlpZiAoc3RhdHVzICE9IERCR19TVEFUVVNfT0spCisJCXJldHVybiBzdGF0dXM7CisKKwkvKiBVcGRhdGUgcmVzZXQgc3RhdGUgKi8KKwlxZWRfdXBkYXRlX2Jsb2Nrc19yZXNldF9zdGF0ZShwX2h3Zm4sIHBfcHR0KTsKKwkqYnVmX3NpemUgPSBxZWRfZndfYXNzZXJ0c19kdW1wKHBfaHdmbiwgcF9wdHQsIE5VTEwsIGZhbHNlKTsKKwlyZXR1cm4gREJHX1NUQVRVU19PSzsKK30KKworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfZndfYXNzZXJ0c19kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQlzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJCXUzMiAqZHVtcF9idWYsCisJCQkJCXUzMiBidWZfc2l6ZV9pbl9kd29yZHMsCisJCQkJCXUzMiAqbnVtX2R1bXBlZF9kd29yZHMpCit7CisJdTMyIG5lZWRlZF9idWZfc2l6ZV9pbl9kd29yZHM7CisJZW51bSBkYmdfc3RhdHVzIHN0YXR1czsKKworCXN0YXR1cyA9IHFlZF9kYmdfZndfYXNzZXJ0c19nZXRfZHVtcF9idWZfc2l6ZShwX2h3Zm4sIHBfcHR0LAorCQkJCQkJJm5lZWRlZF9idWZfc2l6ZV9pbl9kd29yZHMpOworCisJKm51bV9kdW1wZWRfZHdvcmRzID0gMDsKKwlpZiAoc3RhdHVzICE9IERCR19TVEFUVVNfT0spCisJCXJldHVybiBzdGF0dXM7CisJaWYgKGJ1Zl9zaXplX2luX2R3b3JkcyA8IG5lZWRlZF9idWZfc2l6ZV9pbl9kd29yZHMpCisJCXJldHVybiBEQkdfU1RBVFVTX0RVTVBfQlVGX1RPT19TTUFMTDsKKworCSpudW1fZHVtcGVkX2R3b3JkcyA9IHFlZF9md19hc3NlcnRzX2R1bXAocF9od2ZuLCBwX3B0dCwgZHVtcF9idWYsIHRydWUpOworCXJldHVybiBEQkdfU1RBVFVTX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBEYXRhIFR5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBtY3BfdHJhY2VfZm9ybWF0IHsKKwl1MzIgZGF0YTsKKyNkZWZpbmUgTUNQX1RSQUNFX0ZPUk1BVF9NT0RVTEVfTUFTSwkweDAwMDBmZmZmCisjZGVmaW5lIE1DUF9UUkFDRV9GT1JNQVRfTU9EVUxFX1NISUZUCTAKKyNkZWZpbmUgTUNQX1RSQUNFX0ZPUk1BVF9MRVZFTF9NQVNLCTB4MDAwMzAwMDAKKyNkZWZpbmUgTUNQX1RSQUNFX0ZPUk1BVF9MRVZFTF9TSElGVAkxNgorI2RlZmluZSBNQ1BfVFJBQ0VfRk9STUFUX1AxX1NJWkVfTUFTSwkweDAwMGMwMDAwCisjZGVmaW5lIE1DUF9UUkFDRV9GT1JNQVRfUDFfU0laRV9TSElGVAkxOAorI2RlZmluZSBNQ1BfVFJBQ0VfRk9STUFUX1AyX1NJWkVfTUFTSwkweDAwMzAwMDAwCisjZGVmaW5lIE1DUF9UUkFDRV9GT1JNQVRfUDJfU0laRV9TSElGVAkyMAorI2RlZmluZSBNQ1BfVFJBQ0VfRk9STUFUX1AzX1NJWkVfTUFTSwkweDAwYzAwMDAwCisjZGVmaW5lIE1DUF9UUkFDRV9GT1JNQVRfUDNfU0laRV9TSElGVAkyMgorI2RlZmluZSBNQ1BfVFJBQ0VfRk9STUFUX0xFTl9NQVNLCTB4ZmYwMDAwMDAKKyNkZWZpbmUgTUNQX1RSQUNFX0ZPUk1BVF9MRU5fU0hJRlQJMjQKKwljaGFyICpmb3JtYXRfc3RyOworfTsKKworc3RydWN0IG1jcF90cmFjZV9tZXRhIHsKKwl1MzIgbW9kdWxlc19udW07CisJY2hhciAqKm1vZHVsZXM7CisJdTMyIGZvcm1hdHNfbnVtOworCXN0cnVjdCBtY3BfdHJhY2VfZm9ybWF0ICpmb3JtYXRzOworfTsKKworLyogUmVnIGZpZm8gZWxlbWVudCAqLworc3RydWN0IHJlZ19maWZvX2VsZW1lbnQgeworCXU2NCBkYXRhOworI2RlZmluZSBSRUdfRklGT19FTEVNRU5UX0FERFJFU1NfU0hJRlQJCTAKKyNkZWZpbmUgUkVHX0ZJRk9fRUxFTUVOVF9BRERSRVNTX01BU0sJCTB4N2ZmZmZmCisjZGVmaW5lIFJFR19GSUZPX0VMRU1FTlRfQUNDRVNTX1NISUZUCQkyMworI2RlZmluZSBSRUdfRklGT19FTEVNRU5UX0FDQ0VTU19NQVNLCQkweDEKKyNkZWZpbmUgUkVHX0ZJRk9fRUxFTUVOVF9QRl9TSElGVAkJMjQKKyNkZWZpbmUgUkVHX0ZJRk9fRUxFTUVOVF9QRl9NQVNLCQkweGYKKyNkZWZpbmUgUkVHX0ZJRk9fRUxFTUVOVF9WRl9TSElGVAkJMjgKKyNkZWZpbmUgUkVHX0ZJRk9fRUxFTUVOVF9WRl9NQVNLCQkweGZmCisjZGVmaW5lIFJFR19GSUZPX0VMRU1FTlRfUE9SVF9TSElGVAkJMzYKKyNkZWZpbmUgUkVHX0ZJRk9fRUxFTUVOVF9QT1JUX01BU0sJCTB4MworI2RlZmluZSBSRUdfRklGT19FTEVNRU5UX1BSSVZJTEVHRV9TSElGVAkzOAorI2RlZmluZSBSRUdfRklGT19FTEVNRU5UX1BSSVZJTEVHRV9NQVNLCQkweDMKKyNkZWZpbmUgUkVHX0ZJRk9fRUxFTUVOVF9QUk9URUNUSU9OX1NISUZUCTQwCisjZGVmaW5lIFJFR19GSUZPX0VMRU1FTlRfUFJPVEVDVElPTl9NQVNLCTB4NworI2RlZmluZSBSRUdfRklGT19FTEVNRU5UX01BU1RFUl9TSElGVAkJNDMKKyNkZWZpbmUgUkVHX0ZJRk9fRUxFTUVOVF9NQVNURVJfTUFTSwkJMHhmCisjZGVmaW5lIFJFR19GSUZPX0VMRU1FTlRfRVJST1JfU0hJRlQJCTQ3CisjZGVmaW5lIFJFR19GSUZPX0VMRU1FTlRfRVJST1JfTUFTSwkJMHgxZgorfTsKKworLyogSUdVIGZpZm8gZWxlbWVudCAqLworc3RydWN0IGlndV9maWZvX2VsZW1lbnQgeworCXUzMiBkd29yZDA7CisjZGVmaW5lIElHVV9GSUZPX0VMRU1FTlRfRFdPUkQwX0ZJRF9TSElGVAkJMAorI2RlZmluZSBJR1VfRklGT19FTEVNRU5UX0RXT1JEMF9GSURfTUFTSwkJMHhmZgorI2RlZmluZSBJR1VfRklGT19FTEVNRU5UX0RXT1JEMF9JU19QRl9TSElGVAkJOAorI2RlZmluZSBJR1VfRklGT19FTEVNRU5UX0RXT1JEMF9JU19QRl9NQVNLCQkweDEKKyNkZWZpbmUgSUdVX0ZJRk9fRUxFTUVOVF9EV09SRDBfU09VUkNFX1NISUZUCQk5CisjZGVmaW5lIElHVV9GSUZPX0VMRU1FTlRfRFdPUkQwX1NPVVJDRV9NQVNLCQkweGYKKyNkZWZpbmUgSUdVX0ZJRk9fRUxFTUVOVF9EV09SRDBfRVJSX1RZUEVfU0hJRlQJCTEzCisjZGVmaW5lIElHVV9GSUZPX0VMRU1FTlRfRFdPUkQwX0VSUl9UWVBFX01BU0sJCTB4ZgorI2RlZmluZSBJR1VfRklGT19FTEVNRU5UX0RXT1JEMF9DTURfQUREUl9TSElGVAkJMTcKKyNkZWZpbmUgSUdVX0ZJRk9fRUxFTUVOVF9EV09SRDBfQ01EX0FERFJfTUFTSwkJMHg3ZmZmCisJdTMyIGR3b3JkMTsKKwl1MzIgZHdvcmQyOworI2RlZmluZSBJR1VfRklGT19FTEVNRU5UX0RXT1JEMTJfSVNfV1JfQ01EX1NISUZUCTAKKyNkZWZpbmUgSUdVX0ZJRk9fRUxFTUVOVF9EV09SRDEyX0lTX1dSX0NNRF9NQVNLCQkweDEKKyNkZWZpbmUgSUdVX0ZJRk9fRUxFTUVOVF9EV09SRDEyX1dSX0RBVEFfU0hJRlQJCTEKKyNkZWZpbmUgSUdVX0ZJRk9fRUxFTUVOVF9EV09SRDEyX1dSX0RBVEFfTUFTSwkJMHhmZmZmZmZmZgorCXUzMiByZXNlcnZlZDsKK307CisKK3N0cnVjdCBpZ3VfZmlmb193cl9kYXRhIHsKKwl1MzIgZGF0YTsKKyNkZWZpbmUgSUdVX0ZJRk9fV1JfREFUQV9QUk9EX0NPTlNfU0hJRlQJCTAKKyNkZWZpbmUgSUdVX0ZJRk9fV1JfREFUQV9QUk9EX0NPTlNfTUFTSwkJCTB4ZmZmZmZmCisjZGVmaW5lIElHVV9GSUZPX1dSX0RBVEFfVVBEQVRFX0ZMQUdfU0hJRlQJCTI0CisjZGVmaW5lIElHVV9GSUZPX1dSX0RBVEFfVVBEQVRFX0ZMQUdfTUFTSwkJMHgxCisjZGVmaW5lIElHVV9GSUZPX1dSX0RBVEFfRU5fRElTX0lOVF9GT1JfU0JfU0hJRlQJMjUKKyNkZWZpbmUgSUdVX0ZJRk9fV1JfREFUQV9FTl9ESVNfSU5UX0ZPUl9TQl9NQVNLCQkweDMKKyNkZWZpbmUgSUdVX0ZJRk9fV1JfREFUQV9TRUdNRU5UX1NISUZUCQkJMjcKKyNkZWZpbmUgSUdVX0ZJRk9fV1JfREFUQV9TRUdNRU5UX01BU0sJCQkweDEKKyNkZWZpbmUgSUdVX0ZJRk9fV1JfREFUQV9USU1FUl9NQVNLX1NISUZUCQkyOAorI2RlZmluZSBJR1VfRklGT19XUl9EQVRBX1RJTUVSX01BU0tfTUFTSwkJMHgxCisjZGVmaW5lIElHVV9GSUZPX1dSX0RBVEFfQ01EX1RZUEVfU0hJRlQJCQkzMQorI2RlZmluZSBJR1VfRklGT19XUl9EQVRBX0NNRF9UWVBFX01BU0sJCQkweDEKK307CisKK3N0cnVjdCBpZ3VfZmlmb19jbGVhbnVwX3dyX2RhdGEgeworCXUzMiBkYXRhOworI2RlZmluZSBJR1VfRklGT19DTEVBTlVQX1dSX0RBVEFfUkVTRVJWRURfU0hJRlQJCTAKKyNkZWZpbmUgSUdVX0ZJRk9fQ0xFQU5VUF9XUl9EQVRBX1JFU0VSVkVEX01BU0sJCTB4N2ZmZmZmZgorI2RlZmluZSBJR1VfRklGT19DTEVBTlVQX1dSX0RBVEFfQ0xFQU5VUF9WQUxfU0hJRlQJMjcKKyNkZWZpbmUgSUdVX0ZJRk9fQ0xFQU5VUF9XUl9EQVRBX0NMRUFOVVBfVkFMX01BU0sJMHgxCisjZGVmaW5lIElHVV9GSUZPX0NMRUFOVVBfV1JfREFUQV9DTEVBTlVQX1RZUEVfU0hJRlQJMjgKKyNkZWZpbmUgSUdVX0ZJRk9fQ0xFQU5VUF9XUl9EQVRBX0NMRUFOVVBfVFlQRV9NQVNLCTB4NworI2RlZmluZSBJR1VfRklGT19DTEVBTlVQX1dSX0RBVEFfQ01EX1RZUEVfU0hJRlQJCTMxCisjZGVmaW5lIElHVV9GSUZPX0NMRUFOVVBfV1JfREFUQV9DTURfVFlQRV9NQVNLCQkweDEKK307CisKKy8qIFByb3RlY3Rpb24gb3ZlcnJpZGUgZWxlbWVudCAqLworc3RydWN0IHByb3RlY3Rpb25fb3ZlcnJpZGVfZWxlbWVudCB7CisJdTY0IGRhdGE7CisjZGVmaW5lIFBST1RFQ1RJT05fT1ZFUlJJREVfRUxFTUVOVF9BRERSRVNTX1NISUZUCQkwCisjZGVmaW5lIFBST1RFQ1RJT05fT1ZFUlJJREVfRUxFTUVOVF9BRERSRVNTX01BU0sJCTB4N2ZmZmZmCisjZGVmaW5lIFBST1RFQ1RJT05fT1ZFUlJJREVfRUxFTUVOVF9XSU5ET1dfU0laRV9TSElGVAkJMjMKKyNkZWZpbmUgUFJPVEVDVElPTl9PVkVSUklERV9FTEVNRU5UX1dJTkRPV19TSVpFX01BU0sJCTB4ZmZmZmZmCisjZGVmaW5lIFBST1RFQ1RJT05fT1ZFUlJJREVfRUxFTUVOVF9SRUFEX1NISUZUCQkJNDcKKyNkZWZpbmUgUFJPVEVDVElPTl9PVkVSUklERV9FTEVNRU5UX1JFQURfTUFTSwkJCTB4MQorI2RlZmluZSBQUk9URUNUSU9OX09WRVJSSURFX0VMRU1FTlRfV1JJVEVfU0hJRlQJCQk0OAorI2RlZmluZSBQUk9URUNUSU9OX09WRVJSSURFX0VMRU1FTlRfV1JJVEVfTUFTSwkJCTB4MQorI2RlZmluZSBQUk9URUNUSU9OX09WRVJSSURFX0VMRU1FTlRfUkVBRF9QUk9URUNUSU9OX1NISUZUCTQ5CisjZGVmaW5lIFBST1RFQ1RJT05fT1ZFUlJJREVfRUxFTUVOVF9SRUFEX1BST1RFQ1RJT05fTUFTSwkweDcKKyNkZWZpbmUgUFJPVEVDVElPTl9PVkVSUklERV9FTEVNRU5UX1dSSVRFX1BST1RFQ1RJT05fU0hJRlQJNTIKKyNkZWZpbmUgUFJPVEVDVElPTl9PVkVSUklERV9FTEVNRU5UX1dSSVRFX1BST1RFQ1RJT05fTUFTSwkweDcKK307CisKK2VudW0gaWd1X2ZpZm9fc291cmNlcyB7CisJSUdVX1NSQ19QWFAwLAorCUlHVV9TUkNfUFhQMSwKKwlJR1VfU1JDX1BYUDIsCisJSUdVX1NSQ19QWFAzLAorCUlHVV9TUkNfUFhQNCwKKwlJR1VfU1JDX1BYUDUsCisJSUdVX1NSQ19QWFA2LAorCUlHVV9TUkNfUFhQNywKKwlJR1VfU1JDX0NBVSwKKwlJR1VfU1JDX0FUVE4sCisJSUdVX1NSQ19HUkMKK307CisKK2VudW0gaWd1X2ZpZm9fYWRkcl90eXBlcyB7CisJSUdVX0FERFJfVFlQRV9NU0lYX01FTSwKKwlJR1VfQUREUl9UWVBFX1dSSVRFX1BCQSwKKwlJR1VfQUREUl9UWVBFX1dSSVRFX0lOVF9BQ0ssCisJSUdVX0FERFJfVFlQRV9XUklURV9BVFROX0JJVFMsCisJSUdVX0FERFJfVFlQRV9SRUFEX0lOVCwKKwlJR1VfQUREUl9UWVBFX1dSSVRFX1BST0RfVVBEQVRFLAorCUlHVV9BRERSX1RZUEVfUkVTRVJWRUQKK307CisKK3N0cnVjdCBpZ3VfZmlmb19hZGRyX2RhdGEgeworCXUxNiBzdGFydF9hZGRyOworCXUxNiBlbmRfYWRkcjsKKwljaGFyICpkZXNjOworCWNoYXIgKnZmX2Rlc2M7CisJZW51bSBpZ3VfZmlmb19hZGRyX3R5cGVzIHR5cGU7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTUFYX01TR19MRU4JCQkJMTAyNAorI2RlZmluZSBNQ1BfVFJBQ0VfTUFYX01PRFVMRV9MRU4JCTgKKyNkZWZpbmUgTUNQX1RSQUNFX0ZPUk1BVF9NQVhfUEFSQU1TCQkzCisjZGVmaW5lIE1DUF9UUkFDRV9GT1JNQVRfUEFSQU1fV0lEVEggXAorCShNQ1BfVFJBQ0VfRk9STUFUX1AyX1NJWkVfU0hJRlQgLSBNQ1BfVFJBQ0VfRk9STUFUX1AxX1NJWkVfU0hJRlQpCisjZGVmaW5lIFJFR19GSUZPX0VMRU1FTlRfQUREUl9GQUNUT1IJCTQKKyNkZWZpbmUgUkVHX0ZJRk9fRUxFTUVOVF9JU19QRl9WRl9WQUwJCTEyNworI2RlZmluZSBQUk9URUNUSU9OX09WRVJSSURFX0VMRU1FTlRfQUREUl9GQUNUT1IJNAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1hY3JvcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQllURVNfVE9fRFdPUkRTKGJ5dGVzKQkJCSgoYnl0ZXMpIC8gQllURVNfSU5fRFdPUkQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDb25zdGFudCBBcnJheXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogU3RhdHVzIHN0cmluZyBhcnJheSAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzX3N0YXR1c19zdHJbXSA9IHsKKwkiT3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiLAorCSJEZWJ1ZyBhcHBsaWNhdGlvbiB2ZXJzaW9uIHdhc24ndCBzZXQiLAorCSJVbnN1cHBvcnRlZCBkZWJ1ZyBhcHBsaWNhdGlvbiB2ZXJzaW9uIiwKKwkiVGhlIGRlYnVnIGJsb2NrIHdhc24ndCByZXNldCBzaW5jZSB0aGUgbGFzdCByZWNvcmRpbmciLAorCSJJbnZhbGlkIGFyZ3VtZW50cyIsCisJIlRoZSBkZWJ1ZyBvdXRwdXQgd2FzIGFscmVhZHkgc2V0IiwKKwkiSW52YWxpZCBQQ0kgYnVmZmVyIHNpemUiLAorCSJQQ0kgYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkIiwKKwkiQSBQQ0kgYnVmZmVyIHdhc24ndCBhbGxvY2F0ZWQiLAorCSJUb28gbWFueSBpbnB1dHMgd2VyZSBlbmFibGVkLiBFbmFibGVkIGxlc3MgaW5wdXRzLCBvciBzZXQgJ3VuaWZ5SW5wdXRzJyB0byB0cnVlIiwKKwkiR1JDL1RpbWVzdGFtcCBpbnB1dCBvdmVybGFwIGluIGN5Y2xlIGR3b3JkIDAiLAorCSJDYW5ub3QgcmVjb3JkIFN0b3JtIGRhdGEgc2luY2UgdGhlIGVudGlyZSByZWNvcmRpbmcgY3ljbGUgaXMgdXNlZCBieSBIVyIsCisJIlRoZSBTdG9ybSB3YXMgYWxyZWFkeSBlbmFibGVkIiwKKwkiVGhlIHNwZWNpZmllZCBTdG9ybSB3YXNuJ3QgZW5hYmxlZCIsCisJIlRoZSBibG9jayB3YXMgYWxyZWFkeSBlbmFibGVkIiwKKwkiVGhlIHNwZWNpZmllZCBibG9jayB3YXNuJ3QgZW5hYmxlZCIsCisJIk5vIGlucHV0IHdhcyBlbmFibGVkIGZvciByZWNvcmRpbmciLAorCSJGaWx0ZXJzIGFuZCB0cmlnZ2VycyBhcmUgbm90IGFsbG93ZWQgd2hlbiByZWNvcmRpbmcgaW4gNjRiIHVuaXRzIiwKKwkiVGhlIGZpbHRlciB3YXMgYWxyZWFkeSBlbmFibGVkIiwKKwkiVGhlIHRyaWdnZXIgd2FzIGFscmVhZHkgZW5hYmxlZCIsCisJIlRoZSB0cmlnZ2VyIHdhc24ndCBlbmFibGVkIiwKKwkiQSBjb25zdHJhaW50IGNhbiBiZSBhZGRlZCBvbmx5IGFmdGVyIGEgZmlsdGVyIHdhcyBlbmFibGVkIG9yIGEgdHJpZ2dlciBzdGF0ZSB3YXMgYWRkZWQiLAorCSJDYW5ub3QgYWRkIG1vcmUgdGhhbiAzIHRyaWdnZXIgc3RhdGVzIiwKKwkiQ2Fubm90IGFkZCBtb3JlIHRoYW4gNCBjb25zdHJhaW50cyBwZXIgZmlsdGVyIG9yIHRyaWdnZXIgc3RhdGUiLAorCSJUaGUgcmVjb3JkaW5nIHdhc24ndCBzdGFydGVkIiwKKwkiQSB0cmlnZ2VyIHdhcyBjb25maWd1cmVkLCBidXQgaXQgZGlkbid0IHRyaWdnZXIiLAorCSJObyBkYXRhIHdhcyByZWNvcmRlZCIsCisJIkR1bXAgYnVmZmVyIGlzIHRvbyBzbWFsbCIsCisJIkR1bXBlZCBkYXRhIGlzIG5vdCBhbGlnbmVkIHRvIGNodW5rcyIsCisJIlVua25vd24gY2hpcCIsCisJIkZhaWxlZCBhbGxvY2F0aW5nIHZpcnR1YWwgbWVtb3J5IiwKKwkiVGhlIGlucHV0IGJsb2NrIGlzIGluIHJlc2V0IiwKKwkiSW52YWxpZCBNQ1AgdHJhY2Ugc2lnbmF0dXJlIGZvdW5kIGluIE5WUkFNIiwKKwkiSW52YWxpZCBidW5kbGUgSUQgZm91bmQgaW4gTlZSQU0iLAorCSJGYWlsZWQgZ2V0dGluZyBOVlJBTSBpbWFnZSIsCisJIk5WUkFNIGltYWdlIGlzIG5vdCBkd29yZC1hbGlnbmVkIiwKKwkiRmFpbGVkIHJlYWRpbmcgZnJvbSBOVlJBTSIsCisJIklkbGUgY2hlY2sgcGFyc2luZyBmYWlsZWQiLAorCSJNQ1AgVHJhY2UgZGF0YSBpcyBjb3JydXB0IiwKKwkiRHVtcCBkb2Vzbid0IGNvbnRhaW4gbWV0YSBkYXRhIC0gaXQgbXVzdCBiZSBwcm92aWRlZCBpbiBhbiBpbWFnZSBmaWxlIiwKKwkiRmFpbGVkIHRvIGhhbHQgTUNQIiwKKwkiRmFpbGVkIHRvIHJlc3VtZSBNQ1AgYWZ0ZXIgaGFsdCIsCisJIkRNQUUgdHJhbnNhY3Rpb24gZmFpbGVkIiwKKwkiRmFpbGVkIHRvIGVtcHR5IFNFTUkgc3luYyBGSUZPIiwKKwkiSUdVIEZJRk8gZGF0YSBpcyBjb3JydXB0IiwKKwkiTUNQIGZhaWxlZCB0byBtYXNrIHBhcml0aWVzIiwKKwkiRlcgQXNzZXJ0cyBwYXJzaW5nIGZhaWxlZCIsCisJIkdSQyBGSUZPIGRhdGEgaXMgY29ycnVwdCIsCisJIlByb3RlY3Rpb24gT3ZlcnJpZGUgZGF0YSBpcyBjb3JydXB0IiwKKwkiRGVidWcgYXJyYXlzIHdlcmUgbm90IHNldCAod2hlbiB1c2luZyBiaW5hcnkgZmlsZXMsIGRiZ19zZXRfYmluX3B0ciBtdXN0IGJlIGNhbGxlZCkiLAorCSJXaGVuIGEgYmxvY2sgaXMgZmlsdGVyZWQsIG5vIG90aGVyIGJsb2NrcyBjYW4gYmUgcmVjb3JkZWQgdW5sZXNzIGlucHV0cyBhcmUgdW5pZmllZCAoZHVlIHRvIGEgSFcgYnVnKSIKK307CisKKy8qIElkbGUgY2hlY2sgc2V2ZXJpdHkgbmFtZXMgYXJyYXkgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc19pZGxlX2Noa19zZXZlcml0eV9zdHJbXSA9IHsKKwkiRXJyb3IiLAorCSJFcnJvciBpZiBubyB0cmFmZmljIiwKKwkiV2FybmluZyIKK307CisKKy8qIE1DUCBUcmFjZSBsZXZlbCBuYW1lcyBhcnJheSAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzX21jcF90cmFjZV9sZXZlbF9zdHJbXSA9IHsKKwkiRVJST1IiLAorCSJUUkFDRSIsCisJIkRFQlVHIgorfTsKKworLyogUGFyc2luZyBzdHJpbmdzICovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNfYWNjZXNzX3N0cnNbXSA9IHsKKwkicmVhZCIsCisJIndyaXRlIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzX3ByaXZpbGVnZV9zdHJzW10gPSB7CisJIlZGIiwKKwkiUERBIiwKKwkiSFYiLAorCSJVQSIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc19wcm90ZWN0aW9uX3N0cnNbXSA9IHsKKwkiKGRlZmF1bHQpIiwKKwkiKGRlZmF1bHQpIiwKKwkiKGRlZmF1bHQpIiwKKwkiKGRlZmF1bHQpIiwKKwkib3ZlcnJpZGUgVkYiLAorCSJvdmVycmlkZSBQREEiLAorCSJvdmVycmlkZSBIViIsCisJIm92ZXJyaWRlIFVBIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzX21hc3Rlcl9zdHJzW10gPSB7CisJIj8/PyIsCisJInB4cCIsCisJIm1jcCIsCisJIm1zZG0iLAorCSJwc2RtIiwKKwkieXNkbSIsCisJInVzZG0iLAorCSJ0c2RtIiwKKwkieHNkbSIsCisJImRidSIsCisJImRtYWUiLAorCSI/Pz8iLAorCSI/Pz8iLAorCSI/Pz8iLAorCSI/Pz8iLAorCSI/Pz8iCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNfcmVnX2ZpZm9fZXJyb3Jfc3Ryc1tdID0geworCSJncmMgdGltZW91dCIsCisJImFkZHJlc3MgZG9lc24ndCBiZWxvbmcgdG8gYW55IGJsb2NrIiwKKwkicmVzZXJ2ZWQgYWRkcmVzcyBpbiBibG9jayBvciB3cml0ZSB0byByZWFkLW9ubHkgYWRkcmVzcyIsCisJInByaXZpbGVnZS9wcm90ZWN0aW9uIG1pc21hdGNoIiwKKwkicGF0aCBpc29sYXRpb24gZXJyb3IiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNfaWd1X2ZpZm9fc291cmNlX3N0cnNbXSA9IHsKKwkiVFNUT1JNIiwKKwkiTVNUT1JNIiwKKwkiVVNUT1JNIiwKKwkiWFNUT1JNIiwKKwkiWVNUT1JNIiwKKwkiUFNUT1JNIiwKKwkiUENJRSIsCisJIk5JR19RTV9QQkYiLAorCSJDQVUiLAorCSJBVFROIiwKKwkiR1JDIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc19pZ3VfZmlmb19lcnJvcl9zdHJzW10gPSB7CisJIm5vIGVycm9yIiwKKwkibGVuZ3RoIGVycm9yIiwKKwkiZnVuY3Rpb24gZGlzYWJsZWQiLAorCSJWRiBzZW50IGNvbW1hbmQgdG8gYXR0bmV0aW9uIGFkZHJlc3MiLAorCSJob3N0IHNlbnQgcHJvZCB1cGRhdGUgY29tbWFuZCIsCisJInJlYWQgb2YgZHVyaW5nIGludGVycnVwdCByZWdpc3RlciB3aGlsZSBpbiBNSU1EIG1vZGUiLAorCSJhY2Nlc3MgdG8gUFhQIEJBUiByZXNlcnZlZCBhZGRyZXNzIiwKKwkicHJvZHVjZXIgdXBkYXRlIGNvbW1hbmQgdG8gYXR0ZW50aW9uIGluZGV4IiwKKwkidW5rbm93biBlcnJvciIsCisJIlNCIGluZGV4IG5vdCB2YWxpZCIsCisJIlNCIHJlbGF0aXZlIGluZGV4IGFuZCBGSUQgbm90IGZvdW5kIiwKKwkiRklEIG5vdCBtYXRjaCIsCisJImNvbW1hbmQgd2l0aCBlcnJvciBmbGFnIGFzc2VydGVkIChQQ0kgZXJyb3Igb3IgQ0FVIGRpc2NhcmQpIiwKKwkiVkYgc2VudCBjbGVhbnVwIGFuZCBSRiBjbGVhbnVwIGlzIGRpc2FibGVkIiwKKwkiY2xlYW51cCBjb21tYW5kIG9uIHR5cGUgYmlnZ2VyIHRoYW4gNCIKK307CisKKy8qIElHVSBGSUZPIGFkZHJlc3MgZGF0YSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpZ3VfZmlmb19hZGRyX2RhdGEgc19pZ3VfZmlmb19hZGRyX2RhdGFbXSA9IHsKKwl7MHgwLCAweDEwMSwgIk1TSS1YIE1lbW9yeSIsIE5VTEwsIElHVV9BRERSX1RZUEVfTVNJWF9NRU19LAorCXsweDEwMiwgMHgxZmYsICJyZXNlcnZlZCIsIE5VTEwsIElHVV9BRERSX1RZUEVfUkVTRVJWRUR9LAorCXsweDIwMCwgMHgyMDAsICJXcml0ZSBQQkFbMDo2M10iLCBOVUxMLCBJR1VfQUREUl9UWVBFX1dSSVRFX1BCQX0sCisJezB4MjAxLCAweDIwMSwgIldyaXRlIFBCQVs2NDoxMjddIiwgInJlc2VydmVkIiwKKwkgSUdVX0FERFJfVFlQRV9XUklURV9QQkF9LAorCXsweDIwMiwgMHgyMDIsICJXcml0ZSBQQkFbMTI4XSIsICJyZXNlcnZlZCIsIElHVV9BRERSX1RZUEVfV1JJVEVfUEJBfSwKKwl7MHgyMDMsIDB4M2ZmLCAicmVzZXJ2ZWQiLCBOVUxMLCBJR1VfQUREUl9UWVBFX1JFU0VSVkVEfSwKKwl7MHg0MDAsIDB4NWVmLCAiV3JpdGUgaW50ZXJydXB0IGFja25vd2xlZGdtZW50IiwgTlVMTCwKKwkgSUdVX0FERFJfVFlQRV9XUklURV9JTlRfQUNLfSwKKwl7MHg1ZjAsIDB4NWYwLCAiQXR0ZW50aW9uIGJpdHMgdXBkYXRlIiwgTlVMTCwKKwkgSUdVX0FERFJfVFlQRV9XUklURV9BVFROX0JJVFN9LAorCXsweDVmMSwgMHg1ZjEsICJBdHRlbnRpb24gYml0cyBzZXQiLCBOVUxMLAorCSBJR1VfQUREUl9UWVBFX1dSSVRFX0FUVE5fQklUU30sCisJezB4NWYyLCAweDVmMiwgIkF0dGVudGlvbiBiaXRzIGNsZWFyIiwgTlVMTCwKKwkgSUdVX0FERFJfVFlQRV9XUklURV9BVFROX0JJVFN9LAorCXsweDVmMywgMHg1ZjMsICJSZWFkIGludGVycnVwdCAwOjYzIHdpdGggbWFzayIsIE5VTEwsCisJIElHVV9BRERSX1RZUEVfUkVBRF9JTlR9LAorCXsweDVmNCwgMHg1ZjQsICJSZWFkIGludGVycnVwdCAwOjMxIHdpdGggbWFzayIsIE5VTEwsCisJIElHVV9BRERSX1RZUEVfUkVBRF9JTlR9LAorCXsweDVmNSwgMHg1ZjUsICJSZWFkIGludGVycnVwdCAzMjo2MyB3aXRoIG1hc2siLCBOVUxMLAorCSBJR1VfQUREUl9UWVBFX1JFQURfSU5UfSwKKwl7MHg1ZjYsIDB4NWY2LCAiUmVhZCBpbnRlcnJ1cHQgMDo2MyB3aXRob3V0IG1hc2siLCBOVUxMLAorCSBJR1VfQUREUl9UWVBFX1JFQURfSU5UfSwKKwl7MHg1ZjcsIDB4NWZmLCAicmVzZXJ2ZWQiLCBOVUxMLCBJR1VfQUREUl9UWVBFX1JFU0VSVkVEfSwKKwl7MHg2MDAsIDB4N2ZmLCAiUHJvZHVjZXIgdXBkYXRlIiwgTlVMTCwgSUdVX0FERFJfVFlQRV9XUklURV9QUk9EX1VQREFURX0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBWYXJpYWJsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTUNQIFRyYWNlIG1ldGEgZGF0YSAtIHVzZWQgaW4gY2FzZSB0aGUgZHVtcCBkb2Vzbid0IGNvbnRhaW4gdGhlIG1ldGEgZGF0YQorICogKGUuZy4gZHVlIHRvIG5vIE5WUkFNIGFjY2VzcykuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGJnX2FycmF5IHNfbWNwX3RyYWNlX21ldGEgPSB7IE5VTEwsIDAgfTsKKworLyogVGVtcG9yYXJ5IGJ1ZmZlciwgdXNlZCBmb3IgcHJpbnQgc2l6ZSBjYWxjdWxhdGlvbnMgKi8KK3N0YXRpYyBjaGFyIHNfdGVtcF9idWZbTUFYX01TR19MRU5dOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUHVibGljIEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ191c2VyX3NldF9iaW5fcHRyKGNvbnN0IHU4ICogY29uc3QgYmluX3B0cikKK3sKKwkvKiBDb252ZXJ0IGJpbmFyeSBkYXRhIHRvIGRlYnVnIGFycmF5cyAqLworCXUzMiBudW1fb2ZfYnVmZmVycyA9ICoodTMyICopYmluX3B0cjsKKwlzdHJ1Y3QgYmluX2J1ZmZlcl9oZHIgKmJ1Zl9hcnJheTsKKwl1OCBidWZfaWQ7CisKKwlidWZfYXJyYXkgPSAoc3RydWN0IGJpbl9idWZmZXJfaGRyICopKCh1MzIgKiliaW5fcHRyICsgMSk7CisKKwlmb3IgKGJ1Zl9pZCA9IDA7IGJ1Zl9pZCA8IG51bV9vZl9idWZmZXJzOyBidWZfaWQrKykgeworCQlzX2RiZ19hcnJheXNbYnVmX2lkXS5wdHIgPQorCQkgICAgKHUzMiAqKShiaW5fcHRyICsgYnVmX2FycmF5W2J1Zl9pZF0ub2Zmc2V0KTsKKwkJc19kYmdfYXJyYXlzW2J1Zl9pZF0uc2l6ZV9pbl9kd29yZHMgPQorCQkgICAgQllURVNfVE9fRFdPUkRTKGJ1Zl9hcnJheVtidWZfaWRdLmxlbmd0aCk7CisJfQorCisJcmV0dXJuIERCR19TVEFUVVNfT0s7Cit9CisKK3N0YXRpYyB1MzIgcWVkX2N5Y2xpY19hZGQodTMyIGEsIHUzMiBiLCB1MzIgc2l6ZSkKK3sKKwlyZXR1cm4gKGEgKyBiKSAlIHNpemU7Cit9CisKK3N0YXRpYyB1MzIgcWVkX2N5Y2xpY19zdWIodTMyIGEsIHUzMiBiLCB1MzIgc2l6ZSkKK3sKKwlyZXR1cm4gKHNpemUgKyBhIC0gYikgJSBzaXplOworfQorCisvKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBzcGVjaWZpZWQgY3ljbGljIGJ1ZmZlciAodXAgdG8gNAorICogYnl0ZXMpIGFuZCByZXR1cm5zIHRoZW0gYXMgYSBkd29yZCB2YWx1ZS4gdGhlIHNwZWNpZmllZCBidWZmZXIgb2Zmc2V0IGlzCisgKiB1cGRhdGVkLgorICovCitzdGF0aWMgdTMyIHFlZF9yZWFkX2Zyb21fY3ljbGljX2J1Zih2b2lkICpidWYsCisJCQkJICAgIHUzMiAqb2Zmc2V0LAorCQkJCSAgICB1MzIgYnVmX3NpemUsIHU4IG51bV9ieXRlc190b19yZWFkKQoreworCXU4ICpieXRlc19idWYgPSAodTggKilidWY7CisJdTggKnZhbF9wdHI7CisJdTMyIHZhbCA9IDA7CisJdTggaTsKKworCXZhbF9wdHIgPSAodTggKikmdmFsOworCisJZm9yIChpID0gMDsgaSA8IG51bV9ieXRlc190b19yZWFkOyBpKyspIHsKKwkJdmFsX3B0cltpXSA9IGJ5dGVzX2J1Zlsqb2Zmc2V0XTsKKwkJKm9mZnNldCA9IHFlZF9jeWNsaWNfYWRkKCpvZmZzZXQsIDEsIGJ1Zl9zaXplKTsKKwl9CisKKwlyZXR1cm4gdmFsOworfQorCisvKiBSZWFkcyBhbmQgcmV0dXJucyB0aGUgbmV4dCBieXRlIGZyb20gdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKiBUaGUgc3BlY2lmaWVkIGJ1ZmZlciBvZmZzZXQgaXMgdXBkYXRlZC4KKyAqLworc3RhdGljIHU4IHFlZF9yZWFkX2J5dGVfZnJvbV9idWYodm9pZCAqYnVmLCB1MzIgKm9mZnNldCkKK3sKKwlyZXR1cm4gKCh1OCAqKWJ1ZilbKCpvZmZzZXQpKytdOworfQorCisvKiBSZWFkcyBhbmQgcmV0dXJucyB0aGUgbmV4dCBkd29yZCBmcm9tIHRoZSBzcGVjaWZpZWQgYnVmZmVyLgorICogVGhlIHNwZWNpZmllZCBidWZmZXIgb2Zmc2V0IGlzIHVwZGF0ZWQuCisgKi8KK3N0YXRpYyB1MzIgcWVkX3JlYWRfZHdvcmRfZnJvbV9idWYodm9pZCAqYnVmLCB1MzIgKm9mZnNldCkKK3sKKwl1MzIgZHdvcmRfdmFsID0gKih1MzIgKikmKCh1OCAqKWJ1ZilbKm9mZnNldF07CisKKwkqb2Zmc2V0ICs9IDQ7CisJcmV0dXJuIGR3b3JkX3ZhbDsKK30KKworLyogUmVhZHMgdGhlIG5leHQgc3RyaW5nIGZyb20gdGhlIHNwZWNpZmllZCBidWZmZXIsIGFuZCBjb3BpZXMgaXQgdG8gdGhlCisgKiBzcGVjaWZpZWQgcG9pbnRlci4gVGhlIHNwZWNpZmllZCBidWZmZXIgb2Zmc2V0IGlzIHVwZGF0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIHFlZF9yZWFkX3N0cl9mcm9tX2J1Zih2b2lkICpidWYsIHUzMiAqb2Zmc2V0LCB1MzIgc2l6ZSwgY2hhciAqZGVzdCkKK3sKKwljb25zdCBjaGFyICpzb3VyY2Vfc3RyID0gJigoY29uc3QgY2hhciAqKWJ1ZilbKm9mZnNldF07CisKKwlzdHJuY3B5KGRlc3QsIHNvdXJjZV9zdHIsIHNpemUpOworCWRlc3Rbc2l6ZSAtIDFdID0gJ1wwJzsKKwkqb2Zmc2V0ICs9IHNpemU7Cit9CisKKy8qIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzcGVjaWZpZWQgb2Zmc2V0IChpbiBieXRlcykgb2YgdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKiBJZiB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBpbiBOVUxMLCBhIHRlbXBvcmFyeSBidWZmZXIgcG9pbnRlciBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIGNoYXIgKnFlZF9nZXRfYnVmX3B0cih2b2lkICpidWYsIHUzMiBvZmZzZXQpCit7CisJcmV0dXJuIGJ1ZiA/IChjaGFyICopYnVmICsgb2Zmc2V0IDogc190ZW1wX2J1ZjsKK30KKworLyogUmVhZHMgYSBwYXJhbSBmcm9tIHRoZSBzcGVjaWZpZWQgYnVmZmVyLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZHdvcmRzIHJlYWQuCisgKiBJZiB0aGUgcmV0dXJuZWQgc3RyX3BhcmFtIGlzIE5VTEwsIHRoZSBwYXJhbSBpcyBudW1lcmljIGFuZCBpdHMgdmFsdWUgaXMKKyAqIHJldHVybmVkIGluIG51bV9wYXJhbS4KKyAqIE90aGVyaXdpc2UsIHRoZSBwYXJhbSBpcyBhIHN0cmluZyBhbmQgaXRzIHBvaW50ZXIgaXMgcmV0dXJuZWQgaW4gc3RyX3BhcmFtLgorICovCitzdGF0aWMgdTMyIHFlZF9yZWFkX3BhcmFtKHUzMiAqZHVtcF9idWYsCisJCQkgIGNvbnN0IGNoYXIgKipwYXJhbV9uYW1lLAorCQkJICBjb25zdCBjaGFyICoqcGFyYW1fc3RyX3ZhbCwgdTMyICpwYXJhbV9udW1fdmFsKQoreworCWNoYXIgKmNoYXJfYnVmID0gKGNoYXIgKilkdW1wX2J1ZjsKKwl1MzIgb2Zmc2V0ID0gMDsgLyogSW4gYnl0ZXMgKi8KKworCS8qIEV4dHJhY3QgcGFyYW0gbmFtZSAqLworCSpwYXJhbV9uYW1lID0gY2hhcl9idWY7CisJb2Zmc2V0ICs9IHN0cmxlbigqcGFyYW1fbmFtZSkgKyAxOworCisJLyogQ2hlY2sgcGFyYW0gdHlwZSAqLworCWlmICgqKGNoYXJfYnVmICsgb2Zmc2V0KyspKSB7CisJCS8qIFN0cmluZyBwYXJhbSAqLworCQkqcGFyYW1fc3RyX3ZhbCA9IGNoYXJfYnVmICsgb2Zmc2V0OworCQlvZmZzZXQgKz0gc3RybGVuKCpwYXJhbV9zdHJfdmFsKSArIDE7CisJCWlmIChvZmZzZXQgJiAweDMpCisJCQlvZmZzZXQgKz0gKDQgLSAob2Zmc2V0ICYgMHgzKSk7CisJfSBlbHNlIHsKKwkJLyogTnVtZXJpYyBwYXJhbSAqLworCQkqcGFyYW1fc3RyX3ZhbCA9IE5VTEw7CisJCWlmIChvZmZzZXQgJiAweDMpCisJCQlvZmZzZXQgKz0gKDQgLSAob2Zmc2V0ICYgMHgzKSk7CisJCSpwYXJhbV9udW1fdmFsID0gKih1MzIgKikoY2hhcl9idWYgKyBvZmZzZXQpOworCQlvZmZzZXQgKz0gNDsKKwl9CisKKwlyZXR1cm4gb2Zmc2V0IC8gNDsKK30KKworLyogUmVhZHMgYSBzZWN0aW9uIGhlYWRlciBmcm9tIHRoZSBzcGVjaWZpZWQgYnVmZmVyLgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGR3b3JkcyByZWFkLgorICovCitzdGF0aWMgdTMyIHFlZF9yZWFkX3NlY3Rpb25faGRyKHUzMiAqZHVtcF9idWYsCisJCQkJY29uc3QgY2hhciAqKnNlY3Rpb25fbmFtZSwKKwkJCQl1MzIgKm51bV9zZWN0aW9uX3BhcmFtcykKK3sKKwljb25zdCBjaGFyICpwYXJhbV9zdHJfdmFsOworCisJcmV0dXJuIHFlZF9yZWFkX3BhcmFtKGR1bXBfYnVmLAorCQkJICAgICAgc2VjdGlvbl9uYW1lLCAmcGFyYW1fc3RyX3ZhbCwgbnVtX3NlY3Rpb25fcGFyYW1zKTsKK30KKworLyogUmVhZHMgc2VjdGlvbiBwYXJhbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBhbmQgcHJpbnRzIHRoZW0gdG8gdGhlIHJlc3VsdHMKKyAqIGJ1ZmZlci4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGR3b3JkcyByZWFkLgorICovCitzdGF0aWMgdTMyIHFlZF9wcmludF9zZWN0aW9uX3BhcmFtcyh1MzIgKmR1bXBfYnVmLAorCQkJCSAgICB1MzIgbnVtX3NlY3Rpb25fcGFyYW1zLAorCQkJCSAgICBjaGFyICpyZXN1bHRzX2J1ZiwgdTMyICpudW1fY2hhcnNfcHJpbnRlZCkKK3sKKwl1MzIgaSwgZHVtcF9vZmZzZXQgPSAwLCByZXN1bHRzX29mZnNldCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3NlY3Rpb25fcGFyYW1zOyBpKyspIHsKKwkJY29uc3QgY2hhciAqcGFyYW1fbmFtZTsKKwkJY29uc3QgY2hhciAqcGFyYW1fc3RyX3ZhbDsKKwkJdTMyIHBhcmFtX251bV92YWwgPSAwOworCisJCWR1bXBfb2Zmc2V0ICs9IHFlZF9yZWFkX3BhcmFtKGR1bXBfYnVmICsgZHVtcF9vZmZzZXQsCisJCQkJCSAgICAgICZwYXJhbV9uYW1lLAorCQkJCQkgICAgICAmcGFyYW1fc3RyX3ZhbCwgJnBhcmFtX251bV92YWwpOworCQlpZiAocGFyYW1fc3RyX3ZhbCkKKwkJCS8qIFN0cmluZyBwYXJhbSAqLworCQkJcmVzdWx0c19vZmZzZXQgKz0KKwkJCQlzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwKKwkJCQkJCQlyZXN1bHRzX29mZnNldCksCisJCQkJCSIlczogJXNcbiIsIHBhcmFtX25hbWUsIHBhcmFtX3N0cl92YWwpOworCQllbHNlIGlmIChzdHJjbXAocGFyYW1fbmFtZSwgImZ3LXRpbWVzdGFtcCIpKQorCQkJLyogTnVtZXJpYyBwYXJhbSAqLworCQkJcmVzdWx0c19vZmZzZXQgKz0KKwkJCQlzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwKKwkJCQkJCQlyZXN1bHRzX29mZnNldCksCisJCQkJCSIlczogJWRcbiIsIHBhcmFtX25hbWUsIHBhcmFtX251bV92YWwpOworCX0KKworCXJlc3VsdHNfb2Zmc2V0ICs9CisJICAgIHNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLCByZXN1bHRzX29mZnNldCksICJcbiIpOworCSpudW1fY2hhcnNfcHJpbnRlZCA9IHJlc3VsdHNfb2Zmc2V0OworCXJldHVybiBkdW1wX29mZnNldDsKK30KKworY29uc3QgY2hhciAqcWVkX2RiZ19nZXRfc3RhdHVzX3N0cihlbnVtIGRiZ19zdGF0dXMgc3RhdHVzKQoreworCXJldHVybiAoc3RhdHVzIDwKKwkJTUFYX0RCR19TVEFUVVMpID8gc19zdGF0dXNfc3RyW3N0YXR1c10gOiAiSW52YWxpZCBkZWJ1ZyBzdGF0dXMiOworfQorCisvKiBQYXJzZXMgdGhlIGlkbGUgY2hlY2sgcnVsZXMgYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQuCisgKiBJbiBjYXNlIG9mIHBhcnNpbmcgZXJyb3IsIHJldHVybnMgMC4KKyAqLworc3RhdGljIHUzMiBxZWRfcGFyc2VfaWRsZV9jaGtfZHVtcF9ydWxlcyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJIHUzMiAqZHVtcF9idWYsCisJCQkJCSB1MzIgKmR1bXBfYnVmX2VuZCwKKwkJCQkJIHUzMiBudW1fcnVsZXMsCisJCQkJCSBib29sIHByaW50X2Z3X2lkbGVfY2hrLAorCQkJCQkgY2hhciAqcmVzdWx0c19idWYsCisJCQkJCSB1MzIgKm51bV9lcnJvcnMsIHUzMiAqbnVtX3dhcm5pbmdzKQoreworCXUzMiBydWxlX2lkeCwgcmVzdWx0c19vZmZzZXQgPSAwOyAvKiBPZmZzZXQgaW4gcmVzdWx0c19idWYgaW4gYnl0ZXMgKi8KKwl1MTYgaSwgajsKKworCSpudW1fZXJyb3JzID0gMDsKKwkqbnVtX3dhcm5pbmdzID0gMDsKKworCS8qIEdvIG92ZXIgZHVtcGVkIHJlc3VsdHMgKi8KKwlmb3IgKHJ1bGVfaWR4ID0gMDsgcnVsZV9pZHggPCBudW1fcnVsZXMgJiYgZHVtcF9idWYgPCBkdW1wX2J1Zl9lbmQ7CisJICAgICBydWxlX2lkeCsrKSB7CisJCWNvbnN0IHN0cnVjdCBkYmdfaWRsZV9jaGtfcnVsZV9wYXJzaW5nX2RhdGEgKnJ1bGVfcGFyc2luZ19kYXRhOworCQlzdHJ1Y3QgZGJnX2lkbGVfY2hrX3Jlc3VsdF9oZHIgKmhkcjsKKwkJY29uc3QgY2hhciAqcGFyc2luZ19zdHI7CisJCXUzMiBwYXJzaW5nX3N0cl9vZmZzZXQ7CisJCWNvbnN0IGNoYXIgKmxzaV9tc2c7CisJCXU4IGN1cnJfcmVnX2lkID0gMDsKKwkJYm9vbCBoYXNfZndfbXNnOworCisJCWhkciA9IChzdHJ1Y3QgZGJnX2lkbGVfY2hrX3Jlc3VsdF9oZHIgKilkdW1wX2J1ZjsKKwkJcnVsZV9wYXJzaW5nX2RhdGEgPQorCQkJKGNvbnN0IHN0cnVjdCBkYmdfaWRsZV9jaGtfcnVsZV9wYXJzaW5nX2RhdGEgKikKKwkJCSZzX2RiZ19hcnJheXNbQklOX0JVRl9EQkdfSURMRV9DSEtfUEFSU0lOR19EQVRBXS4KKwkJCXB0cltoZHItPnJ1bGVfaWRdOworCQlwYXJzaW5nX3N0cl9vZmZzZXQgPQorCQkJR0VUX0ZJRUxEKHJ1bGVfcGFyc2luZ19kYXRhLT5kYXRhLAorCQkJCSAgREJHX0lETEVfQ0hLX1JVTEVfUEFSU0lOR19EQVRBX1NUUl9PRkZTRVQpOworCQloYXNfZndfbXNnID0KKwkJCUdFVF9GSUVMRChydWxlX3BhcnNpbmdfZGF0YS0+ZGF0YSwKKwkJCQlEQkdfSURMRV9DSEtfUlVMRV9QQVJTSU5HX0RBVEFfSEFTX0ZXX01TRykgPiAwOworCQlwYXJzaW5nX3N0ciA9ICYoKGNvbnN0IGNoYXIgKikKKwkJCQlzX2RiZ19hcnJheXNbQklOX0JVRl9EQkdfUEFSU0lOR19TVFJJTkdTXS5wdHIpCisJCQkJW3BhcnNpbmdfc3RyX29mZnNldF07CisJCWxzaV9tc2cgPSBwYXJzaW5nX3N0cjsKKworCQlpZiAoaGRyLT5zZXZlcml0eSA+PSBNQVhfREJHX0lETEVfQ0hLX1NFVkVSSVRZX1RZUEVTKQorCQkJcmV0dXJuIDA7CisKKwkJLyogU2tpcCBydWxlIGhlYWRlciAqLworCQlkdW1wX2J1ZiArPSAoc2l6ZW9mKHN0cnVjdCBkYmdfaWRsZV9jaGtfcmVzdWx0X2hkcikgLyA0KTsKKworCQkvKiBVcGRhdGUgZXJyb3JzL3dhcm5pbmdzIGNvdW50ICovCisJCWlmIChoZHItPnNldmVyaXR5ID09IElETEVfQ0hLX1NFVkVSSVRZX0VSUk9SIHx8CisJCSAgICBoZHItPnNldmVyaXR5ID09IElETEVfQ0hLX1NFVkVSSVRZX0VSUk9SX05PX1RSQUZGSUMpCisJCQkoKm51bV9lcnJvcnMpKys7CisJCWVsc2UKKwkJCSgqbnVtX3dhcm5pbmdzKSsrOworCisJCS8qIFByaW50IHJ1bGUgc2V2ZXJpdHkgKi8KKwkJcmVzdWx0c19vZmZzZXQgKz0KKwkJICAgIHNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLAorCQkJCQkgICAgcmVzdWx0c19vZmZzZXQpLCAiJXM6ICIsCisJCQkgICAgc19pZGxlX2Noa19zZXZlcml0eV9zdHJbaGRyLT5zZXZlcml0eV0pOworCisJCS8qIFByaW50IHJ1bGUgbWVzc2FnZSAqLworCQlpZiAoaGFzX2Z3X21zZykKKwkJCXBhcnNpbmdfc3RyICs9IHN0cmxlbihwYXJzaW5nX3N0cikgKyAxOworCQlyZXN1bHRzX29mZnNldCArPQorCQkgICAgc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsCisJCQkJCSAgICByZXN1bHRzX29mZnNldCksICIlcy4iLAorCQkJICAgIGhhc19md19tc2cgJiYKKwkJCSAgICBwcmludF9md19pZGxlX2NoayA/IHBhcnNpbmdfc3RyIDogbHNpX21zZyk7CisJCXBhcnNpbmdfc3RyICs9IHN0cmxlbihwYXJzaW5nX3N0cikgKyAxOworCisJCS8qIFByaW50IHJlZ2lzdGVyIHZhbHVlcyAqLworCQlyZXN1bHRzX29mZnNldCArPQorCQkgICAgc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsCisJCQkJCSAgICByZXN1bHRzX29mZnNldCksICIgUmVnaXN0ZXJzOiIpOworCQlmb3IgKGkgPSAwOworCQkgICAgIGkgPCBoZHItPm51bV9kdW1wZWRfY29uZF9yZWdzICsgaGRyLT5udW1fZHVtcGVkX2luZm9fcmVnczsKKwkJICAgICBpKyspIHsKKwkJCXN0cnVjdCBkYmdfaWRsZV9jaGtfcmVzdWx0X3JlZ19oZHIgKnJlZ19oZHIKKwkJCSAgICA9IChzdHJ1Y3QgZGJnX2lkbGVfY2hrX3Jlc3VsdF9yZWdfaGRyICopCisJCQkgICAgZHVtcF9idWY7CisJCQlib29sIGlzX21lbSA9CisJCQkJR0VUX0ZJRUxEKHJlZ19oZHItPmRhdGEsCisJCQkJCSAgREJHX0lETEVfQ0hLX1JFU1VMVF9SRUdfSERSX0lTX01FTSk7CisJCQl1OCByZWdfaWQgPQorCQkJCUdFVF9GSUVMRChyZWdfaGRyLT5kYXRhLAorCQkJCQkgIERCR19JRExFX0NIS19SRVNVTFRfUkVHX0hEUl9SRUdfSUQpOworCisJCQkvKiBTa2lwIHJlZyBoZWFkZXIgKi8KKwkJCWR1bXBfYnVmICs9CisJCQkgICAgKHNpemVvZihzdHJ1Y3QgZGJnX2lkbGVfY2hrX3Jlc3VsdF9yZWdfaGRyKSAvIDQpOworCisJCQkvKiBTa2lwIHJlZ2lzdGVyIG5hbWVzIHVudGlsIHRoZSByZXF1aXJlZCByZWdfaWQgaXMKKwkJCSAqIHJlYWNoZWQuCisJCQkgKi8KKwkJCWZvciAoOyByZWdfaWQgPiBjdXJyX3JlZ19pZDsKKwkJCSAgICAgY3Vycl9yZWdfaWQrKywKKwkJCSAgICAgcGFyc2luZ19zdHIgKz0gc3RybGVuKHBhcnNpbmdfc3RyKSArIDEpOworCisJCQlyZXN1bHRzX29mZnNldCArPQorCQkJICAgIHNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLAorCQkJCQkJICAgIHJlc3VsdHNfb2Zmc2V0KSwgIiAlcyIsCisJCQkJICAgIHBhcnNpbmdfc3RyKTsKKwkJCWlmIChpIDwgaGRyLT5udW1fZHVtcGVkX2NvbmRfcmVncyAmJiBpc19tZW0pCisJCQkJcmVzdWx0c19vZmZzZXQgKz0KKwkJCQkgICAgc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsCisJCQkJCQkJICAgIHJlc3VsdHNfb2Zmc2V0KSwKKwkJCQkJICAgICJbJWRdIiwgaGRyLT5tZW1fZW50cnlfaWQgKworCQkJCQkgICAgcmVnX2hkci0+c3RhcnRfZW50cnkpOworCQkJcmVzdWx0c19vZmZzZXQgKz0KKwkJCSAgICBzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwKKwkJCQkJCSAgICByZXN1bHRzX29mZnNldCksICI9Iik7CisJCQlmb3IgKGogPSAwOyBqIDwgcmVnX2hkci0+c2l6ZTsgaisrLCBkdW1wX2J1ZisrKSB7CisJCQkJcmVzdWx0c19vZmZzZXQgKz0KKwkJCQkgICAgc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsCisJCQkJCQkJICAgIHJlc3VsdHNfb2Zmc2V0KSwKKwkJCQkJICAgICIweCV4IiwgKmR1bXBfYnVmKTsKKwkJCQlpZiAoaiA8IHJlZ19oZHItPnNpemUgLSAxKQorCQkJCQlyZXN1bHRzX29mZnNldCArPQorCQkJCQkgICAgc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIKKwkJCQkJCSAgICAocmVzdWx0c19idWYsCisJCQkJCQkgICAgIHJlc3VsdHNfb2Zmc2V0KSwgIiwiKTsKKwkJCX0KKwkJfQorCisJCXJlc3VsdHNfb2Zmc2V0ICs9CisJCSAgICBzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwgcmVzdWx0c19vZmZzZXQpLCAiXG4iKTsKKwl9CisKKwkvKiBDaGVjayBpZiBlbmQgb2YgZHVtcCBidWZmZXIgd2FzIGV4Y2VlZGVkICovCisJaWYgKGR1bXBfYnVmID4gZHVtcF9idWZfZW5kKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gcmVzdWx0c19vZmZzZXQ7Cit9CisKKy8qIFBhcnNlcyBhbiBpZGxlIGNoZWNrIGR1bXAgYnVmZmVyLgorICogSWYgcmVzdWx0X2J1ZiBpcyBub3QgTlVMTCwgdGhlIGlkbGUgY2hlY2sgcmVzdWx0cyBhcmUgcHJpbnRlZCB0byBpdC4KKyAqIEluIGFueSBjYXNlLCB0aGUgcmVxdWlyZWQgcmVzdWx0cyBidWZmZXIgc2l6ZSBpcyBhc3NpZ25lZCB0bworICogcGFyc2VkX3Jlc3VsdHNfYnl0ZXMuCisgKiBUaGUgcGFyc2luZyBzdGF0dXMgaXMgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBlbnVtIGRiZ19zdGF0dXMgcWVkX3BhcnNlX2lkbGVfY2hrX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgICAgICB1MzIgKmR1bXBfYnVmLAorCQkJCQkgICAgICAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkgICAgICAgY2hhciAqcmVzdWx0c19idWYsCisJCQkJCSAgICAgICB1MzIgKnBhcnNlZF9yZXN1bHRzX2J5dGVzLAorCQkJCQkgICAgICAgdTMyICpudW1fZXJyb3JzLAorCQkJCQkgICAgICAgdTMyICpudW1fd2FybmluZ3MpCit7CisJY29uc3QgY2hhciAqc2VjdGlvbl9uYW1lLCAqcGFyYW1fbmFtZSwgKnBhcmFtX3N0cl92YWw7CisJdTMyICpkdW1wX2J1Zl9lbmQgPSBkdW1wX2J1ZiArIG51bV9kdW1wZWRfZHdvcmRzOworCXUzMiBudW1fc2VjdGlvbl9wYXJhbXMgPSAwLCBudW1fcnVsZXM7CisJdTMyIHJlc3VsdHNfb2Zmc2V0ID0gMDsJLyogT2Zmc2V0IGluIHJlc3VsdHNfYnVmIGluIGJ5dGVzICovCisKKwkqcGFyc2VkX3Jlc3VsdHNfYnl0ZXMgPSAwOworCSpudW1fZXJyb3JzID0gMDsKKwkqbnVtX3dhcm5pbmdzID0gMDsKKwlpZiAoIXNfZGJnX2FycmF5c1tCSU5fQlVGX0RCR19QQVJTSU5HX1NUUklOR1NdLnB0ciB8fAorCSAgICAhc19kYmdfYXJyYXlzW0JJTl9CVUZfREJHX0lETEVfQ0hLX1BBUlNJTkdfREFUQV0ucHRyKQorCQlyZXR1cm4gREJHX1NUQVRVU19EQkdfQVJSQVlfTk9UX1NFVDsKKworCS8qIFJlYWQgZ2xvYmFsX3BhcmFtcyBzZWN0aW9uICovCisJZHVtcF9idWYgKz0gcWVkX3JlYWRfc2VjdGlvbl9oZHIoZHVtcF9idWYsCisJCQkJCSAmc2VjdGlvbl9uYW1lLCAmbnVtX3NlY3Rpb25fcGFyYW1zKTsKKwlpZiAoc3RyY21wKHNlY3Rpb25fbmFtZSwgImdsb2JhbF9wYXJhbXMiKSkKKwkJcmV0dXJuIERCR19TVEFUVVNfSURMRV9DSEtfUEFSU0VfRkFJTEVEOworCisJLyogUHJpbnQgZ2xvYmFsIHBhcmFtcyAqLworCWR1bXBfYnVmICs9IHFlZF9wcmludF9zZWN0aW9uX3BhcmFtcyhkdW1wX2J1ZiwKKwkJCQkJICAgICBudW1fc2VjdGlvbl9wYXJhbXMsCisJCQkJCSAgICAgcmVzdWx0c19idWYsICZyZXN1bHRzX29mZnNldCk7CisKKwkvKiBSZWFkIGlkbGVfY2hrIHNlY3Rpb24gKi8KKwlkdW1wX2J1ZiArPSBxZWRfcmVhZF9zZWN0aW9uX2hkcihkdW1wX2J1ZiwKKwkJCQkJICZzZWN0aW9uX25hbWUsICZudW1fc2VjdGlvbl9wYXJhbXMpOworCWlmIChzdHJjbXAoc2VjdGlvbl9uYW1lLCAiaWRsZV9jaGsiKSB8fCBudW1fc2VjdGlvbl9wYXJhbXMgIT0gMSkKKwkJcmV0dXJuIERCR19TVEFUVVNfSURMRV9DSEtfUEFSU0VfRkFJTEVEOworCisJZHVtcF9idWYgKz0gcWVkX3JlYWRfcGFyYW0oZHVtcF9idWYsCisJCQkJICAgJnBhcmFtX25hbWUsICZwYXJhbV9zdHJfdmFsLCAmbnVtX3J1bGVzKTsKKwlpZiAoc3RyY21wKHBhcmFtX25hbWUsICJudW1fcnVsZXMiKSAhPSAwKQorCQlyZXR1cm4gREJHX1NUQVRVU19JRExFX0NIS19QQVJTRV9GQUlMRUQ7CisKKwlpZiAobnVtX3J1bGVzKSB7CisJCXUzMiBydWxlc19wcmludF9zaXplOworCisJCS8qIFByaW50IEZXIG91dHB1dCAqLworCQlyZXN1bHRzX29mZnNldCArPQorCQkgICAgc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsCisJCQkJCSAgICByZXN1bHRzX29mZnNldCksCisJCQkgICAgIkZXX0lETEVfQ0hFQ0s6XG4iKTsKKwkJcnVsZXNfcHJpbnRfc2l6ZSA9CisJCQlxZWRfcGFyc2VfaWRsZV9jaGtfZHVtcF9ydWxlcyhwX2h3Zm4sIGR1bXBfYnVmLAorCQkJCQkJICAgICAgZHVtcF9idWZfZW5kLCBudW1fcnVsZXMsCisJCQkJCQkgICAgICB0cnVlLAorCQkJCQkJICAgICAgcmVzdWx0c19idWYgPworCQkJCQkJICAgICAgcmVzdWx0c19idWYgKworCQkJCQkJICAgICAgcmVzdWx0c19vZmZzZXQgOiBOVUxMLAorCQkJCQkJICAgICAgbnVtX2Vycm9ycywgbnVtX3dhcm5pbmdzKTsKKwkJcmVzdWx0c19vZmZzZXQgKz0gcnVsZXNfcHJpbnRfc2l6ZTsKKwkJaWYgKHJ1bGVzX3ByaW50X3NpemUgPT0gMCkKKwkJCXJldHVybiBEQkdfU1RBVFVTX0lETEVfQ0hLX1BBUlNFX0ZBSUxFRDsKKworCQkvKiBQcmludCBMU0kgb3V0cHV0ICovCisJCXJlc3VsdHNfb2Zmc2V0ICs9CisJCSAgICBzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwKKwkJCQkJICAgIHJlc3VsdHNfb2Zmc2V0KSwKKwkJCSAgICAiXG5MU0lfSURMRV9DSEVDSzpcbiIpOworCQlydWxlc19wcmludF9zaXplID0KKwkJCXFlZF9wYXJzZV9pZGxlX2Noa19kdW1wX3J1bGVzKHBfaHdmbiwgZHVtcF9idWYsCisJCQkJCQkgICAgICBkdW1wX2J1Zl9lbmQsIG51bV9ydWxlcywKKwkJCQkJCSAgICAgIGZhbHNlLAorCQkJCQkJICAgICAgcmVzdWx0c19idWYgPworCQkJCQkJICAgICAgcmVzdWx0c19idWYgKworCQkJCQkJICAgICAgcmVzdWx0c19vZmZzZXQgOiBOVUxMLAorCQkJCQkJICAgICAgbnVtX2Vycm9ycywgbnVtX3dhcm5pbmdzKTsKKwkJcmVzdWx0c19vZmZzZXQgKz0gcnVsZXNfcHJpbnRfc2l6ZTsKKwkJaWYgKHJ1bGVzX3ByaW50X3NpemUgPT0gMCkKKwkJCXJldHVybiBEQkdfU1RBVFVTX0lETEVfQ0hLX1BBUlNFX0ZBSUxFRDsKKwl9CisKKwkvKiBQcmludCBlcnJvcnMvd2FybmluZ3MgY291bnQgKi8KKwlpZiAoKm51bV9lcnJvcnMpIHsKKwkJcmVzdWx0c19vZmZzZXQgKz0KKwkJICAgIHNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLAorCQkJCQkgICAgcmVzdWx0c19vZmZzZXQpLAorCQkJICAgICJcbklkbGUgQ2hlY2sgZmFpbGVkISEhICh3aXRoICVkIGVycm9ycyBhbmQgJWQgd2FybmluZ3MpXG4iLAorCQkJICAgICpudW1fZXJyb3JzLCAqbnVtX3dhcm5pbmdzKTsKKwl9IGVsc2UgaWYgKCpudW1fd2FybmluZ3MpIHsKKwkJcmVzdWx0c19vZmZzZXQgKz0KKwkJICAgIHNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLAorCQkJCQkgICAgcmVzdWx0c19vZmZzZXQpLAorCQkJICAgICJcbklkbGUgQ2hlY2sgY29tcGxldGVkIHN1Y2Nlc3NmdWx5ICh3aXRoICVkIHdhcm5pbmdzKVxuIiwKKwkJCSAgICAqbnVtX3dhcm5pbmdzKTsKKwl9IGVsc2UgeworCQlyZXN1bHRzX29mZnNldCArPQorCQkgICAgc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsCisJCQkJCSAgICByZXN1bHRzX29mZnNldCksCisJCQkgICAgIlxuSWRsZSBDaGVjayBjb21wbGV0ZWQgc3VjY2Vzc2Z1bHlcbiIpOworCX0KKworCS8qIEFkZCAxIGZvciBzdHJpbmcgTlVMTCB0ZXJtaW5hdGlvbiAqLworCSpwYXJzZWRfcmVzdWx0c19ieXRlcyA9IHJlc3VsdHNfb2Zmc2V0ICsgMTsKKwlyZXR1cm4gREJHX1NUQVRVU19PSzsKK30KKworZW51bSBkYmdfc3RhdHVzIHFlZF9nZXRfaWRsZV9jaGtfcmVzdWx0c19idWZfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJCSAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkJICB1MzIgKnJlc3VsdHNfYnVmX3NpemUpCit7CisJdTMyIG51bV9lcnJvcnMsIG51bV93YXJuaW5nczsKKworCXJldHVybiBxZWRfcGFyc2VfaWRsZV9jaGtfZHVtcChwX2h3Zm4sCisJCQkJICAgICAgIGR1bXBfYnVmLAorCQkJCSAgICAgICBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkgICAgICAgTlVMTCwKKwkJCQkgICAgICAgcmVzdWx0c19idWZfc2l6ZSwKKwkJCQkgICAgICAgJm51bV9lcnJvcnMsICZudW1fd2FybmluZ3MpOworfQorCitlbnVtIGRiZ19zdGF0dXMgcWVkX3ByaW50X2lkbGVfY2hrX3Jlc3VsdHMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgIHUzMiAqZHVtcF9idWYsCisJCQkJCSAgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJICAgY2hhciAqcmVzdWx0c19idWYsCisJCQkJCSAgIHUzMiAqbnVtX2Vycm9ycywgdTMyICpudW1fd2FybmluZ3MpCit7CisJdTMyIHBhcnNlZF9idWZfc2l6ZTsKKworCXJldHVybiBxZWRfcGFyc2VfaWRsZV9jaGtfZHVtcChwX2h3Zm4sCisJCQkJICAgICAgIGR1bXBfYnVmLAorCQkJCSAgICAgICBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkgICAgICAgcmVzdWx0c19idWYsCisJCQkJICAgICAgICZwYXJzZWRfYnVmX3NpemUsCisJCQkJICAgICAgIG51bV9lcnJvcnMsIG51bV93YXJuaW5ncyk7Cit9CisKKy8qIEZyZWVzIHRoZSBzcGVjaWZpZWQgTUNQIFRyYWNlIG1ldGEgZGF0YSAqLworc3RhdGljIHZvaWQgcWVkX21jcF90cmFjZV9mcmVlX21ldGEoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgIHN0cnVjdCBtY3BfdHJhY2VfbWV0YSAqbWV0YSkKK3sKKwl1MzIgaTsKKworCS8qIFJlbGVhc2UgbW9kdWxlcyAqLworCWlmIChtZXRhLT5tb2R1bGVzKSB7CisJCWZvciAoaSA9IDA7IGkgPCBtZXRhLT5tb2R1bGVzX251bTsgaSsrKQorCQkJa2ZyZWUobWV0YS0+bW9kdWxlc1tpXSk7CisJCWtmcmVlKG1ldGEtPm1vZHVsZXMpOworCX0KKworCS8qIFJlbGVhc2UgZm9ybWF0cyAqLworCWlmIChtZXRhLT5mb3JtYXRzKSB7CisJCWZvciAoaSA9IDA7IGkgPCBtZXRhLT5mb3JtYXRzX251bTsgaSsrKQorCQkJa2ZyZWUobWV0YS0+Zm9ybWF0c1tpXS5mb3JtYXRfc3RyKTsKKwkJa2ZyZWUobWV0YS0+Zm9ybWF0cyk7CisJfQorfQorCisvKiBBbGxvY2F0ZXMgYW5kIGZpbGxzIE1DUCBUcmFjZSBtZXRhIGRhdGEgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBtZXRhIGRhdGEKKyAqIGR1bXAgYnVmZmVyLgorICogUmV0dXJucyBkZWJ1ZyBzdGF0dXMgY29kZS4KKyAqLworc3RhdGljIGVudW0gZGJnX3N0YXR1cyBxZWRfbWNwX3RyYWNlX2FsbG9jX21ldGEoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQljb25zdCB1MzIgKm1ldGFfYnVmLAorCQkJCQkJc3RydWN0IG1jcF90cmFjZV9tZXRhICptZXRhKQoreworCXU4ICptZXRhX2J1Zl9ieXRlcyA9ICh1OCAqKW1ldGFfYnVmOworCXUzMiBvZmZzZXQgPSAwLCBzaWduYXR1cmUsIGk7CisKKwltZW1zZXQobWV0YSwgMCwgc2l6ZW9mKCptZXRhKSk7CisKKwkvKiBSZWFkIGZpcnN0IHNpZ25hdHVyZSAqLworCXNpZ25hdHVyZSA9IHFlZF9yZWFkX2R3b3JkX2Zyb21fYnVmKG1ldGFfYnVmX2J5dGVzLCAmb2Zmc2V0KTsKKwlpZiAoc2lnbmF0dXJlICE9IE1DUF9UUkFDRV9NRVRBX0lNQUdFX1NJR05BVFVSRSkKKwkJcmV0dXJuIERCR19TVEFUVVNfSU5WQUxJRF9UUkFDRV9TSUdOQVRVUkU7CisKKwkvKiBSZWFkIG51bWJlciBvZiBtb2R1bGVzIGFuZCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCB0aGUgbW9kdWxlcworCSAqIHBvaW50ZXJzLgorCSAqLworCW1ldGEtPm1vZHVsZXNfbnVtID0gcWVkX3JlYWRfYnl0ZV9mcm9tX2J1ZihtZXRhX2J1Zl9ieXRlcywgJm9mZnNldCk7CisJbWV0YS0+bW9kdWxlcyA9IGt6YWxsb2MobWV0YS0+bW9kdWxlc19udW0gKiBzaXplb2YoY2hhciAqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtZXRhLT5tb2R1bGVzKQorCQlyZXR1cm4gREJHX1NUQVRVU19WSVJUX01FTV9BTExPQ19GQUlMRUQ7CisKKwkvKiBBbGxvY2F0ZSBhbmQgcmVhZCBhbGwgbW9kdWxlIHN0cmluZ3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbWV0YS0+bW9kdWxlc19udW07IGkrKykgeworCQl1OCBtb2R1bGVfbGVuID0gcWVkX3JlYWRfYnl0ZV9mcm9tX2J1ZihtZXRhX2J1Zl9ieXRlcywgJm9mZnNldCk7CisKKwkJKihtZXRhLT5tb2R1bGVzICsgaSkgPSBremFsbG9jKG1vZHVsZV9sZW4sIEdGUF9LRVJORUwpOworCQlpZiAoISgqKG1ldGEtPm1vZHVsZXMgKyBpKSkpIHsKKwkJCS8qIFVwZGF0ZSBudW1iZXIgb2YgbW9kdWxlcyB0byBiZSByZWxlYXNlZCAqLworCQkJbWV0YS0+bW9kdWxlc19udW0gPSBpID8gaSAtIDEgOiAwOworCQkJcmV0dXJuIERCR19TVEFUVVNfVklSVF9NRU1fQUxMT0NfRkFJTEVEOworCQl9CisKKwkJcWVkX3JlYWRfc3RyX2Zyb21fYnVmKG1ldGFfYnVmX2J5dGVzLCAmb2Zmc2V0LCBtb2R1bGVfbGVuLAorCQkJCSAgICAgICoobWV0YS0+bW9kdWxlcyArIGkpKTsKKwkJaWYgKG1vZHVsZV9sZW4gPiBNQ1BfVFJBQ0VfTUFYX01PRFVMRV9MRU4pCisJCQkoKihtZXRhLT5tb2R1bGVzICsgaSkpW01DUF9UUkFDRV9NQVhfTU9EVUxFX0xFTl0gPSAnXDAnOworCX0KKworCS8qIFJlYWQgc2Vjb25kIHNpZ25hdHVyZSAqLworCXNpZ25hdHVyZSA9IHFlZF9yZWFkX2R3b3JkX2Zyb21fYnVmKG1ldGFfYnVmX2J5dGVzLCAmb2Zmc2V0KTsKKwlpZiAoc2lnbmF0dXJlICE9IE1DUF9UUkFDRV9NRVRBX0lNQUdFX1NJR05BVFVSRSkKKwkJcmV0dXJuIERCR19TVEFUVVNfSU5WQUxJRF9UUkFDRV9TSUdOQVRVUkU7CisKKwkvKiBSZWFkIG51bWJlciBvZiBmb3JtYXRzIGFuZCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBmb3JtYXRzICovCisJbWV0YS0+Zm9ybWF0c19udW0gPSBxZWRfcmVhZF9kd29yZF9mcm9tX2J1ZihtZXRhX2J1Zl9ieXRlcywgJm9mZnNldCk7CisJbWV0YS0+Zm9ybWF0cyA9IGt6YWxsb2MobWV0YS0+Zm9ybWF0c19udW0gKgorCQkJCXNpemVvZihzdHJ1Y3QgbWNwX3RyYWNlX2Zvcm1hdCksCisJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFtZXRhLT5mb3JtYXRzKQorCQlyZXR1cm4gREJHX1NUQVRVU19WSVJUX01FTV9BTExPQ19GQUlMRUQ7CisKKwkvKiBBbGxvY2F0ZSBhbmQgcmVhZCBhbGwgc3RyaW5ncyAqLworCWZvciAoaSA9IDA7IGkgPCBtZXRhLT5mb3JtYXRzX251bTsgaSsrKSB7CisJCXN0cnVjdCBtY3BfdHJhY2VfZm9ybWF0ICpmb3JtYXRfcHRyID0gJm1ldGEtPmZvcm1hdHNbaV07CisJCXU4IGZvcm1hdF9sZW47CisKKwkJZm9ybWF0X3B0ci0+ZGF0YSA9IHFlZF9yZWFkX2R3b3JkX2Zyb21fYnVmKG1ldGFfYnVmX2J5dGVzLAorCQkJCQkJCSAgICZvZmZzZXQpOworCQlmb3JtYXRfbGVuID0KKwkJICAgIChmb3JtYXRfcHRyLT5kYXRhICYKKwkJICAgICBNQ1BfVFJBQ0VfRk9STUFUX0xFTl9NQVNLKSA+PiBNQ1BfVFJBQ0VfRk9STUFUX0xFTl9TSElGVDsKKwkJZm9ybWF0X3B0ci0+Zm9ybWF0X3N0ciA9IGt6YWxsb2MoZm9ybWF0X2xlbiwgR0ZQX0tFUk5FTCk7CisJCWlmICghZm9ybWF0X3B0ci0+Zm9ybWF0X3N0cikgeworCQkJLyogVXBkYXRlIG51bWJlciBvZiBtb2R1bGVzIHRvIGJlIHJlbGVhc2VkICovCisJCQltZXRhLT5mb3JtYXRzX251bSA9IGkgPyBpIC0gMSA6IDA7CisJCQlyZXR1cm4gREJHX1NUQVRVU19WSVJUX01FTV9BTExPQ19GQUlMRUQ7CisJCX0KKworCQlxZWRfcmVhZF9zdHJfZnJvbV9idWYobWV0YV9idWZfYnl0ZXMsCisJCQkJICAgICAgJm9mZnNldCwKKwkJCQkgICAgICBmb3JtYXRfbGVuLCBmb3JtYXRfcHRyLT5mb3JtYXRfc3RyKTsKKwl9CisKKwlyZXR1cm4gREJHX1NUQVRVU19PSzsKK30KKworLyogUGFyc2VzIGFuIE1DUCBUcmFjZSBkdW1wIGJ1ZmZlci4KKyAqIElmIHJlc3VsdF9idWYgaXMgbm90IE5VTEwsIHRoZSBNQ1AgVHJhY2UgcmVzdWx0cyBhcmUgcHJpbnRlZCB0byBpdC4KKyAqIEluIGFueSBjYXNlLCB0aGUgcmVxdWlyZWQgcmVzdWx0cyBidWZmZXIgc2l6ZSBpcyBhc3NpZ25lZCB0bworICogcGFyc2VkX3Jlc3VsdHNfYnl0ZXMuCisgKiBUaGUgcGFyc2luZyBzdGF0dXMgaXMgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBlbnVtIGRiZ19zdGF0dXMgcWVkX3BhcnNlX21jcF90cmFjZV9kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJdTMyICpkdW1wX2J1ZiwKKwkJCQkJCXUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJCWNoYXIgKnJlc3VsdHNfYnVmLAorCQkJCQkJdTMyICpwYXJzZWRfcmVzdWx0c19ieXRlcykKK3sKKwl1MzIgcmVzdWx0c19vZmZzZXQgPSAwLCBwYXJhbV9tYXNrLCBwYXJhbV9zaGlmdCwgcGFyYW1fbnVtX3ZhbDsKKwl1MzIgbnVtX3NlY3Rpb25fcGFyYW1zLCBvZmZzZXQsIGVuZF9vZmZzZXQsIGJ5dGVzX2xlZnQ7CisJY29uc3QgY2hhciAqc2VjdGlvbl9uYW1lLCAqcGFyYW1fbmFtZSwgKnBhcmFtX3N0cl92YWw7CisJdTMyIHRyYWNlX2RhdGFfZHdvcmRzLCB0cmFjZV9tZXRhX2R3b3JkczsKKwlzdHJ1Y3QgbWNwX3RyYWNlX21ldGEgbWV0YTsKKwlzdHJ1Y3QgbWNwX3RyYWNlICp0cmFjZTsKKwllbnVtIGRiZ19zdGF0dXMgc3RhdHVzOworCWNvbnN0IHUzMiAqbWV0YV9idWY7CisJdTggKnRyYWNlX2J1ZjsKKworCSpwYXJzZWRfcmVzdWx0c19ieXRlcyA9IDA7CisKKwkvKiBSZWFkIGdsb2JhbF9wYXJhbXMgc2VjdGlvbiAqLworCWR1bXBfYnVmICs9IHFlZF9yZWFkX3NlY3Rpb25faGRyKGR1bXBfYnVmLAorCQkJCQkgJnNlY3Rpb25fbmFtZSwgJm51bV9zZWN0aW9uX3BhcmFtcyk7CisJaWYgKHN0cmNtcChzZWN0aW9uX25hbWUsICJnbG9iYWxfcGFyYW1zIikpCisJCXJldHVybiBEQkdfU1RBVFVTX01DUF9UUkFDRV9CQURfREFUQTsKKworCS8qIFByaW50IGdsb2JhbCBwYXJhbXMgKi8KKwlkdW1wX2J1ZiArPSBxZWRfcHJpbnRfc2VjdGlvbl9wYXJhbXMoZHVtcF9idWYsCisJCQkJCSAgICAgbnVtX3NlY3Rpb25fcGFyYW1zLAorCQkJCQkgICAgIHJlc3VsdHNfYnVmLCAmcmVzdWx0c19vZmZzZXQpOworCisJLyogUmVhZCB0cmFjZV9kYXRhIHNlY3Rpb24gKi8KKwlkdW1wX2J1ZiArPSBxZWRfcmVhZF9zZWN0aW9uX2hkcihkdW1wX2J1ZiwKKwkJCQkJICZzZWN0aW9uX25hbWUsICZudW1fc2VjdGlvbl9wYXJhbXMpOworCWlmIChzdHJjbXAoc2VjdGlvbl9uYW1lLCAibWNwX3RyYWNlX2RhdGEiKSB8fCBudW1fc2VjdGlvbl9wYXJhbXMgIT0gMSkKKwkJcmV0dXJuIERCR19TVEFUVVNfTUNQX1RSQUNFX0JBRF9EQVRBOworCWR1bXBfYnVmICs9IHFlZF9yZWFkX3BhcmFtKGR1bXBfYnVmLAorCQkJCSAgICZwYXJhbV9uYW1lLCAmcGFyYW1fc3RyX3ZhbCwgJnBhcmFtX251bV92YWwpOworCWlmIChzdHJjbXAocGFyYW1fbmFtZSwgInNpemUiKSkKKwkJcmV0dXJuIERCR19TVEFUVVNfTUNQX1RSQUNFX0JBRF9EQVRBOworCXRyYWNlX2RhdGFfZHdvcmRzID0gcGFyYW1fbnVtX3ZhbDsKKworCS8qIFByZXBhcmUgdHJhY2UgaW5mbyAqLworCXRyYWNlID0gKHN0cnVjdCBtY3BfdHJhY2UgKilkdW1wX2J1ZjsKKwl0cmFjZV9idWYgPSAodTggKilkdW1wX2J1ZiArIHNpemVvZihzdHJ1Y3QgbWNwX3RyYWNlKTsKKwlvZmZzZXQgPSB0cmFjZS0+dHJhY2Vfb2xkZXN0OworCWVuZF9vZmZzZXQgPSB0cmFjZS0+dHJhY2VfcHJvZDsKKwlieXRlc19sZWZ0ID0gcWVkX2N5Y2xpY19zdWIoZW5kX29mZnNldCwgb2Zmc2V0LCB0cmFjZS0+c2l6ZSk7CisJZHVtcF9idWYgKz0gdHJhY2VfZGF0YV9kd29yZHM7CisKKwkvKiBSZWFkIG1ldGFfZGF0YSBzZWN0aW9uICovCisJZHVtcF9idWYgKz0gcWVkX3JlYWRfc2VjdGlvbl9oZHIoZHVtcF9idWYsCisJCQkJCSAmc2VjdGlvbl9uYW1lLCAmbnVtX3NlY3Rpb25fcGFyYW1zKTsKKwlpZiAoc3RyY21wKHNlY3Rpb25fbmFtZSwgIm1jcF90cmFjZV9tZXRhIikpCisJCXJldHVybiBEQkdfU1RBVFVTX01DUF9UUkFDRV9CQURfREFUQTsKKwlkdW1wX2J1ZiArPSBxZWRfcmVhZF9wYXJhbShkdW1wX2J1ZiwKKwkJCQkgICAmcGFyYW1fbmFtZSwgJnBhcmFtX3N0cl92YWwsICZwYXJhbV9udW1fdmFsKTsKKwlpZiAoc3RyY21wKHBhcmFtX25hbWUsICJzaXplIikgIT0gMCkKKwkJcmV0dXJuIERCR19TVEFUVVNfTUNQX1RSQUNFX0JBRF9EQVRBOworCXRyYWNlX21ldGFfZHdvcmRzID0gcGFyYW1fbnVtX3ZhbDsKKworCS8qIENob29zZSBtZXRhIGRhdGEgYnVmZmVyICovCisJaWYgKCF0cmFjZV9tZXRhX2R3b3JkcykgeworCQkvKiBEdW1wIGRvZXNuJ3QgaW5jbHVkZSBtZXRhIGRhdGEgKi8KKwkJaWYgKCFzX21jcF90cmFjZV9tZXRhLnB0cikKKwkJCXJldHVybiBEQkdfU1RBVFVTX01DUF9UUkFDRV9OT19NRVRBOworCQltZXRhX2J1ZiA9IHNfbWNwX3RyYWNlX21ldGEucHRyOworCX0gZWxzZSB7CisJCS8qIER1bXAgaW5jbHVkZXMgbWV0YSBkYXRhICovCisJCW1ldGFfYnVmID0gZHVtcF9idWY7CisJfQorCisJLyogQWxsb2NhdGUgbWV0YSBkYXRhIG1lbW9yeSAqLworCXN0YXR1cyA9IHFlZF9tY3BfdHJhY2VfYWxsb2NfbWV0YShwX2h3Zm4sIG1ldGFfYnVmLCAmbWV0YSk7CisJaWYgKHN0YXR1cyAhPSBEQkdfU1RBVFVTX09LKQorCQlnb3RvIGZyZWVfbWVtOworCisJLyogSWdub3JlIHRoZSBsZXZlbCBhbmQgbW9kdWxlcyBtYXNrcyAtIGp1c3QgcHJpbnQgZXZlcnl0aGluZyB0aGF0IGlzCisJICogYWxyZWFkeSBpbiB0aGUgYnVmZmVyLgorCSAqLworCXdoaWxlIChieXRlc19sZWZ0KSB7CisJCXN0cnVjdCBtY3BfdHJhY2VfZm9ybWF0ICpmb3JtYXRfcHRyOworCQl1OCBmb3JtYXRfbGV2ZWwsIGZvcm1hdF9tb2R1bGU7CisJCXUzMiBwYXJhbXNbM10gPSB7IDAsIDAsIDAgfTsKKwkJdTMyIGhlYWRlciwgZm9ybWF0X2lkeCwgaTsKKworCQlpZiAoYnl0ZXNfbGVmdCA8IE1GV19UUkFDRV9FTlRSWV9TSVpFKSB7CisJCQlzdGF0dXMgPSBEQkdfU1RBVFVTX01DUF9UUkFDRV9CQURfREFUQTsKKwkJCWdvdG8gZnJlZV9tZW07CisJCX0KKworCQloZWFkZXIgPSBxZWRfcmVhZF9mcm9tX2N5Y2xpY19idWYodHJhY2VfYnVmLAorCQkJCQkJICAmb2Zmc2V0LAorCQkJCQkJICB0cmFjZS0+c2l6ZSwKKwkJCQkJCSAgTUZXX1RSQUNFX0VOVFJZX1NJWkUpOworCQlieXRlc19sZWZ0IC09IE1GV19UUkFDRV9FTlRSWV9TSVpFOworCQlmb3JtYXRfaWR4ID0gaGVhZGVyICYgTUZXX1RSQUNFX0VWRU5USURfTUFTSzsKKworCQkvKiBTa2lwIG1lc3NhZ2UgaWYgaXRzICBpbmRleCBkb2Vzbid0IGV4aXN0IGluIHRoZSBtZXRhIGRhdGEgKi8KKwkJaWYgKGZvcm1hdF9pZHggPiBtZXRhLmZvcm1hdHNfbnVtKSB7CisJCQl1OCBmb3JtYXRfc2l6ZSA9CisJCQkgICAgKHU4KSgoaGVhZGVyICYKKwkJCQkgIE1GV19UUkFDRV9QUk1fU0laRV9NQVNLKSA+PgorCQkJCSBNRldfVFJBQ0VfUFJNX1NJWkVfU0hJRlQpOworCisJCQlpZiAoYnl0ZXNfbGVmdCA8IGZvcm1hdF9zaXplKSB7CisJCQkJc3RhdHVzID0gREJHX1NUQVRVU19NQ1BfVFJBQ0VfQkFEX0RBVEE7CisJCQkJZ290byBmcmVlX21lbTsKKwkJCX0KKworCQkJb2Zmc2V0ID0gcWVkX2N5Y2xpY19hZGQob2Zmc2V0LAorCQkJCQkJZm9ybWF0X3NpemUsIHRyYWNlLT5zaXplKTsKKwkJCWJ5dGVzX2xlZnQgLT0gZm9ybWF0X3NpemU7CisJCQljb250aW51ZTsKKwkJfQorCisJCWZvcm1hdF9wdHIgPSAmbWV0YS5mb3JtYXRzW2Zvcm1hdF9pZHhdOworCQlmb3IgKGkgPSAwLAorCQkgICAgIHBhcmFtX21hc2sgPSBNQ1BfVFJBQ0VfRk9STUFUX1AxX1NJWkVfTUFTSywgcGFyYW1fc2hpZnQgPQorCQkgICAgIE1DUF9UUkFDRV9GT1JNQVRfUDFfU0laRV9TSElGVDsKKwkJICAgICBpIDwgTUNQX1RSQUNFX0ZPUk1BVF9NQVhfUEFSQU1TOworCQkgICAgIGkrKywgcGFyYW1fbWFzayA8PD0gTUNQX1RSQUNFX0ZPUk1BVF9QQVJBTV9XSURUSCwKKwkJICAgICBwYXJhbV9zaGlmdCArPSBNQ1BfVFJBQ0VfRk9STUFUX1BBUkFNX1dJRFRIKSB7CisJCQkvKiBFeHRyYWN0IHBhcmFtIHNpemUgKDAuLjMpICovCisJCQl1OCBwYXJhbV9zaXplID0KKwkJCSAgICAodTgpKChmb3JtYXRfcHRyLT5kYXRhICYKKwkJCQkgIHBhcmFtX21hc2spID4+IHBhcmFtX3NoaWZ0KTsKKworCQkJLyogSWYgdGhlIHBhcmFtIHNpemUgaXMgemVybywgdGhlcmUgYXJlIG5vIG90aGVyCisJCQkgKiBwYXJhbWV0ZXJzLgorCQkJICovCisJCQlpZiAoIXBhcmFtX3NpemUpCisJCQkJYnJlYWs7CisKKwkJCS8qIFNpemUgaXMgZW5jb2RlZCB1c2luZyAyIGJpdHMsIHdoZXJlIDMgaXMgdXNlZCB0bworCQkJICogZW5jb2RlIDQuCisJCQkgKi8KKwkJCWlmIChwYXJhbV9zaXplID09IDMpCisJCQkJcGFyYW1fc2l6ZSA9IDQ7CisJCQlpZiAoYnl0ZXNfbGVmdCA8IHBhcmFtX3NpemUpIHsKKwkJCQlzdGF0dXMgPSBEQkdfU1RBVFVTX01DUF9UUkFDRV9CQURfREFUQTsKKwkJCQlnb3RvIGZyZWVfbWVtOworCQkJfQorCisJCQlwYXJhbXNbaV0gPSBxZWRfcmVhZF9mcm9tX2N5Y2xpY19idWYodHJhY2VfYnVmLAorCQkJCQkJCSAgICAgJm9mZnNldCwKKwkJCQkJCQkgICAgIHRyYWNlLT5zaXplLAorCQkJCQkJCSAgICAgcGFyYW1fc2l6ZSk7CisJCQlieXRlc19sZWZ0IC09IHBhcmFtX3NpemU7CisJCX0KKworCQlmb3JtYXRfbGV2ZWwgPQorCQkgICAgKHU4KSgoZm9ybWF0X3B0ci0+ZGF0YSAmCisJCQkgIE1DUF9UUkFDRV9GT1JNQVRfTEVWRUxfTUFTSykgPj4KKwkJCSAgTUNQX1RSQUNFX0ZPUk1BVF9MRVZFTF9TSElGVCk7CisJCWZvcm1hdF9tb2R1bGUgPQorCQkgICAgKHU4KSgoZm9ybWF0X3B0ci0+ZGF0YSAmCisJCQkgIE1DUF9UUkFDRV9GT1JNQVRfTU9EVUxFX01BU0spID4+CisJCQkgTUNQX1RSQUNFX0ZPUk1BVF9NT0RVTEVfU0hJRlQpOworCQlpZiAoZm9ybWF0X2xldmVsID49IEFSUkFZX1NJWkUoc19tY3BfdHJhY2VfbGV2ZWxfc3RyKSkgeworCQkJc3RhdHVzID0gREJHX1NUQVRVU19NQ1BfVFJBQ0VfQkFEX0RBVEE7CisJCQlnb3RvIGZyZWVfbWVtOworCQl9CisKKwkJLyogUHJpbnQgY3VycmVudCBtZXNzYWdlIHRvIHJlc3VsdHMgYnVmZmVyICovCisJCXJlc3VsdHNfb2Zmc2V0ICs9CisJCSAgICBzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwKKwkJCQkJICAgIHJlc3VsdHNfb2Zmc2V0KSwgIiVzICUtOHM6ICIsCisJCQkgICAgc19tY3BfdHJhY2VfbGV2ZWxfc3RyW2Zvcm1hdF9sZXZlbF0sCisJCQkgICAgbWV0YS5tb2R1bGVzW2Zvcm1hdF9tb2R1bGVdKTsKKwkJcmVzdWx0c19vZmZzZXQgKz0KKwkJICAgIHNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLAorCQkJCQkgICAgcmVzdWx0c19vZmZzZXQpLAorCQkJICAgIGZvcm1hdF9wdHItPmZvcm1hdF9zdHIsIHBhcmFtc1swXSwgcGFyYW1zWzFdLAorCQkJICAgIHBhcmFtc1syXSk7CisJfQorCitmcmVlX21lbToKKwkqcGFyc2VkX3Jlc3VsdHNfYnl0ZXMgPSByZXN1bHRzX29mZnNldCArIDE7CisJcWVkX21jcF90cmFjZV9mcmVlX21ldGEocF9od2ZuLCAmbWV0YSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworZW51bSBkYmdfc3RhdHVzIHFlZF9nZXRfbWNwX3RyYWNlX3Jlc3VsdHNfYnVmX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgICB1MzIgKmR1bXBfYnVmLAorCQkJCQkJICAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkJICAgdTMyICpyZXN1bHRzX2J1Zl9zaXplKQoreworCXJldHVybiBxZWRfcGFyc2VfbWNwX3RyYWNlX2R1bXAocF9od2ZuLAorCQkJCQlkdW1wX2J1ZiwKKwkJCQkJbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCU5VTEwsIHJlc3VsdHNfYnVmX3NpemUpOworfQorCitlbnVtIGRiZ19zdGF0dXMgcWVkX3ByaW50X21jcF90cmFjZV9yZXN1bHRzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJICAgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJICAgIGNoYXIgKnJlc3VsdHNfYnVmKQoreworCXUzMiBwYXJzZWRfYnVmX3NpemU7CisKKwlyZXR1cm4gcWVkX3BhcnNlX21jcF90cmFjZV9kdW1wKHBfaHdmbiwKKwkJCQkJZHVtcF9idWYsCisJCQkJCW51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQlyZXN1bHRzX2J1ZiwgJnBhcnNlZF9idWZfc2l6ZSk7Cit9CisKKy8qIFBhcnNlcyBhIFJlZyBGSUZPIGR1bXAgYnVmZmVyLgorICogSWYgcmVzdWx0X2J1ZiBpcyBub3QgTlVMTCwgdGhlIFJlZyBGSUZPIHJlc3VsdHMgYXJlIHByaW50ZWQgdG8gaXQuCisgKiBJbiBhbnkgY2FzZSwgdGhlIHJlcXVpcmVkIHJlc3VsdHMgYnVmZmVyIHNpemUgaXMgYXNzaWduZWQgdG8KKyAqIHBhcnNlZF9yZXN1bHRzX2J5dGVzLgorICogVGhlIHBhcnNpbmcgc3RhdHVzIGlzIHJldHVybmVkLgorICovCitzdGF0aWMgZW51bSBkYmdfc3RhdHVzIHFlZF9wYXJzZV9yZWdfZmlmb19kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICAgICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJICAgICAgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJICAgICAgIGNoYXIgKnJlc3VsdHNfYnVmLAorCQkJCQkgICAgICAgdTMyICpwYXJzZWRfcmVzdWx0c19ieXRlcykKK3sKKwl1MzIgcmVzdWx0c19vZmZzZXQgPSAwLCBwYXJhbV9udW1fdmFsLCBudW1fc2VjdGlvbl9wYXJhbXMsIG51bV9lbGVtZW50czsKKwljb25zdCBjaGFyICpzZWN0aW9uX25hbWUsICpwYXJhbV9uYW1lLCAqcGFyYW1fc3RyX3ZhbDsKKwlzdHJ1Y3QgcmVnX2ZpZm9fZWxlbWVudCAqZWxlbWVudHM7CisJdTggaSwgaiwgZXJyX3ZhbCwgdmZfdmFsOworCWNoYXIgdmZfc3RyWzRdOworCisJLyogUmVhZCBnbG9iYWxfcGFyYW1zIHNlY3Rpb24gKi8KKwlkdW1wX2J1ZiArPSBxZWRfcmVhZF9zZWN0aW9uX2hkcihkdW1wX2J1ZiwKKwkJCQkJICZzZWN0aW9uX25hbWUsICZudW1fc2VjdGlvbl9wYXJhbXMpOworCWlmIChzdHJjbXAoc2VjdGlvbl9uYW1lLCAiZ2xvYmFsX3BhcmFtcyIpKQorCQlyZXR1cm4gREJHX1NUQVRVU19SRUdfRklGT19CQURfREFUQTsKKworCS8qIFByaW50IGdsb2JhbCBwYXJhbXMgKi8KKwlkdW1wX2J1ZiArPSBxZWRfcHJpbnRfc2VjdGlvbl9wYXJhbXMoZHVtcF9idWYsCisJCQkJCSAgICAgbnVtX3NlY3Rpb25fcGFyYW1zLAorCQkJCQkgICAgIHJlc3VsdHNfYnVmLCAmcmVzdWx0c19vZmZzZXQpOworCisJLyogUmVhZCByZWdfZmlmb19kYXRhIHNlY3Rpb24gKi8KKwlkdW1wX2J1ZiArPSBxZWRfcmVhZF9zZWN0aW9uX2hkcihkdW1wX2J1ZiwKKwkJCQkJICZzZWN0aW9uX25hbWUsICZudW1fc2VjdGlvbl9wYXJhbXMpOworCWlmIChzdHJjbXAoc2VjdGlvbl9uYW1lLCAicmVnX2ZpZm9fZGF0YSIpKQorCQlyZXR1cm4gREJHX1NUQVRVU19SRUdfRklGT19CQURfREFUQTsKKwlkdW1wX2J1ZiArPSBxZWRfcmVhZF9wYXJhbShkdW1wX2J1ZiwKKwkJCQkgICAmcGFyYW1fbmFtZSwgJnBhcmFtX3N0cl92YWwsICZwYXJhbV9udW1fdmFsKTsKKwlpZiAoc3RyY21wKHBhcmFtX25hbWUsICJzaXplIikpCisJCXJldHVybiBEQkdfU1RBVFVTX1JFR19GSUZPX0JBRF9EQVRBOworCWlmIChwYXJhbV9udW1fdmFsICUgUkVHX0ZJRk9fRUxFTUVOVF9EV09SRFMpCisJCXJldHVybiBEQkdfU1RBVFVTX1JFR19GSUZPX0JBRF9EQVRBOworCW51bV9lbGVtZW50cyA9IHBhcmFtX251bV92YWwgLyBSRUdfRklGT19FTEVNRU5UX0RXT1JEUzsKKwllbGVtZW50cyA9IChzdHJ1Y3QgcmVnX2ZpZm9fZWxlbWVudCAqKWR1bXBfYnVmOworCisJLyogRGVjb2RlIGVsZW1lbnRzICovCisJZm9yIChpID0gMDsgaSA8IG51bV9lbGVtZW50czsgaSsrKSB7CisJCWJvb2wgZXJyX3ByaW50ZWQgPSBmYWxzZTsKKworCQkvKiBEaXNjb3ZlciBpZiBlbGVtZW50IGJlbG9uZ3MgdG8gYSBWRiBvciBhIFBGICovCisJCXZmX3ZhbCA9IEdFVF9GSUVMRChlbGVtZW50c1tpXS5kYXRhLCBSRUdfRklGT19FTEVNRU5UX1ZGKTsKKwkJaWYgKHZmX3ZhbCA9PSBSRUdfRklGT19FTEVNRU5UX0lTX1BGX1ZGX1ZBTCkKKwkJCXNwcmludGYodmZfc3RyLCAiJXMiLCAiTi9BIik7CisJCWVsc2UKKwkJCXNwcmludGYodmZfc3RyLCAiJWQiLCB2Zl92YWwpOworCisJCS8qIEFkZCBwYXJzZWQgZWxlbWVudCB0byBwYXJzZWQgYnVmZmVyICovCisJCXJlc3VsdHNfb2Zmc2V0ICs9CisJCSAgICBzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwKKwkJCQkJICAgIHJlc3VsdHNfb2Zmc2V0KSwKKwkJCSAgICAicmF3OiAweCUwMTZsbHgsIGFkZHJlc3M6IDB4JTA3bGx4LCBhY2Nlc3M6ICUtNXMsIHBmOiAlMmxsZCwgdmY6ICVzLCBwb3J0OiAlbGxkLCBwcml2aWxlZ2U6ICUtM3MsIHByb3RlY3Rpb246ICUtMTJzLCBtYXN0ZXI6ICUtNHMsIGVycm9yczogIiwKKwkJCSAgICBlbGVtZW50c1tpXS5kYXRhLAorCQkJICAgIEdFVF9GSUVMRChlbGVtZW50c1tpXS5kYXRhLAorCQkJCSAgICAgIFJFR19GSUZPX0VMRU1FTlRfQUREUkVTUykgKgorCQkJCSAgICAgIFJFR19GSUZPX0VMRU1FTlRfQUREUl9GQUNUT1IsCisJCQkJICAgICAgc19hY2Nlc3Nfc3Ryc1tHRVRfRklFTEQoZWxlbWVudHNbaV0uZGF0YSwKKwkJCQkJCSAgICBSRUdfRklGT19FTEVNRU5UX0FDQ0VTUyldLAorCQkJICAgIEdFVF9GSUVMRChlbGVtZW50c1tpXS5kYXRhLAorCQkJCSAgICAgIFJFR19GSUZPX0VMRU1FTlRfUEYpLCB2Zl9zdHIsCisJCQkgICAgR0VUX0ZJRUxEKGVsZW1lbnRzW2ldLmRhdGEsCisJCQkJICAgICAgUkVHX0ZJRk9fRUxFTUVOVF9QT1JUKSwKKwkJCQkgICAgICBzX3ByaXZpbGVnZV9zdHJzW0dFVF9GSUVMRChlbGVtZW50c1tpXS4KKwkJCQkgICAgICBkYXRhLAorCQkJCSAgICAgIFJFR19GSUZPX0VMRU1FTlRfUFJJVklMRUdFKV0sCisJCQkgICAgc19wcm90ZWN0aW9uX3N0cnNbR0VUX0ZJRUxEKGVsZW1lbnRzW2ldLmRhdGEsCisJCQkJCQlSRUdfRklGT19FTEVNRU5UX1BST1RFQ1RJT04pXSwKKwkJCSAgICBzX21hc3Rlcl9zdHJzW0dFVF9GSUVMRChlbGVtZW50c1tpXS5kYXRhLAorCQkJCQkJUkVHX0ZJRk9fRUxFTUVOVF9NQVNURVIpXSk7CisKKwkJLyogUHJpbnQgZXJyb3JzICovCisJCWZvciAoaiA9IDAsCisJCSAgICAgZXJyX3ZhbCA9IEdFVF9GSUVMRChlbGVtZW50c1tpXS5kYXRhLAorCQkJCQkgUkVHX0ZJRk9fRUxFTUVOVF9FUlJPUik7CisJCSAgICAgaiA8IEFSUkFZX1NJWkUoc19yZWdfZmlmb19lcnJvcl9zdHJzKTsKKwkJICAgICBqKyssIGVycl92YWwgPj49IDEpIHsKKwkJCWlmICghKGVycl92YWwgJiAweDEpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGVycl9wcmludGVkKQorCQkJCXJlc3VsdHNfb2Zmc2V0ICs9CisJCQkJCXNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLAorCQkJCQkJCQlyZXN1bHRzX29mZnNldCksCisJCQkJCQkiLCAiKTsKKwkJCXJlc3VsdHNfb2Zmc2V0ICs9CisJCQkJc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsCisJCQkJCQkJcmVzdWx0c19vZmZzZXQpLCAiJXMiLAorCQkJCQlzX3JlZ19maWZvX2Vycm9yX3N0cnNbal0pOworCQkJZXJyX3ByaW50ZWQgPSB0cnVlOworCQl9CisKKwkJcmVzdWx0c19vZmZzZXQgKz0KKwkJICAgIHNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLCByZXN1bHRzX29mZnNldCksICJcbiIpOworCX0KKworCXJlc3VsdHNfb2Zmc2V0ICs9IHNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLAorCQkJCQkJICByZXN1bHRzX29mZnNldCksCisJCQkJICAiZmlmbyBjb250YWluZWQgJWQgZWxlbWVudHMiLCBudW1fZWxlbWVudHMpOworCisJLyogQWRkIDEgZm9yIHN0cmluZyBOVUxMIHRlcm1pbmF0aW9uICovCisJKnBhcnNlZF9yZXN1bHRzX2J5dGVzID0gcmVzdWx0c19vZmZzZXQgKyAxOworCXJldHVybiBEQkdfU1RBVFVTX09LOworfQorCitlbnVtIGRiZ19zdGF0dXMgcWVkX2dldF9yZWdfZmlmb19yZXN1bHRzX2J1Zl9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJICB1MzIgKmR1bXBfYnVmLAorCQkJCQkJICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCQkgIHUzMiAqcmVzdWx0c19idWZfc2l6ZSkKK3sKKwlyZXR1cm4gcWVkX3BhcnNlX3JlZ19maWZvX2R1bXAocF9od2ZuLAorCQkJCSAgICAgICBkdW1wX2J1ZiwKKwkJCQkgICAgICAgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJICAgICAgIE5VTEwsIHJlc3VsdHNfYnVmX3NpemUpOworfQorCitlbnVtIGRiZ19zdGF0dXMgcWVkX3ByaW50X3JlZ19maWZvX3Jlc3VsdHMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgIHUzMiAqZHVtcF9idWYsCisJCQkJCSAgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJICAgY2hhciAqcmVzdWx0c19idWYpCit7CisJdTMyIHBhcnNlZF9idWZfc2l6ZTsKKworCXJldHVybiBxZWRfcGFyc2VfcmVnX2ZpZm9fZHVtcChwX2h3Zm4sCisJCQkJICAgICAgIGR1bXBfYnVmLAorCQkJCSAgICAgICBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkgICAgICAgcmVzdWx0c19idWYsICZwYXJzZWRfYnVmX3NpemUpOworfQorCisvKiBQYXJzZXMgYW4gSUdVIEZJRk8gZHVtcCBidWZmZXIuCisgKiBJZiByZXN1bHRfYnVmIGlzIG5vdCBOVUxMLCB0aGUgSUdVIEZJRk8gcmVzdWx0cyBhcmUgcHJpbnRlZCB0byBpdC4KKyAqIEluIGFueSBjYXNlLCB0aGUgcmVxdWlyZWQgcmVzdWx0cyBidWZmZXIgc2l6ZSBpcyBhc3NpZ25lZCB0bworICogcGFyc2VkX3Jlc3VsdHNfYnl0ZXMuCisgKiBUaGUgcGFyc2luZyBzdGF0dXMgaXMgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBlbnVtIGRiZ19zdGF0dXMgcWVkX3BhcnNlX2lndV9maWZvX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgICAgICB1MzIgKmR1bXBfYnVmLAorCQkJCQkgICAgICAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkgICAgICAgY2hhciAqcmVzdWx0c19idWYsCisJCQkJCSAgICAgICB1MzIgKnBhcnNlZF9yZXN1bHRzX2J5dGVzKQoreworCXUzMiByZXN1bHRzX29mZnNldCA9IDAsIHBhcmFtX251bV92YWwsIG51bV9zZWN0aW9uX3BhcmFtcywgbnVtX2VsZW1lbnRzOworCWNvbnN0IGNoYXIgKnNlY3Rpb25fbmFtZSwgKnBhcmFtX25hbWUsICpwYXJhbV9zdHJfdmFsOworCXN0cnVjdCBpZ3VfZmlmb19lbGVtZW50ICplbGVtZW50czsKKwljaGFyIHBhcnNlZF9hZGRyX2RhdGFbMzJdOworCWNoYXIgcGFyc2VkX3dyX2RhdGFbMjU2XTsKKwl1OCBpLCBqOworCisJLyogUmVhZCBnbG9iYWxfcGFyYW1zIHNlY3Rpb24gKi8KKwlkdW1wX2J1ZiArPSBxZWRfcmVhZF9zZWN0aW9uX2hkcihkdW1wX2J1ZiwKKwkJCQkJICZzZWN0aW9uX25hbWUsICZudW1fc2VjdGlvbl9wYXJhbXMpOworCWlmIChzdHJjbXAoc2VjdGlvbl9uYW1lLCAiZ2xvYmFsX3BhcmFtcyIpKQorCQlyZXR1cm4gREJHX1NUQVRVU19JR1VfRklGT19CQURfREFUQTsKKworCS8qIFByaW50IGdsb2JhbCBwYXJhbXMgKi8KKwlkdW1wX2J1ZiArPSBxZWRfcHJpbnRfc2VjdGlvbl9wYXJhbXMoZHVtcF9idWYsCisJCQkJCSAgICAgbnVtX3NlY3Rpb25fcGFyYW1zLAorCQkJCQkgICAgIHJlc3VsdHNfYnVmLCAmcmVzdWx0c19vZmZzZXQpOworCisJLyogUmVhZCBpZ3VfZmlmb19kYXRhIHNlY3Rpb24gKi8KKwlkdW1wX2J1ZiArPSBxZWRfcmVhZF9zZWN0aW9uX2hkcihkdW1wX2J1ZiwKKwkJCQkJICZzZWN0aW9uX25hbWUsICZudW1fc2VjdGlvbl9wYXJhbXMpOworCWlmIChzdHJjbXAoc2VjdGlvbl9uYW1lLCAiaWd1X2ZpZm9fZGF0YSIpKQorCQlyZXR1cm4gREJHX1NUQVRVU19JR1VfRklGT19CQURfREFUQTsKKwlkdW1wX2J1ZiArPSBxZWRfcmVhZF9wYXJhbShkdW1wX2J1ZiwKKwkJCQkgICAmcGFyYW1fbmFtZSwgJnBhcmFtX3N0cl92YWwsICZwYXJhbV9udW1fdmFsKTsKKwlpZiAoc3RyY21wKHBhcmFtX25hbWUsICJzaXplIikpCisJCXJldHVybiBEQkdfU1RBVFVTX0lHVV9GSUZPX0JBRF9EQVRBOworCWlmIChwYXJhbV9udW1fdmFsICUgSUdVX0ZJRk9fRUxFTUVOVF9EV09SRFMpCisJCXJldHVybiBEQkdfU1RBVFVTX0lHVV9GSUZPX0JBRF9EQVRBOworCW51bV9lbGVtZW50cyA9IHBhcmFtX251bV92YWwgLyBJR1VfRklGT19FTEVNRU5UX0RXT1JEUzsKKwllbGVtZW50cyA9IChzdHJ1Y3QgaWd1X2ZpZm9fZWxlbWVudCAqKWR1bXBfYnVmOworCisJLyogRGVjb2RlIGVsZW1lbnRzICovCisJZm9yIChpID0gMDsgaSA8IG51bV9lbGVtZW50czsgaSsrKSB7CisJCS8qIGR3b3JkMTIgKGR3b3JkIGluZGV4IDEgYW5kIDIpIGNvbnRhaW5zIGJpdHMgMzIuLjk1IG9mIHRoZQorCQkgKiBGSUZPIGVsZW1lbnQuCisJCSAqLworCQl1NjQgZHdvcmQxMiA9CisJCSAgICAoKHU2NCllbGVtZW50c1tpXS5kd29yZDIgPDwgMzIpIHwgZWxlbWVudHNbaV0uZHdvcmQxOworCQlib29sIGlzX3dyX2NtZCA9IEdFVF9GSUVMRChkd29yZDEyLAorCQkJCQkgICBJR1VfRklGT19FTEVNRU5UX0RXT1JEMTJfSVNfV1JfQ01EKTsKKwkJYm9vbCBpc19wZiA9IEdFVF9GSUVMRChlbGVtZW50c1tpXS5kd29yZDAsCisJCQkJICAgICAgIElHVV9GSUZPX0VMRU1FTlRfRFdPUkQwX0lTX1BGKTsKKwkJdTE2IGNtZF9hZGRyID0gR0VUX0ZJRUxEKGVsZW1lbnRzW2ldLmR3b3JkMCwKKwkJCQkJIElHVV9GSUZPX0VMRU1FTlRfRFdPUkQwX0NNRF9BRERSKTsKKwkJdTggc291cmNlID0gR0VUX0ZJRUxEKGVsZW1lbnRzW2ldLmR3b3JkMCwKKwkJCQkgICAgICBJR1VfRklGT19FTEVNRU5UX0RXT1JEMF9TT1VSQ0UpOworCQl1OCBlcnJfdHlwZSA9IEdFVF9GSUVMRChlbGVtZW50c1tpXS5kd29yZDAsCisJCQkJCUlHVV9GSUZPX0VMRU1FTlRfRFdPUkQwX0VSUl9UWVBFKTsKKwkJY29uc3Qgc3RydWN0IGlndV9maWZvX2FkZHJfZGF0YSAqYWRkcl9kYXRhID0gTlVMTDsKKworCQlpZiAoc291cmNlID49IEFSUkFZX1NJWkUoc19pZ3VfZmlmb19zb3VyY2Vfc3RycykpCisJCQlyZXR1cm4gREJHX1NUQVRVU19JR1VfRklGT19CQURfREFUQTsKKwkJaWYgKGVycl90eXBlID49IEFSUkFZX1NJWkUoc19pZ3VfZmlmb19lcnJvcl9zdHJzKSkKKwkJCXJldHVybiBEQkdfU1RBVFVTX0lHVV9GSUZPX0JBRF9EQVRBOworCisJCS8qIEZpbmQgYWRkcmVzcyBkYXRhICovCisJCWZvciAoaiA9IDA7IGogPCBBUlJBWV9TSVpFKHNfaWd1X2ZpZm9fYWRkcl9kYXRhKSAmJiAhYWRkcl9kYXRhOworCQkgICAgIGorKykKKwkJCWlmIChjbWRfYWRkciA+PSBzX2lndV9maWZvX2FkZHJfZGF0YVtqXS5zdGFydF9hZGRyICYmCisJCQkgICAgY21kX2FkZHIgPD0gc19pZ3VfZmlmb19hZGRyX2RhdGFbal0uZW5kX2FkZHIpCisJCQkJYWRkcl9kYXRhID0gJnNfaWd1X2ZpZm9fYWRkcl9kYXRhW2pdOworCQlpZiAoIWFkZHJfZGF0YSkKKwkJCXJldHVybiBEQkdfU1RBVFVTX0lHVV9GSUZPX0JBRF9EQVRBOworCisJCS8qIFByZXBhcmUgcGFyc2VkIGFkZHJlc3MgZGF0YSAqLworCQlzd2l0Y2ggKGFkZHJfZGF0YS0+dHlwZSkgeworCQljYXNlIElHVV9BRERSX1RZUEVfTVNJWF9NRU06CisJCQlzcHJpbnRmKHBhcnNlZF9hZGRyX2RhdGEsCisJCQkJIiB2ZWN0b3JfbnVtPTB4JXgiLCBjbWRfYWRkciAvIDIpOworCQkJYnJlYWs7CisJCWNhc2UgSUdVX0FERFJfVFlQRV9XUklURV9JTlRfQUNLOgorCQljYXNlIElHVV9BRERSX1RZUEVfV1JJVEVfUFJPRF9VUERBVEU6CisJCQlzcHJpbnRmKHBhcnNlZF9hZGRyX2RhdGEsCisJCQkJIiBTQj0weCV4IiwgY21kX2FkZHIgLSBhZGRyX2RhdGEtPnN0YXJ0X2FkZHIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwYXJzZWRfYWRkcl9kYXRhWzBdID0gJ1wwJzsKKwkJfQorCisJCS8qIFByZXBhcmUgcGFyc2VkIHdyaXRlIGRhdGEgKi8KKwkJaWYgKGlzX3dyX2NtZCkgeworCQkJdTMyIHdyX2RhdGEgPSBHRVRfRklFTEQoZHdvcmQxMiwKKwkJCQkJSUdVX0ZJRk9fRUxFTUVOVF9EV09SRDEyX1dSX0RBVEEpOworCQkJdTMyIHByb2RfY29ucyA9IEdFVF9GSUVMRCh3cl9kYXRhLAorCQkJCQkJICBJR1VfRklGT19XUl9EQVRBX1BST0RfQ09OUyk7CisJCQl1OCBpc19jbGVhbnVwID0gR0VUX0ZJRUxEKHdyX2RhdGEsCisJCQkJCQkgIElHVV9GSUZPX1dSX0RBVEFfQ01EX1RZUEUpOworCisJCQlpZiAoc291cmNlID09IElHVV9TUkNfQVRUTikgeworCQkJCXNwcmludGYocGFyc2VkX3dyX2RhdGEsCisJCQkJCSJwcm9kOiAweCV4LCAiLCBwcm9kX2NvbnMpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoaXNfY2xlYW51cCkgeworCQkJCQl1OCBjbGVhbnVwX3ZhbCA9IEdFVF9GSUVMRCh3cl9kYXRhLAorCQkJCQkJCQkgICBJR1VfRklGT19DTEVBTlVQX1dSX0RBVEFfQ0xFQU5VUF9WQUwpOworCQkJCQl1OCBjbGVhbnVwX3R5cGUgPSBHRVRfRklFTEQod3JfZGF0YSwKKwkJCQkJCQkJICAgIElHVV9GSUZPX0NMRUFOVVBfV1JfREFUQV9DTEVBTlVQX1RZUEUpOworCisJCQkJCXNwcmludGYocGFyc2VkX3dyX2RhdGEsCisJCQkJCQkiY21kX3R5cGU6IGNsZWFudXAsIGNsZWFudXBfdmFsOiAlcywgY2xlYW51cF90eXBlOiAlZCwgIiwKKwkJCQkJCWNsZWFudXBfdmFsID8gInNldCIgOiAiY2xlYXIiLAorCQkJCQkJY2xlYW51cF90eXBlKTsKKwkJCQl9IGVsc2UgeworCQkJCQl1OCB1cGRhdGVfZmxhZyA9IEdFVF9GSUVMRCh3cl9kYXRhLAorCQkJCQkJCQkgICBJR1VfRklGT19XUl9EQVRBX1VQREFURV9GTEFHKTsKKwkJCQkJdTggZW5fZGlzX2ludF9mb3Jfc2IgPQorCQkJCQkgICAgR0VUX0ZJRUxEKHdyX2RhdGEsCisJCQkJCQkgICAgICBJR1VfRklGT19XUl9EQVRBX0VOX0RJU19JTlRfRk9SX1NCKTsKKwkJCQkJdTggc2VnbWVudCA9IEdFVF9GSUVMRCh3cl9kYXRhLAorCQkJCQkJCSAgICAgICBJR1VfRklGT19XUl9EQVRBX1NFR01FTlQpOworCQkJCQl1OCB0aW1lcl9tYXNrID0gR0VUX0ZJRUxEKHdyX2RhdGEsCisJCQkJCQkJCSAgSUdVX0ZJRk9fV1JfREFUQV9USU1FUl9NQVNLKTsKKworCQkJCQlzcHJpbnRmKHBhcnNlZF93cl9kYXRhLAorCQkJCQkJImNtZF90eXBlOiBwcm9kL2NvbnMgdXBkYXRlLCBwcm9kL2NvbnM6IDB4JXgsIHVwZGF0ZV9mbGFnOiAlcywgZW5fZGlzX2ludF9mb3Jfc2I6ICVzLCBzZWdtZW50OiAlcywgdGltZXJfbWFzaz0lZCwgIiwKKwkJCQkJCXByb2RfY29ucywKKwkJCQkJCXVwZGF0ZV9mbGFnID8gInVwZGF0ZSIgOiAibm9wIiwKKwkJCQkJCWVuX2Rpc19pbnRfZm9yX3NiCisJCQkJCQk/IChlbl9kaXNfaW50X2Zvcl9zYiA9PQorCQkJCQkJICAgMSA/ICJkaXNhYmxlIiA6ICJub3AiKSA6CisJCQkJCQkiZW5hYmxlIiwKKwkJCQkJCXNlZ21lbnQgPyAiYXR0biIgOiAicmVndWxhciIsCisJCQkJCQl0aW1lcl9tYXNrKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlwYXJzZWRfd3JfZGF0YVswXSA9ICdcMCc7CisJCX0KKworCQkvKiBBZGQgcGFyc2VkIGVsZW1lbnQgdG8gcGFyc2VkIGJ1ZmZlciAqLworCQlyZXN1bHRzX29mZnNldCArPQorCQkgICAgc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsCisJCQkJCSAgICByZXN1bHRzX29mZnNldCksCisJCQkgICAgInJhdzogMHglMDF4JTA4eCUwOHgsICVzOiAlZCwgc291cmNlOiAlcywgdHlwZTogJXMsIGNtZF9hZGRyOiAweCV4ICglcyVzKSwgJXNlcnJvcjogJXNcbiIsCisJCQkgICAgZWxlbWVudHNbaV0uZHdvcmQyLCBlbGVtZW50c1tpXS5kd29yZDEsCisJCQkgICAgZWxlbWVudHNbaV0uZHdvcmQwLAorCQkJICAgIGlzX3BmID8gInBmIiA6ICJ2ZiIsCisJCQkgICAgR0VUX0ZJRUxEKGVsZW1lbnRzW2ldLmR3b3JkMCwKKwkJCQkgICAgICBJR1VfRklGT19FTEVNRU5UX0RXT1JEMF9GSUQpLAorCQkJICAgIHNfaWd1X2ZpZm9fc291cmNlX3N0cnNbc291cmNlXSwKKwkJCSAgICBpc193cl9jbWQgPyAid3IiIDogInJkIiwgY21kX2FkZHIsCisJCQkgICAgKCFpc19wZiAmJiBhZGRyX2RhdGEtPnZmX2Rlc2MpCisJCQkgICAgPyBhZGRyX2RhdGEtPnZmX2Rlc2MgOiBhZGRyX2RhdGEtPmRlc2MsCisJCQkgICAgcGFyc2VkX2FkZHJfZGF0YSwgcGFyc2VkX3dyX2RhdGEsCisJCQkgICAgc19pZ3VfZmlmb19lcnJvcl9zdHJzW2Vycl90eXBlXSk7CisJfQorCisJcmVzdWx0c19vZmZzZXQgKz0gc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsCisJCQkJCQkgIHJlc3VsdHNfb2Zmc2V0KSwKKwkJCQkgICJmaWZvIGNvbnRhaW5lZCAlZCBlbGVtZW50cyIsIG51bV9lbGVtZW50cyk7CisKKwkvKiBBZGQgMSBmb3Igc3RyaW5nIE5VTEwgdGVybWluYXRpb24gKi8KKwkqcGFyc2VkX3Jlc3VsdHNfYnl0ZXMgPSByZXN1bHRzX29mZnNldCArIDE7CisJcmV0dXJuIERCR19TVEFUVVNfT0s7Cit9CisKK2VudW0gZGJnX3N0YXR1cyBxZWRfZ2V0X2lndV9maWZvX3Jlc3VsdHNfYnVmX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgIHUzMiAqZHVtcF9idWYsCisJCQkJCQkgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJCSAgdTMyICpyZXN1bHRzX2J1Zl9zaXplKQoreworCXJldHVybiBxZWRfcGFyc2VfaWd1X2ZpZm9fZHVtcChwX2h3Zm4sCisJCQkJICAgICAgIGR1bXBfYnVmLAorCQkJCSAgICAgICBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkgICAgICAgTlVMTCwgcmVzdWx0c19idWZfc2l6ZSk7Cit9CisKK2VudW0gZGJnX3N0YXR1cyBxZWRfcHJpbnRfaWd1X2ZpZm9fcmVzdWx0cyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJICAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkgICBjaGFyICpyZXN1bHRzX2J1ZikKK3sKKwl1MzIgcGFyc2VkX2J1Zl9zaXplOworCisJcmV0dXJuIHFlZF9wYXJzZV9pZ3VfZmlmb19kdW1wKHBfaHdmbiwKKwkJCQkgICAgICAgZHVtcF9idWYsCisJCQkJICAgICAgIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCSAgICAgICByZXN1bHRzX2J1ZiwgJnBhcnNlZF9idWZfc2l6ZSk7Cit9CisKK3N0YXRpYyBlbnVtIGRiZ19zdGF0dXMKK3FlZF9wYXJzZV9wcm90ZWN0aW9uX292ZXJyaWRlX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkgICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJICAgY2hhciAqcmVzdWx0c19idWYsCisJCQkJICAgdTMyICpwYXJzZWRfcmVzdWx0c19ieXRlcykKK3sKKwl1MzIgcmVzdWx0c19vZmZzZXQgPSAwLCBwYXJhbV9udW1fdmFsLCBudW1fc2VjdGlvbl9wYXJhbXMsIG51bV9lbGVtZW50czsKKwljb25zdCBjaGFyICpzZWN0aW9uX25hbWUsICpwYXJhbV9uYW1lLCAqcGFyYW1fc3RyX3ZhbDsKKwlzdHJ1Y3QgcHJvdGVjdGlvbl9vdmVycmlkZV9lbGVtZW50ICplbGVtZW50czsKKwl1OCBpOworCisJLyogUmVhZCBnbG9iYWxfcGFyYW1zIHNlY3Rpb24gKi8KKwlkdW1wX2J1ZiArPSBxZWRfcmVhZF9zZWN0aW9uX2hkcihkdW1wX2J1ZiwKKwkJCQkJICZzZWN0aW9uX25hbWUsICZudW1fc2VjdGlvbl9wYXJhbXMpOworCWlmIChzdHJjbXAoc2VjdGlvbl9uYW1lLCAiZ2xvYmFsX3BhcmFtcyIpKQorCQlyZXR1cm4gREJHX1NUQVRVU19QUk9URUNUSU9OX09WRVJSSURFX0JBRF9EQVRBOworCisJLyogUHJpbnQgZ2xvYmFsIHBhcmFtcyAqLworCWR1bXBfYnVmICs9IHFlZF9wcmludF9zZWN0aW9uX3BhcmFtcyhkdW1wX2J1ZiwKKwkJCQkJICAgICBudW1fc2VjdGlvbl9wYXJhbXMsCisJCQkJCSAgICAgcmVzdWx0c19idWYsICZyZXN1bHRzX29mZnNldCk7CisKKwkvKiBSZWFkIHByb3RlY3Rpb25fb3ZlcnJpZGVfZGF0YSBzZWN0aW9uICovCisJZHVtcF9idWYgKz0gcWVkX3JlYWRfc2VjdGlvbl9oZHIoZHVtcF9idWYsCisJCQkJCSAmc2VjdGlvbl9uYW1lLCAmbnVtX3NlY3Rpb25fcGFyYW1zKTsKKwlpZiAoc3RyY21wKHNlY3Rpb25fbmFtZSwgInByb3RlY3Rpb25fb3ZlcnJpZGVfZGF0YSIpKQorCQlyZXR1cm4gREJHX1NUQVRVU19QUk9URUNUSU9OX09WRVJSSURFX0JBRF9EQVRBOworCWR1bXBfYnVmICs9IHFlZF9yZWFkX3BhcmFtKGR1bXBfYnVmLAorCQkJCSAgICZwYXJhbV9uYW1lLCAmcGFyYW1fc3RyX3ZhbCwgJnBhcmFtX251bV92YWwpOworCWlmIChzdHJjbXAocGFyYW1fbmFtZSwgInNpemUiKSkKKwkJcmV0dXJuIERCR19TVEFUVVNfUFJPVEVDVElPTl9PVkVSUklERV9CQURfREFUQTsKKwlpZiAocGFyYW1fbnVtX3ZhbCAlIFBST1RFQ1RJT05fT1ZFUlJJREVfRUxFTUVOVF9EV09SRFMgIT0gMCkKKwkJcmV0dXJuIERCR19TVEFUVVNfUFJPVEVDVElPTl9PVkVSUklERV9CQURfREFUQTsKKwludW1fZWxlbWVudHMgPSBwYXJhbV9udW1fdmFsIC8gUFJPVEVDVElPTl9PVkVSUklERV9FTEVNRU5UX0RXT1JEUzsKKwllbGVtZW50cyA9IChzdHJ1Y3QgcHJvdGVjdGlvbl9vdmVycmlkZV9lbGVtZW50ICopZHVtcF9idWY7CisKKwkvKiBEZWNvZGUgZWxlbWVudHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VsZW1lbnRzOyBpKyspIHsKKwkJdTMyIGFkZHJlc3MgPSBHRVRfRklFTEQoZWxlbWVudHNbaV0uZGF0YSwKKwkJCQkJUFJPVEVDVElPTl9PVkVSUklERV9FTEVNRU5UX0FERFJFU1MpICoKKwkJCQkJUFJPVEVDVElPTl9PVkVSUklERV9FTEVNRU5UX0FERFJfRkFDVE9SOworCisJCXJlc3VsdHNfb2Zmc2V0ICs9CisJCSAgICBzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwKKwkJCQkJICAgIHJlc3VsdHNfb2Zmc2V0KSwKKwkJCSAgICAid2luZG93ICUyZCwgYWRkcmVzczogMHglMDd4LCBzaXplOiAlN2xsZCByZWdzLCByZWFkOiAlbGxkLCB3cml0ZTogJWxsZCwgcmVhZCBwcm90ZWN0aW9uOiAlLTEycywgd3JpdGUgcHJvdGVjdGlvbjogJS0xMnNcbiIsCisJCQkgICAgaSwgYWRkcmVzcywKKwkJCSAgICBHRVRfRklFTEQoZWxlbWVudHNbaV0uZGF0YSwKKwkJCQkgICAgICBQUk9URUNUSU9OX09WRVJSSURFX0VMRU1FTlRfV0lORE9XX1NJWkUpLAorCQkJICAgIEdFVF9GSUVMRChlbGVtZW50c1tpXS5kYXRhLAorCQkJCSAgICAgIFBST1RFQ1RJT05fT1ZFUlJJREVfRUxFTUVOVF9SRUFEKSwKKwkJCSAgICBHRVRfRklFTEQoZWxlbWVudHNbaV0uZGF0YSwKKwkJCQkgICAgICBQUk9URUNUSU9OX09WRVJSSURFX0VMRU1FTlRfV1JJVEUpLAorCQkJICAgIHNfcHJvdGVjdGlvbl9zdHJzW0dFVF9GSUVMRChlbGVtZW50c1tpXS5kYXRhLAorCQkJCVBST1RFQ1RJT05fT1ZFUlJJREVfRUxFTUVOVF9SRUFEX1BST1RFQ1RJT04pXSwKKwkJCSAgICBzX3Byb3RlY3Rpb25fc3Ryc1tHRVRfRklFTEQoZWxlbWVudHNbaV0uZGF0YSwKKwkJCQlQUk9URUNUSU9OX09WRVJSSURFX0VMRU1FTlRfV1JJVEVfUFJPVEVDVElPTildKTsKKwl9CisKKwlyZXN1bHRzX29mZnNldCArPSBzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwKKwkJCQkJCSAgcmVzdWx0c19vZmZzZXQpLAorCQkJCSAgInByb3RlY3Rpb24gb3ZlcnJpZGUgY29udGFpbmVkICVkIGVsZW1lbnRzIiwKKwkJCQkgIG51bV9lbGVtZW50cyk7CisKKwkvKiBBZGQgMSBmb3Igc3RyaW5nIE5VTEwgdGVybWluYXRpb24gKi8KKwkqcGFyc2VkX3Jlc3VsdHNfYnl0ZXMgPSByZXN1bHRzX29mZnNldCArIDE7CisJcmV0dXJuIERCR19TVEFUVVNfT0s7Cit9CisKK2VudW0gZGJnX3N0YXR1cworcWVkX2dldF9wcm90ZWN0aW9uX292ZXJyaWRlX3Jlc3VsdHNfYnVmX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJICAgICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCSAgICAgdTMyICpyZXN1bHRzX2J1Zl9zaXplKQoreworCXJldHVybiBxZWRfcGFyc2VfcHJvdGVjdGlvbl9vdmVycmlkZV9kdW1wKHBfaHdmbiwKKwkJCQkJCSAgZHVtcF9idWYsCisJCQkJCQkgIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkJICBOVUxMLCByZXN1bHRzX2J1Zl9zaXplKTsKK30KKworZW51bSBkYmdfc3RhdHVzIHFlZF9wcmludF9wcm90ZWN0aW9uX292ZXJyaWRlX3Jlc3VsdHMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgICAgICB1MzIgKmR1bXBfYnVmLAorCQkJCQkJICAgICAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkJICAgICAgY2hhciAqcmVzdWx0c19idWYpCit7CisJdTMyIHBhcnNlZF9idWZfc2l6ZTsKKworCXJldHVybiBxZWRfcGFyc2VfcHJvdGVjdGlvbl9vdmVycmlkZV9kdW1wKHBfaHdmbiwKKwkJCQkJCSAgZHVtcF9idWYsCisJCQkJCQkgIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkJICByZXN1bHRzX2J1ZiwKKwkJCQkJCSAgJnBhcnNlZF9idWZfc2l6ZSk7Cit9CisKKy8qIFBhcnNlcyBhIEZXIEFzc2VydHMgZHVtcCBidWZmZXIuCisgKiBJZiByZXN1bHRfYnVmIGlzIG5vdCBOVUxMLCB0aGUgRlcgQXNzZXJ0cyByZXN1bHRzIGFyZSBwcmludGVkIHRvIGl0LgorICogSW4gYW55IGNhc2UsIHRoZSByZXF1aXJlZCByZXN1bHRzIGJ1ZmZlciBzaXplIGlzIGFzc2lnbmVkIHRvCisgKiBwYXJzZWRfcmVzdWx0c19ieXRlcy4KKyAqIFRoZSBwYXJzaW5nIHN0YXR1cyBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIGVudW0gZGJnX3N0YXR1cyBxZWRfcGFyc2VfZndfYXNzZXJ0c19kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJIHUzMiAqZHVtcF9idWYsCisJCQkJCQkgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkJIGNoYXIgKnJlc3VsdHNfYnVmLAorCQkJCQkJIHUzMiAqcGFyc2VkX3Jlc3VsdHNfYnl0ZXMpCit7CisJdTMyIHJlc3VsdHNfb2Zmc2V0ID0gMCwgbnVtX3NlY3Rpb25fcGFyYW1zLCBwYXJhbV9udW1fdmFsLCBpOworCWNvbnN0IGNoYXIgKnBhcmFtX25hbWUsICpwYXJhbV9zdHJfdmFsLCAqc2VjdGlvbl9uYW1lOworCWJvb2wgbGFzdF9zZWN0aW9uX2ZvdW5kID0gZmFsc2U7CisKKwkqcGFyc2VkX3Jlc3VsdHNfYnl0ZXMgPSAwOworCisJLyogUmVhZCBnbG9iYWxfcGFyYW1zIHNlY3Rpb24gKi8KKwlkdW1wX2J1ZiArPSBxZWRfcmVhZF9zZWN0aW9uX2hkcihkdW1wX2J1ZiwKKwkJCQkJICZzZWN0aW9uX25hbWUsICZudW1fc2VjdGlvbl9wYXJhbXMpOworCWlmIChzdHJjbXAoc2VjdGlvbl9uYW1lLCAiZ2xvYmFsX3BhcmFtcyIpKQorCQlyZXR1cm4gREJHX1NUQVRVU19GV19BU1NFUlRTX1BBUlNFX0ZBSUxFRDsKKworCS8qIFByaW50IGdsb2JhbCBwYXJhbXMgKi8KKwlkdW1wX2J1ZiArPSBxZWRfcHJpbnRfc2VjdGlvbl9wYXJhbXMoZHVtcF9idWYsCisJCQkJCSAgICAgbnVtX3NlY3Rpb25fcGFyYW1zLAorCQkJCQkgICAgIHJlc3VsdHNfYnVmLCAmcmVzdWx0c19vZmZzZXQpOworCXdoaWxlICghbGFzdF9zZWN0aW9uX2ZvdW5kKSB7CisJCWNvbnN0IGNoYXIgKnN0b3JtX2xldHRlciA9IE5VTEw7CisJCXUzMiBzdG9ybV9kdW1wX3NpemUgPSAwOworCisJCWR1bXBfYnVmICs9IHFlZF9yZWFkX3NlY3Rpb25faGRyKGR1bXBfYnVmLAorCQkJCQkJICZzZWN0aW9uX25hbWUsCisJCQkJCQkgJm51bV9zZWN0aW9uX3BhcmFtcyk7CisJCWlmICghc3RyY21wKHNlY3Rpb25fbmFtZSwgImxhc3QiKSkgeworCQkJbGFzdF9zZWN0aW9uX2ZvdW5kID0gdHJ1ZTsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKHN0cmNtcChzZWN0aW9uX25hbWUsICJmd19hc3NlcnRzIikpIHsKKwkJCXJldHVybiBEQkdfU1RBVFVTX0ZXX0FTU0VSVFNfUEFSU0VfRkFJTEVEOworCQl9CisKKwkJLyogRXh0cmFjdCBwYXJhbXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IG51bV9zZWN0aW9uX3BhcmFtczsgaSsrKSB7CisJCQlkdW1wX2J1ZiArPSBxZWRfcmVhZF9wYXJhbShkdW1wX2J1ZiwKKwkJCQkJCSAgICZwYXJhbV9uYW1lLAorCQkJCQkJICAgJnBhcmFtX3N0cl92YWwsCisJCQkJCQkgICAmcGFyYW1fbnVtX3ZhbCk7CisJCQlpZiAoIXN0cmNtcChwYXJhbV9uYW1lLCAic3Rvcm0iKSkKKwkJCQlzdG9ybV9sZXR0ZXIgPSBwYXJhbV9zdHJfdmFsOworCQkJZWxzZSBpZiAoIXN0cmNtcChwYXJhbV9uYW1lLCAic2l6ZSIpKQorCQkJCXN0b3JtX2R1bXBfc2l6ZSA9IHBhcmFtX251bV92YWw7CisJCQllbHNlCisJCQkJcmV0dXJuIERCR19TVEFUVVNfRldfQVNTRVJUU19QQVJTRV9GQUlMRUQ7CisJCX0KKworCQlpZiAoIXN0b3JtX2xldHRlciB8fCAhc3Rvcm1fZHVtcF9zaXplKQorCQkJcmV0dXJuIERCR19TVEFUVVNfRldfQVNTRVJUU19QQVJTRV9GQUlMRUQ7CisKKwkJLyogUHJpbnQgZGF0YSAqLworCQlyZXN1bHRzX29mZnNldCArPSBzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwKKwkJCQkJCQkgIHJlc3VsdHNfb2Zmc2V0KSwKKwkJCQkJICAiXG4lc1NUT1JNX0FTU0VSVDogc2l6ZT0lZFxuIiwKKwkJCQkJICBzdG9ybV9sZXR0ZXIsIHN0b3JtX2R1bXBfc2l6ZSk7CisJCWZvciAoaSA9IDA7IGkgPCBzdG9ybV9kdW1wX3NpemU7IGkrKywgZHVtcF9idWYrKykKKwkJCXJlc3VsdHNfb2Zmc2V0ICs9CisJCQkgICAgc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsCisJCQkJCQkgICAgcmVzdWx0c19vZmZzZXQpLAorCQkJCSAgICAiJTA4eFxuIiwgKmR1bXBfYnVmKTsKKwl9CisKKwkvKiBBZGQgMSBmb3Igc3RyaW5nIE5VTEwgdGVybWluYXRpb24gKi8KKwkqcGFyc2VkX3Jlc3VsdHNfYnl0ZXMgPSByZXN1bHRzX29mZnNldCArIDE7CisJcmV0dXJuIERCR19TVEFUVVNfT0s7Cit9CisKK2VudW0gZGJnX3N0YXR1cyBxZWRfZ2V0X2Z3X2Fzc2VydHNfcmVzdWx0c19idWZfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSAgICB1MzIgKmR1bXBfYnVmLAorCQkJCQkJICAgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJCSAgICB1MzIgKnJlc3VsdHNfYnVmX3NpemUpCit7CisJcmV0dXJuIHFlZF9wYXJzZV9md19hc3NlcnRzX2R1bXAocF9od2ZuLAorCQkJCQkgZHVtcF9idWYsCisJCQkJCSBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJIE5VTEwsIHJlc3VsdHNfYnVmX3NpemUpOworfQorCitlbnVtIGRiZ19zdGF0dXMgcWVkX3ByaW50X2Z3X2Fzc2VydHNfcmVzdWx0cyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICAgICB1MzIgKmR1bXBfYnVmLAorCQkJCQkgICAgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJICAgICBjaGFyICpyZXN1bHRzX2J1ZikKK3sKKwl1MzIgcGFyc2VkX2J1Zl9zaXplOworCisJcmV0dXJuIHFlZF9wYXJzZV9md19hc3NlcnRzX2R1bXAocF9od2ZuLAorCQkJCQkgZHVtcF9idWYsCisJCQkJCSBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJIHJlc3VsdHNfYnVmLCAmcGFyc2VkX2J1Zl9zaXplKTsKK30KKworLyogV3JhcHBlciBmb3IgdW5pZnlpbmcgdGhlIGlkbGVfY2hrIGFuZCBtY3BfdHJhY2UgYXBpICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX3ByaW50X2lkbGVfY2hrX3Jlc3VsdHNfd3JhcHBlcihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSAgIHUzMiAqZHVtcF9idWYsCisJCQkJCQkgICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCQkgICBjaGFyICpyZXN1bHRzX2J1ZikKK3sKKwl1MzIgbnVtX2Vycm9ycywgbnVtX3dhcm5uaW5nczsKKworCXJldHVybiBxZWRfcHJpbnRfaWRsZV9jaGtfcmVzdWx0cyhwX2h3Zm4sIGR1bXBfYnVmLCBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJICByZXN1bHRzX2J1ZiwgJm51bV9lcnJvcnMsCisJCQkJCSAgJm51bV93YXJubmluZ3MpOworfQorCisvKiBGZWF0dXJlIG1ldGEgZGF0YSBsb29rdXAgdGFibGUgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCWNoYXIgKm5hbWU7CisJZW51bSBkYmdfc3RhdHVzICgqZ2V0X3NpemUpKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHUzMiAqc2l6ZSk7CisJZW51bSBkYmdfc3RhdHVzICgqcGVyZm9ybV9kdW1wKShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1MzIgKmR1bXBfYnVmLAorCQkJCQl1MzIgYnVmX3NpemUsIHUzMiAqZHVtcGVkX2R3b3Jkcyk7CisJZW51bSBkYmdfc3RhdHVzICgqcHJpbnRfcmVzdWx0cykoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSB1MzIgKmR1bXBfYnVmLCB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCSBjaGFyICpyZXN1bHRzX2J1Zik7CisJZW51bSBkYmdfc3RhdHVzICgqcmVzdWx0c19idWZfc2l6ZSkoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgICB1MzIgKmR1bXBfYnVmLAorCQkJCQkgICAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkgICAgdTMyICpyZXN1bHRzX2J1Zl9zaXplKTsKK30gcWVkX2ZlYXR1cmVzX2xvb2t1cFtdID0geworCXsKKwkiZ3JjIiwgcWVkX2RiZ19ncmNfZ2V0X2R1bXBfYnVmX3NpemUsCisJCSAgICBxZWRfZGJnX2dyY19kdW1wLCBOVUxMLCBOVUxMfSwgeworCSJpZGxlX2NoayIsCisJCSAgICBxZWRfZGJnX2lkbGVfY2hrX2dldF9kdW1wX2J1Zl9zaXplLAorCQkgICAgcWVkX2RiZ19pZGxlX2Noa19kdW1wLAorCQkgICAgcWVkX3ByaW50X2lkbGVfY2hrX3Jlc3VsdHNfd3JhcHBlciwKKwkJICAgIHFlZF9nZXRfaWRsZV9jaGtfcmVzdWx0c19idWZfc2l6ZX0sIHsKKwkibWNwX3RyYWNlIiwKKwkJICAgIHFlZF9kYmdfbWNwX3RyYWNlX2dldF9kdW1wX2J1Zl9zaXplLAorCQkgICAgcWVkX2RiZ19tY3BfdHJhY2VfZHVtcCwgcWVkX3ByaW50X21jcF90cmFjZV9yZXN1bHRzLAorCQkgICAgcWVkX2dldF9tY3BfdHJhY2VfcmVzdWx0c19idWZfc2l6ZX0sIHsKKwkicmVnX2ZpZm8iLAorCQkgICAgcWVkX2RiZ19yZWdfZmlmb19nZXRfZHVtcF9idWZfc2l6ZSwKKwkJICAgIHFlZF9kYmdfcmVnX2ZpZm9fZHVtcCwgcWVkX3ByaW50X3JlZ19maWZvX3Jlc3VsdHMsCisJCSAgICBxZWRfZ2V0X3JlZ19maWZvX3Jlc3VsdHNfYnVmX3NpemV9LCB7CisJImlndV9maWZvIiwKKwkJICAgIHFlZF9kYmdfaWd1X2ZpZm9fZ2V0X2R1bXBfYnVmX3NpemUsCisJCSAgICBxZWRfZGJnX2lndV9maWZvX2R1bXAsIHFlZF9wcmludF9pZ3VfZmlmb19yZXN1bHRzLAorCQkgICAgcWVkX2dldF9pZ3VfZmlmb19yZXN1bHRzX2J1Zl9zaXplfSwgeworCSJwcm90ZWN0aW9uX292ZXJyaWRlIiwKKwkJICAgIHFlZF9kYmdfcHJvdGVjdGlvbl9vdmVycmlkZV9nZXRfZHVtcF9idWZfc2l6ZSwKKwkJICAgIHFlZF9kYmdfcHJvdGVjdGlvbl9vdmVycmlkZV9kdW1wLAorCQkgICAgcWVkX3ByaW50X3Byb3RlY3Rpb25fb3ZlcnJpZGVfcmVzdWx0cywKKwkJICAgIHFlZF9nZXRfcHJvdGVjdGlvbl9vdmVycmlkZV9yZXN1bHRzX2J1Zl9zaXplfSwgeworCSJmd19hc3NlcnRzIiwKKwkJICAgIHFlZF9kYmdfZndfYXNzZXJ0c19nZXRfZHVtcF9idWZfc2l6ZSwKKwkJICAgIHFlZF9kYmdfZndfYXNzZXJ0c19kdW1wLAorCQkgICAgcWVkX3ByaW50X2Z3X2Fzc2VydHNfcmVzdWx0cywKKwkJICAgIHFlZF9nZXRfZndfYXNzZXJ0c19yZXN1bHRzX2J1Zl9zaXplfSx9OworCitzdGF0aWMgdm9pZCBxZWRfZGJnX3ByaW50X2ZlYXR1cmUodTggKnBfdGV4dF9idWYsIHUzMiB0ZXh0X3NpemUpCit7CisJdTMyIGksIHByZWNpc2lvbiA9IDgwOworCisJaWYgKCFwX3RleHRfYnVmKQorCQlyZXR1cm47CisKKwlwcl9ub3RpY2UoIlxuJS4qcyIsIHByZWNpc2lvbiwgcF90ZXh0X2J1Zik7CisJZm9yIChpID0gcHJlY2lzaW9uOyBpIDwgdGV4dF9zaXplOyBpICs9IHByZWNpc2lvbikKKwkJcHJfY29udCgiJS4qcyIsIHByZWNpc2lvbiwgcF90ZXh0X2J1ZiArIGkpOworCXByX2NvbnQoIlxuIik7Cit9CisKKyNkZWZpbmUgUUVEX1JFU1VMVFNfQlVGX01JTl9TSVpFIDE2CisvKiBHZW5lcmljIGZ1bmN0aW9uIGZvciBkZWNvZGluZyBkZWJ1ZyBmZWF0dXJlIGluZm8gKi8KK2VudW0gZGJnX3N0YXR1cyBmb3JtYXRfZmVhdHVyZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgICAgICBlbnVtIHFlZF9kYmdfZmVhdHVyZXMgZmVhdHVyZV9pZHgpCit7CisJc3RydWN0IHFlZF9kYmdfZmVhdHVyZSAqZmVhdHVyZSA9CisJICAgICZwX2h3Zm4tPmNkZXYtPmRiZ19wYXJhbXMuZmVhdHVyZXNbZmVhdHVyZV9pZHhdOworCXUzMiB0ZXh0X3NpemVfYnl0ZXMsIG51bGxfY2hhcl9wb3MsIGk7CisJZW51bSBkYmdfc3RhdHVzIHJjOworCWNoYXIgKnRleHRfYnVmOworCisJLyogQ2hlY2sgaWYgZmVhdHVyZSBzdXBwb3J0cyBmb3JtYXR0aW5nIGNhcGFiaWxpdHkgKi8KKwlpZiAoIXFlZF9mZWF0dXJlc19sb29rdXBbZmVhdHVyZV9pZHhdLnJlc3VsdHNfYnVmX3NpemUpCisJCXJldHVybiBEQkdfU1RBVFVTX09LOworCisJLyogT2J0YWluIHNpemUgb2YgZm9ybWF0dGVkIG91dHB1dCAqLworCXJjID0gcWVkX2ZlYXR1cmVzX2xvb2t1cFtmZWF0dXJlX2lkeF0uCisJCXJlc3VsdHNfYnVmX3NpemUocF9od2ZuLCAodTMyICopZmVhdHVyZS0+ZHVtcF9idWYsCisJCQkJIGZlYXR1cmUtPmR1bXBlZF9kd29yZHMsICZ0ZXh0X3NpemVfYnl0ZXMpOworCWlmIChyYyAhPSBEQkdfU1RBVFVTX09LKQorCQlyZXR1cm4gcmM7CisKKwkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgYWxsb2NhdGVkIHNpemUgaXMgYSBtdWx0aXBsZSBvZiBkd29yZCAoNCBieXRlcykgKi8KKwludWxsX2NoYXJfcG9zID0gdGV4dF9zaXplX2J5dGVzIC0gMTsKKwl0ZXh0X3NpemVfYnl0ZXMgPSAodGV4dF9zaXplX2J5dGVzICsgMykgJiB+MHgzOworCisJaWYgKHRleHRfc2l6ZV9ieXRlcyA8IFFFRF9SRVNVTFRTX0JVRl9NSU5fU0laRSkgeworCQlEUF9OT1RJQ0UocF9od2ZuLT5jZGV2LAorCQkJICAiZm9ybWF0dGVkIHNpemUgb2YgZmVhdHVyZSB3YXMgdG9vIHNtYWxsICVkLiBBYm9ydGluZ1xuIiwKKwkJCSAgdGV4dF9zaXplX2J5dGVzKTsKKwkJcmV0dXJuIERCR19TVEFUVVNfSU5WQUxJRF9BUkdTOworCX0KKworCS8qIEFsbG9jYXRlIHRlbXAgdGV4dCBidWYgKi8KKwl0ZXh0X2J1ZiA9IHZ6YWxsb2ModGV4dF9zaXplX2J5dGVzKTsKKwlpZiAoIXRleHRfYnVmKQorCQlyZXR1cm4gREJHX1NUQVRVU19WSVJUX01FTV9BTExPQ19GQUlMRUQ7CisKKwkvKiBEZWNvZGUgZmVhdHVyZSBvcGNvZGVzIHRvIHN0cmluZyBvbiB0ZW1wIGJ1ZiAqLworCXJjID0gcWVkX2ZlYXR1cmVzX2xvb2t1cFtmZWF0dXJlX2lkeF0uCisJCXByaW50X3Jlc3VsdHMocF9od2ZuLCAodTMyICopZmVhdHVyZS0+ZHVtcF9idWYsCisJCQkgICAgICBmZWF0dXJlLT5kdW1wZWRfZHdvcmRzLCB0ZXh0X2J1Zik7CisJaWYgKHJjICE9IERCR19TVEFUVVNfT0spIHsKKwkJdmZyZWUodGV4dF9idWYpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogUmVwbGFjZSB0aGUgb3JpZ2luYWwgbnVsbCBjaGFyYWN0ZXIgd2l0aCBhICdcbicgY2hhcmFjdGVyLgorCSAqIFRoZSBieXRlcyB0aGF0IHdlcmUgYWRkZWQgYXMgYSByZXN1bHQgb2YgdGhlIGR3b3JkIGFsaWdubWVudCBhcmUgYWxzbworCSAqIHBhZGRlZCB3aXRoICdcbicgY2hhcmFjdGVycy4KKwkgKi8KKwlmb3IgKGkgPSBudWxsX2NoYXJfcG9zOyBpIDwgdGV4dF9zaXplX2J5dGVzOyBpKyspCisJCXRleHRfYnVmW2ldID0gJ1xuJzsKKworCS8qIER1bXAgcHJpbnRhYmxlIGZlYXR1cmUgdG8gbG9nICovCisJaWYgKHBfaHdmbi0+Y2Rldi0+ZGJnX3BhcmFtcy5wcmludF9kYXRhKQorCQlxZWRfZGJnX3ByaW50X2ZlYXR1cmUodGV4dF9idWYsIHRleHRfc2l6ZV9ieXRlcyk7CisKKwkvKiBGcmVlIHRoZSBvbGQgZHVtcF9idWYgYW5kIHBvaW50IHRoZSBkdW1wX2J1ZiB0byB0aGUgbmV3bHkgYWxsb2NhZ3RlZAorCSAqIGFuZCBmb3JtYXR0ZWQgdGV4dCBidWZmZXIuCisJICovCisJdmZyZWUoZmVhdHVyZS0+ZHVtcF9idWYpOworCWZlYXR1cmUtPmR1bXBfYnVmID0gdGV4dF9idWY7CisJZmVhdHVyZS0+YnVmX3NpemUgPSB0ZXh0X3NpemVfYnl0ZXM7CisJZmVhdHVyZS0+ZHVtcGVkX2R3b3JkcyA9IHRleHRfc2l6ZV9ieXRlcyAvIDQ7CisJcmV0dXJuIHJjOworfQorCisvKiBHZW5lcmljIGZ1bmN0aW9uIGZvciBwZXJmb3JtaW5nIHRoZSBkdW1wIG9mIGEgZGVidWcgZmVhdHVyZS4gKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCSAgICAgZW51bSBxZWRfZGJnX2ZlYXR1cmVzIGZlYXR1cmVfaWR4KQoreworCXN0cnVjdCBxZWRfZGJnX2ZlYXR1cmUgKmZlYXR1cmUgPQorCSAgICAmcF9od2ZuLT5jZGV2LT5kYmdfcGFyYW1zLmZlYXR1cmVzW2ZlYXR1cmVfaWR4XTsKKwl1MzIgYnVmX3NpemVfZHdvcmRzOworCWVudW0gZGJnX3N0YXR1cyByYzsKKworCURQX05PVElDRShwX2h3Zm4tPmNkZXYsICJDb2xsZWN0aW5nIGEgZGVidWcgZmVhdHVyZSBbXCIlc1wiXVxuIiwKKwkJICBxZWRfZmVhdHVyZXNfbG9va3VwW2ZlYXR1cmVfaWR4XS5uYW1lKTsKKworCS8qIER1bXBfYnVmIHdhcyBhbHJlYWR5IGFsbG9jYXRlZCBuZWVkIHRvIGZyZWUgKHRoaXMgY2FuIGhhcHBlbiBpZiBkdW1wCisJICogd2FzIGNhbGxlZCBidXQgZmlsZSB3YXMgbmV2ZXIgcmVhZCkuCisJICogV2UgY2FuJ3QgdXNlIHRoZSBidWZmZXIgYXMgaXMgc2luY2Ugc2l6ZSBtYXkgaGF2ZSBjaGFuZ2VkLgorCSAqLworCWlmIChmZWF0dXJlLT5kdW1wX2J1ZikgeworCQl2ZnJlZShmZWF0dXJlLT5kdW1wX2J1Zik7CisJCWZlYXR1cmUtPmR1bXBfYnVmID0gTlVMTDsKKwl9CisKKwkvKiBHZXQgYnVmZmVyIHNpemUgZnJvbSBoc2ksIGFsbG9jYXRlIGFjY29yZGluZ2x5LCBhbmQgcGVyZm9ybSB0aGUKKwkgKiBkdW1wLgorCSAqLworCXJjID0gcWVkX2ZlYXR1cmVzX2xvb2t1cFtmZWF0dXJlX2lkeF0uZ2V0X3NpemUocF9od2ZuLCBwX3B0dCwKKwkJCQkJCSAgICAgICAmYnVmX3NpemVfZHdvcmRzKTsKKwlpZiAocmMgIT0gREJHX1NUQVRVU19PSykKKwkJcmV0dXJuIHJjOworCWZlYXR1cmUtPmJ1Zl9zaXplID0gYnVmX3NpemVfZHdvcmRzICogc2l6ZW9mKHUzMik7CisJZmVhdHVyZS0+ZHVtcF9idWYgPSB2bWFsbG9jKGZlYXR1cmUtPmJ1Zl9zaXplKTsKKwlpZiAoIWZlYXR1cmUtPmR1bXBfYnVmKQorCQlyZXR1cm4gREJHX1NUQVRVU19WSVJUX01FTV9BTExPQ19GQUlMRUQ7CisKKwlyYyA9IHFlZF9mZWF0dXJlc19sb29rdXBbZmVhdHVyZV9pZHhdLgorCQlwZXJmb3JtX2R1bXAocF9od2ZuLCBwX3B0dCwgKHUzMiAqKWZlYXR1cmUtPmR1bXBfYnVmLAorCQkJICAgICBmZWF0dXJlLT5idWZfc2l6ZSAvIHNpemVvZih1MzIpLAorCQkJICAgICAmZmVhdHVyZS0+ZHVtcGVkX2R3b3Jkcyk7CisKKwkvKiBJZiBtY3AgaXMgc3R1Y2sgd2UgZ2V0IERCR19TVEFUVVNfTlZSQU1fR0VUX0lNQUdFX0ZBSUxFRCBlcnJvci4KKwkgKiBJbiB0aGlzIGNhc2UgdGhlIGJ1ZmZlciBob2xkcyB2YWxpZCBiaW5hcnkgZGF0YSwgYnV0IHdlIHdvbnQgYWJsZQorCSAqIHRvIHBhcnNlIGl0IChzaW5jZSBwYXJzaW5nIHJlbGllcyBvbiBkYXRhIGluIE5WUkFNIHdoaWNoIGlzIG9ubHkKKwkgKiBhY2Nlc3NpYmxlIHdoZW4gTUZXIGlzIHJlc3BvbnNpdmUpLiBza2lwIHRoZSBmb3JtYXR0aW5nIGJ1dCByZXR1cm4KKwkgKiBzdWNjZXNzIHNvIHRoYXQgYmluYXJ5IGRhdGEgaXMgcHJvdmlkZWQuCisJICovCisJaWYgKHJjID09IERCR19TVEFUVVNfTlZSQU1fR0VUX0lNQUdFX0ZBSUxFRCkKKwkJcmV0dXJuIERCR19TVEFUVVNfT0s7CisKKwlpZiAocmMgIT0gREJHX1NUQVRVU19PSykKKwkJcmV0dXJuIHJjOworCisJLyogRm9ybWF0IG91dHB1dCAqLworCXJjID0gZm9ybWF0X2ZlYXR1cmUocF9od2ZuLCBmZWF0dXJlX2lkeCk7CisJcmV0dXJuIHJjOworfQorCitpbnQgcWVkX2RiZ19ncmMoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHZvaWQgKmJ1ZmZlciwgdTMyICpudW1fZHVtcGVkX2J5dGVzKQoreworCXJldHVybiBxZWRfZGJnX2ZlYXR1cmUoY2RldiwgYnVmZmVyLCBEQkdfRkVBVFVSRV9HUkMsIG51bV9kdW1wZWRfYnl0ZXMpOworfQorCitpbnQgcWVkX2RiZ19ncmNfc2l6ZShzdHJ1Y3QgcWVkX2RldiAqY2RldikKK3sKKwlyZXR1cm4gcWVkX2RiZ19mZWF0dXJlX3NpemUoY2RldiwgREJHX0ZFQVRVUkVfR1JDKTsKK30KKworaW50IHFlZF9kYmdfaWRsZV9jaGsoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHZvaWQgKmJ1ZmZlciwgdTMyICpudW1fZHVtcGVkX2J5dGVzKQoreworCXJldHVybiBxZWRfZGJnX2ZlYXR1cmUoY2RldiwgYnVmZmVyLCBEQkdfRkVBVFVSRV9JRExFX0NISywKKwkJCSAgICAgICBudW1fZHVtcGVkX2J5dGVzKTsKK30KKworaW50IHFlZF9kYmdfaWRsZV9jaGtfc2l6ZShzdHJ1Y3QgcWVkX2RldiAqY2RldikKK3sKKwlyZXR1cm4gcWVkX2RiZ19mZWF0dXJlX3NpemUoY2RldiwgREJHX0ZFQVRVUkVfSURMRV9DSEspOworfQorCitpbnQgcWVkX2RiZ19yZWdfZmlmbyhzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgdm9pZCAqYnVmZmVyLCB1MzIgKm51bV9kdW1wZWRfYnl0ZXMpCit7CisJcmV0dXJuIHFlZF9kYmdfZmVhdHVyZShjZGV2LCBidWZmZXIsIERCR19GRUFUVVJFX1JFR19GSUZPLAorCQkJICAgICAgIG51bV9kdW1wZWRfYnl0ZXMpOworfQorCitpbnQgcWVkX2RiZ19yZWdfZmlmb19zaXplKHN0cnVjdCBxZWRfZGV2ICpjZGV2KQoreworCXJldHVybiBxZWRfZGJnX2ZlYXR1cmVfc2l6ZShjZGV2LCBEQkdfRkVBVFVSRV9SRUdfRklGTyk7Cit9CisKK2ludCBxZWRfZGJnX2lndV9maWZvKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCB2b2lkICpidWZmZXIsIHUzMiAqbnVtX2R1bXBlZF9ieXRlcykKK3sKKwlyZXR1cm4gcWVkX2RiZ19mZWF0dXJlKGNkZXYsIGJ1ZmZlciwgREJHX0ZFQVRVUkVfSUdVX0ZJRk8sCisJCQkgICAgICAgbnVtX2R1bXBlZF9ieXRlcyk7Cit9CisKK2ludCBxZWRfZGJnX2lndV9maWZvX3NpemUoc3RydWN0IHFlZF9kZXYgKmNkZXYpCit7CisJcmV0dXJuIHFlZF9kYmdfZmVhdHVyZV9zaXplKGNkZXYsIERCR19GRUFUVVJFX0lHVV9GSUZPKTsKK30KKworaW50IHFlZF9kYmdfcHJvdGVjdGlvbl9vdmVycmlkZShzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgdm9pZCAqYnVmZmVyLAorCQkJCXUzMiAqbnVtX2R1bXBlZF9ieXRlcykKK3sKKwlyZXR1cm4gcWVkX2RiZ19mZWF0dXJlKGNkZXYsIGJ1ZmZlciwgREJHX0ZFQVRVUkVfUFJPVEVDVElPTl9PVkVSUklERSwKKwkJCSAgICAgICBudW1fZHVtcGVkX2J5dGVzKTsKK30KKworaW50IHFlZF9kYmdfcHJvdGVjdGlvbl9vdmVycmlkZV9zaXplKHN0cnVjdCBxZWRfZGV2ICpjZGV2KQoreworCXJldHVybiBxZWRfZGJnX2ZlYXR1cmVfc2l6ZShjZGV2LCBEQkdfRkVBVFVSRV9QUk9URUNUSU9OX09WRVJSSURFKTsKK30KKworaW50IHFlZF9kYmdfZndfYXNzZXJ0cyhzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgdm9pZCAqYnVmZmVyLAorCQkgICAgICAgdTMyICpudW1fZHVtcGVkX2J5dGVzKQoreworCXJldHVybiBxZWRfZGJnX2ZlYXR1cmUoY2RldiwgYnVmZmVyLCBEQkdfRkVBVFVSRV9GV19BU1NFUlRTLAorCQkJICAgICAgIG51bV9kdW1wZWRfYnl0ZXMpOworfQorCitpbnQgcWVkX2RiZ19md19hc3NlcnRzX3NpemUoc3RydWN0IHFlZF9kZXYgKmNkZXYpCit7CisJcmV0dXJuIHFlZF9kYmdfZmVhdHVyZV9zaXplKGNkZXYsIERCR19GRUFUVVJFX0ZXX0FTU0VSVFMpOworfQorCitpbnQgcWVkX2RiZ19tY3BfdHJhY2Uoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHZvaWQgKmJ1ZmZlciwKKwkJICAgICAgdTMyICpudW1fZHVtcGVkX2J5dGVzKQoreworCXJldHVybiBxZWRfZGJnX2ZlYXR1cmUoY2RldiwgYnVmZmVyLCBEQkdfRkVBVFVSRV9NQ1BfVFJBQ0UsCisJCQkgICAgICAgbnVtX2R1bXBlZF9ieXRlcyk7Cit9CisKK2ludCBxZWRfZGJnX21jcF90cmFjZV9zaXplKHN0cnVjdCBxZWRfZGV2ICpjZGV2KQoreworCXJldHVybiBxZWRfZGJnX2ZlYXR1cmVfc2l6ZShjZGV2LCBEQkdfRkVBVFVSRV9NQ1BfVFJBQ0UpOworfQorCisvKiBEZWZpbmVzIHRoZSBhbW91bnQgb2YgYnl0ZXMgYWxsb2NhdGVkIGZvciByZWNvcmRpbmcgdGhlIGxlbmd0aCBvZiBkZWJ1Z2ZzCisgKiBmZWF0dXJlIGJ1ZmZlci4KKyAqLworI2RlZmluZSBSRUdEVU1QX0hFQURFUl9TSVpFCQkJc2l6ZW9mKHUzMikKKyNkZWZpbmUgUkVHRFVNUF9IRUFERVJfRkVBVFVSRV9TSElGVAkJMjQKKyNkZWZpbmUgUkVHRFVNUF9IRUFERVJfRU5HSU5FX1NISUZUCQkzMQorI2RlZmluZSBSRUdEVU1QX0hFQURFUl9PTUlUX0VOR0lORV9TSElGVAkzMAorZW51bSBkZWJ1Z19wcmludF9mZWF0dXJlcyB7CisJT0xEX01PREUgPSAwLAorCUlETEVfQ0hLID0gMSwKKwlHUkNfRFVNUCA9IDIsCisJTUNQX1RSQUNFID0gMywKKwlSRUdfRklGTyA9IDQsCisJUFJPVEVDVElPTl9PVkVSUklERSA9IDUsCisJSUdVX0ZJRk8gPSA2LAorCVBIWSA9IDcsCisJRldfQVNTRVJUUyA9IDgsCit9OworCitzdGF0aWMgdTMyIHFlZF9jYWxjX3JlZ2R1bXBfaGVhZGVyKGVudW0gZGVidWdfcHJpbnRfZmVhdHVyZXMgZmVhdHVyZSwKKwkJCQkgICBpbnQgZW5naW5lLCB1MzIgZmVhdHVyZV9zaXplLCB1OCBvbWl0X2VuZ2luZSkKK3sKKwkvKiBJbnNlcnQgdGhlIGVuZ2luZSwgZmVhdHVyZSBhbmQgbW9kZSBpbnNpZGUgdGhlIGhlYWRlciBhbmQgY29tYmluZSBpdAorCSAqIHdpdGggZmVhdHVyZSBzaXplLgorCSAqLworCXJldHVybiBmZWF0dXJlX3NpemUgfCAoZmVhdHVyZSA8PCBSRUdEVU1QX0hFQURFUl9GRUFUVVJFX1NISUZUKSB8CisJICAgICAgIChvbWl0X2VuZ2luZSA8PCBSRUdEVU1QX0hFQURFUl9PTUlUX0VOR0lORV9TSElGVCkgfAorCSAgICAgICAoZW5naW5lIDw8IFJFR0RVTVBfSEVBREVSX0VOR0lORV9TSElGVCk7Cit9CisKK2ludCBxZWRfZGJnX2FsbF9kYXRhKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCB2b2lkICpidWZmZXIpCit7CisJdTggY3VyX2VuZ2luZSwgb21pdF9lbmdpbmUgPSAwLCBvcmdfZW5naW5lOworCXUzMiBvZmZzZXQgPSAwLCBmZWF0dXJlX3NpemU7CisJaW50IHJjOworCisJaWYgKGNkZXYtPm51bV9od2ZucyA9PSAxKQorCQlvbWl0X2VuZ2luZSA9IDE7CisKKwlvcmdfZW5naW5lID0gcWVkX2dldF9kZWJ1Z19lbmdpbmUoY2Rldik7CisJZm9yIChjdXJfZW5naW5lID0gMDsgY3VyX2VuZ2luZSA8IGNkZXYtPm51bV9od2ZuczsgY3VyX2VuZ2luZSsrKSB7CisJCS8qIENvbGxlY3QgaWRsZV9jaGtzIGFuZCBncmNEdW1wIGZvciBlYWNoIGh3IGZ1bmN0aW9uICovCisJCURQX1ZFUkJPU0UoY2RldiwgUUVEX01TR19ERUJVRywKKwkJCSAgICJvYnRhaW5pbmcgaWRsZV9jaGsgYW5kIGdyY2R1bXAgZm9yIGN1cnJlbnQgZW5naW5lXG4iKTsKKwkJcWVkX3NldF9kZWJ1Z19lbmdpbmUoY2RldiwgY3VyX2VuZ2luZSk7CisKKwkJLyogRmlyc3QgaWRsZV9jaGsgKi8KKwkJcmMgPSBxZWRfZGJnX2lkbGVfY2hrKGNkZXYsICh1OCAqKWJ1ZmZlciArIG9mZnNldCArCisJCQkJICAgICAgUkVHRFVNUF9IRUFERVJfU0laRSwgJmZlYXR1cmVfc2l6ZSk7CisJCWlmICghcmMpIHsKKwkJCSoodTMyICopKCh1OCAqKWJ1ZmZlciArIG9mZnNldCkgPQorCQkJICAgIHFlZF9jYWxjX3JlZ2R1bXBfaGVhZGVyKElETEVfQ0hLLCBjdXJfZW5naW5lLAorCQkJCQkJICAgIGZlYXR1cmVfc2l6ZSwgb21pdF9lbmdpbmUpOworCQkJb2Zmc2V0ICs9IChmZWF0dXJlX3NpemUgKyBSRUdEVU1QX0hFQURFUl9TSVpFKTsKKwkJfSBlbHNlIHsKKwkJCURQX0VSUihjZGV2LCAicWVkX2RiZ19pZGxlX2NoayBmYWlsZWQuIHJjID0gJWRcbiIsIHJjKTsKKwkJfQorCisJCS8qIFNlY29uZCBpZGxlX2NoayAqLworCQlyYyA9IHFlZF9kYmdfaWRsZV9jaGsoY2RldiwgKHU4ICopYnVmZmVyICsgb2Zmc2V0ICsKKwkJCQkgICAgICBSRUdEVU1QX0hFQURFUl9TSVpFLCAmZmVhdHVyZV9zaXplKTsKKwkJaWYgKCFyYykgeworCQkJKih1MzIgKikoKHU4ICopYnVmZmVyICsgb2Zmc2V0KSA9CisJCQkgICAgcWVkX2NhbGNfcmVnZHVtcF9oZWFkZXIoSURMRV9DSEssIGN1cl9lbmdpbmUsCisJCQkJCQkgICAgZmVhdHVyZV9zaXplLCBvbWl0X2VuZ2luZSk7CisJCQlvZmZzZXQgKz0gKGZlYXR1cmVfc2l6ZSArIFJFR0RVTVBfSEVBREVSX1NJWkUpOworCQl9IGVsc2UgeworCQkJRFBfRVJSKGNkZXYsICJxZWRfZGJnX2lkbGVfY2hrIGZhaWxlZC4gcmMgPSAlZFxuIiwgcmMpOworCQl9CisKKwkJLyogcmVnX2ZpZm8gZHVtcCAqLworCQlyYyA9IHFlZF9kYmdfcmVnX2ZpZm8oY2RldiwgKHU4ICopYnVmZmVyICsgb2Zmc2V0ICsKKwkJCQkgICAgICBSRUdEVU1QX0hFQURFUl9TSVpFLCAmZmVhdHVyZV9zaXplKTsKKwkJaWYgKCFyYykgeworCQkJKih1MzIgKikoKHU4ICopYnVmZmVyICsgb2Zmc2V0KSA9CisJCQkgICAgcWVkX2NhbGNfcmVnZHVtcF9oZWFkZXIoUkVHX0ZJRk8sIGN1cl9lbmdpbmUsCisJCQkJCQkgICAgZmVhdHVyZV9zaXplLCBvbWl0X2VuZ2luZSk7CisJCQlvZmZzZXQgKz0gKGZlYXR1cmVfc2l6ZSArIFJFR0RVTVBfSEVBREVSX1NJWkUpOworCQl9IGVsc2UgeworCQkJRFBfRVJSKGNkZXYsICJxZWRfZGJnX3JlZ19maWZvIGZhaWxlZC4gcmMgPSAlZFxuIiwgcmMpOworCQl9CisKKwkJLyogaWd1X2ZpZm8gZHVtcCAqLworCQlyYyA9IHFlZF9kYmdfaWd1X2ZpZm8oY2RldiwgKHU4ICopYnVmZmVyICsgb2Zmc2V0ICsKKwkJCQkgICAgICBSRUdEVU1QX0hFQURFUl9TSVpFLCAmZmVhdHVyZV9zaXplKTsKKwkJaWYgKCFyYykgeworCQkJKih1MzIgKikoKHU4ICopYnVmZmVyICsgb2Zmc2V0KSA9CisJCQkgICAgcWVkX2NhbGNfcmVnZHVtcF9oZWFkZXIoSUdVX0ZJRk8sIGN1cl9lbmdpbmUsCisJCQkJCQkgICAgZmVhdHVyZV9zaXplLCBvbWl0X2VuZ2luZSk7CisJCQlvZmZzZXQgKz0gKGZlYXR1cmVfc2l6ZSArIFJFR0RVTVBfSEVBREVSX1NJWkUpOworCQl9IGVsc2UgeworCQkJRFBfRVJSKGNkZXYsICJxZWRfZGJnX2lndV9maWZvIGZhaWxlZC4gcmMgPSAlZCIsIHJjKTsKKwkJfQorCisJCS8qIHByb3RlY3Rpb25fb3ZlcnJpZGUgZHVtcCAqLworCQlyYyA9IHFlZF9kYmdfcHJvdGVjdGlvbl9vdmVycmlkZShjZGV2LCAodTggKilidWZmZXIgKyBvZmZzZXQgKworCQkJCQkJIFJFR0RVTVBfSEVBREVSX1NJWkUsCisJCQkJCQkgJmZlYXR1cmVfc2l6ZSk7CisJCWlmICghcmMpIHsKKwkJCSoodTMyICopKCh1OCAqKWJ1ZmZlciArIG9mZnNldCkgPQorCQkJICAgIHFlZF9jYWxjX3JlZ2R1bXBfaGVhZGVyKFBST1RFQ1RJT05fT1ZFUlJJREUsCisJCQkJCQkgICAgY3VyX2VuZ2luZSwKKwkJCQkJCSAgICBmZWF0dXJlX3NpemUsIG9taXRfZW5naW5lKTsKKwkJCW9mZnNldCArPSAoZmVhdHVyZV9zaXplICsgUkVHRFVNUF9IRUFERVJfU0laRSk7CisJCX0gZWxzZSB7CisJCQlEUF9FUlIoY2RldiwKKwkJCSAgICAgICAicWVkX2RiZ19wcm90ZWN0aW9uX292ZXJyaWRlIGZhaWxlZC4gcmMgPSAlZFxuIiwKKwkJCSAgICAgICByYyk7CisJCX0KKworCQkvKiBmd19hc3NlcnRzIGR1bXAgKi8KKwkJcmMgPSBxZWRfZGJnX2Z3X2Fzc2VydHMoY2RldiwgKHU4ICopYnVmZmVyICsgb2Zmc2V0ICsKKwkJCQkJUkVHRFVNUF9IRUFERVJfU0laRSwgJmZlYXR1cmVfc2l6ZSk7CisJCWlmICghcmMpIHsKKwkJCSoodTMyICopKCh1OCAqKWJ1ZmZlciArIG9mZnNldCkgPQorCQkJICAgIHFlZF9jYWxjX3JlZ2R1bXBfaGVhZGVyKEZXX0FTU0VSVFMsIGN1cl9lbmdpbmUsCisJCQkJCQkgICAgZmVhdHVyZV9zaXplLCBvbWl0X2VuZ2luZSk7CisJCQlvZmZzZXQgKz0gKGZlYXR1cmVfc2l6ZSArIFJFR0RVTVBfSEVBREVSX1NJWkUpOworCQl9IGVsc2UgeworCQkJRFBfRVJSKGNkZXYsICJxZWRfZGJnX2Z3X2Fzc2VydHMgZmFpbGVkLiByYyA9ICVkXG4iLAorCQkJICAgICAgIHJjKTsKKwkJfQorCisJCS8qIEdSQyBkdW1wIC0gbXVzdCBiZSBsYXN0IGJlY2F1c2Ugd2hlbiBtY3Agc3R1Y2sgaXQgd2lsbAorCQkgKiBjbHV0dGVyIGlkbGVfY2hrLCByZWdfZmlmbywgLi4uCisJCSAqLworCQlyYyA9IHFlZF9kYmdfZ3JjKGNkZXYsICh1OCAqKWJ1ZmZlciArIG9mZnNldCArCisJCQkJIFJFR0RVTVBfSEVBREVSX1NJWkUsICZmZWF0dXJlX3NpemUpOworCQlpZiAoIXJjKSB7CisJCQkqKHUzMiAqKSgodTggKilidWZmZXIgKyBvZmZzZXQpID0KKwkJCSAgICBxZWRfY2FsY19yZWdkdW1wX2hlYWRlcihHUkNfRFVNUCwgY3VyX2VuZ2luZSwKKwkJCQkJCSAgICBmZWF0dXJlX3NpemUsIG9taXRfZW5naW5lKTsKKwkJCW9mZnNldCArPSAoZmVhdHVyZV9zaXplICsgUkVHRFVNUF9IRUFERVJfU0laRSk7CisJCX0gZWxzZSB7CisJCQlEUF9FUlIoY2RldiwgInFlZF9kYmdfZ3JjIGZhaWxlZC4gcmMgPSAlZCIsIHJjKTsKKwkJfQorCX0KKworCS8qIG1jcF90cmFjZSAqLworCXJjID0gcWVkX2RiZ19tY3BfdHJhY2UoY2RldiwgKHU4ICopYnVmZmVyICsgb2Zmc2V0ICsKKwkJCSAgICAgICBSRUdEVU1QX0hFQURFUl9TSVpFLCAmZmVhdHVyZV9zaXplKTsKKwlpZiAoIXJjKSB7CisJCSoodTMyICopKCh1OCAqKWJ1ZmZlciArIG9mZnNldCkgPQorCQkgICAgcWVkX2NhbGNfcmVnZHVtcF9oZWFkZXIoTUNQX1RSQUNFLCBjdXJfZW5naW5lLAorCQkJCQkgICAgZmVhdHVyZV9zaXplLCBvbWl0X2VuZ2luZSk7CisJCW9mZnNldCArPSAoZmVhdHVyZV9zaXplICsgUkVHRFVNUF9IRUFERVJfU0laRSk7CisJfSBlbHNlIHsKKwkJRFBfRVJSKGNkZXYsICJxZWRfZGJnX21jcF90cmFjZSBmYWlsZWQuIHJjID0gJWRcbiIsIHJjKTsKKwl9CisKKwlxZWRfc2V0X2RlYnVnX2VuZ2luZShjZGV2LCBvcmdfZW5naW5lKTsKKworCXJldHVybiAwOworfQorCitpbnQgcWVkX2RiZ19hbGxfZGF0YV9zaXplKHN0cnVjdCBxZWRfZGV2ICpjZGV2KQoreworCXU4IGN1cl9lbmdpbmUsIG9yZ19lbmdpbmU7CisJdTMyIHJlZ3NfbGVuID0gMDsKKworCW9yZ19lbmdpbmUgPSBxZWRfZ2V0X2RlYnVnX2VuZ2luZShjZGV2KTsKKwlmb3IgKGN1cl9lbmdpbmUgPSAwOyBjdXJfZW5naW5lIDwgY2Rldi0+bnVtX2h3Zm5zOyBjdXJfZW5naW5lKyspIHsKKwkJLyogRW5naW5lIHNwZWNpZmljICovCisJCURQX1ZFUkJPU0UoY2RldiwgUUVEX01TR19ERUJVRywKKwkJCSAgICJjYWxjdWxhdGluZyBpZGxlX2NoayBhbmQgZ3JjZHVtcCByZWdpc3RlciBsZW5ndGggZm9yIGN1cnJlbnQgZW5naW5lXG4iKTsKKwkJcWVkX3NldF9kZWJ1Z19lbmdpbmUoY2RldiwgY3VyX2VuZ2luZSk7CisJCXJlZ3NfbGVuICs9IFJFR0RVTVBfSEVBREVSX1NJWkUgKyBxZWRfZGJnX2lkbGVfY2hrX3NpemUoY2RldikgKworCQkJICAgIFJFR0RVTVBfSEVBREVSX1NJWkUgKyBxZWRfZGJnX2lkbGVfY2hrX3NpemUoY2RldikgKworCQkJICAgIFJFR0RVTVBfSEVBREVSX1NJWkUgKyBxZWRfZGJnX2dyY19zaXplKGNkZXYpICsKKwkJCSAgICBSRUdEVU1QX0hFQURFUl9TSVpFICsgcWVkX2RiZ19yZWdfZmlmb19zaXplKGNkZXYpICsKKwkJCSAgICBSRUdEVU1QX0hFQURFUl9TSVpFICsgcWVkX2RiZ19pZ3VfZmlmb19zaXplKGNkZXYpICsKKwkJCSAgICBSRUdEVU1QX0hFQURFUl9TSVpFICsKKwkJCSAgICBxZWRfZGJnX3Byb3RlY3Rpb25fb3ZlcnJpZGVfc2l6ZShjZGV2KSArCisJCQkgICAgUkVHRFVNUF9IRUFERVJfU0laRSArIHFlZF9kYmdfZndfYXNzZXJ0c19zaXplKGNkZXYpOworCX0KKworCS8qIEVuZ2luZSBjb21tb24gKi8KKwlyZWdzX2xlbiArPSBSRUdEVU1QX0hFQURFUl9TSVpFICsgcWVkX2RiZ19tY3BfdHJhY2Vfc2l6ZShjZGV2KTsKKwlxZWRfc2V0X2RlYnVnX2VuZ2luZShjZGV2LCBvcmdfZW5naW5lKTsKKworCXJldHVybiByZWdzX2xlbjsKK30KKworaW50IHFlZF9kYmdfZmVhdHVyZShzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgdm9pZCAqYnVmZmVyLAorCQkgICAgZW51bSBxZWRfZGJnX2ZlYXR1cmVzIGZlYXR1cmUsIHUzMiAqbnVtX2R1bXBlZF9ieXRlcykKK3sKKwlzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiA9CisJCSZjZGV2LT5od2Zuc1tjZGV2LT5kYmdfcGFyYW1zLmVuZ2luZV9mb3JfZGVidWddOworCXN0cnVjdCBxZWRfZGJnX2ZlYXR1cmUgKnFlZF9mZWF0dXJlID0KKwkJJmNkZXYtPmRiZ19wYXJhbXMuZmVhdHVyZXNbZmVhdHVyZV07CisJZW51bSBkYmdfc3RhdHVzIGRiZ19yYzsKKwlzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQ7CisJaW50IHJjID0gMDsKKworCS8qIEFjcXVpcmUgcHR0ICovCisJcF9wdHQgPSBxZWRfcHR0X2FjcXVpcmUocF9od2ZuKTsKKwlpZiAoIXBfcHR0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEdldCBkdW1wICovCisJZGJnX3JjID0gcWVkX2RiZ19kdW1wKHBfaHdmbiwgcF9wdHQsIGZlYXR1cmUpOworCWlmIChkYmdfcmMgIT0gREJHX1NUQVRVU19PSykgeworCQlEUF9WRVJCT1NFKGNkZXYsIFFFRF9NU0dfREVCVUcsICIlc1xuIiwKKwkJCSAgIHFlZF9kYmdfZ2V0X3N0YXR1c19zdHIoZGJnX3JjKSk7CisJCSpudW1fZHVtcGVkX2J5dGVzID0gMDsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlEUF9WRVJCT1NFKGNkZXYsIFFFRF9NU0dfREVCVUcsCisJCSAgICJjb3B5aW5nIGRlYnVnZnMgZmVhdHVyZSB0byBleHRlcm5hbCBidWZmZXJcbiIpOworCW1lbWNweShidWZmZXIsIHFlZF9mZWF0dXJlLT5kdW1wX2J1ZiwgcWVkX2ZlYXR1cmUtPmJ1Zl9zaXplKTsKKwkqbnVtX2R1bXBlZF9ieXRlcyA9IGNkZXYtPmRiZ19wYXJhbXMuZmVhdHVyZXNbZmVhdHVyZV0uZHVtcGVkX2R3b3JkcyAqCisJCQkgICAgNDsKKworb3V0OgorCXFlZF9wdHRfcmVsZWFzZShwX2h3Zm4sIHBfcHR0KTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBxZWRfZGJnX2ZlYXR1cmVfc2l6ZShzdHJ1Y3QgcWVkX2RldiAqY2RldiwgZW51bSBxZWRfZGJnX2ZlYXR1cmVzIGZlYXR1cmUpCit7CisJc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4gPQorCQkmY2Rldi0+aHdmbnNbY2Rldi0+ZGJnX3BhcmFtcy5lbmdpbmVfZm9yX2RlYnVnXTsKKwlzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQgPSBxZWRfcHR0X2FjcXVpcmUocF9od2ZuKTsKKwlzdHJ1Y3QgcWVkX2RiZ19mZWF0dXJlICpxZWRfZmVhdHVyZSA9CisJCSZjZGV2LT5kYmdfcGFyYW1zLmZlYXR1cmVzW2ZlYXR1cmVdOworCXUzMiBidWZfc2l6ZV9kd29yZHM7CisJZW51bSBkYmdfc3RhdHVzIHJjOworCisJaWYgKCFwX3B0dCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyYyA9IHFlZF9mZWF0dXJlc19sb29rdXBbZmVhdHVyZV0uZ2V0X3NpemUocF9od2ZuLCBwX3B0dCwKKwkJCQkJCSAgICZidWZfc2l6ZV9kd29yZHMpOworCWlmIChyYyAhPSBEQkdfU1RBVFVTX09LKQorCQlidWZfc2l6ZV9kd29yZHMgPSAwOworCisJcWVkX3B0dF9yZWxlYXNlKHBfaHdmbiwgcF9wdHQpOworCXFlZF9mZWF0dXJlLT5idWZfc2l6ZSA9IGJ1Zl9zaXplX2R3b3JkcyAqIHNpemVvZih1MzIpOworCXJldHVybiBxZWRfZmVhdHVyZS0+YnVmX3NpemU7Cit9CisKK3U4IHFlZF9nZXRfZGVidWdfZW5naW5lKHN0cnVjdCBxZWRfZGV2ICpjZGV2KQoreworCXJldHVybiBjZGV2LT5kYmdfcGFyYW1zLmVuZ2luZV9mb3JfZGVidWc7Cit9CisKK3ZvaWQgcWVkX3NldF9kZWJ1Z19lbmdpbmUoc3RydWN0IHFlZF9kZXYgKmNkZXYsIGludCBlbmdpbmVfbnVtYmVyKQoreworCURQX1ZFUkJPU0UoY2RldiwgUUVEX01TR19ERUJVRywgInNldCBkZWJ1ZyBlbmdpbmUgdG8gJWRcbiIsCisJCSAgIGVuZ2luZV9udW1iZXIpOworCWNkZXYtPmRiZ19wYXJhbXMuZW5naW5lX2Zvcl9kZWJ1ZyA9IGVuZ2luZV9udW1iZXI7Cit9CisKK3ZvaWQgcWVkX2RiZ19wZl9pbml0KHN0cnVjdCBxZWRfZGV2ICpjZGV2KQoreworCWNvbnN0IHU4ICpkYmdfdmFsdWVzOworCisJLyogRGVidWcgdmFsdWVzIGFyZSBhZnRlciBpbml0IHZhbHVlcy4KKwkgKiBUaGUgb2Zmc2V0IGlzIHRoZSBmaXJzdCBkd29yZCBvZiB0aGUgZmlsZS4KKwkgKi8KKwlkYmdfdmFsdWVzID0gY2Rldi0+ZmlybXdhcmUtPmRhdGEgKyAqKHUzMiAqKWNkZXYtPmZpcm13YXJlLT5kYXRhOworCXFlZF9kYmdfc2V0X2Jpbl9wdHIoKHU4ICopZGJnX3ZhbHVlcyk7CisJcWVkX2RiZ191c2VyX3NldF9iaW5fcHRyKCh1OCAqKWRiZ192YWx1ZXMpOworfQorCit2b2lkIHFlZF9kYmdfcGZfZXhpdChzdHJ1Y3QgcWVkX2RldiAqY2RldikKK3sKKwlzdHJ1Y3QgcWVkX2RiZ19mZWF0dXJlICpmZWF0dXJlID0gTlVMTDsKKwllbnVtIHFlZF9kYmdfZmVhdHVyZXMgZmVhdHVyZV9pZHg7CisKKwkvKiBEZWJ1ZyBmZWF0dXJlcycgYnVmZmVycyBtYXkgYmUgYWxsb2NhdGVkIGlmIGRlYnVnIGZlYXR1cmUgd2FzIHVzZWQKKwkgKiBidXQgZHVtcCB3YXNuJ3QgY2FsbGVkLgorCSAqLworCWZvciAoZmVhdHVyZV9pZHggPSAwOyBmZWF0dXJlX2lkeCA8IERCR19GRUFUVVJFX05VTTsgZmVhdHVyZV9pZHgrKykgeworCQlmZWF0dXJlID0gJmNkZXYtPmRiZ19wYXJhbXMuZmVhdHVyZXNbZmVhdHVyZV9pZHhdOworCQlpZiAoZmVhdHVyZS0+ZHVtcF9idWYpIHsKKwkJCXZmcmVlKGZlYXR1cmUtPmR1bXBfYnVmKTsKKwkJCWZlYXR1cmUtPmR1bXBfYnVmID0gTlVMTDsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2RlYnVnLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NzJkNzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9kZWJ1Zy5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qIFFMb2dpYyBxZWQgTklDIERyaXZlcgorICogQ29weXJpZ2h0IChjKSAyMDE1IFFMb2dpYyBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YKKyAqIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2lmbmRlZiBfUUVEX0RFQlVHRlNfSAorI2RlZmluZSBfUUVEX0RFQlVHRlNfSAorCitlbnVtIHFlZF9kYmdfZmVhdHVyZXMgeworCURCR19GRUFUVVJFX0dSQywKKwlEQkdfRkVBVFVSRV9JRExFX0NISywKKwlEQkdfRkVBVFVSRV9NQ1BfVFJBQ0UsCisJREJHX0ZFQVRVUkVfUkVHX0ZJRk8sCisJREJHX0ZFQVRVUkVfSUdVX0ZJRk8sCisJREJHX0ZFQVRVUkVfUFJPVEVDVElPTl9PVkVSUklERSwKKwlEQkdfRkVBVFVSRV9GV19BU1NFUlRTLAorCURCR19GRUFUVVJFX05VTQorfTsKKworaW50IHFlZF9kYmdfZ3JjKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCB2b2lkICpidWZmZXIsIHUzMiAqbnVtX2R1bXBlZF9ieXRlcyk7CitpbnQgcWVkX2RiZ19ncmNfc2l6ZShzdHJ1Y3QgcWVkX2RldiAqY2Rldik7CitpbnQgcWVkX2RiZ19pZGxlX2NoayhzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgdm9pZCAqYnVmZmVyLAorCQkgICAgIHUzMiAqbnVtX2R1bXBlZF9ieXRlcyk7CitpbnQgcWVkX2RiZ19pZGxlX2Noa19zaXplKHN0cnVjdCBxZWRfZGV2ICpjZGV2KTsKK2ludCBxZWRfZGJnX3JlZ19maWZvKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCB2b2lkICpidWZmZXIsCisJCSAgICAgdTMyICpudW1fZHVtcGVkX2J5dGVzKTsKK2ludCBxZWRfZGJnX3JlZ19maWZvX3NpemUoc3RydWN0IHFlZF9kZXYgKmNkZXYpOworaW50IHFlZF9kYmdfaWd1X2ZpZm8oc3RydWN0IHFlZF9kZXYgKmNkZXYsIHZvaWQgKmJ1ZmZlciwKKwkJICAgICB1MzIgKm51bV9kdW1wZWRfYnl0ZXMpOworaW50IHFlZF9kYmdfaWd1X2ZpZm9fc2l6ZShzdHJ1Y3QgcWVkX2RldiAqY2Rldik7CitpbnQgcWVkX2RiZ19wcm90ZWN0aW9uX292ZXJyaWRlKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCB2b2lkICpidWZmZXIsCisJCQkJdTMyICpudW1fZHVtcGVkX2J5dGVzKTsKK2ludCBxZWRfZGJnX3Byb3RlY3Rpb25fb3ZlcnJpZGVfc2l6ZShzdHJ1Y3QgcWVkX2RldiAqY2Rldik7CitpbnQgcWVkX2RiZ19md19hc3NlcnRzKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCB2b2lkICpidWZmZXIsCisJCSAgICAgICB1MzIgKm51bV9kdW1wZWRfYnl0ZXMpOworaW50IHFlZF9kYmdfZndfYXNzZXJ0c19zaXplKHN0cnVjdCBxZWRfZGV2ICpjZGV2KTsKK2ludCBxZWRfZGJnX21jcF90cmFjZShzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgdm9pZCAqYnVmZmVyLAorCQkgICAgICB1MzIgKm51bV9kdW1wZWRfYnl0ZXMpOworaW50IHFlZF9kYmdfbWNwX3RyYWNlX3NpemUoc3RydWN0IHFlZF9kZXYgKmNkZXYpOworaW50IHFlZF9kYmdfYWxsX2RhdGEoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHZvaWQgKmJ1ZmZlcik7CitpbnQgcWVkX2RiZ19hbGxfZGF0YV9zaXplKHN0cnVjdCBxZWRfZGV2ICpjZGV2KTsKK3U4IHFlZF9nZXRfZGVidWdfZW5naW5lKHN0cnVjdCBxZWRfZGV2ICpjZGV2KTsKK3ZvaWQgcWVkX3NldF9kZWJ1Z19lbmdpbmUoc3RydWN0IHFlZF9kZXYgKmNkZXYsIGludCBlbmdpbmVfbnVtYmVyKTsKK2ludCBxZWRfZGJnX2ZlYXR1cmUoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHZvaWQgKmJ1ZmZlciwKKwkJICAgIGVudW0gcWVkX2RiZ19mZWF0dXJlcyBmZWF0dXJlLCB1MzIgKm51bV9kdW1wZWRfYnl0ZXMpOworaW50IHFlZF9kYmdfZmVhdHVyZV9zaXplKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCBlbnVtIHFlZF9kYmdfZmVhdHVyZXMgZmVhdHVyZSk7CisKK3ZvaWQgcWVkX2RiZ19wZl9pbml0KHN0cnVjdCBxZWRfZGV2ICpjZGV2KTsKK3ZvaWQgcWVkX2RiZ19wZl9leGl0KHN0cnVjdCBxZWRfZGV2ICpjZGV2KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9kZXYuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2Rldi5jCmluZGV4IDBlNGY0YTkuLjc1NGY2YTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2Rldi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2Rldi5jCkBAIC0yOSwxNCArMjksMTggQEAKICNpbmNsdWRlICJxZWRfaHcuaCIKICNpbmNsdWRlICJxZWRfaW5pdF9vcHMuaCIKICNpbmNsdWRlICJxZWRfaW50LmgiCisjaW5jbHVkZSAicWVkX2xsMi5oIgogI2luY2x1ZGUgInFlZF9tY3AuaCIKICNpbmNsdWRlICJxZWRfcmVnX2FkZHIuaCIKICNpbmNsdWRlICJxZWRfc3AuaCIKICNpbmNsdWRlICJxZWRfc3Jpb3YuaCIKICNpbmNsdWRlICJxZWRfdmYuaCIKKyNpbmNsdWRlICJxZWRfcm9jZS5oIgogCi1zdGF0aWMgc3BpbmxvY2tfdCBxbV9sb2NrOwotc3RhdGljIGJvb2wgcW1fbG9ja19pbml0ID0gZmFsc2U7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHFtX2xvY2spOworCisjZGVmaW5lIFFFRF9NSU5fRFBJUyAgICAgICAgICAgICg0KQorI2RlZmluZSBRRURfTUlOX1BXTV9SRUdJT04gICAgICAoUUVEX1dJRF9TSVpFICogUUVEX01JTl9EUElTKQogCiAvKiBBUEkgY29tbW9uIHRvIGFsbCBwcm90b2NvbHMgKi8KIGVudW0gQkFSX0lEIHsKQEAgLTQ0LDggKzQ4LDcgQEAKIAlCQVJfSURfMSAgICAgICAgLyogVXNlZCBmb3IgZG9vcmJlbGxzICovCiB9OwogCi1zdGF0aWMgdTMyIHFlZF9od19iYXJfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4JKnBfaHdmbiwKLQkJCSAgIGVudW0gQkFSX0lECQliYXJfaWQpCitzdGF0aWMgdTMyIHFlZF9od19iYXJfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgZW51bSBCQVJfSUQgYmFyX2lkKQogewogCXUzMiBiYXJfcmVnID0gKGJhcl9pZCA9PSBCQVJfSURfMCA/CiAJCSAgICAgICBQR0xVRV9CX1JFR19QRl9CQVIwX1NJWkUgOiBQR0xVRV9CX1JFR19QRl9CQVIxX1NJWkUpOwpAQCAtNzAsOCArNzMsNyBAQAogCX0KIH0KIAotdm9pZCBxZWRfaW5pdF9kcChzdHJ1Y3QgcWVkX2RldiAqY2RldiwKLQkJIHUzMiBkcF9tb2R1bGUsIHU4IGRwX2xldmVsKQordm9pZCBxZWRfaW5pdF9kcChzdHJ1Y3QgcWVkX2RldiAqY2RldiwgdTMyIGRwX21vZHVsZSwgdTggZHBfbGV2ZWwpCiB7CiAJdTMyIGk7CiAKQEAgLTE1MCw2ICsxNTIsOSBAQAogCQlxZWRfZXFfZnJlZShwX2h3Zm4sIHBfaHdmbi0+cF9lcSk7CiAJCXFlZF9jb25zcV9mcmVlKHBfaHdmbiwgcF9od2ZuLT5wX2NvbnNxKTsKIAkJcWVkX2ludF9mcmVlKHBfaHdmbik7CisjaWZkZWYgQ09ORklHX1FFRF9MTDIKKwkJcWVkX2xsMl9mcmVlKHBfaHdmbiwgcF9od2ZuLT5wX2xsMl9pbmZvKTsKKyNlbmRpZgogCQlxZWRfaW92X2ZyZWUocF9od2ZuKTsKIAkJcWVkX2RtYWVfaW5mb19mcmVlKHBfaHdmbik7CiAJCXFlZF9kY2J4X2luZm9fZnJlZShwX2h3Zm4sIHBfaHdmbi0+cF9kY2J4X2luZm8pOwpAQCAtMzQzLDcgKzM0OCw2IEBACiAJcmV0dXJuIDA7CiAKIGFsbG9jX2VycjoKLQlEUF9OT1RJQ0UocF9od2ZuLCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgUU0gcGFyYW1zXG4iKTsKIAlxZWRfcW1faW5mb19mcmVlKHBfaHdmbik7CiAJcmV0dXJuIC1FTk9NRU07CiB9CkBAIC00MDcsNiArNDExLDkgQEAKIAogaW50IHFlZF9yZXNjX2FsbG9jKHN0cnVjdCBxZWRfZGV2ICpjZGV2KQogeworI2lmZGVmIENPTkZJR19RRURfTEwyCisJc3RydWN0IHFlZF9sbDJfaW5mbyAqcF9sbDJfaW5mbzsKKyNlbmRpZgogCXN0cnVjdCBxZWRfY29uc3EgKnBfY29uc3E7CiAJc3RydWN0IHFlZF9lcSAqcF9lcTsKIAlpbnQgaSwgcmMgPSAwOwpAQCAtNDI3LDE4ICs0MzQsMTIgQEAKIAkJCQkgICAgIFJFU0NfTlVNKHBfaHdmbiwgUUVEX0wyX1FVRVVFKTsKIAogCQlwX2h3Zm4tPnBfdHhfY2lkcyA9IGt6YWxsb2ModHhfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcF9od2ZuLT5wX3R4X2NpZHMpIHsKLQkJCURQX05PVElDRShwX2h3Zm4sCi0JCQkJICAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgVHggQ2lkc1xuIik7CisJCWlmICghcF9od2ZuLT5wX3R4X2NpZHMpCiAJCQlnb3RvIGFsbG9jX25vX21lbTsKLQkJfQogCiAJCXBfaHdmbi0+cF9yeF9jaWRzID0ga3phbGxvYyhyeF9zaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFwX2h3Zm4tPnBfcnhfY2lkcykgewotCQkJRFBfTk9USUNFKHBfaHdmbiwKLQkJCQkgICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBSeCBDaWRzXG4iKTsKKwkJaWYgKCFwX2h3Zm4tPnBfcnhfY2lkcykKIAkJCWdvdG8gYWxsb2Nfbm9fbWVtOwotCQl9CiAJfQogCiAJZm9yX2VhY2hfaHdmbihjZGV2LCBpKSB7CkBAIC01MjMsMjkgKzUyNCwyOSBAQAogCQkJZ290byBhbGxvY19ub19tZW07CiAJCXBfaHdmbi0+cF9jb25zcSA9IHBfY29uc3E7CiAKKyNpZmRlZiBDT05GSUdfUUVEX0xMMgorCQlpZiAocF9od2ZuLT51c2luZ19sbDIpIHsKKwkJCXBfbGwyX2luZm8gPSBxZWRfbGwyX2FsbG9jKHBfaHdmbik7CisJCQlpZiAoIXBfbGwyX2luZm8pCisJCQkJZ290byBhbGxvY19ub19tZW07CisJCQlwX2h3Zm4tPnBfbGwyX2luZm8gPSBwX2xsMl9pbmZvOworCQl9CisjZW5kaWYKKwogCQkvKiBETUEgaW5mbyBpbml0aWFsaXphdGlvbiAqLwogCQlyYyA9IHFlZF9kbWFlX2luZm9fYWxsb2MocF9od2ZuKTsKLQkJaWYgKHJjKSB7Ci0JCQlEUF9OT1RJQ0UocF9od2ZuLAotCQkJCSAgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRtYWVfaW5mbyBzdHJ1Y3R1cmVcbiIpOworCQlpZiAocmMpCiAJCQlnb3RvIGFsbG9jX2VycjsKLQkJfQogCiAJCS8qIERDQlggaW5pdGlhbGl6YXRpb24gKi8KIAkJcmMgPSBxZWRfZGNieF9pbmZvX2FsbG9jKHBfaHdmbik7Ci0JCWlmIChyYykgewotCQkJRFBfTk9USUNFKHBfaHdmbiwKLQkJCQkgICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBkY2J4IHN0cnVjdHVyZVxuIik7CisJCWlmIChyYykKIAkJCWdvdG8gYWxsb2NfZXJyOwotCQl9CiAJfQogCiAJY2Rldi0+cmVzZXRfc3RhdHMgPSBremFsbG9jKHNpemVvZigqY2Rldi0+cmVzZXRfc3RhdHMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNkZXYtPnJlc2V0X3N0YXRzKSB7Ci0JCURQX05PVElDRShjZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlc2V0IHN0YXRpc3RpY3NcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gYWxsb2NfZXJyOwotCX0KKwlpZiAoIWNkZXYtPnJlc2V0X3N0YXRzKQorCQlnb3RvIGFsbG9jX25vX21lbTsKIAogCXJldHVybiAwOwogCkBAIC01ODAsNiArNTgxLDEwIEBACiAJCXFlZF9pbnRfc2V0dXAocF9od2ZuLCBwX2h3Zm4tPnBfbWFpbl9wdHQpOwogCiAJCXFlZF9pb3Zfc2V0dXAocF9od2ZuLCBwX2h3Zm4tPnBfbWFpbl9wdHQpOworI2lmZGVmIENPTkZJR19RRURfTEwyCisJCWlmIChwX2h3Zm4tPnVzaW5nX2xsMikKKwkJCXFlZF9sbDJfc2V0dXAocF9od2ZuLCBwX2h3Zm4tPnBfbGwyX2luZm8pOworI2VuZGlmCiAJfQogfQogCkBAIC02MDUsOSArNjEwLDggQEAKIAogCS8qIE1ha2Ugc3VyZSBub3RpZmljYXRpb24gaXMgbm90IHNldCBiZWZvcmUgaW5pdGlhdGluZyBmaW5hbCBjbGVhbnVwICovCiAJaWYgKFJFR19SRChwX2h3Zm4sIGFkZHIpKSB7Ci0JCURQX05PVElDRSgKLQkJCXBfaHdmbiwKLQkJCSJVbmV4cGVjdGVkOyBGb3VuZCBmaW5hbCBjbGVhbnVwIG5vdGlmaWNhdGlvbiBiZWZvcmUgaW5pdGlhdGluZyBmaW5hbCBjbGVhbnVwXG4iKTsKKwkJRFBfTk9USUNFKHBfaHdmbiwKKwkJCSAgIlVuZXhwZWN0ZWQ7IEZvdW5kIGZpbmFsIGNsZWFudXAgbm90aWZpY2F0aW9uIGJlZm9yZSBpbml0aWF0aW5nIGZpbmFsIGNsZWFudXBcbiIpOwogCQlSRUdfV1IocF9od2ZuLCBhZGRyLCAwKTsKIAl9CiAKQEAgLTcwMSwxNyArNzA1LDE0IEBACiAJCQkJY29udGludWU7CiAKIAkJCXFlZF9pbml0X2NhdV9zYl9lbnRyeShwX2h3Zm4sICZzYl9lbnRyeSwKLQkJCQkJICAgICAgcF9ibG9jay0+ZnVuY3Rpb25faWQsCi0JCQkJCSAgICAgIDAsIDApOwotCQkJU1RPUkVfUlRfUkVHX0FHRyhwX2h3Zm4sIG9mZnNldCArIHNiX2lkICogMiwKLQkJCQkJIHNiX2VudHJ5KTsKKwkJCQkJICAgICAgcF9ibG9jay0+ZnVuY3Rpb25faWQsIDAsIDApOworCQkJU1RPUkVfUlRfUkVHX0FHRyhwX2h3Zm4sIG9mZnNldCArIHNiX2lkICogMiwgc2JfZW50cnkpOwogCQl9CiAJfQogfQogCiBzdGF0aWMgaW50IHFlZF9od19pbml0X2NvbW1vbihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCSAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKLQkJCSAgICAgIGludCBod19tb2RlKQorCQkJICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCBpbnQgaHdfbW9kZSkKIHsKIAlzdHJ1Y3QgcWVkX3FtX2luZm8gKnFtX2luZm8gPSAmcF9od2ZuLT5xbV9pbmZvOwogCXN0cnVjdCBxZWRfcW1fY29tbW9uX3J0X2luaXRfcGFyYW1zIHBhcmFtczsKQEAgLTc1OSw3ICs3NjAsNyBAQAogCXFlZF9wb3J0X3VucHJldGVuZChwX2h3Zm4sIHBfcHR0KTsKIAogCXJjID0gcWVkX2luaXRfcnVuKHBfaHdmbiwgcF9wdHQsIFBIQVNFX0VOR0lORSwgQU5ZX1BIQVNFX0lELCBod19tb2RlKTsKLQlpZiAocmMgIT0gMCkKKwlpZiAocmMpCiAJCXJldHVybiByYzsKIAogCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBQU1dSUTJfUkVHX0wyUF9WQUxJREFURV9WRklELCAwKTsKQEAgLTc4MCw2ICs3ODEsOSBAQAogCQljb25jcmV0ZV9maWQgPSBxZWRfdmZpZF90b19jb25jcmV0ZShwX2h3Zm4sIHZmX2lkKTsKIAkJcWVkX2ZpZF9wcmV0ZW5kKHBfaHdmbiwgcF9wdHQsICh1MTYpIGNvbmNyZXRlX2ZpZCk7CiAJCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBDQ0ZDX1JFR19TVFJPTkdfRU5BQkxFX1ZGLCAweDEpOworCQlxZWRfd3IocF9od2ZuLCBwX3B0dCwgQ0NGQ19SRUdfV0VBS19FTkFCTEVfVkYsIDB4MCk7CisJCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBUQ0ZDX1JFR19TVFJPTkdfRU5BQkxFX1ZGLCAweDEpOworCQlxZWRfd3IocF9od2ZuLCBwX3B0dCwgVENGQ19SRUdfV0VBS19FTkFCTEVfVkYsIDB4MCk7CiAJfQogCS8qIHByZXRlbmQgdG8gb3JpZ2luYWwgUEYgKi8KIAlxZWRfZmlkX3ByZXRlbmQocF9od2ZuLCBwX3B0dCwgcF9od2ZuLT5yZWxfcGZfaWQpOwpAQCAtNzg3LDM4ICs3OTEsMTQxIEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IHFlZF9od19pbml0X3BvcnQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCQkgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAotCQkJICAgIGludCBod19tb2RlKQorc3RhdGljIGludAorcWVkX2h3X2luaXRfZHBpX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCSAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1MzIgcHdtX3JlZ2lvbl9zaXplLCB1MzIgbl9jcHVzKQogeworCXUzMiBkcGlfcGFnZV9zaXplXzEsIGRwaV9wYWdlX3NpemVfMiwgZHBpX3BhZ2Vfc2l6ZTsKKwl1MzIgZHBpX2JpdF9zaGlmdCwgZHBpX2NvdW50OworCXUzMiBtaW5fZHBpczsKKworCS8qIENhbGN1bGF0ZSBEUEkgc2l6ZSAqLworCWRwaV9wYWdlX3NpemVfMSA9IFFFRF9XSURfU0laRSAqIG5fY3B1czsKKwlkcGlfcGFnZV9zaXplXzIgPSBtYXhfdCh1MzIsIFFFRF9XSURfU0laRSwgUEFHRV9TSVpFKTsKKwlkcGlfcGFnZV9zaXplID0gbWF4X3QodTMyLCBkcGlfcGFnZV9zaXplXzEsIGRwaV9wYWdlX3NpemVfMik7CisJZHBpX3BhZ2Vfc2l6ZSA9IHJvdW5kdXBfcG93X29mX3R3byhkcGlfcGFnZV9zaXplKTsKKwlkcGlfYml0X3NoaWZ0ID0gaWxvZzIoZHBpX3BhZ2Vfc2l6ZSAvIDQwOTYpOworCisJZHBpX2NvdW50ID0gcHdtX3JlZ2lvbl9zaXplIC8gZHBpX3BhZ2Vfc2l6ZTsKKworCW1pbl9kcGlzID0gcF9od2ZuLT5wZl9wYXJhbXMucmRtYV9wZl9wYXJhbXMubWluX2RwaXM7CisJbWluX2RwaXMgPSBtYXhfdCh1MzIsIFFFRF9NSU5fRFBJUywgbWluX2RwaXMpOworCisJcF9od2ZuLT5kcGlfc2l6ZSA9IGRwaV9wYWdlX3NpemU7CisJcF9od2ZuLT5kcGlfY291bnQgPSBkcGlfY291bnQ7CisKKwlxZWRfd3IocF9od2ZuLCBwX3B0dCwgRE9SUV9SRUdfUEZfRFBJX0JJVF9TSElGVCwgZHBpX2JpdF9zaGlmdCk7CisKKwlpZiAoZHBpX2NvdW50IDwgbWluX2RwaXMpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK2VudW0gUUVEX1JPQ0VfRURQTV9NT0RFIHsKKwlRRURfUk9DRV9FRFBNX01PREVfRU5BQkxFID0gMCwKKwlRRURfUk9DRV9FRFBNX01PREVfRk9SQ0VfT04gPSAxLAorCVFFRF9ST0NFX0VEUE1fTU9ERV9ESVNBQkxFID0gMiwKK307CisKK3N0YXRpYyBpbnQKK3FlZF9od19pbml0X3BmX2Rvb3JiZWxsX2JhcihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQoreworCXUzMiBwd21fcmVnc2l6ZSwgbm9ybV9yZWdzaXplOworCXUzMiBub25fcHdtX2Nvbm4sIG1pbl9hZGRyX3JlZzE7CisJdTMyIGRiX2Jhcl9zaXplLCBuX2NwdXM7CisJdTMyIHJvY2VfZWRwbV9tb2RlOworCXUzMiBwZl9kZW1zX3NoaWZ0OwogCWludCByYyA9IDA7CisJdTggY29uZDsKIAotCXJjID0gcWVkX2luaXRfcnVuKHBfaHdmbiwgcF9wdHQsIFBIQVNFX1BPUlQsIHBfaHdmbi0+cG9ydF9pZCwgaHdfbW9kZSk7Ci0JaWYgKHJjICE9IDApCi0JCXJldHVybiByYzsKKwlkYl9iYXJfc2l6ZSA9IHFlZF9od19iYXJfc2l6ZShwX2h3Zm4sIEJBUl9JRF8xKTsKKwlpZiAocF9od2ZuLT5jZGV2LT5udW1faHdmbnMgPiAxKQorCQlkYl9iYXJfc2l6ZSAvPSAyOwogCi0JaWYgKGh3X21vZGUgJiAoMSA8PCBNT0RFX01GX1NJKSkgewotCQl1OCBwZl9pZCA9IDA7CisJLyogQ2FsY3VsYXRlIGRvb3JiZWxsIHJlZ2lvbnMgKi8KKwlub25fcHdtX2Nvbm4gPSBxZWRfY3h0X2dldF9wcm90b19jaWRfc3RhcnQocF9od2ZuLCBQUk9UT0NPTElEX0NPUkUpICsKKwkJICAgICAgIHFlZF9jeHRfZ2V0X3Byb3RvX2NpZF9jb3VudChwX2h3Zm4sIFBST1RPQ09MSURfQ09SRSwKKwkJCQkJCSAgIE5VTEwpICsKKwkJICAgICAgIHFlZF9jeHRfZ2V0X3Byb3RvX2NpZF9jb3VudChwX2h3Zm4sIFBST1RPQ09MSURfRVRILAorCQkJCQkJICAgTlVMTCk7CisJbm9ybV9yZWdzaXplID0gcm91bmR1cChRRURfUEZfREVNU19TSVpFICogbm9uX3B3bV9jb25uLCA0MDk2KTsKKwltaW5fYWRkcl9yZWcxID0gbm9ybV9yZWdzaXplIC8gNDA5NjsKKwlwd21fcmVnc2l6ZSA9IGRiX2Jhcl9zaXplIC0gbm9ybV9yZWdzaXplOwogCi0JCWlmICghcWVkX2h3X2luaXRfZmlyc3RfZXRoKHBfaHdmbiwgcF9wdHQsICZwZl9pZCkpIHsKLQkJCURQX1ZFUkJPU0UocF9od2ZuLCBORVRJRl9NU0dfSUZVUCwKLQkJCQkgICAiUEZbJTA4eF0gaXMgZmlyc3QgZXRoIG9uIGVuZ2luZVxuIiwgcGZfaWQpOwotCi0JCQkvKiBXZSBzaG91bGQgaGF2ZSBjb25maWd1cmVkIEJJVCBmb3IgcHBmaWQsIGkuZS4sIHRoZQotCQkJICogcmVsYXRpdmUgZnVuY3Rpb24gbnVtYmVyIGluIHRoZSBwb3J0LiBCdXQgdGhlcmUncyBhCi0JCQkgKiBidWcgaW4gTExIIGluIEJCIHdoZXJlIHRoZSBwcGZpZCBpcyBhY3R1YWxseSBlbmdpbmUKLQkJCSAqIGJhc2VkLCBzbyB3ZSBuZWVkIHRvIHRha2UgdGhpcyBpbnRvIGFjY291bnQuCi0JCQkgKi8KLQkJCXFlZF93cihwX2h3Zm4sIHBfcHR0LAotCQkJICAgICAgIE5JR19SRUdfTExIX1RBR01BQ19ERUZfUEZfVkVDVE9SLCAxIDw8IHBmX2lkKTsKLQkJfQotCi0JCS8qIFRha2UgdGhlIHByb3RvY29sLWJhc2VkIGhpdCB2ZWN0b3IgaWYgdGhlcmUgaXMgYSBoaXQsCi0JCSAqIG90aGVyd2lzZSB0YWtlIHRoZSBvdGhlciB2ZWN0b3IuCi0JCSAqLwotCQlxZWRfd3IocF9od2ZuLCBwX3B0dCwgTklHX1JFR19MTEhfQ0xTX1RZUEVfRFVBTE1PREUsIDB4Mik7CisJLyogQ2hlY2sgdGhhdCB0aGUgbm9ybWFsIGFuZCBQV00gc2l6ZXMgYXJlIHZhbGlkICovCisJaWYgKGRiX2Jhcl9zaXplIDwgbm9ybV9yZWdzaXplKSB7CisJCURQX0VSUihwX2h3Zm4tPmNkZXYsCisJCSAgICAgICAiRG9vcmJlbGwgQkFSIHNpemUgMHgleCBpcyB0b28gc21hbGwgKG5vcm1hbCByZWdpb24gaXMgMHglMHggKVxuIiwKKwkJICAgICAgIGRiX2Jhcl9zaXplLCBub3JtX3JlZ3NpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JcmV0dXJuIHJjOworCisJaWYgKHB3bV9yZWdzaXplIDwgUUVEX01JTl9QV01fUkVHSU9OKSB7CisJCURQX0VSUihwX2h3Zm4tPmNkZXYsCisJCSAgICAgICAiUFdNIHJlZ2lvbiBzaXplIDB4JTB4IGlzIHRvbyBzbWFsbC4gU2hvdWxkIGJlIGF0IGxlYXN0IDB4JTB4IChEb29yYmVsbCBCQVIgc2l6ZSBpcyAweCV4IGFuZCBub3JtYWwgcmVnaW9uIHNpemUgaXMgMHglMHgpXG4iLAorCQkgICAgICAgcHdtX3JlZ3NpemUsCisJCSAgICAgICBRRURfTUlOX1BXTV9SRUdJT04sIGRiX2Jhcl9zaXplLCBub3JtX3JlZ3NpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIERQSXMgKi8KKwlyb2NlX2VkcG1fbW9kZSA9IHBfaHdmbi0+cGZfcGFyYW1zLnJkbWFfcGZfcGFyYW1zLnJvY2VfZWRwbV9tb2RlOworCWlmICgocm9jZV9lZHBtX21vZGUgPT0gUUVEX1JPQ0VfRURQTV9NT0RFX0VOQUJMRSkgfHwKKwkgICAgKChyb2NlX2VkcG1fbW9kZSA9PSBRRURfUk9DRV9FRFBNX01PREVfRk9SQ0VfT04pKSkgeworCQkvKiBFaXRoZXIgRURQTSBpcyBtYW5kYXRvcnksIG9yIHdlIGFyZSBhdHRlbXB0aW5nIHRvIGFsbG9jYXRlIGEKKwkJICogV0lEIHBlciBDUFUuCisJCSAqLworCQluX2NwdXMgPSBudW1fYWN0aXZlX2NwdXMoKTsKKwkJcmMgPSBxZWRfaHdfaW5pdF9kcGlfc2l6ZShwX2h3Zm4sIHBfcHR0LCBwd21fcmVnc2l6ZSwgbl9jcHVzKTsKKwl9CisKKwljb25kID0gKHJjICYmIChyb2NlX2VkcG1fbW9kZSA9PSBRRURfUk9DRV9FRFBNX01PREVfRU5BQkxFKSkgfHwKKwkgICAgICAgKHJvY2VfZWRwbV9tb2RlID09IFFFRF9ST0NFX0VEUE1fTU9ERV9ESVNBQkxFKTsKKwlpZiAoY29uZCB8fCBwX2h3Zm4tPmRjYnhfbm9fZWRwbSkgeworCQkvKiBFaXRoZXIgRURQTSBpcyBkaXNhYmxlZCBmcm9tIHVzZXIgY29uZmlndXJhdGlvbiwgb3IgaXQgaXMKKwkJICogZGlzYWJsZWQgdmlhIERDQngsIG9yIGl0IGlzIG5vdCBtYW5kYXRvcnkgYW5kIHdlIGZhaWxlZCB0bworCQkgKiBhbGxvY2F0ZWQgYSBXSUQgcGVyIENQVS4KKwkJICovCisJCW5fY3B1cyA9IDE7CisJCXJjID0gcWVkX2h3X2luaXRfZHBpX3NpemUocF9od2ZuLCBwX3B0dCwgcHdtX3JlZ3NpemUsIG5fY3B1cyk7CisKKwkJaWYgKGNvbmQpCisJCQlxZWRfcmRtYV9kcG1fYmFyKHBfaHdmbiwgcF9wdHQpOworCX0KKworCURQX0lORk8ocF9od2ZuLAorCQkiZG9vcmJlbGwgYmFyOiBub3JtYWxfcmVnaW9uX3NpemU9JWQsIHB3bV9yZWdpb25fc2l6ZT0lZCwgZHBpX3NpemU9JWQsIGRwaV9jb3VudD0lZCwgcm9jZV9lZHBtPSVzXG4iLAorCQlub3JtX3JlZ3NpemUsCisJCXB3bV9yZWdzaXplLAorCQlwX2h3Zm4tPmRwaV9zaXplLAorCQlwX2h3Zm4tPmRwaV9jb3VudCwKKwkJKChwX2h3Zm4tPmRjYnhfbm9fZWRwbSkgfHwgKHBfaHdmbi0+ZGJfYmFyX25vX2VkcG0pKSA/CisJCSJkaXNhYmxlZCIgOiAiZW5hYmxlZCIpOworCisJaWYgKHJjKSB7CisJCURQX0VSUihwX2h3Zm4sCisJCSAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIGVub3VnaCBEUElzLiBBbGxvY2F0ZWQgJWQgYnV0IHRoZSBjdXJyZW50IG1pbmltdW0gaXMgJWQuXG4iLAorCQkgICAgICAgcF9od2ZuLT5kcGlfY291bnQsCisJCSAgICAgICBwX2h3Zm4tPnBmX3BhcmFtcy5yZG1hX3BmX3BhcmFtcy5taW5fZHBpcyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBfaHdmbi0+ZHBpX3N0YXJ0X29mZnNldCA9IG5vcm1fcmVnc2l6ZTsKKworCS8qIERFTVMgc2l6ZSBpcyBjb25maWd1cmVkIGxvZzIgb2YgRFdPUkRzLCBoZW5jZSB0aGUgZGl2aXNpb24gYnkgNCAqLworCXBmX2RlbXNfc2hpZnQgPSBpbG9nMihRRURfUEZfREVNU19TSVpFIC8gNCk7CisJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIERPUlFfUkVHX1BGX0lDSURfQklUX1NISUZUX05PUk0sIHBmX2RlbXNfc2hpZnQpOworCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBET1JRX1JFR19QRl9NSU5fQUREUl9SRUcxLCBtaW5fYWRkcl9yZWcxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFlZF9od19pbml0X3BvcnQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCBpbnQgaHdfbW9kZSkKK3sKKwlyZXR1cm4gcWVkX2luaXRfcnVuKHBfaHdmbiwgcF9wdHQsIFBIQVNFX1BPUlQsCisJCQkgICAgcF9od2ZuLT5wb3J0X2lkLCBod19tb2RlKTsKIH0KIAogc3RhdGljIGludCBxZWRfaHdfaW5pdF9wZihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKQEAgLTg0OCw3ICs5NTUsNyBAQAogCXFlZF9pbnRfaWd1X2luaXRfcnQocF9od2ZuKTsKIAogCS8qIFNldCBWTEFOIGluIE5JRyBpZiBuZWVkZWQgKi8KLQlpZiAoaHdfbW9kZSAmICgxIDw8IE1PREVfTUZfU0QpKSB7CisJaWYgKGh3X21vZGUgJiBCSVQoTU9ERV9NRl9TRCkpIHsKIAkJRFBfVkVSQk9TRShwX2h3Zm4sIE5FVElGX01TR19IVywgIkNvbmZpZ3VyaW5nIExMSF9GVU5DX1RBR1xuIik7CiAJCVNUT1JFX1JUX1JFRyhwX2h3Zm4sIE5JR19SRUdfTExIX0ZVTkNfVEFHX0VOX1JUX09GRlNFVCwgMSk7CiAJCVNUT1JFX1JUX1JFRyhwX2h3Zm4sIE5JR19SRUdfTExIX0ZVTkNfVEFHX1ZBTFVFX1JUX09GRlNFVCwKQEAgLTg1Niw3ICs5NjMsNyBAQAogCX0KIAogCS8qIEVuYWJsZSBjbGFzc2lmaWNhdGlvbiBieSBNQUMgaWYgbmVlZGVkICovCi0JaWYgKGh3X21vZGUgJiAoMSA8PCBNT0RFX01GX1NJKSkgeworCWlmIChod19tb2RlICYgQklUKE1PREVfTUZfU0kpKSB7CiAJCURQX1ZFUkJPU0UocF9od2ZuLCBORVRJRl9NU0dfSFcsCiAJCQkgICAiQ29uZmlndXJpbmcgVEFHTUFDX0NMU19UWVBFXG4iKTsKIAkJU1RPUkVfUlRfUkVHKHBfaHdmbiwKQEAgLTg3MSw3ICs5NzgsNyBAQAogCiAJLyogQ2xlYW51cCBjaGlwIGZyb20gcHJldmlvdXMgZHJpdmVyIGlmIHN1Y2ggcmVtYWlucyBleGlzdCAqLwogCXJjID0gcWVkX2ZpbmFsX2NsZWFudXAocF9od2ZuLCBwX3B0dCwgcmVsX3BmX2lkLCBmYWxzZSk7Ci0JaWYgKHJjICE9IDApCisJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKIAkvKiBQRiBJbml0IHNlcXVlbmNlICovCkBAIC04ODcsMjAgKzk5NCw5IEBACiAJLyogUHVyZSBydW50aW1lIGluaXRpYWxpemF0aW9ucyAtIGRpcmVjdGx5IHRvIHRoZSBIVyAgKi8KIAlxZWRfaW50X2lndV9pbml0X3B1cmVfcnQocF9od2ZuLCBwX3B0dCwgdHJ1ZSwgdHJ1ZSk7CiAKLQlpZiAoaHdfbW9kZSAmICgxIDw8IE1PREVfTUZfU0kpKSB7Ci0JCXU4IHBmX2lkID0gMDsKLQkJdTMyIHZhbCA9IDA7Ci0KLQkJaWYgKCFxZWRfaHdfaW5pdF9maXJzdF9ldGgocF9od2ZuLCBwX3B0dCwgJnBmX2lkKSkgewotCQkJaWYgKHBfaHdmbi0+cmVsX3BmX2lkID09IHBmX2lkKSB7Ci0JCQkJRFBfVkVSQk9TRShwX2h3Zm4sIE5FVElGX01TR19JRlVQLAotCQkJCQkgICAiUEZbJWRdIGlzIGZpcnN0IEVUSCBvbiBlbmdpbmVcbiIsCi0JCQkJCSAgIHBmX2lkKTsKLQkJCQl2YWwgPSAxOwotCQkJfQotCQkJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIFBSU19SRUdfTVNHX0lORk8sIHZhbCk7Ci0JCX0KLQl9CisJcmMgPSBxZWRfaHdfaW5pdF9wZl9kb29yYmVsbF9iYXIocF9od2ZuLCBwX3B0dCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAKIAlpZiAoYl9od19zdGFydCkgewogCQkvKiBlbmFibGUgaW50ZXJydXB0cyAqLwpAQCAtOTUwLDggKzEwNDYsNyBAQAogCS8qIFJlYWQgc2hhZG93IG9mIGN1cnJlbnQgTUZXIG1haWxib3ggKi8KIAlxZWRfbWNwX3JlYWRfbWIocF9od2ZuLCBwX21haW5fcHR0KTsKIAltZW1jcHkocF9od2ZuLT5tY3BfaW5mby0+bWZ3X21iX3NoYWRvdywKLQkgICAgICAgcF9od2ZuLT5tY3BfaW5mby0+bWZ3X21iX2N1ciwKLQkgICAgICAgcF9od2ZuLT5tY3BfaW5mby0+bWZ3X21iX2xlbmd0aCk7CisJICAgICAgIHBfaHdmbi0+bWNwX2luZm8tPm1md19tYl9jdXIsIHBfaHdmbi0+bWNwX2luZm8tPm1md19tYl9sZW5ndGgpOwogfQogCiBpbnQgcWVkX2h3X2luaXQoc3RydWN0IHFlZF9kZXYgKmNkZXYsCkBAIC05NzEsNyArMTA2Niw3IEBACiAKIAlpZiAoSVNfUEYoY2RldikpIHsKIAkJcmMgPSBxZWRfaW5pdF9md19kYXRhKGNkZXYsIGJpbl9md19kYXRhKTsKLQkJaWYgKHJjICE9IDApCisJCWlmIChyYykKIAkJCXJldHVybiByYzsKIAl9CiAKQEAgLTk4OCw4ICsxMDgzLDcgQEAKIAogCQlxZWRfY2FsY19od19tb2RlKHBfaHdmbik7CiAKLQkJcmMgPSBxZWRfbWNwX2xvYWRfcmVxKHBfaHdmbiwgcF9od2ZuLT5wX21haW5fcHR0LAotCQkJCSAgICAgICZsb2FkX2NvZGUpOworCQlyYyA9IHFlZF9tY3BfbG9hZF9yZXEocF9od2ZuLCBwX2h3Zm4tPnBfbWFpbl9wdHQsICZsb2FkX2NvZGUpOwogCQlpZiAocmMpIHsKIAkJCURQX05PVElDRShwX2h3Zm4sICJGYWlsZWQgc2VuZGluZyBMT0FEX1JFUSBjb21tYW5kXG4iKTsKIAkJCXJldHVybiByYzsKQEAgLTEwMDQsMTEgKzEwOTgsNiBAQAogCQlwX2h3Zm4tPmZpcnN0X29uX2VuZ2luZSA9IChsb2FkX2NvZGUgPT0KIAkJCQkJICAgRldfTVNHX0NPREVfRFJWX0xPQURfRU5HSU5FKTsKIAotCQlpZiAoIXFtX2xvY2tfaW5pdCkgewotCQkJc3Bpbl9sb2NrX2luaXQoJnFtX2xvY2spOwotCQkJcW1fbG9ja19pbml0ID0gdHJ1ZTsKLQkJfQotCiAJCXN3aXRjaCAobG9hZF9jb2RlKSB7CiAJCWNhc2UgRldfTVNHX0NPREVfRFJWX0xPQURfRU5HSU5FOgogCQkJcmMgPSBxZWRfaHdfaW5pdF9jb21tb24ocF9od2ZuLCBwX2h3Zm4tPnBfbWFpbl9wdHQsCkBAIC0xMDcxLDkgKzExNjAsOCBAQAogfQogCiAjZGVmaW5lIFFFRF9IV19TVE9QX1JFVFJZX0xJTUlUICgxMCkKLXN0YXRpYyBpbmxpbmUgdm9pZCBxZWRfaHdfdGltZXJzX3N0b3Aoc3RydWN0IHFlZF9kZXYgKmNkZXYsCi0JCQkJICAgICAgc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCQkJICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQorc3RhdGljIHZvaWQgcWVkX2h3X3RpbWVyc19zdG9wKHN0cnVjdCBxZWRfZGV2ICpjZGV2LAorCQkJICAgICAgIHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCiB7CiAJaW50IGk7CiAKQEAgLTEwODQsOCArMTE3Miw3IEBACiAJZm9yIChpID0gMDsgaSA8IFFFRF9IV19TVE9QX1JFVFJZX0xJTUlUOyBpKyspIHsKIAkJaWYgKCghcWVkX3JkKHBfaHdmbiwgcF9wdHQsCiAJCQkgICAgIFRNX1JFR19QRl9TQ0FOX0FDVElWRV9DT05OKSkgJiYKLQkJICAgICghcWVkX3JkKHBfaHdmbiwgcF9wdHQsCi0JCQkgICAgIFRNX1JFR19QRl9TQ0FOX0FDVElWRV9UQVNLKSkpCisJCSAgICAoIXFlZF9yZChwX2h3Zm4sIHBfcHR0LCBUTV9SRUdfUEZfU0NBTl9BQ1RJVkVfVEFTSykpKQogCQkJYnJlYWs7CiAKIAkJLyogRGVwZW5kZW50IG9uIG51bWJlciBvZiBjb25uZWN0aW9uL3Rhc2tzLCBwb3NzaWJseQpAQCAtMTE5MCw4ICsxMjc3LDcgQEAKIAkJfQogCiAJCURQX1ZFUkJPU0UocF9od2ZuLAotCQkJICAgTkVUSUZfTVNHX0lGRE9XTiwKLQkJCSAgICJTaHV0dGluZyBkb3duIHRoZSBmYXN0cGF0aFxuIik7CisJCQkgICBORVRJRl9NU0dfSUZET1dOLCAiU2h1dHRpbmcgZG93biB0aGUgZmFzdHBhdGhcbiIpOwogCiAJCXFlZF93cihwX2h3Zm4sIHBfcHR0LAogCQkgICAgICAgTklHX1JFR19SWF9MTEhfQlJCX0dBVEVfRE5URldEX1BFUlBGLCAweDEpOwpAQCAtMTIxOSwxNCArMTMwNSwxMyBAQAogCSAgICAgICBOSUdfUkVHX1JYX0xMSF9CUkJfR0FURV9ETlRGV0RfUEVSUEYsIDB4MCk7CiB9CiAKLXN0YXRpYyBpbnQgcWVkX3JlZ19hc3NlcnQoc3RydWN0IHFlZF9od2ZuICpod2ZuLAotCQkJICBzdHJ1Y3QgcWVkX3B0dCAqcHR0LCB1MzIgcmVnLAotCQkJICBib29sIGV4cGVjdGVkKQorc3RhdGljIGludCBxZWRfcmVnX2Fzc2VydChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1MzIgcmVnLCBib29sIGV4cGVjdGVkKQogewotCXUzMiBhc3NlcnRfdmFsID0gcWVkX3JkKGh3Zm4sIHB0dCwgcmVnKTsKKwl1MzIgYXNzZXJ0X3ZhbCA9IHFlZF9yZChwX2h3Zm4sIHBfcHR0LCByZWcpOwogCiAJaWYgKGFzc2VydF92YWwgIT0gZXhwZWN0ZWQpIHsKLQkJRFBfTk9USUNFKGh3Zm4sICJWYWx1ZSBhdCBhZGRyZXNzIDB4JXggIT0gMHglMDh4XG4iLAorCQlEUF9OT1RJQ0UocF9od2ZuLCAiVmFsdWUgYXQgYWRkcmVzcyAweCUwOHggIT0gMHglMDh4XG4iLAogCQkJICByZWcsIGV4cGVjdGVkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTMwNiw4ICsxMzkxLDcgQEAKIAogCS8qIENsZWFuIFByZXZpb3VzIGVycm9ycyBpZiBzdWNoIGV4aXN0ICovCiAJcWVkX3dyKHBfaHdmbiwgcF9od2ZuLT5wX21haW5fcHR0LAotCSAgICAgICBQR0xVRV9CX1JFR19XQVNfRVJST1JfUEZfMzFfMF9DTFIsCi0JICAgICAgIDEgPDwgcF9od2ZuLT5hYnNfcGZfaWQpOworCSAgICAgICBQR0xVRV9CX1JFR19XQVNfRVJST1JfUEZfMzFfMF9DTFIsIDEgPDwgcF9od2ZuLT5hYnNfcGZfaWQpOwogCiAJLyogZW5hYmxlIGludGVybmFsIHRhcmdldC1yZWFkICovCiAJcWVkX3dyKHBfaHdmbiwgcF9od2ZuLT5wX21haW5fcHR0LApAQCAtMTMxNyw3ICsxNDAxLDggQEAKIHN0YXRpYyB2b2lkIGdldF9mdW5jdGlvbl9pZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbikKIHsKIAkvKiBNRSBSZWdpc3RlciAqLwotCXBfaHdmbi0+aHdfaW5mby5vcGFxdWVfZmlkID0gKHUxNilSRUdfUkQocF9od2ZuLCBQWFBfUEZfTUVfT1BBUVVFX0FERFIpOworCXBfaHdmbi0+aHdfaW5mby5vcGFxdWVfZmlkID0gKHUxNikgUkVHX1JEKHBfaHdmbiwKKwkJCQkJCSAgUFhQX1BGX01FX09QQVFVRV9BRERSKTsKIAogCXBfaHdmbi0+aHdfaW5mby5jb25jcmV0ZV9maWQgPSBSRUdfUkQocF9od2ZuLCBQWFBfUEZfTUVfQ09OQ1JFVEVfQUREUik7CiAKQEAgLTEzMjYsNiArMTQxMSwxMCBAQAogCQkJCSAgICAgIFBYUF9DT05DUkVURV9GSURfUEZJRCk7CiAJcF9od2ZuLT5wb3J0X2lkID0gR0VUX0ZJRUxEKHBfaHdmbi0+aHdfaW5mby5jb25jcmV0ZV9maWQsCiAJCQkJICAgIFBYUF9DT05DUkVURV9GSURfUE9SVCk7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgTkVUSUZfTVNHX1BST0JFLAorCQkgICAiUmVhZCBNRSByZWdpc3RlcjogQ29uY3JldGUgMHglMDh4IE9wYXF1ZSAweCUwNHhcbiIsCisJCSAgIHBfaHdmbi0+aHdfaW5mby5jb25jcmV0ZV9maWQsIHBfaHdmbi0+aHdfaW5mby5vcGFxdWVfZmlkKTsKIH0KIAogc3RhdGljIHZvaWQgcWVkX2h3X3NldF9mZWF0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuKQpAQCAtMTMzMyw2ICsxNDIyLDE5IEBACiAJdTMyICpmZWF0X251bSA9IHBfaHdmbi0+aHdfaW5mby5mZWF0X251bTsKIAlpbnQgbnVtX2ZlYXR1cmVzID0gMTsKIAorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lORklOSUJBTkRfUUVEUikKKwkvKiBSb2NlIENOUSBlYWNoIHJlcXVpcmVzOiAxIHN0YXR1cyBibG9jayArIDEgQ05RLiBXZSBkaXZpZGUgdGhlCisJICogc3RhdHVzIGJsb2NrcyBlcXVhbGx5IGJldHdlZW4gTDIgLyBSb0NFIGJ1dCB3aXRoIGNvbnNpZGVyYXRpb24gYXMKKwkgKiB0byBob3cgbWFueSBsMiBxdWV1ZXMgLyBjbnFzIHdlIGhhdmUKKwkgKi8KKwlpZiAocF9od2ZuLT5od19pbmZvLnBlcnNvbmFsaXR5ID09IFFFRF9QQ0lfRVRIX1JPQ0UpIHsKKwkJbnVtX2ZlYXR1cmVzKys7CisKKwkJZmVhdF9udW1bUUVEX1JETUFfQ05RXSA9CisJCQltaW5fdCh1MzIsIFJFU0NfTlVNKHBfaHdmbiwgUUVEX1NCKSAvIG51bV9mZWF0dXJlcywKKwkJCSAgICAgIFJFU0NfTlVNKHBfaHdmbiwgUUVEX1JETUFfQ05RX1JBTSkpOworCX0KKyNlbmRpZgogCWZlYXRfbnVtW1FFRF9QRl9MMl9RVUVdID0gbWluX3QodTMyLCBSRVNDX05VTShwX2h3Zm4sIFFFRF9TQikgLwogCQkJCQkJbnVtX2ZlYXR1cmVzLAogCQkJCQlSRVNDX05VTShwX2h3Zm4sIFFFRF9MMl9RVUVVRSkpOwpAQCAtMTM3Myw2ICsxNDc1LDEwIEBACiAJcmVzY19udW1bUUVEX1ZMQU5dID0gKEVUSF9OVU1fVkxBTl9GSUxURVJTIC0gMSAvKkZvciB2bGFuMCovKSAvCiAJCQkgICAgIG51bV9mdW5jczsKIAlyZXNjX251bVtRRURfSUxUXSA9IFBYUF9OVU1fSUxUX1JFQ09SRFNfQkIgLyBudW1fZnVuY3M7CisJcmVzY19udW1bUUVEX0xMMl9RVUVVRV0gPSBNQVhfTlVNX0xMMl9SWF9RVUVVRVMgLyBudW1fZnVuY3M7CisJcmVzY19udW1bUUVEX1JETUFfQ05RX1JBTV0gPSBOVU1fT0ZfQ01EUVNfQ1FTIC8gbnVtX2Z1bmNzOworCXJlc2NfbnVtW1FFRF9SRE1BX1NUQVRTX1FVRVVFXSA9IFJETUFfTlVNX1NUQVRJU1RJQ19DT1VOVEVSU19CQiAvCisJCQkJCSBudW1fZnVuY3M7CiAKIAlmb3IgKGkgPSAwOyBpIDwgUUVEX01BWF9SRVNDOyBpKyspCiAJCXJlc2Nfc3RhcnRbaV0gPSByZXNjX251bVtpXSAqIGVuYWJsZWRfZnVuY19pZHg7CkBAIC0xMzk2LDcgKzE1MDIsOCBAQAogCQkgICAiUkwgPSAlZCBzdGFydCA9ICVkXG4iCiAJCSAgICJNQUMgPSAlZCBzdGFydCA9ICVkXG4iCiAJCSAgICJWTEFOID0gJWQgc3RhcnQgPSAlZFxuIgotCQkgICAiSUxUID0gJWQgc3RhcnQgPSAlZFxuIiwKKwkJICAgIklMVCA9ICVkIHN0YXJ0ID0gJWRcbiIKKwkJICAgIkxMMl9RVUVVRSA9ICVkIHN0YXJ0ID0gJWRcbiIsCiAJCSAgIHBfaHdmbi0+aHdfaW5mby5yZXNjX251bVtRRURfU0JdLAogCQkgICBwX2h3Zm4tPmh3X2luZm8ucmVzY19zdGFydFtRRURfU0JdLAogCQkgICBwX2h3Zm4tPmh3X2luZm8ucmVzY19udW1bUUVEX0wyX1FVRVVFXSwKQEAgLTE0MTIsMTMgKzE1MTksMTQgQEAKIAkJICAgcF9od2ZuLT5od19pbmZvLnJlc2NfbnVtW1FFRF9WTEFOXSwKIAkJICAgcF9od2ZuLT5od19pbmZvLnJlc2Nfc3RhcnRbUUVEX1ZMQU5dLAogCQkgICBwX2h3Zm4tPmh3X2luZm8ucmVzY19udW1bUUVEX0lMVF0sCi0JCSAgIHBfaHdmbi0+aHdfaW5mby5yZXNjX3N0YXJ0W1FFRF9JTFRdKTsKKwkJICAgcF9od2ZuLT5od19pbmZvLnJlc2Nfc3RhcnRbUUVEX0lMVF0sCisJCSAgIFJFU0NfTlVNKHBfaHdmbiwgUUVEX0xMMl9RVUVVRSksCisJCSAgIFJFU0NfU1RBUlQocF9od2ZuLCBRRURfTEwyX1FVRVVFKSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBxZWRfaHdfZ2V0X252bV9pbmZvKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJICAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKK3N0YXRpYyBpbnQgcWVkX2h3X2dldF9udm1faW5mbyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQogewogCXUzMiBudm1fY2ZnMV9vZmZzZXQsIG1mX21vZGUsIGFkZHIsIGdlbmVyaWNfY29udDAsIGNvcmVfY2ZnOwogCXUzMiBwb3J0X2NmZ19hZGRyLCBsaW5rX3RlbXAsIG52bV9jZmdfYWRkciwgZGV2aWNlX2NhcGFiaWxpdGllczsKQEAgLTE0NzIsOCArMTU4MCw3IEBACiAJCXBfaHdmbi0+aHdfaW5mby5wb3J0X21vZGUgPSBRRURfUE9SVF9NT0RFX0RFXzFYMjVHOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlEUF9OT1RJQ0UocF9od2ZuLCAiVW5rbm93biBwb3J0IG1vZGUgaW4gMHglMDh4XG4iLAotCQkJICBjb3JlX2NmZyk7CisJCURQX05PVElDRShwX2h3Zm4sICJVbmtub3duIHBvcnQgbW9kZSBpbiAweCUwOHhcbiIsIGNvcmVfY2ZnKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0xNDg0LDExICsxNTkxLDExIEBACiAJbGlua190ZW1wID0gcWVkX3JkKHBfaHdmbiwgcF9wdHQsCiAJCQkgICBwb3J0X2NmZ19hZGRyICsKIAkJCSAgIG9mZnNldG9mKHN0cnVjdCBudm1fY2ZnMV9wb3J0LCBzcGVlZF9jYXBfbWFzaykpOwotCWxpbmstPnNwZWVkLmFkdmVydGlzZWRfc3BlZWRzID0KLQkJbGlua190ZW1wICYgTlZNX0NGRzFfUE9SVF9EUlZfU1BFRURfQ0FQQUJJTElUWV9NQVNLX01BU0s7CisJbGlua190ZW1wICY9IE5WTV9DRkcxX1BPUlRfRFJWX1NQRUVEX0NBUEFCSUxJVFlfTUFTS19NQVNLOworCWxpbmstPnNwZWVkLmFkdmVydGlzZWRfc3BlZWRzID0gbGlua190ZW1wOwogCi0JcF9od2ZuLT5tY3BfaW5mby0+bGlua19jYXBhYmlsaXRpZXMuc3BlZWRfY2FwYWJpbGl0aWVzID0KLQkJCQkJCWxpbmstPnNwZWVkLmFkdmVydGlzZWRfc3BlZWRzOworCWxpbmtfdGVtcCA9IGxpbmstPnNwZWVkLmFkdmVydGlzZWRfc3BlZWRzOworCXBfaHdmbi0+bWNwX2luZm8tPmxpbmtfY2FwYWJpbGl0aWVzLnNwZWVkX2NhcGFiaWxpdGllcyA9IGxpbmtfdGVtcDsKIAogCWxpbmtfdGVtcCA9IHFlZF9yZChwX2h3Zm4sIHBfcHR0LAogCQkJICAgcG9ydF9jZmdfYWRkciArCkBAIC0xNTE3LDggKzE2MjQsNyBAQAogCQlsaW5rLT5zcGVlZC5mb3JjZWRfc3BlZWQgPSAxMDAwMDA7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCURQX05PVElDRShwX2h3Zm4sICJVbmtub3duIFNwZWVkIGluIDB4JTA4eFxuIiwKLQkJCSAgbGlua190ZW1wKTsKKwkJRFBfTk9USUNFKHBfaHdmbiwgIlVua25vd24gU3BlZWQgaW4gMHglMDh4XG4iLCBsaW5rX3RlbXApOwogCX0KIAogCWxpbmtfdGVtcCAmPSBOVk1fQ0ZHMV9QT1JUX0RSVl9GTE9XX0NPTlRST0xfTUFTSzsKQEAgLTE2MjgsMTAgKzE3MzQsMTAgQEAKIAogCURQX1ZFUkJPU0UocF9od2ZuLAogCQkgICBORVRJRl9NU0dfUFJPQkUsCi0JCSAgICJQRiBbcmVsX2lkICVkLCBhYnNfaWQgJWRdIHdpdGhpbiB0aGUgJWQgZW5hYmxlZCBmdW5jdGlvbnMgb24gdGhlIGVuZ2luZVxuIiwKKwkJICAgIlBGIFtyZWxfaWQgJWQsIGFic19pZCAlZF0gb2NjdXBpZXMgaW5kZXggJWQgd2l0aGluIHRoZSAlZCBlbmFibGVkIGZ1bmN0aW9ucyBvbiB0aGUgZW5naW5lXG4iLAogCQkgICBwX2h3Zm4tPnJlbF9wZl9pZCwKIAkJICAgcF9od2ZuLT5hYnNfcGZfaWQsCi0JCSAgIHBfaHdmbi0+bnVtX2Z1bmNzX29uX2VuZ2luZSk7CisJCSAgIHBfaHdmbi0+ZW5hYmxlZF9mdW5jX2lkeCwgcF9od2ZuLT5udW1fZnVuY3Nfb25fZW5naW5lKTsKIH0KIAogc3RhdGljIGludApAQCAtMTcwMywxMCArMTgwOSw5IEBACiAJdTMyIHRtcDsKIAogCS8qIFJlYWQgVmVuZG9yIElkIC8gRGV2aWNlIElkICovCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQoY2Rldi0+cGRldiwgUENJX1ZFTkRPUl9JRCwKLQkJCSAgICAgJmNkZXYtPnZlbmRvcl9pZCk7Ci0JcGNpX3JlYWRfY29uZmlnX3dvcmQoY2Rldi0+cGRldiwgUENJX0RFVklDRV9JRCwKLQkJCSAgICAgJmNkZXYtPmRldmljZV9pZCk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoY2Rldi0+cGRldiwgUENJX1ZFTkRPUl9JRCwgJmNkZXYtPnZlbmRvcl9pZCk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoY2Rldi0+cGRldiwgUENJX0RFVklDRV9JRCwgJmNkZXYtPmRldmljZV9pZCk7CisKIAljZGV2LT5jaGlwX251bSA9ICh1MTYpcWVkX3JkKHBfaHdmbiwgcF9od2ZuLT5wX21haW5fcHR0LAogCQkJCSAgICAgTUlTQ1NfUkVHX0NISVBfTlVNKTsKIAljZGV2LT5jaGlwX3JldiA9ICh1MTYpcWVkX3JkKHBfaHdmbiwgcF9od2ZuLT5wX21haW5fcHR0LApAQCAtMTc3MSwxMCArMTg3Niw4IEBACiAKIAkvKiBBbGxvY2F0ZSBQVFQgcG9vbCAqLwogCXJjID0gcWVkX3B0dF9wb29sX2FsbG9jKHBfaHdmbik7Ci0JaWYgKHJjKSB7Ci0JCURQX05PVElDRShwX2h3Zm4sICJGYWlsZWQgdG8gcHJlcGFyZSBod2ZuJ3MgaHdcbiIpOworCWlmIChyYykKIAkJZ290byBlcnIwOwotCX0KIAogCS8qIEFsbG9jYXRlIHRoZSBtYWluIFBUVCAqLwogCXBfaHdmbi0+cF9tYWluX3B0dCA9IHFlZF9nZXRfcmVzZXJ2ZWRfcHR0KHBfaHdmbiwgUkVTRVJWRURfUFRUX01BSU4pOwpAQCAtMTc4Miw3ICsxODg1LDcgQEAKIAkvKiBGaXJzdCBod2ZuIGxlYXJucyBiYXNpYyBpbmZvcm1hdGlvbiwgZS5nLiwgbnVtYmVyIG9mIGh3Zm5zICovCiAJaWYgKCFwX2h3Zm4tPm15X2lkKSB7CiAJCXJjID0gcWVkX2dldF9kZXZfaW5mbyhwX2h3Zm4tPmNkZXYpOwotCQlpZiAocmMgIT0gMCkKKwkJaWYgKHJjKQogCQkJZ290byBlcnIxOwogCX0KIApAQCAtMTgwNCwxMCArMTkwNyw4IEBACiAKIAkvKiBBbGxvY2F0ZSB0aGUgaW5pdCBSVCBhcnJheSBhbmQgaW5pdGlhbGl6ZSB0aGUgaW5pdC1vcHMgZW5naW5lICovCiAJcmMgPSBxZWRfaW5pdF9hbGxvYyhwX2h3Zm4pOwotCWlmIChyYykgewotCQlEUF9OT1RJQ0UocF9od2ZuLCAiRmFpbGVkIHRvIGFsbG9jYXRlIHRoZSBpbml0IGFycmF5XG4iKTsKKwlpZiAocmMpCiAJCWdvdG8gZXJyMjsKLQl9CiAKIAlyZXR1cm4gcmM7CiBlcnIyOgpAQCAtMjAxNSwxMCArMjExNiw4IEBACiAJCXBfdmlydCA9IGRtYV9hbGxvY19jb2hlcmVudCgmY2Rldi0+cGRldi0+ZGV2LAogCQkJCQkgICAgUUVEX0NIQUlOX1BBR0VfU0laRSwKIAkJCQkJICAgICZwX3BoeXMsIEdGUF9LRVJORUwpOwotCQlpZiAoIXBfdmlydCkgewotCQkJRFBfTk9USUNFKGNkZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgY2hhaW4gbWVtb3J5XG4iKTsKKwkJaWYgKCFwX3ZpcnQpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJfQogCiAJCWlmIChpID09IDApIHsKIAkJCXFlZF9jaGFpbl9pbml0X21lbShwX2NoYWluLCBwX3ZpcnQsIHBfcGh5cyk7CkBAIC0yMDQ4LDEwICsyMTQ3LDggQEAKIAogCXBfdmlydCA9IGRtYV9hbGxvY19jb2hlcmVudCgmY2Rldi0+cGRldi0+ZGV2LAogCQkJCSAgICBRRURfQ0hBSU5fUEFHRV9TSVpFLCAmcF9waHlzLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBfdmlydCkgewotCQlEUF9OT1RJQ0UoY2RldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBjaGFpbiBtZW1vcnlcbiIpOworCWlmICghcF92aXJ0KQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlxZWRfY2hhaW5faW5pdF9tZW0ocF9jaGFpbiwgcF92aXJ0LCBwX3BoeXMpOwogCXFlZF9jaGFpbl9yZXNldChwX2NoYWluKTsKQEAgLTIwNjgsMTMgKzIxNjUsOSBAQAogCXZvaWQgKnBfdmlydCA9IE5VTEw7CiAKIAlzaXplID0gcGFnZV9jbnQgKiBzaXplb2YoKnBwX3ZpcnRfYWRkcl90YmwpOwotCXBwX3ZpcnRfYWRkcl90YmwgPSB2bWFsbG9jKHNpemUpOwotCWlmICghcHBfdmlydF9hZGRyX3RibCkgewotCQlEUF9OT1RJQ0UoY2RldiwKLQkJCSAgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBjaGFpbiB2aXJ0dWFsIGFkZHJlc3NlcyB0YWJsZVxuIik7CisJcHBfdmlydF9hZGRyX3RibCA9IHZ6YWxsb2Moc2l6ZSk7CisJaWYgKCFwcF92aXJ0X2FkZHJfdGJsKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbWVtc2V0KHBwX3ZpcnRfYWRkcl90YmwsIDAsIHNpemUpOwogCiAJLyogVGhlIGFsbG9jYXRpb24gb2YgdGhlIFBCTCB0YWJsZSBpcyBkb25lIHdpdGggaXRzIGZ1bGwgc2l6ZSwgc2luY2UgaXQKIAkgKiBpcyBleHBlY3RlZCB0byBiZSBzdWNjZXNzaXZlLgpAQCAtMjA4NywxOSArMjE4MCwxNSBAQAogCQkJCQlzaXplLCAmcF9wYmxfcGh5cywgR0ZQX0tFUk5FTCk7CiAJcWVkX2NoYWluX2luaXRfcGJsX21lbShwX2NoYWluLCBwX3BibF92aXJ0LCBwX3BibF9waHlzLAogCQkJICAgICAgIHBwX3ZpcnRfYWRkcl90YmwpOwotCWlmICghcF9wYmxfdmlydCkgewotCQlEUF9OT1RJQ0UoY2RldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBjaGFpbiBwYmwgbWVtb3J5XG4iKTsKKwlpZiAoIXBfcGJsX3ZpcnQpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWZvciAoaSA9IDA7IGkgPCBwYWdlX2NudDsgaSsrKSB7CiAJCXBfdmlydCA9IGRtYV9hbGxvY19jb2hlcmVudCgmY2Rldi0+cGRldi0+ZGV2LAogCQkJCQkgICAgUUVEX0NIQUlOX1BBR0VfU0laRSwKIAkJCQkJICAgICZwX3BoeXMsIEdGUF9LRVJORUwpOwotCQlpZiAoIXBfdmlydCkgewotCQkJRFBfTk9USUNFKGNkZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgY2hhaW4gbWVtb3J5XG4iKTsKKwkJaWYgKCFwX3ZpcnQpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJfQogCiAJCWlmIChpID09IDApIHsKIAkJCXFlZF9jaGFpbl9pbml0X21lbShwX2NoYWluLCBwX3ZpcnQsIHBfcGh5cyk7CkBAIC0yMTM0LDcgKzIyMjMsOCBAQAogCXJjID0gcWVkX2NoYWluX2FsbG9jX3Nhbml0eV9jaGVjayhjZGV2LCBjbnRfdHlwZSwgZWxlbV9zaXplLCBwYWdlX2NudCk7CiAJaWYgKHJjKSB7CiAJCURQX05PVElDRShjZGV2LAotCQkJICAiQ2Fubm90IGFsbG9jYXRlIGEgY2hhaW4gd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzOlxuIgorCQkJICAiQ2Fubm90IGFsbG9jYXRlIGEgY2hhaW4gd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzOlxuIik7CisJCURQX05PVElDRShjZGV2LAogCQkJICAiW3VzZV9tb2RlICVkLCBtb2RlICVkLCBjbnRfdHlwZSAlZCwgbnVtX2VsZW1zICVkLCBlbGVtX3NpemUgJXp1XVxuIiwKIAkJCSAgaW50ZW5kZWRfdXNlLCBtb2RlLCBjbnRfdHlwZSwgbnVtX2VsZW1zLCBlbGVtX3NpemUpOwogCQlyZXR1cm4gcmM7CkBAIC0yMTgzLDggKzIyNzMsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgcWVkX2Z3X3Zwb3J0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkgdTggc3JjX2lkLCB1OCAqZHN0X2lkKQoraW50IHFlZF9md192cG9ydChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgdTggc3JjX2lkLCB1OCAqZHN0X2lkKQogewogCWlmIChzcmNfaWQgPj0gUkVTQ19OVU0ocF9od2ZuLCBRRURfVlBPUlQpKSB7CiAJCXU4IG1pbiwgbWF4OwpAQCAtMjIwMyw4ICsyMjkyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHFlZF9md19yc3NfZW5nKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkgICB1OCBzcmNfaWQsIHU4ICpkc3RfaWQpCitpbnQgcWVkX2Z3X3Jzc19lbmcoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHU4IHNyY19pZCwgdTggKmRzdF9pZCkKIHsKIAlpZiAoc3JjX2lkID49IFJFU0NfTlVNKHBfaHdmbiwgUUVEX1JTU19FTkcpKSB7CiAJCXU4IG1pbiwgbWF4OwpAQCAtMjIyMyw2ICsyMzExLDk4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHFlZF9sbGhfbWFjX3RvX2ZpbHRlcih1MzIgKnBfaGlnaCwgdTMyICpwX2xvdywKKwkJCQkgIHU4ICpwX2ZpbHRlcikKK3sKKwkqcF9oaWdoID0gcF9maWx0ZXJbMV0gfCAocF9maWx0ZXJbMF0gPDwgOCk7CisJKnBfbG93ID0gcF9maWx0ZXJbNV0gfCAocF9maWx0ZXJbNF0gPDwgOCkgfAorCQkgKHBfZmlsdGVyWzNdIDw8IDE2KSB8IChwX2ZpbHRlclsyXSA8PCAyNCk7Cit9CisKK2ludCBxZWRfbGxoX2FkZF9tYWNfZmlsdGVyKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1OCAqcF9maWx0ZXIpCit7CisJdTMyIGhpZ2ggPSAwLCBsb3cgPSAwLCBlbjsKKwlpbnQgaTsKKworCWlmICghKElTX01GX1NJKHBfaHdmbikgfHwgSVNfTUZfREVGQVVMVChwX2h3Zm4pKSkKKwkJcmV0dXJuIDA7CisKKwlxZWRfbGxoX21hY190b19maWx0ZXIoJmhpZ2gsICZsb3csIHBfZmlsdGVyKTsKKworCS8qIEZpbmQgYSBmcmVlIGVudHJ5IGFuZCB1dGlsaXplIGl0ICovCisJZm9yIChpID0gMDsgaSA8IE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX0VOX1NJWkU7IGkrKykgeworCQllbiA9IHFlZF9yZChwX2h3Zm4sIHBfcHR0LAorCQkJICAgIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX0VOICsgaSAqIHNpemVvZih1MzIpKTsKKwkJaWYgKGVuKQorCQkJY29udGludWU7CisJCXFlZF93cihwX2h3Zm4sIHBfcHR0LAorCQkgICAgICAgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfVkFMVUUgKworCQkgICAgICAgMiAqIGkgKiBzaXplb2YodTMyKSwgbG93KTsKKwkJcWVkX3dyKHBfaHdmbiwgcF9wdHQsCisJCSAgICAgICBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9WQUxVRSArCisJCSAgICAgICAoMiAqIGkgKyAxKSAqIHNpemVvZih1MzIpLCBoaWdoKTsKKwkJcWVkX3dyKHBfaHdmbiwgcF9wdHQsCisJCSAgICAgICBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9NT0RFICsgaSAqIHNpemVvZih1MzIpLCAwKTsKKwkJcWVkX3dyKHBfaHdmbiwgcF9wdHQsCisJCSAgICAgICBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9QUk9UT0NPTF9UWVBFICsKKwkJICAgICAgIGkgKiBzaXplb2YodTMyKSwgMCk7CisJCXFlZF93cihwX2h3Zm4sIHBfcHR0LAorCQkgICAgICAgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfRU4gKyBpICogc2l6ZW9mKHUzMiksIDEpOworCQlicmVhazsKKwl9CisJaWYgKGkgPj0gTklHX1JFR19MTEhfRlVOQ19GSUxURVJfRU5fU0laRSkgeworCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJICAiRmFpbGVkIHRvIGZpbmQgYW4gZW1wdHkgTExIIGZpbHRlciB0byB1dGlsaXplXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJRFBfVkVSQk9TRShwX2h3Zm4sIE5FVElGX01TR19IVywKKwkJICAgIm1hYzogJXBNIGlzIGFkZGVkIGF0ICVkXG4iLAorCQkgICBwX2ZpbHRlciwgaSk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBxZWRfbGxoX3JlbW92ZV9tYWNfZmlsdGVyKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgdTggKnBfZmlsdGVyKQoreworCXUzMiBoaWdoID0gMCwgbG93ID0gMDsKKwlpbnQgaTsKKworCWlmICghKElTX01GX1NJKHBfaHdmbikgfHwgSVNfTUZfREVGQVVMVChwX2h3Zm4pKSkKKwkJcmV0dXJuOworCisJcWVkX2xsaF9tYWNfdG9fZmlsdGVyKCZoaWdoLCAmbG93LCBwX2ZpbHRlcik7CisKKwkvKiBGaW5kIHRoZSBlbnRyeSBhbmQgY2xlYW4gaXQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfRU5fU0laRTsgaSsrKSB7CisJCWlmIChxZWRfcmQocF9od2ZuLCBwX3B0dCwKKwkJCSAgIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX1ZBTFVFICsKKwkJCSAgIDIgKiBpICogc2l6ZW9mKHUzMikpICE9IGxvdykKKwkJCWNvbnRpbnVlOworCQlpZiAocWVkX3JkKHBfaHdmbiwgcF9wdHQsCisJCQkgICBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9WQUxVRSArCisJCQkgICAoMiAqIGkgKyAxKSAqIHNpemVvZih1MzIpKSAhPSBoaWdoKQorCQkJY29udGludWU7CisKKwkJcWVkX3dyKHBfaHdmbiwgcF9wdHQsCisJCSAgICAgICBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9FTiArIGkgKiBzaXplb2YodTMyKSwgMCk7CisJCXFlZF93cihwX2h3Zm4sIHBfcHR0LAorCQkgICAgICAgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfVkFMVUUgKyAyICogaSAqIHNpemVvZih1MzIpLCAwKTsKKwkJcWVkX3dyKHBfaHdmbiwgcF9wdHQsCisJCSAgICAgICBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9WQUxVRSArCisJCSAgICAgICAoMiAqIGkgKyAxKSAqIHNpemVvZih1MzIpLCAwKTsKKworCQlEUF9WRVJCT1NFKHBfaHdmbiwgTkVUSUZfTVNHX0hXLAorCQkJICAgIm1hYzogJXBNIGlzIHJlbW92ZWQgZnJvbSAlZFxuIiwKKwkJCSAgIHBfZmlsdGVyLCBpKTsKKwkJYnJlYWs7CisJfQorCWlmIChpID49IE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX0VOX1NJWkUpCisJCURQX05PVElDRShwX2h3Zm4sICJUcmllZCB0byByZW1vdmUgYSBub24tY29uZmlndXJlZCBmaWx0ZXJcbiIpOworfQorCiBzdGF0aWMgaW50IHFlZF9zZXRfY29hbGVzY2Uoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKIAkJCSAgICB1MzIgaHdfYWRkciwgdm9pZCAqcF9ldGhfcXpvbmUsCiAJCQkgICAgc2l6ZV90IGV0aF9xem9uZV9zaXplLCB1OCB0aW1lc2V0KQpAQCAtMjM4Niw4ICsyNTY2LDcgQEAKICAqIDMuIHRvdGFsX3JlcV9taW5fcmF0ZSBbYWxsIHZwb3J0cyBtaW4gcmF0ZSBzdW1dIHNob3VsZG4ndCBleGNlZWQgbWluX3BmX3JhdGUuCiAgKi8KIHN0YXRpYyBpbnQgcWVkX2luaXRfd2ZxX3BhcmFtKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJICAgICAgdTE2IHZwb3J0X2lkLCB1MzIgcmVxX3JhdGUsCi0JCQkgICAgICB1MzIgbWluX3BmX3JhdGUpCisJCQkgICAgICB1MTYgdnBvcnRfaWQsIHUzMiByZXFfcmF0ZSwgdTMyIG1pbl9wZl9yYXRlKQogewogCXUzMiB0b3RhbF9yZXFfbWluX3JhdGUgPSAwLCB0b3RhbF9sZWZ0X3JhdGUgPSAwLCBsZWZ0X3JhdGVfcGVyX3ZwID0gMDsKIAlpbnQgbm9uX3JlcXVlc3RlZF9jb3VudCA9IDAsIHJlcV9jb3VudCA9IDAsIGksIG51bV92cG9ydHM7CkBAIC0yNDcxLDcgKzI2NTAsNyBAQAogCiAJcmMgPSBxZWRfaW5pdF93ZnFfcGFyYW0ocF9od2ZuLCB2cF9pZCwgcmF0ZSwgcF9saW5rLT5taW5fcGZfcmF0ZSk7CiAKLQlpZiAocmMgPT0gMCkKKwlpZiAoIXJjKQogCQlxZWRfY29uZmlndXJlX3dmcV9mb3JfYWxsX3Zwb3J0cyhwX2h3Zm4sIHBfcHR0LAogCQkJCQkJIHBfbGluay0+bWluX3BmX3JhdGUpOwogCWVsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2Rldl9hcGkuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2Rldl9hcGkuaAppbmRleCAzNDNiYjAzLi5iNjcxMWMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9kZXZfYXBpLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfZGV2X2FwaS5oCkBAIC0zMTAsNiArMzEwLDI2IEBACiAJCSAgIHU4ICpkc3RfaWQpOwogCiAvKioKKyAqIEBicmllZiBxZWRfbGxoX2FkZF9tYWNfZmlsdGVyIC0gY29uZmlndXJlcyBhIE1BQyBmaWx0ZXIgaW4gbGxoCisgKgorICogQHBhcmFtIHBfaHdmbgorICogQHBhcmFtIHBfcHR0CisgKiBAcGFyYW0gcF9maWx0ZXIgLSBNQUMgdG8gYWRkCisgKi8KK2ludCBxZWRfbGxoX2FkZF9tYWNfZmlsdGVyKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1OCAqcF9maWx0ZXIpOworCisvKioKKyAqIEBicmllZiBxZWRfbGxoX3JlbW92ZV9tYWNfZmlsdGVyIC0gcmVtb3ZlcyBhIE1BQyBmaWx0ZXIgZnJvbSBsbGgKKyAqCisgKiBAcGFyYW0gcF9od2ZuCisgKiBAcGFyYW0gcF9wdHQKKyAqIEBwYXJhbSBwX2ZpbHRlciAtIE1BQyB0byByZW1vdmUKKyAqLwordm9pZCBxZWRfbGxoX3JlbW92ZV9tYWNfZmlsdGVyKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgdTggKnBfZmlsdGVyKTsKKworLyoqCiAgKiAqQGJyaWVmIENsZWFudXAgb2YgcHJldmlvdXMgZHJpdmVyIHJlbWFpbnMgcHJpb3IgdG8gbG9hZAogICoKICAqIEBwYXJhbSBwX2h3Zm4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2hzaS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfaHNpLmgKaW5kZXggNTkyNzg0MC4uNzJlZWUyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfaHNpLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfaHNpLmgKQEAgLTUzNiw2ICs1MzYsMjQ3IEBACiAJc3RydWN0IHJlZ3BhaXIgdXN0b3JtX3N0X3BhZGRpbmdbMl07CiB9OwogCitlbnVtIGNvcmVfZXJyb3JfaGFuZGxlIHsKKwlMTDJfRFJPUF9QQUNLRVQsCisJTEwyX0RPX05PVEhJTkcsCisJTEwyX0FTU0VSVCwKKwlNQVhfQ09SRV9FUlJPUl9IQU5ETEUKK307CisKK2VudW0gY29yZV9ldmVudF9vcGNvZGUgeworCUNPUkVfRVZFTlRfVFhfUVVFVUVfU1RBUlQsCisJQ09SRV9FVkVOVF9UWF9RVUVVRV9TVE9QLAorCUNPUkVfRVZFTlRfUlhfUVVFVUVfU1RBUlQsCisJQ09SRV9FVkVOVF9SWF9RVUVVRV9TVE9QLAorCU1BWF9DT1JFX0VWRU5UX09QQ09ERQorfTsKKworZW51bSBjb3JlX2w0X3BzZXVkb19jaGVja3N1bV9tb2RlIHsKKwlDT1JFX0w0X1BTRVVET19DU1VNX0NPUlJFQ1RfTEVOR1RILAorCUNPUkVfTDRfUFNFVURPX0NTVU1fWkVST19MRU5HVEgsCisJTUFYX0NPUkVfTDRfUFNFVURPX0NIRUNLU1VNX01PREUKK307CisKK3N0cnVjdCBjb3JlX2xsMl9wb3J0X3N0YXRzIHsKKwlzdHJ1Y3QgcmVncGFpciBnc2lfaW52YWxpZF9oZHI7CisJc3RydWN0IHJlZ3BhaXIgZ3NpX2ludmFsaWRfcGt0X2xlbmd0aDsKKwlzdHJ1Y3QgcmVncGFpciBnc2lfdW5zdXBwb3J0ZWRfcGt0X3R5cDsKKwlzdHJ1Y3QgcmVncGFpciBnc2lfY3JjY2hrc21fZXJyb3I7Cit9OworCitzdHJ1Y3QgY29yZV9sbDJfcHN0b3JtX3Blcl9xdWV1ZV9zdGF0IHsKKwlzdHJ1Y3QgcmVncGFpciBzZW50X3VjYXN0X2J5dGVzOworCXN0cnVjdCByZWdwYWlyIHNlbnRfbWNhc3RfYnl0ZXM7CisJc3RydWN0IHJlZ3BhaXIgc2VudF9iY2FzdF9ieXRlczsKKwlzdHJ1Y3QgcmVncGFpciBzZW50X3VjYXN0X3BrdHM7CisJc3RydWN0IHJlZ3BhaXIgc2VudF9tY2FzdF9wa3RzOworCXN0cnVjdCByZWdwYWlyIHNlbnRfYmNhc3RfcGt0czsKK307CisKK3N0cnVjdCBjb3JlX2xsMl9yeF9wcm9kIHsKKwlfX2xlMTYgYmRfcHJvZDsKKwlfX2xlMTYgY3FlX3Byb2Q7CisJX19sZTMyIHJlc2VydmVkOworfTsKKworc3RydWN0IGNvcmVfbGwyX3RzdG9ybV9wZXJfcXVldWVfc3RhdCB7CisJc3RydWN0IHJlZ3BhaXIgcGFja2V0X3Rvb19iaWdfZGlzY2FyZDsKKwlzdHJ1Y3QgcmVncGFpciBub19idWZmX2Rpc2NhcmQ7Cit9OworCitzdHJ1Y3QgY29yZV9sbDJfdXN0b3JtX3Blcl9xdWV1ZV9zdGF0IHsKKwlzdHJ1Y3QgcmVncGFpciByY3ZfdWNhc3RfYnl0ZXM7CisJc3RydWN0IHJlZ3BhaXIgcmN2X21jYXN0X2J5dGVzOworCXN0cnVjdCByZWdwYWlyIHJjdl9iY2FzdF9ieXRlczsKKwlzdHJ1Y3QgcmVncGFpciByY3ZfdWNhc3RfcGt0czsKKwlzdHJ1Y3QgcmVncGFpciByY3ZfbWNhc3RfcGt0czsKKwlzdHJ1Y3QgcmVncGFpciByY3ZfYmNhc3RfcGt0czsKK307CisKK2VudW0gY29yZV9yYW1yb2RfY21kX2lkIHsKKwlDT1JFX1JBTVJPRF9VTlVTRUQsCisJQ09SRV9SQU1ST0RfUlhfUVVFVUVfU1RBUlQsCisJQ09SRV9SQU1ST0RfVFhfUVVFVUVfU1RBUlQsCisJQ09SRV9SQU1ST0RfUlhfUVVFVUVfU1RPUCwKKwlDT1JFX1JBTVJPRF9UWF9RVUVVRV9TVE9QLAorCU1BWF9DT1JFX1JBTVJPRF9DTURfSUQKK307CisKK2VudW0gY29yZV9yb2NlX2ZsYXZvcl90eXBlIHsKKwlDT1JFX1JPQ0UsCisJQ09SRV9SUk9DRSwKKwlNQVhfQ09SRV9ST0NFX0ZMQVZPUl9UWVBFCit9OworCitzdHJ1Y3QgY29yZV9yeF9hY3Rpb25fb25fZXJyb3IgeworCXU4IGVycm9yX3R5cGU7CisjZGVmaW5lIENPUkVfUlhfQUNUSU9OX09OX0VSUk9SX1BBQ0tFVF9UT09fQklHX01BU0sJMHgzCisjZGVmaW5lIENPUkVfUlhfQUNUSU9OX09OX0VSUk9SX1BBQ0tFVF9UT09fQklHX1NISUZUIDAKKyNkZWZpbmUgQ09SRV9SWF9BQ1RJT05fT05fRVJST1JfTk9fQlVGRl9NQVNLCTB4MworI2RlZmluZSBDT1JFX1JYX0FDVElPTl9PTl9FUlJPUl9OT19CVUZGX1NISUZUCTIKKyNkZWZpbmUgQ09SRV9SWF9BQ1RJT05fT05fRVJST1JfUkVTRVJWRURfTUFTSwkweEYKKyNkZWZpbmUgQ09SRV9SWF9BQ1RJT05fT05fRVJST1JfUkVTRVJWRURfU0hJRlQJNAorfTsKKworc3RydWN0IGNvcmVfcnhfYmQgeworCXN0cnVjdCByZWdwYWlyIGFkZHI7CisJX19sZTE2IHJlc2VydmVkWzRdOworfTsKKworc3RydWN0IGNvcmVfcnhfYmRfd2l0aF9idWZmX2xlbiB7CisJc3RydWN0IHJlZ3BhaXIgYWRkcjsKKwlfX2xlMTYgYnVmZl9sZW5ndGg7CisJX19sZTE2IHJlc2VydmVkWzNdOworfTsKKwordW5pb24gY29yZV9yeF9iZF91bmlvbiB7CisJc3RydWN0IGNvcmVfcnhfYmQgcnhfYmQ7CisJc3RydWN0IGNvcmVfcnhfYmRfd2l0aF9idWZmX2xlbiByeF9iZF93aXRoX2xlbjsKK307CisKK3N0cnVjdCBjb3JlX3J4X2NxZV9vcGFxdWVfZGF0YSB7CisJX19sZTMyIGRhdGFbMl07Cit9OworCitlbnVtIGNvcmVfcnhfY3FlX3R5cGUgeworCUNPUkVfUlhfQ1FFX0lMTElHQUxfVFlQRSwKKwlDT1JFX1JYX0NRRV9UWVBFX1JFR1VMQVIsCisJQ09SRV9SWF9DUUVfVFlQRV9HU0lfT0ZGTE9BRCwKKwlDT1JFX1JYX0NRRV9UWVBFX1NMT1dfUEFUSCwKKwlNQVhfQ09SRV9SWF9DUUVfVFlQRQorfTsKKworc3RydWN0IGNvcmVfcnhfZmFzdF9wYXRoX2NxZSB7CisJdTggdHlwZTsKKwl1OCBwbGFjZW1lbnRfb2Zmc2V0OworCXN0cnVjdCBwYXJzaW5nX2FuZF9lcnJfZmxhZ3MgcGFyc2VfZmxhZ3M7CisJX19sZTE2IHBhY2tldF9sZW5ndGg7CisJX19sZTE2IHZsYW47CisJc3RydWN0IGNvcmVfcnhfY3FlX29wYXF1ZV9kYXRhIG9wYXF1ZV9kYXRhOworCV9fbGUzMiByZXNlcnZlZFs0XTsKK307CisKK3N0cnVjdCBjb3JlX3J4X2dzaV9vZmZsb2FkX2NxZSB7CisJdTggdHlwZTsKKwl1OCBkYXRhX2xlbmd0aF9lcnJvcjsKKwlzdHJ1Y3QgcGFyc2luZ19hbmRfZXJyX2ZsYWdzIHBhcnNlX2ZsYWdzOworCV9fbGUxNiBkYXRhX2xlbmd0aDsKKwlfX2xlMTYgdmxhbjsKKwlfX2xlMzIgc3JjX21hY19hZGRyaGk7CisJX19sZTE2IHNyY19tYWNfYWRkcmxvOworCXU4IHJlc2VydmVkMVsyXTsKKwlfX2xlMzIgZ2lkX2RzdFs0XTsKK307CisKK3N0cnVjdCBjb3JlX3J4X3Nsb3dfcGF0aF9jcWUgeworCXU4IHR5cGU7CisJdTggcmFtcm9kX2NtZF9pZDsKKwlfX2xlMTYgZWNobzsKKwlfX2xlMzIgcmVzZXJ2ZWQxWzddOworfTsKKwordW5pb24gY29yZV9yeF9jcWVfdW5pb24geworCXN0cnVjdCBjb3JlX3J4X2Zhc3RfcGF0aF9jcWUgcnhfY3FlX2ZwOworCXN0cnVjdCBjb3JlX3J4X2dzaV9vZmZsb2FkX2NxZSByeF9jcWVfZ3NpOworCXN0cnVjdCBjb3JlX3J4X3Nsb3dfcGF0aF9jcWUgcnhfY3FlX3NwOworfTsKKworc3RydWN0IGNvcmVfcnhfc3RhcnRfcmFtcm9kX2RhdGEgeworCXN0cnVjdCByZWdwYWlyIGJkX2Jhc2U7CisJc3RydWN0IHJlZ3BhaXIgY3FlX3BibF9hZGRyOworCV9fbGUxNiBtdHU7CisJX19sZTE2IHNiX2lkOworCXU4IHNiX2luZGV4OworCXU4IGNvbXBsZXRlX2NxZV9mbGc7CisJdTggY29tcGxldGVfZXZlbnRfZmxnOworCXU4IGRyb3BfdHRsMF9mbGc7CisJX19sZTE2IG51bV9vZl9wYmxfcGFnZXM7CisJdTggaW5uZXJfdmxhbl9yZW1vdmFsX2VuOworCXU4IHF1ZXVlX2lkOworCXU4IG1haW5fZnVuY19xdWV1ZTsKKwl1OCBtZl9zaV9iY2FzdF9hY2NlcHRfYWxsOworCXU4IG1mX3NpX21jYXN0X2FjY2VwdF9hbGw7CisJc3RydWN0IGNvcmVfcnhfYWN0aW9uX29uX2Vycm9yIGFjdGlvbl9vbl9lcnJvcjsKKwl1OCBnc2lfb2ZmbG9hZF9mbGFnOworCXU4IHJlc2VydmVkWzddOworfTsKKworc3RydWN0IGNvcmVfcnhfc3RvcF9yYW1yb2RfZGF0YSB7CisJdTggY29tcGxldGVfY3FlX2ZsZzsKKwl1OCBjb21wbGV0ZV9ldmVudF9mbGc7CisJdTggcXVldWVfaWQ7CisJdTggcmVzZXJ2ZWQxOworCV9fbGUxNiByZXNlcnZlZDJbMl07Cit9OworCitzdHJ1Y3QgY29yZV90eF9iZF9mbGFncyB7CisJdTggYXNfYml0ZmllbGQ7CisjZGVmaW5lIENPUkVfVFhfQkRfRkxBR1NfRk9SQ0VfVkxBTl9NT0RFX01BU0sJMHgxCisjZGVmaW5lIENPUkVfVFhfQkRfRkxBR1NfRk9SQ0VfVkxBTl9NT0RFX1NISUZUCTAKKyNkZWZpbmUgQ09SRV9UWF9CRF9GTEFHU19WTEFOX0lOU0VSVElPTl9NQVNLCTB4MQorI2RlZmluZSBDT1JFX1RYX0JEX0ZMQUdTX1ZMQU5fSU5TRVJUSU9OX1NISUZUCTEKKyNkZWZpbmUgQ09SRV9UWF9CRF9GTEFHU19TVEFSVF9CRF9NQVNLCTB4MQorI2RlZmluZSBDT1JFX1RYX0JEX0ZMQUdTX1NUQVJUX0JEX1NISUZUCTIKKyNkZWZpbmUgQ09SRV9UWF9CRF9GTEFHU19JUF9DU1VNX01BU0sJMHgxCisjZGVmaW5lIENPUkVfVFhfQkRfRkxBR1NfSVBfQ1NVTV9TSElGVAkzCisjZGVmaW5lIENPUkVfVFhfQkRfRkxBR1NfTDRfQ1NVTV9NQVNLCTB4MQorI2RlZmluZSBDT1JFX1RYX0JEX0ZMQUdTX0w0X0NTVU1fU0hJRlQJNAorI2RlZmluZSBDT1JFX1RYX0JEX0ZMQUdTX0lQVjZfRVhUX01BU0sJMHgxCisjZGVmaW5lIENPUkVfVFhfQkRfRkxBR1NfSVBWNl9FWFRfU0hJRlQJNQorI2RlZmluZSBDT1JFX1RYX0JEX0ZMQUdTX0w0X1BST1RPQ09MX01BU0sJMHgxCisjZGVmaW5lIENPUkVfVFhfQkRfRkxBR1NfTDRfUFJPVE9DT0xfU0hJRlQJNgorI2RlZmluZSBDT1JFX1RYX0JEX0ZMQUdTX0w0X1BTRVVET19DU1VNX01PREVfTUFTSwkweDEKKyNkZWZpbmUgQ09SRV9UWF9CRF9GTEFHU19MNF9QU0VVRE9fQ1NVTV9NT0RFX1NISUZUIDcKKyNkZWZpbmUgQ09SRV9UWF9CRF9GTEFHU19ST0NFX0ZMQVZfTUFTSwkJMHgxCisjZGVmaW5lIENPUkVfVFhfQkRfRkxBR1NfUk9DRV9GTEFWX1NISUZUCTEyCisKK307CisKK3N0cnVjdCBjb3JlX3R4X2JkIHsKKwlzdHJ1Y3QgcmVncGFpciBhZGRyOworCV9fbGUxNiBuYnl0ZXM7CisJX19sZTE2IG53X3ZsYW5fb3JfbGJfZWNobzsKKwl1OCBiaXRmaWVsZDA7CisjZGVmaW5lIENPUkVfVFhfQkRfTkJEU19NQVNLCTB4RgorI2RlZmluZSBDT1JFX1RYX0JEX05CRFNfU0hJRlQJMAorI2RlZmluZSBDT1JFX1RYX0JEX1JPQ0VfRkxBVl9NQVNLCTB4MQorI2RlZmluZSBDT1JFX1RYX0JEX1JPQ0VfRkxBVl9TSElGVAk0CisjZGVmaW5lIENPUkVfVFhfQkRfUkVTRVJWRUQwX01BU0sJMHg3CisjZGVmaW5lIENPUkVfVFhfQkRfUkVTRVJWRUQwX1NISUZUCTUKKwlzdHJ1Y3QgY29yZV90eF9iZF9mbGFncyBiZF9mbGFnczsKKwlfX2xlMTYgYml0ZmllbGQxOworI2RlZmluZSBDT1JFX1RYX0JEX0w0X0hEUl9PRkZTRVRfV19NQVNLCTB4M0ZGRgorI2RlZmluZSBDT1JFX1RYX0JEX0w0X0hEUl9PRkZTRVRfV19TSElGVCAwCisjZGVmaW5lIENPUkVfVFhfQkRfVFhfRFNUX01BU0sJMHgxCisjZGVmaW5lIENPUkVfVFhfQkRfVFhfRFNUX1NISUZUCTE0CisjZGVmaW5lIENPUkVfVFhfQkRfUkVTRVJWRUQxX01BU0sJMHgxCisjZGVmaW5lIENPUkVfVFhfQkRfUkVTRVJWRUQxX1NISUZUCTE1Cit9OworCitlbnVtIGNvcmVfdHhfZGVzdCB7CisJQ09SRV9UWF9ERVNUX05XLAorCUNPUkVfVFhfREVTVF9MQiwKKwlNQVhfQ09SRV9UWF9ERVNUCit9OworCitzdHJ1Y3QgY29yZV90eF9zdGFydF9yYW1yb2RfZGF0YSB7CisJc3RydWN0IHJlZ3BhaXIgcGJsX2Jhc2VfYWRkcjsKKwlfX2xlMTYgbXR1OworCV9fbGUxNiBzYl9pZDsKKwl1OCBzYl9pbmRleDsKKwl1OCBzdGF0c19lbjsKKwl1OCBzdGF0c19pZDsKKwl1OCBjb25uX3R5cGU7CisJX19sZTE2IHBibF9zaXplOworCV9fbGUxNiBxbV9wcV9pZDsKKwl1OCBnc2lfb2ZmbG9hZF9mbGFnOworCXU4IHJlc3J2ZWRbM107Cit9OworCitzdHJ1Y3QgY29yZV90eF9zdG9wX3JhbXJvZF9kYXRhIHsKKwlfX2xlMzIgcmVzZXJ2ZWQwWzJdOworfTsKKwogc3RydWN0IGV0aF9tc3Rvcm1fcGVyX3BmX3N0YXQgewogCXN0cnVjdCByZWdwYWlyIGdyZV9kaXNjYXJkX3BrdHM7CiAJc3RydWN0IHJlZ3BhaXIgdnhsYW5fZGlzY2FyZF9wa3RzOwpAQCAtNjM2LDkgKzg3NywzMyBAQAogfTsKIAogLyogTXN0b3JtIG5vbi10cmlnZ2VyaW5nIFZGIHpvbmUgKi8KK2VudW0gbWFsaWNpb3VzX3ZmX2Vycm9yX2lkIHsKKwlNQUxJQ0lPVVNfVkZfTk9fRVJST1IsCisJVkZfUEZfQ0hBTk5FTF9OT1RfUkVBRFksCisJVkZfWk9ORV9NU0dfTk9UX1ZBTElELAorCVZGX1pPTkVfRlVOQ19OT1RfRU5BQkxFRCwKKwlFVEhfUEFDS0VUX1RPT19TTUFMTCwKKwlFVEhfSUxMRUdBTF9WTEFOX01PREUsCisJRVRIX01UVV9WSU9MQVRJT04sCisJRVRIX0lMTEVHQUxfSU5CQU5EX1RBR1MsCisJRVRIX1ZMQU5fSU5TRVJUX0FORF9JTkJBTkRfVkxBTiwKKwlFVEhfSUxMRUdBTF9OQkRTLAorCUVUSF9GSVJTVF9CRF9XT19TT1AsCisJRVRIX0lOU1VGRklDSUVOVF9CRFMsCisJRVRIX0lMTEVHQUxfTFNPX0hEUl9OQkRTLAorCUVUSF9JTExFR0FMX0xTT19NU1MsCisJRVRIX1pFUk9fU0laRV9CRCwKKwlFVEhfSUxMRUdBTF9MU09fSERSX0xFTiwKKwlFVEhfSU5TVUZGSUNJRU5UX1BBWUxPQUQsCisJRVRIX0VEUE1fT1VUX09GX1NZTkMsCisJRVRIX1RVTk5fSVBWNl9FWFRfTkJEX0VSUiwKKwlFVEhfQ09OVFJPTF9QQUNLRVRfVklPTEFUSU9OLAorCU1BWF9NQUxJQ0lPVVNfVkZfRVJST1JfSUQKK307CisKIHN0cnVjdCBtc3Rvcm1fbm9uX3RyaWdnZXJfdmZfem9uZSB7CiAJc3RydWN0IGV0aF9tc3Rvcm1fcGVyX3F1ZXVlX3N0YXQgZXRoX3F1ZXVlX3N0YXQ7Ci0Jc3RydWN0IGV0aF9yeF9wcm9kX2RhdGEgZXRoX3J4X3F1ZXVlX3Byb2R1Y2Vyc1tFVEhfTUFYX05VTV9SWF9RVUVVRVNfUEVSX1ZGXTsKKwlzdHJ1Y3QgZXRoX3J4X3Byb2RfZGF0YSBldGhfcnhfcXVldWVfcHJvZHVjZXJzW0VUSF9NQVhfTlVNX1JYX1FVRVVFU19QRVJfVkZfUVVBRF07CiB9OwogCiAvKiBNc3Rvcm0gVkYgem9uZSAqLwpAQCAtNzA1LDEzICs5NzAsMTcgQEAKIAogc3RydWN0IHByb3RvY29sX2RjYl9kYXRhIHsKIAl1OCBkY2JfZW5hYmxlX2ZsYWc7CisJdTggcmVzZXJ2ZWRfYTsKIAl1OCBkY2JfcHJpb3JpdHk7CiAJdTggZGNiX3RjOwotCXU4IHJlc2VydmVkOworCXU4IHJlc2VydmVkX2I7CisJdTggcmVzZXJ2ZWQwOwogfTsKIAogc3RydWN0IHBmX3VwZGF0ZV90dW5uZWxfY29uZmlnIHsKIAl1OCB1cGRhdGVfcnhfcGZfY2xzczsKKwl1OCB1cGRhdGVfcnhfZGVmX3VjYXN0X2Nsc3M7CisJdTggdXBkYXRlX3J4X2RlZl9ub25fdWNhc3RfY2xzczsKIAl1OCB1cGRhdGVfdHhfcGZfY2xzczsKIAl1OCBzZXRfdnhsYW5fdWRwX3BvcnRfZmxnOwogCXU4IHNldF9nZW5ldmVfdWRwX3BvcnRfZmxnOwpAQCAtNzI3LDcgKzk5Niw3IEBACiAJdTggdHVubmVsX2Nsc3NfaXBncmU7CiAJX19sZTE2IHZ4bGFuX3VkcF9wb3J0OwogCV9fbGUxNiBnZW5ldmVfdWRwX3BvcnQ7Ci0JX19sZTE2IHJlc2VydmVkWzNdOworCV9fbGUxNiByZXNlcnZlZFsyXTsKIH07CiAKIHN0cnVjdCBwZl91cGRhdGVfcmFtcm9kX2RhdGEgewpAQCAtNzM2LDE2ICsxMDA1LDE3IEBACiAJdTggdXBkYXRlX2Zjb2VfZGNiX2RhdGFfZmxhZzsKIAl1OCB1cGRhdGVfaXNjc2lfZGNiX2RhdGFfZmxhZzsKIAl1OCB1cGRhdGVfcm9jZV9kY2JfZGF0YV9mbGFnOworCXU4IHVwZGF0ZV9ycm9jZV9kY2JfZGF0YV9mbGFnOwogCXU4IHVwZGF0ZV9pd2FycF9kY2JfZGF0YV9mbGFnOwogCXU4IHVwZGF0ZV9tZl92bGFuX2ZsYWc7Ci0JdTggcmVzZXJ2ZWQ7CiAJc3RydWN0IHByb3RvY29sX2RjYl9kYXRhIGV0aF9kY2JfZGF0YTsKIAlzdHJ1Y3QgcHJvdG9jb2xfZGNiX2RhdGEgZmNvZV9kY2JfZGF0YTsKIAlzdHJ1Y3QgcHJvdG9jb2xfZGNiX2RhdGEgaXNjc2lfZGNiX2RhdGE7CiAJc3RydWN0IHByb3RvY29sX2RjYl9kYXRhIHJvY2VfZGNiX2RhdGE7CisJc3RydWN0IHByb3RvY29sX2RjYl9kYXRhIHJyb2NlX2RjYl9kYXRhOwogCXN0cnVjdCBwcm90b2NvbF9kY2JfZGF0YSBpd2FycF9kY2JfZGF0YTsKIAlfX2xlMTYgbWZfdmxhbjsKLQlfX2xlMTYgcmVzZXJ2ZWQyOworCV9fbGUxNiByZXNlcnZlZDsKIAlzdHJ1Y3QgcGZfdXBkYXRlX3R1bm5lbF9jb25maWcgdHVubmVsX2NvbmZpZzsKIH07CiAKQEAgLTc2NiwxMCArMTAzNiwxNCBAQAogCU1BWF9QUk9UT0NPTF9WRVJTSU9OX0FSUkFZX0tFWQogfTsKIAotLyogUHN0b3JtIG5vbi10cmlnZ2VyaW5nIFZGIHpvbmUgKi8KK3N0cnVjdCByZG1hX3NlbnRfc3RhdHMgeworCXN0cnVjdCByZWdwYWlyIHNlbnRfYnl0ZXM7CisJc3RydWN0IHJlZ3BhaXIgc2VudF9wa3RzOworfTsKKwogc3RydWN0IHBzdG9ybV9ub25fdHJpZ2dlcl92Zl96b25lIHsKIAlzdHJ1Y3QgZXRoX3BzdG9ybV9wZXJfcXVldWVfc3RhdCBldGhfcXVldWVfc3RhdDsKLQlzdHJ1Y3QgcmVncGFpciByZXNlcnZlZFsyXTsKKwlzdHJ1Y3QgcmRtYV9zZW50X3N0YXRzIHJkbWFfc3RhdHM7CiB9OwogCiAvKiBQc3Rvcm0gVkYgem9uZSAqLwpAQCAtNzg2LDcgKzEwNjAsMTEgQEAKIAlfX2xlMTYgZWNobzsKIH07CiAKLS8qIFNsb3dwYXRoIEVsZW1lbnQgKFNQUUUpICovCitzdHJ1Y3QgcmRtYV9yY3Zfc3RhdHMgeworCXN0cnVjdCByZWdwYWlyIHJjdl9ieXRlczsKKwlzdHJ1Y3QgcmVncGFpciByY3ZfcGt0czsKK307CisKIHN0cnVjdCBzbG93X3BhdGhfZWxlbWVudCB7CiAJc3RydWN0IHJhbXJvZF9oZWFkZXIgaGRyOwogCXN0cnVjdCByZWdwYWlyIGRhdGFfcHRyOwpAQCAtNzk0LDcgKzEwNzIsNyBAQAogCiAvKiBUc3Rvcm0gbm9uLXRyaWdnZXJpbmcgVkYgem9uZSAqLwogc3RydWN0IHRzdG9ybV9ub25fdHJpZ2dlcl92Zl96b25lIHsKLQlzdHJ1Y3QgcmVncGFpciByZXNlcnZlZFsyXTsKKwlzdHJ1Y3QgcmRtYV9yY3Zfc3RhdHMgcmRtYV9zdGF0czsKIH07CiAKIHN0cnVjdCB0c3Rvcm1fcGVyX3BvcnRfc3RhdCB7CkBAIC04MDIsOSArMTA4MCwxNCBAQAogCXN0cnVjdCByZWdwYWlyIG1hY19lcnJvcl9kaXNjYXJkOwogCXN0cnVjdCByZWdwYWlyIG1mdGFnX2ZpbHRlcl9kaXNjYXJkOwogCXN0cnVjdCByZWdwYWlyIGV0aF9tYWNfZmlsdGVyX2Rpc2NhcmQ7Ci0Jc3RydWN0IHJlZ3BhaXIgcmVzZXJ2ZWRbNV07CisJc3RydWN0IHJlZ3BhaXIgbGwyX21hY19maWx0ZXJfZGlzY2FyZDsKKwlzdHJ1Y3QgcmVncGFpciBsbDJfY29ubl9kaXNhYmxlZF9kaXNjYXJkOworCXN0cnVjdCByZWdwYWlyIGlzY3NpX2lycmVndWxhcl9wa3Q7CisJc3RydWN0IHJlZ3BhaXIgcmVzZXJ2ZWQ7CisJc3RydWN0IHJlZ3BhaXIgcm9jZV9pcnJlZ3VsYXJfcGt0OwogCXN0cnVjdCByZWdwYWlyIGV0aF9pcnJlZ3VsYXJfcGt0OwotCXN0cnVjdCByZWdwYWlyIHJlc2VydmVkMVsyXTsKKwlzdHJ1Y3QgcmVncGFpciByZXNlcnZlZDE7CisJc3RydWN0IHJlZ3BhaXIgcHJlcm9jZV9pcnJlZ3VsYXJfcGt0OwogCXN0cnVjdCByZWdwYWlyIGV0aF9ncmVfdHVubl9maWx0ZXJfZGlzY2FyZDsKIAlzdHJ1Y3QgcmVncGFpciBldGhfdnhsYW5fdHVubl9maWx0ZXJfZGlzY2FyZDsKIAlzdHJ1Y3QgcmVncGFpciBldGhfZ2VuZXZlX3R1bm5fZmlsdGVyX2Rpc2NhcmQ7CkBAIC04NzAsNyArMTE1MywxMyBAQAogCV9fbGUzMiByZXNlcnZlZDI7CiB9OwogCi0vKiBBdHRlbnRpb25zIHN0YXR1cyBibG9jayAqLworZW51bSB2Zl96b25lX3NpemVfbW9kZSB7CisJVkZfWk9ORV9TSVpFX01PREVfREVGQVVMVCwKKwlWRl9aT05FX1NJWkVfTU9ERV9ET1VCTEUsCisJVkZfWk9ORV9TSVpFX01PREVfUVVBRCwKKwlNQVhfVkZfWk9ORV9TSVpFX01PREUKK307CisKIHN0cnVjdCBhdHRlbl9zdGF0dXNfYmxvY2sgewogCV9fbGUzMiBhdHRlbl9iaXRzOwogCV9fbGUzMiBhdHRlbl9hY2s7CkBAIC0xNDQyLDEzICsxNzMxLDYgQEAKIAlNQVhfQklOX0RCR19CVUZGRVJfVFlQRQogfTsKIAotLyogQ2hpcCBJRHMgKi8KLWVudW0gY2hpcF9pZHMgewotCUNISVBfUkVTRVJWRUQsCi0JQ0hJUF9CQl9CMCwKLQlDSElQX1JFU0VSVkVEMiwKLQlNQVhfQ0hJUF9JRFMKLX07CiAKIC8qIEF0dGVudGlvbiBiaXQgbWFwcGluZyAqLwogc3RydWN0IGRiZ19hdHRuX2JpdF9tYXBwaW5nIHsKQEAgLTE1MjcsNiArMTgwOSwzNzEgQEAKIAlNQVhfREJHX0FUVE5fVFlQRQogfTsKIAorLyogY29uZGl0aW9uIGhlYWRlciBmb3IgcmVnaXN0ZXJzIGR1bXAgKi8KK3N0cnVjdCBkYmdfZHVtcF9jb25kX2hkciB7CisJc3RydWN0IGRiZ19tb2RlX2hkciBtb2RlOyAvKiBNb2RlIGhlYWRlciAqLworCXU4IGJsb2NrX2lkOyAvKiBibG9jayBJRCAqLworCXU4IGRhdGFfc2l6ZTsgLyogc2l6ZSBpbiBkd29yZHMgb2YgdGhlIGRhdGEgZm9sbG93aW5nIHRoaXMgaGVhZGVyICovCit9OworCisvKiBtZW1vcnkgZGF0YSBmb3IgcmVnaXN0ZXJzIGR1bXAgKi8KK3N0cnVjdCBkYmdfZHVtcF9tZW0geworCV9fbGUzMiBkd29yZDA7CisjZGVmaW5lIERCR19EVU1QX01FTV9BRERSRVNTX01BU0sgICAgICAgMHhGRkZGRkYKKyNkZWZpbmUgREJHX0RVTVBfTUVNX0FERFJFU1NfU0hJRlQgICAgICAwCisjZGVmaW5lIERCR19EVU1QX01FTV9NRU1fR1JPVVBfSURfTUFTSyAgMHhGRgorI2RlZmluZSBEQkdfRFVNUF9NRU1fTUVNX0dST1VQX0lEX1NISUZUIDI0CisJX19sZTMyIGR3b3JkMTsKKyNkZWZpbmUgREJHX0RVTVBfTUVNX0xFTkdUSF9NQVNLICAgICAgICAweEZGRkZGRgorI2RlZmluZSBEQkdfRFVNUF9NRU1fTEVOR1RIX1NISUZUICAgICAgIDAKKyNkZWZpbmUgREJHX0RVTVBfTUVNX1JFU0VSVkVEX01BU0sgICAgICAweEZGCisjZGVmaW5lIERCR19EVU1QX01FTV9SRVNFUlZFRF9TSElGVCAgICAgMjQKK307CisKKy8qIHJlZ2lzdGVyIGRhdGEgZm9yIHJlZ2lzdGVycyBkdW1wICovCitzdHJ1Y3QgZGJnX2R1bXBfcmVnIHsKKwlfX2xlMzIgZGF0YTsKKyNkZWZpbmUgREJHX0RVTVBfUkVHX0FERFJFU1NfTUFTSyAgMHhGRkZGRkYgLyogcmVnaXN0ZXIgYWRkcmVzcyAoaW4gZHdvcmRzKSAqLworI2RlZmluZSBEQkdfRFVNUF9SRUdfQUREUkVTU19TSElGVCAwCisjZGVmaW5lIERCR19EVU1QX1JFR19MRU5HVEhfTUFTSyAgIDB4RkYgLyogcmVnaXN0ZXIgc2l6ZSAoaW4gZHdvcmRzKSAqLworI2RlZmluZSBEQkdfRFVNUF9SRUdfTEVOR1RIX1NISUZUICAyNAorfTsKKworLyogc3BsaXQgaGVhZGVyIGZvciByZWdpc3RlcnMgZHVtcCAqLworc3RydWN0IGRiZ19kdW1wX3NwbGl0X2hkciB7CisJX19sZTMyIGhkcjsKKyNkZWZpbmUgREJHX0RVTVBfU1BMSVRfSERSX0RBVEFfU0laRV9NQVNLICAgICAgMHhGRkZGRkYKKyNkZWZpbmUgREJHX0RVTVBfU1BMSVRfSERSX0RBVEFfU0laRV9TSElGVCAgICAgMAorI2RlZmluZSBEQkdfRFVNUF9TUExJVF9IRFJfU1BMSVRfVFlQRV9JRF9NQVNLICAweEZGCisjZGVmaW5lIERCR19EVU1QX1NQTElUX0hEUl9TUExJVF9UWVBFX0lEX1NISUZUIDI0Cit9OworCisvKiBjb25kaXRpb24gaGVhZGVyIGZvciBpZGxlIGNoZWNrICovCitzdHJ1Y3QgZGJnX2lkbGVfY2hrX2NvbmRfaGRyIHsKKwlzdHJ1Y3QgZGJnX21vZGVfaGRyIG1vZGU7IC8qIE1vZGUgaGVhZGVyICovCisJX19sZTE2IGRhdGFfc2l6ZTsgLyogc2l6ZSBpbiBkd29yZHMgb2YgdGhlIGRhdGEgZm9sbG93aW5nIHRoaXMgaGVhZGVyICovCit9OworCisvKiBJZGxlIENoZWNrIGNvbmRpdGlvbiByZWdpc3RlciAqLworc3RydWN0IGRiZ19pZGxlX2Noa19jb25kX3JlZyB7CisJX19sZTMyIGRhdGE7CisjZGVmaW5lIERCR19JRExFX0NIS19DT05EX1JFR19BRERSRVNTX01BU0sgICAweEZGRkZGRgorI2RlZmluZSBEQkdfSURMRV9DSEtfQ09ORF9SRUdfQUREUkVTU19TSElGVCAgMAorI2RlZmluZSBEQkdfSURMRV9DSEtfQ09ORF9SRUdfQkxPQ0tfSURfTUFTSyAgMHhGRgorI2RlZmluZSBEQkdfSURMRV9DSEtfQ09ORF9SRUdfQkxPQ0tfSURfU0hJRlQgMjQKKwlfX2xlMTYgbnVtX2VudHJpZXM7IC8qIG51bWJlciBvZiByZWdpc3RlcnMgZW50cmllcyB0byBjaGVjayAqLworCXU4IGVudHJ5X3NpemU7IC8qIHNpemUgb2YgcmVnaXN0ZXJzIGVudHJ5IChpbiBkd29yZHMpICovCisJdTggc3RhcnRfZW50cnk7IC8qIGluZGV4IG9mIHRoZSBmaXJzdCBlbnRyeSB0byBjaGVjayAqLworfTsKKworLyogSWRsZSBDaGVjayBpbmZvIHJlZ2lzdGVyICovCitzdHJ1Y3QgZGJnX2lkbGVfY2hrX2luZm9fcmVnIHsKKwlfX2xlMzIgZGF0YTsKKyNkZWZpbmUgREJHX0lETEVfQ0hLX0lORk9fUkVHX0FERFJFU1NfTUFTSyAgIDB4RkZGRkZGCisjZGVmaW5lIERCR19JRExFX0NIS19JTkZPX1JFR19BRERSRVNTX1NISUZUICAwCisjZGVmaW5lIERCR19JRExFX0NIS19JTkZPX1JFR19CTE9DS19JRF9NQVNLICAweEZGCisjZGVmaW5lIERCR19JRExFX0NIS19JTkZPX1JFR19CTE9DS19JRF9TSElGVCAyNAorCV9fbGUxNiBzaXplOyAvKiByZWdpc3RlciBzaXplIGluIGR3b3JkcyAqLworCXN0cnVjdCBkYmdfbW9kZV9oZHIgbW9kZTsgLyogTW9kZSBoZWFkZXIgKi8KK307CisKKy8qIElkbGUgQ2hlY2sgcmVnaXN0ZXIgKi8KK3VuaW9uIGRiZ19pZGxlX2Noa19yZWcgeworCXN0cnVjdCBkYmdfaWRsZV9jaGtfY29uZF9yZWcgY29uZF9yZWc7IC8qIGNvbmRpdGlvbiByZWdpc3RlciAqLworCXN0cnVjdCBkYmdfaWRsZV9jaGtfaW5mb19yZWcgaW5mb19yZWc7IC8qIGluZm8gcmVnaXN0ZXIgKi8KK307CisKKy8qIElkbGUgQ2hlY2sgcmVzdWx0IGhlYWRlciAqLworc3RydWN0IGRiZ19pZGxlX2Noa19yZXN1bHRfaGRyIHsKKwlfX2xlMTYgcnVsZV9pZDsgLyogRmFpbGluZyBydWxlIGluZGV4ICovCisJX19sZTE2IG1lbV9lbnRyeV9pZDsgLyogRmFpbGluZyBtZW1vcnkgZW50cnkgaW5kZXggKi8KKwl1OCBudW1fZHVtcGVkX2NvbmRfcmVnczsgLyogbnVtYmVyIG9mIGR1bXBlZCBjb25kaXRpb24gcmVnaXN0ZXJzICovCisJdTggbnVtX2R1bXBlZF9pbmZvX3JlZ3M7IC8qIG51bWJlciBvZiBkdW1wZWQgY29uZGl0aW9uIHJlZ2lzdGVycyAqLworCXU4IHNldmVyaXR5OyAvKiBmcm9tIGRiZ19pZGxlX2Noa19zZXZlcml0eV90eXBlcyBlbnVtICovCisJdTggcmVzZXJ2ZWQ7Cit9OworCisvKiBJZGxlIENoZWNrIHJlc3VsdCByZWdpc3RlciBoZWFkZXIgKi8KK3N0cnVjdCBkYmdfaWRsZV9jaGtfcmVzdWx0X3JlZ19oZHIgeworCXU4IGRhdGE7CisjZGVmaW5lIERCR19JRExFX0NIS19SRVNVTFRfUkVHX0hEUl9JU19NRU1fTUFTSyAgMHgxCisjZGVmaW5lIERCR19JRExFX0NIS19SRVNVTFRfUkVHX0hEUl9JU19NRU1fU0hJRlQgMAorI2RlZmluZSBEQkdfSURMRV9DSEtfUkVTVUxUX1JFR19IRFJfUkVHX0lEX01BU0sgIDB4N0YKKyNkZWZpbmUgREJHX0lETEVfQ0hLX1JFU1VMVF9SRUdfSERSX1JFR19JRF9TSElGVCAxCisJdTggc3RhcnRfZW50cnk7IC8qIGluZGV4IG9mIHRoZSBmaXJzdCBjaGVja2VkIGVudHJ5ICovCisJX19sZTE2IHNpemU7IC8qIHJlZ2lzdGVyIHNpemUgaW4gZHdvcmRzICovCit9OworCisvKiBJZGxlIENoZWNrIHJ1bGUgKi8KK3N0cnVjdCBkYmdfaWRsZV9jaGtfcnVsZSB7CisJX19sZTE2IHJ1bGVfaWQ7IC8qIElkbGUgQ2hlY2sgcnVsZSBJRCAqLworCXU4IHNldmVyaXR5OyAvKiB2YWx1ZSBmcm9tIGRiZ19pZGxlX2Noa19zZXZlcml0eV90eXBlcyBlbnVtICovCisJdTggY29uZF9pZDsgLyogQ29uZGl0aW9uIElEICovCisJdTggbnVtX2NvbmRfcmVnczsgLyogbnVtYmVyIG9mIGNvbmRpdGlvbiByZWdpc3RlcnMgKi8KKwl1OCBudW1faW5mb19yZWdzOyAvKiBudW1iZXIgb2YgaW5mbyByZWdpc3RlcnMgKi8KKwl1OCBudW1faW1tczsgLyogbnVtYmVyIG9mIGltbWVkaWF0ZXMgaW4gdGhlIGNvbmRpdGlvbiAqLworCXU4IHJlc2VydmVkMTsKKwlfX2xlMTYgcmVnX29mZnNldDsgLyogb2Zmc2V0IG9mIHRoaXMgcnVsZXMgcmVnaXN0ZXJzIGluIHRoZSBpZGxlIGNoZWNrCisJCQkgICAgKiByZWdpc3RlciBhcnJheSAoaW4gZGJnX2lkbGVfY2hrX3JlZyB1bml0cykuCisJCQkgICAgKi8KKwlfX2xlMTYgaW1tX29mZnNldDsgLyogb2Zmc2V0IG9mIHRoaXMgcnVsZXMgaW1tZWRpYXRlIHZhbHVlcyBpbiB0aGUKKwkJCSAgICAqIGltbWVkaWF0ZSB2YWx1ZXMgYXJyYXkgKGluIGR3b3JkcykuCisJCQkgICAgKi8KK307CisKKy8qIElkbGUgQ2hlY2sgcnVsZSBwYXJzaW5nIGRhdGEgKi8KK3N0cnVjdCBkYmdfaWRsZV9jaGtfcnVsZV9wYXJzaW5nX2RhdGEgeworCV9fbGUzMiBkYXRhOworI2RlZmluZSBEQkdfSURMRV9DSEtfUlVMRV9QQVJTSU5HX0RBVEFfSEFTX0ZXX01TR19NQVNLICAweDEKKyNkZWZpbmUgREJHX0lETEVfQ0hLX1JVTEVfUEFSU0lOR19EQVRBX0hBU19GV19NU0dfU0hJRlQgMAorI2RlZmluZSBEQkdfSURMRV9DSEtfUlVMRV9QQVJTSU5HX0RBVEFfU1RSX09GRlNFVF9NQVNLICAweDdGRkZGRkZGCisjZGVmaW5lIERCR19JRExFX0NIS19SVUxFX1BBUlNJTkdfREFUQV9TVFJfT0ZGU0VUX1NISUZUIDEKK307CisKKy8qIGlkbGUgY2hlY2sgc2V2ZXJpdHkgdHlwZXMgKi8KK2VudW0gZGJnX2lkbGVfY2hrX3NldmVyaXR5X3R5cGVzIHsKKwkvKiBpZGxlIGNoZWNrIGZhaWx1cmUgc2hvdWxkIGNhdXNlIGFuIGVycm9yICovCisJSURMRV9DSEtfU0VWRVJJVFlfRVJST1IsCisJLyogaWRsZSBjaGVjayBmYWlsdXJlIHNob3VsZCBjYXVzZSBhbiBlcnJvciBvbmx5IGlmIHRoZXJlcyBubyB0cmFmZmljICovCisJSURMRV9DSEtfU0VWRVJJVFlfRVJST1JfTk9fVFJBRkZJQywKKwkvKiBpZGxlIGNoZWNrIGZhaWx1cmUgc2hvdWxkIGNhdXNlIGEgd2FybmluZyAqLworCUlETEVfQ0hLX1NFVkVSSVRZX1dBUk5JTkcsCisJTUFYX0RCR19JRExFX0NIS19TRVZFUklUWV9UWVBFUworfTsKKworLyogRGVidWcgQnVzIGJsb2NrIGRhdGEgKi8KK3N0cnVjdCBkYmdfYnVzX2Jsb2NrX2RhdGEgeworCXU4IGVuYWJsZWQ7IC8qIEluZGljYXRlcyBpZiB0aGUgYmxvY2sgaXMgZW5hYmxlZCBmb3IgcmVjb3JkaW5nICgwLzEpICovCisJdTggaHdfaWQ7IC8qIEhXIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmxvY2sgKi8KKwl1OCBsaW5lX251bTsgLyogRGVidWcgbGluZSBudW1iZXIgdG8gc2VsZWN0ICovCisJdTggcmlnaHRfc2hpZnQ7IC8qIE51bWJlciBvZiB1bml0cyB0byAgcmlnaHQgdGhlIGRlYnVnIGRhdGEgKDAtMykgKi8KKwl1OCBjeWNsZV9lbjsgLyogNC1iaXQgdmFsdWU6IGJpdCBpIHNldCAtPiB1bml0IGkgaXMgZW5hYmxlZC4gKi8KKwl1OCBmb3JjZV92YWxpZDsgLyogNC1iaXQgdmFsdWU6IGJpdCBpIHNldCAtPiB1bml0IGkgaXMgZm9yY2VkIHZhbGlkLiAqLworCXU4IGZvcmNlX2ZyYW1lOyAvKiA0LWJpdCB2YWx1ZTogYml0IGkgc2V0IC0+IHVuaXQgaSBmcmFtZSBiaXQgaXMgZm9yY2VkLgorCQkJICovCisJdTggcmVzZXJ2ZWQ7Cit9OworCisvKiBEZWJ1ZyBCdXMgQ2xpZW50cyAqLworZW51bSBkYmdfYnVzX2NsaWVudHMgeworCURCR19CVVNfQ0xJRU5UX1JCQ04sCisJREJHX0JVU19DTElFTlRfUkJDUCwKKwlEQkdfQlVTX0NMSUVOVF9SQkNSLAorCURCR19CVVNfQ0xJRU5UX1JCQ1QsCisJREJHX0JVU19DTElFTlRfUkJDVSwKKwlEQkdfQlVTX0NMSUVOVF9SQkNGLAorCURCR19CVVNfQ0xJRU5UX1JCQ1gsCisJREJHX0JVU19DTElFTlRfUkJDUywKKwlEQkdfQlVTX0NMSUVOVF9SQkNILAorCURCR19CVVNfQ0xJRU5UX1JCQ1osCisJREJHX0JVU19DTElFTlRfT1RIRVJfRU5HSU5FLAorCURCR19CVVNfQ0xJRU5UX1RJTUVTVEFNUCwKKwlEQkdfQlVTX0NMSUVOVF9DUFUsCisJREJHX0JVU19DTElFTlRfUkJDWSwKKwlEQkdfQlVTX0NMSUVOVF9SQkNRLAorCURCR19CVVNfQ0xJRU5UX1JCQ00sCisJREJHX0JVU19DTElFTlRfUkJDQiwKKwlEQkdfQlVTX0NMSUVOVF9SQkNXLAorCURCR19CVVNfQ0xJRU5UX1JCQ1YsCisJTUFYX0RCR19CVVNfQ0xJRU5UUworfTsKKworLyogRGVidWcgQnVzIG1lbW9yeSBhZGRyZXNzICovCitzdHJ1Y3QgZGJnX2J1c19tZW1fYWRkciB7CisJX19sZTMyIGxvOworCV9fbGUzMiBoaTsKK307CisKKy8qIERlYnVnIEJ1cyBQQ0kgYnVmZmVyIGRhdGEgKi8KK3N0cnVjdCBkYmdfYnVzX3BjaV9idWZfZGF0YSB7CisJc3RydWN0IGRiZ19idXNfbWVtX2FkZHIgcGh5c19hZGRyOyAvKiBQQ0kgYnVmZmVyIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgZGJnX2J1c19tZW1fYWRkciB2aXJ0X2FkZHI7IC8qIFBDSSBidWZmZXIgdmlydHVhbCBhZGRyZXNzICovCisJX19sZTMyIHNpemU7IC8qIFBDSSBidWZmZXIgc2l6ZSBpbiBieXRlcyAqLworfTsKKworLyogRGVidWcgQnVzIFN0b3JtIEVJRCByYW5nZSBmaWx0ZXIgcGFyYW1zICovCitzdHJ1Y3QgZGJnX2J1c19zdG9ybV9laWRfcmFuZ2VfcGFyYW1zIHsKKwl1OCBtaW47IC8qIE1pbmltYWwgZXZlbnQgSUQgdG8gZmlsdGVyIG9uICovCisJdTggbWF4OyAvKiBNYXhpbWFsIGV2ZW50IElEIHRvIGZpbHRlciBvbiAqLworfTsKKworLyogRGVidWcgQnVzIFN0b3JtIEVJRCBtYXNrIGZpbHRlciBwYXJhbXMgKi8KK3N0cnVjdCBkYmdfYnVzX3N0b3JtX2VpZF9tYXNrX3BhcmFtcyB7CisJdTggdmFsOyAvKiBFdmVudCBJRCB2YWx1ZSAqLworCXU4IG1hc2s7IC8qIEV2ZW50IElEIG1hc2suIDFzIGluIHRoZSBtYXNrID0gZG9udCBjYXJlIGJpdHMuICovCit9OworCisvKiBEZWJ1ZyBCdXMgU3Rvcm0gRUlEIGZpbHRlciBwYXJhbXMgKi8KK3VuaW9uIGRiZ19idXNfc3Rvcm1fZWlkX3BhcmFtcyB7CisJc3RydWN0IGRiZ19idXNfc3Rvcm1fZWlkX3JhbmdlX3BhcmFtcyByYW5nZTsKKwlzdHJ1Y3QgZGJnX2J1c19zdG9ybV9laWRfbWFza19wYXJhbXMgbWFzazsKK307CisKKy8qIERlYnVnIEJ1cyBTdG9ybSBkYXRhICovCitzdHJ1Y3QgZGJnX2J1c19zdG9ybV9kYXRhIHsKKwl1OCBmYXN0X2VuYWJsZWQ7CisJdTggZmFzdF9tb2RlOworCXU4IHNsb3dfZW5hYmxlZDsKKwl1OCBzbG93X21vZGU7CisJdTggaHdfaWQ7CisJdTggZWlkX2ZpbHRlcl9lbjsKKwl1OCBlaWRfcmFuZ2Vfbm90X21hc2s7CisJdTggY2lkX2ZpbHRlcl9lbjsKKwl1bmlvbiBkYmdfYnVzX3N0b3JtX2VpZF9wYXJhbXMgZWlkX2ZpbHRlcl9wYXJhbXM7CisJX19sZTE2IHJlc2VydmVkOworCV9fbGUzMiBjaWQ7Cit9OworCisvKiBEZWJ1ZyBCdXMgZGF0YSAqLworc3RydWN0IGRiZ19idXNfZGF0YSB7CisJX19sZTMyIGFwcF92ZXJzaW9uOyAvKiBUaGUgdG9vbHMgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGFwcGxpY2F0aW9uICovCisJdTggc3RhdGU7IC8qIFRoZSBjdXJyZW50IGRlYnVnIGJ1cyBzdGF0ZSAqLworCXU4IGh3X2R3b3JkczsgLyogSFcgZHdvcmRzIHBlciBjeWNsZSAqLworCXU4IG5leHRfaHdfaWQ7IC8qIE5leHQgSFcgSUQgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGFuIGlucHV0ICovCisJdTggbnVtX2VuYWJsZWRfYmxvY2tzOyAvKiBOdW1iZXIgb2YgYmxvY2tzIGVuYWJsZWQgZm9yIHJlY29yZGluZyAqLworCXU4IG51bV9lbmFibGVkX3N0b3JtczsgLyogTnVtYmVyIG9mIFN0b3JtcyBlbmFibGVkIGZvciByZWNvcmRpbmcgKi8KKwl1OCB0YXJnZXQ7IC8qIE91dHB1dCB0YXJnZXQgKi8KKwl1OCBuZXh0X3RyaWdnZXJfc3RhdGU7IC8qIElEIG9mIG5leHQgdHJpZ2dlciBzdGF0ZSB0byBiZSBhZGRlZCAqLworCXU4IG5leHRfY29uc3RyYWludF9pZDsgLyogSUQgb2YgbmV4dCBmaWx0ZXIvdHJpZ2dlciBjb25zdHJhaW50IHRvIGJlCisJCQkJKiBhZGRlZC4KKwkJCQkqLworCXU4IG9uZV9zaG90X2VuOyAvKiBJbmRpY2F0ZXMgaWYgb25lLXNob3QgbW9kZSBpcyBlbmFibGVkICgwLzEpICovCisJdTggZ3JjX2lucHV0X2VuOyAvKiBJbmRpY2F0ZXMgaWYgR1JDIHJlY29yZGluZyBpcyBlbmFibGVkICgwLzEpICovCisJdTggdGltZXN0YW1wX2lucHV0X2VuOyAvKiBJbmRpY2F0ZXMgaWYgdGltZXN0YW1wIHJlY29yZGluZyBpcyBlbmFibGVkCisJCQkJKiAoMC8xKS4KKwkJCQkqLworCXU4IGZpbHRlcl9lbjsgLyogSW5kaWNhdGVzIGlmIHRoZSByZWNvcmRpbmcgZmlsdGVyIGlzIGVuYWJsZWQgKDAvMSkgKi8KKwl1OCB0cmlnZ2VyX2VuOyAvKiBJbmRpY2F0ZXMgaWYgdGhlIHJlY29yZGluZyB0cmlnZ2VyIGlzIGVuYWJsZWQgKDAvMSkgKi8KKwl1OCBhZGRpbmdfZmlsdGVyOyAvKiBJZiB0cnVlLCB0aGUgbmV4dCBhZGRlZCBjb25zdHJhaW50IGJlbG9uZyB0byB0aGUKKwkJCSAgICogZmlsdGVyLiBPdGhlcndpc2UsIGl0IGJlbG9uZ3MgdG8gdGhlIGxhc3QgYWRkZWQKKwkJCSAgICogdHJpZ2dlciBzdGF0ZS4gVmFsaWQgb25seSBpZiBlaXRoZXIgZmlsdGVyIG9yCisJCQkgICAqIHRyaWdnZXJzIGFyZSBlbmFibGVkLgorCQkJICAgKi8KKwl1OCBmaWx0ZXJfcHJlX3RyaWdnZXI7IC8qIEluZGljYXRlcyBpZiB0aGUgcmVjb3JkaW5nIGZpbHRlciBzaG91bGQgYmUKKwkJCQkqIGFwcGxpZWQgYmVmb3JlIHRoZSB0cmlnZ2VyLiBWYWxpZCBvbmx5IGlmIGJvdGgKKwkJCQkqIGZpbHRlciBhbmQgdHJpZ2dlciBhcmUgZW5hYmxlZCAoMC8xKS4KKwkJCQkqLworCXU4IGZpbHRlcl9wb3N0X3RyaWdnZXI7IC8qIEluZGljYXRlcyBpZiB0aGUgcmVjb3JkaW5nIGZpbHRlciBzaG91bGQgYmUKKwkJCQkgKiBhcHBsaWVkIGFmdGVyIHRoZSB0cmlnZ2VyLiBWYWxpZCBvbmx5IGlmIGJvdGgKKwkJCQkgKiBmaWx0ZXIgYW5kIHRyaWdnZXIgYXJlIGVuYWJsZWQgKDAvMSkuCisJCQkJICovCisJdTggdW5pZnlfaW5wdXRzOyAvKiBJZiB0cnVlLCBhbGwgaW5wdXRzIGFyZSBhc3NvY2lhdGVkIHdpdGggSFcgSUQgMC4KKwkJCSAgKiBPdGhlcndpc2UsIGVhY2ggaW5wdXQgaXMgYXNzaWduZWQgYSBkaWZmZXJlbnQgSFcgSUQKKwkJCSAgKiAoMC8xKS4KKwkJCSAgKi8KKwl1OCByY3ZfZnJvbV9vdGhlcl9lbmdpbmU7IC8qIEluZGljYXRlcyBpZiB0aGUgb3RoZXIgZW5naW5lIHNlbmRzIGl0IE5XCisJCQkJICAgKiByZWNvcmRpbmcgdG8gdGhpcyBlbmdpbmUgKDAvMSkuCisJCQkJICAgKi8KKwlzdHJ1Y3QgZGJnX2J1c19wY2lfYnVmX2RhdGEgcGNpX2J1ZjsgLyogRGVidWcgQnVzIFBDSSBidWZmZXIgZGF0YS4gVmFsaWQKKwkJCQkJICAgICAgKiBvbmx5IHdoZW4gdGhlIHRhcmdldCBpcworCQkJCQkgICAgICAqIERCR19CVVNfVEFSR0VUX0lEX1BDSS4KKwkJCQkJICAgICAgKi8KKwlfX2xlMTYgcmVzZXJ2ZWQ7CisJc3RydWN0IGRiZ19idXNfYmxvY2tfZGF0YSBibG9ja3NbODBdOy8qIERlYnVnIEJ1cyBkYXRhIGZvciBlYWNoIGJsb2NrICovCisJc3RydWN0IGRiZ19idXNfc3Rvcm1fZGF0YSBzdG9ybXNbNl07IC8qIERlYnVnIEJ1cyBkYXRhIGZvciBlYWNoIGJsb2NrICovCit9OworCisvKiBEZWJ1ZyBidXMgZnJhbWUgbW9kZXMgKi8KK2VudW0gZGJnX2J1c19mcmFtZV9tb2RlcyB7CisJREJHX0JVU19GUkFNRV9NT0RFXzBIV180U1QgPSAwLCAvKiAwIEhXIGR3b3JkcywgNCBTdG9ybSBkd29yZHMgKi8KKwlEQkdfQlVTX0ZSQU1FX01PREVfNEhXXzBTVCA9IDMsIC8qIDQgSFcgZHdvcmRzLCAwIFN0b3JtIGR3b3JkcyAqLworCURCR19CVVNfRlJBTUVfTU9ERV84SFdfMFNUID0gNCwgLyogOCBIVyBkd29yZHMsIDAgU3Rvcm0gZHdvcmRzICovCisJTUFYX0RCR19CVVNfRlJBTUVfTU9ERVMKK307CisKKy8qIERlYnVnIGJ1cyBzdGF0ZXMgKi8KK2VudW0gZGJnX2J1c19zdGF0ZXMgeworCURCR19CVVNfU1RBVEVfSURMRSwgLyogZGVidWcgYnVzIGlkbGUgc3RhdGUgKG5vdCByZWNvcmRpbmcpICovCisJREJHX0JVU19TVEFURV9SRUFEWSwgLyogZGVidWcgYnVzIGlzIHJlYWR5IGZvciBjb25maWd1cmF0aW9uIGFuZAorCQkJICAgICAgKiByZWNvcmRpbmcuCisJCQkgICAgICAqLworCURCR19CVVNfU1RBVEVfUkVDT1JESU5HLCAvKiBkZWJ1ZyBidXMgaXMgY3VycmVudGx5IHJlY29yZGluZyAqLworCURCR19CVVNfU1RBVEVfU1RPUFBFRCwgLyogZGVidWcgYnVzIHJlY29yZGluZyBoYXMgc3RvcHBlZCAqLworCU1BWF9EQkdfQlVTX1NUQVRFUworfTsKKworLyogRGVidWcgYnVzIHRhcmdldCBJRHMgKi8KK2VudW0gZGJnX2J1c190YXJnZXRzIHsKKwkvKiByZWNvcmRzIGRlYnVnIGJ1cyB0byBEQkcgYmxvY2sgaW50ZXJuYWwgYnVmZmVyICovCisJREJHX0JVU19UQVJHRVRfSURfSU5UX0JVRiwKKwkvKiByZWNvcmRzIGRlYnVnIGJ1cyB0byB0aGUgTlcgKi8KKwlEQkdfQlVTX1RBUkdFVF9JRF9OSUcsCisJLyogcmVjb3JkcyBkZWJ1ZyBidXMgdG8gYSBQQ0kgYnVmZmVyICovCisJREJHX0JVU19UQVJHRVRfSURfUENJLAorCU1BWF9EQkdfQlVTX1RBUkdFVFMKK307CisKKy8qIEdSQyBEdW1wIGRhdGEgKi8KK3N0cnVjdCBkYmdfZ3JjX2RhdGEgeworCV9fbGUzMiBwYXJhbV92YWxbNDBdOyAvKiBWYWx1ZSBvZiBlYWNoIEdSQyBwYXJhbWV0ZXIuIEFycmF5IHNpemUgbXVzdAorCQkJICAgICAgICogbWF0Y2ggdGhlIGVudW0gZGJnX2dyY19wYXJhbXMuCisJCQkgICAgICAgKi8KKwl1OCBwYXJhbV9zZXRfYnlfdXNlcls0MF07IC8qIEluZGljYXRlcyBmb3IgZWFjaCBHUkMgcGFyYW1ldGVyIGlmIGl0IHdhcworCQkJCSAgICogc2V0IGJ5IHRoZSB1c2VyICgwLzEpLiBBcnJheSBzaXplIG11c3QKKwkJCQkgICAqIG1hdGNoIHRoZSBlbnVtIGRiZ19ncmNfcGFyYW1zLgorCQkJCSAgICovCit9OworCisvKiBEZWJ1ZyBHUkMgcGFyYW1zICovCitlbnVtIGRiZ19ncmNfcGFyYW1zIHsKKwlEQkdfR1JDX1BBUkFNX0RVTVBfVFNUT1JNLCAvKiBkdW1wIFRzdG9ybSBtZW1vcmllcyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9NU1RPUk0sIC8qIGR1bXAgTXN0b3JtIG1lbW9yaWVzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX1VTVE9STSwgLyogZHVtcCBVc3Rvcm0gbWVtb3JpZXMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfWFNUT1JNLCAvKiBkdW1wIFhzdG9ybSBtZW1vcmllcyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9ZU1RPUk0sIC8qIGR1bXAgWXN0b3JtIG1lbW9yaWVzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX1BTVE9STSwgLyogZHVtcCBQc3Rvcm0gbWVtb3JpZXMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfUkVHUywgLyogZHVtcCBub24tbWVtb3J5IHJlZ2lzdGVycyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9SQU0sIC8qIGR1bXAgU3Rvcm0gaW50ZXJuYWwgUkFNcyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9QQlVGLCAvKiBkdW1wIFN0b3JtIHBhc3NpdmUgYnVmZmVyICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX0lPUiwgLyogZHVtcCBTdG9ybSBJT1JzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX1ZGQywgLyogZHVtcCBWRkMgbWVtb3JpZXMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfQ01fQ1RYLCAvKiBkdW1wIENNIGNvbnRleHRzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX1BYUCwgLyogZHVtcCBQWFAgbWVtb3JpZXMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfUlNTLCAvKiBkdW1wIFJTUyBtZW1vcmllcyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9DQVUsIC8qIGR1bXAgQ0FVIG1lbW9yaWVzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX1FNLCAvKiBkdW1wIFFNIG1lbW9yaWVzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX01DUCwgLyogZHVtcCBNQ1AgbWVtb3JpZXMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX1JFU0VSVkVELCAvKiByZXNlcnZlZCAqLworCURCR19HUkNfUEFSQU1fRFVNUF9DRkMsIC8qIGR1bXAgQ0ZDIG1lbW9yaWVzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX0lHVSwgLyogZHVtcCBJR1UgbWVtb3JpZXMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfQlJCLCAvKiBkdW1wIEJSQiBtZW1vcmllcyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9CVEIsIC8qIGR1bXAgQlRCIG1lbW9yaWVzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX0JNQiwgLyogZHVtcCBCTUIgbWVtb3JpZXMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfTklHLCAvKiBkdW1wIE5JRyBtZW1vcmllcyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9NVUxELCAvKiBkdW1wIE1VTEQgbWVtb3JpZXMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfUFJTLCAvKiBkdW1wIFBSUyBtZW1vcmllcyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9ETUFFLCAvKiBkdW1wIFBSUyBtZW1vcmllcyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9UTSwgLyogZHVtcCBUTSAodGltZXJzKSBtZW1vcmllcyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9TRE0sIC8qIGR1bXAgU0RNIG1lbW9yaWVzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX0RJRiwgLyogZHVtcCBESUYgbWVtb3JpZXMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfU1RBVElDLCAvKiBkdW1wIHN0YXRpYyBkZWJ1ZyBkYXRhICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9VTlNUQUxMLCAvKiB1bi1zdGFsbCBTdG9ybXMgYWZ0ZXIgZHVtcCAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fTlVNX0xDSURTLCAvKiBudW1iZXIgb2YgTENJRHMgKDAuLjMyMCkgKi8KKwlEQkdfR1JDX1BBUkFNX05VTV9MVElEUywgLyogbnVtYmVyIG9mIExUSURzICgwLi4zMjApICovCisJLyogcHJlc2V0OiBleGNsdWRlIGFsbCBtZW1vcmllcyBmcm9tIGR1bXAgKDEgb25seSkgKi8KKwlEQkdfR1JDX1BBUkFNX0VYQ0xVREVfQUxMLAorCS8qIHByZXNldDogaW5jbHVkZSBtZW1vcmllcyBmb3IgY3Jhc2ggZHVtcCAoMSBvbmx5KSAqLworCURCR19HUkNfUEFSQU1fQ1JBU0gsCisJLyogcGVyZm9ybSBkdW1wIG9ubHkgaWYgTUZXIGlzIHJlc3BvbmRpbmcgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX1BBUklUWV9TQUZFLAorCURCR19HUkNfUEFSQU1fRFVNUF9DTSwgLyogZHVtcCBDTSBtZW1vcmllcyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9QSFksIC8qIGR1bXAgUEhZIG1lbW9yaWVzICgwLzEpICovCisJTUFYX0RCR19HUkNfUEFSQU1TCit9OworCisvKiBEZWJ1ZyByZXNldCByZWdpc3RlcnMgKi8KK2VudW0gZGJnX3Jlc2V0X3JlZ3MgeworCURCR19SRVNFVF9SRUdfTUlTQ1NfUExfVUEsCisJREJHX1JFU0VUX1JFR19NSVNDU19QTF9IViwKKwlEQkdfUkVTRVRfUkVHX01JU0NTX1BMX0hWXzIsCisJREJHX1JFU0VUX1JFR19NSVNDX1BMX1VBLAorCURCR19SRVNFVF9SRUdfTUlTQ19QTF9IViwKKwlEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzEsCisJREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8yLAorCURCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVkFVWCwKKwlNQVhfREJHX1JFU0VUX1JFR1MKK307CisKIC8qIERlYnVnIHN0YXR1cyBjb2RlcyAqLwogZW51bSBkYmdfc3RhdHVzIHsKIAlEQkdfU1RBVFVTX09LLApAQCAtMTU3OSw5ICsyMjI2LDQ1IEBACiAJREJHX1NUQVRVU19SRUdfRklGT19CQURfREFUQSwKIAlEQkdfU1RBVFVTX1BST1RFQ1RJT05fT1ZFUlJJREVfQkFEX0RBVEEsCiAJREJHX1NUQVRVU19EQkdfQVJSQVlfTk9UX1NFVCwKKwlEQkdfU1RBVFVTX01VTFRJX0JMT0NLU19XSVRIX0ZJTFRFUiwKIAlNQVhfREJHX1NUQVRVUwogfTsKIAorLyogRGVidWcgU3Rvcm1zIElEcyAqLworZW51bSBkYmdfc3Rvcm1zIHsKKwlEQkdfVFNUT1JNX0lELAorCURCR19NU1RPUk1fSUQsCisJREJHX1VTVE9STV9JRCwKKwlEQkdfWFNUT1JNX0lELAorCURCR19ZU1RPUk1fSUQsCisJREJHX1BTVE9STV9JRCwKKwlNQVhfREJHX1NUT1JNUworfTsKKworLyogSWRsZSBDaGVjayBkYXRhICovCitzdHJ1Y3QgaWRsZV9jaGtfZGF0YSB7CisJX19sZTMyIGJ1Zl9zaXplOyAvKiBJZGxlIGNoZWNrIGJ1ZmZlciBzaXplIGluIGR3b3JkcyAqLworCXU4IGJ1Zl9zaXplX3NldDsgLyogSW5kaWNhdGVzIGlmIHRoZSBpZGxlIGNoZWNrIGJ1ZmZlciBzaXplIHdhcyBzZXQKKwkJCSAgKiAoMC8xKS4KKwkJCSAgKi8KKwl1OCByZXNlcnZlZDE7CisJX19sZTE2IHJlc2VydmVkMjsKK307CisKKy8qIERlYnVnIFRvb2xzIGRhdGEgKHBlciBIVyBmdW5jdGlvbikgKi8KK3N0cnVjdCBkYmdfdG9vbHNfZGF0YSB7CisJc3RydWN0IGRiZ19ncmNfZGF0YSBncmM7IC8qIEdSQyBEdW1wIGRhdGEgKi8KKwlzdHJ1Y3QgZGJnX2J1c19kYXRhIGJ1czsgLyogRGVidWcgQnVzIGRhdGEgKi8KKwlzdHJ1Y3QgaWRsZV9jaGtfZGF0YSBpZGxlX2NoazsgLyogSWRsZSBDaGVjayBkYXRhICovCisJdTggbW9kZV9lbmFibGVbNDBdOyAvKiBJbmRpY2F0ZXMgaWYgYSBtb2RlIGlzIGVuYWJsZWQgKDAvMSkgKi8KKwl1OCBibG9ja19pbl9yZXNldFs4MF07IC8qIEluZGljYXRlcyBpZiBhIGJsb2NrIGlzIGluIHJlc2V0IHN0YXRlICgwLzEpLgorCQkJCSovCisJdTggY2hpcF9pZDsgLyogQ2hpcCBJRCAoZnJvbSBlbnVtIGNoaXBfaWRzKSAqLworCXU4IHBsYXRmb3JtX2lkOyAvKiBQbGF0Zm9ybSBJRCAoZnJvbSBlbnVtIHBsYXRmb3JtX2lkcykgKi8KKwl1OCBpbml0aWFsaXplZDsgLyogSW5kaWNhdGVzIGlmIHRoZSBkYXRhIHdhcyBpbml0aWFsaXplZCAqLworCXU4IHJlc2VydmVkOworfTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogSFNJIEluaXQgRnVuY3Rpb25zIGNvbnN0YW50cyAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTU4OSw3ICsyMjcyLDQxIEBACiAvKiBOdW1iZXIgb2YgVkxBTiBwcmlvcml0aWVzICovCiAjZGVmaW5lIE5VTV9PRl9WTEFOX1BSSU9SSVRJRVMJOAogCi0vKiBRTSBwZXItcG9ydCBpbml0IHBhcmFtZXRlcnMgKi8KK3N0cnVjdCBpbml0X2JyYl9yYW1fcmVxIHsKKwlfX2xlMzIgZ3VyYW50ZWVkX3Blcl90YzsKKwlfX2xlMzIgaGVhZHJvb21fcGVyX3RjOworCV9fbGUzMiBtaW5fcGt0X3NpemU7CisJX19sZTMyIG1heF9wb3J0c19wZXJfZW5naW5lOworCXU4IG51bV9hY3RpdmVfdGNzW01BWF9OVU1fUE9SVFNdOworfTsKKworc3RydWN0IGluaXRfZXRzX3RjX3JlcSB7CisJdTggdXNlX3NwOworCXU4IHVzZV93ZnE7CisJX19sZTE2IHdlaWdodDsKK307CisKK3N0cnVjdCBpbml0X2V0c19yZXEgeworCV9fbGUzMiBtdHU7CisJc3RydWN0IGluaXRfZXRzX3RjX3JlcSB0Y19yZXFbTlVNX09GX1RDU107Cit9OworCitzdHJ1Y3QgaW5pdF9uaWdfbGJfcmxfcmVxIHsKKwlfX2xlMTYgbGJfbWFjX3JhdGU7CisJX19sZTE2IGxiX3JhdGU7CisJX19sZTMyIG10dTsKKwlfX2xlMTYgdGNfcmF0ZVtOVU1fT0ZfUEhZU19UQ1NdOworfTsKKworc3RydWN0IGluaXRfbmlnX3ByaV90Y19tYXBfZW50cnkgeworCXU4IHRjX2lkOworCXU4IHZhbGlkOworfTsKKworc3RydWN0IGluaXRfbmlnX3ByaV90Y19tYXBfcmVxIHsKKwlzdHJ1Y3QgaW5pdF9uaWdfcHJpX3RjX21hcF9lbnRyeSBwcmlbTlVNX09GX1ZMQU5fUFJJT1JJVElFU107Cit9OworCiBzdHJ1Y3QgaW5pdF9xbV9wb3J0X3BhcmFtcyB7CiAJdTggYWN0aXZlOwogCXU4IGFjdGl2ZV9waHlzX3RjczsKQEAgLTE2MTksNyArMjMzNiw3IEBACiAKIC8qIFdpZHRoIG9mIEdSQyBhZGRyZXNzIGluIGJpdHMgKGFkZHJlc3NlcyBhcmUgc3BlY2lmaWVkIGluIGR3b3JkcykgKi8KICNkZWZpbmUgR1JDX0FERFJfQklUUwkyMwotI2RlZmluZSBNQVhfR1JDX0FERFIJKCgxIDw8IEdSQ19BRERSX0JJVFMpIC0gMSkKKyNkZWZpbmUgTUFYX0dSQ19BRERSCShCSVQoR1JDX0FERFJfQklUUykgLSAxKQogCiAvKiBpbmRpY2F0ZXMgYW4gaW5pdCB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIGFueSBwaGFzZSBJRCAqLwogI2RlZmluZSBBTllfUEhBU0VfSUQJMHhmZmZmCkBAIC0xNjI3LDE1ICsyMzQ0LDUwIEBACiAvKiBNYXggc2l6ZSBpbiBkd29yZHMgb2YgYSB6aXBwZWQgYXJyYXkgKi8KICNkZWZpbmUgTUFYX1pJUFBFRF9TSVpFCTgxOTIKIAorc3RydWN0IGZ3X2Fzc2VydHNfcmFtX3NlY3Rpb24geworCV9fbGUxNiBzZWN0aW9uX3JhbV9saW5lX29mZnNldDsKKwlfX2xlMTYgc2VjdGlvbl9yYW1fbGluZV9zaXplOworCXU4IGxpc3RfZHdvcmRfb2Zmc2V0OworCXU4IGxpc3RfZWxlbWVudF9kd29yZF9zaXplOworCXU4IGxpc3RfbnVtX2VsZW1lbnRzOworCXU4IGxpc3RfbmV4dF9pbmRleF9kd29yZF9vZmZzZXQ7Cit9OworCitzdHJ1Y3QgZndfdmVyX251bSB7CisJdTggbWFqb3I7IC8qIEZpcm13YXJlIG1ham9yIHZlcnNpb24gbnVtYmVyICovCisJdTggbWlub3I7IC8qIEZpcm13YXJlIG1pbm9yIHZlcnNpb24gbnVtYmVyICovCisJdTggcmV2OyAvKiBGaXJtd2FyZSByZXZpc2lvbiB2ZXJzaW9uIG51bWJlciAqLworCXU4IGVuZzsgLyogRmlybXdhcmUgZW5naW5lZXJpbmcgdmVyc2lvbiBudW1iZXIgKGZvciBib290bGVnIHZlcnNpb25zKSAqLworfTsKKworc3RydWN0IGZ3X3Zlcl9pbmZvIHsKKwlfX2xlMTYgdG9vbHNfdmVyOyAvKiBUb29scyB2ZXJzaW9uIG51bWJlciAqLworCXU4IGltYWdlX2lkOyAvKiBGVyBpbWFnZSBJRCAoZS5nLiBtYWluKSAqLworCXU4IHJlc2VydmVkMTsKKwlzdHJ1Y3QgZndfdmVyX251bSBudW07IC8qIEZXIHZlcnNpb24gbnVtYmVyICovCisJX19sZTMyIHRpbWVzdGFtcDsgLyogRlcgVGltZXN0YW1wIGluIHVuaXggdGltZSAgKHNlYy4gc2luY2UgMTk3MCkgKi8KKwlfX2xlMzIgcmVzZXJ2ZWQyOworfTsKKworc3RydWN0IGZ3X2luZm8geworCXN0cnVjdCBmd192ZXJfaW5mbyB2ZXI7CisJc3RydWN0IGZ3X2Fzc2VydHNfcmFtX3NlY3Rpb24gZndfYXNzZXJ0c19zZWN0aW9uOworfTsKKworc3RydWN0IGZ3X2luZm9fbG9jYXRpb24geworCV9fbGUzMiBncmNfYWRkcjsKKwlfX2xlMzIgc2l6ZTsKK307CisKIGVudW0gaW5pdF9tb2RlcyB7CiAJTU9ERV9SRVNFUlZFRCwKIAlNT0RFX0JCX0IwLAotCU1PREVfUkVTRVJWRUQyLAorCU1PREVfSzIsCiAJTU9ERV9BU0lDLAorCU1PREVfUkVTRVJWRUQyLAogCU1PREVfUkVTRVJWRUQzLAogCU1PREVfUkVTRVJWRUQ0LAogCU1PREVfUkVTRVJWRUQ1LAotCU1PREVfUkVTRVJWRUQ2LAogCU1PREVfU0YsCiAJTU9ERV9NRl9TRCwKIAlNT0RFX01GX1NJLApAQCAtMTY0NCw3ICsyMzk2LDcgQEAKIAlNT0RFX1BPUlRTX1BFUl9FTkdfNCwKIAlNT0RFXzEwMEcsCiAJTU9ERV80MEcsCi0JTU9ERV9SRVNFUlZFRDcsCisJTU9ERV9SRVNFUlZFRDYsCiAJTUFYX0lOSVRfTU9ERVMKIH07CiAKQEAgLTE2NzQsMTEgKzI0MjYsMTEgQEAKIAogLyogYmluYXJ5IGluaXQgYnVmZmVyIHR5cGVzICovCiBlbnVtIGJpbl9pbml0X2J1ZmZlcl90eXBlIHsKLQlCSU5fQlVGX0ZXX1ZFUl9JTkZPLAorCUJJTl9CVUZfSU5JVF9GV19WRVJfSU5GTywKIAlCSU5fQlVGX0lOSVRfQ01ELAogCUJJTl9CVUZfSU5JVF9WQUwsCiAJQklOX0JVRl9JTklUX01PREVfVFJFRSwKLQlCSU5fQlVGX0lSTywKKwlCSU5fQlVGX0lOSVRfSVJPLAogCU1BWF9CSU5fSU5JVF9CVUZGRVJfVFlQRQogfTsKIApAQCAtMTkwMiw4ICsyNjU0LDI3NiBAQAogCV9fbGUxNiBzaXplOwogfTsKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFB1YmxpYyBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKgotICogQGJyaWVmIHFlZF9kYmdfcHJpbnRfYXR0biAtIFByaW50cyBhdHRlbnRpb24gcmVnaXN0ZXJzIHZhbHVlcyBpbiB0aGUgc3BlY2lmaWVkIHJlc3VsdHMgc3RydWN0LgorICogQGJyaWVmIHFlZF9kYmdfc2V0X2Jpbl9wdHIgLSBTZXRzIGEgcG9pbnRlciB0byB0aGUgYmluYXJ5IGRhdGEgd2l0aCBkZWJ1ZworICoJYXJyYXlzLgorICoKKyAqIEBwYXJhbSBiaW5fcHRyIC0gYSBwb2ludGVyIHRvIHRoZSBiaW5hcnkgZGF0YSB3aXRoIGRlYnVnIGFycmF5cy4KKyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfc2V0X2Jpbl9wdHIoY29uc3QgdTggKiBjb25zdCBiaW5fcHRyKTsKKy8qKgorICogQGJyaWVmIHFlZF9kYmdfZ3JjX2dldF9kdW1wX2J1Zl9zaXplIC0gUmV0dXJucyB0aGUgcmVxdWlyZWQgYnVmZmVyIHNpemUgZm9yCisgKglHUkMgRHVtcC4KKyAqCisgKiBAcGFyYW0gcF9od2ZuIC0gSFcgZGV2aWNlIGRhdGEKKyAqIEBwYXJhbSBwX3B0dCAtIFB0dCB3aW5kb3cgdXNlZCBmb3Igd3JpdGluZyB0aGUgcmVnaXN0ZXJzLgorICogQHBhcmFtIGJ1Zl9zaXplIC0gT1VUOiByZXF1aXJlZCBidWZmZXIgc2l6ZSAoaW4gZHdvcmRzKSBmb3IgdGhlIEdSQyBEdW1wCisgKglkYXRhLgorICoKKyAqIEByZXR1cm4gZXJyb3IgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaG9sZHM6CisgKgktIHRoZSB2ZXJzaW9uIHdhc24ndCBzZXQKKyAqIE90aGVyd2lzZSwgcmV0dXJucyBvay4KKyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfZ3JjX2dldF9kdW1wX2J1Zl9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJCSAgICAgIHUzMiAqYnVmX3NpemUpOworLyoqCisgKiBAYnJpZWYgcWVkX2RiZ19ncmNfZHVtcCAtIER1bXBzIEdSQyBkYXRhIGludG8gdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKgorICogQHBhcmFtIHBfaHdmbiAtIEhXIGRldmljZSBkYXRhCisgKiBAcGFyYW0gcF9wdHQgLSBQdHQgd2luZG93IHVzZWQgZm9yIHdyaXRpbmcgdGhlIHJlZ2lzdGVycy4KKyAqIEBwYXJhbSBkdW1wX2J1ZiAtIFBvaW50ZXIgdG8gd3JpdGUgdGhlIGNvbGxlY3RlZCBHUkMgZGF0YSBpbnRvLgorICogQHBhcmFtIGJ1Zl9zaXplX2luX2R3b3JkcyAtIFNpemUgb2YgdGhlIHNwZWNpZmllZCBidWZmZXIgaW4gZHdvcmRzLgorICogQHBhcmFtIG51bV9kdW1wZWRfZHdvcmRzIC0gT1VUOiBudW1iZXIgb2YgZHVtcGVkIGR3b3Jkcy4KKyAqCisgKiBAcmV0dXJuIGVycm9yIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGhvbGRzOgorICoJLSB0aGUgdmVyc2lvbiB3YXNuJ3Qgc2V0CisgKgktIHRoZSBzcGVjaWZpZWQgZHVtcCBidWZmZXIgaXMgdG9vIHNtYWxsCisgKiBPdGhlcndpc2UsIHJldHVybnMgb2suCisgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX2dyY19kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJIHUzMiAqZHVtcF9idWYsCisJCQkJIHUzMiBidWZfc2l6ZV9pbl9kd29yZHMsCisJCQkJIHUzMiAqbnVtX2R1bXBlZF9kd29yZHMpOworLyoqCisgKiBAYnJpZWYgcWVkX2RiZ19pZGxlX2Noa19nZXRfZHVtcF9idWZfc2l6ZSAtIFJldHVybnMgdGhlIHJlcXVpcmVkIGJ1ZmZlciBzaXplCisgKglmb3IgaWRsZSBjaGVjayByZXN1bHRzLgorICoKKyAqIEBwYXJhbSBwX2h3Zm4gLSBIVyBkZXZpY2UgZGF0YQorICogQHBhcmFtIHBfcHR0IC0gUHR0IHdpbmRvdyB1c2VkIGZvciB3cml0aW5nIHRoZSByZWdpc3RlcnMuCisgKiBAcGFyYW0gYnVmX3NpemUgLSBPVVQ6IHJlcXVpcmVkIGJ1ZmZlciBzaXplIChpbiBkd29yZHMpIGZvciB0aGUgaWRsZSBjaGVjaworICoJZGF0YS4KKyAqCisgKiBAcmV0dXJuIGVycm9yIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGhvbGRzOgorICoJLSB0aGUgdmVyc2lvbiB3YXNuJ3Qgc2V0CisgKiBPdGhlcndpc2UsIHJldHVybnMgb2suCisgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX2lkbGVfY2hrX2dldF9kdW1wX2J1Zl9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCQkJICAgdTMyICpidWZfc2l6ZSk7CisvKioKKyAqIEBicmllZiBxZWRfZGJnX2lkbGVfY2hrX2R1bXAgLSBQZXJmb3JtcyBpZGxlIGNoZWNrIGFuZCB3cml0ZXMgdGhlIHJlc3VsdHMKKyAqCWludG8gdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKgorICogQHBhcmFtIHBfaHdmbiAtIEhXIGRldmljZSBkYXRhCisgKiBAcGFyYW0gcF9wdHQgLSBQdHQgd2luZG93IHVzZWQgZm9yIHdyaXRpbmcgdGhlIHJlZ2lzdGVycy4KKyAqIEBwYXJhbSBkdW1wX2J1ZiAtIFBvaW50ZXIgdG8gd3JpdGUgdGhlIGlkbGUgY2hlY2sgZGF0YSBpbnRvLgorICogQHBhcmFtIGJ1Zl9zaXplX2luX2R3b3JkcyAtIFNpemUgb2YgdGhlIHNwZWNpZmllZCBidWZmZXIgaW4gZHdvcmRzLgorICogQHBhcmFtIG51bV9kdW1wZWRfZHdvcmRzIC0gT1VUOiBudW1iZXIgb2YgZHVtcGVkIGR3b3Jkcy4KKyAqCisgKiBAcmV0dXJuIGVycm9yIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGhvbGRzOgorICoJLSB0aGUgdmVyc2lvbiB3YXNuJ3Qgc2V0CisgKgktIHRoZSBzcGVjaWZpZWQgYnVmZmVyIGlzIHRvbyBzbWFsbAorICogT3RoZXJ3aXNlLCByZXR1cm5zIG9rLgorICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19pZGxlX2Noa19kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgICAgICB1MzIgKmR1bXBfYnVmLAorCQkJCSAgICAgIHUzMiBidWZfc2l6ZV9pbl9kd29yZHMsCisJCQkJICAgICAgdTMyICpudW1fZHVtcGVkX2R3b3Jkcyk7CisvKioKKyAqIEBicmllZiBxZWRfZGJnX21jcF90cmFjZV9nZXRfZHVtcF9idWZfc2l6ZSAtIFJldHVybnMgdGhlIHJlcXVpcmVkIGJ1ZmZlciBzaXplCisgKglmb3IgbWNwIHRyYWNlIHJlc3VsdHMuCisgKgorICogQHBhcmFtIHBfaHdmbiAtIEhXIGRldmljZSBkYXRhCisgKiBAcGFyYW0gcF9wdHQgLSBQdHQgd2luZG93IHVzZWQgZm9yIHdyaXRpbmcgdGhlIHJlZ2lzdGVycy4KKyAqIEBwYXJhbSBidWZfc2l6ZSAtIE9VVDogcmVxdWlyZWQgYnVmZmVyIHNpemUgKGluIGR3b3JkcykgZm9yIG1jcCB0cmFjZSBkYXRhLgorICoKKyAqIEByZXR1cm4gZXJyb3IgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaG9sZHM6CisgKgktIHRoZSB2ZXJzaW9uIHdhc24ndCBzZXQKKyAqCS0gdGhlIHRyYWNlIGRhdGEgaW4gTUNQIHNjcmF0Y2hwYWQgY29udGFpbiBhbiBpbnZhbGlkIHNpZ25hdHVyZQorICoJLSB0aGUgYnVuZGxlIElEIGluIE5WUkFNIGlzIGludmFsaWQKKyAqCS0gdGhlIHRyYWNlIG1ldGEgZGF0YSBjYW5ub3QgYmUgZm91bmQgKGluIE5WUkFNIG9yIGltYWdlIGZpbGUpCisgKiBPdGhlcndpc2UsIHJldHVybnMgb2suCisgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX21jcF90cmFjZV9nZXRfZHVtcF9idWZfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJCQkgICAgdTMyICpidWZfc2l6ZSk7CisvKioKKyAqIEBicmllZiBxZWRfZGJnX21jcF90cmFjZV9kdW1wIC0gUGVyZm9ybXMgbWNwIHRyYWNlIGFuZCB3cml0ZXMgdGhlIHJlc3VsdHMKKyAqCWludG8gdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKgorICogQHBhcmFtIHBfaHdmbiAtIEhXIGRldmljZSBkYXRhCisgKiBAcGFyYW0gcF9wdHQgLSBQdHQgd2luZG93IHVzZWQgZm9yIHdyaXRpbmcgdGhlIHJlZ2lzdGVycy4KKyAqIEBwYXJhbSBkdW1wX2J1ZiAtIFBvaW50ZXIgdG8gd3JpdGUgdGhlIG1jcCB0cmFjZSBkYXRhIGludG8uCisgKiBAcGFyYW0gYnVmX3NpemVfaW5fZHdvcmRzIC0gU2l6ZSBvZiB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBpbiBkd29yZHMuCisgKiBAcGFyYW0gbnVtX2R1bXBlZF9kd29yZHMgLSBPVVQ6IG51bWJlciBvZiBkdW1wZWQgZHdvcmRzLgorICoKKyAqIEByZXR1cm4gZXJyb3IgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaG9sZHM6CisgKgktIHRoZSB2ZXJzaW9uIHdhc24ndCBzZXQKKyAqCS0gdGhlIHNwZWNpZmllZCBidWZmZXIgaXMgdG9vIHNtYWxsCisgKgktIHRoZSB0cmFjZSBkYXRhIGluIE1DUCBzY3JhdGNocGFkIGNvbnRhaW4gYW4gaW52YWxpZCBzaWduYXR1cmUKKyAqCS0gdGhlIGJ1bmRsZSBJRCBpbiBOVlJBTSBpcyBpbnZhbGlkCisgKgktIHRoZSB0cmFjZSBtZXRhIGRhdGEgY2Fubm90IGJlIGZvdW5kIChpbiBOVlJBTSBvciBpbWFnZSBmaWxlKQorICoJLSB0aGUgdHJhY2UgbWV0YSBkYXRhIGNhbm5vdCBiZSByZWFkIChmcm9tIE5WUkFNIG9yIGltYWdlIGZpbGUpCisgKiBPdGhlcndpc2UsIHJldHVybnMgb2suCisgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX21jcF90cmFjZV9kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJICAgICAgIHUzMiAqZHVtcF9idWYsCisJCQkJICAgICAgIHUzMiBidWZfc2l6ZV9pbl9kd29yZHMsCisJCQkJICAgICAgIHUzMiAqbnVtX2R1bXBlZF9kd29yZHMpOworLyoqCisgKiBAYnJpZWYgcWVkX2RiZ19yZWdfZmlmb19nZXRfZHVtcF9idWZfc2l6ZSAtIFJldHVybnMgdGhlIHJlcXVpcmVkIGJ1ZmZlciBzaXplCisgKglmb3IgZ3JjIHRyYWNlIGZpZm8gcmVzdWx0cy4KKyAqCisgKiBAcGFyYW0gcF9od2ZuIC0gSFcgZGV2aWNlIGRhdGEKKyAqIEBwYXJhbSBwX3B0dCAtIFB0dCB3aW5kb3cgdXNlZCBmb3Igd3JpdGluZyB0aGUgcmVnaXN0ZXJzLgorICogQHBhcmFtIGJ1Zl9zaXplIC0gT1VUOiByZXF1aXJlZCBidWZmZXIgc2l6ZSAoaW4gZHdvcmRzKSBmb3IgcmVnIGZpZm8gZGF0YS4KKyAqCisgKiBAcmV0dXJuIGVycm9yIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGhvbGRzOgorICoJLSB0aGUgdmVyc2lvbiB3YXNuJ3Qgc2V0CisgKiBPdGhlcndpc2UsIHJldHVybnMgb2suCisgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX3JlZ19maWZvX2dldF9kdW1wX2J1Zl9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCQkJICAgdTMyICpidWZfc2l6ZSk7CisvKioKKyAqIEBicmllZiBxZWRfZGJnX3JlZ19maWZvX2R1bXAgLSBSZWFkcyB0aGUgcmVnIGZpZm8gYW5kIHdyaXRlcyB0aGUgcmVzdWx0cyBpbnRvCisgKgl0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gcF9od2ZuIC0gSFcgZGV2aWNlIGRhdGEKKyAqIEBwYXJhbSBwX3B0dCAtIFB0dCB3aW5kb3cgdXNlZCBmb3Igd3JpdGluZyB0aGUgcmVnaXN0ZXJzLgorICogQHBhcmFtIGR1bXBfYnVmIC0gUG9pbnRlciB0byB3cml0ZSB0aGUgcmVnIGZpZm8gZGF0YSBpbnRvLgorICogQHBhcmFtIGJ1Zl9zaXplX2luX2R3b3JkcyAtIFNpemUgb2YgdGhlIHNwZWNpZmllZCBidWZmZXIgaW4gZHdvcmRzLgorICogQHBhcmFtIG51bV9kdW1wZWRfZHdvcmRzIC0gT1VUOiBudW1iZXIgb2YgZHVtcGVkIGR3b3Jkcy4KKyAqCisgKiBAcmV0dXJuIGVycm9yIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGhvbGRzOgorICoJLSB0aGUgdmVyc2lvbiB3YXNuJ3Qgc2V0CisgKgktIHRoZSBzcGVjaWZpZWQgYnVmZmVyIGlzIHRvbyBzbWFsbAorICoJLSBETUFFIHRyYW5zYWN0aW9uIGZhaWxlZAorICogT3RoZXJ3aXNlLCByZXR1cm5zIG9rLgorICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19yZWdfZmlmb19kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgICAgICB1MzIgKmR1bXBfYnVmLAorCQkJCSAgICAgIHUzMiBidWZfc2l6ZV9pbl9kd29yZHMsCisJCQkJICAgICAgdTMyICpudW1fZHVtcGVkX2R3b3Jkcyk7CisvKioKKyAqIEBicmllZiBxZWRfZGJnX2lndV9maWZvX2dldF9kdW1wX2J1Zl9zaXplIC0gUmV0dXJucyB0aGUgcmVxdWlyZWQgYnVmZmVyIHNpemUKKyAqCWZvciB0aGUgSUdVIGZpZm8gcmVzdWx0cy4KKyAqCisgKiBAcGFyYW0gcF9od2ZuIC0gSFcgZGV2aWNlIGRhdGEKKyAqIEBwYXJhbSBwX3B0dCAtIFB0dCB3aW5kb3cgdXNlZCBmb3Igd3JpdGluZyB0aGUgcmVnaXN0ZXJzLgorICogQHBhcmFtIGJ1Zl9zaXplIC0gT1VUOiByZXF1aXJlZCBidWZmZXIgc2l6ZSAoaW4gZHdvcmRzKSBmb3IgdGhlIElHVSBmaWZvCisgKglkYXRhLgorICoKKyAqIEByZXR1cm4gZXJyb3IgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaG9sZHM6CisgKgktIHRoZSB2ZXJzaW9uIHdhc24ndCBzZXQKKyAqIE90aGVyd2lzZSwgcmV0dXJucyBvay4KKyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfaWd1X2ZpZm9fZ2V0X2R1bXBfYnVmX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJCQkgICB1MzIgKmJ1Zl9zaXplKTsKKy8qKgorICogQGJyaWVmIHFlZF9kYmdfaWd1X2ZpZm9fZHVtcCAtIFJlYWRzIHRoZSBJR1UgZmlmbyBhbmQgd3JpdGVzIHRoZSByZXN1bHRzIGludG8KKyAqCXRoZSBzcGVjaWZpZWQgYnVmZmVyLgorICoKKyAqIEBwYXJhbSBwX2h3Zm4gLSBIVyBkZXZpY2UgZGF0YQorICogQHBhcmFtIHBfcHR0IC0gUHR0IHdpbmRvdyB1c2VkIGZvciB3cml0aW5nIHRoZSByZWdpc3RlcnMuCisgKiBAcGFyYW0gZHVtcF9idWYgLSBQb2ludGVyIHRvIHdyaXRlIHRoZSBJR1UgZmlmbyBkYXRhIGludG8uCisgKiBAcGFyYW0gYnVmX3NpemVfaW5fZHdvcmRzIC0gU2l6ZSBvZiB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBpbiBkd29yZHMuCisgKiBAcGFyYW0gbnVtX2R1bXBlZF9kd29yZHMgLSBPVVQ6IG51bWJlciBvZiBkdW1wZWQgZHdvcmRzLgorICoKKyAqIEByZXR1cm4gZXJyb3IgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaG9sZHM6CisgKgktIHRoZSB2ZXJzaW9uIHdhc24ndCBzZXQKKyAqCS0gdGhlIHNwZWNpZmllZCBidWZmZXIgaXMgdG9vIHNtYWxsCisgKgktIERNQUUgdHJhbnNhY3Rpb24gZmFpbGVkCisgKiBPdGhlcndpc2UsIHJldHVybnMgb2suCisgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX2lndV9maWZvX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSAgICAgIHUzMiAqZHVtcF9idWYsCisJCQkJICAgICAgdTMyIGJ1Zl9zaXplX2luX2R3b3JkcywKKwkJCQkgICAgICB1MzIgKm51bV9kdW1wZWRfZHdvcmRzKTsKKy8qKgorICogQGJyaWVmIHFlZF9kYmdfcHJvdGVjdGlvbl9vdmVycmlkZV9nZXRfZHVtcF9idWZfc2l6ZSAtIFJldHVybnMgdGhlIHJlcXVpcmVkCisgKglidWZmZXIgc2l6ZSBmb3IgcHJvdGVjdGlvbiBvdmVycmlkZSB3aW5kb3cgcmVzdWx0cy4KKyAqCisgKiBAcGFyYW0gcF9od2ZuIC0gSFcgZGV2aWNlIGRhdGEKKyAqIEBwYXJhbSBwX3B0dCAtIFB0dCB3aW5kb3cgdXNlZCBmb3Igd3JpdGluZyB0aGUgcmVnaXN0ZXJzLgorICogQHBhcmFtIGJ1Zl9zaXplIC0gT1VUOiByZXF1aXJlZCBidWZmZXIgc2l6ZSAoaW4gZHdvcmRzKSBmb3IgcHJvdGVjdGlvbgorICoJb3ZlcnJpZGUgZGF0YS4KKyAqCisgKiBAcmV0dXJuIGVycm9yIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGhvbGRzOgorICoJLSB0aGUgdmVyc2lvbiB3YXNuJ3Qgc2V0CisgKiBPdGhlcndpc2UsIHJldHVybnMgb2suCisgKi8KK2VudW0gZGJnX3N0YXR1cworcWVkX2RiZ19wcm90ZWN0aW9uX292ZXJyaWRlX2dldF9kdW1wX2J1Zl9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJCSAgICAgIHUzMiAqYnVmX3NpemUpOworLyoqCisgKiBAYnJpZWYgcWVkX2RiZ19wcm90ZWN0aW9uX292ZXJyaWRlX2R1bXAgLSBSZWFkcyBwcm90ZWN0aW9uIG92ZXJyaWRlIHdpbmRvdworICoJZW50cmllcyBhbmQgd3JpdGVzIHRoZSByZXN1bHRzIGludG8gdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKgorICogQHBhcmFtIHBfaHdmbiAtIEhXIGRldmljZSBkYXRhCisgKiBAcGFyYW0gcF9wdHQgLSBQdHQgd2luZG93IHVzZWQgZm9yIHdyaXRpbmcgdGhlIHJlZ2lzdGVycy4KKyAqIEBwYXJhbSBkdW1wX2J1ZiAtIFBvaW50ZXIgdG8gd3JpdGUgdGhlIHByb3RlY3Rpb24gb3ZlcnJpZGUgZGF0YSBpbnRvLgorICogQHBhcmFtIGJ1Zl9zaXplX2luX2R3b3JkcyAtIFNpemUgb2YgdGhlIHNwZWNpZmllZCBidWZmZXIgaW4gZHdvcmRzLgorICogQHBhcmFtIG51bV9kdW1wZWRfZHdvcmRzIC0gT1VUOiBudW1iZXIgb2YgZHVtcGVkIGR3b3Jkcy4KKyAqCisgKiBAcmV0dXJuIGVycm9yIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGhvbGRzOgorICoJLSB0aGUgdmVyc2lvbiB3YXNuJ3Qgc2V0CisgKgktIHRoZSBzcGVjaWZpZWQgYnVmZmVyIGlzIHRvbyBzbWFsbAorICoJLSBETUFFIHRyYW5zYWN0aW9uIGZhaWxlZAorICogT3RoZXJ3aXNlLCByZXR1cm5zIG9rLgorICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19wcm90ZWN0aW9uX292ZXJyaWRlX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCQkJIHUzMiAqZHVtcF9idWYsCisJCQkJCQkgdTMyIGJ1Zl9zaXplX2luX2R3b3JkcywKKwkJCQkJCSB1MzIgKm51bV9kdW1wZWRfZHdvcmRzKTsKKy8qKgorICogQGJyaWVmIHFlZF9kYmdfZndfYXNzZXJ0c19nZXRfZHVtcF9idWZfc2l6ZSAtIFJldHVybnMgdGhlIHJlcXVpcmVkIGJ1ZmZlcgorICoJc2l6ZSBmb3IgRlcgQXNzZXJ0cyByZXN1bHRzLgorICoKKyAqIEBwYXJhbSBwX2h3Zm4gLSBIVyBkZXZpY2UgZGF0YQorICogQHBhcmFtIHBfcHR0IC0gUHR0IHdpbmRvdyB1c2VkIGZvciB3cml0aW5nIHRoZSByZWdpc3RlcnMuCisgKiBAcGFyYW0gYnVmX3NpemUgLSBPVVQ6IHJlcXVpcmVkIGJ1ZmZlciBzaXplIChpbiBkd29yZHMpIGZvciBGVyBBc3NlcnRzIGRhdGEuCisgKgorICogQHJldHVybiBlcnJvciBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBob2xkczoKKyAqCS0gdGhlIHZlcnNpb24gd2Fzbid0IHNldAorICogT3RoZXJ3aXNlLCByZXR1cm5zIG9rLgorICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19md19hc3NlcnRzX2dldF9kdW1wX2J1Zl9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJCQkgICAgIHUzMiAqYnVmX3NpemUpOworLyoqCisgKiBAYnJpZWYgcWVkX2RiZ19md19hc3NlcnRzX2R1bXAgLSBSZWFkcyB0aGUgRlcgQXNzZXJ0cyBhbmQgd3JpdGVzIHRoZSByZXN1bHRzCisgKglpbnRvIHRoZSBzcGVjaWZpZWQgYnVmZmVyLgorICoKKyAqIEBwYXJhbSBwX2h3Zm4gLSBIVyBkZXZpY2UgZGF0YQorICogQHBhcmFtIHBfcHR0IC0gUHR0IHdpbmRvdyB1c2VkIGZvciB3cml0aW5nIHRoZSByZWdpc3RlcnMuCisgKiBAcGFyYW0gZHVtcF9idWYgLSBQb2ludGVyIHRvIHdyaXRlIHRoZSBGVyBBc3NlcnRzIGRhdGEgaW50by4KKyAqIEBwYXJhbSBidWZfc2l6ZV9pbl9kd29yZHMgLSBTaXplIG9mIHRoZSBzcGVjaWZpZWQgYnVmZmVyIGluIGR3b3Jkcy4KKyAqIEBwYXJhbSBudW1fZHVtcGVkX2R3b3JkcyAtIE9VVDogbnVtYmVyIG9mIGR1bXBlZCBkd29yZHMuCisgKgorICogQHJldHVybiBlcnJvciBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBob2xkczoKKyAqCS0gdGhlIHZlcnNpb24gd2Fzbid0IHNldAorICoJLSB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBpcyB0b28gc21hbGwKKyAqIE90aGVyd2lzZSwgcmV0dXJucyBvay4KKyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfZndfYXNzZXJ0c19kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQlzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJCXUzMiAqZHVtcF9idWYsCisJCQkJCXUzMiBidWZfc2l6ZV9pbl9kd29yZHMsCisJCQkJCXUzMiAqbnVtX2R1bXBlZF9kd29yZHMpOworLyoqCisgKiBAYnJpZWYgcWVkX2RiZ19wcmludF9hdHRuIC0gUHJpbnRzIGF0dGVudGlvbiByZWdpc3RlcnMgdmFsdWVzIGluIHRoZQorICoJc3BlY2lmaWVkIHJlc3VsdHMgc3RydWN0LgogICoKICAqIEBwYXJhbSBwX2h3Zm4KICAqIEBwYXJhbSByZXN1bHRzIC0gUG9pbnRlciB0byB0aGUgYXR0ZW50aW9uIHJlYWQgcmVzdWx0cwpAQCAtMTkxNSw0NyArMjkzNSwyNDEgQEAKIGVudW0gZGJnX3N0YXR1cyBxZWRfZGJnX3ByaW50X2F0dG4oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCiAJCQkJICAgc3RydWN0IGRiZ19hdHRuX2Jsb2NrX3Jlc3VsdCAqcmVzdWx0cyk7CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogI2RlZmluZSBNQVhfTkFNRV9MRU4JMTYKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFB1YmxpYyBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGJyaWVmIHFlZF9kYmdfdXNlcl9zZXRfYmluX3B0ciAtIFNldHMgYSBwb2ludGVyIHRvIHRoZSBiaW5hcnkgZGF0YSB3aXRoCisgKglkZWJ1ZyBhcnJheXMuCisgKgorICogQHBhcmFtIGJpbl9wdHIgLSBhIHBvaW50ZXIgdG8gdGhlIGJpbmFyeSBkYXRhIHdpdGggZGVidWcgYXJyYXlzLgorICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ191c2VyX3NldF9iaW5fcHRyKGNvbnN0IHU4ICogY29uc3QgYmluX3B0cik7CisvKioKKyAqIEBicmllZiBxZWRfZGJnX2dldF9zdGF0dXNfc3RyIC0gUmV0dXJucyBhIHN0cmluZyBmb3IgdGhlIHNwZWNpZmllZCBzdGF0dXMuCisgKgorICogQHBhcmFtIHN0YXR1cyAtIGEgZGVidWcgc3RhdHVzIGNvZGUuCisgKgorICogQHJldHVybiBhIHN0cmluZyBmb3IgdGhlIHNwZWNpZmllZCBzdGF0dXMKKyAqLworY29uc3QgY2hhciAqcWVkX2RiZ19nZXRfc3RhdHVzX3N0cihlbnVtIGRiZ19zdGF0dXMgc3RhdHVzKTsKKy8qKgorICogQGJyaWVmIHFlZF9nZXRfaWRsZV9jaGtfcmVzdWx0c19idWZfc2l6ZSAtIFJldHVybnMgdGhlIHJlcXVpcmVkIGJ1ZmZlciBzaXplCisgKglmb3IgaWRsZSBjaGVjayByZXN1bHRzIChpbiBieXRlcykuCisgKgorICogQHBhcmFtIHBfaHdmbiAtIEhXIGRldmljZSBkYXRhCisgKiBAcGFyYW0gZHVtcF9idWYgLSBpZGxlIGNoZWNrIGR1bXAgYnVmZmVyLgorICogQHBhcmFtIG51bV9kdW1wZWRfZHdvcmRzIC0gbnVtYmVyIG9mIGR3b3JkcyB0aGF0IHdlcmUgZHVtcGVkLgorICogQHBhcmFtIHJlc3VsdHNfYnVmX3NpemUgLSBPVVQ6IHJlcXVpcmVkIGJ1ZmZlciBzaXplIChpbiBieXRlcykgZm9yIHRoZSBwYXJzZWQKKyAqCXJlc3VsdHMuCisgKgorICogQHJldHVybiBlcnJvciBpZiB0aGUgcGFyc2luZyBmYWlscywgb2sgb3RoZXJ3aXNlLgorICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX2dldF9pZGxlX2Noa19yZXN1bHRzX2J1Zl9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJICB1MzIgKmR1bXBfYnVmLAorCQkJCQkJICB1MzIgIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkJICB1MzIgKnJlc3VsdHNfYnVmX3NpemUpOworLyoqCisgKiBAYnJpZWYgcWVkX3ByaW50X2lkbGVfY2hrX3Jlc3VsdHMgLSBQcmludHMgaWRsZSBjaGVjayByZXN1bHRzCisgKgorICogQHBhcmFtIHBfaHdmbiAtIEhXIGRldmljZSBkYXRhCisgKiBAcGFyYW0gZHVtcF9idWYgLSBpZGxlIGNoZWNrIGR1bXAgYnVmZmVyLgorICogQHBhcmFtIG51bV9kdW1wZWRfZHdvcmRzIC0gbnVtYmVyIG9mIGR3b3JkcyB0aGF0IHdlcmUgZHVtcGVkLgorICogQHBhcmFtIHJlc3VsdHNfYnVmIC0gYnVmZmVyIGZvciBwcmludGluZyB0aGUgaWRsZSBjaGVjayByZXN1bHRzLgorICogQHBhcmFtIG51bV9lcnJvcnMgLSBPVVQ6IG51bWJlciBvZiBlcnJvcnMgZm91bmQgaW4gaWRsZSBjaGVjay4KKyAqIEBwYXJhbSBudW1fd2FybmluZ3MgLSBPVVQ6IG51bWJlciBvZiB3YXJuaW5ncyBmb3VuZCBpbiBpZGxlIGNoZWNrLgorICoKKyAqIEByZXR1cm4gZXJyb3IgaWYgdGhlIHBhcnNpbmcgZmFpbHMsIG9rIG90aGVyd2lzZS4KKyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9wcmludF9pZGxlX2Noa19yZXN1bHRzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICB1MzIgKmR1bXBfYnVmLAorCQkJCQkgICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCSAgIGNoYXIgKnJlc3VsdHNfYnVmLAorCQkJCQkgICB1MzIgKm51bV9lcnJvcnMsCisJCQkJCSAgIHUzMiAqbnVtX3dhcm5pbmdzKTsKKy8qKgorICogQGJyaWVmIHFlZF9nZXRfbWNwX3RyYWNlX3Jlc3VsdHNfYnVmX3NpemUgLSBSZXR1cm5zIHRoZSByZXF1aXJlZCBidWZmZXIgc2l6ZQorICoJZm9yIE1DUCBUcmFjZSByZXN1bHRzIChpbiBieXRlcykuCisgKgorICogQHBhcmFtIHBfaHdmbiAtIEhXIGRldmljZSBkYXRhCisgKiBAcGFyYW0gZHVtcF9idWYgLSBNQ1AgVHJhY2UgZHVtcCBidWZmZXIuCisgKiBAcGFyYW0gbnVtX2R1bXBlZF9kd29yZHMgLSBudW1iZXIgb2YgZHdvcmRzIHRoYXQgd2VyZSBkdW1wZWQuCisgKiBAcGFyYW0gcmVzdWx0c19idWZfc2l6ZSAtIE9VVDogcmVxdWlyZWQgYnVmZmVyIHNpemUgKGluIGJ5dGVzKSBmb3IgdGhlIHBhcnNlZAorICoJcmVzdWx0cy4KKyAqCisgKiBAcmV0dXJuIGVycm9yIGlmIHRoZSBwYXJzaW5nIGZhaWxzLCBvayBvdGhlcndpc2UuCisgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfZ2V0X21jcF90cmFjZV9yZXN1bHRzX2J1Zl9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJCSAgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJCSAgIHUzMiAqcmVzdWx0c19idWZfc2l6ZSk7CisvKioKKyAqIEBicmllZiBxZWRfcHJpbnRfbWNwX3RyYWNlX3Jlc3VsdHMgLSBQcmludHMgTUNQIFRyYWNlIHJlc3VsdHMKKyAqCisgKiBAcGFyYW0gcF9od2ZuIC0gSFcgZGV2aWNlIGRhdGEKKyAqIEBwYXJhbSBkdW1wX2J1ZiAtIG1jcCB0cmFjZSBkdW1wIGJ1ZmZlciwgc3RhcnRpbmcgZnJvbSB0aGUgaGVhZGVyLgorICogQHBhcmFtIG51bV9kdW1wZWRfZHdvcmRzIC0gbnVtYmVyIG9mIGR3b3JkcyB0aGF0IHdlcmUgZHVtcGVkLgorICogQHBhcmFtIHJlc3VsdHNfYnVmIC0gYnVmZmVyIGZvciBwcmludGluZyB0aGUgbWNwIHRyYWNlIHJlc3VsdHMuCisgKgorICogQHJldHVybiBlcnJvciBpZiB0aGUgcGFyc2luZyBmYWlscywgb2sgb3RoZXJ3aXNlLgorICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX3ByaW50X21jcF90cmFjZV9yZXN1bHRzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJICAgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJICAgIGNoYXIgKnJlc3VsdHNfYnVmKTsKKy8qKgorICogQGJyaWVmIHFlZF9nZXRfcmVnX2ZpZm9fcmVzdWx0c19idWZfc2l6ZSAtIFJldHVybnMgdGhlIHJlcXVpcmVkIGJ1ZmZlciBzaXplCisgKglmb3IgcmVnX2ZpZm8gcmVzdWx0cyAoaW4gYnl0ZXMpLgorICoKKyAqIEBwYXJhbSBwX2h3Zm4gLSBIVyBkZXZpY2UgZGF0YQorICogQHBhcmFtIGR1bXBfYnVmIC0gcmVnIGZpZm8gZHVtcCBidWZmZXIuCisgKiBAcGFyYW0gbnVtX2R1bXBlZF9kd29yZHMgLSBudW1iZXIgb2YgZHdvcmRzIHRoYXQgd2VyZSBkdW1wZWQuCisgKiBAcGFyYW0gcmVzdWx0c19idWZfc2l6ZSAtIE9VVDogcmVxdWlyZWQgYnVmZmVyIHNpemUgKGluIGJ5dGVzKSBmb3IgdGhlIHBhcnNlZAorICoJcmVzdWx0cy4KKyAqCisgKiBAcmV0dXJuIGVycm9yIGlmIHRoZSBwYXJzaW5nIGZhaWxzLCBvayBvdGhlcndpc2UuCisgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfZ2V0X3JlZ19maWZvX3Jlc3VsdHNfYnVmX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgIHUzMiAqZHVtcF9idWYsCisJCQkJCQkgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJCSAgdTMyICpyZXN1bHRzX2J1Zl9zaXplKTsKKy8qKgorICogQGJyaWVmIHFlZF9wcmludF9yZWdfZmlmb19yZXN1bHRzIC0gUHJpbnRzIHJlZyBmaWZvIHJlc3VsdHMKKyAqCisgKiBAcGFyYW0gcF9od2ZuIC0gSFcgZGV2aWNlIGRhdGEKKyAqIEBwYXJhbSBkdW1wX2J1ZiAtIHJlZyBmaWZvIGR1bXAgYnVmZmVyLCBzdGFydGluZyBmcm9tIHRoZSBoZWFkZXIuCisgKiBAcGFyYW0gbnVtX2R1bXBlZF9kd29yZHMgLSBudW1iZXIgb2YgZHdvcmRzIHRoYXQgd2VyZSBkdW1wZWQuCisgKiBAcGFyYW0gcmVzdWx0c19idWYgLSBidWZmZXIgZm9yIHByaW50aW5nIHRoZSByZWcgZmlmbyByZXN1bHRzLgorICoKKyAqIEByZXR1cm4gZXJyb3IgaWYgdGhlIHBhcnNpbmcgZmFpbHMsIG9rIG90aGVyd2lzZS4KKyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9wcmludF9yZWdfZmlmb19yZXN1bHRzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICB1MzIgKmR1bXBfYnVmLAorCQkJCQkgICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCSAgIGNoYXIgKnJlc3VsdHNfYnVmKTsKKy8qKgorICogQGJyaWVmIHFlZF9nZXRfaWd1X2ZpZm9fcmVzdWx0c19idWZfc2l6ZSAtIFJldHVybnMgdGhlIHJlcXVpcmVkIGJ1ZmZlciBzaXplCisgKglmb3IgaWd1X2ZpZm8gcmVzdWx0cyAoaW4gYnl0ZXMpLgorICoKKyAqIEBwYXJhbSBwX2h3Zm4gLSBIVyBkZXZpY2UgZGF0YQorICogQHBhcmFtIGR1bXBfYnVmIC0gSUdVIGZpZm8gZHVtcCBidWZmZXIuCisgKiBAcGFyYW0gbnVtX2R1bXBlZF9kd29yZHMgLSBudW1iZXIgb2YgZHdvcmRzIHRoYXQgd2VyZSBkdW1wZWQuCisgKiBAcGFyYW0gcmVzdWx0c19idWZfc2l6ZSAtIE9VVDogcmVxdWlyZWQgYnVmZmVyIHNpemUgKGluIGJ5dGVzKSBmb3IgdGhlIHBhcnNlZAorICoJcmVzdWx0cy4KKyAqCisgKiBAcmV0dXJuIGVycm9yIGlmIHRoZSBwYXJzaW5nIGZhaWxzLCBvayBvdGhlcndpc2UuCisgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfZ2V0X2lndV9maWZvX3Jlc3VsdHNfYnVmX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgIHUzMiAqZHVtcF9idWYsCisJCQkJCQkgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJCSAgdTMyICpyZXN1bHRzX2J1Zl9zaXplKTsKKy8qKgorICogQGJyaWVmIHFlZF9wcmludF9pZ3VfZmlmb19yZXN1bHRzIC0gUHJpbnRzIElHVSBmaWZvIHJlc3VsdHMKKyAqCisgKiBAcGFyYW0gcF9od2ZuIC0gSFcgZGV2aWNlIGRhdGEKKyAqIEBwYXJhbSBkdW1wX2J1ZiAtIElHVSBmaWZvIGR1bXAgYnVmZmVyLCBzdGFydGluZyBmcm9tIHRoZSBoZWFkZXIuCisgKiBAcGFyYW0gbnVtX2R1bXBlZF9kd29yZHMgLSBudW1iZXIgb2YgZHdvcmRzIHRoYXQgd2VyZSBkdW1wZWQuCisgKiBAcGFyYW0gcmVzdWx0c19idWYgLSBidWZmZXIgZm9yIHByaW50aW5nIHRoZSBJR1UgZmlmbyByZXN1bHRzLgorICoKKyAqIEByZXR1cm4gZXJyb3IgaWYgdGhlIHBhcnNpbmcgZmFpbHMsIG9rIG90aGVyd2lzZS4KKyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9wcmludF9pZ3VfZmlmb19yZXN1bHRzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICB1MzIgKmR1bXBfYnVmLAorCQkJCQkgICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCSAgIGNoYXIgKnJlc3VsdHNfYnVmKTsKKy8qKgorICogQGJyaWVmIHFlZF9nZXRfcHJvdGVjdGlvbl9vdmVycmlkZV9yZXN1bHRzX2J1Zl9zaXplIC0gUmV0dXJucyB0aGUgcmVxdWlyZWQKKyAqCWJ1ZmZlciBzaXplIGZvciBwcm90ZWN0aW9uIG92ZXJyaWRlIHJlc3VsdHMgKGluIGJ5dGVzKS4KKyAqCisgKiBAcGFyYW0gcF9od2ZuIC0gSFcgZGV2aWNlIGRhdGEKKyAqIEBwYXJhbSBkdW1wX2J1ZiAtIHByb3RlY3Rpb24gb3ZlcnJpZGUgZHVtcCBidWZmZXIuCisgKiBAcGFyYW0gbnVtX2R1bXBlZF9kd29yZHMgLSBudW1iZXIgb2YgZHdvcmRzIHRoYXQgd2VyZSBkdW1wZWQuCisgKiBAcGFyYW0gcmVzdWx0c19idWZfc2l6ZSAtIE9VVDogcmVxdWlyZWQgYnVmZmVyIHNpemUgKGluIGJ5dGVzKSBmb3IgdGhlIHBhcnNlZAorICoJcmVzdWx0cy4KKyAqCisgKiBAcmV0dXJuIGVycm9yIGlmIHRoZSBwYXJzaW5nIGZhaWxzLCBvayBvdGhlcndpc2UuCisgKi8KK2VudW0gZGJnX3N0YXR1cworcWVkX2dldF9wcm90ZWN0aW9uX292ZXJyaWRlX3Jlc3VsdHNfYnVmX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJICAgICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCSAgICAgdTMyICpyZXN1bHRzX2J1Zl9zaXplKTsKKy8qKgorICogQGJyaWVmIHFlZF9wcmludF9wcm90ZWN0aW9uX292ZXJyaWRlX3Jlc3VsdHMgLSBQcmludHMgcHJvdGVjdGlvbiBvdmVycmlkZQorICoJcmVzdWx0cy4KKyAqCisgKiBAcGFyYW0gcF9od2ZuIC0gSFcgZGV2aWNlIGRhdGEKKyAqIEBwYXJhbSBkdW1wX2J1ZiAtIHByb3RlY3Rpb24gb3ZlcnJpZGUgZHVtcCBidWZmZXIsIHN0YXJ0aW5nIGZyb20gdGhlIGhlYWRlci4KKyAqIEBwYXJhbSBudW1fZHVtcGVkX2R3b3JkcyAtIG51bWJlciBvZiBkd29yZHMgdGhhdCB3ZXJlIGR1bXBlZC4KKyAqIEBwYXJhbSByZXN1bHRzX2J1ZiAtIGJ1ZmZlciBmb3IgcHJpbnRpbmcgdGhlIHJlZyBmaWZvIHJlc3VsdHMuCisgKgorICogQHJldHVybiBlcnJvciBpZiB0aGUgcGFyc2luZyBmYWlscywgb2sgb3RoZXJ3aXNlLgorICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX3ByaW50X3Byb3RlY3Rpb25fb3ZlcnJpZGVfcmVzdWx0cyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSAgICAgIHUzMiAqZHVtcF9idWYsCisJCQkJCQkgICAgICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCQkgICAgICBjaGFyICpyZXN1bHRzX2J1Zik7CisvKioKKyAqIEBicmllZiBxZWRfZ2V0X2Z3X2Fzc2VydHNfcmVzdWx0c19idWZfc2l6ZSAtIFJldHVybnMgdGhlIHJlcXVpcmVkIGJ1ZmZlciBzaXplCisgKglmb3IgRlcgQXNzZXJ0cyByZXN1bHRzIChpbiBieXRlcykuCisgKgorICogQHBhcmFtIHBfaHdmbiAtIEhXIGRldmljZSBkYXRhCisgKiBAcGFyYW0gZHVtcF9idWYgLSBGVyBBc3NlcnRzIGR1bXAgYnVmZmVyLgorICogQHBhcmFtIG51bV9kdW1wZWRfZHdvcmRzIC0gbnVtYmVyIG9mIGR3b3JkcyB0aGF0IHdlcmUgZHVtcGVkLgorICogQHBhcmFtIHJlc3VsdHNfYnVmX3NpemUgLSBPVVQ6IHJlcXVpcmVkIGJ1ZmZlciBzaXplIChpbiBieXRlcykgZm9yIHRoZSBwYXJzZWQKKyAqCXJlc3VsdHMuCisgKgorICogQHJldHVybiBlcnJvciBpZiB0aGUgcGFyc2luZyBmYWlscywgb2sgb3RoZXJ3aXNlLgorICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX2dldF9md19hc3NlcnRzX3Jlc3VsdHNfYnVmX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJCSAgICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCQkgICAgdTMyICpyZXN1bHRzX2J1Zl9zaXplKTsKKy8qKgorICogQGJyaWVmIHFlZF9wcmludF9md19hc3NlcnRzX3Jlc3VsdHMgLSBQcmludHMgRlcgQXNzZXJ0cyByZXN1bHRzCisgKgorICogQHBhcmFtIHBfaHdmbiAtIEhXIGRldmljZSBkYXRhCisgKiBAcGFyYW0gZHVtcF9idWYgLSBGVyBBc3NlcnRzIGR1bXAgYnVmZmVyLCBzdGFydGluZyBmcm9tIHRoZSBoZWFkZXIuCisgKiBAcGFyYW0gbnVtX2R1bXBlZF9kd29yZHMgLSBudW1iZXIgb2YgZHdvcmRzIHRoYXQgd2VyZSBkdW1wZWQuCisgKiBAcGFyYW0gcmVzdWx0c19idWYgLSBidWZmZXIgZm9yIHByaW50aW5nIHRoZSBGVyBBc3NlcnRzIHJlc3VsdHMuCisgKgorICogQHJldHVybiBlcnJvciBpZiB0aGUgcGFyc2luZyBmYWlscywgb2sgb3RoZXJ3aXNlLgorICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX3ByaW50X2Z3X2Fzc2VydHNfcmVzdWx0cyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICAgICB1MzIgKmR1bXBfYnVmLAorCQkJCQkgICAgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJICAgICBjaGFyICpyZXN1bHRzX2J1Zik7CiAvKiBXaW4gMiAqLwotI2RlZmluZSBHVFRfQkFSMF9NQVBfUkVHX0lHVV9DTUQgXAotCTB4MDBmMDAwVUwKKyNkZWZpbmUgR1RUX0JBUjBfTUFQX1JFR19JR1VfQ01ECTB4MDBmMDAwVUwKIAogLyogV2luIDMgKi8KLSNkZWZpbmUgR1RUX0JBUjBfTUFQX1JFR19UU0RNX1JBTSBcCi0JMHgwMTAwMDBVTAorI2RlZmluZSBHVFRfQkFSMF9NQVBfUkVHX1RTRE1fUkFNCTB4MDEwMDAwVUwKIAogLyogV2luIDQgKi8KLSNkZWZpbmUgR1RUX0JBUjBfTUFQX1JFR19NU0RNX1JBTSBcCi0JMHgwMTEwMDBVTAorI2RlZmluZSBHVFRfQkFSMF9NQVBfUkVHX01TRE1fUkFNCTB4MDExMDAwVUwKIAogLyogV2luIDUgKi8KLSNkZWZpbmUgR1RUX0JBUjBfTUFQX1JFR19NU0RNX1JBTV8xMDI0IFwKLQkweDAxMjAwMFVMCisjZGVmaW5lIEdUVF9CQVIwX01BUF9SRUdfTVNETV9SQU1fMTAyNAkweDAxMjAwMFVMCiAKIC8qIFdpbiA2ICovCi0jZGVmaW5lIEdUVF9CQVIwX01BUF9SRUdfVVNETV9SQU0gXAotCTB4MDEzMDAwVUwKKyNkZWZpbmUgR1RUX0JBUjBfTUFQX1JFR19VU0RNX1JBTQkweDAxMzAwMFVMCiAKIC8qIFdpbiA3ICovCi0jZGVmaW5lIEdUVF9CQVIwX01BUF9SRUdfVVNETV9SQU1fMTAyNCBcCi0JMHgwMTQwMDBVTAorI2RlZmluZSBHVFRfQkFSMF9NQVBfUkVHX1VTRE1fUkFNXzEwMjQJMHgwMTQwMDBVTAogCiAvKiBXaW4gOCAqLwotI2RlZmluZSBHVFRfQkFSMF9NQVBfUkVHX1VTRE1fUkFNXzIwNDggXAotCTB4MDE1MDAwVUwKKyNkZWZpbmUgR1RUX0JBUjBfTUFQX1JFR19VU0RNX1JBTV8yMDQ4CTB4MDE1MDAwVUwKIAogLyogV2luIDkgKi8KLSNkZWZpbmUgR1RUX0JBUjBfTUFQX1JFR19YU0RNX1JBTSBcCi0JMHgwMTYwMDBVTAorI2RlZmluZSBHVFRfQkFSMF9NQVBfUkVHX1hTRE1fUkFNCTB4MDE2MDAwVUwKIAogLyogV2luIDEwICovCi0jZGVmaW5lIEdUVF9CQVIwX01BUF9SRUdfWVNETV9SQU0gXAotCTB4MDE3MDAwVUwKKyNkZWZpbmUgR1RUX0JBUjBfTUFQX1JFR19ZU0RNX1JBTQkweDAxNzAwMFVMCiAKIC8qIFdpbiAxMSAqLwotI2RlZmluZSBHVFRfQkFSMF9NQVBfUkVHX1BTRE1fUkFNIFwKLQkweDAxODAwMFVMCisjZGVmaW5lIEdUVF9CQVIwX01BUF9SRUdfUFNETV9SQU0JMHgwMTgwMDBVTAogCiAvKioKICAqIEBicmllZiBxZWRfcW1fcGZfbWVtX3NpemUgLSBwcmVwYXJlIFFNIElMVCBzaXplcwpAQCAtMjAwMyw3ICszMjE3LDcgQEAKIAl1MTYgbnVtX3ZmX3BxczsKIAl1OCBzdGFydF92cG9ydDsKIAl1OCBudW1fdnBvcnRzOwotCXU4IHBmX3dmcTsKKwl1MTYgcGZfd2ZxOwogCXUzMiBwZl9ybDsKIAlzdHJ1Y3QgaW5pdF9xbV9wcV9wYXJhbXMgKnBxX3BhcmFtczsKIAlzdHJ1Y3QgaW5pdF9xbV92cG9ydF9wYXJhbXMgKnZwb3J0X3BhcmFtczsKQEAgLTIxMzgsNiArMzM1Miw5IEBACiAjZGVmaW5lCVRTVE9STV9QT1JUX1NUQVRfT0ZGU0VUKHBvcnRfaWQpIFwKIAkoSVJPWzFdLmJhc2UgKyAoKHBvcnRfaWQpICogSVJPWzFdLm0xKSkKICNkZWZpbmUJVFNUT1JNX1BPUlRfU1RBVF9TSVpFCQkJCShJUk9bMV0uc2l6ZSkKKyNkZWZpbmUgVFNUT1JNX0xMMl9QT1JUX1NUQVRfT0ZGU0VUKHBvcnRfaWQpIFwKKwkoSVJPWzJdLmJhc2UgKyAoKHBvcnRfaWQpICogSVJPWzJdLm0xKSkKKyNkZWZpbmUgVFNUT1JNX0xMMl9QT1JUX1NUQVRfU0laRQkJCShJUk9bMl0uc2l6ZSkKICNkZWZpbmUJVVNUT1JNX1ZGX1BGX0NIQU5ORUxfUkVBRFlfT0ZGU0VUKHZmX2lkKSBcCiAJKElST1szXS5iYXNlICsgKCh2Zl9pZCkgKiBJUk9bM10ubTEpKQogI2RlZmluZQlVU1RPUk1fVkZfUEZfQ0hBTk5FTF9SRUFEWV9TSVpFCQkJKElST1szXS5zaXplKQpAQCAtMjE1Myw0MiArMzM3MCw5MCBAQAogI2RlZmluZQlVU1RPUk1fQ09NTU9OX1FVRVVFX0NPTlNfT0ZGU0VUKHF1ZXVlX3pvbmVfaWQpIFwKIAkoSVJPWzddLmJhc2UgKyAoKHF1ZXVlX3pvbmVfaWQpICogSVJPWzddLm0xKSkKICNkZWZpbmUJVVNUT1JNX0NPTU1PTl9RVUVVRV9DT05TX1NJWkUJCQkoSVJPWzddLnNpemUpCisjZGVmaW5lIFRTVE9STV9MTDJfUlhfUFJPRFNfT0ZGU0VUKGNvcmVfcnhfcXVldWVfaWQpIFwKKwkoSVJPWzE0XS5iYXNlICsJKChjb3JlX3J4X3F1ZXVlX2lkKSAqIElST1sxNF0ubTEpKQorI2RlZmluZSBUU1RPUk1fTEwyX1JYX1BST0RTX1NJWkUJCQkoSVJPWzE0XS5zaXplKQorI2RlZmluZSBDT1JFX0xMMl9UU1RPUk1fUEVSX1FVRVVFX1NUQVRfT0ZGU0VUKGNvcmVfcnhfcXVldWVfaWQpIFwKKwkoSVJPWzE1XS5iYXNlICsgKChjb3JlX3J4X3F1ZXVlX2lkKSAqIElST1sxNV0ubTEpKQorI2RlZmluZSBDT1JFX0xMMl9UU1RPUk1fUEVSX1FVRVVFX1NUQVRfU0laRQkJKElST1sxNV0uc2l6ZSkKKyNkZWZpbmUgQ09SRV9MTDJfVVNUT1JNX1BFUl9RVUVVRV9TVEFUX09GRlNFVChjb3JlX3J4X3F1ZXVlX2lkKSBcCisJKElST1sxNl0uYmFzZSArCSgoY29yZV9yeF9xdWV1ZV9pZCkgKiBJUk9bMTZdLm0xKSkKKyNkZWZpbmUgQ09SRV9MTDJfVVNUT1JNX1BFUl9RVUVVRV9TVEFUX1NJWkUJCShJUk9bMTZdLnNpemUpCisjZGVmaW5lIENPUkVfTEwyX1BTVE9STV9QRVJfUVVFVUVfU1RBVF9PRkZTRVQoY29yZV90eF9zdGF0c19pZCkgXAorCShJUk9bMTddLmJhc2UgKwkoKGNvcmVfdHhfc3RhdHNfaWQpICogSVJPWzE3XS5tMSkpCisjZGVmaW5lIENPUkVfTEwyX1BTVE9STV9QRVJfUVVFVUVfU1RBVF9TSVpFCShJUk9bMTddLglzaXplKQogI2RlZmluZQlNU1RPUk1fUVVFVUVfU1RBVF9PRkZTRVQoc3RhdF9jb3VudGVyX2lkKSBcCiAJKElST1sxOF0uYmFzZSArICgoc3RhdF9jb3VudGVyX2lkKSAqIElST1sxOF0ubTEpKQogI2RlZmluZQlNU1RPUk1fUVVFVUVfU1RBVF9TSVpFCQkJCShJUk9bMThdLnNpemUpCiAjZGVmaW5lCU1TVE9STV9FVEhfUEZfUFJPRFNfT0ZGU0VUKHF1ZXVlX2lkKSBcCiAJKElST1sxOV0uYmFzZSArICgocXVldWVfaWQpICogSVJPWzE5XS5tMSkpCiAjZGVmaW5lCU1TVE9STV9FVEhfUEZfUFJPRFNfU0laRQkJCShJUk9bMTldLnNpemUpCi0jZGVmaW5lCU1TVE9STV9UUEFfVElNRU9VVF9VU19PRkZTRVQJCQkoSVJPWzIwXS5iYXNlKQotI2RlZmluZQlNU1RPUk1fVFBBX1RJTUVPVVRfVVNfU0laRQkJCShJUk9bMjBdLnNpemUpCisjZGVmaW5lIE1TVE9STV9FVEhfVkZfUFJPRFNfT0ZGU0VUKHZmX2lkLCB2Zl9xdWV1ZV9pZCkgXAorCShJUk9bMjBdLmJhc2UgKwkoKHZmX2lkKSAqIElST1syMF0ubTEpICsgKCh2Zl9xdWV1ZV9pZCkgKiBJUk9bMjBdLm0yKSkKKyNkZWZpbmUgTVNUT1JNX0VUSF9WRl9QUk9EU19TSVpFCQkJKElST1syMF0uc2l6ZSkKKyNkZWZpbmUJTVNUT1JNX1RQQV9USU1FT1VUX1VTX09GRlNFVAkJCShJUk9bMjFdLmJhc2UpCisjZGVmaW5lCU1TVE9STV9UUEFfVElNRU9VVF9VU19TSVpFCQkJKElST1syMV0uc2l6ZSkKICNkZWZpbmUJTVNUT1JNX0VUSF9QRl9TVEFUX09GRlNFVChwZl9pZCkgXAotCShJUk9bMjFdLmJhc2UgKyAoKHBmX2lkKSAqIElST1syMV0ubTEpKQorCShJUk9bMjJdLmJhc2UgKyAoKHBmX2lkKSAqIElST1syMl0ubTEpKQogI2RlZmluZQlNU1RPUk1fRVRIX1BGX1NUQVRfU0laRQkJCQkoSVJPWzIxXS5zaXplKQogI2RlZmluZQlVU1RPUk1fUVVFVUVfU1RBVF9PRkZTRVQoc3RhdF9jb3VudGVyX2lkKSBcCi0JKElST1syMl0uYmFzZSArICgoc3RhdF9jb3VudGVyX2lkKSAqIElST1syMl0ubTEpKQotI2RlZmluZQlVU1RPUk1fUVVFVUVfU1RBVF9TSVpFCQkJCShJUk9bMjJdLnNpemUpCisJKElST1syM10uYmFzZSArICgoc3RhdF9jb3VudGVyX2lkKSAqIElST1syM10ubTEpKQorI2RlZmluZQlVU1RPUk1fUVVFVUVfU1RBVF9TSVpFCQkJCShJUk9bMjNdLnNpemUpCiAjZGVmaW5lCVVTVE9STV9FVEhfUEZfU1RBVF9PRkZTRVQocGZfaWQpIFwKLQkoSVJPWzIzXS5iYXNlICsgKChwZl9pZCkgKiBJUk9bMjNdLm0xKSkKLSNkZWZpbmUJVVNUT1JNX0VUSF9QRl9TVEFUX1NJWkUJCQkJKElST1syM10uc2l6ZSkKKwkoSVJPWzI0XS5iYXNlICsgKChwZl9pZCkgKiBJUk9bMjRdLm0xKSkKKyNkZWZpbmUJVVNUT1JNX0VUSF9QRl9TVEFUX1NJWkUJCQkJKElST1syNF0uc2l6ZSkKICNkZWZpbmUJUFNUT1JNX1FVRVVFX1NUQVRfT0ZGU0VUKHN0YXRfY291bnRlcl9pZCkgXAotCShJUk9bMjRdLmJhc2UgKyAoKHN0YXRfY291bnRlcl9pZCkgKiBJUk9bMjRdLm0xKSkKLSNkZWZpbmUJUFNUT1JNX1FVRVVFX1NUQVRfU0laRQkJCQkoSVJPWzI0XS5zaXplKQorCShJUk9bMjVdLmJhc2UgKyAoKHN0YXRfY291bnRlcl9pZCkgKiBJUk9bMjVdLm0xKSkKKyNkZWZpbmUJUFNUT1JNX1FVRVVFX1NUQVRfU0laRQkJCQkoSVJPWzI1XS5zaXplKQogI2RlZmluZQlQU1RPUk1fRVRIX1BGX1NUQVRfT0ZGU0VUKHBmX2lkKSBcCi0JKElST1syNV0uYmFzZSArICgocGZfaWQpICogSVJPWzI1XS5tMSkpCi0jZGVmaW5lCVBTVE9STV9FVEhfUEZfU1RBVF9TSVpFCQkJCShJUk9bMjVdLnNpemUpCisJKElST1syNl0uYmFzZSArICgocGZfaWQpICogSVJPWzI2XS5tMSkpCisjZGVmaW5lCVBTVE9STV9FVEhfUEZfU1RBVF9TSVpFCQkJCShJUk9bMjZdLnNpemUpCiAjZGVmaW5lCVBTVE9STV9DVExfRlJBTUVfRVRIVFlQRV9PRkZTRVQoZXRodHlwZSkgXAotCShJUk9bMjZdLmJhc2UgKyAoKGV0aHR5cGUpICogSVJPWzI2XS5tMSkpCi0jZGVmaW5lCVBTVE9STV9DVExfRlJBTUVfRVRIVFlQRV9TSVpFCQkJKElST1syNl0uc2l6ZSkKLSNkZWZpbmUJVFNUT1JNX0VUSF9QUlNfSU5QVVRfT0ZGU0VUCQkJKElST1syN10uYmFzZSkKLSNkZWZpbmUJVFNUT1JNX0VUSF9QUlNfSU5QVVRfU0laRQkJCShJUk9bMjddLnNpemUpCisJKElST1syN10uYmFzZSArICgoZXRodHlwZSkgKiBJUk9bMjddLm0xKSkKKyNkZWZpbmUJUFNUT1JNX0NUTF9GUkFNRV9FVEhUWVBFX1NJWkUJCQkoSVJPWzI3XS5zaXplKQorI2RlZmluZQlUU1RPUk1fRVRIX1BSU19JTlBVVF9PRkZTRVQJCQkoSVJPWzI4XS5iYXNlKQorI2RlZmluZQlUU1RPUk1fRVRIX1BSU19JTlBVVF9TSVpFCQkJKElST1syOF0uc2l6ZSkKICNkZWZpbmUJRVRIX1JYX1JBVEVfTElNSVRfT0ZGU0VUKHBmX2lkKSBcCi0JKElST1syOF0uYmFzZSArICgocGZfaWQpICogSVJPWzI4XS5tMSkpCi0jZGVmaW5lCUVUSF9SWF9SQVRFX0xJTUlUX1NJWkUJCQkJKElST1syOF0uc2l6ZSkKKwkoSVJPWzI5XS5iYXNlICsgKChwZl9pZCkgKiBJUk9bMjldLm0xKSkKKyNkZWZpbmUJRVRIX1JYX1JBVEVfTElNSVRfU0laRQkJCQkoSVJPWzI5XS5zaXplKQogI2RlZmluZQlYU1RPUk1fRVRIX1FVRVVFX1pPTkVfT0ZGU0VUKHF1ZXVlX2lkKSBcCi0JKElST1syOV0uYmFzZSArICgocXVldWVfaWQpICogSVJPWzI5XS5tMSkpCi0jZGVmaW5lCVhTVE9STV9FVEhfUVVFVUVfWk9ORV9TSVpFCQkJKElST1syOV0uc2l6ZSkKKwkoSVJPWzMwXS5iYXNlICsgKChxdWV1ZV9pZCkgKiBJUk9bMzBdLm0xKSkKKyNkZWZpbmUJWFNUT1JNX0VUSF9RVUVVRV9aT05FX1NJWkUJCQkoSVJPWzMwXS5zaXplKQorI2RlZmluZSBUU1RPUk1fU0NTSV9DTURRX0NPTlNfT0ZGU0VUKGNtZHFfcXVldWVfaWQpIFwKKwkoSVJPWzM0XS5iYXNlICsJKChjbWRxX3F1ZXVlX2lkKSAqIElST1szNF0ubTEpKQorI2RlZmluZSBUU1RPUk1fU0NTSV9DTURRX0NPTlNfU0laRQkJCQkoSVJPWzM0XS5zaXplKQorI2RlZmluZSBUU1RPUk1fU0NTSV9CRFFfRVhUX1BST0RfT0ZGU0VUKGZ1bmNfaWQsIGJkcV9pZCkgXAorCShJUk9bMzVdLmJhc2UgKwkoKGZ1bmNfaWQpICogSVJPWzM1XS5tMSkgKyAoKGJkcV9pZCkgKiBJUk9bMzVdLm0yKSkKKyNkZWZpbmUgVFNUT1JNX1NDU0lfQkRRX0VYVF9QUk9EX1NJWkUJCQkJKElST1szNV0uc2l6ZSkKKyNkZWZpbmUgTVNUT1JNX1NDU0lfQkRRX0VYVF9QUk9EX09GRlNFVChmdW5jX2lkLCBiZHFfaWQpIFwKKwkoSVJPWzM2XS5iYXNlICsJKChmdW5jX2lkKSAqIElST1szNl0ubTEpICsgKChiZHFfaWQpICogSVJPWzM2XS5tMikpCisjZGVmaW5lIE1TVE9STV9TQ1NJX0JEUV9FWFRfUFJPRF9TSVpFCQkJCShJUk9bMzZdLnNpemUpCisjZGVmaW5lIFRTVE9STV9JU0NTSV9SWF9TVEFUU19PRkZTRVQocGZfaWQpIFwKKwkoSVJPWzM3XS5iYXNlICsJKChwZl9pZCkgKiBJUk9bMzddLm0xKSkKKyNkZWZpbmUgVFNUT1JNX0lTQ1NJX1JYX1NUQVRTX1NJWkUJCQkJKElST1szN10uc2l6ZSkKKyNkZWZpbmUgTVNUT1JNX0lTQ1NJX1JYX1NUQVRTX09GRlNFVChwZl9pZCkgXAorCShJUk9bMzhdLmJhc2UgKwkoKHBmX2lkKSAqIElST1szOF0ubTEpKQorI2RlZmluZSBNU1RPUk1fSVNDU0lfUlhfU1RBVFNfU0laRQkJCQkoSVJPWzM4XS5zaXplKQorI2RlZmluZSBVU1RPUk1fSVNDU0lfUlhfU1RBVFNfT0ZGU0VUKHBmX2lkKSBcCisJKElST1szOV0uYmFzZSArCSgocGZfaWQpICogSVJPWzM5XS5tMSkpCisjZGVmaW5lIFVTVE9STV9JU0NTSV9SWF9TVEFUU19TSVpFCQkJCShJUk9bMzldLnNpemUpCisjZGVmaW5lIFhTVE9STV9JU0NTSV9UWF9TVEFUU19PRkZTRVQocGZfaWQpIFwKKwkoSVJPWzQwXS5iYXNlICsJKChwZl9pZCkgKiBJUk9bNDBdLm0xKSkKKyNkZWZpbmUgWFNUT1JNX0lTQ1NJX1RYX1NUQVRTX1NJWkUJCQkJKElST1s0MF0uc2l6ZSkKKyNkZWZpbmUgWVNUT1JNX0lTQ1NJX1RYX1NUQVRTX09GRlNFVChwZl9pZCkgXAorCShJUk9bNDFdLmJhc2UgKwkoKHBmX2lkKSAqIElST1s0MV0ubTEpKQorI2RlZmluZSBZU1RPUk1fSVNDU0lfVFhfU1RBVFNfU0laRQkJCQkoSVJPWzQxXS5zaXplKQorI2RlZmluZSBQU1RPUk1fSVNDU0lfVFhfU1RBVFNfT0ZGU0VUKHBmX2lkKSBcCisJKElST1s0Ml0uYmFzZSArCSgocGZfaWQpICogSVJPWzQyXS5tMSkpCisjZGVmaW5lIFBTVE9STV9JU0NTSV9UWF9TVEFUU19TSVpFCQkJCShJUk9bNDJdLnNpemUpCisjZGVmaW5lIFBTVE9STV9SRE1BX1FVRVVFX1NUQVRfT0ZGU0VUKHJkbWFfc3RhdF9jb3VudGVyX2lkKSBcCisJKElST1s0NV0uYmFzZSArCSgocmRtYV9zdGF0X2NvdW50ZXJfaWQpICogSVJPWzQ1XS5tMSkpCisjZGVmaW5lIFBTVE9STV9SRE1BX1FVRVVFX1NUQVRfU0laRQkJCQkoSVJPWzQ1XS5zaXplKQorI2RlZmluZSBUU1RPUk1fUkRNQV9RVUVVRV9TVEFUX09GRlNFVChyZG1hX3N0YXRfY291bnRlcl9pZCkgXAorCShJUk9bNDZdLmJhc2UgKwkoKHJkbWFfc3RhdF9jb3VudGVyX2lkKSAqIElST1s0Nl0ubTEpKQorI2RlZmluZSBUU1RPUk1fUkRNQV9RVUVVRV9TVEFUX1NJWkUJCQkJKElST1s0Nl0uc2l6ZSkKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBpcm8gaXJvX2Fycls0Nl0gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGlybyBpcm9fYXJyWzQ3XSA9IHsKIAl7MHgwLCAweDAsIDB4MCwgMHgwLCAweDh9LAogCXsweDRjYjAsIDB4NzgsIDB4MCwgMHgwLCAweDc4fSwKIAl7MHg2MzE4LCAweDIwLCAweDAsIDB4MCwgMHgyMH0sCkBAIC0yMjAxLDIwICszNDY2LDIxIEBACiAJezB4M2RmMCwgMHgwLCAweDAsIDB4MCwgMHg3OH0sCiAJezB4MjliMCwgMHgwLCAweDAsIDB4MCwgMHg3OH0sCiAJezB4NGMzOCwgMHgwLCAweDAsIDB4MCwgMHg3OH0sCi0JezB4NGE0OCwgMHgwLCAweDAsIDB4MCwgMHg3OH0sCisJezB4NDk5MCwgMHgwLCAweDAsIDB4MCwgMHg3OH0sCiAJezB4N2U0OCwgMHgwLCAweDAsIDB4MCwgMHg3OH0sCiAJezB4YTI4LCAweDgsIDB4MCwgMHgwLCAweDh9LAogCXsweDYwZjgsIDB4MTAsIDB4MCwgMHgwLCAweDEwfSwKIAl7MHhiODIwLCAweDMwLCAweDAsIDB4MCwgMHgzMH0sCiAJezB4OTViOCwgMHgzMCwgMHgwLCAweDAsIDB4MzB9LAotCXsweDRjMTgsIDB4ODAsIDB4MCwgMHgwLCAweDQwfSwKKwl7MHg0YjYwLCAweDgwLCAweDAsIDB4MCwgMHg0MH0sCiAJezB4MWY4LCAweDQsIDB4MCwgMHgwLCAweDR9LAotCXsweGM5YTgsIDB4MCwgMHgwLCAweDAsIDB4NH0sCi0JezB4NGM1OCwgMHg4MCwgMHgwLCAweDAsIDB4MjB9LAorCXsweDUzYTAsIDB4ODAsIDB4NCwgMHgwLCAweDR9LAorCXsweGM4ZjAsIDB4MCwgMHgwLCAweDAsIDB4NH0sCisJezB4NGJhMCwgMHg4MCwgMHgwLCAweDAsIDB4MjB9LAogCXsweDgwNTAsIDB4NDAsIDB4MCwgMHgwLCAweDMwfSwKIAl7MHhlNzcwLCAweDYwLCAweDAsIDB4MCwgMHg2MH0sCiAJezB4MmI0OCwgMHg4MCwgMHgwLCAweDAsIDB4Mzh9LAotCXsweGRmODgsIDB4NzgsIDB4MCwgMHgwLCAweDc4fSwKKwl7MHhmMTg4LCAweDc4LCAweDAsIDB4MCwgMHg3OH0sCiAJezB4MWY4LCAweDQsIDB4MCwgMHgwLCAweDR9LAogCXsweGFjZjAsIDB4MCwgMHgwLCAweDAsIDB4ZjB9LAogCXsweGFkZTAsIDB4OCwgMHgwLCAweDAsIDB4OH0sCkBAIC0yMjI2LDQ1NSArMzQ5Miw0NTcgQEAKIAl7MHgyMDAsIDB4MTAsIDB4OCwgMHgwLCAweDh9LAogCXsweGI3OCwgMHgxMCwgMHg4LCAweDAsIDB4Mn0sCiAJezB4ZDg4OCwgMHgzOCwgMHgwLCAweDAsIDB4MjR9LAotCXsweDEyMTIwLCAweDEwLCAweDAsIDB4MCwgMHg4fSwKLQl7MHgxMWIyMCwgMHgzOCwgMHgwLCAweDAsIDB4MTh9LAorCXsweDEyYzM4LCAweDEwLCAweDAsIDB4MCwgMHg4fSwKKwl7MHgxMWFhMCwgMHgzOCwgMHgwLCAweDAsIDB4MTh9LAogCXsweGE4YzAsIDB4MzAsIDB4MCwgMHgwLCAweDEwfSwKIAl7MHg4NmY4LCAweDI4LCAweDAsIDB4MCwgMHgxOH0sCi0JezB4ZWZmOCwgMHgxMCwgMHgwLCAweDAsIDB4MTB9LAorCXsweDEwMWY4LCAweDEwLCAweDAsIDB4MCwgMHgxMH0sCiAJezB4ZGQwOCwgMHg0OCwgMHgwLCAweDAsIDB4Mzh9LAotCXsweGY0NjAsIDB4MjAsIDB4MCwgMHgwLCAweDIwfSwKKwl7MHgxMDY2MCwgMHgyMCwgMHgwLCAweDAsIDB4MjB9LAogCXsweDJiODAsIDB4ODAsIDB4MCwgMHgwLCAweDEwfSwKIAl7MHg1MDAwLCAweDEwLCAweDAsIDB4MCwgMHgxMH0sCiB9OwogCiAvKiBSdW50aW1lIGFycmF5IG9mZnNldHMgKi8KLSNkZWZpbmUgRE9SUV9SRUdfUEZfTUFYX0lDSURfMF9SVF9PRkZTRVQgMAotI2RlZmluZSBET1JRX1JFR19QRl9NQVhfSUNJRF8xX1JUX09GRlNFVCAxCi0jZGVmaW5lIERPUlFfUkVHX1BGX01BWF9JQ0lEXzJfUlRfT0ZGU0VUIDIKLSNkZWZpbmUgRE9SUV9SRUdfUEZfTUFYX0lDSURfM19SVF9PRkZTRVQgMwotI2RlZmluZSBET1JRX1JFR19QRl9NQVhfSUNJRF80X1JUX09GRlNFVCA0Ci0jZGVmaW5lIERPUlFfUkVHX1BGX01BWF9JQ0lEXzVfUlRfT0ZGU0VUIDUKLSNkZWZpbmUgRE9SUV9SRUdfUEZfTUFYX0lDSURfNl9SVF9PRkZTRVQgNgotI2RlZmluZSBET1JRX1JFR19QRl9NQVhfSUNJRF83X1JUX09GRlNFVCA3Ci0jZGVmaW5lIERPUlFfUkVHX1ZGX01BWF9JQ0lEXzBfUlRfT0ZGU0VUIDgKLSNkZWZpbmUgRE9SUV9SRUdfVkZfTUFYX0lDSURfMV9SVF9PRkZTRVQgOQotI2RlZmluZSBET1JRX1JFR19WRl9NQVhfSUNJRF8yX1JUX09GRlNFVCAxMAotI2RlZmluZSBET1JRX1JFR19WRl9NQVhfSUNJRF8zX1JUX09GRlNFVCAxMQotI2RlZmluZSBET1JRX1JFR19WRl9NQVhfSUNJRF80X1JUX09GRlNFVCAxMgotI2RlZmluZSBET1JRX1JFR19WRl9NQVhfSUNJRF81X1JUX09GRlNFVCAxMwotI2RlZmluZSBET1JRX1JFR19WRl9NQVhfSUNJRF82X1JUX09GRlNFVCAxNAotI2RlZmluZSBET1JRX1JFR19WRl9NQVhfSUNJRF83X1JUX09GRlNFVCAxNQotI2RlZmluZSBET1JRX1JFR19QRl9XQUtFX0FMTF9SVF9PRkZTRVQgMTYKLSNkZWZpbmUgRE9SUV9SRUdfVEFHMV9FVEhFUlRZUEVfUlRfT0ZGU0VUIDE3Ci0jZGVmaW5lIElHVV9SRUdfUEZfQ09ORklHVVJBVElPTl9SVF9PRkZTRVQgMTgKLSNkZWZpbmUgSUdVX1JFR19WRl9DT05GSUdVUkFUSU9OX1JUX09GRlNFVCAxOQotI2RlZmluZSBJR1VfUkVHX0FUVE5fTVNHX0FERFJfTF9SVF9PRkZTRVQgMjAKLSNkZWZpbmUgSUdVX1JFR19BVFROX01TR19BRERSX0hfUlRfT0ZGU0VUIDIxCi0jZGVmaW5lIElHVV9SRUdfTEVBRElOR19FREdFX0xBVENIX1JUX09GRlNFVCAyMgotI2RlZmluZSBJR1VfUkVHX1RSQUlMSU5HX0VER0VfTEFUQ0hfUlRfT0ZGU0VUIDIzCi0jZGVmaW5lIENBVV9SRUdfQ1FFX0FHR19VTklUX1NJWkVfUlRfT0ZGU0VUIDI0Ci0jZGVmaW5lIENBVV9SRUdfU0JfVkFSX01FTU9SWV9SVF9PRkZTRVQgNzYxCi0jZGVmaW5lIENBVV9SRUdfU0JfVkFSX01FTU9SWV9SVF9TSVpFIDczNgotI2RlZmluZSBDQVVfUkVHX1NCX1ZBUl9NRU1PUllfUlRfT0ZGU0VUIDc2MQotI2RlZmluZSBDQVVfUkVHX1NCX1ZBUl9NRU1PUllfUlRfU0laRSA3MzYKLSNkZWZpbmUgQ0FVX1JFR19TQl9BRERSX01FTU9SWV9SVF9PRkZTRVQgMTQ5NwotI2RlZmluZSBDQVVfUkVHX1NCX0FERFJfTUVNT1JZX1JUX1NJWkUgNzM2Ci0jZGVmaW5lIENBVV9SRUdfUElfTUVNT1JZX1JUX09GRlNFVCAyMjMzCi0jZGVmaW5lIENBVV9SRUdfUElfTUVNT1JZX1JUX1NJWkUgNDQxNgotI2RlZmluZSBQUlNfUkVHX1NFQVJDSF9SRVNQX0lOSVRJQVRPUl9UWVBFX1JUX09GRlNFVCA2NjQ5Ci0jZGVmaW5lIFBSU19SRUdfVEFTS19JRF9NQVhfSU5JVElBVE9SX1BGX1JUX09GRlNFVCA2NjUwCi0jZGVmaW5lIFBSU19SRUdfVEFTS19JRF9NQVhfSU5JVElBVE9SX1ZGX1JUX09GRlNFVCA2NjUxCi0jZGVmaW5lIFBSU19SRUdfVEFTS19JRF9NQVhfVEFSR0VUX1BGX1JUX09GRlNFVCA2NjUyCi0jZGVmaW5lIFBSU19SRUdfVEFTS19JRF9NQVhfVEFSR0VUX1ZGX1JUX09GRlNFVCA2NjUzCi0jZGVmaW5lIFBSU19SRUdfU0VBUkNIX1RDUF9SVF9PRkZTRVQgNjY1NAotI2RlZmluZSBQUlNfUkVHX1NFQVJDSF9GQ09FX1JUX09GRlNFVCA2NjU1Ci0jZGVmaW5lIFBSU19SRUdfU0VBUkNIX1JPQ0VfUlRfT0ZGU0VUIDY2NTYKLSNkZWZpbmUgUFJTX1JFR19ST0NFX0RFU1RfUVBfTUFYX1ZGX1JUX09GRlNFVCA2NjU3Ci0jZGVmaW5lIFBSU19SRUdfUk9DRV9ERVNUX1FQX01BWF9QRl9SVF9PRkZTRVQgNjY1OAotI2RlZmluZSBQUlNfUkVHX1NFQVJDSF9PUEVORkxPV19SVF9PRkZTRVQgNjY1OQotI2RlZmluZSBQUlNfUkVHX1NFQVJDSF9OT05fSVBfQVNfT1BFTkZMT1dfUlRfT0ZGU0VUIDY2NjAKLSNkZWZpbmUgUFJTX1JFR19PUEVORkxPV19TVVBQT1JUX09OTFlfS05PV05fT1ZFUl9JUF9SVF9PRkZTRVQgNjY2MQotI2RlZmluZSBQUlNfUkVHX09QRU5GTE9XX1NFQVJDSF9LRVlfTUFTS19SVF9PRkZTRVQgNjY2MgotI2RlZmluZSBQUlNfUkVHX1RBR19FVEhFUlRZUEVfMF9SVF9PRkZTRVQgNjY2MwotI2RlZmluZSBQUlNfUkVHX0xJR0hUX0wyX0VUSEVSVFlQRV9FTl9SVF9PRkZTRVQgNjY2NAotI2RlZmluZSBTUkNfUkVHX0ZJUlNURlJFRV9SVF9PRkZTRVQgNjY2NQotI2RlZmluZSBTUkNfUkVHX0ZJUlNURlJFRV9SVF9TSVpFIDIKLSNkZWZpbmUgU1JDX1JFR19MQVNURlJFRV9SVF9PRkZTRVQgNjY2NwotI2RlZmluZSBTUkNfUkVHX0xBU1RGUkVFX1JUX1NJWkUgMgotI2RlZmluZSBTUkNfUkVHX0NPVU5URlJFRV9SVF9PRkZTRVQgNjY2OQotI2RlZmluZSBTUkNfUkVHX05VTUJFUl9IQVNIX0JJVFNfUlRfT0ZGU0VUIDY2NzAKLSNkZWZpbmUgUFNXUlEyX1JFR19DRFVUX1BfU0laRV9SVF9PRkZTRVQgNjY3MQotI2RlZmluZSBQU1dSUTJfUkVHX0NEVUNfUF9TSVpFX1JUX09GRlNFVCA2NjcyCi0jZGVmaW5lIFBTV1JRMl9SRUdfVE1fUF9TSVpFX1JUX09GRlNFVCA2NjczCi0jZGVmaW5lIFBTV1JRMl9SRUdfUU1fUF9TSVpFX1JUX09GRlNFVCA2Njc0Ci0jZGVmaW5lIFBTV1JRMl9SRUdfU1JDX1BfU0laRV9SVF9PRkZTRVQgNjY3NQotI2RlZmluZSBQU1dSUTJfUkVHX1RTRE1fUF9TSVpFX1JUX09GRlNFVCA2Njc2Ci0jZGVmaW5lIFBTV1JRMl9SRUdfVE1fRklSU1RfSUxUX1JUX09GRlNFVCA2Njc3Ci0jZGVmaW5lIFBTV1JRMl9SRUdfVE1fTEFTVF9JTFRfUlRfT0ZGU0VUIDY2NzgKLSNkZWZpbmUgUFNXUlEyX1JFR19RTV9GSVJTVF9JTFRfUlRfT0ZGU0VUIDY2NzkKLSNkZWZpbmUgUFNXUlEyX1JFR19RTV9MQVNUX0lMVF9SVF9PRkZTRVQgNjY4MAotI2RlZmluZSBQU1dSUTJfUkVHX1NSQ19GSVJTVF9JTFRfUlRfT0ZGU0VUIDY2ODEKLSNkZWZpbmUgUFNXUlEyX1JFR19TUkNfTEFTVF9JTFRfUlRfT0ZGU0VUIDY2ODIKLSNkZWZpbmUgUFNXUlEyX1JFR19DRFVDX0ZJUlNUX0lMVF9SVF9PRkZTRVQgNjY4MwotI2RlZmluZSBQU1dSUTJfUkVHX0NEVUNfTEFTVF9JTFRfUlRfT0ZGU0VUIDY2ODQKLSNkZWZpbmUgUFNXUlEyX1JFR19DRFVUX0ZJUlNUX0lMVF9SVF9PRkZTRVQgNjY4NQotI2RlZmluZSBQU1dSUTJfUkVHX0NEVVRfTEFTVF9JTFRfUlRfT0ZGU0VUIDY2ODYKLSNkZWZpbmUgUFNXUlEyX1JFR19UU0RNX0ZJUlNUX0lMVF9SVF9PRkZTRVQgNjY4NwotI2RlZmluZSBQU1dSUTJfUkVHX1RTRE1fTEFTVF9JTFRfUlRfT0ZGU0VUIDY2ODgKLSNkZWZpbmUgUFNXUlEyX1JFR19UTV9OVU1CRVJfT0ZfUEZfQkxPQ0tTX1JUX09GRlNFVCA2Njg5Ci0jZGVmaW5lIFBTV1JRMl9SRUdfQ0RVVF9OVU1CRVJfT0ZfUEZfQkxPQ0tTX1JUX09GRlNFVCA2NjkwCi0jZGVmaW5lIFBTV1JRMl9SRUdfQ0RVQ19OVU1CRVJfT0ZfUEZfQkxPQ0tTX1JUX09GRlNFVCA2NjkxCi0jZGVmaW5lIFBTV1JRMl9SRUdfVE1fVkZfQkxPQ0tTX1JUX09GRlNFVCA2NjkyCi0jZGVmaW5lIFBTV1JRMl9SRUdfQ0RVVF9WRl9CTE9DS1NfUlRfT0ZGU0VUIDY2OTMKLSNkZWZpbmUgUFNXUlEyX1JFR19DRFVDX1ZGX0JMT0NLU19SVF9PRkZTRVQgNjY5NAotI2RlZmluZSBQU1dSUTJfUkVHX1RNX0JMT0NLU19GQUNUT1JfUlRfT0ZGU0VUIDY2OTUKLSNkZWZpbmUgUFNXUlEyX1JFR19DRFVUX0JMT0NLU19GQUNUT1JfUlRfT0ZGU0VUIDY2OTYKLSNkZWZpbmUgUFNXUlEyX1JFR19DRFVDX0JMT0NLU19GQUNUT1JfUlRfT0ZGU0VUIDY2OTcKLSNkZWZpbmUgUFNXUlEyX1JFR19WRl9CQVNFX1JUX09GRlNFVCA2Njk4Ci0jZGVmaW5lIFBTV1JRMl9SRUdfVkZfTEFTVF9JTFRfUlRfT0ZGU0VUIDY2OTkKLSNkZWZpbmUgUFNXUlEyX1JFR19XUl9NQlMwX1JUX09GRlNFVCA2NzAwCi0jZGVmaW5lIFBTV1JRMl9SRUdfUkRfTUJTMF9SVF9PRkZTRVQgNjcwMQotI2RlZmluZSBQU1dSUTJfUkVHX0RSQU1fQUxJR05fV1JfUlRfT0ZGU0VUIDY3MDIKLSNkZWZpbmUgUFNXUlEyX1JFR19EUkFNX0FMSUdOX1JEX1JUX09GRlNFVCA2NzAzCi0jZGVmaW5lIFBTV1JRMl9SRUdfSUxUX01FTU9SWV9SVF9PRkZTRVQgNjcwNAotI2RlZmluZSBQU1dSUTJfUkVHX0lMVF9NRU1PUllfUlRfU0laRSAyMjAwMAotI2RlZmluZSBQR0xVRV9SRUdfQl9WRl9CQVNFX1JUX09GRlNFVCAyODcwNAotI2RlZmluZSBQR0xVRV9SRUdfQl9DQUNIRV9MSU5FX1NJWkVfUlRfT0ZGU0VUIDI4NzA1Ci0jZGVmaW5lIFBHTFVFX1JFR19CX1BGX0JBUjBfU0laRV9SVF9PRkZTRVQgMjg3MDYKLSNkZWZpbmUgUEdMVUVfUkVHX0JfUEZfQkFSMV9TSVpFX1JUX09GRlNFVCAyODcwNwotI2RlZmluZSBQR0xVRV9SRUdfQl9WRl9CQVIxX1NJWkVfUlRfT0ZGU0VUIDI4NzA4Ci0jZGVmaW5lIFRNX1JFR19WRl9FTkFCTEVfQ09OTl9SVF9PRkZTRVQgMjg3MDkKLSNkZWZpbmUgVE1fUkVHX1BGX0VOQUJMRV9DT05OX1JUX09GRlNFVCAyODcxMAotI2RlZmluZSBUTV9SRUdfUEZfRU5BQkxFX1RBU0tfUlRfT0ZGU0VUIDI4NzExCi0jZGVmaW5lIFRNX1JFR19HUk9VUF9TSVpFX1JFU09MVVRJT05fQ09OTl9SVF9PRkZTRVQgMjg3MTIKLSNkZWZpbmUgVE1fUkVHX0dST1VQX1NJWkVfUkVTT0xVVElPTl9UQVNLX1JUX09GRlNFVCAyODcxMwotI2RlZmluZSBUTV9SRUdfQ09ORklHX0NPTk5fTUVNX1JUX09GRlNFVCAyODcxNAotI2RlZmluZSBUTV9SRUdfQ09ORklHX0NPTk5fTUVNX1JUX1NJWkUgNDE2Ci0jZGVmaW5lIFRNX1JFR19DT05GSUdfVEFTS19NRU1fUlRfT0ZGU0VUIDI5MTMwCi0jZGVmaW5lIFRNX1JFR19DT05GSUdfVEFTS19NRU1fUlRfU0laRSA1MTIKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRV8wX1JUX09GRlNFVCAyOTY0MgotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFXzFfUlRfT0ZGU0VUIDI5NjQzCi0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVfMl9SVF9PRkZTRVQgMjk2NDQKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzBfUlRfT0ZGU0VUIDI5NjQ1Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8xX1JUX09GRlNFVCAyOTY0NgotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMl9SVF9PRkZTRVQgMjk2NDcKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzNfUlRfT0ZGU0VUIDI5NjQ4Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF80X1JUX09GRlNFVCAyOTY0OQotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNV9SVF9PRkZTRVQgMjk2NTAKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzZfUlRfT0ZGU0VUIDI5NjUxCi0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF83X1JUX09GRlNFVCAyOTY1MgotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfOF9SVF9PRkZTRVQgMjk2NTMKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzlfUlRfT0ZGU0VUIDI5NjU0Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8xMF9SVF9PRkZTRVQgMjk2NTUKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzExX1JUX09GRlNFVCAyOTY1NgotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMTJfUlRfT0ZGU0VUIDI5NjU3Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8xM19SVF9PRkZTRVQgMjk2NTgKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzE0X1JUX09GRlNFVCAyOTY1OQotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMTVfUlRfT0ZGU0VUIDI5NjYwCi0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8xNl9SVF9PRkZTRVQgMjk2NjEKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzE3X1JUX09GRlNFVCAyOTY2MgotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMThfUlRfT0ZGU0VUIDI5NjYzCi0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8xOV9SVF9PRkZTRVQgMjk2NjQKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzIwX1JUX09GRlNFVCAyOTY2NQotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMjFfUlRfT0ZGU0VUIDI5NjY2Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8yMl9SVF9PRkZTRVQgMjk2NjcKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzIzX1JUX09GRlNFVCAyOTY2OAotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMjRfUlRfT0ZGU0VUIDI5NjY5Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8yNV9SVF9PRkZTRVQgMjk2NzAKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzI2X1JUX09GRlNFVCAyOTY3MQotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMjdfUlRfT0ZGU0VUIDI5NjcyCi0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8yOF9SVF9PRkZTRVQgMjk2NzMKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzI5X1JUX09GRlNFVCAyOTY3NAotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMzBfUlRfT0ZGU0VUIDI5Njc1Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8zMV9SVF9PRkZTRVQgMjk2NzYKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzMyX1JUX09GRlNFVCAyOTY3NwotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMzNfUlRfT0ZGU0VUIDI5Njc4Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8zNF9SVF9PRkZTRVQgMjk2NzkKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzM1X1JUX09GRlNFVCAyOTY4MAotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMzZfUlRfT0ZGU0VUIDI5NjgxCi0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8zN19SVF9PRkZTRVQgMjk2ODIKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzM4X1JUX09GRlNFVCAyOTY4MwotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMzlfUlRfT0ZGU0VUIDI5Njg0Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF80MF9SVF9PRkZTRVQgMjk2ODUKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzQxX1JUX09GRlNFVCAyOTY4NgotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNDJfUlRfT0ZGU0VUIDI5Njg3Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF80M19SVF9PRkZTRVQgMjk2ODgKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzQ0X1JUX09GRlNFVCAyOTY4OQotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNDVfUlRfT0ZGU0VUIDI5NjkwCi0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF80Nl9SVF9PRkZTRVQgMjk2OTEKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzQ3X1JUX09GRlNFVCAyOTY5MgotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNDhfUlRfT0ZGU0VUIDI5NjkzCi0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF80OV9SVF9PRkZTRVQgMjk2OTQKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzUwX1JUX09GRlNFVCAyOTY5NQotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNTFfUlRfT0ZGU0VUIDI5Njk2Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF81Ml9SVF9PRkZTRVQgMjk2OTcKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzUzX1JUX09GRlNFVCAyOTY5OAotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNTRfUlRfT0ZGU0VUIDI5Njk5Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF81NV9SVF9PRkZTRVQgMjk3MDAKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzU2X1JUX09GRlNFVCAyOTcwMQotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNTdfUlRfT0ZGU0VUIDI5NzAyCi0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF81OF9SVF9PRkZTRVQgMjk3MDMKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzU5X1JUX09GRlNFVCAyOTcwNAotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNjBfUlRfT0ZGU0VUIDI5NzA1Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF82MV9SVF9PRkZTRVQgMjk3MDYKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzYyX1JUX09GRlNFVCAyOTcwNwotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNjNfUlRfT0ZGU0VUIDI5NzA4Ci0jZGVmaW5lIFFNX1JFR19CQVNFQUREUk9USEVSUFFfUlRfT0ZGU0VUIDI5NzA5Ci0jZGVmaW5lIFFNX1JFR19CQVNFQUREUk9USEVSUFFfUlRfU0laRSAxMjgKLSNkZWZpbmUgUU1fUkVHX1ZPUUNSRExJTkVfUlRfT0ZGU0VUIDI5ODM3Ci0jZGVmaW5lIFFNX1JFR19WT1FDUkRMSU5FX1JUX1NJWkUgMjAKLSNkZWZpbmUgUU1fUkVHX1ZPUUlOSVRDUkRMSU5FX1JUX09GRlNFVCAyOTg1NwotI2RlZmluZSBRTV9SRUdfVk9RSU5JVENSRExJTkVfUlRfU0laRSAyMAotI2RlZmluZSBRTV9SRUdfQUZVTExRTUJZUFRIUlBGV0ZRX1JUX09GRlNFVCAyOTg3NwotI2RlZmluZSBRTV9SRUdfQUZVTExRTUJZUFRIUlZQV0ZRX1JUX09GRlNFVCAyOTg3OAotI2RlZmluZSBRTV9SRUdfQUZVTExRTUJZUFRIUlBGUkxfUlRfT0ZGU0VUIDI5ODc5Ci0jZGVmaW5lIFFNX1JFR19BRlVMTFFNQllQVEhSR0xCTFJMX1JUX09GRlNFVCAyOTg4MAotI2RlZmluZSBRTV9SRUdfQUZVTExPUFJUTlNUQ0NSRE1BU0tfUlRfT0ZGU0VUIDI5ODgxCi0jZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzBfUlRfT0ZGU0VUIDI5ODgyCi0jZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzFfUlRfT0ZGU0VUIDI5ODgzCi0jZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzJfUlRfT0ZGU0VUIDI5ODg0Ci0jZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzNfUlRfT0ZGU0VUIDI5ODg1Ci0jZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzRfUlRfT0ZGU0VUIDI5ODg2Ci0jZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzVfUlRfT0ZGU0VUIDI5ODg3Ci0jZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzZfUlRfT0ZGU0VUIDI5ODg4Ci0jZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzdfUlRfT0ZGU0VUIDI5ODg5Ci0jZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzhfUlRfT0ZGU0VUIDI5ODkwCi0jZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzlfUlRfT0ZGU0VUIDI5ODkxCi0jZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzEwX1JUX09GRlNFVCAyOTg5MgotI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF8xMV9SVF9PRkZTRVQgMjk4OTMKLSNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfMTJfUlRfT0ZGU0VUIDI5ODk0Ci0jZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzEzX1JUX09GRlNFVCAyOTg5NQotI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF8xNF9SVF9PRkZTRVQgMjk4OTYKLSNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfMTVfUlRfT0ZGU0VUIDI5ODk3Ci0jZGVmaW5lIFFNX1JFR19XUlJPVEhFUkdSUFdFSUdIVF8wX1JUX09GRlNFVCAyOTg5OAotI2RlZmluZSBRTV9SRUdfV1JST1RIRVJHUlBXRUlHSFRfMV9SVF9PRkZTRVQgMjk4OTkKLSNkZWZpbmUgUU1fUkVHX1dSUk9USEVSR1JQV0VJR0hUXzJfUlRfT0ZGU0VUIDI5OTAwCi0jZGVmaW5lIFFNX1JFR19XUlJPVEhFUkdSUFdFSUdIVF8zX1JUX09GRlNFVCAyOTkwMQotI2RlZmluZSBRTV9SRUdfV1JSVFhHUlBXRUlHSFRfMF9SVF9PRkZTRVQgMjk5MDIKLSNkZWZpbmUgUU1fUkVHX1dSUlRYR1JQV0VJR0hUXzFfUlRfT0ZGU0VUIDI5OTAzCi0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzBfUlRfT0ZGU0VUIDI5OTA0Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzFfUlRfT0ZGU0VUIDI5OTA1Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzJfUlRfT0ZGU0VUIDI5OTA2Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzNfUlRfT0ZGU0VUIDI5OTA3Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzRfUlRfT0ZGU0VUIDI5OTA4Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzVfUlRfT0ZGU0VUIDI5OTA5Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzZfUlRfT0ZGU0VUIDI5OTEwCi0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzdfUlRfT0ZGU0VUIDI5OTExCi0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzhfUlRfT0ZGU0VUIDI5OTEyCi0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzlfUlRfT0ZGU0VUIDI5OTEzCi0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzEwX1JUX09GRlNFVCAyOTkxNAotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8xMV9SVF9PRkZTRVQgMjk5MTUKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMTJfUlRfT0ZGU0VUIDI5OTE2Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzEzX1JUX09GRlNFVCAyOTkxNwotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8xNF9SVF9PRkZTRVQgMjk5MTgKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMTVfUlRfT0ZGU0VUIDI5OTE5Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzE2X1JUX09GRlNFVCAyOTkyMAotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8xN19SVF9PRkZTRVQgMjk5MjEKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMThfUlRfT0ZGU0VUIDI5OTIyCi0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzE5X1JUX09GRlNFVCAyOTkyMwotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8yMF9SVF9PRkZTRVQgMjk5MjQKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMjFfUlRfT0ZGU0VUIDI5OTI1Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzIyX1JUX09GRlNFVCAyOTkyNgotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8yM19SVF9PRkZTRVQgMjk5MjcKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMjRfUlRfT0ZGU0VUIDI5OTI4Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzI1X1JUX09GRlNFVCAyOTkyOQotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8yNl9SVF9PRkZTRVQgMjk5MzAKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMjdfUlRfT0ZGU0VUIDI5OTMxCi0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzI4X1JUX09GRlNFVCAyOTkzMgotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8yOV9SVF9PRkZTRVQgMjk5MzMKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMzBfUlRfT0ZGU0VUIDI5OTM0Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzMxX1JUX09GRlNFVCAyOTkzNQotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8zMl9SVF9PRkZTRVQgMjk5MzYKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMzNfUlRfT0ZGU0VUIDI5OTM3Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzM0X1JUX09GRlNFVCAyOTkzOAotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8zNV9SVF9PRkZTRVQgMjk5MzkKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMzZfUlRfT0ZGU0VUIDI5OTQwCi0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzM3X1JUX09GRlNFVCAyOTk0MQotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8zOF9SVF9PRkZTRVQgMjk5NDIKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMzlfUlRfT0ZGU0VUIDI5OTQzCi0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzQwX1JUX09GRlNFVCAyOTk0NAotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl80MV9SVF9PRkZTRVQgMjk5NDUKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNDJfUlRfT0ZGU0VUIDI5OTQ2Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzQzX1JUX09GRlNFVCAyOTk0NwotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl80NF9SVF9PRkZTRVQgMjk5NDgKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNDVfUlRfT0ZGU0VUIDI5OTQ5Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzQ2X1JUX09GRlNFVCAyOTk1MAotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl80N19SVF9PRkZTRVQgMjk5NTEKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNDhfUlRfT0ZGU0VUIDI5OTUyCi0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzQ5X1JUX09GRlNFVCAyOTk1MwotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl81MF9SVF9PRkZTRVQgMjk5NTQKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNTFfUlRfT0ZGU0VUIDI5OTU1Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzUyX1JUX09GRlNFVCAyOTk1NgotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl81M19SVF9PRkZTRVQgMjk5NTcKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNTRfUlRfT0ZGU0VUIDI5OTU4Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzU1X1JUX09GRlNFVCAyOTk1OQotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl81Nl9SVF9PRkZTRVQgMjk5NjAKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNTdfUlRfT0ZGU0VUIDI5OTYxCi0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzU4X1JUX09GRlNFVCAyOTk2MgotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl81OV9SVF9PRkZTRVQgMjk5NjMKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNjBfUlRfT0ZGU0VUIDI5OTY0Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzYxX1JUX09GRlNFVCAyOTk2NQotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl82Ml9SVF9PRkZTRVQgMjk5NjYKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNjNfUlRfT0ZGU0VUIDI5OTY3Ci0jZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzBfUlRfT0ZGU0VUIDI5OTY4Ci0jZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzFfUlRfT0ZGU0VUIDI5OTY5Ci0jZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzJfUlRfT0ZGU0VUIDI5OTcwCi0jZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzNfUlRfT0ZGU0VUIDI5OTcxCi0jZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzRfUlRfT0ZGU0VUIDI5OTcyCi0jZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzVfUlRfT0ZGU0VUIDI5OTczCi0jZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzZfUlRfT0ZGU0VUIDI5OTc0Ci0jZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzdfUlRfT0ZGU0VUIDI5OTc1Ci0jZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzhfUlRfT0ZGU0VUIDI5OTc2Ci0jZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzlfUlRfT0ZGU0VUIDI5OTc3Ci0jZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzEwX1JUX09GRlNFVCAyOTk3OAotI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl8xMV9SVF9PRkZTRVQgMjk5NzkKLSNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfMTJfUlRfT0ZGU0VUIDI5OTgwCi0jZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzEzX1JUX09GRlNFVCAyOTk4MQotI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl8xNF9SVF9PRkZTRVQgMjk5ODIKLSNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfMTVfUlRfT0ZGU0VUIDI5OTgzCi0jZGVmaW5lIFFNX1JFR19STEdMQkxQRVJJT0RfMF9SVF9PRkZTRVQgMjk5ODQKLSNkZWZpbmUgUU1fUkVHX1JMR0xCTFBFUklPRF8xX1JUX09GRlNFVCAyOTk4NQotI2RlZmluZSBRTV9SRUdfUkxHTEJMUEVSSU9EVElNRVJfMF9SVF9PRkZTRVQgMjk5ODYKLSNkZWZpbmUgUU1fUkVHX1JMR0xCTFBFUklPRFRJTUVSXzFfUlRfT0ZGU0VUIDI5OTg3Ci0jZGVmaW5lIFFNX1JFR19STEdMQkxQRVJJT0RTRUxfMF9SVF9PRkZTRVQgMjk5ODgKLSNkZWZpbmUgUU1fUkVHX1JMR0xCTFBFUklPRFNFTF8xX1JUX09GRlNFVCAyOTk4OQotI2RlZmluZSBRTV9SRUdfUkxHTEJMUEVSSU9EU0VMXzJfUlRfT0ZGU0VUIDI5OTkwCi0jZGVmaW5lIFFNX1JFR19STEdMQkxQRVJJT0RTRUxfM19SVF9PRkZTRVQgMjk5OTEKLSNkZWZpbmUgUU1fUkVHX1JMR0xCTFBFUklPRFNFTF80X1JUX09GRlNFVCAyOTk5MgotI2RlZmluZSBRTV9SRUdfUkxHTEJMUEVSSU9EU0VMXzVfUlRfT0ZGU0VUIDI5OTkzCi0jZGVmaW5lIFFNX1JFR19STEdMQkxQRVJJT0RTRUxfNl9SVF9PRkZTRVQgMjk5OTQKLSNkZWZpbmUgUU1fUkVHX1JMR0xCTFBFUklPRFNFTF83X1JUX09GRlNFVCAyOTk5NQotI2RlZmluZSBRTV9SRUdfUkxHTEJMSU5DVkFMX1JUX09GRlNFVCAyOTk5NgotI2RlZmluZSBRTV9SRUdfUkxHTEJMSU5DVkFMX1JUX1NJWkUgMjU2Ci0jZGVmaW5lIFFNX1JFR19STEdMQkxVUFBFUkJPVU5EX1JUX09GRlNFVCAzMDI1MgotI2RlZmluZSBRTV9SRUdfUkxHTEJMVVBQRVJCT1VORF9SVF9TSVpFIDI1NgotI2RlZmluZSBRTV9SRUdfUkxHTEJMQ1JEX1JUX09GRlNFVCAzMDUwOAotI2RlZmluZSBRTV9SRUdfUkxHTEJMQ1JEX1JUX1NJWkUgMjU2Ci0jZGVmaW5lIFFNX1JFR19STEdMQkxFTkFCTEVfUlRfT0ZGU0VUIDMwNzY0Ci0jZGVmaW5lIFFNX1JFR19STFBGUEVSSU9EX1JUX09GRlNFVCAzMDc2NQotI2RlZmluZSBRTV9SRUdfUkxQRlBFUklPRFRJTUVSX1JUX09GRlNFVCAzMDc2NgotI2RlZmluZSBRTV9SRUdfUkxQRklOQ1ZBTF9SVF9PRkZTRVQgMzA3NjcKLSNkZWZpbmUgUU1fUkVHX1JMUEZJTkNWQUxfUlRfU0laRSAxNgotI2RlZmluZSBRTV9SRUdfUkxQRlVQUEVSQk9VTkRfUlRfT0ZGU0VUIDMwNzgzCi0jZGVmaW5lIFFNX1JFR19STFBGVVBQRVJCT1VORF9SVF9TSVpFIDE2Ci0jZGVmaW5lIFFNX1JFR19STFBGQ1JEX1JUX09GRlNFVCAzMDc5OQotI2RlZmluZSBRTV9SRUdfUkxQRkNSRF9SVF9TSVpFIDE2Ci0jZGVmaW5lIFFNX1JFR19STFBGRU5BQkxFX1JUX09GRlNFVCAzMDgxNQotI2RlZmluZSBRTV9SRUdfUkxQRlZPUUVOQUJMRV9SVF9PRkZTRVQgMzA4MTYKLSNkZWZpbmUgUU1fUkVHX1dGUVBGV0VJR0hUX1JUX09GRlNFVCAzMDgxNwotI2RlZmluZSBRTV9SRUdfV0ZRUEZXRUlHSFRfUlRfU0laRSAxNgotI2RlZmluZSBRTV9SRUdfV0ZRUEZVUFBFUkJPVU5EX1JUX09GRlNFVCAzMDgzMwotI2RlZmluZSBRTV9SRUdfV0ZRUEZVUFBFUkJPVU5EX1JUX1NJWkUgMTYKLSNkZWZpbmUgUU1fUkVHX1dGUVBGQ1JEX1JUX09GRlNFVCAzMDg0OQotI2RlZmluZSBRTV9SRUdfV0ZRUEZDUkRfUlRfU0laRSAxNjAKLSNkZWZpbmUgUU1fUkVHX1dGUVBGRU5BQkxFX1JUX09GRlNFVCAzMTAwOQotI2RlZmluZSBRTV9SRUdfV0ZRVlBFTkFCTEVfUlRfT0ZGU0VUIDMxMDEwCi0jZGVmaW5lIFFNX1JFR19CQVNFQUREUlRYUFFfUlRfT0ZGU0VUIDMxMDExCi0jZGVmaW5lIFFNX1JFR19CQVNFQUREUlRYUFFfUlRfU0laRSA1MTIKLSNkZWZpbmUgUU1fUkVHX1RYUFFNQVBfUlRfT0ZGU0VUIDMxNTIzCi0jZGVmaW5lIFFNX1JFR19UWFBRTUFQX1JUX1NJWkUgNTEyCi0jZGVmaW5lIFFNX1JFR19XRlFWUFdFSUdIVF9SVF9PRkZTRVQgMzIwMzUKLSNkZWZpbmUgUU1fUkVHX1dGUVZQV0VJR0hUX1JUX1NJWkUgNTEyCi0jZGVmaW5lIFFNX1JFR19XRlFWUENSRF9SVF9PRkZTRVQgMzI1NDcKLSNkZWZpbmUgUU1fUkVHX1dGUVZQQ1JEX1JUX1NJWkUgNTEyCi0jZGVmaW5lIFFNX1JFR19XRlFWUE1BUF9SVF9PRkZTRVQgMzMwNTkKLSNkZWZpbmUgUU1fUkVHX1dGUVZQTUFQX1JUX1NJWkUgNTEyCi0jZGVmaW5lIFFNX1JFR19XRlFQRkNSRF9NU0JfUlRfT0ZGU0VUIDMzNTcxCi0jZGVmaW5lIFFNX1JFR19XRlFQRkNSRF9NU0JfUlRfU0laRSAxNjAKLSNkZWZpbmUgTklHX1JFR19UQUdfRVRIRVJUWVBFXzBfUlRfT0ZGU0VUIDMzNzMxCi0jZGVmaW5lIE5JR19SRUdfT1VURVJfVEFHX1ZBTFVFX0xJU1QwX1JUX09GRlNFVCAzMzczMgotI2RlZmluZSBOSUdfUkVHX09VVEVSX1RBR19WQUxVRV9MSVNUMV9SVF9PRkZTRVQgMzM3MzMKLSNkZWZpbmUgTklHX1JFR19PVVRFUl9UQUdfVkFMVUVfTElTVDJfUlRfT0ZGU0VUIDMzNzM0Ci0jZGVmaW5lIE5JR19SRUdfT1VURVJfVEFHX1ZBTFVFX0xJU1QzX1JUX09GRlNFVCAzMzczNQotI2RlZmluZSBOSUdfUkVHX09VVEVSX1RBR19WQUxVRV9NQVNLX1JUX09GRlNFVCAzMzczNgotI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX1RBR01BQ19DTFNfVFlQRV9SVF9PRkZTRVQgMzM3MzcKLSNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19UQUdfRU5fUlRfT0ZGU0VUIDMzNzM4Ci0jZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfVEFHX0VOX1JUX1NJWkUgNAotI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX1RBR19IRFJfU0VMX1JUX09GRlNFVCAzMzc0MgotI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX1RBR19IRFJfU0VMX1JUX1NJWkUgNAotI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX1RBR19WQUxVRV9SVF9PRkZTRVQgMzM3NDYKLSNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19UQUdfVkFMVUVfUlRfU0laRSA0Ci0jZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfTk9fVEFHX1JUX09GRlNFVCAzMzc1MAotI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9WQUxVRV9SVF9PRkZTRVQgMzM3NTEKLSNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfVkFMVUVfUlRfU0laRSAzMgotI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9FTl9SVF9PRkZTRVQgMzM3ODMKLSNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfRU5fUlRfU0laRSAxNgotI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9NT0RFX1JUX09GRlNFVCAzMzc5OQotI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9NT0RFX1JUX1NJWkUgMTYKLSNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfUFJPVE9DT0xfVFlQRV9SVF9PRkZTRVQgMzM4MTUKLSNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfUFJPVE9DT0xfVFlQRV9SVF9TSVpFIDE2Ci0jZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX0hEUl9TRUxfUlRfT0ZGU0VUIDMzODMxCi0jZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX0hEUl9TRUxfUlRfU0laRSAxNgotI2RlZmluZSBOSUdfUkVHX1RYX0VEUE1fQ1RSTF9SVF9PRkZTRVQgMzM4NDcKLSNkZWZpbmUgTklHX1JFR19ST0NFX0RVUExJQ0FURV9UT19IT1NUX1JUX09GRlNFVCAzMzg0OAotI2RlZmluZSBDRFVfUkVHX0NJRF9BRERSX1BBUkFNU19SVF9PRkZTRVQgMzM4NDkKLSNkZWZpbmUgQ0RVX1JFR19TRUdNRU5UMF9QQVJBTVNfUlRfT0ZGU0VUIDMzODUwCi0jZGVmaW5lIENEVV9SRUdfU0VHTUVOVDFfUEFSQU1TX1JUX09GRlNFVCAzMzg1MQotI2RlZmluZSBDRFVfUkVHX1BGX1NFRzBfVFlQRV9PRkZTRVRfUlRfT0ZGU0VUIDMzODUyCi0jZGVmaW5lIENEVV9SRUdfUEZfU0VHMV9UWVBFX09GRlNFVF9SVF9PRkZTRVQgMzM4NTMKLSNkZWZpbmUgQ0RVX1JFR19QRl9TRUcyX1RZUEVfT0ZGU0VUX1JUX09GRlNFVCAzMzg1NAotI2RlZmluZSBDRFVfUkVHX1BGX1NFRzNfVFlQRV9PRkZTRVRfUlRfT0ZGU0VUIDMzODU1Ci0jZGVmaW5lIENEVV9SRUdfUEZfRkxfU0VHMF9UWVBFX09GRlNFVF9SVF9PRkZTRVQgMzM4NTYKLSNkZWZpbmUgQ0RVX1JFR19QRl9GTF9TRUcxX1RZUEVfT0ZGU0VUX1JUX09GRlNFVCAzMzg1NwotI2RlZmluZSBDRFVfUkVHX1BGX0ZMX1NFRzJfVFlQRV9PRkZTRVRfUlRfT0ZGU0VUIDMzODU4Ci0jZGVmaW5lIENEVV9SRUdfUEZfRkxfU0VHM19UWVBFX09GRlNFVF9SVF9PRkZTRVQgMzM4NTkKLSNkZWZpbmUgQ0RVX1JFR19WRl9TRUdfVFlQRV9PRkZTRVRfUlRfT0ZGU0VUIDMzODYwCi0jZGVmaW5lIENEVV9SRUdfVkZfRkxfU0VHX1RZUEVfT0ZGU0VUX1JUX09GRlNFVCAzMzg2MQotI2RlZmluZSBQQkZfUkVHX1RBR19FVEhFUlRZUEVfMF9SVF9PRkZTRVQgMzM4NjIKLSNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0laRV9SVF9PRkZTRVQgMzM4NjMKLSNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1EwX1JUX09GRlNFVCAzMzg2NAotI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTBfUlRfT0ZGU0VUIDMzODY1Ci0jZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTBfUlRfT0ZGU0VUIDMzODY2Ci0jZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RMV9SVF9PRkZTRVQgMzM4NjcKLSNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1ExX1JUX09GRlNFVCAzMzg2OAotI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1ExX1JUX09GRlNFVCAzMzg2OQotI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTJfUlRfT0ZGU0VUIDMzODcwCi0jZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RMl9SVF9PRkZTRVQgMzM4NzEKLSNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RMl9SVF9PRkZTRVQgMzM4NzIKLSNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1EzX1JUX09GRlNFVCAzMzg3MwotI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTNfUlRfT0ZGU0VUIDMzODc0Ci0jZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTNfUlRfT0ZGU0VUIDMzODc1Ci0jZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RNF9SVF9PRkZTRVQgMzM4NzYKLSNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1E0X1JUX09GRlNFVCAzMzg3NwotI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1E0X1JUX09GRlNFVCAzMzg3OAotI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTVfUlRfT0ZGU0VUIDMzODc5Ci0jZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RNV9SVF9PRkZTRVQgMzM4ODAKLSNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RNV9SVF9PRkZTRVQgMzM4ODEKLSNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1E2X1JUX09GRlNFVCAzMzg4MgotI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTZfUlRfT0ZGU0VUIDMzODgzCi0jZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTZfUlRfT0ZGU0VUIDMzODg0Ci0jZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RN19SVF9PRkZTRVQgMzM4ODUKLSNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1E3X1JUX09GRlNFVCAzMzg4NgotI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1E3X1JUX09GRlNFVCAzMzg4NwotI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUThfUlRfT0ZGU0VUIDMzODg4Ci0jZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9ROF9SVF9PRkZTRVQgMzM4ODkKLSNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9ROF9SVF9PRkZTRVQgMzM4OTAKLSNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1E5X1JUX09GRlNFVCAzMzg5MQotI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTlfUlRfT0ZGU0VUIDMzODkyCi0jZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTlfUlRfT0ZGU0VUIDMzODkzCi0jZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RMTBfUlRfT0ZGU0VUIDMzODk0Ci0jZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RMTBfUlRfT0ZGU0VUIDMzODk1Ci0jZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTEwX1JUX09GRlNFVCAzMzg5NgotI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTExX1JUX09GRlNFVCAzMzg5NwotI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTExX1JUX09GRlNFVCAzMzg5OAotI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1ExMV9SVF9PRkZTRVQgMzM4OTkKLSNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1ExMl9SVF9PRkZTRVQgMzM5MDAKLSNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1ExMl9SVF9PRkZTRVQgMzM5MDEKLSNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RMTJfUlRfT0ZGU0VUIDMzOTAyCi0jZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RMTNfUlRfT0ZGU0VUIDMzOTAzCi0jZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RMTNfUlRfT0ZGU0VUIDMzOTA0Ci0jZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTEzX1JUX09GRlNFVCAzMzkwNQotI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTE0X1JUX09GRlNFVCAzMzkwNgotI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTE0X1JUX09GRlNFVCAzMzkwNwotI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1ExNF9SVF9PRkZTRVQgMzM5MDgKLSNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1ExNV9SVF9PRkZTRVQgMzM5MDkKLSNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1ExNV9SVF9PRkZTRVQgMzM5MTAKLSNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RMTVfUlRfT0ZGU0VUIDMzOTExCi0jZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RMTZfUlRfT0ZGU0VUIDMzOTEyCi0jZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RMTZfUlRfT0ZGU0VUIDMzOTEzCi0jZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTE2X1JUX09GRlNFVCAzMzkxNAotI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTE3X1JUX09GRlNFVCAzMzkxNQotI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTE3X1JUX09GRlNFVCAzMzkxNgotI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1ExN19SVF9PRkZTRVQgMzM5MTcKLSNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1ExOF9SVF9PRkZTRVQgMzM5MTgKLSNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1ExOF9SVF9PRkZTRVQgMzM5MTkKLSNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RMThfUlRfT0ZGU0VUIDMzOTIwCi0jZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RMTlfUlRfT0ZGU0VUIDMzOTIxCi0jZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RMTlfUlRfT0ZGU0VUIDMzOTIyCi0jZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTE5X1JUX09GRlNFVCAzMzkyMwotI2RlZmluZSBYQ01fUkVHX0NPTl9QSFlfUTNfUlRfT0ZGU0VUIDMzOTI0CisjZGVmaW5lIERPUlFfUkVHX1BGX01BWF9JQ0lEXzBfUlRfT0ZGU0VUCTAKKyNkZWZpbmUgRE9SUV9SRUdfUEZfTUFYX0lDSURfMV9SVF9PRkZTRVQJMQorI2RlZmluZSBET1JRX1JFR19QRl9NQVhfSUNJRF8yX1JUX09GRlNFVAkyCisjZGVmaW5lIERPUlFfUkVHX1BGX01BWF9JQ0lEXzNfUlRfT0ZGU0VUCTMKKyNkZWZpbmUgRE9SUV9SRUdfUEZfTUFYX0lDSURfNF9SVF9PRkZTRVQJNAorI2RlZmluZSBET1JRX1JFR19QRl9NQVhfSUNJRF81X1JUX09GRlNFVAk1CisjZGVmaW5lIERPUlFfUkVHX1BGX01BWF9JQ0lEXzZfUlRfT0ZGU0VUCTYKKyNkZWZpbmUgRE9SUV9SRUdfUEZfTUFYX0lDSURfN19SVF9PRkZTRVQJNworI2RlZmluZSBET1JRX1JFR19WRl9NQVhfSUNJRF8wX1JUX09GRlNFVAk4CisjZGVmaW5lIERPUlFfUkVHX1ZGX01BWF9JQ0lEXzFfUlRfT0ZGU0VUCTkKKyNkZWZpbmUgRE9SUV9SRUdfVkZfTUFYX0lDSURfMl9SVF9PRkZTRVQJMTAKKyNkZWZpbmUgRE9SUV9SRUdfVkZfTUFYX0lDSURfM19SVF9PRkZTRVQJMTEKKyNkZWZpbmUgRE9SUV9SRUdfVkZfTUFYX0lDSURfNF9SVF9PRkZTRVQJMTIKKyNkZWZpbmUgRE9SUV9SRUdfVkZfTUFYX0lDSURfNV9SVF9PRkZTRVQJMTMKKyNkZWZpbmUgRE9SUV9SRUdfVkZfTUFYX0lDSURfNl9SVF9PRkZTRVQJMTQKKyNkZWZpbmUgRE9SUV9SRUdfVkZfTUFYX0lDSURfN19SVF9PRkZTRVQJMTUKKyNkZWZpbmUgRE9SUV9SRUdfUEZfV0FLRV9BTExfUlRfT0ZGU0VUCTE2CisjZGVmaW5lIERPUlFfUkVHX1RBRzFfRVRIRVJUWVBFX1JUX09GRlNFVAkxNworI2RlZmluZSBJR1VfUkVHX1BGX0NPTkZJR1VSQVRJT05fUlRfT0ZGU0VUCTE4CisjZGVmaW5lIElHVV9SRUdfVkZfQ09ORklHVVJBVElPTl9SVF9PRkZTRVQJMTkKKyNkZWZpbmUgSUdVX1JFR19BVFROX01TR19BRERSX0xfUlRfT0ZGU0VUCTIwCisjZGVmaW5lIElHVV9SRUdfQVRUTl9NU0dfQUREUl9IX1JUX09GRlNFVAkyMQorI2RlZmluZSBJR1VfUkVHX0xFQURJTkdfRURHRV9MQVRDSF9SVF9PRkZTRVQJMjIKKyNkZWZpbmUgSUdVX1JFR19UUkFJTElOR19FREdFX0xBVENIX1JUX09GRlNFVAkyMworI2RlZmluZSBDQVVfUkVHX0NRRV9BR0dfVU5JVF9TSVpFX1JUX09GRlNFVAkyNAorI2RlZmluZSBDQVVfUkVHX1NCX1ZBUl9NRU1PUllfUlRfT0ZGU0VUCTc2MQorI2RlZmluZSBDQVVfUkVHX1NCX1ZBUl9NRU1PUllfUlRfU0laRQk3MzYKKyNkZWZpbmUgQ0FVX1JFR19TQl9WQVJfTUVNT1JZX1JUX09GRlNFVAk3NjEKKyNkZWZpbmUgQ0FVX1JFR19TQl9WQVJfTUVNT1JZX1JUX1NJWkUJNzM2CisjZGVmaW5lIENBVV9SRUdfU0JfQUREUl9NRU1PUllfUlRfT0ZGU0VUCTE0OTcKKyNkZWZpbmUgQ0FVX1JFR19TQl9BRERSX01FTU9SWV9SVF9TSVpFCTczNgorI2RlZmluZSBDQVVfUkVHX1BJX01FTU9SWV9SVF9PRkZTRVQJMjIzMworI2RlZmluZSBDQVVfUkVHX1BJX01FTU9SWV9SVF9TSVpFCTQ0MTYKKyNkZWZpbmUgUFJTX1JFR19TRUFSQ0hfUkVTUF9JTklUSUFUT1JfVFlQRV9SVF9PRkZTRVQJNjY0OQorI2RlZmluZSBQUlNfUkVHX1RBU0tfSURfTUFYX0lOSVRJQVRPUl9QRl9SVF9PRkZTRVQJNjY1MAorI2RlZmluZSBQUlNfUkVHX1RBU0tfSURfTUFYX0lOSVRJQVRPUl9WRl9SVF9PRkZTRVQJNjY1MQorI2RlZmluZSBQUlNfUkVHX1RBU0tfSURfTUFYX1RBUkdFVF9QRl9SVF9PRkZTRVQJNjY1MgorI2RlZmluZSBQUlNfUkVHX1RBU0tfSURfTUFYX1RBUkdFVF9WRl9SVF9PRkZTRVQJNjY1MworI2RlZmluZSBQUlNfUkVHX1NFQVJDSF9UQ1BfUlRfT0ZGU0VUCTY2NTQKKyNkZWZpbmUgUFJTX1JFR19TRUFSQ0hfRkNPRV9SVF9PRkZTRVQJNjY1NQorI2RlZmluZSBQUlNfUkVHX1NFQVJDSF9ST0NFX1JUX09GRlNFVAk2NjU2CisjZGVmaW5lIFBSU19SRUdfUk9DRV9ERVNUX1FQX01BWF9WRl9SVF9PRkZTRVQJNjY1NworI2RlZmluZSBQUlNfUkVHX1JPQ0VfREVTVF9RUF9NQVhfUEZfUlRfT0ZGU0VUCTY2NTgKKyNkZWZpbmUgUFJTX1JFR19TRUFSQ0hfT1BFTkZMT1dfUlRfT0ZGU0VUCTY2NTkKKyNkZWZpbmUgUFJTX1JFR19TRUFSQ0hfTk9OX0lQX0FTX09QRU5GTE9XX1JUX09GRlNFVAk2NjYwCisjZGVmaW5lIFBSU19SRUdfT1BFTkZMT1dfU1VQUE9SVF9PTkxZX0tOT1dOX09WRVJfSVBfUlRfT0ZGU0VUCTY2NjEKKyNkZWZpbmUgUFJTX1JFR19PUEVORkxPV19TRUFSQ0hfS0VZX01BU0tfUlRfT0ZGU0VUCTY2NjIKKyNkZWZpbmUgUFJTX1JFR19UQUdfRVRIRVJUWVBFXzBfUlRfT0ZGU0VUCTY2NjMKKyNkZWZpbmUgUFJTX1JFR19MSUdIVF9MMl9FVEhFUlRZUEVfRU5fUlRfT0ZGU0VUCTY2NjQKKyNkZWZpbmUgU1JDX1JFR19GSVJTVEZSRUVfUlRfT0ZGU0VUCTY2NjUKKyNkZWZpbmUgU1JDX1JFR19GSVJTVEZSRUVfUlRfU0laRQkyCisjZGVmaW5lIFNSQ19SRUdfTEFTVEZSRUVfUlRfT0ZGU0VUCTY2NjcKKyNkZWZpbmUgU1JDX1JFR19MQVNURlJFRV9SVF9TSVpFCTIKKyNkZWZpbmUgU1JDX1JFR19DT1VOVEZSRUVfUlRfT0ZGU0VUCTY2NjkKKyNkZWZpbmUgU1JDX1JFR19OVU1CRVJfSEFTSF9CSVRTX1JUX09GRlNFVAk2NjcwCisjZGVmaW5lIFBTV1JRMl9SRUdfQ0RVVF9QX1NJWkVfUlRfT0ZGU0VUCTY2NzEKKyNkZWZpbmUgUFNXUlEyX1JFR19DRFVDX1BfU0laRV9SVF9PRkZTRVQJNjY3MgorI2RlZmluZSBQU1dSUTJfUkVHX1RNX1BfU0laRV9SVF9PRkZTRVQJNjY3MworI2RlZmluZSBQU1dSUTJfUkVHX1FNX1BfU0laRV9SVF9PRkZTRVQJNjY3NAorI2RlZmluZSBQU1dSUTJfUkVHX1NSQ19QX1NJWkVfUlRfT0ZGU0VUCTY2NzUKKyNkZWZpbmUgUFNXUlEyX1JFR19UU0RNX1BfU0laRV9SVF9PRkZTRVQJNjY3NgorI2RlZmluZSBQU1dSUTJfUkVHX1RNX0ZJUlNUX0lMVF9SVF9PRkZTRVQJNjY3NworI2RlZmluZSBQU1dSUTJfUkVHX1RNX0xBU1RfSUxUX1JUX09GRlNFVAk2Njc4CisjZGVmaW5lIFBTV1JRMl9SRUdfUU1fRklSU1RfSUxUX1JUX09GRlNFVAk2Njc5CisjZGVmaW5lIFBTV1JRMl9SRUdfUU1fTEFTVF9JTFRfUlRfT0ZGU0VUCTY2ODAKKyNkZWZpbmUgUFNXUlEyX1JFR19TUkNfRklSU1RfSUxUX1JUX09GRlNFVAk2NjgxCisjZGVmaW5lIFBTV1JRMl9SRUdfU1JDX0xBU1RfSUxUX1JUX09GRlNFVAk2NjgyCisjZGVmaW5lIFBTV1JRMl9SRUdfQ0RVQ19GSVJTVF9JTFRfUlRfT0ZGU0VUCTY2ODMKKyNkZWZpbmUgUFNXUlEyX1JFR19DRFVDX0xBU1RfSUxUX1JUX09GRlNFVAk2Njg0CisjZGVmaW5lIFBTV1JRMl9SRUdfQ0RVVF9GSVJTVF9JTFRfUlRfT0ZGU0VUCTY2ODUKKyNkZWZpbmUgUFNXUlEyX1JFR19DRFVUX0xBU1RfSUxUX1JUX09GRlNFVAk2Njg2CisjZGVmaW5lIFBTV1JRMl9SRUdfVFNETV9GSVJTVF9JTFRfUlRfT0ZGU0VUCTY2ODcKKyNkZWZpbmUgUFNXUlEyX1JFR19UU0RNX0xBU1RfSUxUX1JUX09GRlNFVAk2Njg4CisjZGVmaW5lIFBTV1JRMl9SRUdfVE1fTlVNQkVSX09GX1BGX0JMT0NLU19SVF9PRkZTRVQJNjY4OQorI2RlZmluZSBQU1dSUTJfUkVHX0NEVVRfTlVNQkVSX09GX1BGX0JMT0NLU19SVF9PRkZTRVQJNjY5MAorI2RlZmluZSBQU1dSUTJfUkVHX0NEVUNfTlVNQkVSX09GX1BGX0JMT0NLU19SVF9PRkZTRVQJNjY5MQorI2RlZmluZSBQU1dSUTJfUkVHX1RNX1ZGX0JMT0NLU19SVF9PRkZTRVQJNjY5MgorI2RlZmluZSBQU1dSUTJfUkVHX0NEVVRfVkZfQkxPQ0tTX1JUX09GRlNFVAk2NjkzCisjZGVmaW5lIFBTV1JRMl9SRUdfQ0RVQ19WRl9CTE9DS1NfUlRfT0ZGU0VUCTY2OTQKKyNkZWZpbmUgUFNXUlEyX1JFR19UTV9CTE9DS1NfRkFDVE9SX1JUX09GRlNFVAk2Njk1CisjZGVmaW5lIFBTV1JRMl9SRUdfQ0RVVF9CTE9DS1NfRkFDVE9SX1JUX09GRlNFVAk2Njk2CisjZGVmaW5lIFBTV1JRMl9SRUdfQ0RVQ19CTE9DS1NfRkFDVE9SX1JUX09GRlNFVAk2Njk3CisjZGVmaW5lIFBTV1JRMl9SRUdfVkZfQkFTRV9SVF9PRkZTRVQJNjY5OAorI2RlZmluZSBQU1dSUTJfUkVHX1ZGX0xBU1RfSUxUX1JUX09GRlNFVAk2Njk5CisjZGVmaW5lIFBTV1JRMl9SRUdfV1JfTUJTMF9SVF9PRkZTRVQJNjcwMAorI2RlZmluZSBQU1dSUTJfUkVHX1JEX01CUzBfUlRfT0ZGU0VUCTY3MDEKKyNkZWZpbmUgUFNXUlEyX1JFR19EUkFNX0FMSUdOX1dSX1JUX09GRlNFVAk2NzAyCisjZGVmaW5lIFBTV1JRMl9SRUdfRFJBTV9BTElHTl9SRF9SVF9PRkZTRVQJNjcwMworI2RlZmluZSBQU1dSUTJfUkVHX0lMVF9NRU1PUllfUlRfT0ZGU0VUCTY3MDQKKyNkZWZpbmUgUFNXUlEyX1JFR19JTFRfTUVNT1JZX1JUX1NJWkUJMjIwMDAKKyNkZWZpbmUgUEdMVUVfUkVHX0JfVkZfQkFTRV9SVF9PRkZTRVQJMjg3MDQKKyNkZWZpbmUgUEdMVUVfUkVHX0JfTVNETV9PRkZTRVRfTUFTS19CX1JUX09GRlNFVAkyODcwNQorI2RlZmluZSBQR0xVRV9SRUdfQl9NU0RNX1ZGX1NISUZUX0JfUlRfT0ZGU0VUCTI4NzA2CisjZGVmaW5lIFBHTFVFX1JFR19CX0NBQ0hFX0xJTkVfU0laRV9SVF9PRkZTRVQJMjg3MDcKKyNkZWZpbmUgUEdMVUVfUkVHX0JfUEZfQkFSMF9TSVpFX1JUX09GRlNFVAkyODcwOAorI2RlZmluZSBQR0xVRV9SRUdfQl9QRl9CQVIxX1NJWkVfUlRfT0ZGU0VUCTI4NzA5CisjZGVmaW5lIFBHTFVFX1JFR19CX1ZGX0JBUjFfU0laRV9SVF9PRkZTRVQJMjg3MTAKKyNkZWZpbmUgVE1fUkVHX1ZGX0VOQUJMRV9DT05OX1JUX09GRlNFVAkyODcxMQorI2RlZmluZSBUTV9SRUdfUEZfRU5BQkxFX0NPTk5fUlRfT0ZGU0VUCTI4NzEyCisjZGVmaW5lIFRNX1JFR19QRl9FTkFCTEVfVEFTS19SVF9PRkZTRVQJMjg3MTMKKyNkZWZpbmUgVE1fUkVHX0dST1VQX1NJWkVfUkVTT0xVVElPTl9DT05OX1JUX09GRlNFVAkyODcxNAorI2RlZmluZSBUTV9SRUdfR1JPVVBfU0laRV9SRVNPTFVUSU9OX1RBU0tfUlRfT0ZGU0VUCTI4NzE1CisjZGVmaW5lIFRNX1JFR19DT05GSUdfQ09OTl9NRU1fUlRfT0ZGU0VUCTI4NzE2CisjZGVmaW5lIFRNX1JFR19DT05GSUdfQ09OTl9NRU1fUlRfU0laRQk0MTYKKyNkZWZpbmUgVE1fUkVHX0NPTkZJR19UQVNLX01FTV9SVF9PRkZTRVQJMjkxMzIKKyNkZWZpbmUgVE1fUkVHX0NPTkZJR19UQVNLX01FTV9SVF9TSVpFCTUxMgorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFXzBfUlRfT0ZGU0VUCTI5NjQ0CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVfMV9SVF9PRkZTRVQJMjk2NDUKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRV8yX1JUX09GRlNFVAkyOTY0NgorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMF9SVF9PRkZTRVQJMjk2NDcKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzFfUlRfT0ZGU0VUCTI5NjQ4CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8yX1JUX09GRlNFVAkyOTY0OQorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfM19SVF9PRkZTRVQJMjk2NTAKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzRfUlRfT0ZGU0VUCTI5NjUxCisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF81X1JUX09GRlNFVAkyOTY1MgorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNl9SVF9PRkZTRVQJMjk2NTMKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzdfUlRfT0ZGU0VUCTI5NjU0CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF84X1JUX09GRlNFVAkyOTY1NQorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfOV9SVF9PRkZTRVQJMjk2NTYKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzEwX1JUX09GRlNFVAkyOTY1NworI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMTFfUlRfT0ZGU0VUCTI5NjU4CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8xMl9SVF9PRkZTRVQJMjk2NTkKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzEzX1JUX09GRlNFVAkyOTY2MAorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMTRfUlRfT0ZGU0VUCTI5NjYxCisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8xNV9SVF9PRkZTRVQJMjk2NjIKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzE2X1JUX09GRlNFVAkyOTY2MworI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMTdfUlRfT0ZGU0VUCTI5NjY0CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8xOF9SVF9PRkZTRVQJMjk2NjUKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzE5X1JUX09GRlNFVAkyOTY2NgorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMjBfUlRfT0ZGU0VUCTI5NjY3CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8yMV9SVF9PRkZTRVQJMjk2NjgKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzIyX1JUX09GRlNFVAkyOTY2OQorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMjNfUlRfT0ZGU0VUCTI5NjcwCisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8yNF9SVF9PRkZTRVQJMjk2NzEKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzI1X1JUX09GRlNFVAkyOTY3MgorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMjZfUlRfT0ZGU0VUCTI5NjczCisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8yN19SVF9PRkZTRVQJMjk2NzQKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzI4X1JUX09GRlNFVAkyOTY3NQorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMjlfUlRfT0ZGU0VUCTI5Njc2CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8zMF9SVF9PRkZTRVQJMjk2NzcKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzMxX1JUX09GRlNFVAkyOTY3OAorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMzJfUlRfT0ZGU0VUCTI5Njc5CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8zM19SVF9PRkZTRVQJMjk2ODAKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzM0X1JUX09GRlNFVAkyOTY4MQorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMzVfUlRfT0ZGU0VUCTI5NjgyCisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8zNl9SVF9PRkZTRVQJMjk2ODMKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzM3X1JUX09GRlNFVAkyOTY4NAorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMzhfUlRfT0ZGU0VUCTI5Njg1CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8zOV9SVF9PRkZTRVQJMjk2ODYKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzQwX1JUX09GRlNFVAkyOTY4NworI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNDFfUlRfT0ZGU0VUCTI5Njg4CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF80Ml9SVF9PRkZTRVQJMjk2ODkKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzQzX1JUX09GRlNFVAkyOTY5MAorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNDRfUlRfT0ZGU0VUCTI5NjkxCisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF80NV9SVF9PRkZTRVQJMjk2OTIKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzQ2X1JUX09GRlNFVAkyOTY5MworI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNDdfUlRfT0ZGU0VUCTI5Njk0CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF80OF9SVF9PRkZTRVQJMjk2OTUKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzQ5X1JUX09GRlNFVAkyOTY5NgorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNTBfUlRfT0ZGU0VUCTI5Njk3CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF81MV9SVF9PRkZTRVQJMjk2OTgKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzUyX1JUX09GRlNFVAkyOTY5OQorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNTNfUlRfT0ZGU0VUCTI5NzAwCisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF81NF9SVF9PRkZTRVQJMjk3MDEKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzU1X1JUX09GRlNFVAkyOTcwMgorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNTZfUlRfT0ZGU0VUCTI5NzAzCisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF81N19SVF9PRkZTRVQJMjk3MDQKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzU4X1JUX09GRlNFVAkyOTcwNQorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNTlfUlRfT0ZGU0VUCTI5NzA2CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF82MF9SVF9PRkZTRVQJMjk3MDcKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzYxX1JUX09GRlNFVAkyOTcwOAorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNjJfUlRfT0ZGU0VUCTI5NzA5CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF82M19SVF9PRkZTRVQJMjk3MTAKKyNkZWZpbmUgUU1fUkVHX0JBU0VBRERST1RIRVJQUV9SVF9PRkZTRVQJMjk3MTEKKyNkZWZpbmUgUU1fUkVHX0JBU0VBRERST1RIRVJQUV9SVF9TSVpFCTEyOAorI2RlZmluZSBRTV9SRUdfVk9RQ1JETElORV9SVF9PRkZTRVQJMjk4MzkKKyNkZWZpbmUgUU1fUkVHX1ZPUUNSRExJTkVfUlRfU0laRQkyMAorI2RlZmluZSBRTV9SRUdfVk9RSU5JVENSRExJTkVfUlRfT0ZGU0VUCTI5ODU5CisjZGVmaW5lIFFNX1JFR19WT1FJTklUQ1JETElORV9SVF9TSVpFCTIwCisjZGVmaW5lIFFNX1JFR19BRlVMTFFNQllQVEhSUEZXRlFfUlRfT0ZGU0VUCTI5ODc5CisjZGVmaW5lIFFNX1JFR19BRlVMTFFNQllQVEhSVlBXRlFfUlRfT0ZGU0VUCTI5ODgwCisjZGVmaW5lIFFNX1JFR19BRlVMTFFNQllQVEhSUEZSTF9SVF9PRkZTRVQJMjk4ODEKKyNkZWZpbmUgUU1fUkVHX0FGVUxMUU1CWVBUSFJHTEJMUkxfUlRfT0ZGU0VUCTI5ODgyCisjZGVmaW5lIFFNX1JFR19BRlVMTE9QUlROU1RDQ1JETUFTS19SVF9PRkZTRVQJMjk4ODMKKyNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfMF9SVF9PRkZTRVQJMjk4ODQKKyNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfMV9SVF9PRkZTRVQJMjk4ODUKKyNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfMl9SVF9PRkZTRVQJMjk4ODYKKyNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfM19SVF9PRkZTRVQJMjk4ODcKKyNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfNF9SVF9PRkZTRVQJMjk4ODgKKyNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfNV9SVF9PRkZTRVQJMjk4ODkKKyNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfNl9SVF9PRkZTRVQJMjk4OTAKKyNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfN19SVF9PRkZTRVQJMjk4OTEKKyNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfOF9SVF9PRkZTRVQJMjk4OTIKKyNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfOV9SVF9PRkZTRVQJMjk4OTMKKyNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfMTBfUlRfT0ZGU0VUCTI5ODk0CisjZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzExX1JUX09GRlNFVAkyOTg5NQorI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF8xMl9SVF9PRkZTRVQJMjk4OTYKKyNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfMTNfUlRfT0ZGU0VUCTI5ODk3CisjZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzE0X1JUX09GRlNFVAkyOTg5OAorI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF8xNV9SVF9PRkZTRVQJMjk4OTkKKyNkZWZpbmUgUU1fUkVHX1dSUk9USEVSR1JQV0VJR0hUXzBfUlRfT0ZGU0VUCTI5OTAwCisjZGVmaW5lIFFNX1JFR19XUlJPVEhFUkdSUFdFSUdIVF8xX1JUX09GRlNFVAkyOTkwMQorI2RlZmluZSBRTV9SRUdfV1JST1RIRVJHUlBXRUlHSFRfMl9SVF9PRkZTRVQJMjk5MDIKKyNkZWZpbmUgUU1fUkVHX1dSUk9USEVSR1JQV0VJR0hUXzNfUlRfT0ZGU0VUCTI5OTAzCisjZGVmaW5lIFFNX1JFR19XUlJUWEdSUFdFSUdIVF8wX1JUX09GRlNFVAkyOTkwNAorI2RlZmluZSBRTV9SRUdfV1JSVFhHUlBXRUlHSFRfMV9SVF9PRkZTRVQJMjk5MDUKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMF9SVF9PRkZTRVQJMjk5MDYKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMV9SVF9PRkZTRVQJMjk5MDcKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMl9SVF9PRkZTRVQJMjk5MDgKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfM19SVF9PRkZTRVQJMjk5MDkKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNF9SVF9PRkZTRVQJMjk5MTAKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNV9SVF9PRkZTRVQJMjk5MTEKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNl9SVF9PRkZTRVQJMjk5MTIKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfN19SVF9PRkZTRVQJMjk5MTMKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfOF9SVF9PRkZTRVQJMjk5MTQKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfOV9SVF9PRkZTRVQJMjk5MTUKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMTBfUlRfT0ZGU0VUCTI5OTE2CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzExX1JUX09GRlNFVAkyOTkxNworI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8xMl9SVF9PRkZTRVQJMjk5MTgKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMTNfUlRfT0ZGU0VUCTI5OTE5CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzE0X1JUX09GRlNFVAkyOTkyMAorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8xNV9SVF9PRkZTRVQJMjk5MjEKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMTZfUlRfT0ZGU0VUCTI5OTIyCisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzE3X1JUX09GRlNFVAkyOTkyMworI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8xOF9SVF9PRkZTRVQJMjk5MjQKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMTlfUlRfT0ZGU0VUCTI5OTI1CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzIwX1JUX09GRlNFVAkyOTkyNgorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8yMV9SVF9PRkZTRVQJMjk5MjcKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMjJfUlRfT0ZGU0VUCTI5OTI4CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzIzX1JUX09GRlNFVAkyOTkyOQorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8yNF9SVF9PRkZTRVQJMjk5MzAKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMjVfUlRfT0ZGU0VUCTI5OTMxCisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzI2X1JUX09GRlNFVAkyOTkzMgorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8yN19SVF9PRkZTRVQJMjk5MzMKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMjhfUlRfT0ZGU0VUCTI5OTM0CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzI5X1JUX09GRlNFVAkyOTkzNQorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8zMF9SVF9PRkZTRVQJMjk5MzYKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMzFfUlRfT0ZGU0VUCTI5OTM3CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzMyX1JUX09GRlNFVAkyOTkzOAorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8zM19SVF9PRkZTRVQJMjk5MzkKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMzRfUlRfT0ZGU0VUCTI5OTQwCisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzM1X1JUX09GRlNFVAkyOTk0MQorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8zNl9SVF9PRkZTRVQJMjk5NDIKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMzdfUlRfT0ZGU0VUCTI5OTQzCisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzM4X1JUX09GRlNFVAkyOTk0NAorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8zOV9SVF9PRkZTRVQJMjk5NDUKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNDBfUlRfT0ZGU0VUCTI5OTQ2CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzQxX1JUX09GRlNFVAkyOTk0NworI2RlZmluZSBRTV9SRUdfUFFUWDJQRl80Ml9SVF9PRkZTRVQJMjk5NDgKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNDNfUlRfT0ZGU0VUCTI5OTQ5CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzQ0X1JUX09GRlNFVAkyOTk1MAorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl80NV9SVF9PRkZTRVQJMjk5NTEKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNDZfUlRfT0ZGU0VUCTI5OTUyCisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzQ3X1JUX09GRlNFVAkyOTk1MworI2RlZmluZSBRTV9SRUdfUFFUWDJQRl80OF9SVF9PRkZTRVQJMjk5NTQKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNDlfUlRfT0ZGU0VUCTI5OTU1CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzUwX1JUX09GRlNFVAkyOTk1NgorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl81MV9SVF9PRkZTRVQJMjk5NTcKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNTJfUlRfT0ZGU0VUCTI5OTU4CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzUzX1JUX09GRlNFVAkyOTk1OQorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl81NF9SVF9PRkZTRVQJMjk5NjAKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNTVfUlRfT0ZGU0VUCTI5OTYxCisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzU2X1JUX09GRlNFVAkyOTk2MgorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl81N19SVF9PRkZTRVQJMjk5NjMKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNThfUlRfT0ZGU0VUCTI5OTY0CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzU5X1JUX09GRlNFVAkyOTk2NQorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl82MF9SVF9PRkZTRVQJMjk5NjYKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNjFfUlRfT0ZGU0VUCTI5OTY3CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzYyX1JUX09GRlNFVAkyOTk2OAorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl82M19SVF9PRkZTRVQJMjk5NjkKKyNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfMF9SVF9PRkZTRVQJMjk5NzAKKyNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfMV9SVF9PRkZTRVQJMjk5NzEKKyNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfMl9SVF9PRkZTRVQJMjk5NzIKKyNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfM19SVF9PRkZTRVQJMjk5NzMKKyNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfNF9SVF9PRkZTRVQJMjk5NzQKKyNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfNV9SVF9PRkZTRVQJMjk5NzUKKyNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfNl9SVF9PRkZTRVQJMjk5NzYKKyNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfN19SVF9PRkZTRVQJMjk5NzcKKyNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfOF9SVF9PRkZTRVQJMjk5NzgKKyNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfOV9SVF9PRkZTRVQJMjk5NzkKKyNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfMTBfUlRfT0ZGU0VUCTI5OTgwCisjZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzExX1JUX09GRlNFVAkyOTk4MQorI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl8xMl9SVF9PRkZTRVQJMjk5ODIKKyNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfMTNfUlRfT0ZGU0VUCTI5OTgzCisjZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzE0X1JUX09GRlNFVAkyOTk4NAorI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl8xNV9SVF9PRkZTRVQJMjk5ODUKKyNkZWZpbmUgUU1fUkVHX1JMR0xCTFBFUklPRF8wX1JUX09GRlNFVAkyOTk4NgorI2RlZmluZSBRTV9SRUdfUkxHTEJMUEVSSU9EXzFfUlRfT0ZGU0VUCTI5OTg3CisjZGVmaW5lIFFNX1JFR19STEdMQkxQRVJJT0RUSU1FUl8wX1JUX09GRlNFVAkyOTk4OAorI2RlZmluZSBRTV9SRUdfUkxHTEJMUEVSSU9EVElNRVJfMV9SVF9PRkZTRVQJMjk5ODkKKyNkZWZpbmUgUU1fUkVHX1JMR0xCTFBFUklPRFNFTF8wX1JUX09GRlNFVAkyOTk5MAorI2RlZmluZSBRTV9SRUdfUkxHTEJMUEVSSU9EU0VMXzFfUlRfT0ZGU0VUCTI5OTkxCisjZGVmaW5lIFFNX1JFR19STEdMQkxQRVJJT0RTRUxfMl9SVF9PRkZTRVQJMjk5OTIKKyNkZWZpbmUgUU1fUkVHX1JMR0xCTFBFUklPRFNFTF8zX1JUX09GRlNFVAkyOTk5MworI2RlZmluZSBRTV9SRUdfUkxHTEJMUEVSSU9EU0VMXzRfUlRfT0ZGU0VUCTI5OTk0CisjZGVmaW5lIFFNX1JFR19STEdMQkxQRVJJT0RTRUxfNV9SVF9PRkZTRVQJMjk5OTUKKyNkZWZpbmUgUU1fUkVHX1JMR0xCTFBFUklPRFNFTF82X1JUX09GRlNFVAkyOTk5NgorI2RlZmluZSBRTV9SRUdfUkxHTEJMUEVSSU9EU0VMXzdfUlRfT0ZGU0VUCTI5OTk3CisjZGVmaW5lIFFNX1JFR19STEdMQkxJTkNWQUxfUlRfT0ZGU0VUCTI5OTk4CisjZGVmaW5lIFFNX1JFR19STEdMQkxJTkNWQUxfUlRfU0laRQkyNTYKKyNkZWZpbmUgUU1fUkVHX1JMR0xCTFVQUEVSQk9VTkRfUlRfT0ZGU0VUCTMwMjU0CisjZGVmaW5lIFFNX1JFR19STEdMQkxVUFBFUkJPVU5EX1JUX1NJWkUJMjU2CisjZGVmaW5lIFFNX1JFR19STEdMQkxDUkRfUlRfT0ZGU0VUCTMwNTEwCisjZGVmaW5lIFFNX1JFR19STEdMQkxDUkRfUlRfU0laRQkyNTYKKyNkZWZpbmUgUU1fUkVHX1JMR0xCTEVOQUJMRV9SVF9PRkZTRVQJMzA3NjYKKyNkZWZpbmUgUU1fUkVHX1JMUEZQRVJJT0RfUlRfT0ZGU0VUCTMwNzY3CisjZGVmaW5lIFFNX1JFR19STFBGUEVSSU9EVElNRVJfUlRfT0ZGU0VUCTMwNzY4CisjZGVmaW5lIFFNX1JFR19STFBGSU5DVkFMX1JUX09GRlNFVAkzMDc2OQorI2RlZmluZSBRTV9SRUdfUkxQRklOQ1ZBTF9SVF9TSVpFCTE2CisjZGVmaW5lIFFNX1JFR19STFBGVVBQRVJCT1VORF9SVF9PRkZTRVQJMzA3ODUKKyNkZWZpbmUgUU1fUkVHX1JMUEZVUFBFUkJPVU5EX1JUX1NJWkUJMTYKKyNkZWZpbmUgUU1fUkVHX1JMUEZDUkRfUlRfT0ZGU0VUCTMwODAxCisjZGVmaW5lIFFNX1JFR19STFBGQ1JEX1JUX1NJWkUJMTYKKyNkZWZpbmUgUU1fUkVHX1JMUEZFTkFCTEVfUlRfT0ZGU0VUCTMwODE3CisjZGVmaW5lIFFNX1JFR19STFBGVk9RRU5BQkxFX1JUX09GRlNFVAkzMDgxOAorI2RlZmluZSBRTV9SRUdfV0ZRUEZXRUlHSFRfUlRfT0ZGU0VUCTMwODE5CisjZGVmaW5lIFFNX1JFR19XRlFQRldFSUdIVF9SVF9TSVpFCTE2CisjZGVmaW5lIFFNX1JFR19XRlFQRlVQUEVSQk9VTkRfUlRfT0ZGU0VUCTMwODM1CisjZGVmaW5lIFFNX1JFR19XRlFQRlVQUEVSQk9VTkRfUlRfU0laRQkxNgorI2RlZmluZSBRTV9SRUdfV0ZRUEZDUkRfUlRfT0ZGU0VUCTMwODUxCisjZGVmaW5lIFFNX1JFR19XRlFQRkNSRF9SVF9TSVpFCTE2MAorI2RlZmluZSBRTV9SRUdfV0ZRUEZFTkFCTEVfUlRfT0ZGU0VUCTMxMDExCisjZGVmaW5lIFFNX1JFR19XRlFWUEVOQUJMRV9SVF9PRkZTRVQJMzEwMTIKKyNkZWZpbmUgUU1fUkVHX0JBU0VBRERSVFhQUV9SVF9PRkZTRVQJMzEwMTMKKyNkZWZpbmUgUU1fUkVHX0JBU0VBRERSVFhQUV9SVF9TSVpFCTUxMgorI2RlZmluZSBRTV9SRUdfVFhQUU1BUF9SVF9PRkZTRVQJMzE1MjUKKyNkZWZpbmUgUU1fUkVHX1RYUFFNQVBfUlRfU0laRQk1MTIKKyNkZWZpbmUgUU1fUkVHX1dGUVZQV0VJR0hUX1JUX09GRlNFVAkzMjAzNworI2RlZmluZSBRTV9SRUdfV0ZRVlBXRUlHSFRfUlRfU0laRQk1MTIKKyNkZWZpbmUgUU1fUkVHX1dGUVZQQ1JEX1JUX09GRlNFVAkzMjU0OQorI2RlZmluZSBRTV9SRUdfV0ZRVlBDUkRfUlRfU0laRQk1MTIKKyNkZWZpbmUgUU1fUkVHX1dGUVZQTUFQX1JUX09GRlNFVAkzMzA2MQorI2RlZmluZSBRTV9SRUdfV0ZRVlBNQVBfUlRfU0laRQk1MTIKKyNkZWZpbmUgUU1fUkVHX1dGUVBGQ1JEX01TQl9SVF9PRkZTRVQJMzM1NzMKKyNkZWZpbmUgUU1fUkVHX1dGUVBGQ1JEX01TQl9SVF9TSVpFCTE2MAorI2RlZmluZSBOSUdfUkVHX1RBR19FVEhFUlRZUEVfMF9SVF9PRkZTRVQJMzM3MzMKKyNkZWZpbmUgTklHX1JFR19PVVRFUl9UQUdfVkFMVUVfTElTVDBfUlRfT0ZGU0VUCTMzNzM0CisjZGVmaW5lIE5JR19SRUdfT1VURVJfVEFHX1ZBTFVFX0xJU1QxX1JUX09GRlNFVAkzMzczNQorI2RlZmluZSBOSUdfUkVHX09VVEVSX1RBR19WQUxVRV9MSVNUMl9SVF9PRkZTRVQJMzM3MzYKKyNkZWZpbmUgTklHX1JFR19PVVRFUl9UQUdfVkFMVUVfTElTVDNfUlRfT0ZGU0VUCTMzNzM3CisjZGVmaW5lIE5JR19SRUdfT1VURVJfVEFHX1ZBTFVFX01BU0tfUlRfT0ZGU0VUCTMzNzM4CisjZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfVEFHTUFDX0NMU19UWVBFX1JUX09GRlNFVAkzMzczOQorI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX1RBR19FTl9SVF9PRkZTRVQJMzM3NDAKKyNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19UQUdfRU5fUlRfU0laRQk0CisjZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfVEFHX0hEUl9TRUxfUlRfT0ZGU0VUCTMzNzQ0CisjZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfVEFHX0hEUl9TRUxfUlRfU0laRQk0CisjZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfVEFHX1ZBTFVFX1JUX09GRlNFVAkzMzc0OAorI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX1RBR19WQUxVRV9SVF9TSVpFCTQKKyNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19OT19UQUdfUlRfT0ZGU0VUCTMzNzUyCisjZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX1ZBTFVFX1JUX09GRlNFVAkzMzc1MworI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9WQUxVRV9SVF9TSVpFCTMyCisjZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX0VOX1JUX09GRlNFVAkzMzc4NQorI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9FTl9SVF9TSVpFCTE2CisjZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX01PREVfUlRfT0ZGU0VUCTMzODAxCisjZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX01PREVfUlRfU0laRQkxNgorI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9QUk9UT0NPTF9UWVBFX1JUX09GRlNFVAkzMzgxNworI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9QUk9UT0NPTF9UWVBFX1JUX1NJWkUJMTYKKyNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfSERSX1NFTF9SVF9PRkZTRVQJMzM4MzMKKyNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfSERSX1NFTF9SVF9TSVpFCTE2CisjZGVmaW5lIE5JR19SRUdfVFhfRURQTV9DVFJMX1JUX09GRlNFVAkzMzg0OQorI2RlZmluZSBOSUdfUkVHX1JPQ0VfRFVQTElDQVRFX1RPX0hPU1RfUlRfT0ZGU0VUCTMzODUwCisjZGVmaW5lIENEVV9SRUdfQ0lEX0FERFJfUEFSQU1TX1JUX09GRlNFVAkzMzg1MQorI2RlZmluZSBDRFVfUkVHX1NFR01FTlQwX1BBUkFNU19SVF9PRkZTRVQJMzM4NTIKKyNkZWZpbmUgQ0RVX1JFR19TRUdNRU5UMV9QQVJBTVNfUlRfT0ZGU0VUCTMzODUzCisjZGVmaW5lIENEVV9SRUdfUEZfU0VHMF9UWVBFX09GRlNFVF9SVF9PRkZTRVQJMzM4NTQKKyNkZWZpbmUgQ0RVX1JFR19QRl9TRUcxX1RZUEVfT0ZGU0VUX1JUX09GRlNFVAkzMzg1NQorI2RlZmluZSBDRFVfUkVHX1BGX1NFRzJfVFlQRV9PRkZTRVRfUlRfT0ZGU0VUCTMzODU2CisjZGVmaW5lIENEVV9SRUdfUEZfU0VHM19UWVBFX09GRlNFVF9SVF9PRkZTRVQJMzM4NTcKKyNkZWZpbmUgQ0RVX1JFR19QRl9GTF9TRUcwX1RZUEVfT0ZGU0VUX1JUX09GRlNFVAkzMzg1OAorI2RlZmluZSBDRFVfUkVHX1BGX0ZMX1NFRzFfVFlQRV9PRkZTRVRfUlRfT0ZGU0VUCTMzODU5CisjZGVmaW5lIENEVV9SRUdfUEZfRkxfU0VHMl9UWVBFX09GRlNFVF9SVF9PRkZTRVQJMzM4NjAKKyNkZWZpbmUgQ0RVX1JFR19QRl9GTF9TRUczX1RZUEVfT0ZGU0VUX1JUX09GRlNFVAkzMzg2MQorI2RlZmluZSBDRFVfUkVHX1ZGX1NFR19UWVBFX09GRlNFVF9SVF9PRkZTRVQJMzM4NjIKKyNkZWZpbmUgQ0RVX1JFR19WRl9GTF9TRUdfVFlQRV9PRkZTRVRfUlRfT0ZGU0VUCTMzODYzCisjZGVmaW5lIFBCRl9SRUdfVEFHX0VUSEVSVFlQRV8wX1JUX09GRlNFVAkzMzg2NAorI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TSVpFX1JUX09GRlNFVAkzMzg2NQorI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTBfUlRfT0ZGU0VUCTMzODY2CisjZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RMF9SVF9PRkZTRVQJMzM4NjcKKyNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RMF9SVF9PRkZTRVQJMzM4NjgKKyNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1ExX1JUX09GRlNFVAkzMzg2OQorI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTFfUlRfT0ZGU0VUCTMzODcwCisjZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTFfUlRfT0ZGU0VUCTMzODcxCisjZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RMl9SVF9PRkZTRVQJMzM4NzIKKyNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1EyX1JUX09GRlNFVAkzMzg3MworI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1EyX1JUX09GRlNFVAkzMzg3NAorI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTNfUlRfT0ZGU0VUCTMzODc1CisjZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RM19SVF9PRkZTRVQJMzM4NzYKKyNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RM19SVF9PRkZTRVQJMzM4NzcKKyNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1E0X1JUX09GRlNFVAkzMzg3OAorI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTRfUlRfT0ZGU0VUCTMzODc5CisjZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTRfUlRfT0ZGU0VUCTMzODgwCisjZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RNV9SVF9PRkZTRVQJMzM4ODEKKyNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1E1X1JUX09GRlNFVAkzMzg4MgorI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1E1X1JUX09GRlNFVAkzMzg4MworI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTZfUlRfT0ZGU0VUCTMzODg0CisjZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RNl9SVF9PRkZTRVQJMzM4ODUKKyNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RNl9SVF9PRkZTRVQJMzM4ODYKKyNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1E3X1JUX09GRlNFVAkzMzg4NworI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTdfUlRfT0ZGU0VUCTMzODg4CisjZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTdfUlRfT0ZGU0VUCTMzODg5CisjZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9ROF9SVF9PRkZTRVQJMzM4OTAKKyNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1E4X1JUX09GRlNFVAkzMzg5MQorI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1E4X1JUX09GRlNFVAkzMzg5MgorI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTlfUlRfT0ZGU0VUCTMzODkzCisjZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9ROV9SVF9PRkZTRVQJMzM4OTQKKyNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9ROV9SVF9PRkZTRVQJMzM4OTUKKyNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1ExMF9SVF9PRkZTRVQJMzM4OTYKKyNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1ExMF9SVF9PRkZTRVQJMzM4OTcKKyNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RMTBfUlRfT0ZGU0VUCTMzODk4CisjZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RMTFfUlRfT0ZGU0VUCTMzODk5CisjZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RMTFfUlRfT0ZGU0VUCTMzOTAwCisjZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTExX1JUX09GRlNFVAkzMzkwMQorI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTEyX1JUX09GRlNFVAkzMzkwMgorI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTEyX1JUX09GRlNFVAkzMzkwMworI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1ExMl9SVF9PRkZTRVQJMzM5MDQKKyNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1ExM19SVF9PRkZTRVQJMzM5MDUKKyNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1ExM19SVF9PRkZTRVQJMzM5MDYKKyNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RMTNfUlRfT0ZGU0VUCTMzOTA3CisjZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RMTRfUlRfT0ZGU0VUCTMzOTA4CisjZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RMTRfUlRfT0ZGU0VUCTMzOTA5CisjZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTE0X1JUX09GRlNFVAkzMzkxMAorI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTE1X1JUX09GRlNFVAkzMzkxMQorI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTE1X1JUX09GRlNFVAkzMzkxMgorI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1ExNV9SVF9PRkZTRVQJMzM5MTMKKyNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1ExNl9SVF9PRkZTRVQJMzM5MTQKKyNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1ExNl9SVF9PRkZTRVQJMzM5MTUKKyNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RMTZfUlRfT0ZGU0VUCTMzOTE2CisjZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RMTdfUlRfT0ZGU0VUCTMzOTE3CisjZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RMTdfUlRfT0ZGU0VUCTMzOTE4CisjZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTE3X1JUX09GRlNFVAkzMzkxOQorI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTE4X1JUX09GRlNFVAkzMzkyMAorI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTE4X1JUX09GRlNFVAkzMzkyMQorI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1ExOF9SVF9PRkZTRVQJMzM5MjIKKyNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1ExOV9SVF9PRkZTRVQJMzM5MjMKKyNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1ExOV9SVF9PRkZTRVQJMzM5MjQKKyNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RMTlfUlRfT0ZGU0VUCTMzOTI1CisjZGVmaW5lIFhDTV9SRUdfQ09OX1BIWV9RM19SVF9PRkZTRVQJMzM5MjYKIAotI2RlZmluZSBSVU5USU1FX0FSUkFZX1NJWkUgMzM5MjUKKyNkZWZpbmUgUlVOVElNRV9BUlJBWV9TSVpFIDMzOTI3CiAKIC8qIFRoZSBldGggc3Rvcm0gY29udGV4dCBmb3IgdGhlIFRzdG9ybSAqLwogc3RydWN0IHRzdG9ybV9ldGhfY29ubl9zdF9jdHggewpAQCAtMzIwMSw3ICs0NDY5LDMxIEBACiAJc3RydWN0IG1zdG9ybV9ldGhfY29ubl9zdF9jdHggbXN0b3JtX3N0X2NvbnRleHQ7CiB9OwogCi0vKiBvcGNvZGVzIGZvciB0aGUgZXZlbnQgcmluZyAqLworZW51bSBldGhfZXJyb3JfY29kZSB7CisJRVRIX09LID0gMHgwMCwKKwlFVEhfRklMVEVSU19NQUNfQUREX0ZBSUxfRlVMTCwKKwlFVEhfRklMVEVSU19NQUNfQUREX0ZBSUxfRlVMTF9NVFQyLAorCUVUSF9GSUxURVJTX01BQ19BRERfRkFJTF9EVVBfTVRUMiwKKwlFVEhfRklMVEVSU19NQUNfQUREX0ZBSUxfRFVQX1NUVDIsCisJRVRIX0ZJTFRFUlNfTUFDX0RFTF9GQUlMX05PRiwKKwlFVEhfRklMVEVSU19NQUNfREVMX0ZBSUxfTk9GX01UVDIsCisJRVRIX0ZJTFRFUlNfTUFDX0RFTF9GQUlMX05PRl9TVFQyLAorCUVUSF9GSUxURVJTX01BQ19BRERfRkFJTF9aRVJPX01BQywKKwlFVEhfRklMVEVSU19WTEFOX0FERF9GQUlMX0ZVTEwsCisJRVRIX0ZJTFRFUlNfVkxBTl9BRERfRkFJTF9EVVAsCisJRVRIX0ZJTFRFUlNfVkxBTl9ERUxfRkFJTF9OT0YsCisJRVRIX0ZJTFRFUlNfVkxBTl9ERUxfRkFJTF9OT0ZfVFQxLAorCUVUSF9GSUxURVJTX1BBSVJfQUREX0ZBSUxfRFVQLAorCUVUSF9GSUxURVJTX1BBSVJfQUREX0ZBSUxfRlVMTCwKKwlFVEhfRklMVEVSU19QQUlSX0FERF9GQUlMX0ZVTExfTUFDLAorCUVUSF9GSUxURVJTX1BBSVJfREVMX0ZBSUxfTk9GLAorCUVUSF9GSUxURVJTX1BBSVJfREVMX0ZBSUxfTk9GX1RUMSwKKwlFVEhfRklMVEVSU19QQUlSX0FERF9GQUlMX1pFUk9fTUFDLAorCUVUSF9GSUxURVJTX1ZOSV9BRERfRkFJTF9GVUxMLAorCUVUSF9GSUxURVJTX1ZOSV9BRERfRkFJTF9EVVAsCisJTUFYX0VUSF9FUlJPUl9DT0RFCit9OworCiBlbnVtIGV0aF9ldmVudF9vcGNvZGUgewogCUVUSF9FVkVOVF9VTlVTRUQsCiAJRVRIX0VWRU5UX1ZQT1JUX1NUQVJULApAQCAtMzI2OSw3ICs0NTYxLDEzIEBACiAJTUFYX0VUSF9GSUxURVJfVFlQRQogfTsKIAotLyogRXRoZXJuZXQgUmFtcm9kIENvbW1hbmQgSURzICovCitlbnVtIGV0aF9pcHY0X2ZyYWdfdHlwZSB7CisJRVRIX0lQVjRfTk9UX0ZSQUcsCisJRVRIX0lQVjRfRklSU1RfRlJBRywKKwlFVEhfSVBWNF9OT05fRklSU1RfRlJBRywKKwlNQVhfRVRIX0lQVjRfRlJBR19UWVBFCit9OworCiBlbnVtIGV0aF9yYW1yb2RfY21kX2lkIHsKIAlFVEhfUkFNUk9EX1VOVVNFRCwKIAlFVEhfUkFNUk9EX1ZQT1JUX1NUQVJULApAQCAtMzQ1MSw4ICs0NzQ5LDggQEAKIAl1OCB0b2dnbGVfdmFsOwogCiAJdTggdmZfcnhfcHJvZF9pbmRleDsKLQotCXU4IHJlc2VydmVkWzZdOworCXU4IHZmX3J4X3Byb2RfdXNlX3pvbmVfYTsKKwl1OCByZXNlcnZlZFs1XTsKIAlfX2xlMTYgcmVzZXJ2ZWQxOwogCXN0cnVjdCByZWdwYWlyIGNxZV9wYmxfYWRkcjsKIAlzdHJ1Y3QgcmVncGFpciBiZF9iYXNlOwpAQCAtMzUyNiwxMCArNDgyNCwxMSBAQAogCV9fbGUxNiBweHBfc3RfaW5kZXg7CiAJX19sZTE2IGNvbXBfYWdnX3NpemU7CiAJX19sZTE2IHF1ZXVlX3pvbmVfaWQ7Ci0JX19sZTE2IHRlc3RfZHVwX2NvdW50OworCV9fbGUxNiByZXNlcnZlZDI7CiAJX19sZTE2IHBibF9zaXplOwogCV9fbGUxNiB0eF9xdWV1ZV9pZDsKLQorCV9fbGUxNiBzYW1lX2FzX2xhc3RfaWQ7CisJX19sZTE2IHJlc2VydmVkWzNdOwogCXN0cnVjdCByZWdwYWlyIHBibF9iYXNlX2FkZHI7CiAJc3RydWN0IHJlZ3BhaXIgYmRfY29uc19hZGRyZXNzOwogfTsKQEAgLTQ5MjYsOCArNjIyNSw4IEBACiAjZGVmaW5lIFJPQ0VfQ1JFQVRFX1FQX1JFU1BfUkFNUk9EX0RBVEFfU1JRX0ZMR19TSElGVCAgICAgICAgICAgICA1CiAjZGVmaW5lIFJPQ0VfQ1JFQVRFX1FQX1JFU1BfUkFNUk9EX0RBVEFfRTJFX0ZMT1dfQ09OVFJPTF9FTl9NQVNLICAweDEKICNkZWZpbmUgUk9DRV9DUkVBVEVfUVBfUkVTUF9SQU1ST0RfREFUQV9FMkVfRkxPV19DT05UUk9MX0VOX1NISUZUIDYKLSNkZWZpbmUgUk9DRV9DUkVBVEVfUVBfUkVTUF9SQU1ST0RfREFUQV9SRVNFUlZFRDBfTUFTSyAgICAgICAgICAgIDB4MQotI2RlZmluZSBST0NFX0NSRUFURV9RUF9SRVNQX1JBTVJPRF9EQVRBX1JFU0VSVkVEMF9TSElGVCAgICAgICAgICAgNworI2RlZmluZSBST0NFX0NSRUFURV9RUF9SRVNQX1JBTVJPRF9EQVRBX1JFU0VSVkVEX0tFWV9FTl9NQVNLCTB4MQorI2RlZmluZSBST0NFX0NSRUFURV9RUF9SRVNQX1JBTVJPRF9EQVRBX1JFU0VSVkVEX0tFWV9FTl9TSElGVAk3CiAjZGVmaW5lIFJPQ0VfQ1JFQVRFX1FQX1JFU1BfUkFNUk9EX0RBVEFfUFJJX01BU0sgICAgICAgICAgICAgICAgICAweDcKICNkZWZpbmUgUk9DRV9DUkVBVEVfUVBfUkVTUF9SQU1ST0RfREFUQV9QUklfU0hJRlQgICAgICAgICAgICAgICAgIDgKICNkZWZpbmUgUk9DRV9DUkVBVEVfUVBfUkVTUF9SQU1ST0RfREFUQV9NSU5fUk5SX05BS19USU1FUl9NQVNLICAgIDB4MUYKQEAgLTQ5ODgsNiArNjI4NywxMCBAQAogCU1BWF9ST0NFX0VWRU5UX09QQ09ERQogfTsKIAorc3RydWN0IHJvY2VfaW5pdF9mdW5jX3JhbXJvZF9kYXRhIHsKKwlzdHJ1Y3QgcmRtYV9pbml0X2Z1bmNfcmFtcm9kX2RhdGEgcmRtYTsKK307CisKIHN0cnVjdCByb2NlX21vZGlmeV9xcF9yZXFfcmFtcm9kX2RhdGEgewogCV9fbGUxNiBmbGFnczsKICNkZWZpbmUgUk9DRV9NT0RJRllfUVBfUkVRX1JBTVJPRF9EQVRBX01PVkVfVE9fRVJSX0ZMR19NQVNLICAgICAgMHgxCkBAIC02NjM5LDYgKzc5NDIsMzUgQEAKIAlfX2xlMzIgcmVnMjsKIAlfX2xlMzIgcmVnMzsKIH07CisKKyNkZWZpbmUgTUZXX1RSQUNFX1NJR05BVFVSRSAgICAgMHgyNTA3MTk0NgorCisvKiBUaGUgdHJhY2UgaW4gdGhlIGJ1ZmZlciAqLworI2RlZmluZSBNRldfVFJBQ0VfRVZFTlRJRF9NQVNLICAgICAgICAgIDB4MDBmZmZmCisjZGVmaW5lIE1GV19UUkFDRV9QUk1fU0laRV9NQVNLICAgICAgICAgMHgwZjAwMDAKKyNkZWZpbmUgTUZXX1RSQUNFX1BSTV9TSVpFX1NISUZUICAgICAgICAxNgorI2RlZmluZSBNRldfVFJBQ0VfRU5UUllfU0laRSAgICAgICAgICAgIDMKKworc3RydWN0IG1jcF90cmFjZSB7CisJdTMyIHNpZ25hdHVyZTsJCS8qIEhlbHAgdG8gaWRlbnRpZnkgdGhhdCB0aGUgdHJhY2UgaXMgdmFsaWQgKi8KKwl1MzIgc2l6ZTsJCS8qIHRoZSBzaXplIG9mIHRoZSB0cmFjZSBidWZmZXIgaW4gYnl0ZXMgKi8KKwl1MzIgY3Vycl9sZXZlbDsJCS8qIDIgLSBhbGwgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBidWZmZXIKKwkJCQkgKiAxIC0gZGVidWcgdHJhY2Ugd2lsbCBub3QgYmUgd3JpdHRlbgorCQkJCSAqIDAgLSBqdXN0IGVycm9ycyB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIGJ1ZmZlcgorCQkJCSAqLworCXUzMiBtb2R1bGVzX21hc2tbMl07CS8qIGEgYml0IHBlciBtb2R1bGUsIDEgbWVhbnMgd3JpdGUgaXQsIDAgbWVhbnMKKwkJCQkgKiBtYXNrIGl0LgorCQkJCSAqLworCisJLyogV2FybmluZzogdGhlIGZvbGxvd2luZyBwb2ludGVycyBhcmUgYXNzdW1lZCB0byBiZSAzMmJpdHMgYXMgdGhleSBhcmUKKwkgKiB1c2VkIG9ubHkgaW4gdGhlIE1GVy4KKwkgKi8KKwl1MzIgdHJhY2VfcHJvZDsgLyogVGhlIG5leHQgdHJhY2Ugd2lsbCBiZSB3cml0dGVuIHRvIHRoaXMgb2Zmc2V0ICovCisJdTMyIHRyYWNlX29sZGVzdDsgLyogVGhlIG9sZGVzdCB2YWxpZCB0cmFjZSBzdGFydHMgYXQgdGhpcyBvZmZzZXQKKwkJCSAgICogKHVzdWFsbHkgdmVyeSBjbG9zZSBhZnRlciB0aGUgY3VycmVudCBwcm9kdWNlcikuCisJCQkgICAqLworfTsKKwogI2RlZmluZSBWRl9NQVhfU1RBVElDIDE5MgogCiAjZGVmaW5lIE1DUF9HTE9CX1BBVEhfTUFYCTIKQEAgLTY2NDYsNiArNzk3OCw3IEBACiAjZGVmaW5lIE1DUF9HTE9CX1BPUlRfTUFYCTQKICNkZWZpbmUgTUNQX0dMT0JfRlVOQ19NQVgJMTYKIAordHlwZWRlZiB1MzIgb2Zmc2l6ZV90OwkJLyogSW4gRFdPUkRTICEhISAqLwogLyogT2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgTUNQIHNjcmF0Y2hwYWQgKi8KICNkZWZpbmUgT0ZGU0laRV9PRkZTRVRfU0hJRlQJMAogI2RlZmluZSBPRkZTSVpFX09GRlNFVF9NQVNLCTB4MDAwMGZmZmYKQEAgLTY4NTAsNiArODE4MywxNCBAQAogI2RlZmluZSBEQ0JYX0FQUF9TRl9TSElGVAkJOAogI2RlZmluZSBEQ0JYX0FQUF9TRl9FVEhUWVBFCQkwCiAjZGVmaW5lIERDQlhfQVBQX1NGX1BPUlQJCTEKKyNkZWZpbmUgRENCWF9BUFBfU0ZfSUVFRV9NQVNLCQkweDAwMDBmMDAwCisjZGVmaW5lIERDQlhfQVBQX1NGX0lFRUVfU0hJRlQJCTEyCisjZGVmaW5lIERDQlhfQVBQX1NGX0lFRUVfUkVTRVJWRUQJMAorI2RlZmluZSBEQ0JYX0FQUF9TRl9JRUVFX0VUSFRZUEUJMQorI2RlZmluZSBEQ0JYX0FQUF9TRl9JRUVFX1RDUF9QT1JUCTIKKyNkZWZpbmUgRENCWF9BUFBfU0ZfSUVFRV9VRFBfUE9SVAkzCisjZGVmaW5lIERDQlhfQVBQX1NGX0lFRUVfVENQX1VEUF9QT1JUCTQKKwogI2RlZmluZSBEQ0JYX0FQUF9QUk9UT0NPTF9JRF9NQVNLCTB4ZmZmZjAwMDAKICNkZWZpbmUgRENCWF9BUFBfUFJPVE9DT0xfSURfU0hJRlQJMTYKIH07CkBAIC03MjI4LDggKzg1NjksMTkgQEAKICNkZWZpbmUgRFJWX01TR19DT0RFX05JR19EUkFJTgkJCTB4MzAwMDAwMDAKICNkZWZpbmUgRFJWX01TR19DT0RFX1ZGX0RJU0FCTEVEX0RPTkUJCTB4YzAwMDAwMDAKICNkZWZpbmUgRFJWX01TR19DT0RFX0NGR19WRl9NU0lYCQkweGMwMDEwMDAwCisjZGVmaW5lIERSVl9NU0dfQ09ERV9OVk1fR0VUX0ZJTEVfQVRUCQkweDAwMDMwMDAwCisjZGVmaW5lIERSVl9NU0dfQ09ERV9OVk1fUkVBRF9OVlJBTQkJMHgwMDA1MDAwMAogI2RlZmluZSBEUlZfTVNHX0NPREVfTUNQX1JFU0VUCQkJMHgwMDA5MDAwMAogI2RlZmluZSBEUlZfTVNHX0NPREVfU0VUX1ZFUlNJT04JCTB4MDAwZjAwMDAKKyNkZWZpbmUgRFJWX01TR19DT0RFX01DUF9IQUxUICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKworI2RlZmluZSBEUlZfTVNHX0NPREVfR0VUX1NUQVRTICAgICAgICAgICAgICAgICAgMHgwMDEzMDAwMAorI2RlZmluZSBEUlZfTVNHX0NPREVfU1RBVFNfVFlQRV9MQU4gICAgICAgICAgICAgMQorI2RlZmluZSBEUlZfTVNHX0NPREVfU1RBVFNfVFlQRV9GQ09FICAgICAgICAgICAgMgorI2RlZmluZSBEUlZfTVNHX0NPREVfU1RBVFNfVFlQRV9JU0NTSSAgICAgICAgICAgMworI2RlZmluZSBEUlZfTVNHX0NPREVfU1RBVFNfVFlQRV9SRE1BICAgICAgICAgICAgNAorCisjZGVmaW5lIERSVl9NU0dfQ09ERV9NQVNLX1BBUklUSUVTICAgICAgICAgICAgICAweDAwMWEwMDAwCiAKICNkZWZpbmUgRFJWX01TR19DT0RFX0JJU1RfVEVTVAkJCTB4MDAxZTAwMDAKICNkZWZpbmUgRFJWX01TR19DT0RFX1NFVF9MRURfTU9ERQkJMHgwMDIwMDAwMApAQCAtNzI0MCw2ICs4NTkyLDkgQEAKICNkZWZpbmUgRFJWX01CX1BBUkFNX1VOTE9BRF9XT0xfTUNQCQkweDAwMDAwMDAxCiAjZGVmaW5lIERSVl9NQl9QQVJBTV9EQ0JYX05PVElGWV9NQVNLCQkweDAwMDAwMEZGCiAjZGVmaW5lIERSVl9NQl9QQVJBTV9EQ0JYX05PVElGWV9TSElGVAkJMworCisjZGVmaW5lIERSVl9NQl9QQVJBTV9OVk1fTEVOX1NISUZUCQkyNAorCiAjZGVmaW5lIERSVl9NQl9QQVJBTV9DRkdfVkZfTVNJWF9WRl9JRF9TSElGVAkwCiAjZGVmaW5lIERSVl9NQl9QQVJBTV9DRkdfVkZfTVNJWF9WRl9JRF9NQVNLCTB4MDAwMDAwRkYKICNkZWZpbmUgRFJWX01CX1BBUkFNX0NGR19WRl9NU0lYX1NCX05VTV9TSElGVAk4CkBAIC03Mjc3LDYgKzg2MzIsOCBAQAogI2RlZmluZSBGV19NU0dfQ09ERV9EUlZfVU5MT0FEX0ZVTkNUSU9OCQkweDIwMTMwMDAwCiAjZGVmaW5lIEZXX01TR19DT0RFX0RSVl9VTkxPQURfRE9ORQkJMHgyMTEwMDAwMAogI2RlZmluZSBGV19NU0dfQ09ERV9EUlZfQ0ZHX1ZGX01TSVhfRE9ORQkweGIwMDEwMDAwCisKKyNkZWZpbmUgRldfTVNHX0NPREVfTlZNX09LCQkJMHgwMDAxMDAwMAogI2RlZmluZSBGV19NU0dfQ09ERV9PSwkJCQkweDAwMTYwMDAwCiAKICNkZWZpbmUgRldfTVNHX1NFUV9OVU1CRVJfTUFTSwkJCTB4MDAwMGZmZmYKQEAgLTczMDcsMTAgKzg2NjQsMTAgQEAKIAlNRldfRFJWX01TR19SRVNFUlZFRDQsCiAJTUZXX0RSVl9NU0dfQldfVVBEQVRFLAogCU1GV19EUlZfTVNHX0JXX1VQREFURTUsCi0JTUZXX0RSVl9NU0dfQldfVVBEQVRFNiwKLQlNRldfRFJWX01TR19CV19VUERBVEU3LAotCU1GV19EUlZfTVNHX0JXX1VQREFURTgsCi0JTUZXX0RSVl9NU0dfQldfVVBEQVRFOSwKKwlNRldfRFJWX01TR19HRVRfTEFOX1NUQVRTLAorCU1GV19EUlZfTVNHX0dFVF9GQ09FX1NUQVRTLAorCU1GV19EUlZfTVNHX0dFVF9JU0NTSV9TVEFUUywKKwlNRldfRFJWX01TR19HRVRfUkRNQV9TVEFUUywKIAlNRldfRFJWX01TR19CV19VUERBVEUxMCwKIAlNRldfRFJWX01TR19UUkFOU0NFSVZFUl9TVEFURV9DSEFOR0UsCiAJTUZXX0RSVl9NU0dfQldfVVBEQVRFMTEsCkBAIC03NTEzLDQgKzg4NzAsMTAxIEBACiAJc3RydWN0IG52bV9jZmcxX3BvcnQgcG9ydFtNQ1BfR0xPQl9QT1JUX01BWF07CiAJc3RydWN0IG52bV9jZmcxX2Z1bmMgZnVuY1tNQ1BfR0xPQl9GVU5DX01BWF07CiB9OworCitlbnVtIHNwYWRfc2VjdGlvbnMgeworCVNQQURfU0VDVElPTl9UUkFDRSwKKwlTUEFEX1NFQ1RJT05fTlZNX0NGRywKKwlTUEFEX1NFQ1RJT05fUFVCTElDLAorCVNQQURfU0VDVElPTl9QUklWQVRFLAorCVNQQURfU0VDVElPTl9NQVgKK307CisKKyNkZWZpbmUgTUNQX1RSQUNFX1NJWkUgICAgICAgICAgMjA0OAkvKiAya2IgKi8KKworLyogVGhpcyBzZWN0aW9uIGlzIGxvY2F0ZWQgYXQgYSBmaXhlZCBsb2NhdGlvbiBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICogc2NyYXRjaHBhZCwgdG8gZW5zdXJlIHRoYXQgdGhlIE1DUCB0cmFjZSBpcyBub3QgcnVuIG92ZXIgZHVyaW5nIE1GVyB1cGdyYWRlLgorICogQWxsIHRoZSByZXN0IG9mIGRhdGEgaGFzIGEgZmxvYXRpbmcgbG9jYXRpb24gd2hpY2ggZGlmZmVycyBmcm9tIHZlcnNpb24gdG8KKyAqIHZlcnNpb24sIGFuZCBpcyBwb2ludGVkIGJ5IHRoZSBtY3BfbWV0YV9kYXRhIGJlbG93LgorICogTW9yZW92ZXIsIHRoZSBzcGFkX2xheW91dCBzZWN0aW9uIGlzIHBhcnQgb2YgdGhlIE1GVyBmaXJtd2FyZSwgYW5kIGlzIGxvYWRlZAorICogd2l0aCBpdCBmcm9tIG52cmFtIGluIG9yZGVyIHRvIGNsZWFyIHRoaXMgcG9ydGlvbi4KKyAqLworc3RydWN0IHN0YXRpY19pbml0IHsKKwl1MzIgbnVtX3NlY3Rpb25zOworCW9mZnNpemVfdCBzZWN0aW9uc1tTUEFEX1NFQ1RJT05fTUFYXTsKKyNkZWZpbmUgU0VDVElPTihfc2VjXykgKCooKG9mZnNpemVfdCAqKShTVFJVQ1RfT0ZGU0VUKHNlY3Rpb25zW19zZWNfXSkpKSkKKworCXN0cnVjdCBtY3BfdHJhY2UgdHJhY2U7CisjZGVmaW5lIE1DUF9UUkFDRV9QICgoc3RydWN0IG1jcF90cmFjZSAqKShTVFJVQ1RfT0ZGU0VUKHRyYWNlKSkpCisJdTggdHJhY2VfYnVmZmVyW01DUF9UUkFDRV9TSVpFXTsKKyNkZWZpbmUgTUNQX1RSQUNFX0JVRiAoKHU4ICopKFNUUlVDVF9PRkZTRVQodHJhY2VfYnVmZmVyKSkpCisJLyogcnVubmluZ19tZncgaGFzIHRoZSBzYW1lIGRlZmluaXRpb24gYXMgaW4gbnZtX21hcC5oLgorCSAqIFRoaXMgYml0IGluZGljYXRlIGJvdGggdGhlIHJ1bm5pbmcgZGlyLCBhbmQgdGhlIHJ1bm5pbmcgYnVuZGxlLgorCSAqIEl0IGlzIHNldCBvbmNlIHdoZW4gdGhlIExJTSBpcyBsb2FkZWQuCisJICovCisJdTMyIHJ1bm5pbmdfbWZ3OworI2RlZmluZSBSVU5OSU5HX01GVyAoKigodTMyICopKFNUUlVDVF9PRkZTRVQocnVubmluZ19tZncpKSkpCisJdTMyIGJ1aWxkX3RpbWU7CisjZGVmaW5lIE1GV19CVUlMRF9USU1FICgqKCh1MzIgKikoU1RSVUNUX09GRlNFVChidWlsZF90aW1lKSkpKQorCXUzMiByZXNldF90eXBlOworI2RlZmluZSBSRVNFVF9UWVBFICgqKCh1MzIgKikoU1RSVUNUX09GRlNFVChyZXNldF90eXBlKSkpKQorCXUzMiBtZndfc2VjdXJlX21vZGU7CisjZGVmaW5lIE1GV19TRUNVUkVfTU9ERSAoKigodTMyICopKFNUUlVDVF9PRkZTRVQobWZ3X3NlY3VyZV9tb2RlKSkpKQorCXUxNiBwbWVfc3RhdHVzX3BmX2JpdG1hcDsKKyNkZWZpbmUgUE1FX1NUQVRVU19QRl9CSVRNQVAgKCooKHUxNiAqKShTVFJVQ1RfT0ZGU0VUKHBtZV9zdGF0dXNfcGZfYml0bWFwKSkpKQorCXUxNiBwbWVfZW5hYmxlX3BmX2JpdG1hcDsKKyNkZWZpbmUgUE1FX0VOQUJMRV9QRl9CSVRNQVAgKCooKHUxNiAqKShTVFJVQ1RfT0ZGU0VUKHBtZV9lbmFibGVfcGZfYml0bWFwKSkpKQorCXUzMiBtaW1fbnZtX2FkZHI7CisJdTMyIG1pbV9zdGFydF9hZGRyOworCXUzMiBhaF9wY2llX2xpbmtfcGFyYW1zOworI2RlZmluZSBBSF9QQ0lFX0xJTktfUEFSQU1TX0xJTktfU1BFRURfTUFTSyAgICAgKDB4MDAwMDAwZmYpCisjZGVmaW5lIEFIX1BDSUVfTElOS19QQVJBTVNfTElOS19TUEVFRF9TSElGVCAgICAoMCkKKyNkZWZpbmUgQUhfUENJRV9MSU5LX1BBUkFNU19MSU5LX1dJRFRIX01BU0sgICAgICgweDAwMDBmZjAwKQorI2RlZmluZSBBSF9QQ0lFX0xJTktfUEFSQU1TX0xJTktfV0lEVEhfU0hJRlQgICAgKDgpCisjZGVmaW5lIEFIX1BDSUVfTElOS19QQVJBTVNfQVNQTV9NT0RFX01BU0sgICAgICAoMHgwMGZmMDAwMCkKKyNkZWZpbmUgQUhfUENJRV9MSU5LX1BBUkFNU19BU1BNX01PREVfU0hJRlQgICAgICgxNikKKyNkZWZpbmUgQUhfUENJRV9MSU5LX1BBUkFNU19BU1BNX0NBUF9NQVNLICAgICAgICgweGZmMDAwMDAwKQorI2RlZmluZSBBSF9QQ0lFX0xJTktfUEFSQU1TX0FTUE1fQ0FQX1NISUZUICAgICAgKDI0KQorI2RlZmluZSBBSF9QQ0lFX0xJTktfUEFSQU1TICgqKCh1MzIgKikoU1RSVUNUX09GRlNFVChhaF9wY2llX2xpbmtfcGFyYW1zKSkpKQorCisJdTMyIHJzcnZfcGVyc2lzdFs1XTsJLyogUGVyc2lzdCByZXNlcnZlZCBmb3IgTUZXIHVwZ3JhZGVzICovCit9OworCitlbnVtIG52bV9pbWFnZV90eXBlIHsKKwlOVk1fVFlQRV9USU0xID0gMHgwMSwKKwlOVk1fVFlQRV9USU0yID0gMHgwMiwKKwlOVk1fVFlQRV9NSU0xID0gMHgwMywKKwlOVk1fVFlQRV9NSU0yID0gMHgwNCwKKwlOVk1fVFlQRV9NQkEgPSAweDA1LAorCU5WTV9UWVBFX01PRFVMRVNfUE4gPSAweDA2LAorCU5WTV9UWVBFX1ZQRCA9IDB4MDcsCisJTlZNX1RZUEVfTUZXX1RSQUNFMSA9IDB4MDgsCisJTlZNX1RZUEVfTUZXX1RSQUNFMiA9IDB4MDksCisJTlZNX1RZUEVfTlZNX0NGRzEgPSAweDBhLAorCU5WTV9UWVBFX0wyQiA9IDB4MGIsCisJTlZNX1RZUEVfRElSMSA9IDB4MGMsCisJTlZNX1RZUEVfRUFHTEVfRlcxID0gMHgwZCwKKwlOVk1fVFlQRV9GQUxDT05fRlcxID0gMHgwZSwKKwlOVk1fVFlQRV9QQ0lFX0ZXMSA9IDB4MGYsCisJTlZNX1RZUEVfSFdfU0VUID0gMHgxMCwKKwlOVk1fVFlQRV9MSU0gPSAweDExLAorCU5WTV9UWVBFX0FWU19GVzEgPSAweDEyLAorCU5WTV9UWVBFX0RJUjIgPSAweDEzLAorCU5WTV9UWVBFX0NDTSA9IDB4MTQsCisJTlZNX1RZUEVfRUFHTEVfRlcyID0gMHgxNSwKKwlOVk1fVFlQRV9GQUxDT05fRlcyID0gMHgxNiwKKwlOVk1fVFlQRV9QQ0lFX0ZXMiA9IDB4MTcsCisJTlZNX1RZUEVfQVZTX0ZXMiA9IDB4MTgsCisJTlZNX1RZUEVfSU5JVF9IVyA9IDB4MTksCisJTlZNX1RZUEVfREVGQVVMVF9DRkcgPSAweDFhLAorCU5WTV9UWVBFX01EVU1QID0gMHgxYiwKKwlOVk1fVFlQRV9NRVRBID0gMHgxYywKKwlOVk1fVFlQRV9JU0NTSV9DRkcgPSAweDFkLAorCU5WTV9UWVBFX0ZDT0VfQ0ZHID0gMHgxZiwKKwlOVk1fVFlQRV9FVEhfUEhZX0ZXMSA9IDB4MjAsCisJTlZNX1RZUEVfRVRIX1BIWV9GVzIgPSAweDIxLAorCU5WTV9UWVBFX01BWCwKK307CisKKyNkZWZpbmUgRElSX0lEXzEgICAgKDApCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfaHcuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2h3LmMKaW5kZXggZTE3ODg1My4uNmU0ZmFlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfaHcuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9ody5jCkBAIC00NCw4ICs0NCw3IEBACiAKIGludCBxZWRfcHR0X3Bvb2xfYWxsb2Moc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4pCiB7Ci0Jc3RydWN0IHFlZF9wdHRfcG9vbCAqcF9wb29sID0ga21hbGxvYyhzaXplb2YoKnBfcG9vbCksCi0JCQkJCSAgICAgIEdGUF9LRVJORUwpOworCXN0cnVjdCBxZWRfcHR0X3Bvb2wgKnBfcG9vbCA9IGttYWxsb2Moc2l6ZW9mKCpwX3Bvb2wpLCBHRlBfS0VSTkVMKTsKIAlpbnQgaTsKIAogCWlmICghcF9wb29sKQpAQCAtMTEzLDE2ICsxMTIsMTQgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBxZWRfcHR0X3JlbGVhc2Uoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCSAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQordm9pZCBxZWRfcHR0X3JlbGVhc2Uoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKIHsKIAlzcGluX2xvY2tfYmgoJnBfaHdmbi0+cF9wdHRfcG9vbC0+bG9jayk7CiAJbGlzdF9hZGQoJnBfcHR0LT5saXN0X2VudHJ5LCAmcF9od2ZuLT5wX3B0dF9wb29sLT5mcmVlX2xpc3QpOwogCXNwaW5fdW5sb2NrX2JoKCZwX2h3Zm4tPnBfcHR0X3Bvb2wtPmxvY2spOwogfQogCi11MzIgcWVkX3B0dF9nZXRfaHdfYWRkcihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCXN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKK3UzMiBxZWRfcHR0X2dldF9od19hZGRyKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCiB7CiAJLyogVGhlIEhXIGlzIHVzaW5nIERXT1JEUyBhbmQgd2UgbmVlZCB0byB0cmFuc2xhdGUgaXQgdG8gQnl0ZXMgKi8KIAlyZXR1cm4gbGUzMl90b19jcHUocF9wdHQtPnB4cC5vZmZzZXQpIDw8IDI7CkBAIC0xNDEsOCArMTM4LDcgQEAKIH0KIAogdm9pZCBxZWRfcHR0X3NldF93aW4oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCSAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAotCQkgICAgIHUzMiBuZXdfaHdfYWRkcikKKwkJICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHUzMiBuZXdfaHdfYWRkcikKIHsKIAl1MzIgcHJldl9od19hZGRyOwogCkBAIC0xNjYsOCArMTYyLDcgQEAKIH0KIAogc3RhdGljIHUzMiBxZWRfc2V0X3B0dChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJICAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKLQkJICAgICAgIHUzMiBod19hZGRyKQorCQkgICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1MzIgaHdfYWRkcikKIHsKIAl1MzIgd2luX2h3X2FkZHIgPSBxZWRfcHR0X2dldF9od19hZGRyKHBfaHdmbiwgcF9wdHQpOwogCXUzMiBvZmZzZXQ7CkBAIC0yMjQsMTAgKzIxOSw3IEBACiAKIHN0YXRpYyB2b2lkIHFlZF9tZW1jcHlfaHcoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCiAJCQkgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKLQkJCSAgdm9pZCAqYWRkciwKLQkJCSAgdTMyIGh3X2FkZHIsCi0JCQkgIHNpemVfdCBuLAotCQkJICBib29sIHRvX2RldmljZSkKKwkJCSAgdm9pZCAqYWRkciwgdTMyIGh3X2FkZHIsIHNpemVfdCBuLCBib29sIHRvX2RldmljZSkKIHsKIAl1MzIgZHdfY291bnQsICpob3N0X2FkZHIsIGh3X29mZnNldDsKIAlzaXplX3QgcXVvdGEsIGRvbmUgPSAwOwpAQCAtMjU5LDggKzI1MSw3IEBACiB9CiAKIHZvaWQgcWVkX21lbWNweV9mcm9tKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKLQkJICAgICB2b2lkICpkZXN0LCB1MzIgaHdfYWRkciwgc2l6ZV90IG4pCisJCSAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB2b2lkICpkZXN0LCB1MzIgaHdfYWRkciwgc2l6ZV90IG4pCiB7CiAJRFBfVkVSQk9TRShwX2h3Zm4sIE5FVElGX01TR19IVywKIAkJICAgImh3X2FkZHIgMHgleCwgZGVzdCAlcCBod19hZGRyIDB4JXgsIHNpemUgJWx1XG4iLApAQCAtMjcwLDggKzI2MSw3IEBACiB9CiAKIHZvaWQgcWVkX21lbWNweV90byhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAotCQkgICB1MzIgaHdfYWRkciwgdm9pZCAqc3JjLCBzaXplX3QgbikKKwkJICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1MzIgaHdfYWRkciwgdm9pZCAqc3JjLCBzaXplX3QgbikKIHsKIAlEUF9WRVJCT1NFKHBfaHdmbiwgTkVUSUZfTVNHX0hXLAogCQkgICAiaHdfYWRkciAweCV4LCBod19hZGRyIDB4JXgsIHNyYyAlcCBzaXplICVsdVxuIiwKQEAgLTI4MCw5ICsyNzAsNyBAQAogCXFlZF9tZW1jcHlfaHcocF9od2ZuLCBwX3B0dCwgc3JjLCBod19hZGRyLCBuLCB0cnVlKTsKIH0KIAotdm9pZCBxZWRfZmlkX3ByZXRlbmQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCSAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAotCQkgICAgIHUxNiBmaWQpCit2b2lkIHFlZF9maWRfcHJldGVuZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1MTYgZmlkKQogewogCXUxNiBjb250cm9sID0gMDsKIApAQCAtMzA5LDggKzI5Nyw3IEBACiB9CiAKIHZvaWQgcWVkX3BvcnRfcHJldGVuZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAotCQkgICAgICB1OCBwb3J0X2lkKQorCQkgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHU4IHBvcnRfaWQpCiB7CiAJdTE2IGNvbnRyb2wgPSAwOwogCkBAIC0zMjYsOCArMzEzLDcgQEAKIAkgICAgICAgKih1MzIgKikmcF9wdHQtPnB4cC5wcmV0ZW5kKTsKIH0KIAotdm9pZCBxZWRfcG9ydF91bnByZXRlbmQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCQlzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCit2b2lkIHFlZF9wb3J0X3VucHJldGVuZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQogewogCXUxNiBjb250cm9sID0gMDsKIApAQCAtNDI5LDI4ICs0MTUsMjcgQEAKIAlyZXR1cm4gRE1BRV9SRUdfR09fQzAgKyAoaWR4IDw8IDIpOwogfQogCi1zdGF0aWMgaW50Ci1xZWRfZG1hZV9wb3N0X2NvbW1hbmQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCSAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKK3N0YXRpYyBpbnQgcWVkX2RtYWVfcG9zdF9jb21tYW5kKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCiB7Ci0Jc3RydWN0IGRtYWVfY21kICpjb21tYW5kID0gcF9od2ZuLT5kbWFlX2luZm8ucF9kbWFlX2NtZDsKKwlzdHJ1Y3QgZG1hZV9jbWQgKnBfY29tbWFuZCA9IHBfaHdmbi0+ZG1hZV9pbmZvLnBfZG1hZV9jbWQ7CiAJdTggaWR4X2NtZCA9IHBfaHdmbi0+ZG1hZV9pbmZvLmNoYW5uZWwsIGk7CiAJaW50IHFlZF9zdGF0dXMgPSAwOwogCiAJLyogdmVyaWZ5IGFkZHJlc3MgaXMgbm90IE5VTEwgKi8KLQlpZiAoKCgoY29tbWFuZC0+ZHN0X2FkZHJfbG8gPT0gMCkgJiYgKGNvbW1hbmQtPmRzdF9hZGRyX2hpID09IDApKSB8fAotCSAgICAgKChjb21tYW5kLT5zcmNfYWRkcl9sbyA9PSAwKSAmJiAoY29tbWFuZC0+c3JjX2FkZHJfaGkgPT0gMCkpKSkgeworCWlmICgoKCghcF9jb21tYW5kLT5kc3RfYWRkcl9sbykgJiYgKCFwX2NvbW1hbmQtPmRzdF9hZGRyX2hpKSkgfHwKKwkgICAgICgoIXBfY29tbWFuZC0+c3JjX2FkZHJfbG8pICYmICghcF9jb21tYW5kLT5zcmNfYWRkcl9oaSkpKSkgewogCQlEUF9OT1RJQ0UocF9od2ZuLAogCQkJICAic291cmNlIG9yIGRlc3RpbmF0aW9uIGFkZHJlc3MgMCBpZHhfY21kPSVkXG4iCiAJCQkgICJvcGNvZGUgPSBbMHglMDh4LDB4JTA0eF0gbGVuPTB4JXggc3JjPTB4JXg6JXggZHN0PTB4JXg6JXhcbiIsCi0JCQkgICBpZHhfY21kLAotCQkJICAgbGUzMl90b19jcHUoY29tbWFuZC0+b3Bjb2RlKSwKLQkJCSAgIGxlMTZfdG9fY3B1KGNvbW1hbmQtPm9wY29kZV9iKSwKLQkJCSAgIGxlMTZfdG9fY3B1KGNvbW1hbmQtPmxlbmd0aF9kdyksCi0JCQkgICBsZTMyX3RvX2NwdShjb21tYW5kLT5zcmNfYWRkcl9oaSksCi0JCQkgICBsZTMyX3RvX2NwdShjb21tYW5kLT5zcmNfYWRkcl9sbyksCi0JCQkgICBsZTMyX3RvX2NwdShjb21tYW5kLT5kc3RfYWRkcl9oaSksCi0JCQkgICBsZTMyX3RvX2NwdShjb21tYW5kLT5kc3RfYWRkcl9sbykpOworCQkJICBpZHhfY21kLAorCQkJICBsZTMyX3RvX2NwdShwX2NvbW1hbmQtPm9wY29kZSksCisJCQkgIGxlMTZfdG9fY3B1KHBfY29tbWFuZC0+b3Bjb2RlX2IpLAorCQkJICBsZTE2X3RvX2NwdShwX2NvbW1hbmQtPmxlbmd0aF9kdyksCisJCQkgIGxlMzJfdG9fY3B1KHBfY29tbWFuZC0+c3JjX2FkZHJfaGkpLAorCQkJICBsZTMyX3RvX2NwdShwX2NvbW1hbmQtPnNyY19hZGRyX2xvKSwKKwkJCSAgbGUzMl90b19jcHUocF9jb21tYW5kLT5kc3RfYWRkcl9oaSksCisJCQkgIGxlMzJfdG9fY3B1KHBfY29tbWFuZC0+ZHN0X2FkZHJfbG8pKTsKIAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC00NTksMTMgKzQ0NCwxMyBAQAogCQkgICBORVRJRl9NU0dfSFcsCiAJCSAgICJQb3N0aW5nIERNQUUgY29tbWFuZCBbaWR4ICVkXTogb3Bjb2RlID0gWzB4JTA4eCwweCUwNHhdIGxlbj0weCV4IHNyYz0weCV4OiV4IGRzdD0weCV4OiV4XG4iLAogCQkgICBpZHhfY21kLAotCQkgICBsZTMyX3RvX2NwdShjb21tYW5kLT5vcGNvZGUpLAotCQkgICBsZTE2X3RvX2NwdShjb21tYW5kLT5vcGNvZGVfYiksCi0JCSAgIGxlMTZfdG9fY3B1KGNvbW1hbmQtPmxlbmd0aF9kdyksCi0JCSAgIGxlMzJfdG9fY3B1KGNvbW1hbmQtPnNyY19hZGRyX2hpKSwKLQkJICAgbGUzMl90b19jcHUoY29tbWFuZC0+c3JjX2FkZHJfbG8pLAotCQkgICBsZTMyX3RvX2NwdShjb21tYW5kLT5kc3RfYWRkcl9oaSksCi0JCSAgIGxlMzJfdG9fY3B1KGNvbW1hbmQtPmRzdF9hZGRyX2xvKSk7CisJCSAgIGxlMzJfdG9fY3B1KHBfY29tbWFuZC0+b3Bjb2RlKSwKKwkJICAgbGUxNl90b19jcHUocF9jb21tYW5kLT5vcGNvZGVfYiksCisJCSAgIGxlMTZfdG9fY3B1KHBfY29tbWFuZC0+bGVuZ3RoX2R3KSwKKwkJICAgbGUzMl90b19jcHUocF9jb21tYW5kLT5zcmNfYWRkcl9oaSksCisJCSAgIGxlMzJfdG9fY3B1KHBfY29tbWFuZC0+c3JjX2FkZHJfbG8pLAorCQkgICBsZTMyX3RvX2NwdShwX2NvbW1hbmQtPmRzdF9hZGRyX2hpKSwKKwkJICAgbGUzMl90b19jcHUocF9jb21tYW5kLT5kc3RfYWRkcl9sbykpOwogCiAJLyogQ29weSB0aGUgY29tbWFuZCB0byBETUFFIC0gbmVlZCB0byBkbyBpdCBiZWZvcmUgZXZlcnkgY2FsbAogCSAqIGZvciBzb3VyY2UvZGVzdCBhZGRyZXNzIG5vIHJlc2V0LgpAQCAtNDc1LDcgKzQ2MCw3IEBACiAJICovCiAJZm9yIChpID0gMDsgaSA8IERNQUVfQ01EX1NJWkU7IGkrKykgewogCQl1MzIgZGF0YSA9IChpIDwgRE1BRV9DTURfU0laRV9UT19GSUxMKSA/Ci0JCQkgICAqKCgodTMyICopY29tbWFuZCkgKyBpKSA6IDA7CisJCQkgICAqKCgodTMyICopcF9jb21tYW5kKSArIGkpIDogMDsKIAogCQlxZWRfd3IocF9od2ZuLCBwX3B0dCwKIAkJICAgICAgIERNQUVfUkVHX0NNRF9NRU0gKwpAQCAtNDgzLDkgKzQ2OCw3IEBACiAJCSAgICAgICAoaSAqIHNpemVvZih1MzIpKSwgZGF0YSk7CiAJfQogCi0JcWVkX3dyKHBfaHdmbiwgcF9wdHQsCi0JICAgICAgIHFlZF9kbWFlX2lkeF90b19nb19jbWQoaWR4X2NtZCksCi0JICAgICAgIERNQUVfR09fVkFMVUUpOworCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBxZWRfZG1hZV9pZHhfdG9fZ29fY21kKGlkeF9jbWQpLCBETUFFX0dPX1ZBTFVFKTsKIAogCXJldHVybiBxZWRfc3RhdHVzOwogfQpAQCAtNDk4LDMxICs0ODEsMjMgQEAKIAl1MzIgKipwX2NvbXAgPSAmcF9od2ZuLT5kbWFlX2luZm8ucF9jb21wbGV0aW9uX3dvcmQ7CiAKIAkqcF9jb21wID0gZG1hX2FsbG9jX2NvaGVyZW50KCZwX2h3Zm4tPmNkZXYtPnBkZXYtPmRldiwKLQkJCQkgICAgIHNpemVvZih1MzIpLAotCQkJCSAgICAgcF9hZGRyLAotCQkJCSAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCEqcF9jb21wKSB7Ci0JCURQX05PVElDRShwX2h3Zm4sICJGYWlsZWQgdG8gYWxsb2NhdGUgYHBfY29tcGxldGlvbl93b3JkJ1xuIik7CisJCQkJICAgICBzaXplb2YodTMyKSwgcF9hZGRyLCBHRlBfS0VSTkVMKTsKKwlpZiAoISpwX2NvbXApCiAJCWdvdG8gZXJyOwotCX0KIAogCXBfYWRkciA9ICZwX2h3Zm4tPmRtYWVfaW5mby5kbWFlX2NtZF9waHlzX2FkZHI7CiAJKnBfY21kID0gZG1hX2FsbG9jX2NvaGVyZW50KCZwX2h3Zm4tPmNkZXYtPnBkZXYtPmRldiwKIAkJCQkgICAgc2l6ZW9mKHN0cnVjdCBkbWFlX2NtZCksCiAJCQkJICAgIHBfYWRkciwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCEqcF9jbWQpIHsKLQkJRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBgc3RydWN0IGRtYWVfY21kJ1xuIik7CisJaWYgKCEqcF9jbWQpCiAJCWdvdG8gZXJyOwotCX0KIAogCXBfYWRkciA9ICZwX2h3Zm4tPmRtYWVfaW5mby5pbnRlcm1lZGlhdGVfYnVmZmVyX3BoeXNfYWRkcjsKIAkqcF9idWZmID0gZG1hX2FsbG9jX2NvaGVyZW50KCZwX2h3Zm4tPmNkZXYtPnBkZXYtPmRldiwKIAkJCQkgICAgIHNpemVvZih1MzIpICogRE1BRV9NQVhfUldfU0laRSwKIAkJCQkgICAgIHBfYWRkciwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCEqcF9idWZmKSB7Ci0JCURQX05PVElDRShwX2h3Zm4sICJGYWlsZWQgdG8gYWxsb2NhdGUgYGludGVybWVkaWF0ZV9idWZmZXInXG4iKTsKKwlpZiAoISpwX2J1ZmYpCiAJCWdvdG8gZXJyOwotCX0KIAogCXBfaHdmbi0+ZG1hZV9pbmZvLmNoYW5uZWwgPSBwX2h3Zm4tPnJlbF9wZl9pZDsKIApAQCAtNTQzLDggKzUxOCw3IEBACiAJCXBfcGh5cyA9IHBfaHdmbi0+ZG1hZV9pbmZvLmNvbXBsZXRpb25fd29yZF9waHlzX2FkZHI7CiAJCWRtYV9mcmVlX2NvaGVyZW50KCZwX2h3Zm4tPmNkZXYtPnBkZXYtPmRldiwKIAkJCQkgIHNpemVvZih1MzIpLAotCQkJCSAgcF9od2ZuLT5kbWFlX2luZm8ucF9jb21wbGV0aW9uX3dvcmQsCi0JCQkJICBwX3BoeXMpOworCQkJCSAgcF9od2ZuLT5kbWFlX2luZm8ucF9jb21wbGV0aW9uX3dvcmQsIHBfcGh5cyk7CiAJCXBfaHdmbi0+ZG1hZV9pbmZvLnBfY29tcGxldGlvbl93b3JkID0gTlVMTDsKIAl9CiAKQEAgLTU1Miw4ICs1MjYsNyBAQAogCQlwX3BoeXMgPSBwX2h3Zm4tPmRtYWVfaW5mby5kbWFlX2NtZF9waHlzX2FkZHI7CiAJCWRtYV9mcmVlX2NvaGVyZW50KCZwX2h3Zm4tPmNkZXYtPnBkZXYtPmRldiwKIAkJCQkgIHNpemVvZihzdHJ1Y3QgZG1hZV9jbWQpLAotCQkJCSAgcF9od2ZuLT5kbWFlX2luZm8ucF9kbWFlX2NtZCwKLQkJCQkgIHBfcGh5cyk7CisJCQkJICBwX2h3Zm4tPmRtYWVfaW5mby5wX2RtYWVfY21kLCBwX3BoeXMpOwogCQlwX2h3Zm4tPmRtYWVfaW5mby5wX2RtYWVfY21kID0gTlVMTDsKIAl9CiAKQEAgLTU3MSw5ICs1NDQsNyBAQAogCiBzdGF0aWMgaW50IHFlZF9kbWFlX29wZXJhdGlvbl93YWl0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuKQogewotCXUzMiB3YWl0X2NudCA9IDA7Ci0JdTMyIHdhaXRfY250X2xpbWl0ID0gMTAwMDA7Ci0KKwl1MzIgd2FpdF9jbnRfbGltaXQgPSAxMDAwMCwgd2FpdF9jbnQgPSAwOwogCWludCBxZWRfc3RhdHVzID0gMDsKIAogCWJhcnJpZXIoKTsKQEAgLTYwNiw3ICs1NzcsNyBAQAogCQkJCQkgIHU2NCBkc3RfYWRkciwKIAkJCQkJICB1OCBzcmNfdHlwZSwKIAkJCQkJICB1OCBkc3RfdHlwZSwKLQkJCQkJICB1MzIgbGVuZ3RoKQorCQkJCQkgIHUzMiBsZW5ndGhfZHcpCiB7CiAJZG1hX2FkZHJfdCBwaHlzID0gcF9od2ZuLT5kbWFlX2luZm8uaW50ZXJtZWRpYXRlX2J1ZmZlcl9waHlzX2FkZHI7CiAJc3RydWN0IGRtYWVfY21kICpjbWQgPSBwX2h3Zm4tPmRtYWVfaW5mby5wX2RtYWVfY21kOwpAQCAtNjI0LDcgKzU5NSw3IEBACiAJCWNtZC0+c3JjX2FkZHJfbG8gPSBjcHVfdG9fbGUzMihsb3dlcl8zMl9iaXRzKHBoeXMpKTsKIAkJbWVtY3B5KCZwX2h3Zm4tPmRtYWVfaW5mby5wX2ludGVybWVkaWF0ZV9idWZmZXJbMF0sCiAJCSAgICAgICAodm9pZCAqKSh1aW50cHRyX3Qpc3JjX2FkZHIsCi0JCSAgICAgICBsZW5ndGggKiBzaXplb2YodTMyKSk7CisJCSAgICAgICBsZW5ndGhfZHcgKiBzaXplb2YodTMyKSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNjQ1LDcgKzYxNiw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWNtZC0+bGVuZ3RoX2R3ID0gY3B1X3RvX2xlMTYoKHUxNilsZW5ndGgpOworCWNtZC0+bGVuZ3RoX2R3ID0gY3B1X3RvX2xlMTYoKHUxNilsZW5ndGhfZHcpOwogCiAJcWVkX2RtYWVfcG9zdF9jb21tYW5kKHBfaHdmbiwgcF9wdHQpOwogCkBAIC02NTQsMTYgKzYyNSwxNCBAQAogCWlmIChxZWRfc3RhdHVzKSB7CiAJCURQX05PVElDRShwX2h3Zm4sCiAJCQkgICJxZWRfZG1hZV9ob3N0MmdyYzogV2FpdCBGYWlsZWQuIHNvdXJjZV9hZGRyIDB4JWxseCwgZ3JjX2FkZHIgMHglbGx4LCBzaXplX2luX2R3b3JkcyAweCV4XG4iLAotCQkJICBzcmNfYWRkciwKLQkJCSAgZHN0X2FkZHIsCi0JCQkgIGxlbmd0aCk7CisJCQkgIHNyY19hZGRyLCBkc3RfYWRkciwgbGVuZ3RoX2R3KTsKIAkJcmV0dXJuIHFlZF9zdGF0dXM7CiAJfQogCiAJaWYgKGRzdF90eXBlID09IFFFRF9ETUFFX0FERFJFU1NfSE9TVF9WSVJUKQogCQltZW1jcHkoKHZvaWQgKikodWludHB0cl90KShkc3RfYWRkciksCiAJCSAgICAgICAmcF9od2ZuLT5kbWFlX2luZm8ucF9pbnRlcm1lZGlhdGVfYnVmZmVyWzBdLAotCQkgICAgICAgbGVuZ3RoICogc2l6ZW9mKHUzMikpOworCQkgICAgICAgbGVuZ3RoX2R3ICogc2l6ZW9mKHUzMikpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03MzAsMTAgKzY5OSw3IEBACiAJCWlmIChxZWRfc3RhdHVzKSB7CiAJCQlEUF9OT1RJQ0UocF9od2ZuLAogCQkJCSAgInFlZF9kbWFlX2V4ZWN1dGVfc3ViX29wZXJhdGlvbiBGYWlsZWQgd2l0aCBlcnJvciAweCV4LiBzb3VyY2VfYWRkciAweCVsbHgsIGRlc3RpbmF0aW9uIGFkZHIgMHglbGx4LCBzaXplX2luX2R3b3JkcyAweCV4XG4iLAotCQkJCSAgcWVkX3N0YXR1cywKLQkJCQkgIHNyY19hZGRyLAotCQkJCSAgZHN0X2FkZHIsCi0JCQkJICBsZW5ndGhfY3VyKTsKKwkJCQkgIHFlZF9zdGF0dXMsIHNyY19hZGRyLCBkc3RfYWRkciwgbGVuZ3RoX2N1cik7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTc0MywxMCArNzA5LDcgQEAKIAogaW50IHFlZF9kbWFlX2hvc3QyZ3JjKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAogCQkgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCi0JCSAgICAgIHU2NCBzb3VyY2VfYWRkciwKLQkJICAgICAgdTMyIGdyY19hZGRyLAotCQkgICAgICB1MzIgc2l6ZV9pbl9kd29yZHMsCi0JCSAgICAgIHUzMiBmbGFncykKKwkJICB1NjQgc291cmNlX2FkZHIsIHUzMiBncmNfYWRkciwgdTMyIHNpemVfaW5fZHdvcmRzLCB1MzIgZmxhZ3MpCiB7CiAJdTMyIGdyY19hZGRyX2luX2R3ID0gZ3JjX2FkZHIgLyBzaXplb2YodTMyKTsKIAlzdHJ1Y3QgcWVkX2RtYWVfcGFyYW1zIHBhcmFtczsKQEAgLTc2OCw5ICs3MzEsMTAgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludAotcWVkX2RtYWVfZ3JjMmhvc3Qoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgdTMyIGdyY19hZGRyLAotCQkgIGRtYV9hZGRyX3QgZGVzdF9hZGRyLCB1MzIgc2l6ZV9pbl9kd29yZHMsIHUzMiBmbGFncykKK2ludCBxZWRfZG1hZV9ncmMyaG9zdChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkgICAgICB1MzIgZ3JjX2FkZHIsCisJCSAgICAgIGRtYV9hZGRyX3QgZGVzdF9hZGRyLCB1MzIgc2l6ZV9pbl9kd29yZHMsIHUzMiBmbGFncykKIHsKIAl1MzIgZ3JjX2FkZHJfaW5fZHcgPSBncmNfYWRkciAvIHNpemVvZih1MzIpOwogCXN0cnVjdCBxZWRfZG1hZV9wYXJhbXMgcGFyYW1zOwpAQCAtNzkxLDEyICs3NTUsMTEgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludAotcWVkX2RtYWVfaG9zdDJob3N0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCi0JCSAgIGRtYV9hZGRyX3Qgc291cmNlX2FkZHIsCi0JCSAgIGRtYV9hZGRyX3QgZGVzdF9hZGRyLAotCQkgICB1MzIgc2l6ZV9pbl9kd29yZHMsIHN0cnVjdCBxZWRfZG1hZV9wYXJhbXMgKnBfcGFyYW1zKQoraW50IHFlZF9kbWFlX2hvc3QyaG9zdChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJICAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJICAgICAgIGRtYV9hZGRyX3Qgc291cmNlX2FkZHIsCisJCSAgICAgICBkbWFfYWRkcl90IGRlc3RfYWRkciwKKwkJICAgICAgIHUzMiBzaXplX2luX2R3b3Jkcywgc3RydWN0IHFlZF9kbWFlX3BhcmFtcyAqcF9wYXJhbXMpCiB7CiAJaW50IHJjOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9pbml0X29wcy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfaW5pdF9vcHMuYwppbmRleCA5ODY2YTIwLi5kNTY3YmE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9pbml0X29wcy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2luaXRfb3BzLmMKQEAgLTU5LDE3ICs1OSwxNCBAQAogCQlwX2h3Zm4tPnJ0X2RhdGEuYl92YWxpZFtpXSA9IGZhbHNlOwogfQogCi12b2lkIHFlZF9pbml0X3N0b3JlX3J0X3JlZyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCSAgIHUzMiBydF9vZmZzZXQsCi0JCQkgICB1MzIgdmFsKQordm9pZCBxZWRfaW5pdF9zdG9yZV9ydF9yZWcoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHUzMiBydF9vZmZzZXQsIHUzMiB2YWwpCiB7CiAJcF9od2ZuLT5ydF9kYXRhLmluaXRfdmFsW3J0X29mZnNldF0gPSB2YWw7CiAJcF9od2ZuLT5ydF9kYXRhLmJfdmFsaWRbcnRfb2Zmc2V0XSA9IHRydWU7CiB9CiAKIHZvaWQgcWVkX2luaXRfc3RvcmVfcnRfYWdnKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJICAgdTMyIHJ0X29mZnNldCwgdTMyICpwX3ZhbCwKLQkJCSAgIHNpemVfdCBzaXplKQorCQkJICAgdTMyIHJ0X29mZnNldCwgdTMyICpwX3ZhbCwgc2l6ZV90IHNpemUpCiB7CiAJc2l6ZV90IGk7CiAKQEAgLTgxLDEwICs3OCw3IEBACiAKIHN0YXRpYyBpbnQgcWVkX2luaXRfcnQoc3RydWN0IHFlZF9od2ZuCSpwX2h3Zm4sCiAJCSAgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCi0JCSAgICAgICB1MzIgYWRkciwKLQkJICAgICAgIHUxNiBydF9vZmZzZXQsCi0JCSAgICAgICB1MTYgc2l6ZSwKLQkJICAgICAgIGJvb2wgYl9tdXN0X2RtYWUpCisJCSAgICAgICB1MzIgYWRkciwgdTE2IHJ0X29mZnNldCwgdTE2IHNpemUsIGJvb2wgYl9tdXN0X2RtYWUpCiB7CiAJdTMyICpwX2luaXRfdmFsID0gJnBfaHdmbi0+cnRfZGF0YS5pbml0X3ZhbFtydF9vZmZzZXRdOwogCWJvb2wgKnBfdmFsaWQgPSAmcF9od2ZuLT5ydF9kYXRhLmJfdmFsaWRbcnRfb2Zmc2V0XTsKQEAgLTEwMiw4ICs5Niw3IEBACiAJCSAqIHNpbXBseSB3cml0ZSB0aGUgZGF0YSBpbnN0ZWFkIG9mIHVzaW5nIGRtYWUuCiAJCSAqLwogCQlpZiAoIWJfbXVzdF9kbWFlKSB7Ci0JCQlxZWRfd3IocF9od2ZuLCBwX3B0dCwgYWRkciArIChpIDw8IDIpLAotCQkJICAgICAgIHBfaW5pdF92YWxbaV0pOworCQkJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIGFkZHIgKyAoaSA8PCAyKSwgcF9pbml0X3ZhbFtpXSk7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC0xMTUsNyArMTA4LDcgQEAKIAkJcmMgPSBxZWRfZG1hZV9ob3N0MmdyYyhwX2h3Zm4sIHBfcHR0LAogCQkJCSAgICAgICAodWludHB0cl90KShwX2luaXRfdmFsICsgaSksCiAJCQkJICAgICAgIGFkZHIgKyAoaSA8PCAyKSwgc2VnbWVudCwgMCk7Ci0JCWlmIChyYyAhPSAwKQorCQlpZiAocmMpCiAJCQlyZXR1cm4gcmM7CiAKIAkJLyogSnVtcCBvdmVyIHRoZSBlbnRpcmUgc2VnbWVudCwgaW5jbHVkaW5nIGludmFsaWQgZW50cnkgKi8KQEAgLTE4Miw5ICsxNzUsNyBAQAogCiBzdGF0aWMgaW50IHFlZF9pbml0X2ZpbGxfZG1hZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKIAkJCSAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKLQkJCSAgICAgIHUzMiBhZGRyLAotCQkJICAgICAgdTMyIGZpbGwsCi0JCQkgICAgICB1MzIgZmlsbF9jb3VudCkKKwkJCSAgICAgIHUzMiBhZGRyLCB1MzIgZmlsbCwgdTMyIGZpbGxfY291bnQpCiB7CiAJc3RhdGljIHUzMiB6ZXJvX2J1ZmZlcltETUFFX01BWF9SV19TSVpFXTsKIApAQCAtMTk5LDE1ICsxOTAsMTIgQEAKIAogCXJldHVybiBxZWRfZG1hZV9ob3N0MmdyYyhwX2h3Zm4sIHBfcHR0LAogCQkJCSAodWludHB0cl90KSgmemVyb19idWZmZXJbMF0pLAotCQkJCSBhZGRyLCBmaWxsX2NvdW50LAotCQkJCSBRRURfRE1BRV9GTEFHX1JXX1JFUExfU1JDKTsKKwkJCQkgYWRkciwgZmlsbF9jb3VudCwgUUVEX0RNQUVfRkxBR19SV19SRVBMX1NSQyk7CiB9CiAKIHN0YXRpYyB2b2lkIHFlZF9pbml0X2ZpbGwoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCiAJCQkgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKLQkJCSAgdTMyIGFkZHIsCi0JCQkgIHUzMiBmaWxsLAotCQkJICB1MzIgZmlsbF9jb3VudCkKKwkJCSAgdTMyIGFkZHIsIHUzMiBmaWxsLCB1MzIgZmlsbF9jb3VudCkKIHsKIAl1MzIgaTsKIApAQCAtMjE4LDEyICsyMDYsMTIgQEAKIHN0YXRpYyBpbnQgcWVkX2luaXRfY21kX2FycmF5KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAogCQkJICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAogCQkJICAgICAgc3RydWN0IGluaXRfd3JpdGVfb3AgKmNtZCwKLQkJCSAgICAgIGJvb2wgYl9tdXN0X2RtYWUsCi0JCQkgICAgICBib29sIGJfY2FuX2RtYWUpCisJCQkgICAgICBib29sIGJfbXVzdF9kbWFlLCBib29sIGJfY2FuX2RtYWUpCiB7CisJdTMyIGRtYWVfYXJyYXlfb2Zmc2V0ID0gbGUzMl90b19jcHUoY21kLT5hcmdzLmFycmF5X29mZnNldCk7CiAJdTMyIGRhdGEgPSBsZTMyX3RvX2NwdShjbWQtPmRhdGEpOwogCXUzMiBhZGRyID0gR0VUX0ZJRUxEKGRhdGEsIElOSVRfV1JJVEVfT1BfQUREUkVTUykgPDwgMjsKLQl1MzIgZG1hZV9hcnJheV9vZmZzZXQgPSBsZTMyX3RvX2NwdShjbWQtPmFyZ3MuYXJyYXlfb2Zmc2V0KTsKKwogCXUzMiBvZmZzZXQsIG91dHB1dF9sZW4sIGlucHV0X2xlbiwgbWF4X3NpemU7CiAJc3RydWN0IHFlZF9kZXYgKmNkZXYgPSBwX2h3Zm4tPmNkZXY7CiAJdW5pb24gaW5pdF9hcnJheV9oZHIgKmhkcjsKQEAgLTIzMyw4ICsyMjEsNyBAQAogCiAJYXJyYXlfZGF0YSA9IGNkZXYtPmZ3X2RhdGEtPmFycl9kYXRhOwogCi0JaGRyID0gKHVuaW9uIGluaXRfYXJyYXlfaGRyICopKGFycmF5X2RhdGEgKwotCQkJCSAgICAgICBkbWFlX2FycmF5X29mZnNldCk7CisJaGRyID0gKHVuaW9uIGluaXRfYXJyYXlfaGRyICopKGFycmF5X2RhdGEgKyBkbWFlX2FycmF5X29mZnNldCk7CiAJZGF0YSA9IGxlMzJfdG9fY3B1KGhkci0+cmF3LmRhdGEpOwogCXN3aXRjaCAoR0VUX0ZJRUxEKGRhdGEsIElOSVRfQVJSQVlfUkFXX0hEUl9UWVBFKSkgewogCWNhc2UgSU5JVF9BUlJfWklQUEVEOgpAQCAtMjkwLDEzICsyNzcsMTIgQEAKIC8qIGluaXRfb3BzIHdyaXRlIGNvbW1hbmQgKi8KIHN0YXRpYyBpbnQgcWVkX2luaXRfY21kX3dyKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAogCQkJICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAotCQkJICAgc3RydWN0IGluaXRfd3JpdGVfb3AgKmNtZCwKLQkJCSAgIGJvb2wgYl9jYW5fZG1hZSkKKwkJCSAgIHN0cnVjdCBpbml0X3dyaXRlX29wICpwX2NtZCwgYm9vbCBiX2Nhbl9kbWFlKQogewotCXUzMiBkYXRhID0gbGUzMl90b19jcHUoY21kLT5kYXRhKTsKLQl1MzIgYWRkciA9IEdFVF9GSUVMRChkYXRhLCBJTklUX1dSSVRFX09QX0FERFJFU1MpIDw8IDI7CisJdTMyIGRhdGEgPSBsZTMyX3RvX2NwdShwX2NtZC0+ZGF0YSk7CiAJYm9vbCBiX211c3RfZG1hZSA9IEdFVF9GSUVMRChkYXRhLCBJTklUX1dSSVRFX09QX1dJREVfQlVTKTsKLQl1bmlvbiBpbml0X3dyaXRlX2FyZ3MgKmFyZyA9ICZjbWQtPmFyZ3M7CisJdTMyIGFkZHIgPSBHRVRfRklFTEQoZGF0YSwgSU5JVF9XUklURV9PUF9BRERSRVNTKSA8PCAyOworCXVuaW9uIGluaXRfd3JpdGVfYXJncyAqYXJnID0gJnBfY21kLT5hcmdzOwogCWludCByYyA9IDA7CiAKIAkvKiBTYW5pdGl6ZSAqLwpAQCAtMzA5LDIwICsyOTUsMTggQEAKIAogCXN3aXRjaCAoR0VUX0ZJRUxEKGRhdGEsIElOSVRfV1JJVEVfT1BfU09VUkNFKSkgewogCWNhc2UgSU5JVF9TUkNfSU5MSU5FOgotCQlxZWRfd3IocF9od2ZuLCBwX3B0dCwgYWRkciwKLQkJICAgICAgIGxlMzJfdG9fY3B1KGFyZy0+aW5saW5lX3ZhbCkpOworCQlkYXRhID0gbGUzMl90b19jcHUocF9jbWQtPmFyZ3MuaW5saW5lX3ZhbCk7CisJCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAJY2FzZSBJTklUX1NSQ19aRVJPUzoKLQkJaWYgKGJfbXVzdF9kbWFlIHx8Ci0JCSAgICAoYl9jYW5fZG1hZSAmJiAobGUzMl90b19jcHUoYXJnLT56ZXJvc19jb3VudCkgPj0gNjQpKSkKLQkJCXJjID0gcWVkX2luaXRfZmlsbF9kbWFlKHBfaHdmbiwgcF9wdHQsIGFkZHIsIDAsCi0JCQkJCQlsZTMyX3RvX2NwdShhcmctPnplcm9zX2NvdW50KSk7CisJCWRhdGEgPSBsZTMyX3RvX2NwdShwX2NtZC0+YXJncy56ZXJvc19jb3VudCk7CisJCWlmIChiX211c3RfZG1hZSB8fCAoYl9jYW5fZG1hZSAmJiAoZGF0YSA+PSA2NCkpKQorCQkJcmMgPSBxZWRfaW5pdF9maWxsX2RtYWUocF9od2ZuLCBwX3B0dCwgYWRkciwgMCwgZGF0YSk7CiAJCWVsc2UKLQkJCXFlZF9pbml0X2ZpbGwocF9od2ZuLCBwX3B0dCwgYWRkciwgMCwKLQkJCQkgICAgICBsZTMyX3RvX2NwdShhcmctPnplcm9zX2NvdW50KSk7CisJCQlxZWRfaW5pdF9maWxsKHBfaHdmbiwgcF9wdHQsIGFkZHIsIDAsIGRhdGEpOwogCQlicmVhazsKIAljYXNlIElOSVRfU1JDX0FSUkFZOgotCQlyYyA9IHFlZF9pbml0X2NtZF9hcnJheShwX2h3Zm4sIHBfcHR0LCBjbWQsCisJCXJjID0gcWVkX2luaXRfY21kX2FycmF5KHBfaHdmbiwgcF9wdHQsIHBfY21kLAogCQkJCQliX211c3RfZG1hZSwgYl9jYW5fZG1hZSk7CiAJCWJyZWFrOwogCWNhc2UgSU5JVF9TUkNfUlVOVElNRToKQEAgLTM1Myw4ICszMzcsNyBAQAogCiAvKiBpbml0X29wcyByZWFkL3BvbGwgY29tbWFuZHMgKi8KIHN0YXRpYyB2b2lkIHFlZF9pbml0X2NtZF9yZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCSAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCi0JCQkgICAgc3RydWN0IGluaXRfcmVhZF9vcCAqY21kKQorCQkJICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgc3RydWN0IGluaXRfcmVhZF9vcCAqY21kKQogewogCWJvb2wgKCpjb21wX2NoZWNrKSh1MzIgdmFsLCB1MzIgZXhwZWN0ZWRfdmFsKTsKIAl1MzIgZGVsYXkgPSBRRURfSU5JVF9QT0xMX1BFUklPRF9VUywgdmFsOwpAQCAtNDEyLDM1ICszOTUsMzMgQEAKIH0KIAogc3RhdGljIHU4IHFlZF9pbml0X2NtZF9tb2RlX21hdGNoKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJCSAgdTE2ICpvZmZzZXQsCi0JCQkJICBpbnQgbW9kZXMpCisJCQkJICB1MTYgKnBfb2Zmc2V0LCBpbnQgbW9kZXMpCiB7CiAJc3RydWN0IHFlZF9kZXYgKmNkZXYgPSBwX2h3Zm4tPmNkZXY7CiAJY29uc3QgdTggKm1vZGVzX3RyZWVfYnVmOwogCXU4IGFyZzEsIGFyZzIsIHRyZWVfdmFsOwogCiAJbW9kZXNfdHJlZV9idWYgPSBjZGV2LT5md19kYXRhLT5tb2Rlc190cmVlX2J1ZjsKLQl0cmVlX3ZhbCA9IG1vZGVzX3RyZWVfYnVmWygqb2Zmc2V0KSsrXTsKKwl0cmVlX3ZhbCA9IG1vZGVzX3RyZWVfYnVmWygqcF9vZmZzZXQpKytdOwogCXN3aXRjaCAodHJlZV92YWwpIHsKIAljYXNlIElOSVRfTU9ERV9PUF9OT1Q6Ci0JCXJldHVybiBxZWRfaW5pdF9jbWRfbW9kZV9tYXRjaChwX2h3Zm4sIG9mZnNldCwgbW9kZXMpIF4gMTsKKwkJcmV0dXJuIHFlZF9pbml0X2NtZF9tb2RlX21hdGNoKHBfaHdmbiwgcF9vZmZzZXQsIG1vZGVzKSBeIDE7CiAJY2FzZSBJTklUX01PREVfT1BfT1I6Ci0JCWFyZzEJPSBxZWRfaW5pdF9jbWRfbW9kZV9tYXRjaChwX2h3Zm4sIG9mZnNldCwgbW9kZXMpOwotCQlhcmcyCT0gcWVkX2luaXRfY21kX21vZGVfbWF0Y2gocF9od2ZuLCBvZmZzZXQsIG1vZGVzKTsKKwkJYXJnMSA9IHFlZF9pbml0X2NtZF9tb2RlX21hdGNoKHBfaHdmbiwgcF9vZmZzZXQsIG1vZGVzKTsKKwkJYXJnMiA9IHFlZF9pbml0X2NtZF9tb2RlX21hdGNoKHBfaHdmbiwgcF9vZmZzZXQsIG1vZGVzKTsKIAkJcmV0dXJuIGFyZzEgfCBhcmcyOwogCWNhc2UgSU5JVF9NT0RFX09QX0FORDoKLQkJYXJnMQk9IHFlZF9pbml0X2NtZF9tb2RlX21hdGNoKHBfaHdmbiwgb2Zmc2V0LCBtb2Rlcyk7Ci0JCWFyZzIJPSBxZWRfaW5pdF9jbWRfbW9kZV9tYXRjaChwX2h3Zm4sIG9mZnNldCwgbW9kZXMpOworCQlhcmcxID0gcWVkX2luaXRfY21kX21vZGVfbWF0Y2gocF9od2ZuLCBwX29mZnNldCwgbW9kZXMpOworCQlhcmcyID0gcWVkX2luaXRfY21kX21vZGVfbWF0Y2gocF9od2ZuLCBwX29mZnNldCwgbW9kZXMpOwogCQlyZXR1cm4gYXJnMSAmIGFyZzI7CiAJZGVmYXVsdDoKIAkJdHJlZV92YWwgLT0gTUFYX0lOSVRfTU9ERV9PUFM7Ci0JCXJldHVybiAobW9kZXMgJiAoMSA8PCB0cmVlX3ZhbCkpID8gMSA6IDA7CisJCXJldHVybiAobW9kZXMgJiBCSVQodHJlZV92YWwpKSA/IDEgOiAwOwogCX0KIH0KIAogc3RhdGljIHUzMiBxZWRfaW5pdF9jbWRfbW9kZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCSAgICAgc3RydWN0IGluaXRfaWZfbW9kZV9vcCAqcF9jbWQsCi0JCQkgICAgIGludCBtb2RlcykKKwkJCSAgICAgc3RydWN0IGluaXRfaWZfbW9kZV9vcCAqcF9jbWQsIGludCBtb2RlcykKIHsKIAl1MTYgb2Zmc2V0ID0gbGUxNl90b19jcHUocF9jbWQtPm1vZGVzX2J1Zl9vZmZzZXQpOwogCkBAIC00NTMsOCArNDM0LDcgQEAKIAogc3RhdGljIHUzMiBxZWRfaW5pdF9jbWRfcGhhc2Uoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCiAJCQkgICAgICBzdHJ1Y3QgaW5pdF9pZl9waGFzZV9vcCAqcF9jbWQsCi0JCQkgICAgICB1MzIgcGhhc2UsCi0JCQkgICAgICB1MzIgcGhhc2VfaWQpCisJCQkgICAgICB1MzIgcGhhc2UsIHUzMiBwaGFzZV9pZCkKIHsKIAl1MzIgZGF0YSA9IGxlMzJfdG9fY3B1KHBfY21kLT5waGFzZV9kYXRhKTsKIAl1MzIgb3BfZGF0YSA9IGxlMzJfdG9fY3B1KHBfY21kLT5vcF9kYXRhKTsKQEAgLTQ2OCwxMCArNDQ4LDcgQEAKIH0KIAogaW50IHFlZF9pbml0X3J1bihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKLQkJIGludCBwaGFzZSwKLQkJIGludCBwaGFzZV9pZCwKLQkJIGludCBtb2RlcykKKwkJIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgaW50IHBoYXNlLCBpbnQgcGhhc2VfaWQsIGludCBtb2RlcykKIHsKIAlzdHJ1Y3QgcWVkX2RldiAqY2RldiA9IHBfaHdmbi0+Y2RldjsKIAl1MzIgY21kX251bSwgbnVtX2luaXRfb3BzOwpAQCAtNDgzLDEwICs0NjAsOCBAQAogCWluaXRfb3BzID0gY2Rldi0+ZndfZGF0YS0+aW5pdF9vcHM7CiAKIAlwX2h3Zm4tPnVuemlwX2J1ZiA9IGt6YWxsb2MoTUFYX1pJUFBFRF9TSVpFICogNCwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwX2h3Zm4tPnVuemlwX2J1ZikgewotCQlEUF9OT1RJQ0UocF9od2ZuLCAiRmFpbGVkIHRvIGFsbG9jYXRlIHVuemlwIGJ1ZmZlclxuIik7CisJaWYgKCFwX2h3Zm4tPnVuemlwX2J1ZikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJZm9yIChjbWRfbnVtID0gMDsgY21kX251bSA8IG51bV9pbml0X29wczsgY21kX251bSsrKSB7CiAJCXVuaW9uIGluaXRfb3AgKmNtZCA9ICZpbml0X29wc1tjbWRfbnVtXTsKQEAgLTU1Nyw3ICs1MzIsNyBAQAogCS8qIEZpcnN0IER3b3JkIGNvbnRhaW5zIG1ldGFkYXRhIGFuZCBzaG91bGQgYmUgc2tpcHBlZCAqLwogCWJ1Zl9oZHIgPSAoc3RydWN0IGJpbl9idWZmZXJfaGRyICopKGRhdGEgKyBzaXplb2YodTMyKSk7CiAKLQlvZmZzZXQgPSBidWZfaGRyW0JJTl9CVUZfRldfVkVSX0lORk9dLm9mZnNldDsKKwlvZmZzZXQgPSBidWZfaGRyW0JJTl9CVUZfSU5JVF9GV19WRVJfSU5GT10ub2Zmc2V0OwogCWZ3LT5md192ZXJfaW5mbyA9IChzdHJ1Y3QgZndfdmVyX2luZm8gKikoZGF0YSArIG9mZnNldCk7CiAKIAlvZmZzZXQgPSBidWZfaGRyW0JJTl9CVUZfSU5JVF9DTURdLm9mZnNldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2ludC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfaW50LmMKaW5kZXggOGZhNTBmYS4uMmFkZWRjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfaW50LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfaW50LmMKQEAgLTE3NzUsMTAgKzE3NzUsOSBAQAogfTsKIAogc3RhdGljIGlubGluZSB1MTYgcWVkX2F0dG5fdXBkYXRlX2lkeChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCQkgICAgICBzdHJ1Y3QgcWVkX3NiX2F0dG5faW5mbyAgICpwX3NiX2Rlc2MpCisJCQkJICAgICAgc3RydWN0IHFlZF9zYl9hdHRuX2luZm8gKnBfc2JfZGVzYykKIHsKLQl1MTYgICAgIHJjID0gMDsKLQl1MTYgICAgIGluZGV4OworCXUxNiByYyA9IDAsIGluZGV4OwogCiAJLyogTWFrZSBjZXJ0YWluIEhXIHdyaXRlIHRvb2sgYWZmZWN0ICovCiAJbW1pb3diKCk7CkBAIC0xODAyLDE1ICsxODAxLDEzIEBACiAgKiAgQHBhcmFtIGFzc2VydGVkX2JpdHMgbmV3bHkgYXNzZXJ0ZWQgYml0cwogICogIEByZXR1cm4gaW50CiAgKi8KLXN0YXRpYyBpbnQgcWVkX2ludF9hc3NlcnRpb24oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCQkgICAgIHUxNiBhc3NlcnRlZF9iaXRzKQorc3RhdGljIGludCBxZWRfaW50X2Fzc2VydGlvbihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgdTE2IGFzc2VydGVkX2JpdHMpCiB7CiAJc3RydWN0IHFlZF9zYl9hdHRuX2luZm8gKnNiX2F0dG5fc3cgPSBwX2h3Zm4tPnBfc2JfYXR0bjsKIAl1MzIgaWd1X21hc2s7CiAKIAkvKiBNYXNrIHRoZSBzb3VyY2Ugb2YgdGhlIGF0dGVudGlvbiBpbiB0aGUgSUdVICovCi0JaWd1X21hc2sgPSBxZWRfcmQocF9od2ZuLCBwX2h3Zm4tPnBfZHBjX3B0dCwKLQkJCSAgSUdVX1JFR19BVFRFTlRJT05fRU5BQkxFKTsKKwlpZ3VfbWFzayA9IHFlZF9yZChwX2h3Zm4sIHBfaHdmbi0+cF9kcGNfcHR0LCBJR1VfUkVHX0FUVEVOVElPTl9FTkFCTEUpOwogCURQX1ZFUkJPU0UocF9od2ZuLCBORVRJRl9NU0dfSU5UUiwgIklHVSBtYXNrOiAweCUwOHggLS0+IDB4JTA4eFxuIiwKIAkJICAgaWd1X21hc2ssIGlndV9tYXNrICYgfihhc3NlcnRlZF9iaXRzICYgQVRUTl9CSVRTX01BU0tBQkxFKSk7CiAJaWd1X21hc2sgJj0gfihhc3NlcnRlZF9iaXRzICYgQVRUTl9CSVRTX01BU0tBQkxFKTsKQEAgLTIwNDEsNyArMjAzOCw3IEBACiAJCQlzdHJ1Y3QgYWV1X2ludmVydF9yZWdfYml0ICpwX2JpdCA9ICZwX2FldS0+Yml0c1tqXTsKIAogCQkJaWYgKChwX2JpdC0+ZmxhZ3MgJiBBVFRFTlRJT05fUEFSSVRZKSAmJgotCQkJICAgICEhKHBhcml0aWVzICYgKDEgPDwgYml0X2lkeCkpKQorCQkJICAgICEhKHBhcml0aWVzICYgQklUKGJpdF9pZHgpKSkKIAkJCQlxZWRfaW50X2RlYXNzZXJ0aW9uX3Bhcml0eShwX2h3Zm4sIHBfYml0LAogCQkJCQkJCSAgIGJpdF9pZHgpOwogCkBAIC0yMTE0LDggKzIxMTEsNyBAQAogCQkJCSAgICB+KCh1MzIpZGVhc3NlcnRlZF9iaXRzKSk7CiAKIAkvKiBVbm1hc2sgZGVhc3NlcnRlZCBhdHRlbnRpb25zIGluIElHVSAqLwotCWFldV9tYXNrID0gcWVkX3JkKHBfaHdmbiwgcF9od2ZuLT5wX2RwY19wdHQsCi0JCQkgIElHVV9SRUdfQVRURU5USU9OX0VOQUJMRSk7CisJYWV1X21hc2sgPSBxZWRfcmQocF9od2ZuLCBwX2h3Zm4tPnBfZHBjX3B0dCwgSUdVX1JFR19BVFRFTlRJT05fRU5BQkxFKTsKIAlhZXVfbWFzayB8PSAoZGVhc3NlcnRlZF9iaXRzICYgQVRUTl9CSVRTX01BU0tBQkxFKTsKIAlxZWRfd3IocF9od2ZuLCBwX2h3Zm4tPnBfZHBjX3B0dCwgSUdVX1JFR19BVFRFTlRJT05fRU5BQkxFLCBhZXVfbWFzayk7CiAKQEAgLTIxNjAsOCArMjE1Niw3IEBACiAJCQlpbmRleCwgYXR0bl9iaXRzLCBhdHRuX2Fja3MsIGFzc2VydGVkX2JpdHMsCiAJCQlkZWFzc2VydGVkX2JpdHMsIHBfc2JfYXR0bl9zdy0+a25vd25fYXR0bik7CiAJfSBlbHNlIGlmIChhc3NlcnRlZF9iaXRzID09IDB4MTAwKSB7Ci0JCURQX0lORk8ocF9od2ZuLAotCQkJIk1GVyBpbmRpY2F0aW9uIHZpYSBhdHRlbnRpb25cbiIpOworCQlEUF9JTkZPKHBfaHdmbiwgIk1GVyBpbmRpY2F0aW9uIHZpYSBhdHRlbnRpb25cbiIpOwogCX0gZWxzZSB7CiAJCURQX1ZFUkJPU0UocF9od2ZuLCBORVRJRl9NU0dfSU5UUiwKIAkJCSAgICJNRlcgaW5kaWNhdGlvbiBbZGVhc3NlcnRpb25dXG4iKTsKQEAgLTIxNzMsMTggKzIxNjgsMTQgQEAKIAkJCXJldHVybiByYzsKIAl9CiAKLQlpZiAoZGVhc3NlcnRlZF9iaXRzKSB7CisJaWYgKGRlYXNzZXJ0ZWRfYml0cykKIAkJcmMgPSBxZWRfaW50X2RlYXNzZXJ0aW9uKHBfaHdmbiwgZGVhc3NlcnRlZF9iaXRzKTsKLQkJaWYgKHJjKQotCQkJcmV0dXJuIHJjOwotCX0KIAogCXJldHVybiByYzsKIH0KIAogc3RhdGljIHZvaWQgcWVkX3NiX2Fja19hdHRuKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJICAgIHZvaWQgX19pb21lbSAqaWd1X2FkZHIsCi0JCQkgICAgdTMyIGFja19jb25zKQorCQkJICAgIHZvaWQgX19pb21lbSAqaWd1X2FkZHIsIHUzMiBhY2tfY29ucykKIHsKIAlzdHJ1Y3QgaWd1X3Byb2RfY29uc191cGRhdGUgaWd1X2FjayA9IHsgMCB9OwogCkBAIC0yMjQyLDkgKzIyMzMsOCBAQAogCiAJLyogR2F0aGVyIEludGVycnVwdHMvQXR0ZW50aW9ucyBpbmZvcm1hdGlvbiAqLwogCWlmICghc2JfaW5mby0+c2JfdmlydCkgewotCQlEUF9FUlIoCi0JCQlwX2h3Zm4tPmNkZXYsCi0JCQkiSW50ZXJydXB0IFN0YXR1cyBibG9jayBpcyBOVUxMIC0gY2Fubm90IGNoZWNrIGZvciBuZXcgaW50ZXJydXB0cyFcbiIpOworCQlEUF9FUlIocF9od2ZuLT5jZGV2LAorCQkgICAgICAgIkludGVycnVwdCBTdGF0dXMgYmxvY2sgaXMgTlVMTCAtIGNhbm5vdCBjaGVjayBmb3IgbmV3IGludGVycnVwdHMhXG4iKTsKIAl9IGVsc2UgewogCQl1MzIgdG1wX2luZGV4ID0gc2JfaW5mby0+c2JfYWNrOwogCkBAIC0yMjU1LDkgKzIyNDUsOCBAQAogCX0KIAogCWlmICghc2JfYXR0biB8fCAhc2JfYXR0bi0+c2JfYXR0bikgewotCQlEUF9FUlIoCi0JCQlwX2h3Zm4tPmNkZXYsCi0JCQkiQXR0ZW50aW9ucyBTdGF0dXMgYmxvY2sgaXMgTlVMTCAtIGNhbm5vdCBjaGVjayBmb3IgbmV3IGF0dGVudGlvbnMhXG4iKTsKKwkJRFBfRVJSKHBfaHdmbi0+Y2RldiwKKwkJICAgICAgICJBdHRlbnRpb25zIFN0YXR1cyBibG9jayBpcyBOVUxMIC0gY2Fubm90IGNoZWNrIGZvciBuZXcgYXR0ZW50aW9ucyFcbiIpOwogCX0gZWxzZSB7CiAJCXUxNiB0bXBfaW5kZXggPSBzYl9hdHRuLT5pbmRleDsKIApAQCAtMjMxMyw4ICsyMzAyLDcgQEAKIAlpZiAocF9zYi0+c2JfYXR0bikKIAkJZG1hX2ZyZWVfY29oZXJlbnQoJnBfaHdmbi0+Y2Rldi0+cGRldi0+ZGV2LAogCQkJCSAgU0JfQVRUTl9BTElHTkVEX1NJWkUocF9od2ZuKSwKLQkJCQkgIHBfc2ItPnNiX2F0dG4sCi0JCQkJICBwX3NiLT5zYl9waHlzKTsKKwkJCQkgIHBfc2ItPnNiX2F0dG4sIHBfc2ItPnNiX3BoeXMpOwogCWtmcmVlKHBfc2IpOwogfQogCkBAIC0yMzM3LDggKzIzMjUsNyBAQAogCiBzdGF0aWMgdm9pZCBxZWRfaW50X3NiX2F0dG5faW5pdChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKIAkJCQkgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAotCQkJCSB2b2lkICpzYl92aXJ0X2FkZHIsCi0JCQkJIGRtYV9hZGRyX3Qgc2JfcGh5X2FkZHIpCisJCQkJIHZvaWQgKnNiX3ZpcnRfYWRkciwgZG1hX2FkZHJfdCBzYl9waHlfYWRkcikKIHsKIAlzdHJ1Y3QgcWVkX3NiX2F0dG5faW5mbyAqc2JfaW5mbyA9IHBfaHdmbi0+cF9zYl9hdHRuOwogCWludCBpLCBqLCBrOwpAQCAtMjM3OCwxNSArMjM2NSwxMyBAQAogewogCXN0cnVjdCBxZWRfZGV2ICpjZGV2ID0gcF9od2ZuLT5jZGV2OwogCXN0cnVjdCBxZWRfc2JfYXR0bl9pbmZvICpwX3NiOwotCXZvaWQgKnBfdmlydDsKIAlkbWFfYWRkcl90IHBfcGh5cyA9IDA7CisJdm9pZCAqcF92aXJ0OwogCiAJLyogU0Igc3RydWN0ICovCiAJcF9zYiA9IGttYWxsb2Moc2l6ZW9mKCpwX3NiKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwX3NiKSB7Ci0JCURQX05PVElDRShjZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIGBzdHJ1Y3QgcWVkX3NiX2F0dG5faW5mbydcbiIpOworCWlmICghcF9zYikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJLyogU0IgcmluZyAgKi8KIAlwX3ZpcnQgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmNkZXYtPnBkZXYtPmRldiwKQEAgLTIzOTQsNyArMjM3OSw2IEBACiAJCQkJICAgICZwX3BoeXMsIEdGUF9LRVJORUwpOwogCiAJaWYgKCFwX3ZpcnQpIHsKLQkJRFBfTk9USUNFKGNkZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgc3RhdHVzIGJsb2NrIChhdHRlbnRpb25zKVxuIik7CiAJCWtmcmVlKHBfc2IpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0yNDEyLDkgKzIzOTYsNyBAQAogCiB2b2lkIHFlZF9pbml0X2NhdV9zYl9lbnRyeShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKIAkJCSAgIHN0cnVjdCBjYXVfc2JfZW50cnkgKnBfc2JfZW50cnksCi0JCQkgICB1OCBwZl9pZCwKLQkJCSAgIHUxNiB2Zl9udW1iZXIsCi0JCQkgICB1OCB2Zl92YWxpZCkKKwkJCSAgIHU4IHBmX2lkLCB1MTYgdmZfbnVtYmVyLCB1OCB2Zl92YWxpZCkKIHsKIAlzdHJ1Y3QgcWVkX2RldiAqY2RldiA9IHBfaHdmbi0+Y2RldjsKIAl1MzIgY2F1X3N0YXRlOwpAQCAtMjQyOCwxMiArMjQxMCw2IEBACiAJU0VUX0ZJRUxEKHBfc2JfZW50cnktPnBhcmFtcywgQ0FVX1NCX0VOVFJZX1NCX1RJTUVTRVQwLCAweDdGKTsKIAlTRVRfRklFTEQocF9zYl9lbnRyeS0+cGFyYW1zLCBDQVVfU0JfRU5UUllfU0JfVElNRVNFVDEsIDB4N0YpOwogCi0JLyogc2V0dGluZyB0aGUgdGltZSByZXN1bHRpb24gdG8gYSBmaXhlZCB2YWx1ZSAoID0gMSkgKi8KLQlTRVRfRklFTEQocF9zYl9lbnRyeS0+cGFyYW1zLCBDQVVfU0JfRU5UUllfVElNRVJfUkVTMCwKLQkJICBRRURfQ0FVX0RFRl9SWF9USU1FUl9SRVMpOwotCVNFVF9GSUVMRChwX3NiX2VudHJ5LT5wYXJhbXMsIENBVV9TQl9FTlRSWV9USU1FUl9SRVMxLAotCQkgIFFFRF9DQVVfREVGX1RYX1RJTUVSX1JFUyk7Ci0KIAljYXVfc3RhdGUgPSBDQVVfSENfRElTQUJMRV9TVEFURTsKIAogCWlmIChjZGV2LT5pbnRfY29hbGVzY2luZ19tb2RlID09IFFFRF9DT0FMX01PREVfRU5BQkxFKSB7CkBAIC0yNDY4LDkgKzI0NDQsNyBAQAogdm9pZCBxZWRfaW50X2NhdV9jb25mX3NiKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAogCQkJIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKIAkJCSBkbWFfYWRkcl90IHNiX3BoeXMsCi0JCQkgdTE2IGlndV9zYl9pZCwKLQkJCSB1MTYgdmZfbnVtYmVyLAotCQkJIHU4IHZmX3ZhbGlkKQorCQkJIHUxNiBpZ3Vfc2JfaWQsIHUxNiB2Zl9udW1iZXIsIHU4IHZmX3ZhbGlkKQogewogCXN0cnVjdCBjYXVfc2JfZW50cnkgc2JfZW50cnk7CiAKQEAgLTI1MTQsOCArMjQ4OCw3IEBACiAJCQl0aW1lcl9yZXMgPSAyOwogCQl0aW1lc2V0ID0gKHU4KShwX2h3Zm4tPmNkZXYtPnJ4X2NvYWxlc2NlX3VzZWNzID4+IHRpbWVyX3Jlcyk7CiAJCXFlZF9pbnRfY2F1X2NvbmZfcGkocF9od2ZuLCBwX3B0dCwgaWd1X3NiX2lkLCBSWF9QSSwKLQkJCQkgICAgUUVEX0NPQUxfUlhfU1RBVEVfTUFDSElORSwKLQkJCQkgICAgdGltZXNldCk7CisJCQkJICAgIFFFRF9DT0FMX1JYX1NUQVRFX01BQ0hJTkUsIHRpbWVzZXQpOwogCiAJCWlmIChwX2h3Zm4tPmNkZXYtPnR4X2NvYWxlc2NlX3VzZWNzIDw9IDB4N0YpCiAJCQl0aW1lcl9yZXMgPSAwOwpAQCAtMjU0MSw4ICsyNTE0LDcgQEAKIAkJCSB1OCB0aW1lc2V0KQogewogCXN0cnVjdCBjYXVfcGlfZW50cnkgcGlfZW50cnk7Ci0JdTMyIHNiX29mZnNldDsKLQl1MzIgcGlfb2Zmc2V0OworCXUzMiBzYl9vZmZzZXQsIHBpX29mZnNldDsKIAogCWlmIChJU19WRihwX2h3Zm4tPmNkZXYpKQogCQlyZXR1cm47CkBAIC0yNTY5LDggKzI1NDEsNyBAQAogfQogCiB2b2lkIHFlZF9pbnRfc2Jfc2V0dXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCSAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKLQkJICAgICAgc3RydWN0IHFlZF9zYl9pbmZvICpzYl9pbmZvKQorCQkgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHN0cnVjdCBxZWRfc2JfaW5mbyAqc2JfaW5mbykKIHsKIAkvKiB6ZXJvIHN0YXR1cyBibG9jayBhbmQgYWNrIGNvdW50ZXIgKi8KIAlzYl9pbmZvLT5zYl9hY2sgPSAwOwpAQCAtMjU5MCw4ICsyNTYxLDcgQEAKICAqCiAgKiBAcmV0dXJuIHUxNgogICovCi1zdGF0aWMgdTE2IHFlZF9nZXRfaWd1X3NiX2lkKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJICAgICB1MTYgc2JfaWQpCitzdGF0aWMgdTE2IHFlZF9nZXRfaWd1X3NiX2lkKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCB1MTYgc2JfaWQpCiB7CiAJdTE2IGlndV9zYl9pZDsKIApAQCAtMjYwMyw4ICsyNTczLDEyIEBACiAJZWxzZQogCQlpZ3Vfc2JfaWQgPSBxZWRfdmZfZ2V0X2lndV9zYl9pZChwX2h3Zm4sIHNiX2lkKTsKIAotCURQX1ZFUkJPU0UocF9od2ZuLCBORVRJRl9NU0dfSU5UUiwgIlNCIFslc10gaW5kZXggaXMgMHglMDR4XG4iLAotCQkgICAoc2JfaWQgPT0gUUVEX1NQX1NCX0lEKSA/ICJEU0IiIDogIm5vbi1EU0IiLCBpZ3Vfc2JfaWQpOworCWlmIChzYl9pZCA9PSBRRURfU1BfU0JfSUQpCisJCURQX1ZFUkJPU0UocF9od2ZuLCBORVRJRl9NU0dfSU5UUiwKKwkJCSAgICJTbG93cGF0aCBTQiBpbmRleCBpbiBJR1UgaXMgMHglMDR4XG4iLCBpZ3Vfc2JfaWQpOworCWVsc2UKKwkJRFBfVkVSQk9TRShwX2h3Zm4sIE5FVElGX01TR19JTlRSLAorCQkJICAgIlNCIFslMDR4XSA8LS0+IElHVSBTQiBbJTA0eF1cbiIsIHNiX2lkLCBpZ3Vfc2JfaWQpOwogCiAJcmV0dXJuIGlndV9zYl9pZDsKIH0KQEAgLTI2MTIsOSArMjU4Niw3IEBACiBpbnQgcWVkX2ludF9zYl9pbml0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAogCQkgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAogCQkgICAgc3RydWN0IHFlZF9zYl9pbmZvICpzYl9pbmZvLAotCQkgICAgdm9pZCAqc2JfdmlydF9hZGRyLAotCQkgICAgZG1hX2FkZHJfdCBzYl9waHlfYWRkciwKLQkJICAgIHUxNiBzYl9pZCkKKwkJICAgIHZvaWQgKnNiX3ZpcnRfYWRkciwgZG1hX2FkZHJfdCBzYl9waHlfYWRkciwgdTE2IHNiX2lkKQogewogCXNiX2luZm8tPnNiX3ZpcnQgPSBzYl92aXJ0X2FkZHI7CiAJc2JfaW5mby0+c2JfcGh5cyA9IHNiX3BoeV9hZGRyOwpAQCAtMjY1MCw4ICsyNjIyLDcgQEAKIH0KIAogaW50IHFlZF9pbnRfc2JfcmVsZWFzZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJICAgICAgIHN0cnVjdCBxZWRfc2JfaW5mbyAqc2JfaW5mbywKLQkJICAgICAgIHUxNiBzYl9pZCkKKwkJICAgICAgIHN0cnVjdCBxZWRfc2JfaW5mbyAqc2JfaW5mbywgdTE2IHNiX2lkKQogewogCWlmIChzYl9pZCA9PSBRRURfU1BfU0JfSUQpIHsKIAkJRFBfRVJSKHBfaHdmbiwgIkRvIE5vdCBmcmVlIHNwIHNiIHVzaW5nIHRoaXMgZnVuY3Rpb24iKTsKQEAgLTI2ODUsOCArMjY1Niw3IEBACiAJa2ZyZWUocF9zYik7CiB9CiAKLXN0YXRpYyBpbnQgcWVkX2ludF9zcF9zYl9hbGxvYyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCSAgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCitzdGF0aWMgaW50IHFlZF9pbnRfc3Bfc2JfYWxsb2Moc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKIHsKIAlzdHJ1Y3QgcWVkX3NiX3NwX2luZm8gKnBfc2I7CiAJZG1hX2FkZHJfdCBwX3BoeXMgPSAwOwpAQCAtMjY5NCwxNyArMjY2NCwxNCBAQAogCiAJLyogU0Igc3RydWN0ICovCiAJcF9zYiA9IGttYWxsb2Moc2l6ZW9mKCpwX3NiKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwX3NiKSB7Ci0JCURQX05PVElDRShwX2h3Zm4sICJGYWlsZWQgdG8gYWxsb2NhdGUgYHN0cnVjdCBxZWRfc2JfaW5mbydcbiIpOworCWlmICghcF9zYikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJLyogU0IgcmluZyAgKi8KIAlwX3ZpcnQgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBfaHdmbi0+Y2Rldi0+cGRldi0+ZGV2LAogCQkJCSAgICBTQl9BTElHTkVEX1NJWkUocF9od2ZuKSwKIAkJCQkgICAgJnBfcGh5cywgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwX3ZpcnQpIHsKLQkJRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBzdGF0dXMgYmxvY2tcbiIpOwogCQlrZnJlZShwX3NiKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMjcyMSw5ICsyNjg4LDcgQEAKIAogaW50IHFlZF9pbnRfcmVnaXN0ZXJfY2Ioc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCiAJCQlxZWRfaW50X2NvbXBfY2JfdCBjb21wX2NiLAotCQkJdm9pZCAqY29va2llLAotCQkJdTggKnNiX2lkeCwKLQkJCV9fbGUxNiAqKnBfZndfY29ucykKKwkJCXZvaWQgKmNvb2tpZSwgdTggKnNiX2lkeCwgX19sZTE2ICoqcF9md19jb25zKQogewogCXN0cnVjdCBxZWRfc2Jfc3BfaW5mbyAqcF9zcF9zYiA9IHBfaHdmbi0+cF9zcF9zYjsKIAlpbnQgcmMgPSAtRU5PTUVNOwpAQCAtMjc2NCw4ICsyNzI5LDcgQEAKIH0KIAogdm9pZCBxZWRfaW50X2lndV9lbmFibGVfaW50KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKLQkJCSAgICBlbnVtIHFlZF9pbnRfbW9kZSBpbnRfbW9kZSkKKwkJCSAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIGVudW0gcWVkX2ludF9tb2RlIGludF9tb2RlKQogewogCXUzMiBpZ3VfcGZfY29uZiA9IElHVV9QRl9DT05GX0ZVTkNfRU4gfCBJR1VfUEZfQ09ORl9BVFROX0JJVF9FTjsKIApAQCAtMjgwOSw3ICsyNzczLDcgQEAKIAlxZWRfd3IocF9od2ZuLCBwX3B0dCwgTUlTQ19SRUdfQUVVX01BU0tfQVRUTl9JR1UsIDB4ZmYpOwogCWlmICgoaW50X21vZGUgIT0gUUVEX0lOVF9NT0RFX0lOVEEpIHx8IElTX0xFQURfSFdGTihwX2h3Zm4pKSB7CiAJCXJjID0gcWVkX3Nsb3dwYXRoX2lycV9yZXEocF9od2ZuKTsKLQkJaWYgKHJjICE9IDApIHsKKwkJaWYgKHJjKSB7CiAJCQlEUF9OT1RJQ0UocF9od2ZuLCAiU2xvd3BhdGggSVJRIHJlcXVlc3QgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC0yODIyLDggKzI3ODYsNyBAQAogCXJldHVybiByYzsKIH0KIAotdm9pZCBxZWRfaW50X2lndV9kaXNhYmxlX2ludChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCSAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQordm9pZCBxZWRfaW50X2lndV9kaXNhYmxlX2ludChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQogewogCXBfaHdmbi0+Yl9pbnRfZW5hYmxlZCA9IDA7CiAKQEAgLTI5NTAsMTMgKzI5MTMsMTEgQEAKIAkJCQkJcF9od2ZuLT5od19pbmZvLm9wYXF1ZV9maWQsIGJfc2V0KTsKIH0KIAotc3RhdGljIHUzMiBxZWRfaW50X2lndV9yZWFkX2NhbV9ibG9jayhzdHJ1Y3QgcWVkX2h3Zm4JKnBfaHdmbiwKLQkJCQkgICAgICBzdHJ1Y3QgcWVkX3B0dAkqcF9wdHQsCi0JCQkJICAgICAgdTE2CQlzYl9pZCkKK3N0YXRpYyB1MzIgcWVkX2ludF9pZ3VfcmVhZF9jYW1fYmxvY2soc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1MTYgc2JfaWQpCiB7CiAJdTMyIHZhbCA9IHFlZF9yZChwX2h3Zm4sIHBfcHR0LAotCQkJIElHVV9SRUdfTUFQUElOR19NRU1PUlkgKwotCQkJIHNpemVvZih1MzIpICogc2JfaWQpOworCQkJIElHVV9SRUdfTUFQUElOR19NRU1PUlkgKyBzaXplb2YodTMyKSAqIHNiX2lkKTsKIAlzdHJ1Y3QgcWVkX2lndV9ibG9jayAqcF9ibG9jazsKIAogCXBfYmxvY2sgPSAmcF9od2ZuLT5od19pbmZvLnBfaWd1X2luZm8tPmlndV9tYXAuaWd1X2Jsb2Nrc1tzYl9pZF07CkBAIC0yOTgzLDggKzI5NDQsNyBAQAogCXJldHVybiB2YWw7CiB9CiAKLWludCBxZWRfaW50X2lndV9yZWFkX2NhbShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCSBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCitpbnQgcWVkX2ludF9pZ3VfcmVhZF9jYW0oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKIHsKIAlzdHJ1Y3QgcWVkX2lndV9pbmZvICpwX2lndV9pbmZvOwogCXUzMiB2YWwsIG1pbl92ZiA9IDAsIG1heF92ZiA9IDA7CkBAIC0yOTkzLDcgKzI5NTMsNiBAQAogCXUxNiBwcmV2X3NiX2lkID0gMHhGRjsKIAogCXBfaHdmbi0+aHdfaW5mby5wX2lndV9pbmZvID0ga3phbGxvYyhzaXplb2YoKnBfaWd1X2luZm8pLCBHRlBfS0VSTkVMKTsKLQogCWlmICghcF9od2ZuLT5od19pbmZvLnBfaWd1X2luZm8pCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0zMTA0LDIyICszMDYzLDE5IEBACiAgKi8KIHZvaWQgcWVkX2ludF9pZ3VfaW5pdF9ydChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbikKIHsKLQl1MzIgaWd1X3BmX2NvbmYgPSAwOwotCi0JaWd1X3BmX2NvbmYgfD0gSUdVX1BGX0NPTkZfRlVOQ19FTjsKKwl1MzIgaWd1X3BmX2NvbmYgPSBJR1VfUEZfQ09ORl9GVU5DX0VOOwogCiAJU1RPUkVfUlRfUkVHKHBfaHdmbiwgSUdVX1JFR19QRl9DT05GSUdVUkFUSU9OX1JUX09GRlNFVCwgaWd1X3BmX2NvbmYpOwogfQogCiB1NjQgcWVkX2ludF9pZ3VfcmVhZF9zaXNyX3JlZyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbikKIHsKLQl1NjQgaW50cl9zdGF0dXMgPSAwOwotCXUzMiBpbnRyX3N0YXR1c19sbyA9IDA7Ci0JdTMyIGludHJfc3RhdHVzX2hpID0gMDsKIAl1MzIgbHNiX2lndV9jbWRfYWRkciA9IElHVV9SRUdfU0lTUl9NRFBDX1dNQVNLX0xTQl9VUFBFUiAtCiAJCQkgICAgICAgSUdVX0NNRF9JTlRfQUNLX0JBU0U7CiAJdTMyIG1zYl9pZ3VfY21kX2FkZHIgPSBJR1VfUkVHX1NJU1JfTURQQ19XTUFTS19NU0JfVVBQRVIgLQogCQkJICAgICAgIElHVV9DTURfSU5UX0FDS19CQVNFOworCXUzMiBpbnRyX3N0YXR1c19oaSA9IDAsIGludHJfc3RhdHVzX2xvID0gMDsKKwl1NjQgaW50cl9zdGF0dXMgPSAwOwogCiAJaW50cl9zdGF0dXNfbG8gPSBSRUdfUkQocF9od2ZuLAogCQkJCUdUVF9CQVIwX01BUF9SRUdfSUdVX0NNRCArCkBAIC0zMTUzLDI2ICszMTA5LDIwIEBACiAJa2ZyZWUocF9od2ZuLT5zcF9kcGMpOwogfQogCi1pbnQgcWVkX2ludF9hbGxvYyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCitpbnQgcWVkX2ludF9hbGxvYyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQogewogCWludCByYyA9IDA7CiAKIAlyYyA9IHFlZF9pbnRfc3BfZHBjX2FsbG9jKHBfaHdmbik7Ci0JaWYgKHJjKSB7Ci0JCURQX0VSUihwX2h3Zm4tPmNkZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgc3AgZHBjIG1lbVxuIik7CisJaWYgKHJjKQogCQlyZXR1cm4gcmM7Ci0JfQorCiAJcmMgPSBxZWRfaW50X3NwX3NiX2FsbG9jKHBfaHdmbiwgcF9wdHQpOwotCWlmIChyYykgewotCQlEUF9FUlIocF9od2ZuLT5jZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIHNwIHNiIG1lbVxuIik7CisJaWYgKHJjKQogCQlyZXR1cm4gcmM7Ci0JfQorCiAJcmMgPSBxZWRfaW50X3NiX2F0dG5fYWxsb2MocF9od2ZuLCBwX3B0dCk7Ci0JaWYgKHJjKSB7Ci0JCURQX0VSUihwX2h3Zm4tPmNkZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgc2IgYXR0biBtZW1cbiIpOwotCQlyZXR1cm4gcmM7Ci0JfQorCiAJcmV0dXJuIHJjOwogfQogCkBAIC0zMTgzLDggKzMxMzMsNyBAQAogCXFlZF9pbnRfc3BfZHBjX2ZyZWUocF9od2ZuKTsKIH0KIAotdm9pZCBxZWRfaW50X3NldHVwKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCit2b2lkIHFlZF9pbnRfc2V0dXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKIHsKIAlxZWRfaW50X3NiX3NldHVwKHBfaHdmbiwgcF9wdHQsICZwX2h3Zm4tPnBfc3Bfc2ItPnNiX2luZm8pOwogCXFlZF9pbnRfc2JfYXR0bl9zZXR1cChwX2h3Zm4sIHBfcHR0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2wyLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9sMi5jCmluZGV4IDQwMWU3MzguLmRkZDQxMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2wyLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfbDIuYwpAQCAtNTIsNyArNTIsNyBAQAogCXUxNiByeF9tb2RlID0gMDsKIAogCXJjID0gcWVkX2Z3X3Zwb3J0KHBfaHdmbiwgcF9wYXJhbXMtPnZwb3J0X2lkLCAmYWJzX3Zwb3J0X2lkKTsKLQlpZiAocmMgIT0gMCkKKwlpZiAocmMpCiAJCXJldHVybiByYzsKIAogCW1lbXNldCgmaW5pdF9kYXRhLCAwLCBzaXplb2YoaW5pdF9kYXRhKSk7CkBAIC04MCw4ICs4MCw3IEBACiAJcF9yYW1yb2QtPnJ4X21vZGUuc3RhdGUgPSBjcHVfdG9fbGUxNihyeF9tb2RlKTsKIAogCS8qIFRQQSByZWxhdGVkIGZpZWxkcyAqLwotCW1lbXNldCgmcF9yYW1yb2QtPnRwYV9wYXJhbSwgMCwKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCBldGhfdnBvcnRfdHBhX3BhcmFtKSk7CisJbWVtc2V0KCZwX3JhbXJvZC0+dHBhX3BhcmFtLCAwLCBzaXplb2Yoc3RydWN0IGV0aF92cG9ydF90cGFfcGFyYW0pKTsKIAogCXBfcmFtcm9kLT50cGFfcGFyYW0ubWF4X2J1ZmZfbnVtID0gcF9wYXJhbXMtPm1heF9idWZmZXJzX3Blcl9jcWU7CiAKQEAgLTEwMiw2ICsxMDEsOSBAQAogCiAJcF9yYW1yb2QtPnR4X3N3aXRjaGluZ19lbiA9IHBfcGFyYW1zLT50eF9zd2l0Y2hpbmc7CiAKKwlwX3JhbXJvZC0+Y3RsX2ZyYW1lX21hY19jaGVja19lbiA9ICEhcF9wYXJhbXMtPmNoZWNrX21hYzsKKwlwX3JhbXJvZC0+Y3RsX2ZyYW1lX2V0aHR5cGVfY2hlY2tfZW4gPSAhIXBfcGFyYW1zLT5jaGVja19ldGh0eXBlOworCiAJLyogU29mdHdhcmUgRnVuY3Rpb24gSUQgaW4gaHdmbiAoUEZzIGFyZSAwIC0gMTUsIFZGcyBhcmUgMTYgLSAxMzUpICovCiAJcF9yYW1yb2QtPnN3X2ZpZCA9IHFlZF9jb25jcmV0ZV90b19zd19maWQocF9od2ZuLT5jZGV2LAogCQkJCQkJICBwX3BhcmFtcy0+Y29uY3JldGVfZmlkKTsKQEAgLTEwOSw4ICsxMTEsOCBAQAogCXJldHVybiBxZWRfc3BxX3Bvc3QocF9od2ZuLCBwX2VudCwgTlVMTCk7CiB9CiAKLWludCBxZWRfc3BfdnBvcnRfc3RhcnQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCSAgICAgICBzdHJ1Y3QgcWVkX3NwX3Zwb3J0X3N0YXJ0X3BhcmFtcyAqcF9wYXJhbXMpCitzdGF0aWMgaW50IHFlZF9zcF92cG9ydF9zdGFydChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgICAgIHN0cnVjdCBxZWRfc3BfdnBvcnRfc3RhcnRfcGFyYW1zICpwX3BhcmFtcykKIHsKIAlpZiAoSVNfVkYocF9od2ZuLT5jZGV2KSkgewogCQlyZXR1cm4gcWVkX3ZmX3BmX3Zwb3J0X3N0YXJ0KHBfaHdmbiwgcF9wYXJhbXMtPnZwb3J0X2lkLApAQCAtMzA2LDE0ICszMDgsMTQgQEAKIAltZW1zZXQoJnBfcmFtcm9kLT5hcHByb3hfbWNhc3QuYmlucywgMCwKIAkgICAgICAgc2l6ZW9mKHBfcmFtcm9kLT5hcHByb3hfbWNhc3QuYmlucykpOwogCi0JaWYgKHBfcGFyYW1zLT51cGRhdGVfYXBwcm94X21jYXN0X2ZsZykgewotCQlwX3JhbXJvZC0+Y29tbW9uLnVwZGF0ZV9hcHByb3hfbWNhc3RfZmxnID0gMTsKLQkJZm9yIChpID0gMDsgaSA8IEVUSF9NVUxUSUNBU1RfTUFDX0JJTlNfSU5fUkVHUzsgaSsrKSB7Ci0JCQl1MzIgKnBfYmlucyA9ICh1MzIgKilwX3BhcmFtcy0+YmluczsKLQkJCV9fbGUzMiB2YWwgPSBjcHVfdG9fbGUzMihwX2JpbnNbaV0pOworCWlmICghcF9wYXJhbXMtPnVwZGF0ZV9hcHByb3hfbWNhc3RfZmxnKQorCQlyZXR1cm47CiAKLQkJCXBfcmFtcm9kLT5hcHByb3hfbWNhc3QuYmluc1tpXSA9IHZhbDsKLQkJfQorCXBfcmFtcm9kLT5jb21tb24udXBkYXRlX2FwcHJveF9tY2FzdF9mbGcgPSAxOworCWZvciAoaSA9IDA7IGkgPCBFVEhfTVVMVElDQVNUX01BQ19CSU5TX0lOX1JFR1M7IGkrKykgeworCQl1MzIgKnBfYmlucyA9ICh1MzIgKilwX3BhcmFtcy0+YmluczsKKworCQlwX3JhbXJvZC0+YXBwcm94X21jYXN0LmJpbnNbaV0gPSBjcHVfdG9fbGUzMihwX2JpbnNbaV0pOwogCX0KIH0KIApAQCAtMzM2LDcgKzMzOCw3IEBACiAJfQogCiAJcmMgPSBxZWRfZndfdnBvcnQocF9od2ZuLCBwX3BhcmFtcy0+dnBvcnRfaWQsICZhYnNfdnBvcnRfaWQpOwotCWlmIChyYyAhPSAwKQorCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCiAJbWVtc2V0KCZpbml0X2RhdGEsIDAsIHNpemVvZihpbml0X2RhdGEpKTsKQEAgLTM2MSw4ICszNjMsOCBAQAogCXBfY21uLT50eF9hY3RpdmVfZmxnID0gcF9wYXJhbXMtPnZwb3J0X2FjdGl2ZV90eF9mbGc7CiAJcF9jbW4tPnVwZGF0ZV90eF9hY3RpdmVfZmxnID0gcF9wYXJhbXMtPnVwZGF0ZV92cG9ydF9hY3RpdmVfdHhfZmxnOwogCXBfY21uLT5hY2NlcHRfYW55X3ZsYW4gPSBwX3BhcmFtcy0+YWNjZXB0X2FueV92bGFuOwotCXBfY21uLT51cGRhdGVfYWNjZXB0X2FueV92bGFuX2ZsZyA9Ci0JCQlwX3BhcmFtcy0+dXBkYXRlX2FjY2VwdF9hbnlfdmxhbl9mbGc7CisJdmFsID0gcF9wYXJhbXMtPnVwZGF0ZV9hY2NlcHRfYW55X3ZsYW5fZmxnOworCXBfY21uLT51cGRhdGVfYWNjZXB0X2FueV92bGFuX2ZsZyA9IHZhbDsKIAogCXBfY21uLT5pbm5lcl92bGFuX3JlbW92YWxfZW4gPSBwX3BhcmFtcy0+aW5uZXJfdmxhbl9yZW1vdmFsX2ZsZzsKIAl2YWwgPSBwX3BhcmFtcy0+dXBkYXRlX2lubmVyX3ZsYW5fcmVtb3ZhbF9mbGc7CkBAIC00MTEsNyArNDEzLDcgQEAKIAkJcmV0dXJuIHFlZF92Zl9wZl92cG9ydF9zdG9wKHBfaHdmbik7CiAKIAlyYyA9IHFlZF9md192cG9ydChwX2h3Zm4sIHZwb3J0X2lkLCAmYWJzX3Zwb3J0X2lkKTsKLQlpZiAocmMgIT0gMCkKKwlpZiAocmMpCiAJCXJldHVybiByYzsKIAogCW1lbXNldCgmaW5pdF9kYXRhLCAwLCBzaXplb2YoaW5pdF9kYXRhKSk7CkBAIC00NzYsNyArNDc4LDcgQEAKIAogCQlyYyA9IHFlZF9zcF92cG9ydF91cGRhdGUocF9od2ZuLCAmdnBvcnRfdXBkYXRlX3BhcmFtcywKIAkJCQkJIGNvbXBfbW9kZSwgcF9jb21wX2RhdGEpOwotCQlpZiAocmMgIT0gMCkgeworCQlpZiAocmMpIHsKIAkJCURQX0VSUihjZGV2LCAiVXBkYXRlIHJ4X21vZGUgZmFpbGVkICVkXG4iLCByYyk7CiAJCQlyZXR1cm4gcmM7CiAJCX0KQEAgLTUxMSwxMSArNTEzLDEyIEBACiBpbnQgcWVkX3NwX2V0aF9yeHFfc3RhcnRfcmFtcm9kKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAogCQkJCXUxNiBvcGFxdWVfZmlkLAogCQkJCXUzMiBjaWQsCi0JCQkJc3RydWN0IHFlZF9xdWV1ZV9zdGFydF9jb21tb25fcGFyYW1zICpwYXJhbXMsCisJCQkJc3RydWN0IHFlZF9xdWV1ZV9zdGFydF9jb21tb25fcGFyYW1zICpwX3BhcmFtcywKIAkJCQl1OCBzdGF0c19pZCwKIAkJCQl1MTYgYmRfbWF4X2J5dGVzLAogCQkJCWRtYV9hZGRyX3QgYmRfY2hhaW5fcGh5c19hZGRyLAotCQkJCWRtYV9hZGRyX3QgY3FlX3BibF9hZGRyLCB1MTYgY3FlX3BibF9zaXplKQorCQkJCWRtYV9hZGRyX3QgY3FlX3BibF9hZGRyLAorCQkJCXUxNiBjcWVfcGJsX3NpemUsIGJvb2wgYl91c2Vfem9uZV9hX3Byb2QpCiB7CiAJc3RydWN0IHJ4X3F1ZXVlX3N0YXJ0X3JhbXJvZF9kYXRhICpwX3JhbXJvZCA9IE5VTEw7CiAJc3RydWN0IHFlZF9zcHFfZW50cnkgKnBfZW50ID0gTlVMTDsKQEAgLTUyNiwyMyArNTI5LDIzIEBACiAJaW50IHJjID0gLUVJTlZBTDsKIAogCS8qIFN0b3JlIGluZm9ybWF0aW9uIGZvciB0aGUgc3RvcCAqLwotCXBfcnhfY2lkCQk9ICZwX2h3Zm4tPnBfcnhfY2lkc1twYXJhbXMtPnF1ZXVlX2lkXTsKLQlwX3J4X2NpZC0+Y2lkCQk9IGNpZDsKLQlwX3J4X2NpZC0+b3BhcXVlX2ZpZAk9IG9wYXF1ZV9maWQ7Ci0JcF9yeF9jaWQtPnZwb3J0X2lkCT0gcGFyYW1zLT52cG9ydF9pZDsKKwlwX3J4X2NpZCA9ICZwX2h3Zm4tPnBfcnhfY2lkc1twX3BhcmFtcy0+cXVldWVfaWRdOworCXBfcnhfY2lkLT5jaWQgPSBjaWQ7CisJcF9yeF9jaWQtPm9wYXF1ZV9maWQgPSBvcGFxdWVfZmlkOworCXBfcnhfY2lkLT52cG9ydF9pZCA9IHBfcGFyYW1zLT52cG9ydF9pZDsKIAotCXJjID0gcWVkX2Z3X3Zwb3J0KHBfaHdmbiwgcGFyYW1zLT52cG9ydF9pZCwgJmFic192cG9ydF9pZCk7Ci0JaWYgKHJjICE9IDApCisJcmMgPSBxZWRfZndfdnBvcnQocF9od2ZuLCBwX3BhcmFtcy0+dnBvcnRfaWQsICZhYnNfdnBvcnRfaWQpOworCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JcmMgPSBxZWRfZndfbDJfcXVldWUocF9od2ZuLCBwYXJhbXMtPnF1ZXVlX2lkLCAmYWJzX3J4X3FfaWQpOwotCWlmIChyYyAhPSAwKQorCXJjID0gcWVkX2Z3X2wyX3F1ZXVlKHBfaHdmbiwgcF9wYXJhbXMtPnF1ZXVlX2lkLCAmYWJzX3J4X3FfaWQpOworCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCiAJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfU1AsCiAJCSAgICJvcGFxdWVfZmlkPTB4JXgsIGNpZD0weCV4LCByeF9xaWQ9MHgleCwgdnBvcnRfaWQ9MHgleCwgc2JfaWQ9MHgleFxuIiwKLQkJICAgb3BhcXVlX2ZpZCwgY2lkLCBwYXJhbXMtPnF1ZXVlX2lkLCBwYXJhbXMtPnZwb3J0X2lkLAotCQkgICBwYXJhbXMtPnNiKTsKKwkJICAgb3BhcXVlX2ZpZCwKKwkJICAgY2lkLCBwX3BhcmFtcy0+cXVldWVfaWQsIHBfcGFyYW1zLT52cG9ydF9pZCwgcF9wYXJhbXMtPnNiKTsKIAogCS8qIEdldCBTUFEgZW50cnkgKi8KIAltZW1zZXQoJmluaXRfZGF0YSwgMCwgc2l6ZW9mKGluaXRfZGF0YSkpOwpAQCAtNTU4LDI0ICs1NjEsMjggQEAKIAogCXBfcmFtcm9kID0gJnBfZW50LT5yYW1yb2QucnhfcXVldWVfc3RhcnQ7CiAKLQlwX3JhbXJvZC0+c2JfaWQJCQk9IGNwdV90b19sZTE2KHBhcmFtcy0+c2IpOwotCXBfcmFtcm9kLT5zYl9pbmRleAkJPSBwYXJhbXMtPnNiX2lkeDsKLQlwX3JhbXJvZC0+dnBvcnRfaWQJCT0gYWJzX3Zwb3J0X2lkOwotCXBfcmFtcm9kLT5zdGF0c19jb3VudGVyX2lkCT0gc3RhdHNfaWQ7Ci0JcF9yYW1yb2QtPnJ4X3F1ZXVlX2lkCQk9IGNwdV90b19sZTE2KGFic19yeF9xX2lkKTsKLQlwX3JhbXJvZC0+Y29tcGxldGVfY3FlX2ZsZwk9IDA7Ci0JcF9yYW1yb2QtPmNvbXBsZXRlX2V2ZW50X2ZsZwk9IDE7CisJcF9yYW1yb2QtPnNiX2lkID0gY3B1X3RvX2xlMTYocF9wYXJhbXMtPnNiKTsKKwlwX3JhbXJvZC0+c2JfaW5kZXggPSBwX3BhcmFtcy0+c2JfaWR4OworCXBfcmFtcm9kLT52cG9ydF9pZCA9IGFic192cG9ydF9pZDsKKwlwX3JhbXJvZC0+c3RhdHNfY291bnRlcl9pZCA9IHN0YXRzX2lkOworCXBfcmFtcm9kLT5yeF9xdWV1ZV9pZCA9IGNwdV90b19sZTE2KGFic19yeF9xX2lkKTsKKwlwX3JhbXJvZC0+Y29tcGxldGVfY3FlX2ZsZyA9IDA7CisJcF9yYW1yb2QtPmNvbXBsZXRlX2V2ZW50X2ZsZyA9IDE7CiAKLQlwX3JhbXJvZC0+YmRfbWF4X2J5dGVzCT0gY3B1X3RvX2xlMTYoYmRfbWF4X2J5dGVzKTsKKwlwX3JhbXJvZC0+YmRfbWF4X2J5dGVzID0gY3B1X3RvX2xlMTYoYmRfbWF4X2J5dGVzKTsKIAlETUFfUkVHUEFJUl9MRShwX3JhbXJvZC0+YmRfYmFzZSwgYmRfY2hhaW5fcGh5c19hZGRyKTsKIAotCXBfcmFtcm9kLT5udW1fb2ZfcGJsX3BhZ2VzCT0gY3B1X3RvX2xlMTYoY3FlX3BibF9zaXplKTsKKwlwX3JhbXJvZC0+bnVtX29mX3BibF9wYWdlcyA9IGNwdV90b19sZTE2KGNxZV9wYmxfc2l6ZSk7CiAJRE1BX1JFR1BBSVJfTEUocF9yYW1yb2QtPmNxZV9wYmxfYWRkciwgY3FlX3BibF9hZGRyKTsKIAotCXBfcmFtcm9kLT52Zl9yeF9wcm9kX2luZGV4ID0gcGFyYW1zLT52Zl9xaWQ7Ci0JaWYgKHBhcmFtcy0+dmZfcWlkKQorCWlmIChwX3BhcmFtcy0+dmZfcWlkIHx8IGJfdXNlX3pvbmVfYV9wcm9kKSB7CisJCXBfcmFtcm9kLT52Zl9yeF9wcm9kX2luZGV4ID0gcF9wYXJhbXMtPnZmX3FpZDsKIAkJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfU1AsCi0JCQkgICAiUXVldWUgaXMgbWVhbnQgZm9yIFZGIHJ4cVslMDR4XVxuIiwgcGFyYW1zLT52Zl9xaWQpOworCQkJICAgIlF1ZXVlJXMgaXMgbWVhbnQgZm9yIFZGIHJ4cVslMDJ4XVxuIiwKKwkJCSAgIGJfdXNlX3pvbmVfYV9wcm9kID8gIiBbbGVnYWN5XSIgOiAiIiwKKwkJCSAgIHBfcGFyYW1zLT52Zl9xaWQpOworCQlwX3JhbXJvZC0+dmZfcnhfcHJvZF91c2Vfem9uZV9hID0gYl91c2Vfem9uZV9hX3Byb2Q7CisJfQogCiAJcmV0dXJuIHFlZF9zcHFfcG9zdChwX2h3Zm4sIHBfZW50LCBOVUxMKTsKIH0KQEAgLTU4Myw3ICs1OTAsNyBAQAogc3RhdGljIGludAogcWVkX3NwX2V0aF9yeF9xdWV1ZV9zdGFydChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKIAkJCSAgdTE2IG9wYXF1ZV9maWQsCi0JCQkgIHN0cnVjdCBxZWRfcXVldWVfc3RhcnRfY29tbW9uX3BhcmFtcyAqcGFyYW1zLAorCQkJICBzdHJ1Y3QgcWVkX3F1ZXVlX3N0YXJ0X2NvbW1vbl9wYXJhbXMgKnBfcGFyYW1zLAogCQkJICB1MTYgYmRfbWF4X2J5dGVzLAogCQkJICBkbWFfYWRkcl90IGJkX2NoYWluX3BoeXNfYWRkciwKIAkJCSAgZG1hX2FkZHJfdCBjcWVfcGJsX2FkZHIsCkBAIC01OTcsMjAgKzYwNCwyMCBAQAogCiAJaWYgKElTX1ZGKHBfaHdmbi0+Y2RldikpIHsKIAkJcmV0dXJuIHFlZF92Zl9wZl9yeHFfc3RhcnQocF9od2ZuLAotCQkJCQkgICBwYXJhbXMtPnF1ZXVlX2lkLAotCQkJCQkgICBwYXJhbXMtPnNiLAotCQkJCQkgICBwYXJhbXMtPnNiX2lkeCwKKwkJCQkJICAgcF9wYXJhbXMtPnF1ZXVlX2lkLAorCQkJCQkgICBwX3BhcmFtcy0+c2IsCisJCQkJCSAgICh1OClwX3BhcmFtcy0+c2JfaWR4LAogCQkJCQkgICBiZF9tYXhfYnl0ZXMsCiAJCQkJCSAgIGJkX2NoYWluX3BoeXNfYWRkciwKIAkJCQkJICAgY3FlX3BibF9hZGRyLCBjcWVfcGJsX3NpemUsIHBwX3Byb2QpOwogCX0KIAotCXJjID0gcWVkX2Z3X2wyX3F1ZXVlKHBfaHdmbiwgcGFyYW1zLT5xdWV1ZV9pZCwgJmFic19sMl9xdWV1ZSk7Ci0JaWYgKHJjICE9IDApCisJcmMgPSBxZWRfZndfbDJfcXVldWUocF9od2ZuLCBwX3BhcmFtcy0+cXVldWVfaWQsICZhYnNfbDJfcXVldWUpOworCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JcmMgPSBxZWRfZndfdnBvcnQocF9od2ZuLCBwYXJhbXMtPnZwb3J0X2lkLCAmYWJzX3N0YXRzX2lkKTsKLQlpZiAocmMgIT0gMCkKKwlyYyA9IHFlZF9md192cG9ydChwX2h3Zm4sIHBfcGFyYW1zLT52cG9ydF9pZCwgJmFic19zdGF0c19pZCk7CisJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKIAkqcHBfcHJvZCA9ICh1OCBfX2lvbWVtICopcF9od2ZuLT5yZWd2aWV3ICsKQEAgLTYyMiw5ICs2MjksOCBAQAogCQkJICAodTMyICopKCZpbml0X3Byb2RfdmFsKSk7CiAKIAkvKiBBbGxvY2F0ZSBhIENJRCBmb3IgdGhlIHF1ZXVlICovCi0JcF9yeF9jaWQgPSAmcF9od2ZuLT5wX3J4X2NpZHNbcGFyYW1zLT5xdWV1ZV9pZF07Ci0JcmMgPSBxZWRfY3h0X2FjcXVpcmVfY2lkKHBfaHdmbiwgUFJPVE9DT0xJRF9FVEgsCi0JCQkJICZwX3J4X2NpZC0+Y2lkKTsKKwlwX3J4X2NpZCA9ICZwX2h3Zm4tPnBfcnhfY2lkc1twX3BhcmFtcy0+cXVldWVfaWRdOworCXJjID0gcWVkX2N4dF9hY3F1aXJlX2NpZChwX2h3Zm4sIFBST1RPQ09MSURfRVRILCAmcF9yeF9jaWQtPmNpZCk7CiAJaWYgKHJjKSB7CiAJCURQX05PVElDRShwX2h3Zm4sICJGYWlsZWQgdG8gYWNxdWlyZSBjaWRcbiIpOwogCQlyZXR1cm4gcmM7CkBAIC02MzQsMTQgKzY0MCwxMyBAQAogCXJjID0gcWVkX3NwX2V0aF9yeHFfc3RhcnRfcmFtcm9kKHBfaHdmbiwKIAkJCQkJIG9wYXF1ZV9maWQsCiAJCQkJCSBwX3J4X2NpZC0+Y2lkLAotCQkJCQkgcGFyYW1zLAorCQkJCQkgcF9wYXJhbXMsCiAJCQkJCSBhYnNfc3RhdHNfaWQsCiAJCQkJCSBiZF9tYXhfYnl0ZXMsCiAJCQkJCSBiZF9jaGFpbl9waHlzX2FkZHIsCi0JCQkJCSBjcWVfcGJsX2FkZHIsCi0JCQkJCSBjcWVfcGJsX3NpemUpOworCQkJCQkgY3FlX3BibF9hZGRyLCBjcWVfcGJsX3NpemUsIGZhbHNlKTsKIAotCWlmIChyYyAhPSAwKQorCWlmIChyYykKIAkJcWVkX3NwX3JlbGVhc2VfcXVldWVfY2lkKHBfaHdmbiwgcF9yeF9jaWQpOwogCiAJcmV0dXJuIHJjOwpAQCAtNzg4LDIxICs3OTMsMjAgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCXBfcmFtcm9kCQk9ICZwX2VudC0+cmFtcm9kLnR4X3F1ZXVlX3N0YXJ0OwotCXBfcmFtcm9kLT52cG9ydF9pZAk9IGFic192cG9ydF9pZDsKKwlwX3JhbXJvZCA9ICZwX2VudC0+cmFtcm9kLnR4X3F1ZXVlX3N0YXJ0OworCXBfcmFtcm9kLT52cG9ydF9pZCA9IGFic192cG9ydF9pZDsKIAotCXBfcmFtcm9kLT5zYl9pZAkJCT0gY3B1X3RvX2xlMTYocF9wYXJhbXMtPnNiKTsKLQlwX3JhbXJvZC0+c2JfaW5kZXgJCT0gcF9wYXJhbXMtPnNiX2lkeDsKLQlwX3JhbXJvZC0+c3RhdHNfY291bnRlcl9pZAk9IHN0YXRzX2lkOworCXBfcmFtcm9kLT5zYl9pZCA9IGNwdV90b19sZTE2KHBfcGFyYW1zLT5zYik7CisJcF9yYW1yb2QtPnNiX2luZGV4ID0gcF9wYXJhbXMtPnNiX2lkeDsKKwlwX3JhbXJvZC0+c3RhdHNfY291bnRlcl9pZCA9IHN0YXRzX2lkOwogCi0JcF9yYW1yb2QtPnF1ZXVlX3pvbmVfaWQJCT0gY3B1X3RvX2xlMTYoYWJzX3R4X3FfaWQpOwotCXBfcmFtcm9kLT5wYmxfc2l6ZQkJPSBjcHVfdG9fbGUxNihwYmxfc2l6ZSk7CisJcF9yYW1yb2QtPnF1ZXVlX3pvbmVfaWQgPSBjcHVfdG9fbGUxNihhYnNfdHhfcV9pZCk7CisKKwlwX3JhbXJvZC0+cGJsX3NpemUgPSBjcHVfdG9fbGUxNihwYmxfc2l6ZSk7CiAJRE1BX1JFR1BBSVJfTEUocF9yYW1yb2QtPnBibF9iYXNlX2FkZHIsIHBibF9hZGRyKTsKIAotCXBxX2lkCQkJPSBxZWRfZ2V0X3FtX3BxKHBfaHdmbiwKLQkJCQkJCVBST1RPQ09MSURfRVRILAotCQkJCQkJcF9wcV9wYXJhbXMpOwotCXBfcmFtcm9kLT5xbV9wcV9pZAk9IGNwdV90b19sZTE2KHBxX2lkKTsKKwlwcV9pZCA9IHFlZF9nZXRfcW1fcHEocF9od2ZuLCBQUk9UT0NPTElEX0VUSCwgcF9wcV9wYXJhbXMpOworCXBfcmFtcm9kLT5xbV9wcV9pZCA9IGNwdV90b19sZTE2KHBxX2lkKTsKIAogCXJldHVybiBxZWRfc3BxX3Bvc3QocF9od2ZuLCBwX2VudCwgTlVMTCk7CiB9CkBAIC04MzYsOCArODQwLDcgQEAKIAltZW1zZXQoJnBxX3BhcmFtcywgMCwgc2l6ZW9mKHBxX3BhcmFtcykpOwogCiAJLyogQWxsb2NhdGUgYSBDSUQgZm9yIHRoZSBxdWV1ZSAqLwotCXJjID0gcWVkX2N4dF9hY3F1aXJlX2NpZChwX2h3Zm4sIFBST1RPQ09MSURfRVRILAotCQkJCSAmcF90eF9jaWQtPmNpZCk7CisJcmMgPSBxZWRfY3h0X2FjcXVpcmVfY2lkKHBfaHdmbiwgUFJPVE9DT0xJRF9FVEgsICZwX3R4X2NpZC0+Y2lkKTsKIAlpZiAocmMpIHsKIAkJRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCB0byBhY3F1aXJlIGNpZFxuIik7CiAJCXJldHVybiByYzsKQEAgLTg5Niw4ICs4OTksNyBAQAogCXJldHVybiBxZWRfc3BfcmVsZWFzZV9xdWV1ZV9jaWQocF9od2ZuLCBwX3R4X2NpZCk7CiB9CiAKLXN0YXRpYyBlbnVtIGV0aF9maWx0ZXJfYWN0aW9uCi1xZWRfZmlsdGVyX2FjdGlvbihlbnVtIHFlZF9maWx0ZXJfb3Bjb2RlIG9wY29kZSkKK3N0YXRpYyBlbnVtIGV0aF9maWx0ZXJfYWN0aW9uIHFlZF9maWx0ZXJfYWN0aW9uKGVudW0gcWVkX2ZpbHRlcl9vcGNvZGUgb3Bjb2RlKQogewogCWVudW0gZXRoX2ZpbHRlcl9hY3Rpb24gYWN0aW9uID0gTUFYX0VUSF9GSUxURVJfQUNUSU9OOwogCkBAIC0xMDMzLDE5ICsxMDM1LDE5IEBACiAJCXBfZmlyc3RfZmlsdGVyLT52bmkgPSBjcHVfdG9fbGUzMihwX2ZpbHRlcl9jbWQtPnZuaSk7CiAKIAlpZiAocF9maWx0ZXJfY21kLT5vcGNvZGUgPT0gUUVEX0ZJTFRFUl9NT1ZFKSB7Ci0JCXBfc2Vjb25kX2ZpbHRlci0+dHlwZQkJPSBwX2ZpcnN0X2ZpbHRlci0+dHlwZTsKLQkJcF9zZWNvbmRfZmlsdGVyLT5tYWNfbXNiCT0gcF9maXJzdF9maWx0ZXItPm1hY19tc2I7Ci0JCXBfc2Vjb25kX2ZpbHRlci0+bWFjX21pZAk9IHBfZmlyc3RfZmlsdGVyLT5tYWNfbWlkOwotCQlwX3NlY29uZF9maWx0ZXItPm1hY19sc2IJPSBwX2ZpcnN0X2ZpbHRlci0+bWFjX2xzYjsKLQkJcF9zZWNvbmRfZmlsdGVyLT52bGFuX2lkCT0gcF9maXJzdF9maWx0ZXItPnZsYW5faWQ7Ci0JCXBfc2Vjb25kX2ZpbHRlci0+dm5pCQk9IHBfZmlyc3RfZmlsdGVyLT52bmk7CisJCXBfc2Vjb25kX2ZpbHRlci0+dHlwZSA9IHBfZmlyc3RfZmlsdGVyLT50eXBlOworCQlwX3NlY29uZF9maWx0ZXItPm1hY19tc2IgPSBwX2ZpcnN0X2ZpbHRlci0+bWFjX21zYjsKKwkJcF9zZWNvbmRfZmlsdGVyLT5tYWNfbWlkID0gcF9maXJzdF9maWx0ZXItPm1hY19taWQ7CisJCXBfc2Vjb25kX2ZpbHRlci0+bWFjX2xzYiA9IHBfZmlyc3RfZmlsdGVyLT5tYWNfbHNiOworCQlwX3NlY29uZF9maWx0ZXItPnZsYW5faWQgPSBwX2ZpcnN0X2ZpbHRlci0+dmxhbl9pZDsKKwkJcF9zZWNvbmRfZmlsdGVyLT52bmkgPSBwX2ZpcnN0X2ZpbHRlci0+dm5pOwogCiAJCXBfZmlyc3RfZmlsdGVyLT5hY3Rpb24gPSBFVEhfRklMVEVSX0FDVElPTl9SRU1PVkU7CiAKIAkJcF9maXJzdF9maWx0ZXItPnZwb3J0X2lkID0gdnBvcnRfdG9fcmVtb3ZlX2Zyb207CiAKLQkJcF9zZWNvbmRfZmlsdGVyLT5hY3Rpb24JCT0gRVRIX0ZJTFRFUl9BQ1RJT05fQUREOwotCQlwX3NlY29uZF9maWx0ZXItPnZwb3J0X2lkCT0gdnBvcnRfdG9fYWRkX3RvOworCQlwX3NlY29uZF9maWx0ZXItPmFjdGlvbiA9IEVUSF9GSUxURVJfQUNUSU9OX0FERDsKKwkJcF9zZWNvbmRfZmlsdGVyLT52cG9ydF9pZCA9IHZwb3J0X3RvX2FkZF90bzsKIAl9IGVsc2UgaWYgKHBfZmlsdGVyX2NtZC0+b3Bjb2RlID09IFFFRF9GSUxURVJfUkVQTEFDRSkgewogCQlwX2ZpcnN0X2ZpbHRlci0+dnBvcnRfaWQgPSB2cG9ydF90b19hZGRfdG87CiAJCW1lbWNweShwX3NlY29uZF9maWx0ZXIsIHBfZmlyc3RfZmlsdGVyLApAQCAtMTA4Niw3ICsxMDg4LDcgQEAKIAlyYyA9IHFlZF9maWx0ZXJfdWNhc3RfY29tbW9uKHBfaHdmbiwgb3BhcXVlX2ZpZCwgcF9maWx0ZXJfY21kLAogCQkJCSAgICAgJnBfcmFtcm9kLCAmcF9lbnQsCiAJCQkJICAgICBjb21wX21vZGUsIHBfY29tcF9kYXRhKTsKLQlpZiAocmMgIT0gMCkgeworCWlmIChyYykgewogCQlEUF9FUlIocF9od2ZuLCAiVW5pLiBmaWx0ZXIgY29tbWFuZCBmYWlsZWQgJWRcbiIsIHJjKTsKIAkJcmV0dXJuIHJjOwogCX0KQEAgLTEwOTQsMTAgKzEwOTYsOCBAQAogCXBfaGVhZGVyLT5hc3NlcnRfb25fZXJyb3IgPSBwX2ZpbHRlcl9jbWQtPmFzc2VydF9vbl9lcnJvcjsKIAogCXJjID0gcWVkX3NwcV9wb3N0KHBfaHdmbiwgcF9lbnQsIE5VTEwpOwotCWlmIChyYyAhPSAwKSB7Ci0JCURQX0VSUihwX2h3Zm4sCi0JCSAgICAgICAiVW5pY2FzdCBmaWx0ZXIgQUREIGNvbW1hbmQgZmFpbGVkICVkXG4iLAotCQkgICAgICAgcmMpOworCWlmIChyYykgeworCQlEUF9FUlIocF9od2ZuLCAiVW5pY2FzdCBmaWx0ZXIgQUREIGNvbW1hbmQgZmFpbGVkICVkXG4iLCByYyk7CiAJCXJldHVybiByYzsKIAl9CiAKQEAgLTExMzYsMTUgKzExMzYsMTAgQEAKICAqIFJldHVybjoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdTMyIHFlZF9jYWxjX2NyYzMyYyh1OCAqY3JjMzJfcGFja2V0LAotCQkJICAgdTMyIGNyYzMyX2xlbmd0aCwKLQkJCSAgIHUzMiBjcmMzMl9zZWVkLAotCQkJICAgdTggY29tcGxlbWVudCkKKwkJCSAgIHUzMiBjcmMzMl9sZW5ndGgsIHUzMiBjcmMzMl9zZWVkLCB1OCBjb21wbGVtZW50KQogewotCXUzMiBieXRlID0gMDsKLQl1MzIgYml0ID0gMDsKLQl1OCBtc2IgPSAwOwotCXU4IGN1cnJlbnRfYnl0ZSA9IDA7Ci0JdTMyIGNyYzMyX3Jlc3VsdCA9IGNyYzMyX3NlZWQ7CisJdTMyIGJ5dGUgPSAwLCBiaXQgPSAwLCBjcmMzMl9yZXN1bHQgPSBjcmMzMl9zZWVkOworCXU4IG1zYiA9IDAsIGN1cnJlbnRfYnl0ZSA9IDA7CiAKIAlpZiAoKCFjcmMzMl9wYWNrZXQpIHx8CiAJICAgIChjcmMzMl9sZW5ndGggPT0gMCkgfHwKQEAgLTExNjQsOSArMTE1OSw3IEBACiAJcmV0dXJuIGNyYzMyX3Jlc3VsdDsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgcWVkX2NyYzMyY19sZSh1MzIgc2VlZCwKLQkJCQl1OCAqbWFjLAotCQkJCXUzMiBsZW4pCitzdGF0aWMgdTMyIHFlZF9jcmMzMmNfbGUodTMyIHNlZWQsIHU4ICptYWMsIHUzMiBsZW4pCiB7CiAJdTMyIHBhY2tldF9idWZbMl0gPSB7IDAgfTsKIApAQCAtMTE5NiwxNyArMTE4OSwxNCBAQAogCXU4IGFic192cG9ydF9pZCA9IDA7CiAJaW50IHJjLCBpOwogCi0JaWYgKHBfZmlsdGVyX2NtZC0+b3Bjb2RlID09IFFFRF9GSUxURVJfQUREKSB7CisJaWYgKHBfZmlsdGVyX2NtZC0+b3Bjb2RlID09IFFFRF9GSUxURVJfQUREKQogCQlyYyA9IHFlZF9md192cG9ydChwX2h3Zm4sIHBfZmlsdGVyX2NtZC0+dnBvcnRfdG9fYWRkX3RvLAogCQkJCSAgJmFic192cG9ydF9pZCk7Ci0JCWlmIChyYykKLQkJCXJldHVybiByYzsKLQl9IGVsc2UgeworCWVsc2UKIAkJcmMgPSBxZWRfZndfdnBvcnQocF9od2ZuLCBwX2ZpbHRlcl9jbWQtPnZwb3J0X3RvX3JlbW92ZV9mcm9tLAogCQkJCSAgJmFic192cG9ydF9pZCk7Ci0JCWlmIChyYykKLQkJCXJldHVybiByYzsKLQl9CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAKIAkvKiBHZXQgU1BRIGVudHJ5ICovCiAJbWVtc2V0KCZpbml0X2RhdGEsIDAsIHNpemVvZihpbml0X2RhdGEpKTsKQEAgLTEyNDQsMTEgKzEyMzQsMTEgQEAKIAogCQkvKiBDb252ZXJ0IHRvIGNvcnJlY3QgZW5kaWFuaXR5ICovCiAJCWZvciAoaSA9IDA7IGkgPCBFVEhfTVVMVElDQVNUX01BQ19CSU5TX0lOX1JFR1M7IGkrKykgeworCQkJc3RydWN0IHZwb3J0X3VwZGF0ZV9yYW1yb2RfbWNhc3QgKnBfcmFtcm9kX2JpbnM7CiAJCQl1MzIgKnBfYmlucyA9ICh1MzIgKiliaW5zOwotCQkJc3RydWN0IHZwb3J0X3VwZGF0ZV9yYW1yb2RfbWNhc3QgKmFwcHJveF9tY2FzdDsKIAotCQkJYXBwcm94X21jYXN0ID0gJnBfcmFtcm9kLT5hcHByb3hfbWNhc3Q7Ci0JCQlhcHByb3hfbWNhc3QtPmJpbnNbaV0gPSBjcHVfdG9fbGUzMihwX2JpbnNbaV0pOworCQkJcF9yYW1yb2RfYmlucyA9ICZwX3JhbXJvZC0+YXBwcm94X21jYXN0OworCQkJcF9yYW1yb2RfYmlucy0+Ymluc1tpXSA9IGNwdV90b19sZTMyKHBfYmluc1tpXSk7CiAJCX0KIAl9CiAKQEAgLTEyODYsOCArMTI3Niw3IEBACiAJCXJjID0gcWVkX3NwX2V0aF9maWx0ZXJfbWNhc3QocF9od2ZuLAogCQkJCQkgICAgIG9wYXF1ZV9maWQsCiAJCQkJCSAgICAgcF9maWx0ZXJfY21kLAotCQkJCQkgICAgIGNvbXBfbW9kZSwKLQkJCQkJICAgICBwX2NvbXBfZGF0YSk7CisJCQkJCSAgICAgY29tcF9tb2RlLCBwX2NvbXBfZGF0YSk7CiAJfQogCXJldHVybiByYzsKIH0KQEAgLTEzMTQsOSArMTMwMyw4IEBACiAJCXJjID0gcWVkX3NwX2V0aF9maWx0ZXJfdWNhc3QocF9od2ZuLAogCQkJCQkgICAgIG9wYXF1ZV9maWQsCiAJCQkJCSAgICAgcF9maWx0ZXJfY21kLAotCQkJCQkgICAgIGNvbXBfbW9kZSwKLQkJCQkJICAgICBwX2NvbXBfZGF0YSk7Ci0JCWlmIChyYyAhPSAwKQorCQkJCQkgICAgIGNvbXBfbW9kZSwgcF9jb21wX2RhdGEpOworCQlpZiAocmMpCiAJCQlicmVhazsKIAl9CiAKQEAgLTE1OTAsOCArMTU3OCw3IEBACiAJfQogfQogCi12b2lkIHFlZF9nZXRfdnBvcnRfc3RhdHMoc3RydWN0IHFlZF9kZXYgKmNkZXYsCi0JCQkgc3RydWN0IHFlZF9ldGhfc3RhdHMgKnN0YXRzKQordm9pZCBxZWRfZ2V0X3Zwb3J0X3N0YXRzKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCBzdHJ1Y3QgcWVkX2V0aF9zdGF0cyAqc3RhdHMpCiB7CiAJdTMyIGk7CiAKQEAgLTE2OTgsNiArMTY4NSw4IEBACiAJCXFlZF92Zl9nZXRfbnVtX3ZsYW5fZmlsdGVycygmY2Rldi0+aHdmbnNbMF0sCiAJCQkJCSAgICAmaW5mby0+bnVtX3ZsYW5fZmlsdGVycyk7CiAJCXFlZF92Zl9nZXRfcG9ydF9tYWMoJmNkZXYtPmh3Zm5zWzBdLCBpbmZvLT5wb3J0X21hYyk7CisKKwkJaW5mby0+aXNfbGVnYWN5ID0gISFjZGV2LT5od2Zuc1swXS52Zl9pb3ZfaW5mby0+Yl9wcmVfZnBfaHNpOwogCX0KIAogCXFlZF9maWxsX2Rldl9pbmZvKGNkZXYsICZpbmZvLT5jb21tb24pOwpAQCAtMTc2Niw4ICsxNzU1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBxZWRfc3RvcF92cG9ydChzdHJ1Y3QgcWVkX2RldiAqY2RldiwKLQkJCSAgdTggdnBvcnRfaWQpCitzdGF0aWMgaW50IHFlZF9zdG9wX3Zwb3J0KHN0cnVjdCBxZWRfZGV2ICpjZGV2LCB1OCB2cG9ydF9pZCkKIHsKIAlpbnQgcmMsIGk7CiAKQEAgLTE3NzUsOCArMTc2Myw3IEBACiAJCXN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuID0gJmNkZXYtPmh3Zm5zW2ldOwogCiAJCXJjID0gcWVkX3NwX3Zwb3J0X3N0b3AocF9od2ZuLAotCQkJCSAgICAgICBwX2h3Zm4tPmh3X2luZm8ub3BhcXVlX2ZpZCwKLQkJCQkgICAgICAgdnBvcnRfaWQpOworCQkJCSAgICAgICBwX2h3Zm4tPmh3X2luZm8ub3BhcXVlX2ZpZCwgdnBvcnRfaWQpOwogCiAJCWlmIChyYykgewogCQkJRFBfRVJSKGNkZXYsICJGYWlsZWQgdG8gc3RvcCBWUE9SVFxuIik7CkBAIC0xODAxLDEwICsxNzg4LDggQEAKIAogCS8qIFRyYW5zbGF0ZSBwcm90b2NvbCBwYXJhbXMgaW50byBzcCBwYXJhbXMgKi8KIAlzcF9wYXJhbXMudnBvcnRfaWQgPSBwYXJhbXMtPnZwb3J0X2lkOwotCXNwX3BhcmFtcy51cGRhdGVfdnBvcnRfYWN0aXZlX3J4X2ZsZyA9Ci0JCXBhcmFtcy0+dXBkYXRlX3Zwb3J0X2FjdGl2ZV9mbGc7Ci0Jc3BfcGFyYW1zLnVwZGF0ZV92cG9ydF9hY3RpdmVfdHhfZmxnID0KLQkJcGFyYW1zLT51cGRhdGVfdnBvcnRfYWN0aXZlX2ZsZzsKKwlzcF9wYXJhbXMudXBkYXRlX3Zwb3J0X2FjdGl2ZV9yeF9mbGcgPSBwYXJhbXMtPnVwZGF0ZV92cG9ydF9hY3RpdmVfZmxnOworCXNwX3BhcmFtcy51cGRhdGVfdnBvcnRfYWN0aXZlX3R4X2ZsZyA9IHBhcmFtcy0+dXBkYXRlX3Zwb3J0X2FjdGl2ZV9mbGc7CiAJc3BfcGFyYW1zLnZwb3J0X2FjdGl2ZV9yeF9mbGcgPSBwYXJhbXMtPnZwb3J0X2FjdGl2ZV9mbGc7CiAJc3BfcGFyYW1zLnZwb3J0X2FjdGl2ZV90eF9mbGcgPSBwYXJhbXMtPnZwb3J0X2FjdGl2ZV9mbGc7CiAJc3BfcGFyYW1zLnVwZGF0ZV90eF9zd2l0Y2hpbmdfZmxnID0gcGFyYW1zLT51cGRhdGVfdHhfc3dpdGNoaW5nX2ZsZzsKQEAgLTE4MTcsOCArMTgwMiw3IEBACiAJICogV2UgbmVlZCB0byByZS1maXggdGhlIHJzcyB2YWx1ZXMgcGVyIGVuZ2luZSBmb3IgQ01ULgogCSAqLwogCWlmIChjZGV2LT5udW1faHdmbnMgPiAxICYmIHBhcmFtcy0+dXBkYXRlX3Jzc19mbGcpIHsKLQkJc3RydWN0IHFlZF91cGRhdGVfdnBvcnRfcnNzX3BhcmFtcyAqcnNzID0KLQkJCSZwYXJhbXMtPnJzc19wYXJhbXM7CisJCXN0cnVjdCBxZWRfdXBkYXRlX3Zwb3J0X3Jzc19wYXJhbXMgKnJzcyA9ICZwYXJhbXMtPnJzc19wYXJhbXM7CiAJCWludCBrLCBtYXggPSAwOwogCiAJCS8qIEZpbmQgbGFyZ2VzdCBlbnRyeSwgc2luY2UgaXQncyBwb3NzaWJsZSBSU1MgbmVlZHMgdG8KQEAgLTE4NjEsOCArMTg0NSw4IEBACiAJCSAgICAgICBRRURfUlNTX0lORF9UQUJMRV9TSVpFICogc2l6ZW9mKHUxNikpOwogCQltZW1jcHkoc3BfcnNzX3BhcmFtcy5yc3Nfa2V5LCBwYXJhbXMtPnJzc19wYXJhbXMucnNzX2tleSwKIAkJICAgICAgIFFFRF9SU1NfS0VZX1NJWkUgKiBzaXplb2YodTMyKSk7CisJCXNwX3BhcmFtcy5yc3NfcGFyYW1zID0gJnNwX3Jzc19wYXJhbXM7CiAJfQotCXNwX3BhcmFtcy5yc3NfcGFyYW1zID0gJnNwX3Jzc19wYXJhbXM7CiAKIAlmb3JfZWFjaF9od2ZuKGNkZXYsIGkpIHsKIAkJc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4gPSAmY2Rldi0+aHdmbnNbaV07CkBAIC0xODkzLDggKzE4NzcsOCBAQAogCQkJIHUxNiBjcWVfcGJsX3NpemUsCiAJCQkgdm9pZCBfX2lvbWVtICoqcHBfcHJvZCkKIHsKLQlpbnQgcmMsIGh3Zm5faW5kZXg7CiAJc3RydWN0IHFlZF9od2ZuICpwX2h3Zm47CisJaW50IHJjLCBod2ZuX2luZGV4OwogCiAJaHdmbl9pbmRleCA9IHBhcmFtcy0+cnNzX2lkICUgY2Rldi0+bnVtX2h3Zm5zOwogCXBfaHdmbiA9ICZjZGV2LT5od2Zuc1tod2ZuX2luZGV4XTsKQEAgLTE5MzUsOCArMTkxOSw3IEBACiAKIAlyYyA9IHFlZF9zcF9ldGhfcnhfcXVldWVfc3RvcChwX2h3Zm4sCiAJCQkJICAgICAgcGFyYW1zLT5yeF9xdWV1ZV9pZCAvIGNkZXYtPm51bV9od2ZucywKLQkJCQkgICAgICBwYXJhbXMtPmVxX2NvbXBsZXRpb25fb25seSwKLQkJCQkgICAgICBmYWxzZSk7CisJCQkJICAgICAgcGFyYW1zLT5lcV9jb21wbGV0aW9uX29ubHksIGZhbHNlKTsKIAlpZiAocmMpIHsKIAkJRFBfRVJSKGNkZXYsICJGYWlsZWQgdG8gc3RvcCBSWFEjJWRcbiIsIHBhcmFtcy0+cnhfcXVldWVfaWQpOwogCQlyZXR1cm4gcmM7CkBAIC0yMDQ3LDExICsyMDMwLDExIEBACiAKIAltZW1zZXQoJmFjY2VwdF9mbGFncywgMCwgc2l6ZW9mKGFjY2VwdF9mbGFncykpOwogCi0JYWNjZXB0X2ZsYWdzLnVwZGF0ZV9yeF9tb2RlX2NvbmZpZwk9IDE7Ci0JYWNjZXB0X2ZsYWdzLnVwZGF0ZV90eF9tb2RlX2NvbmZpZwk9IDE7Ci0JYWNjZXB0X2ZsYWdzLnJ4X2FjY2VwdF9maWx0ZXIJCT0gUUVEX0FDQ0VQVF9VQ0FTVF9NQVRDSEVEIHwKLQkJCQkJCSAgUUVEX0FDQ0VQVF9NQ0FTVF9NQVRDSEVEIHwKLQkJCQkJCSAgUUVEX0FDQ0VQVF9CQ0FTVDsKKwlhY2NlcHRfZmxhZ3MudXBkYXRlX3J4X21vZGVfY29uZmlnID0gMTsKKwlhY2NlcHRfZmxhZ3MudXBkYXRlX3R4X21vZGVfY29uZmlnID0gMTsKKwlhY2NlcHRfZmxhZ3MucnhfYWNjZXB0X2ZpbHRlciA9IFFFRF9BQ0NFUFRfVUNBU1RfTUFUQ0hFRCB8CisJCQkJCVFFRF9BQ0NFUFRfTUNBU1RfTUFUQ0hFRCB8CisJCQkJCVFFRF9BQ0NFUFRfQkNBU1Q7CiAJYWNjZXB0X2ZsYWdzLnR4X2FjY2VwdF9maWx0ZXIgPSBRRURfQUNDRVBUX1VDQVNUX01BVENIRUQgfAogCQkJCQlRRURfQUNDRVBUX01DQVNUX01BVENIRUQgfAogCQkJCQlRRURfQUNDRVBUX0JDQVNUOwpAQCAtMjA3Miw5ICsyMDU1LDggQEAKIAlzdHJ1Y3QgcWVkX2ZpbHRlcl91Y2FzdCB1Y2FzdDsKIAogCWlmICghcGFyYW1zLT52bGFuX3ZhbGlkICYmICFwYXJhbXMtPm1hY192YWxpZCkgewotCQlEUF9OT1RJQ0UoCi0JCQljZGV2LAotCQkJIlRyaWVkIGNvbmZpZ3VyaW5nIGEgdW5pY2FzdCBmaWx0ZXIsIGJ1dCBib3RoIE1BQyBhbmQgVkxBTiBhcmUgbm90IHNldFxuIik7CisJCURQX05PVElDRShjZGV2LAorCQkJICAiVHJpZWQgY29uZmlndXJpbmcgYSB1bmljYXN0IGZpbHRlciwgYnV0IGJvdGggTUFDIGFuZCBWTEFOIGFyZSBub3Qgc2V0XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMTM1LDggKzIxMTcsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBtY2FzdC5udW1fbWNfYWRkcnM7IGkrKykKIAkJZXRoZXJfYWRkcl9jb3B5KG1jYXN0Lm1hY1tpXSwgcGFyYW1zLT5tYWNbaV0pOwogCi0JcmV0dXJuIHFlZF9maWx0ZXJfbWNhc3RfY21kKGNkZXYsICZtY2FzdCwKLQkJCQkgICAgUUVEX1NQUV9NT0RFX0NCLCBOVUxMKTsKKwlyZXR1cm4gcWVkX2ZpbHRlcl9tY2FzdF9jbWQoY2RldiwgJm1jYXN0LCBRRURfU1BRX01PREVfQ0IsIE5VTEwpOwogfQogCiBzdGF0aWMgaW50IHFlZF9jb25maWd1cmVfZmlsdGVyKHN0cnVjdCBxZWRfZGV2ICpjZGV2LApAQCAtMjE1MywxNSArMjEzNCwxMyBAQAogCQlhY2NlcHRfZmxhZ3MgPSBwYXJhbXMtPmZpbHRlci5hY2NlcHRfZmxhZ3M7CiAJCXJldHVybiBxZWRfY29uZmlndXJlX2ZpbHRlcl9yeF9tb2RlKGNkZXYsIGFjY2VwdF9mbGFncyk7CiAJZGVmYXVsdDoKLQkJRFBfTk9USUNFKGNkZXYsICJVbmtub3duIGZpbHRlciB0eXBlICVkXG4iLAotCQkJICAoaW50KXBhcmFtcy0+dHlwZSk7CisJCURQX05PVElDRShjZGV2LCAiVW5rbm93biBmaWx0ZXIgdHlwZSAlZFxuIiwgKGludClwYXJhbXMtPnR5cGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiB9CiAKIHN0YXRpYyBpbnQgcWVkX2ZwX2NxZV9jb21wbGV0aW9uKHN0cnVjdCBxZWRfZGV2ICpkZXYsCi0JCQkJIHU4IHJzc19pZCwKLQkJCQkgc3RydWN0IGV0aF9zbG93X3BhdGhfcnhfY3FlICpjcWUpCisJCQkJIHU4IHJzc19pZCwgc3RydWN0IGV0aF9zbG93X3BhdGhfcnhfY3FlICpjcWUpCiB7CiAJcmV0dXJuIHFlZF9ldGhfY3FlX2NvbXBsZXRpb24oJmRldi0+aHdmbnNbcnNzX2lkICUgZGV2LT5udW1faHdmbnNdLAogCQkJCSAgICAgIGNxZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9sMi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfbDIuaAppbmRleCAwMDIxMTQ1Li5lNDk1ZDYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9sMi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2wyLmgKQEAgLTEwMiw2ICsxMDIsOCBAQAogCXUxNiBvcGFxdWVfZmlkOwogCXU4IHZwb3J0X2lkOwogCXUxNiBtdHU7CisJYm9vbCBjaGVja19tYWM7CisJYm9vbCBjaGVja19ldGh0eXBlOwogfTsKIAogaW50IHFlZF9zcF9ldGhfdnBvcnRfc3RhcnQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCkBAIC0yMTMsNiArMjE1LDggQEAKIAkJCSAgICBlbnVtIHNwcV9tb2RlIGNvbXBfbW9kZSwKIAkJCSAgICBzdHJ1Y3QgcWVkX3NwcV9jb21wX2NiICpwX2NvbXBfZGF0YSk7CiAKK3ZvaWQgcWVkX2dldF92cG9ydF9zdGF0cyhzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgc3RydWN0IHFlZF9ldGhfc3RhdHMgKnN0YXRzKTsKKwogaW50IHFlZF9zcF9ldGhfdnBvcnRfc3RhcnQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCiAJCQkgICBzdHJ1Y3QgcWVkX3NwX3Zwb3J0X3N0YXJ0X3BhcmFtcyAqcF9wYXJhbXMpOwogCkBAIC0yMjMsNyArMjI3LDggQEAKIAkJCQl1OCBzdGF0c19pZCwKIAkJCQl1MTYgYmRfbWF4X2J5dGVzLAogCQkJCWRtYV9hZGRyX3QgYmRfY2hhaW5fcGh5c19hZGRyLAotCQkJCWRtYV9hZGRyX3QgY3FlX3BibF9hZGRyLCB1MTYgY3FlX3BibF9zaXplKTsKKwkJCQlkbWFfYWRkcl90IGNxZV9wYmxfYWRkciwKKwkJCQl1MTYgY3FlX3BibF9zaXplLCBib29sIGJfdXNlX3pvbmVfYV9wcm9kKTsKIAogaW50IHFlZF9zcF9ldGhfdHhxX3N0YXJ0X3JhbXJvZChzdHJ1Y3QgcWVkX2h3Zm4gICpwX2h3Zm4sCiAJCQkJdTE2ICBvcGFxdWVfZmlkLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfbGwyLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9sbDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmRiMTA3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfbGwyLmMKQEAgLTAsMCArMSwxNzkyIEBACisvKiBRTG9naWMgcWVkIE5JQyBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgUUxvZ2ljIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZgorICogdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9xZWQvcWVkX2xsMl9pZi5oPgorI2luY2x1ZGUgInFlZC5oIgorI2luY2x1ZGUgInFlZF9jeHQuaCIKKyNpbmNsdWRlICJxZWRfZGV2X2FwaS5oIgorI2luY2x1ZGUgInFlZF9oc2kuaCIKKyNpbmNsdWRlICJxZWRfaHcuaCIKKyNpbmNsdWRlICJxZWRfaW50LmgiCisjaW5jbHVkZSAicWVkX2xsMi5oIgorI2luY2x1ZGUgInFlZF9tY3AuaCIKKyNpbmNsdWRlICJxZWRfcmVnX2FkZHIuaCIKKyNpbmNsdWRlICJxZWRfc3AuaCIKKworI2RlZmluZSBRRURfTEwyX1JYX1JFR0lTVEVSRUQobGwyKQkoKGxsMiktPnJ4X3F1ZXVlLmJfY2JfcmVnaXN0cmVkKQorI2RlZmluZSBRRURfTEwyX1RYX1JFR0lTVEVSRUQobGwyKQkoKGxsMiktPnR4X3F1ZXVlLmJfY2JfcmVnaXN0cmVkKQorCisjZGVmaW5lIFFFRF9MTDJfVFhfU0laRSAoMjU2KQorI2RlZmluZSBRRURfTEwyX1JYX1NJWkUgKDQwOTYpCisKK3N0cnVjdCBxZWRfY2JfbGwyX2luZm8geworCWludCByeF9jbnQ7CisJdTMyIHJ4X3NpemU7CisJdTggaGFuZGxlOworCWJvb2wgZnJhZ3NfbWFwcGVkOworCisJLyogTG9jayBwcm90ZWN0aW5nIExMMiBidWZmZXIgbGlzdHMgaW4gc2xlZXBsZXNzIGNvbnRleHQgKi8KKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJY29uc3Qgc3RydWN0IHFlZF9sbDJfY2Jfb3BzICpjYnM7CisJdm9pZCAqY2JfY29va2llOworfTsKKworc3RydWN0IHFlZF9sbDJfYnVmZmVyIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdm9pZCAqZGF0YTsKKwlkbWFfYWRkcl90IHBoeXNfYWRkcjsKK307CisKK3N0YXRpYyB2b2lkIHFlZF9sbDJiX2NvbXBsZXRlX3R4X3BhY2tldChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJdTggY29ubmVjdGlvbl9oYW5kbGUsCisJCQkJCXZvaWQgKmNvb2tpZSwKKwkJCQkJZG1hX2FkZHJfdCBmaXJzdF9mcmFnX2FkZHIsCisJCQkJCWJvb2wgYl9sYXN0X2ZyYWdtZW50LAorCQkJCQlib29sIGJfbGFzdF9wYWNrZXQpCit7CisJc3RydWN0IHFlZF9kZXYgKmNkZXYgPSBwX2h3Zm4tPmNkZXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGNvb2tpZTsKKworCS8qIEFsbCB3ZSBuZWVkIHRvIGRvIGlzIHJlbGVhc2UgdGhlIG1hcHBpbmcgKi8KKwlkbWFfdW5tYXBfc2luZ2xlKCZwX2h3Zm4tPmNkZXYtPnBkZXYtPmRldiwgZmlyc3RfZnJhZ19hZGRyLAorCQkJIHNrYl9oZWFkbGVuKHNrYiksIERNQV9UT19ERVZJQ0UpOworCisJaWYgKGNkZXYtPmxsMi0+Y2JzICYmIGNkZXYtPmxsMi0+Y2JzLT50eF9jYikKKwkJY2Rldi0+bGwyLT5jYnMtPnR4X2NiKGNkZXYtPmxsMi0+Y2JfY29va2llLCBza2IsCisJCQkJICAgICAgYl9sYXN0X2ZyYWdtZW50KTsKKworCWlmIChjZGV2LT5sbDItPmZyYWdzX21hcHBlZCkKKwkJLyogQ2FzZSB3aGVyZSBtYXBwZWQgZnJhZ3Mgd2VyZSByZWNlaXZlZCwgbmVlZCB0bworCQkgKiBmcmVlIHNrYiB3aXRoIG5yX2ZyYWdzIG1hcmtlZCBhcyAwCisJCSAqLworCQlza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID0gMDsKKworCWRldl9rZnJlZV9za2JfYW55KHNrYik7Cit9CisKK3N0YXRpYyBpbnQgcWVkX2xsMl9hbGxvY19idWZmZXIoc3RydWN0IHFlZF9kZXYgKmNkZXYsCisJCQkJdTggKipkYXRhLCBkbWFfYWRkcl90ICpwaHlzX2FkZHIpCit7CisJKmRhdGEgPSBrbWFsbG9jKGNkZXYtPmxsMi0+cnhfc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKCEoKmRhdGEpKSB7CisJCURQX0lORk8oY2RldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBMTDIgYnVmZmVyIGRhdGFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkqcGh5c19hZGRyID0gZG1hX21hcF9zaW5nbGUoJmNkZXYtPnBkZXYtPmRldiwKKwkJCQkgICAgKCgqZGF0YSkgKyBORVRfU0tCX1BBRCksCisJCQkJICAgIGNkZXYtPmxsMi0+cnhfc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IoJmNkZXYtPnBkZXYtPmRldiwgKnBoeXNfYWRkcikpIHsKKwkJRFBfSU5GTyhjZGV2LCAiRmFpbGVkIHRvIG1hcCBMTDIgYnVmZmVyIGRhdGFcbiIpOworCQlrZnJlZSgoKmRhdGEpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcWVkX2xsMl9kZWFsbG9jX2J1ZmZlcihzdHJ1Y3QgcWVkX2RldiAqY2RldiwKKwkJCQkgc3RydWN0IHFlZF9sbDJfYnVmZmVyICpidWZmZXIpCit7CisJc3Bpbl9sb2NrX2JoKCZjZGV2LT5sbDItPmxvY2spOworCisJZG1hX3VubWFwX3NpbmdsZSgmY2Rldi0+cGRldi0+ZGV2LCBidWZmZXItPnBoeXNfYWRkciwKKwkJCSBjZGV2LT5sbDItPnJ4X3NpemUsIERNQV9GUk9NX0RFVklDRSk7CisJa2ZyZWUoYnVmZmVyLT5kYXRhKTsKKwlsaXN0X2RlbCgmYnVmZmVyLT5saXN0KTsKKworCWNkZXYtPmxsMi0+cnhfY250LS07CisJaWYgKCFjZGV2LT5sbDItPnJ4X2NudCkKKwkJRFBfSU5GTyhjZGV2LCAiQWxsIExMMiBlbnRyaWVzIHdlcmUgcmVtb3ZlZFxuIik7CisKKwlzcGluX3VubG9ja19iaCgmY2Rldi0+bGwyLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBxZWRfbGwyX2tpbGxfYnVmZmVycyhzdHJ1Y3QgcWVkX2RldiAqY2RldikKK3sKKwlzdHJ1Y3QgcWVkX2xsMl9idWZmZXIgKmJ1ZmZlciwgKnRtcF9idWZmZXI7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYnVmZmVyLCB0bXBfYnVmZmVyLCAmY2Rldi0+bGwyLT5saXN0LCBsaXN0KQorCQlxZWRfbGwyX2RlYWxsb2NfYnVmZmVyKGNkZXYsIGJ1ZmZlcik7Cit9CisKK3ZvaWQgcWVkX2xsMmJfY29tcGxldGVfcnhfcGFja2V0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSB1OCBjb25uZWN0aW9uX2hhbmRsZSwKKwkJCQkgc3RydWN0IHFlZF9sbDJfcnhfcGFja2V0ICpwX3BrdCwKKwkJCQkgc3RydWN0IGNvcmVfcnhfZmFzdF9wYXRoX2NxZSAqcF9jcWUsCisJCQkJIGJvb2wgYl9sYXN0X3BhY2tldCkKK3sKKwl1MTYgcGFja2V0X2xlbmd0aCA9IGxlMTZfdG9fY3B1KHBfY3FlLT5wYWNrZXRfbGVuZ3RoKTsKKwlzdHJ1Y3QgcWVkX2xsMl9idWZmZXIgKmJ1ZmZlciA9IHBfcGt0LT5jb29raWU7CisJc3RydWN0IHFlZF9kZXYgKmNkZXYgPSBwX2h3Zm4tPmNkZXY7CisJdTE2IHZsYW4gPSBsZTE2X3RvX2NwdShwX2NxZS0+dmxhbik7CisJdTMyIG9wYXF1ZV9kYXRhXzAsIG9wYXF1ZV9kYXRhXzE7CisJdTggcGFkID0gcF9jcWUtPnBsYWNlbWVudF9vZmZzZXQ7CisJZG1hX2FkZHJfdCBuZXdfcGh5c19hZGRyOworCXN0cnVjdCBza19idWZmICpza2I7CisJYm9vbCByZXVzZSA9IGZhbHNlOworCWludCByYyA9IC1FSU5WQUw7CisJdTggKm5ld19kYXRhOworCisJb3BhcXVlX2RhdGFfMCA9IGxlMzJfdG9fY3B1KHBfY3FlLT5vcGFxdWVfZGF0YS5kYXRhWzBdKTsKKwlvcGFxdWVfZGF0YV8xID0gbGUzMl90b19jcHUocF9jcWUtPm9wYXF1ZV9kYXRhLmRhdGFbMV0pOworCisJRFBfVkVSQk9TRShwX2h3Zm4sCisJCSAgIChORVRJRl9NU0dfUlhfU1RBVFVTIHwgUUVEX01TR19TVE9SQUdFIHwgTkVUSUZfTVNHX1BLVERBVEEpLAorCQkgICAiR290IGFuIExMMiBSeCBjb21wbGV0aW9uOiBbQnVmZmVyIGF0IHBoeXMgMHglbGx4LCBvZmZzZXQgMHglMDJ4XSBMZW5ndGggMHglMDR4IFBhcnNlX2ZsYWdzIDB4JTA0eCB2bGFuIDB4JTA0eCBPcGFxdWUgZGF0YSBbMHglMDh4OjB4JTA4eF1cbiIsCisJCSAgICh1NjQpcF9wa3QtPnJ4X2J1Zl9hZGRyLCBwYWQsIHBhY2tldF9sZW5ndGgsCisJCSAgIGxlMTZfdG9fY3B1KHBfY3FlLT5wYXJzZV9mbGFncy5mbGFncyksIHZsYW4sCisJCSAgIG9wYXF1ZV9kYXRhXzAsIG9wYXF1ZV9kYXRhXzEpOworCisJaWYgKChjZGV2LT5kcF9tb2R1bGUgJiBORVRJRl9NU0dfUEtUREFUQSkgJiYgYnVmZmVyLT5kYXRhKSB7CisJCXByaW50X2hleF9kdW1wKEtFUk5fSU5GTywgIiIsCisJCQkgICAgICAgRFVNUF9QUkVGSVhfT0ZGU0VULCAxNiwgMSwKKwkJCSAgICAgICBidWZmZXItPmRhdGEsIHBhY2tldF9sZW5ndGgsIGZhbHNlKTsKKwl9CisKKwkvKiBEZXRlcm1pbmUgaWYgZGF0YSBpcyB2YWxpZCAqLworCWlmIChwYWNrZXRfbGVuZ3RoIDwgRVRIX0hMRU4pCisJCXJldXNlID0gdHJ1ZTsKKworCS8qIEFsbG9jYXRlIGEgcmVwbGFjZW1lbnQgZm9yIGJ1ZmZlcjsgUmV1c2UgdXBvbiBmYWlsdXJlICovCisJaWYgKCFyZXVzZSkKKwkJcmMgPSBxZWRfbGwyX2FsbG9jX2J1ZmZlcihwX2h3Zm4tPmNkZXYsICZuZXdfZGF0YSwKKwkJCQkJICAmbmV3X3BoeXNfYWRkcik7CisKKwkvKiBJZiBuZWVkIHRvIHJldXNlIG9yIHRoZXJlJ3Mgbm8gcmVwbGFjZW1lbnQgYnVmZmVyLCByZXBvc3QgdGhpcyAqLworCWlmIChyYykKKwkJZ290byBvdXRfcG9zdDsKKworCXNrYiA9IGJ1aWxkX3NrYihidWZmZXItPmRhdGEsIDApOworCWlmICghc2tiKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXRfcG9zdDsKKwl9CisKKwlwYWQgKz0gTkVUX1NLQl9QQUQ7CisJc2tiX3Jlc2VydmUoc2tiLCBwYWQpOworCXNrYl9wdXQoc2tiLCBwYWNrZXRfbGVuZ3RoKTsKKwlza2JfY2hlY2tzdW1fbm9uZV9hc3NlcnQoc2tiKTsKKworCS8qIEdldCBwYXJpdGFsIGV0aGVybmV0IGluZm9ybWF0aW9uIGluc3RlYWQgb2YgZXRoX3R5cGVfdHJhbnMoKSwKKwkgKiBTaW5jZSB3ZSBkb24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgbmV0X2RldmljZS4KKwkgKi8KKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworCXNrYi0+cHJvdG9jb2wgPSBldGhfaGRyKHNrYiktPmhfcHJvdG87CisKKwkvKiBQYXNzIFNLQiBvbndhcmQgKi8KKwlpZiAoY2Rldi0+bGwyLT5jYnMgJiYgY2Rldi0+bGwyLT5jYnMtPnJ4X2NiKSB7CisJCWlmICh2bGFuKQorCQkJX192bGFuX2h3YWNjZWxfcHV0X3RhZyhza2IsIGh0b25zKEVUSF9QXzgwMjFRKSwgdmxhbik7CisJCWNkZXYtPmxsMi0+Y2JzLT5yeF9jYihjZGV2LT5sbDItPmNiX2Nvb2tpZSwgc2tiLAorCQkJCSAgICAgIG9wYXF1ZV9kYXRhXzAsIG9wYXF1ZV9kYXRhXzEpOworCX0KKworCS8qIFVwZGF0ZSBCdWZmZXIgaW5mb3JtYXRpb24gYW5kIHVwZGF0ZSBGVyBwcm9kdWNlciAqLworCWJ1ZmZlci0+ZGF0YSA9IG5ld19kYXRhOworCWJ1ZmZlci0+cGh5c19hZGRyID0gbmV3X3BoeXNfYWRkcjsKKworb3V0X3Bvc3Q6CisJcmMgPSBxZWRfbGwyX3Bvc3RfcnhfYnVmZmVyKFFFRF9MRUFESU5HX0hXRk4oY2RldiksIGNkZXYtPmxsMi0+aGFuZGxlLAorCQkJCSAgICBidWZmZXItPnBoeXNfYWRkciwgMCwgIGJ1ZmZlciwgMSk7CisKKwlpZiAocmMpCisJCXFlZF9sbDJfZGVhbGxvY19idWZmZXIoY2RldiwgYnVmZmVyKTsKK30KKworc3RhdGljIHN0cnVjdCBxZWRfbGwyX2luZm8gKl9fcWVkX2xsMl9oYW5kbGVfc2FuaXR5KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJICAgIHU4IGNvbm5lY3Rpb25faGFuZGxlLAorCQkJCQkJICAgIGJvb2wgYl9sb2NrLAorCQkJCQkJICAgIGJvb2wgYl9vbmx5X2FjdGl2ZSkKK3sKKwlzdHJ1Y3QgcWVkX2xsMl9pbmZvICpwX2xsMl9jb25uLCAqcF9yZXQgPSBOVUxMOworCisJaWYgKGNvbm5lY3Rpb25faGFuZGxlID49IFFFRF9NQVhfTlVNX09GX0xMMl9DT05ORUNUSU9OUykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIXBfaHdmbi0+cF9sbDJfaW5mbykKKwkJcmV0dXJuIE5VTEw7CisKKwlwX2xsMl9jb25uID0gJnBfaHdmbi0+cF9sbDJfaW5mb1tjb25uZWN0aW9uX2hhbmRsZV07CisKKwlpZiAoYl9vbmx5X2FjdGl2ZSkgeworCQlpZiAoYl9sb2NrKQorCQkJbXV0ZXhfbG9jaygmcF9sbDJfY29ubi0+bXV0ZXgpOworCQlpZiAocF9sbDJfY29ubi0+Yl9hY3RpdmUpCisJCQlwX3JldCA9IHBfbGwyX2Nvbm47CisJCWlmIChiX2xvY2spCisJCQltdXRleF91bmxvY2soJnBfbGwyX2Nvbm4tPm11dGV4KTsKKwl9IGVsc2UgeworCQlwX3JldCA9IHBfbGwyX2Nvbm47CisJfQorCisJcmV0dXJuIHBfcmV0OworfQorCitzdGF0aWMgc3RydWN0IHFlZF9sbDJfaW5mbyAqcWVkX2xsMl9oYW5kbGVfc2FuaXR5KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJICB1OCBjb25uZWN0aW9uX2hhbmRsZSkKK3sKKwlyZXR1cm4gX19xZWRfbGwyX2hhbmRsZV9zYW5pdHkocF9od2ZuLCBjb25uZWN0aW9uX2hhbmRsZSwgZmFsc2UsIHRydWUpOworfQorCitzdGF0aWMgc3RydWN0IHFlZF9sbDJfaW5mbyAqcWVkX2xsMl9oYW5kbGVfc2FuaXR5X2xvY2soc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgICAgICAgdTggY29ubmVjdGlvbl9oYW5kbGUpCit7CisJcmV0dXJuIF9fcWVkX2xsMl9oYW5kbGVfc2FuaXR5KHBfaHdmbiwgY29ubmVjdGlvbl9oYW5kbGUsIHRydWUsIHRydWUpOworfQorCitzdGF0aWMgc3RydWN0IHFlZF9sbDJfaW5mbyAqcWVkX2xsMl9oYW5kbGVfc2FuaXR5X2luYWN0aXZlKHN0cnVjdCBxZWRfaHdmbgorCQkJCQkJCSAgICpwX2h3Zm4sCisJCQkJCQkJICAgdTggY29ubmVjdGlvbl9oYW5kbGUpCit7CisJcmV0dXJuIF9fcWVkX2xsMl9oYW5kbGVfc2FuaXR5KHBfaHdmbiwgY29ubmVjdGlvbl9oYW5kbGUsIGZhbHNlLCBmYWxzZSk7Cit9CisKK3N0YXRpYyB2b2lkIHFlZF9sbDJfdHhxX2ZsdXNoKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCB1OCBjb25uZWN0aW9uX2hhbmRsZSkKK3sKKwlib29sIGJfbGFzdF9wYWNrZXQgPSBmYWxzZSwgYl9sYXN0X2ZyYWcgPSBmYWxzZTsKKwlzdHJ1Y3QgcWVkX2xsMl90eF9wYWNrZXQgKnBfcGt0ID0gTlVMTDsKKwlzdHJ1Y3QgcWVkX2xsMl9pbmZvICpwX2xsMl9jb25uOworCXN0cnVjdCBxZWRfbGwyX3R4X3F1ZXVlICpwX3R4OworCWRtYV9hZGRyX3QgdHhfZnJhZzsKKworCXBfbGwyX2Nvbm4gPSBxZWRfbGwyX2hhbmRsZV9zYW5pdHlfaW5hY3RpdmUocF9od2ZuLCBjb25uZWN0aW9uX2hhbmRsZSk7CisJaWYgKCFwX2xsMl9jb25uKQorCQlyZXR1cm47CisKKwlwX3R4ID0gJnBfbGwyX2Nvbm4tPnR4X3F1ZXVlOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZwX3R4LT5hY3RpdmVfZGVzY3EpKSB7CisJCXBfcGt0ID0gbGlzdF9maXJzdF9lbnRyeSgmcF90eC0+YWN0aXZlX2Rlc2NxLAorCQkJCQkgc3RydWN0IHFlZF9sbDJfdHhfcGFja2V0LCBsaXN0X2VudHJ5KTsKKwkJaWYgKCFwX3BrdCkKKwkJCWJyZWFrOworCisJCWxpc3RfZGVsKCZwX3BrdC0+bGlzdF9lbnRyeSk7CisJCWJfbGFzdF9wYWNrZXQgPSBsaXN0X2VtcHR5KCZwX3R4LT5hY3RpdmVfZGVzY3EpOworCQlsaXN0X2FkZF90YWlsKCZwX3BrdC0+bGlzdF9lbnRyeSwgJnBfdHgtPmZyZWVfZGVzY3EpOworCQlwX3R4LT5jdXJfY29tcGxldGluZ19wYWNrZXQgPSAqcF9wa3Q7CisJCXBfdHgtPmN1cl9jb21wbGV0aW5nX2JkX2lkeCA9IDE7CisJCWJfbGFzdF9mcmFnID0gcF90eC0+Y3VyX2NvbXBsZXRpbmdfYmRfaWR4ID09IHBfcGt0LT5iZF91c2VkOworCQl0eF9mcmFnID0gcF9wa3QtPmJkc19zZXRbMF0udHhfZnJhZzsKKwkJaWYgKHBfbGwyX2Nvbm4tPmdzaV9lbmFibGUpCisJCQlxZWRfbGwyYl9yZWxlYXNlX3R4X2dzaV9wYWNrZXQocF9od2ZuLAorCQkJCQkJICAgICAgIHBfbGwyX2Nvbm4tPm15X2lkLAorCQkJCQkJICAgICAgIHBfcGt0LT5jb29raWUsCisJCQkJCQkgICAgICAgdHhfZnJhZywKKwkJCQkJCSAgICAgICBiX2xhc3RfZnJhZywKKwkJCQkJCSAgICAgICBiX2xhc3RfcGFja2V0KTsKKwkJZWxzZQorCQkJcWVkX2xsMmJfY29tcGxldGVfdHhfcGFja2V0KHBfaHdmbiwKKwkJCQkJCSAgICBwX2xsMl9jb25uLT5teV9pZCwKKwkJCQkJCSAgICBwX3BrdC0+Y29va2llLAorCQkJCQkJICAgIHR4X2ZyYWcsCisJCQkJCQkgICAgYl9sYXN0X2ZyYWcsCisJCQkJCQkgICAgYl9sYXN0X3BhY2tldCk7CisKKwl9Cit9CisKK3N0YXRpYyBpbnQgcWVkX2xsMl90eHFfY29tcGxldGlvbihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgdm9pZCAqcF9jb29raWUpCit7CisJc3RydWN0IHFlZF9sbDJfaW5mbyAqcF9sbDJfY29ubiA9IHBfY29va2llOworCXN0cnVjdCBxZWRfbGwyX3R4X3F1ZXVlICpwX3R4ID0gJnBfbGwyX2Nvbm4tPnR4X3F1ZXVlOworCXUxNiBuZXdfaWR4ID0gMCwgbnVtX2JkcyA9IDAsIG51bV9iZHNfaW5fcGFja2V0ID0gMDsKKwlzdHJ1Y3QgcWVkX2xsMl90eF9wYWNrZXQgKnBfcGt0OworCWJvb2wgYl9sYXN0X2ZyYWcgPSBmYWxzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWRtYV9hZGRyX3QgdHhfZnJhZzsKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBfdHgtPmxvY2ssIGZsYWdzKTsKKwlpZiAocF90eC0+Yl9jb21wbGV0aW5nX3BhY2tldCkgeworCQlyYyA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJbmV3X2lkeCA9IGxlMTZfdG9fY3B1KCpwX3R4LT5wX2Z3X2NvbnMpOworCW51bV9iZHMgPSAoKHMxNiluZXdfaWR4IC0gKHMxNilwX3R4LT5iZHNfaWR4KTsKKwl3aGlsZSAobnVtX2JkcykgeworCQlpZiAobGlzdF9lbXB0eSgmcF90eC0+YWN0aXZlX2Rlc2NxKSkKKwkJCWdvdG8gb3V0OworCisJCXBfcGt0ID0gbGlzdF9maXJzdF9lbnRyeSgmcF90eC0+YWN0aXZlX2Rlc2NxLAorCQkJCQkgc3RydWN0IHFlZF9sbDJfdHhfcGFja2V0LCBsaXN0X2VudHJ5KTsKKwkJaWYgKCFwX3BrdCkKKwkJCWdvdG8gb3V0OworCisJCXBfdHgtPmJfY29tcGxldGluZ19wYWNrZXQgPSB0cnVlOworCQlwX3R4LT5jdXJfY29tcGxldGluZ19wYWNrZXQgPSAqcF9wa3Q7CisJCW51bV9iZHNfaW5fcGFja2V0ID0gcF9wa3QtPmJkX3VzZWQ7CisJCWxpc3RfZGVsKCZwX3BrdC0+bGlzdF9lbnRyeSk7CisKKwkJaWYgKG51bV9iZHMgPCBudW1fYmRzX2luX3BhY2tldCkgeworCQkJRFBfTk9USUNFKHBfaHdmbiwKKwkJCQkgICJSZXN0IG9mIEJEcyBkb2VzIG5vdCBjb3ZlciB3aG9sZSBwYWNrZXRcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKworCQludW1fYmRzIC09IG51bV9iZHNfaW5fcGFja2V0OworCQlwX3R4LT5iZHNfaWR4ICs9IG51bV9iZHNfaW5fcGFja2V0OworCQl3aGlsZSAobnVtX2Jkc19pbl9wYWNrZXQtLSkKKwkJCXFlZF9jaGFpbl9jb25zdW1lKCZwX3R4LT50eHFfY2hhaW4pOworCisJCXBfdHgtPmN1cl9jb21wbGV0aW5nX2JkX2lkeCA9IDE7CisJCWJfbGFzdF9mcmFnID0gcF90eC0+Y3VyX2NvbXBsZXRpbmdfYmRfaWR4ID09IHBfcGt0LT5iZF91c2VkOworCQlsaXN0X2FkZF90YWlsKCZwX3BrdC0+bGlzdF9lbnRyeSwgJnBfdHgtPmZyZWVfZGVzY3EpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBfdHgtPmxvY2ssIGZsYWdzKTsKKwkJdHhfZnJhZyA9IHBfcGt0LT5iZHNfc2V0WzBdLnR4X2ZyYWc7CisJCWlmIChwX2xsMl9jb25uLT5nc2lfZW5hYmxlKQorCQkJcWVkX2xsMmJfY29tcGxldGVfdHhfZ3NpX3BhY2tldChwX2h3Zm4sCisJCQkJCQkJcF9sbDJfY29ubi0+bXlfaWQsCisJCQkJCQkJcF9wa3QtPmNvb2tpZSwKKwkJCQkJCQl0eF9mcmFnLAorCQkJCQkJCWJfbGFzdF9mcmFnLCAhbnVtX2Jkcyk7CisJCWVsc2UKKwkJCXFlZF9sbDJiX2NvbXBsZXRlX3R4X3BhY2tldChwX2h3Zm4sCisJCQkJCQkgICAgcF9sbDJfY29ubi0+bXlfaWQsCisJCQkJCQkgICAgcF9wa3QtPmNvb2tpZSwKKwkJCQkJCSAgICB0eF9mcmFnLAorCQkJCQkJICAgIGJfbGFzdF9mcmFnLCAhbnVtX2Jkcyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwX3R4LT5sb2NrLCBmbGFncyk7CisJfQorCisJcF90eC0+Yl9jb21wbGV0aW5nX3BhY2tldCA9IGZhbHNlOworCXJjID0gMDsKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwX3R4LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitxZWRfbGwyX3J4cV9jb21wbGV0aW9uX2dzaShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgIHN0cnVjdCBxZWRfbGwyX2luZm8gKnBfbGwyX2luZm8sCisJCQkgICB1bmlvbiBjb3JlX3J4X2NxZV91bmlvbiAqcF9jcWUsCisJCQkgICB1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3MsIGJvb2wgYl9sYXN0X2NxZSkKK3sKKwlzdHJ1Y3QgcWVkX2xsMl9yeF9xdWV1ZSAqcF9yeCA9ICZwX2xsMl9pbmZvLT5yeF9xdWV1ZTsKKwlzdHJ1Y3QgcWVkX2xsMl9yeF9wYWNrZXQgKnBfcGt0ID0gTlVMTDsKKwl1MTYgcGFja2V0X2xlbmd0aCwgcGFyc2VfZmxhZ3MsIHZsYW47CisJdTMyIHNyY19tYWNfYWRkcmhpOworCXUxNiBzcmNfbWFjX2FkZHJsbzsKKworCWlmICghbGlzdF9lbXB0eSgmcF9yeC0+YWN0aXZlX2Rlc2NxKSkKKwkJcF9wa3QgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwX3J4LT5hY3RpdmVfZGVzY3EsCisJCQkJCSBzdHJ1Y3QgcWVkX2xsMl9yeF9wYWNrZXQsIGxpc3RfZW50cnkpOworCWlmICghcF9wa3QpIHsKKwkJRFBfTk9USUNFKHBfaHdmbiwKKwkJCSAgIkdTSSBSeCBjb21wbGV0aW9uIGJ1dCBhY3RpdmVfZGVzY3EgaXMgZW1wdHlcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlsaXN0X2RlbCgmcF9wa3QtPmxpc3RfZW50cnkpOworCXBhcnNlX2ZsYWdzID0gbGUxNl90b19jcHUocF9jcWUtPnJ4X2NxZV9nc2kucGFyc2VfZmxhZ3MuZmxhZ3MpOworCXBhY2tldF9sZW5ndGggPSBsZTE2X3RvX2NwdShwX2NxZS0+cnhfY3FlX2dzaS5kYXRhX2xlbmd0aCk7CisJdmxhbiA9IGxlMTZfdG9fY3B1KHBfY3FlLT5yeF9jcWVfZ3NpLnZsYW4pOworCXNyY19tYWNfYWRkcmhpID0gbGUzMl90b19jcHUocF9jcWUtPnJ4X2NxZV9nc2kuc3JjX21hY19hZGRyaGkpOworCXNyY19tYWNfYWRkcmxvID0gbGUxNl90b19jcHUocF9jcWUtPnJ4X2NxZV9nc2kuc3JjX21hY19hZGRybG8pOworCWlmIChxZWRfY2hhaW5fY29uc3VtZSgmcF9yeC0+cnhxX2NoYWluKSAhPSBwX3BrdC0+cnhxX2JkKQorCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJICAiTWlzbWF0Y2ggYmV0d2VlbiBhY3RpdmVfZGVzY3EgYW5kIHRoZSBMTDIgUnggY2hhaW5cbiIpOworCWxpc3RfYWRkX3RhaWwoJnBfcGt0LT5saXN0X2VudHJ5LCAmcF9yeC0+ZnJlZV9kZXNjcSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwX3J4LT5sb2NrLCBsb2NrX2ZsYWdzKTsKKwlxZWRfbGwyYl9jb21wbGV0ZV9yeF9nc2lfcGFja2V0KHBfaHdmbiwKKwkJCQkJcF9sbDJfaW5mby0+bXlfaWQsCisJCQkJCXBfcGt0LT5jb29raWUsCisJCQkJCXBfcGt0LT5yeF9idWZfYWRkciwKKwkJCQkJcGFja2V0X2xlbmd0aCwKKwkJCQkJcF9jcWUtPnJ4X2NxZV9nc2kuZGF0YV9sZW5ndGhfZXJyb3IsCisJCQkJCXBhcnNlX2ZsYWdzLAorCQkJCQl2bGFuLAorCQkJCQlzcmNfbWFjX2FkZHJoaSwKKwkJCQkJc3JjX21hY19hZGRybG8sIGJfbGFzdF9jcWUpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwX3J4LT5sb2NrLCBsb2NrX2ZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFlZF9sbDJfcnhxX2NvbXBsZXRpb25fcmVnKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICAgIHN0cnVjdCBxZWRfbGwyX2luZm8gKnBfbGwyX2Nvbm4sCisJCQkJICAgICAgdW5pb24gY29yZV9yeF9jcWVfdW5pb24gKnBfY3FlLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbG9ja19mbGFncywKKwkJCQkgICAgICBib29sIGJfbGFzdF9jcWUpCit7CisJc3RydWN0IHFlZF9sbDJfcnhfcXVldWUgKnBfcnggPSAmcF9sbDJfY29ubi0+cnhfcXVldWU7CisJc3RydWN0IHFlZF9sbDJfcnhfcGFja2V0ICpwX3BrdCA9IE5VTEw7CisKKwlpZiAoIWxpc3RfZW1wdHkoJnBfcngtPmFjdGl2ZV9kZXNjcSkpCisJCXBfcGt0ID0gbGlzdF9maXJzdF9lbnRyeSgmcF9yeC0+YWN0aXZlX2Rlc2NxLAorCQkJCQkgc3RydWN0IHFlZF9sbDJfcnhfcGFja2V0LCBsaXN0X2VudHJ5KTsKKwlpZiAoIXBfcGt0KSB7CisJCURQX05PVElDRShwX2h3Zm4sCisJCQkgICJMTDIgUnggY29tcGxldGlvbiBidXQgYWN0aXZlX2Rlc2NxIGlzIGVtcHR5XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWxpc3RfZGVsKCZwX3BrdC0+bGlzdF9lbnRyeSk7CisKKwlpZiAocWVkX2NoYWluX2NvbnN1bWUoJnBfcngtPnJ4cV9jaGFpbikgIT0gcF9wa3QtPnJ4cV9iZCkKKwkJRFBfTk9USUNFKHBfaHdmbiwKKwkJCSAgIk1pc21hdGNoIGJldHdlZW4gYWN0aXZlX2Rlc2NxIGFuZCB0aGUgTEwyIFJ4IGNoYWluXG4iKTsKKwlsaXN0X2FkZF90YWlsKCZwX3BrdC0+bGlzdF9lbnRyeSwgJnBfcngtPmZyZWVfZGVzY3EpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcF9yeC0+bG9jaywgbG9ja19mbGFncyk7CisJcWVkX2xsMmJfY29tcGxldGVfcnhfcGFja2V0KHBfaHdmbiwgcF9sbDJfY29ubi0+bXlfaWQsCisJCQkJICAgIHBfcGt0LCAmcF9jcWUtPnJ4X2NxZV9mcCwgYl9sYXN0X2NxZSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBfcngtPmxvY2ssIGxvY2tfZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcWVkX2xsMl9yeHFfY29tcGxldGlvbihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgdm9pZCAqY29va2llKQoreworCXN0cnVjdCBxZWRfbGwyX2luZm8gKnBfbGwyX2Nvbm4gPSBjb29raWU7CisJc3RydWN0IHFlZF9sbDJfcnhfcXVldWUgKnBfcnggPSAmcF9sbDJfY29ubi0+cnhfcXVldWU7CisJdW5pb24gY29yZV9yeF9jcWVfdW5pb24gKmNxZSA9IE5VTEw7CisJdTE2IGNxX25ld19pZHggPSAwLCBjcV9vbGRfaWR4ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlpbnQgcmMgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBfcngtPmxvY2ssIGZsYWdzKTsKKwljcV9uZXdfaWR4ID0gbGUxNl90b19jcHUoKnBfcngtPnBfZndfY29ucyk7CisJY3Ffb2xkX2lkeCA9IHFlZF9jaGFpbl9nZXRfY29uc19pZHgoJnBfcngtPnJjcV9jaGFpbik7CisKKwl3aGlsZSAoY3FfbmV3X2lkeCAhPSBjcV9vbGRfaWR4KSB7CisJCWJvb2wgYl9sYXN0X2NxZSA9IChjcV9uZXdfaWR4ID09IGNxX29sZF9pZHgpOworCisJCWNxZSA9IHFlZF9jaGFpbl9jb25zdW1lKCZwX3J4LT5yY3FfY2hhaW4pOworCQljcV9vbGRfaWR4ID0gcWVkX2NoYWluX2dldF9jb25zX2lkeCgmcF9yeC0+cmNxX2NoYWluKTsKKworCQlEUF9WRVJCT1NFKHBfaHdmbiwKKwkJCSAgIFFFRF9NU0dfTEwyLAorCQkJICAgIkxMMiBbc3cuIGNvbnMgJTA0eCwgZncuIGF0ICUwNHhdIC0gR290IFBhY2tldCBvZiB0eXBlICUwMnhcbiIsCisJCQkgICBjcV9vbGRfaWR4LCBjcV9uZXdfaWR4LCBjcWUtPnJ4X2NxZV9zcC50eXBlKTsKKworCQlzd2l0Y2ggKGNxZS0+cnhfY3FlX3NwLnR5cGUpIHsKKwkJY2FzZSBDT1JFX1JYX0NRRV9UWVBFX1NMT1dfUEFUSDoKKwkJCURQX05PVElDRShwX2h3Zm4sICJMTDIgLSB1bmV4cGVjdGVkIFJ4IENRRSBzbG93cGF0aFxuIik7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJY2FzZSBDT1JFX1JYX0NRRV9UWVBFX0dTSV9PRkZMT0FEOgorCQkJcmMgPSBxZWRfbGwyX3J4cV9jb21wbGV0aW9uX2dzaShwX2h3Zm4sIHBfbGwyX2Nvbm4sCisJCQkJCQkJY3FlLCBmbGFncywgYl9sYXN0X2NxZSk7CisJCQlicmVhazsKKwkJY2FzZSBDT1JFX1JYX0NRRV9UWVBFX1JFR1VMQVI6CisJCQlyYyA9IHFlZF9sbDJfcnhxX2NvbXBsZXRpb25fcmVnKHBfaHdmbiwgcF9sbDJfY29ubiwKKwkJCQkJCQljcWUsIGZsYWdzLCBiX2xhc3RfY3FlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmMgPSAtRUlPOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcF9yeC0+bG9jaywgZmxhZ3MpOworCXJldHVybiByYzsKK30KKwordm9pZCBxZWRfbGwyX3J4cV9mbHVzaChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgdTggY29ubmVjdGlvbl9oYW5kbGUpCit7CisJc3RydWN0IHFlZF9sbDJfaW5mbyAqcF9sbDJfY29ubiA9IE5VTEw7CisJc3RydWN0IHFlZF9sbDJfcnhfcGFja2V0ICpwX3BrdCA9IE5VTEw7CisJc3RydWN0IHFlZF9sbDJfcnhfcXVldWUgKnBfcng7CisKKwlwX2xsMl9jb25uID0gcWVkX2xsMl9oYW5kbGVfc2FuaXR5X2luYWN0aXZlKHBfaHdmbiwgY29ubmVjdGlvbl9oYW5kbGUpOworCWlmICghcF9sbDJfY29ubikKKwkJcmV0dXJuOworCisJcF9yeCA9ICZwX2xsMl9jb25uLT5yeF9xdWV1ZTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmcF9yeC0+YWN0aXZlX2Rlc2NxKSkgeworCQlkbWFfYWRkcl90IHJ4X2J1Zl9hZGRyOworCQl2b2lkICpjb29raWU7CisJCWJvb2wgYl9sYXN0OworCisJCXBfcGt0ID0gbGlzdF9maXJzdF9lbnRyeSgmcF9yeC0+YWN0aXZlX2Rlc2NxLAorCQkJCQkgc3RydWN0IHFlZF9sbDJfcnhfcGFja2V0LCBsaXN0X2VudHJ5KTsKKwkJaWYgKCFwX3BrdCkKKwkJCWJyZWFrOworCisJCWxpc3RfZGVsKCZwX3BrdC0+bGlzdF9lbnRyeSk7CisJCWxpc3RfYWRkX3RhaWwoJnBfcGt0LT5saXN0X2VudHJ5LCAmcF9yeC0+ZnJlZV9kZXNjcSk7CisKKwkJcnhfYnVmX2FkZHIgPSBwX3BrdC0+cnhfYnVmX2FkZHI7CisJCWNvb2tpZSA9IHBfcGt0LT5jb29raWU7CisKKwkJYl9sYXN0ID0gbGlzdF9lbXB0eSgmcF9yeC0+YWN0aXZlX2Rlc2NxKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcWVkX3NwX2xsMl9yeF9xdWV1ZV9zdGFydChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgIHN0cnVjdCBxZWRfbGwyX2luZm8gKnBfbGwyX2Nvbm4sCisJCQkJICAgICB1OCBhY3Rpb25fb25fZXJyb3IpCit7CisJZW51bSBxZWRfbGwyX2Nvbm5fdHlwZSBjb25uX3R5cGUgPSBwX2xsMl9jb25uLT5jb25uX3R5cGU7CisJc3RydWN0IHFlZF9sbDJfcnhfcXVldWUgKnBfcnggPSAmcF9sbDJfY29ubi0+cnhfcXVldWU7CisJc3RydWN0IGNvcmVfcnhfc3RhcnRfcmFtcm9kX2RhdGEgKnBfcmFtcm9kID0gTlVMTDsKKwlzdHJ1Y3QgcWVkX3NwcV9lbnRyeSAqcF9lbnQgPSBOVUxMOworCXN0cnVjdCBxZWRfc3BfaW5pdF9kYXRhIGluaXRfZGF0YTsKKwl1MTYgY3FlX3BibF9zaXplOworCWludCByYyA9IDA7CisKKwkvKiBHZXQgU1BRIGVudHJ5ICovCisJbWVtc2V0KCZpbml0X2RhdGEsIDAsIHNpemVvZihpbml0X2RhdGEpKTsKKwlpbml0X2RhdGEuY2lkID0gcF9sbDJfY29ubi0+Y2lkOworCWluaXRfZGF0YS5vcGFxdWVfZmlkID0gcF9od2ZuLT5od19pbmZvLm9wYXF1ZV9maWQ7CisJaW5pdF9kYXRhLmNvbXBfbW9kZSA9IFFFRF9TUFFfTU9ERV9FQkxPQ0s7CisKKwlyYyA9IHFlZF9zcF9pbml0X3JlcXVlc3QocF9od2ZuLCAmcF9lbnQsCisJCQkJIENPUkVfUkFNUk9EX1JYX1FVRVVFX1NUQVJULAorCQkJCSBQUk9UT0NPTElEX0NPUkUsICZpbml0X2RhdGEpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcF9yYW1yb2QgPSAmcF9lbnQtPnJhbXJvZC5jb3JlX3J4X3F1ZXVlX3N0YXJ0OworCisJcF9yYW1yb2QtPnNiX2lkID0gY3B1X3RvX2xlMTYocWVkX2ludF9nZXRfc3Bfc2JfaWQocF9od2ZuKSk7CisJcF9yYW1yb2QtPnNiX2luZGV4ID0gcF9yeC0+cnhfc2JfaW5kZXg7CisJcF9yYW1yb2QtPmNvbXBsZXRlX2V2ZW50X2ZsZyA9IDE7CisKKwlwX3JhbXJvZC0+bXR1ID0gY3B1X3RvX2xlMTYocF9sbDJfY29ubi0+bXR1KTsKKwlETUFfUkVHUEFJUl9MRShwX3JhbXJvZC0+YmRfYmFzZSwKKwkJICAgICAgIHBfcngtPnJ4cV9jaGFpbi5wX3BoeXNfYWRkcik7CisJY3FlX3BibF9zaXplID0gKHUxNilxZWRfY2hhaW5fZ2V0X3BhZ2VfY250KCZwX3J4LT5yY3FfY2hhaW4pOworCXBfcmFtcm9kLT5udW1fb2ZfcGJsX3BhZ2VzID0gY3B1X3RvX2xlMTYoY3FlX3BibF9zaXplKTsKKwlETUFfUkVHUEFJUl9MRShwX3JhbXJvZC0+Y3FlX3BibF9hZGRyLAorCQkgICAgICAgcWVkX2NoYWluX2dldF9wYmxfcGh5cygmcF9yeC0+cmNxX2NoYWluKSk7CisKKwlwX3JhbXJvZC0+ZHJvcF90dGwwX2ZsZyA9IHBfbGwyX2Nvbm4tPnJ4X2Ryb3BfdHRsMF9mbGc7CisJcF9yYW1yb2QtPmlubmVyX3ZsYW5fcmVtb3ZhbF9lbiA9IHBfbGwyX2Nvbm4tPnJ4X3ZsYW5fcmVtb3ZhbF9lbjsKKwlwX3JhbXJvZC0+cXVldWVfaWQgPSBwX2xsMl9jb25uLT5xdWV1ZV9pZDsKKwlwX3JhbXJvZC0+bWFpbl9mdW5jX3F1ZXVlID0gMTsKKworCWlmICgoSVNfTUZfREVGQVVMVChwX2h3Zm4pIHx8IElTX01GX1NJKHBfaHdmbikpICYmCisJICAgIHBfcmFtcm9kLT5tYWluX2Z1bmNfcXVldWUgJiYgKGNvbm5fdHlwZSAhPSBRRURfTEwyX1RZUEVfUk9DRSkpIHsKKwkJcF9yYW1yb2QtPm1mX3NpX2JjYXN0X2FjY2VwdF9hbGwgPSAxOworCQlwX3JhbXJvZC0+bWZfc2lfbWNhc3RfYWNjZXB0X2FsbCA9IDE7CisJfSBlbHNlIHsKKwkJcF9yYW1yb2QtPm1mX3NpX2JjYXN0X2FjY2VwdF9hbGwgPSAwOworCQlwX3JhbXJvZC0+bWZfc2lfbWNhc3RfYWNjZXB0X2FsbCA9IDA7CisJfQorCisJcF9yYW1yb2QtPmFjdGlvbl9vbl9lcnJvci5lcnJvcl90eXBlID0gYWN0aW9uX29uX2Vycm9yOworCXBfcmFtcm9kLT5nc2lfb2ZmbG9hZF9mbGFnID0gcF9sbDJfY29ubi0+Z3NpX2VuYWJsZTsKKwlyZXR1cm4gcWVkX3NwcV9wb3N0KHBfaHdmbiwgcF9lbnQsIE5VTEwpOworfQorCitzdGF0aWMgaW50IHFlZF9zcF9sbDJfdHhfcXVldWVfc3RhcnQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgICBzdHJ1Y3QgcWVkX2xsMl9pbmZvICpwX2xsMl9jb25uKQoreworCWVudW0gcWVkX2xsMl9jb25uX3R5cGUgY29ubl90eXBlID0gcF9sbDJfY29ubi0+Y29ubl90eXBlOworCXN0cnVjdCBxZWRfbGwyX3R4X3F1ZXVlICpwX3R4ID0gJnBfbGwyX2Nvbm4tPnR4X3F1ZXVlOworCXN0cnVjdCBjb3JlX3R4X3N0YXJ0X3JhbXJvZF9kYXRhICpwX3JhbXJvZCA9IE5VTEw7CisJc3RydWN0IHFlZF9zcHFfZW50cnkgKnBfZW50ID0gTlVMTDsKKwlzdHJ1Y3QgcWVkX3NwX2luaXRfZGF0YSBpbml0X2RhdGE7CisJdW5pb24gcWVkX3FtX3BxX3BhcmFtcyBwcV9wYXJhbXM7CisJdTE2IHBxX2lkID0gMCwgcGJsX3NpemU7CisJaW50IHJjID0gLUVJTlZBTDsKKworCWlmICghUUVEX0xMMl9UWF9SRUdJU1RFUkVEKHBfbGwyX2Nvbm4pKQorCQlyZXR1cm4gMDsKKworCS8qIEdldCBTUFEgZW50cnkgKi8KKwltZW1zZXQoJmluaXRfZGF0YSwgMCwgc2l6ZW9mKGluaXRfZGF0YSkpOworCWluaXRfZGF0YS5jaWQgPSBwX2xsMl9jb25uLT5jaWQ7CisJaW5pdF9kYXRhLm9wYXF1ZV9maWQgPSBwX2h3Zm4tPmh3X2luZm8ub3BhcXVlX2ZpZDsKKwlpbml0X2RhdGEuY29tcF9tb2RlID0gUUVEX1NQUV9NT0RFX0VCTE9DSzsKKworCXJjID0gcWVkX3NwX2luaXRfcmVxdWVzdChwX2h3Zm4sICZwX2VudCwKKwkJCQkgQ09SRV9SQU1ST0RfVFhfUVVFVUVfU1RBUlQsCisJCQkJIFBST1RPQ09MSURfQ09SRSwgJmluaXRfZGF0YSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlwX3JhbXJvZCA9ICZwX2VudC0+cmFtcm9kLmNvcmVfdHhfcXVldWVfc3RhcnQ7CisKKwlwX3JhbXJvZC0+c2JfaWQgPSBjcHVfdG9fbGUxNihxZWRfaW50X2dldF9zcF9zYl9pZChwX2h3Zm4pKTsKKwlwX3JhbXJvZC0+c2JfaW5kZXggPSBwX3R4LT50eF9zYl9pbmRleDsKKwlwX3JhbXJvZC0+bXR1ID0gY3B1X3RvX2xlMTYocF9sbDJfY29ubi0+bXR1KTsKKwlwX2xsMl9jb25uLT50eF9zdGF0c19lbiA9IDE7CisJcF9yYW1yb2QtPnN0YXRzX2VuID0gcF9sbDJfY29ubi0+dHhfc3RhdHNfZW47CisJcF9yYW1yb2QtPnN0YXRzX2lkID0gcF9sbDJfY29ubi0+dHhfc3RhdHNfaWQ7CisKKwlETUFfUkVHUEFJUl9MRShwX3JhbXJvZC0+cGJsX2Jhc2VfYWRkciwKKwkJICAgICAgIHFlZF9jaGFpbl9nZXRfcGJsX3BoeXMoJnBfdHgtPnR4cV9jaGFpbikpOworCXBibF9zaXplID0gcWVkX2NoYWluX2dldF9wYWdlX2NudCgmcF90eC0+dHhxX2NoYWluKTsKKwlwX3JhbXJvZC0+cGJsX3NpemUgPSBjcHVfdG9fbGUxNihwYmxfc2l6ZSk7CisKKwltZW1zZXQoJnBxX3BhcmFtcywgMCwgc2l6ZW9mKHBxX3BhcmFtcykpOworCXBxX3BhcmFtcy5jb3JlLnRjID0gcF9sbDJfY29ubi0+dHhfdGM7CisJcHFfaWQgPSBxZWRfZ2V0X3FtX3BxKHBfaHdmbiwgUFJPVE9DT0xJRF9DT1JFLCAmcHFfcGFyYW1zKTsKKwlwX3JhbXJvZC0+cW1fcHFfaWQgPSBjcHVfdG9fbGUxNihwcV9pZCk7CisKKwlzd2l0Y2ggKGNvbm5fdHlwZSkgeworCWNhc2UgUUVEX0xMMl9UWVBFX0lTQ1NJOgorCWNhc2UgUUVEX0xMMl9UWVBFX0lTQ1NJX09PTzoKKwkJcF9yYW1yb2QtPmNvbm5fdHlwZSA9IFBST1RPQ09MSURfSVNDU0k7CisJCWJyZWFrOworCWNhc2UgUUVEX0xMMl9UWVBFX1JPQ0U6CisJCXBfcmFtcm9kLT5jb25uX3R5cGUgPSBQUk9UT0NPTElEX1JPQ0U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXBfcmFtcm9kLT5jb25uX3R5cGUgPSBQUk9UT0NPTElEX0VUSDsKKwkJRFBfTk9USUNFKHBfaHdmbiwgIlVua25vd24gY29ubmVjdGlvbiB0eXBlOiAlZFxuIiwgY29ubl90eXBlKTsKKwl9CisKKwlwX3JhbXJvZC0+Z3NpX29mZmxvYWRfZmxhZyA9IHBfbGwyX2Nvbm4tPmdzaV9lbmFibGU7CisJcmV0dXJuIHFlZF9zcHFfcG9zdChwX2h3Zm4sIHBfZW50LCBOVUxMKTsKK30KKworc3RhdGljIGludCBxZWRfc3BfbGwyX3J4X3F1ZXVlX3N0b3Aoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgIHN0cnVjdCBxZWRfbGwyX2luZm8gKnBfbGwyX2Nvbm4pCit7CisJc3RydWN0IGNvcmVfcnhfc3RvcF9yYW1yb2RfZGF0YSAqcF9yYW1yb2QgPSBOVUxMOworCXN0cnVjdCBxZWRfc3BxX2VudHJ5ICpwX2VudCA9IE5VTEw7CisJc3RydWN0IHFlZF9zcF9pbml0X2RhdGEgaW5pdF9kYXRhOworCWludCByYyA9IC1FSU5WQUw7CisKKwkvKiBHZXQgU1BRIGVudHJ5ICovCisJbWVtc2V0KCZpbml0X2RhdGEsIDAsIHNpemVvZihpbml0X2RhdGEpKTsKKwlpbml0X2RhdGEuY2lkID0gcF9sbDJfY29ubi0+Y2lkOworCWluaXRfZGF0YS5vcGFxdWVfZmlkID0gcF9od2ZuLT5od19pbmZvLm9wYXF1ZV9maWQ7CisJaW5pdF9kYXRhLmNvbXBfbW9kZSA9IFFFRF9TUFFfTU9ERV9FQkxPQ0s7CisKKwlyYyA9IHFlZF9zcF9pbml0X3JlcXVlc3QocF9od2ZuLCAmcF9lbnQsCisJCQkJIENPUkVfUkFNUk9EX1JYX1FVRVVFX1NUT1AsCisJCQkJIFBST1RPQ09MSURfQ09SRSwgJmluaXRfZGF0YSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlwX3JhbXJvZCA9ICZwX2VudC0+cmFtcm9kLmNvcmVfcnhfcXVldWVfc3RvcDsKKworCXBfcmFtcm9kLT5jb21wbGV0ZV9ldmVudF9mbGcgPSAxOworCXBfcmFtcm9kLT5xdWV1ZV9pZCA9IHBfbGwyX2Nvbm4tPnF1ZXVlX2lkOworCisJcmV0dXJuIHFlZF9zcHFfcG9zdChwX2h3Zm4sIHBfZW50LCBOVUxMKTsKK30KKworc3RhdGljIGludCBxZWRfc3BfbGwyX3R4X3F1ZXVlX3N0b3Aoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgIHN0cnVjdCBxZWRfbGwyX2luZm8gKnBfbGwyX2Nvbm4pCit7CisJc3RydWN0IHFlZF9zcHFfZW50cnkgKnBfZW50ID0gTlVMTDsKKwlzdHJ1Y3QgcWVkX3NwX2luaXRfZGF0YSBpbml0X2RhdGE7CisJaW50IHJjID0gLUVJTlZBTDsKKworCS8qIEdldCBTUFEgZW50cnkgKi8KKwltZW1zZXQoJmluaXRfZGF0YSwgMCwgc2l6ZW9mKGluaXRfZGF0YSkpOworCWluaXRfZGF0YS5jaWQgPSBwX2xsMl9jb25uLT5jaWQ7CisJaW5pdF9kYXRhLm9wYXF1ZV9maWQgPSBwX2h3Zm4tPmh3X2luZm8ub3BhcXVlX2ZpZDsKKwlpbml0X2RhdGEuY29tcF9tb2RlID0gUUVEX1NQUV9NT0RFX0VCTE9DSzsKKworCXJjID0gcWVkX3NwX2luaXRfcmVxdWVzdChwX2h3Zm4sICZwX2VudCwKKwkJCQkgQ09SRV9SQU1ST0RfVFhfUVVFVUVfU1RPUCwKKwkJCQkgUFJPVE9DT0xJRF9DT1JFLCAmaW5pdF9kYXRhKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJldHVybiBxZWRfc3BxX3Bvc3QocF9od2ZuLCBwX2VudCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQKK3FlZF9sbDJfYWNxdWlyZV9jb25uZWN0aW9uX3J4KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgICAgc3RydWN0IHFlZF9sbDJfaW5mbyAqcF9sbDJfaW5mbywgdTE2IHJ4X251bV9kZXNjKQoreworCXN0cnVjdCBxZWRfbGwyX3J4X3BhY2tldCAqcF9kZXNjcTsKKwl1MzIgY2FwYWNpdHk7CisJaW50IHJjID0gMDsKKworCWlmICghcnhfbnVtX2Rlc2MpCisJCWdvdG8gb3V0OworCisJcmMgPSBxZWRfY2hhaW5fYWxsb2MocF9od2ZuLT5jZGV2LAorCQkJICAgICBRRURfQ0hBSU5fVVNFX1RPX0NPTlNVTUVfUFJPRFVDRSwKKwkJCSAgICAgUUVEX0NIQUlOX01PREVfTkVYVF9QVFIsCisJCQkgICAgIFFFRF9DSEFJTl9DTlRfVFlQRV9VMTYsCisJCQkgICAgIHJ4X251bV9kZXNjLAorCQkJICAgICBzaXplb2Yoc3RydWN0IGNvcmVfcnhfYmQpLAorCQkJICAgICAmcF9sbDJfaW5mby0+cnhfcXVldWUucnhxX2NoYWluKTsKKwlpZiAocmMpIHsKKwkJRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBsbDIgcnhxIGNoYWluXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJY2FwYWNpdHkgPSBxZWRfY2hhaW5fZ2V0X2NhcGFjaXR5KCZwX2xsMl9pbmZvLT5yeF9xdWV1ZS5yeHFfY2hhaW4pOworCXBfZGVzY3EgPSBrY2FsbG9jKGNhcGFjaXR5LCBzaXplb2Yoc3RydWN0IHFlZF9sbDJfcnhfcGFja2V0KSwKKwkJCSAgR0ZQX0tFUk5FTCk7CisJaWYgKCFwX2Rlc2NxKSB7CisJCXJjID0gLUVOT01FTTsKKwkJRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBsbDIgUnggZGVzY1xuIik7CisJCWdvdG8gb3V0OworCX0KKwlwX2xsMl9pbmZvLT5yeF9xdWV1ZS5kZXNjcV9hcnJheSA9IHBfZGVzY3E7CisKKwlyYyA9IHFlZF9jaGFpbl9hbGxvYyhwX2h3Zm4tPmNkZXYsCisJCQkgICAgIFFFRF9DSEFJTl9VU0VfVE9fQ09OU1VNRV9QUk9EVUNFLAorCQkJICAgICBRRURfQ0hBSU5fTU9ERV9QQkwsCisJCQkgICAgIFFFRF9DSEFJTl9DTlRfVFlQRV9VMTYsCisJCQkgICAgIHJ4X251bV9kZXNjLAorCQkJICAgICBzaXplb2Yoc3RydWN0IGNvcmVfcnhfZmFzdF9wYXRoX2NxZSksCisJCQkgICAgICZwX2xsMl9pbmZvLT5yeF9xdWV1ZS5yY3FfY2hhaW4pOworCWlmIChyYykgeworCQlEUF9OT1RJQ0UocF9od2ZuLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGxsMiByY3EgY2hhaW5cbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19MTDIsCisJCSAgICJBbGxvY2F0ZWQgTEwyIFJ4cSBbVHlwZSAlMDh4XSB3aXRoIDB4JTA4eCBidWZmZXJzXG4iLAorCQkgICBwX2xsMl9pbmZvLT5jb25uX3R5cGUsIHJ4X251bV9kZXNjKTsKKworb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBxZWRfbGwyX2FjcXVpcmVfY29ubmVjdGlvbl90eChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJIHN0cnVjdCBxZWRfbGwyX2luZm8gKnBfbGwyX2luZm8sCisJCQkJCSB1MTYgdHhfbnVtX2Rlc2MpCit7CisJc3RydWN0IHFlZF9sbDJfdHhfcGFja2V0ICpwX2Rlc2NxOworCXUzMiBjYXBhY2l0eTsKKwlpbnQgcmMgPSAwOworCisJaWYgKCF0eF9udW1fZGVzYykKKwkJZ290byBvdXQ7CisKKwlyYyA9IHFlZF9jaGFpbl9hbGxvYyhwX2h3Zm4tPmNkZXYsCisJCQkgICAgIFFFRF9DSEFJTl9VU0VfVE9fQ09OU1VNRV9QUk9EVUNFLAorCQkJICAgICBRRURfQ0hBSU5fTU9ERV9QQkwsCisJCQkgICAgIFFFRF9DSEFJTl9DTlRfVFlQRV9VMTYsCisJCQkgICAgIHR4X251bV9kZXNjLAorCQkJICAgICBzaXplb2Yoc3RydWN0IGNvcmVfdHhfYmQpLAorCQkJICAgICAmcF9sbDJfaW5mby0+dHhfcXVldWUudHhxX2NoYWluKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCisJY2FwYWNpdHkgPSBxZWRfY2hhaW5fZ2V0X2NhcGFjaXR5KCZwX2xsMl9pbmZvLT50eF9xdWV1ZS50eHFfY2hhaW4pOworCXBfZGVzY3EgPSBrY2FsbG9jKGNhcGFjaXR5LCBzaXplb2Yoc3RydWN0IHFlZF9sbDJfdHhfcGFja2V0KSwKKwkJCSAgR0ZQX0tFUk5FTCk7CisJaWYgKCFwX2Rlc2NxKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCXBfbGwyX2luZm8tPnR4X3F1ZXVlLmRlc2NxX2FycmF5ID0gcF9kZXNjcTsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX0xMMiwKKwkJICAgIkFsbG9jYXRlZCBMTDIgVHhxIFtUeXBlICUwOHhdIHdpdGggMHglMDh4IGJ1ZmZlcnNcbiIsCisJCSAgIHBfbGwyX2luZm8tPmNvbm5fdHlwZSwgdHhfbnVtX2Rlc2MpOworCitvdXQ6CisJaWYgKHJjKQorCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJICAiQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBUeCBMTDIgd2l0aCAweCUwOHggYnVmZmVyc1xuIiwKKwkJCSAgdHhfbnVtX2Rlc2MpOworCXJldHVybiByYzsKK30KKworaW50IHFlZF9sbDJfYWNxdWlyZV9jb25uZWN0aW9uKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgICAgIHN0cnVjdCBxZWRfbGwyX2luZm8gKnBfcGFyYW1zLAorCQkJICAgICAgIHUxNiByeF9udW1fZGVzYywKKwkJCSAgICAgICB1MTYgdHhfbnVtX2Rlc2MsCisJCQkgICAgICAgdTggKnBfY29ubmVjdGlvbl9oYW5kbGUpCit7CisJcWVkX2ludF9jb21wX2NiX3QgY29tcF9yeF9jYiwgY29tcF90eF9jYjsKKwlzdHJ1Y3QgcWVkX2xsMl9pbmZvICpwX2xsMl9pbmZvID0gTlVMTDsKKwlpbnQgcmM7CisJdTggaTsKKworCWlmICghcF9jb25uZWN0aW9uX2hhbmRsZSB8fCAhcF9od2ZuLT5wX2xsMl9pbmZvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEZpbmQgYSBmcmVlIGNvbm5lY3Rpb24gdG8gYmUgdXNlZCAqLworCWZvciAoaSA9IDA7IChpIDwgUUVEX01BWF9OVU1fT0ZfTEwyX0NPTk5FQ1RJT05TKTsgaSsrKSB7CisJCW11dGV4X2xvY2soJnBfaHdmbi0+cF9sbDJfaW5mb1tpXS5tdXRleCk7CisJCWlmIChwX2h3Zm4tPnBfbGwyX2luZm9baV0uYl9hY3RpdmUpIHsKKwkJCW11dGV4X3VubG9jaygmcF9od2ZuLT5wX2xsMl9pbmZvW2ldLm11dGV4KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcF9od2ZuLT5wX2xsMl9pbmZvW2ldLmJfYWN0aXZlID0gdHJ1ZTsKKwkJcF9sbDJfaW5mbyA9ICZwX2h3Zm4tPnBfbGwyX2luZm9baV07CisJCW11dGV4X3VubG9jaygmcF9od2ZuLT5wX2xsMl9pbmZvW2ldLm11dGV4KTsKKwkJYnJlYWs7CisJfQorCWlmICghcF9sbDJfaW5mbykKKwkJcmV0dXJuIC1FQlVTWTsKKworCXBfbGwyX2luZm8tPmNvbm5fdHlwZSA9IHBfcGFyYW1zLT5jb25uX3R5cGU7CisJcF9sbDJfaW5mby0+bXR1ID0gcF9wYXJhbXMtPm10dTsKKwlwX2xsMl9pbmZvLT5yeF9kcm9wX3R0bDBfZmxnID0gcF9wYXJhbXMtPnJ4X2Ryb3BfdHRsMF9mbGc7CisJcF9sbDJfaW5mby0+cnhfdmxhbl9yZW1vdmFsX2VuID0gcF9wYXJhbXMtPnJ4X3ZsYW5fcmVtb3ZhbF9lbjsKKwlwX2xsMl9pbmZvLT50eF90YyA9IHBfcGFyYW1zLT50eF90YzsKKwlwX2xsMl9pbmZvLT50eF9kZXN0ID0gcF9wYXJhbXMtPnR4X2Rlc3Q7CisJcF9sbDJfaW5mby0+YWlfZXJyX3BhY2tldF90b29fYmlnID0gcF9wYXJhbXMtPmFpX2Vycl9wYWNrZXRfdG9vX2JpZzsKKwlwX2xsMl9pbmZvLT5haV9lcnJfbm9fYnVmID0gcF9wYXJhbXMtPmFpX2Vycl9ub19idWY7CisJcF9sbDJfaW5mby0+Z3NpX2VuYWJsZSA9IHBfcGFyYW1zLT5nc2lfZW5hYmxlOworCisJcmMgPSBxZWRfbGwyX2FjcXVpcmVfY29ubmVjdGlvbl9yeChwX2h3Zm4sIHBfbGwyX2luZm8sIHJ4X251bV9kZXNjKTsKKwlpZiAocmMpCisJCWdvdG8gcV9hbGxvY2F0ZV9mYWlsOworCisJcmMgPSBxZWRfbGwyX2FjcXVpcmVfY29ubmVjdGlvbl90eChwX2h3Zm4sIHBfbGwyX2luZm8sIHR4X251bV9kZXNjKTsKKwlpZiAocmMpCisJCWdvdG8gcV9hbGxvY2F0ZV9mYWlsOworCisJLyogUmVnaXN0ZXIgY2FsbGJhY2tzIGZvciB0aGUgUngvVHggcXVldWVzICovCisJY29tcF9yeF9jYiA9IHFlZF9sbDJfcnhxX2NvbXBsZXRpb247CisJY29tcF90eF9jYiA9IHFlZF9sbDJfdHhxX2NvbXBsZXRpb247CisKKwlpZiAocnhfbnVtX2Rlc2MpIHsKKwkJcWVkX2ludF9yZWdpc3Rlcl9jYihwX2h3Zm4sIGNvbXBfcnhfY2IsCisJCQkJICAgICZwX2h3Zm4tPnBfbGwyX2luZm9baV0sCisJCQkJICAgICZwX2xsMl9pbmZvLT5yeF9xdWV1ZS5yeF9zYl9pbmRleCwKKwkJCQkgICAgJnBfbGwyX2luZm8tPnJ4X3F1ZXVlLnBfZndfY29ucyk7CisJCXBfbGwyX2luZm8tPnJ4X3F1ZXVlLmJfY2JfcmVnaXN0cmVkID0gdHJ1ZTsKKwl9CisKKwlpZiAodHhfbnVtX2Rlc2MpIHsKKwkJcWVkX2ludF9yZWdpc3Rlcl9jYihwX2h3Zm4sCisJCQkJICAgIGNvbXBfdHhfY2IsCisJCQkJICAgICZwX2h3Zm4tPnBfbGwyX2luZm9baV0sCisJCQkJICAgICZwX2xsMl9pbmZvLT50eF9xdWV1ZS50eF9zYl9pbmRleCwKKwkJCQkgICAgJnBfbGwyX2luZm8tPnR4X3F1ZXVlLnBfZndfY29ucyk7CisJCXBfbGwyX2luZm8tPnR4X3F1ZXVlLmJfY2JfcmVnaXN0cmVkID0gdHJ1ZTsKKwl9CisKKwkqcF9jb25uZWN0aW9uX2hhbmRsZSA9IGk7CisJcmV0dXJuIHJjOworCitxX2FsbG9jYXRlX2ZhaWw6CisJcWVkX2xsMl9yZWxlYXNlX2Nvbm5lY3Rpb24ocF9od2ZuLCBpKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIGludCBxZWRfbGwyX2VzdGFibGlzaF9jb25uZWN0aW9uX3J4KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICBzdHJ1Y3QgcWVkX2xsMl9pbmZvICpwX2xsMl9jb25uKQoreworCXU4IGFjdGlvbl9vbl9lcnJvciA9IDA7CisKKwlpZiAoIVFFRF9MTDJfUlhfUkVHSVNURVJFRChwX2xsMl9jb25uKSkKKwkJcmV0dXJuIDA7CisKKwlESVJFQ1RfUkVHX1dSKHBfbGwyX2Nvbm4tPnJ4X3F1ZXVlLnNldF9wcm9kX2FkZHIsIDB4MCk7CisKKwlTRVRfRklFTEQoYWN0aW9uX29uX2Vycm9yLAorCQkgIENPUkVfUlhfQUNUSU9OX09OX0VSUk9SX1BBQ0tFVF9UT09fQklHLAorCQkgIHBfbGwyX2Nvbm4tPmFpX2Vycl9wYWNrZXRfdG9vX2JpZyk7CisJU0VUX0ZJRUxEKGFjdGlvbl9vbl9lcnJvciwKKwkJICBDT1JFX1JYX0FDVElPTl9PTl9FUlJPUl9OT19CVUZGLCBwX2xsMl9jb25uLT5haV9lcnJfbm9fYnVmKTsKKworCXJldHVybiBxZWRfc3BfbGwyX3J4X3F1ZXVlX3N0YXJ0KHBfaHdmbiwgcF9sbDJfY29ubiwgYWN0aW9uX29uX2Vycm9yKTsKK30KKworaW50IHFlZF9sbDJfZXN0YWJsaXNoX2Nvbm5lY3Rpb24oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHU4IGNvbm5lY3Rpb25faGFuZGxlKQoreworCXN0cnVjdCBxZWRfbGwyX2luZm8gKnBfbGwyX2Nvbm47CisJc3RydWN0IHFlZF9sbDJfcnhfcXVldWUgKnBfcng7CisJc3RydWN0IHFlZF9sbDJfdHhfcXVldWUgKnBfdHg7CisJaW50IHJjID0gLUVJTlZBTDsKKwl1MzIgaSwgY2FwYWNpdHk7CisJdTggcWlkOworCisJcF9sbDJfY29ubiA9IHFlZF9sbDJfaGFuZGxlX3Nhbml0eV9sb2NrKHBfaHdmbiwgY29ubmVjdGlvbl9oYW5kbGUpOworCWlmICghcF9sbDJfY29ubikKKwkJcmV0dXJuIC1FSU5WQUw7CisJcF9yeCA9ICZwX2xsMl9jb25uLT5yeF9xdWV1ZTsKKwlwX3R4ID0gJnBfbGwyX2Nvbm4tPnR4X3F1ZXVlOworCisJcWVkX2NoYWluX3Jlc2V0KCZwX3J4LT5yeHFfY2hhaW4pOworCXFlZF9jaGFpbl9yZXNldCgmcF9yeC0+cmNxX2NoYWluKTsKKwlJTklUX0xJU1RfSEVBRCgmcF9yeC0+YWN0aXZlX2Rlc2NxKTsKKwlJTklUX0xJU1RfSEVBRCgmcF9yeC0+ZnJlZV9kZXNjcSk7CisJSU5JVF9MSVNUX0hFQUQoJnBfcngtPnBvc3RpbmdfZGVzY3EpOworCXNwaW5fbG9ja19pbml0KCZwX3J4LT5sb2NrKTsKKwljYXBhY2l0eSA9IHFlZF9jaGFpbl9nZXRfY2FwYWNpdHkoJnBfcngtPnJ4cV9jaGFpbik7CisJZm9yIChpID0gMDsgaSA8IGNhcGFjaXR5OyBpKyspCisJCWxpc3RfYWRkX3RhaWwoJnBfcngtPmRlc2NxX2FycmF5W2ldLmxpc3RfZW50cnksCisJCQkgICAgICAmcF9yeC0+ZnJlZV9kZXNjcSk7CisJKnBfcngtPnBfZndfY29ucyA9IDA7CisKKwlxZWRfY2hhaW5fcmVzZXQoJnBfdHgtPnR4cV9jaGFpbik7CisJSU5JVF9MSVNUX0hFQUQoJnBfdHgtPmFjdGl2ZV9kZXNjcSk7CisJSU5JVF9MSVNUX0hFQUQoJnBfdHgtPmZyZWVfZGVzY3EpOworCUlOSVRfTElTVF9IRUFEKCZwX3R4LT5zZW5kaW5nX2Rlc2NxKTsKKwlzcGluX2xvY2tfaW5pdCgmcF90eC0+bG9jayk7CisJY2FwYWNpdHkgPSBxZWRfY2hhaW5fZ2V0X2NhcGFjaXR5KCZwX3R4LT50eHFfY2hhaW4pOworCWZvciAoaSA9IDA7IGkgPCBjYXBhY2l0eTsgaSsrKQorCQlsaXN0X2FkZF90YWlsKCZwX3R4LT5kZXNjcV9hcnJheVtpXS5saXN0X2VudHJ5LAorCQkJICAgICAgJnBfdHgtPmZyZWVfZGVzY3EpOworCXBfdHgtPmN1cl9jb21wbGV0aW5nX2JkX2lkeCA9IDA7CisJcF90eC0+YmRzX2lkeCA9IDA7CisJcF90eC0+Yl9jb21wbGV0aW5nX3BhY2tldCA9IGZhbHNlOworCXBfdHgtPmN1cl9zZW5kX3BhY2tldCA9IE5VTEw7CisJcF90eC0+Y3VyX3NlbmRfZnJhZ19udW0gPSAwOworCXBfdHgtPmN1cl9jb21wbGV0aW5nX2ZyYWdfbnVtID0gMDsKKwkqcF90eC0+cF9md19jb25zID0gMDsKKworCXFlZF9jeHRfYWNxdWlyZV9jaWQocF9od2ZuLCBQUk9UT0NPTElEX0NPUkUsICZwX2xsMl9jb25uLT5jaWQpOworCisJcWlkID0gcF9od2ZuLT5od19pbmZvLnJlc2Nfc3RhcnRbUUVEX0xMMl9RVUVVRV0gKyBjb25uZWN0aW9uX2hhbmRsZTsKKwlwX2xsMl9jb25uLT5xdWV1ZV9pZCA9IHFpZDsKKwlwX2xsMl9jb25uLT50eF9zdGF0c19pZCA9IHFpZDsKKwlwX3J4LT5zZXRfcHJvZF9hZGRyID0gKHU4IF9faW9tZW0gKilwX2h3Zm4tPnJlZ3ZpZXcgKworCQkJCQkgICAgR1RUX0JBUjBfTUFQX1JFR19UU0RNX1JBTSArCisJCQkJCSAgICBUU1RPUk1fTEwyX1JYX1BST0RTX09GRlNFVChxaWQpOworCXBfdHgtPmRvb3JiZWxsX2FkZHIgPSAodTggX19pb21lbSAqKXBfaHdmbi0+ZG9vcmJlbGxzICsKKwkJCQkJICAgIHFlZF9kYl9hZGRyKHBfbGwyX2Nvbm4tPmNpZCwKKwkJCQkJCQlEUV9ERU1TX0xFR0FDWSk7CisKKwlyYyA9IHFlZF9sbDJfZXN0YWJsaXNoX2Nvbm5lY3Rpb25fcngocF9od2ZuLCBwX2xsMl9jb25uKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gcWVkX3NwX2xsMl90eF9xdWV1ZV9zdGFydChwX2h3Zm4sIHBfbGwyX2Nvbm4pOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaWYgKHBfaHdmbi0+aHdfaW5mby5wZXJzb25hbGl0eSAhPSBRRURfUENJX0VUSF9ST0NFKQorCQlxZWRfd3IocF9od2ZuLCBwX2h3Zm4tPnBfbWFpbl9wdHQsIFBSU19SRUdfVVNFX0xJR0hUX0wyLCAxKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgcWVkX2xsMl9wb3N0X3J4X2J1ZmZlcl9ub3RpZnlfZncoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgICAgc3RydWN0IHFlZF9sbDJfcnhfcXVldWUgKnBfcngsCisJCQkJCSAgICAgc3RydWN0IHFlZF9sbDJfcnhfcGFja2V0ICpwX2N1cnApCit7CisJc3RydWN0IHFlZF9sbDJfcnhfcGFja2V0ICpwX3Bvc3RpbmdfcGFja2V0ID0gTlVMTDsKKwlzdHJ1Y3QgY29yZV9sbDJfcnhfcHJvZCByeF9wcm9kID0geyAwLCAwLCAwIH07CisJYm9vbCBiX25vdGlmeV9mdyA9IGZhbHNlOworCXUxNiBiZF9wcm9kLCBjcV9wcm9kOworCisJLyogVGhpcyBoYW5kbGVzIHRoZSBmbHVzaGluZyBvZiBhbHJlYWR5IHBvc3RlZCBidWZmZXJzICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZwX3J4LT5wb3N0aW5nX2Rlc2NxKSkgeworCQlwX3Bvc3RpbmdfcGFja2V0ID0gbGlzdF9maXJzdF9lbnRyeSgmcF9yeC0+cG9zdGluZ19kZXNjcSwKKwkJCQkJCSAgICBzdHJ1Y3QgcWVkX2xsMl9yeF9wYWNrZXQsCisJCQkJCQkgICAgbGlzdF9lbnRyeSk7CisJCWxpc3RfZGVsKCZwX3Bvc3RpbmdfcGFja2V0LT5saXN0X2VudHJ5KTsKKwkJbGlzdF9hZGRfdGFpbCgmcF9wb3N0aW5nX3BhY2tldC0+bGlzdF9lbnRyeSwKKwkJCSAgICAgICZwX3J4LT5hY3RpdmVfZGVzY3EpOworCQliX25vdGlmeV9mdyA9IHRydWU7CisJfQorCisJLyogVGhpcyBoYW5kbGVzIHRoZSBzdXBwbGllZCBwYWNrZXQgW2lmIHRoZXJlIGlzIG9uZV0gKi8KKwlpZiAocF9jdXJwKSB7CisJCWxpc3RfYWRkX3RhaWwoJnBfY3VycC0+bGlzdF9lbnRyeSwgJnBfcngtPmFjdGl2ZV9kZXNjcSk7CisJCWJfbm90aWZ5X2Z3ID0gdHJ1ZTsKKwl9CisKKwlpZiAoIWJfbm90aWZ5X2Z3KQorCQlyZXR1cm47CisKKwliZF9wcm9kID0gcWVkX2NoYWluX2dldF9wcm9kX2lkeCgmcF9yeC0+cnhxX2NoYWluKTsKKwljcV9wcm9kID0gcWVkX2NoYWluX2dldF9wcm9kX2lkeCgmcF9yeC0+cmNxX2NoYWluKTsKKwlyeF9wcm9kLmJkX3Byb2QgPSBjcHVfdG9fbGUxNihiZF9wcm9kKTsKKwlyeF9wcm9kLmNxZV9wcm9kID0gY3B1X3RvX2xlMTYoY3FfcHJvZCk7CisJRElSRUNUX1JFR19XUihwX3J4LT5zZXRfcHJvZF9hZGRyLCAqKCh1MzIgKikmcnhfcHJvZCkpOworfQorCitpbnQgcWVkX2xsMl9wb3N0X3J4X2J1ZmZlcihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgIHU4IGNvbm5lY3Rpb25faGFuZGxlLAorCQkJICAgZG1hX2FkZHJfdCBhZGRyLAorCQkJICAgdTE2IGJ1Zl9sZW4sIHZvaWQgKmNvb2tpZSwgdTggbm90aWZ5X2Z3KQoreworCXN0cnVjdCBjb3JlX3J4X2JkX3dpdGhfYnVmZl9sZW4gKnBfY3VyYiA9IE5VTEw7CisJc3RydWN0IHFlZF9sbDJfcnhfcGFja2V0ICpwX2N1cnAgPSBOVUxMOworCXN0cnVjdCBxZWRfbGwyX2luZm8gKnBfbGwyX2Nvbm47CisJc3RydWN0IHFlZF9sbDJfcnhfcXVldWUgKnBfcng7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2lkICpwX2RhdGE7CisJaW50IHJjID0gMDsKKworCXBfbGwyX2Nvbm4gPSBxZWRfbGwyX2hhbmRsZV9zYW5pdHkocF9od2ZuLCBjb25uZWN0aW9uX2hhbmRsZSk7CisJaWYgKCFwX2xsMl9jb25uKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwX3J4ID0gJnBfbGwyX2Nvbm4tPnJ4X3F1ZXVlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBfcngtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIWxpc3RfZW1wdHkoJnBfcngtPmZyZWVfZGVzY3EpKQorCQlwX2N1cnAgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwX3J4LT5mcmVlX2Rlc2NxLAorCQkJCQkgIHN0cnVjdCBxZWRfbGwyX3J4X3BhY2tldCwgbGlzdF9lbnRyeSk7CisJaWYgKHBfY3VycCkgeworCQlpZiAocWVkX2NoYWluX2dldF9lbGVtX2xlZnQoJnBfcngtPnJ4cV9jaGFpbikgJiYKKwkJICAgIHFlZF9jaGFpbl9nZXRfZWxlbV9sZWZ0KCZwX3J4LT5yY3FfY2hhaW4pKSB7CisJCQlwX2RhdGEgPSBxZWRfY2hhaW5fcHJvZHVjZSgmcF9yeC0+cnhxX2NoYWluKTsKKwkJCXBfY3VyYiA9IChzdHJ1Y3QgY29yZV9yeF9iZF93aXRoX2J1ZmZfbGVuICopcF9kYXRhOworCQkJcWVkX2NoYWluX3Byb2R1Y2UoJnBfcngtPnJjcV9jaGFpbik7CisJCX0KKwl9CisKKwkvKiBJZiB3ZSdyZSBsYWNraW5nIGVudGlyZXMsIGxldCdzIHRyeSB0byBmbHVzaCBidWZmZXJzIHRvIEZXICovCisJaWYgKCFwX2N1cnAgfHwgIXBfY3VyYikgeworCQlyYyA9IC1FQlVTWTsKKwkJcF9jdXJwID0gTlVMTDsKKwkJZ290byBvdXRfbm90aWZ5OworCX0KKworCS8qIFdlIGhhdmUgYW4gUnggcGFja2V0IHdlIGNhbiBmaWxsICovCisJRE1BX1JFR1BBSVJfTEUocF9jdXJiLT5hZGRyLCBhZGRyKTsKKwlwX2N1cmItPmJ1ZmZfbGVuZ3RoID0gY3B1X3RvX2xlMTYoYnVmX2xlbik7CisJcF9jdXJwLT5yeF9idWZfYWRkciA9IGFkZHI7CisJcF9jdXJwLT5jb29raWUgPSBjb29raWU7CisJcF9jdXJwLT5yeHFfYmQgPSBwX2N1cmI7CisJcF9jdXJwLT5idWZfbGVuZ3RoID0gYnVmX2xlbjsKKwlsaXN0X2RlbCgmcF9jdXJwLT5saXN0X2VudHJ5KTsKKworCS8qIENoZWNrIGlmIHdlIG9ubHkgd2FudCB0byBlbnF1ZXVlIHRoaXMgcGFja2V0IHdpdGhvdXQgaW5mb3JtaW5nIEZXICovCisJaWYgKCFub3RpZnlfZncpIHsKKwkJbGlzdF9hZGRfdGFpbCgmcF9jdXJwLT5saXN0X2VudHJ5LCAmcF9yeC0+cG9zdGluZ19kZXNjcSk7CisJCWdvdG8gb3V0OworCX0KKworb3V0X25vdGlmeToKKwlxZWRfbGwyX3Bvc3RfcnhfYnVmZmVyX25vdGlmeV9mdyhwX2h3Zm4sIHBfcngsIHBfY3VycCk7CitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcF9yeC0+bG9jaywgZmxhZ3MpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgcWVkX2xsMl9wcmVwYXJlX3R4X3BhY2tldF9zZXQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgc3RydWN0IHFlZF9sbDJfdHhfcXVldWUgKnBfdHgsCisJCQkJCSAgc3RydWN0IHFlZF9sbDJfdHhfcGFja2V0ICpwX2N1cnAsCisJCQkJCSAgdTggbnVtX29mX2JkcywKKwkJCQkJICBkbWFfYWRkcl90IGZpcnN0X2ZyYWcsCisJCQkJCSAgdTE2IGZpcnN0X2ZyYWdfbGVuLCB2b2lkICpwX2Nvb2tpZSwKKwkJCQkJICB1OCBub3RpZnlfZncpCit7CisJbGlzdF9kZWwoJnBfY3VycC0+bGlzdF9lbnRyeSk7CisJcF9jdXJwLT5jb29raWUgPSBwX2Nvb2tpZTsKKwlwX2N1cnAtPmJkX3VzZWQgPSBudW1fb2ZfYmRzOworCXBfY3VycC0+bm90aWZ5X2Z3ID0gbm90aWZ5X2Z3OworCXBfdHgtPmN1cl9zZW5kX3BhY2tldCA9IHBfY3VycDsKKwlwX3R4LT5jdXJfc2VuZF9mcmFnX251bSA9IDA7CisKKwlwX2N1cnAtPmJkc19zZXRbcF90eC0+Y3VyX3NlbmRfZnJhZ19udW1dLnR4X2ZyYWcgPSBmaXJzdF9mcmFnOworCXBfY3VycC0+YmRzX3NldFtwX3R4LT5jdXJfc2VuZF9mcmFnX251bV0uZnJhZ19sZW4gPSBmaXJzdF9mcmFnX2xlbjsKKwlwX3R4LT5jdXJfc2VuZF9mcmFnX251bSsrOworfQorCitzdGF0aWMgdm9pZCBxZWRfbGwyX3ByZXBhcmVfdHhfcGFja2V0X3NldF9iZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICAgICBzdHJ1Y3QgcWVkX2xsMl9pbmZvICpwX2xsMiwKKwkJCQkJICAgICBzdHJ1Y3QgcWVkX2xsMl90eF9wYWNrZXQgKnBfY3VycCwKKwkJCQkJICAgICB1OCBudW1fb2ZfYmRzLAorCQkJCQkgICAgIGVudW0gY29yZV90eF9kZXN0IHR4X2Rlc3QsCisJCQkJCSAgICAgdTE2IHZsYW4sCisJCQkJCSAgICAgdTggYmRfZmxhZ3MsCisJCQkJCSAgICAgdTE2IGw0X2hkcl9vZmZzZXRfdywKKwkJCQkJICAgICBlbnVtIGNvcmVfcm9jZV9mbGF2b3JfdHlwZSB0eXBlLAorCQkJCQkgICAgIGRtYV9hZGRyX3QgZmlyc3RfZnJhZywKKwkJCQkJICAgICB1MTYgZmlyc3RfZnJhZ19sZW4pCit7CisJc3RydWN0IHFlZF9jaGFpbiAqcF90eF9jaGFpbiA9ICZwX2xsMi0+dHhfcXVldWUudHhxX2NoYWluOworCXUxNiBwcm9kX2lkeCA9IHFlZF9jaGFpbl9nZXRfcHJvZF9pZHgocF90eF9jaGFpbik7CisJc3RydWN0IGNvcmVfdHhfYmQgKnN0YXJ0X2JkID0gTlVMTDsKKwl1MTYgZnJhZ19pZHg7CisKKwlzdGFydF9iZCA9IChzdHJ1Y3QgY29yZV90eF9iZCAqKXFlZF9jaGFpbl9wcm9kdWNlKHBfdHhfY2hhaW4pOworCXN0YXJ0X2JkLT5ud192bGFuX29yX2xiX2VjaG8gPSBjcHVfdG9fbGUxNih2bGFuKTsKKwlTRVRfRklFTEQoc3RhcnRfYmQtPmJpdGZpZWxkMSwgQ09SRV9UWF9CRF9MNF9IRFJfT0ZGU0VUX1csCisJCSAgY3B1X3RvX2xlMTYobDRfaGRyX29mZnNldF93KSk7CisJU0VUX0ZJRUxEKHN0YXJ0X2JkLT5iaXRmaWVsZDEsIENPUkVfVFhfQkRfVFhfRFNULCB0eF9kZXN0KTsKKwlzdGFydF9iZC0+YmRfZmxhZ3MuYXNfYml0ZmllbGQgPSBiZF9mbGFnczsKKwlzdGFydF9iZC0+YmRfZmxhZ3MuYXNfYml0ZmllbGQgfD0gQ09SRV9UWF9CRF9GTEFHU19TVEFSVF9CRF9NQVNLIDw8CisJICAgIENPUkVfVFhfQkRfRkxBR1NfU1RBUlRfQkRfU0hJRlQ7CisJU0VUX0ZJRUxEKHN0YXJ0X2JkLT5iaXRmaWVsZDAsIENPUkVfVFhfQkRfTkJEUywgbnVtX29mX2Jkcyk7CisJRE1BX1JFR1BBSVJfTEUoc3RhcnRfYmQtPmFkZHIsIGZpcnN0X2ZyYWcpOworCXN0YXJ0X2JkLT5uYnl0ZXMgPSBjcHVfdG9fbGUxNihmaXJzdF9mcmFnX2xlbik7CisKKwlTRVRfRklFTEQoc3RhcnRfYmQtPmJkX2ZsYWdzLmFzX2JpdGZpZWxkLCBDT1JFX1RYX0JEX0ZMQUdTX1JPQ0VfRkxBViwKKwkJICB0eXBlKTsKKworCURQX1ZFUkJPU0UocF9od2ZuLAorCQkgICAoTkVUSUZfTVNHX1RYX1FVRVVFRCB8IFFFRF9NU0dfTEwyKSwKKwkJICAgIkxMMiBbcSAweCUwMnggY2lkIDB4JTA4eCB0eXBlIDB4JTA4eF0gVHggUHJvZHVjZXIgYXQgWzB4JTA0eF0gLSBzZXQgd2l0aCBhICUwNHggYnl0ZXMgJTAyeCBCRHMgYnVmZmVyIGF0ICUwOHg6JTA4eFxuIiwKKwkJICAgcF9sbDItPnF1ZXVlX2lkLAorCQkgICBwX2xsMi0+Y2lkLAorCQkgICBwX2xsMi0+Y29ubl90eXBlLAorCQkgICBwcm9kX2lkeCwKKwkJICAgZmlyc3RfZnJhZ19sZW4sCisJCSAgIG51bV9vZl9iZHMsCisJCSAgIGxlMzJfdG9fY3B1KHN0YXJ0X2JkLT5hZGRyLmhpKSwKKwkJICAgbGUzMl90b19jcHUoc3RhcnRfYmQtPmFkZHIubG8pKTsKKworCWlmIChwX2xsMi0+dHhfcXVldWUuY3VyX3NlbmRfZnJhZ19udW0gPT0gbnVtX29mX2JkcykKKwkJcmV0dXJuOworCisJLyogTmVlZCB0byBwcm92aWRlIHRoZSBwYWNrZXQgd2l0aCBhZGRpdGlvbmFsIEJEcyBmb3IgZnJhZ3MgKi8KKwlmb3IgKGZyYWdfaWR4ID0gcF9sbDItPnR4X3F1ZXVlLmN1cl9zZW5kX2ZyYWdfbnVtOworCSAgICAgZnJhZ19pZHggPCBudW1fb2ZfYmRzOyBmcmFnX2lkeCsrKSB7CisJCXN0cnVjdCBjb3JlX3R4X2JkICoqcF9iZCA9ICZwX2N1cnAtPmJkc19zZXRbZnJhZ19pZHhdLnR4cV9iZDsKKworCQkqcF9iZCA9IChzdHJ1Y3QgY29yZV90eF9iZCAqKXFlZF9jaGFpbl9wcm9kdWNlKHBfdHhfY2hhaW4pOworCQkoKnBfYmQpLT5iZF9mbGFncy5hc19iaXRmaWVsZCA9IDA7CisJCSgqcF9iZCktPmJpdGZpZWxkMSA9IDA7CisJCSgqcF9iZCktPmJpdGZpZWxkMCA9IDA7CisJCXBfY3VycC0+YmRzX3NldFtmcmFnX2lkeF0udHhfZnJhZyA9IDA7CisJCXBfY3VycC0+YmRzX3NldFtmcmFnX2lkeF0uZnJhZ19sZW4gPSAwOworCX0KK30KKworLyogVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoaWxlIHRoZSBUeHEgc3BpbmxvY2sgaXMgYmVpbmcgaGVsZCAqLworc3RhdGljIHZvaWQgcWVkX2xsMl90eF9wYWNrZXRfbm90aWZ5KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICAgc3RydWN0IHFlZF9sbDJfaW5mbyAqcF9sbDJfY29ubikKK3sKKwlib29sIGJfbm90aWZ5ID0gcF9sbDJfY29ubi0+dHhfcXVldWUuY3VyX3NlbmRfcGFja2V0LT5ub3RpZnlfZnc7CisJc3RydWN0IHFlZF9sbDJfdHhfcXVldWUgKnBfdHggPSAmcF9sbDJfY29ubi0+dHhfcXVldWU7CisJc3RydWN0IHFlZF9sbDJfdHhfcGFja2V0ICpwX3BrdCA9IE5VTEw7CisJc3RydWN0IGNvcmVfZGJfZGF0YSBkYl9tc2cgPSB7IDAsIDAsIDAgfTsKKwl1MTYgYmRfcHJvZDsKKworCS8qIElmIHRoZXJlIGFyZSBtaXNzaW5nIEJEcywgZG9uJ3QgZG8gYW55dGhpbmcgbm93ICovCisJaWYgKHBfbGwyX2Nvbm4tPnR4X3F1ZXVlLmN1cl9zZW5kX2ZyYWdfbnVtICE9CisJICAgIHBfbGwyX2Nvbm4tPnR4X3F1ZXVlLmN1cl9zZW5kX3BhY2tldC0+YmRfdXNlZCkKKwkJcmV0dXJuOworCisJLyogUHVzaCB0aGUgY3VycmVudCBwYWNrZXQgdG8gdGhlIGxpc3QgYW5kIGNsZWFuIGFmdGVyIGl0ICovCisJbGlzdF9hZGRfdGFpbCgmcF9sbDJfY29ubi0+dHhfcXVldWUuY3VyX3NlbmRfcGFja2V0LT5saXN0X2VudHJ5LAorCQkgICAgICAmcF9sbDJfY29ubi0+dHhfcXVldWUuc2VuZGluZ19kZXNjcSk7CisJcF9sbDJfY29ubi0+dHhfcXVldWUuY3VyX3NlbmRfcGFja2V0ID0gTlVMTDsKKwlwX2xsMl9jb25uLT50eF9xdWV1ZS5jdXJfc2VuZF9mcmFnX251bSA9IDA7CisKKwkvKiBOb3RpZnkgRlcgb2YgcGFja2V0IG9ubHkgaWYgcmVxdWVzdGVkIHRvICovCisJaWYgKCFiX25vdGlmeSkKKwkJcmV0dXJuOworCisJYmRfcHJvZCA9IHFlZF9jaGFpbl9nZXRfcHJvZF9pZHgoJnBfbGwyX2Nvbm4tPnR4X3F1ZXVlLnR4cV9jaGFpbik7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnBfdHgtPnNlbmRpbmdfZGVzY3EpKSB7CisJCXBfcGt0ID0gbGlzdF9maXJzdF9lbnRyeSgmcF90eC0+c2VuZGluZ19kZXNjcSwKKwkJCQkJIHN0cnVjdCBxZWRfbGwyX3R4X3BhY2tldCwgbGlzdF9lbnRyeSk7CisJCWlmICghcF9wa3QpCisJCQlicmVhazsKKworCQlsaXN0X2RlbCgmcF9wa3QtPmxpc3RfZW50cnkpOworCQlsaXN0X2FkZF90YWlsKCZwX3BrdC0+bGlzdF9lbnRyeSwgJnBfdHgtPmFjdGl2ZV9kZXNjcSk7CisJfQorCisJU0VUX0ZJRUxEKGRiX21zZy5wYXJhbXMsIENPUkVfREJfREFUQV9ERVNULCBEQl9ERVNUX1hDTSk7CisJU0VUX0ZJRUxEKGRiX21zZy5wYXJhbXMsIENPUkVfREJfREFUQV9BR0dfQ01ELCBEQl9BR0dfQ01EX1NFVCk7CisJU0VUX0ZJRUxEKGRiX21zZy5wYXJhbXMsIENPUkVfREJfREFUQV9BR0dfVkFMX1NFTCwKKwkJICBEUV9YQ01fQ09SRV9UWF9CRF9QUk9EX0NNRCk7CisJZGJfbXNnLmFnZ19mbGFncyA9IERRX1hDTV9DT1JFX0RRX0NGX0NNRDsKKwlkYl9tc2cuc3BxX3Byb2QgPSBjcHVfdG9fbGUxNihiZF9wcm9kKTsKKworCS8qIE1ha2Ugc3VyZSB0aGUgQkRzIGRhdGEgaXMgdXBkYXRlZCBiZWZvcmUgcmluZ2luZyB0aGUgZG9vcmJlbGwgKi8KKwl3bWIoKTsKKworCURJUkVDVF9SRUdfV1IocF90eC0+ZG9vcmJlbGxfYWRkciwgKigodTMyICopJmRiX21zZykpOworCisJRFBfVkVSQk9TRShwX2h3Zm4sCisJCSAgIChORVRJRl9NU0dfVFhfUVVFVUVEIHwgUUVEX01TR19MTDIpLAorCQkgICAiTEwyIFtxIDB4JTAyeCBjaWQgMHglMDh4IHR5cGUgMHglMDh4XSBEb29yYmVsbGVkIFtwcm9kdWNlciAweCUwNHhdXG4iLAorCQkgICBwX2xsMl9jb25uLT5xdWV1ZV9pZCwKKwkJICAgcF9sbDJfY29ubi0+Y2lkLCBwX2xsMl9jb25uLT5jb25uX3R5cGUsIGRiX21zZy5zcHFfcHJvZCk7Cit9CisKK2ludCBxZWRfbGwyX3ByZXBhcmVfdHhfcGFja2V0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgICAgdTggY29ubmVjdGlvbl9oYW5kbGUsCisJCQkgICAgICB1OCBudW1fb2ZfYmRzLAorCQkJICAgICAgdTE2IHZsYW4sCisJCQkgICAgICB1OCBiZF9mbGFncywKKwkJCSAgICAgIHUxNiBsNF9oZHJfb2Zmc2V0X3csCisJCQkgICAgICBlbnVtIHFlZF9sbDJfcm9jZV9mbGF2b3JfdHlwZSBxZWRfcm9jZV9mbGF2b3IsCisJCQkgICAgICBkbWFfYWRkcl90IGZpcnN0X2ZyYWcsCisJCQkgICAgICB1MTYgZmlyc3RfZnJhZ19sZW4sIHZvaWQgKmNvb2tpZSwgdTggbm90aWZ5X2Z3KQoreworCXN0cnVjdCBxZWRfbGwyX3R4X3BhY2tldCAqcF9jdXJwID0gTlVMTDsKKwlzdHJ1Y3QgcWVkX2xsMl9pbmZvICpwX2xsMl9jb25uID0gTlVMTDsKKwllbnVtIGNvcmVfcm9jZV9mbGF2b3JfdHlwZSByb2NlX2ZsYXZvcjsKKwlzdHJ1Y3QgcWVkX2xsMl90eF9xdWV1ZSAqcF90eDsKKwlzdHJ1Y3QgcWVkX2NoYWluICpwX3R4X2NoYWluOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjID0gMDsKKworCXBfbGwyX2Nvbm4gPSBxZWRfbGwyX2hhbmRsZV9zYW5pdHkocF9od2ZuLCBjb25uZWN0aW9uX2hhbmRsZSk7CisJaWYgKCFwX2xsMl9jb25uKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwX3R4ID0gJnBfbGwyX2Nvbm4tPnR4X3F1ZXVlOworCXBfdHhfY2hhaW4gPSAmcF90eC0+dHhxX2NoYWluOworCisJaWYgKG51bV9vZl9iZHMgPiBDT1JFX0xMMl9UWF9NQVhfQkRTX1BFUl9QQUNLRVQpCisJCXJldHVybiAtRUlPOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBfdHgtPmxvY2ssIGZsYWdzKTsKKwlpZiAocF90eC0+Y3VyX3NlbmRfcGFja2V0KSB7CisJCXJjID0gLUVFWElTVDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogR2V0IGVudHJ5LCBidXQgb25seSBpZiB3ZSBoYXZlIHR4IGVsZW1lbnRzIGZvciBpdCAqLworCWlmICghbGlzdF9lbXB0eSgmcF90eC0+ZnJlZV9kZXNjcSkpCisJCXBfY3VycCA9IGxpc3RfZmlyc3RfZW50cnkoJnBfdHgtPmZyZWVfZGVzY3EsCisJCQkJCSAgc3RydWN0IHFlZF9sbDJfdHhfcGFja2V0LCBsaXN0X2VudHJ5KTsKKwlpZiAocF9jdXJwICYmIHFlZF9jaGFpbl9nZXRfZWxlbV9sZWZ0KHBfdHhfY2hhaW4pIDwgbnVtX29mX2JkcykKKwkJcF9jdXJwID0gTlVMTDsKKworCWlmICghcF9jdXJwKSB7CisJCXJjID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocWVkX3JvY2VfZmxhdm9yID09IFFFRF9MTDJfUk9DRSkgeworCQlyb2NlX2ZsYXZvciA9IENPUkVfUk9DRTsKKwl9IGVsc2UgaWYgKHFlZF9yb2NlX2ZsYXZvciA9PSBRRURfTEwyX1JST0NFKSB7CisJCXJvY2VfZmxhdm9yID0gQ09SRV9SUk9DRTsKKwl9IGVsc2UgeworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFByZXBhcmUgcGFja2V0IGFuZCBCRCwgYW5kIHBlcmhhcHMgc2VuZCBhIGRvb3JiZWxsIHRvIEZXICovCisJcWVkX2xsMl9wcmVwYXJlX3R4X3BhY2tldF9zZXQocF9od2ZuLCBwX3R4LCBwX2N1cnAsCisJCQkJICAgICAgbnVtX29mX2JkcywgZmlyc3RfZnJhZywKKwkJCQkgICAgICBmaXJzdF9mcmFnX2xlbiwgY29va2llLCBub3RpZnlfZncpOworCXFlZF9sbDJfcHJlcGFyZV90eF9wYWNrZXRfc2V0X2JkKHBfaHdmbiwgcF9sbDJfY29ubiwgcF9jdXJwLAorCQkJCQkgbnVtX29mX2JkcywgQ09SRV9UWF9ERVNUX05XLAorCQkJCQkgdmxhbiwgYmRfZmxhZ3MsIGw0X2hkcl9vZmZzZXRfdywKKwkJCQkJIHJvY2VfZmxhdm9yLAorCQkJCQkgZmlyc3RfZnJhZywgZmlyc3RfZnJhZ19sZW4pOworCisJcWVkX2xsMl90eF9wYWNrZXRfbm90aWZ5KHBfaHdmbiwgcF9sbDJfY29ubik7CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwX3R4LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJjOworfQorCitpbnQgcWVkX2xsMl9zZXRfZnJhZ21lbnRfb2ZfdHhfcGFja2V0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICAgIHU4IGNvbm5lY3Rpb25faGFuZGxlLAorCQkJCSAgICAgIGRtYV9hZGRyX3QgYWRkciwgdTE2IG5ieXRlcykKK3sKKwlzdHJ1Y3QgcWVkX2xsMl90eF9wYWNrZXQgKnBfY3VyX3NlbmRfcGFja2V0ID0gTlVMTDsKKwlzdHJ1Y3QgcWVkX2xsMl9pbmZvICpwX2xsMl9jb25uID0gTlVMTDsKKwl1MTYgY3VyX3NlbmRfZnJhZ19udW0gPSAwOworCXN0cnVjdCBjb3JlX3R4X2JkICpwX2JkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwX2xsMl9jb25uID0gcWVkX2xsMl9oYW5kbGVfc2FuaXR5KHBfaHdmbiwgY29ubmVjdGlvbl9oYW5kbGUpOworCWlmICghcF9sbDJfY29ubikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXBfbGwyX2Nvbm4tPnR4X3F1ZXVlLmN1cl9zZW5kX3BhY2tldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwX2N1cl9zZW5kX3BhY2tldCA9IHBfbGwyX2Nvbm4tPnR4X3F1ZXVlLmN1cl9zZW5kX3BhY2tldDsKKwljdXJfc2VuZF9mcmFnX251bSA9IHBfbGwyX2Nvbm4tPnR4X3F1ZXVlLmN1cl9zZW5kX2ZyYWdfbnVtOworCisJaWYgKGN1cl9zZW5kX2ZyYWdfbnVtID49IHBfY3VyX3NlbmRfcGFja2V0LT5iZF91c2VkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEZpbGwgdGhlIEJEIGluZm9ybWF0aW9uLCBhbmQgcG9zc2libHkgbm90aWZ5IEZXICovCisJcF9iZCA9IHBfY3VyX3NlbmRfcGFja2V0LT5iZHNfc2V0W2N1cl9zZW5kX2ZyYWdfbnVtXS50eHFfYmQ7CisJRE1BX1JFR1BBSVJfTEUocF9iZC0+YWRkciwgYWRkcik7CisJcF9iZC0+bmJ5dGVzID0gY3B1X3RvX2xlMTYobmJ5dGVzKTsKKwlwX2N1cl9zZW5kX3BhY2tldC0+YmRzX3NldFtjdXJfc2VuZF9mcmFnX251bV0udHhfZnJhZyA9IGFkZHI7CisJcF9jdXJfc2VuZF9wYWNrZXQtPmJkc19zZXRbY3VyX3NlbmRfZnJhZ19udW1dLmZyYWdfbGVuID0gbmJ5dGVzOworCisJcF9sbDJfY29ubi0+dHhfcXVldWUuY3VyX3NlbmRfZnJhZ19udW0rKzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwX2xsMl9jb25uLT50eF9xdWV1ZS5sb2NrLCBmbGFncyk7CisJcWVkX2xsMl90eF9wYWNrZXRfbm90aWZ5KHBfaHdmbiwgcF9sbDJfY29ubik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcF9sbDJfY29ubi0+dHhfcXVldWUubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBxZWRfbGwyX3Rlcm1pbmF0ZV9jb25uZWN0aW9uKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCB1OCBjb25uZWN0aW9uX2hhbmRsZSkKK3sKKwlzdHJ1Y3QgcWVkX2xsMl9pbmZvICpwX2xsMl9jb25uID0gTlVMTDsKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJcF9sbDJfY29ubiA9IHFlZF9sbDJfaGFuZGxlX3Nhbml0eV9sb2NrKHBfaHdmbiwgY29ubmVjdGlvbl9oYW5kbGUpOworCWlmICghcF9sbDJfY29ubikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBTdG9wIFR4ICYgUnggb2YgY29ubmVjdGlvbiwgaWYgbmVlZGVkICovCisJaWYgKFFFRF9MTDJfVFhfUkVHSVNURVJFRChwX2xsMl9jb25uKSkgeworCQlyYyA9IHFlZF9zcF9sbDJfdHhfcXVldWVfc3RvcChwX2h3Zm4sIHBfbGwyX2Nvbm4pOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJCXFlZF9sbDJfdHhxX2ZsdXNoKHBfaHdmbiwgY29ubmVjdGlvbl9oYW5kbGUpOworCX0KKworCWlmIChRRURfTEwyX1JYX1JFR0lTVEVSRUQocF9sbDJfY29ubikpIHsKKwkJcmMgPSBxZWRfc3BfbGwyX3J4X3F1ZXVlX3N0b3AocF9od2ZuLCBwX2xsMl9jb25uKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCQlxZWRfbGwyX3J4cV9mbHVzaChwX2h3Zm4sIGNvbm5lY3Rpb25faGFuZGxlKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQgcWVkX2xsMl9yZWxlYXNlX2Nvbm5lY3Rpb24oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHU4IGNvbm5lY3Rpb25faGFuZGxlKQoreworCXN0cnVjdCBxZWRfbGwyX2luZm8gKnBfbGwyX2Nvbm4gPSBOVUxMOworCisJcF9sbDJfY29ubiA9IHFlZF9sbDJfaGFuZGxlX3Nhbml0eShwX2h3Zm4sIGNvbm5lY3Rpb25faGFuZGxlKTsKKwlpZiAoIXBfbGwyX2Nvbm4pCisJCXJldHVybjsKKworCWlmIChRRURfTEwyX1JYX1JFR0lTVEVSRUQocF9sbDJfY29ubikpIHsKKwkJcF9sbDJfY29ubi0+cnhfcXVldWUuYl9jYl9yZWdpc3RyZWQgPSBmYWxzZTsKKwkJcWVkX2ludF91bnJlZ2lzdGVyX2NiKHBfaHdmbiwgcF9sbDJfY29ubi0+cnhfcXVldWUucnhfc2JfaW5kZXgpOworCX0KKworCWlmIChRRURfTEwyX1RYX1JFR0lTVEVSRUQocF9sbDJfY29ubikpIHsKKwkJcF9sbDJfY29ubi0+dHhfcXVldWUuYl9jYl9yZWdpc3RyZWQgPSBmYWxzZTsKKwkJcWVkX2ludF91bnJlZ2lzdGVyX2NiKHBfaHdmbiwgcF9sbDJfY29ubi0+dHhfcXVldWUudHhfc2JfaW5kZXgpOworCX0KKworCWtmcmVlKHBfbGwyX2Nvbm4tPnR4X3F1ZXVlLmRlc2NxX2FycmF5KTsKKwlxZWRfY2hhaW5fZnJlZShwX2h3Zm4tPmNkZXYsICZwX2xsMl9jb25uLT50eF9xdWV1ZS50eHFfY2hhaW4pOworCisJa2ZyZWUocF9sbDJfY29ubi0+cnhfcXVldWUuZGVzY3FfYXJyYXkpOworCXFlZF9jaGFpbl9mcmVlKHBfaHdmbi0+Y2RldiwgJnBfbGwyX2Nvbm4tPnJ4X3F1ZXVlLnJ4cV9jaGFpbik7CisJcWVkX2NoYWluX2ZyZWUocF9od2ZuLT5jZGV2LCAmcF9sbDJfY29ubi0+cnhfcXVldWUucmNxX2NoYWluKTsKKworCXFlZF9jeHRfcmVsZWFzZV9jaWQocF9od2ZuLCBwX2xsMl9jb25uLT5jaWQpOworCisJbXV0ZXhfbG9jaygmcF9sbDJfY29ubi0+bXV0ZXgpOworCXBfbGwyX2Nvbm4tPmJfYWN0aXZlID0gZmFsc2U7CisJbXV0ZXhfdW5sb2NrKCZwX2xsMl9jb25uLT5tdXRleCk7Cit9CisKK3N0cnVjdCBxZWRfbGwyX2luZm8gKnFlZF9sbDJfYWxsb2Moc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4pCit7CisJc3RydWN0IHFlZF9sbDJfaW5mbyAqcF9sbDJfY29ubmVjdGlvbnM7CisJdTggaTsKKworCS8qIEFsbG9jYXRlIExMMidzIHNldCBzdHJ1Y3QgKi8KKwlwX2xsMl9jb25uZWN0aW9ucyA9IGtjYWxsb2MoUUVEX01BWF9OVU1fT0ZfTEwyX0NPTk5FQ1RJT05TLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHFlZF9sbDJfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghcF9sbDJfY29ubmVjdGlvbnMpIHsKKwkJRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBgc3RydWN0IHFlZF9sbDInXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFFFRF9NQVhfTlVNX09GX0xMMl9DT05ORUNUSU9OUzsgaSsrKQorCQlwX2xsMl9jb25uZWN0aW9uc1tpXS5teV9pZCA9IGk7CisKKwlyZXR1cm4gcF9sbDJfY29ubmVjdGlvbnM7Cit9CisKK3ZvaWQgcWVkX2xsMl9zZXR1cChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJICAgc3RydWN0IHFlZF9sbDJfaW5mbyAqcF9sbDJfY29ubmVjdGlvbnMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUUVEX01BWF9OVU1fT0ZfTEwyX0NPTk5FQ1RJT05TOyBpKyspCisJCW11dGV4X2luaXQoJnBfbGwyX2Nvbm5lY3Rpb25zW2ldLm11dGV4KTsKK30KKwordm9pZCBxZWRfbGwyX2ZyZWUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCSAgc3RydWN0IHFlZF9sbDJfaW5mbyAqcF9sbDJfY29ubmVjdGlvbnMpCit7CisJa2ZyZWUocF9sbDJfY29ubmVjdGlvbnMpOworfQorCitzdGF0aWMgdm9pZCBfcWVkX2xsMl9nZXRfdHN0YXRzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCXN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQlzdHJ1Y3QgcWVkX2xsMl9pbmZvICpwX2xsMl9jb25uLAorCQkJCXN0cnVjdCBxZWRfbGwyX3N0YXRzICpwX3N0YXRzKQoreworCXN0cnVjdCBjb3JlX2xsMl90c3Rvcm1fcGVyX3F1ZXVlX3N0YXQgdHN0YXRzOworCXU4IHFpZCA9IHBfbGwyX2Nvbm4tPnF1ZXVlX2lkOworCXUzMiB0c3RhdHNfYWRkcjsKKworCW1lbXNldCgmdHN0YXRzLCAwLCBzaXplb2YodHN0YXRzKSk7CisJdHN0YXRzX2FkZHIgPSBCQVIwX01BUF9SRUdfVFNETV9SQU0gKworCQkgICAgICBDT1JFX0xMMl9UU1RPUk1fUEVSX1FVRVVFX1NUQVRfT0ZGU0VUKHFpZCk7CisJcWVkX21lbWNweV9mcm9tKHBfaHdmbiwgcF9wdHQsICZ0c3RhdHMsIHRzdGF0c19hZGRyLCBzaXplb2YodHN0YXRzKSk7CisKKwlwX3N0YXRzLT5wYWNrZXRfdG9vX2JpZ19kaXNjYXJkID0KKwkJCUhJTE9fNjRfUkVHUEFJUih0c3RhdHMucGFja2V0X3Rvb19iaWdfZGlzY2FyZCk7CisJcF9zdGF0cy0+bm9fYnVmZl9kaXNjYXJkID0gSElMT182NF9SRUdQQUlSKHRzdGF0cy5ub19idWZmX2Rpc2NhcmQpOworfQorCitzdGF0aWMgdm9pZCBfcWVkX2xsMl9nZXRfdXN0YXRzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCXN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQlzdHJ1Y3QgcWVkX2xsMl9pbmZvICpwX2xsMl9jb25uLAorCQkJCXN0cnVjdCBxZWRfbGwyX3N0YXRzICpwX3N0YXRzKQoreworCXN0cnVjdCBjb3JlX2xsMl91c3Rvcm1fcGVyX3F1ZXVlX3N0YXQgdXN0YXRzOworCXU4IHFpZCA9IHBfbGwyX2Nvbm4tPnF1ZXVlX2lkOworCXUzMiB1c3RhdHNfYWRkcjsKKworCW1lbXNldCgmdXN0YXRzLCAwLCBzaXplb2YodXN0YXRzKSk7CisJdXN0YXRzX2FkZHIgPSBCQVIwX01BUF9SRUdfVVNETV9SQU0gKworCQkgICAgICBDT1JFX0xMMl9VU1RPUk1fUEVSX1FVRVVFX1NUQVRfT0ZGU0VUKHFpZCk7CisJcWVkX21lbWNweV9mcm9tKHBfaHdmbiwgcF9wdHQsICZ1c3RhdHMsIHVzdGF0c19hZGRyLCBzaXplb2YodXN0YXRzKSk7CisKKwlwX3N0YXRzLT5yY3ZfdWNhc3RfYnl0ZXMgPSBISUxPXzY0X1JFR1BBSVIodXN0YXRzLnJjdl91Y2FzdF9ieXRlcyk7CisJcF9zdGF0cy0+cmN2X21jYXN0X2J5dGVzID0gSElMT182NF9SRUdQQUlSKHVzdGF0cy5yY3ZfbWNhc3RfYnl0ZXMpOworCXBfc3RhdHMtPnJjdl9iY2FzdF9ieXRlcyA9IEhJTE9fNjRfUkVHUEFJUih1c3RhdHMucmN2X2JjYXN0X2J5dGVzKTsKKwlwX3N0YXRzLT5yY3ZfdWNhc3RfcGt0cyA9IEhJTE9fNjRfUkVHUEFJUih1c3RhdHMucmN2X3VjYXN0X3BrdHMpOworCXBfc3RhdHMtPnJjdl9tY2FzdF9wa3RzID0gSElMT182NF9SRUdQQUlSKHVzdGF0cy5yY3ZfbWNhc3RfcGt0cyk7CisJcF9zdGF0cy0+cmN2X2JjYXN0X3BrdHMgPSBISUxPXzY0X1JFR1BBSVIodXN0YXRzLnJjdl9iY2FzdF9wa3RzKTsKK30KKworc3RhdGljIHZvaWQgX3FlZF9sbDJfZ2V0X3BzdGF0cyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQlzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJc3RydWN0IHFlZF9sbDJfaW5mbyAqcF9sbDJfY29ubiwKKwkJCQlzdHJ1Y3QgcWVkX2xsMl9zdGF0cyAqcF9zdGF0cykKK3sKKwlzdHJ1Y3QgY29yZV9sbDJfcHN0b3JtX3Blcl9xdWV1ZV9zdGF0IHBzdGF0czsKKwl1OCBzdGF0c19pZCA9IHBfbGwyX2Nvbm4tPnR4X3N0YXRzX2lkOworCXUzMiBwc3RhdHNfYWRkcjsKKworCW1lbXNldCgmcHN0YXRzLCAwLCBzaXplb2YocHN0YXRzKSk7CisJcHN0YXRzX2FkZHIgPSBCQVIwX01BUF9SRUdfUFNETV9SQU0gKworCQkgICAgICBDT1JFX0xMMl9QU1RPUk1fUEVSX1FVRVVFX1NUQVRfT0ZGU0VUKHN0YXRzX2lkKTsKKwlxZWRfbWVtY3B5X2Zyb20ocF9od2ZuLCBwX3B0dCwgJnBzdGF0cywgcHN0YXRzX2FkZHIsIHNpemVvZihwc3RhdHMpKTsKKworCXBfc3RhdHMtPnNlbnRfdWNhc3RfYnl0ZXMgPSBISUxPXzY0X1JFR1BBSVIocHN0YXRzLnNlbnRfdWNhc3RfYnl0ZXMpOworCXBfc3RhdHMtPnNlbnRfbWNhc3RfYnl0ZXMgPSBISUxPXzY0X1JFR1BBSVIocHN0YXRzLnNlbnRfbWNhc3RfYnl0ZXMpOworCXBfc3RhdHMtPnNlbnRfYmNhc3RfYnl0ZXMgPSBISUxPXzY0X1JFR1BBSVIocHN0YXRzLnNlbnRfYmNhc3RfYnl0ZXMpOworCXBfc3RhdHMtPnNlbnRfdWNhc3RfcGt0cyA9IEhJTE9fNjRfUkVHUEFJUihwc3RhdHMuc2VudF91Y2FzdF9wa3RzKTsKKwlwX3N0YXRzLT5zZW50X21jYXN0X3BrdHMgPSBISUxPXzY0X1JFR1BBSVIocHN0YXRzLnNlbnRfbWNhc3RfcGt0cyk7CisJcF9zdGF0cy0+c2VudF9iY2FzdF9wa3RzID0gSElMT182NF9SRUdQQUlSKHBzdGF0cy5zZW50X2JjYXN0X3BrdHMpOworfQorCitpbnQgcWVkX2xsMl9nZXRfc3RhdHMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCSAgICAgIHU4IGNvbm5lY3Rpb25faGFuZGxlLCBzdHJ1Y3QgcWVkX2xsMl9zdGF0cyAqcF9zdGF0cykKK3sKKwlzdHJ1Y3QgcWVkX2xsMl9pbmZvICpwX2xsMl9jb25uID0gTlVMTDsKKwlzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQ7CisKKwltZW1zZXQocF9zdGF0cywgMCwgc2l6ZW9mKCpwX3N0YXRzKSk7CisKKwlpZiAoKGNvbm5lY3Rpb25faGFuZGxlID49IFFFRF9NQVhfTlVNX09GX0xMMl9DT05ORUNUSU9OUykgfHwKKwkgICAgIXBfaHdmbi0+cF9sbDJfaW5mbykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwX2xsMl9jb25uID0gJnBfaHdmbi0+cF9sbDJfaW5mb1tjb25uZWN0aW9uX2hhbmRsZV07CisKKwlwX3B0dCA9IHFlZF9wdHRfYWNxdWlyZShwX2h3Zm4pOworCWlmICghcF9wdHQpIHsKKwkJRFBfRVJSKHBfaHdmbiwgIkZhaWxlZCB0byBhY3F1aXJlIHB0dFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCV9xZWRfbGwyX2dldF90c3RhdHMocF9od2ZuLCBwX3B0dCwgcF9sbDJfY29ubiwgcF9zdGF0cyk7CisJX3FlZF9sbDJfZ2V0X3VzdGF0cyhwX2h3Zm4sIHBfcHR0LCBwX2xsMl9jb25uLCBwX3N0YXRzKTsKKwlpZiAocF9sbDJfY29ubi0+dHhfc3RhdHNfZW4pCisJCV9xZWRfbGwyX2dldF9wc3RhdHMocF9od2ZuLCBwX3B0dCwgcF9sbDJfY29ubiwgcF9zdGF0cyk7CisKKwlxZWRfcHR0X3JlbGVhc2UocF9od2ZuLCBwX3B0dCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHFlZF9sbDJfcmVnaXN0ZXJfY2Jfb3BzKHN0cnVjdCBxZWRfZGV2ICpjZGV2LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgcWVkX2xsMl9jYl9vcHMgKm9wcywKKwkJCQkgICAgdm9pZCAqY29va2llKQoreworCWNkZXYtPmxsMi0+Y2JzID0gb3BzOworCWNkZXYtPmxsMi0+Y2JfY29va2llID0gY29va2llOworfQorCitzdGF0aWMgaW50IHFlZF9sbDJfc3RhcnQoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHN0cnVjdCBxZWRfbGwyX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBxZWRfbGwyX2luZm8gbGwyX2luZm87CisJc3RydWN0IHFlZF9sbDJfYnVmZmVyICpidWZmZXI7CisJZW51bSBxZWRfbGwyX2Nvbm5fdHlwZSBjb25uX3R5cGU7CisJc3RydWN0IHFlZF9wdHQgKnBfcHR0OworCWludCByYywgaTsKKworCS8qIEluaXRpYWxpemUgTEwyIGxvY2tzICYgbGlzdHMgKi8KKwlJTklUX0xJU1RfSEVBRCgmY2Rldi0+bGwyLT5saXN0KTsKKwlzcGluX2xvY2tfaW5pdCgmY2Rldi0+bGwyLT5sb2NrKTsKKwljZGV2LT5sbDItPnJ4X3NpemUgPSBORVRfU0tCX1BBRCArIEVUSF9ITEVOICsKKwkJCSAgICAgTDFfQ0FDSEVfQllURVMgKyBwYXJhbXMtPm10dTsKKwljZGV2LT5sbDItPmZyYWdzX21hcHBlZCA9IHBhcmFtcy0+ZnJhZ3NfbWFwcGVkOworCisJLypBbGxvY2F0ZSBtZW1vcnkgZm9yIExMMiAqLworCURQX0lORk8oY2RldiwgIkFsbG9jYXRpbmcgTEwyIGJ1ZmZlcnMgb2Ygc2l6ZSAlMDh4IGJ5dGVzXG4iLAorCQljZGV2LT5sbDItPnJ4X3NpemUpOworCWZvciAoaSA9IDA7IGkgPCBRRURfTEwyX1JYX1NJWkU7IGkrKykgeworCQlidWZmZXIgPSBremFsbG9jKHNpemVvZigqYnVmZmVyKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghYnVmZmVyKSB7CisJCQlEUF9JTkZPKGNkZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgTEwyIGJ1ZmZlcnNcbiIpOworCQkJZ290byBmYWlsOworCQl9CisKKwkJcmMgPSBxZWRfbGwyX2FsbG9jX2J1ZmZlcihjZGV2LCAodTggKiopJmJ1ZmZlci0+ZGF0YSwKKwkJCQkJICAmYnVmZmVyLT5waHlzX2FkZHIpOworCQlpZiAocmMpIHsKKwkJCWtmcmVlKGJ1ZmZlcik7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQlsaXN0X2FkZF90YWlsKCZidWZmZXItPmxpc3QsICZjZGV2LT5sbDItPmxpc3QpOworCX0KKworCXN3aXRjaCAoUUVEX0xFQURJTkdfSFdGTihjZGV2KS0+aHdfaW5mby5wZXJzb25hbGl0eSkgeworCWNhc2UgUUVEX1BDSV9JU0NTSToKKwkJY29ubl90eXBlID0gUUVEX0xMMl9UWVBFX0lTQ1NJOworCQlicmVhazsKKwljYXNlIFFFRF9QQ0lfRVRIX1JPQ0U6CisJCWNvbm5fdHlwZSA9IFFFRF9MTDJfVFlQRV9ST0NFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQljb25uX3R5cGUgPSBRRURfTEwyX1RZUEVfVEVTVDsKKwl9CisKKwkvKiBQcmVwYXJlIHRoZSB0ZW1wb3JhcnkgbGwyIGluZm9ybWF0aW9uICovCisJbWVtc2V0KCZsbDJfaW5mbywgMCwgc2l6ZW9mKGxsMl9pbmZvKSk7CisJbGwyX2luZm8uY29ubl90eXBlID0gY29ubl90eXBlOworCWxsMl9pbmZvLm10dSA9IHBhcmFtcy0+bXR1OworCWxsMl9pbmZvLnJ4X2Ryb3BfdHRsMF9mbGcgPSBwYXJhbXMtPmRyb3BfdHRsMF9wYWNrZXRzOworCWxsMl9pbmZvLnJ4X3ZsYW5fcmVtb3ZhbF9lbiA9IHBhcmFtcy0+cnhfdmxhbl9zdHJpcHBpbmc7CisJbGwyX2luZm8udHhfdGMgPSAwOworCWxsMl9pbmZvLnR4X2Rlc3QgPSBDT1JFX1RYX0RFU1RfTlc7CisJbGwyX2luZm8uZ3NpX2VuYWJsZSA9IDE7CisKKwlyYyA9IHFlZF9sbDJfYWNxdWlyZV9jb25uZWN0aW9uKFFFRF9MRUFESU5HX0hXRk4oY2RldiksICZsbDJfaW5mbywKKwkJCQkJUUVEX0xMMl9SWF9TSVpFLCBRRURfTEwyX1RYX1NJWkUsCisJCQkJCSZjZGV2LT5sbDItPmhhbmRsZSk7CisJaWYgKHJjKSB7CisJCURQX0lORk8oY2RldiwgIkZhaWxlZCB0byBhY3F1aXJlIExMMiBjb25uZWN0aW9uXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCXJjID0gcWVkX2xsMl9lc3RhYmxpc2hfY29ubmVjdGlvbihRRURfTEVBRElOR19IV0ZOKGNkZXYpLAorCQkJCQkgIGNkZXYtPmxsMi0+aGFuZGxlKTsKKwlpZiAocmMpIHsKKwkJRFBfSU5GTyhjZGV2LCAiRmFpbGVkIHRvIGVzdGFibGlzaCBMTDIgY29ubmVjdGlvblxuIik7CisJCWdvdG8gcmVsZWFzZV9mYWlsOworCX0KKworCS8qIFBvc3QgYWxsIFJ4IGJ1ZmZlcnMgdG8gRlcgKi8KKwlzcGluX2xvY2tfYmgoJmNkZXYtPmxsMi0+bG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShidWZmZXIsICZjZGV2LT5sbDItPmxpc3QsIGxpc3QpIHsKKwkJcmMgPSBxZWRfbGwyX3Bvc3RfcnhfYnVmZmVyKFFFRF9MRUFESU5HX0hXRk4oY2RldiksCisJCQkJCSAgICBjZGV2LT5sbDItPmhhbmRsZSwKKwkJCQkJICAgIGJ1ZmZlci0+cGh5c19hZGRyLCAwLCBidWZmZXIsIDEpOworCQlpZiAocmMpIHsKKwkJCURQX0lORk8oY2RldiwKKwkJCQkiRmFpbGVkIHRvIHBvc3QgYW4gUnggYnVmZmVyOyBEZWxldGluZyBpdFxuIik7CisJCQlkbWFfdW5tYXBfc2luZ2xlKCZjZGV2LT5wZGV2LT5kZXYsIGJ1ZmZlci0+cGh5c19hZGRyLAorCQkJCQkgY2Rldi0+bGwyLT5yeF9zaXplLCBETUFfRlJPTV9ERVZJQ0UpOworCQkJa2ZyZWUoYnVmZmVyLT5kYXRhKTsKKwkJCWxpc3RfZGVsKCZidWZmZXItPmxpc3QpOworCQkJa2ZyZWUoYnVmZmVyKTsKKwkJfSBlbHNlIHsKKwkJCWNkZXYtPmxsMi0+cnhfY250Kys7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfYmgoJmNkZXYtPmxsMi0+bG9jayk7CisKKwlpZiAoIWNkZXYtPmxsMi0+cnhfY250KSB7CisJCURQX0lORk8oY2RldiwgIkZhaWxlZCBwYXNzaW5nIGV2ZW4gYSBzaW5nbGUgUnggYnVmZmVyXG4iKTsKKwkJZ290byByZWxlYXNlX3Rlcm1pbmF0ZTsKKwl9CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIocGFyYW1zLT5sbDJfbWFjX2FkZHJlc3MpKSB7CisJCURQX0lORk8oY2RldiwgIkludmFsaWQgRXRoZXJuZXQgYWRkcmVzc1xuIik7CisJCWdvdG8gcmVsZWFzZV90ZXJtaW5hdGU7CisJfQorCisJcF9wdHQgPSBxZWRfcHR0X2FjcXVpcmUoUUVEX0xFQURJTkdfSFdGTihjZGV2KSk7CisJaWYgKCFwX3B0dCkgeworCQlEUF9JTkZPKGNkZXYsICJGYWlsZWQgdG8gYWNxdWlyZSBQVFRcbiIpOworCQlnb3RvIHJlbGVhc2VfdGVybWluYXRlOworCX0KKworCXJjID0gcWVkX2xsaF9hZGRfbWFjX2ZpbHRlcihRRURfTEVBRElOR19IV0ZOKGNkZXYpLCBwX3B0dCwKKwkJCQkgICAgcGFyYW1zLT5sbDJfbWFjX2FkZHJlc3MpOworCXFlZF9wdHRfcmVsZWFzZShRRURfTEVBRElOR19IV0ZOKGNkZXYpLCBwX3B0dCk7CisJaWYgKHJjKSB7CisJCURQX0VSUihjZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIExMSCBmaWx0ZXJcbiIpOworCQlnb3RvIHJlbGVhc2VfdGVybWluYXRlX2FsbDsKKwl9CisKKwlldGhlcl9hZGRyX2NvcHkoY2Rldi0+bGwyX21hY19hZGRyZXNzLCBwYXJhbXMtPmxsMl9tYWNfYWRkcmVzcyk7CisKKwlyZXR1cm4gMDsKKworcmVsZWFzZV90ZXJtaW5hdGVfYWxsOgorCityZWxlYXNlX3Rlcm1pbmF0ZToKKwlxZWRfbGwyX3Rlcm1pbmF0ZV9jb25uZWN0aW9uKFFFRF9MRUFESU5HX0hXRk4oY2RldiksIGNkZXYtPmxsMi0+aGFuZGxlKTsKK3JlbGVhc2VfZmFpbDoKKwlxZWRfbGwyX3JlbGVhc2VfY29ubmVjdGlvbihRRURfTEVBRElOR19IV0ZOKGNkZXYpLCBjZGV2LT5sbDItPmhhbmRsZSk7CitmYWlsOgorCXFlZF9sbDJfa2lsbF9idWZmZXJzKGNkZXYpOworCWNkZXYtPmxsMi0+aGFuZGxlID0gUUVEX0xMMl9VTlVTRURfSEFORExFOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHFlZF9sbDJfc3RvcChzdHJ1Y3QgcWVkX2RldiAqY2RldikKK3sKKwlzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQ7CisJaW50IHJjOworCisJaWYgKGNkZXYtPmxsMi0+aGFuZGxlID09IFFFRF9MTDJfVU5VU0VEX0hBTkRMRSkKKwkJcmV0dXJuIDA7CisKKwlwX3B0dCA9IHFlZF9wdHRfYWNxdWlyZShRRURfTEVBRElOR19IV0ZOKGNkZXYpKTsKKwlpZiAoIXBfcHR0KSB7CisJCURQX0lORk8oY2RldiwgIkZhaWxlZCB0byBhY3F1aXJlIFBUVFxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlxZWRfbGxoX3JlbW92ZV9tYWNfZmlsdGVyKFFFRF9MRUFESU5HX0hXRk4oY2RldiksIHBfcHR0LAorCQkJCSAgY2Rldi0+bGwyX21hY19hZGRyZXNzKTsKKwlxZWRfcHR0X3JlbGVhc2UoUUVEX0xFQURJTkdfSFdGTihjZGV2KSwgcF9wdHQpOworCWV0aF96ZXJvX2FkZHIoY2Rldi0+bGwyX21hY19hZGRyZXNzKTsKKworCXJjID0gcWVkX2xsMl90ZXJtaW5hdGVfY29ubmVjdGlvbihRRURfTEVBRElOR19IV0ZOKGNkZXYpLAorCQkJCQkgIGNkZXYtPmxsMi0+aGFuZGxlKTsKKwlpZiAocmMpCisJCURQX0lORk8oY2RldiwgIkZhaWxlZCB0byB0ZXJtaW5hdGUgTEwyIGNvbm5lY3Rpb25cbiIpOworCisJcWVkX2xsMl9raWxsX2J1ZmZlcnMoY2Rldik7CisKKwlxZWRfbGwyX3JlbGVhc2VfY29ubmVjdGlvbihRRURfTEVBRElOR19IV0ZOKGNkZXYpLCBjZGV2LT5sbDItPmhhbmRsZSk7CisJY2Rldi0+bGwyLT5oYW5kbGUgPSBRRURfTEwyX1VOVVNFRF9IQU5ETEU7CisKKwlyZXR1cm4gcmM7CitmYWlsOgorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHFlZF9sbDJfc3RhcnRfeG1pdChzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwljb25zdCBza2JfZnJhZ190ICpmcmFnOworCWludCByYyA9IC1FSU5WQUwsIGk7CisJZG1hX2FkZHJfdCBtYXBwaW5nOworCXUxNiB2bGFuID0gMDsKKwl1OCBmbGFncyA9IDA7CisKKwlpZiAodW5saWtlbHkoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fTk9ORSkpIHsKKwkJRFBfSU5GTyhjZGV2LCAiQ2Fubm90IHRyYW5zbWl0IGEgY2hlY2tzdW1lZCBwYWNrZXRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoMSArIHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPiBDT1JFX0xMMl9UWF9NQVhfQkRTX1BFUl9QQUNLRVQpIHsKKwkJRFBfRVJSKGNkZXYsICJDYW5ub3QgdHJhbnNtaXQgYSBwYWNrZXQgd2l0aCAlZCBmcmFnbWVudHNcbiIsCisJCSAgICAgICAxICsgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1hcHBpbmcgPSBkbWFfbWFwX3NpbmdsZSgmY2Rldi0+cGRldi0+ZGV2LCBza2ItPmRhdGEsCisJCQkJIHNrYi0+bGVuLCBETUFfVE9fREVWSUNFKTsKKwlpZiAodW5saWtlbHkoZG1hX21hcHBpbmdfZXJyb3IoJmNkZXYtPnBkZXYtPmRldiwgbWFwcGluZykpKSB7CisJCURQX05PVElDRShjZGV2LCAiU0tCIG1hcHBpbmcgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogUmVxdWVzdCBIVyB0byBjYWxjdWxhdGUgSVAgY3N1bSAqLworCWlmICghKCh2bGFuX2dldF9wcm90b2NvbChza2IpID09IGh0b25zKEVUSF9QX0lQVjYpKSAmJgorCSAgICAgIGlwdjZfaGRyKHNrYiktPm5leHRoZHIgPT0gTkVYVEhEUl9JUFY2KSkKKwkJZmxhZ3MgfD0gQklUKENPUkVfVFhfQkRfRkxBR1NfSVBfQ1NVTV9TSElGVCk7CisKKwlpZiAoc2tiX3ZsYW5fdGFnX3ByZXNlbnQoc2tiKSkgeworCQl2bGFuID0gc2tiX3ZsYW5fdGFnX2dldChza2IpOworCQlmbGFncyB8PSBCSVQoQ09SRV9UWF9CRF9GTEFHU19WTEFOX0lOU0VSVElPTl9TSElGVCk7CisJfQorCisJcmMgPSBxZWRfbGwyX3ByZXBhcmVfdHhfcGFja2V0KFFFRF9MRUFESU5HX0hXRk4oY2RldiksCisJCQkJICAgICAgIGNkZXYtPmxsMi0+aGFuZGxlLAorCQkJCSAgICAgICAxICsgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncywKKwkJCQkgICAgICAgdmxhbiwgZmxhZ3MsIDAsIDAgLyogUm9DRSBGTEFWT1IgKi8sCisJCQkJICAgICAgIG1hcHBpbmcsIHNrYi0+bGVuLCBza2IsIDEpOworCWlmIChyYykKKwkJZ290byBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaSsrKSB7CisJCWZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKKwkJaWYgKCFjZGV2LT5sbDItPmZyYWdzX21hcHBlZCkgeworCQkJbWFwcGluZyA9IHNrYl9mcmFnX2RtYV9tYXAoJmNkZXYtPnBkZXYtPmRldiwgZnJhZywgMCwKKwkJCQkJCSAgIHNrYl9mcmFnX3NpemUoZnJhZyksCisJCQkJCQkgICBETUFfVE9fREVWSUNFKTsKKworCQkJaWYgKHVubGlrZWx5KGRtYV9tYXBwaW5nX2Vycm9yKCZjZGV2LT5wZGV2LT5kZXYsCisJCQkJCQkgICAgICAgbWFwcGluZykpKSB7CisJCQkJRFBfTk9USUNFKGNkZXYsCisJCQkJCSAgIlVuYWJsZSB0byBtYXAgZnJhZyAtIGRyb3BwaW5nIHBhY2tldFxuIik7CisJCQkJZ290byBlcnI7CisJCQl9CisJCX0gZWxzZSB7CisJCQltYXBwaW5nID0gcGFnZV90b19waHlzKHNrYl9mcmFnX3BhZ2UoZnJhZykpIHwKKwkJCSAgICBmcmFnLT5wYWdlX29mZnNldDsKKwkJfQorCisJCXJjID0gcWVkX2xsMl9zZXRfZnJhZ21lbnRfb2ZfdHhfcGFja2V0KFFFRF9MRUFESU5HX0hXRk4oY2RldiksCisJCQkJCQkgICAgICAgY2Rldi0+bGwyLT5oYW5kbGUsCisJCQkJCQkgICAgICAgbWFwcGluZywKKwkJCQkJCSAgICAgICBza2JfZnJhZ19zaXplKGZyYWcpKTsKKworCQkvKiBpZiBmYWlsZWQgbm90IG11Y2ggdG8gZG8gaGVyZSwgcGFydGlhbCBwYWNrZXQgaGFzIGJlZW4gcG9zdGVkCisJCSAqIHdlIGNhbid0IGZyZWUgbWVtb3J5LCB3aWxsIG5lZWQgdG8gd2FpdCBmb3IgY29tcGxldGlvbi4KKwkJICovCisJCWlmIChyYykKKwkJCWdvdG8gZXJyMjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyOgorCWRtYV91bm1hcF9zaW5nbGUoJmNkZXYtPnBkZXYtPmRldiwgbWFwcGluZywgc2tiLT5sZW4sIERNQV9UT19ERVZJQ0UpOworCitlcnIyOgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBxZWRfbGwyX3N0YXRzKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCBzdHJ1Y3QgcWVkX2xsMl9zdGF0cyAqc3RhdHMpCit7CisJaWYgKCFjZGV2LT5sbDIpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHFlZF9sbDJfZ2V0X3N0YXRzKFFFRF9MRUFESU5HX0hXRk4oY2RldiksCisJCQkJIGNkZXYtPmxsMi0+aGFuZGxlLCBzdGF0cyk7Cit9CisKK2NvbnN0IHN0cnVjdCBxZWRfbGwyX29wcyBxZWRfbGwyX29wc19wYXNzID0geworCS5zdGFydCA9ICZxZWRfbGwyX3N0YXJ0LAorCS5zdG9wID0gJnFlZF9sbDJfc3RvcCwKKwkuc3RhcnRfeG1pdCA9ICZxZWRfbGwyX3N0YXJ0X3htaXQsCisJLnJlZ2lzdGVyX2NiX29wcyA9ICZxZWRfbGwyX3JlZ2lzdGVyX2NiX29wcywKKwkuZ2V0X3N0YXRzID0gJnFlZF9sbDJfc3RhdHMsCit9OworCitpbnQgcWVkX2xsMl9hbGxvY19pZihzdHJ1Y3QgcWVkX2RldiAqY2RldikKK3sKKwljZGV2LT5sbDIgPSBremFsbG9jKHNpemVvZigqY2Rldi0+bGwyKSwgR0ZQX0tFUk5FTCk7CisJcmV0dXJuIGNkZXYtPmxsMiA/IDAgOiAtRU5PTUVNOworfQorCit2b2lkIHFlZF9sbDJfZGVhbGxvY19pZihzdHJ1Y3QgcWVkX2RldiAqY2RldikKK3sKKwlrZnJlZShjZGV2LT5sbDIpOworCWNkZXYtPmxsMiA9IE5VTEw7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9sbDIuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2xsMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYTVkYzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9sbDIuaApAQCAtMCwwICsxLDMxNiBAQAorLyogUUxvZ2ljIHFlZCBOSUMgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE1IFFMb2dpYyBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YKKyAqIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2lmbmRlZiBfUUVEX0xMMl9ICisjZGVmaW5lIF9RRURfTEwyX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcWVkL3FlZF9jaGFpbi5oPgorI2luY2x1ZGUgPGxpbnV4L3FlZC9xZWRfbGwyX2lmLmg+CisjaW5jbHVkZSAicWVkLmgiCisjaW5jbHVkZSAicWVkX2hzaS5oIgorI2luY2x1ZGUgInFlZF9zcC5oIgorCisjZGVmaW5lIFFFRF9NQVhfTlVNX09GX0xMMl9DT05ORUNUSU9OUyAgICAgICAgICAgICAgICAgICAgKDQpCisKK2VudW0gcWVkX2xsMl9yb2NlX2ZsYXZvcl90eXBlIHsKKwlRRURfTEwyX1JPQ0UsCisJUUVEX0xMMl9SUk9DRSwKKwlNQVhfUUVEX0xMMl9ST0NFX0ZMQVZPUl9UWVBFCit9OworCitlbnVtIHFlZF9sbDJfY29ubl90eXBlIHsKKwlRRURfTEwyX1RZUEVfUkVTRVJWRUQsCisJUUVEX0xMMl9UWVBFX0lTQ1NJLAorCVFFRF9MTDJfVFlQRV9URVNULAorCVFFRF9MTDJfVFlQRV9JU0NTSV9PT08sCisJUUVEX0xMMl9UWVBFX1JFU0VSVkVEMiwKKwlRRURfTEwyX1RZUEVfUk9DRSwKKwlRRURfTEwyX1RZUEVfUkVTRVJWRUQzLAorCU1BWF9RRURfTEwyX1JYX0NPTk5fVFlQRQorfTsKKworc3RydWN0IHFlZF9sbDJfcnhfcGFja2V0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3RfZW50cnk7CisJc3RydWN0IGNvcmVfcnhfYmRfd2l0aF9idWZmX2xlbiAqcnhxX2JkOworCWRtYV9hZGRyX3QgcnhfYnVmX2FkZHI7CisJdTE2IGJ1Zl9sZW5ndGg7CisJdm9pZCAqY29va2llOworCXU4IHBsYWNlbWVudF9vZmZzZXQ7CisJdTE2IHBhcnNlX2ZsYWdzOworCXUxNiBwYWNrZXRfbGVuZ3RoOworCXUxNiB2bGFuOworCXUzMiBvcGFxdWVfZGF0YVsyXTsKK307CisKK3N0cnVjdCBxZWRfbGwyX3R4X3BhY2tldCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0X2VudHJ5OworCXUxNiBiZF91c2VkOworCXUxNiB2bGFuOworCXUxNiBsNF9oZHJfb2Zmc2V0X3c7CisJdTggYmRfZmxhZ3M7CisJYm9vbCBub3RpZnlfZnc7CisJdm9pZCAqY29va2llOworCisJc3RydWN0IHsKKwkJc3RydWN0IGNvcmVfdHhfYmQgKnR4cV9iZDsKKwkJZG1hX2FkZHJfdCB0eF9mcmFnOworCQl1MTYgZnJhZ19sZW47CisJfSBiZHNfc2V0W0VUSF9UWF9NQVhfQkRTX1BFUl9OT05fTFNPX1BBQ0tFVF07Cit9OworCitzdHJ1Y3QgcWVkX2xsMl9yeF9xdWV1ZSB7CisJLyogTG9jayBwcm90ZWN0aW5nIHRoZSBSeCBxdWV1ZSBtYW5pcHVsYXRpb24gKi8KKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IHFlZF9jaGFpbiByeHFfY2hhaW47CisJc3RydWN0IHFlZF9jaGFpbiByY3FfY2hhaW47CisJdTggcnhfc2JfaW5kZXg7CisJYm9vbCBiX2NiX3JlZ2lzdHJlZDsKKwlfX2xlMTYgKnBfZndfY29uczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGFjdGl2ZV9kZXNjcTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfZGVzY3E7CisJc3RydWN0IGxpc3RfaGVhZCBwb3N0aW5nX2Rlc2NxOworCXN0cnVjdCBxZWRfbGwyX3J4X3BhY2tldCAqZGVzY3FfYXJyYXk7CisJdm9pZCBfX2lvbWVtICpzZXRfcHJvZF9hZGRyOworfTsKKworc3RydWN0IHFlZF9sbDJfdHhfcXVldWUgeworCS8qIExvY2sgcHJvdGVjdGluZyB0aGUgVHggcXVldWUgbWFuaXB1bGF0aW9uICovCisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCBxZWRfY2hhaW4gdHhxX2NoYWluOworCXU4IHR4X3NiX2luZGV4OworCWJvb2wgYl9jYl9yZWdpc3RyZWQ7CisJX19sZTE2ICpwX2Z3X2NvbnM7CisJc3RydWN0IGxpc3RfaGVhZCBhY3RpdmVfZGVzY3E7CisJc3RydWN0IGxpc3RfaGVhZCBmcmVlX2Rlc2NxOworCXN0cnVjdCBsaXN0X2hlYWQgc2VuZGluZ19kZXNjcTsKKwlzdHJ1Y3QgcWVkX2xsMl90eF9wYWNrZXQgKmRlc2NxX2FycmF5OworCXN0cnVjdCBxZWRfbGwyX3R4X3BhY2tldCAqY3VyX3NlbmRfcGFja2V0OworCXN0cnVjdCBxZWRfbGwyX3R4X3BhY2tldCBjdXJfY29tcGxldGluZ19wYWNrZXQ7CisJdTE2IGN1cl9jb21wbGV0aW5nX2JkX2lkeDsKKwl2b2lkIF9faW9tZW0gKmRvb3JiZWxsX2FkZHI7CisJdTE2IGJkc19pZHg7CisJdTE2IGN1cl9zZW5kX2ZyYWdfbnVtOworCXUxNiBjdXJfY29tcGxldGluZ19mcmFnX251bTsKKwlib29sIGJfY29tcGxldGluZ19wYWNrZXQ7Cit9OworCitzdHJ1Y3QgcWVkX2xsMl9pbmZvIHsKKwkvKiBMb2NrIHByb3RlY3RpbmcgdGhlIHN0YXRlIG9mIExMMiAqLworCXN0cnVjdCBtdXRleCBtdXRleDsKKwllbnVtIHFlZF9sbDJfY29ubl90eXBlIGNvbm5fdHlwZTsKKwl1MzIgY2lkOworCXU4IG15X2lkOworCXU4IHF1ZXVlX2lkOworCXU4IHR4X3N0YXRzX2lkOworCWJvb2wgYl9hY3RpdmU7CisJdTE2IG10dTsKKwl1OCByeF9kcm9wX3R0bDBfZmxnOworCXU4IHJ4X3ZsYW5fcmVtb3ZhbF9lbjsKKwl1OCB0eF90YzsKKwllbnVtIGNvcmVfdHhfZGVzdCB0eF9kZXN0OworCWVudW0gY29yZV9lcnJvcl9oYW5kbGUgYWlfZXJyX3BhY2tldF90b29fYmlnOworCWVudW0gY29yZV9lcnJvcl9oYW5kbGUgYWlfZXJyX25vX2J1ZjsKKwl1OCB0eF9zdGF0c19lbjsKKwlzdHJ1Y3QgcWVkX2xsMl9yeF9xdWV1ZSByeF9xdWV1ZTsKKwlzdHJ1Y3QgcWVkX2xsMl90eF9xdWV1ZSB0eF9xdWV1ZTsKKwl1OCBnc2lfZW5hYmxlOworfTsKKworLyoqCisgKiBAYnJpZWYgcWVkX2xsMl9hY3F1aXJlX2Nvbm5lY3Rpb24gLSBhbGxvY2F0ZSByZXNvdXJjZXMsCisgKiAgICAgICAgc3RhcnRzIHJ4ICYgdHggKGlmIHJlbGV2YW50KSBxdWV1ZXMgcGFpci4gUHJvdmlkZXMKKyAqICAgICAgICBjb25uZWNpb24gaGFuZGxlciBhcyBvdXRwdXQgcGFyYW1ldGVyLgorICoKKyAqIEBwYXJhbSBwX2h3Zm4KKyAqIEBwYXJhbSBwX3BhcmFtcwkJQ29udGFpbiB2YXJpb3VzIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcworICogQHBhcmFtIHJ4X251bV9kZXNjCisgKiBAcGFyYW0gdHhfbnVtX2Rlc2MKKyAqCisgKiBAcGFyYW0gcF9jb25uZWN0aW9uX2hhbmRsZSAgT3V0cHV0IGNvbnRhaW5lciBmb3IgTEwyIGNvbm5lY3Rpb24ncyBoYW5kbGUKKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgZmFpbHVyZSBvdGhlcndpc2UKKyAqLworaW50IHFlZF9sbDJfYWNxdWlyZV9jb25uZWN0aW9uKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgICAgIHN0cnVjdCBxZWRfbGwyX2luZm8gKnBfcGFyYW1zLAorCQkJICAgICAgIHUxNiByeF9udW1fZGVzYywKKwkJCSAgICAgICB1MTYgdHhfbnVtX2Rlc2MsCisJCQkgICAgICAgdTggKnBfY29ubmVjdGlvbl9oYW5kbGUpOworCisvKioKKyAqIEBicmllZiBxZWRfbGwyX2VzdGFibGlzaF9jb25uZWN0aW9uIC0gc3RhcnQgcHJldmlvdXNseQorICogICAgICAgIGFsbG9jYXRlZCBMTDIgcXVldWVzIHBhaXIKKyAqCisgKiBAcGFyYW0gcF9od2ZuCisgKiBAcGFyYW0gcF9wdHQKKyAqIEBwYXJhbSBjb25uZWN0aW9uX2hhbmRsZQlMTDIgY29ubmVjdGlvbidzIGhhbmRsZSBvYnRhaW5lZCBmcm9tCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFlZF9sbDJfcmVxdWlyZV9jb25uZWN0aW9uCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIGZhaWx1cmUgb3RoZXJ3aXNlCisgKi8KK2ludCBxZWRfbGwyX2VzdGFibGlzaF9jb25uZWN0aW9uKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCB1OCBjb25uZWN0aW9uX2hhbmRsZSk7CisKKy8qKgorICogQGJyaWVmIHFlZF9sbDJfcG9zdF9yeF9idWZmZXJzIC0gc3VibWl0IGJ1ZmZlcnMgdG8gTEwyIFJ4IHF1ZXVlLgorICoKKyAqIEBwYXJhbSBwX2h3Zm4KKyAqIEBwYXJhbSBjb25uZWN0aW9uX2hhbmRsZQlMTDIgY29ubmVjdGlvbidzIGhhbmRsZSBvYnRhaW5lZCBmcm9tCisgKgkJCQlxZWRfbGwyX3JlcXVpcmVfY29ubmVjdGlvbgorICogQHBhcmFtIGFkZHIJCQlyeCAocGh5c2ljYWwgYWRkcmVzcykgYnVmZmVycyB0byBzdWJtaXQKKyAqIEBwYXJhbSBjb29raWUKKyAqIEBwYXJhbSBub3RpZnlfZncJCXByb2R1Y2UgY29ycmVzcG9uZGluZyBSeCBCRCBpbW1lZGlhdGVseQorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBmYWlsdXJlIG90aGVyd2lzZQorICovCitpbnQgcWVkX2xsMl9wb3N0X3J4X2J1ZmZlcihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgIHU4IGNvbm5lY3Rpb25faGFuZGxlLAorCQkJICAgZG1hX2FkZHJfdCBhZGRyLAorCQkJICAgdTE2IGJ1Zl9sZW4sIHZvaWQgKmNvb2tpZSwgdTggbm90aWZ5X2Z3KTsKKworLyoqCisgKiBAYnJpZWYgcWVkX2xsMl9wcmVwYXJlX3R4X3BhY2tldCAtIHJlcXVlc3QgZm9yIHN0YXJ0IFR4IEJECisgKgkJCQkgICAgICB0byBwcmVwYXJlIFR4IHBhY2tldCBzdWJtaXNzaW9uIHRvIEZXLgorICoKKyAqIEBwYXJhbSBwX2h3Zm4KKyAqIEBwYXJhbSBjb25uZWN0aW9uX2hhbmRsZQlMTDIgY29ubmVjdGlvbidzIGhhbmRsZSBvYnRhaW5lZCBmcm9tCisgKgkJCQlxZWRfbGwyX3JlcXVpcmVfY29ubmVjdGlvbgorICogQHBhcmFtIG51bV9vZl9iZHMJCWEgbnVtYmVyIG9mIHJlcXVlc3RlZCBCRCBlcXVhbHMgYSBudW1iZXIgb2YKKyAqCQkJCWZyYWdtZW50cyBpbiBUeCBwYWNrZXQKKyAqIEBwYXJhbSB2bGFuCQkJVkxBTiB0byBpbnNlcnQgdG8gcGFja2V0IChpZiBpbnNlcnRpb24gc2V0KQorICogQHBhcmFtIGJkX2ZsYWdzCisgKiBAcGFyYW0gbDRfaGRyX29mZnNldF93CUw0IEhlYWRlciBPZmZzZXQgZnJvbSBzdGFydCBvZiBwYWNrZXQKKyAqCQkJCShpbiB3b3JkcykuIFRoaXMgaXMgbmVlZGVkIGlmIGJvdGggbDRfY3N1bQorICoJCQkJYW5kIGlwdjZfZXh0IGFyZSBzZXQKKyAqIEBwYXJhbSBmaXJzdF9mcmFnCisgKiBAcGFyYW0gZmlyc3RfZnJhZ19sZW4KKyAqIEBwYXJhbSBjb29raWUKKyAqCisgKiBAcGFyYW0gbm90aWZ5X2Z3CisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIGZhaWx1cmUgb3RoZXJ3aXNlCisgKi8KK2ludCBxZWRfbGwyX3ByZXBhcmVfdHhfcGFja2V0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgICAgdTggY29ubmVjdGlvbl9oYW5kbGUsCisJCQkgICAgICB1OCBudW1fb2ZfYmRzLAorCQkJICAgICAgdTE2IHZsYW4sCisJCQkgICAgICB1OCBiZF9mbGFncywKKwkJCSAgICAgIHUxNiBsNF9oZHJfb2Zmc2V0X3csCisJCQkgICAgICBlbnVtIHFlZF9sbDJfcm9jZV9mbGF2b3JfdHlwZSBxZWRfcm9jZV9mbGF2b3IsCisJCQkgICAgICBkbWFfYWRkcl90IGZpcnN0X2ZyYWcsCisJCQkgICAgICB1MTYgZmlyc3RfZnJhZ19sZW4sIHZvaWQgKmNvb2tpZSwgdTggbm90aWZ5X2Z3KTsKKworLyoqCisgKiBAYnJpZWYgcWVkX2xsMl9yZWxlYXNlX2Nvbm5lY3Rpb24gLQlyZWxlYXNlcyByZXNvdXJjZXMKKyAqCQkJCQlhbGxvY2F0ZWQgZm9yIExMMiBjb25uZWN0aW9uCisgKgorICogQHBhcmFtIHBfaHdmbgorICogQHBhcmFtIGNvbm5lY3Rpb25faGFuZGxlCQlMTDIgY29ubmVjdGlvbidzIGhhbmRsZSBvYnRhaW5lZCBmcm9tCisgKgkJCQkJcWVkX2xsMl9yZXF1aXJlX2Nvbm5lY3Rpb24KKyAqLwordm9pZCBxZWRfbGwyX3JlbGVhc2VfY29ubmVjdGlvbihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgdTggY29ubmVjdGlvbl9oYW5kbGUpOworCisvKioKKyAqIEBicmllZiBxZWRfbGwyX3NldF9mcmFnbWVudF9vZl90eF9wYWNrZXQgLQlwcm92aWRlcyBmcmFnbWVudHMgdG8gZmlsbAorICoJCQkJCQlUeCBCRCBvZiBCRHMgcmVxdWVzdGVkIGJ5CisgKgkJCQkJCXFlZF9sbDJfcHJlcGFyZV90eF9wYWNrZXQKKyAqCisgKiBAcGFyYW0gcF9od2ZuCisgKiBAcGFyYW0gY29ubmVjdGlvbl9oYW5kbGUJCQlMTDIgY29ubmVjdGlvbidzIGhhbmRsZQorICoJCQkJCQlvYnRhaW5lZCBmcm9tCisgKgkJCQkJCXFlZF9sbDJfcmVxdWlyZV9jb25uZWN0aW9uCisgKiBAcGFyYW0gYWRkcgorICogQHBhcmFtIG5ieXRlcworICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBmYWlsdXJlIG90aGVyd2lzZQorICovCitpbnQgcWVkX2xsMl9zZXRfZnJhZ21lbnRfb2ZfdHhfcGFja2V0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICAgIHU4IGNvbm5lY3Rpb25faGFuZGxlLAorCQkJCSAgICAgIGRtYV9hZGRyX3QgYWRkciwgdTE2IG5ieXRlcyk7CisKKy8qKgorICogQGJyaWVmIHFlZF9sbDJfdGVybWluYXRlX2Nvbm5lY3Rpb24gLQlzdG9wcyBUeC9SeCBxdWV1ZXMKKyAqCisgKgorICogQHBhcmFtIHBfaHdmbgorICogQHBhcmFtIGNvbm5lY3Rpb25faGFuZGxlCQkJTEwyIGNvbm5lY3Rpb24ncyBoYW5kbGUKKyAqCQkJCQkJb2J0YWluZWQgZnJvbQorICoJCQkJCQlxZWRfbGwyX3JlcXVpcmVfY29ubmVjdGlvbgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBmYWlsdXJlIG90aGVyd2lzZQorICovCitpbnQgcWVkX2xsMl90ZXJtaW5hdGVfY29ubmVjdGlvbihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgdTggY29ubmVjdGlvbl9oYW5kbGUpOworCisvKioKKyAqIEBicmllZiBxZWRfbGwyX2dldF9zdGF0cyAtCWdldCBMTDIgcXVldWUncyBzdGF0aXN0aWNzCisgKgorICoKKyAqIEBwYXJhbSBwX2h3Zm4KKyAqIEBwYXJhbSBjb25uZWN0aW9uX2hhbmRsZQlMTDIgY29ubmVjdGlvbidzIGhhbmRsZSBvYnRhaW5lZCBmcm9tCisgKgkJCQlxZWRfbGwyX3JlcXVpcmVfY29ubmVjdGlvbgorICogQHBhcmFtIHBfc3RhdHMKKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgZmFpbHVyZSBvdGhlcndpc2UKKyAqLworaW50IHFlZF9sbDJfZ2V0X3N0YXRzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkgICAgICB1OCBjb25uZWN0aW9uX2hhbmRsZSwgc3RydWN0IHFlZF9sbDJfc3RhdHMgKnBfc3RhdHMpOworCisvKioKKyAqIEBicmllZiBxZWRfbGwyX2FsbG9jIC0gQWxsb2NhdGVzIExMMiBjb25uZWN0aW9ucyBzZXQKKyAqCisgKiBAcGFyYW0gcF9od2ZuCisgKgorICogQHJldHVybiBwb2ludGVyIHRvIGFsb2NhdGVkIHFlZF9sbDJfaW5mbyBvciBOVUxMCisgKi8KK3N0cnVjdCBxZWRfbGwyX2luZm8gKnFlZF9sbDJfYWxsb2Moc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4pOworCisvKioKKyAqIEBicmllZiBxZWRfbGwyX3NldHVwIC0gSW5pdHMgTEwyIGNvbm5lY3Rpb25zIHNldAorICoKKyAqIEBwYXJhbSBwX2h3Zm4KKyAqIEBwYXJhbSBwX2xsMl9jb25uZWN0aW9ucworICoKKyAqLwordm9pZCBxZWRfbGwyX3NldHVwKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkgICBzdHJ1Y3QgcWVkX2xsMl9pbmZvICpwX2xsMl9jb25uZWN0aW9ucyk7CisKKy8qKgorICogQGJyaWVmIHFlZF9sbDJfZnJlZSAtIFJlbGVhc2VzIExMMiBjb25uZWN0aW9ucyBzZXQKKyAqCisgKiBAcGFyYW0gcF9od2ZuCisgKiBAcGFyYW0gcF9sbDJfY29ubmVjdGlvbnMKKyAqCisgKi8KK3ZvaWQgcWVkX2xsMl9mcmVlKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkgIHN0cnVjdCBxZWRfbGwyX2luZm8gKnBfbGwyX2Nvbm5lY3Rpb25zKTsKK3ZvaWQgcWVkX2xsMmJfY29tcGxldGVfcnhfZ3NpX3BhY2tldChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgIHU4IGNvbm5lY3Rpb25faGFuZGxlLAorCQkJCSAgICAgdm9pZCAqY29va2llLAorCQkJCSAgICAgZG1hX2FkZHJfdCByeF9idWZfYWRkciwKKwkJCQkgICAgIHUxNiBkYXRhX2xlbmd0aCwKKwkJCQkgICAgIHU4IGRhdGFfbGVuZ3RoX2Vycm9yLAorCQkJCSAgICAgdTE2IHBhcnNlX2ZsYWdzLAorCQkJCSAgICAgdTE2IHZsYW4sCisJCQkJICAgICB1MzIgc3JjX21hY19hZGRyX2hpLAorCQkJCSAgICAgdTE2IHNyY19tYWNfYWRkcl9sbywgYm9vbCBiX2xhc3RfcGFja2V0KTsKK3ZvaWQgcWVkX2xsMmJfY29tcGxldGVfdHhfZ3NpX3BhY2tldChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgIHU4IGNvbm5lY3Rpb25faGFuZGxlLAorCQkJCSAgICAgdm9pZCAqY29va2llLAorCQkJCSAgICAgZG1hX2FkZHJfdCBmaXJzdF9mcmFnX2FkZHIsCisJCQkJICAgICBib29sIGJfbGFzdF9mcmFnbWVudCwgYm9vbCBiX2xhc3RfcGFja2V0KTsKK3ZvaWQgcWVkX2xsMmJfcmVsZWFzZV90eF9nc2lfcGFja2V0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICB1OCBjb25uZWN0aW9uX2hhbmRsZSwKKwkJCQkgICAgdm9pZCAqY29va2llLAorCQkJCSAgICBkbWFfYWRkcl90IGZpcnN0X2ZyYWdfYWRkciwKKwkJCQkgICAgYm9vbCBiX2xhc3RfZnJhZ21lbnQsIGJvb2wgYl9sYXN0X3BhY2tldCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX21haW4uYwppbmRleCBjN2RjMzRiLi40ZWUzMTUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfbWFpbi5jCkBAIC0yMiwxNSArMjIsMjIgQEAKICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9xZWQvcWVkX2lmLmg+CisjaW5jbHVkZSA8bGludXgvcWVkL3FlZF9sbDJfaWYuaD4KIAogI2luY2x1ZGUgInFlZC5oIgogI2luY2x1ZGUgInFlZF9zcmlvdi5oIgogI2luY2x1ZGUgInFlZF9zcC5oIgogI2luY2x1ZGUgInFlZF9kZXZfYXBpLmgiCisjaW5jbHVkZSAicWVkX2xsMi5oIgogI2luY2x1ZGUgInFlZF9tY3AuaCIKICNpbmNsdWRlICJxZWRfaHcuaCIKICNpbmNsdWRlICJxZWRfc2VsZnRlc3QuaCIKIAorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lORklOSUJBTkRfUUVEUikKKyNkZWZpbmUgUUVEX1JPQ0VfUVBTCQkJKDgxOTIpCisjZGVmaW5lIFFFRF9ST0NFX0RQSVMJCQkoOCkKKyNlbmRpZgorCiBzdGF0aWMgY2hhciB2ZXJzaW9uW10gPQogCSJRTG9naWMgRmFzdExpblEgNHh4eHggQ29yZSBNb2R1bGUgcWVkICIgRFJWX01PRFVMRV9WRVJTSU9OICJcbiI7CiAKQEAgLTUxLDggKzU4LDYgQEAKIAogc3RhdGljIGludCBfX2luaXQgcWVkX2luaXQodm9pZCkKIHsKLQlwcl9ub3RpY2UoInFlZF9pbml0IGNhbGxlZFxuIik7Ci0KIAlwcl9pbmZvKCIlcyIsIHZlcnNpb24pOwogCiAJcmV0dXJuIDA7CkBAIC0xMDYsOCArMTExLDcgQEAKIC8qIFBlcmZvcm1zIFBDSSBpbml0aWFsaXphdGlvbnMgYXMgd2VsbCBhcyBpbml0aWFsaXppbmcgUENJLXJlbGF0ZWQgcGFyYW1ldGVycwogICogaW4gdGhlIGRldmljZSBzdHJ1Y3RydWUuIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MuCiAgKi8KLXN0YXRpYyBpbnQgcWVkX2luaXRfcGNpKHN0cnVjdCBxZWRfZGV2ICpjZGV2LAotCQkJc3RydWN0IHBjaV9kZXYgKnBkZXYpCitzdGF0aWMgaW50IHFlZF9pbml0X3BjaShzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJdTggcmV2X2lkOwogCWludCByYzsKQEAgLTIwNyw4ICsyMTEsOCBAQAogCWRldl9pbmZvLT5wY2lfbWVtX3N0YXJ0ID0gY2Rldi0+cGNpX3BhcmFtcy5tZW1fc3RhcnQ7CiAJZGV2X2luZm8tPnBjaV9tZW1fZW5kID0gY2Rldi0+cGNpX3BhcmFtcy5tZW1fZW5kOwogCWRldl9pbmZvLT5wY2lfaXJxID0gY2Rldi0+cGNpX3BhcmFtcy5pcnE7Ci0JZGV2X2luZm8tPnJkbWFfc3VwcG9ydGVkID0KLQkgICAgKGNkZXYtPmh3Zm5zWzBdLmh3X2luZm8ucGVyc29uYWxpdHkgPT0gUUVEX1BDSV9FVEhfUk9DRSk7CisJZGV2X2luZm8tPnJkbWFfc3VwcG9ydGVkID0gKGNkZXYtPmh3Zm5zWzBdLmh3X2luZm8ucGVyc29uYWxpdHkgPT0KKwkJCQkgICAgUUVEX1BDSV9FVEhfUk9DRSk7CiAJZGV2X2luZm8tPmlzX21mX2RlZmF1bHQgPSBJU19NRl9ERUZBVUxUKCZjZGV2LT5od2Zuc1swXSk7CiAJZXRoZXJfYWRkcl9jb3B5KGRldl9pbmZvLT5od19tYWMsIGNkZXYtPmh3Zm5zWzBdLmh3X2luZm8uaHdfbWFjX2FkZHIpOwogCkBAIC0yNjMsOCArMjY3LDcgQEAKIH0KIAogLyogU2V0cyB0aGUgcmVxdWVzdGVkIHBvd2VyIHN0YXRlICovCi1zdGF0aWMgaW50IHFlZF9zZXRfcG93ZXJfc3RhdGUoc3RydWN0IHFlZF9kZXYgKmNkZXYsCi0JCQkgICAgICAgcGNpX3Bvd2VyX3Qgc3RhdGUpCitzdGF0aWMgaW50IHFlZF9zZXRfcG93ZXJfc3RhdGUoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHBjaV9wb3dlcl90IHN0YXRlKQogewogCWlmICghY2RldikKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0zNjYsOCArMzY5LDggQEAKIAkJRFBfTk9USUNFKGNkZXYsCiAJCQkgICJUcnlpbmcgdG8gZW5hYmxlIE1TSS1YIHdpdGggbGVzcyB2ZWN0b3JzICglZCBvdXQgb2YgJWQpXG4iLAogCQkJICBjbnQsIGludF9wYXJhbXMtPmluLm51bV92ZWN0b3JzKTsKLQkJcmMgPSBwY2lfZW5hYmxlX21zaXhfZXhhY3QoY2Rldi0+cGRldiwKLQkJCQkJICAgaW50X3BhcmFtcy0+bXNpeF90YWJsZSwgY250KTsKKwkJcmMgPSBwY2lfZW5hYmxlX21zaXhfZXhhY3QoY2Rldi0+cGRldiwgaW50X3BhcmFtcy0+bXNpeF90YWJsZSwKKwkJCQkJICAgY250KTsKIAkJaWYgKCFyYykKIAkJCXJjID0gY250OwogCX0KQEAgLTQzOSw2ICs0NDIsMTEgQEAKIAl9CiAKIG91dDoKKwlpZiAoIXJjKQorCQlEUF9JTkZPKGNkZXYsICJVc2luZyAlcyBpbnRlcnJ1cHRzXG4iLAorCQkJaW50X3BhcmFtcy0+b3V0LmludF9tb2RlID09IFFFRF9JTlRfTU9ERV9JTlRBID8KKwkJCSJJTlRhIiA6IGludF9wYXJhbXMtPm91dC5pbnRfbW9kZSA9PSBRRURfSU5UX01PREVfTVNJID8KKwkJCSJNU0kiIDogIk1TSVgiKTsKIAljZGV2LT5pbnRfY29hbGVzY2luZ19tb2RlID0gUUVEX0NPQUxfTU9ERV9FTkFCTEU7CiAKIAlyZXR1cm4gcmM7CkBAIC01MTQsMTkgKzUyMiwxOCBAQAogaW50IHFlZF9zbG93cGF0aF9pcnFfcmVxKHN0cnVjdCBxZWRfaHdmbiAqaHdmbikKIHsKIAlzdHJ1Y3QgcWVkX2RldiAqY2RldiA9IGh3Zm4tPmNkZXY7CisJdTMyIGludF9tb2RlOwogCWludCByYyA9IDA7CiAJdTggaWQ7CiAKLQlpZiAoY2Rldi0+aW50X3BhcmFtcy5vdXQuaW50X21vZGUgPT0gUUVEX0lOVF9NT0RFX01TSVgpIHsKKwlpbnRfbW9kZSA9IGNkZXYtPmludF9wYXJhbXMub3V0LmludF9tb2RlOworCWlmIChpbnRfbW9kZSA9PSBRRURfSU5UX01PREVfTVNJWCkgewogCQlpZCA9IGh3Zm4tPm15X2lkOwogCQlzbnByaW50Zihod2ZuLT5uYW1lLCBOQU1FX1NJWkUsICJzcC0lZC0lMDJ4OiUwMnguJTAyeCIsCiAJCQkgaWQsIGNkZXYtPnBkZXYtPmJ1cy0+bnVtYmVyLAogCQkJIFBDSV9TTE9UKGNkZXYtPnBkZXYtPmRldmZuKSwgaHdmbi0+YWJzX3BmX2lkKTsKIAkJcmMgPSByZXF1ZXN0X2lycShjZGV2LT5pbnRfcGFyYW1zLm1zaXhfdGFibGVbaWRdLnZlY3RvciwKIAkJCQkgcWVkX21zaXhfc3BfaW50LCAwLCBod2ZuLT5uYW1lLCBod2ZuLT5zcF9kcGMpOwotCQlpZiAoIXJjKQotCQkJRFBfVkVSQk9TRShod2ZuLCAoTkVUSUZfTVNHX0lOVFIgfCBRRURfTVNHX1NQKSwKLQkJCQkgICAiUmVxdWVzdGVkIHNsb3dwYXRoIE1TSS1YXG4iKTsKIAl9IGVsc2UgewogCQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIApAQCAtNTQxLDYgKzU0OCwxMyBAQAogCQkJCSBmbGFncywgY2Rldi0+bmFtZSwgY2Rldik7CiAJfQogCisJaWYgKHJjKQorCQlEUF9OT1RJQ0UoY2RldiwgInJlcXVlc3RfaXJxIGZhaWxlZCwgcmMgPSAlZFxuIiwgcmMpOworCWVsc2UKKwkJRFBfVkVSQk9TRShod2ZuLCAoTkVUSUZfTVNHX0lOVFIgfCBRRURfTVNHX1NQKSwKKwkJCSAgICJSZXF1ZXN0ZWQgc2xvd3BhdGggJXNcbiIsCisJCQkgICAoaW50X21vZGUgPT0gUUVEX0lOVF9NT0RFX01TSVgpID8gIk1TSS1YIiA6ICJJUlEiKTsKKwogCXJldHVybiByYzsKIH0KIApAQCAtNTgxLDYgKzU5NSw4IEBACiAJCX0KIAl9CiAKKwlxZWRfZGJnX3BmX2V4aXQoY2Rldik7CisKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTU5OSw3ICs2MTUsMTYgQEAKIAogc3RhdGljIGludCBxZWRfbmljX3NldHVwKHN0cnVjdCBxZWRfZGV2ICpjZGV2KQogewotCWludCByYzsKKwlpbnQgcmMsIGk7CisKKwkvKiBEZXRlcm1pbmUgaWYgaW50ZXJmYWNlIGlzIGdvaW5nIHRvIHJlcXVpcmUgTEwyICovCisJaWYgKFFFRF9MRUFESU5HX0hXRk4oY2RldiktPmh3X2luZm8ucGVyc29uYWxpdHkgIT0gUUVEX1BDSV9FVEgpIHsKKwkJZm9yIChpID0gMDsgaSA8IGNkZXYtPm51bV9od2ZuczsgaSsrKSB7CisJCQlzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiA9ICZjZGV2LT5od2Zuc1tpXTsKKworCQkJcF9od2ZuLT51c2luZ19sbDIgPSB0cnVlOworCQl9CisJfQogCiAJcmMgPSBxZWRfcmVzY19hbGxvYyhjZGV2KTsKIAlpZiAocmMpCkBAIC02NTcsNiArNjgyLDkgQEAKIAkJCQkgIGVudW0gcWVkX2ludF9tb2RlIGludF9tb2RlKQogewogCXN0cnVjdCBxZWRfc2JfY250X2luZm8gc2JfY250X2luZm87CisjaWYgSVNfRU5BQkxFRChDT05GSUdfSU5GSU5JQkFORF9RRURSKQorCWludCBudW1fbDJfcXVldWVzOworI2VuZGlmCiAJaW50IHJjOwogCWludCBpOwogCkBAIC02ODcsNiArNzE1LDMxIEBACiAJY2Rldi0+aW50X3BhcmFtcy5mcF9tc2l4X2NudCA9IGNkZXYtPmludF9wYXJhbXMub3V0Lm51bV92ZWN0b3JzIC0KIAkJCQkgICAgICAgY2Rldi0+bnVtX2h3Zm5zOwogCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSU5GSU5JQkFORF9RRURSKQorCW51bV9sMl9xdWV1ZXMgPSAwOworCWZvcl9lYWNoX2h3Zm4oY2RldiwgaSkKKwkJbnVtX2wyX3F1ZXVlcyArPSBGRUFUX05VTSgmY2Rldi0+aHdmbnNbaV0sIFFFRF9QRl9MMl9RVUUpOworCisJRFBfVkVSQk9TRShjZGV2LCBRRURfTVNHX1JETUEsCisJCSAgICJjZGV2LT5pbnRfcGFyYW1zLmZwX21zaXhfY250PSVkIG51bV9sMl9xdWV1ZXM9JWRcbiIsCisJCSAgIGNkZXYtPmludF9wYXJhbXMuZnBfbXNpeF9jbnQsIG51bV9sMl9xdWV1ZXMpOworCisJaWYgKGNkZXYtPmludF9wYXJhbXMuZnBfbXNpeF9jbnQgPiBudW1fbDJfcXVldWVzKSB7CisJCWNkZXYtPmludF9wYXJhbXMucmRtYV9tc2l4X2NudCA9CisJCQkoY2Rldi0+aW50X3BhcmFtcy5mcF9tc2l4X2NudCAtIG51bV9sMl9xdWV1ZXMpCisJCQkvIGNkZXYtPm51bV9od2ZuczsKKwkJY2Rldi0+aW50X3BhcmFtcy5yZG1hX21zaXhfYmFzZSA9CisJCQljZGV2LT5pbnRfcGFyYW1zLmZwX21zaXhfYmFzZSArIG51bV9sMl9xdWV1ZXM7CisJCWNkZXYtPmludF9wYXJhbXMuZnBfbXNpeF9jbnQgPSBudW1fbDJfcXVldWVzOworCX0gZWxzZSB7CisJCWNkZXYtPmludF9wYXJhbXMucmRtYV9tc2l4X2NudCA9IDA7CisJfQorCisJRFBfVkVSQk9TRShjZGV2LCBRRURfTVNHX1JETUEsICJyb2NlX21zaXhfY250PSVkIHJvY2VfbXNpeF9iYXNlPSVkXG4iLAorCQkgICBjZGV2LT5pbnRfcGFyYW1zLnJkbWFfbXNpeF9jbnQsCisJCSAgIGNkZXYtPmludF9wYXJhbXMucmRtYV9tc2l4X2Jhc2UpOworI2VuZGlmCisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzkwLDYgKzg0MywxMyBAQAogewogCWludCBpOwogCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSU5GSU5JQkFORF9RRURSKQorCXBhcmFtcy0+cmRtYV9wZl9wYXJhbXMubnVtX3FwcyA9IFFFRF9ST0NFX1FQUzsKKwlwYXJhbXMtPnJkbWFfcGZfcGFyYW1zLm1pbl9kcGlzID0gUUVEX1JPQ0VfRFBJUzsKKwkvKiBkaXZpZGUgYnkgMyB0aGUgTVJzIHRvIGF2b2lkIE1GIElMVCBvdmVyZmxvdyAqLworCXBhcmFtcy0+cmRtYV9wZl9wYXJhbXMubnVtX21ycyA9IFJETUFfTUFYX1RJRFM7CisJcGFyYW1zLT5yZG1hX3BmX3BhcmFtcy5nbF9waSA9IFFFRF9ST0NFX1BST1RPQ09MX0lOREVYOworI2VuZGlmCiAJZm9yIChpID0gMDsgaSA8IGNkZXYtPm51bV9od2ZuczsgaSsrKSB7CiAJCXN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuID0gJmNkZXYtPmh3Zm5zW2ldOwogCkBAIC04MzQsMTMgKzg5NCwxMyBAQAogCWlmIChJU19QRihjZGV2KSkgewogCQkvKiBBbGxvY2F0ZSBzdHJlYW0gZm9yIHVuemlwcGluZyAqLwogCQlyYyA9IHFlZF9hbGxvY19zdHJlYW1fbWVtKGNkZXYpOwotCQlpZiAocmMpIHsKLQkJCURQX05PVElDRShjZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIHN0cmVhbSBtZW1vcnlcbiIpOworCQlpZiAocmMpCiAJCQlnb3RvIGVycjI7Ci0JCX0KIAogCQkvKiBGaXJzdCBEd29yZCB1c2VkIHRvIGRpZmZyZW50aWF0ZSBiZXR3ZWVuIHZhcmlvdXMgc291cmNlcyAqLwogCQlkYXRhID0gY2Rldi0+ZmlybXdhcmUtPmRhdGEgKyBzaXplb2YodTMyKTsKKworCQlxZWRfZGJnX3BmX2luaXQoY2Rldik7CiAJfQogCiAJbWVtc2V0KCZ0dW5uX2luZm8sIDAsIHNpemVvZih0dW5uX2luZm8pKTsKQEAgLTg2NCw2ICs5MjQsMTIgQEAKIAlEUF9JTkZPKGNkZXYsCiAJCSJIVyBpbml0aWFsaXphdGlvbiBhbmQgZnVuY3Rpb24gc3RhcnQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseVxuIik7CiAKKwkvKiBBbGxvY2F0ZSBMTDIgaW50ZXJmYWNlIGlmIG5lZWRlZCAqLworCWlmIChRRURfTEVBRElOR19IV0ZOKGNkZXYpLT51c2luZ19sbDIpIHsKKwkJcmMgPSBxZWRfbGwyX2FsbG9jX2lmKGNkZXYpOworCQlpZiAocmMpCisJCQlnb3RvIGVycjM7CisJfQogCWlmIChJU19QRihjZGV2KSkgewogCQlod2ZuID0gUUVEX0xFQURJTkdfSFdGTihjZGV2KTsKIAkJZHJ2X3ZlcnNpb24udmVyc2lvbiA9IChwYXJhbXMtPmRydl9tYWpvciA8PCAyNCkgfApAQCAtODg0LDYgKzk1MCw4IEBACiAKIAlyZXR1cm4gMDsKIAorZXJyMzoKKwlxZWRfaHdfc3RvcChjZGV2KTsKIGVycjI6CiAJcWVkX2h3X3RpbWVyc19zdG9wX2FsbChjZGV2KTsKIAlpZiAoSVNfUEYoY2RldikpCkBAIC05MDYsNiArOTc0LDggQEAKIAlpZiAoIWNkZXYpCiAJCXJldHVybiAtRU5PREVWOwogCisJcWVkX2xsMl9kZWFsbG9jX2lmKGNkZXYpOworCiAJaWYgKElTX1BGKGNkZXYpKSB7CiAJCXFlZF9mcmVlX3N0cmVhbV9tZW0oY2Rldik7CiAJCWlmIChJU19RRURfRVRIX0lGKGNkZXYpKQpAQCAtOTc0LDggKzEwNDQsNyBAQAogfQogCiBzdGF0aWMgdTMyIHFlZF9zYl9yZWxlYXNlKHN0cnVjdCBxZWRfZGV2ICpjZGV2LAotCQkJICBzdHJ1Y3QgcWVkX3NiX2luZm8gKnNiX2luZm8sCi0JCQkgIHUxNiBzYl9pZCkKKwkJCSAgc3RydWN0IHFlZF9zYl9pbmZvICpzYl9pbmZvLCB1MTYgc2JfaWQpCiB7CiAJc3RydWN0IHFlZF9od2ZuICpwX2h3Zm47CiAJaW50IGh3Zm5faW5kZXg7CkBAIC0xMDI1LDIwICsxMDk0LDIzIEBACiAJCWxpbmtfcGFyYW1zLT5zcGVlZC5hdXRvbmVnID0gcGFyYW1zLT5hdXRvbmVnOwogCWlmIChwYXJhbXMtPm92ZXJyaWRlX2ZsYWdzICYgUUVEX0xJTktfT1ZFUlJJREVfU1BFRURfQURWX1NQRUVEUykgewogCQlsaW5rX3BhcmFtcy0+c3BlZWQuYWR2ZXJ0aXNlZF9zcGVlZHMgPSAwOwotCQlpZiAoKHBhcmFtcy0+YWR2X3NwZWVkcyAmIFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZikgfHwKLQkJICAgIChwYXJhbXMtPmFkdl9zcGVlZHMgJiBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwpKQorCQlpZiAoKHBhcmFtcy0+YWR2X3NwZWVkcyAmIFFFRF9MTV8xMDAwYmFzZVRfSGFsZl9CSVQpIHx8CisJCSAgICAocGFyYW1zLT5hZHZfc3BlZWRzICYgUUVEX0xNXzEwMDBiYXNlVF9GdWxsX0JJVCkpCiAJCQlsaW5rX3BhcmFtcy0+c3BlZWQuYWR2ZXJ0aXNlZF9zcGVlZHMgfD0KLQkJCQlOVk1fQ0ZHMV9QT1JUX0RSVl9TUEVFRF9DQVBBQklMSVRZX01BU0tfMUc7Ci0JCWlmIChwYXJhbXMtPmFkdl9zcGVlZHMgJiBTVVBQT1JURURfMTAwMDBiYXNlS1JfRnVsbCkKKwkJCSAgICBOVk1fQ0ZHMV9QT1JUX0RSVl9TUEVFRF9DQVBBQklMSVRZX01BU0tfMUc7CisJCWlmIChwYXJhbXMtPmFkdl9zcGVlZHMgJiBRRURfTE1fMTAwMDBiYXNlS1JfRnVsbF9CSVQpCiAJCQlsaW5rX3BhcmFtcy0+c3BlZWQuYWR2ZXJ0aXNlZF9zcGVlZHMgfD0KLQkJCQlOVk1fQ0ZHMV9QT1JUX0RSVl9TUEVFRF9DQVBBQklMSVRZX01BU0tfMTBHOwotCQlpZiAocGFyYW1zLT5hZHZfc3BlZWRzICYgU1VQUE9SVEVEXzQwMDAwYmFzZUxSNF9GdWxsKQorCQkJICAgIE5WTV9DRkcxX1BPUlRfRFJWX1NQRUVEX0NBUEFCSUxJVFlfTUFTS18xMEc7CisJCWlmIChwYXJhbXMtPmFkdl9zcGVlZHMgJiBRRURfTE1fMjUwMDBiYXNlS1JfRnVsbF9CSVQpCiAJCQlsaW5rX3BhcmFtcy0+c3BlZWQuYWR2ZXJ0aXNlZF9zcGVlZHMgfD0KLQkJCQlOVk1fQ0ZHMV9QT1JUX0RSVl9TUEVFRF9DQVBBQklMSVRZX01BU0tfNDBHOwotCQlpZiAocGFyYW1zLT5hZHZfc3BlZWRzICYgMCkKKwkJCSAgICBOVk1fQ0ZHMV9QT1JUX0RSVl9TUEVFRF9DQVBBQklMSVRZX01BU0tfMjVHOworCQlpZiAocGFyYW1zLT5hZHZfc3BlZWRzICYgUUVEX0xNXzQwMDAwYmFzZUxSNF9GdWxsX0JJVCkKIAkJCWxpbmtfcGFyYW1zLT5zcGVlZC5hZHZlcnRpc2VkX3NwZWVkcyB8PQotCQkJCU5WTV9DRkcxX1BPUlRfRFJWX1NQRUVEX0NBUEFCSUxJVFlfTUFTS181MEc7Ci0JCWlmIChwYXJhbXMtPmFkdl9zcGVlZHMgJiAwKQorCQkJICAgIE5WTV9DRkcxX1BPUlRfRFJWX1NQRUVEX0NBUEFCSUxJVFlfTUFTS180MEc7CisJCWlmIChwYXJhbXMtPmFkdl9zcGVlZHMgJiBRRURfTE1fNTAwMDBiYXNlS1IyX0Z1bGxfQklUKQorCQkJbGlua19wYXJhbXMtPnNwZWVkLmFkdmVydGlzZWRfc3BlZWRzIHw9CisJCQkgICAgTlZNX0NGRzFfUE9SVF9EUlZfU1BFRURfQ0FQQUJJTElUWV9NQVNLXzUwRzsKKwkJaWYgKHBhcmFtcy0+YWR2X3NwZWVkcyAmIFFFRF9MTV8xMDAwMDBiYXNlS1I0X0Z1bGxfQklUKQogCQkJbGlua19wYXJhbXMtPnNwZWVkLmFkdmVydGlzZWRfc3BlZWRzIHw9CiAJCQkgICAgTlZNX0NGRzFfUE9SVF9EUlZfU1BFRURfQ0FQQUJJTElUWV9NQVNLX0JCXzEwMEc7CiAJfQpAQCAtMTE2OCw1MCArMTI0MCw1NiBAQAogCQlpZl9saW5rLT5saW5rX3VwID0gdHJ1ZTsKIAogCS8qIFRPRE8gLSBhdCB0aGUgbW9tZW50IGFzc3VtZSBzdXBwb3J0ZWQgYW5kIGFkdmVydGlzZWQgc3BlZWQgZXF1YWwgKi8KLQlpZl9saW5rLT5zdXBwb3J0ZWRfY2FwcyA9IFNVUFBPUlRFRF9GSUJSRTsKKwlpZl9saW5rLT5zdXBwb3J0ZWRfY2FwcyA9IFFFRF9MTV9GSUJSRV9CSVQ7CiAJaWYgKHBhcmFtcy5zcGVlZC5hdXRvbmVnKQotCQlpZl9saW5rLT5zdXBwb3J0ZWRfY2FwcyB8PSBTVVBQT1JURURfQXV0b25lZzsKKwkJaWZfbGluay0+c3VwcG9ydGVkX2NhcHMgfD0gUUVEX0xNX0F1dG9uZWdfQklUOwogCWlmIChwYXJhbXMucGF1c2UuYXV0b25lZyB8fAogCSAgICAocGFyYW1zLnBhdXNlLmZvcmNlZF9yeCAmJiBwYXJhbXMucGF1c2UuZm9yY2VkX3R4KSkKLQkJaWZfbGluay0+c3VwcG9ydGVkX2NhcHMgfD0gU1VQUE9SVEVEX0FzeW1fUGF1c2U7CisJCWlmX2xpbmstPnN1cHBvcnRlZF9jYXBzIHw9IFFFRF9MTV9Bc3ltX1BhdXNlX0JJVDsKIAlpZiAocGFyYW1zLnBhdXNlLmF1dG9uZWcgfHwgcGFyYW1zLnBhdXNlLmZvcmNlZF9yeCB8fAogCSAgICBwYXJhbXMucGF1c2UuZm9yY2VkX3R4KQotCQlpZl9saW5rLT5zdXBwb3J0ZWRfY2FwcyB8PSBTVVBQT1JURURfUGF1c2U7CisJCWlmX2xpbmstPnN1cHBvcnRlZF9jYXBzIHw9IFFFRF9MTV9QYXVzZV9CSVQ7CiAKIAlpZl9saW5rLT5hZHZlcnRpc2VkX2NhcHMgPSBpZl9saW5rLT5zdXBwb3J0ZWRfY2FwczsKIAlpZiAocGFyYW1zLnNwZWVkLmFkdmVydGlzZWRfc3BlZWRzICYKIAkgICAgTlZNX0NGRzFfUE9SVF9EUlZfU1BFRURfQ0FQQUJJTElUWV9NQVNLXzFHKQotCQlpZl9saW5rLT5hZHZlcnRpc2VkX2NhcHMgfD0gU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmIHwKLQkJCQkJICAgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsOworCQlpZl9saW5rLT5hZHZlcnRpc2VkX2NhcHMgfD0gUUVEX0xNXzEwMDBiYXNlVF9IYWxmX0JJVCB8CisJCSAgICBRRURfTE1fMTAwMGJhc2VUX0Z1bGxfQklUOwogCWlmIChwYXJhbXMuc3BlZWQuYWR2ZXJ0aXNlZF9zcGVlZHMgJgogCSAgICBOVk1fQ0ZHMV9QT1JUX0RSVl9TUEVFRF9DQVBBQklMSVRZX01BU0tfMTBHKQotCQlpZl9saW5rLT5hZHZlcnRpc2VkX2NhcHMgfD0gU1VQUE9SVEVEXzEwMDAwYmFzZUtSX0Z1bGw7CisJCWlmX2xpbmstPmFkdmVydGlzZWRfY2FwcyB8PSBRRURfTE1fMTAwMDBiYXNlS1JfRnVsbF9CSVQ7CiAJaWYgKHBhcmFtcy5zcGVlZC5hZHZlcnRpc2VkX3NwZWVkcyAmCi0JCU5WTV9DRkcxX1BPUlRfRFJWX1NQRUVEX0NBUEFCSUxJVFlfTUFTS180MEcpCi0JCWlmX2xpbmstPmFkdmVydGlzZWRfY2FwcyB8PSBTVVBQT1JURURfNDAwMDBiYXNlTFI0X0Z1bGw7CisJICAgIE5WTV9DRkcxX1BPUlRfRFJWX1NQRUVEX0NBUEFCSUxJVFlfTUFTS18yNUcpCisJCWlmX2xpbmstPmFkdmVydGlzZWRfY2FwcyB8PSBRRURfTE1fMjUwMDBiYXNlS1JfRnVsbF9CSVQ7CiAJaWYgKHBhcmFtcy5zcGVlZC5hZHZlcnRpc2VkX3NwZWVkcyAmCi0JCU5WTV9DRkcxX1BPUlRfRFJWX1NQRUVEX0NBUEFCSUxJVFlfTUFTS181MEcpCi0JCWlmX2xpbmstPmFkdmVydGlzZWRfY2FwcyB8PSAwOworCSAgICBOVk1fQ0ZHMV9QT1JUX0RSVl9TUEVFRF9DQVBBQklMSVRZX01BU0tfNDBHKQorCQlpZl9saW5rLT5hZHZlcnRpc2VkX2NhcHMgfD0gUUVEX0xNXzQwMDAwYmFzZUxSNF9GdWxsX0JJVDsKKwlpZiAocGFyYW1zLnNwZWVkLmFkdmVydGlzZWRfc3BlZWRzICYKKwkgICAgTlZNX0NGRzFfUE9SVF9EUlZfU1BFRURfQ0FQQUJJTElUWV9NQVNLXzUwRykKKwkJaWZfbGluay0+YWR2ZXJ0aXNlZF9jYXBzIHw9IFFFRF9MTV81MDAwMGJhc2VLUjJfRnVsbF9CSVQ7CiAJaWYgKHBhcmFtcy5zcGVlZC5hZHZlcnRpc2VkX3NwZWVkcyAmCiAJICAgIE5WTV9DRkcxX1BPUlRfRFJWX1NQRUVEX0NBUEFCSUxJVFlfTUFTS19CQl8xMDBHKQotCQlpZl9saW5rLT5hZHZlcnRpc2VkX2NhcHMgfD0gMDsKKwkJaWZfbGluay0+YWR2ZXJ0aXNlZF9jYXBzIHw9IFFFRF9MTV8xMDAwMDBiYXNlS1I0X0Z1bGxfQklUOwogCiAJaWYgKGxpbmtfY2Fwcy5zcGVlZF9jYXBhYmlsaXRpZXMgJgogCSAgICBOVk1fQ0ZHMV9QT1JUX0RSVl9TUEVFRF9DQVBBQklMSVRZX01BU0tfMUcpCi0JCWlmX2xpbmstPnN1cHBvcnRlZF9jYXBzIHw9IFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZiB8Ci0JCQkJCSAgIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbDsKKwkJaWZfbGluay0+c3VwcG9ydGVkX2NhcHMgfD0gUUVEX0xNXzEwMDBiYXNlVF9IYWxmX0JJVCB8CisJCSAgICBRRURfTE1fMTAwMGJhc2VUX0Z1bGxfQklUOwogCWlmIChsaW5rX2NhcHMuc3BlZWRfY2FwYWJpbGl0aWVzICYKIAkgICAgTlZNX0NGRzFfUE9SVF9EUlZfU1BFRURfQ0FQQUJJTElUWV9NQVNLXzEwRykKLQkJaWZfbGluay0+c3VwcG9ydGVkX2NhcHMgfD0gU1VQUE9SVEVEXzEwMDAwYmFzZUtSX0Z1bGw7CisJCWlmX2xpbmstPnN1cHBvcnRlZF9jYXBzIHw9IFFFRF9MTV8xMDAwMGJhc2VLUl9GdWxsX0JJVDsKIAlpZiAobGlua19jYXBzLnNwZWVkX2NhcGFiaWxpdGllcyAmCi0JCU5WTV9DRkcxX1BPUlRfRFJWX1NQRUVEX0NBUEFCSUxJVFlfTUFTS180MEcpCi0JCWlmX2xpbmstPnN1cHBvcnRlZF9jYXBzIHw9IFNVUFBPUlRFRF80MDAwMGJhc2VMUjRfRnVsbDsKKwkgICAgTlZNX0NGRzFfUE9SVF9EUlZfU1BFRURfQ0FQQUJJTElUWV9NQVNLXzI1RykKKwkJaWZfbGluay0+c3VwcG9ydGVkX2NhcHMgfD0gUUVEX0xNXzI1MDAwYmFzZUtSX0Z1bGxfQklUOwogCWlmIChsaW5rX2NhcHMuc3BlZWRfY2FwYWJpbGl0aWVzICYKLQkJTlZNX0NGRzFfUE9SVF9EUlZfU1BFRURfQ0FQQUJJTElUWV9NQVNLXzUwRykKLQkJaWZfbGluay0+c3VwcG9ydGVkX2NhcHMgfD0gMDsKKwkgICAgTlZNX0NGRzFfUE9SVF9EUlZfU1BFRURfQ0FQQUJJTElUWV9NQVNLXzQwRykKKwkJaWZfbGluay0+c3VwcG9ydGVkX2NhcHMgfD0gUUVEX0xNXzQwMDAwYmFzZUxSNF9GdWxsX0JJVDsKKwlpZiAobGlua19jYXBzLnNwZWVkX2NhcGFiaWxpdGllcyAmCisJICAgIE5WTV9DRkcxX1BPUlRfRFJWX1NQRUVEX0NBUEFCSUxJVFlfTUFTS181MEcpCisJCWlmX2xpbmstPnN1cHBvcnRlZF9jYXBzIHw9IFFFRF9MTV81MDAwMGJhc2VLUjJfRnVsbF9CSVQ7CiAJaWYgKGxpbmtfY2Fwcy5zcGVlZF9jYXBhYmlsaXRpZXMgJgogCSAgICBOVk1fQ0ZHMV9QT1JUX0RSVl9TUEVFRF9DQVBBQklMSVRZX01BU0tfQkJfMTAwRykKLQkJaWZfbGluay0+c3VwcG9ydGVkX2NhcHMgfD0gMDsKKwkJaWZfbGluay0+c3VwcG9ydGVkX2NhcHMgfD0gUUVEX0xNXzEwMDAwMGJhc2VLUjRfRnVsbF9CSVQ7CiAKIAlpZiAobGluay5saW5rX3VwKQogCQlpZl9saW5rLT5zcGVlZCA9IGxpbmsuc3BlZWQ7CkBAIC0xMjMxLDMzICsxMzA5LDI5IEBACiAJCWlmX2xpbmstPnBhdXNlX2NvbmZpZyB8PSBRRURfTElOS19QQVVTRV9UWF9FTkFCTEU7CiAKIAkvKiBMaW5rIHBhcnRuZXIgY2FwYWJpbGl0aWVzICovCi0JaWYgKGxpbmsucGFydG5lcl9hZHZfc3BlZWQgJgotCSAgICBRRURfTElOS19QQVJUTkVSX1NQRUVEXzFHX0hEKQotCQlpZl9saW5rLT5scF9jYXBzIHw9IFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZjsKLQlpZiAobGluay5wYXJ0bmVyX2Fkdl9zcGVlZCAmCi0JICAgIFFFRF9MSU5LX1BBUlRORVJfU1BFRURfMUdfRkQpCi0JCWlmX2xpbmstPmxwX2NhcHMgfD0gU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsOwotCWlmIChsaW5rLnBhcnRuZXJfYWR2X3NwZWVkICYKLQkgICAgUUVEX0xJTktfUEFSVE5FUl9TUEVFRF8xMEcpCi0JCWlmX2xpbmstPmxwX2NhcHMgfD0gU1VQUE9SVEVEXzEwMDAwYmFzZUtSX0Z1bGw7Ci0JaWYgKGxpbmsucGFydG5lcl9hZHZfc3BlZWQgJgotCSAgICBRRURfTElOS19QQVJUTkVSX1NQRUVEXzQwRykKLQkJaWZfbGluay0+bHBfY2FwcyB8PSBTVVBQT1JURURfNDAwMDBiYXNlTFI0X0Z1bGw7Ci0JaWYgKGxpbmsucGFydG5lcl9hZHZfc3BlZWQgJgotCSAgICBRRURfTElOS19QQVJUTkVSX1NQRUVEXzUwRykKLQkJaWZfbGluay0+bHBfY2FwcyB8PSAwOwotCWlmIChsaW5rLnBhcnRuZXJfYWR2X3NwZWVkICYKLQkgICAgUUVEX0xJTktfUEFSVE5FUl9TUEVFRF8xMDBHKQotCQlpZl9saW5rLT5scF9jYXBzIHw9IDA7CisJaWYgKGxpbmsucGFydG5lcl9hZHZfc3BlZWQgJiBRRURfTElOS19QQVJUTkVSX1NQRUVEXzFHX0hEKQorCQlpZl9saW5rLT5scF9jYXBzIHw9IFFFRF9MTV8xMDAwYmFzZVRfSGFsZl9CSVQ7CisJaWYgKGxpbmsucGFydG5lcl9hZHZfc3BlZWQgJiBRRURfTElOS19QQVJUTkVSX1NQRUVEXzFHX0ZEKQorCQlpZl9saW5rLT5scF9jYXBzIHw9IFFFRF9MTV8xMDAwYmFzZVRfRnVsbF9CSVQ7CisJaWYgKGxpbmsucGFydG5lcl9hZHZfc3BlZWQgJiBRRURfTElOS19QQVJUTkVSX1NQRUVEXzEwRykKKwkJaWZfbGluay0+bHBfY2FwcyB8PSBRRURfTE1fMTAwMDBiYXNlS1JfRnVsbF9CSVQ7CisJaWYgKGxpbmsucGFydG5lcl9hZHZfc3BlZWQgJiBRRURfTElOS19QQVJUTkVSX1NQRUVEXzI1RykKKwkJaWZfbGluay0+bHBfY2FwcyB8PSBRRURfTE1fMjUwMDBiYXNlS1JfRnVsbF9CSVQ7CisJaWYgKGxpbmsucGFydG5lcl9hZHZfc3BlZWQgJiBRRURfTElOS19QQVJUTkVSX1NQRUVEXzQwRykKKwkJaWZfbGluay0+bHBfY2FwcyB8PSBRRURfTE1fNDAwMDBiYXNlTFI0X0Z1bGxfQklUOworCWlmIChsaW5rLnBhcnRuZXJfYWR2X3NwZWVkICYgUUVEX0xJTktfUEFSVE5FUl9TUEVFRF81MEcpCisJCWlmX2xpbmstPmxwX2NhcHMgfD0gUUVEX0xNXzUwMDAwYmFzZUtSMl9GdWxsX0JJVDsKKwlpZiAobGluay5wYXJ0bmVyX2Fkdl9zcGVlZCAmIFFFRF9MSU5LX1BBUlRORVJfU1BFRURfMTAwRykKKwkJaWZfbGluay0+bHBfY2FwcyB8PSBRRURfTE1fMTAwMDAwYmFzZUtSNF9GdWxsX0JJVDsKIAogCWlmIChsaW5rLmFuX2NvbXBsZXRlKQotCQlpZl9saW5rLT5scF9jYXBzIHw9IFNVUFBPUlRFRF9BdXRvbmVnOworCQlpZl9saW5rLT5scF9jYXBzIHw9IFFFRF9MTV9BdXRvbmVnX0JJVDsKIAogCWlmIChsaW5rLnBhcnRuZXJfYWR2X3BhdXNlKQotCQlpZl9saW5rLT5scF9jYXBzIHw9IFNVUFBPUlRFRF9QYXVzZTsKKwkJaWZfbGluay0+bHBfY2FwcyB8PSBRRURfTE1fUGF1c2VfQklUOwogCWlmIChsaW5rLnBhcnRuZXJfYWR2X3BhdXNlID09IFFFRF9MSU5LX1BBUlRORVJfQVNZTU1FVFJJQ19QQVVTRSB8fAogCSAgICBsaW5rLnBhcnRuZXJfYWR2X3BhdXNlID09IFFFRF9MSU5LX1BBUlRORVJfQk9USF9QQVVTRSkKLQkJaWZfbGluay0+bHBfY2FwcyB8PSBTVVBQT1JURURfQXN5bV9QYXVzZTsKKwkJaWZfbGluay0+bHBfY2FwcyB8PSBRRURfTE1fQXN5bV9QYXVzZV9CSVQ7CiB9CiAKIHN0YXRpYyB2b2lkIHFlZF9nZXRfY3VycmVudF9saW5rKHN0cnVjdCBxZWRfZGV2ICpjZGV2LApAQCAtMTM4NSw5ICsxNDU5LDMyIEBACiAJLmdldF9saW5rID0gJnFlZF9nZXRfY3VycmVudF9saW5rLAogCS5kcmFpbiA9ICZxZWRfZHJhaW4sCiAJLnVwZGF0ZV9tc2dsdmwgPSAmcWVkX2luaXRfZHAsCisJLmRiZ19hbGxfZGF0YSA9ICZxZWRfZGJnX2FsbF9kYXRhLAorCS5kYmdfYWxsX2RhdGFfc2l6ZSA9ICZxZWRfZGJnX2FsbF9kYXRhX3NpemUsCiAJLmNoYWluX2FsbG9jID0gJnFlZF9jaGFpbl9hbGxvYywKIAkuY2hhaW5fZnJlZSA9ICZxZWRfY2hhaW5fZnJlZSwKIAkuZ2V0X2NvYWxlc2NlID0gJnFlZF9nZXRfY29hbGVzY2UsCiAJLnNldF9jb2FsZXNjZSA9ICZxZWRfc2V0X2NvYWxlc2NlLAogCS5zZXRfbGVkID0gJnFlZF9zZXRfbGVkLAogfTsKKwordm9pZCBxZWRfZ2V0X3Byb3RvY29sX3N0YXRzKHN0cnVjdCBxZWRfZGV2ICpjZGV2LAorCQkJICAgIGVudW0gcWVkX21jcF9wcm90b2NvbF90eXBlIHR5cGUsCisJCQkgICAgdW5pb24gcWVkX21jcF9wcm90b2NvbF9zdGF0cyAqc3RhdHMpCit7CisJc3RydWN0IHFlZF9ldGhfc3RhdHMgZXRoX3N0YXRzOworCisJbWVtc2V0KHN0YXRzLCAwLCBzaXplb2YoKnN0YXRzKSk7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFFFRF9NQ1BfTEFOX1NUQVRTOgorCQlxZWRfZ2V0X3Zwb3J0X3N0YXRzKGNkZXYsICZldGhfc3RhdHMpOworCQlzdGF0cy0+bGFuX3N0YXRzLnVjYXN0X3J4X3BrdHMgPSBldGhfc3RhdHMucnhfdWNhc3RfcGt0czsKKwkJc3RhdHMtPmxhbl9zdGF0cy51Y2FzdF90eF9wa3RzID0gZXRoX3N0YXRzLnR4X3VjYXN0X3BrdHM7CisJCXN0YXRzLT5sYW5fc3RhdHMuZmNzX2VyciA9IC0xOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEUF9FUlIoY2RldiwgIkludmFsaWQgcHJvdG9jb2wgdHlwZSA9ICVkXG4iLCB0eXBlKTsKKwkJcmV0dXJuOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX21jcC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfbWNwLmMKaW5kZXggYTI0MGYyNi4uYmRjOWJhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfbWNwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfbWNwLmMKQEAgLTU0LDggKzU0LDcgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBxZWRfbWNwX2NtZF9wb3J0X2luaXQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCQkgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCit2b2lkIHFlZF9tY3BfY21kX3BvcnRfaW5pdChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQogewogCXUzMiBhZGRyID0gU0VDVElPTl9PRkZTSVpFX0FERFIocF9od2ZuLT5tY3BfaW5mby0+cHVibGljX2Jhc2UsCiAJCQkJCVBVQkxJQ19QT1JUKTsKQEAgLTY4LDggKzY3LDcgQEAKIAkJICAgcF9od2ZuLT5tY3BfaW5mby0+cG9ydF9hZGRyLCBNRldfUE9SVChwX2h3Zm4pKTsKIH0KIAotdm9pZCBxZWRfbWNwX3JlYWRfbWIoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCSAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQordm9pZCBxZWRfbWNwX3JlYWRfbWIoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKIHsKIAl1MzIgbGVuZ3RoID0gTUZXX0RSVl9NU0dfTUFYX0RXT1JEUyhwX2h3Zm4tPm1jcF9pbmZvLT5tZndfbWJfbGVuZ3RoKTsKIAl1MzIgdG1wLCBpOwpAQCAtOTksOCArOTcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHFlZF9sb2FkX21jcF9vZmZzZXRzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJCXN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKK3N0YXRpYyBpbnQgcWVkX2xvYWRfbWNwX29mZnNldHMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKIHsKIAlzdHJ1Y3QgcWVkX21jcF9pbmZvICpwX2luZm8gPSBwX2h3Zm4tPm1jcF9pbmZvOwogCXUzMiBkcnZfbWJfb2Zmc2l6ZSwgbWZ3X21iX29mZnNpemU7CkBAIC0xNDMsOCArMTQwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHFlZF9tY3BfY21kX2luaXQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCSAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQoraW50IHFlZF9tY3BfY21kX2luaXQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKIHsKIAlzdHJ1Y3QgcWVkX21jcF9pbmZvICpwX2luZm87CiAJdTMyIHNpemU7CkBAIC0xNjUsOSArMTYxLDcgQEAKIAogCXNpemUgPSBNRldfRFJWX01TR19NQVhfRFdPUkRTKHBfaW5mby0+bWZ3X21iX2xlbmd0aCkgKiBzaXplb2YodTMyKTsKIAlwX2luZm8tPm1md19tYl9jdXIgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwotCXBfaW5mby0+bWZ3X21iX3NoYWRvdyA9Ci0JCWt6YWxsb2Moc2l6ZW9mKHUzMikgKiBNRldfRFJWX01TR19NQVhfRFdPUkRTKAotCQkJCXBfaW5mby0+bWZ3X21iX2xlbmd0aCksIEdGUF9LRVJORUwpOworCXBfaW5mby0+bWZ3X21iX3NoYWRvdyA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwX2luZm8tPm1md19tYl9zaGFkb3cgfHwgIXBfaW5mby0+bWZ3X21iX2FkZHIpCiAJCWdvdG8gZXJyOwogCkBAIC0xNzcsNyArMTcxLDYgQEAKIAlyZXR1cm4gMDsKIAogZXJyOgotCURQX05PVElDRShwX2h3Zm4sICJGYWlsZWQgdG8gYWxsb2NhdGUgbWNwIG1lbW9yeVxuIik7CiAJcWVkX21jcF9mcmVlKHBfaHdmbik7CiAJcmV0dXJuIC1FTk9NRU07CiB9CkBAIC0xODksOCArMTgyLDcgQEAKICAqIGFjY2VzcyBpcyBhY2hpZXZlZCBieSBzZXR0aW5nIGEgYmxvY2tpbmcgZmxhZywgd2hpY2ggd2lsbCBmYWlsIG90aGVyCiAgKiBjb21wZXRpbmcgY29udGV4dHMgdG8gc2VuZCB0aGVpciBtYWlsYm94ZXMuCiAgKi8KLXN0YXRpYyBpbnQgcWVkX21jcF9tYl9sb2NrKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJICAgdTMyIGNtZCkKK3N0YXRpYyBpbnQgcWVkX21jcF9tYl9sb2NrKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCB1MzIgY21kKQogewogCXNwaW5fbG9ja19iaCgmcF9od2ZuLT5tY3BfaW5mby0+bG9jayk7CiAKQEAgLTIyMSwxNSArMjEzLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHFlZF9tY3BfbWJfdW5sb2NrKHN0cnVjdCBxZWRfaHdmbgkqcF9od2ZuLAotCQkJICAgICAgdTMyCQljbWQpCitzdGF0aWMgdm9pZCBxZWRfbWNwX21iX3VubG9jayhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgdTMyIGNtZCkKIHsKIAlpZiAoY21kICE9IERSVl9NU0dfQ09ERV9MT0FEX1JFUSAmJiBjbWQgIT0gRFJWX01TR19DT0RFX1VOTE9BRF9SRVEpCiAJCXNwaW5fdW5sb2NrX2JoKCZwX2h3Zm4tPm1jcF9pbmZvLT5sb2NrKTsKIH0KIAotaW50IHFlZF9tY3BfcmVzZXQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCSAgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQoraW50IHFlZF9tY3BfcmVzZXQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKIHsKIAl1MzIgc2VxID0gKytwX2h3Zm4tPm1jcF9pbmZvLT5kcnZfbWJfc2VxOwogCXU4IGRlbGF5ID0gQ0hJUF9NQ1BfUkVTUF9JVEVSX1VTOwpAQCAtMzI2LDcgKzMxNiw4IEBACiAJCSpvX21jcF9wYXJhbSA9IERSVl9NQl9SRChwX2h3Zm4sIHBfcHR0LCBmd19tYl9wYXJhbSk7CiAJfSBlbHNlIHsKIAkJLyogRlcgQlVHISAqLwotCQlEUF9FUlIocF9od2ZuLCAiTUZXIGZhaWxlZCB0byByZXNwb25kIVxuIik7CisJCURQX0VSUihwX2h3Zm4sICJNRlcgZmFpbGVkIHRvIHJlc3BvbmQgW2NtZCAweCV4IHBhcmFtIDB4JXhdXG4iLAorCQkgICAgICAgY21kLCBwYXJhbSk7CiAJCSpvX21jcF9yZXNwID0gMDsKIAkJcmMgPSAtRUFHQUlOOwogCX0KQEAgLTM0Miw3ICszMzMsNyBAQAogCiAJLyogTUNQIG5vdCBpbml0aWFsaXplZCAqLwogCWlmICghcWVkX21jcF9pc19pbml0KHBfaHdmbikpIHsKLQkJRFBfTk9USUNFKHBfaHdmbiwgIk1GVyBpcyBub3QgaW5pdGlhbGl6ZWQgIVxuIik7CisJCURQX05PVElDRShwX2h3Zm4sICJNRlcgaXMgbm90IGluaXRpYWxpemVkIVxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCkBAIC0zOTgsOSArMzg5LDM2IEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCBxZWRfbWNwX252bV9yZF9jbWQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCSAgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCSAgICAgICB1MzIgY21kLAorCQkgICAgICAgdTMyIHBhcmFtLAorCQkgICAgICAgdTMyICpvX21jcF9yZXNwLAorCQkgICAgICAgdTMyICpvX21jcF9wYXJhbSwgdTMyICpvX3R4bl9zaXplLCB1MzIgKm9fYnVmKQoreworCXN0cnVjdCBxZWRfbWNwX21iX3BhcmFtcyBtYl9wYXJhbXM7CisJdW5pb24gZHJ2X3VuaW9uX2RhdGEgdW5pb25fZGF0YTsKKwlpbnQgcmM7CisKKwltZW1zZXQoJm1iX3BhcmFtcywgMCwgc2l6ZW9mKG1iX3BhcmFtcykpOworCW1iX3BhcmFtcy5jbWQgPSBjbWQ7CisJbWJfcGFyYW1zLnBhcmFtID0gcGFyYW07CisJbWJfcGFyYW1zLnBfZGF0YV9kc3QgPSAmdW5pb25fZGF0YTsKKwlyYyA9IHFlZF9tY3BfY21kX2FuZF91bmlvbihwX2h3Zm4sIHBfcHR0LCAmbWJfcGFyYW1zKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCSpvX21jcF9yZXNwID0gbWJfcGFyYW1zLm1jcF9yZXNwOworCSpvX21jcF9wYXJhbSA9IG1iX3BhcmFtcy5tY3BfcGFyYW07CisKKwkqb190eG5fc2l6ZSA9ICpvX21jcF9wYXJhbTsKKwltZW1jcHkob19idWYsICZ1bmlvbl9kYXRhLnJhd19kYXRhLCAqb190eG5fc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKwogaW50IHFlZF9tY3BfbG9hZF9yZXEoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCSAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAotCQkgICAgIHUzMiAqcF9sb2FkX2NvZGUpCisJCSAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1MzIgKnBfbG9hZF9jb2RlKQogewogCXN0cnVjdCBxZWRfZGV2ICpjZGV2ID0gcF9od2ZuLT5jZGV2OwogCXN0cnVjdCBxZWRfbWNwX21iX3BhcmFtcyBtYl9wYXJhbXM7CkBAIC01MjcsOCArNTQ1LDcgQEAKIAkJICAgIlJlY2VpdmVkIHRyYW5zY2VpdmVyIHN0YXRlIHVwZGF0ZSBbMHglMDh4XSBmcm9tIG1mdyBbQWRkciAweCV4XVxuIiwKIAkJICAgdHJhbnNjZWl2ZXJfc3RhdGUsCiAJCSAgICh1MzIpKHBfaHdmbi0+bWNwX2luZm8tPnBvcnRfYWRkciArCi0JCQkgb2Zmc2V0b2Yoc3RydWN0IHB1YmxpY19wb3J0LAotCQkJCSAgdHJhbnNjZWl2ZXJfZGF0YSkpKTsKKwkJCSAgb2Zmc2V0b2Yoc3RydWN0IHB1YmxpY19wb3J0LCB0cmFuc2NlaXZlcl9kYXRhKSkpOwogCiAJdHJhbnNjZWl2ZXJfc3RhdGUgPSBHRVRfRklFTEQodHJhbnNjZWl2ZXJfc3RhdGUsCiAJCQkJICAgICAgRVRIX1RSQU5TQ0VJVkVSX1NUQVRFKTsKQEAgLTU0MCw4ICs1NTcsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBxZWRfbWNwX2hhbmRsZV9saW5rX2NoYW5nZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCQkgICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAotCQkJCSAgICAgICBib29sIGJfcmVzZXQpCisJCQkJICAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgYm9vbCBiX3Jlc2V0KQogewogCXN0cnVjdCBxZWRfbWNwX2xpbmtfc3RhdGUgKnBfbGluazsKIAl1OCBtYXhfYncsIG1pbl9idzsKQEAgLTU1Nyw4ICs1NzMsNyBAQAogCQkJICAgIlJlY2VpdmVkIGxpbmsgdXBkYXRlIFsweCUwOHhdIGZyb20gbWZ3IFtBZGRyIDB4JXhdXG4iLAogCQkJICAgc3RhdHVzLAogCQkJICAgKHUzMikocF9od2ZuLT5tY3BfaW5mby0+cG9ydF9hZGRyICsKLQkJCQkgb2Zmc2V0b2Yoc3RydWN0IHB1YmxpY19wb3J0LAotCQkJCQkgIGxpbmtfc3RhdHVzKSkpOworCQkJCSBvZmZzZXRvZihzdHJ1Y3QgcHVibGljX3BvcnQsIGxpbmtfc3RhdHVzKSkpOwogCX0gZWxzZSB7CiAJCURQX1ZFUkJPU0UocF9od2ZuLCBORVRJRl9NU0dfTElOSywKIAkJCSAgICJSZXNldHRpbmcgbGluayBpbmRpY2F0aW9uc1xuIik7CkBAIC02MzUsNiArNjUwLDkgQEAKIAkJKHN0YXR1cyAmIExJTktfU1RBVFVTX0xJTktfUEFSVE5FUl8yMEdfQ0FQQUJMRSkgPwogCQlRRURfTElOS19QQVJUTkVSX1NQRUVEXzIwRyA6IDA7CiAJcF9saW5rLT5wYXJ0bmVyX2Fkdl9zcGVlZCB8PQorCQkoc3RhdHVzICYgTElOS19TVEFUVVNfTElOS19QQVJUTkVSXzI1R19DQVBBQkxFKSA/CisJCVFFRF9MSU5LX1BBUlRORVJfU1BFRURfMjVHIDogMDsKKwlwX2xpbmstPnBhcnRuZXJfYWR2X3NwZWVkIHw9CiAJCShzdGF0dXMgJiBMSU5LX1NUQVRVU19MSU5LX1BBUlRORVJfNDBHX0NBUEFCTEUpID8KIAkJUUVEX0xJTktfUEFSVE5FUl9TUEVFRF80MEcgOiAwOwogCXBfbGluay0+cGFydG5lcl9hZHZfc3BlZWQgfD0KQEAgLTcyMiw2ICs3NDAsNDggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgcWVkX21jcF9zZW5kX3Byb3RvY29sX3N0YXRzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQlzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJCWVudW0gTUZXX0RSVl9NU0dfVFlQRSB0eXBlKQoreworCWVudW0gcWVkX21jcF9wcm90b2NvbF90eXBlIHN0YXRzX3R5cGU7CisJdW5pb24gcWVkX21jcF9wcm90b2NvbF9zdGF0cyBzdGF0czsKKwlzdHJ1Y3QgcWVkX21jcF9tYl9wYXJhbXMgbWJfcGFyYW1zOworCXVuaW9uIGRydl91bmlvbl9kYXRhIHVuaW9uX2RhdGE7CisJdTMyIGhzaV9wYXJhbTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgTUZXX0RSVl9NU0dfR0VUX0xBTl9TVEFUUzoKKwkJc3RhdHNfdHlwZSA9IFFFRF9NQ1BfTEFOX1NUQVRTOworCQloc2lfcGFyYW0gPSBEUlZfTVNHX0NPREVfU1RBVFNfVFlQRV9MQU47CisJCWJyZWFrOworCWNhc2UgTUZXX0RSVl9NU0dfR0VUX0ZDT0VfU1RBVFM6CisJCXN0YXRzX3R5cGUgPSBRRURfTUNQX0ZDT0VfU1RBVFM7CisJCWhzaV9wYXJhbSA9IERSVl9NU0dfQ09ERV9TVEFUU19UWVBFX0ZDT0U7CisJCWJyZWFrOworCWNhc2UgTUZXX0RSVl9NU0dfR0VUX0lTQ1NJX1NUQVRTOgorCQlzdGF0c190eXBlID0gUUVEX01DUF9JU0NTSV9TVEFUUzsKKwkJaHNpX3BhcmFtID0gRFJWX01TR19DT0RFX1NUQVRTX1RZUEVfSVNDU0k7CisJCWJyZWFrOworCWNhc2UgTUZXX0RSVl9NU0dfR0VUX1JETUFfU1RBVFM6CisJCXN0YXRzX3R5cGUgPSBRRURfTUNQX1JETUFfU1RBVFM7CisJCWhzaV9wYXJhbSA9IERSVl9NU0dfQ09ERV9TVEFUU19UWVBFX1JETUE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURQX05PVElDRShwX2h3Zm4sICJJbnZhbGlkIHByb3RvY29sIHR5cGUgJWRcbiIsIHR5cGUpOworCQlyZXR1cm47CisJfQorCisJcWVkX2dldF9wcm90b2NvbF9zdGF0cyhwX2h3Zm4tPmNkZXYsIHN0YXRzX3R5cGUsICZzdGF0cyk7CisKKwltZW1zZXQoJm1iX3BhcmFtcywgMCwgc2l6ZW9mKG1iX3BhcmFtcykpOworCW1iX3BhcmFtcy5jbWQgPSBEUlZfTVNHX0NPREVfR0VUX1NUQVRTOworCW1iX3BhcmFtcy5wYXJhbSA9IGhzaV9wYXJhbTsKKwltZW1jcHkoJnVuaW9uX2RhdGEsICZzdGF0cywgc2l6ZW9mKHN0YXRzKSk7CisJbWJfcGFyYW1zLnBfZGF0YV9zcmMgPSAmdW5pb25fZGF0YTsKKwlxZWRfbWNwX2NtZF9hbmRfdW5pb24ocF9od2ZuLCBwX3B0dCwgJm1iX3BhcmFtcyk7Cit9CisKIHN0YXRpYyB2b2lkIHFlZF9yZWFkX3BmX2JhbmR3aWR0aChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKIAkJCQkgIHN0cnVjdCBwdWJsaWNfZnVuYyAqcF9zaG1lbV9pbmZvKQogewpAQCAtNzUyLDggKzgxMiw3IEBACiAKIHN0YXRpYyB1MzIgcWVkX21jcF9nZXRfc2htZW1fZnVuYyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKIAkJCQkgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKLQkJCQkgIHN0cnVjdCBwdWJsaWNfZnVuYyAqcF9kYXRhLAotCQkJCSAgaW50IHBmaWQpCisJCQkJICBzdHJ1Y3QgcHVibGljX2Z1bmMgKnBfZGF0YSwgaW50IHBmaWQpCiB7CiAJdTMyIGFkZHIgPSBTRUNUSU9OX09GRlNJWkVfQUREUihwX2h3Zm4tPm1jcF9pbmZvLT5wdWJsaWNfYmFzZSwKIAkJCQkJUFVCTElDX0ZVTkMpOwpAQCAtNzYzLDUxICs4MjIsMjAgQEAKIAogCW1lbXNldChwX2RhdGEsIDAsIHNpemVvZigqcF9kYXRhKSk7CiAKLQlzaXplID0gbWluX3QodTMyLCBzaXplb2YoKnBfZGF0YSksCi0JCSAgICAgUUVEX1NFQ1RJT05fU0laRShtZndfcGF0aF9vZmZzaXplKSk7CisJc2l6ZSA9IG1pbl90KHUzMiwgc2l6ZW9mKCpwX2RhdGEpLCBRRURfU0VDVElPTl9TSVpFKG1md19wYXRoX29mZnNpemUpKTsKIAlmb3IgKGkgPSAwOyBpIDwgc2l6ZSAvIHNpemVvZih1MzIpOyBpKyspCiAJCSgodTMyICopcF9kYXRhKVtpXSA9IHFlZF9yZChwX2h3Zm4sIHBfcHR0LAogCQkJCQkgICAgZnVuY19hZGRyICsgKGkgPDwgMikpOwogCXJldHVybiBzaXplOwogfQogCi1pbnQgcWVkX2h3X2luaXRfZmlyc3RfZXRoKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHU4ICpwX3BmKQotewotCXN0cnVjdCBwdWJsaWNfZnVuYyBzaG1lbV9pbmZvOwotCWludCBpOwotCi0JLyogRmluZCBmaXJzdCBFdGhlcm5ldCBpbnRlcmZhY2UgaW4gcG9ydCAqLwotCWZvciAoaSA9IDA7IGkgPCBOVU1fT0ZfRU5HX1BGUyhwX2h3Zm4tPmNkZXYpOwotCSAgICAgaSArPSBwX2h3Zm4tPmNkZXYtPm51bV9wb3J0c19pbl9lbmdpbmVzKSB7Ci0JCXFlZF9tY3BfZ2V0X3NobWVtX2Z1bmMocF9od2ZuLCBwX3B0dCwgJnNobWVtX2luZm8sCi0JCQkJICAgICAgIE1DUF9QRl9JRF9CWV9SRUwocF9od2ZuLCBpKSk7Ci0KLQkJaWYgKHNobWVtX2luZm8uY29uZmlnICYgRlVOQ19NRl9DRkdfRlVOQ19ISURFKQotCQkJY29udGludWU7Ci0KLQkJaWYgKChzaG1lbV9pbmZvLmNvbmZpZyAmIEZVTkNfTUZfQ0ZHX1BST1RPQ09MX01BU0spID09Ci0JCSAgICBGVU5DX01GX0NGR19QUk9UT0NPTF9FVEhFUk5FVCkgewotCQkJKnBfcGYgPSAodTgpaTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JRFBfTk9USUNFKHBfaHdmbiwKLQkJICAiRmFpbGVkIHRvIGZpbmQgb24gcG9ydCBhbiBldGhlcm5ldCBpbnRlcmZhY2UgaW4gTUZfU0kgbW9kZVxuIik7Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIHZvaWQgcWVkX21jcF91cGRhdGVfYncoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCQkgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCitzdGF0aWMgdm9pZCBxZWRfbWNwX3VwZGF0ZV9idyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQogewogCXN0cnVjdCBxZWRfbWNwX2Z1bmN0aW9uX2luZm8gKnBfaW5mbzsKIAlzdHJ1Y3QgcHVibGljX2Z1bmMgc2htZW1faW5mbzsKIAl1MzIgcmVzcCA9IDAsIHBhcmFtID0gMDsKIAotCXFlZF9tY3BfZ2V0X3NobWVtX2Z1bmMocF9od2ZuLCBwX3B0dCwgJnNobWVtX2luZm8sCi0JCQkgICAgICAgTUNQX1BGX0lEKHBfaHdmbikpOworCXFlZF9tY3BfZ2V0X3NobWVtX2Z1bmMocF9od2ZuLCBwX3B0dCwgJnNobWVtX2luZm8sIE1DUF9QRl9JRChwX2h3Zm4pKTsKIAogCXFlZF9yZWFkX3BmX2JhbmR3aWR0aChwX2h3Zm4sICZzaG1lbV9pbmZvKTsKIApAQCAtODY3LDYgKzg5NSwxMiBAQAogCQljYXNlIE1GV19EUlZfTVNHX1RSQU5TQ0VJVkVSX1NUQVRFX0NIQU5HRToKIAkJCXFlZF9tY3BfaGFuZGxlX3RyYW5zY2VpdmVyX2NoYW5nZShwX2h3Zm4sIHBfcHR0KTsKIAkJCWJyZWFrOworCQljYXNlIE1GV19EUlZfTVNHX0dFVF9MQU5fU1RBVFM6CisJCWNhc2UgTUZXX0RSVl9NU0dfR0VUX0ZDT0VfU1RBVFM6CisJCWNhc2UgTUZXX0RSVl9NU0dfR0VUX0lTQ1NJX1NUQVRTOgorCQljYXNlIE1GV19EUlZfTVNHX0dFVF9SRE1BX1NUQVRTOgorCQkJcWVkX21jcF9zZW5kX3Byb3RvY29sX3N0YXRzKHBfaHdmbiwgcF9wdHQsIGkpOworCQkJYnJlYWs7CiAJCWNhc2UgTUZXX0RSVl9NU0dfQldfVVBEQVRFOgogCQkJcWVkX21jcF91cGRhdGVfYncocF9od2ZuLCBwX3B0dCk7CiAJCQlicmVhazsKQEAgLTk0MCw4ICs5NzQsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgcWVkX21jcF9nZXRfbWVkaWFfdHlwZShzdHJ1Y3QgcWVkX2RldiAqY2RldiwKLQkJCSAgIHUzMiAqcF9tZWRpYV90eXBlKQoraW50IHFlZF9tY3BfZ2V0X21lZGlhX3R5cGUoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHUzMiAqcF9tZWRpYV90eXBlKQogewogCXN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuID0gJmNkZXYtPmh3Zm5zWzBdOwogCXN0cnVjdCBxZWRfcHR0ICAqcF9wdHQ7CkBAIC05NTAsNyArOTgzLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoIXFlZF9tY3BfaXNfaW5pdChwX2h3Zm4pKSB7Ci0JCURQX05PVElDRShwX2h3Zm4sICJNRlcgaXMgbm90IGluaXRpYWxpemVkICFcbiIpOworCQlEUF9OT1RJQ0UocF9od2ZuLCAiTUZXIGlzIG5vdCBpbml0aWFsaXplZCFcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIApAQCAtMTAwMywxNSArMTAzNiwxMyBAQAogCXN0cnVjdCBxZWRfbWNwX2Z1bmN0aW9uX2luZm8gKmluZm87CiAJc3RydWN0IHB1YmxpY19mdW5jIHNobWVtX2luZm87CiAKLQlxZWRfbWNwX2dldF9zaG1lbV9mdW5jKHBfaHdmbiwgcF9wdHQsICZzaG1lbV9pbmZvLAotCQkJICAgICAgIE1DUF9QRl9JRChwX2h3Zm4pKTsKKwlxZWRfbWNwX2dldF9zaG1lbV9mdW5jKHBfaHdmbiwgcF9wdHQsICZzaG1lbV9pbmZvLCBNQ1BfUEZfSUQocF9od2ZuKSk7CiAJaW5mbyA9ICZwX2h3Zm4tPm1jcF9pbmZvLT5mdW5jX2luZm87CiAKIAlpbmZvLT5wYXVzZV9vbl9ob3N0ID0gKHNobWVtX2luZm8uY29uZmlnICYKIAkJCSAgICAgICBGVU5DX01GX0NGR19QQVVTRV9PTl9IT1NUX1JJTkcpID8gMSA6IDA7CiAKLQlpZiAocWVkX21jcF9nZXRfc2htZW1fcHJvdG8ocF9od2ZuLCAmc2htZW1faW5mbywKLQkJCQkgICAgJmluZm8tPnByb3RvY29sKSkgeworCWlmIChxZWRfbWNwX2dldF9zaG1lbV9wcm90byhwX2h3Zm4sICZzaG1lbV9pbmZvLCAmaW5mby0+cHJvdG9jb2wpKSB7CiAJCURQX0VSUihwX2h3Zm4sICJVbmtub3duIHBlcnNvbmFsaXR5ICUwOHhcbiIsCiAJCSAgICAgICAodTMyKShzaG1lbV9pbmZvLmNvbmZpZyAmIEZVTkNfTUZfQ0ZHX1BST1RPQ09MX01BU0spKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMDcyLDE1ICsxMTAzLDEzIEBACiAJcmV0dXJuICZwX2h3Zm4tPm1jcF9pbmZvLT5saW5rX2NhcGFiaWxpdGllczsKIH0KIAotaW50IHFlZF9tY3BfZHJhaW4oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCSAgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQoraW50IHFlZF9tY3BfZHJhaW4oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKIHsKIAl1MzIgcmVzcCA9IDAsIHBhcmFtID0gMDsKIAlpbnQgcmM7CiAKIAlyYyA9IHFlZF9tY3BfY21kKHBfaHdmbiwgcF9wdHQsCi0JCQkgRFJWX01TR19DT0RFX05JR19EUkFJTiwgMTAwMCwKLQkJCSAmcmVzcCwgJnBhcmFtKTsKKwkJCSBEUlZfTVNHX0NPREVfTklHX0RSQUlOLCAxMDAwLCAmcmVzcCwgJnBhcmFtKTsKIAogCS8qIFdhaXQgZm9yIHRoZSBkcmFpbiB0byBjb21wbGV0ZSBiZWZvcmUgcmV0dXJuaW5nICovCiAJbXNsZWVwKDEwMjApOwpAQCAtMTA4OSw4ICsxMTE4LDcgQEAKIH0KIAogaW50IHFlZF9tY3BfZ2V0X2ZsYXNoX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCQkgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCi0JCQkgICB1MzIgKnBfZmxhc2hfc2l6ZSkKKwkJCSAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgdTMyICpwX2ZsYXNoX3NpemUpCiB7CiAJdTMyIGZsYXNoX3NpemU7CiAKQEAgLTExNTMsOCArMTE4MSw4IEBACiAJcF9kcnZfdmVyc2lvbiA9ICZ1bmlvbl9kYXRhLmRydl92ZXJzaW9uOwogCXBfZHJ2X3ZlcnNpb24tPnZlcnNpb24gPSBwX3Zlci0+dmVyc2lvbjsKIAotCWZvciAoaSA9IDA7IGkgPCBNQ1BfRFJWX1ZFUl9TVFJfU0laRSAtIDE7IGkgKz0gNCkgewotCQl2YWwgPSBjcHVfdG9fYmUzMihwX3Zlci0+bmFtZVtpXSk7CisJZm9yIChpID0gMDsgaSA8IChNQ1BfRFJWX1ZFUl9TVFJfU0laRSAtIDQpIC8gc2l6ZW9mKHUzMik7IGkrKykgeworCQl2YWwgPSBjcHVfdG9fYmUzMigqKCh1MzIgKikmcF92ZXItPm5hbWVbaSAqIHNpemVvZih1MzIpXSkpOwogCQkqKF9fYmUzMiAqKSZwX2Rydl92ZXJzaW9uLT5uYW1lW2kgKiBzaXplb2YodTMyKV0gPSB2YWw7CiAJfQogCkBAIC0xMTY4LDggKzExOTYsMzUgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludCBxZWRfbWNwX3NldF9sZWQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKLQkJICAgIGVudW0gcWVkX2xlZF9tb2RlIG1vZGUpCitpbnQgcWVkX21jcF9oYWx0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCit7CisJdTMyIHJlc3AgPSAwLCBwYXJhbSA9IDA7CisJaW50IHJjOworCisJcmMgPSBxZWRfbWNwX2NtZChwX2h3Zm4sIHBfcHR0LCBEUlZfTVNHX0NPREVfTUNQX0hBTFQsIDAsICZyZXNwLAorCQkJICZwYXJhbSk7CisJaWYgKHJjKQorCQlEUF9FUlIocF9od2ZuLCAiTUNQIHJlc3BvbnNlIGZhaWx1cmUsIGFib3J0aW5nXG4iKTsKKworCXJldHVybiByYzsKK30KKworaW50IHFlZF9tY3BfcmVzdW1lKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCit7CisJdTMyIHZhbHVlLCBjcHVfbW9kZTsKKworCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBNQ1BfUkVHX0NQVV9TVEFURSwgMHhmZmZmZmZmZik7CisKKwl2YWx1ZSA9IHFlZF9yZChwX2h3Zm4sIHBfcHR0LCBNQ1BfUkVHX0NQVV9NT0RFKTsKKwl2YWx1ZSAmPSB+TUNQX1JFR19DUFVfTU9ERV9TT0ZUX0hBTFQ7CisJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIE1DUF9SRUdfQ1BVX01PREUsIHZhbHVlKTsKKwljcHVfbW9kZSA9IHFlZF9yZChwX2h3Zm4sIHBfcHR0LCBNQ1BfUkVHX0NQVV9NT0RFKTsKKworCXJldHVybiAoY3B1X21vZGUgJiBNQ1BfUkVHX0NQVV9NT0RFX1NPRlRfSEFMVCkgPyAtRUFHQUlOIDogMDsKK30KKworaW50IHFlZF9tY3Bfc2V0X2xlZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgZW51bSBxZWRfbGVkX21vZGUgbW9kZSkKIHsKIAl1MzIgcmVzcCA9IDAsIHBhcmFtID0gMCwgZHJ2X21iX3BhcmFtOwogCWludCByYzsKQEAgLTExOTUsNiArMTI1MCwyNyBAQAogCXJldHVybiByYzsKIH0KIAoraW50IHFlZF9tY3BfbWFza19wYXJpdGllcyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1MzIgbWFza19wYXJpdGllcykKK3sKKwl1MzIgcmVzcCA9IDAsIHBhcmFtID0gMDsKKwlpbnQgcmM7CisKKwlyYyA9IHFlZF9tY3BfY21kKHBfaHdmbiwgcF9wdHQsIERSVl9NU0dfQ09ERV9NQVNLX1BBUklUSUVTLAorCQkJIG1hc2tfcGFyaXRpZXMsICZyZXNwLCAmcGFyYW0pOworCisJaWYgKHJjKSB7CisJCURQX0VSUihwX2h3Zm4sCisJCSAgICAgICAiTUNQIHJlc3BvbnNlIGZhaWx1cmUgZm9yIG1hc2sgcGFyaXRpZXMsIGFib3J0aW5nXG4iKTsKKwl9IGVsc2UgaWYgKHJlc3AgIT0gRldfTVNHX0NPREVfT0spIHsKKwkJRFBfRVJSKHBfaHdmbiwKKwkJICAgICAgICJNQ1AgZGlkIG5vdCBhY2tub3dsZWRnZSBtYXNrIHBhcml0eSByZXF1ZXN0LiBPbGQgTUZXP1xuIik7CisJCXJjID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKIGludCBxZWRfbWNwX2Jpc3RfcmVnaXN0ZXJfdGVzdChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQogewogCXUzMiBkcnZfbWJfcGFyYW0gPSAwLCByc3AsIHBhcmFtOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfbWNwLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9tY3AuaAppbmRleCA3ZjMxOWFhLi5kZmY1MjBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9tY3AuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9tY3AuaApAQCAtNjAsOSArNjAsMTAgQEAKICNkZWZpbmUgUUVEX0xJTktfUEFSVE5FUl9TUEVFRF8xR19GRCAgICBCSVQoMSkKICNkZWZpbmUgUUVEX0xJTktfUEFSVE5FUl9TUEVFRF8xMEcgICAgICBCSVQoMikKICNkZWZpbmUgUUVEX0xJTktfUEFSVE5FUl9TUEVFRF8yMEcgICAgICBCSVQoMykKLSNkZWZpbmUgUUVEX0xJTktfUEFSVE5FUl9TUEVFRF80MEcgICAgICBCSVQoNCkKLSNkZWZpbmUgUUVEX0xJTktfUEFSVE5FUl9TUEVFRF81MEcgICAgICBCSVQoNSkKLSNkZWZpbmUgUUVEX0xJTktfUEFSVE5FUl9TUEVFRF8xMDBHICAgICBCSVQoNikKKyNkZWZpbmUgUUVEX0xJTktfUEFSVE5FUl9TUEVFRF8yNUcgICAgICBCSVQoNCkKKyNkZWZpbmUgUUVEX0xJTktfUEFSVE5FUl9TUEVFRF80MEcgICAgICBCSVQoNSkKKyNkZWZpbmUgUUVEX0xJTktfUEFSVE5FUl9TUEVFRF81MEcgICAgICBCSVQoNikKKyNkZWZpbmUgUUVEX0xJTktfUEFSVE5FUl9TUEVFRF8xMDBHICAgICBCSVQoNykKIAl1MzIgICAgIHBhcnRuZXJfYWR2X3NwZWVkOwogCiAJYm9vbCAgICBwYXJ0bmVyX3R4X2Zsb3dfY3RybF9lbjsKQEAgLTEwNSw2ICsxMDYsNDcgQEAKIAl1OAluYW1lW01DUF9EUlZfVkVSX1NUUl9TSVpFIC0gNF07CiB9OwogCitzdHJ1Y3QgcWVkX21jcF9sYW5fc3RhdHMgeworCXU2NCB1Y2FzdF9yeF9wa3RzOworCXU2NCB1Y2FzdF90eF9wa3RzOworCXUzMiBmY3NfZXJyOworfTsKKworc3RydWN0IHFlZF9tY3BfZmNvZV9zdGF0cyB7CisJdTY0IHJ4X3BrdHM7CisJdTY0IHR4X3BrdHM7CisJdTMyIGZjc19lcnI7CisJdTMyIGxvZ2luX2ZhaWx1cmU7Cit9OworCitzdHJ1Y3QgcWVkX21jcF9pc2NzaV9zdGF0cyB7CisJdTY0IHJ4X3BkdXM7CisJdTY0IHR4X3BkdXM7CisJdTY0IHJ4X2J5dGVzOworCXU2NCB0eF9ieXRlczsKK307CisKK3N0cnVjdCBxZWRfbWNwX3JkbWFfc3RhdHMgeworCXU2NCByeF9wa3RzOworCXU2NCB0eF9wa3RzOworCXU2NCByeF9ieXRlczsKKwl1NjQgdHhfYnl0czsKK307CisKK2VudW0gcWVkX21jcF9wcm90b2NvbF90eXBlIHsKKwlRRURfTUNQX0xBTl9TVEFUUywKKwlRRURfTUNQX0ZDT0VfU1RBVFMsCisJUUVEX01DUF9JU0NTSV9TVEFUUywKKwlRRURfTUNQX1JETUFfU1RBVFMKK307CisKK3VuaW9uIHFlZF9tY3BfcHJvdG9jb2xfc3RhdHMgeworCXN0cnVjdCBxZWRfbWNwX2xhbl9zdGF0cyBsYW5fc3RhdHM7CisJc3RydWN0IHFlZF9tY3BfZmNvZV9zdGF0cyBmY29lX3N0YXRzOworCXN0cnVjdCBxZWRfbWNwX2lzY3NpX3N0YXRzIGlzY3NpX3N0YXRzOworCXN0cnVjdCBxZWRfbWNwX3JkbWFfc3RhdHMgcmRtYV9zdGF0czsKK307CisKIC8qKgogICogQGJyaWVmIC0gcmV0dXJucyB0aGUgbGluayBwYXJhbXMgb2YgdGhlIGh3IGZ1bmN0aW9uCiAgKgpAQCAtNDI2LDYgKzQ2OCwyOSBAQAogCQkgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCk7CiAKIC8qKgorICogQGJyaWVmIC0gU2VuZHMgYW4gTlZNIHJlYWQgY29tbWFuZCByZXF1ZXN0IHRvIHRoZSBNRlcgdG8gZ2V0CisgKiAgICAgICAgYSBidWZmZXIuCisgKgorICogQHBhcmFtIHBfaHdmbgorICogQHBhcmFtIHBfcHR0CisgKiBAcGFyYW0gY21kIC0gQ29tbWFuZDogRFJWX01TR19DT0RFX05WTV9HRVRfRklMRV9EQVRBIG9yCisgKiAgICAgICAgICAgIERSVl9NU0dfQ09ERV9OVk1fUkVBRF9OVlJBTSBjb21tYW5kcworICogQHBhcmFtIHBhcmFtIC0gWzA6MjNdIC0gT2Zmc2V0IFsyNDozMV0gLSBTaXplCisgKiBAcGFyYW0gb19tY3BfcmVzcCAtIE1DUCByZXNwb25zZQorICogQHBhcmFtIG9fbWNwX3BhcmFtIC0gTUNQIHJlc3BvbnNlIHBhcmFtCisgKiBAcGFyYW0gb190eG5fc2l6ZSAtICBCdWZmZXIgc2l6ZSBvdXRwdXQKKyAqIEBwYXJhbSBvX2J1ZiAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciByZXR1cm5lZCBieSB0aGUgTUZXLgorICoKKyAqIEBwYXJhbSByZXR1cm4gMCB1cG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBxZWRfbWNwX252bV9yZF9jbWQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCSAgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCSAgICAgICB1MzIgY21kLAorCQkgICAgICAgdTMyIHBhcmFtLAorCQkgICAgICAgdTMyICpvX21jcF9yZXNwLAorCQkgICAgICAgdTMyICpvX21jcF9wYXJhbSwgdTMyICpvX3R4bl9zaXplLCB1MzIgKm9fYnVmKTsKKworLyoqCiAgKiBAYnJpZWYgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIE1GVyBvYmplY3RzIFt1bmRlciBtY3BfaW5mb10gYXJlIGFjY2Vzc2libGUKICAqCiAgKiBAcGFyYW0gcF9od2ZuCkBAIC00NDcsNiArNTEyLDI2IEBACiBpbnQgcWVkX21jcF9jb25maWdfdmZfbXNpeChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKIAkJCSAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgdTggdmZfaWQsIHU4IG51bSk7CiAKKy8qKgorICogQGJyaWVmIC0gSGFsdCB0aGUgTUNQLgorICoKKyAqIEBwYXJhbSBwX2h3Zm4KKyAqIEBwYXJhbSBwX3B0dAorICoKKyAqIEBwYXJhbSByZXR1cm4gMCB1cG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBxZWRfbWNwX2hhbHQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCk7CisKKy8qKgorICogQGJyaWVmIC0gV2FrZSB1cCB0aGUgTUNQLgorICoKKyAqIEBwYXJhbSBwX2h3Zm4KKyAqIEBwYXJhbSBwX3B0dAorICoKKyAqIEBwYXJhbSByZXR1cm4gMCB1cG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBxZWRfbWNwX3Jlc3VtZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0KTsKKwogaW50IHFlZF9jb25maWd1cmVfcGZfbWluX2JhbmR3aWR0aChzdHJ1Y3QgcWVkX2RldiAqY2RldiwgdTggbWluX2J3KTsKIGludCBxZWRfY29uZmlndXJlX3BmX21heF9iYW5kd2lkdGgoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHU4IG1heF9idyk7CiBpbnQgX19xZWRfY29uZmlndXJlX3BmX21heF9iYW5kd2lkdGgoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCkBAIC00NTgsNiArNTQzLDcgQEAKIAkJCQkgICAgIHN0cnVjdCBxZWRfbWNwX2xpbmtfc3RhdGUgKnBfbGluaywKIAkJCQkgICAgIHU4IG1pbl9idyk7CiAKLWludCBxZWRfaHdfaW5pdF9maXJzdF9ldGgoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCQkgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgdTggKnBfcGYpOworaW50IHFlZF9tY3BfbWFza19wYXJpdGllcyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1MzIgbWFza19wYXJpdGllcyk7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfcmVnX2FkZHIuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3JlZ19hZGRyLmgKaW5kZXggZjZiODZjYS4uYjQxNGEwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfcmVnX2FkZHIuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9yZWdfYWRkci5oCkBAIC0xMTYsOCArMTE2LDE0IEBACiAJMHgxMDA5YzRVTAogI2RlZmluZSAgUU1fUkVHX1BGX0VOIFwKIAkweDJmMmVhNFVMCisjZGVmaW5lIFRDRkNfUkVHX1dFQUtfRU5BQkxFX1ZGIFwKKwkweDJkMDcwNFVMCiAjZGVmaW5lICBUQ0ZDX1JFR19TVFJPTkdfRU5BQkxFX1BGIFwKIAkweDJkMDcwOFVMCisjZGVmaW5lICBUQ0ZDX1JFR19TVFJPTkdfRU5BQkxFX1ZGIFwKKwkweDJkMDcwY1VMCisjZGVmaW5lIENDRkNfUkVHX1dFQUtfRU5BQkxFX1ZGIFwKKwkweDJlMDcwNFVMCiAjZGVmaW5lICBDQ0ZDX1JFR19TVFJPTkdfRU5BQkxFX1BGIFwKIAkweDJlMDcwOFVMCiAjZGVmaW5lICBQR0xVRV9CX1JFR19QR0xfQUREUl84OF9GMCBcCkBAIC0yMDIsNiArMjA4LDI2IEBACiAJMHg1MDE5NmNVTAogI2RlZmluZSBOSUdfUkVHX0xMSF9DTFNfVFlQRV9EVUFMTU9ERSBcCiAJMHg1MDE5NjRVTAorI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9WQUxVRSBcCisJMHg1MDFhMDBVTAorI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9WQUxVRV9TSVpFIFwKKwkzMgorI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9FTiBcCisJMHg1MDFhODBVTAorI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9FTl9TSVpFCVwKKwkxNgorI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9NT0RFIFwKKwkweDUwMWFjMFVMCisjZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX01PREVfU0laRSBcCisJMTYKKyNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfUFJPVE9DT0xfVFlQRSBcCisJMHg1MDFiMDBVTAorI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9QUk9UT0NPTF9UWVBFX1NJWkUgXAorCTE2CisjZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX0hEUl9TRUwJXAorCTB4NTAxYjQwVUwKKyNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfSERSX1NFTF9TSVpFIFwKKwkxNgogI2RlZmluZSAgTkNTSV9SRUdfQ09ORklHCVwKIAkweDA0MDIwMFVMCiAjZGVmaW5lICBQQkZfUkVHX0lOSVQgXApAQCAtMjU4LDYgKzI4NCw4IEBACiAJMHgxZjBhMWNVTAogI2RlZmluZSBQUlNfUkVHX1JPQ0VfREVTVF9RUF9NQVhfUEYgXAogCTB4MWYwNDMwVUwKKyNkZWZpbmUgUFJTX1JFR19VU0VfTElHSFRfTDIgXAorCTB4MWYwOTZjVUwKICNkZWZpbmUgIFBTRE1fUkVHX0VOQUJMRV9JTjEgXAogCTB4ZmEwMDA0VUwKICNkZWZpbmUgIFBTRU1fUkVHX0VOQUJMRV9JTiBcCkBAIC01MjEsNCArNTQ5LDkxMCBAQAogCiAjZGVmaW5lIFFNX1JFR19XRlFQRldFSUdIVAkweDJmNGU4MFVMCiAjZGVmaW5lIFFNX1JFR19XRlFWUFdFSUdIVAkweDJmYTAwMFVMCisKKyNkZWZpbmUgUEdMQ1NfUkVHX0RCR19TRUxFQ1QgXAorCTB4MDAxZDE0VUwKKyNkZWZpbmUgUEdMQ1NfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MDAxZDE4VUwKKyNkZWZpbmUgUEdMQ1NfUkVHX0RCR19TSElGVCBcCisJMHgwMDFkMWNVTAorI2RlZmluZSBQR0xDU19SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweDAwMWQyMFVMCisjZGVmaW5lIFBHTENTX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4MDAxZDI0VUwKKyNkZWZpbmUgTUlTQ19SRUdfUkVTRVRfUExfUERBX1ZNQUlOXzEgXAorCTB4MDA4MDcwVUwKKyNkZWZpbmUgTUlTQ19SRUdfUkVTRVRfUExfUERBX1ZNQUlOXzIgXAorCTB4MDA4MDgwVUwKKyNkZWZpbmUgTUlTQ19SRUdfUkVTRVRfUExfUERBX1ZBVVggXAorCTB4MDA4MDkwVUwKKyNkZWZpbmUgTUlTQ1NfUkVHX1JFU0VUX1BMX1VBIFwKKwkweDAwOTA1MFVMCisjZGVmaW5lIE1JU0NTX1JFR19SRVNFVF9QTF9IViBcCisJMHgwMDkwNjBVTAorI2RlZmluZSBNSVNDU19SRUdfUkVTRVRfUExfSFZfMglcCisJMHgwMDkxNTBVTAorI2RlZmluZSBETUFFX1JFR19EQkdfU0VMRUNUIFwKKwkweDAwYzUxMFVMCisjZGVmaW5lIERNQUVfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MDBjNTE0VUwKKyNkZWZpbmUgRE1BRV9SRUdfREJHX1NISUZUIFwKKwkweDAwYzUxOFVMCisjZGVmaW5lIERNQUVfUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHgwMGM1MWNVTAorI2RlZmluZSBETUFFX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4MDBjNTIwVUwKKyNkZWZpbmUgTkNTSV9SRUdfREJHX1NFTEVDVCBcCisJMHgwNDA0NzRVTAorI2RlZmluZSBOQ1NJX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDA0MDQ3OFVMCisjZGVmaW5lIE5DU0lfUkVHX0RCR19TSElGVCBcCisJMHgwNDA0N2NVTAorI2RlZmluZSBOQ1NJX1JFR19EQkdfRk9SQ0VfVkFMSUQgXAorCTB4MDQwNDgwVUwKKyNkZWZpbmUgTkNTSV9SRUdfREJHX0ZPUkNFX0ZSQU1FIFwKKwkweDA0MDQ4NFVMCisjZGVmaW5lIEdSQ19SRUdfREJHX1NFTEVDVCBcCisJMHgwNTAwYTRVTAorI2RlZmluZSBHUkNfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MDUwMGE4VUwKKyNkZWZpbmUgR1JDX1JFR19EQkdfU0hJRlQgXAorCTB4MDUwMGFjVUwKKyNkZWZpbmUgR1JDX1JFR19EQkdfRk9SQ0VfVkFMSUQJXAorCTB4MDUwMGIwVUwKKyNkZWZpbmUgR1JDX1JFR19EQkdfRk9SQ0VfRlJBTUUJXAorCTB4MDUwMGI0VUwKKyNkZWZpbmUgVU1BQ19SRUdfREJHX1NFTEVDVCBcCisJMHgwNTEwOTRVTAorI2RlZmluZSBVTUFDX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDA1MTA5OFVMCisjZGVmaW5lIFVNQUNfUkVHX0RCR19TSElGVCBcCisJMHgwNTEwOWNVTAorI2RlZmluZSBVTUFDX1JFR19EQkdfRk9SQ0VfVkFMSUQgXAorCTB4MDUxMGEwVUwKKyNkZWZpbmUgVU1BQ19SRUdfREJHX0ZPUkNFX0ZSQU1FIFwKKwkweDA1MTBhNFVMCisjZGVmaW5lIE1DUDJfUkVHX0RCR19TRUxFQ1QgXAorCTB4MDUyNDAwVUwKKyNkZWZpbmUgTUNQMl9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHgwNTI0MDRVTAorI2RlZmluZSBNQ1AyX1JFR19EQkdfU0hJRlQgXAorCTB4MDUyNDA4VUwKKyNkZWZpbmUgTUNQMl9SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweDA1MjQ0MFVMCisjZGVmaW5lIE1DUDJfUkVHX0RCR19GT1JDRV9GUkFNRSBcCisJMHgwNTI0NDRVTAorI2RlZmluZSBQQ0lFX1JFR19EQkdfU0VMRUNUIFwKKwkweDA1NDdlOFVMCisjZGVmaW5lIFBDSUVfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MDU0N2VjVUwKKyNkZWZpbmUgUENJRV9SRUdfREJHX1NISUZUIFwKKwkweDA1NDdmMFVMCisjZGVmaW5lIFBDSUVfUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHgwNTQ3ZjRVTAorI2RlZmluZSBQQ0lFX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4MDU0N2Y4VUwKKyNkZWZpbmUgRE9SUV9SRUdfREJHX1NFTEVDVCBcCisJMHgxMDBhZDBVTAorI2RlZmluZSBET1JRX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDEwMGFkNFVMCisjZGVmaW5lIERPUlFfUkVHX0RCR19TSElGVCBcCisJMHgxMDBhZDhVTAorI2RlZmluZSBET1JRX1JFR19EQkdfRk9SQ0VfVkFMSUQgXAorCTB4MTAwYWRjVUwKKyNkZWZpbmUgRE9SUV9SRUdfREJHX0ZPUkNFX0ZSQU1FIFwKKwkweDEwMGFlMFVMCisjZGVmaW5lIElHVV9SRUdfREJHX1NFTEVDVCBcCisJMHgxODE1NzhVTAorI2RlZmluZSBJR1VfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MTgxNTdjVUwKKyNkZWZpbmUgSUdVX1JFR19EQkdfU0hJRlQgXAorCTB4MTgxNTgwVUwKKyNkZWZpbmUgSUdVX1JFR19EQkdfRk9SQ0VfVkFMSUQJXAorCTB4MTgxNTg0VUwKKyNkZWZpbmUgSUdVX1JFR19EQkdfRk9SQ0VfRlJBTUUJXAorCTB4MTgxNTg4VUwKKyNkZWZpbmUgQ0FVX1JFR19EQkdfU0VMRUNUIFwKKwkweDFjMGVhOFVMCisjZGVmaW5lIENBVV9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHgxYzBlYWNVTAorI2RlZmluZSBDQVVfUkVHX0RCR19TSElGVCBcCisJMHgxYzBlYjBVTAorI2RlZmluZSBDQVVfUkVHX0RCR19GT1JDRV9WQUxJRAlcCisJMHgxYzBlYjRVTAorI2RlZmluZSBDQVVfUkVHX0RCR19GT1JDRV9GUkFNRQlcCisJMHgxYzBlYjhVTAorI2RlZmluZSBQUlNfUkVHX0RCR19TRUxFQ1QgXAorCTB4MWYwYjZjVUwKKyNkZWZpbmUgUFJTX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDFmMGI3MFVMCisjZGVmaW5lIFBSU19SRUdfREJHX1NISUZUIFwKKwkweDFmMGI3NFVMCisjZGVmaW5lIFBSU19SRUdfREJHX0ZPUkNFX1ZBTElECVwKKwkweDFmMGJhMFVMCisjZGVmaW5lIFBSU19SRUdfREJHX0ZPUkNFX0ZSQU1FCVwKKwkweDFmMGJhNFVMCisjZGVmaW5lIENOSUdfUkVHX0RCR19TRUxFQ1RfSzIgXAorCTB4MjE4MjU0VUwKKyNkZWZpbmUgQ05JR19SRUdfREJHX0RXT1JEX0VOQUJMRV9LMiBcCisJMHgyMTgyNThVTAorI2RlZmluZSBDTklHX1JFR19EQkdfU0hJRlRfSzIgXAorCTB4MjE4MjVjVUwKKyNkZWZpbmUgQ05JR19SRUdfREJHX0ZPUkNFX1ZBTElEX0syIFwKKwkweDIxODI2MFVMCisjZGVmaW5lIENOSUdfUkVHX0RCR19GT1JDRV9GUkFNRV9LMiBcCisJMHgyMTgyNjRVTAorI2RlZmluZSBQUk1fUkVHX0RCR19TRUxFQ1QgXAorCTB4MjMwNmE4VUwKKyNkZWZpbmUgUFJNX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDIzMDZhY1VMCisjZGVmaW5lIFBSTV9SRUdfREJHX1NISUZUIFwKKwkweDIzMDZiMFVMCisjZGVmaW5lIFBSTV9SRUdfREJHX0ZPUkNFX1ZBTElECVwKKwkweDIzMDZiNFVMCisjZGVmaW5lIFBSTV9SRUdfREJHX0ZPUkNFX0ZSQU1FCVwKKwkweDIzMDZiOFVMCisjZGVmaW5lIFNSQ19SRUdfREJHX1NFTEVDVCBcCisJMHgyMzg3MDBVTAorI2RlZmluZSBTUkNfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MjM4NzA0VUwKKyNkZWZpbmUgU1JDX1JFR19EQkdfU0hJRlQgXAorCTB4MjM4NzA4VUwKKyNkZWZpbmUgU1JDX1JFR19EQkdfRk9SQ0VfVkFMSUQJXAorCTB4MjM4NzBjVUwKKyNkZWZpbmUgU1JDX1JFR19EQkdfRk9SQ0VfRlJBTUUJXAorCTB4MjM4NzEwVUwKKyNkZWZpbmUgUlNTX1JFR19EQkdfU0VMRUNUIFwKKwkweDIzOGM0Y1VMCisjZGVmaW5lIFJTU19SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHgyMzhjNTBVTAorI2RlZmluZSBSU1NfUkVHX0RCR19TSElGVCBcCisJMHgyMzhjNTRVTAorI2RlZmluZSBSU1NfUkVHX0RCR19GT1JDRV9WQUxJRAlcCisJMHgyMzhjNThVTAorI2RlZmluZSBSU1NfUkVHX0RCR19GT1JDRV9GUkFNRQlcCisJMHgyMzhjNWNVTAorI2RlZmluZSBSUEJfUkVHX0RCR19TRUxFQ1QgXAorCTB4MjNjNzI4VUwKKyNkZWZpbmUgUlBCX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDIzYzcyY1VMCisjZGVmaW5lIFJQQl9SRUdfREJHX1NISUZUIFwKKwkweDIzYzczMFVMCisjZGVmaW5lIFJQQl9SRUdfREJHX0ZPUkNFX1ZBTElECVwKKwkweDIzYzczNFVMCisjZGVmaW5lIFJQQl9SRUdfREJHX0ZPUkNFX0ZSQU1FCVwKKwkweDIzYzczOFVMCisjZGVmaW5lIFBTV1JRMl9SRUdfREJHX1NFTEVDVCBcCisJMHgyNDAxMDBVTAorI2RlZmluZSBQU1dSUTJfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MjQwMTA0VUwKKyNkZWZpbmUgUFNXUlEyX1JFR19EQkdfU0hJRlQgXAorCTB4MjQwMTA4VUwKKyNkZWZpbmUgUFNXUlEyX1JFR19EQkdfRk9SQ0VfVkFMSUQgXAorCTB4MjQwMTBjVUwKKyNkZWZpbmUgUFNXUlEyX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4MjQwMTEwVUwKKyNkZWZpbmUgUFNXUlFfUkVHX0RCR19TRUxFQ1QgXAorCTB4MjgwMDIwVUwKKyNkZWZpbmUgUFNXUlFfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MjgwMDI0VUwKKyNkZWZpbmUgUFNXUlFfUkVHX0RCR19TSElGVCBcCisJMHgyODAwMjhVTAorI2RlZmluZSBQU1dSUV9SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweDI4MDAyY1VMCisjZGVmaW5lIFBTV1JRX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4MjgwMDMwVUwKKyNkZWZpbmUgUFNXV1JfUkVHX0RCR19TRUxFQ1QgXAorCTB4MjlhMDg0VUwKKyNkZWZpbmUgUFNXV1JfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MjlhMDg4VUwKKyNkZWZpbmUgUFNXV1JfUkVHX0RCR19TSElGVCBcCisJMHgyOWEwOGNVTAorI2RlZmluZSBQU1dXUl9SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweDI5YTA5MFVMCisjZGVmaW5lIFBTV1dSX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4MjlhMDk0VUwKKyNkZWZpbmUgUFNXUkRfUkVHX0RCR19TRUxFQ1QgXAorCTB4MjljMDQwVUwKKyNkZWZpbmUgUFNXUkRfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MjljMDQ0VUwKKyNkZWZpbmUgUFNXUkRfUkVHX0RCR19TSElGVCBcCisJMHgyOWMwNDhVTAorI2RlZmluZSBQU1dSRF9SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweDI5YzA0Y1VMCisjZGVmaW5lIFBTV1JEX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4MjljMDUwVUwKKyNkZWZpbmUgUFNXUkQyX1JFR19EQkdfU0VMRUNUIFwKKwkweDI5ZDQwMFVMCisjZGVmaW5lIFBTV1JEMl9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHgyOWQ0MDRVTAorI2RlZmluZSBQU1dSRDJfUkVHX0RCR19TSElGVCBcCisJMHgyOWQ0MDhVTAorI2RlZmluZSBQU1dSRDJfUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHgyOWQ0MGNVTAorI2RlZmluZSBQU1dSRDJfUkVHX0RCR19GT1JDRV9GUkFNRSBcCisJMHgyOWQ0MTBVTAorI2RlZmluZSBQU1dIU1QyX1JFR19EQkdfU0VMRUNUIFwKKwkweDI5ZTA1OFVMCisjZGVmaW5lIFBTV0hTVDJfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MjllMDVjVUwKKyNkZWZpbmUgUFNXSFNUMl9SRUdfREJHX1NISUZUIFwKKwkweDI5ZTA2MFVMCisjZGVmaW5lIFBTV0hTVDJfUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHgyOWUwNjRVTAorI2RlZmluZSBQU1dIU1QyX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4MjllMDY4VUwKKyNkZWZpbmUgUFNXSFNUX1JFR19EQkdfU0VMRUNUIFwKKwkweDJhMDEwMFVMCisjZGVmaW5lIFBTV0hTVF9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHgyYTAxMDRVTAorI2RlZmluZSBQU1dIU1RfUkVHX0RCR19TSElGVCBcCisJMHgyYTAxMDhVTAorI2RlZmluZSBQU1dIU1RfUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHgyYTAxMGNVTAorI2RlZmluZSBQU1dIU1RfUkVHX0RCR19GT1JDRV9GUkFNRSBcCisJMHgyYTAxMTBVTAorI2RlZmluZSBQR0xVRV9CX1JFR19EQkdfU0VMRUNUIFwKKwkweDJhODQwMFVMCisjZGVmaW5lIFBHTFVFX0JfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MmE4NDA0VUwKKyNkZWZpbmUgUEdMVUVfQl9SRUdfREJHX1NISUZUIFwKKwkweDJhODQwOFVMCisjZGVmaW5lIFBHTFVFX0JfUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHgyYTg0MGNVTAorI2RlZmluZSBQR0xVRV9CX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4MmE4NDEwVUwKKyNkZWZpbmUgVE1fUkVHX0RCR19TRUxFQ1QgXAorCTB4MmMwN2E4VUwKKyNkZWZpbmUgVE1fUkVHX0RCR19EV09SRF9FTkFCTEUJXAorCTB4MmMwN2FjVUwKKyNkZWZpbmUgVE1fUkVHX0RCR19TSElGVCBcCisJMHgyYzA3YjBVTAorI2RlZmluZSBUTV9SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweDJjMDdiNFVMCisjZGVmaW5lIFRNX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4MmMwN2I4VUwKKyNkZWZpbmUgVENGQ19SRUdfREJHX1NFTEVDVCBcCisJMHgyZDA1MDBVTAorI2RlZmluZSBUQ0ZDX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDJkMDUwNFVMCisjZGVmaW5lIFRDRkNfUkVHX0RCR19TSElGVCBcCisJMHgyZDA1MDhVTAorI2RlZmluZSBUQ0ZDX1JFR19EQkdfRk9SQ0VfVkFMSUQgXAorCTB4MmQwNTBjVUwKKyNkZWZpbmUgVENGQ19SRUdfREJHX0ZPUkNFX0ZSQU1FIFwKKwkweDJkMDUxMFVMCisjZGVmaW5lIENDRkNfUkVHX0RCR19TRUxFQ1QgXAorCTB4MmUwNTAwVUwKKyNkZWZpbmUgQ0NGQ19SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHgyZTA1MDRVTAorI2RlZmluZSBDQ0ZDX1JFR19EQkdfU0hJRlQgXAorCTB4MmUwNTA4VUwKKyNkZWZpbmUgQ0NGQ19SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweDJlMDUwY1VMCisjZGVmaW5lIENDRkNfUkVHX0RCR19GT1JDRV9GUkFNRSBcCisJMHgyZTA1MTBVTAorI2RlZmluZSBRTV9SRUdfREJHX1NFTEVDVCBcCisJMHgyZjJlNzRVTAorI2RlZmluZSBRTV9SRUdfREJHX0RXT1JEX0VOQUJMRQlcCisJMHgyZjJlNzhVTAorI2RlZmluZSBRTV9SRUdfREJHX1NISUZUIFwKKwkweDJmMmU3Y1VMCisjZGVmaW5lIFFNX1JFR19EQkdfRk9SQ0VfVkFMSUQgXAorCTB4MmYyZTgwVUwKKyNkZWZpbmUgUU1fUkVHX0RCR19GT1JDRV9GUkFNRSBcCisJMHgyZjJlODRVTAorI2RlZmluZSBSRElGX1JFR19EQkdfU0VMRUNUIFwKKwkweDMwMDUwMFVMCisjZGVmaW5lIFJESUZfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MzAwNTA0VUwKKyNkZWZpbmUgUkRJRl9SRUdfREJHX1NISUZUIFwKKwkweDMwMDUwOFVMCisjZGVmaW5lIFJESUZfUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHgzMDA1MGNVTAorI2RlZmluZSBSRElGX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4MzAwNTEwVUwKKyNkZWZpbmUgVERJRl9SRUdfREJHX1NFTEVDVCBcCisJMHgzMTA1MDBVTAorI2RlZmluZSBURElGX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDMxMDUwNFVMCisjZGVmaW5lIFRESUZfUkVHX0RCR19TSElGVCBcCisJMHgzMTA1MDhVTAorI2RlZmluZSBURElGX1JFR19EQkdfRk9SQ0VfVkFMSUQgXAorCTB4MzEwNTBjVUwKKyNkZWZpbmUgVERJRl9SRUdfREJHX0ZPUkNFX0ZSQU1FIFwKKwkweDMxMDUxMFVMCisjZGVmaW5lIEJSQl9SRUdfREJHX1NFTEVDVCBcCisJMHgzNDBlZDBVTAorI2RlZmluZSBCUkJfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MzQwZWQ0VUwKKyNkZWZpbmUgQlJCX1JFR19EQkdfU0hJRlQgXAorCTB4MzQwZWQ4VUwKKyNkZWZpbmUgQlJCX1JFR19EQkdfRk9SQ0VfVkFMSUQJXAorCTB4MzQwZWRjVUwKKyNkZWZpbmUgQlJCX1JFR19EQkdfRk9SQ0VfRlJBTUUJXAorCTB4MzQwZWUwVUwKKyNkZWZpbmUgWFlMRF9SRUdfREJHX1NFTEVDVCBcCisJMHg0YzE2MDBVTAorI2RlZmluZSBYWUxEX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDRjMTYwNFVMCisjZGVmaW5lIFhZTERfUkVHX0RCR19TSElGVCBcCisJMHg0YzE2MDhVTAorI2RlZmluZSBYWUxEX1JFR19EQkdfRk9SQ0VfVkFMSUQgXAorCTB4NGMxNjBjVUwKKyNkZWZpbmUgWFlMRF9SRUdfREJHX0ZPUkNFX0ZSQU1FIFwKKwkweDRjMTYxMFVMCisjZGVmaW5lIFlVTERfUkVHX0RCR19TRUxFQ1QgXAorCTB4NGM5NjAwVUwKKyNkZWZpbmUgWVVMRF9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHg0Yzk2MDRVTAorI2RlZmluZSBZVUxEX1JFR19EQkdfU0hJRlQgXAorCTB4NGM5NjA4VUwKKyNkZWZpbmUgWVVMRF9SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweDRjOTYwY1VMCisjZGVmaW5lIFlVTERfUkVHX0RCR19GT1JDRV9GUkFNRSBcCisJMHg0Yzk2MTBVTAorI2RlZmluZSBUTUxEX1JFR19EQkdfU0VMRUNUIFwKKwkweDRkMTYwMFVMCisjZGVmaW5lIFRNTERfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4NGQxNjA0VUwKKyNkZWZpbmUgVE1MRF9SRUdfREJHX1NISUZUIFwKKwkweDRkMTYwOFVMCisjZGVmaW5lIFRNTERfUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHg0ZDE2MGNVTAorI2RlZmluZSBUTUxEX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4NGQxNjEwVUwKKyNkZWZpbmUgTVVMRF9SRUdfREJHX1NFTEVDVCBcCisJMHg0ZTE2MDBVTAorI2RlZmluZSBNVUxEX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDRlMTYwNFVMCisjZGVmaW5lIE1VTERfUkVHX0RCR19TSElGVCBcCisJMHg0ZTE2MDhVTAorI2RlZmluZSBNVUxEX1JFR19EQkdfRk9SQ0VfVkFMSUQgXAorCTB4NGUxNjBjVUwKKyNkZWZpbmUgTVVMRF9SRUdfREJHX0ZPUkNFX0ZSQU1FIFwKKwkweDRlMTYxMFVMCisjZGVmaW5lIE5JR19SRUdfREJHX1NFTEVDVCBcCisJMHg1MDIxNDBVTAorI2RlZmluZSBOSUdfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4NTAyMTQ0VUwKKyNkZWZpbmUgTklHX1JFR19EQkdfU0hJRlQgXAorCTB4NTAyMTQ4VUwKKyNkZWZpbmUgTklHX1JFR19EQkdfRk9SQ0VfVkFMSUQJXAorCTB4NTAyMTRjVUwKKyNkZWZpbmUgTklHX1JFR19EQkdfRk9SQ0VfRlJBTUUJXAorCTB4NTAyMTUwVUwKKyNkZWZpbmUgQk1CX1JFR19EQkdfU0VMRUNUIFwKKwkweDU0MGE3Y1VMCisjZGVmaW5lIEJNQl9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHg1NDBhODBVTAorI2RlZmluZSBCTUJfUkVHX0RCR19TSElGVCBcCisJMHg1NDBhODRVTAorI2RlZmluZSBCTUJfUkVHX0RCR19GT1JDRV9WQUxJRAlcCisJMHg1NDBhODhVTAorI2RlZmluZSBCTUJfUkVHX0RCR19GT1JDRV9GUkFNRQlcCisJMHg1NDBhOGNVTAorI2RlZmluZSBQVFVfUkVHX0RCR19TRUxFQ1QgXAorCTB4NTYwMTAwVUwKKyNkZWZpbmUgUFRVX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDU2MDEwNFVMCisjZGVmaW5lIFBUVV9SRUdfREJHX1NISUZUIFwKKwkweDU2MDEwOFVMCisjZGVmaW5lIFBUVV9SRUdfREJHX0ZPUkNFX1ZBTElECVwKKwkweDU2MDEwY1VMCisjZGVmaW5lIFBUVV9SRUdfREJHX0ZPUkNFX0ZSQU1FCVwKKwkweDU2MDExMFVMCisjZGVmaW5lIENEVV9SRUdfREJHX1NFTEVDVCBcCisJMHg1ODA3MDRVTAorI2RlZmluZSBDRFVfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4NTgwNzA4VUwKKyNkZWZpbmUgQ0RVX1JFR19EQkdfU0hJRlQgXAorCTB4NTgwNzBjVUwKKyNkZWZpbmUgQ0RVX1JFR19EQkdfRk9SQ0VfVkFMSUQJXAorCTB4NTgwNzEwVUwKKyNkZWZpbmUgQ0RVX1JFR19EQkdfRk9SQ0VfRlJBTUUJXAorCTB4NTgwNzE0VUwKKyNkZWZpbmUgV09MX1JFR19EQkdfU0VMRUNUIFwKKwkweDYwMDE0MFVMCisjZGVmaW5lIFdPTF9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHg2MDAxNDRVTAorI2RlZmluZSBXT0xfUkVHX0RCR19TSElGVCBcCisJMHg2MDAxNDhVTAorI2RlZmluZSBXT0xfUkVHX0RCR19GT1JDRV9WQUxJRAlcCisJMHg2MDAxNGNVTAorI2RlZmluZSBXT0xfUkVHX0RCR19GT1JDRV9GUkFNRQlcCisJMHg2MDAxNTBVTAorI2RlZmluZSBCTUJOX1JFR19EQkdfU0VMRUNUIFwKKwkweDYxMDE0MFVMCisjZGVmaW5lIEJNQk5fUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4NjEwMTQ0VUwKKyNkZWZpbmUgQk1CTl9SRUdfREJHX1NISUZUIFwKKwkweDYxMDE0OFVMCisjZGVmaW5lIEJNQk5fUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHg2MTAxNGNVTAorI2RlZmluZSBCTUJOX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4NjEwMTUwVUwKKyNkZWZpbmUgTldNX1JFR19EQkdfU0VMRUNUIFwKKwkweDgwMDBlY1VMCisjZGVmaW5lIE5XTV9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHg4MDAwZjBVTAorI2RlZmluZSBOV01fUkVHX0RCR19TSElGVCBcCisJMHg4MDAwZjRVTAorI2RlZmluZSBOV01fUkVHX0RCR19GT1JDRV9WQUxJRAlcCisJMHg4MDAwZjhVTAorI2RlZmluZSBOV01fUkVHX0RCR19GT1JDRV9GUkFNRQlcCisJMHg4MDAwZmNVTAorI2RlZmluZSBQQkZfUkVHX0RCR19TRUxFQ1QgXAorCTB4ZDgwMDYwVUwKKyNkZWZpbmUgUEJGX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweGQ4MDA2NFVMCisjZGVmaW5lIFBCRl9SRUdfREJHX1NISUZUIFwKKwkweGQ4MDA2OFVMCisjZGVmaW5lIFBCRl9SRUdfREJHX0ZPUkNFX1ZBTElECVwKKwkweGQ4MDA2Y1VMCisjZGVmaW5lIFBCRl9SRUdfREJHX0ZPUkNFX0ZSQU1FCVwKKwkweGQ4MDA3MFVMCisjZGVmaW5lIFBCRl9QQjFfUkVHX0RCR19TRUxFQ1QgXAorCTB4ZGEwNzI4VUwKKyNkZWZpbmUgUEJGX1BCMV9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHhkYTA3MmNVTAorI2RlZmluZSBQQkZfUEIxX1JFR19EQkdfU0hJRlQgXAorCTB4ZGEwNzMwVUwKKyNkZWZpbmUgUEJGX1BCMV9SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweGRhMDczNFVMCisjZGVmaW5lIFBCRl9QQjFfUkVHX0RCR19GT1JDRV9GUkFNRSBcCisJMHhkYTA3MzhVTAorI2RlZmluZSBQQkZfUEIyX1JFR19EQkdfU0VMRUNUIFwKKwkweGRhNDcyOFVMCisjZGVmaW5lIFBCRl9QQjJfUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4ZGE0NzJjVUwKKyNkZWZpbmUgUEJGX1BCMl9SRUdfREJHX1NISUZUIFwKKwkweGRhNDczMFVMCisjZGVmaW5lIFBCRl9QQjJfUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHhkYTQ3MzRVTAorI2RlZmluZSBQQkZfUEIyX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4ZGE0NzM4VUwKKyNkZWZpbmUgQlRCX1JFR19EQkdfU0VMRUNUIFwKKwkweGRiMDhjOFVMCisjZGVmaW5lIEJUQl9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHhkYjA4Y2NVTAorI2RlZmluZSBCVEJfUkVHX0RCR19TSElGVCBcCisJMHhkYjA4ZDBVTAorI2RlZmluZSBCVEJfUkVHX0RCR19GT1JDRV9WQUxJRAlcCisJMHhkYjA4ZDRVTAorI2RlZmluZSBCVEJfUkVHX0RCR19GT1JDRV9GUkFNRQlcCisJMHhkYjA4ZDhVTAorI2RlZmluZSBYU0RNX1JFR19EQkdfU0VMRUNUIFwKKwkweGY4MGUyOFVMCisjZGVmaW5lIFhTRE1fUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4ZjgwZTJjVUwKKyNkZWZpbmUgWFNETV9SRUdfREJHX1NISUZUIFwKKwkweGY4MGUzMFVMCisjZGVmaW5lIFhTRE1fUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHhmODBlMzRVTAorI2RlZmluZSBYU0RNX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4ZjgwZTM4VUwKKyNkZWZpbmUgWVNETV9SRUdfREJHX1NFTEVDVCBcCisJMHhmOTBlMjhVTAorI2RlZmluZSBZU0RNX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweGY5MGUyY1VMCisjZGVmaW5lIFlTRE1fUkVHX0RCR19TSElGVCBcCisJMHhmOTBlMzBVTAorI2RlZmluZSBZU0RNX1JFR19EQkdfRk9SQ0VfVkFMSUQgXAorCTB4ZjkwZTM0VUwKKyNkZWZpbmUgWVNETV9SRUdfREJHX0ZPUkNFX0ZSQU1FIFwKKwkweGY5MGUzOFVMCisjZGVmaW5lIFBTRE1fUkVHX0RCR19TRUxFQ1QgXAorCTB4ZmEwZTI4VUwKKyNkZWZpbmUgUFNETV9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHhmYTBlMmNVTAorI2RlZmluZSBQU0RNX1JFR19EQkdfU0hJRlQgXAorCTB4ZmEwZTMwVUwKKyNkZWZpbmUgUFNETV9SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweGZhMGUzNFVMCisjZGVmaW5lIFBTRE1fUkVHX0RCR19GT1JDRV9GUkFNRSBcCisJMHhmYTBlMzhVTAorI2RlZmluZSBUU0RNX1JFR19EQkdfU0VMRUNUIFwKKwkweGZiMGUyOFVMCisjZGVmaW5lIFRTRE1fUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4ZmIwZTJjVUwKKyNkZWZpbmUgVFNETV9SRUdfREJHX1NISUZUIFwKKwkweGZiMGUzMFVMCisjZGVmaW5lIFRTRE1fUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHhmYjBlMzRVTAorI2RlZmluZSBUU0RNX1JFR19EQkdfRk9SQ0VfRlJBTUUgXAorCTB4ZmIwZTM4VUwKKyNkZWZpbmUgTVNETV9SRUdfREJHX1NFTEVDVCBcCisJMHhmYzBlMjhVTAorI2RlZmluZSBNU0RNX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweGZjMGUyY1VMCisjZGVmaW5lIE1TRE1fUkVHX0RCR19TSElGVCBcCisJMHhmYzBlMzBVTAorI2RlZmluZSBNU0RNX1JFR19EQkdfRk9SQ0VfVkFMSUQgXAorCTB4ZmMwZTM0VUwKKyNkZWZpbmUgTVNETV9SRUdfREJHX0ZPUkNFX0ZSQU1FIFwKKwkweGZjMGUzOFVMCisjZGVmaW5lIFVTRE1fUkVHX0RCR19TRUxFQ1QgXAorCTB4ZmQwZTI4VUwKKyNkZWZpbmUgVVNETV9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHhmZDBlMmNVTAorI2RlZmluZSBVU0RNX1JFR19EQkdfU0hJRlQgXAorCTB4ZmQwZTMwVUwKKyNkZWZpbmUgVVNETV9SRUdfREJHX0ZPUkNFX1ZBTElEIFwKKwkweGZkMGUzNFVMCisjZGVmaW5lIFVTRE1fUkVHX0RCR19GT1JDRV9GUkFNRSBcCisJMHhmZDBlMzhVTAorI2RlZmluZSBYQ01fUkVHX0RCR19TRUxFQ1QgXAorCTB4MTAwMDA0MFVMCisjZGVmaW5lIFhDTV9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHgxMDAwMDQ0VUwKKyNkZWZpbmUgWENNX1JFR19EQkdfU0hJRlQgXAorCTB4MTAwMDA0OFVMCisjZGVmaW5lIFhDTV9SRUdfREJHX0ZPUkNFX1ZBTElECVwKKwkweDEwMDAwNGNVTAorI2RlZmluZSBYQ01fUkVHX0RCR19GT1JDRV9GUkFNRQlcCisJMHgxMDAwMDUwVUwKKyNkZWZpbmUgWUNNX1JFR19EQkdfU0VMRUNUIFwKKwkweDEwODAwNDBVTAorI2RlZmluZSBZQ01fUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MTA4MDA0NFVMCisjZGVmaW5lIFlDTV9SRUdfREJHX1NISUZUIFwKKwkweDEwODAwNDhVTAorI2RlZmluZSBZQ01fUkVHX0RCR19GT1JDRV9WQUxJRAlcCisJMHgxMDgwMDRjVUwKKyNkZWZpbmUgWUNNX1JFR19EQkdfRk9SQ0VfRlJBTUUJXAorCTB4MTA4MDA1MFVMCisjZGVmaW5lIFBDTV9SRUdfREJHX1NFTEVDVCBcCisJMHgxMTAwMDQwVUwKKyNkZWZpbmUgUENNX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDExMDAwNDRVTAorI2RlZmluZSBQQ01fUkVHX0RCR19TSElGVCBcCisJMHgxMTAwMDQ4VUwKKyNkZWZpbmUgUENNX1JFR19EQkdfRk9SQ0VfVkFMSUQJXAorCTB4MTEwMDA0Y1VMCisjZGVmaW5lIFBDTV9SRUdfREJHX0ZPUkNFX0ZSQU1FCVwKKwkweDExMDAwNTBVTAorI2RlZmluZSBUQ01fUkVHX0RCR19TRUxFQ1QgXAorCTB4MTE4MDA0MFVMCisjZGVmaW5lIFRDTV9SRUdfREJHX0RXT1JEX0VOQUJMRSBcCisJMHgxMTgwMDQ0VUwKKyNkZWZpbmUgVENNX1JFR19EQkdfU0hJRlQgXAorCTB4MTE4MDA0OFVMCisjZGVmaW5lIFRDTV9SRUdfREJHX0ZPUkNFX1ZBTElECVwKKwkweDExODAwNGNVTAorI2RlZmluZSBUQ01fUkVHX0RCR19GT1JDRV9GUkFNRQlcCisJMHgxMTgwMDUwVUwKKyNkZWZpbmUgTUNNX1JFR19EQkdfU0VMRUNUIFwKKwkweDEyMDAwNDBVTAorI2RlZmluZSBNQ01fUkVHX0RCR19EV09SRF9FTkFCTEUgXAorCTB4MTIwMDA0NFVMCisjZGVmaW5lIE1DTV9SRUdfREJHX1NISUZUIFwKKwkweDEyMDAwNDhVTAorI2RlZmluZSBNQ01fUkVHX0RCR19GT1JDRV9WQUxJRAlcCisJMHgxMjAwMDRjVUwKKyNkZWZpbmUgTUNNX1JFR19EQkdfRk9SQ0VfRlJBTUUJXAorCTB4MTIwMDA1MFVMCisjZGVmaW5lIFVDTV9SRUdfREJHX1NFTEVDVCBcCisJMHgxMjgwMDUwVUwKKyNkZWZpbmUgVUNNX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDEyODAwNTRVTAorI2RlZmluZSBVQ01fUkVHX0RCR19TSElGVCBcCisJMHgxMjgwMDU4VUwKKyNkZWZpbmUgVUNNX1JFR19EQkdfRk9SQ0VfVkFMSUQJXAorCTB4MTI4MDA1Y1VMCisjZGVmaW5lIFVDTV9SRUdfREJHX0ZPUkNFX0ZSQU1FCVwKKwkweDEyODAwNjBVTAorI2RlZmluZSBYU0VNX1JFR19EQkdfU0VMRUNUIFwKKwkweDE0MDE1MjhVTAorI2RlZmluZSBYU0VNX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDE0MDE1MmNVTAorI2RlZmluZSBYU0VNX1JFR19EQkdfU0hJRlQgXAorCTB4MTQwMTUzMFVMCisjZGVmaW5lIFhTRU1fUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHgxNDAxNTM0VUwKKyNkZWZpbmUgWFNFTV9SRUdfREJHX0ZPUkNFX0ZSQU1FIFwKKwkweDE0MDE1MzhVTAorI2RlZmluZSBZU0VNX1JFR19EQkdfU0VMRUNUIFwKKwkweDE1MDE1MjhVTAorI2RlZmluZSBZU0VNX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDE1MDE1MmNVTAorI2RlZmluZSBZU0VNX1JFR19EQkdfU0hJRlQgXAorCTB4MTUwMTUzMFVMCisjZGVmaW5lIFlTRU1fUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHgxNTAxNTM0VUwKKyNkZWZpbmUgWVNFTV9SRUdfREJHX0ZPUkNFX0ZSQU1FIFwKKwkweDE1MDE1MzhVTAorI2RlZmluZSBQU0VNX1JFR19EQkdfU0VMRUNUIFwKKwkweDE2MDE1MjhVTAorI2RlZmluZSBQU0VNX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDE2MDE1MmNVTAorI2RlZmluZSBQU0VNX1JFR19EQkdfU0hJRlQgXAorCTB4MTYwMTUzMFVMCisjZGVmaW5lIFBTRU1fUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHgxNjAxNTM0VUwKKyNkZWZpbmUgUFNFTV9SRUdfREJHX0ZPUkNFX0ZSQU1FIFwKKwkweDE2MDE1MzhVTAorI2RlZmluZSBUU0VNX1JFR19EQkdfU0VMRUNUIFwKKwkweDE3MDE1MjhVTAorI2RlZmluZSBUU0VNX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDE3MDE1MmNVTAorI2RlZmluZSBUU0VNX1JFR19EQkdfU0hJRlQgXAorCTB4MTcwMTUzMFVMCisjZGVmaW5lIFRTRU1fUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHgxNzAxNTM0VUwKKyNkZWZpbmUgVFNFTV9SRUdfREJHX0ZPUkNFX0ZSQU1FIFwKKwkweDE3MDE1MzhVTAorI2RlZmluZSBNU0VNX1JFR19EQkdfU0VMRUNUIFwKKwkweDE4MDE1MjhVTAorI2RlZmluZSBNU0VNX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDE4MDE1MmNVTAorI2RlZmluZSBNU0VNX1JFR19EQkdfU0hJRlQgXAorCTB4MTgwMTUzMFVMCisjZGVmaW5lIE1TRU1fUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHgxODAxNTM0VUwKKyNkZWZpbmUgTVNFTV9SRUdfREJHX0ZPUkNFX0ZSQU1FIFwKKwkweDE4MDE1MzhVTAorI2RlZmluZSBVU0VNX1JFR19EQkdfU0VMRUNUIFwKKwkweDE5MDE1MjhVTAorI2RlZmluZSBVU0VNX1JFR19EQkdfRFdPUkRfRU5BQkxFIFwKKwkweDE5MDE1MmNVTAorI2RlZmluZSBVU0VNX1JFR19EQkdfU0hJRlQgXAorCTB4MTkwMTUzMFVMCisjZGVmaW5lIFVTRU1fUkVHX0RCR19GT1JDRV9WQUxJRCBcCisJMHgxOTAxNTM0VUwKKyNkZWZpbmUgVVNFTV9SRUdfREJHX0ZPUkNFX0ZSQU1FIFwKKwkweDE5MDE1MzhVTAorI2RlZmluZSBQQ0lFX1JFR19EQkdfQ09NTU9OX1NFTEVDVCBcCisJMHgwNTQzOThVTAorI2RlZmluZSBQQ0lFX1JFR19EQkdfQ09NTU9OX0RXT1JEX0VOQUJMRSBcCisJMHgwNTQzOWNVTAorI2RlZmluZSBQQ0lFX1JFR19EQkdfQ09NTU9OX1NISUZUIFwKKwkweDA1NDNhMFVMCisjZGVmaW5lIFBDSUVfUkVHX0RCR19DT01NT05fRk9SQ0VfVkFMSUQJXAorCTB4MDU0M2E0VUwKKyNkZWZpbmUgUENJRV9SRUdfREJHX0NPTU1PTl9GT1JDRV9GUkFNRQlcCisJMHgwNTQzYThVTAorI2RlZmluZSBNSVNDX1JFR19SRVNFVF9QTF9VQSBcCisJMHgwMDgwNTBVTAorI2RlZmluZSBNSVNDX1JFR19SRVNFVF9QTF9IViBcCisJMHgwMDgwNjBVTAorI2RlZmluZSBYQ01fUkVHX0NUWF9SQkNfQUNDUyBcCisJMHgxMDAxODAwVUwKKyNkZWZpbmUgWENNX1JFR19BR0dfQ09OX0NUWCBcCisJMHgxMDAxODA0VUwKKyNkZWZpbmUgWENNX1JFR19TTV9DT05fQ1RYIFwKKwkweDEwMDE4MDhVTAorI2RlZmluZSBZQ01fUkVHX0NUWF9SQkNfQUNDUyBcCisJMHgxMDgxODAwVUwKKyNkZWZpbmUgWUNNX1JFR19BR0dfQ09OX0NUWCBcCisJMHgxMDgxODA0VUwKKyNkZWZpbmUgWUNNX1JFR19BR0dfVEFTS19DVFggXAorCTB4MTA4MTgwOFVMCisjZGVmaW5lIFlDTV9SRUdfU01fQ09OX0NUWCBcCisJMHgxMDgxODBjVUwKKyNkZWZpbmUgWUNNX1JFR19TTV9UQVNLX0NUWCBcCisJMHgxMDgxODEwVUwKKyNkZWZpbmUgUENNX1JFR19DVFhfUkJDX0FDQ1MgXAorCTB4MTEwMTQ0MFVMCisjZGVmaW5lIFBDTV9SRUdfU01fQ09OX0NUWCBcCisJMHgxMTAxNDQ0VUwKKyNkZWZpbmUgVENNX1JFR19DVFhfUkJDX0FDQ1MgXAorCTB4MTE4MTRjMFVMCisjZGVmaW5lIFRDTV9SRUdfQUdHX0NPTl9DVFggXAorCTB4MTE4MTRjNFVMCisjZGVmaW5lIFRDTV9SRUdfQUdHX1RBU0tfQ1RYIFwKKwkweDExODE0YzhVTAorI2RlZmluZSBUQ01fUkVHX1NNX0NPTl9DVFggXAorCTB4MTE4MTRjY1VMCisjZGVmaW5lIFRDTV9SRUdfU01fVEFTS19DVFggXAorCTB4MTE4MTRkMFVMCisjZGVmaW5lIE1DTV9SRUdfQ1RYX1JCQ19BQ0NTIFwKKwkweDEyMDE4MDBVTAorI2RlZmluZSBNQ01fUkVHX0FHR19DT05fQ1RYIFwKKwkweDEyMDE4MDRVTAorI2RlZmluZSBNQ01fUkVHX0FHR19UQVNLX0NUWCBcCisJMHgxMjAxODA4VUwKKyNkZWZpbmUgTUNNX1JFR19TTV9DT05fQ1RYIFwKKwkweDEyMDE4MGNVTAorI2RlZmluZSBNQ01fUkVHX1NNX1RBU0tfQ1RYIFwKKwkweDEyMDE4MTBVTAorI2RlZmluZSBVQ01fUkVHX0NUWF9SQkNfQUNDUyBcCisJMHgxMjgxNzAwVUwKKyNkZWZpbmUgVUNNX1JFR19BR0dfQ09OX0NUWCBcCisJMHgxMjgxNzA0VUwKKyNkZWZpbmUgVUNNX1JFR19BR0dfVEFTS19DVFggXAorCTB4MTI4MTcwOFVMCisjZGVmaW5lIFVDTV9SRUdfU01fQ09OX0NUWCBcCisJMHgxMjgxNzBjVUwKKyNkZWZpbmUgVUNNX1JFR19TTV9UQVNLX0NUWCBcCisJMHgxMjgxNzEwVUwKKyNkZWZpbmUgWFNFTV9SRUdfU0xPV19EQkdfRU1QVFkJXAorCTB4MTQwMTE0MFVMCisjZGVmaW5lIFhTRU1fUkVHX1NZTkNfREJHX0VNUFRZCVwKKwkweDE0MDExNjBVTAorI2RlZmluZSBYU0VNX1JFR19TTE9XX0RCR19BQ1RJVkUgXAorCTB4MTQwMTQwMFVMCisjZGVmaW5lIFhTRU1fUkVHX1NMT1dfREJHX01PREUgXAorCTB4MTQwMTQwNFVMCisjZGVmaW5lIFhTRU1fUkVHX0RCR19GUkFNRV9NT0RFCVwKKwkweDE0MDE0MDhVTAorI2RlZmluZSBYU0VNX1JFR19EQkdfTU9ERTFfQ0ZHIFwKKwkweDE0MDE0MjBVTAorI2RlZmluZSBYU0VNX1JFR19GQVNUX01FTU9SWSBcCisJMHgxNDQwMDAwVUwKKyNkZWZpbmUgWVNFTV9SRUdfU1lOQ19EQkdfRU1QVFkJXAorCTB4MTUwMTE2MFVMCisjZGVmaW5lIFlTRU1fUkVHX1NMT1dfREJHX0FDVElWRSBcCisJMHgxNTAxNDAwVUwKKyNkZWZpbmUgWVNFTV9SRUdfU0xPV19EQkdfTU9ERSBcCisJMHgxNTAxNDA0VUwKKyNkZWZpbmUgWVNFTV9SRUdfREJHX0ZSQU1FX01PREUJXAorCTB4MTUwMTQwOFVMCisjZGVmaW5lIFlTRU1fUkVHX0RCR19NT0RFMV9DRkcgXAorCTB4MTUwMTQyMFVMCisjZGVmaW5lIFlTRU1fUkVHX0ZBU1RfTUVNT1JZIFwKKwkweDE1NDAwMDBVTAorI2RlZmluZSBQU0VNX1JFR19TTE9XX0RCR19FTVBUWQlcCisJMHgxNjAxMTQwVUwKKyNkZWZpbmUgUFNFTV9SRUdfU1lOQ19EQkdfRU1QVFkJXAorCTB4MTYwMTE2MFVMCisjZGVmaW5lIFBTRU1fUkVHX1NMT1dfREJHX0FDVElWRSBcCisJMHgxNjAxNDAwVUwKKyNkZWZpbmUgUFNFTV9SRUdfU0xPV19EQkdfTU9ERSBcCisJMHgxNjAxNDA0VUwKKyNkZWZpbmUgUFNFTV9SRUdfREJHX0ZSQU1FX01PREUJXAorCTB4MTYwMTQwOFVMCisjZGVmaW5lIFBTRU1fUkVHX0RCR19NT0RFMV9DRkcgXAorCTB4MTYwMTQyMFVMCisjZGVmaW5lIFBTRU1fUkVHX0ZBU1RfTUVNT1JZIFwKKwkweDE2NDAwMDBVTAorI2RlZmluZSBUU0VNX1JFR19TTE9XX0RCR19FTVBUWQlcCisJMHgxNzAxMTQwVUwKKyNkZWZpbmUgVFNFTV9SRUdfU1lOQ19EQkdfRU1QVFkJXAorCTB4MTcwMTE2MFVMCisjZGVmaW5lIFRTRU1fUkVHX1NMT1dfREJHX0FDVElWRSBcCisJMHgxNzAxNDAwVUwKKyNkZWZpbmUgVFNFTV9SRUdfU0xPV19EQkdfTU9ERSBcCisJMHgxNzAxNDA0VUwKKyNkZWZpbmUgVFNFTV9SRUdfREJHX0ZSQU1FX01PREUJXAorCTB4MTcwMTQwOFVMCisjZGVmaW5lIFRTRU1fUkVHX0RCR19NT0RFMV9DRkcgXAorCTB4MTcwMTQyMFVMCisjZGVmaW5lIFRTRU1fUkVHX0ZBU1RfTUVNT1JZIFwKKwkweDE3NDAwMDBVTAorI2RlZmluZSBNU0VNX1JFR19TTE9XX0RCR19FTVBUWQlcCisJMHgxODAxMTQwVUwKKyNkZWZpbmUgTVNFTV9SRUdfU1lOQ19EQkdfRU1QVFkJXAorCTB4MTgwMTE2MFVMCisjZGVmaW5lIE1TRU1fUkVHX1NMT1dfREJHX0FDVElWRSBcCisJMHgxODAxNDAwVUwKKyNkZWZpbmUgTVNFTV9SRUdfU0xPV19EQkdfTU9ERSBcCisJMHgxODAxNDA0VUwKKyNkZWZpbmUgTVNFTV9SRUdfREJHX0ZSQU1FX01PREUJXAorCTB4MTgwMTQwOFVMCisjZGVmaW5lIE1TRU1fUkVHX0RCR19NT0RFMV9DRkcgXAorCTB4MTgwMTQyMFVMCisjZGVmaW5lIE1TRU1fUkVHX0ZBU1RfTUVNT1JZIFwKKwkweDE4NDAwMDBVTAorI2RlZmluZSBVU0VNX1JFR19TTE9XX0RCR19FTVBUWQlcCisJMHgxOTAxMTQwVUwKKyNkZWZpbmUgVVNFTV9SRUdfU1lOQ19EQkdfRU1QVFkJXAorCTB4MTkwMTE2MFVMCisjZGVmaW5lIFVTRU1fUkVHX1NMT1dfREJHX0FDVElWRSBcCisJMHgxOTAxNDAwVUwKKyNkZWZpbmUgVVNFTV9SRUdfU0xPV19EQkdfTU9ERSBcCisJMHgxOTAxNDA0VUwKKyNkZWZpbmUgVVNFTV9SRUdfREJHX0ZSQU1FX01PREUJXAorCTB4MTkwMTQwOFVMCisjZGVmaW5lIFVTRU1fUkVHX0RCR19NT0RFMV9DRkcgXAorCTB4MTkwMTQyMFVMCisjZGVmaW5lIFVTRU1fUkVHX0ZBU1RfTUVNT1JZIFwKKwkweDE5NDAwMDBVTAorI2RlZmluZSBTRU1fRkFTVF9SRUdfSU5UX1JBTSBcCisJMHgwMjAwMDBVTAorI2RlZmluZSBTRU1fRkFTVF9SRUdfSU5UX1JBTV9TSVpFIFwKKwkyMDQ4MAorI2RlZmluZSBHUkNfUkVHX1RSQUNFX0ZJRk9fVkFMSURfREFUQSBcCisJMHgwNTAwNjRVTAorI2RlZmluZSBHUkNfUkVHX05VTUJFUl9WQUxJRF9PVkVSUklERV9XSU5ET1cgXAorCTB4MDUwNDBjVUwKKyNkZWZpbmUgR1JDX1JFR19QUk9URUNUSU9OX09WRVJSSURFX1dJTkRPVyBcCisJMHgwNTA1MDBVTAorI2RlZmluZSBJR1VfUkVHX0VSUk9SX0hBTkRMSU5HX01FTU9SWSBcCisJMHgxODE1MjBVTAorI2RlZmluZSBNQ1BfUkVHX0NQVV9NT0RFIFwKKwkweGUwNTAwMFVMCisjZGVmaW5lIE1DUF9SRUdfQ1BVX01PREVfU09GVF9IQUxUIFwKKwkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgQlJCX1JFR19CSUdfUkFNX0FERFJFU1MgXAorCTB4MzQwODAwVUwKKyNkZWZpbmUgQlJCX1JFR19CSUdfUkFNX0RBVEEgXAorCTB4MzQxNTAwVUwKKyNkZWZpbmUgU0VNX0ZBU1RfUkVHX1NUQUxMXzAgXAorCTB4MDAwNDg4VUwKKyNkZWZpbmUgU0VNX0ZBU1RfUkVHX1NUQUxMRUQgXAorCTB4MDAwNDk0VUwKKyNkZWZpbmUgQlRCX1JFR19CSUdfUkFNX0FERFJFU1MgXAorCTB4ZGIwODAwVUwKKyNkZWZpbmUgQlRCX1JFR19CSUdfUkFNX0RBVEEgXAorCTB4ZGIwYzAwVUwKKyNkZWZpbmUgQk1CX1JFR19CSUdfUkFNX0FERFJFU1MgXAorCTB4NTQwODAwVUwKKyNkZWZpbmUgQk1CX1JFR19CSUdfUkFNX0RBVEEgXAorCTB4NTQwZjAwVUwKKyNkZWZpbmUgU0VNX0ZBU1RfUkVHX1NUT1JNX1JFR19GSUxFIFwKKwkweDAwODAwMFVMCisjZGVmaW5lIFJTU19SRUdfUlNTX1JBTV9BRERSIFwKKwkweDIzOGMzMFVMCisjZGVmaW5lIE1JU0NTX1JFR19CTE9DS18yNTZCX0VOIFwKKwkweDAwOTA3NFVMCisjZGVmaW5lIE1DUF9SRUdfU0NSQVRDSF9TSVpFIFwKKwk1NzM0NAorI2RlZmluZSBNQ1BfUkVHX0NQVV9SRUdfRklMRSBcCisJMHhlMDUyMDBVTAorI2RlZmluZSBNQ1BfUkVHX0NQVV9SRUdfRklMRV9TSVpFIFwKKwkzMgorI2RlZmluZSBEQkdfUkVHX0RFQlVHX1RBUkdFVCBcCisJMHgwMTAwNWNVTAorI2RlZmluZSBEQkdfUkVHX0ZVTExfTU9ERSBcCisJMHgwMTAwNjBVTAorI2RlZmluZSBEQkdfUkVHX0NBTEVOREFSX09VVF9EQVRBIFwKKwkweDAxMDQ4MFVMCisjZGVmaW5lIEdSQ19SRUdfVFJBQ0VfRklGTyBcCisJMHgwNTAwNjhVTAorI2RlZmluZSBJR1VfUkVHX0VSUk9SX0hBTkRMSU5HX0RBVEFfVkFMSUQgXAorCTB4MTgxNTMwVUwKKyNkZWZpbmUgREJHX1JFR19EQkdfQkxPQ0tfT04gXAorCTB4MDEwNDU0VUwKKyNkZWZpbmUgREJHX1JFR19GUkFNSU5HX01PREUgXAorCTB4MDEwMDU4VUwKKyNkZWZpbmUgU0VNX0ZBU1RfUkVHX1ZGQ19EQVRBX1dSIFwKKwkweDAwMGI0MFVMCisjZGVmaW5lIFNFTV9GQVNUX1JFR19WRkNfQUREUiBcCisJMHgwMDBiNDRVTAorI2RlZmluZSBTRU1fRkFTVF9SRUdfVkZDX0RBVEFfUkQgXAorCTB4MDAwYjQ4VUwKKyNkZWZpbmUgUlNTX1JFR19SU1NfUkFNX0RBVEEgXAorCTB4MjM4YzIwVUwKKyNkZWZpbmUgTUlTQ19SRUdfQkxPQ0tfMjU2Ql9FTiBcCisJMHgwMDhjMTRVTAorI2RlZmluZSBOV1NfUkVHX05XU19DTVUJXAorCTB4NzIwMDAwVUwKKyNkZWZpbmUgUEhZX05XX0lQX1JFR19QSFkwX1RPUF9UQlVTX0FERFJfN18wIFwKKwkweDAwMDY4MFVMCisjZGVmaW5lIFBIWV9OV19JUF9SRUdfUEhZMF9UT1BfVEJVU19BRERSXzE1XzggXAorCTB4MDAwNjg0VUwKKyNkZWZpbmUgUEhZX05XX0lQX1JFR19QSFkwX1RPUF9UQlVTX0RBVEFfN18wIFwKKwkweDAwMDZjMFVMCisjZGVmaW5lIFBIWV9OV19JUF9SRUdfUEhZMF9UT1BfVEJVU19EQVRBXzExXzggXAorCTB4MDAwNmM0VUwKKyNkZWZpbmUgTVNfUkVHX01TX0NNVSBcCisJMHg2YTQwMDBVTAorI2RlZmluZSBQSFlfU0dNSUlfSVBfUkVHX0FIQl9DTVVfQ1NSXzBfWDEzMCBcCisJMHgwMDAyMDhVTAorI2RlZmluZSBQSFlfU0dNSUlfSVBfUkVHX0FIQl9DTVVfQ1NSXzBfWDEzMiBcCisJMHgwMDAyMTBVTAorI2RlZmluZSBQSFlfU0dNSUlfSVBfUkVHX0FIQl9DTVVfQ1NSXzBfWDEzMSBcCisJMHgwMDAyMGNVTAorI2RlZmluZSBQSFlfU0dNSUlfSVBfUkVHX0FIQl9DTVVfQ1NSXzBfWDEzMyBcCisJMHgwMDAyMTRVTAorI2RlZmluZSBQSFlfUENJRV9JUF9SRUdfQUhCX0NNVV9DU1JfMF9YMTMwIFwKKwkweDAwMDIwOFVMCisjZGVmaW5lIFBIWV9QQ0lFX0lQX1JFR19BSEJfQ01VX0NTUl8wX1gxMzEgXAorCTB4MDAwMjBjVUwKKyNkZWZpbmUgUEhZX1BDSUVfSVBfUkVHX0FIQl9DTVVfQ1NSXzBfWDEzMiBcCisJMHgwMDAyMTBVTAorI2RlZmluZSBQSFlfUENJRV9JUF9SRUdfQUhCX0NNVV9DU1JfMF9YMTMzIFwKKwkweDAwMDIxNFVMCisjZGVmaW5lIFBIWV9QQ0lFX1JFR19QSFkwIFwKKwkweDYyMDAwMFVMCisjZGVmaW5lIFBIWV9QQ0lFX1JFR19QSFkxIFwKKwkweDYyNDAwMFVMCisjZGVmaW5lIE5JR19SRUdfUk9DRV9EVVBMSUNBVEVfVE9fSE9TVCAweDUwODhmMFVMCisjZGVmaW5lIFBSU19SRUdfTElHSFRfTDJfRVRIRVJUWVBFX0VOIDB4MWYwOTY4VUwKKyNkZWZpbmUgTklHX1JFR19MTEhfRU5HX0NMU19FTkdfSURfVEJMIDB4NTAxYjkwVUwKKyNkZWZpbmUgRE9SUV9SRUdfUEZfRFBNX0VOQUJMRSAweDEwMDUxMFVMCisjZGVmaW5lIERPUlFfUkVHX1BGX0lDSURfQklUX1NISUZUX05PUk0JMHgxMDA0NDhVTAorI2RlZmluZSBET1JRX1JFR19QRl9NSU5fQUREUl9SRUcxIDB4MTAwNDAwVUwKKyNkZWZpbmUgRE9SUV9SRUdfUEZfRFBJX0JJVF9TSElGVCAweDEwMDQ1MFVMCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3JvY2UuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3JvY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzQzMDA1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfcm9jZS5jCkBAIC0wLDAgKzEsMjk1NCBAQAorLyogUUxvZ2ljIHFlZCBOSUMgRHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiAgUUxvZ2ljIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZCAvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvcWVkL3FlZF9yb2NlX2lmLmg+CisjaW5jbHVkZSA8bGludXgvcWVkL3FlZF9yb2NlX2lmLmg+CisjaW5jbHVkZSAicWVkLmgiCisjaW5jbHVkZSAicWVkX2N4dC5oIgorI2luY2x1ZGUgInFlZF9oc2kuaCIKKyNpbmNsdWRlICJxZWRfaHcuaCIKKyNpbmNsdWRlICJxZWRfaW5pdF9vcHMuaCIKKyNpbmNsdWRlICJxZWRfaW50LmgiCisjaW5jbHVkZSAicWVkX2xsMi5oIgorI2luY2x1ZGUgInFlZF9tY3AuaCIKKyNpbmNsdWRlICJxZWRfcmVnX2FkZHIuaCIKKyNpbmNsdWRlICJxZWRfc3AuaCIKKyNpbmNsdWRlICJxZWRfcm9jZS5oIgorI2luY2x1ZGUgInFlZF9sbDIuaCIKKwordm9pZCBxZWRfYXN5bmNfcm9jZV9ldmVudChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgc3RydWN0IGV2ZW50X3JpbmdfZW50cnkgKnBfZXFlKQoreworCXN0cnVjdCBxZWRfcmRtYV9pbmZvICpwX3JkbWFfaW5mbyA9IHBfaHdmbi0+cF9yZG1hX2luZm87CisKKwlwX3JkbWFfaW5mby0+ZXZlbnRzLmFmZmlsaWF0ZWRfZXZlbnQocF9yZG1hX2luZm8tPmV2ZW50cy5jb250ZXh0LAorCQkJCQkgICAgIHBfZXFlLT5vcGNvZGUsICZwX2VxZS0+ZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgcWVkX3JkbWFfYm1hcF9hbGxvYyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgICAgICBzdHJ1Y3QgcWVkX2JtYXAgKmJtYXAsIHUzMiBtYXhfY291bnQpCit7CisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIm1heF9jb3VudCA9ICUwOHhcbiIsIG1heF9jb3VudCk7CisKKwlibWFwLT5tYXhfY291bnQgPSBtYXhfY291bnQ7CisKKwlibWFwLT5iaXRtYXAgPSBremFsbG9jKEJJVFNfVE9fTE9OR1MobWF4X2NvdW50KSAqIHNpemVvZihsb25nKSwKKwkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWJtYXAtPmJpdG1hcCkgeworCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJICAicWVkIGJtYXAgYWxsb2MgZmFpbGVkOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IChiaXRtYXApXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIkFsbG9jYXRlZCBiaXRtYXAgJXBcbiIsCisJCSAgIGJtYXAtPmJpdG1hcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcWVkX3JkbWFfYm1hcF9hbGxvY19pZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgIHN0cnVjdCBxZWRfYm1hcCAqYm1hcCwgdTMyICppZF9udW0pCit7CisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgImJtYXAgPSAlcFxuIiwgYm1hcCk7CisKKwkqaWRfbnVtID0gZmluZF9maXJzdF96ZXJvX2JpdChibWFwLT5iaXRtYXAsIGJtYXAtPm1heF9jb3VudCk7CisKKwlpZiAoKmlkX251bSA+PSBibWFwLT5tYXhfY291bnQpIHsKKwkJRFBfTk9USUNFKHBfaHdmbiwgIm5vIGlkIGF2YWlsYWJsZSBtYXhfY291bnQ9JWRcbiIsCisJCQkgIGJtYXAtPm1heF9jb3VudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCV9fc2V0X2JpdCgqaWRfbnVtLCBibWFwLT5iaXRtYXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHFlZF9ibWFwX3JlbGVhc2VfaWQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJc3RydWN0IHFlZF9ibWFwICpibWFwLCB1MzIgaWRfbnVtKQoreworCWJvb2wgYl9hY3F1aXJlZDsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJpZF9udW0gPSAlMDh4IiwgaWRfbnVtKTsKKwlpZiAoaWRfbnVtID49IGJtYXAtPm1heF9jb3VudCkKKwkJcmV0dXJuOworCisJYl9hY3F1aXJlZCA9IHRlc3RfYW5kX2NsZWFyX2JpdChpZF9udW0sIGJtYXAtPmJpdG1hcCk7CisJaWYgKCFiX2FjcXVpcmVkKSB7CisJCURQX05PVElDRShwX2h3Zm4sICJJRCAlZCBhbHJlYWR5IHJlbGVhc2VkXG4iLCBpZF9udW0pOworCQlyZXR1cm47CisJfQorfQorCit1MzIgcWVkX3JkbWFfZ2V0X3NiX2lkKHZvaWQgKnBfaHdmbiwgdTMyIHJlbF9zYl9pZCkKK3sKKwkvKiBGaXJzdCBzYiBpZCBmb3IgUm9DRSBpcyBhZnRlciBhbGwgdGhlIGwyIHNiICovCisJcmV0dXJuIEZFQVRfTlVNKChzdHJ1Y3QgcWVkX2h3Zm4gKilwX2h3Zm4sIFFFRF9QRl9MMl9RVUUpICsgcmVsX3NiX2lkOworfQorCit1MzIgcWVkX3JkbWFfcXVlcnlfY2F1X3RpbWVyX3Jlcyh2b2lkICpyZG1hX2N4dCkKK3sKKwlyZXR1cm4gUUVEX0NBVV9ERUZfUlhfVElNRVJfUkVTOworfQorCitzdGF0aWMgaW50IHFlZF9yZG1hX2FsbG9jKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkgIHN0cnVjdCBxZWRfcmRtYV9zdGFydF9pbl9wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgcWVkX3JkbWFfaW5mbyAqcF9yZG1hX2luZm87CisJdTMyIG51bV9jb25zLCBudW1fdGFza3M7CisJaW50IHJjID0gLUVOT01FTTsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJBbGxvY2F0aW5nIFJETUFcbiIpOworCisJLyogQWxsb2NhdGUgYSBzdHJ1Y3Qgd2l0aCBjdXJyZW50IHBmIHJkbWEgaW5mbyAqLworCXBfcmRtYV9pbmZvID0ga3phbGxvYyhzaXplb2YoKnBfcmRtYV9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwX3JkbWFfaW5mbykgeworCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJICAicWVkIHJkbWEgYWxsb2MgZmFpbGVkOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IChyZG1hIGluZm8pLiByYyA9ICVkXG4iLAorCQkJICByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlwX2h3Zm4tPnBfcmRtYV9pbmZvID0gcF9yZG1hX2luZm87CisJcF9yZG1hX2luZm8tPnByb3RvID0gUFJPVE9DT0xJRF9ST0NFOworCisJbnVtX2NvbnMgPSBxZWRfY3h0X2dldF9wcm90b19jaWRfY291bnQocF9od2ZuLCBwX3JkbWFfaW5mby0+cHJvdG8sIDApOworCisJcF9yZG1hX2luZm8tPm51bV9xcHMgPSBudW1fY29ucyAvIDI7CisKKwludW1fdGFza3MgPSBxZWRfY3h0X2dldF9wcm90b190aWRfY291bnQocF9od2ZuLCBQUk9UT0NPTElEX1JPQ0UpOworCisJLyogRWFjaCBNUiB1c2VzIGEgc2luZ2xlIHRhc2sgKi8KKwlwX3JkbWFfaW5mby0+bnVtX21ycyA9IG51bV90YXNrczsKKworCS8qIFF1ZXVlIHpvbmUgbGluZXMgYXJlIHNoYXJlZCBiZXR3ZWVuIFJvQ0UgYW5kIEwyIGluIHN1Y2ggYSB3YXkgdGhhdAorCSAqIHRoZXkgY2FuIGJlIHVzZWQgYnkgZWFjaCB3aXRob3V0IG9ic3RydWN0aW5nIHRoZSBvdGhlci4KKwkgKi8KKwlwX3JkbWFfaW5mby0+cXVldWVfem9uZV9iYXNlID0gKHUxNilGRUFUX05VTShwX2h3Zm4sIFFFRF9MMl9RVUVVRSk7CisKKwkvKiBBbGxvY2F0ZSBhIHN0cnVjdCB3aXRoIGRldmljZSBwYXJhbXMgYW5kIGZpbGwgaXQgKi8KKwlwX3JkbWFfaW5mby0+ZGV2ID0ga3phbGxvYyhzaXplb2YoKnBfcmRtYV9pbmZvLT5kZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBfcmRtYV9pbmZvLT5kZXYpIHsKKwkJRFBfTk9USUNFKHBfaHdmbiwKKwkJCSAgInFlZCByZG1hIGFsbG9jIGZhaWxlZDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSAocmRtYSBpbmZvIGRldikuIHJjID0gJWRcbiIsCisJCQkgIHJjKTsKKwkJZ290byBmcmVlX3JkbWFfaW5mbzsKKwl9CisKKwkvKiBBbGxvY2F0ZSBhIHN0cnVjdCB3aXRoIHBvcnQgcGFyYW1zIGFuZCBmaWxsIGl0ICovCisJcF9yZG1hX2luZm8tPnBvcnQgPSBremFsbG9jKHNpemVvZigqcF9yZG1hX2luZm8tPnBvcnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBfcmRtYV9pbmZvLT5wb3J0KSB7CisJCURQX05PVElDRShwX2h3Zm4sCisJCQkgICJxZWQgcmRtYSBhbGxvYyBmYWlsZWQ6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgKHJkbWEgaW5mbyBwb3J0KS4gcmMgPSAlZFxuIiwKKwkJCSAgcmMpOworCQlnb3RvIGZyZWVfcmRtYV9kZXY7CisJfQorCisJLyogQWxsb2NhdGUgYml0IG1hcCBmb3IgcGQncyAqLworCXJjID0gcWVkX3JkbWFfYm1hcF9hbGxvYyhwX2h3Zm4sICZwX3JkbWFfaW5mby0+cGRfbWFwLCBSRE1BX01BWF9QRFMpOworCWlmIChyYykgeworCQlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLAorCQkJICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBwZF9tYXAsIHJjID0gJWRcbiIsCisJCQkgICByYyk7CisJCWdvdG8gZnJlZV9yZG1hX3BvcnQ7CisJfQorCisJLyogQWxsb2NhdGUgRFBJIGJpdG1hcCAqLworCXJjID0gcWVkX3JkbWFfYm1hcF9hbGxvYyhwX2h3Zm4sICZwX3JkbWFfaW5mby0+ZHBpX21hcCwKKwkJCQkgcF9od2ZuLT5kcGlfY291bnQpOworCWlmIChyYykgeworCQlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLAorCQkJICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBEUEkgYml0bWFwLCByYyA9ICVkXG4iLCByYyk7CisJCWdvdG8gZnJlZV9wZF9tYXA7CisJfQorCisJLyogQWxsb2NhdGUgYml0bWFwIGZvciBjcSdzLiBUaGUgbWF4aW11bSBudW1iZXIgb2YgQ1FzIGlzIGJvdW5kZWQgdG8KKwkgKiB0d2ljZSB0aGUgbnVtYmVyIG9mIFFQcy4KKwkgKi8KKwlyYyA9IHFlZF9yZG1hX2JtYXBfYWxsb2MocF9od2ZuLCAmcF9yZG1hX2luZm8tPmNxX21hcCwKKwkJCQkgcF9yZG1hX2luZm8tPm51bV9xcHMgKiAyKTsKKwlpZiAocmMpIHsKKwkJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwKKwkJCSAgICJGYWlsZWQgdG8gYWxsb2NhdGUgY3EgYml0bWFwLCByYyA9ICVkXG4iLCByYyk7CisJCWdvdG8gZnJlZV9kcGlfbWFwOworCX0KKworCS8qIEFsbG9jYXRlIGJpdG1hcCBmb3IgdG9nZ2xlIGJpdCBmb3IgY3EgaWNpZHMKKwkgKiBXZSB0b2dnbGUgdGhlIGJpdCBldmVyeSB0aW1lIHdlIGNyZWF0ZSBvciByZXNpemUgY3EgZm9yIGEgZ2l2ZW4gaWNpZC4KKwkgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgQ1FzIGlzIGJvdW5kZWQgdG8gIHR3aWNlIHRoZSBudW1iZXIgb2YgUVBzLgorCSAqLworCXJjID0gcWVkX3JkbWFfYm1hcF9hbGxvYyhwX2h3Zm4sICZwX3JkbWFfaW5mby0+dG9nZ2xlX2JpdHMsCisJCQkJIHBfcmRtYV9pbmZvLT5udW1fcXBzICogMik7CisJaWYgKHJjKSB7CisJCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsCisJCQkgICAiRmFpbGVkIHRvIGFsbG9jYXRlIHRvb2dsZSBiaXRzLCByYyA9ICVkXG4iLCByYyk7CisJCWdvdG8gZnJlZV9jcV9tYXA7CisJfQorCisJLyogQWxsb2NhdGUgYml0bWFwIGZvciBpdGlkcyAqLworCXJjID0gcWVkX3JkbWFfYm1hcF9hbGxvYyhwX2h3Zm4sICZwX3JkbWFfaW5mby0+dGlkX21hcCwKKwkJCQkgcF9yZG1hX2luZm8tPm51bV9tcnMpOworCWlmIChyYykgeworCQlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLAorCQkJICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBpdGlkcyBiaXRtYXBzLCByYyA9ICVkXG4iLCByYyk7CisJCWdvdG8gZnJlZV90b2dnbGVfbWFwOworCX0KKworCS8qIEFsbG9jYXRlIGJpdG1hcCBmb3IgY2lkcyB1c2VkIGZvciBxcHMuICovCisJcmMgPSBxZWRfcmRtYV9ibWFwX2FsbG9jKHBfaHdmbiwgJnBfcmRtYV9pbmZvLT5jaWRfbWFwLCBudW1fY29ucyk7CisJaWYgKHJjKSB7CisJCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsCisJCQkgICAiRmFpbGVkIHRvIGFsbG9jYXRlIGNpZCBiaXRtYXAsIHJjID0gJWRcbiIsIHJjKTsKKwkJZ290byBmcmVlX3RpZF9tYXA7CisJfQorCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIkFsbG9jYXRpb24gc3VjY2Vzc2Z1bFxuIik7CisJcmV0dXJuIDA7CisKK2ZyZWVfdGlkX21hcDoKKwlrZnJlZShwX3JkbWFfaW5mby0+dGlkX21hcC5iaXRtYXApOworZnJlZV90b2dnbGVfbWFwOgorCWtmcmVlKHBfcmRtYV9pbmZvLT50b2dnbGVfYml0cy5iaXRtYXApOworZnJlZV9jcV9tYXA6CisJa2ZyZWUocF9yZG1hX2luZm8tPmNxX21hcC5iaXRtYXApOworZnJlZV9kcGlfbWFwOgorCWtmcmVlKHBfcmRtYV9pbmZvLT5kcGlfbWFwLmJpdG1hcCk7CitmcmVlX3BkX21hcDoKKwlrZnJlZShwX3JkbWFfaW5mby0+cGRfbWFwLmJpdG1hcCk7CitmcmVlX3JkbWFfcG9ydDoKKwlrZnJlZShwX3JkbWFfaW5mby0+cG9ydCk7CitmcmVlX3JkbWFfZGV2OgorCWtmcmVlKHBfcmRtYV9pbmZvLT5kZXYpOworZnJlZV9yZG1hX2luZm86CisJa2ZyZWUocF9yZG1hX2luZm8pOworCisJcmV0dXJuIHJjOworfQorCit2b2lkIHFlZF9yZG1hX3Jlc2NfZnJlZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbikKK3sKKwlzdHJ1Y3QgcWVkX3JkbWFfaW5mbyAqcF9yZG1hX2luZm8gPSBwX2h3Zm4tPnBfcmRtYV9pbmZvOworCisJa2ZyZWUocF9yZG1hX2luZm8tPmNpZF9tYXAuYml0bWFwKTsKKwlrZnJlZShwX3JkbWFfaW5mby0+dGlkX21hcC5iaXRtYXApOworCWtmcmVlKHBfcmRtYV9pbmZvLT50b2dnbGVfYml0cy5iaXRtYXApOworCWtmcmVlKHBfcmRtYV9pbmZvLT5jcV9tYXAuYml0bWFwKTsKKwlrZnJlZShwX3JkbWFfaW5mby0+ZHBpX21hcC5iaXRtYXApOworCWtmcmVlKHBfcmRtYV9pbmZvLT5wZF9tYXAuYml0bWFwKTsKKworCWtmcmVlKHBfcmRtYV9pbmZvLT5wb3J0KTsKKwlrZnJlZShwX3JkbWFfaW5mby0+ZGV2KTsKKworCWtmcmVlKHBfcmRtYV9pbmZvKTsKK30KKworc3RhdGljIHZvaWQgcWVkX3JkbWFfZnJlZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbikKK3sKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiRnJlZWluZyBSRE1BXG4iKTsKKworCXFlZF9yZG1hX3Jlc2NfZnJlZShwX2h3Zm4pOworfQorCitzdGF0aWMgdm9pZCBxZWRfcmRtYV9nZXRfZ3VpZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgdTggKmd1aWQpCit7CisJZ3VpZFswXSA9IHBfaHdmbi0+aHdfaW5mby5od19tYWNfYWRkclswXSBeIDI7CisJZ3VpZFsxXSA9IHBfaHdmbi0+aHdfaW5mby5od19tYWNfYWRkclsxXTsKKwlndWlkWzJdID0gcF9od2ZuLT5od19pbmZvLmh3X21hY19hZGRyWzJdOworCWd1aWRbM10gPSAweGZmOworCWd1aWRbNF0gPSAweGZlOworCWd1aWRbNV0gPSBwX2h3Zm4tPmh3X2luZm8uaHdfbWFjX2FkZHJbM107CisJZ3VpZFs2XSA9IHBfaHdmbi0+aHdfaW5mby5od19tYWNfYWRkcls0XTsKKwlndWlkWzddID0gcF9od2ZuLT5od19pbmZvLmh3X21hY19hZGRyWzVdOworfQorCitzdGF0aWMgdm9pZCBxZWRfcmRtYV9pbml0X2V2ZW50cyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgc3RydWN0IHFlZF9yZG1hX3N0YXJ0X2luX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBxZWRfcmRtYV9ldmVudHMgKmV2ZW50czsKKworCWV2ZW50cyA9ICZwX2h3Zm4tPnBfcmRtYV9pbmZvLT5ldmVudHM7CisKKwlldmVudHMtPnVuYWZmaWxpYXRlZF9ldmVudCA9IHBhcmFtcy0+ZXZlbnRzLT51bmFmZmlsaWF0ZWRfZXZlbnQ7CisJZXZlbnRzLT5hZmZpbGlhdGVkX2V2ZW50ID0gcGFyYW1zLT5ldmVudHMtPmFmZmlsaWF0ZWRfZXZlbnQ7CisJZXZlbnRzLT5jb250ZXh0ID0gcGFyYW1zLT5ldmVudHMtPmNvbnRleHQ7Cit9CisKK3N0YXRpYyB2b2lkIHFlZF9yZG1hX2luaXRfZGV2aW5mbyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgIHN0cnVjdCBxZWRfcmRtYV9zdGFydF9pbl9wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgcWVkX3JkbWFfZGV2aWNlICpkZXYgPSBwX2h3Zm4tPnBfcmRtYV9pbmZvLT5kZXY7CisJc3RydWN0IHFlZF9kZXYgKmNkZXYgPSBwX2h3Zm4tPmNkZXY7CisJdTMyIHBjaV9zdGF0dXNfY29udHJvbDsKKwl1MzIgbnVtX3FwczsKKworCS8qIFZlbmRvciBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLworCWRldi0+dmVuZG9yX2lkID0gY2Rldi0+dmVuZG9yX2lkOworCWRldi0+dmVuZG9yX3BhcnRfaWQgPSBjZGV2LT5kZXZpY2VfaWQ7CisJZGV2LT5od192ZXIgPSAwOworCWRldi0+ZndfdmVyID0gKEZXX01BSk9SX1ZFUlNJT04gPDwgMjQpIHwgKEZXX01JTk9SX1ZFUlNJT04gPDwgMTYpIHwKKwkJICAgICAgKEZXX1JFVklTSU9OX1ZFUlNJT04gPDwgOCkgfCAoRldfRU5HSU5FRVJJTkdfVkVSU0lPTik7CisKKwlxZWRfcmRtYV9nZXRfZ3VpZChwX2h3Zm4sICh1OCAqKSZkZXYtPnN5c19pbWFnZV9ndWlkKTsKKwlkZXYtPm5vZGVfZ3VpZCA9IGRldi0+c3lzX2ltYWdlX2d1aWQ7CisKKwlkZXYtPm1heF9zZ2UgPSBtaW5fdCh1MzIsIFJETUFfTUFYX1NHRV9QRVJfU1FfV1FFLAorCQkJICAgICBSRE1BX01BWF9TR0VfUEVSX1JRX1dRRSk7CisKKwlpZiAoY2Rldi0+cmRtYV9tYXhfc2dlKQorCQlkZXYtPm1heF9zZ2UgPSBtaW5fdCh1MzIsIGNkZXYtPnJkbWFfbWF4X3NnZSwgZGV2LT5tYXhfc2dlKTsKKworCWRldi0+bWF4X2lubGluZSA9IFJPQ0VfUkVRX01BWF9JTkxJTkVfREFUQV9TSVpFOworCisJZGV2LT5tYXhfaW5saW5lID0gKGNkZXYtPnJkbWFfbWF4X2lubGluZSkgPworCQkJICBtaW5fdCh1MzIsIGNkZXYtPnJkbWFfbWF4X2lubGluZSwgZGV2LT5tYXhfaW5saW5lKSA6CisJCQkgIGRldi0+bWF4X2lubGluZTsKKworCWRldi0+bWF4X3dxZSA9IFFFRF9SRE1BX01BWF9XUUU7CisJZGV2LT5tYXhfY25xID0gKHU4KUZFQVRfTlVNKHBfaHdmbiwgUUVEX1JETUFfQ05RKTsKKworCS8qIFRoZSBudW1iZXIgb2YgUVBzIG1heSBiZSBoaWdoZXIgdGhhbiBRRURfUk9DRV9NQVhfUVBTLCBiZWNhdXNlCisJICogaXQgaXMgdXAtYWxpZ25lZCB0byAxNiBhbmQgdGhlbiB0byBJTFQgcGFnZSBzaXplIHdpdGhpbiBxZWQgY3h0LgorCSAqIFRoaXMgaXMgT0sgaW4gdGVybXMgb2YgSUxUIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGNvbmZpZ3VyZSB0aGUgRlcKKwkgKiBhYm92ZSBpdHMgYWJpbGl0aWVzCisJICovCisJbnVtX3FwcyA9IFJPQ0VfTUFYX1FQUzsKKwludW1fcXBzID0gbWluX3QodTY0LCBudW1fcXBzLCBwX2h3Zm4tPnBfcmRtYV9pbmZvLT5udW1fcXBzKTsKKwlkZXYtPm1heF9xcCA9IG51bV9xcHM7CisKKwkvKiBDUXMgdXNlcyB0aGUgc2FtZSBpY2lkcyB0aGF0IFFQcyB1c2UgaGVuY2UgdGhleSBhcmUgbGltaXRlZCBieSB0aGUKKwkgKiBudW1iZXIgb2YgaWNpZHMuIFRoZXJlIGFyZSB0d28gaWNpZHMgcGVyIFFQLgorCSAqLworCWRldi0+bWF4X2NxID0gbnVtX3FwcyAqIDI7CisKKwkvKiBUaGUgbnVtYmVyIG9mIG1ycyBpcyBzbWFsbGVyIGJ5IDEgc2luY2UgdGhlIGZpcnN0IGlzIHJlc2VydmVkICovCisJZGV2LT5tYXhfbXIgPSBwX2h3Zm4tPnBfcmRtYV9pbmZvLT5udW1fbXJzIC0gMTsKKwlkZXYtPm1heF9tcl9zaXplID0gUUVEX1JETUFfTUFYX01SX1NJWkU7CisKKwkvKiBUaGUgbWF4aW11bSBDUUUgY2FwYWNpdHkgcGVyIENRIHN1cHBvcnRlZC4KKwkgKiBtYXggbnVtYmVyIG9mIGNxZXMgd2lsbCBiZSBpbiB0d28gbGF5ZXIgcGJsLAorCSAqIDggaXMgdGhlIHBvaW50ZXIgc2l6ZSBpbiBieXRlcworCSAqIDMyIGlzIHRoZSBzaXplIG9mIGNxIGVsZW1lbnQgaW4gYnl0ZXMKKwkgKi8KKwlpZiAocGFyYW1zLT5jcV9tb2RlID09IFFFRF9SRE1BX0NRX01PREVfMzJfQklUUykKKwkJZGV2LT5tYXhfY3FlID0gUUVEX1JETUFfTUFYX0NRRV8zMl9CSVQ7CisJZWxzZQorCQlkZXYtPm1heF9jcWUgPSBRRURfUkRNQV9NQVhfQ1FFXzE2X0JJVDsKKworCWRldi0+bWF4X213ID0gMDsKKwlkZXYtPm1heF9mbXIgPSBRRURfUkRNQV9NQVhfRk1SOworCWRldi0+bWF4X21yX213X2Ztcl9wYmwgPSAoUEFHRV9TSVpFIC8gOCkgKiAoUEFHRV9TSVpFIC8gOCk7CisJZGV2LT5tYXhfbXJfbXdfZm1yX3NpemUgPSBkZXYtPm1heF9tcl9td19mbXJfcGJsICogUEFHRV9TSVpFOworCWRldi0+bWF4X3BrZXkgPSBRRURfUkRNQV9NQVhfUF9LRVk7CisKKwlkZXYtPm1heF9xcF9yZXNwX3JkX2F0b21pY19yZXNjID0gUkRNQV9SSU5HX1BBR0VfU0laRSAvCisJCQkJCSAgKFJETUFfUkVTUF9SRF9BVE9NSUNfRUxNX1NJWkUgKiAyKTsKKwlkZXYtPm1heF9xcF9yZXFfcmRfYXRvbWljX3Jlc2MgPSBSRE1BX1JJTkdfUEFHRV9TSVpFIC8KKwkJCQkJIFJETUFfUkVRX1JEX0FUT01JQ19FTE1fU0laRTsKKwlkZXYtPm1heF9kZXZfcmVzcF9yZF9hdG9taWNfcmVzYyA9IGRldi0+bWF4X3FwX3Jlc3BfcmRfYXRvbWljX3Jlc2MgKgorCQkJCQkgICBwX2h3Zm4tPnBfcmRtYV9pbmZvLT5udW1fcXBzOworCWRldi0+cGFnZV9zaXplX2NhcHMgPSBRRURfUkRNQV9QQUdFX1NJWkVfQ0FQUzsKKwlkZXYtPmRldl9hY2tfZGVsYXkgPSBRRURfUkRNQV9BQ0tfREVMQVk7CisJZGV2LT5tYXhfcGQgPSBSRE1BX01BWF9QRFM7CisJZGV2LT5tYXhfYWggPSBwX2h3Zm4tPnBfcmRtYV9pbmZvLT5udW1fcXBzOworCWRldi0+bWF4X3N0YXRzX3F1ZXVlcyA9ICh1OClSRVNDX05VTShwX2h3Zm4sIFFFRF9SRE1BX1NUQVRTX1FVRVVFKTsKKworCS8qIFNldCBjYXBhYmxpdGllcyAqLworCWRldi0+ZGV2X2NhcHMgPSAwOworCVNFVF9GSUVMRChkZXYtPmRldl9jYXBzLCBRRURfUkRNQV9ERVZfQ0FQX1JOUl9OQUssIDEpOworCVNFVF9GSUVMRChkZXYtPmRldl9jYXBzLCBRRURfUkRNQV9ERVZfQ0FQX1BPUlRfQUNUSVZFX0VWRU5ULCAxKTsKKwlTRVRfRklFTEQoZGV2LT5kZXZfY2FwcywgUUVEX1JETUFfREVWX0NBUF9QT1JUX0NIQU5HRV9FVkVOVCwgMSk7CisJU0VUX0ZJRUxEKGRldi0+ZGV2X2NhcHMsIFFFRF9SRE1BX0RFVl9DQVBfUkVTSVpFX0NRLCAxKTsKKwlTRVRfRklFTEQoZGV2LT5kZXZfY2FwcywgUUVEX1JETUFfREVWX0NBUF9CQVNFX01FTU9SWV9FWFQsIDEpOworCVNFVF9GSUVMRChkZXYtPmRldl9jYXBzLCBRRURfUkRNQV9ERVZfQ0FQX0JBU0VfUVVFVUVfRVhULCAxKTsKKwlTRVRfRklFTEQoZGV2LT5kZXZfY2FwcywgUUVEX1JETUFfREVWX0NBUF9aQlZBLCAxKTsKKwlTRVRfRklFTEQoZGV2LT5kZXZfY2FwcywgUUVEX1JETUFfREVWX0NBUF9MT0NBTF9JTlZfRkVOQ0UsIDEpOworCisJLyogQ2hlY2sgYXRvbWljIG9wZXJhdGlvbnMgc3VwcG9ydCBpbiBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZS4gKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoY2Rldi0+cGRldiwKKwkJCSAgICAgIGNkZXYtPnBkZXYtPnBjaWVfY2FwICsgUENJX0VYUF9ERVZDVEwyLAorCQkJICAgICAgJnBjaV9zdGF0dXNfY29udHJvbCk7CisKKwlpZiAocGNpX3N0YXR1c19jb250cm9sICYgUENJX0VYUF9ERVZDVEwyX0xUUl9FTikKKwkJU0VUX0ZJRUxEKGRldi0+ZGV2X2NhcHMsIFFFRF9SRE1BX0RFVl9DQVBfQVRPTUlDX09QLCAxKTsKK30KKworc3RhdGljIHZvaWQgcWVkX3JkbWFfaW5pdF9wb3J0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuKQoreworCXN0cnVjdCBxZWRfcmRtYV9wb3J0ICpwb3J0ID0gcF9od2ZuLT5wX3JkbWFfaW5mby0+cG9ydDsKKwlzdHJ1Y3QgcWVkX3JkbWFfZGV2aWNlICpkZXYgPSBwX2h3Zm4tPnBfcmRtYV9pbmZvLT5kZXY7CisKKwlwb3J0LT5wb3J0X3N0YXRlID0gcF9od2ZuLT5tY3BfaW5mby0+bGlua19vdXRwdXQubGlua191cCA/CisJCQkgICBRRURfUkRNQV9QT1JUX1VQIDogUUVEX1JETUFfUE9SVF9ET1dOOworCisJcG9ydC0+bWF4X21zZ19zaXplID0gbWluX3QodTY0LAorCQkJCSAgIChkZXYtPm1heF9tcl9td19mbXJfc2l6ZSAqCisJCQkJICAgIHBfaHdmbi0+Y2Rldi0+cmRtYV9tYXhfc2dlKSwKKwkJCQkgICBCSVQoMzEpKTsKKworCXBvcnQtPnBrZXlfYmFkX2NvdW50ZXIgPSAwOworfQorCitzdGF0aWMgaW50IHFlZF9yZG1hX2luaXRfaHcoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKK3sKKwl1MzIgbGwyX2V0aGVydHlwZV9lbjsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJJbml0aWFsaXppbmcgSFdcbiIpOworCXBfaHdmbi0+Yl9yZG1hX2VuYWJsZWRfaW5fcHJzID0gZmFsc2U7CisKKwlxZWRfd3IocF9od2ZuLCBwX3B0dCwgUFJTX1JFR19ST0NFX0RFU1RfUVBfTUFYX1BGLCAwKTsKKworCXBfaHdmbi0+cmRtYV9wcnNfc2VhcmNoX3JlZyA9IFBSU19SRUdfU0VBUkNIX1JPQ0U7CisKKwkvKiBXZSBkZWxheSB3cml0aW5nIHRvIHRoaXMgcmVnIHVudGlsIGZpcnN0IGNpZCBpcyBhbGxvY2F0ZWQuIFNlZQorCSAqIHFlZF9jeHRfZHluYW1pY19pbHRfYWxsb2MgZnVuY3Rpb24gZm9yIG1vcmUgZGV0YWlscworCSAqLworCWxsMl9ldGhlcnR5cGVfZW4gPSBxZWRfcmQocF9od2ZuLCBwX3B0dCwgUFJTX1JFR19MSUdIVF9MMl9FVEhFUlRZUEVfRU4pOworCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBQUlNfUkVHX0xJR0hUX0wyX0VUSEVSVFlQRV9FTiwKKwkgICAgICAgKGxsMl9ldGhlcnR5cGVfZW4gfCAweDAxKSk7CisKKwlpZiAocWVkX2N4dF9nZXRfcHJvdG9fY2lkX3N0YXJ0KHBfaHdmbiwgUFJPVE9DT0xJRF9ST0NFKSAlIDIpIHsKKwkJRFBfTk9USUNFKHBfaHdmbiwgIlRoZSBmaXJzdCBSb0NFJ3MgY2lkIHNob3VsZCBiZSBldmVuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIkluaXRpYWxpemluZyBIVyAtIERvbmVcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFlZF9yZG1hX3N0YXJ0X2Z3KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgICBzdHJ1Y3QgcWVkX3JkbWFfc3RhcnRfaW5fcGFyYW1zICpwYXJhbXMsCisJCQkgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKK3sKKwlzdHJ1Y3QgcmRtYV9pbml0X2Z1bmNfcmFtcm9kX2RhdGEgKnBfcmFtcm9kOworCXN0cnVjdCBxZWRfcmRtYV9jbnFfcGFyYW1zICpwX2NucV9wYmxfbGlzdDsKKwlzdHJ1Y3QgcmRtYV9pbml0X2Z1bmNfaGRyICpwX3BhcmFtc19oZWFkZXI7CisJc3RydWN0IHJkbWFfY25xX3BhcmFtcyAqcF9jbnFfcGFyYW1zOworCXN0cnVjdCBxZWRfc3BfaW5pdF9kYXRhIGluaXRfZGF0YTsKKwlzdHJ1Y3QgcWVkX3NwcV9lbnRyeSAqcF9lbnQ7CisJdTMyIGNucV9pZCwgc2JfaWQ7CisJaW50IHJjOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIlN0YXJ0aW5nIEZXXG4iKTsKKworCS8qIFNhdmUgdGhlIG51bWJlciBvZiBjbnFzIGZvciB0aGUgZnVuY3Rpb24gY2xvc2UgcmFtcm9kICovCisJcF9od2ZuLT5wX3JkbWFfaW5mby0+bnVtX2NucXMgPSBwYXJhbXMtPmRlc2lyZWRfY25xOworCisJLyogR2V0IFNQUSBlbnRyeSAqLworCW1lbXNldCgmaW5pdF9kYXRhLCAwLCBzaXplb2YoaW5pdF9kYXRhKSk7CisJaW5pdF9kYXRhLm9wYXF1ZV9maWQgPSBwX2h3Zm4tPmh3X2luZm8ub3BhcXVlX2ZpZDsKKwlpbml0X2RhdGEuY29tcF9tb2RlID0gUUVEX1NQUV9NT0RFX0VCTE9DSzsKKworCXJjID0gcWVkX3NwX2luaXRfcmVxdWVzdChwX2h3Zm4sICZwX2VudCwgUkRNQV9SQU1ST0RfRlVOQ19JTklULAorCQkJCSBwX2h3Zm4tPnBfcmRtYV9pbmZvLT5wcm90bywgJmluaXRfZGF0YSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlwX3JhbXJvZCA9ICZwX2VudC0+cmFtcm9kLnJvY2VfaW5pdF9mdW5jLnJkbWE7CisKKwlwX3BhcmFtc19oZWFkZXIgPSAmcF9yYW1yb2QtPnBhcmFtc19oZWFkZXI7CisJcF9wYXJhbXNfaGVhZGVyLT5jbnFfc3RhcnRfb2Zmc2V0ID0gKHU4KVJFU0NfU1RBUlQocF9od2ZuLAorCQkJCQkJCSAgIFFFRF9SRE1BX0NOUV9SQU0pOworCXBfcGFyYW1zX2hlYWRlci0+bnVtX2NucXMgPSBwYXJhbXMtPmRlc2lyZWRfY25xOworCisJaWYgKHBhcmFtcy0+Y3FfbW9kZSA9PSBRRURfUkRNQV9DUV9NT0RFXzE2X0JJVFMpCisJCXBfcGFyYW1zX2hlYWRlci0+Y3FfcmluZ19tb2RlID0gMTsKKwllbHNlCisJCXBfcGFyYW1zX2hlYWRlci0+Y3FfcmluZ19tb2RlID0gMDsKKworCWZvciAoY25xX2lkID0gMDsgY25xX2lkIDwgcGFyYW1zLT5kZXNpcmVkX2NucTsgY25xX2lkKyspIHsKKwkJc2JfaWQgPSBxZWRfcmRtYV9nZXRfc2JfaWQocF9od2ZuLCBjbnFfaWQpOworCQlwX2NucV9wYXJhbXMgPSAmcF9yYW1yb2QtPmNucV9wYXJhbXNbY25xX2lkXTsKKwkJcF9jbnFfcGJsX2xpc3QgPSAmcGFyYW1zLT5jbnFfcGJsX2xpc3RbY25xX2lkXTsKKwkJcF9jbnFfcGFyYW1zLT5zYl9udW0gPQorCQkJY3B1X3RvX2xlMTYocF9od2ZuLT5zYnNfaW5mb1tzYl9pZF0tPmlndV9zYl9pZCk7CisKKwkJcF9jbnFfcGFyYW1zLT5zYl9pbmRleCA9IHBfaHdmbi0+cGZfcGFyYW1zLnJkbWFfcGZfcGFyYW1zLmdsX3BpOworCQlwX2NucV9wYXJhbXMtPm51bV9wYmxfcGFnZXMgPSBwX2NucV9wYmxfbGlzdC0+bnVtX3BibF9wYWdlczsKKworCQlETUFfUkVHUEFJUl9MRShwX2NucV9wYXJhbXMtPnBibF9iYXNlX2FkZHIsCisJCQkgICAgICAgcF9jbnFfcGJsX2xpc3QtPnBibF9wdHIpOworCisJCS8qIHdlIGFzc3VtZSBoZXJlIHRoYXQgY25xX2lkIGFuZCBxel9vZmZzZXQgYXJlIHRoZSBzYW1lICovCisJCXBfY25xX3BhcmFtcy0+cXVldWVfem9uZV9udW0gPQorCQkJY3B1X3RvX2xlMTYocF9od2ZuLT5wX3JkbWFfaW5mby0+cXVldWVfem9uZV9iYXNlICsKKwkJCQkgICAgY25xX2lkKTsKKwl9CisKKwlyZXR1cm4gcWVkX3NwcV9wb3N0KHBfaHdmbiwgcF9lbnQsIE5VTEwpOworfQorCitzdGF0aWMgaW50IHFlZF9yZG1hX3Jlc2VydmVfbGtleShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbikKK3sKKwlzdHJ1Y3QgcWVkX3JkbWFfZGV2aWNlICpkZXYgPSBwX2h3Zm4tPnBfcmRtYV9pbmZvLT5kZXY7CisKKwkvKiBUaGUgZmlyc3QgRFBJIGlzIHJlc2VydmVkIGZvciB0aGUgS2VybmVsICovCisJX19zZXRfYml0KDAsIHBfaHdmbi0+cF9yZG1hX2luZm8tPmRwaV9tYXAuYml0bWFwKTsKKworCS8qIFRpZCAwIHdpbGwgYmUgdXNlZCBhcyB0aGUga2V5IGZvciAicmVzZXJ2ZWQgTVIiLgorCSAqIFRoZSBkcml2ZXIgc2hvdWxkIGFsbG9jYXRlIG1lbW9yeSBmb3IgaXQgc28gaXQgY2FuIGJlIGxvYWRlZCBidXQgbm8KKwkgKiByYW1yb2Qgc2hvdWxkIGJlIHBhc3NlZCBvbiBpdC4KKwkgKi8KKwlxZWRfcmRtYV9hbGxvY190aWQocF9od2ZuLCAmZGV2LT5yZXNlcnZlZF9sa2V5KTsKKwlpZiAoZGV2LT5yZXNlcnZlZF9sa2V5ICE9IFJETUFfUkVTRVJWRURfTEtFWSkgeworCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJICAiUmVzZXJ2ZWQgbGtleSBzaG91bGQgYmUgZXF1YWwgdG8gUkRNQV9SRVNFUlZFRF9MS0VZXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcWVkX3JkbWFfc2V0dXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCSAgc3RydWN0IHFlZF9yZG1hX3N0YXJ0X2luX3BhcmFtcyAqcGFyYW1zKQoreworCWludCByYzsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJSRE1BIHNldHVwXG4iKTsKKworCXNwaW5fbG9ja19pbml0KCZwX2h3Zm4tPnBfcmRtYV9pbmZvLT5sb2NrKTsKKworCXFlZF9yZG1hX2luaXRfZGV2aW5mbyhwX2h3Zm4sIHBhcmFtcyk7CisJcWVkX3JkbWFfaW5pdF9wb3J0KHBfaHdmbik7CisJcWVkX3JkbWFfaW5pdF9ldmVudHMocF9od2ZuLCBwYXJhbXMpOworCisJcmMgPSBxZWRfcmRtYV9yZXNlcnZlX2xrZXkocF9od2ZuKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gcWVkX3JkbWFfaW5pdF9odyhwX2h3Zm4sIHBfcHR0KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJldHVybiBxZWRfcmRtYV9zdGFydF9mdyhwX2h3Zm4sIHBhcmFtcywgcF9wdHQpOworfQorCitpbnQgcWVkX3JkbWFfc3RvcCh2b2lkICpyZG1hX2N4dCkKK3sKKwlzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiA9IChzdHJ1Y3QgcWVkX2h3Zm4gKilyZG1hX2N4dDsKKwlzdHJ1Y3QgcmRtYV9jbG9zZV9mdW5jX3JhbXJvZF9kYXRhICpwX3JhbXJvZDsKKwlzdHJ1Y3QgcWVkX3NwX2luaXRfZGF0YSBpbml0X2RhdGE7CisJc3RydWN0IHFlZF9zcHFfZW50cnkgKnBfZW50OworCXN0cnVjdCBxZWRfcHR0ICpwX3B0dDsKKwl1MzIgbGwyX2V0aGVydHlwZV9lbjsKKwlpbnQgcmMgPSAtRUJVU1k7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiUkRNQSBzdG9wXG4iKTsKKworCXBfcHR0ID0gcWVkX3B0dF9hY3F1aXJlKHBfaHdmbik7CisJaWYgKCFwX3B0dCkgeworCQlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiRmFpbGVkIHRvIGFjcXVpcmUgUFRUXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIERpc2FibGUgUm9DRSBzZWFyY2ggKi8KKwlxZWRfd3IocF9od2ZuLCBwX3B0dCwgcF9od2ZuLT5yZG1hX3Byc19zZWFyY2hfcmVnLCAwKTsKKwlwX2h3Zm4tPmJfcmRtYV9lbmFibGVkX2luX3BycyA9IGZhbHNlOworCisJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIFBSU19SRUdfUk9DRV9ERVNUX1FQX01BWF9QRiwgMCk7CisKKwlsbDJfZXRoZXJ0eXBlX2VuID0gcWVkX3JkKHBfaHdmbiwgcF9wdHQsIFBSU19SRUdfTElHSFRfTDJfRVRIRVJUWVBFX0VOKTsKKworCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBQUlNfUkVHX0xJR0hUX0wyX0VUSEVSVFlQRV9FTiwKKwkgICAgICAgKGxsMl9ldGhlcnR5cGVfZW4gJiAweEZGRkUpKTsKKworCXFlZF9wdHRfcmVsZWFzZShwX2h3Zm4sIHBfcHR0KTsKKworCS8qIEdldCBTUFEgZW50cnkgKi8KKwltZW1zZXQoJmluaXRfZGF0YSwgMCwgc2l6ZW9mKGluaXRfZGF0YSkpOworCWluaXRfZGF0YS5vcGFxdWVfZmlkID0gcF9od2ZuLT5od19pbmZvLm9wYXF1ZV9maWQ7CisJaW5pdF9kYXRhLmNvbXBfbW9kZSA9IFFFRF9TUFFfTU9ERV9FQkxPQ0s7CisKKwkvKiBTdG9wIFJvQ0UgKi8KKwlyYyA9IHFlZF9zcF9pbml0X3JlcXVlc3QocF9od2ZuLCAmcF9lbnQsIFJETUFfUkFNUk9EX0ZVTkNfQ0xPU0UsCisJCQkJIHBfaHdmbi0+cF9yZG1hX2luZm8tPnByb3RvLCAmaW5pdF9kYXRhKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCisJcF9yYW1yb2QgPSAmcF9lbnQtPnJhbXJvZC5yZG1hX2Nsb3NlX2Z1bmM7CisKKwlwX3JhbXJvZC0+bnVtX2NucXMgPSBwX2h3Zm4tPnBfcmRtYV9pbmZvLT5udW1fY25xczsKKwlwX3JhbXJvZC0+Y25xX3N0YXJ0X29mZnNldCA9ICh1OClSRVNDX1NUQVJUKHBfaHdmbiwgUUVEX1JETUFfQ05RX1JBTSk7CisKKwlyYyA9IHFlZF9zcHFfcG9zdChwX2h3Zm4sIHBfZW50LCBOVUxMKTsKKworb3V0OgorCXFlZF9yZG1hX2ZyZWUocF9od2ZuKTsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJSRE1BIHN0b3AgZG9uZSwgcmMgPSAlZFxuIiwgcmMpOworCXJldHVybiByYzsKK30KKworaW50IHFlZF9yZG1hX2FkZF91c2VyKHZvaWQgKnJkbWFfY3h0LAorCQkgICAgICBzdHJ1Y3QgcWVkX3JkbWFfYWRkX3VzZXJfb3V0X3BhcmFtcyAqb3V0X3BhcmFtcykKK3sKKwlzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiA9IChzdHJ1Y3QgcWVkX2h3Zm4gKilyZG1hX2N4dDsKKwl1MzIgZHBpX3N0YXJ0X29mZnNldDsKKwl1MzIgcmV0dXJuZWRfaWQgPSAwOworCWludCByYzsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJBZGRpbmcgVXNlclxuIik7CisKKwkvKiBBbGxvY2F0ZSBEUEkgKi8KKwlzcGluX2xvY2tfYmgoJnBfaHdmbi0+cF9yZG1hX2luZm8tPmxvY2spOworCXJjID0gcWVkX3JkbWFfYm1hcF9hbGxvY19pZChwX2h3Zm4sICZwX2h3Zm4tPnBfcmRtYV9pbmZvLT5kcGlfbWFwLAorCQkJCSAgICAmcmV0dXJuZWRfaWQpOworCXNwaW5fdW5sb2NrX2JoKCZwX2h3Zm4tPnBfcmRtYV9pbmZvLT5sb2NrKTsKKworCW91dF9wYXJhbXMtPmRwaSA9ICh1MTYpcmV0dXJuZWRfaWQ7CisKKwkvKiBDYWxjdWxhdGUgdGhlIGNvcnJlc3BvbmRpbmcgRFBJIGFkZHJlc3MgKi8KKwlkcGlfc3RhcnRfb2Zmc2V0ID0gcF9od2ZuLT5kcGlfc3RhcnRfb2Zmc2V0OworCisJb3V0X3BhcmFtcy0+ZHBpX2FkZHIgPSAodTY0KSgodTggX19pb21lbSAqKXBfaHdmbi0+ZG9vcmJlbGxzICsKKwkJCQkgICAgIGRwaV9zdGFydF9vZmZzZXQgKworCQkJCSAgICAgKChvdXRfcGFyYW1zLT5kcGkpICogcF9od2ZuLT5kcGlfc2l6ZSkpOworCisJb3V0X3BhcmFtcy0+ZHBpX3BoeXNfYWRkciA9IHBfaHdmbi0+Y2Rldi0+ZGJfcGh5c19hZGRyICsKKwkJCQkgICAgZHBpX3N0YXJ0X29mZnNldCArCisJCQkJICAgICgob3V0X3BhcmFtcy0+ZHBpKSAqIHBfaHdmbi0+ZHBpX3NpemUpOworCisJb3V0X3BhcmFtcy0+ZHBpX3NpemUgPSBwX2h3Zm4tPmRwaV9zaXplOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIkFkZGluZyB1c2VyIC0gZG9uZSwgcmMgPSAlZFxuIiwgcmMpOworCXJldHVybiByYzsKK30KKworc3RydWN0IHFlZF9yZG1hX3BvcnQgKnFlZF9yZG1hX3F1ZXJ5X3BvcnQodm9pZCAqcmRtYV9jeHQpCit7CisJc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4gPSAoc3RydWN0IHFlZF9od2ZuICopcmRtYV9jeHQ7CisJc3RydWN0IHFlZF9yZG1hX3BvcnQgKnBfcG9ydCA9IHBfaHdmbi0+cF9yZG1hX2luZm8tPnBvcnQ7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiUkRNQSBRdWVyeSBwb3J0XG4iKTsKKworCS8qIExpbmsgbWF5IGhhdmUgY2hhbmdlZCAqLworCXBfcG9ydC0+cG9ydF9zdGF0ZSA9IHBfaHdmbi0+bWNwX2luZm8tPmxpbmtfb3V0cHV0LmxpbmtfdXAgPworCQkJICAgICBRRURfUkRNQV9QT1JUX1VQIDogUUVEX1JETUFfUE9SVF9ET1dOOworCisJcF9wb3J0LT5saW5rX3NwZWVkID0gcF9od2ZuLT5tY3BfaW5mby0+bGlua19vdXRwdXQuc3BlZWQ7CisKKwlyZXR1cm4gcF9wb3J0OworfQorCitzdHJ1Y3QgcWVkX3JkbWFfZGV2aWNlICpxZWRfcmRtYV9xdWVyeV9kZXZpY2Uodm9pZCAqcmRtYV9jeHQpCit7CisJc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4gPSAoc3RydWN0IHFlZF9od2ZuICopcmRtYV9jeHQ7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiUXVlcnkgZGV2aWNlXG4iKTsKKworCS8qIFJldHVybiBzdHJ1Y3Qgd2l0aCBkZXZpY2UgcGFyYW1ldGVycyAqLworCXJldHVybiBwX2h3Zm4tPnBfcmRtYV9pbmZvLT5kZXY7Cit9CisKK3ZvaWQgcWVkX3JkbWFfZnJlZV90aWQodm9pZCAqcmRtYV9jeHQsIHUzMiBpdGlkKQoreworCXN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuID0gKHN0cnVjdCBxZWRfaHdmbiAqKXJkbWFfY3h0OworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIml0aWQgPSAlMDh4XG4iLCBpdGlkKTsKKworCXNwaW5fbG9ja19iaCgmcF9od2ZuLT5wX3JkbWFfaW5mby0+bG9jayk7CisJcWVkX2JtYXBfcmVsZWFzZV9pZChwX2h3Zm4sICZwX2h3Zm4tPnBfcmRtYV9pbmZvLT50aWRfbWFwLCBpdGlkKTsKKwlzcGluX3VubG9ja19iaCgmcF9od2ZuLT5wX3JkbWFfaW5mby0+bG9jayk7Cit9CisKK2ludCBxZWRfcmRtYV9hbGxvY190aWQodm9pZCAqcmRtYV9jeHQsIHUzMiAqaXRpZCkKK3sKKwlzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiA9IChzdHJ1Y3QgcWVkX2h3Zm4gKilyZG1hX2N4dDsKKwlpbnQgcmM7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiQWxsb2NhdGUgVElEXG4iKTsKKworCXNwaW5fbG9ja19iaCgmcF9od2ZuLT5wX3JkbWFfaW5mby0+bG9jayk7CisJcmMgPSBxZWRfcmRtYV9ibWFwX2FsbG9jX2lkKHBfaHdmbiwKKwkJCQkgICAgJnBfaHdmbi0+cF9yZG1hX2luZm8tPnRpZF9tYXAsIGl0aWQpOworCXNwaW5fdW5sb2NrX2JoKCZwX2h3Zm4tPnBfcmRtYV9pbmZvLT5sb2NrKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCisJcmMgPSBxZWRfY3h0X2R5bmFtaWNfaWx0X2FsbG9jKHBfaHdmbiwgUUVEX0VMRU1fVEFTSywgKml0aWQpOworb3V0OgorCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJBbGxvY2F0ZSBUSUQgLSBkb25lLCByYyA9ICVkXG4iLCByYyk7CisJcmV0dXJuIHJjOworfQorCit2b2lkIHFlZF9yZG1hX2NucV9wcm9kX3VwZGF0ZSh2b2lkICpyZG1hX2N4dCwgdTggcXpfb2Zmc2V0LCB1MTYgcHJvZCkKK3sKKwlzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbjsKKwl1MTYgcXpfbnVtOworCXUzMiBhZGRyOworCisJcF9od2ZuID0gKHN0cnVjdCBxZWRfaHdmbiAqKXJkbWFfY3h0OworCXF6X251bSA9IHBfaHdmbi0+cF9yZG1hX2luZm8tPnF1ZXVlX3pvbmVfYmFzZSArIHF6X29mZnNldDsKKwlhZGRyID0gR1RUX0JBUjBfTUFQX1JFR19VU0RNX1JBTSArCisJICAgICAgIFVTVE9STV9DT01NT05fUVVFVUVfQ09OU19PRkZTRVQocXpfbnVtKTsKKworCVJFR19XUjE2KHBfaHdmbiwgYWRkciwgcHJvZCk7CisKKwkvKiBrZWVwIHByb2QgdXBkYXRlcyBvcmRlcmVkICovCisJd21iKCk7Cit9CisKK3N0YXRpYyBpbnQgcWVkX2ZpbGxfcmRtYV9kZXZfaW5mbyhzdHJ1Y3QgcWVkX2RldiAqY2RldiwKKwkJCQkgIHN0cnVjdCBxZWRfZGV2X3JkbWFfaW5mbyAqaW5mbykKK3sKKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CisKKwlpbmZvLT5yZG1hX3R5cGUgPSBRRURfUkRNQV9UWVBFX1JPQ0U7CisKKwlxZWRfZmlsbF9kZXZfaW5mbyhjZGV2LCAmaW5mby0+Y29tbW9uKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFlZF9yZG1hX2dldF9zYl9zdGFydChzdHJ1Y3QgcWVkX2RldiAqY2RldikKK3sKKwlpbnQgZmVhdF9udW07CisKKwlpZiAoY2Rldi0+bnVtX2h3Zm5zID4gMSkKKwkJZmVhdF9udW0gPSBGRUFUX05VTShRRURfTEVBRElOR19IV0ZOKGNkZXYpLCBRRURfUEZfTDJfUVVFKTsKKwllbHNlCisJCWZlYXRfbnVtID0gRkVBVF9OVU0oUUVEX0xFQURJTkdfSFdGTihjZGV2KSwgUUVEX1BGX0wyX1FVRSkgKgorCQkJICAgY2Rldi0+bnVtX2h3Zm5zOworCisJcmV0dXJuIGZlYXRfbnVtOworfQorCitzdGF0aWMgaW50IHFlZF9yZG1hX2dldF9taW5fY25xX21zaXgoc3RydWN0IHFlZF9kZXYgKmNkZXYpCit7CisJaW50IG5fY25xID0gRkVBVF9OVU0oUUVEX0xFQURJTkdfSFdGTihjZGV2KSwgUUVEX1JETUFfQ05RKTsKKwlpbnQgbl9tc2l4ID0gY2Rldi0+aW50X3BhcmFtcy5yZG1hX21zaXhfY250OworCisJcmV0dXJuIG1pbl90KGludCwgbl9jbnEsIG5fbXNpeCk7Cit9CisKK3N0YXRpYyBpbnQgcWVkX3JkbWFfc2V0X2ludChzdHJ1Y3QgcWVkX2RldiAqY2RldiwgdTE2IGNudCkKK3sKKwlpbnQgbGltaXQgPSAwOworCisJLyogTWFyayB0aGUgZmFzdHBhdGggYXMgZnJlZS91c2VkICovCisJY2Rldi0+aW50X3BhcmFtcy5mcF9pbml0aWFsaXplZCA9IGNudCA/IHRydWUgOiBmYWxzZTsKKworCWlmIChjZGV2LT5pbnRfcGFyYW1zLm91dC5pbnRfbW9kZSAhPSBRRURfSU5UX01PREVfTVNJWCkgeworCQlEUF9FUlIoY2RldiwKKwkJICAgICAgICJxZWQgcm9jZSBzdXBwb3J0cyBvbmx5IE1TSS1YIGludGVycnVwdHMgKGRldGVjdGVkICVkKS5cbiIsCisJCSAgICAgICBjZGV2LT5pbnRfcGFyYW1zLm91dC5pbnRfbW9kZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAoY2Rldi0+aW50X3BhcmFtcy5mcF9tc2l4X2NudCkgeworCQlsaW1pdCA9IGNkZXYtPmludF9wYXJhbXMucmRtYV9tc2l4X2NudDsKKwl9CisKKwlpZiAoIWxpbWl0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiBtaW5fdChpbnQsIGNudCwgbGltaXQpOworfQorCitzdGF0aWMgaW50IHFlZF9yZG1hX2dldF9pbnQoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHN0cnVjdCBxZWRfaW50X2luZm8gKmluZm8pCit7CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworCisJaWYgKCFjZGV2LT5pbnRfcGFyYW1zLmZwX2luaXRpYWxpemVkKSB7CisJCURQX0lORk8oY2RldiwKKwkJCSJQcm90b2NvbCBkcml2ZXIgcmVxdWVzdGVkIGludGVycnVwdCBpbmZvcm1hdGlvbiwgYnV0IGl0cyBzdXBwb3J0IGlzIG5vdCB5ZXQgY29uZmlndXJlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjZGV2LT5pbnRfcGFyYW1zLm91dC5pbnRfbW9kZSA9PSBRRURfSU5UX01PREVfTVNJWCkgeworCQlpbnQgbXNpeF9iYXNlID0gY2Rldi0+aW50X3BhcmFtcy5yZG1hX21zaXhfYmFzZTsKKworCQlpbmZvLT5tc2l4X2NudCA9IGNkZXYtPmludF9wYXJhbXMucmRtYV9tc2l4X2NudDsKKwkJaW5mby0+bXNpeCA9ICZjZGV2LT5pbnRfcGFyYW1zLm1zaXhfdGFibGVbbXNpeF9iYXNlXTsKKworCQlEUF9WRVJCT1NFKGNkZXYsIFFFRF9NU0dfUkRNQSwgIm1zaXhfY250ID0gJWQgbXNpeF9iYXNlPSVkXG4iLAorCQkJICAgaW5mby0+bXNpeF9jbnQsIG1zaXhfYmFzZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBxZWRfcmRtYV9hbGxvY19wZCh2b2lkICpyZG1hX2N4dCwgdTE2ICpwZCkKK3sKKwlzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiA9IChzdHJ1Y3QgcWVkX2h3Zm4gKilyZG1hX2N4dDsKKwl1MzIgcmV0dXJuZWRfaWQ7CisJaW50IHJjOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIkFsbG9jIFBEXG4iKTsKKworCS8qIEFsbG9jYXRlcyBhbiB1bnVzZWQgcHJvdGVjdGlvbiBkb21haW4gKi8KKwlzcGluX2xvY2tfYmgoJnBfaHdmbi0+cF9yZG1hX2luZm8tPmxvY2spOworCXJjID0gcWVkX3JkbWFfYm1hcF9hbGxvY19pZChwX2h3Zm4sCisJCQkJICAgICZwX2h3Zm4tPnBfcmRtYV9pbmZvLT5wZF9tYXAsICZyZXR1cm5lZF9pZCk7CisJc3Bpbl91bmxvY2tfYmgoJnBfaHdmbi0+cF9yZG1hX2luZm8tPmxvY2spOworCisJKnBkID0gKHUxNilyZXR1cm5lZF9pZDsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJBbGxvYyBQRCAtIGRvbmUsIHJjID0gJWRcbiIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQgcWVkX3JkbWFfZnJlZV9wZCh2b2lkICpyZG1hX2N4dCwgdTE2IHBkKQoreworCXN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuID0gKHN0cnVjdCBxZWRfaHdmbiAqKXJkbWFfY3h0OworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgInBkID0gJTA4eFxuIiwgcGQpOworCisJLyogUmV0dXJucyBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIHByb3RlY3Rpb24gZG9tYWluIGZvciByZXVzZSAqLworCXNwaW5fbG9ja19iaCgmcF9od2ZuLT5wX3JkbWFfaW5mby0+bG9jayk7CisJcWVkX2JtYXBfcmVsZWFzZV9pZChwX2h3Zm4sICZwX2h3Zm4tPnBfcmRtYV9pbmZvLT5wZF9tYXAsIHBkKTsKKwlzcGluX3VubG9ja19iaCgmcF9od2ZuLT5wX3JkbWFfaW5mby0+bG9jayk7Cit9CisKK3N0YXRpYyBlbnVtIHFlZF9yZG1hX3RvZ2dsZV9iaXQKK3FlZF9yZG1hX3RvZ2dsZV9iaXRfY3JlYXRlX3Jlc2l6ZV9jcShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgdTE2IGljaWQpCit7CisJc3RydWN0IHFlZF9yZG1hX2luZm8gKnBfaW5mbyA9IHBfaHdmbi0+cF9yZG1hX2luZm87CisJZW51bSBxZWRfcmRtYV90b2dnbGVfYml0IHRvZ2dsZV9iaXQ7CisJdTMyIGJtYXBfaWQ7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiaWNpZCA9ICUwOHhcbiIsIGljaWQpOworCisJLyogdGhlIGZ1bmN0aW9uIHRvZ2dsZSB0aGUgYml0IHRoYXQgaXMgcmVsYXRlZCB0byBhIGdpdmVuIGljaWQKKwkgKiBhbmQgcmV0dXJucyB0aGUgbmV3IHRvZ2dsZSBiaXQncyB2YWx1ZQorCSAqLworCWJtYXBfaWQgPSBpY2lkIC0gcWVkX2N4dF9nZXRfcHJvdG9fY2lkX3N0YXJ0KHBfaHdmbiwgcF9pbmZvLT5wcm90byk7CisKKwlzcGluX2xvY2tfYmgoJnBfaW5mby0+bG9jayk7CisJdG9nZ2xlX2JpdCA9ICF0ZXN0X2FuZF9jaGFuZ2VfYml0KGJtYXBfaWQsCisJCQkJCSAgcF9pbmZvLT50b2dnbGVfYml0cy5iaXRtYXApOworCXNwaW5fdW5sb2NrX2JoKCZwX2luZm8tPmxvY2spOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIlFFRF9SRE1BX1RPR0dMRV9CSVRfPSAlZFxuIiwKKwkJICAgdG9nZ2xlX2JpdCk7CisKKwlyZXR1cm4gdG9nZ2xlX2JpdDsKK30KKworaW50IHFlZF9yZG1hX2NyZWF0ZV9jcSh2b2lkICpyZG1hX2N4dCwKKwkJICAgICAgIHN0cnVjdCBxZWRfcmRtYV9jcmVhdGVfY3FfaW5fcGFyYW1zICpwYXJhbXMsIHUxNiAqaWNpZCkKK3sKKwlzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiA9IChzdHJ1Y3QgcWVkX2h3Zm4gKilyZG1hX2N4dDsKKwlzdHJ1Y3QgcWVkX3JkbWFfaW5mbyAqcF9pbmZvID0gcF9od2ZuLT5wX3JkbWFfaW5mbzsKKwlzdHJ1Y3QgcmRtYV9jcmVhdGVfY3FfcmFtcm9kX2RhdGEgKnBfcmFtcm9kOworCWVudW0gcWVkX3JkbWFfdG9nZ2xlX2JpdCB0b2dnbGVfYml0OworCXN0cnVjdCBxZWRfc3BfaW5pdF9kYXRhIGluaXRfZGF0YTsKKwlzdHJ1Y3QgcWVkX3NwcV9lbnRyeSAqcF9lbnQ7CisJdTMyIHJldHVybmVkX2lkLCBzdGFydF9jaWQ7CisJaW50IHJjOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgImNxX2hhbmRsZSA9ICUwOHglMDh4XG4iLAorCQkgICBwYXJhbXMtPmNxX2hhbmRsZV9oaSwgcGFyYW1zLT5jcV9oYW5kbGVfbG8pOworCisJLyogQWxsb2NhdGUgaWNpZCAqLworCXNwaW5fbG9ja19iaCgmcF9pbmZvLT5sb2NrKTsKKwlyYyA9IHFlZF9yZG1hX2JtYXBfYWxsb2NfaWQocF9od2ZuLAorCQkJCSAgICAmcF9pbmZvLT5jcV9tYXAsICZyZXR1cm5lZF9pZCk7CisJc3Bpbl91bmxvY2tfYmgoJnBfaW5mby0+bG9jayk7CisKKwlpZiAocmMpIHsKKwkJRFBfTk9USUNFKHBfaHdmbiwgIkNhbid0IGNyZWF0ZSBDUSwgcmMgPSAlZFxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJc3RhcnRfY2lkID0gcWVkX2N4dF9nZXRfcHJvdG9fY2lkX3N0YXJ0KHBfaHdmbiwKKwkJCQkJCXBfaW5mby0+cHJvdG8pOworCSppY2lkID0gcmV0dXJuZWRfaWQgKyBzdGFydF9jaWQ7CisKKwkvKiBDaGVjayBpZiBpY2lkIHJlcXVpcmVzIGEgcGFnZSBhbGxvY2F0aW9uICovCisJcmMgPSBxZWRfY3h0X2R5bmFtaWNfaWx0X2FsbG9jKHBfaHdmbiwgUUVEX0VMRU1fQ1hULCAqaWNpZCk7CisJaWYgKHJjKQorCQlnb3RvIGVycjsKKworCS8qIEdldCBTUFEgZW50cnkgKi8KKwltZW1zZXQoJmluaXRfZGF0YSwgMCwgc2l6ZW9mKGluaXRfZGF0YSkpOworCWluaXRfZGF0YS5jaWQgPSAqaWNpZDsKKwlpbml0X2RhdGEub3BhcXVlX2ZpZCA9IHBfaHdmbi0+aHdfaW5mby5vcGFxdWVfZmlkOworCWluaXRfZGF0YS5jb21wX21vZGUgPSBRRURfU1BRX01PREVfRUJMT0NLOworCisJLyogU2VuZCBjcmVhdGUgQ1EgcmFtcm9kICovCisJcmMgPSBxZWRfc3BfaW5pdF9yZXF1ZXN0KHBfaHdmbiwgJnBfZW50LAorCQkJCSBSRE1BX1JBTVJPRF9DUkVBVEVfQ1EsCisJCQkJIHBfaW5mby0+cHJvdG8sICZpbml0X2RhdGEpOworCWlmIChyYykKKwkJZ290byBlcnI7CisKKwlwX3JhbXJvZCA9ICZwX2VudC0+cmFtcm9kLnJkbWFfY3JlYXRlX2NxOworCisJcF9yYW1yb2QtPmNxX2hhbmRsZS5oaSA9IGNwdV90b19sZTMyKHBhcmFtcy0+Y3FfaGFuZGxlX2hpKTsKKwlwX3JhbXJvZC0+Y3FfaGFuZGxlLmxvID0gY3B1X3RvX2xlMzIocGFyYW1zLT5jcV9oYW5kbGVfbG8pOworCXBfcmFtcm9kLT5kcGkgPSBjcHVfdG9fbGUxNihwYXJhbXMtPmRwaSk7CisJcF9yYW1yb2QtPmlzX3R3b19sZXZlbF9wYmwgPSBwYXJhbXMtPnBibF90d29fbGV2ZWw7CisJcF9yYW1yb2QtPm1heF9jcWVzID0gY3B1X3RvX2xlMzIocGFyYW1zLT5jcV9zaXplKTsKKwlETUFfUkVHUEFJUl9MRShwX3JhbXJvZC0+cGJsX2FkZHIsIHBhcmFtcy0+cGJsX3B0cik7CisJcF9yYW1yb2QtPnBibF9udW1fcGFnZXMgPSBjcHVfdG9fbGUxNihwYXJhbXMtPnBibF9udW1fcGFnZXMpOworCXBfcmFtcm9kLT5jbnFfaWQgPSAodTgpUkVTQ19TVEFSVChwX2h3Zm4sIFFFRF9SRE1BX0NOUV9SQU0pICsKKwkJCSAgIHBhcmFtcy0+Y25xX2lkOworCXBfcmFtcm9kLT5pbnRfdGltZW91dCA9IHBhcmFtcy0+aW50X3RpbWVvdXQ7CisKKwkvKiB0b2dnbGUgdGhlIGJpdCBmb3IgZXZlcnkgcmVzaXplIG9yIGNyZWF0ZSBjcSBmb3IgYSBnaXZlbiBpY2lkICovCisJdG9nZ2xlX2JpdCA9IHFlZF9yZG1hX3RvZ2dsZV9iaXRfY3JlYXRlX3Jlc2l6ZV9jcShwX2h3Zm4sICppY2lkKTsKKworCXBfcmFtcm9kLT50b2dnbGVfYml0ID0gdG9nZ2xlX2JpdDsKKworCXJjID0gcWVkX3NwcV9wb3N0KHBfaHdmbiwgcF9lbnQsIE5VTEwpOworCWlmIChyYykgeworCQkvKiByZXN0b3JlIHRvZ2dsZSBiaXQgKi8KKwkJcWVkX3JkbWFfdG9nZ2xlX2JpdF9jcmVhdGVfcmVzaXplX2NxKHBfaHdmbiwgKmljaWQpOworCQlnb3RvIGVycjsKKwl9CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiQ3JlYXRlZCBDUSwgcmMgPSAlZFxuIiwgcmMpOworCXJldHVybiByYzsKKworZXJyOgorCS8qIHJlbGVhc2UgYWxsb2NhdGVkIGljaWQgKi8KKwlxZWRfYm1hcF9yZWxlYXNlX2lkKHBfaHdmbiwgJnBfaW5mby0+Y3FfbWFwLCByZXR1cm5lZF9pZCk7CisJRFBfTk9USUNFKHBfaHdmbiwgIkNyZWF0ZSBDUSBmYWlsZWQsIHJjID0gJWRcbiIsIHJjKTsKKworCXJldHVybiByYzsKK30KKworaW50IHFlZF9yZG1hX3Jlc2l6ZV9jcSh2b2lkICpyZG1hX2N4dCwKKwkJICAgICAgIHN0cnVjdCBxZWRfcmRtYV9yZXNpemVfY3FfaW5fcGFyYW1zICppbl9wYXJhbXMsCisJCSAgICAgICBzdHJ1Y3QgcWVkX3JkbWFfcmVzaXplX2NxX291dF9wYXJhbXMgKm91dF9wYXJhbXMpCit7CisJc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4gPSAoc3RydWN0IHFlZF9od2ZuICopcmRtYV9jeHQ7CisJc3RydWN0IHJkbWFfcmVzaXplX2NxX291dHB1dF9wYXJhbXMgKnBfcmFtcm9kX3JlczsKKwlzdHJ1Y3QgcmRtYV9yZXNpemVfY3FfcmFtcm9kX2RhdGEgKnBfcmFtcm9kOworCWVudW0gcWVkX3JkbWFfdG9nZ2xlX2JpdCB0b2dnbGVfYml0OworCXN0cnVjdCBxZWRfc3BfaW5pdF9kYXRhIGluaXRfZGF0YTsKKwlzdHJ1Y3QgcWVkX3NwcV9lbnRyeSAqcF9lbnQ7CisJZG1hX2FkZHJfdCByYW1yb2RfcmVzX3BoeXM7CisJdTggZndfcmV0dXJuX2NvZGU7CisJaW50IHJjID0gLUVOT01FTTsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJpY2lkID0gJTA4eFxuIiwgaW5fcGFyYW1zLT5pY2lkKTsKKworCXBfcmFtcm9kX3JlcyA9CisJICAgIChzdHJ1Y3QgcmRtYV9yZXNpemVfY3Ffb3V0cHV0X3BhcmFtcyAqKQorCSAgICBkbWFfYWxsb2NfY29oZXJlbnQoJnBfaHdmbi0+Y2Rldi0+cGRldi0+ZGV2LAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcmRtYV9yZXNpemVfY3Ffb3V0cHV0X3BhcmFtcyksCisJCQkgICAgICAgJnJhbXJvZF9yZXNfcGh5cywgR0ZQX0tFUk5FTCk7CisJaWYgKCFwX3JhbXJvZF9yZXMpIHsKKwkJRFBfTk9USUNFKHBfaHdmbiwKKwkJCSAgInFlZCByZXNpemUgY3EgZmFpbGVkOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IChyYW1yb2QpXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIEdldCBTUFEgZW50cnkgKi8KKwltZW1zZXQoJmluaXRfZGF0YSwgMCwgc2l6ZW9mKGluaXRfZGF0YSkpOworCWluaXRfZGF0YS5jaWQgPSBpbl9wYXJhbXMtPmljaWQ7CisJaW5pdF9kYXRhLm9wYXF1ZV9maWQgPSBwX2h3Zm4tPmh3X2luZm8ub3BhcXVlX2ZpZDsKKwlpbml0X2RhdGEuY29tcF9tb2RlID0gUUVEX1NQUV9NT0RFX0VCTE9DSzsKKworCXJjID0gcWVkX3NwX2luaXRfcmVxdWVzdChwX2h3Zm4sICZwX2VudCwKKwkJCQkgUkRNQV9SQU1ST0RfUkVTSVpFX0NRLAorCQkJCSBwX2h3Zm4tPnBfcmRtYV9pbmZvLT5wcm90bywgJmluaXRfZGF0YSk7CisJaWYgKHJjKQorCQlnb3RvIGVycjsKKworCXBfcmFtcm9kID0gJnBfZW50LT5yYW1yb2QucmRtYV9yZXNpemVfY3E7CisKKwlwX3JhbXJvZC0+ZmxhZ3MgPSAwOworCisJLyogdG9nZ2xlIHRoZSBiaXQgZm9yIGV2ZXJ5IHJlc2l6ZSBvciBjcmVhdGUgY3EgZm9yIGEgZ2l2ZW4gaWNpZCAqLworCXRvZ2dsZV9iaXQgPSBxZWRfcmRtYV90b2dnbGVfYml0X2NyZWF0ZV9yZXNpemVfY3EocF9od2ZuLAorCQkJCQkJCSAgaW5fcGFyYW1zLT5pY2lkKTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUkRNQV9SRVNJWkVfQ1FfUkFNUk9EX0RBVEFfVE9HR0xFX0JJVCwgdG9nZ2xlX2JpdCk7CisKKwlTRVRfRklFTEQocF9yYW1yb2QtPmZsYWdzLAorCQkgIFJETUFfUkVTSVpFX0NRX1JBTVJPRF9EQVRBX0lTX1RXT19MRVZFTF9QQkwsCisJCSAgaW5fcGFyYW1zLT5wYmxfdHdvX2xldmVsKTsKKworCXBfcmFtcm9kLT5wYmxfbG9nX3BhZ2Vfc2l6ZSA9IGluX3BhcmFtcy0+cGJsX3BhZ2Vfc2l6ZV9sb2cgLSAxMjsKKwlwX3JhbXJvZC0+cGJsX251bV9wYWdlcyA9IGNwdV90b19sZTE2KGluX3BhcmFtcy0+cGJsX251bV9wYWdlcyk7CisJcF9yYW1yb2QtPm1heF9jcWVzID0gY3B1X3RvX2xlMzIoaW5fcGFyYW1zLT5jcV9zaXplKTsKKwlETUFfUkVHUEFJUl9MRShwX3JhbXJvZC0+cGJsX2FkZHIsIGluX3BhcmFtcy0+cGJsX3B0cik7CisJRE1BX1JFR1BBSVJfTEUocF9yYW1yb2QtPm91dHB1dF9wYXJhbXNfYWRkciwgcmFtcm9kX3Jlc19waHlzKTsKKworCXJjID0gcWVkX3NwcV9wb3N0KHBfaHdmbiwgcF9lbnQsICZmd19yZXR1cm5fY29kZSk7CisJaWYgKHJjKQorCQlnb3RvIGVycjsKKworCWlmIChmd19yZXR1cm5fY29kZSAhPSBSRE1BX1JFVFVSTl9PSykgeworCQlEUF9OT1RJQ0UocF9od2ZuLCAiZndfcmV0dXJuX2NvZGUgPSAlZFxuIiwgZndfcmV0dXJuX2NvZGUpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCW91dF9wYXJhbXMtPnByb2QgPSBsZTMyX3RvX2NwdShwX3JhbXJvZF9yZXMtPm9sZF9jcV9wcm9kKTsKKwlvdXRfcGFyYW1zLT5jb25zID0gbGUzMl90b19jcHUocF9yYW1yb2RfcmVzLT5vbGRfY3FfY29ucyk7CisKKwlkbWFfZnJlZV9jb2hlcmVudCgmcF9od2ZuLT5jZGV2LT5wZGV2LT5kZXYsCisJCQkgIHNpemVvZihzdHJ1Y3QgcmRtYV9yZXNpemVfY3Ffb3V0cHV0X3BhcmFtcyksCisJCQkgIHBfcmFtcm9kX3JlcywgcmFtcm9kX3Jlc19waHlzKTsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJSZXNpemVkIENRLCByYyA9ICVkXG4iLCByYyk7CisKKwlyZXR1cm4gcmM7CisKK2VycjoJZG1hX2ZyZWVfY29oZXJlbnQoJnBfaHdmbi0+Y2Rldi0+cGRldi0+ZGV2LAorCQkJICBzaXplb2Yoc3RydWN0IHJkbWFfcmVzaXplX2NxX291dHB1dF9wYXJhbXMpLAorCQkJICBwX3JhbXJvZF9yZXMsIHJhbXJvZF9yZXNfcGh5cyk7CisJRFBfTk9USUNFKHBfaHdmbiwgIlJlc2l6ZWQgQ1EsIEZhaWxlZCAtIHJjID0gJWRcbiIsIHJjKTsKKworCXJldHVybiByYzsKK30KKworaW50IHFlZF9yZG1hX2Rlc3Ryb3lfY3Eodm9pZCAqcmRtYV9jeHQsCisJCQlzdHJ1Y3QgcWVkX3JkbWFfZGVzdHJveV9jcV9pbl9wYXJhbXMgKmluX3BhcmFtcywKKwkJCXN0cnVjdCBxZWRfcmRtYV9kZXN0cm95X2NxX291dF9wYXJhbXMgKm91dF9wYXJhbXMpCit7CisJc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4gPSAoc3RydWN0IHFlZF9od2ZuICopcmRtYV9jeHQ7CisJc3RydWN0IHJkbWFfZGVzdHJveV9jcV9vdXRwdXRfcGFyYW1zICpwX3JhbXJvZF9yZXM7CisJc3RydWN0IHJkbWFfZGVzdHJveV9jcV9yYW1yb2RfZGF0YSAqcF9yYW1yb2Q7CisJc3RydWN0IHFlZF9zcF9pbml0X2RhdGEgaW5pdF9kYXRhOworCXN0cnVjdCBxZWRfc3BxX2VudHJ5ICpwX2VudDsKKwlkbWFfYWRkcl90IHJhbXJvZF9yZXNfcGh5czsKKwlpbnQgcmMgPSAtRU5PTUVNOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgImljaWQgPSAlMDh4XG4iLCBpbl9wYXJhbXMtPmljaWQpOworCisJcF9yYW1yb2RfcmVzID0KKwkgICAgKHN0cnVjdCByZG1hX2Rlc3Ryb3lfY3Ffb3V0cHV0X3BhcmFtcyAqKQorCSAgICBkbWFfYWxsb2NfY29oZXJlbnQoJnBfaHdmbi0+Y2Rldi0+cGRldi0+ZGV2LAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcmRtYV9kZXN0cm95X2NxX291dHB1dF9wYXJhbXMpLAorCQkJICAgICAgICZyYW1yb2RfcmVzX3BoeXMsIEdGUF9LRVJORUwpOworCWlmICghcF9yYW1yb2RfcmVzKSB7CisJCURQX05PVElDRShwX2h3Zm4sCisJCQkgICJxZWQgZGVzdHJveSBjcSBmYWlsZWQ6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgKHJhbXJvZClcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogR2V0IFNQUSBlbnRyeSAqLworCW1lbXNldCgmaW5pdF9kYXRhLCAwLCBzaXplb2YoaW5pdF9kYXRhKSk7CisJaW5pdF9kYXRhLmNpZCA9IGluX3BhcmFtcy0+aWNpZDsKKwlpbml0X2RhdGEub3BhcXVlX2ZpZCA9IHBfaHdmbi0+aHdfaW5mby5vcGFxdWVfZmlkOworCWluaXRfZGF0YS5jb21wX21vZGUgPSBRRURfU1BRX01PREVfRUJMT0NLOworCisJLyogU2VuZCBkZXN0cm95IENRIHJhbXJvZCAqLworCXJjID0gcWVkX3NwX2luaXRfcmVxdWVzdChwX2h3Zm4sICZwX2VudCwKKwkJCQkgUkRNQV9SQU1ST0RfREVTVFJPWV9DUSwKKwkJCQkgcF9od2ZuLT5wX3JkbWFfaW5mby0+cHJvdG8sICZpbml0X2RhdGEpOworCWlmIChyYykKKwkJZ290byBlcnI7CisKKwlwX3JhbXJvZCA9ICZwX2VudC0+cmFtcm9kLnJkbWFfZGVzdHJveV9jcTsKKwlETUFfUkVHUEFJUl9MRShwX3JhbXJvZC0+b3V0cHV0X3BhcmFtc19hZGRyLCByYW1yb2RfcmVzX3BoeXMpOworCisJcmMgPSBxZWRfc3BxX3Bvc3QocF9od2ZuLCBwX2VudCwgTlVMTCk7CisJaWYgKHJjKQorCQlnb3RvIGVycjsKKworCW91dF9wYXJhbXMtPm51bV9jcV9ub3RpZiA9IGxlMTZfdG9fY3B1KHBfcmFtcm9kX3Jlcy0+Y25xX251bSk7CisKKwlkbWFfZnJlZV9jb2hlcmVudCgmcF9od2ZuLT5jZGV2LT5wZGV2LT5kZXYsCisJCQkgIHNpemVvZihzdHJ1Y3QgcmRtYV9kZXN0cm95X2NxX291dHB1dF9wYXJhbXMpLAorCQkJICBwX3JhbXJvZF9yZXMsIHJhbXJvZF9yZXNfcGh5cyk7CisKKwkvKiBGcmVlIGljaWQgKi8KKwlzcGluX2xvY2tfYmgoJnBfaHdmbi0+cF9yZG1hX2luZm8tPmxvY2spOworCisJcWVkX2JtYXBfcmVsZWFzZV9pZChwX2h3Zm4sCisJCQkgICAgJnBfaHdmbi0+cF9yZG1hX2luZm8tPmNxX21hcCwKKwkJCSAgICAoaW5fcGFyYW1zLT5pY2lkIC0KKwkJCSAgICAgcWVkX2N4dF9nZXRfcHJvdG9fY2lkX3N0YXJ0KHBfaHdmbiwKKwkJCQkJCQkgcF9od2ZuLT4KKwkJCQkJCQkgcF9yZG1hX2luZm8tPnByb3RvKSkpOworCisJc3Bpbl91bmxvY2tfYmgoJnBfaHdmbi0+cF9yZG1hX2luZm8tPmxvY2spOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIkRlc3Ryb3llZCBDUSwgcmMgPSAlZFxuIiwgcmMpOworCXJldHVybiByYzsKKworZXJyOglkbWFfZnJlZV9jb2hlcmVudCgmcF9od2ZuLT5jZGV2LT5wZGV2LT5kZXYsCisJCQkgIHNpemVvZihzdHJ1Y3QgcmRtYV9kZXN0cm95X2NxX291dHB1dF9wYXJhbXMpLAorCQkJICBwX3JhbXJvZF9yZXMsIHJhbXJvZF9yZXNfcGh5cyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIHFlZF9yZG1hX3NldF9md19tYWModTE2ICpwX2Z3X21hYywgdTggKnBfcWVkX21hYykKK3sKKwlwX2Z3X21hY1swXSA9IGNwdV90b19sZTE2KChwX3FlZF9tYWNbMF0gPDwgOCkgKyBwX3FlZF9tYWNbMV0pOworCXBfZndfbWFjWzFdID0gY3B1X3RvX2xlMTYoKHBfcWVkX21hY1syXSA8PCA4KSArIHBfcWVkX21hY1szXSk7CisJcF9md19tYWNbMl0gPSBjcHVfdG9fbGUxNigocF9xZWRfbWFjWzRdIDw8IDgpICsgcF9xZWRfbWFjWzVdKTsKK30KKworc3RhdGljIHZvaWQgcWVkX3JkbWFfY29weV9naWRzKHN0cnVjdCBxZWRfcmRtYV9xcCAqcXAsIF9fbGUzMiAqc3JjX2dpZCwKKwkJCSAgICAgICBfX2xlMzIgKmRzdF9naWQpCit7CisJdTMyIGk7CisKKwlpZiAocXAtPnJvY2VfbW9kZSA9PSBST0NFX1YyX0lQVjQpIHsKKwkJLyogVGhlIElQdjQgYWRkcmVzc2VzIHNoYWxsIGJlIGFsaWduZWQgdG8gdGhlIGhpZ2hlc3Qgd29yZC4KKwkJICogVGhlIGxvd2VyIHdvcmRzIG11c3QgYmUgemVyby4KKwkJICovCisJCW1lbXNldChzcmNfZ2lkLCAwLCBzaXplb2YodW5pb24gcWVkX2dpZCkpOworCQltZW1zZXQoZHN0X2dpZCwgMCwgc2l6ZW9mKHVuaW9uIHFlZF9naWQpKTsKKwkJc3JjX2dpZFszXSA9IGNwdV90b19sZTMyKHFwLT5zZ2lkLmlwdjRfYWRkcik7CisJCWRzdF9naWRbM10gPSBjcHVfdG9fbGUzMihxcC0+ZGdpZC5pcHY0X2FkZHIpOworCX0gZWxzZSB7CisJCS8qIEdJRHMgYW5kIElQdjYgYWRkcmVzc2VzIGNvaW5jaWRlIGluIGxvY2F0aW9uIGFuZCBzaXplICovCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHFwLT5zZ2lkLmR3b3Jkcyk7IGkrKykgeworCQkJc3JjX2dpZFtpXSA9IGNwdV90b19sZTMyKHFwLT5zZ2lkLmR3b3Jkc1tpXSk7CisJCQlkc3RfZ2lkW2ldID0gY3B1X3RvX2xlMzIocXAtPmRnaWQuZHdvcmRzW2ldKTsKKwkJfQorCX0KK30KKworc3RhdGljIGVudW0gcm9jZV9mbGF2b3IgcWVkX3JvY2VfbW9kZV90b19mbGF2b3IoZW51bSByb2NlX21vZGUgcm9jZV9tb2RlKQoreworCWVudW0gcm9jZV9mbGF2b3IgZmxhdm9yOworCisJc3dpdGNoIChyb2NlX21vZGUpIHsKKwljYXNlIFJPQ0VfVjE6CisJCWZsYXZvciA9IFBMQUlOX1JPQ0U7CisJCWJyZWFrOworCWNhc2UgUk9DRV9WMl9JUFY0OgorCQlmbGF2b3IgPSBSUk9DRV9JUFY0OworCQlicmVhazsKKwljYXNlIFJPQ0VfVjJfSVBWNjoKKwkJZmxhdm9yID0gUk9DRV9WMl9JUFY2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmbGF2b3IgPSBNQVhfUk9DRV9NT0RFOworCQlicmVhazsKKwl9CisJcmV0dXJuIGZsYXZvcjsKK30KKworaW50IHFlZF9yb2NlX2FsbG9jX2NpZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgdTE2ICpjaWQpCit7CisJc3RydWN0IHFlZF9yZG1hX2luZm8gKnBfcmRtYV9pbmZvID0gcF9od2ZuLT5wX3JkbWFfaW5mbzsKKwl1MzIgcmVzcG9uZGVyX2ljaWQ7CisJdTMyIHJlcXVlc3Rlcl9pY2lkOworCWludCByYzsKKworCXNwaW5fbG9ja19iaCgmcF9od2ZuLT5wX3JkbWFfaW5mby0+bG9jayk7CisJcmMgPSBxZWRfcmRtYV9ibWFwX2FsbG9jX2lkKHBfaHdmbiwgJnBfcmRtYV9pbmZvLT5jaWRfbWFwLAorCQkJCSAgICAmcmVzcG9uZGVyX2ljaWQpOworCWlmIChyYykgeworCQlzcGluX3VubG9ja19iaCgmcF9yZG1hX2luZm8tPmxvY2spOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBxZWRfcmRtYV9ibWFwX2FsbG9jX2lkKHBfaHdmbiwgJnBfcmRtYV9pbmZvLT5jaWRfbWFwLAorCQkJCSAgICAmcmVxdWVzdGVyX2ljaWQpOworCisJc3Bpbl91bmxvY2tfYmgoJnBfcmRtYV9pbmZvLT5sb2NrKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyOworCisJLyogdGhlIHR3byBpY2lkJ3Mgc2hvdWxkIGJlIGFkamFjZW50ICovCisJaWYgKChyZXF1ZXN0ZXJfaWNpZCAtIHJlc3BvbmRlcl9pY2lkKSAhPSAxKSB7CisJCURQX05PVElDRShwX2h3Zm4sICJGYWlsZWQgdG8gYWxsb2NhdGUgdHdvIGFkamFjZW50IHFwJ3MnXG4iKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXNwb25kZXJfaWNpZCArPSBxZWRfY3h0X2dldF9wcm90b19jaWRfc3RhcnQocF9od2ZuLAorCQkJCQkJICAgICAgcF9yZG1hX2luZm8tPnByb3RvKTsKKwlyZXF1ZXN0ZXJfaWNpZCArPSBxZWRfY3h0X2dldF9wcm90b19jaWRfc3RhcnQocF9od2ZuLAorCQkJCQkJICAgICAgcF9yZG1hX2luZm8tPnByb3RvKTsKKworCS8qIElmIHRoZXNlIGljaWRzIHJlcXVpcmUgYSBuZXcgSUxUIGxpbmUgYWxsb2NhdGUgRE1BLWFibGUgY29udGV4dCBmb3IKKwkgKiBhbiBJTFQgcGFnZQorCSAqLworCXJjID0gcWVkX2N4dF9keW5hbWljX2lsdF9hbGxvYyhwX2h3Zm4sIFFFRF9FTEVNX0NYVCwgcmVzcG9uZGVyX2ljaWQpOworCWlmIChyYykKKwkJZ290byBlcnI7CisKKwlyYyA9IHFlZF9jeHRfZHluYW1pY19pbHRfYWxsb2MocF9od2ZuLCBRRURfRUxFTV9DWFQsIHJlcXVlc3Rlcl9pY2lkKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyOworCisJKmNpZCA9ICh1MTYpcmVzcG9uZGVyX2ljaWQ7CisJcmV0dXJuIHJjOworCitlcnI6CisJc3Bpbl9sb2NrX2JoKCZwX3JkbWFfaW5mby0+bG9jayk7CisJcWVkX2JtYXBfcmVsZWFzZV9pZChwX2h3Zm4sICZwX3JkbWFfaW5mby0+Y2lkX21hcCwgcmVzcG9uZGVyX2ljaWQpOworCXFlZF9ibWFwX3JlbGVhc2VfaWQocF9od2ZuLCAmcF9yZG1hX2luZm8tPmNpZF9tYXAsIHJlcXVlc3Rlcl9pY2lkKTsKKworCXNwaW5fdW5sb2NrX2JoKCZwX3JkbWFfaW5mby0+bG9jayk7CisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwKKwkJICAgIkFsbG9jYXRlIENJRCAtIGZhaWxlZCwgcmMgPSAlZFxuIiwgcmMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBxZWRfcm9jZV9zcF9jcmVhdGVfcmVzcG9uZGVyKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQlzdHJ1Y3QgcWVkX3JkbWFfcXAgKnFwKQoreworCXN0cnVjdCByb2NlX2NyZWF0ZV9xcF9yZXNwX3JhbXJvZF9kYXRhICpwX3JhbXJvZDsKKwlzdHJ1Y3QgcWVkX3NwX2luaXRfZGF0YSBpbml0X2RhdGE7CisJdW5pb24gcWVkX3FtX3BxX3BhcmFtcyBxbV9wYXJhbXM7CisJZW51bSByb2NlX2ZsYXZvciByb2NlX2ZsYXZvcjsKKwlzdHJ1Y3QgcWVkX3NwcV9lbnRyeSAqcF9lbnQ7CisJdTE2IHBoeXNpY2FsX3F1ZXVlMCA9IDA7CisJaW50IHJjOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgImljaWQgPSAlMDh4XG4iLCBxcC0+aWNpZCk7CisKKwkvKiBBbGxvY2F0ZSBETUEtYWJsZSBtZW1vcnkgZm9yIElSUSAqLworCXFwLT5pcnFfbnVtX3BhZ2VzID0gMTsKKwlxcC0+aXJxID0gZG1hX2FsbG9jX2NvaGVyZW50KCZwX2h3Zm4tPmNkZXYtPnBkZXYtPmRldiwKKwkJCQkgICAgIFJETUFfUklOR19QQUdFX1NJWkUsCisJCQkJICAgICAmcXAtPmlycV9waHlzX2FkZHIsIEdGUF9LRVJORUwpOworCWlmICghcXAtPmlycSkgeworCQlyYyA9IC1FTk9NRU07CisJCURQX05PVElDRShwX2h3Zm4sCisJCQkgICJxZWQgY3JlYXRlIHJlc3BvbmRlciBmYWlsZWQ6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgKGlycSkuIHJjID0gJWRcbiIsCisJCQkgIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIEdldCBTUFEgZW50cnkgKi8KKwltZW1zZXQoJmluaXRfZGF0YSwgMCwgc2l6ZW9mKGluaXRfZGF0YSkpOworCWluaXRfZGF0YS5jaWQgPSBxcC0+aWNpZDsKKwlpbml0X2RhdGEub3BhcXVlX2ZpZCA9IHBfaHdmbi0+aHdfaW5mby5vcGFxdWVfZmlkOworCWluaXRfZGF0YS5jb21wX21vZGUgPSBRRURfU1BRX01PREVfRUJMT0NLOworCisJcmMgPSBxZWRfc3BfaW5pdF9yZXF1ZXN0KHBfaHdmbiwgJnBfZW50LCBST0NFX1JBTVJPRF9DUkVBVEVfUVAsCisJCQkJIFBST1RPQ09MSURfUk9DRSwgJmluaXRfZGF0YSk7CisJaWYgKHJjKQorCQlnb3RvIGVycjsKKworCXBfcmFtcm9kID0gJnBfZW50LT5yYW1yb2Qucm9jZV9jcmVhdGVfcXBfcmVzcDsKKworCXBfcmFtcm9kLT5mbGFncyA9IDA7CisKKwlyb2NlX2ZsYXZvciA9IHFlZF9yb2NlX21vZGVfdG9fZmxhdm9yKHFwLT5yb2NlX21vZGUpOworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUk9DRV9DUkVBVEVfUVBfUkVTUF9SQU1ST0RfREFUQV9ST0NFX0ZMQVZPUiwgcm9jZV9mbGF2b3IpOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBST0NFX0NSRUFURV9RUF9SRVNQX1JBTVJPRF9EQVRBX1JETUFfUkRfRU4sCisJCSAgcXAtPmluY29taW5nX3JkbWFfcmVhZF9lbik7CisKKwlTRVRfRklFTEQocF9yYW1yb2QtPmZsYWdzLAorCQkgIFJPQ0VfQ1JFQVRFX1FQX1JFU1BfUkFNUk9EX0RBVEFfUkRNQV9XUl9FTiwKKwkJICBxcC0+aW5jb21pbmdfcmRtYV93cml0ZV9lbik7CisKKwlTRVRfRklFTEQocF9yYW1yb2QtPmZsYWdzLAorCQkgIFJPQ0VfQ1JFQVRFX1FQX1JFU1BfUkFNUk9EX0RBVEFfQVRPTUlDX0VOLAorCQkgIHFwLT5pbmNvbWluZ19hdG9taWNfZW4pOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBST0NFX0NSRUFURV9RUF9SRVNQX1JBTVJPRF9EQVRBX0UyRV9GTE9XX0NPTlRST0xfRU4sCisJCSAgcXAtPmUyZV9mbG93X2NvbnRyb2xfZW4pOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBST0NFX0NSRUFURV9RUF9SRVNQX1JBTVJPRF9EQVRBX1NSUV9GTEcsIHFwLT51c2Vfc3JxKTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUk9DRV9DUkVBVEVfUVBfUkVTUF9SQU1ST0RfREFUQV9SRVNFUlZFRF9LRVlfRU4sCisJCSAgcXAtPmZtcl9hbmRfcmVzZXJ2ZWRfbGtleSk7CisKKwlTRVRfRklFTEQocF9yYW1yb2QtPmZsYWdzLAorCQkgIFJPQ0VfQ1JFQVRFX1FQX1JFU1BfUkFNUk9EX0RBVEFfTUlOX1JOUl9OQUtfVElNRVIsCisJCSAgcXAtPm1pbl9ybnJfbmFrX3RpbWVyKTsKKworCXBfcmFtcm9kLT5tYXhfaXJkID0gcXAtPm1heF9yZF9hdG9taWNfcmVzcDsKKwlwX3JhbXJvZC0+dHJhZmZpY19jbGFzcyA9IHFwLT50cmFmZmljX2NsYXNzX3RvczsKKwlwX3JhbXJvZC0+aG9wX2xpbWl0ID0gcXAtPmhvcF9saW1pdF90dGw7CisJcF9yYW1yb2QtPmlycV9udW1fcGFnZXMgPSBxcC0+aXJxX251bV9wYWdlczsKKwlwX3JhbXJvZC0+cF9rZXkgPSBjcHVfdG9fbGUxNihxcC0+cGtleSk7CisJcF9yYW1yb2QtPmZsb3dfbGFiZWwgPSBjcHVfdG9fbGUzMihxcC0+Zmxvd19sYWJlbCk7CisJcF9yYW1yb2QtPmRzdF9xcF9pZCA9IGNwdV90b19sZTMyKHFwLT5kZXN0X3FwKTsKKwlwX3JhbXJvZC0+bXR1ID0gY3B1X3RvX2xlMTYocXAtPm10dSk7CisJcF9yYW1yb2QtPmluaXRpYWxfcHNuID0gY3B1X3RvX2xlMzIocXAtPnJxX3Bzbik7CisJcF9yYW1yb2QtPnBkID0gY3B1X3RvX2xlMTYocXAtPnBkKTsKKwlwX3JhbXJvZC0+cnFfbnVtX3BhZ2VzID0gY3B1X3RvX2xlMTYocXAtPnJxX251bV9wYWdlcyk7CisJRE1BX1JFR1BBSVJfTEUocF9yYW1yb2QtPnJxX3BibF9hZGRyLCBxcC0+cnFfcGJsX3B0cik7CisJRE1BX1JFR1BBSVJfTEUocF9yYW1yb2QtPmlycV9wYmxfYWRkciwgcXAtPmlycV9waHlzX2FkZHIpOworCXFlZF9yZG1hX2NvcHlfZ2lkcyhxcCwgcF9yYW1yb2QtPnNyY19naWQsIHBfcmFtcm9kLT5kc3RfZ2lkKTsKKwlwX3JhbXJvZC0+cXBfaGFuZGxlX2Zvcl9hc3luYy5oaSA9IGNwdV90b19sZTMyKHFwLT5xcF9oYW5kbGVfYXN5bmMuaGkpOworCXBfcmFtcm9kLT5xcF9oYW5kbGVfZm9yX2FzeW5jLmxvID0gY3B1X3RvX2xlMzIocXAtPnFwX2hhbmRsZV9hc3luYy5sbyk7CisJcF9yYW1yb2QtPnFwX2hhbmRsZV9mb3JfY3FlLmhpID0gY3B1X3RvX2xlMzIocXAtPnFwX2hhbmRsZS5oaSk7CisJcF9yYW1yb2QtPnFwX2hhbmRsZV9mb3JfY3FlLmxvID0gY3B1X3RvX2xlMzIocXAtPnFwX2hhbmRsZS5sbyk7CisJcF9yYW1yb2QtPnN0YXRzX2NvdW50ZXJfaWQgPSBwX2h3Zm4tPnJlbF9wZl9pZDsKKwlwX3JhbXJvZC0+Y3FfY2lkID0gY3B1X3RvX2xlMzIoKHBfaHdmbi0+aHdfaW5mby5vcGFxdWVfZmlkIDw8IDE2KSB8CisJCQkJICAgICAgIHFwLT5ycV9jcV9pZCk7CisKKwltZW1zZXQoJnFtX3BhcmFtcywgMCwgc2l6ZW9mKHFtX3BhcmFtcykpOworCXFtX3BhcmFtcy5yb2NlLnFwaWQgPSBxcC0+aWNpZCA+PiAxOworCXBoeXNpY2FsX3F1ZXVlMCA9IHFlZF9nZXRfcW1fcHEocF9od2ZuLCBQUk9UT0NPTElEX1JPQ0UsICZxbV9wYXJhbXMpOworCisJcF9yYW1yb2QtPnBoeXNpY2FsX3F1ZXVlMCA9IGNwdV90b19sZTE2KHBoeXNpY2FsX3F1ZXVlMCk7CisJcF9yYW1yb2QtPmRwaSA9IGNwdV90b19sZTE2KHFwLT5kcGkpOworCisJcWVkX3JkbWFfc2V0X2Z3X21hYyhwX3JhbXJvZC0+cmVtb3RlX21hY19hZGRyLCBxcC0+cmVtb3RlX21hY19hZGRyKTsKKwlxZWRfcmRtYV9zZXRfZndfbWFjKHBfcmFtcm9kLT5sb2NhbF9tYWNfYWRkciwgcXAtPmxvY2FsX21hY19hZGRyKTsKKworCXBfcmFtcm9kLT51ZHBfc3JjX3BvcnQgPSBxcC0+dWRwX3NyY19wb3J0OworCXBfcmFtcm9kLT52bGFuX2lkID0gY3B1X3RvX2xlMTYocXAtPnZsYW5faWQpOworCXBfcmFtcm9kLT5zcnFfaWQuc3JxX2lkeCA9IGNwdV90b19sZTE2KHFwLT5zcnFfaWQpOworCXBfcmFtcm9kLT5zcnFfaWQub3BhcXVlX2ZpZCA9IGNwdV90b19sZTE2KHBfaHdmbi0+aHdfaW5mby5vcGFxdWVfZmlkKTsKKworCXBfcmFtcm9kLT5zdGF0c19jb3VudGVyX2lkID0gUkVTQ19TVEFSVChwX2h3Zm4sIFFFRF9SRE1BX1NUQVRTX1FVRVVFKSArCisJCQkJICAgICBxcC0+c3RhdHNfcXVldWU7CisKKwlyYyA9IHFlZF9zcHFfcG9zdChwX2h3Zm4sIHBfZW50LCBOVUxMKTsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJyYyA9ICVkIHBoeXNpY2FsX3F1ZXVlMCA9IDB4JXhcbiIsCisJCSAgIHJjLCBwaHlzaWNhbF9xdWV1ZTApOworCisJaWYgKHJjKQorCQlnb3RvIGVycjsKKworCXFwLT5yZXNwX29mZmxvYWRlZCA9IHRydWU7CisKKwlyZXR1cm4gcmM7CisKK2VycjoKKwlEUF9OT1RJQ0UocF9od2ZuLCAiY3JlYXRlIHJlc3BvbmRlciAtIGZhaWxlZCwgcmMgPSAlZFxuIiwgcmMpOworCWRtYV9mcmVlX2NvaGVyZW50KCZwX2h3Zm4tPmNkZXYtPnBkZXYtPmRldiwKKwkJCSAgcXAtPmlycV9udW1fcGFnZXMgKiBSRE1BX1JJTkdfUEFHRV9TSVpFLAorCQkJICBxcC0+aXJxLCBxcC0+aXJxX3BoeXNfYWRkcik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcWVkX3JvY2Vfc3BfY3JlYXRlX3JlcXVlc3RlcihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJc3RydWN0IHFlZF9yZG1hX3FwICpxcCkKK3sKKwlzdHJ1Y3Qgcm9jZV9jcmVhdGVfcXBfcmVxX3JhbXJvZF9kYXRhICpwX3JhbXJvZDsKKwlzdHJ1Y3QgcWVkX3NwX2luaXRfZGF0YSBpbml0X2RhdGE7CisJdW5pb24gcWVkX3FtX3BxX3BhcmFtcyBxbV9wYXJhbXM7CisJZW51bSByb2NlX2ZsYXZvciByb2NlX2ZsYXZvcjsKKwlzdHJ1Y3QgcWVkX3NwcV9lbnRyeSAqcF9lbnQ7CisJdTE2IHBoeXNpY2FsX3F1ZXVlMCA9IDA7CisJaW50IHJjOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgImljaWQgPSAlMDh4XG4iLCBxcC0+aWNpZCk7CisKKwkvKiBBbGxvY2F0ZSBETUEtYWJsZSBtZW1vcnkgZm9yIE9SUSAqLworCXFwLT5vcnFfbnVtX3BhZ2VzID0gMTsKKwlxcC0+b3JxID0gZG1hX2FsbG9jX2NvaGVyZW50KCZwX2h3Zm4tPmNkZXYtPnBkZXYtPmRldiwKKwkJCQkgICAgIFJETUFfUklOR19QQUdFX1NJWkUsCisJCQkJICAgICAmcXAtPm9ycV9waHlzX2FkZHIsIEdGUF9LRVJORUwpOworCWlmICghcXAtPm9ycSkgeworCQlyYyA9IC1FTk9NRU07CisJCURQX05PVElDRShwX2h3Zm4sCisJCQkgICJxZWQgY3JlYXRlIHJlcXVlc3RlciBmYWlsZWQ6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgKG9ycSkuIHJjID0gJWRcbiIsCisJCQkgIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIEdldCBTUFEgZW50cnkgKi8KKwltZW1zZXQoJmluaXRfZGF0YSwgMCwgc2l6ZW9mKGluaXRfZGF0YSkpOworCWluaXRfZGF0YS5jaWQgPSBxcC0+aWNpZCArIDE7CisJaW5pdF9kYXRhLm9wYXF1ZV9maWQgPSBwX2h3Zm4tPmh3X2luZm8ub3BhcXVlX2ZpZDsKKwlpbml0X2RhdGEuY29tcF9tb2RlID0gUUVEX1NQUV9NT0RFX0VCTE9DSzsKKworCXJjID0gcWVkX3NwX2luaXRfcmVxdWVzdChwX2h3Zm4sICZwX2VudCwKKwkJCQkgUk9DRV9SQU1ST0RfQ1JFQVRFX1FQLAorCQkJCSBQUk9UT0NPTElEX1JPQ0UsICZpbml0X2RhdGEpOworCWlmIChyYykKKwkJZ290byBlcnI7CisKKwlwX3JhbXJvZCA9ICZwX2VudC0+cmFtcm9kLnJvY2VfY3JlYXRlX3FwX3JlcTsKKworCXBfcmFtcm9kLT5mbGFncyA9IDA7CisKKwlyb2NlX2ZsYXZvciA9IHFlZF9yb2NlX21vZGVfdG9fZmxhdm9yKHFwLT5yb2NlX21vZGUpOworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUk9DRV9DUkVBVEVfUVBfUkVRX1JBTVJPRF9EQVRBX1JPQ0VfRkxBVk9SLCByb2NlX2ZsYXZvcik7CisKKwlTRVRfRklFTEQocF9yYW1yb2QtPmZsYWdzLAorCQkgIFJPQ0VfQ1JFQVRFX1FQX1JFUV9SQU1ST0RfREFUQV9GTVJfQU5EX1JFU0VSVkVEX0VOLAorCQkgIHFwLT5mbXJfYW5kX3Jlc2VydmVkX2xrZXkpOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBST0NFX0NSRUFURV9RUF9SRVFfUkFNUk9EX0RBVEFfU0lHTkFMRURfQ09NUCwgcXAtPnNpZ25hbF9hbGwpOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBST0NFX0NSRUFURV9RUF9SRVFfUkFNUk9EX0RBVEFfRVJSX1JFVFJZX0NOVCwgcXAtPnJldHJ5X2NudCk7CisKKwlTRVRfRklFTEQocF9yYW1yb2QtPmZsYWdzLAorCQkgIFJPQ0VfQ1JFQVRFX1FQX1JFUV9SQU1ST0RfREFUQV9STlJfTkFLX0NOVCwKKwkJICBxcC0+cm5yX3JldHJ5X2NudCk7CisKKwlwX3JhbXJvZC0+bWF4X29yZCA9IHFwLT5tYXhfcmRfYXRvbWljX3JlcTsKKwlwX3JhbXJvZC0+dHJhZmZpY19jbGFzcyA9IHFwLT50cmFmZmljX2NsYXNzX3RvczsKKwlwX3JhbXJvZC0+aG9wX2xpbWl0ID0gcXAtPmhvcF9saW1pdF90dGw7CisJcF9yYW1yb2QtPm9ycV9udW1fcGFnZXMgPSBxcC0+b3JxX251bV9wYWdlczsKKwlwX3JhbXJvZC0+cF9rZXkgPSBjcHVfdG9fbGUxNihxcC0+cGtleSk7CisJcF9yYW1yb2QtPmZsb3dfbGFiZWwgPSBjcHVfdG9fbGUzMihxcC0+Zmxvd19sYWJlbCk7CisJcF9yYW1yb2QtPmRzdF9xcF9pZCA9IGNwdV90b19sZTMyKHFwLT5kZXN0X3FwKTsKKwlwX3JhbXJvZC0+YWNrX3RpbWVvdXRfdmFsID0gY3B1X3RvX2xlMzIocXAtPmFja190aW1lb3V0KTsKKwlwX3JhbXJvZC0+bXR1ID0gY3B1X3RvX2xlMTYocXAtPm10dSk7CisJcF9yYW1yb2QtPmluaXRpYWxfcHNuID0gY3B1X3RvX2xlMzIocXAtPnNxX3Bzbik7CisJcF9yYW1yb2QtPnBkID0gY3B1X3RvX2xlMTYocXAtPnBkKTsKKwlwX3JhbXJvZC0+c3FfbnVtX3BhZ2VzID0gY3B1X3RvX2xlMTYocXAtPnNxX251bV9wYWdlcyk7CisJRE1BX1JFR1BBSVJfTEUocF9yYW1yb2QtPnNxX3BibF9hZGRyLCBxcC0+c3FfcGJsX3B0cik7CisJRE1BX1JFR1BBSVJfTEUocF9yYW1yb2QtPm9ycV9wYmxfYWRkciwgcXAtPm9ycV9waHlzX2FkZHIpOworCXFlZF9yZG1hX2NvcHlfZ2lkcyhxcCwgcF9yYW1yb2QtPnNyY19naWQsIHBfcmFtcm9kLT5kc3RfZ2lkKTsKKwlwX3JhbXJvZC0+cXBfaGFuZGxlX2Zvcl9hc3luYy5oaSA9IGNwdV90b19sZTMyKHFwLT5xcF9oYW5kbGVfYXN5bmMuaGkpOworCXBfcmFtcm9kLT5xcF9oYW5kbGVfZm9yX2FzeW5jLmxvID0gY3B1X3RvX2xlMzIocXAtPnFwX2hhbmRsZV9hc3luYy5sbyk7CisJcF9yYW1yb2QtPnFwX2hhbmRsZV9mb3JfY3FlLmhpID0gY3B1X3RvX2xlMzIocXAtPnFwX2hhbmRsZS5oaSk7CisJcF9yYW1yb2QtPnFwX2hhbmRsZV9mb3JfY3FlLmxvID0gY3B1X3RvX2xlMzIocXAtPnFwX2hhbmRsZS5sbyk7CisJcF9yYW1yb2QtPnN0YXRzX2NvdW50ZXJfaWQgPSBwX2h3Zm4tPnJlbF9wZl9pZDsKKwlwX3JhbXJvZC0+Y3FfY2lkID0gY3B1X3RvX2xlMzIoKHBfaHdmbi0+aHdfaW5mby5vcGFxdWVfZmlkIDw8IDE2KSB8CisJCQkJICAgICAgIHFwLT5zcV9jcV9pZCk7CisKKwltZW1zZXQoJnFtX3BhcmFtcywgMCwgc2l6ZW9mKHFtX3BhcmFtcykpOworCXFtX3BhcmFtcy5yb2NlLnFwaWQgPSBxcC0+aWNpZCA+PiAxOworCXBoeXNpY2FsX3F1ZXVlMCA9IHFlZF9nZXRfcW1fcHEocF9od2ZuLCBQUk9UT0NPTElEX1JPQ0UsICZxbV9wYXJhbXMpOworCisJcF9yYW1yb2QtPnBoeXNpY2FsX3F1ZXVlMCA9IGNwdV90b19sZTE2KHBoeXNpY2FsX3F1ZXVlMCk7CisJcF9yYW1yb2QtPmRwaSA9IGNwdV90b19sZTE2KHFwLT5kcGkpOworCisJcWVkX3JkbWFfc2V0X2Z3X21hYyhwX3JhbXJvZC0+cmVtb3RlX21hY19hZGRyLCBxcC0+cmVtb3RlX21hY19hZGRyKTsKKwlxZWRfcmRtYV9zZXRfZndfbWFjKHBfcmFtcm9kLT5sb2NhbF9tYWNfYWRkciwgcXAtPmxvY2FsX21hY19hZGRyKTsKKworCXBfcmFtcm9kLT51ZHBfc3JjX3BvcnQgPSBxcC0+dWRwX3NyY19wb3J0OworCXBfcmFtcm9kLT52bGFuX2lkID0gY3B1X3RvX2xlMTYocXAtPnZsYW5faWQpOworCXBfcmFtcm9kLT5zdGF0c19jb3VudGVyX2lkID0gUkVTQ19TVEFSVChwX2h3Zm4sIFFFRF9SRE1BX1NUQVRTX1FVRVVFKSArCisJCQkJICAgICBxcC0+c3RhdHNfcXVldWU7CisKKwlyYyA9IHFlZF9zcHFfcG9zdChwX2h3Zm4sIHBfZW50LCBOVUxMKTsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJyYyA9ICVkXG4iLCByYyk7CisKKwlpZiAocmMpCisJCWdvdG8gZXJyOworCisJcXAtPnJlcV9vZmZsb2FkZWQgPSB0cnVlOworCisJcmV0dXJuIHJjOworCitlcnI6CisJRFBfTk9USUNFKHBfaHdmbiwgIkNyZWF0ZSByZXF1ZXN0ZWQgLSBmYWlsZWQsIHJjID0gJWRcbiIsIHJjKTsKKwlkbWFfZnJlZV9jb2hlcmVudCgmcF9od2ZuLT5jZGV2LT5wZGV2LT5kZXYsCisJCQkgIHFwLT5vcnFfbnVtX3BhZ2VzICogUkRNQV9SSU5HX1BBR0VfU0laRSwKKwkJCSAgcXAtPm9ycSwgcXAtPm9ycV9waHlzX2FkZHIpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBxZWRfcm9jZV9zcF9tb2RpZnlfcmVzcG9uZGVyKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQlzdHJ1Y3QgcWVkX3JkbWFfcXAgKnFwLAorCQkJCQlib29sIG1vdmVfdG9fZXJyLCB1MzIgbW9kaWZ5X2ZsYWdzKQoreworCXN0cnVjdCByb2NlX21vZGlmeV9xcF9yZXNwX3JhbXJvZF9kYXRhICpwX3JhbXJvZDsKKwlzdHJ1Y3QgcWVkX3NwX2luaXRfZGF0YSBpbml0X2RhdGE7CisJc3RydWN0IHFlZF9zcHFfZW50cnkgKnBfZW50OworCWludCByYzsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJpY2lkID0gJTA4eFxuIiwgcXAtPmljaWQpOworCisJaWYgKG1vdmVfdG9fZXJyICYmICFxcC0+cmVzcF9vZmZsb2FkZWQpCisJCXJldHVybiAwOworCisJLyogR2V0IFNQUSBlbnRyeSAqLworCW1lbXNldCgmaW5pdF9kYXRhLCAwLCBzaXplb2YoaW5pdF9kYXRhKSk7CisJaW5pdF9kYXRhLmNpZCA9IHFwLT5pY2lkOworCWluaXRfZGF0YS5vcGFxdWVfZmlkID0gcF9od2ZuLT5od19pbmZvLm9wYXF1ZV9maWQ7CisJaW5pdF9kYXRhLmNvbXBfbW9kZSA9IFFFRF9TUFFfTU9ERV9FQkxPQ0s7CisKKwlyYyA9IHFlZF9zcF9pbml0X3JlcXVlc3QocF9od2ZuLCAmcF9lbnQsCisJCQkJIFJPQ0VfRVZFTlRfTU9ESUZZX1FQLAorCQkJCSBQUk9UT0NPTElEX1JPQ0UsICZpbml0X2RhdGEpOworCWlmIChyYykgeworCQlEUF9OT1RJQ0UocF9od2ZuLCAicmMgPSAlZFxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJcF9yYW1yb2QgPSAmcF9lbnQtPnJhbXJvZC5yb2NlX21vZGlmeV9xcF9yZXNwOworCisJcF9yYW1yb2QtPmZsYWdzID0gMDsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUk9DRV9NT0RJRllfUVBfUkVTUF9SQU1ST0RfREFUQV9NT1ZFX1RPX0VSUl9GTEcsIG1vdmVfdG9fZXJyKTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUk9DRV9NT0RJRllfUVBfUkVTUF9SQU1ST0RfREFUQV9SRE1BX1JEX0VOLAorCQkgIHFwLT5pbmNvbWluZ19yZG1hX3JlYWRfZW4pOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBST0NFX01PRElGWV9RUF9SRVNQX1JBTVJPRF9EQVRBX1JETUFfV1JfRU4sCisJCSAgcXAtPmluY29taW5nX3JkbWFfd3JpdGVfZW4pOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBST0NFX01PRElGWV9RUF9SRVNQX1JBTVJPRF9EQVRBX0FUT01JQ19FTiwKKwkJICBxcC0+aW5jb21pbmdfYXRvbWljX2VuKTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUk9DRV9DUkVBVEVfUVBfUkVTUF9SQU1ST0RfREFUQV9FMkVfRkxPV19DT05UUk9MX0VOLAorCQkgIHFwLT5lMmVfZmxvd19jb250cm9sX2VuKTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUk9DRV9NT0RJRllfUVBfUkVTUF9SQU1ST0RfREFUQV9SRE1BX09QU19FTl9GTEcsCisJCSAgR0VUX0ZJRUxEKG1vZGlmeV9mbGFncywKKwkJCSAgICBRRURfUkRNQV9NT0RJRllfUVBfVkFMSURfUkRNQV9PUFNfRU4pKTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUk9DRV9NT0RJRllfUVBfUkVTUF9SQU1ST0RfREFUQV9QX0tFWV9GTEcsCisJCSAgR0VUX0ZJRUxEKG1vZGlmeV9mbGFncywgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX1BLRVkpKTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUk9DRV9NT0RJRllfUVBfUkVTUF9SQU1ST0RfREFUQV9BRERSRVNTX1ZFQ1RPUl9GTEcsCisJCSAgR0VUX0ZJRUxEKG1vZGlmeV9mbGFncywKKwkJCSAgICBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfQUREUkVTU19WRUNUT1IpKTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUk9DRV9NT0RJRllfUVBfUkVTUF9SQU1ST0RfREFUQV9NQVhfSVJEX0ZMRywKKwkJICBHRVRfRklFTEQobW9kaWZ5X2ZsYWdzLAorCQkJICAgIFFFRF9SRE1BX01PRElGWV9RUF9WQUxJRF9NQVhfUkRfQVRPTUlDX1JFU1ApKTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUk9DRV9NT0RJRllfUVBfUkVTUF9SQU1ST0RfREFUQV9NSU5fUk5SX05BS19USU1FUl9GTEcsCisJCSAgR0VUX0ZJRUxEKG1vZGlmeV9mbGFncywKKwkJCSAgICBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfTUlOX1JOUl9OQUtfVElNRVIpKTsKKworCXBfcmFtcm9kLT5maWVsZHMgPSAwOworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmllbGRzLAorCQkgIFJPQ0VfTU9ESUZZX1FQX1JFU1BfUkFNUk9EX0RBVEFfTUlOX1JOUl9OQUtfVElNRVIsCisJCSAgcXAtPm1pbl9ybnJfbmFrX3RpbWVyKTsKKworCXBfcmFtcm9kLT5tYXhfaXJkID0gcXAtPm1heF9yZF9hdG9taWNfcmVzcDsKKwlwX3JhbXJvZC0+dHJhZmZpY19jbGFzcyA9IHFwLT50cmFmZmljX2NsYXNzX3RvczsKKwlwX3JhbXJvZC0+aG9wX2xpbWl0ID0gcXAtPmhvcF9saW1pdF90dGw7CisJcF9yYW1yb2QtPnBfa2V5ID0gY3B1X3RvX2xlMTYocXAtPnBrZXkpOworCXBfcmFtcm9kLT5mbG93X2xhYmVsID0gY3B1X3RvX2xlMzIocXAtPmZsb3dfbGFiZWwpOworCXBfcmFtcm9kLT5tdHUgPSBjcHVfdG9fbGUxNihxcC0+bXR1KTsKKwlxZWRfcmRtYV9jb3B5X2dpZHMocXAsIHBfcmFtcm9kLT5zcmNfZ2lkLCBwX3JhbXJvZC0+ZHN0X2dpZCk7CisJcmMgPSBxZWRfc3BxX3Bvc3QocF9od2ZuLCBwX2VudCwgTlVMTCk7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiTW9kaWZ5IHJlc3BvbmRlciwgcmMgPSAlZFxuIiwgcmMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBxZWRfcm9jZV9zcF9tb2RpZnlfcmVxdWVzdGVyKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQlzdHJ1Y3QgcWVkX3JkbWFfcXAgKnFwLAorCQkJCQlib29sIG1vdmVfdG9fc3FkLAorCQkJCQlib29sIG1vdmVfdG9fZXJyLCB1MzIgbW9kaWZ5X2ZsYWdzKQoreworCXN0cnVjdCByb2NlX21vZGlmeV9xcF9yZXFfcmFtcm9kX2RhdGEgKnBfcmFtcm9kOworCXN0cnVjdCBxZWRfc3BfaW5pdF9kYXRhIGluaXRfZGF0YTsKKwlzdHJ1Y3QgcWVkX3NwcV9lbnRyeSAqcF9lbnQ7CisJaW50IHJjOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgImljaWQgPSAlMDh4XG4iLCBxcC0+aWNpZCk7CisKKwlpZiAobW92ZV90b19lcnIgJiYgIShxcC0+cmVxX29mZmxvYWRlZCkpCisJCXJldHVybiAwOworCisJLyogR2V0IFNQUSBlbnRyeSAqLworCW1lbXNldCgmaW5pdF9kYXRhLCAwLCBzaXplb2YoaW5pdF9kYXRhKSk7CisJaW5pdF9kYXRhLmNpZCA9IHFwLT5pY2lkICsgMTsKKwlpbml0X2RhdGEub3BhcXVlX2ZpZCA9IHBfaHdmbi0+aHdfaW5mby5vcGFxdWVfZmlkOworCWluaXRfZGF0YS5jb21wX21vZGUgPSBRRURfU1BRX01PREVfRUJMT0NLOworCisJcmMgPSBxZWRfc3BfaW5pdF9yZXF1ZXN0KHBfaHdmbiwgJnBfZW50LAorCQkJCSBST0NFX0VWRU5UX01PRElGWV9RUCwKKwkJCQkgUFJPVE9DT0xJRF9ST0NFLCAmaW5pdF9kYXRhKTsKKwlpZiAocmMpIHsKKwkJRFBfTk9USUNFKHBfaHdmbiwgInJjID0gJWRcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXBfcmFtcm9kID0gJnBfZW50LT5yYW1yb2Qucm9jZV9tb2RpZnlfcXBfcmVxOworCisJcF9yYW1yb2QtPmZsYWdzID0gMDsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUk9DRV9NT0RJRllfUVBfUkVRX1JBTVJPRF9EQVRBX01PVkVfVE9fRVJSX0ZMRywgbW92ZV90b19lcnIpOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBST0NFX01PRElGWV9RUF9SRVFfUkFNUk9EX0RBVEFfTU9WRV9UT19TUURfRkxHLCBtb3ZlX3RvX3NxZCk7CisKKwlTRVRfRklFTEQocF9yYW1yb2QtPmZsYWdzLAorCQkgIFJPQ0VfTU9ESUZZX1FQX1JFUV9SQU1ST0RfREFUQV9FTl9TUURfQVNZTkNfTk9USUZZLAorCQkgIHFwLT5zcWRfYXN5bmMpOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBST0NFX01PRElGWV9RUF9SRVFfUkFNUk9EX0RBVEFfUF9LRVlfRkxHLAorCQkgIEdFVF9GSUVMRChtb2RpZnlfZmxhZ3MsIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9QS0VZKSk7CisKKwlTRVRfRklFTEQocF9yYW1yb2QtPmZsYWdzLAorCQkgIFJPQ0VfTU9ESUZZX1FQX1JFUV9SQU1ST0RfREFUQV9BRERSRVNTX1ZFQ1RPUl9GTEcsCisJCSAgR0VUX0ZJRUxEKG1vZGlmeV9mbGFncywKKwkJCSAgICBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfQUREUkVTU19WRUNUT1IpKTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUk9DRV9NT0RJRllfUVBfUkVRX1JBTVJPRF9EQVRBX01BWF9PUkRfRkxHLAorCQkgIEdFVF9GSUVMRChtb2RpZnlfZmxhZ3MsCisJCQkgICAgUUVEX1JETUFfTU9ESUZZX1FQX1ZBTElEX01BWF9SRF9BVE9NSUNfUkVRKSk7CisKKwlTRVRfRklFTEQocF9yYW1yb2QtPmZsYWdzLAorCQkgIFJPQ0VfTU9ESUZZX1FQX1JFUV9SQU1ST0RfREFUQV9STlJfTkFLX0NOVF9GTEcsCisJCSAgR0VUX0ZJRUxEKG1vZGlmeV9mbGFncywKKwkJCSAgICBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfUk5SX1JFVFJZX0NOVCkpOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBST0NFX01PRElGWV9RUF9SRVFfUkFNUk9EX0RBVEFfRVJSX1JFVFJZX0NOVF9GTEcsCisJCSAgR0VUX0ZJRUxEKG1vZGlmeV9mbGFncywgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX1JFVFJZX0NOVCkpOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBST0NFX01PRElGWV9RUF9SRVFfUkFNUk9EX0RBVEFfQUNLX1RJTUVPVVRfRkxHLAorCQkgIEdFVF9GSUVMRChtb2RpZnlfZmxhZ3MsCisJCQkgICAgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX0FDS19USU1FT1VUKSk7CisKKwlwX3JhbXJvZC0+ZmllbGRzID0gMDsKKwlTRVRfRklFTEQocF9yYW1yb2QtPmZpZWxkcywKKwkJICBST0NFX01PRElGWV9RUF9SRVFfUkFNUk9EX0RBVEFfRVJSX1JFVFJZX0NOVCwgcXAtPnJldHJ5X2NudCk7CisKKwlTRVRfRklFTEQocF9yYW1yb2QtPmZpZWxkcywKKwkJICBST0NFX01PRElGWV9RUF9SRVFfUkFNUk9EX0RBVEFfUk5SX05BS19DTlQsCisJCSAgcXAtPnJucl9yZXRyeV9jbnQpOworCisJcF9yYW1yb2QtPm1heF9vcmQgPSBxcC0+bWF4X3JkX2F0b21pY19yZXE7CisJcF9yYW1yb2QtPnRyYWZmaWNfY2xhc3MgPSBxcC0+dHJhZmZpY19jbGFzc190b3M7CisJcF9yYW1yb2QtPmhvcF9saW1pdCA9IHFwLT5ob3BfbGltaXRfdHRsOworCXBfcmFtcm9kLT5wX2tleSA9IGNwdV90b19sZTE2KHFwLT5wa2V5KTsKKwlwX3JhbXJvZC0+Zmxvd19sYWJlbCA9IGNwdV90b19sZTMyKHFwLT5mbG93X2xhYmVsKTsKKwlwX3JhbXJvZC0+YWNrX3RpbWVvdXRfdmFsID0gY3B1X3RvX2xlMzIocXAtPmFja190aW1lb3V0KTsKKwlwX3JhbXJvZC0+bXR1ID0gY3B1X3RvX2xlMTYocXAtPm10dSk7CisJcWVkX3JkbWFfY29weV9naWRzKHFwLCBwX3JhbXJvZC0+c3JjX2dpZCwgcF9yYW1yb2QtPmRzdF9naWQpOworCXJjID0gcWVkX3NwcV9wb3N0KHBfaHdmbiwgcF9lbnQsIE5VTEwpOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIk1vZGlmeSByZXF1ZXN0ZXIsIHJjID0gJWRcbiIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcWVkX3JvY2Vfc3BfZGVzdHJveV9xcF9yZXNwb25kZXIoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgICBzdHJ1Y3QgcWVkX3JkbWFfcXAgKnFwLAorCQkJCQkgICAgdTMyICpudW1faW52YWxpZGF0ZWRfbXcpCit7CisJc3RydWN0IHJvY2VfZGVzdHJveV9xcF9yZXNwX291dHB1dF9wYXJhbXMgKnBfcmFtcm9kX3JlczsKKwlzdHJ1Y3Qgcm9jZV9kZXN0cm95X3FwX3Jlc3BfcmFtcm9kX2RhdGEgKnBfcmFtcm9kOworCXN0cnVjdCBxZWRfc3BfaW5pdF9kYXRhIGluaXRfZGF0YTsKKwlzdHJ1Y3QgcWVkX3NwcV9lbnRyeSAqcF9lbnQ7CisJZG1hX2FkZHJfdCByYW1yb2RfcmVzX3BoeXM7CisJaW50IHJjOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgImljaWQgPSAlMDh4XG4iLCBxcC0+aWNpZCk7CisKKwlpZiAoIXFwLT5yZXNwX29mZmxvYWRlZCkKKwkJcmV0dXJuIDA7CisKKwkvKiBHZXQgU1BRIGVudHJ5ICovCisJbWVtc2V0KCZpbml0X2RhdGEsIDAsIHNpemVvZihpbml0X2RhdGEpKTsKKwlpbml0X2RhdGEuY2lkID0gcXAtPmljaWQ7CisJaW5pdF9kYXRhLm9wYXF1ZV9maWQgPSBwX2h3Zm4tPmh3X2luZm8ub3BhcXVlX2ZpZDsKKwlpbml0X2RhdGEuY29tcF9tb2RlID0gUUVEX1NQUV9NT0RFX0VCTE9DSzsKKworCXJjID0gcWVkX3NwX2luaXRfcmVxdWVzdChwX2h3Zm4sICZwX2VudCwKKwkJCQkgUk9DRV9SQU1ST0RfREVTVFJPWV9RUCwKKwkJCQkgUFJPVE9DT0xJRF9ST0NFLCAmaW5pdF9kYXRhKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBfcmFtcm9kID0gJnBfZW50LT5yYW1yb2Qucm9jZV9kZXN0cm95X3FwX3Jlc3A7CisKKwlwX3JhbXJvZF9yZXMgPSAoc3RydWN0IHJvY2VfZGVzdHJveV9xcF9yZXNwX291dHB1dF9wYXJhbXMgKikKKwkgICAgZG1hX2FsbG9jX2NvaGVyZW50KCZwX2h3Zm4tPmNkZXYtPnBkZXYtPmRldiwgc2l6ZW9mKCpwX3JhbXJvZF9yZXMpLAorCQkJICAgICAgICZyYW1yb2RfcmVzX3BoeXMsIEdGUF9LRVJORUwpOworCisJaWYgKCFwX3JhbXJvZF9yZXMpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJICAicWVkIGRlc3Ryb3kgcmVzcG9uZGVyIGZhaWxlZDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSAocmFtcm9kKS4gcmMgPSAlZFxuIiwKKwkJCSAgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJRE1BX1JFR1BBSVJfTEUocF9yYW1yb2QtPm91dHB1dF9wYXJhbXNfYWRkciwgcmFtcm9kX3Jlc19waHlzKTsKKworCXJjID0gcWVkX3NwcV9wb3N0KHBfaHdmbiwgcF9lbnQsIE5VTEwpOworCWlmIChyYykKKwkJZ290byBlcnI7CisKKwkqbnVtX2ludmFsaWRhdGVkX213ID0gbGUzMl90b19jcHUocF9yYW1yb2RfcmVzLT5udW1faW52YWxpZGF0ZWRfbXcpOworCisJLyogRnJlZSBJUlEgLSBvbmx5IGlmIHJhbXJvZCBzdWNjZWVkZWQsIGluIGNhc2UgRlcgaXMgc3RpbGwgdXNpbmcgaXQgKi8KKwlkbWFfZnJlZV9jb2hlcmVudCgmcF9od2ZuLT5jZGV2LT5wZGV2LT5kZXYsCisJCQkgIHFwLT5pcnFfbnVtX3BhZ2VzICogUkRNQV9SSU5HX1BBR0VfU0laRSwKKwkJCSAgcXAtPmlycSwgcXAtPmlycV9waHlzX2FkZHIpOworCisJcXAtPnJlc3Bfb2ZmbG9hZGVkID0gZmFsc2U7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiRGVzdHJveSByZXNwb25kZXIsIHJjID0gJWRcbiIsIHJjKTsKKworZXJyOgorCWRtYV9mcmVlX2NvaGVyZW50KCZwX2h3Zm4tPmNkZXYtPnBkZXYtPmRldiwKKwkJCSAgc2l6ZW9mKHN0cnVjdCByb2NlX2Rlc3Ryb3lfcXBfcmVzcF9vdXRwdXRfcGFyYW1zKSwKKwkJCSAgcF9yYW1yb2RfcmVzLCByYW1yb2RfcmVzX3BoeXMpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHFlZF9yb2NlX3NwX2Rlc3Ryb3lfcXBfcmVxdWVzdGVyKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICAgc3RydWN0IHFlZF9yZG1hX3FwICpxcCwKKwkJCQkJICAgIHUzMiAqbnVtX2JvdW5kX213KQoreworCXN0cnVjdCByb2NlX2Rlc3Ryb3lfcXBfcmVxX291dHB1dF9wYXJhbXMgKnBfcmFtcm9kX3JlczsKKwlzdHJ1Y3Qgcm9jZV9kZXN0cm95X3FwX3JlcV9yYW1yb2RfZGF0YSAqcF9yYW1yb2Q7CisJc3RydWN0IHFlZF9zcF9pbml0X2RhdGEgaW5pdF9kYXRhOworCXN0cnVjdCBxZWRfc3BxX2VudHJ5ICpwX2VudDsKKwlkbWFfYWRkcl90IHJhbXJvZF9yZXNfcGh5czsKKwlpbnQgcmMgPSAtRU5PTUVNOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgImljaWQgPSAlMDh4XG4iLCBxcC0+aWNpZCk7CisKKwlpZiAoIXFwLT5yZXFfb2ZmbG9hZGVkKQorCQlyZXR1cm4gMDsKKworCXBfcmFtcm9kX3JlcyA9IChzdHJ1Y3Qgcm9jZV9kZXN0cm95X3FwX3JlcV9vdXRwdXRfcGFyYW1zICopCisJCSAgICAgICBkbWFfYWxsb2NfY29oZXJlbnQoJnBfaHdmbi0+Y2Rldi0+cGRldi0+ZGV2LAorCQkJCQkgIHNpemVvZigqcF9yYW1yb2RfcmVzKSwKKwkJCQkJICAmcmFtcm9kX3Jlc19waHlzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBfcmFtcm9kX3JlcykgeworCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJICAicWVkIGRlc3Ryb3kgcmVxdWVzdGVyIGZhaWxlZDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSAocmFtcm9kKVxuIik7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBHZXQgU1BRIGVudHJ5ICovCisJbWVtc2V0KCZpbml0X2RhdGEsIDAsIHNpemVvZihpbml0X2RhdGEpKTsKKwlpbml0X2RhdGEuY2lkID0gcXAtPmljaWQgKyAxOworCWluaXRfZGF0YS5vcGFxdWVfZmlkID0gcF9od2ZuLT5od19pbmZvLm9wYXF1ZV9maWQ7CisJaW5pdF9kYXRhLmNvbXBfbW9kZSA9IFFFRF9TUFFfTU9ERV9FQkxPQ0s7CisKKwlyYyA9IHFlZF9zcF9pbml0X3JlcXVlc3QocF9od2ZuLCAmcF9lbnQsIFJPQ0VfUkFNUk9EX0RFU1RST1lfUVAsCisJCQkJIFBST1RPQ09MSURfUk9DRSwgJmluaXRfZGF0YSk7CisJaWYgKHJjKQorCQlnb3RvIGVycjsKKworCXBfcmFtcm9kID0gJnBfZW50LT5yYW1yb2Qucm9jZV9kZXN0cm95X3FwX3JlcTsKKwlETUFfUkVHUEFJUl9MRShwX3JhbXJvZC0+b3V0cHV0X3BhcmFtc19hZGRyLCByYW1yb2RfcmVzX3BoeXMpOworCisJcmMgPSBxZWRfc3BxX3Bvc3QocF9od2ZuLCBwX2VudCwgTlVMTCk7CisJaWYgKHJjKQorCQlnb3RvIGVycjsKKworCSpudW1fYm91bmRfbXcgPSBsZTMyX3RvX2NwdShwX3JhbXJvZF9yZXMtPm51bV9ib3VuZF9tdyk7CisKKwkvKiBGcmVlIE9SUSAtIG9ubHkgaWYgcmFtcm9kIHN1Y2NlZWRlZCwgaW4gY2FzZSBGVyBpcyBzdGlsbCB1c2luZyBpdCAqLworCWRtYV9mcmVlX2NvaGVyZW50KCZwX2h3Zm4tPmNkZXYtPnBkZXYtPmRldiwKKwkJCSAgcXAtPm9ycV9udW1fcGFnZXMgKiBSRE1BX1JJTkdfUEFHRV9TSVpFLAorCQkJICBxcC0+b3JxLCBxcC0+b3JxX3BoeXNfYWRkcik7CisKKwlxcC0+cmVxX29mZmxvYWRlZCA9IGZhbHNlOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIkRlc3Ryb3kgcmVxdWVzdGVyLCByYyA9ICVkXG4iLCByYyk7CisKK2VycjoKKwlkbWFfZnJlZV9jb2hlcmVudCgmcF9od2ZuLT5jZGV2LT5wZGV2LT5kZXYsIHNpemVvZigqcF9yYW1yb2RfcmVzKSwKKwkJCSAgcF9yYW1yb2RfcmVzLCByYW1yb2RfcmVzX3BoeXMpOworCisJcmV0dXJuIHJjOworfQorCitpbnQgcWVkX3JvY2VfcXVlcnlfcXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCSAgICAgIHN0cnVjdCBxZWRfcmRtYV9xcCAqcXAsCisJCSAgICAgIHN0cnVjdCBxZWRfcmRtYV9xdWVyeV9xcF9vdXRfcGFyYW1zICpvdXRfcGFyYW1zKQoreworCXN0cnVjdCByb2NlX3F1ZXJ5X3FwX3Jlc3Bfb3V0cHV0X3BhcmFtcyAqcF9yZXNwX3JhbXJvZF9yZXM7CisJc3RydWN0IHJvY2VfcXVlcnlfcXBfcmVxX291dHB1dF9wYXJhbXMgKnBfcmVxX3JhbXJvZF9yZXM7CisJc3RydWN0IHJvY2VfcXVlcnlfcXBfcmVzcF9yYW1yb2RfZGF0YSAqcF9yZXNwX3JhbXJvZDsKKwlzdHJ1Y3Qgcm9jZV9xdWVyeV9xcF9yZXFfcmFtcm9kX2RhdGEgKnBfcmVxX3JhbXJvZDsKKwlzdHJ1Y3QgcWVkX3NwX2luaXRfZGF0YSBpbml0X2RhdGE7CisJZG1hX2FkZHJfdCByZXNwX3JhbXJvZF9yZXNfcGh5czsKKwlkbWFfYWRkcl90IHJlcV9yYW1yb2RfcmVzX3BoeXM7CisJc3RydWN0IHFlZF9zcHFfZW50cnkgKnBfZW50OworCWJvb2wgcnFfZXJyX3N0YXRlOworCWJvb2wgc3FfZXJyX3N0YXRlOworCWJvb2wgc3FfZHJhaW5pbmc7CisJaW50IHJjID0gLUVOT01FTTsKKworCWlmICgoIShxcC0+cmVzcF9vZmZsb2FkZWQpKSAmJiAoIShxcC0+cmVxX29mZmxvYWRlZCkpKSB7CisJCS8qIFdlIGNhbid0IHNlbmQgcmFtcm9kIHRvIHRoZSBmdyBzaW5jZSB0aGlzIHFwIHdhc24ndCBvZmZsb2FkZWQKKwkJICogdG8gdGhlIGZ3IHlldAorCQkgKi8KKwkJb3V0X3BhcmFtcy0+ZHJhaW5pbmcgPSBmYWxzZTsKKwkJb3V0X3BhcmFtcy0+cnFfcHNuID0gcXAtPnJxX3BzbjsKKwkJb3V0X3BhcmFtcy0+c3FfcHNuID0gcXAtPnNxX3BzbjsKKwkJb3V0X3BhcmFtcy0+c3RhdGUgPSBxcC0+Y3VyX3N0YXRlOworCisJCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJObyBRUHMgYXMgbm8gb2ZmbG9hZFxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghKHFwLT5yZXNwX29mZmxvYWRlZCkpIHsKKwkJRFBfTk9USUNFKHBfaHdmbiwKKwkJCSAgIlRoZSByZXNwb25kZXIncyBxcCBzaG91bGQgYmUgb2ZmbG9kZWQgYmVmb3JlIHJlcXVlc3RlcidzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogU2VuZCBhIHF1ZXJ5IHJlc3BvbmRlciByYW1yb2QgdG8gRlcgdG8gZ2V0IFJRLVBTTiBhbmQgc3RhdGUgKi8KKwlwX3Jlc3BfcmFtcm9kX3JlcyA9IChzdHJ1Y3Qgcm9jZV9xdWVyeV9xcF9yZXNwX291dHB1dF9wYXJhbXMgKikKKwkgICAgZG1hX2FsbG9jX2NvaGVyZW50KCZwX2h3Zm4tPmNkZXYtPnBkZXYtPmRldiwKKwkJCSAgICAgICBzaXplb2YoKnBfcmVzcF9yYW1yb2RfcmVzKSwKKwkJCSAgICAgICAmcmVzcF9yYW1yb2RfcmVzX3BoeXMsIEdGUF9LRVJORUwpOworCWlmICghcF9yZXNwX3JhbXJvZF9yZXMpIHsKKwkJRFBfTk9USUNFKHBfaHdmbiwKKwkJCSAgInFlZCBxdWVyeSBxcCBmYWlsZWQ6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgKHJhbXJvZClcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogR2V0IFNQUSBlbnRyeSAqLworCW1lbXNldCgmaW5pdF9kYXRhLCAwLCBzaXplb2YoaW5pdF9kYXRhKSk7CisJaW5pdF9kYXRhLmNpZCA9IHFwLT5pY2lkOworCWluaXRfZGF0YS5vcGFxdWVfZmlkID0gcF9od2ZuLT5od19pbmZvLm9wYXF1ZV9maWQ7CisJaW5pdF9kYXRhLmNvbXBfbW9kZSA9IFFFRF9TUFFfTU9ERV9FQkxPQ0s7CisJcmMgPSBxZWRfc3BfaW5pdF9yZXF1ZXN0KHBfaHdmbiwgJnBfZW50LCBST0NFX1JBTVJPRF9RVUVSWV9RUCwKKwkJCQkgUFJPVE9DT0xJRF9ST0NFLCAmaW5pdF9kYXRhKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX3Jlc3A7CisKKwlwX3Jlc3BfcmFtcm9kID0gJnBfZW50LT5yYW1yb2Qucm9jZV9xdWVyeV9xcF9yZXNwOworCURNQV9SRUdQQUlSX0xFKHBfcmVzcF9yYW1yb2QtPm91dHB1dF9wYXJhbXNfYWRkciwgcmVzcF9yYW1yb2RfcmVzX3BoeXMpOworCisJcmMgPSBxZWRfc3BxX3Bvc3QocF9od2ZuLCBwX2VudCwgTlVMTCk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9yZXNwOworCisJZG1hX2ZyZWVfY29oZXJlbnQoJnBfaHdmbi0+Y2Rldi0+cGRldi0+ZGV2LCBzaXplb2YoKnBfcmVzcF9yYW1yb2RfcmVzKSwKKwkJCSAgcF9yZXNwX3JhbXJvZF9yZXMsIHJlc3BfcmFtcm9kX3Jlc19waHlzKTsKKworCW91dF9wYXJhbXMtPnJxX3BzbiA9IGxlMzJfdG9fY3B1KHBfcmVzcF9yYW1yb2RfcmVzLT5wc24pOworCXJxX2Vycl9zdGF0ZSA9IEdFVF9GSUVMRChsZTMyX3RvX2NwdShwX3Jlc3BfcmFtcm9kX3Jlcy0+ZXJyX2ZsYWcpLAorCQkJCSBST0NFX1FVRVJZX1FQX1JFU1BfT1VUUFVUX1BBUkFNU19FUlJPUl9GTEcpOworCisJaWYgKCEocXAtPnJlcV9vZmZsb2FkZWQpKSB7CisJCS8qIERvbid0IHNlbmQgcXVlcnkgcXAgZm9yIHRoZSByZXF1ZXN0ZXIgKi8KKwkJb3V0X3BhcmFtcy0+c3FfcHNuID0gcXAtPnNxX3BzbjsKKwkJb3V0X3BhcmFtcy0+ZHJhaW5pbmcgPSBmYWxzZTsKKworCQlpZiAocnFfZXJyX3N0YXRlKQorCQkJcXAtPmN1cl9zdGF0ZSA9IFFFRF9ST0NFX1FQX1NUQVRFX0VSUjsKKworCQlvdXRfcGFyYW1zLT5zdGF0ZSA9IHFwLT5jdXJfc3RhdGU7CisKKwkJcmV0dXJuIDA7CisJfQorCisJLyogU2VuZCBhIHF1ZXJ5IHJlcXVlc3RlciByYW1yb2QgdG8gRlcgdG8gZ2V0IFNRLVBTTiBhbmQgc3RhdGUgKi8KKwlwX3JlcV9yYW1yb2RfcmVzID0gKHN0cnVjdCByb2NlX3F1ZXJ5X3FwX3JlcV9vdXRwdXRfcGFyYW1zICopCisJCQkgICBkbWFfYWxsb2NfY29oZXJlbnQoJnBfaHdmbi0+Y2Rldi0+cGRldi0+ZGV2LAorCQkJCQkgICAgICBzaXplb2YoKnBfcmVxX3JhbXJvZF9yZXMpLAorCQkJCQkgICAgICAmcmVxX3JhbXJvZF9yZXNfcGh5cywKKwkJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFwX3JlcV9yYW1yb2RfcmVzKSB7CisJCXJjID0gLUVOT01FTTsKKwkJRFBfTk9USUNFKHBfaHdmbiwKKwkJCSAgInFlZCBxdWVyeSBxcCBmYWlsZWQ6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgKHJhbXJvZClcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogR2V0IFNQUSBlbnRyeSAqLworCWluaXRfZGF0YS5jaWQgPSBxcC0+aWNpZCArIDE7CisJcmMgPSBxZWRfc3BfaW5pdF9yZXF1ZXN0KHBfaHdmbiwgJnBfZW50LCBST0NFX1JBTVJPRF9RVUVSWV9RUCwKKwkJCQkgUFJPVE9DT0xJRF9ST0NFLCAmaW5pdF9kYXRhKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX3JlcTsKKworCXBfcmVxX3JhbXJvZCA9ICZwX2VudC0+cmFtcm9kLnJvY2VfcXVlcnlfcXBfcmVxOworCURNQV9SRUdQQUlSX0xFKHBfcmVxX3JhbXJvZC0+b3V0cHV0X3BhcmFtc19hZGRyLCByZXFfcmFtcm9kX3Jlc19waHlzKTsKKworCXJjID0gcWVkX3NwcV9wb3N0KHBfaHdmbiwgcF9lbnQsIE5VTEwpOworCWlmIChyYykKKwkJZ290byBlcnJfcmVxOworCisJZG1hX2ZyZWVfY29oZXJlbnQoJnBfaHdmbi0+Y2Rldi0+cGRldi0+ZGV2LCBzaXplb2YoKnBfcmVxX3JhbXJvZF9yZXMpLAorCQkJICBwX3JlcV9yYW1yb2RfcmVzLCByZXFfcmFtcm9kX3Jlc19waHlzKTsKKworCW91dF9wYXJhbXMtPnNxX3BzbiA9IGxlMzJfdG9fY3B1KHBfcmVxX3JhbXJvZF9yZXMtPnBzbik7CisJc3FfZXJyX3N0YXRlID0gR0VUX0ZJRUxEKGxlMzJfdG9fY3B1KHBfcmVxX3JhbXJvZF9yZXMtPmZsYWdzKSwKKwkJCQkgUk9DRV9RVUVSWV9RUF9SRVFfT1VUUFVUX1BBUkFNU19FUlJfRkxHKTsKKwlzcV9kcmFpbmluZyA9CisJCUdFVF9GSUVMRChsZTMyX3RvX2NwdShwX3JlcV9yYW1yb2RfcmVzLT5mbGFncyksCisJCQkgIFJPQ0VfUVVFUllfUVBfUkVRX09VVFBVVF9QQVJBTVNfU1FfRFJBSU5JTkdfRkxHKTsKKworCW91dF9wYXJhbXMtPmRyYWluaW5nID0gZmFsc2U7CisKKwlpZiAocnFfZXJyX3N0YXRlKQorCQlxcC0+Y3VyX3N0YXRlID0gUUVEX1JPQ0VfUVBfU1RBVEVfRVJSOworCWVsc2UgaWYgKHNxX2Vycl9zdGF0ZSkKKwkJcXAtPmN1cl9zdGF0ZSA9IFFFRF9ST0NFX1FQX1NUQVRFX1NRRTsKKwllbHNlIGlmIChzcV9kcmFpbmluZykKKwkJb3V0X3BhcmFtcy0+ZHJhaW5pbmcgPSB0cnVlOworCW91dF9wYXJhbXMtPnN0YXRlID0gcXAtPmN1cl9zdGF0ZTsKKworCXJldHVybiAwOworCitlcnJfcmVxOgorCWRtYV9mcmVlX2NvaGVyZW50KCZwX2h3Zm4tPmNkZXYtPnBkZXYtPmRldiwgc2l6ZW9mKCpwX3JlcV9yYW1yb2RfcmVzKSwKKwkJCSAgcF9yZXFfcmFtcm9kX3JlcywgcmVxX3JhbXJvZF9yZXNfcGh5cyk7CisJcmV0dXJuIHJjOworZXJyX3Jlc3A6CisJZG1hX2ZyZWVfY29oZXJlbnQoJnBfaHdmbi0+Y2Rldi0+cGRldi0+ZGV2LCBzaXplb2YoKnBfcmVzcF9yYW1yb2RfcmVzKSwKKwkJCSAgcF9yZXNwX3JhbXJvZF9yZXMsIHJlc3BfcmFtcm9kX3Jlc19waHlzKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBxZWRfcm9jZV9kZXN0cm95X3FwKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX3JkbWFfcXAgKnFwKQoreworCXUzMiBudW1faW52YWxpZGF0ZWRfbXcgPSAwOworCXUzMiBudW1fYm91bmRfbXcgPSAwOworCXUzMiBzdGFydF9jaWQ7CisJaW50IHJjOworCisJLyogRGVzdHJveXMgdGhlIHNwZWNpZmllZCBRUCAqLworCWlmICgocXAtPmN1cl9zdGF0ZSAhPSBRRURfUk9DRV9RUF9TVEFURV9SRVNFVCkgJiYKKwkgICAgKHFwLT5jdXJfc3RhdGUgIT0gUUVEX1JPQ0VfUVBfU1RBVEVfRVJSKSAmJgorCSAgICAocXAtPmN1cl9zdGF0ZSAhPSBRRURfUk9DRV9RUF9TVEFURV9JTklUKSkgeworCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJICAiUVAgbXVzdCBiZSBpbiBlcnJvciwgcmVzZXQgb3IgaW5pdCBzdGF0ZSBiZWZvcmUgZGVzdHJveWluZyBpdFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJjID0gcWVkX3JvY2Vfc3BfZGVzdHJveV9xcF9yZXNwb25kZXIocF9od2ZuLCBxcCwgJm51bV9pbnZhbGlkYXRlZF9tdyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKiBTZW5kIGRlc3Ryb3kgcmVxdWVzdGVyIHJhbXJvZCAqLworCXJjID0gcWVkX3JvY2Vfc3BfZGVzdHJveV9xcF9yZXF1ZXN0ZXIocF9od2ZuLCBxcCwgJm51bV9ib3VuZF9tdyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAobnVtX2ludmFsaWRhdGVkX213ICE9IG51bV9ib3VuZF9tdykgeworCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJICAibnVtYmVyIG9mIGludmFsaWRhdGUgbWVtb3J5IHdpbmRvd3MgaXMgZGlmZmVyZW50IGZyb20gYm91bmRlZCBvbmVzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3Bpbl9sb2NrX2JoKCZwX2h3Zm4tPnBfcmRtYV9pbmZvLT5sb2NrKTsKKworCXN0YXJ0X2NpZCA9IHFlZF9jeHRfZ2V0X3Byb3RvX2NpZF9zdGFydChwX2h3Zm4sCisJCQkJCQlwX2h3Zm4tPnBfcmRtYV9pbmZvLT5wcm90byk7CisKKwkvKiBSZWxlYXNlIHJlc3BvbmRlcidzIGljaWQgKi8KKwlxZWRfYm1hcF9yZWxlYXNlX2lkKHBfaHdmbiwgJnBfaHdmbi0+cF9yZG1hX2luZm8tPmNpZF9tYXAsCisJCQkgICAgcXAtPmljaWQgLSBzdGFydF9jaWQpOworCisJLyogUmVsZWFzZSByZXF1ZXN0ZXIncyBpY2lkICovCisJcWVkX2JtYXBfcmVsZWFzZV9pZChwX2h3Zm4sICZwX2h3Zm4tPnBfcmRtYV9pbmZvLT5jaWRfbWFwLAorCQkJICAgIHFwLT5pY2lkICsgMSAtIHN0YXJ0X2NpZCk7CisKKwlzcGluX3VubG9ja19iaCgmcF9od2ZuLT5wX3JkbWFfaW5mby0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHFlZF9yZG1hX3F1ZXJ5X3FwKHZvaWQgKnJkbWFfY3h0LAorCQkgICAgICBzdHJ1Y3QgcWVkX3JkbWFfcXAgKnFwLAorCQkgICAgICBzdHJ1Y3QgcWVkX3JkbWFfcXVlcnlfcXBfb3V0X3BhcmFtcyAqb3V0X3BhcmFtcykKK3sKKwlzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiA9IChzdHJ1Y3QgcWVkX2h3Zm4gKilyZG1hX2N4dDsKKwlpbnQgcmM7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiaWNpZCA9ICUwOHhcbiIsIHFwLT5pY2lkKTsKKworCS8qIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBmaWxsZWQgaW4gZnJvbSBxcCBhbmQgbm90IEZXIGFzIHRoZXkgY2FuJ3QKKwkgKiBiZSBtb2RpZmllZCBieSBGVworCSAqLworCW91dF9wYXJhbXMtPm10dSA9IHFwLT5tdHU7CisJb3V0X3BhcmFtcy0+ZGVzdF9xcCA9IHFwLT5kZXN0X3FwOworCW91dF9wYXJhbXMtPmluY29taW5nX2F0b21pY19lbiA9IHFwLT5pbmNvbWluZ19hdG9taWNfZW47CisJb3V0X3BhcmFtcy0+ZTJlX2Zsb3dfY29udHJvbF9lbiA9IHFwLT5lMmVfZmxvd19jb250cm9sX2VuOworCW91dF9wYXJhbXMtPmluY29taW5nX3JkbWFfcmVhZF9lbiA9IHFwLT5pbmNvbWluZ19yZG1hX3JlYWRfZW47CisJb3V0X3BhcmFtcy0+aW5jb21pbmdfcmRtYV93cml0ZV9lbiA9IHFwLT5pbmNvbWluZ19yZG1hX3dyaXRlX2VuOworCW91dF9wYXJhbXMtPmRnaWQgPSBxcC0+ZGdpZDsKKwlvdXRfcGFyYW1zLT5mbG93X2xhYmVsID0gcXAtPmZsb3dfbGFiZWw7CisJb3V0X3BhcmFtcy0+aG9wX2xpbWl0X3R0bCA9IHFwLT5ob3BfbGltaXRfdHRsOworCW91dF9wYXJhbXMtPnRyYWZmaWNfY2xhc3NfdG9zID0gcXAtPnRyYWZmaWNfY2xhc3NfdG9zOworCW91dF9wYXJhbXMtPnRpbWVvdXQgPSBxcC0+YWNrX3RpbWVvdXQ7CisJb3V0X3BhcmFtcy0+cm5yX3JldHJ5ID0gcXAtPnJucl9yZXRyeV9jbnQ7CisJb3V0X3BhcmFtcy0+cmV0cnlfY250ID0gcXAtPnJldHJ5X2NudDsKKwlvdXRfcGFyYW1zLT5taW5fcm5yX25ha190aW1lciA9IHFwLT5taW5fcm5yX25ha190aW1lcjsKKwlvdXRfcGFyYW1zLT5wa2V5X2luZGV4ID0gMDsKKwlvdXRfcGFyYW1zLT5tYXhfcmRfYXRvbWljID0gcXAtPm1heF9yZF9hdG9taWNfcmVxOworCW91dF9wYXJhbXMtPm1heF9kZXN0X3JkX2F0b21pYyA9IHFwLT5tYXhfcmRfYXRvbWljX3Jlc3A7CisJb3V0X3BhcmFtcy0+c3FkX2FzeW5jID0gcXAtPnNxZF9hc3luYzsKKworCXJjID0gcWVkX3JvY2VfcXVlcnlfcXAocF9od2ZuLCBxcCwgb3V0X3BhcmFtcyk7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiUXVlcnkgUVAsIHJjID0gJWRcbiIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBxZWRfcmRtYV9kZXN0cm95X3FwKHZvaWQgKnJkbWFfY3h0LCBzdHJ1Y3QgcWVkX3JkbWFfcXAgKnFwKQoreworCXN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuID0gKHN0cnVjdCBxZWRfaHdmbiAqKXJkbWFfY3h0OworCWludCByYyA9IDA7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiaWNpZCA9ICUwOHhcbiIsIHFwLT5pY2lkKTsKKworCXJjID0gcWVkX3JvY2VfZGVzdHJveV9xcChwX2h3Zm4sIHFwKTsKKworCS8qIGZyZWUgcXAgcGFyYW1zIHN0cnVjdCAqLworCWtmcmVlKHFwKTsKKworCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJRUCBkZXN0cm95ZWRcbiIpOworCXJldHVybiByYzsKK30KKworc3RydWN0IHFlZF9yZG1hX3FwICoKK3FlZF9yZG1hX2NyZWF0ZV9xcCh2b2lkICpyZG1hX2N4dCwKKwkJICAgc3RydWN0IHFlZF9yZG1hX2NyZWF0ZV9xcF9pbl9wYXJhbXMgKmluX3BhcmFtcywKKwkJICAgc3RydWN0IHFlZF9yZG1hX2NyZWF0ZV9xcF9vdXRfcGFyYW1zICpvdXRfcGFyYW1zKQoreworCXN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuID0gKHN0cnVjdCBxZWRfaHdmbiAqKXJkbWFfY3h0OworCXN0cnVjdCBxZWRfcmRtYV9xcCAqcXA7CisJdTggbWF4X3N0YXRzX3F1ZXVlczsKKwlpbnQgcmM7CisKKwlpZiAoIXJkbWFfY3h0IHx8ICFpbl9wYXJhbXMgfHwgIW91dF9wYXJhbXMgfHwgIXBfaHdmbi0+cF9yZG1hX2luZm8pIHsKKwkJRFBfRVJSKHBfaHdmbi0+Y2RldiwKKwkJICAgICAgICJxZWQgcm9jZSBjcmVhdGUgcXAgZmFpbGVkIGR1ZSB0byBOVUxMIGVudHJ5IChyZG1hX2N4dD0lcCwgaW49JXAsIG91dD0lcCwgcm9jZV9pbmZvPT9cbiIsCisJCSAgICAgICByZG1hX2N4dCwgaW5fcGFyYW1zLCBvdXRfcGFyYW1zKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwKKwkJICAgInFlZCByZG1hIGNyZWF0ZSBxcCBjYWxsZWQgd2l0aCBxcF9oYW5kbGUgPSAlMDh4JTA4eFxuIiwKKwkJICAgaW5fcGFyYW1zLT5xcF9oYW5kbGVfaGksIGluX3BhcmFtcy0+cXBfaGFuZGxlX2xvKTsKKworCS8qIFNvbWUgc2FuaXR5IGNoZWNrcy4uLiAqLworCW1heF9zdGF0c19xdWV1ZXMgPSBwX2h3Zm4tPnBfcmRtYV9pbmZvLT5kZXYtPm1heF9zdGF0c19xdWV1ZXM7CisJaWYgKGluX3BhcmFtcy0+c3RhdHNfcXVldWUgPj0gbWF4X3N0YXRzX3F1ZXVlcykgeworCQlEUF9FUlIocF9od2ZuLT5jZGV2LAorCQkgICAgICAgInFlZCByZG1hIGNyZWF0ZSBxcCBmYWlsZWQgZHVlIHRvIGludmFsaWQgc3RhdGlzdGljcyBxdWV1ZSAlZC4gbWF4aW11bSBpcyAlZFxuIiwKKwkJICAgICAgIGluX3BhcmFtcy0+c3RhdHNfcXVldWUsIG1heF9zdGF0c19xdWV1ZXMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlxcCA9IGt6YWxsb2Moc2l6ZW9mKCpxcCksIEdGUF9LRVJORUwpOworCWlmICghcXApIHsKKwkJRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBxZWRfcmRtYV9xcFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJjID0gcWVkX3JvY2VfYWxsb2NfY2lkKHBfaHdmbiwgJnFwLT5pY2lkKTsKKwlxcC0+cXBpZCA9ICgoMHhGRiA8PCAxNikgfCBxcC0+aWNpZCk7CisKKwlEUF9JTkZPKHBfaHdmbiwgIlJPQ0UgcXBpZD0leFxuIiwgcXAtPnFwaWQpOworCisJaWYgKHJjKSB7CisJCWtmcmVlKHFwKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcXAtPmN1cl9zdGF0ZSA9IFFFRF9ST0NFX1FQX1NUQVRFX1JFU0VUOworCXFwLT5xcF9oYW5kbGUuaGkgPSBjcHVfdG9fbGUzMihpbl9wYXJhbXMtPnFwX2hhbmRsZV9oaSk7CisJcXAtPnFwX2hhbmRsZS5sbyA9IGNwdV90b19sZTMyKGluX3BhcmFtcy0+cXBfaGFuZGxlX2xvKTsKKwlxcC0+cXBfaGFuZGxlX2FzeW5jLmhpID0gY3B1X3RvX2xlMzIoaW5fcGFyYW1zLT5xcF9oYW5kbGVfYXN5bmNfaGkpOworCXFwLT5xcF9oYW5kbGVfYXN5bmMubG8gPSBjcHVfdG9fbGUzMihpbl9wYXJhbXMtPnFwX2hhbmRsZV9hc3luY19sbyk7CisJcXAtPnVzZV9zcnEgPSBpbl9wYXJhbXMtPnVzZV9zcnE7CisJcXAtPnNpZ25hbF9hbGwgPSBpbl9wYXJhbXMtPnNpZ25hbF9hbGw7CisJcXAtPmZtcl9hbmRfcmVzZXJ2ZWRfbGtleSA9IGluX3BhcmFtcy0+Zm1yX2FuZF9yZXNlcnZlZF9sa2V5OworCXFwLT5wZCA9IGluX3BhcmFtcy0+cGQ7CisJcXAtPmRwaSA9IGluX3BhcmFtcy0+ZHBpOworCXFwLT5zcV9jcV9pZCA9IGluX3BhcmFtcy0+c3FfY3FfaWQ7CisJcXAtPnNxX251bV9wYWdlcyA9IGluX3BhcmFtcy0+c3FfbnVtX3BhZ2VzOworCXFwLT5zcV9wYmxfcHRyID0gaW5fcGFyYW1zLT5zcV9wYmxfcHRyOworCXFwLT5ycV9jcV9pZCA9IGluX3BhcmFtcy0+cnFfY3FfaWQ7CisJcXAtPnJxX251bV9wYWdlcyA9IGluX3BhcmFtcy0+cnFfbnVtX3BhZ2VzOworCXFwLT5ycV9wYmxfcHRyID0gaW5fcGFyYW1zLT5ycV9wYmxfcHRyOworCXFwLT5zcnFfaWQgPSBpbl9wYXJhbXMtPnNycV9pZDsKKwlxcC0+cmVxX29mZmxvYWRlZCA9IGZhbHNlOworCXFwLT5yZXNwX29mZmxvYWRlZCA9IGZhbHNlOworCXFwLT5lMmVfZmxvd19jb250cm9sX2VuID0gcXAtPnVzZV9zcnEgPyBmYWxzZSA6IHRydWU7CisJcXAtPnN0YXRzX3F1ZXVlID0gaW5fcGFyYW1zLT5zdGF0c19xdWV1ZTsKKworCW91dF9wYXJhbXMtPmljaWQgPSBxcC0+aWNpZDsKKwlvdXRfcGFyYW1zLT5xcF9pZCA9IHFwLT5xcGlkOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIkNyZWF0ZSBRUCwgcmMgPSAlZFxuIiwgcmMpOworCXJldHVybiBxcDsKK30KKworc3RhdGljIGludCBxZWRfcm9jZV9tb2RpZnlfcXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICAgICBzdHJ1Y3QgcWVkX3JkbWFfcXAgKnFwLAorCQkJICAgICAgZW51bSBxZWRfcm9jZV9xcF9zdGF0ZSBwcmV2X3N0YXRlLAorCQkJICAgICAgc3RydWN0IHFlZF9yZG1hX21vZGlmeV9xcF9pbl9wYXJhbXMgKnBhcmFtcykKK3sKKwl1MzIgbnVtX2ludmFsaWRhdGVkX213ID0gMCwgbnVtX2JvdW5kX213ID0gMDsKKwlpbnQgcmMgPSAwOworCisJLyogUGVyZm9ybSBhZGRpdGlvbmFsIG9wZXJhdGlvbnMgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHN0YXRlIGFuZCB0aGUKKwkgKiBuZXh0IHN0YXRlCisJICovCisJaWYgKCgocHJldl9zdGF0ZSA9PSBRRURfUk9DRV9RUF9TVEFURV9JTklUKSB8fAorCSAgICAgKHByZXZfc3RhdGUgPT0gUUVEX1JPQ0VfUVBfU1RBVEVfUkVTRVQpKSAmJgorCSAgICAocXAtPmN1cl9zdGF0ZSA9PSBRRURfUk9DRV9RUF9TVEFURV9SVFIpKSB7CisJCS8qIEluaXQtPlJUUiBvciBSZXNldC0+UlRSICovCisJCXJjID0gcWVkX3JvY2Vfc3BfY3JlYXRlX3Jlc3BvbmRlcihwX2h3Zm4sIHFwKTsKKwkJcmV0dXJuIHJjOworCX0gZWxzZSBpZiAoKHByZXZfc3RhdGUgPT0gUUVEX1JPQ0VfUVBfU1RBVEVfUlRSKSAmJgorCQkgICAocXAtPmN1cl9zdGF0ZSA9PSBRRURfUk9DRV9RUF9TVEFURV9SVFMpKSB7CisJCS8qIFJUUi0+IFJUUyAqLworCQlyYyA9IHFlZF9yb2NlX3NwX2NyZWF0ZV9yZXF1ZXN0ZXIocF9od2ZuLCBxcCk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQkvKiBTZW5kIG1vZGlmeSByZXNwb25kZXIgcmFtcm9kICovCisJCXJjID0gcWVkX3JvY2Vfc3BfbW9kaWZ5X3Jlc3BvbmRlcihwX2h3Zm4sIHFwLCBmYWxzZSwKKwkJCQkJCSAgcGFyYW1zLT5tb2RpZnlfZmxhZ3MpOworCQlyZXR1cm4gcmM7CisJfSBlbHNlIGlmICgocHJldl9zdGF0ZSA9PSBRRURfUk9DRV9RUF9TVEFURV9SVFMpICYmCisJCSAgIChxcC0+Y3VyX3N0YXRlID09IFFFRF9ST0NFX1FQX1NUQVRFX1JUUykpIHsKKwkJLyogUlRTLT5SVFMgKi8KKwkJcmMgPSBxZWRfcm9jZV9zcF9tb2RpZnlfcmVzcG9uZGVyKHBfaHdmbiwgcXAsIGZhbHNlLAorCQkJCQkJICBwYXJhbXMtPm1vZGlmeV9mbGFncyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQlyYyA9IHFlZF9yb2NlX3NwX21vZGlmeV9yZXF1ZXN0ZXIocF9od2ZuLCBxcCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICBwYXJhbXMtPm1vZGlmeV9mbGFncyk7CisJCXJldHVybiByYzsKKwl9IGVsc2UgaWYgKChwcmV2X3N0YXRlID09IFFFRF9ST0NFX1FQX1NUQVRFX1JUUykgJiYKKwkJICAgKHFwLT5jdXJfc3RhdGUgPT0gUUVEX1JPQ0VfUVBfU1RBVEVfU1FEKSkgeworCQkvKiBSVFMtPlNRRCAqLworCQlyYyA9IHFlZF9yb2NlX3NwX21vZGlmeV9yZXF1ZXN0ZXIocF9od2ZuLCBxcCwgdHJ1ZSwgZmFsc2UsCisJCQkJCQkgIHBhcmFtcy0+bW9kaWZ5X2ZsYWdzKTsKKwkJcmV0dXJuIHJjOworCX0gZWxzZSBpZiAoKHByZXZfc3RhdGUgPT0gUUVEX1JPQ0VfUVBfU1RBVEVfU1FEKSAmJgorCQkgICAocXAtPmN1cl9zdGF0ZSA9PSBRRURfUk9DRV9RUF9TVEFURV9TUUQpKSB7CisJCS8qIFNRRC0+U1FEICovCisJCXJjID0gcWVkX3JvY2Vfc3BfbW9kaWZ5X3Jlc3BvbmRlcihwX2h3Zm4sIHFwLCBmYWxzZSwKKwkJCQkJCSAgcGFyYW1zLT5tb2RpZnlfZmxhZ3MpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJcmMgPSBxZWRfcm9jZV9zcF9tb2RpZnlfcmVxdWVzdGVyKHBfaHdmbiwgcXAsIGZhbHNlLCBmYWxzZSwKKwkJCQkJCSAgcGFyYW1zLT5tb2RpZnlfZmxhZ3MpOworCQlyZXR1cm4gcmM7CisJfSBlbHNlIGlmICgocHJldl9zdGF0ZSA9PSBRRURfUk9DRV9RUF9TVEFURV9TUUQpICYmCisJCSAgIChxcC0+Y3VyX3N0YXRlID09IFFFRF9ST0NFX1FQX1NUQVRFX1JUUykpIHsKKwkJLyogU1FELT5SVFMgKi8KKwkJcmMgPSBxZWRfcm9jZV9zcF9tb2RpZnlfcmVzcG9uZGVyKHBfaHdmbiwgcXAsIGZhbHNlLAorCQkJCQkJICBwYXJhbXMtPm1vZGlmeV9mbGFncyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQlyYyA9IHFlZF9yb2NlX3NwX21vZGlmeV9yZXF1ZXN0ZXIocF9od2ZuLCBxcCwgZmFsc2UsIGZhbHNlLAorCQkJCQkJICBwYXJhbXMtPm1vZGlmeV9mbGFncyk7CisKKwkJcmV0dXJuIHJjOworCX0gZWxzZSBpZiAocXAtPmN1cl9zdGF0ZSA9PSBRRURfUk9DRV9RUF9TVEFURV9FUlIgfHwKKwkJICAgcXAtPmN1cl9zdGF0ZSA9PSBRRURfUk9DRV9RUF9TVEFURV9TUUUpIHsKKwkJLyogLT5FUlIgKi8KKwkJcmMgPSBxZWRfcm9jZV9zcF9tb2RpZnlfcmVzcG9uZGVyKHBfaHdmbiwgcXAsIHRydWUsCisJCQkJCQkgIHBhcmFtcy0+bW9kaWZ5X2ZsYWdzKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCXJjID0gcWVkX3JvY2Vfc3BfbW9kaWZ5X3JlcXVlc3RlcihwX2h3Zm4sIHFwLCBmYWxzZSwgdHJ1ZSwKKwkJCQkJCSAgcGFyYW1zLT5tb2RpZnlfZmxhZ3MpOworCQlyZXR1cm4gcmM7CisJfSBlbHNlIGlmIChxcC0+Y3VyX3N0YXRlID09IFFFRF9ST0NFX1FQX1NUQVRFX1JFU0VUKSB7CisJCS8qIEFueSBzdGF0ZSAtPiBSRVNFVCAqLworCisJCXJjID0gcWVkX3JvY2Vfc3BfZGVzdHJveV9xcF9yZXNwb25kZXIocF9od2ZuLCBxcCwKKwkJCQkJCSAgICAgICZudW1faW52YWxpZGF0ZWRfbXcpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJcmMgPSBxZWRfcm9jZV9zcF9kZXN0cm95X3FwX3JlcXVlc3RlcihwX2h3Zm4sIHFwLAorCQkJCQkJICAgICAgJm51bV9ib3VuZF9tdyk7CisKKwkJaWYgKG51bV9pbnZhbGlkYXRlZF9tdyAhPSBudW1fYm91bmRfbXcpIHsKKwkJCURQX05PVElDRShwX2h3Zm4sCisJCQkJICAibnVtYmVyIG9mIGludmFsaWRhdGUgbWVtb3J5IHdpbmRvd3MgaXMgZGlmZmVyZW50IGZyb20gYm91bmRlZCBvbmVzXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIjBcbiIpOworCX0KKworCXJldHVybiByYzsKK30KKworaW50IHFlZF9yZG1hX21vZGlmeV9xcCh2b2lkICpyZG1hX2N4dCwKKwkJICAgICAgIHN0cnVjdCBxZWRfcmRtYV9xcCAqcXAsCisJCSAgICAgICBzdHJ1Y3QgcWVkX3JkbWFfbW9kaWZ5X3FwX2luX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuID0gKHN0cnVjdCBxZWRfaHdmbiAqKXJkbWFfY3h0OworCWVudW0gcWVkX3JvY2VfcXBfc3RhdGUgcHJldl9zdGF0ZTsKKwlpbnQgcmMgPSAwOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgImljaWQgPSAlMDh4IHBhcmFtcy0+bmV3X3N0YXRlPSVkXG4iLAorCQkgICBxcC0+aWNpZCwgcGFyYW1zLT5uZXdfc3RhdGUpOworCisJaWYgKHJjKSB7CisJCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJyYyA9ICVkXG4iLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlpZiAoR0VUX0ZJRUxEKHBhcmFtcy0+bW9kaWZ5X2ZsYWdzLAorCQkgICAgICBRRURfUkRNQV9NT0RJRllfUVBfVkFMSURfUkRNQV9PUFNfRU4pKSB7CisJCXFwLT5pbmNvbWluZ19yZG1hX3JlYWRfZW4gPSBwYXJhbXMtPmluY29taW5nX3JkbWFfcmVhZF9lbjsKKwkJcXAtPmluY29taW5nX3JkbWFfd3JpdGVfZW4gPSBwYXJhbXMtPmluY29taW5nX3JkbWFfd3JpdGVfZW47CisJCXFwLT5pbmNvbWluZ19hdG9taWNfZW4gPSBwYXJhbXMtPmluY29taW5nX2F0b21pY19lbjsKKwl9CisKKwkvKiBVcGRhdGUgUVAgc3RydWN0dXJlIHdpdGggdGhlIHVwZGF0ZWQgdmFsdWVzICovCisJaWYgKEdFVF9GSUVMRChwYXJhbXMtPm1vZGlmeV9mbGFncywgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX1JPQ0VfTU9ERSkpCisJCXFwLT5yb2NlX21vZGUgPSBwYXJhbXMtPnJvY2VfbW9kZTsKKwlpZiAoR0VUX0ZJRUxEKHBhcmFtcy0+bW9kaWZ5X2ZsYWdzLCBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfUEtFWSkpCisJCXFwLT5wa2V5ID0gcGFyYW1zLT5wa2V5OworCWlmIChHRVRfRklFTEQocGFyYW1zLT5tb2RpZnlfZmxhZ3MsCisJCSAgICAgIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9FMkVfRkxPV19DT05UUk9MX0VOKSkKKwkJcXAtPmUyZV9mbG93X2NvbnRyb2xfZW4gPSBwYXJhbXMtPmUyZV9mbG93X2NvbnRyb2xfZW47CisJaWYgKEdFVF9GSUVMRChwYXJhbXMtPm1vZGlmeV9mbGFncywgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX0RFU1RfUVApKQorCQlxcC0+ZGVzdF9xcCA9IHBhcmFtcy0+ZGVzdF9xcDsKKwlpZiAoR0VUX0ZJRUxEKHBhcmFtcy0+bW9kaWZ5X2ZsYWdzLAorCQkgICAgICBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfQUREUkVTU19WRUNUT1IpKSB7CisJCS8qIEluZGljYXRlcyB0aGF0IHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBoYXZlIGNoYW5nZWQ6CisJCSAqIFRyYWZmaWMgY2xhc3MsIGZsb3cgbGFiZWwsIGhvcCBsaW1pdCwgc291cmNlIEdJRCwKKwkJICogZGVzdGluYXRpb24gR0lELCBsb29wYmFjayBpbmRpY2F0b3IKKwkJICovCisJCXFwLT50cmFmZmljX2NsYXNzX3RvcyA9IHBhcmFtcy0+dHJhZmZpY19jbGFzc190b3M7CisJCXFwLT5mbG93X2xhYmVsID0gcGFyYW1zLT5mbG93X2xhYmVsOworCQlxcC0+aG9wX2xpbWl0X3R0bCA9IHBhcmFtcy0+aG9wX2xpbWl0X3R0bDsKKworCQlxcC0+c2dpZCA9IHBhcmFtcy0+c2dpZDsKKwkJcXAtPmRnaWQgPSBwYXJhbXMtPmRnaWQ7CisJCXFwLT51ZHBfc3JjX3BvcnQgPSAwOworCQlxcC0+dmxhbl9pZCA9IHBhcmFtcy0+dmxhbl9pZDsKKwkJcXAtPm10dSA9IHBhcmFtcy0+bXR1OworCQlxcC0+bGJfaW5kaWNhdGlvbiA9IHBhcmFtcy0+bGJfaW5kaWNhdGlvbjsKKwkJbWVtY3B5KCh1OCAqKSZxcC0+cmVtb3RlX21hY19hZGRyWzBdLAorCQkgICAgICAgKHU4ICopJnBhcmFtcy0+cmVtb3RlX21hY19hZGRyWzBdLCBFVEhfQUxFTik7CisJCWlmIChwYXJhbXMtPnVzZV9sb2NhbF9tYWMpIHsKKwkJCW1lbWNweSgodTggKikmcXAtPmxvY2FsX21hY19hZGRyWzBdLAorCQkJICAgICAgICh1OCAqKSZwYXJhbXMtPmxvY2FsX21hY19hZGRyWzBdLCBFVEhfQUxFTik7CisJCX0gZWxzZSB7CisJCQltZW1jcHkoKHU4ICopJnFwLT5sb2NhbF9tYWNfYWRkclswXSwKKwkJCSAgICAgICAodTggKikmcF9od2ZuLT5od19pbmZvLmh3X21hY19hZGRyLCBFVEhfQUxFTik7CisJCX0KKwl9CisJaWYgKEdFVF9GSUVMRChwYXJhbXMtPm1vZGlmeV9mbGFncywgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX1JRX1BTTikpCisJCXFwLT5ycV9wc24gPSBwYXJhbXMtPnJxX3BzbjsKKwlpZiAoR0VUX0ZJRUxEKHBhcmFtcy0+bW9kaWZ5X2ZsYWdzLCBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfU1FfUFNOKSkKKwkJcXAtPnNxX3BzbiA9IHBhcmFtcy0+c3FfcHNuOworCWlmIChHRVRfRklFTEQocGFyYW1zLT5tb2RpZnlfZmxhZ3MsCisJCSAgICAgIFFFRF9SRE1BX01PRElGWV9RUF9WQUxJRF9NQVhfUkRfQVRPTUlDX1JFUSkpCisJCXFwLT5tYXhfcmRfYXRvbWljX3JlcSA9IHBhcmFtcy0+bWF4X3JkX2F0b21pY19yZXE7CisJaWYgKEdFVF9GSUVMRChwYXJhbXMtPm1vZGlmeV9mbGFncywKKwkJICAgICAgUUVEX1JETUFfTU9ESUZZX1FQX1ZBTElEX01BWF9SRF9BVE9NSUNfUkVTUCkpCisJCXFwLT5tYXhfcmRfYXRvbWljX3Jlc3AgPSBwYXJhbXMtPm1heF9yZF9hdG9taWNfcmVzcDsKKwlpZiAoR0VUX0ZJRUxEKHBhcmFtcy0+bW9kaWZ5X2ZsYWdzLAorCQkgICAgICBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfQUNLX1RJTUVPVVQpKQorCQlxcC0+YWNrX3RpbWVvdXQgPSBwYXJhbXMtPmFja190aW1lb3V0OworCWlmIChHRVRfRklFTEQocGFyYW1zLT5tb2RpZnlfZmxhZ3MsIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9SRVRSWV9DTlQpKQorCQlxcC0+cmV0cnlfY250ID0gcGFyYW1zLT5yZXRyeV9jbnQ7CisJaWYgKEdFVF9GSUVMRChwYXJhbXMtPm1vZGlmeV9mbGFncywKKwkJICAgICAgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX1JOUl9SRVRSWV9DTlQpKQorCQlxcC0+cm5yX3JldHJ5X2NudCA9IHBhcmFtcy0+cm5yX3JldHJ5X2NudDsKKwlpZiAoR0VUX0ZJRUxEKHBhcmFtcy0+bW9kaWZ5X2ZsYWdzLAorCQkgICAgICBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfTUlOX1JOUl9OQUtfVElNRVIpKQorCQlxcC0+bWluX3Jucl9uYWtfdGltZXIgPSBwYXJhbXMtPm1pbl9ybnJfbmFrX3RpbWVyOworCisJcXAtPnNxZF9hc3luYyA9IHBhcmFtcy0+c3FkX2FzeW5jOworCisJcHJldl9zdGF0ZSA9IHFwLT5jdXJfc3RhdGU7CisJaWYgKEdFVF9GSUVMRChwYXJhbXMtPm1vZGlmeV9mbGFncywKKwkJICAgICAgUUVEX1JETUFfTU9ESUZZX1FQX1ZBTElEX05FV19TVEFURSkpIHsKKwkJcXAtPmN1cl9zdGF0ZSA9IHBhcmFtcy0+bmV3X3N0YXRlOworCQlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAicXAtPmN1cl9zdGF0ZT0lZFxuIiwKKwkJCSAgIHFwLT5jdXJfc3RhdGUpOworCX0KKworCXJjID0gcWVkX3JvY2VfbW9kaWZ5X3FwKHBfaHdmbiwgcXAsIHByZXZfc3RhdGUsIHBhcmFtcyk7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiTW9kaWZ5IFFQLCByYyA9ICVkXG4iLCByYyk7CisJcmV0dXJuIHJjOworfQorCitpbnQgcWVkX3JkbWFfcmVnaXN0ZXJfdGlkKHZvaWQgKnJkbWFfY3h0LAorCQkJICBzdHJ1Y3QgcWVkX3JkbWFfcmVnaXN0ZXJfdGlkX2luX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuID0gKHN0cnVjdCBxZWRfaHdmbiAqKXJkbWFfY3h0OworCXN0cnVjdCByZG1hX3JlZ2lzdGVyX3RpZF9yYW1yb2RfZGF0YSAqcF9yYW1yb2Q7CisJc3RydWN0IHFlZF9zcF9pbml0X2RhdGEgaW5pdF9kYXRhOworCXN0cnVjdCBxZWRfc3BxX2VudHJ5ICpwX2VudDsKKwllbnVtIHJkbWFfdGlkX3R5cGUgdGlkX3R5cGU7CisJdTggZndfcmV0dXJuX2NvZGU7CisJaW50IHJjOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIml0aWQgPSAlMDh4XG4iLCBwYXJhbXMtPml0aWQpOworCisJLyogR2V0IFNQUSBlbnRyeSAqLworCW1lbXNldCgmaW5pdF9kYXRhLCAwLCBzaXplb2YoaW5pdF9kYXRhKSk7CisJaW5pdF9kYXRhLm9wYXF1ZV9maWQgPSBwX2h3Zm4tPmh3X2luZm8ub3BhcXVlX2ZpZDsKKwlpbml0X2RhdGEuY29tcF9tb2RlID0gUUVEX1NQUV9NT0RFX0VCTE9DSzsKKworCXJjID0gcWVkX3NwX2luaXRfcmVxdWVzdChwX2h3Zm4sICZwX2VudCwgUkRNQV9SQU1ST0RfUkVHSVNURVJfTVIsCisJCQkJIHBfaHdmbi0+cF9yZG1hX2luZm8tPnByb3RvLCAmaW5pdF9kYXRhKTsKKwlpZiAocmMpIHsKKwkJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgInJjID0gJWRcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWlmIChwX2h3Zm4tPnBfcmRtYV9pbmZvLT5sYXN0X3RpZCA8IHBhcmFtcy0+aXRpZCkKKwkJcF9od2ZuLT5wX3JkbWFfaW5mby0+bGFzdF90aWQgPSBwYXJhbXMtPml0aWQ7CisKKwlwX3JhbXJvZCA9ICZwX2VudC0+cmFtcm9kLnJkbWFfcmVnaXN0ZXJfdGlkOworCisJcF9yYW1yb2QtPmZsYWdzID0gMDsKKwlTRVRfRklFTEQocF9yYW1yb2QtPmZsYWdzLAorCQkgIFJETUFfUkVHSVNURVJfVElEX1JBTVJPRF9EQVRBX1RXT19MRVZFTF9QQkwsCisJCSAgcGFyYW1zLT5wYmxfdHdvX2xldmVsKTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUkRNQV9SRUdJU1RFUl9USURfUkFNUk9EX0RBVEFfWkVST19CQVNFRCwgcGFyYW1zLT56YnZhKTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUkRNQV9SRUdJU1RFUl9USURfUkFNUk9EX0RBVEFfUEhZX01SLCBwYXJhbXMtPnBoeV9tcik7CisKKwkvKiBEb24ndCBpbml0aWFsaXplIEQvQyBmaWVsZCwgYXMgaXQgbWF5IG92ZXJyaWRlIG90aGVyIGJpdHMuICovCisJaWYgKCEocGFyYW1zLT50aWRfdHlwZSA9PSBRRURfUkRNQV9USURfRk1SKSAmJiAhKHBhcmFtcy0+ZG1hX21yKSkKKwkJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJCSAgUkRNQV9SRUdJU1RFUl9USURfUkFNUk9EX0RBVEFfUEFHRV9TSVpFX0xPRywKKwkJCSAgcGFyYW1zLT5wYWdlX3NpemVfbG9nIC0gMTIpOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBSRE1BX1JFR0lTVEVSX1RJRF9SQU1ST0RfREFUQV9NQVhfSUQsCisJCSAgcF9od2ZuLT5wX3JkbWFfaW5mby0+bGFzdF90aWQpOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBSRE1BX1JFR0lTVEVSX1RJRF9SQU1ST0RfREFUQV9SRU1PVEVfUkVBRCwKKwkJICBwYXJhbXMtPnJlbW90ZV9yZWFkKTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUkRNQV9SRUdJU1RFUl9USURfUkFNUk9EX0RBVEFfUkVNT1RFX1dSSVRFLAorCQkgIHBhcmFtcy0+cmVtb3RlX3dyaXRlKTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUkRNQV9SRUdJU1RFUl9USURfUkFNUk9EX0RBVEFfUkVNT1RFX0FUT01JQywKKwkJICBwYXJhbXMtPnJlbW90ZV9hdG9taWMpOworCisJU0VUX0ZJRUxEKHBfcmFtcm9kLT5mbGFncywKKwkJICBSRE1BX1JFR0lTVEVSX1RJRF9SQU1ST0RfREFUQV9MT0NBTF9XUklURSwKKwkJICBwYXJhbXMtPmxvY2FsX3dyaXRlKTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUkRNQV9SRUdJU1RFUl9USURfUkFNUk9EX0RBVEFfTE9DQUxfUkVBRCwgcGFyYW1zLT5sb2NhbF9yZWFkKTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MsCisJCSAgUkRNQV9SRUdJU1RFUl9USURfUkFNUk9EX0RBVEFfRU5BQkxFX01XX0JJTkQsCisJCSAgcGFyYW1zLT5td19iaW5kKTsKKworCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MxLAorCQkgIFJETUFfUkVHSVNURVJfVElEX1JBTVJPRF9EQVRBX1BCTF9QQUdFX1NJWkVfTE9HLAorCQkgIHBhcmFtcy0+cGJsX3BhZ2Vfc2l6ZV9sb2cgLSAxMik7CisKKwlTRVRfRklFTEQocF9yYW1yb2QtPmZsYWdzMiwKKwkJICBSRE1BX1JFR0lTVEVSX1RJRF9SQU1ST0RfREFUQV9ETUFfTVIsIHBhcmFtcy0+ZG1hX21yKTsKKworCXN3aXRjaCAocGFyYW1zLT50aWRfdHlwZSkgeworCWNhc2UgUUVEX1JETUFfVElEX1JFR0lTVEVSRURfTVI6CisJCXRpZF90eXBlID0gUkRNQV9USURfUkVHSVNURVJFRF9NUjsKKwkJYnJlYWs7CisJY2FzZSBRRURfUkRNQV9USURfRk1SOgorCQl0aWRfdHlwZSA9IFJETUFfVElEX0ZNUjsKKwkJYnJlYWs7CisJY2FzZSBRRURfUkRNQV9USURfTVdfVFlQRTE6CisJCXRpZF90eXBlID0gUkRNQV9USURfTVdfVFlQRTE7CisJCWJyZWFrOworCWNhc2UgUUVEX1JETUFfVElEX01XX1RZUEUyQToKKwkJdGlkX3R5cGUgPSBSRE1BX1RJRF9NV19UWVBFMkE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gLUVJTlZBTDsKKwkJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgInJjID0gJWRcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKwlTRVRfRklFTEQocF9yYW1yb2QtPmZsYWdzMSwKKwkJICBSRE1BX1JFR0lTVEVSX1RJRF9SQU1ST0RfREFUQV9USURfVFlQRSwgdGlkX3R5cGUpOworCisJcF9yYW1yb2QtPml0aWQgPSBjcHVfdG9fbGUzMihwYXJhbXMtPml0aWQpOworCXBfcmFtcm9kLT5rZXkgPSBwYXJhbXMtPmtleTsKKwlwX3JhbXJvZC0+cGQgPSBjcHVfdG9fbGUxNihwYXJhbXMtPnBkKTsKKwlwX3JhbXJvZC0+bGVuZ3RoX2hpID0gKHU4KShwYXJhbXMtPmxlbmd0aCA+PiAzMik7CisJcF9yYW1yb2QtPmxlbmd0aF9sbyA9IERNQV9MT19MRShwYXJhbXMtPmxlbmd0aCk7CisJaWYgKHBhcmFtcy0+emJ2YSkgeworCQkvKiBMb3dlciAzMiBiaXRzIG9mIHRoZSByZWdpc3RlcmVkIE1SIGFkZHJlc3MuCisJCSAqIEluIGNhc2Ugb2YgemVybyBiYXNlZCBNUiwgd2lsbCBob2xkIEZCTworCQkgKi8KKwkJcF9yYW1yb2QtPnZhLmhpID0gMDsKKwkJcF9yYW1yb2QtPnZhLmxvID0gY3B1X3RvX2xlMzIocGFyYW1zLT5mYm8pOworCX0gZWxzZSB7CisJCURNQV9SRUdQQUlSX0xFKHBfcmFtcm9kLT52YSwgcGFyYW1zLT52YWRkcik7CisJfQorCURNQV9SRUdQQUlSX0xFKHBfcmFtcm9kLT5wYmxfYmFzZSwgcGFyYW1zLT5wYmxfcHRyKTsKKworCS8qIERJRiAqLworCWlmIChwYXJhbXMtPmRpZl9lbmFibGVkKSB7CisJCVNFVF9GSUVMRChwX3JhbXJvZC0+ZmxhZ3MyLAorCQkJICBSRE1BX1JFR0lTVEVSX1RJRF9SQU1ST0RfREFUQV9ESUZfT05fSE9TVF9GTEcsIDEpOworCQlETUFfUkVHUEFJUl9MRShwX3JhbXJvZC0+ZGlmX2Vycm9yX2FkZHIsCisJCQkgICAgICAgcGFyYW1zLT5kaWZfZXJyb3JfYWRkcik7CisJCURNQV9SRUdQQUlSX0xFKHBfcmFtcm9kLT5kaWZfcnVudF9hZGRyLCBwYXJhbXMtPmRpZl9ydW50X2FkZHIpOworCX0KKworCXJjID0gcWVkX3NwcV9wb3N0KHBfaHdmbiwgcF9lbnQsICZmd19yZXR1cm5fY29kZSk7CisKKwlpZiAoZndfcmV0dXJuX2NvZGUgIT0gUkRNQV9SRVRVUk5fT0spIHsKKwkJRFBfTk9USUNFKHBfaHdmbiwgImZ3X3JldHVybl9jb2RlID0gJWRcbiIsIGZ3X3JldHVybl9jb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIlJlZ2lzdGVyIFRJRCwgcmMgPSAlZFxuIiwgcmMpOworCXJldHVybiByYzsKK30KKworaW50IHFlZF9yZG1hX2RlcmVnaXN0ZXJfdGlkKHZvaWQgKnJkbWFfY3h0LCB1MzIgaXRpZCkKK3sKKwlzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiA9IChzdHJ1Y3QgcWVkX2h3Zm4gKilyZG1hX2N4dDsKKwlzdHJ1Y3QgcmRtYV9kZXJlZ2lzdGVyX3RpZF9yYW1yb2RfZGF0YSAqcF9yYW1yb2Q7CisJc3RydWN0IHFlZF9zcF9pbml0X2RhdGEgaW5pdF9kYXRhOworCXN0cnVjdCBxZWRfc3BxX2VudHJ5ICpwX2VudDsKKwlzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQ7CisJdTggZndfcmV0dXJuX2NvZGU7CisJaW50IHJjOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgIml0aWQgPSAlMDh4XG4iLCBpdGlkKTsKKworCS8qIEdldCBTUFEgZW50cnkgKi8KKwltZW1zZXQoJmluaXRfZGF0YSwgMCwgc2l6ZW9mKGluaXRfZGF0YSkpOworCWluaXRfZGF0YS5vcGFxdWVfZmlkID0gcF9od2ZuLT5od19pbmZvLm9wYXF1ZV9maWQ7CisJaW5pdF9kYXRhLmNvbXBfbW9kZSA9IFFFRF9TUFFfTU9ERV9FQkxPQ0s7CisKKwlyYyA9IHFlZF9zcF9pbml0X3JlcXVlc3QocF9od2ZuLCAmcF9lbnQsIFJETUFfUkFNUk9EX0RFUkVHSVNURVJfTVIsCisJCQkJIHBfaHdmbi0+cF9yZG1hX2luZm8tPnByb3RvLCAmaW5pdF9kYXRhKTsKKwlpZiAocmMpIHsKKwkJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgInJjID0gJWRcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXBfcmFtcm9kID0gJnBfZW50LT5yYW1yb2QucmRtYV9kZXJlZ2lzdGVyX3RpZDsKKwlwX3JhbXJvZC0+aXRpZCA9IGNwdV90b19sZTMyKGl0aWQpOworCisJcmMgPSBxZWRfc3BxX3Bvc3QocF9od2ZuLCBwX2VudCwgJmZ3X3JldHVybl9jb2RlKTsKKwlpZiAocmMpIHsKKwkJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwgInJjID0gJWRcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWlmIChmd19yZXR1cm5fY29kZSA9PSBSRE1BX1JFVFVSTl9ERVJFR0lTVEVSX01SX0JBRF9TVEFURV9FUlIpIHsKKwkJRFBfTk9USUNFKHBfaHdmbiwgImZ3X3JldHVybl9jb2RlID0gJWRcbiIsIGZ3X3JldHVybl9jb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmIChmd19yZXR1cm5fY29kZSA9PSBSRE1BX1JFVFVSTl9OSUdfRFJBSU5fUkVRKSB7CisJCS8qIEJpdCBpbmRpY2F0aW5nIHRoYXQgdGhlIFRJRCBpcyBpbiB1c2UgYW5kIGEgbmlnIGRyYWluIGlzCisJCSAqIHJlcXVpcmVkIGJlZm9yZSBzZW5kaW5nIHRoZSByYW1yb2QgYWdhaW4KKwkJICovCisJCXBfcHR0ID0gcWVkX3B0dF9hY3F1aXJlKHBfaHdmbik7CisJCWlmICghcF9wdHQpIHsKKwkJCXJjID0gLUVCVVNZOworCQkJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwKKwkJCQkgICAiRmFpbGVkIHRvIGFjcXVpcmUgUFRUXG4iKTsKKwkJCXJldHVybiByYzsKKwkJfQorCisJCXJjID0gcWVkX21jcF9kcmFpbihwX2h3Zm4sIHBfcHR0KTsKKwkJaWYgKHJjKSB7CisJCQlxZWRfcHR0X3JlbGVhc2UocF9od2ZuLCBwX3B0dCk7CisJCQlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLAorCQkJCSAgICJEcmFpbiBmYWlsZWRcbiIpOworCQkJcmV0dXJuIHJjOworCQl9CisKKwkJcWVkX3B0dF9yZWxlYXNlKHBfaHdmbiwgcF9wdHQpOworCisJCS8qIFJlc2VuZCB0aGUgcmFtcm9kICovCisJCXJjID0gcWVkX3NwX2luaXRfcmVxdWVzdChwX2h3Zm4sICZwX2VudCwKKwkJCQkJIFJETUFfUkFNUk9EX0RFUkVHSVNURVJfTVIsCisJCQkJCSBwX2h3Zm4tPnBfcmRtYV9pbmZvLT5wcm90bywKKwkJCQkJICZpbml0X2RhdGEpOworCQlpZiAocmMpIHsKKwkJCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsCisJCQkJICAgIkZhaWxlZCB0byBpbml0IHNwLWVsZW1lbnRcbiIpOworCQkJcmV0dXJuIHJjOworCQl9CisKKwkJcmMgPSBxZWRfc3BxX3Bvc3QocF9od2ZuLCBwX2VudCwgJmZ3X3JldHVybl9jb2RlKTsKKwkJaWYgKHJjKSB7CisJCQlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLAorCQkJCSAgICJSYW1yb2QgZmFpbGVkXG4iKTsKKwkJCXJldHVybiByYzsKKwkJfQorCisJCWlmIChmd19yZXR1cm5fY29kZSAhPSBSRE1BX1JFVFVSTl9PSykgeworCQkJRFBfTk9USUNFKHBfaHdmbiwgImZ3X3JldHVybl9jb2RlID0gJWRcbiIsCisJCQkJICBmd19yZXR1cm5fY29kZSk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiRGUtcmVnaXN0ZXJlZCBUSUQsIHJjID0gJWRcbiIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkICpxZWRfcmRtYV9nZXRfcmRtYV9jdHgoc3RydWN0IHFlZF9kZXYgKmNkZXYpCit7CisJcmV0dXJuIFFFRF9MRUFESU5HX0hXRk4oY2Rldik7Cit9CisKK3N0YXRpYyB2b2lkIHFlZF9yZG1hX2RwbV9jb25mKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCit7CisJdTMyIHZhbDsKKworCXZhbCA9IChwX2h3Zm4tPmRjYnhfbm9fZWRwbSB8fCBwX2h3Zm4tPmRiX2Jhcl9ub19lZHBtKSA/IDAgOiAxOworCisJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIERPUlFfUkVHX1BGX0RQTV9FTkFCTEUsIHZhbCk7CisJRFBfVkVSQk9TRShwX2h3Zm4sIChRRURfTVNHX0RDQiB8IFFFRF9NU0dfUkRNQSksCisJCSAgICJDaGFuZ2luZyBEUE1fRU4gc3RhdGUgdG8gJWQgKERDQlg9JWQsIERCX0JBUj0lZClcbiIsCisJCSAgIHZhbCwgcF9od2ZuLT5kY2J4X25vX2VkcG0sIHBfaHdmbi0+ZGJfYmFyX25vX2VkcG0pOworfQorCit2b2lkIHFlZF9yZG1hX2RwbV9iYXIoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKK3sKKwlwX2h3Zm4tPmRiX2Jhcl9ub19lZHBtID0gdHJ1ZTsKKworCXFlZF9yZG1hX2RwbV9jb25mKHBfaHdmbiwgcF9wdHQpOworfQorCitpbnQgcWVkX3JkbWFfc3RhcnQodm9pZCAqcmRtYV9jeHQsIHN0cnVjdCBxZWRfcmRtYV9zdGFydF9pbl9wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiA9IChzdHJ1Y3QgcWVkX2h3Zm4gKilyZG1hX2N4dDsKKwlzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQ7CisJaW50IHJjID0gLUVCVVNZOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfUkRNQSwKKwkJICAgImRlc2lyZWRfY25xID0gJTA4eFxuIiwgcGFyYW1zLT5kZXNpcmVkX2NucSk7CisKKwlwX3B0dCA9IHFlZF9wdHRfYWNxdWlyZShwX2h3Zm4pOworCWlmICghcF9wdHQpCisJCWdvdG8gZXJyOworCisJcmMgPSBxZWRfcmRtYV9hbGxvYyhwX2h3Zm4sIHBfcHR0LCBwYXJhbXMpOworCWlmIChyYykKKwkJZ290byBlcnIxOworCisJcmMgPSBxZWRfcmRtYV9zZXR1cChwX2h3Zm4sIHBfcHR0LCBwYXJhbXMpOworCWlmIChyYykKKwkJZ290byBlcnIyOworCisJcWVkX3B0dF9yZWxlYXNlKHBfaHdmbiwgcF9wdHQpOworCisJcmV0dXJuIHJjOworCitlcnIyOgorCXFlZF9yZG1hX2ZyZWUocF9od2ZuKTsKK2VycjE6CisJcWVkX3B0dF9yZWxlYXNlKHBfaHdmbiwgcF9wdHQpOworZXJyOgorCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1JETUEsICJSRE1BIHN0YXJ0IC0gZXJyb3IsIHJjID0gJWRcbiIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcWVkX3JkbWFfaW5pdChzdHJ1Y3QgcWVkX2RldiAqY2RldiwKKwkJCSBzdHJ1Y3QgcWVkX3JkbWFfc3RhcnRfaW5fcGFyYW1zICpwYXJhbXMpCit7CisJcmV0dXJuIHFlZF9yZG1hX3N0YXJ0KFFFRF9MRUFESU5HX0hXRk4oY2RldiksIHBhcmFtcyk7Cit9CisKK3ZvaWQgcWVkX3JkbWFfcmVtb3ZlX3VzZXIodm9pZCAqcmRtYV9jeHQsIHUxNiBkcGkpCit7CisJc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4gPSAoc3RydWN0IHFlZF9od2ZuICopcmRtYV9jeHQ7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19SRE1BLCAiZHBpID0gJTA4eFxuIiwgZHBpKTsKKworCXNwaW5fbG9ja19iaCgmcF9od2ZuLT5wX3JkbWFfaW5mby0+bG9jayk7CisJcWVkX2JtYXBfcmVsZWFzZV9pZChwX2h3Zm4sICZwX2h3Zm4tPnBfcmRtYV9pbmZvLT5kcGlfbWFwLCBkcGkpOworCXNwaW5fdW5sb2NrX2JoKCZwX2h3Zm4tPnBfcmRtYV9pbmZvLT5sb2NrKTsKK30KKwordm9pZCBxZWRfbGwyYl9jb21wbGV0ZV90eF9nc2lfcGFja2V0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICAgdTggY29ubmVjdGlvbl9oYW5kbGUsCisJCQkJICAgICB2b2lkICpjb29raWUsCisJCQkJICAgICBkbWFfYWRkcl90IGZpcnN0X2ZyYWdfYWRkciwKKwkJCQkgICAgIGJvb2wgYl9sYXN0X2ZyYWdtZW50LCBib29sIGJfbGFzdF9wYWNrZXQpCit7CisJc3RydWN0IHFlZF9yb2NlX2xsMl9wYWNrZXQgKnBhY2tldCA9IGNvb2tpZTsKKwlzdHJ1Y3QgcWVkX3JvY2VfbGwyX2luZm8gKnJvY2VfbGwyID0gcF9od2ZuLT5sbDI7CisKKwlyb2NlX2xsMi0+Y2JzLnR4X2NiKHJvY2VfbGwyLT5jYl9jb29raWUsIHBhY2tldCk7Cit9CisKK3ZvaWQgcWVkX2xsMmJfcmVsZWFzZV90eF9nc2lfcGFja2V0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICB1OCBjb25uZWN0aW9uX2hhbmRsZSwKKwkJCQkgICAgdm9pZCAqY29va2llLAorCQkJCSAgICBkbWFfYWRkcl90IGZpcnN0X2ZyYWdfYWRkciwKKwkJCQkgICAgYm9vbCBiX2xhc3RfZnJhZ21lbnQsIGJvb2wgYl9sYXN0X3BhY2tldCkKK3sKKwlxZWRfbGwyYl9jb21wbGV0ZV90eF9nc2lfcGFja2V0KHBfaHdmbiwgY29ubmVjdGlvbl9oYW5kbGUsCisJCQkJCWNvb2tpZSwgZmlyc3RfZnJhZ19hZGRyLAorCQkJCQliX2xhc3RfZnJhZ21lbnQsIGJfbGFzdF9wYWNrZXQpOworfQorCit2b2lkIHFlZF9sbDJiX2NvbXBsZXRlX3J4X2dzaV9wYWNrZXQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgICB1OCBjb25uZWN0aW9uX2hhbmRsZSwKKwkJCQkgICAgIHZvaWQgKmNvb2tpZSwKKwkJCQkgICAgIGRtYV9hZGRyX3QgcnhfYnVmX2FkZHIsCisJCQkJICAgICB1MTYgZGF0YV9sZW5ndGgsCisJCQkJICAgICB1OCBkYXRhX2xlbmd0aF9lcnJvciwKKwkJCQkgICAgIHUxNiBwYXJzZV9mbGFncywKKwkJCQkgICAgIHUxNiB2bGFuLAorCQkJCSAgICAgdTMyIHNyY19tYWNfYWRkcl9oaSwKKwkJCQkgICAgIHUxNiBzcmNfbWFjX2FkZHJfbG8sIGJvb2wgYl9sYXN0X3BhY2tldCkKK3sKKwlzdHJ1Y3QgcWVkX3JvY2VfbGwyX2luZm8gKnJvY2VfbGwyID0gcF9od2ZuLT5sbDI7CisJc3RydWN0IHFlZF9yb2NlX2xsMl9yeF9wYXJhbXMgcGFyYW1zOworCXN0cnVjdCBxZWRfZGV2ICpjZGV2ID0gcF9od2ZuLT5jZGV2OworCXN0cnVjdCBxZWRfcm9jZV9sbDJfcGFja2V0IHBrdDsKKworCURQX1ZFUkJPU0UoY2RldiwKKwkJICAgUUVEX01TR19MTDIsCisJCSAgICJyb2NlIGxsMiByeCBjb21wbGV0ZTogYnVzX2FkZHI9JXAsIGxlbj0lZCwgZGF0YV9sZW5fZXJyPSVkXG4iLAorCQkgICAodm9pZCAqKSh1aW50cHRyX3QpcnhfYnVmX2FkZHIsCisJCSAgIGRhdGFfbGVuZ3RoLCBkYXRhX2xlbmd0aF9lcnJvcik7CisKKwltZW1zZXQoJnBrdCwgMCwgc2l6ZW9mKHBrdCkpOworCXBrdC5uX3NlZyA9IDE7CisJcGt0LnBheWxvYWRbMF0uYmFkZHIgPSByeF9idWZfYWRkcjsKKwlwa3QucGF5bG9hZFswXS5sZW4gPSBkYXRhX2xlbmd0aDsKKworCW1lbXNldCgmcGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7CisJcGFyYW1zLnZsYW5faWQgPSB2bGFuOworCSooKHUzMiAqKSZwYXJhbXMuc21hY1swXSkgPSBudG9obChzcmNfbWFjX2FkZHJfaGkpOworCSooKHUxNiAqKSZwYXJhbXMuc21hY1s0XSkgPSBudG9ocyhzcmNfbWFjX2FkZHJfbG8pOworCisJaWYgKGRhdGFfbGVuZ3RoX2Vycm9yKSB7CisJCURQX0VSUihjZGV2LAorCQkgICAgICAgInJvY2UgbGwyIHJ4IGNvbXBsZXRlOiBkYXRhIGxlbmd0aCBlcnJvciAlZCwgbGVuZ3RoPSVkXG4iLAorCQkgICAgICAgZGF0YV9sZW5ndGhfZXJyb3IsIGRhdGFfbGVuZ3RoKTsKKwkJcGFyYW1zLnJjID0gLUVJTlZBTDsKKwl9CisKKwlyb2NlX2xsMi0+Y2JzLnJ4X2NiKHJvY2VfbGwyLT5jYl9jb29raWUsICZwa3QsICZwYXJhbXMpOworfQorCitzdGF0aWMgaW50IHFlZF9yb2NlX2xsMl9zZXRfbWFjX2ZpbHRlcihzdHJ1Y3QgcWVkX2RldiAqY2RldiwKKwkJCQkgICAgICAgdTggKm9sZF9tYWNfYWRkcmVzcywKKwkJCQkgICAgICAgdTggKm5ld19tYWNfYWRkcmVzcykKK3sKKwlzdHJ1Y3QgcWVkX2h3Zm4gKmh3Zm4gPSBRRURfTEVBRElOR19IV0ZOKGNkZXYpOworCXN0cnVjdCBxZWRfcHR0ICpwX3B0dDsKKwlpbnQgcmMgPSAwOworCisJaWYgKCFod2ZuLT5sbDIgfHwgaHdmbi0+bGwyLT5oYW5kbGUgPT0gUUVEX0xMMl9VTlVTRURfSEFORExFKSB7CisJCURQX0VSUihjZGV2LAorCQkgICAgICAgInFlZCByb2NlIG1hYyBmaWx0ZXIgZmFpbGVkIC0gcm9jZV9pbmZvL2xsMiBOVUxMXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcF9wdHQgPSBxZWRfcHR0X2FjcXVpcmUoUUVEX0xFQURJTkdfSFdGTihjZGV2KSk7CisJaWYgKCFwX3B0dCkgeworCQlEUF9FUlIoY2RldiwKKwkJICAgICAgICJxZWQgcm9jZSBsbDIgbWFjIGZpbHRlciBzZXQ6IGZhaWxlZCB0byBhY3F1aXJlIFBUVFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW11dGV4X2xvY2soJmh3Zm4tPmxsMi0+bG9jayk7CisJaWYgKG9sZF9tYWNfYWRkcmVzcykKKwkJcWVkX2xsaF9yZW1vdmVfbWFjX2ZpbHRlcihRRURfTEVBRElOR19IV0ZOKGNkZXYpLCBwX3B0dCwKKwkJCQkJICBvbGRfbWFjX2FkZHJlc3MpOworCWlmIChuZXdfbWFjX2FkZHJlc3MpCisJCXJjID0gcWVkX2xsaF9hZGRfbWFjX2ZpbHRlcihRRURfTEVBRElOR19IV0ZOKGNkZXYpLCBwX3B0dCwKKwkJCQkJICAgIG5ld19tYWNfYWRkcmVzcyk7CisJbXV0ZXhfdW5sb2NrKCZod2ZuLT5sbDItPmxvY2spOworCisJcWVkX3B0dF9yZWxlYXNlKFFFRF9MRUFESU5HX0hXRk4oY2RldiksIHBfcHR0KTsKKworCWlmIChyYykKKwkJRFBfRVJSKGNkZXYsCisJCSAgICAgICAicWVkIHJvY2UgbGwyIG1hYyBmaWx0ZXIgc2V0OiBmYWlsZWQgdG8gYWRkIG1hYyBmaWx0ZXJcbiIpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHFlZF9yb2NlX2xsMl9zdGFydChzdHJ1Y3QgcWVkX2RldiAqY2RldiwKKwkJCSAgICAgIHN0cnVjdCBxZWRfcm9jZV9sbDJfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHFlZF9od2ZuICpod2ZuID0gUUVEX0xFQURJTkdfSFdGTihjZGV2KTsKKwlzdHJ1Y3QgcWVkX3JvY2VfbGwyX2luZm8gKnJvY2VfbGwyOworCXN0cnVjdCBxZWRfbGwyX2luZm8gbGwyX3BhcmFtczsKKwlpbnQgcmM7CisKKwlpZiAoIXBhcmFtcykgeworCQlEUF9FUlIoY2RldiwgInFlZCByb2NlIGxsMiBzdGFydDogZmFpbGVkIGR1ZSB0byBOVUxMIHBhcmFtc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoIXBhcmFtcy0+Y2JzLnR4X2NiIHx8ICFwYXJhbXMtPmNicy5yeF9jYikgeworCQlEUF9FUlIoY2RldiwKKwkJICAgICAgICJxZWQgcm9jZSBsbDIgc3RhcnQ6IGZhaWxlZCBkdWUgdG8gTlVMTCB0eC9yeC4gdHhfY2I9JXAsIHJ4X2NiPSVwXG4iLAorCQkgICAgICAgcGFyYW1zLT5jYnMudHhfY2IsIHBhcmFtcy0+Y2JzLnJ4X2NiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihwYXJhbXMtPm1hY19hZGRyZXNzKSkgeworCQlEUF9FUlIoY2RldiwKKwkJICAgICAgICJxZWQgcm9jZSBsbDIgc3RhcnQ6IGZhaWxlZCBkdWUgdG8gaW52YWxpZCBFdGhlcm5ldCBhZGRyZXNzICVwTVxuIiwKKwkJICAgICAgIHBhcmFtcy0+bWFjX2FkZHJlc3MpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBJbml0aWFsaXplICovCisJcm9jZV9sbDIgPSBremFsbG9jKHNpemVvZigqcm9jZV9sbDIpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXJvY2VfbGwyKSB7CisJCURQX0VSUihjZGV2LCAicWVkIHJvY2UgbGwyIHN0YXJ0OiBmYWlsZWQgbWVtb3J5IGFsbG9jYXRpb25cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KHJvY2VfbGwyLCAwLCBzaXplb2YoKnJvY2VfbGwyKSk7CisJcm9jZV9sbDItPmhhbmRsZSA9IFFFRF9MTDJfVU5VU0VEX0hBTkRMRTsKKwlyb2NlX2xsMi0+Y2JzID0gcGFyYW1zLT5jYnM7CisJcm9jZV9sbDItPmNiX2Nvb2tpZSA9IHBhcmFtcy0+Y2JfY29va2llOworCW11dGV4X2luaXQoJnJvY2VfbGwyLT5sb2NrKTsKKworCW1lbXNldCgmbGwyX3BhcmFtcywgMCwgc2l6ZW9mKGxsMl9wYXJhbXMpKTsKKwlsbDJfcGFyYW1zLmNvbm5fdHlwZSA9IFFFRF9MTDJfVFlQRV9ST0NFOworCWxsMl9wYXJhbXMubXR1ID0gcGFyYW1zLT5tdHU7CisJbGwyX3BhcmFtcy5yeF9kcm9wX3R0bDBfZmxnID0gdHJ1ZTsKKwlsbDJfcGFyYW1zLnJ4X3ZsYW5fcmVtb3ZhbF9lbiA9IGZhbHNlOworCWxsMl9wYXJhbXMudHhfZGVzdCA9IENPUkVfVFhfREVTVF9OVzsKKwlsbDJfcGFyYW1zLmFpX2Vycl9wYWNrZXRfdG9vX2JpZyA9IExMMl9EUk9QX1BBQ0tFVDsKKwlsbDJfcGFyYW1zLmFpX2Vycl9ub19idWYgPSBMTDJfRFJPUF9QQUNLRVQ7CisJbGwyX3BhcmFtcy5nc2lfZW5hYmxlID0gdHJ1ZTsKKworCXJjID0gcWVkX2xsMl9hY3F1aXJlX2Nvbm5lY3Rpb24oUUVEX0xFQURJTkdfSFdGTihjZGV2KSwgJmxsMl9wYXJhbXMsCisJCQkJCXBhcmFtcy0+bWF4X3J4X2J1ZmZlcnMsCisJCQkJCXBhcmFtcy0+bWF4X3R4X2J1ZmZlcnMsCisJCQkJCSZyb2NlX2xsMi0+aGFuZGxlKTsKKwlpZiAocmMpIHsKKwkJRFBfRVJSKGNkZXYsCisJCSAgICAgICAicWVkIHJvY2UgbGwyIHN0YXJ0OiBmYWlsZWQgdG8gYWNxdWlyZSBMTDIgY29ubmVjdGlvbiAocmM9JWQpXG4iLAorCQkgICAgICAgcmMpOworCQlnb3RvIGVycjsKKwl9CisKKwlyYyA9IHFlZF9sbDJfZXN0YWJsaXNoX2Nvbm5lY3Rpb24oUUVEX0xFQURJTkdfSFdGTihjZGV2KSwKKwkJCQkJICByb2NlX2xsMi0+aGFuZGxlKTsKKwlpZiAocmMpIHsKKwkJRFBfRVJSKGNkZXYsCisJCSAgICAgICAicWVkIHJvY2UgbGwyIHN0YXJ0OiBmYWlsZWQgdG8gZXN0YWJsaXNoIExMMiBjb25uZWN0aW9uIChyYz0lZClcbiIsCisJCSAgICAgICByYyk7CisJCWdvdG8gZXJyMTsKKwl9CisKKwlod2ZuLT5sbDIgPSByb2NlX2xsMjsKKworCXJjID0gcWVkX3JvY2VfbGwyX3NldF9tYWNfZmlsdGVyKGNkZXYsIE5VTEwsIHBhcmFtcy0+bWFjX2FkZHJlc3MpOworCWlmIChyYykgeworCQlod2ZuLT5sbDIgPSBOVUxMOworCQlnb3RvIGVycjI7CisJfQorCWV0aGVyX2FkZHJfY29weShyb2NlX2xsMi0+bWFjX2FkZHJlc3MsIHBhcmFtcy0+bWFjX2FkZHJlc3MpOworCisJcmV0dXJuIDA7CisKK2VycjI6CisJcWVkX2xsMl90ZXJtaW5hdGVfY29ubmVjdGlvbihRRURfTEVBRElOR19IV0ZOKGNkZXYpLCByb2NlX2xsMi0+aGFuZGxlKTsKK2VycjE6CisJcWVkX2xsMl9yZWxlYXNlX2Nvbm5lY3Rpb24oUUVEX0xFQURJTkdfSFdGTihjZGV2KSwgcm9jZV9sbDItPmhhbmRsZSk7CitlcnI6CisJa2ZyZWUocm9jZV9sbDIpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBxZWRfcm9jZV9sbDJfc3RvcChzdHJ1Y3QgcWVkX2RldiAqY2RldikKK3sKKwlzdHJ1Y3QgcWVkX2h3Zm4gKmh3Zm4gPSBRRURfTEVBRElOR19IV0ZOKGNkZXYpOworCXN0cnVjdCBxZWRfcm9jZV9sbDJfaW5mbyAqcm9jZV9sbDIgPSBod2ZuLT5sbDI7CisJaW50IHJjOworCisJaWYgKCFjZGV2KSB7CisJCURQX0VSUihjZGV2LCAicWVkIHJvY2UgbGwyIHN0b3A6IGludmFsaWQgY2RldlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChyb2NlX2xsMi0+aGFuZGxlID09IFFFRF9MTDJfVU5VU0VEX0hBTkRMRSkgeworCQlEUF9FUlIoY2RldiwgInFlZCByb2NlIGxsMiBzdG9wOiBjYW5ub3Qgc3RvcCBhbiB1bnVzZWQgTEwyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogcmVtb3ZlIExMMiBNQUMgYWRkcmVzcyBmaWx0ZXIgKi8KKwlyYyA9IHFlZF9yb2NlX2xsMl9zZXRfbWFjX2ZpbHRlcihjZGV2LCByb2NlX2xsMi0+bWFjX2FkZHJlc3MsIE5VTEwpOworCWV0aF96ZXJvX2FkZHIocm9jZV9sbDItPm1hY19hZGRyZXNzKTsKKworCXJjID0gcWVkX2xsMl90ZXJtaW5hdGVfY29ubmVjdGlvbihRRURfTEVBRElOR19IV0ZOKGNkZXYpLAorCQkJCQkgIHJvY2VfbGwyLT5oYW5kbGUpOworCWlmIChyYykKKwkJRFBfRVJSKGNkZXYsCisJCSAgICAgICAicWVkIHJvY2UgbGwyIHN0b3A6IGZhaWxlZCB0byB0ZXJtaW5hdGUgTEwyIGNvbm5lY3Rpb24gKHJjPSVkKVxuIiwKKwkJICAgICAgIHJjKTsKKworCXFlZF9sbDJfcmVsZWFzZV9jb25uZWN0aW9uKFFFRF9MRUFESU5HX0hXRk4oY2RldiksIHJvY2VfbGwyLT5oYW5kbGUpOworCisJcm9jZV9sbDItPmhhbmRsZSA9IFFFRF9MTDJfVU5VU0VEX0hBTkRMRTsKKworCWtmcmVlKHJvY2VfbGwyKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBxZWRfcm9jZV9sbDJfdHgoc3RydWN0IHFlZF9kZXYgKmNkZXYsCisJCQkgICBzdHJ1Y3QgcWVkX3JvY2VfbGwyX3BhY2tldCAqcGt0LAorCQkJICAgc3RydWN0IHFlZF9yb2NlX2xsMl90eF9wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgcWVkX2h3Zm4gKmh3Zm4gPSBRRURfTEVBRElOR19IV0ZOKGNkZXYpOworCXN0cnVjdCBxZWRfcm9jZV9sbDJfaW5mbyAqcm9jZV9sbDIgPSBod2ZuLT5sbDI7CisJZW51bSBxZWRfbGwyX3JvY2VfZmxhdm9yX3R5cGUgcWVkX3JvY2VfZmxhdm9yOworCXU4IGZsYWdzID0gMDsKKwlpbnQgcmM7CisJaW50IGk7CisKKwlpZiAoIWNkZXYgfHwgIXBrdCB8fCAhcGFyYW1zKSB7CisJCURQX0VSUihjZGV2LAorCQkgICAgICAgInJvY2UgbGwyIHR4OiBmYWlsZWQgdHggYmVjYXVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyBOVUxMIC0gZHJ2PSVwLCBwa3Q9JXAsIHBhcmFtcz0lcFxuIiwKKwkJICAgICAgIGNkZXYsIHBrdCwgcGFyYW1zKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcWVkX3JvY2VfZmxhdm9yID0gKHBrdC0+cm9jZV9tb2RlID09IFJPQ0VfVjEpID8gUUVEX0xMMl9ST0NFCisJCQkJCQkgICAgICA6IFFFRF9MTDJfUlJPQ0U7CisKKwlpZiAocGt0LT5yb2NlX21vZGUgPT0gUk9DRV9WMl9JUFY0KQorCQlmbGFncyB8PSBCSVQoQ09SRV9UWF9CRF9GTEFHU19JUF9DU1VNX1NISUZUKTsKKworCS8qIFR4IGhlYWRlciAqLworCXJjID0gcWVkX2xsMl9wcmVwYXJlX3R4X3BhY2tldChRRURfTEVBRElOR19IV0ZOKGNkZXYpLCByb2NlX2xsMi0+aGFuZGxlLAorCQkJCSAgICAgICAxICsgcGt0LT5uX3NlZywgMCwgZmxhZ3MsIDAsCisJCQkJICAgICAgIHFlZF9yb2NlX2ZsYXZvciwgcGt0LT5oZWFkZXIuYmFkZHIsCisJCQkJICAgICAgIHBrdC0+aGVhZGVyLmxlbiwgcGt0LCAxKTsKKwlpZiAocmMpIHsKKwkJRFBfRVJSKGNkZXYsICJyb2NlIGxsMiB0eDogaGVhZGVyIGZhaWxlZCAocmM9JWQpXG4iLCByYyk7CisJCXJldHVybiBRRURfUk9DRV9UWF9IRUFEX0ZBSUxVUkU7CisJfQorCisJLyogVHggcGF5bG9hZCAqLworCWZvciAoaSA9IDA7IGkgPCBwa3QtPm5fc2VnOyBpKyspIHsKKwkJcmMgPSBxZWRfbGwyX3NldF9mcmFnbWVudF9vZl90eF9wYWNrZXQoUUVEX0xFQURJTkdfSFdGTihjZGV2KSwKKwkJCQkJCSAgICAgICByb2NlX2xsMi0+aGFuZGxlLAorCQkJCQkJICAgICAgIHBrdC0+cGF5bG9hZFtpXS5iYWRkciwKKwkJCQkJCSAgICAgICBwa3QtPnBheWxvYWRbaV0ubGVuKTsKKwkJaWYgKHJjKSB7CisJCQkvKiBJZiBmYWlsZWQgbm90IG11Y2ggdG8gZG8gaGVyZSwgcGFydGlhbCBwYWNrZXQgaGFzCisJCQkgKiBiZWVuIHBvc3RlZCAqIHdlIGNhbid0IGZyZWUgbWVtb3J5LCB3aWxsIG5lZWQgdG8gd2FpdAorCQkJICogZm9yIGNvbXBsZXRpb24KKwkJCSAqLworCQkJRFBfRVJSKGNkZXYsCisJCQkgICAgICAgInJvY2UgbGwyIHR4OiBwYXlsb2FkIGZhaWxlZCAocmM9JWQpXG4iLCByYyk7CisJCQlyZXR1cm4gUUVEX1JPQ0VfVFhfRlJBR19GQUlMVVJFOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcWVkX3JvY2VfbGwyX3Bvc3RfcnhfYnVmZmVyKHN0cnVjdCBxZWRfZGV2ICpjZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgcWVkX3JvY2VfbGwyX2J1ZmZlciAqYnVmLAorCQkJCSAgICAgICB1NjQgY29va2llLCB1OCBub3RpZnlfZncpCit7CisJcmV0dXJuIHFlZF9sbDJfcG9zdF9yeF9idWZmZXIoUUVEX0xFQURJTkdfSFdGTihjZGV2KSwKKwkJCQkgICAgICBRRURfTEVBRElOR19IV0ZOKGNkZXYpLT5sbDItPmhhbmRsZSwKKwkJCQkgICAgICBidWYtPmJhZGRyLCBidWYtPmxlbiwKKwkJCQkgICAgICAodm9pZCAqKSh1aW50cHRyX3QpY29va2llLCBub3RpZnlfZncpOworfQorCitzdGF0aWMgaW50IHFlZF9yb2NlX2xsMl9zdGF0cyhzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgc3RydWN0IHFlZF9sbDJfc3RhdHMgKnN0YXRzKQoreworCXN0cnVjdCBxZWRfaHdmbiAqaHdmbiA9IFFFRF9MRUFESU5HX0hXRk4oY2Rldik7CisJc3RydWN0IHFlZF9yb2NlX2xsMl9pbmZvICpyb2NlX2xsMiA9IGh3Zm4tPmxsMjsKKworCXJldHVybiBxZWRfbGwyX2dldF9zdGF0cyhRRURfTEVBRElOR19IV0ZOKGNkZXYpLAorCQkJCSByb2NlX2xsMi0+aGFuZGxlLCBzdGF0cyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcWVkX3JkbWFfb3BzIHFlZF9yZG1hX29wc19wYXNzID0geworCS5jb21tb24gPSAmcWVkX2NvbW1vbl9vcHNfcGFzcywKKwkuZmlsbF9kZXZfaW5mbyA9ICZxZWRfZmlsbF9yZG1hX2Rldl9pbmZvLAorCS5yZG1hX2dldF9yZG1hX2N0eCA9ICZxZWRfcmRtYV9nZXRfcmRtYV9jdHgsCisJLnJkbWFfaW5pdCA9ICZxZWRfcmRtYV9pbml0LAorCS5yZG1hX2FkZF91c2VyID0gJnFlZF9yZG1hX2FkZF91c2VyLAorCS5yZG1hX3JlbW92ZV91c2VyID0gJnFlZF9yZG1hX3JlbW92ZV91c2VyLAorCS5yZG1hX3N0b3AgPSAmcWVkX3JkbWFfc3RvcCwKKwkucmRtYV9xdWVyeV9wb3J0ID0gJnFlZF9yZG1hX3F1ZXJ5X3BvcnQsCisJLnJkbWFfcXVlcnlfZGV2aWNlID0gJnFlZF9yZG1hX3F1ZXJ5X2RldmljZSwKKwkucmRtYV9nZXRfc3RhcnRfc2IgPSAmcWVkX3JkbWFfZ2V0X3NiX3N0YXJ0LAorCS5yZG1hX2dldF9yZG1hX2ludCA9ICZxZWRfcmRtYV9nZXRfaW50LAorCS5yZG1hX3NldF9yZG1hX2ludCA9ICZxZWRfcmRtYV9zZXRfaW50LAorCS5yZG1hX2dldF9taW5fY25xX21zaXggPSAmcWVkX3JkbWFfZ2V0X21pbl9jbnFfbXNpeCwKKwkucmRtYV9jbnFfcHJvZF91cGRhdGUgPSAmcWVkX3JkbWFfY25xX3Byb2RfdXBkYXRlLAorCS5yZG1hX2FsbG9jX3BkID0gJnFlZF9yZG1hX2FsbG9jX3BkLAorCS5yZG1hX2RlYWxsb2NfcGQgPSAmcWVkX3JkbWFfZnJlZV9wZCwKKwkucmRtYV9jcmVhdGVfY3EgPSAmcWVkX3JkbWFfY3JlYXRlX2NxLAorCS5yZG1hX2Rlc3Ryb3lfY3EgPSAmcWVkX3JkbWFfZGVzdHJveV9jcSwKKwkucmRtYV9jcmVhdGVfcXAgPSAmcWVkX3JkbWFfY3JlYXRlX3FwLAorCS5yZG1hX21vZGlmeV9xcCA9ICZxZWRfcmRtYV9tb2RpZnlfcXAsCisJLnJkbWFfcXVlcnlfcXAgPSAmcWVkX3JkbWFfcXVlcnlfcXAsCisJLnJkbWFfZGVzdHJveV9xcCA9ICZxZWRfcmRtYV9kZXN0cm95X3FwLAorCS5yZG1hX2FsbG9jX3RpZCA9ICZxZWRfcmRtYV9hbGxvY190aWQsCisJLnJkbWFfZnJlZV90aWQgPSAmcWVkX3JkbWFfZnJlZV90aWQsCisJLnJkbWFfcmVnaXN0ZXJfdGlkID0gJnFlZF9yZG1hX3JlZ2lzdGVyX3RpZCwKKwkucmRtYV9kZXJlZ2lzdGVyX3RpZCA9ICZxZWRfcmRtYV9kZXJlZ2lzdGVyX3RpZCwKKwkucm9jZV9sbDJfc3RhcnQgPSAmcWVkX3JvY2VfbGwyX3N0YXJ0LAorCS5yb2NlX2xsMl9zdG9wID0gJnFlZF9yb2NlX2xsMl9zdG9wLAorCS5yb2NlX2xsMl90eCA9ICZxZWRfcm9jZV9sbDJfdHgsCisJLnJvY2VfbGwyX3Bvc3RfcnhfYnVmZmVyID0gJnFlZF9yb2NlX2xsMl9wb3N0X3J4X2J1ZmZlciwKKwkucm9jZV9sbDJfc2V0X21hY19maWx0ZXIgPSAmcWVkX3JvY2VfbGwyX3NldF9tYWNfZmlsdGVyLAorCS5yb2NlX2xsMl9zdGF0cyA9ICZxZWRfcm9jZV9sbDJfc3RhdHMsCit9OworCitjb25zdCBzdHJ1Y3QgcWVkX3JkbWFfb3BzICpxZWRfZ2V0X3JkbWFfb3BzKCkKK3sKKwlyZXR1cm4gJnFlZF9yZG1hX29wc19wYXNzOworfQorRVhQT1JUX1NZTUJPTChxZWRfZ2V0X3JkbWFfb3BzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3JvY2UuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3JvY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjA5MWU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfcm9jZS5oCkBAIC0wLDAgKzEsMjE2IEBACisvKiBRTG9naWMgcWVkIE5JQyBEcml2ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2ICBRTG9naWMgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kIC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworI2lmbmRlZiBfUUVEX1JPQ0VfSAorI2RlZmluZSBfUUVEX1JPQ0VfSAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3FlZC9xZWRfaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9xZWQvcWVkX3JvY2VfaWYuaD4KKyNpbmNsdWRlICJxZWQuaCIKKyNpbmNsdWRlICJxZWRfZGV2X2FwaS5oIgorI2luY2x1ZGUgInFlZF9oc2kuaCIKKyNpbmNsdWRlICJxZWRfbGwyLmgiCisKKyNkZWZpbmUgUUVEX1JETUFfTUFYX0ZNUiAgICAgICAgICAgICAgICAgICAgKFJETUFfTUFYX1RJRFMpCisjZGVmaW5lIFFFRF9SRE1BX01BWF9QX0tFWSAgICAgICAgICAgICAgICAgICgxKQorI2RlZmluZSBRRURfUkRNQV9NQVhfV1FFICAgICAgICAgICAgICAgICAgICAoMHg3RkZGKQorI2RlZmluZSBRRURfUkRNQV9NQVhfU1JRX1dRRV9FTEVNICAgICAgICAgICAoMHg3RkZGKQorI2RlZmluZSBRRURfUkRNQV9QQUdFX1NJWkVfQ0FQUyAgICAgICAgICAgICAoMHhGRkZGRjAwMCkKKyNkZWZpbmUgUUVEX1JETUFfQUNLX0RFTEFZICAgICAgICAgICAgICAgICAgKDE1KQorI2RlZmluZSBRRURfUkRNQV9NQVhfTVJfU0laRSAgICAgICAgICAgICAgICAoMHgxMDAwMDAwMDAwMFVMTCkKKyNkZWZpbmUgUUVEX1JETUFfTUFYX0NRUyAgICAgICAgICAgICAgICAgICAgKFJETUFfTUFYX0NRUykKKyNkZWZpbmUgUUVEX1JETUFfTUFYX01SUyAgICAgICAgICAgICAgICAgICAgKFJETUFfTUFYX1RJRFMpCisvKiBBZGQgMSBmb3IgaGVhZGVyIGVsZW1lbnQgKi8KKyNkZWZpbmUgUUVEX1JETUFfTUFYX1NSUV9FTEVNX1BFUl9XUUUJICAgIChSRE1BX01BWF9TR0VfUEVSX1JRX1dRRSArIDEpCisjZGVmaW5lIFFFRF9SRE1BX01BWF9TR0VfUEVSX1NSUV9XUUUgICAgICAgIChSRE1BX01BWF9TR0VfUEVSX1JRX1dRRSkKKyNkZWZpbmUgUUVEX1JETUFfU1JRX1dRRV9FTEVNX1NJWkUgICAgICAgICAgKDE2KQorI2RlZmluZSBRRURfUkRNQV9NQVhfU1JRUyAgICAgICAgICAgICAgICAgICAoMzIgKiAxMDI0KQorCisjZGVmaW5lIFFFRF9SRE1BX01BWF9DUUVfMzJfQklUICAgICAgICAgICAgICgweDdGRkZGRkZGIC0gMSkKKyNkZWZpbmUgUUVEX1JETUFfTUFYX0NRRV8xNl9CSVQgICAgICAgICAgICAgKDB4N0ZGRiAtIDEpCisKK2VudW0gcWVkX3JkbWFfdG9nZ2xlX2JpdCB7CisJUUVEX1JETUFfVE9HR0xFX0JJVF9DTEVBUiA9IDAsCisJUUVEX1JETUFfVE9HR0xFX0JJVF9TRVQgPSAxCit9OworCitzdHJ1Y3QgcWVkX2JtYXAgeworCXVuc2lnbmVkIGxvbmcgKmJpdG1hcDsKKwl1MzIgbWF4X2NvdW50OworfTsKKworc3RydWN0IHFlZF9yZG1hX2luZm8geworCS8qIHNwaW4gbG9jayB0byBwcm90ZWN0IGJpdG1hcHMgKi8KKwlzcGlubG9ja190IGxvY2s7CisKKwlzdHJ1Y3QgcWVkX2JtYXAgY3FfbWFwOworCXN0cnVjdCBxZWRfYm1hcCBwZF9tYXA7CisJc3RydWN0IHFlZF9ibWFwIHRpZF9tYXA7CisJc3RydWN0IHFlZF9ibWFwIHFwX21hcDsKKwlzdHJ1Y3QgcWVkX2JtYXAgc3JxX21hcDsKKwlzdHJ1Y3QgcWVkX2JtYXAgY2lkX21hcDsKKwlzdHJ1Y3QgcWVkX2JtYXAgZHBpX21hcDsKKwlzdHJ1Y3QgcWVkX2JtYXAgdG9nZ2xlX2JpdHM7CisJc3RydWN0IHFlZF9yZG1hX2V2ZW50cyBldmVudHM7CisJc3RydWN0IHFlZF9yZG1hX2RldmljZSAqZGV2OworCXN0cnVjdCBxZWRfcmRtYV9wb3J0ICpwb3J0OworCXUzMiBsYXN0X3RpZDsKKwl1OCBudW1fY25xczsKKwl1MzIgbnVtX3FwczsKKwl1MzIgbnVtX21yczsKKwl1MTYgcXVldWVfem9uZV9iYXNlOworCWVudW0gcHJvdG9jb2xfdHlwZSBwcm90bzsKK307CisKK3N0cnVjdCBxZWRfcmRtYV9yZXNpemVfY3FfaW5fcGFyYW1zIHsKKwl1MTYgaWNpZDsKKwl1MzIgY3Ffc2l6ZTsKKwlib29sIHBibF90d29fbGV2ZWw7CisJdTY0IHBibF9wdHI7CisJdTE2IHBibF9udW1fcGFnZXM7CisJdTggcGJsX3BhZ2Vfc2l6ZV9sb2c7Cit9OworCitzdHJ1Y3QgcWVkX3JkbWFfcmVzaXplX2NxX291dF9wYXJhbXMgeworCXUzMiBwcm9kOworCXUzMiBjb25zOworfTsKKworc3RydWN0IHFlZF9yZG1hX3Jlc2l6ZV9jbnFfaW5fcGFyYW1zIHsKKwl1MzIgY25xX2lkOworCXUzMiBwYmxfcGFnZV9zaXplX2xvZzsKKwl1NjQgcGJsX3B0cjsKK307CisKK3N0cnVjdCBxZWRfcmRtYV9xcCB7CisJc3RydWN0IHJlZ3BhaXIgcXBfaGFuZGxlOworCXN0cnVjdCByZWdwYWlyIHFwX2hhbmRsZV9hc3luYzsKKwl1MzIgcXBpZDsKKwl1MTYgaWNpZDsKKwllbnVtIHFlZF9yb2NlX3FwX3N0YXRlIGN1cl9zdGF0ZTsKKwlib29sIHVzZV9zcnE7CisJYm9vbCBzaWduYWxfYWxsOworCWJvb2wgZm1yX2FuZF9yZXNlcnZlZF9sa2V5OworCisJYm9vbCBpbmNvbWluZ19yZG1hX3JlYWRfZW47CisJYm9vbCBpbmNvbWluZ19yZG1hX3dyaXRlX2VuOworCWJvb2wgaW5jb21pbmdfYXRvbWljX2VuOworCWJvb2wgZTJlX2Zsb3dfY29udHJvbF9lbjsKKworCXUxNiBwZDsKKwl1MTYgcGtleTsKKwl1MzIgZGVzdF9xcDsKKwl1MTYgbXR1OworCXUxNiBzcnFfaWQ7CisJdTggdHJhZmZpY19jbGFzc190b3M7CisJdTggaG9wX2xpbWl0X3R0bDsKKwl1MTYgZHBpOworCXUzMiBmbG93X2xhYmVsOworCWJvb2wgbGJfaW5kaWNhdGlvbjsKKwl1MTYgdmxhbl9pZDsKKwl1MzIgYWNrX3RpbWVvdXQ7CisJdTggcmV0cnlfY250OworCXU4IHJucl9yZXRyeV9jbnQ7CisJdTggbWluX3Jucl9uYWtfdGltZXI7CisJYm9vbCBzcWRfYXN5bmM7CisJdW5pb24gcWVkX2dpZCBzZ2lkOworCXVuaW9uIHFlZF9naWQgZGdpZDsKKwllbnVtIHJvY2VfbW9kZSByb2NlX21vZGU7CisJdTE2IHVkcF9zcmNfcG9ydDsKKwl1OCBzdGF0c19xdWV1ZTsKKworCS8qIHJlcXVlc2V0ZXIgKi8KKwl1OCBtYXhfcmRfYXRvbWljX3JlcTsKKwl1MzIgc3FfcHNuOworCXUxNiBzcV9jcV9pZDsKKwl1MTYgc3FfbnVtX3BhZ2VzOworCWRtYV9hZGRyX3Qgc3FfcGJsX3B0cjsKKwl2b2lkICpvcnE7CisJZG1hX2FkZHJfdCBvcnFfcGh5c19hZGRyOworCXU4IG9ycV9udW1fcGFnZXM7CisJYm9vbCByZXFfb2ZmbG9hZGVkOworCisJLyogcmVzcG9uZGVyICovCisJdTggbWF4X3JkX2F0b21pY19yZXNwOworCXUzMiBycV9wc247CisJdTE2IHJxX2NxX2lkOworCXUxNiBycV9udW1fcGFnZXM7CisJZG1hX2FkZHJfdCBycV9wYmxfcHRyOworCXZvaWQgKmlycTsKKwlkbWFfYWRkcl90IGlycV9waHlzX2FkZHI7CisJdTggaXJxX251bV9wYWdlczsKKwlib29sIHJlc3Bfb2ZmbG9hZGVkOworCisJdTggcmVtb3RlX21hY19hZGRyWzZdOworCXU4IGxvY2FsX21hY19hZGRyWzZdOworCisJdm9pZCAqc2hhcmVkX3F1ZXVlOworCWRtYV9hZGRyX3Qgc2hhcmVkX3F1ZXVlX3BoeXNfYWRkcjsKK307CisKK2ludAorcWVkX3JkbWFfYWRkX3VzZXIodm9pZCAqcmRtYV9jeHQsCisJCSAgc3RydWN0IHFlZF9yZG1hX2FkZF91c2VyX291dF9wYXJhbXMgKm91dF9wYXJhbXMpOworaW50IHFlZF9yZG1hX2FsbG9jX3BkKHZvaWQgKnJkbWFfY3h0LCB1MTYgKnBkKTsKK2ludCBxZWRfcmRtYV9hbGxvY190aWQodm9pZCAqcmRtYV9jeHQsIHUzMiAqdGlkKTsKK2ludCBxZWRfcmRtYV9kZXJlZ2lzdGVyX3RpZCh2b2lkICpyZG1hX2N4dCwgdTMyIHRpZCk7Cit2b2lkIHFlZF9yZG1hX2ZyZWVfdGlkKHZvaWQgKnJkbWFfY3h0LCB1MzIgdGlkKTsKK3N0cnVjdCBxZWRfcmRtYV9kZXZpY2UgKnFlZF9yZG1hX3F1ZXJ5X2RldmljZSh2b2lkICpyZG1hX2N4dCk7CitzdHJ1Y3QgcWVkX3JkbWFfcG9ydCAqcWVkX3JkbWFfcXVlcnlfcG9ydCh2b2lkICpyZG1hX2N4dCk7CitpbnQKK3FlZF9yZG1hX3JlZ2lzdGVyX3RpZCh2b2lkICpyZG1hX2N4dCwKKwkJICAgICAgc3RydWN0IHFlZF9yZG1hX3JlZ2lzdGVyX3RpZF9pbl9wYXJhbXMgKnBhcmFtcyk7Cit2b2lkIHFlZF9yZG1hX3JlbW92ZV91c2VyKHZvaWQgKnJkbWFfY3h0LCB1MTYgZHBpKTsKK2ludCBxZWRfcmRtYV9zdGFydCh2b2lkICpwX2h3Zm4sIHN0cnVjdCBxZWRfcmRtYV9zdGFydF9pbl9wYXJhbXMgKnBhcmFtcyk7CitpbnQgcWVkX3JkbWFfc3RvcCh2b2lkICpyZG1hX2N4dCk7Cit1MzIgcWVkX3JkbWFfZ2V0X3NiX2lkKHZvaWQgKnBfaHdmbiwgdTMyIHJlbF9zYl9pZCk7Cit1MzIgcWVkX3JkbWFfcXVlcnlfY2F1X3RpbWVyX3Jlcyh2b2lkICpwX2h3Zm4pOwordm9pZCBxZWRfcmRtYV9jbnFfcHJvZF91cGRhdGUodm9pZCAqcmRtYV9jeHQsIHU4IGNucV9pbmRleCwgdTE2IHByb2QpOwordm9pZCBxZWRfcmRtYV9yZXNjX2ZyZWUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4pOwordm9pZCBxZWRfYXN5bmNfcm9jZV9ldmVudChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgc3RydWN0IGV2ZW50X3JpbmdfZW50cnkgKnBfZXFlKTsKK2ludCBxZWRfcmRtYV9kZXN0cm95X3FwKHZvaWQgKnJkbWFfY3h0LCBzdHJ1Y3QgcWVkX3JkbWFfcXAgKnFwKTsKK2ludCBxZWRfcmRtYV9tb2RpZnlfcXAodm9pZCAqcmRtYV9jeHQsIHN0cnVjdCBxZWRfcmRtYV9xcCAqcXAsCisJCSAgICAgICBzdHJ1Y3QgcWVkX3JkbWFfbW9kaWZ5X3FwX2luX3BhcmFtcyAqcGFyYW1zKTsKK2ludCBxZWRfcmRtYV9xdWVyeV9xcCh2b2lkICpyZG1hX2N4dCwgc3RydWN0IHFlZF9yZG1hX3FwICpxcCwKKwkJICAgICAgc3RydWN0IHFlZF9yZG1hX3F1ZXJ5X3FwX291dF9wYXJhbXMgKm91dF9wYXJhbXMpOworCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSU5GSU5JQkFORF9RRURSKQordm9pZCBxZWRfcmRtYV9kcG1fYmFyKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpOworI2Vsc2UKK3ZvaWQgcWVkX3JkbWFfZHBtX2JhcihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0KSB7fQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3NlbGZ0ZXN0LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9zZWxmdGVzdC5jCmluZGV4IGEzNDJiZmUuLjliNzY3OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3NlbGZ0ZXN0LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfc2VsZnRlc3QuYwpAQCAtMiw2ICsyLDcgQEAKICNpbmNsdWRlICJxZWRfZGV2X2FwaS5oIgogI2luY2x1ZGUgInFlZF9tY3AuaCIKICNpbmNsdWRlICJxZWRfc3AuaCIKKyNpbmNsdWRlICJxZWRfc2VsZnRlc3QuaCIKIAogaW50IHFlZF9zZWxmdGVzdF9tZW1vcnkoc3RydWN0IHFlZF9kZXYgKmNkZXYpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9zcC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfc3AuaAppbmRleCBhNTQ4NTA0Li42NTJjOTA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9zcC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3NwLmgKQEAgLTYxLDYgKzYxLDEwIEBACiAJc3RydWN0IHZwb3J0X3N0YXJ0X3JhbXJvZF9kYXRhIHZwb3J0X3N0YXJ0OwogCXN0cnVjdCB2cG9ydF9zdG9wX3JhbXJvZF9kYXRhIHZwb3J0X3N0b3A7CiAJc3RydWN0IHZwb3J0X3VwZGF0ZV9yYW1yb2RfZGF0YSB2cG9ydF91cGRhdGU7CisJc3RydWN0IGNvcmVfcnhfc3RhcnRfcmFtcm9kX2RhdGEgY29yZV9yeF9xdWV1ZV9zdGFydDsKKwlzdHJ1Y3QgY29yZV9yeF9zdG9wX3JhbXJvZF9kYXRhIGNvcmVfcnhfcXVldWVfc3RvcDsKKwlzdHJ1Y3QgY29yZV90eF9zdGFydF9yYW1yb2RfZGF0YSBjb3JlX3R4X3F1ZXVlX3N0YXJ0OworCXN0cnVjdCBjb3JlX3R4X3N0b3BfcmFtcm9kX2RhdGEgY29yZV90eF9xdWV1ZV9zdG9wOwogCXN0cnVjdCB2cG9ydF9maWx0ZXJfdXBkYXRlX3JhbXJvZF9kYXRhIHZwb3J0X2ZpbHRlcl91cGRhdGU7CiAKIAlzdHJ1Y3QgcmRtYV9pbml0X2Z1bmNfcmFtcm9kX2RhdGEgcmRtYV9pbml0X2Z1bmM7CkBAIC04MSw2ICs4NSw3IEBACiAJc3RydWN0IHJkbWFfc3JxX2NyZWF0ZV9yYW1yb2RfZGF0YSByZG1hX2NyZWF0ZV9zcnE7CiAJc3RydWN0IHJkbWFfc3JxX2Rlc3Ryb3lfcmFtcm9kX2RhdGEgcmRtYV9kZXN0cm95X3NycTsKIAlzdHJ1Y3QgcmRtYV9zcnFfbW9kaWZ5X3JhbXJvZF9kYXRhIHJkbWFfbW9kaWZ5X3NycTsKKwlzdHJ1Y3Qgcm9jZV9pbml0X2Z1bmNfcmFtcm9kX2RhdGEgcm9jZV9pbml0X2Z1bmM7CiAKIAlzdHJ1Y3QgaXNjc2lfc2xvd19wYXRoX2hkciBpc2NzaV9lbXB0eTsKIAlzdHJ1Y3QgaXNjc2lfaW5pdF9yYW1yb2RfcGFyYW1zIGlzY3NpX2luaXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9zcF9jb21tYW5kcy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfc3BfY29tbWFuZHMuYwppbmRleCBhNTJmM2ZjLi4yODg4ZWIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9zcF9jb21tYW5kcy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3NwX2NvbW1hbmRzLmMKQEAgLTI1LDkgKzI1LDcgQEAKIAogaW50IHFlZF9zcF9pbml0X3JlcXVlc3Qoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCiAJCQlzdHJ1Y3QgcWVkX3NwcV9lbnRyeSAqKnBwX2VudCwKLQkJCXU4IGNtZCwKLQkJCXU4IHByb3RvY29sLAotCQkJc3RydWN0IHFlZF9zcF9pbml0X2RhdGEgKnBfZGF0YSkKKwkJCXU4IGNtZCwgdTggcHJvdG9jb2wsIHN0cnVjdCBxZWRfc3BfaW5pdF9kYXRhICpwX2RhdGEpCiB7CiAJdTMyIG9wYXF1ZV9jaWQgPSBwX2RhdGEtPm9wYXF1ZV9maWQgPDwgMTYgfCBwX2RhdGEtPmNpZDsKIAlzdHJ1Y3QgcWVkX3NwcV9lbnRyeSAqcF9lbnQgPSBOVUxMOwpAQCAtMzgsNyArMzYsNyBAQAogCiAJcmMgPSBxZWRfc3BxX2dldF9lbnRyeShwX2h3Zm4sIHBwX2VudCk7CiAKLQlpZiAocmMgIT0gMCkKKwlpZiAocmMpCiAJCXJldHVybiByYzsKIAogCXBfZW50ID0gKnBwX2VudDsKQEAgLTMyMSw4ICszMTksNyBAQAogCiAJcmMgPSBxZWRfc3BfaW5pdF9yZXF1ZXN0KHBfaHdmbiwgJnBfZW50LAogCQkJCSBDT01NT05fUkFNUk9EX1BGX1NUQVJULAotCQkJCSBQUk9UT0NPTElEX0NPTU1PTiwKLQkJCQkgJmluaXRfZGF0YSk7CisJCQkJIFBST1RPQ09MSURfQ09NTU9OLCAmaW5pdF9kYXRhKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIApAQCAtMzU2LDggKzM1Myw3IEBACiAJRE1BX1JFR1BBSVJfTEUocF9yYW1yb2QtPmNvbnNvbGlkX3FfcGJsX2FkZHIsCiAJCSAgICAgICBwX2h3Zm4tPnBfY29uc3EtPmNoYWluLnBibC5wX3BoeXNfdGFibGUpOwogCi0JcWVkX3R1bm5fc2V0X3BmX3N0YXJ0X3BhcmFtcyhwX2h3Zm4sIHBfdHVubiwKLQkJCQkgICAgICZwX3JhbXJvZC0+dHVubmVsX2NvbmZpZyk7CisJcWVkX3R1bm5fc2V0X3BmX3N0YXJ0X3BhcmFtcyhwX2h3Zm4sIHBfdHVubiwgJnBfcmFtcm9kLT50dW5uZWxfY29uZmlnKTsKIAogCWlmIChJU19NRl9TSShwX2h3Zm4pKQogCQlwX3JhbXJvZC0+YWxsb3dfbnBhcl90eF9zd2l0Y2hpbmcgPSBhbGxvd19ucGFyX3R4X3N3aXRjaDsKQEAgLTM4OSw4ICszODUsNyBAQAogCiAJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfU1BRLAogCQkgICAiU2V0dGluZyBldmVudF9yaW5nX3NiIFtpZCAlMDR4IGluZGV4ICUwMnhdLCBvdXRlcl90YWcgWyVkXVxuIiwKLQkJICAgc2IsIHNiX2luZGV4LAotCQkgICBwX3JhbXJvZC0+b3V0ZXJfdGFnKTsKKwkJICAgc2IsIHNiX2luZGV4LCBwX3JhbXJvZC0+b3V0ZXJfdGFnKTsKIAogCXJjID0gcWVkX3NwcV9wb3N0KHBfaHdmbiwgcF9lbnQsIE5VTEwpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9zcHEuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3NwcS5jCmluZGV4IGQ3MzQ1NmUuLmNhZmY0MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3NwcS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3NwcS5jCkBAIC0yOCw2ICsyOCw5IEBACiAjaW5jbHVkZSAicWVkX3JlZ19hZGRyLmgiCiAjaW5jbHVkZSAicWVkX3NwLmgiCiAjaW5jbHVkZSAicWVkX3NyaW92LmgiCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSU5GSU5JQkFORF9RRURSKQorI2luY2x1ZGUgInFlZF9yb2NlLmgiCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTdHJ1Y3R1cmVzICYgRGVmaW5pdGlvbnMKQEAgLTQxLDggKzQ0LDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB2b2lkIHFlZF9zcHFfYmxvY2tpbmdfY2Ioc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCiAJCQkJdm9pZCAqY29va2llLAotCQkJCXVuaW9uIGV2ZW50X3JpbmdfZGF0YSAqZGF0YSwKLQkJCQl1OCBmd19yZXR1cm5fY29kZSkKKwkJCQl1bmlvbiBldmVudF9yaW5nX2RhdGEgKmRhdGEsIHU4IGZ3X3JldHVybl9jb2RlKQogewogCXN0cnVjdCBxZWRfc3BxX2NvbXBfZG9uZSAqY29tcF9kb25lOwogCkBAIC0xMDksOSArMTExLDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU1BRIGVudHJpZXMgaW5uZXIgQVBJCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50Ci1xZWRfc3BxX2ZpbGxfZW50cnkoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCSAgIHN0cnVjdCBxZWRfc3BxX2VudHJ5ICpwX2VudCkKK3N0YXRpYyBpbnQgcWVkX3NwcV9maWxsX2VudHJ5KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgICAgc3RydWN0IHFlZF9zcHFfZW50cnkgKnBfZW50KQogewogCXBfZW50LT5mbGFncyA9IDA7CiAKQEAgLTE4OSw4ICsxOTAsNyBAQAogfQogCiBzdGF0aWMgaW50IHFlZF9zcHFfaHdfcG9zdChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCSAgIHN0cnVjdCBxZWRfc3BxICpwX3NwcSwKLQkJCSAgIHN0cnVjdCBxZWRfc3BxX2VudHJ5ICpwX2VudCkKKwkJCSAgIHN0cnVjdCBxZWRfc3BxICpwX3NwcSwgc3RydWN0IHFlZF9zcHFfZW50cnkgKnBfZW50KQogewogCXN0cnVjdCBxZWRfY2hhaW4gKnBfY2hhaW4gPSAmcF9od2ZuLT5wX3NwcS0+Y2hhaW47CiAJdTE2IGVjaG8gPSBxZWRfY2hhaW5fZ2V0X3Byb2RfaWR4KHBfY2hhaW4pOwpAQCAtMjQwLDYgKzI0MCwxMSBAQAogCQkJICAgc3RydWN0IGV2ZW50X3JpbmdfZW50cnkgKnBfZXFlKQogewogCXN3aXRjaCAocF9lcWUtPnByb3RvY29sX2lkKSB7CisjaWYgSVNfRU5BQkxFRChDT05GSUdfSU5GSU5JQkFORF9RRURSKQorCWNhc2UgUFJPVE9DT0xJRF9ST0NFOgorCQlxZWRfYXN5bmNfcm9jZV9ldmVudChwX2h3Zm4sIHBfZXFlKTsKKwkJcmV0dXJuIDA7CisjZW5kaWYKIAljYXNlIFBST1RPQ09MSURfQ09NTU9OOgogCQlyZXR1cm4gcWVkX3NyaW92X2VxZV9ldmVudChwX2h3Zm4sCiAJCQkJCSAgIHBfZXFlLT5vcGNvZGUsCkBAIC0yNTUsOCArMjYwLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRVEgQVBJCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHFlZF9lcV9wcm9kX3VwZGF0ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCXUxNiBwcm9kKQordm9pZCBxZWRfZXFfcHJvZF91cGRhdGUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHUxNiBwcm9kKQogewogCXUzMiBhZGRyID0gR1RUX0JBUjBfTUFQX1JFR19VU0RNX1JBTSArCiAJCSAgIFVTVE9STV9FUUVfQ09OU19PRkZTRVQocF9od2ZuLT5yZWxfcGZfaWQpOwpAQCAtMjY3LDkgKzI3MSw3IEBACiAJbW1pb3diKCk7CiB9CiAKLWludCBxZWRfZXFfY29tcGxldGlvbihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJICAgICAgdm9pZCAqY29va2llKQotCitpbnQgcWVkX2VxX2NvbXBsZXRpb24oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHZvaWQgKmNvb2tpZSkKIHsKIAlzdHJ1Y3QgcWVkX2VxICpwX2VxID0gY29va2llOwogCXN0cnVjdCBxZWRfY2hhaW4gKnBfY2hhaW4gPSAmcF9lcS0+Y2hhaW47CkBAIC0zMjMsMTcgKzMyNSwxNCBAQAogCXJldHVybiByYzsKIH0KIAotc3RydWN0IHFlZF9lcSAqcWVkX2VxX2FsbG9jKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJICAgIHUxNiBudW1fZWxlbSkKK3N0cnVjdCBxZWRfZXEgKnFlZF9lcV9hbGxvYyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgdTE2IG51bV9lbGVtKQogewogCXN0cnVjdCBxZWRfZXEgKnBfZXE7CiAKIAkvKiBBbGxvY2F0ZSBFUSBzdHJ1Y3QgKi8KIAlwX2VxID0ga3phbGxvYyhzaXplb2YoKnBfZXEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBfZXEpIHsKLQkJRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBgc3RydWN0IHFlZF9lcSdcbiIpOworCWlmICghcF9lcSkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgRVEgY2hhaW4qLwogCWlmIChxZWRfY2hhaW5fYWxsb2MocF9od2ZuLT5jZGV2LApAQCAtMzQyLDE3ICszNDEsMTIgQEAKIAkJCSAgICBRRURfQ0hBSU5fQ05UX1RZUEVfVTE2LAogCQkJICAgIG51bV9lbGVtLAogCQkJICAgIHNpemVvZih1bmlvbiBldmVudF9yaW5nX2VsZW1lbnQpLAotCQkJICAgICZwX2VxLT5jaGFpbikpIHsKLQkJRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBlcSBjaGFpblxuIik7CisJCQkgICAgJnBfZXEtPmNoYWluKSkKIAkJZ290byBlcV9hbGxvY2F0ZV9mYWlsOwotCX0KIAogCS8qIHJlZ2lzdGVyIEVRIGNvbXBsZXRpb24gb24gdGhlIFNQIFNCICovCi0JcWVkX2ludF9yZWdpc3Rlcl9jYihwX2h3Zm4sCi0JCQkgICAgcWVkX2VxX2NvbXBsZXRpb24sCi0JCQkgICAgcF9lcSwKLQkJCSAgICAmcF9lcS0+ZXFfc2JfaW5kZXgsCi0JCQkgICAgJnBfZXEtPnBfZndfY29ucyk7CisJcWVkX2ludF9yZWdpc3Rlcl9jYihwX2h3Zm4sIHFlZF9lcV9jb21wbGV0aW9uLAorCQkJICAgIHBfZXEsICZwX2VxLT5lcV9zYl9pbmRleCwgJnBfZXEtPnBfZndfY29ucyk7CiAKIAlyZXR1cm4gcF9lcTsKIApAQCAtMzYxLDE0ICszNTUsMTIgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBxZWRfZXFfc2V0dXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCSAgc3RydWN0IHFlZF9lcSAqcF9lcSkKK3ZvaWQgcWVkX2VxX3NldHVwKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX2VxICpwX2VxKQogewogCXFlZF9jaGFpbl9yZXNldCgmcF9lcS0+Y2hhaW4pOwogfQogCi12b2lkIHFlZF9lcV9mcmVlKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkgc3RydWN0IHFlZF9lcSAqcF9lcSkKK3ZvaWQgcWVkX2VxX2ZyZWUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfZXEgKnBfZXEpCiB7CiAJaWYgKCFwX2VxKQogCQlyZXR1cm47CkBAIC0zNzksMTAgKzM3MSw5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENRRSBBUEkgLSBtYW5pcHVsYXRlIEVRIGZ1bmN0aW9uYWxpdHkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgcWVkX2NxZV9jb21wbGV0aW9uKAotCXN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCXN0cnVjdCBldGhfc2xvd19wYXRoX3J4X2NxZSAqY3FlLAotCWVudW0gcHJvdG9jb2xfdHlwZSBwcm90b2NvbCkKK3N0YXRpYyBpbnQgcWVkX2NxZV9jb21wbGV0aW9uKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgICAgc3RydWN0IGV0aF9zbG93X3BhdGhfcnhfY3FlICpjcWUsCisJCQkgICAgICBlbnVtIHByb3RvY29sX3R5cGUgcHJvdG9jb2wpCiB7CiAJaWYgKElTX1ZGKHBfaHdmbi0+Y2RldikpCiAJCXJldHVybiAwOwpAQCAtNDYzLDEyICs0NTQsOSBAQAogCXUzMiBjYXBhY2l0eTsKIAogCS8qIFNQUSBzdHJ1Y3QgKi8KLQlwX3NwcSA9Ci0JCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBxZWRfc3BxKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwX3NwcSkgewotCQlEUF9OT1RJQ0UocF9od2ZuLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGBzdHJ1Y3QgcWVkX3NwcSdcbiIpOworCXBfc3BxID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHFlZF9zcHEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBfc3BxKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAkvKiBTUFEgcmluZyAgKi8KIAlpZiAocWVkX2NoYWluX2FsbG9jKHBfaHdmbi0+Y2RldiwKQEAgLTQ3NywxOCArNDY1LDE0IEBACiAJCQkgICAgUUVEX0NIQUlOX0NOVF9UWVBFX1UxNiwKIAkJCSAgICAwLCAgIC8qIE4vQSB3aGVuIHRoZSBtb2RlIGlzIFNJTkdMRSAqLwogCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2xvd19wYXRoX2VsZW1lbnQpLAotCQkJICAgICZwX3NwcS0+Y2hhaW4pKSB7Ci0JCURQX05PVElDRShwX2h3Zm4sICJGYWlsZWQgdG8gYWxsb2NhdGUgc3BxIGNoYWluXG4iKTsKKwkJCSAgICAmcF9zcHEtPmNoYWluKSkKIAkJZ290byBzcHFfYWxsb2NhdGVfZmFpbDsKLQl9CiAKIAkvKiBhbGxvY2F0ZSBhbmQgZmlsbCB0aGUgU1BRIGVsZW1lbnRzIChpbmNsLiByYW1yb2QgZGF0YSBsaXN0KSAqLwogCWNhcGFjaXR5ID0gcWVkX2NoYWluX2dldF9jYXBhY2l0eSgmcF9zcHEtPmNoYWluKTsKIAlwX3ZpcnQgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBfaHdmbi0+Y2Rldi0+cGRldi0+ZGV2LAotCQkJCSAgICBjYXBhY2l0eSAqCi0JCQkJICAgIHNpemVvZihzdHJ1Y3QgcWVkX3NwcV9lbnRyeSksCisJCQkJICAgIGNhcGFjaXR5ICogc2l6ZW9mKHN0cnVjdCBxZWRfc3BxX2VudHJ5KSwKIAkJCQkgICAgJnBfcGh5cywgR0ZQX0tFUk5FTCk7Ci0KIAlpZiAoIXBfdmlydCkKIAkJZ290byBzcHFfYWxsb2NhdGVfZmFpbDsKIApAQCAtNTI1LDkgKzUwOSw3IEBACiAJa2ZyZWUocF9zcHEpOwogfQogCi1pbnQKLXFlZF9zcHFfZ2V0X2VudHJ5KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkgIHN0cnVjdCBxZWRfc3BxX2VudHJ5ICoqcHBfZW50KQoraW50IHFlZF9zcHFfZ2V0X2VudHJ5KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX3NwcV9lbnRyeSAqKnBwX2VudCkKIHsKIAlzdHJ1Y3QgcWVkX3NwcSAqcF9zcHEgPSBwX2h3Zm4tPnBfc3BxOwogCXN0cnVjdCBxZWRfc3BxX2VudHJ5ICpwX2VudCA9IE5VTEw7CkBAIC01MzgsMTQgKzUyMCwxNSBAQAogCWlmIChsaXN0X2VtcHR5KCZwX3NwcS0+ZnJlZV9wb29sKSkgewogCQlwX2VudCA9IGt6YWxsb2Moc2l6ZW9mKCpwX2VudCksIEdGUF9BVE9NSUMpOwogCQlpZiAoIXBfZW50KSB7CisJCQlEUF9OT1RJQ0UocF9od2ZuLAorCQkJCSAgIkZhaWxlZCB0byBhbGxvY2F0ZSBhbiBTUFEgZW50cnkgZm9yIGEgcGVuZGluZyByYW1yb2RcbiIpOwogCQkJcmMgPSAtRU5PTUVNOwogCQkJZ290byBvdXRfdW5sb2NrOwogCQl9CiAJCXBfZW50LT5xdWV1ZSA9ICZwX3NwcS0+dW5saW1pdGVkX3BlbmRpbmc7CiAJfSBlbHNlIHsKIAkJcF9lbnQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwX3NwcS0+ZnJlZV9wb29sLAotCQkJCQkgc3RydWN0IHFlZF9zcHFfZW50cnksCi0JCQkJCSBsaXN0KTsKKwkJCQkJIHN0cnVjdCBxZWRfc3BxX2VudHJ5LCBsaXN0KTsKIAkJbGlzdF9kZWwoJnBfZW50LT5saXN0KTsKIAkJcF9lbnQtPnF1ZXVlID0gJnBfc3BxLT5wZW5kaW5nOwogCX0KQEAgLTU2NCw4ICs1NDcsNyBAQAogCWxpc3RfYWRkX3RhaWwoJnBfZW50LT5saXN0LCAmcF9od2ZuLT5wX3NwcS0+ZnJlZV9wb29sKTsKIH0KIAotdm9pZCBxZWRfc3BxX3JldHVybl9lbnRyeShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCSAgc3RydWN0IHFlZF9zcHFfZW50cnkgKnBfZW50KQordm9pZCBxZWRfc3BxX3JldHVybl9lbnRyeShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9zcHFfZW50cnkgKnBfZW50KQogewogCXNwaW5fbG9ja19iaCgmcF9od2ZuLT5wX3NwcS0+bG9jayk7CiAJX19xZWRfc3BxX3JldHVybl9lbnRyeShwX2h3Zm4sIHBfZW50KTsKQEAgLTU4NiwxMCArNTY4LDkgQEAKICAqCiAgKiBAcmV0dXJuIGludAogICovCi1zdGF0aWMgaW50Ci1xZWRfc3BxX2FkZF9lbnRyeShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJICBzdHJ1Y3QgcWVkX3NwcV9lbnRyeSAqcF9lbnQsCi0JCSAgZW51bSBzcHFfcHJpb3JpdHkgcHJpb3JpdHkpCitzdGF0aWMgaW50IHFlZF9zcHFfYWRkX2VudHJ5KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgICBzdHJ1Y3QgcWVkX3NwcV9lbnRyeSAqcF9lbnQsCisJCQkgICAgIGVudW0gc3BxX3ByaW9yaXR5IHByaW9yaXR5KQogewogCXN0cnVjdCBxZWRfc3BxICpwX3NwcSA9IHBfaHdmbi0+cF9zcHE7CiAKQEAgLTYwNCw4ICs1ODUsNyBAQAogCQkJc3RydWN0IHFlZF9zcHFfZW50cnkgKnBfZW4yOwogCiAJCQlwX2VuMiA9IGxpc3RfZmlyc3RfZW50cnkoJnBfc3BxLT5mcmVlX3Bvb2wsCi0JCQkJCQkgc3RydWN0IHFlZF9zcHFfZW50cnksCi0JCQkJCQkgbGlzdCk7CisJCQkJCQkgc3RydWN0IHFlZF9zcHFfZW50cnksIGxpc3QpOwogCQkJbGlzdF9kZWwoJnBfZW4yLT5saXN0KTsKIAogCQkJLyogQ29weSB0aGUgcmluZyBlbGVtZW50IHBoeXNpY2FsIHBvaW50ZXIgdG8gdGhlIG5ldwpAQCAtNjU1LDggKzYzNSw3IEBACiAqIFBvc3RpbmcgbmV3IFJhbXJvZHMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBpbnQgcWVkX3NwcV9wb3N0X2xpc3Qoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCi0JCQkgICAgIHUzMiBrZWVwX3Jlc2VydmUpCisJCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHUzMiBrZWVwX3Jlc2VydmUpCiB7CiAJc3RydWN0IHFlZF9zcHEgKnBfc3BxID0gcF9od2ZuLT5wX3NwcTsKIAlpbnQgcmM7CkBAIC02OTAsOCArNjY5LDcgQEAKIAkJCWJyZWFrOwogCiAJCXBfZW50ID0gbGlzdF9maXJzdF9lbnRyeSgmcF9zcHEtPnVubGltaXRlZF9wZW5kaW5nLAotCQkJCQkgc3RydWN0IHFlZF9zcHFfZW50cnksCi0JCQkJCSBsaXN0KTsKKwkJCQkJIHN0cnVjdCBxZWRfc3BxX2VudHJ5LCBsaXN0KTsKIAkJaWYgKCFwX2VudCkKIAkJCXJldHVybiAtRUlOVkFMOwogCkBAIC03MDUsOCArNjgzLDcgQEAKIH0KIAogaW50IHFlZF9zcHFfcG9zdChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJIHN0cnVjdCBxZWRfc3BxX2VudHJ5ICpwX2VudCwKLQkJIHU4ICpmd19yZXR1cm5fY29kZSkKKwkJIHN0cnVjdCBxZWRfc3BxX2VudHJ5ICpwX2VudCwgdTggKmZ3X3JldHVybl9jb2RlKQogewogCWludCByYyA9IDA7CiAJc3RydWN0IHFlZF9zcHEgKnBfc3BxID0gcF9od2ZuID8gcF9od2ZuLT5wX3NwcSA6IE5VTEw7CkBAIC04MDMsOCArNzgwLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzcGluX2xvY2tfYmgoJnBfc3BxLT5sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocF9lbnQsIHRtcCwgJnBfc3BxLT5jb21wbGV0aW9uX3BlbmRpbmcsCi0JCQkJIGxpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocF9lbnQsIHRtcCwgJnBfc3BxLT5jb21wbGV0aW9uX3BlbmRpbmcsIGxpc3QpIHsKIAkJaWYgKHBfZW50LT5lbGVtLmhkci5lY2hvID09IGVjaG8pIHsKIAkJCXUxNiBwb3MgPSBsZTE2X3RvX2NwdShlY2hvKSAlIFNQUV9SSU5HX1NJWkU7CiAKQEAgLTg0NiwxNSArODIyLDIyIEBACiAKIAlpZiAoIWZvdW5kKSB7CiAJCURQX05PVElDRShwX2h3Zm4sCi0JCQkgICJGYWlsZWQgdG8gZmluZCBhbiBlbnRyeSB0aGlzIEVRRSBjb21wbGV0ZXNcbiIpOworCQkJICAiRmFpbGVkIHRvIGZpbmQgYW4gZW50cnkgdGhpcyBFUUUgW2VjaG8gJTA0eF0gY29tcGxldGVzXG4iLAorCQkJICBsZTE2X3RvX2NwdShlY2hvKSk7CiAJCXJldHVybiAtRUVYSVNUOwogCX0KIAotCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX1NQUSwgIkNvbXBsZXRlOiBmdW5jICVwIGNvb2tpZSAlcClcbiIsCisJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfU1BRLAorCQkgICAiQ29tcGxldGUgRVFFIFtlY2hvICUwNHhdOiBmdW5jICVwIGNvb2tpZSAlcClcbiIsCisJCSAgIGxlMTZfdG9fY3B1KGVjaG8pLAogCQkgICBwX2VudC0+Y29tcF9jYi5mdW5jdGlvbiwgcF9lbnQtPmNvbXBfY2IuY29va2llKTsKIAlpZiAoZm91bmQtPmNvbXBfY2IuZnVuY3Rpb24pCiAJCWZvdW5kLT5jb21wX2NiLmZ1bmN0aW9uKHBfaHdmbiwgZm91bmQtPmNvbXBfY2IuY29va2llLCBwX2RhdGEsCiAJCQkJCWZ3X3JldHVybl9jb2RlKTsKKwllbHNlCisJCURQX1ZFUkJPU0UocF9od2ZuLAorCQkJICAgUUVEX01TR19TUFEsCisJCQkgICAiR290IGEgY29tcGxldGlvbiB3aXRob3V0IGEgY2FsbGJhY2sgZnVuY3Rpb25cbiIpOwogCiAJaWYgKChmb3VuZC0+Y29tcF9tb2RlICE9IFFFRF9TUFFfTU9ERV9FQkxPQ0spIHx8CiAJICAgIChmb3VuZC0+cXVldWUgPT0gJnBfc3BxLT51bmxpbWl0ZWRfcGVuZGluZykpCkBAIC04NzgsMTAgKzg2MSw4IEBACiAKIAkvKiBBbGxvY2F0ZSBDb25zUSBzdHJ1Y3QgKi8KIAlwX2NvbnNxID0ga3phbGxvYyhzaXplb2YoKnBfY29uc3EpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBfY29uc3EpIHsKLQkJRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBgc3RydWN0IHFlZF9jb25zcSdcbiIpOworCWlmICghcF9jb25zcSkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgRVEgY2hhaW4qLwogCWlmIChxZWRfY2hhaW5fYWxsb2MocF9od2ZuLT5jZGV2LApAQCAtODg5LDEwICs4NzAsOCBAQAogCQkJICAgIFFFRF9DSEFJTl9NT0RFX1BCTCwKIAkJCSAgICBRRURfQ0hBSU5fQ05UX1RZUEVfVTE2LAogCQkJICAgIFFFRF9DSEFJTl9QQUdFX1NJWkUgLyAweDgwLAotCQkJICAgIDB4ODAsICZwX2NvbnNxLT5jaGFpbikpIHsKLQkJRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBjb25zcSBjaGFpbiIpOworCQkJICAgIDB4ODAsICZwX2NvbnNxLT5jaGFpbikpCiAJCWdvdG8gY29uc3FfYWxsb2NhdGVfZmFpbDsKLQl9CiAKIAlyZXR1cm4gcF9jb25zcTsKIApAQCAtOTAxLDE0ICs4ODAsMTIgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBxZWRfY29uc3Ffc2V0dXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCSAgICAgc3RydWN0IHFlZF9jb25zcSAqcF9jb25zcSkKK3ZvaWQgcWVkX2NvbnNxX3NldHVwKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX2NvbnNxICpwX2NvbnNxKQogewogCXFlZF9jaGFpbl9yZXNldCgmcF9jb25zcS0+Y2hhaW4pOwogfQogCi12b2lkIHFlZF9jb25zcV9mcmVlKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkgICAgc3RydWN0IHFlZF9jb25zcSAqcF9jb25zcSkKK3ZvaWQgcWVkX2NvbnNxX2ZyZWUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfY29uc3EgKnBfY29uc3EpCiB7CiAJaWYgKCFwX2NvbnNxKQogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9zcmlvdi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfc3Jpb3YuYwppbmRleCAxNTM5OWRhLi5kMmQ2NjIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9zcmlvdi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3NyaW92LmMKQEAgLTYwLDcgKzYwLDggQEAKIAl9CiAKIAlmcF9taW5vciA9IHBfdmYtPmFjcXVpcmUudmZkZXZfaW5mby5ldGhfZnBfaHNpX21pbm9yOwotCWlmIChmcF9taW5vciA+IEVUSF9IU0lfVkVSX01JTk9SKSB7CisJaWYgKGZwX21pbm9yID4gRVRIX0hTSV9WRVJfTUlOT1IgJiYKKwkgICAgZnBfbWlub3IgIT0gRVRIX0hTSV9WRVJfTk9fUEtUX0xFTl9UVU5OKSB7CiAJCURQX1ZFUkJPU0UocF9od2ZuLAogCQkJICAgUUVEX01TR19JT1YsCiAJCQkgICAiVkYgWyVkXSAtIFJlcXVlc3RlZCBmcCBoc2kgJTAyeC4lMDJ4IHdoaWNoIGlzIHNsaWdodGx5IG5ld2VyIHRoYW4gUEYncyAlMDJ4LiUwMng7IENvbmZpZ3VyaW5nIFBGcyB2ZXJzaW9uXG4iLApAQCAtMTA3LDggKzEwOCw4IEBACiAJcmV0dXJuIHFlZF9zcHFfcG9zdChwX2h3Zm4sIHBfZW50LCBOVUxMKTsKIH0KIAotYm9vbCBxZWRfaW92X2lzX3ZhbGlkX3ZmaWQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCQkgICBpbnQgcmVsX3ZmX2lkLCBib29sIGJfZW5hYmxlZF9vbmx5KQorc3RhdGljIGJvb2wgcWVkX2lvdl9pc192YWxpZF92ZmlkKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgaW50IHJlbF92Zl9pZCwgYm9vbCBiX2VuYWJsZWRfb25seSkKIHsKIAlpZiAoIXBfaHdmbi0+cGZfaW92X2luZm8pIHsKIAkJRFBfTk9USUNFKHBfaHdmbi0+Y2RldiwgIk5vIGlvdiBpbmZvXG4iKTsKQEAgLTE4NSw4ICsxODYsOCBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotaW50IHFlZF9pb3ZfcG9zdF92Zl9idWxsZXRpbihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCSAgICAgaW50IHZmaWQsIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKK3N0YXRpYyBpbnQgcWVkX2lvdl9wb3N0X3ZmX2J1bGxldGluKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICBpbnQgdmZpZCwgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQogewogCXN0cnVjdCBxZWRfYnVsbGV0aW5fY29udGVudCAqcF9idWxsZXRpbjsKIAlpbnQgY3JjX3NpemUgPSBzaXplb2YocF9idWxsZXRpbi0+Y3JjKTsKQEAgLTQ1NCwxMCArNDU1LDggQEAKIAl9CiAKIAlwX3NyaW92ID0ga3phbGxvYyhzaXplb2YoKnBfc3Jpb3YpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBfc3Jpb3YpIHsKLQkJRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBgc3RydWN0IHFlZF9zcmlvdidcbiIpOworCWlmICghcF9zcmlvdikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJcF9od2ZuLT5wZl9pb3ZfaW5mbyA9IHBfc3Jpb3Y7CiAKQEAgLTUwNiwxMCArNTA1LDkgQEAKIAogCS8qIEFsbG9jYXRlIGEgbmV3IHN0cnVjdCBmb3IgSU9WIGluZm9ybWF0aW9uICovCiAJY2Rldi0+cF9pb3ZfaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCpjZGV2LT5wX2lvdl9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjZGV2LT5wX2lvdl9pbmZvKSB7Ci0JCURQX05PVElDRShwX2h3Zm4sICJDYW4ndCBzdXBwb3J0IElPViBkdWUgdG8gbGFjayBvZiBtZW1vcnlcbiIpOworCWlmICghY2Rldi0+cF9pb3ZfaW5mbykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCiAJY2Rldi0+cF9pb3ZfaW5mby0+cG9zID0gcG9zOwogCiAJcmMgPSBxZWRfaW92X3BjaV9jZmdfaW5mbyhjZGV2KTsKQEAgLTU3NSw3ICs1NzMsNyBAQAogCX0KIH0KIAotdm9pZCBxZWRfaW92X3NldF92ZnNfdG9fZGlzYWJsZShzdHJ1Y3QgcWVkX2RldiAqY2RldiwgdTggdG9fZGlzYWJsZSkKK3N0YXRpYyB2b2lkIHFlZF9pb3Zfc2V0X3Zmc190b19kaXNhYmxlKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCB1OCB0b19kaXNhYmxlKQogewogCXUxNiBpOwogCkBAIC02OTksNyArNjk3LDcgQEAKIAkJCQkmcXpvbmVfaWQpOwogCiAJCXJlZ19hZGRyID0gUFNXSFNUX1JFR19aT05FX1BFUk1JU1NJT05fVEFCTEUgKyBxem9uZV9pZCAqIDQ7Ci0JCXZhbCA9IGVuYWJsZSA/ICh2Zi0+YWJzX3ZmX2lkIHwgKDEgPDwgOCkpIDogMDsKKwkJdmFsID0gZW5hYmxlID8gKHZmLT5hYnNfdmZfaWQgfCBCSVQoOCkpIDogMDsKIAkJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIHJlZ19hZGRyLCB2YWwpOwogCX0KIH0KQEAgLTEwOTAsMTMgKzEwODgsMTMgQEAKIAogCS8qIFByZXBhcmUgcmVzcG9uc2UgZm9yIGFsbCBleHRlbmRlZCB0bHZzIGlmIHRoZXkgYXJlIGZvdW5kIGJ5IFBGICovCiAJZm9yIChpID0gMDsgaSA8IFFFRF9JT1ZfVlBfVVBEQVRFX01BWDsgaSsrKSB7Ci0JCWlmICghKHRsdnNfbWFzayAmICgxIDw8IGkpKSkKKwkJaWYgKCEodGx2c19tYXNrICYgQklUKGkpKSkKIAkJCWNvbnRpbnVlOwogCiAJCXJlc3AgPSBxZWRfYWRkX3RsdihwX2h3Zm4sICZwX21ieC0+b2Zmc2V0LAogCQkJCSAgIHFlZF9pb3ZfdnBvcnRfdG9fdGx2KHBfaHdmbiwgaSksIHNpemUpOwogCi0JCWlmICh0bHZzX2FjY2VwdGVkICYgKDEgPDwgaSkpCisJCWlmICh0bHZzX2FjY2VwdGVkICYgQklUKGkpKQogCQkJcmVzcC0+aGRyLnN0YXR1cyA9IHN0YXR1czsKIAkJZWxzZQogCQkJcmVzcC0+aGRyLnN0YXR1cyA9IFBGVkZfU1RBVFVTX05PVF9TVVBQT1JURUQ7CkBAIC0xMTMyLDkgKzExMzAsMTAgQEAKIAlxZWRfaW92X3NlbmRfcmVzcG9uc2UocF9od2ZuLCBwX3B0dCwgdmZfaW5mbywgbGVuZ3RoLCBzdGF0dXMpOwogfQogCi1zdHJ1Y3QgcWVkX3B1YmxpY192Zl9pbmZvICpxZWRfaW92X2dldF9wdWJsaWNfdmZfaW5mbyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCQkJCSAgICAgIHUxNiByZWxhdGl2ZV92Zl9pZCwKLQkJCQkJCSAgICAgIGJvb2wgYl9lbmFibGVkX29ubHkpCitzdGF0aWMgc3RydWN0CitxZWRfcHVibGljX3ZmX2luZm8gKnFlZF9pb3ZfZ2V0X3B1YmxpY192Zl9pbmZvKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICAgICAgdTE2IHJlbGF0aXZlX3ZmX2lkLAorCQkJCQkgICAgICAgYm9vbCBiX2VuYWJsZWRfb25seSkKIHsKIAlzdHJ1Y3QgcWVkX3ZmX2luZm8gKnZmID0gTlVMTDsKIApAQCAtMTE0NSw3ICsxMTQ0LDcgQEAKIAlyZXR1cm4gJnZmLT5wX3ZmX2luZm87CiB9CiAKLXZvaWQgcWVkX2lvdl9jbGVhbl92ZihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgdTggdmZpZCkKK3N0YXRpYyB2b2lkIHFlZF9pb3ZfY2xlYW5fdmYoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHU4IHZmaWQpCiB7CiAJc3RydWN0IHFlZF9wdWJsaWNfdmZfaW5mbyAqdmZfaW5mbzsKIApAQCAtMTI0MSw2ICsxMjQwLDE2IEBACiAJCQkgICBwX3JlcS0+bnVtX3ZsYW5fZmlsdGVycywKIAkJCSAgIHBfcmVzcC0+bnVtX3ZsYW5fZmlsdGVycywKIAkJCSAgIHBfcmVxLT5udW1fbWNfZmlsdGVycywgcF9yZXNwLT5udW1fbWNfZmlsdGVycyk7CisKKwkJLyogU29tZSBsZWdhY3kgT1NlcyBhcmUgaW5jYXBhYmxlIG9mIGNvcnJlY3RseSBoYW5kbGluZyB0aGlzCisJCSAqIGZhaWx1cmUuCisJCSAqLworCQlpZiAoKHBfdmYtPmFjcXVpcmUudmZkZXZfaW5mby5ldGhfZnBfaHNpX21pbm9yID09CisJCSAgICAgRVRIX0hTSV9WRVJfTk9fUEtUX0xFTl9UVU5OKSAmJgorCQkgICAgKHBfdmYtPmFjcXVpcmUudmZkZXZfaW5mby5vc190eXBlID09CisJCSAgICAgVkZQRl9BQ1FVSVJFX09TX1dJTkRPV1MpKQorCQkJcmV0dXJuIFBGVkZfU1RBVFVTX1NVQ0NFU1M7CisKIAkJcmV0dXJuIFBGVkZfU1RBVFVTX05PX1JFU09VUkNFOwogCX0KIApAQCAtMTI4MCwyMiArMTI4OSw0MiBAQAogCiAJbWVtc2V0KHJlc3AsIDAsIHNpemVvZigqcmVzcCkpOwogCisJLyogV3JpdGUgdGhlIFBGIHZlcnNpb24gc28gdGhhdCBWRiB3b3VsZCBrbm93IHdoaWNoIHZlcnNpb24KKwkgKiBpcyBzdXBwb3J0ZWQgLSBtaWdodCBiZSBsYXRlciBvdmVycmlkZW4uIFRoaXMgZ3VhcmFudGVlcyB0aGF0CisJICogVkYgY291bGQgcmVjb2duaXplIGxlZ2FjeSBQRiBiYXNlZCBvbiBsYWNrIG9mIHZlcnNpb25zIGluIHJlcGx5LgorCSAqLworCXBmZGV2X2luZm8tPm1ham9yX2ZwX2hzaSA9IEVUSF9IU0lfVkVSX01BSk9SOworCXBmZGV2X2luZm8tPm1pbm9yX2ZwX2hzaSA9IEVUSF9IU0lfVkVSX01JTk9SOworCisJaWYgKHZmLT5zdGF0ZSAhPSBWRl9GUkVFICYmIHZmLT5zdGF0ZSAhPSBWRl9TVE9QUEVEKSB7CisJCURQX1ZFUkJPU0UocF9od2ZuLAorCQkJICAgUUVEX01TR19JT1YsCisJCQkgICAiVkZbJWRdIHNlbnQgQUNRVUlSRSBidXQgaXMgYWxyZWFkeSBpbiBzdGF0ZSAlZCAtIGZhaWwgcmVxdWVzdFxuIiwKKwkJCSAgIHZmLT5hYnNfdmZfaWQsIHZmLT5zdGF0ZSk7CisJCWdvdG8gb3V0OworCX0KKwogCS8qIFZhbGlkYXRlIEZXIGNvbXBhdGliaWxpdHkgKi8KIAlpZiAocmVxLT52ZmRldl9pbmZvLmV0aF9mcF9oc2lfbWFqb3IgIT0gRVRIX0hTSV9WRVJfTUFKT1IpIHsKLQkJRFBfSU5GTyhwX2h3Zm4sCi0JCQkiVkZbJWRdIG5lZWRzIGZhc3RwYXRoIEhTSSAlMDJ4LiUwMngsIHdoaWNoIGlzIGluY29tcGF0aWJsZSB3aXRoIGxvYWRlZCBGVydzIGZhc3BhdGggSFNJICUwMnguJTAyeFxuIiwKLQkJCXZmLT5hYnNfdmZfaWQsCi0JCQlyZXEtPnZmZGV2X2luZm8uZXRoX2ZwX2hzaV9tYWpvciwKLQkJCXJlcS0+dmZkZXZfaW5mby5ldGhfZnBfaHNpX21pbm9yLAotCQkJRVRIX0hTSV9WRVJfTUFKT1IsIEVUSF9IU0lfVkVSX01JTk9SKTsKKwkJaWYgKHJlcS0+dmZkZXZfaW5mby5jYXBhYmlsaXRpZXMgJgorCQkgICAgVkZQRl9BQ1FVSVJFX0NBUF9QUkVfRlBfSFNJKSB7CisJCQlzdHJ1Y3QgdmZfcGZfdmZkZXZfaW5mbyAqcF92ZmRldiA9ICZyZXEtPnZmZGV2X2luZm87CiAKLQkJLyogV3JpdGUgdGhlIFBGIHZlcnNpb24gc28gdGhhdCBWRiB3b3VsZCBrbm93IHdoaWNoIHZlcnNpb24KLQkJICogaXMgc3VwcG9ydGVkLgotCQkgKi8KLQkJcGZkZXZfaW5mby0+bWFqb3JfZnBfaHNpID0gRVRIX0hTSV9WRVJfTUFKT1I7Ci0JCXBmZGV2X2luZm8tPm1pbm9yX2ZwX2hzaSA9IEVUSF9IU0lfVkVSX01JTk9SOworCQkJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfSU9WLAorCQkJCSAgICJWRlslZF0gaXMgcHJlLWZhc3RwYXRoIEhTSVxuIiwKKwkJCQkgICB2Zi0+YWJzX3ZmX2lkKTsKKwkJCXBfdmZkZXYtPmV0aF9mcF9oc2lfbWFqb3IgPSBFVEhfSFNJX1ZFUl9NQUpPUjsKKwkJCXBfdmZkZXYtPmV0aF9mcF9oc2lfbWlub3IgPSBFVEhfSFNJX1ZFUl9OT19QS1RfTEVOX1RVTk47CisJCX0gZWxzZSB7CisJCQlEUF9JTkZPKHBfaHdmbiwKKwkJCQkiVkZbJWRdIG5lZWRzIGZhc3RwYXRoIEhTSSAlMDJ4LiUwMngsIHdoaWNoIGlzIGluY29tcGF0aWJsZSB3aXRoIGxvYWRlZCBGVydzIGZhc3BhdGggSFNJICUwMnguJTAyeFxuIiwKKwkJCQl2Zi0+YWJzX3ZmX2lkLAorCQkJCXJlcS0+dmZkZXZfaW5mby5ldGhfZnBfaHNpX21ham9yLAorCQkJCXJlcS0+dmZkZXZfaW5mby5ldGhfZnBfaHNpX21pbm9yLAorCQkJCUVUSF9IU0lfVkVSX01BSk9SLCBFVEhfSFNJX1ZFUl9NSU5PUik7CiAKLQkJZ290byBvdXQ7CisJCQlnb3RvIG91dDsKKwkJfQogCX0KIAogCS8qIE9uIDEwMGcgUEZzLCBwcmV2ZW50IG9sZCBWRnMgZnJvbSBsb2FkaW5nICovCkBAIC0xMzM0LDggKzEzNjMsMTEgQEAKIAlwZmRldl9pbmZvLT5md19taW5vciA9IEZXX01JTk9SX1ZFUlNJT047CiAJcGZkZXZfaW5mby0+ZndfcmV2ID0gRldfUkVWSVNJT05fVkVSU0lPTjsKIAlwZmRldl9pbmZvLT5md19lbmcgPSBGV19FTkdJTkVFUklOR19WRVJTSU9OOwotCXBmZGV2X2luZm8tPm1pbm9yX2ZwX2hzaSA9IG1pbl90KHU4LAotCQkJCQkgRVRIX0hTSV9WRVJfTUlOT1IsCisKKwkvKiBJbmNvcnJlY3Qgd2hlbiBsZWdhY3ksIGJ1dCBkb2Vzbid0IG1hdHRlciBhcyBsZWdhY3kgaXNuJ3QgcmVhZGluZworCSAqIHRoaXMgZmllbGQuCisJICovCisJcGZkZXZfaW5mby0+bWlub3JfZnBfaHNpID0gbWluX3QodTgsIEVUSF9IU0lfVkVSX01JTk9SLAogCQkJCQkgcmVxLT52ZmRldl9pbmZvLmV0aF9mcF9oc2lfbWlub3IpOwogCXBmZGV2X2luZm8tPm9zX3R5cGUgPSBWRlBGX0FDUVVJUkVfT1NfTElOVVg7CiAJcWVkX21jcF9nZXRfbWZ3X3ZlcihwX2h3Zm4sIHBfcHR0LCAmcGZkZXZfaW5mby0+bWZ3X3ZlciwgTlVMTCk7CkBAIC0xNDM4LDE0ICsxNDcwLDExIEBACiAKIAkJZmlsdGVyLnR5cGUgPSBRRURfRklMVEVSX1ZMQU47CiAJCWZpbHRlci52bGFuID0gcF92Zi0+c2hhZG93X2NvbmZpZy52bGFuc1tpXS52aWQ7Ci0JCURQX1ZFUkJPU0UocF9od2ZuLAotCQkJICAgUUVEX01TR19JT1YsCisJCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX0lPViwKIAkJCSAgICJSZWNvbmZpZ3VyaW5nIFZMQU4gWzB4JTA0eF0gZm9yIFZGIFslMDR4XVxuIiwKIAkJCSAgIGZpbHRlci52bGFuLCBwX3ZmLT5yZWxhdGl2ZV92Zl9pZCk7Ci0JCXJjID0gcWVkX3NwX2V0aF9maWx0ZXJfdWNhc3QocF9od2ZuLAotCQkJCQkgICAgIHBfdmYtPm9wYXF1ZV9maWQsCi0JCQkJCSAgICAgJmZpbHRlciwKLQkJCQkJICAgICBRRURfU1BRX01PREVfQ0IsIE5VTEwpOworCQlyYyA9IHFlZF9zcF9ldGhfZmlsdGVyX3VjYXN0KHBfaHdmbiwgcF92Zi0+b3BhcXVlX2ZpZCwKKwkJCQkJICAgICAmZmlsdGVyLCBRRURfU1BRX01PREVfQ0IsIE5VTEwpOwogCQlpZiAocmMpIHsKIAkJCURQX05PVElDRShwX2h3Zm4sCiAJCQkJICAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBWTEFOIFslMDR4XSB0byBWRiBbJTA0eF1cbiIsCkBAIC0xNDYzLDcgKzE0OTIsNyBAQAogewogCWludCByYyA9IDA7CiAKLQlpZiAoKGV2ZW50cyAmICgxIDw8IFZMQU5fQUREUl9GT1JDRUQpKSAmJgorCWlmICgoZXZlbnRzICYgQklUKFZMQU5fQUREUl9GT1JDRUQpKSAmJgogCSAgICAhKHBfdmYtPmNvbmZpZ3VyZWRfZmVhdHVyZXMgJiAoMSA8PCBWTEFOX0FERFJfRk9SQ0VEKSkpCiAJCXJjID0gcWVkX2lvdl9yZWNvbmZpZ3VyZV91bmljYXN0X3ZsYW4ocF9od2ZuLCBwX3ZmKTsKIApAQCAtMTQ3OSw3ICsxNTA4LDcgQEAKIAlpZiAoIXBfdmYtPnZwb3J0X2luc3RhbmNlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChldmVudHMgJiAoMSA8PCBNQUNfQUREUl9GT1JDRUQpKSB7CisJaWYgKGV2ZW50cyAmIEJJVChNQUNfQUREUl9GT1JDRUQpKSB7CiAJCS8qIFNpbmNlIHRoZXJlJ3Mgbm8gd2F5IFtjdXJyZW50bHldIG9mIHJlbW92aW5nIHRoZSBNQUMsCiAJCSAqIHdlIGNhbiBhbHdheXMgYXNzdW1lIHRoaXMgbWVhbnMgd2UgbmVlZCB0byBmb3JjZSBpdC4KIAkJICovCkBAIC0xNTAyLDcgKzE1MzEsNyBAQAogCQlwX3ZmLT5jb25maWd1cmVkX2ZlYXR1cmVzIHw9IDEgPDwgTUFDX0FERFJfRk9SQ0VEOwogCX0KIAotCWlmIChldmVudHMgJiAoMSA8PCBWTEFOX0FERFJfRk9SQ0VEKSkgeworCWlmIChldmVudHMgJiBCSVQoVkxBTl9BRERSX0ZPUkNFRCkpIHsKIAkJc3RydWN0IHFlZF9zcF92cG9ydF91cGRhdGVfcGFyYW1zIHZwb3J0X3VwZGF0ZTsKIAkJdTggcmVtb3ZhbDsKIAkJaW50IGk7CkBAIC0xNTcyLDcgKzE2MDEsNyBAQAogCQlpZiAoZmlsdGVyLnZsYW4pCiAJCQlwX3ZmLT5jb25maWd1cmVkX2ZlYXR1cmVzIHw9IDEgPDwgVkxBTl9BRERSX0ZPUkNFRDsKIAkJZWxzZQotCQkJcF92Zi0+Y29uZmlndXJlZF9mZWF0dXJlcyAmPSB+KDEgPDwgVkxBTl9BRERSX0ZPUkNFRCk7CisJCQlwX3ZmLT5jb25maWd1cmVkX2ZlYXR1cmVzICY9IH5CSVQoVkxBTl9BRERSX0ZPUkNFRCk7CiAJfQogCiAJLyogSWYgZm9yY2VkIGZlYXR1cmVzIGFyZSB0ZXJtaW5hdGVkLCB3ZSBuZWVkIHRvIGNvbmZpZ3VyZSB0aGUgc2hhZG93CkBAIC0xNjE5LDggKzE2NDgsNyBAQAogCiAJCXFlZF9pbnRfY2F1X2NvbmZfc2IocF9od2ZuLCBwX3B0dCwKIAkJCQkgICAgc3RhcnQtPnNiX2FkZHJbc2JfaWRdLAotCQkJCSAgICB2Zi0+aWd1X3Nic1tzYl9pZF0sCi0JCQkJICAgIHZmLT5hYnNfdmZfaWQsIDEpOworCQkJCSAgICB2Zi0+aWd1X3Nic1tzYl9pZF0sIHZmLT5hYnNfdmZfaWQsIDEpOwogCX0KIAlxZWRfaW92X2VuYWJsZV92Zl90cmFmZmljKHBfaHdmbiwgcF9wdHQsIHZmKTsKIApAQCAtMTYzMiw3ICsxNjYwLDcgQEAKIAkgKiB2ZnMgdGhhdCB3b3VsZCBzdGlsbCBiZSBmaW5lLCBzaW5jZSB0aGV5IHBhc3NlZCAnMCcgYXMgcGFkZGluZ10uCiAJICovCiAJcF9iaXRtYXAgPSAmdmZfaW5mby0+YnVsbGV0aW4ucF92aXJ0LT52YWxpZF9iaXRtYXA7Ci0JaWYgKCEoKnBfYml0bWFwICYgKDEgPDwgVkZQRl9CVUxMRVRJTl9VTlRBR0dFRF9ERUZBVUxUX0ZPUkNFRCkpKSB7CisJaWYgKCEoKnBfYml0bWFwICYgQklUKFZGUEZfQlVMTEVUSU5fVU5UQUdHRURfREVGQVVMVF9GT1JDRUQpKSkgewogCQl1OCB2Zl9yZXEgPSBzdGFydC0+b25seV91bnRhZ2dlZDsKIAogCQl2Zl9pbmZvLT5idWxsZXRpbi5wX3ZpcnQtPmRlZmF1bHRfb25seV91bnRhZ2dlZCA9IHZmX3JlcTsKQEAgLTE2NTAsOSArMTY3OCwxMCBAQAogCXBhcmFtcy52cG9ydF9pZCA9IHZmLT52cG9ydF9pZDsKIAlwYXJhbXMubWF4X2J1ZmZlcnNfcGVyX2NxZSA9IHN0YXJ0LT5tYXhfYnVmZmVyc19wZXJfY3FlOwogCXBhcmFtcy5tdHUgPSB2Zi0+bXR1OworCXBhcmFtcy5jaGVja19tYWMgPSB0cnVlOwogCiAJcmMgPSBxZWRfc3BfZXRoX3Zwb3J0X3N0YXJ0KHBfaHdmbiwgJnBhcmFtcyk7Ci0JaWYgKHJjICE9IDApIHsKKwlpZiAocmMpIHsKIAkJRFBfRVJSKHBfaHdmbiwKIAkJICAgICAgICJxZWRfaW92X3ZmX21ieF9zdGFydF92cG9ydCByZXR1cm5lZCBlcnJvciAlZFxuIiwgcmMpOwogCQlzdGF0dXMgPSBQRlZGX1NUQVRVU19GQUlMVVJFOwpAQCAtMTY3OSw3ICsxNzA4LDcgQEAKIAl2Zi0+c3Bvb2ZfY2hrID0gZmFsc2U7CiAKIAlyYyA9IHFlZF9zcF92cG9ydF9zdG9wKHBfaHdmbiwgdmYtPm9wYXF1ZV9maWQsIHZmLT52cG9ydF9pZCk7Ci0JaWYgKHJjICE9IDApIHsKKwlpZiAocmMpIHsKIAkJRFBfRVJSKHBfaHdmbiwgInFlZF9pb3ZfdmZfbWJ4X3N0b3BfdnBvcnQgcmV0dXJuZWQgZXJyb3IgJWRcbiIsCiAJCSAgICAgICByYyk7CiAJCXN0YXR1cyA9IFBGVkZfU1RBVFVTX0ZBSUxVUkU7CkBAIC0xNjk1LDIxICsxNzI0LDMyIEBACiAKIHN0YXRpYyB2b2lkIHFlZF9pb3ZfdmZfbWJ4X3N0YXJ0X3J4cV9yZXNwKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAogCQkJCQkgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKLQkJCQkJICBzdHJ1Y3QgcWVkX3ZmX2luZm8gKnZmLCB1OCBzdGF0dXMpCisJCQkJCSAgc3RydWN0IHFlZF92Zl9pbmZvICp2ZiwKKwkJCQkJICB1OCBzdGF0dXMsIGJvb2wgYl9sZWdhY3kpCiB7CiAJc3RydWN0IHFlZF9pb3ZfdmZfbWJ4ICptYnggPSAmdmYtPnZmX21ieDsKIAlzdHJ1Y3QgcGZ2Zl9zdGFydF9xdWV1ZV9yZXNwX3RsdiAqcF90bHY7CiAJc3RydWN0IHZmcGZfc3RhcnRfcnhxX3RsdiAqcmVxOworCXUxNiBsZW5ndGg7CiAKIAltYngtPm9mZnNldCA9ICh1OCAqKW1ieC0+cmVwbHlfdmlydDsKIAorCS8qIFRha2luZyBhIGJpZ2dlciBzdHJ1Y3QgaW5zdGVhZCBvZiBhZGRpbmcgYSBUTFYgdG8gbGlzdCB3YXMgYQorCSAqIG1pc3Rha2UsIGJ1dCBvbmUgd2hpY2ggd2UncmUgbm93IHN0dWNrIHdpdGgsIGFzIHNvbWUgb2xkZXIKKwkgKiBjbGllbnRzIGFzc3VtZSB0aGUgc2l6ZSBvZiB0aGUgcHJldmlvdXMgcmVzcG9uc2UuCisJICovCisJaWYgKCFiX2xlZ2FjeSkKKwkJbGVuZ3RoID0gc2l6ZW9mKCpwX3Rsdik7CisJZWxzZQorCQlsZW5ndGggPSBzaXplb2Yoc3RydWN0IHBmdmZfZGVmX3Jlc3BfdGx2KTsKKwogCXBfdGx2ID0gcWVkX2FkZF90bHYocF9od2ZuLCAmbWJ4LT5vZmZzZXQsIENIQU5ORUxfVExWX1NUQVJUX1JYUSwKLQkJCSAgICBzaXplb2YoKnBfdGx2KSk7CisJCQkgICAgbGVuZ3RoKTsKIAlxZWRfYWRkX3RsdihwX2h3Zm4sICZtYngtPm9mZnNldCwgQ0hBTk5FTF9UTFZfTElTVF9FTkQsCiAJCSAgICBzaXplb2Yoc3RydWN0IGNoYW5uZWxfbGlzdF9lbmRfdGx2KSk7CiAKIAkvKiBVcGRhdGUgdGhlIFRMViB3aXRoIHRoZSByZXNwb25zZSAqLwotCWlmIChzdGF0dXMgPT0gUEZWRl9TVEFUVVNfU1VDQ0VTUykgeworCWlmICgoc3RhdHVzID09IFBGVkZfU1RBVFVTX1NVQ0NFU1MpICYmICFiX2xlZ2FjeSkgewogCQlyZXEgPSAmbWJ4LT5yZXFfdmlydC0+c3RhcnRfcnhxOwogCQlwX3Rsdi0+b2Zmc2V0ID0gUFhQX1ZGX0JBUjBfU1RBUlRfTVNETV9aT05FX0IgKwogCQkJCW9mZnNldG9mKHN0cnVjdCBtc3Rvcm1fdmZfem9uZSwKQEAgLTE3MTcsNyArMTc1Nyw3IEBACiAJCQkJc2l6ZW9mKHN0cnVjdCBldGhfcnhfcHJvZF9kYXRhKSAqIHJlcS0+cnhfcWlkOwogCX0KIAotCXFlZF9pb3Zfc2VuZF9yZXNwb25zZShwX2h3Zm4sIHBfcHR0LCB2Ziwgc2l6ZW9mKCpwX3RsdiksIHN0YXR1cyk7CisJcWVkX2lvdl9zZW5kX3Jlc3BvbnNlKHBfaHdmbiwgcF9wdHQsIHZmLCBsZW5ndGgsIHN0YXR1cyk7CiB9CiAKIHN0YXRpYyB2b2lkIHFlZF9pb3ZfdmZfbWJ4X3N0YXJ0X3J4cShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKQEAgLTE3MjgsNiArMTc2OCw3IEBACiAJc3RydWN0IHFlZF9pb3ZfdmZfbWJ4ICptYnggPSAmdmYtPnZmX21ieDsKIAl1OCBzdGF0dXMgPSBQRlZGX1NUQVRVU19OT19SRVNPVVJDRTsKIAlzdHJ1Y3QgdmZwZl9zdGFydF9yeHFfdGx2ICpyZXE7CisJYm9vbCBiX2xlZ2FjeV92ZiA9IGZhbHNlOwogCWludCByYzsKIAogCW1lbXNldCgmcGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7CkBAIC0xNzQzLDEzICsxNzg0LDI3IEBACiAJcGFyYW1zLnNiID0gcmVxLT5od19zYjsKIAlwYXJhbXMuc2JfaWR4ID0gcmVxLT5zYl9pbmRleDsKIAorCS8qIExlZ2FjeSBWRnMgaGF2ZSB0aGVpciBQcm9kdWNlcnMgaW4gYSBkaWZmZXJlbnQgbG9jYXRpb24sIHdoaWNoIHRoZXkKKwkgKiBjYWxjdWxhdGUgb24gdGhlaXIgb3duIGFuZCBjbGVhbiB0aGUgcHJvZHVjZXIgcHJpb3IgdG8gdGhpcy4KKwkgKi8KKwlpZiAodmYtPmFjcXVpcmUudmZkZXZfaW5mby5ldGhfZnBfaHNpX21pbm9yID09CisJICAgIEVUSF9IU0lfVkVSX05PX1BLVF9MRU5fVFVOTikgeworCQliX2xlZ2FjeV92ZiA9IHRydWU7CisJfSBlbHNlIHsKKwkJUkVHX1dSKHBfaHdmbiwKKwkJICAgICAgIEdUVF9CQVIwX01BUF9SRUdfTVNETV9SQU0gKworCQkgICAgICAgTVNUT1JNX0VUSF9WRl9QUk9EU19PRkZTRVQodmYtPmFic192Zl9pZCwgcmVxLT5yeF9xaWQpLAorCQkgICAgICAgMCk7CisJfQorCiAJcmMgPSBxZWRfc3BfZXRoX3J4cV9zdGFydF9yYW1yb2QocF9od2ZuLCB2Zi0+b3BhcXVlX2ZpZCwKIAkJCQkJIHZmLT52Zl9xdWV1ZXNbcmVxLT5yeF9xaWRdLmZ3X2NpZCwKIAkJCQkJICZwYXJhbXMsCiAJCQkJCSB2Zi0+YWJzX3ZmX2lkICsgMHgxMCwKIAkJCQkJIHJlcS0+YmRfbWF4X2J5dGVzLAogCQkJCQkgcmVxLT5yeHFfYWRkciwKLQkJCQkJIHJlcS0+Y3FlX3BibF9hZGRyLCByZXEtPmNxZV9wYmxfc2l6ZSk7CisJCQkJCSByZXEtPmNxZV9wYmxfYWRkciwgcmVxLT5jcWVfcGJsX3NpemUsCisJCQkJCSBiX2xlZ2FjeV92Zik7CiAKIAlpZiAocmMpIHsKIAkJc3RhdHVzID0gUEZWRl9TVEFUVVNfRkFJTFVSRTsKQEAgLTE3NjAsNyArMTgxNSw3IEBACiAJfQogCiBvdXQ6Ci0JcWVkX2lvdl92Zl9tYnhfc3RhcnRfcnhxX3Jlc3AocF9od2ZuLCBwX3B0dCwgdmYsIHN0YXR1cyk7CisJcWVkX2lvdl92Zl9tYnhfc3RhcnRfcnhxX3Jlc3AocF9od2ZuLCBwX3B0dCwgdmYsIHN0YXR1cywgYl9sZWdhY3lfdmYpOwogfQogCiBzdGF0aWMgdm9pZCBxZWRfaW92X3ZmX21ieF9zdGFydF90eHFfcmVzcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKQEAgLTE3NjksMjMgKzE4MjQsMzggQEAKIHsKIAlzdHJ1Y3QgcWVkX2lvdl92Zl9tYnggKm1ieCA9ICZwX3ZmLT52Zl9tYng7CiAJc3RydWN0IHBmdmZfc3RhcnRfcXVldWVfcmVzcF90bHYgKnBfdGx2OworCWJvb2wgYl9sZWdhY3kgPSBmYWxzZTsKKwl1MTYgbGVuZ3RoOwogCiAJbWJ4LT5vZmZzZXQgPSAodTggKiltYngtPnJlcGx5X3ZpcnQ7CiAKKwkvKiBUYWtpbmcgYSBiaWdnZXIgc3RydWN0IGluc3RlYWQgb2YgYWRkaW5nIGEgVExWIHRvIGxpc3Qgd2FzIGEKKwkgKiBtaXN0YWtlLCBidXQgb25lIHdoaWNoIHdlJ3JlIG5vdyBzdHVjayB3aXRoLCBhcyBzb21lIG9sZGVyCisJICogY2xpZW50cyBhc3N1bWUgdGhlIHNpemUgb2YgdGhlIHByZXZpb3VzIHJlc3BvbnNlLgorCSAqLworCWlmIChwX3ZmLT5hY3F1aXJlLnZmZGV2X2luZm8uZXRoX2ZwX2hzaV9taW5vciA9PQorCSAgICBFVEhfSFNJX1ZFUl9OT19QS1RfTEVOX1RVTk4pCisJCWJfbGVnYWN5ID0gdHJ1ZTsKKworCWlmICghYl9sZWdhY3kpCisJCWxlbmd0aCA9IHNpemVvZigqcF90bHYpOworCWVsc2UKKwkJbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBwZnZmX2RlZl9yZXNwX3Rsdik7CisKIAlwX3RsdiA9IHFlZF9hZGRfdGx2KHBfaHdmbiwgJm1ieC0+b2Zmc2V0LCBDSEFOTkVMX1RMVl9TVEFSVF9UWFEsCi0JCQkgICAgc2l6ZW9mKCpwX3RsdikpOworCQkJICAgIGxlbmd0aCk7CiAJcWVkX2FkZF90bHYocF9od2ZuLCAmbWJ4LT5vZmZzZXQsIENIQU5ORUxfVExWX0xJU1RfRU5ELAogCQkgICAgc2l6ZW9mKHN0cnVjdCBjaGFubmVsX2xpc3RfZW5kX3RsdikpOwogCiAJLyogVXBkYXRlIHRoZSBUTFYgd2l0aCB0aGUgcmVzcG9uc2UgKi8KLQlpZiAoc3RhdHVzID09IFBGVkZfU1RBVFVTX1NVQ0NFU1MpIHsKKwlpZiAoKHN0YXR1cyA9PSBQRlZGX1NUQVRVU19TVUNDRVNTKSAmJiAhYl9sZWdhY3kpIHsKIAkJdTE2IHFpZCA9IG1ieC0+cmVxX3ZpcnQtPnN0YXJ0X3R4cS50eF9xaWQ7CiAKLQkJcF90bHYtPm9mZnNldCA9IHFlZF9kYl9hZGRyKHBfdmYtPnZmX3F1ZXVlc1txaWRdLmZ3X2NpZCwKLQkJCQkJICAgIERRX0RFTVNfTEVHQUNZKTsKKwkJcF90bHYtPm9mZnNldCA9IHFlZF9kYl9hZGRyX3ZmKHBfdmYtPnZmX3F1ZXVlc1txaWRdLmZ3X2NpZCwKKwkJCQkJICAgICAgIERRX0RFTVNfTEVHQUNZKTsKIAl9CiAKLQlxZWRfaW92X3NlbmRfcmVzcG9uc2UocF9od2ZuLCBwX3B0dCwgcF92Ziwgc2l6ZW9mKCpwX3RsdiksIHN0YXR1cyk7CisJcWVkX2lvdl9zZW5kX3Jlc3BvbnNlKHBfaHdmbiwgcF9wdHQsIHBfdmYsIGxlbmd0aCwgc3RhdHVzKTsKIH0KIAogc3RhdGljIHZvaWQgcWVkX2lvdl92Zl9tYnhfc3RhcnRfdHhxKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLApAQCAtMjA0NSw3ICsyMTE1LDcgQEAKIAlwX3ZmLT5zaGFkb3dfY29uZmlnLmlubmVyX3ZsYW5fcmVtb3ZhbCA9IHBfdmxhbl90bHYtPnJlbW92ZV92bGFuOwogCiAJLyogSWdub3JlIHRoZSBWRiByZXF1ZXN0IGlmIHdlJ3JlIGZvcmNpbmcgYSB2bGFuICovCi0JaWYgKCEocF92Zi0+Y29uZmlndXJlZF9mZWF0dXJlcyAmICgxIDw8IFZMQU5fQUREUl9GT1JDRUQpKSkgeworCWlmICghKHBfdmYtPmNvbmZpZ3VyZWRfZmVhdHVyZXMgJiBCSVQoVkxBTl9BRERSX0ZPUkNFRCkpKSB7CiAJCXBfZGF0YS0+dXBkYXRlX2lubmVyX3ZsYW5fcmVtb3ZhbF9mbGcgPSAxOwogCQlwX2RhdGEtPmlubmVyX3ZsYW5fcmVtb3ZhbF9mbGcgPSBwX3ZsYW5fdGx2LT5yZW1vdmVfdmxhbjsKIAl9CkBAIC0yMzQwLDcgKzI0MTAsNyBAQAogCS8qIEluIGZvcmNlZCBtb2RlLCB3ZSdyZSB3aWxsaW5nIHRvIHJlbW92ZSBlbnRyaWVzIC0gYnV0IHdlIGRvbid0IGFkZAogCSAqIG5ldyBvbmVzLgogCSAqLwotCWlmIChwX3ZmLT5idWxsZXRpbi5wX3ZpcnQtPnZhbGlkX2JpdG1hcCAmICgxIDw8IFZMQU5fQUREUl9GT1JDRUQpKQorCWlmIChwX3ZmLT5idWxsZXRpbi5wX3ZpcnQtPnZhbGlkX2JpdG1hcCAmIEJJVChWTEFOX0FERFJfRk9SQ0VEKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAocF9wYXJhbXMtPm9wY29kZSA9PSBRRURfRklMVEVSX0FERCB8fApAQCAtMjM3NCw3ICsyNDQ0LDcgQEAKIAlpbnQgaTsKIAogCS8qIElmIHdlJ3JlIGluIGZvcmNlZC1tb2RlLCB3ZSBkb24ndCBhbGxvdyBhbnkgY2hhbmdlICovCi0JaWYgKHBfdmYtPmJ1bGxldGluLnBfdmlydC0+dmFsaWRfYml0bWFwICYgKDEgPDwgTUFDX0FERFJfRk9SQ0VEKSkKKwlpZiAocF92Zi0+YnVsbGV0aW4ucF92aXJ0LT52YWxpZF9iaXRtYXAgJiBCSVQoTUFDX0FERFJfRk9SQ0VEKSkKIAkJcmV0dXJuIDA7CiAKIAkvKiBGaXJzdCByZW1vdmUgZW50cmllcyBhbmQgdGhlbiBhZGQgbmV3IG9uZXMgKi8KQEAgLTI0NDEsOCArMjUxMSw4IEBACiAJcmV0dXJuIHJjOwogfQogCi1pbnQgcWVkX2lvdl9jaGtfdWNhc3Qoc3RydWN0IHFlZF9od2ZuICpod2ZuLAotCQkgICAgICBpbnQgdmZpZCwgc3RydWN0IHFlZF9maWx0ZXJfdWNhc3QgKnBhcmFtcykKK3N0YXRpYyBpbnQgcWVkX2lvdl9jaGtfdWNhc3Qoc3RydWN0IHFlZF9od2ZuICpod2ZuLAorCQkJICAgICBpbnQgdmZpZCwgc3RydWN0IHFlZF9maWx0ZXJfdWNhc3QgKnBhcmFtcykKIHsKIAlzdHJ1Y3QgcWVkX3B1YmxpY192Zl9pbmZvICp2ZjsKIApAQCAtMjUwOSw3ICsyNTc5LDcgQEAKIAl9CiAKIAkvKiBEZXRlcm1pbmUgaWYgdGhlIHVuaWNhc3QgZmlsdGVyaW5nIGlzIGFjY2VwdGlibGUgYnkgUEYgKi8KLQlpZiAoKHBfYnVsbGV0aW4tPnZhbGlkX2JpdG1hcCAmICgxIDw8IFZMQU5fQUREUl9GT1JDRUQpKSAmJgorCWlmICgocF9idWxsZXRpbi0+dmFsaWRfYml0bWFwICYgQklUKFZMQU5fQUREUl9GT1JDRUQpKSAmJgogCSAgICAocGFyYW1zLnR5cGUgPT0gUUVEX0ZJTFRFUl9WTEFOIHx8CiAJICAgICBwYXJhbXMudHlwZSA9PSBRRURfRklMVEVSX01BQ19WTEFOKSkgewogCQkvKiBPbmNlIFZMQU4gaXMgZm9yY2VkIG9yIFBWSUQgaXMgc2V0LCBkbyBub3QgYWxsb3cKQEAgLTI1MjEsNyArMjU5MSw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWlmICgocF9idWxsZXRpbi0+dmFsaWRfYml0bWFwICYgKDEgPDwgTUFDX0FERFJfRk9SQ0VEKSkgJiYKKwlpZiAoKHBfYnVsbGV0aW4tPnZhbGlkX2JpdG1hcCAmIEJJVChNQUNfQUREUl9GT1JDRUQpKSAmJgogCSAgICAocGFyYW1zLnR5cGUgPT0gUUVEX0ZJTFRFUl9NQUMgfHwKIAkgICAgIHBhcmFtcy50eXBlID09IFFFRF9GSUxURVJfTUFDX1ZMQU4pKSB7CiAJCWlmICghZXRoZXJfYWRkcl9lcXVhbChwX2J1bGxldGluLT5tYWMsIHBhcmFtcy5tYWMpIHx8CkBAIC0yNzQ5LDcgKzI4MTksNyBAQAogCQkvKiBNYXJrIFZGIGZvciBhY2sgYW5kIGNsZWFuIHBlbmRpbmcgc3RhdGUgKi8KIAkJaWYgKHBfdmYtPnN0YXRlID09IFZGX1JFU0VUKQogCQkJcF92Zi0+c3RhdGUgPSBWRl9TVE9QUEVEOwotCQlhY2tfdmZzW3ZmaWQgLyAzMl0gfD0gKDEgPDwgKHZmaWQgJSAzMikpOworCQlhY2tfdmZzW3ZmaWQgLyAzMl0gfD0gQklUKCh2ZmlkICUgMzIpKTsKIAkJcF9od2ZuLT5wZl9pb3ZfaW5mby0+cGVuZGluZ19mbHJbcmVsX3ZmX2lkIC8gNjRdICY9CiAJCSAgICB+KDFVTEwgPDwgKHJlbF92Zl9pZCAlIDY0KSk7CiAJCXBfaHdmbi0+cGZfaW92X2luZm8tPnBlbmRpbmdfZXZlbnRzW3JlbF92Zl9pZCAvIDY0XSAmPQpAQCAtMjc1OSw3ICsyODI5LDggQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludCBxZWRfaW92X3ZmX2Zscl9jbGVhbnVwKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCitzdGF0aWMgaW50CitxZWRfaW92X3ZmX2Zscl9jbGVhbnVwKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCiB7CiAJdTMyIGFja192ZnNbVkZfTUFYX1NUQVRJQyAvIDMyXTsKIAlpbnQgcmMgPSAwOwpAQCAtMjgwNSw3ICsyODc2LDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCXZmaWQgPSBwX3ZmLT5hYnNfdmZfaWQ7Ci0JCWlmICgoMSA8PCAodmZpZCAlIDMyKSkgJiBwX2Rpc2FibGVkX3Zmc1t2ZmlkIC8gMzJdKSB7CisJCWlmIChCSVQoKHZmaWQgJSAzMikpICYgcF9kaXNhYmxlZF92ZnNbdmZpZCAvIDMyXSkgewogCQkJdTY0ICpwX2ZsciA9IHBfaHdmbi0+cGZfaW92X2luZm8tPnBlbmRpbmdfZmxyOwogCQkJdTE2IHJlbF92Zl9pZCA9IHBfdmYtPnJlbGF0aXZlX3ZmX2lkOwogCkBAIC0yOTQ2LDcgKzMwMTcsNyBAQAogCX0KIH0KIAotdm9pZCBxZWRfaW92X3BmX2FkZF9wZW5kaW5nX2V2ZW50cyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgdTggdmZpZCkKK3N0YXRpYyB2b2lkIHFlZF9pb3ZfcGZfYWRkX3BlbmRpbmdfZXZlbnRzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCB1OCB2ZmlkKQogewogCXU2NCBhZGRfYml0ID0gMVVMTCA8PCAodmZpZCAlIDY0KTsKIApAQCAtMzA2NCwxNCArMzEzNSwxMyBAQAogCiAJdmZfaW5mby0+YnVsbGV0aW4ucF92aXJ0LT52YWxpZF9iaXRtYXAgfD0gZmVhdHVyZTsKIAkvKiBGb3JjZWQgTUFDIHdpbGwgZGlzYWJsZSBNQUNfQUREUiAqLwotCXZmX2luZm8tPmJ1bGxldGluLnBfdmlydC0+dmFsaWRfYml0bWFwICY9Ci0JCQkJfigxIDw8IFZGUEZfQlVMTEVUSU5fTUFDX0FERFIpOworCXZmX2luZm8tPmJ1bGxldGluLnBfdmlydC0+dmFsaWRfYml0bWFwICY9IH5CSVQoVkZQRl9CVUxMRVRJTl9NQUNfQUREUik7CiAKIAlxZWRfaW92X2NvbmZpZ3VyZV92cG9ydF9mb3JjZWQocF9od2ZuLCB2Zl9pbmZvLCBmZWF0dXJlKTsKIH0KIAotdm9pZCBxZWRfaW92X2J1bGxldGluX3NldF9mb3JjZWRfdmxhbihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCQkgICAgICB1MTYgcHZpZCwgaW50IHZmaWQpCitzdGF0aWMgdm9pZCBxZWRfaW92X2J1bGxldGluX3NldF9mb3JjZWRfdmxhbihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICAgICB1MTYgcHZpZCwgaW50IHZmaWQpCiB7CiAJc3RydWN0IHFlZF92Zl9pbmZvICp2Zl9pbmZvOwogCXU2NCBmZWF0dXJlOwpAQCAtMzEwNCw3ICszMTc0LDcgQEAKIAlyZXR1cm4gISFwX3ZmX2luZm8tPnZwb3J0X2luc3RhbmNlOwogfQogCi1ib29sIHFlZF9pb3ZfaXNfdmZfc3RvcHBlZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgaW50IHZmaWQpCitzdGF0aWMgYm9vbCBxZWRfaW92X2lzX3ZmX3N0b3BwZWQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIGludCB2ZmlkKQogewogCXN0cnVjdCBxZWRfdmZfaW5mbyAqcF92Zl9pbmZvOwogCkBAIC0zMTI2LDcgKzMxOTYsNyBAQAogCXJldHVybiB2Zl9pbmZvLT5zcG9vZl9jaGs7CiB9CiAKLWludCBxZWRfaW92X3Nwb29mY2hrX3NldChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgaW50IHZmaWQsIGJvb2wgdmFsKQorc3RhdGljIGludCBxZWRfaW92X3Nwb29mY2hrX3NldChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgaW50IHZmaWQsIGJvb2wgdmFsKQogewogCXN0cnVjdCBxZWRfdmZfaW5mbyAqdmY7CiAJaW50IHJjID0gLUVJTlZBTDsKQEAgLTMxNjMsMTMgKzMyMzMsMTQgQEAKIAlpZiAoIXBfdmYgfHwgIXBfdmYtPmJ1bGxldGluLnBfdmlydCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlpZiAoIShwX3ZmLT5idWxsZXRpbi5wX3ZpcnQtPnZhbGlkX2JpdG1hcCAmICgxIDw8IE1BQ19BRERSX0ZPUkNFRCkpKQorCWlmICghKHBfdmYtPmJ1bGxldGluLnBfdmlydC0+dmFsaWRfYml0bWFwICYgQklUKE1BQ19BRERSX0ZPUkNFRCkpKQogCQlyZXR1cm4gTlVMTDsKIAogCXJldHVybiBwX3ZmLT5idWxsZXRpbi5wX3ZpcnQtPm1hYzsKIH0KIAotdTE2IHFlZF9pb3ZfYnVsbGV0aW5fZ2V0X2ZvcmNlZF92bGFuKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCB1MTYgcmVsX3ZmX2lkKQorc3RhdGljIHUxNgorcWVkX2lvdl9idWxsZXRpbl9nZXRfZm9yY2VkX3ZsYW4oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHUxNiByZWxfdmZfaWQpCiB7CiAJc3RydWN0IHFlZF92Zl9pbmZvICpwX3ZmOwogCkBAIC0zMTc3LDcgKzMyNDgsNyBAQAogCWlmICghcF92ZiB8fCAhcF92Zi0+YnVsbGV0aW4ucF92aXJ0KQogCQlyZXR1cm4gMDsKIAotCWlmICghKHBfdmYtPmJ1bGxldGluLnBfdmlydC0+dmFsaWRfYml0bWFwICYgKDEgPDwgVkxBTl9BRERSX0ZPUkNFRCkpKQorCWlmICghKHBfdmYtPmJ1bGxldGluLnBfdmlydC0+dmFsaWRfYml0bWFwICYgQklUKFZMQU5fQUREUl9GT1JDRUQpKSkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gcF92Zi0+YnVsbGV0aW4ucF92aXJ0LT5wdmlkOwpAQCAtMzIwMSw3ICszMjcyLDggQEAKIAlyZXR1cm4gcWVkX2luaXRfdnBvcnRfcmwocF9od2ZuLCBwX3B0dCwgYWJzX3ZwX2lkLCAodTMyKXZhbCk7CiB9CiAKLWludCBxZWRfaW92X2NvbmZpZ3VyZV9taW5fdHhfcmF0ZShzdHJ1Y3QgcWVkX2RldiAqY2RldiwgaW50IHZmaWQsIHUzMiByYXRlKQorc3RhdGljIGludAorcWVkX2lvdl9jb25maWd1cmVfbWluX3R4X3JhdGUoc3RydWN0IHFlZF9kZXYgKmNkZXYsIGludCB2ZmlkLCB1MzIgcmF0ZSkKIHsKIAlzdHJ1Y3QgcWVkX3ZmX2luZm8gKnZmOwogCXU4IHZwb3J0X2lkOwpAQCAtMzc2MCw3ICszODMyLDggQEAKIAlxZWRfcHR0X3JlbGVhc2UoaHdmbiwgcHR0KTsKIH0KIAotdm9pZCBxZWRfaW92X3BmX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQgcWVkX2lvdl9wZl90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKKwogewogCXN0cnVjdCBxZWRfaHdmbiAqaHdmbiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcWVkX2h3Zm4sCiAJCQkJCSAgICAgaW92X3Rhc2sud29yayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF92Zi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfdmYuYwppbmRleCA5Yjc4MGIzLi5hYmY1YmYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF92Zi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3ZmLmMKQEAgLTQ2LDYgKzQ2LDE3IEBACiAJcmV0dXJuIHBfdGx2OwogfQogCitzdGF0aWMgdm9pZCBxZWRfdmZfcGZfcmVxX2VuZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgaW50IHJlcV9zdGF0dXMpCit7CisJdW5pb24gcGZ2Zl90bHZzICpyZXNwID0gcF9od2ZuLT52Zl9pb3ZfaW5mby0+cGYydmZfcmVwbHk7CisKKwlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19JT1YsCisJCSAgICJWRiByZXF1ZXN0IHN0YXR1cyA9IDB4JXgsIFBGIHJlcGx5IHN0YXR1cyA9IDB4JXhcbiIsCisJCSAgIHJlcV9zdGF0dXMsIHJlc3AtPmRlZmF1bHRfcmVzcC5oZHIuc3RhdHVzKTsKKworCW11dGV4X3VubG9jaygmKHBfaHdmbi0+dmZfaW92X2luZm8tPm11dGV4KSk7Cit9CisKIHN0YXRpYyBpbnQgcWVkX3NlbmRfbXNnMnBmKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCB1OCAqZG9uZSwgdTMyIHJlc3Bfc2l6ZSkKIHsKIAl1bmlvbiB2ZnBmX3RsdnMgKnBfcmVxID0gcF9od2ZuLT52Zl9pb3ZfaW5mby0+dmYycGZfcmVxdWVzdDsKQEAgLTEwMywxNiArMTE0LDEyIEBACiAJCQkgICAiVkYgPC0tIFBGIFRpbWVvdXQgW1R5cGUgJWRdXG4iLAogCQkJICAgcF9yZXEtPmZpcnN0X3Rsdi50bC50eXBlKTsKIAkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gZXhpdDsKIAl9IGVsc2UgewogCQlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19JT1YsCiAJCQkgICAiUEYgcmVzcG9uc2U6ICVkIFtUeXBlICVkXVxuIiwKIAkJCSAgICpkb25lLCBwX3JlcS0+Zmlyc3RfdGx2LnRsLnR5cGUpOwogCX0KIAotZXhpdDoKLQltdXRleF91bmxvY2soJihwX2h3Zm4tPnZmX2lvdl9pbmZvLT5tdXRleCkpOwotCiAJcmV0dXJuIHJjOwogfQogCkBAIC0xOTEsNiArMTk4LDkgQEAKIAkJRFBfVkVSQk9TRShwX2h3Zm4sCiAJCQkgICBRRURfTVNHX0lPViwgImF0dGVtcHRpbmcgdG8gYWNxdWlyZSByZXNvdXJjZXNcbiIpOwogCisJCS8qIENsZWFyIHJlc3BvbnNlIGJ1ZmZlciwgYXMgdGhpcyBtaWdodCBiZSBhIHJlLXNlbmQgKi8KKwkJbWVtc2V0KHBfaW92LT5wZjJ2Zl9yZXBseSwgMCwgc2l6ZW9mKHVuaW9uIHBmdmZfdGx2cykpOworCiAJCS8qIHNlbmQgYWNxdWlyZSByZXF1ZXN0ICovCiAJCXJjID0gcWVkX3NlbmRfbXNnMnBmKHBfaHdmbiwgJnJlc3AtPmhkci5zdGF0dXMsIHNpemVvZigqcmVzcCkpOwogCQlpZiAocmMpCkBAIC0yMDUsOSArMjE1LDEyIEBACiAJCQkvKiBQRiBhZ3JlZXMgdG8gYWxsb2NhdGUgb3VyIHJlc291cmNlcyAqLwogCQkJaWYgKCEocmVzcC0+cGZkZXZfaW5mby5jYXBhYmlsaXRpZXMgJgogCQkJICAgICAgUEZWRl9BQ1FVSVJFX0NBUF9QT1NUX0ZXX09WRVJSSURFKSkgewotCQkJCURQX0lORk8ocF9od2ZuLAotCQkJCQkiUEYgaXMgdXNpbmcgb2xkIGluY29tcGF0aWJsZSBkcml2ZXI7IEVpdGhlciBkb3duZ3JhZGUgZHJpdmVyIG9yIHJlcXVlc3QgcHJvdmlkZXIgdG8gdXBkYXRlIGh5cGVydmlzb3IgdmVyc2lvblxuIik7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJLyogSXQncyBwb3NzaWJsZSBsZWdhY3kgUEYgbWlzdGFrZW5seSBhY2NlcHRlZDsKKwkJCQkgKiBidXQgd2UgZG9uJ3QgY2FyZSAtIHNpbXBseSBtYXJrIGl0IGFzCisJCQkJICogbGVnYWN5IGFuZCBjb250aW51ZS4KKwkJCQkgKi8KKwkJCQlyZXEtPnZmZGV2X2luZm8uY2FwYWJpbGl0aWVzIHw9CisJCQkJICAgIFZGUEZfQUNRVUlSRV9DQVBfUFJFX0ZQX0hTSTsKIAkJCX0KIAkJCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX0lPViwgInJlc291cmNlcyBhY3F1aXJlZFxuIik7CiAJCQlyZXNvdXJjZXNfYWNxdWlyZWQgPSB0cnVlOwpAQCAtMjE1LDI3ICsyMjgsNTUgQEAKIAkJCSAgIGF0dGVtcHRzIDwgVkZfQUNRVUlSRV9USFJFU0gpIHsKIAkJCXFlZF92Zl9wZl9hY3F1aXJlX3JlZHVjZV9yZXNjKHBfaHdmbiwgcF9yZXNjLAogCQkJCQkJICAgICAgJnJlc3AtPnJlc2MpOworCQl9IGVsc2UgaWYgKHJlc3AtPmhkci5zdGF0dXMgPT0gUEZWRl9TVEFUVVNfTk9UX1NVUFBPUlRFRCkgeworCQkJaWYgKHBmZGV2X2luZm8tPm1ham9yX2ZwX2hzaSAmJgorCQkJICAgIChwZmRldl9pbmZvLT5tYWpvcl9mcF9oc2kgIT0gRVRIX0hTSV9WRVJfTUFKT1IpKSB7CisJCQkJRFBfTk9USUNFKHBfaHdmbiwKKwkJCQkJICAiUEYgdXNlcyBhbiBpbmNvbXBhdGlibGUgZmFzdHBhdGggSFNJICUwMnguJTAyeCBbVkYgcmVxdWlyZXMgJTAyeC4lMDJ4XS4gUGxlYXNlIGNoYW5nZSB0byBhIFZGIGRyaXZlciB1c2luZyAlMDJ4Lnh4LlxuIiwKKwkJCQkJICBwZmRldl9pbmZvLT5tYWpvcl9mcF9oc2ksCisJCQkJCSAgcGZkZXZfaW5mby0+bWlub3JfZnBfaHNpLAorCQkJCQkgIEVUSF9IU0lfVkVSX01BSk9SLAorCQkJCQkgIEVUSF9IU0lfVkVSX01JTk9SLAorCQkJCQkgIHBmZGV2X2luZm8tPm1ham9yX2ZwX2hzaSk7CisJCQkJcmMgPSAtRUlOVkFMOworCQkJCWdvdG8gZXhpdDsKKwkJCX0KIAotCQkJLyogQ2xlYXIgcmVzcG9uc2UgYnVmZmVyICovCi0JCQltZW1zZXQocF9pb3YtPnBmMnZmX3JlcGx5LCAwLCBzaXplb2YodW5pb24gcGZ2Zl90bHZzKSk7Ci0JCX0gZWxzZSBpZiAoKHJlc3AtPmhkci5zdGF0dXMgPT0gUEZWRl9TVEFUVVNfTk9UX1NVUFBPUlRFRCkgJiYKLQkJCSAgIHBmZGV2X2luZm8tPm1ham9yX2ZwX2hzaSAmJgotCQkJICAgKHBmZGV2X2luZm8tPm1ham9yX2ZwX2hzaSAhPSBFVEhfSFNJX1ZFUl9NQUpPUikpIHsKLQkJCURQX05PVElDRShwX2h3Zm4sCi0JCQkJICAiUEYgdXNlcyBhbiBpbmNvbXBhdGlibGUgZmFzdHBhdGggSFNJICUwMnguJTAyeCBbVkYgcmVxdWlyZXMgJTAyeC4lMDJ4XS4gUGxlYXNlIGNoYW5nZSB0byBhIFZGIGRyaXZlciB1c2luZyAlMDJ4Lnh4LlxuIiwKLQkJCQkgIHBmZGV2X2luZm8tPm1ham9yX2ZwX2hzaSwKLQkJCQkgIHBmZGV2X2luZm8tPm1pbm9yX2ZwX2hzaSwKLQkJCQkgIEVUSF9IU0lfVkVSX01BSk9SLAotCQkJCSAgRVRIX0hTSV9WRVJfTUlOT1IsIHBmZGV2X2luZm8tPm1ham9yX2ZwX2hzaSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmICghcGZkZXZfaW5mby0+bWFqb3JfZnBfaHNpKSB7CisJCQkJaWYgKHJlcS0+dmZkZXZfaW5mby5jYXBhYmlsaXRpZXMgJgorCQkJCSAgICBWRlBGX0FDUVVJUkVfQ0FQX1BSRV9GUF9IU0kpIHsKKwkJCQkJRFBfTk9USUNFKHBfaHdmbiwKKwkJCQkJCSAgIlBGIHVzZXMgdmVyeSBvbGQgZHJpdmVycy4gUGxlYXNlIGNoYW5nZSB0byBhIFZGIGRyaXZlciB1c2luZyBubyBsYXRlciB0aGFuIDguOC54LnguXG4iKTsKKwkJCQkJcmMgPSAtRUlOVkFMOworCQkJCQlnb3RvIGV4aXQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJRFBfSU5GTyhwX2h3Zm4sCisJCQkJCQkiUEYgaXMgb2xkIC0gdHJ5IHJlLWFjcXVpcmUgdG8gc2VlIGlmIGl0IHN1cHBvcnRzIEZXLXZlcnNpb24gb3ZlcnJpZGVcbiIpOworCQkJCQlyZXEtPnZmZGV2X2luZm8uY2FwYWJpbGl0aWVzIHw9CisJCQkJCSAgICBWRlBGX0FDUVVJUkVfQ0FQX1BSRV9GUF9IU0k7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKworCQkJLyogSWYgUEYvVkYgYXJlIHVzaW5nIHNhbWUgTWFqb3IsIFBGIG11c3QgaGF2ZSBoYWQKKwkJCSAqIGl0J3MgcmVhc29ucy4gU2ltcGx5IGZhaWwuCisJCQkgKi8KKwkJCURQX05PVElDRShwX2h3Zm4sICJQRiByZWplY3RlZCBhY3F1aXNpdGlvbiBieSBWRlxuIik7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlnb3RvIGV4aXQ7CiAJCX0gZWxzZSB7CiAJCQlEUF9FUlIocF9od2ZuLAogCQkJICAgICAgICJQRiByZXR1cm5lZCBlcnJvciAlZCB0byBWRiBhY3F1aXNpdGlvbiByZXF1ZXN0XG4iLAogCQkJICAgICAgIHJlc3AtPmhkci5zdGF0dXMpOwotCQkJcmV0dXJuIC1FQUdBSU47CisJCQlyYyA9IC1FQUdBSU47CisJCQlnb3RvIGV4aXQ7CiAJCX0KIAl9CiAKKwkvKiBNYXJrIHRoZSBQRiBhcyBsZWdhY3ksIGlmIG5lZWRlZCAqLworCWlmIChyZXEtPnZmZGV2X2luZm8uY2FwYWJpbGl0aWVzICYgVkZQRl9BQ1FVSVJFX0NBUF9QUkVfRlBfSFNJKQorCQlwX2lvdi0+Yl9wcmVfZnBfaHNpID0gdHJ1ZTsKKwogCS8qIFVwZGF0ZSBidWxsZXRpbiBib2FyZCBzaXplIHdpdGggcmVzcG9uc2UgZnJvbSBQRiAqLwogCXBfaW92LT5idWxsZXRpbi5zaXplID0gcmVzcC0+YnVsbGV0aW5fc2l6ZTsKIApAQCAtMjUzLDE0ICsyOTQsMTggQEAKIAkJfQogCX0KIAotCWlmIChFVEhfSFNJX1ZFUl9NSU5PUiAmJgorCWlmICghcF9pb3YtPmJfcHJlX2ZwX2hzaSAmJgorCSAgICBFVEhfSFNJX1ZFUl9NSU5PUiAmJgogCSAgICAocmVzcC0+cGZkZXZfaW5mby5taW5vcl9mcF9oc2kgPCBFVEhfSFNJX1ZFUl9NSU5PUikpIHsKIAkJRFBfSU5GTyhwX2h3Zm4sCiAJCQkiUEYgaXMgdXNpbmcgb2xkZXIgZmFzdHBhdGggSFNJOyAlMDJ4LiUwMnggaXMgY29uZmlndXJlZFxuIiwKIAkJCUVUSF9IU0lfVkVSX01BSk9SLCByZXNwLT5wZmRldl9pbmZvLm1pbm9yX2ZwX2hzaSk7CiAJfQogCi0JcmV0dXJuIDA7CitleGl0OgorCXFlZF92Zl9wZl9yZXFfZW5kKHBfaHdmbiwgcmMpOworCisJcmV0dXJuIHJjOwogfQogCiBpbnQgcWVkX3ZmX2h3X3ByZXBhcmUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4pCkBAIC0yODYsMzEgKzMzMSwyMyBAQAogCiAJLyogQWxsb2NhdGUgdmYgc3Jpb3YgaW5mbyAqLwogCXBfaW92ID0ga3phbGxvYyhzaXplb2YoKnBfaW92KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwX2lvdikgewotCQlEUF9OT1RJQ0UocF9od2ZuLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGBzdHJ1Y3QgcWVkX3NyaW92J1xuIik7CisJaWYgKCFwX2lvdikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJLyogQWxsb2NhdGUgdmYycGYgbXNnICovCiAJcF9pb3YtPnZmMnBmX3JlcXVlc3QgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBfaHdmbi0+Y2Rldi0+cGRldi0+ZGV2LAogCQkJCQkJICBzaXplb2YodW5pb24gdmZwZl90bHZzKSwKIAkJCQkJCSAgJnBfaW92LT52ZjJwZl9yZXF1ZXN0X3BoeXMsCiAJCQkJCQkgIEdGUF9LRVJORUwpOwotCWlmICghcF9pb3YtPnZmMnBmX3JlcXVlc3QpIHsKLQkJRFBfTk9USUNFKHBfaHdmbiwKLQkJCSAgIkZhaWxlZCB0byBhbGxvY2F0ZSBgdmYycGZfcmVxdWVzdCcgRE1BIG1lbW9yeVxuIik7CisJaWYgKCFwX2lvdi0+dmYycGZfcmVxdWVzdCkKIAkJZ290byBmcmVlX3BfaW92OwotCX0KIAogCXBfaW92LT5wZjJ2Zl9yZXBseSA9IGRtYV9hbGxvY19jb2hlcmVudCgmcF9od2ZuLT5jZGV2LT5wZGV2LT5kZXYsCiAJCQkJCQlzaXplb2YodW5pb24gcGZ2Zl90bHZzKSwKIAkJCQkJCSZwX2lvdi0+cGYydmZfcmVwbHlfcGh5cywKIAkJCQkJCUdGUF9LRVJORUwpOwotCWlmICghcF9pb3YtPnBmMnZmX3JlcGx5KSB7Ci0JCURQX05PVElDRShwX2h3Zm4sCi0JCQkgICJGYWlsZWQgdG8gYWxsb2NhdGUgYHBmMnZmX3JlcGx5JyBETUEgbWVtb3J5XG4iKTsKKwlpZiAoIXBfaW92LT5wZjJ2Zl9yZXBseSkKIAkJZ290byBmcmVlX3ZmMnBmX3JlcXVlc3Q7Ci0JfQogCiAJRFBfVkVSQk9TRShwX2h3Zm4sCiAJCSAgIFFFRF9NU0dfSU9WLApAQCAtMzQ3LDYgKzM4NCw5IEBACiAKIAlyZXR1cm4gLUVOT01FTTsKIH0KKyNkZWZpbmUgVFNUT1JNX1FaT05FX1NUQVJUICAgUFhQX1ZGX0JBUjBfU1RBUlRfU0RNX1pPTkVfQQorI2RlZmluZSBNU1RPUk1fUVpPTkVfU1RBUlQoZGV2KSAgIChUU1RPUk1fUVpPTkVfU1RBUlQgKwlcCisJCQkJICAgKFRTVE9STV9RWk9ORV9TSVpFICogTlVNX09GX0wyX1FVRVVFUyhkZXYpKSkKIAogaW50IHFlZF92Zl9wZl9yeHFfc3RhcnQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCiAJCQl1OCByeF9xaWQsCkBAIC0zNzQsNiArNDE0LDIxIEBACiAJcmVxLT5iZF9tYXhfYnl0ZXMgPSBiZF9tYXhfYnl0ZXM7CiAJcmVxLT5zdGF0X2lkID0gLTE7CiAKKwkvKiBJZiBQRiBpcyBsZWdhY3ksIHdlJ2xsIG5lZWQgdG8gY2FsY3VsYXRlIHByb2R1Y2VycyBvdXJzZWx2ZXMKKwkgKiBhcyB3ZWxsIGFzIGNsZWFuIHRoZW0uCisJICovCisJaWYgKHBwX3Byb2QgJiYgcF9pb3YtPmJfcHJlX2ZwX2hzaSkgeworCQl1OCBod19xaWQgPSBwX2lvdi0+YWNxdWlyZV9yZXNwLnJlc2MuaHdfcWlkW3J4X3FpZF07CisJCXUzMiBpbml0X3Byb2RfdmFsID0gMDsKKworCQkqcHBfcHJvZCA9ICh1OCBfX2lvbWVtICopcF9od2ZuLT5yZWd2aWV3ICsKKwkJCQkJIE1TVE9STV9RWk9ORV9TVEFSVChwX2h3Zm4tPmNkZXYpICsKKwkJCQkJIGh3X3FpZCAqIE1TVE9STV9RWk9ORV9TSVpFOworCisJCS8qIEluaXQgdGhlIHJjcSwgcnggYmQgYW5kIHJ4IHNnZSAoaWYgdmFsaWQpIHByb2R1Y2VycyB0byAwICovCisJCV9faW50ZXJuYWxfcmFtX3dyKHBfaHdmbiwgKnBwX3Byb2QsIHNpemVvZih1MzIpLAorCQkJCSAgKHUzMiAqKSgmaW5pdF9wcm9kX3ZhbCkpOworCX0KIAkvKiBhZGQgbGlzdCB0ZXJtaW5hdGlvbiB0bHYgKi8KIAlxZWRfYWRkX3RsdihwX2h3Zm4sICZwX2lvdi0+b2Zmc2V0LAogCQkgICAgQ0hBTk5FTF9UTFZfTElTVF9FTkQsIHNpemVvZihzdHJ1Y3QgY2hhbm5lbF9saXN0X2VuZF90bHYpKTsKQEAgLTM4MSwxMyArNDM2LDE1IEBACiAJcmVzcCA9ICZwX2lvdi0+cGYydmZfcmVwbHktPnF1ZXVlX3N0YXJ0OwogCXJjID0gcWVkX3NlbmRfbXNnMnBmKHBfaHdmbiwgJnJlc3AtPmhkci5zdGF0dXMsIHNpemVvZigqcmVzcCkpOwogCWlmIChyYykKLQkJcmV0dXJuIHJjOworCQlnb3RvIGV4aXQ7CiAKLQlpZiAocmVzcC0+aGRyLnN0YXR1cyAhPSBQRlZGX1NUQVRVU19TVUNDRVNTKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocmVzcC0+aGRyLnN0YXR1cyAhPSBQRlZGX1NUQVRVU19TVUNDRVNTKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KIAogCS8qIExlYXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9kdWNlciBmcm9tIHRoZSByZXNwb25zZSAqLwotCWlmIChwcF9wcm9kKSB7CisJaWYgKHBwX3Byb2QgJiYgIXBfaW92LT5iX3ByZV9mcF9oc2kpIHsKIAkJdTMyIGluaXRfcHJvZF92YWwgPSAwOwogCiAJCSpwcF9wcm9kID0gKHU4IF9faW9tZW0gKilwX2h3Zm4tPnJlZ3ZpZXcgKyByZXNwLT5vZmZzZXQ7CkBAIC0zOTksNiArNDU2LDggQEAKIAkJX19pbnRlcm5hbF9yYW1fd3IocF9od2ZuLCAqcHBfcHJvZCwgc2l6ZW9mKHUzMiksCiAJCQkJICAodTMyICopJmluaXRfcHJvZF92YWwpOwogCX0KK2V4aXQ6CisJcWVkX3ZmX3BmX3JlcV9lbmQocF9od2ZuLCByYyk7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC00MjQsMTAgKzQ4MywxNSBAQAogCXJlc3AgPSAmcF9pb3YtPnBmMnZmX3JlcGx5LT5kZWZhdWx0X3Jlc3A7CiAJcmMgPSBxZWRfc2VuZF9tc2cycGYocF9od2ZuLCAmcmVzcC0+aGRyLnN0YXR1cywgc2l6ZW9mKCpyZXNwKSk7CiAJaWYgKHJjKQotCQlyZXR1cm4gcmM7CisJCWdvdG8gZXhpdDsKIAotCWlmIChyZXNwLT5oZHIuc3RhdHVzICE9IFBGVkZfU1RBVFVTX1NVQ0NFU1MpCi0JCXJldHVybiAtRUlOVkFMOworCWlmIChyZXNwLT5oZHIuc3RhdHVzICE9IFBGVkZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCitleGl0OgorCXFlZF92Zl9wZl9yZXFfZW5kKHBfaHdmbiwgcmMpOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtNDcwLDEzICs1MzQsMjcgQEAKIAl9CiAKIAlpZiAocHBfZG9vcmJlbGwpIHsKLQkJKnBwX2Rvb3JiZWxsID0gKHU4IF9faW9tZW0gKilwX2h3Zm4tPmRvb3JiZWxscyArIHJlc3AtPm9mZnNldDsKKwkJLyogTW9kZXJuIFBGcyBwcm92aWRlIHRoZSBhY3R1YWwgb2Zmc2V0cywgd2hpbGUgbGVnYWN5CisJCSAqIHByb3ZpZGVkIG9ubHkgdGhlIHF1ZXVlIGlkLgorCQkgKi8KKwkJaWYgKCFwX2lvdi0+Yl9wcmVfZnBfaHNpKSB7CisJCQkqcHBfZG9vcmJlbGwgPSAodTggX19pb21lbSAqKXBfaHdmbi0+ZG9vcmJlbGxzICsKKwkJCQkJCSAgICAgcmVzcC0+b2Zmc2V0OworCQl9IGVsc2UgeworCQkJdTggY2lkID0gcF9pb3YtPmFjcXVpcmVfcmVzcC5yZXNjLmNpZFt0eF9xdWV1ZV9pZF07CisJCQl1MzIgZGJfYWRkcjsKKworCQkJZGJfYWRkciA9IHFlZF9kYl9hZGRyX3ZmKGNpZCwgRFFfREVNU19MRUdBQ1kpOworCQkJKnBwX2Rvb3JiZWxsID0gKHU4IF9faW9tZW0gKilwX2h3Zm4tPmRvb3JiZWxscyArCisJCQkJCQkgICAgIGRiX2FkZHI7CisJCX0KIAogCQlEUF9WRVJCT1NFKHBfaHdmbiwgUUVEX01TR19JT1YsCiAJCQkgICAiVHhxWzB4JTAyeF06IGRvb3JiZWxsIGF0ICVwIFtvZmZzZXQgMHglMDh4XVxuIiwKIAkJCSAgIHR4X3F1ZXVlX2lkLCAqcHBfZG9vcmJlbGwsIHJlc3AtPm9mZnNldCk7CiAJfQogZXhpdDoKKwlxZWRfdmZfcGZfcmVxX2VuZChwX2h3Zm4sIHJjKTsKIAogCXJldHVybiByYzsKIH0KQEAgLTUwMSwxMCArNTc5LDE1IEBACiAJcmVzcCA9ICZwX2lvdi0+cGYydmZfcmVwbHktPmRlZmF1bHRfcmVzcDsKIAlyYyA9IHFlZF9zZW5kX21zZzJwZihwX2h3Zm4sICZyZXNwLT5oZHIuc3RhdHVzLCBzaXplb2YoKnJlc3ApKTsKIAlpZiAocmMpCi0JCXJldHVybiByYzsKKwkJZ290byBleGl0OwogCi0JaWYgKHJlc3AtPmhkci5zdGF0dXMgIT0gUEZWRl9TVEFUVVNfU1VDQ0VTUykKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHJlc3AtPmhkci5zdGF0dXMgIT0gUEZWRl9TVEFUVVNfU1VDQ0VTUykgeworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKK2V4aXQ6CisJcWVkX3ZmX3BmX3JlcV9lbmQocF9od2ZuLCByYyk7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC01NDMsMTAgKzYyNiwxNSBAQAogCXJlc3AgPSAmcF9pb3YtPnBmMnZmX3JlcGx5LT5kZWZhdWx0X3Jlc3A7CiAJcmMgPSBxZWRfc2VuZF9tc2cycGYocF9od2ZuLCAmcmVzcC0+aGRyLnN0YXR1cywgc2l6ZW9mKCpyZXNwKSk7CiAJaWYgKHJjKQotCQlyZXR1cm4gcmM7CisJCWdvdG8gZXhpdDsKIAotCWlmIChyZXNwLT5oZHIuc3RhdHVzICE9IFBGVkZfU1RBVFVTX1NVQ0NFU1MpCi0JCXJldHVybiAtRUlOVkFMOworCWlmIChyZXNwLT5oZHIuc3RhdHVzICE9IFBGVkZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCitleGl0OgorCXFlZF92Zl9wZl9yZXFfZW5kKHBfaHdmbiwgcmMpOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtNTY3LDEwICs2NTUsMTUgQEAKIAogCXJjID0gcWVkX3NlbmRfbXNnMnBmKHBfaHdmbiwgJnJlc3AtPmhkci5zdGF0dXMsIHNpemVvZigqcmVzcCkpOwogCWlmIChyYykKLQkJcmV0dXJuIHJjOworCQlnb3RvIGV4aXQ7CiAKLQlpZiAocmVzcC0+aGRyLnN0YXR1cyAhPSBQRlZGX1NUQVRVU19TVUNDRVNTKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocmVzcC0+aGRyLnN0YXR1cyAhPSBQRlZGX1NUQVRVU19TVUNDRVNTKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworZXhpdDoKKwlxZWRfdmZfcGZfcmVxX2VuZChwX2h3Zm4sIHJjKTsKIAogCXJldHVybiByYzsKIH0KQEAgLTc3MCwxMyArODYzLDE4IEBACiAKIAlyYyA9IHFlZF9zZW5kX21zZzJwZihwX2h3Zm4sICZyZXNwLT5oZHIuc3RhdHVzLCByZXNwX3NpemUpOwogCWlmIChyYykKLQkJcmV0dXJuIHJjOworCQlnb3RvIGV4aXQ7CiAKLQlpZiAocmVzcC0+aGRyLnN0YXR1cyAhPSBQRlZGX1NUQVRVU19TVUNDRVNTKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocmVzcC0+aGRyLnN0YXR1cyAhPSBQRlZGX1NUQVRVU19TVUNDRVNTKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KIAogCXFlZF92Zl9oYW5kbGVfdnBfdXBkYXRlX3RsdnNfcmVzcChwX2h3Zm4sIHBfcGFyYW1zKTsKIAorZXhpdDoKKwlxZWRfdmZfcGZfcmVxX2VuZChwX2h3Zm4sIHJjKTsKKwogCXJldHVybiByYzsKIH0KIApAQCAtNzk3LDE0ICs4OTUsMTkgQEAKIAlyZXNwID0gJnBfaW92LT5wZjJ2Zl9yZXBseS0+ZGVmYXVsdF9yZXNwOwogCXJjID0gcWVkX3NlbmRfbXNnMnBmKHBfaHdmbiwgJnJlc3AtPmhkci5zdGF0dXMsIHNpemVvZigqcmVzcCkpOwogCWlmIChyYykKLQkJcmV0dXJuIHJjOworCQlnb3RvIGV4aXQ7CiAKLQlpZiAocmVzcC0+aGRyLnN0YXR1cyAhPSBQRlZGX1NUQVRVU19TVUNDRVNTKQotCQlyZXR1cm4gLUVBR0FJTjsKKwlpZiAocmVzcC0+aGRyLnN0YXR1cyAhPSBQRlZGX1NUQVRVU19TVUNDRVNTKSB7CisJCXJjID0gLUVBR0FJTjsKKwkJZ290byBleGl0OworCX0KIAogCXBfaHdmbi0+Yl9pbnRfZW5hYmxlZCA9IDA7CiAKLQlyZXR1cm4gMDsKK2V4aXQ6CisJcWVkX3ZmX3BmX3JlcV9lbmQocF9od2ZuLCByYyk7CisKKwlyZXR1cm4gcmM7CiB9CiAKIGludCBxZWRfdmZfcGZfcmVsZWFzZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbikKQEAgLTgyOCw2ICs5MzEsOCBAQAogCWlmICghcmMgJiYgcmVzcC0+aGRyLnN0YXR1cyAhPSBQRlZGX1NUQVRVU19TVUNDRVNTKQogCQlyYyA9IC1FQUdBSU47CiAKKwlxZWRfdmZfcGZfcmVxX2VuZChwX2h3Zm4sIHJjKTsKKwogCXBfaHdmbi0+Yl9pbnRfZW5hYmxlZCA9IDA7CiAKIAlpZiAocF9pb3YtPnZmMnBmX3JlcXVlc3QpCkBAIC04OTYsMTIgKzEwMDEsMTcgQEAKIAlyZXNwID0gJnBfaW92LT5wZjJ2Zl9yZXBseS0+ZGVmYXVsdF9yZXNwOwogCXJjID0gcWVkX3NlbmRfbXNnMnBmKHBfaHdmbiwgJnJlc3AtPmhkci5zdGF0dXMsIHNpemVvZigqcmVzcCkpOwogCWlmIChyYykKLQkJcmV0dXJuIHJjOworCQlnb3RvIGV4aXQ7CiAKLQlpZiAocmVzcC0+aGRyLnN0YXR1cyAhPSBQRlZGX1NUQVRVU19TVUNDRVNTKQotCQlyZXR1cm4gLUVBR0FJTjsKKwlpZiAocmVzcC0+aGRyLnN0YXR1cyAhPSBQRlZGX1NUQVRVU19TVUNDRVNTKSB7CisJCXJjID0gLUVBR0FJTjsKKwkJZ290byBleGl0OworCX0KIAotCXJldHVybiAwOworZXhpdDoKKwlxZWRfdmZfcGZfcmVxX2VuZChwX2h3Zm4sIHJjKTsKKworCXJldHVybiByYzsKIH0KIAogaW50IHFlZF92Zl9wZl9pbnRfY2xlYW51cChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbikKQEAgLTkyMCwxMiArMTAzMCwxNyBAQAogCiAJcmMgPSBxZWRfc2VuZF9tc2cycGYocF9od2ZuLCAmcmVzcC0+aGRyLnN0YXR1cywgc2l6ZW9mKCpyZXNwKSk7CiAJaWYgKHJjKQotCQlyZXR1cm4gcmM7CisJCWdvdG8gZXhpdDsKIAotCWlmIChyZXNwLT5oZHIuc3RhdHVzICE9IFBGVkZfU1RBVFVTX1NVQ0NFU1MpCi0JCXJldHVybiAtRUlOVkFMOworCWlmIChyZXNwLT5oZHIuc3RhdHVzICE9IFBGVkZfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQogCi0JcmV0dXJuIDA7CitleGl0OgorCXFlZF92Zl9wZl9yZXFfZW5kKHBfaHdmbiwgcmMpOworCisJcmV0dXJuIHJjOwogfQogCiB1MTYgcWVkX3ZmX2dldF9pZ3Vfc2JfaWQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHUxNiBzYl9pZCkKQEAgLTEwNzEsOCArMTE4Niw4IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIHFlZF92Zl9idWxsZXRpbl9nZXRfZm9yY2VkX21hYyhzdHJ1Y3QgcWVkX2h3Zm4gKmh3Zm4sCi0JCQkJICAgIHU4ICpkc3RfbWFjLCB1OCAqcF9pc19mb3JjZWQpCitzdGF0aWMgYm9vbCBxZWRfdmZfYnVsbGV0aW5fZ2V0X2ZvcmNlZF9tYWMoc3RydWN0IHFlZF9od2ZuICpod2ZuLAorCQkJCQkgICB1OCAqZHN0X21hYywgdTggKnBfaXNfZm9yY2VkKQogewogCXN0cnVjdCBxZWRfYnVsbGV0aW5fY29udGVudCAqYnVsbGV0aW47CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3ZmLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF92Zi5oCmluZGV4IGIyM2NlNTguLjM1ZGI3YTI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF92Zi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX3ZmLmgKQEAgLTg2LDcgKzg2LDcgQEAKIAlzdHJ1Y3QgdmZwZl9maXJzdF90bHYgZmlyc3RfdGx2OwogCiAJc3RydWN0IHZmX3BmX3ZmZGV2X2luZm8gewotI2RlZmluZSBWRlBGX0FDUVVJUkVfQ0FQX09CU09MRVRFCSgxIDw8IDApCisjZGVmaW5lIFZGUEZfQUNRVUlSRV9DQVBfUFJFX0ZQX0hTSSAgICAgKDEgPDwgMCkgLyogVkYgcHJlLUZQIGhzaSB2ZXJzaW9uICovCiAjZGVmaW5lIFZGUEZfQUNRVUlSRV9DQVBfMTAwRwkJKDEgPDwgMSkgLyogVkYgY2FuIHN1cHBvcnQgMTAwZyAqLwogCQl1NjQgY2FwYWJpbGl0aWVzOwogCQl1OCBmd19tYWpvcjsKQEAgLTU1MSw2ICs1NTEsMTEgQEAKIAogCS8qIHdlIHNldCBhc2lkZSBhIGNvcHkgb2YgdGhlIGFjcXVpcmUgcmVzcG9uc2UgKi8KIAlzdHJ1Y3QgcGZ2Zl9hY3F1aXJlX3Jlc3BfdGx2IGFjcXVpcmVfcmVzcDsKKworCS8qIEluIGNhc2UgUEYgb3JpZ2luYXRlcyBwcmlvciB0byB0aGUgZnAtaHNpIHZlcnNpb24gY29tcGFyaXNvbiwKKwkgKiB0aGlzIGhhcyB0byBiZSBwcm9wYWdhdGVkIGFzIGl0IGFmZmVjdHMgdGhlIGZhc3RwYXRoLgorCSAqLworCWJvb2wgYl9wcmVfZnBfaHNpOwogfTsKIAogI2lmZGVmIENPTkZJR19RRURfU1JJT1YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWRlL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZGUvTWFrZWZpbGUKaW5kZXggNzRhNDk4NS4uMjhkYzU4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZGUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZGUvTWFrZWZpbGUKQEAgLTIsMyArMiw0IEBACiAKIHFlZGUteSA6PSBxZWRlX21haW4ubyBxZWRlX2V0aHRvb2wubwogcWVkZS0kKENPTkZJR19EQ0IpICs9IHFlZGVfZGNibmwubworcWVkZS0kKENPTkZJR19JTkZJTklCQU5EX1FFRFIpICs9IHFlZGVfcm9jZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkZS9xZWRlLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkZS9xZWRlLmgKaW5kZXggMDJiMDZkNC4uMjhjMGU5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZGUvcWVkZS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWRlL3FlZGUuaApAQCAtMjUsNyArMjUsNyBAQAogCiAjZGVmaW5lIFFFREVfTUFKT1JfVkVSU0lPTgkJOAogI2RlZmluZSBRRURFX01JTk9SX1ZFUlNJT04JCTEwCi0jZGVmaW5lIFFFREVfUkVWSVNJT05fVkVSU0lPTgkJMQorI2RlZmluZSBRRURFX1JFVklTSU9OX1ZFUlNJT04JCTkKICNkZWZpbmUgUUVERV9FTkdJTkVFUklOR19WRVJTSU9OCTIwCiAjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTiBfX3N0cmluZ2lmeShRRURFX01BSk9SX1ZFUlNJT04pICIuIglcCiAJCV9fc3RyaW5naWZ5KFFFREVfTUlOT1JfVkVSU0lPTikgIi4iCQlcCkBAIC0zNiw2ICszNiw4IEBACiAKIHN0cnVjdCBxZWRlX3N0YXRzIHsKIAl1NjQgbm9fYnVmZl9kaXNjYXJkczsKKwl1NjQgcGFja2V0X3Rvb19iaWdfZGlzY2FyZDsKKwl1NjQgdHRsMF9kaXNjYXJkOwogCXU2NCByeF91Y2FzdF9ieXRlczsKIAl1NjQgcnhfbWNhc3RfYnl0ZXM7CiAJdTY0IHJ4X2JjYXN0X2J5dGVzOwpAQCAtMTA0LDYgKzEwNiwxMyBAQAogCWJvb2wgY29uZmlndXJlZDsKIH07CiAKK3N0cnVjdCBxZWRlX3JkbWFfZGV2IHsKKwlzdHJ1Y3QgcWVkcl9kZXYgKnFlZHJfZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CisJc3RydWN0IGxpc3RfaGVhZCByb2NlX2V2ZW50X2xpc3Q7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnJvY2Vfd3E7Cit9OworCiBzdHJ1Y3QgcWVkZV9kZXYgewogCXN0cnVjdCBxZWRfZGV2CQkJKmNkZXY7CiAJc3RydWN0IG5ldF9kZXZpY2UJCSpuZGV2OwpAQCAtMTI0LDE2ICsxMzMsMjIgQEAKIAkJCQkgKGVkZXYpLT5kZXZfaW5mby5udW1fdGMpCiAKIAlzdHJ1Y3QgcWVkZV9mYXN0cGF0aAkJKmZwX2FycmF5OwotCXUxNgkJCQlyZXFfcnNzOwotCXUxNgkJCQludW1fcnNzOworCXU4CQkJCXJlcV9udW1fdHg7CisJdTgJCQkJZnBfbnVtX3R4OworCXU4CQkJCXJlcV9udW1fcng7CisJdTgJCQkJZnBfbnVtX3J4OworCXUxNgkJCQlyZXFfcXVldWVzOworCXUxNgkJCQludW1fcXVldWVzOwogCXU4CQkJCW51bV90YzsKLSNkZWZpbmUgUUVERV9SU1NfQ05UKGVkZXYpCQkoKGVkZXYpLT5udW1fcnNzKQotI2RlZmluZSBRRURFX1RTU19DTlQoZWRldikJCSgoZWRldiktPm51bV9yc3MgKglcCi0JCQkJCSAoZWRldiktPm51bV90YykKLSNkZWZpbmUgUUVERV9UU1NfSURYKGVkZXYsIHR4cWlkeCkJKCh0eHFpZHgpICUgKGVkZXYpLT5udW1fcnNzKQotI2RlZmluZSBRRURFX1RDX0lEWChlZGV2LCB0eHFpZHgpCSgodHhxaWR4KSAvIChlZGV2KS0+bnVtX3JzcykKKyNkZWZpbmUgUUVERV9RVUVVRV9DTlQoZWRldikJKChlZGV2KS0+bnVtX3F1ZXVlcykKKyNkZWZpbmUgUUVERV9SU1NfQ09VTlQoZWRldikJKChlZGV2KS0+bnVtX3F1ZXVlcyAtIChlZGV2KS0+ZnBfbnVtX3R4KQorI2RlZmluZSBRRURFX1RTU19DT1VOVChlZGV2KQkoKChlZGV2KS0+bnVtX3F1ZXVlcyAtIChlZGV2KS0+ZnBfbnVtX3J4KSAqIFwKKwkJCQkgKGVkZXYpLT5udW1fdGMpCisjZGVmaW5lIFFFREVfVFhfSURYKGVkZXYsIHR4cWlkeCkJKChlZGV2KS0+ZnBfbnVtX3J4ICsgKHR4cWlkeCkgJSBcCisJCQkJCSBRRURFX1RTU19DT1VOVChlZGV2KSkKKyNkZWZpbmUgUUVERV9UQ19JRFgoZWRldiwgdHhxaWR4KQkoKHR4cWlkeCkgLyBRRURFX1RTU19DT1VOVChlZGV2KSkKICNkZWZpbmUgUUVERV9UWF9RVUVVRShlZGV2LCB0eHFpZHgpCVwKLQkoJihlZGV2KS0+ZnBfYXJyYXlbUUVERV9UU1NfSURYKChlZGV2KSwgKHR4cWlkeCkpXS50eHFzW1FFREVfVENfSURYKCBcCisJKCYoZWRldiktPmZwX2FycmF5W1FFREVfVFhfSURYKChlZGV2KSwgKHR4cWlkeCkpXS50eHFzW1FFREVfVENfSURYKFwKIAkJCQkJCQkoZWRldiksICh0eHFpZHgpKV0pCiAKIAlzdHJ1Y3QgcWVkX2ludF9pbmZvCQlpbnRfaW5mbzsKQEAgLTE3Nyw2ICsxOTIsOCBAQAogCXVuc2lnbmVkIGxvbmcJCQlzcF9mbGFnczsKIAl1MTYJCQkJdnhsYW5fZHN0X3BvcnQ7CiAJdTE2CQkJCWdlbmV2ZV9kc3RfcG9ydDsKKworCXN0cnVjdCBxZWRlX3JkbWFfZGV2CQlyZG1hX2luZm87CiB9OwogCiBlbnVtIFFFREVfU1RBVEUgewpAQCAtMjM1LDYgKzI1Miw3IEBACiAJdTE2CQkJbnVtX3J4X2J1ZmZlcnM7CiAJdTE2CQkJcnhxX2lkOwogCisJdTY0CQkJcmN2X3BrdHM7CiAJdTY0CQkJcnhfaHdfZXJyb3JzOwogCXU2NAkJCXJ4X2FsbG9jX2Vycm9yczsKIAl1NjQJCQlyeF9pcF9mcmFnczsKQEAgLTI2Myw2ICsyODEsMTAgQEAKIAl1bmlvbiBkYl9wcm9kCQl0eF9kYjsKIAogCXUxNgkJCW51bV90eF9idWZmZXJzOworCXU2NAkJCXhtaXRfcGt0czsKKwl1NjQJCQlzdG9wcGVkX2NudDsKKworCWJvb2wJCQlpc19sZWdhY3k7CiB9OwogCiAjZGVmaW5lIEJEX1VOTUFQX0FERFIoYmQpCQlISUxPX1U2NChsZTMyX3RvX2NwdSgoYmQpLT5hZGRyLmhpKSwgXApAQCAtMjc3LDcgKzI5OSwxMSBAQAogCiBzdHJ1Y3QgcWVkZV9mYXN0cGF0aCB7CiAJc3RydWN0IHFlZGVfZGV2CSplZGV2OwotCXU4CQkJcnNzX2lkOworI2RlZmluZSBRRURFX0ZBU1RQQVRIX1RYCUJJVCgwKQorI2RlZmluZSBRRURFX0ZBU1RQQVRIX1JYCUJJVCgxKQorI2RlZmluZSBRRURFX0ZBU1RQQVRIX0NPTUJJTkVECShRRURFX0ZBU1RQQVRIX1RYIHwgUUVERV9GQVNUUEFUSF9SWCkKKwl1OAkJCXR5cGU7CisJdTgJCQlpZDsKIAlzdHJ1Y3QgbmFwaV9zdHJ1Y3QJbmFwaTsKIAlzdHJ1Y3QgcWVkX3NiX2luZm8JKnNiX2luZm87CiAJc3RydWN0IHFlZGVfcnhfcXVldWUJKnJ4cTsKQEAgLTMzNyw2ICszNjMsNiBAQAogCiAjZGVmaW5lIFFFREVfTUlOX1BLVF9MRU4JNjQKICNkZWZpbmUgUUVERV9SWF9IRFJfU0laRQkyNTYKLSNkZWZpbmUJZm9yX2VhY2hfcnNzKGkpIGZvciAoaSA9IDA7IGkgPCBlZGV2LT5udW1fcnNzOyBpKyspCisjZGVmaW5lCWZvcl9lYWNoX3F1ZXVlKGkpIGZvciAoaSA9IDA7IGkgPCBlZGV2LT5udW1fcXVldWVzOyBpKyspCiAKICNlbmRpZiAvKiBfUUVERV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZGUvcWVkZV9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkZS9xZWRlX2V0aHRvb2wuYwppbmRleCBmODQ5MmNhLi4yNWE5YjI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkZS9xZWRlX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkZS9xZWRlX2V0aHRvb2wuYwpAQCAtMzUsNiArMzUsNyBAQAogCXU2NCBvZmZzZXQ7CiAJY2hhciBzdHJpbmdbRVRIX0dTVFJJTkdfTEVOXTsKIH0gcWVkZV9ycXN0YXRzX2FycltdID0geworCVFFREVfUlFTVEFUKHJjdl9wa3RzKSwKIAlRRURFX1JRU1RBVChyeF9od19lcnJvcnMpLAogCVFFREVfUlFTVEFUKHJ4X2FsbG9jX2Vycm9ycyksCiAJUUVERV9SUVNUQVQocnhfaXBfZnJhZ3MpLApAQCAtNDQsNiArNDUsMjQgQEAKICNkZWZpbmUgUUVERV9SUVNUQVRTX0RBVEEoZGV2LCBzaW5kZXgsIHJxaW5kZXgpIFwKIAkoKigodTY0ICopKCgoY2hhciAqKShkZXYtPmZwX2FycmF5WyhycWluZGV4KV0ucnhxKSkgK1wKIAkJICAgIHFlZGVfcnFzdGF0c19hcnJbKHNpbmRleCldLm9mZnNldCkpKQorI2RlZmluZSBRRURFX1RRU1RBVF9PRkZTRVQoc3RhdF9uYW1lKSBcCisJKG9mZnNldG9mKHN0cnVjdCBxZWRlX3R4X3F1ZXVlLCBzdGF0X25hbWUpKQorI2RlZmluZSBRRURFX1RRU1RBVF9TVFJJTkcoc3RhdF9uYW1lKSAoI3N0YXRfbmFtZSkKKyNkZWZpbmUgUUVERV9UUVNUQVQoc3RhdF9uYW1lKSBcCisJe1FFREVfVFFTVEFUX09GRlNFVChzdGF0X25hbWUpLCBRRURFX1RRU1RBVF9TVFJJTkcoc3RhdF9uYW1lKX0KKyNkZWZpbmUgUUVERV9OVU1fVFFTVEFUUyBBUlJBWV9TSVpFKHFlZGVfdHFzdGF0c19hcnIpCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwl1NjQgb2Zmc2V0OworCWNoYXIgc3RyaW5nW0VUSF9HU1RSSU5HX0xFTl07Cit9IHFlZGVfdHFzdGF0c19hcnJbXSA9IHsKKwlRRURFX1RRU1RBVCh4bWl0X3BrdHMpLAorCVFFREVfVFFTVEFUKHN0b3BwZWRfY250KSwKK307CisKKyNkZWZpbmUgUUVERV9UUVNUQVRTX0RBVEEoZGV2LCBzaW5kZXgsIHRzc2lkLCB0Y2lkKSBcCisJKCooKHU2NCAqKSgoKHZvaWQgKikoJmRldi0+ZnBfYXJyYXlbdHNzaWRdLnR4cXNbdGNpZF0pKSArXAorCQkgICBxZWRlX3Rxc3RhdHNfYXJyWyhzaW5kZXgpXS5vZmZzZXQpKSkKKwogc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAJdTY0IG9mZnNldDsKIAljaGFyIHN0cmluZ1tFVEhfR1NUUklOR19MRU5dOwpAQCAtMTA3LDYgKzEyNiw4IEBACiAJUUVERV9QRl9TVEFUKG1mdGFnX2ZpbHRlcl9kaXNjYXJkcyksCiAJUUVERV9QRl9TVEFUKG1hY19maWx0ZXJfZGlzY2FyZHMpLAogCVFFREVfU1RBVCh0eF9lcnJfZHJvcF9wa3RzKSwKKwlRRURFX1NUQVQodHRsMF9kaXNjYXJkKSwKKwlRRURFX1NUQVQocGFja2V0X3Rvb19iaWdfZGlzY2FyZCksCiAKIAlRRURFX1NUQVQoY29hbGVzY2VkX3BrdHMpLAogCVFFREVfU1RBVChjb2FsZXNjZWRfZXZlbnRzKSwKQEAgLTE1MSwxNyArMTcyLDI5IEBACiB7CiAJaW50IGksIGosIGs7CiAKKwlmb3IgKGkgPSAwLCBrID0gMDsgaSA8IFFFREVfUVVFVUVfQ05UKGVkZXYpOyBpKyspIHsKKwkJaW50IHRjOworCisJCWZvciAoaiA9IDA7IGogPCBRRURFX05VTV9SUVNUQVRTOyBqKyspCisJCQlzcHJpbnRmKGJ1ZiArIChrICsgaikgKiBFVEhfR1NUUklOR19MRU4sCisJCQkJIiVkOiAgICVzIiwgaSwgcWVkZV9ycXN0YXRzX2FycltqXS5zdHJpbmcpOworCQlrICs9IFFFREVfTlVNX1JRU1RBVFM7CisJCWZvciAodGMgPSAwOyB0YyA8IGVkZXYtPm51bV90YzsgdGMrKykgeworCQkJZm9yIChqID0gMDsgaiA8IFFFREVfTlVNX1RRU1RBVFM7IGorKykKKwkJCQlzcHJpbnRmKGJ1ZiArIChrICsgaikgKiBFVEhfR1NUUklOR19MRU4sCisJCQkJCSIlZC4lZDogJXMiLCBpLCB0YywKKwkJCQkJcWVkZV90cXN0YXRzX2FycltqXS5zdHJpbmcpOworCQkJayArPSBRRURFX05VTV9UUVNUQVRTOworCQl9CisJfQorCiAJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBRRURFX05VTV9TVEFUUzsgaSsrKSB7CiAJCWlmIChJU19WRihlZGV2KSAmJiBxZWRlX3N0YXRzX2FycltpXS5wZl9vbmx5KQogCQkJY29udGludWU7Ci0JCXN0cmNweShidWYgKyBqICogRVRIX0dTVFJJTkdfTEVOLAorCQlzdHJjcHkoYnVmICsgKGsgKyBqKSAqIEVUSF9HU1RSSU5HX0xFTiwKIAkJICAgICAgIHFlZGVfc3RhdHNfYXJyW2ldLnN0cmluZyk7CiAJCWorKzsKIAl9Ci0KLQlmb3IgKGsgPSAwOyBrIDwgUUVERV9OVU1fUlFTVEFUUzsgaysrLCBqKyspCi0JCXN0cmNweShidWYgKyBqICogRVRIX0dTVFJJTkdfTEVOLAotCQkgICAgICAgcWVkZV9ycXN0YXRzX2FycltrXS5zdHJpbmcpOwogfQogCiBzdGF0aWMgdm9pZCBxZWRlX2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICpidWYpCkBAIC0xOTcsMTkgKzIzMCwzMCBAQAogCiAJbXV0ZXhfbG9jaygmZWRldi0+cWVkZV9sb2NrKTsKIAorCWZvciAocWlkID0gMDsgcWlkIDwgUUVERV9RVUVVRV9DTlQoZWRldik7IHFpZCsrKSB7CisJCWludCB0YzsKKworCQlpZiAoZWRldi0+ZnBfYXJyYXlbcWlkXS50eXBlICYgUUVERV9GQVNUUEFUSF9SWCkgeworCQkJZm9yIChzaWR4ID0gMDsgc2lkeCA8IFFFREVfTlVNX1JRU1RBVFM7IHNpZHgrKykKKwkJCQlidWZbY250KytdID0gUUVERV9SUVNUQVRTX0RBVEEoZWRldiwgc2lkeCwgcWlkKTsKKwkJfQorCisJCWlmIChlZGV2LT5mcF9hcnJheVtxaWRdLnR5cGUgJiBRRURFX0ZBU1RQQVRIX1RYKSB7CisJCQlmb3IgKHRjID0gMDsgdGMgPCBlZGV2LT5udW1fdGM7IHRjKyspIHsKKwkJCQlmb3IgKHNpZHggPSAwOyBzaWR4IDwgUUVERV9OVU1fVFFTVEFUUzsgc2lkeCsrKQorCQkJCQlidWZbY250KytdID0gUUVERV9UUVNUQVRTX0RBVEEoZWRldiwKKwkJCQkJCQkJICAgICAgIHNpZHgsCisJCQkJCQkJCSAgICAgICBxaWQsIHRjKTsKKwkJCX0KKwkJfQorCX0KKwogCWZvciAoc2lkeCA9IDA7IHNpZHggPCBRRURFX05VTV9TVEFUUzsgc2lkeCsrKSB7CiAJCWlmIChJU19WRihlZGV2KSAmJiBxZWRlX3N0YXRzX2FycltzaWR4XS5wZl9vbmx5KQogCQkJY29udGludWU7CiAJCWJ1ZltjbnQrK10gPSBRRURFX1NUQVRTX0RBVEEoZWRldiwgc2lkeCk7CiAJfQogCi0JZm9yIChzaWR4ID0gMDsgc2lkeCA8IFFFREVfTlVNX1JRU1RBVFM7IHNpZHgrKykgewotCQlidWZbY250XSA9IDA7Ci0JCWZvciAocWlkID0gMDsgcWlkIDwgZWRldi0+bnVtX3JzczsgcWlkKyspCi0JCQlidWZbY250XSArPSBRRURFX1JRU1RBVFNfREFUQShlZGV2LCBzaWR4LCBxaWQpOwotCQljbnQrKzsKLQl9Ci0KIAltdXRleF91bmxvY2soJmVkZXYtPnFlZGVfbG9jayk7CiB9CiAKQEAgLTIyNyw3ICsyNzEsOCBAQAogCQkJCWlmIChxZWRlX3N0YXRzX2FycltpXS5wZl9vbmx5KQogCQkJCQludW1fc3RhdHMtLTsKIAkJfQotCQlyZXR1cm4gbnVtX3N0YXRzICsgUUVERV9OVU1fUlFTVEFUUzsKKwkJcmV0dXJuIG51bV9zdGF0cyArIFFFREVfUlNTX0NPVU5UKGVkZXYpICogUUVERV9OVU1fUlFTVEFUUyArCisJCSAgICAgICBRRURFX1RTU19DT1VOVChlZGV2KSAqIFFFREVfTlVNX1RRU1RBVFMgKiBlZGV2LT5udW1fdGM7CiAJY2FzZSBFVEhfU1NfUFJJVl9GTEFHUzoKIAkJcmV0dXJuIFFFREVfUFJJX0ZMQUdfTEVOOwogCWNhc2UgRVRIX1NTX1RFU1Q6CkBAIC0yNDksNzggKzI5NCwxNTAgQEAKIAlyZXR1cm4gKCEhKGVkZXYtPmRldl9pbmZvLmNvbW1vbi5udW1faHdmbnMgPiAxKSkgPDwgUUVERV9QUklfRkxBR19DTVQ7CiB9CiAKLXN0YXRpYyBpbnQgcWVkZV9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCitzdHJ1Y3QgcWVkZV9saW5rX21vZGVfbWFwcGluZyB7CisJdTMyIHFlZF9saW5rX21vZGU7CisJdTMyIGV0aHRvb2xfbGlua19tb2RlOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBxZWRlX2xpbmtfbW9kZV9tYXBwaW5nIHFlZF9sbV9tYXBbXSA9IHsKKwl7UUVEX0xNX0ZJQlJFX0JJVCwgRVRIVE9PTF9MSU5LX01PREVfRklCUkVfQklUfSwKKwl7UUVEX0xNX0F1dG9uZWdfQklULCBFVEhUT09MX0xJTktfTU9ERV9BdXRvbmVnX0JJVH0sCisJe1FFRF9MTV9Bc3ltX1BhdXNlX0JJVCwgRVRIVE9PTF9MSU5LX01PREVfQXN5bV9QYXVzZV9CSVR9LAorCXtRRURfTE1fUGF1c2VfQklULCBFVEhUT09MX0xJTktfTU9ERV9QYXVzZV9CSVR9LAorCXtRRURfTE1fMTAwMGJhc2VUX0hhbGZfQklULCBFVEhUT09MX0xJTktfTU9ERV8xMDAwYmFzZVRfSGFsZl9CSVR9LAorCXtRRURfTE1fMTAwMGJhc2VUX0Z1bGxfQklULCBFVEhUT09MX0xJTktfTU9ERV8xMDAwYmFzZVRfRnVsbF9CSVR9LAorCXtRRURfTE1fMTAwMDBiYXNlS1JfRnVsbF9CSVQsIEVUSFRPT0xfTElOS19NT0RFXzEwMDAwYmFzZUtSX0Z1bGxfQklUfSwKKwl7UUVEX0xNXzI1MDAwYmFzZUtSX0Z1bGxfQklULCBFVEhUT09MX0xJTktfTU9ERV8yNTAwMGJhc2VLUl9GdWxsX0JJVH0sCisJe1FFRF9MTV80MDAwMGJhc2VMUjRfRnVsbF9CSVQsIEVUSFRPT0xfTElOS19NT0RFXzQwMDAwYmFzZUxSNF9GdWxsX0JJVH0sCisJe1FFRF9MTV81MDAwMGJhc2VLUjJfRnVsbF9CSVQsIEVUSFRPT0xfTElOS19NT0RFXzUwMDAwYmFzZUtSMl9GdWxsX0JJVH0sCisJe1FFRF9MTV8xMDAwMDBiYXNlS1I0X0Z1bGxfQklULAorCSBFVEhUT09MX0xJTktfTU9ERV8xMDAwMDBiYXNlS1I0X0Z1bGxfQklUfSwKK307CisKKyNkZWZpbmUgUUVERV9EUlZfVE9fRVRIVE9PTF9DQVBTKGNhcHMsIGxrX2tzZXR0aW5ncywgbmFtZSkJXAorewkJCQkJCQkJXAorCWludCBpOwkJCQkJCQlcCisJCQkJCQkJCVwKKwlmb3IgKGkgPSAwOyBpIDwgUUVEX0xNX0NPVU5UOyBpKyspIHsJCQlcCisJCWlmICgoY2FwcykgJiAocWVkX2xtX21hcFtpXS5xZWRfbGlua19tb2RlKSkJXAorCQkJX19zZXRfYml0KHFlZF9sbV9tYXBbaV0uZXRodG9vbF9saW5rX21vZGUsXAorCQkJCSAgbGtfa3NldHRpbmdzLT5saW5rX21vZGVzLm5hbWUpOyBcCisJfQkJCQkJCQlcCit9CisKKyNkZWZpbmUgUUVERV9FVEhUT09MX1RPX0RSVl9DQVBTKGNhcHMsIGxrX2tzZXR0aW5ncywgbmFtZSkJXAorewkJCQkJCQkJXAorCWludCBpOwkJCQkJCQlcCisJCQkJCQkJCVwKKwlmb3IgKGkgPSAwOyBpIDwgUUVEX0xNX0NPVU5UOyBpKyspIHsJCQlcCisJCWlmICh0ZXN0X2JpdChxZWRfbG1fbWFwW2ldLmV0aHRvb2xfbGlua19tb2RlLAlcCisJCQkgICAgIGxrX2tzZXR0aW5ncy0+bGlua19tb2Rlcy5uYW1lKSkJXAorCQkJY2FwcyB8PSBxZWRfbG1fbWFwW2ldLnFlZF9saW5rX21vZGU7CVwKKwl9CQkJCQkJCVwKK30KKworc3RhdGljIGludCBxZWRlX2dldF9saW5rX2tzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCiB7CisJc3RydWN0IGV0aHRvb2xfbGlua19zZXR0aW5ncyAqYmFzZSA9ICZjbWQtPmJhc2U7CiAJc3RydWN0IHFlZGVfZGV2ICplZGV2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgcWVkX2xpbmtfb3V0cHV0IGN1cnJlbnRfbGluazsKIAogCW1lbXNldCgmY3VycmVudF9saW5rLCAwLCBzaXplb2YoY3VycmVudF9saW5rKSk7CiAJZWRldi0+b3BzLT5jb21tb24tPmdldF9saW5rKGVkZXYtPmNkZXYsICZjdXJyZW50X2xpbmspOwogCi0JY21kLT5zdXBwb3J0ZWQgPSBjdXJyZW50X2xpbmsuc3VwcG9ydGVkX2NhcHM7Ci0JY21kLT5hZHZlcnRpc2luZyA9IGN1cnJlbnRfbGluay5hZHZlcnRpc2VkX2NhcHM7CisJZXRodG9vbF9saW5rX2tzZXR0aW5nc196ZXJvX2xpbmtfbW9kZShjbWQsIHN1cHBvcnRlZCk7CisJUUVERV9EUlZfVE9fRVRIVE9PTF9DQVBTKGN1cnJlbnRfbGluay5zdXBwb3J0ZWRfY2FwcywgY21kLCBzdXBwb3J0ZWQpCisKKwlldGh0b29sX2xpbmtfa3NldHRpbmdzX3plcm9fbGlua19tb2RlKGNtZCwgYWR2ZXJ0aXNpbmcpOworCVFFREVfRFJWX1RPX0VUSFRPT0xfQ0FQUyhjdXJyZW50X2xpbmsuYWR2ZXJ0aXNlZF9jYXBzLCBjbWQsIGFkdmVydGlzaW5nKQorCisJZXRodG9vbF9saW5rX2tzZXR0aW5nc196ZXJvX2xpbmtfbW9kZShjbWQsIGxwX2FkdmVydGlzaW5nKTsKKwlRRURFX0RSVl9UT19FVEhUT09MX0NBUFMoY3VycmVudF9saW5rLmxwX2NhcHMsIGNtZCwgbHBfYWR2ZXJ0aXNpbmcpCisKIAlpZiAoKGVkZXYtPnN0YXRlID09IFFFREVfU1RBVEVfT1BFTikgJiYgKGN1cnJlbnRfbGluay5saW5rX3VwKSkgewotCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoY21kLCBjdXJyZW50X2xpbmsuc3BlZWQpOwotCQljbWQtPmR1cGxleCA9IGN1cnJlbnRfbGluay5kdXBsZXg7CisJCWJhc2UtPnNwZWVkID0gY3VycmVudF9saW5rLnNwZWVkOworCQliYXNlLT5kdXBsZXggPSBjdXJyZW50X2xpbmsuZHVwbGV4OwogCX0gZWxzZSB7Ci0JCWNtZC0+ZHVwbGV4ID0gRFVQTEVYX1VOS05PV047Ci0JCWV0aHRvb2xfY21kX3NwZWVkX3NldChjbWQsIFNQRUVEX1VOS05PV04pOworCQliYXNlLT5zcGVlZCA9IFNQRUVEX1VOS05PV047CisJCWJhc2UtPmR1cGxleCA9IERVUExFWF9VTktOT1dOOwogCX0KLQljbWQtPnBvcnQgPSBjdXJyZW50X2xpbmsucG9ydDsKLQljbWQtPmF1dG9uZWcgPSAoY3VycmVudF9saW5rLmF1dG9uZWcpID8gQVVUT05FR19FTkFCTEUgOgotCQkJCQkJQVVUT05FR19ESVNBQkxFOwotCWNtZC0+bHBfYWR2ZXJ0aXNpbmcgPSBjdXJyZW50X2xpbmsubHBfY2FwczsKKwliYXNlLT5wb3J0ID0gY3VycmVudF9saW5rLnBvcnQ7CisJYmFzZS0+YXV0b25lZyA9IChjdXJyZW50X2xpbmsuYXV0b25lZykgPyBBVVRPTkVHX0VOQUJMRSA6CisJCQlBVVRPTkVHX0RJU0FCTEU7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBxZWRlX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3N0YXRpYyBpbnQgcWVkZV9zZXRfbGlua19rc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQogeworCWNvbnN0IHN0cnVjdCBldGh0b29sX2xpbmtfc2V0dGluZ3MgKmJhc2UgPSAmY21kLT5iYXNlOwogCXN0cnVjdCBxZWRlX2RldiAqZWRldiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHFlZF9saW5rX291dHB1dCBjdXJyZW50X2xpbms7CiAJc3RydWN0IHFlZF9saW5rX3BhcmFtcyBwYXJhbXM7Ci0JdTMyIHNwZWVkOwogCiAJaWYgKCFlZGV2LT5vcHMgfHwgIWVkZXYtPm9wcy0+Y29tbW9uLT5jYW5fbGlua19jaGFuZ2UoZWRldi0+Y2RldikpIHsKLQkJRFBfSU5GTyhlZGV2LAotCQkJIkxpbmsgc2V0dGluZ3MgYXJlIG5vdCBhbGxvd2VkIHRvIGJlIGNoYW5nZWRcbiIpOworCQlEUF9JTkZPKGVkZXYsICJMaW5rIHNldHRpbmdzIGFyZSBub3QgYWxsb3dlZCB0byBiZSBjaGFuZ2VkXG4iKTsKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KLQogCW1lbXNldCgmY3VycmVudF9saW5rLCAwLCBzaXplb2YoY3VycmVudF9saW5rKSk7CiAJbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTsKIAllZGV2LT5vcHMtPmNvbW1vbi0+Z2V0X2xpbmsoZWRldi0+Y2RldiwgJmN1cnJlbnRfbGluayk7CiAKLQlzcGVlZCA9IGV0aHRvb2xfY21kX3NwZWVkKGNtZCk7CiAJcGFyYW1zLm92ZXJyaWRlX2ZsYWdzIHw9IFFFRF9MSU5LX09WRVJSSURFX1NQRUVEX0FEVl9TUEVFRFM7CiAJcGFyYW1zLm92ZXJyaWRlX2ZsYWdzIHw9IFFFRF9MSU5LX09WRVJSSURFX1NQRUVEX0FVVE9ORUc7Ci0JaWYgKGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCWlmIChiYXNlLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CiAJCXBhcmFtcy5hdXRvbmVnID0gdHJ1ZTsKIAkJcGFyYW1zLmZvcmNlZF9zcGVlZCA9IDA7Ci0JCXBhcmFtcy5hZHZfc3BlZWRzID0gY21kLT5hZHZlcnRpc2luZzsKLQl9IGVsc2UgeyAvKiBmb3JjZWQgc3BlZWQgKi8KKwkJUUVERV9FVEhUT09MX1RPX0RSVl9DQVBTKHBhcmFtcy5hZHZfc3BlZWRzLCBjbWQsIGFkdmVydGlzaW5nKQorCX0gZWxzZSB7CQkvKiBmb3JjZWQgc3BlZWQgKi8KIAkJcGFyYW1zLm92ZXJyaWRlX2ZsYWdzIHw9IFFFRF9MSU5LX09WRVJSSURFX1NQRUVEX0ZPUkNFRF9TUEVFRDsKIAkJcGFyYW1zLmF1dG9uZWcgPSBmYWxzZTsKLQkJcGFyYW1zLmZvcmNlZF9zcGVlZCA9IHNwZWVkOwotCQlzd2l0Y2ggKHNwZWVkKSB7CisJCXBhcmFtcy5mb3JjZWRfc3BlZWQgPSBiYXNlLT5zcGVlZDsKKwkJc3dpdGNoIChiYXNlLT5zcGVlZCkgewogCQljYXNlIFNQRUVEXzEwMDAwOgogCQkJaWYgKCEoY3VycmVudF9saW5rLnN1cHBvcnRlZF9jYXBzICYKLQkJCSAgICBTVVBQT1JURURfMTAwMDBiYXNlS1JfRnVsbCkpIHsKKwkJCSAgICAgIFFFRF9MTV8xMDAwMGJhc2VLUl9GdWxsX0JJVCkpIHsKIAkJCQlEUF9JTkZPKGVkZXYsICIxMEcgc3BlZWQgbm90IHN1cHBvcnRlZFxuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9Ci0JCQlwYXJhbXMuYWR2X3NwZWVkcyA9IFNVUFBPUlRFRF8xMDAwMGJhc2VLUl9GdWxsOworCQkJcGFyYW1zLmFkdl9zcGVlZHMgPSBRRURfTE1fMTAwMDBiYXNlS1JfRnVsbF9CSVQ7CisJCQlicmVhazsKKwkJY2FzZSBTUEVFRF8yNTAwMDoKKwkJCWlmICghKGN1cnJlbnRfbGluay5zdXBwb3J0ZWRfY2FwcyAmCisJCQkgICAgICBRRURfTE1fMjUwMDBiYXNlS1JfRnVsbF9CSVQpKSB7CisJCQkJRFBfSU5GTyhlZGV2LCAiMjVHIHNwZWVkIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJcGFyYW1zLmFkdl9zcGVlZHMgPSBRRURfTE1fMjUwMDBiYXNlS1JfRnVsbF9CSVQ7CiAJCQlicmVhazsKIAkJY2FzZSBTUEVFRF80MDAwMDoKIAkJCWlmICghKGN1cnJlbnRfbGluay5zdXBwb3J0ZWRfY2FwcyAmCi0JCQkgICAgU1VQUE9SVEVEXzQwMDAwYmFzZUxSNF9GdWxsKSkgeworCQkJICAgICAgUUVEX0xNXzQwMDAwYmFzZUxSNF9GdWxsX0JJVCkpIHsKIAkJCQlEUF9JTkZPKGVkZXYsICI0MEcgc3BlZWQgbm90IHN1cHBvcnRlZFxuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9Ci0JCQlwYXJhbXMuYWR2X3NwZWVkcyA9IFNVUFBPUlRFRF80MDAwMGJhc2VMUjRfRnVsbDsKKwkJCXBhcmFtcy5hZHZfc3BlZWRzID0gUUVEX0xNXzQwMDAwYmFzZUxSNF9GdWxsX0JJVDsKKwkJCWJyZWFrOworCQljYXNlIFNQRUVEXzUwMDAwOgorCQkJaWYgKCEoY3VycmVudF9saW5rLnN1cHBvcnRlZF9jYXBzICYKKwkJCSAgICAgIFFFRF9MTV81MDAwMGJhc2VLUjJfRnVsbF9CSVQpKSB7CisJCQkJRFBfSU5GTyhlZGV2LCAiNTBHIHNwZWVkIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJcGFyYW1zLmFkdl9zcGVlZHMgPSBRRURfTE1fNTAwMDBiYXNlS1IyX0Z1bGxfQklUOworCQkJYnJlYWs7CisJCWNhc2UgU1BFRURfMTAwMDAwOgorCQkJaWYgKCEoY3VycmVudF9saW5rLnN1cHBvcnRlZF9jYXBzICYKKwkJCSAgICAgIFFFRF9MTV8xMDAwMDBiYXNlS1I0X0Z1bGxfQklUKSkgeworCQkJCURQX0lORk8oZWRldiwgIjEwMEcgc3BlZWQgbm90IHN1cHBvcnRlZFxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlwYXJhbXMuYWR2X3NwZWVkcyA9IFFFRF9MTV8xMDAwMDBiYXNlS1I0X0Z1bGxfQklUOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlEUF9JTkZPKGVkZXYsICJVbnN1cHBvcnRlZCBzcGVlZCAldVxuIiwgc3BlZWQpOworCQkJRFBfSU5GTyhlZGV2LCAiVW5zdXBwb3J0ZWQgc3BlZWQgJXVcbiIsIGJhc2UtPnNwZWVkKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQpAQCAtMzY4LDggKzQ4NSw3IEBACiB7CiAJc3RydWN0IHFlZGVfZGV2ICplZGV2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAKLQlyZXR1cm4gKCh1MzIpZWRldi0+ZHBfbGV2ZWwgPDwgUUVEX0xPR19MRVZFTF9TSElGVCkgfAotCSAgICAgICBlZGV2LT5kcF9tb2R1bGU7CisJcmV0dXJuICgodTMyKWVkZXYtPmRwX2xldmVsIDw8IFFFRF9MT0dfTEVWRUxfU0hJRlQpIHwgZWRldi0+ZHBfbW9kdWxlOwogfQogCiBzdGF0aWMgdm9pZCBxZWRlX3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdTMyIGxldmVsKQpAQCAtMzkzLDggKzUwOSw3IEBACiAJc3RydWN0IHFlZF9saW5rX3BhcmFtcyBsaW5rX3BhcmFtczsKIAogCWlmICghZWRldi0+b3BzIHx8ICFlZGV2LT5vcHMtPmNvbW1vbi0+Y2FuX2xpbmtfY2hhbmdlKGVkZXYtPmNkZXYpKSB7Ci0JCURQX0lORk8oZWRldiwKLQkJCSJMaW5rIHNldHRpbmdzIGFyZSBub3QgYWxsb3dlZCB0byBiZSBjaGFuZ2VkXG4iKTsKKwkJRFBfSU5GTyhlZGV2LCAiTGluayBzZXR0aW5ncyBhcmUgbm90IGFsbG93ZWQgdG8gYmUgY2hhbmdlZFxuIik7CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKQEAgLTQ2Nyw3ICs1ODIsNyBAQAogCiAJcnhjID0gKHUxNiljb2FsLT5yeF9jb2FsZXNjZV91c2VjczsKIAl0eGMgPSAodTE2KWNvYWwtPnR4X2NvYWxlc2NlX3VzZWNzOwotCWZvcl9lYWNoX3JzcyhpKSB7CisJZm9yX2VhY2hfcXVldWUoaSkgewogCQlzYl9pZCA9IGVkZXYtPmZwX2FycmF5W2ldLnNiX2luZm8tPmlndV9zYl9pZDsKIAkJcmMgPSBlZGV2LT5vcHMtPmNvbW1vbi0+c2V0X2NvYWxlc2NlKGVkZXYtPmNkZXYsIHJ4YywgdHhjLAogCQkJCQkJICAgICAodTgpaSwgc2JfaWQpOwpAQCAtNTYzLDcgKzY3OCw3IEBACiAJbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTsKIAlwYXJhbXMub3ZlcnJpZGVfZmxhZ3MgfD0gUUVEX0xJTktfT1ZFUlJJREVfUEFVU0VfQ09ORklHOwogCWlmIChlcGF1c2UtPmF1dG9uZWcpIHsKLQkJaWYgKCEoY3VycmVudF9saW5rLnN1cHBvcnRlZF9jYXBzICYgU1VQUE9SVEVEX0F1dG9uZWcpKSB7CisJCWlmICghKGN1cnJlbnRfbGluay5zdXBwb3J0ZWRfY2FwcyAmIFFFRF9MTV9BdXRvbmVnX0JJVCkpIHsKIAkJCURQX0lORk8oZWRldiwgImF1dG9uZWcgbm90IHN1cHBvcnRlZFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtNTgwLDYgKzY5NSwyOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBxZWRlX2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQkJICBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLCB2b2lkICpidWZmZXIpCit7CisJc3RydWN0IHFlZGVfZGV2ICplZGV2ID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwlyZWdzLT52ZXJzaW9uID0gMDsKKwltZW1zZXQoYnVmZmVyLCAwLCByZWdzLT5sZW4pOworCisJaWYgKGVkZXYtPm9wcyAmJiBlZGV2LT5vcHMtPmNvbW1vbikKKwkJZWRldi0+b3BzLT5jb21tb24tPmRiZ19hbGxfZGF0YShlZGV2LT5jZGV2LCBidWZmZXIpOworfQorCitzdGF0aWMgaW50IHFlZGVfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCBxZWRlX2RldiAqZWRldiA9IG5ldGRldl9wcml2KG5kZXYpOworCisJaWYgKGVkZXYtPm9wcyAmJiBlZGV2LT5vcHMtPmNvbW1vbikKKwkJcmV0dXJuIGVkZXYtPm9wcy0+Y29tbW9uLT5kYmdfYWxsX2RhdGFfc2l6ZShlZGV2LT5jZGV2KTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworfQorCiBzdGF0aWMgdm9pZCBxZWRlX3VwZGF0ZV9tdHUoc3RydWN0IHFlZGVfZGV2ICplZGV2LCB1bmlvbiBxZWRlX3JlbG9hZF9hcmdzICphcmdzKQogewogCWVkZXYtPm5kZXYtPm10dSA9IGFyZ3MtPm10dTsKQEAgLTYxOSw0NSArNzU2LDcwIEBACiAJc3RydWN0IHFlZGVfZGV2ICplZGV2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCWNoYW5uZWxzLT5tYXhfY29tYmluZWQgPSBRRURFX01BWF9SU1NfQ05UKGVkZXYpOwotCWNoYW5uZWxzLT5jb21iaW5lZF9jb3VudCA9IFFFREVfUlNTX0NOVChlZGV2KTsKKwljaGFubmVscy0+Y29tYmluZWRfY291bnQgPSBRRURFX1FVRVVFX0NOVChlZGV2KSAtIGVkZXYtPmZwX251bV90eCAtCisJCQkJCWVkZXYtPmZwX251bV9yeDsKKwljaGFubmVscy0+dHhfY291bnQgPSBlZGV2LT5mcF9udW1fdHg7CisJY2hhbm5lbHMtPnJ4X2NvdW50ID0gZWRldi0+ZnBfbnVtX3J4OwogfQogCiBzdGF0aWMgaW50IHFlZGVfc2V0X2NoYW5uZWxzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgICAgIHN0cnVjdCBldGh0b29sX2NoYW5uZWxzICpjaGFubmVscykKIHsKIAlzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiBjb3VudDsKIAogCURQX1ZFUkJPU0UoZWRldiwgKE5FVElGX01TR19JRlVQIHwgTkVUSUZfTVNHX0lGRE9XTiksCiAJCSAgICJzZXQtY2hhbm5lbHMgY29tbWFuZCBwYXJhbWV0ZXJzOiByeCA9ICVkLCB0eCA9ICVkLCBvdGhlciA9ICVkLCBjb21iaW5lZCA9ICVkXG4iLAogCQkgICBjaGFubmVscy0+cnhfY291bnQsIGNoYW5uZWxzLT50eF9jb3VudCwKIAkJICAgY2hhbm5lbHMtPm90aGVyX2NvdW50LCBjaGFubmVscy0+Y29tYmluZWRfY291bnQpOwogCi0JLyogV2UgZG9uJ3Qgc3VwcG9ydCBzZXBhcmF0ZSByeCAvIHR4LCBub3IgYG90aGVyJyBjaGFubmVscy4gKi8KLQlpZiAoY2hhbm5lbHMtPnJ4X2NvdW50IHx8IGNoYW5uZWxzLT50eF9jb3VudCB8fAotCSAgICBjaGFubmVscy0+b3RoZXJfY291bnQgfHwgKGNoYW5uZWxzLT5jb21iaW5lZF9jb3VudCA9PSAwKSB8fAotCSAgICAoY2hhbm5lbHMtPmNvbWJpbmVkX2NvdW50ID4gUUVERV9NQVhfUlNTX0NOVChlZGV2KSkpIHsKKwljb3VudCA9IGNoYW5uZWxzLT5yeF9jb3VudCArIGNoYW5uZWxzLT50eF9jb3VudCArCisJCQljaGFubmVscy0+Y29tYmluZWRfY291bnQ7CisKKwkvKiBXZSBkb24ndCBzdXBwb3J0IGBvdGhlcicgY2hhbm5lbHMgKi8KKwlpZiAoY2hhbm5lbHMtPm90aGVyX2NvdW50KSB7CiAJCURQX1ZFUkJPU0UoZWRldiwgKE5FVElGX01TR19JRlVQIHwgTkVUSUZfTVNHX0lGRE9XTiksCiAJCQkgICAiY29tbWFuZCBwYXJhbWV0ZXJzIG5vdCBzdXBwb3J0ZWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAoIShjaGFubmVscy0+Y29tYmluZWRfY291bnQgfHwgKGNoYW5uZWxzLT5yeF9jb3VudCAmJgorCQkJCQkgICBjaGFubmVscy0+dHhfY291bnQpKSkgeworCQlEUF9WRVJCT1NFKGVkZXYsIChORVRJRl9NU0dfSUZVUCB8IE5FVElGX01TR19JRkRPV04pLAorCQkJICAgIm5lZWQgdG8gcmVxdWVzdCBhdCBsZWFzdCBvbmUgdHJhbnNtaXQgYW5kIG9uZSByZWNlaXZlIGNoYW5uZWxcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY291bnQgPiBRRURFX01BWF9SU1NfQ05UKGVkZXYpKSB7CisJCURQX1ZFUkJPU0UoZWRldiwgKE5FVElGX01TR19JRlVQIHwgTkVUSUZfTVNHX0lGRE9XTiksCisJCQkgICAicmVxdWVzdGVkIGNoYW5uZWxzID0gJWQgbWF4IHN1cHBvcnRlZCBjaGFubmVscyA9ICVkXG4iLAorCQkJICAgY291bnQsIFFFREVfTUFYX1JTU19DTlQoZWRldikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAkvKiBDaGVjayBpZiB0aGVyZSB3YXMgYSBjaGFuZ2UgaW4gdGhlIGFjdGl2ZSBwYXJhbWV0ZXJzICovCi0JaWYgKGNoYW5uZWxzLT5jb21iaW5lZF9jb3VudCA9PSBRRURFX1JTU19DTlQoZWRldikpIHsKKwlpZiAoKGNvdW50ID09IFFFREVfUVVFVUVfQ05UKGVkZXYpKSAmJgorCSAgICAoY2hhbm5lbHMtPnR4X2NvdW50ID09IGVkZXYtPmZwX251bV90eCkgJiYKKwkgICAgKGNoYW5uZWxzLT5yeF9jb3VudCA9PSBlZGV2LT5mcF9udW1fcngpKSB7CiAJCURQX1ZFUkJPU0UoZWRldiwgKE5FVElGX01TR19JRlVQIHwgTkVUSUZfTVNHX0lGRE9XTiksCiAJCQkgICAiTm8gY2hhbmdlIGluIGFjdGl2ZSBwYXJhbWV0ZXJzXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJLyogV2UgbmVlZCB0aGUgbnVtYmVyIG9mIHF1ZXVlcyB0byBiZSBkaXZpc2libGUgYmV0d2VlbiB0aGUgaHdmbnMgKi8KLQlpZiAoY2hhbm5lbHMtPmNvbWJpbmVkX2NvdW50ICUgZWRldi0+ZGV2X2luZm8uY29tbW9uLm51bV9od2ZucykgeworCWlmICgoY291bnQgJSBlZGV2LT5kZXZfaW5mby5jb21tb24ubnVtX2h3Zm5zKSB8fAorCSAgICAoY2hhbm5lbHMtPnR4X2NvdW50ICUgZWRldi0+ZGV2X2luZm8uY29tbW9uLm51bV9od2ZucykgfHwKKwkgICAgKGNoYW5uZWxzLT5yeF9jb3VudCAlIGVkZXYtPmRldl9pbmZvLmNvbW1vbi5udW1faHdmbnMpKSB7CiAJCURQX1ZFUkJPU0UoZWRldiwgKE5FVElGX01TR19JRlVQIHwgTkVUSUZfTVNHX0lGRE9XTiksCi0JCQkgICAiTnVtYmVyIG9mIGNoYW5uZWxzIG11c3QgYmUgZGl2aXNhYmxlIGJ5ICUwNHhcbiIsCisJCQkgICAiTnVtYmVyIG9mIGNoYW5uZWxzIG11c3QgYmUgZGl2aXNpYmxlIGJ5ICUwNHhcbiIsCiAJCQkgICBlZGV2LT5kZXZfaW5mby5jb21tb24ubnVtX2h3Zm5zKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogU2V0IG51bWJlciBvZiBxdWV1ZXMgYW5kIHJlbG9hZCBpZiBuZWNlc3NhcnkgKi8KLQllZGV2LT5yZXFfcnNzID0gY2hhbm5lbHMtPmNvbWJpbmVkX2NvdW50OworCWVkZXYtPnJlcV9xdWV1ZXMgPSBjb3VudDsKKwllZGV2LT5yZXFfbnVtX3R4ID0gY2hhbm5lbHMtPnR4X2NvdW50OworCWVkZXYtPnJlcV9udW1fcnggPSBjaGFubmVscy0+cnhfY291bnQ7CiAJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKIAkJcWVkZV9yZWxvYWQoZWRldiwgTlVMTCwgTlVMTCk7CiAKQEAgLTcyNyw3ICs4ODksNyBAQAogCiAJc3dpdGNoIChpbmZvLT5jbWQpIHsKIAljYXNlIEVUSFRPT0xfR1JYUklOR1M6Ci0JCWluZm8tPmRhdGEgPSBlZGV2LT5udW1fcnNzOworCQlpbmZvLT5kYXRhID0gUUVERV9SU1NfQ09VTlQoZWRldik7CiAJCXJldHVybiAwOwogCWNhc2UgRVRIVE9PTF9HUlhGSDoKIAkJcmV0dXJuIHFlZGVfZ2V0X3Jzc19mbGFncyhlZGV2LCBpbmZvKTsKQEAgLTkzMCw3ICsxMDkyLDcgQEAKIAlpZiAoIW5ldGlmX3J1bm5pbmcoZWRldi0+bmRldikpCiAJCXJldHVybjsKIAotCWZvcl9lYWNoX3JzcyhpKSB7CisJZm9yX2VhY2hfcXVldWUoaSkgewogCQkvKiBVcGRhdGUgYW5kIHJlZW5hYmxlIGludGVycnVwdHMgKi8KIAkJcWVkX3NiX2FjayhlZGV2LT5mcF9hcnJheVtpXS5zYl9pbmZvLCBJR1VfSU5UX0VOQUJMRSwgMSk7CiAJCW5hcGlfZW5hYmxlKCZlZGV2LT5mcF9hcnJheVtpXS5uYXBpKTsKQEAgLTk0Miw3ICsxMTA0LDcgQEAKIHsKIAlpbnQgaTsKIAotCWZvcl9lYWNoX3JzcyhpKSB7CisJZm9yX2VhY2hfcXVldWUoaSkgewogCQluYXBpX2Rpc2FibGUoJmVkZXYtPmZwX2FycmF5W2ldLm5hcGkpOwogCQkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KIAkJcWVkX3NiX2FjayhlZGV2LT5mcF9hcnJheVtpXS5zYl9pbmZvLCBJR1VfSU5UX0RJU0FCTEUsIDApOwpAQCAtOTUyLDExICsxMTE0LDIzIEBACiBzdGF0aWMgaW50IHFlZGVfc2VsZnRlc3RfdHJhbnNtaXRfdHJhZmZpYyhzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYsCiAJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgcWVkZV90eF9xdWV1ZSAqdHhxID0gJmVkZXYtPmZwX2FycmF5WzBdLnR4cXNbMF07CisJc3RydWN0IHFlZGVfdHhfcXVldWUgKnR4cSA9IE5VTEw7CiAJc3RydWN0IGV0aF90eF8xc3RfYmQgKmZpcnN0X2JkOwogCWRtYV9hZGRyX3QgbWFwcGluZzsKIAlpbnQgaSwgaWR4LCB2YWw7CiAKKwlmb3JfZWFjaF9xdWV1ZShpKSB7CisJCWlmIChlZGV2LT5mcF9hcnJheVtpXS50eXBlICYgUUVERV9GQVNUUEFUSF9UWCkgeworCQkJdHhxID0gZWRldi0+ZnBfYXJyYXlbaV0udHhxczsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCF0eHEpIHsKKwkJRFBfTk9USUNFKGVkZXYsICJUeCBwYXRoIGlzIG5vdCBhdmFpbGFibGVcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCiAJLyogRmlsbCB0aGUgZW50cnkgaW4gdGhlIFNXIHJpbmcgYW5kIHRoZSBCRHMgaW4gdGhlIEZXIHJpbmcgKi8KIAlpZHggPSB0eHEtPnN3X3R4X3Byb2QgJiBOVU1fVFhfQkRTX01BWDsKIAl0eHEtPnN3X3R4X3JpbmdbaWR4XS5za2IgPSBza2I7CkBAIC0xMDIwLDE0ICsxMTk0LDI2IEBACiAKIHN0YXRpYyBpbnQgcWVkZV9zZWxmdGVzdF9yZWNlaXZlX3RyYWZmaWMoc3RydWN0IHFlZGVfZGV2ICplZGV2KQogewotCXN0cnVjdCBxZWRlX3J4X3F1ZXVlICpyeHEgPSBlZGV2LT5mcF9hcnJheVswXS5yeHE7CiAJdTE2IGh3X2NvbXBfY29ucywgc3dfY29tcF9jb25zLCBzd19yeF9pbmRleCwgbGVuOwogCXN0cnVjdCBldGhfZmFzdF9wYXRoX3J4X3JlZ19jcWUgKmZwX2NxZTsKKwlzdHJ1Y3QgcWVkZV9yeF9xdWV1ZSAqcnhxID0gTlVMTDsKIAlzdHJ1Y3Qgc3dfcnhfZGF0YSAqc3dfcnhfZGF0YTsKIAl1bmlvbiBldGhfcnhfY3FlICpjcWU7CiAJdTggKmRhdGFfcHRyOwogCWludCBpOwogCisJZm9yX2VhY2hfcXVldWUoaSkgeworCQlpZiAoZWRldi0+ZnBfYXJyYXlbaV0udHlwZSAmIFFFREVfRkFTVFBBVEhfUlgpIHsKKwkJCXJ4cSA9IGVkZXYtPmZwX2FycmF5W2ldLnJ4cTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFyeHEpIHsKKwkJRFBfTk9USUNFKGVkZXYsICJSeCBwYXRoIGlzIG5vdCBhdmFpbGFibGVcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCiAJLyogVGhlIHBhY2tldCBpcyBleHBlY3RlZCB0byByZWNlaXZlIG9uIHJ4LXF1ZXVlIDAgZXZlbiB0aG91Z2ggUlNTIGlzCiAJICogZW5hYmxlZC4gVGhpcyBpcyBiZWNhdXNlIHRoZSBxdWV1ZSAwIGlzIGNvbmZpZ3VyZWQgYXMgdGhlIGRlZmF1bHQKIAkgKiBxdWV1ZSBhbmQgdGhhdCB0aGUgbG9vcGJhY2sgdHJhZmZpYyBpcyBub3QgSVAuCkBAIC0xMjI4LDkgKzE0MTQsMTEgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBxZWRlX2V0aHRvb2xfb3BzID0gewotCS5nZXRfc2V0dGluZ3MgPSBxZWRlX2dldF9zZXR0aW5ncywKLQkuc2V0X3NldHRpbmdzID0gcWVkZV9zZXRfc2V0dGluZ3MsCisJLmdldF9saW5rX2tzZXR0aW5ncyA9IHFlZGVfZ2V0X2xpbmtfa3NldHRpbmdzLAorCS5zZXRfbGlua19rc2V0dGluZ3MgPSBxZWRlX3NldF9saW5rX2tzZXR0aW5ncywKIAkuZ2V0X2RydmluZm8gPSBxZWRlX2dldF9kcnZpbmZvLAorCS5nZXRfcmVnc19sZW4gPSBxZWRlX2dldF9yZWdzX2xlbiwKKwkuZ2V0X3JlZ3MgPSBxZWRlX2dldF9yZWdzLAogCS5nZXRfbXNnbGV2ZWwgPSBxZWRlX2dldF9tc2dsZXZlbCwKIAkuc2V0X21zZ2xldmVsID0gcWVkZV9zZXRfbXNnbGV2ZWwsCiAJLm53YXlfcmVzZXQgPSBxZWRlX253YXlfcmVzZXQsCkBAIC0xMjYwLDcgKzE0NDgsNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBxZWRlX3ZmX2V0aHRvb2xfb3BzID0gewotCS5nZXRfc2V0dGluZ3MgPSBxZWRlX2dldF9zZXR0aW5ncywKKwkuZ2V0X2xpbmtfa3NldHRpbmdzID0gcWVkZV9nZXRfbGlua19rc2V0dGluZ3MsCiAJLmdldF9kcnZpbmZvID0gcWVkZV9nZXRfZHJ2aW5mbywKIAkuZ2V0X21zZ2xldmVsID0gcWVkZV9nZXRfbXNnbGV2ZWwsCiAJLnNldF9tc2dsZXZlbCA9IHFlZGVfc2V0X21zZ2xldmVsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZGUvcWVkZV9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkZS9xZWRlX21haW4uYwppbmRleCBlNGJkMDJlLi4zNDMwMzhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkZS9xZWRlX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkZS9xZWRlX21haW4uYwpAQCAtMzYsNyArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPG5ldC9pcDZfY2hlY2tzdW0uaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLQorI2luY2x1ZGUgPGxpbnV4L3FlZC9xZWRlX3JvY2UuaD4KICNpbmNsdWRlICJxZWRlLmgiCiAKIHN0YXRpYyBjaGFyIHZlcnNpb25bXSA9CkBAIC0xMDAsNyArMTAwLDggQEAKIHN0YXRpYyB2b2lkIHFlZGVfbGlua191cGRhdGUodm9pZCAqZGV2LCBzdHJ1Y3QgcWVkX2xpbmtfb3V0cHV0ICpsaW5rKTsKIAogI2lmZGVmIENPTkZJR19RRURfU1JJT1YKLXN0YXRpYyBpbnQgcWVkZV9zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgaW50IHZmLCB1MTYgdmxhbiwgdTggcW9zKQorc3RhdGljIGludCBxZWRlX3NldF92Zl92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBpbnQgdmYsIHUxNiB2bGFuLCB1OCBxb3MsCisJCQkgICAgX19iZTE2IHZsYW5fcHJvdG8pCiB7CiAJc3RydWN0IHFlZGVfZGV2ICplZGV2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAKQEAgLTEwOSw2ICsxMTAsOSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAodmxhbl9wcm90byAhPSBodG9ucyhFVEhfUF84MDIxUSkpCisJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOworCiAJRFBfVkVSQk9TRShlZGV2LCBRRURfTVNHX0lPViwgIlNldHRpbmcgVmxhbiAweCUwNHggdG8gVkYgWyVkXVxuIiwKIAkJICAgdmxhbiwgdmYpOwogCkBAIC0xODksOCArMTkzLDcgQEAKIAlzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvIGRydmluZm87CiAJc3RydWN0IHFlZGVfZGV2ICplZGV2OwogCi0JLyogQ3VycmVudGx5IG9ubHkgc3VwcG9ydCBuYW1lIGNoYW5nZSAqLwotCWlmIChldmVudCAhPSBORVRERVZfQ0hBTkdFTkFNRSkKKwlpZiAoZXZlbnQgIT0gTkVUREVWX0NIQU5HRU5BTUUgJiYgZXZlbnQgIT0gTkVUREVWX0NIQU5HRUFERFIpCiAJCWdvdG8gZG9uZTsKIAogCS8qIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhIHFlZGUgZGV2aWNlICovCkBAIC0yMDMsMTEgKzIwNiwxOCBAQAogCQlnb3RvIGRvbmU7CiAJZWRldiA9IG5ldGRldl9wcml2KG5kZXYpOwogCi0JLyogTm90aWZ5IHFlZCBvZiB0aGUgbmFtZSBjaGFuZ2UgKi8KLQlpZiAoIWVkZXYtPm9wcyB8fCAhZWRldi0+b3BzLT5jb21tb24pCi0JCWdvdG8gZG9uZTsKLQllZGV2LT5vcHMtPmNvbW1vbi0+c2V0X2lkKGVkZXYtPmNkZXYsIGVkZXYtPm5kZXYtPm5hbWUsCi0JCQkJICAicWVkZSIpOworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5FVERFVl9DSEFOR0VOQU1FOgorCQkvKiBOb3RpZnkgcWVkIG9mIHRoZSBuYW1lIGNoYW5nZSAqLworCQlpZiAoIWVkZXYtPm9wcyB8fCAhZWRldi0+b3BzLT5jb21tb24pCisJCQlnb3RvIGRvbmU7CisJCWVkZXYtPm9wcy0+Y29tbW9uLT5zZXRfaWQoZWRldi0+Y2RldiwgZWRldi0+bmRldi0+bmFtZSwgInFlZGUiKTsKKwkJYnJlYWs7CisJY2FzZSBORVRERVZfQ0hBTkdFQUREUjoKKwkJZWRldiA9IG5ldGRldl9wcml2KG5kZXYpOworCQlxZWRlX3JvY2VfZXZlbnRfY2hhbmdlYWRkcihlZGV2KTsKKwkJYnJlYWs7CisJfQogCiBkb25lOgogCXJldHVybiBOT1RJRllfRE9ORTsKQEAgLTIyMiw3ICsyMzIsNyBAQAogewogCWludCByZXQ7CiAKLQlwcl9ub3RpY2UoInFlZGVfaW5pdDogJXNcbiIsIHZlcnNpb24pOworCXByX2luZm8oInFlZGVfaW5pdDogJXNcbiIsIHZlcnNpb24pOwogCiAJcWVkX29wcyA9IHFlZF9nZXRfZXRoX29wcygpOwogCWlmICghcWVkX29wcykgewpAQCAtMjUzLDcgKzI2Myw4IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBxZWRlX2NsZWFudXAodm9pZCkKIHsKLQlwcl9ub3RpY2UoInFlZGVfY2xlYW51cCBjYWxsZWRcbiIpOworCWlmIChkZWJ1ZyAmIFFFRF9MT0dfSU5GT19NQVNLKQorCQlwcl9pbmZvKCJxZWRlX2NsZWFudXAgY2FsbGVkXG4iKTsKIAogCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZxZWRlX25ldGRldl9ub3RpZmllcik7CiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZxZWRlX3BjaV9kcml2ZXIpOwpAQCAtMjcwLDggKzI4MSw3IEBACiAKIC8qIFVubWFwIHRoZSBkYXRhIGFuZCBmcmVlIHNrYiAqLwogc3RhdGljIGludCBxZWRlX2ZyZWVfdHhfcGt0KHN0cnVjdCBxZWRlX2RldiAqZWRldiwKLQkJCSAgICBzdHJ1Y3QgcWVkZV90eF9xdWV1ZSAqdHhxLAotCQkJICAgIGludCAqbGVuKQorCQkJICAgIHN0cnVjdCBxZWRlX3R4X3F1ZXVlICp0eHEsIGludCAqbGVuKQogewogCXUxNiBpZHggPSB0eHEtPnN3X3R4X2NvbnMgJiBOVU1fVFhfQkRTX01BWDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHhxLT5zd190eF9yaW5nW2lkeF0uc2tiOwpAQCAtMzI5LDggKzMzOSw3IEBACiBzdGF0aWMgdm9pZCBxZWRlX2ZyZWVfZmFpbGVkX3R4X3BrdChzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYsCiAJCQkJICAgIHN0cnVjdCBxZWRlX3R4X3F1ZXVlICp0eHEsCiAJCQkJICAgIHN0cnVjdCBldGhfdHhfMXN0X2JkICpmaXJzdF9iZCwKLQkJCQkgICAgaW50IG5iZCwKLQkJCQkgICAgYm9vbCBkYXRhX3NwbGl0KQorCQkJCSAgICBpbnQgbmJkLCBib29sIGRhdGFfc3BsaXQpCiB7CiAJdTE2IGlkeCA9IHR4cS0+c3dfdHhfcHJvZCAmIE5VTV9UWF9CRFNfTUFYOwogCXN0cnVjdCBza19idWZmICpza2IgPSB0eHEtPnN3X3R4X3JpbmdbaWR4XS5za2I7CkBAIC0zMzksOCArMzQ4LDcgQEAKIAogCS8qIFJldHVybiBwcm9kIHRvIGl0cyBwb3NpdGlvbiBiZWZvcmUgdGhpcyBza2Igd2FzIGhhbmRsZWQgKi8KIAlxZWRfY2hhaW5fc2V0X3Byb2QoJnR4cS0+dHhfcGJsLAotCQkJICAgbGUxNl90b19jcHUodHhxLT50eF9kYi5kYXRhLmJkX3Byb2QpLAotCQkJICAgZmlyc3RfYmQpOworCQkJICAgbGUxNl90b19jcHUodHhxLT50eF9kYi5kYXRhLmJkX3Byb2QpLCBmaXJzdF9iZCk7CiAKIAlmaXJzdF9iZCA9IChzdHJ1Y3QgZXRoX3R4XzFzdF9iZCAqKXFlZF9jaGFpbl9wcm9kdWNlKCZ0eHEtPnR4X3BibCk7CiAKQEAgLTM2Niw4ICszNzQsNyBAQAogCiAJLyogUmV0dXJuIGFnYWluIHByb2QgdG8gaXRzIHBvc2l0aW9uIGJlZm9yZSB0aGlzIHNrYiB3YXMgaGFuZGxlZCAqLwogCXFlZF9jaGFpbl9zZXRfcHJvZCgmdHhxLT50eF9wYmwsCi0JCQkgICBsZTE2X3RvX2NwdSh0eHEtPnR4X2RiLmRhdGEuYmRfcHJvZCksCi0JCQkgICBmaXJzdF9iZCk7CisJCQkgICBsZTE2X3RvX2NwdSh0eHEtPnR4X2RiLmRhdGEuYmRfcHJvZCksIGZpcnN0X2JkKTsKIAogCS8qIEZyZWUgc2tiICovCiAJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKQEAgLTM3Niw4ICszODMsNyBAQAogfQogCiBzdGF0aWMgdTMyIHFlZGVfeG1pdF90eXBlKHN0cnVjdCBxZWRlX2RldiAqZWRldiwKLQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgaW50ICppcHY2X2V4dCkKKwkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50ICppcHY2X2V4dCkKIHsKIAl1MzIgcmMgPSBYTUlUX0w0X0NTVU07CiAJX19iZTE2IGwzX3Byb3RvOwpAQCAtNDM0LDE1ICs0NDAsMTMgQEAKIH0KIAogc3RhdGljIGludCBtYXBfZnJhZ190b19iZChzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYsCi0JCQkgIHNrYl9mcmFnX3QgKmZyYWcsCi0JCQkgIHN0cnVjdCBldGhfdHhfYmQgKmJkKQorCQkJICBza2JfZnJhZ190ICpmcmFnLCBzdHJ1Y3QgZXRoX3R4X2JkICpiZCkKIHsKIAlkbWFfYWRkcl90IG1hcHBpbmc7CiAKIAkvKiBNYXAgc2tiIG5vbi1saW5lYXIgZnJhZyBkYXRhIGZvciBETUEgKi8KIAltYXBwaW5nID0gc2tiX2ZyYWdfZG1hX21hcCgmZWRldi0+cGRldi0+ZGV2LCBmcmFnLCAwLAotCQkJCSAgIHNrYl9mcmFnX3NpemUoZnJhZyksCi0JCQkJICAgRE1BX1RPX0RFVklDRSk7CisJCQkJICAgc2tiX2ZyYWdfc2l6ZShmcmFnKSwgRE1BX1RPX0RFVklDRSk7CiAJaWYgKHVubGlrZWx5KGRtYV9tYXBwaW5nX2Vycm9yKCZlZGV2LT5wZGV2LT5kZXYsIG1hcHBpbmcpKSkgewogCQlEUF9OT1RJQ0UoZWRldiwgIlVuYWJsZSB0byBtYXAgZnJhZyAtIGRyb3BwaW5nIHBhY2tldFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNTA0LDkgKzUwOCw4IEBACiB9CiAKIC8qIE1haW4gdHJhbnNtaXQgZnVuY3Rpb24gKi8KLXN0YXRpYwotbmV0ZGV2X3R4X3QgcWVkZV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCitzdGF0aWMgbmV0ZGV2X3R4X3QgcWVkZV9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7CiAJc3RydWN0IHFlZGVfZGV2ICplZGV2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJc3RydWN0IG5ldGRldl9xdWV1ZSAqbmV0ZGV2X3R4cTsKQEAgLTUyNiwxMiArNTI5LDExIEBACiAKIAkvKiBHZXQgdHgtcXVldWUgY29udGV4dCBhbmQgbmV0ZGV2IGluZGV4ICovCiAJdHhxX2luZGV4ID0gc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYik7Ci0JV0FSTl9PTih0eHFfaW5kZXggPj0gUUVERV9UU1NfQ05UKGVkZXYpKTsKKwlXQVJOX09OKHR4cV9pbmRleCA+PSBRRURFX1RTU19DT1VOVChlZGV2KSk7CiAJdHhxID0gUUVERV9UWF9RVUVVRShlZGV2LCB0eHFfaW5kZXgpOwogCW5ldGRldl90eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKG5kZXYsIHR4cV9pbmRleCk7CiAKLQlXQVJOX09OKHFlZF9jaGFpbl9nZXRfZWxlbV9sZWZ0KCZ0eHEtPnR4X3BibCkgPAotCQkJICAgICAgIChNQVhfU0tCX0ZSQUdTICsgMSkpOworCVdBUk5fT04ocWVkX2NoYWluX2dldF9lbGVtX2xlZnQoJnR4cS0+dHhfcGJsKSA8IChNQVhfU0tCX0ZSQUdTICsgMSkpOwogCiAJeG1pdF90eXBlID0gcWVkZV94bWl0X3R5cGUoZWRldiwgc2tiLCAmaXB2Nl9leHQpOwogCkBAIC02MDYsNiArNjA4LDE0IEBACiAJCQkgICAgMSA8PCBFVEhfVFhfREFUQV8xU1RfQkRfVFVOTl9GTEFHX1NISUZUOwogCQl9CiAKKwkJLyogTGVnYWN5IEZXIGhhZCBmbGlwcGVkIGJlaGF2aW9yIGluIHJlZ2FyZCB0byB0aGlzIGJpdCAtCisJCSAqIEkuZS4sIG5lZWRlZCB0byBzZXQgdG8gcHJldmVudCBGVyBmcm9tIHRvdWNoaW5nIGVuY2Fwc3VsYXRlZAorCQkgKiBwYWNrZXRzIHdoZW4gaXQgZGlkbid0IG5lZWQgdG8uCisJCSAqLworCQlpZiAodW5saWtlbHkodHhxLT5pc19sZWdhY3kpKQorCQkJZmlyc3RfYmQtPmRhdGEuYml0ZmllbGRzIF49CisJCQkgICAgMSA8PCBFVEhfVFhfREFUQV8xU1RfQkRfVFVOTl9GTEFHX1NISUZUOworCiAJCS8qIElmIHRoZSBwYWNrZXQgaXMgSVB2NiB3aXRoIGV4dGVuc2lvbiBoZWFkZXIsIGluZGljYXRlIHRoYXQKIAkJICogdG8gRlcgYW5kIHBhc3MgZmV3IHBhcmFtcywgc2luY2UgdGhlIGRldmljZSBjcmFja2VyIGRvZXNuJ3QKIAkJICogc3VwcG9ydCBwYXJzaW5nIElQdjYgd2l0aCBleHRlbnNpb24gaGVhZGVyL3MuCkBAIC03MjIsMTIgKzczMiwxNiBAQAogCXR4cS0+dHhfZGIuZGF0YS5iZF9wcm9kID0KIAkJY3B1X3RvX2xlMTYocWVkX2NoYWluX2dldF9wcm9kX2lkeCgmdHhxLT50eF9wYmwpKTsKIAotCWlmICghc2tiLT54bWl0X21vcmUgfHwgbmV0aWZfdHhfcXVldWVfc3RvcHBlZChuZXRkZXZfdHhxKSkKKwlpZiAoIXNrYi0+eG1pdF9tb3JlIHx8IG5ldGlmX3htaXRfc3RvcHBlZChuZXRkZXZfdHhxKSkKIAkJcWVkZV91cGRhdGVfdHhfcHJvZHVjZXIodHhxKTsKIAogCWlmICh1bmxpa2VseShxZWRfY2hhaW5fZ2V0X2VsZW1fbGVmdCgmdHhxLT50eF9wYmwpCiAJCSAgICAgIDwgKE1BWF9TS0JfRlJBR1MgKyAxKSkpIHsKKwkJaWYgKHNrYi0+eG1pdF9tb3JlKQorCQkJcWVkZV91cGRhdGVfdHhfcHJvZHVjZXIodHhxKTsKKwogCQluZXRpZl90eF9zdG9wX3F1ZXVlKG5ldGRldl90eHEpOworCQl0eHEtPnN0b3BwZWRfY250Kys7CiAJCURQX1ZFUkJPU0UoZWRldiwgTkVUSUZfTVNHX1RYX1FVRVVFRCwKIAkJCSAgICJTdG9wIHF1ZXVlIHdhcyBjYWxsZWRcbiIpOwogCQkvKiBwYWlyZWQgbWVtb3J5IGJhcnJpZXIgaXMgaW4gcWVkZV90eF9pbnQoKSwgd2UgaGF2ZSB0byBrZWVwCkBAIC03NjEsOCArNzc1LDcgQEAKIAlyZXR1cm4gaHdfYmRfY29ucyAhPSBxZWRfY2hhaW5fZ2V0X2NvbnNfaWR4KCZ0eHEtPnR4X3BibCk7CiB9CiAKLXN0YXRpYyBpbnQgcWVkZV90eF9pbnQoc3RydWN0IHFlZGVfZGV2ICplZGV2LAotCQkgICAgICAgc3RydWN0IHFlZGVfdHhfcXVldWUgKnR4cSkKK3N0YXRpYyBpbnQgcWVkZV90eF9pbnQoc3RydWN0IHFlZGVfZGV2ICplZGV2LCBzdHJ1Y3QgcWVkZV90eF9xdWV1ZSAqdHhxKQogewogCXN0cnVjdCBuZXRkZXZfcXVldWUgKm5ldGRldl90eHE7CiAJdTE2IGh3X2JkX2NvbnM7CkBAIC03ODgsNiArODAxLDcgQEAKIAkJYnl0ZXNfY29tcGwgKz0gbGVuOwogCQlwa3RzX2NvbXBsKys7CiAJCXR4cS0+c3dfdHhfY29ucysrOworCQl0eHEtPnhtaXRfcGt0cysrOwogCX0KIAogCW5ldGRldl90eF9jb21wbGV0ZWRfcXVldWUobmV0ZGV2X3R4cSwgcGt0c19jb21wbCwgYnl0ZXNfY29tcGwpOwpAQCAtOTYwLDggKzk3NCw3IEBACiAKIHN0YXRpYyB1MzIgcWVkZV9nZXRfcnhoYXNoKHN0cnVjdCBxZWRlX2RldiAqZWRldiwKIAkJCSAgIHU4IGJpdGZpZWxkcywKLQkJCSAgIF9fbGUzMiByc3NfaGFzaCwKLQkJCSAgIGVudW0gcGt0X2hhc2hfdHlwZXMgKnJ4aGFzaF90eXBlKQorCQkJICAgX19sZTMyIHJzc19oYXNoLCBlbnVtIHBrdF9oYXNoX3R5cGVzICpyeGhhc2hfdHlwZSkKIHsKIAllbnVtIHJzc19oYXNoX3R5cGUgaHR5cGU7CiAKQEAgLTk5MCwxMiArMTAwMywxMCBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgcWVkZV9za2JfcmVjZWl2ZShzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYsCiAJCQkJICAgIHN0cnVjdCBxZWRlX2Zhc3RwYXRoICpmcCwKLQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgdTE2IHZsYW5fdGFnKQorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MTYgdmxhbl90YWcpCiB7CiAJaWYgKHZsYW5fdGFnKQotCQlfX3ZsYW5faHdhY2NlbF9wdXRfdGFnKHNrYiwgaHRvbnMoRVRIX1BfODAyMVEpLAotCQkJCSAgICAgICB2bGFuX3RhZyk7CisJCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCBodG9ucyhFVEhfUF84MDIxUSksIHZsYW5fdGFnKTsKIAogCW5hcGlfZ3JvX3JlY2VpdmUoJmZwLT5uYXBpLCBza2IpOwogfQpAQCAtMTAxOCw4ICsxMDI5LDcgQEAKIAogc3RhdGljIGludCBxZWRlX2ZpbGxfZnJhZ19za2Ioc3RydWN0IHFlZGVfZGV2ICplZGV2LAogCQkJICAgICAgc3RydWN0IHFlZGVfcnhfcXVldWUgKnJ4cSwKLQkJCSAgICAgIHU4IHRwYV9hZ2dfaW5kZXgsCi0JCQkgICAgICB1MTYgbGVuX29uX2JkKQorCQkJICAgICAgdTggdHBhX2FnZ19pbmRleCwgdTE2IGxlbl9vbl9iZCkKIHsKIAlzdHJ1Y3Qgc3dfcnhfZGF0YSAqY3VycmVudF9iZCA9ICZyeHEtPnN3X3J4X3JpbmdbcnhxLT5zd19yeF9jb25zICYKIAkJCQkJCQkgTlVNX1JYX0JEU19NQVhdOwpAQCAtMTIwNiw3ICsxMjE2LDcgQEAKICNlbmRpZgogCiBzZW5kX3NrYjoKLQlza2JfcmVjb3JkX3J4X3F1ZXVlKHNrYiwgZnAtPnJzc19pZCk7CisJc2tiX3JlY29yZF9yeF9xdWV1ZShza2IsIGZwLT5yeHEtPnJ4cV9pZCk7CiAJcWVkZV9za2JfcmVjZWl2ZShlZGV2LCBmcCwgc2tiLCB2bGFuX3RhZyk7CiB9CiAKQEAgLTE0MTAsNyArMTQyMCw3IEBACiAKIAkJaWYgKHVubGlrZWx5KGNxZV90eXBlID09IEVUSF9SWF9DUUVfVFlQRV9TTE9XX1BBVEgpKSB7CiAJCQllZGV2LT5vcHMtPmV0aF9jcWVfY29tcGxldGlvbigKLQkJCQkJZWRldi0+Y2RldiwgZnAtPnJzc19pZCwKKwkJCQkJZWRldi0+Y2RldiwgZnAtPmlkLAogCQkJCQkoc3RydWN0IGV0aF9zbG93X3BhdGhfcnhfY3FlICopY3FlKTsKIAkJCWdvdG8gbmV4dF9jcWU7CiAJCX0KQEAgLTE0NjcsNyArMTQ3Nyw3IEBACiAJCXNrYiA9IG5ldGRldl9hbGxvY19za2IoZWRldi0+bmRldiwgUUVERV9SWF9IRFJfU0laRSk7CiAJCWlmICh1bmxpa2VseSghc2tiKSkgewogCQkJRFBfTk9USUNFKGVkZXYsCi0JCQkJICAiQnVpbGRfc2tiIGZhaWxlZCwgZHJvcHBpbmcgaW5jb21pbmcgcGFja2V0XG4iKTsKKwkJCQkgICJza2IgYWxsb2NhdGlvbiBmYWlsZWQsIGRyb3BwaW5nIGluY29taW5nIHBhY2tldFxuIik7CiAJCQlxZWRlX3JlY3ljbGVfcnhfYmRfcmluZyhyeHEsIGVkZXYsIGZwX2NxZS0+YmRfbnVtKTsKIAkJCXJ4cS0+cnhfYWxsb2NfZXJyb3JzKys7CiAJCQlnb3RvIG5leHRfY3FlOwpAQCAtMTU3NSwxNCArMTU4NSwxMyBAQAogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBlZGV2LT5uZGV2KTsKIAogCQlyeF9oYXNoID0gcWVkZV9nZXRfcnhoYXNoKGVkZXYsIGZwX2NxZS0+Yml0ZmllbGRzLAotCQkJCQkgIGZwX2NxZS0+cnNzX2hhc2gsCi0JCQkJCSAgJnJ4aGFzaF90eXBlKTsKKwkJCQkJICBmcF9jcWUtPnJzc19oYXNoLCAmcnhoYXNoX3R5cGUpOwogCiAJCXNrYl9zZXRfaGFzaChza2IsIHJ4X2hhc2gsIHJ4aGFzaF90eXBlKTsKIAogCQlxZWRlX3NldF9za2JfY3N1bShza2IsIGNzdW1fZmxhZyk7CiAKLQkJc2tiX3JlY29yZF9yeF9xdWV1ZShza2IsIGZwLT5yc3NfaWQpOworCQlza2JfcmVjb3JkX3J4X3F1ZXVlKHNrYiwgZnAtPnJ4cS0+cnhxX2lkKTsKIAogCQlxZWRlX3NrYl9yZWNlaXZlKGVkZXYsIGZwLCBza2IsIGxlMTZfdG9fY3B1KGZwX2NxZS0+dmxhbl90YWcpKTsKIG5leHRfcnhfb25seToKQEAgLTE2MDEsNiArMTYxMCw4IEBACiAJLyogVXBkYXRlIHByb2R1Y2VycyAqLwogCXFlZGVfdXBkYXRlX3J4X3Byb2QoZWRldiwgcnhxKTsKIAorCXJ4cS0+cmN2X3BrdHMgKz0gcnhfcGt0OworCiAJcmV0dXJuIHJ4X3BrdDsKIH0KIApAQCAtMTYxMywxMCArMTYyNCwxMiBAQAogCXU4IHRjOwogCiAJZm9yICh0YyA9IDA7IHRjIDwgZWRldi0+bnVtX3RjOyB0YysrKQotCQlpZiAocWVkZV90eHFfaGFzX3dvcmsoJmZwLT50eHFzW3RjXSkpCisJCWlmIChsaWtlbHkoZnAtPnR5cGUgJiBRRURFX0ZBU1RQQVRIX1RYKSAmJgorCQkgICAgcWVkZV90eHFfaGFzX3dvcmsoJmZwLT50eHFzW3RjXSkpCiAJCQlxZWRlX3R4X2ludChlZGV2LCAmZnAtPnR4cXNbdGNdKTsKIAotCXJ4X3dvcmtfZG9uZSA9IHFlZGVfaGFzX3J4X3dvcmsoZnAtPnJ4cSkgPworCXJ4X3dvcmtfZG9uZSA9IChsaWtlbHkoZnAtPnR5cGUgJiBRRURFX0ZBU1RQQVRIX1JYKSAmJgorCQkJcWVkZV9oYXNfcnhfd29yayhmcC0+cnhxKSkgPwogCQkJcWVkZV9yeF9pbnQoZnAsIGJ1ZGdldCkgOiAwOwogCWlmIChyeF93b3JrX2RvbmUgPCBidWRnZXQpIHsKIAkJcWVkX3NiX3VwZGF0ZV9zYl9pZHgoZnAtPnNiX2luZm8pOwpAQCAtMTYzNiw4ICsxNjQ5LDEwIEBACiAJCXJtYigpOwogCiAJCS8qIEZhbGwgb3V0IGZyb20gdGhlIE5BUEkgbG9vcCBpZiBuZWVkZWQgKi8KLQkJaWYgKCEocWVkZV9oYXNfcnhfd29yayhmcC0+cnhxKSB8fAotCQkgICAgICBxZWRlX2hhc190eF93b3JrKGZwKSkpIHsKKwkJaWYgKCEoKGxpa2VseShmcC0+dHlwZSAmIFFFREVfRkFTVFBBVEhfUlgpICYmCisJCSAgICAgICBxZWRlX2hhc19yeF93b3JrKGZwLT5yeHEpKSB8fAorCQkgICAgICAobGlrZWx5KGZwLT50eXBlICYgUUVERV9GQVNUUEFUSF9UWCkgJiYKKwkJICAgICAgIHFlZGVfaGFzX3R4X3dvcmsoZnApKSkpIHsKIAkJCW5hcGlfY29tcGxldGUobmFwaSk7CiAKIAkJCS8qIFVwZGF0ZSBhbmQgcmVlbmFibGUgaW50ZXJydXB0cyAqLwpAQCAtMTcwOCw2ICsxNzIzLDggQEAKIAogCWVkZXYtPm9wcy0+Z2V0X3Zwb3J0X3N0YXRzKGVkZXYtPmNkZXYsICZzdGF0cyk7CiAJZWRldi0+c3RhdHMubm9fYnVmZl9kaXNjYXJkcyA9IHN0YXRzLm5vX2J1ZmZfZGlzY2FyZHM7CisJZWRldi0+c3RhdHMucGFja2V0X3Rvb19iaWdfZGlzY2FyZCA9IHN0YXRzLnBhY2tldF90b29fYmlnX2Rpc2NhcmQ7CisJZWRldi0+c3RhdHMudHRsMF9kaXNjYXJkID0gc3RhdHMudHRsMF9kaXNjYXJkOwogCWVkZXYtPnN0YXRzLnJ4X3VjYXN0X2J5dGVzID0gc3RhdHMucnhfdWNhc3RfYnl0ZXM7CiAJZWRldi0+c3RhdHMucnhfbWNhc3RfYnl0ZXMgPSBzdGF0cy5yeF9tY2FzdF9ieXRlczsKIAllZGV2LT5zdGF0cy5yeF9iY2FzdF9ieXRlcyA9IHN0YXRzLnJ4X2JjYXN0X2J5dGVzOwpAQCAtMTc4Nyw5ICsxODA0LDkgQEAKIAllZGV2LT5zdGF0cy50eF9tYWNfY3RybF9mcmFtZXMgPSBzdGF0cy50eF9tYWNfY3RybF9mcmFtZXM7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnFlZGVfZ2V0X3N0YXRzNjQoCi0JCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzKQorc3RhdGljCitzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnFlZGVfZ2V0X3N0YXRzNjQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpzdGF0cykKIHsKIAlzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCkBAIC0yMTAzLDE0ICsyMTIwLDEzIEBACiAJCX0KIAogCQlEUF9WRVJCT1NFKGVkZXYsIE5FVElGX01TR19JRkRPV04sCi0JCQkgICAibWFya2VkIHZsYW4gJWQgYXMgbm9uLWNvbmZpZ3VyZWRcbiIsCi0JCQkgICB2bGFuLT52aWQpOworCQkJICAgIm1hcmtlZCB2bGFuICVkIGFzIG5vbi1jb25maWd1cmVkXG4iLCB2bGFuLT52aWQpOwogCX0KIAogCWVkZXYtPmFjY2VwdF9hbnlfdmxhbiA9IGZhbHNlOwogfQogCi1pbnQgcWVkZV9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCitzdGF0aWMgaW50IHFlZGVfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXN0cnVjdCBxZWRlX2RldiAqZWRldiA9IG5ldGRldl9wcml2KGRldik7CiAJbmV0ZGV2X2ZlYXR1cmVzX3QgY2hhbmdlcyA9IGZlYXR1cmVzIF4gZGV2LT5mZWF0dXJlczsKQEAgLTIxNDYsNyArMjE2Miw3IEBACiAKIAkJZWRldi0+dnhsYW5fZHN0X3BvcnQgPSB0X3BvcnQ7CiAKLQkJRFBfVkVSQk9TRShlZGV2LCBRRURfTVNHX0RFQlVHLCAiQWRkZWQgdnhsYW4gcG9ydD0lZCIsCisJCURQX1ZFUkJPU0UoZWRldiwgUUVEX01TR19ERUJVRywgIkFkZGVkIHZ4bGFuIHBvcnQ9JWRcbiIsCiAJCQkgICB0X3BvcnQpOwogCiAJCXNldF9iaXQoUUVERV9TUF9WWExBTl9QT1JUX0NPTkZJRywgJmVkZXYtPnNwX2ZsYWdzKTsKQEAgLTIxNTcsNyArMjE3Myw3IEBACiAKIAkJZWRldi0+Z2VuZXZlX2RzdF9wb3J0ID0gdF9wb3J0OwogCi0JCURQX1ZFUkJPU0UoZWRldiwgUUVEX01TR19ERUJVRywgIkFkZGVkIGdlbmV2ZSBwb3J0PSVkIiwKKwkJRFBfVkVSQk9TRShlZGV2LCBRRURfTVNHX0RFQlVHLCAiQWRkZWQgZ2VuZXZlIHBvcnQ9JWRcbiIsCiAJCQkgICB0X3BvcnQpOwogCQlzZXRfYml0KFFFREVfU1BfR0VORVZFX1BPUlRfQ09ORklHLCAmZWRldi0+c3BfZmxhZ3MpOwogCQlicmVhazsKQEAgLTIxODEsNyArMjE5Nyw3IEBACiAKIAkJZWRldi0+dnhsYW5fZHN0X3BvcnQgPSAwOwogCi0JCURQX1ZFUkJPU0UoZWRldiwgUUVEX01TR19ERUJVRywgIkRlbGV0ZWQgdnhsYW4gcG9ydD0lZCIsCisJCURQX1ZFUkJPU0UoZWRldiwgUUVEX01TR19ERUJVRywgIkRlbGV0ZWQgdnhsYW4gcG9ydD0lZFxuIiwKIAkJCSAgIHRfcG9ydCk7CiAKIAkJc2V0X2JpdChRRURFX1NQX1ZYTEFOX1BPUlRfQ09ORklHLCAmZWRldi0+c3BfZmxhZ3MpOwpAQCAtMjE5Miw3ICsyMjA4LDcgQEAKIAogCQllZGV2LT5nZW5ldmVfZHN0X3BvcnQgPSAwOwogCi0JCURQX1ZFUkJPU0UoZWRldiwgUUVEX01TR19ERUJVRywgIkRlbGV0ZWQgZ2VuZXZlIHBvcnQ9JWQiLAorCQlEUF9WRVJCT1NFKGVkZXYsIFFFRF9NU0dfREVCVUcsICJEZWxldGVkIGdlbmV2ZSBwb3J0PSVkXG4iLAogCQkJICAgdF9wb3J0KTsKIAkJc2V0X2JpdChRRURFX1NQX0dFTkVWRV9QT1JUX0NPTkZJRywgJmVkZXYtPnNwX2ZsYWdzKTsKIAkJYnJlYWs7CkBAIC0yMjM3LDE1ICsyMjUzLDEzIEBACiBzdGF0aWMgc3RydWN0IHFlZGVfZGV2ICpxZWRlX2FsbG9jX2V0aGVyZGV2KHN0cnVjdCBxZWRfZGV2ICpjZGV2LAogCQkJCQkgICAgc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJCSAgICBzdHJ1Y3QgcWVkX2Rldl9ldGhfaW5mbyAqaW5mbywKLQkJCQkJICAgIHUzMiBkcF9tb2R1bGUsCi0JCQkJCSAgICB1OCBkcF9sZXZlbCkKKwkJCQkJICAgIHUzMiBkcF9tb2R1bGUsIHU4IGRwX2xldmVsKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwogCXN0cnVjdCBxZWRlX2RldiAqZWRldjsKIAogCW5kZXYgPSBhbGxvY19ldGhlcmRldl9tcXMoc2l6ZW9mKCplZGV2KSwKLQkJCQkgIGluZm8tPm51bV9xdWV1ZXMsCi0JCQkJICBpbmZvLT5udW1fcXVldWVzKTsKKwkJCQkgIGluZm8tPm51bV9xdWV1ZXMsIGluZm8tPm51bV9xdWV1ZXMpOwogCWlmICghbmRldikgewogCQlwcl9lcnIoImV0aGVyZGV2IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC0yMjYxLDYgKzIyNzUsOSBAQAogCWVkZXYtPnFfbnVtX3J4X2J1ZmZlcnMgPSBOVU1fUlhfQkRTX0RFRjsKIAllZGV2LT5xX251bV90eF9idWZmZXJzID0gTlVNX1RYX0JEU19ERUY7CiAKKwlEUF9JTkZPKGVkZXYsICJBbGxvY2F0ZWQgbmV0ZGV2IHdpdGggJWQgdHggcXVldWVzIGFuZCAlZCByeCBxdWV1ZXNcbiIsCisJCWluZm8tPm51bV9xdWV1ZXMsIGluZm8tPm51bV9xdWV1ZXMpOworCiAJU0VUX05FVERFVl9ERVYobmRldiwgJnBkZXYtPmRldik7CiAKIAltZW1zZXQoJmVkZXYtPnN0YXRzLCAwLCBzaXplb2YoZWRldi0+c3RhdHMpKTsKQEAgLTIzNDksNyArMjM2Niw3IEBACiAJCXN0cnVjdCBxZWRlX2Zhc3RwYXRoICpmcDsKIAkJaW50IGk7CiAKLQkJZm9yX2VhY2hfcnNzKGkpIHsKKwkJZm9yX2VhY2hfcXVldWUoaSkgewogCQkJZnAgPSAmZWRldi0+ZnBfYXJyYXlbaV07CiAKIAkJCWtmcmVlKGZwLT5zYl9pbmZvKTsKQEAgLTIzNTgsMjIgKzIzNzUsMzMgQEAKIAkJfQogCQlrZnJlZShlZGV2LT5mcF9hcnJheSk7CiAJfQotCWVkZXYtPm51bV9yc3MgPSAwOworCisJZWRldi0+bnVtX3F1ZXVlcyA9IDA7CisJZWRldi0+ZnBfbnVtX3R4ID0gMDsKKwllZGV2LT5mcF9udW1fcnggPSAwOwogfQogCiBzdGF0aWMgaW50IHFlZGVfYWxsb2NfZnBfYXJyYXkoc3RydWN0IHFlZGVfZGV2ICplZGV2KQogeworCXU4IGZwX2NvbWJpbmVkLCBmcF9yeCA9IGVkZXYtPmZwX251bV9yeDsKIAlzdHJ1Y3QgcWVkZV9mYXN0cGF0aCAqZnA7CiAJaW50IGk7CiAKLQllZGV2LT5mcF9hcnJheSA9IGtjYWxsb2MoUUVERV9SU1NfQ05UKGVkZXYpLAorCWVkZXYtPmZwX2FycmF5ID0ga2NhbGxvYyhRRURFX1FVRVVFX0NOVChlZGV2KSwKIAkJCQkgc2l6ZW9mKCplZGV2LT5mcF9hcnJheSksIEdGUF9LRVJORUwpOwogCWlmICghZWRldi0+ZnBfYXJyYXkpIHsKIAkJRFBfTk9USUNFKGVkZXYsICJmcCBhcnJheSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyOwogCX0KIAotCWZvcl9lYWNoX3JzcyhpKSB7CisJZnBfY29tYmluZWQgPSBRRURFX1FVRVVFX0NOVChlZGV2KSAtIGZwX3J4IC0gZWRldi0+ZnBfbnVtX3R4OworCisJLyogQWxsb2NhdGUgdGhlIEZQIGVsZW1lbnRzIGZvciBSeCBxdWV1ZXMgZm9sbG93ZWQgYnkgY29tYmluZWQgYW5kIHRoZW4KKwkgKiB0aGUgVHguIFRoaXMgb3JkZXJpbmcgc2hvdWxkIGJlIG1haW50YWluZWQgc28gdGhhdCB0aGUgcmVzcGVjdGl2ZQorCSAqIHF1ZXVlcyAoUnggb3IgVHgpIHdpbGwgYmUgdG9nZXRoZXIgaW4gdGhlIGZhc3RwYXRoIGFycmF5IGFuZCB0aGUKKwkgKiBhc3NvY2lhdGVkIGlkcyB3aWxsIGJlIHNlcXVlbnRpYWwuCisJICovCisJZm9yX2VhY2hfcXVldWUoaSkgewogCQlmcCA9ICZlZGV2LT5mcF9hcnJheVtpXTsKIAogCQlmcC0+c2JfaW5mbyA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpmcC0+c2JfaW5mbyksIEdGUF9LRVJORUwpOwpAQCAtMjM4MiwxNiArMjQxMCwzMyBAQAogCQkJZ290byBlcnI7CiAJCX0KIAotCQlmcC0+cnhxID0ga2NhbGxvYygxLCBzaXplb2YoKmZwLT5yeHEpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFmcC0+cnhxKSB7Ci0JCQlEUF9OT1RJQ0UoZWRldiwgIlJYUSBzdHJ1Y3QgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwotCQkJZ290byBlcnI7CisJCWlmIChmcF9yeCkgeworCQkJZnAtPnR5cGUgPSBRRURFX0ZBU1RQQVRIX1JYOworCQkJZnBfcngtLTsKKwkJfSBlbHNlIGlmIChmcF9jb21iaW5lZCkgeworCQkJZnAtPnR5cGUgPSBRRURFX0ZBU1RQQVRIX0NPTUJJTkVEOworCQkJZnBfY29tYmluZWQtLTsKKwkJfSBlbHNlIHsKKwkJCWZwLT50eXBlID0gUUVERV9GQVNUUEFUSF9UWDsKIAkJfQogCi0JCWZwLT50eHFzID0ga2NhbGxvYyhlZGV2LT5udW1fdGMsIHNpemVvZigqZnAtPnR4cXMpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFmcC0+dHhxcykgewotCQkJRFBfTk9USUNFKGVkZXYsICJUWFEgYXJyYXkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwotCQkJZ290byBlcnI7CisJCWlmIChmcC0+dHlwZSAmIFFFREVfRkFTVFBBVEhfVFgpIHsKKwkJCWZwLT50eHFzID0ga2NhbGxvYyhlZGV2LT5udW1fdGMsIHNpemVvZigqZnAtPnR4cXMpLAorCQkJCQkgICBHRlBfS0VSTkVMKTsKKwkJCWlmICghZnAtPnR4cXMpIHsKKwkJCQlEUF9OT1RJQ0UoZWRldiwKKwkJCQkJICAiVFhRIGFycmF5IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCisJCWlmIChmcC0+dHlwZSAmIFFFREVfRkFTVFBBVEhfUlgpIHsKKwkJCWZwLT5yeHEgPSBrY2FsbG9jKDEsIHNpemVvZigqZnAtPnJ4cSksIEdGUF9LRVJORUwpOworCQkJaWYgKCFmcC0+cnhxKSB7CisJCQkJRFBfTk9USUNFKGVkZXYsCisJCQkJCSAgIlJYUSBzdHJ1Y3QgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQkJCWdvdG8gZXJyOworCQkJfQogCQl9CiAJfQogCkBAIC0yNDUzLDcgKzI0OTgsNyBAQAogCQkJYm9vbCBpc192ZiwgZW51bSBxZWRlX3Byb2JlX21vZGUgbW9kZSkKIHsKIAlzdHJ1Y3QgcWVkX3Byb2JlX3BhcmFtcyBwcm9iZV9wYXJhbXM7Ci0Jc3RydWN0IHFlZF9zbG93cGF0aF9wYXJhbXMgcGFyYW1zOworCXN0cnVjdCBxZWRfc2xvd3BhdGhfcGFyYW1zIHNwX3BhcmFtczsKIAlzdHJ1Y3QgcWVkX2Rldl9ldGhfaW5mbyBkZXZfaW5mbzsKIAlzdHJ1Y3QgcWVkZV9kZXYgKmVkZXY7CiAJc3RydWN0IHFlZF9kZXYgKmNkZXY7CkBAIC0yNDc2LDE0ICsyNTIxLDE0IEBACiAJcWVkZV91cGRhdGVfcGZfcGFyYW1zKGNkZXYpOwogCiAJLyogU3RhcnQgdGhlIFNsb3dwYXRoLXByb2Nlc3MgKi8KLQltZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHN0cnVjdCBxZWRfc2xvd3BhdGhfcGFyYW1zKSk7Ci0JcGFyYW1zLmludF9tb2RlID0gUUVEX0lOVF9NT0RFX01TSVg7Ci0JcGFyYW1zLmRydl9tYWpvciA9IFFFREVfTUFKT1JfVkVSU0lPTjsKLQlwYXJhbXMuZHJ2X21pbm9yID0gUUVERV9NSU5PUl9WRVJTSU9OOwotCXBhcmFtcy5kcnZfcmV2ID0gUUVERV9SRVZJU0lPTl9WRVJTSU9OOwotCXBhcmFtcy5kcnZfZW5nID0gUUVERV9FTkdJTkVFUklOR19WRVJTSU9OOwotCXN0cmxjcHkocGFyYW1zLm5hbWUsICJxZWRlIExBTiIsIFFFRF9EUlZfVkVSX1NUUl9TSVpFKTsKLQlyYyA9IHFlZF9vcHMtPmNvbW1vbi0+c2xvd3BhdGhfc3RhcnQoY2RldiwgJnBhcmFtcyk7CisJbWVtc2V0KCZzcF9wYXJhbXMsIDAsIHNpemVvZihzcF9wYXJhbXMpKTsKKwlzcF9wYXJhbXMuaW50X21vZGUgPSBRRURfSU5UX01PREVfTVNJWDsKKwlzcF9wYXJhbXMuZHJ2X21ham9yID0gUUVERV9NQUpPUl9WRVJTSU9OOworCXNwX3BhcmFtcy5kcnZfbWlub3IgPSBRRURFX01JTk9SX1ZFUlNJT047CisJc3BfcGFyYW1zLmRydl9yZXYgPSBRRURFX1JFVklTSU9OX1ZFUlNJT047CisJc3BfcGFyYW1zLmRydl9lbmcgPSBRRURFX0VOR0lORUVSSU5HX1ZFUlNJT047CisJc3RybGNweShzcF9wYXJhbXMubmFtZSwgInFlZGUgTEFOIiwgUUVEX0RSVl9WRVJfU1RSX1NJWkUpOworCXJjID0gcWVkX29wcy0+Y29tbW9uLT5zbG93cGF0aF9zdGFydChjZGV2LCAmc3BfcGFyYW1zKTsKIAlpZiAocmMpIHsKIAkJcHJfbm90aWNlKCJDYW5ub3Qgc3RhcnQgc2xvd3BhdGhcbiIpOwogCQlnb3RvIGVycjE7CkBAIC0yNTA2LDEwICsyNTUxLDE0IEBACiAKIAlxZWRlX2luaXRfbmRldihlZGV2KTsKIAorCXJjID0gcWVkZV9yb2NlX2Rldl9hZGQoZWRldik7CisJaWYgKHJjKQorCQlnb3RvIGVycjM7CisKIAlyYyA9IHJlZ2lzdGVyX25ldGRldihlZGV2LT5uZGV2KTsKIAlpZiAocmMpIHsKIAkJRFBfTk9USUNFKGVkZXYsICJDYW5ub3QgcmVnaXN0ZXIgbmV0LWRldmljZVxuIik7Ci0JCWdvdG8gZXJyMzsKKwkJZ290byBlcnI0OwogCX0KIAogCWVkZXYtPm9wcy0+Y29tbW9uLT5zZXRfaWQoY2RldiwgZWRldi0+bmRldi0+bmFtZSwgRFJWX01PRFVMRV9WRVJTSU9OKTsKQEAgLTI1MTcsNyArMjU2Niw4IEBACiAJZWRldi0+b3BzLT5yZWdpc3Rlcl9vcHMoY2RldiwgJnFlZGVfbGxfb3BzLCBlZGV2KTsKIAogI2lmZGVmIENPTkZJR19EQ0IKLQlxZWRlX3NldF9kY2JubF9vcHMoZWRldi0+bmRldik7CisJaWYgKCFJU19WRihlZGV2KSkKKwkJcWVkZV9zZXRfZGNibmxfb3BzKGVkZXYtPm5kZXYpOwogI2VuZGlmCiAKIAlJTklUX0RFTEFZRURfV09SSygmZWRldi0+c3BfdGFzaywgcWVkZV9zcF90YXNrKTsKQEAgLTI1MjgsNiArMjU3OCw4IEBACiAKIAlyZXR1cm4gMDsKIAorZXJyNDoKKwlxZWRlX3JvY2VfZGV2X3JlbW92ZShlZGV2KTsKIGVycjM6CiAJZnJlZV9uZXRkZXYoZWRldi0+bmRldik7CiBlcnIyOgpAQCAtMjU3NCw4ICsyNjI2LDExIEBACiAJRFBfSU5GTyhlZGV2LCAiU3RhcnRpbmcgcWVkZV9yZW1vdmVcbiIpOwogCiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZlZGV2LT5zcF90YXNrKTsKKwogCXVucmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOwogCisJcWVkZV9yb2NlX2Rldl9yZW1vdmUoZWRldik7CisKIAllZGV2LT5vcHMtPmNvbW1vbi0+c2V0X3Bvd2VyX3N0YXRlKGNkZXYsIFBDSV9EMCk7CiAKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CkBAIC0yNTg2LDcgKzI2NDEsNyBAQAogCXFlZF9vcHMtPmNvbW1vbi0+c2xvd3BhdGhfc3RvcChjZGV2KTsKIAlxZWRfb3BzLT5jb21tb24tPnJlbW92ZShjZGV2KTsKIAotCXByX25vdGljZSgiRW5kaW5nIHN1Y2Nlc3NmdWxseSBxZWRlX3JlbW92ZVxuIik7CisJZGV2X2luZm8oJnBkZXYtPmRldiwgIkVuZGluZyBxZWRlX3JlbW92ZSBzdWNjZXNzZnVsbHlcbiIpOwogfQogCiBzdGF0aWMgdm9pZCBxZWRlX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKQEAgLTI2MDUsOCArMjY2MCw4IEBACiAJdTE2IHJzc19udW07CiAKIAkvKiBTZXR1cCBxdWV1ZXMgYWNjb3JkaW5nIHRvIHBvc3NpYmxlIHJlc291cmNlcyovCi0JaWYgKGVkZXYtPnJlcV9yc3MpCi0JCXJzc19udW0gPSBlZGV2LT5yZXFfcnNzOworCWlmIChlZGV2LT5yZXFfcXVldWVzKQorCQlyc3NfbnVtID0gZWRldi0+cmVxX3F1ZXVlczsKIAllbHNlCiAJCXJzc19udW0gPSBuZXRpZl9nZXRfbnVtX2RlZmF1bHRfcnNzX3F1ZXVlcygpICoKIAkJCSAgZWRldi0+ZGV2X2luZm8uY29tbW9uLm51bV9od2ZuczsKQEAgLTI2MTYsMTEgKzI2NzEsMTUgQEAKIAlyYyA9IGVkZXYtPm9wcy0+Y29tbW9uLT5zZXRfZnBfaW50KGVkZXYtPmNkZXYsIHJzc19udW0pOwogCWlmIChyYyA+IDApIHsKIAkJLyogTWFuYWdlZCB0byByZXF1ZXN0IGludGVycnVwdHMgZm9yIG91ciBxdWV1ZXMgKi8KLQkJZWRldi0+bnVtX3JzcyA9IHJjOworCQllZGV2LT5udW1fcXVldWVzID0gcmM7CiAJCURQX0lORk8oZWRldiwgIk1hbmFnZWQgJWQgW29mICVkXSBSU1MgcXVldWVzXG4iLAotCQkJUUVERV9SU1NfQ05UKGVkZXYpLCByc3NfbnVtKTsKKwkJCVFFREVfUVVFVUVfQ05UKGVkZXYpLCByc3NfbnVtKTsKIAkJcmMgPSAwOwogCX0KKworCWVkZXYtPmZwX251bV90eCA9IGVkZXYtPnJlcV9udW1fdHg7CisJZWRldi0+ZnBfbnVtX3J4ID0gZWRldi0+cmVxX251bV9yeDsKKwogCXJldHVybiByYzsKIH0KIApAQCAtMjYzNCwxNiArMjY5MywxNCBAQAogCiAvKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBmYXN0LXBhdGggc3RhdHVzIGJsb2NrIG1lbW9yeSAqLwogc3RhdGljIGludCBxZWRlX2FsbG9jX21lbV9zYihzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYsCi0JCQkgICAgIHN0cnVjdCBxZWRfc2JfaW5mbyAqc2JfaW5mbywKLQkJCSAgICAgdTE2IHNiX2lkKQorCQkJICAgICBzdHJ1Y3QgcWVkX3NiX2luZm8gKnNiX2luZm8sIHUxNiBzYl9pZCkKIHsKIAlzdHJ1Y3Qgc3RhdHVzX2Jsb2NrICpzYl92aXJ0OwogCWRtYV9hZGRyX3Qgc2JfcGh5czsKIAlpbnQgcmM7CiAKIAlzYl92aXJ0ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZlZGV2LT5wZGV2LT5kZXYsCi0JCQkJICAgICBzaXplb2YoKnNiX3ZpcnQpLAotCQkJCSAgICAgJnNiX3BoeXMsIEdGUF9LRVJORUwpOworCQkJCSAgICAgc2l6ZW9mKCpzYl92aXJ0KSwgJnNiX3BoeXMsIEdGUF9LRVJORUwpOwogCWlmICghc2JfdmlydCkgewogCQlEUF9FUlIoZWRldiwgIlN0YXR1cyBibG9jayBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjY3NSwxNiArMjczMiwxNSBAQAogCQlkYXRhID0gcnhfYnVmLT5kYXRhOwogCiAJCWRtYV91bm1hcF9wYWdlKCZlZGV2LT5wZGV2LT5kZXYsCi0JCQkgICAgICAgcnhfYnVmLT5tYXBwaW5nLAotCQkJICAgICAgIFBBR0VfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwkJCSAgICAgICByeF9idWYtPm1hcHBpbmcsIFBBR0VfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKIAogCQlyeF9idWYtPmRhdGEgPSBOVUxMOwogCQlfX2ZyZWVfcGFnZShkYXRhKTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHFlZGVfZnJlZV9zZ2VfbWVtKHN0cnVjdCBxZWRlX2RldiAqZWRldiwKLQkJCSAgICAgIHN0cnVjdCBxZWRlX3J4X3F1ZXVlICpyeHEpIHsKK3N0YXRpYyB2b2lkIHFlZGVfZnJlZV9zZ2VfbWVtKHN0cnVjdCBxZWRlX2RldiAqZWRldiwgc3RydWN0IHFlZGVfcnhfcXVldWUgKnJ4cSkKK3sKIAlpbnQgaTsKIAogCWlmIChlZGV2LT5ncm9fZGlzYWJsZSkKQEAgLTI3MDMsOCArMjc1OSw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBxZWRlX2ZyZWVfbWVtX3J4cShzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYsCi0JCQkgICAgICBzdHJ1Y3QgcWVkZV9yeF9xdWV1ZSAqcnhxKQorc3RhdGljIHZvaWQgcWVkZV9mcmVlX21lbV9yeHEoc3RydWN0IHFlZGVfZGV2ICplZGV2LCBzdHJ1Y3QgcWVkZV9yeF9xdWV1ZSAqcnhxKQogewogCXFlZGVfZnJlZV9zZ2VfbWVtKGVkZXYsIHJ4cSk7CiAKQEAgLTI3MjYsOSArMjc4MSw2IEBACiAJc3RydWN0IGV0aF9yeF9iZCAqcnhfYmQ7CiAJZG1hX2FkZHJfdCBtYXBwaW5nOwogCXN0cnVjdCBwYWdlICpkYXRhOwotCXUxNiByeF9idWZfc2l6ZTsKLQotCXJ4X2J1Zl9zaXplID0gcnhxLT5yeF9idWZfc2l6ZTsKIAogCWRhdGEgPSBhbGxvY19wYWdlcyhHRlBfQVRPTUlDLCAwKTsKIAlpZiAodW5saWtlbHkoIWRhdGEpKSB7CkBAIC0yNzYzLDggKzI4MTUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHFlZGVfYWxsb2Nfc2dlX21lbShzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYsCi0JCQkgICAgICBzdHJ1Y3QgcWVkZV9yeF9xdWV1ZSAqcnhxKQorc3RhdGljIGludCBxZWRlX2FsbG9jX3NnZV9tZW0oc3RydWN0IHFlZGVfZGV2ICplZGV2LCBzdHJ1Y3QgcWVkZV9yeF9xdWV1ZSAqcnhxKQogewogCWRtYV9hZGRyX3QgbWFwcGluZzsKIAlpbnQgaTsKQEAgLTI4MTEsMTUgKzI4NjIsMTQgQEAKIH0KIAogLyogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYWxsIG1lbW9yeSBuZWVkZWQgcGVyIFJ4IHF1ZXVlICovCi1zdGF0aWMgaW50IHFlZGVfYWxsb2NfbWVtX3J4cShzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYsCi0JCQkgICAgICBzdHJ1Y3QgcWVkZV9yeF9xdWV1ZSAqcnhxKQorc3RhdGljIGludCBxZWRlX2FsbG9jX21lbV9yeHEoc3RydWN0IHFlZGVfZGV2ICplZGV2LCBzdHJ1Y3QgcWVkZV9yeF9xdWV1ZSAqcnhxKQogewogCWludCBpLCByYywgc2l6ZTsKIAogCXJ4cS0+bnVtX3J4X2J1ZmZlcnMgPSBlZGV2LT5xX251bV9yeF9idWZmZXJzOwogCi0JcnhxLT5yeF9idWZfc2l6ZSA9IE5FVF9JUF9BTElHTiArIEVUSF9PVkVSSEVBRCArCi0JCQkgICBlZGV2LT5uZGV2LT5tdHU7CisJcnhxLT5yeF9idWZfc2l6ZSA9IE5FVF9JUF9BTElHTiArIEVUSF9PVkVSSEVBRCArIGVkZXYtPm5kZXYtPm10dTsKKwogCWlmIChyeHEtPnJ4X2J1Zl9zaXplID4gUEFHRV9TSVpFKQogCQlyeHEtPnJ4X2J1Zl9zaXplID0gUEFHRV9TSVpFOwogCkBAIC0yODczLDggKzI5MjMsNyBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIHZvaWQgcWVkZV9mcmVlX21lbV90eHEoc3RydWN0IHFlZGVfZGV2ICplZGV2LAotCQkJICAgICAgc3RydWN0IHFlZGVfdHhfcXVldWUgKnR4cSkKK3N0YXRpYyB2b2lkIHFlZGVfZnJlZV9tZW1fdHhxKHN0cnVjdCBxZWRlX2RldiAqZWRldiwgc3RydWN0IHFlZGVfdHhfcXVldWUgKnR4cSkKIHsKIAkvKiBGcmVlIHRoZSBwYXJhbGxlbCBTVyByaW5nICovCiAJa2ZyZWUodHhxLT5zd190eF9yaW5nKTsKQEAgLTI4ODQsOCArMjkzMyw3IEBACiB9CiAKIC8qIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGFsbCBtZW1vcnkgbmVlZGVkIHBlciBUeCBxdWV1ZSAqLwotc3RhdGljIGludCBxZWRlX2FsbG9jX21lbV90eHEoc3RydWN0IHFlZGVfZGV2ICplZGV2LAotCQkJICAgICAgc3RydWN0IHFlZGVfdHhfcXVldWUgKnR4cSkKK3N0YXRpYyBpbnQgcWVkZV9hbGxvY19tZW1fdHhxKHN0cnVjdCBxZWRlX2RldiAqZWRldiwgc3RydWN0IHFlZGVfdHhfcXVldWUgKnR4cSkKIHsKIAlpbnQgc2l6ZSwgcmM7CiAJdW5pb24gZXRoX3R4X2JkX3R5cGVzICpwX3ZpcnQ7CkBAIC0yOTE3LDQxICsyOTY1LDQ1IEBACiB9CiAKIC8qIFRoaXMgZnVuY3Rpb24gZnJlZXMgYWxsIG1lbW9yeSBvZiBhIHNpbmdsZSBmcCAqLwotc3RhdGljIHZvaWQgcWVkZV9mcmVlX21lbV9mcChzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYsCi0JCQkgICAgIHN0cnVjdCBxZWRlX2Zhc3RwYXRoICpmcCkKK3N0YXRpYyB2b2lkIHFlZGVfZnJlZV9tZW1fZnAoc3RydWN0IHFlZGVfZGV2ICplZGV2LCBzdHJ1Y3QgcWVkZV9mYXN0cGF0aCAqZnApCiB7CiAJaW50IHRjOwogCiAJcWVkZV9mcmVlX21lbV9zYihlZGV2LCBmcC0+c2JfaW5mbyk7CiAKLQlxZWRlX2ZyZWVfbWVtX3J4cShlZGV2LCBmcC0+cnhxKTsKKwlpZiAoZnAtPnR5cGUgJiBRRURFX0ZBU1RQQVRIX1JYKQorCQlxZWRlX2ZyZWVfbWVtX3J4cShlZGV2LCBmcC0+cnhxKTsKIAotCWZvciAodGMgPSAwOyB0YyA8IGVkZXYtPm51bV90YzsgdGMrKykKLQkJcWVkZV9mcmVlX21lbV90eHEoZWRldiwgJmZwLT50eHFzW3RjXSk7CisJaWYgKGZwLT50eXBlICYgUUVERV9GQVNUUEFUSF9UWCkKKwkJZm9yICh0YyA9IDA7IHRjIDwgZWRldi0+bnVtX3RjOyB0YysrKQorCQkJcWVkZV9mcmVlX21lbV90eHEoZWRldiwgJmZwLT50eHFzW3RjXSk7CiB9CiAKIC8qIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGFsbCBtZW1vcnkgbmVlZGVkIGZvciBhIHNpbmdsZSBmcCAoaS5lLiBhbiBlbnRpdHkKLSAqIHdoaWNoIGNvbnRhaW5zIHN0YXR1cyBibG9jaywgb25lIHJ4IHF1ZXVlIGFuZCBtdWx0aXBsZSBwZXItVEMgdHggcXVldWVzLgorICogd2hpY2ggY29udGFpbnMgc3RhdHVzIGJsb2NrLCBvbmUgcnggcXVldWUgYW5kL29yIG11bHRpcGxlIHBlci1UQyB0eCBxdWV1ZXMuCiAgKi8KLXN0YXRpYyBpbnQgcWVkZV9hbGxvY19tZW1fZnAoc3RydWN0IHFlZGVfZGV2ICplZGV2LAotCQkJICAgICBzdHJ1Y3QgcWVkZV9mYXN0cGF0aCAqZnApCitzdGF0aWMgaW50IHFlZGVfYWxsb2NfbWVtX2ZwKHN0cnVjdCBxZWRlX2RldiAqZWRldiwgc3RydWN0IHFlZGVfZmFzdHBhdGggKmZwKQogewogCWludCByYywgdGM7CiAKLQlyYyA9IHFlZGVfYWxsb2NfbWVtX3NiKGVkZXYsIGZwLT5zYl9pbmZvLCBmcC0+cnNzX2lkKTsKKwlyYyA9IHFlZGVfYWxsb2NfbWVtX3NiKGVkZXYsIGZwLT5zYl9pbmZvLCBmcC0+aWQpOwogCWlmIChyYykKIAkJZ290byBlcnI7CiAKLQlyYyA9IHFlZGVfYWxsb2NfbWVtX3J4cShlZGV2LCBmcC0+cnhxKTsKLQlpZiAocmMpCi0JCWdvdG8gZXJyOwotCi0JZm9yICh0YyA9IDA7IHRjIDwgZWRldi0+bnVtX3RjOyB0YysrKSB7Ci0JCXJjID0gcWVkZV9hbGxvY19tZW1fdHhxKGVkZXYsICZmcC0+dHhxc1t0Y10pOworCWlmIChmcC0+dHlwZSAmIFFFREVfRkFTVFBBVEhfUlgpIHsKKwkJcmMgPSBxZWRlX2FsbG9jX21lbV9yeHEoZWRldiwgZnAtPnJ4cSk7CiAJCWlmIChyYykKIAkJCWdvdG8gZXJyOwogCX0KIAorCWlmIChmcC0+dHlwZSAmIFFFREVfRkFTVFBBVEhfVFgpIHsKKwkJZm9yICh0YyA9IDA7IHRjIDwgZWRldi0+bnVtX3RjOyB0YysrKSB7CisJCQlyYyA9IHFlZGVfYWxsb2NfbWVtX3R4cShlZGV2LCAmZnAtPnR4cXNbdGNdKTsKKwkJCWlmIChyYykKKwkJCQlnb3RvIGVycjsKKwkJfQorCX0KKwogCXJldHVybiAwOwogZXJyOgogCXJldHVybiByYzsKQEAgLTI5NjEsNyArMzAxMyw3IEBACiB7CiAJaW50IGk7CiAKLQlmb3JfZWFjaF9yc3MoaSkgeworCWZvcl9lYWNoX3F1ZXVlKGkpIHsKIAkJc3RydWN0IHFlZGVfZmFzdHBhdGggKmZwID0gJmVkZXYtPmZwX2FycmF5W2ldOwogCiAJCXFlZGVfZnJlZV9tZW1fZnAoZWRldiwgZnApOwpAQCAtMjk3MSwxNiArMzAyMywxNiBAQAogLyogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYWxsIHFlZGUgbWVtb3J5IGF0IE5JQyBsb2FkLiAqLwogc3RhdGljIGludCBxZWRlX2FsbG9jX21lbV9sb2FkKHN0cnVjdCBxZWRlX2RldiAqZWRldikKIHsKLQlpbnQgcmMgPSAwLCByc3NfaWQ7CisJaW50IHJjID0gMCwgcXVldWVfaWQ7CiAKLQlmb3IgKHJzc19pZCA9IDA7IHJzc19pZCA8IFFFREVfUlNTX0NOVChlZGV2KTsgcnNzX2lkKyspIHsKLQkJc3RydWN0IHFlZGVfZmFzdHBhdGggKmZwID0gJmVkZXYtPmZwX2FycmF5W3Jzc19pZF07CisJZm9yIChxdWV1ZV9pZCA9IDA7IHF1ZXVlX2lkIDwgUUVERV9RVUVVRV9DTlQoZWRldik7IHF1ZXVlX2lkKyspIHsKKwkJc3RydWN0IHFlZGVfZmFzdHBhdGggKmZwID0gJmVkZXYtPmZwX2FycmF5W3F1ZXVlX2lkXTsKIAogCQlyYyA9IHFlZGVfYWxsb2NfbWVtX2ZwKGVkZXYsIGZwKTsKIAkJaWYgKHJjKSB7CiAJCQlEUF9FUlIoZWRldiwKIAkJCSAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZmFzdHBhdGggLSByc3MgaWQgPSAlZFxuIiwKLQkJCSAgICAgICByc3NfaWQpOworCQkJICAgICAgIHF1ZXVlX2lkKTsKIAkJCXFlZGVfZnJlZV9tZW1fbG9hZChlZGV2KTsKIAkJCXJldHVybiByYzsKIAkJfQpAQCAtMjk5MiwzMCArMzA0NCwzOCBAQAogLyogVGhpcyBmdW5jdGlvbiBpbml0cyBmcCBjb250ZW50IGFuZCByZXNldHMgdGhlIFNCLCBSWFEgYW5kIFRYUSBzdHJ1Y3R1cmVzICovCiBzdGF0aWMgdm9pZCBxZWRlX2luaXRfZnAoc3RydWN0IHFlZGVfZGV2ICplZGV2KQogewotCWludCByc3NfaWQsIHR4cV9pbmRleCwgdGM7CisJaW50IHF1ZXVlX2lkLCByeHFfaW5kZXggPSAwLCB0eHFfaW5kZXggPSAwLCB0YzsKIAlzdHJ1Y3QgcWVkZV9mYXN0cGF0aCAqZnA7CiAKLQlmb3JfZWFjaF9yc3MocnNzX2lkKSB7Ci0JCWZwID0gJmVkZXYtPmZwX2FycmF5W3Jzc19pZF07CisJZm9yX2VhY2hfcXVldWUocXVldWVfaWQpIHsKKwkJZnAgPSAmZWRldi0+ZnBfYXJyYXlbcXVldWVfaWRdOwogCiAJCWZwLT5lZGV2ID0gZWRldjsKLQkJZnAtPnJzc19pZCA9IHJzc19pZDsKKwkJZnAtPmlkID0gcXVldWVfaWQ7CiAKIAkJbWVtc2V0KCh2b2lkICopJmZwLT5uYXBpLCAwLCBzaXplb2YoZnAtPm5hcGkpKTsKIAogCQltZW1zZXQoKHZvaWQgKilmcC0+c2JfaW5mbywgMCwgc2l6ZW9mKCpmcC0+c2JfaW5mbykpOwogCi0JCW1lbXNldCgodm9pZCAqKWZwLT5yeHEsIDAsIHNpemVvZigqZnAtPnJ4cSkpOwotCQlmcC0+cnhxLT5yeHFfaWQgPSByc3NfaWQ7CisJCWlmIChmcC0+dHlwZSAmIFFFREVfRkFTVFBBVEhfUlgpIHsKKwkJCW1lbXNldCgodm9pZCAqKWZwLT5yeHEsIDAsIHNpemVvZigqZnAtPnJ4cSkpOworCQkJZnAtPnJ4cS0+cnhxX2lkID0gcnhxX2luZGV4Kys7CisJCX0KIAotCQltZW1zZXQoKHZvaWQgKilmcC0+dHhxcywgMCwgKGVkZXYtPm51bV90YyAqIHNpemVvZigqZnAtPnR4cXMpKSk7Ci0JCWZvciAodGMgPSAwOyB0YyA8IGVkZXYtPm51bV90YzsgdGMrKykgewotCQkJdHhxX2luZGV4ID0gdGMgKiBRRURFX1JTU19DTlQoZWRldikgKyByc3NfaWQ7Ci0JCQlmcC0+dHhxc1t0Y10uaW5kZXggPSB0eHFfaW5kZXg7CisJCWlmIChmcC0+dHlwZSAmIFFFREVfRkFTVFBBVEhfVFgpIHsKKwkJCW1lbXNldCgodm9pZCAqKWZwLT50eHFzLCAwLAorCQkJICAgICAgIChlZGV2LT5udW1fdGMgKiBzaXplb2YoKmZwLT50eHFzKSkpOworCQkJZm9yICh0YyA9IDA7IHRjIDwgZWRldi0+bnVtX3RjOyB0YysrKSB7CisJCQkJZnAtPnR4cXNbdGNdLmluZGV4ID0gdHhxX2luZGV4ICsKKwkJCQkgICAgdGMgKiBRRURFX1RTU19DT1VOVChlZGV2KTsKKwkJCQlpZiAoZWRldi0+ZGV2X2luZm8uaXNfbGVnYWN5KQorCQkJCQlmcC0+dHhxc1t0Y10uaXNfbGVnYWN5ID0gdHJ1ZTsKKwkJCX0KKwkJCXR4cV9pbmRleCsrOwogCQl9CiAKIAkJc25wcmludGYoZnAtPm5hbWUsIHNpemVvZihmcC0+bmFtZSksICIlcy1mcC0lZCIsCi0JCQkgZWRldi0+bmRldi0+bmFtZSwgcnNzX2lkKTsKKwkJCSBlZGV2LT5uZGV2LT5uYW1lLCBxdWV1ZV9pZCk7CiAJfQogCiAJZWRldi0+Z3JvX2Rpc2FibGUgPSAhKGVkZXYtPm5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9HUk8pOwpAQCAtMzAyNSwxMiArMzA4NSwxMyBAQAogewogCWludCByYyA9IDA7CiAKLQlyYyA9IG5ldGlmX3NldF9yZWFsX251bV90eF9xdWV1ZXMoZWRldi0+bmRldiwgUUVERV9UU1NfQ05UKGVkZXYpKTsKKwlyYyA9IG5ldGlmX3NldF9yZWFsX251bV90eF9xdWV1ZXMoZWRldi0+bmRldiwgUUVERV9UU1NfQ09VTlQoZWRldikpOwogCWlmIChyYykgewogCQlEUF9OT1RJQ0UoZWRldiwgIkZhaWxlZCB0byBzZXQgcmVhbCBudW1iZXIgb2YgVHggcXVldWVzXG4iKTsKIAkJcmV0dXJuIHJjOwogCX0KLQlyYyA9IG5ldGlmX3NldF9yZWFsX251bV9yeF9xdWV1ZXMoZWRldi0+bmRldiwgUUVERV9SU1NfQ05UKGVkZXYpKTsKKworCXJjID0gbmV0aWZfc2V0X3JlYWxfbnVtX3J4X3F1ZXVlcyhlZGV2LT5uZGV2LCBRRURFX1JTU19DT1VOVChlZGV2KSk7CiAJaWYgKHJjKSB7CiAJCURQX05PVElDRShlZGV2LCAiRmFpbGVkIHRvIHNldCByZWFsIG51bWJlciBvZiBSeCBxdWV1ZXNcbiIpOwogCQlyZXR1cm4gcmM7CkBAIC0zMDQzLDcgKzMxMDQsNyBAQAogewogCWludCBpOwogCi0JZm9yX2VhY2hfcnNzKGkpIHsKKwlmb3JfZWFjaF9xdWV1ZShpKSB7CiAJCW5hcGlfZGlzYWJsZSgmZWRldi0+ZnBfYXJyYXlbaV0ubmFwaSk7CiAKIAkJbmV0aWZfbmFwaV9kZWwoJmVkZXYtPmZwX2FycmF5W2ldLm5hcGkpOwpAQCAtMzA1NSw3ICszMTE2LDcgQEAKIAlpbnQgaTsKIAogCS8qIEFkZCBOQVBJIG9iamVjdHMgKi8KLQlmb3JfZWFjaF9yc3MoaSkgeworCWZvcl9lYWNoX3F1ZXVlKGkpIHsKIAkJbmV0aWZfbmFwaV9hZGQoZWRldi0+bmRldiwgJmVkZXYtPmZwX2FycmF5W2ldLm5hcGksCiAJCQkgICAgICAgcWVkZV9wb2xsLCBOQVBJX1BPTExfV0VJR0hUKTsKIAkJbmFwaV9lbmFibGUoJmVkZXYtPmZwX2FycmF5W2ldLm5hcGkpOwpAQCAtMzA4NCwxNCArMzE0NSwxNCBAQAogCWludCBpLCByYzsKIAogCS8qIFNhbml0aXplIG51bWJlciBvZiBpbnRlcnJ1cHRzID09IG51bWJlciBvZiBwcmVwYXJlZCBSU1MgcXVldWVzICovCi0JaWYgKFFFREVfUlNTX0NOVChlZGV2KSA+IGVkZXYtPmludF9pbmZvLm1zaXhfY250KSB7CisJaWYgKFFFREVfUVVFVUVfQ05UKGVkZXYpID4gZWRldi0+aW50X2luZm8ubXNpeF9jbnQpIHsKIAkJRFBfRVJSKGVkZXYsCiAJCSAgICAgICAiSW50ZXJydXB0IG1pc21hdGNoOiAlZCBSU1MgcXVldWVzID4gJWQgTVNJLXggdmVjdG9yc1xuIiwKLQkJICAgICAgIFFFREVfUlNTX0NOVChlZGV2KSwgZWRldi0+aW50X2luZm8ubXNpeF9jbnQpOworCQkgICAgICAgUUVERV9RVUVVRV9DTlQoZWRldiksIGVkZXYtPmludF9pbmZvLm1zaXhfY250KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IFFFREVfUlNTX0NOVChlZGV2KTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IFFFREVfUVVFVUVfQ05UKGVkZXYpOyBpKyspIHsKIAkJcmMgPSByZXF1ZXN0X2lycShlZGV2LT5pbnRfaW5mby5tc2l4W2ldLnZlY3RvciwKIAkJCQkgcWVkZV9tc2l4X2ZwX2ludCwgMCwgZWRldi0+ZnBfYXJyYXlbaV0ubmFtZSwKIAkJCQkgJmVkZXYtPmZwX2FycmF5W2ldKTsKQEAgLTMxMzYsMTggKzMxOTcsMTcgQEAKIAogCQkvKiBxZWQgc2hvdWxkIGxlYXJuIHJlY2VpdmUgdGhlIFJTUyBpZHMgYW5kIGNhbGxiYWNrcyAqLwogCQlvcHMgPSBlZGV2LT5vcHMtPmNvbW1vbjsKLQkJZm9yIChpID0gMDsgaSA8IFFFREVfUlNTX0NOVChlZGV2KTsgaSsrKQorCQlmb3IgKGkgPSAwOyBpIDwgUUVERV9RVUVVRV9DTlQoZWRldik7IGkrKykKIAkJCW9wcy0+c2ltZF9oYW5kbGVyX2NvbmZpZyhlZGV2LT5jZGV2LAogCQkJCQkJICZlZGV2LT5mcF9hcnJheVtpXSwgaSwKIAkJCQkJCSBxZWRlX3NpbWRfZnBfaGFuZGxlcik7Ci0JCWVkZXYtPmludF9pbmZvLnVzZWRfY250ID0gUUVERV9SU1NfQ05UKGVkZXYpOworCQllZGV2LT5pbnRfaW5mby51c2VkX2NudCA9IFFFREVfUVVFVUVfQ05UKGVkZXYpOwogCX0KIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBxZWRlX2RyYWluX3R4cShzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYsCi0JCQkgIHN0cnVjdCBxZWRlX3R4X3F1ZXVlICp0eHEsCi0JCQkgIGJvb2wgYWxsb3dfZHJhaW4pCisJCQkgIHN0cnVjdCBxZWRlX3R4X3F1ZXVlICp0eHEsIGJvb2wgYWxsb3dfZHJhaW4pCiB7CiAJaW50IHJjLCBjbnQgPSAxMDAwOwogCkBAIC0zMTk5LDQ1ICszMjU5LDUzIEBACiAJfQogCiAJLyogRmx1c2ggVHggcXVldWVzLiBJZiBuZWVkZWQsIHJlcXVlc3QgZHJhaW4gZnJvbSBNQ1AgKi8KLQlmb3JfZWFjaF9yc3MoaSkgeworCWZvcl9lYWNoX3F1ZXVlKGkpIHsKIAkJc3RydWN0IHFlZGVfZmFzdHBhdGggKmZwID0gJmVkZXYtPmZwX2FycmF5W2ldOwogCi0JCWZvciAodGMgPSAwOyB0YyA8IGVkZXYtPm51bV90YzsgdGMrKykgewotCQkJc3RydWN0IHFlZGVfdHhfcXVldWUgKnR4cSA9ICZmcC0+dHhxc1t0Y107CisJCWlmIChmcC0+dHlwZSAmIFFFREVfRkFTVFBBVEhfVFgpIHsKKwkJCWZvciAodGMgPSAwOyB0YyA8IGVkZXYtPm51bV90YzsgdGMrKykgeworCQkJCXN0cnVjdCBxZWRlX3R4X3F1ZXVlICp0eHEgPSAmZnAtPnR4cXNbdGNdOwogCi0JCQlyYyA9IHFlZGVfZHJhaW5fdHhxKGVkZXYsIHR4cSwgdHJ1ZSk7Ci0JCQlpZiAocmMpCi0JCQkJcmV0dXJuIHJjOworCQkJCXJjID0gcWVkZV9kcmFpbl90eHEoZWRldiwgdHhxLCB0cnVlKTsKKwkJCQlpZiAocmMpCisJCQkJCXJldHVybiByYzsKKwkJCX0KIAkJfQogCX0KIAotCS8qIFN0b3AgYWxsIFF1ZXVlcyBpbiByZXZlcnNlIG9yZGVyKi8KLQlmb3IgKGkgPSBRRURFX1JTU19DTlQoZWRldikgLSAxOyBpID49IDA7IGktLSkgeworCS8qIFN0b3AgYWxsIFF1ZXVlcyBpbiByZXZlcnNlIG9yZGVyICovCisJZm9yIChpID0gUUVERV9RVUVVRV9DTlQoZWRldikgLSAxOyBpID49IDA7IGktLSkgewogCQlzdHJ1Y3QgcWVkX3N0b3BfcnhxX3BhcmFtcyByeF9wYXJhbXM7CiAKLQkJLyogU3RvcCB0aGUgVHggUXVldWUocykqLwotCQlmb3IgKHRjID0gMDsgdGMgPCBlZGV2LT5udW1fdGM7IHRjKyspIHsKLQkJCXN0cnVjdCBxZWRfc3RvcF90eHFfcGFyYW1zIHR4X3BhcmFtczsKKwkJLyogU3RvcCB0aGUgVHggUXVldWUocykgKi8KKwkJaWYgKGVkZXYtPmZwX2FycmF5W2ldLnR5cGUgJiBRRURFX0ZBU1RQQVRIX1RYKSB7CisJCQlmb3IgKHRjID0gMDsgdGMgPCBlZGV2LT5udW1fdGM7IHRjKyspIHsKKwkJCQlzdHJ1Y3QgcWVkX3N0b3BfdHhxX3BhcmFtcyB0eF9wYXJhbXM7CisJCQkJdTggdmFsOwogCi0JCQl0eF9wYXJhbXMucnNzX2lkID0gaTsKLQkJCXR4X3BhcmFtcy50eF9xdWV1ZV9pZCA9IHRjICogUUVERV9SU1NfQ05UKGVkZXYpICsgaTsKLQkJCXJjID0gZWRldi0+b3BzLT5xX3R4X3N0b3AoY2RldiwgJnR4X3BhcmFtcyk7Ci0JCQlpZiAocmMpIHsKLQkJCQlEUF9FUlIoZWRldiwgIkZhaWxlZCB0byBzdG9wIFRYUSAjJWRcbiIsCi0JCQkJICAgICAgIHR4X3BhcmFtcy50eF9xdWV1ZV9pZCk7Ci0JCQkJcmV0dXJuIHJjOworCQkJCXR4X3BhcmFtcy5yc3NfaWQgPSBpOworCQkJCXZhbCA9IGVkZXYtPmZwX2FycmF5W2ldLnR4cXNbdGNdLmluZGV4OworCQkJCXR4X3BhcmFtcy50eF9xdWV1ZV9pZCA9IHZhbDsKKwkJCQlyYyA9IGVkZXYtPm9wcy0+cV90eF9zdG9wKGNkZXYsICZ0eF9wYXJhbXMpOworCQkJCWlmIChyYykgeworCQkJCQlEUF9FUlIoZWRldiwgIkZhaWxlZCB0byBzdG9wIFRYUSAjJWRcbiIsCisJCQkJCSAgICAgICB0eF9wYXJhbXMudHhfcXVldWVfaWQpOworCQkJCQlyZXR1cm4gcmM7CisJCQkJfQogCQkJfQogCQl9CiAKLQkJLyogU3RvcCB0aGUgUnggUXVldWUqLwotCQltZW1zZXQoJnJ4X3BhcmFtcywgMCwgc2l6ZW9mKHJ4X3BhcmFtcykpOwotCQlyeF9wYXJhbXMucnNzX2lkID0gaTsKLQkJcnhfcGFyYW1zLnJ4X3F1ZXVlX2lkID0gaTsKKwkJLyogU3RvcCB0aGUgUnggUXVldWUgKi8KKwkJaWYgKGVkZXYtPmZwX2FycmF5W2ldLnR5cGUgJiBRRURFX0ZBU1RQQVRIX1JYKSB7CisJCQltZW1zZXQoJnJ4X3BhcmFtcywgMCwgc2l6ZW9mKHJ4X3BhcmFtcykpOworCQkJcnhfcGFyYW1zLnJzc19pZCA9IGk7CisJCQlyeF9wYXJhbXMucnhfcXVldWVfaWQgPSBlZGV2LT5mcF9hcnJheVtpXS5yeHEtPnJ4cV9pZDsKIAotCQlyYyA9IGVkZXYtPm9wcy0+cV9yeF9zdG9wKGNkZXYsICZyeF9wYXJhbXMpOwotCQlpZiAocmMpIHsKLQkJCURQX0VSUihlZGV2LCAiRmFpbGVkIHRvIHN0b3AgUlhRICMlZFxuIiwgaSk7Ci0JCQlyZXR1cm4gcmM7CisJCQlyYyA9IGVkZXYtPm9wcy0+cV9yeF9zdG9wKGNkZXYsICZyeF9wYXJhbXMpOworCQkJaWYgKHJjKSB7CisJCQkJRFBfRVJSKGVkZXYsICJGYWlsZWQgdG8gc3RvcCBSWFEgIyVkXG4iLCBpKTsKKwkJCQlyZXR1cm4gcmM7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTMyNjAsNyArMzMyOCw3IEBACiAJc3RydWN0IHFlZF9zdGFydF92cG9ydF9wYXJhbXMgc3RhcnQgPSB7MH07CiAJYm9vbCByZXNldF9yc3NfaW5kaXIgPSBmYWxzZTsKIAotCWlmICghZWRldi0+bnVtX3JzcykgeworCWlmICghZWRldi0+bnVtX3F1ZXVlcykgewogCQlEUF9FUlIoZWRldiwKIAkJICAgICAgICJDYW5ub3QgdXBkYXRlIFYtVlBPUlQgYXMgYWN0aXZlIGFzIHRoZXJlIGFyZSBubyBSeCBxdWV1ZXNcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTMyODQsNTAgKzMzNTIsNjYgQEAKIAkJICAgIlN0YXJ0IHZwb3J0IHJhbXJvZCBwYXNzZWQsIHZwb3J0X2lkID0gJWQsIE1UVSA9ICVkLCB2bGFuX3JlbW92YWxfZW4gPSAlZFxuIiwKIAkJICAgc3RhcnQudnBvcnRfaWQsIGVkZXYtPm5kZXYtPm10dSArIDB4ZSwgdmxhbl9yZW1vdmFsX2VuKTsKIAotCWZvcl9lYWNoX3JzcyhpKSB7CisJZm9yX2VhY2hfcXVldWUoaSkgewogCQlzdHJ1Y3QgcWVkZV9mYXN0cGF0aCAqZnAgPSAmZWRldi0+ZnBfYXJyYXlbaV07Ci0JCWRtYV9hZGRyX3QgcGh5c190YWJsZSA9IGZwLT5yeHEtPnJ4X2NvbXBfcmluZy5wYmwucF9waHlzX3RhYmxlOworCQlkbWFfYWRkcl90IHBfcGh5c190YWJsZTsKKwkJdTMyIHBhZ2VfY250OwogCi0JCW1lbXNldCgmcV9wYXJhbXMsIDAsIHNpemVvZihxX3BhcmFtcykpOwotCQlxX3BhcmFtcy5yc3NfaWQgPSBpOwotCQlxX3BhcmFtcy5xdWV1ZV9pZCA9IGk7Ci0JCXFfcGFyYW1zLnZwb3J0X2lkID0gMDsKLQkJcV9wYXJhbXMuc2IgPSBmcC0+c2JfaW5mby0+aWd1X3NiX2lkOwotCQlxX3BhcmFtcy5zYl9pZHggPSBSWF9QSTsKLQotCQlyYyA9IGVkZXYtPm9wcy0+cV9yeF9zdGFydChjZGV2LCAmcV9wYXJhbXMsCi0JCQkJCSAgIGZwLT5yeHEtPnJ4X2J1Zl9zaXplLAotCQkJCQkgICBmcC0+cnhxLT5yeF9iZF9yaW5nLnBfcGh5c19hZGRyLAotCQkJCQkgICBwaHlzX3RhYmxlLAotCQkJCQkgICBmcC0+cnhxLT5yeF9jb21wX3JpbmcucGFnZV9jbnQsCi0JCQkJCSAgICZmcC0+cnhxLT5od19yeHFfcHJvZF9hZGRyKTsKLQkJaWYgKHJjKSB7Ci0JCQlEUF9FUlIoZWRldiwgIlN0YXJ0IFJYUSAjJWQgZmFpbGVkICVkXG4iLCBpLCByYyk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQotCQlmcC0+cnhxLT5od19jb25zX3B0ciA9ICZmcC0+c2JfaW5mby0+c2JfdmlydC0+cGlfYXJyYXlbUlhfUEldOwotCi0JCXFlZGVfdXBkYXRlX3J4X3Byb2QoZWRldiwgZnAtPnJ4cSk7Ci0KLQkJZm9yICh0YyA9IDA7IHRjIDwgZWRldi0+bnVtX3RjOyB0YysrKSB7Ci0JCQlzdHJ1Y3QgcWVkZV90eF9xdWV1ZSAqdHhxID0gJmZwLT50eHFzW3RjXTsKLQkJCWludCB0eHFfaW5kZXggPSB0YyAqIFFFREVfUlNTX0NOVChlZGV2KSArIGk7CisJCWlmIChmcC0+dHlwZSAmIFFFREVfRkFTVFBBVEhfUlgpIHsKKwkJCXN0cnVjdCBxZWRlX3J4X3F1ZXVlICpyeHEgPSBmcC0+cnhxOworCQkJX19sZTE2ICp2YWw7CiAKIAkJCW1lbXNldCgmcV9wYXJhbXMsIDAsIHNpemVvZihxX3BhcmFtcykpOwogCQkJcV9wYXJhbXMucnNzX2lkID0gaTsKLQkJCXFfcGFyYW1zLnF1ZXVlX2lkID0gdHhxX2luZGV4OworCQkJcV9wYXJhbXMucXVldWVfaWQgPSByeHEtPnJ4cV9pZDsKKwkJCXFfcGFyYW1zLnZwb3J0X2lkID0gMDsKKwkJCXFfcGFyYW1zLnNiID0gZnAtPnNiX2luZm8tPmlndV9zYl9pZDsKKwkJCXFfcGFyYW1zLnNiX2lkeCA9IFJYX1BJOworCisJCQlwX3BoeXNfdGFibGUgPQorCQkJICAgIHFlZF9jaGFpbl9nZXRfcGJsX3BoeXMoJnJ4cS0+cnhfY29tcF9yaW5nKTsKKwkJCXBhZ2VfY250ID0gcWVkX2NoYWluX2dldF9wYWdlX2NudCgmcnhxLT5yeF9jb21wX3JpbmcpOworCisJCQlyYyA9IGVkZXYtPm9wcy0+cV9yeF9zdGFydChjZGV2LCAmcV9wYXJhbXMsCisJCQkJCQkgICByeHEtPnJ4X2J1Zl9zaXplLAorCQkJCQkJICAgcnhxLT5yeF9iZF9yaW5nLnBfcGh5c19hZGRyLAorCQkJCQkJICAgcF9waHlzX3RhYmxlLAorCQkJCQkJICAgcGFnZV9jbnQsCisJCQkJCQkgICAmcnhxLT5od19yeHFfcHJvZF9hZGRyKTsKKwkJCWlmIChyYykgeworCQkJCURQX0VSUihlZGV2LCAiU3RhcnQgUlhRICMlZCBmYWlsZWQgJWRcbiIsIGksCisJCQkJICAgICAgIHJjKTsKKwkJCQlyZXR1cm4gcmM7CisJCQl9CisKKwkJCXZhbCA9ICZmcC0+c2JfaW5mby0+c2JfdmlydC0+cGlfYXJyYXlbUlhfUEldOworCQkJcnhxLT5od19jb25zX3B0ciA9IHZhbDsKKworCQkJcWVkZV91cGRhdGVfcnhfcHJvZChlZGV2LCByeHEpOworCQl9CisKKwkJaWYgKCEoZnAtPnR5cGUgJiBRRURFX0ZBU1RQQVRIX1RYKSkKKwkJCWNvbnRpbnVlOworCisJCWZvciAodGMgPSAwOyB0YyA8IGVkZXYtPm51bV90YzsgdGMrKykgeworCQkJc3RydWN0IHFlZGVfdHhfcXVldWUgKnR4cSA9ICZmcC0+dHhxc1t0Y107CisKKwkJCXBfcGh5c190YWJsZSA9IHFlZF9jaGFpbl9nZXRfcGJsX3BoeXMoJnR4cS0+dHhfcGJsKTsKKwkJCXBhZ2VfY250ID0gcWVkX2NoYWluX2dldF9wYWdlX2NudCgmdHhxLT50eF9wYmwpOworCisJCQltZW1zZXQoJnFfcGFyYW1zLCAwLCBzaXplb2YocV9wYXJhbXMpKTsKKwkJCXFfcGFyYW1zLnJzc19pZCA9IGk7CisJCQlxX3BhcmFtcy5xdWV1ZV9pZCA9IHR4cS0+aW5kZXg7CiAJCQlxX3BhcmFtcy52cG9ydF9pZCA9IDA7CiAJCQlxX3BhcmFtcy5zYiA9IGZwLT5zYl9pbmZvLT5pZ3Vfc2JfaWQ7CiAJCQlxX3BhcmFtcy5zYl9pZHggPSBUWF9QSSh0Yyk7CiAKIAkJCXJjID0gZWRldi0+b3BzLT5xX3R4X3N0YXJ0KGNkZXYsICZxX3BhcmFtcywKLQkJCQkJCSAgIHR4cS0+dHhfcGJsLnBibC5wX3BoeXNfdGFibGUsCi0JCQkJCQkgICB0eHEtPnR4X3BibC5wYWdlX2NudCwKKwkJCQkJCSAgIHBfcGh5c190YWJsZSwgcGFnZV9jbnQsCiAJCQkJCQkgICAmdHhxLT5kb29yYmVsbF9hZGRyKTsKIAkJCWlmIChyYykgewogCQkJCURQX0VSUihlZGV2LCAiU3RhcnQgVFhRICMlZCBmYWlsZWQgJWRcbiIsCi0JCQkJICAgICAgIHR4cV9pbmRleCwgcmMpOworCQkJCSAgICAgICB0eHEtPmluZGV4LCByYyk7CiAJCQkJcmV0dXJuIHJjOwogCQkJfQogCkBAIC0zMzU4LDEzICszNDQyLDEzIEBACiAJfQogCiAJLyogRmlsbCBzdHJ1Y3Qgd2l0aCBSU1MgcGFyYW1zICovCi0JaWYgKFFFREVfUlNTX0NOVChlZGV2KSA+IDEpIHsKKwlpZiAoUUVERV9SU1NfQ09VTlQoZWRldikgPiAxKSB7CiAJCXZwb3J0X3VwZGF0ZV9wYXJhbXMudXBkYXRlX3Jzc19mbGcgPSAxOwogCiAJCS8qIE5lZWQgdG8gdmFsaWRhdGUgY3VycmVudCBSU1MgY29uZmlnIHVzZXMgdmFsaWQgZW50cmllcyAqLwogCQlmb3IgKGkgPSAwOyBpIDwgUUVEX1JTU19JTkRfVEFCTEVfU0laRTsgaSsrKSB7CiAJCQlpZiAoZWRldi0+cnNzX3BhcmFtcy5yc3NfaW5kX3RhYmxlW2ldID49Ci0JCQkgICAgZWRldi0+bnVtX3JzcykgeworCQkJICAgIFFFREVfUlNTX0NPVU5UKGVkZXYpKSB7CiAJCQkJcmVzZXRfcnNzX2luZGlyID0gdHJ1ZTsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTMzNzcsNyArMzQ2MSw3IEBACiAJCQlmb3IgKGkgPSAwOyBpIDwgUUVEX1JTU19JTkRfVEFCTEVfU0laRTsgaSsrKSB7CiAJCQkJdTE2IGluZGlyX3ZhbDsKIAotCQkJCXZhbCA9IFFFREVfUlNTX0NOVChlZGV2KTsKKwkJCQl2YWwgPSBRRURFX1JTU19DT1VOVChlZGV2KTsKIAkJCQlpbmRpcl92YWwgPSBldGh0b29sX3J4ZmhfaW5kaXJfZGVmYXVsdChpLCB2YWwpOwogCQkJCWVkZXYtPnJzc19wYXJhbXMucnNzX2luZF90YWJsZVtpXSA9IGluZGlyX3ZhbDsKIAkJCX0KQEAgLTM0NDMsNiArMzUyNyw3IEBACiAKIAlEUF9JTkZPKGVkZXYsICJTdGFydGluZyBxZWRlIHVubG9hZFxuIik7CiAKKwlxZWRlX3JvY2VfZGV2X2V2ZW50X2Nsb3NlKGVkZXYpOwogCW11dGV4X2xvY2soJmVkZXYtPnFlZGVfbG9jayk7CiAJZWRldi0+c3RhdGUgPSBRRURFX1NUQVRFX0NMT1NFRDsKIApAQCAtMzUwNiw3ICszNTkxLDcgQEAKIAlpZiAocmMpCiAJCWdvdG8gZXJyMTsKIAlEUF9JTkZPKGVkZXYsICJBbGxvY2F0ZWQgJWQgUlNTIHF1ZXVlcyBvbiAlZCBUQy9zXG4iLAotCQlRRURFX1JTU19DTlQoZWRldiksIGVkZXYtPm51bV90Yyk7CisJCVFFREVfUVVFVUVfQ05UKGVkZXYpLCBlZGV2LT5udW1fdGMpOwogCiAJcmMgPSBxZWRlX3NldF9yZWFsX251bV9xdWV1ZXMoZWRldik7CiAJaWYgKHJjKQpAQCAtMzU0Myw2ICszNjI4LDcgQEAKIAkvKiBRdWVyeSB3aGV0aGVyIGxpbmsgaXMgYWxyZWFkeS11cCAqLwogCW1lbXNldCgmbGlua19vdXRwdXQsIDAsIHNpemVvZihsaW5rX291dHB1dCkpOwogCWVkZXYtPm9wcy0+Y29tbW9uLT5nZXRfbGluayhlZGV2LT5jZGV2LCAmbGlua19vdXRwdXQpOworCXFlZGVfcm9jZV9kZXZfZXZlbnRfb3BlbihlZGV2KTsKIAlxZWRlX2xpbmtfdXBkYXRlKGVkZXYsICZsaW5rX291dHB1dCk7CiAKIAlEUF9JTkZPKGVkZXYsICJFbmRpbmcgc3VjY2Vzc2Z1bGx5IHFlZGUgbG9hZFxuIik7CkBAIC0zNTU5LDcgKzM2NDUsOSBAQAogZXJyMToKIAllZGV2LT5vcHMtPmNvbW1vbi0+c2V0X2ZwX2ludChlZGV2LT5jZGV2LCAwKTsKIAlxZWRlX2ZyZWVfZnBfYXJyYXkoZWRldik7Ci0JZWRldi0+bnVtX3JzcyA9IDA7CisJZWRldi0+bnVtX3F1ZXVlcyA9IDA7CisJZWRldi0+ZnBfbnVtX3R4ID0gMDsKKwllZGV2LT5mcF9udW1fcnggPSAwOwogZXJyMDoKIAlyZXR1cm4gcmM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkZS9xZWRlX3JvY2UuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWRlL3FlZGVfcm9jZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NjdmOTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkZS9xZWRlX3JvY2UuYwpAQCAtMCwwICsxLDMxNCBAQAorLyogUUxvZ2ljIHFlZHIgTklDIERyaXZlcgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgIFFMb2dpYyBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvcWVkL3FlZGVfcm9jZS5oPgorI2luY2x1ZGUgInFlZGUuaCIKKworc3RhdGljIHN0cnVjdCBxZWRyX2RyaXZlciAqcWVkcl9kcnY7CitzdGF0aWMgTElTVF9IRUFEKHFlZHJfZGV2X2xpc3QpOworc3RhdGljIERFRklORV9NVVRFWChxZWRyX2Rldl9saXN0X2xvY2spOworCitib29sIHFlZGVfcm9jZV9zdXBwb3J0ZWQoc3RydWN0IHFlZGVfZGV2ICpkZXYpCit7CisJcmV0dXJuIGRldi0+ZGV2X2luZm8uY29tbW9uLnJkbWFfc3VwcG9ydGVkOworfQorCitzdGF0aWMgdm9pZCBfcWVkZV9yb2NlX2Rldl9hZGQoc3RydWN0IHFlZGVfZGV2ICplZGV2KQoreworCWlmICghcWVkcl9kcnYpCisJCXJldHVybjsKKworCWVkZXYtPnJkbWFfaW5mby5xZWRyX2RldiA9IHFlZHJfZHJ2LT5hZGQoZWRldi0+Y2RldiwgZWRldi0+cGRldiwKKwkJCQkJCSBlZGV2LT5uZGV2KTsKK30KKworc3RhdGljIGludCBxZWRlX3JvY2VfY3JlYXRlX3dxKHN0cnVjdCBxZWRlX2RldiAqZWRldikKK3sKKwlJTklUX0xJU1RfSEVBRCgmZWRldi0+cmRtYV9pbmZvLnJvY2VfZXZlbnRfbGlzdCk7CisJZWRldi0+cmRtYV9pbmZvLnJvY2Vfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgicm9jZV93cSIpOworCWlmICghZWRldi0+cmRtYV9pbmZvLnJvY2Vfd3EpIHsKKwkJRFBfTk9USUNFKGVkZXYsICJxZWRyOiBDb3VsZCBub3QgY3JlYXRlIHdvcmtxdWV1ZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBxZWRlX3JvY2VfY2xlYW51cF9ldmVudChzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9ICZlZGV2LT5yZG1hX2luZm8ucm9jZV9ldmVudF9saXN0OworCXN0cnVjdCBxZWRlX3JvY2VfZXZlbnRfd29yayAqZXZlbnRfbm9kZTsKKworCWZsdXNoX3dvcmtxdWV1ZShlZGV2LT5yZG1hX2luZm8ucm9jZV93cSk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KGhlYWQpKSB7CisJCWV2ZW50X25vZGUgPSBsaXN0X2VudHJ5KGhlYWQtPm5leHQsIHN0cnVjdCBxZWRlX3JvY2VfZXZlbnRfd29yaywKKwkJCQkJbGlzdCk7CisJCWNhbmNlbF93b3JrX3N5bmMoJmV2ZW50X25vZGUtPndvcmspOworCQlsaXN0X2RlbCgmZXZlbnRfbm9kZS0+bGlzdCk7CisJCWtmcmVlKGV2ZW50X25vZGUpOworCX0KK30KKworc3RhdGljIHZvaWQgcWVkZV9yb2NlX2Rlc3Ryb3lfd3Eoc3RydWN0IHFlZGVfZGV2ICplZGV2KQoreworCXFlZGVfcm9jZV9jbGVhbnVwX2V2ZW50KGVkZXYpOworCWRlc3Ryb3lfd29ya3F1ZXVlKGVkZXYtPnJkbWFfaW5mby5yb2NlX3dxKTsKK30KKworaW50IHFlZGVfcm9jZV9kZXZfYWRkKHN0cnVjdCBxZWRlX2RldiAqZWRldikKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKHFlZGVfcm9jZV9zdXBwb3J0ZWQoZWRldikpIHsKKwkJcmMgPSBxZWRlX3JvY2VfY3JlYXRlX3dxKGVkZXYpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJSU5JVF9MSVNUX0hFQUQoJmVkZXYtPnJkbWFfaW5mby5lbnRyeSk7CisJCW11dGV4X2xvY2soJnFlZHJfZGV2X2xpc3RfbG9jayk7CisJCWxpc3RfYWRkX3RhaWwoJmVkZXYtPnJkbWFfaW5mby5lbnRyeSwgJnFlZHJfZGV2X2xpc3QpOworCQlfcWVkZV9yb2NlX2Rldl9hZGQoZWRldik7CisJCW11dGV4X3VubG9jaygmcWVkcl9kZXZfbGlzdF9sb2NrKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIF9xZWRlX3JvY2VfZGV2X3JlbW92ZShzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYpCit7CisJaWYgKHFlZHJfZHJ2ICYmIHFlZHJfZHJ2LT5yZW1vdmUgJiYgZWRldi0+cmRtYV9pbmZvLnFlZHJfZGV2KQorCQlxZWRyX2Rydi0+cmVtb3ZlKGVkZXYtPnJkbWFfaW5mby5xZWRyX2Rldik7CisJZWRldi0+cmRtYV9pbmZvLnFlZHJfZGV2ID0gTlVMTDsKK30KKwordm9pZCBxZWRlX3JvY2VfZGV2X3JlbW92ZShzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYpCit7CisJaWYgKCFxZWRlX3JvY2Vfc3VwcG9ydGVkKGVkZXYpKQorCQlyZXR1cm47CisKKwlxZWRlX3JvY2VfZGVzdHJveV93cShlZGV2KTsKKwltdXRleF9sb2NrKCZxZWRyX2Rldl9saXN0X2xvY2spOworCV9xZWRlX3JvY2VfZGV2X3JlbW92ZShlZGV2KTsKKwlsaXN0X2RlbCgmZWRldi0+cmRtYV9pbmZvLmVudHJ5KTsKKwltdXRleF91bmxvY2soJnFlZHJfZGV2X2xpc3RfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIF9xZWRlX3JvY2VfZGV2X29wZW4oc3RydWN0IHFlZGVfZGV2ICplZGV2KQoreworCWlmIChxZWRyX2RydiAmJiBlZGV2LT5yZG1hX2luZm8ucWVkcl9kZXYgJiYgcWVkcl9kcnYtPm5vdGlmeSkKKwkJcWVkcl9kcnYtPm5vdGlmeShlZGV2LT5yZG1hX2luZm8ucWVkcl9kZXYsIFFFREVfVVApOworfQorCitzdGF0aWMgdm9pZCBxZWRlX3JvY2VfZGV2X29wZW4oc3RydWN0IHFlZGVfZGV2ICplZGV2KQoreworCWlmICghcWVkZV9yb2NlX3N1cHBvcnRlZChlZGV2KSkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmcWVkcl9kZXZfbGlzdF9sb2NrKTsKKwlfcWVkZV9yb2NlX2Rldl9vcGVuKGVkZXYpOworCW11dGV4X3VubG9jaygmcWVkcl9kZXZfbGlzdF9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgX3FlZGVfcm9jZV9kZXZfY2xvc2Uoc3RydWN0IHFlZGVfZGV2ICplZGV2KQoreworCWlmIChxZWRyX2RydiAmJiBlZGV2LT5yZG1hX2luZm8ucWVkcl9kZXYgJiYgcWVkcl9kcnYtPm5vdGlmeSkKKwkJcWVkcl9kcnYtPm5vdGlmeShlZGV2LT5yZG1hX2luZm8ucWVkcl9kZXYsIFFFREVfRE9XTik7Cit9CisKK3N0YXRpYyB2b2lkIHFlZGVfcm9jZV9kZXZfY2xvc2Uoc3RydWN0IHFlZGVfZGV2ICplZGV2KQoreworCWlmICghcWVkZV9yb2NlX3N1cHBvcnRlZChlZGV2KSkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmcWVkcl9kZXZfbGlzdF9sb2NrKTsKKwlfcWVkZV9yb2NlX2Rldl9jbG9zZShlZGV2KTsKKwltdXRleF91bmxvY2soJnFlZHJfZGV2X2xpc3RfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHFlZGVfcm9jZV9kZXZfc2h1dGRvd24oc3RydWN0IHFlZGVfZGV2ICplZGV2KQoreworCWlmICghcWVkZV9yb2NlX3N1cHBvcnRlZChlZGV2KSkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmcWVkcl9kZXZfbGlzdF9sb2NrKTsKKwlpZiAocWVkcl9kcnYgJiYgZWRldi0+cmRtYV9pbmZvLnFlZHJfZGV2ICYmIHFlZHJfZHJ2LT5ub3RpZnkpCisJCXFlZHJfZHJ2LT5ub3RpZnkoZWRldi0+cmRtYV9pbmZvLnFlZHJfZGV2LCBRRURFX0NMT1NFKTsKKwltdXRleF91bmxvY2soJnFlZHJfZGV2X2xpc3RfbG9jayk7Cit9CisKK2ludCBxZWRlX3JvY2VfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBxZWRyX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCBxZWRlX2RldiAqZWRldjsKKwl1OCBxZWRyX2NvdW50ZXIgPSAwOworCisJbXV0ZXhfbG9jaygmcWVkcl9kZXZfbGlzdF9sb2NrKTsKKwlpZiAocWVkcl9kcnYpIHsKKwkJbXV0ZXhfdW5sb2NrKCZxZWRyX2Rldl9saXN0X2xvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcWVkcl9kcnYgPSBkcnY7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVkZXYsICZxZWRyX2Rldl9saXN0LCByZG1hX2luZm8uZW50cnkpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CisKKwkJcWVkcl9jb3VudGVyKys7CisJCV9xZWRlX3JvY2VfZGV2X2FkZChlZGV2KTsKKwkJbmRldiA9IGVkZXYtPm5kZXY7CisJCWlmIChuZXRpZl9ydW5uaW5nKG5kZXYpICYmIG5ldGlmX29wZXJfdXAobmRldikpCisJCQlfcWVkZV9yb2NlX2Rldl9vcGVuKGVkZXYpOworCX0KKwltdXRleF91bmxvY2soJnFlZHJfZGV2X2xpc3RfbG9jayk7CisKKwlEUF9JTkZPKGVkZXYsICJxZWRyOiBkaXNjb3ZlcmVkIGFuZCByZWdpc3RlcmVkICVkIFJvQ0UgZnVuY3NcbiIsCisJCXFlZHJfY291bnRlcik7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wocWVkZV9yb2NlX3JlZ2lzdGVyX2RyaXZlcik7CisKK3ZvaWQgcWVkZV9yb2NlX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBxZWRyX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCBxZWRlX2RldiAqZWRldjsKKworCW11dGV4X2xvY2soJnFlZHJfZGV2X2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShlZGV2LCAmcWVkcl9kZXZfbGlzdCwgcmRtYV9pbmZvLmVudHJ5KSB7CisJCWlmIChlZGV2LT5yZG1hX2luZm8ucWVkcl9kZXYpCisJCQlfcWVkZV9yb2NlX2Rldl9yZW1vdmUoZWRldik7CisJfQorCXFlZHJfZHJ2ID0gTlVMTDsKKwltdXRleF91bmxvY2soJnFlZHJfZGV2X2xpc3RfbG9jayk7Cit9CitFWFBPUlRfU1lNQk9MKHFlZGVfcm9jZV91bnJlZ2lzdGVyX2RyaXZlcik7CisKK3N0YXRpYyB2b2lkIHFlZGVfcm9jZV9jaGFuZ2VhZGRyKHN0cnVjdCBxZWRlX2RldiAqZWRldikKK3sKKwlpZiAoIXFlZGVfcm9jZV9zdXBwb3J0ZWQoZWRldikpCisJCXJldHVybjsKKworCWlmIChxZWRyX2RydiAmJiBlZGV2LT5yZG1hX2luZm8ucWVkcl9kZXYgJiYgcWVkcl9kcnYtPm5vdGlmeSkKKwkJcWVkcl9kcnYtPm5vdGlmeShlZGV2LT5yZG1hX2luZm8ucWVkcl9kZXYsIFFFREVfQ0hBTkdFX0FERFIpOworfQorCitzdHJ1Y3QgcWVkZV9yb2NlX2V2ZW50X3dvcmsgKnFlZGVfcm9jZV9nZXRfZnJlZV9ldmVudF9ub2RlKHN0cnVjdCBxZWRlX2RldgorCQkJCQkJCSAgICplZGV2KQoreworCXN0cnVjdCBxZWRlX3JvY2VfZXZlbnRfd29yayAqZXZlbnRfbm9kZSA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdF9ub2RlID0gTlVMTDsKKwlib29sIGZvdW5kID0gZmFsc2U7CisKKwlsaXN0X2Zvcl9lYWNoKGxpc3Rfbm9kZSwgJmVkZXYtPnJkbWFfaW5mby5yb2NlX2V2ZW50X2xpc3QpIHsKKwkJZXZlbnRfbm9kZSA9IGxpc3RfZW50cnkobGlzdF9ub2RlLCBzdHJ1Y3QgcWVkZV9yb2NlX2V2ZW50X3dvcmssCisJCQkJCWxpc3QpOworCQlpZiAoIXdvcmtfcGVuZGluZygmZXZlbnRfbm9kZS0+d29yaykpIHsKKwkJCWZvdW5kID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFmb3VuZCkgeworCQlldmVudF9ub2RlID0ga3phbGxvYyhzaXplb2YoKmV2ZW50X25vZGUpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFldmVudF9ub2RlKSB7CisJCQlEUF9OT1RJQ0UoZWRldiwKKwkJCQkgICJxZWRyOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciByb2NlIHdvcmtcbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJbGlzdF9hZGRfdGFpbCgmZXZlbnRfbm9kZS0+bGlzdCwKKwkJCSAgICAgICZlZGV2LT5yZG1hX2luZm8ucm9jZV9ldmVudF9saXN0KTsKKwl9CisKKwlyZXR1cm4gZXZlbnRfbm9kZTsKK30KKworc3RhdGljIHZvaWQgcWVkZV9yb2NlX2hhbmRsZV9ldmVudChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHFlZGVfcm9jZV9ldmVudF93b3JrICpldmVudF9ub2RlOworCWVudW0gcWVkZV9yb2NlX2V2ZW50IGV2ZW50OworCXN0cnVjdCBxZWRlX2RldiAqZWRldjsKKworCWV2ZW50X25vZGUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHFlZGVfcm9jZV9ldmVudF93b3JrLCB3b3JrKTsKKwlldmVudCA9IGV2ZW50X25vZGUtPmV2ZW50OworCWVkZXYgPSBldmVudF9ub2RlLT5wdHI7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBRRURFX1VQOgorCQlxZWRlX3JvY2VfZGV2X29wZW4oZWRldik7CisJCWJyZWFrOworCWNhc2UgUUVERV9ET1dOOgorCQlxZWRlX3JvY2VfZGV2X2Nsb3NlKGVkZXYpOworCQlicmVhazsKKwljYXNlIFFFREVfQ0xPU0U6CisJCXFlZGVfcm9jZV9kZXZfc2h1dGRvd24oZWRldik7CisJCWJyZWFrOworCWNhc2UgUUVERV9DSEFOR0VfQUREUjoKKwkJcWVkZV9yb2NlX2NoYW5nZWFkZHIoZWRldik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURQX05PVElDRShlZGV2LCAiSW52YWxpZCByb2NlIGV2ZW50ICVkIiwgZXZlbnQpOworCX0KK30KKworc3RhdGljIHZvaWQgcWVkZV9yb2NlX2FkZF9ldmVudChzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYsCisJCQkJZW51bSBxZWRlX3JvY2VfZXZlbnQgZXZlbnQpCit7CisJc3RydWN0IHFlZGVfcm9jZV9ldmVudF93b3JrICpldmVudF9ub2RlOworCisJaWYgKCFlZGV2LT5yZG1hX2luZm8ucWVkcl9kZXYpCisJCXJldHVybjsKKworCWV2ZW50X25vZGUgPSBxZWRlX3JvY2VfZ2V0X2ZyZWVfZXZlbnRfbm9kZShlZGV2KTsKKwlpZiAoIWV2ZW50X25vZGUpCisJCXJldHVybjsKKworCWV2ZW50X25vZGUtPmV2ZW50ID0gZXZlbnQ7CisJZXZlbnRfbm9kZS0+cHRyID0gZWRldjsKKworCUlOSVRfV09SSygmZXZlbnRfbm9kZS0+d29yaywgcWVkZV9yb2NlX2hhbmRsZV9ldmVudCk7CisJcXVldWVfd29yayhlZGV2LT5yZG1hX2luZm8ucm9jZV93cSwgJmV2ZW50X25vZGUtPndvcmspOworfQorCit2b2lkIHFlZGVfcm9jZV9kZXZfZXZlbnRfb3BlbihzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYpCit7CisJcWVkZV9yb2NlX2FkZF9ldmVudChlZGV2LCBRRURFX1VQKTsKK30KKwordm9pZCBxZWRlX3JvY2VfZGV2X2V2ZW50X2Nsb3NlKHN0cnVjdCBxZWRlX2RldiAqZWRldikKK3sKKwlxZWRlX3JvY2VfYWRkX2V2ZW50KGVkZXYsIFFFREVfRE9XTik7Cit9CisKK3ZvaWQgcWVkZV9yb2NlX2V2ZW50X2NoYW5nZWFkZHIoc3RydWN0IHFlZGVfZGV2ICplZGV2KQoreworCXFlZGVfcm9jZV9hZGRfZXZlbnQoZWRldiwgUUVERV9DSEFOR0VfQUREUik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pYy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWMuaAppbmRleCBmZDk3M2Y0Li40OWJhZDAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pYy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljLmgKQEAgLTM3LDggKzM3LDggQEAKIAogI2RlZmluZSBfUUxDTklDX0xJTlVYX01BSk9SIDUKICNkZWZpbmUgX1FMQ05JQ19MSU5VWF9NSU5PUiAzCi0jZGVmaW5lIF9RTENOSUNfTElOVVhfU1VCVkVSU0lPTiA2NAotI2RlZmluZSBRTENOSUNfTElOVVhfVkVSU0lPTklEICAiNS4zLjY0IgorI2RlZmluZSBfUUxDTklDX0xJTlVYX1NVQlZFUlNJT04gNjUKKyNkZWZpbmUgUUxDTklDX0xJTlVYX1ZFUlNJT05JRCAgIjUuMy42NSIKICNkZWZpbmUgUUxDTklDX0RSVl9JRENfVkVSICAweDAxCiAjZGVmaW5lIFFMQ05JQ19EUklWRVJfVkVSU0lPTiAgKChfUUxDTklDX0xJTlVYX01BSk9SIDw8IDE2KSB8XAogCQkgKF9RTENOSUNfTElOVVhfTUlOT1IgPDwgOCkgfCAoX1FMQ05JQ19MSU5VWF9TVUJWRVJTSU9OKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX2lvLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19pby5jCmluZGV4IDg3YzY0MmQuLmZlZGQ3MzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX2lvLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfaW8uYwpAQCAtMTAyLDcgKzEwMiw2IEBACiAjZGVmaW5lIFFMQ05JQ19SRVNQT05TRV9ERVNDCTB4MDUKICNkZWZpbmUgUUxDTklDX0xST19ERVNDICAJMHgxMgogCi0jZGVmaW5lIFFMQ05JQ19UWF9QT0xMX0JVREdFVAkJMTI4CiAjZGVmaW5lIFFMQ05JQ19UQ1BfSERSX1NJWkUJCTIwCiAjZGVmaW5lIFFMQ05JQ19UQ1BfVFNfT1BUSU9OX1NJWkUJMTIKICNkZWZpbmUgUUxDTklDX0ZFVENIX1JJTkdfSUQoaGFuZGxlKQkoKGhhbmRsZSkgPj4gNjMpCkBAIC0yMDA4LDcgKzIwMDcsNiBAQAogCXN0cnVjdCBxbGNuaWNfaG9zdF90eF9yaW5nICp0eF9yaW5nOwogCXN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlcjsKIAotCWJ1ZGdldCA9IFFMQ05JQ19UWF9QT0xMX0JVREdFVDsKIAl0eF9yaW5nID0gY29udGFpbmVyX29mKG5hcGksIHN0cnVjdCBxbGNuaWNfaG9zdF90eF9yaW5nLCBuYXBpKTsKIAlhZGFwdGVyID0gdHhfcmluZy0+YWRhcHRlcjsKIAl3b3JrX2RvbmUgPSBxbGNuaWNfcHJvY2Vzc19jbWRfcmluZyhhZGFwdGVyLCB0eF9yaW5nLCBidWRnZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfbWFpbi5jCmluZGV4IDNlYmVmMjcuLjNhZTM5NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19tYWluLmMKQEAgLTQzMiwxOCArNDMyLDE5IEBACiAKIHN0YXRpYyBpbnQgcWxjbmljX2ZkYl9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpuY2IsCiAJCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJc3RydWN0IG5ldF9kZXZpY2UgKmZpbHRlcl9kZXYsIGludCBpZHgpCisJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZmlsdGVyX2RldiwgaW50ICppZHgpCiB7CiAJc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgZXJyID0gMDsKIAogCWlmICghYWRhcHRlci0+ZmRiX21hY19sZWFybikKIAkJcmV0dXJuIG5kb19kZmx0X2ZkYl9kdW1wKHNrYiwgbmNiLCBuZXRkZXYsIGZpbHRlcl9kZXYsIGlkeCk7CiAKIAlpZiAoKGFkYXB0ZXItPmZsYWdzICYgUUxDTklDX0VTV0lUQ0hfRU5BQkxFRCkgfHwKIAkgICAgcWxjbmljX3NyaW92X2NoZWNrKGFkYXB0ZXIpKQotCQlpZHggPSBuZG9fZGZsdF9mZGJfZHVtcChza2IsIG5jYiwgbmV0ZGV2LCBmaWx0ZXJfZGV2LCBpZHgpOworCQllcnIgPSBuZG9fZGZsdF9mZGJfZHVtcChza2IsIG5jYiwgbmV0ZGV2LCBmaWx0ZXJfZGV2LCBpZHgpOwogCi0JcmV0dXJuIGlkeDsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBxbGNuaWNfODJ4eF9jYW5jZWxfaWRjX3dvcmsoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfc3Jpb3YuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX3NyaW92LmgKaW5kZXggMDE3ZDhjMmMuLjVmMzI3NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX3NyaW92LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfc3Jpb3YuaApAQCAtMTU2LDEwICsxNTYsOCBAQAogCXNwaW5sb2NrX3QJCQl2bGFuX2xpc3RfbG9jazsJLyogTG9jayBmb3IgVkxBTiBsaXN0ICovCiB9OwogCi1zdHJ1Y3QgcWxjbmljX2FzeW5jX3dvcmtfbGlzdCB7CitzdHJ1Y3QgcWxjbmljX2FzeW5jX2NtZCB7CiAJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwotCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOwotCXZvaWQJCQkqcHRyOwogCXN0cnVjdCBxbGNuaWNfY21kX2FyZ3MJKmNtZDsKIH07CiAKQEAgLTE2OCw3ICsxNjYsMTAgQEAKIAlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYmNfdHJhbnNfd3E7CiAJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmJjX2FzeW5jX3dxOwogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpiY19mbHJfd3E7Ci0Jc3RydWN0IGxpc3RfaGVhZAlhc3luY19saXN0OworCXN0cnVjdCBxbGNuaWNfYWRhcHRlcgkqYWRhcHRlcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWFzeW5jX2NtZF9saXN0OworCXN0cnVjdCB3b3JrX3N0cnVjdAl2Zl9hc3luY193b3JrOworCXNwaW5sb2NrX3QJCXF1ZXVlX2xvY2s7IC8qIGFzeW5jX2NtZF9saXN0IHF1ZXVlIGxvY2sgKi8KIH07CiAKIHN0cnVjdCBxbGNuaWNfc3Jpb3YgewpAQCAtMjM3LDcgKzIzOCw3IEBACiBpbnQgcWxjbmljX3NyaW92X3NldF92Zl90eF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCwgaW50LCBpbnQpOwogaW50IHFsY25pY19zcmlvdl9nZXRfdmZfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCAsCiAJCQkgICAgICAgc3RydWN0IGlmbGFfdmZfaW5mbyAqKTsKLWludCBxbGNuaWNfc3Jpb3Zfc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50LCB1MTYsIHU4KTsKK2ludCBxbGNuaWNfc3Jpb3Zfc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50LCB1MTYsIHU4LCBfX2JlMTYpOwogaW50IHFsY25pY19zcmlvdl9zZXRfdmZfc3Bvb2ZjaGsoc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50LCBib29sKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgcWxjbmljX3NyaW92X3BmX2Rpc2FibGUoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyKSB7fQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfc3Jpb3ZfY29tbW9uLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19zcmlvdl9jb21tb24uYwppbmRleCA3MzI3YjcyLi5kNzEwNzA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19zcmlvdl9jb21tb24uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19zcmlvdl9jb21tb24uYwpAQCAtMjksNiArMjksNyBAQAogI2RlZmluZSBRTENfODNYWF9WRl9SRVNFVF9GQUlMX1RIUkVTSAk4CiAjZGVmaW5lIFFMQ19CQ19DTURfTUFYX1JFVFJZX0NOVAk1CiAKK3N0YXRpYyB2b2lkIHFsY25pY19zcmlvdl9oYW5kbGVfYXN5bmNfaXNzdWVfY21kKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiBzdGF0aWMgdm9pZCBxbGNuaWNfc3Jpb3ZfdmZfZnJlZV9tYWNfbGlzdChzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKik7CiBzdGF0aWMgaW50IHFsY25pY19zcmlvdl9hbGxvY19iY19tYnhfYXJncyhzdHJ1Y3QgcWxjbmljX2NtZF9hcmdzICosIHUzMik7CiBzdGF0aWMgdm9pZCBxbGNuaWNfc3Jpb3ZfdmZfcG9sbF9kZXZfc3RhdGUoc3RydWN0IHdvcmtfc3RydWN0ICopOwpAQCAtMTc3LDcgKzE3OCwxMCBAQAogCX0KIAogCWJjLT5iY19hc3luY193cSA9ICB3cTsKLQlJTklUX0xJU1RfSEVBRCgmYmMtPmFzeW5jX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZiYy0+YXN5bmNfY21kX2xpc3QpOworCUlOSVRfV09SSygmYmMtPnZmX2FzeW5jX3dvcmssIHFsY25pY19zcmlvdl9oYW5kbGVfYXN5bmNfaXNzdWVfY21kKTsKKwlzcGluX2xvY2tfaW5pdCgmYmMtPnF1ZXVlX2xvY2spOworCWJjLT5hZGFwdGVyID0gYWRhcHRlcjsKIAogCWZvciAoaSA9IDA7IGkgPCBudW1fdmZzOyBpKyspIHsKIAkJdmYgPSAmc3Jpb3YtPnZmX2luZm9baV07CkBAIC0xNTE3LDE3ICsxNTIxLDIxIEBACiAKIHZvaWQgcWxjbmljX3NyaW92X2NsZWFudXBfYXN5bmNfbGlzdChzdHJ1Y3QgcWxjbmljX2JhY2tfY2hhbm5lbCAqYmMpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9ICZiYy0+YXN5bmNfbGlzdDsKLQlzdHJ1Y3QgcWxjbmljX2FzeW5jX3dvcmtfbGlzdCAqZW50cnk7CisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9ICZiYy0+YXN5bmNfY21kX2xpc3Q7CisJc3RydWN0IHFsY25pY19hc3luY19jbWQgKmVudHJ5OwogCiAJZmx1c2hfd29ya3F1ZXVlKGJjLT5iY19hc3luY193cSk7CisJY2FuY2VsX3dvcmtfc3luYygmYmMtPnZmX2FzeW5jX3dvcmspOworCisJc3Bpbl9sb2NrKCZiYy0+cXVldWVfbG9jayk7CiAJd2hpbGUgKCFsaXN0X2VtcHR5KGhlYWQpKSB7Ci0JCWVudHJ5ID0gbGlzdF9lbnRyeShoZWFkLT5uZXh0LCBzdHJ1Y3QgcWxjbmljX2FzeW5jX3dvcmtfbGlzdCwKKwkJZW50cnkgPSBsaXN0X2VudHJ5KGhlYWQtPm5leHQsIHN0cnVjdCBxbGNuaWNfYXN5bmNfY21kLAogCQkJCSAgIGxpc3QpOwotCQljYW5jZWxfd29ya19zeW5jKCZlbnRyeS0+d29yayk7CiAJCWxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7CisJCWtmcmVlKGVudHJ5LT5jbWQpOwogCQlrZnJlZShlbnRyeSk7CiAJfQorCXNwaW5fdW5sb2NrKCZiYy0+cXVldWVfbG9jayk7CiB9CiAKIHZvaWQgcWxjbmljX3NyaW92X3ZmX3NldF9tdWx0aShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQpAQCAtMTU4Nyw1NyArMTU5NSw2NCBAQAogCiBzdGF0aWMgdm9pZCBxbGNuaWNfc3Jpb3ZfaGFuZGxlX2FzeW5jX2lzc3VlX2NtZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHFsY25pY19hc3luY193b3JrX2xpc3QgKmVudHJ5OwotCXN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlcjsKKwlzdHJ1Y3QgcWxjbmljX2FzeW5jX2NtZCAqZW50cnksICp0bXA7CisJc3RydWN0IHFsY25pY19iYWNrX2NoYW5uZWwgKmJjOwogCXN0cnVjdCBxbGNuaWNfY21kX2FyZ3MgKmNtZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkOworCUxJU1RfSEVBRChkZWxfbGlzdCk7CiAKLQllbnRyeSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcWxjbmljX2FzeW5jX3dvcmtfbGlzdCwgd29yayk7Ci0JYWRhcHRlciA9IGVudHJ5LT5wdHI7Ci0JY21kID0gZW50cnktPmNtZDsKLQlfX3FsY25pY19zcmlvdl9pc3N1ZV9jbWQoYWRhcHRlciwgY21kKTsKKwliYyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcWxjbmljX2JhY2tfY2hhbm5lbCwgdmZfYXN5bmNfd29yayk7CisJaGVhZCA9ICZiYy0+YXN5bmNfY21kX2xpc3Q7CisKKwlzcGluX2xvY2soJmJjLT5xdWV1ZV9sb2NrKTsKKwlsaXN0X3NwbGljZV9pbml0KGhlYWQsICZkZWxfbGlzdCk7CisJc3Bpbl91bmxvY2soJmJjLT5xdWV1ZV9sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbnRyeSwgdG1wLCAmZGVsX2xpc3QsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKKwkJY21kID0gZW50cnktPmNtZDsKKwkJX19xbGNuaWNfc3Jpb3ZfaXNzdWVfY21kKGJjLT5hZGFwdGVyLCBjbWQpOworCQlrZnJlZShlbnRyeSk7CisJfQorCisJaWYgKCFsaXN0X2VtcHR5KGhlYWQpKQorCQlxdWV1ZV93b3JrKGJjLT5iY19hc3luY193cSwgJmJjLT52Zl9hc3luY193b3JrKTsKKwogCXJldHVybjsKIH0KIAotc3RhdGljIHN0cnVjdCBxbGNuaWNfYXN5bmNfd29ya19saXN0ICoKLXFsY25pY19zcmlvdl9nZXRfZnJlZV9ub2RlX2FzeW5jX3dvcmsoc3RydWN0IHFsY25pY19iYWNrX2NoYW5uZWwgKmJjKQorc3RhdGljIHN0cnVjdCBxbGNuaWNfYXN5bmNfY21kICoKK3FsY25pY19zcmlvdl9hbGxvY19hc3luY19jbWQoc3RydWN0IHFsY25pY19iYWNrX2NoYW5uZWwgKmJjLAorCQkJICAgICBzdHJ1Y3QgcWxjbmljX2NtZF9hcmdzICpjbWQpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbm9kZTsKLQlzdHJ1Y3QgcWxjbmljX2FzeW5jX3dvcmtfbGlzdCAqZW50cnkgPSBOVUxMOwotCXU4IGVtcHR5ID0gMDsKKwlzdHJ1Y3QgcWxjbmljX2FzeW5jX2NtZCAqZW50cnkgPSBOVUxMOwogCi0JbGlzdF9mb3JfZWFjaChub2RlLCAmYmMtPmFzeW5jX2xpc3QpIHsKLQkJZW50cnkgPSBsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBxbGNuaWNfYXN5bmNfd29ya19saXN0LCBsaXN0KTsKLQkJaWYgKCF3b3JrX3BlbmRpbmcoJmVudHJ5LT53b3JrKSkgewotCQkJZW1wdHkgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQl9CisJZW50cnkgPSBremFsbG9jKHNpemVvZigqZW50cnkpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWVudHJ5KQorCQlyZXR1cm4gTlVMTDsKIAotCWlmICghZW1wdHkpIHsKLQkJZW50cnkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcWxjbmljX2FzeW5jX3dvcmtfbGlzdCksCi0JCQkJR0ZQX0FUT01JQyk7Ci0JCWlmIChlbnRyeSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5saXN0LCAmYmMtPmFzeW5jX2xpc3QpOwotCX0KKwllbnRyeS0+Y21kID0gY21kOworCisJc3Bpbl9sb2NrKCZiYy0+cXVldWVfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmZW50cnktPmxpc3QsICZiYy0+YXN5bmNfY21kX2xpc3QpOworCXNwaW5fdW5sb2NrKCZiYy0+cXVldWVfbG9jayk7CiAKIAlyZXR1cm4gZW50cnk7CiB9CiAKIHN0YXRpYyB2b2lkIHFsY25pY19zcmlvdl9zY2hlZHVsZV9hc3luY19jbWQoc3RydWN0IHFsY25pY19iYWNrX2NoYW5uZWwgKmJjLAotCQkJCQkgICAgd29ya19mdW5jX3QgZnVuYywgdm9pZCAqZGF0YSwKIAkJCQkJICAgIHN0cnVjdCBxbGNuaWNfY21kX2FyZ3MgKmNtZCkKIHsKLQlzdHJ1Y3QgcWxjbmljX2FzeW5jX3dvcmtfbGlzdCAqZW50cnkgPSBOVUxMOworCXN0cnVjdCBxbGNuaWNfYXN5bmNfY21kICplbnRyeSA9IE5VTEw7CiAKLQllbnRyeSA9IHFsY25pY19zcmlvdl9nZXRfZnJlZV9ub2RlX2FzeW5jX3dvcmsoYmMpOwotCWlmICghZW50cnkpCisJZW50cnkgPSBxbGNuaWNfc3Jpb3ZfYWxsb2NfYXN5bmNfY21kKGJjLCBjbWQpOworCWlmICghZW50cnkpIHsKKwkJcWxjbmljX2ZyZWVfbWJ4X2FyZ3MoY21kKTsKKwkJa2ZyZWUoY21kKTsKIAkJcmV0dXJuOworCX0KIAotCWVudHJ5LT5wdHIgPSBkYXRhOwotCWVudHJ5LT5jbWQgPSBjbWQ7Ci0JSU5JVF9XT1JLKCZlbnRyeS0+d29yaywgZnVuYyk7Ci0JcXVldWVfd29yayhiYy0+YmNfYXN5bmNfd3EsICZlbnRyeS0+d29yayk7CisJcXVldWVfd29yayhiYy0+YmNfYXN5bmNfd3EsICZiYy0+dmZfYXN5bmNfd29yayk7CiB9CiAKIHN0YXRpYyBpbnQgcWxjbmljX3NyaW92X2FzeW5jX2lzc3VlX2NtZChzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIsCkBAIC0xNjQ5LDggKzE2NjQsOCBAQAogCWlmIChhZGFwdGVyLT5uZWVkX2Z3X3Jlc2V0KQogCQlyZXR1cm4gLUVJTzsKIAotCXFsY25pY19zcmlvdl9zY2hlZHVsZV9hc3luY19jbWQoYmMsIHFsY25pY19zcmlvdl9oYW5kbGVfYXN5bmNfaXNzdWVfY21kLAotCQkJCQlhZGFwdGVyLCBjbWQpOworCXFsY25pY19zcmlvdl9zY2hlZHVsZV9hc3luY19jbWQoYmMsIGNtZCk7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfc3Jpb3ZfcGYuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX3NyaW92X3BmLmMKaW5kZXggYWZkNjg3ZS4uNTBlYWFmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfc3Jpb3ZfcGYuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19zcmlvdl9wZi5jCkBAIC0xOTE1LDcgKzE5MTUsNyBAQAogfQogCiBpbnQgcWxjbmljX3NyaW92X3NldF92Zl92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2ZiwKLQkJCSAgICAgdTE2IHZsYW4sIHU4IHFvcykKKwkJCSAgICAgdTE2IHZsYW4sIHU4IHFvcywgX19iZTE2IHZsYW5fcHJvdG8pCiB7CiAJc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgcWxjbmljX3NyaW92ICpzcmlvdiA9IGFkYXB0ZXItPmFody0+c3Jpb3Y7CkBAIC0xOTI4LDYgKzE5MjgsOSBAQAogCWlmICh2ZiA+PSBzcmlvdi0+bnVtX3ZmcyB8fCBxb3MgPiA3KQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWlmICh2bGFuX3Byb3RvICE9IGh0b25zKEVUSF9QXzgwMjFRKSkKKwkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CisKIAlpZiAodmxhbiA+IE1BWF9WTEFOX0lEKSB7CiAJCW5ldGRldl9lcnIobmV0ZGV2LAogCQkJICAgIkludmFsaWQgVkxBTiBJRCwgYWxsb3dlZCByYW5nZSBpcyBbMCAtICVkXVxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL0tjb25maWcgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9LY29uZmlnCmluZGV4IGE3NmUzODAuLjliYTU2OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vS2NvbmZpZwpAQCAtMjQsNCArMjQsMTYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuIFRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHFjYXNwaS4KIAorY29uZmlnIFFDT01fRU1BQworCXRyaXN0YXRlICJRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gRU1BQyBHaWdhYml0IEV0aGVybmV0IHN1cHBvcnQiCisJc2VsZWN0IENSQzMyCisJc2VsZWN0IFBIWUxJQgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gR2lnYWJpdAorCSAgRXRoZXJuZXQgTWVkaWEgQWNjZXNzIENvbnRyb2xsZXIgKEVNQUMpLiBUaGUgY29udHJvbGxlcgorCSAgc3VwcG9ydHMgSUVFRSA4MDIuMy0yMDAyLCBoYWxmLWR1cGxleCBtb2RlIGF0IDEwLzEwMCBNYi9zLAorCSAgZnVsbC1kdXBsZXggbW9kZSBhdCAxMC8xMDAvMTAwME1iL3MsIFdha2UgT24gTEFOIChXT0wpIGZvcgorCSAgbG93IHBvd2VyLCBSZWNlaXZlLVNpZGUgU2NhbGluZyAoUlNTKSwgYW5kIElFRUUgMTU4OC0yMDA4CisJICBQcmVjaXNpb24gQ2xvY2sgU3luY2hyb25pemF0aW9uIFByb3RvY29sLgorCiBlbmRpZiAjIE5FVF9WRU5ET1JfUVVBTENPTU0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vTWFrZWZpbGUKaW5kZXggOWRhMmQ3NS4uYWFjYjBhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vTWFrZWZpbGUKQEAgLTQsMyArNCw1IEBACiAKIG9iai0kKENPTkZJR19RQ0E3MDAwKSArPSBxY2FzcGkubwogcWNhc3BpLW9ianMgOj0gcWNhX3NwaS5vIHFjYV9mcmFtaW5nLm8gcWNhXzdrLm8gcWNhX2RlYnVnLm8KKworb2JqLXkgKz0gZW1hYy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL2VtYWMvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZWUxNDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIFF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBFTUFDIEdpZ2FiaXQgRXRoZXJuZXQgZHJpdmVyCisjCisKK29iai0kKENPTkZJR19RQ09NX0VNQUMpICs9IHFjb20tZW1hYy5vCisKK3Fjb20tZW1hYy1vYmpzIDo9IGVtYWMubyBlbWFjLW1hYy5vIGVtYWMtcGh5Lm8gZW1hYy1zZ21paS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjL2VtYWMtbWFjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjL2VtYWMtbWFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk3OTY4ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL2VtYWMvZW1hYy1tYWMuYwpAQCAtMCwwICsxLDE1MjggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMy0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qIFF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBFTUFDIEV0aGVybmV0IENvbnRyb2xsZXIgTUFDIGxheWVyIHN1cHBvcnQKKyAqLworCisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bmV0L2lwNl9jaGVja3N1bS5oPgorI2luY2x1ZGUgImVtYWMuaCIKKyNpbmNsdWRlICJlbWFjLXNnbWlpLmgiCisKKy8qIEVNQUMgYmFzZSByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIEVNQUNfTUFDX0NUUkwJCQkweDAwMTQ4MAorI2RlZmluZSBFTUFDX1dPTF9DVFJMMAkJCTB4MDAxNGEwCisjZGVmaW5lIEVNQUNfUlNTX0tFWTAJCQkweDAwMTRiMAorI2RlZmluZSBFTUFDX0gxVFBEX0JBU0VfQUREUl9MTwkJMHgwMDE0ZTAKKyNkZWZpbmUgRU1BQ19IMlRQRF9CQVNFX0FERFJfTE8JCTB4MDAxNGU0CisjZGVmaW5lIEVNQUNfSDNUUERfQkFTRV9BRERSX0xPCQkweDAwMTRlOAorI2RlZmluZSBFTUFDX0lOVEVSX1NSQU1fUEFSVDkJCTB4MDAxNTM0CisjZGVmaW5lIEVNQUNfREVTQ19DVFJMXzAJCTB4MDAxNTQwCisjZGVmaW5lIEVNQUNfREVTQ19DVFJMXzEJCTB4MDAxNTQ0CisjZGVmaW5lIEVNQUNfREVTQ19DVFJMXzIJCTB4MDAxNTUwCisjZGVmaW5lIEVNQUNfREVTQ19DVFJMXzEwCQkweDAwMTU1NAorI2RlZmluZSBFTUFDX0RFU0NfQ1RSTF8xMgkJMHgwMDE1NTgKKyNkZWZpbmUgRU1BQ19ERVNDX0NUUkxfMTMJCTB4MDAxNTVjCisjZGVmaW5lIEVNQUNfREVTQ19DVFJMXzMJCTB4MDAxNTYwCisjZGVmaW5lIEVNQUNfREVTQ19DVFJMXzQJCTB4MDAxNTY0CisjZGVmaW5lIEVNQUNfREVTQ19DVFJMXzUJCTB4MDAxNTY4CisjZGVmaW5lIEVNQUNfREVTQ19DVFJMXzE0CQkweDAwMTU2YworI2RlZmluZSBFTUFDX0RFU0NfQ1RSTF8xNQkJMHgwMDE1NzAKKyNkZWZpbmUgRU1BQ19ERVNDX0NUUkxfMTYJCTB4MDAxNTc0CisjZGVmaW5lIEVNQUNfREVTQ19DVFJMXzYJCTB4MDAxNTc4CisjZGVmaW5lIEVNQUNfREVTQ19DVFJMXzgJCTB4MDAxNTgwCisjZGVmaW5lIEVNQUNfREVTQ19DVFJMXzkJCTB4MDAxNTg0CisjZGVmaW5lIEVNQUNfREVTQ19DVFJMXzExCQkweDAwMTU4OAorI2RlZmluZSBFTUFDX1RYUV9DVFJMXzAJCQkweDAwMTU5MAorI2RlZmluZSBFTUFDX1RYUV9DVFJMXzEJCQkweDAwMTU5NAorI2RlZmluZSBFTUFDX1RYUV9DVFJMXzIJCQkweDAwMTU5OAorI2RlZmluZSBFTUFDX1JYUV9DVFJMXzAJCQkweDAwMTVhMAorI2RlZmluZSBFTUFDX1JYUV9DVFJMXzEJCQkweDAwMTVhNAorI2RlZmluZSBFTUFDX1JYUV9DVFJMXzIJCQkweDAwMTVhOAorI2RlZmluZSBFTUFDX1JYUV9DVFJMXzMJCQkweDAwMTVhYworI2RlZmluZSBFTUFDX0JBU0VfQ1BVX05VTUJFUgkJMHgwMDE1YjgKKyNkZWZpbmUgRU1BQ19ETUFfQ1RSTAkJCTB4MDAxNWMwCisjZGVmaW5lIEVNQUNfTUFJTEJPWF8wCQkJMHgwMDE1ZTAKKyNkZWZpbmUgRU1BQ19NQUlMQk9YXzUJCQkweDAwMTVlNAorI2RlZmluZSBFTUFDX01BSUxCT1hfNgkJCTB4MDAxNWU4CisjZGVmaW5lIEVNQUNfTUFJTEJPWF8xMwkJCTB4MDAxNWVjCisjZGVmaW5lIEVNQUNfTUFJTEJPWF8yCQkJMHgwMDE1ZjQKKyNkZWZpbmUgRU1BQ19NQUlMQk9YXzMJCQkweDAwMTVmOAorI2RlZmluZSBFTUFDX01BSUxCT1hfMTEJCQkweDAwMTYwYworI2RlZmluZSBFTUFDX0FYSV9NQVNUX0NUUkwJCTB4MDAxNjEwCisjZGVmaW5lIEVNQUNfTUFJTEJPWF8xMgkJCTB4MDAxNjE0CisjZGVmaW5lIEVNQUNfTUFJTEJPWF85CQkJMHgwMDE2MTgKKyNkZWZpbmUgRU1BQ19NQUlMQk9YXzEwCQkJMHgwMDE2MWMKKyNkZWZpbmUgRU1BQ19BVEhSX0hFQURFUl9DVFJMCQkweDAwMTYyMAorI2RlZmluZSBFTUFDX0NMS19HQVRFX0NUUkwJCTB4MDAxODE0CisjZGVmaW5lIEVNQUNfTUlTQ19DVFJMCQkJMHgwMDE5OTAKKyNkZWZpbmUgRU1BQ19NQUlMQk9YXzcJCQkweDAwMTllMAorI2RlZmluZSBFTUFDX01BSUxCT1hfOAkJCTB4MDAxOWU0CisjZGVmaW5lIEVNQUNfTUFJTEJPWF8xNQkJCTB4MDAxYmQ0CisjZGVmaW5lIEVNQUNfTUFJTEJPWF8xNgkJCTB4MDAxYmQ4CisKKy8qIEVNQUNfTUFDX0NUUkwgKi8KKyNkZWZpbmUgU0lOR0xFX1BBVVNFX01PREUgICAgICAgCTB4MTAwMDAwMDAKKyNkZWZpbmUgREVCVUdfTU9ERSAgICAgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIEJST0FEX0VOICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMAorI2RlZmluZSBNVUxUSV9BTEwgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgUlhfQ0hLU1VNX0VOICAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIEhVR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBTUEVFRCh4KQkJCSgoKHgpICYgMHgzKSA8PCAyMCkKKyNkZWZpbmUgU1BFRURfTUFTSwkJCVNQRUVEKDB4MykKKyNkZWZpbmUgU0lNUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIFRQQVVTRSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBQUk9NX01PREUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgVkxBTl9TVFJJUCAgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIFBSTEVOX0JNU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwM2MwMAorI2RlZmluZSBQUkxFTl9TSEZUICAgICAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIEhVR0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBGTENISyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgUENSQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIENSQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBGVUxMRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgTUFDX0xQX0VOICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIFJYRkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBUWEZDICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgUlhFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFRYRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorCisKKy8qIEVNQUNfV09MX0NUUkwwICovCisjZGVmaW5lIExLX0NIR19QTUUJCQkweDIwCisjZGVmaW5lIExLX0NIR19FTgkJCTB4MTAKKyNkZWZpbmUgTUdfRlJBTUVfUE1FCQkJMHg4CisjZGVmaW5lIE1HX0ZSQU1FX0VOCQkJMHg0CisjZGVmaW5lIFdLX0ZSQU1FX0VOCQkJMHgxCisKKy8qIEVNQUNfREVTQ19DVFJMXzMgKi8KKyNkZWZpbmUgUkZEX1JJTkdfU0laRV9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmYKKworLyogRU1BQ19ERVNDX0NUUkxfNCAqLworI2RlZmluZSBSWF9CVUZGRVJfU0laRV9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZgorCisvKiBFTUFDX0RFU0NfQ1RSTF82ICovCisjZGVmaW5lIFJSRF9SSU5HX1NJWkVfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmCisKKy8qIEVNQUNfREVTQ19DVFJMXzkgKi8KKyNkZWZpbmUgVFBEX1JJTkdfU0laRV9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYKKworLyogRU1BQ19UWFFfQ1RSTF8wICovCisjZGVmaW5lIE5VTV9UWEZfQlVSU1RfUFJFRl9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIE5VTV9UWEZfQlVSU1RfUFJFRl9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIExTXzgwMjNfU1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIFRYUV9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIFRYUV9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwCisjZGVmaW5lIElQX09QX1NQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIE5VTV9UUERfQlVSU1RfUFJFRl9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmCisjZGVmaW5lIE5VTV9UUERfQlVSU1RfUFJFRl9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEVNQUNfVFhRX0NUUkxfMSAqLworI2RlZmluZSBKVU1CT19UQVNLX09GRkxPQURfVEhSRVNIT0xEX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAweDdmZgorCisvKiBFTUFDX1RYUV9DVFJMXzIgKi8KKyNkZWZpbmUgVFhGX0hXTV9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZjAwMDAKKyNkZWZpbmUgVFhGX0xXTV9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmYKKworLyogRU1BQ19SWFFfQ1RSTF8wICovCisjZGVmaW5lIFJYUV9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMzEpCisjZGVmaW5lIENVVF9USFJVX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMzApCisjZGVmaW5lIFJTU19IQVNIX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMjkpCisjZGVmaW5lIE5VTV9SRkRfQlVSU1RfUFJFRl9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzZjAwMDAwCisjZGVmaW5lIE5VTV9SRkRfQlVSU1RfUFJFRl9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwCisjZGVmaW5lIElEVF9UQUJMRV9TSVpFX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFmZjAwCisjZGVmaW5lIElEVF9UQUJMRV9TSVpFX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFNQX0lQVjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwCisKKy8qIEVNQUNfUlhRX0NUUkxfMSAqLworI2RlZmluZSBKVU1CT18xS0FIX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZjAwMAorI2RlZmluZSBKVU1CT18xS0FIX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBSRkRfUFJFRl9MT1dfVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBSRkRfUFJFRl9MT1dfVEhSRVNIT0xEX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZjMAorI2RlZmluZSBSRkRfUFJFRl9MT1dfVEhSRVNIT0xEX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBSRkRfUFJFRl9VUF9USCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBSRkRfUFJFRl9VUF9USFJFU0hPTERfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzZgorI2RlZmluZSBSRkRfUFJFRl9VUF9USFJFU0hPTERfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKiBFTUFDX1JYUV9DVFJMXzIgKi8KKyNkZWZpbmUgUlhGX0RPRl9USFJFU0ZIT0xEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxYTAKKyNkZWZpbmUgUlhGX0RPRl9USFJFU0hPTERfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZjAwMDAKKyNkZWZpbmUgUlhGX0RPRl9USFJFU0hPTERfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgUlhGX1VPRl9USFJFU0ZIT0xEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YmUKKyNkZWZpbmUgUlhGX1VPRl9USFJFU0hPTERfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmYKKyNkZWZpbmUgUlhGX1VPRl9USFJFU0hPTERfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogRU1BQ19SWFFfQ1RSTF8zICovCisjZGVmaW5lIFJYRF9USU1FUl9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIFJYRF9USFJFU0hPTERfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmCisjZGVmaW5lIFJYRF9USFJFU0hPTERfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEVNQUNfRE1BX0NUUkwgKi8KKyNkZWZpbmUgRE1BV19ETFlfQ05UX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZjAwMDAKKyNkZWZpbmUgRE1BV19ETFlfQ05UX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgRE1BUl9ETFlfQ05UX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGY4MDAKKyNkZWZpbmUgRE1BUl9ETFlfQ05UX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgRE1BUl9SRVFfUFJJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAKKyNkZWZpbmUgUkVHV1JCTEVOX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzODAKKyNkZWZpbmUgUkVHV1JCTEVOX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgUkVHUkRCTEVOX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NzAKKyNkZWZpbmUgUkVHUkRCTEVOX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgT1VUX09SREVSX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgRU5IX09SREVSX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgSU5fT1JERVJfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKworLyogRU1BQ19NQUlMQk9YXzEzICovCisjZGVmaW5lIFJGRDNfUFJPQ19JRFhfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmYwMDAwCisjZGVmaW5lIFJGRDNfUFJPQ19JRFhfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFJGRDNfUFJPRF9JRFhfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmCisjZGVmaW5lIFJGRDNfUFJPRF9JRFhfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEVNQUNfTUFJTEJPWF8yICovCisjZGVmaW5lIE5UUERfQ09OU19JRFhfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIE5UUERfQ09OU19JRFhfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisKKy8qIEVNQUNfTUFJTEJPWF8zICovCisjZGVmaW5lIFJGRDBfQ09OU19JRFhfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmCisjZGVmaW5lIFJGRDBfQ09OU19JRFhfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEVNQUNfTUFJTEJPWF8xMSAqLworI2RlZmluZSBIM1RQRF9QUk9EX0lEWF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBIM1RQRF9QUk9EX0lEWF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNgorCisvKiBFTUFDX0FYSV9NQVNUX0NUUkwgKi8KKyNkZWZpbmUgREFUQV9CWVRFX1NXQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgKKyNkZWZpbmUgTUFYX0JPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgTUFYX0JUWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKworLyogRU1BQ19NQUlMQk9YXzEyICovCisjZGVmaW5lIEgzVFBEX0NPTlNfSURYX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIEgzVFBEX0NPTlNfSURYX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisKKy8qIEVNQUNfTUFJTEJPWF85ICovCisjZGVmaW5lIEgyVFBEX1BST0RfSURYX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmCisjZGVmaW5lIEgyVFBEX1BST0RfSURYX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEVNQUNfTUFJTEJPWF8xMCAqLworI2RlZmluZSBIMVRQRF9DT05TX0lEWF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBIMVRQRF9DT05TX0lEWF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBIMlRQRF9DT05TX0lEWF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZgorI2RlZmluZSBIMlRQRF9DT05TX0lEWF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKiBFTUFDX0FUSFJfSEVBREVSX0NUUkwgKi8KKyNkZWZpbmUgSEVBREVSX0NOVF9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgSEVBREVSX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKworLyogRU1BQ19NQUlMQk9YXzAgKi8KKyNkZWZpbmUgUkZEMF9QUk9DX0lEWF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZjAwMDAKKyNkZWZpbmUgUkZEMF9QUk9DX0lEWF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgUkZEMF9QUk9EX0lEWF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmYKKyNkZWZpbmUgUkZEMF9QUk9EX0lEWF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogRU1BQ19NQUlMQk9YXzUgKi8KKyNkZWZpbmUgUkZEMV9QUk9DX0lEWF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZjAwMDAKKyNkZWZpbmUgUkZEMV9QUk9DX0lEWF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgUkZEMV9QUk9EX0lEWF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmYKKyNkZWZpbmUgUkZEMV9QUk9EX0lEWF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogRU1BQ19NSVNDX0NUUkwgKi8KKyNkZWZpbmUgUlhfVU5DUExfSU5UX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKworLyogRU1BQ19NQUlMQk9YXzcgKi8KKyNkZWZpbmUgUkZEMl9DT05TX0lEWF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZjAwMDAKKyNkZWZpbmUgUkZEMl9DT05TX0lEWF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgUkZEMV9DT05TX0lEWF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmYKKyNkZWZpbmUgUkZEMV9DT05TX0lEWF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogRU1BQ19NQUlMQk9YXzggKi8KKyNkZWZpbmUgUkZEM19DT05TX0lEWF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmYKKyNkZWZpbmUgUkZEM19DT05TX0lEWF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogRU1BQ19NQUlMQk9YXzE1ICovCisjZGVmaW5lIE5UUERfUFJPRF9JRFhfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmCisjZGVmaW5lIE5UUERfUFJPRF9JRFhfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEVNQUNfTUFJTEJPWF8xNiAqLworI2RlZmluZSBIMVRQRF9QUk9EX0lEWF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZgorI2RlZmluZSBIMVRQRF9QUk9EX0lEWF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisjZGVmaW5lIFJYUTBfUlNTX0hTVFlQX0lQVjZfVENQX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwCisjZGVmaW5lIFJYUTBfUlNTX0hTVFlQX0lQVjZfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIFJYUTBfUlNTX0hTVFlQX0lQVjRfVENQX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4CisjZGVmaW5lIFJYUTBfUlNTX0hTVFlQX0lQVjRfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0CisKKy8qIEVNQUNfRU1BQ19XUkFQUEVSX1RYX1RTX0lOWCAqLworI2RlZmluZSBFTUFDX1dSQVBQRVJfVFhfVFNfRU1QVFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDMxKQorI2RlZmluZSBFTUFDX1dSQVBQRVJfVFhfVFNfSU5YX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZgorCitzdHJ1Y3QgZW1hY19za2JfY2IgeworCXUzMiAgICAgICAgICAgdHBkX2lkeDsKKwl1bnNpZ25lZCBsb25nIGppZmZpZXM7Cit9OworCisjZGVmaW5lIEVNQUNfU0tCX0NCKHNrYikJKChzdHJ1Y3QgZW1hY19za2JfY2IgKikoc2tiKS0+Y2IpCisjZGVmaW5lIEVNQUNfUlNTX0lEVF9TSVpFCTI1NgorI2RlZmluZSBKVU1CT18xS0FICQkweDQKKyNkZWZpbmUgUlhEX1RICQkJMHgxMDAKKyNkZWZpbmUgRU1BQ19UUERfTEFTVF9GUkFHTUVOVAkweDgwMDAwMDAwCisjZGVmaW5lIEVNQUNfVFBEX1RTVEFNUF9TQVZFCTB4ODAwMDAwMDAKKworLyogRU1BQyBFcnJvcnMgaW4gZW1hY19ycmQud29yZFszXSAqLworI2RlZmluZSBFTUFDX1JSRF9MNEYJCUJJVCgxNCkKKyNkZWZpbmUgRU1BQ19SUkRfSVBGCQlCSVQoMTUpCisjZGVmaW5lIEVNQUNfUlJEX0NSQwkJQklUKDIxKQorI2RlZmluZSBFTUFDX1JSRF9GQUUJCUJJVCgyMikKKyNkZWZpbmUgRU1BQ19SUkRfVFJOCQlCSVQoMjMpCisjZGVmaW5lIEVNQUNfUlJEX1JOVAkJQklUKDI0KQorI2RlZmluZSBFTUFDX1JSRF9JTkMJCUJJVCgyNSkKKyNkZWZpbmUgRU1BQ19SUkRfRk9WCQlCSVQoMjkpCisjZGVmaW5lIEVNQUNfUlJEX0xFTgkJQklUKDMwKQorCisvKiBFcnJvciBiaXRzIHRoYXQgd2lsbCByZXN1bHQgaW4gYSByZWNlaXZlZCBmcmFtZSBiZWluZyBkaXNjYXJkZWQgKi8KKyNkZWZpbmUgRU1BQ19SUkRfRVJST1IgKEVNQUNfUlJEX0lQRiB8IEVNQUNfUlJEX0NSQyB8IEVNQUNfUlJEX0ZBRSB8IFwKKwkJCUVNQUNfUlJEX1RSTiB8IEVNQUNfUlJEX1JOVCB8IEVNQUNfUlJEX0lOQyB8IFwKKwkJCUVNQUNfUlJEX0ZPViB8IEVNQUNfUlJEX0xFTikKKyNkZWZpbmUgRU1BQ19SUkRfU1RBVFNfRFdfSURYIDMKKworI2RlZmluZSBFTUFDX1JSRChSWFEsIFNJWkUsIElEWCkJKChSWFEpLT5ycmQudl9hZGRyICsgKFNJWkUgKiAoSURYKSkpCisjZGVmaW5lIEVNQUNfUkZEKFJYUSwgU0laRSwgSURYKQkoKFJYUSktPnJmZC52X2FkZHIgKyAoU0laRSAqIChJRFgpKSkKKyNkZWZpbmUgRU1BQ19UUEQoVFhRLCBTSVpFLCBJRFgpCSgoVFhRKS0+dHBkLnZfYWRkciArIChTSVpFICogKElEWCkpKQorCisjZGVmaW5lIEdFVF9SRkRfQlVGRkVSKFJYUSwgSURYKQkoJigoUlhRKS0+cmZkLnJmYnVmZlsoSURYKV0pKQorI2RlZmluZSBHRVRfVFBEX0JVRkZFUihSVFEsIElEWCkJKCYoKFJUUSktPnRwZC50cGJ1ZmZbKElEWCldKSkKKworI2RlZmluZSBFTUFDX1RYX1BPTExfSFdUWFRTVEFNUF9USFJFU0hPTEQJOAorCisjZGVmaW5lIElTUl9SWF9QS1QgICAgICAoXAorCVJYX1BLVF9JTlQwICAgICB8XAorCVJYX1BLVF9JTlQxICAgICB8XAorCVJYX1BLVF9JTlQyICAgICB8XAorCVJYX1BLVF9JTlQzKQorCisjZGVmaW5lIEVNQUNfTUFDX0lSUV9SRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJImNvcmUwIgorCit2b2lkIGVtYWNfbWFjX211bHRpY2FzdF9hZGRyX3NldChzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0LCB1OCAqYWRkcikKK3sKKwl1MzIgY3JjMzIsIGJpdCwgcmVnLCBtdGE7CisKKwkvKiBDYWxjdWxhdGUgdGhlIENSQyBvZiB0aGUgTUFDIGFkZHJlc3MgKi8KKwljcmMzMiA9IGV0aGVyX2NyYyhFVEhfQUxFTiwgYWRkcik7CisKKwkvKiBUaGUgSEFTSCBUYWJsZSBpcyBhbiBhcnJheSBvZiAyIDMyLWJpdCByZWdpc3RlcnMuIEl0IGlzCisJICogdHJlYXRlZCBsaWtlIGFuIGFycmF5IG9mIDY0IGJpdHMgKEJpdEFycmF5W2hhc2hfdmFsdWVdKS4KKwkgKiBVc2UgdGhlIHVwcGVyIDYgYml0cyBvZiB0aGUgYWJvdmUgQ1JDIGFzIHRoZSBoYXNoIHZhbHVlLgorCSAqLworCXJlZyA9IChjcmMzMiA+PiAzMSkgJiAweDE7CisJYml0ID0gKGNyYzMyID4+IDI2KSAmIDB4MUY7CisKKwltdGEgPSByZWFkbChhZHB0LT5iYXNlICsgRU1BQ19IQVNIX1RBQl9SRUcwICsgKHJlZyA8PCAyKSk7CisJbXRhIHw9IEJJVChiaXQpOworCXdyaXRlbChtdGEsIGFkcHQtPmJhc2UgKyBFTUFDX0hBU0hfVEFCX1JFRzAgKyAocmVnIDw8IDIpKTsKK30KKwordm9pZCBlbWFjX21hY19tdWx0aWNhc3RfYWRkcl9jbGVhcihzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXdyaXRlbCgwLCBhZHB0LT5iYXNlICsgRU1BQ19IQVNIX1RBQl9SRUcwKTsKKwl3cml0ZWwoMCwgYWRwdC0+YmFzZSArIEVNQUNfSEFTSF9UQUJfUkVHMSk7Cit9CisKKy8qIGRlZmluaXRpb25zIGZvciBSU1MgKi8KKyNkZWZpbmUgRU1BQ19SU1NfS0VZKF9pLCBfdHlwZSkgXAorCQkoRU1BQ19SU1NfS0VZMCArICgoX2kpICogc2l6ZW9mKF90eXBlKSkpCisjZGVmaW5lIEVNQUNfUlNTX1RCTChfaSwgX3R5cGUpIFwKKwkJKEVNQUNfSURUX1RBQkxFMCArICgoX2kpICogc2l6ZW9mKF90eXBlKSkpCisKKy8qIENvbmZpZyBNQUMgbW9kZXMgKi8KK3ZvaWQgZW1hY19tYWNfbW9kZV9jb25maWcoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRwdC0+bmV0ZGV2OworCXUzMiBtYWM7CisKKwltYWMgPSByZWFkbChhZHB0LT5iYXNlICsgRU1BQ19NQUNfQ1RSTCk7CisJbWFjICY9IH4oVkxBTl9TVFJJUCB8IFBST01fTU9ERSB8IE1VTFRJX0FMTCB8IE1BQ19MUF9FTik7CisKKwlpZiAobmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9DVEFHX1JYKQorCQltYWMgfD0gVkxBTl9TVFJJUDsKKworCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCW1hYyB8PSBQUk9NX01PREU7CisKKwlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkKKwkJbWFjIHw9IE1VTFRJX0FMTDsKKworCXdyaXRlbChtYWMsIGFkcHQtPmJhc2UgKyBFTUFDX01BQ19DVFJMKTsKK30KKworLyogQ29uZmlnIGRlc2NyaXB0b3IgcmluZ3MgKi8KK3N0YXRpYyB2b2lkIGVtYWNfbWFjX2RtYV9yaW5nc19jb25maWcoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgdHBkX3Ffb2Zmc2V0W10gPSB7CisJCUVNQUNfREVTQ19DVFJMXzgsICAgICAgICBFTUFDX0gxVFBEX0JBU0VfQUREUl9MTywKKwkJRU1BQ19IMlRQRF9CQVNFX0FERFJfTE8sIEVNQUNfSDNUUERfQkFTRV9BRERSX0xPfTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgcmZkX3Ffb2Zmc2V0W10gPSB7CisJCUVNQUNfREVTQ19DVFJMXzIsICAgICAgICBFTUFDX0RFU0NfQ1RSTF8xMCwKKwkJRU1BQ19ERVNDX0NUUkxfMTIsICAgICAgIEVNQUNfREVTQ19DVFJMXzEzfTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgcnJkX3Ffb2Zmc2V0W10gPSB7CisJCUVNQUNfREVTQ19DVFJMXzUsICAgICAgICBFTUFDX0RFU0NfQ1RSTF8xNCwKKwkJRU1BQ19ERVNDX0NUUkxfMTUsICAgICAgIEVNQUNfREVTQ19DVFJMXzE2fTsKKworCS8qIFRQRCAoVHJhbnNtaXQgUGFja2V0IERlc2NyaXB0b3IpICovCisJd3JpdGVsKHVwcGVyXzMyX2JpdHMoYWRwdC0+dHhfcS50cGQuZG1hX2FkZHIpLAorCSAgICAgICBhZHB0LT5iYXNlICsgRU1BQ19ERVNDX0NUUkxfMSk7CisKKwl3cml0ZWwobG93ZXJfMzJfYml0cyhhZHB0LT50eF9xLnRwZC5kbWFfYWRkciksCisJICAgICAgIGFkcHQtPmJhc2UgKyB0cGRfcV9vZmZzZXRbMF0pOworCisJd3JpdGVsKGFkcHQtPnR4X3EudHBkLmNvdW50ICYgVFBEX1JJTkdfU0laRV9CTVNLLAorCSAgICAgICBhZHB0LT5iYXNlICsgRU1BQ19ERVNDX0NUUkxfOSk7CisKKwkvKiBSRkQgKFJlY2VpdmUgRnJlZSBEZXNjcmlwdG9yKSAmIFJSRCAoUmVjZWl2ZSBSZXR1cm4gRGVzY3JpcHRvcikgKi8KKwl3cml0ZWwodXBwZXJfMzJfYml0cyhhZHB0LT5yeF9xLnJmZC5kbWFfYWRkciksCisJICAgICAgIGFkcHQtPmJhc2UgKyBFTUFDX0RFU0NfQ1RSTF8wKTsKKworCXdyaXRlbChsb3dlcl8zMl9iaXRzKGFkcHQtPnJ4X3EucmZkLmRtYV9hZGRyKSwKKwkgICAgICAgYWRwdC0+YmFzZSArIHJmZF9xX29mZnNldFswXSk7CisJd3JpdGVsKGxvd2VyXzMyX2JpdHMoYWRwdC0+cnhfcS5ycmQuZG1hX2FkZHIpLAorCSAgICAgICBhZHB0LT5iYXNlICsgcnJkX3Ffb2Zmc2V0WzBdKTsKKworCXdyaXRlbChhZHB0LT5yeF9xLnJmZC5jb3VudCAmIFJGRF9SSU5HX1NJWkVfQk1TSywKKwkgICAgICAgYWRwdC0+YmFzZSArIEVNQUNfREVTQ19DVFJMXzMpOworCXdyaXRlbChhZHB0LT5yeF9xLnJyZC5jb3VudCAmIFJSRF9SSU5HX1NJWkVfQk1TSywKKwkgICAgICAgYWRwdC0+YmFzZSArIEVNQUNfREVTQ19DVFJMXzYpOworCisJd3JpdGVsKGFkcHQtPnJ4YnVmX3NpemUgJiBSWF9CVUZGRVJfU0laRV9CTVNLLAorCSAgICAgICBhZHB0LT5iYXNlICsgRU1BQ19ERVNDX0NUUkxfNCk7CisKKwl3cml0ZWwoMCwgYWRwdC0+YmFzZSArIEVNQUNfREVTQ19DVFJMXzExKTsKKworCS8qIExvYWQgYWxsIG9mIHRoZSBiYXNlIGFkZHJlc3NlcyBhYm92ZSBhbmQgZW5zdXJlIHRoYXQgdHJpZ2dlcmluZyBIVyB0bworCSAqIHJlYWQgcmluZyBwb2ludGVycyBpcyBmbHVzaGVkCisJICovCisJd3JpdGVsKDEsIGFkcHQtPmJhc2UgKyBFTUFDX0lOVEVSX1NSQU1fUEFSVDkpOworfQorCisvKiBDb25maWcgdHJhbnNtaXQgcGFyYW1ldGVycyAqLworc3RhdGljIHZvaWQgZW1hY19tYWNfdHhfY29uZmlnKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJdTMyIHZhbDsKKworCXdyaXRlbCgoRU1BQ19NQVhfVFhfT0ZGTE9BRF9USFJFU0ggPj4gMykgJgorCSAgICAgICBKVU1CT19UQVNLX09GRkxPQURfVEhSRVNIT0xEX0JNU0ssIGFkcHQtPmJhc2UgKyBFTUFDX1RYUV9DVFJMXzEpOworCisJdmFsID0gKGFkcHQtPnRwZF9idXJzdCA8PCBOVU1fVFBEX0JVUlNUX1BSRUZfU0hGVCkgJgorCSAgICAgICBOVU1fVFBEX0JVUlNUX1BSRUZfQk1TSzsKKworCXZhbCB8PSBUWFFfTU9ERSB8IExTXzgwMjNfU1A7CisJdmFsIHw9ICgweDAxMDAgPDwgTlVNX1RYRl9CVVJTVF9QUkVGX1NIRlQpICYKKwkJTlVNX1RYRl9CVVJTVF9QUkVGX0JNU0s7CisKKwl3cml0ZWwodmFsLCBhZHB0LT5iYXNlICsgRU1BQ19UWFFfQ1RSTF8wKTsKKwllbWFjX3JlZ191cGRhdGUzMihhZHB0LT5iYXNlICsgRU1BQ19UWFFfQ1RSTF8yLAorCQkJICAoVFhGX0hXTV9CTVNLIHwgVFhGX0xXTV9CTVNLKSwgMCk7Cit9CisKKy8qIENvbmZpZyByZWNlaXZlIHBhcmFtZXRlcnMgKi8KK3N0YXRpYyB2b2lkIGVtYWNfbWFjX3J4X2NvbmZpZyhzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXUzMiB2YWw7CisKKwl2YWwgPSAoYWRwdC0+cmZkX2J1cnN0IDw8IE5VTV9SRkRfQlVSU1RfUFJFRl9TSEZUKSAmCisJICAgICAgIE5VTV9SRkRfQlVSU1RfUFJFRl9CTVNLOworCXZhbCB8PSAoU1BfSVBWNiB8IENVVF9USFJVX0VOKTsKKworCXdyaXRlbCh2YWwsIGFkcHQtPmJhc2UgKyBFTUFDX1JYUV9DVFJMXzApOworCisJdmFsID0gcmVhZGwoYWRwdC0+YmFzZSArIEVNQUNfUlhRX0NUUkxfMSk7CisJdmFsICY9IH4oSlVNQk9fMUtBSF9CTVNLIHwgUkZEX1BSRUZfTE9XX1RIUkVTSE9MRF9CTVNLIHwKKwkJIFJGRF9QUkVGX1VQX1RIUkVTSE9MRF9CTVNLKTsKKwl2YWwgfD0gKEpVTUJPXzFLQUggPDwgSlVNQk9fMUtBSF9TSEZUKSB8CisJCShSRkRfUFJFRl9MT1dfVEggPDwgUkZEX1BSRUZfTE9XX1RIUkVTSE9MRF9TSEZUKSB8CisJCShSRkRfUFJFRl9VUF9USCAgPDwgUkZEX1BSRUZfVVBfVEhSRVNIT0xEX1NIRlQpOworCXdyaXRlbCh2YWwsIGFkcHQtPmJhc2UgKyBFTUFDX1JYUV9DVFJMXzEpOworCisJdmFsID0gcmVhZGwoYWRwdC0+YmFzZSArIEVNQUNfUlhRX0NUUkxfMik7CisJdmFsICY9IH4oUlhGX0RPRl9USFJFU0hPTERfQk1TSyB8IFJYRl9VT0ZfVEhSRVNIT0xEX0JNU0spOworCXZhbCB8PSAoUlhGX0RPRl9USFJFU0ZIT0xEICA8PCBSWEZfRE9GX1RIUkVTSE9MRF9TSEZUKSB8CisJCShSWEZfVU9GX1RIUkVTRkhPTEQgPDwgUlhGX1VPRl9USFJFU0hPTERfU0hGVCk7CisJd3JpdGVsKHZhbCwgYWRwdC0+YmFzZSArIEVNQUNfUlhRX0NUUkxfMik7CisKKwl2YWwgPSByZWFkbChhZHB0LT5iYXNlICsgRU1BQ19SWFFfQ1RSTF8zKTsKKwl2YWwgJj0gfihSWERfVElNRVJfQk1TSyB8IFJYRF9USFJFU0hPTERfQk1TSyk7CisJdmFsIHw9IFJYRF9USCA8PCBSWERfVEhSRVNIT0xEX1NIRlQ7CisJd3JpdGVsKHZhbCwgYWRwdC0+YmFzZSArIEVNQUNfUlhRX0NUUkxfMyk7Cit9CisKKy8qIENvbmZpZyBkbWEgKi8KK3N0YXRpYyB2b2lkIGVtYWNfbWFjX2RtYV9jb25maWcoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwl1MzIgZG1hX2N0cmwgPSBETUFSX1JFUV9QUkk7CisKKwlzd2l0Y2ggKGFkcHQtPmRtYV9vcmRlcikgeworCWNhc2UgZW1hY19kbWFfb3JkX2luOgorCQlkbWFfY3RybCB8PSBJTl9PUkRFUl9NT0RFOworCQlicmVhazsKKwljYXNlIGVtYWNfZG1hX29yZF9lbmg6CisJCWRtYV9jdHJsIHw9IEVOSF9PUkRFUl9NT0RFOworCQlicmVhazsKKwljYXNlIGVtYWNfZG1hX29yZF9vdXQ6CisJCWRtYV9jdHJsIHw9IE9VVF9PUkRFUl9NT0RFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlkbWFfY3RybCB8PSAoKCh1MzIpYWRwdC0+ZG1hcl9ibG9jaykgPDwgUkVHUkRCTEVOX1NIRlQpICYKKwkJCQkJCVJFR1JEQkxFTl9CTVNLOworCWRtYV9jdHJsIHw9ICgoKHUzMilhZHB0LT5kbWF3X2Jsb2NrKSA8PCBSRUdXUkJMRU5fU0hGVCkgJgorCQkJCQkJUkVHV1JCTEVOX0JNU0s7CisJZG1hX2N0cmwgfD0gKCgodTMyKWFkcHQtPmRtYXJfZGx5X2NudCkgPDwgRE1BUl9ETFlfQ05UX1NIRlQpICYKKwkJCQkJCURNQVJfRExZX0NOVF9CTVNLOworCWRtYV9jdHJsIHw9ICgoKHUzMilhZHB0LT5kbWF3X2RseV9jbnQpIDw8IERNQVdfRExZX0NOVF9TSEZUKSAmCisJCQkJCQlETUFXX0RMWV9DTlRfQk1TSzsKKworCS8qIGNvbmZpZyBETUEgYW5kIGVuc3VyZSB0aGF0IGNvbmZpZ3VyYXRpb24gaXMgZmx1c2hlZCB0byBIVyAqLworCXdyaXRlbChkbWFfY3RybCwgYWRwdC0+YmFzZSArIEVNQUNfRE1BX0NUUkwpOworfQorCisvKiBzZXQgTUFDIGFkZHJlc3MgKi8KK3N0YXRpYyB2b2lkIGVtYWNfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQsIHU4ICphZGRyKQoreworCXUzMiBzdGE7CisKKwkvKiBmb3IgZXhhbXBsZTogMDAtQTAtQzYtMTEtMjItMzMKKwkgKiAwPC0tPkM2MTEyMjMzLCAxPC0tPjAwQTAuCisJICovCisKKwkvKiBsb3cgMzJiaXQgd29yZCAqLworCXN0YSA9ICgoKHUzMilhZGRyWzJdKSA8PCAyNCkgfCAoKCh1MzIpYWRkclszXSkgPDwgMTYpIHwKKwkgICAgICAoKCh1MzIpYWRkcls0XSkgPDwgOCkgIHwgKCgodTMyKWFkZHJbNV0pKTsKKwl3cml0ZWwoc3RhLCBhZHB0LT5iYXNlICsgRU1BQ19NQUNfU1RBX0FERFIwKTsKKworCS8qIGhpZ2h0IDMyYml0IHdvcmQgKi8KKwlzdGEgPSAoKCh1MzIpYWRkclswXSkgPDwgOCkgfCAodTMyKWFkZHJbMV07CisJd3JpdGVsKHN0YSwgYWRwdC0+YmFzZSArIEVNQUNfTUFDX1NUQV9BRERSMSk7Cit9CisKK3N0YXRpYyB2b2lkIGVtYWNfbWFjX2NvbmZpZyhzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZHB0LT5uZXRkZXY7CisJdW5zaWduZWQgaW50IG1heF9mcmFtZTsKKwl1MzIgdmFsOworCisJZW1hY19zZXRfbWFjX2FkZHJlc3MoYWRwdCwgbmV0ZGV2LT5kZXZfYWRkcik7CisKKwltYXhfZnJhbWUgPSBuZXRkZXYtPm10dSArIEVUSF9ITEVOICsgRVRIX0ZDU19MRU4gKyBWTEFOX0hMRU47CisJYWRwdC0+cnhidWZfc2l6ZSA9IG5ldGRldi0+bXR1ID4gRU1BQ19ERUZfUlhfQlVGX1NJWkUgPworCQlBTElHTihtYXhfZnJhbWUsIDgpIDogRU1BQ19ERUZfUlhfQlVGX1NJWkU7CisKKwllbWFjX21hY19kbWFfcmluZ3NfY29uZmlnKGFkcHQpOworCisJd3JpdGVsKG5ldGRldi0+bXR1ICsgRVRIX0hMRU4gKyBWTEFOX0hMRU4gKyBFVEhfRkNTX0xFTiwKKwkgICAgICAgYWRwdC0+YmFzZSArIEVNQUNfTUFYX0ZSQU1fTEVOX0NUUkwpOworCisJZW1hY19tYWNfdHhfY29uZmlnKGFkcHQpOworCWVtYWNfbWFjX3J4X2NvbmZpZyhhZHB0KTsKKwllbWFjX21hY19kbWFfY29uZmlnKGFkcHQpOworCisJdmFsID0gcmVhZGwoYWRwdC0+YmFzZSArIEVNQUNfQVhJX01BU1RfQ1RSTCk7CisJdmFsICY9IH4oREFUQV9CWVRFX1NXQVAgfCBNQVhfQk9VTkQpOworCXZhbCB8PSBNQVhfQlRZUEU7CisJd3JpdGVsKHZhbCwgYWRwdC0+YmFzZSArIEVNQUNfQVhJX01BU1RfQ1RSTCk7CisJd3JpdGVsKDAsIGFkcHQtPmJhc2UgKyBFTUFDX0NMS19HQVRFX0NUUkwpOworCXdyaXRlbChSWF9VTkNQTF9JTlRfRU4sIGFkcHQtPmJhc2UgKyBFTUFDX01JU0NfQ1RSTCk7Cit9CisKK3ZvaWQgZW1hY19tYWNfcmVzZXQoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwllbWFjX21hY19zdG9wKGFkcHQpOworCisJZW1hY19yZWdfdXBkYXRlMzIoYWRwdC0+YmFzZSArIEVNQUNfRE1BX01BU19DVFJMLCAwLCBTT0ZUX1JTVCk7CisJdXNsZWVwX3JhbmdlKDEwMCwgMTUwKTsgLyogcmVzZXQgbWF5IHRha2UgdXAgdG8gMTAwdXNlYyAqLworCisJLyogaW50ZXJydXB0IGNsZWFyLW9uLXJlYWQgKi8KKwllbWFjX3JlZ191cGRhdGUzMihhZHB0LT5iYXNlICsgRU1BQ19ETUFfTUFTX0NUUkwsIDAsIElOVF9SRF9DTFJfRU4pOworfQorCit2b2lkIGVtYWNfbWFjX3N0YXJ0KHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IGFkcHQtPnBoeWRldjsKKwl1MzIgbWFjLCBjc3IxOworCisJLyogZW5hYmxlIHR4IHF1ZXVlICovCisJZW1hY19yZWdfdXBkYXRlMzIoYWRwdC0+YmFzZSArIEVNQUNfVFhRX0NUUkxfMCwgMCwgVFhRX0VOKTsKKworCS8qIGVuYWJsZSByeCBxdWV1ZSAqLworCWVtYWNfcmVnX3VwZGF0ZTMyKGFkcHQtPmJhc2UgKyBFTUFDX1JYUV9DVFJMXzAsIDAsIFJYUV9FTik7CisKKwkvKiBlbmFibGUgbWFjIGNvbnRyb2wgKi8KKwltYWMgPSByZWFkbChhZHB0LT5iYXNlICsgRU1BQ19NQUNfQ1RSTCk7CisJY3NyMSA9IHJlYWRsKGFkcHQtPmNzciArIEVNQUNfRU1BQ19XUkFQUEVSX0NTUjEpOworCisJbWFjIHw9IFRYRU4gfCBSWEVOOyAgICAgLyogZW5hYmxlIFJYL1RYICovCisKKwkvKiBXZSBkb24ndCBoYXZlIGV0aHRvb2wgc3VwcG9ydCB5ZXQsIHNvIGZvcmNlIGZsb3ctY29udHJvbCBtb2RlCisJICogdG8gJ2Z1bGwnIGFsd2F5cy4KKwkgKi8KKwltYWMgfD0gVFhGQyB8IFJYRkM7CisKKwkvKiBzZXR1cCBsaW5rIHNwZWVkICovCisJbWFjICY9IH5TUEVFRF9NQVNLOworCWlmIChwaHlkZXYtPnNwZWVkID09IFNQRUVEXzEwMDApIHsKKwkJbWFjIHw9IFNQRUVEKDIpOworCQljc3IxIHw9IEZSRVFfTU9ERTsKKwl9IGVsc2UgeworCQltYWMgfD0gU1BFRUQoMSk7CisJCWNzcjEgJj0gfkZSRVFfTU9ERTsKKwl9CisKKwlpZiAocGh5ZGV2LT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCW1hYyB8PSBGVUxMRDsKKwllbHNlCisJCW1hYyAmPSB+RlVMTEQ7CisKKwkvKiBvdGhlciBwYXJhbWV0ZXJzICovCisJbWFjIHw9IChDUkNFIHwgUENSQ0UpOworCW1hYyB8PSAoKGFkcHQtPnByZWFtYmxlIDw8IFBSTEVOX1NIRlQpICYgUFJMRU5fQk1TSyk7CisJbWFjIHw9IEJST0FEX0VOOworCW1hYyB8PSBGTENISzsKKwltYWMgJj0gflJYX0NIS1NVTV9FTjsKKwltYWMgJj0gfihIVUdFTiB8IFZMQU5fU1RSSVAgfCBUUEFVU0UgfCBTSU1SIHwgSFVHRSB8IE1VTFRJX0FMTCB8CisJCSBERUJVR19NT0RFIHwgU0lOR0xFX1BBVVNFX01PREUpOworCisJd3JpdGVsX3JlbGF4ZWQoY3NyMSwgYWRwdC0+Y3NyICsgRU1BQ19FTUFDX1dSQVBQRVJfQ1NSMSk7CisKKwl3cml0ZWxfcmVsYXhlZChtYWMsIGFkcHQtPmJhc2UgKyBFTUFDX01BQ19DVFJMKTsKKworCS8qIGVuYWJsZSBpbnRlcnJ1cHQgcmVhZCBjbGVhciwgbG93IHBvd2VyIHNsZWVwIG1vZGUgYW5kCisJICogdGhlIGlycSBtb2RlcmF0b3JzCisJICovCisKKwl3cml0ZWxfcmVsYXhlZChhZHB0LT5pcnFfbW9kLCBhZHB0LT5iYXNlICsgRU1BQ19JUlFfTU9EX1RJTV9JTklUKTsKKwl3cml0ZWxfcmVsYXhlZChJTlRfUkRfQ0xSX0VOIHwgTFBXX01PREUgfCBJUlFfTU9ERVJBVE9SX0VOIHwKKwkJCUlSUV9NT0RFUkFUT1IyX0VOLCBhZHB0LT5iYXNlICsgRU1BQ19ETUFfTUFTX0NUUkwpOworCisJZW1hY19tYWNfbW9kZV9jb25maWcoYWRwdCk7CisKKwllbWFjX3JlZ191cGRhdGUzMihhZHB0LT5iYXNlICsgRU1BQ19BVEhSX0hFQURFUl9DVFJMLAorCQkJICAoSEVBREVSX0VOQUJMRSB8IEhFQURFUl9DTlRfRU4pLCAwKTsKKworCWVtYWNfcmVnX3VwZGF0ZTMyKGFkcHQtPmNzciArIEVNQUNfRU1BQ19XUkFQUEVSX0NTUjIsIDAsIFdPTF9FTik7Cit9CisKK3ZvaWQgZW1hY19tYWNfc3RvcChzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCWVtYWNfcmVnX3VwZGF0ZTMyKGFkcHQtPmJhc2UgKyBFTUFDX1JYUV9DVFJMXzAsIFJYUV9FTiwgMCk7CisJZW1hY19yZWdfdXBkYXRlMzIoYWRwdC0+YmFzZSArIEVNQUNfVFhRX0NUUkxfMCwgVFhRX0VOLCAwKTsKKwllbWFjX3JlZ191cGRhdGUzMihhZHB0LT5iYXNlICsgRU1BQ19NQUNfQ1RSTCwgVFhFTiB8IFJYRU4sIDApOworCXVzbGVlcF9yYW5nZSgxMDAwLCAxMDUwKTsgLyogc3RvcHBpbmcgbWFjIG1heSB0YWtlIHVwdG8gMW1zZWMgKi8KK30KKworLyogRnJlZSBhbGwgZGVzY3JpcHRvcnMgb2YgZ2l2ZW4gdHJhbnNtaXQgcXVldWUgKi8KK3N0YXRpYyB2b2lkIGVtYWNfdHhfcV9kZXNjc19mcmVlKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJc3RydWN0IGVtYWNfdHhfcXVldWUgKnR4X3EgPSAmYWRwdC0+dHhfcTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlzaXplX3Qgc2l6ZTsKKworCS8qIHJpbmcgYWxyZWFkeSBjbGVhcmVkLCBub3RoaW5nIHRvIGRvICovCisJaWYgKCF0eF9xLT50cGQudHBidWZmKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgdHhfcS0+dHBkLmNvdW50OyBpKyspIHsKKwkJc3RydWN0IGVtYWNfYnVmZmVyICp0cGJ1ZiA9IEdFVF9UUERfQlVGRkVSKHR4X3EsIGkpOworCisJCWlmICh0cGJ1Zi0+ZG1hX2FkZHIpIHsKKwkJCWRtYV91bm1hcF9zaW5nbGUoYWRwdC0+bmV0ZGV2LT5kZXYucGFyZW50LAorCQkJCQkgdHBidWYtPmRtYV9hZGRyLCB0cGJ1Zi0+bGVuZ3RoLAorCQkJCQkgRE1BX1RPX0RFVklDRSk7CisJCQl0cGJ1Zi0+ZG1hX2FkZHIgPSAwOworCQl9CisJCWlmICh0cGJ1Zi0+c2tiKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2FueSh0cGJ1Zi0+c2tiKTsKKwkJCXRwYnVmLT5za2IgPSBOVUxMOworCQl9CisJfQorCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZW1hY19idWZmZXIpICogdHhfcS0+dHBkLmNvdW50OworCW1lbXNldCh0eF9xLT50cGQudHBidWZmLCAwLCBzaXplKTsKKworCS8qIGNsZWFyIHRoZSBkZXNjcmlwdG9yIHJpbmcgKi8KKwltZW1zZXQodHhfcS0+dHBkLnZfYWRkciwgMCwgdHhfcS0+dHBkLnNpemUpOworCisJdHhfcS0+dHBkLmNvbnN1bWVfaWR4ID0gMDsKKwl0eF9xLT50cGQucHJvZHVjZV9pZHggPSAwOworfQorCisvKiBGcmVlIGFsbCBkZXNjcmlwdG9ycyBvZiBnaXZlbiByZWNlaXZlIHF1ZXVlICovCitzdGF0aWMgdm9pZCBlbWFjX3J4X3FfZnJlZV9kZXNjcyhzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGFkcHQtPm5ldGRldi0+ZGV2LnBhcmVudDsKKwlzdHJ1Y3QgZW1hY19yeF9xdWV1ZSAqcnhfcSA9ICZhZHB0LT5yeF9xOworCXVuc2lnbmVkIGludCBpOworCXNpemVfdCBzaXplOworCisJLyogcmluZyBhbHJlYWR5IGNsZWFyZWQsIG5vdGhpbmcgdG8gZG8gKi8KKwlpZiAoIXJ4X3EtPnJmZC5yZmJ1ZmYpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCByeF9xLT5yZmQuY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgZW1hY19idWZmZXIgKnJmYnVmID0gR0VUX1JGRF9CVUZGRVIocnhfcSwgaSk7CisKKwkJaWYgKHJmYnVmLT5kbWFfYWRkcikgeworCQkJZG1hX3VubWFwX3NpbmdsZShkZXYsIHJmYnVmLT5kbWFfYWRkciwgcmZidWYtPmxlbmd0aCwKKwkJCQkJIERNQV9GUk9NX0RFVklDRSk7CisJCQlyZmJ1Zi0+ZG1hX2FkZHIgPSAwOworCQl9CisJCWlmIChyZmJ1Zi0+c2tiKSB7CisJCQlkZXZfa2ZyZWVfc2tiKHJmYnVmLT5za2IpOworCQkJcmZidWYtPnNrYiA9IE5VTEw7CisJCX0KKwl9CisKKwlzaXplID0gIHNpemVvZihzdHJ1Y3QgZW1hY19idWZmZXIpICogcnhfcS0+cmZkLmNvdW50OworCW1lbXNldChyeF9xLT5yZmQucmZidWZmLCAwLCBzaXplKTsKKworCS8qIGNsZWFyIHRoZSBkZXNjcmlwdG9yIHJpbmdzICovCisJbWVtc2V0KHJ4X3EtPnJyZC52X2FkZHIsIDAsIHJ4X3EtPnJyZC5zaXplKTsKKwlyeF9xLT5ycmQucHJvZHVjZV9pZHggPSAwOworCXJ4X3EtPnJyZC5jb25zdW1lX2lkeCA9IDA7CisKKwltZW1zZXQocnhfcS0+cmZkLnZfYWRkciwgMCwgcnhfcS0+cmZkLnNpemUpOworCXJ4X3EtPnJmZC5wcm9kdWNlX2lkeCA9IDA7CisJcnhfcS0+cmZkLmNvbnN1bWVfaWR4ID0gMDsKK30KKworLyogRnJlZSBhbGwgYnVmZmVycyBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4gdHJhbnNtaXQgcXVldWUgKi8KK3N0YXRpYyB2b2lkIGVtYWNfdHhfcV9idWZzX2ZyZWUoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwlzdHJ1Y3QgZW1hY190eF9xdWV1ZSAqdHhfcSA9ICZhZHB0LT50eF9xOworCisJZW1hY190eF9xX2Rlc2NzX2ZyZWUoYWRwdCk7CisKKwlrZnJlZSh0eF9xLT50cGQudHBidWZmKTsKKwl0eF9xLT50cGQudHBidWZmID0gTlVMTDsKKwl0eF9xLT50cGQudl9hZGRyID0gTlVMTDsKKwl0eF9xLT50cGQuZG1hX2FkZHIgPSAwOworCXR4X3EtPnRwZC5zaXplID0gMDsKK30KKworLyogQWxsb2NhdGUgVFggZGVzY3JpcHRvciByaW5nIGZvciB0aGUgZ2l2ZW4gdHJhbnNtaXQgcXVldWUgKi8KK3N0YXRpYyBpbnQgZW1hY190eF9xX2Rlc2NfYWxsb2Moc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCwKKwkJCQlzdHJ1Y3QgZW1hY190eF9xdWV1ZSAqdHhfcSkKK3sKKwlzdHJ1Y3QgZW1hY19yaW5nX2hlYWRlciAqcmluZ19oZWFkZXIgPSAmYWRwdC0+cmluZ19oZWFkZXI7CisJc2l6ZV90IHNpemU7CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBlbWFjX2J1ZmZlcikgKiB0eF9xLT50cGQuY291bnQ7CisJdHhfcS0+dHBkLnRwYnVmZiA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0eF9xLT50cGQudHBidWZmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXR4X3EtPnRwZC5zaXplID0gdHhfcS0+dHBkLmNvdW50ICogKGFkcHQtPnRwZF9zaXplICogNCk7CisJdHhfcS0+dHBkLmRtYV9hZGRyID0gcmluZ19oZWFkZXItPmRtYV9hZGRyICsgcmluZ19oZWFkZXItPnVzZWQ7CisJdHhfcS0+dHBkLnZfYWRkciA9IHJpbmdfaGVhZGVyLT52X2FkZHIgKyByaW5nX2hlYWRlci0+dXNlZDsKKwlyaW5nX2hlYWRlci0+dXNlZCArPSBBTElHTih0eF9xLT50cGQuc2l6ZSwgOCk7CisJdHhfcS0+dHBkLnByb2R1Y2VfaWR4ID0gMDsKKwl0eF9xLT50cGQuY29uc3VtZV9pZHggPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEZyZWUgYWxsIGJ1ZmZlcnMgYXNzb2NpYXRlZCB3aXRoIGdpdmVuIHRyYW5zbWl0IHF1ZXVlICovCitzdGF0aWMgdm9pZCBlbWFjX3J4X3FfYnVmc19mcmVlKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJc3RydWN0IGVtYWNfcnhfcXVldWUgKnJ4X3EgPSAmYWRwdC0+cnhfcTsKKworCWVtYWNfcnhfcV9mcmVlX2Rlc2NzKGFkcHQpOworCisJa2ZyZWUocnhfcS0+cmZkLnJmYnVmZik7CisJcnhfcS0+cmZkLnJmYnVmZiAgID0gTlVMTDsKKworCXJ4X3EtPnJmZC52X2FkZHIgICA9IE5VTEw7CisJcnhfcS0+cmZkLmRtYV9hZGRyID0gMDsKKwlyeF9xLT5yZmQuc2l6ZSAgICAgPSAwOworCisJcnhfcS0+cnJkLnZfYWRkciAgID0gTlVMTDsKKwlyeF9xLT5ycmQuZG1hX2FkZHIgPSAwOworCXJ4X3EtPnJyZC5zaXplICAgICA9IDA7Cit9CisKKy8qIEFsbG9jYXRlIFJYIGRlc2NyaXB0b3IgcmluZ3MgZm9yIHRoZSBnaXZlbiByZWNlaXZlIHF1ZXVlICovCitzdGF0aWMgaW50IGVtYWNfcnhfZGVzY3NfYWxsb2Moc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwlzdHJ1Y3QgZW1hY19yaW5nX2hlYWRlciAqcmluZ19oZWFkZXIgPSAmYWRwdC0+cmluZ19oZWFkZXI7CisJc3RydWN0IGVtYWNfcnhfcXVldWUgKnJ4X3EgPSAmYWRwdC0+cnhfcTsKKwlzaXplX3Qgc2l6ZTsKKworCXNpemUgPSBzaXplb2Yoc3RydWN0IGVtYWNfYnVmZmVyKSAqIHJ4X3EtPnJmZC5jb3VudDsKKwlyeF9xLT5yZmQucmZidWZmID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJ4X3EtPnJmZC5yZmJ1ZmYpCisJCXJldHVybiAtRU5PTUVNOworCisJcnhfcS0+cnJkLnNpemUgPSByeF9xLT5ycmQuY291bnQgKiAoYWRwdC0+cnJkX3NpemUgKiA0KTsKKwlyeF9xLT5yZmQuc2l6ZSA9IHJ4X3EtPnJmZC5jb3VudCAqIChhZHB0LT5yZmRfc2l6ZSAqIDQpOworCisJcnhfcS0+cnJkLmRtYV9hZGRyID0gcmluZ19oZWFkZXItPmRtYV9hZGRyICsgcmluZ19oZWFkZXItPnVzZWQ7CisJcnhfcS0+cnJkLnZfYWRkciAgID0gcmluZ19oZWFkZXItPnZfYWRkciArIHJpbmdfaGVhZGVyLT51c2VkOworCXJpbmdfaGVhZGVyLT51c2VkICs9IEFMSUdOKHJ4X3EtPnJyZC5zaXplLCA4KTsKKworCXJ4X3EtPnJmZC5kbWFfYWRkciA9IHJpbmdfaGVhZGVyLT5kbWFfYWRkciArIHJpbmdfaGVhZGVyLT51c2VkOworCXJ4X3EtPnJmZC52X2FkZHIgICA9IHJpbmdfaGVhZGVyLT52X2FkZHIgKyByaW5nX2hlYWRlci0+dXNlZDsKKwlyaW5nX2hlYWRlci0+dXNlZCArPSBBTElHTihyeF9xLT5yZmQuc2l6ZSwgOCk7CisKKwlyeF9xLT5ycmQucHJvZHVjZV9pZHggPSAwOworCXJ4X3EtPnJyZC5jb25zdW1lX2lkeCA9IDA7CisKKwlyeF9xLT5yZmQucHJvZHVjZV9pZHggPSAwOworCXJ4X3EtPnJmZC5jb25zdW1lX2lkeCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyogQWxsb2NhdGUgYWxsIFRYIGFuZCBSWCBkZXNjcmlwdG9yIHJpbmdzICovCitpbnQgZW1hY19tYWNfcnhfdHhfcmluZ3NfYWxsb2NfYWxsKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJc3RydWN0IGVtYWNfcmluZ19oZWFkZXIgKnJpbmdfaGVhZGVyID0gJmFkcHQtPnJpbmdfaGVhZGVyOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGFkcHQtPm5ldGRldi0+ZGV2LnBhcmVudDsKKwl1bnNpZ25lZCBpbnQgbnVtX3R4X2Rlc2NzID0gYWRwdC0+dHhfZGVzY19jbnQ7CisJdW5zaWduZWQgaW50IG51bV9yeF9kZXNjcyA9IGFkcHQtPnJ4X2Rlc2NfY250OworCWludCByZXQ7CisKKwlhZHB0LT50eF9xLnRwZC5jb3VudCA9IGFkcHQtPnR4X2Rlc2NfY250OworCisJYWRwdC0+cnhfcS5ycmQuY291bnQgPSBhZHB0LT5yeF9kZXNjX2NudDsKKwlhZHB0LT5yeF9xLnJmZC5jb3VudCA9IGFkcHQtPnJ4X2Rlc2NfY250OworCisJLyogUmluZyBETUEgYnVmZmVyLiBFYWNoIHJpbmcgbWF5IG5lZWQgdXAgdG8gOCBieXRlcyBmb3IgYWxpZ25tZW50LAorCSAqIGhlbmNlIHRoZSBhZGRpdGlvbmFsIHBhZGRpbmcgYnl0ZXMgYXJlIGFsbG9jYXRlZC4KKwkgKi8KKwlyaW5nX2hlYWRlci0+c2l6ZSA9IG51bV90eF9kZXNjcyAqIChhZHB0LT50cGRfc2l6ZSAqIDQpICsKKwkJCSAgICBudW1fcnhfZGVzY3MgKiAoYWRwdC0+cmZkX3NpemUgKiA0KSArCisJCQkgICAgbnVtX3J4X2Rlc2NzICogKGFkcHQtPnJyZF9zaXplICogNCkgKworCQkJICAgIDggKyAyICogODsgLyogOCBieXRlIHBlciBvbmUgVHggYW5kIHR3byBSeCByaW5ncyAqLworCisJcmluZ19oZWFkZXItPnVzZWQgPSAwOworCXJpbmdfaGVhZGVyLT52X2FkZHIgPSBkbWFfemFsbG9jX2NvaGVyZW50KGRldiwgcmluZ19oZWFkZXItPnNpemUsCisJCQkJCQkgJnJpbmdfaGVhZGVyLT5kbWFfYWRkciwKKwkJCQkJCSBHRlBfS0VSTkVMKTsKKwlpZiAoIXJpbmdfaGVhZGVyLT52X2FkZHIpCisJCXJldHVybiAtRU5PTUVNOworCisJcmluZ19oZWFkZXItPnVzZWQgPSBBTElHTihyaW5nX2hlYWRlci0+ZG1hX2FkZHIsIDgpIC0KKwkJCQkJCQlyaW5nX2hlYWRlci0+ZG1hX2FkZHI7CisKKwlyZXQgPSBlbWFjX3R4X3FfZGVzY19hbGxvYyhhZHB0LCAmYWRwdC0+dHhfcSk7CisJaWYgKHJldCkgeworCQluZXRkZXZfZXJyKGFkcHQtPm5ldGRldiwgImVycm9yOiBUeCBRdWV1ZSBhbGxvYyBmYWlsZWRcbiIpOworCQlnb3RvIGVycl9hbGxvY190eDsKKwl9CisKKwlyZXQgPSBlbWFjX3J4X2Rlc2NzX2FsbG9jKGFkcHQpOworCWlmIChyZXQpIHsKKwkJbmV0ZGV2X2VycihhZHB0LT5uZXRkZXYsICJlcnJvcjogUnggUXVldWUgYWxsb2MgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfYWxsb2Nfcng7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9hbGxvY19yeDoKKwllbWFjX3R4X3FfYnVmc19mcmVlKGFkcHQpOworZXJyX2FsbG9jX3R4OgorCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgcmluZ19oZWFkZXItPnNpemUsCisJCQkgIHJpbmdfaGVhZGVyLT52X2FkZHIsIHJpbmdfaGVhZGVyLT5kbWFfYWRkcik7CisKKwlyaW5nX2hlYWRlci0+dl9hZGRyICAgPSBOVUxMOworCXJpbmdfaGVhZGVyLT5kbWFfYWRkciA9IDA7CisJcmluZ19oZWFkZXItPnNpemUgICAgID0gMDsKKwlyaW5nX2hlYWRlci0+dXNlZCAgICAgPSAwOworCisJcmV0dXJuIHJldDsKK30KKworLyogRnJlZSBhbGwgVFggYW5kIFJYIGRlc2NyaXB0b3IgcmluZ3MgKi8KK3ZvaWQgZW1hY19tYWNfcnhfdHhfcmluZ3NfZnJlZV9hbGwoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwlzdHJ1Y3QgZW1hY19yaW5nX2hlYWRlciAqcmluZ19oZWFkZXIgPSAmYWRwdC0+cmluZ19oZWFkZXI7CisJc3RydWN0IGRldmljZSAqZGV2ID0gYWRwdC0+bmV0ZGV2LT5kZXYucGFyZW50OworCisJZW1hY190eF9xX2J1ZnNfZnJlZShhZHB0KTsKKwllbWFjX3J4X3FfYnVmc19mcmVlKGFkcHQpOworCisJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCByaW5nX2hlYWRlci0+c2l6ZSwKKwkJCSAgcmluZ19oZWFkZXItPnZfYWRkciwgcmluZ19oZWFkZXItPmRtYV9hZGRyKTsKKworCXJpbmdfaGVhZGVyLT52X2FkZHIgICA9IE5VTEw7CisJcmluZ19oZWFkZXItPmRtYV9hZGRyID0gMDsKKwlyaW5nX2hlYWRlci0+c2l6ZSAgICAgPSAwOworCXJpbmdfaGVhZGVyLT51c2VkICAgICA9IDA7Cit9CisKKy8qIEluaXRpYWxpemUgZGVzY3JpcHRvciByaW5ncyAqLworc3RhdGljIHZvaWQgZW1hY19tYWNfcnhfdHhfcmluZ19yZXNldF9hbGwoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWFkcHQtPnR4X3EudHBkLnByb2R1Y2VfaWR4ID0gMDsKKwlhZHB0LT50eF9xLnRwZC5jb25zdW1lX2lkeCA9IDA7CisJZm9yIChpID0gMDsgaSA8IGFkcHQtPnR4X3EudHBkLmNvdW50OyBpKyspCisJCWFkcHQtPnR4X3EudHBkLnRwYnVmZltpXS5kbWFfYWRkciA9IDA7CisKKwlhZHB0LT5yeF9xLnJyZC5wcm9kdWNlX2lkeCA9IDA7CisJYWRwdC0+cnhfcS5ycmQuY29uc3VtZV9pZHggPSAwOworCWFkcHQtPnJ4X3EucmZkLnByb2R1Y2VfaWR4ID0gMDsKKwlhZHB0LT5yeF9xLnJmZC5jb25zdW1lX2lkeCA9IDA7CisJZm9yIChpID0gMDsgaSA8IGFkcHQtPnJ4X3EucmZkLmNvdW50OyBpKyspCisJCWFkcHQtPnJ4X3EucmZkLnJmYnVmZltpXS5kbWFfYWRkciA9IDA7Cit9CisKKy8qIFByb2R1Y2UgbmV3IHJlY2VpdmUgZnJlZSBkZXNjcmlwdG9yICovCitzdGF0aWMgdm9pZCBlbWFjX21hY19yeF9yZmRfY3JlYXRlKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQsCisJCQkJICAgc3RydWN0IGVtYWNfcnhfcXVldWUgKnJ4X3EsCisJCQkJICAgZG1hX2FkZHJfdCBhZGRyKQoreworCXUzMiAqaHdfcmZkID0gRU1BQ19SRkQocnhfcSwgYWRwdC0+cmZkX3NpemUsIHJ4X3EtPnJmZC5wcm9kdWNlX2lkeCk7CisKKwkqKGh3X3JmZCsrKSA9IGxvd2VyXzMyX2JpdHMoYWRkcik7CisJKmh3X3JmZCA9IHVwcGVyXzMyX2JpdHMoYWRkcik7CisKKwlpZiAoKytyeF9xLT5yZmQucHJvZHVjZV9pZHggPT0gcnhfcS0+cmZkLmNvdW50KQorCQlyeF9xLT5yZmQucHJvZHVjZV9pZHggPSAwOworfQorCisvKiBGaWxsIHVwIHJlY2VpdmUgcXVldWUncyBSRkQgd2l0aCBwcmVhbGxvY2F0ZWQgcmVjZWl2ZSBidWZmZXJzICovCitzdGF0aWMgdm9pZCBlbWFjX21hY19yeF9kZXNjc19yZWZpbGwoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCwKKwkJCQkgICAgc3RydWN0IGVtYWNfcnhfcXVldWUgKnJ4X3EpCit7CisJc3RydWN0IGVtYWNfYnVmZmVyICpjdXJyX3J4YnVmOworCXN0cnVjdCBlbWFjX2J1ZmZlciAqbmV4dF9yeGJ1ZjsKKwl1bnNpZ25lZCBpbnQgY291bnQgPSAwOworCXUzMiBuZXh0X3Byb2R1Y2VfaWR4OworCisJbmV4dF9wcm9kdWNlX2lkeCA9IHJ4X3EtPnJmZC5wcm9kdWNlX2lkeCArIDE7CisJaWYgKG5leHRfcHJvZHVjZV9pZHggPT0gcnhfcS0+cmZkLmNvdW50KQorCQluZXh0X3Byb2R1Y2VfaWR4ID0gMDsKKworCWN1cnJfcnhidWYgPSBHRVRfUkZEX0JVRkZFUihyeF9xLCByeF9xLT5yZmQucHJvZHVjZV9pZHgpOworCW5leHRfcnhidWYgPSBHRVRfUkZEX0JVRkZFUihyeF9xLCBuZXh0X3Byb2R1Y2VfaWR4KTsKKworCS8qIHRoaXMgYWx3YXlzIGhhcyBhIGJsYW5rIHJ4X2J1ZmZlciovCisJd2hpbGUgKCFuZXh0X3J4YnVmLT5kbWFfYWRkcikgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlpbnQgcmV0OworCisJCXNrYiA9IG5ldGRldl9hbGxvY19za2JfaXBfYWxpZ24oYWRwdC0+bmV0ZGV2LCBhZHB0LT5yeGJ1Zl9zaXplKTsKKwkJaWYgKCFza2IpCisJCQlicmVhazsKKworCQljdXJyX3J4YnVmLT5kbWFfYWRkciA9CisJCQlkbWFfbWFwX3NpbmdsZShhZHB0LT5uZXRkZXYtPmRldi5wYXJlbnQsIHNrYi0+ZGF0YSwKKwkJCQkgICAgICAgY3Vycl9yeGJ1Zi0+bGVuZ3RoLCBETUFfRlJPTV9ERVZJQ0UpOworCQlyZXQgPSBkbWFfbWFwcGluZ19lcnJvcihhZHB0LT5uZXRkZXYtPmRldi5wYXJlbnQsCisJCQkJCWN1cnJfcnhidWYtPmRtYV9hZGRyKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJYnJlYWs7CisJCX0KKwkJY3Vycl9yeGJ1Zi0+c2tiID0gc2tiOworCQljdXJyX3J4YnVmLT5sZW5ndGggPSBhZHB0LT5yeGJ1Zl9zaXplOworCisJCWVtYWNfbWFjX3J4X3JmZF9jcmVhdGUoYWRwdCwgcnhfcSwgY3Vycl9yeGJ1Zi0+ZG1hX2FkZHIpOworCQluZXh0X3Byb2R1Y2VfaWR4ID0gcnhfcS0+cmZkLnByb2R1Y2VfaWR4ICsgMTsKKwkJaWYgKG5leHRfcHJvZHVjZV9pZHggPT0gcnhfcS0+cmZkLmNvdW50KQorCQkJbmV4dF9wcm9kdWNlX2lkeCA9IDA7CisKKwkJY3Vycl9yeGJ1ZiA9IEdFVF9SRkRfQlVGRkVSKHJ4X3EsIHJ4X3EtPnJmZC5wcm9kdWNlX2lkeCk7CisJCW5leHRfcnhidWYgPSBHRVRfUkZEX0JVRkZFUihyeF9xLCBuZXh0X3Byb2R1Y2VfaWR4KTsKKwkJY291bnQrKzsKKwl9CisKKwlpZiAoY291bnQpIHsKKwkJdTMyIHByb2RfaWR4ID0gKHJ4X3EtPnJmZC5wcm9kdWNlX2lkeCA8PCByeF9xLT5wcm9kdWNlX3NoaWZ0KSAmCisJCQkJcnhfcS0+cHJvZHVjZV9tYXNrOworCQllbWFjX3JlZ191cGRhdGUzMihhZHB0LT5iYXNlICsgcnhfcS0+cHJvZHVjZV9yZWcsCisJCQkJICByeF9xLT5wcm9kdWNlX21hc2ssIHByb2RfaWR4KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVtYWNfYWRqdXN0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gbmV0ZGV2LT5waHlkZXY7CisKKwlpZiAocGh5ZGV2LT5saW5rKQorCQllbWFjX21hY19zdGFydChhZHB0KTsKKwllbHNlCisJCWVtYWNfbWFjX3N0b3AoYWRwdCk7CisKKwlwaHlfcHJpbnRfc3RhdHVzKHBoeWRldik7Cit9CisKKy8qIEJyaW5ndXAgdGhlIGludGVyZmFjZS9IVyAqLworaW50IGVtYWNfbWFjX3VwKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkcHQtPm5ldGRldjsKKwlzdHJ1Y3QgZW1hY19pcnEJKmlycSA9ICZhZHB0LT5pcnE7CisJaW50IHJldDsKKworCWVtYWNfbWFjX3J4X3R4X3JpbmdfcmVzZXRfYWxsKGFkcHQpOworCWVtYWNfbWFjX2NvbmZpZyhhZHB0KTsKKworCXJldCA9IHJlcXVlc3RfaXJxKGlycS0+aXJxLCBlbWFjX2lzciwgMCwgRU1BQ19NQUNfSVJRX1JFUywgaXJxKTsKKwlpZiAocmV0KSB7CisJCW5ldGRldl9lcnIoYWRwdC0+bmV0ZGV2LCAiY291bGQgbm90IHJlcXVlc3QgJXMgaXJxXG4iLAorCQkJICAgRU1BQ19NQUNfSVJRX1JFUyk7CisJCXJldHVybiByZXQ7CisJfQorCisJZW1hY19tYWNfcnhfZGVzY3NfcmVmaWxsKGFkcHQsICZhZHB0LT5yeF9xKTsKKworCXJldCA9IHBoeV9jb25uZWN0X2RpcmVjdChuZXRkZXYsIGFkcHQtPnBoeWRldiwgZW1hY19hZGp1c3RfbGluaywKKwkJCQkgUEhZX0lOVEVSRkFDRV9NT0RFX1NHTUlJKTsKKwlpZiAocmV0KSB7CisJCW5ldGRldl9lcnIoYWRwdC0+bmV0ZGV2LCAiY291bGQgbm90IGNvbm5lY3QgcGh5XG4iKTsKKwkJZnJlZV9pcnEoaXJxLT5pcnEsIGlycSk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogZW5hYmxlIG1hYyBpcnEgKi8KKwl3cml0ZWwoKHUzMil+RElTX0lOVCwgYWRwdC0+YmFzZSArIEVNQUNfSU5UX1NUQVRVUyk7CisJd3JpdGVsKGFkcHQtPmlycS5tYXNrLCBhZHB0LT5iYXNlICsgRU1BQ19JTlRfTUFTSyk7CisKKwlhZHB0LT5waHlkZXYtPmlycSA9IFBIWV9JR05PUkVfSU5URVJSVVBUOworCXBoeV9zdGFydChhZHB0LT5waHlkZXYpOworCisJbmFwaV9lbmFibGUoJmFkcHQtPnJ4X3EubmFwaSk7CisJbmV0aWZfc3RhcnRfcXVldWUobmV0ZGV2KTsKKworCXJldHVybiAwOworfQorCisvKiBCcmluZyBkb3duIHRoZSBpbnRlcmZhY2UvSFcgKi8KK3ZvaWQgZW1hY19tYWNfZG93bihzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZHB0LT5uZXRkZXY7CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisJbmFwaV9kaXNhYmxlKCZhZHB0LT5yeF9xLm5hcGkpOworCisJcGh5X3N0b3AoYWRwdC0+cGh5ZGV2KTsKKwlwaHlfZGlzY29ubmVjdChhZHB0LT5waHlkZXYpOworCisJLyogZGlzYWJsZSBtYWMgaXJxICovCisJd3JpdGVsKERJU19JTlQsIGFkcHQtPmJhc2UgKyBFTUFDX0lOVF9TVEFUVVMpOworCXdyaXRlbCgwLCBhZHB0LT5iYXNlICsgRU1BQ19JTlRfTUFTSyk7CisJc3luY2hyb25pemVfaXJxKGFkcHQtPmlycS5pcnEpOworCWZyZWVfaXJxKGFkcHQtPmlycS5pcnEsICZhZHB0LT5pcnEpOworCisJZW1hY19tYWNfcmVzZXQoYWRwdCk7CisKKwllbWFjX3R4X3FfZGVzY3NfZnJlZShhZHB0KTsKKwluZXRkZXZfcmVzZXRfcXVldWUoYWRwdC0+bmV0ZGV2KTsKKwllbWFjX3J4X3FfZnJlZV9kZXNjcyhhZHB0KTsKK30KKworLyogQ29uc3VtZSBuZXh0IHJlY2VpdmVkIHBhY2tldCBkZXNjcmlwdG9yICovCitzdGF0aWMgYm9vbCBlbWFjX3J4X3Byb2Nlc3NfcnJkKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQsCisJCQkJc3RydWN0IGVtYWNfcnhfcXVldWUgKnJ4X3EsCisJCQkJc3RydWN0IGVtYWNfcnJkICpycmQpCit7CisJdTMyICpod19ycmQgPSBFTUFDX1JSRChyeF9xLCBhZHB0LT5ycmRfc2l6ZSwgcnhfcS0+cnJkLmNvbnN1bWVfaWR4KTsKKworCXJyZC0+d29yZFszXSA9ICooaHdfcnJkICsgMyk7CisKKwlpZiAoIVJSRF9VUERUKHJyZCkpCisJCXJldHVybiBmYWxzZTsKKworCXJyZC0+d29yZFs0XSA9IDA7CisJcnJkLT53b3JkWzVdID0gMDsKKworCXJyZC0+d29yZFswXSA9ICooaHdfcnJkKyspOworCXJyZC0+d29yZFsxXSA9ICooaHdfcnJkKyspOworCXJyZC0+d29yZFsyXSA9ICooaHdfcnJkKyspOworCisJaWYgKHVubGlrZWx5KFJSRF9OT1IocnJkKSAhPSAxKSkgeworCQluZXRkZXZfZXJyKGFkcHQtPm5ldGRldiwKKwkJCSAgICJlcnJvcjogbXVsdGktUkZEIG5vdCBzdXBwb3J0IHlldCEgbm9yOiVsdVxuIiwKKwkJCSAgIFJSRF9OT1IocnJkKSk7CisJfQorCisJLyogbWFyayBycmQgYXMgcHJvY2Vzc2VkICovCisJUlJEX1VQRFRfU0VUKHJyZCwgMCk7CisJKmh3X3JyZCA9IHJyZC0+d29yZFszXTsKKworCWlmICgrK3J4X3EtPnJyZC5jb25zdW1lX2lkeCA9PSByeF9xLT5ycmQuY291bnQpCisJCXJ4X3EtPnJyZC5jb25zdW1lX2lkeCA9IDA7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyogUHJvZHVjZSBuZXcgdHJhbnNtaXQgZGVzY3JpcHRvciAqLworc3RhdGljIHZvaWQgZW1hY190eF90cGRfY3JlYXRlKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQsCisJCQkgICAgICAgc3RydWN0IGVtYWNfdHhfcXVldWUgKnR4X3EsIHN0cnVjdCBlbWFjX3RwZCAqdHBkKQoreworCXUzMiAqaHdfdHBkOworCisJdHhfcS0+dHBkLmxhc3RfcHJvZHVjZV9pZHggPSB0eF9xLT50cGQucHJvZHVjZV9pZHg7CisJaHdfdHBkID0gRU1BQ19UUEQodHhfcSwgYWRwdC0+dHBkX3NpemUsIHR4X3EtPnRwZC5wcm9kdWNlX2lkeCk7CisKKwlpZiAoKyt0eF9xLT50cGQucHJvZHVjZV9pZHggPT0gdHhfcS0+dHBkLmNvdW50KQorCQl0eF9xLT50cGQucHJvZHVjZV9pZHggPSAwOworCisJKihod190cGQrKykgPSB0cGQtPndvcmRbMF07CisJKihod190cGQrKykgPSB0cGQtPndvcmRbMV07CisJKihod190cGQrKykgPSB0cGQtPndvcmRbMl07CisJKmh3X3RwZCA9IHRwZC0+d29yZFszXTsKK30KKworLyogTWFyayB0aGUgbGFzdCB0cmFuc21pdCBkZXNjcmlwdG9yIGFzIHN1Y2ggKGZvciB0aGUgdHJhbnNtaXQgcGFja2V0KSAqLworc3RhdGljIHZvaWQgZW1hY190eF90cGRfbWFya19sYXN0KHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQsCisJCQkJICBzdHJ1Y3QgZW1hY190eF9xdWV1ZSAqdHhfcSkKK3sKKwl1MzIgKmh3X3RwZCA9CisJCUVNQUNfVFBEKHR4X3EsIGFkcHQtPnRwZF9zaXplLCB0eF9xLT50cGQubGFzdF9wcm9kdWNlX2lkeCk7CisJdTMyIHRtcF90cGQ7CisKKwl0bXBfdHBkID0gKihod190cGQgKyAxKTsKKwl0bXBfdHBkIHw9IEVNQUNfVFBEX0xBU1RfRlJBR01FTlQ7CisJKihod190cGQgKyAxKSA9IHRtcF90cGQ7Cit9CisKK3N0YXRpYyB2b2lkIGVtYWNfcnhfcmZkX2NsZWFuKHN0cnVjdCBlbWFjX3J4X3F1ZXVlICpyeF9xLCBzdHJ1Y3QgZW1hY19ycmQgKnJyZCkKK3sKKwlzdHJ1Y3QgZW1hY19idWZmZXIgKnJmYnVmID0gcnhfcS0+cmZkLnJmYnVmZjsKKwl1MzIgY29uc3VtZV9pZHggPSBSUkRfU0kocnJkKTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBSUkRfTk9SKHJyZCk7IGkrKykgeworCQlyZmJ1Zltjb25zdW1lX2lkeF0uc2tiID0gTlVMTDsKKwkJaWYgKCsrY29uc3VtZV9pZHggPT0gcnhfcS0+cmZkLmNvdW50KQorCQkJY29uc3VtZV9pZHggPSAwOworCX0KKworCXJ4X3EtPnJmZC5jb25zdW1lX2lkeCA9IGNvbnN1bWVfaWR4OworCXJ4X3EtPnJmZC5wcm9jZXNzX2lkeCA9IGNvbnN1bWVfaWR4OworfQorCisvKiBQdXNoIHRoZSByZWNlaXZlZCBza2IgdG8gdXBwZXIgbGF5ZXJzICovCitzdGF0aWMgdm9pZCBlbWFjX3JlY2VpdmVfc2tiKHN0cnVjdCBlbWFjX3J4X3F1ZXVlICpyeF9xLAorCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICB1MTYgdmxhbl90YWcsIGJvb2wgdmxhbl9mbGFnKQoreworCWlmICh2bGFuX2ZsYWcpIHsKKwkJdTE2IHZsYW47CisKKwkJRU1BQ19UQUdfVE9fVkxBTih2bGFuX3RhZywgdmxhbik7CisJCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCBodG9ucyhFVEhfUF84MDIxUSksIHZsYW4pOworCX0KKworCW5hcGlfZ3JvX3JlY2VpdmUoJnJ4X3EtPm5hcGksIHNrYik7Cit9CisKKy8qIFByb2Nlc3MgcmVjZWl2ZSBldmVudCAqLwordm9pZCBlbWFjX21hY19yeF9wcm9jZXNzKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQsIHN0cnVjdCBlbWFjX3J4X3F1ZXVlICpyeF9xLAorCQkJIGludCAqbnVtX3BrdHMsIGludCBtYXhfcGt0cykKK3sKKwl1MzIgcHJvY19pZHgsIGh3X2NvbnN1bWVfaWR4LCBudW1fY29uc3VtZV9wa3RzOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgID0gYWRwdC0+bmV0ZGV2OworCXN0cnVjdCBlbWFjX2J1ZmZlciAqcmZidWY7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKKwlzdHJ1Y3QgZW1hY19ycmQgcnJkOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTMyIHJlZzsKKworCXJlZyA9IHJlYWRsX3JlbGF4ZWQoYWRwdC0+YmFzZSArIHJ4X3EtPmNvbnN1bWVfcmVnKTsKKworCWh3X2NvbnN1bWVfaWR4ID0gKHJlZyAmIHJ4X3EtPmNvbnN1bWVfbWFzaykgPj4gcnhfcS0+Y29uc3VtZV9zaGlmdDsKKwludW1fY29uc3VtZV9wa3RzID0gKGh3X2NvbnN1bWVfaWR4ID49IHJ4X3EtPnJyZC5jb25zdW1lX2lkeCkgPworCQkoaHdfY29uc3VtZV9pZHggLSAgcnhfcS0+cnJkLmNvbnN1bWVfaWR4KSA6CisJCShod19jb25zdW1lX2lkeCArIHJ4X3EtPnJyZC5jb3VudCAtIHJ4X3EtPnJyZC5jb25zdW1lX2lkeCk7CisKKwlkbyB7CisJCWlmICghbnVtX2NvbnN1bWVfcGt0cykKKwkJCWJyZWFrOworCisJCWlmICghZW1hY19yeF9wcm9jZXNzX3JyZChhZHB0LCByeF9xLCAmcnJkKSkKKwkJCWJyZWFrOworCisJCWlmIChsaWtlbHkoUlJEX05PUigmcnJkKSA9PSAxKSkgeworCQkJLyogZ29vZCByZWNlaXZlICovCisJCQlyZmJ1ZiA9IEdFVF9SRkRfQlVGRkVSKHJ4X3EsIFJSRF9TSSgmcnJkKSk7CisJCQlkbWFfdW5tYXBfc2luZ2xlKGFkcHQtPm5ldGRldi0+ZGV2LnBhcmVudCwKKwkJCQkJIHJmYnVmLT5kbWFfYWRkciwgcmZidWYtPmxlbmd0aCwKKwkJCQkJIERNQV9GUk9NX0RFVklDRSk7CisJCQlyZmJ1Zi0+ZG1hX2FkZHIgPSAwOworCQkJc2tiID0gcmZidWYtPnNrYjsKKwkJfSBlbHNlIHsKKwkJCW5ldGRldl9lcnIoYWRwdC0+bmV0ZGV2LAorCQkJCSAgICJlcnJvcjogbXVsdGktUkZEIG5vdCBzdXBwb3J0IHlldCFcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJZW1hY19yeF9yZmRfY2xlYW4ocnhfcSwgJnJyZCk7CisJCW51bV9jb25zdW1lX3BrdHMtLTsKKwkJY291bnQrKzsKKworCQkvKiBEdWUgdG8gYSBIVyBpc3N1ZSBpbiBMNCBjaGVjayBzdW0gZGV0ZWN0aW9uIChVRFAvVENQIGZyYWdzCisJCSAqIHdpdGggREYgc2V0IGFyZSBtYXJrZWQgYXMgZXJyb3IpLCBkcm9wIHBhY2tldHMgYmFzZWQgb24gdGhlCisJCSAqIGVycm9yIG1hc2sgcmF0aGVyIHRoYW4gdGhlIHN1bW1hcnkgYml0IChpZ25vcmluZyBMNEYgZXJyb3JzKQorCQkgKi8KKwkJaWYgKHJyZC53b3JkW0VNQUNfUlJEX1NUQVRTX0RXX0lEWF0gJiBFTUFDX1JSRF9FUlJPUikgeworCQkJbmV0aWZfZGJnKGFkcHQsIHJ4X3N0YXR1cywgYWRwdC0+bmV0ZGV2LAorCQkJCSAgIkRyb3AgZXJyb3IgcGFja2V0W1JSRDogMHgleDoweCV4OjB4JXg6MHgleF1cbiIsCisJCQkJICBycmQud29yZFswXSwgcnJkLndvcmRbMV0sCisJCQkJICBycmQud29yZFsyXSwgcnJkLndvcmRbM10pOworCisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQljb250aW51ZTsKKwkJfQorCisJCXNrYl9wdXQoc2tiLCBSUkRfUEtUX1NJWkUoJnJyZCkgLSBFVEhfRkNTX0xFTik7CisJCXNrYi0+ZGV2ID0gbmV0ZGV2OworCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBza2ItPmRldik7CisJCWlmIChuZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9SWENTVU0pCisJCQlza2ItPmlwX3N1bW1lZCA9IFJSRF9MNEYoJnJyZCkgPworCQkJCQkgIENIRUNLU1VNX05PTkUgOiBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJZWxzZQorCQkJc2tiX2NoZWNrc3VtX25vbmVfYXNzZXJ0KHNrYik7CisKKwkJZW1hY19yZWNlaXZlX3NrYihyeF9xLCBza2IsICh1MTYpUlJEX0NWQUxOX1RBRygmcnJkKSwKKwkJCQkgKGJvb2wpUlJEX0NWVEFHKCZycmQpKTsKKworCQluZXRkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkoKm51bV9wa3RzKSsrOworCX0gd2hpbGUgKCpudW1fcGt0cyA8IG1heF9wa3RzKTsKKworCWlmIChjb3VudCkgeworCQlwcm9jX2lkeCA9IChyeF9xLT5yZmQucHJvY2Vzc19pZHggPDwgcnhfcS0+cHJvY2Vzc19zaGZ0KSAmCisJCQkJcnhfcS0+cHJvY2Vzc19tYXNrOworCQllbWFjX3JlZ191cGRhdGUzMihhZHB0LT5iYXNlICsgcnhfcS0+cHJvY2Vzc19yZWcsCisJCQkJICByeF9xLT5wcm9jZXNzX21hc2ssIHByb2NfaWR4KTsKKwkJZW1hY19tYWNfcnhfZGVzY3NfcmVmaWxsKGFkcHQsIHJ4X3EpOworCX0KK30KKworLyogZ2V0IHRoZSBudW1iZXIgb2YgZnJlZSB0cmFuc21pdCBkZXNjcmlwdG9ycyAqLworc3RhdGljIHVuc2lnbmVkIGludCBlbWFjX3RwZF9udW1fZnJlZV9kZXNjcyhzdHJ1Y3QgZW1hY190eF9xdWV1ZSAqdHhfcSkKK3sKKwl1MzIgcHJvZHVjZV9pZHggPSB0eF9xLT50cGQucHJvZHVjZV9pZHg7CisJdTMyIGNvbnN1bWVfaWR4ID0gdHhfcS0+dHBkLmNvbnN1bWVfaWR4OworCisJcmV0dXJuIChjb25zdW1lX2lkeCA+IHByb2R1Y2VfaWR4KSA/CisJCShjb25zdW1lX2lkeCAtIHByb2R1Y2VfaWR4IC0gMSkgOgorCQkodHhfcS0+dHBkLmNvdW50ICsgY29uc3VtZV9pZHggLSBwcm9kdWNlX2lkeCAtIDEpOworfQorCisvKiBQcm9jZXNzIHRyYW5zbWl0IGV2ZW50ICovCit2b2lkIGVtYWNfbWFjX3R4X3Byb2Nlc3Moc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCwgc3RydWN0IGVtYWNfdHhfcXVldWUgKnR4X3EpCit7CisJdTMyIHJlZyA9IHJlYWRsX3JlbGF4ZWQoYWRwdC0+YmFzZSArIHR4X3EtPmNvbnN1bWVfcmVnKTsKKwl1MzIgaHdfY29uc3VtZV9pZHgsIHBrdHNfY29tcGwgPSAwLCBieXRlc19jb21wbCA9IDA7CisJc3RydWN0IGVtYWNfYnVmZmVyICp0cGJ1ZjsKKworCWh3X2NvbnN1bWVfaWR4ID0gKHJlZyAmIHR4X3EtPmNvbnN1bWVfbWFzaykgPj4gdHhfcS0+Y29uc3VtZV9zaGlmdDsKKworCXdoaWxlICh0eF9xLT50cGQuY29uc3VtZV9pZHggIT0gaHdfY29uc3VtZV9pZHgpIHsKKwkJdHBidWYgPSBHRVRfVFBEX0JVRkZFUih0eF9xLCB0eF9xLT50cGQuY29uc3VtZV9pZHgpOworCQlpZiAodHBidWYtPmRtYV9hZGRyKSB7CisJCQlkbWFfdW5tYXBfc2luZ2xlKGFkcHQtPm5ldGRldi0+ZGV2LnBhcmVudCwKKwkJCQkJIHRwYnVmLT5kbWFfYWRkciwgdHBidWYtPmxlbmd0aCwKKwkJCQkJIERNQV9UT19ERVZJQ0UpOworCQkJdHBidWYtPmRtYV9hZGRyID0gMDsKKwkJfQorCisJCWlmICh0cGJ1Zi0+c2tiKSB7CisJCQlwa3RzX2NvbXBsKys7CisJCQlieXRlc19jb21wbCArPSB0cGJ1Zi0+c2tiLT5sZW47CisJCQlkZXZfa2ZyZWVfc2tiX2lycSh0cGJ1Zi0+c2tiKTsKKwkJCXRwYnVmLT5za2IgPSBOVUxMOworCQl9CisKKwkJaWYgKCsrdHhfcS0+dHBkLmNvbnN1bWVfaWR4ID09IHR4X3EtPnRwZC5jb3VudCkKKwkJCXR4X3EtPnRwZC5jb25zdW1lX2lkeCA9IDA7CisJfQorCisJbmV0ZGV2X2NvbXBsZXRlZF9xdWV1ZShhZHB0LT5uZXRkZXYsIHBrdHNfY29tcGwsIGJ5dGVzX2NvbXBsKTsKKworCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGFkcHQtPm5ldGRldikpCisJCWlmIChlbWFjX3RwZF9udW1fZnJlZV9kZXNjcyh0eF9xKSA+IChNQVhfU0tCX0ZSQUdTICsgMSkpCisJCQluZXRpZl93YWtlX3F1ZXVlKGFkcHQtPm5ldGRldik7Cit9CisKKy8qIEluaXRpYWxpemUgYWxsIHF1ZXVlIGRhdGEgc3RydWN0dXJlcyAqLwordm9pZCBlbWFjX21hY19yeF90eF9yaW5nX2luaXRfYWxsKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJICBzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCWFkcHQtPnJ4X3EubmV0ZGV2ID0gYWRwdC0+bmV0ZGV2OworCisJYWRwdC0+cnhfcS5wcm9kdWNlX3JlZyAgPSBFTUFDX01BSUxCT1hfMDsKKwlhZHB0LT5yeF9xLnByb2R1Y2VfbWFzayA9IFJGRDBfUFJPRF9JRFhfQk1TSzsKKwlhZHB0LT5yeF9xLnByb2R1Y2Vfc2hpZnQgPSBSRkQwX1BST0RfSURYX1NIRlQ7CisKKwlhZHB0LT5yeF9xLnByb2Nlc3NfcmVnICA9IEVNQUNfTUFJTEJPWF8wOworCWFkcHQtPnJ4X3EucHJvY2Vzc19tYXNrID0gUkZEMF9QUk9DX0lEWF9CTVNLOworCWFkcHQtPnJ4X3EucHJvY2Vzc19zaGZ0ID0gUkZEMF9QUk9DX0lEWF9TSEZUOworCisJYWRwdC0+cnhfcS5jb25zdW1lX3JlZyAgPSBFTUFDX01BSUxCT1hfMzsKKwlhZHB0LT5yeF9xLmNvbnN1bWVfbWFzayA9IFJGRDBfQ09OU19JRFhfQk1TSzsKKwlhZHB0LT5yeF9xLmNvbnN1bWVfc2hpZnQgPSBSRkQwX0NPTlNfSURYX1NIRlQ7CisKKwlhZHB0LT5yeF9xLmlycSAgICAgICAgICA9ICZhZHB0LT5pcnE7CisJYWRwdC0+cnhfcS5pbnRyICAgICAgICAgPSBhZHB0LT5pcnEubWFzayAmIElTUl9SWF9QS1Q7CisKKwlhZHB0LT50eF9xLnByb2R1Y2VfcmVnICA9IEVNQUNfTUFJTEJPWF8xNTsKKwlhZHB0LT50eF9xLnByb2R1Y2VfbWFzayA9IE5UUERfUFJPRF9JRFhfQk1TSzsKKwlhZHB0LT50eF9xLnByb2R1Y2Vfc2hpZnQgPSBOVFBEX1BST0RfSURYX1NIRlQ7CisKKwlhZHB0LT50eF9xLmNvbnN1bWVfcmVnICA9IEVNQUNfTUFJTEJPWF8yOworCWFkcHQtPnR4X3EuY29uc3VtZV9tYXNrID0gTlRQRF9DT05TX0lEWF9CTVNLOworCWFkcHQtPnR4X3EuY29uc3VtZV9zaGlmdCA9IE5UUERfQ09OU19JRFhfU0hGVDsKK30KKworLyogRmlsbCB1cCB0cmFuc21pdCBkZXNjcmlwdG9ycyB3aXRoIFRTTyBhbmQgQ2hlY2tzdW0gb2ZmbG9hZCBpbmZvcm1hdGlvbiAqLworc3RhdGljIGludCBlbWFjX3Rzb19jc3VtKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQsCisJCQkgc3RydWN0IGVtYWNfdHhfcXVldWUgKnR4X3EsCisJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSBzdHJ1Y3QgZW1hY190cGQgKnRwZCkKK3sKKwl1bnNpZ25lZCBpbnQgaGRyX2xlbjsKKwlpbnQgcmV0OworCisJaWYgKHNrYl9pc19nc28oc2tiKSkgeworCQlpZiAoc2tiX2hlYWRlcl9jbG9uZWQoc2tiKSkgeworCQkJcmV0ID0gcHNrYl9leHBhbmRfaGVhZChza2IsIDAsIDAsIEdGUF9BVE9NSUMpOworCQkJaWYgKHVubGlrZWx5KHJldCkpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkgeworCQkJdTMyIHBrdF9sZW4gPSAoKHVuc2lnbmVkIGNoYXIgKilpcF9oZHIoc2tiKSAtIHNrYi0+ZGF0YSkKKwkJCQkgICAgICAgKyBudG9ocyhpcF9oZHIoc2tiKS0+dG90X2xlbik7CisJCQlpZiAoc2tiLT5sZW4gPiBwa3RfbGVuKQorCQkJCXBza2JfdHJpbShza2IsIHBrdF9sZW4pOworCQl9CisKKwkJaGRyX2xlbiA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgKyB0Y3BfaGRybGVuKHNrYik7CisJCWlmICh1bmxpa2VseShza2ItPmxlbiA9PSBoZHJfbGVuKSkgeworCQkJLyogd2Ugb25seSBuZWVkIHRvIGRvIGNzdW0gKi8KKwkJCW5ldGlmX3dhcm4oYWRwdCwgdHhfZXJyLCBhZHB0LT5uZXRkZXYsCisJCQkJICAgInRzbyBub3QgbmVlZGVkIGZvciBwYWNrZXQgd2l0aCAwIGRhdGFcbiIpOworCQkJZ290byBkb19jc3VtOworCQl9CisKKwkJaWYgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUgJiBTS0JfR1NPX1RDUFY0KSB7CisJCQlpcF9oZHIoc2tiKS0+Y2hlY2sgPSAwOworCQkJdGNwX2hkcihza2IpLT5jaGVjayA9CisJCQkJfmNzdW1fdGNwdWRwX21hZ2ljKGlwX2hkcihza2IpLT5zYWRkciwKKwkJCQkJCSAgIGlwX2hkcihza2IpLT5kYWRkciwKKwkJCQkJCSAgIDAsIElQUFJPVE9fVENQLCAwKTsKKwkJCVRQRF9JUFY0X1NFVCh0cGQsIDEpOworCQl9CisKKwkJaWYgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUgJiBTS0JfR1NPX1RDUFY2KSB7CisJCQkvKiBpcHY2IHRzbyBuZWVkIGFuIGV4dHJhIHRwZCAqLworCQkJc3RydWN0IGVtYWNfdHBkIGV4dHJhX3RwZDsKKworCQkJbWVtc2V0KHRwZCwgMCwgc2l6ZW9mKCp0cGQpKTsKKwkJCW1lbXNldCgmZXh0cmFfdHBkLCAwLCBzaXplb2YoZXh0cmFfdHBkKSk7CisKKwkJCWlwdjZfaGRyKHNrYiktPnBheWxvYWRfbGVuID0gMDsKKwkJCXRjcF9oZHIoc2tiKS0+Y2hlY2sgPQorCQkJCX5jc3VtX2lwdjZfbWFnaWMoJmlwdjZfaGRyKHNrYiktPnNhZGRyLAorCQkJCQkJICZpcHY2X2hkcihza2IpLT5kYWRkciwKKwkJCQkJCSAwLCBJUFBST1RPX1RDUCwgMCk7CisJCQlUUERfUEtUX0xFTl9TRVQoJmV4dHJhX3RwZCwgc2tiLT5sZW4pOworCQkJVFBEX0xTT19TRVQoJmV4dHJhX3RwZCwgMSk7CisJCQlUUERfTFNPVl9TRVQoJmV4dHJhX3RwZCwgMSk7CisJCQllbWFjX3R4X3RwZF9jcmVhdGUoYWRwdCwgdHhfcSwgJmV4dHJhX3RwZCk7CisJCQlUUERfTFNPVl9TRVQodHBkLCAxKTsKKwkJfQorCisJCVRQRF9MU09fU0VUKHRwZCwgMSk7CisJCVRQRF9UQ1BIRFJfT0ZGU0VUX1NFVCh0cGQsIHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikpOworCQlUUERfTVNTX1NFVCh0cGQsIHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpOworCQlyZXR1cm4gMDsKKwl9CisKK2RvX2NzdW06CisJaWYgKGxpa2VseShza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSkgeworCQl1bnNpZ25lZCBpbnQgY3NzLCBjc287CisKKwkJY3NvID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKTsKKwkJaWYgKHVubGlrZWx5KGNzbyAmIDB4MSkpIHsKKwkJCW5ldGRldl9lcnIoYWRwdC0+bmV0ZGV2LAorCQkJCSAgICJlcnJvcjogcGF5bG9hZCBvZmZzZXQgc2hvdWxkIGJlIGV2ZW5cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJY3NzID0gY3NvICsgc2tiLT5jc3VtX29mZnNldDsKKworCQlUUERfUEFZTE9BRF9PRkZTRVRfU0VUKHRwZCwgY3NvID4+IDEpOworCQlUUERfQ1hTVU1fT0ZGU0VUX1NFVCh0cGQsIGNzcyA+PiAxKTsKKwkJVFBEX0NTWF9TRVQodHBkLCAxKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogRmlsbCB1cCB0cmFuc21pdCBkZXNjcmlwdG9ycyAqLworc3RhdGljIHZvaWQgZW1hY190eF9maWxsX3RwZChzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0LAorCQkJICAgICBzdHJ1Y3QgZW1hY190eF9xdWV1ZSAqdHhfcSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgc3RydWN0IGVtYWNfdHBkICp0cGQpCit7CisJdW5zaWduZWQgaW50IG5yX2ZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwl1bnNpZ25lZCBpbnQgZmlyc3QgPSB0eF9xLT50cGQucHJvZHVjZV9pZHg7CisJdW5zaWduZWQgaW50IGxlbiA9IHNrYl9oZWFkbGVuKHNrYik7CisJc3RydWN0IGVtYWNfYnVmZmVyICp0cGJ1ZiA9IE5VTEw7CisJdW5zaWduZWQgaW50IG1hcHBlZF9sZW4gPSAwOworCXVuc2lnbmVkIGludCBpOworCWludCBjb3VudCA9IDA7CisJaW50IHJldDsKKworCS8qIGlmIExhcmdlIFNlZ21lbnQgT2ZmbG9hZCBpcyAoaW4gVENQIFNlZ21lbnRhdGlvbiBPZmZsb2FkIHN0cnVjdCkgKi8KKwlpZiAoVFBEX0xTTyh0cGQpKSB7CisJCW1hcHBlZF9sZW4gPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpICsgdGNwX2hkcmxlbihza2IpOworCisJCXRwYnVmID0gR0VUX1RQRF9CVUZGRVIodHhfcSwgdHhfcS0+dHBkLnByb2R1Y2VfaWR4KTsKKwkJdHBidWYtPmxlbmd0aCA9IG1hcHBlZF9sZW47CisJCXRwYnVmLT5kbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGFkcHQtPm5ldGRldi0+ZGV2LnBhcmVudCwKKwkJCQkJCSBza2ItPmRhdGEsIHRwYnVmLT5sZW5ndGgsCisJCQkJCQkgRE1BX1RPX0RFVklDRSk7CisJCXJldCA9IGRtYV9tYXBwaW5nX2Vycm9yKGFkcHQtPm5ldGRldi0+ZGV2LnBhcmVudCwKKwkJCQkJdHBidWYtPmRtYV9hZGRyKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJVFBEX0JVRkZFUl9BRERSX0xfU0VUKHRwZCwgbG93ZXJfMzJfYml0cyh0cGJ1Zi0+ZG1hX2FkZHIpKTsKKwkJVFBEX0JVRkZFUl9BRERSX0hfU0VUKHRwZCwgdXBwZXJfMzJfYml0cyh0cGJ1Zi0+ZG1hX2FkZHIpKTsKKwkJVFBEX0JVRl9MRU5fU0VUKHRwZCwgdHBidWYtPmxlbmd0aCk7CisJCWVtYWNfdHhfdHBkX2NyZWF0ZShhZHB0LCB0eF9xLCB0cGQpOworCQljb3VudCsrOworCX0KKworCWlmIChtYXBwZWRfbGVuIDwgbGVuKSB7CisJCXRwYnVmID0gR0VUX1RQRF9CVUZGRVIodHhfcSwgdHhfcS0+dHBkLnByb2R1Y2VfaWR4KTsKKwkJdHBidWYtPmxlbmd0aCA9IGxlbiAtIG1hcHBlZF9sZW47CisJCXRwYnVmLT5kbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGFkcHQtPm5ldGRldi0+ZGV2LnBhcmVudCwKKwkJCQkJCSBza2ItPmRhdGEgKyBtYXBwZWRfbGVuLAorCQkJCQkJIHRwYnVmLT5sZW5ndGgsIERNQV9UT19ERVZJQ0UpOworCQlyZXQgPSBkbWFfbWFwcGluZ19lcnJvcihhZHB0LT5uZXRkZXYtPmRldi5wYXJlbnQsCisJCQkJCXRwYnVmLT5kbWFfYWRkcik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCisJCVRQRF9CVUZGRVJfQUREUl9MX1NFVCh0cGQsIGxvd2VyXzMyX2JpdHModHBidWYtPmRtYV9hZGRyKSk7CisJCVRQRF9CVUZGRVJfQUREUl9IX1NFVCh0cGQsIHVwcGVyXzMyX2JpdHModHBidWYtPmRtYV9hZGRyKSk7CisJCVRQRF9CVUZfTEVOX1NFVCh0cGQsIHRwYnVmLT5sZW5ndGgpOworCQllbWFjX3R4X3RwZF9jcmVhdGUoYWRwdCwgdHhfcSwgdHBkKTsKKwkJY291bnQrKzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfZnJhZ3M7IGkrKykgeworCQlzdHJ1Y3Qgc2tiX2ZyYWdfc3RydWN0ICpmcmFnOworCisJCWZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKKworCQl0cGJ1ZiA9IEdFVF9UUERfQlVGRkVSKHR4X3EsIHR4X3EtPnRwZC5wcm9kdWNlX2lkeCk7CisJCXRwYnVmLT5sZW5ndGggPSBmcmFnLT5zaXplOworCQl0cGJ1Zi0+ZG1hX2FkZHIgPSBkbWFfbWFwX3BhZ2UoYWRwdC0+bmV0ZGV2LT5kZXYucGFyZW50LAorCQkJCQkgICAgICAgZnJhZy0+cGFnZS5wLCBmcmFnLT5wYWdlX29mZnNldCwKKwkJCQkJICAgICAgIHRwYnVmLT5sZW5ndGgsIERNQV9UT19ERVZJQ0UpOworCQlyZXQgPSBkbWFfbWFwcGluZ19lcnJvcihhZHB0LT5uZXRkZXYtPmRldi5wYXJlbnQsCisJCQkJCXRwYnVmLT5kbWFfYWRkcik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCisJCVRQRF9CVUZGRVJfQUREUl9MX1NFVCh0cGQsIGxvd2VyXzMyX2JpdHModHBidWYtPmRtYV9hZGRyKSk7CisJCVRQRF9CVUZGRVJfQUREUl9IX1NFVCh0cGQsIHVwcGVyXzMyX2JpdHModHBidWYtPmRtYV9hZGRyKSk7CisJCVRQRF9CVUZfTEVOX1NFVCh0cGQsIHRwYnVmLT5sZW5ndGgpOworCQllbWFjX3R4X3RwZF9jcmVhdGUoYWRwdCwgdHhfcSwgdHBkKTsKKwkJY291bnQrKzsKKwl9CisKKwkvKiBUaGUgbGFzdCB0cGQgKi8KKwl3bWIoKTsKKwllbWFjX3R4X3RwZF9tYXJrX2xhc3QoYWRwdCwgdHhfcSk7CisKKwkvKiBUaGUgbGFzdCBidWZmZXIgaW5mbyBjb250YWluIHRoZSBza2IgYWRkcmVzcywKKwkgKiBzbyBpdCB3aWxsIGJlIGZyZWVkIGFmdGVyIHVubWFwCisJICovCisJdHBidWYtPnNrYiA9IHNrYjsKKworCXJldHVybjsKKworZXJyb3I6CisJLyogT25lIG9mIHRoZSBtZW1vcnkgbWFwcGluZ3MgZmFpbGVkLCBzbyB1bmRvIGV2ZXJ5dGhpbmcgKi8KKwl0eF9xLT50cGQucHJvZHVjZV9pZHggPSBmaXJzdDsKKworCXdoaWxlIChjb3VudC0tKSB7CisJCXRwYnVmID0gR0VUX1RQRF9CVUZGRVIodHhfcSwgZmlyc3QpOworCQlkbWFfdW5tYXBfcGFnZShhZHB0LT5uZXRkZXYtPmRldi5wYXJlbnQsIHRwYnVmLT5kbWFfYWRkciwKKwkJCSAgICAgICB0cGJ1Zi0+bGVuZ3RoLCBETUFfVE9fREVWSUNFKTsKKwkJdHBidWYtPmRtYV9hZGRyID0gMDsKKwkJdHBidWYtPmxlbmd0aCA9IDA7CisKKwkJaWYgKCsrZmlyc3QgPT0gdHhfcS0+dHBkLmNvdW50KQorCQkJZmlyc3QgPSAwOworCX0KKworCWRldl9rZnJlZV9za2Ioc2tiKTsKK30KKworLyogVHJhbnNtaXQgdGhlIHBhY2tldCB1c2luZyBzcGVjaWZpZWQgdHJhbnNtaXQgcXVldWUgKi8KK2ludCBlbWFjX21hY190eF9idWZfc2VuZChzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0LCBzdHJ1Y3QgZW1hY190eF9xdWV1ZSAqdHhfcSwKKwkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBlbWFjX3RwZCB0cGQ7CisJdTMyIHByb2RfaWR4OworCisJbWVtc2V0KCZ0cGQsIDAsIHNpemVvZih0cGQpKTsKKworCWlmIChlbWFjX3Rzb19jc3VtKGFkcHQsIHR4X3EsIHNrYiwgJnRwZCkgIT0gMCkgeworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlyZXR1cm4gTkVUREVWX1RYX09LOworCX0KKworCWlmIChza2Jfdmxhbl90YWdfcHJlc2VudChza2IpKSB7CisJCXUxNiB0YWc7CisKKwkJRU1BQ19WTEFOX1RPX1RBRyhza2Jfdmxhbl90YWdfZ2V0KHNrYiksIHRhZyk7CisJCVRQRF9DVkxBTl9UQUdfU0VUKCZ0cGQsIHRhZyk7CisJCVRQRF9JTlNUQ19TRVQoJnRwZCwgMSk7CisJfQorCisJaWYgKHNrYl9uZXR3b3JrX29mZnNldChza2IpICE9IEVUSF9ITEVOKQorCQlUUERfVFlQX1NFVCgmdHBkLCAxKTsKKworCWVtYWNfdHhfZmlsbF90cGQoYWRwdCwgdHhfcSwgc2tiLCAmdHBkKTsKKworCW5ldGRldl9zZW50X3F1ZXVlKGFkcHQtPm5ldGRldiwgc2tiLT5sZW4pOworCisJLyogTWFrZSBzdXJlIHRoZSBhcmUgZW5vdWdoIGZyZWUgZGVzY3JpcHRvcnMgdG8gaG9sZCBvbmUKKwkgKiBtYXhpbXVtLXNpemVkIFNLQi4gIFdlIG5lZWQgb25lIGRlc2MgZm9yIGVhY2ggZnJhZ21lbnQsCisJICogb25lIGZvciB0aGUgY2hlY2tzdW0gKGVtYWNfdHNvX2NzdW0pLCBvbmUgZm9yIFRTTywgYW5kCisJICogYW5kIG9uZSBmb3IgdGhlIFNLQiBoZWFkZXIuCisJICovCisJaWYgKGVtYWNfdHBkX251bV9mcmVlX2Rlc2NzKHR4X3EpIDwgKE1BWF9TS0JfRlJBR1MgKyAzKSkKKwkJbmV0aWZfc3RvcF9xdWV1ZShhZHB0LT5uZXRkZXYpOworCisJLyogdXBkYXRlIHByb2R1Y2UgaWR4ICovCisJcHJvZF9pZHggPSAodHhfcS0+dHBkLnByb2R1Y2VfaWR4IDw8IHR4X3EtPnByb2R1Y2Vfc2hpZnQpICYKKwkJICAgIHR4X3EtPnByb2R1Y2VfbWFzazsKKwllbWFjX3JlZ191cGRhdGUzMihhZHB0LT5iYXNlICsgdHhfcS0+cHJvZHVjZV9yZWcsCisJCQkgIHR4X3EtPnByb2R1Y2VfbWFzaywgcHJvZF9pZHgpOworCisJcmV0dXJuIE5FVERFVl9UWF9PSzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL2VtYWMvZW1hYy1tYWMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL2VtYWMvZW1hYy1tYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2FhMjRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy9lbWFjLW1hYy5oCkBAIC0wLDAgKzEsMjQ4IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKiBFTUFDIERNQSBIVyBlbmdpbmUgdXNlcyB0aHJlZSByaW5nczoKKyAqIFR4OgorICogICBUUEQ6IFRyYW5zbWl0IFBhY2tldCBEZXNjcmlwdG9yIHJpbmcuCisgKiBSeDoKKyAqICAgUkZEOiBSZWNlaXZlIEZyZWUgRGVzY3JpcHRvciByaW5nLgorICogICAgIFJpbmcgb2YgZGVzY3JpcHRvcnMgd2l0aCBlbXB0eSBidWZmZXJzIHRvIGJlIGZpbGxlZCBieSBSeCBIVy4KKyAqICAgUlJEOiBSZWNlaXZlIFJldHVybiBEZXNjcmlwdG9yIHJpbmcuCisgKiAgICAgUmluZyBvZiBkZXNjcmlwdG9ycyB3aXRoIGJ1ZmZlcnMgZmlsbGVkIHdpdGggcmVjZWl2ZWQgZGF0YS4KKyAqLworCisjaWZuZGVmIF9FTUFDX0hXX0hfCisjZGVmaW5lIF9FTUFDX0hXX0hfCisKKy8qIEVNQUNfQ1NSIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgRU1BQ19FTUFDX1dSQVBQRVJfQ1NSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAKKyNkZWZpbmUgRU1BQ19FTUFDX1dSQVBQRVJfQ1NSMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQKKyNkZWZpbmUgRU1BQ19FTUFDX1dSQVBQRVJfVFhfVFNfTE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDQKKyNkZWZpbmUgRU1BQ19FTUFDX1dSQVBQRVJfVFhfVFNfSEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDgKKyNkZWZpbmUgRU1BQ19FTUFDX1dSQVBQRVJfVFhfVFNfSU5YICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMGMKKworLyogRE1BIE9yZGVyIFNldHRpbmdzICovCitlbnVtIGVtYWNfZG1hX29yZGVyIHsKKwllbWFjX2RtYV9vcmRfaW4gPSAxLAorCWVtYWNfZG1hX29yZF9lbmggPSAyLAorCWVtYWNfZG1hX29yZF9vdXQgPSA0Cit9OworCitlbnVtIGVtYWNfZG1hX3JlcV9ibG9jayB7CisJZW1hY19kbWFfcmVxXzEyOCA9IDAsCisJZW1hY19kbWFfcmVxXzI1NiA9IDEsCisJZW1hY19kbWFfcmVxXzUxMiA9IDIsCisJZW1hY19kbWFfcmVxXzEwMjQgPSAzLAorCWVtYWNfZG1hX3JlcV8yMDQ4ID0gNCwKKwllbWFjX2RtYV9yZXFfNDA5NiA9IDUKK307CisKKy8qIFJldHVybnMgdGhlIHZhbHVlIG9mIGJpdHMgaWR4Li4uaWR4K25fYml0cyAqLworI2RlZmluZSBCSVRTX0dFVCh2YWwsIGxvLCBoaSkgKChsZTMyX3RvX2NwdSh2YWwpICYgR0VOTUFTSygoaGkpLCAobG8pKSkgPj4gbG8pCisjZGVmaW5lIEJJVFNfU0VUKHZhbCwgbG8sIGhpLCBuZXdfdmFsKSBcCisJdmFsID0gY3B1X3RvX2xlMzIoKGxlMzJfdG9fY3B1KHZhbCkgJiAofkdFTk1BU0soKGhpKSwgKGxvKSkpKSB8CVwKKwkJKCgobmV3X3ZhbCkgPDwgKGxvKSkgJiBHRU5NQVNLKChoaSksIChsbykpKSkKKworLyogUlJEIChSZWNlaXZlIFJldHVybiBEZXNjcmlwdG9yKSAqLworc3RydWN0IGVtYWNfcnJkIHsKKwl1MzIJd29yZFs2XTsKKworLyogbnVtYmVyIG9mIFJGRCAqLworI2RlZmluZSBSUkRfTk9SKHJyZCkJCQlCSVRTX0dFVCgocnJkKS0+d29yZFswXSwgMTYsIDE5KQorLyogc3RhcnQgY29uc3VtZXIgaW5kZXggb2YgcmZkLXJpbmcgKi8KKyNkZWZpbmUgUlJEX1NJKHJyZCkJCQlCSVRTX0dFVCgocnJkKS0+d29yZFswXSwgMjAsIDMxKQorLyogdmxhbi10YWcgKENWSUQsIENGSSBhbmQgUFJJKSAqLworI2RlZmluZSBSUkRfQ1ZBTE5fVEFHKHJyZCkJCUJJVFNfR0VUKChycmQpLT53b3JkWzJdLCAwLCAxNSkKKy8qIGxlbmd0aCBvZiB0aGUgcGFja2V0ICovCisjZGVmaW5lIFJSRF9QS1RfU0laRShycmQpCQlCSVRTX0dFVCgocnJkKS0+d29yZFszXSwgMCwgMTMpCisvKiBMNChUQ1AvVURQKSBjaGVja3N1bSBmYWlsZWQgKi8KKyNkZWZpbmUgUlJEX0w0RihycmQpCQkJQklUU19HRVQoKHJyZCktPndvcmRbM10sIDE0LCAxNCkKKy8qIHZsYW4gdGFnZ2VkICovCisjZGVmaW5lIFJSRF9DVlRBRyhycmQpCQkJQklUU19HRVQoKHJyZCktPndvcmRbM10sIDE2LCAxNikKKy8qIFdoZW4gc2V0LCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVzY3JpcHRvciBpcyB1cGRhdGVkIGJ5IHRoZSBJUCBjb3JlLgorICogV2hlbiBjbGVhcmVkLCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVzY3JpcHRvciBpcyBpbnZhbGlkLgorICovCisjZGVmaW5lIFJSRF9VUERUKHJyZCkJCQlCSVRTX0dFVCgocnJkKS0+d29yZFszXSwgMzEsIDMxKQorI2RlZmluZSBSUkRfVVBEVF9TRVQocnJkLCB2YWwpCQlCSVRTX1NFVCgocnJkKS0+d29yZFszXSwgMzEsIDMxLCB2YWwpCisvKiB0aW1lc3RhbXAgbG93ICovCisjZGVmaW5lIFJSRF9UU19MT1cocnJkKQkJCUJJVFNfR0VUKChycmQpLT53b3JkWzRdLCAwLCAyOSkKKy8qIHRpbWVzdGFtcCBoaWdoICovCisjZGVmaW5lIFJSRF9UU19ISShycmQpCQkJbGUzMl90b19jcHUoKHJyZCktPndvcmRbNV0pCit9OworCisvKiBUUEQgKFRyYW5zbWl0IFBhY2tldCBEZXNjcmlwdG9yKSAqLworc3RydWN0IGVtYWNfdHBkIHsKKwl1MzIJCQkJd29yZFs0XTsKKworLyogTnVtYmVyIG9mIGJ5dGVzIG9mIHRoZSB0cmFuc21pdCBwYWNrZXQuIChpbmNsdWRlIDQtYnl0ZSBDUkMpICovCisjZGVmaW5lIFRQRF9CVUZfTEVOX1NFVCh0cGQsIHZhbCkJQklUU19TRVQoKHRwZCktPndvcmRbMF0sIDAsIDE1LCB2YWwpCisvKiBDdXN0b20gQ2hlY2tzdW0gT2ZmbG9hZDogV2hlbiBzZXQsIGFzayBJUCBjb3JlIHRvIG9mZmxvYWQgY3VzdG9tIGNoZWNrc3VtICovCisjZGVmaW5lIFRQRF9DU1hfU0VUKHRwZCwgdmFsKQkJQklUU19TRVQoKHRwZCktPndvcmRbMV0sIDgsIDgsIHZhbCkKKy8qIFRDUCBMYXJnZSBTZW5kIE9mZmxvYWQ6IFdoZW4gc2V0LCBhc2sgSVAgY29yZSB0byBkbyBvZmZsb2FkIFRDUCBMYXJnZSBTZW5kICovCisjZGVmaW5lIFRQRF9MU08odHBkKQkJCUJJVFNfR0VUKCh0cGQpLT53b3JkWzFdLCAxMiwgMTIpCisjZGVmaW5lIFRQRF9MU09fU0VUKHRwZCwgdmFsKQkJQklUU19TRVQoKHRwZCktPndvcmRbMV0sIDEyLCAxMiwgdmFsKQorLyogIExhcmdlIFNlbmQgT2ZmbG9hZCBWZXJzaW9uOiBXaGVuIHNldCwgaW5kaWNhdGVzIHRoaXMgaXMgYW4gTFNPdjIKKyAqIChmb3IgYm90aCBJUHY0IGFuZCBJUHY2KS4gV2hlbiBjbGVhcmVkLCBpbmRpY2F0ZXMgdGhpcyBpcyBhbiBMU092MQorICogKG9ubHkgZm9yIElQdjQpLgorICovCisjZGVmaW5lIFRQRF9MU09WX1NFVCh0cGQsIHZhbCkJCUJJVFNfU0VUKCh0cGQpLT53b3JkWzFdLCAxMywgMTMsIHZhbCkKKy8qIElQdjQgcGFja2V0OiBXaGVuIHNldCwgaW5kaWNhdGVzIHRoaXMgaXMgYW4gIElQdjQgcGFja2V0LCB0aGlzIGJpdCBpcyBvbmx5CisgKiBmb3IgTFNPVjIgZm9ybWF0LgorICovCisjZGVmaW5lIFRQRF9JUFY0X1NFVCh0cGQsIHZhbCkJCUJJVFNfU0VUKCh0cGQpLT53b3JkWzFdLCAxNiwgMTYsIHZhbCkKKy8qIDA6IEV0aGVybmV0ICAgZnJhbWUgKERBK1NBK1RZUEUrREFUQStDUkMpCisgKiAxOiBJRUVFIDgwMi4zIGZyYW1lIChEQStTQStMRU4rRFNBUCtTU0FQK0NUTCtPUkcrVFlQRStEQVRBK0NSQykKKyAqLworI2RlZmluZSBUUERfVFlQX1NFVCh0cGQsIHZhbCkJCUJJVFNfU0VUKCh0cGQpLT53b3JkWzFdLCAxNywgMTcsIHZhbCkKKy8qIExvdy0zMmJpdCBCdWZmZXIgQWRkcmVzcyAqLworI2RlZmluZSBUUERfQlVGRkVSX0FERFJfTF9TRVQodHBkLCB2YWwpCSgodHBkKS0+d29yZFsyXSA9IGNwdV90b19sZTMyKHZhbCkpCisvKiBDVkxBTiBUYWcgdG8gYmUgaW5zZXJ0ZWQgaWYgSU5TX1ZMQU5fVEFHIGlzIHNldCwgQ1ZMQU4gVFBJRCBiYXNlZCBvbiBnbG9iYWwKKyAqIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24uCisgKi8KKyNkZWZpbmUgVFBEX0NWTEFOX1RBR19TRVQodHBkLCB2YWwpCUJJVFNfU0VUKCh0cGQpLT53b3JkWzNdLCAwLCAxNSwgdmFsKQorLyogIEluc2VydCBDVmxhbiBUYWc6IFdoZW4gc2V0LCBhc2sgTUFDIHRvIGluc2VydCBDVkxBTiBUQUcgdG8gb3V0Z29pbmcgcGFja2V0CisgKi8KKyNkZWZpbmUgVFBEX0lOU1RDX1NFVCh0cGQsIHZhbCkJCUJJVFNfU0VUKCh0cGQpLT53b3JkWzNdLCAxNywgMTcsIHZhbCkKKy8qIEhpZ2gtMTRiaXQgQnVmZmVyIEFkZHJlc3MsIFNvLCB0aGUgNjRiLWJpdCBhZGRyZXNzIGlzCisgKiB7REVTQ19DVFJMXzExX1RYX0RBVEFfSElBRERSWzE3OjBdLChyZWdpc3RlcikgQlVGRkVSX0FERFJfSCwgQlVGRkVSX0FERFJfTH0KKyAqLworI2RlZmluZSBUUERfQlVGRkVSX0FERFJfSF9TRVQodHBkLCB2YWwpCUJJVFNfU0VUKCh0cGQpLT53b3JkWzNdLCAxOCwgMzAsIHZhbCkKKy8qIEZvcm1hdCBELiBXb3JkIG9mZnNldCBmcm9tIHRoZSAxc3QgYnl0ZSBvZiB0aGlzIHBhY2tldCB0byBzdGFydCB0byBjYWxjdWxhdGUKKyAqIHRoZSBjdXN0b20gY2hlY2tzdW0uCisgKi8KKyNkZWZpbmUgVFBEX1BBWUxPQURfT0ZGU0VUX1NFVCh0cGQsIHZhbCkgQklUU19TRVQoKHRwZCktPndvcmRbMV0sIDAsIDcsIHZhbCkKKy8qICBGb3JtYXQgRC4gV29yZCBvZmZzZXQgZnJvbSB0aGUgMXN0IGJ5dGUgb2YgdGhpcyBwYWNrZXQgdG8gZmlsbCB0aGUgY3VzdG9tCisgKiBjaGVja3N1bSB0bworICovCisjZGVmaW5lIFRQRF9DWFNVTV9PRkZTRVRfU0VUKHRwZCwgdmFsKQlCSVRTX1NFVCgodHBkKS0+d29yZFsxXSwgMTgsIDI1LCB2YWwpCisKKy8qIEZvcm1hdCBDLiBUQ1AgSGVhZGVyIG9mZnNldCBmcm9tIHRoZSAxc3QgYnl0ZSBvZiB0aGlzIHBhY2tldC4gKGJ5dGUgdW5pdCkgKi8KKyNkZWZpbmUgVFBEX1RDUEhEUl9PRkZTRVRfU0VUKHRwZCwgdmFsKQlCSVRTX1NFVCgodHBkKS0+d29yZFsxXSwgMCwgNywgdmFsKQorLyogRm9ybWF0IEMuIE1TUyAoTWF4aW11bSBTZWdtZW50IFNpemUpIGdvdCBmcm9tIHRoZSBwcm90b2NvbCBsYXllci4gKGJ5dGUgdW5pdCkKKyAqLworI2RlZmluZSBUUERfTVNTX1NFVCh0cGQsIHZhbCkJCUJJVFNfU0VUKCh0cGQpLT53b3JkWzFdLCAxOCwgMzAsIHZhbCkKKy8qIHBhY2tldCBsZW5ndGggaW4gZXh0IHRwZCAqLworI2RlZmluZSBUUERfUEtUX0xFTl9TRVQodHBkLCB2YWwpCSgodHBkKS0+d29yZFsyXSA9IGNwdV90b19sZTMyKHZhbCkpCit9OworCisvKiBlbWFjX3JpbmdfaGVhZGVyIHJlcHJlc2VudHMgYSBzaW5nbGUsIGNvbnRpZ3VvdXMgYmxvY2sgb2YgRE1BIHNwYWNlCisgKiBtYXBwZWQgZm9yIHRoZSB0aHJlZSBkZXNjcmlwdG9yIHJpbmdzICh0cGQsIHJmZCwgcnJkKQorICovCitzdHJ1Y3QgZW1hY19yaW5nX2hlYWRlciB7CisJdm9pZAkJCSp2X2FkZHI7CS8qIHZpcnR1YWwgYWRkcmVzcyAqLworCWRtYV9hZGRyX3QJCWRtYV9hZGRyOwkvKiBkbWEgYWRkcmVzcyAqLworCXNpemVfdAkJCXNpemU7CQkvKiBsZW5ndGggaW4gYnl0ZXMgKi8KKwlzaXplX3QJCQl1c2VkOworfTsKKworLyogZW1hY19idWZmZXIgaXMgd3JhcHBlciBhcm91bmQgYSBwb2ludGVyIHRvIGEgc29ja2V0IGJ1ZmZlcgorICogc28gYSBETUEgaGFuZGxlIGNhbiBiZSBzdG9yZWQgYWxvbmcgd2l0aCB0aGUgc2tiCisgKi8KK3N0cnVjdCBlbWFjX2J1ZmZlciB7CisJc3RydWN0IHNrX2J1ZmYJCSpza2I7CQkvKiBzb2NrZXQgYnVmZmVyICovCisJdTE2CQkJbGVuZ3RoOwkJLyogcnggYnVmZmVyIGxlbmd0aCAqLworCWRtYV9hZGRyX3QJCWRtYV9hZGRyOwkvKiBkbWEgYWRkcmVzcyAqLworfTsKKworLyogcmVjZWl2ZSBmcmVlIGRlc2NyaXB0b3IgKHJmZCkgcmluZyAqLworc3RydWN0IGVtYWNfcmZkX3JpbmcgeworCXN0cnVjdCBlbWFjX2J1ZmZlcgkqcmZidWZmOworCXUzMgkJCSp2X2FkZHI7CS8qIHZpcnR1YWwgYWRkcmVzcyAqLworCWRtYV9hZGRyX3QJCWRtYV9hZGRyOwkvKiBkbWEgYWRkcmVzcyAqLworCXNpemVfdAkJCXNpemU7CQkvKiBsZW5ndGggaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBpbnQJCWNvdW50OwkJLyogbnVtYmVyIG9mIGRlc2MgaW4gdGhlIHJpbmcgKi8KKwl1bnNpZ25lZCBpbnQJCXByb2R1Y2VfaWR4OworCXVuc2lnbmVkIGludAkJcHJvY2Vzc19pZHg7CisJdW5zaWduZWQgaW50CQljb25zdW1lX2lkeDsJLyogdW51c2VkICovCit9OworCisvKiBSZWNlaXZlIFJldHVybiBEZXNjaXB0b3IgKFJSRCkgcmluZyAqLworc3RydWN0IGVtYWNfcnJkX3JpbmcgeworCXUzMgkJCSp2X2FkZHI7CS8qIHZpcnR1YWwgYWRkcmVzcyAqLworCWRtYV9hZGRyX3QJCWRtYV9hZGRyOwkvKiBwaHlzaWNhbCBhZGRyZXNzICovCisJc2l6ZV90CQkJc2l6ZTsJCS8qIGxlbmd0aCBpbiBieXRlcyAqLworCXVuc2lnbmVkIGludAkJY291bnQ7CQkvKiBudW1iZXIgb2YgZGVzYyBpbiB0aGUgcmluZyAqLworCXVuc2lnbmVkIGludAkJcHJvZHVjZV9pZHg7CS8qIHVudXNlZCAqLworCXVuc2lnbmVkIGludAkJY29uc3VtZV9pZHg7Cit9OworCisvKiBSeCBxdWV1ZSAqLworc3RydWN0IGVtYWNfcnhfcXVldWUgeworCXN0cnVjdCBuZXRfZGV2aWNlCSpuZXRkZXY7CS8qIG5ldGRldiByaW5nIGJlbG9uZ3MgdG8gKi8KKwlzdHJ1Y3QgZW1hY19ycmRfcmluZwlycmQ7CisJc3RydWN0IGVtYWNfcmZkX3JpbmcJcmZkOworCXN0cnVjdCBuYXBpX3N0cnVjdAluYXBpOworCXN0cnVjdCBlbWFjX2lycQkJKmlycTsKKworCXUzMgkJCWludHI7CisJdTMyCQkJcHJvZHVjZV9tYXNrOworCXUzMgkJCXByb2Nlc3NfbWFzazsKKwl1MzIJCQljb25zdW1lX21hc2s7CisKKwl1MTYJCQlwcm9kdWNlX3JlZzsKKwl1MTYJCQlwcm9jZXNzX3JlZzsKKwl1MTYJCQljb25zdW1lX3JlZzsKKworCXU4CQkJcHJvZHVjZV9zaGlmdDsKKwl1OAkJCXByb2Nlc3Nfc2hmdDsKKwl1OAkJCWNvbnN1bWVfc2hpZnQ7Cit9OworCisvKiBUcmFuc2ltaXQgUGFja2V0IERlc2NyaXB0b3IgKHRwZCkgcmluZyAqLworc3RydWN0IGVtYWNfdHBkX3JpbmcgeworCXN0cnVjdCBlbWFjX2J1ZmZlcgkqdHBidWZmOworCXUzMgkJCSp2X2FkZHI7CS8qIHZpcnR1YWwgYWRkcmVzcyAqLworCWRtYV9hZGRyX3QJCWRtYV9hZGRyOwkvKiBkbWEgYWRkcmVzcyAqLworCisJc2l6ZV90CQkJc2l6ZTsJCS8qIGxlbmd0aCBpbiBieXRlcyAqLworCXVuc2lnbmVkIGludAkJY291bnQ7CQkvKiBudW1iZXIgb2YgZGVzYyBpbiB0aGUgcmluZyAqLworCXVuc2lnbmVkIGludAkJcHJvZHVjZV9pZHg7CisJdW5zaWduZWQgaW50CQljb25zdW1lX2lkeDsKKwl1bnNpZ25lZCBpbnQJCWxhc3RfcHJvZHVjZV9pZHg7Cit9OworCisvKiBUeCBxdWV1ZSAqLworc3RydWN0IGVtYWNfdHhfcXVldWUgeworCXN0cnVjdCBlbWFjX3RwZF9yaW5nCXRwZDsKKworCXUzMgkJCXByb2R1Y2VfbWFzazsKKwl1MzIJCQljb25zdW1lX21hc2s7CisKKwl1MTYJCQltYXhfcGFja2V0czsJLyogbWF4IHBhY2tldHMgcGVyIGludGVycnVwdCAqLworCXUxNgkJCXByb2R1Y2VfcmVnOworCXUxNgkJCWNvbnN1bWVfcmVnOworCisJdTgJCQlwcm9kdWNlX3NoaWZ0OworCXU4CQkJY29uc3VtZV9zaGlmdDsKK307CisKK3N0cnVjdCBlbWFjX2FkYXB0ZXI7CisKK2ludCAgZW1hY19tYWNfdXAoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCk7Cit2b2lkIGVtYWNfbWFjX2Rvd24oc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCk7Cit2b2lkIGVtYWNfbWFjX3Jlc2V0KHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpOwordm9pZCBlbWFjX21hY19zdGFydChzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KTsKK3ZvaWQgZW1hY19tYWNfc3RvcChzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KTsKK3ZvaWQgZW1hY19tYWNfbW9kZV9jb25maWcoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCk7Cit2b2lkIGVtYWNfbWFjX3J4X3Byb2Nlc3Moc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCwgc3RydWN0IGVtYWNfcnhfcXVldWUgKnJ4X3EsCisJCQkgaW50ICpudW1fcGt0cywgaW50IG1heF9wa3RzKTsKK2ludCBlbWFjX21hY190eF9idWZfc2VuZChzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0LCBzdHJ1Y3QgZW1hY190eF9xdWV1ZSAqdHhfcSwKKwkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3ZvaWQgZW1hY19tYWNfdHhfcHJvY2VzcyhzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0LCBzdHJ1Y3QgZW1hY190eF9xdWV1ZSAqdHhfcSk7Cit2b2lkIGVtYWNfbWFjX3J4X3R4X3JpbmdfaW5pdF9hbGwoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgIHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpOworaW50ICBlbWFjX21hY19yeF90eF9yaW5nc19hbGxvY19hbGwoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCk7Cit2b2lkIGVtYWNfbWFjX3J4X3R4X3JpbmdzX2ZyZWVfYWxsKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpOwordm9pZCBlbWFjX21hY19tdWx0aWNhc3RfYWRkcl9jbGVhcihzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KTsKK3ZvaWQgZW1hY19tYWNfbXVsdGljYXN0X2FkZHJfc2V0KHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQsIHU4ICphZGRyKTsKKworI2VuZGlmIC8qX0VNQUNfSFdfSF8qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy9lbWFjLXBoeS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy9lbWFjLXBoeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNGU5MGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjL2VtYWMtcGh5LmMKQEAgLTAsMCArMSwyMjcgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMy0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qIFF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBFTUFDIFBIWSBDb250cm9sbGVyIGRyaXZlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9tZGlvLmg+CisjaW5jbHVkZSA8bGludXgvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgImVtYWMuaCIKKyNpbmNsdWRlICJlbWFjLW1hYy5oIgorI2luY2x1ZGUgImVtYWMtcGh5LmgiCisjaW5jbHVkZSAiZW1hYy1zZ21paS5oIgorCisvKiBFTUFDIGJhc2UgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBFTUFDX01ESU9fQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTQxNAorI2RlZmluZSBFTUFDX1BIWV9TVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTQxOAorI2RlZmluZSBFTUFDX01ESU9fRVhfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTQ0MAorCisvKiBFTUFDX01ESU9fQ1RSTCAqLworI2RlZmluZSBNRElPX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDMwKQorI2RlZmluZSBNRElPX1BSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDI5KQorI2RlZmluZSBNRElPX0FQX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDI4KQorI2RlZmluZSBNRElPX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDI3KQorI2RlZmluZSBNRElPX0NMS19TRUxfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NzAwMDAwMAorI2RlZmluZSBNRElPX0NMS19TRUxfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNAorI2RlZmluZSBNRElPX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDIzKQorI2RlZmluZSBTVVBfUFJFQU1CTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDIyKQorI2RlZmluZSBNRElPX1JEX05XUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDIxKQorI2RlZmluZSBNRElPX1JFR19BRERSX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFmMDAwMAorI2RlZmluZSBNRElPX1JFR19BRERSX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBNRElPX0RBVEFfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZgorI2RlZmluZSBNRElPX0RBVEFfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKiBFTUFDX1BIWV9TVFMgKi8KKyNkZWZpbmUgUEhZX0FERFJfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxZjAwMDAKKyNkZWZpbmUgUEhZX0FERFJfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKworI2RlZmluZSBNRElPX0NMS18yNV80ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNRElPX0NMS18yNV8yOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNworCisjZGVmaW5lIE1ESU9fV0FJVF9USU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwCisKKyNkZWZpbmUgRU1BQ19MSU5LX1NQRUVEX0RFRkFVTFQgKFwKKwkJRU1BQ19MSU5LX1NQRUVEXzEwX0hBTEYgIHxcCisJCUVNQUNfTElOS19TUEVFRF8xMF9GVUxMICB8XAorCQlFTUFDX0xJTktfU1BFRURfMTAwX0hBTEYgfFwKKwkJRU1BQ19MSU5LX1NQRUVEXzEwMF9GVUxMIHxcCisJCUVNQUNfTElOS19TUEVFRF8xR0JfRlVMTCkKKworLyoqCisgKiBlbWFjX3BoeV9tZGlvX2F1dG9wb2xsX2Rpc2FibGUoKSAtIGRpc2FibGUgbWRpbyBhdXRvcG9sbAorICogQGFkcHQ6IHRoZSBlbWFjIGFkYXB0ZXIKKyAqCisgKiBUaGUgYXV0b3BvbGwgZmVhdHVyZSB0YWtlcyBvdmVyIHRoZSBNRElPIGJ1cy4gIEluIG9yZGVyIGZvcgorICogdGhlIFBIWSBkcml2ZXIgdG8gYmUgYWJsZSB0byB0YWxrIHRvIHRoZSBQSFkgb3ZlciB0aGUgTURJTworICogYnVzLCB3ZSBuZWVkIHRvIHRlbXBvcmFyaWx5IGRpc2FibGUgdGhlIGF1dG9wb2xsIGZlYXR1cmUuCisgKi8KK3N0YXRpYyBpbnQgZW1hY19waHlfbWRpb19hdXRvcG9sbF9kaXNhYmxlKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJdTMyIHZhbDsKKworCS8qIGRpc2FibGUgYXV0b3BvbGwgKi8KKwllbWFjX3JlZ191cGRhdGUzMihhZHB0LT5iYXNlICsgRU1BQ19NRElPX0NUUkwsIE1ESU9fQVBfRU4sIDApOworCisJLyogd2FpdCBmb3IgYW55IG1kaW8gcG9sbGluZyB0byBjb21wbGV0ZSAqLworCWlmICghcmVhZGxfcG9sbF90aW1lb3V0KGFkcHQtPmJhc2UgKyBFTUFDX01ESU9fQ1RSTCwgdmFsLAorCQkJCSEodmFsICYgTURJT19CVVNZKSwgMTAwLCBNRElPX1dBSVRfVElNRVMgKiAxMDApKQorCQlyZXR1cm4gMDsKKworCS8qIGZhaWxlZCB0byBkaXNhYmxlOyBlbnN1cmUgaXQgaXMgZW5hYmxlZCBiZWZvcmUgcmV0dXJuaW5nICovCisJZW1hY19yZWdfdXBkYXRlMzIoYWRwdC0+YmFzZSArIEVNQUNfTURJT19DVFJMLCAwLCBNRElPX0FQX0VOKTsKKworCXJldHVybiAtRUJVU1k7Cit9CisKKy8qKgorICogZW1hY19waHlfbWRpb19hdXRvcG9sbF9kaXNhYmxlKCkgLSBkaXNhYmxlIG1kaW8gYXV0b3BvbGwKKyAqIEBhZHB0OiB0aGUgZW1hYyBhZGFwdGVyCisgKgorICogVGhlIEVNQUMgaGFzIHRoZSBhYmlsaXR5IHRvIHBvbGwgdGhlIGV4dGVybmFsIFBIWSBvbiB0aGUgTURJTworICogYnVzIGZvciBsaW5rIHN0YXRlIGNoYW5nZXMuICBUaGlzIGVsaW1pbmF0ZXMgdGhlIG5lZWQgZm9yIHRoZQorICogZHJpdmVyIHRvIHBvbGwgdGhlIHBoeS4gIElmIGlmIHRoZSBsaW5rIHN0YXRlIGRvZXMgY2hhbmdlLAorICogdGhlIEVNQUMgaXNzdWVzIGFuIGludGVycnVwdCBvbiBiZWhhbGYgb2YgdGhlIFBIWS4KKyAqLworc3RhdGljIHZvaWQgZW1hY19waHlfbWRpb19hdXRvcG9sbF9lbmFibGUoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwllbWFjX3JlZ191cGRhdGUzMihhZHB0LT5iYXNlICsgRU1BQ19NRElPX0NUUkwsIDAsIE1ESU9fQVBfRU4pOworfQorCitzdGF0aWMgaW50IGVtYWNfbWRpb19yZWFkKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBhZGRyLCBpbnQgcmVnbnVtKQoreworCXN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQgPSBidXMtPnByaXY7CisJdTMyIHJlZzsKKwlpbnQgcmV0OworCisJcmV0ID0gZW1hY19waHlfbWRpb19hdXRvcG9sbF9kaXNhYmxlKGFkcHQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwllbWFjX3JlZ191cGRhdGUzMihhZHB0LT5iYXNlICsgRU1BQ19QSFlfU1RTLCBQSFlfQUREUl9CTVNLLAorCQkJICAoYWRkciA8PCBQSFlfQUREUl9TSEZUKSk7CisKKwlyZWcgPSBTVVBfUFJFQU1CTEUgfAorCSAgICAgICgoTURJT19DTEtfMjVfNCA8PCBNRElPX0NMS19TRUxfU0hGVCkgJiBNRElPX0NMS19TRUxfQk1TSykgfAorCSAgICAgICgocmVnbnVtIDw8IE1ESU9fUkVHX0FERFJfU0hGVCkgJiBNRElPX1JFR19BRERSX0JNU0spIHwKKwkgICAgICBNRElPX1NUQVJUIHwgTURJT19SRF9OV1I7CisKKwl3cml0ZWwocmVnLCBhZHB0LT5iYXNlICsgRU1BQ19NRElPX0NUUkwpOworCisJaWYgKHJlYWRsX3BvbGxfdGltZW91dChhZHB0LT5iYXNlICsgRU1BQ19NRElPX0NUUkwsIHJlZywKKwkJCSAgICAgICAhKHJlZyAmIChNRElPX1NUQVJUIHwgTURJT19CVVNZKSksCisJCQkgICAgICAgMTAwLCBNRElPX1dBSVRfVElNRVMgKiAxMDApKQorCQlyZXQgPSAtRUlPOworCWVsc2UKKwkJcmV0ID0gKHJlZyA+PiBNRElPX0RBVEFfU0hGVCkgJiBNRElPX0RBVEFfQk1TSzsKKworCWVtYWNfcGh5X21kaW9fYXV0b3BvbGxfZW5hYmxlKGFkcHQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBlbWFjX21kaW9fd3JpdGUoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IGFkZHIsIGludCByZWdudW0sIHUxNiB2YWwpCit7CisJc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCA9IGJ1cy0+cHJpdjsKKwl1MzIgcmVnOworCWludCByZXQ7CisKKwlyZXQgPSBlbWFjX3BoeV9tZGlvX2F1dG9wb2xsX2Rpc2FibGUoYWRwdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWVtYWNfcmVnX3VwZGF0ZTMyKGFkcHQtPmJhc2UgKyBFTUFDX1BIWV9TVFMsIFBIWV9BRERSX0JNU0ssCisJCQkgIChhZGRyIDw8IFBIWV9BRERSX1NIRlQpKTsKKworCXJlZyA9IFNVUF9QUkVBTUJMRSB8CisJCSgoTURJT19DTEtfMjVfNCA8PCBNRElPX0NMS19TRUxfU0hGVCkgJiBNRElPX0NMS19TRUxfQk1TSykgfAorCQkoKHJlZ251bSA8PCBNRElPX1JFR19BRERSX1NIRlQpICYgTURJT19SRUdfQUREUl9CTVNLKSB8CisJCSgodmFsIDw8IE1ESU9fREFUQV9TSEZUKSAmIE1ESU9fREFUQV9CTVNLKSB8CisJCU1ESU9fU1RBUlQ7CisKKwl3cml0ZWwocmVnLCBhZHB0LT5iYXNlICsgRU1BQ19NRElPX0NUUkwpOworCisJaWYgKHJlYWRsX3BvbGxfdGltZW91dChhZHB0LT5iYXNlICsgRU1BQ19NRElPX0NUUkwsIHJlZywKKwkJCSAgICAgICAhKHJlZyAmIChNRElPX1NUQVJUIHwgTURJT19CVVNZKSksIDEwMCwKKwkJCSAgICAgICBNRElPX1dBSVRfVElNRVMgKiAxMDApKQorCQlyZXQgPSAtRUlPOworCisJZW1hY19waHlfbWRpb19hdXRvcG9sbF9lbmFibGUoYWRwdCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBDb25maWd1cmUgdGhlIE1ESU8gYnVzIGFuZCBjb25uZWN0IHRoZSBleHRlcm5hbCBQSFkgKi8KK2ludCBlbWFjX3BoeV9jb25maWcoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJc3RydWN0IG1paV9idXMgKm1paV9idXM7CisJaW50IHJldDsKKworCS8qIENyZWF0ZSB0aGUgbWlpX2J1cyBvYmplY3QgZm9yIHRhbGtpbmcgdG8gdGhlIE1ESU8gYnVzICovCisJYWRwdC0+bWlpX2J1cyA9IG1paV9idXMgPSBkZXZtX21kaW9idXNfYWxsb2MoJnBkZXYtPmRldik7CisJaWYgKCFtaWlfYnVzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1paV9idXMtPm5hbWUgPSAiZW1hYy1tZGlvIjsKKwlzbnByaW50ZihtaWlfYnVzLT5pZCwgTUlJX0JVU19JRF9TSVpFLCAiJXMiLCBwZGV2LT5uYW1lKTsKKwltaWlfYnVzLT5yZWFkID0gZW1hY19tZGlvX3JlYWQ7CisJbWlpX2J1cy0+d3JpdGUgPSBlbWFjX21kaW9fd3JpdGU7CisJbWlpX2J1cy0+cGFyZW50ID0gJnBkZXYtPmRldjsKKwltaWlfYnVzLT5wcml2ID0gYWRwdDsKKworCWlmIChoYXNfYWNwaV9jb21wYW5pb24oJnBkZXYtPmRldikpIHsKKwkJdTMyIHBoeV9hZGRyOworCisJCXJldCA9IG1kaW9idXNfcmVnaXN0ZXIobWlpX2J1cyk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCByZWdpc3RlciBtZGlvIGJ1c1xuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXJldCA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMigmcGRldi0+ZGV2LCAicGh5LWNoYW5uZWwiLAorCQkJCQkgICAgICAgJnBoeV9hZGRyKTsKKwkJaWYgKHJldCkKKwkJCS8qIElmIHdlIGNhbid0IHJlYWQgYSB2YWxpZCBwaHkgYWRkcmVzcywgdGhlbiBhc3N1bWUKKwkJCSAqIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgcGh5IG9uIHRoaXMgbWRpbyBidXMuCisJCQkgKi8KKwkJCWFkcHQtPnBoeWRldiA9IHBoeV9maW5kX2ZpcnN0KG1paV9idXMpOworCQllbHNlCisJCQlhZHB0LT5waHlkZXYgPSBtZGlvYnVzX2dldF9waHkobWlpX2J1cywgcGh5X2FkZHIpOworCisJfSBlbHNlIHsKKwkJc3RydWN0IGRldmljZV9ub2RlICpwaHlfbnA7CisKKwkJcmV0ID0gb2ZfbWRpb2J1c19yZWdpc3RlcihtaWlfYnVzLCBucCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCByZWdpc3RlciBtZGlvIGJ1c1xuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcGh5X25wID0gb2ZfcGFyc2VfcGhhbmRsZShucCwgInBoeS1oYW5kbGUiLCAwKTsKKwkJYWRwdC0+cGh5ZGV2ID0gb2ZfcGh5X2ZpbmRfZGV2aWNlKHBoeV9ucCk7CisJfQorCisJaWYgKCFhZHB0LT5waHlkZXYpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IGZpbmQgZXh0ZXJuYWwgcGh5XG4iKTsKKwkJbWRpb2J1c191bnJlZ2lzdGVyKG1paV9idXMpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoYWRwdC0+cGh5ZGV2LT5kcnYpCisJCXBoeV9hdHRhY2hlZF9wcmludChhZHB0LT5waHlkZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjL2VtYWMtcGh5LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjL2VtYWMtcGh5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmMzcwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL2VtYWMvZW1hYy1waHkuaApAQCAtMCwwICsxLDMzIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNpZm5kZWYgX0VNQUNfUEhZX0hfCisjZGVmaW5lIF9FTUFDX1BIWV9IXworCit0eXBlZGVmIGludCAoKmVtYWNfc2dtaWlfaW5pdGlhbGl6ZSkoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCk7CisKKy8qKiBlbWFjX3BoeSAtIGludGVybmFsIGVtYWMgcGh5CisgKiBAYmFzZSBiYXNlIGFkZHJlc3MKKyAqIEBkaWdpdGFsIHBlci1sYW5lIGRpZ2l0YWwgYmxvY2sKKyAqIEBpbml0aWFsaXplIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCisgKi8KK3N0cnVjdCBlbWFjX3BoeSB7CisJdm9pZCBfX2lvbWVtCQkqYmFzZTsKKwl2b2lkIF9faW9tZW0JCSpkaWdpdGFsOworCWVtYWNfc2dtaWlfaW5pdGlhbGl6ZQlpbml0aWFsaXplOworfTsKKworc3RydWN0IGVtYWNfYWRhcHRlcjsKKworaW50IGVtYWNfcGh5X2NvbmZpZyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KTsKKworI2VuZGlmIC8qIF9FTUFDX1BIWV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy9lbWFjLXNnbWlpLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjL2VtYWMtc2dtaWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWMxYjUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy9lbWFjLXNnbWlpLmMKQEAgLTAsMCArMSw3ODQgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qIFF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBFTUFDIFNHTUlJIENvbnRyb2xsZXIgZHJpdmVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pb3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSAiZW1hYy5oIgorI2luY2x1ZGUgImVtYWMtbWFjLmgiCisjaW5jbHVkZSAiZW1hYy1zZ21paS5oIgorCisvKiBFTUFDX1FTRVJERVMgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBFTUFDX1FTRVJERVNfQ09NX1NZU19DTEtfQ1RSTAkJMHgwMDAwMDAKKyNkZWZpbmUgRU1BQ19RU0VSREVTX0NPTV9QTExfQ05UUkwJCTB4MDAwMDE0CisjZGVmaW5lIEVNQUNfUVNFUkRFU19DT01fUExMX0lQX1NFVEkJCTB4MDAwMDE4CisjZGVmaW5lIEVNQUNfUVNFUkRFU19DT01fUExMX0NQX1NFVEkJCTB4MDAwMDI0CisjZGVmaW5lIEVNQUNfUVNFUkRFU19DT01fUExMX0lQX1NFVFAJCTB4MDAwMDI4CisjZGVmaW5lIEVNQUNfUVNFUkRFU19DT01fUExMX0NQX1NFVFAJCTB4MDAwMDJjCisjZGVmaW5lIEVNQUNfUVNFUkRFU19DT01fU1lTQ0xLX0VOX1NFTAkJMHgwMDAwMzgKKyNkZWZpbmUgRU1BQ19RU0VSREVTX0NPTV9SRVNFVFNNX0NOVFJMCQkweDAwMDA0MAorI2RlZmluZSBFTUFDX1FTRVJERVNfQ09NX1BMTExPQ0tfQ01QMQkJMHgwMDAwNDQKKyNkZWZpbmUgRU1BQ19RU0VSREVTX0NPTV9QTExMT0NLX0NNUDIJCTB4MDAwMDQ4CisjZGVmaW5lIEVNQUNfUVNFUkRFU19DT01fUExMTE9DS19DTVAzCQkweDAwMDA0YworI2RlZmluZSBFTUFDX1FTRVJERVNfQ09NX1BMTExPQ0tfQ01QX0VOCQkweDAwMDA1MAorI2RlZmluZSBFTUFDX1FTRVJERVNfQ09NX0RFQ19TVEFSVDEJCTB4MDAwMDY0CisjZGVmaW5lIEVNQUNfUVNFUkRFU19DT01fRElWX0ZSQUNfU1RBUlQxCTB4MDAwMDk4CisjZGVmaW5lIEVNQUNfUVNFUkRFU19DT01fRElWX0ZSQUNfU1RBUlQyCTB4MDAwMDljCisjZGVmaW5lIEVNQUNfUVNFUkRFU19DT01fRElWX0ZSQUNfU1RBUlQzCTB4MDAwMGEwCisjZGVmaW5lIEVNQUNfUVNFUkRFU19DT01fREVDX1NUQVJUMgkJMHgwMDAwYTQKKyNkZWZpbmUgRU1BQ19RU0VSREVTX0NPTV9QTExfQ1JDVFJMCQkweDAwMDBhYworI2RlZmluZSBFTUFDX1FTRVJERVNfQ09NX1JFU0VUX1NNCQkweDAwMDBiYworI2RlZmluZSBFTUFDX1FTRVJERVNfVFhfQklTVF9NT0RFX0xBTkVOTwkweDAwMDEwMAorI2RlZmluZSBFTUFDX1FTRVJERVNfVFhfVFhfRU1QX1BPU1QxX0xWTAkweDAwMDEwOAorI2RlZmluZSBFTUFDX1FTRVJERVNfVFhfVFhfRFJWX0xWTAkJMHgwMDAxMGMKKyNkZWZpbmUgRU1BQ19RU0VSREVTX1RYX0xBTkVfTU9ERQkJMHgwMDAxNTAKKyNkZWZpbmUgRU1BQ19RU0VSREVTX1RYX1RSQU5fRFJWUl9FTVBfRU4JMHgwMDAxNzAKKyNkZWZpbmUgRU1BQ19RU0VSREVTX1JYX0NEUl9DT05UUk9MCQkweDAwMDIwMAorI2RlZmluZSBFTUFDX1FTRVJERVNfUlhfQ0RSX0NPTlRST0wyCQkweDAwMDIxMAorI2RlZmluZSBFTUFDX1FTRVJERVNfUlhfUlhfRVFfR0FJTjEyCQkweDAwMDIzMAorCisvKiBFTUFDX1NHTUlJIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgRU1BQ19TR01JSV9QSFlfU0VSREVTX1NUQVJUCQkweDAwMDAwMAorI2RlZmluZSBFTUFDX1NHTUlJX1BIWV9DTU5fUFdSX0NUUkwJCTB4MDAwMDA0CisjZGVmaW5lIEVNQUNfU0dNSUlfUEhZX1JYX1BXUl9DVFJMCQkweDAwMDAwOAorI2RlZmluZSBFTUFDX1NHTUlJX1BIWV9UWF9QV1JfQ1RSTAkJMHgwMDAwMEMKKyNkZWZpbmUgRU1BQ19TR01JSV9QSFlfTEFORV9DVFJMMQkJMHgwMDAwMTgKKyNkZWZpbmUgRU1BQ19TR01JSV9QSFlfQVVUT05FR19DRkcyCQkweDAwMDA0OAorI2RlZmluZSBFTUFDX1NHTUlJX1BIWV9DRFJfQ1RSTDAJCTB4MDAwMDU4CisjZGVmaW5lIEVNQUNfU0dNSUlfUEhZX1NQRUVEX0NGRzEJCTB4MDAwMDc0CisjZGVmaW5lIEVNQUNfU0dNSUlfUEhZX1BPV19EV05fQ1RSTDAJCTB4MDAwMDgwCisjZGVmaW5lIEVNQUNfU0dNSUlfUEhZX1JFU0VUX0NUUkwJCTB4MDAwMGE4CisjZGVmaW5lIEVNQUNfU0dNSUlfUEhZX0lSUV9DTUQJCQkweDAwMDBhYworI2RlZmluZSBFTUFDX1NHTUlJX1BIWV9JTlRFUlJVUFRfQ0xFQVIJCTB4MDAwMGIwCisjZGVmaW5lIEVNQUNfU0dNSUlfUEhZX0lOVEVSUlVQVF9NQVNLCQkweDAwMDBiNAorI2RlZmluZSBFTUFDX1NHTUlJX1BIWV9JTlRFUlJVUFRfU1RBVFVTCQkweDAwMDBiOAorI2RlZmluZSBFTUFDX1NHTUlJX1BIWV9SWF9DSEtfU1RBVFVTCQkweDAwMDBkNAorI2RlZmluZSBFTUFDX1NHTUlJX1BIWV9BVVRPTkVHMF9TVEFUVVMJCTB4MDAwMGUwCisjZGVmaW5lIEVNQUNfU0dNSUlfUEhZX0FVVE9ORUcxX1NUQVRVUwkJMHgwMDAwZTQKKworLyogRU1BQ19RU0VSREVTX0NPTV9QTExfSVBfU0VUSSAqLworI2RlZmluZSBQTExfSVBTRVRJKHgpCQkJCSgoeCkgJiAweDNmKQorCisvKiBFTUFDX1FTRVJERVNfQ09NX1BMTF9DUF9TRVRJICovCisjZGVmaW5lIFBMTF9DUFNFVEkoeCkJCQkJKCh4KSAmIDB4ZmYpCisKKy8qIEVNQUNfUVNFUkRFU19DT01fUExMX0lQX1NFVFAgKi8KKyNkZWZpbmUgUExMX0lQU0VUUCh4KQkJCQkoKHgpICYgMHgzZikKKworLyogRU1BQ19RU0VSREVTX0NPTV9QTExfQ1BfU0VUUCAqLworI2RlZmluZSBQTExfQ1BTRVRQKHgpCQkJCSgoeCkgJiAweDFmKQorCisvKiBFTUFDX1FTRVJERVNfQ09NX1BMTF9DUkNUUkwgKi8KKyNkZWZpbmUgUExMX1JDVFJMKHgpCQkJCSgoKHgpICYgMHhmKSA8PCA0KQorI2RlZmluZSBQTExfQ0NUUkwoeCkJCQkJKCh4KSAmIDB4ZikKKworLyogU0dNSUkgdjIgUEhZIHJlZ2lzdGVycyBwZXIgbGFuZSAqLworI2RlZmluZSBFTUFDX1NHTUlJX1BIWV9MTl9PRkZTRVQJCTB4MDQwMAorCisvKiBTR01JSSB2MiBkaWdpdGFsIGxhbmUgcmVnaXN0ZXJzICovCisjZGVmaW5lIEVNQUNfU0dNSUlfTE5fRFJWUl9DVFJMMAkJMHgwMEMKKyNkZWZpbmUgRU1BQ19TR01JSV9MTl9EUlZSX1RBUF9FTgkJMHgwMTgKKyNkZWZpbmUgRU1BQ19TR01JSV9MTl9UWF9NQVJHSU5JTkcJCTB4MDFDCisjZGVmaW5lIEVNQUNfU0dNSUlfTE5fVFhfUFJFCQkJMHgwMjAKKyNkZWZpbmUgRU1BQ19TR01JSV9MTl9UWF9QT1NUCQkJMHgwMjQKKyNkZWZpbmUgRU1BQ19TR01JSV9MTl9UWF9CQU5EX01PREUJCTB4MDYwCisjZGVmaW5lIEVNQUNfU0dNSUlfTE5fTEFORV9NT0RFCQkJMHgwNjQKKyNkZWZpbmUgRU1BQ19TR01JSV9MTl9QQVJBTExFTF9SQVRFCQkweDA3OAorI2RlZmluZSBFTUFDX1NHTUlJX0xOX0NNTF9DVFJMX01PREUwCQkweDBCOAorI2RlZmluZSBFTUFDX1NHTUlJX0xOX01JWEVSX0NUUkxfTU9ERTAJCTB4MEQwCisjZGVmaW5lIEVNQUNfU0dNSUlfTE5fVkdBX0lOSVRWQUwJCTB4MTM0CisjZGVmaW5lIEVNQUNfU0dNSUlfTE5fVUNEUl9GT19HQUlOX01PREUwCTB4MTdDCisjZGVmaW5lIEVNQUNfU0dNSUlfTE5fVUNEUl9TT19HQUlOX01PREUwCTB4MTg4CisjZGVmaW5lIEVNQUNfU0dNSUlfTE5fVUNEUl9TT19DT05GSUcJCTB4MTk0CisjZGVmaW5lIEVNQUNfU0dNSUlfTE5fUlhfQkFORAkJCTB4MTlDCisjZGVmaW5lIEVNQUNfU0dNSUlfTE5fUlhfUkNWUl9QQVRIMV9NT0RFMAkweDFCOAorI2RlZmluZSBFTUFDX1NHTUlJX0xOX1JTTV9DT05GSUcJCTB4MUYwCisjZGVmaW5lIEVNQUNfU0dNSUlfTE5fU0lHREVUX0VOQUJMRVMJCTB4MjI0CisjZGVmaW5lIEVNQUNfU0dNSUlfTE5fU0lHREVUX0NOVFJMCQkweDIyOAorI2RlZmluZSBFTUFDX1NHTUlJX0xOX1NJR0RFVF9ERUdMSVRDSF9DTlRSTAkweDIyQworI2RlZmluZSBFTUFDX1NHTUlJX0xOX1JYX0VOX1NJR05BTAkJMHgyQTAKKyNkZWZpbmUgRU1BQ19TR01JSV9MTl9SWF9NSVNDX0NOVFJMMAkJMHgyQUMKKyNkZWZpbmUgRU1BQ19TR01JSV9MTl9EUlZSX0xPR0lDX0NMS0RJVgkJMHgyQkMKKworLyogU0dNSUkgdjIgZGlnaXRhbCBsYW5lIHJlZ2lzdGVyIHZhbHVlcyAqLworI2RlZmluZSBVQ0RSX1NURVBfQllfVFdPX01PREUwCQkJQklUKDcpCisjZGVmaW5lIFVDRFJfeE9fR0FJTl9NT0RFKHgpCQkJKCh4KSAmIDB4N2YpCisjZGVmaW5lIFVDRFJfRU5BQkxFCQkJCUJJVCg2KQorI2RlZmluZSBVQ0RSX1NPX1NBVFVSQVRJT04oeCkJCQkoKHgpICYgMHgzZikKKyNkZWZpbmUgU0lHREVUX0xQX0JZUF9QUzQJCQlCSVQoNykKKyNkZWZpbmUgU0lHREVUX0VOX1BTMF9UT19QUzIJCQlCSVQoNikKKyNkZWZpbmUgRU5fQUNDT1VQTEVWQ01fU1dfTVVYCQkJQklUKDUpCisjZGVmaW5lIEVOX0FDQ09VUExFVkNNX1NXCQkJQklUKDQpCisjZGVmaW5lIFJYX1NZTkNfRU4JCQkJQklUKDMpCisjZGVmaW5lIFJYVEVSTV9ISUdIWl9QUzUJCQlCSVQoMikKKyNkZWZpbmUgU0lHREVUX0VOX1BTMwkJCQlCSVQoMSkKKyNkZWZpbmUgRU5fQUNDT1VQTEVfVkNNX1BTMwkJCUJJVCgwKQorI2RlZmluZSBVRlNfTU9ERQkJCQlCSVQoNSkKKyNkZWZpbmUgVFhWQUxfVkFMSURfSU5JVAkJCUJJVCg0KQorI2RlZmluZSBUWFZBTF9WQUxJRF9NVVgJCQkJQklUKDMpCisjZGVmaW5lIFRYVkFMX1ZBTElECQkJCUJJVCgyKQorI2RlZmluZSBVU0IzUDFfTU9ERQkJCQlCSVQoMSkKKyNkZWZpbmUgS1JfUENJR0VOM19NT0RFCQkJCUJJVCgwKQorI2RlZmluZSBQUkVfRU4JCQkJCUJJVCgzKQorI2RlZmluZSBQT1NUX0VOCQkJCQlCSVQoMikKKyNkZWZpbmUgTUFJTl9FTl9NVVgJCQkJQklUKDEpCisjZGVmaW5lIE1BSU5fRU4JCQkJCUJJVCgwKQorI2RlZmluZSBUWF9NQVJHSU5JTkdfTVVYCQkJQklUKDYpCisjZGVmaW5lIFRYX01BUkdJTklORyh4KQkJCQkoKHgpICYgMHgzZikKKyNkZWZpbmUgVFhfUFJFX01VWAkJCQlCSVQoNikKKyNkZWZpbmUgVFhfUFJFKHgpCQkJCSgoeCkgJiAweDNmKQorI2RlZmluZSBUWF9QT1NUX01VWAkJCQlCSVQoNikKKyNkZWZpbmUgVFhfUE9TVCh4KQkJCQkoKHgpICYgMHgzZikKKyNkZWZpbmUgQ01MX0dFQVJfTU9ERSh4KQkJCSgoKHgpICYgNykgPDwgMykKKyNkZWZpbmUgQ01MMkNNT1NfSUJPT1NUX01PREUoeCkJCQkoKHgpICYgNykKKyNkZWZpbmUgTUlYRVJfTE9BREJfTU9ERSh4KQkJCSgoKHgpICYgMHhmKSA8PCAyKQorI2RlZmluZSBNSVhFUl9EQVRBUkFURV9NT0RFKHgpCQkJKCh4KSAmIDMpCisjZGVmaW5lIFZHQV9USFJFU0hfREZFKHgpCQkJKCh4KSAmIDB4M2YpCisjZGVmaW5lIFNJR0RFVF9MUF9CWVBfUFMwX1RPX1BTMgkJQklUKDUpCisjZGVmaW5lIFNJR0RFVF9MUF9CWVBfTVVYCQkJQklUKDQpCisjZGVmaW5lIFNJR0RFVF9MUF9CWVAJCQkJQklUKDMpCisjZGVmaW5lIFNJR0RFVF9FTl9NVVgJCQkJQklUKDIpCisjZGVmaW5lIFNJR0RFVF9FTgkJCQlCSVQoMSkKKyNkZWZpbmUgU0lHREVUX0ZMVF9CWVAJCQkJQklUKDApCisjZGVmaW5lIFNJR0RFVF9MVkwoeCkJCQkJKCgoeCkgJiAweGYpIDw8IDQpCisjZGVmaW5lIFNJR0RFVF9CV19DVFJMKHgpCQkJKCh4KSAmIDB4ZikKKyNkZWZpbmUgU0lHREVUX0RFR0xJVENIX0NUUkwoeCkJCQkoKCh4KSAmIDB4ZikgPDwgMSkKKyNkZWZpbmUgU0lHREVUX0RFR0xJVENIX0JZUAkJCUJJVCgwKQorI2RlZmluZSBJTlZFUlRfUENTX1JYX0NMSwkJCUJJVCg3KQorI2RlZmluZSBQV01fRU4JCQkJCUJJVCg2KQorI2RlZmluZSBSWEJJQVNfU0VMKHgpCQkJCSgoKHgpICYgMHgzKSA8PCA0KQorI2RlZmluZSBFQkRBQ19TSUdOCQkJCUJJVCgzKQorI2RlZmluZSBFREFDX1NJR04JCQkJQklUKDIpCisjZGVmaW5lIEVOX0FVWFRBUDFTSUdOX0lOVkVSVAkJCUJJVCgxKQorI2RlZmluZSBFTl9EQUNfQ0hPUFBJTkcJCQkJQklUKDApCisjZGVmaW5lIERSVlJfTE9HSUNfQ0xLX0VOCQkJQklUKDQpCisjZGVmaW5lIERSVlJfTE9HSUNfQ0xLX0RJVih4KQkJCSgoeCkgJiAweGYpCisjZGVmaW5lIFBBUkFMTEVMX1JBVEVfTU9ERTIoeCkJCQkoKCh4KSAmIDB4MykgPDwgNCkKKyNkZWZpbmUgUEFSQUxMRUxfUkFURV9NT0RFMSh4KQkJCSgoKHgpICYgMHgzKSA8PCAyKQorI2RlZmluZSBQQVJBTExFTF9SQVRFX01PREUwKHgpCQkJKCh4KSAmIDB4MykKKyNkZWZpbmUgQkFORF9NT0RFMih4KQkJCQkoKCh4KSAmIDB4MykgPDwgNCkKKyNkZWZpbmUgQkFORF9NT0RFMSh4KQkJCQkoKCh4KSAmIDB4MykgPDwgMikKKyNkZWZpbmUgQkFORF9NT0RFMCh4KQkJCQkoKHgpICYgMHgzKQorI2RlZmluZSBMQU5FX1NZTkNfTU9ERQkJCQlCSVQoNSkKKyNkZWZpbmUgTEFORV9NT0RFKHgpCQkJCSgoeCkgJiAweDFmKQorI2RlZmluZSBDRFJfUERfU0VMX01PREUwKHgpCQkJKCgoeCkgJiAweDMpIDw8IDUpCisjZGVmaW5lIEVOX0RMTF9NT0RFMAkJCQlCSVQoNCkKKyNkZWZpbmUgRU5fSVFfRENDX01PREUwCQkJCUJJVCgzKQorI2RlZmluZSBFTl9JUUNBTF9NT0RFMAkJCQlCSVQoMikKKyNkZWZpbmUgRU5fUVBBVEhfTU9ERTAJCQkJQklUKDEpCisjZGVmaW5lIEVOX0VQQVRIX01PREUwCQkJCUJJVCgwKQorI2RlZmluZSBGT1JDRV9UU1lOQ19BQ0sJCQkJQklUKDcpCisjZGVmaW5lIEZPUkNFX0NNTl9BQ0sJCQkJQklUKDYpCisjZGVmaW5lIEZPUkNFX0NNTl9SRUFEWQkJCQlCSVQoNSkKKyNkZWZpbmUgRU5fUkNMS19ERUdMSVRDSAkJCUJJVCg0KQorI2RlZmluZSBCWVBBU1NfUlNNX0NEUl9SRVNFVAkJCUJJVCgzKQorI2RlZmluZSBCWVBBU1NfUlNNX1RTWU5DCQkJQklUKDIpCisjZGVmaW5lIEJZUEFTU19SU01fU0FNUF9DQUwJCQlCSVQoMSkKKyNkZWZpbmUgQllQQVNTX1JTTV9ETExfQ0FMCQkJQklUKDApCisKKy8qIEVNQUNfUVNFUkRFU19DT01fU1lTX0NMS19DVFJMICovCisjZGVmaW5lIFNZU0NMS19DTQkJCQlCSVQoNCkKKyNkZWZpbmUgU1lTQ0xLX0FDX0NPVVBMRQkJCUJJVCgzKQorCisvKiBFTUFDX1FTRVJERVNfQ09NX1BMTF9DTlRSTCAqLworI2RlZmluZSBPQ1BfRU4JCQkJCUJJVCg1KQorI2RlZmluZSBQTExfRElWX0ZGRU4JCQkJQklUKDIpCisjZGVmaW5lIFBMTF9ESVZfT1JECQkJCUJJVCgxKQorCisvKiBFTUFDX1FTRVJERVNfQ09NX1NZU0NMS19FTl9TRUwgKi8KKyNkZWZpbmUgU1lTQ0xLX1NFTF9DTU9TCQkJCUJJVCgzKQorCisvKiBFTUFDX1FTRVJERVNfQ09NX1JFU0VUU01fQ05UUkwgKi8KKyNkZWZpbmUgRlJRX1RVTkVfTU9ERQkJCQlCSVQoNCkKKworLyogRU1BQ19RU0VSREVTX0NPTV9QTExMT0NLX0NNUF9FTiAqLworI2RlZmluZSBQTExMT0NLX0NNUF9FTgkJCQlCSVQoMCkKKworLyogRU1BQ19RU0VSREVTX0NPTV9ERUNfU1RBUlQxICovCisjZGVmaW5lIERFQ19TVEFSVDFfTVVYCQkJCUJJVCg3KQorI2RlZmluZSBERUNfU1RBUlQxKHgpCQkJCSgoeCkgJiAweDdmKQorCisvKiBFTUFDX1FTRVJERVNfQ09NX0RJVl9GUkFDX1NUQVJUMSAqIEVNQUNfUVNFUkRFU19DT01fRElWX0ZSQUNfU1RBUlQyICovCisjZGVmaW5lIERJVl9GUkFDX1NUQVJUX01VWAkJCUJJVCg3KQorI2RlZmluZSBESVZfRlJBQ19TVEFSVCh4KQkJCSgoeCkgJiAweDdmKQorCisvKiBFTUFDX1FTRVJERVNfQ09NX0RJVl9GUkFDX1NUQVJUMyAqLworI2RlZmluZSBESVZfRlJBQ19TVEFSVDNfTVVYCQkJQklUKDQpCisjZGVmaW5lIERJVl9GUkFDX1NUQVJUMyh4KQkJCSgoeCkgJiAweGYpCisKKy8qIEVNQUNfUVNFUkRFU19DT01fREVDX1NUQVJUMiAqLworI2RlZmluZSBERUNfU1RBUlQyX01VWAkJCQlCSVQoMSkKKyNkZWZpbmUgREVDX1NUQVJUMgkJCQlCSVQoMCkKKworLyogRU1BQ19RU0VSREVTX0NPTV9SRVNFVF9TTSAqLworI2RlZmluZSBSRUFEWQkJCQkJQklUKDUpCisKKy8qIEVNQUNfUVNFUkRFU19UWF9UWF9FTVBfUE9TVDFfTFZMICovCisjZGVmaW5lIFRYX0VNUF9QT1NUMV9MVkxfTVVYCQkJQklUKDUpCisjZGVmaW5lIFRYX0VNUF9QT1NUMV9MVkwoeCkJCQkoKHgpICYgMHgxZikKKyNkZWZpbmUgVFhfRU1QX1BPU1QxX0xWTF9CTVNLCQkJMHgxZgorI2RlZmluZSBUWF9FTVBfUE9TVDFfTFZMX1NIRlQJCQkwCisKKy8qIEVNQUNfUVNFUkRFU19UWF9UWF9EUlZfTFZMICovCisjZGVmaW5lIFRYX0RSVl9MVkxfTVVYCQkJCUJJVCg0KQorI2RlZmluZSBUWF9EUlZfTFZMKHgpCQkJCSgoeCkgJiAweGYpCisKKy8qIEVNQUNfUVNFUkRFU19UWF9UUkFOX0RSVlJfRU1QX0VOICovCisjZGVmaW5lIEVNUF9FTl9NVVgJCQkJQklUKDEpCisjZGVmaW5lIEVNUF9FTgkJCQkJQklUKDApCisKKy8qIEVNQUNfUVNFUkRFU19SWF9DRFJfQ09OVFJPTCAmIEVNQUNfUVNFUkRFU19SWF9DRFJfQ09OVFJPTDIgKi8KKyNkZWZpbmUgSEJXX1BEX0VOCQkJCUJJVCg3KQorI2RlZmluZSBTRUNPTkRPUkRFUkVOQUJMRQkJCUJJVCg2KQorI2RlZmluZSBGSVJTVE9SREVSX1RIUkVTSCh4KQkJCSgoKHgpICYgMHg3KSA8PCAzKQorI2RlZmluZSBTRUNPTkRPUkRFUkdBSU4oeCkJCQkoKHgpICYgMHg3KQorCisvKiBFTUFDX1FTRVJERVNfUlhfUlhfRVFfR0FJTjEyICovCisjZGVmaW5lIFJYX0VRX0dBSU4yKHgpCQkJCSgoKHgpICYgMHhmKSA8PCA0KQorI2RlZmluZSBSWF9FUV9HQUlOMSh4KQkJCQkoKHgpICYgMHhmKQorCisvKiBFTUFDX1NHTUlJX1BIWV9TRVJERVNfU1RBUlQgKi8KKyNkZWZpbmUgU0VSREVTX1NUQVJUCQkJCUJJVCgwKQorCisvKiBFTUFDX1NHTUlJX1BIWV9DTU5fUFdSX0NUUkwgKi8KKyNkZWZpbmUgQklBU19FTgkJCQkJQklUKDYpCisjZGVmaW5lIFBMTF9FTgkJCQkJQklUKDUpCisjZGVmaW5lIFNZU0NMS19FTgkJCQlCSVQoNCkKKyNkZWZpbmUgQ0xLQlVGX0xfRU4JCQkJQklUKDMpCisjZGVmaW5lIFBMTF9UWENMS19FTgkJCQlCSVQoMSkKKyNkZWZpbmUgUExMX1JYQ0xLX0VOCQkJCUJJVCgwKQorCisvKiBFTUFDX1NHTUlJX1BIWV9SWF9QV1JfQ1RSTCAqLworI2RlZmluZSBMMF9SWF9TSUdERVRfRU4JCQkJQklUKDcpCisjZGVmaW5lIEwwX1JYX1RFUk1fTU9ERSh4KQkJCSgoKHgpICYgMykgPDwgNCkKKyNkZWZpbmUgTDBfUlhfSV9FTgkJCQlCSVQoMSkKKworLyogRU1BQ19TR01JSV9QSFlfVFhfUFdSX0NUUkwgKi8KKyNkZWZpbmUgTDBfVFhfRU4JCQkJQklUKDUpCisjZGVmaW5lIEwwX0NMS0JVRl9FTgkJCQlCSVQoNCkKKyNkZWZpbmUgTDBfVFJBTl9CSUFTX0VOCQkJCUJJVCgxKQorCisvKiBFTUFDX1NHTUlJX1BIWV9MQU5FX0NUUkwxICovCisjZGVmaW5lIEwwX1JYX0VRVUFMSVpFX0VOQUJMRQkJCUJJVCg2KQorI2RlZmluZSBMMF9SRVNFVF9UU1lOQ19FTgkJCUJJVCg0KQorI2RlZmluZSBMMF9EUlZfTFZMKHgpCQkJCSgoeCkgJiAweGYpCisKKy8qIEVNQUNfU0dNSUlfUEhZX0FVVE9ORUdfQ0ZHMiAqLworI2RlZmluZSBGT1JDRV9BTl9UWF9DRkcJCQkJQklUKDUpCisjZGVmaW5lIEZPUkNFX0FOX1JYX0NGRwkJCQlCSVQoNCkKKyNkZWZpbmUgQU5fRU5BQkxFCQkJCUJJVCgwKQorCisvKiBFTUFDX1NHTUlJX1BIWV9TUEVFRF9DRkcxICovCisjZGVmaW5lIERVUExFWF9NT0RFCQkJCUJJVCg0KQorI2RlZmluZSBTUERNT0RFXzEwMDAJCQkJQklUKDEpCisjZGVmaW5lIFNQRE1PREVfMTAwCQkJCUJJVCgwKQorI2RlZmluZSBTUERNT0RFXzEwCQkJCTAKKyNkZWZpbmUgU1BETU9ERV9CTVNLCQkJCTMKKyNkZWZpbmUgU1BETU9ERV9TSEZUCQkJCTAKKworLyogRU1BQ19TR01JSV9QSFlfUE9XX0RXTl9DVFJMMCAqLworI2RlZmluZSBQV1JETl9CCQkJCQlCSVQoMCkKKyNkZWZpbmUgQ0RSX01BWF9DTlQoeCkJCQkJKCh4KSAmIDB4ZmYpCisKKy8qIEVNQUNfUVNFUkRFU19UWF9CSVNUX01PREVfTEFORU5PICovCisjZGVmaW5lIEJJU1RfTEFORV9OVU1CRVIoeCkJCQkoKCh4KSAmIDMpIDw8IDUpCisjZGVmaW5lIEJJU1RNT0RFKHgpCQkJCSgoeCkgJiAweDFmKQorCisvKiBFTUFDX1FTRVJERVNfQ09NX1BMTExPQ0tfQ01QeCAqLworI2RlZmluZSBQTExMT0NLX0NNUCh4KQkJCQkoKHgpICYgMHhmZikKKworLyogRU1BQ19TR01JSV9QSFlfUkVTRVRfQ1RSTCAqLworI2RlZmluZSBQSFlfU1dfUkVTRVQJCQkJQklUKDApCisKKy8qIEVNQUNfU0dNSUlfUEhZX0lSUV9DTUQgKi8KKyNkZWZpbmUgSVJRX0dMT0JBTF9DTEVBUgkJCUJJVCgwKQorCisvKiBFTUFDX1NHTUlJX1BIWV9JTlRFUlJVUFRfTUFTSyAqLworI2RlZmluZSBERUNPREVfQ09ERV9FUlIJCQkJQklUKDcpCisjZGVmaW5lIERFQ09ERV9ESVNQX0VSUgkJCQlCSVQoNikKKyNkZWZpbmUgUExMX1VOTE9DSwkJCQlCSVQoNSkKKyNkZWZpbmUgQU5fSUxMRUdBTF9URVJNCQkJCUJJVCg0KQorI2RlZmluZSBTWU5DX0ZBSUwJCQkJQklUKDMpCisjZGVmaW5lIEFOX1NUQVJUCQkJCUJJVCgyKQorI2RlZmluZSBBTl9FTkQJCQkJCUJJVCgxKQorI2RlZmluZSBBTl9SRVFVRVNUCQkJCUJJVCgwKQorCisjZGVmaW5lIFNHTUlJX1BIWV9JUlFfQ0xSX1dBSVRfVElNRQkJMTAKKworI2RlZmluZSBTR01JSV9QSFlfSU5URVJSVVBUX0VSUiAoXAorCURFQ09ERV9DT0RFX0VSUiAgICAgICAgIHxcCisJREVDT0RFX0RJU1BfRVJSKQorCisjZGVmaW5lIFNHTUlJX0lTUl9BTl9NQVNLICAgICAgIChcCisJQU5fUkVRVUVTVCAgICAgICAgICAgICAgfFwKKwlBTl9TVEFSVCAgICAgICAgICAgICAgICB8XAorCUFOX0VORCAgICAgICAgICAgICAgICAgIHxcCisJQU5fSUxMRUdBTF9URVJNICAgICAgICAgfFwKKwlQTExfVU5MT0NLICAgICAgICAgICAgICB8XAorCVNZTkNfRkFJTCkKKworI2RlZmluZSBTR01JSV9JU1JfTUFTSyAgICAgICAgICAoXAorCVNHTUlJX1BIWV9JTlRFUlJVUFRfRVJSIHxcCisJU0dNSUlfSVNSX0FOX01BU0spCisKKy8qIFNHTUlJIFRYX0NPTkZJRyAqLworI2RlZmluZSBUWENGR19MSU5LCQkJCTB4ODAwMAorI2RlZmluZSBUWENGR19NT0RFX0JNU0sJCQkJMHgxYzAwCisjZGVmaW5lIFRYQ0ZHXzEwMDBfRlVMTAkJCQkweDE4MDAKKyNkZWZpbmUgVFhDRkdfMTAwX0ZVTEwJCQkJMHgxNDAwCisjZGVmaW5lIFRYQ0ZHXzEwMF9IQUxGCQkJCTB4MDQwMAorI2RlZmluZSBUWENGR18xMF9GVUxMCQkJCTB4MTAwMAorI2RlZmluZSBUWENGR18xMF9IQUxGCQkJCTB4MDAwMAorCisjZGVmaW5lIFNFUkRFU19TVEFSVF9XQUlUX1RJTUVTCQkJMTAwCisKK3N0cnVjdCBlbWFjX3JlZ193cml0ZSB7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwl1MzIgdmFsOworfTsKKworc3RhdGljIHZvaWQgZW1hY19yZWdfd3JpdGVfYWxsKHZvaWQgX19pb21lbSAqYmFzZSwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZW1hY19yZWdfd3JpdGUgKml0ciwgc2l6ZV90IHNpemUpCit7CisJc2l6ZV90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgKytpdHIsICsraSkKKwkJd3JpdGVsKGl0ci0+dmFsLCBiYXNlICsgaXRyLT5vZmZzZXQpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGVtYWNfcmVnX3dyaXRlIHBoeXNpY2FsX2NvZGluZ19zdWJsYXllcl9wcm9ncmFtbWluZ192MVtdID0geworCXtFTUFDX1NHTUlJX1BIWV9DRFJfQ1RSTDAsIENEUl9NQVhfQ05UKDE1KX0sCisJe0VNQUNfU0dNSUlfUEhZX1BPV19EV05fQ1RSTDAsIFBXUkROX0J9LAorCXtFTUFDX1NHTUlJX1BIWV9DTU5fUFdSX0NUUkwsCisJCUJJQVNfRU4gfCBTWVNDTEtfRU4gfCBDTEtCVUZfTF9FTiB8IFBMTF9UWENMS19FTiB8IFBMTF9SWENMS19FTn0sCisJe0VNQUNfU0dNSUlfUEhZX1RYX1BXUl9DVFJMLCBMMF9UWF9FTiB8IEwwX0NMS0JVRl9FTiB8IEwwX1RSQU5fQklBU19FTn0sCisJe0VNQUNfU0dNSUlfUEhZX1JYX1BXUl9DVFJMLAorCQlMMF9SWF9TSUdERVRfRU4gfCBMMF9SWF9URVJNX01PREUoMSkgfCBMMF9SWF9JX0VOfSwKKwl7RU1BQ19TR01JSV9QSFlfQ01OX1BXUl9DVFJMLAorCQlCSUFTX0VOIHwgUExMX0VOIHwgU1lTQ0xLX0VOIHwgQ0xLQlVGX0xfRU4gfCBQTExfVFhDTEtfRU4gfAorCQlQTExfUlhDTEtfRU59LAorCXtFTUFDX1NHTUlJX1BIWV9MQU5FX0NUUkwxLAorCQlMMF9SWF9FUVVBTElaRV9FTkFCTEUgfCBMMF9SRVNFVF9UU1lOQ19FTiB8IEwwX0RSVl9MVkwoMTUpfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZW1hY19yZWdfd3JpdGUgc3lzY2xrX3JlZmNsa19zZXR0aW5nW10gPSB7CisJe0VNQUNfUVNFUkRFU19DT01fU1lTQ0xLX0VOX1NFTCwgU1lTQ0xLX1NFTF9DTU9TfSwKKwl7RU1BQ19RU0VSREVTX0NPTV9TWVNfQ0xLX0NUUkwsCVNZU0NMS19DTSB8IFNZU0NMS19BQ19DT1VQTEV9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbWFjX3JlZ193cml0ZSBwbGxfc2V0dGluZ1tdID0geworCXtFTUFDX1FTRVJERVNfQ09NX1BMTF9JUF9TRVRJLCBQTExfSVBTRVRJKDEpfSwKKwl7RU1BQ19RU0VSREVTX0NPTV9QTExfQ1BfU0VUSSwgUExMX0NQU0VUSSg1OSl9LAorCXtFTUFDX1FTRVJERVNfQ09NX1BMTF9JUF9TRVRQLCBQTExfSVBTRVRQKDEwKX0sCisJe0VNQUNfUVNFUkRFU19DT01fUExMX0NQX1NFVFAsIFBMTF9DUFNFVFAoOSl9LAorCXtFTUFDX1FTRVJERVNfQ09NX1BMTF9DUkNUUkwsIFBMTF9SQ1RSTCgxNSkgfCBQTExfQ0NUUkwoMTEpfSwKKwl7RU1BQ19RU0VSREVTX0NPTV9QTExfQ05UUkwsIE9DUF9FTiB8IFBMTF9ESVZfRkZFTiB8IFBMTF9ESVZfT1JEfSwKKwl7RU1BQ19RU0VSREVTX0NPTV9ERUNfU1RBUlQxLCBERUNfU1RBUlQxX01VWCB8IERFQ19TVEFSVDEoMil9LAorCXtFTUFDX1FTRVJERVNfQ09NX0RFQ19TVEFSVDIsIERFQ19TVEFSVDJfTVVYIHwgREVDX1NUQVJUMn0sCisJe0VNQUNfUVNFUkRFU19DT01fRElWX0ZSQUNfU1RBUlQxLAorCQlESVZfRlJBQ19TVEFSVF9NVVggfCBESVZfRlJBQ19TVEFSVCg4NSl9LAorCXtFTUFDX1FTRVJERVNfQ09NX0RJVl9GUkFDX1NUQVJUMiwKKwkJRElWX0ZSQUNfU1RBUlRfTVVYIHwgRElWX0ZSQUNfU1RBUlQoNDIpfSwKKwl7RU1BQ19RU0VSREVTX0NPTV9ESVZfRlJBQ19TVEFSVDMsCisJCURJVl9GUkFDX1NUQVJUM19NVVggfCBESVZfRlJBQ19TVEFSVDMoMyl9LAorCXtFTUFDX1FTRVJERVNfQ09NX1BMTExPQ0tfQ01QMSwgUExMTE9DS19DTVAoNDMpfSwKKwl7RU1BQ19RU0VSREVTX0NPTV9QTExMT0NLX0NNUDIsIFBMTExPQ0tfQ01QKDEwNCl9LAorCXtFTUFDX1FTRVJERVNfQ09NX1BMTExPQ0tfQ01QMywgUExMTE9DS19DTVAoMCl9LAorCXtFTUFDX1FTRVJERVNfQ09NX1BMTExPQ0tfQ01QX0VOLCBQTExMT0NLX0NNUF9FTn0sCisJe0VNQUNfUVNFUkRFU19DT01fUkVTRVRTTV9DTlRSTCwgRlJRX1RVTkVfTU9ERX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVtYWNfcmVnX3dyaXRlIGNkcl9zZXR0aW5nW10gPSB7CisJe0VNQUNfUVNFUkRFU19SWF9DRFJfQ09OVFJPTCwKKwkJU0VDT05ET1JERVJFTkFCTEUgfCBGSVJTVE9SREVSX1RIUkVTSCgzKSB8IFNFQ09ORE9SREVSR0FJTigyKX0sCisJe0VNQUNfUVNFUkRFU19SWF9DRFJfQ09OVFJPTDIsCisJCVNFQ09ORE9SREVSRU5BQkxFIHwgRklSU1RPUkRFUl9USFJFU0goMykgfCBTRUNPTkRPUkRFUkdBSU4oNCl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbWFjX3JlZ193cml0ZSB0eF9yeF9zZXR0aW5nW10gPSB7CisJe0VNQUNfUVNFUkRFU19UWF9CSVNUX01PREVfTEFORU5PLCAwfSwKKwl7RU1BQ19RU0VSREVTX1RYX1RYX0RSVl9MVkwsIFRYX0RSVl9MVkxfTVVYIHwgVFhfRFJWX0xWTCgxNSl9LAorCXtFTUFDX1FTRVJERVNfVFhfVFJBTl9EUlZSX0VNUF9FTiwgRU1QX0VOX01VWCB8IEVNUF9FTn0sCisJe0VNQUNfUVNFUkRFU19UWF9UWF9FTVBfUE9TVDFfTFZMLAorCQlUWF9FTVBfUE9TVDFfTFZMX01VWCB8IFRYX0VNUF9QT1NUMV9MVkwoMSl9LAorCXtFTUFDX1FTRVJERVNfUlhfUlhfRVFfR0FJTjEyLCBSWF9FUV9HQUlOMigxNSkgfCBSWF9FUV9HQUlOMSgxNSl9LAorCXtFTUFDX1FTRVJERVNfVFhfTEFORV9NT0RFLCBMQU5FX01PREUoOCl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbWFjX3JlZ193cml0ZSBzZ21paV92Ml9sYW5lZFtdID0geworCS8qIENEUiBTZXR0aW5ncyAqLworCXtFTUFDX1NHTUlJX0xOX1VDRFJfRk9fR0FJTl9NT0RFMCwKKwkJVUNEUl9TVEVQX0JZX1RXT19NT0RFMCB8IFVDRFJfeE9fR0FJTl9NT0RFKDEwKX0sCisJe0VNQUNfU0dNSUlfTE5fVUNEUl9TT19HQUlOX01PREUwLCBVQ0RSX3hPX0dBSU5fTU9ERSg2KX0sCisJe0VNQUNfU0dNSUlfTE5fVUNEUl9TT19DT05GSUcsIFVDRFJfRU5BQkxFIHwgVUNEUl9TT19TQVRVUkFUSU9OKDEyKX0sCisKKwkvKiBUWC9SWCBTZXR0aW5ncyAqLworCXtFTUFDX1NHTUlJX0xOX1JYX0VOX1NJR05BTCwgU0lHREVUX0xQX0JZUF9QUzQgfCBTSUdERVRfRU5fUFMwX1RPX1BTMn0sCisKKwl7RU1BQ19TR01JSV9MTl9EUlZSX0NUUkwwLCBUWFZBTF9WQUxJRF9JTklUIHwgS1JfUENJR0VOM19NT0RFfSwKKwl7RU1BQ19TR01JSV9MTl9EUlZSX1RBUF9FTiwgTUFJTl9FTn0sCisJe0VNQUNfU0dNSUlfTE5fVFhfTUFSR0lOSU5HLCBUWF9NQVJHSU5JTkdfTVVYIHwgVFhfTUFSR0lOSU5HKDI1KX0sCisJe0VNQUNfU0dNSUlfTE5fVFhfUFJFLCBUWF9QUkVfTVVYfSwKKwl7RU1BQ19TR01JSV9MTl9UWF9QT1NULCBUWF9QT1NUX01VWH0sCisKKwl7RU1BQ19TR01JSV9MTl9DTUxfQ1RSTF9NT0RFMCwKKwkJQ01MX0dFQVJfTU9ERSgxKSB8IENNTDJDTU9TX0lCT09TVF9NT0RFKDEpfSwKKwl7RU1BQ19TR01JSV9MTl9NSVhFUl9DVFJMX01PREUwLAorCQlNSVhFUl9MT0FEQl9NT0RFKDEyKSB8IE1JWEVSX0RBVEFSQVRFX01PREUoMSl9LAorCXtFTUFDX1NHTUlJX0xOX1ZHQV9JTklUVkFMLCBWR0FfVEhSRVNIX0RGRSgzMSl9LAorCXtFTUFDX1NHTUlJX0xOX1NJR0RFVF9FTkFCTEVTLAorCQlTSUdERVRfTFBfQllQX1BTMF9UT19QUzIgfCBTSUdERVRfRkxUX0JZUH0sCisJe0VNQUNfU0dNSUlfTE5fU0lHREVUX0NOVFJMLCBTSUdERVRfTFZMKDgpfSwKKworCXtFTUFDX1NHTUlJX0xOX1NJR0RFVF9ERUdMSVRDSF9DTlRSTCwgU0lHREVUX0RFR0xJVENIX0NUUkwoNCl9LAorCXtFTUFDX1NHTUlJX0xOX1JYX01JU0NfQ05UUkwwLCAwfSwKKwl7RU1BQ19TR01JSV9MTl9EUlZSX0xPR0lDX0NMS0RJViwKKwkJRFJWUl9MT0dJQ19DTEtfRU4gfCBEUlZSX0xPR0lDX0NMS19ESVYoNCl9LAorCisJe0VNQUNfU0dNSUlfTE5fUEFSQUxMRUxfUkFURSwgUEFSQUxMRUxfUkFURV9NT0RFMCgxKX0sCisJe0VNQUNfU0dNSUlfTE5fVFhfQkFORF9NT0RFLCBCQU5EX01PREUwKDIpfSwKKwl7RU1BQ19TR01JSV9MTl9SWF9CQU5ELCBCQU5EX01PREUwKDMpfSwKKwl7RU1BQ19TR01JSV9MTl9MQU5FX01PREUsIExBTkVfTU9ERSgyNil9LAorCXtFTUFDX1NHTUlJX0xOX1JYX1JDVlJfUEFUSDFfTU9ERTAsIENEUl9QRF9TRUxfTU9ERTAoMyl9LAorCXtFTUFDX1NHTUlJX0xOX1JTTV9DT05GSUcsIEJZUEFTU19SU01fU0FNUF9DQUwgfCBCWVBBU1NfUlNNX0RMTF9DQUx9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbWFjX3JlZ193cml0ZSBwaHlzaWNhbF9jb2Rpbmdfc3VibGF5ZXJfcHJvZ3JhbW1pbmdfdjJbXSA9IHsKKwl7RU1BQ19TR01JSV9QSFlfUE9XX0RXTl9DVFJMMCwgUFdSRE5fQn0sCisJe0VNQUNfU0dNSUlfUEhZX0NEUl9DVFJMMCwgQ0RSX01BWF9DTlQoMTUpfSwKKwl7RU1BQ19TR01JSV9QSFlfVFhfUFdSX0NUUkwsIDB9LAorCXtFTUFDX1NHTUlJX1BIWV9MQU5FX0NUUkwxLCBMMF9SWF9FUVVBTElaRV9FTkFCTEV9LAorfTsKKworc3RhdGljIGludCBlbWFjX3NnbWlpX2xpbmtfaW5pdChzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBhZHB0LT5waHlkZXY7CisJc3RydWN0IGVtYWNfcGh5ICpwaHkgPSAmYWRwdC0+cGh5OworCXUzMiB2YWw7CisKKwl2YWwgPSByZWFkbChwaHktPmJhc2UgKyBFTUFDX1NHTUlJX1BIWV9BVVRPTkVHX0NGRzIpOworCisJaWYgKHBoeWRldi0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQl2YWwgJj0gfihGT1JDRV9BTl9SWF9DRkcgfCBGT1JDRV9BTl9UWF9DRkcpOworCQl2YWwgfD0gQU5fRU5BQkxFOworCQl3cml0ZWwodmFsLCBwaHktPmJhc2UgKyBFTUFDX1NHTUlJX1BIWV9BVVRPTkVHX0NGRzIpOworCX0gZWxzZSB7CisJCXUzMiBzcGVlZF9jZmc7CisKKwkJc3dpdGNoIChwaHlkZXYtPnNwZWVkKSB7CisJCWNhc2UgU1BFRURfMTA6CisJCQlzcGVlZF9jZmcgPSBTUERNT0RFXzEwOworCQkJYnJlYWs7CisJCWNhc2UgU1BFRURfMTAwOgorCQkJc3BlZWRfY2ZnID0gU1BETU9ERV8xMDA7CisJCQlicmVhazsKKwkJY2FzZSBTUEVFRF8xMDAwOgorCQkJc3BlZWRfY2ZnID0gU1BETU9ERV8xMDAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChwaHlkZXYtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwkJCXNwZWVkX2NmZyB8PSBEVVBMRVhfTU9ERTsKKworCQl2YWwgJj0gfkFOX0VOQUJMRTsKKwkJd3JpdGVsKHNwZWVkX2NmZywgcGh5LT5iYXNlICsgRU1BQ19TR01JSV9QSFlfU1BFRURfQ0ZHMSk7CisJCXdyaXRlbCh2YWwsIHBoeS0+YmFzZSArIEVNQUNfU0dNSUlfUEhZX0FVVE9ORUdfQ0ZHMik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW1hY19zZ21paV9pcnFfY2xlYXIoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCwgdTMyIGlycV9iaXRzKQoreworCXN0cnVjdCBlbWFjX3BoeSAqcGh5ID0gJmFkcHQtPnBoeTsKKwl1MzIgc3RhdHVzOworCisJd3JpdGVsX3JlbGF4ZWQoaXJxX2JpdHMsIHBoeS0+YmFzZSArIEVNQUNfU0dNSUlfUEhZX0lOVEVSUlVQVF9DTEVBUik7CisJd3JpdGVsX3JlbGF4ZWQoSVJRX0dMT0JBTF9DTEVBUiwgcGh5LT5iYXNlICsgRU1BQ19TR01JSV9QSFlfSVJRX0NNRCk7CisJLyogRW5zdXJlIGludGVycnVwdCBjbGVhciBjb21tYW5kIGlzIHdyaXR0ZW4gdG8gSFcgKi8KKwl3bWIoKTsKKworCS8qIEFmdGVyIHNldCB0aGUgSVJRX0dMT0JBTF9DTEVBUiBiaXQsIHRoZSBzdGF0dXMgY2xlYXJpbmcgbXVzdAorCSAqIGJlIGNvbmZpcm1lZCBiZWZvcmUgY2xlYXJpbmcgdGhlIGJpdHMgaW4gb3RoZXIgcmVnaXN0ZXJzLgorCSAqIEl0IHRha2VzIGEgZmV3IGN5Y2xlcyBmb3IgaHcgdG8gY2xlYXIgdGhlIGludGVycnVwdCBzdGF0dXMuCisJICovCisJaWYgKHJlYWRsX3BvbGxfdGltZW91dF9hdG9taWMocGh5LT5iYXNlICsKKwkJCQkgICAgICBFTUFDX1NHTUlJX1BIWV9JTlRFUlJVUFRfU1RBVFVTLAorCQkJCSAgICAgIHN0YXR1cywgIShzdGF0dXMgJiBpcnFfYml0cyksIDEsCisJCQkJICAgICAgU0dNSUlfUEhZX0lSUV9DTFJfV0FJVF9USU1FKSkgeworCQluZXRkZXZfZXJyKGFkcHQtPm5ldGRldiwKKwkJCSAgICJlcnJvcjogZmFpbGVkIGNsZWFyIFNHTUlJIGlycTogc3RhdHVzOjB4JXggYml0czoweCV4XG4iLAorCQkJICAgc3RhdHVzLCBpcnFfYml0cyk7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIEZpbmFsaXplIGNsZWFyaW5nIHByb2NlZHVyZSAqLworCXdyaXRlbF9yZWxheGVkKDAsIHBoeS0+YmFzZSArIEVNQUNfU0dNSUlfUEhZX0lSUV9DTUQpOworCXdyaXRlbF9yZWxheGVkKDAsIHBoeS0+YmFzZSArIEVNQUNfU0dNSUlfUEhZX0lOVEVSUlVQVF9DTEVBUik7CisKKwkvKiBFbnN1cmUgdGhhdCBjbGVhcmluZyBwcm9jZWR1cmUgZmluYWxpemF0aW9uIGlzIHdyaXR0ZW4gdG8gSFcgKi8KKwl3bWIoKTsKKworCXJldHVybiAwOworfQorCitpbnQgZW1hY19zZ21paV9pbml0X3YxKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJc3RydWN0IGVtYWNfcGh5ICpwaHkgPSAmYWRwdC0+cGh5OworCXVuc2lnbmVkIGludCBpOworCWludCByZXQ7CisKKwlyZXQgPSBlbWFjX3NnbWlpX2xpbmtfaW5pdChhZHB0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZW1hY19yZWdfd3JpdGVfYWxsKHBoeS0+YmFzZSwgcGh5c2ljYWxfY29kaW5nX3N1YmxheWVyX3Byb2dyYW1taW5nX3YxLAorCQkJICAgQVJSQVlfU0laRShwaHlzaWNhbF9jb2Rpbmdfc3VibGF5ZXJfcHJvZ3JhbW1pbmdfdjEpKTsKKwllbWFjX3JlZ193cml0ZV9hbGwocGh5LT5iYXNlLCBzeXNjbGtfcmVmY2xrX3NldHRpbmcsCisJCQkgICBBUlJBWV9TSVpFKHN5c2Nsa19yZWZjbGtfc2V0dGluZykpOworCWVtYWNfcmVnX3dyaXRlX2FsbChwaHktPmJhc2UsIHBsbF9zZXR0aW5nLCBBUlJBWV9TSVpFKHBsbF9zZXR0aW5nKSk7CisJZW1hY19yZWdfd3JpdGVfYWxsKHBoeS0+YmFzZSwgY2RyX3NldHRpbmcsIEFSUkFZX1NJWkUoY2RyX3NldHRpbmcpKTsKKwllbWFjX3JlZ193cml0ZV9hbGwocGh5LT5iYXNlLCB0eF9yeF9zZXR0aW5nLAorCQkJICAgQVJSQVlfU0laRSh0eF9yeF9zZXR0aW5nKSk7CisKKwkvKiBQb3dlciB1cCB0aGUgU2VyL0RlcyBlbmdpbmUgKi8KKwl3cml0ZWwoU0VSREVTX1NUQVJULCBwaHktPmJhc2UgKyBFTUFDX1NHTUlJX1BIWV9TRVJERVNfU1RBUlQpOworCisJZm9yIChpID0gMDsgaSA8IFNFUkRFU19TVEFSVF9XQUlUX1RJTUVTOyBpKyspIHsKKwkJaWYgKHJlYWRsKHBoeS0+YmFzZSArIEVNQUNfUVNFUkRFU19DT01fUkVTRVRfU00pICYgUkVBRFkpCisJCQlicmVhazsKKwkJdXNsZWVwX3JhbmdlKDEwMCwgMjAwKTsKKwl9CisKKwlpZiAoaSA9PSBTRVJERVNfU1RBUlRfV0FJVF9USU1FUykgeworCQluZXRkZXZfZXJyKGFkcHQtPm5ldGRldiwgImVycm9yOiBzZXIvZGVzIGZhaWxlZCB0byBzdGFydFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwkvKiBNYXNrIG91dCBhbGwgdGhlIFNHTUlJIEludGVycnVwdCAqLworCXdyaXRlbCgwLCBwaHktPmJhc2UgKyBFTUFDX1NHTUlJX1BIWV9JTlRFUlJVUFRfTUFTSyk7CisKKwllbWFjX3NnbWlpX2lycV9jbGVhcihhZHB0LCBTR01JSV9QSFlfSU5URVJSVVBUX0VSUik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGVtYWNfc2dtaWlfaW5pdF92MihzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXN0cnVjdCBlbWFjX3BoeSAqcGh5ID0gJmFkcHQtPnBoeTsKKwl2b2lkIF9faW9tZW0gKnBoeV9yZWdzID0gcGh5LT5iYXNlOworCXZvaWQgX19pb21lbSAqbGFuZWQgPSBwaHktPmRpZ2l0YWw7CisJdW5zaWduZWQgaW50IGk7CisJdTMyIGxuc3RhdHVzOworCWludCByZXQ7CisKKwlyZXQgPSBlbWFjX3NnbWlpX2xpbmtfaW5pdChhZHB0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogUENTIGxhbmUteCBpbml0ICovCisJZW1hY19yZWdfd3JpdGVfYWxsKHBoeS0+YmFzZSwgcGh5c2ljYWxfY29kaW5nX3N1YmxheWVyX3Byb2dyYW1taW5nX3YyLAorCQkJICAgQVJSQVlfU0laRShwaHlzaWNhbF9jb2Rpbmdfc3VibGF5ZXJfcHJvZ3JhbW1pbmdfdjIpKTsKKworCS8qIFNHTUlJIGxhbmUteCBpbml0ICovCisJZW1hY19yZWdfd3JpdGVfYWxsKHBoeS0+ZGlnaXRhbCwKKwkJCSAgIHNnbWlpX3YyX2xhbmVkLCBBUlJBWV9TSVpFKHNnbWlpX3YyX2xhbmVkKSk7CisKKwkvKiBQb3dlciB1cCBQQ1MgYW5kIHN0YXJ0IHJlc2V0IGxhbmUgc3RhdGUgbWFjaGluZSAqLworCisJd3JpdGVsKDAsIHBoeV9yZWdzICsgRU1BQ19TR01JSV9QSFlfUkVTRVRfQ1RSTCk7CisJd3JpdGVsKDEsIGxhbmVkICsgU0dNSUlfTE5fUlNNX1NUQVJUKTsKKworCS8qIFdhaXQgZm9yIGNfcmVhZHkgYXNzZXJ0aW9uICovCisJZm9yIChpID0gMDsgaSA8IFNFUkRFU19TVEFSVF9XQUlUX1RJTUVTOyBpKyspIHsKKwkJbG5zdGF0dXMgPSByZWFkbChwaHlfcmVncyArIFNHTUlJX1BIWV9MTl9MQU5FX1NUQVRVUyk7CisJCWlmIChsbnN0YXR1cyAmIEJJVCgxKSkKKwkJCWJyZWFrOworCQl1c2xlZXBfcmFuZ2UoMTAwLCAyMDApOworCX0KKworCWlmIChpID09IFNFUkRFU19TVEFSVF9XQUlUX1RJTUVTKSB7CisJCW5ldGRldl9lcnIoYWRwdC0+bmV0ZGV2LCAiU0dNSUkgZmFpbGVkIHRvIHN0YXJ0XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogRGlzYWJsZSBkaWdpdGFsIGFuZCBTRVJERVMgbG9vcGJhY2sgKi8KKwl3cml0ZWwoMCwgcGh5X3JlZ3MgKyBTR01JSV9QSFlfTE5fQklTVF9HRU4wKTsKKwl3cml0ZWwoMCwgcGh5X3JlZ3MgKyBTR01JSV9QSFlfTE5fQklTVF9HRU4yKTsKKwl3cml0ZWwoMCwgcGh5X3JlZ3MgKyBTR01JSV9QSFlfTE5fQ0RSX0NUUkwxKTsKKworCS8qIE1hc2sgb3V0IGFsbCB0aGUgU0dNSUkgSW50ZXJydXB0ICovCisJd3JpdGVsKDAsIHBoeV9yZWdzICsgRU1BQ19TR01JSV9QSFlfSU5URVJSVVBUX01BU0spOworCisJZW1hY19zZ21paV9pcnFfY2xlYXIoYWRwdCwgU0dNSUlfUEhZX0lOVEVSUlVQVF9FUlIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVtYWNfc2dtaWlfcmVzZXRfcHJlcGFyZShzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXN0cnVjdCBlbWFjX3BoeSAqcGh5ID0gJmFkcHQtPnBoeTsKKwl1MzIgdmFsOworCisJLyogUmVzZXQgUEhZICovCisJdmFsID0gcmVhZGwocGh5LT5iYXNlICsgRU1BQ19FTUFDX1dSQVBQRVJfQ1NSMik7CisJd3JpdGVsKCgodmFsICYgflBIWV9SRVNFVCkgfCBQSFlfUkVTRVQpLCBwaHktPmJhc2UgKworCSAgICAgICBFTUFDX0VNQUNfV1JBUFBFUl9DU1IyKTsKKwkvKiBFbnN1cmUgcGh5LXJlc2V0IGNvbW1hbmQgaXMgd3JpdHRlbiB0byBIVyBiZWZvcmUgdGhlIHJlbGVhc2UgY21kICovCisJbXNsZWVwKDUwKTsKKwl2YWwgPSByZWFkbChwaHktPmJhc2UgKyBFTUFDX0VNQUNfV1JBUFBFUl9DU1IyKTsKKwl3cml0ZWwoKHZhbCAmIH5QSFlfUkVTRVQpLCBwaHktPmJhc2UgKyBFTUFDX0VNQUNfV1JBUFBFUl9DU1IyKTsKKwkvKiBFbnN1cmUgcGh5LXJlc2V0IHJlbGVhc2UgY29tbWFuZCBpcyB3cml0dGVuIHRvIEhXIGJlZm9yZSBpbml0aWFsaXppbmcKKwkgKiBTR01JSQorCSAqLworCW1zbGVlcCg1MCk7Cit9CisKK3ZvaWQgZW1hY19zZ21paV9yZXNldChzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCWludCByZXQ7CisKKwljbGtfc2V0X3JhdGUoYWRwdC0+Y2xrW0VNQUNfQ0xLX0hJR0hfU1BFRURdLCAxOTIwMDAwMCk7CisJZW1hY19zZ21paV9yZXNldF9wcmVwYXJlKGFkcHQpOworCisJcmV0ID0gYWRwdC0+cGh5LmluaXRpYWxpemUoYWRwdCk7CisJaWYgKHJldCkKKwkJbmV0ZGV2X2VycihhZHB0LT5uZXRkZXYsCisJCQkgICAiY291bGQgbm90IHJlaW5pdGlhbGl6ZSBpbnRlcm5hbCBQSFkgKGVycm9yPSVpKVxuIiwKKwkJCSAgIHJldCk7CisKKwljbGtfc2V0X3JhdGUoYWRwdC0+Y2xrW0VNQUNfQ0xLX0hJR0hfU1BFRURdLCAxMjUwMDAwMDApOworfQorCitzdGF0aWMgaW50IGVtYWNfc2dtaWlfYWNwaV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCBtYXRjaF90YWJsZVtdID0geworCQl7CisJCQkuaWQgPSAiUUNPTTgwNzEiLAorCQkJLmRyaXZlcl9kYXRhID0gKGtlcm5lbF91bG9uZ190KWVtYWNfc2dtaWlfaW5pdF92MiwKKwkJfSwKKwkJe30KKwl9OworCWNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCAqaWQgPSBhY3BpX21hdGNoX2RldmljZShtYXRjaF90YWJsZSwgZGV2KTsKKwllbWFjX3NnbWlpX2luaXRpYWxpemUgKmluaXRpYWxpemUgPSBkYXRhOworCisJaWYgKGlkKQorCQkqaW5pdGlhbGl6ZSA9IChlbWFjX3NnbWlpX2luaXRpYWxpemUpaWQtPmRyaXZlcl9kYXRhOworCisJcmV0dXJuICEhaWQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGVtYWNfc2dtaWlfZHRfbWF0Y2hbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0gInFjb20sZnNtOTkwMC1lbWFjLXNnbWlpIiwKKwkJLmRhdGEgPSBlbWFjX3NnbWlpX2luaXRfdjEsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInFjb20scWRmMjQzMi1lbWFjLXNnbWlpIiwKKwkJLmRhdGEgPSBlbWFjX3NnbWlpX2luaXRfdjIsCisJfSwKKwl7fQorfTsKKworaW50IGVtYWNfc2dtaWlfY29uZmlnKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2dtaWlfcGRldiA9IE5VTEw7CisJc3RydWN0IGVtYWNfcGh5ICpwaHkgPSAmYWRwdC0+cGh5OworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCByZXQ7CisKKwlpZiAoaGFzX2FjcGlfY29tcGFuaW9uKCZwZGV2LT5kZXYpKSB7CisJCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCQlkZXYgPSBkZXZpY2VfZmluZF9jaGlsZCgmcGRldi0+ZGV2LCAmcGh5LT5pbml0aWFsaXplLAorCQkJCQllbWFjX3NnbWlpX2FjcGlfbWF0Y2gpOworCisJCWlmICghZGV2KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgZmluZCBpbnRlcm5hbCBwaHkgbm9kZVxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCisJCXNnbWlpX3BkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwl9IGVsc2UgeworCQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKKwkJc3RydWN0IGRldmljZV9ub2RlICpucDsKKworCQlucCA9IG9mX3BhcnNlX3BoYW5kbGUocGRldi0+ZGV2Lm9mX25vZGUsICJpbnRlcm5hbC1waHkiLCAwKTsKKwkJaWYgKCFucCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAibWlzc2luZyBpbnRlcm5hbC1waHkgcHJvcGVydHlcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQlzZ21paV9wZGV2ID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShucCk7CisJCWlmICghc2dtaWlfcGRldikgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiaW52YWxpZCBpbnRlcm5hbC1waHkgcHJvcGVydHlcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQltYXRjaCA9IG9mX21hdGNoX2RldmljZShlbWFjX3NnbWlpX2R0X21hdGNoLCAmc2dtaWlfcGRldi0+ZGV2KTsKKwkJaWYgKCFtYXRjaCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5yZWNvZ25pemVkIGludGVybmFsIHBoeSBub2RlXG4iKTsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIGVycm9yX3B1dF9kZXZpY2U7CisJCX0KKworCQlwaHktPmluaXRpYWxpemUgPSAoZW1hY19zZ21paV9pbml0aWFsaXplKW1hdGNoLT5kYXRhOworCX0KKworCS8qIEJhc2UgYWRkcmVzcyBpcyB0aGUgZmlyc3QgYWRkcmVzcyAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShzZ21paV9wZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcl9wdXRfZGV2aWNlOworCX0KKworCXBoeS0+YmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAoIXBoeS0+YmFzZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX3B1dF9kZXZpY2U7CisJfQorCisJLyogdjIgU0dNSUkgaGFzIGEgcGVyLWxhbmUgZGlnaXRhbCBkaWdpdGFsLCBzbyBwYXJzZSBpdCBpZiBpdCBleGlzdHMgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2Uoc2dtaWlfcGRldiwgSU9SRVNPVVJDRV9NRU0sIDEpOworCWlmIChyZXMpIHsKKwkJcGh5LT5kaWdpdGFsID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCQlpZiAoIXBoeS0+ZGlnaXRhbCkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyb3JfdW5tYXBfYmFzZTsKKwkJfQorCX0KKworCXJldCA9IHBoeS0+aW5pdGlhbGl6ZShhZHB0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJLyogV2UndmUgcmVtYXBwZWQgdGhlIGFkZHJlc3Nlcywgc28gd2UgZG9uJ3QgbmVlZCB0aGUgZGV2aWNlIGFueQorCSAqIG1vcmUuICBvZl9maW5kX2RldmljZV9ieV9ub2RlKCkgc2F5cyB3ZSBzaG91bGQgcmVsZWFzZSBpdC4KKwkgKi8KKwlwdXRfZGV2aWNlKCZzZ21paV9wZGV2LT5kZXYpOworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCWlmIChwaHktPmRpZ2l0YWwpCisJCWlvdW5tYXAocGh5LT5kaWdpdGFsKTsKK2Vycm9yX3VubWFwX2Jhc2U6CisJaW91bm1hcChwaHktPmJhc2UpOworZXJyb3JfcHV0X2RldmljZToKKwlwdXRfZGV2aWNlKCZzZ21paV9wZGV2LT5kZXYpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL2VtYWMvZW1hYy1zZ21paS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy9lbWFjLXNnbWlpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U3OTIxMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL2VtYWMvZW1hYy1zZ21paS5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX0VNQUNfU0dNSUlfSF8KKyNkZWZpbmUgX0VNQUNfU0dNSUlfSF8KKworc3RydWN0IGVtYWNfYWRhcHRlcjsKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2U7CisKK2ludCBlbWFjX3NnbWlpX2luaXRfdjEoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCk7CitpbnQgZW1hY19zZ21paV9pbml0X3YyKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpOworaW50IGVtYWNfc2dtaWlfY29uZmlnKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpOwordm9pZCBlbWFjX3NnbWlpX3Jlc2V0KHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL2VtYWMvZW1hYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy9lbWFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJmM2IyYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL2VtYWMvZW1hYy5jCkBAIC0wLDAgKzEsNzU1IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKiBRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gRU1BQyBHaWdhYml0IEV0aGVybmV0IERyaXZlciAqLworCisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlICJlbWFjLmgiCisjaW5jbHVkZSAiZW1hYy1tYWMuaCIKKyNpbmNsdWRlICJlbWFjLXBoeS5oIgorI2luY2x1ZGUgImVtYWMtc2dtaWkuaCIKKworI2RlZmluZSBFTUFDX01TR19ERUZBVUxUIChORVRJRl9NU0dfRFJWIHwgTkVUSUZfTVNHX1BST0JFIHwgTkVUSUZfTVNHX0xJTksgfCAgXAorCQlORVRJRl9NU0dfVElNRVIgfCBORVRJRl9NU0dfSUZET1dOIHwgTkVUSUZfTVNHX0lGVVApCisKKyNkZWZpbmUgRU1BQ19SUkRfU0laRQkJCQkJICAgICA0CisvKiBUaGUgUlJEIHNpemUgaWYgdGltZXN0YW1waW5nIGlzIGVuYWJsZWQ6ICovCisjZGVmaW5lIEVNQUNfVFNfUlJEX1NJWkUJCQkJICAgICA2CisjZGVmaW5lIEVNQUNfVFBEX1NJWkUJCQkJCSAgICAgNAorI2RlZmluZSBFTUFDX1JGRF9TSVpFCQkJCQkgICAgIDIKKworI2RlZmluZSBSRUdfTUFDX1JYX1NUQVRVU19CSU4JCSBFTUFDX1JYTUFDX1NUQVRDX1JFRzAKKyNkZWZpbmUgUkVHX01BQ19SWF9TVEFUVVNfRU5ECQlFTUFDX1JYTUFDX1NUQVRDX1JFRzIyCisjZGVmaW5lIFJFR19NQUNfVFhfU1RBVFVTX0JJTgkJIEVNQUNfVFhNQUNfU1RBVENfUkVHMAorI2RlZmluZSBSRUdfTUFDX1RYX1NUQVRVU19FTkQJCUVNQUNfVFhNQUNfU1RBVENfUkVHMjQKKworI2RlZmluZSBSWFEwX05VTV9SRkRfUFJFRl9ERUYJCQkJICAgICA4CisjZGVmaW5lIFRYUTBfTlVNX1RQRF9QUkVGX0RFRgkJCQkgICAgIDUKKworI2RlZmluZSBFTUFDX1BSRUFNQkxFX0RFRgkJCQkgICAgIDcKKworI2RlZmluZSBETUFSX0RMWV9DTlRfREVGCQkJCSAgICAxNQorI2RlZmluZSBETUFXX0RMWV9DTlRfREVGCQkJCSAgICAgNAorCisjZGVmaW5lIElNUl9OT1JNQUxfTUFTSyAgICAgICAgIChcCisJCUlTUl9FUlJPUiAgICAgICB8XAorCQlJU1JfR1BIWV9MSU5LICAgfFwKKwkJSVNSX1RYX1BLVCAgICAgIHxcCisJCUdQSFlfV0FLRVVQX0lOVCkKKworI2RlZmluZSBJTVJfRVhURU5ERURfTUFTSyAgICAgICAoXAorCQlTV19NQU5fSU5UICAgICAgfFwKKwkJSVNSX09WRVIgICAgICAgIHxcCisJCUlTUl9FUlJPUiAgICAgICB8XAorCQlJU1JfR1BIWV9MSU5LICAgfFwKKwkJSVNSX1RYX1BLVCAgICAgIHxcCisJCUdQSFlfV0FLRVVQX0lOVCkKKworI2RlZmluZSBJU1JfVFhfUEtUICAgICAgKFwKKwlUWF9QS1RfSU5UICAgICAgfFwKKwlUWF9QS1RfSU5UMSAgICAgfFwKKwlUWF9QS1RfSU5UMiAgICAgfFwKKwlUWF9QS1RfSU5UMykKKworI2RlZmluZSBJU1JfR1BIWV9MSU5LICAgICAgICAoXAorCUdQSFlfTElOS19VUF9JTlQgICAgIHxcCisJR1BIWV9MSU5LX0RPV05fSU5UKQorCisjZGVmaW5lIElTUl9PVkVSICAgICAgICAoXAorCVJGRDBfVVJfSU5UICAgICB8XAorCVJGRDFfVVJfSU5UICAgICB8XAorCVJGRDJfVVJfSU5UICAgICB8XAorCVJGRDNfVVJfSU5UICAgICB8XAorCVJGRDRfVVJfSU5UICAgICB8XAorCVJYRl9PRl9JTlQgICAgICB8XAorCVRYRl9VUl9JTlQpCisKKyNkZWZpbmUgSVNSX0VSUk9SICAgICAgIChcCisJRE1BUl9UT19JTlQgICAgIHxcCisJRE1BV19UT19JTlQgICAgIHxcCisJVFhRX1RPX0lOVCkKKworLyogaW4gc3luYyB3aXRoIGVudW0gZW1hY19jbGtfaWQgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZW1hY19jbGtfbmFtZVtdID0geworCSJheGlfY2xrIiwgImNmZ19haGJfY2xrIiwgImhpZ2hfc3BlZWRfY2xrIiwgIm1kaW9fY2xrIiwgInR4X2NsayIsCisJInJ4X2NsayIsICJzeXNfY2xrIgorfTsKKwordm9pZCBlbWFjX3JlZ191cGRhdGUzMih2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiBtYXNrLCB1MzIgdmFsKQoreworCXUzMiBkYXRhID0gcmVhZGwoYWRkcik7CisKKwl3cml0ZWwoKChkYXRhICYgfm1hc2spIHwgdmFsKSwgYWRkcik7Cit9CisKKy8qIHJlaW5pdGlhbGl6ZSAqLworaW50IGVtYWNfcmVpbml0X2xvY2tlZChzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZhZHB0LT5yZXNldF9sb2NrKTsKKworCWVtYWNfbWFjX2Rvd24oYWRwdCk7CisJZW1hY19zZ21paV9yZXNldChhZHB0KTsKKwlyZXQgPSBlbWFjX21hY191cChhZHB0KTsKKworCW11dGV4X3VubG9jaygmYWRwdC0+cmVzZXRfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBOQVBJICovCitzdGF0aWMgaW50IGVtYWNfbmFwaV9ydHgoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQoreworCXN0cnVjdCBlbWFjX3J4X3F1ZXVlICpyeF9xID0KKwkJY29udGFpbmVyX29mKG5hcGksIHN0cnVjdCBlbWFjX3J4X3F1ZXVlLCBuYXBpKTsKKwlzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0ID0gbmV0ZGV2X3ByaXYocnhfcS0+bmV0ZGV2KTsKKwlzdHJ1Y3QgZW1hY19pcnEgKmlycSA9IHJ4X3EtPmlycTsKKwlpbnQgd29ya19kb25lID0gMDsKKworCWVtYWNfbWFjX3J4X3Byb2Nlc3MoYWRwdCwgcnhfcSwgJndvcmtfZG9uZSwgYnVkZ2V0KTsKKworCWlmICh3b3JrX2RvbmUgPCBidWRnZXQpIHsKKwkJbmFwaV9jb21wbGV0ZShuYXBpKTsKKworCQlpcnEtPm1hc2sgfD0gcnhfcS0+aW50cjsKKwkJd3JpdGVsKGlycS0+bWFzaywgYWRwdC0+YmFzZSArIEVNQUNfSU5UX01BU0spOworCX0KKworCXJldHVybiB3b3JrX2RvbmU7Cit9CisKKy8qIFRyYW5zbWl0IHRoZSBwYWNrZXQgKi8KK3N0YXRpYyBpbnQgZW1hY19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlyZXR1cm4gZW1hY19tYWNfdHhfYnVmX3NlbmQoYWRwdCwgJmFkcHQtPnR4X3EsIHNrYik7Cit9CisKK2lycXJldHVybl90IGVtYWNfaXNyKGludCBfaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBlbWFjX2lycSAqaXJxID0gZGF0YTsKKwlzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0ID0KKwkJY29udGFpbmVyX29mKGlycSwgc3RydWN0IGVtYWNfYWRhcHRlciwgaXJxKTsKKwlzdHJ1Y3QgZW1hY19yeF9xdWV1ZSAqcnhfcSA9ICZhZHB0LT5yeF9xOworCXUzMiBpc3IsIHN0YXR1czsKKworCS8qIGRpc2FibGUgdGhlIGludGVycnVwdCAqLworCXdyaXRlbCgwLCBhZHB0LT5iYXNlICsgRU1BQ19JTlRfTUFTSyk7CisKKwlpc3IgPSByZWFkbF9yZWxheGVkKGFkcHQtPmJhc2UgKyBFTUFDX0lOVF9TVEFUVVMpOworCisJc3RhdHVzID0gaXNyICYgaXJxLT5tYXNrOworCWlmIChzdGF0dXMgPT0gMCkKKwkJZ290byBleGl0OworCisJaWYgKHN0YXR1cyAmIElTUl9FUlJPUikgeworCQluZXRpZl93YXJuKGFkcHQsICBpbnRyLCBhZHB0LT5uZXRkZXYsCisJCQkgICAid2FybmluZzogZXJyb3IgaXJxIHN0YXR1cyAweCVseFxuIiwKKwkJCSAgIHN0YXR1cyAmIElTUl9FUlJPUik7CisJCS8qIHJlc2V0IE1BQyAqLworCQlzY2hlZHVsZV93b3JrKCZhZHB0LT53b3JrX3RocmVhZCk7CisJfQorCisJLyogU2NoZWR1bGUgdGhlIG5hcGkgZm9yIHJlY2VpdmUgcXVldWUgd2l0aCBpbnRlcnJ1cHQKKwkgKiBzdGF0dXMgYml0IHNldAorCSAqLworCWlmIChzdGF0dXMgJiByeF9xLT5pbnRyKSB7CisJCWlmIChuYXBpX3NjaGVkdWxlX3ByZXAoJnJ4X3EtPm5hcGkpKSB7CisJCQlpcnEtPm1hc2sgJj0gfnJ4X3EtPmludHI7CisJCQlfX25hcGlfc2NoZWR1bGUoJnJ4X3EtPm5hcGkpOworCQl9CisJfQorCisJaWYgKHN0YXR1cyAmIFRYX1BLVF9JTlQpCisJCWVtYWNfbWFjX3R4X3Byb2Nlc3MoYWRwdCwgJmFkcHQtPnR4X3EpOworCisJaWYgKHN0YXR1cyAmIElTUl9PVkVSKQorCQluZXRfd2Fybl9yYXRlbGltaXRlZCgid2FybmluZzogVFgvUlggb3ZlcmZsb3dcbiIpOworCisJLyogbGluayBldmVudCAqLworCWlmIChzdGF0dXMgJiBJU1JfR1BIWV9MSU5LKQorCQlwaHlfbWFjX2ludGVycnVwdChhZHB0LT5waHlkZXYsICEhKHN0YXR1cyAmIEdQSFlfTElOS19VUF9JTlQpKTsKKworZXhpdDoKKwkvKiBlbmFibGUgdGhlIGludGVycnVwdCAqLworCXdyaXRlbChpcnEtPm1hc2ssIGFkcHQtPmJhc2UgKyBFTUFDX0lOVF9NQVNLKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogQ29uZmlndXJlIFZMQU4gdGFnIHN0cmlwL2luc2VydCBmZWF0dXJlICovCitzdGF0aWMgaW50IGVtYWNfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQoreworCW5ldGRldl9mZWF0dXJlc190IGNoYW5nZWQgPSBmZWF0dXJlcyBeIG5ldGRldi0+ZmVhdHVyZXM7CisJc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwkvKiBXZSBvbmx5IG5lZWQgdG8gcmVwcm9ncmFtIHRoZSBoYXJkd2FyZSBpZiB0aGUgVkxBTiB0YWcgZmVhdHVyZXMKKwkgKiBoYXZlIGNoYW5nZWQsIGFuZCBpZiBpdCdzIGFscmVhZHkgcnVubmluZy4KKwkgKi8KKwlpZiAoIShjaGFuZ2VkICYgKE5FVElGX0ZfSFdfVkxBTl9DVEFHX1RYIHwgTkVUSUZfRl9IV19WTEFOX0NUQUdfUlgpKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwkJcmV0dXJuIDA7CisKKwkvKiBlbWFjX21hY19tb2RlX2NvbmZpZygpIHVzZXMgbmV0ZGV2LT5mZWF0dXJlcyB0byBjb25maWd1cmUgdGhlIEVNQUMsCisJICogc28gbWFrZSBzdXJlIGl0J3Mgc2V0IGZpcnN0LgorCSAqLworCW5ldGRldi0+ZmVhdHVyZXMgPSBmZWF0dXJlczsKKworCXJldHVybiBlbWFjX3JlaW5pdF9sb2NrZWQoYWRwdCk7Cit9CisKKy8qIENvbmZpZ3VyZSBNdWx0aWNhc3QgYW5kIFByb21pc2N1b3VzIG1vZGVzICovCitzdGF0aWMgdm9pZCBlbWFjX3J4X21vZGVfc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKKworCWVtYWNfbWFjX21vZGVfY29uZmlnKGFkcHQpOworCisJLyogdXBkYXRlIG11bHRpY2FzdCBhZGRyZXNzIGZpbHRlcmluZyAqLworCWVtYWNfbWFjX211bHRpY2FzdF9hZGRyX2NsZWFyKGFkcHQpOworCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBuZXRkZXYpCisJCWVtYWNfbWFjX211bHRpY2FzdF9hZGRyX3NldChhZHB0LCBoYS0+YWRkcik7Cit9CisKKy8qIENoYW5nZSB0aGUgTWF4aW11bSBUcmFuc2ZlciBVbml0IChNVFUpICovCitzdGF0aWMgaW50IGVtYWNfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgbmV3X210dSkKK3sKKwl1bnNpZ25lZCBpbnQgbWF4X2ZyYW1lID0gbmV3X210dSArIEVUSF9ITEVOICsgRVRIX0ZDU19MRU4gKyBWTEFOX0hMRU47CisJc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlpZiAoKG1heF9mcmFtZSA8IEVNQUNfTUlOX0VUSF9GUkFNRV9TSVpFKSB8fAorCSAgICAobWF4X2ZyYW1lID4gRU1BQ19NQVhfRVRIX0ZSQU1FX1NJWkUpKSB7CisJCW5ldGRldl9lcnIoYWRwdC0+bmV0ZGV2LCAiZXJyb3I6IGludmFsaWQgTVRVIHNldHRpbmdcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwluZXRpZl9pbmZvKGFkcHQsIGh3LCBhZHB0LT5uZXRkZXYsCisJCSAgICJjaGFuZ2luZyBNVFUgZnJvbSAlZCB0byAlZFxuIiwgbmV0ZGV2LT5tdHUsCisJCSAgIG5ld19tdHUpOworCW5ldGRldi0+bXR1ID0gbmV3X210dTsKKworCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJCXJldHVybiBlbWFjX3JlaW5pdF9sb2NrZWQoYWRwdCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGVkIHdoZW4gdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGlzIG1hZGUgYWN0aXZlICovCitzdGF0aWMgaW50IGVtYWNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCByZXQ7CisKKwkvKiBhbGxvY2F0ZSByeC90eCBkbWEgYnVmZmVyICYgZGVzY3JpcHRvcnMgKi8KKwlyZXQgPSBlbWFjX21hY19yeF90eF9yaW5nc19hbGxvY19hbGwoYWRwdCk7CisJaWYgKHJldCkgeworCQluZXRkZXZfZXJyKGFkcHQtPm5ldGRldiwgImVycm9yIGFsbG9jYXRpbmcgcngvdHggcmluZ3NcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGVtYWNfbWFjX3VwKGFkcHQpOworCWlmIChyZXQpIHsKKwkJZW1hY19tYWNfcnhfdHhfcmluZ3NfZnJlZV9hbGwoYWRwdCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZW1hY19tYWNfc3RhcnQoYWRwdCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGVkIHdoZW4gdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGlzIGRpc2FibGVkICovCitzdGF0aWMgaW50IGVtYWNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCW11dGV4X2xvY2soJmFkcHQtPnJlc2V0X2xvY2spOworCisJZW1hY19tYWNfZG93bihhZHB0KTsKKwllbWFjX21hY19yeF90eF9yaW5nc19mcmVlX2FsbChhZHB0KTsKKworCW11dGV4X3VubG9jaygmYWRwdC0+cmVzZXRfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVzcG9uZCB0byBhIFRYIGhhbmcgKi8KK3N0YXRpYyB2b2lkIGVtYWNfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJc2NoZWR1bGVfd29yaygmYWRwdC0+d29ya190aHJlYWQpOworfQorCisvKiBJT0NUTCBzdXBwb3J0IGZvciB0aGUgaW50ZXJmYWNlICovCitzdGF0aWMgaW50IGVtYWNfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJaWYgKCFuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFuZXRkZXYtPnBoeWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gcGh5X21paV9pb2N0bChuZXRkZXYtPnBoeWRldiwgaWZyLCBjbWQpOworfQorCisvKiBQcm92aWRlIG5ldHdvcmsgc3RhdGlzdGljcyBpbmZvIGZvciB0aGUgaW50ZXJmYWNlICovCitzdGF0aWMgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICplbWFjX2dldF9zdGF0czY0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJCQkgIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqbmV0X3N0YXRzKQoreworCXN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXVuc2lnbmVkIGludCBhZGRyID0gUkVHX01BQ19SWF9TVEFUVVNfQklOOworCXN0cnVjdCBlbWFjX3N0YXRzICpzdGF0cyA9ICZhZHB0LT5zdGF0czsKKwl1NjQgKnN0YXRzX2l0ciA9ICZhZHB0LT5zdGF0cy5yeF9vazsKKwl1MzIgdmFsOworCisJc3Bpbl9sb2NrKCZzdGF0cy0+bG9jayk7CisKKwl3aGlsZSAoYWRkciA8PSBSRUdfTUFDX1JYX1NUQVRVU19FTkQpIHsKKwkJdmFsID0gcmVhZGxfcmVsYXhlZChhZHB0LT5iYXNlICsgYWRkcik7CisJCSpzdGF0c19pdHIgKz0gdmFsOworCQlzdGF0c19pdHIrKzsKKwkJYWRkciArPSBzaXplb2YodTMyKTsKKwl9CisKKwkvKiBhZGRpdGlvbmFsIHJ4IHN0YXR1cyAqLworCXZhbCA9IHJlYWRsX3JlbGF4ZWQoYWRwdC0+YmFzZSArIEVNQUNfUlhNQUNfU1RBVENfUkVHMjMpOworCWFkcHQtPnN0YXRzLnJ4X2NyY19hbGlnbiArPSB2YWw7CisJdmFsID0gcmVhZGxfcmVsYXhlZChhZHB0LT5iYXNlICsgRU1BQ19SWE1BQ19TVEFUQ19SRUcyNCk7CisJYWRwdC0+c3RhdHMucnhfamFiYmVycyArPSB2YWw7CisKKwkvKiB1cGRhdGUgdHggc3RhdHVzICovCisJYWRkciA9IFJFR19NQUNfVFhfU1RBVFVTX0JJTjsKKwlzdGF0c19pdHIgPSAmYWRwdC0+c3RhdHMudHhfb2s7CisKKwl3aGlsZSAoYWRkciA8PSBSRUdfTUFDX1RYX1NUQVRVU19FTkQpIHsKKwkJdmFsID0gcmVhZGxfcmVsYXhlZChhZHB0LT5iYXNlICsgYWRkcik7CisJCSpzdGF0c19pdHIgKz0gdmFsOworCQkrK3N0YXRzX2l0cjsKKwkJYWRkciArPSBzaXplb2YodTMyKTsKKwl9CisKKwkvKiBhZGRpdGlvbmFsIHR4IHN0YXR1cyAqLworCXZhbCA9IHJlYWRsX3JlbGF4ZWQoYWRwdC0+YmFzZSArIEVNQUNfVFhNQUNfU1RBVENfUkVHMjUpOworCWFkcHQtPnN0YXRzLnR4X2NvbCArPSB2YWw7CisKKwkvKiByZXR1cm4gcGFyc2VkIHN0YXRpc3RpY3MgKi8KKwluZXRfc3RhdHMtPnJ4X3BhY2tldHMgPSBzdGF0cy0+cnhfb2s7CisJbmV0X3N0YXRzLT50eF9wYWNrZXRzID0gc3RhdHMtPnR4X29rOworCW5ldF9zdGF0cy0+cnhfYnl0ZXMgPSBzdGF0cy0+cnhfYnl0ZV9jbnQ7CisJbmV0X3N0YXRzLT50eF9ieXRlcyA9IHN0YXRzLT50eF9ieXRlX2NudDsKKwluZXRfc3RhdHMtPm11bHRpY2FzdCA9IHN0YXRzLT5yeF9tY2FzdDsKKwluZXRfc3RhdHMtPmNvbGxpc2lvbnMgPSBzdGF0cy0+dHhfMV9jb2wgKyBzdGF0cy0+dHhfMl9jb2wgKiAyICsKKwkJCQlzdGF0cy0+dHhfbGF0ZV9jb2wgKyBzdGF0cy0+dHhfYWJvcnRfY29sOworCisJbmV0X3N0YXRzLT5yeF9lcnJvcnMgPSBzdGF0cy0+cnhfZnJhZyArIHN0YXRzLT5yeF9mY3NfZXJyICsKKwkJCSAgICAgICBzdGF0cy0+cnhfbGVuX2VyciArIHN0YXRzLT5yeF9zel9vdiArCisJCQkgICAgICAgc3RhdHMtPnJ4X2FsaWduX2VycjsKKwluZXRfc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzID0gc3RhdHMtPnJ4X3J4Zl9vdjsKKwluZXRfc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgPSBzdGF0cy0+cnhfbGVuX2VycjsKKwluZXRfc3RhdHMtPnJ4X2NyY19lcnJvcnMgPSBzdGF0cy0+cnhfZmNzX2VycjsKKwluZXRfc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycyA9IHN0YXRzLT5yeF9hbGlnbl9lcnI7CisJbmV0X3N0YXRzLT5yeF9vdmVyX2Vycm9ycyA9IHN0YXRzLT5yeF9yeGZfb3Y7CisJbmV0X3N0YXRzLT5yeF9taXNzZWRfZXJyb3JzID0gc3RhdHMtPnJ4X3J4Zl9vdjsKKworCW5ldF9zdGF0cy0+dHhfZXJyb3JzID0gc3RhdHMtPnR4X2xhdGVfY29sICsgc3RhdHMtPnR4X2Fib3J0X2NvbCArCisJCQkgICAgICAgc3RhdHMtPnR4X3VuZGVycnVuICsgc3RhdHMtPnR4X3RydW5jOworCW5ldF9zdGF0cy0+dHhfZmlmb19lcnJvcnMgPSBzdGF0cy0+dHhfdW5kZXJydW47CisJbmV0X3N0YXRzLT50eF9hYm9ydGVkX2Vycm9ycyA9IHN0YXRzLT50eF9hYm9ydF9jb2w7CisJbmV0X3N0YXRzLT50eF93aW5kb3dfZXJyb3JzID0gc3RhdHMtPnR4X2xhdGVfY29sOworCisJc3Bpbl91bmxvY2soJnN0YXRzLT5sb2NrKTsKKworCXJldHVybiBuZXRfc3RhdHM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgZW1hY19uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbgkJPSBlbWFjX29wZW4sCisJLm5kb19zdG9wCQk9IGVtYWNfY2xvc2UsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisJLm5kb19zdGFydF94bWl0CQk9IGVtYWNfc3RhcnRfeG1pdCwKKwkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGV0aF9tYWNfYWRkciwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZW1hY19jaGFuZ2VfbXR1LAorCS5uZG9fZG9faW9jdGwJCT0gZW1hY19pb2N0bCwKKwkubmRvX3R4X3RpbWVvdXQJCT0gZW1hY190eF90aW1lb3V0LAorCS5uZG9fZ2V0X3N0YXRzNjQJPSBlbWFjX2dldF9zdGF0czY0LAorCS5uZG9fc2V0X2ZlYXR1cmVzICAgICAgID0gZW1hY19zZXRfZmVhdHVyZXMsCisJLm5kb19zZXRfcnhfbW9kZSAgICAgICAgPSBlbWFjX3J4X21vZGVfc2V0LAorfTsKKworLyogV2F0Y2hkb2cgdGFzayByb3V0aW5lLCBjYWxsZWQgdG8gcmVpbml0aWFsaXplIHRoZSBFTUFDICovCitzdGF0aWMgdm9pZCBlbWFjX3dvcmtfdGhyZWFkKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBlbWFjX2FkYXB0ZXIsIHdvcmtfdGhyZWFkKTsKKworCWVtYWNfcmVpbml0X2xvY2tlZChhZHB0KTsKK30KKworLyogSW5pdGlhbGl6ZSB2YXJpb3VzIGRhdGEgc3RydWN0dXJlcyAgKi8KK3N0YXRpYyB2b2lkIGVtYWNfaW5pdF9hZGFwdGVyKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJdTMyIHJlZzsKKworCS8qIGRlc2NyaXB0b3JzICovCisJYWRwdC0+dHhfZGVzY19jbnQgPSBFTUFDX0RFRl9UWF9ERVNDUzsKKwlhZHB0LT5yeF9kZXNjX2NudCA9IEVNQUNfREVGX1JYX0RFU0NTOworCisJLyogZG1hICovCisJYWRwdC0+ZG1hX29yZGVyID0gZW1hY19kbWFfb3JkX291dDsKKwlhZHB0LT5kbWFyX2Jsb2NrID0gZW1hY19kbWFfcmVxXzQwOTY7CisJYWRwdC0+ZG1hd19ibG9jayA9IGVtYWNfZG1hX3JlcV8xMjg7CisJYWRwdC0+ZG1hcl9kbHlfY250ID0gRE1BUl9ETFlfQ05UX0RFRjsKKwlhZHB0LT5kbWF3X2RseV9jbnQgPSBETUFXX0RMWV9DTlRfREVGOworCWFkcHQtPnRwZF9idXJzdCA9IFRYUTBfTlVNX1RQRF9QUkVGX0RFRjsKKwlhZHB0LT5yZmRfYnVyc3QgPSBSWFEwX05VTV9SRkRfUFJFRl9ERUY7CisKKwkvKiBpcnEgbW9kZXJhdG9yICovCisJcmVnID0gKChFTUFDX0RFRl9SWF9JUlFfTU9EID4+IDEpIDw8IElSUV9NT0RFUkFUT1IyX0lOSVRfU0hGVCkgfAorCSAgICAgICgoRU1BQ19ERUZfVFhfSVJRX01PRCA+PiAxKSA8PCBJUlFfTU9ERVJBVE9SX0lOSVRfU0hGVCk7CisJYWRwdC0+aXJxX21vZCA9IHJlZzsKKworCS8qIG90aGVycyAqLworCWFkcHQtPnByZWFtYmxlID0gRU1BQ19QUkVBTUJMRV9ERUY7Cit9CisKKy8qIEdldCB0aGUgY2xvY2sgKi8KK3N0YXRpYyBpbnQgZW1hY19jbGtzX2dldChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJIHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRU1BQ19DTEtfQ05UOyBpKyspIHsKKwkJc3RydWN0IGNsayAqY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsIGVtYWNfY2xrX25hbWVbaV0pOworCisJCWlmIChJU19FUlIoY2xrKSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJjb3VsZCBub3QgY2xhaW0gY2xvY2sgJXMgKGVycm9yPSVsaSlcbiIsCisJCQkJZW1hY19jbGtfbmFtZVtpXSwgUFRSX0VSUihjbGspKTsKKworCQkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKKwkJfQorCisJCWFkcHQtPmNsa1tpXSA9IGNsazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogSW5pdGlhbGl6ZSBjbG9ja3MgKi8KK3N0YXRpYyBpbnQgZW1hY19jbGtzX3BoYXNlMV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJIHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJaW50IHJldDsKKworCXJldCA9IGVtYWNfY2xrc19nZXQocGRldiwgYWRwdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShhZHB0LT5jbGtbRU1BQ19DTEtfQVhJXSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShhZHB0LT5jbGtbRU1BQ19DTEtfQ0ZHX0FIQl0pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBjbGtfc2V0X3JhdGUoYWRwdC0+Y2xrW0VNQUNfQ0xLX0hJR0hfU1BFRURdLCAxOTIwMDAwMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBjbGtfcHJlcGFyZV9lbmFibGUoYWRwdC0+Y2xrW0VNQUNfQ0xLX0hJR0hfU1BFRURdKTsKK30KKworLyogRW5hYmxlIGNsb2NrczsgbmVlZHMgZW1hY19jbGtzX3BoYXNlMV9pbml0IHRvIGJlIGNhbGxlZCBiZWZvcmUgKi8KK3N0YXRpYyBpbnQgZW1hY19jbGtzX3BoYXNlMl9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJIHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJaW50IHJldDsKKworCXJldCA9IGNsa19zZXRfcmF0ZShhZHB0LT5jbGtbRU1BQ19DTEtfVFhdLCAxMjUwMDAwMDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoYWRwdC0+Y2xrW0VNQUNfQ0xLX1RYXSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGNsa19zZXRfcmF0ZShhZHB0LT5jbGtbRU1BQ19DTEtfSElHSF9TUEVFRF0sIDEyNTAwMDAwMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGNsa19zZXRfcmF0ZShhZHB0LT5jbGtbRU1BQ19DTEtfTURJT10sIDI1MDAwMDAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGFkcHQtPmNsa1tFTUFDX0NMS19NRElPXSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShhZHB0LT5jbGtbRU1BQ19DTEtfUlhdKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGNsa19wcmVwYXJlX2VuYWJsZShhZHB0LT5jbGtbRU1BQ19DTEtfU1lTXSk7Cit9CisKK3N0YXRpYyB2b2lkIGVtYWNfY2xrc190ZWFyZG93bihzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRU1BQ19DTEtfQ05UOyBpKyspCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShhZHB0LT5jbGtbaV0pOworfQorCisvKiBHZXQgdGhlIHJlc291cmNlcyAqLworc3RhdGljIGludCBlbWFjX3Byb2JlX3Jlc291cmNlcyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCXN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkcHQtPm5ldGRldjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwljaGFyIG1hZGRyW0VUSF9BTEVOXTsKKwlpbnQgcmV0ID0gMDsKKworCS8qIGdldCBtYWMgYWRkcmVzcyAqLworCWlmIChkZXZpY2VfZ2V0X21hY19hZGRyZXNzKCZwZGV2LT5kZXYsIG1hZGRyLCBFVEhfQUxFTikpCisJCWV0aGVyX2FkZHJfY29weShuZXRkZXYtPmRldl9hZGRyLCBtYWRkcik7CisJZWxzZQorCQlldGhfaHdfYWRkcl9yYW5kb20obmV0ZGV2KTsKKworCS8qIENvcmUgMCBpbnRlcnJ1cHQgKi8KKwlyZXQgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJlcnJvcjogbWlzc2luZyBjb3JlMCBpcnEgcmVzb3VyY2UgKGVycm9yPSVpKVxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJYWRwdC0+aXJxLmlycSA9IHJldDsKKworCS8qIGJhc2UgcmVnaXN0ZXIgYWRkcmVzcyAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJYWRwdC0+YmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIoYWRwdC0+YmFzZSkpCisJCXJldHVybiBQVFJfRVJSKGFkcHQtPmJhc2UpOworCisJLyogQ1NSIHJlZ2lzdGVyIGFkZHJlc3MgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDEpOworCWFkcHQtPmNzciA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIoYWRwdC0+Y3NyKSkKKwkJcmV0dXJuIFBUUl9FUlIoYWRwdC0+Y3NyKTsKKworCW5ldGRldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpYWRwdC0+YmFzZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBlbWFjX2R0X21hdGNoW10gPSB7CisJeworCQkuY29tcGF0aWJsZSA9ICJxY29tLGZzbTk5MDAtZW1hYyIsCisJfSwKKwl7fQorfTsKKworI2lmIElTX0VOQUJMRUQoQ09ORklHX0FDUEkpCitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIGVtYWNfYWNwaV9tYXRjaFtdID0geworCXsKKwkJLmlkID0gIlFDT004MDcwIiwKKwl9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShhY3BpLCBlbWFjX2FjcGlfbWF0Y2gpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgZW1hY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdDsKKwlzdHJ1Y3QgZW1hY19waHkgKnBoeTsKKwl1MTYgZGV2aWQsIHJldmlkOworCXUzMiByZWc7CisJaW50IHJldDsKKworCS8qIFRoZSBFTUFDIGl0c2VsZiBpcyBjYXBhYmxlIG9mIDY0LWJpdCBETUEsIHNvIHRyeSB0aGF0IGZpcnN0LiAqLworCXJldCA9IGRtYV9zZXRfbWFza19hbmRfY29oZXJlbnQoJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDY0KSk7CisJaWYgKHJldCkgeworCQkvKiBTb21lIHBsYXRmb3JtcyBtYXkgcmVzdHJpY3QgdGhlIEVNQUMncyBhZGRyZXNzIGJ1cyB0byBsZXNzCisJCSAqIHRoZW4gdGhlIHNpemUgb2YgRERSLiBJbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gdHJ5IGEKKwkJICogc21hbGxlciBtYXNrLiAgV2UgY291bGQgdHJ5IGV2ZXJ5IHBvc3NpYmxlIHNtYWxsZXIgbWFzaywKKwkJICogYnV0IHRoYXQncyBvdmVya2lsbC4gIEluc3RlYWQsIGp1c3QgZmFsbCB0byAzMi1iaXQsIHdoaWNoCisJCSAqIHNob3VsZCBhbHdheXMgd29yay4KKwkJICovCisJCXJldCA9IGRtYV9zZXRfbWFza19hbmRfY29oZXJlbnQoJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBzZXQgRE1BIG1hc2tcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgZW1hY19hZGFwdGVyKSk7CisJaWYgKCFuZXRkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIG5ldGRldik7CisJU0VUX05FVERFVl9ERVYobmV0ZGV2LCAmcGRldi0+ZGV2KTsKKworCWFkcHQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWFkcHQtPm5ldGRldiA9IG5ldGRldjsKKwlhZHB0LT5tc2dfZW5hYmxlID0gRU1BQ19NU0dfREVGQVVMVDsKKworCXBoeSA9ICZhZHB0LT5waHk7CisKKwltdXRleF9pbml0KCZhZHB0LT5yZXNldF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmYWRwdC0+c3RhdHMubG9jayk7CisKKwlhZHB0LT5pcnEubWFzayA9IFJYX1BLVF9JTlQwIHwgSU1SX05PUk1BTF9NQVNLOworCisJcmV0ID0gZW1hY19wcm9iZV9yZXNvdXJjZXMocGRldiwgYWRwdCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfdW5kb19uZXRkZXY7CisKKwkvKiBpbml0aWFsaXplIGNsb2NrcyAqLworCXJldCA9IGVtYWNfY2xrc19waGFzZTFfaW5pdChwZGV2LCBhZHB0KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBpbml0aWFsaXplIGNsb2Nrc1xuIik7CisJCWdvdG8gZXJyX3VuZG9fbmV0ZGV2OworCX0KKworCW5ldGRldi0+d2F0Y2hkb2dfdGltZW8gPSBFTUFDX1dBVENIRE9HX1RJTUU7CisJbmV0ZGV2LT5pcnEgPSBhZHB0LT5pcnEuaXJxOworCisJYWRwdC0+cnJkX3NpemUgPSBFTUFDX1JSRF9TSVpFOworCWFkcHQtPnRwZF9zaXplID0gRU1BQ19UUERfU0laRTsKKwlhZHB0LT5yZmRfc2l6ZSA9IEVNQUNfUkZEX1NJWkU7CisKKwluZXRkZXYtPm5ldGRldl9vcHMgPSAmZW1hY19uZXRkZXZfb3BzOworCisJZW1hY19pbml0X2FkYXB0ZXIoYWRwdCk7CisKKwkvKiBpbml0IGV4dGVybmFsIHBoeSAqLworCXJldCA9IGVtYWNfcGh5X2NvbmZpZyhwZGV2LCBhZHB0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl91bmRvX2Nsb2NrczsKKworCS8qIGluaXQgaW50ZXJuYWwgc2dtaWkgcGh5ICovCisJcmV0ID0gZW1hY19zZ21paV9jb25maWcocGRldiwgYWRwdCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfdW5kb19tZGlvYnVzOworCisJLyogZW5hYmxlIGNsb2NrcyAqLworCXJldCA9IGVtYWNfY2xrc19waGFzZTJfaW5pdChwZGV2LCBhZHB0KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBpbml0aWFsaXplIGNsb2Nrc1xuIik7CisJCWdvdG8gZXJyX3VuZG9fbWRpb2J1czsKKwl9CisKKwllbWFjX21hY19yZXNldChhZHB0KTsKKworCS8qIHNldCBodyBmZWF0dXJlcyAqLworCW5ldGRldi0+ZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwgTkVUSUZfRl9IV19DU1VNIHwgTkVUSUZfRl9SWENTVU0gfAorCQkJTkVUSUZfRl9UU08gfCBORVRJRl9GX1RTTzYgfCBORVRJRl9GX0hXX1ZMQU5fQ1RBR19SWCB8CisJCQlORVRJRl9GX0hXX1ZMQU5fQ1RBR19UWDsKKwluZXRkZXYtPmh3X2ZlYXR1cmVzID0gbmV0ZGV2LT5mZWF0dXJlczsKKworCW5ldGRldi0+dmxhbl9mZWF0dXJlcyB8PSBORVRJRl9GX1NHIHwgTkVUSUZfRl9IV19DU1VNIHwKKwkJCQkgTkVUSUZfRl9UU08gfCBORVRJRl9GX1RTTzY7CisKKwlJTklUX1dPUksoJmFkcHQtPndvcmtfdGhyZWFkLCBlbWFjX3dvcmtfdGhyZWFkKTsKKworCS8qIEluaXRpYWxpemUgcXVldWVzICovCisJZW1hY19tYWNfcnhfdHhfcmluZ19pbml0X2FsbChwZGV2LCBhZHB0KTsKKworCW5ldGlmX25hcGlfYWRkKG5ldGRldiwgJmFkcHQtPnJ4X3EubmFwaSwgZW1hY19uYXBpX3J0eCwKKwkJICAgICAgIE5BUElfUE9MTF9XRUlHSFQpOworCisJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgcmVnaXN0ZXIgbmV0IGRldmljZVxuIik7CisJCWdvdG8gZXJyX3VuZG9fbmFwaTsKKwl9CisKKwlyZWcgPSAgcmVhZGxfcmVsYXhlZChhZHB0LT5iYXNlICsgRU1BQ19ETUFfTUFTX0NUUkwpOworCWRldmlkID0gKHJlZyAmIERFVl9JRF9OVU1fQk1TSykgID4+IERFVl9JRF9OVU1fU0hGVDsKKwlyZXZpZCA9IChyZWcgJiBERVZfUkVWX05VTV9CTVNLKSA+PiBERVZfUkVWX05VTV9TSEZUOworCXJlZyA9IHJlYWRsX3JlbGF4ZWQoYWRwdC0+YmFzZSArIEVNQUNfQ09SRV9IV19WRVJTSU9OKTsKKworCW5ldGlmX2luZm8oYWRwdCwgcHJvYmUsIG5ldGRldiwKKwkJICAgImhhcmR3YXJlIGlkICVkLiVkLCBoYXJkd2FyZSB2ZXJzaW9uICVkLiVkLiVkXG4iLAorCQkgICBkZXZpZCwgcmV2aWQsCisJCSAgIChyZWcgJiBNQUpPUl9CTVNLKSA+PiBNQUpPUl9TSEZULAorCQkgICAocmVnICYgTUlOT1JfQk1TSykgPj4gTUlOT1JfU0hGVCwKKwkJICAgKHJlZyAmIFNURVBfQk1TSykgID4+IFNURVBfU0hGVCk7CisKKwlyZXR1cm4gMDsKKworZXJyX3VuZG9fbmFwaToKKwluZXRpZl9uYXBpX2RlbCgmYWRwdC0+cnhfcS5uYXBpKTsKK2Vycl91bmRvX21kaW9idXM6CisJbWRpb2J1c191bnJlZ2lzdGVyKGFkcHQtPm1paV9idXMpOworZXJyX3VuZG9fY2xvY2tzOgorCWVtYWNfY2xrc190ZWFyZG93bihhZHB0KTsKK2Vycl91bmRvX25ldGRldjoKKwlmcmVlX25ldGRldihuZXRkZXYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBlbWFjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwl1bnJlZ2lzdGVyX25ldGRldihuZXRkZXYpOworCW5ldGlmX25hcGlfZGVsKCZhZHB0LT5yeF9xLm5hcGkpOworCisJZW1hY19jbGtzX3RlYXJkb3duKGFkcHQpOworCisJbWRpb2J1c191bnJlZ2lzdGVyKGFkcHQtPm1paV9idXMpOworCWZyZWVfbmV0ZGV2KG5ldGRldik7CisKKwlpZiAoYWRwdC0+cGh5LmRpZ2l0YWwpCisJCWlvdW5tYXAoYWRwdC0+cGh5LmRpZ2l0YWwpOworCWlvdW5tYXAoYWRwdC0+cGh5LmJhc2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGVtYWNfcGxhdGZvcm1fZHJpdmVyID0geworCS5wcm9iZQk9IGVtYWNfcHJvYmUsCisJLnJlbW92ZQk9IGVtYWNfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCQk9ICJxY29tLWVtYWMiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBlbWFjX2R0X21hdGNoLAorCQkuYWNwaV9tYXRjaF90YWJsZSA9IEFDUElfUFRSKGVtYWNfYWNwaV9tYXRjaCksCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoZW1hY19wbGF0Zm9ybV9kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnFjb20tZW1hYyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy9lbWFjLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjL2VtYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzc2ZTZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy9lbWFjLmgKQEAgLTAsMCArMSwzMzUgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMy0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX0VNQUNfSF8KKyNkZWZpbmUgX0VNQUNfSF8KKworI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgImVtYWMtbWFjLmgiCisjaW5jbHVkZSAiZW1hYy1waHkuaCIKKworLyogRU1BQyBiYXNlIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgRU1BQ19ETUFfTUFTX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDE0MDAKKyNkZWZpbmUgRU1BQ19JUlFfTU9EX1RJTV9JTklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDE0MDgKKyNkZWZpbmUgRU1BQ19CTEtfSURMRV9TVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDE0MGMKKyNkZWZpbmUgRU1BQ19QSFlfTElOS19ERUxBWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDE0MWMKKyNkZWZpbmUgRU1BQ19TWVNfQUxJVl9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDE0MzQKKyNkZWZpbmUgRU1BQ19NQUNfSVBHSUZHX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDE0ODQKKyNkZWZpbmUgRU1BQ19NQUNfU1RBX0FERFIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDE0ODgKKyNkZWZpbmUgRU1BQ19NQUNfU1RBX0FERFIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDE0OGMKKyNkZWZpbmUgRU1BQ19IQVNIX1RBQl9SRUcwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDE0OTAKKyNkZWZpbmUgRU1BQ19IQVNIX1RBQl9SRUcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDE0OTQKKyNkZWZpbmUgRU1BQ19NQUNfSEFMRl9EUExYX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDE0OTgKKyNkZWZpbmUgRU1BQ19NQVhfRlJBTV9MRU5fQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDE0OWMKKyNkZWZpbmUgRU1BQ19JTlRfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDE2MDAKKyNkZWZpbmUgRU1BQ19JTlRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDE2MDQKKyNkZWZpbmUgRU1BQ19SWE1BQ19TVEFUQ19SRUcwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDE3MDAKKyNkZWZpbmUgRU1BQ19SWE1BQ19TVEFUQ19SRUcyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDE3NTgKKyNkZWZpbmUgRU1BQ19UWE1BQ19TVEFUQ19SRUcwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDE3NjAKKyNkZWZpbmUgRU1BQ19UWE1BQ19TVEFUQ19SRUcyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDE3YzAKKyNkZWZpbmUgRU1BQ19DT1JFX0hXX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDE5NzQKKyNkZWZpbmUgRU1BQ19JRFRfVEFCTEUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDFiMDAKKyNkZWZpbmUgRU1BQ19SWE1BQ19TVEFUQ19SRUcyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDFiYzgKKyNkZWZpbmUgRU1BQ19SWE1BQ19TVEFUQ19SRUcyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDFiY2MKKyNkZWZpbmUgRU1BQ19UWE1BQ19TVEFUQ19SRUcyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDFiZDAKKyNkZWZpbmUgRU1BQ19JTlQxX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDFiZjAKKyNkZWZpbmUgRU1BQ19JTlQxX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDFiZjQKKyNkZWZpbmUgRU1BQ19JTlQyX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDFiZjgKKyNkZWZpbmUgRU1BQ19JTlQyX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDFiZmMKKyNkZWZpbmUgRU1BQ19JTlQzX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDFjMDAKKyNkZWZpbmUgRU1BQ19JTlQzX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDFjMDQKKworLyogRU1BQ19ETUFfTUFTX0NUUkwgKi8KKyNkZWZpbmUgREVWX0lEX05VTV9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2YwMDAwMDAKKyNkZWZpbmUgREVWX0lEX05VTV9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgREVWX1JFVl9OVU1fQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjAwMDAKKyNkZWZpbmUgREVWX1JFVl9OVU1fU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgSU5UX1JEX0NMUl9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgSVJRX01PREVSQVRPUjJfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAKKyNkZWZpbmUgSVJRX01PREVSQVRPUl9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAKKyNkZWZpbmUgTFBXX0NMS19TRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgTFBXX1NUQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgTFBXX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgU09GVF9SU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKworLyogRU1BQ19JUlFfTU9EX1RJTV9JTklUICovCisjZGVmaW5lIElSUV9NT0RFUkFUT1IyX0lOSVRfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIElSUV9NT0RFUkFUT1IyX0lOSVRfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIElSUV9NT0RFUkFUT1JfSU5JVF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmCisjZGVmaW5lIElSUV9NT0RFUkFUT1JfSU5JVF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEVNQUNfSU5UX1NUQVRVUyAqLworI2RlZmluZSBESVNfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDMxKQorI2RlZmluZSBQVFBfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDMwKQorI2RlZmluZSBSRkQ0X1VSX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDI5KQorI2RlZmluZSBUWF9QS1RfSU5UMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDI2KQorI2RlZmluZSBUWF9QS1RfSU5UMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDI1KQorI2RlZmluZSBUWF9QS1RfSU5UMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDI0KQorI2RlZmluZSBSWF9QS1RfSU5UMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDE5KQorI2RlZmluZSBSWF9QS1RfSU5UMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDE4KQorI2RlZmluZSBSWF9QS1RfSU5UMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDE3KQorI2RlZmluZSBSWF9QS1RfSU5UMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDE2KQorI2RlZmluZSBUWF9QS1RfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDE1KQorI2RlZmluZSBUWFFfVE9fSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDE0KQorI2RlZmluZSBHUEhZX1dBS0VVUF9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDEzKQorI2RlZmluZSBHUEhZX0xJTktfRE9XTl9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDEyKQorI2RlZmluZSBHUEhZX0xJTktfVVBfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDExKQorI2RlZmluZSBETUFXX1RPX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDEwKQorI2RlZmluZSBETUFSX1RPX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCg5KQorI2RlZmluZSBUWEZfVVJfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCg4KQorI2RlZmluZSBSRkQzX1VSX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCg3KQorI2RlZmluZSBSRkQyX1VSX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCg2KQorI2RlZmluZSBSRkQxX1VSX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCg1KQorI2RlZmluZSBSRkQwX1VSX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCg0KQorI2RlZmluZSBSWEZfT0ZfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgzKQorI2RlZmluZSBTV19NQU5fSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgyKQorCisvKiBFTUFDX01BSUxCT1hfNiAqLworI2RlZmluZSBSRkQyX1BST0NfSURYX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmMDAwMAorI2RlZmluZSBSRkQyX1BST0NfSURYX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBSRkQyX1BST0RfSURYX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZgorI2RlZmluZSBSRkQyX1BST0RfSURYX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKiBFTUFDX0NPUkVfSFdfVkVSU0lPTiAqLworI2RlZmluZSBNQUpPUl9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmMDAwMDAwMAorI2RlZmluZSBNQUpPUl9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOAorI2RlZmluZSBNSU5PUl9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmMDAwMAorI2RlZmluZSBNSU5PUl9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBTVEVQX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZgorI2RlZmluZSBTVEVQX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKiBFTUFDX0VNQUNfV1JBUFBFUl9DU1IxICovCisjZGVmaW5lIFRYX0lORFhfRklGT19TWU5DX1JTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMjMpCisjZGVmaW5lIFRYX1RTX0ZJRk9fU1lOQ19SU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMjIpCisjZGVmaW5lIFJYX1RTX0ZJRk8yX1NZTkNfUlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMjEpCisjZGVmaW5lIFJYX1RTX0ZJRk8xX1NZTkNfUlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMjApCisjZGVmaW5lIFRYX1RTX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMTYpCisjZGVmaW5lIERJU18xNTg4X0NMS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMTEpCisjZGVmaW5lIEZSRVFfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDkpCisjZGVmaW5lIEVOQUJMRV9SUkRfVElNRVNUQU1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDMpCisKKy8qIEVNQUNfRU1BQ19XUkFQUEVSX0NTUjIgKi8KKyNkZWZpbmUgSERSSVZFX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDAKKyNkZWZpbmUgSERSSVZFX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgU0xCX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoOSkKKyNkZWZpbmUgUExCX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoOCkKKyNkZWZpbmUgV09MX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMykKKyNkZWZpbmUgUEhZX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMCkKKworI2RlZmluZSBFTUFDX0RFVl9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAorCisvKiBTR01JSSB2MiBwZXIgbGFuZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU0dNSUlfTE5fUlNNX1NUQVJUICAgICAgICAgICAgIDB4MDI5QworCisvKiBTR01JSSB2MiBQSFkgY29tbW9uIHJlZ2lzdGVycyAqLworI2RlZmluZSBTR01JSV9QSFlfQ01OX0NUUkwgICAgICAgICAgICAweDA0MDgKKyNkZWZpbmUgU0dNSUlfUEhZX0NNTl9SRVNFVF9DVFJMICAgICAgMHgwNDEwCisKKy8qIFNHTUlJIHYyIFBIWSByZWdpc3RlcnMgcGVyIGxhbmUgKi8KKyNkZWZpbmUgU0dNSUlfUEhZX0xOX09GRlNFVCAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgU0dNSUlfUEhZX0xOX0xBTkVfU1RBVFVTICAgICAweDAwREMKKyNkZWZpbmUgU0dNSUlfUEhZX0xOX0JJU1RfR0VOMCAgICAgICAweDAwOEMKKyNkZWZpbmUgU0dNSUlfUEhZX0xOX0JJU1RfR0VOMSAgICAgICAweDAwOTAKKyNkZWZpbmUgU0dNSUlfUEhZX0xOX0JJU1RfR0VOMiAgICAgICAweDAwOTQKKyNkZWZpbmUgU0dNSUlfUEhZX0xOX0JJU1RfR0VOMyAgICAgICAweDAwOTgKKyNkZWZpbmUgU0dNSUlfUEhZX0xOX0NEUl9DVFJMMSAgICAgICAweDAwNUMKKworZW51bSBlbWFjX2Nsa19pZCB7CisJRU1BQ19DTEtfQVhJLAorCUVNQUNfQ0xLX0NGR19BSEIsCisJRU1BQ19DTEtfSElHSF9TUEVFRCwKKwlFTUFDX0NMS19NRElPLAorCUVNQUNfQ0xLX1RYLAorCUVNQUNfQ0xLX1JYLAorCUVNQUNfQ0xLX1NZUywKKwlFTUFDX0NMS19DTlQKK307CisKKyNkZWZpbmUgRU1BQ19MSU5LX1NQRUVEX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgRU1BQ19MSU5LX1NQRUVEXzEwX0hBTEYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMCkKKyNkZWZpbmUgRU1BQ19MSU5LX1NQRUVEXzEwX0ZVTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMSkKKyNkZWZpbmUgRU1BQ19MSU5LX1NQRUVEXzEwMF9IQUxGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMikKKyNkZWZpbmUgRU1BQ19MSU5LX1NQRUVEXzEwMF9GVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMykKKyNkZWZpbmUgRU1BQ19MSU5LX1NQRUVEXzFHQl9GVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoNSkKKworI2RlZmluZSBFTUFDX01BWF9TRVRVUF9MTktfQ1lDTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMAorCisvKiBXYWtlIE9uIExhbiAqLworI2RlZmluZSBFTUFDX1dPTF9QSFkgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxIC8qIFBIWSBTdGF0dXMgQ2hhbmdlICovCisjZGVmaW5lIEVNQUNfV09MX01BR0lDICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIgLyogTWFnaWMgUGFja2V0ICovCisKK3N0cnVjdCBlbWFjX3N0YXRzIHsKKwkvKiByeCAqLworCXU2NCByeF9vazsgICAgICAgICAgICAgIC8qIGdvb2QgcGFja2V0cyAqLworCXU2NCByeF9iY2FzdDsgICAgICAgICAgIC8qIGdvb2QgYnJvYWRjYXN0IHBhY2tldHMgKi8KKwl1NjQgcnhfbWNhc3Q7ICAgICAgICAgICAvKiBnb29kIG11bHRpY2FzdCBwYWNrZXRzICovCisJdTY0IHJ4X3BhdXNlOyAgICAgICAgICAgLyogcGF1c2UgcGFja2V0ICovCisJdTY0IHJ4X2N0cmw7ICAgICAgICAgICAgLyogY29udHJvbCBwYWNrZXRzIG90aGVyIHRoYW4gcGF1c2UgZnJhbWUuICovCisJdTY0IHJ4X2Zjc19lcnI7ICAgICAgICAgLyogcGFja2V0cyB3aXRoIGJhZCBGQ1MuICovCisJdTY0IHJ4X2xlbl9lcnI7ICAgICAgICAgLyogcGFja2V0cyB3aXRoIGxlbmd0aCBtaXNtYXRjaCAqLworCXU2NCByeF9ieXRlX2NudDsgICAgICAgIC8qIGdvb2QgYnl0ZXMgY291bnQgKHdpdGhvdXQgRkNTKSAqLworCXU2NCByeF9ydW50OyAgICAgICAgICAgIC8qIHJ1bnQgcGFja2V0cyAqLworCXU2NCByeF9mcmFnOyAgICAgICAgICAgIC8qIGZyYWdtZW50IGNvdW50ICovCisJdTY0IHJ4X3N6XzY0OwkgICAgICAgIC8qIHBhY2tldHMgdGhhdCBhcmUgNjQgYnl0ZXMgKi8KKwl1NjQgcnhfc3pfNjVfMTI3OyAgICAgICAvKiBwYWNrZXRzIHRoYXQgYXJlIDY1LTEyNyBieXRlcyAqLworCXU2NCByeF9zel8xMjhfMjU1OyAgICAgIC8qIHBhY2tldHMgdGhhdCBhcmUgMTI4LTI1NSBieXRlcyAqLworCXU2NCByeF9zel8yNTZfNTExOyAgICAgIC8qIHBhY2tldHMgdGhhdCBhcmUgMjU2LTUxMSBieXRlcyAqLworCXU2NCByeF9zel81MTJfMTAyMzsgICAgIC8qIHBhY2tldHMgdGhhdCBhcmUgNTEyLTEwMjMgYnl0ZXMgKi8KKwl1NjQgcnhfc3pfMTAyNF8xNTE4OyAgICAvKiBwYWNrZXRzIHRoYXQgYXJlIDEwMjQtMTUxOCBieXRlcyAqLworCXU2NCByeF9zel8xNTE5X21heDsgICAgIC8qIHBhY2tldHMgdGhhdCBhcmUgMTUxOS1NVFUgYnl0ZXMqLworCXU2NCByeF9zel9vdjsgICAgICAgICAgIC8qIHBhY2tldHMgdGhhdCBhcmUgPk1UVSBieXRlcyAodHJ1bmNhdGVkKSAqLworCXU2NCByeF9yeGZfb3Y7ICAgICAgICAgIC8qIHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gUlggRklGTyBvdmVyZmxvdyAqLworCXU2NCByeF9hbGlnbl9lcnI7ICAgICAgIC8qIGFsaWdubWVudCBlcnJvcnMgKi8KKwl1NjQgcnhfYmNhc3RfYnl0ZV9jbnQ7ICAvKiBicm9hZGNhc3QgcGFja2V0cyBieXRlIGNvdW50ICh3aXRob3V0IEZDUykgKi8KKwl1NjQgcnhfbWNhc3RfYnl0ZV9jbnQ7ICAvKiBtdWx0aWNhc3QgcGFja2V0cyBieXRlIGNvdW50ICh3aXRob3V0IEZDUykgKi8KKwl1NjQgcnhfZXJyX2FkZHI7ICAgICAgICAvKiBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGFkZHJlc3MgZmlsdGVyaW5nICovCisJdTY0IHJ4X2NyY19hbGlnbjsgICAgICAgLyogQ1JDIGFsaWduIGVycm9ycyAqLworCXU2NCByeF9qYWJiZXJzOyAgICAgICAgIC8qIGphYmJlcnMgKi8KKworCS8qIHR4ICovCisJdTY0IHR4X29rOyAgICAgICAgICAgICAgLyogZ29vZCBwYWNrZXRzICovCisJdTY0IHR4X2JjYXN0OyAgICAgICAgICAgLyogZ29vZCBicm9hZGNhc3QgcGFja2V0cyAqLworCXU2NCB0eF9tY2FzdDsgICAgICAgICAgIC8qIGdvb2QgbXVsdGljYXN0IHBhY2tldHMgKi8KKwl1NjQgdHhfcGF1c2U7ICAgICAgICAgICAvKiBwYXVzZSBwYWNrZXRzICovCisJdTY0IHR4X2V4Y19kZWZlcjsgICAgICAgLyogcGFja2V0cyB3aXRoIGV4Y2Vzc2l2ZSBkZWZlcnJhbCAqLworCXU2NCB0eF9jdHJsOyAgICAgICAgICAgIC8qIGNvbnRyb2wgcGFja2V0cyBvdGhlciB0aGFuIHBhdXNlIGZyYW1lICovCisJdTY0IHR4X2RlZmVyOyAgICAgICAgICAgLyogcGFja2V0cyB0aGF0IGFyZSBkZWZlcnJlZC4gKi8KKwl1NjQgdHhfYnl0ZV9jbnQ7ICAgICAgICAvKiBnb29kIGJ5dGVzIGNvdW50ICh3aXRob3V0IEZDUykgKi8KKwl1NjQgdHhfc3pfNjQ7ICAgICAgICAgICAvKiBwYWNrZXRzIHRoYXQgYXJlIDY0IGJ5dGVzICovCisJdTY0IHR4X3N6XzY1XzEyNzsgICAgICAgLyogcGFja2V0cyB0aGF0IGFyZSA2NS0xMjcgYnl0ZXMgKi8KKwl1NjQgdHhfc3pfMTI4XzI1NTsgICAgICAvKiBwYWNrZXRzIHRoYXQgYXJlIDEyOC0yNTUgYnl0ZXMgKi8KKwl1NjQgdHhfc3pfMjU2XzUxMTsgICAgICAvKiBwYWNrZXRzIHRoYXQgYXJlIDI1Ni01MTEgYnl0ZXMgKi8KKwl1NjQgdHhfc3pfNTEyXzEwMjM7ICAgICAvKiBwYWNrZXRzIHRoYXQgYXJlIDUxMi0xMDIzIGJ5dGVzICovCisJdTY0IHR4X3N6XzEwMjRfMTUxODsgICAgLyogcGFja2V0cyB0aGF0IGFyZSAxMDI0LTE1MTggYnl0ZXMgKi8KKwl1NjQgdHhfc3pfMTUxOV9tYXg7ICAgICAvKiBwYWNrZXRzIHRoYXQgYXJlIDE1MTktTVRVIGJ5dGVzICovCisJdTY0IHR4XzFfY29sOyAgICAgICAgICAgLyogcGFja2V0cyBzaW5nbGUgcHJpb3IgY29sbGlzaW9uICovCisJdTY0IHR4XzJfY29sOyAgICAgICAgICAgLyogcGFja2V0cyB3aXRoIG11bHRpcGxlIHByaW9yIGNvbGxpc2lvbnMgKi8KKwl1NjQgdHhfbGF0ZV9jb2w7ICAgICAgICAvKiBwYWNrZXRzIHdpdGggbGF0ZSBjb2xsaXNpb25zICovCisJdTY0IHR4X2Fib3J0X2NvbDsgICAgICAgLyogcGFja2V0cyBhYm9ydGVkIGR1ZSB0byBleGNlc3MgY29sbGlzaW9ucyAqLworCXU2NCB0eF91bmRlcnJ1bjsgICAgICAgIC8qIHBhY2tldHMgYWJvcnRlZCBkdWUgdG8gRklGTyB1bmRlcnJ1biAqLworCXU2NCB0eF9yZF9lb3A7ICAgICAgICAgIC8qIGNvdW50IG9mIHJlYWRzIGJleW9uZCBFT1AgKi8KKwl1NjQgdHhfbGVuX2VycjsgICAgICAgICAvKiBwYWNrZXRzIHdpdGggbGVuZ3RoIG1pc21hdGNoICovCisJdTY0IHR4X3RydW5jOyAgICAgICAgICAgLyogcGFja2V0cyB0cnVuY2F0ZWQgZHVlIHRvIHNpemUgPk1UVSAqLworCXU2NCB0eF9iY2FzdF9ieXRlOyAgICAgIC8qIGJyb2FkY2FzdCBwYWNrZXRzIGJ5dGUgY291bnQgKHdpdGhvdXQgRkNTKSAqLworCXU2NCB0eF9tY2FzdF9ieXRlOyAgICAgIC8qIG11bHRpY2FzdCBwYWNrZXRzIGJ5dGUgY291bnQgKHdpdGhvdXQgRkNTKSAqLworCXU2NCB0eF9jb2w7ICAgICAgICAgICAgIC8qIGNvbGxpc2lvbnMgKi8KKworCXNwaW5sb2NrX3QgbG9jazsJLyogcHJldmVudCBtdWx0aXBsZSBzaW11bHRhbmVvdXMgcmVhZGVycyAqLworfTsKKworLyogUlNTIGhzdHlwZSBEZWZpbml0aW9ucyAqLworI2RlZmluZSBFTUFDX1JTU19IU1RZUF9JUFY0X0VOCQkJCSAgICAweDAwMDAwMDAxCisjZGVmaW5lIEVNQUNfUlNTX0hTVFlQX1RDUDRfRU4JCQkJICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgRU1BQ19SU1NfSFNUWVBfSVBWNl9FTgkJCQkgICAgMHgwMDAwMDAwNAorI2RlZmluZSBFTUFDX1JTU19IU1RZUF9UQ1A2X0VOCQkJCSAgICAweDAwMDAwMDA4CisjZGVmaW5lIEVNQUNfUlNTX0hTVFlQX0FMTF9FTiAoXAorCQlFTUFDX1JTU19IU1RZUF9JUFY0X0VOICAgfFwKKwkJRU1BQ19SU1NfSFNUWVBfVENQNF9FTiAgIHxcCisJCUVNQUNfUlNTX0hTVFlQX0lQVjZfRU4gICB8XAorCQlFTUFDX1JTU19IU1RZUF9UQ1A2X0VOKQorCisjZGVmaW5lIEVNQUNfVkxBTl9UT19UQUcoX3ZsYW4sIF90YWcpIFwKKwkJKF90YWcgPSAgKCgoKF92bGFuKSA+PiA4KSAmIDB4RkYpIHwgKCgoX3ZsYW4pICYgMHhGRikgPDwgOCkpKQorCisjZGVmaW5lIEVNQUNfVEFHX1RPX1ZMQU4oX3RhZywgX3ZsYW4pIFwKKwkJKF92bGFuID0gKCgoKF90YWcpID4+IDgpICYgMHhGRikgfCAoKChfdGFnKSAmIDB4RkYpIDw8IDgpKSkKKworI2RlZmluZSBFTUFDX0RFRl9SWF9CVUZfU0laRQkJCQkJICAxNTM2CisjZGVmaW5lIEVNQUNfTUFYX0pVTUJPX1BLVF9TSVpFCQkJCSAgICAoOSAqIDEwMjQpCisjZGVmaW5lIEVNQUNfTUFYX1RYX09GRkxPQURfVEhSRVNICQkJICAgICg5ICogMTAyNCkKKworI2RlZmluZSBFTUFDX01BWF9FVEhfRlJBTUVfU0laRQkJICAgICAgIEVNQUNfTUFYX0pVTUJPX1BLVF9TSVpFCisjZGVmaW5lIEVNQUNfTUlOX0VUSF9GUkFNRV9TSVpFCQkJCQkgICAgNjgKKworI2RlZmluZSBFTUFDX0RFRl9UWF9RVUVVRVMJCQkJCSAgICAgMQorI2RlZmluZSBFTUFDX0RFRl9SWF9RVUVVRVMJCQkJCSAgICAgMQorCisjZGVmaW5lIEVNQUNfTUlOX1RYX0RFU0NTCQkJCQkgICAxMjgKKyNkZWZpbmUgRU1BQ19NSU5fUlhfREVTQ1MJCQkJCSAgIDEyOAorCisjZGVmaW5lIEVNQUNfTUFYX1RYX0RFU0NTCQkJCQkgMTYzODMKKyNkZWZpbmUgRU1BQ19NQVhfUlhfREVTQ1MJCQkJCSAgMjA0NworCisjZGVmaW5lIEVNQUNfREVGX1RYX0RFU0NTCQkJCQkgICA1MTIKKyNkZWZpbmUgRU1BQ19ERUZfUlhfREVTQ1MJCQkJCSAgIDI1NgorCisjZGVmaW5lIEVNQUNfREVGX1JYX0lSUV9NT0QJCQkJCSAgIDI1MAorI2RlZmluZSBFTUFDX0RFRl9UWF9JUlFfTU9ECQkJCQkgICAyNTAKKworI2RlZmluZSBFTUFDX1dBVENIRE9HX1RJTUUJCQkJICAgICAgKDUgKiBIWikKKworLyogYnkgZGVmYXVsdCBjaGVjayBsaW5rIGV2ZXJ5IDQgc2Vjb25kcyAqLworI2RlZmluZSBFTUFDX1RSWV9MSU5LX1RJTUVPVVQJCQkJICAgICAgKDQgKiBIWikKKworLyogZW1hY19pcnEgcGVyLWRldmljZSAocGVyLWFkYXB0ZXIpIGlycSBwcm9wZXJ0aWVzLgorICogQGlycToJaXJxIG51bWJlci4KKyAqIEBtYXNrCW1hc2sgdG8gdXNlIG92ZXIgc3RhdHVzIHJlZ2lzdGVyLgorICovCitzdHJ1Y3QgZW1hY19pcnEgeworCXVuc2lnbmVkIGludAlpcnE7CisJdTMyCQltYXNrOworfTsKKworLyogVGhlIGRldmljZSdzIG1haW4gZGF0YSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBlbWFjX2FkYXB0ZXIgeworCXN0cnVjdCBuZXRfZGV2aWNlCQkqbmV0ZGV2OworCXN0cnVjdCBtaWlfYnVzCQkJKm1paV9idXM7CisJc3RydWN0IHBoeV9kZXZpY2UJCSpwaHlkZXY7CisKKwl2b2lkIF9faW9tZW0JCQkqYmFzZTsKKwl2b2lkIF9faW9tZW0JCQkqY3NyOworCisJc3RydWN0IGVtYWNfcGh5CQkJcGh5OworCXN0cnVjdCBlbWFjX3N0YXRzCQlzdGF0czsKKworCXN0cnVjdCBlbWFjX2lycQkJCWlycTsKKwlzdHJ1Y3QgY2xrCQkJKmNsa1tFTUFDX0NMS19DTlRdOworCisJLyogQWxsIERlc2NyaXB0b3IgbWVtb3J5ICovCisJc3RydWN0IGVtYWNfcmluZ19oZWFkZXIJCXJpbmdfaGVhZGVyOworCXN0cnVjdCBlbWFjX3R4X3F1ZXVlCQl0eF9xOworCXN0cnVjdCBlbWFjX3J4X3F1ZXVlCQlyeF9xOworCXVuc2lnbmVkIGludAkJCXR4X2Rlc2NfY250OworCXVuc2lnbmVkIGludAkJCXJ4X2Rlc2NfY250OworCXVuc2lnbmVkIGludAkJCXJyZF9zaXplOyAvKiBpbiBxdWFkIHdvcmRzICovCisJdW5zaWduZWQgaW50CQkJcmZkX3NpemU7IC8qIGluIHF1YWQgd29yZHMgKi8KKwl1bnNpZ25lZCBpbnQJCQl0cGRfc2l6ZTsgLyogaW4gcXVhZCB3b3JkcyAqLworCisJdW5zaWduZWQgaW50CQkJcnhidWZfc2l6ZTsKKworCS8qIFJpbmcgcGFyYW1ldGVyICovCisJdTgJCQkJdHBkX2J1cnN0OworCXU4CQkJCXJmZF9idXJzdDsKKwl1bnNpZ25lZCBpbnQJCQlkbWF3X2RseV9jbnQ7CisJdW5zaWduZWQgaW50CQkJZG1hcl9kbHlfY250OworCWVudW0gZW1hY19kbWFfcmVxX2Jsb2NrCQlkbWFyX2Jsb2NrOworCWVudW0gZW1hY19kbWFfcmVxX2Jsb2NrCQlkbWF3X2Jsb2NrOworCWVudW0gZW1hY19kbWFfb3JkZXIJCWRtYV9vcmRlcjsKKworCXUzMgkJCQlpcnFfbW9kOworCXUzMgkJCQlwcmVhbWJsZTsKKworCXN0cnVjdCB3b3JrX3N0cnVjdAkJd29ya190aHJlYWQ7CisKKwl1MTYJCQkJbXNnX2VuYWJsZTsKKworCXN0cnVjdCBtdXRleAkJCXJlc2V0X2xvY2s7Cit9OworCitpbnQgZW1hY19yZWluaXRfbG9ja2VkKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpOwordm9pZCBlbWFjX3JlZ191cGRhdGUzMih2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiBtYXNrLCB1MzIgdmFsKTsKK2lycXJldHVybl90IGVtYWNfaXNyKGludCBpcnEsIHZvaWQgKmRhdGEpOworCisjZW5kaWYgLyogX0VNQUNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JkYy9yNjA0MC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmRjL3I2MDQwLmMKaW5kZXggY2IyOWVlMi4uNWVmNWQ3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmRjL3I2MDQwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmRjL3I2MDQwLmMKQEAgLTEwNjIsMTQgKzEwNjIsMTIgQEAKIAkvKiB0aGlzIHNob3VsZCBhbHdheXMgYmUgc3VwcG9ydGVkICovCiAJZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKIAlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIjMyLWJpdCBQQ0kgRE1BIGFkZHJlc3NlcyIKLQkJCQkibm90IHN1cHBvcnRlZCBieSB0aGUgY2FyZFxuIik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIjMyLWJpdCBQQ0kgRE1BIGFkZHJlc3NlcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjYXJkXG4iKTsKIAkJZ290byBlcnJfb3V0X2Rpc2FibGVfZGV2OwogCX0KIAllcnIgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJaWYgKGVycikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIzMi1iaXQgUENJIERNQSBhZGRyZXNzZXMiCi0JCQkJIm5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNhcmRcbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIzMi1iaXQgUENJIERNQSBhZGRyZXNzZXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY2FyZFxuIik7CiAJCWdvdG8gZXJyX291dF9kaXNhYmxlX2RldjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlYWx0ZWsvODEzOWNwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZWFsdGVrLzgxMzljcC5jCmluZGV4IGRlYWUxMGQuLjUyOTdiZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlYWx0ZWsvODEzOWNwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVhbHRlay84MTM5Y3AuYwpAQCAtNDY3LDggKzQ2Nyw4IEBACiAJdW5zaWduZWQgaW50IHJ4X3RhaWwgPSBjcC0+cnhfdGFpbDsKIAlpbnQgcng7CiAKLXJ4X3N0YXR1c19sb29wOgogCXJ4ID0gMDsKK3J4X3N0YXR1c19sb29wOgogCWNwdzE2KEludHJTdGF0dXMsIGNwX3J4X2ludHJfbWFzayk7CiAKIAl3aGlsZSAocnggPCBidWRnZXQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvS2NvbmZpZwppbmRleCA0ZjEzMmNmLi44NWVjNDQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZW5lc2FzL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVuZXNhcy9LY29uZmlnCkBAIC0yNyw3ICsyNyw3IEBACiAJICBSZW5lc2FzIFN1cGVySCBFdGhlcm5ldCBkZXZpY2UgZHJpdmVyLgogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydGluZyBDUFVzIGFyZToKIAkJLSBTSDc2MTksIFNINzcxMCwgU0g3NzEyLCBTSDc3MjQsIFNINzczNCwgU0g3NzYzLCBTSDc3NTcsCi0JCSAgUjhBNzc0MCwgUjhBNzc3eCBhbmQgUjhBNzc5eC4KKwkJICBSOEE3NzQwLCBSOEE3NzR4LCBSOEE3Nzd4IGFuZCBSOEE3Nzl4LgogCiBjb25maWcgUkFWQgogCXRyaXN0YXRlICJSZW5lc2FzIEV0aGVybmV0IEFWQiBzdXBwb3J0IgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVuZXNhcy9yYXZiLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZW5lc2FzL3JhdmIuaAppbmRleCA0ZTVkNWU5Li5mMTEwOTY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZW5lc2FzL3JhdmIuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZW5lc2FzL3JhdmIuaApAQCAtMTAxMSw3ICsxMDExLDYgQEAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKIAkvKiBNSUkgdHJhbnNjZWl2ZXIgc2VjdGlvbi4gKi8KIAlzdHJ1Y3QgbWlpX2J1cyAqbWlpX2J1czsJLyogTURJTyBidXMgY29udHJvbCAqLwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7CS8qIFBIWSBkZXZpY2UgY29udHJvbCAqLwogCWludCBsaW5rOwogCXBoeV9pbnRlcmZhY2VfdCBwaHlfaW50ZXJmYWNlOwogCWludCBtc2dfZW5hYmxlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVuZXNhcy9yYXZiX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvcmF2Yl9tYWluLmMKaW5kZXggMWUxY2MwZi4uNjMwNTM2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVuZXNhcy9yYXZiX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZW5lc2FzL3JhdmJfbWFpbi5jCkBAIC05NDIsNyArOTQyLDcgQEAKIHN0YXRpYyB2b2lkIHJhdmJfYWRqdXN0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7CiAJc3RydWN0IHJhdmJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBwcml2LT5waHlkZXY7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IG5kZXYtPnBoeWRldjsKIAlib29sIG5ld19zdGF0ZSA9IGZhbHNlOwogCiAJaWYgKHBoeWRldi0+bGluaykgewpAQCAtMTAzMiw0OCArMTAzMiw0NyBAQAogCiAJcGh5X2F0dGFjaGVkX2luZm8ocGh5ZGV2KTsKIAotCXByaXYtPnBoeWRldiA9IHBoeWRldjsKLQogCXJldHVybiAwOwogfQogCiAvKiBQSFkgY29udHJvbCBzdGFydCBmdW5jdGlvbiAqLwogc3RhdGljIGludCByYXZiX3BoeV9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKLQlzdHJ1Y3QgcmF2Yl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJaW50IGVycm9yOwogCiAJZXJyb3IgPSByYXZiX3BoeV9pbml0KG5kZXYpOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCi0JcGh5X3N0YXJ0KHByaXYtPnBoeWRldik7CisJcGh5X3N0YXJ0KG5kZXYtPnBoeWRldik7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByYXZiX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQorc3RhdGljIGludCByYXZiX2dldF9saW5rX2tzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwkJCQkgICBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQogewogCXN0cnVjdCByYXZiX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAlpbnQgZXJyb3IgPSAtRU5PREVWOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAocHJpdi0+cGh5ZGV2KSB7CisJaWYgKG5kZXYtPnBoeWRldikgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQllcnJvciA9IHBoeV9ldGh0b29sX2dzZXQocHJpdi0+cGh5ZGV2LCBlY21kKTsKKwkJZXJyb3IgPSBwaHlfZXRodG9vbF9rc2V0dGluZ3NfZ2V0KG5kZXYtPnBoeWRldiwgY21kKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCX0KIAogCXJldHVybiBlcnJvcjsKIH0KIAotc3RhdGljIGludCByYXZiX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQorc3RhdGljIGludCByYXZiX3NldF9saW5rX2tzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQogewogCXN0cnVjdCByYXZiX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBlcnJvcjsKIAotCWlmICghcHJpdi0+cGh5ZGV2KQorCWlmICghbmRldi0+cGh5ZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CkBAIC0xMDgxLDExICsxMDgwLDExIEBACiAJLyogRGlzYWJsZSBUWCBhbmQgUlggKi8KIAlyYXZiX3Jjdl9zbmRfZGlzYWJsZShuZGV2KTsKIAotCWVycm9yID0gcGh5X2V0aHRvb2xfc3NldChwcml2LT5waHlkZXYsIGVjbWQpOworCWVycm9yID0gcGh5X2V0aHRvb2xfa3NldHRpbmdzX3NldChuZGV2LT5waHlkZXYsIGNtZCk7CiAJaWYgKGVycm9yKQogCQlnb3RvIGVycm9yX2V4aXQ7CiAKLQlpZiAoZWNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKQorCWlmIChjbWQtPmJhc2UuZHVwbGV4ID09IERVUExFWF9GVUxMKQogCQlwcml2LT5kdXBsZXggPSAxOwogCWVsc2UKIAkJcHJpdi0+ZHVwbGV4ID0gMDsKQEAgLTExMTAsOSArMTEwOSw5IEBACiAJaW50IGVycm9yID0gLUVOT0RFVjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKHByaXYtPnBoeWRldikgeworCWlmIChuZGV2LT5waHlkZXYpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJZXJyb3IgPSBwaHlfc3RhcnRfYW5lZyhwcml2LT5waHlkZXYpOworCQllcnJvciA9IHBoeV9zdGFydF9hbmVnKG5kZXYtPnBoeWRldik7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAl9CiAKQEAgLTEzMDksOCArMTMwOCw2IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgcmF2Yl9ldGh0b29sX29wcyA9IHsKLQkuZ2V0X3NldHRpbmdzCQk9IHJhdmJfZ2V0X3NldHRpbmdzLAotCS5zZXRfc2V0dGluZ3MJCT0gcmF2Yl9zZXRfc2V0dGluZ3MsCiAJLm53YXlfcmVzZXQJCT0gcmF2Yl9ud2F5X3Jlc2V0LAogCS5nZXRfbXNnbGV2ZWwJCT0gcmF2Yl9nZXRfbXNnbGV2ZWwsCiAJLnNldF9tc2dsZXZlbAkJPSByYXZiX3NldF9tc2dsZXZlbCwKQEAgLTEzMjEsNiArMTMxOCw4IEBACiAJLmdldF9yaW5ncGFyYW0JCT0gcmF2Yl9nZXRfcmluZ3BhcmFtLAogCS5zZXRfcmluZ3BhcmFtCQk9IHJhdmJfc2V0X3JpbmdwYXJhbSwKIAkuZ2V0X3RzX2luZm8JCT0gcmF2Yl9nZXRfdHNfaW5mbywKKwkuZ2V0X2xpbmtfa3NldHRpbmdzCT0gcmF2Yl9nZXRfbGlua19rc2V0dGluZ3MsCisJLnNldF9saW5rX2tzZXR0aW5ncwk9IHJhdmJfc2V0X2xpbmtfa3NldHRpbmdzLAogfTsKIAogc3RhdGljIGlubGluZSBpbnQgcmF2Yl9ob29rX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBpcnFfaGFuZGxlcl90IGhhbmRsZXIsCkBAIC0xNjYxLDEwICsxNjYwLDkgQEAKIAl9CiAKIAkvKiBQSFkgZGlzY29ubmVjdCAqLwotCWlmIChwcml2LT5waHlkZXYpIHsKLQkJcGh5X3N0b3AocHJpdi0+cGh5ZGV2KTsKLQkJcGh5X2Rpc2Nvbm5lY3QocHJpdi0+cGh5ZGV2KTsKLQkJcHJpdi0+cGh5ZGV2ID0gTlVMTDsKKwlpZiAobmRldi0+cGh5ZGV2KSB7CisJCXBoeV9zdG9wKG5kZXYtPnBoeWRldik7CisJCXBoeV9kaXNjb25uZWN0KG5kZXYtPnBoeWRldik7CiAJfQogCiAJaWYgKHByaXYtPmNoaXBfaWQgIT0gUkNBUl9HRU4yKSB7CkBAIC0xNzUzLDggKzE3NTEsNyBAQAogLyogaW9jdGwgdG8gZGV2aWNlIGZ1bmN0aW9uICovCiBzdGF0aWMgaW50IHJhdmJfZG9faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpZnJlcSAqcmVxLCBpbnQgY21kKQogewotCXN0cnVjdCByYXZiX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gcHJpdi0+cGh5ZGV2OworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBuZGV2LT5waHlkZXY7CiAKIAlpZiAoIW5ldGlmX3J1bm5pbmcobmRldikpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTg3Niw2ICsxODczLDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHJhdmJfc2V0X2NvbmZpZ19tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXN0cnVjdCByYXZiX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworCWlmIChwcml2LT5jaGlwX2lkID09IFJDQVJfR0VOMikgeworCQlyYXZiX21vZGlmeShuZGV2LCBDQ0MsIENDQ19PUEMsIENDQ19PUENfQ09ORklHKTsKKwkJLyogU2V0IENTRUwgdmFsdWUgKi8KKwkJcmF2Yl9tb2RpZnkobmRldiwgQ0NDLCBDQ0NfQ1NFTCwgQ0NDX0NTRUxfSFBCKTsKKwl9IGVsc2UgeworCQlyYXZiX21vZGlmeShuZGV2LCBDQ0MsIENDQ19PUEMsIENDQ19PUENfQ09ORklHIHwKKwkJCSAgICBDQ0NfR0FDIHwgQ0NDX0NTRUxfSFBCKTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgcmF2Yl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKQEAgLTE5NzgsMTQgKzE5ODksNyBAQAogCW5kZXYtPmV0aHRvb2xfb3BzID0gJnJhdmJfZXRodG9vbF9vcHM7CiAKIAkvKiBTZXQgQVZCIGNvbmZpZyBtb2RlICovCi0JaWYgKGNoaXBfaWQgPT0gUkNBUl9HRU4yKSB7Ci0JCXJhdmJfbW9kaWZ5KG5kZXYsIENDQywgQ0NDX09QQywgQ0NDX09QQ19DT05GSUcpOwotCQkvKiBTZXQgQ1NFTCB2YWx1ZSAqLwotCQlyYXZiX21vZGlmeShuZGV2LCBDQ0MsIENDQ19DU0VMLCBDQ0NfQ1NFTF9IUEIpOwotCX0gZWxzZSB7Ci0JCXJhdmJfbW9kaWZ5KG5kZXYsIENDQywgQ0NDX09QQywgQ0NDX09QQ19DT05GSUcgfAotCQkJICAgIENDQ19HQUMgfCBDQ0NfQ1NFTF9IUEIpOwotCX0KKwlyYXZiX3NldF9jb25maWdfbW9kZShuZGV2KTsKIAogCS8qIFNldCBHVEkgdmFsdWUgKi8KIAllcnJvciA9IHJhdmJfc2V0X2d0aShuZGV2KTsKQEAgLTIwOTYsOCArMjEwMCw1NSBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHJhdmJfcnVudGltZV9ub3Aoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBfX21heWJlX3VudXNlZCByYXZiX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldCA9IDA7CisKKwlpZiAobmV0aWZfcnVubmluZyhuZGV2KSkgeworCQluZXRpZl9kZXZpY2VfZGV0YWNoKG5kZXYpOworCQlyZXQgPSByYXZiX2Nsb3NlKG5kZXYpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgcmF2Yl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHJhdmJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCWludCByZXQgPSAwOworCisJLyogQWxsIHJlZ2lzdGVyIGhhdmUgYmVlbiByZXNldCB0byBkZWZhdWx0IHZhbHVlcy4KKwkgKiBSZXN0b3JlIGFsbCByZWdpc3RlcnMgd2hpY2ggd2hlcmUgc2V0dXAgYXQgcHJvYmUgdGltZSBhbmQKKwkgKiByZW9wZW4gZGV2aWNlIGlmIGl0IHdhcyBydW5uaW5nIGJlZm9yZSBzeXN0ZW0gc3VzcGVuZGVkLgorCSAqLworCisJLyogU2V0IEFWQiBjb25maWcgbW9kZSAqLworCXJhdmJfc2V0X2NvbmZpZ19tb2RlKG5kZXYpOworCisJLyogU2V0IEdUSSB2YWx1ZSAqLworCXJldCA9IHJhdmJfc2V0X2d0aShuZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogUmVxdWVzdCBHVEkgbG9hZGluZyAqLworCXJhdmJfbW9kaWZ5KG5kZXYsIEdDQ1IsIEdDQ1JfTFRJLCBHQ0NSX0xUSSk7CisKKwkvKiBSZXN0b3JlIGRlc2NyaXB0b3IgYmFzZSBhZGRyZXNzIHRhYmxlICovCisJcmF2Yl93cml0ZShuZGV2LCBwcml2LT5kZXNjX2JhdF9kbWEsIERCQVQpOworCisJaWYgKG5ldGlmX3J1bm5pbmcobmRldikpIHsKKwkJcmV0ID0gcmF2Yl9vcGVuKG5kZXYpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCW5ldGlmX2RldmljZV9hdHRhY2gobmRldik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX21heWJlX3VudXNlZCByYXZiX3J1bnRpbWVfbm9wKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAkvKiBSdW50aW1lIFBNIGNhbGxiYWNrIHNoYXJlZCBiZXR3ZWVuIC0+cnVudGltZV9zdXNwZW5kKCkKIAkgKiBhbmQgLT5ydW50aW1lX3Jlc3VtZSgpLiBTaW1wbHkgcmV0dXJucyBzdWNjZXNzLgpAQCAtMjExMCwyMCArMjE2MSwxNiBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgcmF2Yl9kZXZfcG1fb3BzID0geworCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKHJhdmJfc3VzcGVuZCwgcmF2Yl9yZXN1bWUpCiAJU0VUX1JVTlRJTUVfUE1fT1BTKHJhdmJfcnVudGltZV9ub3AsIHJhdmJfcnVudGltZV9ub3AsIE5VTEwpCiB9OwogCi0jZGVmaW5lIFJBVkJfUE1fT1BTICgmcmF2Yl9kZXZfcG1fb3BzKQotI2Vsc2UKLSNkZWZpbmUgUkFWQl9QTV9PUFMgTlVMTAotI2VuZGlmCi0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHJhdmJfZHJpdmVyID0gewogCS5wcm9iZQkJPSByYXZiX3Byb2JlLAogCS5yZW1vdmUJCT0gcmF2Yl9yZW1vdmUsCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUJPSAicmF2YiIsCi0JCS5wbQk9IFJBVkJfUE1fT1BTLAorCQkucG0JPSAmcmF2Yl9kZXZfcG1fb3BzLAogCQkub2ZfbWF0Y2hfdGFibGUgPSByYXZiX21hdGNoX3RhYmxlLAogCX0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVuZXNhcy9zaF9ldGguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvc2hfZXRoLmMKaW5kZXggNzk5ZDU4ZC4uMDViMGRjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVuZXNhcy9zaF9ldGguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZW5lc2FzL3NoX2V0aC5jCkBAIC0yMDEsOSArMjAxLDE0IEBACiAKIAlbQVJTVFJdCQk9IDB4MDAwMCwKIAlbVFNVX0NUUlNUXQk9IDB4MDAwNCwKKwlbVFNVX0ZXU0xDXQk9IDB4MDAzOCwKIAlbVFNVX1ZUQUcwXQk9IDB4MDA1OCwKIAlbVFNVX0FEU0JTWV0JPSAweDAwNjAsCiAJW1RTVV9URU5dCT0gMHgwMDY0LAorCVtUU1VfUE9TVDFdCT0gMHgwMDcwLAorCVtUU1VfUE9TVDJdCT0gMHgwMDc0LAorCVtUU1VfUE9TVDNdCT0gMHgwMDc4LAorCVtUU1VfUE9TVDRdCT0gMHgwMDdjLAogCVtUU1VfQURSSDBdCT0gMHgwMTAwLAogCiAJW1RYTkxDUjBdCT0gMHgwMDgwLApAQCAtMTcyMyw3ICsxNzI4LDcgQEAKIHN0YXRpYyB2b2lkIHNoX2V0aF9hZGp1c3RfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKIAlzdHJ1Y3Qgc2hfZXRoX3ByaXZhdGUgKm1kcCA9IG5ldGRldl9wcml2KG5kZXYpOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBtZHAtPnBoeWRldjsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gbmRldi0+cGh5ZGV2OwogCWludCBuZXdfc3RhdGUgPSAwOwogCiAJaWYgKHBoeWRldi0+bGluaykgewpAQCAtMTgwMCw1MSArMTgwNSw0OCBAQAogCiAJcGh5X2F0dGFjaGVkX2luZm8ocGh5ZGV2KTsKIAotCW1kcC0+cGh5ZGV2ID0gcGh5ZGV2OwotCiAJcmV0dXJuIDA7CiB9CiAKIC8qIFBIWSBjb250cm9sIHN0YXJ0IGZ1bmN0aW9uICovCiBzdGF0aWMgaW50IHNoX2V0aF9waHlfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7Ci0Jc3RydWN0IHNoX2V0aF9wcml2YXRlICptZHAgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAlpbnQgcmV0OwogCiAJcmV0ID0gc2hfZXRoX3BoeV9pbml0KG5kZXYpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlwaHlfc3RhcnQobWRwLT5waHlkZXYpOworCXBoeV9zdGFydChuZGV2LT5waHlkZXYpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2hfZXRoX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCitzdGF0aWMgaW50IHNoX2V0aF9nZXRfbGlua19rc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCisJCQkJICAgICBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQogewogCXN0cnVjdCBzaF9ldGhfcHJpdmF0ZSAqbWRwID0gbmV0ZGV2X3ByaXYobmRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OwogCi0JaWYgKCFtZHAtPnBoeWRldikKKwlpZiAoIW5kZXYtPnBoeWRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbWRwLT5sb2NrLCBmbGFncyk7Ci0JcmV0ID0gcGh5X2V0aHRvb2xfZ3NldChtZHAtPnBoeWRldiwgZWNtZCk7CisJcmV0ID0gcGh5X2V0aHRvb2xfa3NldHRpbmdzX2dldChuZGV2LT5waHlkZXYsIGNtZCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRwLT5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHNoX2V0aF9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCi0JCQkgICAgICAgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQorc3RhdGljIGludCBzaF9ldGhfc2V0X2xpbmtfa3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKIHsKIAlzdHJ1Y3Qgc2hfZXRoX3ByaXZhdGUgKm1kcCA9IG5ldGRldl9wcml2KG5kZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKIAotCWlmICghbWRwLT5waHlkZXYpCisJaWYgKCFuZGV2LT5waHlkZXYpCiAJCXJldHVybiAtRU5PREVWOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1kcC0+bG9jaywgZmxhZ3MpOwpAQCAtMTg1MiwxMSArMTg1NCwxMSBAQAogCS8qIGRpc2FibGUgdHggYW5kIHJ4ICovCiAJc2hfZXRoX3Jjdl9zbmRfZGlzYWJsZShuZGV2KTsKIAotCXJldCA9IHBoeV9ldGh0b29sX3NzZXQobWRwLT5waHlkZXYsIGVjbWQpOworCXJldCA9IHBoeV9ldGh0b29sX2tzZXR0aW5nc19zZXQobmRldi0+cGh5ZGV2LCBjbWQpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfZXhpdDsKIAotCWlmIChlY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJaWYgKGNtZC0+YmFzZS5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCiAJCW1kcC0+ZHVwbGV4ID0gMTsKIAllbHNlCiAJCW1kcC0+ZHVwbGV4ID0gMDsKQEAgLTIwNjcsMTEgKzIwNjksMTEgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQ7CiAKLQlpZiAoIW1kcC0+cGh5ZGV2KQorCWlmICghbmRldi0+cGh5ZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZtZHAtPmxvY2ssIGZsYWdzKTsKLQlyZXQgPSBwaHlfc3RhcnRfYW5lZyhtZHAtPnBoeWRldik7CisJcmV0ID0gcGh5X3N0YXJ0X2FuZWcobmRldi0+cGh5ZGV2KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZHAtPmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiByZXQ7CkBAIC0yMTk4LDggKzIyMDAsNiBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHNoX2V0aF9ldGh0b29sX29wcyA9IHsKLQkuZ2V0X3NldHRpbmdzCT0gc2hfZXRoX2dldF9zZXR0aW5ncywKLQkuc2V0X3NldHRpbmdzCT0gc2hfZXRoX3NldF9zZXR0aW5ncywKIAkuZ2V0X3JlZ3NfbGVuCT0gc2hfZXRoX2dldF9yZWdzX2xlbiwKIAkuZ2V0X3JlZ3MJPSBzaF9ldGhfZ2V0X3JlZ3MsCiAJLm53YXlfcmVzZXQJPSBzaF9ldGhfbndheV9yZXNldCwKQEAgLTIyMTEsNiArMjIxMSw4IEBACiAJLmdldF9zc2V0X2NvdW50ICAgICA9IHNoX2V0aF9nZXRfc3NldF9jb3VudCwKIAkuZ2V0X3JpbmdwYXJhbQk9IHNoX2V0aF9nZXRfcmluZ3BhcmFtLAogCS5zZXRfcmluZ3BhcmFtCT0gc2hfZXRoX3NldF9yaW5ncGFyYW0sCisJLmdldF9saW5rX2tzZXR0aW5ncyA9IHNoX2V0aF9nZXRfbGlua19rc2V0dGluZ3MsCisJLnNldF9saW5rX2tzZXR0aW5ncyA9IHNoX2V0aF9zZXRfbGlua19rc2V0dGluZ3MsCiB9OwogCiAvKiBuZXR3b3JrIGRldmljZSBvcGVuIGZ1bmN0aW9uICovCkBAIC0yNDA4LDEwICsyNDEwLDkgQEAKIAlzaF9ldGhfZGV2X2V4aXQobmRldik7CiAKIAkvKiBQSFkgRGlzY29ubmVjdCAqLwotCWlmIChtZHAtPnBoeWRldikgewotCQlwaHlfc3RvcChtZHAtPnBoeWRldik7Ci0JCXBoeV9kaXNjb25uZWN0KG1kcC0+cGh5ZGV2KTsKLQkJbWRwLT5waHlkZXYgPSBOVUxMOworCWlmIChuZGV2LT5waHlkZXYpIHsKKwkJcGh5X3N0b3AobmRldi0+cGh5ZGV2KTsKKwkJcGh5X2Rpc2Nvbm5lY3QobmRldi0+cGh5ZGV2KTsKIAl9CiAKIAlmcmVlX2lycShuZGV2LT5pcnEsIG5kZXYpOwpAQCAtMjQyOSw4ICsyNDMwLDcgQEAKIC8qIGlvY3RsIHRvIGRldmljZSBmdW5jdGlvbiAqLwogc3RhdGljIGludCBzaF9ldGhfZG9faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCiB7Ci0Jc3RydWN0IHNoX2V0aF9wcml2YXRlICptZHAgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gbWRwLT5waHlkZXY7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IG5kZXYtPnBoeWRldjsKIAogCWlmICghbmV0aWZfcnVubmluZyhuZGV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yNzg2LDYgKzI3ODYsOCBAQAogewogCWlmIChzaF9ldGhfaXNfcnpfZmFzdF9ldGhlcihtZHApKSB7CiAJCXNoX2V0aF90c3Vfd3JpdGUobWRwLCAwLCBUU1VfVEVOKTsgLyogRGlzYWJsZSBhbGwgQ0FNIGVudHJ5ICovCisJCXNoX2V0aF90c3Vfd3JpdGUobWRwLCBUU1VfRldTTENfUE9TVEVOVSB8IFRTVV9GV1NMQ19QT1NURU5MLAorCQkJCSBUU1VfRldTTEMpOwkvKiBFbmFibGUgUE9TVCByZWdpc3RlcnMgKi8KIAkJcmV0dXJuOwogCX0KIApAQCAtMjk1Nyw2ICsyOTU5LDggQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc2hfZXRoX21hdGNoX3RhYmxlW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLGdldGhlci1yOGE3NzQwIiwgLmRhdGEgPSAmcjhhNzc0MF9kYXRhIH0sCisJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLGV0aGVyLXI4YTc3NDMiLCAuZGF0YSA9ICZyOGE3Nzl4X2RhdGEgfSwKKwl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMsZXRoZXItcjhhNzc0NSIsIC5kYXRhID0gJnI4YTc3OXhfZGF0YSB9LAogCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxldGhlci1yOGE3Nzc4IiwgLmRhdGEgPSAmcjhhNzc3eF9kYXRhIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLGV0aGVyLXI4YTc3NzkiLCAuZGF0YSA9ICZyOGE3Nzd4X2RhdGEgfSwKIAl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMsZXRoZXItcjhhNzc5MCIsIC5kYXRhID0gJnI4YTc3OXhfZGF0YSB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVuZXNhcy9zaF9ldGguaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvc2hfZXRoLmgKaW5kZXggYzYyMzgwZS4uZDA1MGYzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVuZXNhcy9zaF9ldGguaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZW5lc2FzL3NoX2V0aC5oCkBAIC01MTgsNyArNTE4LDYgQEAKIAkvKiBNSUkgdHJhbnNjZWl2ZXIgc2VjdGlvbi4gKi8KIAl1MzIgcGh5X2lkOwkJCS8qIFBIWSBJRCAqLwogCXN0cnVjdCBtaWlfYnVzICptaWlfYnVzOwkvKiBNRElPIGJ1cyBjb250cm9sICovCi0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsJLyogUEhZIGRldmljZSBjb250cm9sICovCiAJaW50IGxpbms7CiAJcGh5X2ludGVyZmFjZV90IHBoeV9pbnRlcmZhY2U7CiAJaW50IG1zZ19lbmFibGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yb2NrZXIvcm9ja2VyLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yb2NrZXIvcm9ja2VyLmgKaW5kZXggMWFiOTk1Zi4uMmViOWI0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcm9ja2VyL3JvY2tlci5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JvY2tlci9yb2NrZXIuaApAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxuZXQvbmVpZ2hib3VyLmg+CiAjaW5jbHVkZSA8bmV0L3N3aXRjaGRldi5oPgogCkBAIC01Miw2ICs1Myw5IEBACiAJc3RydWN0IHJvY2tlcl9kbWFfcmluZ19pbmZvIHJ4X3Jpbmc7CiB9OwogCitzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0X2Rldl9sb3dlcl9maW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgICAgICBzdHJ1Y3Qgcm9ja2VyICpyb2NrZXIpOworCiBzdHJ1Y3Qgcm9ja2VyX3dvcmxkX29wczsKIAogc3RydWN0IHJvY2tlciB7CkBAIC02Niw2ICs3MCw3IEBACiAJc3BpbmxvY2tfdCBjbWRfcmluZ19sb2NrOwkJLyogZm9yIGNtZCByaW5nIGFjY2Vzc2VzICovCiAJc3RydWN0IHJvY2tlcl9kbWFfcmluZ19pbmZvIGNtZF9yaW5nOwogCXN0cnVjdCByb2NrZXJfZG1hX3JpbmdfaW5mbyBldmVudF9yaW5nOworCXN0cnVjdCBub3RpZmllcl9ibG9jayBmaWJfbmI7CiAJc3RydWN0IHJvY2tlcl93b3JsZF9vcHMgKndvcHM7CiAJdm9pZCAqd3ByaXY7CiB9OwpAQCAtMTE3LDExICsxMjIsNiBAQAogCWludCAoKnBvcnRfb2JqX3ZsYW5fZHVtcCkoY29uc3Qgc3RydWN0IHJvY2tlcl9wb3J0ICpyb2NrZXJfcG9ydCwKIAkJCQkgIHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfdmxhbiAqdmxhbiwKIAkJCQkgIHN3aXRjaGRldl9vYmpfZHVtcF9jYl90ICpjYik7Ci0JaW50ICgqcG9ydF9vYmpfZmliNF9hZGQpKHN0cnVjdCByb2NrZXJfcG9ydCAqcm9ja2VyX3BvcnQsCi0JCQkJIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX2lwdjRfZmliICpmaWI0LAotCQkJCSBzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zICp0cmFucyk7Ci0JaW50ICgqcG9ydF9vYmpfZmliNF9kZWwpKHN0cnVjdCByb2NrZXJfcG9ydCAqcm9ja2VyX3BvcnQsCi0JCQkJIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX2lwdjRfZmliICpmaWI0KTsKIAlpbnQgKCpwb3J0X29ial9mZGJfYWRkKShzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0LAogCQkJCWNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfZmRiICpmZGIsCiAJCQkJc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpOwpAQCAtMTQxLDYgKzE0MSwxMSBAQAogCWludCAoKnBvcnRfZXZfbWFjX3ZsYW5fc2Vlbikoc3RydWN0IHJvY2tlcl9wb3J0ICpyb2NrZXJfcG9ydCwKIAkJCQkgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsCiAJCQkJICAgICBfX2JlMTYgdmxhbl9pZCk7CisJaW50ICgqZmliNF9hZGQpKHN0cnVjdCByb2NrZXIgKnJvY2tlciwKKwkJCWNvbnN0IHN0cnVjdCBmaWJfZW50cnlfbm90aWZpZXJfaW5mbyAqZmVuX2luZm8pOworCWludCAoKmZpYjRfZGVsKShzdHJ1Y3Qgcm9ja2VyICpyb2NrZXIsCisJCQljb25zdCBzdHJ1Y3QgZmliX2VudHJ5X25vdGlmaWVyX2luZm8gKmZlbl9pbmZvKTsKKwl2b2lkICgqZmliNF9hYm9ydCkoc3RydWN0IHJvY2tlciAqcm9ja2VyKTsKIH07CiAKIGV4dGVybiBzdHJ1Y3Qgcm9ja2VyX3dvcmxkX29wcyByb2NrZXJfb2ZkcGFfb3BzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcm9ja2VyL3JvY2tlcl9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yb2NrZXIvcm9ja2VyX21haW4uYwppbmRleCBmMGIwOWIwLi41NDI0ZmIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yb2NrZXIvcm9ja2VyX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yb2NrZXIvcm9ja2VyX21haW4uYwpAQCAtMTYyNSwyOSArMTYyNSw2IEBACiB9CiAKIHN0YXRpYyBpbnQKLXJvY2tlcl93b3JsZF9wb3J0X29ial9maWI0X2FkZChzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0LAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX2lwdjRfZmliICpmaWI0LAotCQkJICAgICAgIHN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zKQotewotCXN0cnVjdCByb2NrZXJfd29ybGRfb3BzICp3b3BzID0gcm9ja2VyX3BvcnQtPnJvY2tlci0+d29wczsKLQotCWlmICghd29wcy0+cG9ydF9vYmpfZmliNF9hZGQpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQlyZXR1cm4gd29wcy0+cG9ydF9vYmpfZmliNF9hZGQocm9ja2VyX3BvcnQsIGZpYjQsIHRyYW5zKTsKLX0KLQotc3RhdGljIGludAotcm9ja2VyX3dvcmxkX3BvcnRfb2JqX2ZpYjRfZGVsKHN0cnVjdCByb2NrZXJfcG9ydCAqcm9ja2VyX3BvcnQsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfaXB2NF9maWIgKmZpYjQpCi17Ci0Jc3RydWN0IHJvY2tlcl93b3JsZF9vcHMgKndvcHMgPSByb2NrZXJfcG9ydC0+cm9ja2VyLT53b3BzOwotCi0JaWYgKCF3b3BzLT5wb3J0X29ial9maWI0X2RlbCkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCXJldHVybiB3b3BzLT5wb3J0X29ial9maWI0X2RlbChyb2NrZXJfcG9ydCwgZmliNCk7Ci19Ci0KLXN0YXRpYyBpbnQKIHJvY2tlcl93b3JsZF9wb3J0X29ial9mZGJfYWRkKHN0cnVjdCByb2NrZXJfcG9ydCAqcm9ja2VyX3BvcnQsCiAJCQkgICAgICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X2ZkYiAqZmRiLAogCQkJICAgICAgc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpCkBAIC0xNzMzLDYgKzE3MTAsMzQgQEAKIAlyZXR1cm4gd29wcy0+cG9ydF9ldl9tYWNfdmxhbl9zZWVuKHJvY2tlcl9wb3J0LCBhZGRyLCB2bGFuX2lkKTsKIH0KIAorc3RhdGljIGludCByb2NrZXJfd29ybGRfZmliNF9hZGQoc3RydWN0IHJvY2tlciAqcm9ja2VyLAorCQkJCSBjb25zdCBzdHJ1Y3QgZmliX2VudHJ5X25vdGlmaWVyX2luZm8gKmZlbl9pbmZvKQoreworCXN0cnVjdCByb2NrZXJfd29ybGRfb3BzICp3b3BzID0gcm9ja2VyLT53b3BzOworCisJaWYgKCF3b3BzLT5maWI0X2FkZCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHdvcHMtPmZpYjRfYWRkKHJvY2tlciwgZmVuX2luZm8pOworfQorCitzdGF0aWMgaW50IHJvY2tlcl93b3JsZF9maWI0X2RlbChzdHJ1Y3Qgcm9ja2VyICpyb2NrZXIsCisJCQkJIGNvbnN0IHN0cnVjdCBmaWJfZW50cnlfbm90aWZpZXJfaW5mbyAqZmVuX2luZm8pCit7CisJc3RydWN0IHJvY2tlcl93b3JsZF9vcHMgKndvcHMgPSByb2NrZXItPndvcHM7CisKKwlpZiAoIXdvcHMtPmZpYjRfZGVsKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gd29wcy0+ZmliNF9kZWwocm9ja2VyLCBmZW5faW5mbyk7Cit9CisKK3N0YXRpYyB2b2lkIHJvY2tlcl93b3JsZF9maWI0X2Fib3J0KHN0cnVjdCByb2NrZXIgKnJvY2tlcikKK3sKKwlzdHJ1Y3Qgcm9ja2VyX3dvcmxkX29wcyAqd29wcyA9IHJvY2tlci0+d29wczsKKworCWlmICh3b3BzLT5maWI0X2Fib3J0KQorCQl3b3BzLT5maWI0X2Fib3J0KHJvY2tlcik7Cit9CisKIC8qKioqKioqKioqKioqKioqKgogICogTmV0IGRldmljZSBvcHMKICAqKioqKioqKioqKioqKioqKi8KQEAgLTIwOTYsMTEgKzIxMDEsNiBAQAogCQkJCQkJICAgICBTV0lUQ0hERVZfT0JKX1BPUlRfVkxBTihvYmopLAogCQkJCQkJICAgICB0cmFucyk7CiAJCWJyZWFrOwotCWNhc2UgU1dJVENIREVWX09CSl9JRF9JUFY0X0ZJQjoKLQkJZXJyID0gcm9ja2VyX3dvcmxkX3BvcnRfb2JqX2ZpYjRfYWRkKHJvY2tlcl9wb3J0LAotCQkJCQkJICAgICBTV0lUQ0hERVZfT0JKX0lQVjRfRklCKG9iaiksCi0JCQkJCQkgICAgIHRyYW5zKTsKLQkJYnJlYWs7CiAJY2FzZSBTV0lUQ0hERVZfT0JKX0lEX1BPUlRfRkRCOgogCQllcnIgPSByb2NrZXJfd29ybGRfcG9ydF9vYmpfZmRiX2FkZChyb2NrZXJfcG9ydCwKIAkJCQkJCSAgICBTV0lUQ0hERVZfT0JKX1BPUlRfRkRCKG9iaiksCkBAIC0yMTI1LDEwICsyMTI1LDYgQEAKIAkJZXJyID0gcm9ja2VyX3dvcmxkX3BvcnRfb2JqX3ZsYW5fZGVsKHJvY2tlcl9wb3J0LAogCQkJCQkJICAgICBTV0lUQ0hERVZfT0JKX1BPUlRfVkxBTihvYmopKTsKIAkJYnJlYWs7Ci0JY2FzZSBTV0lUQ0hERVZfT0JKX0lEX0lQVjRfRklCOgotCQllcnIgPSByb2NrZXJfd29ybGRfcG9ydF9vYmpfZmliNF9kZWwocm9ja2VyX3BvcnQsCi0JCQkJCQkgICAgIFNXSVRDSERFVl9PQkpfSVBWNF9GSUIob2JqKSk7Ci0JCWJyZWFrOwogCWNhc2UgU1dJVENIREVWX09CSl9JRF9QT1JUX0ZEQjoKIAkJZXJyID0gcm9ja2VyX3dvcmxkX3BvcnRfb2JqX2ZkYl9kZWwocm9ja2VyX3BvcnQsCiAJCQkJCQkgICAgU1dJVENIREVWX09CSl9QT1JUX0ZEQihvYmopKTsKQEAgLTIxNzUsNiArMjE3MSwzMSBAQAogCS5zd2l0Y2hkZXZfcG9ydF9vYmpfZHVtcAk9IHJvY2tlcl9wb3J0X29ial9kdW1wLAogfTsKIAorc3RhdGljIGludCByb2NrZXJfcm91dGVyX2ZpYl9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3Qgcm9ja2VyICpyb2NrZXIgPSBjb250YWluZXJfb2YobmIsIHN0cnVjdCByb2NrZXIsIGZpYl9uYik7CisJc3RydWN0IGZpYl9lbnRyeV9ub3RpZmllcl9pbmZvICpmZW5faW5mbyA9IHB0cjsKKwlpbnQgZXJyOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgRklCX0VWRU5UX0VOVFJZX0FERDoKKwkJZXJyID0gcm9ja2VyX3dvcmxkX2ZpYjRfYWRkKHJvY2tlciwgZmVuX2luZm8pOworCQlpZiAoZXJyKQorCQkJcm9ja2VyX3dvcmxkX2ZpYjRfYWJvcnQocm9ja2VyKTsKKwkJZWxzZQorCQlicmVhazsKKwljYXNlIEZJQl9FVkVOVF9FTlRSWV9ERUw6CisJCXJvY2tlcl93b3JsZF9maWI0X2RlbChyb2NrZXIsIGZlbl9pbmZvKTsKKwkJYnJlYWs7CisJY2FzZSBGSUJfRVZFTlRfUlVMRV9BREQ6IC8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgRklCX0VWRU5UX1JVTEVfREVMOgorCQlyb2NrZXJfd29ybGRfZmliNF9hYm9ydChyb2NrZXIpOworCQlicmVhazsKKwl9CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCiAvKioqKioqKioqKioqKioqKioqKioKICAqIGV0aHRvb2wgaW50ZXJmYWNlCiAgKioqKioqKioqKioqKioqKioqKiovCkBAIC0yNDEyLDcgKzI0MzMsNyBAQAogCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHJvY2tlcl9wb3J0LT5kZXYpOwogCiAJaWYgKHJ4X2ZsYWdzICYgUk9DS0VSX1JYX0ZMQUdTX0ZXRF9PRkZMT0FEKQotCQlza2ItPm9mZmxvYWRfZndkX21hcmsgPSByb2NrZXJfcG9ydC0+ZGV2LT5vZmZsb2FkX2Z3ZF9tYXJrOworCQlza2ItPm9mZmxvYWRfZndkX21hcmsgPSAxOwogCiAJcm9ja2VyX3BvcnQtPmRldi0+c3RhdHMucnhfcGFja2V0cysrOwogCXJvY2tlcl9wb3J0LT5kZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOwpAQCAtMjc0MCw2ICsyNzYxLDkgQEAKIAkJZ290byBlcnJfcHJvYmVfcG9ydHM7CiAJfQogCisJcm9ja2VyLT5maWJfbmIubm90aWZpZXJfY2FsbCA9IHJvY2tlcl9yb3V0ZXJfZmliX2V2ZW50OworCXJlZ2lzdGVyX2ZpYl9ub3RpZmllcigmcm9ja2VyLT5maWJfbmIpOworCiAJZGV2X2luZm8oJnBkZXYtPmRldiwgIlJvY2tlciBzd2l0Y2ggd2l0aCBpZCAlKnBoTlxuIiwKIAkJIChpbnQpc2l6ZW9mKHJvY2tlci0+aHcuaWQpLCAmcm9ja2VyLT5ody5pZCk7CiAKQEAgLTI3NzEsNiArMjc5NSw3IEBACiB7CiAJc3RydWN0IHJvY2tlciAqcm9ja2VyID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCisJdW5yZWdpc3Rlcl9maWJfbm90aWZpZXIoJnJvY2tlci0+ZmliX25iKTsKIAlyb2NrZXJfd3JpdGUzMihyb2NrZXIsIENPTlRST0wsIFJPQ0tFUl9DT05UUk9MX1JFU0VUKTsKIAlyb2NrZXJfcmVtb3ZlX3BvcnRzKHJvY2tlcik7CiAJZnJlZV9pcnEocm9ja2VyX21zaXhfdmVjdG9yKHJvY2tlciwgUk9DS0VSX01TSVhfVkVDX0VWRU5UKSwgcm9ja2VyKTsKQEAgLTI3OTksNiArMjgyNCwzNyBAQAogCXJldHVybiBkZXYtPm5ldGRldl9vcHMgPT0gJnJvY2tlcl9wb3J0X25ldGRldl9vcHM7CiB9CiAKK3N0YXRpYyBib29sIHJvY2tlcl9wb3J0X2Rldl9jaGVja191bmRlcihjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3Qgcm9ja2VyICpyb2NrZXIpCit7CisJc3RydWN0IHJvY2tlcl9wb3J0ICpyb2NrZXJfcG9ydDsKKworCWlmICghcm9ja2VyX3BvcnRfZGV2X2NoZWNrKGRldikpCisJCXJldHVybiBmYWxzZTsKKworCXJvY2tlcl9wb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpZiAocm9ja2VyX3BvcnQtPnJvY2tlciAhPSByb2NrZXIpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0X2Rldl9sb3dlcl9maW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgICAgICBzdHJ1Y3Qgcm9ja2VyICpyb2NrZXIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmxvd2VyX2RldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOworCisJaWYgKHJvY2tlcl9wb3J0X2Rldl9jaGVja191bmRlcihkZXYsIHJvY2tlcikpCisJCXJldHVybiBuZXRkZXZfcHJpdihkZXYpOworCisJbmV0ZGV2X2Zvcl9lYWNoX2FsbF9sb3dlcl9kZXYoZGV2LCBsb3dlcl9kZXYsIGl0ZXIpIHsKKwkJaWYgKHJvY2tlcl9wb3J0X2Rldl9jaGVja191bmRlcihsb3dlcl9kZXYsIHJvY2tlcikpCisJCQlyZXR1cm4gbmV0ZGV2X3ByaXYobG93ZXJfZGV2KTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKIHN0YXRpYyBpbnQgcm9ja2VyX25ldGRldmljZV9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnVudXNlZCwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JvY2tlci9yb2NrZXJfb2ZkcGEuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JvY2tlci9yb2NrZXJfb2ZkcGEuYwppbmRleCAxY2E3OTYzLi40MzFhNjA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yb2NrZXIvcm9ja2VyX29mZHBhLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcm9ja2VyL3JvY2tlcl9vZmRwYS5jCkBAIC05OSw2ICs5OSw3IEBACiAJc3RydWN0IG9mZHBhX2Zsb3dfdGJsX2tleSBrZXk7CiAJc2l6ZV90IGtleV9sZW47CiAJdTMyIGtleV9jcmMzMjsgLyoga2V5ICovCisJc3RydWN0IGZpYl9pbmZvICpmaTsKIH07CiAKIHN0cnVjdCBvZmRwYV9ncm91cF90YmxfZW50cnkgewpAQCAtMTg5LDYgKzE5MCw3IEBACiAJc3BpbmxvY2tfdCBuZWlnaF90YmxfbG9jazsJCS8qIGZvciBuZWlnaCB0YmwgYWNjZXNzZXMgKi8KIAl1MzIgbmVpZ2hfdGJsX25leHRfaW5kZXg7CiAJdW5zaWduZWQgbG9uZyBhZ2VpbmdfdGltZTsKKwlib29sIGZpYl9hYm9ydGVkOwogfTsKIAogc3RydWN0IG9mZHBhX3BvcnQgewpAQCAtMTA0Myw3ICsxMDQ1LDggQEAKIAkJCQkJIF9fYmUxNiBldGhfdHlwZSwgX19iZTMyIGRzdCwKIAkJCQkJIF9fYmUzMiBkc3RfbWFzaywgdTMyIHByaW9yaXR5LAogCQkJCQkgZW51bSByb2NrZXJfb2ZfZHBhX3RhYmxlX2lkIGdvdG9fdGJsLAotCQkJCQkgdTMyIGdyb3VwX2lkLCBpbnQgZmxhZ3MpCisJCQkJCSB1MzIgZ3JvdXBfaWQsIHN0cnVjdCBmaWJfaW5mbyAqZmksCisJCQkJCSBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IG9mZHBhX2Zsb3dfdGJsX2VudHJ5ICplbnRyeTsKIApAQCAtMTA2MCw2ICsxMDYzLDcgQEAKIAllbnRyeS0+a2V5LnVjYXN0X3JvdXRpbmcuZ3JvdXBfaWQgPSBncm91cF9pZDsKIAllbnRyeS0+a2V5X2xlbiA9IG9mZnNldG9mKHN0cnVjdCBvZmRwYV9mbG93X3RibF9rZXksCiAJCQkJICB1Y2FzdF9yb3V0aW5nLmdyb3VwX2lkKTsKKwllbnRyeS0+ZmkgPSBmaTsKIAogCXJldHVybiBvZmRwYV9mbG93X3RibF9kbyhvZmRwYV9wb3J0LCB0cmFucywgZmxhZ3MsIGVudHJ5KTsKIH0KQEAgLTE0MjUsNyArMTQyOSw3IEBACiAJCQkJCQkgICAgZXRoX3R5cGUsIGlwX2FkZHIsCiAJCQkJCQkgICAgaW5ldF9tYWtlX21hc2soMzIpLAogCQkJCQkJICAgIHByaW9yaXR5LCBnb3RvX3RibCwKLQkJCQkJCSAgICBncm91cF9pZCwgZmxhZ3MpOworCQkJCQkJICAgIGdyb3VwX2lkLCBOVUxMLCBmbGFncyk7CiAKIAkJaWYgKGVycikKIAkJCW5ldGRldl9lcnIob2ZkcGFfcG9ydC0+ZGV2LCAiRXJyb3IgKCVkKSAvMzIgdW5pY2FzdCByb3V0ZSAlcEk0IGdyb3VwIDB4JTA4eFxuIiwKQEAgLTIzOTAsNyArMjM5NCw3IEBACiAKIHN0YXRpYyBpbnQgb2ZkcGFfcG9ydF9maWJfaXB2NChzdHJ1Y3Qgb2ZkcGFfcG9ydCAqb2ZkcGFfcG9ydCwKIAkJCSAgICAgICBzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zICp0cmFucywgX19iZTMyIGRzdCwKLQkJCSAgICAgICBpbnQgZHN0X2xlbiwgY29uc3Qgc3RydWN0IGZpYl9pbmZvICpmaSwKKwkJCSAgICAgICBpbnQgZHN0X2xlbiwgc3RydWN0IGZpYl9pbmZvICpmaSwKIAkJCSAgICAgICB1MzIgdGJfaWQsIGludCBmbGFncykKIHsKIAljb25zdCBzdHJ1Y3QgZmliX25oICpuaDsKQEAgLTI0MjYsNyArMjQzMCw3IEBACiAKIAllcnIgPSBvZmRwYV9mbG93X3RibF91Y2FzdDRfcm91dGluZyhvZmRwYV9wb3J0LCB0cmFucywgZXRoX3R5cGUsIGRzdCwKIAkJCQkJICAgIGRzdF9tYXNrLCBwcmlvcml0eSwgZ290b190YmwsCi0JCQkJCSAgICBncm91cF9pZCwgZmxhZ3MpOworCQkJCQkgICAgZ3JvdXBfaWQsIGZpLCBmbGFncyk7CiAJaWYgKGVycikKIAkJbmV0ZGV2X2VycihvZmRwYV9wb3J0LT5kZXYsICJFcnJvciAoJWQpIElQdjQgcm91dGUgJXBJNFxuIiwKIAkJCSAgIGVyciwgJmRzdCk7CkBAIC0yNTU4LDcgKzI1NjIsNiBAQAogCXN0cnVjdCBvZmRwYV9wb3J0ICpvZmRwYV9wb3J0ID0gcm9ja2VyX3BvcnQtPndwcml2OwogCWludCBlcnI7CiAKLQlzd2l0Y2hkZXZfcG9ydF9md2RfbWFya19zZXQob2ZkcGFfcG9ydC0+ZGV2LCBOVUxMLCBmYWxzZSk7CiAJcm9ja2VyX3BvcnRfc2V0X2xlYXJuaW5nKHJvY2tlcl9wb3J0LAogCQkJCSAhIShvZmRwYV9wb3J0LT5icnBvcnRfZmxhZ3MgJiBCUl9MRUFSTklORykpOwogCkBAIC0yNzE5LDI4ICsyNzIyLDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IG9mZHBhX3BvcnRfb2JqX2ZpYjRfYWRkKHN0cnVjdCByb2NrZXJfcG9ydCAqcm9ja2VyX3BvcnQsCi0JCQkJICAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfaXB2NF9maWIgKmZpYjQsCi0JCQkJICAgc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpCi17Ci0Jc3RydWN0IG9mZHBhX3BvcnQgKm9mZHBhX3BvcnQgPSByb2NrZXJfcG9ydC0+d3ByaXY7Ci0KLQlyZXR1cm4gb2ZkcGFfcG9ydF9maWJfaXB2NChvZmRwYV9wb3J0LCB0cmFucywKLQkJCQkgICBodG9ubChmaWI0LT5kc3QpLCBmaWI0LT5kc3RfbGVuLAotCQkJCSAgIGZpYjQtPmZpLCBmaWI0LT50Yl9pZCwgMCk7Ci19Ci0KLXN0YXRpYyBpbnQgb2ZkcGFfcG9ydF9vYmpfZmliNF9kZWwoc3RydWN0IHJvY2tlcl9wb3J0ICpyb2NrZXJfcG9ydCwKLQkJCQkgICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9pcHY0X2ZpYiAqZmliNCkKLXsKLQlzdHJ1Y3Qgb2ZkcGFfcG9ydCAqb2ZkcGFfcG9ydCA9IHJvY2tlcl9wb3J0LT53cHJpdjsKLQotCXJldHVybiBvZmRwYV9wb3J0X2ZpYl9pcHY0KG9mZHBhX3BvcnQsIE5VTEwsCi0JCQkJICAgaHRvbmwoZmliNC0+ZHN0KSwgZmliNC0+ZHN0X2xlbiwKLQkJCQkgICBmaWI0LT5maSwgZmliNC0+dGJfaWQsCi0JCQkJICAgT0ZEUEFfT1BfRkxBR19SRU1PVkUpOwotfQotCiBzdGF0aWMgaW50IG9mZHBhX3BvcnRfb2JqX2ZkYl9hZGQoc3RydWN0IHJvY2tlcl9wb3J0ICpyb2NrZXJfcG9ydCwKIAkJCQkgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfZmRiICpmZGIsCiAJCQkJICBzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zICp0cmFucykKQEAgLTI4MTcsNyArMjc5OCw2IEBACiAJCW9mZHBhX3BvcnRfaW50ZXJuYWxfdmxhbl9pZF9nZXQob2ZkcGFfcG9ydCwgYnJpZGdlLT5pZmluZGV4KTsKIAogCW9mZHBhX3BvcnQtPmJyaWRnZV9kZXYgPSBicmlkZ2U7Ci0Jc3dpdGNoZGV2X3BvcnRfZndkX21hcmtfc2V0KG9mZHBhX3BvcnQtPmRldiwgYnJpZGdlLCB0cnVlKTsKIAogCXJldHVybiBvZmRwYV9wb3J0X3ZsYW5fYWRkKG9mZHBhX3BvcnQsIE5VTEwsIE9GRFBBX1VOVEFHR0VEX1ZJRCwgMCk7CiB9CkBAIC0yODM2LDggKzI4MTYsNiBAQAogCQlvZmRwYV9wb3J0X2ludGVybmFsX3ZsYW5faWRfZ2V0KG9mZHBhX3BvcnQsCiAJCQkJCQlvZmRwYV9wb3J0LT5kZXYtPmlmaW5kZXgpOwogCi0Jc3dpdGNoZGV2X3BvcnRfZndkX21hcmtfc2V0KG9mZHBhX3BvcnQtPmRldiwgb2ZkcGFfcG9ydC0+YnJpZGdlX2RldiwKLQkJCQkgICAgZmFsc2UpOwogCW9mZHBhX3BvcnQtPmJyaWRnZV9kZXYgPSBOVUxMOwogCiAJZXJyID0gb2ZkcGFfcG9ydF92bGFuX2FkZChvZmRwYV9wb3J0LCBOVUxMLCBPRkRQQV9VTlRBR0dFRF9WSUQsIDApOwpAQCAtMjkyNiw2ICsyOTA0LDgyIEBACiAJcmV0dXJuIG9mZHBhX3BvcnRfZmRiKG9mZHBhX3BvcnQsIE5VTEwsIGFkZHIsIHZsYW5faWQsIGZsYWdzKTsKIH0KIAorc3RhdGljIHN0cnVjdCBvZmRwYV9wb3J0ICpvZmRwYV9wb3J0X2Rldl9sb3dlcl9maW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCQkgICAgc3RydWN0IHJvY2tlciAqcm9ja2VyKQoreworCXN0cnVjdCByb2NrZXJfcG9ydCAqcm9ja2VyX3BvcnQ7CisKKwlyb2NrZXJfcG9ydCA9IHJvY2tlcl9wb3J0X2Rldl9sb3dlcl9maW5kKGRldiwgcm9ja2VyKTsKKwlyZXR1cm4gcm9ja2VyX3BvcnQgPyByb2NrZXJfcG9ydC0+d3ByaXYgOiBOVUxMOworfQorCitzdGF0aWMgaW50IG9mZHBhX2ZpYjRfYWRkKHN0cnVjdCByb2NrZXIgKnJvY2tlciwKKwkJCSAgY29uc3Qgc3RydWN0IGZpYl9lbnRyeV9ub3RpZmllcl9pbmZvICpmZW5faW5mbykKK3sKKwlzdHJ1Y3Qgb2ZkcGEgKm9mZHBhID0gcm9ja2VyLT53cHJpdjsKKwlzdHJ1Y3Qgb2ZkcGFfcG9ydCAqb2ZkcGFfcG9ydDsKKwlpbnQgZXJyOworCisJaWYgKG9mZHBhLT5maWJfYWJvcnRlZCkKKwkJcmV0dXJuIDA7CisJb2ZkcGFfcG9ydCA9IG9mZHBhX3BvcnRfZGV2X2xvd2VyX2ZpbmQoZmVuX2luZm8tPmZpLT5maWJfZGV2LCByb2NrZXIpOworCWlmICghb2ZkcGFfcG9ydCkKKwkJcmV0dXJuIDA7CisJZXJyID0gb2ZkcGFfcG9ydF9maWJfaXB2NChvZmRwYV9wb3J0LCBOVUxMLCBodG9ubChmZW5faW5mby0+ZHN0KSwKKwkJCQkgIGZlbl9pbmZvLT5kc3RfbGVuLCBmZW5faW5mby0+ZmksCisJCQkJICBmZW5faW5mby0+dGJfaWQsIDApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJZmliX2luZm9fb2ZmbG9hZF9pbmMoZmVuX2luZm8tPmZpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvZmRwYV9maWI0X2RlbChzdHJ1Y3Qgcm9ja2VyICpyb2NrZXIsCisJCQkgIGNvbnN0IHN0cnVjdCBmaWJfZW50cnlfbm90aWZpZXJfaW5mbyAqZmVuX2luZm8pCit7CisJc3RydWN0IG9mZHBhICpvZmRwYSA9IHJvY2tlci0+d3ByaXY7CisJc3RydWN0IG9mZHBhX3BvcnQgKm9mZHBhX3BvcnQ7CisKKwlpZiAob2ZkcGEtPmZpYl9hYm9ydGVkKQorCQlyZXR1cm4gMDsKKwlvZmRwYV9wb3J0ID0gb2ZkcGFfcG9ydF9kZXZfbG93ZXJfZmluZChmZW5faW5mby0+ZmktPmZpYl9kZXYsIHJvY2tlcik7CisJaWYgKCFvZmRwYV9wb3J0KQorCQlyZXR1cm4gMDsKKwlmaWJfaW5mb19vZmZsb2FkX2RlYyhmZW5faW5mby0+ZmkpOworCXJldHVybiBvZmRwYV9wb3J0X2ZpYl9pcHY0KG9mZHBhX3BvcnQsIE5VTEwsIGh0b25sKGZlbl9pbmZvLT5kc3QpLAorCQkJCSAgIGZlbl9pbmZvLT5kc3RfbGVuLCBmZW5faW5mby0+ZmksCisJCQkJICAgZmVuX2luZm8tPnRiX2lkLCBPRkRQQV9PUF9GTEFHX1JFTU9WRSk7Cit9CisKK3N0YXRpYyB2b2lkIG9mZHBhX2ZpYjRfYWJvcnQoc3RydWN0IHJvY2tlciAqcm9ja2VyKQoreworCXN0cnVjdCBvZmRwYSAqb2ZkcGEgPSByb2NrZXItPndwcml2OworCXN0cnVjdCBvZmRwYV9wb3J0ICpvZmRwYV9wb3J0OworCXN0cnVjdCBvZmRwYV9mbG93X3RibF9lbnRyeSAqZmxvd19lbnRyeTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqdG1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGJrdDsKKworCWlmIChvZmRwYS0+ZmliX2Fib3J0ZWQpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZvZmRwYS0+Zmxvd190YmxfbG9jaywgZmxhZ3MpOworCWhhc2hfZm9yX2VhY2hfc2FmZShvZmRwYS0+Zmxvd190YmwsIGJrdCwgdG1wLCBmbG93X2VudHJ5LCBlbnRyeSkgeworCQlpZiAoZmxvd19lbnRyeS0+a2V5LnRibF9pZCAhPQorCQkgICAgUk9DS0VSX09GX0RQQV9UQUJMRV9JRF9VTklDQVNUX1JPVVRJTkcpCisJCQljb250aW51ZTsKKwkJb2ZkcGFfcG9ydCA9IG9mZHBhX3BvcnRfZGV2X2xvd2VyX2ZpbmQoZmxvd19lbnRyeS0+ZmktPmZpYl9kZXYsCisJCQkJCQkgICAgICAgcm9ja2VyKTsKKwkJaWYgKCFvZmRwYV9wb3J0KQorCQkJY29udGludWU7CisJCWZpYl9pbmZvX29mZmxvYWRfZGVjKGZsb3dfZW50cnktPmZpKTsKKwkJb2ZkcGFfZmxvd190YmxfZGVsKG9mZHBhX3BvcnQsIE5VTEwsIE9GRFBBX09QX0ZMQUdfUkVNT1ZFLAorCQkJCSAgIGZsb3dfZW50cnkpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvZmRwYS0+Zmxvd190YmxfbG9jaywgZmxhZ3MpOworCW9mZHBhLT5maWJfYWJvcnRlZCA9IHRydWU7Cit9CisKIHN0cnVjdCByb2NrZXJfd29ybGRfb3BzIHJvY2tlcl9vZmRwYV9vcHMgPSB7CiAJLmtpbmQgPSAib2ZkcGEiLAogCS5wcml2X3NpemUgPSBzaXplb2Yoc3RydWN0IG9mZHBhKSwKQEAgLTI5NDUsOCArMjk5OSw2IEBACiAJLnBvcnRfb2JqX3ZsYW5fYWRkID0gb2ZkcGFfcG9ydF9vYmpfdmxhbl9hZGQsCiAJLnBvcnRfb2JqX3ZsYW5fZGVsID0gb2ZkcGFfcG9ydF9vYmpfdmxhbl9kZWwsCiAJLnBvcnRfb2JqX3ZsYW5fZHVtcCA9IG9mZHBhX3BvcnRfb2JqX3ZsYW5fZHVtcCwKLQkucG9ydF9vYmpfZmliNF9hZGQgPSBvZmRwYV9wb3J0X29ial9maWI0X2FkZCwKLQkucG9ydF9vYmpfZmliNF9kZWwgPSBvZmRwYV9wb3J0X29ial9maWI0X2RlbCwKIAkucG9ydF9vYmpfZmRiX2FkZCA9IG9mZHBhX3BvcnRfb2JqX2ZkYl9hZGQsCiAJLnBvcnRfb2JqX2ZkYl9kZWwgPSBvZmRwYV9wb3J0X29ial9mZGJfZGVsLAogCS5wb3J0X29ial9mZGJfZHVtcCA9IG9mZHBhX3BvcnRfb2JqX2ZkYl9kdW1wLApAQCAtMjk1NSw0ICszMDA3LDcgQEAKIAkucG9ydF9uZWlnaF91cGRhdGUgPSBvZmRwYV9wb3J0X25laWdoX3VwZGF0ZSwKIAkucG9ydF9uZWlnaF9kZXN0cm95ID0gb2ZkcGFfcG9ydF9uZWlnaF9kZXN0cm95LAogCS5wb3J0X2V2X21hY192bGFuX3NlZW4gPSBvZmRwYV9wb3J0X2V2X21hY192bGFuX3NlZW4sCisJLmZpYjRfYWRkID0gb2ZkcGFfZmliNF9hZGQsCisJLmZpYjRfZGVsID0gb2ZkcGFfZmliNF9kZWwsCisJLmZpYjRfYWJvcnQgPSBvZmRwYV9maWI0X2Fib3J0LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9lZjEwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZWYxMC5jCmluZGV4IGY2NThmZWUuLjAwMjc5ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9lZjEwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2VmMTAuYwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAKIHN0YXRpYyBpbnQgZWZ4X2VmMTBfaW5pdF9kYXRhcGF0aF9jYXBzKHN0cnVjdCBlZnhfbmljICplZngpCiB7Ci0JTUNESV9ERUNMQVJFX0JVRihvdXRidWYsIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX09VVF9MRU4pOworCU1DRElfREVDTEFSRV9CVUYob3V0YnVmLCBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WMl9PVVRfTEVOKTsKIAlzdHJ1Y3QgZWZ4X2VmMTBfbmljX2RhdGEgKm5pY19kYXRhID0gZWZ4LT5uaWNfZGF0YTsKIAlzaXplX3Qgb3V0bGVuOwogCWludCByYzsKQEAgLTE4OCw3ICsxODgsNyBAQAogCQkJICBvdXRidWYsIHNpemVvZihvdXRidWYpLCAmb3V0bGVuKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKLQlpZiAob3V0bGVuIDwgc2l6ZW9mKG91dGJ1ZikpIHsKKwlpZiAob3V0bGVuIDwgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfT1VUX0xFTikgewogCQluZXRpZl9lcnIoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwKIAkJCSAgInVuYWJsZSB0byByZWFkIGRhdGFwYXRoIGZpcm13YXJlIGNhcGFiaWxpdGllc1xuIik7CiAJCXJldHVybiAtRUlPOwpAQCAtMTk3LDYgKzE5NywxMiBAQAogCW5pY19kYXRhLT5kYXRhcGF0aF9jYXBzID0KIAkJTUNESV9EV09SRChvdXRidWYsIEdFVF9DQVBBQklMSVRJRVNfT1VUX0ZMQUdTMSk7CiAKKwlpZiAob3V0bGVuID49IE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YyX09VVF9MRU4pCisJCW5pY19kYXRhLT5kYXRhcGF0aF9jYXBzMiA9IE1DRElfRFdPUkQob3V0YnVmLAorCQkJCUdFVF9DQVBBQklMSVRJRVNfVjJfT1VUX0ZMQUdTMik7CisJZWxzZQorCQluaWNfZGF0YS0+ZGF0YXBhdGhfY2FwczIgPSAwOworCiAJLyogcmVjb3JkIHRoZSBEUENQVSBmaXJtd2FyZSBJRHMgdG8gZGV0ZXJtaW5lIFZFQiB2c3dpdGNoaW5nIHN1cHBvcnQuCiAJICovCiAJbmljX2RhdGEtPnJ4X2RwY3B1X2Z3X2lkID0KQEAgLTIyNyw2ICsyMzMsMTE2IEBACiAJcmV0dXJuIHJjID4gMCA/IHJjIDogLUVSQU5HRTsKIH0KIAorc3RhdGljIGludCBlZnhfZWYxMF9nZXRfdGltZXJfd29ya2Fyb3VuZHMoc3RydWN0IGVmeF9uaWMgKmVmeCkKK3sKKwlzdHJ1Y3QgZWZ4X2VmMTBfbmljX2RhdGEgKm5pY19kYXRhID0gZWZ4LT5uaWNfZGF0YTsKKwl1bnNpZ25lZCBpbnQgaW1wbGVtZW50ZWQ7CisJdW5zaWduZWQgaW50IGVuYWJsZWQ7CisJaW50IHJjOworCisJbmljX2RhdGEtPndvcmthcm91bmRfMzUzODggPSBmYWxzZTsKKwluaWNfZGF0YS0+d29ya2Fyb3VuZF82MTI2NSA9IGZhbHNlOworCisJcmMgPSBlZnhfbWNkaV9nZXRfd29ya2Fyb3VuZHMoZWZ4LCAmaW1wbGVtZW50ZWQsICZlbmFibGVkKTsKKworCWlmIChyYyA9PSAtRU5PU1lTKSB7CisJCS8qIEZpcm13YXJlIHdpdGhvdXQgR0VUX1dPUktBUk9VTkRTIC0gbm90IGEgcHJvYmxlbS4gKi8KKwkJcmMgPSAwOworCX0gZWxzZSBpZiAocmMgPT0gMCkgeworCQkvKiBCdWc2MTI2NSB3b3JrYXJvdW5kIGlzIGFsd2F5cyBlbmFibGVkIGlmIGltcGxlbWVudGVkLiAqLworCQlpZiAoZW5hYmxlZCAmIE1DX0NNRF9HRVRfV09SS0FST1VORFNfT1VUX0JVRzYxMjY1KQorCQkJbmljX2RhdGEtPndvcmthcm91bmRfNjEyNjUgPSB0cnVlOworCisJCWlmIChlbmFibGVkICYgTUNfQ01EX0dFVF9XT1JLQVJPVU5EU19PVVRfQlVHMzUzODgpIHsKKwkJCW5pY19kYXRhLT53b3JrYXJvdW5kXzM1Mzg4ID0gdHJ1ZTsKKwkJfSBlbHNlIGlmIChpbXBsZW1lbnRlZCAmIE1DX0NNRF9HRVRfV09SS0FST1VORFNfT1VUX0JVRzM1Mzg4KSB7CisJCQkvKiBXb3JrYXJvdW5kIGlzIGltcGxlbWVudGVkIGJ1dCBub3QgZW5hYmxlZC4KKwkJCSAqIFRyeSB0byBlbmFibGUgaXQuCisJCQkgKi8KKwkJCXJjID0gZWZ4X21jZGlfc2V0X3dvcmthcm91bmQoZWZ4LAorCQkJCQkJICAgICBNQ19DTURfV09SS0FST1VORF9CVUczNTM4OCwKKwkJCQkJCSAgICAgdHJ1ZSwgTlVMTCk7CisJCQlpZiAocmMgPT0gMCkKKwkJCQluaWNfZGF0YS0+d29ya2Fyb3VuZF8zNTM4OCA9IHRydWU7CisJCQkvKiBJZiB3ZSBmYWlsZWQgdG8gc2V0IHRoZSB3b3JrYXJvdW5kIGp1c3QgY2Fycnkgb24uICovCisJCQlyYyA9IDA7CisJCX0KKwl9CisKKwluZXRpZl9kYmcoZWZ4LCBwcm9iZSwgZWZ4LT5uZXRfZGV2LAorCQkgICJ3b3JrYXJvdW5kIGZvciBidWcgMzUzODggaXMgJXNhYmxlZFxuIiwKKwkJICBuaWNfZGF0YS0+d29ya2Fyb3VuZF8zNTM4OCA/ICJlbiIgOiAiZGlzIik7CisJbmV0aWZfZGJnKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwKKwkJICAid29ya2Fyb3VuZCBmb3IgYnVnIDYxMjY1IGlzICVzYWJsZWRcbiIsCisJCSAgbmljX2RhdGEtPndvcmthcm91bmRfNjEyNjUgPyAiZW4iIDogImRpcyIpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBlZnhfZWYxMF9wcm9jZXNzX3RpbWVyX2NvbmZpZyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4LAorCQkJCQkgIGNvbnN0IGVmeF9kd29yZF90ICpkYXRhKQoreworCXVuc2lnbmVkIGludCBtYXhfY291bnQ7CisKKwlpZiAoRUZYX0VGMTBfV09SS0FST1VORF82MTI2NShlZngpKSB7CisJCWVmeC0+dGltZXJfcXVhbnR1bV9ucyA9IE1DRElfRFdPUkQoZGF0YSwKKwkJCUdFVF9FVlFfVE1SX1BST1BFUlRJRVNfT1VUX01DRElfVE1SX1NURVBfTlMpOworCQllZngtPnRpbWVyX21heF9ucyA9IE1DRElfRFdPUkQoZGF0YSwKKwkJCUdFVF9FVlFfVE1SX1BST1BFUlRJRVNfT1VUX01DRElfVE1SX01BWF9OUyk7CisJfSBlbHNlIGlmIChFRlhfRUYxMF9XT1JLQVJPVU5EXzM1Mzg4KGVmeCkpIHsKKwkJZWZ4LT50aW1lcl9xdWFudHVtX25zID0gTUNESV9EV09SRChkYXRhLAorCQkJR0VUX0VWUV9UTVJfUFJPUEVSVElFU19PVVRfQlVHMzUzODhfVE1SX05TX1BFUl9DT1VOVCk7CisJCW1heF9jb3VudCA9IE1DRElfRFdPUkQoZGF0YSwKKwkJCUdFVF9FVlFfVE1SX1BST1BFUlRJRVNfT1VUX0JVRzM1Mzg4X1RNUl9NQVhfQ09VTlQpOworCQllZngtPnRpbWVyX21heF9ucyA9IG1heF9jb3VudCAqIGVmeC0+dGltZXJfcXVhbnR1bV9uczsKKwl9IGVsc2UgeworCQllZngtPnRpbWVyX3F1YW50dW1fbnMgPSBNQ0RJX0RXT1JEKGRhdGEsCisJCQlHRVRfRVZRX1RNUl9QUk9QRVJUSUVTX09VVF9UTVJfUkVHX05TX1BFUl9DT1VOVCk7CisJCW1heF9jb3VudCA9IE1DRElfRFdPUkQoZGF0YSwKKwkJCUdFVF9FVlFfVE1SX1BST1BFUlRJRVNfT1VUX1RNUl9SRUdfTUFYX0NPVU5UKTsKKwkJZWZ4LT50aW1lcl9tYXhfbnMgPSBtYXhfY291bnQgKiBlZngtPnRpbWVyX3F1YW50dW1fbnM7CisJfQorCisJbmV0aWZfZGJnKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwKKwkJICAiZ290IHRpbWVyIHByb3BlcnRpZXMgZnJvbSBNQzogcXVhbnR1bSAldSBuczsgbWF4ICV1IG5zXG4iLAorCQkgIGVmeC0+dGltZXJfcXVhbnR1bV9ucywgZWZ4LT50aW1lcl9tYXhfbnMpOworfQorCitzdGF0aWMgaW50IGVmeF9lZjEwX2dldF90aW1lcl9jb25maWcoc3RydWN0IGVmeF9uaWMgKmVmeCkKK3sKKwlNQ0RJX0RFQ0xBUkVfQlVGKG91dGJ1ZiwgTUNfQ01EX0dFVF9FVlFfVE1SX1BST1BFUlRJRVNfT1VUX0xFTik7CisJaW50IHJjOworCisJcmMgPSBlZnhfZWYxMF9nZXRfdGltZXJfd29ya2Fyb3VuZHMoZWZ4KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gZWZ4X21jZGlfcnBjX3F1aWV0KGVmeCwgTUNfQ01EX0dFVF9FVlFfVE1SX1BST1BFUlRJRVMsIE5VTEwsIDAsCisJCQkJb3V0YnVmLCBzaXplb2Yob3V0YnVmKSwgTlVMTCk7CisKKwlpZiAocmMgPT0gMCkgeworCQllZnhfZWYxMF9wcm9jZXNzX3RpbWVyX2NvbmZpZyhlZngsIG91dGJ1Zik7CisJfSBlbHNlIGlmIChyYyA9PSAtRU5PU1lTIHx8IHJjID09IC1FUEVSTSkgeworCQkvKiBOb3QgYXZhaWxhYmxlIC0gZmFsbCBiYWNrIHRvIEh1bnRpbmd0b24gZGVmYXVsdHMuICovCisJCXVuc2lnbmVkIGludCBxdWFudHVtOworCisJCXJjID0gZWZ4X2VmMTBfZ2V0X3N5c2Nsa19mcmVxKGVmeCk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisKKwkJcXVhbnR1bSA9IDE1MzYwMDAgLyByYzsgLyogMTUzNiBjeWNsZXMgKi8KKwkJZWZ4LT50aW1lcl9xdWFudHVtX25zID0gcXVhbnR1bTsKKwkJZWZ4LT50aW1lcl9tYXhfbnMgPSBlZngtPnR5cGUtPnRpbWVyX3BlcmlvZF9tYXggKiBxdWFudHVtOworCQlyYyA9IDA7CisJfSBlbHNlIHsKKwkJZWZ4X21jZGlfZGlzcGxheV9lcnJvcihlZngsIE1DX0NNRF9HRVRfRVZRX1RNUl9QUk9QRVJUSUVTLAorCQkJCSAgICAgICBNQ19DTURfR0VUX0VWUV9UTVJfUFJPUEVSVElFU19PVVRfTEVOLAorCQkJCSAgICAgICBOVUxMLCAwLCByYyk7CisJfQorCisJcmV0dXJuIHJjOworfQorCiBzdGF0aWMgaW50IGVmeF9lZjEwX2dldF9tYWNfYWRkcmVzc19wZihzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCB1OCAqbWFjX2FkZHJlc3MpCiB7CiAJTUNESV9ERUNMQVJFX0JVRihvdXRidWYsIE1DX0NNRF9HRVRfTUFDX0FERFJFU1NFU19PVVRfTEVOKTsKQEAgLTUyNywzMiArNjQzLDkgQEAKIAlpZiAocmMpCiAJCWdvdG8gZmFpbDU7CiAKLQlyYyA9IGVmeF9lZjEwX2dldF9zeXNjbGtfZnJlcShlZngpOworCXJjID0gZWZ4X2VmMTBfZ2V0X3RpbWVyX2NvbmZpZyhlZngpOwogCWlmIChyYyA8IDApCiAJCWdvdG8gZmFpbDU7Ci0JZWZ4LT50aW1lcl9xdWFudHVtX25zID0gMTUzNjAwMCAvIHJjOyAvKiAxNTM2IGN5Y2xlcyAqLwotCi0JLyogQ2hlY2sgd2hldGhlciBmaXJtd2FyZSBzdXBwb3J0cyBidWcgMzUzODggd29ya2Fyb3VuZC4KLQkgKiBGaXJzdCB0cnkgdG8gZW5hYmxlIGl0LCB0aGVuIGlmIHdlIGdldCBFUEVSTSwganVzdAotCSAqIGFzayBpZiBpdCdzIGFscmVhZHkgZW5hYmxlZAotCSAqLwotCXJjID0gZWZ4X21jZGlfc2V0X3dvcmthcm91bmQoZWZ4LCBNQ19DTURfV09SS0FST1VORF9CVUczNTM4OCwgdHJ1ZSwgTlVMTCk7Ci0JaWYgKHJjID09IDApIHsKLQkJbmljX2RhdGEtPndvcmthcm91bmRfMzUzODggPSB0cnVlOwotCX0gZWxzZSBpZiAocmMgPT0gLUVQRVJNKSB7Ci0JCXVuc2lnbmVkIGludCBlbmFibGVkOwotCi0JCXJjID0gZWZ4X21jZGlfZ2V0X3dvcmthcm91bmRzKGVmeCwgTlVMTCwgJmVuYWJsZWQpOwotCQlpZiAocmMpCi0JCQlnb3RvIGZhaWwzOwotCQluaWNfZGF0YS0+d29ya2Fyb3VuZF8zNTM4OCA9IGVuYWJsZWQgJgotCQkJTUNfQ01EX0dFVF9XT1JLQVJPVU5EU19PVVRfQlVHMzUzODg7Ci0JfSBlbHNlIGlmIChyYyAhPSAtRU5PU1lTICYmIHJjICE9IC1FTk9FTlQpIHsKLQkJZ290byBmYWlsNTsKLQl9Ci0JbmV0aWZfZGJnKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwKLQkJICAid29ya2Fyb3VuZCBmb3IgYnVnIDM1Mzg4IGlzICVzYWJsZWRcbiIsCi0JCSAgbmljX2RhdGEtPndvcmthcm91bmRfMzUzODggPyAiZW4iIDogImRpcyIpOwogCiAJcmMgPSBlZnhfbWNkaV9tb25fcHJvYmUoZWZ4KTsKIAlpZiAocmMgJiYgcmMgIT0gLUVQRVJNKQpAQCAtMTQ0MCw5ICsxNTMzLDEwIEBACiAJCQkgICAgICAgKDFVTEwgPDwgR0VORVJJQ19TVEFUX3J4X25vZGVzY190cnVuYykgfAlcCiAJCQkgICAgICAgKDFVTEwgPDwgR0VORVJJQ19TVEFUX3J4X25vc2tiX2Ryb3BzKSkKIAotLyogVGhlc2Ugc3RhdGlzdGljcyBhcmUgb25seSBwcm92aWRlZCBieSB0aGUgMTBHIE1BQy4gIEZvciBhIDEwRy80MEcKLSAqIHN3aXRjaGFibGUgcG9ydCB3ZSBkbyBub3QgZXhwb3NlIHRoZXNlIGJlY2F1c2UgdGhleSBtaWdodCBub3QKLSAqIGluY2x1ZGUgYWxsIHRoZSBwYWNrZXRzIHRoZXkgc2hvdWxkLgorLyogT24gNzAwMCBzZXJpZXMgTklDcywgdGhlc2Ugc3RhdGlzdGljcyBhcmUgb25seSBwcm92aWRlZCBieSB0aGUgMTBHIE1BQy4KKyAqIEZvciBhIDEwRy80MEcgc3dpdGNoYWJsZSBwb3J0IHdlIGRvIG5vdCBleHBvc2UgdGhlc2UgYmVjYXVzZSB0aGV5IG1pZ2h0CisgKiBub3QgaW5jbHVkZSBhbGwgdGhlIHBhY2tldHMgdGhleSBzaG91bGQuCisgKiBPbiA4MDAwIHNlcmllcyBOSUNzIHRoZXNlIHN0YXRpc3RpY3MgYXJlIGFsd2F5cyBwcm92aWRlZC4KICAqLwogI2RlZmluZSBIVU5UXzEwR19PTkxZX1NUQVRfTUFTSyAoKDFVTEwgPDwgRUYxMF9TVEFUX3BvcnRfdHhfY29udHJvbCkgfAlcCiAJCQkJICgxVUxMIDw8IEVGMTBfU1RBVF9wb3J0X3R4X2x0NjQpIHwJXApAQCAtMTQ4OCwxMCArMTU4MiwxNSBAQAogCSAgICAgIDEgPDwgTUNfQ01EX0RSVl9BVFRBQ0hfRVhUX09VVF9GTEFHX0xJTktDVFJMKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAocG9ydF9jYXBzICYgKDEgPDwgTUNfQ01EX1BIWV9DQVBfNDAwMDBGRFhfTEJOKSkKKwlpZiAocG9ydF9jYXBzICYgKDEgPDwgTUNfQ01EX1BIWV9DQVBfNDAwMDBGRFhfTEJOKSkgewogCQlyYXdfbWFzayB8PSBIVU5UXzQwR19FWFRSQV9TVEFUX01BU0s7Ci0JZWxzZQorCQkvKiA4MDAwIHNlcmllcyBoYXZlIGV2ZXJ5dGhpbmcgZXZlbiBhdCA0MEcgKi8KKwkJaWYgKG5pY19kYXRhLT5kYXRhcGF0aF9jYXBzMiAmCisJCSAgICAoMSA8PCBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WMl9PVVRfTUFDX1NUQVRTXzQwR19UWF9TSVpFX0JJTlNfTEJOKSkKKwkJCXJhd19tYXNrIHw9IEhVTlRfMTBHX09OTFlfU1RBVF9NQVNLOworCX0gZWxzZSB7CiAJCXJhd19tYXNrIHw9IEhVTlRfMTBHX09OTFlfU1RBVF9NQVNLOworCX0KIAogCWlmIChuaWNfZGF0YS0+ZGF0YXBhdGhfY2FwcyAmCiAJICAgICgxIDw8IE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX09VVF9QTV9BTkRfUlhEUF9DT1VOVEVSU19MQk4pKQpAQCAtMTUxNywxMyArMTYxNiwxNCBAQAogCX0KIAogI2lmIEJJVFNfUEVSX0xPTkcgPT0gNjQKKwlCVUlMRF9CVUdfT04oQklUU19UT19MT05HUyhFRjEwX1NUQVRfQ09VTlQpICE9IDIpOwogCW1hc2tbMF0gPSByYXdfbWFza1swXTsKIAltYXNrWzFdID0gcmF3X21hc2tbMV07CiAjZWxzZQorCUJVSUxEX0JVR19PTihCSVRTX1RPX0xPTkdTKEVGMTBfU1RBVF9DT1VOVCkgIT0gMyk7CiAJbWFza1swXSA9IHJhd19tYXNrWzBdICYgMHhmZmZmZmZmZjsKIAltYXNrWzFdID0gcmF3X21hc2tbMF0gPj4gMzI7CiAJbWFza1syXSA9IHJhd19tYXNrWzFdICYgMHhmZmZmZmZmZjsKLQltYXNrWzNdID0gcmF3X21hc2tbMV0gPj4gMzI7CiAjZW5kaWYKIH0KIApAQCAtMTYxNiw3ICsxNzE2LDYgQEAKIAllZnhfZWYxMF9nZXRfc3RhdF9tYXNrKGVmeCwgbWFzayk7CiAKIAlkbWFfc3RhdHMgPSBlZngtPnN0YXRzX2J1ZmZlci5hZGRyOwotCW5pY19kYXRhID0gZWZ4LT5uaWNfZGF0YTsKIAogCWdlbmVyYXRpb25fZW5kID0gZG1hX3N0YXRzW01DX0NNRF9NQUNfR0VORVJBVElPTl9FTkRdOwogCWlmIChnZW5lcmF0aW9uX2VuZCA9PSBFRlhfTUNfU1RBVFNfR0VORVJBVElPTl9JTlZBTElEKQpAQCAtMTc0MywyNyArMTg0Miw0MyBAQAogc3RhdGljIHZvaWQgZWZ4X2VmMTBfcHVzaF9pcnFfbW9kZXJhdGlvbihzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWwpCiB7CiAJc3RydWN0IGVmeF9uaWMgKmVmeCA9IGNoYW5uZWwtPmVmeDsKLQl1bnNpZ25lZCBpbnQgbW9kZSwgdmFsdWU7CisJdW5zaWduZWQgaW50IG1vZGUsIHVzZWNzOwogCWVmeF9kd29yZF90IHRpbWVyX2NtZDsKIAotCWlmIChjaGFubmVsLT5pcnFfbW9kZXJhdGlvbikgeworCWlmIChjaGFubmVsLT5pcnFfbW9kZXJhdGlvbl91cykgewogCQltb2RlID0gMzsKLQkJdmFsdWUgPSBjaGFubmVsLT5pcnFfbW9kZXJhdGlvbiAtIDE7CisJCXVzZWNzID0gY2hhbm5lbC0+aXJxX21vZGVyYXRpb25fdXM7CiAJfSBlbHNlIHsKIAkJbW9kZSA9IDA7Ci0JCXZhbHVlID0gMDsKKwkJdXNlY3MgPSAwOwogCX0KIAotCWlmIChFRlhfRUYxMF9XT1JLQVJPVU5EXzM1Mzg4KGVmeCkpIHsKKwlpZiAoRUZYX0VGMTBfV09SS0FST1VORF82MTI2NShlZngpKSB7CisJCU1DRElfREVDTEFSRV9CVUYoaW5idWYsIE1DX0NNRF9TRVRfRVZRX1RNUl9JTl9MRU4pOworCQl1bnNpZ25lZCBpbnQgbnMgPSB1c2VjcyAqIDEwMDA7CisKKwkJTUNESV9TRVRfRFdPUkQoaW5idWYsIFNFVF9FVlFfVE1SX0lOX0lOU1RBTkNFLAorCQkJICAgICAgIGNoYW5uZWwtPmNoYW5uZWwpOworCQlNQ0RJX1NFVF9EV09SRChpbmJ1ZiwgU0VUX0VWUV9UTVJfSU5fVE1SX0xPQURfUkVRX05TLCBucyk7CisJCU1DRElfU0VUX0RXT1JEKGluYnVmLCBTRVRfRVZRX1RNUl9JTl9UTVJfUkVMT0FEX1JFUV9OUywgbnMpOworCQlNQ0RJX1NFVF9EV09SRChpbmJ1ZiwgU0VUX0VWUV9UTVJfSU5fVE1SX01PREUsIG1vZGUpOworCisJCWVmeF9tY2RpX3JwY19hc3luYyhlZngsIE1DX0NNRF9TRVRfRVZRX1RNUiwKKwkJCQkgICBpbmJ1Ziwgc2l6ZW9mKGluYnVmKSwgMCwgTlVMTCwgMCk7CisJfSBlbHNlIGlmIChFRlhfRUYxMF9XT1JLQVJPVU5EXzM1Mzg4KGVmeCkpIHsKKwkJdW5zaWduZWQgaW50IHRpY2tzID0gZWZ4X3VzZWNzX3RvX3RpY2tzKGVmeCwgdXNlY3MpOworCiAJCUVGWF9QT1BVTEFURV9EV09SRF8zKHRpbWVyX2NtZCwgRVJGX0REX0VWUV9JTkRfVElNRVJfRkxBR1MsCiAJCQkJICAgICBFRkVfRERfRVZRX0lORF9USU1FUl9GTEFHUywKIAkJCQkgICAgIEVSRl9ERF9FVlFfSU5EX1RJTUVSX01PREUsIG1vZGUsCi0JCQkJICAgICBFUkZfRERfRVZRX0lORF9USU1FUl9WQUwsIHZhbHVlKTsKKwkJCQkgICAgIEVSRl9ERF9FVlFfSU5EX1RJTUVSX1ZBTCwgdGlja3MpOwogCQllZnhfd3JpdGVkX3BhZ2UoZWZ4LCAmdGltZXJfY21kLCBFUl9ERF9FVlFfSU5ESVJFQ1QsCiAJCQkJY2hhbm5lbC0+Y2hhbm5lbCk7CiAJfSBlbHNlIHsKKwkJdW5zaWduZWQgaW50IHRpY2tzID0gZWZ4X3VzZWNzX3RvX3RpY2tzKGVmeCwgdXNlY3MpOworCiAJCUVGWF9QT1BVTEFURV9EV09SRF8yKHRpbWVyX2NtZCwgRVJGX0RaX1RDX1RJTUVSX01PREUsIG1vZGUsCi0JCQkJICAgICBFUkZfRFpfVENfVElNRVJfVkFMLCB2YWx1ZSk7CisJCQkJICAgICBFUkZfRFpfVENfVElNRVJfVkFMLCB0aWNrcyk7CiAJCWVmeF93cml0ZWRfcGFnZShlZngsICZ0aW1lcl9jbWQsIEVSX0RaX0VWUV9UTVIsCiAJCQkJY2hhbm5lbC0+Y2hhbm5lbCk7CiAJfQpAQCAtMTkzNCwxNCArMjA0OSwxOCBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIHZvaWQgZWZ4X2VmMTBfaXJxX3Rlc3RfZ2VuZXJhdGUoc3RydWN0IGVmeF9uaWMgKmVmeCkKK3N0YXRpYyBpbnQgZWZ4X2VmMTBfaXJxX3Rlc3RfZ2VuZXJhdGUoc3RydWN0IGVmeF9uaWMgKmVmeCkKIHsKIAlNQ0RJX0RFQ0xBUkVfQlVGKGluYnVmLCBNQ19DTURfVFJJR0dFUl9JTlRFUlJVUFRfSU5fTEVOKTsKIAorCWlmIChlZnhfbWNkaV9zZXRfd29ya2Fyb3VuZChlZngsIE1DX0NNRF9XT1JLQVJPVU5EX0JVRzQxNzUwLCB0cnVlLAorCQkJCSAgICBOVUxMKSA9PSAwKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCiAJQlVJTERfQlVHX09OKE1DX0NNRF9UUklHR0VSX0lOVEVSUlVQVF9PVVRfTEVOICE9IDApOwogCiAJTUNESV9TRVRfRFdPUkQoaW5idWYsIFRSSUdHRVJfSU5URVJSVVBUX0lOX0lOVFJfTEVWRUwsIGVmeC0+aXJxX2xldmVsKTsKLQkodm9pZCkgZWZ4X21jZGlfcnBjKGVmeCwgTUNfQ01EX1RSSUdHRVJfSU5URVJSVVBULAorCXJldHVybiBlZnhfbWNkaV9ycGMoZWZ4LCBNQ19DTURfVFJJR0dFUl9JTlRFUlJVUFQsCiAJCQkgICAgaW5idWYsIHNpemVvZihpbmJ1ZiksIE5VTEwsIDAsIE5VTEwpOwogfQogCkBAIC0yNTM1LDEzICsyNjU0LDEyIEBACiBzdGF0aWMgaW50IGVmeF9lZjEwX2V2X2luaXQoc3RydWN0IGVmeF9jaGFubmVsICpjaGFubmVsKQogewogCU1DRElfREVDTEFSRV9CVUYoaW5idWYsCi0JCQkgTUNfQ01EX0lOSVRfRVZRX0lOX0xFTihFRlhfTUFYX0VWUV9TSVpFICogOCAvCi0JCQkJCQlFRlhfQlVGX1NJWkUpKTsKLQlNQ0RJX0RFQ0xBUkVfQlVGKG91dGJ1ZiwgTUNfQ01EX0lOSVRfRVZRX09VVF9MRU4pOworCQkJIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9MRU4oRUZYX01BWF9FVlFfU0laRSAqIDggLworCQkJCQkJICAgRUZYX0JVRl9TSVpFKSk7CisJTUNESV9ERUNMQVJFX0JVRihvdXRidWYsIE1DX0NNRF9JTklUX0VWUV9WMl9PVVRfTEVOKTsKIAlzaXplX3QgZW50cmllcyA9IGNoYW5uZWwtPmV2ZW50cS5idWYubGVuIC8gRUZYX0JVRl9TSVpFOwogCXN0cnVjdCBlZnhfbmljICplZnggPSBjaGFubmVsLT5lZng7CiAJc3RydWN0IGVmeF9lZjEwX25pY19kYXRhICpuaWNfZGF0YTsKLQlib29sIHN1cHBvcnRzX3J4X21lcmdlOwogCXNpemVfdCBpbmxlbiwgb3V0bGVuOwogCXVuc2lnbmVkIGludCBlbmFibGVkLCBpbXBsZW1lbnRlZDsKIAlkbWFfYWRkcl90IGRtYV9hZGRyOwpAQCAtMjU0OSw5ICsyNjY3LDYgQEAKIAlpbnQgaTsKIAogCW5pY19kYXRhID0gZWZ4LT5uaWNfZGF0YTsKLQlzdXBwb3J0c19yeF9tZXJnZSA9Ci0JCSEhKG5pY19kYXRhLT5kYXRhcGF0aF9jYXBzICYKLQkJICAgMSA8PCBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19PVVRfUlhfQkFUQ0hJTkdfTEJOKTsKIAogCS8qIEZpbGwgZXZlbnQgcXVldWUgd2l0aCBhbGwgb25lcyAoaS5lLiBlbXB0eSBldmVudHMpICovCiAJbWVtc2V0KGNoYW5uZWwtPmV2ZW50cS5idWYuYWRkciwgMHhmZiwgY2hhbm5lbC0+ZXZlbnRxLmJ1Zi5sZW4pOwpAQCAtMjU2MCwxMSArMjY3NSw2IEBACiAJTUNESV9TRVRfRFdPUkQoaW5idWYsIElOSVRfRVZRX0lOX0lOU1RBTkNFLCBjaGFubmVsLT5jaGFubmVsKTsKIAkvKiBJTklUX0VWUSBleHBlY3RzIGluZGV4IGluIHZlY3RvciB0YWJsZSwgbm90IGFic29sdXRlICovCiAJTUNESV9TRVRfRFdPUkQoaW5idWYsIElOSVRfRVZRX0lOX0lSUV9OVU0sIGNoYW5uZWwtPmNoYW5uZWwpOwotCU1DRElfUE9QVUxBVEVfRFdPUkRfNChpbmJ1ZiwgSU5JVF9FVlFfSU5fRkxBR1MsCi0JCQkgICAgICBJTklUX0VWUV9JTl9GTEFHX0lOVEVSUlVQVElORywgMSwKLQkJCSAgICAgIElOSVRfRVZRX0lOX0ZMQUdfUlhfTUVSR0UsIDEsCi0JCQkgICAgICBJTklUX0VWUV9JTl9GTEFHX1RYX01FUkdFLCAxLAotCQkJICAgICAgSU5JVF9FVlFfSU5fRkxBR19DVVRfVEhSVSwgIXN1cHBvcnRzX3J4X21lcmdlKTsKIAlNQ0RJX1NFVF9EV09SRChpbmJ1ZiwgSU5JVF9FVlFfSU5fVE1SX01PREUsCiAJCSAgICAgICBNQ19DTURfSU5JVF9FVlFfSU5fVE1SX01PREVfRElTKTsKIAlNQ0RJX1NFVF9EV09SRChpbmJ1ZiwgSU5JVF9FVlFfSU5fVE1SX0xPQUQsIDApOwpAQCAtMjU3Myw2ICsyNjgzLDI3IEBACiAJCSAgICAgICBNQ19DTURfSU5JVF9FVlFfSU5fQ09VTlRfTU9ERV9ESVMpOwogCU1DRElfU0VUX0RXT1JEKGluYnVmLCBJTklUX0VWUV9JTl9DT1VOVF9USFJTSExELCAwKTsKIAorCWlmIChuaWNfZGF0YS0+ZGF0YXBhdGhfY2FwczIgJgorCSAgICAxIDw8IE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YyX09VVF9JTklUX0VWUV9WMl9MQk4pIHsKKwkJLyogVXNlIHRoZSBuZXcgZ2VuZXJpYyBhcHByb2FjaCB0byBzcGVjaWZ5aW5nIGV2ZW50IHF1ZXVlCisJCSAqIGNvbmZpZ3VyYXRpb24sIHJlcXVlc3RpbmcgbG93ZXIgbGF0ZW5jeSBvciBoaWdoZXIgdGhyb3VnaHB1dC4KKwkJICogVGhlIG9wdGlvbnMgdGhhdCBhY3R1YWxseSBnZXQgdXNlZCBhcHBlYXIgaW4gdGhlIG91dHB1dC4KKwkJICovCisJCU1DRElfUE9QVUxBVEVfRFdPUkRfMihpbmJ1ZiwgSU5JVF9FVlFfVjJfSU5fRkxBR1MsCisJCQkJICAgICAgSU5JVF9FVlFfVjJfSU5fRkxBR19JTlRFUlJVUFRJTkcsIDEsCisJCQkJICAgICAgSU5JVF9FVlFfVjJfSU5fRkxBR19UWVBFLAorCQkJCSAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9GTEFHX1RZUEVfQVVUTyk7CisJfSBlbHNlIHsKKwkJYm9vbCBjdXRfdGhydSA9ICEobmljX2RhdGEtPmRhdGFwYXRoX2NhcHMgJgorCQkJMSA8PCBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19PVVRfUlhfQkFUQ0hJTkdfTEJOKTsKKworCQlNQ0RJX1BPUFVMQVRFX0RXT1JEXzQoaW5idWYsIElOSVRfRVZRX0lOX0ZMQUdTLAorCQkJCSAgICAgIElOSVRfRVZRX0lOX0ZMQUdfSU5URVJSVVBUSU5HLCAxLAorCQkJCSAgICAgIElOSVRfRVZRX0lOX0ZMQUdfUlhfTUVSR0UsIDEsCisJCQkJICAgICAgSU5JVF9FVlFfSU5fRkxBR19UWF9NRVJHRSwgMSwKKwkJCQkgICAgICBJTklUX0VWUV9JTl9GTEFHX0NVVF9USFJVLCBjdXRfdGhydSk7CisJfQorCiAJZG1hX2FkZHIgPSBjaGFubmVsLT5ldmVudHEuYnVmLmRtYV9hZGRyOwogCWZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyArK2kpIHsKIAkJTUNESV9TRVRfQVJSQVlfUVdPUkQoaW5idWYsIElOSVRfRVZRX0lOX0RNQV9BRERSLCBpLCBkbWFfYWRkcik7CkBAIC0yNTgzLDYgKzI3MTQsMTMgQEAKIAogCXJjID0gZWZ4X21jZGlfcnBjKGVmeCwgTUNfQ01EX0lOSVRfRVZRLCBpbmJ1ZiwgaW5sZW4sCiAJCQkgIG91dGJ1Ziwgc2l6ZW9mKG91dGJ1ZiksICZvdXRsZW4pOworCisJaWYgKG91dGxlbiA+PSBNQ19DTURfSU5JVF9FVlFfVjJfT1VUX0xFTikKKwkJbmV0aWZfZGJnKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsCisJCQkgICJDaGFubmVsICVkIHVzaW5nIGV2ZW50IHF1ZXVlIGZsYWdzICUwOHhcbiIsCisJCQkgIGNoYW5uZWwtPmNoYW5uZWwsCisJCQkgIE1DRElfRFdPUkQob3V0YnVmLCBJTklUX0VWUV9WMl9PVVRfRkxBR1MpKTsKKwogCS8qIElSUSByZXR1cm4gaXMgaWdub3JlZCAqLwogCWlmIChjaGFubmVsLT5jaGFubmVsIHx8IHJjKQogCQlyZXR1cm4gcmM7CkBAIC0yNTkwLDggKzI3MjgsOCBAQAogCS8qIFN1Y2Nlc3NmdWxseSBjcmVhdGVkIGV2ZW50IHF1ZXVlIG9uIGNoYW5uZWwgMCAqLwogCXJjID0gZWZ4X21jZGlfZ2V0X3dvcmthcm91bmRzKGVmeCwgJmltcGxlbWVudGVkLCAmZW5hYmxlZCk7CiAJaWYgKHJjID09IC1FTk9TWVMpIHsKLQkJLyogR0VUX1dPUktBUk9VTkRTIHdhcyBpbXBsZW1lbnRlZCBiZWZvcmUgdGhlIGJ1ZzI2ODA3Ci0JCSAqIHdvcmthcm91bmQsIHRodXMgdGhlIGxhdHRlciBtdXN0IGJlIHVuYXZhaWxhYmxlIGluIHRoaXMgZncKKwkJLyogR0VUX1dPUktBUk9VTkRTIHdhcyBpbXBsZW1lbnRlZCBiZWZvcmUgdGhpcyB3b3JrYXJvdW5kLAorCQkgKiB0aHVzIGl0IG11c3QgYmUgdW5hdmFpbGFibGUgaW4gdGhpcyBmaXJtd2FyZS4KIAkJICovCiAJCW5pY19kYXRhLT53b3JrYXJvdW5kXzI2ODA3ID0gZmFsc2U7CiAJCXJjID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9lZnguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9lZnguYwppbmRleCAxNGI4MjFiLi4zY2YzNTU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZWZ4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2VmeC5jCkBAIC0yODEsNiArMjgxLDI3IEBACiAgKiBOQVBJIGd1YXJhbnRlZXMgc2VyaWFsaXNhdGlvbiBvZiBwb2xscyBvZiB0aGUgc2FtZSBkZXZpY2UsIHdoaWNoCiAgKiBwcm92aWRlcyB0aGUgZ3VhcmFudGVlIHJlcXVpcmVkIGJ5IGVmeF9wcm9jZXNzX2NoYW5uZWwoKS4KICAqLworc3RhdGljIHZvaWQgZWZ4X3VwZGF0ZV9pcnFfbW9kKHN0cnVjdCBlZnhfbmljICplZngsIHN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlpbnQgc3RlcCA9IGVmeC0+aXJxX21vZF9zdGVwX3VzOworCisJaWYgKGNoYW5uZWwtPmlycV9tb2Rfc2NvcmUgPCBpcnFfYWRhcHRfbG93X3RocmVzaCkgeworCQlpZiAoY2hhbm5lbC0+aXJxX21vZGVyYXRpb25fdXMgPiBzdGVwKSB7CisJCQljaGFubmVsLT5pcnFfbW9kZXJhdGlvbl91cyAtPSBzdGVwOworCQkJZWZ4LT50eXBlLT5wdXNoX2lycV9tb2RlcmF0aW9uKGNoYW5uZWwpOworCQl9CisJfSBlbHNlIGlmIChjaGFubmVsLT5pcnFfbW9kX3Njb3JlID4gaXJxX2FkYXB0X2hpZ2hfdGhyZXNoKSB7CisJCWlmIChjaGFubmVsLT5pcnFfbW9kZXJhdGlvbl91cyA8CisJCSAgICBlZngtPmlycV9yeF9tb2RlcmF0aW9uX3VzKSB7CisJCQljaGFubmVsLT5pcnFfbW9kZXJhdGlvbl91cyArPSBzdGVwOworCQkJZWZ4LT50eXBlLT5wdXNoX2lycV9tb2RlcmF0aW9uKGNoYW5uZWwpOworCQl9CisJfQorCisJY2hhbm5lbC0+aXJxX2NvdW50ID0gMDsKKwljaGFubmVsLT5pcnFfbW9kX3Njb3JlID0gMDsKK30KKwogc3RhdGljIGludCBlZnhfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpCiB7CiAJc3RydWN0IGVmeF9jaGFubmVsICpjaGFubmVsID0KQEAgLTMwMSwyMiArMzIyLDcgQEAKIAkJaWYgKGVmeF9jaGFubmVsX2hhc19yeF9xdWV1ZShjaGFubmVsKSAmJgogCQkgICAgZWZ4LT5pcnFfcnhfYWRhcHRpdmUgJiYKIAkJICAgIHVubGlrZWx5KCsrY2hhbm5lbC0+aXJxX2NvdW50ID09IDEwMDApKSB7Ci0JCQlpZiAodW5saWtlbHkoY2hhbm5lbC0+aXJxX21vZF9zY29yZSA8Ci0JCQkJICAgICBpcnFfYWRhcHRfbG93X3RocmVzaCkpIHsKLQkJCQlpZiAoY2hhbm5lbC0+aXJxX21vZGVyYXRpb24gPiAxKSB7Ci0JCQkJCWNoYW5uZWwtPmlycV9tb2RlcmF0aW9uIC09IDE7Ci0JCQkJCWVmeC0+dHlwZS0+cHVzaF9pcnFfbW9kZXJhdGlvbihjaGFubmVsKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHVubGlrZWx5KGNoYW5uZWwtPmlycV9tb2Rfc2NvcmUgPgotCQkJCQkgICAgaXJxX2FkYXB0X2hpZ2hfdGhyZXNoKSkgewotCQkJCWlmIChjaGFubmVsLT5pcnFfbW9kZXJhdGlvbiA8Ci0JCQkJICAgIGVmeC0+aXJxX3J4X21vZGVyYXRpb24pIHsKLQkJCQkJY2hhbm5lbC0+aXJxX21vZGVyYXRpb24gKz0gMTsKLQkJCQkJZWZ4LT50eXBlLT5wdXNoX2lycV9tb2RlcmF0aW9uKGNoYW5uZWwpOwotCQkJCX0KLQkJCX0KLQkJCWNoYW5uZWwtPmlycV9jb3VudCA9IDA7Ci0JCQljaGFubmVsLT5pcnFfbW9kX3Njb3JlID0gMDsKKwkJCWVmeF91cGRhdGVfaXJxX21vZChlZngsIGNoYW5uZWwpOwogCQl9CiAKIAkJZWZ4X2ZpbHRlcl9yZnNfZXhwaXJlKGNoYW5uZWwpOwpAQCAtMTcwMyw2ICsxNzA5LDcgQEAKIAluZXRpZl9zZXRfcmVhbF9udW1fcnhfcXVldWVzKGVmeC0+bmV0X2RldiwgZWZ4LT5uX3J4X2NoYW5uZWxzKTsKIAogCS8qIEluaXRpYWxpc2UgdGhlIGludGVycnVwdCBtb2RlcmF0aW9uIHNldHRpbmdzICovCisJZWZ4LT5pcnFfbW9kX3N0ZXBfdXMgPSBESVZfUk9VTkRfVVAoZWZ4LT50aW1lcl9xdWFudHVtX25zLCAxMDAwKTsKIAllZnhfaW5pdF9pcnFfbW9kZXJhdGlvbihlZngsIHR4X2lycV9tb2RfdXNlYywgcnhfaXJxX21vZF91c2VjLCB0cnVlLAogCQkJCXRydWUpOwogCkBAIC0xOTQ5LDE0ICsxOTU2LDIxIEBACiAgKiBJbnRlcnJ1cHQgbW9kZXJhdGlvbgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHVuc2lnbmVkIGludCBpcnFfbW9kX3RpY2tzKHVuc2lnbmVkIGludCB1c2VjcywgdW5zaWduZWQgaW50IHF1YW50dW1fbnMpCit1bnNpZ25lZCBpbnQgZWZ4X3VzZWNzX3RvX3RpY2tzKHN0cnVjdCBlZnhfbmljICplZngsIHVuc2lnbmVkIGludCB1c2VjcykKIHsKIAlpZiAodXNlY3MgPT0gMCkKIAkJcmV0dXJuIDA7Ci0JaWYgKHVzZWNzICogMTAwMCA8IHF1YW50dW1fbnMpCisJaWYgKHVzZWNzICogMTAwMCA8IGVmeC0+dGltZXJfcXVhbnR1bV9ucykKIAkJcmV0dXJuIDE7IC8qIG5ldmVyIHJvdW5kIGRvd24gdG8gMCAqLwotCXJldHVybiB1c2VjcyAqIDEwMDAgLyBxdWFudHVtX25zOworCXJldHVybiB1c2VjcyAqIDEwMDAgLyBlZngtPnRpbWVyX3F1YW50dW1fbnM7Cit9CisKK3Vuc2lnbmVkIGludCBlZnhfdGlja3NfdG9fdXNlY3Moc3RydWN0IGVmeF9uaWMgKmVmeCwgdW5zaWduZWQgaW50IHRpY2tzKQoreworCS8qIFdlIG11c3Qgcm91bmQgdXAgd2hlbiBjb252ZXJ0aW5nIHRpY2tzIHRvIG1pY3Jvc2Vjb25kcworCSAqIGJlY2F1c2Ugd2Ugcm91bmQgZG93biB3aGVuIGNvbnZlcnRpbmcgdGhlIG90aGVyIHdheS4KKwkgKi8KKwlyZXR1cm4gRElWX1JPVU5EX1VQKHRpY2tzICogZWZ4LT50aW1lcl9xdWFudHVtX25zLCAxMDAwKTsKIH0KIAogLyogU2V0IGludGVycnVwdCBtb2RlcmF0aW9uIHBhcmFtZXRlcnMgKi8KQEAgLTE5NjUsMjEgKzE5NzksMTYgQEAKIAkJCSAgICBib29sIHJ4X21heV9vdmVycmlkZV90eCkKIHsKIAlzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWw7Ci0JdW5zaWduZWQgaW50IGlycV9tb2RfbWF4ID0gRElWX1JPVU5EX1VQKGVmeC0+dHlwZS0+dGltZXJfcGVyaW9kX21heCAqCi0JCQkJCQllZngtPnRpbWVyX3F1YW50dW1fbnMsCi0JCQkJCQkxMDAwKTsKLQl1bnNpZ25lZCBpbnQgdHhfdGlja3M7Ci0JdW5zaWduZWQgaW50IHJ4X3RpY2tzOworCXVuc2lnbmVkIGludCB0aW1lcl9tYXhfdXM7CiAKIAlFRlhfQVNTRVJUX1JFU0VUX1NFUklBTElTRUQoZWZ4KTsKIAotCWlmICh0eF91c2VjcyA+IGlycV9tb2RfbWF4IHx8IHJ4X3VzZWNzID4gaXJxX21vZF9tYXgpCisJdGltZXJfbWF4X3VzID0gZWZ4LT50aW1lcl9tYXhfbnMgLyAxMDAwOworCisJaWYgKHR4X3VzZWNzID4gdGltZXJfbWF4X3VzIHx8IHJ4X3VzZWNzID4gdGltZXJfbWF4X3VzKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXR4X3RpY2tzID0gaXJxX21vZF90aWNrcyh0eF91c2VjcywgZWZ4LT50aW1lcl9xdWFudHVtX25zKTsKLQlyeF90aWNrcyA9IGlycV9tb2RfdGlja3MocnhfdXNlY3MsIGVmeC0+dGltZXJfcXVhbnR1bV9ucyk7Ci0KLQlpZiAodHhfdGlja3MgIT0gcnhfdGlja3MgJiYgZWZ4LT50eF9jaGFubmVsX29mZnNldCA9PSAwICYmCisJaWYgKHR4X3VzZWNzICE9IHJ4X3VzZWNzICYmIGVmeC0+dHhfY2hhbm5lbF9vZmZzZXQgPT0gMCAmJgogCSAgICAhcnhfbWF5X292ZXJyaWRlX3R4KSB7CiAJCW5ldGlmX2VycihlZngsIGRydiwgZWZ4LT5uZXRfZGV2LCAiQ2hhbm5lbHMgYXJlIHNoYXJlZC4gIgogCQkJICAiUlggYW5kIFRYIElSUSBtb2RlcmF0aW9uIG11c3QgYmUgZXF1YWxcbiIpOwpAQCAtMTk4NywxMiArMTk5NiwxMiBAQAogCX0KIAogCWVmeC0+aXJxX3J4X2FkYXB0aXZlID0gcnhfYWRhcHRpdmU7Ci0JZWZ4LT5pcnFfcnhfbW9kZXJhdGlvbiA9IHJ4X3RpY2tzOworCWVmeC0+aXJxX3J4X21vZGVyYXRpb25fdXMgPSByeF91c2VjczsKIAllZnhfZm9yX2VhY2hfY2hhbm5lbChjaGFubmVsLCBlZngpIHsKIAkJaWYgKGVmeF9jaGFubmVsX2hhc19yeF9xdWV1ZShjaGFubmVsKSkKLQkJCWNoYW5uZWwtPmlycV9tb2RlcmF0aW9uID0gcnhfdGlja3M7CisJCQljaGFubmVsLT5pcnFfbW9kZXJhdGlvbl91cyA9IHJ4X3VzZWNzOwogCQllbHNlIGlmIChlZnhfY2hhbm5lbF9oYXNfdHhfcXVldWVzKGNoYW5uZWwpKQotCQkJY2hhbm5lbC0+aXJxX21vZGVyYXRpb24gPSB0eF90aWNrczsKKwkJCWNoYW5uZWwtPmlycV9tb2RlcmF0aW9uX3VzID0gdHhfdXNlY3M7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0yMDAxLDI2ICsyMDEwLDIxIEBACiB2b2lkIGVmeF9nZXRfaXJxX21vZGVyYXRpb24oc3RydWN0IGVmeF9uaWMgKmVmeCwgdW5zaWduZWQgaW50ICp0eF91c2VjcywKIAkJCSAgICB1bnNpZ25lZCBpbnQgKnJ4X3VzZWNzLCBib29sICpyeF9hZGFwdGl2ZSkKIHsKLQkvKiBXZSBtdXN0IHJvdW5kIHVwIHdoZW4gY29udmVydGluZyB0aWNrcyB0byBtaWNyb3NlY29uZHMKLQkgKiBiZWNhdXNlIHdlIHJvdW5kIGRvd24gd2hlbiBjb252ZXJ0aW5nIHRoZSBvdGhlciB3YXkuCi0JICovCi0KIAkqcnhfYWRhcHRpdmUgPSBlZngtPmlycV9yeF9hZGFwdGl2ZTsKLQkqcnhfdXNlY3MgPSBESVZfUk9VTkRfVVAoZWZ4LT5pcnFfcnhfbW9kZXJhdGlvbiAqCi0JCQkJIGVmeC0+dGltZXJfcXVhbnR1bV9ucywKLQkJCQkgMTAwMCk7CisJKnJ4X3VzZWNzID0gZWZ4LT5pcnFfcnhfbW9kZXJhdGlvbl91czsKIAogCS8qIElmIGNoYW5uZWxzIGFyZSBzaGFyZWQgYmV0d2VlbiBSWCBhbmQgVFgsIHNvIGlzIElSUQogCSAqIG1vZGVyYXRpb24uICBPdGhlcndpc2UsIElSUSBtb2RlcmF0aW9uIGlzIHRoZSBzYW1lIGZvciBhbGwKIAkgKiBUWCBjaGFubmVscyBhbmQgaXMgbm90IGFkYXB0aXZlLgogCSAqLwotCWlmIChlZngtPnR4X2NoYW5uZWxfb2Zmc2V0ID09IDApCisJaWYgKGVmeC0+dHhfY2hhbm5lbF9vZmZzZXQgPT0gMCkgewogCQkqdHhfdXNlY3MgPSAqcnhfdXNlY3M7Ci0JZWxzZQotCQkqdHhfdXNlY3MgPSBESVZfUk9VTkRfVVAoCi0JCQllZngtPmNoYW5uZWxbZWZ4LT50eF9jaGFubmVsX29mZnNldF0tPmlycV9tb2RlcmF0aW9uICoKLQkJCWVmeC0+dGltZXJfcXVhbnR1bV9ucywKLQkJCTEwMDApOworCX0gZWxzZSB7CisJCXN0cnVjdCBlZnhfY2hhbm5lbCAqdHhfY2hhbm5lbDsKKworCQl0eF9jaGFubmVsID0gZWZ4LT5jaGFubmVsW2VmeC0+dHhfY2hhbm5lbF9vZmZzZXRdOworCQkqdHhfdXNlY3MgPSB0eF9jaGFubmVsLT5pcnFfbW9kZXJhdGlvbl91czsKKwl9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjI1OSw4ICsyMjYzLDE4IEBACiAJcmMgPSBlZnhfY2hlY2tfZGlzYWJsZWQoZWZ4KTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKLQlpZiAobmV3X210dSA+IEVGWF9NQVhfTVRVKQorCWlmIChuZXdfbXR1ID4gRUZYX01BWF9NVFUpIHsKKwkJbmV0aWZfZXJyKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsCisJCQkgICJSZXF1ZXN0ZWQgTVRVIG9mICVkIHRvbyBiaWcgKG1heDogJWQpXG4iLAorCQkJICBuZXdfbXR1LCBFRlhfTUFYX01UVSk7CiAJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAobmV3X210dSA8IEVGWF9NSU5fTVRVKSB7CisJCW5ldGlmX2VycihlZngsIGRydiwgZWZ4LT5uZXRfZGV2LAorCQkJICAiUmVxdWVzdGVkIE1UVSBvZiAlZCB0b28gc21hbGwgKG1pbjogJWQpXG4iLAorCQkJICBuZXdfbXR1LCBFRlhfTUlOX01UVSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCW5ldGlmX2RiZyhlZngsIGRydiwgZWZ4LT5uZXRfZGV2LCAiY2hhbmdpbmcgTVRVIHRvICVkXG4iLCBuZXdfbXR1KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2VmeC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2VmeC5oCmluZGV4IGMzYWU3MzkuLjM0MmFlMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9lZnguaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZWZ4LmgKQEAgLTIwNCw2ICsyMDQsOCBAQAogCiAvKiBHbG9iYWwgKi8KIHZvaWQgZWZ4X3NjaGVkdWxlX3Jlc2V0KHN0cnVjdCBlZnhfbmljICplZngsIGVudW0gcmVzZXRfdHlwZSB0eXBlKTsKK3Vuc2lnbmVkIGludCBlZnhfdXNlY3NfdG9fdGlja3Moc3RydWN0IGVmeF9uaWMgKmVmeCwgdW5zaWduZWQgaW50IHVzZWNzKTsKK3Vuc2lnbmVkIGludCBlZnhfdGlja3NfdG9fdXNlY3Moc3RydWN0IGVmeF9uaWMgKmVmeCwgdW5zaWduZWQgaW50IHRpY2tzKTsKIGludCBlZnhfaW5pdF9pcnFfbW9kZXJhdGlvbihzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCB1bnNpZ25lZCBpbnQgdHhfdXNlY3MsCiAJCQkgICAgdW5zaWduZWQgaW50IHJ4X3VzZWNzLCBib29sIHJ4X2FkYXB0aXZlLAogCQkJICAgIGJvb2wgcnhfbWF5X292ZXJyaWRlX3R4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9mYWxjb24uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9mYWxjb24uYwppbmRleCBkNzkwY2I4Li4xYTcwOTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZmFsY29uLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2ZhbGNvbi5jCkBAIC0zNzgsMTIgKzM3OCwxNSBAQAogCXN0cnVjdCBlZnhfbmljICplZnggPSBjaGFubmVsLT5lZng7CiAKIAkvKiBTZXQgdGltZXIgcmVnaXN0ZXIgKi8KLQlpZiAoY2hhbm5lbC0+aXJxX21vZGVyYXRpb24pIHsKKwlpZiAoY2hhbm5lbC0+aXJxX21vZGVyYXRpb25fdXMpIHsKKwkJdW5zaWduZWQgaW50IHRpY2tzOworCisJCXRpY2tzID0gZWZ4X3VzZWNzX3RvX3RpY2tzKGVmeCwgY2hhbm5lbC0+aXJxX21vZGVyYXRpb25fdXMpOwogCQlFRlhfUE9QVUxBVEVfRFdPUkRfMih0aW1lcl9jbWQsCiAJCQkJICAgICBGUkZfQUJfVENfVElNRVJfTU9ERSwKIAkJCQkgICAgIEZGRV9CQl9USU1FUl9NT0RFX0lOVF9ITERPRkYsCiAJCQkJICAgICBGUkZfQUJfVENfVElNRVJfVkFMLAotCQkJCSAgICAgY2hhbm5lbC0+aXJxX21vZGVyYXRpb24gLSAxKTsKKwkJCQkgICAgIHRpY2tzIC0gMSk7CiAJfSBlbHNlIHsKIAkJRUZYX1BPUFVMQVRFX0RXT1JEXzIodGltZXJfY21kLAogCQkJCSAgICAgRlJGX0FCX1RDX1RJTUVSX01PREUsCkBAIC0yMzczLDYgKzIzNzYsOCBAQAogCQkJICAgICBFRlhfTUFYX0NIQU5ORUxTKTsKIAllZngtPm1heF90eF9jaGFubmVscyA9IGVmeC0+bWF4X2NoYW5uZWxzOwogCWVmeC0+dGltZXJfcXVhbnR1bV9ucyA9IDQ5Njg7IC8qIDYyMSBjeWNsZXMgKi8KKwllZngtPnRpbWVyX21heF9ucyA9IGVmeC0+dHlwZS0+dGltZXJfcGVyaW9kX21heCAqCisJCQkgICAgZWZ4LT50aW1lcl9xdWFudHVtX25zOwogCiAJLyogSW5pdGlhbGlzZSBJMkMgYWRhcHRlciAqLwogCWJvYXJkID0gZmFsY29uX2JvYXJkKGVmeCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZmFsY29uX2JvYXJkcy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2ZhbGNvbl9ib2FyZHMuYwppbmRleCAxNzM2ZjRiLi5mNjg4M2IyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZmFsY29uX2JvYXJkcy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9mYWxjb25fYm9hcmRzLmMKQEAgLTY0LDcgKzY0LDcgQEAKICNkZWZpbmUgTE04N19BTEFSTV9URU1QX0lOVAkJMHgxMAogI2RlZmluZSBMTTg3X0FMQVJNX1RFTVBfRVhUMQkJMHgyMAogCi0jaWYgZGVmaW5lZChDT05GSUdfU0VOU09SU19MTTg3KSB8fCBkZWZpbmVkKENPTkZJR19TRU5TT1JTX0xNODdfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NFTlNPUlNfTE04NykKIAogc3RhdGljIGludCBlZnhfcG9rZV9sbTg3KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGNvbnN0IHU4ICpyZWdfdmFsdWVzKQogewpAQCAtNDU1LDcgKzQ1NSw3IEBACiAJc3RydWN0IGZhbGNvbl9ib2FyZCAqYm9hcmQgPSBmYWxjb25fYm9hcmQoZWZ4KTsKIAlpbnQgcmM7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19TRU5TT1JTX0xNOTApIHx8IGRlZmluZWQoQ09ORklHX1NFTlNPUlNfTE05MF9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfU0VOU09SU19MTTkwKQogCWJvYXJkLT5od21vbl9jbGllbnQgPQogCQlpMmNfbmV3X2RldmljZSgmYm9hcmQtPmkyY19hZGFwLCAmc2ZlNDAwMV9od21vbl9pbmZvKTsKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZmFyY2guYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9mYXJjaC5jCmluZGV4IDRjODM3MzkuLjQ3NjJlYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9mYXJjaC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9mYXJjaC5jCkBAIC0xNDc3LDkgKzE0NzcsMTAgQEAKICAqIEludGVycnVwdCBtdXN0IGFscmVhZHkgaGF2ZSBiZWVuIGVuYWJsZWQsIG90aGVyd2lzZSBuYXN0eSB0aGluZ3MKICAqIG1heSBoYXBwZW4uCiAgKi8KLXZvaWQgZWZ4X2ZhcmNoX2lycV90ZXN0X2dlbmVyYXRlKHN0cnVjdCBlZnhfbmljICplZngpCitpbnQgZWZ4X2ZhcmNoX2lycV90ZXN0X2dlbmVyYXRlKHN0cnVjdCBlZnhfbmljICplZngpCiB7CiAJZWZ4X2ZhcmNoX2ludGVycnVwdHMoZWZ4LCB0cnVlLCB0cnVlKTsKKwlyZXR1cm4gMDsKIH0KIAogLyogUHJvY2VzcyBhIGZhdGFsIGludGVycnVwdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL21jZGkuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9tY2RpLmMKaW5kZXggZDI4ZTdkZC4uMjQxNTIwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL21jZGkuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvbWNkaS5jCkBAIC01NDgsNyArNTQ4LDEwIEBACiAJCWVmeF9tY2RpX2Rpc3BsYXlfZXJyb3IoZWZ4LCBhc3luYy0+Y21kLCBhc3luYy0+aW5sZW4sIGVycmJ1ZiwKIAkJCQkgICAgICAgZXJyX2xlbiwgcmMpOwogCX0KLQlhc3luYy0+Y29tcGxldGUoZWZ4LCBhc3luYy0+Y29va2llLCByYywgb3V0YnVmLCBkYXRhX2xlbik7CisKKwlpZiAoYXN5bmMtPmNvbXBsZXRlKQorCQlhc3luYy0+Y29tcGxldGUoZWZ4LCBhc3luYy0+Y29va2llLCByYywgb3V0YnVmLAorCQkJCW1pbihhc3luYy0+b3V0bGVuLCBkYXRhX2xlbikpOwogCWtmcmVlKGFzeW5jKTsKIAogCWVmeF9tY2RpX3JlbGVhc2UobWNkaSk7CkBAIC0xMTUzLDcgKzExNTYsOCBAQAogCSAqIGFjcXVpcmVkIGxvY2tzIGluIHRoZSB3cm9uZyBvcmRlci4KIAkgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYXN5bmMsIG5leHQsICZtY2RpLT5hc3luY19saXN0LCBsaXN0KSB7Ci0JCWFzeW5jLT5jb21wbGV0ZShlZngsIGFzeW5jLT5jb29raWUsIC1FTkVURE9XTiwgTlVMTCwgMCk7CisJCWlmIChhc3luYy0+Y29tcGxldGUpCisJCQlhc3luYy0+Y29tcGxldGUoZWZ4LCBhc3luYy0+Y29va2llLCAtRU5FVERPV04sIE5VTEwsIDApOwogCQlsaXN0X2RlbCgmYXN5bmMtPmxpc3QpOwogCQlrZnJlZShhc3luYyk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL21jZGlfcGNvbC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL21jZGlfcGNvbC5oCmluZGV4IGM5YTViMDAuLmNjY2VhZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9tY2RpX3Bjb2wuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvbWNkaV9wY29sLmgKQEAgLTI2NDUsMTYgKzI2NDUsMjAgQEAKICNkZWZpbmUgICAgICAgICAgTUNfQ01EX1BPTExfQklTVF9NRU1fQlVTX01DIDB4MAogLyogZW51bTogQ1NSIElSRUcgYnVzLiAqLwogI2RlZmluZSAgICAgICAgICBNQ19DTURfUE9MTF9CSVNUX01FTV9CVVNfQ1NSIDB4MQotLyogZW51bTogUlggRFBDUFUgYnVzLiAqLworLyogZW51bTogUlgwIERQQ1BVIGJ1cy4gKi8KICNkZWZpbmUgICAgICAgICAgTUNfQ01EX1BPTExfQklTVF9NRU1fQlVTX0RQQ1BVX1JYIDB4MgogLyogZW51bTogVFgwIERQQ1BVIGJ1cy4gKi8KICNkZWZpbmUgICAgICAgICAgTUNfQ01EX1BPTExfQklTVF9NRU1fQlVTX0RQQ1BVX1RYMCAweDMKIC8qIGVudW06IFRYMSBEUENQVSBidXMuICovCiAjZGVmaW5lICAgICAgICAgIE1DX0NNRF9QT0xMX0JJU1RfTUVNX0JVU19EUENQVV9UWDEgMHg0Ci0vKiBlbnVtOiBSWCBESUNQVSBidXMuICovCisvKiBlbnVtOiBSWDAgRElDUFUgYnVzLiAqLwogI2RlZmluZSAgICAgICAgICBNQ19DTURfUE9MTF9CSVNUX01FTV9CVVNfRElDUFVfUlggMHg1CiAvKiBlbnVtOiBUWCBESUNQVSBidXMuICovCiAjZGVmaW5lICAgICAgICAgIE1DX0NNRF9QT0xMX0JJU1RfTUVNX0JVU19ESUNQVV9UWCAweDYKKy8qIGVudW06IFJYMSBEUENQVSBidXMuICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9QT0xMX0JJU1RfTUVNX0JVU19EUENQVV9SWDEgMHg3CisvKiBlbnVtOiBSWDEgRElDUFUgYnVzLiAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfUE9MTF9CSVNUX01FTV9CVVNfRElDUFVfUlgxIDB4OAogLyogUGF0dGVybiB3cml0dGVuIHRvIFJBTSAvIHJlZ2lzdGVyICovCiAjZGVmaW5lICAgICAgIE1DX0NNRF9QT0xMX0JJU1RfT1VUX01FTV9FWFBFQ1RfT0ZTVCAxNgogLyogQWN0dWFsIHZhbHVlIHJlYWQgZnJvbSBSQU0gLyByZWdpc3RlciAqLwpAQCAtMzYxMiw2ICszNjE2LDggQEAKICNkZWZpbmUgICAgICAgIE1DX0NNRF9OVlJBTV9JTkZPX09VVF9QUk9URUNURURfV0lEVEggMQogI2RlZmluZSAgICAgICAgTUNfQ01EX05WUkFNX0lORk9fT1VUX1RMVl9MQk4gMQogI2RlZmluZSAgICAgICAgTUNfQ01EX05WUkFNX0lORk9fT1VUX1RMVl9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfTlZSQU1fSU5GT19PVVRfQ01BQ19MQk4gNgorI2RlZmluZSAgICAgICAgTUNfQ01EX05WUkFNX0lORk9fT1VUX0NNQUNfV0lEVEggMQogI2RlZmluZSAgICAgICAgTUNfQ01EX05WUkFNX0lORk9fT1VUX0FfQl9MQk4gNwogI2RlZmluZSAgICAgICAgTUNfQ01EX05WUkFNX0lORk9fT1VUX0FfQl9XSURUSCAxCiAjZGVmaW5lICAgICAgIE1DX0NNRF9OVlJBTV9JTkZPX09VVF9QSFlTREVWX09GU1QgMTYKQEAgLTQzODksNiArNDM5NSw4IEBACiAgKiB0aGUgY29tbWFuZCB3aWxsIGZhaWwgd2l0aCBNQ19DTURfRVJSX0ZJTFRFUlNfUFJFU0VOVC4KICAqLwogI2RlZmluZSAgICAgICAgICBNQ19DTURfV09SS0FST1VORF9CVUcyNjgwNyAweDYKKy8qIGVudW06IEJ1ZyA2MTI2NSB3b3JrIGFyb3VuZCAoYnJva2VuIEVWUSBUTVIgd3JpdGVzKS4gKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX1dPUktBUk9VTkRfQlVHNjEyNjUgMHg3CiAvKiAwID0gZGlzYWJsZSB0aGUgd29ya2Fyb3VuZCBpbmRpY2F0ZWQgYnkgVFlQRTsgYW55IG5vbi16ZXJvIHZhbHVlID0gZW5hYmxlCiAgKiB0aGUgd29ya2Fyb3VuZAogICovCkBAIC00NDEzLDcgKzQ0MjEsNiBAQAogICogKEdFVF9QSFlfQ0ZHX09VVF9NRURJQV9UWVBFKTsgdGhlIHZhbGlkICdwYWdlIG51bWJlcicgaW5wdXQgdmFsdWVzLCBhbmQgdGhlCiAgKiBvdXRwdXQgZGF0YSwgYXJlIGludGVycHJldGVkIG9uIGEgcGVyLXR5cGUgYmFzaXMuIEZvciBTRlArOiBQQUdFPTAgb3IgMQogICogcmV0dXJucyBhIDEyOC1ieXRlIGJsb2NrIHJlYWQgZnJvbSBtb2R1bGUgSTJDIGFkZHJlc3MgMHhBMCBvZmZzZXQgMCBvciAweDgwLgotICogQW55dGhpbmcgZWxzZTogY3VycmVudGx5IHVuZGVmaW5lZC4gTG9ja3MgcmVxdWlyZWQ6IE5vbmUuIFJldHVybiBjb2RlOiAwLgogICovCiAjZGVmaW5lIE1DX0NNRF9HRVRfUEhZX01FRElBX0lORk8gMHg0YgogCkBAIC01NDc5LDYgKzU0ODYsOCBAQAogI2RlZmluZSAgICAgICAgTElDRU5TRURfVjNfRkVBVFVSRVNfVFhfU05JRkZfV0lEVEggMQogI2RlZmluZSAgICAgICAgTElDRU5TRURfVjNfRkVBVFVSRVNfUFJPWFlfRklMVEVSX09QU19MQk4gOAogI2RlZmluZSAgICAgICAgTElDRU5TRURfVjNfRkVBVFVSRVNfUFJPWFlfRklMVEVSX09QU19XSURUSCAxCisjZGVmaW5lICAgICAgICBMSUNFTlNFRF9WM19GRUFUVVJFU19FVkVOVF9DVVRfVEhST1VHSF9MQk4gOQorI2RlZmluZSAgICAgICAgTElDRU5TRURfVjNfRkVBVFVSRVNfRVZFTlRfQ1VUX1RIUk9VR0hfV0lEVEggMQogI2RlZmluZSAgICAgICBMSUNFTlNFRF9WM19GRUFUVVJFU19NQVNLX0xCTiAwCiAjZGVmaW5lICAgICAgIExJQ0VOU0VEX1YzX0ZFQVRVUkVTX01BU0tfV0lEVEggNjQKIApAQCAtNTYzNCw2ICs1NjQzLDEwOSBAQAogLyogT25seSB2YWxpZCBpZiBJTlRSRkxBRyB3YXMgdHJ1ZSAqLwogI2RlZmluZSAgICAgICBNQ19DTURfSU5JVF9FVlFfT1VUX0lSUV9PRlNUIDAKIAorLyogTUNfQ01EX0lOSVRfRVZRX1YyX0lOIG1zZ3JlcXVlc3QgKi8KKyNkZWZpbmUgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0xFTk1JTiA0NAorI2RlZmluZSAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fTEVOTUFYIDU0OAorI2RlZmluZSAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fTEVOKG51bSkgKDM2KzgqKG51bSkpCisvKiBTaXplLCBpbiBlbnRyaWVzICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9TSVpFX09GU1QgMAorLyogRGVzaXJlZCBpbnN0YW5jZS4gTXVzdCBiZSBzZXQgdG8gYSBzcGVjaWZpYyBpbnN0YW5jZSwgd2hpY2ggaXMgYSBmdW5jdGlvbgorICogbG9jYWwgcXVldWUgaW5kZXguCisgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0lOU1RBTkNFX09GU1QgNAorLyogVGhlIGluaXRpYWwgdGltZXIgdmFsdWUuIFRoZSBsb2FkIHZhbHVlIGlzIGlnbm9yZWQgaWYgdGhlIHRpbWVyIG1vZGUgaXMgRElTLgorICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9UTVJfTE9BRF9PRlNUIDgKKy8qIFRoZSByZWxvYWQgdmFsdWUgaXMgaWdub3JlZCBpbiBvbmUtc2hvdCBtb2RlcyAqLworI2RlZmluZSAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fVE1SX1JFTE9BRF9PRlNUIDEyCisvKiB0YmQgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0ZMQUdTX09GU1QgMTYKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9GTEFHX0lOVEVSUlVQVElOR19MQk4gMAorI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0ZMQUdfSU5URVJSVVBUSU5HX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9GTEFHX1JQVFJfRE9TX0xCTiAxCisjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRkxBR19SUFRSX0RPU19XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRkxBR19JTlRfQVJNRF9MQk4gMgorI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0ZMQUdfSU5UX0FSTURfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0ZMQUdfQ1VUX1RIUlVfTEJOIDMKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9GTEFHX0NVVF9USFJVX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9GTEFHX1JYX01FUkdFX0xCTiA0CisjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRkxBR19SWF9NRVJHRV9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRkxBR19UWF9NRVJHRV9MQk4gNQorI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0ZMQUdfVFhfTUVSR0VfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0ZMQUdfVVNFX1RJTUVSX0xCTiA2CisjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRkxBR19VU0VfVElNRVJfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0ZMQUdfVFlQRV9MQk4gNworI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0ZMQUdfVFlQRV9XSURUSCA0CisvKiBlbnVtOiBBbGwgaW5pdGlhbGlzYXRpb24gZmxhZ3Mgc3BlY2lmaWVkIGJ5IGhvc3QuICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9GTEFHX1RZUEVfTUFOVUFMIDB4MAorLyogZW51bTogTUVERk9SRCBvbmx5LiBDZXJ0YWluIGluaXRpYWxpc2F0aW9uIGZsYWdzIHNwZWNpZmllZCBieSBob3N0IG1heSBiZQorICogb3Zlci1yaWRkZW4gYnkgZmlybXdhcmUgYmFzZWQgb24gbGljZW5zZXMgYW5kIGZpcm13YXJlIHZhcmlhbnQgaW4gb3JkZXIgdG8KKyAqIHByb3ZpZGUgdGhlIGxvd2VzdCBsYXRlbmN5IGFjaGlldmFibGUuIFNlZQorICogTUNfQ01EX0lOSVRfRVZRX1YyL01DX0NNRF9JTklUX0VWUV9WMl9PVVQvRkxBR1MgZm9yIGxpc3Qgb2YgYWZmZWN0ZWQgZmxhZ3MuCisgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0ZMQUdfVFlQRV9MT1dfTEFURU5DWSAweDEKKy8qIGVudW06IE1FREZPUkQgb25seS4gQ2VydGFpbiBpbml0aWFsaXNhdGlvbiBmbGFncyBzcGVjaWZpZWQgYnkgaG9zdCBtYXkgYmUKKyAqIG92ZXItcmlkZGVuIGJ5IGZpcm13YXJlIGJhc2VkIG9uIGxpY2Vuc2VzIGFuZCBmaXJtd2FyZSB2YXJpYW50IGluIG9yZGVyIHRvCisgKiBwcm92aWRlIHRoZSBiZXN0IHRocm91Z2hwdXQgYWNoaWV2YWJsZS4gU2VlCisgKiBNQ19DTURfSU5JVF9FVlFfVjIvTUNfQ01EX0lOSVRfRVZRX1YyX09VVC9GTEFHUyBmb3IgbGlzdCBvZiBhZmZlY3RlZCBmbGFncy4KKyAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRkxBR19UWVBFX1RIUk9VR0hQVVQgMHgyCisvKiBlbnVtOiBNRURGT1JEIG9ubHkuIENlcnRhaW4gaW5pdGlhbGlzYXRpb24gZmxhZ3MgbWF5IGJlIG92ZXItcmlkZGVuIGJ5CisgKiBmaXJtd2FyZSBiYXNlZCBvbiBsaWNlbnNlcyBhbmQgZmlybXdhcmUgdmFyaWFudC4gU2VlCisgKiBNQ19DTURfSU5JVF9FVlFfVjIvTUNfQ01EX0lOSVRfRVZRX1YyX09VVC9GTEFHUyBmb3IgbGlzdCBvZiBhZmZlY3RlZCBmbGFncy4KKyAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRkxBR19UWVBFX0FVVE8gMHgzCisjZGVmaW5lICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9UTVJfTU9ERV9PRlNUIDIwCisvKiBlbnVtOiBEaXNhYmxlZCAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fVE1SX01PREVfRElTIDB4MAorLyogZW51bTogSW1tZWRpYXRlICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9UTVJfSU1NRURfU1RBUlQgMHgxCisvKiBlbnVtOiBUcmlnZ2VyZWQgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX1RNUl9UUklHX1NUQVJUIDB4MgorLyogZW51bTogSG9sZC1vZmYgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX1RNUl9JTlRfSExET0ZGIDB4MworLyogVGFyZ2V0IEVWUSBmb3Igd2FrZXVwcyBpZiBpbiB3YWtldXAgbW9kZS4gKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX1RBUkdFVF9FVlFfT0ZTVCAyNAorLyogVGFyZ2V0IGludGVycnVwdCBpZiBpbiBpbnRlcnJ1cHRpbmcgbW9kZSAobm90ZSB1bmlvbiB3aXRoIHRhcmdldCBFVlEpLiBVc2UKKyAqIE1DX0NNRF9SRVNPVVJDRV9JTlNUQU5DRV9BTlkgdW5sZXNzIGEgc3BlY2lmaWMgb25lIHJlcXVpcmVkIGZvciB0ZXN0CisgKiBwdXJwb3Nlcy4KKyAqLworI2RlZmluZSAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fSVJRX05VTV9PRlNUIDI0CisvKiBFdmVudCBDb3VudGVyIE1vZGUuICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9DT1VOVF9NT0RFX09GU1QgMjgKKy8qIGVudW06IERpc2FibGVkICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9DT1VOVF9NT0RFX0RJUyAweDAKKy8qIGVudW06IERpc2FibGVkICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9DT1VOVF9NT0RFX1JYIDB4MQorLyogZW51bTogRGlzYWJsZWQgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0NPVU5UX01PREVfVFggMHgyCisvKiBlbnVtOiBEaXNhYmxlZCAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fQ09VTlRfTU9ERV9SWFRYIDB4MworLyogRXZlbnQgcXVldWUgcGFja2V0IGNvdW50IHRocmVzaG9sZC4gKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0NPVU5UX1RIUlNITERfT0ZTVCAzMgorLyogNjQtYml0IGFkZHJlc3Mgb2YgNGsgb2YgNGstYWxpZ25lZCBob3N0IG1lbW9yeSBidWZmZXIgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0RNQV9BRERSX09GU1QgMzYKKyNkZWZpbmUgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0RNQV9BRERSX0xFTiA4CisjZGVmaW5lICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9ETUFfQUREUl9MT19PRlNUIDM2CisjZGVmaW5lICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9ETUFfQUREUl9ISV9PRlNUIDQwCisjZGVmaW5lICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9ETUFfQUREUl9NSU5OVU0gMQorI2RlZmluZSAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRE1BX0FERFJfTUFYTlVNIDY0CisKKy8qIE1DX0NNRF9JTklUX0VWUV9WMl9PVVQgbXNncmVzcG9uc2UgKi8KKyNkZWZpbmUgICAgTUNfQ01EX0lOSVRfRVZRX1YyX09VVF9MRU4gOAorLyogT25seSB2YWxpZCBpZiBJTlRSRkxBRyB3YXMgdHJ1ZSAqLworI2RlZmluZSAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfT1VUX0lSUV9PRlNUIDAKKy8qIEFjdHVhbCBjb25maWd1cmF0aW9uIGFwcGxpZWQgb24gdGhlIGNhcmQgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX09VVF9GTEFHU19PRlNUIDQKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9PVVRfRkxBR19DVVRfVEhSVV9MQk4gMAorI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX09VVF9GTEFHX0NVVF9USFJVX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9PVVRfRkxBR19SWF9NRVJHRV9MQk4gMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX09VVF9GTEFHX1JYX01FUkdFX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9PVVRfRkxBR19UWF9NRVJHRV9MQk4gMgorI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX09VVF9GTEFHX1RYX01FUkdFX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9PVVRfRkxBR19SWFFfRk9SQ0VfRVZfTUVSR0lOR19MQk4gMworI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX09VVF9GTEFHX1JYUV9GT1JDRV9FVl9NRVJHSU5HX1dJRFRIIDEKKwogLyogUVVFVUVfQ1JDX01PREUgc3RydWN0dXJlZGVmICovCiAjZGVmaW5lICAgIFFVRVVFX0NSQ19NT0RFX0xFTiAxCiAjZGVmaW5lICAgICAgIFFVRVVFX0NSQ19NT0RFX01PREVfTEJOIDAKQEAgLTU2OTcsOCArNTgwOSw4IEBACiAjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9SWFFfSU5fRkxBR19QUkVGSVhfV0lEVEggMQogI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfUlhRX0lOX0ZMQUdfRElTQUJMRV9TQ0FUVEVSX0xCTiA5CiAjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9SWFFfSU5fRkxBR19ESVNBQkxFX1NDQVRURVJfV0lEVEggMQotI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfUlhRX0lOX0ZMQUdfRk9SQ0VfRVZfTUVSR0lOR19MQk4gMTAKLSNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX1JYUV9JTl9GTEFHX0ZPUkNFX0VWX01FUkdJTkdfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfUlhRX0lOX1VOVVNFRF9MQk4gMTAKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX1JYUV9JTl9VTlVTRURfV0lEVEggMQogLyogT3duZXIgSUQgdG8gdXNlIGlmIGluIGJ1ZmZlciBtb2RlICh6ZXJvIGlmIHBoeXNpY2FsKSAqLwogI2RlZmluZSAgICAgICBNQ19DTURfSU5JVF9SWFFfSU5fT1dORVJfSURfT0ZTVCAyMAogLyogVGhlIHBvcnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSB2LWFkYXB0b3Igd2hpY2ggc2hvdWxkIGNvbnRhaW4gdGhpcyBETUFRLiAqLwpAQCAtNzg1NCw2ICs3OTY2LDIwIEBACiAjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WMl9PVVRfRVZFTlRfQ1VUX1RIUk9VR0hfV0lEVEggMQogI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjJfT1VUX1JYX0NVVF9USFJPVUdIX0xCTiA0CiAjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WMl9PVVRfUlhfQ1VUX1RIUk9VR0hfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjJfT1VUX1RYX1ZGSUZPX1VMTF9NT0RFX0xCTiA1CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WMl9PVVRfVFhfVkZJRk9fVUxMX01PREVfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjJfT1VUX01BQ19TVEFUU180MEdfVFhfU0laRV9CSU5TX0xCTiA2CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WMl9PVVRfTUFDX1NUQVRTXzQwR19UWF9TSVpFX0JJTlNfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjJfT1VUX0lOSVRfRVZRX1YyX0xCTiA3CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WMl9PVVRfSU5JVF9FVlFfVjJfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjJfT1VUX1RYX01BQ19USU1FU1RBTVBJTkdfTEJOIDgKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YyX09VVF9UWF9NQUNfVElNRVNUQU1QSU5HX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YyX09VVF9UWF9USU1FU1RBTVBfTEJOIDkKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YyX09VVF9UWF9USU1FU1RBTVBfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjJfT1VUX1JYX1NOSUZGX0xCTiAxMAorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjJfT1VUX1JYX1NOSUZGX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YyX09VVF9UWF9TTklGRl9MQk4gMTEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YyX09VVF9UWF9TTklGRl9XSURUSCAxCiAvKiBOdW1iZXIgb2YgRkFUU092MiBjb250ZXh0cyBwZXIgZGF0YXBhdGggc3VwcG9ydGVkIGJ5IHRoaXMgTklDLiBOb3QgcHJlc2VudAogICogb24gb2xkZXIgZmlybXdhcmUgKGNoZWNrIHRoZSBsZW5ndGgpLgogICovCkBAIC03OTEwLDYgKzgwMzYsMjg4IEBACiAjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YyX09VVF9TSVpFX1BJT19CVUZGX09GU1QgNzAKICNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjJfT1VUX1NJWkVfUElPX0JVRkZfTEVOIDIKIAorLyogTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUIG1zZ3Jlc3BvbnNlICovCisjZGVmaW5lICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9MRU4gNzMKKy8qIEZpcnN0IHdvcmQgb2YgZmxhZ3MuICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9GTEFHUzFfT0ZTVCAwCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVlBPUlRfUkVDT05GSUdVUkVfTEJOIDMKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9WUE9SVF9SRUNPTkZJR1VSRV9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfU1RSSVBJTkdfTEJOIDQKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9TVFJJUElOR19XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVkFEQVBUT1JfUVVFUllfTEJOIDUKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9WQURBUFRPUl9RVUVSWV9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfRVZCX1BPUlRfVkxBTl9SRVNUUklDVF9MQk4gNgorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX0VWQl9QT1JUX1ZMQU5fUkVTVFJJQ1RfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX0RSVl9BVFRBQ0hfUFJFQk9PVF9MQk4gNworI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX0RSVl9BVFRBQ0hfUFJFQk9PVF9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfRk9SQ0VfRVZFTlRfTUVSR0lOR19MQk4gOAorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX0ZPUkNFX0VWRU5UX01FUkdJTkdfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1NFVF9NQUNfRU5IQU5DRURfTEJOIDkKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9TRVRfTUFDX0VOSEFOQ0VEX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9VTktOT1dOX1VDQVNUX0RTVF9GSUxURVJfQUxXQVlTX01VTFRJX1JFQ0lQSUVOVF9MQk4gMTAKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9VTktOT1dOX1VDQVNUX0RTVF9GSUxURVJfQUxXQVlTX01VTFRJX1JFQ0lQSUVOVF9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVkFEQVBUT1JfUEVSTUlUX1NFVF9NQUNfV0hFTl9GSUxURVJTX0lOU1RBTExFRF9MQk4gMTEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9WQURBUFRPUl9QRVJNSVRfU0VUX01BQ19XSEVOX0ZJTFRFUlNfSU5TVEFMTEVEX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9NQUNfU0VDVVJJVFlfRklMVEVSSU5HX0xCTiAxMgorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX01BQ19TRUNVUklUWV9GSUxURVJJTkdfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX0FERElUSU9OQUxfUlNTX01PREVTX0xCTiAxMworI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX0FERElUSU9OQUxfUlNTX01PREVTX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9RQkJfTEJOIDE0CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUUJCX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9QQUNLRURfU1RSRUFNX1ZBUl9CVUZGRVJTX0xCTiAxNQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX1BBQ0tFRF9TVFJFQU1fVkFSX0JVRkZFUlNfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX1JTU19MSU1JVEVEX0xCTiAxNgorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX1JTU19MSU1JVEVEX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9QQUNLRURfU1RSRUFNX0xCTiAxNworI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX1BBQ0tFRF9TVFJFQU1fV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX0lOQ0xVREVfRkNTX0xCTiAxOAorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX0lOQ0xVREVfRkNTX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9WTEFOX0lOU0VSVElPTl9MQk4gMTkKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9WTEFOX0lOU0VSVElPTl9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfVkxBTl9TVFJJUFBJTkdfTEJOIDIwCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfVkxBTl9TVFJJUFBJTkdfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX1RTT19MQk4gMjEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9UU09fV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX1BSRUZJWF9MRU5fMF9MQk4gMjIKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9QUkVGSVhfTEVOXzBfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX1BSRUZJWF9MRU5fMTRfTEJOIDIzCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfUFJFRklYX0xFTl8xNF9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfVElNRVNUQU1QX0xCTiAyNAorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX1RJTUVTVEFNUF9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfQkFUQ0hJTkdfTEJOIDI1CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfQkFUQ0hJTkdfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX01DQVNUX0ZJTFRFUl9DSEFJTklOR19MQk4gMjYKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9NQ0FTVF9GSUxURVJfQ0hBSU5JTkdfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1BNX0FORF9SWERQX0NPVU5URVJTX0xCTiAyNworI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1BNX0FORF9SWERQX0NPVU5URVJTX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9ESVNBQkxFX1NDQVRURVJfTEJOIDI4CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfRElTQUJMRV9TQ0FUVEVSX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9NQ0FTVF9VRFBfTE9PUEJBQ0tfTEJOIDI5CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfTUNBU1RfVURQX0xPT1BCQUNLX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9FVkJfTEJOIDMwCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfRVZCX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9WWExBTl9OVkdSRV9MQk4gMzEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9WWExBTl9OVkdSRV9XSURUSCAxCisvKiBSeERQQ1BVIGZpcm13YXJlIGlkLiAqLworI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfRFBDUFVfRldfSURfT0ZTVCA0CisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9EUENQVV9GV19JRF9MRU4gMgorLyogZW51bTogU3RhbmRhcmQgUlhEUCBmaXJtd2FyZSAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhEUCAgMHgwCisvKiBlbnVtOiBMb3cgbGF0ZW5jeSBSWERQIGZpcm13YXJlICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWERQX0xPV19MQVRFTkNZICAweDEKKy8qIGVudW06IFBhY2tlZCBzdHJlYW0gUlhEUCBmaXJtd2FyZSAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhEUF9QQUNLRURfU1RSRUFNICAweDIKKy8qIGVudW06IEJJU1QgUlhEUCBmaXJtd2FyZSAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhEUF9CSVNUICAweDEwYQorLyogZW51bTogUlhEUCBUZXN0IGZpcm13YXJlIGltYWdlIDEgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYRFBfVEVTVF9GV19UT19NQ19DVVRfVEhST1VHSCAgMHgxMDEKKy8qIGVudW06IFJYRFAgVGVzdCBmaXJtd2FyZSBpbWFnZSAyICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWERQX1RFU1RfRldfVE9fTUNfU1RPUkVfRk9SV0FSRCAgMHgxMDIKKy8qIGVudW06IFJYRFAgVGVzdCBmaXJtd2FyZSBpbWFnZSAzICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWERQX1RFU1RfRldfVE9fTUNfU1RPUkVfRk9SV0FSRF9GSVJTVCAgMHgxMDMKKy8qIGVudW06IFJYRFAgVGVzdCBmaXJtd2FyZSBpbWFnZSA0ICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWERQX1RFU1RfRVZFUllfRVZFTlRfQkFUQ0hBQkxFICAweDEwNAorLyogZW51bTogUlhEUCBUZXN0IGZpcm13YXJlIGltYWdlIDUgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYRFBfVEVTVF9CQUNLUFJFU1NVUkUgIDB4MTA1CisvKiBlbnVtOiBSWERQIFRlc3QgZmlybXdhcmUgaW1hZ2UgNiAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhEUF9URVNUX0ZXX1BBQ0tFVF9FRElUUyAgMHgxMDYKKy8qIGVudW06IFJYRFAgVGVzdCBmaXJtd2FyZSBpbWFnZSA3ICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWERQX1RFU1RfRldfUlhfSERSX1NQTElUICAweDEwNworLyogZW51bTogUlhEUCBUZXN0IGZpcm13YXJlIGltYWdlIDggKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYRFBfVEVTVF9GV19ESVNBQkxFX0RMICAweDEwOAorLyogZW51bTogUlhEUCBUZXN0IGZpcm13YXJlIGltYWdlIDkgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYRFBfVEVTVF9GV19ET09SQkVMTF9ERUxBWSAgMHgxMGIKKy8qIFR4RFBDUFUgZmlybXdhcmUgaWQuICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9EUENQVV9GV19JRF9PRlNUIDYKKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX0RQQ1BVX0ZXX0lEX0xFTiAyCisvKiBlbnVtOiBTdGFuZGFyZCBUWERQIGZpcm13YXJlICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWERQICAweDAKKy8qIGVudW06IExvdyBsYXRlbmN5IFRYRFAgZmlybXdhcmUgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYRFBfTE9XX0xBVEVOQ1kgIDB4MQorLyogZW51bTogSGlnaCBwYWNrZXQgcmF0ZSBUWERQIGZpcm13YXJlICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWERQX0hJR0hfUEFDS0VUX1JBVEUgIDB4MworLyogZW51bTogQklTVCBUWERQIGZpcm13YXJlICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWERQX0JJU1QgIDB4MTJkCisvKiBlbnVtOiBUWERQIFRlc3QgZmlybXdhcmUgaW1hZ2UgMSAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhEUF9URVNUX0ZXX1RTT19FRElUICAweDEwMQorLyogZW51bTogVFhEUCBUZXN0IGZpcm13YXJlIGltYWdlIDIgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYRFBfVEVTVF9GV19QQUNLRVRfRURJVFMgIDB4MTAyCisvKiBlbnVtOiBUWERQIENTUiBidXMgdGVzdCBmaXJtd2FyZSAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhEUF9URVNUX0ZXX0NTUiAgMHgxMDMKKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYUERfRldfVkVSU0lPTl9PRlNUIDgKKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYUERfRldfVkVSU0lPTl9MRU4gMgorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYUERfRldfVkVSU0lPTl9SRVZfTEJOIDAKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWFBEX0ZXX1ZFUlNJT05fUkVWX1dJRFRIIDEyCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhQRF9GV19WRVJTSU9OX1RZUEVfTEJOIDEyCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhQRF9GV19WRVJTSU9OX1RZUEVfV0lEVEggNAorLyogZW51bTogcmVzZXJ2ZWQgdmFsdWUgLSBkbyBub3QgdXNlIChtYXkgaW5kaWNhdGUgYWx0ZXJuYXRpdmUgaW50ZXJwcmV0YXRpb24KKyAqIG9mIFJFViBmaWVsZCBpbiBmdXR1cmUpCisgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYUERfRldfVFlQRV9SRVNFUlZFRCAgMHgwCisvKiBlbnVtOiBUcml2aWFsIFJYIFBEIGZpcm13YXJlIGZvciBlYXJseSBIdW50aW5ndG9uIGRldmVsb3BtZW50IChIdW50aW5ndG9uCisgKiBkZXZlbG9wbWVudCBvbmx5KQorICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWFBEX0ZXX1RZUEVfRklSU1RfUEtUICAweDEKKy8qIGVudW06IFJYIFBEIGZpcm13YXJlIHdpdGggYXBwcm94aW1hdGVseSBTaWVuYS1jb21wYXRpYmxlIGJlaGF2aW91cgorICogKEh1bnRpbmd0b24gZGV2ZWxvcG1lbnQgb25seSkKKyAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhQRF9GV19UWVBFX1NJRU5BX0NPTVBBVCAgMHgyCisvKiBlbnVtOiBWaXJ0dWFsIHN3aXRjaGluZyAoZnVsbCBmZWF0dXJlKSBSWCBQRCBwcm9kdWN0aW9uIGZpcm13YXJlICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWFBEX0ZXX1RZUEVfVlNXSVRDSCAgMHgzCisvKiBlbnVtOiBzaWVuYV9jb21wYXQgdmFyaWFudCBSWCBQRCBmaXJtd2FyZSB1c2luZyBQTSByYXRoZXIgdGhhbiBNQUMKKyAqIChIdW50aW5ndG9uIGRldmVsb3BtZW50IG9ubHkpCisgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYUERfRldfVFlQRV9TSUVOQV9DT01QQVRfUE0gIDB4NAorLyogZW51bTogTG93IGxhdGVuY3kgUlggUEQgcHJvZHVjdGlvbiBmaXJtd2FyZSAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhQRF9GV19UWVBFX0xPV19MQVRFTkNZICAweDUKKy8qIGVudW06IFBhY2tlZCBzdHJlYW0gUlggUEQgcHJvZHVjdGlvbiBmaXJtd2FyZSAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhQRF9GV19UWVBFX1BBQ0tFRF9TVFJFQU0gIDB4NgorLyogZW51bTogUlggUEQgZmlybXdhcmUgaGFuZGxpbmcgbGF5ZXIgMiBvbmx5IGZvciBoaWdoIHBhY2tldCByYXRlIHBlcmZvcm1hbmNlCisgKiB0ZXN0cyAoTWVkZm9yZCBkZXZlbG9wbWVudCBvbmx5KQorICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWFBEX0ZXX1RZUEVfTEFZRVIyX1BFUkYgIDB4NworLyogZW51bTogUnVsZXMgZW5naW5lIFJYIFBEIHByb2R1Y3Rpb24gZmlybXdhcmUgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYUERfRldfVFlQRV9SVUxFU19FTkdJTkUgIDB4OAorLyogZW51bTogUlggUEQgZmlybXdhcmUgZm9yIEdVRSBwYXJzaW5nIHByb3RvdHlwZSAoTWVkZm9yZCBkZXZlbG9wbWVudCBvbmx5KSAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhQRF9GV19UWVBFX1RFU1RGV19HVUVfUFJPVE9UWVBFICAweGUKKy8qIGVudW06IFJYIFBEIGZpcm13YXJlIHBhcnNpbmcgYnV0IG5vdCBmaWx0ZXJpbmcgbmV0d29yayBvdmVybGF5IHR1bm5lbAorICogZW5jYXBzdWxhdGlvbnMgKE1lZGZvcmQgZGV2ZWxvcG1lbnQgb25seSkKKyAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhQRF9GV19UWVBFX1RFU1RGV19FTkNBUF9QQVJTSU5HX09OTFkgIDB4ZgorI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhQRF9GV19WRVJTSU9OX09GU1QgMTAKKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYUERfRldfVkVSU0lPTl9MRU4gMgorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYUERfRldfVkVSU0lPTl9SRVZfTEJOIDAKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWFBEX0ZXX1ZFUlNJT05fUkVWX1dJRFRIIDEyCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhQRF9GV19WRVJTSU9OX1RZUEVfTEJOIDEyCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhQRF9GV19WRVJTSU9OX1RZUEVfV0lEVEggNAorLyogZW51bTogcmVzZXJ2ZWQgdmFsdWUgLSBkbyBub3QgdXNlIChtYXkgaW5kaWNhdGUgYWx0ZXJuYXRpdmUgaW50ZXJwcmV0YXRpb24KKyAqIG9mIFJFViBmaWVsZCBpbiBmdXR1cmUpCisgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYUERfRldfVFlQRV9SRVNFUlZFRCAgMHgwCisvKiBlbnVtOiBUcml2aWFsIFRYIFBEIGZpcm13YXJlIGZvciBlYXJseSBIdW50aW5ndG9uIGRldmVsb3BtZW50IChIdW50aW5ndG9uCisgKiBkZXZlbG9wbWVudCBvbmx5KQorICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWFBEX0ZXX1RZUEVfRklSU1RfUEtUICAweDEKKy8qIGVudW06IFRYIFBEIGZpcm13YXJlIHdpdGggYXBwcm94aW1hdGVseSBTaWVuYS1jb21wYXRpYmxlIGJlaGF2aW91cgorICogKEh1bnRpbmd0b24gZGV2ZWxvcG1lbnQgb25seSkKKyAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhQRF9GV19UWVBFX1NJRU5BX0NPTVBBVCAgMHgyCisvKiBlbnVtOiBWaXJ0dWFsIHN3aXRjaGluZyAoZnVsbCBmZWF0dXJlKSBUWCBQRCBwcm9kdWN0aW9uIGZpcm13YXJlICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWFBEX0ZXX1RZUEVfVlNXSVRDSCAgMHgzCisvKiBlbnVtOiBzaWVuYV9jb21wYXQgdmFyaWFudCBUWCBQRCBmaXJtd2FyZSB1c2luZyBQTSByYXRoZXIgdGhhbiBNQUMKKyAqIChIdW50aW5ndG9uIGRldmVsb3BtZW50IG9ubHkpCisgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYUERfRldfVFlQRV9TSUVOQV9DT01QQVRfUE0gIDB4NAorI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhQRF9GV19UWVBFX0xPV19MQVRFTkNZICAweDUgLyogZW51bSAqLworLyogZW51bTogVFggUEQgZmlybXdhcmUgaGFuZGxpbmcgbGF5ZXIgMiBvbmx5IGZvciBoaWdoIHBhY2tldCByYXRlIHBlcmZvcm1hbmNlCisgKiB0ZXN0cyAoTWVkZm9yZCBkZXZlbG9wbWVudCBvbmx5KQorICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWFBEX0ZXX1RZUEVfTEFZRVIyX1BFUkYgIDB4NworLyogZW51bTogUnVsZXMgZW5naW5lIFRYIFBEIHByb2R1Y3Rpb24gZmlybXdhcmUgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYUERfRldfVFlQRV9SVUxFU19FTkdJTkUgIDB4OAorLyogZW51bTogUlggUEQgZmlybXdhcmUgZm9yIEdVRSBwYXJzaW5nIHByb3RvdHlwZSAoTWVkZm9yZCBkZXZlbG9wbWVudCBvbmx5KSAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhQRF9GV19UWVBFX1RFU1RGV19HVUVfUFJPVE9UWVBFICAweGUKKy8qIEhhcmR3YXJlIGNhcGFiaWxpdGllcyBvZiBOSUMgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX0hXX0NBUEFCSUxJVElFU19PRlNUIDEyCisvKiBMaWNlbnNlZCBjYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX0xJQ0VOU0VfQ0FQQUJJTElUSUVTX09GU1QgMTYKKy8qIFNlY29uZCB3b3JkIG9mIGZsYWdzLiBOb3QgcHJlc2VudCBvbiBvbGRlciBmaXJtd2FyZSAoY2hlY2sgdGhlIGxlbmd0aCkuICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9GTEFHUzJfT0ZTVCAyMAorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX1RTT19WMl9MQk4gMAorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX1RTT19WMl9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfVFNPX1YyX0VOQ0FQX0xCTiAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfVFNPX1YyX0VOQ0FQX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9FVlFfVElNRVJfQ1RSTF9MQk4gMgorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX0VWUV9USU1FUl9DVFJMX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9FVkVOVF9DVVRfVEhST1VHSF9MQk4gMworI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX0VWRU5UX0NVVF9USFJPVUdIX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9DVVRfVEhST1VHSF9MQk4gNAorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX0NVVF9USFJPVUdIX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9WRklGT19VTExfTU9ERV9MQk4gNQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX1ZGSUZPX1VMTF9NT0RFX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9NQUNfU1RBVFNfNDBHX1RYX1NJWkVfQklOU19MQk4gNgorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX01BQ19TVEFUU180MEdfVFhfU0laRV9CSU5TX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9JTklUX0VWUV9WMl9MQk4gNworI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX0lOSVRfRVZRX1YyX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9NQUNfVElNRVNUQU1QSU5HX0xCTiA4CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfTUFDX1RJTUVTVEFNUElOR19XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfVElNRVNUQU1QX0xCTiA5CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfVElNRVNUQU1QX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9TTklGRl9MQk4gMTAKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9TTklGRl9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfU05JRkZfTEJOIDExCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfU05JRkZfV0lEVEggMQorLyogTnVtYmVyIG9mIEZBVFNPdjIgY29udGV4dHMgcGVyIGRhdGFwYXRoIHN1cHBvcnRlZCBieSB0aGlzIE5JQy4gTm90IHByZXNlbnQKKyAqIG9uIG9sZGVyIGZpcm13YXJlIChjaGVjayB0aGUgbGVuZ3RoKS4KKyAqLworI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfVFNPX1YyX05fQ09OVEVYVFNfT0ZTVCAyNAorI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfVFNPX1YyX05fQ09OVEVYVFNfTEVOIDIKKy8qIE9uZSBieXRlIHBlciBQRiBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgdGhlIGV4dGVybmFsIHBvcnQgYXNzaWduZWQgdG8gdGhpcworICogUEYsIGluZGV4ZWQgYnkgUEYgbnVtYmVyLiBTcGVjaWFsIHZhbHVlcyBpbmRpY2F0ZSB0aGF0IGEgUEYgaXMgZWl0aGVyIG5vdAorICogcHJlc2VudCBvciBub3QgYXNzaWduZWQuCisgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1BGU19UT19QT1JUU19BU1NJR05NRU5UX09GU1QgMjYKKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1BGU19UT19QT1JUU19BU1NJR05NRU5UX0xFTiAxCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9QRlNfVE9fUE9SVFNfQVNTSUdOTUVOVF9OVU0gMTYKKy8qIGVudW06IFRoZSBjYWxsZXIgaXMgbm90IHBlcm1pdHRlZCB0byBhY2Nlc3MgaW5mb3JtYXRpb24gb24gdGhpcyBQRi4gKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX0FDQ0VTU19OT1RfUEVSTUlUVEVEICAweGZmCisvKiBlbnVtOiBQRiBkb2VzIG5vdCBleGlzdC4gKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1BGX05PVF9QUkVTRU5UICAweGZlCisvKiBlbnVtOiBQRiBkb2VzIGV4aXN0IGJ1dCBpcyBub3QgYXNzaWduZWQgdG8gYW55IGV4dGVybmFsIHBvcnQuICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9QRl9OT1RfQVNTSUdORUQgIDB4ZmQKKy8qIGVudW06IFRoaXMgdmFsdWUgaW5kaWNhdGVzIHRoYXQgUEYgaXMgYXNzaWduZWQsIGJ1dCBpdCBjYW5ub3QgYmUgZXhwcmVzc2VkCisgKiBpbiB0aGlzIGZpZWxkLiBJdCBpcyBpbnRlbmRlZCBmb3IgYSBwb3NzaWJsZSBmdXR1cmUgc2l0dWF0aW9uIHdoZXJlIGEgbW9yZQorICogY29tcGxleCBzY2hlbWUgb2YgUEZzIHRvIHBvcnRzIG1hcHBpbmcgaXMgYmVpbmcgdXNlZC4gVGhlIGZ1dHVyZSBkcml2ZXIKKyAqIHNob3VsZCBsb29rIGZvciBhIG5ldyBmaWVsZCBzdXBwb3J0aW5nIHRoZSBuZXcgc2NoZW1lLiBUaGUgY3VycmVudC9vbGQKKyAqIGRyaXZlciBzaG91bGQgdHJlYXQgdGhpcyB2YWx1ZSBhcyBQRl9OT1RfQVNTSUdORUQuCisgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX0lOQ09NUEFUSUJMRV9BU1NJR05NRU5UICAweGZjCisvKiBPbmUgYnl0ZSBwZXIgUEYgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIGl0cyBWRnMsIGluZGV4ZWQgYnkgUEYgbnVtYmVyLiBBCisgKiBzcGVjaWFsIHZhbHVlIGluZGljYXRlcyB0aGF0IGEgUEYgaXMgbm90IHByZXNlbnQuCisgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX05VTV9WRlNfUEVSX1BGX09GU1QgNDIKKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX05VTV9WRlNfUEVSX1BGX0xFTiAxCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9OVU1fVkZTX1BFUl9QRl9OVU0gMTYKKy8qIGVudW06IFRoZSBjYWxsZXIgaXMgbm90IHBlcm1pdHRlZCB0byBhY2Nlc3MgaW5mb3JtYXRpb24gb24gdGhpcyBQRi4gKi8KKy8qICAgICAgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX0FDQ0VTU19OT1RfUEVSTUlUVEVEICAweGZmICovCisvKiBlbnVtOiBQRiBkb2VzIG5vdCBleGlzdC4gKi8KKy8qICAgICAgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1BGX05PVF9QUkVTRU5UICAweGZlICovCisvKiBOdW1iZXIgb2YgVklzIGF2YWlsYWJsZSBmb3IgZWFjaCBleHRlcm5hbCBwb3J0ICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9OVU1fVklTX1BFUl9QT1JUX09GU1QgNTgKKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX05VTV9WSVNfUEVSX1BPUlRfTEVOIDIKKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX05VTV9WSVNfUEVSX1BPUlRfTlVNIDQKKy8qIFNpemUgb2YgUlggZGVzY3JpcHRvciBjYWNoZSBleHByZXNzZWQgYXMgYmluYXJ5IGxvZ2FyaXRobSBUaGUgYWN0dWFsIHNpemUKKyAqIGVxdWFscyAoMiBeIFJYX0RFU0NfQ0FDSEVfU0laRSkKKyAqLworI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfREVTQ19DQUNIRV9TSVpFX09GU1QgNjYKKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX0RFU0NfQ0FDSEVfU0laRV9MRU4gMQorLyogU2l6ZSBvZiBUWCBkZXNjcmlwdG9yIGNhY2hlIGV4cHJlc3NlZCBhcyBiaW5hcnkgbG9nYXJpdGhtIFRoZSBhY3R1YWwgc2l6ZQorICogZXF1YWxzICgyIF4gVFhfREVTQ19DQUNIRV9TSVpFKQorICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9ERVNDX0NBQ0hFX1NJWkVfT0ZTVCA2NworI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfREVTQ19DQUNIRV9TSVpFX0xFTiAxCisvKiBUb3RhbCBudW1iZXIgb2YgYXZhaWxhYmxlIFBJTyBidWZmZXJzICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9OVU1fUElPX0JVRkZTX09GU1QgNjgKKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX05VTV9QSU9fQlVGRlNfTEVOIDIKKy8qIFNpemUgb2YgYSBzaW5nbGUgUElPIGJ1ZmZlciAqLworI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfU0laRV9QSU9fQlVGRl9PRlNUIDcwCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9TSVpFX1BJT19CVUZGX0xFTiAyCisvKiBPbiBjaGlwcyBsYXRlciB0aGFuIE1lZGZvcmQgdGhlIGFtb3VudCBvZiBhZGRyZXNzIHNwYWNlIGFzc2lnbmVkIHRvIGVhY2ggVkkKKyAqIGlzIGNvbmZpZ3VyYWJsZS4gVGhpcyBpcyBhIGdsb2JhbCBzZXR0aW5nIHRoYXQgdGhlIGRyaXZlciBtdXN0IHF1ZXJ5IHRvCisgKiBkaXNjb3ZlciB0aGUgVkkgdG8gYWRkcmVzcyBtYXBwaW5nLiBDdXQtdGhyb3VnaCBQSU8gKENUUElPKSBpbiBub3QgYXZhaWxhYmxlCisgKiB3aXRoIDhrIFZJIHdpbmRvd3MuCisgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1ZJX1dJTkRPV19NT0RFX09GU1QgNzIKKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1ZJX1dJTkRPV19NT0RFX0xFTiAxCisvKiBlbnVtOiBFYWNoIFZJIG9jY3VwaWVzIDhrIGFzIG9uIEh1bnRpbmd0b24gYW5kIE1lZGZvcmQuIFBJTyBpcyBhdCBvZmZzZXQgNGsuCisgKiBDVFBJTyBpcyBub3QgbWFwcGVkLgorICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9WSV9XSU5ET1dfTU9ERV84SyAgIDB4MAorLyogZW51bTogRWFjaCBWSSBvY2N1cGllcyAxNmsuIFBJTyBpcyBhdCBvZmZzZXQgNGsuIENUUElPIGlzIGF0IG9mZnNldCAxMmsuICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9WSV9XSU5ET1dfTU9ERV8xNksgIDB4MQorLyogZW51bTogRWFjaCBWSSBvY2N1cGllcyA2NGsuIFBJTyBpcyBhdCBvZmZzZXQgNGsuIENUUElPIGlzIGF0IG9mZnNldCAxMmsuICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9WSV9XSU5ET1dfTU9ERV82NEsgIDB4MgorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIE1DX0NNRF9WMl9FWFROCkBAIC05MDI2LDcgKzk0MzQsNyBAQAogICovCiAjZGVmaW5lIE1DX0NNRF9HRVRfUlhEUF9DT05GSUcgMHhjMgogCi0jZGVmaW5lIE1DX0NNRF8weGMyX1BSSVZJTEVHRV9DVEcgU1JJT1ZfQ1RHX0FETUlOCisjZGVmaW5lIE1DX0NNRF8weGMyX1BSSVZJTEVHRV9DVEcgU1JJT1ZfQ1RHX0dFTkVSQUwKIAogLyogTUNfQ01EX0dFVF9SWERQX0NPTkZJR19JTiBtc2dyZXF1ZXN0ICovCiAjZGVmaW5lICAgIE1DX0NNRF9HRVRfUlhEUF9DT05GSUdfSU5fTEVOIDAKQEAgLTEwMTI1LDcgKzEwNTMzLDkgQEAKICAqIHRoYXQgdGhpcyBvcGVyYXRpb24gcmV0dXJucyBhIHplcm8tbGVuZ3RoIHJlc3BvbnNlCiAgKi8KICNkZWZpbmUgICAgICAgICAgTUNfQ01EX0xJQ0VOU0lOR19WM19JTl9PUF9VUERBVEVfTElDRU5TRSAgMHgwCi0vKiBlbnVtOiByZXBvcnQgY291bnRzIG9mIGluc3RhbGxlZCBsaWNlbnNlcyAqLworLyogZW51bTogcmVwb3J0IGNvdW50cyBvZiBpbnN0YWxsZWQgbGljZW5zZXMgUmV0dXJucyBFQUdBSU4gaWYgbGljZW5zZQorICogcHJvY2Vzc2luZyAodXBkYXRpbmcpIGhhcyBiZWVuIHN0YXJ0ZWQgYnV0IG5vdCB5ZXQgY29tcGxldGVkLgorICovCiAjZGVmaW5lICAgICAgICAgIE1DX0NNRF9MSUNFTlNJTkdfVjNfSU5fT1BfUkVQT1JUX0xJQ0VOU0UgIDB4MQogCiAvKiBNQ19DTURfTElDRU5TSU5HX1YzX09VVCBtc2dyZXNwb25zZSAqLwpAQCAtMTA3NjMsNiArMTExNzMsOCBAQAogI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX1dPUktBUk9VTkRTX09VVF9CVUc0MjAwOCAweDIwCiAvKiBlbnVtOiBCdWcgMjY4MDcgZmVhdHVyZXMgcHJlc2VudCBpbiBmaXJtd2FyZSAobXVsdGljYXN0IGZpbHRlciBjaGFpbmluZykgKi8KICNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9XT1JLQVJPVU5EU19PVVRfQlVHMjY4MDcgMHg0MAorLyogZW51bTogQnVnIDYxMjY1IHdvcmsgYXJvdW5kIChicm9rZW4gRVZRIFRNUiB3cml0ZXMpLiAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX1dPUktBUk9VTkRTX09VVF9CVUc2MTI2NSAweDgwCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTEyODAsMjIgKzExNjkyLDExMCBAQAogI2RlZmluZSBNQ19DTURfMHgxMThfUFJJVklMRUdFX0NURyBTUklPVl9DVEdfQURNSU4KIAogLyogTUNfQ01EX1JYX0JBTEFOQ0lOR19JTiBtc2dyZXF1ZXN0ICovCi0jZGVmaW5lICAgIE1DX0NNRF9SWF9CQUxBTkNJTkdfSU5fTEVOIDQKKyNkZWZpbmUgICAgTUNfQ01EX1JYX0JBTEFOQ0lOR19JTl9MRU4gMTYKIC8qIFRoZSBSWCBwb3J0IHdob3NlIHVwY29udmVydGVyIHRhYmxlIHdpbGwgYmUgbW9kaWZpZWQgKi8KICNkZWZpbmUgICAgICAgTUNfQ01EX1JYX0JBTEFOQ0lOR19JTl9QT1JUX09GU1QgMAotI2RlZmluZSAgICAgICBNQ19DTURfUlhfQkFMQU5DSU5HX0lOX1BPUlRfTEVOIDEKIC8qIFRoZSBWTEFOIHByaW9yaXR5IGFzc29jaWF0ZWQgdG8gdGhlIHRhYmxlIGluZGV4IGFuZCB2RklGTyAqLwotI2RlZmluZSAgICAgICBNQ19DTURfUlhfQkFMQU5DSU5HX0lOX1BSSU9SSVRZX09GU1QgMQotI2RlZmluZSAgICAgICBNQ19DTURfUlhfQkFMQU5DSU5HX0lOX1BSSU9SSVRZX0xFTiAxCisjZGVmaW5lICAgICAgIE1DX0NNRF9SWF9CQUxBTkNJTkdfSU5fUFJJT1JJVFlfT0ZTVCA0CiAvKiBUaGUgcmVzdWx0aW5nIGJpdCBvZiBTUkNeRFNUIGZvciBpbmRleGluZyB0aGUgdGFibGUgKi8KLSNkZWZpbmUgICAgICAgTUNfQ01EX1JYX0JBTEFOQ0lOR19JTl9TUkNfRFNUX09GU1QgMgotI2RlZmluZSAgICAgICBNQ19DTURfUlhfQkFMQU5DSU5HX0lOX1NSQ19EU1RfTEVOIDEKKyNkZWZpbmUgICAgICAgTUNfQ01EX1JYX0JBTEFOQ0lOR19JTl9TUkNfRFNUX09GU1QgOAogLyogVGhlIFJYIGVuZ2luZSB0byB3aGljaCB0aGUgdkZJRk8gaW4gdGhlIHRhYmxlIGVudHJ5IHdpbGwgcG9pbnQgdG8gKi8KLSNkZWZpbmUgICAgICAgTUNfQ01EX1JYX0JBTEFOQ0lOR19JTl9FTkdfT0ZTVCAzCi0jZGVmaW5lICAgICAgIE1DX0NNRF9SWF9CQUxBTkNJTkdfSU5fRU5HX0xFTiAxCisjZGVmaW5lICAgICAgIE1DX0NNRF9SWF9CQUxBTkNJTkdfSU5fRU5HX09GU1QgMTIKIAogLyogTUNfQ01EX1JYX0JBTEFOQ0lOR19PVVQgbXNncmVzcG9uc2UgKi8KICNkZWZpbmUgICAgTUNfQ01EX1JYX0JBTEFOQ0lOR19PVVRfTEVOIDAKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTUNfQ01EX1NFVF9FVlFfVE1SCisgKiBVcGRhdGUgdGhlIHRpbWVyIGxvYWQsIHRpbWVyIHJlbG9hZCBhbmQgdGltZXIgbW9kZSB2YWx1ZXMgZm9yIGEgZ2l2ZW4gRVZRLgorICogVGhlIHJlcXVlc3RlZCB0aW1lciB2YWx1ZXMgKGluIFRNUl9MT0FEX1JFUV9OUyBhbmQgVE1SX1JFTE9BRF9SRVFfTlMpIHdpbGwKKyAqIGJlIHJvdW5kZWQgdXAgdG8gdGhlIGdyYW51bGFyaXR5IHN1cHBvcnRlZCBieSB0aGUgaGFyZHdhcmUsIHRoZW4gdHJ1bmNhdGVkCisgKiB0byB0aGUgcmFuZ2Ugc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZS4gVGhlIHJlc3VsdGluZyB2YWx1ZSBhZnRlciB0aGUKKyAqIHJvdW5kaW5nIGFuZCB0cnVuY2F0aW9uIHdpbGwgYmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciAoaW4gVE1SX0xPQURfQUNUX05TCisgKiBhbmQgVE1SX1JFTE9BRF9BQ1RfTlMpLgorICovCisjZGVmaW5lIE1DX0NNRF9TRVRfRVZRX1RNUiAweDEyMAorCisjZGVmaW5lIE1DX0NNRF8weDEyMF9QUklWSUxFR0VfQ1RHIFNSSU9WX0NUR19HRU5FUkFMCisKKy8qIE1DX0NNRF9TRVRfRVZRX1RNUl9JTiBtc2dyZXF1ZXN0ICovCisjZGVmaW5lICAgIE1DX0NNRF9TRVRfRVZRX1RNUl9JTl9MRU4gMTYKKy8qIEZ1bmN0aW9uLXJlbGF0aXZlIHF1ZXVlIGluc3RhbmNlICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9TRVRfRVZRX1RNUl9JTl9JTlNUQU5DRV9PRlNUIDAKKy8qIFJlcXVlc3RlZCB2YWx1ZSBmb3IgdGltZXIgbG9hZCAoaW4gbmFub3NlY29uZHMpICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9TRVRfRVZRX1RNUl9JTl9UTVJfTE9BRF9SRVFfTlNfT0ZTVCA0CisvKiBSZXF1ZXN0ZWQgdmFsdWUgZm9yIHRpbWVyIHJlbG9hZCAoaW4gbmFub3NlY29uZHMpICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9TRVRfRVZRX1RNUl9JTl9UTVJfUkVMT0FEX1JFUV9OU19PRlNUIDgKKy8qIFRpbWVyIG1vZGUuIE1lYW5pbmdzIGFzIHBlciBFVlFfVE1SX1JFRy5UQ19USU1FUl9WQUwgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX1NFVF9FVlFfVE1SX0lOX1RNUl9NT0RFX09GU1QgMTIKKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX1NFVF9FVlFfVE1SX0lOX1RJTUVSX01PREVfRElTICAweDAgLyogZW51bSAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfU0VUX0VWUV9UTVJfSU5fVElNRVJfTU9ERV9JTU1FRF9TVEFSVCAgMHgxIC8qIGVudW0gKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX1NFVF9FVlFfVE1SX0lOX1RJTUVSX01PREVfVFJJR19TVEFSVCAgMHgyIC8qIGVudW0gKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX1NFVF9FVlFfVE1SX0lOX1RJTUVSX01PREVfSU5UX0hMRE9GRiAgMHgzIC8qIGVudW0gKi8KKworLyogTUNfQ01EX1NFVF9FVlFfVE1SX09VVCBtc2dyZXNwb25zZSAqLworI2RlZmluZSAgICBNQ19DTURfU0VUX0VWUV9UTVJfT1VUX0xFTiA4CisvKiBBY3R1YWwgdmFsdWUgZm9yIHRpbWVyIGxvYWQgKGluIG5hbm9zZWNvbmRzKSAqLworI2RlZmluZSAgICAgICBNQ19DTURfU0VUX0VWUV9UTVJfT1VUX1RNUl9MT0FEX0FDVF9OU19PRlNUIDAKKy8qIEFjdHVhbCB2YWx1ZSBmb3IgdGltZXIgcmVsb2FkIChpbiBuYW5vc2Vjb25kcykgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX1NFVF9FVlFfVE1SX09VVF9UTVJfUkVMT0FEX0FDVF9OU19PRlNUIDQKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBNQ19DTURfR0VUX0VWUV9UTVJfUFJPUEVSVElFUworICogUXVlcnkgcHJvcGVydGllcyBhYm91dCB0aGUgZXZlbnQgcXVldWUgdGltZXJzLgorICovCisjZGVmaW5lIE1DX0NNRF9HRVRfRVZRX1RNUl9QUk9QRVJUSUVTIDB4MTIyCisKKyNkZWZpbmUgTUNfQ01EXzB4MTIyX1BSSVZJTEVHRV9DVEcgU1JJT1ZfQ1RHX0dFTkVSQUwKKworLyogTUNfQ01EX0dFVF9FVlFfVE1SX1BST1BFUlRJRVNfSU4gbXNncmVxdWVzdCAqLworI2RlZmluZSAgICBNQ19DTURfR0VUX0VWUV9UTVJfUFJPUEVSVElFU19JTl9MRU4gMAorCisvKiBNQ19DTURfR0VUX0VWUV9UTVJfUFJPUEVSVElFU19PVVQgbXNncmVzcG9uc2UgKi8KKyNkZWZpbmUgICAgTUNfQ01EX0dFVF9FVlFfVE1SX1BST1BFUlRJRVNfT1VUX0xFTiAzNgorLyogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfRVZRX1RNUl9QUk9QRVJUSUVTX09VVF9GTEFHU19PRlNUIDAKKy8qIEZvciB0aW1lcnMgdXBkYXRlZCB2aWEgd3JpdGVzIHRvIEVWUV9UTVJfUkVHLCB0aGlzIGlzIHRoZSB0aW1lIGludGVydmFsIChpbgorICogbmFub3NlY29uZHMpIGZvciBlYWNoIGluY3JlbWVudCBvZiB0aGUgdGltZXIgbG9hZC9yZWxvYWQgY291bnQuIFRoZQorICogcmVxdWVzdGVkIGR1cmF0aW9uIG9mIGEgdGltZXIgaXMgdGhpcyB2YWx1ZSBtdWx0aXBsaWVkIGJ5IHRoZSB0aW1lcgorICogbG9hZC9yZWxvYWQgY291bnQuCisgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9FVlFfVE1SX1BST1BFUlRJRVNfT1VUX1RNUl9SRUdfTlNfUEVSX0NPVU5UX09GU1QgNAorLyogRm9yIHRpbWVycyB1cGRhdGVkIHZpYSB3cml0ZXMgdG8gRVZRX1RNUl9SRUcsIHRoaXMgaXMgdGhlIG1heGltdW0gdmFsdWUKKyAqIGFsbG93ZWQgZm9yIHRpbWVyIGxvYWQvcmVsb2FkIGNvdW50cy4KKyAqLworI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0VWUV9UTVJfUFJPUEVSVElFU19PVVRfVE1SX1JFR19NQVhfQ09VTlRfT0ZTVCA4CisvKiBGb3IgdGltZXJzIHVwZGF0ZWQgdmlhIHdyaXRlcyB0byBFVlFfVE1SX1JFRywgdGltZXIgbG9hZC9yZWxvYWQgY291bnRzIG5vdCBhCisgKiBtdWx0aXBsZSBvZiB0aGlzIHN0ZXAgc2l6ZSB3aWxsIGJlIHJvdW5kZWQgaW4gYW4gaW1wbGVtZW50YXRpb24gZGVmaW5lZAorICogbWFubmVyLgorICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfRVZRX1RNUl9QUk9QRVJUSUVTX09VVF9UTVJfUkVHX1NURVBfT0ZTVCAxMgorLyogTWF4aW11bSB0aW1lciBkdXJhdGlvbiAoaW4gbmFub3NlY29uZHMpIGZvciB0aW1lcnMgdXBkYXRlZCB2aWEgTUNESS4gT25seQorICogbWVhbmluZ2Z1bCBpZiBNQ19DTURfU0VUX0VWUV9UTVIgaXMgaW1wbGVtZW50ZWQuCisgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9FVlFfVE1SX1BST1BFUlRJRVNfT1VUX01DRElfVE1SX01BWF9OU19PRlNUIDE2CisvKiBUaW1lciBkdXJhdGlvbnMgcmVxdWVzdGVkIHZpYSBNQ0RJIHRoYXQgYXJlIG5vdCBhIG11bHRpcGxlIG9mIHRoaXMgc3RlcCBzaXplCisgKiB3aWxsIGJlIHJvdW5kZWQgdXAuIE9ubHkgbWVhbmluZ2Z1bCBpZiBNQ19DTURfU0VUX0VWUV9UTVIgaXMgaW1wbGVtZW50ZWQuCisgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9FVlFfVE1SX1BST1BFUlRJRVNfT1VUX01DRElfVE1SX1NURVBfTlNfT0ZTVCAyMAorLyogRm9yIHRpbWVycyB1cGRhdGVkIHVzaW5nIHRoZSBidWczNTM4OCB3b3JrYXJvdW5kLCB0aGlzIGlzIHRoZSB0aW1lIGludGVydmFsCisgKiAoaW4gbmFub3NlY29uZHMpIGZvciBlYWNoIGluY3JlbWVudCBvZiB0aGUgdGltZXIgbG9hZC9yZWxvYWQgY291bnQuIFRoZQorICogcmVxdWVzdGVkIGR1cmF0aW9uIG9mIGEgdGltZXIgaXMgdGhpcyB2YWx1ZSBtdWx0aXBsaWVkIGJ5IHRoZSB0aW1lcgorICogbG9hZC9yZWxvYWQgY291bnQuIFRoaXMgZmllbGQgaXMgb25seSBtZWFuaW5nZnVsIGlmIHRoZSBidWczNTM4OCB3b3JrYXJvdW5kCisgKiBpcyBlbmFibGVkLgorICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfRVZRX1RNUl9QUk9QRVJUSUVTX09VVF9CVUczNTM4OF9UTVJfTlNfUEVSX0NPVU5UX09GU1QgMjQKKy8qIEZvciB0aW1lcnMgdXBkYXRlZCB1c2luZyB0aGUgYnVnMzUzODggd29ya2Fyb3VuZCwgdGhpcyBpcyB0aGUgbWF4aW11bSB2YWx1ZQorICogYWxsb3dlZCBmb3IgdGltZXIgbG9hZC9yZWxvYWQgY291bnRzLiBUaGlzIGZpZWxkIGlzIG9ubHkgbWVhbmluZ2Z1bCBpZiB0aGUKKyAqIGJ1ZzM1Mzg4IHdvcmthcm91bmQgaXMgZW5hYmxlZC4KKyAqLworI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0VWUV9UTVJfUFJPUEVSVElFU19PVVRfQlVHMzUzODhfVE1SX01BWF9DT1VOVF9PRlNUIDI4CisvKiBGb3IgdGltZXJzIHVwZGF0ZWQgdXNpbmcgdGhlIGJ1ZzM1Mzg4IHdvcmthcm91bmQsIHRpbWVyIGxvYWQvcmVsb2FkIGNvdW50cworICogbm90IGEgbXVsdGlwbGUgb2YgdGhpcyBzdGVwIHNpemUgd2lsbCBiZSByb3VuZGVkIGluIGFuIGltcGxlbWVudGF0aW9uCisgKiBkZWZpbmVkIG1hbm5lci4gVGhpcyBmaWVsZCBpcyBvbmx5IG1lYW5pbmdmdWwgaWYgdGhlIGJ1ZzM1Mzg4IHdvcmthcm91bmQgaXMKKyAqIGVuYWJsZWQuCisgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9FVlFfVE1SX1BST1BFUlRJRVNfT1VUX0JVRzM1Mzg4X1RNUl9TVEVQX09GU1QgMzIKIAogI2VuZGlmIC8qIE1DRElfUENPTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvbmV0X2RyaXZlci5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL25ldF9kcml2ZXIuaAppbmRleCA5ZmYwNjJhLi45OWQ4YzgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvbmV0X2RyaXZlci5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9uZXRfZHJpdmVyLmgKQEAgLTc2LDYgKzc2LDkgQEAKIC8qIE1heGltdW0gcG9zc2libGUgTVRVIHRoZSBkcml2ZXIgc3VwcG9ydHMgKi8KICNkZWZpbmUgRUZYX01BWF9NVFUgKDkgKiAxMDI0KQogCisvKiBNaW5pbXVtIE1UVSwgZnJvbSBSRkM3OTEgKElQKSAqLworI2RlZmluZSBFRlhfTUlOX01UVSA2OAorCiAvKiBTaXplIG9mIGFuIFJYIHNjYXR0ZXIgYnVmZmVyLiAgU21hbGwgZW5vdWdoIHRvIHBhY2sgMiBpbnRvIGEgNEsgcGFnZSwKICAqIGFuZCBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiB0aGUgY2FjaGUgbGluZSBzaXplLgogICovCkBAIC0zOTIsNyArMzk1LDcgQEAKICAqIEBldmVudHFfaW5pdDogRXZlbnQgcXVldWUgaW5pdGlhbGlzZWQgZmxhZwogICogQGVuYWJsZWQ6IENoYW5uZWwgZW5hYmxlZCBpbmRpY2F0b3IKICAqIEBpcnE6IElSUSBudW1iZXIgKE1TSSBhbmQgTVNJLVggb25seSkKLSAqIEBpcnFfbW9kZXJhdGlvbjogSVJRIG1vZGVyYXRpb24gdmFsdWUgKGluIGhhcmR3YXJlIHRpY2tzKQorICogQGlycV9tb2RlcmF0aW9uX3VzOiBJUlEgbW9kZXJhdGlvbiB2YWx1ZSAoaW4gbWljcm9zZWNvbmRzKQogICogQG5hcGlfZGV2OiBOZXQgZGV2aWNlIHVzZWQgd2l0aCBOQVBJCiAgKiBAbmFwaV9zdHI6IE5BUEkgY29udHJvbCBzdHJ1Y3R1cmUKICAqIEBzdGF0ZTogc3RhdGUgZm9yIE5BUEkgdnMgYnVzeSBwb2xsaW5nCkBAIC00MzMsNyArNDM2LDcgQEAKIAlib29sIGV2ZW50cV9pbml0OwogCWJvb2wgZW5hYmxlZDsKIAlpbnQgaXJxOwotCXVuc2lnbmVkIGludCBpcnFfbW9kZXJhdGlvbjsKKwl1bnNpZ25lZCBpbnQgaXJxX21vZGVyYXRpb25fdXM7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5hcGlfZGV2OwogCXN0cnVjdCBuYXBpX3N0cnVjdCBuYXBpX3N0cjsKICNpZmRlZiBDT05GSUdfTkVUX1JYX0JVU1lfUE9MTApAQCAtODEwLDggKzgxMywxMCBAQAogICogQG1lbWJhc2U6IE1lbW9yeSBCQVIgdmFsdWUKICAqIEBpbnRlcnJ1cHRfbW9kZTogSW50ZXJydXB0IG1vZGUKICAqIEB0aW1lcl9xdWFudHVtX25zOiBJbnRlcnJ1cHQgdGltZXIgcXVhbnR1bSwgaW4gbmFub3NlY29uZHMKKyAqIEB0aW1lcl9tYXhfbnM6IEludGVycnVwdCB0aW1lciBtYXhpbXVtIHZhbHVlLCBpbiBuYW5vc2Vjb25kcwogICogQGlycV9yeF9hZGFwdGl2ZTogQWRhcHRpdmUgSVJRIG1vZGVyYXRpb24gZW5hYmxlZCBmb3IgUlggZXZlbnQgcXVldWVzCi0gKiBAaXJxX3J4X21vZGVyYXRpb246IElSUSBtb2RlcmF0aW9uIHRpbWUgZm9yIFJYIGV2ZW50IHF1ZXVlcworICogQGlycV9yeF9tb2Rfc3RlcF91czogU3RlcCBzaXplIGZvciBJUlEgbW9kZXJhdGlvbiBmb3IgUlggZXZlbnQgcXVldWVzCisgKiBAaXJxX3J4X21vZGVyYXRpb25fdXM6IElSUSBtb2RlcmF0aW9uIHRpbWUgZm9yIFJYIGV2ZW50IHF1ZXVlcwogICogQG1zZ19lbmFibGU6IExvZyBtZXNzYWdlIGVuYWJsZSBmbGFncwogICogQHN0YXRlOiBEZXZpY2Ugc3RhdGUgbnVtYmVyICglU1RBVEVfKikuIFNlcmlhbGlzZWQgYnkgdGhlIHJ0bmxfbG9jay4KICAqIEByZXNldF9wZW5kaW5nOiBCaXRtYXNrIGZvciBwZW5kaW5nIHJlc2V0cwpAQCAtOTQwLDggKzk0NSwxMCBAQAogCiAJZW51bSBlZnhfaW50X21vZGUgaW50ZXJydXB0X21vZGU7CiAJdW5zaWduZWQgaW50IHRpbWVyX3F1YW50dW1fbnM7CisJdW5zaWduZWQgaW50IHRpbWVyX21heF9uczsKIAlib29sIGlycV9yeF9hZGFwdGl2ZTsKLQl1bnNpZ25lZCBpbnQgaXJxX3J4X21vZGVyYXRpb247CisJdW5zaWduZWQgaW50IGlycV9tb2Rfc3RlcF91czsKKwl1bnNpZ25lZCBpbnQgaXJxX3J4X21vZGVyYXRpb25fdXM7CiAJdTMyIG1zZ19lbmFibGU7CiAKIAllbnVtIG5pY19zdGF0ZSBzdGF0ZTsKQEAgLTEyNzEsNyArMTI3OCw3IEBACiAJaW50ICgqbWNkaV9wb2xsX3JlYm9vdCkoc3RydWN0IGVmeF9uaWMgKmVmeCk7CiAJdm9pZCAoKm1jZGlfcmVib290X2RldGVjdGVkKShzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKIAl2b2lkICgqaXJxX2VuYWJsZV9tYXN0ZXIpKHN0cnVjdCBlZnhfbmljICplZngpOwotCXZvaWQgKCppcnFfdGVzdF9nZW5lcmF0ZSkoc3RydWN0IGVmeF9uaWMgKmVmeCk7CisJaW50ICgqaXJxX3Rlc3RfZ2VuZXJhdGUpKHN0cnVjdCBlZnhfbmljICplZngpOwogCXZvaWQgKCppcnFfZGlzYWJsZV9ub25fZXYpKHN0cnVjdCBlZnhfbmljICplZngpOwogCWlycXJldHVybl90ICgqaXJxX2hhbmRsZV9tc2kpKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CiAJaXJxcmV0dXJuX3QgKCppcnFfaGFuZGxlX2xlZ2FjeSkoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9uaWMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9uaWMuYwppbmRleCA4OWI4M2U1Li5hYTE5NDVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvbmljLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL25pYy5jCkBAIC02NiwxMSArNjYsMTEgQEAKIAljaGFubmVsLT5lZngtPnR5cGUtPmV2X3Rlc3RfZ2VuZXJhdGUoY2hhbm5lbCk7CiB9CiAKLXZvaWQgZWZ4X25pY19pcnFfdGVzdF9zdGFydChzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQoraW50IGVmeF9uaWNfaXJxX3Rlc3Rfc3RhcnQoc3RydWN0IGVmeF9uaWMgKmVmeCkKIHsKIAllZngtPmxhc3RfaXJxX2NwdSA9IC0xOwogCXNtcF93bWIoKTsKLQllZngtPnR5cGUtPmlycV90ZXN0X2dlbmVyYXRlKGVmeCk7CisJcmV0dXJuIGVmeC0+dHlwZS0+aXJxX3Rlc3RfZ2VuZXJhdGUoZWZ4KTsKIH0KIAogLyogSG9vayBpbnRlcnJ1cHQgaGFuZGxlcihzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL25pYy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL25pYy5oCmluZGV4IDk2OTQ0YzMuLjczYmVlN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9uaWMuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvbmljLmgKQEAgLTUwNywxMCArNTA3LDEzIEBACiAgKiBAc3RhdHM6IEhhcmR3YXJlIHN0YXRpc3RpY3MKICAqIEB3b3JrYXJvdW5kXzM1Mzg4OiBGbGFnOiBmaXJtd2FyZSBzdXBwb3J0cyB3b3JrYXJvdW5kIGZvciBidWcgMzUzODgKICAqIEB3b3JrYXJvdW5kXzI2ODA3OiBGbGFnOiBmaXJtd2FyZSBzdXBwb3J0cyB3b3JrYXJvdW5kIGZvciBidWcgMjY4MDcKKyAqIEB3b3JrYXJvdW5kXzYxMjY1OiBGbGFnOiBmaXJtd2FyZSBzdXBwb3J0cyB3b3JrYXJvdW5kIGZvciBidWcgNjEyNjUKICAqIEBtdXN0X2NoZWNrX2RhdGFwYXRoX2NhcHM6IEZsYWc6IEBkYXRhcGF0aF9jYXBzIG5lZWRzIHRvIGJlIHJldmFsaWRhdGVkCiAgKglhZnRlciBNQyByZWJvb3QKICAqIEBkYXRhcGF0aF9jYXBzOiBDYXBhYmlsaXRpZXMgb2YgZGF0YXBhdGggZmlybXdhcmUgKEZMQUdTMSBmaWVsZCBvZgogICoJJU1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTIHJlc3BvbnNlKQorICogQGRhdGFwYXRoX2NhcHMyOiBGdXJ0aGVyIENhcGFiaWxpdGllcyBvZiBkYXRhcGF0aCBmaXJtd2FyZSAoRkxBR1MyIGZpZWxkIG9mCisgKiAlTUNfQ01EX0dFVF9DQVBBQklMSVRJRVMgcmVzcG9uc2UpCiAgKiBAcnhfZHBjcHVfZndfaWQ6IEZpcm13YXJlIElEIG9mIHRoZSBSeERQQ1BVCiAgKiBAdHhfZHBjcHVfZndfaWQ6IEZpcm13YXJlIElEIG9mIHRoZSBUeERQQ1BVCiAgKiBAdnBvcnRfaWQ6IFRoZSBmdW5jdGlvbidzIHZwb3J0IElELCBvbmx5IHJlbGV2YW50IGZvciBQRnMKQEAgLTU0MCw4ICs1NDMsMTAgQEAKIAl1NjQgc3RhdHNbRUYxMF9TVEFUX0NPVU5UXTsKIAlib29sIHdvcmthcm91bmRfMzUzODg7CiAJYm9vbCB3b3JrYXJvdW5kXzI2ODA3OworCWJvb2wgd29ya2Fyb3VuZF82MTI2NTsKIAlib29sIG11c3RfY2hlY2tfZGF0YXBhdGhfY2FwczsKIAl1MzIgZGF0YXBhdGhfY2FwczsKKwl1MzIgZGF0YXBhdGhfY2FwczI7CiAJdW5zaWduZWQgaW50IHJ4X2RwY3B1X2Z3X2lkOwogCXVuc2lnbmVkIGludCB0eF9kcGNwdV9md19pZDsKIAl1bnNpZ25lZCBpbnQgdnBvcnRfaWQ7CkBAIC03NDEsMTIgKzc0NiwxMiBAQAogCiAvKiBJbnRlcnJ1cHRzICovCiBpbnQgZWZ4X25pY19pbml0X2ludGVycnVwdChzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKLXZvaWQgZWZ4X25pY19pcnFfdGVzdF9zdGFydChzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKK2ludCBlZnhfbmljX2lycV90ZXN0X3N0YXJ0KHN0cnVjdCBlZnhfbmljICplZngpOwogdm9pZCBlZnhfbmljX2ZpbmlfaW50ZXJydXB0KHN0cnVjdCBlZnhfbmljICplZngpOwogCiAvKiBGYWxjb24vU2llbmEgaW50ZXJydXB0cyAqLwogdm9pZCBlZnhfZmFyY2hfaXJxX2VuYWJsZV9tYXN0ZXIoc3RydWN0IGVmeF9uaWMgKmVmeCk7Ci12b2lkIGVmeF9mYXJjaF9pcnFfdGVzdF9nZW5lcmF0ZShzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKK2ludCBlZnhfZmFyY2hfaXJxX3Rlc3RfZ2VuZXJhdGUoc3RydWN0IGVmeF9uaWMgKmVmeCk7CiB2b2lkIGVmeF9mYXJjaF9pcnFfZGlzYWJsZV9tYXN0ZXIoc3RydWN0IGVmeF9uaWMgKmVmeCk7CiBpcnFyZXR1cm5fdCBlZnhfZmFyY2hfbXNpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogaXJxcmV0dXJuX3QgZWZ4X2ZhcmNoX2xlZ2FjeV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9wdHAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9wdHAuYwppbmRleCBjNzcxZTBhLi43N2E1MzY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvcHRwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3B0cC5jCkBAIC0xMjY5LDEzICsxMjY5LDEzIEBACiAJCWlmIChJU19FUlIocHRwLT5waGNfY2xvY2spKSB7CiAJCQlyYyA9IFBUUl9FUlIocHRwLT5waGNfY2xvY2spOwogCQkJZ290byBmYWlsMzsKLQkJfQotCi0JCUlOSVRfV09SSygmcHRwLT5wcHNfd29yaywgZWZ4X3B0cF9wcHNfd29ya2VyKTsKLQkJcHRwLT5wcHNfd29ya3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoInNmY19wcHMiKTsKLQkJaWYgKCFwdHAtPnBwc193b3Jrd3EpIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gZmFpbDQ7CisJCX0gZWxzZSBpZiAocHRwLT5waGNfY2xvY2spIHsKKwkJCUlOSVRfV09SSygmcHRwLT5wcHNfd29yaywgZWZ4X3B0cF9wcHNfd29ya2VyKTsKKwkJCXB0cC0+cHBzX3dvcmt3cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJzZmNfcHBzIik7CisJCQlpZiAoIXB0cC0+cHBzX3dvcmt3cSkgeworCQkJCXJjID0gLUVOT01FTTsKKwkJCQlnb3RvIGZhaWw0OworCQkJfQogCQl9CiAJfQogCXB0cC0+bmljX3RzX2VuYWJsZWQgPSBmYWxzZTsKQEAgLTEzMDYsNyArMTMwNiw3IEBACiB7CiAJc3RydWN0IGVmeF9uaWMgKmVmeCA9IGNoYW5uZWwtPmVmeDsKIAotCWNoYW5uZWwtPmlycV9tb2RlcmF0aW9uID0gMDsKKwljaGFubmVsLT5pcnFfbW9kZXJhdGlvbl91cyA9IDA7CiAJY2hhbm5lbC0+cnhfcXVldWUuY29yZV9pbmRleCA9IDA7CiAKIAlyZXR1cm4gZWZ4X3B0cF9wcm9iZShlZngsIGNoYW5uZWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3NlbGZ0ZXN0LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc2VsZnRlc3QuYwppbmRleCA5ZDc4ODMwLi5jZDM4YjQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc2VsZnRlc3QuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc2VsZnRlc3QuYwpAQCAtMTM1LDExICsxMzUsMTkgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQsIHdhaXQ7CiAJaW50IGNwdTsKKwlpbnQgcmM7CiAKIAluZXRpZl9kYmcoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwgInRlc3RpbmcgaW50ZXJydXB0c1xuIik7CiAJdGVzdHMtPmludGVycnVwdCA9IC0xOwogCi0JZWZ4X25pY19pcnFfdGVzdF9zdGFydChlZngpOworCXJjID0gZWZ4X25pY19pcnFfdGVzdF9zdGFydChlZngpOworCWlmIChyYyA9PSAtRU5PVFNVUFApIHsKKwkJbmV0aWZfZGJnKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsCisJCQkgICJkaXJlY3QgaW50ZXJydXB0IHRlc3Rpbmcgbm90IHN1cHBvcnRlZFxuIik7CisJCXRlc3RzLT5pbnRlcnJ1cHQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKIAl0aW1lb3V0ID0gamlmZmllcyArIElSUV9USU1FT1VUOwogCXdhaXQgPSAxOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc2VsZnRlc3QuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9zZWxmdGVzdC5oCmluZGV4IDAwOWRiZTguLjMyYTQyNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9zZWxmdGVzdC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9zZWxmdGVzdC5oCkBAIC0yOCw3ICsyOCw3IEBACiAKIC8qIEVmeCBzZWxmIHRlc3QgcmVzdWx0cwogICogRm9yIGZpZWxkcyB3aGljaCBhcmUgbm90IGNvdW50ZXJzLCAxIGluZGljYXRlcyBzdWNjZXNzIGFuZCAtMQotICogaW5kaWNhdGVzIGZhaWx1cmUuCisgKiBpbmRpY2F0ZXMgZmFpbHVyZTsgMCBpbmRpY2F0ZXMgdGVzdCBjb3VsZCBub3QgYmUgcnVuLgogICovCiBzdHJ1Y3QgZWZ4X3NlbGZfdGVzdHMgewogCS8qIG9ubGluZSB0ZXN0cyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3NpZW5hLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc2llbmEuYwppbmRleCAyMjE5YjU0Li4wNGVkMWI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc2llbmEuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc2llbmEuYwpAQCAtMzQsMTkgKzM0LDI0IEBACiAKIHN0YXRpYyB2b2lkIHNpZW5hX3B1c2hfaXJxX21vZGVyYXRpb24oc3RydWN0IGVmeF9jaGFubmVsICpjaGFubmVsKQogeworCXN0cnVjdCBlZnhfbmljICplZnggPSBjaGFubmVsLT5lZng7CiAJZWZ4X2R3b3JkX3QgdGltZXJfY21kOwogCi0JaWYgKGNoYW5uZWwtPmlycV9tb2RlcmF0aW9uKQorCWlmIChjaGFubmVsLT5pcnFfbW9kZXJhdGlvbl91cykgeworCQl1bnNpZ25lZCBpbnQgdGlja3M7CisKKwkJdGlja3MgPSBlZnhfdXNlY3NfdG9fdGlja3MoZWZ4LCBjaGFubmVsLT5pcnFfbW9kZXJhdGlvbl91cyk7CiAJCUVGWF9QT1BVTEFURV9EV09SRF8yKHRpbWVyX2NtZCwKIAkJCQkgICAgIEZSRl9DWl9UQ19USU1FUl9NT0RFLAogCQkJCSAgICAgRkZFX0NaX1RJTUVSX01PREVfSU5UX0hMRE9GRiwKIAkJCQkgICAgIEZSRl9DWl9UQ19USU1FUl9WQUwsCi0JCQkJICAgICBjaGFubmVsLT5pcnFfbW9kZXJhdGlvbiAtIDEpOwotCWVsc2UKKwkJCQkgICAgIHRpY2tzIC0gMSk7CisJfSBlbHNlIHsKIAkJRUZYX1BPUFVMQVRFX0RXT1JEXzIodGltZXJfY21kLAogCQkJCSAgICAgRlJGX0NaX1RDX1RJTUVSX01PREUsCiAJCQkJICAgICBGRkVfQ1pfVElNRVJfTU9ERV9ESVMsCiAJCQkJICAgICBGUkZfQ1pfVENfVElNRVJfVkFMLCAwKTsKKwl9CiAJZWZ4X3dyaXRlZF9wYWdlX2xvY2tlZChjaGFubmVsLT5lZngsICZ0aW1lcl9jbWQsIEZSX0JaX1RJTUVSX0NPTU1BTkRfUDAsCiAJCQkgICAgICAgY2hhbm5lbC0+Y2hhbm5lbCk7CiB9CkBAIC0yMjIsNiArMjI3LDkgQEAKIAllZngtPnRpbWVyX3F1YW50dW1fbnMgPQogCQkoY2FwcyAmICgxIDw8IE1DX0NNRF9DQVBBQklMSVRJRVNfVFVSQk9fQUNUSVZFX0xCTikpID8KIAkJMzA3MiA6IDYxNDQ7IC8qIDc2OCBjeWNsZXMgKi8KKwllZngtPnRpbWVyX21heF9ucyA9IGVmeC0+dHlwZS0+dGltZXJfcGVyaW9kX21heCAqCisJCQkgICAgZWZ4LT50aW1lcl9xdWFudHVtX25zOworCiAJcmV0dXJuIHJjOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc3Jpb3YuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9zcmlvdi5jCmluZGV4IDgxNmM0NDYuLjlhYmNmNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9zcmlvdi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9zcmlvdi5jCkBAIC0yMiw3ICsyMiw3IEBACiB9CiAKIGludCBlZnhfc3Jpb3Zfc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIGludCB2Zl9pLCB1MTYgdmxhbiwKLQkJCSAgdTggcW9zKQorCQkJICB1OCBxb3MsIF9fYmUxNiB2bGFuX3Byb3RvKQogewogCXN0cnVjdCBlZnhfbmljICplZnggPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKIApAQCAtMzEsNiArMzEsOSBAQAogCQkgICAgKHFvcyAmIH4oVkxBTl9QUklPX01BU0sgPj4gVkxBTl9QUklPX1NISUZUKSkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAorCQlpZiAodmxhbl9wcm90byAhPSBodG9ucyhFVEhfUF84MDIxUSkpCisJCQlyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKKwogCQlyZXR1cm4gZWZ4LT50eXBlLT5zcmlvdl9zZXRfdmZfdmxhbihlZngsIHZmX2ksIHZsYW4sIHFvcyk7CiAJfSBlbHNlIHsKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3NyaW92LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc3Jpb3YuaAppbmRleCA0MDBkZjUyLi5iYTE3NjJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc3Jpb3YuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc3Jpb3YuaApAQCAtMTYsNyArMTYsNyBAQAogCiBpbnQgZWZ4X3NyaW92X3NldF92Zl9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIGludCB2Zl9pLCB1OCAqbWFjKTsKIGludCBlZnhfc3Jpb3Zfc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIGludCB2Zl9pLCB1MTYgdmxhbiwKLQkJCSAgdTggcW9zKTsKKwkJCSAgdTggcW9zLCBfX2JlMTYgdmxhbl9wcm90byk7CiBpbnQgZWZ4X3NyaW92X3NldF92Zl9zcG9vZmNoayhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgaW50IHZmX2ksCiAJCQkgICAgICBib29sIHNwb29mY2hrKTsKIGludCBlZnhfc3Jpb3ZfZ2V0X3ZmX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwgaW50IHZmX2ksCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvd29ya2Fyb3VuZHMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy93b3JrYXJvdW5kcy5oCmluZGV4IDIzMTBiNzUuLjM1MWNkMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy93b3JrYXJvdW5kcy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy93b3JrYXJvdW5kcy5oCkBAIC01MCw0ICs1MCw4IEBACiAjZGVmaW5lIEVGWF9XT1JLQVJPVU5EXzM1Mzg4KGVmeCkJCQkJCVwKIAkoZWZ4X25pY19yZXYoZWZ4KSA9PSBFRlhfUkVWX0hVTlRfQTAgJiYgRUZYX0VGMTBfV09SS0FST1VORF8zNTM4OChlZngpKQogCisvKiBNb2RlcmF0aW9uIHRpbWVyIGFjY2VzcyBtdXN0IGdvIHRocm91Z2ggTUNESSAqLworI2RlZmluZSBFRlhfRUYxMF9XT1JLQVJPVU5EXzYxMjY1KGVmeCkJCQkJCVwKKwkoKChzdHJ1Y3QgZWZ4X2VmMTBfbmljX2RhdGEgKillZngtPm5pY19kYXRhKS0+d29ya2Fyb3VuZF82MTI2NSkKKwogI2VuZGlmIC8qIEVGWF9XT1JLQVJPVU5EU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zaXMvc2lzOTAwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zaXMvc2lzOTAwLmMKaW5kZXggOTUwMDFlZTQuLjZmODUyNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Npcy9zaXM5MDAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zaXMvc2lzOTAwLmMKQEAgLTE0MjYsNyArMTQyNiw3IEBACiAJCXJ4X2ZsYWdzIHw9IFJ4QVRYOwogCX0KIAotI2lmIGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1ZMQU5fODAyMVEpCiAJLyogQ2FuIGFjY2VwdCBKdW1ibyBwYWNrZXQgKi8KIAlyeF9mbGFncyB8PSBSeEFKQUI7CiAjZW5kaWYKQEAgLTE3NTAsNyArMTc1MCw3IEBACiAJCWRhdGFfc2l6ZSA9IHJ4X3N0YXR1cyAmIERTSVpFOwogCQlyeF9zaXplID0gZGF0YV9zaXplIC0gQ1JDX1NJWkU7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19WTEFOXzgwMjFRKQogCQkvKiBgYFRPT0xPTkcnJyBmbGFnIG1lYW5zIGp1bWJvIHBhY2tldCByZWNlaXZlZC4gKi8KIAkJaWYgKChyeF9zdGF0dXMgJiBUT09MT05HKSAmJiBkYXRhX3NpemUgPD0gTUFYX0ZSQU1FX1NJWkUpCiAJCQlyeF9zdGF0dXMgJj0gKH4gKCh1bnNpZ25lZCBpbnQpVE9PTE9ORykpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2lzL3NpczkwMC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2lzL3NpczkwMC5oCmluZGV4IDdkNDMwZDMuLmYwZGEzZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Npcy9zaXM5MDAuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zaXMvc2lzOTAwLmgKQEAgLTMxMCw3ICszMTAsNyBAQAogI2RlZmluZSBDUkNfU0laRSAgICAgICAgICAgICAgICA0CiAjZGVmaW5lIE1BQ19IRUFERVJfU0laRSAgICAgICAgIDE0CiAKLSNpZiBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19WTEFOXzgwMjFRKQogI2RlZmluZSBNQVhfRlJBTUVfU0laRSAgKDE1MTggKyA0KQogI2Vsc2UKICNkZWZpbmUgTUFYX0ZSQU1FX1NJWkUgIDE1MTgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2Mvc21jOTF4LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3NtYzkxeC5jCmluZGV4IDcyNmI4MGYuLjczMjEyNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2Mvc21jOTF4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbWM5MXguYwpAQCAtMjI3NSw2ICsyMjc1LDEzIEBACiAJaWYgKHBkKSB7CiAJCW1lbWNweSgmbHAtPmNmZywgcGQsIHNpemVvZihscC0+Y2ZnKSk7CiAJCWxwLT5pb19zaGlmdCA9IFNNQzkxWF9JT19TSElGVChscC0+Y2ZnLmZsYWdzKTsKKworCQlpZiAoIVNNQ184QklUKGxwKSAmJiAhU01DXzE2QklUKGxwKSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJhdCBsZWFzdCBvbmUgb2YgOC1iaXQgb3IgMTYtYml0IGFjY2VzcyBzdXBwb3J0IGlzIHJlcXVpcmVkLlxuIik7CisJCQlyZXQgPSAtRU5YSU87CisJCQlnb3RvIG91dF9mcmVlX25ldGRldjsKKwkJfQogCX0KIAogI2lmIElTX0JVSUxUSU4oQ09ORklHX09GKQpAQCAtMjMxNiw2ICsyMzIzLDkgQEAKIAkJfSBlbHNlIHsKIAkJCWxwLT5jZmcuZmxhZ3MgfD0gU01DOTFYX1VTRV8xNkJJVDsKIAkJfQorCQlpZiAoIWRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMigmcGRldi0+ZGV2LCAicmVnLXNoaWZ0IiwKKwkJCQkJICAgICAgJnZhbCkpCisJCQlscC0+aW9fc2hpZnQgPSB2YWw7CiAJfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2Mvc21jOTF4LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3NtYzkxeC5oCmluZGV4IDFhNTVjNzkuLmVhODQ2NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2Mvc21jOTF4LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbWM5MXguaApAQCAtMzcsNiArMzcsMjcgQEAKICNpbmNsdWRlIDxsaW51eC9zbWM5MXguaD4KIAogLyoKKyAqIEFueSAxNi1iaXQgYWNjZXNzIGlzIHBlcmZvcm1lZCB3aXRoIHR3byA4LWJpdCBhY2Nlc3NlcyBpZiB0aGUgaGFyZHdhcmUKKyAqIGNhbid0IGRvIGl0IGRpcmVjdGx5LiBNb3N0IHJlZ2lzdGVycyBhcmUgMTYtYml0IHNvIHRob3NlIGFyZSBtYW5kYXRvcnkuCisgKi8KKyNkZWZpbmUgU01DX291dHdfYih4LCBhLCByKQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCXVuc2lnbmVkIGludCBfX3ZhbDE2ID0gKHgpOwkJCQlcCisJCXVuc2lnbmVkIGludCBfX3JlZyA9IChyKTsJCQkJXAorCQlTTUNfb3V0YihfX3ZhbDE2LCBhLCBfX3JlZyk7CQkJCVwKKwkJU01DX291dGIoX192YWwxNiA+PiA4LCBhLCBfX3JlZyArICgxIDw8IFNNQ19JT19TSElGVCkpOwlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBTTUNfaW53X2IoYSwgcikJCQkJCQkJXAorCSh7CQkJCQkJCQlcCisJCXVuc2lnbmVkIGludCBfX3ZhbDE2OwkJCQkJXAorCQl1bnNpZ25lZCBpbnQgX19yZWcgPSByOwkJCQkJXAorCQlfX3ZhbDE2ICA9IFNNQ19pbmIoYSwgX19yZWcpOwkJCQlcCisJCV9fdmFsMTYgfD0gU01DX2luYihhLCBfX3JlZyArICgxIDw8IFNNQ19JT19TSElGVCkpIDw8IDg7IFwKKwkJX192YWwxNjsJCQkJCQlcCisJfSkKKworLyoKICAqIERlZmluZSB5b3VyIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBidXMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGhlcmUuCiAgKi8KIApAQCAtNTUsMTAgKzc2LDMwIEBACiAjZGVmaW5lIFNNQ19JT19TSElGVAkJKGxwLT5pb19zaGlmdCkKIAogI2RlZmluZSBTTUNfaW5iKGEsIHIpCQlyZWFkYigoYSkgKyAocikpCi0jZGVmaW5lIFNNQ19pbncoYSwgcikJCXJlYWR3KChhKSArIChyKSkKKyNkZWZpbmUgU01DX2ludyhhLCByKQkJCQkJCQlcCisJKHsJCQkJCQkJCVwKKwkJdW5zaWduZWQgaW50IF9fc21jX3IgPSByOwkJCQlcCisJCVNNQ18xNkJJVChscCkgPyByZWFkdygoYSkgKyBfX3NtY19yKSA6CQkJXAorCQlTTUNfOEJJVChscCkgPyBTTUNfaW53X2IoYSwgX19zbWNfcikgOgkJCVwKKwkJKHsgQlVHKCk7IDA7IH0pOwkJCQkJXAorCX0pCisKICNkZWZpbmUgU01DX2lubChhLCByKQkJcmVhZGwoKGEpICsgKHIpKQogI2RlZmluZSBTTUNfb3V0Yih2LCBhLCByKQl3cml0ZWIodiwgKGEpICsgKHIpKQorI2RlZmluZSBTTUNfb3V0dyh2LCBhLCByKQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCXVuc2lnbmVkIGludCBfX3YgPSB2LCBfX3NtY19yID0gcjsJCQlcCisJCWlmIChTTUNfMTZCSVQobHApKQkJCQkJXAorCQkJX19TTUNfb3V0dyhfX3YsIGEsIF9fc21jX3IpOwkJCVwKKwkJZWxzZSBpZiAoU01DXzhCSVQobHApKQkJCQkJXAorCQkJU01DX291dHdfYihfX3YsIGEsIF9fc21jX3IpOwkJCVwKKwkJZWxzZQkJCQkJCQlcCisJCQlCVUcoKTsJCQkJCQlcCisJfSB3aGlsZSAoMCkKKwogI2RlZmluZSBTTUNfb3V0bCh2LCBhLCByKQl3cml0ZWwodiwgKGEpICsgKHIpKQorI2RlZmluZSBTTUNfaW5zYihhLCByLCBwLCBsKQlyZWFkc2IoKGEpICsgKHIpLCBwLCBsKQorI2RlZmluZSBTTUNfb3V0c2IoYSwgciwgcCwgbCkJd3JpdGVzYigoYSkgKyAociksIHAsIGwpCiAjZGVmaW5lIFNNQ19pbnN3KGEsIHIsIHAsIGwpCXJlYWRzdygoYSkgKyAociksIHAsIGwpCiAjZGVmaW5lIFNNQ19vdXRzdyhhLCByLCBwLCBsKQl3cml0ZXN3KChhKSArIChyKSwgcCwgbCkKICNkZWZpbmUgU01DX2luc2woYSwgciwgcCwgbCkJcmVhZHNsKChhKSArIChyKSwgcCwgbCkKQEAgLTY2LDcgKzEwNyw3IEBACiAjZGVmaW5lIFNNQ19JUlFfRkxBR1MJCSgtMSkJLyogZnJvbSByZXNvdXJjZSAqLwogCiAvKiBXZSBhY3R1YWxseSBjYW4ndCB3cml0ZSBoYWxmd29yZHMgcHJvcGVybHkgaWYgbm90IHdvcmQgYWxpZ25lZCAqLwotc3RhdGljIGlubGluZSB2b2lkIFNNQ19vdXR3KHUxNiB2YWwsIHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgcmVnKQorc3RhdGljIGlubGluZSB2b2lkIF9fU01DX291dHcodTE2IHZhbCwgdm9pZCBfX2lvbWVtICppb2FkZHIsIGludCByZWcpCiB7CiAJaWYgKChtYWNoaW5lX2lzX21haW5zdG9uZSgpIHx8IG1hY2hpbmVfaXNfc3RhcmdhdGUyKCkgfHwKIAkgICAgIG1hY2hpbmVfaXNfcHhhX2lkcCgpKSAmJiByZWcgJiAyKSB7CkBAIC00MTYsMjQgKzQ1Nyw4IEBACiAKICNpZiAhIFNNQ19DQU5fVVNFXzE2QklUCiAKLS8qCi0gKiBBbnkgMTYtYml0IGFjY2VzcyBpcyBwZXJmb3JtZWQgd2l0aCB0d28gOC1iaXQgYWNjZXNzZXMgaWYgdGhlIGhhcmR3YXJlCi0gKiBjYW4ndCBkbyBpdCBkaXJlY3RseS4gTW9zdCByZWdpc3RlcnMgYXJlIDE2LWJpdCBzbyB0aG9zZSBhcmUgbWFuZGF0b3J5LgotICovCi0jZGVmaW5lIFNNQ19vdXR3KHgsIGlvYWRkciwgcmVnKQkJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkJdW5zaWduZWQgaW50IF9fdmFsMTYgPSAoeCk7CQkJCVwKLQkJU01DX291dGIoIF9fdmFsMTYsIGlvYWRkciwgcmVnICk7CQkJXAotCQlTTUNfb3V0YiggX192YWwxNiA+PiA4LCBpb2FkZHIsIHJlZyArICgxIDw8IFNNQ19JT19TSElGVCkpO1wKLQl9IHdoaWxlICgwKQotI2RlZmluZSBTTUNfaW53KGlvYWRkciwgcmVnKQkJCQkJCVwKLQkoewkJCQkJCQkJXAotCQl1bnNpZ25lZCBpbnQgX192YWwxNjsJCQkJCVwKLQkJX192YWwxNiA9ICBTTUNfaW5iKCBpb2FkZHIsIHJlZyApOwkJCVwKLQkJX192YWwxNiB8PSBTTUNfaW5iKCBpb2FkZHIsIHJlZyArICgxIDw8IFNNQ19JT19TSElGVCkpIDw8IDg7IFwKLQkJX192YWwxNjsJCQkJCQlcCi0JfSkKLQorI2RlZmluZSBTTUNfb3V0dyh4LCBpb2FkZHIsIHJlZykJU01DX291dHdfYih4LCBpb2FkZHIsIHJlZykKKyNkZWZpbmUgU01DX2ludyhpb2FkZHIsIHJlZykJCVNNQ19pbndfYihpb2FkZHIsIHJlZykKICNkZWZpbmUgU01DX2luc3coYSwgciwgcCwgbCkJCUJVRygpCiAjZGVmaW5lIFNNQ19vdXRzdyhhLCByLCBwLCBsKQkJQlVHKCkKIApAQCAtNDQ1LDcgKzQ3MCw5IEBACiAjZW5kaWYKIAogI2lmICEgU01DX0NBTl9VU0VfOEJJVAorI3VuZGVmIFNNQ19pbmIKICNkZWZpbmUgU01DX2luYihpb2FkZHIsIHJlZykJCSh7IEJVRygpOyAwOyB9KQorI3VuZGVmIFNNQ19vdXRiCiAjZGVmaW5lIFNNQ19vdXRiKHgsIGlvYWRkciwgcmVnKQlCVUcoKQogI2RlZmluZSBTTUNfaW5zYihhLCByLCBwLCBsKQkJQlVHKCkKICNkZWZpbmUgU01DX291dHNiKGEsIHIsIHAsIGwpCQlCVUcoKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbXNjOTExeC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbXNjOTExeC5jCmluZGV4IGNhMzEzNDUuLmU5Yjg1NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2Mvc21zYzkxMXguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3Ntc2M5MTF4LmMKQEAgLTYyLDYgKzYyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb3BlcnR5Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9jb25zdW1lci5oPgogCiAjaW5jbHVkZSAic21zYzkxMXguaCIKIApAQCAtMTQ3LDYgKzE0OCw5IEBACiAJLyogcmVndWxhdG9ycyAqLwogCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhIHN1cHBsaWVzW1NNU0M5MTFYX05VTV9TVVBQTElFU107CiAKKwkvKiBSZXNldCBHUElPICovCisJc3RydWN0IGdwaW9fZGVzYyAqcmVzZXRfZ3Bpb2Q7CisKIAkvKiBjbG9jayAqLwogCXN0cnVjdCBjbGsgKmNsazsKIH07CkBAIC00MzgsNiArNDQyLDExIEBACiAJCW5ldGRldl9lcnIobmRldiwgImNvdWxkbid0IGdldCByZWd1bGF0b3JzICVkXG4iLAogCQkJCXJldCk7CiAKKwkvKiBSZXF1ZXN0IG9wdGlvbmFsIFJFU0VUIEdQSU8gKi8KKwlwZGF0YS0+cmVzZXRfZ3Bpb2QgPSBkZXZtX2dwaW9kX2dldF9vcHRpb25hbCgmcGRldi0+ZGV2LAorCQkJCQkJICAgICAicmVzZXQiLAorCQkJCQkJICAgICBHUElPRF9PVVRfTE9XKTsKKwogCS8qIFJlcXVlc3QgY2xvY2sgKi8KIAlwZGF0YS0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKIAlpZiAoSVNfRVJSKHBkYXRhLT5jbGspKQpAQCAtMTA5OSwxNSArMTEwOCw4IEBACiAJCWdvdG8gZXJyX291dF9mcmVlX2J1c18yOwogCX0KIAotCWlmIChzbXNjOTExeF9taWlfcHJvYmUoZGV2KSA8IDApIHsKLQkJU01TQ19XQVJOKHBkYXRhLCBwcm9iZSwgIkVycm9yIHJlZ2lzdGVyaW5nIG1paSBidXMiKTsKLQkJZ290byBlcnJfb3V0X3VucmVnaXN0ZXJfYnVzXzM7Ci0JfQotCiAJcmV0dXJuIDA7CiAKLWVycl9vdXRfdW5yZWdpc3Rlcl9idXNfMzoKLQltZGlvYnVzX3VucmVnaXN0ZXIocGRhdGEtPm1paV9idXMpOwogZXJyX291dF9mcmVlX2J1c18yOgogCW1kaW9idXNfZnJlZShwZGF0YS0+bWlpX2J1cyk7CiBlcnJfb3V0XzE6CkBAIC0xNTE0LDIzICsxNTE2LDkwIEBACiAJc21zYzkxMXhfcmVnX3dyaXRlKHBkYXRhLCBJTlRfU1RTLCAweEZGRkZGRkZGKTsKIH0KIAorc3RhdGljIGlycXJldHVybl90IHNtc2M5MTF4X2lycWhhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IHNtc2M5MTF4X2RhdGEgKnBkYXRhID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgaW50c3RzID0gc21zYzkxMXhfcmVnX3JlYWQocGRhdGEsIElOVF9TVFMpOworCXUzMiBpbnRlbiA9IHNtc2M5MTF4X3JlZ19yZWFkKHBkYXRhLCBJTlRfRU4pOworCWludCBzZXJ2aWNlZCA9IElSUV9OT05FOworCXUzMiB0ZW1wOworCisJaWYgKHVubGlrZWx5KGludHN0cyAmIGludGVuICYgSU5UX1NUU19TV19JTlRfKSkgeworCQl0ZW1wID0gc21zYzkxMXhfcmVnX3JlYWQocGRhdGEsIElOVF9FTik7CisJCXRlbXAgJj0gKH5JTlRfRU5fU1dfSU5UX0VOXyk7CisJCXNtc2M5MTF4X3JlZ193cml0ZShwZGF0YSwgSU5UX0VOLCB0ZW1wKTsKKwkJc21zYzkxMXhfcmVnX3dyaXRlKHBkYXRhLCBJTlRfU1RTLCBJTlRfU1RTX1NXX0lOVF8pOworCQlwZGF0YS0+c29mdHdhcmVfaXJxX3NpZ25hbCA9IDE7CisJCXNtcF93bWIoKTsKKwkJc2VydmljZWQgPSBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAodW5saWtlbHkoaW50c3RzICYgaW50ZW4gJiBJTlRfU1RTX1JYU1RPUF9JTlRfKSkgeworCQkvKiBDYWxsZWQgd2hlbiB0aGVyZSBpcyBhIG11bHRpY2FzdCB1cGRhdGUgc2NoZWR1bGVkIGFuZAorCQkgKiBpdCBpcyBub3cgc2FmZSB0byBjb21wbGV0ZSB0aGUgdXBkYXRlICovCisJCVNNU0NfVFJBQ0UocGRhdGEsIGludHIsICJSWCBTdG9wIGludGVycnVwdCIpOworCQlzbXNjOTExeF9yZWdfd3JpdGUocGRhdGEsIElOVF9TVFMsIElOVF9TVFNfUlhTVE9QX0lOVF8pOworCQlpZiAocGRhdGEtPm11bHRpY2FzdF91cGRhdGVfcGVuZGluZykKKwkJCXNtc2M5MTF4X3J4X211bHRpY2FzdF91cGRhdGVfd29ya2Fyb3VuZChwZGF0YSk7CisJCXNlcnZpY2VkID0gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKGludHN0cyAmIGludGVuICYgSU5UX1NUU19UREZBXykgeworCQl0ZW1wID0gc21zYzkxMXhfcmVnX3JlYWQocGRhdGEsIEZJRk9fSU5UKTsKKwkJdGVtcCB8PSBGSUZPX0lOVF9UWF9BVkFJTF9MRVZFTF87CisJCXNtc2M5MTF4X3JlZ193cml0ZShwZGF0YSwgRklGT19JTlQsIHRlbXApOworCQlzbXNjOTExeF9yZWdfd3JpdGUocGRhdGEsIElOVF9TVFMsIElOVF9TVFNfVERGQV8pOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCXNlcnZpY2VkID0gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKHVubGlrZWx5KGludHN0cyAmIGludGVuICYgSU5UX1NUU19SWEVfKSkgeworCQlTTVNDX1RSQUNFKHBkYXRhLCBpbnRyLCAiUlggRXJyb3IgaW50ZXJydXB0Iik7CisJCXNtc2M5MTF4X3JlZ193cml0ZShwZGF0YSwgSU5UX1NUUywgSU5UX1NUU19SWEVfKTsKKwkJc2VydmljZWQgPSBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAobGlrZWx5KGludHN0cyAmIGludGVuICYgSU5UX1NUU19SU0ZMXykpIHsKKwkJaWYgKGxpa2VseShuYXBpX3NjaGVkdWxlX3ByZXAoJnBkYXRhLT5uYXBpKSkpIHsKKwkJCS8qIERpc2FibGUgUnggaW50ZXJydXB0cyAqLworCQkJdGVtcCA9IHNtc2M5MTF4X3JlZ19yZWFkKHBkYXRhLCBJTlRfRU4pOworCQkJdGVtcCAmPSAofklOVF9FTl9SU0ZMX0VOXyk7CisJCQlzbXNjOTExeF9yZWdfd3JpdGUocGRhdGEsIElOVF9FTiwgdGVtcCk7CisJCQkvKiBTY2hlZHVsZSBhIE5BUEkgcG9sbCAqLworCQkJX19uYXBpX3NjaGVkdWxlKCZwZGF0YS0+bmFwaSk7CisJCX0gZWxzZSB7CisJCQlTTVNDX1dBUk4ocGRhdGEsIHJ4X2VyciwgIm5hcGlfc2NoZWR1bGVfcHJlcCBmYWlsZWQiKTsKKwkJfQorCQlzZXJ2aWNlZCA9IElSUV9IQU5ETEVEOworCX0KKworCXJldHVybiBzZXJ2aWNlZDsKK30KKwogc3RhdGljIGludCBzbXNjOTExeF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHNtc2M5MTF4X2RhdGEgKnBkYXRhID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBpbnQgdGltZW91dDsKIAl1bnNpZ25lZCBpbnQgdGVtcDsKIAl1bnNpZ25lZCBpbnQgaW50Y2ZnOworCWludCByZXR2YWw7CisJaW50IGlycV9mbGFnczsKIAotCS8qIGlmIHRoZSBwaHkgaXMgbm90IHlldCByZWdpc3RlcmVkLCByZXRyeSBsYXRlciovCisJLyogZmluZCBhbmQgc3RhcnQgdGhlIGdpdmVuIHBoeSAqLwogCWlmICghZGV2LT5waHlkZXYpIHsKLQkJU01TQ19XQVJOKHBkYXRhLCBodywgInBoeV9kZXYgaXMgTlVMTCIpOwotCQlyZXR1cm4gLUVBR0FJTjsKKwkJcmV0dmFsID0gc21zYzkxMXhfbWlpX3Byb2JlKGRldik7CisJCWlmIChyZXR2YWwgPCAwKSB7CisJCQlTTVNDX1dBUk4ocGRhdGEsIHByb2JlLCAiRXJyb3Igc3RhcnRpbmcgcGh5Iik7CisJCQlnb3RvIG91dDsKKwkJfQogCX0KIAogCS8qIFJlc2V0IHRoZSBMQU45MTF4ICovCi0JaWYgKHNtc2M5MTF4X3NvZnRfcmVzZXQocGRhdGEpKSB7CisJcmV0dmFsID0gc21zYzkxMXhfc29mdF9yZXNldChwZGF0YSk7CisJaWYgKHJldHZhbCkgewogCQlTTVNDX1dBUk4ocGRhdGEsIGh3LCAic29mdCByZXNldCBmYWlsZWQiKTsKLQkJcmV0dXJuIC1FSU87CisJCWdvdG8gbWlpX2ZyZWVfb3V0OwogCX0KIAogCXNtc2M5MTF4X3JlZ193cml0ZShwZGF0YSwgSFdfQ0ZHLCAweDAwMDUwMDAwKTsKQEAgLTE1ODYsNiArMTY1NSwxNSBAQAogCXBkYXRhLT5zb2Z0d2FyZV9pcnFfc2lnbmFsID0gMDsKIAlzbXBfd21iKCk7CiAKKwlpcnFfZmxhZ3MgPSBpcnFfZ2V0X3RyaWdnZXJfdHlwZShkZXYtPmlycSk7CisJcmV0dmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIHNtc2M5MTF4X2lycWhhbmRsZXIsCisJCQkgICAgIGlycV9mbGFncyB8IElSUUZfU0hBUkVELCBkZXYtPm5hbWUsIGRldik7CisJaWYgKHJldHZhbCkgeworCQlTTVNDX1dBUk4ocGRhdGEsIHByb2JlLAorCQkJICAiVW5hYmxlIHRvIGNsYWltIHJlcXVlc3RlZCBpcnE6ICVkIiwgZGV2LT5pcnEpOworCQlnb3RvIG1paV9mcmVlX291dDsKKwl9CisKIAl0ZW1wID0gc21zYzkxMXhfcmVnX3JlYWQocGRhdGEsIElOVF9FTik7CiAJdGVtcCB8PSBJTlRfRU5fU1dfSU5UX0VOXzsKIAlzbXNjOTExeF9yZWdfd3JpdGUocGRhdGEsIElOVF9FTiwgdGVtcCk7CkBAIC0xNjAwLDcgKzE2NzgsOCBAQAogCWlmICghcGRhdGEtPnNvZnR3YXJlX2lycV9zaWduYWwpIHsKIAkJbmV0ZGV2X3dhcm4oZGV2LCAiSVNSIGZhaWxlZCBzaWduYWxpbmcgdGVzdCAoSVJRICVkKVxuIiwKIAkJCSAgICBkZXYtPmlycSk7Ci0JCXJldHVybiAtRU5PREVWOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGlycV9zdG9wX291dDsKIAl9CiAJU01TQ19UUkFDRShwZGF0YSwgaWZ1cCwgIklSUSBoYW5kbGVyIHBhc3NlZCB0ZXN0IHVzaW5nIElSUSAlZCIsCiAJCSAgIGRldi0+aXJxKTsKQEAgLTE2NDYsNiArMTcyNSwxNCBAQAogCiAJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKIAlyZXR1cm4gMDsKKworaXJxX3N0b3Bfb3V0OgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworbWlpX2ZyZWVfb3V0OgorCXBoeV9kaXNjb25uZWN0KGRldi0+cGh5ZGV2KTsKKwlkZXYtPnBoeWRldiA9IE5VTEw7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKIH0KIAogLyogRW50cnkgcG9pbnQgZm9yIHN0b3BwaW5nIHRoZSBpbnRlcmZhY2UgKi8KQEAgLTE2NjcsOSArMTc1NCwxNSBAQAogCWRldi0+c3RhdHMucnhfZHJvcHBlZCArPSBzbXNjOTExeF9yZWdfcmVhZChwZGF0YSwgUlhfRFJPUCk7CiAJc21zYzkxMXhfdHhfdXBkYXRlX3R4Y291bnRlcnMoZGV2KTsKIAorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCiAJLyogQnJpbmcgdGhlIFBIWSBkb3duICovCi0JaWYgKGRldi0+cGh5ZGV2KQorCWlmIChkZXYtPnBoeWRldikgewogCQlwaHlfc3RvcChkZXYtPnBoeWRldik7CisJCXBoeV9kaXNjb25uZWN0KGRldi0+cGh5ZGV2KTsKKwkJZGV2LT5waHlkZXYgPSBOVUxMOworCX0KKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOwogCiAJU01TQ19UUkFDRShwZGF0YSwgaWZkb3duLCAiSW50ZXJmYWNlIHN0b3BwZWQiKTsKIAlyZXR1cm4gMDsKQEAgLTE4MTEsNjcgKzE5MDQsNiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkYXRhLT5tYWNfbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3Qgc21zYzkxMXhfaXJxaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKLQlzdHJ1Y3Qgc21zYzkxMXhfZGF0YSAqcGRhdGEgPSBuZXRkZXZfcHJpdihkZXYpOwotCXUzMiBpbnRzdHMgPSBzbXNjOTExeF9yZWdfcmVhZChwZGF0YSwgSU5UX1NUUyk7Ci0JdTMyIGludGVuID0gc21zYzkxMXhfcmVnX3JlYWQocGRhdGEsIElOVF9FTik7Ci0JaW50IHNlcnZpY2VkID0gSVJRX05PTkU7Ci0JdTMyIHRlbXA7Ci0KLQlpZiAodW5saWtlbHkoaW50c3RzICYgaW50ZW4gJiBJTlRfU1RTX1NXX0lOVF8pKSB7Ci0JCXRlbXAgPSBzbXNjOTExeF9yZWdfcmVhZChwZGF0YSwgSU5UX0VOKTsKLQkJdGVtcCAmPSAofklOVF9FTl9TV19JTlRfRU5fKTsKLQkJc21zYzkxMXhfcmVnX3dyaXRlKHBkYXRhLCBJTlRfRU4sIHRlbXApOwotCQlzbXNjOTExeF9yZWdfd3JpdGUocGRhdGEsIElOVF9TVFMsIElOVF9TVFNfU1dfSU5UXyk7Ci0JCXBkYXRhLT5zb2Z0d2FyZV9pcnFfc2lnbmFsID0gMTsKLQkJc21wX3dtYigpOwotCQlzZXJ2aWNlZCA9IElSUV9IQU5ETEVEOwotCX0KLQotCWlmICh1bmxpa2VseShpbnRzdHMgJiBpbnRlbiAmIElOVF9TVFNfUlhTVE9QX0lOVF8pKSB7Ci0JCS8qIENhbGxlZCB3aGVuIHRoZXJlIGlzIGEgbXVsdGljYXN0IHVwZGF0ZSBzY2hlZHVsZWQgYW5kCi0JCSAqIGl0IGlzIG5vdyBzYWZlIHRvIGNvbXBsZXRlIHRoZSB1cGRhdGUgKi8KLQkJU01TQ19UUkFDRShwZGF0YSwgaW50ciwgIlJYIFN0b3AgaW50ZXJydXB0Iik7Ci0JCXNtc2M5MTF4X3JlZ193cml0ZShwZGF0YSwgSU5UX1NUUywgSU5UX1NUU19SWFNUT1BfSU5UXyk7Ci0JCWlmIChwZGF0YS0+bXVsdGljYXN0X3VwZGF0ZV9wZW5kaW5nKQotCQkJc21zYzkxMXhfcnhfbXVsdGljYXN0X3VwZGF0ZV93b3JrYXJvdW5kKHBkYXRhKTsKLQkJc2VydmljZWQgPSBJUlFfSEFORExFRDsKLQl9Ci0KLQlpZiAoaW50c3RzICYgaW50ZW4gJiBJTlRfU1RTX1RERkFfKSB7Ci0JCXRlbXAgPSBzbXNjOTExeF9yZWdfcmVhZChwZGF0YSwgRklGT19JTlQpOwotCQl0ZW1wIHw9IEZJRk9fSU5UX1RYX0FWQUlMX0xFVkVMXzsKLQkJc21zYzkxMXhfcmVnX3dyaXRlKHBkYXRhLCBGSUZPX0lOVCwgdGVtcCk7Ci0JCXNtc2M5MTF4X3JlZ193cml0ZShwZGF0YSwgSU5UX1NUUywgSU5UX1NUU19UREZBXyk7Ci0JCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKLQkJc2VydmljZWQgPSBJUlFfSEFORExFRDsKLQl9Ci0KLQlpZiAodW5saWtlbHkoaW50c3RzICYgaW50ZW4gJiBJTlRfU1RTX1JYRV8pKSB7Ci0JCVNNU0NfVFJBQ0UocGRhdGEsIGludHIsICJSWCBFcnJvciBpbnRlcnJ1cHQiKTsKLQkJc21zYzkxMXhfcmVnX3dyaXRlKHBkYXRhLCBJTlRfU1RTLCBJTlRfU1RTX1JYRV8pOwotCQlzZXJ2aWNlZCA9IElSUV9IQU5ETEVEOwotCX0KLQotCWlmIChsaWtlbHkoaW50c3RzICYgaW50ZW4gJiBJTlRfU1RTX1JTRkxfKSkgewotCQlpZiAobGlrZWx5KG5hcGlfc2NoZWR1bGVfcHJlcCgmcGRhdGEtPm5hcGkpKSkgewotCQkJLyogRGlzYWJsZSBSeCBpbnRlcnJ1cHRzICovCi0JCQl0ZW1wID0gc21zYzkxMXhfcmVnX3JlYWQocGRhdGEsIElOVF9FTik7Ci0JCQl0ZW1wICY9ICh+SU5UX0VOX1JTRkxfRU5fKTsKLQkJCXNtc2M5MTF4X3JlZ193cml0ZShwZGF0YSwgSU5UX0VOLCB0ZW1wKTsKLQkJCS8qIFNjaGVkdWxlIGEgTkFQSSBwb2xsICovCi0JCQlfX25hcGlfc2NoZWR1bGUoJnBkYXRhLT5uYXBpKTsKLQkJfSBlbHNlIHsKLQkJCVNNU0NfV0FSTihwZGF0YSwgcnhfZXJyLCAibmFwaV9zY2hlZHVsZV9wcmVwIGZhaWxlZCIpOwotCQl9Ci0JCXNlcnZpY2VkID0gSVJRX0hBTkRMRUQ7Ci0JfQotCi0JcmV0dXJuIHNlcnZpY2VkOwotfQotCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIHN0YXRpYyB2b2lkIHNtc2M5MTF4X3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewpAQCAtMjI5MSwxNiArMjMyMywxNCBAQAogCXBkYXRhID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlCVUdfT04oIXBkYXRhKTsKIAlCVUdfT04oIXBkYXRhLT5pb2FkZHIpOwotCUJVR19PTighZGV2LT5waHlkZXYpOworCVdBUk5fT04oZGV2LT5waHlkZXYpOwogCiAJU01TQ19UUkFDRShwZGF0YSwgaWZkb3duLCAiU3RvcHBpbmcgZHJpdmVyIik7CiAKLQlwaHlfZGlzY29ubmVjdChkZXYtPnBoeWRldik7CiAJbWRpb2J1c191bnJlZ2lzdGVyKHBkYXRhLT5taWlfYnVzKTsKIAltZGlvYnVzX2ZyZWUocGRhdGEtPm1paV9idXMpOwogCiAJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLAogCQkJCQkgICAic21zYzkxMXgtbWVtb3J5Iik7CiAJaWYgKCFyZXMpCkBAIC0yMzg1LDggKzI0MTUsNyBAQAogCXN0cnVjdCBzbXNjOTExeF9kYXRhICpwZGF0YTsKIAlzdHJ1Y3Qgc21zYzkxMXhfcGxhdGZvcm1fY29uZmlnICpjb25maWcgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCXVuc2lnbmVkIGludCBpbnRjZmcgPSAwOwotCWludCByZXNfc2l6ZSwgaXJxLCBpcnFfZmxhZ3M7CisJaW50IHJlc19zaXplLCBpcnE7CiAJaW50IHJldHZhbDsKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCkBAIC0yNDI1LDcgKzI0NTQsNiBAQAogCiAJcGRhdGEgPSBuZXRkZXZfcHJpdihkZXYpOwogCWRldi0+aXJxID0gaXJxOwotCWlycV9mbGFncyA9IGlycV9nZXRfdHJpZ2dlcl90eXBlKGlycSk7CiAJcGRhdGEtPmlvYWRkciA9IGlvcmVtYXBfbm9jYWNoZShyZXMtPnN0YXJ0LCByZXNfc2l6ZSk7CiAKIAlwZGF0YS0+ZGV2ID0gZGV2OwpAQCAtMjQ3Miw0MSArMjUwMCwyMSBAQAogCWlmIChyZXR2YWwgPCAwKQogCQlnb3RvIG91dF9kaXNhYmxlX3Jlc291cmNlczsKIAotCS8qIGNvbmZpZ3VyZSBpcnEgcG9sYXJpdHkgYW5kIHR5cGUgYmVmb3JlIGNvbm5lY3RpbmcgaXNyICovCi0JaWYgKHBkYXRhLT5jb25maWcuaXJxX3BvbGFyaXR5ID09IFNNU0M5MTFYX0lSUV9QT0xBUklUWV9BQ1RJVkVfSElHSCkKLQkJaW50Y2ZnIHw9IElOVF9DRkdfSVJRX1BPTF87Ci0KLQlpZiAocGRhdGEtPmNvbmZpZy5pcnFfdHlwZSA9PSBTTVNDOTExWF9JUlFfVFlQRV9QVVNIX1BVTEwpCi0JCWludGNmZyB8PSBJTlRfQ0ZHX0lSUV9UWVBFXzsKLQotCXNtc2M5MTF4X3JlZ193cml0ZShwZGF0YSwgSU5UX0NGRywgaW50Y2ZnKTsKLQotCS8qIEVuc3VyZSBpbnRlcnJ1cHRzIGFyZSBnbG9iYWxseSBkaXNhYmxlZCBiZWZvcmUgY29ubmVjdGluZyBJU1IgKi8KLQlzbXNjOTExeF9kaXNhYmxlX2lycV9jaGlwKGRldik7Ci0KLQlyZXR2YWwgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgc21zYzkxMXhfaXJxaGFuZGxlciwKLQkJCSAgICAgaXJxX2ZsYWdzIHwgSVJRRl9TSEFSRUQsIGRldi0+bmFtZSwgZGV2KTsKLQlpZiAocmV0dmFsKSB7Ci0JCVNNU0NfV0FSTihwZGF0YSwgcHJvYmUsCi0JCQkgICJVbmFibGUgdG8gY2xhaW0gcmVxdWVzdGVkIGlycTogJWQiLCBkZXYtPmlycSk7Ci0JCWdvdG8gb3V0X2Rpc2FibGVfcmVzb3VyY2VzOwotCX0KLQogCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CiAKLQlyZXR2YWwgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQlpZiAocmV0dmFsKSB7Ci0JCVNNU0NfV0FSTihwZGF0YSwgcHJvYmUsICJFcnJvciAlaSByZWdpc3RlcmluZyBkZXZpY2UiLCByZXR2YWwpOwotCQlnb3RvIG91dF9mcmVlX2lycTsKLQl9IGVsc2UgewotCQlTTVNDX1RSQUNFKHBkYXRhLCBwcm9iZSwKLQkJCSAgICJOZXR3b3JrIGludGVyZmFjZTogXCIlc1wiIiwgZGV2LT5uYW1lKTsKLQl9Ci0KIAlyZXR2YWwgPSBzbXNjOTExeF9taWlfaW5pdChwZGV2LCBkZXYpOwogCWlmIChyZXR2YWwpIHsKIAkJU01TQ19XQVJOKHBkYXRhLCBwcm9iZSwgIkVycm9yICVpIGluaXRpYWxpc2luZyBtaWkiLCByZXR2YWwpOwotCQlnb3RvIG91dF91bnJlZ2lzdGVyX25ldGRldl81OworCQlnb3RvIG91dF9kaXNhYmxlX3Jlc291cmNlczsKKwl9CisKKwlyZXR2YWwgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmV0dmFsKSB7CisJCVNNU0NfV0FSTihwZGF0YSwgcHJvYmUsICJFcnJvciAlaSByZWdpc3RlcmluZyBkZXZpY2UiLCByZXR2YWwpOworCQlnb3RvIG91dF9kaXNhYmxlX3Jlc291cmNlczsKKwl9IGVsc2UgeworCQlTTVNDX1RSQUNFKHBkYXRhLCBwcm9iZSwKKwkJCSAgICJOZXR3b3JrIGludGVyZmFjZTogXCIlc1wiIiwgZGV2LT5uYW1lKTsKIAl9CiAKIAlzcGluX2xvY2tfaXJxKCZwZGF0YS0+bWFjX2xvY2spOwpAQCAtMjU0NCwxMCArMjU1Miw2IEBACiAKIAlyZXR1cm4gMDsKIAotb3V0X3VucmVnaXN0ZXJfbmV0ZGV2XzU6Ci0JdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLW91dF9mcmVlX2lycToKLQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIG91dF9kaXNhYmxlX3Jlc291cmNlczoKIAlwbV9ydW50aW1lX3B1dCgmcGRldi0+ZGV2KTsKIAlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9LY29uZmlnIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvS2NvbmZpZwppbmRleCA4ZjA2YTY2Li5jNzMyYjhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL0tjb25maWcKQEAgLTEwNCw2ICsxMDQsMTggQEAKIAkgIGRldmljZSBkcml2ZXIuIFRoaXMgZHJpdmVyIGlzIHVzZWQgb24gZm9yIHRoZSBTVGkgc2VyaWVzCiAJICBTT0NzIEdNQUMgZXRoZXJuZXQgY29udHJvbGxlci4KIAorY29uZmlnIERXTUFDX1NUTTMyCisJdHJpc3RhdGUgIlNUTTMyIERXTUFDIHN1cHBvcnQiCisJZGVmYXVsdCBBUkNIX1NUTTMyCisJZGVwZW5kcyBvbiBPRiAmJiBIQVNfSU9NRU0KKwlzZWxlY3QgTUZEX1NZU0NPTgorCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnQgZm9yIGV0aGVybmV0IGNvbnRyb2xsZXIgb24gU1RNMzIgU09Dcy4KKworCSAgVGhpcyBzZWxlY3RzIFNUTTMyIFNvQyBnbHVlIGxheWVyIHN1cHBvcnQgZm9yIHRoZSBzdG1tYWMKKwkgIGRldmljZSBkcml2ZXIuIFRoaXMgZHJpdmVyIGlzIHVzZWQgb24gZm9yIHRoZSBTVE0zMiBzZXJpZXMKKwkgIFNPQ3MgR01BQyBldGhlcm5ldCBjb250cm9sbGVyLgorCiBjb25maWcgRFdNQUNfU1VOWEkKIAl0cmlzdGF0ZSAiQWxsd2lubmVyIEdNQUMgc3VwcG9ydCIKIAlkZWZhdWx0IEFSQ0hfU1VOWEkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvTWFrZWZpbGUKaW5kZXggNDRiNjMwYy4uZjBjOTM5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvTWFrZWZpbGUKQEAgLTEzLDYgKzEzLDcgQEAKIG9iai0kKENPTkZJR19EV01BQ19ST0NLQ0hJUCkJKz0gZHdtYWMtcmsubwogb2JqLSQoQ09ORklHX0RXTUFDX1NPQ0ZQR0EpCSs9IGR3bWFjLWFsdHItc29jZnBnYS5vCiBvYmotJChDT05GSUdfRFdNQUNfU1RJKQkJKz0gZHdtYWMtc3RpLm8KK29iai0kKENPTkZJR19EV01BQ19TVE0zMikJKz0gZHdtYWMtc3RtMzIubwogb2JqLSQoQ09ORklHX0RXTUFDX1NVTlhJKQkrPSBkd21hYy1zdW54aS5vCiBvYmotJChDT05GSUdfRFdNQUNfR0VORVJJQykJKz0gZHdtYWMtZ2VuZXJpYy5vCiBzdG1tYWMtcGxhdGZvcm0tb2Jqczo9IHN0bW1hY19wbGF0Zm9ybS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9jb21tb24uaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL2NvbW1vbi5oCmluZGV4IDI1MzNiOTEuLmQzMjkyYzRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9jb21tb24uaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9jb21tb24uaApAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0bW1hYy5oPgogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2lmIGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1ZMQU5fODAyMVEpCiAjZGVmaW5lIFNUTU1BQ19WTEFOX1RBR19VU0VECiAjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9kd21hYy1yay5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvZHdtYWMtcmsuYwppbmRleCA5MjEwNTkxLi4zNzQwYTQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9kd21hYy1yay5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL2R3bWFjLXJrLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9zeXNjb24uaD4KICNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAKICNpbmNsdWRlICJzdG1tYWNfcGxhdGZvcm0uaCIKIApAQCAtMzAxLDYgKzMwMiwxMTggQEAKIAkuc2V0X3JtaWlfc3BlZWQgPSByazMyODhfc2V0X3JtaWlfc3BlZWQsCiB9OwogCisjZGVmaW5lIFJLMzM2Nl9HUkZfU09DX0NPTjYJMHgwNDE4CisjZGVmaW5lIFJLMzM2Nl9HUkZfU09DX0NPTjcJMHgwNDFjCisKKy8qIFJLMzM2Nl9HUkZfU09DX0NPTjYgKi8KKyNkZWZpbmUgUkszMzY2X0dNQUNfUEhZX0lOVEZfU0VMX1JHTUlJCShHUkZfQklUKDkpIHwgR1JGX0NMUl9CSVQoMTApIHwgXAorCQkJCQkgR1JGX0NMUl9CSVQoMTEpKQorI2RlZmluZSBSSzMzNjZfR01BQ19QSFlfSU5URl9TRUxfUk1JSQkoR1JGX0NMUl9CSVQoOSkgfCBHUkZfQ0xSX0JJVCgxMCkgfCBcCisJCQkJCSBHUkZfQklUKDExKSkKKyNkZWZpbmUgUkszMzY2X0dNQUNfRkxPV19DVFJMCQlHUkZfQklUKDgpCisjZGVmaW5lIFJLMzM2Nl9HTUFDX0ZMT1dfQ1RSTF9DTFIJR1JGX0NMUl9CSVQoOCkKKyNkZWZpbmUgUkszMzY2X0dNQUNfU1BFRURfMTBNCQlHUkZfQ0xSX0JJVCg3KQorI2RlZmluZSBSSzMzNjZfR01BQ19TUEVFRF8xMDBNCQlHUkZfQklUKDcpCisjZGVmaW5lIFJLMzM2Nl9HTUFDX1JNSUlfQ0xLXzI1TQlHUkZfQklUKDMpCisjZGVmaW5lIFJLMzM2Nl9HTUFDX1JNSUlfQ0xLXzJfNU0JR1JGX0NMUl9CSVQoMykKKyNkZWZpbmUgUkszMzY2X0dNQUNfQ0xLXzEyNU0JCShHUkZfQ0xSX0JJVCg0KSB8IEdSRl9DTFJfQklUKDUpKQorI2RlZmluZSBSSzMzNjZfR01BQ19DTEtfMjVNCQkoR1JGX0JJVCg0KSB8IEdSRl9CSVQoNSkpCisjZGVmaW5lIFJLMzM2Nl9HTUFDX0NMS18yXzVNCQkoR1JGX0NMUl9CSVQoNCkgfCBHUkZfQklUKDUpKQorI2RlZmluZSBSSzMzNjZfR01BQ19STUlJX01PREUJCUdSRl9CSVQoNikKKyNkZWZpbmUgUkszMzY2X0dNQUNfUk1JSV9NT0RFX0NMUglHUkZfQ0xSX0JJVCg2KQorCisvKiBSSzMzNjZfR1JGX1NPQ19DT043ICovCisjZGVmaW5lIFJLMzM2Nl9HTUFDX1RYQ0xLX0RMWV9FTkFCTEUJR1JGX0JJVCg3KQorI2RlZmluZSBSSzMzNjZfR01BQ19UWENMS19ETFlfRElTQUJMRQlHUkZfQ0xSX0JJVCg3KQorI2RlZmluZSBSSzMzNjZfR01BQ19SWENMS19ETFlfRU5BQkxFCUdSRl9CSVQoMTUpCisjZGVmaW5lIFJLMzM2Nl9HTUFDX1JYQ0xLX0RMWV9ESVNBQkxFCUdSRl9DTFJfQklUKDE1KQorI2RlZmluZSBSSzMzNjZfR01BQ19DTEtfUlhfRExfQ0ZHKHZhbCkJSElXT1JEX1VQREFURSh2YWwsIDB4N0YsIDgpCisjZGVmaW5lIFJLMzM2Nl9HTUFDX0NMS19UWF9ETF9DRkcodmFsKQlISVdPUkRfVVBEQVRFKHZhbCwgMHg3RiwgMCkKKworc3RhdGljIHZvaWQgcmszMzY2X3NldF90b19yZ21paShzdHJ1Y3QgcmtfcHJpdl9kYXRhICpic3BfcHJpdiwKKwkJCQlpbnQgdHhfZGVsYXksIGludCByeF9kZWxheSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYnNwX3ByaXYtPnBkZXYtPmRldjsKKworCWlmIChJU19FUlIoYnNwX3ByaXYtPmdyZikpIHsKKwkJZGV2X2VycihkZXYsICIlczogTWlzc2luZyByb2NrY2hpcCxncmYgcHJvcGVydHlcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXJlZ21hcF93cml0ZShic3BfcHJpdi0+Z3JmLCBSSzMzNjZfR1JGX1NPQ19DT042LAorCQkgICAgIFJLMzM2Nl9HTUFDX1BIWV9JTlRGX1NFTF9SR01JSSB8CisJCSAgICAgUkszMzY2X0dNQUNfUk1JSV9NT0RFX0NMUik7CisJcmVnbWFwX3dyaXRlKGJzcF9wcml2LT5ncmYsIFJLMzM2Nl9HUkZfU09DX0NPTjcsCisJCSAgICAgUkszMzY2X0dNQUNfUlhDTEtfRExZX0VOQUJMRSB8CisJCSAgICAgUkszMzY2X0dNQUNfVFhDTEtfRExZX0VOQUJMRSB8CisJCSAgICAgUkszMzY2X0dNQUNfQ0xLX1JYX0RMX0NGRyhyeF9kZWxheSkgfAorCQkgICAgIFJLMzM2Nl9HTUFDX0NMS19UWF9ETF9DRkcodHhfZGVsYXkpKTsKK30KKworc3RhdGljIHZvaWQgcmszMzY2X3NldF90b19ybWlpKHN0cnVjdCBya19wcml2X2RhdGEgKmJzcF9wcml2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZic3BfcHJpdi0+cGRldi0+ZGV2OworCisJaWYgKElTX0VSUihic3BfcHJpdi0+Z3JmKSkgeworCQlkZXZfZXJyKGRldiwgIiVzOiBNaXNzaW5nIHJvY2tjaGlwLGdyZiBwcm9wZXJ0eVxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJcmVnbWFwX3dyaXRlKGJzcF9wcml2LT5ncmYsIFJLMzM2Nl9HUkZfU09DX0NPTjYsCisJCSAgICAgUkszMzY2X0dNQUNfUEhZX0lOVEZfU0VMX1JNSUkgfCBSSzMzNjZfR01BQ19STUlJX01PREUpOworfQorCitzdGF0aWMgdm9pZCByazMzNjZfc2V0X3JnbWlpX3NwZWVkKHN0cnVjdCBya19wcml2X2RhdGEgKmJzcF9wcml2LCBpbnQgc3BlZWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmJzcF9wcml2LT5wZGV2LT5kZXY7CisKKwlpZiAoSVNfRVJSKGJzcF9wcml2LT5ncmYpKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IE1pc3Npbmcgcm9ja2NoaXAsZ3JmIHByb3BlcnR5XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc3BlZWQgPT0gMTApCisJCXJlZ21hcF93cml0ZShic3BfcHJpdi0+Z3JmLCBSSzMzNjZfR1JGX1NPQ19DT042LAorCQkJICAgICBSSzMzNjZfR01BQ19DTEtfMl81TSk7CisJZWxzZSBpZiAoc3BlZWQgPT0gMTAwKQorCQlyZWdtYXBfd3JpdGUoYnNwX3ByaXYtPmdyZiwgUkszMzY2X0dSRl9TT0NfQ09ONiwKKwkJCSAgICAgUkszMzY2X0dNQUNfQ0xLXzI1TSk7CisJZWxzZSBpZiAoc3BlZWQgPT0gMTAwMCkKKwkJcmVnbWFwX3dyaXRlKGJzcF9wcml2LT5ncmYsIFJLMzM2Nl9HUkZfU09DX0NPTjYsCisJCQkgICAgIFJLMzM2Nl9HTUFDX0NMS18xMjVNKTsKKwllbHNlCisJCWRldl9lcnIoZGV2LCAidW5rbm93biBzcGVlZCB2YWx1ZSBmb3IgUkdNSUkhIHNwZWVkPSVkIiwgc3BlZWQpOworfQorCitzdGF0aWMgdm9pZCByazMzNjZfc2V0X3JtaWlfc3BlZWQoc3RydWN0IHJrX3ByaXZfZGF0YSAqYnNwX3ByaXYsIGludCBzcGVlZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYnNwX3ByaXYtPnBkZXYtPmRldjsKKworCWlmIChJU19FUlIoYnNwX3ByaXYtPmdyZikpIHsKKwkJZGV2X2VycihkZXYsICIlczogTWlzc2luZyByb2NrY2hpcCxncmYgcHJvcGVydHlcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzcGVlZCA9PSAxMCkgeworCQlyZWdtYXBfd3JpdGUoYnNwX3ByaXYtPmdyZiwgUkszMzY2X0dSRl9TT0NfQ09ONiwKKwkJCSAgICAgUkszMzY2X0dNQUNfUk1JSV9DTEtfMl81TSB8CisJCQkgICAgIFJLMzM2Nl9HTUFDX1NQRUVEXzEwTSk7CisJfSBlbHNlIGlmIChzcGVlZCA9PSAxMDApIHsKKwkJcmVnbWFwX3dyaXRlKGJzcF9wcml2LT5ncmYsIFJLMzM2Nl9HUkZfU09DX0NPTjYsCisJCQkgICAgIFJLMzM2Nl9HTUFDX1JNSUlfQ0xLXzI1TSB8CisJCQkgICAgIFJLMzM2Nl9HTUFDX1NQRUVEXzEwME0pOworCX0gZWxzZSB7CisJCWRldl9lcnIoZGV2LCAidW5rbm93biBzcGVlZCB2YWx1ZSBmb3IgUk1JSSEgc3BlZWQ9JWQiLCBzcGVlZCk7CisJfQorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJrX2dtYWNfb3BzIHJrMzM2Nl9vcHMgPSB7CisJLnNldF90b19yZ21paSA9IHJrMzM2Nl9zZXRfdG9fcmdtaWksCisJLnNldF90b19ybWlpID0gcmszMzY2X3NldF90b19ybWlpLAorCS5zZXRfcmdtaWlfc3BlZWQgPSByazMzNjZfc2V0X3JnbWlpX3NwZWVkLAorCS5zZXRfcm1paV9zcGVlZCA9IHJrMzM2Nl9zZXRfcm1paV9zcGVlZCwKK307CisKICNkZWZpbmUgUkszMzY4X0dSRl9TT0NfQ09OMTUJMHgwNDNjCiAjZGVmaW5lIFJLMzM2OF9HUkZfU09DX0NPTjE2CTB4MDQ0MAogCkBAIC00MTMsNiArNTI2LDExOCBAQAogCS5zZXRfcm1paV9zcGVlZCA9IHJrMzM2OF9zZXRfcm1paV9zcGVlZCwKIH07CiAKKyNkZWZpbmUgUkszMzk5X0dSRl9TT0NfQ09ONQkweGMyMTQKKyNkZWZpbmUgUkszMzk5X0dSRl9TT0NfQ09ONgkweGMyMTgKKworLyogUkszMzk5X0dSRl9TT0NfQ09ONSAqLworI2RlZmluZSBSSzMzOTlfR01BQ19QSFlfSU5URl9TRUxfUkdNSUkJKEdSRl9CSVQoOSkgfCBHUkZfQ0xSX0JJVCgxMCkgfCBcCisJCQkJCSBHUkZfQ0xSX0JJVCgxMSkpCisjZGVmaW5lIFJLMzM5OV9HTUFDX1BIWV9JTlRGX1NFTF9STUlJCShHUkZfQ0xSX0JJVCg5KSB8IEdSRl9DTFJfQklUKDEwKSB8IFwKKwkJCQkJIEdSRl9CSVQoMTEpKQorI2RlZmluZSBSSzMzOTlfR01BQ19GTE9XX0NUUkwJCUdSRl9CSVQoOCkKKyNkZWZpbmUgUkszMzk5X0dNQUNfRkxPV19DVFJMX0NMUglHUkZfQ0xSX0JJVCg4KQorI2RlZmluZSBSSzMzOTlfR01BQ19TUEVFRF8xME0JCUdSRl9DTFJfQklUKDcpCisjZGVmaW5lIFJLMzM5OV9HTUFDX1NQRUVEXzEwME0JCUdSRl9CSVQoNykKKyNkZWZpbmUgUkszMzk5X0dNQUNfUk1JSV9DTEtfMjVNCUdSRl9CSVQoMykKKyNkZWZpbmUgUkszMzk5X0dNQUNfUk1JSV9DTEtfMl81TQlHUkZfQ0xSX0JJVCgzKQorI2RlZmluZSBSSzMzOTlfR01BQ19DTEtfMTI1TQkJKEdSRl9DTFJfQklUKDQpIHwgR1JGX0NMUl9CSVQoNSkpCisjZGVmaW5lIFJLMzM5OV9HTUFDX0NMS18yNU0JCShHUkZfQklUKDQpIHwgR1JGX0JJVCg1KSkKKyNkZWZpbmUgUkszMzk5X0dNQUNfQ0xLXzJfNU0JCShHUkZfQ0xSX0JJVCg0KSB8IEdSRl9CSVQoNSkpCisjZGVmaW5lIFJLMzM5OV9HTUFDX1JNSUlfTU9ERQkJR1JGX0JJVCg2KQorI2RlZmluZSBSSzMzOTlfR01BQ19STUlJX01PREVfQ0xSCUdSRl9DTFJfQklUKDYpCisKKy8qIFJLMzM5OV9HUkZfU09DX0NPTjYgKi8KKyNkZWZpbmUgUkszMzk5X0dNQUNfVFhDTEtfRExZX0VOQUJMRQlHUkZfQklUKDcpCisjZGVmaW5lIFJLMzM5OV9HTUFDX1RYQ0xLX0RMWV9ESVNBQkxFCUdSRl9DTFJfQklUKDcpCisjZGVmaW5lIFJLMzM5OV9HTUFDX1JYQ0xLX0RMWV9FTkFCTEUJR1JGX0JJVCgxNSkKKyNkZWZpbmUgUkszMzk5X0dNQUNfUlhDTEtfRExZX0RJU0FCTEUJR1JGX0NMUl9CSVQoMTUpCisjZGVmaW5lIFJLMzM5OV9HTUFDX0NMS19SWF9ETF9DRkcodmFsKQlISVdPUkRfVVBEQVRFKHZhbCwgMHg3RiwgOCkKKyNkZWZpbmUgUkszMzk5X0dNQUNfQ0xLX1RYX0RMX0NGRyh2YWwpCUhJV09SRF9VUERBVEUodmFsLCAweDdGLCAwKQorCitzdGF0aWMgdm9pZCByazMzOTlfc2V0X3RvX3JnbWlpKHN0cnVjdCBya19wcml2X2RhdGEgKmJzcF9wcml2LAorCQkJCWludCB0eF9kZWxheSwgaW50IHJ4X2RlbGF5KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZic3BfcHJpdi0+cGRldi0+ZGV2OworCisJaWYgKElTX0VSUihic3BfcHJpdi0+Z3JmKSkgeworCQlkZXZfZXJyKGRldiwgIiVzOiBNaXNzaW5nIHJvY2tjaGlwLGdyZiBwcm9wZXJ0eVxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJcmVnbWFwX3dyaXRlKGJzcF9wcml2LT5ncmYsIFJLMzM5OV9HUkZfU09DX0NPTjUsCisJCSAgICAgUkszMzk5X0dNQUNfUEhZX0lOVEZfU0VMX1JHTUlJIHwKKwkJICAgICBSSzMzOTlfR01BQ19STUlJX01PREVfQ0xSKTsKKwlyZWdtYXBfd3JpdGUoYnNwX3ByaXYtPmdyZiwgUkszMzk5X0dSRl9TT0NfQ09ONiwKKwkJICAgICBSSzMzOTlfR01BQ19SWENMS19ETFlfRU5BQkxFIHwKKwkJICAgICBSSzMzOTlfR01BQ19UWENMS19ETFlfRU5BQkxFIHwKKwkJICAgICBSSzMzOTlfR01BQ19DTEtfUlhfRExfQ0ZHKHJ4X2RlbGF5KSB8CisJCSAgICAgUkszMzk5X0dNQUNfQ0xLX1RYX0RMX0NGRyh0eF9kZWxheSkpOworfQorCitzdGF0aWMgdm9pZCByazMzOTlfc2V0X3RvX3JtaWkoc3RydWN0IHJrX3ByaXZfZGF0YSAqYnNwX3ByaXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmJzcF9wcml2LT5wZGV2LT5kZXY7CisKKwlpZiAoSVNfRVJSKGJzcF9wcml2LT5ncmYpKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IE1pc3Npbmcgcm9ja2NoaXAsZ3JmIHByb3BlcnR5XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlyZWdtYXBfd3JpdGUoYnNwX3ByaXYtPmdyZiwgUkszMzk5X0dSRl9TT0NfQ09ONSwKKwkJICAgICBSSzMzOTlfR01BQ19QSFlfSU5URl9TRUxfUk1JSSB8IFJLMzM5OV9HTUFDX1JNSUlfTU9ERSk7Cit9CisKK3N0YXRpYyB2b2lkIHJrMzM5OV9zZXRfcmdtaWlfc3BlZWQoc3RydWN0IHJrX3ByaXZfZGF0YSAqYnNwX3ByaXYsIGludCBzcGVlZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYnNwX3ByaXYtPnBkZXYtPmRldjsKKworCWlmIChJU19FUlIoYnNwX3ByaXYtPmdyZikpIHsKKwkJZGV2X2VycihkZXYsICIlczogTWlzc2luZyByb2NrY2hpcCxncmYgcHJvcGVydHlcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzcGVlZCA9PSAxMCkKKwkJcmVnbWFwX3dyaXRlKGJzcF9wcml2LT5ncmYsIFJLMzM5OV9HUkZfU09DX0NPTjUsCisJCQkgICAgIFJLMzM5OV9HTUFDX0NMS18yXzVNKTsKKwllbHNlIGlmIChzcGVlZCA9PSAxMDApCisJCXJlZ21hcF93cml0ZShic3BfcHJpdi0+Z3JmLCBSSzMzOTlfR1JGX1NPQ19DT041LAorCQkJICAgICBSSzMzOTlfR01BQ19DTEtfMjVNKTsKKwllbHNlIGlmIChzcGVlZCA9PSAxMDAwKQorCQlyZWdtYXBfd3JpdGUoYnNwX3ByaXYtPmdyZiwgUkszMzk5X0dSRl9TT0NfQ09ONSwKKwkJCSAgICAgUkszMzk5X0dNQUNfQ0xLXzEyNU0pOworCWVsc2UKKwkJZGV2X2VycihkZXYsICJ1bmtub3duIHNwZWVkIHZhbHVlIGZvciBSR01JSSEgc3BlZWQ9JWQiLCBzcGVlZCk7Cit9CisKK3N0YXRpYyB2b2lkIHJrMzM5OV9zZXRfcm1paV9zcGVlZChzdHJ1Y3QgcmtfcHJpdl9kYXRhICpic3BfcHJpdiwgaW50IHNwZWVkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZic3BfcHJpdi0+cGRldi0+ZGV2OworCisJaWYgKElTX0VSUihic3BfcHJpdi0+Z3JmKSkgeworCQlkZXZfZXJyKGRldiwgIiVzOiBNaXNzaW5nIHJvY2tjaGlwLGdyZiBwcm9wZXJ0eVxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJaWYgKHNwZWVkID09IDEwKSB7CisJCXJlZ21hcF93cml0ZShic3BfcHJpdi0+Z3JmLCBSSzMzOTlfR1JGX1NPQ19DT041LAorCQkJICAgICBSSzMzOTlfR01BQ19STUlJX0NMS18yXzVNIHwKKwkJCSAgICAgUkszMzk5X0dNQUNfU1BFRURfMTBNKTsKKwl9IGVsc2UgaWYgKHNwZWVkID09IDEwMCkgeworCQlyZWdtYXBfd3JpdGUoYnNwX3ByaXYtPmdyZiwgUkszMzk5X0dSRl9TT0NfQ09ONSwKKwkJCSAgICAgUkszMzk5X0dNQUNfUk1JSV9DTEtfMjVNIHwKKwkJCSAgICAgUkszMzk5X0dNQUNfU1BFRURfMTAwTSk7CisJfSBlbHNlIHsKKwkJZGV2X2VycihkZXYsICJ1bmtub3duIHNwZWVkIHZhbHVlIGZvciBSTUlJISBzcGVlZD0lZCIsIHNwZWVkKTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmtfZ21hY19vcHMgcmszMzk5X29wcyA9IHsKKwkuc2V0X3RvX3JnbWlpID0gcmszMzk5X3NldF90b19yZ21paSwKKwkuc2V0X3RvX3JtaWkgPSByazMzOTlfc2V0X3RvX3JtaWksCisJLnNldF9yZ21paV9zcGVlZCA9IHJrMzM5OV9zZXRfcmdtaWlfc3BlZWQsCisJLnNldF9ybWlpX3NwZWVkID0gcmszMzk5X3NldF9ybWlpX3NwZWVkLAorfTsKKwogc3RhdGljIGludCBnbWFjX2Nsa19pbml0KHN0cnVjdCBya19wcml2X2RhdGEgKmJzcF9wcml2KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZic3BfcHJpdi0+cGRldi0+ZGV2OwpAQCAtNjI5LDYgKzg1NCwxNiBAQAogCQkJCQkJCSJyb2NrY2hpcCxncmYiKTsKIAlic3BfcHJpdi0+cGRldiA9IHBkZXY7CiAKKwlnbWFjX2Nsa19pbml0KGJzcF9wcml2KTsKKworCXJldHVybiBic3BfcHJpdjsKK30KKworc3RhdGljIGludCBya19nbWFjX3Bvd2VydXAoc3RydWN0IHJrX3ByaXZfZGF0YSAqYnNwX3ByaXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYnNwX3ByaXYtPnBkZXYtPmRldjsKKwogCS8qcm1paSBvciByZ21paSovCiAJaWYgKGJzcF9wcml2LT5waHlfaWZhY2UgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJKSB7CiAJCWRldl9pbmZvKGRldiwgImluaXQgZm9yIFJHTUlJXG4iKTsKQEAgLTY0MSwxNSArODc2LDYgQEAKIAkJZGV2X2VycihkZXYsICJOTyBpbnRlcmZhY2UgZGVmaW5lZCFcbiIpOwogCX0KIAotCWdtYWNfY2xrX2luaXQoYnNwX3ByaXYpOwotCi0JcmV0dXJuIGJzcF9wcml2OwotfQotCi1zdGF0aWMgaW50IHJrX2dtYWNfcG93ZXJ1cChzdHJ1Y3QgcmtfcHJpdl9kYXRhICpic3BfcHJpdikKLXsKLQlpbnQgcmV0OwotCiAJcmV0ID0gcGh5X3Bvd2VyX29uKGJzcF9wcml2LCB0cnVlKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtNjU4LDExICs4ODQsMTkgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJcG1fcnVudGltZV9lbmFibGUoZGV2KTsKKwlwbV9ydW50aW1lX2dldF9zeW5jKGRldik7CisKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgcmtfZ21hY19wb3dlcmRvd24oc3RydWN0IHJrX3ByaXZfZGF0YSAqZ21hYykKIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZ21hYy0+cGRldi0+ZGV2OworCisJcG1fcnVudGltZV9wdXRfc3luYyhkZXYpOworCXBtX3J1bnRpbWVfZGlzYWJsZShkZXYpOworCiAJcGh5X3Bvd2VyX29uKGdtYWMsIGZhbHNlKTsKIAlnbWFjX2Nsa19lbmFibGUoZ21hYywgZmFsc2UpOwogfQpAQCAtNzYwLDcgKzk5NCw5IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBya19nbWFjX2R3bWFjX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMyMjgtZ21hYyIsIC5kYXRhID0gJnJrMzIyOF9vcHMgfSwKIAl7IC5jb21wYXRpYmxlID0gInJvY2tjaGlwLHJrMzI4OC1nbWFjIiwgLmRhdGEgPSAmcmszMjg4X29wcyB9LAorCXsgLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMzY2LWdtYWMiLCAuZGF0YSA9ICZyazMzNjZfb3BzIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzNjgtZ21hYyIsIC5kYXRhID0gJnJrMzM2OF9vcHMgfSwKKwl7IC5jb21wYXRpYmxlID0gInJvY2tjaGlwLHJrMzM5OS1nbWFjIiwgLmRhdGEgPSAmcmszMzk5X29wcyB9LAogCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHJrX2dtYWNfZHdtYWNfbWF0Y2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvZHdtYWMtc3RtMzIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL2R3bWFjLXN0bTMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVhOTI2YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL2R3bWFjLXN0bTMyLmMKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBkd21hYy1zdG0zMi5jIC0gRFdNQUMgU3BlY2lmaWMgR2x1ZSBsYXllciBmb3IgU1RNMzIgTUNVCisgKgorICogQ29weXJpZ2h0IChDKSBBbGV4YW5kcmUgVG9yZ3VlIDIwMTUKKyAqIEF1dGhvcjogIEFsZXhhbmRyZSBUb3JndWUgPGFsZXhhbmRyZS50b3JndWVAZ21haWwuY29tPgorICogTGljZW5zZSB0ZXJtczogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCB2ZXJzaW9uIDIKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9zeXNjb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdG1tYWMuaD4KKworI2luY2x1ZGUgInN0bW1hY19wbGF0Zm9ybS5oIgorCisjZGVmaW5lIE1JSV9QSFlfU0VMX01BU0sJQklUKDIzKQorCitzdHJ1Y3Qgc3RtMzJfZHdtYWMgeworCXN0cnVjdCBjbGsgKmNsa190eDsKKwlzdHJ1Y3QgY2xrICpjbGtfcng7CisJdTMyIG1vZGVfcmVnOwkJLyogTUFDIGdsdWUtbG9naWMgbW9kZSByZWdpc3RlciAqLworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKwl1MzIgc3BlZWQ7Cit9OworCitzdGF0aWMgaW50IHN0bTMyX2R3bWFjX2luaXQoc3RydWN0IHBsYXRfc3RtbWFjZW5ldF9kYXRhICpwbGF0X2RhdCkKK3sKKwlzdHJ1Y3Qgc3RtMzJfZHdtYWMgKmR3bWFjID0gcGxhdF9kYXQtPmJzcF9wcml2OworCXUzMiByZWcgPSBkd21hYy0+bW9kZV9yZWc7CisJdTMyIHZhbDsKKwlpbnQgcmV0OworCisJdmFsID0gKHBsYXRfZGF0LT5pbnRlcmZhY2UgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX01JSSkgPyAwIDogMTsKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoZHdtYWMtPnJlZ21hcCwgcmVnLCBNSUlfUEhZX1NFTF9NQVNLLCB2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZHdtYWMtPmNsa190eCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShkd21hYy0+Y2xrX3J4KTsKKwlpZiAocmV0KQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZHdtYWMtPmNsa190eCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzdG0zMl9kd21hY19jbGtfZGlzYWJsZShzdHJ1Y3Qgc3RtMzJfZHdtYWMgKmR3bWFjKQoreworCWNsa19kaXNhYmxlX3VucHJlcGFyZShkd21hYy0+Y2xrX3R4KTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoZHdtYWMtPmNsa19yeCk7Cit9CisKK3N0YXRpYyBpbnQgc3RtMzJfZHdtYWNfcGFyc2VfZGF0YShzdHJ1Y3Qgc3RtMzJfZHdtYWMgKmR3bWFjLAorCQkJCSAgc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CisJaW50IGVycjsKKworCS8qICBHZXQgVFgvUlggY2xvY2tzICovCisJZHdtYWMtPmNsa190eCA9IGRldm1fY2xrX2dldChkZXYsICJtYWMtY2xrLXR4Iik7CisJaWYgKElTX0VSUihkd21hYy0+Y2xrX3R4KSkgeworCQlkZXZfZXJyKGRldiwgIk5vIHR4IGNsb2NrIHByb3ZpZGVkLi4uXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZHdtYWMtPmNsa190eCk7CisJfQorCWR3bWFjLT5jbGtfcnggPSBkZXZtX2Nsa19nZXQoZGV2LCAibWFjLWNsay1yeCIpOworCWlmIChJU19FUlIoZHdtYWMtPmNsa19yeCkpIHsKKwkJZGV2X2VycihkZXYsICJObyByeCBjbG9jayBwcm92aWRlZC4uLlxuIik7CisJCXJldHVybiBQVFJfRVJSKGR3bWFjLT5jbGtfcngpOworCX0KKworCS8qIEdldCBtb2RlIHJlZ2lzdGVyICovCisJZHdtYWMtPnJlZ21hcCA9IHN5c2Nvbl9yZWdtYXBfbG9va3VwX2J5X3BoYW5kbGUobnAsICJzdCxzeXNjb24iKTsKKwlpZiAoSVNfRVJSKGR3bWFjLT5yZWdtYXApKQorCQlyZXR1cm4gUFRSX0VSUihkd21hYy0+cmVnbWFwKTsKKworCWVyciA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2luZGV4KG5wLCAic3Qsc3lzY29uIiwgMSwgJmR3bWFjLT5tb2RlX3JlZyk7CisJaWYgKGVycikKKwkJZGV2X2VycihkZXYsICJDYW4ndCBnZXQgc3lzY29uZmlnIG1vZGUgb2Zmc2V0ICglZClcbiIsIGVycik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHN0bTMyX2R3bWFjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHBsYXRfc3RtbWFjZW5ldF9kYXRhICpwbGF0X2RhdDsKKwlzdHJ1Y3Qgc3RtbWFjX3Jlc291cmNlcyBzdG1tYWNfcmVzOworCXN0cnVjdCBzdG0zMl9kd21hYyAqZHdtYWM7CisJaW50IHJldDsKKworCXJldCA9IHN0bW1hY19nZXRfcGxhdGZvcm1fcmVzb3VyY2VzKHBkZXYsICZzdG1tYWNfcmVzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcGxhdF9kYXQgPSBzdG1tYWNfcHJvYmVfY29uZmlnX2R0KHBkZXYsICZzdG1tYWNfcmVzLm1hYyk7CisJaWYgKElTX0VSUihwbGF0X2RhdCkpCisJCXJldHVybiBQVFJfRVJSKHBsYXRfZGF0KTsKKworCWR3bWFjID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZHdtYWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWR3bWFjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IHN0bTMyX2R3bWFjX3BhcnNlX2RhdGEoZHdtYWMsICZwZGV2LT5kZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIHBhcnNlIE9GIGRhdGFcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXBsYXRfZGF0LT5ic3BfcHJpdiA9IGR3bWFjOworCisJcmV0ID0gc3RtMzJfZHdtYWNfaW5pdChwbGF0X2RhdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHN0bW1hY19kdnJfcHJvYmUoJnBkZXYtPmRldiwgcGxhdF9kYXQsICZzdG1tYWNfcmVzKTsKKwlpZiAocmV0KQorCQlzdG0zMl9kd21hY19jbGtfZGlzYWJsZShkd21hYyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHN0bTMyX2R3bWFjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHN0bW1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJaW50IHJldCA9IHN0bW1hY19kdnJfcmVtb3ZlKCZwZGV2LT5kZXYpOworCisJc3RtMzJfZHdtYWNfY2xrX2Rpc2FibGUocHJpdi0+cGxhdC0+YnNwX3ByaXYpOworCisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBzdG0zMl9kd21hY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCWludCByZXQ7CisKKwlyZXQgPSBzdG1tYWNfc3VzcGVuZChkZXYpOworCXN0bTMyX2R3bWFjX2Nsa19kaXNhYmxlKHByaXYtPnBsYXQtPmJzcF9wcml2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3RtMzJfZHdtYWNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCWludCByZXQ7CisKKwlyZXQgPSBzdG0zMl9kd21hY19pbml0KHByaXYtPnBsYXQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzdG1tYWNfcmVzdW1lKGRldik7CisKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmIC8qIENPTkZJR19QTV9TTEVFUCAqLworCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoc3RtMzJfZHdtYWNfcG1fb3BzLAorCXN0bTMyX2R3bWFjX3N1c3BlbmQsIHN0bTMyX2R3bWFjX3Jlc3VtZSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN0bTMyX2R3bWFjX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJzdCxzdG0zMi1kd21hYyJ9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHN0bTMyX2R3bWFjX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3RtMzJfZHdtYWNfZHJpdmVyID0geworCS5wcm9iZSAgPSBzdG0zMl9kd21hY19wcm9iZSwKKwkucmVtb3ZlID0gc3RtMzJfZHdtYWNfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJzdG0zMi1kd21hYyIsCisJCS5wbQkJPSAmc3RtMzJfZHdtYWNfcG1fb3BzLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBzdG0zMl9kd21hY19tYXRjaCwKKwl9LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3RtMzJfZHdtYWNfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiQWxleGFuZHJlIFRvcmd1ZSA8YWxleGFuZHJlLnRvcmd1ZUBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNUTWljcm9lbGVjdHJvbmljcyBNQ1UgRFdNQUMgU3BlY2lmaWMgR2x1ZSBsYXllciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvZHdtYWMxMDAwX2NvcmUuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL2R3bWFjMTAwMF9jb3JlLmMKaW5kZXggY2JlZmU5ZS4uN2RmNGZmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvZHdtYWMxMDAwX2NvcmUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9kd21hYzEwMDBfY29yZS5jCkBAIC0xNDUsNyArMTQ1LDcgQEAKIAkJbnVtaGFzaHJlZ3MgPSA4OwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcl9kZWJ1ZygiU1RNTUFDOiBlcnIgaW4gc2V0dGluZyBtdWxpdGNhc3QgZmlsdGVyXG4iKTsKKwkJcHJfZGVidWcoIlNUTU1BQzogZXJyIGluIHNldHRpbmcgbXVsdGljYXN0IGZpbHRlclxuIik7CiAJCXJldHVybjsKIAkJYnJlYWs7CiAJfQpAQCAtMjYxLDcgKzI2MSw3IEBACiAJfQogCWlmIChtb2RlICYgV0FLRV9VQ0FTVCkgewogCQlwcl9kZWJ1ZygiR01BQzogV09MIG9uIGdsb2JhbCB1bmljYXN0XG4iKTsKLQkJcG10IHw9IGdsb2JhbF91bmljYXN0OworCQlwbXQgfD0gcG93ZXJfZG93biB8IGdsb2JhbF91bmljYXN0IHwgd2FrZV91cF9mcmFtZV9lbjsKIAl9CiAKIAl3cml0ZWwocG10LCBpb2FkZHIgKyBHTUFDX1BNVCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9kd21hYzRfY29yZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvZHdtYWM0X2NvcmUuYwppbmRleCBkZjU1ODBkLi41MTAxOWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9kd21hYzRfY29yZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL2R3bWFjNF9jb3JlLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogCX0KIAlpZiAobW9kZSAmIFdBS0VfVUNBU1QpIHsKIAkJcHJfZGVidWcoIkdNQUM6IFdPTCBvbiBnbG9iYWwgdW5pY2FzdFxuIik7Ci0JCXBtdCB8PSBnbG9iYWxfdW5pY2FzdDsKKwkJcG10IHw9IHBvd2VyX2Rvd24gfCBnbG9iYWxfdW5pY2FzdCB8IHdha2VfdXBfZnJhbWVfZW47CiAJfQogCiAJd3JpdGVsKHBtdCwgaW9hZGRyICsgR01BQ19QTVQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvc3RtbWFjX3BsYXRmb3JtLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9zdG1tYWNfcGxhdGZvcm0uYwppbmRleCA3NTZiYjU0Li4wYTBkNmE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9zdG1tYWNfcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9zdG1tYWNfcGxhdGZvcm0uYwpAQCAtMjY1LDYgKzI2NSw3IEBACiAJICogb25jZSBuZWVkZWQgb24gb3RoZXIgcGxhdGZvcm1zLgogCSAqLwogCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgInN0LHNwZWFyNjAwLWdtYWMiKSB8fAorCQlvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgInNucHMsZHdtYWMtMy41MGEiKSB8fAogCQlvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgInNucHMsZHdtYWMtMy43MGEiKSB8fAogCQlvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgInNucHMsZHdtYWMiKSkgewogCQkvKiBOb3RlIHRoYXQgdGhlIG1heC1mcmFtZS1zaXplIHBhcmFtZXRlciBhcyBkZWZpbmVkIGluIHRoZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvc3RtbWFjX3B0cC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvc3RtbWFjX3B0cC5jCmluZGV4IDE3MGExOGIuLjZlM2I4MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hY19wdHAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9zdG1tYWNfcHRwLmMKQEAgLTE4Nyw3ICsxODcsNyBAQAogCWlmIChJU19FUlIocHJpdi0+cHRwX2Nsb2NrKSkgewogCQlwcml2LT5wdHBfY2xvY2sgPSBOVUxMOwogCQlwcl9lcnIoInB0cF9jbG9ja19yZWdpc3RlcigpIGZhaWxlZCBvbiAlc1xuIiwgcHJpdi0+ZGV2LT5uYW1lKTsKLQl9IGVsc2UKKwl9IGVsc2UgaWYgKHByaXYtPnB0cF9jbG9jaykKIAkJcHJfZGVidWcoIkFkZGVkIFBUUCBIVyBjbG9jayBzdWNjZXNzZnVsbHkgb24gJXNcbiIsCiAJCQkgcHJpdi0+ZGV2LT5uYW1lKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3lub3BzeXMvZHdjX2V0aF9xb3MuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N5bm9wc3lzL2R3Y19ldGhfcW9zLmMKaW5kZXggOWYxNTlhNy4uMGQwMDUzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3lub3BzeXMvZHdjX2V0aF9xb3MuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zeW5vcHN5cy9kd2NfZXRoX3Fvcy5jCkBAIC0xMjQ2LDcgKzEyNDYsNyBAQAogCWxwLT5taWlfYnVzLT5yZWFkICA9ICZkd2NlcW9zX21kaW9fcmVhZDsKIAlscC0+bWlpX2J1cy0+d3JpdGUgPSAmZHdjZXFvc19tZGlvX3dyaXRlOwogCWxwLT5taWlfYnVzLT5wcml2ID0gbHA7Ci0JbHAtPm1paV9idXMtPnBhcmVudCA9ICZscC0+bmRldi0+ZGV2OworCWxwLT5taWlfYnVzLT5wYXJlbnQgPSAmbHAtPnBkZXYtPmRldjsKIAogCW9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobHAtPnBkZXYtPmRldi5vZl9ub2RlLCAwLCAmcmVzKTsKIAlzbnByaW50ZihscC0+bWlpX2J1cy0+aWQsIE1JSV9CVVNfSURfU0laRSwgIiUuOGxseCIsCkBAIC0xNjIyLDEzICsxNjIyLDcgQEAKIAkJRFdDRVFPU19NTUNfQ1RSTF9SU1RPTlJEKTsKIAlkd2NlcW9zX2VuYWJsZV9tbWNfaW50ZXJydXB0KGxwKTsKIAotCS8qIEVuYWJsZSBJbnRlcnJ1cHRzICovCi0JZHdjZXFvc193cml0ZShscCwgUkVHX0RXQ0VRT1NfRE1BX0NIMF9JRSwKLQkJICAgICAgRFdDRVFPU19ETUFfQ0gwX0lFX05JRSB8Ci0JCSAgICAgIERXQ0VRT1NfRE1BX0NIMF9JRV9SSUUgfCBEV0NFUU9TX0RNQV9DSDBfSUVfVElFIHwKLQkJICAgICAgRFdDRVFPU19ETUFfQ0gwX0lFX0FJRSB8Ci0JCSAgICAgIERXQ0VRT1NfRE1BX0NIMF9JRV9GQkVFKTsKLQorCWR3Y2Vxb3Nfd3JpdGUobHAsIFJFR19EV0NFUU9TX0RNQV9DSDBfSUUsIDApOwogCWR3Y2Vxb3Nfd3JpdGUobHAsIFJFR19EV0NFUU9TX01BQ19JRSwgMCk7CiAKIAlkd2NlcW9zX3dyaXRlKGxwLCBSRUdfRFdDRVFPU19NQUNfQ0ZHLCBEV0NFUU9TX01BQ19DRkdfSVBDIHwKQEAgLTE5MDUsNiArMTg5OSwxNSBAQAogCW5ldGlmX3N0YXJ0X3F1ZXVlKG5kZXYpOwogCXRhc2tsZXRfZW5hYmxlKCZscC0+dHhfYmRyZWNsYWltX3Rhc2tsZXQpOwogCisJLyogRW5hYmxlIEludGVycnVwdHMgLS0gZG8gdGhpcyBvbmx5IGFmdGVyIHdlIGVuYWJsZSBOQVBJIGFuZCB0aGUKKwkgKiB0YXNrbGV0LgorCSAqLworCWR3Y2Vxb3Nfd3JpdGUobHAsIFJFR19EV0NFUU9TX0RNQV9DSDBfSUUsCisJCSAgICAgIERXQ0VRT1NfRE1BX0NIMF9JRV9OSUUgfAorCQkgICAgICBEV0NFUU9TX0RNQV9DSDBfSUVfUklFIHwgRFdDRVFPU19ETUFfQ0gwX0lFX1RJRSB8CisJCSAgICAgIERXQ0VRT1NfRE1BX0NIMF9JRV9BSUUgfAorCQkgICAgICBEV0NFUU9TX0RNQV9DSDBfSUVfRkJFRSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjc0MCw3ICsyNzQzLDcgQEAKIAlscC0+bXNnX2VuYWJsZSA9IG1zZ2xldmVsOwogfQogCi1zdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGR3Y2Vxb3NfZXRodG9vbF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGR3Y2Vxb3NfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9kcnZpbmZvICAgID0gZHdjZXFvc19nZXRfZHJ2aW5mbywKIAkuZ2V0X2xpbmsgICAgICAgPSBldGh0b29sX29wX2dldF9saW5rLAogCS5nZXRfcGF1c2VwYXJhbSA9IGR3Y2Vxb3NfZ2V0X3BhdXNlcGFyYW0sCkBAIC0yNzU4LDcgKzI3NjEsNyBAQAogCS5zZXRfbGlua19rc2V0dGluZ3MgPSBwaHlfZXRodG9vbF9zZXRfbGlua19rc2V0dGluZ3MsCiB9OwogCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIG5ldGRldl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIG5ldGRldl9vcHMgPSB7CiAJLm5kb19vcGVuCQk9IGR3Y2Vxb3Nfb3BlbiwKIAkubmRvX3N0b3AJCT0gZHdjZXFvc19zdG9wLAogCS5uZG9fc3RhcnRfeG1pdAkJPSBkd2NlcW9zX3N0YXJ0X3htaXQsCkBAIC0yODUwLDI1ICsyODUzLDE3IEBACiAKIAluZGV2LT5mZWF0dXJlcyA9IG5kZXYtPmh3X2ZlYXR1cmVzOwogCi0JbmV0aWZfbmFwaV9hZGQobmRldiwgJmxwLT5uYXBpLCBkd2NlcW9zX3J4X3BvbGwsIE5BUElfUE9MTF9XRUlHSFQpOwotCi0JcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2UsIGFib3J0aW5nLlxuIik7Ci0JCWdvdG8gZXJyX291dF9jbGtfZGlzX2FwZXI7Ci0JfQotCiAJbHAtPnBoeV9yZWZfY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJwaHlfcmVmX2NsayIpOwogCWlmIChJU19FUlIobHAtPnBoeV9yZWZfY2xrKSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwaHlfcmVmX2NsayBjbG9jayBub3QgZm91bmQuXG4iKTsKIAkJcmV0ID0gUFRSX0VSUihscC0+cGh5X3JlZl9jbGspOwotCQlnb3RvIGVycl9vdXRfdW5yZWdpc3Rlcl9uZXRkZXY7CisJCWdvdG8gZXJyX291dF9jbGtfZGlzX2FwZXI7CiAJfQogCiAJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGxwLT5waHlfcmVmX2Nsayk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gZW5hYmxlIGRldmljZSBjbG9jay5cbiIpOwotCQlnb3RvIGVycl9vdXRfdW5yZWdpc3Rlcl9uZXRkZXY7CisJCWdvdG8gZXJyX291dF9jbGtfZGlzX2FwZXI7CiAJfQogCiAJbHAtPnBoeV9ub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShscC0+cGRldi0+ZGV2Lm9mX25vZGUsCkBAIC0yODc3LDcgKzI4NzIsNyBAQAogCQlyZXQgPSBvZl9waHlfcmVnaXN0ZXJfZml4ZWRfbGluayhscC0+cGRldi0+ZGV2Lm9mX25vZGUpOwogCQlpZiAocmV0IDwgMCkgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiaW52YWxpZCBmaXhlZC1saW5rIik7Ci0JCQlnb3RvIGVycl9vdXRfdW5yZWdpc3Rlcl9jbGtfbm90aWZpZXI7CisJCQlnb3RvIGVycl9vdXRfY2xrX2Rpc19waHk7CiAJCX0KIAogCQlscC0+cGh5X25vZGUgPSBvZl9ub2RlX2dldChscC0+cGRldi0+ZGV2Lm9mX25vZGUpOwpAQCAtMjg4Niw3ICsyODgxLDcgQEAKIAlyZXQgPSBvZl9nZXRfcGh5X21vZGUobHAtPnBkZXYtPmRldi5vZl9ub2RlKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZscC0+cGRldi0+ZGV2LCAiZXJyb3IgaW4gZ2V0dGluZyBwaHkgaS9mXG4iKTsKLQkJZ290byBlcnJfb3V0X3VucmVnaXN0ZXJfY2xrX25vdGlmaWVyOworCQlnb3RvIGVycl9vdXRfY2xrX2Rpc19waHk7CiAJfQogCiAJbHAtPnBoeV9pbnRlcmZhY2UgPSByZXQ7CkBAIC0yODk0LDE0ICsyODg5LDE0IEBACiAJcmV0ID0gZHdjZXFvc19taWlfaW5pdChscCk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZscC0+cGRldi0+ZGV2LCAiZXJyb3IgaW4gZHdjZXFvc19taWlfaW5pdFxuIik7Ci0JCWdvdG8gZXJyX291dF91bnJlZ2lzdGVyX2Nsa19ub3RpZmllcjsKKwkJZ290byBlcnJfb3V0X2Nsa19kaXNfcGh5OwogCX0KIAogCXJldCA9IGR3Y2Vxb3NfbWlpX3Byb2JlKG5kZXYpOwogCWlmIChyZXQgIT0gMCkgewogCQluZXRkZXZfZXJyKG5kZXYsICJtaWlfcHJvYmUgZmFpbC5cbiIpOwogCQlyZXQgPSAtRU5YSU87Ci0JCWdvdG8gZXJyX291dF91bnJlZ2lzdGVyX2Nsa19ub3RpZmllcjsKKwkJZ290byBlcnJfb3V0X2Nsa19kaXNfcGh5OwogCX0KIAogCWR3Y2Vxb3Nfc2V0X3VtYWNfYWRkcihscCwgbHAtPm5kZXYtPmRldl9hZGRyLCAwKTsKQEAgLTI5MTksNyArMjkxNCw3IEBACiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZscC0+cGRldi0+ZGV2LCAiVW5hYmxlIHRvIHJldHJpZXZlIERULCBlcnJvciAlZFxuIiwKIAkJCXJldCk7Ci0JCWdvdG8gZXJyX291dF91bnJlZ2lzdGVyX2Nsa19ub3RpZmllcjsKKwkJZ290byBlcnJfb3V0X2Nsa19kaXNfcGh5OwogCX0KIAlkZXZfaW5mbygmbHAtPnBkZXYtPmRldiwgInBkZXYtPmlkICVkLCBiYXNlYWRkciAweCUwOGx4LCBpcnEgJWRcbiIsCiAJCSBwZGV2LT5pZCwgbmRldi0+YmFzZV9hZGRyLCBuZGV2LT5pcnEpOwpAQCAtMjkyOSwxOCArMjkyNCwyNCBAQAogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmbHAtPnBkZXYtPmRldiwgIlVuYWJsZSB0byByZXF1ZXN0IElSUSAlZCwgZXJyb3IgJWRcbiIsCiAJCQluZGV2LT5pcnEsIHJldCk7Ci0JCWdvdG8gZXJyX291dF91bnJlZ2lzdGVyX2Nsa19ub3RpZmllcjsKKwkJZ290byBlcnJfb3V0X2Nsa19kaXNfcGh5OwogCX0KIAogCWlmIChuZXRpZl9tc2dfcHJvYmUobHApKQogCQluZXRkZXZfZGJnKG5kZXYsICJuZXRfbG9jYWxAJXBcbiIsIGxwKTsKIAorCW5ldGlmX25hcGlfYWRkKG5kZXYsICZscC0+bmFwaSwgZHdjZXFvc19yeF9wb2xsLCBOQVBJX1BPTExfV0VJR0hUKTsKKworCXJldCA9IHJlZ2lzdGVyX25ldGRldihuZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlLCBhYm9ydGluZy5cbiIpOworCQkJZ290byBlcnJfb3V0X2Nsa19kaXNfcGh5OworCX0KKwogCXJldHVybiAwOwogCi1lcnJfb3V0X3VucmVnaXN0ZXJfY2xrX25vdGlmaWVyOgorZXJyX291dF9jbGtfZGlzX3BoeToKIAljbGtfZGlzYWJsZV91bnByZXBhcmUobHAtPnBoeV9yZWZfY2xrKTsKLWVycl9vdXRfdW5yZWdpc3Rlcl9uZXRkZXY6Ci0JdW5yZWdpc3Rlcl9uZXRkZXYobmRldik7CiBlcnJfb3V0X2Nsa19kaXNfYXBlcjoKIAljbGtfZGlzYWJsZV91bnByZXBhcmUobHAtPmFwYl9wY2xrKTsKIGVycl9vdXRfZnJlZV9uZXRkZXY6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90ZWh1dGkvdGVodXRpLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90ZWh1dGkvdGVodXRpLmMKaW5kZXggNzQ1MmI1Zi4uNzEwOGM2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGVodXRpL3RlaHV0aS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RlaHV0aS90ZWh1dGkuYwpAQCAtMTk4Nyw3ICsxOTg3LDcgQEAKIAlpZiAoKHJlYWRsKG5pYy0+cmVncyArIEZQR0FfVkVSKSAmIDB4RkZGKSA+PSAzNzgpIHsKIAkJZXJyID0gcGNpX2VuYWJsZV9tc2kocGRldik7CiAJCWlmIChlcnIpCi0JCQlwcl9lcnIoIkNhbid0IGVuZWJsZSBtc2kuIGVycm9yIGlzICVkXG4iLCBlcnIpOworCQkJcHJfZXJyKCJDYW4ndCBlbmFibGUgbXNpLiBlcnJvciBpcyAlZFxuIiwgZXJyKTsKIAkJZWxzZQogCQkJbmljLT5pcnFfdHlwZSA9IElSUV9NU0k7CiAJfSBlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9jcG1hYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvY3BtYWMuYwppbmRleCBkMzAwZDUzLi5mYTBjZmRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9jcG1hYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2NwbWFjLmMKQEAgLTU0Niw3ICs1NDYsOCBAQAogCiBzdGF0aWMgaW50IGNwbWFjX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlpbnQgcXVldWUsIGxlbjsKKwlpbnQgcXVldWU7CisJdW5zaWduZWQgaW50IGxlbjsKIAlzdHJ1Y3QgY3BtYWNfZGVzYyAqZGVzYzsKIAlzdHJ1Y3QgY3BtYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAKQEAgLTU1Niw3ICs1NTcsNyBAQAogCWlmICh1bmxpa2VseShza2JfcGFkdG8oc2tiLCBFVEhfWkxFTikpKQogCQlyZXR1cm4gTkVUREVWX1RYX09LOwogCi0JbGVuID0gbWF4KHNrYi0+bGVuLCBFVEhfWkxFTik7CisJbGVuID0gbWF4X3QodW5zaWduZWQgaW50LCBza2ItPmxlbiwgRVRIX1pMRU4pOwogCXF1ZXVlID0gc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYik7CiAJbmV0aWZfc3RvcF9zdWJxdWV1ZShkZXYsIHF1ZXVlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvY3Bzdy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvY3Bzdy5jCmluZGV4IGM1MWYzNDYuLmM2Y2ZmM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2Nwc3cuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9jcHN3LmMKQEAgLTEyNCw3ICsxMjQsNyBAQAogCiAjZGVmaW5lIFJYX1BSSU9SSVRZX01BUFBJTkcJMHg3NjU0MzIxMAogI2RlZmluZSBUWF9QUklPUklUWV9NQVBQSU5HCTB4MzMyMjExMDAKLSNkZWZpbmUgQ1BETUFfVFhfUFJJT1JJVFlfTUFQCTB4NzY1NDMyMTAKKyNkZWZpbmUgQ1BETUFfVFhfUFJJT1JJVFlfTUFQCTB4MDEyMzQ1NjcKIAogI2RlZmluZSBDUFNXX1ZMQU5fQVdBUkUJCUJJVCgxKQogI2RlZmluZSBDUFNXX0FMRV9WTEFOX0FXQVJFCTEKQEAgLTE0MCw5ICsxNDAsMTEgQEAKICNkZWZpbmUgQ1BTV19DTUlOVE1BWF9JTlRWTAkoMTAwMCAvIENQU1dfQ01JTlRNSU5fQ05UKQogI2RlZmluZSBDUFNXX0NNSU5UTUlOX0lOVFZMCSgoMTAwMCAvIENQU1dfQ01JTlRNQVhfQ05UKSArIDEpCiAKLSNkZWZpbmUgY3Bzd19zbGF2ZV9pbmRleChwcml2KQkJCQlcCi0JCSgocHJpdi0+ZGF0YS5kdWFsX2VtYWMpID8gcHJpdi0+ZW1hY19wb3J0IDoJXAotCQlwcml2LT5kYXRhLmFjdGl2ZV9zbGF2ZSkKKyNkZWZpbmUgY3Bzd19zbGF2ZV9pbmRleChjcHN3LCBwcml2KQkJCQlcCisJCSgoY3Bzdy0+ZGF0YS5kdWFsX2VtYWMpID8gcHJpdi0+ZW1hY19wb3J0IDoJXAorCQljcHN3LT5kYXRhLmFjdGl2ZV9zbGF2ZSkKKyNkZWZpbmUgSVJRX05VTQkJCTIKKyNkZWZpbmUgQ1BTV19NQVhfUVVFVUVTCQk4CiAKIHN0YXRpYyBpbnQgZGVidWdfbGV2ZWw7CiBtb2R1bGVfcGFyYW0oZGVidWdfbGV2ZWwsIGludCwgMCk7CkBAIC0zNjMsMzggKzM2NSw0MSBAQAogCV9fcmF3X3dyaXRlbCh2YWwsIHNsYXZlLT5yZWdzICsgb2Zmc2V0KTsKIH0KIAotc3RydWN0IGNwc3dfcHJpdiB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZQkJKnBkZXY7Ci0Jc3RydWN0IG5ldF9kZXZpY2UJCSpuZGV2OwotCXN0cnVjdCBuYXBpX3N0cnVjdAkJbmFwaV9yeDsKLQlzdHJ1Y3QgbmFwaV9zdHJ1Y3QJCW5hcGlfdHg7CitzdHJ1Y3QgY3Bzd19jb21tb24gewogCXN0cnVjdCBkZXZpY2UJCQkqZGV2OwogCXN0cnVjdCBjcHN3X3BsYXRmb3JtX2RhdGEJZGF0YTsKKwlzdHJ1Y3QgbmFwaV9zdHJ1Y3QJCW5hcGlfcng7CisJc3RydWN0IG5hcGlfc3RydWN0CQluYXBpX3R4OwogCXN0cnVjdCBjcHN3X3NzX3JlZ3MgX19pb21lbQkqcmVnczsKIAlzdHJ1Y3QgY3Bzd193cl9yZWdzIF9faW9tZW0JKndyX3JlZ3M7CiAJdTggX19pb21lbQkJCSpod19zdGF0czsKIAlzdHJ1Y3QgY3Bzd19ob3N0X3JlZ3MgX19pb21lbQkqaG9zdF9wb3J0X3JlZ3M7Ci0JdTMyCQkJCW1zZ19lbmFibGU7CiAJdTMyCQkJCXZlcnNpb247CiAJdTMyCQkJCWNvYWxfaW50dmw7CiAJdTMyCQkJCWJ1c19mcmVxX21oejsKIAlpbnQJCQkJcnhfcGFja2V0X21heDsKLQlzdHJ1Y3QgY2xrCQkJKmNsazsKLQl1OAkJCQltYWNfYWRkcltFVEhfQUxFTl07CiAJc3RydWN0IGNwc3dfc2xhdmUJCSpzbGF2ZXM7CiAJc3RydWN0IGNwZG1hX2N0bHIJCSpkbWE7Ci0Jc3RydWN0IGNwZG1hX2NoYW4JCSp0eGNoLCAqcnhjaDsKKwlzdHJ1Y3QgY3BkbWFfY2hhbgkJKnR4Y2hbQ1BTV19NQVhfUVVFVUVTXTsKKwlzdHJ1Y3QgY3BkbWFfY2hhbgkJKnJ4Y2hbQ1BTV19NQVhfUVVFVUVTXTsKIAlzdHJ1Y3QgY3Bzd19hbGUJCQkqYWxlOwotCWJvb2wJCQkJcnhfcGF1c2U7Ci0JYm9vbAkJCQl0eF9wYXVzZTsKIAlib29sCQkJCXF1aXJrX2lycTsKIAlib29sCQkJCXJ4X2lycV9kaXNhYmxlZDsKIAlib29sCQkJCXR4X2lycV9kaXNhYmxlZDsKLQkvKiBzbmFwc2hvdCBvZiBJUlEgbnVtYmVycyAqLwotCXUzMiBpcnFzX3RhYmxlWzRdOwotCXUzMiBudW1faXJxczsKLQlzdHJ1Y3QgY3B0cyAqY3B0czsKKwl1MzIgaXJxc190YWJsZVtJUlFfTlVNXTsKKwlzdHJ1Y3QgY3B0cwkJCSpjcHRzOworCWludAkJCQlyeF9jaF9udW0sIHR4X2NoX251bTsKK307CisKK3N0cnVjdCBjcHN3X3ByaXYgeworCXN0cnVjdCBuZXRfZGV2aWNlCQkqbmRldjsKKwlzdHJ1Y3QgZGV2aWNlCQkJKmRldjsKKwl1MzIJCQkJbXNnX2VuYWJsZTsKKwl1OAkJCQltYWNfYWRkcltFVEhfQUxFTl07CisJYm9vbAkJCQlyeF9wYXVzZTsKKwlib29sCQkJCXR4X3BhdXNlOwogCXUzMiBlbWFjX3BvcnQ7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3OwogfTsKIAogc3RydWN0IGNwc3dfc3RhdHMgewpAQCAtNDU1LDEwOCArNDYwLDkyIEBACiAJeyAiUnggU3RhcnQgb2YgRnJhbWUgT3ZlcnJ1bnMiLCBDUFNXX1NUQVQocnhzb2ZvdmVycnVucykgfSwKIAl7ICJSeCBNaWRkbGUgb2YgRnJhbWUgT3ZlcnJ1bnMiLCBDUFNXX1NUQVQocnhtb2ZvdmVycnVucykgfSwKIAl7ICJSeCBETUEgT3ZlcnJ1bnMiLCBDUFNXX1NUQVQocnhkbWFvdmVycnVucykgfSwKLQl7ICJSeCBETUEgY2hhbjogaGVhZF9lbnF1ZXVlIiwgQ1BETUFfUlhfU1RBVChoZWFkX2VucXVldWUpIH0sCi0JeyAiUnggRE1BIGNoYW46IHRhaWxfZW5xdWV1ZSIsIENQRE1BX1JYX1NUQVQodGFpbF9lbnF1ZXVlKSB9LAotCXsgIlJ4IERNQSBjaGFuOiBwYWRfZW5xdWV1ZSIsIENQRE1BX1JYX1NUQVQocGFkX2VucXVldWUpIH0sCi0JeyAiUnggRE1BIGNoYW46IG1pc3F1ZXVlZCIsIENQRE1BX1JYX1NUQVQobWlzcXVldWVkKSB9LAotCXsgIlJ4IERNQSBjaGFuOiBkZXNjX2FsbG9jX2ZhaWwiLCBDUERNQV9SWF9TVEFUKGRlc2NfYWxsb2NfZmFpbCkgfSwKLQl7ICJSeCBETUEgY2hhbjogcGFkX2FsbG9jX2ZhaWwiLCBDUERNQV9SWF9TVEFUKHBhZF9hbGxvY19mYWlsKSB9LAotCXsgIlJ4IERNQSBjaGFuOiBydW50X3JlY2VpdmVfYnVmIiwgQ1BETUFfUlhfU1RBVChydW50X3JlY2VpdmVfYnVmZikgfSwKLQl7ICJSeCBETUEgY2hhbjogcnVudF90cmFuc21pdF9idWYiLCBDUERNQV9SWF9TVEFUKHJ1bnRfdHJhbnNtaXRfYnVmZikgfSwKLQl7ICJSeCBETUEgY2hhbjogZW1wdHlfZGVxdWV1ZSIsIENQRE1BX1JYX1NUQVQoZW1wdHlfZGVxdWV1ZSkgfSwKLQl7ICJSeCBETUEgY2hhbjogYnVzeV9kZXF1ZXVlIiwgQ1BETUFfUlhfU1RBVChidXN5X2RlcXVldWUpIH0sCi0JeyAiUnggRE1BIGNoYW46IGdvb2RfZGVxdWV1ZSIsIENQRE1BX1JYX1NUQVQoZ29vZF9kZXF1ZXVlKSB9LAotCXsgIlJ4IERNQSBjaGFuOiByZXF1ZXVlIiwgQ1BETUFfUlhfU1RBVChyZXF1ZXVlKSB9LAotCXsgIlJ4IERNQSBjaGFuOiB0ZWFyZG93bl9kZXF1ZXVlIiwgQ1BETUFfUlhfU1RBVCh0ZWFyZG93bl9kZXF1ZXVlKSB9LAotCXsgIlR4IERNQSBjaGFuOiBoZWFkX2VucXVldWUiLCBDUERNQV9UWF9TVEFUKGhlYWRfZW5xdWV1ZSkgfSwKLQl7ICJUeCBETUEgY2hhbjogdGFpbF9lbnF1ZXVlIiwgQ1BETUFfVFhfU1RBVCh0YWlsX2VucXVldWUpIH0sCi0JeyAiVHggRE1BIGNoYW46IHBhZF9lbnF1ZXVlIiwgQ1BETUFfVFhfU1RBVChwYWRfZW5xdWV1ZSkgfSwKLQl7ICJUeCBETUEgY2hhbjogbWlzcXVldWVkIiwgQ1BETUFfVFhfU1RBVChtaXNxdWV1ZWQpIH0sCi0JeyAiVHggRE1BIGNoYW46IGRlc2NfYWxsb2NfZmFpbCIsIENQRE1BX1RYX1NUQVQoZGVzY19hbGxvY19mYWlsKSB9LAotCXsgIlR4IERNQSBjaGFuOiBwYWRfYWxsb2NfZmFpbCIsIENQRE1BX1RYX1NUQVQocGFkX2FsbG9jX2ZhaWwpIH0sCi0JeyAiVHggRE1BIGNoYW46IHJ1bnRfcmVjZWl2ZV9idWYiLCBDUERNQV9UWF9TVEFUKHJ1bnRfcmVjZWl2ZV9idWZmKSB9LAotCXsgIlR4IERNQSBjaGFuOiBydW50X3RyYW5zbWl0X2J1ZiIsIENQRE1BX1RYX1NUQVQocnVudF90cmFuc21pdF9idWZmKSB9LAotCXsgIlR4IERNQSBjaGFuOiBlbXB0eV9kZXF1ZXVlIiwgQ1BETUFfVFhfU1RBVChlbXB0eV9kZXF1ZXVlKSB9LAotCXsgIlR4IERNQSBjaGFuOiBidXN5X2RlcXVldWUiLCBDUERNQV9UWF9TVEFUKGJ1c3lfZGVxdWV1ZSkgfSwKLQl7ICJUeCBETUEgY2hhbjogZ29vZF9kZXF1ZXVlIiwgQ1BETUFfVFhfU1RBVChnb29kX2RlcXVldWUpIH0sCi0JeyAiVHggRE1BIGNoYW46IHJlcXVldWUiLCBDUERNQV9UWF9TVEFUKHJlcXVldWUpIH0sCi0JeyAiVHggRE1BIGNoYW46IHRlYXJkb3duX2RlcXVldWUiLCBDUERNQV9UWF9TVEFUKHRlYXJkb3duX2RlcXVldWUpIH0sCiB9OwogCi0jZGVmaW5lIENQU1dfU1RBVFNfTEVOCUFSUkFZX1NJWkUoY3Bzd19nc3RyaW5nc19zdGF0cykKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3Bzd19zdGF0cyBjcHN3X2dzdHJpbmdzX2NoX3N0YXRzW10gPSB7CisJeyAiaGVhZF9lbnF1ZXVlIiwgQ1BETUFfUlhfU1RBVChoZWFkX2VucXVldWUpIH0sCisJeyAidGFpbF9lbnF1ZXVlIiwgQ1BETUFfUlhfU1RBVCh0YWlsX2VucXVldWUpIH0sCisJeyAicGFkX2VucXVldWUiLCBDUERNQV9SWF9TVEFUKHBhZF9lbnF1ZXVlKSB9LAorCXsgIm1pc3F1ZXVlZCIsIENQRE1BX1JYX1NUQVQobWlzcXVldWVkKSB9LAorCXsgImRlc2NfYWxsb2NfZmFpbCIsIENQRE1BX1JYX1NUQVQoZGVzY19hbGxvY19mYWlsKSB9LAorCXsgInBhZF9hbGxvY19mYWlsIiwgQ1BETUFfUlhfU1RBVChwYWRfYWxsb2NfZmFpbCkgfSwKKwl7ICJydW50X3JlY2VpdmVfYnVmIiwgQ1BETUFfUlhfU1RBVChydW50X3JlY2VpdmVfYnVmZikgfSwKKwl7ICJydW50X3RyYW5zbWl0X2J1ZiIsIENQRE1BX1JYX1NUQVQocnVudF90cmFuc21pdF9idWZmKSB9LAorCXsgImVtcHR5X2RlcXVldWUiLCBDUERNQV9SWF9TVEFUKGVtcHR5X2RlcXVldWUpIH0sCisJeyAiYnVzeV9kZXF1ZXVlIiwgQ1BETUFfUlhfU1RBVChidXN5X2RlcXVldWUpIH0sCisJeyAiZ29vZF9kZXF1ZXVlIiwgQ1BETUFfUlhfU1RBVChnb29kX2RlcXVldWUpIH0sCisJeyAicmVxdWV1ZSIsIENQRE1BX1JYX1NUQVQocmVxdWV1ZSkgfSwKKwl7ICJ0ZWFyZG93bl9kZXF1ZXVlIiwgQ1BETUFfUlhfU1RBVCh0ZWFyZG93bl9kZXF1ZXVlKSB9LAorfTsKIAotI2RlZmluZSBuYXBpX3RvX3ByaXYobmFwaSkJY29udGFpbmVyX29mKG5hcGksIHN0cnVjdCBjcHN3X3ByaXYsIG5hcGkpCisjZGVmaW5lIENQU1dfU1RBVFNfQ09NTU9OX0xFTglBUlJBWV9TSVpFKGNwc3dfZ3N0cmluZ3Nfc3RhdHMpCisjZGVmaW5lIENQU1dfU1RBVFNfQ0hfTEVOCUFSUkFZX1NJWkUoY3Bzd19nc3RyaW5nc19jaF9zdGF0cykKKworI2RlZmluZSBuZGV2X3RvX2Nwc3cobmRldikgKCgoc3RydWN0IGNwc3dfcHJpdiAqKW5ldGRldl9wcml2KG5kZXYpKS0+Y3BzdykKKyNkZWZpbmUgbmFwaV90b19jcHN3KG5hcGkpCWNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgY3Bzd19jb21tb24sIG5hcGkpCiAjZGVmaW5lIGZvcl9lYWNoX3NsYXZlKHByaXYsIGZ1bmMsIGFyZy4uLikJCQkJXAogCWRvIHsJCQkJCQkJCVwKIAkJc3RydWN0IGNwc3dfc2xhdmUgKnNsYXZlOwkJCQlcCisJCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IChwcml2KS0+Y3BzdzsJCVwKIAkJaW50IG47CQkJCQkJCVwKLQkJaWYgKHByaXYtPmRhdGEuZHVhbF9lbWFjKQkJCQlcCi0JCQkoZnVuYykoKHByaXYpLT5zbGF2ZXMgKyBwcml2LT5lbWFjX3BvcnQsICMjYXJnKTtcCisJCWlmIChjcHN3LT5kYXRhLmR1YWxfZW1hYykJCQkJXAorCQkJKGZ1bmMpKChjcHN3KS0+c2xhdmVzICsgcHJpdi0+ZW1hY19wb3J0LCAjI2FyZyk7XAogCQllbHNlCQkJCQkJCVwKLQkJCWZvciAobiA9IChwcml2KS0+ZGF0YS5zbGF2ZXMsCQkJXAotCQkJCQlzbGF2ZSA9IChwcml2KS0+c2xhdmVzOwkJXAorCQkJZm9yIChuID0gY3Bzdy0+ZGF0YS5zbGF2ZXMsCQkJXAorCQkJCQlzbGF2ZSA9IGNwc3ctPnNsYXZlczsJCVwKIAkJCQkJbjsgbi0tKQkJCQlcCiAJCQkJKGZ1bmMpKHNsYXZlKyssICMjYXJnKTsJCQlcCiAJfSB3aGlsZSAoMCkKLSNkZWZpbmUgY3Bzd19nZXRfc2xhdmVfbmRldihwcml2LCBfX3NsYXZlX25vX18pCQkJCVwKLQkoKF9fc2xhdmVfbm9fXyA8IHByaXYtPmRhdGEuc2xhdmVzKSA/CQkJCVwKLQkJcHJpdi0+c2xhdmVzW19fc2xhdmVfbm9fX10ubmRldiA6IE5VTEwpCi0jZGVmaW5lIGNwc3dfZ2V0X3NsYXZlX3ByaXYocHJpdiwgX19zbGF2ZV9ub19fKQkJCQlcCi0JKCgoX19zbGF2ZV9ub19fIDwgcHJpdi0+ZGF0YS5zbGF2ZXMpICYmCQkJCVwKLQkJKHByaXYtPnNsYXZlc1tfX3NsYXZlX25vX19dLm5kZXYpKSA/CQkJXAotCQluZXRkZXZfcHJpdihwcml2LT5zbGF2ZXNbX19zbGF2ZV9ub19fXS5uZGV2KSA6IE5VTEwpCVwKIAotI2RlZmluZSBjcHN3X2R1YWxfZW1hY19zcmNfcG9ydF9kZXRlY3Qoc3RhdHVzLCBwcml2LCBuZGV2LCBza2IpCQlcCisjZGVmaW5lIGNwc3dfZHVhbF9lbWFjX3NyY19wb3J0X2RldGVjdChjcHN3LCBzdGF0dXMsIG5kZXYsIHNrYikJCVwKIAlkbyB7CQkJCQkJCQlcCi0JCWlmICghcHJpdi0+ZGF0YS5kdWFsX2VtYWMpCQkJCVwKKwkJaWYgKCFjcHN3LT5kYXRhLmR1YWxfZW1hYykJCQkJXAogCQkJYnJlYWs7CQkJCQkJXAogCQlpZiAoQ1BETUFfUlhfU09VUkNFX1BPUlQoc3RhdHVzKSA9PSAxKSB7CQlcCi0JCQluZGV2ID0gY3Bzd19nZXRfc2xhdmVfbmRldihwcml2LCAwKTsJCVwKLQkJCXByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsJCQlcCisJCQluZGV2ID0gY3Bzdy0+c2xhdmVzWzBdLm5kZXY7CQkJXAogCQkJc2tiLT5kZXYgPSBuZGV2OwkJCQlcCiAJCX0gZWxzZSBpZiAoQ1BETUFfUlhfU09VUkNFX1BPUlQoc3RhdHVzKSA9PSAyKSB7CQlcCi0JCQluZGV2ID0gY3Bzd19nZXRfc2xhdmVfbmRldihwcml2LCAxKTsJCVwKLQkJCXByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsJCQlcCisJCQluZGV2ID0gY3Bzdy0+c2xhdmVzWzFdLm5kZXY7CQkJXAogCQkJc2tiLT5kZXYgPSBuZGV2OwkJCQlcCiAJCX0JCQkJCQkJXAogCX0gd2hpbGUgKDApCi0jZGVmaW5lIGNwc3dfYWRkX21jYXN0KHByaXYsIGFkZHIpCQkJCQlcCisjZGVmaW5lIGNwc3dfYWRkX21jYXN0KGNwc3csIHByaXYsIGFkZHIpCQkJCVwKIAlkbyB7CQkJCQkJCQlcCi0JCWlmIChwcml2LT5kYXRhLmR1YWxfZW1hYykgewkJCQlcCi0JCQlzdHJ1Y3QgY3Bzd19zbGF2ZSAqc2xhdmUgPSBwcml2LT5zbGF2ZXMgKwlcCisJCWlmIChjcHN3LT5kYXRhLmR1YWxfZW1hYykgewkJCQlcCisJCQlzdHJ1Y3QgY3Bzd19zbGF2ZSAqc2xhdmUgPSBjcHN3LT5zbGF2ZXMgKwlcCiAJCQkJCQlwcml2LT5lbWFjX3BvcnQ7CVwKLQkJCWludCBzbGF2ZV9wb3J0ID0gY3Bzd19nZXRfc2xhdmVfcG9ydChwcml2LAlcCisJCQlpbnQgc2xhdmVfcG9ydCA9IGNwc3dfZ2V0X3NsYXZlX3BvcnQoCQlcCiAJCQkJCQlzbGF2ZS0+c2xhdmVfbnVtKTsJXAotCQkJY3Bzd19hbGVfYWRkX21jYXN0KHByaXYtPmFsZSwgYWRkciwJCVwKKwkJCWNwc3dfYWxlX2FkZF9tY2FzdChjcHN3LT5hbGUsIGFkZHIsCQlcCiAJCQkJMSA8PCBzbGF2ZV9wb3J0IHwgQUxFX1BPUlRfSE9TVCwJXAogCQkJCUFMRV9WTEFOLCBzbGF2ZS0+cG9ydF92bGFuLCAwKTsJCVwKIAkJfSBlbHNlIHsJCQkJCQlcCi0JCQljcHN3X2FsZV9hZGRfbWNhc3QocHJpdi0+YWxlLCBhZGRyLAkJXAorCQkJY3Bzd19hbGVfYWRkX21jYXN0KGNwc3ctPmFsZSwgYWRkciwJCVwKIAkJCQlBTEVfQUxMX1BPUlRTLAkJCQlcCiAJCQkJMCwgMCwgMCk7CQkJCVwKIAkJfQkJCQkJCQlcCiAJfSB3aGlsZSAoMCkKIAotc3RhdGljIGlubGluZSBpbnQgY3Bzd19nZXRfc2xhdmVfcG9ydChzdHJ1Y3QgY3Bzd19wcml2ICpwcml2LCB1MzIgc2xhdmVfbnVtKQorc3RhdGljIGlubGluZSBpbnQgY3Bzd19nZXRfc2xhdmVfcG9ydCh1MzIgc2xhdmVfbnVtKQogewogCXJldHVybiBzbGF2ZV9udW0gKyAxOwogfQogCiBzdGF0aWMgdm9pZCBjcHN3X3NldF9wcm9taXNjaW91cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgYm9vbCBlbmFibGUpCiB7Ci0Jc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwotCXN0cnVjdCBjcHN3X2FsZSAqYWxlID0gcHJpdi0+YWxlOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IG5kZXZfdG9fY3BzdyhuZGV2KTsKKwlzdHJ1Y3QgY3Bzd19hbGUgKmFsZSA9IGNwc3ctPmFsZTsKIAlpbnQgaTsKIAotCWlmIChwcml2LT5kYXRhLmR1YWxfZW1hYykgeworCWlmIChjcHN3LT5kYXRhLmR1YWxfZW1hYykgewogCQlib29sIGZsYWcgPSBmYWxzZTsKIAogCQkvKiBFbmFibGluZyBwcm9taXNjdW91cyBtb2RlIGZvciBvbmUgaW50ZXJmYWNlIHdpbGwgYmUKIAkJICogY29tbW9uIGZvciBib3RoIHRoZSBpbnRlcmZhY2UgYXMgdGhlIGludGVyZmFjZSBzaGFyZXMKIAkJICogdGhlIHNhbWUgaGFyZHdhcmUgcmVzb3VyY2UuCiAJCSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+ZGF0YS5zbGF2ZXM7IGkrKykKLQkJCWlmIChwcml2LT5zbGF2ZXNbaV0ubmRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwkJZm9yIChpID0gMDsgaSA8IGNwc3ctPmRhdGEuc2xhdmVzOyBpKyspCisJCQlpZiAoY3Bzdy0+c2xhdmVzW2ldLm5kZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCiAJCQkJZmxhZyA9IHRydWU7CiAKIAkJaWYgKCFlbmFibGUgJiYgZmxhZykgewpAQCAtNTc5LDcgKzU2OCw3IEBACiAJCQl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgSFo7CiAKIAkJCS8qIERpc2FibGUgTGVhcm4gZm9yIGFsbCBwb3J0cyAoaG9zdCBpcyBwb3J0IDAgYW5kIHNsYXZlcyBhcmUgcG9ydCAxIGFuZCB1cCAqLwotCQkJZm9yIChpID0gMDsgaSA8PSBwcml2LT5kYXRhLnNsYXZlczsgaSsrKSB7CisJCQlmb3IgKGkgPSAwOyBpIDw9IGNwc3ctPmRhdGEuc2xhdmVzOyBpKyspIHsKIAkJCQljcHN3X2FsZV9jb250cm9sX3NldChhbGUsIGksCiAJCQkJCQkgICAgIEFMRV9QT1JUX05PTEVBUk4sIDEpOwogCQkJCWNwc3dfYWxlX2NvbnRyb2xfc2V0KGFsZSwgaSwKQEAgLTYwNiw3ICs1OTUsNyBAQAogCQkJY3Bzd19hbGVfY29udHJvbF9zZXQoYWxlLCAwLCBBTEVfUDBfVU5JX0ZMT09ELCAwKTsKIAogCQkJLyogRW5hYmxlIExlYXJuIGZvciBhbGwgcG9ydHMgKGhvc3QgaXMgcG9ydCAwIGFuZCBzbGF2ZXMgYXJlIHBvcnQgMSBhbmQgdXAgKi8KLQkJCWZvciAoaSA9IDA7IGkgPD0gcHJpdi0+ZGF0YS5zbGF2ZXM7IGkrKykgeworCQkJZm9yIChpID0gMDsgaSA8PSBjcHN3LT5kYXRhLnNsYXZlczsgaSsrKSB7CiAJCQkJY3Bzd19hbGVfY29udHJvbF9zZXQoYWxlLCBpLAogCQkJCQkJICAgICBBTEVfUE9SVF9OT0xFQVJOLCAwKTsKIAkJCQljcHN3X2FsZV9jb250cm9sX3NldChhbGUsIGksCkBAIC02MjAsMTcgKzYwOSwxOCBAQAogc3RhdGljIHZvaWQgY3Bzd19uZG9fc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7CiAJc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IHByaXYtPmNwc3c7CiAJaW50IHZpZDsKIAotCWlmIChwcml2LT5kYXRhLmR1YWxfZW1hYykKLQkJdmlkID0gcHJpdi0+c2xhdmVzW3ByaXYtPmVtYWNfcG9ydF0ucG9ydF92bGFuOworCWlmIChjcHN3LT5kYXRhLmR1YWxfZW1hYykKKwkJdmlkID0gY3Bzdy0+c2xhdmVzW3ByaXYtPmVtYWNfcG9ydF0ucG9ydF92bGFuOwogCWVsc2UKLQkJdmlkID0gcHJpdi0+ZGF0YS5kZWZhdWx0X3ZsYW47CisJCXZpZCA9IGNwc3ctPmRhdGEuZGVmYXVsdF92bGFuOwogCiAJaWYgKG5kZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKIAkJLyogRW5hYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KIAkJY3Bzd19zZXRfcHJvbWlzY2lvdXMobmRldiwgdHJ1ZSk7Ci0JCWNwc3dfYWxlX3NldF9hbGxtdWx0aShwcml2LT5hbGUsIElGRl9BTExNVUxUSSk7CisJCWNwc3dfYWxlX3NldF9hbGxtdWx0aShjcHN3LT5hbGUsIElGRl9BTExNVUxUSSk7CiAJCXJldHVybjsKIAl9IGVsc2UgewogCQkvKiBEaXNhYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KQEAgLTYzOCw1MSArNjI4LDU0IEBACiAJfQogCiAJLyogUmVzdG9yZSBhbGxtdWx0aSBvbiB2bGFucyBpZiBuZWNlc3NhcnkgKi8KLQljcHN3X2FsZV9zZXRfYWxsbXVsdGkocHJpdi0+YWxlLCBwcml2LT5uZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSk7CisJY3Bzd19hbGVfc2V0X2FsbG11bHRpKGNwc3ctPmFsZSwgcHJpdi0+bmRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpOwogCiAJLyogQ2xlYXIgYWxsIG1jYXN0IGZyb20gQUxFICovCi0JY3Bzd19hbGVfZmx1c2hfbXVsdGljYXN0KHByaXYtPmFsZSwgQUxFX0FMTF9QT1JUUywgdmlkKTsKKwljcHN3X2FsZV9mbHVzaF9tdWx0aWNhc3QoY3Bzdy0+YWxlLCBBTEVfQUxMX1BPUlRTLCB2aWQpOwogCiAJaWYgKCFuZXRkZXZfbWNfZW1wdHkobmRldikpIHsKIAkJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKIAogCQkvKiBwcm9ncmFtIG11bHRpY2FzdCBhZGRyZXNzIGxpc3QgaW50byBBTEUgcmVnaXN0ZXIgKi8KIAkJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIG5kZXYpIHsKLQkJCWNwc3dfYWRkX21jYXN0KHByaXYsICh1OCAqKWhhLT5hZGRyKTsKKwkJCWNwc3dfYWRkX21jYXN0KGNwc3csIHByaXYsICh1OCAqKWhhLT5hZGRyKTsKIAkJfQogCX0KIH0KIAotc3RhdGljIHZvaWQgY3Bzd19pbnRyX2VuYWJsZShzdHJ1Y3QgY3Bzd19wcml2ICpwcml2KQorc3RhdGljIHZvaWQgY3Bzd19pbnRyX2VuYWJsZShzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cpCiB7Ci0JX19yYXdfd3JpdGVsKDB4RkYsICZwcml2LT53cl9yZWdzLT50eF9lbik7Ci0JX19yYXdfd3JpdGVsKDB4RkYsICZwcml2LT53cl9yZWdzLT5yeF9lbik7CisJX19yYXdfd3JpdGVsKDB4RkYsICZjcHN3LT53cl9yZWdzLT50eF9lbik7CisJX19yYXdfd3JpdGVsKDB4RkYsICZjcHN3LT53cl9yZWdzLT5yeF9lbik7CiAKLQljcGRtYV9jdGxyX2ludF9jdHJsKHByaXYtPmRtYSwgdHJ1ZSk7CisJY3BkbWFfY3Rscl9pbnRfY3RybChjcHN3LT5kbWEsIHRydWUpOwogCXJldHVybjsKIH0KIAotc3RhdGljIHZvaWQgY3Bzd19pbnRyX2Rpc2FibGUoc3RydWN0IGNwc3dfcHJpdiAqcHJpdikKK3N0YXRpYyB2b2lkIGNwc3dfaW50cl9kaXNhYmxlKHN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdykKIHsKLQlfX3Jhd193cml0ZWwoMCwgJnByaXYtPndyX3JlZ3MtPnR4X2VuKTsKLQlfX3Jhd193cml0ZWwoMCwgJnByaXYtPndyX3JlZ3MtPnJ4X2VuKTsKKwlfX3Jhd193cml0ZWwoMCwgJmNwc3ctPndyX3JlZ3MtPnR4X2VuKTsKKwlfX3Jhd193cml0ZWwoMCwgJmNwc3ctPndyX3JlZ3MtPnJ4X2VuKTsKIAotCWNwZG1hX2N0bHJfaW50X2N0cmwocHJpdi0+ZG1hLCBmYWxzZSk7CisJY3BkbWFfY3Rscl9pbnRfY3RybChjcHN3LT5kbWEsIGZhbHNlKTsKIAlyZXR1cm47CiB9CiAKIHN0YXRpYyB2b2lkIGNwc3dfdHhfaGFuZGxlcih2b2lkICp0b2tlbiwgaW50IGxlbiwgaW50IHN0YXR1cykKIHsKKwlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlCSp0eHE7CiAJc3RydWN0IHNrX2J1ZmYJCSpza2IgPSB0b2tlbjsKIAlzdHJ1Y3QgbmV0X2RldmljZQkqbmRldiA9IHNrYi0+ZGV2OwotCXN0cnVjdCBjcHN3X3ByaXYJKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24JKmNwc3cgPSBuZGV2X3RvX2Nwc3cobmRldik7CiAKIAkvKiBDaGVjayB3aGV0aGVyIHRoZSBxdWV1ZSBpcyBzdG9wcGVkIGR1ZSB0byBzdGFsbGVkIHR4IGRtYSwgaWYgdGhlCiAJICogcXVldWUgaXMgc3RvcHBlZCB0aGVuIHN0YXJ0IHRoZSBxdWV1ZSBhcyB3ZSBoYXZlIGZyZWUgZGVzYyBmb3IgdHgKIAkgKi8KLQlpZiAodW5saWtlbHkobmV0aWZfcXVldWVfc3RvcHBlZChuZGV2KSkpCi0JCW5ldGlmX3dha2VfcXVldWUobmRldik7Ci0JY3B0c190eF90aW1lc3RhbXAocHJpdi0+Y3B0cywgc2tiKTsKKwl0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKG5kZXYsIHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpKTsKKwlpZiAodW5saWtlbHkobmV0aWZfdHhfcXVldWVfc3RvcHBlZCh0eHEpKSkKKwkJbmV0aWZfdHhfd2FrZV9xdWV1ZSh0eHEpOworCisJY3B0c190eF90aW1lc3RhbXAoY3Bzdy0+Y3B0cywgc2tiKTsKIAluZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CiAJbmRldi0+c3RhdHMudHhfYnl0ZXMgKz0gbGVuOwogCWRldl9rZnJlZV9za2JfYW55KHNrYik7CkBAIC02OTAsMjIgKzY4MywyMyBAQAogCiBzdGF0aWMgdm9pZCBjcHN3X3J4X2hhbmRsZXIodm9pZCAqdG9rZW4sIGludCBsZW4sIGludCBzdGF0dXMpCiB7CisJc3RydWN0IGNwZG1hX2NoYW4JKmNoOwogCXN0cnVjdCBza19idWZmCQkqc2tiID0gdG9rZW47CiAJc3RydWN0IHNrX2J1ZmYJCSpuZXdfc2tiOwogCXN0cnVjdCBuZXRfZGV2aWNlCSpuZGV2ID0gc2tiLT5kZXY7Ci0Jc3RydWN0IGNwc3dfcHJpdgkqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwogCWludAkJCXJldCA9IDA7CisJc3RydWN0IGNwc3dfY29tbW9uCSpjcHN3ID0gbmRldl90b19jcHN3KG5kZXYpOwogCi0JY3Bzd19kdWFsX2VtYWNfc3JjX3BvcnRfZGV0ZWN0KHN0YXR1cywgcHJpdiwgbmRldiwgc2tiKTsKKwljcHN3X2R1YWxfZW1hY19zcmNfcG9ydF9kZXRlY3QoY3Bzdywgc3RhdHVzLCBuZGV2LCBza2IpOwogCiAJaWYgKHVubGlrZWx5KHN0YXR1cyA8IDApIHx8IHVubGlrZWx5KCFuZXRpZl9ydW5uaW5nKG5kZXYpKSkgewogCQlib29sIG5kZXZfc3RhdHVzID0gZmFsc2U7Ci0JCXN0cnVjdCBjcHN3X3NsYXZlICpzbGF2ZSA9IHByaXYtPnNsYXZlczsKKwkJc3RydWN0IGNwc3dfc2xhdmUgKnNsYXZlID0gY3Bzdy0+c2xhdmVzOwogCQlpbnQgbjsKIAotCQlpZiAocHJpdi0+ZGF0YS5kdWFsX2VtYWMpIHsKKwkJaWYgKGNwc3ctPmRhdGEuZHVhbF9lbWFjKSB7CiAJCQkvKiBJbiBkdWFsIGVtYWMgbW9kZSBjaGVjayBmb3IgYWxsIGludGVyZmFjZXMgKi8KLQkJCWZvciAobiA9IHByaXYtPmRhdGEuc2xhdmVzOyBuOyBuLS0sIHNsYXZlKyspCisJCQlmb3IgKG4gPSBjcHN3LT5kYXRhLnNsYXZlczsgbjsgbi0tLCBzbGF2ZSsrKQogCQkJCWlmIChuZXRpZl9ydW5uaW5nKHNsYXZlLT5uZGV2KSkKIAkJCQkJbmRldl9zdGF0dXMgPSB0cnVlOwogCQl9CkBAIC03MjYsOTYgKzcyMCwxMzIgQEAKIAkJcmV0dXJuOwogCX0KIAotCW5ld19za2IgPSBuZXRkZXZfYWxsb2Nfc2tiX2lwX2FsaWduKG5kZXYsIHByaXYtPnJ4X3BhY2tldF9tYXgpOworCW5ld19za2IgPSBuZXRkZXZfYWxsb2Nfc2tiX2lwX2FsaWduKG5kZXYsIGNwc3ctPnJ4X3BhY2tldF9tYXgpOwogCWlmIChuZXdfc2tiKSB7CisJCXNrYl9jb3B5X3F1ZXVlX21hcHBpbmcobmV3X3NrYiwgc2tiKTsKIAkJc2tiX3B1dChza2IsIGxlbik7Ci0JCWNwdHNfcnhfdGltZXN0YW1wKHByaXYtPmNwdHMsIHNrYik7CisJCWNwdHNfcnhfdGltZXN0YW1wKGNwc3ctPmNwdHMsIHNrYik7CiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5kZXYpOwogCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOwogCQluZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CiAJCW5kZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJa21lbWxlYWtfbm90X2xlYWsobmV3X3NrYik7CiAJfSBlbHNlIHsKIAkJbmRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQluZXdfc2tiID0gc2tiOwogCX0KIAogcmVxdWV1ZToKLQlyZXQgPSBjcGRtYV9jaGFuX3N1Ym1pdChwcml2LT5yeGNoLCBuZXdfc2tiLCBuZXdfc2tiLT5kYXRhLAotCQkJc2tiX3RhaWxyb29tKG5ld19za2IpLCAwKTsKKwlpZiAobmV0aWZfZG9ybWFudChuZGV2KSkgeworCQlkZXZfa2ZyZWVfc2tiX2FueShuZXdfc2tiKTsKKwkJcmV0dXJuOworCX0KKworCWNoID0gY3Bzdy0+cnhjaFtza2JfZ2V0X3F1ZXVlX21hcHBpbmcobmV3X3NrYildOworCXJldCA9IGNwZG1hX2NoYW5fc3VibWl0KGNoLCBuZXdfc2tiLCBuZXdfc2tiLT5kYXRhLAorCQkJCXNrYl90YWlscm9vbShuZXdfc2tiKSwgMCk7CiAJaWYgKFdBUk5fT04ocmV0IDwgMCkpCiAJCWRldl9rZnJlZV9za2JfYW55KG5ld19za2IpOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QgY3Bzd190eF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewotCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYgPSBkZXZfaWQ7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gZGV2X2lkOwogCi0Jd3JpdGVsKDAsICZwcml2LT53cl9yZWdzLT50eF9lbik7Ci0JY3BkbWFfY3Rscl9lb2kocHJpdi0+ZG1hLCBDUERNQV9FT0lfVFgpOworCXdyaXRlbCgwLCAmY3Bzdy0+d3JfcmVncy0+dHhfZW4pOworCWNwZG1hX2N0bHJfZW9pKGNwc3ctPmRtYSwgQ1BETUFfRU9JX1RYKTsKIAotCWlmIChwcml2LT5xdWlya19pcnEpIHsKLQkJZGlzYWJsZV9pcnFfbm9zeW5jKHByaXYtPmlycXNfdGFibGVbMV0pOwotCQlwcml2LT50eF9pcnFfZGlzYWJsZWQgPSB0cnVlOworCWlmIChjcHN3LT5xdWlya19pcnEpIHsKKwkJZGlzYWJsZV9pcnFfbm9zeW5jKGNwc3ctPmlycXNfdGFibGVbMV0pOworCQljcHN3LT50eF9pcnFfZGlzYWJsZWQgPSB0cnVlOwogCX0KIAotCW5hcGlfc2NoZWR1bGUoJnByaXYtPm5hcGlfdHgpOworCW5hcGlfc2NoZWR1bGUoJmNwc3ctPm5hcGlfdHgpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAogc3RhdGljIGlycXJldHVybl90IGNwc3dfcnhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gZGV2X2lkOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IGRldl9pZDsKIAotCWNwZG1hX2N0bHJfZW9pKHByaXYtPmRtYSwgQ1BETUFfRU9JX1JYKTsKLQl3cml0ZWwoMCwgJnByaXYtPndyX3JlZ3MtPnJ4X2VuKTsKKwljcGRtYV9jdGxyX2VvaShjcHN3LT5kbWEsIENQRE1BX0VPSV9SWCk7CisJd3JpdGVsKDAsICZjcHN3LT53cl9yZWdzLT5yeF9lbik7CiAKLQlpZiAocHJpdi0+cXVpcmtfaXJxKSB7Ci0JCWRpc2FibGVfaXJxX25vc3luYyhwcml2LT5pcnFzX3RhYmxlWzBdKTsKLQkJcHJpdi0+cnhfaXJxX2Rpc2FibGVkID0gdHJ1ZTsKKwlpZiAoY3Bzdy0+cXVpcmtfaXJxKSB7CisJCWRpc2FibGVfaXJxX25vc3luYyhjcHN3LT5pcnFzX3RhYmxlWzBdKTsKKwkJY3Bzdy0+cnhfaXJxX2Rpc2FibGVkID0gdHJ1ZTsKIAl9CiAKLQluYXBpX3NjaGVkdWxlKCZwcml2LT5uYXBpX3J4KTsKKwluYXBpX3NjaGVkdWxlKCZjcHN3LT5uYXBpX3J4KTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKIHN0YXRpYyBpbnQgY3Bzd190eF9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaV90eCwgaW50IGJ1ZGdldCkKIHsKLQlzdHJ1Y3QgY3Bzd19wcml2CSpwcml2ID0gbmFwaV90b19wcml2KG5hcGlfdHgpOwotCWludAkJCW51bV90eDsKKwl1MzIJCQljaF9tYXA7CisJaW50CQkJbnVtX3R4LCBjaDsKKwlzdHJ1Y3QgY3Bzd19jb21tb24JKmNwc3cgPSBuYXBpX3RvX2Nwc3cobmFwaV90eCk7CiAKLQludW1fdHggPSBjcGRtYV9jaGFuX3Byb2Nlc3MocHJpdi0+dHhjaCwgYnVkZ2V0KTsKLQlpZiAobnVtX3R4IDwgYnVkZ2V0KSB7Ci0JCW5hcGlfY29tcGxldGUobmFwaV90eCk7Ci0JCXdyaXRlbCgweGZmLCAmcHJpdi0+d3JfcmVncy0+dHhfZW4pOwotCQlpZiAocHJpdi0+cXVpcmtfaXJxICYmIHByaXYtPnR4X2lycV9kaXNhYmxlZCkgewotCQkJcHJpdi0+dHhfaXJxX2Rpc2FibGVkID0gZmFsc2U7Ci0JCQllbmFibGVfaXJxKHByaXYtPmlycXNfdGFibGVbMV0pOworCS8qIHByb2Nlc3MgZXZlcnkgdW5wcm9jZXNzZWQgY2hhbm5lbCAqLworCWNoX21hcCA9IGNwZG1hX2N0cmxfdHhjaHNfc3RhdGUoY3Bzdy0+ZG1hKTsKKwlmb3IgKGNoID0gMCwgbnVtX3R4ID0gMDsgbnVtX3R4IDwgYnVkZ2V0OyBjaF9tYXAgPj49IDEsIGNoKyspIHsKKwkJaWYgKCFjaF9tYXApIHsKKwkJCWNoX21hcCA9IGNwZG1hX2N0cmxfdHhjaHNfc3RhdGUoY3Bzdy0+ZG1hKTsKKwkJCWlmICghY2hfbWFwKQorCQkJCWJyZWFrOworCisJCQljaCA9IDA7CiAJCX0KKworCQlpZiAoIShjaF9tYXAgJiAweDAxKSkKKwkJCWNvbnRpbnVlOworCisJCW51bV90eCArPSBjcGRtYV9jaGFuX3Byb2Nlc3MoY3Bzdy0+dHhjaFtjaF0sIGJ1ZGdldCAtIG51bV90eCk7CiAJfQogCi0JaWYgKG51bV90eCkKLQkJY3Bzd19kYmcocHJpdiwgaW50ciwgInBvbGwgJWQgdHggcGt0c1xuIiwgbnVtX3R4KTsKKwlpZiAobnVtX3R4IDwgYnVkZ2V0KSB7CisJCW5hcGlfY29tcGxldGUobmFwaV90eCk7CisJCXdyaXRlbCgweGZmLCAmY3Bzdy0+d3JfcmVncy0+dHhfZW4pOworCQlpZiAoY3Bzdy0+cXVpcmtfaXJxICYmIGNwc3ctPnR4X2lycV9kaXNhYmxlZCkgeworCQkJY3Bzdy0+dHhfaXJxX2Rpc2FibGVkID0gZmFsc2U7CisJCQllbmFibGVfaXJxKGNwc3ctPmlycXNfdGFibGVbMV0pOworCQl9CisJfQogCiAJcmV0dXJuIG51bV90eDsKIH0KIAogc3RhdGljIGludCBjcHN3X3J4X3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpX3J4LCBpbnQgYnVkZ2V0KQogewotCXN0cnVjdCBjcHN3X3ByaXYJKnByaXYgPSBuYXBpX3RvX3ByaXYobmFwaV9yeCk7Ci0JaW50CQkJbnVtX3J4OworCXUzMgkJCWNoX21hcDsKKwlpbnQJCQludW1fcngsIGNoOworCXN0cnVjdCBjcHN3X2NvbW1vbgkqY3BzdyA9IG5hcGlfdG9fY3BzdyhuYXBpX3J4KTsKIAotCW51bV9yeCA9IGNwZG1hX2NoYW5fcHJvY2Vzcyhwcml2LT5yeGNoLCBidWRnZXQpOwotCWlmIChudW1fcnggPCBidWRnZXQpIHsKLQkJbmFwaV9jb21wbGV0ZShuYXBpX3J4KTsKLQkJd3JpdGVsKDB4ZmYsICZwcml2LT53cl9yZWdzLT5yeF9lbik7Ci0JCWlmIChwcml2LT5xdWlya19pcnEgJiYgcHJpdi0+cnhfaXJxX2Rpc2FibGVkKSB7Ci0JCQlwcml2LT5yeF9pcnFfZGlzYWJsZWQgPSBmYWxzZTsKLQkJCWVuYWJsZV9pcnEocHJpdi0+aXJxc190YWJsZVswXSk7CisJLyogcHJvY2VzcyBldmVyeSB1bnByb2Nlc3NlZCBjaGFubmVsICovCisJY2hfbWFwID0gY3BkbWFfY3RybF9yeGNoc19zdGF0ZShjcHN3LT5kbWEpOworCWZvciAoY2ggPSAwLCBudW1fcnggPSAwOyBudW1fcnggPCBidWRnZXQ7IGNoX21hcCA+Pj0gMSwgY2grKykgeworCQlpZiAoIWNoX21hcCkgeworCQkJY2hfbWFwID0gY3BkbWFfY3RybF9yeGNoc19zdGF0ZShjcHN3LT5kbWEpOworCQkJaWYgKCFjaF9tYXApCisJCQkJYnJlYWs7CisKKwkJCWNoID0gMDsKIAkJfQorCisJCWlmICghKGNoX21hcCAmIDB4MDEpKQorCQkJY29udGludWU7CisKKwkJbnVtX3J4ICs9IGNwZG1hX2NoYW5fcHJvY2VzcyhjcHN3LT5yeGNoW2NoXSwgYnVkZ2V0IC0gbnVtX3J4KTsKIAl9CiAKLQlpZiAobnVtX3J4KQotCQljcHN3X2RiZyhwcml2LCBpbnRyLCAicG9sbCAlZCByeCBwa3RzXG4iLCBudW1fcngpOworCWlmIChudW1fcnggPCBidWRnZXQpIHsKKwkJbmFwaV9jb21wbGV0ZShuYXBpX3J4KTsKKwkJd3JpdGVsKDB4ZmYsICZjcHN3LT53cl9yZWdzLT5yeF9lbik7CisJCWlmIChjcHN3LT5xdWlya19pcnEgJiYgY3Bzdy0+cnhfaXJxX2Rpc2FibGVkKSB7CisJCQljcHN3LT5yeF9pcnFfZGlzYWJsZWQgPSBmYWxzZTsKKwkJCWVuYWJsZV9pcnEoY3Bzdy0+aXJxc190YWJsZVswXSk7CisJCX0KKwl9CiAKIAlyZXR1cm4gbnVtX3J4OwogfQpAQCAtODQ5LDE3ICs4NzksMTggQEAKIAlzdHJ1Y3QgcGh5X2RldmljZQkqcGh5ID0gc2xhdmUtPnBoeTsKIAl1MzIJCQltYWNfY29udHJvbCA9IDA7CiAJdTMyCQkJc2xhdmVfcG9ydDsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OwogCiAJaWYgKCFwaHkpCiAJCXJldHVybjsKIAotCXNsYXZlX3BvcnQgPSBjcHN3X2dldF9zbGF2ZV9wb3J0KHByaXYsIHNsYXZlLT5zbGF2ZV9udW0pOworCXNsYXZlX3BvcnQgPSBjcHN3X2dldF9zbGF2ZV9wb3J0KHNsYXZlLT5zbGF2ZV9udW0pOwogCiAJaWYgKHBoeS0+bGluaykgewotCQltYWNfY29udHJvbCA9IHByaXYtPmRhdGEubWFjX2NvbnRyb2w7CisJCW1hY19jb250cm9sID0gY3Bzdy0+ZGF0YS5tYWNfY29udHJvbDsKIAogCQkvKiBlbmFibGUgZm9yd2FyZGluZyAqLwotCQljcHN3X2FsZV9jb250cm9sX3NldChwcml2LT5hbGUsIHNsYXZlX3BvcnQsCisJCWNwc3dfYWxlX2NvbnRyb2xfc2V0KGNwc3ctPmFsZSwgc2xhdmVfcG9ydCwKIAkJCQkgICAgIEFMRV9QT1JUX1NUQVRFLCBBTEVfUE9SVF9TVEFURV9GT1JXQVJEKTsKIAogCQlpZiAocGh5LT5zcGVlZCA9PSAxMDAwKQpAQCAtODgzLDcgKzkxNCw3IEBACiAJfSBlbHNlIHsKIAkJbWFjX2NvbnRyb2wgPSAwOwogCQkvKiBkaXNhYmxlIGZvcndhcmRpbmcgKi8KLQkJY3Bzd19hbGVfY29udHJvbF9zZXQocHJpdi0+YWxlLCBzbGF2ZV9wb3J0LAorCQljcHN3X2FsZV9jb250cm9sX3NldChjcHN3LT5hbGUsIHNsYXZlX3BvcnQsCiAJCQkJICAgICBBTEVfUE9SVF9TVEFURSwgQUxFX1BPUlRfU1RBVEVfRElTQUJMRSk7CiAJfQogCkBAIC05MDUsMTkgKzkzNiwxOSBAQAogCWlmIChsaW5rKSB7CiAJCW5ldGlmX2NhcnJpZXJfb24obmRldik7CiAJCWlmIChuZXRpZl9ydW5uaW5nKG5kZXYpKQotCQkJbmV0aWZfd2FrZV9xdWV1ZShuZGV2KTsKKwkJCW5ldGlmX3R4X3dha2VfYWxsX3F1ZXVlcyhuZGV2KTsKIAl9IGVsc2UgewogCQluZXRpZl9jYXJyaWVyX29mZihuZGV2KTsKLQkJbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsKKwkJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKG5kZXYpOwogCX0KIH0KIAogc3RhdGljIGludCBjcHN3X2dldF9jb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKIAkJCQlzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqY29hbCkKIHsKLQlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gbmRldl90b19jcHN3KG5kZXYpOwogCi0JY29hbC0+cnhfY29hbGVzY2VfdXNlY3MgPSBwcml2LT5jb2FsX2ludHZsOworCWNvYWwtPnJ4X2NvYWxlc2NlX3VzZWNzID0gY3Bzdy0+Y29hbF9pbnR2bDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTMwLDExICs5NjEsMTIgQEAKIAl1MzIgcHJlc2NhbGUgPSAwOwogCXUzMiBhZGRubF9kdmRyID0gMTsKIAl1MzIgY29hbF9pbnR2bCA9IDA7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKIAogCWNvYWxfaW50dmwgPSBjb2FsLT5yeF9jb2FsZXNjZV91c2VjczsKIAotCWludF9jdHJsID0gIHJlYWRsKCZwcml2LT53cl9yZWdzLT5pbnRfY29udHJvbCk7Ci0JcHJlc2NhbGUgPSBwcml2LT5idXNfZnJlcV9taHogKiA0OworCWludF9jdHJsID0gIHJlYWRsKCZjcHN3LT53cl9yZWdzLT5pbnRfY29udHJvbCk7CisJcHJlc2NhbGUgPSBjcHN3LT5idXNfZnJlcV9taHogKiA0OwogCiAJaWYgKCFjb2FsLT5yeF9jb2FsZXNjZV91c2VjcykgewogCQlpbnRfY3RybCAmPSB+KENQU1dfSU5UUFJFU0NBTEVfTUFTSyB8IENQU1dfSU5UUEFDRUVOKTsKQEAgLTk2Miw1MyArOTk0LDY5IEBACiAJfQogCiAJbnVtX2ludGVycnVwdHMgPSAoMTAwMCAqIGFkZG5sX2R2ZHIpIC8gY29hbF9pbnR2bDsKLQl3cml0ZWwobnVtX2ludGVycnVwdHMsICZwcml2LT53cl9yZWdzLT5yeF9pbWF4KTsKLQl3cml0ZWwobnVtX2ludGVycnVwdHMsICZwcml2LT53cl9yZWdzLT50eF9pbWF4KTsKKwl3cml0ZWwobnVtX2ludGVycnVwdHMsICZjcHN3LT53cl9yZWdzLT5yeF9pbWF4KTsKKwl3cml0ZWwobnVtX2ludGVycnVwdHMsICZjcHN3LT53cl9yZWdzLT50eF9pbWF4KTsKIAogCWludF9jdHJsIHw9IENQU1dfSU5UUEFDRUVOOwogCWludF9jdHJsICY9ICh+Q1BTV19JTlRQUkVTQ0FMRV9NQVNLKTsKIAlpbnRfY3RybCB8PSAocHJlc2NhbGUgJiBDUFNXX0lOVFBSRVNDQUxFX01BU0spOwogCiB1cGRhdGVfcmV0dXJuOgotCXdyaXRlbChpbnRfY3RybCwgJnByaXYtPndyX3JlZ3MtPmludF9jb250cm9sKTsKKwl3cml0ZWwoaW50X2N0cmwsICZjcHN3LT53cl9yZWdzLT5pbnRfY29udHJvbCk7CiAKIAljcHN3X25vdGljZShwcml2LCB0aW1lciwgIlNldCBjb2FsZXNjZSB0byAlZCB1c2Vjcy5cbiIsIGNvYWxfaW50dmwpOwotCWlmIChwcml2LT5kYXRhLmR1YWxfZW1hYykgewotCQlpbnQgaTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+ZGF0YS5zbGF2ZXM7IGkrKykgewotCQkJcHJpdiA9IG5ldGRldl9wcml2KHByaXYtPnNsYXZlc1tpXS5uZGV2KTsKLQkJCXByaXYtPmNvYWxfaW50dmwgPSBjb2FsX2ludHZsOwotCQl9Ci0JfSBlbHNlIHsKLQkJcHJpdi0+Y29hbF9pbnR2bCA9IGNvYWxfaW50dmw7Ci0JfQorCWNwc3ctPmNvYWxfaW50dmwgPSBjb2FsX2ludHZsOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgY3Bzd19nZXRfc3NldF9jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgaW50IHNzZXQpCiB7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gbmRldl90b19jcHN3KG5kZXYpOworCiAJc3dpdGNoIChzc2V0KSB7CiAJY2FzZSBFVEhfU1NfU1RBVFM6Ci0JCXJldHVybiBDUFNXX1NUQVRTX0xFTjsKKwkJcmV0dXJuIChDUFNXX1NUQVRTX0NPTU1PTl9MRU4gKworCQkgICAgICAgKGNwc3ctPnJ4X2NoX251bSArIGNwc3ctPnR4X2NoX251bSkgKgorCQkgICAgICAgQ1BTV19TVEFUU19DSF9MRU4pOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGNwc3dfYWRkX2NoX3N0cmluZ3ModTggKipwLCBpbnQgY2hfbnVtLCBpbnQgcnhfZGlyKQoreworCWludCBjaF9zdGF0c19sZW47CisJaW50IGxpbmU7CisJaW50IGk7CisKKwljaF9zdGF0c19sZW4gPSBDUFNXX1NUQVRTX0NIX0xFTiAqIGNoX251bTsKKwlmb3IgKGkgPSAwOyBpIDwgY2hfc3RhdHNfbGVuOyBpKyspIHsKKwkJbGluZSA9IGkgJSBDUFNXX1NUQVRTX0NIX0xFTjsKKwkJc25wcmludGYoKnAsIEVUSF9HU1RSSU5HX0xFTiwKKwkJCSAiJXMgRE1BIGNoYW4gJWQ6ICVzIiwgcnhfZGlyID8gIlJ4IiA6ICJUeCIsCisJCQkgaSAvIENQU1dfU1RBVFNfQ0hfTEVOLAorCQkJIGNwc3dfZ3N0cmluZ3NfY2hfc3RhdHNbbGluZV0uc3RhdF9zdHJpbmcpOworCQkqcCArPSBFVEhfR1NUUklOR19MRU47CisJfQorfQorCiBzdGF0aWMgdm9pZCBjcHN3X2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqZGF0YSkKIHsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBuZGV2X3RvX2Nwc3cobmRldik7CiAJdTggKnAgPSBkYXRhOwogCWludCBpOwogCiAJc3dpdGNoIChzdHJpbmdzZXQpIHsKIAljYXNlIEVUSF9TU19TVEFUUzoKLQkJZm9yIChpID0gMDsgaSA8IENQU1dfU1RBVFNfTEVOOyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IENQU1dfU1RBVFNfQ09NTU9OX0xFTjsgaSsrKSB7CiAJCQltZW1jcHkocCwgY3Bzd19nc3RyaW5nc19zdGF0c1tpXS5zdGF0X3N0cmluZywKIAkJCSAgICAgICBFVEhfR1NUUklOR19MRU4pOwogCQkJcCArPSBFVEhfR1NUUklOR19MRU47CiAJCX0KKworCQljcHN3X2FkZF9jaF9zdHJpbmdzKCZwLCBjcHN3LT5yeF9jaF9udW0sIDEpOworCQljcHN3X2FkZF9jaF9zdHJpbmdzKCZwLCBjcHN3LT50eF9jaF9udW0sIDApOwogCQlicmVhazsKIAl9CiB9CkBAIC0xMDE2LDg2ICsxMDY0LDc4IEBACiBzdGF0aWMgdm9pZCBjcHN3X2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAogCQkJCSAgICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsIHU2NCAqZGF0YSkKIHsKLQlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7Ci0Jc3RydWN0IGNwZG1hX2NoYW5fc3RhdHMgcnhfc3RhdHM7Ci0Jc3RydWN0IGNwZG1hX2NoYW5fc3RhdHMgdHhfc3RhdHM7Ci0JdTMyIHZhbDsKIAl1OCAqcDsKLQlpbnQgaTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBuZGV2X3RvX2Nwc3cobmRldik7CisJc3RydWN0IGNwZG1hX2NoYW5fc3RhdHMgY2hfc3RhdHM7CisJaW50IGksIGwsIGNoOwogCiAJLyogQ29sbGVjdCBEYXZpbmNpIENQRE1BIHN0YXRzIGZvciBSeCBhbmQgVHggQ2hhbm5lbCAqLwotCWNwZG1hX2NoYW5fZ2V0X3N0YXRzKHByaXYtPnJ4Y2gsICZyeF9zdGF0cyk7Ci0JY3BkbWFfY2hhbl9nZXRfc3RhdHMocHJpdi0+dHhjaCwgJnR4X3N0YXRzKTsKKwlmb3IgKGwgPSAwOyBsIDwgQ1BTV19TVEFUU19DT01NT05fTEVOOyBsKyspCisJCWRhdGFbbF0gPSByZWFkbChjcHN3LT5od19zdGF0cyArCisJCQkJY3Bzd19nc3RyaW5nc19zdGF0c1tsXS5zdGF0X29mZnNldCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQ1BTV19TVEFUU19MRU47IGkrKykgewotCQlzd2l0Y2ggKGNwc3dfZ3N0cmluZ3Nfc3RhdHNbaV0udHlwZSkgewotCQljYXNlIENQU1dfU1RBVFM6Ci0JCQl2YWwgPSByZWFkbChwcml2LT5od19zdGF0cyArCi0JCQkJICAgIGNwc3dfZ3N0cmluZ3Nfc3RhdHNbaV0uc3RhdF9vZmZzZXQpOwotCQkJZGF0YVtpXSA9IHZhbDsKLQkJCWJyZWFrOworCWZvciAoY2ggPSAwOyBjaCA8IGNwc3ctPnJ4X2NoX251bTsgY2grKykgeworCQljcGRtYV9jaGFuX2dldF9zdGF0cyhjcHN3LT5yeGNoW2NoXSwgJmNoX3N0YXRzKTsKKwkJZm9yIChpID0gMDsgaSA8IENQU1dfU1RBVFNfQ0hfTEVOOyBpKyssIGwrKykgeworCQkJcCA9ICh1OCAqKSZjaF9zdGF0cyArCisJCQkJY3Bzd19nc3RyaW5nc19jaF9zdGF0c1tpXS5zdGF0X29mZnNldDsKKwkJCWRhdGFbbF0gPSAqKHUzMiAqKXA7CisJCX0KKwl9CiAKLQkJY2FzZSBDUERNQV9SWF9TVEFUUzoKLQkJCXAgPSAodTggKikmcnhfc3RhdHMgKwotCQkJCWNwc3dfZ3N0cmluZ3Nfc3RhdHNbaV0uc3RhdF9vZmZzZXQ7Ci0JCQlkYXRhW2ldID0gKih1MzIgKilwOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDUERNQV9UWF9TVEFUUzoKLQkJCXAgPSAodTggKikmdHhfc3RhdHMgKwotCQkJCWNwc3dfZ3N0cmluZ3Nfc3RhdHNbaV0uc3RhdF9vZmZzZXQ7Ci0JCQlkYXRhW2ldID0gKih1MzIgKilwOwotCQkJYnJlYWs7CisJZm9yIChjaCA9IDA7IGNoIDwgY3Bzdy0+dHhfY2hfbnVtOyBjaCsrKSB7CisJCWNwZG1hX2NoYW5fZ2V0X3N0YXRzKGNwc3ctPnR4Y2hbY2hdLCAmY2hfc3RhdHMpOworCQlmb3IgKGkgPSAwOyBpIDwgQ1BTV19TVEFUU19DSF9MRU47IGkrKywgbCsrKSB7CisJCQlwID0gKHU4ICopJmNoX3N0YXRzICsKKwkJCQljcHN3X2dzdHJpbmdzX2NoX3N0YXRzW2ldLnN0YXRfb2Zmc2V0OworCQkJZGF0YVtsXSA9ICoodTMyICopcDsKIAkJfQogCX0KIH0KIAotc3RhdGljIGludCBjcHN3X2NvbW1vbl9yZXNfdXNhZ2Vfc3RhdGUoc3RydWN0IGNwc3dfcHJpdiAqcHJpdikKK3N0YXRpYyBpbnQgY3Bzd19jb21tb25fcmVzX3VzYWdlX3N0YXRlKHN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdykKIHsKIAl1MzIgaTsKIAl1MzIgdXNhZ2VfY291bnQgPSAwOwogCi0JaWYgKCFwcml2LT5kYXRhLmR1YWxfZW1hYykKKwlpZiAoIWNwc3ctPmRhdGEuZHVhbF9lbWFjKQogCQlyZXR1cm4gMDsKIAotCWZvciAoaSA9IDA7IGkgPCBwcml2LT5kYXRhLnNsYXZlczsgaSsrKQotCQlpZiAocHJpdi0+c2xhdmVzW2ldLm9wZW5fc3RhdCkKKwlmb3IgKGkgPSAwOyBpIDwgY3Bzdy0+ZGF0YS5zbGF2ZXM7IGkrKykKKwkJaWYgKGNwc3ctPnNsYXZlc1tpXS5vcGVuX3N0YXQpCiAJCQl1c2FnZV9jb3VudCsrOwogCiAJcmV0dXJuIHVzYWdlX2NvdW50OwogfQogCi1zdGF0aWMgaW5saW5lIGludCBjcHN3X3R4X3BhY2tldF9zdWJtaXQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCi0JCQlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGlubGluZSBpbnQgY3Bzd190eF9wYWNrZXRfc3VibWl0KHN0cnVjdCBjcHN3X3ByaXYgKnByaXYsCisJCQkJCXN0cnVjdCBza19idWZmICpza2IsCisJCQkJCXN0cnVjdCBjcGRtYV9jaGFuICp0eGNoKQogewotCWlmICghcHJpdi0+ZGF0YS5kdWFsX2VtYWMpCi0JCXJldHVybiBjcGRtYV9jaGFuX3N1Ym1pdChwcml2LT50eGNoLCBza2IsIHNrYi0+ZGF0YSwKLQkJCQkgIHNrYi0+bGVuLCAwKTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OwogCi0JaWYgKG5kZXYgPT0gY3Bzd19nZXRfc2xhdmVfbmRldihwcml2LCAwKSkKLQkJcmV0dXJuIGNwZG1hX2NoYW5fc3VibWl0KHByaXYtPnR4Y2gsIHNrYiwgc2tiLT5kYXRhLAotCQkJCSAgc2tiLT5sZW4sIDEpOwotCWVsc2UKLQkJcmV0dXJuIGNwZG1hX2NoYW5fc3VibWl0KHByaXYtPnR4Y2gsIHNrYiwgc2tiLT5kYXRhLAotCQkJCSAgc2tiLT5sZW4sIDIpOworCXJldHVybiBjcGRtYV9jaGFuX3N1Ym1pdCh0eGNoLCBza2IsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sCisJCQkJIHByaXYtPmVtYWNfcG9ydCArIGNwc3ctPmRhdGEuZHVhbF9lbWFjKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNwc3dfYWRkX2R1YWxfZW1hY19kZWZfYWxlX2VudHJpZXMoCiAJCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYsIHN0cnVjdCBjcHN3X3NsYXZlICpzbGF2ZSwKIAkJdTMyIHNsYXZlX3BvcnQpCiB7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKIAl1MzIgcG9ydF9tYXNrID0gMSA8PCBzbGF2ZV9wb3J0IHwgQUxFX1BPUlRfSE9TVDsKIAotCWlmIChwcml2LT52ZXJzaW9uID09IENQU1dfVkVSU0lPTl8xKQorCWlmIChjcHN3LT52ZXJzaW9uID09IENQU1dfVkVSU0lPTl8xKQogCQlzbGF2ZV93cml0ZShzbGF2ZSwgc2xhdmUtPnBvcnRfdmxhbiwgQ1BTVzFfUE9SVF9WTEFOKTsKIAllbHNlCiAJCXNsYXZlX3dyaXRlKHNsYXZlLCBzbGF2ZS0+cG9ydF92bGFuLCBDUFNXMl9QT1JUX1ZMQU4pOwotCWNwc3dfYWxlX2FkZF92bGFuKHByaXYtPmFsZSwgc2xhdmUtPnBvcnRfdmxhbiwgcG9ydF9tYXNrLAorCWNwc3dfYWxlX2FkZF92bGFuKGNwc3ctPmFsZSwgc2xhdmUtPnBvcnRfdmxhbiwgcG9ydF9tYXNrLAogCQkJICBwb3J0X21hc2ssIHBvcnRfbWFzaywgMCk7Ci0JY3Bzd19hbGVfYWRkX21jYXN0KHByaXYtPmFsZSwgcHJpdi0+bmRldi0+YnJvYWRjYXN0LAorCWNwc3dfYWxlX2FkZF9tY2FzdChjcHN3LT5hbGUsIHByaXYtPm5kZXYtPmJyb2FkY2FzdCwKIAkJCSAgIHBvcnRfbWFzaywgQUxFX1ZMQU4sIHNsYXZlLT5wb3J0X3ZsYW4sIDApOwotCWNwc3dfYWxlX2FkZF91Y2FzdChwcml2LT5hbGUsIHByaXYtPm1hY19hZGRyLAotCQlIT1NUX1BPUlRfTlVNLCBBTEVfVkxBTiB8IEFMRV9TRUNVUkUsIHNsYXZlLT5wb3J0X3ZsYW4pOworCWNwc3dfYWxlX2FkZF91Y2FzdChjcHN3LT5hbGUsIHByaXYtPm1hY19hZGRyLAorCQkJICAgSE9TVF9QT1JUX05VTSwgQUxFX1ZMQU4gfAorCQkJICAgQUxFX1NFQ1VSRSwgc2xhdmUtPnBvcnRfdmxhbik7CiB9CiAKIHN0YXRpYyB2b2lkIHNvZnRfcmVzZXRfc2xhdmUoc3RydWN0IGNwc3dfc2xhdmUgKnNsYXZlKQpAQCAtMTEwOSwxMyArMTE0OSwxNCBAQAogc3RhdGljIHZvaWQgY3Bzd19zbGF2ZV9vcGVuKHN0cnVjdCBjcHN3X3NsYXZlICpzbGF2ZSwgc3RydWN0IGNwc3dfcHJpdiAqcHJpdikKIHsKIAl1MzIgc2xhdmVfcG9ydDsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OwogCiAJc29mdF9yZXNldF9zbGF2ZShzbGF2ZSk7CiAKIAkvKiBzZXR1cCBwcmlvcml0eSBtYXBwaW5nICovCiAJX19yYXdfd3JpdGVsKFJYX1BSSU9SSVRZX01BUFBJTkcsICZzbGF2ZS0+c2xpdmVyLT5yeF9wcmlfbWFwKTsKIAotCXN3aXRjaCAocHJpdi0+dmVyc2lvbikgeworCXN3aXRjaCAoY3Bzdy0+dmVyc2lvbikgewogCWNhc2UgQ1BTV19WRVJTSU9OXzE6CiAJCXNsYXZlX3dyaXRlKHNsYXZlLCBUWF9QUklPUklUWV9NQVBQSU5HLCBDUFNXMV9UWF9QUklfTUFQKTsKIAkJYnJlYWs7CkBAIC0xMTI3LDE3ICsxMTY4LDE3IEBACiAJfQogCiAJLyogc2V0dXAgbWF4IHBhY2tldCBzaXplLCBhbmQgbWFjIGFkZHJlc3MgKi8KLQlfX3Jhd193cml0ZWwocHJpdi0+cnhfcGFja2V0X21heCwgJnNsYXZlLT5zbGl2ZXItPnJ4X21heGxlbik7CisJX19yYXdfd3JpdGVsKGNwc3ctPnJ4X3BhY2tldF9tYXgsICZzbGF2ZS0+c2xpdmVyLT5yeF9tYXhsZW4pOwogCWNwc3dfc2V0X3NsYXZlX21hYyhzbGF2ZSwgcHJpdik7CiAKIAlzbGF2ZS0+bWFjX2NvbnRyb2wgPSAwOwkvKiBubyBsaW5rIHlldCAqLwogCi0Jc2xhdmVfcG9ydCA9IGNwc3dfZ2V0X3NsYXZlX3BvcnQocHJpdiwgc2xhdmUtPnNsYXZlX251bSk7CisJc2xhdmVfcG9ydCA9IGNwc3dfZ2V0X3NsYXZlX3BvcnQoc2xhdmUtPnNsYXZlX251bSk7CiAKLQlpZiAocHJpdi0+ZGF0YS5kdWFsX2VtYWMpCisJaWYgKGNwc3ctPmRhdGEuZHVhbF9lbWFjKQogCQljcHN3X2FkZF9kdWFsX2VtYWNfZGVmX2FsZV9lbnRyaWVzKHByaXYsIHNsYXZlLCBzbGF2ZV9wb3J0KTsKIAllbHNlCi0JCWNwc3dfYWxlX2FkZF9tY2FzdChwcml2LT5hbGUsIHByaXYtPm5kZXYtPmJyb2FkY2FzdCwKKwkJY3Bzd19hbGVfYWRkX21jYXN0KGNwc3ctPmFsZSwgcHJpdi0+bmRldi0+YnJvYWRjYXN0LAogCQkJCSAgIDEgPDwgc2xhdmVfcG9ydCwgMCwgMCwgQUxFX01DQVNUX0ZXRF8yKTsKIAogCWlmIChzbGF2ZS0+ZGF0YS0+cGh5X25vZGUpIHsKQEAgLTExNjcsODEgKzEyMDgsMTIxIEBACiAJcGh5X3N0YXJ0KHNsYXZlLT5waHkpOwogCiAJLyogQ29uZmlndXJlIEdNSUlfU0VMIHJlZ2lzdGVyICovCi0JY3Bzd19waHlfc2VsKCZwcml2LT5wZGV2LT5kZXYsIHNsYXZlLT5waHktPmludGVyZmFjZSwgc2xhdmUtPnNsYXZlX251bSk7CisJY3Bzd19waHlfc2VsKGNwc3ctPmRldiwgc2xhdmUtPnBoeS0+aW50ZXJmYWNlLCBzbGF2ZS0+c2xhdmVfbnVtKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNwc3dfYWRkX2RlZmF1bHRfdmxhbihzdHJ1Y3QgY3Bzd19wcml2ICpwcml2KQogewotCWNvbnN0IGludCB2bGFuID0gcHJpdi0+ZGF0YS5kZWZhdWx0X3ZsYW47CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKKwljb25zdCBpbnQgdmxhbiA9IGNwc3ctPmRhdGEuZGVmYXVsdF92bGFuOwogCXUzMiByZWc7CiAJaW50IGk7CiAJaW50IHVucmVnX21jYXN0X21hc2s7CiAKLQlyZWcgPSAocHJpdi0+dmVyc2lvbiA9PSBDUFNXX1ZFUlNJT05fMSkgPyBDUFNXMV9QT1JUX1ZMQU4gOgorCXJlZyA9IChjcHN3LT52ZXJzaW9uID09IENQU1dfVkVSU0lPTl8xKSA/IENQU1cxX1BPUlRfVkxBTiA6CiAJICAgICAgIENQU1cyX1BPUlRfVkxBTjsKIAotCXdyaXRlbCh2bGFuLCAmcHJpdi0+aG9zdF9wb3J0X3JlZ3MtPnBvcnRfdmxhbik7CisJd3JpdGVsKHZsYW4sICZjcHN3LT5ob3N0X3BvcnRfcmVncy0+cG9ydF92bGFuKTsKIAotCWZvciAoaSA9IDA7IGkgPCBwcml2LT5kYXRhLnNsYXZlczsgaSsrKQotCQlzbGF2ZV93cml0ZShwcml2LT5zbGF2ZXMgKyBpLCB2bGFuLCByZWcpOworCWZvciAoaSA9IDA7IGkgPCBjcHN3LT5kYXRhLnNsYXZlczsgaSsrKQorCQlzbGF2ZV93cml0ZShjcHN3LT5zbGF2ZXMgKyBpLCB2bGFuLCByZWcpOwogCiAJaWYgKHByaXYtPm5kZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKQogCQl1bnJlZ19tY2FzdF9tYXNrID0gQUxFX0FMTF9QT1JUUzsKIAllbHNlCiAJCXVucmVnX21jYXN0X21hc2sgPSBBTEVfUE9SVF8xIHwgQUxFX1BPUlRfMjsKIAotCWNwc3dfYWxlX2FkZF92bGFuKHByaXYtPmFsZSwgdmxhbiwgQUxFX0FMTF9QT1JUUywKKwljcHN3X2FsZV9hZGRfdmxhbihjcHN3LT5hbGUsIHZsYW4sIEFMRV9BTExfUE9SVFMsCiAJCQkgIEFMRV9BTExfUE9SVFMsIEFMRV9BTExfUE9SVFMsCiAJCQkgIHVucmVnX21jYXN0X21hc2spOwogfQogCiBzdGF0aWMgdm9pZCBjcHN3X2luaXRfaG9zdF9wb3J0KHN0cnVjdCBjcHN3X3ByaXYgKnByaXYpCiB7Ci0JdTMyIGNvbnRyb2xfcmVnOwogCXUzMiBmaWZvX21vZGU7CisJdTMyIGNvbnRyb2xfcmVnOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IHByaXYtPmNwc3c7CiAKIAkvKiBzb2Z0IHJlc2V0IHRoZSBjb250cm9sbGVyIGFuZCBpbml0aWFsaXplIGFsZSAqLwotCXNvZnRfcmVzZXQoImNwc3ciLCAmcHJpdi0+cmVncy0+c29mdF9yZXNldCk7Ci0JY3Bzd19hbGVfc3RhcnQocHJpdi0+YWxlKTsKKwlzb2Z0X3Jlc2V0KCJjcHN3IiwgJmNwc3ctPnJlZ3MtPnNvZnRfcmVzZXQpOworCWNwc3dfYWxlX3N0YXJ0KGNwc3ctPmFsZSk7CiAKIAkvKiBzd2l0Y2ggdG8gdmxhbiB1bmF3YXJlIG1vZGUgKi8KLQljcHN3X2FsZV9jb250cm9sX3NldChwcml2LT5hbGUsIEhPU1RfUE9SVF9OVU0sIEFMRV9WTEFOX0FXQVJFLAorCWNwc3dfYWxlX2NvbnRyb2xfc2V0KGNwc3ctPmFsZSwgSE9TVF9QT1JUX05VTSwgQUxFX1ZMQU5fQVdBUkUsCiAJCQkgICAgIENQU1dfQUxFX1ZMQU5fQVdBUkUpOwotCWNvbnRyb2xfcmVnID0gcmVhZGwoJnByaXYtPnJlZ3MtPmNvbnRyb2wpOworCWNvbnRyb2xfcmVnID0gcmVhZGwoJmNwc3ctPnJlZ3MtPmNvbnRyb2wpOwogCWNvbnRyb2xfcmVnIHw9IENQU1dfVkxBTl9BV0FSRTsKLQl3cml0ZWwoY29udHJvbF9yZWcsICZwcml2LT5yZWdzLT5jb250cm9sKTsKLQlmaWZvX21vZGUgPSAocHJpdi0+ZGF0YS5kdWFsX2VtYWMpID8gQ1BTV19GSUZPX0RVQUxfTUFDX01PREUgOgorCXdyaXRlbChjb250cm9sX3JlZywgJmNwc3ctPnJlZ3MtPmNvbnRyb2wpOworCWZpZm9fbW9kZSA9IChjcHN3LT5kYXRhLmR1YWxfZW1hYykgPyBDUFNXX0ZJRk9fRFVBTF9NQUNfTU9ERSA6CiAJCSAgICAgQ1BTV19GSUZPX05PUk1BTF9NT0RFOwotCXdyaXRlbChmaWZvX21vZGUsICZwcml2LT5ob3N0X3BvcnRfcmVncy0+dHhfaW5fY3RsKTsKKwl3cml0ZWwoZmlmb19tb2RlLCAmY3Bzdy0+aG9zdF9wb3J0X3JlZ3MtPnR4X2luX2N0bCk7CiAKIAkvKiBzZXR1cCBob3N0IHBvcnQgcHJpb3JpdHkgbWFwcGluZyAqLwogCV9fcmF3X3dyaXRlbChDUERNQV9UWF9QUklPUklUWV9NQVAsCi0JCSAgICAgJnByaXYtPmhvc3RfcG9ydF9yZWdzLT5jcGRtYV90eF9wcmlfbWFwKTsKLQlfX3Jhd193cml0ZWwoMCwgJnByaXYtPmhvc3RfcG9ydF9yZWdzLT5jcGRtYV9yeF9jaGFuX21hcCk7CisJCSAgICAgJmNwc3ctPmhvc3RfcG9ydF9yZWdzLT5jcGRtYV90eF9wcmlfbWFwKTsKKwlfX3Jhd193cml0ZWwoMCwgJmNwc3ctPmhvc3RfcG9ydF9yZWdzLT5jcGRtYV9yeF9jaGFuX21hcCk7CiAKLQljcHN3X2FsZV9jb250cm9sX3NldChwcml2LT5hbGUsIEhPU1RfUE9SVF9OVU0sCisJY3Bzd19hbGVfY29udHJvbF9zZXQoY3Bzdy0+YWxlLCBIT1NUX1BPUlRfTlVNLAogCQkJICAgICBBTEVfUE9SVF9TVEFURSwgQUxFX1BPUlRfU1RBVEVfRk9SV0FSRCk7CiAKLQlpZiAoIXByaXYtPmRhdGEuZHVhbF9lbWFjKSB7Ci0JCWNwc3dfYWxlX2FkZF91Y2FzdChwcml2LT5hbGUsIHByaXYtPm1hY19hZGRyLCBIT1NUX1BPUlRfTlVNLAorCWlmICghY3Bzdy0+ZGF0YS5kdWFsX2VtYWMpIHsKKwkJY3Bzd19hbGVfYWRkX3VjYXN0KGNwc3ctPmFsZSwgcHJpdi0+bWFjX2FkZHIsIEhPU1RfUE9SVF9OVU0sCiAJCQkJICAgMCwgMCk7Ci0JCWNwc3dfYWxlX2FkZF9tY2FzdChwcml2LT5hbGUsIHByaXYtPm5kZXYtPmJyb2FkY2FzdCwKKwkJY3Bzd19hbGVfYWRkX21jYXN0KGNwc3ctPmFsZSwgcHJpdi0+bmRldi0+YnJvYWRjYXN0LAogCQkJCSAgIEFMRV9QT1JUX0hPU1QsIDAsIDAsIEFMRV9NQ0FTVF9GV0RfMik7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBjcHN3X3NsYXZlX3N0b3Aoc3RydWN0IGNwc3dfc2xhdmUgKnNsYXZlLCBzdHJ1Y3QgY3Bzd19wcml2ICpwcml2KQorc3RhdGljIGludCBjcHN3X2ZpbGxfcnhfY2hhbm5lbHMoc3RydWN0IGNwc3dfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGNoX2J1Zl9udW07CisJaW50IGNoLCBpLCByZXQ7CisKKwlmb3IgKGNoID0gMDsgY2ggPCBjcHN3LT5yeF9jaF9udW07IGNoKyspIHsKKwkJY2hfYnVmX251bSA9IGNwZG1hX2NoYW5fZ2V0X3J4X2J1Zl9udW0oY3Bzdy0+cnhjaFtjaF0pOworCQlmb3IgKGkgPSAwOyBpIDwgY2hfYnVmX251bTsgaSsrKSB7CisJCQlza2IgPSBfX25ldGRldl9hbGxvY19za2JfaXBfYWxpZ24ocHJpdi0+bmRldiwKKwkJCQkJCQkgIGNwc3ctPnJ4X3BhY2tldF9tYXgsCisJCQkJCQkJICBHRlBfS0VSTkVMKTsKKwkJCWlmICghc2tiKSB7CisJCQkJY3Bzd19lcnIocHJpdiwgaWZ1cCwgImNhbm5vdCBhbGxvY2F0ZSBza2JcbiIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCisJCQlza2Jfc2V0X3F1ZXVlX21hcHBpbmcoc2tiLCBjaCk7CisJCQlyZXQgPSBjcGRtYV9jaGFuX3N1Ym1pdChjcHN3LT5yeGNoW2NoXSwgc2tiLCBza2ItPmRhdGEsCisJCQkJCQlza2JfdGFpbHJvb20oc2tiKSwgMCk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWNwc3dfZXJyKHByaXYsIGlmdXAsCisJCQkJCSAiY2Fubm90IHN1Ym1pdCBza2IgdG8gY2hhbm5lbCAlZCByeCwgZXJyb3IgJWRcbiIsCisJCQkJCSBjaCwgcmV0KTsKKwkJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQkJa21lbWxlYWtfbm90X2xlYWsoc2tiKTsKKwkJfQorCisJCWNwc3dfaW5mbyhwcml2LCBpZnVwLCAiY2ggJWQgcngsIHN1Ym1pdHRlZCAlZCBkZXNjcmlwdG9yc1xuIiwKKwkJCSAgY2gsIGNoX2J1Zl9udW0pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjcHN3X3NsYXZlX3N0b3Aoc3RydWN0IGNwc3dfc2xhdmUgKnNsYXZlLCBzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cpCiB7CiAJdTMyIHNsYXZlX3BvcnQ7CiAKLQlzbGF2ZV9wb3J0ID0gY3Bzd19nZXRfc2xhdmVfcG9ydChwcml2LCBzbGF2ZS0+c2xhdmVfbnVtKTsKKwlzbGF2ZV9wb3J0ID0gY3Bzd19nZXRfc2xhdmVfcG9ydChzbGF2ZS0+c2xhdmVfbnVtKTsKIAogCWlmICghc2xhdmUtPnBoeSkKIAkJcmV0dXJuOwogCXBoeV9zdG9wKHNsYXZlLT5waHkpOwogCXBoeV9kaXNjb25uZWN0KHNsYXZlLT5waHkpOwogCXNsYXZlLT5waHkgPSBOVUxMOwotCWNwc3dfYWxlX2NvbnRyb2xfc2V0KHByaXYtPmFsZSwgc2xhdmVfcG9ydCwKKwljcHN3X2FsZV9jb250cm9sX3NldChjcHN3LT5hbGUsIHNsYXZlX3BvcnQsCiAJCQkgICAgIEFMRV9QT1JUX1NUQVRFLCBBTEVfUE9SVF9TVEFURV9ESVNBQkxFKTsKIAlzb2Z0X3Jlc2V0X3NsYXZlKHNsYXZlKTsKIH0KQEAgLTEyNDksMTE0ICsxMzMwLDExMSBAQAogc3RhdGljIGludCBjcHN3X25kb19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewogCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlpbnQgaSwgcmV0OworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IHByaXYtPmNwc3c7CisJaW50IHJldDsKIAl1MzIgcmVnOwogCi0JcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYygmcHJpdi0+cGRldi0+ZGV2KTsKKwlyZXQgPSBwbV9ydW50aW1lX2dldF9zeW5jKGNwc3ctPmRldik7CiAJaWYgKHJldCA8IDApIHsKLQkJcG1fcnVudGltZV9wdXRfbm9pZGxlKCZwcml2LT5wZGV2LT5kZXYpOworCQlwbV9ydW50aW1lX3B1dF9ub2lkbGUoY3Bzdy0+ZGV2KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAoIWNwc3dfY29tbW9uX3Jlc191c2FnZV9zdGF0ZShwcml2KSkKLQkJY3Bzd19pbnRyX2Rpc2FibGUocHJpdik7CisJaWYgKCFjcHN3X2NvbW1vbl9yZXNfdXNhZ2Vfc3RhdGUoY3BzdykpCisJCWNwc3dfaW50cl9kaXNhYmxlKGNwc3cpOwogCW5ldGlmX2NhcnJpZXJfb2ZmKG5kZXYpOwogCi0JcmVnID0gcHJpdi0+dmVyc2lvbjsKKwkvKiBOb3RpZnkgdGhlIHN0YWNrIG9mIHRoZSBhY3R1YWwgcXVldWUgY291bnRzLiAqLworCXJldCA9IG5ldGlmX3NldF9yZWFsX251bV90eF9xdWV1ZXMobmRldiwgY3Bzdy0+dHhfY2hfbnVtKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIocHJpdi0+ZGV2LCAiY2Fubm90IHNldCByZWFsIG51bWJlciBvZiB0eCBxdWV1ZXNcbiIpOworCQlnb3RvIGVycl9jbGVhbnVwOworCX0KKworCXJldCA9IG5ldGlmX3NldF9yZWFsX251bV9yeF9xdWV1ZXMobmRldiwgY3Bzdy0+cnhfY2hfbnVtKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIocHJpdi0+ZGV2LCAiY2Fubm90IHNldCByZWFsIG51bWJlciBvZiByeCBxdWV1ZXNcbiIpOworCQlnb3RvIGVycl9jbGVhbnVwOworCX0KKworCXJlZyA9IGNwc3ctPnZlcnNpb247CiAKIAlkZXZfaW5mbyhwcml2LT5kZXYsICJpbml0aWFsaXppbmcgY3BzdyB2ZXJzaW9uICVkLiVkICglZClcbiIsCiAJCSBDUFNXX01BSk9SX1ZFUlNJT04ocmVnKSwgQ1BTV19NSU5PUl9WRVJTSU9OKHJlZyksCiAJCSBDUFNXX1JUTF9WRVJTSU9OKHJlZykpOwogCiAJLyogaW5pdGlhbGl6ZSBob3N0IGFuZCBzbGF2ZSBwb3J0cyAqLwotCWlmICghY3Bzd19jb21tb25fcmVzX3VzYWdlX3N0YXRlKHByaXYpKQorCWlmICghY3Bzd19jb21tb25fcmVzX3VzYWdlX3N0YXRlKGNwc3cpKQogCQljcHN3X2luaXRfaG9zdF9wb3J0KHByaXYpOwogCWZvcl9lYWNoX3NsYXZlKHByaXYsIGNwc3dfc2xhdmVfb3BlbiwgcHJpdik7CiAKIAkvKiBBZGQgZGVmYXVsdCBWTEFOICovCi0JaWYgKCFwcml2LT5kYXRhLmR1YWxfZW1hYykKKwlpZiAoIWNwc3ctPmRhdGEuZHVhbF9lbWFjKQogCQljcHN3X2FkZF9kZWZhdWx0X3ZsYW4ocHJpdik7CiAJZWxzZQotCQljcHN3X2FsZV9hZGRfdmxhbihwcml2LT5hbGUsIHByaXYtPmRhdGEuZGVmYXVsdF92bGFuLAorCQljcHN3X2FsZV9hZGRfdmxhbihjcHN3LT5hbGUsIGNwc3ctPmRhdGEuZGVmYXVsdF92bGFuLAogCQkJCSAgQUxFX0FMTF9QT1JUUywgQUxFX0FMTF9QT1JUUywgMCwgMCk7CiAKLQlpZiAoIWNwc3dfY29tbW9uX3Jlc191c2FnZV9zdGF0ZShwcml2KSkgewotCQlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2X3NsMCA9IGNwc3dfZ2V0X3NsYXZlX3ByaXYocHJpdiwgMCk7Ci0JCWludCBidWZfbnVtOwotCisJaWYgKCFjcHN3X2NvbW1vbl9yZXNfdXNhZ2Vfc3RhdGUoY3BzdykpIHsKIAkJLyogc2V0dXAgdHggZG1hIHRvIGZpeGVkIHByaW8gYW5kIHplcm8gb2Zmc2V0ICovCi0JCWNwZG1hX2NvbnRyb2xfc2V0KHByaXYtPmRtYSwgQ1BETUFfVFhfUFJJT19GSVhFRCwgMSk7Ci0JCWNwZG1hX2NvbnRyb2xfc2V0KHByaXYtPmRtYSwgQ1BETUFfUlhfQlVGRkVSX09GRlNFVCwgMCk7CisJCWNwZG1hX2NvbnRyb2xfc2V0KGNwc3ctPmRtYSwgQ1BETUFfVFhfUFJJT19GSVhFRCwgMSk7CisJCWNwZG1hX2NvbnRyb2xfc2V0KGNwc3ctPmRtYSwgQ1BETUFfUlhfQlVGRkVSX09GRlNFVCwgMCk7CiAKIAkJLyogZGlzYWJsZSBwcmlvcml0eSBlbGV2YXRpb24gKi8KLQkJX19yYXdfd3JpdGVsKDAsICZwcml2LT5yZWdzLT5wdHlwZSk7CisJCV9fcmF3X3dyaXRlbCgwLCAmY3Bzdy0+cmVncy0+cHR5cGUpOwogCiAJCS8qIGVuYWJsZSBzdGF0aXN0aWNzIGNvbGxlY3Rpb24gb25seSBvbiBhbGwgcG9ydHMgKi8KLQkJX19yYXdfd3JpdGVsKDB4NywgJnByaXYtPnJlZ3MtPnN0YXRfcG9ydF9lbik7CisJCV9fcmF3X3dyaXRlbCgweDcsICZjcHN3LT5yZWdzLT5zdGF0X3BvcnRfZW4pOwogCiAJCS8qIEVuYWJsZSBpbnRlcm5hbCBmaWZvIGZsb3cgY29udHJvbCAqLwotCQl3cml0ZWwoMHg3LCAmcHJpdi0+cmVncy0+Zmxvd19jb250cm9sKTsKKwkJd3JpdGVsKDB4NywgJmNwc3ctPnJlZ3MtPmZsb3dfY29udHJvbCk7CiAKLQkJbmFwaV9lbmFibGUoJnByaXZfc2wwLT5uYXBpX3J4KTsKLQkJbmFwaV9lbmFibGUoJnByaXZfc2wwLT5uYXBpX3R4KTsKKwkJbmFwaV9lbmFibGUoJmNwc3ctPm5hcGlfcngpOworCQluYXBpX2VuYWJsZSgmY3Bzdy0+bmFwaV90eCk7CiAKLQkJaWYgKHByaXZfc2wwLT50eF9pcnFfZGlzYWJsZWQpIHsKLQkJCXByaXZfc2wwLT50eF9pcnFfZGlzYWJsZWQgPSBmYWxzZTsKLQkJCWVuYWJsZV9pcnEocHJpdi0+aXJxc190YWJsZVsxXSk7CisJCWlmIChjcHN3LT50eF9pcnFfZGlzYWJsZWQpIHsKKwkJCWNwc3ctPnR4X2lycV9kaXNhYmxlZCA9IGZhbHNlOworCQkJZW5hYmxlX2lycShjcHN3LT5pcnFzX3RhYmxlWzFdKTsKIAkJfQogCi0JCWlmIChwcml2X3NsMC0+cnhfaXJxX2Rpc2FibGVkKSB7Ci0JCQlwcml2X3NsMC0+cnhfaXJxX2Rpc2FibGVkID0gZmFsc2U7Ci0JCQllbmFibGVfaXJxKHByaXYtPmlycXNfdGFibGVbMF0pOworCQlpZiAoY3Bzdy0+cnhfaXJxX2Rpc2FibGVkKSB7CisJCQljcHN3LT5yeF9pcnFfZGlzYWJsZWQgPSBmYWxzZTsKKwkJCWVuYWJsZV9pcnEoY3Bzdy0+aXJxc190YWJsZVswXSk7CiAJCX0KIAotCQlidWZfbnVtID0gY3BkbWFfY2hhbl9nZXRfcnhfYnVmX251bShwcml2LT5kbWEpOwotCQlmb3IgKGkgPSAwOyBpIDwgYnVmX251bTsgaSsrKSB7Ci0JCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlyZXQgPSBjcHN3X2ZpbGxfcnhfY2hhbm5lbHMocHJpdik7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnJfY2xlYW51cDsKIAotCQkJcmV0ID0gLUVOT01FTTsKLQkJCXNrYiA9IF9fbmV0ZGV2X2FsbG9jX3NrYl9pcF9hbGlnbihwcml2LT5uZGV2LAotCQkJCQlwcml2LT5yeF9wYWNrZXRfbWF4LCBHRlBfS0VSTkVMKTsKLQkJCWlmICghc2tiKQotCQkJCWdvdG8gZXJyX2NsZWFudXA7Ci0JCQlyZXQgPSBjcGRtYV9jaGFuX3N1Ym1pdChwcml2LT5yeGNoLCBza2IsIHNrYi0+ZGF0YSwKLQkJCQkJc2tiX3RhaWxyb29tKHNrYiksIDApOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlrZnJlZV9za2Ioc2tiKTsKLQkJCQlnb3RvIGVycl9jbGVhbnVwOwotCQkJfQotCQl9Ci0JCS8qIGNvbnRpbnVlIGV2ZW4gaWYgd2UgZGlkbid0IG1hbmFnZSB0byBzdWJtaXQgYWxsCi0JCSAqIHJlY2VpdmUgZGVzY3MKLQkJICovCi0JCWNwc3dfaW5mbyhwcml2LCBpZnVwLCAic3VibWl0dGVkICVkIHJ4IGRlc2NyaXB0b3JzXG4iLCBpKTsKLQotCQlpZiAoY3B0c19yZWdpc3RlcigmcHJpdi0+cGRldi0+ZGV2LCBwcml2LT5jcHRzLAotCQkJCSAgcHJpdi0+ZGF0YS5jcHRzX2Nsb2NrX211bHQsCi0JCQkJICBwcml2LT5kYXRhLmNwdHNfY2xvY2tfc2hpZnQpKQorCQlpZiAoY3B0c19yZWdpc3RlcihjcHN3LT5kZXYsIGNwc3ctPmNwdHMsCisJCQkJICBjcHN3LT5kYXRhLmNwdHNfY2xvY2tfbXVsdCwKKwkJCQkgIGNwc3ctPmRhdGEuY3B0c19jbG9ja19zaGlmdCkpCiAJCQlkZXZfZXJyKHByaXYtPmRldiwgImVycm9yIHJlZ2lzdGVyaW5nIGNwdHMgZGV2aWNlXG4iKTsKIAogCX0KIAogCS8qIEVuYWJsZSBJbnRlcnJ1cHQgcGFjaW5nIGlmIGNvbmZpZ3VyZWQgKi8KLQlpZiAocHJpdi0+Y29hbF9pbnR2bCAhPSAwKSB7CisJaWYgKGNwc3ctPmNvYWxfaW50dmwgIT0gMCkgewogCQlzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSBjb2FsOwogCi0JCWNvYWwucnhfY29hbGVzY2VfdXNlY3MgPSBwcml2LT5jb2FsX2ludHZsOworCQljb2FsLnJ4X2NvYWxlc2NlX3VzZWNzID0gY3Bzdy0+Y29hbF9pbnR2bDsKIAkJY3Bzd19zZXRfY29hbGVzY2UobmRldiwgJmNvYWwpOwogCX0KIAotCWNwZG1hX2N0bHJfc3RhcnQocHJpdi0+ZG1hKTsKLQljcHN3X2ludHJfZW5hYmxlKHByaXYpOworCWNwZG1hX2N0bHJfc3RhcnQoY3Bzdy0+ZG1hKTsKKwljcHN3X2ludHJfZW5hYmxlKGNwc3cpOwogCi0JaWYgKHByaXYtPmRhdGEuZHVhbF9lbWFjKQotCQlwcml2LT5zbGF2ZXNbcHJpdi0+ZW1hY19wb3J0XS5vcGVuX3N0YXQgPSB0cnVlOworCWlmIChjcHN3LT5kYXRhLmR1YWxfZW1hYykKKwkJY3Bzdy0+c2xhdmVzW3ByaXYtPmVtYWNfcG9ydF0ub3Blbl9zdGF0ID0gdHJ1ZTsKKworCW5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXMobmRldik7CisKIAlyZXR1cm4gMDsKIAogZXJyX2NsZWFudXA6Ci0JY3BkbWFfY3Rscl9zdG9wKHByaXYtPmRtYSk7Ci0JZm9yX2VhY2hfc2xhdmUocHJpdiwgY3Bzd19zbGF2ZV9zdG9wLCBwcml2KTsKLQlwbV9ydW50aW1lX3B1dF9zeW5jKCZwcml2LT5wZGV2LT5kZXYpOworCWNwZG1hX2N0bHJfc3RvcChjcHN3LT5kbWEpOworCWZvcl9lYWNoX3NsYXZlKHByaXYsIGNwc3dfc2xhdmVfc3RvcCwgY3Bzdyk7CisJcG1fcnVudGltZV9wdXRfc3luYyhjcHN3LT5kZXYpOwogCW5ldGlmX2NhcnJpZXJfb2ZmKHByaXYtPm5kZXYpOwogCXJldHVybiByZXQ7CiB9CkBAIC0xMzY0LDI1ICsxNDQyLDI0IEBACiBzdGF0aWMgaW50IGNwc3dfbmRvX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7CiAJc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IHByaXYtPmNwc3c7CiAKIAljcHN3X2luZm8ocHJpdiwgaWZkb3duLCAic2h1dHRpbmcgZG93biBjcHN3IGRldmljZVxuIik7Ci0JbmV0aWZfc3RvcF9xdWV1ZShwcml2LT5uZGV2KTsKKwluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMocHJpdi0+bmRldik7CiAJbmV0aWZfY2Fycmllcl9vZmYocHJpdi0+bmRldik7CiAKLQlpZiAoY3Bzd19jb21tb25fcmVzX3VzYWdlX3N0YXRlKHByaXYpIDw9IDEpIHsKLQkJc3RydWN0IGNwc3dfcHJpdiAqcHJpdl9zbDAgPSBjcHN3X2dldF9zbGF2ZV9wcml2KHByaXYsIDApOwotCi0JCW5hcGlfZGlzYWJsZSgmcHJpdl9zbDAtPm5hcGlfcngpOwotCQluYXBpX2Rpc2FibGUoJnByaXZfc2wwLT5uYXBpX3R4KTsKLQkJY3B0c191bnJlZ2lzdGVyKHByaXYtPmNwdHMpOwotCQljcHN3X2ludHJfZGlzYWJsZShwcml2KTsKLQkJY3BkbWFfY3Rscl9zdG9wKHByaXYtPmRtYSk7Ci0JCWNwc3dfYWxlX3N0b3AocHJpdi0+YWxlKTsKKwlpZiAoY3Bzd19jb21tb25fcmVzX3VzYWdlX3N0YXRlKGNwc3cpIDw9IDEpIHsKKwkJbmFwaV9kaXNhYmxlKCZjcHN3LT5uYXBpX3J4KTsKKwkJbmFwaV9kaXNhYmxlKCZjcHN3LT5uYXBpX3R4KTsKKwkJY3B0c191bnJlZ2lzdGVyKGNwc3ctPmNwdHMpOworCQljcHN3X2ludHJfZGlzYWJsZShjcHN3KTsKKwkJY3BkbWFfY3Rscl9zdG9wKGNwc3ctPmRtYSk7CisJCWNwc3dfYWxlX3N0b3AoY3Bzdy0+YWxlKTsKIAl9Ci0JZm9yX2VhY2hfc2xhdmUocHJpdiwgY3Bzd19zbGF2ZV9zdG9wLCBwcml2KTsKLQlwbV9ydW50aW1lX3B1dF9zeW5jKCZwcml2LT5wZGV2LT5kZXYpOwotCWlmIChwcml2LT5kYXRhLmR1YWxfZW1hYykKLQkJcHJpdi0+c2xhdmVzW3ByaXYtPmVtYWNfcG9ydF0ub3Blbl9zdGF0ID0gZmFsc2U7CisJZm9yX2VhY2hfc2xhdmUocHJpdiwgY3Bzd19zbGF2ZV9zdG9wLCBjcHN3KTsKKwlwbV9ydW50aW1lX3B1dF9zeW5jKGNwc3ctPmRldik7CisJaWYgKGNwc3ctPmRhdGEuZHVhbF9lbWFjKQorCQljcHN3LT5zbGF2ZXNbcHJpdi0+ZW1hY19wb3J0XS5vcGVuX3N0YXQgPSBmYWxzZTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTM5MCw3ICsxNDY3LDEwIEBACiAJCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewogCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlpbnQgcmV0OworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IHByaXYtPmNwc3c7CisJc3RydWN0IG5ldGRldl9xdWV1ZSAqdHhxOworCXN0cnVjdCBjcGRtYV9jaGFuICp0eGNoOworCWludCByZXQsIHFfaWR4OwogCiAJbmV0aWZfdHJhbnNfdXBkYXRlKG5kZXYpOwogCkBAIC0xNDAxLDEyICsxNDgxLDE3IEBACiAJfQogCiAJaWYgKHNrYl9zaGluZm8oc2tiKS0+dHhfZmxhZ3MgJiBTS0JUWF9IV19UU1RBTVAgJiYKLQkJCQlwcml2LT5jcHRzLT50eF9lbmFibGUpCisJCQkJY3Bzdy0+Y3B0cy0+dHhfZW5hYmxlKQogCQlza2Jfc2hpbmZvKHNrYiktPnR4X2ZsYWdzIHw9IFNLQlRYX0lOX1BST0dSRVNTOwogCiAJc2tiX3R4X3RpbWVzdGFtcChza2IpOwogCi0JcmV0ID0gY3Bzd190eF9wYWNrZXRfc3VibWl0KG5kZXYsIHByaXYsIHNrYik7CisJcV9pZHggPSBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKTsKKwlpZiAocV9pZHggPj0gY3Bzdy0+dHhfY2hfbnVtKQorCQlxX2lkeCA9IHFfaWR4ICUgY3Bzdy0+dHhfY2hfbnVtOworCisJdHhjaCA9IGNwc3ctPnR4Y2hbcV9pZHhdOworCXJldCA9IGNwc3dfdHhfcGFja2V0X3N1Ym1pdChwcml2LCBza2IsIHR4Y2gpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKIAkJY3Bzd19lcnIocHJpdiwgdHhfZXJyLCAiZGVzYyBzdWJtaXQgZmFpbGVkXG4iKTsKIAkJZ290byBmYWlsOwpAQCAtMTQxNSwyNCArMTUwMCwyNyBAQAogCS8qIElmIHRoZXJlIGlzIG5vIG1vcmUgdHggZGVzYyBsZWZ0IGZyZWUgdGhlbiB3ZSBuZWVkIHRvCiAJICogdGVsbCB0aGUga2VybmVsIHRvIHN0b3Agc2VuZGluZyB1cyB0eCBmcmFtZXMuCiAJICovCi0JaWYgKHVubGlrZWx5KCFjcGRtYV9jaGVja19mcmVlX3R4X2Rlc2MocHJpdi0+dHhjaCkpKQotCQluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCWlmICh1bmxpa2VseSghY3BkbWFfY2hlY2tfZnJlZV90eF9kZXNjKHR4Y2gpKSkgeworCQl0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKG5kZXYsIHFfaWR4KTsKKwkJbmV0aWZfdHhfc3RvcF9xdWV1ZSh0eHEpOworCX0KIAogCXJldHVybiBORVRERVZfVFhfT0s7CiBmYWlsOgogCW5kZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKLQluZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOworCXR4cSA9IG5ldGRldl9nZXRfdHhfcXVldWUobmRldiwgc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYikpOworCW5ldGlmX3R4X3N0b3BfcXVldWUodHhxKTsKIAlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CiB9CiAKICNpZmRlZiBDT05GSUdfVElfQ1BUUwogCi1zdGF0aWMgdm9pZCBjcHN3X2h3dHN0YW1wX3YxKHN0cnVjdCBjcHN3X3ByaXYgKnByaXYpCitzdGF0aWMgdm9pZCBjcHN3X2h3dHN0YW1wX3YxKHN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdykKIHsKLQlzdHJ1Y3QgY3Bzd19zbGF2ZSAqc2xhdmUgPSAmcHJpdi0+c2xhdmVzW3ByaXYtPmRhdGEuYWN0aXZlX3NsYXZlXTsKKwlzdHJ1Y3QgY3Bzd19zbGF2ZSAqc2xhdmUgPSAmY3Bzdy0+c2xhdmVzW2Nwc3ctPmRhdGEuYWN0aXZlX3NsYXZlXTsKIAl1MzIgdHNfZW4sIHNlcV9pZDsKIAotCWlmICghcHJpdi0+Y3B0cy0+dHhfZW5hYmxlICYmICFwcml2LT5jcHRzLT5yeF9lbmFibGUpIHsKKwlpZiAoIWNwc3ctPmNwdHMtPnR4X2VuYWJsZSAmJiAhY3Bzdy0+Y3B0cy0+cnhfZW5hYmxlKSB7CiAJCXNsYXZlX3dyaXRlKHNsYXZlLCAwLCBDUFNXMV9UU19DVEwpOwogCQlyZXR1cm47CiAJfQpAQCAtMTQ0MCwxMCArMTUyOCwxMCBAQAogCXNlcV9pZCA9ICgzMCA8PCBDUFNXX1YxX1NFUV9JRF9PRlNfU0hJRlQpIHwgRVRIX1BfMTU4ODsKIAl0c19lbiA9IEVWRU5UX01TR19CSVRTIDw8IENQU1dfVjFfTVNHX1RZUEVfT0ZTOwogCi0JaWYgKHByaXYtPmNwdHMtPnR4X2VuYWJsZSkKKwlpZiAoY3Bzdy0+Y3B0cy0+dHhfZW5hYmxlKQogCQl0c19lbiB8PSBDUFNXX1YxX1RTX1RYX0VOOwogCi0JaWYgKHByaXYtPmNwdHMtPnJ4X2VuYWJsZSkKKwlpZiAoY3Bzdy0+Y3B0cy0+cnhfZW5hYmxlKQogCQl0c19lbiB8PSBDUFNXX1YxX1RTX1JYX0VOOwogCiAJc2xhdmVfd3JpdGUoc2xhdmUsIHRzX2VuLCBDUFNXMV9UU19DVEwpOwpAQCAtMTQ1MywzMiArMTU0MSwzMyBAQAogc3RhdGljIHZvaWQgY3Bzd19od3RzdGFtcF92MihzdHJ1Y3QgY3Bzd19wcml2ICpwcml2KQogewogCXN0cnVjdCBjcHN3X3NsYXZlICpzbGF2ZTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OwogCXUzMiBjdHJsLCBtdHlwZTsKIAotCWlmIChwcml2LT5kYXRhLmR1YWxfZW1hYykKLQkJc2xhdmUgPSAmcHJpdi0+c2xhdmVzW3ByaXYtPmVtYWNfcG9ydF07CisJaWYgKGNwc3ctPmRhdGEuZHVhbF9lbWFjKQorCQlzbGF2ZSA9ICZjcHN3LT5zbGF2ZXNbcHJpdi0+ZW1hY19wb3J0XTsKIAllbHNlCi0JCXNsYXZlID0gJnByaXYtPnNsYXZlc1twcml2LT5kYXRhLmFjdGl2ZV9zbGF2ZV07CisJCXNsYXZlID0gJmNwc3ctPnNsYXZlc1tjcHN3LT5kYXRhLmFjdGl2ZV9zbGF2ZV07CiAKIAljdHJsID0gc2xhdmVfcmVhZChzbGF2ZSwgQ1BTVzJfQ09OVFJPTCk7Ci0Jc3dpdGNoIChwcml2LT52ZXJzaW9uKSB7CisJc3dpdGNoIChjcHN3LT52ZXJzaW9uKSB7CiAJY2FzZSBDUFNXX1ZFUlNJT05fMjoKIAkJY3RybCAmPSB+Q1RSTF9WMl9BTExfVFNfTUFTSzsKIAotCQlpZiAocHJpdi0+Y3B0cy0+dHhfZW5hYmxlKQorCQlpZiAoY3Bzdy0+Y3B0cy0+dHhfZW5hYmxlKQogCQkJY3RybCB8PSBDVFJMX1YyX1RYX1RTX0JJVFM7CiAKLQkJaWYgKHByaXYtPmNwdHMtPnJ4X2VuYWJsZSkKKwkJaWYgKGNwc3ctPmNwdHMtPnJ4X2VuYWJsZSkKIAkJCWN0cmwgfD0gQ1RSTF9WMl9SWF9UU19CSVRTOwogCQlicmVhazsKIAljYXNlIENQU1dfVkVSU0lPTl8zOgogCWRlZmF1bHQ6CiAJCWN0cmwgJj0gfkNUUkxfVjNfQUxMX1RTX01BU0s7CiAKLQkJaWYgKHByaXYtPmNwdHMtPnR4X2VuYWJsZSkKKwkJaWYgKGNwc3ctPmNwdHMtPnR4X2VuYWJsZSkKIAkJCWN0cmwgfD0gQ1RSTF9WM19UWF9UU19CSVRTOwogCi0JCWlmIChwcml2LT5jcHRzLT5yeF9lbmFibGUpCisJCWlmIChjcHN3LT5jcHRzLT5yeF9lbmFibGUpCiAJCQljdHJsIHw9IENUUkxfVjNfUlhfVFNfQklUUzsKIAkJYnJlYWs7CiAJfQpAQCAtMTQ4NywxOCArMTU3NiwxOSBAQAogCiAJc2xhdmVfd3JpdGUoc2xhdmUsIG10eXBlLCBDUFNXMl9UU19TRVFfTVRZUEUpOwogCXNsYXZlX3dyaXRlKHNsYXZlLCBjdHJsLCBDUFNXMl9DT05UUk9MKTsKLQlfX3Jhd193cml0ZWwoRVRIX1BfMTU4OCwgJnByaXYtPnJlZ3MtPnRzX2x0eXBlKTsKKwlfX3Jhd193cml0ZWwoRVRIX1BfMTU4OCwgJmNwc3ctPnJlZ3MtPnRzX2x0eXBlKTsKIH0KIAogc3RhdGljIGludCBjcHN3X2h3dHN0YW1wX3NldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmcikKIHsKIAlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgY3B0cyAqY3B0cyA9IHByaXYtPmNwdHM7CiAJc3RydWN0IGh3dHN0YW1wX2NvbmZpZyBjZmc7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKKwlzdHJ1Y3QgY3B0cyAqY3B0cyA9IGNwc3ctPmNwdHM7CiAKLQlpZiAocHJpdi0+dmVyc2lvbiAhPSBDUFNXX1ZFUlNJT05fMSAmJgotCSAgICBwcml2LT52ZXJzaW9uICE9IENQU1dfVkVSU0lPTl8yICYmCi0JICAgIHByaXYtPnZlcnNpb24gIT0gQ1BTV19WRVJTSU9OXzMpCisJaWYgKGNwc3ctPnZlcnNpb24gIT0gQ1BTV19WRVJTSU9OXzEgJiYKKwkgICAgY3Bzdy0+dmVyc2lvbiAhPSBDUFNXX1ZFUlNJT05fMiAmJgorCSAgICBjcHN3LT52ZXJzaW9uICE9IENQU1dfVkVSU0lPTl8zKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmNmZywgaWZyLT5pZnJfZGF0YSwgc2l6ZW9mKGNmZykpKQpAQCAtMTUzOCw5ICsxNjI4LDkgQEAKIAogCWNwdHMtPnR4X2VuYWJsZSA9IGNmZy50eF90eXBlID09IEhXVFNUQU1QX1RYX09OOwogCi0Jc3dpdGNoIChwcml2LT52ZXJzaW9uKSB7CisJc3dpdGNoIChjcHN3LT52ZXJzaW9uKSB7CiAJY2FzZSBDUFNXX1ZFUlNJT05fMToKLQkJY3Bzd19od3RzdGFtcF92MShwcml2KTsKKwkJY3Bzd19od3RzdGFtcF92MShjcHN3KTsKIAkJYnJlYWs7CiAJY2FzZSBDUFNXX1ZFUlNJT05fMjoKIAljYXNlIENQU1dfVkVSU0lPTl8zOgpAQCAtMTU1NSwxMyArMTY0NSwxMyBAQAogCiBzdGF0aWMgaW50IGNwc3dfaHd0c3RhbXBfZ2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyKQogewotCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBjcHRzICpjcHRzID0gcHJpdi0+Y3B0czsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBuZGV2X3RvX2Nwc3coZGV2KTsKKwlzdHJ1Y3QgY3B0cyAqY3B0cyA9IGNwc3ctPmNwdHM7CiAJc3RydWN0IGh3dHN0YW1wX2NvbmZpZyBjZmc7CiAKLQlpZiAocHJpdi0+dmVyc2lvbiAhPSBDUFNXX1ZFUlNJT05fMSAmJgotCSAgICBwcml2LT52ZXJzaW9uICE9IENQU1dfVkVSU0lPTl8yICYmCi0JICAgIHByaXYtPnZlcnNpb24gIT0gQ1BTV19WRVJTSU9OXzMpCisJaWYgKGNwc3ctPnZlcnNpb24gIT0gQ1BTV19WRVJTSU9OXzEgJiYKKwkgICAgY3Bzdy0+dmVyc2lvbiAhPSBDUFNXX1ZFUlNJT05fMiAmJgorCSAgICBjcHN3LT52ZXJzaW9uICE9IENQU1dfVkVSU0lPTl8zKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAljZmcuZmxhZ3MgPSAwOwpAQCAtMTU3Nyw3ICsxNjY3LDggQEAKIHN0YXRpYyBpbnQgY3Bzd19uZG9faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpyZXEsIGludCBjbWQpCiB7CiAJc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IHNsYXZlX25vID0gY3Bzd19zbGF2ZV9pbmRleChwcml2KTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OworCWludCBzbGF2ZV9ubyA9IGNwc3dfc2xhdmVfaW5kZXgoY3BzdywgcHJpdik7CiAKIAlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNTkxLDI3ICsxNjgyLDMzIEBACiAjZW5kaWYKIAl9CiAKLQlpZiAoIXByaXYtPnNsYXZlc1tzbGF2ZV9ub10ucGh5KQorCWlmICghY3Bzdy0+c2xhdmVzW3NsYXZlX25vXS5waHkpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKLQlyZXR1cm4gcGh5X21paV9pb2N0bChwcml2LT5zbGF2ZXNbc2xhdmVfbm9dLnBoeSwgcmVxLCBjbWQpOworCXJldHVybiBwaHlfbWlpX2lvY3RsKGNwc3ctPnNsYXZlc1tzbGF2ZV9ub10ucGh5LCByZXEsIGNtZCk7CiB9CiAKIHN0YXRpYyB2b2lkIGNwc3dfbmRvX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7CiAJc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IHByaXYtPmNwc3c7CisJaW50IGNoOwogCiAJY3Bzd19lcnIocHJpdiwgdHhfZXJyLCAidHJhbnNtaXQgdGltZW91dCwgcmVzdGFydGluZyBkbWFcbiIpOwogCW5kZXYtPnN0YXRzLnR4X2Vycm9ycysrOwotCWNwc3dfaW50cl9kaXNhYmxlKHByaXYpOwotCWNwZG1hX2NoYW5fc3RvcChwcml2LT50eGNoKTsKLQljcGRtYV9jaGFuX3N0YXJ0KHByaXYtPnR4Y2gpOwotCWNwc3dfaW50cl9lbmFibGUocHJpdik7CisJY3Bzd19pbnRyX2Rpc2FibGUoY3Bzdyk7CisJZm9yIChjaCA9IDA7IGNoIDwgY3Bzdy0+dHhfY2hfbnVtOyBjaCsrKSB7CisJCWNwZG1hX2NoYW5fc3RvcChjcHN3LT50eGNoW2NoXSk7CisJCWNwZG1hX2NoYW5fc3RhcnQoY3Bzdy0+dHhjaFtjaF0pOworCX0KKworCWNwc3dfaW50cl9lbmFibGUoY3Bzdyk7CiB9CiAKIHN0YXRpYyBpbnQgY3Bzd19uZG9fc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB2b2lkICpwKQogewogCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopcDsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OwogCWludCBmbGFncyA9IDA7CiAJdTE2IHZpZCA9IDA7CiAJaW50IHJldDsKQEAgLTE2MTksMjcgKzE3MTYsMjcgQEAKIAlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkci0+c2FfZGF0YSkpCiAJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKIAotCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoJnByaXYtPnBkZXYtPmRldik7CisJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyhjcHN3LT5kZXYpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXBtX3J1bnRpbWVfcHV0X25vaWRsZSgmcHJpdi0+cGRldi0+ZGV2KTsKKwkJcG1fcnVudGltZV9wdXRfbm9pZGxlKGNwc3ctPmRldik7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JaWYgKHByaXYtPmRhdGEuZHVhbF9lbWFjKSB7Ci0JCXZpZCA9IHByaXYtPnNsYXZlc1twcml2LT5lbWFjX3BvcnRdLnBvcnRfdmxhbjsKKwlpZiAoY3Bzdy0+ZGF0YS5kdWFsX2VtYWMpIHsKKwkJdmlkID0gY3Bzdy0+c2xhdmVzW3ByaXYtPmVtYWNfcG9ydF0ucG9ydF92bGFuOwogCQlmbGFncyA9IEFMRV9WTEFOOwogCX0KIAotCWNwc3dfYWxlX2RlbF91Y2FzdChwcml2LT5hbGUsIHByaXYtPm1hY19hZGRyLCBIT1NUX1BPUlRfTlVNLAorCWNwc3dfYWxlX2RlbF91Y2FzdChjcHN3LT5hbGUsIHByaXYtPm1hY19hZGRyLCBIT1NUX1BPUlRfTlVNLAogCQkJICAgZmxhZ3MsIHZpZCk7Ci0JY3Bzd19hbGVfYWRkX3VjYXN0KHByaXYtPmFsZSwgYWRkci0+c2FfZGF0YSwgSE9TVF9QT1JUX05VTSwKKwljcHN3X2FsZV9hZGRfdWNhc3QoY3Bzdy0+YWxlLCBhZGRyLT5zYV9kYXRhLCBIT1NUX1BPUlRfTlVNLAogCQkJICAgZmxhZ3MsIHZpZCk7CiAKIAltZW1jcHkocHJpdi0+bWFjX2FkZHIsIGFkZHItPnNhX2RhdGEsIEVUSF9BTEVOKTsKIAltZW1jcHkobmRldi0+ZGV2X2FkZHIsIHByaXYtPm1hY19hZGRyLCBFVEhfQUxFTik7CiAJZm9yX2VhY2hfc2xhdmUocHJpdiwgY3Bzd19zZXRfc2xhdmVfbWFjLCBwcml2KTsKIAotCXBtX3J1bnRpbWVfcHV0KCZwcml2LT5wZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfcHV0KGNwc3ctPmRldik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE2NDcsMTIgKzE3NDQsMTIgQEAKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogc3RhdGljIHZvaWQgY3Bzd19uZG9fcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewotCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBuZGV2X3RvX2Nwc3cobmRldik7CiAKLQljcHN3X2ludHJfZGlzYWJsZShwcml2KTsKLQljcHN3X3J4X2ludGVycnVwdChwcml2LT5pcnFzX3RhYmxlWzBdLCBwcml2KTsKLQljcHN3X3R4X2ludGVycnVwdChwcml2LT5pcnFzX3RhYmxlWzFdLCBwcml2KTsKLQljcHN3X2ludHJfZW5hYmxlKHByaXYpOworCWNwc3dfaW50cl9kaXNhYmxlKGNwc3cpOworCWNwc3dfcnhfaW50ZXJydXB0KGNwc3ctPmlycXNfdGFibGVbMF0sIGNwc3cpOworCWNwc3dfdHhfaW50ZXJydXB0KGNwc3ctPmlycXNfdGFibGVbMV0sIGNwc3cpOworCWNwc3dfaW50cl9lbmFibGUoY3Bzdyk7CiB9CiAjZW5kaWYKIApAQCAtMTY2Miw4ICsxNzU5LDkgQEAKIAlpbnQgcmV0OwogCWludCB1bnJlZ19tY2FzdF9tYXNrID0gMDsKIAl1MzIgcG9ydF9tYXNrOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IHByaXYtPmNwc3c7CiAKLQlpZiAocHJpdi0+ZGF0YS5kdWFsX2VtYWMpIHsKKwlpZiAoY3Bzdy0+ZGF0YS5kdWFsX2VtYWMpIHsKIAkJcG9ydF9tYXNrID0gKDEgPDwgKHByaXYtPmVtYWNfcG9ydCArIDEpKSB8IEFMRV9QT1JUX0hPU1Q7CiAKIAkJaWYgKHByaXYtPm5kZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKQpAQCAtMTY3NywyNyArMTc3NSwyNyBAQAogCQkJdW5yZWdfbWNhc3RfbWFzayA9IEFMRV9QT1JUXzEgfCBBTEVfUE9SVF8yOwogCX0KIAotCXJldCA9IGNwc3dfYWxlX2FkZF92bGFuKHByaXYtPmFsZSwgdmlkLCBwb3J0X21hc2ssIDAsIHBvcnRfbWFzaywKKwlyZXQgPSBjcHN3X2FsZV9hZGRfdmxhbihjcHN3LT5hbGUsIHZpZCwgcG9ydF9tYXNrLCAwLCBwb3J0X21hc2ssCiAJCQkJdW5yZWdfbWNhc3RfbWFzayk7CiAJaWYgKHJldCAhPSAwKQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gY3Bzd19hbGVfYWRkX3VjYXN0KHByaXYtPmFsZSwgcHJpdi0+bWFjX2FkZHIsCisJcmV0ID0gY3Bzd19hbGVfYWRkX3VjYXN0KGNwc3ctPmFsZSwgcHJpdi0+bWFjX2FkZHIsCiAJCQkJIEhPU1RfUE9SVF9OVU0sIEFMRV9WTEFOLCB2aWQpOwogCWlmIChyZXQgIT0gMCkKIAkJZ290byBjbGVhbl92aWQ7CiAKLQlyZXQgPSBjcHN3X2FsZV9hZGRfbWNhc3QocHJpdi0+YWxlLCBwcml2LT5uZGV2LT5icm9hZGNhc3QsCisJcmV0ID0gY3Bzd19hbGVfYWRkX21jYXN0KGNwc3ctPmFsZSwgcHJpdi0+bmRldi0+YnJvYWRjYXN0LAogCQkJCSBwb3J0X21hc2ssIEFMRV9WTEFOLCB2aWQsIDApOwogCWlmIChyZXQgIT0gMCkKIAkJZ290byBjbGVhbl92bGFuX3VjYXN0OwogCXJldHVybiAwOwogCiBjbGVhbl92bGFuX3VjYXN0OgotCWNwc3dfYWxlX2RlbF91Y2FzdChwcml2LT5hbGUsIHByaXYtPm1hY19hZGRyLAorCWNwc3dfYWxlX2RlbF91Y2FzdChjcHN3LT5hbGUsIHByaXYtPm1hY19hZGRyLAogCQkJICAgSE9TVF9QT1JUX05VTSwgQUxFX1ZMQU4sIHZpZCk7CiBjbGVhbl92aWQ6Ci0JY3Bzd19hbGVfZGVsX3ZsYW4ocHJpdi0+YWxlLCB2aWQsIDApOworCWNwc3dfYWxlX2RlbF92bGFuKGNwc3ctPmFsZSwgdmlkLCAwKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNzA1LDI2ICsxODAzLDI3IEBACiAJCQkJICAgIF9fYmUxNiBwcm90bywgdTE2IHZpZCkKIHsKIAlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKIAlpbnQgcmV0OwogCi0JaWYgKHZpZCA9PSBwcml2LT5kYXRhLmRlZmF1bHRfdmxhbikKKwlpZiAodmlkID09IGNwc3ctPmRhdGEuZGVmYXVsdF92bGFuKQogCQlyZXR1cm4gMDsKIAotCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoJnByaXYtPnBkZXYtPmRldik7CisJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyhjcHN3LT5kZXYpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXBtX3J1bnRpbWVfcHV0X25vaWRsZSgmcHJpdi0+cGRldi0+ZGV2KTsKKwkJcG1fcnVudGltZV9wdXRfbm9pZGxlKGNwc3ctPmRldik7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JaWYgKHByaXYtPmRhdGEuZHVhbF9lbWFjKSB7CisJaWYgKGNwc3ctPmRhdGEuZHVhbF9lbWFjKSB7CiAJCS8qIEluIGR1YWwgRU1BQywgcmVzZXJ2ZWQgVkxBTiBpZCBzaG91bGQgbm90IGJlIHVzZWQgZm9yCiAJCSAqIGNyZWF0aW5nIFZMQU4gaW50ZXJmYWNlcyBhcyB0aGlzIGNhbiBicmVhayB0aGUgZHVhbAogCQkgKiBFTUFDIHBvcnQgc2VwYXJhdGlvbgogCQkgKi8KIAkJaW50IGk7CiAKLQkJZm9yIChpID0gMDsgaSA8IHByaXYtPmRhdGEuc2xhdmVzOyBpKyspIHsKLQkJCWlmICh2aWQgPT0gcHJpdi0+c2xhdmVzW2ldLnBvcnRfdmxhbikKKwkJZm9yIChpID0gMDsgaSA8IGNwc3ctPmRhdGEuc2xhdmVzOyBpKyspIHsKKwkJCWlmICh2aWQgPT0gY3Bzdy0+c2xhdmVzW2ldLnBvcnRfdmxhbikKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KQEAgLTE3MzIsNyArMTgzMSw3IEBACiAJZGV2X2luZm8ocHJpdi0+ZGV2LCAiQWRkaW5nIHZsYW5pZCAlZCB0byB2bGFuIGZpbHRlclxuIiwgdmlkKTsKIAlyZXQgPSBjcHN3X2FkZF92bGFuX2FsZV9lbnRyeShwcml2LCB2aWQpOwogCi0JcG1fcnVudGltZV9wdXQoJnByaXYtPnBkZXYtPmRldik7CisJcG1fcnVudGltZV9wdXQoY3Bzdy0+ZGV2KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNzQwLDM5ICsxODM5LDQwIEBACiAJCQkJICAgICBfX2JlMTYgcHJvdG8sIHUxNiB2aWQpCiB7CiAJc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IHByaXYtPmNwc3c7CiAJaW50IHJldDsKIAotCWlmICh2aWQgPT0gcHJpdi0+ZGF0YS5kZWZhdWx0X3ZsYW4pCisJaWYgKHZpZCA9PSBjcHN3LT5kYXRhLmRlZmF1bHRfdmxhbikKIAkJcmV0dXJuIDA7CiAKLQlyZXQgPSBwbV9ydW50aW1lX2dldF9zeW5jKCZwcml2LT5wZGV2LT5kZXYpOworCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoY3Bzdy0+ZGV2KTsKIAlpZiAocmV0IDwgMCkgewotCQlwbV9ydW50aW1lX3B1dF9ub2lkbGUoJnByaXYtPnBkZXYtPmRldik7CisJCXBtX3J1bnRpbWVfcHV0X25vaWRsZShjcHN3LT5kZXYpOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCWlmIChwcml2LT5kYXRhLmR1YWxfZW1hYykgeworCWlmIChjcHN3LT5kYXRhLmR1YWxfZW1hYykgewogCQlpbnQgaTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+ZGF0YS5zbGF2ZXM7IGkrKykgewotCQkJaWYgKHZpZCA9PSBwcml2LT5zbGF2ZXNbaV0ucG9ydF92bGFuKQorCQlmb3IgKGkgPSAwOyBpIDwgY3Bzdy0+ZGF0YS5zbGF2ZXM7IGkrKykgeworCQkJaWYgKHZpZCA9PSBjcHN3LT5zbGF2ZXNbaV0ucG9ydF92bGFuKQogCQkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQogCiAJZGV2X2luZm8ocHJpdi0+ZGV2LCAicmVtb3ZpbmcgdmxhbmlkICVkIGZyb20gdmxhbiBmaWx0ZXJcbiIsIHZpZCk7Ci0JcmV0ID0gY3Bzd19hbGVfZGVsX3ZsYW4ocHJpdi0+YWxlLCB2aWQsIDApOworCXJldCA9IGNwc3dfYWxlX2RlbF92bGFuKGNwc3ctPmFsZSwgdmlkLCAwKTsKIAlpZiAocmV0ICE9IDApCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBjcHN3X2FsZV9kZWxfdWNhc3QocHJpdi0+YWxlLCBwcml2LT5tYWNfYWRkciwKKwlyZXQgPSBjcHN3X2FsZV9kZWxfdWNhc3QoY3Bzdy0+YWxlLCBwcml2LT5tYWNfYWRkciwKIAkJCQkgSE9TVF9QT1JUX05VTSwgQUxFX1ZMQU4sIHZpZCk7CiAJaWYgKHJldCAhPSAwKQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gY3Bzd19hbGVfZGVsX21jYXN0KHByaXYtPmFsZSwgcHJpdi0+bmRldi0+YnJvYWRjYXN0LAorCXJldCA9IGNwc3dfYWxlX2RlbF9tY2FzdChjcHN3LT5hbGUsIHByaXYtPm5kZXYtPmJyb2FkY2FzdCwKIAkJCQkgMCwgQUxFX1ZMQU4sIHZpZCk7Ci0JcG1fcnVudGltZV9wdXQoJnByaXYtPnBkZXYtPmRldik7CisJcG1fcnVudGltZV9wdXQoY3Bzdy0+ZGV2KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNzk1LDMxICsxODk1LDMyIEBACiAKIHN0YXRpYyBpbnQgY3Bzd19nZXRfcmVnc19sZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7Ci0Jc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IG5kZXZfdG9fY3BzdyhuZGV2KTsKIAotCXJldHVybiBwcml2LT5kYXRhLmFsZV9lbnRyaWVzICogQUxFX0VOVFJZX1dPUkRTICogc2l6ZW9mKHUzMik7CisJcmV0dXJuIGNwc3ctPmRhdGEuYWxlX2VudHJpZXMgKiBBTEVfRU5UUllfV09SRFMgKiBzaXplb2YodTMyKTsKIH0KIAogc3RhdGljIHZvaWQgY3Bzd19nZXRfcmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKIAkJCSAgc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywgdm9pZCAqcCkKIHsKLQlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJdTMyICpyZWcgPSBwOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IG5kZXZfdG9fY3BzdyhuZGV2KTsKIAogCS8qIHVwZGF0ZSBDUFNXIElQIHZlcnNpb24gKi8KLQlyZWdzLT52ZXJzaW9uID0gcHJpdi0+dmVyc2lvbjsKKwlyZWdzLT52ZXJzaW9uID0gY3Bzdy0+dmVyc2lvbjsKIAotCWNwc3dfYWxlX2R1bXAocHJpdi0+YWxlLCByZWcpOworCWNwc3dfYWxlX2R1bXAoY3Bzdy0+YWxlLCByZWcpOwogfQogCiBzdGF0aWMgdm9pZCBjcHN3X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAogCQkJICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQogewotCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBuZGV2X3RvX2Nwc3cobmRldik7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShjcHN3LT5kZXYpOwogCiAJc3RybGNweShpbmZvLT5kcml2ZXIsICJjcHN3Iiwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOwogCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgIjEuMCIsIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7Ci0Jc3RybGNweShpbmZvLT5idXNfaW5mbywgcHJpdi0+cGRldi0+bmFtZSwgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CisJc3RybGNweShpbmZvLT5idXNfaW5mbywgcGRldi0+bmFtZSwgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CiB9CiAKIHN0YXRpYyB1MzIgY3Bzd19nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCkBAIC0xODM4LDcgKzE5MzksNyBAQAogCQkJICAgIHN0cnVjdCBldGh0b29sX3RzX2luZm8gKmluZm8pCiB7CiAjaWZkZWYgQ09ORklHX1RJX0NQVFMKLQlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gbmRldl90b19jcHN3KG5kZXYpOwogCiAJaW5mby0+c29fdGltZXN0YW1waW5nID0KIAkJU09GX1RJTUVTVEFNUElOR19UWF9IQVJEV0FSRSB8CkBAIC0xODQ3LDcgKzE5NDgsNyBAQAogCQlTT0ZfVElNRVNUQU1QSU5HX1JYX1NPRlRXQVJFIHwKIAkJU09GX1RJTUVTVEFNUElOR19TT0ZUV0FSRSB8CiAJCVNPRl9USU1FU1RBTVBJTkdfUkFXX0hBUkRXQVJFOwotCWluZm8tPnBoY19pbmRleCA9IHByaXYtPmNwdHMtPnBoY19pbmRleDsKKwlpbmZvLT5waGNfaW5kZXggPSBjcHN3LT5jcHRzLT5waGNfaW5kZXg7CiAJaW5mby0+dHhfdHlwZXMgPQogCQkoMSA8PCBIV1RTVEFNUF9UWF9PRkYpIHwKIAkJKDEgPDwgSFdUU1RBTVBfVFhfT04pOwpAQCAtMTg3MCwxMCArMTk3MSwxMSBAQAogCQkJICAgICBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCiB7CiAJc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwotCWludCBzbGF2ZV9ubyA9IGNwc3dfc2xhdmVfaW5kZXgocHJpdik7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKKwlpbnQgc2xhdmVfbm8gPSBjcHN3X3NsYXZlX2luZGV4KGNwc3csIHByaXYpOwogCi0JaWYgKHByaXYtPnNsYXZlc1tzbGF2ZV9ub10ucGh5KQotCQlyZXR1cm4gcGh5X2V0aHRvb2xfZ3NldChwcml2LT5zbGF2ZXNbc2xhdmVfbm9dLnBoeSwgZWNtZCk7CisJaWYgKGNwc3ctPnNsYXZlc1tzbGF2ZV9ub10ucGh5KQorCQlyZXR1cm4gcGh5X2V0aHRvb2xfZ3NldChjcHN3LT5zbGF2ZXNbc2xhdmVfbm9dLnBoeSwgZWNtZCk7CiAJZWxzZQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CkBAIC0xODgxLDEwICsxOTgzLDExIEBACiBzdGF0aWMgaW50IGNwc3dfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCiB7CiAJc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwotCWludCBzbGF2ZV9ubyA9IGNwc3dfc2xhdmVfaW5kZXgocHJpdik7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKKwlpbnQgc2xhdmVfbm8gPSBjcHN3X3NsYXZlX2luZGV4KGNwc3csIHByaXYpOwogCi0JaWYgKHByaXYtPnNsYXZlc1tzbGF2ZV9ub10ucGh5KQotCQlyZXR1cm4gcGh5X2V0aHRvb2xfc3NldChwcml2LT5zbGF2ZXNbc2xhdmVfbm9dLnBoeSwgZWNtZCk7CisJaWYgKGNwc3ctPnNsYXZlc1tzbGF2ZV9ub10ucGh5KQorCQlyZXR1cm4gcGh5X2V0aHRvb2xfc3NldChjcHN3LT5zbGF2ZXNbc2xhdmVfbm9dLnBoeSwgZWNtZCk7CiAJZWxzZQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CkBAIC0xODkyLDIyICsxOTk1LDI0IEBACiBzdGF0aWMgdm9pZCBjcHN3X2dldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKIHsKIAlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7Ci0JaW50IHNsYXZlX25vID0gY3Bzd19zbGF2ZV9pbmRleChwcml2KTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OworCWludCBzbGF2ZV9ubyA9IGNwc3dfc2xhdmVfaW5kZXgoY3BzdywgcHJpdik7CiAKIAl3b2wtPnN1cHBvcnRlZCA9IDA7CiAJd29sLT53b2xvcHRzID0gMDsKIAotCWlmIChwcml2LT5zbGF2ZXNbc2xhdmVfbm9dLnBoeSkKLQkJcGh5X2V0aHRvb2xfZ2V0X3dvbChwcml2LT5zbGF2ZXNbc2xhdmVfbm9dLnBoeSwgd29sKTsKKwlpZiAoY3Bzdy0+c2xhdmVzW3NsYXZlX25vXS5waHkpCisJCXBoeV9ldGh0b29sX2dldF93b2woY3Bzdy0+c2xhdmVzW3NsYXZlX25vXS5waHksIHdvbCk7CiB9CiAKIHN0YXRpYyBpbnQgY3Bzd19zZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCiB7CiAJc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwotCWludCBzbGF2ZV9ubyA9IGNwc3dfc2xhdmVfaW5kZXgocHJpdik7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKKwlpbnQgc2xhdmVfbm8gPSBjcHN3X3NsYXZlX2luZGV4KGNwc3csIHByaXYpOwogCi0JaWYgKHByaXYtPnNsYXZlc1tzbGF2ZV9ub10ucGh5KQotCQlyZXR1cm4gcGh5X2V0aHRvb2xfc2V0X3dvbChwcml2LT5zbGF2ZXNbc2xhdmVfbm9dLnBoeSwgd29sKTsKKwlpZiAoY3Bzdy0+c2xhdmVzW3NsYXZlX25vXS5waHkpCisJCXJldHVybiBwaHlfZXRodG9vbF9zZXRfd29sKGNwc3ctPnNsYXZlc1tzbGF2ZV9ub10ucGh5LCB3b2wpOwogCWVsc2UKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQpAQCAtMTkzOCwxMiArMjA0MywxMyBAQAogc3RhdGljIGludCBjcHN3X2V0aHRvb2xfb3BfYmVnaW4oc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7CiAJc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IHByaXYtPmNwc3c7CiAJaW50IHJldDsKIAotCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoJnByaXYtPnBkZXYtPmRldik7CisJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyhjcHN3LT5kZXYpOwogCWlmIChyZXQgPCAwKSB7CiAJCWNwc3dfZXJyKHByaXYsIGRydiwgImV0aHRvb2wgYmVnaW4gZmFpbGVkICVkXG4iLCByZXQpOwotCQlwbV9ydW50aW1lX3B1dF9ub2lkbGUoJnByaXYtPnBkZXYtPmRldik7CisJCXBtX3J1bnRpbWVfcHV0X25vaWRsZShjcHN3LT5kZXYpOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0xOTU0LDExICsyMDYwLDE4NSBAQAogCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAlpbnQgcmV0OwogCi0JcmV0ID0gcG1fcnVudGltZV9wdXQoJnByaXYtPnBkZXYtPmRldik7CisJcmV0ID0gcG1fcnVudGltZV9wdXQocHJpdi0+Y3Bzdy0+ZGV2KTsKIAlpZiAocmV0IDwgMCkKIAkJY3Bzd19lcnIocHJpdiwgZHJ2LCAiZXRodG9vbCBjb21wbGV0ZSBmYWlsZWQgJWRcbiIsIHJldCk7CiB9CiAKK3N0YXRpYyB2b2lkIGNwc3dfZ2V0X2NoYW5uZWxzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQkJICAgICAgc3RydWN0IGV0aHRvb2xfY2hhbm5lbHMgKmNoKQoreworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IG5kZXZfdG9fY3BzdyhuZGV2KTsKKworCWNoLT5tYXhfY29tYmluZWQgPSAwOworCWNoLT5tYXhfcnggPSBDUFNXX01BWF9RVUVVRVM7CisJY2gtPm1heF90eCA9IENQU1dfTUFYX1FVRVVFUzsKKwljaC0+bWF4X290aGVyID0gMDsKKwljaC0+b3RoZXJfY291bnQgPSAwOworCWNoLT5yeF9jb3VudCA9IGNwc3ctPnJ4X2NoX251bTsKKwljaC0+dHhfY291bnQgPSBjcHN3LT50eF9jaF9udW07CisJY2gtPmNvbWJpbmVkX2NvdW50ID0gMDsKK30KKworc3RhdGljIGludCBjcHN3X2NoZWNrX2NoX3NldHRpbmdzKHN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdywKKwkJCQkgIHN0cnVjdCBldGh0b29sX2NoYW5uZWxzICpjaCkKK3sKKwlpZiAoY2gtPmNvbWJpbmVkX2NvdW50KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHZlcmlmeSB3ZSBoYXZlIGF0IGxlYXN0IG9uZSBjaGFubmVsIGluIGVhY2ggZGlyZWN0aW9uICovCisJaWYgKCFjaC0+cnhfY291bnQgfHwgIWNoLT50eF9jb3VudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY2gtPnJ4X2NvdW50ID4gY3Bzdy0+ZGF0YS5jaGFubmVscyB8fAorCSAgICBjaC0+dHhfY291bnQgPiBjcHN3LT5kYXRhLmNoYW5uZWxzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNwc3dfdXBkYXRlX2NoYW5uZWxzX3JlcyhzdHJ1Y3QgY3Bzd19wcml2ICpwcml2LCBpbnQgY2hfbnVtLCBpbnQgcngpCit7CisJaW50ICgqcG9sbCkoc3RydWN0IG5hcGlfc3RydWN0ICosIGludCk7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKKwl2b2lkICgqaGFuZGxlcikodm9pZCAqLCBpbnQsIGludCk7CisJc3RydWN0IGNwZG1hX2NoYW4gKipjaGFuOworCWludCByZXQsICpjaDsKKworCWlmIChyeCkgeworCQljaCA9ICZjcHN3LT5yeF9jaF9udW07CisJCWNoYW4gPSBjcHN3LT5yeGNoOworCQloYW5kbGVyID0gY3Bzd19yeF9oYW5kbGVyOworCQlwb2xsID0gY3Bzd19yeF9wb2xsOworCX0gZWxzZSB7CisJCWNoID0gJmNwc3ctPnR4X2NoX251bTsKKwkJY2hhbiA9IGNwc3ctPnR4Y2g7CisJCWhhbmRsZXIgPSBjcHN3X3R4X2hhbmRsZXI7CisJCXBvbGwgPSBjcHN3X3R4X3BvbGw7CisJfQorCisJd2hpbGUgKCpjaCA8IGNoX251bSkgeworCQljaGFuWypjaF0gPSBjcGRtYV9jaGFuX2NyZWF0ZShjcHN3LT5kbWEsICpjaCwgaGFuZGxlciwgcngpOworCisJCWlmIChJU19FUlIoY2hhblsqY2hdKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoYW5bKmNoXSk7CisKKwkJaWYgKCFjaGFuWypjaF0pCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQljcHN3X2luZm8ocHJpdiwgaWZ1cCwgImNyZWF0ZWQgbmV3ICVkICVzIGNoYW5uZWxcbiIsICpjaCwKKwkJCSAgKHJ4ID8gInJ4IiA6ICJ0eCIpKTsKKwkJKCpjaCkrKzsKKwl9CisKKwl3aGlsZSAoKmNoID4gY2hfbnVtKSB7CisJCSgqY2gpLS07CisKKwkJcmV0ID0gY3BkbWFfY2hhbl9kZXN0cm95KGNoYW5bKmNoXSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWNwc3dfaW5mbyhwcml2LCBpZnVwLCAiZGVzdHJveWVkICVkICVzIGNoYW5uZWxcbiIsICpjaCwKKwkJCSAgKHJ4ID8gInJ4IiA6ICJ0eCIpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjcHN3X3VwZGF0ZV9jaGFubmVscyhzdHJ1Y3QgY3Bzd19wcml2ICpwcml2LAorCQkJCXN0cnVjdCBldGh0b29sX2NoYW5uZWxzICpjaCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gY3Bzd191cGRhdGVfY2hhbm5lbHNfcmVzKHByaXYsIGNoLT5yeF9jb3VudCwgMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGNwc3dfdXBkYXRlX2NoYW5uZWxzX3Jlcyhwcml2LCBjaC0+dHhfY291bnQsIDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjcHN3X3NldF9jaGFubmVscyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwkJCSAgICAgc3RydWN0IGV0aHRvb2xfY2hhbm5lbHMgKmNocykKK3sKKwlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKKwlzdHJ1Y3QgY3Bzd19zbGF2ZSAqc2xhdmU7CisJaW50IGksIHJldDsKKworCXJldCA9IGNwc3dfY2hlY2tfY2hfc2V0dGluZ3MoY3BzdywgY2hzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIERpc2FibGUgTkFQSSBzY2hlZHVsaW5nICovCisJY3Bzd19pbnRyX2Rpc2FibGUoY3Bzdyk7CisKKwkvKiBTdG9wIGFsbCB0cmFuc21pdCBxdWV1ZXMgZm9yIGV2ZXJ5IG5ldHdvcmsgZGV2aWNlLgorCSAqIERpc2FibGUgcmUtdXNpbmcgcnggZGVzY3JpcHRvcnMgd2l0aCBkb3JtYW50X29uLgorCSAqLworCWZvciAoaSA9IGNwc3ctPmRhdGEuc2xhdmVzLCBzbGF2ZSA9IGNwc3ctPnNsYXZlczsgaTsgaS0tLCBzbGF2ZSsrKSB7CisJCWlmICghKHNsYXZlLT5uZGV2ICYmIG5ldGlmX3J1bm5pbmcoc2xhdmUtPm5kZXYpKSkKKwkJCWNvbnRpbnVlOworCisJCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhzbGF2ZS0+bmRldik7CisJCW5ldGlmX2Rvcm1hbnRfb24oc2xhdmUtPm5kZXYpOworCX0KKworCS8qIEhhbmRsZSByZXN0IG9mIHR4IHBhY2tldHMgYW5kIHN0b3AgY3BkbWEgY2hhbm5lbHMgKi8KKwljcGRtYV9jdGxyX3N0b3AoY3Bzdy0+ZG1hKTsKKwlyZXQgPSBjcHN3X3VwZGF0ZV9jaGFubmVscyhwcml2LCBjaHMpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJZm9yIChpID0gY3Bzdy0+ZGF0YS5zbGF2ZXMsIHNsYXZlID0gY3Bzdy0+c2xhdmVzOyBpOyBpLS0sIHNsYXZlKyspIHsKKwkJaWYgKCEoc2xhdmUtPm5kZXYgJiYgbmV0aWZfcnVubmluZyhzbGF2ZS0+bmRldikpKQorCQkJY29udGludWU7CisKKwkJLyogSW5mb3JtIHN0YWNrIGFib3V0IG5ldyBjb3VudCBvZiBxdWV1ZXMgKi8KKwkJcmV0ID0gbmV0aWZfc2V0X3JlYWxfbnVtX3R4X3F1ZXVlcyhzbGF2ZS0+bmRldiwKKwkJCQkJCSAgIGNwc3ctPnR4X2NoX251bSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIocHJpdi0+ZGV2LCAiY2Fubm90IHNldCByZWFsIG51bWJlciBvZiB0eCBxdWV1ZXNcbiIpOworCQkJZ290byBlcnI7CisJCX0KKworCQlyZXQgPSBuZXRpZl9zZXRfcmVhbF9udW1fcnhfcXVldWVzKHNsYXZlLT5uZGV2LAorCQkJCQkJICAgY3Bzdy0+cnhfY2hfbnVtKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihwcml2LT5kZXYsICJjYW5ub3Qgc2V0IHJlYWwgbnVtYmVyIG9mIHJ4IHF1ZXVlc1xuIik7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCS8qIEVuYWJsZSByeCBwYWNrZXRzIGhhbmRsaW5nICovCisJCW5ldGlmX2Rvcm1hbnRfb2ZmKHNsYXZlLT5uZGV2KTsKKwl9CisKKwlpZiAoY3Bzd19jb21tb25fcmVzX3VzYWdlX3N0YXRlKGNwc3cpKSB7CisJCXJldCA9IGNwc3dfZmlsbF9yeF9jaGFubmVscyhwcml2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyOworCisJCS8qIEFmdGVyIHRoaXMgcmVjZWl2ZSBpcyBzdGFydGVkICovCisJCWNwZG1hX2N0bHJfc3RhcnQoY3Bzdy0+ZG1hKTsKKwkJY3Bzd19pbnRyX2VuYWJsZShjcHN3KTsKKwl9CisKKwkvKiBSZXN1bWUgdHJhbnNtaXQgZm9yIGV2ZXJ5IGFmZmVjdGVkIGludGVyZmFjZSAqLworCWZvciAoaSA9IGNwc3ctPmRhdGEuc2xhdmVzLCBzbGF2ZSA9IGNwc3ctPnNsYXZlczsgaTsgaS0tLCBzbGF2ZSsrKSB7CisJCWlmICghKHNsYXZlLT5uZGV2ICYmIG5ldGlmX3J1bm5pbmcoc2xhdmUtPm5kZXYpKSkKKwkJCWNvbnRpbnVlOworCQluZXRpZl90eF9zdGFydF9hbGxfcXVldWVzKHNsYXZlLT5uZGV2KTsKKwl9CisJcmV0dXJuIDA7CitlcnI6CisJZGV2X2Vycihwcml2LT5kZXYsICJjYW5ub3QgdXBkYXRlIGNoYW5uZWxzIG51bWJlciwgY2xvc2luZyBkZXZpY2VcbiIpOworCWRldl9jbG9zZShuZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGNwc3dfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9kcnZpbmZvCT0gY3Bzd19nZXRfZHJ2aW5mbywKIAkuZ2V0X21zZ2xldmVsCT0gY3Bzd19nZXRfbXNnbGV2ZWwsCkBAIC0xOTgwLDE0ICsyMjYwLDE2IEBACiAJLmdldF9yZWdzCT0gY3Bzd19nZXRfcmVncywKIAkuYmVnaW4JCT0gY3Bzd19ldGh0b29sX29wX2JlZ2luLAogCS5jb21wbGV0ZQk9IGNwc3dfZXRodG9vbF9vcF9jb21wbGV0ZSwKKwkuZ2V0X2NoYW5uZWxzCT0gY3Bzd19nZXRfY2hhbm5lbHMsCisJLnNldF9jaGFubmVscwk9IGNwc3dfc2V0X2NoYW5uZWxzLAogfTsKIAotc3RhdGljIHZvaWQgY3Bzd19zbGF2ZV9pbml0KHN0cnVjdCBjcHN3X3NsYXZlICpzbGF2ZSwgc3RydWN0IGNwc3dfcHJpdiAqcHJpdiwKK3N0YXRpYyB2b2lkIGNwc3dfc2xhdmVfaW5pdChzdHJ1Y3QgY3Bzd19zbGF2ZSAqc2xhdmUsIHN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdywKIAkJCSAgICB1MzIgc2xhdmVfcmVnX29mcywgdTMyIHNsaXZlcl9yZWdfb2ZzKQogewotCXZvaWQgX19pb21lbQkJKnJlZ3MgPSBwcml2LT5yZWdzOworCXZvaWQgX19pb21lbQkJKnJlZ3MgPSBjcHN3LT5yZWdzOwogCWludAkJCXNsYXZlX251bSA9IHNsYXZlLT5zbGF2ZV9udW07Ci0Jc3RydWN0IGNwc3dfc2xhdmVfZGF0YQkqZGF0YSA9IHByaXYtPmRhdGEuc2xhdmVfZGF0YSArIHNsYXZlX251bTsKKwlzdHJ1Y3QgY3Bzd19zbGF2ZV9kYXRhCSpkYXRhID0gY3Bzdy0+ZGF0YS5zbGF2ZV9kYXRhICsgc2xhdmVfbnVtOwogCiAJc2xhdmUtPmRhdGEJPSBkYXRhOwogCXNsYXZlLT5yZWdzCT0gcmVncyArIHNsYXZlX3JlZ19vZnM7CkBAIC0yMTU4LDcxICsyNDQwLDUwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY3Bzd19wcm9iZV9kdWFsX2VtYWMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJCQlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2KQorc3RhdGljIGludCBjcHN3X3Byb2JlX2R1YWxfZW1hYyhzdHJ1Y3QgY3Bzd19wcml2ICpwcml2KQogewotCXN0cnVjdCBjcHN3X3BsYXRmb3JtX2RhdGEJKmRhdGEgPSAmcHJpdi0+ZGF0YTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24JCSpjcHN3ID0gcHJpdi0+Y3BzdzsKKwlzdHJ1Y3QgY3Bzd19wbGF0Zm9ybV9kYXRhCSpkYXRhID0gJmNwc3ctPmRhdGE7CiAJc3RydWN0IG5ldF9kZXZpY2UJCSpuZGV2OwogCXN0cnVjdCBjcHN3X3ByaXYJCSpwcml2X3NsMjsKLQlpbnQgcmV0ID0gMCwgaTsKKwlpbnQgcmV0ID0gMDsKIAotCW5kZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGNwc3dfcHJpdikpOworCW5kZXYgPSBhbGxvY19ldGhlcmRldl9tcShzaXplb2Yoc3RydWN0IGNwc3dfcHJpdiksIENQU1dfTUFYX1FVRVVFUyk7CiAJaWYgKCFuZGV2KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNwc3c6IGVycm9yIGFsbG9jYXRpbmcgbmV0X2RldmljZVxuIik7CisJCWRldl9lcnIoY3Bzdy0+ZGV2LCAiY3BzdzogZXJyb3IgYWxsb2NhdGluZyBuZXRfZGV2aWNlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJcHJpdl9zbDIgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlwcml2X3NsMi0+ZGF0YSA9ICpkYXRhOwotCXByaXZfc2wyLT5wZGV2ID0gcGRldjsKKwlwcml2X3NsMi0+Y3BzdyA9IGNwc3c7CiAJcHJpdl9zbDItPm5kZXYgPSBuZGV2OwogCXByaXZfc2wyLT5kZXYgID0gJm5kZXYtPmRldjsKIAlwcml2X3NsMi0+bXNnX2VuYWJsZSA9IG5ldGlmX21zZ19pbml0KGRlYnVnX2xldmVsLCBDUFNXX0RFQlVHKTsKLQlwcml2X3NsMi0+cnhfcGFja2V0X21heCA9IG1heChyeF9wYWNrZXRfbWF4LCAxMjgpOwogCiAJaWYgKGlzX3ZhbGlkX2V0aGVyX2FkZHIoZGF0YS0+c2xhdmVfZGF0YVsxXS5tYWNfYWRkcikpIHsKIAkJbWVtY3B5KHByaXZfc2wyLT5tYWNfYWRkciwgZGF0YS0+c2xhdmVfZGF0YVsxXS5tYWNfYWRkciwKIAkJCUVUSF9BTEVOKTsKLQkJZGV2X2luZm8oJnBkZXYtPmRldiwgImNwc3c6IERldGVjdGVkIE1BQ0lEID0gJXBNXG4iLCBwcml2X3NsMi0+bWFjX2FkZHIpOworCQlkZXZfaW5mbyhjcHN3LT5kZXYsICJjcHN3OiBEZXRlY3RlZCBNQUNJRCA9ICVwTVxuIiwKKwkJCSBwcml2X3NsMi0+bWFjX2FkZHIpOwogCX0gZWxzZSB7CiAJCXJhbmRvbV9ldGhlcl9hZGRyKHByaXZfc2wyLT5tYWNfYWRkcik7Ci0JCWRldl9pbmZvKCZwZGV2LT5kZXYsICJjcHN3OiBSYW5kb20gTUFDSUQgPSAlcE1cbiIsIHByaXZfc2wyLT5tYWNfYWRkcik7CisJCWRldl9pbmZvKGNwc3ctPmRldiwgImNwc3c6IFJhbmRvbSBNQUNJRCA9ICVwTVxuIiwKKwkJCSBwcml2X3NsMi0+bWFjX2FkZHIpOwogCX0KIAltZW1jcHkobmRldi0+ZGV2X2FkZHIsIHByaXZfc2wyLT5tYWNfYWRkciwgRVRIX0FMRU4pOwogCi0JcHJpdl9zbDItPnNsYXZlcyA9IHByaXYtPnNsYXZlczsKLQlwcml2X3NsMi0+Y2xrID0gcHJpdi0+Y2xrOwotCi0JcHJpdl9zbDItPmNvYWxfaW50dmwgPSAwOwotCXByaXZfc2wyLT5idXNfZnJlcV9taHogPSBwcml2LT5idXNfZnJlcV9taHo7Ci0KLQlwcml2X3NsMi0+cmVncyA9IHByaXYtPnJlZ3M7Ci0JcHJpdl9zbDItPmhvc3RfcG9ydF9yZWdzID0gcHJpdi0+aG9zdF9wb3J0X3JlZ3M7Ci0JcHJpdl9zbDItPndyX3JlZ3MgPSBwcml2LT53cl9yZWdzOwotCXByaXZfc2wyLT5od19zdGF0cyA9IHByaXYtPmh3X3N0YXRzOwotCXByaXZfc2wyLT5kbWEgPSBwcml2LT5kbWE7Ci0JcHJpdl9zbDItPnR4Y2ggPSBwcml2LT50eGNoOwotCXByaXZfc2wyLT5yeGNoID0gcHJpdi0+cnhjaDsKLQlwcml2X3NsMi0+YWxlID0gcHJpdi0+YWxlOwogCXByaXZfc2wyLT5lbWFjX3BvcnQgPSAxOwotCXByaXYtPnNsYXZlc1sxXS5uZGV2ID0gbmRldjsKLQlwcml2X3NsMi0+Y3B0cyA9IHByaXYtPmNwdHM7Ci0JcHJpdl9zbDItPnZlcnNpb24gPSBwcml2LT52ZXJzaW9uOwotCi0JZm9yIChpID0gMDsgaSA8IHByaXYtPm51bV9pcnFzOyBpKyspIHsKLQkJcHJpdl9zbDItPmlycXNfdGFibGVbaV0gPSBwcml2LT5pcnFzX3RhYmxlW2ldOwotCQlwcml2X3NsMi0+bnVtX2lycXMgPSBwcml2LT5udW1faXJxczsKLQl9CisJY3Bzdy0+c2xhdmVzWzFdLm5kZXYgPSBuZGV2OwogCW5kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVkxBTl9DVEFHX0ZJTFRFUjsKIAogCW5kZXYtPm5ldGRldl9vcHMgPSAmY3Bzd19uZXRkZXZfb3BzOwogCW5kZXYtPmV0aHRvb2xfb3BzID0gJmNwc3dfZXRodG9vbF9vcHM7CiAKIAkvKiByZWdpc3RlciB0aGUgbmV0d29yayBkZXZpY2UgKi8KLQlTRVRfTkVUREVWX0RFVihuZGV2LCAmcGRldi0+ZGV2KTsKKwlTRVRfTkVUREVWX0RFVihuZGV2LCBjcHN3LT5kZXYpOwogCXJldCA9IHJlZ2lzdGVyX25ldGRldihuZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNwc3c6IGVycm9yIHJlZ2lzdGVyaW5nIG5ldCBkZXZpY2VcbiIpOworCQlkZXZfZXJyKGNwc3ctPmRldiwgImNwc3c6IGVycm9yIHJlZ2lzdGVyaW5nIG5ldCBkZXZpY2VcbiIpOwogCQlmcmVlX25ldGRldihuZGV2KTsKIAkJcmV0ID0gLUVOT0RFVjsKIAl9CkBAIC0yMjcwLDYgKzI1MzEsNyBAQAogCiBzdGF0aWMgaW50IGNwc3dfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlzdHJ1Y3QgY2xrCQkJKmNsazsKIAlzdHJ1Y3QgY3Bzd19wbGF0Zm9ybV9kYXRhCSpkYXRhOwogCXN0cnVjdCBuZXRfZGV2aWNlCQkqbmRldjsKIAlzdHJ1Y3QgY3Bzd19wcml2CQkqcHJpdjsKQEAgLTIyODAsMTAgKzI1NDIsMTQgQEAKIAljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkCSpvZl9pZDsKIAlzdHJ1Y3QgZ3Bpb19kZXNjcwkJKm1vZGU7CiAJdTMyIHNsYXZlX29mZnNldCwgc2xpdmVyX29mZnNldCwgc2xhdmVfc2l6ZTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24JCSpjcHN3OwogCWludCByZXQgPSAwLCBpOwogCWludCBpcnE7CiAKLQluZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBjcHN3X3ByaXYpKTsKKwljcHN3ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgY3Bzd19jb21tb24pLCBHRlBfS0VSTkVMKTsKKwljcHN3LT5kZXYgPSAmcGRldi0+ZGV2OworCisJbmRldiA9IGFsbG9jX2V0aGVyZGV2X21xKHNpemVvZihzdHJ1Y3QgY3Bzd19wcml2KSwgQ1BTV19NQVhfUVVFVUVTKTsKIAlpZiAoIW5kZXYpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZXJyb3IgYWxsb2NhdGluZyBuZXRfZGV2aWNlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0yMjkxLDEzICsyNTU3LDEzIEBACiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBuZGV2KTsKIAlwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7Ci0JcHJpdi0+cGRldiA9IHBkZXY7CisJcHJpdi0+Y3BzdyA9IGNwc3c7CiAJcHJpdi0+bmRldiA9IG5kZXY7CiAJcHJpdi0+ZGV2ICA9ICZuZGV2LT5kZXY7CiAJcHJpdi0+bXNnX2VuYWJsZSA9IG5ldGlmX21zZ19pbml0KGRlYnVnX2xldmVsLCBDUFNXX0RFQlVHKTsKLQlwcml2LT5yeF9wYWNrZXRfbWF4ID0gbWF4KHJ4X3BhY2tldF9tYXgsIDEyOCk7Ci0JcHJpdi0+Y3B0cyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGNwdHMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByaXYtPmNwdHMpIHsKKwljcHN3LT5yeF9wYWNrZXRfbWF4ID0gbWF4KHJ4X3BhY2tldF9tYXgsIDEyOCk7CisJY3Bzdy0+Y3B0cyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGNwdHMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNwc3ctPmNwdHMpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZXJyb3IgYWxsb2NhdGluZyBjcHRzXG4iKTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBjbGVhbl9uZGV2X3JldDsKQEAgLTIzMTgsMTIgKzI1ODQsMTQgQEAKIAkvKiBTZWxlY3QgZGVmYXVsdCBwaW4gc3RhdGUgKi8KIAlwaW5jdHJsX3BtX3NlbGVjdF9kZWZhdWx0X3N0YXRlKCZwZGV2LT5kZXYpOwogCi0JaWYgKGNwc3dfcHJvYmVfZHQoJnByaXYtPmRhdGEsIHBkZXYpKSB7CisJaWYgKGNwc3dfcHJvYmVfZHQoJmNwc3ctPmRhdGEsIHBkZXYpKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImNwc3c6IHBsYXRmb3JtIGRhdGEgbWlzc2luZ1xuIik7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gY2xlYW5fcnVudGltZV9kaXNhYmxlX3JldDsKIAl9Ci0JZGF0YSA9ICZwcml2LT5kYXRhOworCWRhdGEgPSAmY3Bzdy0+ZGF0YTsKKwljcHN3LT5yeF9jaF9udW0gPSAxOworCWNwc3ctPnR4X2NoX251bSA9IDE7CiAKIAlpZiAoaXNfdmFsaWRfZXRoZXJfYWRkcihkYXRhLT5zbGF2ZV9kYXRhWzBdLm1hY19hZGRyKSkgewogCQltZW1jcHkocHJpdi0+bWFjX2FkZHIsIGRhdGEtPnNsYXZlX2RhdGFbMF0ubWFjX2FkZHIsIEVUSF9BTEVOKTsKQEAgLTIzMzUsMjcgKzI2MDMsMjYgQEAKIAogCW1lbWNweShuZGV2LT5kZXZfYWRkciwgcHJpdi0+bWFjX2FkZHIsIEVUSF9BTEVOKTsKIAotCXByaXYtPnNsYXZlcyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAorCWNwc3ctPnNsYXZlcyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAogCQkJCSAgICBzaXplb2Yoc3RydWN0IGNwc3dfc2xhdmUpICogZGF0YS0+c2xhdmVzLAogCQkJCSAgICBHRlBfS0VSTkVMKTsKLQlpZiAoIXByaXYtPnNsYXZlcykgeworCWlmICghY3Bzdy0+c2xhdmVzKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gY2xlYW5fcnVudGltZV9kaXNhYmxlX3JldDsKIAl9CiAJZm9yIChpID0gMDsgaSA8IGRhdGEtPnNsYXZlczsgaSsrKQotCQlwcml2LT5zbGF2ZXNbaV0uc2xhdmVfbnVtID0gaTsKKwkJY3Bzdy0+c2xhdmVzW2ldLnNsYXZlX251bSA9IGk7CiAKLQlwcml2LT5zbGF2ZXNbMF0ubmRldiA9IG5kZXY7CisJY3Bzdy0+c2xhdmVzWzBdLm5kZXYgPSBuZGV2OwogCXByaXYtPmVtYWNfcG9ydCA9IDA7CiAKLQlwcml2LT5jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgImZjayIpOwotCWlmIChJU19FUlIocHJpdi0+Y2xrKSkgeworCWNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAiZmNrIik7CisJaWYgKElTX0VSUihjbGspKSB7CiAJCWRldl9lcnIocHJpdi0+ZGV2LCAiZmNrIGlzIG5vdCBmb3VuZFxuIik7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gY2xlYW5fcnVudGltZV9kaXNhYmxlX3JldDsKIAl9Ci0JcHJpdi0+Y29hbF9pbnR2bCA9IDA7Ci0JcHJpdi0+YnVzX2ZyZXFfbWh6ID0gY2xrX2dldF9yYXRlKHByaXYtPmNsaykgLyAxMDAwMDAwOworCWNwc3ctPmJ1c19mcmVxX21oeiA9IGNsa19nZXRfcmF0ZShjbGspIC8gMTAwMDAwMDsKIAogCXNzX3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJc3NfcmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCBzc19yZXMpOwpAQCAtMjM2Myw3ICsyNjMwLDcgQEAKIAkJcmV0ID0gUFRSX0VSUihzc19yZWdzKTsKIAkJZ290byBjbGVhbl9ydW50aW1lX2Rpc2FibGVfcmV0OwogCX0KLQlwcml2LT5yZWdzID0gc3NfcmVnczsKKwljcHN3LT5yZWdzID0gc3NfcmVnczsKIAogCS8qIE5lZWQgdG8gZW5hYmxlIGNsb2NrcyB3aXRoIHJ1bnRpbWUgUE0gYXBpIHRvIGFjY2VzcyBtb2R1bGUKIAkgKiByZWdpc3RlcnMKQEAgLTIzNzMsMjQgKzI2NDAsMjQgQEAKIAkJcG1fcnVudGltZV9wdXRfbm9pZGxlKCZwZGV2LT5kZXYpOwogCQlnb3RvIGNsZWFuX3J1bnRpbWVfZGlzYWJsZV9yZXQ7CiAJfQotCXByaXYtPnZlcnNpb24gPSByZWFkbCgmcHJpdi0+cmVncy0+aWRfdmVyKTsKKwljcHN3LT52ZXJzaW9uID0gcmVhZGwoJmNwc3ctPnJlZ3MtPmlkX3Zlcik7CiAJcG1fcnVudGltZV9wdXRfc3luYygmcGRldi0+ZGV2KTsKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMSk7Ci0JcHJpdi0+d3JfcmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwotCWlmIChJU19FUlIocHJpdi0+d3JfcmVncykpIHsKLQkJcmV0ID0gUFRSX0VSUihwcml2LT53cl9yZWdzKTsKKwljcHN3LT53cl9yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihjcHN3LT53cl9yZWdzKSkgeworCQlyZXQgPSBQVFJfRVJSKGNwc3ctPndyX3JlZ3MpOwogCQlnb3RvIGNsZWFuX3J1bnRpbWVfZGlzYWJsZV9yZXQ7CiAJfQogCiAJbWVtc2V0KCZkbWFfcGFyYW1zLCAwLCBzaXplb2YoZG1hX3BhcmFtcykpOwogCW1lbXNldCgmYWxlX3BhcmFtcywgMCwgc2l6ZW9mKGFsZV9wYXJhbXMpKTsKIAotCXN3aXRjaCAocHJpdi0+dmVyc2lvbikgeworCXN3aXRjaCAoY3Bzdy0+dmVyc2lvbikgewogCWNhc2UgQ1BTV19WRVJTSU9OXzE6Ci0JCXByaXYtPmhvc3RfcG9ydF9yZWdzID0gc3NfcmVncyArIENQU1cxX0hPU1RfUE9SVF9PRkZTRVQ7Ci0JCXByaXYtPmNwdHMtPnJlZyAgICAgID0gc3NfcmVncyArIENQU1cxX0NQVFNfT0ZGU0VUOwotCQlwcml2LT5od19zdGF0cwkgICAgID0gc3NfcmVncyArIENQU1cxX0hXX1NUQVRTOworCQljcHN3LT5ob3N0X3BvcnRfcmVncyA9IHNzX3JlZ3MgKyBDUFNXMV9IT1NUX1BPUlRfT0ZGU0VUOworCQljcHN3LT5jcHRzLT5yZWcgICAgICA9IHNzX3JlZ3MgKyBDUFNXMV9DUFRTX09GRlNFVDsKKwkJY3Bzdy0+aHdfc3RhdHMJICAgICA9IHNzX3JlZ3MgKyBDUFNXMV9IV19TVEFUUzsKIAkJZG1hX3BhcmFtcy5kbWFyZWdzICAgPSBzc19yZWdzICsgQ1BTVzFfQ1BETUFfT0ZGU0VUOwogCQlkbWFfcGFyYW1zLnR4aGRwICAgICA9IHNzX3JlZ3MgKyBDUFNXMV9TVEFURVJBTV9PRkZTRVQ7CiAJCWFsZV9wYXJhbXMuYWxlX3JlZ3MgID0gc3NfcmVncyArIENQU1cxX0FMRV9PRkZTRVQ7CkBAIC0yNDAyLDkgKzI2NjksOSBAQAogCWNhc2UgQ1BTV19WRVJTSU9OXzI6CiAJY2FzZSBDUFNXX1ZFUlNJT05fMzoKIAljYXNlIENQU1dfVkVSU0lPTl80OgotCQlwcml2LT5ob3N0X3BvcnRfcmVncyA9IHNzX3JlZ3MgKyBDUFNXMl9IT1NUX1BPUlRfT0ZGU0VUOwotCQlwcml2LT5jcHRzLT5yZWcgICAgICA9IHNzX3JlZ3MgKyBDUFNXMl9DUFRTX09GRlNFVDsKLQkJcHJpdi0+aHdfc3RhdHMJICAgICA9IHNzX3JlZ3MgKyBDUFNXMl9IV19TVEFUUzsKKwkJY3Bzdy0+aG9zdF9wb3J0X3JlZ3MgPSBzc19yZWdzICsgQ1BTVzJfSE9TVF9QT1JUX09GRlNFVDsKKwkJY3Bzdy0+Y3B0cy0+cmVnICAgICAgPSBzc19yZWdzICsgQ1BTVzJfQ1BUU19PRkZTRVQ7CisJCWNwc3ctPmh3X3N0YXRzCSAgICAgPSBzc19yZWdzICsgQ1BTVzJfSFdfU1RBVFM7CiAJCWRtYV9wYXJhbXMuZG1hcmVncyAgID0gc3NfcmVncyArIENQU1cyX0NQRE1BX09GRlNFVDsKIAkJZG1hX3BhcmFtcy50eGhkcCAgICAgPSBzc19yZWdzICsgQ1BTVzJfU1RBVEVSQU1fT0ZGU0VUOwogCQlhbGVfcGFyYW1zLmFsZV9yZWdzICA9IHNzX3JlZ3MgKyBDUFNXMl9BTEVfT0ZGU0VUOwpAQCAtMjQxNSwxMyArMjY4MiwxNCBAQAogCQkJKHUzMiBfX2ZvcmNlKSBzc19yZXMtPnN0YXJ0ICsgQ1BTVzJfQkRfT0ZGU0VUOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfZXJyKHByaXYtPmRldiwgInVua25vd24gdmVyc2lvbiAweCUwOHhcbiIsIHByaXYtPnZlcnNpb24pOworCQlkZXZfZXJyKHByaXYtPmRldiwgInVua25vd24gdmVyc2lvbiAweCUwOHhcbiIsIGNwc3ctPnZlcnNpb24pOwogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIGNsZWFuX3J1bnRpbWVfZGlzYWJsZV9yZXQ7CiAJfQotCWZvciAoaSA9IDA7IGkgPCBwcml2LT5kYXRhLnNsYXZlczsgaSsrKSB7Ci0JCXN0cnVjdCBjcHN3X3NsYXZlICpzbGF2ZSA9ICZwcml2LT5zbGF2ZXNbaV07Ci0JCWNwc3dfc2xhdmVfaW5pdChzbGF2ZSwgcHJpdiwgc2xhdmVfb2Zmc2V0LCBzbGl2ZXJfb2Zmc2V0KTsKKwlmb3IgKGkgPSAwOyBpIDwgY3Bzdy0+ZGF0YS5zbGF2ZXM7IGkrKykgeworCQlzdHJ1Y3QgY3Bzd19zbGF2ZSAqc2xhdmUgPSAmY3Bzdy0+c2xhdmVzW2ldOworCisJCWNwc3dfc2xhdmVfaW5pdChzbGF2ZSwgY3Bzdywgc2xhdmVfb2Zmc2V0LCBzbGl2ZXJfb2Zmc2V0KTsKIAkJc2xhdmVfb2Zmc2V0ICArPSBzbGF2ZV9zaXplOwogCQlzbGl2ZXJfb2Zmc2V0ICs9IFNMSVZFUl9TSVpFOwogCX0KQEAgLTI0NDEsMTkgKzI3MDksMTYgQEAKIAlkbWFfcGFyYW1zLmhhc19leHRfcmVncwkJPSB0cnVlOwogCWRtYV9wYXJhbXMuZGVzY19od19hZGRyICAgICAgICAgPSBkbWFfcGFyYW1zLmRlc2NfbWVtX3BoeXM7CiAKLQlwcml2LT5kbWEgPSBjcGRtYV9jdGxyX2NyZWF0ZSgmZG1hX3BhcmFtcyk7Ci0JaWYgKCFwcml2LT5kbWEpIHsKKwljcHN3LT5kbWEgPSBjcGRtYV9jdGxyX2NyZWF0ZSgmZG1hX3BhcmFtcyk7CisJaWYgKCFjcHN3LT5kbWEpIHsKIAkJZGV2X2Vycihwcml2LT5kZXYsICJlcnJvciBpbml0aWFsaXppbmcgZG1hXG4iKTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBjbGVhbl9ydW50aW1lX2Rpc2FibGVfcmV0OwogCX0KIAotCXByaXYtPnR4Y2ggPSBjcGRtYV9jaGFuX2NyZWF0ZShwcml2LT5kbWEsIHR4X2NoYW5fbnVtKDApLAotCQkJCSAgICAgICBjcHN3X3R4X2hhbmRsZXIpOwotCXByaXYtPnJ4Y2ggPSBjcGRtYV9jaGFuX2NyZWF0ZShwcml2LT5kbWEsIHJ4X2NoYW5fbnVtKDApLAotCQkJCSAgICAgICBjcHN3X3J4X2hhbmRsZXIpOwotCi0JaWYgKFdBUk5fT04oIXByaXYtPnR4Y2ggfHwgIXByaXYtPnJ4Y2gpKSB7CisJY3Bzdy0+dHhjaFswXSA9IGNwZG1hX2NoYW5fY3JlYXRlKGNwc3ctPmRtYSwgMCwgY3Bzd190eF9oYW5kbGVyLCAwKTsKKwljcHN3LT5yeGNoWzBdID0gY3BkbWFfY2hhbl9jcmVhdGUoY3Bzdy0+ZG1hLCAwLCBjcHN3X3J4X2hhbmRsZXIsIDEpOworCWlmIChXQVJOX09OKCFjcHN3LT5yeGNoWzBdIHx8ICFjcHN3LT50eGNoWzBdKSkgewogCQlkZXZfZXJyKHByaXYtPmRldiwgImVycm9yIGluaXRpYWxpemluZyBkbWEgY2hhbm5lbHNcbiIpOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGNsZWFuX2RtYV9yZXQ7CkBAIC0yNDY0LDggKzI3MjksOCBAQAogCWFsZV9wYXJhbXMuYWxlX2VudHJpZXMJCT0gZGF0YS0+YWxlX2VudHJpZXM7CiAJYWxlX3BhcmFtcy5hbGVfcG9ydHMJCT0gZGF0YS0+c2xhdmVzOwogCi0JcHJpdi0+YWxlID0gY3Bzd19hbGVfY3JlYXRlKCZhbGVfcGFyYW1zKTsKLQlpZiAoIXByaXYtPmFsZSkgeworCWNwc3ctPmFsZSA9IGNwc3dfYWxlX2NyZWF0ZSgmYWxlX3BhcmFtcyk7CisJaWYgKCFjcHN3LT5hbGUpIHsKIAkJZGV2X2Vycihwcml2LT5kZXYsICJlcnJvciBpbml0aWFsaXppbmcgYWxlIGVuZ2luZVxuIik7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gY2xlYW5fZG1hX3JldDsKQEAgLTI0ODIsNyArMjc0Nyw3IEBACiAJaWYgKG9mX2lkKSB7CiAJCXBkZXYtPmlkX2VudHJ5ID0gb2ZfaWQtPmRhdGE7CiAJCWlmIChwZGV2LT5pZF9lbnRyeS0+ZHJpdmVyX2RhdGEpCi0JCQlwcml2LT5xdWlya19pcnEgPSB0cnVlOworCQkJY3Bzdy0+cXVpcmtfaXJxID0gdHJ1ZTsKIAl9CiAKIAkvKiBHcmFiIFJYIGFuZCBUWCBJUlFzLiBOb3RlIHRoYXQgd2UgYWxzbyBoYXZlIFJYX1RIUkVTSE9MRCBhbmQKQEAgLTI1MDAsOSArMjc2NSw5IEBACiAJCWdvdG8gY2xlYW5fYWxlX3JldDsKIAl9CiAKLQlwcml2LT5pcnFzX3RhYmxlWzBdID0gaXJxOworCWNwc3ctPmlycXNfdGFibGVbMF0gPSBpcnE7CiAJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBpcnEsIGNwc3dfcnhfaW50ZXJydXB0LAotCQkJICAgICAgIDAsIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBwcml2KTsKKwkJCSAgICAgICAwLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgY3Bzdyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2Vycihwcml2LT5kZXYsICJlcnJvciBhdHRhY2hpbmcgaXJxICglZClcbiIsIHJldCk7CiAJCWdvdG8gY2xlYW5fYWxlX3JldDsKQEAgLTI1MTUsMjEgKzI3ODAsMjAgQEAKIAkJZ290byBjbGVhbl9hbGVfcmV0OwogCX0KIAotCXByaXYtPmlycXNfdGFibGVbMV0gPSBpcnE7CisJY3Bzdy0+aXJxc190YWJsZVsxXSA9IGlycTsKIAlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGlycSwgY3Bzd190eF9pbnRlcnJ1cHQsCi0JCQkgICAgICAgMCwgZGV2X25hbWUoJnBkZXYtPmRldiksIHByaXYpOworCQkJICAgICAgIDAsIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBjcHN3KTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKHByaXYtPmRldiwgImVycm9yIGF0dGFjaGluZyBpcnEgKCVkKVxuIiwgcmV0KTsKIAkJZ290byBjbGVhbl9hbGVfcmV0OwogCX0KLQlwcml2LT5udW1faXJxcyA9IDI7CiAKIAluZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX1ZMQU5fQ1RBR19GSUxURVI7CiAKIAluZGV2LT5uZXRkZXZfb3BzID0gJmNwc3dfbmV0ZGV2X29wczsKIAluZGV2LT5ldGh0b29sX29wcyA9ICZjcHN3X2V0aHRvb2xfb3BzOwotCW5ldGlmX25hcGlfYWRkKG5kZXYsICZwcml2LT5uYXBpX3J4LCBjcHN3X3J4X3BvbGwsIENQU1dfUE9MTF9XRUlHSFQpOwotCW5ldGlmX3R4X25hcGlfYWRkKG5kZXYsICZwcml2LT5uYXBpX3R4LCBjcHN3X3R4X3BvbGwsIENQU1dfUE9MTF9XRUlHSFQpOworCW5ldGlmX25hcGlfYWRkKG5kZXYsICZjcHN3LT5uYXBpX3J4LCBjcHN3X3J4X3BvbGwsIENQU1dfUE9MTF9XRUlHSFQpOworCW5ldGlmX3R4X25hcGlfYWRkKG5kZXYsICZjcHN3LT5uYXBpX3R4LCBjcHN3X3R4X3BvbGwsIENQU1dfUE9MTF9XRUlHSFQpOwogCiAJLyogcmVnaXN0ZXIgdGhlIG5ldHdvcmsgZGV2aWNlICovCiAJU0VUX05FVERFVl9ERVYobmRldiwgJnBkZXYtPmRldik7CkBAIC0yNTQzLDggKzI4MDcsOCBAQAogCWNwc3dfbm90aWNlKHByaXYsIHByb2JlLCAiaW5pdGlhbGl6ZWQgZGV2aWNlIChyZWdzICVwYSwgaXJxICVkKVxuIiwKIAkJICAgICZzc19yZXMtPnN0YXJ0LCBuZGV2LT5pcnEpOwogCi0JaWYgKHByaXYtPmRhdGEuZHVhbF9lbWFjKSB7Ci0JCXJldCA9IGNwc3dfcHJvYmVfZHVhbF9lbWFjKHBkZXYsIHByaXYpOworCWlmIChjcHN3LT5kYXRhLmR1YWxfZW1hYykgeworCQlyZXQgPSBjcHN3X3Byb2JlX2R1YWxfZW1hYyhwcml2KTsKIAkJaWYgKHJldCkgewogCQkJY3Bzd19lcnIocHJpdiwgcHJvYmUsICJlcnJvciBwcm9iZSBzbGF2ZSAyIGVtYWMgaW50ZXJmYWNlXG4iKTsKIAkJCWdvdG8gY2xlYW5fYWxlX3JldDsKQEAgLTI1NTQsOSArMjgxOCw5IEBACiAJcmV0dXJuIDA7CiAKIGNsZWFuX2FsZV9yZXQ6Ci0JY3Bzd19hbGVfZGVzdHJveShwcml2LT5hbGUpOworCWNwc3dfYWxlX2Rlc3Ryb3koY3Bzdy0+YWxlKTsKIGNsZWFuX2RtYV9yZXQ6Ci0JY3BkbWFfY3Rscl9kZXN0cm95KHByaXYtPmRtYSk7CisJY3BkbWFfY3Rscl9kZXN0cm95KGNwc3ctPmRtYSk7CiBjbGVhbl9ydW50aW1lX2Rpc2FibGVfcmV0OgogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKIGNsZWFuX25kZXZfcmV0OgpAQCAtMjU2Nyw3ICsyODMxLDcgQEAKIHN0YXRpYyBpbnQgY3Bzd19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBuZGV2X3RvX2Nwc3cobmRldik7CiAJaW50IHJldDsKIAogCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoJnBkZXYtPmRldik7CkBAIC0yNTc2LDE3ICsyODQwLDE3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JaWYgKHByaXYtPmRhdGEuZHVhbF9lbWFjKQotCQl1bnJlZ2lzdGVyX25ldGRldihjcHN3X2dldF9zbGF2ZV9uZGV2KHByaXYsIDEpKTsKKwlpZiAoY3Bzdy0+ZGF0YS5kdWFsX2VtYWMpCisJCXVucmVnaXN0ZXJfbmV0ZGV2KGNwc3ctPnNsYXZlc1sxXS5uZGV2KTsKIAl1bnJlZ2lzdGVyX25ldGRldihuZGV2KTsKIAotCWNwc3dfYWxlX2Rlc3Ryb3kocHJpdi0+YWxlKTsKLQljcGRtYV9jdGxyX2Rlc3Ryb3kocHJpdi0+ZG1hKTsKKwljcHN3X2FsZV9kZXN0cm95KGNwc3ctPmFsZSk7CisJY3BkbWFfY3Rscl9kZXN0cm95KGNwc3ctPmRtYSk7CiAJb2ZfcGxhdGZvcm1fZGVwb3B1bGF0ZSgmcGRldi0+ZGV2KTsKIAlwbV9ydW50aW1lX3B1dF9zeW5jKCZwZGV2LT5kZXYpOwogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKLQlpZiAocHJpdi0+ZGF0YS5kdWFsX2VtYWMpCi0JCWZyZWVfbmV0ZGV2KGNwc3dfZ2V0X3NsYXZlX25kZXYocHJpdiwgMSkpOworCWlmIChjcHN3LT5kYXRhLmR1YWxfZW1hYykKKwkJZnJlZV9uZXRkZXYoY3Bzdy0+c2xhdmVzWzFdLm5kZXYpOwogCWZyZWVfbmV0ZGV2KG5kZXYpOwogCXJldHVybiAwOwogfQpAQCAtMjU5NiwxNCArMjg2MCwxNCBAQAogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZQkqbmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBjcHN3X3ByaXYJKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24JKmNwc3cgPSBuZGV2X3RvX2Nwc3cobmRldik7CiAKLQlpZiAocHJpdi0+ZGF0YS5kdWFsX2VtYWMpIHsKKwlpZiAoY3Bzdy0+ZGF0YS5kdWFsX2VtYWMpIHsKIAkJaW50IGk7CiAKLQkJZm9yIChpID0gMDsgaSA8IHByaXYtPmRhdGEuc2xhdmVzOyBpKyspIHsKLQkJCWlmIChuZXRpZl9ydW5uaW5nKHByaXYtPnNsYXZlc1tpXS5uZGV2KSkKLQkJCQljcHN3X25kb19zdG9wKHByaXYtPnNsYXZlc1tpXS5uZGV2KTsKKwkJZm9yIChpID0gMDsgaSA8IGNwc3ctPmRhdGEuc2xhdmVzOyBpKyspIHsKKwkJCWlmIChuZXRpZl9ydW5uaW5nKGNwc3ctPnNsYXZlc1tpXS5uZGV2KSkKKwkJCQljcHN3X25kb19zdG9wKGNwc3ctPnNsYXZlc1tpXS5uZGV2KTsKIAkJfQogCX0gZWxzZSB7CiAJCWlmIChuZXRpZl9ydW5uaW5nKG5kZXYpKQpAQCAtMjYxMSw3ICsyODc1LDcgQEAKIAl9CiAKIAkvKiBTZWxlY3Qgc2xlZXAgcGluIHN0YXRlICovCi0JcGluY3RybF9wbV9zZWxlY3Rfc2xlZXBfc3RhdGUoJnBkZXYtPmRldik7CisJcGluY3RybF9wbV9zZWxlY3Rfc2xlZXBfc3RhdGUoZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtMjYyMCwxNyArMjg4NCwxNyBAQAogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZQkqbmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBjcHN3X3ByaXYJKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24JKmNwc3cgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAogCS8qIFNlbGVjdCBkZWZhdWx0IHBpbiBzdGF0ZSAqLwotCXBpbmN0cmxfcG1fc2VsZWN0X2RlZmF1bHRfc3RhdGUoJnBkZXYtPmRldik7CisJcGluY3RybF9wbV9zZWxlY3RfZGVmYXVsdF9zdGF0ZShkZXYpOwogCi0JaWYgKHByaXYtPmRhdGEuZHVhbF9lbWFjKSB7CisJaWYgKGNwc3ctPmRhdGEuZHVhbF9lbWFjKSB7CiAJCWludCBpOwogCi0JCWZvciAoaSA9IDA7IGkgPCBwcml2LT5kYXRhLnNsYXZlczsgaSsrKSB7Ci0JCQlpZiAobmV0aWZfcnVubmluZyhwcml2LT5zbGF2ZXNbaV0ubmRldikpCi0JCQkJY3Bzd19uZG9fb3Blbihwcml2LT5zbGF2ZXNbaV0ubmRldik7CisJCWZvciAoaSA9IDA7IGkgPCBjcHN3LT5kYXRhLnNsYXZlczsgaSsrKSB7CisJCQlpZiAobmV0aWZfcnVubmluZyhjcHN3LT5zbGF2ZXNbaV0ubmRldikpCisJCQkJY3Bzd19uZG9fb3BlbihjcHN3LT5zbGF2ZXNbaV0ubmRldik7CiAJCX0KIAl9IGVsc2UgewogCQlpZiAobmV0aWZfcnVubmluZyhuZGV2KSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2RhdmluY2lfY3BkbWEuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2RhdmluY2lfY3BkbWEuYwppbmRleCAxOWU1ZjMyLi5jM2YzNWYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9kYXZpbmNpX2NwZG1hLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvZGF2aW5jaV9jcGRtYS5jCkBAIC04Niw3ICs4Niw3IEBACiAJdm9pZCBfX2lvbWVtCQkqaW9tYXA7CQkvKiBpb3JlbWFwIG1hcCAqLwogCXZvaWQJCQkqY3B1bWFwOwkvKiBkbWFfYWxsb2MgbWFwICovCiAJaW50CQkJZGVzY19zaXplLCBtZW1fc2l6ZTsKLQlpbnQJCQludW1fZGVzYywgdXNlZF9kZXNjOworCWludAkJCW51bV9kZXNjOwogCXN0cnVjdCBkZXZpY2UJCSpkZXY7CiAJc3RydWN0IGdlbl9wb29sCQkqZ2VuX3Bvb2w7CiB9OwpAQCAtMTA0LDYgKzEwNCw3IEBACiAJc3RydWN0IGNwZG1hX2Rlc2NfcG9vbAkqcG9vbDsKIAlzcGlubG9ja190CQlsb2NrOwogCXN0cnVjdCBjcGRtYV9jaGFuCSpjaGFubmVsc1syICogQ1BETUFfTUFYX0NIQU5ORUxTXTsKKwlpbnQgY2hhbl9udW07CiB9OwogCiBzdHJ1Y3QgY3BkbWFfY2hhbiB7CkBAIC0xMjMsNiArMTI0LDEzIEBACiAJaW50CWludF9zZXQsIGludF9jbGVhciwgdGQ7CiB9OwogCisjZGVmaW5lIHR4X2NoYW5fbnVtKGNoYW4pCShjaGFuKQorI2RlZmluZSByeF9jaGFuX251bShjaGFuKQkoKGNoYW4pICsgQ1BETUFfTUFYX0NIQU5ORUxTKQorI2RlZmluZSBpc19yeF9jaGFuKGNoYW4pCSgoY2hhbiktPmNoYW5fbnVtID49IENQRE1BX01BWF9DSEFOTkVMUykKKyNkZWZpbmUgaXNfdHhfY2hhbihjaGFuKQkoIWlzX3J4X2NoYW4oY2hhbikpCisjZGVmaW5lIF9fY2hhbl9saW5lYXIoY2hhbl9udW0pCSgoY2hhbl9udW0pICYgKENQRE1BX01BWF9DSEFOTkVMUyAtIDEpKQorI2RlZmluZSBjaGFuX2xpbmVhcihjaGFuKQlfX2NoYW5fbGluZWFyKChjaGFuKS0+Y2hhbl9udW0pCisKIC8qIFRoZSBmb2xsb3dpbmcgbWFrZSBhY2Nlc3MgdG8gY29tbW9uIGNwZG1hX2N0bHIgcGFyYW1zIG1vcmUgcmVhZGFibGUgKi8KICNkZWZpbmUgZG1hcmVncwkJcGFyYW1zLmRtYXJlZ3MKICNkZWZpbmUgbnVtX2NoYW4JcGFyYW1zLm51bV9jaGFuCkBAIC0xNDgsNyArMTU2LDEwIEBACiAJaWYgKCFwb29sKQogCQlyZXR1cm47CiAKLQlXQVJOX09OKHBvb2wtPnVzZWRfZGVzYyk7CisJV0FSTihnZW5fcG9vbF9zaXplKHBvb2wtPmdlbl9wb29sKSAhPSBnZW5fcG9vbF9hdmFpbChwb29sLT5nZW5fcG9vbCksCisJICAgICAiY3BkbWFfZGVzY19wb29sIHNpemUgJWQgIT0gYXZhaWwgJWQiLAorCSAgICAgZ2VuX3Bvb2xfc2l6ZShwb29sLT5nZW5fcG9vbCksCisJICAgICBnZW5fcG9vbF9hdmFpbChwb29sLT5nZW5fcG9vbCkpOwogCWlmIChwb29sLT5jcHVtYXApCiAJCWRtYV9mcmVlX2NvaGVyZW50KHBvb2wtPmRldiwgcG9vbC0+bWVtX3NpemUsIHBvb2wtPmNwdW1hcCwKIAkJCQkgIHBvb2wtPnBoeXMpOwpAQCAtMjMyLDIxICsyNDMsMTQgQEAKIHN0YXRpYyBzdHJ1Y3QgY3BkbWFfZGVzYyBfX2lvbWVtICoKIGNwZG1hX2Rlc2NfYWxsb2Moc3RydWN0IGNwZG1hX2Rlc2NfcG9vbCAqcG9vbCkKIHsKLQlzdHJ1Y3QgY3BkbWFfZGVzYyBfX2lvbWVtICpkZXNjID0gTlVMTDsKLQotCWRlc2MgPSAoc3RydWN0IGNwZG1hX2Rlc2MgX19pb21lbSAqKWdlbl9wb29sX2FsbG9jKHBvb2wtPmdlbl9wb29sLAotCQkJCQkJCSAgIHBvb2wtPmRlc2Nfc2l6ZSk7Ci0JaWYgKGRlc2MpCi0JCXBvb2wtPnVzZWRfZGVzYysrOwotCi0JcmV0dXJuIGRlc2M7CisJcmV0dXJuIChzdHJ1Y3QgY3BkbWFfZGVzYyBfX2lvbWVtICopCisJCWdlbl9wb29sX2FsbG9jKHBvb2wtPmdlbl9wb29sLCBwb29sLT5kZXNjX3NpemUpOwogfQogCiBzdGF0aWMgdm9pZCBjcGRtYV9kZXNjX2ZyZWUoc3RydWN0IGNwZG1hX2Rlc2NfcG9vbCAqcG9vbCwKIAkJCSAgICBzdHJ1Y3QgY3BkbWFfZGVzYyBfX2lvbWVtICpkZXNjLCBpbnQgbnVtX2Rlc2MpCiB7CiAJZ2VuX3Bvb2xfZnJlZShwb29sLT5nZW5fcG9vbCwgKHVuc2lnbmVkIGxvbmcpZGVzYywgcG9vbC0+ZGVzY19zaXplKTsKLQlwb29sLT51c2VkX2Rlc2MtLTsKIH0KIAogc3RydWN0IGNwZG1hX2N0bHIgKmNwZG1hX2N0bHJfY3JlYXRlKHN0cnVjdCBjcGRtYV9wYXJhbXMgKnBhcmFtcykKQEAgLTI2MCw2ICsyNjQsNyBAQAogCWN0bHItPnN0YXRlID0gQ1BETUFfU1RBVEVfSURMRTsKIAljdGxyLT5wYXJhbXMgPSAqcGFyYW1zOwogCWN0bHItPmRldiA9IHBhcmFtcy0+ZGV2OworCWN0bHItPmNoYW5fbnVtID0gMDsKIAlzcGluX2xvY2tfaW5pdCgmY3Rsci0+bG9jayk7CiAKIAljdGxyLT5wb29sID0gY3BkbWFfZGVzY19wb29sX2NyZWF0ZShjdGxyLT5kZXYsCkBAIC0zMzYsMTIgKzM0MSwxNCBAQAogCX0KIAogCWN0bHItPnN0YXRlID0gQ1BETUFfU1RBVEVfVEVBUkRPV047CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3Rsci0+bG9jaywgZmxhZ3MpOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3Rsci0+Y2hhbm5lbHMpOyBpKyspIHsKIAkJaWYgKGN0bHItPmNoYW5uZWxzW2ldKQogCQkJY3BkbWFfY2hhbl9zdG9wKGN0bHItPmNoYW5uZWxzW2ldKTsKIAl9CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3Rsci0+bG9jaywgZmxhZ3MpOwogCWRtYV9yZWdfd3JpdGUoY3RsciwgQ1BETUFfUlhJTlRNQVNLQ0xFQVIsIDB4ZmZmZmZmZmYpOwogCWRtYV9yZWdfd3JpdGUoY3RsciwgQ1BETUFfVFhJTlRNQVNLQ0xFQVIsIDB4ZmZmZmZmZmYpOwogCkBAIC00MDMsMTMgKzQxMCw1MiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoY3BkbWFfY3Rscl9lb2kpOwogCi1zdHJ1Y3QgY3BkbWFfY2hhbiAqY3BkbWFfY2hhbl9jcmVhdGUoc3RydWN0IGNwZG1hX2N0bHIgKmN0bHIsIGludCBjaGFuX251bSwKLQkJCQkgICAgIGNwZG1hX2hhbmRsZXJfZm4gaGFuZGxlcikKK3UzMiBjcGRtYV9jdHJsX3J4Y2hzX3N0YXRlKHN0cnVjdCBjcGRtYV9jdGxyICpjdGxyKQogeworCXJldHVybiBkbWFfcmVnX3JlYWQoY3RsciwgQ1BETUFfUlhJTlRTVEFUTUFTS0VEKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNwZG1hX2N0cmxfcnhjaHNfc3RhdGUpOworCit1MzIgY3BkbWFfY3RybF90eGNoc19zdGF0ZShzdHJ1Y3QgY3BkbWFfY3RsciAqY3RscikKK3sKKwlyZXR1cm4gZG1hX3JlZ19yZWFkKGN0bHIsIENQRE1BX1RYSU5UU1RBVE1BU0tFRCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjcGRtYV9jdHJsX3R4Y2hzX3N0YXRlKTsKKworLyoqCisgKiBjcGRtYV9jaGFuX3NwbGl0X3Bvb2wgLSBTcGxpdHMgY3RybCBwb29sIGJldHdlZW4gYWxsIGNoYW5uZWxzLgorICogSGFzIHRvIGJlIGNhbGxlZCB1bmRlciBjdGxyIGxvY2sKKyAqLworc3RhdGljIHZvaWQgY3BkbWFfY2hhbl9zcGxpdF9wb29sKHN0cnVjdCBjcGRtYV9jdGxyICpjdGxyKQoreworCXN0cnVjdCBjcGRtYV9kZXNjX3Bvb2wgKnBvb2wgPSBjdGxyLT5wb29sOwogCXN0cnVjdCBjcGRtYV9jaGFuICpjaGFuOwotCWludCBvZmZzZXQgPSAoY2hhbl9udW0gJSBDUERNQV9NQVhfQ0hBTk5FTFMpICogNDsKKwlpbnQgY2hfZGVzY19udW07CisJaW50IGk7CisKKwlpZiAoIWN0bHItPmNoYW5fbnVtKQorCQlyZXR1cm47CisKKwkvKiBjYWxjdWxhdGUgYXZlcmFnZSBzaXplIG9mIHBvb2wgc2xpY2UgKi8KKwljaF9kZXNjX251bSA9IHBvb2wtPm51bV9kZXNjIC8gY3Rsci0+Y2hhbl9udW07CisKKwkvKiBzcGxpdCBjdGxyIHBvb2wgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjdGxyLT5jaGFubmVscyk7IGkrKykgeworCQljaGFuID0gY3Rsci0+Y2hhbm5lbHNbaV07CisJCWlmIChjaGFuKQorCQkJY2hhbi0+ZGVzY19udW0gPSBjaF9kZXNjX251bTsKKwl9Cit9CisKK3N0cnVjdCBjcGRtYV9jaGFuICpjcGRtYV9jaGFuX2NyZWF0ZShzdHJ1Y3QgY3BkbWFfY3RsciAqY3RsciwgaW50IGNoYW5fbnVtLAorCQkJCSAgICAgY3BkbWFfaGFuZGxlcl9mbiBoYW5kbGVyLCBpbnQgcnhfdHlwZSkKK3sKKwlpbnQgb2Zmc2V0ID0gY2hhbl9udW0gKiA0OworCXN0cnVjdCBjcGRtYV9jaGFuICpjaGFuOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwljaGFuX251bSA9IHJ4X3R5cGUgPyByeF9jaGFuX251bShjaGFuX251bSkgOiB0eF9jaGFuX251bShjaGFuX251bSk7CisKIAlpZiAoX19jaGFuX2xpbmVhcihjaGFuX251bSkgPj0gY3Rsci0+bnVtX2NoYW4pCiAJCXJldHVybiBOVUxMOwogCkBAIC00NTEsMTQgKzQ5NywyNSBAQAogCXNwaW5fbG9ja19pbml0KCZjaGFuLT5sb2NrKTsKIAogCWN0bHItPmNoYW5uZWxzW2NoYW5fbnVtXSA9IGNoYW47CisJY3Rsci0+Y2hhbl9udW0rKzsKKworCWNwZG1hX2NoYW5fc3BsaXRfcG9vbChjdGxyKTsKKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0bHItPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gY2hhbjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNwZG1hX2NoYW5fY3JlYXRlKTsKIAotaW50IGNwZG1hX2NoYW5fZ2V0X3J4X2J1Zl9udW0oc3RydWN0IGNwZG1hX2N0bHIgKmN0bHIpCitpbnQgY3BkbWFfY2hhbl9nZXRfcnhfYnVmX251bShzdHJ1Y3QgY3BkbWFfY2hhbiAqY2hhbikKIHsKLQlyZXR1cm4gY3Rsci0+cG9vbC0+bnVtX2Rlc2MgLyAyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGRlc2NfbnVtOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW4tPmxvY2ssIGZsYWdzKTsKKwlkZXNjX251bSA9IGNoYW4tPmRlc2NfbnVtOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBkZXNjX251bTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNwZG1hX2NoYW5fZ2V0X3J4X2J1Zl9udW0pOwogCkBAIC00NzUsNiArNTMyLDEwIEBACiAJaWYgKGNoYW4tPnN0YXRlICE9IENQRE1BX1NUQVRFX0lETEUpCiAJCWNwZG1hX2NoYW5fc3RvcChjaGFuKTsKIAljdGxyLT5jaGFubmVsc1tjaGFuLT5jaGFuX251bV0gPSBOVUxMOworCWN0bHItPmNoYW5fbnVtLS07CisKKwljcGRtYV9jaGFuX3NwbGl0X3Bvb2woY3Rscik7CisKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdGxyLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9kYXZpbmNpX2NwZG1hLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9kYXZpbmNpX2NwZG1hLmgKaW5kZXggNGI0NmNkNi4uYTA3YjIyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvZGF2aW5jaV9jcGRtYS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2RhdmluY2lfY3BkbWEuaApAQCAtMTcsMTMgKzE3LDYgQEAKIAogI2RlZmluZSBDUERNQV9NQVhfQ0hBTk5FTFMJQklUU19QRVJfTE9ORwogCi0jZGVmaW5lIHR4X2NoYW5fbnVtKGNoYW4pCShjaGFuKQotI2RlZmluZSByeF9jaGFuX251bShjaGFuKQkoKGNoYW4pICsgQ1BETUFfTUFYX0NIQU5ORUxTKQotI2RlZmluZSBpc19yeF9jaGFuKGNoYW4pCSgoY2hhbiktPmNoYW5fbnVtID49IENQRE1BX01BWF9DSEFOTkVMUykKLSNkZWZpbmUgaXNfdHhfY2hhbihjaGFuKQkoIWlzX3J4X2NoYW4oY2hhbikpCi0jZGVmaW5lIF9fY2hhbl9saW5lYXIoY2hhbl9udW0pCSgoY2hhbl9udW0pICYgKENQRE1BX01BWF9DSEFOTkVMUyAtIDEpKQotI2RlZmluZSBjaGFuX2xpbmVhcihjaGFuKQlfX2NoYW5fbGluZWFyKChjaGFuKS0+Y2hhbl9udW0pCi0KICNkZWZpbmUgQ1BETUFfUlhfU09VUkNFX1BPUlQoX19zdGF0dXNfXykJKChfX3N0YXR1c19fID4+IDE2KSAmIDB4NykKIAogI2RlZmluZSBDUERNQV9FT0lfUlhfVEhSRVNICTB4MApAQCAtNzksOCArNzIsOCBAQAogaW50IGNwZG1hX2N0bHJfc3RvcChzdHJ1Y3QgY3BkbWFfY3RsciAqY3Rscik7CiAKIHN0cnVjdCBjcGRtYV9jaGFuICpjcGRtYV9jaGFuX2NyZWF0ZShzdHJ1Y3QgY3BkbWFfY3RsciAqY3RsciwgaW50IGNoYW5fbnVtLAotCQkJCSAgICAgY3BkbWFfaGFuZGxlcl9mbiBoYW5kbGVyKTsKLWludCBjcGRtYV9jaGFuX2dldF9yeF9idWZfbnVtKHN0cnVjdCBjcGRtYV9jdGxyICpjdGxyKTsKKwkJCQkgICAgIGNwZG1hX2hhbmRsZXJfZm4gaGFuZGxlciwgaW50IHJ4X3R5cGUpOworaW50IGNwZG1hX2NoYW5fZ2V0X3J4X2J1Zl9udW0oc3RydWN0IGNwZG1hX2NoYW4gKmNoYW4pOwogaW50IGNwZG1hX2NoYW5fZGVzdHJveShzdHJ1Y3QgY3BkbWFfY2hhbiAqY2hhbik7CiBpbnQgY3BkbWFfY2hhbl9zdGFydChzdHJ1Y3QgY3BkbWFfY2hhbiAqY2hhbik7CiBpbnQgY3BkbWFfY2hhbl9zdG9wKHN0cnVjdCBjcGRtYV9jaGFuICpjaGFuKTsKQEAgLTk0LDYgKzg3LDggQEAKIGludCBjcGRtYV9jdGxyX2ludF9jdHJsKHN0cnVjdCBjcGRtYV9jdGxyICpjdGxyLCBib29sIGVuYWJsZSk7CiB2b2lkIGNwZG1hX2N0bHJfZW9pKHN0cnVjdCBjcGRtYV9jdGxyICpjdGxyLCB1MzIgdmFsdWUpOwogaW50IGNwZG1hX2NoYW5faW50X2N0cmwoc3RydWN0IGNwZG1hX2NoYW4gKmNoYW4sIGJvb2wgZW5hYmxlKTsKK3UzMiBjcGRtYV9jdHJsX3J4Y2hzX3N0YXRlKHN0cnVjdCBjcGRtYV9jdGxyICpjdGxyKTsKK3UzMiBjcGRtYV9jdHJsX3R4Y2hzX3N0YXRlKHN0cnVjdCBjcGRtYV9jdGxyICpjdGxyKTsKIGJvb2wgY3BkbWFfY2hlY2tfZnJlZV90eF9kZXNjKHN0cnVjdCBjcGRtYV9jaGFuICpjaGFuKTsKIAogZW51bSBjcGRtYV9jb250cm9sIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2RhdmluY2lfZW1hYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvZGF2aW5jaV9lbWFjLmMKaW5kZXggNzI3YTc5Zi4uMmZkOTRhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvZGF2aW5jaV9lbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvZGF2aW5jaV9lbWFjLmMKQEAgLTU5NywxNCArNTk3LDE0IEBACiB9CiAKIC8qKgotICogaGFzaF9hZGQgLSBIYXNoIGZ1bmN0aW9uIHRvIGFkZCBtYWMgYWRkciBmcm9tIGhhc2ggdGFibGUKKyAqIGVtYWNfaGFzaF9hZGQgLSBIYXNoIGZ1bmN0aW9uIHRvIGFkZCBtYWMgYWRkciBmcm9tIGhhc2ggdGFibGUKICAqIEBwcml2OiBUaGUgRGFWaW5jaSBFTUFDIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICAqIEBtYWNfYWRkcjogbWFjIGFkZHJlc3MgdG8gZGVsZXRlIGZyb20gaGFzaCB0YWJsZQogICoKICAqIEFkZHMgbWFjIGFkZHJlc3MgdG8gdGhlIGludGVybmFsIGhhc2ggdGFibGUKICAqCiAgKi8KLXN0YXRpYyBpbnQgaGFzaF9hZGQoc3RydWN0IGVtYWNfcHJpdiAqcHJpdiwgdTggKm1hY19hZGRyKQorc3RhdGljIGludCBlbWFjX2hhc2hfYWRkKHN0cnVjdCBlbWFjX3ByaXYgKnByaXYsIHU4ICptYWNfYWRkcikKIHsKIAlzdHJ1Y3QgZGV2aWNlICplbWFjX2RldiA9ICZwcml2LT5uZGV2LT5kZXY7CiAJdTMyIHJjID0gMDsKQEAgLTYxMyw3ICs2MTMsNyBAQAogCiAJaWYgKGhhc2hfdmFsdWUgPj0gRU1BQ19OVU1fTVVMVElDQVNUX0JJVFMpIHsKIAkJaWYgKG5ldGlmX21zZ19kcnYocHJpdikpIHsKLQkJCWRldl9lcnIoZW1hY19kZXYsICJEYVZpbmNpIEVNQUM6IGhhc2hfYWRkKCk6IEludmFsaWQgIlwKKwkJCWRldl9lcnIoZW1hY19kZXYsICJEYVZpbmNpIEVNQUM6IGVtYWNfaGFzaF9hZGQoKTogSW52YWxpZCAiXAogCQkJCSJIYXNoICUwOHgsIHNob3VsZCBub3QgYmUgZ3JlYXRlciB0aGFuICUwOHgiLAogCQkJCWhhc2hfdmFsdWUsIChFTUFDX05VTV9NVUxUSUNBU1RfQklUUyAtIDEpKTsKIAkJfQpAQCAtNjM5LDE0ICs2MzksMTQgQEAKIH0KIAogLyoqCi0gKiBoYXNoX2RlbCAtIEhhc2ggZnVuY3Rpb24gdG8gZGVsZXRlIG1hYyBhZGRyIGZyb20gaGFzaCB0YWJsZQorICogZW1hY19oYXNoX2RlbCAtIEhhc2ggZnVuY3Rpb24gdG8gZGVsZXRlIG1hYyBhZGRyIGZyb20gaGFzaCB0YWJsZQogICogQHByaXY6IFRoZSBEYVZpbmNpIEVNQUMgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogICogQG1hY19hZGRyOiBtYWMgYWRkcmVzcyB0byBkZWxldGUgZnJvbSBoYXNoIHRhYmxlCiAgKgogICogUmVtb3ZlcyBtYWMgYWRkcmVzcyBmcm9tIHRoZSBpbnRlcm5hbCBoYXNoIHRhYmxlCiAgKgogICovCi1zdGF0aWMgaW50IGhhc2hfZGVsKHN0cnVjdCBlbWFjX3ByaXYgKnByaXYsIHU4ICptYWNfYWRkcikKK3N0YXRpYyBpbnQgZW1hY19oYXNoX2RlbChzdHJ1Y3QgZW1hY19wcml2ICpwcml2LCB1OCAqbWFjX2FkZHIpCiB7CiAJdTMyIGhhc2hfdmFsdWU7CiAJdTMyIGhhc2hfYml0OwpAQCAtNjk2LDEwICs2OTYsMTAgQEAKIAogCXN3aXRjaCAoYWN0aW9uKSB7CiAJY2FzZSBFTUFDX01VTFRJQ0FTVF9BREQ6Ci0JCXVwZGF0ZSA9IGhhc2hfYWRkKHByaXYsIG1hY19hZGRyKTsKKwkJdXBkYXRlID0gZW1hY19oYXNoX2FkZChwcml2LCBtYWNfYWRkcik7CiAJCWJyZWFrOwogCWNhc2UgRU1BQ19NVUxUSUNBU1RfREVMOgotCQl1cGRhdGUgPSBoYXNoX2RlbChwcml2LCBtYWNfYWRkcik7CisJCXVwZGF0ZSA9IGVtYWNfaGFzaF9kZWwocHJpdiwgbWFjX2FkZHIpOwogCQlicmVhazsKIAljYXNlIEVNQUNfQUxMX01VTFRJX1NFVDoKIAkJdXBkYXRlID0gMTsKQEAgLTE4NzAsMTAgKzE4NzAsMTAgQEAKIAkJZ290byBub19wZGF0YTsKIAl9CiAKLQlwcml2LT50eGNoYW4gPSBjcGRtYV9jaGFuX2NyZWF0ZShwcml2LT5kbWEsIHR4X2NoYW5fbnVtKEVNQUNfREVGX1RYX0NIKSwKLQkJCQkgICAgICAgZW1hY190eF9oYW5kbGVyKTsKLQlwcml2LT5yeGNoYW4gPSBjcGRtYV9jaGFuX2NyZWF0ZShwcml2LT5kbWEsIHJ4X2NoYW5fbnVtKEVNQUNfREVGX1JYX0NIKSwKLQkJCQkgICAgICAgZW1hY19yeF9oYW5kbGVyKTsKKwlwcml2LT50eGNoYW4gPSBjcGRtYV9jaGFuX2NyZWF0ZShwcml2LT5kbWEsIEVNQUNfREVGX1RYX0NILAorCQkJCQkgZW1hY190eF9oYW5kbGVyLCAwKTsKKwlwcml2LT5yeGNoYW4gPSBjcGRtYV9jaGFuX2NyZWF0ZShwcml2LT5kbWEsIEVNQUNfREVGX1JYX0NILAorCQkJCQkgZW1hY19yeF9oYW5kbGVyLCAxKTsKIAlpZiAoV0FSTl9PTighcHJpdi0+dHhjaGFuIHx8ICFwcml2LT5yeGNoYW4pKSB7CiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBub19jcGRtYV9jaGFuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdG9zaGliYS9wczNfZ2VsaWNfbmV0LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90b3NoaWJhL3BzM19nZWxpY19uZXQuYwppbmRleCA3OWYwZWM0Li5iYzI1OGQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90b3NoaWJhL3BzM19nZWxpY19uZXQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90b3NoaWJhL3BzM19nZWxpY19uZXQuYwpAQCAtMTc5MSw3ICsxNzkxLDcgQEAKIAlnZWxpY19jYXJkX2ZyZWVfY2hhaW4oY2FyZCwgY2FyZC0+dHhfY2hhaW4uaGVhZCk7CiBmYWlsX2FsbG9jX3R4OgogCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7Ci0JbmV0ZGV2LT5pcnEgPSBOT19JUlE7CisJbmV0ZGV2LT5pcnEgPSAwOwogZmFpbF9yZXF1ZXN0X2lycToKIAlwczNfc2JfZXZlbnRfcmVjZWl2ZV9wb3J0X2Rlc3Ryb3koZGV2LCBjYXJkLT5pcnEpOwogZmFpbF9hbGxvY19pcnE6CkBAIC0xODQzLDcgKzE4NDMsNyBAQAogCW5ldGRldjAgPSBjYXJkLT5uZXRkZXZbR0VMSUNfUE9SVF9FVEhFUk5FVF8wXTsKIAkvKiBkaXNjb25uZWN0IGV2ZW50IHBvcnQgKi8KIAlmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOwotCW5ldGRldjAtPmlycSA9IE5PX0lSUTsKKwluZXRkZXYwLT5pcnEgPSAwOwogCXBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfZGVzdHJveShjYXJkLT5kZXYsIGNhcmQtPmlycSk7CiAKIAl3YWl0X2V2ZW50KGNhcmQtPndhaXRxLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdHVuZHJhL3RzaTEwOF9ldGguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3R1bmRyYS90c2kxMDhfZXRoLmMKaW5kZXggMDFhNzcxNC4uOGZkMTMxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdHVuZHJhL3RzaTEwOF9ldGguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90dW5kcmEvdHNpMTA4X2V0aC5jCkBAIC0xNjYsNiArMTY2LDcgQEAKIAogc3RhdGljIHZvaWQgdHNpMTA4X3RpbWVkX2NoZWNrZXIodW5zaWduZWQgbG9uZyBkZXZfcHRyKTsKIAorI2lmZGVmIERFQlVHCiBzdGF0aWMgdm9pZCBkdW1wX2V0aF9vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgdHNpMTA4X3Bydl9kYXRhICpkYXRhID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTE5MCw2ICsxOTEsNyBAQAogCSAgICAgICBUU0lfUkVBRChUU0kxMDhfRUNfUlhFU1RBVCksCiAJICAgICAgIFRTSV9SRUFEKFRTSTEwOF9FQ19SWEVSUiksIGRhdGEtPnJ4cGVuZGluZyk7CiB9CisjZW5kaWYKIAogLyogU3luY2hyb25pemF0aW9uIGlzIG5lZWRlZCBiZXR3ZWVuIHRoZSB0aHJlYWQgYW5kIHVwL2Rvd24gZXZlbnRzLgogICogTm90ZSB0aGF0IHRoZSBQSFkgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgc2FtZSByZWdpc3RlcnMgZm9yIGJvdGgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3ZpYS92aWEtdmVsb2NpdHkuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3ZpYS92aWEtdmVsb2NpdHkuYwppbmRleCBmMzg2OTZjLi45MDhlNzJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC92aWEvdmlhLXZlbG9jaXR5LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdmlhL3ZpYS12ZWxvY2l0eS5jCkBAIC0xNzI0LDI0ICsxNzI0LDIxIEBACiAJCXN0cnVjdCB2ZWxvY2l0eV90ZF9pbmZvICp0ZGluZm8sIHN0cnVjdCB0eF9kZXNjICp0ZCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdGRpbmZvLT5za2I7CisJaW50IGk7CiAKIAkvKgogCSAqCURvbid0IHVubWFwIHRoZSBwcmUtYWxsb2NhdGVkIHR4X2J1ZnMKIAkgKi8KLQlpZiAodGRpbmZvLT5za2JfZG1hKSB7Ci0JCWludCBpOworCWZvciAoaSA9IDA7IGkgPCB0ZGluZm8tPm5za2JfZG1hOyBpKyspIHsKKwkJc2l6ZV90IHBrdGxlbiA9IG1heF90KHNpemVfdCwgc2tiLT5sZW4sIEVUSF9aTEVOKTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgdGRpbmZvLT5uc2tiX2RtYTsgaSsrKSB7Ci0JCQlzaXplX3QgcGt0bGVuID0gbWF4X3Qoc2l6ZV90LCBza2ItPmxlbiwgRVRIX1pMRU4pOworCQkvKiBGb3Igc2NhdHRlci1nYXRoZXIgKi8KKwkJaWYgKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPiAwKQorCQkJcGt0bGVuID0gbWF4X3Qoc2l6ZV90LCBwa3RsZW4sCisJCQkJICAgICAgIHRkLT50ZF9idWZbaV0uc2l6ZSAmIH5URF9RVUVVRSk7CiAKLQkJCS8qIEZvciBzY2F0dGVyLWdhdGhlciAqLwotCQkJaWYgKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPiAwKQotCQkJCXBrdGxlbiA9IG1heF90KHNpemVfdCwgcGt0bGVuLAotCQkJCQkJdGQtPnRkX2J1ZltpXS5zaXplICYgflREX1FVRVVFKTsKLQotCQkJZG1hX3VubWFwX3NpbmdsZSh2cHRyLT5kZXYsIHRkaW5mby0+c2tiX2RtYVtpXSwKLQkJCQkJbGUxNl90b19jcHUocGt0bGVuKSwgRE1BX1RPX0RFVklDRSk7Ci0JCX0KKwkJZG1hX3VubWFwX3NpbmdsZSh2cHRyLT5kZXYsIHRkaW5mby0+c2tiX2RtYVtpXSwKKwkJCQkgbGUxNl90b19jcHUocGt0bGVuKSwgRE1BX1RPX0RFVklDRSk7CiAJfQogCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CiAJdGRpbmZvLT5za2IgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQveGlsaW54L0tjb25maWcgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC94aWxpbngvS2NvbmZpZwppbmRleCA0ZjVjMDI0Li42ZDY4YzhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC94aWxpbngvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC94aWxpbngvS2NvbmZpZwpAQCAtNSw3ICs1LDcgQEAKIGNvbmZpZyBORVRfVkVORE9SX1hJTElOWAogCWJvb2wgIlhpbGlueCBkZXZpY2VzIgogCWRlZmF1bHQgeQotCWRlcGVuZHMgb24gUFBDIHx8IFBQQzMyIHx8IE1JQ1JPQkxBWkUgfHwgQVJDSF9aWU5RCisJZGVwZW5kcyBvbiBQUEMgfHwgUFBDMzIgfHwgTUlDUk9CTEFaRSB8fCBBUkNIX1pZTlEgfHwgTUlQUwogCS0tLWhlbHAtLS0KIAkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGNhcmQgYmVsb25naW5nIHRvIHRoaXMgY2xhc3MsIHNheSBZLgogCkBAIC0xOCw3ICsxOCw3IEBACiAKIGNvbmZpZyBYSUxJTlhfRU1BQ0xJVEUKIAl0cmlzdGF0ZSAiWGlsaW54IDEwLzEwMCBFdGhlcm5ldCBMaXRlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiAoUFBDMzIgfHwgTUlDUk9CTEFaRSB8fCBBUkNIX1pZTlEpCisJZGVwZW5kcyBvbiBQUEMzMiB8fCBNSUNST0JMQVpFIHx8IEFSQ0hfWllOUSB8fCBNSVBTCiAJc2VsZWN0IFBIWUxJQgogCS0tLWhlbHAtLS0KIAkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSAxMC8xMDAgRXRoZXJuZXQgTGl0ZSBmcm9tIFhpbGlueC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hpbGlueC94aWxpbnhfYXhpZW5ldF9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC94aWxpbngveGlsaW54X2F4aWVuZXRfbWFpbi5jCmluZGV4IDM2ZWU3YWIuLjY5ZTJhODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hpbGlueC94aWxpbnhfYXhpZW5ldF9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQveGlsaW54L3hpbGlueF9heGllbmV0X21haW4uYwpAQCAtMTI5Nyw3ICsxMjk3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBheGllbmV0X2V0aHRvb2xfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBheGllbmV0X2V0aHRvb2xfb3BzID0gewogCS5nZXRfZHJ2aW5mbyAgICA9IGF4aWVuZXRfZXRodG9vbHNfZ2V0X2RydmluZm8sCiAJLmdldF9yZWdzX2xlbiAgID0gYXhpZW5ldF9ldGh0b29sc19nZXRfcmVnc19sZW4sCiAJLmdldF9yZWdzICAgICAgID0gYXhpZW5ldF9ldGh0b29sc19nZXRfcmVncywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hpbGlueC94aWxpbnhfZW1hY2xpdGUuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hpbGlueC94aWxpbnhfZW1hY2xpdGUuYwppbmRleCAzY2VlODRhLi45M2RjMTBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC94aWxpbngveGlsaW54X2VtYWNsaXRlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQveGlsaW54L3hpbGlueF9lbWFjbGl0ZS5jCkBAIC0xMTMxLDExICsxMTMxLDEzIEBACiAJbHAtPnJ4X3BpbmdfcG9uZyA9IGdldF9ib29sKG9mZGV2LCAieGxueCxyeC1waW5nLXBvbmciKTsKIAltYWNfYWRkcmVzcyA9IG9mX2dldF9tYWNfYWRkcmVzcyhvZmRldi0+ZGV2Lm9mX25vZGUpOwogCi0JaWYgKG1hY19hZGRyZXNzKQorCWlmIChtYWNfYWRkcmVzcykgewogCQkvKiBTZXQgdGhlIE1BQyBhZGRyZXNzLiAqLwogCQltZW1jcHkobmRldi0+ZGV2X2FkZHIsIG1hY19hZGRyZXNzLCBFVEhfQUxFTik7Ci0JZWxzZQotCQlkZXZfd2FybihkZXYsICJObyBNQUMgYWRkcmVzcyBmb3VuZFxuIik7CisJfSBlbHNlIHsKKwkJZGV2X3dhcm4oZGV2LCAiTm8gTUFDIGFkZHJlc3MgZm91bmQsIHVzaW5nIHJhbmRvbVxuIik7CisJCWV0aF9od19hZGRyX3JhbmRvbShuZGV2KTsKKwl9CiAKIAkvKiBDbGVhciB0aGUgVHggQ1NSJ3MgaW4gY2FzZSB0aGlzIGlzIGEgcmVzdGFydCAqLwogCV9fcmF3X3dyaXRlbCgwLCBscC0+YmFzZV9hZGRyICsgWEVMX1RTUl9PRkZTRVQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZmplcy9mamVzX21haW4uYyBiL2RyaXZlcnMvbmV0L2ZqZXMvZmplc19tYWluLmMKaW5kZXggOTAwNjg3Ny4uZTQ2YjFlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZmplcy9mamVzX21haW4uYworKysgYi9kcml2ZXJzL25ldC9mamVzL2ZqZXNfbWFpbi5jCkBAIC05Nyw3ICs5Nyw2IEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBmamVzX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZSA9IERSVl9OQU1FLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKIAl9LAogCS5wcm9iZSA9IGZqZXNfcHJvYmUsCiAJLnJlbW92ZSA9IGZqZXNfcmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vNnBhY2suYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvLzZwYWNrLmMKaW5kZXggNWExZTk4NS4uNDcwYjNkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vNnBhY2suYworKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby82cGFjay5jCkBAIC0xMjcsNyArMTI3LDcgQEAKIAogI2RlZmluZSBBWDI1XzZQQUNLX0hFQURFUl9MRU4gMAogCi1zdGF0aWMgdm9pZCBzaXhwYWNrX2RlY29kZShzdHJ1Y3Qgc2l4cGFjayAqLCB1bnNpZ25lZCBjaGFyW10sIGludCk7CitzdGF0aWMgdm9pZCBzaXhwYWNrX2RlY29kZShzdHJ1Y3Qgc2l4cGFjayAqLCBjb25zdCB1bnNpZ25lZCBjaGFyW10sIGludCk7CiBzdGF0aWMgaW50IGVuY29kZV9zaXhwYWNrKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQsIHVuc2lnbmVkIGNoYXIpOwogCiAvKgpAQCAtNDI4LDcgKzQyOCw3IEBACiAKIC8qCiAgKiBIYW5kbGUgdGhlICdyZWNlaXZlciBkYXRhIHJlYWR5JyBpbnRlcnJ1cHQuCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgJ3R0eV9pbycgbW9kdWxlIGluIHRoZSBrZXJuZWwgd2hlbgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHR0eSBtb2R1bGUgaW4gdGhlIGtlcm5lbCB3aGVuCiAgKiBhIGJsb2NrIG9mIDZwYWNrIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQsIHdoaWNoIGNhbiBub3cgYmUgZGVjYXBzdWxhdGVkCiAgKiBhbmQgc2VudCBvbiB0byBzb21lIElQIGxheWVyIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuCiAgKi8KQEAgLTQzNiw3ICs0MzYsNiBAQAogCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwLCBjaGFyICpmcCwgaW50IGNvdW50KQogewogCXN0cnVjdCBzaXhwYWNrICpzcDsKLQl1bnNpZ25lZCBjaGFyIGJ1Zls1MTJdOwogCWludCBjb3VudDE7CiAKIAlpZiAoIWNvdW50KQpAQCAtNDQ2LDEwICs0NDUsNyBAQAogCWlmICghc3ApCiAJCXJldHVybjsKIAotCW1lbWNweShidWYsIGNwLCBjb3VudCA8IHNpemVvZihidWYpID8gY291bnQgOiBzaXplb2YoYnVmKSk7Ci0KIAkvKiBSZWFkIHRoZSBjaGFyYWN0ZXJzIG91dCBvZiB0aGUgYnVmZmVyICovCi0KIAljb3VudDEgPSBjb3VudDsKIAl3aGlsZSAoY291bnQpIHsKIAkJY291bnQtLTsKQEAgLTQ1OSw3ICs0NTUsNyBAQAogCQkJY29udGludWU7CiAJCX0KIAl9Ci0Jc2l4cGFja19kZWNvZGUoc3AsIGJ1ZiwgY291bnQxKTsKKwlzaXhwYWNrX2RlY29kZShzcCwgY3AsIGNvdW50MSk7CiAKIAlzcF9wdXQoc3ApOwogCXR0eV91bnRocm90dGxlKHR0eSk7CkBAIC05OTIsNyArOTg4LDcgQEAKIC8qIGRlY29kZSBhIDZwYWNrIHBhY2tldCAqLwogCiBzdGF0aWMgdm9pZAotc2l4cGFja19kZWNvZGUoc3RydWN0IHNpeHBhY2sgKnNwLCB1bnNpZ25lZCBjaGFyICpwcmVfcmJ1ZmYsIGludCBjb3VudCkKK3NpeHBhY2tfZGVjb2RlKHN0cnVjdCBzaXhwYWNrICpzcCwgY29uc3QgdW5zaWduZWQgY2hhciAqcHJlX3JidWZmLCBpbnQgY291bnQpCiB7CiAJdW5zaWduZWQgY2hhciBpbmJ5dGU7CiAJaW50IGNvdW50MTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JwcWV0aGVyLmMgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9icHFldGhlci5jCmluZGV4IGQ5NWE1MGEuLjYyMmFiM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JwcWV0aGVyLmMKKysrIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vYnBxZXRoZXIuYwpAQCAtNDg0LDcgKzQ4NCw3IEBACiAJZGV2LT5mbGFncyAgICAgID0gMDsKIAlkZXYtPmZlYXR1cmVzCT0gTkVUSUZfRl9MTFRYOwkvKiBBbGxvdyByZWN1cnNpb24gKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX0FYMjUpIHx8IGRlZmluZWQoQ09ORklHX0FYMjVfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0FYMjUpCiAJZGV2LT5oZWFkZXJfb3BzICAgICAgPSAmYXgyNV9oZWFkZXJfb3BzOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2h5cGVydi9oeXBlcnZfbmV0LmggYi9kcml2ZXJzL25ldC9oeXBlcnYvaHlwZXJ2X25ldC5oCmluZGV4IDQ2N2ZiOGIuLmY0ZmJjYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2h5cGVydi9oeXBlcnZfbmV0LmgKKysrIGIvZHJpdmVycy9uZXQvaHlwZXJ2L2h5cGVydl9uZXQuaApAQCAtODQsOCArODQsNiBAQAogI2RlZmluZSBORElTX1JTU19IQVNIX1NFQ1JFVF9LRVlfTUFYX1NJWkVfUkVWSVNJT05fMiAgIDQwCiAKICNkZWZpbmUgSVRBQl9OVU0gMTI4Ci0jZGVmaW5lIEhBU0hfS0VZTEVOIE5ESVNfUlNTX0hBU0hfU0VDUkVUX0tFWV9NQVhfU0laRV9SRVZJU0lPTl8yCi1leHRlcm4gdTggbmV0dnNjX2hhc2hfa2V5W107CiAKIHN0cnVjdCBuZGlzX3JlY3Zfc2NhbGVfcGFyYW0geyAvKiBORElTX1JFQ0VJVkVfU0NBTEVfUEFSQU1FVEVSUyAqLwogCXN0cnVjdCBuZGlzX29ial9oZWFkZXIgaGRyOwpAQCAtMTc1LDcgKzE3Myw3IEBACiBzdHJ1Y3Qgcm5kaXNfbWVzc2FnZTsKIHN0cnVjdCBuZXR2c2NfZGV2aWNlOwogaW50IG5ldHZzY19kZXZpY2VfYWRkKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwgdm9pZCAqYWRkaXRpb25hbF9pbmZvKTsKLWludCBuZXR2c2NfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpOwordm9pZCBuZXR2c2NfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpOwogaW50IG5ldHZzY19zZW5kKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKIAkJc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKnBhY2tldCwKIAkJc3RydWN0IHJuZGlzX21lc3NhZ2UgKnJuZGlzX21zZywKQEAgLTQzNSw3ICs0MzMsNyBAQAogICovCiBzdHJ1Y3QgbnZzcF8xX21lc3NhZ2Vfc2VuZF9ybmRpc19wYWNrZXQgewogCS8qCi0JICogVGhpcyBmaWVsZCBpcyBzcGVjaWZpZWQgYnkgUk5JRFMuIFRoZXkgYXNzdW1lIHRoZXJlJ3MgdHdvIGRpZmZlcmVudAorCSAqIFRoaXMgZmllbGQgaXMgc3BlY2lmaWVkIGJ5IFJORElTLiBUaGV5IGFzc3VtZSB0aGVyZSdzIHR3byBkaWZmZXJlbnQKIAkgKiBjaGFubmVscyBvZiBjb21tdW5pY2F0aW9uLiBIb3dldmVyLCB0aGUgTmV0d29yayBWU1Agb25seSBoYXMgb25lLgogCSAqIFRoZXJlZm9yZSwgdGhlIGNoYW5uZWwgdHJhdmVscyB3aXRoIHRoZSBSTkRJUyBwYWNrZXQuCiAJICovCkBAIC00OTAsNiArNDg4LDcgQEAKIAkJCXU2NCBzcmlvdjoxOwogCQkJdTY0IGllZWU4MDIxcToxOwogCQkJdTY0IGNvcnJlbGF0aW9uX2lkOjE7CisJCQl1NjQgdGVhbWluZzoxOwogCQl9OwogCX07CiB9IF9fcGFja2VkOwpAQCAtNTc5LDcgKzU3OCw3IEBACiAJLyogVGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBzZW5kIGluZGlyZWN0aW9uIHRhYmxlICovCiAJdTMyIGNvdW50OwogCi0JLyogVGhlIG9mZnNldCBvZiB0aGUgc2VuZCBpbmRpcmVjaXRvbiB0YWJsZSBmcm9tIHRvcCBvZiB0aGlzIHN0cnVjdC4KKwkvKiBUaGUgb2Zmc2V0IG9mIHRoZSBzZW5kIGluZGlyZWN0aW9uIHRhYmxlIGZyb20gdG9wIG9mIHRoaXMgc3RydWN0LgogCSAqIFRoZSBzZW5kIGluZGlyZWN0aW9uIHRhYmxlIHRlbGxzIHdoaWNoIGNoYW5uZWwgdG8gcHV0IHRoZSBzZW5kCiAJICogdHJhZmZpYyBvbi4gRWFjaCBlbnRyeSBpcyBhIGNoYW5uZWwgbnVtYmVyLgogCSAqLwpAQCAtNjMzLDIzICs2MzIsNDEgQEAKIAl1MzIgY291bnQ7IC8qIGNvdW50ZXIgb2YgYmF0Y2hlZCBwYWNrZXRzICovCiB9OwogCitzdHJ1Y3QgcmVjdl9jb21wX2RhdGEgeworCXU2NCB0aWQ7IC8qIHRyYW5zYWN0aW9uIGlkICovCisJdTMyIHN0YXR1czsKK307CisKKy8qIE5ldHZzYyBSZWNlaXZlIFNsb3RzIE1heCAqLworI2RlZmluZSBORVRWU0NfUkVDVlNMT1RfTUFYIChORVRWU0NfUkVDRUlWRV9CVUZGRVJfU0laRSAvIEVUSF9EQVRBX0xFTiArIDEpCisKK3N0cnVjdCBtdWx0aV9yZWN2X2NvbXAgeworCXZvaWQgKmJ1ZjsgLyogcXVldWVkIHJlY2VpdmUgY29tcGxldGlvbnMgKi8KKwl1MzIgZmlyc3Q7IC8qIGZpcnN0IGRhdGEgZW50cnkgKi8KKwl1MzIgbmV4dDsgLyogbmV4dCBlbnRyeSBmb3Igd3JpdGluZyAqLworfTsKKwogc3RydWN0IG5ldHZzY19zdGF0cyB7CiAJdTY0IHBhY2tldHM7CiAJdTY0IGJ5dGVzOworCXU2NCBicm9hZGNhc3Q7CisJdTY0IG11bHRpY2FzdDsKIAlzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMgc3luY3A7CiB9OwogCitzdHJ1Y3QgbmV0dnNjX2V0aHRvb2xfc3RhdHMgeworCXVuc2lnbmVkIGxvbmcgdHhfc2NhdHRlcmVkOworCXVuc2lnbmVkIGxvbmcgdHhfbm9fbWVtb3J5OworCXVuc2lnbmVkIGxvbmcgdHhfbm9fc3BhY2U7CisJdW5zaWduZWQgbG9uZyB0eF90b29fYmlnOworCXVuc2lnbmVkIGxvbmcgdHhfYnVzeTsKK307CisKIHN0cnVjdCBuZXR2c2NfcmVjb25maWcgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAl1MzIgZXZlbnQ7CiB9OwogCi1zdHJ1Y3QgZ2FycF93cmsgewotCXN0cnVjdCB3b3JrX3N0cnVjdCBkd3JrOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7Ci0Jc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldHZzY19kZXY7Ci19OwotCiAvKiBUaGUgY29udGV4dCBvZiB0aGUgbmV0dnNjIGRldmljZSAgKi8KIHN0cnVjdCBuZXRfZGV2aWNlX2NvbnRleHQgewogCS8qIHBvaW50IGJhY2sgdG8gb3VyIGRldmljZSBjb250ZXh0ICovCkBAIC02NjcsNyArNjg0LDYgQEAKIAogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogCXUzMiBtc2dfZW5hYmxlOyAvKiBkZWJ1ZyBsZXZlbCAqLwotCXN0cnVjdCBnYXJwX3dyayBnd3JrOwogCiAJc3RydWN0IG5ldHZzY19zdGF0cyBfX3BlcmNwdSAqdHhfc3RhdHM7CiAJc3RydWN0IG5ldHZzY19zdGF0cyBfX3BlcmNwdSAqcnhfc3RhdHM7CkBAIC02NzUsOSArNjkxLDE4IEBACiAJLyogRXRodG9vbCBzZXR0aW5ncyAqLwogCXU4IGR1cGxleDsKIAl1MzIgc3BlZWQ7CisJc3RydWN0IG5ldHZzY19ldGh0b29sX3N0YXRzIGV0aF9zdGF0czsKIAogCS8qIHRoZSBkZXZpY2UgaXMgZ29pbmcgYXdheSAqLwogCWJvb2wgc3RhcnRfcmVtb3ZlOworCisJLyogU3RhdGUgdG8gbWFuYWdlIHRoZSBhc3NvY2lhdGVkIFZGIGludGVyZmFjZS4gKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSBfX3JjdSAqdmZfbmV0ZGV2OworCisJLyogMTogYWxsb2NhdGVkLCBzZXJpYWwgbnVtYmVyIGlzIHZhbGlkLiAwOiBub3QgYWxsb2NhdGVkICovCisJdTMyIHZmX2FsbG9jOworCS8qIFNlcmlhbCBudW1iZXIgb2YgdGhlIFZGIHRvIHRlYW0gd2l0aCAqLworCXUzMiB2Zl9zZXJpYWw7CiB9OwogCiAvKiBQZXIgbmV0dnNjIGRldmljZSAqLwpAQCAtNzA5LDcgKzczNCw2IEBACiAJc3RydWN0IG52c3BfbWVzc2FnZSBjaGFubmVsX2luaXRfcGt0OwogCiAJc3RydWN0IG52c3BfbWVzc2FnZSByZXZva2VfcGFja2V0OwotCS8qIHVuc2lnbmVkIGNoYXIgSHdNYWNBZGRyW0hXX01BQ0FERFJfTEVOXTsgKi8KIAogCXN0cnVjdCB2bWJ1c19jaGFubmVsICpjaG5fdGFibGVbVlJTU19DSEFOTkVMX01BWF07CiAJdTMyIHNlbmRfdGFibGVbVlJTU19TRU5EX1RBQl9TSVpFXTsKQEAgLTczMywxNSArNzU3LDEwIEBACiAJdTMyIG1heF9wa3Q7IC8qIG1heCBudW1iZXIgb2YgcGt0IGluIG9uZSBzZW5kLCBlLmcuIDggKi8KIAl1MzIgcGt0X2FsaWduOyAvKiBhbGlnbm1lbnQgYnl0ZXMsIGUuZy4gOCAqLwogCi0JLyogMTogYWxsb2NhdGVkLCBzZXJpYWwgbnVtYmVyIGlzIHZhbGlkLiAwOiBub3QgYWxsb2NhdGVkICovCi0JdTMyIHZmX2FsbG9jOwotCS8qIFNlcmlhbCBudW1iZXIgb2YgdGhlIFZGIHRvIHRlYW0gd2l0aCAqLwotCXUzMiB2Zl9zZXJpYWw7CisJc3RydWN0IG11bHRpX3JlY3ZfY29tcCBtcmNbVlJTU19DSEFOTkVMX01BWF07CisJYXRvbWljX3QgbnVtX291dHN0YW5kaW5nX3JlY3ZzOworCiAJYXRvbWljX3Qgb3Blbl9jbnQ7Ci0JLyogU3RhdGUgdG8gbWFuYWdlIHRoZSBhc3NvY2lhdGVkIFZGIGludGVyZmFjZS4gKi8KLQlib29sIHZmX2luamVjdDsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqdmZfbmV0ZGV2OwotCWF0b21pY190IHZmX3VzZV9jbnQ7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuZXR2c2NfZGV2aWNlICoKQEAgLTEyMTksNyArMTIzOCw3IEBACiAJdTMyIG5kaXNfbXNnX3R5cGU7CiAKIAkvKiBUb3RhbCBsZW5ndGggb2YgdGhpcyBtZXNzYWdlLCBmcm9tIHRoZSBiZWdpbm5pbmcgKi8KLQkvKiBvZiB0aGUgc3J1Y3Qgcm5kaXNfbWVzc2FnZSwgaW4gYnl0ZXMuICovCisJLyogb2YgdGhlIHN0cnVjdCBybmRpc19tZXNzYWdlLCBpbiBieXRlcy4gKi8KIAl1MzIgbXNnX2xlbjsKIAogCS8qIEFjdHVhbCBtZXNzYWdlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oeXBlcnYvbmV0dnNjLmMgYi9kcml2ZXJzL25ldC9oeXBlcnYvbmV0dnNjLmMKaW5kZXggMjBlMDkxNy4uNzIwYjVmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaHlwZXJ2L25ldHZzYy5jCisrKyBiL2RyaXZlcnMvbmV0L2h5cGVydi9uZXR2c2MuYwpAQCAtNTksNyArNTksNiBAQAogCQkJICAgICAgIFZNX1BLVF9EQVRBX0lOQkFORCwgMCk7CiB9CiAKLQogc3RhdGljIHN0cnVjdCBuZXR2c2NfZGV2aWNlICphbGxvY19uZXRfZGV2aWNlKHZvaWQpCiB7CiAJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CkBAIC03NCwyMSArNzMsMjYgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCisJbmV0X2RldmljZS0+bXJjWzBdLmJ1ZiA9IHZ6YWxsb2MoTkVUVlNDX1JFQ1ZTTE9UX01BWCAqCisJCQkJCSBzaXplb2Yoc3RydWN0IHJlY3ZfY29tcF9kYXRhKSk7CisKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZuZXRfZGV2aWNlLT53YWl0X2RyYWluKTsKIAluZXRfZGV2aWNlLT5kZXN0cm95ID0gZmFsc2U7CiAJYXRvbWljX3NldCgmbmV0X2RldmljZS0+b3Blbl9jbnQsIDApOwotCWF0b21pY19zZXQoJm5ldF9kZXZpY2UtPnZmX3VzZV9jbnQsIDApOwogCW5ldF9kZXZpY2UtPm1heF9wa3QgPSBSTkRJU19NQVhfUEtUX0RFRkFVTFQ7CiAJbmV0X2RldmljZS0+cGt0X2FsaWduID0gUk5ESVNfUEtUX0FMSUdOX0RFRkFVTFQ7Ci0KLQluZXRfZGV2aWNlLT52Zl9uZXRkZXYgPSBOVUxMOwotCW5ldF9kZXZpY2UtPnZmX2luamVjdCA9IGZhbHNlOworCWluaXRfY29tcGxldGlvbigmbmV0X2RldmljZS0+Y2hhbm5lbF9pbml0X3dhaXQpOwogCiAJcmV0dXJuIG5ldF9kZXZpY2U7CiB9CiAKIHN0YXRpYyB2b2lkIGZyZWVfbmV0dnNjX2RldmljZShzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbnZkZXYpCiB7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVlJTU19DSEFOTkVMX01BWDsgaSsrKQorCQl2ZnJlZShudmRldi0+bXJjW2ldLmJ1Zik7CisKIAlrZnJlZShudmRldi0+Y2JfYnVmZmVyKTsKIAlrZnJlZShudmRldik7CiB9CkBAIC0xMTEsMjAgKzExNSwyMCBAQAogCQlnb3RvIGdldF9pbl9lcnI7CiAKIAlpZiAobmV0X2RldmljZS0+ZGVzdHJveSAmJgotCQlhdG9taWNfcmVhZCgmbmV0X2RldmljZS0+bnVtX291dHN0YW5kaW5nX3NlbmRzKSA9PSAwKQorCSAgICBhdG9taWNfcmVhZCgmbmV0X2RldmljZS0+bnVtX291dHN0YW5kaW5nX3NlbmRzKSA9PSAwICYmCisJICAgIGF0b21pY19yZWFkKCZuZXRfZGV2aWNlLT5udW1fb3V0c3RhbmRpbmdfcmVjdnMpID09IDApCiAJCW5ldF9kZXZpY2UgPSBOVUxMOwogCiBnZXRfaW5fZXJyOgogCXJldHVybiBuZXRfZGV2aWNlOwogfQogCi0KLXN0YXRpYyBpbnQgbmV0dnNjX2Rlc3Ryb3lfYnVmKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKK3N0YXRpYyB2b2lkIG5ldHZzY19kZXN0cm95X2J1ZihzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IG52c3BfbWVzc2FnZSAqcmV2b2tlX3BhY2tldDsKLQlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGh2X2dldF9kcnZkYXRhKGRldmljZSk7CiAJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2UgPSBuZXRfZGV2aWNlX3RvX25ldHZzY19kZXZpY2UobmRldik7CisJaW50IHJldDsKIAogCS8qCiAJICogSWYgd2UgZ290IGEgc2VjdGlvbiBjb3VudCwgaXQgbWVhbnMgd2UgcmVjZWl2ZWQgYQpAQCAtMTU0LDcgKzE1OCw3IEBACiAJCWlmIChyZXQgIT0gMCkgewogCQkJbmV0ZGV2X2VycihuZGV2LCAidW5hYmxlIHRvIHNlbmQgIgogCQkJCSJyZXZva2UgcmVjZWl2ZSBidWZmZXIgdG8gbmV0dnNwXG4iKTsKLQkJCXJldHVybiByZXQ7CisJCQlyZXR1cm47CiAJCX0KIAl9CiAKQEAgLTE2OSw3ICsxNzMsNyBAQAogCQlpZiAocmV0ICE9IDApIHsKIAkJCW5ldGRldl9lcnIobmRldiwKIAkJCQkgICAidW5hYmxlIHRvIHRlYXJkb3duIHJlY2VpdmUgYnVmZmVyJ3MgZ3BhZGxcbiIpOwotCQkJcmV0dXJuIHJldDsKKwkJCXJldHVybjsKIAkJfQogCQluZXRfZGV2aWNlLT5yZWN2X2J1Zl9ncGFkbF9oYW5kbGUgPSAwOwogCX0KQEAgLTIxMyw3ICsyMTcsNyBAQAogCQlpZiAocmV0ICE9IDApIHsKIAkJCW5ldGRldl9lcnIobmRldiwgInVuYWJsZSB0byBzZW5kICIKIAkJCQkgICAicmV2b2tlIHNlbmQgYnVmZmVyIHRvIG5ldHZzcFxuIik7Ci0JCQlyZXR1cm4gcmV0OworCQkJcmV0dXJuOwogCQl9CiAJfQogCS8qIFRlYXJkb3duIHRoZSBncGFkbCBvbiB0aGUgdnNwIGVuZCAqLwpAQCAtMjI3LDcgKzIzMSw3IEBACiAJCWlmIChyZXQgIT0gMCkgewogCQkJbmV0ZGV2X2VycihuZGV2LAogCQkJCSAgICJ1bmFibGUgdG8gdGVhcmRvd24gc2VuZCBidWZmZXIncyBncGFkbFxuIik7Ci0JCQlyZXR1cm4gcmV0OworCQkJcmV0dXJuOwogCQl9CiAJCW5ldF9kZXZpY2UtPnNlbmRfYnVmX2dwYWRsX2hhbmRsZSA9IDA7CiAJfQpAQCAtMjM3LDggKzI0MSw2IEBACiAJCW5ldF9kZXZpY2UtPnNlbmRfYnVmID0gTlVMTDsKIAl9CiAJa2ZyZWUobmV0X2RldmljZS0+c2VuZF9zZWN0aW9uX21hcCk7Ci0KLQlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IG5ldHZzY19pbml0X2J1ZihzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCkBAIC0yODAsNyArMjgyLDYgQEAKIAkJZ290byBjbGVhbnVwOwogCX0KIAotCiAJLyogTm90aWZ5IHRoZSBOZXRWc3Agb2YgdGhlIGdwYWRsIGhhbmRsZSAqLwogCWluaXRfcGFja2V0ID0gJm5ldF9kZXZpY2UtPmNoYW5uZWxfaW5pdF9wa3Q7CiAKQEAgLTQwNyw3ICs0MDgsNyBAQAogCS8qIFNlY3Rpb24gY291bnQgaXMgc2ltcGx5IHRoZSBzaXplIGRpdmlkZWQgYnkgdGhlIHNlY3Rpb24gc2l6ZS4KIAkgKi8KIAluZXRfZGV2aWNlLT5zZW5kX3NlY3Rpb25fY250ID0KLQkJbmV0X2RldmljZS0+c2VuZF9idWZfc2l6ZS9uZXRfZGV2aWNlLT5zZW5kX3NlY3Rpb25fc2l6ZTsKKwkJbmV0X2RldmljZS0+c2VuZF9idWZfc2l6ZSAvIG5ldF9kZXZpY2UtPnNlbmRfc2VjdGlvbl9zaXplOwogCiAJZGV2X2luZm8oJmRldmljZS0+ZGV2aWNlLCAiU2VuZCBzZWN0aW9uIHNpemU6ICVkLCBTZWN0aW9uIGNvdW50OiVkXG4iLAogCQkgbmV0X2RldmljZS0+c2VuZF9zZWN0aW9uX3NpemUsIG5ldF9kZXZpY2UtPnNlbmRfc2VjdGlvbl9jbnQpOwpAQCAtNDE2LDggKzQxNyw4IEBACiAJbmV0X2RldmljZS0+bWFwX3dvcmRzID0gRElWX1JPVU5EX1VQKG5ldF9kZXZpY2UtPnNlbmRfc2VjdGlvbl9jbnQsCiAJCQkJCSAgICAgQklUU19QRVJfTE9ORyk7CiAKLQluZXRfZGV2aWNlLT5zZW5kX3NlY3Rpb25fbWFwID0KLQkJa3phbGxvYyhuZXRfZGV2aWNlLT5tYXBfd29yZHMgKiBzaXplb2YodWxvbmcpLCBHRlBfS0VSTkVMKTsKKwluZXRfZGV2aWNlLT5zZW5kX3NlY3Rpb25fbWFwID0ga2NhbGxvYyhuZXRfZGV2aWNlLT5tYXBfd29yZHMsCisJCQkJCSAgICAgICBzaXplb2YodWxvbmcpLCBHRlBfS0VSTkVMKTsKIAlpZiAobmV0X2RldmljZS0+c2VuZF9zZWN0aW9uX21hcCA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gY2xlYW51cDsKQEAgLTQzMiw3ICs0MzMsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLQogLyogTmVnb3RpYXRlIE5WU1AgcHJvdG9jb2wgdmVyc2lvbiAqLwogc3RhdGljIGludCBuZWdvdGlhdGVfbnZzcF92ZXIoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLAogCQkJICAgICAgc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2UsCkBAIC00NzIsOSArNDcyLDEzIEBACiAJaW5pdF9wYWNrZXQtPm1zZy52Ml9tc2cuc2VuZF9uZGlzX2NvbmZpZy5tdHUgPSBuZGV2LT5tdHUgKyBFVEhfSExFTjsKIAlpbml0X3BhY2tldC0+bXNnLnYyX21zZy5zZW5kX25kaXNfY29uZmlnLmNhcGFiaWxpdHkuaWVlZTgwMjFxID0gMTsKIAotCWlmIChudnNwX3ZlciA+PSBOVlNQX1BST1RPQ09MX1ZFUlNJT05fNSkKKwlpZiAobnZzcF92ZXIgPj0gTlZTUF9QUk9UT0NPTF9WRVJTSU9OXzUpIHsKIAkJaW5pdF9wYWNrZXQtPm1zZy52Ml9tc2cuc2VuZF9uZGlzX2NvbmZpZy5jYXBhYmlsaXR5LnNyaW92ID0gMTsKIAorCQkvKiBUZWFtaW5nIGJpdCBpcyBuZWVkZWQgdG8gcmVjZWl2ZSBsaW5rIHNwZWVkIHVwZGF0ZXMgKi8KKwkJaW5pdF9wYWNrZXQtPm1zZy52Ml9tc2cuc2VuZF9uZGlzX2NvbmZpZy5jYXBhYmlsaXR5LnRlYW1pbmcgPSAxOworCX0KKwogCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoZGV2aWNlLT5jaGFubmVsLCBpbml0X3BhY2tldCwKIAkJCQlzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSksCiAJCQkJKHVuc2lnbmVkIGxvbmcpaW5pdF9wYWNrZXQsCkBAIC00ODksOSArNDkzLDEwIEBACiAJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CiAJc3RydWN0IG52c3BfbWVzc2FnZSAqaW5pdF9wYWNrZXQ7CiAJaW50IG5kaXNfdmVyc2lvbjsKLQl1MzIgdmVyX2xpc3RbXSA9IHsgTlZTUF9QUk9UT0NPTF9WRVJTSU9OXzEsIE5WU1BfUFJPVE9DT0xfVkVSU0lPTl8yLAorCWNvbnN0IHUzMiB2ZXJfbGlzdFtdID0geworCQlOVlNQX1BST1RPQ09MX1ZFUlNJT05fMSwgTlZTUF9QUk9UT0NPTF9WRVJTSU9OXzIsCiAJCU5WU1BfUFJPVE9DT0xfVkVSU0lPTl80LCBOVlNQX1BST1RPQ09MX1ZFUlNJT05fNSB9OwotCWludCBpLCBudW1fdmVyID0gNDsgLyogbnVtYmVyIG9mIGRpZmZlcmVudCBOVlNQIHZlcnNpb25zICovCisJaW50IGk7CiAKIAluZXRfZGV2aWNlID0gZ2V0X291dGJvdW5kX25ldF9kZXZpY2UoZGV2aWNlKTsKIAlpZiAoIW5ldF9kZXZpY2UpCkBAIC01MDAsNyArNTA1LDcgQEAKIAlpbml0X3BhY2tldCA9ICZuZXRfZGV2aWNlLT5jaGFubmVsX2luaXRfcGt0OwogCiAJLyogTmVnb3RpYXRlIHRoZSBsYXRlc3QgTlZTUCBwcm90b2NvbCBzdXBwb3J0ZWQgKi8KLQlmb3IgKGkgPSBudW1fdmVyIC0gMTsgaSA+PSAwOyBpLS0pCisJZm9yIChpID0gQVJSQVlfU0laRSh2ZXJfbGlzdCkgLSAxOyBpID49IDA7IGktLSkKIAkJaWYgKG5lZ290aWF0ZV9udnNwX3ZlcihkZXZpY2UsIG5ldF9kZXZpY2UsIGluaXRfcGFja2V0LAogCQkJCSAgICAgICB2ZXJfbGlzdFtpXSkgID09IDApIHsKIAkJCW5ldF9kZXZpY2UtPm52c3BfdmVyc2lvbiA9IHZlcl9saXN0W2ldOwpAQCAtNTU5LDcgKzU2NCw3IEBACiAvKgogICogbmV0dnNjX2RldmljZV9yZW1vdmUgLSBDYWxsYmFjayB3aGVuIHRoZSByb290IGJ1cyBkZXZpY2UgaXMgcmVtb3ZlZAogICovCi1pbnQgbmV0dnNjX2RldmljZV9yZW1vdmUoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQordm9pZCBuZXR2c2NfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBodl9nZXRfZHJ2ZGF0YShkZXZpY2UpOwogCXN0cnVjdCBuZXRfZGV2aWNlX2NvbnRleHQgKm5ldF9kZXZpY2VfY3R4ID0gbmV0ZGV2X3ByaXYobmRldik7CkBAIC01ODEsMTAgKzU4Niw4IEBACiAJLyogUmVsZWFzZSBhbGwgcmVzb3VyY2VzICovCiAJdmZyZWUobmV0X2RldmljZS0+c3ViX2NiX2J1Zik7CiAJZnJlZV9uZXR2c2NfZGV2aWNlKG5ldF9kZXZpY2UpOwotCXJldHVybiAwOwogfQogCi0KICNkZWZpbmUgUklOR19BVkFJTF9QRVJDRU5UX0hJV0FURVIgMjAKICNkZWZpbmUgUklOR19BVkFJTF9QRVJDRU5UX0xPV0FURVIgMTAKIApAQCAtNjA4LDcyICs2MTEsNzkgQEAKIAlzeW5jX2NoYW5nZV9iaXQoaW5kZXgsIG5ldF9kZXZpY2UtPnNlbmRfc2VjdGlvbl9tYXApOwogfQogCitzdGF0aWMgdm9pZCBuZXR2c2Nfc2VuZF90eF9jb21wbGV0ZShzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZSwKKwkJCQkgICAgc3RydWN0IHZtYnVzX2NoYW5uZWwgKmluY29taW5nX2NoYW5uZWwsCisJCQkJICAgIHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKKwkJCQkgICAgc3RydWN0IHZtcGFja2V0X2Rlc2NyaXB0b3IgKnBhY2tldCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopKHVuc2lnbmVkIGxvbmcpcGFja2V0LT50cmFuc19pZDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGh2X2dldF9kcnZkYXRhKGRldmljZSk7CisJc3RydWN0IG5ldF9kZXZpY2VfY29udGV4dCAqbmV0X2RldmljZV9jdHggPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCA9IGRldmljZS0+Y2hhbm5lbDsKKwlpbnQgbnVtX291dHN0YW5kaW5nX3NlbmRzOworCXUxNiBxX2lkeCA9IDA7CisJaW50IHF1ZXVlX3NlbmRzOworCisJLyogTm90aWZ5IHRoZSBsYXllciBhYm92ZSB1cyAqLworCWlmIChsaWtlbHkoc2tiKSkgeworCQlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqbnZzY19wYWNrZXQKKwkJCT0gKHN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICopc2tiLT5jYjsKKwkJdTMyIHNlbmRfaW5kZXggPSBudnNjX3BhY2tldC0+c2VuZF9idWZfaW5kZXg7CisKKwkJaWYgKHNlbmRfaW5kZXggIT0gTkVUVlNDX0lOVkFMSURfSU5ERVgpCisJCQluZXR2c2NfZnJlZV9zZW5kX3Nsb3QobmV0X2RldmljZSwgc2VuZF9pbmRleCk7CisJCXFfaWR4ID0gbnZzY19wYWNrZXQtPnFfaWR4OworCQljaGFubmVsID0gaW5jb21pbmdfY2hhbm5lbDsKKworCQlkZXZfY29uc3VtZV9za2JfYW55KHNrYik7CisJfQorCisJbnVtX291dHN0YW5kaW5nX3NlbmRzID0KKwkJYXRvbWljX2RlY19yZXR1cm4oJm5ldF9kZXZpY2UtPm51bV9vdXRzdGFuZGluZ19zZW5kcyk7CisJcXVldWVfc2VuZHMgPSBhdG9taWNfZGVjX3JldHVybigmbmV0X2RldmljZS0+cXVldWVfc2VuZHNbcV9pZHhdKTsKKworCWlmIChuZXRfZGV2aWNlLT5kZXN0cm95ICYmIG51bV9vdXRzdGFuZGluZ19zZW5kcyA9PSAwKQorCQl3YWtlX3VwKCZuZXRfZGV2aWNlLT53YWl0X2RyYWluKTsKKworCWlmIChuZXRpZl90eF9xdWV1ZV9zdG9wcGVkKG5ldGRldl9nZXRfdHhfcXVldWUobmRldiwgcV9pZHgpKSAmJgorCSAgICAhbmV0X2RldmljZV9jdHgtPnN0YXJ0X3JlbW92ZSAmJgorCSAgICAoaHZfcmluZ2J1Zl9hdmFpbF9wZXJjZW50KCZjaGFubmVsLT5vdXRib3VuZCkgPiBSSU5HX0FWQUlMX1BFUkNFTlRfSElXQVRFUiB8fAorCSAgICAgcXVldWVfc2VuZHMgPCAxKSkKKwkJbmV0aWZfdHhfd2FrZV9xdWV1ZShuZXRkZXZfZ2V0X3R4X3F1ZXVlKG5kZXYsIHFfaWR4KSk7Cit9CisKIHN0YXRpYyB2b2lkIG5ldHZzY19zZW5kX2NvbXBsZXRpb24oc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2UsCiAJCQkJICAgc3RydWN0IHZtYnVzX2NoYW5uZWwgKmluY29taW5nX2NoYW5uZWwsCiAJCQkJICAgc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLAogCQkJCSAgIHN0cnVjdCB2bXBhY2tldF9kZXNjcmlwdG9yICpwYWNrZXQpCiB7CiAJc3RydWN0IG52c3BfbWVzc2FnZSAqbnZzcF9wYWNrZXQ7Ci0Jc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKm52c2NfcGFja2V0OwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gaHZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKLQlzdHJ1Y3QgbmV0X2RldmljZV9jb250ZXh0ICpuZXRfZGV2aWNlX2N0eCA9IG5ldGRldl9wcml2KG5kZXYpOwotCXUzMiBzZW5kX2luZGV4OwotCXN0cnVjdCBza19idWZmICpza2I7CiAKIAludnNwX3BhY2tldCA9IChzdHJ1Y3QgbnZzcF9tZXNzYWdlICopKCh1bnNpZ25lZCBsb25nKXBhY2tldCArCi0JCQkocGFja2V0LT5vZmZzZXQ4IDw8IDMpKTsKKwkJCQkJICAgICAgKHBhY2tldC0+b2Zmc2V0OCA8PCAzKSk7CiAKLQlpZiAoKG52c3BfcGFja2V0LT5oZHIubXNnX3R5cGUgPT0gTlZTUF9NU0dfVFlQRV9JTklUX0NPTVBMRVRFKSB8fAotCSAgICAobnZzcF9wYWNrZXQtPmhkci5tc2dfdHlwZSA9PQotCSAgICAgTlZTUF9NU0cxX1RZUEVfU0VORF9SRUNWX0JVRl9DT01QTEVURSkgfHwKLQkgICAgKG52c3BfcGFja2V0LT5oZHIubXNnX3R5cGUgPT0KLQkgICAgIE5WU1BfTVNHMV9UWVBFX1NFTkRfU0VORF9CVUZfQ09NUExFVEUpIHx8Ci0JICAgIChudnNwX3BhY2tldC0+aGRyLm1zZ190eXBlID09Ci0JICAgICBOVlNQX01TRzVfVFlQRV9TVUJDSEFOTkVMKSkgeworCXN3aXRjaCAobnZzcF9wYWNrZXQtPmhkci5tc2dfdHlwZSkgeworCWNhc2UgTlZTUF9NU0dfVFlQRV9JTklUX0NPTVBMRVRFOgorCWNhc2UgTlZTUF9NU0cxX1RZUEVfU0VORF9SRUNWX0JVRl9DT01QTEVURToKKwljYXNlIE5WU1BfTVNHMV9UWVBFX1NFTkRfU0VORF9CVUZfQ09NUExFVEU6CisJY2FzZSBOVlNQX01TRzVfVFlQRV9TVUJDSEFOTkVMOgogCQkvKiBDb3B5IHRoZSByZXNwb25zZSBiYWNrICovCiAJCW1lbWNweSgmbmV0X2RldmljZS0+Y2hhbm5lbF9pbml0X3BrdCwgbnZzcF9wYWNrZXQsCiAJCSAgICAgICBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSkpOwogCQljb21wbGV0ZSgmbmV0X2RldmljZS0+Y2hhbm5lbF9pbml0X3dhaXQpOwotCX0gZWxzZSBpZiAobnZzcF9wYWNrZXQtPmhkci5tc2dfdHlwZSA9PQotCQkgICBOVlNQX01TRzFfVFlQRV9TRU5EX1JORElTX1BLVF9DT01QTEVURSkgewotCQlpbnQgbnVtX291dHN0YW5kaW5nX3NlbmRzOwotCQl1MTYgcV9pZHggPSAwOwotCQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCA9IGRldmljZS0+Y2hhbm5lbDsKLQkJaW50IHF1ZXVlX3NlbmRzOworCQlicmVhazsKIAotCQkvKiBHZXQgdGhlIHNlbmQgY29udGV4dCAqLwotCQlza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikodW5zaWduZWQgbG9uZylwYWNrZXQtPnRyYW5zX2lkOworCWNhc2UgTlZTUF9NU0cxX1RZUEVfU0VORF9STkRJU19QS1RfQ09NUExFVEU6CisJCW5ldHZzY19zZW5kX3R4X2NvbXBsZXRlKG5ldF9kZXZpY2UsIGluY29taW5nX2NoYW5uZWwsCisJCQkJCWRldmljZSwgcGFja2V0KTsKKwkJYnJlYWs7CiAKLQkJLyogTm90aWZ5IHRoZSBsYXllciBhYm92ZSB1cyAqLwotCQlpZiAoc2tiKSB7Ci0JCQludnNjX3BhY2tldCA9IChzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqKSBza2ItPmNiOwotCQkJc2VuZF9pbmRleCA9IG52c2NfcGFja2V0LT5zZW5kX2J1Zl9pbmRleDsKLQkJCWlmIChzZW5kX2luZGV4ICE9IE5FVFZTQ19JTlZBTElEX0lOREVYKQotCQkJCW5ldHZzY19mcmVlX3NlbmRfc2xvdChuZXRfZGV2aWNlLCBzZW5kX2luZGV4KTsKLQkJCXFfaWR4ID0gbnZzY19wYWNrZXQtPnFfaWR4OwotCQkJY2hhbm5lbCA9IGluY29taW5nX2NoYW5uZWw7Ci0JCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQl9Ci0KLQkJbnVtX291dHN0YW5kaW5nX3NlbmRzID0KLQkJCWF0b21pY19kZWNfcmV0dXJuKCZuZXRfZGV2aWNlLT5udW1fb3V0c3RhbmRpbmdfc2VuZHMpOwotCQlxdWV1ZV9zZW5kcyA9IGF0b21pY19kZWNfcmV0dXJuKCZuZXRfZGV2aWNlLT4KLQkJCQkJCXF1ZXVlX3NlbmRzW3FfaWR4XSk7Ci0KLQkJaWYgKG5ldF9kZXZpY2UtPmRlc3Ryb3kgJiYgbnVtX291dHN0YW5kaW5nX3NlbmRzID09IDApCi0JCQl3YWtlX3VwKCZuZXRfZGV2aWNlLT53YWl0X2RyYWluKTsKLQotCQlpZiAobmV0aWZfdHhfcXVldWVfc3RvcHBlZChuZXRkZXZfZ2V0X3R4X3F1ZXVlKG5kZXYsIHFfaWR4KSkgJiYKLQkJICAgICFuZXRfZGV2aWNlX2N0eC0+c3RhcnRfcmVtb3ZlICYmCi0JCSAgICAoaHZfcmluZ2J1Zl9hdmFpbF9wZXJjZW50KCZjaGFubmVsLT5vdXRib3VuZCkgPgotCQkgICAgIFJJTkdfQVZBSUxfUEVSQ0VOVF9ISVdBVEVSIHx8IHF1ZXVlX3NlbmRzIDwgMSkpCi0JCQkJbmV0aWZfdHhfd2FrZV9xdWV1ZShuZXRkZXZfZ2V0X3R4X3F1ZXVlKAotCQkJCQkJICAgIG5kZXYsIHFfaWR4KSk7Ci0JfSBlbHNlIHsKLQkJbmV0ZGV2X2VycihuZGV2LCAiVW5rbm93biBzZW5kIGNvbXBsZXRpb24gcGFja2V0IHR5cGUtICIKLQkJCSAgICIlZCByZWNlaXZlZCEhXG4iLCBudnNwX3BhY2tldC0+aGRyLm1zZ190eXBlKTsKKwlkZWZhdWx0OgorCQluZXRkZXZfZXJyKG5kZXYsCisJCQkgICAiVW5rbm93biBzZW5kIGNvbXBsZXRpb24gdHlwZSAlZCByZWNlaXZlZCEhXG4iLAorCQkJICAgbnZzcF9wYWNrZXQtPmhkci5tc2dfdHlwZSk7CiAJfQotCiB9CiAKIHN0YXRpYyB1MzIgbmV0dnNjX2dldF9uZXh0X3NlbmRfc2VjdGlvbihzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZSkKQEAgLTg2Myw3ICs4NzMsNyBAQAogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlOwotCWludCByZXQgPSAwLCBtX3JldCA9IDA7CisJaW50IHJldCA9IDA7CiAJc3RydWN0IHZtYnVzX2NoYW5uZWwgKm91dF9jaGFubmVsOwogCXUxNiBxX2lkeCA9IHBhY2tldC0+cV9pZHg7CiAJdTMyIHBrdGxlbiA9IHBhY2tldC0+dG90YWxfZGF0YV9idWZsZW4sIG1zZF9sZW4gPSAwOwpAQCAtOTM0LDcgKzk0NCw3IEBACiAJCX0KIAogCQlpZiAobXNkcC0+c2tiKQotCQkJZGV2X2tmcmVlX3NrYl9hbnkobXNkcC0+c2tiKTsKKwkJCWRldl9jb25zdW1lX3NrYl9hbnkobXNkcC0+c2tiKTsKIAogCQlpZiAoeG1pdF9tb3JlICYmICFwYWNrZXQtPmNwX3BhcnRpYWwpIHsKIAkJCW1zZHAtPnNrYiA9IHNrYjsKQEAgLTk1Miw4ICs5NjIsOCBAQAogCX0KIAogCWlmIChtc2Rfc2VuZCkgewotCQltX3JldCA9IG5ldHZzY19zZW5kX3BrdChkZXZpY2UsIG1zZF9zZW5kLCBuZXRfZGV2aWNlLAotCQkJCQlOVUxMLCBtc2Rfc2tiKTsKKwkJaW50IG1fcmV0ID0gbmV0dnNjX3NlbmRfcGt0KGRldmljZSwgbXNkX3NlbmQsIG5ldF9kZXZpY2UsCisJCQkJCSAgICBOVUxMLCBtc2Rfc2tiKTsKIAogCQlpZiAobV9yZXQgIT0gMCkgewogCQkJbmV0dnNjX2ZyZWVfc2VuZF9zbG90KG5ldF9kZXZpY2UsCkBAIC05NzIsNDkgKzk4MiwxMjEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBuZXR2c2Nfc2VuZF9yZWN2X2NvbXBsZXRpb24oc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLAotCQkJCQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCwKLQkJCQkJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2UsCi0JCQkJCXU2NCB0cmFuc2FjdGlvbl9pZCwgdTMyIHN0YXR1cykKK3N0YXRpYyBpbnQgbmV0dnNjX3NlbmRfcmVjdl9jb21wbGV0aW9uKHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsLAorCQkJCSAgICAgICB1NjQgdHJhbnNhY3Rpb25faWQsIHUzMiBzdGF0dXMpCiB7CiAJc3RydWN0IG52c3BfbWVzc2FnZSByZWN2Y29tcE1lc3NhZ2U7Ci0JaW50IHJldHJpZXMgPSAwOwogCWludCByZXQ7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBodl9nZXRfZHJ2ZGF0YShkZXZpY2UpOwogCiAJcmVjdmNvbXBNZXNzYWdlLmhkci5tc2dfdHlwZSA9CiAJCQkJTlZTUF9NU0cxX1RZUEVfU0VORF9STkRJU19QS1RfQ09NUExFVEU7CiAKIAlyZWN2Y29tcE1lc3NhZ2UubXNnLnYxX21zZy5zZW5kX3JuZGlzX3BrdF9jb21wbGV0ZS5zdGF0dXMgPSBzdGF0dXM7CiAKLXJldHJ5X3NlbmRfY21wbHQ6CiAJLyogU2VuZCB0aGUgY29tcGxldGlvbiAqLwogCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoY2hhbm5lbCwgJnJlY3Zjb21wTWVzc2FnZSwKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSksIHRyYW5zYWN0aW9uX2lkLAotCQkJICAgICAgIFZNX1BLVF9DT01QLCAwKTsKLQlpZiAocmV0ID09IDApIHsKLQkJLyogc3VjY2VzcyAqLwotCQkvKiBuby1vcCAqLwotCX0gZWxzZSBpZiAocmV0ID09IC1FQUdBSU4pIHsKLQkJLyogbm8gbW9yZSByb29tLi4ud2FpdCBhIGJpdCBhbmQgYXR0ZW1wdCB0byByZXRyeSAzIHRpbWVzICovCi0JCXJldHJpZXMrKzsKLQkJbmV0ZGV2X2VycihuZGV2LCAidW5hYmxlIHRvIHNlbmQgcmVjZWl2ZSBjb21wbGV0aW9uIHBrdCIKLQkJCSIgKHRpZCAlbGx4KS4uLnJldHJ5aW5nICVkXG4iLCB0cmFuc2FjdGlvbl9pZCwgcmV0cmllcyk7CisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBudnNwX21lc3NhZ2VfaGVhZGVyKSArIHNpemVvZih1MzIpLAorCQkJICAgICAgIHRyYW5zYWN0aW9uX2lkLCBWTV9QS1RfQ09NUCwgMCk7CiAKLQkJaWYgKHJldHJpZXMgPCA0KSB7Ci0JCQl1ZGVsYXkoMTAwKTsKLQkJCWdvdG8gcmV0cnlfc2VuZF9jbXBsdDsKLQkJfSBlbHNlIHsKLQkJCW5ldGRldl9lcnIobmRldiwgInVuYWJsZSB0byBzZW5kIHJlY2VpdmUgIgotCQkJCSJjb21wbGV0aW9uIHBrdCAodGlkICVsbHgpLi4uZ2l2ZSB1cCByZXRyeWluZ1xuIiwKLQkJCQl0cmFuc2FjdGlvbl9pZCk7Ci0JCX0KLQl9IGVsc2UgewotCQluZXRkZXZfZXJyKG5kZXYsICJ1bmFibGUgdG8gc2VuZCByZWNlaXZlICIKLQkJCSJjb21wbGV0aW9uIHBrdCAtICVsbHhcbiIsIHRyYW5zYWN0aW9uX2lkKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY291bnRfcmVjdl9jb21wX3Nsb3Qoc3RydWN0IG5ldHZzY19kZXZpY2UgKm52ZGV2LCB1MTYgcV9pZHgsCisJCQkJCXUzMiAqZmlsbGVkLCB1MzIgKmF2YWlsKQoreworCXUzMiBmaXJzdCA9IG52ZGV2LT5tcmNbcV9pZHhdLmZpcnN0OworCXUzMiBuZXh0ID0gbnZkZXYtPm1yY1txX2lkeF0ubmV4dDsKKworCSpmaWxsZWQgPSAoZmlyc3QgPiBuZXh0KSA/IE5FVFZTQ19SRUNWU0xPVF9NQVggLSBmaXJzdCArIG5leHQgOgorCQkgIG5leHQgLSBmaXJzdDsKKworCSphdmFpbCA9IE5FVFZTQ19SRUNWU0xPVF9NQVggLSAqZmlsbGVkIC0gMTsKK30KKworLyogUmVhZCB0aGUgZmlyc3QgZmlsbGVkIHNsb3QsIG5vIGNoYW5nZSB0byBpbmRleCAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVjdl9jb21wX2RhdGEgKnJlYWRfcmVjdl9jb21wX3Nsb3Qoc3RydWN0IG5ldHZzY19kZXZpY2UKKwkJCQkJCQkgKm52ZGV2LCB1MTYgcV9pZHgpCit7CisJdTMyIGZpbGxlZCwgYXZhaWw7CisKKwlpZiAoIW52ZGV2LT5tcmNbcV9pZHhdLmJ1ZikKKwkJcmV0dXJuIE5VTEw7CisKKwljb3VudF9yZWN2X2NvbXBfc2xvdChudmRldiwgcV9pZHgsICZmaWxsZWQsICZhdmFpbCk7CisJaWYgKCFmaWxsZWQpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIG52ZGV2LT5tcmNbcV9pZHhdLmJ1ZiArIG52ZGV2LT5tcmNbcV9pZHhdLmZpcnN0ICoKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCByZWN2X2NvbXBfZGF0YSk7Cit9CisKKy8qIFB1dCB0aGUgZmlyc3QgZmlsbGVkIHNsb3QgYmFjayB0byBhdmFpbGFibGUgcG9vbCAqLworc3RhdGljIGlubGluZSB2b2lkIHB1dF9yZWN2X2NvbXBfc2xvdChzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbnZkZXYsIHUxNiBxX2lkeCkKK3sKKwlpbnQgbnVtX3JlY3Y7CisKKwludmRldi0+bXJjW3FfaWR4XS5maXJzdCA9IChudmRldi0+bXJjW3FfaWR4XS5maXJzdCArIDEpICUKKwkJCQkgIE5FVFZTQ19SRUNWU0xPVF9NQVg7CisKKwludW1fcmVjdiA9IGF0b21pY19kZWNfcmV0dXJuKCZudmRldi0+bnVtX291dHN0YW5kaW5nX3JlY3ZzKTsKKworCWlmIChudmRldi0+ZGVzdHJveSAmJiBudW1fcmVjdiA9PSAwKQorCQl3YWtlX3VwKCZudmRldi0+d2FpdF9kcmFpbik7Cit9CisKKy8qIENoZWNrIGFuZCBzZW5kIHBlbmRpbmcgcmVjdiBjb21wbGV0aW9ucyAqLworc3RhdGljIHZvaWQgbmV0dnNjX2Noa19yZWN2X2NvbXAoc3RydWN0IG5ldHZzY19kZXZpY2UgKm52ZGV2LAorCQkJCSBzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCwgdTE2IHFfaWR4KQoreworCXN0cnVjdCByZWN2X2NvbXBfZGF0YSAqcmNkOworCWludCByZXQ7CisKKwl3aGlsZSAodHJ1ZSkgeworCQlyY2QgPSByZWFkX3JlY3ZfY29tcF9zbG90KG52ZGV2LCBxX2lkeCk7CisJCWlmICghcmNkKQorCQkJYnJlYWs7CisKKwkJcmV0ID0gbmV0dnNjX3NlbmRfcmVjdl9jb21wbGV0aW9uKGNoYW5uZWwsIHJjZC0+dGlkLAorCQkJCQkJICByY2QtPnN0YXR1cyk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKworCQlwdXRfcmVjdl9jb21wX3Nsb3QobnZkZXYsIHFfaWR4KTsKIAl9CiB9CiAKKyNkZWZpbmUgTkVUVlNDX1JDRF9XQVRFUk1BUksgODAKKworLyogR2V0IG5leHQgYXZhaWxhYmxlIHNsb3QgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJlY3ZfY29tcF9kYXRhICpnZXRfcmVjdl9jb21wX3Nsb3QoCisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm52ZGV2LCBzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCwgdTE2IHFfaWR4KQoreworCXUzMiBmaWxsZWQsIGF2YWlsLCBuZXh0OworCXN0cnVjdCByZWN2X2NvbXBfZGF0YSAqcmNkOworCisJaWYgKCFudmRldi0+cmVjdl9zZWN0aW9uKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghbnZkZXYtPm1yY1txX2lkeF0uYnVmKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChhdG9taWNfcmVhZCgmbnZkZXYtPm51bV9vdXRzdGFuZGluZ19yZWN2cykgPgorCSAgICBudmRldi0+cmVjdl9zZWN0aW9uLT5udW1fc3ViX2FsbG9jcyAqIE5FVFZTQ19SQ0RfV0FURVJNQVJLIC8gMTAwKQorCQluZXR2c2NfY2hrX3JlY3ZfY29tcChudmRldiwgY2hhbm5lbCwgcV9pZHgpOworCisJY291bnRfcmVjdl9jb21wX3Nsb3QobnZkZXYsIHFfaWR4LCAmZmlsbGVkLCAmYXZhaWwpOworCWlmICghYXZhaWwpCisJCXJldHVybiBOVUxMOworCisJbmV4dCA9IG52ZGV2LT5tcmNbcV9pZHhdLm5leHQ7CisJcmNkID0gbnZkZXYtPm1yY1txX2lkeF0uYnVmICsgbmV4dCAqIHNpemVvZihzdHJ1Y3QgcmVjdl9jb21wX2RhdGEpOworCW52ZGV2LT5tcmNbcV9pZHhdLm5leHQgPSAobmV4dCArIDEpICUgTkVUVlNDX1JFQ1ZTTE9UX01BWDsKKworCWF0b21pY19pbmMoJm52ZGV2LT5udW1fb3V0c3RhbmRpbmdfcmVjdnMpOworCisJcmV0dXJuIHJjZDsKK30KKwogc3RhdGljIHZvaWQgbmV0dnNjX3JlY2VpdmUoc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2UsCiAJCQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCwKIAkJCXN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKQEAgLTEwMjksNiArMTExMSw5IEBACiAJaW50IGNvdW50ID0gMDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGh2X2dldF9kcnZkYXRhKGRldmljZSk7CiAJdm9pZCAqZGF0YTsKKwlpbnQgcmV0OworCXN0cnVjdCByZWN2X2NvbXBfZGF0YSAqcmNkOworCXUxNiBxX2lkeCA9IGNoYW5uZWwtPm9mZmVybXNnLm9mZmVyLnN1Yl9jaGFubmVsX2luZGV4OwogCiAJLyoKIAkgKiBBbGwgaW5ib3VuZCBwYWNrZXRzIG90aGVyIHRoYW4gc2VuZCBjb21wbGV0aW9uIHNob3VsZCBiZSB4ZmVyIHBhZ2UKQEAgLTEwNzMsMTMgKzExNTgsMjkgQEAKIAkJLyogUGFzcyBpdCB0byB0aGUgdXBwZXIgbGF5ZXIgKi8KIAkJc3RhdHVzID0gcm5kaXNfZmlsdGVyX3JlY2VpdmUoZGV2aWNlLCBuZXR2c2NfcGFja2V0LCAmZGF0YSwKIAkJCQkJICAgICAgY2hhbm5lbCk7Ci0KIAl9CiAKLQluZXR2c2Nfc2VuZF9yZWN2X2NvbXBsZXRpb24oZGV2aWNlLCBjaGFubmVsLCBuZXRfZGV2aWNlLAotCQkJCSAgICB2bXhmZXJwYWdlX3BhY2tldC0+ZC50cmFuc19pZCwgc3RhdHVzKTsKLX0KKwlpZiAoIW5ldF9kZXZpY2UtPm1yY1txX2lkeF0uYnVmKSB7CisJCXJldCA9IG5ldHZzY19zZW5kX3JlY3ZfY29tcGxldGlvbihjaGFubmVsLAorCQkJCQkJICB2bXhmZXJwYWdlX3BhY2tldC0+ZC50cmFuc19pZCwKKwkJCQkJCSAgc3RhdHVzKTsKKwkJaWYgKHJldCkKKwkJCW5ldGRldl9lcnIobmRldiwgIlJlY3ZfY29tcCBxOiVoZCwgdGlkOiVsbHgsIGVycjolZFxuIiwKKwkJCQkgICBxX2lkeCwgdm14ZmVycGFnZV9wYWNrZXQtPmQudHJhbnNfaWQsIHJldCk7CisJCXJldHVybjsKKwl9CiAKKwlyY2QgPSBnZXRfcmVjdl9jb21wX3Nsb3QobmV0X2RldmljZSwgY2hhbm5lbCwgcV9pZHgpOworCisJaWYgKCFyY2QpIHsKKwkJbmV0ZGV2X2VycihuZGV2LCAiUmVjdl9jb21wIGZ1bGwgYnVmIHE6JWhkLCB0aWQ6JWxseFxuIiwKKwkJCSAgIHFfaWR4LCB2bXhmZXJwYWdlX3BhY2tldC0+ZC50cmFuc19pZCk7CisJCXJldHVybjsKKwl9CisKKwlyY2QtPnRpZCA9IHZteGZlcnBhZ2VfcGFja2V0LT5kLnRyYW5zX2lkOworCXJjZC0+c3RhdHVzID0gc3RhdHVzOworfQogCiBzdGF0aWMgdm9pZCBuZXR2c2Nfc2VuZF90YWJsZShzdHJ1Y3QgaHZfZGV2aWNlICpoZGV2LAogCQkJICAgICAgc3RydWN0IG52c3BfbWVzc2FnZSAqbnZtc2cpCkBAIC0xMTA2LDE2ICsxMjA3LDE2IEBACiAJCW52c2NkZXYtPnNlbmRfdGFibGVbaV0gPSB0YWJbaV07CiB9CiAKLXN0YXRpYyB2b2lkIG5ldHZzY19zZW5kX3ZmKHN0cnVjdCBuZXR2c2NfZGV2aWNlICpudmRldiwKK3N0YXRpYyB2b2lkIG5ldHZzY19zZW5kX3ZmKHN0cnVjdCBuZXRfZGV2aWNlX2NvbnRleHQgKm5ldF9kZXZpY2VfY3R4LAogCQkJICAgc3RydWN0IG52c3BfbWVzc2FnZSAqbnZtc2cpCiB7Ci0JbnZkZXYtPnZmX2FsbG9jID0gbnZtc2ctPm1zZy52NF9tc2cudmZfYXNzb2MuYWxsb2NhdGVkOwotCW52ZGV2LT52Zl9zZXJpYWwgPSBudm1zZy0+bXNnLnY0X21zZy52Zl9hc3NvYy5zZXJpYWw7CisJbmV0X2RldmljZV9jdHgtPnZmX2FsbG9jID0gbnZtc2ctPm1zZy52NF9tc2cudmZfYXNzb2MuYWxsb2NhdGVkOworCW5ldF9kZXZpY2VfY3R4LT52Zl9zZXJpYWwgPSBudm1zZy0+bXNnLnY0X21zZy52Zl9hc3NvYy5zZXJpYWw7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBuZXR2c2NfcmVjZWl2ZV9pbmJhbmQoc3RydWN0IGh2X2RldmljZSAqaGRldiwKLQkJCQkJIHN0cnVjdCBuZXR2c2NfZGV2aWNlICpudmRldiwKLQkJCQkJIHN0cnVjdCBudnNwX21lc3NhZ2UgKm52bXNnKQorCQkJCSBzdHJ1Y3QgbmV0X2RldmljZV9jb250ZXh0ICpuZXRfZGV2aWNlX2N0eCwKKwkJCQkgc3RydWN0IG52c3BfbWVzc2FnZSAqbnZtc2cpCiB7CiAJc3dpdGNoIChudm1zZy0+aGRyLm1zZ190eXBlKSB7CiAJY2FzZSBOVlNQX01TRzVfVFlQRV9TRU5EX0lORElSRUNUSU9OX1RBQkxFOgpAQCAtMTEyMyw3ICsxMjI0LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIE5WU1BfTVNHNF9UWVBFX1NFTkRfVkZfQVNTT0NJQVRJT046Ci0JCW5ldHZzY19zZW5kX3ZmKG52ZGV2LCBudm1zZyk7CisJCW5ldHZzY19zZW5kX3ZmKG5ldF9kZXZpY2VfY3R4LCBudm1zZyk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTExMzYsNiArMTIzNyw3IEBACiAJCQkJICAgc3RydWN0IHZtcGFja2V0X2Rlc2NyaXB0b3IgKmRlc2MpCiB7CiAJc3RydWN0IG52c3BfbWVzc2FnZSAqbnZtc2c7CisJc3RydWN0IG5ldF9kZXZpY2VfY29udGV4dCAqbmV0X2RldmljZV9jdHggPSBuZXRkZXZfcHJpdihuZGV2KTsKIAogCW52bXNnID0gKHN0cnVjdCBudnNwX21lc3NhZ2UgKikoKHVuc2lnbmVkIGxvbmcpCiAJCWRlc2MgKyAoZGVzYy0+b2Zmc2V0OCA8PCAzKSk7CkBAIC0xMTUwLDcgKzEyNTIsNyBAQAogCQlicmVhazsKIAogCWNhc2UgVk1fUEtUX0RBVEFfSU5CQU5EOgotCQluZXR2c2NfcmVjZWl2ZV9pbmJhbmQoZGV2aWNlLCBuZXRfZGV2aWNlLCBudm1zZyk7CisJCW5ldHZzY19yZWNlaXZlX2luYmFuZChkZXZpY2UsIG5ldF9kZXZpY2VfY3R4LCBudm1zZyk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTExNjAsMTEgKzEyNjIsMTEgQEAKIAl9CiB9CiAKLQogdm9pZCBuZXR2c2NfY2hhbm5lbF9jYih2b2lkICpjb250ZXh0KQogewogCWludCByZXQ7CiAJc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWwgKiljb250ZXh0OworCXUxNiBxX2lkeCA9IGNoYW5uZWwtPm9mZmVybXNnLm9mZmVyLnN1Yl9jaGFubmVsX2luZGV4OwogCXN0cnVjdCBodl9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZTsKIAl1MzIgYnl0ZXNfcmVjdmQ7CkBAIC0xMjE2LDggKzEzMTgsNiBAQAogCQkJCQkJICAgICAgIG5kZXYsCiAJCQkJCQkgICAgICAgcmVxdWVzdF9pZCwKIAkJCQkJCSAgICAgICBkZXNjKTsKLQotCiAJCQl9IGVsc2UgewogCQkJCS8qCiAJCQkJICogV2UgYXJlIGRvbmUgZm9yIHRoaXMgcGFzcy4KQEAgLTEyNDQsNyArMTM0NCw4IEBACiAKIAlpZiAoYnVmZmVybGVuID4gTkVUVlNDX1BBQ0tFVF9TSVpFKQogCQlrZnJlZShidWZmZXIpOwotCXJldHVybjsKKworCW5ldHZzY19jaGtfcmVjdl9jb21wKG5ldF9kZXZpY2UsIGNoYW5uZWwsIHFfaWR4KTsKIH0KIAogLyoKQEAgLTEyNjYsOSArMTM2Nyw2IEBACiAKIAluZXRfZGV2aWNlLT5yaW5nX3NpemUgPSByaW5nX3NpemU7CiAKLQkvKiBJbml0aWFsaXplIHRoZSBOZXRWU0MgY2hhbm5lbCBleHRlbnNpb24gKi8KLQlpbml0X2NvbXBsZXRpb24oJm5ldF9kZXZpY2UtPmNoYW5uZWxfaW5pdF93YWl0KTsKLQogCXNldF9wZXJfY2hhbm5lbF9zdGF0ZShkZXZpY2UtPmNoYW5uZWwsIG5ldF9kZXZpY2UtPmNiX2J1ZmZlcik7CiAKIAkvKiBPcGVuIHRoZSBjaGFubmVsICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oeXBlcnYvbmV0dnNjX2Rydi5jIGIvZHJpdmVycy9uZXQvaHlwZXJ2L25ldHZzY19kcnYuYwppbmRleCA0MWJkOTUyLi41MmVlYjJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oeXBlcnYvbmV0dnNjX2Rydi5jCisrKyBiL2RyaXZlcnMvbmV0L2h5cGVydi9uZXR2c2NfZHJ2LmMKQEAgLTQwLDcgKzQwLDYgQEAKIAogI2luY2x1ZGUgImh5cGVydl9uZXQuaCIKIAotCiAjZGVmaW5lIFJJTkdfU0laRV9NSU4gNjQKICNkZWZpbmUgTElOS0NIQU5HRV9JTlQgKDIgKiBIWikKICNkZWZpbmUgTkVUVlNDX0hXX0ZFQVRVUkVTCShORVRJRl9GX1JYQ1NVTSB8IFwKQEAgLTM1OCwxOCArMzU3LDE0IEBACiAJc3RydWN0IHJuZGlzX21lc3NhZ2UgKnJuZGlzX21zZzsKIAlzdHJ1Y3Qgcm5kaXNfcGFja2V0ICpybmRpc19wa3Q7CiAJdTMyIHJuZGlzX21zZ19zaXplOwotCWJvb2wgaXN2bGFuOwotCWJvb2wgbGluZWFyID0gZmFsc2U7CiAJc3RydWN0IHJuZGlzX3Blcl9wYWNrZXRfaW5mbyAqcHBpOwogCXN0cnVjdCBuZGlzX3RjcF9pcF9jaGVja3N1bV9pbmZvICpjc3VtX2luZm87Ci0Jc3RydWN0IG5kaXNfdGNwX2xzb19pbmZvICpsc29faW5mbzsKIAlpbnQgIGhkcl9vZmZzZXQ7CiAJdTMyIG5ldF90cmFuc19pbmZvOwogCXUzMiBoYXNoOwogCXUzMiBza2JfbGVuZ3RoOwogCXN0cnVjdCBodl9wYWdlX2J1ZmZlciBwYWdlX2J1ZltNQVhfUEFHRV9CVUZGRVJfQ09VTlRdOwogCXN0cnVjdCBodl9wYWdlX2J1ZmZlciAqcGIgPSBwYWdlX2J1ZjsKLQlzdHJ1Y3QgbmV0dnNjX3N0YXRzICp0eF9zdGF0cyA9IHRoaXNfY3B1X3B0cihuZXRfZGV2aWNlX2N0eC0+dHhfc3RhdHMpOwogCiAJLyogV2Ugd2lsbCBhdG1vc3QgbmVlZCB0d28gcGFnZXMgdG8gZGVzY3JpYmUgdGhlIHJuZGlzCiAJICogaGVhZGVyLiBXZSBjYW4gb25seSB0cmFuc21pdCBNQVhfUEFHRV9CVUZGRVJfQ09VTlQgbnVtYmVyCkBAIC0zNzcsMjIgKzM3MiwyMCBAQAogCSAqIG1vcmUgcGFnZXMgd2UgdHJ5IGxpbmVhcml6aW5nIGl0LgogCSAqLwogCi1jaGVja19zaXplOgogCXNrYl9sZW5ndGggPSBza2ItPmxlbjsKIAludW1fZGF0YV9wZ3MgPSBuZXR2c2NfZ2V0X3Nsb3RzKHNrYikgKyAyOwotCWlmIChudW1fZGF0YV9wZ3MgPiBNQVhfUEFHRV9CVUZGRVJfQ09VTlQgJiYgbGluZWFyKSB7Ci0JCW5ldF9hbGVydF9yYXRlbGltaXRlZCgicGFja2V0IHRvbyBiaWc6ICV1IHBhZ2VzICgldSBieXRlcylcbiIsCi0JCQkJICAgICAgbnVtX2RhdGFfcGdzLCBza2ItPmxlbik7Ci0JCXJldCA9IC1FRkFVTFQ7Ci0JCWdvdG8gZHJvcDsKLQl9IGVsc2UgaWYgKG51bV9kYXRhX3BncyA+IE1BWF9QQUdFX0JVRkZFUl9DT1VOVCkgewotCQlpZiAoc2tiX2xpbmVhcml6ZShza2IpKSB7Ci0JCQluZXRfYWxlcnRfcmF0ZWxpbWl0ZWQoImZhaWxlZCB0byBsaW5lYXJpemUgc2tiXG4iKTsKLQkJCXJldCA9IC1FTk9NRU07CisKKwlpZiAodW5saWtlbHkobnVtX2RhdGFfcGdzID4gTUFYX1BBR0VfQlVGRkVSX0NPVU5UKSkgeworCQkrK25ldF9kZXZpY2VfY3R4LT5ldGhfc3RhdHMudHhfc2NhdHRlcmVkOworCisJCWlmIChza2JfbGluZWFyaXplKHNrYikpCisJCQlnb3RvIG5vX21lbW9yeTsKKworCQludW1fZGF0YV9wZ3MgPSBuZXR2c2NfZ2V0X3Nsb3RzKHNrYikgKyAyOworCQlpZiAobnVtX2RhdGFfcGdzID4gTUFYX1BBR0VfQlVGRkVSX0NPVU5UKSB7CisJCQkrK25ldF9kZXZpY2VfY3R4LT5ldGhfc3RhdHMudHhfdG9vX2JpZzsKIAkJCWdvdG8gZHJvcDsKIAkJfQotCQlsaW5lYXIgPSB0cnVlOwotCQlnb3RvIGNoZWNrX3NpemU7CiAJfQogCiAJLyoKQEAgLTQwMSwxNyArMzk0LDE0IEBACiAJICogc3RydWN0dXJlLgogCSAqLwogCXJldCA9IHNrYl9jb3dfaGVhZChza2IsIFJORElTX0FORF9QUElfU0laRSk7Ci0JaWYgKHJldCkgewotCQluZXRkZXZfZXJyKG5ldCwgInVuYWJsZSB0byBhbGxvYyBodl9uZXR2c2NfcGFja2V0XG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBkcm9wOwotCX0KKwlpZiAocmV0KQorCQlnb3RvIG5vX21lbW9yeTsKKwogCS8qIFVzZSB0aGUgc2tiIGNvbnRyb2wgYnVmZmVyIGZvciBidWlsZGluZyB1cCB0aGUgcGFja2V0ICovCiAJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCkgPgogCQkJRklFTERfU0laRU9GKHN0cnVjdCBza19idWZmLCBjYikpOwogCXBhY2tldCA9IChzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqKXNrYi0+Y2I7CiAKLQogCXBhY2tldC0+cV9pZHggPSBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKTsKIAogCXBhY2tldC0+dG90YWxfZGF0YV9idWZsZW4gPSBza2ItPmxlbjsKQEAgLTQyMCw4ICs0MTAsNiBAQAogCiAJbWVtc2V0KHJuZGlzX21zZywgMCwgUk5ESVNfQU5EX1BQSV9TSVpFKTsKIAotCWlzdmxhbiA9IHNrYi0+dmxhbl90Y2kgJiBWTEFOX1RBR19QUkVTRU5UOwotCiAJLyogQWRkIHRoZSBybmRpcyBoZWFkZXIgKi8KIAlybmRpc19tc2ctPm5kaXNfbXNnX3R5cGUgPSBSTkRJU19NU0dfUEFDS0VUOwogCXJuZGlzX21zZy0+bXNnX2xlbiA9IHBhY2tldC0+dG90YWxfZGF0YV9idWZsZW47CkBAIC00NDAsNyArNDI4LDcgQEAKIAkJKih1MzIgKikoKHZvaWQgKilwcGkgKyBwcGktPnBwaV9vZmZzZXQpID0gaGFzaDsKIAl9CiAKLQlpZiAoaXN2bGFuKSB7CisJaWYgKHNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikpIHsKIAkJc3RydWN0IG5kaXNfcGt0XzgwMjFxX2luZm8gKnZsYW47CiAKIAkJcm5kaXNfbXNnX3NpemUgKz0gTkRJU19WTEFOX1BQSV9TSVpFOwpAQCAtNDYxLDggKzQ0OSwzNyBAQAogCSAqIFNldHVwIHRoZSBzZW5kc2lkZSBjaGVja3N1bSBvZmZsb2FkIG9ubHkgaWYgdGhpcyBpcyBub3QgYQogCSAqIEdTTyBwYWNrZXQuCiAJICovCi0JaWYgKHNrYl9pc19nc28oc2tiKSkKLQkJZ290byBkb19sc287CisJaWYgKHNrYl9pc19nc28oc2tiKSkgeworCQlzdHJ1Y3QgbmRpc190Y3BfbHNvX2luZm8gKmxzb19pbmZvOworCisJCXJuZGlzX21zZ19zaXplICs9IE5ESVNfTFNPX1BQSV9TSVpFOworCQlwcGkgPSBpbml0X3BwaV9kYXRhKHJuZGlzX21zZywgTkRJU19MU09fUFBJX1NJWkUsCisJCQkJICAgIFRDUF9MQVJHRVNFTkRfUEtUSU5GTyk7CisKKwkJbHNvX2luZm8gPSAoc3RydWN0IG5kaXNfdGNwX2xzb19pbmZvICopKCh2b2lkICopcHBpICsKKwkJCQkJCQlwcGktPnBwaV9vZmZzZXQpOworCisJCWxzb19pbmZvLT5sc29fdjJfdHJhbnNtaXQudHlwZSA9IE5ESVNfVENQX0xBUkdFX1NFTkRfT0ZGTE9BRF9WMl9UWVBFOworCQlpZiAobmV0X3RyYW5zX2luZm8gJiAoSU5GT19JUFY0IDw8IDE2KSkgeworCQkJbHNvX2luZm8tPmxzb192Ml90cmFuc21pdC5pcF92ZXJzaW9uID0KKwkJCQlORElTX1RDUF9MQVJHRV9TRU5EX09GRkxPQURfSVBWNDsKKwkJCWlwX2hkcihza2IpLT50b3RfbGVuID0gMDsKKwkJCWlwX2hkcihza2IpLT5jaGVjayA9IDA7CisJCQl0Y3BfaGRyKHNrYiktPmNoZWNrID0KKwkJCQl+Y3N1bV90Y3B1ZHBfbWFnaWMoaXBfaGRyKHNrYiktPnNhZGRyLAorCQkJCQkJICAgaXBfaGRyKHNrYiktPmRhZGRyLCAwLCBJUFBST1RPX1RDUCwgMCk7CisJCX0gZWxzZSB7CisJCQlsc29faW5mby0+bHNvX3YyX3RyYW5zbWl0LmlwX3ZlcnNpb24gPQorCQkJCU5ESVNfVENQX0xBUkdFX1NFTkRfT0ZGTE9BRF9JUFY2OworCQkJaXB2Nl9oZHIoc2tiKS0+cGF5bG9hZF9sZW4gPSAwOworCQkJdGNwX2hkcihza2IpLT5jaGVjayA9CisJCQkJfmNzdW1faXB2Nl9tYWdpYygmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsCisJCQkJCQkgJmlwdjZfaGRyKHNrYiktPmRhZGRyLCAwLCBJUFBST1RPX1RDUCwgMCk7CisJCX0KKwkJbHNvX2luZm8tPmxzb192Ml90cmFuc21pdC50Y3BfaGVhZGVyX29mZnNldCA9IGhkcl9vZmZzZXQ7CisJCWxzb19pbmZvLT5sc29fdjJfdHJhbnNtaXQubXNzID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKKwkJZ290byBkb19zZW5kOworCX0KIAogCWlmICgoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fTk9ORSkgfHwKIAkgICAgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1VOTkVDRVNTQVJZKSkKQEAgLTQ5NSw3ICs1MTIsNyBAQAogCiAJCXJldCA9IHNrYl9jb3dfaGVhZChza2IsIDApOwogCQlpZiAocmV0KQotCQkJZ290byBkcm9wOworCQkJZ290byBub19tZW1vcnk7CiAKIAkJdWggPSB1ZHBfaGRyKHNrYik7CiAJCXVkcF9sZW4gPSBudG9ocyh1aC0+bGVuKTsKQEAgLTUwOSwzNSArNTI2LDYgQEAKIAogCQljc3VtX2luZm8tPnRyYW5zbWl0LnVkcF9jaGVja3N1bSA9IDA7CiAJfQotCWdvdG8gZG9fc2VuZDsKLQotZG9fbHNvOgotCXJuZGlzX21zZ19zaXplICs9IE5ESVNfTFNPX1BQSV9TSVpFOwotCXBwaSA9IGluaXRfcHBpX2RhdGEocm5kaXNfbXNnLCBORElTX0xTT19QUElfU0laRSwKLQkJCSAgICBUQ1BfTEFSR0VTRU5EX1BLVElORk8pOwotCi0JbHNvX2luZm8gPSAoc3RydWN0IG5kaXNfdGNwX2xzb19pbmZvICopKCh2b2lkICopcHBpICsKLQkJCXBwaS0+cHBpX29mZnNldCk7Ci0KLQlsc29faW5mby0+bHNvX3YyX3RyYW5zbWl0LnR5cGUgPSBORElTX1RDUF9MQVJHRV9TRU5EX09GRkxPQURfVjJfVFlQRTsKLQlpZiAobmV0X3RyYW5zX2luZm8gJiAoSU5GT19JUFY0IDw8IDE2KSkgewotCQlsc29faW5mby0+bHNvX3YyX3RyYW5zbWl0LmlwX3ZlcnNpb24gPQotCQkJTkRJU19UQ1BfTEFSR0VfU0VORF9PRkZMT0FEX0lQVjQ7Ci0JCWlwX2hkcihza2IpLT50b3RfbGVuID0gMDsKLQkJaXBfaGRyKHNrYiktPmNoZWNrID0gMDsKLQkJdGNwX2hkcihza2IpLT5jaGVjayA9Ci0JCX5jc3VtX3RjcHVkcF9tYWdpYyhpcF9oZHIoc2tiKS0+c2FkZHIsCi0JCQkJICAgaXBfaGRyKHNrYiktPmRhZGRyLCAwLCBJUFBST1RPX1RDUCwgMCk7Ci0JfSBlbHNlIHsKLQkJbHNvX2luZm8tPmxzb192Ml90cmFuc21pdC5pcF92ZXJzaW9uID0KLQkJCU5ESVNfVENQX0xBUkdFX1NFTkRfT0ZGTE9BRF9JUFY2OwotCQlpcHY2X2hkcihza2IpLT5wYXlsb2FkX2xlbiA9IDA7Ci0JCXRjcF9oZHIoc2tiKS0+Y2hlY2sgPQotCQl+Y3N1bV9pcHY2X21hZ2ljKCZpcHY2X2hkcihza2IpLT5zYWRkciwKLQkJCQkmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsIDAsIElQUFJPVE9fVENQLCAwKTsKLQl9Ci0JbHNvX2luZm8tPmxzb192Ml90cmFuc21pdC50Y3BfaGVhZGVyX29mZnNldCA9IGhkcl9vZmZzZXQ7Ci0JbHNvX2luZm8tPmxzb192Ml90cmFuc21pdC5tc3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOwogCiBkb19zZW5kOgogCS8qIFN0YXJ0IGZpbGxpbmcgaW4gdGhlIHBhZ2UgYnVmZmVycyB3aXRoIHRoZSBybmRpcyBoZHIgKi8KQEAgLTU1MCwyMSArNTM4LDMzIEBACiAJc2tiX3R4X3RpbWVzdGFtcChza2IpOwogCXJldCA9IG5ldHZzY19zZW5kKG5ldF9kZXZpY2VfY3R4LT5kZXZpY2VfY3R4LCBwYWNrZXQsCiAJCQkgIHJuZGlzX21zZywgJnBiLCBza2IpOworCWlmIChsaWtlbHkocmV0ID09IDApKSB7CisJCXN0cnVjdCBuZXR2c2Nfc3RhdHMgKnR4X3N0YXRzID0gdGhpc19jcHVfcHRyKG5ldF9kZXZpY2VfY3R4LT50eF9zdGF0cyk7CiAKLWRyb3A6Ci0JaWYgKHJldCA9PSAwKSB7CiAJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnR4X3N0YXRzLT5zeW5jcCk7CiAJCXR4X3N0YXRzLT5wYWNrZXRzKys7CiAJCXR4X3N0YXRzLT5ieXRlcyArPSBza2JfbGVuZ3RoOwogCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmdHhfc3RhdHMtPnN5bmNwKTsKLQl9IGVsc2UgewotCQlpZiAocmV0ICE9IC1FQUdBSU4pIHsKLQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCQluZXQtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKLQkJfQorCQlyZXR1cm4gTkVUREVWX1RYX09LOwogCX0KIAotCXJldHVybiAocmV0ID09IC1FQUdBSU4pID8gTkVUREVWX1RYX0JVU1kgOiBORVRERVZfVFhfT0s7CisJaWYgKHJldCA9PSAtRUFHQUlOKSB7CisJCSsrbmV0X2RldmljZV9jdHgtPmV0aF9zdGF0cy50eF9idXN5OworCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CisJfQorCisJaWYgKHJldCA9PSAtRU5PU1BDKQorCQkrK25ldF9kZXZpY2VfY3R4LT5ldGhfc3RhdHMudHhfbm9fc3BhY2U7CisKK2Ryb3A6CisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwluZXQtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKworCXJldHVybiBORVRERVZfVFhfT0s7CisKK25vX21lbW9yeToKKwkrK25ldF9kZXZpY2VfY3R4LT5ldGhfc3RhdHMudHhfbm9fbWVtb3J5OworCWdvdG8gZHJvcDsKIH0KIAogLyoKQEAgLTU3OSwxOSArNTc5LDMyIEBACiAJc3RydWN0IG5ldHZzY19yZWNvbmZpZyAqZXZlbnQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCS8qIEhhbmRsZSBsaW5rIGNoYW5nZSBzdGF0dXNlcyBvbmx5ICovCisJbmV0ID0gaHZfZ2V0X2RydmRhdGEoZGV2aWNlX29iaik7CisKKwlpZiAoIW5ldCkKKwkJcmV0dXJuOworCisJbmRldl9jdHggPSBuZXRkZXZfcHJpdihuZXQpOworCisJLyogVXBkYXRlIHRoZSBwaHlzaWNhbCBsaW5rIHNwZWVkIHdoZW4gY2hhbmdpbmcgdG8gYW5vdGhlciB2U3dpdGNoICovCisJaWYgKGluZGljYXRlLT5zdGF0dXMgPT0gUk5ESVNfU1RBVFVTX0xJTktfU1BFRURfQ0hBTkdFKSB7CisJCXUzMiBzcGVlZDsKKworCQlzcGVlZCA9ICoodTMyICopKCh2b2lkICopaW5kaWNhdGUgKyBpbmRpY2F0ZS0+CisJCQkJIHN0YXR1c19idWZfb2Zmc2V0KSAvIDEwMDAwOworCQluZGV2X2N0eC0+c3BlZWQgPSBzcGVlZDsKKwkJcmV0dXJuOworCX0KKworCS8qIEhhbmRsZSB0aGVzZSBsaW5rIGNoYW5nZSBzdGF0dXNlcyBiZWxvdyAqLwogCWlmIChpbmRpY2F0ZS0+c3RhdHVzICE9IFJORElTX1NUQVRVU19ORVRXT1JLX0NIQU5HRSAmJgogCSAgICBpbmRpY2F0ZS0+c3RhdHVzICE9IFJORElTX1NUQVRVU19NRURJQV9DT05ORUNUICYmCiAJICAgIGluZGljYXRlLT5zdGF0dXMgIT0gUk5ESVNfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QpCiAJCXJldHVybjsKIAotCW5ldCA9IGh2X2dldF9kcnZkYXRhKGRldmljZV9vYmopOwotCi0JaWYgKCFuZXQgfHwgbmV0LT5yZWdfc3RhdGUgIT0gTkVUUkVHX1JFR0lTVEVSRUQpCisJaWYgKG5ldC0+cmVnX3N0YXRlICE9IE5FVFJFR19SRUdJU1RFUkVEKQogCQlyZXR1cm47CiAKLQluZGV2X2N0eCA9IG5ldGRldl9wcml2KG5ldCk7Ci0KIAlldmVudCA9IGt6YWxsb2Moc2l6ZW9mKCpldmVudCksIEdGUF9BVE9NSUMpOwogCWlmICghZXZlbnQpCiAJCXJldHVybjsKQEAgLTYwNCw3ICs2MTcsNiBAQAogCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbmRldl9jdHgtPmR3b3JrLCAwKTsKIH0KIAotCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKm5ldHZzY19hbGxvY19yZWN2X3NrYihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LAogCQkJCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpwYWNrZXQsCiAJCQkJc3RydWN0IG5kaXNfdGNwX2lwX2NoZWNrc3VtX2luZm8gKmNzdW1faW5mbywKQEAgLTY1NSw1MCArNjY3LDIzIEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldCA9IGh2X2dldF9kcnZkYXRhKGRldmljZV9vYmopOwogCXN0cnVjdCBuZXRfZGV2aWNlX2NvbnRleHQgKm5ldF9kZXZpY2VfY3R4ID0gbmV0ZGV2X3ByaXYobmV0KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqdmZfbmV0ZGV2OwogCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IHNrX2J1ZmYgKnZmX3NrYjsKIAlzdHJ1Y3QgbmV0dnNjX3N0YXRzICpyeF9zdGF0czsKLQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0dnNjX2RldiA9IG5ldF9kZXZpY2VfY3R4LT5udmRldjsKLQl1MzIgYnl0ZXNfcmVjdmQgPSBwYWNrZXQtPnRvdGFsX2RhdGFfYnVmbGVuOwotCWludCByZXQgPSAwOwogCi0JaWYgKCFuZXQgfHwgbmV0LT5yZWdfc3RhdGUgIT0gTkVUUkVHX1JFR0lTVEVSRUQpCisJaWYgKG5ldC0+cmVnX3N0YXRlICE9IE5FVFJFR19SRUdJU1RFUkVEKQogCQlyZXR1cm4gTlZTUF9TVEFUX0ZBSUw7CiAKLQlpZiAoUkVBRF9PTkNFKG5ldHZzY19kZXYtPnZmX2luamVjdCkpIHsKLQkJYXRvbWljX2luYygmbmV0dnNjX2Rldi0+dmZfdXNlX2NudCk7Ci0JCWlmICghUkVBRF9PTkNFKG5ldHZzY19kZXYtPnZmX2luamVjdCkpIHsKLQkJCS8qCi0JCQkgKiBXZSByYWNlZDsganVzdCBtb3ZlIG9uLgotCQkJICovCi0JCQlhdG9taWNfZGVjKCZuZXR2c2NfZGV2LT52Zl91c2VfY250KTsKLQkJCWdvdG8gdmZfaW5qZWN0aW9uX2RvbmU7Ci0JCX0KLQotCQkvKgotCQkgKiBJbmplY3QgdGhpcyBwYWNrZXQgaW50byB0aGUgVkYgaW5lcmZhY2UuCi0JCSAqIE9uIEh5cGVyLVYsIG11bHRpY2FzdCBhbmQgYnJvZGNhc3QgcGFja2V0cwotCQkgKiBhcmUgb25seSBkZWxpdmVyZWQgb24gdGhlIHN5bnRoZXRpYyBpbnRlcmZhY2UKLQkJICogKGFmdGVyIHN1YmplY3RpbmcgdGhlc2UgdG8gcG9saWN5IGZpbHRlcnMgb24KLQkJICogdGhlIGhvc3QpLiBEZWxpdmVyIHRoZXNlIHZpYSB0aGUgVkYgaW50ZXJmYWNlCi0JCSAqIGluIHRoZSBndWVzdC4KLQkJICovCi0JCXZmX3NrYiA9IG5ldHZzY19hbGxvY19yZWN2X3NrYihuZXR2c2NfZGV2LT52Zl9uZXRkZXYsIHBhY2tldCwKLQkJCQkJICAgICAgIGNzdW1faW5mbywgKmRhdGEsIHZsYW5fdGNpKTsKLQkJaWYgKHZmX3NrYiAhPSBOVUxMKSB7Ci0JCQkrK25ldHZzY19kZXYtPnZmX25ldGRldi0+c3RhdHMucnhfcGFja2V0czsKLQkJCW5ldHZzY19kZXYtPnZmX25ldGRldi0+c3RhdHMucnhfYnl0ZXMgKz0gYnl0ZXNfcmVjdmQ7Ci0JCQluZXRpZl9yZWNlaXZlX3NrYih2Zl9za2IpOwotCQl9IGVsc2UgewotCQkJKytuZXQtPnN0YXRzLnJ4X2Ryb3BwZWQ7Ci0JCQlyZXQgPSBOVlNQX1NUQVRfRkFJTDsKLQkJfQotCQlhdG9taWNfZGVjKCZuZXR2c2NfZGV2LT52Zl91c2VfY250KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLXZmX2luamVjdGlvbl9kb25lOgotCXJ4X3N0YXRzID0gdGhpc19jcHVfcHRyKG5ldF9kZXZpY2VfY3R4LT5yeF9zdGF0cyk7CisJLyoKKwkgKiBJZiBuZWNlc3NhcnksIGluamVjdCB0aGlzIHBhY2tldCBpbnRvIHRoZSBWRiBpbnRlcmZhY2UuCisJICogT24gSHlwZXItViwgbXVsdGljYXN0IGFuZCBicm9kY2FzdCBwYWNrZXRzIGFyZSBvbmx5IGRlbGl2ZXJlZAorCSAqIHRvIHRoZSBzeW50aGV0aWMgaW50ZXJmYWNlIChhZnRlciBzdWJqZWN0aW5nIHRoZXNlIHRvCisJICogcG9saWN5IGZpbHRlcnMgb24gdGhlIGhvc3QpLiBEZWxpdmVyIHRoZXNlIHZpYSB0aGUgVkYKKwkgKiBpbnRlcmZhY2UgaW4gdGhlIGd1ZXN0LgorCSAqLworCXZmX25ldGRldiA9IHJjdV9kZXJlZmVyZW5jZShuZXRfZGV2aWNlX2N0eC0+dmZfbmV0ZGV2KTsKKwlpZiAodmZfbmV0ZGV2ICYmICh2Zl9uZXRkZXYtPmZsYWdzICYgSUZGX1VQKSkKKwkJbmV0ID0gdmZfbmV0ZGV2OwogCiAJLyogQWxsb2NhdGUgYSBza2IgLSBUT0RPIGRpcmVjdCBJL08gdG8gcGFnZXM/ICovCiAJc2tiID0gbmV0dnNjX2FsbG9jX3JlY3Zfc2tiKG5ldCwgcGFja2V0LCBjc3VtX2luZm8sICpkYXRhLCB2bGFuX3RjaSk7CkBAIC03MDYsMTIgKzY5MSwyNSBAQAogCQkrK25ldC0+c3RhdHMucnhfZHJvcHBlZDsKIAkJcmV0dXJuIE5WU1BfU1RBVF9GQUlMOwogCX0KLQlza2JfcmVjb3JkX3J4X3F1ZXVlKHNrYiwgY2hhbm5lbC0+Ci0JCQkgICAgb2ZmZXJtc2cub2ZmZXIuc3ViX2NoYW5uZWxfaW5kZXgpOwogCisJaWYgKG5ldCAhPSB2Zl9uZXRkZXYpCisJCXNrYl9yZWNvcmRfcnhfcXVldWUoc2tiLAorCQkJCSAgICBjaGFubmVsLT5vZmZlcm1zZy5vZmZlci5zdWJfY2hhbm5lbF9pbmRleCk7CisKKwkvKgorCSAqIEV2ZW4gaWYgaW5qZWN0aW5nIHRoZSBwYWNrZXQsIHJlY29yZCB0aGUgc3RhdGlzdGljcworCSAqIG9uIHRoZSBzeW50aGV0aWMgZGV2aWNlIGJlY2F1c2UgbW9kaWZ5aW5nIHRoZSBWRiBkZXZpY2UKKwkgKiBzdGF0aXN0aWNzIHdpbGwgbm90IHdvcmsgY29ycmVjdGx5LgorCSAqLworCXJ4X3N0YXRzID0gdGhpc19jcHVfcHRyKG5ldF9kZXZpY2VfY3R4LT5yeF9zdGF0cyk7CiAJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmcnhfc3RhdHMtPnN5bmNwKTsKIAlyeF9zdGF0cy0+cGFja2V0cysrOwogCXJ4X3N0YXRzLT5ieXRlcyArPSBwYWNrZXQtPnRvdGFsX2RhdGFfYnVmbGVuOworCisJaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX0JST0FEQ0FTVCkKKwkJKytyeF9zdGF0cy0+YnJvYWRjYXN0OworCWVsc2UgaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX01VTFRJQ0FTVCkKKwkJKytyeF9zdGF0cy0+bXVsdGljYXN0OwogCXU2NF9zdGF0c191cGRhdGVfZW5kKCZyeF9zdGF0cy0+c3luY3ApOwogCiAJLyoKQEAgLTcyNyw4ICs3MjUsMTIgQEAKIHN0YXRpYyB2b2lkIG5ldHZzY19nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LAogCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7CisJc3RydWN0IG5ldF9kZXZpY2VfY29udGV4dCAqbmV0X2RldmljZV9jdHggPSBuZXRkZXZfcHJpdihuZXQpOworCXN0cnVjdCBodl9kZXZpY2UgKmRldiA9IG5ldF9kZXZpY2VfY3R4LT5kZXZpY2VfY3R4OworCiAJc3RybGNweShpbmZvLT5kcml2ZXIsIEtCVUlMRF9NT0ROQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CiAJc3RybGNweShpbmZvLT5md192ZXJzaW9uLCAiTi9BIiwgc2l6ZW9mKGluZm8tPmZ3X3ZlcnNpb24pKTsKKwlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCB2bWJ1c19kZXZfbmFtZShkZXYpLCBzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKIH0KIAogc3RhdGljIHZvaWQgbmV0dnNjX2dldF9jaGFubmVscyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LApAQCAtOTUwLDcgKzk1Miw3IEBACiAJCQkJCQkJICAgIGNwdSk7CiAJCXN0cnVjdCBuZXR2c2Nfc3RhdHMgKnJ4X3N0YXRzID0gcGVyX2NwdV9wdHIobmRldl9jdHgtPnJ4X3N0YXRzLAogCQkJCQkJCSAgICBjcHUpOwotCQl1NjQgdHhfcGFja2V0cywgdHhfYnl0ZXMsIHJ4X3BhY2tldHMsIHJ4X2J5dGVzOworCQl1NjQgdHhfcGFja2V0cywgdHhfYnl0ZXMsIHJ4X3BhY2tldHMsIHJ4X2J5dGVzLCByeF9tdWx0aWNhc3Q7CiAJCXVuc2lnbmVkIGludCBzdGFydDsKIAogCQlkbyB7CkBAIC05NjMsMTIgKzk2NSwxNCBAQAogCQkJc3RhcnQgPSB1NjRfc3RhdHNfZmV0Y2hfYmVnaW5faXJxKCZyeF9zdGF0cy0+c3luY3ApOwogCQkJcnhfcGFja2V0cyA9IHJ4X3N0YXRzLT5wYWNrZXRzOwogCQkJcnhfYnl0ZXMgPSByeF9zdGF0cy0+Ynl0ZXM7CisJCQlyeF9tdWx0aWNhc3QgPSByeF9zdGF0cy0+bXVsdGljYXN0ICsgcnhfc3RhdHMtPmJyb2FkY2FzdDsKIAkJfSB3aGlsZSAodTY0X3N0YXRzX2ZldGNoX3JldHJ5X2lycSgmcnhfc3RhdHMtPnN5bmNwLCBzdGFydCkpOwogCiAJCXQtPnR4X2J5dGVzCSs9IHR4X2J5dGVzOwogCQl0LT50eF9wYWNrZXRzCSs9IHR4X3BhY2tldHM7CiAJCXQtPnJ4X2J5dGVzCSs9IHJ4X2J5dGVzOwogCQl0LT5yeF9wYWNrZXRzCSs9IHJ4X3BhY2tldHM7CisJCXQtPm11bHRpY2FzdAkrPSByeF9tdWx0aWNhc3Q7CiAJfQogCiAJdC0+dHhfZHJvcHBlZAk9IG5ldC0+c3RhdHMudHhfZHJvcHBlZDsKQEAgLTEwMDQsNiArMTAwOCw1MSBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCWNoYXIgbmFtZVtFVEhfR1NUUklOR19MRU5dOworCXUxNiBvZmZzZXQ7Cit9IG5ldHZzY19zdGF0c1tdID0geworCXsgInR4X3NjYXR0ZXJlZCIsIG9mZnNldG9mKHN0cnVjdCBuZXR2c2NfZXRodG9vbF9zdGF0cywgdHhfc2NhdHRlcmVkKSB9LAorCXsgInR4X25vX21lbW9yeSIsICBvZmZzZXRvZihzdHJ1Y3QgbmV0dnNjX2V0aHRvb2xfc3RhdHMsIHR4X25vX21lbW9yeSkgfSwKKwl7ICJ0eF9ub19zcGFjZSIsICBvZmZzZXRvZihzdHJ1Y3QgbmV0dnNjX2V0aHRvb2xfc3RhdHMsIHR4X25vX3NwYWNlKSB9LAorCXsgInR4X3Rvb19iaWciLAkgIG9mZnNldG9mKHN0cnVjdCBuZXR2c2NfZXRodG9vbF9zdGF0cywgdHhfdG9vX2JpZykgfSwKKwl7ICJ0eF9idXN5IiwJICBvZmZzZXRvZihzdHJ1Y3QgbmV0dnNjX2V0aHRvb2xfc3RhdHMsIHR4X2J1c3kpIH0sCit9OworCitzdGF0aWMgaW50IG5ldHZzY19nZXRfc3NldF9jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3RyaW5nX3NldCkKK3sKKwlzd2l0Y2ggKHN0cmluZ19zZXQpIHsKKwljYXNlIEVUSF9TU19TVEFUUzoKKwkJcmV0dXJuIEFSUkFZX1NJWkUobmV0dnNjX3N0YXRzKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG5ldHZzY19nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzLCB1NjQgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2VfY29udGV4dCAqbmRjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljb25zdCB2b2lkICpuZHMgPSAmbmRjLT5ldGhfc3RhdHM7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShuZXR2c2Nfc3RhdHMpOyBpKyspCisJCWRhdGFbaV0gPSAqKHVuc2lnbmVkIGxvbmcgKikobmRzICsgbmV0dnNjX3N0YXRzW2ldLm9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIG5ldHZzY19nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqZGF0YSkKK3sKKwlpbnQgaTsKKworCXN3aXRjaCAoc3RyaW5nc2V0KSB7CisJY2FzZSBFVEhfU1NfU1RBVFM6CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG5ldHZzY19zdGF0cyk7IGkrKykKKwkJCW1lbWNweShkYXRhICsgaSAqIEVUSF9HU1RSSU5HX0xFTiwKKwkJCSAgICAgICBuZXR2c2Nfc3RhdHNbaV0ubmFtZSwgRVRIX0dTVFJJTkdfTEVOKTsKKwkJYnJlYWs7CisJfQorfQorCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIHN0YXRpYyB2b2lkIG5ldHZzY19wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKIHsKQEAgLTEwMTYsNiArMTA2NSw5IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGV0aHRvb2xfb3BzID0gewogCS5nZXRfZHJ2aW5mbwk9IG5ldHZzY19nZXRfZHJ2aW5mbywKIAkuZ2V0X2xpbmsJPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfZXRodG9vbF9zdGF0cyA9IG5ldHZzY19nZXRfZXRodG9vbF9zdGF0cywKKwkuZ2V0X3NzZXRfY291bnQgPSBuZXR2c2NfZ2V0X3NzZXRfY291bnQsCisJLmdldF9zdHJpbmdzCT0gbmV0dnNjX2dldF9zdHJpbmdzLAogCS5nZXRfY2hhbm5lbHMgICA9IG5ldHZzY19nZXRfY2hhbm5lbHMsCiAJLnNldF9jaGFubmVscyAgID0gbmV0dnNjX3NldF9jaGFubmVscywKIAkuZ2V0X3RzX2luZm8JPSBldGh0b29sX29wX2dldF90c19pbmZvLApAQCAtMTE1MCwzNiArMTIwMiw0NCBAQAogCWZyZWVfbmV0ZGV2KG5ldGRldik7CiB9CiAKLXN0YXRpYyB2b2lkIG5ldHZzY19ub3RpZnlfcGVlcnMoc3RydWN0IHdvcmtfc3RydWN0ICp3cmspCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmdldF9uZXR2c2NfYnltYWMoY29uc3QgdTggKm1hYykKIHsKLQlzdHJ1Y3QgZ2FycF93cmsgKmd3cms7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAotCWd3cmsgPSBjb250YWluZXJfb2Yod3JrLCBzdHJ1Y3QgZ2FycF93cmssIGR3cmspOwotCi0JbmV0ZGV2X25vdGlmeV9wZWVycyhnd3JrLT5uZXRkZXYpOwotCi0JYXRvbWljX2RlYygmZ3dyay0+bmV0dnNjX2Rldi0+dmZfdXNlX2NudCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZ2V0X25ldHZzY19uZXRfZGV2aWNlKGNoYXIgKm1hYykKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCAqZm91bmQgPSBOVUxMOwotCWludCBydG5sX2xvY2tlZDsKLQotCXJ0bmxfbG9ja2VkID0gcnRubF90cnlsb2NrKCk7CisJQVNTRVJUX1JUTkwoKTsKIAogCWZvcl9lYWNoX25ldGRldigmaW5pdF9uZXQsIGRldikgewotCQlpZiAobWVtY21wKGRldi0+ZGV2X2FkZHIsIG1hYywgRVRIX0FMRU4pID09IDApIHsKLQkJCWlmIChkZXYtPm5ldGRldl9vcHMgIT0gJmRldmljZV9vcHMpCi0JCQkJY29udGludWU7Ci0JCQlmb3VuZCA9IGRldjsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChydG5sX2xvY2tlZCkKLQkJcnRubF91bmxvY2soKTsKKwkJaWYgKGRldi0+bmV0ZGV2X29wcyAhPSAmZGV2aWNlX29wcykKKwkJCWNvbnRpbnVlOwkvKiBub3QgYSBuZXR2c2MgZGV2aWNlICovCiAKLQlyZXR1cm4gZm91bmQ7CisJCWlmIChldGhlcl9hZGRyX2VxdWFsKG1hYywgZGV2LT5wZXJtX2FkZHIpKQorCQkJcmV0dXJuIGRldjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpnZXRfbmV0dnNjX2J5cmVmKHN0cnVjdCBuZXRfZGV2aWNlICp2Zl9uZXRkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCUFTU0VSVF9SVE5MKCk7CisKKwlmb3JfZWFjaF9uZXRkZXYoJmluaXRfbmV0LCBkZXYpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2VfY29udGV4dCAqbmV0X2RldmljZV9jdHg7CisKKwkJaWYgKGRldi0+bmV0ZGV2X29wcyAhPSAmZGV2aWNlX29wcykKKwkJCWNvbnRpbnVlOwkvKiBub3QgYSBuZXR2c2MgZGV2aWNlICovCisKKwkJbmV0X2RldmljZV9jdHggPSBuZXRkZXZfcHJpdihkZXYpOworCQlpZiAobmV0X2RldmljZV9jdHgtPm52ZGV2ID09IE5VTEwpCisJCQljb250aW51ZTsJLyogZGV2aWNlIGlzIHJlbW92ZWQgKi8KKworCQlpZiAocnRubF9kZXJlZmVyZW5jZShuZXRfZGV2aWNlX2N0eC0+dmZfbmV0ZGV2KSA9PSB2Zl9uZXRkZXYpCisJCQlyZXR1cm4gZGV2OwkvKiBhIG1hdGNoICovCisJfQorCisJcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQgbmV0dnNjX3JlZ2lzdGVyX3ZmKHN0cnVjdCBuZXRfZGV2aWNlICp2Zl9uZXRkZXYpCkBAIC0xMTg3LDkgKzEyNDcsOCBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwogCXN0cnVjdCBuZXRfZGV2aWNlX2NvbnRleHQgKm5ldF9kZXZpY2VfY3R4OwogCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXR2c2NfZGV2OwotCWNvbnN0IHN0cnVjdCBldGh0b29sX29wcyAqZXRoX29wcyA9IHZmX25ldGRldi0+ZXRodG9vbF9vcHM7CiAKLQlpZiAoZXRoX29wcyA9PSBOVUxMIHx8IGV0aF9vcHMgPT0gJmV0aHRvb2xfb3BzKQorCWlmICh2Zl9uZXRkZXYtPmFkZHJfbGVuICE9IEVUSF9BTEVOKQogCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAKIAkvKgpAQCAtMTE5NywxMyArMTI1NiwxMyBAQAogCSAqIGFzc29jaWF0ZSB3aXRoIHRoZSBWRiBpbnRlcmZhY2UuIElmIHdlIGRvbid0IGZpbmQgYSBtYXRjaGluZwogCSAqIHN5bnRoZXRpYyBpbnRlcmZhY2UsIG1vdmUgb24uCiAJICovCi0JbmRldiA9IGdldF9uZXR2c2NfbmV0X2RldmljZSh2Zl9uZXRkZXYtPmRldl9hZGRyKTsKKwluZGV2ID0gZ2V0X25ldHZzY19ieW1hYyh2Zl9uZXRkZXYtPnBlcm1fYWRkcik7CiAJaWYgKCFuZGV2KQogCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAKIAluZXRfZGV2aWNlX2N0eCA9IG5ldGRldl9wcml2KG5kZXYpOwogCW5ldHZzY19kZXYgPSBuZXRfZGV2aWNlX2N0eC0+bnZkZXY7Ci0JaWYgKG5ldHZzY19kZXYgPT0gTlVMTCkKKwlpZiAoIW5ldHZzY19kZXYgfHwgcnRubF9kZXJlZmVyZW5jZShuZXRfZGV2aWNlX2N0eC0+dmZfbmV0ZGV2KSkKIAkJcmV0dXJuIE5PVElGWV9ET05FOwogCiAJbmV0ZGV2X2luZm8obmRldiwgIlZGIHJlZ2lzdGVyaW5nOiAlc1xuIiwgdmZfbmV0ZGV2LT5uYW1lKTsKQEAgLTEyMTEsMzMgKzEyNzAsMjYgQEAKIAkgKiBUYWtlIGEgcmVmZXJlbmNlIG9uIHRoZSBtb2R1bGUuCiAJICovCiAJdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOwotCW5ldHZzY19kZXYtPnZmX25ldGRldiA9IHZmX25ldGRldjsKKworCWRldl9ob2xkKHZmX25ldGRldik7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5ldF9kZXZpY2VfY3R4LT52Zl9uZXRkZXYsIHZmX25ldGRldik7CiAJcmV0dXJuIE5PVElGWV9PSzsKIH0KIAotCiBzdGF0aWMgaW50IG5ldHZzY192Zl91cChzdHJ1Y3QgbmV0X2RldmljZSAqdmZfbmV0ZGV2KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwogCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXR2c2NfZGV2OwotCWNvbnN0IHN0cnVjdCBldGh0b29sX29wcyAqZXRoX29wcyA9IHZmX25ldGRldi0+ZXRodG9vbF9vcHM7CiAJc3RydWN0IG5ldF9kZXZpY2VfY29udGV4dCAqbmV0X2RldmljZV9jdHg7CiAKLQlpZiAoZXRoX29wcyA9PSAmZXRodG9vbF9vcHMpCi0JCXJldHVybiBOT1RJRllfRE9ORTsKLQotCW5kZXYgPSBnZXRfbmV0dnNjX25ldF9kZXZpY2UodmZfbmV0ZGV2LT5kZXZfYWRkcik7CisJbmRldiA9IGdldF9uZXR2c2NfYnlyZWYodmZfbmV0ZGV2KTsKIAlpZiAoIW5kZXYpCiAJCXJldHVybiBOT1RJRllfRE9ORTsKIAogCW5ldF9kZXZpY2VfY3R4ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJbmV0dnNjX2RldiA9IG5ldF9kZXZpY2VfY3R4LT5udmRldjsKIAotCWlmICgobmV0dnNjX2RldiA9PSBOVUxMKSB8fCAobmV0dnNjX2Rldi0+dmZfbmV0ZGV2ID09IE5VTEwpKQotCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0KIAluZXRkZXZfaW5mbyhuZGV2LCAiVkYgdXA6ICVzXG4iLCB2Zl9uZXRkZXYtPm5hbWUpOwotCW5ldHZzY19kZXYtPnZmX2luamVjdCA9IHRydWU7CiAKIAkvKgogCSAqIE9wZW4gdGhlIGRldmljZSBiZWZvcmUgc3dpdGNoaW5nIGRhdGEgcGF0aC4KQEAgLTEyNTIsODYgKzEzMDQsNTQgQEAKIAogCW5ldGlmX2NhcnJpZXJfb2ZmKG5kZXYpOwogCi0JLyoKLQkgKiBOb3cgbm90aWZ5IHBlZXJzLiBXZSBhcmUgc2NoZWR1bGluZyB3b3JrIHRvCi0JICogbm90aWZ5IHBlZXJzOyB0YWtlIGEgcmVmZXJlbmNlIHRvIHByZXZlbnQKLQkgKiB0aGUgVkYgaW50ZXJmYWNlIGZyb20gdmFuaXNoaW5nLgotCSAqLwotCWF0b21pY19pbmMoJm5ldHZzY19kZXYtPnZmX3VzZV9jbnQpOwotCW5ldF9kZXZpY2VfY3R4LT5nd3JrLm5ldGRldiA9IHZmX25ldGRldjsKLQluZXRfZGV2aWNlX2N0eC0+Z3dyay5uZXR2c2NfZGV2ID0gbmV0dnNjX2RldjsKLQlzY2hlZHVsZV93b3JrKCZuZXRfZGV2aWNlX2N0eC0+Z3dyay5kd3JrKTsKKwkvKiBOb3cgbm90aWZ5IHBlZXJzIHRocm91Z2ggVkYgZGV2aWNlLiAqLworCWNhbGxfbmV0ZGV2aWNlX25vdGlmaWVycyhORVRERVZfTk9USUZZX1BFRVJTLCB2Zl9uZXRkZXYpOwogCiAJcmV0dXJuIE5PVElGWV9PSzsKIH0KIAotCiBzdGF0aWMgaW50IG5ldHZzY192Zl9kb3duKHN0cnVjdCBuZXRfZGV2aWNlICp2Zl9uZXRkZXYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CiAJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldHZzY19kZXY7CiAJc3RydWN0IG5ldF9kZXZpY2VfY29udGV4dCAqbmV0X2RldmljZV9jdHg7Ci0JY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzICpldGhfb3BzID0gdmZfbmV0ZGV2LT5ldGh0b29sX29wczsKIAotCWlmIChldGhfb3BzID09ICZldGh0b29sX29wcykKLQkJcmV0dXJuIE5PVElGWV9ET05FOwotCi0JbmRldiA9IGdldF9uZXR2c2NfbmV0X2RldmljZSh2Zl9uZXRkZXYtPmRldl9hZGRyKTsKKwluZGV2ID0gZ2V0X25ldHZzY19ieXJlZih2Zl9uZXRkZXYpOwogCWlmICghbmRldikKIAkJcmV0dXJuIE5PVElGWV9ET05FOwogCiAJbmV0X2RldmljZV9jdHggPSBuZXRkZXZfcHJpdihuZGV2KTsKIAluZXR2c2NfZGV2ID0gbmV0X2RldmljZV9jdHgtPm52ZGV2OwogCi0JaWYgKChuZXR2c2NfZGV2ID09IE5VTEwpIHx8IChuZXR2c2NfZGV2LT52Zl9uZXRkZXYgPT0gTlVMTCkpCi0JCXJldHVybiBOT1RJRllfRE9ORTsKLQogCW5ldGRldl9pbmZvKG5kZXYsICJWRiBkb3duOiAlc1xuIiwgdmZfbmV0ZGV2LT5uYW1lKTsKLQluZXR2c2NfZGV2LT52Zl9pbmplY3QgPSBmYWxzZTsKLQkvKgotCSAqIFdhaXQgZm9yIGN1cnJlbnRseSBhY3RpdmUgdXNlcnMgdG8KLQkgKiBkcmFpbiBvdXQuCi0JICovCi0KLQl3aGlsZSAoYXRvbWljX3JlYWQoJm5ldHZzY19kZXYtPnZmX3VzZV9jbnQpICE9IDApCi0JCXVkZWxheSg1MCk7CiAJbmV0dnNjX3N3aXRjaF9kYXRhcGF0aChuZGV2LCBmYWxzZSk7CiAJbmV0ZGV2X2luZm8obmRldiwgIkRhdGEgcGF0aCBzd2l0Y2hlZCBmcm9tIFZGOiAlc1xuIiwgdmZfbmV0ZGV2LT5uYW1lKTsKIAlybmRpc19maWx0ZXJfY2xvc2UobmV0dnNjX2Rldik7CiAJbmV0aWZfY2Fycmllcl9vbihuZGV2KTsKLQkvKgotCSAqIE5vdGlmeSBwZWVycy4KLQkgKi8KLQlhdG9taWNfaW5jKCZuZXR2c2NfZGV2LT52Zl91c2VfY250KTsKLQluZXRfZGV2aWNlX2N0eC0+Z3dyay5uZXRkZXYgPSBuZGV2OwotCW5ldF9kZXZpY2VfY3R4LT5nd3JrLm5ldHZzY19kZXYgPSBuZXR2c2NfZGV2OwotCXNjaGVkdWxlX3dvcmsoJm5ldF9kZXZpY2VfY3R4LT5nd3JrLmR3cmspOworCisJLyogTm93IG5vdGlmeSBwZWVycyB0aHJvdWdoIG5ldHZzYyBkZXZpY2UuICovCisJY2FsbF9uZXRkZXZpY2Vfbm90aWZpZXJzKE5FVERFVl9OT1RJRllfUEVFUlMsIG5kZXYpOwogCiAJcmV0dXJuIE5PVElGWV9PSzsKIH0KIAotCiBzdGF0aWMgaW50IG5ldHZzY191bnJlZ2lzdGVyX3ZmKHN0cnVjdCBuZXRfZGV2aWNlICp2Zl9uZXRkZXYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CiAJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldHZzY19kZXY7Ci0JY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzICpldGhfb3BzID0gdmZfbmV0ZGV2LT5ldGh0b29sX29wczsKIAlzdHJ1Y3QgbmV0X2RldmljZV9jb250ZXh0ICpuZXRfZGV2aWNlX2N0eDsKIAotCWlmIChldGhfb3BzID09ICZldGh0b29sX29wcykKLQkJcmV0dXJuIE5PVElGWV9ET05FOwotCi0JbmRldiA9IGdldF9uZXR2c2NfbmV0X2RldmljZSh2Zl9uZXRkZXYtPmRldl9hZGRyKTsKKwluZGV2ID0gZ2V0X25ldHZzY19ieXJlZih2Zl9uZXRkZXYpOwogCWlmICghbmRldikKIAkJcmV0dXJuIE5PVElGWV9ET05FOwogCiAJbmV0X2RldmljZV9jdHggPSBuZXRkZXZfcHJpdihuZGV2KTsKIAluZXR2c2NfZGV2ID0gbmV0X2RldmljZV9jdHgtPm52ZGV2OwotCWlmIChuZXR2c2NfZGV2ID09IE5VTEwpCi0JCXJldHVybiBOT1RJRllfRE9ORTsKKwogCW5ldGRldl9pbmZvKG5kZXYsICJWRiB1bnJlZ2lzdGVyaW5nOiAlc1xuIiwgdmZfbmV0ZGV2LT5uYW1lKTsKIAotCW5ldHZzY19kZXYtPnZmX25ldGRldiA9IE5VTEw7CisJUkNVX0lOSVRfUE9JTlRFUihuZXRfZGV2aWNlX2N0eC0+dmZfbmV0ZGV2LCBOVUxMKTsKKwlkZXZfcHV0KHZmX25ldGRldik7CiAJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CiAJcmV0dXJuIE5PVElGWV9PSzsKIH0KQEAgLTEzNTIsNiArMTM3Miw4IEBACiAKIAluZXRpZl9jYXJyaWVyX29mZihuZXQpOwogCisJbmV0dnNjX2luaXRfc2V0dGluZ3MobmV0KTsKKwogCW5ldF9kZXZpY2VfY3R4ID0gbmV0ZGV2X3ByaXYobmV0KTsKIAluZXRfZGV2aWNlX2N0eC0+ZGV2aWNlX2N0eCA9IGRldjsKIAluZXRfZGV2aWNlX2N0eC0+bXNnX2VuYWJsZSA9IG5ldGlmX21zZ19pbml0KGRlYnVnLCBkZWZhdWx0X21zZyk7CkBAIC0xMzc3LDcgKzEzOTksNiBAQAogCiAJSU5JVF9ERUxBWUVEX1dPUksoJm5ldF9kZXZpY2VfY3R4LT5kd29yaywgbmV0dnNjX2xpbmtfY2hhbmdlKTsKIAlJTklUX1dPUksoJm5ldF9kZXZpY2VfY3R4LT53b3JrLCBkb19zZXRfbXVsdGljYXN0KTsKLQlJTklUX1dPUksoJm5ldF9kZXZpY2VfY3R4LT5nd3JrLmR3cmssIG5ldHZzY19ub3RpZnlfcGVlcnMpOwogCiAJc3Bpbl9sb2NrX2luaXQoJm5ldF9kZXZpY2VfY3R4LT5sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmbmV0X2RldmljZV9jdHgtPnJlY29uZmlnX2V2ZW50cyk7CkBAIC0xNDEwLDggKzE0MzEsNiBAQAogCW5ldGlmX3NldF9yZWFsX251bV90eF9xdWV1ZXMobmV0LCBudmRldi0+bnVtX2Nobik7CiAJbmV0aWZfc2V0X3JlYWxfbnVtX3J4X3F1ZXVlcyhuZXQsIG52ZGV2LT5udW1fY2huKTsKIAotCW5ldHZzY19pbml0X3NldHRpbmdzKG5ldCk7Ci0KIAlyZXQgPSByZWdpc3Rlcl9uZXRkZXYobmV0KTsKIAlpZiAocmV0ICE9IDApIHsKIAkJcHJfZXJyKCJVbmFibGUgdG8gcmVnaXN0ZXIgbmV0ZGV2LlxuIik7CkBAIC0xNDM1LDcgKzE0NTQsNiBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQogCW5kZXZfY3R4ID0gbmV0ZGV2X3ByaXYobmV0KTsKIAluZXRfZGV2aWNlID0gbmRldl9jdHgtPm52ZGV2OwogCkBAIC0xNDgyLDcgKzE1MDAsNiBAQAogCS5yZW1vdmUgPSBuZXR2c2NfcmVtb3ZlLAogfTsKIAotCiAvKgogICogT24gSHlwZXItViwgZXZlcnkgVkYgaW50ZXJmYWNlIGlzIG1hdGNoZWQgd2l0aCBhIGNvcnJlc3BvbmRpbmcKICAqIHN5bnRoZXRpYyBpbnRlcmZhY2UuIFRoZSBzeW50aGV0aWMgaW50ZXJmYWNlIGlzIHByZXNlbnRlZCBmaXJzdApAQCAtMTQ5NCw4ICsxNTExLDIxIEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmV2ZW50X2RldiA9IG5ldGRldl9ub3RpZmllcl9pbmZvX3RvX2RldihwdHIpOwogCi0JLyogQXZvaWQgVmxhbiwgQm9uZGluZyBkZXYgd2l0aCBzYW1lIE1BQyByZWdpc3RlcmluZyBhcyBWRiAqLwotCWlmIChldmVudF9kZXYtPnByaXZfZmxhZ3MgJiAoSUZGXzgwMl8xUV9WTEFOIHwgSUZGX0JPTkRJTkcpKQorCS8qIFNraXAgb3VyIG93biBldmVudHMgKi8KKwlpZiAoZXZlbnRfZGV2LT5uZXRkZXZfb3BzID09ICZkZXZpY2Vfb3BzKQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisKKwkvKiBBdm9pZCBub24tRXRoZXJuZXQgdHlwZSBkZXZpY2VzICovCisJaWYgKGV2ZW50X2Rldi0+dHlwZSAhPSBBUlBIUkRfRVRIRVIpCisJCXJldHVybiBOT1RJRllfRE9ORTsKKworCS8qIEF2b2lkIFZsYW4gZGV2IHdpdGggc2FtZSBNQUMgcmVnaXN0ZXJpbmcgYXMgVkYgKi8KKwlpZiAoZXZlbnRfZGV2LT5wcml2X2ZsYWdzICYgSUZGXzgwMl8xUV9WTEFOKQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisKKwkvKiBBdm9pZCBCb25kaW5nIG1hc3RlciBkZXYgd2l0aCBzYW1lIE1BQyByZWdpc3RlcmluZyBhcyBWRiAqLworCWlmICgoZXZlbnRfZGV2LT5wcml2X2ZsYWdzICYgSUZGX0JPTkRJTkcpICYmCisJICAgIChldmVudF9kZXYtPmZsYWdzICYgSUZGX01BU1RFUikpCiAJCXJldHVybiBOT1RJRllfRE9ORTsKIAogCXN3aXRjaCAoZXZlbnQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2h5cGVydi9ybmRpc19maWx0ZXIuYyBiL2RyaXZlcnMvbmV0L2h5cGVydi9ybmRpc19maWx0ZXIuYwppbmRleCA4ZTgzMGY3Li45MTk1ZDVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oeXBlcnYvcm5kaXNfZmlsdGVyLmMKKysrIGIvZHJpdmVycy9uZXQvaHlwZXJ2L3JuZGlzX2ZpbHRlci5jCkBAIC02NjMsMTMgKzY2MywxNCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXU4IG5ldHZzY19oYXNoX2tleVtIQVNIX0tFWUxFTl0gPSB7CitzdGF0aWMgY29uc3QgdTggbmV0dnNjX2hhc2hfa2V5W10gPSB7CiAJMHg2ZCwgMHg1YSwgMHg1NiwgMHhkYSwgMHgyNSwgMHg1YiwgMHgwZSwgMHhjMiwKIAkweDQxLCAweDY3LCAweDI1LCAweDNkLCAweDQzLCAweGEzLCAweDhmLCAweGIwLAogCTB4ZDAsIDB4Y2EsIDB4MmIsIDB4Y2IsIDB4YWUsIDB4N2IsIDB4MzAsIDB4YjQsCiAJMHg3NywgMHhjYiwgMHgyZCwgMHhhMywgMHg4MCwgMHgzMCwgMHhmMiwgMHgwYywKIAkweDZhLCAweDQyLCAweGI3LCAweDNiLCAweGJlLCAweGFjLCAweDAxLCAweGZhCiB9OworI2RlZmluZSBIQVNIX0tFWUxFTiBBUlJBWV9TSVpFKG5ldHZzY19oYXNoX2tleSkKIAogc3RhdGljIGludCBybmRpc19maWx0ZXJfc2V0X3Jzc19wYXJhbShzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpyZGV2LCBpbnQgbnVtX3F1ZXVlKQogewpAQCAtNzIwLDcgKzcyMSw2IEBACiAJZm9yIChpID0gMDsgaSA8IEhBU0hfS0VZTEVOOyBpKyspCiAJCWtleXBbaV0gPSBuZXR2c2NfaGFzaF9rZXlbaV07CiAKLQogCXJldCA9IHJuZGlzX2ZpbHRlcl9zZW5kX3JlcXVlc3QocmRldiwgcmVxdWVzdCk7CiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIGNsZWFudXA7CkBAIC03MzgsNyArNzM4LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0KIHN0YXRpYyBpbnQgcm5kaXNfZmlsdGVyX3F1ZXJ5X2RldmljZV9saW5rX3N0YXR1cyhzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpkZXYpCiB7CiAJdTMyIHNpemUgPSBzaXplb2YodTMyKTsKQEAgLTc1Miw2ICs3NTEsMjggQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IHJuZGlzX2ZpbHRlcl9xdWVyeV9saW5rX3NwZWVkKHN0cnVjdCBybmRpc19kZXZpY2UgKmRldikKK3sKKwl1MzIgc2l6ZSA9IHNpemVvZih1MzIpOworCXUzMiBsaW5rX3NwZWVkOworCXN0cnVjdCBuZXRfZGV2aWNlX2NvbnRleHQgKm5kYzsKKwlpbnQgcmV0OworCisJcmV0ID0gcm5kaXNfZmlsdGVyX3F1ZXJ5X2RldmljZShkZXYsIFJORElTX09JRF9HRU5fTElOS19TUEVFRCwKKwkJCQkJJmxpbmtfc3BlZWQsICZzaXplKTsKKworCWlmICghcmV0KSB7CisJCW5kYyA9IG5ldGRldl9wcml2KGRldi0+bmRldik7CisKKwkJLyogVGhlIGxpbmsgc3BlZWQgcmVwb3J0ZWQgZnJvbSBob3N0IGlzIGluIDEwMGJwcyB1bml0LCBzbworCQkgKiB3ZSBjb252ZXJ0IGl0IHRvIE1icHMgaGVyZS4KKwkJICovCisJCW5kYy0+c3BlZWQgPSBsaW5rX3NwZWVkIC8gMTAwMDA7CisJfQorCisJcmV0dXJuIHJldDsKK30KKwogaW50IHJuZGlzX2ZpbHRlcl9zZXRfcGFja2V0X2ZpbHRlcihzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpkZXYsIHUzMiBuZXdfZmlsdGVyKQogewogCXN0cnVjdCBybmRpc19yZXF1ZXN0ICpyZXF1ZXN0OwpAQCAtNzkyLDcgKzgxMyw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotCiBzdGF0aWMgaW50IHJuZGlzX2ZpbHRlcl9pbml0X2RldmljZShzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHJuZGlzX3JlcXVlc3QgKnJlcXVlc3Q7CkBAIC04NzUsMTEgKzg5NSwxMSBAQAogCiAJLyogV2FpdCBmb3IgYWxsIHNlbmQgY29tcGxldGlvbnMgKi8KIAl3YWl0X2V2ZW50KG52ZGV2LT53YWl0X2RyYWluLAotCQlhdG9taWNfcmVhZCgmbnZkZXYtPm51bV9vdXRzdGFuZGluZ19zZW5kcykgPT0gMCk7CisJCSAgIGF0b21pY19yZWFkKCZudmRldi0+bnVtX291dHN0YW5kaW5nX3NlbmRzKSA9PSAwICYmCisJCSAgIGF0b21pY19yZWFkKCZudmRldi0+bnVtX291dHN0YW5kaW5nX3JlY3ZzKSA9PSAwKTsKIAogCWlmIChyZXF1ZXN0KQogCQlwdXRfcm5kaXNfcmVxdWVzdChkZXYsIHJlcXVlc3QpOwotCXJldHVybjsKIH0KIAogc3RhdGljIGludCBybmRpc19maWx0ZXJfb3Blbl9kZXZpY2Uoc3RydWN0IHJuZGlzX2RldmljZSAqZGV2KQpAQCAtOTMxLDYgKzk1MSw5IEBACiAJc2V0X3Blcl9jaGFubmVsX3N0YXRlKG5ld19zYywgbnZzY2Rldi0+c3ViX2NiX2J1ZiArIChjaG5faW5kZXggLSAxKSAqCiAJCQkgICAgICBORVRWU0NfUEFDS0VUX1NJWkUpOwogCisJbnZzY2Rldi0+bXJjW2Nobl9pbmRleF0uYnVmID0gdnphbGxvYyhORVRWU0NfUkVDVlNMT1RfTUFYICoKKwkJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCByZWN2X2NvbXBfZGF0YSkpOworCiAJcmV0ID0gdm1idXNfb3BlbihuZXdfc2MsIG52c2NkZXYtPnJpbmdfc2l6ZSAqIFBBR0VfU0laRSwKIAkJCSBudnNjZGV2LT5yaW5nX3NpemUgKiBQQUdFX1NJWkUsIE5VTEwsIDAsCiAJCQkgbmV0dnNjX2NoYW5uZWxfY2IsIG5ld19zYyk7CkBAIC05NDYsNyArOTY5LDcgQEAKIH0KIAogaW50IHJuZGlzX2ZpbHRlcl9kZXZpY2VfYWRkKHN0cnVjdCBodl9kZXZpY2UgKmRldiwKLQkJCQkgIHZvaWQgKmFkZGl0aW9uYWxfaW5mbykKKwkJCSAgICB2b2lkICphZGRpdGlvbmFsX2luZm8pCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ID0gaHZfZ2V0X2RydmRhdGEoZGV2KTsKQEAgLTEwMjgsNyArMTA1MSw2IEBACiAJb2ZmbG9hZHMudWRwX2lwX3Y2X2NzdW0gPSBORElTX09GRkxPQURfUEFSQU1FVEVSU19UWF9SWF9FTkFCTEVEOwogCW9mZmxvYWRzLmxzb192Ml9pcHY0ID0gTkRJU19PRkZMT0FEX1BBUkFNRVRFUlNfTFNPVjJfRU5BQkxFRDsKIAotCiAJcmV0ID0gcm5kaXNfZmlsdGVyX3NldF9vZmZsb2FkX3BhcmFtcyhuZXQsICZvZmZsb2Fkcyk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJfZGV2X3JlbXY7CkBAIC0xMDQ0LDYgKzEwNjYsOCBAQAogCWlmIChuZXRfZGV2aWNlLT5udnNwX3ZlcnNpb24gPCBOVlNQX1BST1RPQ09MX1ZFUlNJT05fNSkKIAkJcmV0dXJuIDA7CiAKKwlybmRpc19maWx0ZXJfcXVlcnlfbGlua19zcGVlZChybmRpc19kZXZpY2UpOworCiAJLyogdlJTUyBzZXR1cCAqLwogCW1lbXNldCgmcnNzY2FwLCAwLCByc3NjYXBfc2l6ZSk7CiAJcmV0ID0gcm5kaXNfZmlsdGVyX3F1ZXJ5X2RldmljZShybmRpc19kZXZpY2UsCkBAIC0xMTUyLDcgKzExNzYsNiBAQAogCW5ldHZzY19kZXZpY2VfcmVtb3ZlKGRldik7CiB9CiAKLQogaW50IHJuZGlzX2ZpbHRlcl9vcGVuKHN0cnVjdCBuZXR2c2NfZGV2aWNlICpudmRldikKIHsKIAlpZiAoIW52ZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWVlZTgwMjE1NC9mYWtlbGIuYyBiL2RyaXZlcnMvbmV0L2llZWU4MDIxNTQvZmFrZWxiLmMKaW5kZXggMGJlY2YwYS4uZWMzODdlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWVlZTgwMjE1NC9mYWtlbGIuYworKysgYi9kcml2ZXJzL25ldC9pZWVlODAyMTU0L2Zha2VsYi5jCkBAIC0zMCw3ICszMCw3IEBACiBzdGF0aWMgaW50IG51bWxicyA9IDI7CiAKIHN0YXRpYyBMSVNUX0hFQUQoZmFrZWxiX3BoeXMpOwotc3RhdGljIERFRklORV9TUElOTE9DSyhmYWtlbGJfcGh5c19sb2NrKTsKK3N0YXRpYyBERUZJTkVfTVVURVgoZmFrZWxiX3BoeXNfbG9jayk7CiAKIHN0YXRpYyBMSVNUX0hFQUQoZmFrZWxiX2lmdXBfcGh5cyk7CiBzdGF0aWMgREVGSU5FX1JXTE9DSyhmYWtlbGJfaWZ1cF9waHlzX2xvY2spOwpAQCAtMTg4LDkgKzE4OCw5IEBACiAJaWYgKGVycikKIAkJZ290byBlcnJfcmVnOwogCi0Jc3Bpbl9sb2NrKCZmYWtlbGJfcGh5c19sb2NrKTsKKwltdXRleF9sb2NrKCZmYWtlbGJfcGh5c19sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZwaHktPmxpc3QsICZmYWtlbGJfcGh5cyk7Ci0Jc3Bpbl91bmxvY2soJmZha2VsYl9waHlzX2xvY2spOworCW11dGV4X3VubG9jaygmZmFrZWxiX3BoeXNfbG9jayk7CiAKIAlyZXR1cm4gMDsKIApAQCAtMjIyLDEwICsyMjIsMTAgQEAKIAlyZXR1cm4gMDsKIAogZXJyX3NsYXZlOgotCXNwaW5fbG9jaygmZmFrZWxiX3BoeXNfbG9jayk7CisJbXV0ZXhfbG9jaygmZmFrZWxiX3BoeXNfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBoeSwgdG1wLCAmZmFrZWxiX3BoeXMsIGxpc3QpCiAJCWZha2VsYl9kZWwocGh5KTsKLQlzcGluX3VubG9jaygmZmFrZWxiX3BoeXNfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZmYWtlbGJfcGh5c19sb2NrKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yMzMsMTAgKzIzMywxMCBAQAogewogCXN0cnVjdCBmYWtlbGJfcGh5ICpwaHksICp0bXA7CiAKLQlzcGluX2xvY2soJmZha2VsYl9waHlzX2xvY2spOworCW11dGV4X2xvY2soJmZha2VsYl9waHlzX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwaHksIHRtcCwgJmZha2VsYl9waHlzLCBsaXN0KQogCQlmYWtlbGJfZGVsKHBoeSk7Ci0Jc3Bpbl91bmxvY2soJmZha2VsYl9waHlzX2xvY2spOworCW11dGV4X3VubG9jaygmZmFrZWxiX3BoeXNfbG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lwdmxhbi9pcHZsYW4uaCBiL2RyaXZlcnMvbmV0L2lwdmxhbi9pcHZsYW4uaAppbmRleCA2OTVhNWRjLi43ZTA3MzJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcHZsYW4vaXB2bGFuLmgKKysrIGIvZHJpdmVycy9uZXQvaXB2bGFuL2lwdmxhbi5oCkBAIC0yMywxMSArMjMsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bmV0L2lwNl9yb3V0ZS5oPgogI2luY2x1ZGUgPG5ldC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KICNpbmNsdWRlIDxuZXQvYWRkcmNvbmYuaD4KKyNpbmNsdWRlIDxuZXQvbDNtZGV2Lmg+CiAKICNkZWZpbmUgSVBWTEFOX0RSVgkiaXB2bGFuIgogI2RlZmluZSBJUFZfRFJWX1ZFUgkiMC4xIgpAQCAtMTI0LDQgKzEyNiw4IEBACiAJCQkJICAgY29uc3Qgdm9pZCAqaWFkZHIsIGJvb2wgaXNfdjYpOwogYm9vbCBpcHZsYW5fYWRkcl9idXN5KHN0cnVjdCBpcHZsX3BvcnQgKnBvcnQsIHZvaWQgKmlhZGRyLCBib29sIGlzX3Y2KTsKIHZvaWQgaXB2bGFuX2h0X2FkZHJfZGVsKHN0cnVjdCBpcHZsX2FkZHIgKmFkZHIpOworc3RydWN0IHNrX2J1ZmYgKmlwdmxhbl9sM19yY3Yoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgIHUxNiBwcm90byk7Cit1bnNpZ25lZCBpbnQgaXB2bGFuX25mX2lucHV0KHZvaWQgKnByaXYsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSk7CiAjZW5kaWYgLyogX19JUFZMQU5fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXB2bGFuL2lwdmxhbl9jb3JlLmMgYi9kcml2ZXJzL25ldC9pcHZsYW4vaXB2bGFuX2NvcmUuYwppbmRleCBiNWY5NTExLi5iNGU5OTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcHZsYW4vaXB2bGFuX2NvcmUuYworKysgYi9kcml2ZXJzL25ldC9pcHZsYW4vaXB2bGFuX2NvcmUuYwpAQCAtNTYwLDYgKzU2MCw3IEBACiAJY2FzZSBJUFZMQU5fTU9ERV9MMjoKIAkJcmV0dXJuIGlwdmxhbl94bWl0X21vZGVfbDIoc2tiLCBkZXYpOwogCWNhc2UgSVBWTEFOX01PREVfTDM6CisJY2FzZSBJUFZMQU5fTU9ERV9MM1M6CiAJCXJldHVybiBpcHZsYW5feG1pdF9tb2RlX2wzKHNrYiwgZGV2KTsKIAl9CiAKQEAgLTY2NCw2ICs2NjUsOCBAQAogCQlyZXR1cm4gaXB2bGFuX2hhbmRsZV9tb2RlX2wyKHBza2IsIHBvcnQpOwogCWNhc2UgSVBWTEFOX01PREVfTDM6CiAJCXJldHVybiBpcHZsYW5faGFuZGxlX21vZGVfbDMocHNrYiwgcG9ydCk7CisJY2FzZSBJUFZMQU5fTU9ERV9MM1M6CisJCXJldHVybiBSWF9IQU5ETEVSX1BBU1M7CiAJfQogCiAJLyogU2hvdWxkIG5vdCByZWFjaCBoZXJlICovCkBAIC02NzIsMyArNjc1LDk0IEBACiAJa2ZyZWVfc2tiKHNrYik7CiAJcmV0dXJuIFJYX0hBTkRMRVJfQ09OU1VNRUQ7CiB9CisKK3N0YXRpYyBzdHJ1Y3QgaXB2bF9hZGRyICppcHZsYW5fc2tiX3RvX2FkZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlwdmxfYWRkciAqYWRkciA9IE5VTEw7CisJc3RydWN0IGlwdmxfcG9ydCAqcG9ydDsKKwl2b2lkICpseXIzaDsKKwlpbnQgYWRkcl90eXBlOworCisJaWYgKCFkZXYgfHwgIW5ldGlmX2lzX2lwdmxhbl9wb3J0KGRldikpCisJCWdvdG8gb3V0OworCisJcG9ydCA9IGlwdmxhbl9wb3J0X2dldF9yY3UoZGV2KTsKKwlpZiAoIXBvcnQgfHwgcG9ydC0+bW9kZSAhPSBJUFZMQU5fTU9ERV9MM1MpCisJCWdvdG8gb3V0OworCisJbHlyM2ggPSBpcHZsYW5fZ2V0X0wzX2hkcihza2IsICZhZGRyX3R5cGUpOworCWlmICghbHlyM2gpCisJCWdvdG8gb3V0OworCisJYWRkciA9IGlwdmxhbl9hZGRyX2xvb2t1cChwb3J0LCBseXIzaCwgYWRkcl90eXBlLCB0cnVlKTsKK291dDoKKwlyZXR1cm4gYWRkcjsKK30KKworc3RydWN0IHNrX2J1ZmYgKmlwdmxhbl9sM19yY3Yoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgIHUxNiBwcm90bykKK3sKKwlzdHJ1Y3QgaXB2bF9hZGRyICphZGRyOworCXN0cnVjdCBuZXRfZGV2aWNlICpzZGV2OworCisJYWRkciA9IGlwdmxhbl9za2JfdG9fYWRkcihza2IsIGRldik7CisJaWYgKCFhZGRyKQorCQlnb3RvIG91dDsKKworCXNkZXYgPSBhZGRyLT5tYXN0ZXItPmRldjsKKwlzd2l0Y2ggKHByb3RvKSB7CisJY2FzZSBBRl9JTkVUOgorCXsKKwkJaW50IGVycjsKKwkJc3RydWN0IGlwaGRyICppcDRoID0gaXBfaGRyKHNrYik7CisKKwkJZXJyID0gaXBfcm91dGVfaW5wdXRfbm9yZWYoc2tiLCBpcDRoLT5kYWRkciwgaXA0aC0+c2FkZHIsCisJCQkJCSAgIGlwNGgtPnRvcywgc2Rldik7CisJCWlmICh1bmxpa2VseShlcnIpKQorCQkJZ290byBvdXQ7CisJCWJyZWFrOworCX0KKwljYXNlIEFGX0lORVQ2OgorCXsKKwkJc3RydWN0IGRzdF9lbnRyeSAqZHN0OworCQlzdHJ1Y3QgaXB2NmhkciAqaXA2aCA9IGlwdjZfaGRyKHNrYik7CisJCWludCBmbGFncyA9IFJUNl9MT09LVVBfRl9IQVNfU0FERFI7CisJCXN0cnVjdCBmbG93aTYgZmw2ID0geworCQkJLmZsb3dpNl9paWYgICA9IHNkZXYtPmlmaW5kZXgsCisJCQkuZGFkZHIgICAgICAgID0gaXA2aC0+ZGFkZHIsCisJCQkuc2FkZHIgICAgICAgID0gaXA2aC0+c2FkZHIsCisJCQkuZmxvd2xhYmVsICAgID0gaXA2X2Zsb3dpbmZvKGlwNmgpLAorCQkJLmZsb3dpNl9tYXJrICA9IHNrYi0+bWFyaywKKwkJCS5mbG93aTZfcHJvdG8gPSBpcDZoLT5uZXh0aGRyLAorCQl9OworCisJCXNrYl9kc3RfZHJvcChza2IpOworCQlkc3QgPSBpcDZfcm91dGVfaW5wdXRfbG9va3VwKGRldl9uZXQoc2RldiksIHNkZXYsICZmbDYsIGZsYWdzKTsKKwkJc2tiX2RzdF9zZXQoc2tiLCBkc3QpOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCitvdXQ6CisJcmV0dXJuIHNrYjsKK30KKwordW5zaWduZWQgaW50IGlwdmxhbl9uZl9pbnB1dCh2b2lkICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGlwdmxfYWRkciAqYWRkcjsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJYWRkciA9IGlwdmxhbl9za2JfdG9fYWRkcihza2IsIHNrYi0+ZGV2KTsKKwlpZiAoIWFkZHIpCisJCWdvdG8gb3V0OworCisJc2tiLT5kZXYgPSBhZGRyLT5tYXN0ZXItPmRldjsKKwlsZW4gPSBza2ItPmxlbiArIEVUSF9ITEVOOworCWlwdmxhbl9jb3VudF9yeChhZGRyLT5tYXN0ZXIsIGxlbiwgdHJ1ZSwgZmFsc2UpOworb3V0OgorCXJldHVybiBORl9BQ0NFUFQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcHZsYW4vaXB2bGFuX21haW4uYyBiL2RyaXZlcnMvbmV0L2lwdmxhbi9pcHZsYW5fbWFpbi5jCmluZGV4IDE4YjRlOGMuLmY0NDJlYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lwdmxhbi9pcHZsYW5fbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2lwdmxhbi9pcHZsYW5fbWFpbi5jCkBAIC05LDI0ICs5LDg3IEBACiAKICNpbmNsdWRlICJpcHZsYW4uaCIKIAorc3RhdGljIHUzMiBpcHZsX25mX2hvb2tfcmVmY250ID0gMDsKKworc3RhdGljIHN0cnVjdCBuZl9ob29rX29wcyBpcHZsX25mb3BzW10gX19yZWFkX21vc3RseSA9IHsKKwl7CisJCS5ob29rICAgICA9IGlwdmxhbl9uZl9pbnB1dCwKKwkJLnBmICAgICAgID0gTkZQUk9UT19JUFY0LAorCQkuaG9va251bSAgPSBORl9JTkVUX0xPQ0FMX0lOLAorCQkucHJpb3JpdHkgPSBJTlRfTUFYLAorCX0sCisJeworCQkuaG9vayAgICAgPSBpcHZsYW5fbmZfaW5wdXQsCisJCS5wZiAgICAgICA9IE5GUFJPVE9fSVBWNiwKKwkJLmhvb2tudW0gID0gTkZfSU5FVF9MT0NBTF9JTiwKKwkJLnByaW9yaXR5ID0gSU5UX01BWCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBsM21kZXZfb3BzIGlwdmxfbDNtZGV2X29wcyBfX3JlYWRfbW9zdGx5ID0geworCS5sM21kZXZfbDNfcmN2ID0gaXB2bGFuX2wzX3JjdiwKK307CisKIHN0YXRpYyB2b2lkIGlwdmxhbl9hZGp1c3RfbXR1KHN0cnVjdCBpcHZsX2RldiAqaXB2bGFuLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWlwdmxhbi0+ZGV2LT5tdHUgPSBkZXYtPm10dSAtIGlwdmxhbi0+bXR1X2FkajsKIH0KIAotc3RhdGljIHZvaWQgaXB2bGFuX3NldF9wb3J0X21vZGUoc3RydWN0IGlwdmxfcG9ydCAqcG9ydCwgdTE2IG52YWwpCitzdGF0aWMgaW50IGlwdmxhbl9yZWdpc3Rlcl9uZl9ob29rKHZvaWQpCit7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIWlwdmxfbmZfaG9va19yZWZjbnQpIHsKKwkJZXJyID0gX25mX3JlZ2lzdGVyX2hvb2tzKGlwdmxfbmZvcHMsIEFSUkFZX1NJWkUoaXB2bF9uZm9wcykpOworCQlpZiAoIWVycikKKwkJCWlwdmxfbmZfaG9va19yZWZjbnQgPSAxOworCX0gZWxzZSB7CisJCWlwdmxfbmZfaG9va19yZWZjbnQrKzsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBpcHZsYW5fdW5yZWdpc3Rlcl9uZl9ob29rKHZvaWQpCit7CisJV0FSTl9PTighaXB2bF9uZl9ob29rX3JlZmNudCk7CisKKwlpcHZsX25mX2hvb2tfcmVmY250LS07CisJaWYgKCFpcHZsX25mX2hvb2tfcmVmY250KQorCQlfbmZfdW5yZWdpc3Rlcl9ob29rcyhpcHZsX25mb3BzLCBBUlJBWV9TSVpFKGlwdmxfbmZvcHMpKTsKK30KKworc3RhdGljIGludCBpcHZsYW5fc2V0X3BvcnRfbW9kZShzdHJ1Y3QgaXB2bF9wb3J0ICpwb3J0LCB1MTYgbnZhbCkKIHsKIAlzdHJ1Y3QgaXB2bF9kZXYgKmlwdmxhbjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbWRldiA9IHBvcnQtPmRldjsKKwlpbnQgZXJyID0gMDsKIAorCUFTU0VSVF9SVE5MKCk7CiAJaWYgKHBvcnQtPm1vZGUgIT0gbnZhbCkgeworCQlpZiAobnZhbCA9PSBJUFZMQU5fTU9ERV9MM1MpIHsKKwkJCS8qIE5ldyBtb2RlIGlzIEwzUyAqLworCQkJZXJyID0gaXB2bGFuX3JlZ2lzdGVyX25mX2hvb2soKTsKKwkJCWlmICghZXJyKSB7CisJCQkJbWRldi0+bDNtZGV2X29wcyA9ICZpcHZsX2wzbWRldl9vcHM7CisJCQkJbWRldi0+cHJpdl9mbGFncyB8PSBJRkZfTDNNREVWX01BU1RFUjsKKwkJCX0gZWxzZQorCQkJCXJldHVybiBlcnI7CisJCX0gZWxzZSBpZiAocG9ydC0+bW9kZSA9PSBJUFZMQU5fTU9ERV9MM1MpIHsKKwkJCS8qIE9sZCBtb2RlIHdhcyBMM1MgKi8KKwkJCW1kZXYtPnByaXZfZmxhZ3MgJj0gfklGRl9MM01ERVZfTUFTVEVSOworCQkJaXB2bGFuX3VucmVnaXN0ZXJfbmZfaG9vaygpOworCQkJbWRldi0+bDNtZGV2X29wcyA9IE5VTEw7CisJCX0KIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShpcHZsYW4sICZwb3J0LT5pcHZsYW5zLCBwbm9kZSkgewotCQkJaWYgKG52YWwgPT0gSVBWTEFOX01PREVfTDMpCisJCQlpZiAobnZhbCA9PSBJUFZMQU5fTU9ERV9MMyB8fCBudmFsID09IElQVkxBTl9NT0RFX0wzUykKIAkJCQlpcHZsYW4tPmRldi0+ZmxhZ3MgfD0gSUZGX05PQVJQOwogCQkJZWxzZQogCQkJCWlwdmxhbi0+ZGV2LT5mbGFncyAmPSB+SUZGX05PQVJQOwogCQl9CiAJCXBvcnQtPm1vZGUgPSBudmFsOwogCX0KKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IGlwdmxhbl9wb3J0X2NyZWF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtNzQsNiArMTM3LDExIEBACiAJc3RydWN0IGlwdmxfcG9ydCAqcG9ydCA9IGlwdmxhbl9wb3J0X2dldF9ydG5sKGRldik7CiAKIAlkZXYtPnByaXZfZmxhZ3MgJj0gfklGRl9JUFZMQU5fTUFTVEVSOworCWlmIChwb3J0LT5tb2RlID09IElQVkxBTl9NT0RFX0wzUykgeworCQlkZXYtPnByaXZfZmxhZ3MgJj0gfklGRl9MM01ERVZfTUFTVEVSOworCQlpcHZsYW5fdW5yZWdpc3Rlcl9uZl9ob29rKCk7CisJCWRldi0+bDNtZGV2X29wcyA9IE5VTEw7CisJfQogCW5ldGRldl9yeF9oYW5kbGVyX3VucmVnaXN0ZXIoZGV2KTsKIAljYW5jZWxfd29ya19zeW5jKCZwb3J0LT53cSk7CiAJX19za2JfcXVldWVfcHVyZ2UoJnBvcnQtPmJhY2tsb2cpOwpAQCAtMTMyLDcgKzIwMCw4IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKnBoeV9kZXYgPSBpcHZsYW4tPnBoeV9kZXY7CiAJc3RydWN0IGlwdmxfYWRkciAqYWRkcjsKIAotCWlmIChpcHZsYW4tPnBvcnQtPm1vZGUgPT0gSVBWTEFOX01PREVfTDMpCisJaWYgKGlwdmxhbi0+cG9ydC0+bW9kZSA9PSBJUFZMQU5fTU9ERV9MMyB8fAorCSAgICBpcHZsYW4tPnBvcnQtPm1vZGUgPT0gSVBWTEFOX01PREVfTDNTKQogCQlkZXYtPmZsYWdzIHw9IElGRl9OT0FSUDsKIAllbHNlCiAJCWRldi0+ZmxhZ3MgJj0gfklGRl9OT0FSUDsKQEAgLTM3MiwxMyArNDQxLDE0IEBACiB7CiAJc3RydWN0IGlwdmxfZGV2ICppcHZsYW4gPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBpcHZsX3BvcnQgKnBvcnQgPSBpcHZsYW5fcG9ydF9nZXRfcnRubChpcHZsYW4tPnBoeV9kZXYpOworCWludCBlcnIgPSAwOwogCiAJaWYgKGRhdGEgJiYgZGF0YVtJRkxBX0lQVkxBTl9NT0RFXSkgewogCQl1MTYgbm1vZGUgPSBubGFfZ2V0X3UxNihkYXRhW0lGTEFfSVBWTEFOX01PREVdKTsKIAotCQlpcHZsYW5fc2V0X3BvcnRfbW9kZShwb3J0LCBubW9kZSk7CisJCWVyciA9IGlwdmxhbl9zZXRfcG9ydF9tb2RlKHBvcnQsIG5tb2RlKTsKIAl9Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHNpemVfdCBpcHZsYW5fbmxfZ2V0c2l6ZShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtNDczLDEwICs1NDMsMTMgQEAKIAkJdW5yZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKIAkJcmV0dXJuIGVycjsKIAl9CisJZXJyID0gaXB2bGFuX3NldF9wb3J0X21vZGUocG9ydCwgbW9kZSk7CisJaWYgKGVycikgeworCQl1bnJlZ2lzdGVyX25ldGRldmljZShkZXYpOworCQlyZXR1cm4gZXJyOworCX0KIAogCWxpc3RfYWRkX3RhaWxfcmN1KCZpcHZsYW4tPnBub2RlLCAmcG9ydC0+aXB2bGFucyk7Ci0JaXB2bGFuX3NldF9wb3J0X21vZGUocG9ydCwgbW9kZSk7Ci0KIAluZXRpZl9zdGFja2VkX3RyYW5zZmVyX29wZXJzdGF0ZShwaHlfZGV2LCBkZXYpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjc2VjLmMgYi9kcml2ZXJzL25ldC9tYWNzZWMuYwppbmRleCBkMTNlNmUxLi4zZWE0N2YyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tYWNzZWMuYworKysgYi9kcml2ZXJzL25ldC9tYWNzZWMuYwpAQCAtMjcwLDYgKzI3MCw3IEBACiAJc3RydWN0IHBjcHVfc2VjeV9zdGF0cyBfX3BlcmNwdSAqc3RhdHM7CiAJc3RydWN0IGxpc3RfaGVhZCBzZWN5czsKIAlzdHJ1Y3QgZ3JvX2NlbGxzIGdyb19jZWxsczsKKwl1bnNpZ25lZCBpbnQgbmVzdF9sZXZlbDsKIH07CiAKIC8qKgpAQCAtMjY5OSw2ICsyNzAwLDggQEAKIAogI2RlZmluZSBNQUNTRUNfRkVBVFVSRVMgXAogCShORVRJRl9GX1NHIHwgTkVUSUZfRl9ISUdIRE1BIHwgTkVUSUZfRl9GUkFHTElTVCkKK3N0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgbWFjc2VjX25ldGRldl9hZGRyX2xvY2tfa2V5OworCiBzdGF0aWMgaW50IG1hY3NlY19kZXZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBtYWNzZWNfZGV2ICptYWNzZWMgPSBtYWNzZWNfcHJpdihkZXYpOwpAQCAtMjkxMCw2ICsyOTEzLDEzIEBACiAJcmV0dXJuIG1hY3NlY19wcml2KGRldiktPnJlYWxfZGV2LT5pZmluZGV4OwogfQogCisKK3N0YXRpYyBpbnQgbWFjc2VjX2dldF9uZXN0X2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIG1hY3NlY19wcml2KGRldiktPm5lc3RfbGV2ZWw7Cit9CisKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBtYWNzZWNfbmV0ZGV2X29wcyA9IHsKIAkubmRvX2luaXQJCT0gbWFjc2VjX2Rldl9pbml0LAogCS5uZG9fdW5pbml0CQk9IG1hY3NlY19kZXZfdW5pbml0LApAQCAtMjkyMyw2ICsyOTMzLDcgQEAKIAkubmRvX3N0YXJ0X3htaXQJCT0gbWFjc2VjX3N0YXJ0X3htaXQsCiAJLm5kb19nZXRfc3RhdHM2NAk9IG1hY3NlY19nZXRfc3RhdHM2NCwKIAkubmRvX2dldF9pZmxpbmsJCT0gbWFjc2VjX2dldF9pZmxpbmssCisJLm5kb19nZXRfbG9ja19zdWJjbGFzcyAgPSBtYWNzZWNfZ2V0X25lc3RfbGV2ZWwsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldmljZV90eXBlIG1hY3NlY190eXBlID0gewpAQCAtMjk2Miw2ICsyOTczLDcgQEAKIAlkZXYtPnByaXZfZmxhZ3MgfD0gSUZGX05PX1FVRVVFOwogCWRldi0+bmV0ZGV2X29wcyA9ICZtYWNzZWNfbmV0ZGV2X29wczsKIAlkZXYtPmRlc3RydWN0b3IgPSBtYWNzZWNfZnJlZV9uZXRkZXY7CisJU0VUX05FVERFVl9ERVZUWVBFKGRldiwgJm1hY3NlY190eXBlKTsKIAogCWV0aF96ZXJvX2FkZHIoZGV2LT5icm9hZGNhc3QpOwogfQpAQCAtMzA0NywyMiArMzA1OSwzMSBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgbWFjc2VjX2NvbW1vbl9kZWxsaW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IG1hY3NlY19kZXYgKm1hY3NlYyA9IG1hY3NlY19wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKnJlYWxfZGV2ID0gbWFjc2VjLT5yZWFsX2RldjsKKworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX3F1ZXVlKGRldiwgaGVhZCk7CisJbGlzdF9kZWxfcmN1KCZtYWNzZWMtPnNlY3lzKTsKKwltYWNzZWNfZGVsX2RldihtYWNzZWMpOworCW5ldGRldl91cHBlcl9kZXZfdW5saW5rKHJlYWxfZGV2LCBkZXYpOworCisJbWFjc2VjX2dlbmVyYXRpb24rKzsKK30KKwogc3RhdGljIHZvaWQgbWFjc2VjX2RlbGxpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKIHsKIAlzdHJ1Y3QgbWFjc2VjX2RldiAqbWFjc2VjID0gbWFjc2VjX3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSBtYWNzZWMtPnJlYWxfZGV2OwogCXN0cnVjdCBtYWNzZWNfcnhoX2RhdGEgKnJ4ZCA9IG1hY3NlY19kYXRhX3J0bmwocmVhbF9kZXYpOwogCi0JbWFjc2VjX2dlbmVyYXRpb24rKzsKKwltYWNzZWNfY29tbW9uX2RlbGxpbmsoZGV2LCBoZWFkKTsKIAotCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX3F1ZXVlKGRldiwgaGVhZCk7Ci0JbGlzdF9kZWxfcmN1KCZtYWNzZWMtPnNlY3lzKTsKIAlpZiAobGlzdF9lbXB0eSgmcnhkLT5zZWN5cykpIHsKIAkJbmV0ZGV2X3J4X2hhbmRsZXJfdW5yZWdpc3RlcihyZWFsX2Rldik7CiAJCWtmcmVlKHJ4ZCk7CiAJfQotCi0JbWFjc2VjX2RlbF9kZXYobWFjc2VjKTsKIH0KIAogc3RhdGljIGludCByZWdpc3Rlcl9tYWNzZWNfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiwKQEAgLTMxODEsNiArMzIwMiwxNiBAQAogCiAJZGV2X2hvbGQocmVhbF9kZXYpOwogCisJbWFjc2VjLT5uZXN0X2xldmVsID0gZGV2X2dldF9uZXN0X2xldmVsKHJlYWxfZGV2KSArIDE7CisJbmV0ZGV2X2xvY2tkZXBfc2V0X2NsYXNzZXMoZGV2KTsKKwlsb2NrZGVwX3NldF9jbGFzc19hbmRfc3ViY2xhc3MoJmRldi0+YWRkcl9saXN0X2xvY2ssCisJCQkJICAgICAgICZtYWNzZWNfbmV0ZGV2X2FkZHJfbG9ja19rZXksCisJCQkJICAgICAgIG1hY3NlY19nZXRfbmVzdF9sZXZlbChkZXYpKTsKKworCWVyciA9IG5ldGRldl91cHBlcl9kZXZfbGluayhyZWFsX2RldiwgZGV2KTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byB1bnJlZ2lzdGVyOworCiAJLyogbmVlZCB0byBiZSBhbHJlYWR5IHJlZ2lzdGVyZWQgc28gdGhhdCAtPmluaXQgaGFzIHJ1biBhbmQKIAkgKiB0aGUgTUFDIGFkZHIgaXMgc2V0CiAJICovCkBAIC0zMTkzLDEyICszMjI0LDEyIEBACiAKIAlpZiAocnhfaGFuZGxlciAmJiBzY2lfZXhpc3RzKHJlYWxfZGV2LCBzY2kpKSB7CiAJCWVyciA9IC1FQlVTWTsKLQkJZ290byB1bnJlZ2lzdGVyOworCQlnb3RvIHVubGluazsKIAl9CiAKIAllcnIgPSBtYWNzZWNfYWRkX2RldihkZXYsIHNjaSwgaWN2X2xlbik7CiAJaWYgKGVycikKLQkJZ290byB1bnJlZ2lzdGVyOworCQlnb3RvIHVubGluazsKIAogCWlmIChkYXRhKQogCQltYWNzZWNfY2hhbmdlbGlua19jb21tb24oZGV2LCBkYXRhKTsKQEAgLTMyMTMsNiArMzI0NCw4IEBACiAKIGRlbF9kZXY6CiAJbWFjc2VjX2RlbF9kZXYobWFjc2VjKTsKK3VubGluazoKKwluZXRkZXZfdXBwZXJfZGV2X3VubGluayhyZWFsX2RldiwgZGV2KTsKIHVucmVnaXN0ZXI6CiAJdW5yZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKIAlyZXR1cm4gZXJyOwpAQCAtMzM4Miw4ICszNDE1LDEyIEBACiAKIAkJcnhkID0gbWFjc2VjX2RhdGFfcnRubChyZWFsX2Rldik7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtLCBuLCAmcnhkLT5zZWN5cywgc2VjeXMpIHsKLQkJCW1hY3NlY19kZWxsaW5rKG0tPnNlY3kubmV0ZGV2LCAmaGVhZCk7CisJCQltYWNzZWNfY29tbW9uX2RlbGxpbmsobS0+c2VjeS5uZXRkZXYsICZoZWFkKTsKIAkJfQorCisJCW5ldGRldl9yeF9oYW5kbGVyX3VucmVnaXN0ZXIocmVhbF9kZXYpOworCQlrZnJlZShyeGQpOworCiAJCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX21hbnkoJmhlYWQpOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWN2bGFuLmMgYi9kcml2ZXJzL25ldC9tYWN2bGFuLmMKaW5kZXggY2Q5YjUzOC4uMzIzNGZjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWFjdmxhbi5jCisrKyBiL2RyaXZlcnMvbmV0L21hY3ZsYW4uYwpAQCAtMTMxNSw3ICsxMzE1LDcgQEAKIAl2bGFuLT5kZXYgICAgICA9IGRldjsKIAl2bGFuLT5wb3J0ICAgICA9IHBvcnQ7CiAJdmxhbi0+c2V0X2ZlYXR1cmVzID0gTUFDVkxBTl9GRUFUVVJFUzsKLQl2bGFuLT5uZXN0X2xldmVsID0gZGV2X2dldF9uZXN0X2xldmVsKGxvd2VyZGV2LCBuZXRpZl9pc19tYWN2bGFuKSArIDE7CisJdmxhbi0+bmVzdF9sZXZlbCA9IGRldl9nZXRfbmVzdF9sZXZlbChsb3dlcmRldikgKyAxOwogCiAJdmxhbi0+bW9kZSAgICAgPSBNQUNWTEFOX01PREVfVkVQQTsKIAlpZiAoZGF0YSAmJiBkYXRhW0lGTEFfTUFDVkxBTl9NT0RFXSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21hY3Z0YXAuYyBiL2RyaXZlcnMvbmV0L21hY3Z0YXAuYwppbmRleCBhMzhjMGRhLi4wNzBlMzI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tYWN2dGFwLmMKKysrIGIvZHJpdmVycy9uZXQvbWFjdnRhcC5jCkBAIC0yNzUsNyArMjc1LDYgQEAKIAlydG5sX3VubG9jaygpOwogCiAJc3luY2hyb25pemVfcmN1KCk7Ci0Jc2tiX2FycmF5X2NsZWFudXAoJnEtPnNrYl9hcnJheSk7CiAJc29ja19wdXQoJnEtPnNrKTsKIH0KIApAQCAtNTMzLDEwICs1MzIsOCBAQAogc3RhdGljIHZvaWQgbWFjdnRhcF9zb2NrX2Rlc3RydWN0KHN0cnVjdCBzb2NrICpzaykKIHsKIAlzdHJ1Y3QgbWFjdnRhcF9xdWV1ZSAqcSA9IGNvbnRhaW5lcl9vZihzaywgc3RydWN0IG1hY3Z0YXBfcXVldWUsIHNrKTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCi0Jd2hpbGUgKChza2IgPSBza2JfYXJyYXlfY29uc3VtZSgmcS0+c2tiX2FycmF5KSkgIT0gTlVMTCkKLQkJa2ZyZWVfc2tiKHNrYik7CisJc2tiX2FycmF5X2NsZWFudXAoJnEtPnNrYl9hcnJheSk7CiB9CiAKIHN0YXRpYyBpbnQgbWFjdnRhcF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L0tjb25maWcgYi9kcml2ZXJzL25ldC9waHkvS2NvbmZpZwppbmRleCA0N2E2NDM0Li41MDc4YTBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9waHkvS2NvbmZpZwpAQCAtMTUsMTYyICsxNSwyNyBAQAogY29uZmlnIFNXUEhZCiAJYm9vbAogCi1jb21tZW50ICJNSUkgUEhZIGRldmljZSBkcml2ZXJzIgorY29tbWVudCAiTURJTyBidXMgZGV2aWNlIGRyaXZlcnMiCiAKLWNvbmZpZyBBUVVBTlRJQV9QSFkKLSAgICAgICAgdHJpc3RhdGUgIkRyaXZlcnMgZm9yIHRoZSBBcXVhbnRpYSBQSFlzIgotICAgICAgICAtLS1oZWxwLS0tCi0gICAgICAgICAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBBcXVhbnRpYSBBUTEyMDIsIEFRMjEwNCwgQVFSMTA1LCBBUVI0MDUKLQotY29uZmlnIEFUODAzWF9QSFkKLQl0cmlzdGF0ZSAiRHJpdmVycyBmb3IgQXRoZXJvcyBBVDgwM1ggUEhZcyIKLQktLS1oZWxwLS0tCi0JICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIEFUODAzMCBhbmQgQVQ4MDM1IG1vZGVsCi0KLWNvbmZpZyBBTURfUEhZCi0JdHJpc3RhdGUgIkRyaXZlcnMgZm9yIHRoZSBBTUQgUEhZcyIKLQktLS1oZWxwLS0tCi0JICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIGFtNzljODc0Ci0KLWNvbmZpZyBNQVJWRUxMX1BIWQotCXRyaXN0YXRlICJEcml2ZXJzIGZvciBNYXJ2ZWxsIFBIWXMiCi0JLS0taGVscC0tLQotCSAgQ3VycmVudGx5IGhhcyBhIGRyaXZlciBmb3IgdGhlIDg4RTEwMTFTCi0JCi1jb25maWcgREFWSUNPTV9QSFkKLQl0cmlzdGF0ZSAiRHJpdmVycyBmb3IgRGF2aWNvbSBQSFlzIgotCS0tLWhlbHAtLS0KLQkgIEN1cnJlbnRseSBzdXBwb3J0cyBkbTkxNjFlIGFuZCBkbTkxMzEKLQotY29uZmlnIFFTRU1JX1BIWQotCXRyaXN0YXRlICJEcml2ZXJzIGZvciBRdWFsaXR5IFNlbWljb25kdWN0b3IgUEhZcyIKLQktLS1oZWxwLS0tCi0JICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIHFzNjYxMgotCi1jb25maWcgTFhUX1BIWQotCXRyaXN0YXRlICJEcml2ZXJzIGZvciB0aGUgSW50ZWwgTFhUIFBIWXMiCi0JLS0taGVscC0tLQotCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBseHQ5NzAsIGx4dDk3MQotCi1jb25maWcgQ0lDQURBX1BIWQotCXRyaXN0YXRlICJEcml2ZXJzIGZvciB0aGUgQ2ljYWRhIFBIWXMiCi0JLS0taGVscC0tLQotCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBjaXM4MjA0Ci0KLWNvbmZpZyBWSVRFU1NFX1BIWQotICAgICAgICB0cmlzdGF0ZSAiRHJpdmVycyBmb3IgdGhlIFZpdGVzc2UgUEhZcyIKLSAgICAgICAgLS0taGVscC0tLQotICAgICAgICAgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgdnNjODI0NAotCi1jb25maWcgVEVSQU5FVElDU19QSFkKLSAgICAgICAgdHJpc3RhdGUgIkRyaXZlcnMgZm9yIHRoZSBUZXJhbmV0aWNzIFBIWXMiCi0gICAgICAgIC0tLWhlbHAtLS0KLSAgICAgICAgICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIFRlcmFuZXRpY3MgVE4yMDIwCi0KLWNvbmZpZyBTTVNDX1BIWQotCXRyaXN0YXRlICJEcml2ZXJzIGZvciBTTVNDIFBIWXMiCi0JLS0taGVscC0tLQotCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBMQU44M0MxODUsIExBTjgxODcgYW5kIExBTjg3MDAgUEhZcwotCi1jb25maWcgQkNNX05FVF9QSFlMSUIKLQl0cmlzdGF0ZQotCi1jb25maWcgQlJPQURDT01fUEhZCi0JdHJpc3RhdGUgIkRyaXZlcnMgZm9yIEJyb2FkY29tIFBIWXMiCi0Jc2VsZWN0IEJDTV9ORVRfUEhZTElCCi0JLS0taGVscC0tLQotCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBCQ001NDExLCBCQ001NDIxLCBCQ001NDYxLCBCQ001NDYxNlMsIEJDTTU0NjQsCi0JICBCQ001NDgxIGFuZCBCQ001NDgyIFBIWXMuCi0KLWNvbmZpZyBCQ01fQ1lHTlVTX1BIWQotCXRyaXN0YXRlICJEcml2ZXJzIGZvciBCcm9hZGNvbSBDeWdudXMgU29DIGludGVybmFsIFBIWSIKLQlkZXBlbmRzIG9uIEFSQ0hfQkNNX0NZR05VUyB8fCBDT01QSUxFX1RFU1QKLQlkZXBlbmRzIG9uIE1ESU9fQkNNX0lQUk9DCi0Jc2VsZWN0IEJDTV9ORVRfUEhZTElCCi0JLS0taGVscC0tLQotCSAgVGhpcyBQSFkgZHJpdmVyIGlzIGZvciB0aGUgMUcgaW50ZXJuYWwgUEhZcyBvZiB0aGUgQnJvYWRjb20KLQkgIEN5Z251cyBGYW1pbHkgU29DLgotCi0JICBDdXJyZW50bHkgc3VwcG9ydHMgaW50ZXJuYWwgUEhZJ3MgdXNlZCBpbiB0aGUgQkNNMTEzMDAsCi0JICBCQ00xMTMyMCwgQkNNMTEzNTAsIEJDTTExMzYwLCBCQ001ODMwMCwgQkNNNTgzMDIsCi0JICBCQ001ODMwMyAmIEJDTTU4MzA1IEJyb2FkY29tIEN5Z251cyBTb0NzLgotCi1jb25maWcgQkNNNjNYWF9QSFkKLQl0cmlzdGF0ZSAiRHJpdmVycyBmb3IgQnJvYWRjb20gNjN4eCBTT0NzIGludGVybmFsIFBIWSIKLQlkZXBlbmRzIG9uIEJDTTYzWFgKLQlzZWxlY3QgQkNNX05FVF9QSFlMSUIKLQktLS1oZWxwLS0tCi0JICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIDYzNDggYW5kIDYzNTggUEhZcy4KLQotY29uZmlnIEJDTTdYWFhfUEhZCi0JdHJpc3RhdGUgIkRyaXZlcnMgZm9yIEJyb2FkY29tIDd4eHggU09DcyBpbnRlcm5hbCBQSFlzIgotCXNlbGVjdCBCQ01fTkVUX1BIWUxJQgotCS0tLWhlbHAtLS0KLQkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgQkNNNzM2NiwgQkNNNzQzOSwgQkNNNzQ0NSwgYW5kCi0JICA0MG5tIGFuZCA2NW5tIGdlbmVyYXRpb24gb2YgQkNNN3h4eCBTZXQgVG9wIEJveCBTb0NzLgotCi1jb25maWcgQkNNODdYWF9QSFkKLQl0cmlzdGF0ZSAiRHJpdmVyIGZvciBCcm9hZGNvbSBCQ004NzA2IGFuZCBCQ004NzI3IFBIWXMiCitjb25maWcgTURJT19CQ01fSVBST0MKKwl0cmlzdGF0ZSAiQnJvYWRjb20gaVByb2MgTURJTyBidXMgY29udHJvbGxlciIKKwlkZXBlbmRzIG9uIEFSQ0hfQkNNX0lQUk9DIHx8IENPTVBJTEVfVEVTVAorCWRlcGVuZHMgb24gSEFTX0lPTUVNICYmIE9GX01ESU8KIAloZWxwCi0JICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIEJDTTg3MDYgYW5kIEJDTTg3MjcgMTBHIEV0aGVybmV0IFBIWXMuCisJICBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIGRyaXZlciBmb3IgdGhlIE1ESU8gYnVzc2VzIGZvdW5kIGluIHRoZQorCSAgQnJvYWRjb20gaVByb2MgU29DJ3MuCiAKLWNvbmZpZyBJQ1BMVVNfUEhZCi0JdHJpc3RhdGUgIkRyaXZlcnMgZm9yIElDUGx1cyBQSFlzIgotCS0tLWhlbHAtLS0KLQkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgSVAxNzVDIGFuZCBJUDEwMDEgUEhZcy4KLQotY29uZmlnIFJFQUxURUtfUEhZCi0JdHJpc3RhdGUgIkRyaXZlcnMgZm9yIFJlYWx0ZWsgUEhZcyIKLQktLS1oZWxwLS0tCi0JICBTdXBwb3J0cyB0aGUgUmVhbHRlayA4MjF4IFBIWS4KLQotY29uZmlnIE5BVElPTkFMX1BIWQotCXRyaXN0YXRlICJEcml2ZXJzIGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yIFBIWXMiCi0JLS0taGVscC0tLQotCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBEUDgzODY1IFBIWS4KLQotY29uZmlnIFNURTEwWFAKLQl0cmlzdGF0ZSAiRHJpdmVyIGZvciBTVE1pY3JvZWxlY3Ryb25pY3MgU1RlMTBYcCBQSFlzIgotCS0tLWhlbHAtLS0KLQkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIFNUZTEwMHAgYW5kIFNUZTEwMXAgUEhZcy4KLQotY29uZmlnIExTSV9FVDEwMTFDX1BIWQotCXRyaXN0YXRlICJEcml2ZXIgZm9yIExTSSBFVDEwMTFDIFBIWSIKLQktLS1oZWxwLS0tCi0JICBTdXBwb3J0cyB0aGUgTFNJIEVUMTAxMUMgUEhZLgotCi1jb25maWcgTUlDUkVMX1BIWQotCXRyaXN0YXRlICJEcml2ZXIgZm9yIE1pY3JlbCBQSFlzIgotCS0tLWhlbHAtLS0KLQkgIFN1cHBvcnRzIHRoZSBLU1o5MDIxLCBWU0M4MjAxLCBLUzgwMDEgUEhZcy4KLQotY29uZmlnIERQODM4NDhfUEhZCi0JdHJpc3RhdGUgIkRyaXZlciBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgRFA4Mzg0OCBQSFkiCi0JLS0taGVscC0tLQotCSAgU3VwcG9ydHMgdGhlIERQODM4NDggUEhZLgotCi1jb25maWcgRFA4Mzg2N19QSFkKLQl0cmlzdGF0ZSAiRHJpdmVycyBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgRFA4Mzg2NyBHaWdhYml0IFBIWSIKLQktLS1oZWxwLS0tCi0JICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIERQODM4NjcgUEhZLgotCi1jb25maWcgTUlDUk9DSElQX1BIWQotCXRyaXN0YXRlICJEcml2ZXJzIGZvciBNaWNyb2NoaXAgUEhZcyIKK2NvbmZpZyBNRElPX0JDTV9VTklNQUMKKwl0cmlzdGF0ZSAiQnJvYWRjb20gVW5pTUFDIE1ESU8gYnVzIGNvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0KIAloZWxwCi0JICBTdXBwb3J0cyB0aGUgTEFOODhYWCBQSFlzLgotCi1jb25maWcgRklYRURfUEhZCi0JdHJpc3RhdGUgIkRyaXZlciBmb3IgTURJTyBCdXMvUEhZIGVtdWxhdGlvbiB3aXRoIGZpeGVkIHNwZWVkL2xpbmsgUEhZcyIKLQlkZXBlbmRzIG9uIFBIWUxJQgotCXNlbGVjdCBTV1BIWQotCS0tLWhlbHAtLS0KLQkgIEFkZHMgdGhlIHBsYXRmb3JtICJmaXhlZCIgTURJTyBCdXMgdG8gY292ZXIgdGhlIGJvYXJkcyB0aGF0IHVzZQotCSAgUEhZcyB0aGF0IGFyZSBub3QgY29ubmVjdGVkIHRvIHRoZSByZWFsIE1ESU8gYnVzLgotCi0JICBDdXJyZW50bHkgdGVzdGVkIHdpdGggbXBjODY2YWRzIGFuZCBtcGM4MzQ5ZS1taXR4LgorCSAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBkcml2ZXIgZm9yIHRoZSBCcm9hZGNvbSBVbmlNQUMgTURJTyBidXNzZXMuCisJICBUaGlzIGhhcmR3YXJlIGNhbiBiZSBmb3VuZCBpbiB0aGUgQnJvYWRjb20gR0VORVQgRXRoZXJuZXQgTUFDCisJICBjb250cm9sbGVycyBhcyB3ZWxsIGFzIHNvbWUgQnJvYWRjb20gRXRoZXJuZXQgc3dpdGNoZXMgc3VjaCBhcyB0aGUKKwkgIFN0YXJmaWdodGVyIDIgc3dpdGNoZXMuCiAKIGNvbmZpZyBNRElPX0JJVEJBTkcKLQl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgYml0YmFuZ2VkIE1ESU8gYnVzZXMiCisJdHJpc3RhdGUgIkJpdGJhbmdlZCBNRElPIGJ1c2VzIgogCWhlbHAKIAkgIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlIE1ESU8gYnVzIHByb3RvY29sIGluIHNvZnR3YXJlLAogCSAgZm9yIHVzZSBieSBsb3cgbGV2ZWwgZHJpdmVycyB0aGF0IGV4cG9ydCB0aGUgYWJpbGl0eSB0bwpAQCAtMTc4LDU0ICs0Myw2IEBACiAKIAkgIElmIGluIGRvdWJ0LCBzYXkgTi4KIAotY29uZmlnIE1ESU9fR1BJTwotCXRyaXN0YXRlICJTdXBwb3J0IGZvciBHUElPIGxpYi1iYXNlZCBiaXRiYW5nZWQgTURJTyBidXNlcyIKLQlkZXBlbmRzIG9uIE1ESU9fQklUQkFORyAmJiBHUElPTElCCi0JLS0taGVscC0tLQotCSAgU3VwcG9ydHMgR1BJTyBsaWItYmFzZWQgTURJTyBidXNzZXMuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIG1kaW8tZ3Bpby4KLQotY29uZmlnIE1ESU9fQ0FWSVVNCi0JdHJpc3RhdGUKLQotY29uZmlnIE1ESU9fT0NURU9OCi0JdHJpc3RhdGUgIlN1cHBvcnQgZm9yIE1ESU8gYnVzZXMgb24gT2N0ZW9uIGFuZCBzb21lIFRodW5kZXJYIFNPQ3MiCi0JZGVwZW5kcyBvbiA2NEJJVAotCWRlcGVuZHMgb24gSEFTX0lPTUVNCi0Jc2VsZWN0IE1ESU9fQ0FWSVVNCi0JaGVscAotCSAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBkcml2ZXIgZm9yIHRoZSBPY3Rlb24gYW5kIFRodW5kZXJYIE1ESU8KLQkgIGJ1c2VzLiBJdCBpcyByZXF1aXJlZCBieSB0aGUgT2N0ZW9uIGFuZCBUaHVuZGVyWCBldGhlcm5ldCBkZXZpY2UKLQkgIGRyaXZlcnMgb24gc29tZSBzeXN0ZW1zLgotCi1jb25maWcgTURJT19USFVOREVSCi0JdHJpc3RhdGUgIlN1cHBvcnQgZm9yIE1ESU8gYnVzZXMgb24gVGh1bmRlclggU09DcyIKLQlkZXBlbmRzIG9uIDY0QklUCi0JZGVwZW5kcyBvbiBQQ0kKLQlzZWxlY3QgTURJT19DQVZJVU0KLQloZWxwCi0JICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgTURJTyBpbnRlcmZhY2VzIGZvdW5kIG9uIENhdml1bQotCSAgVGh1bmRlclggU29DcyB3aGVuIHRoZSBNRElPIGJ1cyBkZXZpY2UgYXBwZWFycyBhcyBhIFBDSQotCSAgZGV2aWNlLgotCi0KLWNvbmZpZyBNRElPX1NVTjRJCi0JdHJpc3RhdGUgIkFsbHdpbm5lciBzdW40aSBNRElPIGludGVyZmFjZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVJDSF9TVU5YSQotCWhlbHAKLQkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBNRElPIGludGVyZmFjZSBmb3VuZCBpbiB0aGUgbmV0d29yawotCSAgaW50ZXJmYWNlIHVuaXRzIG9mIHRoZSBBbGx3aW5uZXIgU29DIHRoYXQgaGF2ZSBhbiBFTUFDIChBMTAsCi0JICBBMTIsIEExMHMsIGV0Yy4pCi0KLWNvbmZpZyBNRElPX01PWEFSVAotICAgICAgICB0cmlzdGF0ZSAiTU9YQSBBUlQgTURJTyBpbnRlcmZhY2Ugc3VwcG9ydCIKLSAgICAgICAgZGVwZW5kcyBvbiBBUkNIX01PWEFSVAotICAgICAgICBoZWxwCi0gICAgICAgICAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIE1ESU8gaW50ZXJmYWNlIGZvdW5kIGluIHRoZSBuZXR3b3JrCi0gICAgICAgICAgaW50ZXJmYWNlIHVuaXRzIG9mIHRoZSBNT1hBIEFSVCBTb0MKLQogY29uZmlnIE1ESU9fQlVTX01VWAogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBPRl9NRElPCkBAIC0yMzUsOCArNTIsMTkgQEAKIAkgIHRvIGEgcGFyZW50IGJ1cy4gIFN3aXRjaGluZyBiZXR3ZWVuIGNoaWxkIGJ1c3NlcyBpcyBkb25lIGJ5CiAJICBkZXZpY2Ugc3BlY2lmaWMgZHJpdmVycy4KIAorY29uZmlnIE1ESU9fQlVTX01VWF9CQ01fSVBST0MKKwl0cmlzdGF0ZSAiQnJvYWRjb20gaVByb2MgYmFzZWQgTURJTyBidXMgbXVsdGlwbGV4ZXJzIgorCWRlcGVuZHMgb24gT0YgJiYgT0ZfTURJTyAmJiAoQVJDSF9CQ01fSVBST0MgfHwgQ09NUElMRV9URVNUKQorCXNlbGVjdCBNRElPX0JVU19NVVgKKwlkZWZhdWx0IEFSQ0hfQkNNX0lQUk9DCisJaGVscAorCSAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBkcml2ZXIgZm9yIE1ESU8gYnVzIG11bHRpcGxleGVycyBmb3VuZCBpbgorCSAgaVByb2MgYmFzZWQgQnJvYWRjb20gU29Dcy4gVGhpcyBtdWx0aXBsZXhlciBjb25uZWN0cyBvbmUgb2Ygc2V2ZXJhbAorCSAgY2hpbGQgTURJTyBidXMgdG8gYSBwYXJlbnQgYnVzLiBCdXNlcyBjb3VsZCBiZSBpbnRlcm5hbCBhcyB3ZWxsIGFzCisJICBleHRlcm5hbCBhbmQgc2VsZWN0aW9uIGxvZ2ljIGxpZXMgaW5zaWRlIHRoZSBzYW1lIG11bHRpcGxleGVyLgorCiBjb25maWcgTURJT19CVVNfTVVYX0dQSU8KLQl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgR1BJTyBjb250cm9sbGVkIE1ESU8gYnVzIG11bHRpcGxleGVycyIKKwl0cmlzdGF0ZSAiR1BJTyBjb250cm9sbGVkIE1ESU8gYnVzIG11bHRpcGxleGVycyIKIAlkZXBlbmRzIG9uIE9GX0dQSU8gJiYgT0ZfTURJTwogCXNlbGVjdCBNRElPX0JVU19NVVgKIAloZWxwCkBAIC0yNDYsNyArNzQsNyBAQAogCSAgc2VsZWN0aW9uIGlzIHVuZGVyIHRoZSBjb250cm9sIG9mIEdQSU8gbGluZXMuCiAKIGNvbmZpZyBNRElPX0JVU19NVVhfTU1JT1JFRwotCXRyaXN0YXRlICJTdXBwb3J0IGZvciBNTUlPIGRldmljZS1jb250cm9sbGVkIE1ESU8gYnVzIG11bHRpcGxleGVycyIKKwl0cmlzdGF0ZSAiTU1JTyBkZXZpY2UtY29udHJvbGxlZCBNRElPIGJ1cyBtdWx0aXBsZXhlcnMiCiAJZGVwZW5kcyBvbiBPRl9NRElPICYmIEhBU19JT01FTQogCXNlbGVjdCBNRElPX0JVU19NVVgKIAloZWxwCkBAIC0yNTgsNDEgKzg2LDE3IEBACiAKIAkgIEN1cnJlbnRseSwgb25seSA4LWJpdCByZWdpc3RlcnMgYXJlIHN1cHBvcnRlZC4KIAotY29uZmlnIE1ESU9fQlVTX01VWF9CQ01fSVBST0MKLQl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgaVByb2MgYmFzZWQgTURJTyBidXMgbXVsdGlwbGV4ZXJzIgotCWRlcGVuZHMgb24gT0YgJiYgT0ZfTURJTyAmJiAoQVJDSF9CQ01fSVBST0MgfHwgQ09NUElMRV9URVNUKQotCXNlbGVjdCBNRElPX0JVU19NVVgKLQlkZWZhdWx0IEFSQ0hfQkNNX0lQUk9DCi0JaGVscAotCSAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBkcml2ZXIgZm9yIE1ESU8gYnVzIG11bHRpcGxleGVycyBmb3VuZCBpbgotCSAgaVByb2MgYmFzZWQgQnJvYWRjb20gU29Dcy4gVGhpcyBtdWx0aXBsZXhlciBjb25uZWN0cyBvbmUgb2Ygc2V2ZXJhbAotCSAgY2hpbGQgTURJTyBidXMgdG8gYSBwYXJlbnQgYnVzLiBCdXNlcyBjb3VsZCBiZSBpbnRlcm5hbCBhcyB3ZWxsIGFzCi0JICBleHRlcm5hbCBhbmQgc2VsZWN0aW9uIGxvZ2ljIGxpZXMgaW5zaWRlIHRoZSBzYW1lIG11bHRpcGxleGVyLgorY29uZmlnIE1ESU9fQ0FWSVVNCisJdHJpc3RhdGUKIAotY29uZmlnIE1ESU9fQkNNX1VOSU1BQwotCXRyaXN0YXRlICJCcm9hZGNvbSBVbmlNQUMgTURJTyBidXMgY29udHJvbGxlciIKLQlkZXBlbmRzIG9uIEhBU19JT01FTQotCWhlbHAKLQkgIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgZHJpdmVyIGZvciB0aGUgQnJvYWRjb20gVW5pTUFDIE1ESU8gYnVzc2VzLgotCSAgVGhpcyBoYXJkd2FyZSBjYW4gYmUgZm91bmQgaW4gdGhlIEJyb2FkY29tIEdFTkVUIEV0aGVybmV0IE1BQwotCSAgY29udHJvbGxlcnMgYXMgd2VsbCBhcyBzb21lIEJyb2FkY29tIEV0aGVybmV0IHN3aXRjaGVzIHN1Y2ggYXMgdGhlCi0JICBTdGFyZmlnaHRlciAyIHN3aXRjaGVzLgotCi1jb25maWcgTURJT19CQ01fSVBST0MKLQl0cmlzdGF0ZSAiQnJvYWRjb20gaVByb2MgTURJTyBidXMgY29udHJvbGxlciIKLQlkZXBlbmRzIG9uIEFSQ0hfQkNNX0lQUk9DIHx8IENPTVBJTEVfVEVTVAotCWRlcGVuZHMgb24gSEFTX0lPTUVNICYmIE9GX01ESU8KLQloZWxwCi0JICBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIGRyaXZlciBmb3IgdGhlIE1ESU8gYnVzc2VzIGZvdW5kIGluIHRoZQotCSAgQnJvYWRjb20gaVByb2MgU29DJ3MuCi0KLWNvbmZpZyBJTlRFTF9YV0FZX1BIWQotCXRyaXN0YXRlICJEcml2ZXIgZm9yIEludGVsIFhXQVkgUEhZcyIKK2NvbmZpZyBNRElPX0dQSU8KKwl0cmlzdGF0ZSAiR1BJTyBsaWItYmFzZWQgYml0YmFuZ2VkIE1ESU8gYnVzZXMiCisJZGVwZW5kcyBvbiBNRElPX0JJVEJBTkcgJiYgR1BJT0xJQgogCS0tLWhlbHAtLS0KLQkgIFN1cHBvcnRzIHRoZSBJbnRlbCBYV0FZIChmb3JtZXIgTGFudGlxKSAxMUcgYW5kIDIyRSBQSFlzLgotCSAgVGhlc2UgUEhZcyBhcmUgbWFya2VkIGFzIHN0YW5kYWxvbmUgY2hpcHMgdW5kZXIgdGhlIG5hbWVzCi0JICBQRUYgNzA2MSwgUEVGIDcwNzEgYW5kIFBFRiA3MDcyIG9yIGludGVncmF0ZWQgaW50byB0aGUgSW50ZWwKLQkgIFNvQ3MgeFJYMjAwLCB4UlgzMDAsIHhSWDMzMCwgeFJYMzUwIGFuZCB4Ulg1NTAuCisJICBTdXBwb3J0cyBHUElPIGxpYi1iYXNlZCBNRElPIGJ1c3Nlcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWRpby1ncGlvLgogCiBjb25maWcgTURJT19ISVNJX0ZFTUFDCiAJdHJpc3RhdGUgIkhpc2lsaWNvbiBGRU1BQyBNRElPIGJ1cyBjb250cm9sbGVyIgpAQCAtMzAxLDEyICsxMDUsMjI4IEBACiAJICBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIGRyaXZlciBmb3IgdGhlIE1ESU8gYnVzc2VzIGZvdW5kIGluIHRoZQogCSAgSGlzaWxpY29uIFNvQyB0aGF0IGhhdmUgYW4gRmFzdCBFdGhlcm5ldCBNQUMuCiAKK2NvbmZpZyBNRElPX01PWEFSVAorICAgICAgICB0cmlzdGF0ZSAiTU9YQSBBUlQgTURJTyBpbnRlcmZhY2Ugc3VwcG9ydCIKKyAgICAgICAgZGVwZW5kcyBvbiBBUkNIX01PWEFSVAorICAgICAgICBoZWxwCisgICAgICAgICAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIE1ESU8gaW50ZXJmYWNlIGZvdW5kIGluIHRoZSBuZXR3b3JrCisgICAgICAgICAgaW50ZXJmYWNlIHVuaXRzIG9mIHRoZSBNT1hBIEFSVCBTb0MKKworY29uZmlnIE1ESU9fT0NURU9OCisJdHJpc3RhdGUgIk9jdGVvbiBhbmQgc29tZSBUaHVuZGVyWCBTT0NzIE1ESU8gYnVzZXMiCisJZGVwZW5kcyBvbiA2NEJJVAorCWRlcGVuZHMgb24gSEFTX0lPTUVNCisJc2VsZWN0IE1ESU9fQ0FWSVVNCisJaGVscAorCSAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBkcml2ZXIgZm9yIHRoZSBPY3Rlb24gYW5kIFRodW5kZXJYIE1ESU8KKwkgIGJ1c2VzLiBJdCBpcyByZXF1aXJlZCBieSB0aGUgT2N0ZW9uIGFuZCBUaHVuZGVyWCBldGhlcm5ldCBkZXZpY2UKKwkgIGRyaXZlcnMgb24gc29tZSBzeXN0ZW1zLgorCitjb25maWcgTURJT19TVU40SQorCXRyaXN0YXRlICJBbGx3aW5uZXIgc3VuNGkgTURJTyBpbnRlcmZhY2Ugc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfU1VOWEkKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgTURJTyBpbnRlcmZhY2UgZm91bmQgaW4gdGhlIG5ldHdvcmsKKwkgIGludGVyZmFjZSB1bml0cyBvZiB0aGUgQWxsd2lubmVyIFNvQyB0aGF0IGhhdmUgYW4gRU1BQyAoQTEwLAorCSAgQTEyLCBBMTBzLCBldGMuKQorCitjb25maWcgTURJT19USFVOREVSCisJdHJpc3RhdGUgIlRodW5kZXJYIFNPQ3MgTURJTyBidXNlcyIKKwlkZXBlbmRzIG9uIDY0QklUCisJZGVwZW5kcyBvbiBQQ0kKKwlzZWxlY3QgTURJT19DQVZJVU0KKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgTURJTyBpbnRlcmZhY2VzIGZvdW5kIG9uIENhdml1bQorCSAgVGh1bmRlclggU29DcyB3aGVuIHRoZSBNRElPIGJ1cyBkZXZpY2UgYXBwZWFycyBhcyBhIFBDSQorCSAgZGV2aWNlLgorCiBjb25maWcgTURJT19YR0VORQogCXRyaXN0YXRlICJBUE0gWC1HZW5lIFNvQyBNRElPIGJ1cyBjb250cm9sbGVyIgogCWhlbHAKIAkgIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgZHJpdmVyIGZvciB0aGUgTURJTyBidXNzZXMgZm91bmQgaW4gdGhlCiAJICBBUE0gWC1HZW5lIFNvQydzLgogCitjb21tZW50ICJNSUkgUEhZIGRldmljZSBkcml2ZXJzIgorCitjb25maWcgQU1EX1BIWQorCXRyaXN0YXRlICJBTUQgUEhZcyIKKwktLS1oZWxwLS0tCisJICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIGFtNzljODc0CisKK2NvbmZpZyBBUVVBTlRJQV9QSFkKKyAgICAgICAgdHJpc3RhdGUgIkFxdWFudGlhIFBIWXMiCisgICAgICAgIC0tLWhlbHAtLS0KKyAgICAgICAgICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIEFxdWFudGlhIEFRMTIwMiwgQVEyMTA0LCBBUVIxMDUsIEFRUjQwNQorCitjb25maWcgQVQ4MDNYX1BIWQorCXRyaXN0YXRlICJBVDgwM1ggUEhZcyIKKwktLS1oZWxwLS0tCisJICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIEFUODAzMCBhbmQgQVQ4MDM1IG1vZGVsCisKK2NvbmZpZyBCQ002M1hYX1BIWQorCXRyaXN0YXRlICJCcm9hZGNvbSA2M3h4IFNPQ3MgaW50ZXJuYWwgUEhZIgorCWRlcGVuZHMgb24gQkNNNjNYWAorCXNlbGVjdCBCQ01fTkVUX1BIWUxJQgorCS0tLWhlbHAtLS0KKwkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgNjM0OCBhbmQgNjM1OCBQSFlzLgorCitjb25maWcgQkNNN1hYWF9QSFkKKwl0cmlzdGF0ZSAiQnJvYWRjb20gN3h4eCBTT0NzIGludGVybmFsIFBIWXMiCisJc2VsZWN0IEJDTV9ORVRfUEhZTElCCisJLS0taGVscC0tLQorCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBCQ003MzY2LCBCQ003NDM5LCBCQ003NDQ1LCBhbmQKKwkgIDQwbm0gYW5kIDY1bm0gZ2VuZXJhdGlvbiBvZiBCQ003eHh4IFNldCBUb3AgQm94IFNvQ3MuCisKK2NvbmZpZyBCQ004N1hYX1BIWQorCXRyaXN0YXRlICJCcm9hZGNvbSBCQ004NzA2IGFuZCBCQ004NzI3IFBIWXMiCisJaGVscAorCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBCQ004NzA2IGFuZCBCQ004NzI3IDEwRyBFdGhlcm5ldCBQSFlzLgorCitjb25maWcgQkNNX0NZR05VU19QSFkKKwl0cmlzdGF0ZSAiQnJvYWRjb20gQ3lnbnVzIFNvQyBpbnRlcm5hbCBQSFkiCisJZGVwZW5kcyBvbiBBUkNIX0JDTV9DWUdOVVMgfHwgQ09NUElMRV9URVNUCisJZGVwZW5kcyBvbiBNRElPX0JDTV9JUFJPQworCXNlbGVjdCBCQ01fTkVUX1BIWUxJQgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgUEhZIGRyaXZlciBpcyBmb3IgdGhlIDFHIGludGVybmFsIFBIWXMgb2YgdGhlIEJyb2FkY29tCisJICBDeWdudXMgRmFtaWx5IFNvQy4KKworCSAgQ3VycmVudGx5IHN1cHBvcnRzIGludGVybmFsIFBIWSdzIHVzZWQgaW4gdGhlIEJDTTExMzAwLAorCSAgQkNNMTEzMjAsIEJDTTExMzUwLCBCQ00xMTM2MCwgQkNNNTgzMDAsIEJDTTU4MzAyLAorCSAgQkNNNTgzMDMgJiBCQ001ODMwNSBCcm9hZGNvbSBDeWdudXMgU29Dcy4KKworY29uZmlnIEJDTV9ORVRfUEhZTElCCisJdHJpc3RhdGUKKworY29uZmlnIEJST0FEQ09NX1BIWQorCXRyaXN0YXRlICJCcm9hZGNvbSBQSFlzIgorCXNlbGVjdCBCQ01fTkVUX1BIWUxJQgorCS0tLWhlbHAtLS0KKwkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgQkNNNTQxMSwgQkNNNTQyMSwgQkNNNTQ2MSwgQkNNNTQ2MTZTLCBCQ001NDY0LAorCSAgQkNNNTQ4MSBhbmQgQkNNNTQ4MiBQSFlzLgorCitjb25maWcgQ0lDQURBX1BIWQorCXRyaXN0YXRlICJDaWNhZGEgUEhZcyIKKwktLS1oZWxwLS0tCisJICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIGNpczgyMDQKKworY29uZmlnIERBVklDT01fUEhZCisJdHJpc3RhdGUgIkRhdmljb20gUEhZcyIKKwktLS1oZWxwLS0tCisJICBDdXJyZW50bHkgc3VwcG9ydHMgZG05MTYxZSBhbmQgZG05MTMxCisKK2NvbmZpZyBEUDgzODQ4X1BIWQorCXRyaXN0YXRlICJUZXhhcyBJbnN0cnVtZW50cyBEUDgzODQ4IFBIWSIKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0cyB0aGUgRFA4Mzg0OCBQSFkuCisKK2NvbmZpZyBEUDgzODY3X1BIWQorCXRyaXN0YXRlICJUZXhhcyBJbnN0cnVtZW50cyBEUDgzODY3IEdpZ2FiaXQgUEhZIgorCS0tLWhlbHAtLS0KKwkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgRFA4Mzg2NyBQSFkuCisKK2NvbmZpZyBGSVhFRF9QSFkKKwl0cmlzdGF0ZSAiTURJTyBCdXMvUEhZIGVtdWxhdGlvbiB3aXRoIGZpeGVkIHNwZWVkL2xpbmsgUEhZcyIKKwlkZXBlbmRzIG9uIFBIWUxJQgorCXNlbGVjdCBTV1BIWQorCS0tLWhlbHAtLS0KKwkgIEFkZHMgdGhlIHBsYXRmb3JtICJmaXhlZCIgTURJTyBCdXMgdG8gY292ZXIgdGhlIGJvYXJkcyB0aGF0IHVzZQorCSAgUEhZcyB0aGF0IGFyZSBub3QgY29ubmVjdGVkIHRvIHRoZSByZWFsIE1ESU8gYnVzLgorCisJICBDdXJyZW50bHkgdGVzdGVkIHdpdGggbXBjODY2YWRzIGFuZCBtcGM4MzQ5ZS1taXR4LgorCitjb25maWcgSUNQTFVTX1BIWQorCXRyaXN0YXRlICJJQ1BsdXMgUEhZcyIKKwktLS1oZWxwLS0tCisJICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIElQMTc1QyBhbmQgSVAxMDAxIFBIWXMuCisKK2NvbmZpZyBJTlRFTF9YV0FZX1BIWQorCXRyaXN0YXRlICJJbnRlbCBYV0FZIFBIWXMiCisJLS0taGVscC0tLQorCSAgU3VwcG9ydHMgdGhlIEludGVsIFhXQVkgKGZvcm1lciBMYW50aXEpIDExRyBhbmQgMjJFIFBIWXMuCisJICBUaGVzZSBQSFlzIGFyZSBtYXJrZWQgYXMgc3RhbmRhbG9uZSBjaGlwcyB1bmRlciB0aGUgbmFtZXMKKwkgIFBFRiA3MDYxLCBQRUYgNzA3MSBhbmQgUEVGIDcwNzIgb3IgaW50ZWdyYXRlZCBpbnRvIHRoZSBJbnRlbAorCSAgU29DcyB4UlgyMDAsIHhSWDMwMCwgeFJYMzMwLCB4UlgzNTAgYW5kIHhSWDU1MC4KKworY29uZmlnIExTSV9FVDEwMTFDX1BIWQorCXRyaXN0YXRlICJMU0kgRVQxMDExQyBQSFkiCisJLS0taGVscC0tLQorCSAgU3VwcG9ydHMgdGhlIExTSSBFVDEwMTFDIFBIWS4KKworY29uZmlnIExYVF9QSFkKKwl0cmlzdGF0ZSAiSW50ZWwgTFhUIFBIWXMiCisJLS0taGVscC0tLQorCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBseHQ5NzAsIGx4dDk3MQorCitjb25maWcgTUFSVkVMTF9QSFkKKwl0cmlzdGF0ZSAiTWFydmVsbCBQSFlzIgorCS0tLWhlbHAtLS0KKwkgIEN1cnJlbnRseSBoYXMgYSBkcml2ZXIgZm9yIHRoZSA4OEUxMDExUworCitjb25maWcgTUlDUkVMX1BIWQorCXRyaXN0YXRlICJNaWNyZWwgUEhZcyIKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0cyB0aGUgS1NaOTAyMSwgVlNDODIwMSwgS1M4MDAxIFBIWXMuCisKK2NvbmZpZyBNSUNST0NISVBfUEhZCisJdHJpc3RhdGUgIk1pY3JvY2hpcCBQSFlzIgorCWhlbHAKKwkgIFN1cHBvcnRzIHRoZSBMQU44OFhYIFBIWXMuCisKK2NvbmZpZyBNSUNST1NFTUlfUEhZCisJdHJpc3RhdGUgIk1pY3Jvc2VtaSBQSFlzIgorCS0tLWhlbHAtLS0KKwkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgVlNDODUzMSBhbmQgVlNDODU0MSBQSFlzCisKK2NvbmZpZyBOQVRJT05BTF9QSFkKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBQSFlzIgorCS0tLWhlbHAtLS0KKwkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgRFA4Mzg2NSBQSFkuCisKK2NvbmZpZyBRU0VNSV9QSFkKKwl0cmlzdGF0ZSAiUXVhbGl0eSBTZW1pY29uZHVjdG9yIFBIWXMiCisJLS0taGVscC0tLQorCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBxczY2MTIKKworY29uZmlnIFJFQUxURUtfUEhZCisJdHJpc3RhdGUgIlJlYWx0ZWsgUEhZcyIKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0cyB0aGUgUmVhbHRlayA4MjF4IFBIWS4KKworY29uZmlnIFNNU0NfUEhZCisJdHJpc3RhdGUgIlNNU0MgUEhZcyIKKwktLS1oZWxwLS0tCisJICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIExBTjgzQzE4NSwgTEFOODE4NyBhbmQgTEFOODcwMCBQSFlzCisKK2NvbmZpZyBTVEUxMFhQCisJdHJpc3RhdGUgIlNUTWljcm9lbGVjdHJvbmljcyBTVGUxMFhwIFBIWXMiCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgU1RlMTAwcCBhbmQgU1RlMTAxcCBQSFlzLgorCitjb25maWcgVEVSQU5FVElDU19QSFkKKyAgICAgICAgdHJpc3RhdGUgIlRlcmFuZXRpY3MgUEhZcyIKKyAgICAgICAgLS0taGVscC0tLQorICAgICAgICAgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgVGVyYW5ldGljcyBUTjIwMjAKKworY29uZmlnIFZJVEVTU0VfUEhZCisgICAgICAgIHRyaXN0YXRlICJWaXRlc3NlIFBIWXMiCisgICAgICAgIC0tLWhlbHAtLS0KKyAgICAgICAgICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIHZzYzgyNDQKKworY29uZmlnIFhJTElOWF9HTUlJMlJHTUlJCisgICAgICAgdHJpc3RhdGUgIlhpbGlueCBHTUlJMlJHTUlJIGNvbnZlcnRlciBkcml2ZXIiCisgICAgICAgLS0taGVscC0tLQorICAgICAgICAgVGhpcyBkcml2ZXIgc3VwcG9ydCB4aWxpbnggR01JSSB0byBSR01JSSBJUCBjb3JlIGl0IHByb3ZpZGVzCisgICAgICAgICB0aGUgUmVkdWNlZCBHaWdhYml0IE1lZGlhIEluZGVwZW5kZW50IEludGVyZmFjZShSR01JSSkgYmV0d2VlbgorICAgICAgICAgRXRoZXJuZXQgcGh5c2ljYWwgbWVkaWEgZGV2aWNlcyBhbmQgdGhlIEdpZ2FiaXQgRXRoZXJuZXQgY29udHJvbGxlci4KKworY29uZmlnIE1ESU9fWEdFTkUKKwl0cmlzdGF0ZSAiQVBNIFgtR2VuZSBTb0MgTURJTyBidXMgY29udHJvbGxlciIKKwlkZXBlbmRzIG9uIEFSQ0hfWEdFTkUgfHwgQ09NUElMRV9URVNUCisJaGVscAorCSAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBkcml2ZXIgZm9yIHRoZSBNRElPIGJ1c3NlcyBmb3VuZCBpbiB0aGUKKwkgIEFQTSBYLUdlbmUgU29DJ3MuCisKIGVuZGlmICMgUEhZTElCCiAKIGNvbmZpZyBNSUNSRUxfS1M4OTk1TUEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3BoeS9NYWtlZmlsZQppbmRleCA1MzRkZmE3Li5lNTg2NjdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvcGh5L01ha2VmaWxlCkBAIC0xLDUxICsxLDU1IEBACi0jIE1ha2VmaWxlIGZvciBMaW51eCBQSFkgZHJpdmVycworIyBNYWtlZmlsZSBmb3IgTGludXggUEhZIGRyaXZlcnMgYW5kIE1ESU8gYnVzIGRyaXZlcnMKIAogbGlicGh5LXkJCQk6PSBwaHkubyBwaHlfZGV2aWNlLm8gbWRpb19idXMubyBtZGlvX2RldmljZS5vCiBsaWJwaHktJChDT05GSUdfU1dQSFkpCQkrPSBzd3BoeS5vCiAKIG9iai0kKENPTkZJR19QSFlMSUIpCQkrPSBsaWJwaHkubworCitvYmotJChDT05GSUdfTURJT19CQ01fSVBST0MpCSs9IG1kaW8tYmNtLWlwcm9jLm8KK29iai0kKENPTkZJR19NRElPX0JDTV9VTklNQUMpCSs9IG1kaW8tYmNtLXVuaW1hYy5vCitvYmotJChDT05GSUdfTURJT19CSVRCQU5HKQkrPSBtZGlvLWJpdGJhbmcubworb2JqLSQoQ09ORklHX01ESU9fQlVTX01VWCkJKz0gbWRpby1tdXgubworb2JqLSQoQ09ORklHX01ESU9fQlVTX01VWF9CQ01fSVBST0MpCSs9IG1kaW8tbXV4LWJjbS1pcHJvYy5vCitvYmotJChDT05GSUdfTURJT19CVVNfTVVYX0dQSU8pCSs9IG1kaW8tbXV4LWdwaW8ubworb2JqLSQoQ09ORklHX01ESU9fQlVTX01VWF9NTUlPUkVHKSArPSBtZGlvLW11eC1tbWlvcmVnLm8KK29iai0kKENPTkZJR19NRElPX0NBVklVTSkJKz0gbWRpby1jYXZpdW0ubworb2JqLSQoQ09ORklHX01ESU9fR1BJTykJCSs9IG1kaW8tZ3Bpby5vCitvYmotJChDT05GSUdfTURJT19ISVNJX0ZFTUFDKQkrPSBtZGlvLWhpc2ktZmVtYWMubworb2JqLSQoQ09ORklHX01ESU9fTU9YQVJUKQkrPSBtZGlvLW1veGFydC5vCitvYmotJChDT05GSUdfTURJT19PQ1RFT04pCSs9IG1kaW8tb2N0ZW9uLm8KK29iai0kKENPTkZJR19NRElPX1NVTjRJKQkrPSBtZGlvLXN1bjRpLm8KK29iai0kKENPTkZJR19NRElPX1RIVU5ERVIpCSs9IG1kaW8tdGh1bmRlci5vCitvYmotJChDT05GSUdfTURJT19YR0VORSkJKz0gbWRpby14Z2VuZS5vCisKK29iai0kKENPTkZJR19BTURfUEhZKQkJKz0gYW1kLm8KIG9iai0kKENPTkZJR19BUVVBTlRJQV9QSFkpCSs9IGFxdWFudGlhLm8KLW9iai0kKENPTkZJR19NQVJWRUxMX1BIWSkJKz0gbWFydmVsbC5vCi1vYmotJChDT05GSUdfREFWSUNPTV9QSFkpCSs9IGRhdmljb20ubwotb2JqLSQoQ09ORklHX0NJQ0FEQV9QSFkpCSs9IGNpY2FkYS5vCi1vYmotJChDT05GSUdfTFhUX1BIWSkJCSs9IGx4dC5vCi1vYmotJChDT05GSUdfUVNFTUlfUEhZKQkJKz0gcXNlbWkubwotb2JqLSQoQ09ORklHX1NNU0NfUEhZKQkJKz0gc21zYy5vCi1vYmotJChDT05GSUdfVEVSQU5FVElDU19QSFkpCSs9IHRlcmFuZXRpY3Mubwotb2JqLSQoQ09ORklHX1ZJVEVTU0VfUEhZKQkrPSB2aXRlc3NlLm8KLW9iai0kKENPTkZJR19CQ01fTkVUX1BIWUxJQikJKz0gYmNtLXBoeS1saWIubwotb2JqLSQoQ09ORklHX0JST0FEQ09NX1BIWSkJKz0gYnJvYWRjb20ubworb2JqLSQoQ09ORklHX0FUODAzWF9QSFkpCSs9IGF0ODAzeC5vCiBvYmotJChDT05GSUdfQkNNNjNYWF9QSFkpCSs9IGJjbTYzeHgubwogb2JqLSQoQ09ORklHX0JDTTdYWFhfUEhZKQkrPSBiY203eHh4Lm8KIG9iai0kKENPTkZJR19CQ004N1hYX1BIWSkJKz0gYmNtODd4eC5vCiBvYmotJChDT05GSUdfQkNNX0NZR05VU19QSFkpCSs9IGJjbS1jeWdudXMubwotb2JqLSQoQ09ORklHX0lDUExVU19QSFkpCSs9IGljcGx1cy5vCi1vYmotJChDT05GSUdfUkVBTFRFS19QSFkpCSs9IHJlYWx0ZWsubwotb2JqLSQoQ09ORklHX0xTSV9FVDEwMTFDX1BIWSkJKz0gZXQxMDExYy5vCi1vYmotJChDT05GSUdfRklYRURfUEhZKQkJKz0gZml4ZWRfcGh5Lm8KLW9iai0kKENPTkZJR19NRElPX0JJVEJBTkcpCSs9IG1kaW8tYml0YmFuZy5vCi1vYmotJChDT05GSUdfTURJT19HUElPKQkJKz0gbWRpby1ncGlvLm8KLW9iai0kKENPTkZJR19OQVRJT05BTF9QSFkpCSs9IG5hdGlvbmFsLm8KK29iai0kKENPTkZJR19CQ01fTkVUX1BIWUxJQikJKz0gYmNtLXBoeS1saWIubworb2JqLSQoQ09ORklHX0JST0FEQ09NX1BIWSkJKz0gYnJvYWRjb20ubworb2JqLSQoQ09ORklHX0NJQ0FEQV9QSFkpCSs9IGNpY2FkYS5vCitvYmotJChDT05GSUdfREFWSUNPTV9QSFkpCSs9IGRhdmljb20ubwogb2JqLSQoQ09ORklHX0RQODM2NDBfUEhZKQkrPSBkcDgzNjQwLm8KIG9iai0kKENPTkZJR19EUDgzODQ4X1BIWSkJKz0gZHA4Mzg0OC5vCiBvYmotJChDT05GSUdfRFA4Mzg2N19QSFkpCSs9IGRwODM4Njcubwotb2JqLSQoQ09ORklHX1NURTEwWFApCQkrPSBzdGUxMFhwLm8KLW9iai0kKENPTkZJR19NSUNSRUxfUEhZKQkrPSBtaWNyZWwubwotb2JqLSQoQ09ORklHX01ESU9fT0NURU9OKQkrPSBtZGlvLW9jdGVvbi5vCi1vYmotJChDT05GSUdfTURJT19USFVOREVSKQkrPSBtZGlvLXRodW5kZXIubwotb2JqLSQoQ09ORklHX01ESU9fQ0FWSVVNKQkrPSBtZGlvLWNhdml1bS5vCi1vYmotJChDT05GSUdfTUlDUkVMX0tTODk5NU1BKQkrPSBzcGlfa3M4OTk1Lm8KLW9iai0kKENPTkZJR19BVDgwM1hfUEhZKQkrPSBhdDgwM3gubwotb2JqLSQoQ09ORklHX0FNRF9QSFkpCQkrPSBhbWQubwotb2JqLSQoQ09ORklHX01ESU9fQlVTX01VWCkJKz0gbWRpby1tdXgubwotb2JqLSQoQ09ORklHX01ESU9fQlVTX01VWF9HUElPKQkrPSBtZGlvLW11eC1ncGlvLm8KLW9iai0kKENPTkZJR19NRElPX0JVU19NVVhfTU1JT1JFRykgKz0gbWRpby1tdXgtbW1pb3JlZy5vCi1vYmotJChDT05GSUdfTURJT19CVVNfTVVYX0JDTV9JUFJPQykJKz0gbWRpby1tdXgtYmNtLWlwcm9jLm8KLW9iai0kKENPTkZJR19NRElPX1NVTjRJKQkrPSBtZGlvLXN1bjRpLm8KLW9iai0kKENPTkZJR19NRElPX01PWEFSVCkJKz0gbWRpby1tb3hhcnQubwotb2JqLSQoQ09ORklHX01ESU9fQkNNX1VOSU1BQykJKz0gbWRpby1iY20tdW5pbWFjLm8KLW9iai0kKENPTkZJR19NSUNST0NISVBfUEhZKQkrPSBtaWNyb2NoaXAubwotb2JqLSQoQ09ORklHX01ESU9fQkNNX0lQUk9DKQkrPSBtZGlvLWJjbS1pcHJvYy5vCitvYmotJChDT05GSUdfRklYRURfUEhZKQkJKz0gZml4ZWRfcGh5Lm8KK29iai0kKENPTkZJR19JQ1BMVVNfUEhZKQkrPSBpY3BsdXMubwogb2JqLSQoQ09ORklHX0lOVEVMX1hXQVlfUEhZKQkrPSBpbnRlbC14d2F5Lm8KLW9iai0kKENPTkZJR19NRElPX0hJU0lfRkVNQUMpCSs9IG1kaW8taGlzaS1mZW1hYy5vCi1vYmotJChDT05GSUdfTURJT19YR0VORSkJKz0gbWRpby14Z2VuZS5vCitvYmotJChDT05GSUdfTFNJX0VUMTAxMUNfUEhZKQkrPSBldDEwMTFjLm8KK29iai0kKENPTkZJR19MWFRfUEhZKQkJKz0gbHh0Lm8KK29iai0kKENPTkZJR19NQVJWRUxMX1BIWSkJKz0gbWFydmVsbC5vCitvYmotJChDT05GSUdfTUlDUkVMX0tTODk5NU1BKQkrPSBzcGlfa3M4OTk1Lm8KK29iai0kKENPTkZJR19NSUNSRUxfUEhZKQkrPSBtaWNyZWwubworb2JqLSQoQ09ORklHX01JQ1JPQ0hJUF9QSFkpCSs9IG1pY3JvY2hpcC5vCitvYmotJChDT05GSUdfTUlDUk9TRU1JX1BIWSkJKz0gbXNjYy5vCitvYmotJChDT05GSUdfTkFUSU9OQUxfUEhZKQkrPSBuYXRpb25hbC5vCitvYmotJChDT05GSUdfUVNFTUlfUEhZKQkJKz0gcXNlbWkubworb2JqLSQoQ09ORklHX1JFQUxURUtfUEhZKQkrPSByZWFsdGVrLm8KK29iai0kKENPTkZJR19TTVNDX1BIWSkJCSs9IHNtc2Mubworb2JqLSQoQ09ORklHX1NURTEwWFApCQkrPSBzdGUxMFhwLm8KK29iai0kKENPTkZJR19URVJBTkVUSUNTX1BIWSkJKz0gdGVyYW5ldGljcy5vCitvYmotJChDT05GSUdfVklURVNTRV9QSFkpCSs9IHZpdGVzc2Uubworb2JqLSQoQ09ORklHX1hJTElOWF9HTUlJMlJHTUlJKSArPSB4aWxpbnhfZ21paTJyZ21paS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvbWRpby14Z2VuZS5jIGIvZHJpdmVycy9uZXQvcGh5L21kaW8teGdlbmUuYwppbmRleCA3NzU2NzQ4Li45MmFmMTgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvbWRpby14Z2VuZS5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9tZGlvLXhnZW5lLmMKQEAgLTQyNCwxMCArNDI0LDggQEAKIAltZGlvYnVzX3VucmVnaXN0ZXIobWRpb19idXMpOwogCW1kaW9idXNfZnJlZShtZGlvX2J1cyk7CiAKLQlpZiAoZGV2LT5vZl9ub2RlKSB7Ci0JCWlmIChJU19FUlIocGRhdGEtPmNsaykpCi0JCQljbGtfZGlzYWJsZV91bnByZXBhcmUocGRhdGEtPmNsayk7Ci0JfQorCWlmIChkZXYtPm9mX25vZGUpCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShwZGF0YS0+Y2xrKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L21pY3JlbC5jIGIvZHJpdmVycy9uZXQvcGh5L21pY3JlbC5jCmluZGV4IDE4ODJkOTguLjA4MWRmNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9taWNyZWwuYworKysgYi9kcml2ZXJzL25ldC9waHkvbWljcmVsLmMKQEAgLTQzOSw2ICs0MzksMTAgQEAKICNkZWZpbmUgTUlJX0tTWjkwMzFSTl9UWF9EQVRBX1BBRF9TS0VXCTYKICNkZWZpbmUgTUlJX0tTWjkwMzFSTl9DTEtfUEFEX1NLRVcJOAogCisvKiBNTUQgQWRkcmVzcyAweDFDICovCisjZGVmaW5lIE1JSV9LU1o5MDMxUk5fRURQRAkJMHgyMworI2RlZmluZSBNSUlfS1NaOTAzMVJOX0VEUERfRU5BQkxFCUJJVCgwKQorCiBzdGF0aWMgaW50IGtzejkwMzFfZXh0ZW5kZWRfd3JpdGUoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwKIAkJCQkgIHU4IG1vZGUsIHUzMiBkZXZfYWRkciwgdTMyIHJlZ251bSwgdTE2IHZhbCkKIHsKQEAgLTUxMCw2ICs1MTQsMTggQEAKIAlyZXR1cm4gZ2VucGh5X3Jlc3RhcnRfYW5lZyhwaHlkZXYpOwogfQogCisvKiBFbmFibGUgZW5lcmd5LWRldGVjdCBwb3dlci1kb3duIG1vZGUgKi8KK3N0YXRpYyBpbnQga3N6OTAzMV9lbmFibGVfZWRwZChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCWludCByZWc7CisKKwlyZWcgPSBrc3o5MDMxX2V4dGVuZGVkX3JlYWQocGh5ZGV2LCBPUF9EQVRBLCAweDFDLCBNSUlfS1NaOTAzMVJOX0VEUEQpOworCWlmIChyZWcgPCAwKQorCQlyZXR1cm4gcmVnOworCXJldHVybiBrc3o5MDMxX2V4dGVuZGVkX3dyaXRlKHBoeWRldiwgT1BfREFUQSwgMHgxQywgTUlJX0tTWjkwMzFSTl9FRFBELAorCQkJCSAgICAgIHJlZyB8IE1JSV9LU1o5MDMxUk5fRURQRF9FTkFCTEUpOworfQorCiBzdGF0aWMgaW50IGtzejkwMzFfY29uZmlnX2luaXQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKIHsKIAljb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGh5ZGV2LT5tZGlvLmRldjsKQEAgLTUyNSw2ICs1NDEsMTEgQEAKIAl9OwogCXN0YXRpYyBjb25zdCBjaGFyICpjb250cm9sX3NrZXdzWzJdID0geyJ0eGVuLXNrZXctcHMiLCAicnhkdi1za2V3LXBzIn07CiAJY29uc3Qgc3RydWN0IGRldmljZSAqZGV2X3dhbGtlcjsKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0ga3N6OTAzMV9lbmFibGVfZWRwZChwaHlkZXYpOworCWlmIChyZXN1bHQgPCAwKQorCQlyZXR1cm4gcmVzdWx0OwogCiAJLyogVGhlIE1pY3JlbCBkcml2ZXIgaGFzIGEgZGVwcmVjYXRlZCBvcHRpb24gdG8gcGxhY2UgcGh5IE9GCiAJICogcHJvcGVydGllcyBpbiB0aGUgTUFDIG5vZGUuIFdhbGsgdXAgdGhlIHRyZWUgb2YgZGV2aWNlcyB0bwpAQCAtNjc3LDE3ICs2OTgsMjggQEAKIAkJZGF0YVtpXSA9IGtzenBoeV9nZXRfc3RhdChwaHlkZXYsIGkpOwogfQogCitzdGF0aWMgaW50IGtzenBoeV9zdXNwZW5kKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCit7CisJLyogRGlzYWJsZSBQSFkgSW50ZXJydXB0cyAqLworCWlmIChwaHlfaW50ZXJydXB0X2lzX3ZhbGlkKHBoeWRldikpIHsKKwkJcGh5ZGV2LT5pbnRlcnJ1cHRzID0gUEhZX0lOVEVSUlVQVF9ESVNBQkxFRDsKKwkJaWYgKHBoeWRldi0+ZHJ2LT5jb25maWdfaW50cikKKwkJCXBoeWRldi0+ZHJ2LT5jb25maWdfaW50cihwaHlkZXYpOworCX0KKworCXJldHVybiBnZW5waHlfc3VzcGVuZChwaHlkZXYpOworfQorCiBzdGF0aWMgaW50IGtzenBoeV9yZXN1bWUoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKIHsKLQlpbnQgdmFsdWU7CisJZ2VucGh5X3Jlc3VtZShwaHlkZXYpOwogCi0JbXV0ZXhfbG9jaygmcGh5ZGV2LT5sb2NrKTsKLQotCXZhbHVlID0gcGh5X3JlYWQocGh5ZGV2LCBNSUlfQk1DUik7Ci0JcGh5X3dyaXRlKHBoeWRldiwgTUlJX0JNQ1IsIHZhbHVlICYgfkJNQ1JfUERPV04pOwotCi0Ja3N6cGh5X2NvbmZpZ19pbnRyKHBoeWRldik7Ci0JbXV0ZXhfdW5sb2NrKCZwaHlkZXYtPmxvY2spOworCS8qIEVuYWJsZSBQSFkgSW50ZXJydXB0cyAqLworCWlmIChwaHlfaW50ZXJydXB0X2lzX3ZhbGlkKHBoeWRldikpIHsKKwkJcGh5ZGV2LT5pbnRlcnJ1cHRzID0gUEhZX0lOVEVSUlVQVF9FTkFCTEVEOworCQlpZiAocGh5ZGV2LT5kcnYtPmNvbmZpZ19pbnRyKQorCQkJcGh5ZGV2LT5kcnYtPmNvbmZpZ19pbnRyKHBoeWRldik7CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC05MDAsNyArOTMyLDcgQEAKIAkuZ2V0X3NzZXRfY291bnQgPSBrc3pwaHlfZ2V0X3NzZXRfY291bnQsCiAJLmdldF9zdHJpbmdzCT0ga3N6cGh5X2dldF9zdHJpbmdzLAogCS5nZXRfc3RhdHMJPSBrc3pwaHlfZ2V0X3N0YXRzLAotCS5zdXNwZW5kCT0gZ2VucGh5X3N1c3BlbmQsCisJLnN1c3BlbmQJPSBrc3pwaHlfc3VzcGVuZCwKIAkucmVzdW1lCQk9IGtzenBoeV9yZXN1bWUsCiB9LCB7CiAJLnBoeV9pZAkJPSBQSFlfSURfS1NaODA2MSwKQEAgLTk1Myw3ICs5ODUsNyBAQAogCS5nZXRfc3RyaW5ncwk9IGtzenBoeV9nZXRfc3RyaW5ncywKIAkuZ2V0X3N0YXRzCT0ga3N6cGh5X2dldF9zdGF0cywKIAkuc3VzcGVuZAk9IGdlbnBoeV9zdXNwZW5kLAotCS5yZXN1bWUJCT0gZ2VucGh5X3Jlc3VtZSwKKwkucmVzdW1lCQk9IGtzenBoeV9yZXN1bWUsCiB9LCB7CiAJLnBoeV9pZAkJPSBQSFlfSURfS1NaODg3M01MTCwKIAkucGh5X2lkX21hc2sJPSBNSUNSRUxfUEhZX0lEX01BU0ssCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvbWljcm9jaGlwLmMgYi9kcml2ZXJzL25ldC9waHkvbWljcm9jaGlwLmMKaW5kZXggMTVmODIwNi4uN2MwMGU1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L21pY3JvY2hpcC5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9taWNyb2NoaXAuYwpAQCAtNTUsNyArNTUsNyBAQAogCXJldHVybiByYyA8IDAgPyByYyA6IDA7CiB9CiAKLWludCBsYW44OHh4X3N1c3BlbmQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3N0YXRpYyBpbnQgbGFuODh4eF9zdXNwZW5kKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCiB7CiAJc3RydWN0IGxhbjg4eHhfcHJpdiAqcHJpdiA9IHBoeWRldi0+cHJpdjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L21zY2MuYyBiL2RyaXZlcnMvbmV0L3BoeS9tc2NjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3NTczZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9tc2NjLmMKQEAgLTAsMCArMSwzMzcgQEAKKy8qCisgKiBEcml2ZXIgZm9yIE1pY3Jvc2VtaSBWU0M4NXh4IFBIWXMKKyAqCisgKiBBdXRob3I6IE5hZ2FyYWp1IExha2thcmFqdQorICogTGljZW5zZTogRHVhbCBNSVQvR1BMCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgTWljcm9zZW1pIENvcnBvcmF0aW9uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21kaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL25ldC9tc2NjLXBoeS12c2M4NTMxLmg+CisKK2VudW0gcmdtaWlfcnhfY2xvY2tfZGVsYXkgeworCVJHTUlJX1JYX0NMS19ERUxBWV8wXzJfTlMgPSAwLAorCVJHTUlJX1JYX0NMS19ERUxBWV8wXzhfTlMgPSAxLAorCVJHTUlJX1JYX0NMS19ERUxBWV8xXzFfTlMgPSAyLAorCVJHTUlJX1JYX0NMS19ERUxBWV8xXzdfTlMgPSAzLAorCVJHTUlJX1JYX0NMS19ERUxBWV8yXzBfTlMgPSA0LAorCVJHTUlJX1JYX0NMS19ERUxBWV8yXzNfTlMgPSA1LAorCVJHTUlJX1JYX0NMS19ERUxBWV8yXzZfTlMgPSA2LAorCVJHTUlJX1JYX0NMS19ERUxBWV8zXzRfTlMgPSA3Cit9OworCisvKiBNaWNyb3NlbWkgVlNDODV4eCBQSFkgcmVnaXN0ZXJzICovCisvKiBJRUVFIDgwMi4gU3RkIFJlZ2lzdGVycyAqLworI2RlZmluZSBNU0NDX1BIWV9FWFRfUEhZX0NOVExfMSAgICAgICAgICAgMjMKKyNkZWZpbmUgTUFDX0lGX1NFTEVDVElPTl9NQVNLICAgICAgICAgICAgIDB4MTgwMAorI2RlZmluZSBNQUNfSUZfU0VMRUNUSU9OX0dNSUkgICAgICAgICAgICAgMAorI2RlZmluZSBNQUNfSUZfU0VMRUNUSU9OX1JNSUkgICAgICAgICAgICAgMQorI2RlZmluZSBNQUNfSUZfU0VMRUNUSU9OX1JHTUlJICAgICAgICAgICAgMgorI2RlZmluZSBNQUNfSUZfU0VMRUNUSU9OX1BPUyAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgRkFSX0VORF9MT09QQkFDS19NT0RFX01BU0sgICAgICAgIDB4MDAwOAorCisjZGVmaW5lIE1JSV9WU0M4NVhYX0lOVF9NQVNLCQkgIDI1CisjZGVmaW5lIE1JSV9WU0M4NVhYX0lOVF9NQVNLX01BU0sJICAweGEwMDAKKyNkZWZpbmUgTUlJX1ZTQzg1WFhfSU5UX1NUQVRVUwkJICAyNgorCisjZGVmaW5lIE1TQ0NfUEhZX1dPTF9NQUNfQ09OVFJPTCAgICAgICAgICAyNworI2RlZmluZSBFREdFX1JBVEVfQ05UTF9QT1MgICAgICAgICAgICAgICAgNQorI2RlZmluZSBFREdFX1JBVEVfQ05UTF9NQVNLICAgICAgICAgICAgICAgMHgwMEUwCisKKyNkZWZpbmUgTVNDQ19FWFRfUEFHRV9BQ0NFU1MJCSAgMzEKKyNkZWZpbmUgTVNDQ19QSFlfUEFHRV9TVEFOREFSRAkJICAweDAwMDAgLyogU3RhbmRhcmQgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1TQ0NfUEhZX1BBR0VfRVhURU5ERURfMgkgIDB4MDAwMiAvKiBFeHRlbmRlZCByZWcgLSBwYWdlIDIgKi8KKworLyogRXh0ZW5kZWQgUGFnZSAyIFJlZ2lzdGVycyAqLworI2RlZmluZSBNU0NDX1BIWV9SR01JSV9DTlRMCQkgIDIwCisjZGVmaW5lIFJHTUlJX1JYX0NMS19ERUxBWV9NQVNLCQkgIDB4MDA3MAorI2RlZmluZSBSR01JSV9SWF9DTEtfREVMQVlfUE9TCQkgIDQKKworLyogTWljcm9zZW1pIFBIWSBJRCdzICovCisjZGVmaW5lIFBIWV9JRF9WU0M4NTMxCQkJICAweDAwMDcwNTcwCisjZGVmaW5lIFBIWV9JRF9WU0M4NTQxCQkJICAweDAwMDcwNzcwCisKK3N0cnVjdCBlZGdlX3JhdGVfdGFibGUgeworCXUxNiB2ZGRtYWM7CisJaW50IHNsb3dkb3duW01TQ0NfU0xPV0RPV05fTUFYXTsKK307CisKK3N0cnVjdCBlZGdlX3JhdGVfdGFibGUgZWRnZV90YWJsZVtNU0NDX1ZERE1BQ19NQVhdID0geworCXszMzAwLCB7IDAsIC0yLCAtNCwgIC03LCAgLTEwLCAtMTcsIC0yOSwgLTUzfSB9LAorCXsyNTAwLCB7IDAsIC0zLCAtNiwgIC0xMCwgLTE0LCAtMjMsIC0zNywgLTYzfSB9LAorCXsxODAwLCB7IDAsIC01LCAtOSwgIC0xNiwgLTIzLCAtMzUsIC01MiwgLTc2fSB9LAorCXsxNTAwLCB7IDAsIC02LCAtMTQsIC0yMSwgLTI5LCAtNDIsIC01OCwgLTc3fSB9LAorfTsKKworc3RydWN0IHZzYzg1MzFfcHJpdmF0ZSB7CisJdTggZWRnZV9zbG93ZG93bjsKKwl1MTYgdmRkbWFjOworfTsKKworc3RhdGljIGludCB2c2M4NXh4X3BoeV9wYWdlX3NldChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2LCB1OCBwYWdlKQoreworCWludCByYzsKKworCXJjID0gcGh5X3dyaXRlKHBoeWRldiwgTVNDQ19FWFRfUEFHRV9BQ0NFU1MsIHBhZ2UpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHU4IGVkZ2VfcmF0ZV9tYWdpY19nZXQodTE2IHZkZG1hYywKKwkJCSAgICAgIGludCBzbG93ZG93bikKK3sKKwlpbnQgcmMgPSAoTVNDQ19TTE9XRE9XTl9NQVggLSAxKTsKKwl1OCB2ZGQ7CisJdTggc2Q7CisKKwlmb3IgKHZkZCA9IDA7IHZkZCA8IE1TQ0NfVkRETUFDX01BWDsgdmRkKyspIHsKKwkJaWYgKGVkZ2VfdGFibGVbdmRkXS52ZGRtYWMgPT0gdmRkbWFjKSB7CisJCQlmb3IgKHNkID0gMDsgc2QgPCBNU0NDX1NMT1dET1dOX01BWDsgc2QrKykgeworCQkJCWlmIChlZGdlX3RhYmxlW3ZkZF0uc2xvd2Rvd25bc2RdIDw9IHNsb3dkb3duKSB7CisJCQkJCXJjID0gKE1TQ0NfU0xPV0RPV05fTUFYIC0gc2QgLSAxKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHZzYzg1eHhfZWRnZV9yYXRlX2NudGxfc2V0KHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYsCisJCQkJICAgICAgdTggZWRnZV9yYXRlKQoreworCWludCByYzsKKwl1MTYgcmVnX3ZhbDsKKworCW11dGV4X2xvY2soJnBoeWRldi0+bG9jayk7CisJcmMgPSB2c2M4NXh4X3BoeV9wYWdlX3NldChwaHlkZXYsIE1TQ0NfUEhZX1BBR0VfRVhURU5ERURfMik7CisJaWYgKHJjICE9IDApCisJCWdvdG8gb3V0X3VubG9jazsKKwlyZWdfdmFsID0gcGh5X3JlYWQocGh5ZGV2LCBNU0NDX1BIWV9XT0xfTUFDX0NPTlRST0wpOworCXJlZ192YWwgJj0gfihFREdFX1JBVEVfQ05UTF9NQVNLKTsKKwlyZWdfdmFsIHw9IChlZGdlX3JhdGUgPDwgRURHRV9SQVRFX0NOVExfUE9TKTsKKwlyYyA9IHBoeV93cml0ZShwaHlkZXYsIE1TQ0NfUEhZX1dPTF9NQUNfQ09OVFJPTCwgcmVnX3ZhbCk7CisJaWYgKHJjICE9IDApCisJCWdvdG8gb3V0X3VubG9jazsKKwlyYyA9IHZzYzg1eHhfcGh5X3BhZ2Vfc2V0KHBoeWRldiwgTVNDQ19QSFlfUEFHRV9TVEFOREFSRCk7CisKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZwaHlkZXYtPmxvY2spOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHZzYzg1eHhfbWFjX2lmX3NldChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2LAorCQkJICAgICAgcGh5X2ludGVyZmFjZV90IGludGVyZmFjZSkKK3sKKwlpbnQgcmM7CisJdTE2IHJlZ192YWw7CisKKwltdXRleF9sb2NrKCZwaHlkZXYtPmxvY2spOworCXJlZ192YWwgPSBwaHlfcmVhZChwaHlkZXYsIE1TQ0NfUEhZX0VYVF9QSFlfQ05UTF8xKTsKKwlyZWdfdmFsICY9IH4oTUFDX0lGX1NFTEVDVElPTl9NQVNLKTsKKwlzd2l0Y2ggKGludGVyZmFjZSkgeworCWNhc2UgUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJOgorCQlyZWdfdmFsIHw9IChNQUNfSUZfU0VMRUNUSU9OX1JHTUlJIDw8IE1BQ19JRl9TRUxFQ1RJT05fUE9TKTsKKwkJYnJlYWs7CisJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfUk1JSToKKwkJcmVnX3ZhbCB8PSAoTUFDX0lGX1NFTEVDVElPTl9STUlJIDw8IE1BQ19JRl9TRUxFQ1RJT05fUE9TKTsKKwkJYnJlYWs7CisJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfTUlJOgorCWNhc2UgUEhZX0lOVEVSRkFDRV9NT0RFX0dNSUk6CisJCXJlZ192YWwgfD0gKE1BQ19JRl9TRUxFQ1RJT05fR01JSSA8PCBNQUNfSUZfU0VMRUNUSU9OX1BPUyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwlyYyA9IHBoeV93cml0ZShwaHlkZXYsIE1TQ0NfUEhZX0VYVF9QSFlfQ05UTF8xLCByZWdfdmFsKTsKKwlpZiAocmMgIT0gMCkKKwkJZ290byBvdXRfdW5sb2NrOworCisJcmMgPSBnZW5waHlfc29mdF9yZXNldChwaHlkZXYpOworCitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmcGh5ZGV2LT5sb2NrKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB2c2M4NXh4X2RlZmF1bHRfY29uZmlnKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCit7CisJaW50IHJjOworCXUxNiByZWdfdmFsOworCisJbXV0ZXhfbG9jaygmcGh5ZGV2LT5sb2NrKTsKKwlyYyA9IHZzYzg1eHhfcGh5X3BhZ2Vfc2V0KHBoeWRldiwgTVNDQ19QSFlfUEFHRV9FWFRFTkRFRF8yKTsKKwlpZiAocmMgIT0gMCkKKwkJZ290byBvdXRfdW5sb2NrOworCisJcmVnX3ZhbCA9IHBoeV9yZWFkKHBoeWRldiwgTVNDQ19QSFlfUkdNSUlfQ05UTCk7CisJcmVnX3ZhbCAmPSB+KFJHTUlJX1JYX0NMS19ERUxBWV9NQVNLKTsKKwlyZWdfdmFsIHw9IChSR01JSV9SWF9DTEtfREVMQVlfMV8xX05TIDw8IFJHTUlJX1JYX0NMS19ERUxBWV9QT1MpOworCXBoeV93cml0ZShwaHlkZXYsIE1TQ0NfUEhZX1JHTUlJX0NOVEwsIHJlZ192YWwpOworCXJjID0gdnNjODV4eF9waHlfcGFnZV9zZXQocGh5ZGV2LCBNU0NDX1BIWV9QQUdFX1NUQU5EQVJEKTsKKworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJnBoeWRldi0+bG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKKyNpZmRlZiBDT05GSUdfT0ZfTURJTworc3RhdGljIGludCB2c2M4NTMxX29mX2luaXQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwlpbnQgcmM7CisJc3RydWN0IHZzYzg1MzFfcHJpdmF0ZSAqdnNjODUzMSA9IHBoeWRldi0+cHJpdjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGh5ZGV2LT5tZGlvLmRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGUgPSBkZXYtPm9mX25vZGU7CisKKwlpZiAoIW9mX25vZGUpCisJCXJldHVybiAtRU5PREVWOworCisJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UxNihvZl9ub2RlLCAidnNjODUzMSx2ZGRtYWMiLAorCQkJCSAgJnZzYzg1MzEtPnZkZG1hYyk7CisJaWYgKHJjID09IC1FSU5WQUwpCisJCXZzYzg1MzEtPnZkZG1hYyA9IE1TQ0NfVkRETUFDXzMzMDA7CisJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3U4KG9mX25vZGUsICJ2c2M4NTMxLGVkZ2Utc2xvd2Rvd24iLAorCQkJCSAmdnNjODUzMS0+ZWRnZV9zbG93ZG93bik7CisJaWYgKHJjID09IC1FSU5WQUwpCisJCXZzYzg1MzEtPmVkZ2Vfc2xvd2Rvd24gPSAwOworCisJcmMgPSAwOworCXJldHVybiByYzsKK30KKyNlbHNlCitzdGF0aWMgaW50IHZzYzg1MzFfb2ZfaW5pdChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19PRl9NRElPICovCisKK3N0YXRpYyBpbnQgdnNjODV4eF9jb25maWdfaW5pdChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCWludCByYzsKKwlzdHJ1Y3QgdnNjODUzMV9wcml2YXRlICp2c2M4NTMxID0gcGh5ZGV2LT5wcml2OworCXU4IGVkZ2VfcmF0ZTsKKworCXJjID0gdnNjODUzMV9vZl9pbml0KHBoeWRldik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IHZzYzg1eHhfZGVmYXVsdF9jb25maWcocGh5ZGV2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gdnNjODV4eF9tYWNfaWZfc2V0KHBoeWRldiwgcGh5ZGV2LT5pbnRlcmZhY2UpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJZWRnZV9yYXRlID0gZWRnZV9yYXRlX21hZ2ljX2dldCh2c2M4NTMxLT52ZGRtYWMsCisJCQkJCS0oaW50KXZzYzg1MzEtPmVkZ2Vfc2xvd2Rvd24pOworCXJjID0gdnNjODV4eF9lZGdlX3JhdGVfY250bF9zZXQocGh5ZGV2LCBlZGdlX3JhdGUpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBnZW5waHlfY29uZmlnX2luaXQocGh5ZGV2KTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB2c2M4NXh4X2Fja19pbnRlcnJ1cHQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKHBoeWRldi0+aW50ZXJydXB0cyA9PSBQSFlfSU5URVJSVVBUX0VOQUJMRUQpCisJCXJjID0gcGh5X3JlYWQocGh5ZGV2LCBNSUlfVlNDODVYWF9JTlRfU1RBVFVTKTsKKworCXJldHVybiAocmMgPCAwKSA/IHJjIDogMDsKK30KKworc3RhdGljIGludCB2c2M4NXh4X2NvbmZpZ19pbnRyKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCit7CisJaW50IHJjOworCisJaWYgKHBoeWRldi0+aW50ZXJydXB0cyA9PSBQSFlfSU5URVJSVVBUX0VOQUJMRUQpIHsKKwkJcmMgPSBwaHlfd3JpdGUocGh5ZGV2LCBNSUlfVlNDODVYWF9JTlRfTUFTSywKKwkJCSAgICAgICBNSUlfVlNDODVYWF9JTlRfTUFTS19NQVNLKTsKKwl9IGVsc2UgeworCQlyYyA9IHBoeV93cml0ZShwaHlkZXYsIE1JSV9WU0M4NVhYX0lOVF9NQVNLLCAwKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKwkJcmMgPSBwaHlfcmVhZChwaHlkZXYsIE1JSV9WU0M4NVhYX0lOVF9TVEFUVVMpOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB2c2M4NXh4X3Byb2JlKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCit7CisJc3RydWN0IHZzYzg1MzFfcHJpdmF0ZSAqdnNjODUzMTsKKworCXZzYzg1MzEgPSBkZXZtX2t6YWxsb2MoJnBoeWRldi0+bWRpby5kZXYsIHNpemVvZigqdnNjODUzMSksIEdGUF9LRVJORUwpOworCWlmICghdnNjODUzMSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwaHlkZXYtPnByaXYgPSB2c2M4NTMxOworCisJcmV0dXJuIDA7Cit9CisKKy8qIE1pY3Jvc2VtaSBWU0M4NXh4IFBIWXMgKi8KK3N0YXRpYyBzdHJ1Y3QgcGh5X2RyaXZlciB2c2M4NXh4X2RyaXZlcltdID0geworeworCS5waHlfaWQJCT0gUEhZX0lEX1ZTQzg1MzEsCisJLm5hbWUJCT0gIk1pY3Jvc2VtaSBWU0M4NTMxIiwKKwkucGh5X2lkX21hc2sgICAgPSAweGZmZmZmZmYwLAorCS5mZWF0dXJlcwk9IFBIWV9HQklUX0ZFQVRVUkVTLAorCS5mbGFncwkJPSBQSFlfSEFTX0lOVEVSUlVQVCwKKwkuc29mdF9yZXNldAk9ICZnZW5waHlfc29mdF9yZXNldCwKKwkuY29uZmlnX2luaXQgICAgPSAmdnNjODV4eF9jb25maWdfaW5pdCwKKwkuY29uZmlnX2FuZWcgICAgPSAmZ2VucGh5X2NvbmZpZ19hbmVnLAorCS5hbmVnX2RvbmUJPSAmZ2VucGh5X2FuZWdfZG9uZSwKKwkucmVhZF9zdGF0dXMgICAgPSAmZ2VucGh5X3JlYWRfc3RhdHVzLAorCS5hY2tfaW50ZXJydXB0ICA9ICZ2c2M4NXh4X2Fja19pbnRlcnJ1cHQsCisJLmNvbmZpZ19pbnRyICAgID0gJnZzYzg1eHhfY29uZmlnX2ludHIsCisJLnN1c3BlbmQJPSAmZ2VucGh5X3N1c3BlbmQsCisJLnJlc3VtZQkJPSAmZ2VucGh5X3Jlc3VtZSwKKwkucHJvYmUgICAgICAgICAgPSAmdnNjODV4eF9wcm9iZSwKK30sCit7CisJLnBoeV9pZAkJPSBQSFlfSURfVlNDODU0MSwKKwkubmFtZQkJPSAiTWljcm9zZW1pIFZTQzg1NDEgU3luY0UiLAorCS5waHlfaWRfbWFzayAgICA9IDB4ZmZmZmZmZjAsCisJLmZlYXR1cmVzCT0gUEhZX0dCSVRfRkVBVFVSRVMsCisJLmZsYWdzCQk9IFBIWV9IQVNfSU5URVJSVVBULAorCS5zb2Z0X3Jlc2V0CT0gJmdlbnBoeV9zb2Z0X3Jlc2V0LAorCS5jb25maWdfaW5pdCAgICA9ICZ2c2M4NXh4X2NvbmZpZ19pbml0LAorCS5jb25maWdfYW5lZyAgICA9ICZnZW5waHlfY29uZmlnX2FuZWcsCisJLmFuZWdfZG9uZQk9ICZnZW5waHlfYW5lZ19kb25lLAorCS5yZWFkX3N0YXR1cyAgICA9ICZnZW5waHlfcmVhZF9zdGF0dXMsCisJLmFja19pbnRlcnJ1cHQgID0gJnZzYzg1eHhfYWNrX2ludGVycnVwdCwKKwkuY29uZmlnX2ludHIgICAgPSAmdnNjODV4eF9jb25maWdfaW50ciwKKwkuc3VzcGVuZAk9ICZnZW5waHlfc3VzcGVuZCwKKwkucmVzdW1lCQk9ICZnZW5waHlfcmVzdW1lLAorCS5wcm9iZSAgICAgICAgICA9ICZ2c2M4NXh4X3Byb2JlLAorfQorCit9OworCittb2R1bGVfcGh5X2RyaXZlcih2c2M4NXh4X2RyaXZlcik7CisKK3N0YXRpYyBzdHJ1Y3QgbWRpb19kZXZpY2VfaWQgX19tYXliZV91bnVzZWQgdnNjODV4eF90YmxbXSA9IHsKKwl7IFBIWV9JRF9WU0M4NTMxLCAweGZmZmZmZmYwLCB9LAorCXsgUEhZX0lEX1ZTQzg1NDEsIDB4ZmZmZmZmZjAsIH0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKG1kaW8sIHZzYzg1eHhfdGJsKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJNaWNyb3NlbWkgVlNDODV4eCBQSFkgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJOYWdhcmFqdSBMYWtrYXJhanUiKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIE1JVC9HUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9waHkuYyBiL2RyaXZlcnMvbmV0L3BoeS9waHkuYwppbmRleCBjNWRjMmMzNi4uYzZmNjY4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9waHkuYwpAQCAtNzIyLDggKzcyMiwxMCBAQAogaW50IHBoeV9zdGFydF9pbnRlcnJ1cHRzKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCiB7CiAJYXRvbWljX3NldCgmcGh5ZGV2LT5pcnFfZGlzYWJsZSwgMCk7Ci0JaWYgKHJlcXVlc3RfaXJxKHBoeWRldi0+aXJxLCBwaHlfaW50ZXJydXB0LCAwLCAicGh5X2ludGVycnVwdCIsCi0JCQlwaHlkZXYpIDwgMCkgeworCWlmIChyZXF1ZXN0X2lycShwaHlkZXYtPmlycSwgcGh5X2ludGVycnVwdCwKKwkJCQlJUlFGX1NIQVJFRCwKKwkJCQkicGh5X2ludGVycnVwdCIsCisJCQkJcGh5ZGV2KSA8IDApIHsKIAkJcHJfd2FybigiJXM6IENhbid0IGdldCBJUlEgJWQgKFBIWSlcbiIsCiAJCQlwaHlkZXYtPm1kaW8uYnVzLT5uYW1lLCBwaHlkZXYtPmlycSk7CiAJCXBoeWRldi0+aXJxID0gUEhZX1BPTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkveGlsaW54X2dtaWkycmdtaWkuYyBiL2RyaXZlcnMvbmV0L3BoeS94aWxpbnhfZ21paTJyZ21paS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNWRkMzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9waHkveGlsaW54X2dtaWkycmdtaWkuYwpAQCAtMCwwICsxLDExMiBAQAorLyogWGlsaW54IEdNSUkyUkdNSUkgQ29udmVydGVyIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBYaWxpbngsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxNiBBbmRyZXcgTHVubiA8YW5kcmV3QGx1bm4uY2g+CisgKgorICogQXV0aG9yOiBBbmRyZXcgTHVubiA8YW5kcmV3QGx1bm4uY2g+CisgKiBBdXRob3I6IEtlZGFyZXN3YXJhIHJhbyBBcHBhbmEgPGFwcGFuYWRAeGlsaW54LmNvbT4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZHJpdmVyIGlzIGRldmVsb3BlZCBmb3IgWGlsaW54IEdNSUkyUkdNSUkgQ29udmVydGVyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvbWRpby5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX21kaW8uaD4KKworI2RlZmluZSBYSUxJTlhfR01JSTJSR01JSV9SRUcJCTB4MTAKKyNkZWZpbmUgWElMSU5YX0dNSUkyUkdNSUlfU1BFRURfTUFTSwkoQk1DUl9TUEVFRDEwMDAgfCBCTUNSX1NQRUVEMTAwKQorCitzdHJ1Y3QgZ21paTJyZ21paSB7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeV9kZXY7CisJc3RydWN0IHBoeV9kcml2ZXIgKnBoeV9kcnY7CisJc3RydWN0IHBoeV9kcml2ZXIgY29udl9waHlfZHJ2OworCWludCBhZGRyOworfTsKKworc3RhdGljIGludCB4Z21paXRvcmdtaWlfcmVhZF9zdGF0dXMoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwlzdHJ1Y3QgZ21paTJyZ21paSAqcHJpdiA9IHBoeWRldi0+cHJpdjsKKwl1MTYgdmFsID0gMDsKKworCXByaXYtPnBoeV9kcnYtPnJlYWRfc3RhdHVzKHBoeWRldik7CisKKwl2YWwgPSBtZGlvYnVzX3JlYWQocGh5ZGV2LT5tZGlvLmJ1cywgcHJpdi0+YWRkciwgWElMSU5YX0dNSUkyUkdNSUlfUkVHKTsKKwl2YWwgJj0gWElMSU5YX0dNSUkyUkdNSUlfU1BFRURfTUFTSzsKKworCWlmIChwaHlkZXYtPnNwZWVkID09IFNQRUVEXzEwMDApCisJCXZhbCB8PSBCTUNSX1NQRUVEMTAwMDsKKwllbHNlIGlmIChwaHlkZXYtPnNwZWVkID09IFNQRUVEXzEwMCkKKwkJdmFsIHw9IEJNQ1JfU1BFRUQxMDA7CisJZWxzZQorCQl2YWwgfD0gQk1DUl9TUEVFRDEwOworCisJbWRpb2J1c193cml0ZShwaHlkZXYtPm1kaW8uYnVzLCBwcml2LT5hZGRyLCBYSUxJTlhfR01JSTJSR01JSV9SRUcsIHZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4Z21paXRvcmdtaWlfcHJvYmUoc3RydWN0IG1kaW9fZGV2aWNlICptZGlvZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZtZGlvZGV2LT5kZXY7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZSwgKnBoeV9ub2RlOworCXN0cnVjdCBnbWlpMnJnbWlpICpwcml2OworCisJcHJpdiA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwaHlfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUobnAsICJwaHktaGFuZGxlIiwgMCk7CisJaWYgKCFwaHlfbm9kZSkgeworCQlkZXZfZXJyKGRldiwgIkNvdWxkbid0IHBhcnNlIHBoeS1oYW5kbGVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwcml2LT5waHlfZGV2ID0gb2ZfcGh5X2ZpbmRfZGV2aWNlKHBoeV9ub2RlKTsKKwlvZl9ub2RlX3B1dChwaHlfbm9kZSk7CisJaWYgKCFwcml2LT5waHlfZGV2KSB7CisJCWRldl9pbmZvKGRldiwgIkNvdWxkbid0IGZpbmQgcGh5ZGV2XG4iKTsKKwkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJfQorCisJcHJpdi0+YWRkciA9IG1kaW9kZXYtPmFkZHI7CisJcHJpdi0+cGh5X2RydiA9IHByaXYtPnBoeV9kZXYtPmRydjsKKwltZW1jcHkoJnByaXYtPmNvbnZfcGh5X2RydiwgcHJpdi0+cGh5X2Rldi0+ZHJ2LAorCSAgICAgICBzaXplb2Yoc3RydWN0IHBoeV9kcml2ZXIpKTsKKwlwcml2LT5jb252X3BoeV9kcnYucmVhZF9zdGF0dXMgPSB4Z21paXRvcmdtaWlfcmVhZF9zdGF0dXM7CisJcHJpdi0+cGh5X2Rldi0+cHJpdiA9IHByaXY7CisJcHJpdi0+cGh5X2Rldi0+ZHJ2ID0gJnByaXYtPmNvbnZfcGh5X2RydjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB4Z21paXRvcmdtaWlfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInhsbngsZ21paS10by1yZ21paS0xLjAiIH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgeGdtaWl0b3JnbWlpX29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBtZGlvX2RyaXZlciB4Z21paXRvcmdtaWlfZHJpdmVyID0geworCS5wcm9iZQk9IHhnbWlpdG9yZ21paV9wcm9iZSwKKwkubWRpb2Rydi5kcml2ZXIgPSB7CisJCS5uYW1lID0gInhnbWlpdG9yZ21paSIsCisJCS5vZl9tYXRjaF90YWJsZSA9IHhnbWlpdG9yZ21paV9vZl9tYXRjaCwKKwl9LAorfTsKKworbWRpb19tb2R1bGVfZHJpdmVyKHhnbWlpdG9yZ21paV9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlhpbGlueCBHTUlJMlJHTUlJIGNvbnZlcnRlciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BwcC9wcHBfZ2VuZXJpYy5jIGIvZHJpdmVycy9uZXQvcHBwL3BwcF9nZW5lcmljLmMKaW5kZXggZjIyNmRiNC4uNTQ4OWMwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcHBwL3BwcF9nZW5lcmljLmMKKysrIGIvZHJpdmVycy9uZXQvcHBwL3BwcF9nZW5lcmljLmMKQEAgLTExMDMsNiArMTEwMywxNSBAQAogCX0KIAogCWNvbmYuZmlsZSA9IGZpbGU7CisKKwkvKiBEb24ndCB1c2UgZGV2aWNlIG5hbWUgZ2VuZXJhdGVkIGJ5IHRoZSBydG5ldGxpbmsgbGF5ZXIgd2hlbiBpZm5hbWUKKwkgKiBpc24ndCBzcGVjaWZpZWQuIExldCBwcHBfZGV2X2NvbmZpZ3VyZSgpIHNldCB0aGUgZGV2aWNlIG5hbWUgdXNpbmcKKwkgKiB0aGUgUFBQIHVuaXQgaWRlbnRpZmVyIGFzIHN1ZmZpeCAoaS5lLiBwcHA8dW5pdF9pZD4pLiBUaGlzIGFsbG93cworCSAqIHVzZXJzcGFjZSB0byBpbmZlciB0aGUgZGV2aWNlIG5hbWUgdXNpbmcgdG8gdGhlIFBQUElPQ0dVTklUIGlvY3RsLgorCSAqLworCWlmICghdGJbSUZMQV9JRk5BTUVdKQorCQljb25mLmlmbmFtZV9pc19zZXQgPSBmYWxzZTsKKwogCWVyciA9IHBwcF9kZXZfY29uZmlndXJlKHNyY19uZXQsIGRldiwgJmNvbmYpOwogCiBvdXRfdW5sb2NrOgpAQCAtMTM1NCw2ICsxMzYzLDggQEAKIAlkZXYtPm5ldGRldl9vcHMgPSAmcHBwX25ldGRldl9vcHM7CiAJU0VUX05FVERFVl9ERVZUWVBFKGRldiwgJnBwcF90eXBlKTsKIAorCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9MTFRYOworCiAJZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSBQUFBfSERSTEVOOwogCWRldi0+bXR1ID0gUFBQX01SVTsKIAlkZXYtPmFkZHJfbGVuID0gMDsKQEAgLTEzNjcsMTIgKzEzNzgsOCBAQAogICogVHJhbnNtaXQtc2lkZSByb3V0aW5lcy4KICAqLwogCi0vKgotICogQ2FsbGVkIHRvIGRvIGFueSB3b3JrIHF1ZXVlZCB1cCBvbiB0aGUgdHJhbnNtaXQgc2lkZQotICogdGhhdCBjYW4gbm93IGJlIGRvbmUuCi0gKi8KLXN0YXRpYyB2b2lkCi1wcHBfeG1pdF9wcm9jZXNzKHN0cnVjdCBwcHAgKnBwcCkKKy8qIENhbGxlZCB0byBkbyBhbnkgd29yayBxdWV1ZWQgdXAgb24gdGhlIHRyYW5zbWl0IHNpZGUgdGhhdCBjYW4gbm93IGJlIGRvbmUgKi8KK3N0YXRpYyB2b2lkIF9fcHBwX3htaXRfcHJvY2VzcyhzdHJ1Y3QgcHBwICpwcHApCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIApAQCAtMTM5Miw2ICsxMzk5LDMwIEBACiAJcHBwX3htaXRfdW5sb2NrKHBwcCk7CiB9CiAKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIHBwcF94bWl0X3JlY3Vyc2lvbik7CisKK3N0YXRpYyB2b2lkIHBwcF94bWl0X3Byb2Nlc3Moc3RydWN0IHBwcCAqcHBwKQoreworCWxvY2FsX2JoX2Rpc2FibGUoKTsKKworCWlmICh1bmxpa2VseShfX3RoaXNfY3B1X3JlYWQocHBwX3htaXRfcmVjdXJzaW9uKSkpCisJCWdvdG8gZXJyOworCisJX190aGlzX2NwdV9pbmMocHBwX3htaXRfcmVjdXJzaW9uKTsKKwlfX3BwcF94bWl0X3Byb2Nlc3MocHBwKTsKKwlfX3RoaXNfY3B1X2RlYyhwcHBfeG1pdF9yZWN1cnNpb24pOworCisJbG9jYWxfYmhfZW5hYmxlKCk7CisKKwlyZXR1cm47CisKK2VycjoKKwlsb2NhbF9iaF9lbmFibGUoKTsKKworCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCW5ldGRldl9lcnIocHBwLT5kZXYsICJyZWN1cnNpb24gZGV0ZWN0ZWRcbiIpOworfQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICoKIHBhZF9jb21wcmVzc19za2Ioc3RydWN0IHBwcCAqcHBwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtMTg0NywxMSArMTg3OCw4IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX1BQUF9NVUxUSUxJTksgKi8KIAotLyoKLSAqIFRyeSB0byBzZW5kIGRhdGEgb3V0IG9uIGEgY2hhbm5lbC4KLSAqLwotc3RhdGljIHZvaWQKLXBwcF9jaGFubmVsX3B1c2goc3RydWN0IGNoYW5uZWwgKnBjaCkKKy8qIFRyeSB0byBzZW5kIGRhdGEgb3V0IG9uIGEgY2hhbm5lbCAqLworc3RhdGljIHZvaWQgX19wcHBfY2hhbm5lbF9wdXNoKHN0cnVjdCBjaGFubmVsICpwY2gpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgcHBwICpwcHA7CkBAIC0xODc2LDExICsxOTA0LDIyIEBACiAJCXJlYWRfbG9ja19iaCgmcGNoLT51cGwpOwogCQlwcHAgPSBwY2gtPnBwcDsKIAkJaWYgKHBwcCkKLQkJCXBwcF94bWl0X3Byb2Nlc3MocHBwKTsKKwkJCV9fcHBwX3htaXRfcHJvY2VzcyhwcHApOwogCQlyZWFkX3VubG9ja19iaCgmcGNoLT51cGwpOwogCX0KIH0KIAorc3RhdGljIHZvaWQgcHBwX2NoYW5uZWxfcHVzaChzdHJ1Y3QgY2hhbm5lbCAqcGNoKQoreworCWxvY2FsX2JoX2Rpc2FibGUoKTsKKworCV9fdGhpc19jcHVfaW5jKHBwcF94bWl0X3JlY3Vyc2lvbik7CisJX19wcHBfY2hhbm5lbF9wdXNoKHBjaCk7CisJX190aGlzX2NwdV9kZWMocHBwX3htaXRfcmVjdXJzaW9uKTsKKworCWxvY2FsX2JoX2VuYWJsZSgpOworfQorCiAvKgogICogUmVjZWl2ZS1zaWRlIHJvdXRpbmVzLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wcHAvcHB0cC5jIGIvZHJpdmVycy9uZXQvcHBwL3BwdHAuYwppbmRleCBhZTA5MDVlLi4xOTUxYjEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wcHAvcHB0cC5jCisrKyBiL2RyaXZlcnMvbmV0L3BwcC9wcHRwLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxuZXQvaWNtcC5oPgogI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgogI2luY2x1ZGUgPG5ldC9ncmUuaD4KKyNpbmNsdWRlIDxuZXQvcHB0cC5oPgogCiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCkBAIC01Myw0MSArNTQsNiBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBwcHBfY2hhbm5lbF9vcHMgcHB0cF9jaGFuX29wczsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcHJvdG9fb3BzIHBwdHBfb3BzOwogCi0jZGVmaW5lIFBQUF9MQ1BfRUNIT1JFUSAweDA5Ci0jZGVmaW5lIFBQUF9MQ1BfRUNIT1JFUCAweDBBCi0jZGVmaW5lIFNDX1JDVl9CSVRTCShTQ19SQ1ZfQjdfMXxTQ19SQ1ZfQjdfMHxTQ19SQ1ZfT0REUHxTQ19SQ1ZfRVZOUCkKLQotI2RlZmluZSBNSVNTSU5HX1dJTkRPVyAyMAotI2RlZmluZSBXUkFQUEVEKGN1cnNlcSwgbGFzdHNlcSlcCi0JKCgoKGN1cnNlcSkgJiAweGZmZmZmZjAwKSA9PSAwKSAmJlwKLQkoKChsYXN0c2VxKSAmIDB4ZmZmZmZmMDApID09IDB4ZmZmZmZmMDApKQotCi0jZGVmaW5lIFBQVFBfR1JFX1BST1RPICAweDg4MEIKLSNkZWZpbmUgUFBUUF9HUkVfVkVSICAgIDB4MQotCi0jZGVmaW5lIFBQVFBfR1JFX0ZMQUdfQwkweDgwCi0jZGVmaW5lIFBQVFBfR1JFX0ZMQUdfUgkweDQwCi0jZGVmaW5lIFBQVFBfR1JFX0ZMQUdfSwkweDIwCi0jZGVmaW5lIFBQVFBfR1JFX0ZMQUdfUwkweDEwCi0jZGVmaW5lIFBQVFBfR1JFX0ZMQUdfQQkweDgwCi0KLSNkZWZpbmUgUFBUUF9HUkVfSVNfQyhmKSAoKGYpJlBQVFBfR1JFX0ZMQUdfQykKLSNkZWZpbmUgUFBUUF9HUkVfSVNfUihmKSAoKGYpJlBQVFBfR1JFX0ZMQUdfUikKLSNkZWZpbmUgUFBUUF9HUkVfSVNfSyhmKSAoKGYpJlBQVFBfR1JFX0ZMQUdfSykKLSNkZWZpbmUgUFBUUF9HUkVfSVNfUyhmKSAoKGYpJlBQVFBfR1JFX0ZMQUdfUykKLSNkZWZpbmUgUFBUUF9HUkVfSVNfQShmKSAoKGYpJlBQVFBfR1JFX0ZMQUdfQSkKLQotI2RlZmluZSBQUFRQX0hFQURFUl9PVkVSSEVBRCAoMitzaXplb2Yoc3RydWN0IHBwdHBfZ3JlX2hlYWRlcikpCi1zdHJ1Y3QgcHB0cF9ncmVfaGVhZGVyIHsKLQl1OCAgZmxhZ3M7Ci0JdTggIHZlcjsKLQlfX2JlMTYgcHJvdG9jb2w7Ci0JX19iZTE2IHBheWxvYWRfbGVuOwotCV9fYmUxNiBjYWxsX2lkOwotCV9fYmUzMiBzZXE7Ci0JX19iZTMyIGFjazsKLX0gX19wYWNrZWQ7Ci0KIHN0YXRpYyBzdHJ1Y3QgcHBwb3hfc29jayAqbG9va3VwX2NoYW4odTE2IGNhbGxfaWQsIF9fYmUzMiBzX2FkZHIpCiB7CiAJc3RydWN0IHBwcG94X3NvY2sgKnNvY2s7CkBAIC0yNDAsMTYgKzIwNiwxNCBAQAogCXNrYl9wdXNoKHNrYiwgaGVhZGVyX2xlbik7CiAJaGRyID0gKHN0cnVjdCBwcHRwX2dyZV9oZWFkZXIgKikoc2tiLT5kYXRhKTsKIAotCWhkci0+ZmxhZ3MgICAgICAgPSBQUFRQX0dSRV9GTEFHX0s7Ci0JaGRyLT52ZXIgICAgICAgICA9IFBQVFBfR1JFX1ZFUjsKLQloZHItPnByb3RvY29sICAgID0gaHRvbnMoUFBUUF9HUkVfUFJPVE8pOwotCWhkci0+Y2FsbF9pZCAgICAgPSBodG9ucyhvcHQtPmRzdF9hZGRyLmNhbGxfaWQpOworCWhkci0+Z3JlX2hkLmZsYWdzID0gR1JFX0tFWSB8IEdSRV9WRVJTSU9OXzEgfCBHUkVfU0VROworCWhkci0+Z3JlX2hkLnByb3RvY29sID0gR1JFX1BST1RPX1BQUDsKKwloZHItPmNhbGxfaWQgPSBodG9ucyhvcHQtPmRzdF9hZGRyLmNhbGxfaWQpOwogCi0JaGRyLT5mbGFncyAgICAgIHw9IFBQVFBfR1JFX0ZMQUdfUzsKLQloZHItPnNlcSAgICAgICAgID0gaHRvbmwoKytvcHQtPnNlcV9zZW50KTsKKwloZHItPnNlcSA9IGh0b25sKCsrb3B0LT5zZXFfc2VudCk7CiAJaWYgKG9wdC0+YWNrX3NlbnQgIT0gc2VxX3JlY3YpCXsKIAkJLyogc2VuZCBhY2sgd2l0aCB0aGlzIG1lc3NhZ2UgKi8KLQkJaGRyLT52ZXIgfD0gUFBUUF9HUkVfRkxBR19BOworCQloZHItPmdyZV9oZC5mbGFncyB8PSBHUkVfQUNLOwogCQloZHItPmFjayAgPSBodG9ubChzZXFfcmVjdik7CiAJCW9wdC0+YWNrX3NlbnQgPSBzZXFfcmVjdjsKIAl9CkBAIC0zMTIsNyArMjc2LDcgQEAKIAloZWFkZXJzaXplICA9IHNpemVvZigqaGVhZGVyKTsKIAogCS8qIHRlc3QgaWYgYWNrbm93bGVkZ2VtZW50IHByZXNlbnQgKi8KLQlpZiAoUFBUUF9HUkVfSVNfQShoZWFkZXItPnZlcikpIHsKKwlpZiAoR1JFX0lTX0FDSyhoZWFkZXItPmdyZV9oZC5mbGFncykpIHsKIAkJX191MzIgYWNrOwogCiAJCWlmICghcHNrYl9tYXlfcHVsbChza2IsIGhlYWRlcnNpemUpKQpAQCAtMzIwLDcgKzI4NCw3IEBACiAJCWhlYWRlciA9IChzdHJ1Y3QgcHB0cF9ncmVfaGVhZGVyICopKHNrYi0+ZGF0YSk7CiAKIAkJLyogYWNrIGluIGRpZmZlcmVudCBwbGFjZSBpZiBTID0gMCAqLwotCQlhY2sgPSBQUFRQX0dSRV9JU19TKGhlYWRlci0+ZmxhZ3MpID8gaGVhZGVyLT5hY2sgOiBoZWFkZXItPnNlcTsKKwkJYWNrID0gR1JFX0lTX1NFUShoZWFkZXItPmdyZV9oZC5mbGFncykgPyBoZWFkZXItPmFjayA6IGhlYWRlci0+c2VxOwogCiAJCWFjayA9IG50b2hsKGFjayk7CiAKQEAgLTMzMyw3ICsyOTcsNyBAQAogCQloZWFkZXJzaXplIC09IHNpemVvZihoZWFkZXItPmFjayk7CiAJfQogCS8qIHRlc3QgaWYgcGF5bG9hZCBwcmVzZW50ICovCi0JaWYgKCFQUFRQX0dSRV9JU19TKGhlYWRlci0+ZmxhZ3MpKQorCWlmICghR1JFX0lTX1NFUShoZWFkZXItPmdyZV9oZC5mbGFncykpCiAJCWdvdG8gZHJvcDsKIAogCXBheWxvYWRfbGVuID0gbnRvaHMoaGVhZGVyLT5wYXlsb2FkX2xlbik7CkBAIC0zOTQsMTEgKzM1OCwxMSBAQAogCiAJaGVhZGVyID0gKHN0cnVjdCBwcHRwX2dyZV9oZWFkZXIgKilza2ItPmRhdGE7CiAKLQlpZiAobnRvaHMoaGVhZGVyLT5wcm90b2NvbCkgIT0gUFBUUF9HUkVfUFJPVE8gfHwgLyogUFBUUC1HUkUgcHJvdG9jb2wgZm9yIFBQVFAgKi8KLQkJUFBUUF9HUkVfSVNfQyhoZWFkZXItPmZsYWdzKSB8fCAgICAgICAgICAgICAgICAvKiBmbGFnIEMgc2hvdWxkIGJlIGNsZWFyICovCi0JCVBQVFBfR1JFX0lTX1IoaGVhZGVyLT5mbGFncykgfHwgICAgICAgICAgICAgICAgLyogZmxhZyBSIHNob3VsZCBiZSBjbGVhciAqLwotCQkhUFBUUF9HUkVfSVNfSyhoZWFkZXItPmZsYWdzKSB8fCAgICAgICAgICAgICAgIC8qIGZsYWcgSyBzaG91bGQgYmUgc2V0ICovCi0JCShoZWFkZXItPmZsYWdzJjB4RikgIT0gMCkgICAgICAgICAgICAgICAgICAgICAgLyogcm91dGluZyBhbmQgcmVjdXJzaW9uIGN0cmwgPSAwICovCisJaWYgKGhlYWRlci0+Z3JlX2hkLnByb3RvY29sICE9IEdSRV9QUk9UT19QUFAgfHwgLyogUFBUUC1HUkUgcHJvdG9jb2wgZm9yIFBQVFAgKi8KKwkJR1JFX0lTX0NTVU0oaGVhZGVyLT5ncmVfaGQuZmxhZ3MpIHx8ICAgIC8qIGZsYWcgQ1NVTSBzaG91bGQgYmUgY2xlYXIgKi8KKwkJR1JFX0lTX1JPVVRJTkcoaGVhZGVyLT5ncmVfaGQuZmxhZ3MpIHx8IC8qIGZsYWcgUk9VVElORyBzaG91bGQgYmUgY2xlYXIgKi8KKwkJIUdSRV9JU19LRVkoaGVhZGVyLT5ncmVfaGQuZmxhZ3MpIHx8ICAgIC8qIGZsYWcgS0VZIHNob3VsZCBiZSBzZXQgKi8KKwkJKGhlYWRlci0+Z3JlX2hkLmZsYWdzICYgR1JFX0ZMQUdTKSkgICAgIC8qIGZsYWcgUmVjdXJzaW9uIEN0cmwgc2hvdWxkIGJlIGNsZWFyICovCiAJCS8qIGlmIGludmFsaWQsIGRpc2NhcmQgdGhpcyBwYWNrZXQgKi8KIAkJZ290byBkcm9wOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90ZWFtL3RlYW1fbW9kZV9sb2FkYmFsYW5jZS5jIGIvZHJpdmVycy9uZXQvdGVhbS90ZWFtX21vZGVfbG9hZGJhbGFuY2UuYwppbmRleCBjZGIxOWIzLi5iMjI4YmVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90ZWFtL3RlYW1fbW9kZV9sb2FkYmFsYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L3RlYW0vdGVhbV9tb2RlX2xvYWRiYWxhbmNlLmMKQEAgLTE0LDkgKzE0LDIzIEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pZl90ZWFtLmg+CiAKK3N0YXRpYyByeF9oYW5kbGVyX3Jlc3VsdF90IGxiX3JlY2VpdmUoc3RydWN0IHRlYW0gKnRlYW0sIHN0cnVjdCB0ZWFtX3BvcnQgKnBvcnQsCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAodW5saWtlbHkoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9TTE9XKSkpIHsKKwkJLyogTEFDUERVIHBhY2tldHMgc2hvdWxkIGdvIHRvIGV4YWN0IGRlbGl2ZXJ5ICovCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmRlc3QgPSBldGhfaGRyKHNrYiktPmhfZGVzdDsKKworCQlpZiAoaXNfbGlua19sb2NhbF9ldGhlcl9hZGRyKGRlc3QpICYmIGRlc3RbNV0gPT0gMHgwMikKKwkJCXJldHVybiBSWF9IQU5ETEVSX0VYQUNUOworCX0KKwlyZXR1cm4gUlhfSEFORExFUl9BTk9USEVSOworfQorCiBzdHJ1Y3QgbGJfcHJpdjsKIAogdHlwZWRlZiBzdHJ1Y3QgdGVhbV9wb3J0ICpsYl9zZWxlY3RfdHhfcG9ydF9mdW5jX3Qoc3RydWN0IHRlYW0gKiwKQEAgLTY1Miw2ICs2NjYsNyBAQAogCS5wb3J0X2VudGVyCQk9IGxiX3BvcnRfZW50ZXIsCiAJLnBvcnRfbGVhdmUJCT0gbGJfcG9ydF9sZWF2ZSwKIAkucG9ydF9kaXNhYmxlZAkJPSBsYl9wb3J0X2Rpc2FibGVkLAorCS5yZWNlaXZlCQk9IGxiX3JlY2VpdmUsCiAJLnRyYW5zbWl0CQk9IGxiX3RyYW5zbWl0LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVuLmMgYi9kcml2ZXJzL25ldC90dW4uYwppbmRleCA5YzhiNWJjLi44MDkzZTM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dW4uYworKysgYi9kcml2ZXJzL25ldC90dW4uYwpAQCAtNzMxLDE0ICs3MzEsOSBAQAogCX0KIAogCWFsZW4gPSBFVEhfQUxFTiAqIHVmLmNvdW50OwotCWFkZHIgPSBrbWFsbG9jKGFsZW4sIEdGUF9LRVJORUwpOwotCWlmICghYWRkcikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoYWRkciwgYXJnICsgc2l6ZW9mKHVmKSwgYWxlbikpIHsKLQkJZXJyID0gLUVGQVVMVDsKLQkJZ290byBkb25lOwotCX0KKwlhZGRyID0gbWVtZHVwX3VzZXIoYXJnICsgc2l6ZW9mKHVmKSwgYWxlbik7CisJaWYgKElTX0VSUihhZGRyKSkKKwkJcmV0dXJuIFBUUl9FUlIoYWRkcik7CiAKIAkvKiBUaGUgZmlsdGVyIGlzIHVwZGF0ZWQgd2l0aG91dCBob2xkaW5nIGFueSBsb2Nrcy4gV2hpY2ggaXMKIAkgKiBwZXJmZWN0bHkgc2FmZS4gV2UgZGlzYWJsZSBpdCBmaXJzdCBhbmQgaW4gdGhlIHdvcnN0CkBAIC03NTgsNyArNzUzLDcgQEAKIAlmb3IgKDsgbiA8IHVmLmNvdW50OyBuKyspIHsKIAkJaWYgKCFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihhZGRyW25dLnUpKSB7CiAJCQllcnIgPSAwOyAvKiBubyBmaWx0ZXIgKi8KLQkJCWdvdG8gZG9uZTsKKwkJCWdvdG8gZnJlZV9hZGRyOwogCQl9CiAJCWFkZHJfaGFzaF9zZXQoZmlsdGVyLT5tYXNrLCBhZGRyW25dLnUpOwogCX0KQEAgLTc3NCw4ICs3NjksNyBAQAogCiAJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgZXhhY3QgZmlsdGVycyAqLwogCWVyciA9IG5leGFjdDsKLQotZG9uZToKK2ZyZWVfYWRkcjoKIAlrZnJlZShhZGRyKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtODk0LDExICs4ODgsNyBAQAogCWlmICh1bmxpa2VseShza2Jfb3JwaGFuX2ZyYWdzKHNrYiwgR0ZQX0FUT01JQykpKQogCQlnb3RvIGRyb3A7CiAKLQlpZiAoc2tiLT5zayAmJiBza19mdWxsc29jayhza2ItPnNrKSkgewotCQlzb2NrX3R4X3RpbWVzdGFtcChza2ItPnNrLCBza2ItPnNrLT5za190c2ZsYWdzLAotCQkJCSAgJnNrYl9zaGluZm8oc2tiKS0+dHhfZmxhZ3MpOwotCQlzd190eF90aW1lc3RhbXAoc2tiKTsKLQl9CisJc2tiX3R4X3RpbWVzdGFtcChza2IpOwogCiAJLyogT3JwaGFuIHRoZSBza2IgLSByZXF1aXJlZCBhcyB3ZSBtaWdodCBoYW5nIG9uIHRvIGl0CiAJICogZm9yIGluZGVmaW5pdGUgdGltZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9hc2l4LmggYi9kcml2ZXJzL25ldC91c2IvYXNpeC5oCmluZGV4IGEyZDNlYTYuLmQxMDkyNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9hc2l4LmgKKysrIGIvZHJpdmVycy9uZXQvdXNiL2FzaXguaApAQCAtNDYsNiArNDYsNyBAQAogI2RlZmluZSBBWF9DTURfU0VUX1NXX01JSQkJMHgwNgogI2RlZmluZSBBWF9DTURfUkVBRF9NSUlfUkVHCQkweDA3CiAjZGVmaW5lIEFYX0NNRF9XUklURV9NSUlfUkVHCQkweDA4CisjZGVmaW5lIEFYX0NNRF9TVEFUTU5HU1RTX1JFRwkJMHgwOQogI2RlZmluZSBBWF9DTURfU0VUX0hXX01JSQkJMHgwYQogI2RlZmluZSBBWF9DTURfUkVBRF9FRVBST00JCTB4MGIKICNkZWZpbmUgQVhfQ01EX1dSSVRFX0VFUFJPTQkJMHgwYwpAQCAtNzEsNiArNzIsMTcgQEAKICNkZWZpbmUgQVhfQ01EX1NXX1JFU0VUCQkJMHgyMAogI2RlZmluZSBBWF9DTURfU1dfUEhZX1NUQVRVUwkJMHgyMQogI2RlZmluZSBBWF9DTURfU1dfUEhZX1NFTEVDVAkJMHgyMgorI2RlZmluZSBBWF9RQ1RDVFJMCQkJMHgyQQorCisjZGVmaW5lIEFYX0NISVBDT0RFX01BU0sJCTB4NzAKKyNkZWZpbmUgQVhfQVg4ODc3Ml9DSElQQ09ERQkJMHgwMAorI2RlZmluZSBBWF9BWDg4NzcyQV9DSElQQ09ERQkJMHgxMAorI2RlZmluZSBBWF9BWDg4NzcyQl9DSElQQ09ERQkJMHgyMAorI2RlZmluZSBBWF9IT1NUX0VOCQkJMHgwMQorCisjZGVmaW5lIEFYX1BIWVNFTF9QU0VMCQkJMHgwMQorI2RlZmluZSBBWF9QSFlTRUxfU1NNSUkJCQkwCisjZGVmaW5lIEFYX1BIWVNFTF9TU0VOCQkJMHgxMAogCiAjZGVmaW5lIEFYX1BIWV9TRUxFQ1RfTUFTSwkJKEJJVCgzKSB8IEJJVCgyKSkKICNkZWZpbmUgQVhfUEhZX1NFTEVDVF9JTlRFUk5BTAkJMApAQCAtMTczLDYgKzE4NSwxMCBAQAogfTsKIAogc3RydWN0IGFzaXhfY29tbW9uX3ByaXZhdGUgeworCXZvaWQgKCpyZXN1bWUpKHN0cnVjdCB1c2JuZXQgKmRldik7CisJdm9pZCAoKnN1c3BlbmQpKHN0cnVjdCB1c2JuZXQgKmRldik7CisJdTE2IHByZXN2ZF9waHlfYWR2ZXJ0aXNlOworCXUxNiBwcmVzdmRfcGh5X2JtY3I7CiAJc3RydWN0IGFzaXhfcnhfZml4dXBfaW5mbyByeF9maXh1cF9pbmZvOwogfTsKIApAQCAtMTgyLDEwICsxOTgsMTAgQEAKICNkZWZpbmUgRkxBR19FRVBST01fTUFDCQkoMVVMIDw8IDApICAvKiBpbml0IGRldmljZSBNQUMgZnJvbSBlZXByb20gKi8KIAogaW50IGFzaXhfcmVhZF9jbWQoc3RydWN0IHVzYm5ldCAqZGV2LCB1OCBjbWQsIHUxNiB2YWx1ZSwgdTE2IGluZGV4LAotCQkgIHUxNiBzaXplLCB2b2lkICpkYXRhKTsKKwkJICB1MTYgc2l6ZSwgdm9pZCAqZGF0YSwgaW50IGluX3BtKTsKIAogaW50IGFzaXhfd3JpdGVfY21kKHN0cnVjdCB1c2JuZXQgKmRldiwgdTggY21kLCB1MTYgdmFsdWUsIHUxNiBpbmRleCwKLQkJICAgdTE2IHNpemUsIHZvaWQgKmRhdGEpOworCQkgICB1MTYgc2l6ZSwgdm9pZCAqZGF0YSwgaW50IGluX3BtKTsKIAogdm9pZCBhc2l4X3dyaXRlX2NtZF9hc3luYyhzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IGNtZCwgdTE2IHZhbHVlLAogCQkJICB1MTYgaW5kZXgsIHUxNiBzaXplLCB2b2lkICpkYXRhKTsKQEAgLTE5NywyNyArMjEzLDMxIEBACiBzdHJ1Y3Qgc2tfYnVmZiAqYXNpeF90eF9maXh1cChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgICBnZnBfdCBmbGFncyk7CiAKLWludCBhc2l4X3NldF9zd19taWkoc3RydWN0IHVzYm5ldCAqZGV2KTsKLWludCBhc2l4X3NldF9od19taWkoc3RydWN0IHVzYm5ldCAqZGV2KTsKK2ludCBhc2l4X3NldF9zd19taWkoc3RydWN0IHVzYm5ldCAqZGV2LCBpbnQgaW5fcG0pOworaW50IGFzaXhfc2V0X2h3X21paShzdHJ1Y3QgdXNibmV0ICpkZXYsIGludCBpbl9wbSk7CiAKIGludCBhc2l4X3JlYWRfcGh5X2FkZHIoc3RydWN0IHVzYm5ldCAqZGV2LCBpbnQgaW50ZXJuYWwpOwogaW50IGFzaXhfZ2V0X3BoeV9hZGRyKHN0cnVjdCB1c2JuZXQgKmRldik7CiAKLWludCBhc2l4X3N3X3Jlc2V0KHN0cnVjdCB1c2JuZXQgKmRldiwgdTggZmxhZ3MpOworaW50IGFzaXhfc3dfcmVzZXQoc3RydWN0IHVzYm5ldCAqZGV2LCB1OCBmbGFncywgaW50IGluX3BtKTsKIAotdTE2IGFzaXhfcmVhZF9yeF9jdGwoc3RydWN0IHVzYm5ldCAqZGV2KTsKLWludCBhc2l4X3dyaXRlX3J4X2N0bChzdHJ1Y3QgdXNibmV0ICpkZXYsIHUxNiBtb2RlKTsKK3UxNiBhc2l4X3JlYWRfcnhfY3RsKHN0cnVjdCB1c2JuZXQgKmRldiwgaW50IGluX3BtKTsKK2ludCBhc2l4X3dyaXRlX3J4X2N0bChzdHJ1Y3QgdXNibmV0ICpkZXYsIHUxNiBtb2RlLCBpbnQgaW5fcG0pOwogCi11MTYgYXNpeF9yZWFkX21lZGl1bV9zdGF0dXMoc3RydWN0IHVzYm5ldCAqZGV2KTsKLWludCBhc2l4X3dyaXRlX21lZGl1bV9tb2RlKHN0cnVjdCB1c2JuZXQgKmRldiwgdTE2IG1vZGUpOwordTE2IGFzaXhfcmVhZF9tZWRpdW1fc3RhdHVzKHN0cnVjdCB1c2JuZXQgKmRldiwgaW50IGluX3BtKTsKK2ludCBhc2l4X3dyaXRlX21lZGl1bV9tb2RlKHN0cnVjdCB1c2JuZXQgKmRldiwgdTE2IG1vZGUsIGludCBpbl9wbSk7CiAKLWludCBhc2l4X3dyaXRlX2dwaW8oc3RydWN0IHVzYm5ldCAqZGV2LCB1MTYgdmFsdWUsIGludCBzbGVlcCk7CitpbnQgYXNpeF93cml0ZV9ncGlvKHN0cnVjdCB1c2JuZXQgKmRldiwgdTE2IHZhbHVlLCBpbnQgc2xlZXAsIGludCBpbl9wbSk7CiAKIHZvaWQgYXNpeF9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpOwogCiBpbnQgYXNpeF9tZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHBoeV9pZCwgaW50IGxvYyk7CiB2b2lkIGFzaXhfbWRpb193cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jLCBpbnQgdmFsKTsKIAoraW50IGFzaXhfbWRpb19yZWFkX25vcG0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHBoeV9pZCwgaW50IGxvYyk7Cit2b2lkIGFzaXhfbWRpb193cml0ZV9ub3BtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBwaHlfaWQsIGludCBsb2MsCisJCQkgIGludCB2YWwpOworCiB2b2lkIGFzaXhfZ2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2xpbmZvKTsKIGludCBhc2l4X3NldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29saW5mbyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9hc2l4X2NvbW1vbi5jIGIvZHJpdmVycy9uZXQvdXNiL2FzaXhfY29tbW9uLmMKaW5kZXggN2RlNWFiNS4uZjc5ZWIxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL2FzaXhfY29tbW9uLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2FzaXhfY29tbW9uLmMKQEAgLTIyLDI0ICsyMiw0OSBAQAogI2luY2x1ZGUgImFzaXguaCIKIAogaW50IGFzaXhfcmVhZF9jbWQoc3RydWN0IHVzYm5ldCAqZGV2LCB1OCBjbWQsIHUxNiB2YWx1ZSwgdTE2IGluZGV4LAotCQkgIHUxNiBzaXplLCB2b2lkICpkYXRhKQorCQkgIHUxNiBzaXplLCB2b2lkICpkYXRhLCBpbnQgaW5fcG0pCiB7CiAJaW50IHJldDsKLQlyZXQgPSB1c2JuZXRfcmVhZF9jbWQoZGV2LCBjbWQsCi0JCQkgICAgICAgVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCi0JCQkgICAgICAgdmFsdWUsIGluZGV4LCBkYXRhLCBzaXplKTsKKwlpbnQgKCpmbikoc3RydWN0IHVzYm5ldCAqLCB1OCwgdTgsIHUxNiwgdTE2LCB2b2lkICosIHUxNik7CiAKLQlpZiAocmV0ICE9IHNpemUgJiYgcmV0ID49IDApCi0JCXJldHVybiAtRUlOVkFMOworCUJVR19PTighZGV2KTsKKworCWlmICghaW5fcG0pCisJCWZuID0gdXNibmV0X3JlYWRfY21kOworCWVsc2UKKwkJZm4gPSB1c2JuZXRfcmVhZF9jbWRfbm9wbTsKKworCXJldCA9IGZuKGRldiwgY21kLCBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJIHZhbHVlLCBpbmRleCwgZGF0YSwgc2l6ZSk7CisKKwlpZiAodW5saWtlbHkocmV0IDwgMCkpCisJCW5ldGRldl93YXJuKGRldi0+bmV0LCAiRmFpbGVkIHRvIHJlYWQgcmVnIGluZGV4IDB4JTA0eDogJWRcbiIsCisJCQkgICAgaW5kZXgsIHJldCk7CisKIAlyZXR1cm4gcmV0OwogfQogCiBpbnQgYXNpeF93cml0ZV9jbWQoc3RydWN0IHVzYm5ldCAqZGV2LCB1OCBjbWQsIHUxNiB2YWx1ZSwgdTE2IGluZGV4LAotCQkgICB1MTYgc2l6ZSwgdm9pZCAqZGF0YSkKKwkJICAgdTE2IHNpemUsIHZvaWQgKmRhdGEsIGludCBpbl9wbSkKIHsKLQlyZXR1cm4gdXNibmV0X3dyaXRlX2NtZChkZXYsIGNtZCwKLQkJCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCi0JCQkJdmFsdWUsIGluZGV4LCBkYXRhLCBzaXplKTsKKwlpbnQgcmV0OworCWludCAoKmZuKShzdHJ1Y3QgdXNibmV0ICosIHU4LCB1OCwgdTE2LCB1MTYsIGNvbnN0IHZvaWQgKiwgdTE2KTsKKworCUJVR19PTighZGV2KTsKKworCWlmICghaW5fcG0pCisJCWZuID0gdXNibmV0X3dyaXRlX2NtZDsKKwllbHNlCisJCWZuID0gdXNibmV0X3dyaXRlX2NtZF9ub3BtOworCisJcmV0ID0gZm4oZGV2LCBjbWQsIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJIHZhbHVlLCBpbmRleCwgZGF0YSwgc2l6ZSk7CisKKwlpZiAodW5saWtlbHkocmV0IDwgMCkpCisJCW5ldGRldl93YXJuKGRldi0+bmV0LCAiRmFpbGVkIHRvIHdyaXRlIHJlZyBpbmRleCAweCUwNHg6ICVkXG4iLAorCQkJICAgIGluZGV4LCByZXQpOworCisJcmV0dXJuIHJldDsKIH0KIAogdm9pZCBhc2l4X3dyaXRlX2NtZF9hc3luYyhzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IGNtZCwgdTE2IHZhbHVlLCB1MTYgaW5kZXgsCkBAIC0yMjUsMTkgKzI1MCwyMCBAQAogCXJldHVybiBza2I7CiB9CiAKLWludCBhc2l4X3NldF9zd19taWkoc3RydWN0IHVzYm5ldCAqZGV2KQoraW50IGFzaXhfc2V0X3N3X21paShzdHJ1Y3QgdXNibmV0ICpkZXYsIGludCBpbl9wbSkKIHsKIAlpbnQgcmV0OwotCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NFVF9TV19NSUksIDB4MDAwMCwgMCwgMCwgTlVMTCk7CisJcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfU0VUX1NXX01JSSwgMHgwMDAwLCAwLCAwLCBOVUxMLCBpbl9wbSk7CisKIAlpZiAocmV0IDwgMCkKIAkJbmV0ZGV2X2VycihkZXYtPm5ldCwgIkZhaWxlZCB0byBlbmFibGUgc29mdHdhcmUgTUlJIGFjY2Vzc1xuIik7CiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGFzaXhfc2V0X2h3X21paShzdHJ1Y3QgdXNibmV0ICpkZXYpCitpbnQgYXNpeF9zZXRfaHdfbWlpKHN0cnVjdCB1c2JuZXQgKmRldiwgaW50IGluX3BtKQogewogCWludCByZXQ7Ci0JcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfU0VUX0hXX01JSSwgMHgwMDAwLCAwLCAwLCBOVUxMKTsKKwlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TRVRfSFdfTUlJLCAweDAwMDAsIDAsIDAsIE5VTEwsIGluX3BtKTsKIAlpZiAocmV0IDwgMCkKIAkJbmV0ZGV2X2VycihkZXYtPm5ldCwgIkZhaWxlZCB0byBlbmFibGUgaGFyZHdhcmUgTUlJIGFjY2Vzc1xuIik7CiAJcmV0dXJuIHJldDsKQEAgLTI0Nyw3ICsyNzMsNyBAQAogewogCWludCBvZmZzZXQgPSAoaW50ZXJuYWwgPyAxIDogMCk7CiAJdTggYnVmWzJdOwotCWludCByZXQgPSBhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfUEhZX0lELCAwLCAwLCAyLCBidWYpOworCWludCByZXQgPSBhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfUEhZX0lELCAwLCAwLCAyLCBidWYsIDApOwogCiAJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgImFzaXhfZ2V0X3BoeV9hZGRyKClcbiIpOwogCkBAIC0yNzAsMjEgKzI5NiwyMSBAQAogfQogCiAKLWludCBhc2l4X3N3X3Jlc2V0KHN0cnVjdCB1c2JuZXQgKmRldiwgdTggZmxhZ3MpCitpbnQgYXNpeF9zd19yZXNldChzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IGZsYWdzLCBpbnQgaW5fcG0pCiB7CiAJaW50IHJldDsKIAotICAgICAgICByZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TV19SRVNFVCwgZmxhZ3MsIDAsIDAsIE5VTEwpOworCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NXX1JFU0VULCBmbGFncywgMCwgMCwgTlVMTCwgaW5fcG0pOwogCWlmIChyZXQgPCAwKQogCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiRmFpbGVkIHRvIHNlbmQgc29mdHdhcmUgcmVzZXQ6ICUwMnhcbiIsIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi11MTYgYXNpeF9yZWFkX3J4X2N0bChzdHJ1Y3QgdXNibmV0ICpkZXYpCit1MTYgYXNpeF9yZWFkX3J4X2N0bChzdHJ1Y3QgdXNibmV0ICpkZXYsIGludCBpbl9wbSkKIHsKIAlfX2xlMTYgdjsKLQlpbnQgcmV0ID0gYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX1JYX0NUTCwgMCwgMCwgMiwgJnYpOworCWludCByZXQgPSBhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfUlhfQ1RMLCAwLCAwLCAyLCAmdiwgaW5fcG0pOwogCiAJaWYgKHJldCA8IDApIHsKIAkJbmV0ZGV2X2VycihkZXYtPm5ldCwgIkVycm9yIHJlYWRpbmcgUlhfQ1RMIHJlZ2lzdGVyOiAlMDJ4XG4iLCByZXQpOwpAQCAtMjk1LDEyICszMjEsMTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYXNpeF93cml0ZV9yeF9jdGwoc3RydWN0IHVzYm5ldCAqZGV2LCB1MTYgbW9kZSkKK2ludCBhc2l4X3dyaXRlX3J4X2N0bChzdHJ1Y3QgdXNibmV0ICpkZXYsIHUxNiBtb2RlLCBpbnQgaW5fcG0pCiB7CiAJaW50IHJldDsKIAogCW5ldGRldl9kYmcoZGV2LT5uZXQsICJhc2l4X3dyaXRlX3J4X2N0bCgpIC0gbW9kZSA9IDB4JTA0eFxuIiwgbW9kZSk7Ci0JcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfUlhfQ1RMLCBtb2RlLCAwLCAwLCBOVUxMKTsKKwlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9SWF9DVEwsIG1vZGUsIDAsIDAsIE5VTEwsIGluX3BtKTsKIAlpZiAocmV0IDwgMCkKIAkJbmV0ZGV2X2VycihkZXYtPm5ldCwgIkZhaWxlZCB0byB3cml0ZSBSWF9DVEwgbW9kZSB0byAweCUwNHg6ICUwMnhcbiIsCiAJCQkgICBtb2RlLCByZXQpOwpAQCAtMzA4LDEwICszMzQsMTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi11MTYgYXNpeF9yZWFkX21lZGl1bV9zdGF0dXMoc3RydWN0IHVzYm5ldCAqZGV2KQordTE2IGFzaXhfcmVhZF9tZWRpdW1fc3RhdHVzKHN0cnVjdCB1c2JuZXQgKmRldiwgaW50IGluX3BtKQogewogCV9fbGUxNiB2OwotCWludCByZXQgPSBhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfTUVESVVNX1NUQVRVUywgMCwgMCwgMiwgJnYpOworCWludCByZXQgPSBhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfTUVESVVNX1NUQVRVUywKKwkJCQkwLCAwLCAyLCAmdiwgaW5fcG0pOwogCiAJaWYgKHJldCA8IDApIHsKIAkJbmV0ZGV2X2VycihkZXYtPm5ldCwgIkVycm9yIHJlYWRpbmcgTWVkaXVtIFN0YXR1cyByZWdpc3RlcjogJTAyeFxuIiwKQEAgLTMyMywxMiArMzUwLDEzIEBACiAKIH0KIAotaW50IGFzaXhfd3JpdGVfbWVkaXVtX21vZGUoc3RydWN0IHVzYm5ldCAqZGV2LCB1MTYgbW9kZSkKK2ludCBhc2l4X3dyaXRlX21lZGl1bV9tb2RlKHN0cnVjdCB1c2JuZXQgKmRldiwgdTE2IG1vZGUsIGludCBpbl9wbSkKIHsKIAlpbnQgcmV0OwogCiAJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgImFzaXhfd3JpdGVfbWVkaXVtX21vZGUoKSAtIG1vZGUgPSAweCUwNHhcbiIsIG1vZGUpOwotCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX01FRElVTV9NT0RFLCBtb2RlLCAwLCAwLCBOVUxMKTsKKwlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9NRURJVU1fTU9ERSwKKwkJCSAgICAgbW9kZSwgMCwgMCwgTlVMTCwgaW5fcG0pOwogCWlmIChyZXQgPCAwKQogCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiRmFpbGVkIHRvIHdyaXRlIE1lZGl1bSBNb2RlIG1vZGUgdG8gMHglMDR4OiAlMDJ4XG4iLAogCQkJICAgbW9kZSwgcmV0KTsKQEAgLTMzNiwxMiArMzY0LDEyIEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGFzaXhfd3JpdGVfZ3BpbyhzdHJ1Y3QgdXNibmV0ICpkZXYsIHUxNiB2YWx1ZSwgaW50IHNsZWVwKQoraW50IGFzaXhfd3JpdGVfZ3BpbyhzdHJ1Y3QgdXNibmV0ICpkZXYsIHUxNiB2YWx1ZSwgaW50IHNsZWVwLCBpbnQgaW5fcG0pCiB7CiAJaW50IHJldDsKIAogCW5ldGRldl9kYmcoZGV2LT5uZXQsICJhc2l4X3dyaXRlX2dwaW8oKSAtIHZhbHVlID0gMHglMDR4XG4iLCB2YWx1ZSk7Ci0JcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfR1BJT1MsIHZhbHVlLCAwLCAwLCBOVUxMKTsKKwlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9HUElPUywgdmFsdWUsIDAsIDAsIE5VTEwsIGluX3BtKTsKIAlpZiAocmV0IDwgMCkKIAkJbmV0ZGV2X2VycihkZXYtPm5ldCwgIkZhaWxlZCB0byB3cml0ZSBHUElPIHZhbHVlIDB4JTA0eDogJTAyeFxuIiwKIAkJCSAgIHZhbHVlLCByZXQpOwpAQCAtMzk4LDE2ICs0MjYsMzEgQEAKIHsKIAlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCV9fbGUxNiByZXM7CisJdTggc21zcjsKKwlpbnQgaSA9IDA7CisJaW50IHJldDsKIAogCW11dGV4X2xvY2soJmRldi0+cGh5X211dGV4KTsKLQlhc2l4X3NldF9zd19taWkoZGV2KTsKKwlkbyB7CisJCXJldCA9IGFzaXhfc2V0X3N3X21paShkZXYsIDApOworCQlpZiAocmV0ID09IC1FTk9ERVYpCisJCQlicmVhazsKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDExMDApOworCQlyZXQgPSBhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1NUQVRNTkdTVFNfUkVHLAorCQkJCSAgICAwLCAwLCAxLCAmc21zciwgMCk7CisJfSB3aGlsZSAoIShzbXNyICYgQVhfSE9TVF9FTikgJiYgKGkrKyA8IDMwKSAmJiAocmV0ICE9IC1FTk9ERVYpKTsKKwlpZiAocmV0ID09IC1FTk9ERVYpIHsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPnBoeV9tdXRleCk7CisJCXJldHVybiByZXQ7CisJfQorCiAJYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX01JSV9SRUcsIHBoeV9pZCwKLQkJCQkoX191MTYpbG9jLCAyLCAmcmVzKTsKLQlhc2l4X3NldF9od19taWkoZGV2KTsKKwkJCQkoX191MTYpbG9jLCAyLCAmcmVzLCAwKTsKKwlhc2l4X3NldF9od19taWkoZGV2LCAwKTsKIAltdXRleF91bmxvY2soJmRldi0+cGh5X211dGV4KTsKIAogCW5ldGRldl9kYmcoZGV2LT5uZXQsICJhc2l4X21kaW9fcmVhZCgpIHBoeV9pZD0weCUwMngsIGxvYz0weCUwMngsIHJldHVybnM9MHglMDR4XG4iLAotCQkgICBwaHlfaWQsIGxvYywgbGUxNl90b19jcHUocmVzKSk7CisJCQlwaHlfaWQsIGxvYywgbGUxNl90b19jcHUocmVzKSk7CiAKIAlyZXR1cm4gbGUxNl90b19jcHUocmVzKTsKIH0KQEAgLTQxNiwxMyArNDU5LDk1IEBACiB7CiAJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlfX2xlMTYgcmVzID0gY3B1X3RvX2xlMTYodmFsKTsKKwl1OCBzbXNyOworCWludCBpID0gMDsKKwlpbnQgcmV0OwogCiAJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgImFzaXhfbWRpb193cml0ZSgpIHBoeV9pZD0weCUwMngsIGxvYz0weCUwMngsIHZhbD0weCUwNHhcbiIsCi0JCSAgIHBoeV9pZCwgbG9jLCB2YWwpOworCQkJcGh5X2lkLCBsb2MsIHZhbCk7CisKIAltdXRleF9sb2NrKCZkZXYtPnBoeV9tdXRleCk7Ci0JYXNpeF9zZXRfc3dfbWlpKGRldik7Ci0JYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfTUlJX1JFRywgcGh5X2lkLCAoX191MTYpbG9jLCAyLCAmcmVzKTsKLQlhc2l4X3NldF9od19taWkoZGV2KTsKKwlkbyB7CisJCXJldCA9IGFzaXhfc2V0X3N3X21paShkZXYsIDApOworCQlpZiAocmV0ID09IC1FTk9ERVYpCisJCQlicmVhazsKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDExMDApOworCQlyZXQgPSBhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1NUQVRNTkdTVFNfUkVHLAorCQkJCSAgICAwLCAwLCAxLCAmc21zciwgMCk7CisJfSB3aGlsZSAoIShzbXNyICYgQVhfSE9TVF9FTikgJiYgKGkrKyA8IDMwKSAmJiAocmV0ICE9IC1FTk9ERVYpKTsKKwlpZiAocmV0ID09IC1FTk9ERVYpIHsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPnBoeV9tdXRleCk7CisJCXJldHVybjsKKwl9CisKKwlhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9NSUlfUkVHLCBwaHlfaWQsCisJCSAgICAgICAoX191MTYpbG9jLCAyLCAmcmVzLCAwKTsKKwlhc2l4X3NldF9od19taWkoZGV2LCAwKTsKKwltdXRleF91bmxvY2soJmRldi0+cGh5X211dGV4KTsKK30KKworaW50IGFzaXhfbWRpb19yZWFkX25vcG0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHBoeV9pZCwgaW50IGxvYykKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCV9fbGUxNiByZXM7CisJdTggc21zcjsKKwlpbnQgaSA9IDA7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmRldi0+cGh5X211dGV4KTsKKwlkbyB7CisJCXJldCA9IGFzaXhfc2V0X3N3X21paShkZXYsIDEpOworCQlpZiAocmV0ID09IC1FTk9ERVYpCisJCQlicmVhazsKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDExMDApOworCQlyZXQgPSBhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1NUQVRNTkdTVFNfUkVHLAorCQkJCSAgICAwLCAwLCAxLCAmc21zciwgMSk7CisJfSB3aGlsZSAoIShzbXNyICYgQVhfSE9TVF9FTikgJiYgKGkrKyA8IDMwKSAmJiAocmV0ICE9IC1FTk9ERVYpKTsKKwlpZiAocmV0ID09IC1FTk9ERVYpIHsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPnBoeV9tdXRleCk7CisJCXJldHVybiByZXQ7CisJfQorCisJYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX01JSV9SRUcsIHBoeV9pZCwKKwkJICAgICAgKF9fdTE2KWxvYywgMiwgJnJlcywgMSk7CisJYXNpeF9zZXRfaHdfbWlpKGRldiwgMSk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPnBoeV9tdXRleCk7CisKKwluZXRkZXZfZGJnKGRldi0+bmV0LCAiYXNpeF9tZGlvX3JlYWRfbm9wbSgpIHBoeV9pZD0weCUwMngsIGxvYz0weCUwMngsIHJldHVybnM9MHglMDR4XG4iLAorCQkJcGh5X2lkLCBsb2MsIGxlMTZfdG9fY3B1KHJlcykpOworCisJcmV0dXJuIGxlMTZfdG9fY3B1KHJlcyk7Cit9CisKK3ZvaWQKK2FzaXhfbWRpb193cml0ZV9ub3BtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBwaHlfaWQsIGludCBsb2MsIGludCB2YWwpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlfX2xlMTYgcmVzID0gY3B1X3RvX2xlMTYodmFsKTsKKwl1OCBzbXNyOworCWludCBpID0gMDsKKwlpbnQgcmV0OworCisJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgImFzaXhfbWRpb193cml0ZSgpIHBoeV9pZD0weCUwMngsIGxvYz0weCUwMngsIHZhbD0weCUwNHhcbiIsCisJCQlwaHlfaWQsIGxvYywgdmFsKTsKKworCW11dGV4X2xvY2soJmRldi0+cGh5X211dGV4KTsKKwlkbyB7CisJCXJldCA9IGFzaXhfc2V0X3N3X21paShkZXYsIDEpOworCQlpZiAocmV0ID09IC1FTk9ERVYpCisJCQlicmVhazsKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDExMDApOworCQlyZXQgPSBhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1NUQVRNTkdTVFNfUkVHLAorCQkJCSAgICAwLCAwLCAxLCAmc21zciwgMSk7CisJfSB3aGlsZSAoIShzbXNyICYgQVhfSE9TVF9FTikgJiYgKGkrKyA8IDMwKSAmJiAocmV0ICE9IC1FTk9ERVYpKTsKKwlpZiAocmV0ID09IC1FTk9ERVYpIHsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPnBoeV9tdXRleCk7CisJCXJldHVybjsKKwl9CisKKwlhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9NSUlfUkVHLCBwaHlfaWQsCisJCSAgICAgICAoX191MTYpbG9jLCAyLCAmcmVzLCAxKTsKKwlhc2l4X3NldF9od19taWkoZGV2LCAxKTsKIAltdXRleF91bmxvY2soJmRldi0+cGh5X211dGV4KTsKIH0KIApAQCAtNDMxLDcgKzU1Niw4IEBACiAJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKIAl1OCBvcHQ7CiAKLQlpZiAoYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX01PTklUT1JfTU9ERSwgMCwgMCwgMSwgJm9wdCkgPCAwKSB7CisJaWYgKGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9NT05JVE9SX01PREUsCisJCQkgIDAsIDAsIDEsICZvcHQsIDApIDwgMCkgewogCQl3b2xpbmZvLT5zdXBwb3J0ZWQgPSAwOwogCQl3b2xpbmZvLT53b2xvcHRzID0gMDsKIAkJcmV0dXJuOwpAQCAtNDU1LDcgKzU4MSw3IEBACiAJCW9wdCB8PSBBWF9NT05JVE9SX01BR0lDOwogCiAJaWYgKGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX01PTklUT1JfTU9ERSwKLQkJCSAgICAgIG9wdCwgMCwgMCwgTlVMTCkgPCAwKQorCQkJICAgICAgb3B0LCAwLCAwLCBOVUxMLCAwKSA8IDApCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcmV0dXJuIDA7CkBAIC00OTAsNyArNjE2LDcgQEAKIAkvKiBheDg4MTd4IHJldHVybnMgMiBieXRlcyBmcm9tIGVlcHJvbSBvbiByZWFkICovCiAJZm9yIChpID0gZmlyc3Rfd29yZDsgaSA8PSBsYXN0X3dvcmQ7IGkrKykgewogCQlpZiAoYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX0VFUFJPTSwgaSwgMCwgMiwKLQkJCQkgICYoZWVwcm9tX2J1ZmZbaSAtIGZpcnN0X3dvcmRdKSkgPCAwKSB7CisJCQkJICAmZWVwcm9tX2J1ZmZbaSAtIGZpcnN0X3dvcmRdLCAwKSA8IDApIHsKIAkJCWtmcmVlKGVlcHJvbV9idWZmKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CkBAIC01MzEsNyArNjU3LDcgQEAKIAkgICB0aGUgRUVQUk9NICovCiAJaWYgKGVlcHJvbS0+b2Zmc2V0ICYgMSkgewogCQlyZXQgPSBhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfRUVQUk9NLCBmaXJzdF93b3JkLCAwLCAyLAotCQkJCSAgICAmKGVlcHJvbV9idWZmWzBdKSk7CisJCQkJICAgICZlZXByb21fYnVmZlswXSwgMCk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQluZXRkZXZfZXJyKG5ldCwgIkZhaWxlZCB0byByZWFkIEVFUFJPTSBhdCBvZmZzZXQgMHglMDJ4LlxuIiwgZmlyc3Rfd29yZCk7CiAJCQlnb3RvIGZyZWU7CkBAIC01NDAsNyArNjY2LDcgQEAKIAogCWlmICgoZWVwcm9tLT5vZmZzZXQgKyBlZXByb20tPmxlbikgJiAxKSB7CiAJCXJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9FRVBST00sIGxhc3Rfd29yZCwgMCwgMiwKLQkJCQkgICAgJihlZXByb21fYnVmZltsYXN0X3dvcmQgLSBmaXJzdF93b3JkXSkpOworCQkJCSAgICAmZWVwcm9tX2J1ZmZbbGFzdF93b3JkIC0gZmlyc3Rfd29yZF0sIDApOwogCQlpZiAocmV0IDwgMCkgewogCQkJbmV0ZGV2X2VycihuZXQsICJGYWlsZWQgdG8gcmVhZCBFRVBST00gYXQgb2Zmc2V0IDB4JTAyeC5cbiIsIGxhc3Rfd29yZCk7CiAJCQlnb3RvIGZyZWU7CkBAIC01NTAsNyArNjc2LDcgQEAKIAltZW1jcHkoKHU4ICopZWVwcm9tX2J1ZmYgKyAoZWVwcm9tLT5vZmZzZXQgJiAxKSwgZGF0YSwgZWVwcm9tLT5sZW4pOwogCiAJLyogd3JpdGUgZGF0YSB0byBFRVBST00gKi8KLQlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9FTkFCTEUsIDB4MDAwMCwgMCwgMCwgTlVMTCk7CisJcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfRU5BQkxFLCAweDAwMDAsIDAsIDAsIE5VTEwsIDApOwogCWlmIChyZXQgPCAwKSB7CiAJCW5ldGRldl9lcnIobmV0LCAiRmFpbGVkIHRvIGVuYWJsZSBFRVBST00gd3JpdGVcbiIpOwogCQlnb3RvIGZyZWU7CkBAIC01NjEsNyArNjg3LDcgQEAKIAkJbmV0ZGV2X2RiZyhuZXQsICJ3cml0ZSB0byBFRVBST00gYXQgb2Zmc2V0IDB4JTAyeCwgZGF0YSAweCUwNHhcbiIsCiAJCQkgICBpLCBlZXByb21fYnVmZltpIC0gZmlyc3Rfd29yZF0pOwogCQlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9FRVBST00sIGksCi0JCQkJICAgICBlZXByb21fYnVmZltpIC0gZmlyc3Rfd29yZF0sIDAsIE5VTEwpOworCQkJCSAgICAgZWVwcm9tX2J1ZmZbaSAtIGZpcnN0X3dvcmRdLCAwLCBOVUxMLCAwKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCW5ldGRldl9lcnIobmV0LCAiRmFpbGVkIHRvIHdyaXRlIEVFUFJPTSBhdCBvZmZzZXQgMHglMDJ4LlxuIiwKIAkJCQkgICBpKTsKQEAgLTU3MCw3ICs2OTYsNyBAQAogCQltc2xlZXAoMjApOwogCX0KIAotCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX0RJU0FCTEUsIDB4MDAwMCwgMCwgMCwgTlVMTCk7CisJcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfRElTQUJMRSwgMHgwMDAwLCAwLCAwLCBOVUxMLCAwKTsKIAlpZiAocmV0IDwgMCkgewogCQluZXRkZXZfZXJyKG5ldCwgIkZhaWxlZCB0byBkaXNhYmxlIEVFUFJPTSB3cml0ZVxuIik7CiAJCWdvdG8gZnJlZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9hc2l4X2RldmljZXMuYyBiL2RyaXZlcnMvbmV0L3VzYi9hc2l4X2RldmljZXMuYwppbmRleCA1Y2FiZWZjLi5jY2UyNDk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvYXNpeF9kZXZpY2VzLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2FzaXhfZGV2aWNlcy5jCkBAIC0zNSw2ICszNSwxNSBAQAogCiAjZGVmaW5lCVBIWV9NT0RFX1JUTDgyMTFDTAkweDAwMEMKIAorI2RlZmluZSBBWDg4NzcyQV9QSFkxNEgJCTB4MTQKKyNkZWZpbmUgQVg4ODc3MkFfUEhZMTRIX0RFRkFVTFQgMHg0NDJDCisKKyNkZWZpbmUgQVg4ODc3MkFfUEhZMTVICQkweDE1CisjZGVmaW5lIEFYODg3NzJBX1BIWTE1SF9ERUZBVUxUIDB4MDNDOAorCisjZGVmaW5lIEFYODg3NzJBX1BIWTE2SAkJMHgxNgorI2RlZmluZSBBWDg4NzcyQV9QSFkxNkhfREVGQVVMVCAweDQwNDQKKwogc3RydWN0IGF4ODgxNzJfaW50X2RhdGEgewogCV9fbGUxNiByZXMxOwogCXU4IGxpbms7CkBAIC03OSw2ICs4OCw4IEBACiAJLyogUG9sbCBmb3IgdGhlIHJhcmUgY2FzZSB0aGUgRlcgb3IgcGh5IGlzbid0IHJlYWR5IHlldC4gICovCiAJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CiAJCXBoeV9yZWcgPSBhc2l4X21kaW9fcmVhZChkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfUEhZU0lEMSk7CisJCWlmIChwaHlfcmVnIDwgMCkKKwkJCXJldHVybiAwOwogCQlpZiAocGh5X3JlZyAhPSAwICYmIHBoeV9yZWcgIT0gMHhGRkZGKQogCQkJYnJlYWs7CiAJCW1kZWxheSgxKTsKQEAgLTE4NCw3ICsxOTUsNyBAQAogCW5ldGRldl9kYmcoZGV2LT5uZXQsICJheDg4MTcyX2xpbmtfcmVzZXQoKSBzcGVlZDogJXUgZHVwbGV4OiAlZCBzZXR0aW5nIG1vZGUgdG8gMHglMDR4XG4iLAogCQkgICBldGh0b29sX2NtZF9zcGVlZCgmZWNtZCksIGVjbWQuZHVwbGV4LCBtb2RlKTsKIAotCWFzaXhfd3JpdGVfbWVkaXVtX21vZGUoZGV2LCBtb2RlKTsKKwlhc2l4X3dyaXRlX21lZGl1bV9tb2RlKGRldiwgbW9kZSwgMCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIwMSw2ICsyMTIsMjggQEAKIAkubmRvX3NldF9yeF9tb2RlCT0gYXg4ODE3Ml9zZXRfbXVsdGljYXN0LAogfTsKIAorc3RhdGljIHZvaWQgYXNpeF9waHlfcmVzZXQoc3RydWN0IHVzYm5ldCAqZGV2LCB1bnNpZ25lZCBpbnQgcmVzZXRfYml0cykKK3sKKwl1bnNpZ25lZCBpbnQgdGltZW91dCA9IDUwMDA7CisKKwlhc2l4X21kaW9fd3JpdGUoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgTUlJX0JNQ1IsIHJlc2V0X2JpdHMpOworCisJLyogZ2l2ZSBwaHlfaWQgYSBjaGFuY2UgdG8gcHJvY2VzcyByZXNldCAqLworCXVkZWxheSg1MDApOworCisJLyogU2VlIElFRUUgODAyLjMgIjIyLjIuNC4xLjEgUmVzZXQiOiA1MDBtcyBtYXggKi8KKwl3aGlsZSAodGltZW91dC0tKSB7CisJCWlmIChhc2l4X21kaW9fcmVhZChkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfQk1DUikKKwkJCQkJCQkmIEJNQ1JfUkVTRVQpCisJCQl1ZGVsYXkoMTAwKTsKKwkJZWxzZQorCQkJcmV0dXJuOworCX0KKworCW5ldGRldl9lcnIoZGV2LT5uZXQsICJCTUNSX1JFU0VUIHRpbWVvdXQgb24gcGh5X2lkICVkXG4iLAorCQkgICBkZXYtPm1paS5waHlfaWQpOworfQorCiBzdGF0aWMgaW50IGF4ODgxNzJfYmluZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewogCWludCByZXQgPSAwOwpAQCAtMjEzLDE4ICsyNDYsMTkgQEAKIAkvKiBUb2dnbGUgdGhlIEdQSU9zIGluIGEgbWFudWZhY3R1cmVyL21vZGVsIHNwZWNpZmljIHdheSAqLwogCWZvciAoaSA9IDI7IGkgPj0gMDsgaS0tKSB7CiAJCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX0dQSU9TLAotCQkJCShncGlvX2JpdHMgPj4gKGkgKiA4KSkgJiAweGZmLCAwLCAwLCBOVUxMKTsKKwkJCQkoZ3Bpb19iaXRzID4+IChpICogOCkpICYgMHhmZiwgMCwgMCwgTlVMTCwgMCk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7CiAJCW1zbGVlcCg1KTsKIAl9CiAKLQlyZXQgPSBhc2l4X3dyaXRlX3J4X2N0bChkZXYsIDB4ODApOworCXJldCA9IGFzaXhfd3JpdGVfcnhfY3RsKGRldiwgMHg4MCwgMCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCiAJLyogR2V0IHRoZSBNQUMgYWRkcmVzcyAqLwotCXJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWDg4MTcyX0NNRF9SRUFEX05PREVfSUQsIDAsIDAsIEVUSF9BTEVOLCBidWYpOworCXJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWDg4MTcyX0NNRF9SRUFEX05PREVfSUQsCisJCQkgICAgMCwgMCwgRVRIX0FMRU4sIGJ1ZiwgMCk7CiAJaWYgKHJldCA8IDApIHsKIAkJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgInJlYWQgQVhfQ01EX1JFQURfTk9ERV9JRCBmYWlsZWQ6ICVkXG4iLAogCQkJICAgcmV0KTsKQEAgLTI0Niw3ICsyODAsNyBAQAogCWRldi0+bmV0LT5uZWVkZWRfaGVhZHJvb20gPSA0OyAvKiBjZiBhc2l4X3R4X2ZpeHVwKCkgKi8KIAlkZXYtPm5ldC0+bmVlZGVkX3RhaWxyb29tID0gNDsgLyogY2YgYXNpeF90eF9maXh1cCgpICovCiAKLQlhc2l4X21kaW9fd3JpdGUoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgTUlJX0JNQ1IsIEJNQ1JfUkVTRVQpOworCWFzaXhfcGh5X3Jlc2V0KGRldiwgQk1DUl9SRVNFVCk7CiAJYXNpeF9tZGlvX3dyaXRlKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9BRFZFUlRJU0UsCiAJCUFEVkVSVElTRV9BTEwgfCBBRFZFUlRJU0VfQ1NNQSB8IEFEVkVSVElTRV9QQVVTRV9DQVApOwogCW1paV9ud2F5X3Jlc3RhcnQoJmRldi0+bWlpKTsKQEAgLTI5MCw3ICszMjQsNyBAQAogCW5ldGRldl9kYmcoZGV2LT5uZXQsICJheDg4NzcyX2xpbmtfcmVzZXQoKSBzcGVlZDogJXUgZHVwbGV4OiAlZCBzZXR0aW5nIG1vZGUgdG8gMHglMDR4XG4iLAogCQkgICBldGh0b29sX2NtZF9zcGVlZCgmZWNtZCksIGVjbWQuZHVwbGV4LCBtb2RlKTsKIAotCWFzaXhfd3JpdGVfbWVkaXVtX21vZGUoZGV2LCBtb2RlKTsKKwlhc2l4X3dyaXRlX21lZGl1bV9tb2RlKGRldiwgbW9kZSwgMCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI5OCwxMDAgKzMzMiwxMTUgQEAKIHN0YXRpYyBpbnQgYXg4ODc3Ml9yZXNldChzdHJ1Y3QgdXNibmV0ICpkZXYpCiB7CiAJc3RydWN0IGFzaXhfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgYXNpeF9kYXRhICopJmRldi0+ZGF0YTsKLQlpbnQgcmV0LCBlbWJkX3BoeTsKLQl1MTYgcnhfY3RsOworCWludCByZXQ7CiAKLQlyZXQgPSBhc2l4X3dyaXRlX2dwaW8oZGV2LAotCQkJQVhfR1BJT19SU0UgfCBBWF9HUElPX0dQT18yIHwgQVhfR1BJT19HUE8yRU4sIDUpOworCS8qIFJld3JpdGUgTUFDIGFkZHJlc3MgKi8KKwlldGhlcl9hZGRyX2NvcHkoZGF0YS0+bWFjX2FkZHIsIGRldi0+bmV0LT5kZXZfYWRkcik7CisJcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfTk9ERV9JRCwgMCwgMCwKKwkJCSAgICAgRVRIX0FMRU4sIGRhdGEtPm1hY19hZGRyLCAwKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKLQllbWJkX3BoeSA9ICgoYXNpeF9nZXRfcGh5X2FkZHIoZGV2KSAmIDB4MWYpID09IDB4MTAgPyAxIDogMCk7CisJLyogU2V0IFJYX0NUTCB0byBkZWZhdWx0IHZhbHVlcyB3aXRoIDJrIGJ1ZmZlciwgYW5kIGVuYWJsZSBjYWN0dXMgKi8KKwlyZXQgPSBhc2l4X3dyaXRlX3J4X2N0bChkZXYsIEFYX0RFRkFVTFRfUlhfQ1RMLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CiAKLQlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TV19QSFlfU0VMRUNULCBlbWJkX3BoeSwgMCwgMCwgTlVMTCk7CisJYXNpeF93cml0ZV9tZWRpdW1fbW9kZShkZXYsIEFYODg3NzJfTUVESVVNX0RFRkFVTFQsIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXJldHVybiAwOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBheDg4NzcyX2h3X3Jlc2V0KHN0cnVjdCB1c2JuZXQgKmRldiwgaW50IGluX3BtKQoreworCXN0cnVjdCBhc2l4X2RhdGEgKmRhdGEgPSAoc3RydWN0IGFzaXhfZGF0YSAqKSZkZXYtPmRhdGE7CisJaW50IHJldCwgZW1iZF9waHk7CisJdTE2IHJ4X2N0bDsKKworCXJldCA9IGFzaXhfd3JpdGVfZ3BpbyhkZXYsIEFYX0dQSU9fUlNFIHwgQVhfR1BJT19HUE9fMiB8CisJCQkgICAgICBBWF9HUElPX0dQTzJFTiwgNSwgaW5fcG0pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCWVtYmRfcGh5ID0gKChkZXYtPm1paS5waHlfaWQgJiAweDFmKSA9PSAweDEwID8gMSA6IDApOworCisJcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfU1dfUEhZX1NFTEVDVCwgZW1iZF9waHksCisJCQkgICAgIDAsIDAsIE5VTEwsIGluX3BtKTsKIAlpZiAocmV0IDwgMCkgewogCQluZXRkZXZfZGJnKGRldi0+bmV0LCAiU2VsZWN0IFBIWSAjMSBmYWlsZWQ6ICVkXG4iLCByZXQpOwogCQlnb3RvIG91dDsKIAl9CiAKLQlyZXQgPSBhc2l4X3N3X3Jlc2V0KGRldiwgQVhfU1dSRVNFVF9JUFBEIHwgQVhfU1dSRVNFVF9QUkwpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKLQotCW1zbGVlcCgxNTApOwotCi0JcmV0ID0gYXNpeF9zd19yZXNldChkZXYsIEFYX1NXUkVTRVRfQ0xFQVIpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKLQotCW1zbGVlcCgxNTApOwotCiAJaWYgKGVtYmRfcGh5KSB7Ci0JCXJldCA9IGFzaXhfc3dfcmVzZXQoZGV2LCBBWF9TV1JFU0VUX0lQUkwpOworCQlyZXQgPSBhc2l4X3N3X3Jlc2V0KGRldiwgQVhfU1dSRVNFVF9JUFBELCBpbl9wbSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJdXNsZWVwX3JhbmdlKDEwMDAwLCAxMTAwMCk7CisKKwkJcmV0ID0gYXNpeF9zd19yZXNldChkZXYsIEFYX1NXUkVTRVRfQ0xFQVIsIGluX3BtKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKworCQltc2xlZXAoNjApOworCisJCXJldCA9IGFzaXhfc3dfcmVzZXQoZGV2LCBBWF9TV1JFU0VUX0lQUkwgfCBBWF9TV1JFU0VUX1BSTCwKKwkJCQkgICAgaW5fcG0pOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gb3V0OwogCX0gZWxzZSB7Ci0JCXJldCA9IGFzaXhfc3dfcmVzZXQoZGV2LCBBWF9TV1JFU0VUX1BSVEUpOworCQlyZXQgPSBhc2l4X3N3X3Jlc2V0KGRldiwgQVhfU1dSRVNFVF9JUFBEIHwgQVhfU1dSRVNFVF9QUkwsCisJCQkJICAgIGluX3BtKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dDsKIAl9CiAKIAltc2xlZXAoMTUwKTsKLQlyeF9jdGwgPSBhc2l4X3JlYWRfcnhfY3RsKGRldik7Ci0JbmV0ZGV2X2RiZyhkZXYtPm5ldCwgIlJYX0NUTCBpcyAweCUwNHggYWZ0ZXIgc29mdHdhcmUgcmVzZXRcbiIsIHJ4X2N0bCk7Ci0JcmV0ID0gYXNpeF93cml0ZV9yeF9jdGwoZGV2LCAweDAwMDApOworCisJaWYgKGluX3BtICYmICghYXNpeF9tZGlvX3JlYWRfbm9wbShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLAorCQkJCQkgICBNSUlfUEhZU0lEMSkpKXsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gYXNpeF93cml0ZV9yeF9jdGwoZGV2LCBBWF9ERUZBVUxUX1JYX0NUTCwgaW5fcG0pOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAotCXJ4X2N0bCA9IGFzaXhfcmVhZF9yeF9jdGwoZGV2KTsKLQluZXRkZXZfZGJnKGRldi0+bmV0LCAiUlhfQ1RMIGlzIDB4JTA0eCBzZXR0aW5nIHRvIDB4MDAwMFxuIiwgcnhfY3RsKTsKLQotCXJldCA9IGFzaXhfc3dfcmVzZXQoZGV2LCBBWF9TV1JFU0VUX1BSTCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OwotCi0JbXNsZWVwKDE1MCk7Ci0KLQlyZXQgPSBhc2l4X3N3X3Jlc2V0KGRldiwgQVhfU1dSRVNFVF9JUFJMIHwgQVhfU1dSRVNFVF9QUkwpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKLQotCW1zbGVlcCgxNTApOwotCi0JYXNpeF9tZGlvX3dyaXRlKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9CTUNSLCBCTUNSX1JFU0VUKTsKLQlhc2l4X21kaW9fd3JpdGUoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgTUlJX0FEVkVSVElTRSwKLQkJCUFEVkVSVElTRV9BTEwgfCBBRFZFUlRJU0VfQ1NNQSk7Ci0JbWlpX253YXlfcmVzdGFydCgmZGV2LT5taWkpOwotCi0JcmV0ID0gYXNpeF93cml0ZV9tZWRpdW1fbW9kZShkZXYsIEFYODg3NzJfTUVESVVNX0RFRkFVTFQpOworCXJldCA9IGFzaXhfd3JpdGVfbWVkaXVtX21vZGUoZGV2LCBBWDg4NzcyX01FRElVTV9ERUZBVUxULCBpbl9wbSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCiAJcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfSVBHMCwKLQkJCQlBWDg4NzcyX0lQRzBfREVGQVVMVCB8IEFYODg3NzJfSVBHMV9ERUZBVUxULAotCQkJCUFYODg3NzJfSVBHMl9ERUZBVUxULCAwLCBOVUxMKTsKKwkJCSAgICAgQVg4ODc3Ml9JUEcwX0RFRkFVTFQgfCBBWDg4NzcyX0lQRzFfREVGQVVMVCwKKwkJCSAgICAgQVg4ODc3Ml9JUEcyX0RFRkFVTFQsIDAsIE5VTEwsIGluX3BtKTsKIAlpZiAocmV0IDwgMCkgewogCQluZXRkZXZfZGJnKGRldi0+bmV0LCAiV3JpdGUgSVBHLElQRzEsSVBHMiBmYWlsZWQ6ICVkXG4iLCByZXQpOwogCQlnb3RvIG91dDsKIAl9CiAKIAkvKiBSZXdyaXRlIE1BQyBhZGRyZXNzICovCi0JbWVtY3B5KGRhdGEtPm1hY19hZGRyLCBkZXYtPm5ldC0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLQlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9OT0RFX0lELCAwLCAwLCBFVEhfQUxFTiwKLQkJCQkJCQlkYXRhLT5tYWNfYWRkcik7CisJZXRoZXJfYWRkcl9jb3B5KGRhdGEtPm1hY19hZGRyLCBkZXYtPm5ldC0+ZGV2X2FkZHIpOworCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX05PREVfSUQsIDAsIDAsCisJCQkgICAgIEVUSF9BTEVOLCBkYXRhLT5tYWNfYWRkciwgaW5fcG0pOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAogCS8qIFNldCBSWF9DVEwgdG8gZGVmYXVsdCB2YWx1ZXMgd2l0aCAyayBidWZmZXIsIGFuZCBlbmFibGUgY2FjdHVzICovCi0JcmV0ID0gYXNpeF93cml0ZV9yeF9jdGwoZGV2LCBBWF9ERUZBVUxUX1JYX0NUTCk7CisJcmV0ID0gYXNpeF93cml0ZV9yeF9jdGwoZGV2LCBBWF9ERUZBVUxUX1JYX0NUTCwgaW5fcG0pOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAotCXJ4X2N0bCA9IGFzaXhfcmVhZF9yeF9jdGwoZGV2KTsKKwlyeF9jdGwgPSBhc2l4X3JlYWRfcnhfY3RsKGRldiwgaW5fcG0pOwogCW5ldGRldl9kYmcoZGV2LT5uZXQsICJSWF9DVEwgaXMgMHglMDR4IGFmdGVyIGFsbCBpbml0aWFsaXphdGlvbnNcbiIsCiAJCSAgIHJ4X2N0bCk7CiAKLQlyeF9jdGwgPSBhc2l4X3JlYWRfbWVkaXVtX3N0YXR1cyhkZXYpOworCXJ4X2N0bCA9IGFzaXhfcmVhZF9tZWRpdW1fc3RhdHVzKGRldiwgaW5fcG0pOwogCW5ldGRldl9kYmcoZGV2LT5uZXQsCiAJCSAgICJNZWRpdW0gU3RhdHVzIGlzIDB4JTA0eCBhZnRlciBhbGwgaW5pdGlhbGl6YXRpb25zXG4iLAogCQkgICByeF9jdGwpOwpAQCAtNDAwLDcgKzQ0OSwxNDAgQEAKIAogb3V0OgogCXJldHVybiByZXQ7Cit9CiAKK3N0YXRpYyBpbnQgYXg4ODc3MmFfaHdfcmVzZXQoc3RydWN0IHVzYm5ldCAqZGV2LCBpbnQgaW5fcG0pCit7CisJc3RydWN0IGFzaXhfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgYXNpeF9kYXRhICopJmRldi0+ZGF0YTsKKwlpbnQgcmV0LCBlbWJkX3BoeTsKKwl1MTYgcnhfY3RsLCBwaHkxNGgsIHBoeTE1aCwgcGh5MTZoOworCXU4IGNoaXBjb2RlID0gMDsKKworCXJldCA9IGFzaXhfd3JpdGVfZ3BpbyhkZXYsIEFYX0dQSU9fUlNFLCA1LCBpbl9wbSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJZW1iZF9waHkgPSAoKGRldi0+bWlpLnBoeV9pZCAmIDB4MWYpID09IDB4MTAgPyAxIDogMCk7CisKKwlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TV19QSFlfU0VMRUNULCBlbWJkX3BoeSB8CisJCQkgICAgIEFYX1BIWVNFTF9TU0VOLCAwLCAwLCBOVUxMLCBpbl9wbSk7CisJaWYgKHJldCA8IDApIHsKKwkJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgIlNlbGVjdCBQSFkgIzEgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTEwMDApOworCisJcmV0ID0gYXNpeF9zd19yZXNldChkZXYsIEFYX1NXUkVTRVRfSVBQRCB8IEFYX1NXUkVTRVRfSVBSTCwgaW5fcG0pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTEwMDApOworCisJcmV0ID0gYXNpeF9zd19yZXNldChkZXYsIEFYX1NXUkVTRVRfSVBSTCwgaW5fcG0pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCW1zbGVlcCgxNjApOworCisJcmV0ID0gYXNpeF9zd19yZXNldChkZXYsIEFYX1NXUkVTRVRfQ0xFQVIsIGluX3BtKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBhc2l4X3N3X3Jlc2V0KGRldiwgQVhfU1dSRVNFVF9JUFJMLCBpbl9wbSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJbXNsZWVwKDIwMCk7CisKKwlpZiAoaW5fcG0gJiYgKCFhc2l4X21kaW9fcmVhZF9ub3BtKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsCisJCQkJCSAgIE1JSV9QSFlTSUQxKSkpIHsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfU1RBVE1OR1NUU19SRUcsIDAsCisJCQkgICAgMCwgMSwgJmNoaXBjb2RlLCBpbl9wbSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJaWYgKChjaGlwY29kZSAmIEFYX0NISVBDT0RFX01BU0spID09IEFYX0FYODg3NzJCX0NISVBDT0RFKSB7CisJCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfUUNUQ1RSTCwgMHg4MDAwLCAweDgwMDEsCisJCQkJICAgICAwLCBOVUxMLCBpbl9wbSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQluZXRkZXZfZGJnKGRldi0+bmV0LCAiV3JpdGUgQlEgc2V0dGluZyBmYWlsZWQ6ICVkXG4iLAorCQkJCSAgIHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0gZWxzZSBpZiAoKGNoaXBjb2RlICYgQVhfQ0hJUENPREVfTUFTSykgPT0gQVhfQVg4ODc3MkFfQ0hJUENPREUpIHsKKwkJLyogQ2hlY2sgaWYgdGhlIFBIWSByZWdpc3RlcnMgaGF2ZSBkZWZhdWx0IHNldHRpbmdzICovCisJCXBoeTE0aCA9IGFzaXhfbWRpb19yZWFkX25vcG0oZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwKKwkJCQkJICAgICBBWDg4NzcyQV9QSFkxNEgpOworCQlwaHkxNWggPSBhc2l4X21kaW9fcmVhZF9ub3BtKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsCisJCQkJCSAgICAgQVg4ODc3MkFfUEhZMTVIKTsKKwkJcGh5MTZoID0gYXNpeF9tZGlvX3JlYWRfbm9wbShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLAorCQkJCQkgICAgIEFYODg3NzJBX1BIWTE2SCk7CisKKwkJbmV0ZGV2X2RiZyhkZXYtPm5ldCwKKwkJCSAgICI3NzJhX2h3X3Jlc2V0OiBNUjIwPTB4JXggTVIyMT0weCV4IE1SMjI9MHgleFxuIiwKKwkJCSAgIHBoeTE0aCwgcGh5MTVoLCBwaHkxNmgpOworCisJCS8qIFJlc3RvcmUgUEhZIHJlZ2lzdGVycyBkZWZhdWx0IHNldHRpbmcgaWYgbm90ICovCisJCWlmIChwaHkxNGggIT0gQVg4ODc3MkFfUEhZMTRIX0RFRkFVTFQpCisJCQlhc2l4X21kaW9fd3JpdGVfbm9wbShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLAorCQkJCQkgICAgIEFYODg3NzJBX1BIWTE0SCwKKwkJCQkJICAgICBBWDg4NzcyQV9QSFkxNEhfREVGQVVMVCk7CisJCWlmIChwaHkxNWggIT0gQVg4ODc3MkFfUEhZMTVIX0RFRkFVTFQpCisJCQlhc2l4X21kaW9fd3JpdGVfbm9wbShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLAorCQkJCQkgICAgIEFYODg3NzJBX1BIWTE1SCwKKwkJCQkJICAgICBBWDg4NzcyQV9QSFkxNUhfREVGQVVMVCk7CisJCWlmIChwaHkxNmggIT0gQVg4ODc3MkFfUEhZMTZIX0RFRkFVTFQpCisJCQlhc2l4X21kaW9fd3JpdGVfbm9wbShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLAorCQkJCQkgICAgIEFYODg3NzJBX1BIWTE2SCwKKwkJCQkJICAgICBBWDg4NzcyQV9QSFkxNkhfREVGQVVMVCk7CisJfQorCisJcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfSVBHMCwKKwkJCQlBWDg4NzcyX0lQRzBfREVGQVVMVCB8IEFYODg3NzJfSVBHMV9ERUZBVUxULAorCQkJCUFYODg3NzJfSVBHMl9ERUZBVUxULCAwLCBOVUxMLCBpbl9wbSk7CisJaWYgKHJldCA8IDApIHsKKwkJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgIldyaXRlIElQRyxJUEcxLElQRzIgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogUmV3cml0ZSBNQUMgYWRkcmVzcyAqLworCW1lbWNweShkYXRhLT5tYWNfYWRkciwgZGV2LT5uZXQtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfTk9ERV9JRCwgMCwgMCwgRVRIX0FMRU4sCisJCQkJCQkJZGF0YS0+bWFjX2FkZHIsIGluX3BtKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBTZXQgUlhfQ1RMIHRvIGRlZmF1bHQgdmFsdWVzIHdpdGggMmsgYnVmZmVyLCBhbmQgZW5hYmxlIGNhY3R1cyAqLworCXJldCA9IGFzaXhfd3JpdGVfcnhfY3RsKGRldiwgQVhfREVGQVVMVF9SWF9DVEwsIGluX3BtKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBhc2l4X3dyaXRlX21lZGl1bV9tb2RlKGRldiwgQVg4ODc3Ml9NRURJVU1fREVGQVVMVCwgaW5fcG0pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogU2V0IFJYX0NUTCB0byBkZWZhdWx0IHZhbHVlcyB3aXRoIDJrIGJ1ZmZlciwgYW5kIGVuYWJsZSBjYWN0dXMgKi8KKwlyZXQgPSBhc2l4X3dyaXRlX3J4X2N0bChkZXYsIEFYX0RFRkFVTFRfUlhfQ1RMLCBpbl9wbSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcnhfY3RsID0gYXNpeF9yZWFkX3J4X2N0bChkZXYsIGluX3BtKTsKKwluZXRkZXZfZGJnKGRldi0+bmV0LCAiUlhfQ1RMIGlzIDB4JTA0eCBhZnRlciBhbGwgaW5pdGlhbGl6YXRpb25zXG4iLAorCQkgICByeF9jdGwpOworCisJcnhfY3RsID0gYXNpeF9yZWFkX21lZGl1bV9zdGF0dXMoZGV2LCBpbl9wbSk7CisJbmV0ZGV2X2RiZyhkZXYtPm5ldCwKKwkJICAgIk1lZGl1bSBTdGF0dXMgaXMgMHglMDR4IGFmdGVyIGFsbCBpbml0aWFsaXphdGlvbnNcbiIsCisJCSAgIHJ4X2N0bCk7CisKKwlyZXR1cm4gMDsKKworb3V0OgorCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgYXg4ODc3Ml9uZXRkZXZfb3BzID0gewpAQCAtNDE1LDExICs1OTcsOTcgQEAKIAkubmRvX3NldF9yeF9tb2RlICAgICAgICA9IGFzaXhfc2V0X211bHRpY2FzdCwKIH07CiAKK3N0YXRpYyB2b2lkIGF4ODg3NzJfc3VzcGVuZChzdHJ1Y3QgdXNibmV0ICpkZXYpCit7CisJc3RydWN0IGFzaXhfY29tbW9uX3ByaXZhdGUgKnByaXYgPSBkZXYtPmRyaXZlcl9wcml2OworCXUxNiBtZWRpdW07CisKKwkvKiBTdG9wIE1BQyBvcGVyYXRpb24gKi8KKwltZWRpdW0gPSBhc2l4X3JlYWRfbWVkaXVtX3N0YXR1cyhkZXYsIDApOworCW1lZGl1bSAmPSB+QVhfTUVESVVNX1JFOworCWFzaXhfd3JpdGVfbWVkaXVtX21vZGUoZGV2LCBtZWRpdW0sIDApOworCisJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgImF4ODg3NzJfc3VzcGVuZDogbWVkaXVtPTB4JTA0eFxuIiwKKwkJICAgYXNpeF9yZWFkX21lZGl1bV9zdGF0dXMoZGV2LCAwKSk7CisKKwkvKiBQcmVzZXJ2ZSBCTUNSIGZvciByZXN0b3JpbmcgKi8KKwlwcml2LT5wcmVzdmRfcGh5X2JtY3IgPQorCQlhc2l4X21kaW9fcmVhZF9ub3BtKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9CTUNSKTsKKworCS8qIFByZXNlcnZlIEFOQVIgZm9yIHJlc3RvcmluZyAqLworCXByaXYtPnByZXN2ZF9waHlfYWR2ZXJ0aXNlID0KKwkJYXNpeF9tZGlvX3JlYWRfbm9wbShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfQURWRVJUSVNFKTsKK30KKworc3RhdGljIGludCBhc2l4X3N1c3BlbmQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJc3RydWN0IGFzaXhfY29tbW9uX3ByaXZhdGUgKnByaXYgPSBkZXYtPmRyaXZlcl9wcml2OworCisJaWYgKHByaXYtPnN1c3BlbmQpCisJCXByaXYtPnN1c3BlbmQoZGV2KTsKKworCXJldHVybiB1c2JuZXRfc3VzcGVuZChpbnRmLCBtZXNzYWdlKTsKK30KKworc3RhdGljIHZvaWQgYXg4ODc3Ml9yZXN0b3JlX3BoeShzdHJ1Y3QgdXNibmV0ICpkZXYpCit7CisJc3RydWN0IGFzaXhfY29tbW9uX3ByaXZhdGUgKnByaXYgPSBkZXYtPmRyaXZlcl9wcml2OworCisJaWYgKHByaXYtPnByZXN2ZF9waHlfYWR2ZXJ0aXNlKSB7CisJCS8qIFJlc3RvcmUgQWR2ZXJ0aXNlbWVudCBjb250cm9sIHJlZyAqLworCQlhc2l4X21kaW9fd3JpdGVfbm9wbShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfQURWRVJUSVNFLAorCQkJCSAgICAgcHJpdi0+cHJlc3ZkX3BoeV9hZHZlcnRpc2UpOworCisJCS8qIFJlc3RvcmUgQk1DUiAqLworCQlhc2l4X21kaW9fd3JpdGVfbm9wbShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfQk1DUiwKKwkJCQkgICAgIHByaXYtPnByZXN2ZF9waHlfYm1jcik7CisKKwkJbWlpX253YXlfcmVzdGFydCgmZGV2LT5taWkpOworCQlwcml2LT5wcmVzdmRfcGh5X2FkdmVydGlzZSA9IDA7CisJCXByaXYtPnByZXN2ZF9waHlfYm1jciA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBheDg4NzcyX3Jlc3VtZShzdHJ1Y3QgdXNibmV0ICpkZXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorCQlpZiAoIWF4ODg3NzJfaHdfcmVzZXQoZGV2LCAxKSkKKwkJCWJyZWFrOworCWF4ODg3NzJfcmVzdG9yZV9waHkoZGV2KTsKK30KKworc3RhdGljIHZvaWQgYXg4ODc3MmFfcmVzdW1lKHN0cnVjdCB1c2JuZXQgKmRldikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJaWYgKCFheDg4NzcyYV9od19yZXNldChkZXYsIDEpKQorCQkJYnJlYWs7CisJfQorCisJYXg4ODc3Ml9yZXN0b3JlX3BoeShkZXYpOworfQorCitzdGF0aWMgaW50IGFzaXhfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJc3RydWN0IGFzaXhfY29tbW9uX3ByaXZhdGUgKnByaXYgPSBkZXYtPmRyaXZlcl9wcml2OworCisJaWYgKHByaXYtPnJlc3VtZSkKKwkJcHJpdi0+cmVzdW1lKGRldik7CisKKwlyZXR1cm4gdXNibmV0X3Jlc3VtZShpbnRmKTsKK30KKwogc3RhdGljIGludCBheDg4NzcyX2JpbmQoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKLQlpbnQgcmV0LCBlbWJkX3BoeSwgaTsKLQl1OCBidWZbRVRIX0FMRU5dOworCWludCByZXQsIGk7CisJdTggYnVmW0VUSF9BTEVOXSwgY2hpcGNvZGUgPSAwOwogCXUzMiBwaHlpZDsKKwlzdHJ1Y3QgYXNpeF9jb21tb25fcHJpdmF0ZSAqcHJpdjsKIAogCXVzYm5ldF9nZXRfZW5kcG9pbnRzKGRldixpbnRmKTsKIApAQCAtNDI3LDEzICs2OTUsMTMgQEAKIAlpZiAoZGV2LT5kcml2ZXJfaW5mby0+ZGF0YSAmIEZMQUdfRUVQUk9NX01BQykgewogCQlmb3IgKGkgPSAwOyBpIDwgKEVUSF9BTEVOID4+IDEpOyBpKyspIHsKIAkJCXJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9FRVBST00sIDB4MDQgKyBpLAotCQkJCQkwLCAyLCBidWYgKyBpICogMik7CisJCQkJCSAgICAwLCAyLCBidWYgKyBpICogMiwgMCk7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlicmVhazsKIAkJfQogCX0gZWxzZSB7CiAJCXJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9OT0RFX0lELAotCQkJCTAsIDAsIEVUSF9BTEVOLCBidWYpOworCQkJCTAsIDAsIEVUSF9BTEVOLCBidWYsIDApOwogCX0KIAogCWlmIChyZXQgPCAwKSB7CkBAIC00NTYsMTYgKzcyNCwxMSBAQAogCWRldi0+bmV0LT5uZWVkZWRfaGVhZHJvb20gPSA0OyAvKiBjZiBhc2l4X3R4X2ZpeHVwKCkgKi8KIAlkZXYtPm5ldC0+bmVlZGVkX3RhaWxyb29tID0gNDsgLyogY2YgYXNpeF90eF9maXh1cCgpICovCiAKLQllbWJkX3BoeSA9ICgoZGV2LT5taWkucGh5X2lkICYgMHgxZikgPT0gMHgxMCA/IDEgOiAwKTsKKwlhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1NUQVRNTkdTVFNfUkVHLCAwLCAwLCAxLCAmY2hpcGNvZGUsIDApOworCWNoaXBjb2RlICY9IEFYX0NISVBDT0RFX01BU0s7CiAKLQkvKiBSZXNldCB0aGUgUEhZIHRvIG5vcm1hbCBvcGVyYXRpb24gbW9kZSAqLwotCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NXX1BIWV9TRUxFQ1QsIGVtYmRfcGh5LCAwLCAwLCBOVUxMKTsKLQlpZiAocmV0IDwgMCkgewotCQluZXRkZXZfZGJnKGRldi0+bmV0LCAiU2VsZWN0IFBIWSAjMSBmYWlsZWQ6ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWF4ODg3NzJfcmVzZXQoZGV2KTsKKwkoY2hpcGNvZGUgPT0gQVhfQVg4ODc3Ml9DSElQQ09ERSkgPyBheDg4NzcyX2h3X3Jlc2V0KGRldiwgMCkgOgorCQkJCQkgICAgYXg4ODc3MmFfaHdfcmVzZXQoZGV2LCAwKTsKIAogCS8qIFJlYWQgUEhZSUQgcmVnaXN0ZXIgKkFGVEVSKiB0aGUgUEhZIHdhcyByZXNldCBwcm9wZXJseSAqLwogCXBoeWlkID0gYXNpeF9nZXRfcGh5aWQoZGV2KTsKQEAgLTQ4Miw2ICs3NDUsMTggQEAKIAlpZiAoIWRldi0+ZHJpdmVyX3ByaXYpCiAJCXJldHVybiAtRU5PTUVNOwogCisJcHJpdiA9IGRldi0+ZHJpdmVyX3ByaXY7CisKKwlwcml2LT5wcmVzdmRfcGh5X2JtY3IgPSAwOworCXByaXYtPnByZXN2ZF9waHlfYWR2ZXJ0aXNlID0gMDsKKwlpZiAoY2hpcGNvZGUgPT0gQVhfQVg4ODc3Ml9DSElQQ09ERSkgeworCQlwcml2LT5yZXN1bWUgPSBheDg4NzcyX3Jlc3VtZTsKKwkJcHJpdi0+c3VzcGVuZCA9IGF4ODg3NzJfc3VzcGVuZDsKKwl9IGVsc2UgeworCQlwcml2LT5yZXN1bWUgPSBheDg4NzcyYV9yZXN1bWU7CisJCXByaXYtPnN1c3BlbmQgPSBheDg4NzcyX3N1c3BlbmQ7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU5MywxMiArODY4LDEyIEBACiAJaW50IGdwaW8wID0gMDsKIAl1MzIgcGh5aWQ7CiAKLQlhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfR1BJT1MsIDAsIDAsIDEsICZzdGF0dXMpOworCWFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9HUElPUywgMCwgMCwgMSwgJnN0YXR1cywgMCk7CiAJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgIkdQSU8gU3RhdHVzOiAweCUwNHhcbiIsIHN0YXR1cyk7CiAKLQlhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9FTkFCTEUsIDAsIDAsIDAsIE5VTEwpOwotCWFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9FRVBST00sIDB4MDAxNywgMCwgMiwgJmVlcHJvbSk7Ci0JYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfRElTQUJMRSwgMCwgMCwgMCwgTlVMTCk7CisJYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfRU5BQkxFLCAwLCAwLCAwLCBOVUxMLCAwKTsKKwlhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfRUVQUk9NLCAweDAwMTcsIDAsIDIsICZlZXByb20sIDApOworCWFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX0RJU0FCTEUsIDAsIDAsIDAsIE5VTEwsIDApOwogCiAJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgIkVFUFJPTSBpbmRleCAweDE3IGlzIDB4JTA0eFxuIiwgZWVwcm9tKTsKIApAQCAtNjE0LDE1ICs4ODksMTYgQEAKIAluZXRkZXZfZGJnKGRldi0+bmV0LCAiR1BJTzA6ICVkLCBQaHlNb2RlOiAlZFxuIiwgZ3BpbzAsIGRhdGEtPnBoeW1vZGUpOwogCiAJLyogUG93ZXIgdXAgZXh0ZXJuYWwgR2lnYVBIWSB0aHJvdWdoIEFYODgxNzggR1BJTyBwaW4gKi8KLQlhc2l4X3dyaXRlX2dwaW8oZGV2LCBBWF9HUElPX1JTRSB8IEFYX0dQSU9fR1BPXzEgfCBBWF9HUElPX0dQTzFFTiwgNDApOworCWFzaXhfd3JpdGVfZ3BpbyhkZXYsIEFYX0dQSU9fUlNFIHwgQVhfR1BJT19HUE9fMSB8CisJCQlBWF9HUElPX0dQTzFFTiwgNDAsIDApOwogCWlmICgobGUxNl90b19jcHUoZWVwcm9tKSA+PiA4KSAhPSAxKSB7Ci0JCWFzaXhfd3JpdGVfZ3BpbyhkZXYsIDB4MDAzYywgMzApOwotCQlhc2l4X3dyaXRlX2dwaW8oZGV2LCAweDAwMWMsIDMwMCk7Ci0JCWFzaXhfd3JpdGVfZ3BpbyhkZXYsIDB4MDAzYywgMzApOworCQlhc2l4X3dyaXRlX2dwaW8oZGV2LCAweDAwM2MsIDMwLCAwKTsKKwkJYXNpeF93cml0ZV9ncGlvKGRldiwgMHgwMDFjLCAzMDAsIDApOworCQlhc2l4X3dyaXRlX2dwaW8oZGV2LCAweDAwM2MsIDMwLCAwKTsKIAl9IGVsc2UgewogCQluZXRkZXZfZGJnKGRldi0+bmV0LCAiZ3BpbyBwaHltb2RlID09IDEgcGF0aFxuIik7Ci0JCWFzaXhfd3JpdGVfZ3BpbyhkZXYsIEFYX0dQSU9fR1BPMUVOLCAzMCk7Ci0JCWFzaXhfd3JpdGVfZ3BpbyhkZXYsIEFYX0dQSU9fR1BPMUVOIHwgQVhfR1BJT19HUE9fMSwgMzApOworCQlhc2l4X3dyaXRlX2dwaW8oZGV2LCBBWF9HUElPX0dQTzFFTiwgMzAsIDApOworCQlhc2l4X3dyaXRlX2dwaW8oZGV2LCBBWF9HUElPX0dQTzFFTiB8IEFYX0dQSU9fR1BPXzEsIDMwLCAwKTsKIAl9CiAKIAkvKiBSZWFkIFBIWUlEIHJlZ2lzdGVyICpBRlRFUiogcG93ZXJpbmcgdXAgUEhZICovCkBAIC02MzAsMTUgKzkwNiwxNSBAQAogCW5ldGRldl9kYmcoZGV2LT5uZXQsICJQSFlJRD0weCUwOHhcbiIsIHBoeWlkKTsKIAogCS8qIFNldCBBWDg4MTc4IHRvIGVuYWJsZSBNSUkvR01JSS9SR01JSSBpbnRlcmZhY2UgZm9yIGV4dGVybmFsIFBIWSAqLwotCWFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NXX1BIWV9TRUxFQ1QsIDAsIDAsIDAsIE5VTEwpOworCWFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NXX1BIWV9TRUxFQ1QsIDAsIDAsIDAsIE5VTEwsIDApOwogCi0JYXNpeF9zd19yZXNldChkZXYsIDApOworCWFzaXhfc3dfcmVzZXQoZGV2LCAwLCAwKTsKIAltc2xlZXAoMTUwKTsKIAotCWFzaXhfc3dfcmVzZXQoZGV2LCBBWF9TV1JFU0VUX1BSTCB8IEFYX1NXUkVTRVRfSVBQRCk7CisJYXNpeF9zd19yZXNldChkZXYsIEFYX1NXUkVTRVRfUFJMIHwgQVhfU1dSRVNFVF9JUFBELCAwKTsKIAltc2xlZXAoMTUwKTsKIAotCWFzaXhfd3JpdGVfcnhfY3RsKGRldiwgMCk7CisJYXNpeF93cml0ZV9yeF9jdGwoZGV2LCAwLCAwKTsKIAogCWlmIChkYXRhLT5waHltb2RlID09IFBIWV9NT0RFX01BUlZFTEwpIHsKIAkJbWFydmVsbF9waHlfaW5pdChkZXYpOwpAQCAtNjQ2LDI3ICs5MjIsMjMgQEAKIAl9IGVsc2UgaWYgKGRhdGEtPnBoeW1vZGUgPT0gUEhZX01PREVfUlRMODIxMUNMKQogCQlydGw4MjExY2xfcGh5X2luaXQoZGV2KTsKIAotCWFzaXhfbWRpb193cml0ZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfQk1DUiwKLQkJCUJNQ1JfUkVTRVQgfCBCTUNSX0FORU5BQkxFKTsKKwlhc2l4X3BoeV9yZXNldChkZXYsIEJNQ1JfUkVTRVQgfCBCTUNSX0FORU5BQkxFKTsKIAlhc2l4X21kaW9fd3JpdGUoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgTUlJX0FEVkVSVElTRSwKIAkJCUFEVkVSVElTRV9BTEwgfCBBRFZFUlRJU0VfQ1NNQSB8IEFEVkVSVElTRV9QQVVTRV9DQVApOwogCWFzaXhfbWRpb193cml0ZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfQ1RSTDEwMDAsCiAJCQlBRFZFUlRJU0VfMTAwMEZVTEwpOwogCisJYXNpeF93cml0ZV9tZWRpdW1fbW9kZShkZXYsIEFYODgxNzhfTUVESVVNX0RFRkFVTFQsIDApOwogCW1paV9ud2F5X3Jlc3RhcnQoJmRldi0+bWlpKTsKIAotCXJldCA9IGFzaXhfd3JpdGVfbWVkaXVtX21vZGUoZGV2LCBBWDg4MTc4X01FRElVTV9ERUZBVUxUKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQogCS8qIFJld3JpdGUgTUFDIGFkZHJlc3MgKi8KIAltZW1jcHkoZGF0YS0+bWFjX2FkZHIsIGRldi0+bmV0LT5kZXZfYWRkciwgRVRIX0FMRU4pOwogCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX05PREVfSUQsIDAsIDAsIEVUSF9BTEVOLAotCQkJCQkJCWRhdGEtPm1hY19hZGRyKTsKKwkJCQkJCQlkYXRhLT5tYWNfYWRkciwgMCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBhc2l4X3dyaXRlX3J4X2N0bChkZXYsIEFYX0RFRkFVTFRfUlhfQ1RMKTsKKwlyZXQgPSBhc2l4X3dyaXRlX3J4X2N0bChkZXYsIEFYX0RFRkFVTFRfUlhfQ1RMLCAwKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtNzA0LDcgKzk3Niw3IEBACiAJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgImF4ODgxNzhfbGlua19yZXNldCgpIHNwZWVkOiAldSBkdXBsZXg6ICVkIHNldHRpbmcgbW9kZSB0byAweCUwNHhcbiIsCiAJCSAgIHNwZWVkLCBlY21kLmR1cGxleCwgbW9kZSk7CiAKLQlhc2l4X3dyaXRlX21lZGl1bV9tb2RlKGRldiwgbW9kZSk7CisJYXNpeF93cml0ZV9tZWRpdW1fbW9kZShkZXYsIG1vZGUsIDApOwogCiAJaWYgKGRhdGEtPnBoeW1vZGUgPT0gUEhZX01PREVfTUFSVkVMTCAmJiBkYXRhLT5sZWRtb2RlKQogCQltYXJ2ZWxsX2xlZF9zdGF0dXMoZGV2LCBzcGVlZCk7CkBAIC03MzMsMTUgKzEwMDUsMTUgQEAKIAkJbWZiID0gQVhfUlhfQ1RMX01GQl8xNjM4NDsKIAl9CiAKLQlyeGN0bCA9IGFzaXhfcmVhZF9yeF9jdGwoZGV2KTsKLQlhc2l4X3dyaXRlX3J4X2N0bChkZXYsIChyeGN0bCAmIH5BWF9SWF9DVExfTUZCXzE2Mzg0KSB8IG1mYik7CisJcnhjdGwgPSBhc2l4X3JlYWRfcnhfY3RsKGRldiwgMCk7CisJYXNpeF93cml0ZV9yeF9jdGwoZGV2LCAocnhjdGwgJiB+QVhfUlhfQ1RMX01GQl8xNjM4NCkgfCBtZmIsIDApOwogCi0JbWVkaXVtID0gYXNpeF9yZWFkX21lZGl1bV9zdGF0dXMoZGV2KTsKKwltZWRpdW0gPSBhc2l4X3JlYWRfbWVkaXVtX3N0YXR1cyhkZXYsIDApOwogCWlmIChkZXYtPm5ldC0+bXR1ID4gMTUwMCkKIAkJbWVkaXVtIHw9IEFYX01FRElVTV9KRkU7CiAJZWxzZQogCQltZWRpdW0gJj0gfkFYX01FRElVTV9KRkU7Ci0JYXNpeF93cml0ZV9tZWRpdW1fbW9kZShkZXYsIG1lZGl1bSk7CisJYXNpeF93cml0ZV9tZWRpdW1fbW9kZShkZXYsIG1lZGl1bSwgMCk7CiAKIAlpZiAoZGV2LT5yeF91cmJfc2l6ZSA+IG9sZF9yeF91cmJfc2l6ZSkKIAkJdXNibmV0X3VubGlua19yeF91cmJzKGRldik7CkBAIC03OTAsNyArMTA2Miw3IEBACiAJdXNibmV0X2dldF9lbmRwb2ludHMoZGV2LGludGYpOwogCiAJLyogR2V0IHRoZSBNQUMgYWRkcmVzcyAqLwotCXJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9OT0RFX0lELCAwLCAwLCBFVEhfQUxFTiwgYnVmKTsKKwlyZXQgPSBhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfTk9ERV9JRCwgMCwgMCwgRVRIX0FMRU4sIGJ1ZiwgMCk7CiAJaWYgKHJldCA8IDApIHsKIAkJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgIkZhaWxlZCB0byByZWFkIE1BQyBhZGRyZXNzOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKQEAgLTgxMSwxMCArMTA4MywxMCBAQAogCWRldi0+bmV0LT5ldGh0b29sX29wcyA9ICZheDg4MTc4X2V0aHRvb2xfb3BzOwogCiAJLyogQmxpbmsgTEVEUyBzbyB1c2VycyBrbm93IGRyaXZlciBzYXcgZG9uZ2xlICovCi0JYXNpeF9zd19yZXNldChkZXYsIDApOworCWFzaXhfc3dfcmVzZXQoZGV2LCAwLCAwKTsKIAltc2xlZXAoMTUwKTsKIAotCWFzaXhfc3dfcmVzZXQoZGV2LCBBWF9TV1JFU0VUX1BSTCB8IEFYX1NXUkVTRVRfSVBQRCk7CisJYXNpeF9zd19yZXNldChkZXYsIEFYX1NXUkVTRVRfUFJMIHwgQVhfU1dSRVNFVF9JUFBELCAwKTsKIAltc2xlZXAoMTUwKTsKIAogCS8qIEFzaXggZnJhbWluZyBwYWNrcyBtdWx0aXBsZSBldGggZnJhbWVzIGludG8gYSAySyB1c2IgYnVsayB0cmFuc2ZlciAqLwpAQCAtODc3LDcgKzExNDksNyBAQAogCS51bmJpbmQgPSBheDg4NzcyX3VuYmluZCwKIAkuc3RhdHVzID0gYXNpeF9zdGF0dXMsCiAJLmxpbmtfcmVzZXQgPSBheDg4NzcyX2xpbmtfcmVzZXQsCi0JLnJlc2V0ID0gYXg4ODc3Ml9saW5rX3Jlc2V0LAorCS5yZXNldCA9IGF4ODg3NzJfcmVzZXQsCiAJLmZsYWdzID0gRkxBR19FVEhFUiB8IEZMQUdfRlJBTUlOR19BWCB8IEZMQUdfTElOS19JTlRSIHwgRkxBR19NVUxUSV9QQUNLRVQsCiAJLnJ4X2ZpeHVwID0gYXNpeF9yeF9maXh1cF9jb21tb24sCiAJLnR4X2ZpeHVwID0gYXNpeF90eF9maXh1cCwKQEAgLTEwMDUsNyArMTI3Nyw3IEBACiB9LCB7CiAJLy8gTGVub3ZvIFUyTDEwMFAgMTAvMTAwCiAJVVNCX0RFVklDRSAoMHgxN2VmLCAweDcyMDMpLAotCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmYXg4ODc3Ml9pbmZvLAorCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSZheDg4NzcyYl9pbmZvLAogfSwgewogCS8vIEFTSVggQVg4ODc3MkIgMTAvMTAwCiAJVVNCX0RFVklDRSAoMHgwYjk1LCAweDc3MmIpLApAQCAtMTA3Myw3ICsxMzQ1LDcgQEAKIH0sIHsKIAkvLyBBc3VzIFVTQiBFdGhlcm5ldCBBZGFwdGVyCiAJVVNCX0RFVklDRSAoMHgwYjk1LCAweDdlMmIpLAotCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmYXg4ODc3Ml9pbmZvLAorCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSZheDg4NzcyYl9pbmZvLAogfSwgewogCS8qIEFTSVggODgxNzJhIGRlbW8gYm9hcmQgKi8KIAlVU0JfREVWSUNFKDB4MGI5NSwgMHgxNzJhKSwKQEAgLTEwOTUsOCArMTM2Nyw4IEBACiAJLm5hbWUgPQkJRFJJVkVSX05BTUUsCiAJLmlkX3RhYmxlID0JcHJvZHVjdHMsCiAJLnByb2JlID0JdXNibmV0X3Byb2JlLAotCS5zdXNwZW5kID0JdXNibmV0X3N1c3BlbmQsCi0JLnJlc3VtZSA9CXVzYm5ldF9yZXN1bWUsCisJLnN1c3BlbmQgPQlhc2l4X3N1c3BlbmQsCisJLnJlc3VtZSA9CWFzaXhfcmVzdW1lLAogCS5kaXNjb25uZWN0ID0JdXNibmV0X2Rpc2Nvbm5lY3QsCiAJLnN1cHBvcnRzX2F1dG9zdXNwZW5kID0gMSwKIAkuZGlzYWJsZV9odWJfaW5pdGlhdGVkX2xwbSA9IDEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvYXg4ODE3MmEuYyBiL2RyaXZlcnMvbmV0L3VzYi9heDg4MTcyYS5jCmluZGV4IDE2M2EyYzUuLjQ5YTNiYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9heDg4MTcyYS5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9heDg4MTcyYS5jCkBAIC04MSw3ICs4MSw3IEBACiAJfQogCiAJaWYgKG1vZGUgIT0gcHJpdi0+b2xkbW9kZSkgewotCQlhc2l4X3dyaXRlX21lZGl1bV9tb2RlKGRldiwgbW9kZSk7CisJCWFzaXhfd3JpdGVfbWVkaXVtX21vZGUoZGV2LCBtb2RlLCAwKTsKIAkJcHJpdi0+b2xkbW9kZSA9IG1vZGU7CiAJCW5ldGRldl9kYmcobmV0ZGV2LCAic3BlZWQgJXUgZHVwbGV4ICVkLCBzZXR0aW5nIG1vZGUgdG8gMHglMDR4XG4iLAogCQkJICAgcGh5ZGV2LT5zcGVlZCwgcGh5ZGV2LT5kdXBsZXgsIG1vZGUpOwpAQCAtMTc2LDE4ICsxNzYsMTkgQEAKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gYXNpeF9zd19yZXNldChkZXYsIEFYX1NXUkVTRVRfSVBQRCk7CisJcmV0ID0gYXNpeF9zd19yZXNldChkZXYsIEFYX1NXUkVTRVRfSVBQRCwgMCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyOwogCiAJbXNsZWVwKDE1MCk7Ci0JcmV0ID0gYXNpeF9zd19yZXNldChkZXYsIEFYX1NXUkVTRVRfQ0xFQVIpOworCXJldCA9IGFzaXhfc3dfcmVzZXQoZGV2LCBBWF9TV1JFU0VUX0NMRUFSLCAwKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnI7CiAKIAltc2xlZXAoMTUwKTsKIAotCXJldCA9IGFzaXhfc3dfcmVzZXQoZGV2LCBlbWJkX3BoeSA/IEFYX1NXUkVTRVRfSVBSTCA6IEFYX1NXUkVTRVRfSVBQRCk7CisJcmV0ID0gYXNpeF9zd19yZXNldChkZXYsIGVtYmRfcGh5ID8gQVhfU1dSRVNFVF9JUFJMIDogQVhfU1dSRVNFVF9JUFBELAorCQkJICAgIDApOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycjsKIApAQCAtMjEzLDcgKzIxNCw3IEBACiAJZGV2LT5kcml2ZXJfcHJpdiA9IHByaXY7CiAKIAkvKiBHZXQgdGhlIE1BQyBhZGRyZXNzICovCi0JcmV0ID0gYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX05PREVfSUQsIDAsIDAsIEVUSF9BTEVOLCBidWYpOworCXJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9OT0RFX0lELCAwLCAwLCBFVEhfQUxFTiwgYnVmLCAwKTsKIAlpZiAocmV0IDwgMCkgewogCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiRmFpbGVkIHRvIHJlYWQgTUFDIGFkZHJlc3M6ICVkXG4iLCByZXQpOwogCQlnb3RvIGZyZWU7CkBAIC0yMjQsNyArMjI1LDcgQEAKIAlkZXYtPm5ldC0+ZXRodG9vbF9vcHMgPSAmYXg4ODE3MmFfZXRodG9vbF9vcHM7CiAKIAkvKiBhcmUgd2UgdXNpbmcgdGhlIGludGVybmFsIG9yIHRoZSBleHRlcm5hbCBwaHk/ICovCi0JcmV0ID0gYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9TV19QSFlfU1RBVFVTLCAwLCAwLCAxLCBidWYpOworCXJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfU1dfUEhZX1NUQVRVUywgMCwgMCwgMSwgYnVmLCAwKTsKIAlpZiAocmV0IDwgMCkgewogCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiRmFpbGVkIHRvIHJlYWQgc29mdHdhcmUgaW50ZXJmYWNlIHNlbGVjdGlvbiByZWdpc3RlcjogJWRcbiIsCiAJCQkgICByZXQpOwpAQCAtMzAzLDIwICszMDQsMjAgQEAKIAlheDg4MTcyYV9yZXNldF9waHkoZGV2LCBwcml2LT51c2VfZW1iZHBoeSk7CiAKIAltc2xlZXAoMTUwKTsKLQlyeF9jdGwgPSBhc2l4X3JlYWRfcnhfY3RsKGRldik7CisJcnhfY3RsID0gYXNpeF9yZWFkX3J4X2N0bChkZXYsIDApOwogCW5ldGRldl9kYmcoZGV2LT5uZXQsICJSWF9DVEwgaXMgMHglMDR4IGFmdGVyIHNvZnR3YXJlIHJlc2V0XG4iLCByeF9jdGwpOwotCXJldCA9IGFzaXhfd3JpdGVfcnhfY3RsKGRldiwgMHgwMDAwKTsKKwlyZXQgPSBhc2l4X3dyaXRlX3J4X2N0bChkZXYsIDB4MDAwMCwgMCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0JcnhfY3RsID0gYXNpeF9yZWFkX3J4X2N0bChkZXYpOworCXJ4X2N0bCA9IGFzaXhfcmVhZF9yeF9jdGwoZGV2LCAwKTsKIAluZXRkZXZfZGJnKGRldi0+bmV0LCAiUlhfQ1RMIGlzIDB4JTA0eCBzZXR0aW5nIHRvIDB4MDAwMFxuIiwgcnhfY3RsKTsKIAogCW1zbGVlcCgxNTApOwogCiAJcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfSVBHMCwKIAkJCSAgICAgQVg4ODc3Ml9JUEcwX0RFRkFVTFQgfCBBWDg4NzcyX0lQRzFfREVGQVVMVCwKLQkJCSAgICAgQVg4ODc3Ml9JUEcyX0RFRkFVTFQsIDAsIE5VTEwpOworCQkJICAgICBBWDg4NzcyX0lQRzJfREVGQVVMVCwgMCwgTlVMTCwgMCk7CiAJaWYgKHJldCA8IDApIHsKIAkJbmV0ZGV2X2VycihkZXYtPm5ldCwgIldyaXRlIElQRyxJUEcxLElQRzIgZmFpbGVkOiAlZFxuIiwgcmV0KTsKIAkJZ290byBvdXQ7CkBAIC0zMjUsMjAgKzMyNiwyMCBAQAogCS8qIFJld3JpdGUgTUFDIGFkZHJlc3MgKi8KIAltZW1jcHkoZGF0YS0+bWFjX2FkZHIsIGRldi0+bmV0LT5kZXZfYWRkciwgRVRIX0FMRU4pOwogCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX05PREVfSUQsIDAsIDAsIEVUSF9BTEVOLAotCQkJICAgICBkYXRhLT5tYWNfYWRkcik7CisJCQkgICAgIGRhdGEtPm1hY19hZGRyLCAwKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKIAkvKiBTZXQgUlhfQ1RMIHRvIGRlZmF1bHQgdmFsdWVzIHdpdGggMmsgYnVmZmVyLCBhbmQgZW5hYmxlIGNhY3R1cyAqLwotCXJldCA9IGFzaXhfd3JpdGVfcnhfY3RsKGRldiwgQVhfREVGQVVMVF9SWF9DVEwpOworCXJldCA9IGFzaXhfd3JpdGVfcnhfY3RsKGRldiwgQVhfREVGQVVMVF9SWF9DVEwsIDApOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAotCXJ4X2N0bCA9IGFzaXhfcmVhZF9yeF9jdGwoZGV2KTsKKwlyeF9jdGwgPSBhc2l4X3JlYWRfcnhfY3RsKGRldiwgMCk7CiAJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgIlJYX0NUTCBpcyAweCUwNHggYWZ0ZXIgYWxsIGluaXRpYWxpemF0aW9uc1xuIiwKIAkJICAgcnhfY3RsKTsKIAotCXJ4X2N0bCA9IGFzaXhfcmVhZF9tZWRpdW1fc3RhdHVzKGRldik7CisJcnhfY3RsID0gYXNpeF9yZWFkX21lZGl1bV9zdGF0dXMoZGV2LCAwKTsKIAluZXRkZXZfZGJnKGRldi0+bmV0LCAiTWVkaXVtIFN0YXR1cyBpcyAweCUwNHggYWZ0ZXIgYWxsIGluaXRpYWxpemF0aW9uc1xuIiwKIAkJICAgcnhfY3RsKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2hzby5jIGIvZHJpdmVycy9uZXQvdXNiL2hzby5jCmluZGV4IDRiNDQ1ODYuLmU3YjUxNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9oc28uYworKysgYi9kcml2ZXJzL25ldC91c2IvaHNvLmMKQEAgLTUwLDYgKzUwLDggQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTEwOCwyMyArMTEwLDEyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZWJ1Z2dpbmcgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIERfXyhsdmxfLCBmbXQsIGFyZy4uLikJCQkJXAotCWRvIHsJCQkJCQlcCi0JCXByaW50ayhsdmxfICJbJWQ6JXNdOiAiIGZtdCAiXG4iLAlcCi0JCSAgICAgICBfX0xJTkVfXywgX19mdW5jX18sICMjIGFyZyk7CVwKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIERfKGx2bCwgYXJncy4uLikJCQkJXAotCWRvIHsJCQkJCQlcCi0JCWlmIChsdmwgJiBkZWJ1ZykJCQlcCi0JCQlEX18oS0VSTl9JTkZPLCBhcmdzKTsJCVwKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIEQxKGFyZ3MuLi4pCURfKDB4MDEsICMjYXJncykKLSNkZWZpbmUgRDIoYXJncy4uLikJRF8oMHgwMiwgIyNhcmdzKQotI2RlZmluZSBEMyhhcmdzLi4uKQlEXygweDA0LCAjI2FyZ3MpCi0jZGVmaW5lIEQ0KGFyZ3MuLi4pCURfKDB4MDgsICMjYXJncykKLSNkZWZpbmUgRDUoYXJncy4uLikJRF8oMHgxMCwgIyNhcmdzKQorI2RlZmluZSBoc29fZGJnKGx2bCwgZm10LCAuLi4pCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAoKGx2bCkgJiBkZWJ1ZykJCQkJCQlcCisJCXByX2luZm8oIlslZDolc10gIiBmbXQsCQkJCQlcCisJCQlfX0xJTkVfXywgX19mdW5jX18sICMjX19WQV9BUkdTX18pOwkJXAorfSB3aGlsZSAoMCkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRW51bWVyYXRvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjQ5LDcgKzY0MCw3IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlcmlhbF90YWJsZV9sb2NrLCBmbGFncyk7CiAKLQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyBmcmVlIHNlcmlhbCBkZXZpY2VzIGluIHRhYmxlXG4iLCBfX2Z1bmNfXyk7CisJcHJfZXJyKCIlczogbm8gZnJlZSBzZXJpYWwgZGV2aWNlcyBpbiB0YWJsZVxuIiwgX19mdW5jX18pOwogCXJldHVybiAtMTsKIH0KIApAQCAtNzA5LDcgKzcwMCw4IEBACiAJfQogCiAJLyogbG9nIGEgbWVhbmluZ2Z1bCBleHBsYW5hdGlvbiBvZiBhbiBVU0Igc3RhdHVzICovCi0JRDEoIiVzOiByZWNlaXZlZCBVU0Igc3RhdHVzIC0gJXMgKCVkKSIsIGZ1bmN0aW9uLCBleHBsYW5hdGlvbiwgc3RhdHVzKTsKKwloc29fZGJnKDB4MSwgIiVzOiByZWNlaXZlZCBVU0Igc3RhdHVzIC0gJXMgKCVkKVxuIiwKKwkJZnVuY3Rpb24sIGV4cGxhbmF0aW9uLCBzdGF0dXMpOwogfQogCiAvKiBOZXR3b3JrIGludGVyZmFjZSBmdW5jdGlvbnMgKi8KQEAgLTgwOCw3ICs4MDAsNyBAQAogCURVTVAxKHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwogCS8qIENvcHkgaXQgZnJvbSBrZXJuZWwgbWVtb3J5IHRvIE9VUiBtZW1vcnkgKi8KIAltZW1jcHkob2Rldi0+bXV4X2J1bGtfdHhfYnVmLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKLQlEMSgibGVuOiAlZC8lZCIsIHNrYi0+bGVuLCBNVVhfQlVMS19UWF9CVUZfU0laRSk7CisJaHNvX2RiZygweDEsICJsZW46ICVkLyVkXG4iLCBza2ItPmxlbiwgTVVYX0JVTEtfVFhfQlVGX1NJWkUpOwogCiAJLyogRmlsbCBpbiB0aGUgVVJCIGZvciBzaGlwcGluZyBpdCBvdXQuICovCiAJdXNiX2ZpbGxfYnVsa191cmIob2Rldi0+bXV4X2J1bGtfdHhfdXJiLApAQCAtODcyLDcgKzg2NCw3IEBACiAJdW5zaWduZWQgY2hhciAqdG1wX3J4X2J1ZjsKIAogCS8qIGxvZyBpZiBuZWVkZWQgKi8KLQlEMSgiUnggJWQgYnl0ZXMiLCBjb3VudCk7CisJaHNvX2RiZygweDEsICJSeCAlZCBieXRlc1xuIiwgY291bnQpOwogCURVTVAoaXBfcGt0LCBtaW4oMTI4LCAoaW50KWNvdW50KSk7CiAKIAl3aGlsZSAoY291bnQpIHsKQEAgLTkxMiw3ICs5MDQsNyBAQAogCQkJCQkJCQkgICAgZnJhbWVfbGVuKTsKIAkJCQlpZiAoIW9kZXYtPnNrYl9yeF9idWYpIHsKIAkJCQkJLyogV2UgZ290IG5vIHJlY2VpdmUgYnVmZmVyLiAqLwotCQkJCQlEMSgiY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSIpOworCQkJCQloc29fZGJnKDB4MSwgImNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnlcbiIpOwogCQkJCQlvZGV2LT5yeF9wYXJzZV9zdGF0ZSA9IFdBSVRfU1lOQzsKIAkJCQkJY29udGludWU7CiAJCQkJfQpAQCAtOTcyLDExICs5NjQsMTEgQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgV0FJVF9TWU5DOgotCQkJRDEoIiBXX1MiKTsKKwkJCWhzb19kYmcoMHgxLCAiIFdfU1xuIik7CiAJCQljb3VudCA9IDA7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCUQxKCIgIik7CisJCQloc29fZGJnKDB4MSwgIlxuIik7CiAJCQljb3VudC0tOwogCQkJYnJlYWs7CiAJCX0KQEAgLTEwMjAsNyArMTAxMiw3IEBACiAKIAkvKiBTYW5pdHkgY2hlY2sgKi8KIAlpZiAoIW9kZXYgfHwgIXRlc3RfYml0KEhTT19ORVRfUlVOTklORywgJm9kZXYtPmZsYWdzKSkgewotCQlEMSgiQlVMSyBJTiBjYWxsYmFjayBidXQgZHJpdmVyIGlzIG5vdCBhY3RpdmUhIik7CisJCWhzb19kYmcoMHgxLCAiQlVMSyBJTiBjYWxsYmFjayBidXQgZHJpdmVyIGlzIG5vdCBhY3RpdmUhXG4iKTsKIAkJcmV0dXJuOwogCX0KIAl1c2JfbWFya19sYXN0X2J1c3kodXJiLT5kZXYpOwpAQCAtMTExMiwxMSArMTEwNCwxMSBAQAogCXN0cnVjdCBoc29fc2VyaWFsICpzZXJpYWwgPSB0dHktPmRyaXZlcl9kYXRhOwogCiAJaWYgKCFzZXJpYWwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogbm8gdHR5IHN0cnVjdHVyZXMiLCBfX2Z1bmNfXyk7CisJCXByX2VycigiJXM6IG5vIHR0eSBzdHJ1Y3R1cmVzIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCi0JRDQoInBvcnQgJWQiLCBzZXJpYWwtPm1pbm9yKTsKKwloc29fZGJnKDB4OCwgInBvcnQgJWRcbiIsIHNlcmlhbC0+bWlub3IpOwogCiAJLyoKIAkgKglGaXggdXAgdW5zdXBwb3J0ZWQgYml0cwpAQCAtMTIwNSwxMSArMTE5NywxMSBAQAogCXN0cnVjdCBoc29fc2VyaWFsICpzZXJpYWwgPSB1cmItPmNvbnRleHQ7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JRDQoIlxuLS0tIEdvdCBzZXJpYWxfcmVhZF9idWxrIGNhbGxiYWNrICUwMnggLS0tIiwgc3RhdHVzKTsKKwloc29fZGJnKDB4OCwgIi0tLSBHb3Qgc2VyaWFsX3JlYWRfYnVsayBjYWxsYmFjayAlMDJ4IC0tLVxuIiwgc3RhdHVzKTsKIAogCS8qIHNhbml0eSBjaGVjayAqLwogCWlmICghc2VyaWFsKSB7Ci0JCUQxKCJzZXJpYWwgPT0gTlVMTCIpOworCQloc29fZGJnKDB4MSwgInNlcmlhbCA9PSBOVUxMXG4iKTsKIAkJcmV0dXJuOwogCX0KIAlpZiAoc3RhdHVzKSB7CkBAIC0xMjE3LDcgKzEyMDksNyBAQAogCQlyZXR1cm47CiAJfQogCi0JRDEoIkFjdHVhbCBsZW5ndGggPSAlZFxuIiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwloc29fZGJnKDB4MSwgIkFjdHVhbCBsZW5ndGggPSAlZFxuIiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAlEVU1QMSh1cmItPnRyYW5zZmVyX2J1ZmZlciwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAogCS8qIEFueW9uZSBsaXN0ZW5pbmc/ICovCkBAIC0xMjY2LDcgKzEyNTgsNyBAQAogCWlmIChzZXJpYWwgPT0gTlVMTCB8fCBzZXJpYWwtPm1hZ2ljICE9IEhTT19TRVJJQUxfTUFHSUMpIHsKIAkJV0FSTl9PTigxKTsKIAkJdHR5LT5kcml2ZXJfZGF0YSA9IE5VTEw7Ci0JCUQxKCJGYWlsZWQgdG8gb3BlbiBwb3J0Iik7CisJCWhzb19kYmcoMHgxLCAiRmFpbGVkIHRvIG9wZW4gcG9ydFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMTI3NSw3ICsxMjY3LDcgQEAKIAlpZiAocmVzdWx0IDwgMCkKIAkJZ290byBlcnJfb3V0OwogCi0JRDEoIk9wZW5pbmcgJWQiLCBzZXJpYWwtPm1pbm9yKTsKKwloc29fZGJnKDB4MSwgIk9wZW5pbmcgJWRcbiIsIHNlcmlhbC0+bWlub3IpOwogCiAJLyogc2V0dXAgKi8KIAl0dHktPmRyaXZlcl9kYXRhID0gc2VyaWFsOwpAQCAtMTI5OCw3ICsxMjkwLDcgQEAKIAkJCWtyZWZfZ2V0KCZzZXJpYWwtPnBhcmVudC0+cmVmKTsKIAkJfQogCX0gZWxzZSB7Ci0JCUQxKCJQb3J0IHdhcyBhbHJlYWR5IG9wZW4iKTsKKwkJaHNvX2RiZygweDEsICJQb3J0IHdhcyBhbHJlYWR5IG9wZW5cbiIpOwogCX0KIAogCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShzZXJpYWwtPnBhcmVudC0+aW50ZXJmYWNlKTsKQEAgLTEzMTcsNyArMTMwOSw3IEBACiAJc3RydWN0IGhzb19zZXJpYWwgKnNlcmlhbCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJdTggdXNiX2dvbmU7CiAKLQlEMSgiQ2xvc2luZyBzZXJpYWwgcG9ydCIpOworCWhzb19kYmcoMHgxLCAiQ2xvc2luZyBzZXJpYWwgcG9ydFxuIik7CiAKIAkvKiBPcGVuIGZhaWxlZCwgbm8gY2xvc2UgY2xlYW51cCByZXF1aXJlZCAqLwogCWlmIChzZXJpYWwgPT0gTlVMTCkKQEAgLTEzNTcsNyArMTM0OSw3IEBACiAKIAkvKiBzYW5pdHkgY2hlY2sgKi8KIAlpZiAoc2VyaWFsID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogc2VyaWFsIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcHJfZXJyKCIlczogc2VyaWFsIGlzIE5VTExcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xNDEyLDggKzE0MDQsOCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAob2xkKQotCQlENSgiVGVybWlvcyBjYWxsZWQgd2l0aDogY2ZsYWdzIG5ld1slZF0gLSBvbGRbJWRdIiwKLQkJICAgdHR5LT50ZXJtaW9zLmNfY2ZsYWcsIG9sZC0+Y19jZmxhZyk7CisJCWhzb19kYmcoMHgxNiwgIlRlcm1pb3MgY2FsbGVkIHdpdGg6IGNmbGFncyBuZXdbJWRdIC0gb2xkWyVkXVxuIiwKKwkJCXR0eS0+dGVybWlvcy5jX2NmbGFnLCBvbGQtPmNfY2ZsYWcpOwogCiAJLyogdGhlIGFjdHVhbCBzZXR1cCAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZzZXJpYWwtPnNlcmlhbF9sb2NrLCBmbGFncyk7CkBAIC0xNjQ5LDcgKzE2NDEsNyBAQAogCiAJLyogc2FuaXR5IGNoZWNrICovCiAJaWYgKCFzZXJpYWwpIHsKLQkJRDEoIm5vIHR0eSBzdHJ1Y3R1cmVzIik7CisJCWhzb19kYmcoMHgxLCAibm8gdHR5IHN0cnVjdHVyZXNcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJc3Bpbl9sb2NrX2lycSgmc2VyaWFsLT5zZXJpYWxfbG9jayk7CkBAIC0xNjgyLDcgKzE2NzQsNyBAQAogCiAJLyogc2FuaXR5IGNoZWNrICovCiAJaWYgKCFzZXJpYWwpIHsKLQkJRDEoIm5vIHR0eSBzdHJ1Y3R1cmVzIik7CisJCWhzb19kYmcoMHgxLCAibm8gdHR5IHN0cnVjdHVyZXNcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE3MjEsNyArMTcxMyw3IEBACiB7CiAJc3RydWN0IGhzb19zZXJpYWwgKnNlcmlhbCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaW50IHJldCA9IDA7Ci0JRDQoIklPQ1RMIGNtZDogJWQsIGFyZzogJWxkIiwgY21kLCBhcmcpOworCWhzb19kYmcoMHg4LCAiSU9DVEwgY21kOiAlZCwgYXJnOiAlbGRcbiIsIGNtZCwgYXJnKTsKIAogCWlmICghc2VyaWFsKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTE3ODMsNyArMTc3NSw3IEBACiAKIAkvKiBTYW5pdHkgY2hlY2sgKi8KIAlpZiAoIXNlcmlhbCB8fCAhY3RybF91cmIgfHwgIWN0cmxfcmVxKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IFdyb25nIGFyZ3VtZW50c1xuIiwgX19mdW5jX18pOworCQlwcl9lcnIoIiVzOiBXcm9uZyBhcmd1bWVudHNcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xODA4LDkgKzE4MDAsOSBAQAogCQlwaXBlID0gdXNiX3NuZGN0cmxwaXBlKHNlcmlhbC0+cGFyZW50LT51c2IsIDApOwogCX0KIAkvKiBzeXNsb2cgKi8KLQlEMigiJXMgY29tbWFuZCAoJTAyeCkgbGVuOiAlZCwgcG9ydDogJWQiLAotCSAgIHR5cGUgPT0gVVNCX0NEQ19HRVRfRU5DQVBTVUxBVEVEX1JFU1BPTlNFID8gIlJlYWQiIDogIldyaXRlIiwKLQkgICBjdHJsX3JlcS0+YlJlcXVlc3RUeXBlLCBjdHJsX3JlcS0+d0xlbmd0aCwgcG9ydCk7CisJaHNvX2RiZygweDIsICIlcyBjb21tYW5kICglMDJ4KSBsZW46ICVkLCBwb3J0OiAlZFxuIiwKKwkJdHlwZSA9PSBVU0JfQ0RDX0dFVF9FTkNBUFNVTEFURURfUkVTUE9OU0UgPyAiUmVhZCIgOiAiV3JpdGUiLAorCQljdHJsX3JlcS0+YlJlcXVlc3RUeXBlLCBjdHJsX3JlcS0+d0xlbmd0aCwgcG9ydCk7CiAKIAkvKiBMb2FkIGN0cmwgdXJiICovCiAJY3RybF91cmItPnRyYW5zZmVyX2ZsYWdzID0gMDsKQEAgLTE4NzYsMTEgKzE4NjgsMTEgQEAKIAkJaGFuZGxlX3VzYl9lcnJvcihzdGF0dXMsIF9fZnVuY19fLCBOVUxMKTsKIAkJcmV0dXJuOwogCX0KLQlENCgiXG4tLS0gR290IGludHIgY2FsbGJhY2sgMHglMDJYIC0tLSIsIHN0YXR1cyk7CisJaHNvX2RiZygweDgsICItLS0gR290IGludHIgY2FsbGJhY2sgMHglMDJYIC0tLVxuIiwgc3RhdHVzKTsKIAogCS8qIHdoYXQgcmVxdWVzdD8gKi8KIAlwb3J0X3JlcSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwotCUQ0KCIgcG9ydF9yZXEgPSAweCUuMlhcbiIsICpwb3J0X3JlcSk7CisJaHNvX2RiZygweDgsICJwb3J0X3JlcSA9IDB4JS4yWFxuIiwgKnBvcnRfcmVxKTsKIAkvKiBsb29wIG92ZXIgYWxsIG11eGVkIHBvcnRzIHRvIGZpbmQgdGhlIG9uZSBzZW5kaW5nIHRoaXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAJCS8qIG1heCA4IGNoYW5uZWxzIG9uIE1VWCAqLwpAQCAtMTg4OCw3ICsxODgwLDggQEAKIAkJCXNlcmlhbCA9IGdldF9zZXJpYWxfYnlfc2hhcmVkX2ludF9hbmRfdHlwZShzaGFyZWRfaW50LAogCQkJCQkJCQkgICAoMSA8PCBpKSk7CiAJCQlpZiAoc2VyaWFsICE9IE5VTEwpIHsKLQkJCQlEMSgiUGVuZGluZyByZWFkIGludGVycnVwdCBvbiBwb3J0ICVkXG4iLCBpKTsKKwkJCQloc29fZGJnKDB4MSwgIlBlbmRpbmcgcmVhZCBpbnRlcnJ1cHQgb24gcG9ydCAlZFxuIiwKKwkJCQkJaSk7CiAJCQkJc3Bpbl9sb2NrKCZzZXJpYWwtPnNlcmlhbF9sb2NrKTsKIAkJCQlpZiAoc2VyaWFsLT5yeF9zdGF0ZSA9PSBSWF9JRExFICYmCiAJCQkJCXNlcmlhbC0+cG9ydC5jb3VudCA+IDApIHsKQEAgLTE5MDAsOCArMTg5Myw4IEBACiAJCQkJCX0gZWxzZQogCQkJCQkJc2VyaWFsLT5yeF9zdGF0ZSA9IFJYX1BFTkRJTkc7CiAJCQkJfSBlbHNlIHsKLQkJCQkJRDEoIkFscmVhZHkgYSByZWFkIHBlbmRpbmcgb24gIgotCQkJCQkgICAicG9ydCAlZCBvciBwb3J0IG5vdCBvcGVuXG4iLCBpKTsKKwkJCQkJaHNvX2RiZygweDEsICJBbHJlYWR5IGEgcmVhZCBwZW5kaW5nIG9uIHBvcnQgJWQgb3IgcG9ydCBub3Qgb3BlblxuIiwKKwkJCQkJCWkpOwogCQkJCX0KIAkJCQlzcGluX3VubG9jaygmc2VyaWFsLT5zZXJpYWxfbG9jayk7CiAJCQl9CkBAIC0xOTMzLDcgKzE5MjYsNyBAQAogCiAJLyogc2FuaXR5IGNoZWNrICovCiAJaWYgKCFzZXJpYWwpIHsKLQkJRDEoInNlcmlhbCA9PSBOVUxMIik7CisJCWhzb19kYmcoMHgxLCAic2VyaWFsID09IE5VTExcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xOTQ4LDcgKzE5NDEsNyBAQAogCXR0eV9wb3J0X3R0eV93YWtldXAoJnNlcmlhbC0+cG9ydCk7CiAJaHNvX2tpY2tfdHJhbnNtaXQoc2VyaWFsKTsKIAotCUQxKCIgIik7CisJaHNvX2RiZygweDEsICJcbiIpOwogfQogCiAvKiBjYWxsZWQgZm9yIHdyaXRpbmcgZGlhZyBvciBDUyBzZXJpYWwgcG9ydCAqLwpAQCAtMTk5Niw4ICsxOTg5LDggQEAKIAogCS8qIHdoYXQgcmVxdWVzdD8gKi8KIAlyZXEgPSAoc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKSh1cmItPnNldHVwX3BhY2tldCk7Ci0JRDQoIlxuLS0tIEdvdCBtdXhlZCBjdHJsIGNhbGxiYWNrIDB4JTAyWCAtLS0iLCBzdGF0dXMpOwotCUQ0KCJBY3R1YWwgbGVuZ3RoIG9mIHVyYiA9ICVkXG4iLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCWhzb19kYmcoMHg4LCAiLS0tIEdvdCBtdXhlZCBjdHJsIGNhbGxiYWNrIDB4JTAyWCAtLS1cbiIsIHN0YXR1cyk7CisJaHNvX2RiZygweDgsICJBY3R1YWwgbGVuZ3RoIG9mIHVyYiA9ICVkXG4iLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCURVTVAxKHVyYi0+dHJhbnNmZXJfYnVmZmVyLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCiAJaWYgKHJlcS0+YlJlcXVlc3RUeXBlID09CkBAIC0yMDIzLDcgKzIwMTYsNyBAQAogCiAJLyogU2FuaXR5IGNoZWNrICovCiAJaWYgKHVyYiA9PSBOVUxMIHx8IHNlcmlhbCA9PSBOVUxMKSB7Ci0JCUQxKCJzZXJpYWwgPSBOVUxMIik7CisJCWhzb19kYmcoMHgxLCAic2VyaWFsID0gTlVMTFxuIik7CiAJCXJldHVybiAtMjsKIAl9CiAKQEAgLTIwMzUsNyArMjAyOCw3IEBACiAJfQogCiAJLyogUHVzaCBkYXRhIHRvIHR0eSAqLwotCUQxKCJkYXRhIHRvIHB1c2ggdG8gdHR5Iik7CisJaHNvX2RiZygweDEsICJkYXRhIHRvIHB1c2ggdG8gdHR5XG4iKTsKIAljb3VudCA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKCZzZXJpYWwtPnBvcnQsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJaWYgKGNvdW50ID49IHVyYi0+YWN0dWFsX2xlbmd0aCkgewogCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKCZzZXJpYWwtPnBvcnQsIHVyYi0+dHJhbnNmZXJfYnVmZmVyLApAQCAtMjMwMCwxMCArMjI5Myw4IEBACiAJc2VyaWFsLT5yeF9kYXRhX2xlbmd0aCA9IHJ4X3NpemU7CiAJZm9yIChpID0gMDsgaSA8IHNlcmlhbC0+bnVtX3J4X3VyYnM7IGkrKykgewogCQlzZXJpYWwtPnJ4X3VyYltpXSA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghc2VyaWFsLT5yeF91cmJbaV0pIHsKLQkJCWRldl9lcnIoZGV2LCAiQ291bGQgbm90IGFsbG9jYXRlIHVyYj9cbiIpOworCQlpZiAoIXNlcmlhbC0+cnhfdXJiW2ldKQogCQkJZ290byBleGl0OwotCQl9CiAJCXNlcmlhbC0+cnhfdXJiW2ldLT50cmFuc2Zlcl9idWZmZXIgPSBOVUxMOwogCQlzZXJpYWwtPnJ4X3VyYltpXS0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IDA7CiAJCXNlcmlhbC0+cnhfZGF0YVtpXSA9IGt6YWxsb2Moc2VyaWFsLT5yeF9kYXRhX2xlbmd0aCwKQEAgLTIzMTQsMTAgKzIzMDUsOCBAQAogCiAJLyogVFgsIGFsbG9jYXRlIHVyYiBhbmQgaW5pdGlhbGl6ZSAqLwogCXNlcmlhbC0+dHhfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNlcmlhbC0+dHhfdXJiKSB7Ci0JCWRldl9lcnIoZGV2LCAiQ291bGQgbm90IGFsbG9jYXRlIHVyYj9cbiIpOworCWlmICghc2VyaWFsLT50eF91cmIpCiAJCWdvdG8gZXhpdDsKLQl9CiAJc2VyaWFsLT50eF91cmItPnRyYW5zZmVyX2J1ZmZlciA9IE5VTEw7CiAJc2VyaWFsLT50eF91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSAwOwogCS8qIHByZXBhcmUgb3VyIFRYIGJ1ZmZlciAqLwpAQCAtMjQxOSw3ICsyNDA4LDcgQEAKIHsKIAlzdHJ1Y3QgaHNvX25ldCAqaHNvX25ldCA9IG5ldGRldl9wcml2KG5ldCk7CiAKLQlEMSgic2l6ZW9mIGhzb19uZXQgaXMgJWQiLCAoaW50KXNpemVvZigqaHNvX25ldCkpOworCWhzb19kYmcoMHgxLCAic2l6ZW9mIGhzb19uZXQgaXMgJXp1XG4iLCBzaXplb2YoKmhzb19uZXQpKTsKIAogCS8qIGZpbGwgaW4gdGhlIG90aGVyIGZpZWxkcyAqLwogCW5ldC0+bmV0ZGV2X29wcyA9ICZoc29fbmV0ZGV2X29wczsKQEAgLTI1NTUsMjAgKzI1NDQsMTYgQEAKIAkvKiBzdGFydCBhbGxvY2F0aW5nICovCiAJZm9yIChpID0gMDsgaSA8IE1VWF9CVUxLX1JYX0JVRl9DT1VOVDsgaSsrKSB7CiAJCWhzb19uZXQtPm11eF9idWxrX3J4X3VyYl9wb29sW2ldID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFoc29fbmV0LT5tdXhfYnVsa19yeF91cmJfcG9vbFtpXSkgewotCQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJDb3VsZCBub3QgYWxsb2NhdGUgcnggdXJiXG4iKTsKKwkJaWYgKCFoc29fbmV0LT5tdXhfYnVsa19yeF91cmJfcG9vbFtpXSkKIAkJCWdvdG8gZXhpdDsKLQkJfQogCQloc29fbmV0LT5tdXhfYnVsa19yeF9idWZfcG9vbFtpXSA9IGt6YWxsb2MoTVVYX0JVTEtfUlhfQlVGX1NJWkUsCiAJCQkJCQkJICAgR0ZQX0tFUk5FTCk7CiAJCWlmICghaHNvX25ldC0+bXV4X2J1bGtfcnhfYnVmX3Bvb2xbaV0pCiAJCQlnb3RvIGV4aXQ7CiAJfQogCWhzb19uZXQtPm11eF9idWxrX3R4X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFoc29fbmV0LT5tdXhfYnVsa190eF91cmIpIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJDb3VsZCBub3QgYWxsb2NhdGUgdHggdXJiXG4iKTsKKwlpZiAoIWhzb19uZXQtPm11eF9idWxrX3R4X3VyYikKIAkJZ290byBleGl0OwotCX0KIAloc29fbmV0LT5tdXhfYnVsa190eF9idWYgPSBremFsbG9jKE1VWF9CVUxLX1RYX0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWhzb19uZXQtPm11eF9idWxrX3R4X2J1ZikKIAkJZ290byBleGl0OwpAQCAtMjc4NywxMCArMjc3Miw4IEBACiAJfQogCiAJbXV4LT5zaGFyZWRfaW50cl91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghbXV4LT5zaGFyZWRfaW50cl91cmIpIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJDb3VsZCBub3QgYWxsb2NhdGUgaW50ciB1cmI/XG4iKTsKKwlpZiAoIW11eC0+c2hhcmVkX2ludHJfdXJiKQogCQlnb3RvIGV4aXQ7Ci0JfQogCW11eC0+c2hhcmVkX2ludHJfYnVmID0KIAkJa3phbGxvYyhsZTE2X3RvX2NwdShtdXgtPmludHJfZW5kcC0+d01heFBhY2tldFNpemUpLAogCQkJR0ZQX0tFUk5FTCk7CkBAIC0zMjM5LDcgKzMyMjIsNyBAQAogCWludCByZXN1bHQ7CiAKIAkvKiBwdXQgaXQgaW4gdGhlIGxvZyAqLwotCXByaW50ayhLRVJOX0lORk8gImhzbzogJXNcbiIsIHZlcnNpb24pOworCXByX2luZm8oIiVzXG4iLCB2ZXJzaW9uKTsKIAogCS8qIEluaXRpYWxpc2UgdGhlIHNlcmlhbCB0YWJsZSBzZW1hcGhvcmUgYW5kIHRhYmxlICovCiAJc3Bpbl9sb2NrX2luaXQoJnNlcmlhbF90YWJsZV9sb2NrKTsKQEAgLTMyNzAsMTYgKzMyNTMsMTUgQEAKIAkvKiByZWdpc3RlciB0aGUgdHR5IGRyaXZlciAqLwogCXJlc3VsdCA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIodHR5X2Rydik7CiAJaWYgKHJlc3VsdCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzIC0gdHR5X3JlZ2lzdGVyX2RyaXZlciBmYWlsZWQoJWQpXG4iLAotCQkJX19mdW5jX18sIHJlc3VsdCk7CisJCXByX2VycigiJXMgLSB0dHlfcmVnaXN0ZXJfZHJpdmVyIGZhaWxlZCglZClcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgcmVzdWx0KTsKIAkJZ290byBlcnJfZnJlZV90dHk7CiAJfQogCiAJLyogcmVnaXN0ZXIgdGhpcyBtb2R1bGUgYXMgYW4gdXNiIGRyaXZlciAqLwogCXJlc3VsdCA9IHVzYl9yZWdpc3RlcigmaHNvX2RyaXZlcik7CiAJaWYgKHJlc3VsdCkgewotCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCByZWdpc3RlciBoc28gZHJpdmVyPyBlcnJvcjogJWRcbiIsCi0JCQlyZXN1bHQpOworCQlwcl9lcnIoIkNvdWxkIG5vdCByZWdpc3RlciBoc28gZHJpdmVyIC0gZXJyb3I6ICVkXG4iLCByZXN1bHQpOwogCQlnb3RvIGVycl91bnJlZ190dHk7CiAJfQogCkBAIC0zMjk0LDcgKzMyNzYsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaHNvX2V4aXQodm9pZCkKIHsKLQlwcmludGsoS0VSTl9JTkZPICJoc286IHVubG9hZGVkXG4iKTsKKwlwcl9pbmZvKCJ1bmxvYWRlZFxuIik7CiAKIAl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIodHR5X2Rydik7CiAJcHV0X3R0eV9kcml2ZXIodHR5X2Rydik7CkBAIC0zMzExLDcgKzMyOTMsNyBAQAogTU9EVUxFX0xJQ0VOU0UoTU9EX0xJQ0VOU0UpOwogCiAvKiBjaGFuZ2UgdGhlIGRlYnVnIGxldmVsIChlZzogaW5zbW9kIGhzby5rbyBkZWJ1Zz0weDA0KSAqLwotTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkxldmVsIG9mIGRlYnVnIFsweDAxIHwgMHgwMiB8IDB4MDQgfCAweDA4IHwgMHgxMF0iKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJkZWJ1ZyBsZXZlbCBtYXNrIFsweDAxIHwgMHgwMiB8IDB4MDQgfCAweDA4IHwgMHgxMF0iKTsKIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CiAKIC8qIHNldCB0aGUgbWFqb3IgdHR5IG51bWJlciAoZWc6IGluc21vZCBoc28ua28gdHR5X21ham9yPTI0NSkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9rYXdldGguYyBiL2RyaXZlcnMvbmV0L3VzYi9rYXdldGguYwppbmRleCA3NzAyMTJiLi42NmIzNGRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2Iva2F3ZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2thd2V0aC5jCkBAIC0yNjUsOCArMjY1LDYgQEAKIAlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpkcjsKIAlpbnQgcmV0dmFsOwogCi0JbmV0ZGV2X2RiZyhrYXdldGgtPm5ldCwgImthd2V0aF9jb250cm9sKClcbiIpOwotCiAJaWYoaW5faW50ZXJydXB0KCkpIHsKIAkJbmV0ZGV2X2RiZyhrYXdldGgtPm5ldCwgImluX2ludGVycnVwdCgpXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTMwMCw4ICsyOTgsNiBAQAogewogCWludCByZXR2YWw7CiAKLQluZXRkZXZfZGJnKGthd2V0aC0+bmV0LCAiUmVhZGluZyBrYXdldGggY29uZmlndXJhdGlvblxuIik7Ci0KIAlyZXR2YWwgPSBrYXdldGhfY29udHJvbChrYXdldGgsCiAJCQkJdXNiX3JjdmN0cmxwaXBlKGthd2V0aC0+ZGV2LCAwKSwKIAkJCQlLQVdFVEhfQ09NTUFORF9HRVRfRVRIRVJORVRfREVTQywKQEAgLTQ1MSw4ICs0NDcsNiBAQAogCWthd2V0aC0+ZmlybXdhcmVfYnVmWzZdID0gMHgwMDsKIAlrYXdldGgtPmZpcm13YXJlX2J1Zls3XSA9IDB4MDA7CiAKLQluZXRkZXZfZGJnKGthd2V0aC0+bmV0LCAiVHJpZ2dlcmluZyBmaXJtd2FyZVxuIik7Ci0KIAlyZXR1cm4ga2F3ZXRoX2NvbnRyb2woa2F3ZXRoLAogCQkJICAgICAgdXNiX3NuZGN0cmxwaXBlKGthd2V0aC0+ZGV2LCAwKSwKIAkJCSAgICAgIEtBV0VUSF9DT01NQU5EX1NDQU4sCkBAIC00NzEsNyArNDY1LDYgQEAKIHsKIAlpbnQgcmVzdWx0OwogCi0JbmV0ZGV2X2RiZyhrYXdldGgtPm5ldCwgImthd2V0aF9yZXNldCglcClcbiIsIGthd2V0aCk7CiAJcmVzdWx0ID0gdXNiX3Jlc2V0X2NvbmZpZ3VyYXRpb24oa2F3ZXRoLT5kZXYpOwogCW1kZWxheSgxMCk7CiAKQEAgLTY4NSw4ICs2NzgsNiBAQAogCXN0cnVjdCBrYXdldGhfZGV2aWNlICprYXdldGggPSBuZXRkZXZfcHJpdihuZXQpOwogCWludCByZXM7CiAKLQluZXRkZXZfZGJnKGthd2V0aC0+bmV0LCAiT3BlbmluZyBuZXR3b3JrIGRldmljZS5cbiIpOwotCiAJcmVzID0gdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKGthd2V0aC0+aW50Zik7CiAJaWYgKHJlcykgewogCQlkZXZfZXJyKCZrYXdldGgtPmludGYtPmRldiwgIkludGVyZmFjZSBjYW5ub3QgYmUgcmVzdW1lZC5cbiIpOwpAQCAtOTUxLDcgKzk0Miw2IEBACiAJc3RydWN0IGthd2V0aF9kZXZpY2UgKmthd2V0aCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRldl9kYmcoJmludGYtPmRldiwgIlN1c3BlbmRpbmcgZGV2aWNlXG4iKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgma2F3ZXRoLT5kZXZpY2VfbG9jaywgZmxhZ3MpOwogCWthd2V0aC0+c3RhdHVzIHw9IEtBV0VUSF9TVEFUVVNfU1VTUEVORElORzsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrYXdldGgtPmRldmljZV9sb2NrLCBmbGFncyk7CkBAIC05NjgsNyArOTU4LDYgQEAKIAlzdHJ1Y3Qga2F3ZXRoX2RldmljZSAqa2F3ZXRoID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGV2X2RiZygmaW50Zi0+ZGV2LCAiUmVzdW1pbmcgZGV2aWNlXG4iKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgma2F3ZXRoLT5kZXZpY2VfbG9jaywgZmxhZ3MpOwogCWthd2V0aC0+c3RhdHVzICY9IH5LQVdFVEhfU1RBVFVTX1NVU1BFTkRJTkc7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma2F3ZXRoLT5kZXZpY2VfbG9jaywgZmxhZ3MpOwpAQCAtMTAwOSw2ICs5OTgsNyBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CiAJY29uc3QgZXRoX2FkZHJfdCBiY2FzdF9hZGRyID0geyAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGIH07CiAJaW50IHJlc3VsdCA9IDA7CisJaW50IHJ2ID0gLUVJTzsKIAogCWRldl9kYmcoZGV2LAogCQkiS2F3YXNha2kgRGV2aWNlIFByb2JlIChEZXZpY2UgbnVtYmVyOiVkKTogMHglNC40eDoweCU0LjR4OjB4JTQuNHhcbiIsCkBAIC0xMDI5LDYgKzEwMTksNyBAQAogCWthd2V0aCA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJa2F3ZXRoLT5kZXYgPSB1ZGV2OwogCWthd2V0aC0+bmV0ID0gbmV0ZGV2OworCWthd2V0aC0+aW50ZiA9IGludGY7CiAKIAlzcGluX2xvY2tfaW5pdCgma2F3ZXRoLT5kZXZpY2VfbG9jayk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgma2F3ZXRoLT50ZXJtX3dhaXQpOwpAQCAtMTA0OCw2ICsxMDM5LDEwIEBACiAJCS8qIERvd25sb2FkIHRoZSBmaXJtd2FyZSAqLwogCQlkZXZfaW5mbyhkZXYsICJEb3dubG9hZGluZyBmaXJtd2FyZS4uLlxuIik7CiAJCWthd2V0aC0+ZmlybXdhcmVfYnVmID0gKF9fdTggKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCWlmICgha2F3ZXRoLT5maXJtd2FyZV9idWYpIHsKKwkJCXJ2ID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyX2ZyZWVfbmV0ZGV2OworCQl9CiAJCWlmICgocmVzdWx0ID0ga2F3ZXRoX2Rvd25sb2FkX2Zpcm13YXJlKGthd2V0aCwKIAkJCQkJCSAgICAgICJrYXdldGgvbmV3X2NvZGUuYmluIiwKIAkJCQkJCSAgICAgIDEwMCwKQEAgLTExMzksOCArMTEzNCw2IEBACiAKIAlkZXZfZGJnKGRldiwgIkluaXRpYWxpemluZyBuZXQgZGV2aWNlLlxuIik7CiAKLQlrYXdldGgtPmludGYgPSBpbnRmOwotCiAJa2F3ZXRoLT50eF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCWlmICgha2F3ZXRoLT50eF91cmIpCiAJCWdvdG8gZXJyX2ZyZWVfbmV0ZGV2OwpAQCAtMTE4Niw4ICsxMTc5LDYgQEAKIAlkZXZfaW5mbyhkZXYsICJrYXdldGggaW50ZXJmYWNlIGNyZWF0ZWQgYXQgJXNcbiIsCiAJCSBrYXdldGgtPm5ldC0+bmFtZSk7CiAKLQlkZXZfZGJnKGRldiwgIkthd2V0aCBwcm9iZSByZXR1cm5pbmcuXG4iKTsKLQogCXJldHVybiAwOwogCiBlcnJfaW50ZmRhdGE6CkBAIC0xMjA0LDcgKzExOTUsNyBAQAogZXJyX2ZyZWVfbmV0ZGV2OgogCWZyZWVfbmV0ZGV2KG5ldGRldik7CiAKLQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gcnY7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMjE1LDggKzEyMDYsNiBAQAogCXN0cnVjdCBrYXdldGhfZGV2aWNlICprYXdldGggPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CiAKLQlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiVW5yZWdpc3RlcmluZ1xuIik7Ci0KIAl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOwogCWlmICgha2F3ZXRoKSB7CiAJCWRldl93YXJuKCZpbnRmLT5kZXYsICJ1bnJlZ2lzdGVyaW5nIG5vbi1leGlzdGVudCBkZXZpY2VcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2xhbjc4eHguYyBiL2RyaXZlcnMvbmV0L3VzYi9sYW43OHh4LmMKaW5kZXggNmE5ZDQ3NC4uZGI1NThiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL2xhbjc4eHguYworKysgYi9kcml2ZXJzL25ldC91c2IvbGFuNzh4eC5jCkBAIC0xMTc5LDcgKzExNzksNyBAQAogICogTk9URTogIGFubm95aW5nIGFzeW1tZXRyeTogIGlmIGl0J3MgYWN0aXZlLCBzY2hlZHVsZV93b3JrKCkgZmFpbHMsCiAgKiBidXQgdGFza2xldF9zY2hlZHVsZSgpIGRvZXNuJ3QuCWhvcGUgdGhlIGZhaWx1cmUgaXMgcmFyZS4KICAqLwotdm9pZCBsYW43OHh4X2RlZmVyX2tldmVudChzdHJ1Y3QgbGFuNzh4eF9uZXQgKmRldiwgaW50IHdvcmspCitzdGF0aWMgdm9pZCBsYW43OHh4X2RlZmVyX2tldmVudChzdHJ1Y3QgbGFuNzh4eF9uZXQgKmRldiwgaW50IHdvcmspCiB7CiAJc2V0X2JpdCh3b3JrLCAmZGV2LT5mbGFncyk7CiAJaWYgKCFzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRldi0+d3EsIDApKQpAQCAtMTQwNiw3ICsxNDA2LDcgQEAKIAlyZXR1cm4gbmV0LT5waHlkZXYtPmxpbms7CiB9CiAKLWludCBsYW43OHh4X253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKK3N0YXRpYyBpbnQgbGFuNzh4eF9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCiB7CiAJcmV0dXJuIHBoeV9zdGFydF9hbmVnKG5ldC0+cGh5ZGV2KTsKIH0KQEAgLTE5OTcsNyArMTk5Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBsYW43OHh4X3NldF9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB2b2lkICpwKQorc3RhdGljIGludCBsYW43OHh4X3NldF9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB2b2lkICpwKQogewogCXN0cnVjdCBsYW43OHh4X25ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOwpAQCAtMjM3MSw3ICsyMzcxLDcgQEAKIAlyZW1vdmVfd2FpdF9xdWV1ZSgmdW5saW5rX3dha2V1cCwgJndhaXQpOwogfQogCi1pbnQgbGFuNzh4eF9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCitzdGF0aWMgaW50IGxhbjc4eHhfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQogewogCXN0cnVjdCBsYW43OHh4X25ldAkJKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CiAKQEAgLTI1MzMsNyArMjUzMyw4IEBACiAJZW50cnktPnN0YXRlID0gc3RhdGU7CiB9CiAKLW5ldGRldl90eF90IGxhbjc4eHhfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQorc3RhdGljIG5ldGRldl90eF90CitsYW43OHh4X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKIHsKIAlzdHJ1Y3QgbGFuNzh4eF9uZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjIgPSBOVUxMOwpAQCAtMjU2Miw3ICsyNTYzLDggQEAKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogfQogCi1pbnQgbGFuNzh4eF9nZXRfZW5kcG9pbnRzKHN0cnVjdCBsYW43OHh4X25ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3N0YXRpYyBpbnQKK2xhbjc4eHhfZ2V0X2VuZHBvaW50cyhzdHJ1Y3QgbGFuNzh4eF9uZXQgKmRldiwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CiAJaW50IHRtcDsKIAlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICphbHQgPSBOVUxMOwpAQCAtMjcwMCw3ICsyNzAyLDcgQEAKIAl9CiB9CiAKLXZvaWQgbGFuNzh4eF9za2JfcmV0dXJuKHN0cnVjdCBsYW43OHh4X25ldCAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHZvaWQgbGFuNzh4eF9za2JfcmV0dXJuKHN0cnVjdCBsYW43OHh4X25ldCAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWludAkJc3RhdHVzOwogCkBAIC0zMDAyLDEwICszMDA0LDggQEAKIAogZ3NvX3NrYjoKIAl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOwotCWlmICghdXJiKSB7Ci0JCW5ldGlmX2RiZyhkZXYsIHR4X2VyciwgZGV2LT5uZXQsICJubyB1cmJcbiIpOworCWlmICghdXJiKQogCQlnb3RvIGRyb3A7Ci0JfQogCiAJZW50cnkgPSAoc3RydWN0IHNrYl9kYXRhICopc2tiLT5jYjsKIAllbnRyeS0+dXJiID0gdXJiOwpAQCAtMzI4NSw3ICszMjg1LDcgQEAKIAl1c2JfcHV0X2Rldih1ZGV2KTsKIH0KIAotdm9pZCBsYW43OHh4X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKK3N0YXRpYyB2b2lkIGxhbjc4eHhfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQogewogCXN0cnVjdCBsYW43OHh4X25ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKIApAQCAtMzYwNSw3ICszNjA1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGxhbjc4eHhfc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCitzdGF0aWMgaW50IGxhbjc4eHhfc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCiB7CiAJc3RydWN0IGxhbjc4eHhfbmV0ICpkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCXN0cnVjdCBsYW43OHh4X3ByaXYgKnBkYXRhID0gKHN0cnVjdCBsYW43OHh4X3ByaXYgKikoZGV2LT5kYXRhWzBdKTsKQEAgLTM3MDEsNyArMzcwMSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGxhbjc4eHhfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQorc3RhdGljIGludCBsYW43OHh4X3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlzdHJ1Y3QgbGFuNzh4eF9uZXQgKmRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTM3NjgsNyArMzc2OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBsYW43OHh4X3Jlc2V0X3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3N0YXRpYyBpbnQgbGFuNzh4eF9yZXNldF9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CiAJc3RydWN0IGxhbjc4eHhfbmV0ICpkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvcGVnYXN1cy5jIGIvZHJpdmVycy9uZXQvdXNiL3BlZ2FzdXMuYwppbmRleCA5YmJlMDE2MS4uMTQzNGU1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL3BlZ2FzdXMuYworKysgYi9kcml2ZXJzL25ldC91c2IvcGVnYXN1cy5jCkBAIC0xMTI5LDcgKzExMjksOCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmIChwZWdhc3VzX2NvdW50ID09IDApIHsKLQkJcGVnYXN1c193b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgicGVnYXN1cyIpOworCQlwZWdhc3VzX3dvcmtxdWV1ZSA9IGFsbG9jX3dvcmtxdWV1ZSgicGVnYXN1cyIsIFdRX01FTV9SRUNMQUlNLAorCQkJCQkJICAgIDApOwogCQlpZiAoIXBlZ2FzdXNfd29ya3F1ZXVlKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL3I4MTUyLmMgYi9kcml2ZXJzL25ldC91c2IvcjgxNTIuYwppbmRleCBmNDFhOGFkLi40NGQ0MzlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvcjgxNTIuYworKysgYi9kcml2ZXJzL25ldC91c2IvcjgxNTIuYwpAQCAtMzIsNyArMzIsNyBAQAogI2RlZmluZSBORVRORVhUX1ZFUlNJT04JCSIwOCIKIAogLyogSW5mb3JtYXRpb24gZm9yIG5ldCAqLwotI2RlZmluZSBORVRfVkVSU0lPTgkJIjUiCisjZGVmaW5lIE5FVF9WRVJTSU9OCQkiNiIKIAogI2RlZmluZSBEUklWRVJfVkVSU0lPTgkJInYxLiIgTkVUTkVYVF9WRVJTSU9OICIuIiBORVRfVkVSU0lPTgogI2RlZmluZSBEUklWRVJfQVVUSE9SICJSZWFsdGVrIGxpbnV4IG5pYyBtYWludGFpbmVycyA8bmljX3N3c2RAcmVhbHRlay5jb20+IgpAQCAtMTA3Niw4ICsxMDc2LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJaWYgKG9iai0+dHlwZSAhPSBBQ1BJX1RZUEVfQlVGRkVSIHx8IG9iai0+c3RyaW5nLmxlbmd0aCAhPSAweDE3KSB7CiAJCW5ldGlmX3dhcm4odHAsIHByb2JlLCB0cC0+bmV0ZGV2LAotCQkJICAgIkludmFsaWQgYnVmZmVyIHdoZW4gcmVhZGluZyBwYXNzLXRocnUgTUFDIGFkZHI6ICIKLQkJCSAgICIoJWQsICVkKVxuIiwKKwkJCSAgICJJbnZhbGlkIGJ1ZmZlciBmb3IgcGFzcy10aHJ1IE1BQyBhZGRyOiAoJWQsICVkKVxuIiwKIAkJCSAgIG9iai0+dHlwZSwgb2JqLT5zdHJpbmcubGVuZ3RoKTsKIAkJZ290byBhbWFjb3V0OwogCX0KQEAgLTEwOTAsOCArMTA4OSw4IEBACiAJcmV0ID0gaGV4MmJpbihidWYsIG9iai0+c3RyaW5nLnBvaW50ZXIgKyA5LCA2KTsKIAlpZiAoIShyZXQgPT0gMCAmJiBpc192YWxpZF9ldGhlcl9hZGRyKGJ1ZikpKSB7CiAJCW5ldGlmX3dhcm4odHAsIHByb2JlLCB0cC0+bmV0ZGV2LAotCQkJICAgIkludmFsaWQgTUFDIHdoZW4gcmVhZGluZyBwYXNzLXRocnUgTUFDIGFkZHI6ICIKLQkJCSAgICIlZCwgJXBNXG4iLCByZXQsIGJ1Zik7CisJCQkgICAiSW52YWxpZCBNQUMgZm9yIHBhc3MtdGhydSBNQUMgYWRkcjogJWQsICVwTVxuIiwKKwkJCSAgIHJldCwgYnVmKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBhbWFjb3V0OwogCX0KQEAgLTExMTEsOSArMTExMCw5IEBACiAJc3RydWN0IHNvY2thZGRyIHNhOwogCWludCByZXQ7CiAKLQlpZiAodHAtPnZlcnNpb24gPT0gUlRMX1ZFUl8wMSkKKwlpZiAodHAtPnZlcnNpb24gPT0gUlRMX1ZFUl8wMSkgewogCQlyZXQgPSBwbGFfb2NwX3JlYWQodHAsIFBMQV9JRFIsIDgsIHNhLnNhX2RhdGEpOwotCWVsc2UgeworCX0gZWxzZSB7CiAJCS8qIGlmIHRoaXMgaXMgbm90IGFuIFJUTDgxNTMtQUQsIG5vIGVGdXNlIG1hYyBwYXNzIHRocnUgc2V0LAogCQkgKiBvciBzeXN0ZW0gZG9lc24ndCBwcm92aWRlIHZhbGlkIF9TQi5BTUFDIHRoaXMgd2lsbCBiZQogCQkgKiBiZSBleHBlY3RlZCB0byBub24temVybwpAQCAtMjU1Miw2ICsyNTUxLDc3IEBACiAJfQogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgcjgxNTJfbW1kX2luZGlyZWN0KHN0cnVjdCByODE1MiAqdHAsIHUxNiBkZXYsIHUxNiByZWcpCit7CisJb2NwX3JlZ193cml0ZSh0cCwgT0NQX0VFRV9BUiwgRlVOX0FERFIgfCBkZXYpOworCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9FRUVfREFUQSwgcmVnKTsKKwlvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfRUVFX0FSLCBGVU5fREFUQSB8IGRldik7Cit9CisKK3N0YXRpYyB1MTYgcjgxNTJfbW1kX3JlYWQoc3RydWN0IHI4MTUyICp0cCwgdTE2IGRldiwgdTE2IHJlZykKK3sKKwl1MTYgZGF0YTsKKworCXI4MTUyX21tZF9pbmRpcmVjdCh0cCwgZGV2LCByZWcpOworCWRhdGEgPSBvY3BfcmVnX3JlYWQodHAsIE9DUF9FRUVfREFUQSk7CisJb2NwX3JlZ193cml0ZSh0cCwgT0NQX0VFRV9BUiwgMHgwMDAwKTsKKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgdm9pZCByODE1Ml9tbWRfd3JpdGUoc3RydWN0IHI4MTUyICp0cCwgdTE2IGRldiwgdTE2IHJlZywgdTE2IGRhdGEpCit7CisJcjgxNTJfbW1kX2luZGlyZWN0KHRwLCBkZXYsIHJlZyk7CisJb2NwX3JlZ193cml0ZSh0cCwgT0NQX0VFRV9EQVRBLCBkYXRhKTsKKwlvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfRUVFX0FSLCAweDAwMDApOworfQorCitzdGF0aWMgdm9pZCByODE1Ml9lZWVfZW4oc3RydWN0IHI4MTUyICp0cCwgYm9vbCBlbmFibGUpCit7CisJdTE2IGNvbmZpZzEsIGNvbmZpZzIsIGNvbmZpZzM7CisJdTMyIG9jcF9kYXRhOworCisJb2NwX2RhdGEgPSBvY3BfcmVhZF93b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9FRUVfQ1IpOworCWNvbmZpZzEgPSBvY3BfcmVnX3JlYWQodHAsIE9DUF9FRUVfQ09ORklHMSkgJiB+c2RfcmlzZV90aW1lX21hc2s7CisJY29uZmlnMiA9IG9jcF9yZWdfcmVhZCh0cCwgT0NQX0VFRV9DT05GSUcyKTsKKwljb25maWczID0gb2NwX3JlZ19yZWFkKHRwLCBPQ1BfRUVFX0NPTkZJRzMpICYgfmZhc3Rfc25yX21hc2s7CisKKwlpZiAoZW5hYmxlKSB7CisJCW9jcF9kYXRhIHw9IEVFRV9SWF9FTiB8IEVFRV9UWF9FTjsKKwkJY29uZmlnMSB8PSBFRUVfMTBfQ0FQIHwgRUVFX05XQVlfRU4gfCBUWF9RVUlFVF9FTiB8IFJYX1FVSUVUX0VOOworCQljb25maWcxIHw9IHNkX3Jpc2VfdGltZSgxKTsKKwkJY29uZmlnMiB8PSBSR19EQUNRVUlFVF9FTiB8IFJHX0xEVlFVSUVUX0VOOworCQljb25maWczIHw9IGZhc3Rfc25yKDQyKTsKKwl9IGVsc2UgeworCQlvY3BfZGF0YSAmPSB+KEVFRV9SWF9FTiB8IEVFRV9UWF9FTik7CisJCWNvbmZpZzEgJj0gfihFRUVfMTBfQ0FQIHwgRUVFX05XQVlfRU4gfCBUWF9RVUlFVF9FTiB8CisJCQkgICAgIFJYX1FVSUVUX0VOKTsKKwkJY29uZmlnMSB8PSBzZF9yaXNlX3RpbWUoNyk7CisJCWNvbmZpZzIgJj0gfihSR19EQUNRVUlFVF9FTiB8IFJHX0xEVlFVSUVUX0VOKTsKKwkJY29uZmlnMyB8PSBmYXN0X3Nucig1MTEpOworCX0KKworCW9jcF93cml0ZV93b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9FRUVfQ1IsIG9jcF9kYXRhKTsKKwlvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfRUVFX0NPTkZJRzEsIGNvbmZpZzEpOworCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9FRUVfQ09ORklHMiwgY29uZmlnMik7CisJb2NwX3JlZ193cml0ZSh0cCwgT0NQX0VFRV9DT05GSUczLCBjb25maWczKTsKK30KKworc3RhdGljIHZvaWQgcjgxNTJiX2VuYWJsZV9lZWUoc3RydWN0IHI4MTUyICp0cCkKK3sKKwlyODE1Ml9lZWVfZW4odHAsIHRydWUpOworCXI4MTUyX21tZF93cml0ZSh0cCwgTURJT19NTURfQU4sIE1ESU9fQU5fRUVFX0FEViwgTURJT19FRUVfMTAwVFgpOworfQorCitzdGF0aWMgdm9pZCByODE1MmJfZW5hYmxlX2ZjKHN0cnVjdCByODE1MiAqdHApCit7CisJdTE2IGFuYXI7CisKKwlhbmFyID0gcjgxNTJfbWRpb19yZWFkKHRwLCBNSUlfQURWRVJUSVNFKTsKKwlhbmFyIHw9IEFEVkVSVElTRV9QQVVTRV9DQVAgfCBBRFZFUlRJU0VfUEFVU0VfQVNZTTsKKwlyODE1Ml9tZGlvX3dyaXRlKHRwLCBNSUlfQURWRVJUSVNFLCBhbmFyKTsKK30KKwogc3RhdGljIHZvaWQgcnRsODE1Ml9kaXNhYmxlKHN0cnVjdCByODE1MiAqdHApCiB7CiAJcjgxNTJfYWxkcHNfZW4odHAsIGZhbHNlKTsKQEAgLTI1NjEsMTMgKzI2MzEsOSBAQAogCiBzdGF0aWMgdm9pZCByODE1MmJfaHdfcGh5X2NmZyhzdHJ1Y3QgcjgxNTIgKnRwKQogewotCXUxNiBkYXRhOwotCi0JZGF0YSA9IHI4MTUyX21kaW9fcmVhZCh0cCwgTUlJX0JNQ1IpOwotCWlmIChkYXRhICYgQk1DUl9QRE9XTikgewotCQlkYXRhICY9IH5CTUNSX1BET1dOOwotCQlyODE1Ml9tZGlvX3dyaXRlKHRwLCBNSUlfQk1DUiwgZGF0YSk7Ci0JfQorCXI4MTUyYl9lbmFibGVfZWVlKHRwKTsKKwlyODE1Ml9hbGRwc19lbih0cCwgdHJ1ZSk7CisJcjgxNTJiX2VuYWJsZV9mYyh0cCk7CiAKIAlzZXRfYml0KFBIWV9SRVNFVCwgJnRwLT5mbGFncyk7CiB9CkBAIC0yNzAxLDIwICsyNzY3LDUyIEBACiAJb2NwX3dyaXRlX2R3b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9SQ1IsIG9jcF9kYXRhKTsKIH0KIAorc3RhdGljIHZvaWQgcjgxNTNfYWxkcHNfZW4oc3RydWN0IHI4MTUyICp0cCwgYm9vbCBlbmFibGUpCit7CisJdTE2IGRhdGE7CisKKwlkYXRhID0gb2NwX3JlZ19yZWFkKHRwLCBPQ1BfUE9XRVJfQ0ZHKTsKKwlpZiAoZW5hYmxlKSB7CisJCWRhdGEgfD0gRU5fQUxEUFM7CisJCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9QT1dFUl9DRkcsIGRhdGEpOworCX0gZWxzZSB7CisJCWRhdGEgJj0gfkVOX0FMRFBTOworCQlvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfUE9XRVJfQ0ZHLCBkYXRhKTsKKwkJbXNsZWVwKDIwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHI4MTUzX2VlZV9lbihzdHJ1Y3QgcjgxNTIgKnRwLCBib29sIGVuYWJsZSkKK3sKKwl1MzIgb2NwX2RhdGE7CisJdTE2IGNvbmZpZzsKKworCW9jcF9kYXRhID0gb2NwX3JlYWRfd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfRUVFX0NSKTsKKwljb25maWcgPSBvY3BfcmVnX3JlYWQodHAsIE9DUF9FRUVfQ0ZHKTsKKworCWlmIChlbmFibGUpIHsKKwkJb2NwX2RhdGEgfD0gRUVFX1JYX0VOIHwgRUVFX1RYX0VOOworCQljb25maWcgfD0gRUVFMTBfRU47CisJfSBlbHNlIHsKKwkJb2NwX2RhdGEgJj0gfihFRUVfUlhfRU4gfCBFRUVfVFhfRU4pOworCQljb25maWcgJj0gfkVFRTEwX0VOOworCX0KKworCW9jcF93cml0ZV93b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9FRUVfQ1IsIG9jcF9kYXRhKTsKKwlvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfRUVFX0NGRywgY29uZmlnKTsKK30KKwogc3RhdGljIHZvaWQgcjgxNTNfaHdfcGh5X2NmZyhzdHJ1Y3QgcjgxNTIgKnRwKQogewogCXUzMiBvY3BfZGF0YTsKIAl1MTYgZGF0YTsKIAotCWlmICh0cC0+dmVyc2lvbiA9PSBSVExfVkVSXzAzIHx8IHRwLT52ZXJzaW9uID09IFJUTF9WRVJfMDQgfHwKLQkgICAgdHAtPnZlcnNpb24gPT0gUlRMX1ZFUl8wNSkKLQkJb2NwX3JlZ193cml0ZSh0cCwgT0NQX0FEQ19DRkcsIENLQURTRUxfTCB8IEFEQ19FTiB8IEVOX0VNSV9MKTsKKwkvKiBkaXNhYmxlIEFMRFBTIGJlZm9yZSB1cGRhdGluZyB0aGUgUEhZIHBhcmFtZXRlcnMgKi8KKwlyODE1M19hbGRwc19lbih0cCwgZmFsc2UpOwogCi0JZGF0YSA9IHI4MTUyX21kaW9fcmVhZCh0cCwgTUlJX0JNQ1IpOwotCWlmIChkYXRhICYgQk1DUl9QRE9XTikgewotCQlkYXRhICY9IH5CTUNSX1BET1dOOwotCQlyODE1Ml9tZGlvX3dyaXRlKHRwLCBNSUlfQk1DUiwgZGF0YSk7Ci0JfQorCS8qIGRpc2FibGUgRUVFIGJlZm9yZSB1cGRhdGluZyB0aGUgUEhZIHBhcmFtZXRlcnMgKi8KKwlyODE1M19lZWVfZW4odHAsIGZhbHNlKTsKKwlvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfRUVFX0FEViwgMCk7CiAKIAlpZiAodHAtPnZlcnNpb24gPT0gUlRMX1ZFUl8wMykgewogCQlkYXRhID0gb2NwX3JlZ19yZWFkKHRwLCBPQ1BfRUVFX0NGRyk7CkBAIC0yNzQ1LDYgKzI4NDMsMTIgQEAKIAlzcmFtX3dyaXRlKHRwLCBTUkFNXzEwTV9BTVAxLCAweDAwYWYpOwogCXNyYW1fd3JpdGUodHAsIFNSQU1fMTBNX0FNUDIsIDB4MDIwOCk7CiAKKwlyODE1M19lZWVfZW4odHAsIHRydWUpOworCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9FRUVfQURWLCBNRElPX0VFRV8xMDAwVCB8IE1ESU9fRUVFXzEwMFRYKTsKKworCXI4MTUzX2FsZHBzX2VuKHRwLCB0cnVlKTsKKwlyODE1MmJfZW5hYmxlX2ZjKHRwKTsKKwogCXNldF9iaXQoUEhZX1JFU0VULCAmdHAtPmZsYWdzKTsKIH0KIApAQCAtMjg2NiwyMSArMjk3MCw2IEBACiAJb2NwX3dyaXRlX2R3b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9SQ1IsIG9jcF9kYXRhKTsKIH0KIAotc3RhdGljIHZvaWQgcjgxNTNfYWxkcHNfZW4oc3RydWN0IHI4MTUyICp0cCwgYm9vbCBlbmFibGUpCi17Ci0JdTE2IGRhdGE7Ci0KLQlkYXRhID0gb2NwX3JlZ19yZWFkKHRwLCBPQ1BfUE9XRVJfQ0ZHKTsKLQlpZiAoZW5hYmxlKSB7Ci0JCWRhdGEgfD0gRU5fQUxEUFM7Ci0JCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9QT1dFUl9DRkcsIGRhdGEpOwotCX0gZWxzZSB7Ci0JCWRhdGEgJj0gfkVOX0FMRFBTOwotCQlvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfUE9XRVJfQ0ZHLCBkYXRhKTsKLQkJbXNsZWVwKDIwKTsKLQl9Ci19Ci0KIHN0YXRpYyB2b2lkIHJ0bDgxNTNfZGlzYWJsZShzdHJ1Y3QgcjgxNTIgKnRwKQogewogCXI4MTUzX2FsZHBzX2VuKHRwLCBmYWxzZSk7CkBAIC0zMjQ2LDEwMyArMzMzNSw2IEBACiAJcmV0dXJuIHJlczsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHI4MTUyX21tZF9pbmRpcmVjdChzdHJ1Y3QgcjgxNTIgKnRwLCB1MTYgZGV2LCB1MTYgcmVnKQotewotCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9FRUVfQVIsIEZVTl9BRERSIHwgZGV2KTsKLQlvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfRUVFX0RBVEEsIHJlZyk7Ci0Jb2NwX3JlZ193cml0ZSh0cCwgT0NQX0VFRV9BUiwgRlVOX0RBVEEgfCBkZXYpOwotfQotCi1zdGF0aWMgdTE2IHI4MTUyX21tZF9yZWFkKHN0cnVjdCByODE1MiAqdHAsIHUxNiBkZXYsIHUxNiByZWcpCi17Ci0JdTE2IGRhdGE7Ci0KLQlyODE1Ml9tbWRfaW5kaXJlY3QodHAsIGRldiwgcmVnKTsKLQlkYXRhID0gb2NwX3JlZ19yZWFkKHRwLCBPQ1BfRUVFX0RBVEEpOwotCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9FRUVfQVIsIDB4MDAwMCk7Ci0KLQlyZXR1cm4gZGF0YTsKLX0KLQotc3RhdGljIHZvaWQgcjgxNTJfbW1kX3dyaXRlKHN0cnVjdCByODE1MiAqdHAsIHUxNiBkZXYsIHUxNiByZWcsIHUxNiBkYXRhKQotewotCXI4MTUyX21tZF9pbmRpcmVjdCh0cCwgZGV2LCByZWcpOwotCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9FRUVfREFUQSwgZGF0YSk7Ci0Jb2NwX3JlZ193cml0ZSh0cCwgT0NQX0VFRV9BUiwgMHgwMDAwKTsKLX0KLQotc3RhdGljIHZvaWQgcjgxNTJfZWVlX2VuKHN0cnVjdCByODE1MiAqdHAsIGJvb2wgZW5hYmxlKQotewotCXUxNiBjb25maWcxLCBjb25maWcyLCBjb25maWczOwotCXUzMiBvY3BfZGF0YTsKLQotCW9jcF9kYXRhID0gb2NwX3JlYWRfd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfRUVFX0NSKTsKLQljb25maWcxID0gb2NwX3JlZ19yZWFkKHRwLCBPQ1BfRUVFX0NPTkZJRzEpICYgfnNkX3Jpc2VfdGltZV9tYXNrOwotCWNvbmZpZzIgPSBvY3BfcmVnX3JlYWQodHAsIE9DUF9FRUVfQ09ORklHMik7Ci0JY29uZmlnMyA9IG9jcF9yZWdfcmVhZCh0cCwgT0NQX0VFRV9DT05GSUczKSAmIH5mYXN0X3Nucl9tYXNrOwotCi0JaWYgKGVuYWJsZSkgewotCQlvY3BfZGF0YSB8PSBFRUVfUlhfRU4gfCBFRUVfVFhfRU47Ci0JCWNvbmZpZzEgfD0gRUVFXzEwX0NBUCB8IEVFRV9OV0FZX0VOIHwgVFhfUVVJRVRfRU4gfCBSWF9RVUlFVF9FTjsKLQkJY29uZmlnMSB8PSBzZF9yaXNlX3RpbWUoMSk7Ci0JCWNvbmZpZzIgfD0gUkdfREFDUVVJRVRfRU4gfCBSR19MRFZRVUlFVF9FTjsKLQkJY29uZmlnMyB8PSBmYXN0X3Nucig0Mik7Ci0JfSBlbHNlIHsKLQkJb2NwX2RhdGEgJj0gfihFRUVfUlhfRU4gfCBFRUVfVFhfRU4pOwotCQljb25maWcxICY9IH4oRUVFXzEwX0NBUCB8IEVFRV9OV0FZX0VOIHwgVFhfUVVJRVRfRU4gfAotCQkJICAgICBSWF9RVUlFVF9FTik7Ci0JCWNvbmZpZzEgfD0gc2RfcmlzZV90aW1lKDcpOwotCQljb25maWcyICY9IH4oUkdfREFDUVVJRVRfRU4gfCBSR19MRFZRVUlFVF9FTik7Ci0JCWNvbmZpZzMgfD0gZmFzdF9zbnIoNTExKTsKLQl9Ci0KLQlvY3Bfd3JpdGVfd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfRUVFX0NSLCBvY3BfZGF0YSk7Ci0Jb2NwX3JlZ193cml0ZSh0cCwgT0NQX0VFRV9DT05GSUcxLCBjb25maWcxKTsKLQlvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfRUVFX0NPTkZJRzIsIGNvbmZpZzIpOwotCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9FRUVfQ09ORklHMywgY29uZmlnMyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHI4MTUyYl9lbmFibGVfZWVlKHN0cnVjdCByODE1MiAqdHApCi17Ci0JcjgxNTJfZWVlX2VuKHRwLCB0cnVlKTsKLQlyODE1Ml9tbWRfd3JpdGUodHAsIE1ESU9fTU1EX0FOLCBNRElPX0FOX0VFRV9BRFYsIE1ESU9fRUVFXzEwMFRYKTsKLX0KLQotc3RhdGljIHZvaWQgcjgxNTNfZWVlX2VuKHN0cnVjdCByODE1MiAqdHAsIGJvb2wgZW5hYmxlKQotewotCXUzMiBvY3BfZGF0YTsKLQl1MTYgY29uZmlnOwotCi0Jb2NwX2RhdGEgPSBvY3BfcmVhZF93b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9FRUVfQ1IpOwotCWNvbmZpZyA9IG9jcF9yZWdfcmVhZCh0cCwgT0NQX0VFRV9DRkcpOwotCi0JaWYgKGVuYWJsZSkgewotCQlvY3BfZGF0YSB8PSBFRUVfUlhfRU4gfCBFRUVfVFhfRU47Ci0JCWNvbmZpZyB8PSBFRUUxMF9FTjsKLQl9IGVsc2UgewotCQlvY3BfZGF0YSAmPSB+KEVFRV9SWF9FTiB8IEVFRV9UWF9FTik7Ci0JCWNvbmZpZyAmPSB+RUVFMTBfRU47Ci0JfQotCi0Jb2NwX3dyaXRlX3dvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX0VFRV9DUiwgb2NwX2RhdGEpOwotCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9FRUVfQ0ZHLCBjb25maWcpOwotfQotCi1zdGF0aWMgdm9pZCByODE1M19lbmFibGVfZWVlKHN0cnVjdCByODE1MiAqdHApCi17Ci0JcjgxNTNfZWVlX2VuKHRwLCB0cnVlKTsKLQlvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfRUVFX0FEViwgTURJT19FRUVfMTAwMFQgfCBNRElPX0VFRV8xMDBUWCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHI4MTUyYl9lbmFibGVfZmMoc3RydWN0IHI4MTUyICp0cCkKLXsKLQl1MTYgYW5hcjsKLQotCWFuYXIgPSByODE1Ml9tZGlvX3JlYWQodHAsIE1JSV9BRFZFUlRJU0UpOwotCWFuYXIgfD0gQURWRVJUSVNFX1BBVVNFX0NBUCB8IEFEVkVSVElTRV9QQVVTRV9BU1lNOwotCXI4MTUyX21kaW9fd3JpdGUodHAsIE1JSV9BRFZFUlRJU0UsIGFuYXIpOwotfQotCiBzdGF0aWMgdm9pZCBydGxfdGFsbHlfcmVzZXQoc3RydWN0IHI4MTUyICp0cCkKIHsKIAl1MzIgb2NwX2RhdGE7CkBAIC0zMzU1LDEwICszMzQ3LDE3IEBACiBzdGF0aWMgdm9pZCByODE1MmJfaW5pdChzdHJ1Y3QgcjgxNTIgKnRwKQogewogCXUzMiBvY3BfZGF0YTsKKwl1MTYgZGF0YTsKIAogCWlmICh0ZXN0X2JpdChSVEw4MTUyX1VOUExVRywgJnRwLT5mbGFncykpCiAJCXJldHVybjsKIAorCWRhdGEgPSByODE1Ml9tZGlvX3JlYWQodHAsIE1JSV9CTUNSKTsKKwlpZiAoZGF0YSAmIEJNQ1JfUERPV04pIHsKKwkJZGF0YSAmPSB+Qk1DUl9QRE9XTjsKKwkJcjgxNTJfbWRpb193cml0ZSh0cCwgTUlJX0JNQ1IsIGRhdGEpOworCX0KKwogCXI4MTUyX2FsZHBzX2VuKHRwLCBmYWxzZSk7CiAKIAlpZiAodHAtPnZlcnNpb24gPT0gUlRMX1ZFUl8wMSkgewpAQCAtMzM4MCw5ICszMzc5LDYgQEAKIAkJICAgU1BEV05fUlhEVl9NU0sgfCBTUERXTl9MSU5LQ0hHX01TSzsKIAlvY3Bfd3JpdGVfd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfR1BIWV9JTlRSX0lNUiwgb2NwX2RhdGEpOwogCi0JcjgxNTJiX2VuYWJsZV9lZWUodHApOwotCXI4MTUyX2FsZHBzX2VuKHRwLCB0cnVlKTsKLQlyODE1MmJfZW5hYmxlX2ZjKHRwKTsKIAlydGxfdGFsbHlfcmVzZXQodHApOwogCiAJLyogZW5hYmxlIHJ4IGFnZ3JlZ2F0aW9uICovCkBAIC0zMzk0LDEyICszMzkwLDEyIEBACiBzdGF0aWMgdm9pZCByODE1M19pbml0KHN0cnVjdCByODE1MiAqdHApCiB7CiAJdTMyIG9jcF9kYXRhOworCXUxNiBkYXRhOwogCWludCBpOwogCiAJaWYgKHRlc3RfYml0KFJUTDgxNTJfVU5QTFVHLCAmdHAtPmZsYWdzKSkKIAkJcmV0dXJuOwogCi0JcjgxNTNfYWxkcHNfZW4odHAsIGZhbHNlKTsKIAlyODE1M191MXUyZW4odHAsIGZhbHNlKTsKIAogCWZvciAoaSA9IDA7IGkgPCA1MDA7IGkrKykgewpAQCAtMzQxNiw2ICszNDEyLDIzIEBACiAJCW1zbGVlcCgyMCk7CiAJfQogCisJaWYgKHRwLT52ZXJzaW9uID09IFJUTF9WRVJfMDMgfHwgdHAtPnZlcnNpb24gPT0gUlRMX1ZFUl8wNCB8fAorCSAgICB0cC0+dmVyc2lvbiA9PSBSVExfVkVSXzA1KQorCQlvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfQURDX0NGRywgQ0tBRFNFTF9MIHwgQURDX0VOIHwgRU5fRU1JX0wpOworCisJZGF0YSA9IHI4MTUyX21kaW9fcmVhZCh0cCwgTUlJX0JNQ1IpOworCWlmIChkYXRhICYgQk1DUl9QRE9XTikgeworCQlkYXRhICY9IH5CTUNSX1BET1dOOworCQlyODE1Ml9tZGlvX3dyaXRlKHRwLCBNSUlfQk1DUiwgZGF0YSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDUwMDsgaSsrKSB7CisJCW9jcF9kYXRhID0gb2NwX3JlZ19yZWFkKHRwLCBPQ1BfUEhZX1NUQVRVUykgJiBQSFlfU1RBVF9NQVNLOworCQlpZiAob2NwX2RhdGEgPT0gUEhZX1NUQVRfTEFOX09OKQorCQkJYnJlYWs7CisJCW1zbGVlcCgyMCk7CisJfQorCiAJdXNiX2Rpc2FibGVfbHBtKHRwLT51ZGV2KTsKIAlyODE1M191MnAzZW4odHAsIGZhbHNlKTsKIApAQCAtMzQ4Myw5ICszNDk2LDYgQEAKIAlvY3Bfd3JpdGVfd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfTUFDX1BXUl9DVFJMMywgMCk7CiAJb2NwX3dyaXRlX3dvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX01BQ19QV1JfQ1RSTDQsIDApOwogCi0JcjgxNTNfZW5hYmxlX2VlZSh0cCk7Ci0JcjgxNTNfYWxkcHNfZW4odHAsIHRydWUpOwotCXI4MTUyYl9lbmFibGVfZmModHApOwogCXJ0bF90YWxseV9yZXNldCh0cCk7CiAJcjgxNTNfdTJwM2VuKHRwLCB0cnVlKTsKIH0KQEAgLTQwMzIsNyArNDA0Miw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIG9wcyA9IHsKIAkuZ2V0X2RydmluZm8gPSBydGw4MTUyX2dldF9kcnZpbmZvLAogCS5nZXRfc2V0dGluZ3MgPSBydGw4MTUyX2dldF9zZXR0aW5ncywKIAkuc2V0X3NldHRpbmdzID0gcnRsODE1Ml9zZXRfc2V0dGluZ3MsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2Ivc21zYzk1eHguYyBiL2RyaXZlcnMvbmV0L3VzYi9zbXNjOTV4eC5jCmluZGV4IGRjOTg5YTguLjgzMWFhMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9zbXNjOTV4eC5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9zbXNjOTV4eC5jCkBAIC0zMyw3ICszMyw3IEBACiAjaW5jbHVkZSAic21zYzk1eHguaCIKIAogI2RlZmluZSBTTVNDX0NISVBOQU1FCQkJInNtc2M5NXh4IgotI2RlZmluZSBTTVNDX0RSSVZFUl9WRVJTSU9OCQkiMS4wLjQiCisjZGVmaW5lIFNNU0NfRFJJVkVSX1ZFUlNJT04JCSIxLjAuNSIKICNkZWZpbmUgSFNfVVNCX1BLVF9TSVpFCQkJKDUxMikKICNkZWZpbmUgRlNfVVNCX1BLVF9TSVpFCQkJKDY0KQogI2RlZmluZSBERUZBVUxUX0hTX0JVUlNUX0NBUF9TSVpFCSgxNiAqIDEwMjQgKyA1ICogSFNfVVNCX1BLVF9TSVpFKQpAQCAtNjQsNiArNjQsNyBAQAogI2RlZmluZSBDQVJSSUVSX0NIRUNLX0RFTEFZICgyICogSFopCiAKIHN0cnVjdCBzbXNjOTV4eF9wcml2IHsKKwl1MzIgY2hpcF9pZDsKIAl1MzIgbWFjX2NyOwogCXUzMiBoYXNoX2hpOwogCXUzMiBoYXNoX2xvOwpAQCAtNzEsNiArNzIsNyBAQAogCXNwaW5sb2NrX3QgbWFjX2NyX2xvY2s7CiAJdTggZmVhdHVyZXM7CiAJdTggc3VzcGVuZF9mbGFnczsKKwl1OCBtZGl4X2N0cmw7CiAJYm9vbCBsaW5rX29rOwogCXN0cnVjdCBkZWxheWVkX3dvcmsgY2Fycmllcl9jaGVjazsKIAlzdHJ1Y3QgdXNibmV0ICpkZXY7CkBAIC03ODIsMTQgKzc4NCwxMTMgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IGdldF9tZGl4X3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CisJdTMyIHZhbDsKKwlpbnQgYnVmOworCisJYnVmID0gc21zYzk1eHhfbWRpb19yZWFkKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIFNQRUNJQUxfQ1RSTF9TVFMpOworCWlmIChidWYgJiBTUEVDSUFMX0NUUkxfU1RTX09WUlJEX0FNRElYXykgeworCQlpZiAoYnVmICYgU1BFQ0lBTF9DVFJMX1NUU19BTURJWF9FTkFCTEVfKQorCQkJcmV0dXJuIEVUSF9UUF9NRElfQVVUTzsKKwkJZWxzZSBpZiAoYnVmICYgU1BFQ0lBTF9DVFJMX1NUU19BTURJWF9TVEFURV8pCisJCQlyZXR1cm4gRVRIX1RQX01ESV9YOworCX0gZWxzZSB7CisJCWJ1ZiA9IHNtc2M5NXh4X3JlYWRfcmVnKGRldiwgU1RSQVBfU1RBVFVTLCAmdmFsKTsKKwkJaWYgKHZhbCAmIFNUUkFQX1NUQVRVU19BTURJWF9FTl8pCisJCQlyZXR1cm4gRVRIX1RQX01ESV9BVVRPOworCX0KKworCXJldHVybiBFVEhfVFBfTURJOworfQorCitzdGF0aWMgdm9pZCBzZXRfbWRpeF9zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgX191OCBtZGl4X2N0cmwpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKKwlzdHJ1Y3Qgc21zYzk1eHhfcHJpdiAqcGRhdGEgPSAoc3RydWN0IHNtc2M5NXh4X3ByaXYgKikoZGV2LT5kYXRhWzBdKTsKKwlpbnQgYnVmOworCisJaWYgKChwZGF0YS0+Y2hpcF9pZCA9PSBJRF9SRVZfQ0hJUF9JRF85NTAwQV8pIHx8CisJICAgIChwZGF0YS0+Y2hpcF9pZCA9PSBJRF9SRVZfQ0hJUF9JRF85NTMwXykgfHwKKwkgICAgKHBkYXRhLT5jaGlwX2lkID09IElEX1JFVl9DSElQX0lEXzg5NTMwXykgfHwKKwkgICAgKHBkYXRhLT5jaGlwX2lkID09IElEX1JFVl9DSElQX0lEXzk3MzBfKSkgeworCQkvKiBFeHRlbmQgTWFudWFsIEF1dG9NRElYIHRpbWVyIGZvciA5NTAwQS85NTAwQWkgKi8KKwkJYnVmID0gc21zYzk1eHhfbWRpb19yZWFkKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsCisJCQkJCSBQSFlfRURQRF9DT05GSUcpOworCQlidWYgfD0gUEhZX0VEUERfQ09ORklHX0VYVF9DUk9TU09WRVJfOworCQlzbXNjOTV4eF9tZGlvX3dyaXRlKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsCisJCQkJICAgIFBIWV9FRFBEX0NPTkZJRywgYnVmKTsKKwl9CisKKwlpZiAobWRpeF9jdHJsID09IEVUSF9UUF9NREkpIHsKKwkJYnVmID0gc21zYzk1eHhfbWRpb19yZWFkKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsCisJCQkJCSBTUEVDSUFMX0NUUkxfU1RTKTsKKwkJYnVmIHw9IFNQRUNJQUxfQ1RSTF9TVFNfT1ZSUkRfQU1ESVhfOworCQlidWYgJj0gfihTUEVDSUFMX0NUUkxfU1RTX0FNRElYX0VOQUJMRV8gfAorCQkJIFNQRUNJQUxfQ1RSTF9TVFNfQU1ESVhfU1RBVEVfKTsKKwkJc21zYzk1eHhfbWRpb193cml0ZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLAorCQkJCSAgICBTUEVDSUFMX0NUUkxfU1RTLCBidWYpOworCX0gZWxzZSBpZiAobWRpeF9jdHJsID09IEVUSF9UUF9NRElfWCkgeworCQlidWYgPSBzbXNjOTV4eF9tZGlvX3JlYWQoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwKKwkJCQkJIFNQRUNJQUxfQ1RSTF9TVFMpOworCQlidWYgfD0gU1BFQ0lBTF9DVFJMX1NUU19PVlJSRF9BTURJWF87CisJCWJ1ZiAmPSB+KFNQRUNJQUxfQ1RSTF9TVFNfQU1ESVhfRU5BQkxFXyB8CisJCQkgU1BFQ0lBTF9DVFJMX1NUU19BTURJWF9TVEFURV8pOworCQlidWYgfD0gU1BFQ0lBTF9DVFJMX1NUU19BTURJWF9TVEFURV87CisJCXNtc2M5NXh4X21kaW9fd3JpdGUoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwKKwkJCQkgICAgU1BFQ0lBTF9DVFJMX1NUUywgYnVmKTsKKwl9IGVsc2UgaWYgKG1kaXhfY3RybCA9PSBFVEhfVFBfTURJX0FVVE8pIHsKKwkJYnVmID0gc21zYzk1eHhfbWRpb19yZWFkKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsCisJCQkJCSBTUEVDSUFMX0NUUkxfU1RTKTsKKwkJYnVmICY9IH5TUEVDSUFMX0NUUkxfU1RTX09WUlJEX0FNRElYXzsKKwkJYnVmICY9IH4oU1BFQ0lBTF9DVFJMX1NUU19BTURJWF9FTkFCTEVfIHwKKwkJCSBTUEVDSUFMX0NUUkxfU1RTX0FNRElYX1NUQVRFXyk7CisJCWJ1ZiB8PSBTUEVDSUFMX0NUUkxfU1RTX0FNRElYX0VOQUJMRV87CisJCXNtc2M5NXh4X21kaW9fd3JpdGUoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwKKwkJCQkgICAgU1BFQ0lBTF9DVFJMX1NUUywgYnVmKTsKKwl9CisJcGRhdGEtPm1kaXhfY3RybCA9IG1kaXhfY3RybDsKK30KKworc3RhdGljIGludCBzbXNjOTV4eF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwKKwkJCQkgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKKwlzdHJ1Y3Qgc21zYzk1eHhfcHJpdiAqcGRhdGEgPSAoc3RydWN0IHNtc2M5NXh4X3ByaXYgKikoZGV2LT5kYXRhWzBdKTsKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gdXNibmV0X2dldF9zZXR0aW5ncyhuZXQsIGNtZCk7CisKKwljbWQtPmV0aF90cF9tZGl4ID0gcGRhdGEtPm1kaXhfY3RybDsKKwljbWQtPmV0aF90cF9tZGl4X2N0cmwgPSBwZGF0YS0+bWRpeF9jdHJsOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBzbXNjOTV4eF9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwKKwkJCQkgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKKwlzdHJ1Y3Qgc21zYzk1eHhfcHJpdiAqcGRhdGEgPSAoc3RydWN0IHNtc2M5NXh4X3ByaXYgKikoZGV2LT5kYXRhWzBdKTsKKwlpbnQgcmV0dmFsOworCisJaWYgKHBkYXRhLT5tZGl4X2N0cmwgIT0gY21kLT5ldGhfdHBfbWRpeF9jdHJsKQorCQlzZXRfbWRpeF9zdGF0dXMobmV0LCBjbWQtPmV0aF90cF9tZGl4X2N0cmwpOworCisJcmV0dmFsID0gdXNibmV0X3NldF9zZXR0aW5ncyhuZXQsIGNtZCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHNtc2M5NXh4X2V0aHRvb2xfb3BzID0gewogCS5nZXRfbGluawk9IHVzYm5ldF9nZXRfbGluaywKIAkubndheV9yZXNldAk9IHVzYm5ldF9ud2F5X3Jlc2V0LAogCS5nZXRfZHJ2aW5mbwk9IHVzYm5ldF9nZXRfZHJ2aW5mbywKIAkuZ2V0X21zZ2xldmVsCT0gdXNibmV0X2dldF9tc2dsZXZlbCwKIAkuc2V0X21zZ2xldmVsCT0gdXNibmV0X3NldF9tc2dsZXZlbCwKLQkuZ2V0X3NldHRpbmdzCT0gdXNibmV0X2dldF9zZXR0aW5ncywKLQkuc2V0X3NldHRpbmdzCT0gdXNibmV0X3NldF9zZXR0aW5ncywKKwkuZ2V0X3NldHRpbmdzCT0gc21zYzk1eHhfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJPSBzbXNjOTV4eF9zZXRfc2V0dGluZ3MsCiAJLmdldF9lZXByb21fbGVuCT0gc21zYzk1eHhfZXRodG9vbF9nZXRfZWVwcm9tX2xlbiwKIAkuZ2V0X2VlcHJvbQk9IHNtc2M5NXh4X2V0aHRvb2xfZ2V0X2VlcHJvbSwKIAkuc2V0X2VlcHJvbQk9IHNtc2M5NXh4X2V0aHRvb2xfc2V0X2VlcHJvbSwKQEAgLTExOTQsNiArMTI5NSw4IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAJdmFsID4+PSAxNjsKKwlwZGF0YS0+Y2hpcF9pZCA9IHZhbDsKKwlwZGF0YS0+bWRpeF9jdHJsID0gZ2V0X21kaXhfc3RhdHVzKGRldi0+bmV0KTsKIAogCWlmICgodmFsID09IElEX1JFVl9DSElQX0lEXzk1MDBBXykgfHwgKHZhbCA9PSBJRF9SRVZfQ0hJUF9JRF85NTMwXykgfHwKIAkgICAgKHZhbCA9PSBJRF9SRVZfQ0hJUF9JRF84OTUzMF8pIHx8ICh2YWwgPT0gSURfUkVWX0NISVBfSURfOTczMF8pKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL3Ntc2M5NXh4LmggYi9kcml2ZXJzL25ldC91c2Ivc21zYzk1eHguaAppbmRleCA1MjZmYWEwLi4yOWE0ZDllIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2Ivc21zYzk1eHguaAorKysgYi9kcml2ZXJzL25ldC91c2Ivc21zYzk1eHguaApAQCAtMTQ0LDYgKzE0NCwxNCBAQAogCiAjZGVmaW5lIEJVUlNUX0NBUAkJCSgweDM4KQogCisjZGVmaW5lCVNUUkFQX1NUQVRVUwkJCSgweDNDKQorI2RlZmluZQlTVFJBUF9TVEFUVVNfUFdSX1NFTF8JCSgweDAwMDAwMDIwKQorI2RlZmluZQlTVFJBUF9TVEFUVVNfQU1ESVhfRU5fCQkoMHgwMDAwMDAxMCkKKyNkZWZpbmUJU1RSQVBfU1RBVFVTX1BPUlRfU1dBUF8JCSgweDAwMDAwMDA4KQorI2RlZmluZQlTVFJBUF9TVEFUVVNfRUVQX1NJWkVfCQkoMHgwMDAwMDAwNCkKKyNkZWZpbmUJU1RSQVBfU1RBVFVTX1JNVF9XS1BfCQkoMHgwMDAwMDAwMikKKyNkZWZpbmUJU1RSQVBfU1RBVFVTX0VFUF9ESVNBQkxFXwkoMHgwMDAwMDAwMSkKKwogI2RlZmluZSBHUElPX1dBS0UJCQkoMHg2NCkKIAogI2RlZmluZSBJTlRfRVBfQ1RMCQkJKDB4NjgpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvdXNibmV0LmMgYi9kcml2ZXJzL25ldC91c2IvdXNibmV0LmMKaW5kZXggM2JmYjU5Mi4uZDUwNzFlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL3VzYm5ldC5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi91c2JuZXQuYwpAQCAtMjA2MiwxMSArMjA2Miw4IEBACiAJCSAgIGNtZCwgcmVxdHlwZSwgdmFsdWUsIGluZGV4LCBzaXplKTsKIAogCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7Ci0JaWYgKCF1cmIpIHsKLQkJbmV0ZGV2X2VycihkZXYtPm5ldCwgIkVycm9yIGFsbG9jYXRpbmcgVVJCIGluIgotCQkJICAgIiAlcyFcbiIsIF9fZnVuY19fKTsKKwlpZiAoIXVyYikKIAkJZ290byBmYWlsOwotCX0KIAogCWlmIChkYXRhKSB7CiAJCWJ1ZiA9IGttZW1kdXAoZGF0YSwgc2l6ZSwgR0ZQX0FUT01JQyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92ZXRoLmMgYi9kcml2ZXJzL25ldC92ZXRoLmMKaW5kZXggZjM3YTZlNi4uZmJjODUzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdmV0aC5jCisrKyBiL2RyaXZlcnMvbmV0L3ZldGguYwpAQCAtMzEzLDcgKzMxMyw3IEBACiB9OwogCiAjZGVmaW5lIFZFVEhfRkVBVFVSRVMgKE5FVElGX0ZfU0cgfCBORVRJRl9GX0ZSQUdMSVNUIHwgTkVUSUZfRl9IV19DU1VNIHwgXAotCQkgICAgICAgTkVUSUZfRl9SWENTVU0gfCBORVRJRl9GX0hJR0hETUEgfCBcCisJCSAgICAgICBORVRJRl9GX1JYQ1NVTSB8IE5FVElGX0ZfU0NUUF9DUkMgfCBORVRJRl9GX0hJR0hETUEgfCBcCiAJCSAgICAgICBORVRJRl9GX0dTT19TT0ZUV0FSRSB8IE5FVElGX0ZfR1NPX0VOQ0FQX0FMTCB8IFwKIAkJICAgICAgIE5FVElGX0ZfSFdfVkxBTl9DVEFHX1RYIHwgTkVUSUZfRl9IV19WTEFOX0NUQUdfUlggfCBcCiAJCSAgICAgICBORVRJRl9GX0hXX1ZMQU5fU1RBR19UWCB8IE5FVElGX0ZfSFdfVkxBTl9TVEFHX1JYICkKQEAgLTM0MCw2ICszNDAsNyBAQAogCiAJZGV2LT5od19mZWF0dXJlcyA9IFZFVEhfRkVBVFVSRVM7CiAJZGV2LT5od19lbmNfZmVhdHVyZXMgPSBWRVRIX0ZFQVRVUkVTOworCWRldi0+bXBsc19mZWF0dXJlcyA9IE5FVElGX0ZfSFdfQ1NVTSB8IE5FVElGX0ZfR1NPX1NPRlRXQVJFOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdmlydGlvX25ldC5jIGIvZHJpdmVycy9uZXQvdmlydGlvX25ldC5jCmluZGV4IDFiNWY1MzEuLmZhZDg0ZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYworKysgYi9kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMKQEAgLTEzOCw4ICsxMzgsOSBAQAogCS8qIERvZXMgdGhlIGFmZmluaXR5IGhpbnQgaXMgc2V0IGZvciB2aXJ0cXVldWVzPyAqLwogCWJvb2wgYWZmaW5pdHlfaGludF9zZXQ7CiAKLQkvKiBDUFUgaG90IHBsdWcgbm90aWZpZXIgKi8KLQlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbmI7CisJLyogQ1BVIGhvdHBsdWcgaW5zdGFuY2VzIGZvciBvbmxpbmUgJiBkZWFkICovCisJc3RydWN0IGhsaXN0X25vZGUgbm9kZTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlX2RlYWQ7CiAKIAkvKiBDb250cm9sIFZRIGJ1ZmZlcnM6IHByb3RlY3RlZCBieSB0aGUgcnRubCBsb2NrICovCiAJc3RydWN0IHZpcnRpb19uZXRfY3RybF9oZHIgY3RybF9oZHI7CkBAIC0xMjM3LDI1ICsxMjM4LDUzIEBACiAJdmktPmFmZmluaXR5X2hpbnRfc2V0ID0gdHJ1ZTsKIH0KIAotc3RhdGljIGludCB2aXJ0bmV0X2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKLQkJCSAgICAgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCitzdGF0aWMgaW50IHZpcnRuZXRfY3B1X29ubGluZSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSkKIHsKLQlzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSA9IGNvbnRhaW5lcl9vZihuZmIsIHN0cnVjdCB2aXJ0bmV0X2luZm8sIG5iKTsKKwlzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSA9IGhsaXN0X2VudHJ5X3NhZmUobm9kZSwgc3RydWN0IHZpcnRuZXRfaW5mbywKKwkJCQkJCSAgIG5vZGUpOworCXZpcnRuZXRfc2V0X2FmZmluaXR5KHZpKTsKKwlyZXR1cm4gMDsKK30KIAotCXN3aXRjaChhY3Rpb24gJiB+Q1BVX1RBU0tTX0ZST1pFTikgewotCWNhc2UgQ1BVX09OTElORToKLQljYXNlIENQVV9ET1dOX0ZBSUxFRDoKLQljYXNlIENQVV9ERUFEOgotCQl2aXJ0bmV0X3NldF9hZmZpbml0eSh2aSk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BVX0RPV05fUFJFUEFSRToKLQkJdmlydG5ldF9jbGVhbl9hZmZpbml0eSh2aSwgKGxvbmcpaGNwdSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KK3N0YXRpYyBpbnQgdmlydG5ldF9jcHVfZGVhZCh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSA9IGhsaXN0X2VudHJ5X3NhZmUobm9kZSwgc3RydWN0IHZpcnRuZXRfaW5mbywKKwkJCQkJCSAgIG5vZGVfZGVhZCk7CisJdmlydG5ldF9zZXRfYWZmaW5pdHkodmkpOworCXJldHVybiAwOworfQogCi0JcmV0dXJuIE5PVElGWV9PSzsKK3N0YXRpYyBpbnQgdmlydG5ldF9jcHVfZG93bl9wcmVwKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKQoreworCXN0cnVjdCB2aXJ0bmV0X2luZm8gKnZpID0gaGxpc3RfZW50cnlfc2FmZShub2RlLCBzdHJ1Y3QgdmlydG5ldF9pbmZvLAorCQkJCQkJICAgbm9kZSk7CisKKwl2aXJ0bmV0X2NsZWFuX2FmZmluaXR5KHZpLCBjcHUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgZW51bSBjcHVocF9zdGF0ZSB2aXJ0aW9uZXRfb25saW5lOworCitzdGF0aWMgaW50IHZpcnRuZXRfY3B1X25vdGlmX2FkZChzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gY3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlX25vY2FsbHModmlydGlvbmV0X29ubGluZSwgJnZpLT5ub2RlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldCA9IGNwdWhwX3N0YXRlX2FkZF9pbnN0YW5jZV9ub2NhbGxzKENQVUhQX1ZJUlRfTkVUX0RFQUQsCisJCQkJCSAgICAgICAmdmktPm5vZGVfZGVhZCk7CisJaWYgKCFyZXQpCisJCXJldHVybiByZXQ7CisJY3B1aHBfc3RhdGVfcmVtb3ZlX2luc3RhbmNlX25vY2FsbHModmlydGlvbmV0X29ubGluZSwgJnZpLT5ub2RlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB2aXJ0bmV0X2NwdV9ub3RpZl9yZW1vdmUoc3RydWN0IHZpcnRuZXRfaW5mbyAqdmkpCit7CisJY3B1aHBfc3RhdGVfcmVtb3ZlX2luc3RhbmNlX25vY2FsbHModmlydGlvbmV0X29ubGluZSwgJnZpLT5ub2RlKTsKKwljcHVocF9zdGF0ZV9yZW1vdmVfaW5zdGFuY2Vfbm9jYWxscyhDUFVIUF9WSVJUX05FVF9ERUFELAorCQkJCQkgICAgJnZpLT5ub2RlX2RlYWQpOwogfQogCiBzdGF0aWMgdm9pZCB2aXJ0bmV0X2dldF9yaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKQEAgLTE4NzksOCArMTkwOCw3IEBACiAKIAl2aXJ0aW9fZGV2aWNlX3JlYWR5KHZkZXYpOwogCi0JdmktPm5iLm5vdGlmaWVyX2NhbGwgPSAmdmlydG5ldF9jcHVfY2FsbGJhY2s7Ci0JZXJyID0gcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZ2aS0+bmIpOworCWVyciA9IHZpcnRuZXRfY3B1X25vdGlmX2FkZCh2aSk7CiAJaWYgKGVycikgewogCQlwcl9kZWJ1ZygidmlydGlvX25ldDogcmVnaXN0ZXJpbmcgY3B1IG5vdGlmaWVyIGZhaWxlZFxuIik7CiAJCWdvdG8gZnJlZV91bnJlZ2lzdGVyX25ldGRldjsKQEAgLTE5MzQsNyArMTk2Miw3IEBACiB7CiAJc3RydWN0IHZpcnRuZXRfaW5mbyAqdmkgPSB2ZGV2LT5wcml2OwogCi0JdW5yZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJnZpLT5uYik7CisJdmlydG5ldF9jcHVfbm90aWZfcmVtb3ZlKHZpKTsKIAogCS8qIE1ha2Ugc3VyZSBubyB3b3JrIGhhbmRsZXIgaXMgYWNjZXNzaW5nIHRoZSBkZXZpY2UuICovCiAJZmx1c2hfd29yaygmdmktPmNvbmZpZ193b3JrKTsKQEAgLTE5NTMsNyArMTk4MSw3IEBACiAJc3RydWN0IHZpcnRuZXRfaW5mbyAqdmkgPSB2ZGV2LT5wcml2OwogCWludCBpOwogCi0JdW5yZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJnZpLT5uYik7CisJdmlydG5ldF9jcHVfbm90aWZfcmVtb3ZlKHZpKTsKIAogCS8qIE1ha2Ugc3VyZSBubyB3b3JrIGhhbmRsZXIgaXMgYWNjZXNzaW5nIHRoZSBkZXZpY2UgKi8KIAlmbHVzaF93b3JrKCZ2aS0+Y29uZmlnX3dvcmspOwpAQCAtMTk5Nyw3ICsyMDI1LDcgQEAKIAl2aXJ0bmV0X3NldF9xdWV1ZXModmksIHZpLT5jdXJyX3F1ZXVlX3BhaXJzKTsKIAlydG5sX3VubG9jaygpOwogCi0JZXJyID0gcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZ2aS0+bmIpOworCWVyciA9IHZpcnRuZXRfY3B1X25vdGlmX2FkZCh2aSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtMjAzOSw3ICsyMDY3LDQxIEBACiAjZW5kaWYKIH07CiAKLW1vZHVsZV92aXJ0aW9fZHJpdmVyKHZpcnRpb19uZXRfZHJpdmVyKTsKK3N0YXRpYyBfX2luaXQgaW50IHZpcnRpb19uZXRfZHJpdmVyX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gY3B1aHBfc2V0dXBfc3RhdGVfbXVsdGkoQ1BVSFBfQVBfT05MSU5FX0RZTiwgIkFQX1ZJUlRfTkVUX09OTElORSIsCisJCQkJICAgICAgdmlydG5ldF9jcHVfb25saW5lLAorCQkJCSAgICAgIHZpcnRuZXRfY3B1X2Rvd25fcHJlcCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCXZpcnRpb25ldF9vbmxpbmUgPSByZXQ7CisJcmV0ID0gY3B1aHBfc2V0dXBfc3RhdGVfbXVsdGkoQ1BVSFBfVklSVF9ORVRfREVBRCwgIlZJUlRfTkVUX0RFQUQiLAorCQkJCSAgICAgIE5VTEwsIHZpcnRuZXRfY3B1X2RlYWQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2RlYWQ7CisKKyAgICAgICAgcmV0ID0gcmVnaXN0ZXJfdmlydGlvX2RyaXZlcigmdmlydGlvX25ldF9kcml2ZXIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3ZpcnRpbzsKKwlyZXR1cm4gMDsKK2Vycl92aXJ0aW86CisJY3B1aHBfcmVtb3ZlX211bHRpX3N0YXRlKENQVUhQX1ZJUlRfTkVUX0RFQUQpOworZXJyX2RlYWQ6CisJY3B1aHBfcmVtb3ZlX211bHRpX3N0YXRlKHZpcnRpb25ldF9vbmxpbmUpOworb3V0OgorCXJldHVybiByZXQ7Cit9Cittb2R1bGVfaW5pdCh2aXJ0aW9fbmV0X2RyaXZlcl9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIHZpcnRpb19uZXRfZHJpdmVyX2V4aXQodm9pZCkKK3sKKwljcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUoQ1BVSFBfVklSVF9ORVRfREVBRCk7CisJY3B1aHBfcmVtb3ZlX211bHRpX3N0YXRlKHZpcnRpb25ldF9vbmxpbmUpOworCXVucmVnaXN0ZXJfdmlydGlvX2RyaXZlcigmdmlydGlvX25ldF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQodmlydGlvX25ldF9kcml2ZXJfZXhpdCk7CiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodmlydGlvLCBpZF90YWJsZSk7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlZpcnRpbyBuZXR3b3JrIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2Rydi5jIGIvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2Rydi5jCmluZGV4IGM2OGZlNDkuLmI1NTU0ZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19kcnYuYworKysgYi9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfZHJ2LmMKQEAgLTkxNCw3ICs5MTQsOSBAQAogewogCXN0cnVjdCBWbXhuZXQzX1R4RGF0YURlc2MgKnRkZDsKIAotCXRkZCA9IHRxLT5kYXRhX3JpbmcuYmFzZSArIHRxLT50eF9yaW5nLm5leHQyZmlsbDsKKwl0ZGQgPSAoc3RydWN0IFZteG5ldDNfVHhEYXRhRGVzYyAqKSgodTggKil0cS0+ZGF0YV9yaW5nLmJhc2UgKworCQkJCQkgICAgdHEtPnR4X3JpbmcubmV4dDJmaWxsICoKKwkJCQkJICAgIHRxLT50eGRhdGFfZGVzY19zaXplKTsKIAogCW1lbWNweSh0ZGQtPmRhdGEsIHNrYi0+ZGF0YSwgY3R4LT5jb3B5X3NpemUpOwogCW5ldGRldl9kYmcoYWRhcHRlci0+bmV0ZGV2LApAQCAtMTYzOSw3ICsxNjQxLDcgQEAKIAl9CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiB2bXhuZXQzX3JxX2Rlc3Ryb3lfYWxsX3J4ZGF0YXJpbmcoc3RydWN0IHZteG5ldDNfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlpbnQgaTsKQEAgLTMxODQsNyArMzE4Niw2IEBACiAKIAluZXRkZXZfZXJyKGFkYXB0ZXItPm5ldGRldiwgInR4IGhhbmdcbiIpOwogCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPndvcmspOwotCW5ldGlmX3dha2VfcXVldWUoYWRhcHRlci0+bmV0ZGV2KTsKIH0KIAogCkBAIC0zMjExLDYgKzMyMTIsNyBAQAogCX0KIAlydG5sX3VubG9jaygpOwogCisJbmV0aWZfd2FrZV9xdWV1ZShhZGFwdGVyLT5uZXRkZXYpOwogCWNsZWFyX2JpdChWTVhORVQzX1NUQVRFX0JJVF9SRVNFVFRJTkcsICZhZGFwdGVyLT5zdGF0ZSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19pbnQuaCBiL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19pbnQuaAppbmRleCA3NGZjMDMwLi43ZGMzN2EwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfaW50LmgKKysrIGIvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2ludC5oCkBAIC02OSwxMCArNjksMTAgQEAKIC8qCiAgKiBWZXJzaW9uIG51bWJlcnMKICAqLwotI2RlZmluZSBWTVhORVQzX0RSSVZFUl9WRVJTSU9OX1NUUklORyAgICIxLjQuOS4wLWsiCisjZGVmaW5lIFZNWE5FVDNfRFJJVkVSX1ZFUlNJT05fU1RSSU5HICAgIjEuNC5hLjAtayIKIAogLyogYSAzMi1iaXQgaW50LCBlYWNoIGJ5dGUgZW5jb2RlIGEgdmVyaW9uIG51bWJlciBpbiBWTVhORVQzX0RSSVZFUl9WRVJTSU9OICovCi0jZGVmaW5lIFZNWE5FVDNfRFJJVkVSX1ZFUlNJT05fTlVNICAgICAgMHgwMTA0MDkwMAorI2RlZmluZSBWTVhORVQzX0RSSVZFUl9WRVJTSU9OX05VTSAgICAgIDB4MDEwNDBhMDAKIAogI2lmIGRlZmluZWQoQ09ORklHX1BDSV9NU0kpCiAJLyogUlNTIG9ubHkgbWFrZXMgc2Vuc2UgaWYgTVNJLVggaXMgc3VwcG9ydGVkLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdnJmLmMgYi9kcml2ZXJzL25ldC92cmYuYwppbmRleCAxY2U3NDIwLi44NWMyNzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92cmYuYworKysgYi9kcml2ZXJzL25ldC92cmYuYwpAQCAtMzcsOSArMzcsNiBAQAogI2luY2x1ZGUgPG5ldC9sM21kZXYuaD4KICNpbmNsdWRlIDxuZXQvZmliX3J1bGVzLmg+CiAKLSNkZWZpbmUgUlRfRkxfVE9TKG9sZGZscDQpIFwKLQkoKG9sZGZscDQpLT5mbG93aTRfdG9zICYgKElQVE9TX1JUX01BU0sgfCBSVE9fT05MSU5LKSkKLQogI2RlZmluZSBEUlZfTkFNRQkidnJmIgogI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4wIgogCkBAIC0xMzcsNiArMTM0LDIwIEBACiB9CiAKICNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQorc3RhdGljIGludCB2cmZfaXA2X2xvY2FsX291dChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrICpzaywKKwkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgZXJyOworCisJZXJyID0gbmZfaG9vayhORlBST1RPX0lQVjYsIE5GX0lORVRfTE9DQUxfT1VULCBuZXQsCisJCSAgICAgIHNrLCBza2IsIE5VTEwsIHNrYl9kc3Qoc2tiKS0+ZGV2LCBkc3Rfb3V0cHV0KTsKKworCWlmIChsaWtlbHkoZXJyID09IDEpKQorCQllcnIgPSBkc3Rfb3V0cHV0KG5ldCwgc2ssIHNrYik7CisKKwlyZXR1cm4gZXJyOworfQorCiBzdGF0aWMgbmV0ZGV2X3R4X3QgdnJmX3Byb2Nlc3NfdjZfb3V0Ym91bmQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKQEAgLTE1MSw3ICsxNjIsNyBAQAogCQkuZmxvd2xhYmVsID0gaXA2X2Zsb3dpbmZvKGlwaCksCiAJCS5mbG93aTZfbWFyayA9IHNrYi0+bWFyaywKIAkJLmZsb3dpNl9wcm90byA9IGlwaC0+bmV4dGhkciwKLQkJLmZsb3dpNl9mbGFncyA9IEZMT1dJX0ZMQUdfTDNNREVWX1NSQyB8IEZMT1dJX0ZMQUdfU0tJUF9OSF9PSUYsCisJCS5mbG93aTZfZmxhZ3MgPSBGTE9XSV9GTEFHX1NLSVBfTkhfT0lGLAogCX07CiAJaW50IHJldCA9IE5FVF9YTUlUX0RST1A7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0OwpAQCAtMjA3LDcgKzIxOCw3IEBACiAJLyogc3RyaXAgdGhlIGV0aGVybmV0IGhlYWRlciBhZGRlZCBmb3IgcGFzcyB0aHJvdWdoIFZSRiBkZXZpY2UgKi8KIAlfX3NrYl9wdWxsKHNrYiwgc2tiX25ldHdvcmtfb2Zmc2V0KHNrYikpOwogCi0JcmV0ID0gaXA2X2xvY2FsX291dChuZXQsIHNrYi0+c2ssIHNrYik7CisJcmV0ID0gdnJmX2lwNl9sb2NhbF9vdXQobmV0LCBza2ItPnNrLCBza2IpOwogCWlmICh1bmxpa2VseShuZXRfeG1pdF9ldmFsKHJldCkpKQogCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCWVsc2UKQEAgLTIyNyw2ICsyMzgsMjAgQEAKIH0KICNlbmRpZgogCisvKiBiYXNlZCBvbiBpcF9sb2NhbF9vdXQ7IGNhbid0IHVzZSBpdCBiL2MgdGhlIGRzdCBpcyBzd2l0Y2hlZCBwb2ludGluZyB0byB1cyAqLworc3RhdGljIGludCB2cmZfaXBfbG9jYWxfb3V0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2sgKnNrLAorCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGVycjsKKworCWVyciA9IG5mX2hvb2soTkZQUk9UT19JUFY0LCBORl9JTkVUX0xPQ0FMX09VVCwgbmV0LCBzaywKKwkJICAgICAgc2tiLCBOVUxMLCBza2JfZHN0KHNrYiktPmRldiwgZHN0X291dHB1dCk7CisJaWYgKGxpa2VseShlcnIgPT0gMSkpCisJCWVyciA9IGRzdF9vdXRwdXQobmV0LCBzaywgc2tiKTsKKworCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyBuZXRkZXZfdHhfdCB2cmZfcHJvY2Vzc192NF9vdXRib3VuZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqdnJmX2RldikKIHsKQEAgLTIzNyw4ICsyNjIsNyBAQAogCQkuZmxvd2k0X29pZiA9IHZyZl9kZXYtPmlmaW5kZXgsCiAJCS5mbG93aTRfaWlmID0gTE9PUEJBQ0tfSUZJTkRFWCwKIAkJLmZsb3dpNF90b3MgPSBSVF9UT1MoaXA0aC0+dG9zKSwKLQkJLmZsb3dpNF9mbGFncyA9IEZMT1dJX0ZMQUdfQU5ZU1JDIHwgRkxPV0lfRkxBR19MM01ERVZfU1JDIHwKLQkJCQlGTE9XSV9GTEFHX1NLSVBfTkhfT0lGLAorCQkuZmxvd2k0X2ZsYWdzID0gRkxPV0lfRkxBR19BTllTUkMgfCBGTE9XSV9GTEFHX1NLSVBfTkhfT0lGLAogCQkuZGFkZHIgPSBpcDRoLT5kYWRkciwKIAl9OwogCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQodnJmX2Rldik7CkBAIC0yOTIsNyArMzE2LDcgQEAKIAkJCQkJICAgICAgIFJUX1NDT1BFX0xJTkspOwogCX0KIAotCXJldCA9IGlwX2xvY2FsX291dChkZXZfbmV0KHNrYl9kc3Qoc2tiKS0+ZGV2KSwgc2tiLT5zaywgc2tiKTsKKwlyZXQgPSB2cmZfaXBfbG9jYWxfb3V0KGRldl9uZXQoc2tiX2RzdChza2IpLT5kZXYpLCBza2ItPnNrLCBza2IpOwogCWlmICh1bmxpa2VseShuZXRfeG1pdF9ldmFsKHJldCkpKQogCQl2cmZfZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKIAllbHNlCkBAIC0zNzcsNiArNDAxLDQzIEBACiAJCQkgICAgIShJUDZDQihza2IpLT5mbGFncyAmIElQNlNLQl9SRVJPVVRFRCkpOwogfQogCisvKiBzZXQgZHN0IG9uIHNrYiB0byBzZW5kIHBhY2tldCB0byB1cyB2aWEgZGV2X3htaXQgcGF0aC4gQWxsb3dzCisgKiBwYWNrZXQgdG8gZ28gdGhyb3VnaCBkZXZpY2UgYmFzZWQgZmVhdHVyZXMgc3VjaCBhcyBxZGlzYywgbmV0ZmlsdGVyCisgKiBob29rcyBhbmQgcGFja2V0IHNvY2tldHMgd2l0aCBza2ItPmRldiBzZXQgdG8gdnJmIGRldmljZS4KKyAqLworc3RhdGljIHN0cnVjdCBza19idWZmICp2cmZfaXA2X291dChzdHJ1Y3QgbmV0X2RldmljZSAqdnJmX2RldiwKKwkJCQkgICBzdHJ1Y3Qgc29jayAqc2ssCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmV0X3ZyZiAqdnJmID0gbmV0ZGV2X3ByaXYodnJmX2Rldik7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gTlVMTDsKKwlzdHJ1Y3QgcnQ2X2luZm8gKnJ0NjsKKworCS8qIGRvbid0IGRpdmVydCBsaW5rIHNjb3BlIHBhY2tldHMgKi8KKwlpZiAocnQ2X25lZWRfc3RyaWN0KCZpcHY2X2hkcihza2IpLT5kYWRkcikpCisJCXJldHVybiBza2I7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwlydDYgPSByY3VfZGVyZWZlcmVuY2UodnJmLT5ydDYpOworCWlmIChsaWtlbHkocnQ2KSkgeworCQlkc3QgPSAmcnQ2LT5kc3Q7CisJCWRzdF9ob2xkKGRzdCk7CisJfQorCisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlpZiAodW5saWtlbHkoIWRzdCkpIHsKKwkJdnJmX3R4X2Vycm9yKHZyZl9kZXYsIHNrYik7CisJCXJldHVybiBOVUxMOworCX0KKworCXNrYl9kc3RfZHJvcChza2IpOworCXNrYl9kc3Rfc2V0KHNrYiwgZHN0KTsKKworCXJldHVybiBza2I7Cit9CisKIC8qIGhvbGRpbmcgcnRubCAqLwogc3RhdGljIHZvaWQgdnJmX3J0Nl9yZWxlYXNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBuZXRfdnJmICp2cmYpCiB7CkBAIC00NjMsNiArNTI0LDEzIEBACiAJcmV0dXJuIHJjOwogfQogI2Vsc2UKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqdnJmX2lwNl9vdXQoc3RydWN0IG5ldF9kZXZpY2UgKnZyZl9kZXYsCisJCQkJICAgc3RydWN0IHNvY2sgKnNrLAorCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYjsKK30KKwogc3RhdGljIHZvaWQgdnJmX3J0Nl9yZWxlYXNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBuZXRfdnJmICp2cmYpCiB7CiB9CkBAIC01MzEsNiArNTk5LDU1IEBACiAJCQkgICAgIShJUENCKHNrYiktPmZsYWdzICYgSVBTS0JfUkVST1VURUQpKTsKIH0KIAorLyogc2V0IGRzdCBvbiBza2IgdG8gc2VuZCBwYWNrZXQgdG8gdXMgdmlhIGRldl94bWl0IHBhdGguIEFsbG93cworICogcGFja2V0IHRvIGdvIHRocm91Z2ggZGV2aWNlIGJhc2VkIGZlYXR1cmVzIHN1Y2ggYXMgcWRpc2MsIG5ldGZpbHRlcgorICogaG9va3MgYW5kIHBhY2tldCBzb2NrZXRzIHdpdGggc2tiLT5kZXYgc2V0IHRvIHZyZiBkZXZpY2UuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqdnJmX2lwX291dChzdHJ1Y3QgbmV0X2RldmljZSAqdnJmX2RldiwKKwkJCQkgIHN0cnVjdCBzb2NrICpzaywKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5ldF92cmYgKnZyZiA9IG5ldGRldl9wcml2KHZyZl9kZXYpOworCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IE5VTEw7CisJc3RydWN0IHJ0YWJsZSAqcnRoOworCisJcmN1X3JlYWRfbG9jaygpOworCisJcnRoID0gcmN1X2RlcmVmZXJlbmNlKHZyZi0+cnRoKTsKKwlpZiAobGlrZWx5KHJ0aCkpIHsKKwkJZHN0ID0gJnJ0aC0+ZHN0OworCQlkc3RfaG9sZChkc3QpOworCX0KKworCXJjdV9yZWFkX3VubG9jaygpOworCisJaWYgKHVubGlrZWx5KCFkc3QpKSB7CisJCXZyZl90eF9lcnJvcih2cmZfZGV2LCBza2IpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlza2JfZHN0X2Ryb3Aoc2tiKTsKKwlza2JfZHN0X3NldChza2IsIGRzdCk7CisKKwlyZXR1cm4gc2tiOworfQorCisvKiBjYWxsZWQgd2l0aCByY3UgbG9jayBoZWxkICovCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnZyZl9sM19vdXQoc3RydWN0IG5ldF9kZXZpY2UgKnZyZl9kZXYsCisJCQkJICBzdHJ1Y3Qgc29jayAqc2ssCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgdTE2IHByb3RvKQoreworCXN3aXRjaCAocHJvdG8pIHsKKwljYXNlIEFGX0lORVQ6CisJCXJldHVybiB2cmZfaXBfb3V0KHZyZl9kZXYsIHNrLCBza2IpOworCWNhc2UgQUZfSU5FVDY6CisJCXJldHVybiB2cmZfaXA2X291dCh2cmZfZGV2LCBzaywgc2tiKTsKKwl9CisKKwlyZXR1cm4gc2tiOworfQorCiAvKiBob2xkaW5nIHJ0bmwgKi8KIHN0YXRpYyB2b2lkIHZyZl9ydGFibGVfcmVsZWFzZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmV0X3ZyZiAqdnJmKQogewpAQCAtNzIyLDYzICs4MzksNiBAQAogCXJldHVybiB2cmYtPnRiX2lkOwogfQogCi1zdGF0aWMgc3RydWN0IHJ0YWJsZSAqdnJmX2dldF9ydGFibGUoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgICAgIGNvbnN0IHN0cnVjdCBmbG93aTQgKmZsNCkKLXsKLQlzdHJ1Y3QgcnRhYmxlICpydGggPSBOVUxMOwotCi0JaWYgKCEoZmw0LT5mbG93aTRfZmxhZ3MgJiBGTE9XSV9GTEFHX0wzTURFVl9TUkMpKSB7Ci0JCXN0cnVjdCBuZXRfdnJmICp2cmYgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JCXJjdV9yZWFkX2xvY2soKTsKLQotCQlydGggPSByY3VfZGVyZWZlcmVuY2UodnJmLT5ydGgpOwotCQlpZiAobGlrZWx5KHJ0aCkpCi0JCQlkc3RfaG9sZCgmcnRoLT5kc3QpOwotCi0JCXJjdV9yZWFkX3VubG9jaygpOwotCX0KLQotCXJldHVybiBydGg7Ci19Ci0KLS8qIGNhbGxlZCB1bmRlciByY3VfcmVhZF9sb2NrICovCi1zdGF0aWMgaW50IHZyZl9nZXRfc2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGZsb3dpNCAqZmw0KQotewotCXN0cnVjdCBmaWJfcmVzdWx0IHJlcyA9IHsgLnRjbGFzc2lkID0gMCB9OwotCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTsKLQl1MzIgb3JpZ190b3MgPSBmbDQtPmZsb3dpNF90b3M7Ci0JdTggZmxhZ3MgPSBmbDQtPmZsb3dpNF9mbGFnczsKLQl1OCBzY29wZSA9IGZsNC0+Zmxvd2k0X3Njb3BlOwotCXU4IHRvcyA9IFJUX0ZMX1RPUyhmbDQpOwotCWludCByYzsKLQotCWlmICh1bmxpa2VseSghZmw0LT5kYWRkcikpCi0JCXJldHVybiAwOwotCi0JZmw0LT5mbG93aTRfZmxhZ3MgfD0gRkxPV0lfRkxBR19TS0lQX05IX09JRjsKLQlmbDQtPmZsb3dpNF9paWYgPSBMT09QQkFDS19JRklOREVYOwotCS8qIG1ha2Ugc3VyZSBvaWYgaXMgc2V0IHRvIFZSRiBkZXZpY2UgZm9yIGxvb2t1cCAqLwotCWZsNC0+Zmxvd2k0X29pZiA9IGRldi0+aWZpbmRleDsKLQlmbDQtPmZsb3dpNF90b3MgPSB0b3MgJiBJUFRPU19SVF9NQVNLOwotCWZsNC0+Zmxvd2k0X3Njb3BlID0gKCh0b3MgJiBSVE9fT05MSU5LKSA/Ci0JCQkgICAgIFJUX1NDT1BFX0xJTksgOiBSVF9TQ09QRV9VTklWRVJTRSk7Ci0KLQlyYyA9IGZpYl9sb29rdXAobmV0LCBmbDQsICZyZXMsIDApOwotCWlmICghcmMpIHsKLQkJaWYgKHJlcy50eXBlID09IFJUTl9MT0NBTCkKLQkJCWZsNC0+c2FkZHIgPSByZXMuZmktPmZpYl9wcmVmc3JjID8gOiBmbDQtPmRhZGRyOwotCQllbHNlCi0JCQlmaWJfc2VsZWN0X3BhdGgobmV0LCAmcmVzLCBmbDQsIC0xKTsKLQl9Ci0KLQlmbDQtPmZsb3dpNF9mbGFncyA9IGZsYWdzOwotCWZsNC0+Zmxvd2k0X3RvcyA9IG9yaWdfdG9zOwotCWZsNC0+Zmxvd2k0X3Njb3BlID0gc2NvcGU7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KIHN0YXRpYyBpbnQgdnJmX3Jjdl9maW5pc2goc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJcmV0dXJuIDA7CkBAIC05NzAsMTA2ICsxMDMwLDQ0IEBACiB9CiAKICNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQotc3RhdGljIHN0cnVjdCBkc3RfZW50cnkgKnZyZl9nZXRfcnQ2X2RzdChjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkgc3RydWN0IGZsb3dpNiAqZmw2KQorLyogc2VuZCB0byBsaW5rLWxvY2FsIG9yIG11bHRpY2FzdCBhZGRyZXNzIHZpYSBpbnRlcmZhY2UgZW5zbGF2ZWQgdG8KKyAqIFZSRiBkZXZpY2UuIEZvcmNlIGxvb2t1cCB0byBWUkYgdGFibGUgd2l0aG91dCBjaGFuZ2luZyBmbG93IHN0cnVjdAorICovCitzdGF0aWMgc3RydWN0IGRzdF9lbnRyeSAqdnJmX2xpbmtfc2NvcGVfbG9va3VwKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgICAgIHN0cnVjdCBmbG93aTYgKmZsNikKIHsKLQlib29sIG5lZWRfc3RyaWN0ID0gcnQ2X25lZWRfc3RyaWN0KCZmbDYtPmRhZGRyKTsKLQlzdHJ1Y3QgbmV0X3ZyZiAqdnJmID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KGRldik7CisJaW50IGZsYWdzID0gUlQ2X0xPT0tVUF9GX0lGQUNFOwogCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IE5VTEw7CiAJc3RydWN0IHJ0Nl9pbmZvICpydDsKIAotCS8qIHNlbmQgdG8gbGluay1sb2NhbCBvciBtdWx0aWNhc3QgYWRkcmVzcyAqLwotCWlmIChuZWVkX3N0cmljdCkgewotCQlpbnQgZmxhZ3MgPSBSVDZfTE9PS1VQX0ZfSUZBQ0U7Ci0KLQkJLyogVlJGIGRldmljZSBkb2VzIG5vdCBoYXZlIGEgbGluay1sb2NhbCBhZGRyZXNzIGFuZAotCQkgKiBzZW5kaW5nIHBhY2tldHMgdG8gbGluay1sb2NhbCBvciBtY2FzdCBhZGRyZXNzZXMgb3ZlcgotCQkgKiBhIFZSRiBkZXZpY2UgZG9lcyBub3QgbWFrZSBzZW5zZQotCQkgKi8KLQkJaWYgKGZsNi0+Zmxvd2k2X29pZiA9PSBkZXYtPmlmaW5kZXgpIHsKLQkJCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9ICZuZXQtPmlwdjYuaXA2X251bGxfZW50cnktPmRzdDsKLQotCQkJZHN0X2hvbGQoZHN0KTsKLQkJCXJldHVybiBkc3Q7Ci0JCX0KLQotCQlpZiAoIWlwdjZfYWRkcl9hbnkoJmZsNi0+c2FkZHIpKQotCQkJZmxhZ3MgfD0gUlQ2X0xPT0tVUF9GX0hBU19TQUREUjsKLQotCQlydCA9IHZyZl9pcDZfcm91dGVfbG9va3VwKG5ldCwgZGV2LCBmbDYsIGZsNi0+Zmxvd2k2X29pZiwgZmxhZ3MpOwotCQlpZiAocnQpCi0JCQlkc3QgPSAmcnQtPmRzdDsKLQotCX0gZWxzZSBpZiAoIShmbDYtPmZsb3dpNl9mbGFncyAmIEZMT1dJX0ZMQUdfTDNNREVWX1NSQykpIHsKLQotCQlyY3VfcmVhZF9sb2NrKCk7Ci0KLQkJcnQgPSByY3VfZGVyZWZlcmVuY2UodnJmLT5ydDYpOwotCQlpZiAobGlrZWx5KHJ0KSkgewotCQkJZHN0ID0gJnJ0LT5kc3Q7Ci0JCQlkc3RfaG9sZChkc3QpOwotCQl9Ci0KLQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJLyogVlJGIGRldmljZSBkb2VzIG5vdCBoYXZlIGEgbGluay1sb2NhbCBhZGRyZXNzIGFuZAorCSAqIHNlbmRpbmcgcGFja2V0cyB0byBsaW5rLWxvY2FsIG9yIG1jYXN0IGFkZHJlc3NlcyBvdmVyCisJICogYSBWUkYgZGV2aWNlIGRvZXMgbm90IG1ha2Ugc2Vuc2UKKwkgKi8KKwlpZiAoZmw2LT5mbG93aTZfb2lmID09IGRldi0+aWZpbmRleCkgeworCQlkc3QgPSAmbmV0LT5pcHY2LmlwNl9udWxsX2VudHJ5LT5kc3Q7CisJCWRzdF9ob2xkKGRzdCk7CisJCXJldHVybiBkc3Q7CiAJfQogCi0JLyogbWFrZSBzdXJlIG9pZiBpcyBzZXQgdG8gVlJGIGRldmljZSBmb3IgbG9va3VwICovCi0JaWYgKCFuZWVkX3N0cmljdCkKLQkJZmw2LT5mbG93aTZfb2lmID0gZGV2LT5pZmluZGV4OworCWlmICghaXB2Nl9hZGRyX2FueSgmZmw2LT5zYWRkcikpCisJCWZsYWdzIHw9IFJUNl9MT09LVVBfRl9IQVNfU0FERFI7CisKKwlydCA9IHZyZl9pcDZfcm91dGVfbG9va3VwKG5ldCwgZGV2LCBmbDYsIGZsNi0+Zmxvd2k2X29pZiwgZmxhZ3MpOworCWlmIChydCkKKwkJZHN0ID0gJnJ0LT5kc3Q7CiAKIAlyZXR1cm4gZHN0OwogfQotCi0vKiBjYWxsZWQgdW5kZXIgcmN1X3JlYWRfbG9jayAqLwotc3RhdGljIGludCB2cmZfZ2V0X3NhZGRyNihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3Qgc29jayAqc2ssCi0JCQkgIHN0cnVjdCBmbG93aTYgKmZsNikKLXsKLQlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KGRldik7Ci0Jc3RydWN0IGRzdF9lbnRyeSAqZHN0OwotCXN0cnVjdCBydDZfaW5mbyAqcnQ7Ci0JaW50IGVycjsKLQotCWlmIChydDZfbmVlZF9zdHJpY3QoJmZsNi0+ZGFkZHIpKSB7Ci0JCXJ0ID0gdnJmX2lwNl9yb3V0ZV9sb29rdXAobmV0LCBkZXYsIGZsNiwgZmw2LT5mbG93aTZfb2lmLAotCQkJCQkgIFJUNl9MT09LVVBfRl9JRkFDRSk7Ci0JCWlmICh1bmxpa2VseSghcnQpKQotCQkJcmV0dXJuIDA7Ci0KLQkJZHN0ID0gJnJ0LT5kc3Q7Ci0JfSBlbHNlIHsKLQkJX191OCBmbGFncyA9IGZsNi0+Zmxvd2k2X2ZsYWdzOwotCi0JCWZsNi0+Zmxvd2k2X2ZsYWdzIHw9IEZMT1dJX0ZMQUdfTDNNREVWX1NSQzsKLQkJZmw2LT5mbG93aTZfZmxhZ3MgfD0gRkxPV0lfRkxBR19TS0lQX05IX09JRjsKLQotCQlkc3QgPSBpcDZfcm91dGVfb3V0cHV0KG5ldCwgc2ssIGZsNik7Ci0JCXJ0ID0gKHN0cnVjdCBydDZfaW5mbyAqKWRzdDsKLQotCQlmbDYtPmZsb3dpNl9mbGFncyA9IGZsYWdzOwotCX0KLQotCWVyciA9IGRzdC0+ZXJyb3I7Ci0JaWYgKCFlcnIpIHsKLQkJZXJyID0gaXA2X3JvdXRlX2dldF9zYWRkcihuZXQsIHJ0LCAmZmw2LT5kYWRkciwKLQkJCQkJICBzayA/IGluZXQ2X3NrKHNrKS0+c3JjcHJlZnMgOiAwLAotCQkJCQkgICZmbDYtPnNhZGRyKTsKLQl9Ci0KLQlkc3RfcmVsZWFzZShkc3QpOwotCi0JcmV0dXJuIGVycjsKLX0KICNlbmRpZgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGwzbWRldl9vcHMgdnJmX2wzbWRldl9vcHMgPSB7CiAJLmwzbWRldl9maWJfdGFibGUJPSB2cmZfZmliX3RhYmxlLAotCS5sM21kZXZfZ2V0X3J0YWJsZQk9IHZyZl9nZXRfcnRhYmxlLAotCS5sM21kZXZfZ2V0X3NhZGRyCT0gdnJmX2dldF9zYWRkciwKIAkubDNtZGV2X2wzX3JjdgkJPSB2cmZfbDNfcmN2LAorCS5sM21kZXZfbDNfb3V0CQk9IHZyZl9sM19vdXQsCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKLQkubDNtZGV2X2dldF9ydDZfZHN0CT0gdnJmX2dldF9ydDZfZHN0LAotCS5sM21kZXZfZ2V0X3NhZGRyNgk9IHZyZl9nZXRfc2FkZHI2LAorCS5sM21kZXZfbGlua19zY29wZV9sb29rdXAgPSB2cmZfbGlua19zY29wZV9sb29rdXAsCiAjZW5kaWYKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Z4bGFuLmMgYi9kcml2ZXJzL25ldC92eGxhbi5jCmluZGV4IGRhNGUzZDYuLmU3ZDE2NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Z4bGFuLmMKKysrIGIvZHJpdmVycy9uZXQvdnhsYW4uYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L25ldG5zL2dlbmVyaWMuaD4KICNpbmNsdWRlIDxuZXQvdnhsYW4uaD4KLSNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KIAogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAjaW5jbHVkZSA8bmV0L2lwNl90dW5uZWwuaD4KQEAgLTI4OCw3ICsyODcsNyBAQAogCiAJaWYgKCFuZXRfZXEoZGV2X25ldCh2eGxhbi0+ZGV2KSwgdnhsYW4tPm5ldCkgJiYKIAkgICAgbmxhX3B1dF9zMzIoc2tiLCBOREFfTElOS19ORVROU0lELAotCQkJcGVlcm5ldDJpZF9hbGxvYyhkZXZfbmV0KHZ4bGFuLT5kZXYpLCB2eGxhbi0+bmV0KSkpCisJCQlwZWVybmV0MmlkKGRldl9uZXQodnhsYW4tPmRldiksIHZ4bGFuLT5uZXQpKSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKIAlpZiAoc2VuZF9ldGggJiYgbmxhX3B1dChza2IsIE5EQV9MTEFERFIsIEVUSF9BTEVOLCAmZmRiLT5ldGhfYWRkcikpCkBAIC04NjEsMjAgKzg2MCwyMCBAQAogLyogRHVtcCBmb3J3YXJkaW5nIHRhYmxlICovCiBzdGF0aWMgaW50IHZ4bGFuX2ZkYl9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKIAkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmZpbHRlcl9kZXYsIGludCBpZHgpCisJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpmaWx0ZXJfZGV2LCBpbnQgKmlkeCkKIHsKIAlzdHJ1Y3QgdnhsYW5fZGV2ICp2eGxhbiA9IG5ldGRldl9wcml2KGRldik7CiAJdW5zaWduZWQgaW50IGg7CisJaW50IGVyciA9IDA7CiAKIAlmb3IgKGggPSAwOyBoIDwgRkRCX0hBU0hfU0laRTsgKytoKSB7CiAJCXN0cnVjdCB2eGxhbl9mZGIgKmY7Ci0JCWludCBlcnI7CiAKIAkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGYsICZ2eGxhbi0+ZmRiX2hlYWRbaF0sIGhsaXN0KSB7CiAJCQlzdHJ1Y3QgdnhsYW5fcmRzdCAqcmQ7CiAKIAkJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHJkLCAmZi0+cmVtb3RlcywgbGlzdCkgewotCQkJCWlmIChpZHggPCBjYi0+YXJnc1swXSkKKwkJCQlpZiAoKmlkeCA8IGNiLT5hcmdzWzJdKQogCQkJCQlnb3RvIHNraXA7CiAKIAkJCQllcnIgPSB2eGxhbl9mZGJfaW5mbyhza2IsIHZ4bGFuLCBmLApAQCAtODgyLDE3ICs4ODEsMTUgQEAKIAkJCQkJCSAgICAgY2ItPm5saC0+bmxtc2dfc2VxLAogCQkJCQkJICAgICBSVE1fTkVXTkVJR0gsCiAJCQkJCQkgICAgIE5MTV9GX01VTFRJLCByZCk7Ci0JCQkJaWYgKGVyciA8IDApIHsKLQkJCQkJY2ItPmFyZ3NbMV0gPSBlcnI7CisJCQkJaWYgKGVyciA8IDApCiAJCQkJCWdvdG8gb3V0OwotCQkJCX0KIHNraXA6Ci0JCQkJKytpZHg7CisJCQkJKmlkeCArPSAxOwogCQkJfQogCQl9CiAJfQogb3V0OgotCXJldHVybiBpZHg7CisJcmV0dXJuIGVycjsKIH0KIAogLyogV2F0Y2ggaW5jb21pbmcgcGFja2V0cyB0byBsZWFybiBtYXBwaW5nIGJldHdlZW4gRXRoZXJuZXQgYWRkcmVzcwpAQCAtMTI5NCw3ICsxMjkxLDcgQEAKIAkJc3RydWN0IG1ldGFkYXRhX2RzdCAqdHVuX2RzdDsKIAogCQl0dW5fZHN0ID0gdWRwX3R1bl9yeF9kc3Qoc2tiLCB2eGxhbl9nZXRfc2tfZmFtaWx5KHZzKSwgVFVOTkVMX0tFWSwKLQkJCQkJIHZ4bGFuX3ZuaV90b190dW5faWQodm5pKSwgc2l6ZW9mKCptZCkpOworCQkJCQkga2V5MzJfdG9fdHVubmVsX2lkKHZuaSksIHNpemVvZigqbWQpKTsKIAogCQlpZiAoIXR1bl9kc3QpCiAJCQlnb3RvIGRyb3A7CkBAIC0xODExLDcgKzE4MDgsNyBAQAogCWZsNC5mbG93aTRfbWFyayA9IHNrYi0+bWFyazsKIAlmbDQuZmxvd2k0X3Byb3RvID0gSVBQUk9UT19VRFA7CiAJZmw0LmRhZGRyID0gZGFkZHI7Ci0JZmw0LnNhZGRyID0gdnhsYW4tPmNmZy5zYWRkci5zaW4uc2luX2FkZHIuc19hZGRyOworCWZsNC5zYWRkciA9ICpzYWRkcjsKIAogCXJ0ID0gaXBfcm91dGVfb3V0cHV0X2tleSh2eGxhbi0+bmV0LCAmZmw0KTsKIAlpZiAoIUlTX0VSUihydCkpIHsKQEAgLTE4NDcsNyArMTg0NCw3IEBACiAJbWVtc2V0KCZmbDYsIDAsIHNpemVvZihmbDYpKTsKIAlmbDYuZmxvd2k2X29pZiA9IG9pZjsKIAlmbDYuZGFkZHIgPSAqZGFkZHI7Ci0JZmw2LnNhZGRyID0gdnhsYW4tPmNmZy5zYWRkci5zaW42LnNpbjZfYWRkcjsKKwlmbDYuc2FkZHIgPSAqc2FkZHI7CiAJZmw2LmZsb3dsYWJlbCA9IGlwNl9tYWtlX2Zsb3dpbmZvKFJUX1RPUyh0b3MpLCBsYWJlbCk7CiAJZmw2LmZsb3dpNl9tYXJrID0gc2tiLT5tYXJrOwogCWZsNi5mbG93aTZfcHJvdG8gPSBJUFBST1RPX1VEUDsKQEAgLTE5MjAsNyArMTkxNyw4IEBACiAJc3RydWN0IHJ0YWJsZSAqcnQgPSBOVUxMOwogCWNvbnN0IHN0cnVjdCBpcGhkciAqb2xkX2lwaDsKIAl1bmlvbiB2eGxhbl9hZGRyICpkc3Q7Ci0JdW5pb24gdnhsYW5fYWRkciByZW1vdGVfaXA7CisJdW5pb24gdnhsYW5fYWRkciByZW1vdGVfaXAsIGxvY2FsX2lwOworCXVuaW9uIHZ4bGFuX2FkZHIgKnNyYzsKIAlzdHJ1Y3QgdnhsYW5fbWV0YWRhdGEgX21kOwogCXN0cnVjdCB2eGxhbl9tZXRhZGF0YSAqbWQgPSAmX21kOwogCV9fYmUxNiBzcmNfcG9ydCA9IDAsIGRzdF9wb3J0OwpAQCAtMTkzOCw2ICsxOTM2LDcgQEAKIAkJZHN0X3BvcnQgPSByZHN0LT5yZW1vdGVfcG9ydCA/IHJkc3QtPnJlbW90ZV9wb3J0IDogdnhsYW4tPmNmZy5kc3RfcG9ydDsKIAkJdm5pID0gcmRzdC0+cmVtb3RlX3ZuaTsKIAkJZHN0ID0gJnJkc3QtPnJlbW90ZV9pcDsKKwkJc3JjID0gJnZ4bGFuLT5jZmcuc2FkZHI7CiAJCWRzdF9jYWNoZSA9ICZyZHN0LT5kc3RfY2FjaGU7CiAJfSBlbHNlIHsKIAkJaWYgKCFpbmZvKSB7CkBAIC0xOTQ2LDEzICsxOTQ1LDE3IEBACiAJCQlnb3RvIGRyb3A7CiAJCX0KIAkJZHN0X3BvcnQgPSBpbmZvLT5rZXkudHBfZHN0ID8gOiB2eGxhbi0+Y2ZnLmRzdF9wb3J0OwotCQl2bmkgPSB2eGxhbl90dW5faWRfdG9fdm5pKGluZm8tPmtleS50dW5faWQpOworCQl2bmkgPSB0dW5uZWxfaWRfdG9fa2V5MzIoaW5mby0+a2V5LnR1bl9pZCk7CiAJCXJlbW90ZV9pcC5zYS5zYV9mYW1pbHkgPSBpcF90dW5uZWxfaW5mb19hZihpbmZvKTsKLQkJaWYgKHJlbW90ZV9pcC5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVCkKKwkJaWYgKHJlbW90ZV9pcC5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVCkgewogCQkJcmVtb3RlX2lwLnNpbi5zaW5fYWRkci5zX2FkZHIgPSBpbmZvLT5rZXkudS5pcHY0LmRzdDsKLQkJZWxzZQorCQkJbG9jYWxfaXAuc2luLnNpbl9hZGRyLnNfYWRkciA9IGluZm8tPmtleS51LmlwdjQuc3JjOworCQl9IGVsc2UgewogCQkJcmVtb3RlX2lwLnNpbjYuc2luNl9hZGRyID0gaW5mby0+a2V5LnUuaXB2Ni5kc3Q7CisJCQlsb2NhbF9pcC5zaW42LnNpbjZfYWRkciA9IGluZm8tPmtleS51LmlwdjYuc3JjOworCQl9CiAJCWRzdCA9ICZyZW1vdGVfaXA7CisJCXNyYyA9ICZsb2NhbF9pcDsKIAkJZHN0X2NhY2hlID0gJmluZm8tPmRzdF9jYWNoZTsKIAl9CiAKQEAgLTE5OTIsMTUgKzE5OTUsMTQgQEAKIAl9CiAKIAlpZiAoZHN0LT5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVCkgewotCQlfX2JlMzIgc2FkZHI7Ci0KIAkJaWYgKCF2eGxhbi0+dm40X3NvY2spCiAJCQlnb3RvIGRyb3A7CiAJCXNrID0gdnhsYW4tPnZuNF9zb2NrLT5zb2NrLT5zazsKIAogCQlydCA9IHZ4bGFuX2dldF9yb3V0ZSh2eGxhbiwgc2tiLAogCQkJCSAgICAgcmRzdCA/IHJkc3QtPnJlbW90ZV9pZmluZGV4IDogMCwgdG9zLAotCQkJCSAgICAgZHN0LT5zaW4uc2luX2FkZHIuc19hZGRyLCAmc2FkZHIsCisJCQkJICAgICBkc3QtPnNpbi5zaW5fYWRkci5zX2FkZHIsCisJCQkJICAgICAmc3JjLT5zaW4uc2luX2FkZHIuc19hZGRyLAogCQkJCSAgICAgZHN0X2NhY2hlLCBpbmZvKTsKIAkJaWYgKElTX0VSUihydCkpIHsKIAkJCW5ldGRldl9kYmcoZGV2LCAibm8gcm91dGUgdG8gJXBJNFxuIiwKQEAgLTIwMTcsNyArMjAxOSw3IEBACiAJCX0KIAogCQkvKiBCeXBhc3MgZW5jYXBzdWxhdGlvbiBpZiB0aGUgZGVzdGluYXRpb24gaXMgbG9jYWwgKi8KLQkJaWYgKHJ0LT5ydF9mbGFncyAmIFJUQ0ZfTE9DQUwgJiYKKwkJaWYgKCFpbmZvICYmIHJ0LT5ydF9mbGFncyAmIFJUQ0ZfTE9DQUwgJiYKIAkJICAgICEocnQtPnJ0X2ZsYWdzICYgKFJUQ0ZfQlJPQURDQVNUIHwgUlRDRl9NVUxUSUNBU1QpKSkgewogCQkJc3RydWN0IHZ4bGFuX2RldiAqZHN0X3Z4bGFuOwogCkBAIC0yMDQzLDEzICsyMDQ1LDEyIEBACiAJCWlmIChlcnIgPCAwKQogCQkJZ290byB4bWl0X3R4X2Vycm9yOwogCi0JCXVkcF90dW5uZWxfeG1pdF9za2IocnQsIHNrLCBza2IsIHNhZGRyLAorCQl1ZHBfdHVubmVsX3htaXRfc2tiKHJ0LCBzaywgc2tiLCBzcmMtPnNpbi5zaW5fYWRkci5zX2FkZHIsCiAJCQkJICAgIGRzdC0+c2luLnNpbl9hZGRyLnNfYWRkciwgdG9zLCB0dGwsIGRmLAogCQkJCSAgICBzcmNfcG9ydCwgZHN0X3BvcnQsIHhuZXQsICF1ZHBfc3VtKTsKICNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCX0gZWxzZSB7CiAJCXN0cnVjdCBkc3RfZW50cnkgKm5kc3Q7Ci0JCXN0cnVjdCBpbjZfYWRkciBzYWRkcjsKIAkJdTMyIHJ0NmlfZmxhZ3M7CiAKIAkJaWYgKCF2eGxhbi0+dm42X3NvY2spCkBAIC0yMDU4LDcgKzIwNTksOCBAQAogCiAJCW5kc3QgPSB2eGxhbjZfZ2V0X3JvdXRlKHZ4bGFuLCBza2IsCiAJCQkJCXJkc3QgPyByZHN0LT5yZW1vdGVfaWZpbmRleCA6IDAsIHRvcywKLQkJCQkJbGFiZWwsICZkc3QtPnNpbjYuc2luNl9hZGRyLCAmc2FkZHIsCisJCQkJCWxhYmVsLCAmZHN0LT5zaW42LnNpbjZfYWRkciwKKwkJCQkJJnNyYy0+c2luNi5zaW42X2FkZHIsCiAJCQkJCWRzdF9jYWNoZSwgaW5mbyk7CiAJCWlmIChJU19FUlIobmRzdCkpIHsKIAkJCW5ldGRldl9kYmcoZGV2LCAibm8gcm91dGUgdG8gJXBJNlxuIiwKQEAgLTIwNzcsNyArMjA3OSw3IEBACiAKIAkJLyogQnlwYXNzIGVuY2Fwc3VsYXRpb24gaWYgdGhlIGRlc3RpbmF0aW9uIGlzIGxvY2FsICovCiAJCXJ0NmlfZmxhZ3MgPSAoKHN0cnVjdCBydDZfaW5mbyAqKW5kc3QpLT5ydDZpX2ZsYWdzOwotCQlpZiAocnQ2aV9mbGFncyAmIFJURl9MT0NBTCAmJgorCQlpZiAoIWluZm8gJiYgcnQ2aV9mbGFncyAmIFJURl9MT0NBTCAmJgogCQkgICAgIShydDZpX2ZsYWdzICYgKFJUQ0ZfQlJPQURDQVNUIHwgUlRDRl9NVUxUSUNBU1QpKSkgewogCQkJc3RydWN0IHZ4bGFuX2RldiAqZHN0X3Z4bGFuOwogCkBAIC0yMTAxLDEwICsyMTAzLDEyIEBACiAJCQkJICAgICAgdm5pLCBtZCwgZmxhZ3MsIHVkcF9zdW0pOwogCQlpZiAoZXJyIDwgMCkgewogCQkJZHN0X3JlbGVhc2UobmRzdCk7CisJCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCQkJcmV0dXJuOwogCQl9CiAJCXVkcF90dW5uZWw2X3htaXRfc2tiKG5kc3QsIHNrLCBza2IsIGRldiwKLQkJCQkgICAgICZzYWRkciwgJmRzdC0+c2luNi5zaW42X2FkZHIsIHRvcywgdHRsLAorCQkJCSAgICAgJnNyYy0+c2luNi5zaW42X2FkZHIsCisJCQkJICAgICAmZHN0LT5zaW42LnNpbjZfYWRkciwgdG9zLCB0dGwsCiAJCQkJICAgICBsYWJlbCwgc3JjX3BvcnQsIGRzdF9wb3J0LCAhdWRwX3N1bSk7CiAjZW5kaWYKIAl9CkBAIC0yNzc2LDE0ICsyNzgwLDE1IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmxvd2VyZGV2ID0gTlVMTDsKIAogCWlmIChjb25mLT5mbGFncyAmIFZYTEFOX0ZfR1BFKSB7Ci0JCWlmIChjb25mLT5mbGFncyAmIH5WWExBTl9GX0FMTE9XRURfR1BFKQotCQkJcmV0dXJuIC1FSU5WQUw7CiAJCS8qIEZvciBub3csIGFsbG93IEdQRSBvbmx5IHRvZ2V0aGVyIHdpdGggQ09MTEVDVF9NRVRBREFUQS4KIAkJICogVGhpcyBjYW4gYmUgcmVsYXhlZCBsYXRlcjsgaW4gc3VjaCBjYXNlLCB0aGUgb3RoZXIgc2lkZQogCQkgKiBvZiB0aGUgUHRQIGxpbmsgd2lsbCBoYXZlIHRvIGJlIHByb3ZpZGVkLgogCQkgKi8KLQkJaWYgKCEoY29uZi0+ZmxhZ3MgJiBWWExBTl9GX0NPTExFQ1RfTUVUQURBVEEpKQorCQlpZiAoKGNvbmYtPmZsYWdzICYgflZYTEFOX0ZfQUxMT1dFRF9HUEUpIHx8CisJCSAgICAhKGNvbmYtPmZsYWdzICYgVlhMQU5fRl9DT0xMRUNUX01FVEFEQVRBKSkgeworCQkJcHJfaW5mbygidW5zdXBwb3J0ZWQgY29tYmluYXRpb24gb2YgZXh0ZW5zaW9uc1xuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCiAJCXZ4bGFuX3Jhd19zZXR1cChkZXYpOwogCX0gZWxzZSB7CkBAIC0yODM2LDYgKzI4NDEsOSBAQAogCQkJZGV2LT5tdHUgPSBsb3dlcmRldi0+bXR1IC0gKHVzZV9pcHY2ID8gVlhMQU42X0hFQURST09NIDogVlhMQU5fSEVBRFJPT00pOwogCiAJCW5lZWRlZF9oZWFkcm9vbSA9IGxvd2VyZGV2LT5oYXJkX2hlYWRlcl9sZW47CisJfSBlbHNlIGlmICh2eGxhbl9hZGRyX211bHRpY2FzdCgmZHN0LT5yZW1vdGVfaXApKSB7CisJCXByX2luZm8oIm11bHRpY2FzdCBkZXN0aW5hdGlvbiByZXF1aXJlcyBpbnRlcmZhY2UgdG8gYmUgc3BlY2lmaWVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKGNvbmYtPm10dSkgewpAQCAtMjg2OCw4ICsyODc2LDEwIEBACiAJCSAgICAgdG1wLT5jZmcuc2FkZHIuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2KSA9PSB1c2VfaXB2NiAmJgogCQkgICAgdG1wLT5jZmcuZHN0X3BvcnQgPT0gdnhsYW4tPmNmZy5kc3RfcG9ydCAmJgogCQkgICAgKHRtcC0+ZmxhZ3MgJiBWWExBTl9GX1JDVl9GTEFHUykgPT0KLQkJICAgICh2eGxhbi0+ZmxhZ3MgJiBWWExBTl9GX1JDVl9GTEFHUykpCi0JCXJldHVybiAtRUVYSVNUOworCQkgICAgKHZ4bGFuLT5mbGFncyAmIFZYTEFOX0ZfUkNWX0ZMQUdTKSkgeworCQkJcHJfaW5mbygiZHVwbGljYXRlIFZOSSAldVxuIiwgYmUzMl90b19jcHUoY29uZi0+dm5pKSk7CisJCQlyZXR1cm4gLUVFWElTVDsKKwkJfQogCX0KIAogCWRldi0+ZXRodG9vbF9vcHMgPSAmdnhsYW5fZXRodG9vbF9vcHM7CkBAIC0yOTAzLDcgKzI5MTMsNiBAQAogCQkJIHN0cnVjdCBubGF0dHIgKnRiW10sIHN0cnVjdCBubGF0dHIgKmRhdGFbXSkKIHsKIAlzdHJ1Y3QgdnhsYW5fY29uZmlnIGNvbmY7Ci0JaW50IGVycjsKIAogCW1lbXNldCgmY29uZiwgMCwgc2l6ZW9mKGNvbmYpKTsKIApAQCAtMzAxMiwyNiArMzAyMSw3IEBACiAJaWYgKHRiW0lGTEFfTVRVXSkKIAkJY29uZi5tdHUgPSBubGFfZ2V0X3UzMih0YltJRkxBX01UVV0pOwogCi0JZXJyID0gdnhsYW5fZGV2X2NvbmZpZ3VyZShzcmNfbmV0LCBkZXYsICZjb25mKTsKLQlzd2l0Y2ggKGVycikgewotCWNhc2UgLUVOT0RFVjoKLQkJcHJfaW5mbygiaWZpbmRleCAlZCBkb2VzIG5vdCBleGlzdFxuIiwgY29uZi5yZW1vdGVfaWZpbmRleCk7Ci0JCWJyZWFrOwotCi0JY2FzZSAtRVBFUk06Ci0JCXByX2luZm8oIklQdjYgaXMgZGlzYWJsZWQgdmlhIHN5c2N0bFxuIik7Ci0JCWJyZWFrOwotCi0JY2FzZSAtRUVYSVNUOgotCQlwcl9pbmZvKCJkdXBsaWNhdGUgVk5JICV1XG4iLCBiZTMyX3RvX2NwdShjb25mLnZuaSkpOwotCQlicmVhazsKLQotCWNhc2UgLUVJTlZBTDoKLQkJcHJfaW5mbygidW5zdXBwb3J0ZWQgY29tYmluYXRpb24gb2YgZXh0ZW5zaW9uc1xuIik7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBlcnI7CisJcmV0dXJuIHZ4bGFuX2Rldl9jb25maWd1cmUoc3JjX25ldCwgZGV2LCAmY29uZik7CiB9CiAKIHN0YXRpYyB2b2lkIHZ4bGFuX2RlbGxpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9mc2xfdWNjX2hkbGMuYyBiL2RyaXZlcnMvbmV0L3dhbi9mc2xfdWNjX2hkbGMuYwppbmRleCA2ZjA0NDQ1Li41ZmJmODNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vZnNsX3VjY19oZGxjLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2ZzbF91Y2NfaGRsYy5jCkBAIC0xNjIsNyArMTYyLDcgQEAKIAkJCQlBTElHTk1FTlRfT0ZfVUNDX0hETENfUFJBTSk7CiAKIAlpZiAocHJpdi0+dWNjX3ByYW1fb2Zmc2V0IDwgMCkgewotCQlkZXZfZXJyKHByaXYtPmRldiwgIkNhbiBub3QgYWxsb2NhdGUgTVVSQU0gZm9yIGhkbGMgcHJhbWV0ZXIuXG4iKTsKKwkJZGV2X2Vycihwcml2LT5kZXYsICJDYW4gbm90IGFsbG9jYXRlIE1VUkFNIGZvciBoZGxjIHBhcmFtZXRlci5cbiIpOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGZyZWVfdHhfYmQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3NibmkuYyBiL2RyaXZlcnMvbmV0L3dhbi9zYm5pLmMKaW5kZXggZDk4YzdlNS4uM2E0MjFjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL3NibmkuYworKysgYi9kcml2ZXJzL25ldC93YW4vc2JuaS5jCkBAIC01ODIsOCArNTgyLDggQEAKIAogCiAvKgotICogUm91dGluZSByZXR1cm5zIDEgaWYgaXQgbmVlZCB0byBhY2tub3dlbGVkZ2UgcmVjZWl2ZWQgZnJhbWUuCi0gKiBFbXB0eSBmcmFtZSByZWNlaXZlZCB3aXRob3V0IGVycm9ycyB3b24ndCBiZSBhY2tub3dlbGVkZ2VkLgorICogUm91dGluZSByZXR1cm5zIDEgaWYgaXQgbmVlZHMgdG8gYWNrbm93bGVkZ2UgcmVjZWl2ZWQgZnJhbWUuCisgKiBFbXB0eSBmcmFtZSByZWNlaXZlZCB3aXRob3V0IGVycm9ycyB3b24ndCBiZSBhY2tub3dsZWRnZWQuCiAgKi8KIAogc3RhdGljIGludApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi1ub3RpZi5jIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi1ub3RpZi5jCmluZGV4IGZjMTM1NWQuLjVkNDI5ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2Itbm90aWYuYworKysgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLW5vdGlmLmMKQEAgLTIwNiw3ICsyMDYsNiBAQAogCWkyNDAwbXUtPm5vdGlmX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpMjQwMG11LT5ub3RpZl91cmIpIHsKIAkJcmV0ID0gLUVOT01FTTsKLQkJZGV2X2VycihkZXYsICJub3RpZmljYXRpb246IGNhbm5vdCBhbGxvY2F0ZSBVUkJcbiIpOwogCQlnb3RvIGVycm9yX2FsbG9jX3VyYjsKIAl9CiAJZXBkID0gdXNiX2dldF9lcGQoaTI0MDBtdS0+dXNiX2lmYWNlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2FyNTUyMy9hcjU1MjMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hcjU1MjMvYXI1NTIzLmMKaW5kZXggOGFkZWQyNC4uN2E2MGQyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2FyNTUyMy9hcjU1MjMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXI1NTIzL2FyNTUyMy5jCkBAIC03MDYsMTAgKzcwNiw4IEBACiAKIAkJZGF0YS0+YXIgPSBhcjsKIAkJZGF0YS0+dXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFkYXRhLT51cmIpIHsKLQkJCWFyNTUyM19lcnIoYXIsICJjb3VsZCBub3QgYWxsb2NhdGUgcnggZGF0YSB1cmJcbiIpOworCQlpZiAoIWRhdGEtPnVyYikKIAkJCWdvdG8gZXJyOwotCQl9CiAJCWxpc3RfYWRkX3RhaWwoJmRhdGEtPmxpc3QsICZhci0+cnhfZGF0YV9mcmVlKTsKIAkJYXRvbWljX2luYygmYXItPnJ4X2RhdGFfZnJlZV9jbnQpOwogCX0KQEAgLTgyNCw3ICs4MjIsNiBAQAogCiAJCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdXJiKSB7Ci0JCQlhcjU1MjNfZXJyKGFyLCAiRmFpbGVkIHRvIGFsbG9jYXRlIFRYIHVyYlxuIik7CiAJCQlpZWVlODAyMTFfZnJlZV90eHNrYihhci0+aHcsIHNrYik7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtOTQ5LDEwICs5NDYsOCBAQAogCWluaXRfY29tcGxldGlvbigmY21kLT5kb25lKTsKIAogCWNtZC0+dXJiX3R4ID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNtZC0+dXJiX3R4KSB7Ci0JCWFyNTUyM19lcnIoYXIsICJjb3VsZCBub3QgYWxsb2NhdGUgdXJiXG4iKTsKKwlpZiAoIWNtZC0+dXJiX3R4KQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAJY21kLT5idWZfdHggPSB1c2JfYWxsb2NfY29oZXJlbnQoYXItPmRldiwgQVI1NTIzX01BWF9UWENNRFNaLAogCQkJCQkgR0ZQX0tFUk5FTCwKIAkJCQkJICZjbWQtPnVyYl90eC0+dHJhbnNmZXJfZG1hKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvYWhiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2FoYi5jCmluZGV4IGFjZWMxNmIuLjc2NmM2M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvYWhiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9haGIuYwpAQCAtOTEsNTkgKzkxLDM3IEBACiB7CiAJc3RydWN0IGF0aDEwa19haGIgKmFyX2FoYiA9IGF0aDEwa19haGJfcHJpdihhcik7CiAJc3RydWN0IGRldmljZSAqZGV2OwotCWludCByZXQ7CiAKIAlkZXYgPSAmYXJfYWhiLT5wZGV2LT5kZXY7CiAKLQlhcl9haGItPmNtZF9jbGsgPSBjbGtfZ2V0KGRldiwgIndpZmlfd2Nzc19jbWQiKTsKKwlhcl9haGItPmNtZF9jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAid2lmaV93Y3NzX2NtZCIpOwogCWlmIChJU19FUlJfT1JfTlVMTChhcl9haGItPmNtZF9jbGspKSB7CiAJCWF0aDEwa19lcnIoYXIsICJmYWlsZWQgdG8gZ2V0IGNtZCBjbGs6ICVsZFxuIiwKIAkJCSAgIFBUUl9FUlIoYXJfYWhiLT5jbWRfY2xrKSk7Ci0JCXJldCA9IGFyX2FoYi0+Y21kX2NsayA/IFBUUl9FUlIoYXJfYWhiLT5jbWRfY2xrKSA6IC1FTk9ERVY7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm4gYXJfYWhiLT5jbWRfY2xrID8gUFRSX0VSUihhcl9haGItPmNtZF9jbGspIDogLUVOT0RFVjsKIAl9CiAKLQlhcl9haGItPnJlZl9jbGsgPSBjbGtfZ2V0KGRldiwgIndpZmlfd2Nzc19yZWYiKTsKKwlhcl9haGItPnJlZl9jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAid2lmaV93Y3NzX3JlZiIpOwogCWlmIChJU19FUlJfT1JfTlVMTChhcl9haGItPnJlZl9jbGspKSB7CiAJCWF0aDEwa19lcnIoYXIsICJmYWlsZWQgdG8gZ2V0IHJlZiBjbGs6ICVsZFxuIiwKIAkJCSAgIFBUUl9FUlIoYXJfYWhiLT5yZWZfY2xrKSk7Ci0JCXJldCA9IGFyX2FoYi0+cmVmX2NsayA/IFBUUl9FUlIoYXJfYWhiLT5yZWZfY2xrKSA6IC1FTk9ERVY7Ci0JCWdvdG8gZXJyX2NtZF9jbGtfcHV0OworCQlyZXR1cm4gYXJfYWhiLT5yZWZfY2xrID8gUFRSX0VSUihhcl9haGItPnJlZl9jbGspIDogLUVOT0RFVjsKIAl9CiAKLQlhcl9haGItPnJ0Y19jbGsgPSBjbGtfZ2V0KGRldiwgIndpZmlfd2Nzc19ydGMiKTsKKwlhcl9haGItPnJ0Y19jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAid2lmaV93Y3NzX3J0YyIpOwogCWlmIChJU19FUlJfT1JfTlVMTChhcl9haGItPnJ0Y19jbGspKSB7CiAJCWF0aDEwa19lcnIoYXIsICJmYWlsZWQgdG8gZ2V0IHJ0YyBjbGs6ICVsZFxuIiwKIAkJCSAgIFBUUl9FUlIoYXJfYWhiLT5ydGNfY2xrKSk7Ci0JCXJldCA9IGFyX2FoYi0+cnRjX2NsayA/IFBUUl9FUlIoYXJfYWhiLT5ydGNfY2xrKSA6IC1FTk9ERVY7Ci0JCWdvdG8gZXJyX3JlZl9jbGtfcHV0OworCQlyZXR1cm4gYXJfYWhiLT5ydGNfY2xrID8gUFRSX0VSUihhcl9haGItPnJ0Y19jbGspIDogLUVOT0RFVjsKIAl9CiAKIAlyZXR1cm4gMDsKLQotZXJyX3JlZl9jbGtfcHV0OgotCWNsa19wdXQoYXJfYWhiLT5yZWZfY2xrKTsKLQotZXJyX2NtZF9jbGtfcHV0OgotCWNsa19wdXQoYXJfYWhiLT5jbWRfY2xrKTsKLQotb3V0OgotCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIGF0aDEwa19haGJfY2xvY2tfZGVpbml0KHN0cnVjdCBhdGgxMGsgKmFyKQogewogCXN0cnVjdCBhdGgxMGtfYWhiICphcl9haGIgPSBhdGgxMGtfYWhiX3ByaXYoYXIpOwogCi0JaWYgKCFJU19FUlJfT1JfTlVMTChhcl9haGItPmNtZF9jbGspKQotCQljbGtfcHV0KGFyX2FoYi0+Y21kX2Nsayk7Ci0KLQlpZiAoIUlTX0VSUl9PUl9OVUxMKGFyX2FoYi0+cmVmX2NsaykpCi0JCWNsa19wdXQoYXJfYWhiLT5yZWZfY2xrKTsKLQotCWlmICghSVNfRVJSX09SX05VTEwoYXJfYWhiLT5ydGNfY2xrKSkKLQkJY2xrX3B1dChhcl9haGItPnJ0Y19jbGspOwotCiAJYXJfYWhiLT5jbWRfY2xrID0gTlVMTDsKIAlhcl9haGItPnJlZl9jbGsgPSBOVUxMOwogCWFyX2FoYi0+cnRjX2NsayA9IE5VTEw7CkBAIC0yMTMsOTIgKzE5MSw1MSBAQAogewogCXN0cnVjdCBhdGgxMGtfYWhiICphcl9haGIgPSBhdGgxMGtfYWhiX3ByaXYoYXIpOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlpbnQgcmV0OwogCiAJZGV2ID0gJmFyX2FoYi0+cGRldi0+ZGV2OwogCi0JYXJfYWhiLT5jb3JlX2NvbGRfcnN0ID0gcmVzZXRfY29udHJvbF9nZXQoZGV2LCAid2lmaV9jb3JlX2NvbGQiKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoYXJfYWhiLT5jb3JlX2NvbGRfcnN0KSkgeworCWFyX2FoYi0+Y29yZV9jb2xkX3JzdCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoZGV2LCAid2lmaV9jb3JlX2NvbGQiKTsKKwlpZiAoSVNfRVJSKGFyX2FoYi0+Y29yZV9jb2xkX3JzdCkpIHsKIAkJYXRoMTBrX2VycihhciwgImZhaWxlZCB0byBnZXQgY29yZSBjb2xkIHJzdCBjdHJsOiAlbGRcbiIsCiAJCQkgICBQVFJfRVJSKGFyX2FoYi0+Y29yZV9jb2xkX3JzdCkpOwotCQlyZXQgPSBhcl9haGItPmNvcmVfY29sZF9yc3QgPwotCQkJUFRSX0VSUihhcl9haGItPmNvcmVfY29sZF9yc3QpIDogLUVOT0RFVjsKLQkJZ290byBvdXQ7CisJCXJldHVybiBQVFJfRVJSKGFyX2FoYi0+Y29yZV9jb2xkX3JzdCk7CiAJfQogCi0JYXJfYWhiLT5yYWRpb19jb2xkX3JzdCA9IHJlc2V0X2NvbnRyb2xfZ2V0KGRldiwgIndpZmlfcmFkaW9fY29sZCIpOwotCWlmIChJU19FUlJfT1JfTlVMTChhcl9haGItPnJhZGlvX2NvbGRfcnN0KSkgeworCWFyX2FoYi0+cmFkaW9fY29sZF9yc3QgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0KGRldiwgIndpZmlfcmFkaW9fY29sZCIpOworCWlmIChJU19FUlIoYXJfYWhiLT5yYWRpb19jb2xkX3JzdCkpIHsKIAkJYXRoMTBrX2VycihhciwgImZhaWxlZCB0byBnZXQgcmFkaW8gY29sZCByc3QgY3RybDogJWxkXG4iLAogCQkJICAgUFRSX0VSUihhcl9haGItPnJhZGlvX2NvbGRfcnN0KSk7Ci0JCXJldCA9IGFyX2FoYi0+cmFkaW9fY29sZF9yc3QgPwotCQkJUFRSX0VSUihhcl9haGItPnJhZGlvX2NvbGRfcnN0KSA6IC1FTk9ERVY7Ci0JCWdvdG8gZXJyX2NvcmVfY29sZF9yc3RfcHV0OworCQlyZXR1cm4gUFRSX0VSUihhcl9haGItPnJhZGlvX2NvbGRfcnN0KTsKIAl9CiAKLQlhcl9haGItPnJhZGlvX3dhcm1fcnN0ID0gcmVzZXRfY29udHJvbF9nZXQoZGV2LCAid2lmaV9yYWRpb193YXJtIik7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGFyX2FoYi0+cmFkaW9fd2FybV9yc3QpKSB7CisJYXJfYWhiLT5yYWRpb193YXJtX3JzdCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoZGV2LCAid2lmaV9yYWRpb193YXJtIik7CisJaWYgKElTX0VSUihhcl9haGItPnJhZGlvX3dhcm1fcnN0KSkgewogCQlhdGgxMGtfZXJyKGFyLCAiZmFpbGVkIHRvIGdldCByYWRpbyB3YXJtIHJzdCBjdHJsOiAlbGRcbiIsCiAJCQkgICBQVFJfRVJSKGFyX2FoYi0+cmFkaW9fd2FybV9yc3QpKTsKLQkJcmV0ID0gYXJfYWhiLT5yYWRpb193YXJtX3JzdCA/Ci0JCQlQVFJfRVJSKGFyX2FoYi0+cmFkaW9fd2FybV9yc3QpIDogLUVOT0RFVjsKLQkJZ290byBlcnJfcmFkaW9fY29sZF9yc3RfcHV0OworCQlyZXR1cm4gUFRSX0VSUihhcl9haGItPnJhZGlvX3dhcm1fcnN0KTsKIAl9CiAKLQlhcl9haGItPnJhZGlvX3NyaWZfcnN0ID0gcmVzZXRfY29udHJvbF9nZXQoZGV2LCAid2lmaV9yYWRpb19zcmlmIik7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGFyX2FoYi0+cmFkaW9fc3JpZl9yc3QpKSB7CisJYXJfYWhiLT5yYWRpb19zcmlmX3JzdCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoZGV2LCAid2lmaV9yYWRpb19zcmlmIik7CisJaWYgKElTX0VSUihhcl9haGItPnJhZGlvX3NyaWZfcnN0KSkgewogCQlhdGgxMGtfZXJyKGFyLCAiZmFpbGVkIHRvIGdldCByYWRpbyBzcmlmIHJzdCBjdHJsOiAlbGRcbiIsCiAJCQkgICBQVFJfRVJSKGFyX2FoYi0+cmFkaW9fc3JpZl9yc3QpKTsKLQkJcmV0ID0gYXJfYWhiLT5yYWRpb19zcmlmX3JzdCA/Ci0JCQlQVFJfRVJSKGFyX2FoYi0+cmFkaW9fc3JpZl9yc3QpIDogLUVOT0RFVjsKLQkJZ290byBlcnJfcmFkaW9fd2FybV9yc3RfcHV0OworCQlyZXR1cm4gUFRSX0VSUihhcl9haGItPnJhZGlvX3NyaWZfcnN0KTsKIAl9CiAKLQlhcl9haGItPmNwdV9pbml0X3JzdCA9IHJlc2V0X2NvbnRyb2xfZ2V0KGRldiwgIndpZmlfY3B1X2luaXQiKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoYXJfYWhiLT5jcHVfaW5pdF9yc3QpKSB7CisJYXJfYWhiLT5jcHVfaW5pdF9yc3QgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0KGRldiwgIndpZmlfY3B1X2luaXQiKTsKKwlpZiAoSVNfRVJSKGFyX2FoYi0+Y3B1X2luaXRfcnN0KSkgewogCQlhdGgxMGtfZXJyKGFyLCAiZmFpbGVkIHRvIGdldCBjcHUgaW5pdCByc3QgY3RybDogJWxkXG4iLAogCQkJICAgUFRSX0VSUihhcl9haGItPmNwdV9pbml0X3JzdCkpOwotCQlyZXQgPSBhcl9haGItPmNwdV9pbml0X3JzdCA/Ci0JCQlQVFJfRVJSKGFyX2FoYi0+Y3B1X2luaXRfcnN0KSA6IC1FTk9ERVY7Ci0JCWdvdG8gZXJyX3JhZGlvX3NyaWZfcnN0X3B1dDsKKwkJcmV0dXJuIFBUUl9FUlIoYXJfYWhiLT5jcHVfaW5pdF9yc3QpOwogCX0KIAogCXJldHVybiAwOwotCi1lcnJfcmFkaW9fc3JpZl9yc3RfcHV0OgotCXJlc2V0X2NvbnRyb2xfcHV0KGFyX2FoYi0+cmFkaW9fc3JpZl9yc3QpOwotCi1lcnJfcmFkaW9fd2FybV9yc3RfcHV0OgotCXJlc2V0X2NvbnRyb2xfcHV0KGFyX2FoYi0+cmFkaW9fd2FybV9yc3QpOwotCi1lcnJfcmFkaW9fY29sZF9yc3RfcHV0OgotCXJlc2V0X2NvbnRyb2xfcHV0KGFyX2FoYi0+cmFkaW9fY29sZF9yc3QpOwotCi1lcnJfY29yZV9jb2xkX3JzdF9wdXQ6Ci0JcmVzZXRfY29udHJvbF9wdXQoYXJfYWhiLT5jb3JlX2NvbGRfcnN0KTsKLQotb3V0OgotCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIGF0aDEwa19haGJfcnN0X2N0cmxfZGVpbml0KHN0cnVjdCBhdGgxMGsgKmFyKQogewogCXN0cnVjdCBhdGgxMGtfYWhiICphcl9haGIgPSBhdGgxMGtfYWhiX3ByaXYoYXIpOwogCi0JaWYgKCFJU19FUlJfT1JfTlVMTChhcl9haGItPmNvcmVfY29sZF9yc3QpKQotCQlyZXNldF9jb250cm9sX3B1dChhcl9haGItPmNvcmVfY29sZF9yc3QpOwotCi0JaWYgKCFJU19FUlJfT1JfTlVMTChhcl9haGItPnJhZGlvX2NvbGRfcnN0KSkKLQkJcmVzZXRfY29udHJvbF9wdXQoYXJfYWhiLT5yYWRpb19jb2xkX3JzdCk7Ci0KLQlpZiAoIUlTX0VSUl9PUl9OVUxMKGFyX2FoYi0+cmFkaW9fd2FybV9yc3QpKQotCQlyZXNldF9jb250cm9sX3B1dChhcl9haGItPnJhZGlvX3dhcm1fcnN0KTsKLQotCWlmICghSVNfRVJSX09SX05VTEwoYXJfYWhiLT5yYWRpb19zcmlmX3JzdCkpCi0JCXJlc2V0X2NvbnRyb2xfcHV0KGFyX2FoYi0+cmFkaW9fc3JpZl9yc3QpOwotCi0JaWYgKCFJU19FUlJfT1JfTlVMTChhcl9haGItPmNwdV9pbml0X3JzdCkpCi0JCXJlc2V0X2NvbnRyb2xfcHV0KGFyX2FoYi0+Y3B1X2luaXRfcnN0KTsKLQogCWFyX2FoYi0+Y29yZV9jb2xkX3JzdCA9IE5VTEw7CiAJYXJfYWhiLT5yYWRpb19jb2xkX3JzdCA9IE5VTEw7CiAJYXJfYWhiLT5yYWRpb193YXJtX3JzdCA9IE5VTEw7CkBAIC00NjIsMTMgKzM5OSwxMyBAQAogc3RhdGljIGlycXJldHVybl90IGF0aDEwa19haGJfaW50ZXJydXB0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBhdGgxMGsgKmFyID0gYXJnOwotCXN0cnVjdCBhdGgxMGtfcGNpICphcl9wY2kgPSBhdGgxMGtfcGNpX3ByaXYoYXIpOwogCiAJaWYgKCFhdGgxMGtfcGNpX2lycV9wZW5kaW5nKGFyKSkKIAkJcmV0dXJuIElSUV9OT05FOwogCiAJYXRoMTBrX3BjaV9kaXNhYmxlX2FuZF9jbGVhcl9sZWdhY3lfaXJxKGFyKTsKLQl0YXNrbGV0X3NjaGVkdWxlKCZhcl9wY2ktPmludHJfdHEpOworCWF0aDEwa19wY2lfaXJxX21zaV9md19tYXNrKGFyKTsKKwluYXBpX3NjaGVkdWxlKCZhci0+bmFwaSk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC01NzIsMTIgKzUwOSwxMyBAQAogCWFyX2FoYi0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgImxlZ2FjeSIpOwogCWlmIChhcl9haGItPmlycSA8IDApIHsKIAkJYXRoMTBrX2VycihhciwgImZhaWxlZCB0byBnZXQgaXJxIG51bWJlcjogJWRcbiIsIGFyX2FoYi0+aXJxKTsKKwkJcmV0ID0gYXJfYWhiLT5pcnE7CiAJCWdvdG8gZXJyX2Nsb2NrX2RlaW5pdDsKIAl9CiAKIAlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0JPT1QsICJpcnE6ICVkXG4iLCBhcl9haGItPmlycSk7CiAKLQlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0JPT1QsICJtZW06IDB4JXAgbWVtX2xlbjogJWx1IGdjYyBtZW06IDB4JXAgdGNzcl9tZW06IDB4JXBcbiIsCisJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19CT09ULCAibWVtOiAweCVwSyBtZW1fbGVuOiAlbHUgZ2NjIG1lbTogMHglcEsgdGNzcl9tZW06IDB4JXBLXG4iLAogCQkgICBhcl9haGItPm1lbSwgYXJfYWhiLT5tZW1fbGVuLAogCQkgICBhcl9haGItPmdjY19tZW0sIGFyX2FoYi0+dGNzcl9tZW0pOwogCXJldHVybiAwOwpAQCAtNzE3LDYgKzY1NSw5IEBACiAJc3luY2hyb25pemVfaXJxKGFyX2FoYi0+aXJxKTsKIAogCWF0aDEwa19wY2lfZmx1c2goYXIpOworCisJbmFwaV9zeW5jaHJvbml6ZSgmYXItPm5hcGkpOworCW5hcGlfZGlzYWJsZSgmYXItPm5hcGkpOwogfQogCiBzdGF0aWMgaW50IGF0aDEwa19haGJfaGlmX3Bvd2VyX3VwKHN0cnVjdCBhdGgxMGsgKmFyKQpAQCAtNzQ4LDYgKzY4OSw3IEBACiAJCWF0aDEwa19lcnIoYXIsICJjb3VsZCBub3Qgd2FrZSB1cCB0YXJnZXQgQ1BVOiAlZFxuIiwgcmV0KTsKIAkJZ290byBlcnJfY2VfZGVpbml0OwogCX0KKwluYXBpX2VuYWJsZSgmYXItPm5hcGkpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTgzMSw3ICs3NzMsNyBAQAogCQlnb3RvIGVycl9yZXNvdXJjZV9kZWluaXQ7CiAJfQogCi0JYXRoMTBrX3BjaV9pbml0X2lycV90YXNrbGV0cyhhcik7CisJYXRoMTBrX3BjaV9pbml0X25hcGkoYXIpOwogCiAJcmV0ID0gYXRoMTBrX2FoYl9yZXF1ZXN0X2lycV9sZWdhY3koYXIpOwogCWlmIChyZXQpCkBAIC04NDYsNiArNzg4LDcgQEAKIAljaGlwX2lkID0gYXRoMTBrX2FoYl9zb2NfcmVhZDMyKGFyLCBTT0NfQ0hJUF9JRF9BRERSRVNTKTsKIAlpZiAoY2hpcF9pZCA9PSAweGZmZmZmZmZmKSB7CiAJCWF0aDEwa19lcnIoYXIsICJmYWlsZWQgdG8gZ2V0IGNoaXAgaWRcbiIpOworCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIGVycl9oYWx0X2RldmljZTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvYm1pLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2JtaS5jCmluZGV4IDNkMjliMDguLjI4NzJkMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvYm1pLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9ibWkuYwpAQCAtMjIxLDcgKzIyMSw3IEBACiAJdTMyIHR4bGVuOwogCWludCByZXQ7CiAKLQlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0JNSSwgImJtaSBseiBkYXRhIGJ1ZmZlciAweCVwIGxlbmd0aCAlZFxuIiwKKwlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0JNSSwgImJtaSBseiBkYXRhIGJ1ZmZlciAweCVwSyBsZW5ndGggJWRcbiIsCiAJCSAgIGJ1ZmZlciwgbGVuZ3RoKTsKIAogCWlmIChhci0+Ym1pLmRvbmVfc2VudCkgewpAQCAtMjg3LDcgKzI4Nyw3IEBACiAJaW50IHJldDsKIAogCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfQk1JLAotCQkgICAiYm1pIGZhc3QgZG93bmxvYWQgYWRkcmVzcyAweCV4IGJ1ZmZlciAweCVwIGxlbmd0aCAlZFxuIiwKKwkJICAgImJtaSBmYXN0IGRvd25sb2FkIGFkZHJlc3MgMHgleCBidWZmZXIgMHglcEsgbGVuZ3RoICVkXG4iLAogCQkgICBhZGRyZXNzLCBidWZmZXIsIGxlbmd0aCk7CiAKIAlyZXQgPSBhdGgxMGtfYm1pX2x6X3N0cmVhbV9zdGFydChhciwgYWRkcmVzcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2NlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2NlLmMKaW5kZXggOWZiOGQ3NC4uMGI0ZDc5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9jZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvY2UuYwpAQCAtMzksNyArMzksNyBAQAogICogY2hvb3NlcyB3aGF0IHRvIHNlbmQgKGJ1ZmZlciBhZGRyZXNzLCBsZW5ndGgpLiBUaGUgZGVzdGluYXRpb24KICAqIHNpZGUga2VlcHMgYSBzdXBwbHkgb2YgImFub255bW91cyByZWNlaXZlIGJ1ZmZlcnMiIGF2YWlsYWJsZSBhbmQKICAqIGl0IGhhbmRsZXMgaW5jb21pbmcgZGF0YSBhcyBpdCBhcnJpdmVzICh3aGVuIHRoZSBkZXN0aW5hdGlvbgotICogcmVjaWV2ZXMgYW4gaW50ZXJydXB0KS4KKyAqIHJlY2VpdmVzIGFuIGludGVycnVwdCkuCiAgKgogICogVGhlIHNlbmRlciBtYXkgc2VuZCBhIHNpbXBsZSBidWZmZXIgKGFkZHJlc3MvbGVuZ3RoKSBvciBpdCBtYXkKICAqIHNlbmQgYSBzbWFsbCBsaXN0IG9mIGJ1ZmZlcnMuICBXaGVuIGEgc21hbGwgbGlzdCBpcyBzZW50LCBoYXJkd2FyZQpAQCAtNDMzLDYgKzQzMywxMyBAQAogCXVuc2lnbmVkIGludCBuZW50cmllc19tYXNrID0gZGVzdF9yaW5nLT5uZW50cmllc19tYXNrOwogCXVuc2lnbmVkIGludCB3cml0ZV9pbmRleCA9IGRlc3RfcmluZy0+d3JpdGVfaW5kZXg7CiAJdTMyIGN0cmxfYWRkciA9IHBpcGUtPmN0cmxfYWRkcjsKKwl1MzIgY3VyX3dyaXRlX2lkeCA9IGF0aDEwa19jZV9kZXN0X3Jpbmdfd3JpdGVfaW5kZXhfZ2V0KGFyLCBjdHJsX2FkZHIpOworCisJLyogUHJldmVudCBDRSByaW5nIHN0dWNrIGlzc3VlIHRoYXQgd2lsbCBvY2N1ciB3aGVuIHJpbmcgaXMgZnVsbC4KKwkgKiBNYWtlIHN1cmUgdGhhdCB3cml0ZSBpbmRleCBpcyAxIGxlc3MgdGhhbiByZWFkIGluZGV4LgorCSAqLworCWlmICgoY3VyX3dyaXRlX2lkeCArIG5lbnRyaWVzKSAgPT0gZGVzdF9yaW5nLT5zd19pbmRleCkKKwkJbmVudHJpZXMgLT0gMTsKIAogCXdyaXRlX2luZGV4ID0gQ0VfUklOR19JRFhfQUREKG5lbnRyaWVzX21hc2ssIHdyaXRlX2luZGV4LCBuZW50cmllcyk7CiAJYXRoMTBrX2NlX2Rlc3RfcmluZ193cml0ZV9pbmRleF9zZXQoYXIsIGN0cmxfYWRkciwgd3JpdGVfaW5kZXgpOwpAQCAtODQwLDcgKzg0Nyw3IEBACiAJYXRoMTBrX2NlX3NyY19yaW5nX2hpZ2htYXJrX3NldChhciwgY3RybF9hZGRyLCBuZW50cmllcyk7CiAKIAlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0JPT1QsCi0JCSAgICJib290IGluaXQgY2Ugc3JjIHJpbmcgaWQgJWQgZW50cmllcyAlZCBiYXNlX2FkZHIgJXBcbiIsCisJCSAgICJib290IGluaXQgY2Ugc3JjIHJpbmcgaWQgJWQgZW50cmllcyAlZCBiYXNlX2FkZHIgJXBLXG4iLAogCQkgICBjZV9pZCwgbmVudHJpZXMsIHNyY19yaW5nLT5iYXNlX2FkZHJfb3duZXJfc3BhY2UpOwogCiAJcmV0dXJuIDA7CkBAIC04NzQsNyArODgxLDcgQEAKIAlhdGgxMGtfY2VfZGVzdF9yaW5nX2hpZ2htYXJrX3NldChhciwgY3RybF9hZGRyLCBuZW50cmllcyk7CiAKIAlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0JPT1QsCi0JCSAgICJib290IGNlIGRlc3QgcmluZyBpZCAlZCBlbnRyaWVzICVkIGJhc2VfYWRkciAlcFxuIiwKKwkJICAgImJvb3QgY2UgZGVzdCByaW5nIGlkICVkIGVudHJpZXMgJWQgYmFzZV9hZGRyICVwS1xuIiwKIAkJICAgY2VfaWQsIG5lbnRyaWVzLCBkZXN0X3JpbmctPmJhc2VfYWRkcl9vd25lcl9zcGFjZSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvY29yZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9jb3JlLmMKaW5kZXggZTg4OTgyOS4uMjFhZThkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9jb3JlLmMKQEAgLTYwLDcgKzYwLDYgQEAKIAkJLm90cF9leGVfcGFyYW0gPSAwLAogCQkuY2hhbm5lbF9jb3VudGVyc19mcmVxX2h6ID0gODgwMDAsCiAJCS5tYXhfcHJvYmVfcmVzcF9kZXNjX3RocmVzID0gMCwKLQkJLmh3XzRhZGRyX3BhZCA9IEFUSDEwS19IV180QUREUl9QQURfQUZURVIsCiAJCS5jYWxfZGF0YV9sZW4gPSAyMTE2LAogCQkuZncgPSB7CiAJCQkuZGlyID0gUUNBOTg4WF9IV18yXzBfRldfRElSLApAQCAtNjgsNiArNjcsOCBAQAogCQkJLmJvYXJkX3NpemUgPSBRQ0E5ODhYX0JPQVJEX0RBVEFfU1osCiAJCQkuYm9hcmRfZXh0X3NpemUgPSBRQ0E5ODhYX0JPQVJEX0VYVF9EQVRBX1NaLAogCQl9LAorCQkuaHdfb3BzID0gJnFjYTk4OHhfb3BzLAorCQkuZGVjYXBfYWxpZ25fYnl0ZXMgPSA0LAogCX0sCiAJewogCQkuaWQgPSBRQ0E5ODg3X0hXXzFfMF9WRVJTSU9OLApAQCAtNzksNyArODAsNiBAQAogCQkub3RwX2V4ZV9wYXJhbSA9IDAsCiAJCS5jaGFubmVsX2NvdW50ZXJzX2ZyZXFfaHogPSA4ODAwMCwKIAkJLm1heF9wcm9iZV9yZXNwX2Rlc2NfdGhyZXMgPSAwLAotCQkuaHdfNGFkZHJfcGFkID0gQVRIMTBLX0hXXzRBRERSX1BBRF9BRlRFUiwKIAkJLmNhbF9kYXRhX2xlbiA9IDIxMTYsCiAJCS5mdyA9IHsKIAkJCS5kaXIgPSBRQ0E5ODg3X0hXXzFfMF9GV19ESVIsCkBAIC04Nyw2ICs4Nyw4IEBACiAJCQkuYm9hcmRfc2l6ZSA9IFFDQTk4ODdfQk9BUkRfREFUQV9TWiwKIAkJCS5ib2FyZF9leHRfc2l6ZSA9IFFDQTk4ODdfQk9BUkRfRVhUX0RBVEFfU1osCiAJCX0sCisJCS5od19vcHMgPSAmcWNhOTg4eF9vcHMsCisJCS5kZWNhcF9hbGlnbl9ieXRlcyA9IDQsCiAJfSwKIAl7CiAJCS5pZCA9IFFDQTYxNzRfSFdfMl8xX1ZFUlNJT04sCkBAIC0xMDQsNiArMTA2LDggQEAKIAkJCS5ib2FyZF9zaXplID0gUUNBNjE3NF9CT0FSRF9EQVRBX1NaLAogCQkJLmJvYXJkX2V4dF9zaXplID0gUUNBNjE3NF9CT0FSRF9FWFRfREFUQV9TWiwKIAkJfSwKKwkJLmh3X29wcyA9ICZxY2E5ODh4X29wcywKKwkJLmRlY2FwX2FsaWduX2J5dGVzID0gNCwKIAl9LAogCXsKIAkJLmlkID0gUUNBNjE3NF9IV18yXzFfVkVSU0lPTiwKQEAgLTExNCw3ICsxMTgsNiBAQAogCQkub3RwX2V4ZV9wYXJhbSA9IDAsCiAJCS5jaGFubmVsX2NvdW50ZXJzX2ZyZXFfaHogPSA4ODAwMCwKIAkJLm1heF9wcm9iZV9yZXNwX2Rlc2NfdGhyZXMgPSAwLAotCQkuaHdfNGFkZHJfcGFkID0gQVRIMTBLX0hXXzRBRERSX1BBRF9BRlRFUiwKIAkJLmNhbF9kYXRhX2xlbiA9IDgxMjQsCiAJCS5mdyA9IHsKIAkJCS5kaXIgPSBRQ0E2MTc0X0hXXzJfMV9GV19ESVIsCkBAIC0xMjIsNiArMTI1LDggQEAKIAkJCS5ib2FyZF9zaXplID0gUUNBNjE3NF9CT0FSRF9EQVRBX1NaLAogCQkJLmJvYXJkX2V4dF9zaXplID0gUUNBNjE3NF9CT0FSRF9FWFRfREFUQV9TWiwKIAkJfSwKKwkJLmh3X29wcyA9ICZxY2E5ODh4X29wcywKKwkJLmRlY2FwX2FsaWduX2J5dGVzID0gNCwKIAl9LAogCXsKIAkJLmlkID0gUUNBNjE3NF9IV18zXzBfVkVSU0lPTiwKQEAgLTEzMiw3ICsxMzcsNiBAQAogCQkub3RwX2V4ZV9wYXJhbSA9IDAsCiAJCS5jaGFubmVsX2NvdW50ZXJzX2ZyZXFfaHogPSA4ODAwMCwKIAkJLm1heF9wcm9iZV9yZXNwX2Rlc2NfdGhyZXMgPSAwLAotCQkuaHdfNGFkZHJfcGFkID0gQVRIMTBLX0hXXzRBRERSX1BBRF9BRlRFUiwKIAkJLmNhbF9kYXRhX2xlbiA9IDgxMjQsCiAJCS5mdyA9IHsKIAkJCS5kaXIgPSBRQ0E2MTc0X0hXXzNfMF9GV19ESVIsCkBAIC0xNDAsNiArMTQ0LDggQEAKIAkJCS5ib2FyZF9zaXplID0gUUNBNjE3NF9CT0FSRF9EQVRBX1NaLAogCQkJLmJvYXJkX2V4dF9zaXplID0gUUNBNjE3NF9CT0FSRF9FWFRfREFUQV9TWiwKIAkJfSwKKwkJLmh3X29wcyA9ICZxY2E5ODh4X29wcywKKwkJLmRlY2FwX2FsaWduX2J5dGVzID0gNCwKIAl9LAogCXsKIAkJLmlkID0gUUNBNjE3NF9IV18zXzJfVkVSU0lPTiwKQEAgLTE1MCw3ICsxNTYsNiBAQAogCQkub3RwX2V4ZV9wYXJhbSA9IDAsCiAJCS5jaGFubmVsX2NvdW50ZXJzX2ZyZXFfaHogPSA4ODAwMCwKIAkJLm1heF9wcm9iZV9yZXNwX2Rlc2NfdGhyZXMgPSAwLAotCQkuaHdfNGFkZHJfcGFkID0gQVRIMTBLX0hXXzRBRERSX1BBRF9BRlRFUiwKIAkJLmNhbF9kYXRhX2xlbiA9IDgxMjQsCiAJCS5mdyA9IHsKIAkJCS8qIHVzZXMgc2FtZSBiaW5hcmllcyBhcyBodzMuMCAqLwpAQCAtMTU5LDYgKzE2NCw4IEBACiAJCQkuYm9hcmRfc2l6ZSA9IFFDQTYxNzRfQk9BUkRfREFUQV9TWiwKIAkJCS5ib2FyZF9leHRfc2l6ZSA9IFFDQTYxNzRfQk9BUkRfRVhUX0RBVEFfU1osCiAJCX0sCisJCS5od19vcHMgPSAmcWNhOTg4eF9vcHMsCisJCS5kZWNhcF9hbGlnbl9ieXRlcyA9IDQsCiAJfSwKIAl7CiAJCS5pZCA9IFFDQTk5WDBfSFdfMl8wX0RFVl9WRVJTSU9OLApAQCAtMTcxLDcgKzE3OCw2IEBACiAJCS5jY2tfcmF0ZV9tYXBfcmV2MiA9IHRydWUsCiAJCS5jaGFubmVsX2NvdW50ZXJzX2ZyZXFfaHogPSAxNTAwMDAsCiAJCS5tYXhfcHJvYmVfcmVzcF9kZXNjX3RocmVzID0gMjQsCi0JCS5od180YWRkcl9wYWQgPSBBVEgxMEtfSFdfNEFERFJfUEFEX0JFRk9SRSwKIAkJLnR4X2NoYWluX21hc2sgPSAweGYsCiAJCS5yeF9jaGFpbl9tYXNrID0gMHhmLAogCQkubWF4X3NwYXRpYWxfc3RyZWFtID0gNCwKQEAgLTE4Miw2ICsxODgsOSBAQAogCQkJLmJvYXJkX3NpemUgPSBRQ0E5OVgwX0JPQVJEX0RBVEFfU1osCiAJCQkuYm9hcmRfZXh0X3NpemUgPSBRQ0E5OVgwX0JPQVJEX0VYVF9EQVRBX1NaLAogCQl9LAorCQkuc3dfZGVjcnlwdF9tY2FzdF9tZ210ID0gdHJ1ZSwKKwkJLmh3X29wcyA9ICZxY2E5OXgwX29wcywKKwkJLmRlY2FwX2FsaWduX2J5dGVzID0gMSwKIAl9LAogCXsKIAkJLmlkID0gUUNBOTk4NF9IV18xXzBfREVWX1ZFUlNJT04sCkBAIC0xOTQsNyArMjAzLDYgQEAKIAkJLmNja19yYXRlX21hcF9yZXYyID0gdHJ1ZSwKIAkJLmNoYW5uZWxfY291bnRlcnNfZnJlcV9oeiA9IDE1MDAwMCwKIAkJLm1heF9wcm9iZV9yZXNwX2Rlc2NfdGhyZXMgPSAyNCwKLQkJLmh3XzRhZGRyX3BhZCA9IEFUSDEwS19IV180QUREUl9QQURfQkVGT1JFLAogCQkudHhfY2hhaW5fbWFzayA9IDB4ZiwKIAkJLnJ4X2NoYWluX21hc2sgPSAweGYsCiAJCS5tYXhfc3BhdGlhbF9zdHJlYW0gPSA0LApAQCAtMjA1LDYgKzIxMyw5IEBACiAJCQkuYm9hcmRfc2l6ZSA9IFFDQTk5WDBfQk9BUkRfREFUQV9TWiwKIAkJCS5ib2FyZF9leHRfc2l6ZSA9IFFDQTk5WDBfQk9BUkRfRVhUX0RBVEFfU1osCiAJCX0sCisJCS5zd19kZWNyeXB0X21jYXN0X21nbXQgPSB0cnVlLAorCQkuaHdfb3BzID0gJnFjYTk5eDBfb3BzLAorCQkuZGVjYXBfYWxpZ25fYnl0ZXMgPSAxLAogCX0sCiAJewogCQkuaWQgPSBRQ0E5ODg4X0hXXzJfMF9ERVZfVkVSU0lPTiwKQEAgLTIxNiw3ICsyMjcsNiBAQAogCQkuY29udGludW91c19mcmFnX2Rlc2MgPSB0cnVlLAogCQkuY2hhbm5lbF9jb3VudGVyc19mcmVxX2h6ID0gMTUwMDAwLAogCQkubWF4X3Byb2JlX3Jlc3BfZGVzY190aHJlcyA9IDI0LAotCQkuaHdfNGFkZHJfcGFkID0gQVRIMTBLX0hXXzRBRERSX1BBRF9CRUZPUkUsCiAJCS50eF9jaGFpbl9tYXNrID0gMywKIAkJLnJ4X2NoYWluX21hc2sgPSAzLAogCQkubWF4X3NwYXRpYWxfc3RyZWFtID0gMiwKQEAgLTIyNyw2ICsyMzcsOSBAQAogCQkJLmJvYXJkX3NpemUgPSBRQ0E5OVgwX0JPQVJEX0RBVEFfU1osCiAJCQkuYm9hcmRfZXh0X3NpemUgPSBRQ0E5OVgwX0JPQVJEX0VYVF9EQVRBX1NaLAogCQl9LAorCQkuc3dfZGVjcnlwdF9tY2FzdF9tZ210ID0gdHJ1ZSwKKwkJLmh3X29wcyA9ICZxY2E5OXgwX29wcywKKwkJLmRlY2FwX2FsaWduX2J5dGVzID0gMSwKIAl9LAogCXsKIAkJLmlkID0gUUNBOTM3N19IV18xXzBfREVWX1ZFUlNJT04sCkBAIC0yNDQsNiArMjU3LDggQEAKIAkJCS5ib2FyZF9zaXplID0gUUNBOTM3N19CT0FSRF9EQVRBX1NaLAogCQkJLmJvYXJkX2V4dF9zaXplID0gUUNBOTM3N19CT0FSRF9FWFRfREFUQV9TWiwKIAkJfSwKKwkJLmh3X29wcyA9ICZxY2E5ODh4X29wcywKKwkJLmRlY2FwX2FsaWduX2J5dGVzID0gNCwKIAl9LAogCXsKIAkJLmlkID0gUUNBOTM3N19IV18xXzFfREVWX1ZFUlNJT04sCkBAIC0yNjEsNiArMjc2LDggQEAKIAkJCS5ib2FyZF9zaXplID0gUUNBOTM3N19CT0FSRF9EQVRBX1NaLAogCQkJLmJvYXJkX2V4dF9zaXplID0gUUNBOTM3N19CT0FSRF9FWFRfREFUQV9TWiwKIAkJfSwKKwkJLmh3X29wcyA9ICZxY2E5ODh4X29wcywKKwkJLmRlY2FwX2FsaWduX2J5dGVzID0gNCwKIAl9LAogCXsKIAkJLmlkID0gUUNBNDAxOV9IV18xXzBfREVWX1ZFUlNJT04sCkBAIC0yNzQsNyArMjkxLDYgQEAKIAkJLmNja19yYXRlX21hcF9yZXYyID0gdHJ1ZSwKIAkJLmNoYW5uZWxfY291bnRlcnNfZnJlcV9oeiA9IDEyNTAwMCwKIAkJLm1heF9wcm9iZV9yZXNwX2Rlc2NfdGhyZXMgPSAyNCwKLQkJLmh3XzRhZGRyX3BhZCA9IEFUSDEwS19IV180QUREUl9QQURfQkVGT1JFLAogCQkudHhfY2hhaW5fbWFzayA9IDB4MywKIAkJLnJ4X2NoYWluX21hc2sgPSAweDMsCiAJCS5tYXhfc3BhdGlhbF9zdHJlYW0gPSAyLApAQCAtMjg1LDYgKzMwMSw5IEBACiAJCQkuYm9hcmRfc2l6ZSA9IFFDQTQwMTlfQk9BUkRfREFUQV9TWiwKIAkJCS5ib2FyZF9leHRfc2l6ZSA9IFFDQTQwMTlfQk9BUkRfRVhUX0RBVEFfU1osCiAJCX0sCisJCS5zd19kZWNyeXB0X21jYXN0X21nbXQgPSB0cnVlLAorCQkuaHdfb3BzID0gJnFjYTk5eDBfb3BzLAorCQkuZGVjYXBfYWxpZ25fYnl0ZXMgPSAxLAogCX0sCiB9OwogCkBAIC0zMDQsNiArMzIzLDcgQEAKIAlbQVRIMTBLX0ZXX0ZFQVRVUkVfTUZQX1NVUFBPUlRdID0gIm1mcCIsCiAJW0FUSDEwS19GV19GRUFUVVJFX1BFRVJfRkxPV19DT05UUk9MXSA9ICJwZWVyLWZsb3ctY3RybCIsCiAJW0FUSDEwS19GV19GRUFUVVJFX0JUQ09FWF9QQVJBTV0gPSAiYnRjb2V4LXBhcmFtIiwKKwlbQVRIMTBLX0ZXX0ZFQVRVUkVfU0tJUF9OVUxMX0ZVTkNfV0FSXSA9ICJza2lwLW51bGwtZnVuYy13YXIiLAogfTsKIAogc3RhdGljIHVuc2lnbmVkIGludCBhdGgxMGtfY29yZV9nZXRfZndfZmVhdHVyZV9zdHIoY2hhciAqYnVmLApAQCAtNjk5LDcgKzcxOSw3IEBACiAKIAlpZiAoIWFyLT5ydW5uaW5nX2Z3LT5md19maWxlLm90cF9kYXRhIHx8CiAJICAgICFhci0+cnVubmluZ19mdy0+ZndfZmlsZS5vdHBfbGVuKSB7Ci0JCWF0aDEwa193YXJuKGFyLCAiTm90IHJ1bm5pbmcgb3RwLCBjYWxpYnJhdGlvbiB3aWxsIGJlIGluY29ycmVjdCAob3RwLWRhdGEgJXAgb3RwX2xlbiAlemQpIVxuIiwKKwkJYXRoMTBrX3dhcm4oYXIsICJOb3QgcnVubmluZyBvdHAsIGNhbGlicmF0aW9uIHdpbGwgYmUgaW5jb3JyZWN0IChvdHAtZGF0YSAlcEsgb3RwX2xlbiAlemQpIVxuIiwKIAkJCSAgICBhci0+cnVubmluZ19mdy0+ZndfZmlsZS5vdHBfZGF0YSwKIAkJCSAgICBhci0+cnVubmluZ19mdy0+ZndfZmlsZS5vdHBfbGVuKTsKIAkJcmV0dXJuIDA7CkBAIC03NDUsNyArNzY1LDcgQEAKIAlkYXRhID0gYXItPnJ1bm5pbmdfZnctPmZ3X2ZpbGUuZmlybXdhcmVfZGF0YTsKIAlkYXRhX2xlbiA9IGFyLT5ydW5uaW5nX2Z3LT5md19maWxlLmZpcm13YXJlX2xlbjsKIAotCXJldCA9IGF0aDEwa19zd2FwX2NvZGVfc2VnX2NvbmZpZ3VyZShhcik7CisJcmV0ID0gYXRoMTBrX3N3YXBfY29kZV9zZWdfY29uZmlndXJlKGFyLCAmYXItPnJ1bm5pbmdfZnctPmZ3X2ZpbGUpOwogCWlmIChyZXQpIHsKIAkJYXRoMTBrX2VycihhciwgImZhaWxlZCB0byBjb25maWd1cmUgZncgY29kZSBzd2FwOiAlZFxuIiwKIAkJCSAgIHJldCk7CkBAIC03NTMsNyArNzczLDcgQEAKIAl9CiAKIAlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0JPT1QsCi0JCSAgICJib290IHVwbG9hZGluZyBmaXJtd2FyZSBpbWFnZSAlcCBsZW4gJWRcbiIsCisJCSAgICJib290IHVwbG9hZGluZyBmaXJtd2FyZSBpbWFnZSAlcEsgbGVuICVkXG4iLAogCQkgICBkYXRhLCBkYXRhX2xlbik7CiAKIAlyZXQgPSBhdGgxMGtfYm1pX2Zhc3RfZG93bmxvYWQoYXIsIGFkZHJlc3MsIGRhdGEsIGRhdGFfbGVuKTsKQEAgLTc4Nyw3ICs4MDcsNyBAQAogCWlmICghSVNfRVJSKGFyLT5wcmVfY2FsX2ZpbGUpKQogCQlyZWxlYXNlX2Zpcm13YXJlKGFyLT5wcmVfY2FsX2ZpbGUpOwogCi0JYXRoMTBrX3N3YXBfY29kZV9zZWdfcmVsZWFzZShhcik7CisJYXRoMTBrX3N3YXBfY29kZV9zZWdfcmVsZWFzZShhciwgJmFyLT5ub3JtYWxfbW9kZV9mdy5md19maWxlKTsKIAogCWFyLT5ub3JtYWxfbW9kZV9mdy5md19maWxlLm90cF9kYXRhID0gTlVMTDsKIAlhci0+bm9ybWFsX21vZGVfZncuZndfZmlsZS5vdHBfbGVuID0gMDsKQEAgLTE0OTcsMTQgKzE1MTcsMTQgQEAKIAogCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhhci0+aHcpOwogCWF0aDEwa19kcmFpbl90eChhcik7Ci0JY29tcGxldGVfYWxsKCZhci0+c2Nhbi5zdGFydGVkKTsKLQljb21wbGV0ZV9hbGwoJmFyLT5zY2FuLmNvbXBsZXRlZCk7Ci0JY29tcGxldGVfYWxsKCZhci0+c2Nhbi5vbl9jaGFubmVsKTsKLQljb21wbGV0ZV9hbGwoJmFyLT5vZmZjaGFuX3R4X2NvbXBsZXRlZCk7Ci0JY29tcGxldGVfYWxsKCZhci0+aW5zdGFsbF9rZXlfZG9uZSk7Ci0JY29tcGxldGVfYWxsKCZhci0+dmRldl9zZXR1cF9kb25lKTsKLQljb21wbGV0ZV9hbGwoJmFyLT50aGVybWFsLndtaV9zeW5jKTsKLQljb21wbGV0ZV9hbGwoJmFyLT5ic3Nfc3VydmV5X2RvbmUpOworCWNvbXBsZXRlKCZhci0+c2Nhbi5zdGFydGVkKTsKKwljb21wbGV0ZSgmYXItPnNjYW4uY29tcGxldGVkKTsKKwljb21wbGV0ZSgmYXItPnNjYW4ub25fY2hhbm5lbCk7CisJY29tcGxldGUoJmFyLT5vZmZjaGFuX3R4X2NvbXBsZXRlZCk7CisJY29tcGxldGUoJmFyLT5pbnN0YWxsX2tleV9kb25lKTsKKwljb21wbGV0ZSgmYXItPnZkZXZfc2V0dXBfZG9uZSk7CisJY29tcGxldGUoJmFyLT50aGVybWFsLndtaV9zeW5jKTsKKwljb21wbGV0ZSgmYXItPmJzc19zdXJ2ZXlfZG9uZSk7CiAJd2FrZV91cCgmYXItPmh0dC5lbXB0eV90eF93cSk7CiAJd2FrZV91cCgmYXItPndtaS50eF9jcmVkaXRzX3dxKTsKIAl3YWtlX3VwKCZhci0+cGVlcl9tYXBwaW5nX3dxKTsKQEAgLTE3MDUsNiArMTcyNSw1NSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGF0aDEwa19jb3JlX3Jlc2V0X3J4X2ZpbHRlcihzdHJ1Y3QgYXRoMTBrICphcikKK3sKKwlpbnQgcmV0OworCWludCB2ZGV2X2lkOworCWludCB2ZGV2X3R5cGU7CisJaW50IHZkZXZfc3VidHlwZTsKKwljb25zdCB1OCAqdmRldl9hZGRyOworCisJdmRldl9pZCA9IDA7CisJdmRldl90eXBlID0gV01JX1ZERVZfVFlQRV9TVEE7CisJdmRldl9zdWJ0eXBlID0gYXRoMTBrX3dtaV9nZXRfdmRldl9zdWJ0eXBlKGFyLCBXTUlfVkRFVl9TVUJUWVBFX05PTkUpOworCXZkZXZfYWRkciA9IGFyLT5tYWNfYWRkcjsKKworCXJldCA9IGF0aDEwa193bWlfdmRldl9jcmVhdGUoYXIsIHZkZXZfaWQsIHZkZXZfdHlwZSwgdmRldl9zdWJ0eXBlLAorCQkJCSAgICAgdmRldl9hZGRyKTsKKwlpZiAocmV0KSB7CisJCWF0aDEwa19lcnIoYXIsICJmYWlsZWQgdG8gY3JlYXRlIGR1bW15IHZkZXY6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGF0aDEwa193bWlfdmRldl9kZWxldGUoYXIsIHZkZXZfaWQpOworCWlmIChyZXQpIHsKKwkJYXRoMTBrX2VycihhciwgImZhaWxlZCB0byBkZWxldGUgZHVtbXkgdmRldjogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogV01JIGFuZCBIVFQgbWF5IHVzZSBzZXBhcmF0ZSBISUYgcGlwZXMgYW5kIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZQorCSAqIHNlcmlhbGl6ZWQgcHJvcGVybHkgaW1wbGljaXRseS4KKwkgKgorCSAqIE1vcmVvdmVyIChtb3N0KSBXTUkgY29tbWFuZHMgaGF2ZSBubyBleHBsaWNpdCBhY2tub3dsZWRnZXMuIEl0IGlzCisJICogcG9zc2libGUgdG8gaW5mZXIgaXQgaW1wbGljaXRseSBieSBwb2tpbmcgZmlybXdhcmUgd2l0aCBlY2hvCisJICogY29tbWFuZCAtIGdldHRpbmcgYSByZXBseSBtZWFucyBhbGwgcHJlY2VkaW5nIGNvbW1lbnRzIGhhdmUgYmVlbgorCSAqIChtb3N0bHkpIHByb2Nlc3NlZC4KKwkgKgorCSAqIEluIGNhc2Ugb2YgdmRldiBjcmVhdGUvZGVsZXRlIHRoaXMgaXMgc3VmZmljaWVudC4KKwkgKgorCSAqIFdpdGhvdXQgdGhpcyBpdCdzIHBvc3NpYmxlIHRvIGVuZCB1cCB3aXRoIGEgcmFjZSB3aGVuIEhUVCBSeCByaW5nIGlzCisJICogc3RhcnRlZCBiZWZvcmUgdmRldiBjcmVhdGUvZGVsZXRlIGhhY2sgaXMgY29tcGxldGUgYWxsb3dpbmcgYSBzaG9ydAorCSAqIHdpbmRvdyBvZiBvcHBvcnR1bml0eSB0byByZWNlaXZlIChhbmQgVHggQUNLKSBhIGJ1bmNoIG9mIGZyYW1lcy4KKwkgKi8KKwlyZXQgPSBhdGgxMGtfd21pX2JhcnJpZXIoYXIpOworCWlmIChyZXQpIHsKKwkJYXRoMTBrX2VycihhciwgImZhaWxlZCB0byBwaW5nIGZpcm13YXJlOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogaW50IGF0aDEwa19jb3JlX3N0YXJ0KHN0cnVjdCBhdGgxMGsgKmFyLCBlbnVtIGF0aDEwa19maXJtd2FyZV9tb2RlIG1vZGUsCiAJCSAgICAgIGNvbnN0IHN0cnVjdCBhdGgxMGtfZndfY29tcG9uZW50cyAqZncpCiB7CkBAIC0xODcyLDYgKzE5NDEsMjUgQEAKIAkJZ290byBlcnJfaGlmX3N0b3A7CiAJfQogCisJLyogU29tZSBmaXJtd2FyZSByZXZpc2lvbnMgZG8gbm90IHByb3Blcmx5IHNldCB1cCBoYXJkd2FyZSByeCBmaWx0ZXIKKwkgKiByZWdpc3RlcnMuCisJICoKKwkgKiBBIGtub3duIGV4YW1wbGUgZnJvbSBRQ0E5ODgwIGFuZCAxMC4yLjQgaXMgdGhhdCBNQUNfUENVX0FERFIxX01BU0sKKwkgKiBpcyBmaWxsZWQgd2l0aCAwcyBpbnN0ZWFkIG9mIDFzIGFsbG93aW5nIEhXIHRvIHJlc3BvbmQgd2l0aCBBQ0tzIHRvCisJICogYW55IGZyYW1lcyB0aGF0IG1hdGNoZXMgTUFDX1BDVV9SWF9GSUxURVIgd2hpY2ggaXMgYWxzbworCSAqIG1pc2NvbmZpZ3VyZWQgdG8gYWNjZXB0IGFueXRoaW5nLgorCSAqCisJICogVGhlIEFERFIxIGlzIHByb2dyYW1tZWQgdXNpbmcgaW50ZXJuYWwgZmlybXdhcmUgc3RydWN0dXJlIGZpZWxkIGFuZAorCSAqIGNhbid0IGJlIChlYXNpbHkvc2FuZWx5KSByZWFjaGVkIGZyb20gdGhlIGRyaXZlciBleHBsaWNpdGx5LiBJdCBpcworCSAqIHBvc3NpYmxlIHRvIGltcGxpY2l0bHkgbWFrZSBpdCBjb3JyZWN0IGJ5IGNyZWF0aW5nIGEgZHVtbXkgdmRldiBhbmQKKwkgKiB0aGVuIGRlbGV0aW5nIGl0LgorCSAqLworCXN0YXR1cyA9IGF0aDEwa19jb3JlX3Jlc2V0X3J4X2ZpbHRlcihhcik7CisJaWYgKHN0YXR1cykgeworCQlhdGgxMGtfZXJyKGFyLCAiZmFpbGVkIHRvIHJlc2V0IHJ4IGZpbHRlcjogJWRcbiIsIHN0YXR1cyk7CisJCWdvdG8gZXJyX2hpZl9zdG9wOworCX0KKwogCS8qIElmIGZpcm13YXJlIGluZGljYXRlcyBGdWxsIFJ4IFJlb3JkZXIgc3VwcG9ydCBpdCBtdXN0IGJlIHVzZWQgaW4gYQogCSAqIHNsaWdodGx5IGRpZmZlcmVudCBtYW5uZXIuIExldCBIVFQgY29kZSBrbm93LgogCSAqLwpAQCAtMTg4NCw3ICsxOTcyLDEwIEBACiAJCWdvdG8gZXJyX2hpZl9zdG9wOwogCX0KIAotCWFyLT5mcmVlX3ZkZXZfbWFwID0gKDFMTCA8PCBhci0+bWF4X251bV92ZGV2cykgLSAxOworCWlmIChhci0+bWF4X251bV92ZGV2cyA+PSA2NCkKKwkJYXItPmZyZWVfdmRldl9tYXAgPSAweEZGRkZGRkZGRkZGRkZGRkZMTDsKKwllbHNlCisJCWFyLT5mcmVlX3ZkZXZfbWFwID0gKDFMTCA8PCBhci0+bWF4X251bV92ZGV2cykgLSAxOwogCiAJSU5JVF9MSVNUX0hFQUQoJmFyLT5hcnZpZnMpOwogCkBAIC0yMDMxLDcgKzIxMjIsNyBAQAogCQlnb3RvIGVycl9mcmVlX2Zpcm13YXJlX2ZpbGVzOwogCX0KIAotCXJldCA9IGF0aDEwa19zd2FwX2NvZGVfc2VnX2luaXQoYXIpOworCXJldCA9IGF0aDEwa19zd2FwX2NvZGVfc2VnX2luaXQoYXIsICZhci0+bm9ybWFsX21vZGVfZncuZndfZmlsZSk7CiAJaWYgKHJldCkgewogCQlhdGgxMGtfZXJyKGFyLCAiZmFpbGVkIHRvIGluaXRpYWxpemUgY29kZSBzd2FwIHNlZ21lbnQ6ICVkXG4iLAogCQkJICAgcmV0KTsKQEAgLTIwNzIsNiArMjE2Myw5IEBACiAJc3RydWN0IGF0aDEwayAqYXIgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0aDEwaywgcmVnaXN0ZXJfd29yayk7CiAJaW50IHN0YXR1czsKIAorCS8qIHBlZXIgc3RhdHMgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdCAqLworCXNldF9iaXQoQVRIMTBLX0ZMQUdfUEVFUl9TVEFUUywgJmFyLT5kZXZfZmxhZ3MpOworCiAJc3RhdHVzID0gYXRoMTBrX2NvcmVfcHJvYmVfZncoYXIpOwogCWlmIChzdGF0dXMpIHsKIAkJYXRoMTBrX2VycihhciwgImNvdWxkIG5vdCBwcm9iZSBmdyAoJWQpXG4iLCBzdGF0dXMpOwpAQCAtMjI0OSw2ICsyMzQzLDggQEAKIAlJTklUX1dPUksoJmFyLT5yZWdpc3Rlcl93b3JrLCBhdGgxMGtfY29yZV9yZWdpc3Rlcl93b3JrKTsKIAlJTklUX1dPUksoJmFyLT5yZXN0YXJ0X3dvcmssIGF0aDEwa19jb3JlX3Jlc3RhcnQpOwogCisJaW5pdF9kdW1teV9uZXRkZXYoJmFyLT5uYXBpX2Rldik7CisKIAlyZXQgPSBhdGgxMGtfZGVidWdfY3JlYXRlKGFyKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycl9mcmVlX2F1eF93cTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvY29yZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9jb3JlLmgKaW5kZXggMzBhZTViZi4uZGRhNDlhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9jb3JlLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9jb3JlLmgKQEAgLTY1LDYgKzY1LDEwIEBACiAjZGVmaW5lIEFUSDEwS19LRUVQQUxJVkVfTUFYX0lETEUgMzg5NQogI2RlZmluZSBBVEgxMEtfS0VFUEFMSVZFX01BWF9VTlJFU1BPTlNJVkUgMzkwMAogCisvKiBOQVBJIHBvbGwgYnVkZ2V0ICovCisjZGVmaW5lIEFUSDEwS19OQVBJX0JVREdFVCAgICAgIDY0CisjZGVmaW5lIEFUSDEwS19OQVBJX1FVT1RBX0xJTUlUIDYwCisKIHN0cnVjdCBhdGgxMGs7CiAKIGVudW0gYXRoMTBrX2J1cyB7CkBAIC0xNDIsNiArMTQ2LDcgQEAKIAllbnVtIGF0aDEwa19odGNfZXBfaWQgZWlkOwogCXN0cnVjdCBjb21wbGV0aW9uIHNlcnZpY2VfcmVhZHk7CiAJc3RydWN0IGNvbXBsZXRpb24gdW5pZmllZF9yZWFkeTsKKwlzdHJ1Y3QgY29tcGxldGlvbiBiYXJyaWVyOwogCXdhaXRfcXVldWVfaGVhZF90IHR4X2NyZWRpdHNfd3E7CiAJREVDTEFSRV9CSVRNQVAoc3ZjX21hcCwgV01JX1NFUlZJQ0VfTUFYKTsKIAlzdHJ1Y3Qgd21pX2NtZF9tYXAgKmNtZDsKQEAgLTE5NiwxMCArMjAxLDEwIEBACiAKIAkvKiBQREVWIHN0YXRzICovCiAJczMyIGNoX25vaXNlX2Zsb29yOwotCXUzMiB0eF9mcmFtZV9jb3VudDsKLQl1MzIgcnhfZnJhbWVfY291bnQ7Ci0JdTMyIHJ4X2NsZWFyX2NvdW50OwotCXUzMiBjeWNsZV9jb3VudDsKKwl1MzIgdHhfZnJhbWVfY291bnQ7IC8qIEN5Y2xlcyBzcGVudCB0cmFuc21pdHRpbmcgZnJhbWVzICovCisJdTMyIHJ4X2ZyYW1lX2NvdW50OyAvKiBDeWNsZXMgc3BlbnQgcmVjZWl2aW5nIGZyYW1lcyAqLworCXUzMiByeF9jbGVhcl9jb3VudDsgLyogVG90YWwgY2hhbm5lbCBidXN5IHRpbWUsIGV2aWRlbnRseSAqLworCXUzMiBjeWNsZV9jb3VudDsgLyogVG90YWwgb24tY2hhbm5lbCB0aW1lICovCiAJdTMyIHBoeV9lcnJfY291bnQ7CiAJdTMyIGNoYW5fdHhfcG93ZXI7CiAJdTMyIGFja19yeF9iYWQ7CkBAIC00NDAsNyArNDQ1LDcgQEAKIAlzdHJ1Y3QgY29tcGxldGlvbiB0cGNfY29tcGxldGU7CiAKIAkvKiBwcm90ZWN0ZWQgYnkgY29uZl9tdXRleCAqLwotCXUzMiBmd19kYmdsb2dfbWFzazsKKwl1NjQgZndfZGJnbG9nX21hc2s7CiAJdTMyIGZ3X2RiZ2xvZ19sZXZlbDsKIAl1MzIgcGt0bG9nX2ZpbHRlcjsKIAl1MzIgcmVnX2FkZHI7CkBAIC01NTEsNiArNTU2LDEzIEBACiAJICovCiAJQVRIMTBLX0ZXX0ZFQVRVUkVfQlRDT0VYX1BBUkFNID0gMTQsCiAKKwkvKiBPbGRlciBmaXJtd2FyZSB3aXRoIEhUVCBkZWxpdmVycyBpbmNvcnJlY3QgdHggc3RhdHVzIGZvciBudWxsIGZ1bmMKKwkgKiBmcmFtZXMgdG8gZHJpdmVyLCBidXQgdGhpcyBmaXhlZCBpbiAxMC4yIGFuZCAxMC40IGZpcm13YXJlIHZlcnNpb25zLgorCSAqIEFsc28gdGhpcyB3b3JrYXJvdW5kIHJlc3VsdHMgaW4gcmVwb3J0aW5nIG9mIGluY29ycmVjdCBudWxsIGZ1bmMKKwkgKiBzdGF0dXMgZm9yIDEwLjQuIFRoaXMgZmxhZyBpcyB1c2VkIHRvIHNraXAgdGhlIHdvcmthcm91bmQuCisJICovCisJQVRIMTBLX0ZXX0ZFQVRVUkVfU0tJUF9OVUxMX0ZVTkNfV0FSID0gMTUsCisKIAkvKiBrZWVwIGxhc3QgKi8KIAlBVEgxMEtfRldfRkVBVFVSRV9DT1VOVCwKIH07CkBAIC02NjMsNiArNjc1LDE1IEBACiAKIAljb25zdCB2b2lkICpjb2Rlc3dhcF9kYXRhOwogCXNpemVfdCBjb2Rlc3dhcF9sZW47CisKKwkvKiBUaGUgb3JpZ2luYWwgaWRlYSBvZiBzdHJ1Y3QgYXRoMTBrX2Z3X2ZpbGUgd2FzIHRoYXQgaXQgb25seQorCSAqIGNvbnRhaW5zIHN0cnVjdCBmaXJtd2FyZSBhbmQgcG9pbnRlcnMgdG8gdmFyaW91cyBwYXJ0cyAoYWN0dWFsCisJICogZmlybXdhcmUgYmluYXJ5LCBvdHAsIG1ldGFkYXRhIGV0Yykgb2YgdGhlIGZpbGUuIFRoaXMgc2VnX2luZm8KKwkgKiBpcyBhY3R1YWxseSBjcmVhdGVkIHNlcGFyYXRlIGJ1dCBhcyB0aGlzIGlzIHVzZWQgc2ltaWxhcmx5IGFzCisJICogdGhlIG90aGVyIGZpcm13YXJlIGNvbXBvbmVudHMgaXQncyBtb3JlIGNvbnZlbmllbnQgdG8gaGF2ZSBpdAorCSAqIGhlcmUuCisJICovCisJc3RydWN0IGF0aDEwa19zd2FwX2NvZGVfc2VnX2luZm8gKmZpcm13YXJlX3N3YXBfY29kZV9zZWdfaW5mbzsKIH07CiAKIHN0cnVjdCBhdGgxMGtfZndfY29tcG9uZW50cyB7CkBAIC03MTUsNTMgKzczNiw3IEBACiAJc3RydWN0IGF0aDEwa19odGMgaHRjOwogCXN0cnVjdCBhdGgxMGtfaHR0IGh0dDsKIAotCXN0cnVjdCBhdGgxMGtfaHdfcGFyYW1zIHsKLQkJdTMyIGlkOwotCQl1MTYgZGV2X2lkOwotCQljb25zdCBjaGFyICpuYW1lOwotCQl1MzIgcGF0Y2hfbG9hZF9hZGRyOwotCQlpbnQgdWFydF9waW47Ci0JCXUzMiBvdHBfZXhlX3BhcmFtOwotCi0JCS8qIFR5cGUgb2YgaHcgY3ljbGUgY291bnRlciB3cmFwYXJvdW5kIGxvZ2ljLCBmb3IgbW9yZSBpbmZvCi0JCSAqIHJlZmVyIGVudW0gYXRoMTBrX2h3X2NjX3dyYXBhcm91bmRfdHlwZS4KLQkJICovCi0JCWVudW0gYXRoMTBrX2h3X2NjX3dyYXBhcm91bmRfdHlwZSBjY193cmFwYXJvdW5kX3R5cGU7Ci0KLQkJLyogU29tZSBvZiBjaGlwIGV4cGVjdHMgZnJhZ21lbnQgZGVzY3JpcHRvciB0byBiZSBjb250aW51b3VzCi0JCSAqIG1lbW9yeSBmb3IgYW55IFRYIG9wZXJhdGlvbi4gU2V0IGNvbnRpbnVvdXNfZnJhZ19kZXNjIGZsYWcKLQkJICogZm9yIHRoZSBoYXJkd2FyZSB3aGljaCBoYXZlIHN1Y2ggcmVxdWlyZW1lbnQuCi0JCSAqLwotCQlib29sIGNvbnRpbnVvdXNfZnJhZ19kZXNjOwotCi0JCS8qIENDSyBoYXJkd2FyZSByYXRlIHRhYmxlIG1hcHBpbmcgZm9yIHRoZSBuZXdlciBjaGlwc2V0cwotCQkgKiBsaWtlIFFDQTk5WDAsIFFDQTQwMTkgZ290IHJldmlzZWQuIFRoZSBDQ0sgaC93IHJhdGUgdmFsdWVzCi0JCSAqIGFyZSBpbiBhIHByb3BlciBvcmRlciB3aXRoIHJlc3BlY3QgdG8gdGhlIHJhdGUvcHJlYW1ibGUKLQkJICovCi0JCWJvb2wgY2NrX3JhdGVfbWFwX3JldjI7Ci0KLQkJdTMyIGNoYW5uZWxfY291bnRlcnNfZnJlcV9oejsKLQotCQkvKiBNZ210IHR4IGRlc2NyaXB0b3JzIHRocmVzaG9sZCBmb3IgbGltaXRpbmcgcHJvYmUgcmVzcG9uc2UKLQkJICogZnJhbWVzLgotCQkgKi8KLQkJdTMyIG1heF9wcm9iZV9yZXNwX2Rlc2NfdGhyZXM7Ci0KLQkJLyogVGhlIHBhZGRpbmcgYnl0ZXMncyBsb2NhdGlvbiBpcyBkaWZmZXJlbnQgb24gdmFyaW91cyBjaGlwcyAqLwotCQllbnVtIGF0aDEwa19od180YWRkcl9wYWQgaHdfNGFkZHJfcGFkOwotCi0JCXUzMiB0eF9jaGFpbl9tYXNrOwotCQl1MzIgcnhfY2hhaW5fbWFzazsKLQkJdTMyIG1heF9zcGF0aWFsX3N0cmVhbTsKLQkJdTMyIGNhbF9kYXRhX2xlbjsKLQotCQlzdHJ1Y3QgYXRoMTBrX2h3X3BhcmFtc19mdyB7Ci0JCQljb25zdCBjaGFyICpkaXI7Ci0JCQljb25zdCBjaGFyICpib2FyZDsKLQkJCXNpemVfdCBib2FyZF9zaXplOwotCQkJc2l6ZV90IGJvYXJkX2V4dF9zaXplOwotCQl9IGZ3OwotCX0gaHdfcGFyYW1zOworCXN0cnVjdCBhdGgxMGtfaHdfcGFyYW1zIGh3X3BhcmFtczsKIAogCS8qIGNvbnRhaW5zIHRoZSBmaXJtd2FyZSBpbWFnZXMgdXNlZCB3aXRoIEFUSDEwS19GSVJNV0FSRV9NT0RFX05PUk1BTCAqLwogCXN0cnVjdCBhdGgxMGtfZndfY29tcG9uZW50cyBub3JtYWxfbW9kZV9mdzsKQEAgLTc3NSwxMCArNzUwLDYgQEAKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmNhbF9maWxlOwogCiAJc3RydWN0IHsKLQkJc3RydWN0IGF0aDEwa19zd2FwX2NvZGVfc2VnX2luZm8gKmZpcm13YXJlX3N3YXBfY29kZV9zZWdfaW5mbzsKLQl9IHN3YXA7Ci0KLQlzdHJ1Y3QgewogCQl1MzIgdmVuZG9yOwogCQl1MzIgZGV2aWNlOwogCQl1MzIgc3Vic3lzdGVtX3ZlbmRvcjsKQEAgLTkzNiw2ICs5MDcsMTAgQEAKIAlzdHJ1Y3QgYXRoMTBrX3RoZXJtYWwgdGhlcm1hbDsKIAlzdHJ1Y3QgYXRoMTBrX3dvdyB3b3c7CiAKKwkvKiBOQVBJICovCisJc3RydWN0IG5ldF9kZXZpY2UgbmFwaV9kZXY7CisJc3RydWN0IG5hcGlfc3RydWN0IG5hcGk7CisKIAkvKiBtdXN0IGJlIGxhc3QgKi8KIAl1OCBkcnZfcHJpdlswXSBfX2FsaWduZWQoc2l6ZW9mKHZvaWQgKikpOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvZGVidWcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvZGVidWcuYwppbmRleCA4ZjBmZDQxLi44MzJkYTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2RlYnVnLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9kZWJ1Zy5jCkBAIC0xMjI4LDkgKzEyMjgsOSBAQAogewogCXN0cnVjdCBhdGgxMGsgKmFyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXVuc2lnbmVkIGludCBsZW47Ci0JY2hhciBidWZbNjRdOworCWNoYXIgYnVmWzk2XTsKIAotCWxlbiA9IHNjbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiMHglMDh4ICV1XG4iLAorCWxlbiA9IHNjbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiMHglMTZsbHggJXVcbiIsCiAJCQlhci0+ZGVidWcuZndfZGJnbG9nX21hc2ssIGFyLT5kZWJ1Zy5md19kYmdsb2dfbGV2ZWwpOwogCiAJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBsZW4pOwpAQCAtMTI0MiwxNSArMTI0MiwxNiBAQAogewogCXN0cnVjdCBhdGgxMGsgKmFyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWludCByZXQ7Ci0JY2hhciBidWZbNjRdOwotCXVuc2lnbmVkIGludCBsb2dfbGV2ZWwsIG1hc2s7CisJY2hhciBidWZbOTZdOworCXVuc2lnbmVkIGludCBsb2dfbGV2ZWw7CisJdTY0IG1hc2s7CiAKIAlzaW1wbGVfd3JpdGVfdG9fYnVmZmVyKGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxLCBwcG9zLCB1c2VyX2J1ZiwgY291bnQpOwogCiAJLyogbWFrZSBzdXJlIHRoYXQgYnVmIGlzIG51bGwgdGVybWluYXRlZCAqLwogCWJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMDsKIAotCXJldCA9IHNzY2FuZihidWYsICIleCAldSIsICZtYXNrLCAmbG9nX2xldmVsKTsKKwlyZXQgPSBzc2NhbmYoYnVmLCAiJWxseCAldSIsICZtYXNrLCAmbG9nX2xldmVsKTsKIAogCWlmICghcmV0KQogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHRjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h0Yy5jCmluZGV4IDViM2M2YmMuLjE3NWFhZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHRjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9odGMuYwpAQCAtNDQsNyArNDQsNyBAQAogCXNrYl9jYiA9IEFUSDEwS19TS0JfQ0Ioc2tiKTsKIAltZW1zZXQoc2tiX2NiLCAwLCBzaXplb2YoKnNrYl9jYikpOwogCi0JYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19IVEMsICIlczogc2tiICVwXG4iLCBfX2Z1bmNfXywgc2tiKTsKKwlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0hUQywgIiVzOiBza2IgJXBLXG4iLCBfX2Z1bmNfXywgc2tiKTsKIAlyZXR1cm4gc2tiOwogfQogCkBAIC02Miw3ICs2Miw3IEBACiB7CiAJc3RydWN0IGF0aDEwayAqYXIgPSBlcC0+aHRjLT5hcjsKIAotCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfSFRDLCAiJXM6IGVwICVkIHNrYiAlcFxuIiwgX19mdW5jX18sCisJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19IVEMsICIlczogZXAgJWQgc2tiICVwS1xuIiwgX19mdW5jX18sCiAJCSAgIGVwLT5laWQsIHNrYik7CiAKIAlhdGgxMGtfaHRjX3Jlc3RvcmVfdHhfc2tiKGVwLT5odGMsIHNrYik7CkBAIC00MDQsNyArNDA0LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19IVEMsICJodGMgcnggY29tcGxldGlvbiBlcCAlZCBza2IgJXBcbiIsCisJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19IVEMsICJodGMgcnggY29tcGxldGlvbiBlcCAlZCBza2IgJXBLXG4iLAogCQkgICBlaWQsIHNrYik7CiAJZXAtPmVwX29wcy5lcF9yeF9jb21wbGV0ZShhciwgc2tiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9odHQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHR0LmgKaW5kZXggNDMwYTgzZS4uMGQyZWQwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9odHQuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h0dC5oCkBAIC01OTUsNyArNTk1LDcgQEAKIAkvKiBvbmx5IGFjY2VwdCBFQVBPTCBmcmFtZXMgKi8KIAlIVFRfUlhfSU5EX01QRFVfU1RBVFVTX1VOQVVUSF9QRUVSLAogCUhUVF9SWF9JTkRfTVBEVV9TVEFUVVNfT1VUX09GX1NZTkMsCi0JLyogTm9uLWRhdGEgaW4gcHJvbWlzY291cyBtb2RlICovCisJLyogTm9uLWRhdGEgaW4gcHJvbWlzY3VvdXMgbW9kZSAqLwogCUhUVF9SWF9JTkRfTVBEVV9TVEFUVVNfTUdNVF9DVFJMLAogCUhUVF9SWF9JTkRfTVBEVV9TVEFUVVNfVEtJUF9NSUNfRVJSLAogCUhUVF9SWF9JTkRfTVBEVV9TVEFUVVNfREVDUllQVF9FUlIsCkBAIC05MDAsNyArOTAwLDcgQEAKICAqICAgICBQdXJwb3NlOiBpbmRpY2F0ZSBob3cgbWFueSAzMi1iaXQgaW50ZWdlcnMgZm9sbG93IHRoZSBtZXNzYWdlIGhlYWRlcgogICogICAtIE5VTV9DSEFSUwogICogICAgIEJpdHMgMzE6MTYKLSAqICAgICBQdXJwb3NlOiBpbmRpY2F0ZSBob3cgbWFueSA4LWJpdCBjaGFyYXRlcnMgZm9sbG93IHRoZSBzZXJpZXMgb2YgaW50ZWdlcnMKKyAqICAgICBQdXJwb3NlOiBpbmRpY2F0ZSBob3cgbWFueSA4LWJpdCBjaGFyYWN0ZXJzIGZvbGxvdyB0aGUgc2VyaWVzIG9mIGludGVnZXJzCiAgKi8KIHN0cnVjdCBodHRfcnhfdGVzdCB7CiAJdTggbnVtX2ludHM7CkBAIC0xMDQyLDEwICsxMDQyLDEwIEBACiAJLyogaWxsZWdhbCByYXRlIHBoeSBlcnJvcnMgICovCiAJX19sZTMyIGlsbGdsX3JhdGVfcGh5X2VycjsKIAotCS8qIHdhbCBwZGV2IGNvbnRpbm91cyB4cmV0cnkgKi8KKwkvKiB3YWwgcGRldiBjb250aW51b3VzIHhyZXRyeSAqLwogCV9fbGUzMiBwZGV2X2NvbnRfeHJldHJ5OwogCi0JLyogd2FsIHBkZXYgY29udGlub3VzIHhyZXRyeSAqLworCS8qIHdhbCBwZGV2IGNvbnRpbnVvdXMgeHJldHJ5ICovCiAJX19sZTMyIHBkZXZfdHhfdGltZW91dDsKIAogCS8qIHdhbCBwZGV2IHJlc2V0cyAgKi8KQEAgLTE2NjUsNyArMTY2NSw2IEBACiAKIAkvKiBUaGlzIGlzIHVzZWQgdG8gZ3JvdXAgdHgvcnggY29tcGxldGlvbnMgc2VwYXJhdGVseSBhbmQgcHJvY2VzcyB0aGVtCiAJICogaW4gYmF0Y2hlcyB0byByZWR1Y2UgY2FjaGUgc3RhbGxzICovCi0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IHR4cnhfY29tcGxfdGFzazsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHJ4X2NvbXBsX3E7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCByeF9pbl9vcmRfY29tcGxfcTsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHR4X2ZldGNoX2luZF9xOwpAQCAtMTc5OCw1ICsxNzk3LDYgQEAKIAkJICBzdHJ1Y3Qgc2tfYnVmZiAqbXNkdSk7CiB2b2lkIGF0aDEwa19odHRfcnhfcGt0bG9nX2NvbXBsZXRpb25faGFuZGxlcihzdHJ1Y3QgYXRoMTBrICphciwKIAkJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2ludCBhdGgxMGtfaHR0X3R4cnhfY29tcGxfdGFzayhzdHJ1Y3QgYXRoMTBrICphciwgaW50IGJ1ZGdldCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9odHRfcnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHR0X3J4LmMKaW5kZXggNzhkYjVkNi4uMGI0YzE1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9odHRfcnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h0dF9yeC5jCkBAIC0zNCw3ICszNCw2IEBACiAjZGVmaW5lIEhUVF9SWF9SSU5HX1JFRklMTF9SRVNDSEVEX01TIDUKIAogc3RhdGljIGludCBhdGgxMGtfaHR0X3J4X2dldF9jc3VtX3N0YXRlKHN0cnVjdCBza19idWZmICpza2IpOwotc3RhdGljIHZvaWQgYXRoMTBrX2h0dF90eHJ4X2NvbXBsX3Rhc2sodW5zaWduZWQgbG9uZyBwdHIpOwogCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgogYXRoMTBrX2h0dF9yeF9maW5kX3NrYl9wYWRkcihzdHJ1Y3QgYXRoMTBrICphciwgdTMyIHBhZGRyKQpAQCAtMjI2LDcgKzIyNSw2IEBACiB2b2lkIGF0aDEwa19odHRfcnhfZnJlZShzdHJ1Y3QgYXRoMTBrX2h0dCAqaHR0KQogewogCWRlbF90aW1lcl9zeW5jKCZodHQtPnJ4X3JpbmcucmVmaWxsX3JldHJ5X3RpbWVyKTsKLQl0YXNrbGV0X2tpbGwoJmh0dC0+dHhyeF9jb21wbF90YXNrKTsKIAogCXNrYl9xdWV1ZV9wdXJnZSgmaHR0LT5yeF9jb21wbF9xKTsKIAlza2JfcXVldWVfcHVyZ2UoJmh0dC0+cnhfaW5fb3JkX2NvbXBsX3EpOwpAQCAtNTIwLDkgKzUxOCw2IEBACiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmaHR0LT50eF9mZXRjaF9pbmRfcSk7CiAJYXRvbWljX3NldCgmaHR0LT5udW1fbXBkdXNfcmVhZHksIDApOwogCi0JdGFza2xldF9pbml0KCZodHQtPnR4cnhfY29tcGxfdGFzaywgYXRoMTBrX2h0dF90eHJ4X2NvbXBsX3Rhc2ssCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpaHR0KTsKLQogCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfQk9PVCwgImh0dCByeCByaW5nIHNpemUgJWQgZmlsbF9sZXZlbCAlZFxuIiwKIAkJICAgaHR0LT5yeF9yaW5nLnNpemUsIGh0dC0+cnhfcmluZy5maWxsX2xldmVsKTsKIAlyZXR1cm4gMDsKQEAgLTkzMSw3ICs5MjYsNyBAQAogCSpzdGF0dXMgPSAqcnhfc3RhdHVzOwogCiAJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19EQVRBLAotCQkgICAicnggc2tiICVwIGxlbiAldSBwZWVyICVwTSAlcyAlcyBzbiAldSAlcyVzJXMlcyVzICVzcmF0ZV9pZHggJXUgdmh0X25zcyAldSBmcmVxICV1IGJhbmQgJXUgZmxhZyAweCVsbHggZmNzLWVyciAlaSBtaWMtZXJyICVpIGFtc2R1LW1vcmUgJWlcbiIsCisJCSAgICJyeCBza2IgJXBLIGxlbiAldSBwZWVyICVwTSAlcyAlcyBzbiAldSAlcyVzJXMlcyVzICVzcmF0ZV9pZHggJXUgdmh0X25zcyAldSBmcmVxICV1IGJhbmQgJXUgZmxhZyAweCVsbHggZmNzLWVyciAlaSBtaWMtZXJyICVpIGFtc2R1LW1vcmUgJWlcbiIsCiAJCSAgIHNrYiwKIAkJICAgc2tiLT5sZW4sCiAJCSAgIGllZWU4MDIxMV9nZXRfU0EoaGRyKSwKQEAgLTk1OCw3ICs5NTMsNyBAQAogCXRyYWNlX2F0aDEwa19yeF9oZHIoYXIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwogCXRyYWNlX2F0aDEwa19yeF9wYXlsb2FkKGFyLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAotCWllZWU4MDIxMV9yeChhci0+aHcsIHNrYik7CisJaWVlZTgwMjExX3J4X25hcGkoYXItPmh3LCBOVUxMLCBza2IsICZhci0+bmFwaSk7CiB9CiAKIHN0YXRpYyBpbnQgYXRoMTBrX2h0dF9yeF9ud2lmaV9oZHJsZW4oc3RydWN0IGF0aDEwayAqYXIsCkBAIC0xMDU2LDkgKzEwNTEsMTEgQEAKIAkJCQkJICBjb25zdCB1OCBmaXJzdF9oZHJbNjRdKQogewogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisJc3RydWN0IGh0dF9yeF9kZXNjICpyeGQ7CiAJc2l6ZV90IGhkcl9sZW47CiAJdTggZGFbRVRIX0FMRU5dOwogCXU4IHNhW0VUSF9BTEVOXTsKKwlpbnQgbDNfcGFkX2J5dGVzOwogCiAJLyogRGVsaXZlcmVkIGRlY2FwcGVkIGZyYW1lOgogCSAqIFtud2lmaSA4MDIuMTEgaGVhZGVyXSA8LS0gcmVwbGFjZWQgd2l0aCA4MDIuMTEgaGRyCkBAIC0xMDcyLDE5ICsxMDY5LDEyIEBACiAJICovCiAKIAkvKiBwdWxsIGRlY2FwcGVkIGhlYWRlciBhbmQgY29weSBTQSAmIERBICovCi0JaWYgKChhci0+aHdfcGFyYW1zLmh3XzRhZGRyX3BhZCA9PSBBVEgxMEtfSFdfNEFERFJfUEFEX0JFRk9SRSkgJiYKLQkgICAgaWVlZTgwMjExX2hhc19hNCgoKHN0cnVjdCBpZWVlODAyMTFfaGRyICopZmlyc3RfaGRyKS0+ZnJhbWVfY29udHJvbCkpIHsKLQkJLyogVGhlIFFDQTk5WDAgNCBhZGRyZXNzIG1vZGUgcGFkIDIgYnl0ZXMgYXQgdGhlCi0JCSAqIGJlZ2lubmluZyBvZiBNU0RVCi0JCSAqLwotCQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikobXNkdS0+ZGF0YSArIDIpOwotCQkvKiBUaGUgc2tiIGxlbmd0aCBuZWVkIGJlIGV4dGVuZGVkIDIgYXMgdGhlIDIgYnl0ZXMgYXQgdGhlIHRhaWwKLQkJICogYmUgZXhjbHVkZWQgZHVlIHRvIHRoZSBwYWRkaW5nCi0JCSAqLwotCQlza2JfcHV0KG1zZHUsIDIpOwotCX0gZWxzZSB7Ci0JCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKShtc2R1LT5kYXRhKTsKLQl9CisJcnhkID0gKHZvaWQgKiltc2R1LT5kYXRhIC0gc2l6ZW9mKCpyeGQpOworCisJbDNfcGFkX2J5dGVzID0gYXRoMTBrX3J4X2Rlc2NfZ2V0X2wzX3BhZF9ieXRlcygmYXItPmh3X3BhcmFtcywgcnhkKTsKKwlza2JfcHV0KG1zZHUsIGwzX3BhZF9ieXRlcyk7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikobXNkdS0+ZGF0YSArIGwzX3BhZF9ieXRlcyk7CiAKIAloZHJfbGVuID0gYXRoMTBrX2h0dF9yeF9ud2lmaV9oZHJsZW4oYXIsIGhkcik7CiAJZXRoZXJfYWRkcl9jb3B5KGRhLCBpZWVlODAyMTFfZ2V0X0RBKGhkcikpOwpAQCAtMTExMyw2ICsxMTAzLDcgQEAKIAlzaXplX3QgaGRyX2xlbiwgY3J5cHRvX2xlbjsKIAl2b2lkICpyZmMxMDQyOwogCWJvb2wgaXNfZmlyc3QsIGlzX2xhc3QsIGlzX2Ftc2R1OworCWludCBieXRlc19hbGlnbmVkID0gYXItPmh3X3BhcmFtcy5kZWNhcF9hbGlnbl9ieXRlczsKIAogCXJ4ZCA9ICh2b2lkICopbXNkdS0+ZGF0YSAtIHNpemVvZigqcnhkKTsKIAloZHIgPSAodm9pZCAqKXJ4ZC0+cnhfaGRyX3N0YXR1czsKQEAgLTExMjksOCArMTEyMCw4IEBACiAJCWhkcl9sZW4gPSBpZWVlODAyMTFfaGRybGVuKGhkci0+ZnJhbWVfY29udHJvbCk7CiAJCWNyeXB0b19sZW4gPSBhdGgxMGtfaHR0X3J4X2NyeXB0b19wYXJhbV9sZW4oYXIsIGVuY3R5cGUpOwogCi0JCXJmYzEwNDIgKz0gcm91bmRfdXAoaGRyX2xlbiwgNCkgKwotCQkJICAgcm91bmRfdXAoY3J5cHRvX2xlbiwgNCk7CisJCXJmYzEwNDIgKz0gcm91bmRfdXAoaGRyX2xlbiwgYnl0ZXNfYWxpZ25lZCkgKworCQkJICAgcm91bmRfdXAoY3J5cHRvX2xlbiwgYnl0ZXNfYWxpZ25lZCk7CiAJfQogCiAJaWYgKGlzX2Ftc2R1KQpAQCAtMTE1MSw2ICsxMTQyLDggQEAKIAl2b2lkICpyZmMxMDQyOwogCXU4IGRhW0VUSF9BTEVOXTsKIAl1OCBzYVtFVEhfQUxFTl07CisJaW50IGwzX3BhZF9ieXRlczsKKwlzdHJ1Y3QgaHR0X3J4X2Rlc2MgKnJ4ZDsKIAogCS8qIERlbGl2ZXJlZCBkZWNhcHBlZCBmcmFtZToKIAkgKiBbZXRoIGhlYWRlcl0gPC0tIHJlcGxhY2VkIHdpdGggODAyLjExIGhkciAmIHJmYzEwNDIvbGxjCkBAIC0xMTYxLDYgKzExNTQsMTEgQEAKIAlpZiAoV0FSTl9PTl9PTkNFKCFyZmMxMDQyKSkKIAkJcmV0dXJuOwogCisJcnhkID0gKHZvaWQgKiltc2R1LT5kYXRhIC0gc2l6ZW9mKCpyeGQpOworCWwzX3BhZF9ieXRlcyA9IGF0aDEwa19yeF9kZXNjX2dldF9sM19wYWRfYnl0ZXMoJmFyLT5od19wYXJhbXMsIHJ4ZCk7CisJc2tiX3B1dChtc2R1LCBsM19wYWRfYnl0ZXMpOworCXNrYl9wdWxsKG1zZHUsIGwzX3BhZF9ieXRlcyk7CisKIAkvKiBwdWxsIGRlY2FwcGVkIGhlYWRlciBhbmQgY29weSBTQSAmIERBICovCiAJZXRoID0gKHN0cnVjdCBldGhoZHIgKiltc2R1LT5kYXRhOwogCWV0aGVyX2FkZHJfY29weShkYSwgZXRoLT5oX2Rlc3QpOwpAQCAtMTE5MSw2ICsxMTg5LDggQEAKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOwogCXNpemVfdCBoZHJfbGVuOworCWludCBsM19wYWRfYnl0ZXM7CisJc3RydWN0IGh0dF9yeF9kZXNjICpyeGQ7CiAKIAkvKiBEZWxpdmVyZWQgZGVjYXBwZWQgZnJhbWU6CiAJICogW2Ftc2R1IGhlYWRlcl0gPC0tIHJlcGxhY2VkIHdpdGggODAyLjExIGhkcgpAQCAtMTE5OCw3ICsxMTk4LDExIEBACiAJICogW3BheWxvYWRdCiAJICovCiAKLQlza2JfcHVsbChtc2R1LCBzaXplb2Yoc3RydWN0IGFtc2R1X3N1YmZyYW1lX2hkcikpOworCXJ4ZCA9ICh2b2lkICopbXNkdS0+ZGF0YSAtIHNpemVvZigqcnhkKTsKKwlsM19wYWRfYnl0ZXMgPSBhdGgxMGtfcnhfZGVzY19nZXRfbDNfcGFkX2J5dGVzKCZhci0+aHdfcGFyYW1zLCByeGQpOworCisJc2tiX3B1dChtc2R1LCBsM19wYWRfYnl0ZXMpOworCXNrYl9wdWxsKG1zZHUsIHNpemVvZihzdHJ1Y3QgYW1zZHVfc3ViZnJhbWVfaGRyKSArIGwzX3BhZF9ieXRlcyk7CiAKIAloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilmaXJzdF9oZHI7CiAJaGRyX2xlbiA9IGllZWU4MDIxMV9oZHJsZW4oaGRyLT5mcmFtZV9jb250cm9sKTsKQEAgLTE1MjUsOSArMTUyOSw5IEBACiBzdGF0aWMgaW50IGF0aDEwa19odHRfcnhfaGFuZGxlX2Ftc2R1KHN0cnVjdCBhdGgxMGtfaHR0ICpodHQpCiB7CiAJc3RydWN0IGF0aDEwayAqYXIgPSBodHQtPmFyOwotCXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyByeF9zdGF0dXM7CisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXR1cyA9ICZodHQtPnJ4X3N0YXR1czsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGFtc2R1OwotCWludCByZXQ7CisJaW50IHJldCwgbnVtX21zZHVzOwogCiAJX19za2JfcXVldWVfaGVhZF9pbml0KCZhbXNkdSk7CiAKQEAgLTE1NDksMTMgKzE1NTMsMTQgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlhdGgxMGtfaHR0X3J4X2hfcHBkdShhciwgJmFtc2R1LCAmcnhfc3RhdHVzLCAweGZmZmYpOworCW51bV9tc2R1cyA9IHNrYl9xdWV1ZV9sZW4oJmFtc2R1KTsKKwlhdGgxMGtfaHR0X3J4X2hfcHBkdShhciwgJmFtc2R1LCByeF9zdGF0dXMsIDB4ZmZmZik7CiAJYXRoMTBrX2h0dF9yeF9oX3VuY2hhaW4oYXIsICZhbXNkdSwgcmV0ID4gMCk7Ci0JYXRoMTBrX2h0dF9yeF9oX2ZpbHRlcihhciwgJmFtc2R1LCAmcnhfc3RhdHVzKTsKLQlhdGgxMGtfaHR0X3J4X2hfbXBkdShhciwgJmFtc2R1LCAmcnhfc3RhdHVzKTsKLQlhdGgxMGtfaHR0X3J4X2hfZGVsaXZlcihhciwgJmFtc2R1LCAmcnhfc3RhdHVzKTsKKwlhdGgxMGtfaHR0X3J4X2hfZmlsdGVyKGFyLCAmYW1zZHUsIHJ4X3N0YXR1cyk7CisJYXRoMTBrX2h0dF9yeF9oX21wZHUoYXIsICZhbXNkdSwgcnhfc3RhdHVzKTsKKwlhdGgxMGtfaHR0X3J4X2hfZGVsaXZlcihhciwgJmFtc2R1LCByeF9zdGF0dXMpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIG51bV9tc2R1czsKIH0KIAogc3RhdGljIHZvaWQgYXRoMTBrX2h0dF9yeF9wcm9jX3J4X2luZChzdHJ1Y3QgYXRoMTBrX2h0dCAqaHR0LApAQCAtMTU3OSwxNSArMTU4NCw2IEBACiAJCW1wZHVfY291bnQgKz0gbXBkdV9yYW5nZXNbaV0ubXBkdV9jb3VudDsKIAogCWF0b21pY19hZGQobXBkdV9jb3VudCwgJmh0dC0+bnVtX21wZHVzX3JlYWR5KTsKLQotCXRhc2tsZXRfc2NoZWR1bGUoJmh0dC0+dHhyeF9jb21wbF90YXNrKTsKLX0KLQotc3RhdGljIHZvaWQgYXRoMTBrX2h0dF9yeF9mcmFnX2hhbmRsZXIoc3RydWN0IGF0aDEwa19odHQgKmh0dCkKLXsKLQlhdG9taWNfaW5jKCZodHQtPm51bV9tcGR1c19yZWFkeSk7Ci0KLQl0YXNrbGV0X3NjaGVkdWxlKCZodHQtPnR4cnhfY29tcGxfdGFzayk7CiB9CiAKIHN0YXRpYyB2b2lkIGF0aDEwa19odHRfcnhfdHhfY29tcGxfaW5kKHN0cnVjdCBhdGgxMGsgKmFyLApAQCAtMTc3MiwxNCArMTc2OCwxNSBAQAogCQkJUlhfRkxBR19NTUlDX1NUUklQUEVEOwogfQogCi1zdGF0aWMgdm9pZCBhdGgxMGtfaHR0X3J4X2hfcnhfb2ZmbG9hZChzdHJ1Y3QgYXRoMTBrICphciwKLQkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCkKK3N0YXRpYyBpbnQgYXRoMTBrX2h0dF9yeF9oX3J4X29mZmxvYWQoc3RydWN0IGF0aDEwayAqYXIsCisJCQkJICAgICAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCkKIHsKIAlzdHJ1Y3QgYXRoMTBrX2h0dCAqaHR0ID0gJmFyLT5odHQ7CiAJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXR1cyA9ICZodHQtPnJ4X3N0YXR1czsKIAlzdHJ1Y3QgaHR0X3J4X29mZmxvYWRfbXNkdSAqcng7CiAJc3RydWN0IHNrX2J1ZmYgKm1zZHU7CiAJc2l6ZV90IG9mZnNldDsKKwlpbnQgbnVtX21zZHUgPSAwOwogCiAJd2hpbGUgKChtc2R1ID0gX19za2JfZGVxdWV1ZShsaXN0KSkpIHsKIAkJLyogT2ZmbG9hZGVkIGZyYW1lcyBkb24ndCBoYXZlIFJ4IGRlc2NyaXB0b3IuIEluc3RlYWQgdGhleSBoYXZlCkBAIC0xODE5LDEwICsxODE2LDEyIEBACiAJCWF0aDEwa19odHRfcnhfaF9yeF9vZmZsb2FkX3Byb3Qoc3RhdHVzLCBtc2R1KTsKIAkJYXRoMTBrX2h0dF9yeF9oX2NoYW5uZWwoYXIsIHN0YXR1cywgTlVMTCwgcngtPnZkZXZfaWQpOwogCQlhdGgxMGtfcHJvY2Vzc19yeChhciwgc3RhdHVzLCBtc2R1KTsKKwkJbnVtX21zZHUrKzsKIAl9CisJcmV0dXJuIG51bV9tc2R1OwogfQogCi1zdGF0aWMgdm9pZCBhdGgxMGtfaHR0X3J4X2luX29yZF9pbmQoc3RydWN0IGF0aDEwayAqYXIsIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW50IGF0aDEwa19odHRfcnhfaW5fb3JkX2luZChzdHJ1Y3QgYXRoMTBrICphciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgYXRoMTBrX2h0dCAqaHR0ID0gJmFyLT5odHQ7CiAJc3RydWN0IGh0dF9yZXNwICpyZXNwID0gKHZvaWQgKilza2ItPmRhdGE7CkBAIC0xODM1LDEyICsxODM0LDEyIEBACiAJdTggdGlkOwogCWJvb2wgb2ZmbG9hZDsKIAlib29sIGZyYWc7Ci0JaW50IHJldDsKKwlpbnQgcmV0LCBudW1fbXNkdXMgPSAwOwogCiAJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaHR0LT5yeF9yaW5nLmxvY2spOwogCiAJaWYgKGh0dC0+cnhfY29uZnVzZWQpCi0JCXJldHVybjsKKwkJcmV0dXJuIC1FSU87CiAKIAlza2JfcHVsbChza2IsIHNpemVvZihyZXNwLT5oZHIpKTsKIAlza2JfcHVsbChza2IsIHNpemVvZihyZXNwLT5yeF9pbl9vcmRfaW5kKSk7CkBAIC0xODU5LDcgKzE4NTgsNyBAQAogCiAJaWYgKHNrYi0+bGVuIDwgbXNkdV9jb3VudCAqIHNpemVvZigqcmVzcC0+cnhfaW5fb3JkX2luZC5tc2R1X2Rlc2NzKSkgewogCQlhdGgxMGtfd2FybihhciwgImRyb3BwaW5nIGludmFsaWQgaW4gb3JkZXIgcnggaW5kaWNhdGlvblxuIik7Ci0JCXJldHVybjsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogVGhlIGV2ZW50IGNhbiBkZWxpdmVyIG1vcmUgdGhhbiAxIEEtTVNEVS4gRWFjaCBBLU1TRFUgaXMgbGF0ZXIKQEAgLTE4NzAsMTQgKzE4NjksMTQgQEAKIAlpZiAocmV0IDwgMCkgewogCQlhdGgxMGtfd2FybihhciwgImZhaWxlZCB0byBwb3AgcGFkZHIgbGlzdDogJWRcbiIsIHJldCk7CiAJCWh0dC0+cnhfY29uZnVzZWQgPSB0cnVlOwotCQlyZXR1cm47CisJCXJldHVybiAtRUlPOwogCX0KIAogCS8qIE9mZmxvYWRlZCBmcmFtZXMgYXJlIHZlcnkgZGlmZmVyZW50IGFuZCBuZWVkIHRvIGJlIGhhbmRsZWQKIAkgKiBzZXBhcmF0ZWx5LgogCSAqLwogCWlmIChvZmZsb2FkKQotCQlhdGgxMGtfaHR0X3J4X2hfcnhfb2ZmbG9hZChhciwgJmxpc3QpOworCQludW1fbXNkdXMgPSBhdGgxMGtfaHR0X3J4X2hfcnhfb2ZmbG9hZChhciwgJmxpc3QpOwogCiAJd2hpbGUgKCFza2JfcXVldWVfZW1wdHkoJmxpc3QpKSB7CiAJCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmYW1zZHUpOwpAQCAtMTg5MCw2ICsxODg5LDcgQEAKIAkJCSAqIGJldHRlciB0byByZXBvcnQgc29tZXRoaW5nIHRoYW4gbm90aGluZyB0aG91Z2guIFRoaXMKIAkJCSAqIHNob3VsZCBzdGlsbCBnaXZlIGFuIGlkZWEgYWJvdXQgcnggcmF0ZSB0byB0aGUgdXNlci4KIAkJCSAqLworCQkJbnVtX21zZHVzICs9IHNrYl9xdWV1ZV9sZW4oJmFtc2R1KTsKIAkJCWF0aDEwa19odHRfcnhfaF9wcGR1KGFyLCAmYW1zZHUsIHN0YXR1cywgdmRldl9pZCk7CiAJCQlhdGgxMGtfaHR0X3J4X2hfZmlsdGVyKGFyLCAmYW1zZHUsIHN0YXR1cyk7CiAJCQlhdGgxMGtfaHR0X3J4X2hfbXBkdShhciwgJmFtc2R1LCBzdGF0dXMpOwpAQCAtMTkwMiw5ICsxOTAyLDEwIEBACiAJCQlhdGgxMGtfd2FybihhciwgImZhaWxlZCB0byBleHRyYWN0IGFtc2R1OiAlZFxuIiwgcmV0KTsKIAkJCWh0dC0+cnhfY29uZnVzZWQgPSB0cnVlOwogCQkJX19za2JfcXVldWVfcHVyZ2UoJmxpc3QpOwotCQkJcmV0dXJuOworCQkJcmV0dXJuIC1FSU87CiAJCX0KIAl9CisJcmV0dXJuIG51bV9tc2R1czsKIH0KIAogc3RhdGljIHZvaWQgYXRoMTBrX2h0dF9yeF90eF9mZXRjaF9yZXNwX2lkX2NvbmZpcm0oc3RydWN0IGF0aDEwayAqYXIsCkBAIC0yMjY3LDcgKzIyNjgsNiBAQAogCX0KIAljYXNlIEhUVF9UMkhfTVNHX1RZUEVfVFhfQ09NUExfSU5EOgogCQlhdGgxMGtfaHR0X3J4X3R4X2NvbXBsX2luZChodHQtPmFyLCBza2IpOwotCQl0YXNrbGV0X3NjaGVkdWxlKCZodHQtPnR4cnhfY29tcGxfdGFzayk7CiAJCWJyZWFrOwogCWNhc2UgSFRUX1QySF9NU0dfVFlQRV9TRUNfSU5EOiB7CiAJCXN0cnVjdCBhdGgxMGsgKmFyID0gaHR0LT5hcjsKQEAgLTIyODQsNyArMjI4NCw3IEBACiAJY2FzZSBIVFRfVDJIX01TR19UWVBFX1JYX0ZSQUdfSU5EOiB7CiAJCWF0aDEwa19kYmdfZHVtcChhciwgQVRIMTBLX0RCR19IVFRfRFVNUCwgTlVMTCwgImh0dCBldmVudDogIiwKIAkJCQlza2ItPmRhdGEsIHNrYi0+bGVuKTsKLQkJYXRoMTBrX2h0dF9yeF9mcmFnX2hhbmRsZXIoaHR0KTsKKwkJYXRvbWljX2luYygmaHR0LT5udW1fbXBkdXNfcmVhZHkpOwogCQlicmVhazsKIAl9CiAJY2FzZSBIVFRfVDJIX01TR19UWVBFX1RFU1Q6CkBAIC0yMzIwLDggKzIzMjAsNyBAQAogCQlicmVhazsKIAl9CiAJY2FzZSBIVFRfVDJIX01TR19UWVBFX1JYX0lOX09SRF9QQUREUl9JTkQ6IHsKLQkJc2tiX3F1ZXVlX3RhaWwoJmh0dC0+cnhfaW5fb3JkX2NvbXBsX3EsIHNrYik7Ci0JCXRhc2tsZXRfc2NoZWR1bGUoJmh0dC0+dHhyeF9jb21wbF90YXNrKTsKKwkJX19za2JfcXVldWVfdGFpbCgmaHR0LT5yeF9pbl9vcmRfY29tcGxfcSwgc2tiKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAljYXNlIEhUVF9UMkhfTVNHX1RZUEVfVFhfQ1JFRElUX1VQREFURV9JTkQ6CkBAIC0yMzQ3LDcgKzIzNDYsNiBAQAogCQkJYnJlYWs7CiAJCX0KIAkJc2tiX3F1ZXVlX3RhaWwoJmh0dC0+dHhfZmV0Y2hfaW5kX3EsIHR4X2ZldGNoX2luZCk7Ci0JCXRhc2tsZXRfc2NoZWR1bGUoJmh0dC0+dHhyeF9jb21wbF90YXNrKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgSFRUX1QySF9NU0dfVFlQRV9UWF9GRVRDSF9DT05GSVJNOgpAQCAtMjM3NiwyNyArMjM3NCw3NyBAQAogfQogRVhQT1JUX1NZTUJPTChhdGgxMGtfaHR0X3J4X3BrdGxvZ19jb21wbGV0aW9uX2hhbmRsZXIpOwogCi1zdGF0aWMgdm9pZCBhdGgxMGtfaHR0X3R4cnhfY29tcGxfdGFzayh1bnNpZ25lZCBsb25nIHB0cikKK2ludCBhdGgxMGtfaHR0X3R4cnhfY29tcGxfdGFzayhzdHJ1Y3QgYXRoMTBrICphciwgaW50IGJ1ZGdldCkKIHsKLQlzdHJ1Y3QgYXRoMTBrX2h0dCAqaHR0ID0gKHN0cnVjdCBhdGgxMGtfaHR0ICopcHRyOwotCXN0cnVjdCBhdGgxMGsgKmFyID0gaHR0LT5hcjsKKwlzdHJ1Y3QgYXRoMTBrX2h0dCAqaHR0ID0gJmFyLT5odHQ7CiAJc3RydWN0IGh0dF90eF9kb25lIHR4X2RvbmUgPSB7fTsKLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHJ4X2luZF9xOwogCXN0cnVjdCBza19idWZmX2hlYWQgdHhfaW5kX3E7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBudW1fbXBkdXM7CisJaW50IHF1b3RhID0gMCwgZG9uZSwgbnVtX3J4X21zZHVzOworCWJvb2wgcmVzY2hlZF9uYXBpID0gZmFsc2U7CiAKLQlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJnJ4X2luZF9xKTsKIAlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJnR4X2luZF9xKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZodHQtPnJ4X2luX29yZF9jb21wbF9xLmxvY2ssIGZsYWdzKTsKLQlza2JfcXVldWVfc3BsaWNlX2luaXQoJmh0dC0+cnhfaW5fb3JkX2NvbXBsX3EsICZyeF9pbmRfcSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHR0LT5yeF9pbl9vcmRfY29tcGxfcS5sb2NrLCBmbGFncyk7CisJLyogU2luY2UgaW4tb3JkLWluZCBjYW4gZGVsaXZlciBtb3JlIHRoYW4gMSBBLU1TRFUgaW4gc2luZ2xlIGV2ZW50LAorCSAqIHByb2Nlc3MgaXQgZmlyc3QgdG8gdXRpbGl6ZSBmdWxsIGF2YWlsYWJsZSBxdW90YS4KKwkgKi8KKwl3aGlsZSAocXVvdGEgPCBidWRnZXQpIHsKKwkJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmaHR0LT5yeF9pbl9vcmRfY29tcGxfcSkpCisJCQlicmVhazsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZodHQtPnR4X2ZldGNoX2luZF9xLmxvY2ssIGZsYWdzKTsKLQlza2JfcXVldWVfc3BsaWNlX2luaXQoJmh0dC0+dHhfZmV0Y2hfaW5kX3EsICZ0eF9pbmRfcSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHR0LT50eF9mZXRjaF9pbmRfcS5sb2NrLCBmbGFncyk7CisJCXNrYiA9IF9fc2tiX2RlcXVldWUoJmh0dC0+cnhfaW5fb3JkX2NvbXBsX3EpOworCQlpZiAoIXNrYikgeworCQkJcmVzY2hlZF9uYXBpID0gdHJ1ZTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCisJCXNwaW5fbG9ja19iaCgmaHR0LT5yeF9yaW5nLmxvY2spOworCQludW1fcnhfbXNkdXMgPSBhdGgxMGtfaHR0X3J4X2luX29yZF9pbmQoYXIsIHNrYik7CisJCXNwaW5fdW5sb2NrX2JoKCZodHQtPnJ4X3JpbmcubG9jayk7CisJCWlmIChudW1fcnhfbXNkdXMgPCAwKSB7CisJCQlyZXNjaGVkX25hcGkgPSB0cnVlOworCQkJZ290byBleGl0OworCQl9CisKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJaWYgKG51bV9yeF9tc2R1cyA+IDApCisJCQlxdW90YSArPSBudW1fcnhfbXNkdXM7CisKKwkJaWYgKChxdW90YSA+IEFUSDEwS19OQVBJX1FVT1RBX0xJTUlUKSAmJgorCQkgICAgIXNrYl9xdWV1ZV9lbXB0eSgmaHR0LT5yeF9pbl9vcmRfY29tcGxfcSkpIHsKKwkJCXJlc2NoZWRfbmFwaSA9IHRydWU7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwl9CisKKwl3aGlsZSAocXVvdGEgPCBidWRnZXQpIHsKKwkJLyogbm8gbW9yZSBkYXRhIHRvIHJlY2VpdmUgKi8KKwkJaWYgKCFhdG9taWNfcmVhZCgmaHR0LT5udW1fbXBkdXNfcmVhZHkpKQorCQkJYnJlYWs7CisKKwkJbnVtX3J4X21zZHVzID0gYXRoMTBrX2h0dF9yeF9oYW5kbGVfYW1zZHUoaHR0KTsKKwkJaWYgKG51bV9yeF9tc2R1cyA8IDApIHsKKwkJCXJlc2NoZWRfbmFwaSA9IHRydWU7CisJCQlnb3RvIGV4aXQ7CisJCX0KKworCQlxdW90YSArPSBudW1fcnhfbXNkdXM7CisJCWF0b21pY19kZWMoJmh0dC0+bnVtX21wZHVzX3JlYWR5KTsKKwkJaWYgKChxdW90YSA+IEFUSDEwS19OQVBJX1FVT1RBX0xJTUlUKSAmJgorCQkgICAgYXRvbWljX3JlYWQoJmh0dC0+bnVtX21wZHVzX3JlYWR5KSkgeworCQkJcmVzY2hlZF9uYXBpID0gdHJ1ZTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCX0KKworCS8qIEZyb20gTkFQSSBkb2N1bWVudGF0aW9uOgorCSAqICBUaGUgbmFwaSBwb2xsKCkgZnVuY3Rpb24gbWF5IGFsc28gcHJvY2VzcyBUWCBjb21wbGV0aW9ucywgaW4gd2hpY2gKKwkgKiAgY2FzZSBpZiBpdCBwcm9jZXNzZXMgdGhlIGVudGlyZSBUWCByaW5nIHRoZW4gaXQgc2hvdWxkIGNvdW50IHRoYXQKKwkgKiAgd29yayBhcyB0aGUgcmVzdCBvZiB0aGUgYnVkZ2V0LgorCSAqLworCWlmICgocXVvdGEgPCBidWRnZXQpICYmICFrZmlmb19pc19lbXB0eSgmaHR0LT50eGRvbmVfZmlmbykpCisJCXF1b3RhID0gYnVkZ2V0OwogCiAJLyoga2ZpZm9fZ2V0OiBjYWxsZWQgb25seSB3aXRoaW4gdHhyeF90YXNrbGV0IHNvIGl0J3MgbmVhdGx5IHNlcmlhbGl6ZWQuCiAJICogRnJvbSBrZmlmb19nZXQoKSBkb2N1bWVudGF0aW9uOgpAQCAtMjQwNiwyNyArMjQ1NCwyNCBAQAogCXdoaWxlIChrZmlmb19nZXQoJmh0dC0+dHhkb25lX2ZpZm8sICZ0eF9kb25lKSkKIAkJYXRoMTBrX3R4cnhfdHhfdW5yZWYoaHR0LCAmdHhfZG9uZSk7CiAKKwlhdGgxMGtfbWFjX3R4X3B1c2hfcGVuZGluZyhhcik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaHR0LT50eF9mZXRjaF9pbmRfcS5sb2NrLCBmbGFncyk7CisJc2tiX3F1ZXVlX3NwbGljZV9pbml0KCZodHQtPnR4X2ZldGNoX2luZF9xLCAmdHhfaW5kX3EpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh0dC0+dHhfZmV0Y2hfaW5kX3EubG9jaywgZmxhZ3MpOworCiAJd2hpbGUgKChza2IgPSBfX3NrYl9kZXF1ZXVlKCZ0eF9pbmRfcSkpKSB7CiAJCWF0aDEwa19odHRfcnhfdHhfZmV0Y2hfaW5kKGFyLCBza2IpOwogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCX0KIAotCW51bV9tcGR1cyA9IGF0b21pY19yZWFkKCZodHQtPm51bV9tcGR1c19yZWFkeSk7Ci0KLQl3aGlsZSAobnVtX21wZHVzKSB7Ci0JCWlmIChhdGgxMGtfaHR0X3J4X2hhbmRsZV9hbXNkdShodHQpKQotCQkJYnJlYWs7Ci0KLQkJbnVtX21wZHVzLS07Ci0JCWF0b21pY19kZWMoJmh0dC0+bnVtX21wZHVzX3JlYWR5KTsKLQl9Ci0KLQl3aGlsZSAoKHNrYiA9IF9fc2tiX2RlcXVldWUoJnJ4X2luZF9xKSkpIHsKLQkJc3Bpbl9sb2NrX2JoKCZodHQtPnJ4X3JpbmcubG9jayk7Ci0JCWF0aDEwa19odHRfcnhfaW5fb3JkX2luZChhciwgc2tiKTsKLQkJc3Bpbl91bmxvY2tfYmgoJmh0dC0+cnhfcmluZy5sb2NrKTsKLQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQl9Ci0KK2V4aXQ6CiAJYXRoMTBrX2h0dF9yeF9tc2R1X2J1ZmZfcmVwbGVuaXNoKGh0dCk7CisJLyogSW4gY2FzZSBvZiByeCBmYWlsdXJlIG9yIG1vcmUgZGF0YSB0byByZWFkLCByZXBvcnQgYnVkZ2V0CisJICogdG8gcmVzY2hlZHVsZSBOQVBJIHBvbGwKKwkgKi8KKwlkb25lID0gcmVzY2hlZF9uYXBpID8gYnVkZ2V0IDogcXVvdGE7CisKKwlyZXR1cm4gZG9uZTsKIH0KK0VYUE9SVF9TWU1CT0woYXRoMTBrX2h0dF90eHJ4X2NvbXBsX3Rhc2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9odHRfdHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHR0X3R4LmMKaW5kZXggN2MwNzJiNi4uYWU1YjMzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9odHRfdHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h0dF90eC5jCkBAIC0zOTAsOCArMzkwLDYgQEAKIHsKIAlpbnQgc2l6ZTsKIAotCXRhc2tsZXRfa2lsbCgmaHR0LT50eHJ4X2NvbXBsX3Rhc2spOwotCiAJaWRyX2Zvcl9lYWNoKCZodHQtPnBlbmRpbmdfdHgsIGF0aDEwa19odHRfdHhfY2xlYW5fdXBfcGVuZGluZywgaHR0LT5hcik7CiAJaWRyX2Rlc3Ryb3koJmh0dC0+cGVuZGluZ190eCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHcuYwppbmRleCBmOTAzZDQ2Li42NzVlNzVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9ody5jCkBAIC04NSw3ICs4NSw3IEBACiAJLmNlN19iYXNlX2FkZHJlc3MJCQk9IDB4MDAwNGJjMDAsCiAJLyogTm90ZTogcWNhOTl4MCBzdXBwb3J0cyB1cHRvIDEyIENvcHkgRW5naW5lcy4gT3RoZXIgdGhhbiBhZGRyZXNzIG9mCiAJICogQ0UwIGFuZCBDRTEgbm8gb3RoZXIgY29weSBlbmdpbmUgaXMgZGlyZWN0bHkgcmVmZXJyZWQgaW4gdGhlIGNvZGUuCi0JICogSXQgaXMgbm90IHJlYWxseSBuZWNjZXNzYXJ5IHRvIGFzc2lnbiBhZGRyZXNzIGZvciBuZXdseSBzdXBwb3J0ZWQKKwkgKiBJdCBpcyBub3QgcmVhbGx5IG5lY2Vzc2FyeSB0byBhc3NpZ24gYWRkcmVzcyBmb3IgbmV3bHkgc3VwcG9ydGVkCiAJICogQ0VzIGluIHRoaXMgYWRkcmVzcyB0YWJsZS4KIAkgKglDb3B5IEVuZ2luZQkJQWRkcmVzcwogCSAqCUNFOAkJCTB4MDAwNGMwMDAKQEAgLTIxOSwzICsyMTksMTYgQEAKIAlzdXJ2ZXktPnRpbWUgPSBDQ05UX1RPX01TRUMoYXIsIGNjKTsKIAlzdXJ2ZXktPnRpbWVfYnVzeSA9IENDTlRfVE9fTVNFQyhhciwgcmNjKTsKIH0KKworY29uc3Qgc3RydWN0IGF0aDEwa19od19vcHMgcWNhOTg4eF9vcHMgPSB7Cit9OworCitzdGF0aWMgaW50IGF0aDEwa19xY2E5OXgwX3J4X2Rlc2NfZ2V0X2wzX3BhZF9ieXRlcyhzdHJ1Y3QgaHR0X3J4X2Rlc2MgKnJ4ZCkKK3sKKwlyZXR1cm4gTVMoX19sZTMyX3RvX2NwdShyeGQtPm1zZHVfZW5kLnFjYTk5eDAuaW5mbzEpLAorCQkgIFJYX01TRFVfRU5EX0lORk8xX0wzX0hEUl9QQUQpOworfQorCitjb25zdCBzdHJ1Y3QgYXRoMTBrX2h3X29wcyBxY2E5OXgwX29wcyA9IHsKKwkucnhfZGVzY19nZXRfbDNfcGFkX2J5dGVzID0gYXRoMTBrX3FjYTk5eDBfcnhfZGVzY19nZXRfbDNfcGFkX2J5dGVzLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHcuaAppbmRleCBlMDE0Y2Q3Li42MDM4Yjc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h3LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9ody5oCkBAIC0yODQsNyArMjg0LDcgQEAKICNkZWZpbmUgUUNBX1JFVl85Mzc3KGFyKSAoKGFyKS0+aHdfcmV2ID09IEFUSDEwS19IV19RQ0E5Mzc3KQogI2RlZmluZSBRQ0FfUkVWXzQwWFgoYXIpICgoYXIpLT5od19yZXYgPT0gQVRIMTBLX0hXX1FDQTQwMTkpCiAKLS8qIEtub3duIHBlY3VsYXJpdGllczoKKy8qIEtub3duIHBlY3VsaWFyaXRpZXM6CiAgKiAgLSByYXcgYXBwZWFycyBpbiBud2lmaSBkZWNhcCwgcmF3IGFuZCBud2lmaSBhcHBlYXIgaW4gZXRoZXJuZXQgZGVjYXAKICAqICAtIHJhdyBoYXZlIEZDUywgbndpZmkgZG9lc24ndAogICogIC0gZXRoZXJuZXQgZnJhbWVzIGhhdmUgODAyLjExIGhlYWRlciBkZWNhcHBlZCBhbmQgcGFydHMgKGJhc2UgaGRyLCBjaXBoZXIKQEAgLTMzOCwxMSArMzM4LDYgQEAKIAlBVEgxMEtfSFdfUkFURV9SRVYyX0NDS19TUF8xMU0sCiB9OwogCi1lbnVtIGF0aDEwa19od180YWRkcl9wYWQgewotCUFUSDEwS19IV180QUREUl9QQURfQUZURVIsCi0JQVRIMTBLX0hXXzRBRERSX1BBRF9CRUZPUkUsCi19OwotCiBlbnVtIGF0aDEwa19od19jY193cmFwYXJvdW5kX3R5cGUgewogCUFUSDEwS19IV19DQ19XUkFQX0RJU0FCTEVEID0gMCwKIApAQCAtMzYzLDYgKzM1OCw4MCBAQAogCUFUSDEwS19IV19DQ19XUkFQX1NISUZURURfRUFDSCA9IDIsCiB9OwogCitzdHJ1Y3QgYXRoMTBrX2h3X3BhcmFtcyB7CisJdTMyIGlkOworCXUxNiBkZXZfaWQ7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1MzIgcGF0Y2hfbG9hZF9hZGRyOworCWludCB1YXJ0X3BpbjsKKwl1MzIgb3RwX2V4ZV9wYXJhbTsKKworCS8qIFR5cGUgb2YgaHcgY3ljbGUgY291bnRlciB3cmFwYXJvdW5kIGxvZ2ljLCBmb3IgbW9yZSBpbmZvCisJICogcmVmZXIgZW51bSBhdGgxMGtfaHdfY2Nfd3JhcGFyb3VuZF90eXBlLgorCSAqLworCWVudW0gYXRoMTBrX2h3X2NjX3dyYXBhcm91bmRfdHlwZSBjY193cmFwYXJvdW5kX3R5cGU7CisKKwkvKiBTb21lIG9mIGNoaXAgZXhwZWN0cyBmcmFnbWVudCBkZXNjcmlwdG9yIHRvIGJlIGNvbnRpbnVvdXMKKwkgKiBtZW1vcnkgZm9yIGFueSBUWCBvcGVyYXRpb24uIFNldCBjb250aW51b3VzX2ZyYWdfZGVzYyBmbGFnCisJICogZm9yIHRoZSBoYXJkd2FyZSB3aGljaCBoYXZlIHN1Y2ggcmVxdWlyZW1lbnQuCisJICovCisJYm9vbCBjb250aW51b3VzX2ZyYWdfZGVzYzsKKworCS8qIENDSyBoYXJkd2FyZSByYXRlIHRhYmxlIG1hcHBpbmcgZm9yIHRoZSBuZXdlciBjaGlwc2V0cworCSAqIGxpa2UgUUNBOTlYMCwgUUNBNDAxOSBnb3QgcmV2aXNlZC4gVGhlIENDSyBoL3cgcmF0ZSB2YWx1ZXMKKwkgKiBhcmUgaW4gYSBwcm9wZXIgb3JkZXIgd2l0aCByZXNwZWN0IHRvIHRoZSByYXRlL3ByZWFtYmxlCisJICovCisJYm9vbCBjY2tfcmF0ZV9tYXBfcmV2MjsKKworCXUzMiBjaGFubmVsX2NvdW50ZXJzX2ZyZXFfaHo7CisKKwkvKiBNZ210IHR4IGRlc2NyaXB0b3JzIHRocmVzaG9sZCBmb3IgbGltaXRpbmcgcHJvYmUgcmVzcG9uc2UKKwkgKiBmcmFtZXMuCisJICovCisJdTMyIG1heF9wcm9iZV9yZXNwX2Rlc2NfdGhyZXM7CisKKwl1MzIgdHhfY2hhaW5fbWFzazsKKwl1MzIgcnhfY2hhaW5fbWFzazsKKwl1MzIgbWF4X3NwYXRpYWxfc3RyZWFtOworCXUzMiBjYWxfZGF0YV9sZW47CisKKwlzdHJ1Y3QgYXRoMTBrX2h3X3BhcmFtc19mdyB7CisJCWNvbnN0IGNoYXIgKmRpcjsKKwkJY29uc3QgY2hhciAqYm9hcmQ7CisJCXNpemVfdCBib2FyZF9zaXplOworCQlzaXplX3QgYm9hcmRfZXh0X3NpemU7CisJfSBmdzsKKworCS8qIHFjYTk5eDAgZmFtaWx5IGNoaXBzIGRlbGl2ZXIgYnJvYWRjYXN0L211bHRpY2FzdCBtYW5hZ2VtZW50CisJICogZnJhbWVzIGVuY3J5cHRlZCBhbmQgZXhwZWN0IHNvZnR3YXJlIGRvIGRlY3J5cHRpb24uCisJICovCisJYm9vbCBzd19kZWNyeXB0X21jYXN0X21nbXQ7CisKKwljb25zdCBzdHJ1Y3QgYXRoMTBrX2h3X29wcyAqaHdfb3BzOworCisJLyogTnVtYmVyIG9mIGJ5dGVzIHVzZWQgZm9yIGFsaWdubWVudCBpbiByeF9oZHJfc3RhdHVzIG9mIHJ4IGRlc2MuICovCisJaW50IGRlY2FwX2FsaWduX2J5dGVzOworfTsKKworc3RydWN0IGh0dF9yeF9kZXNjOworCisvKiBEZWZpbmVzIG5lZWRlZCBmb3IgUnggZGVzY3JpcHRvciBhYnN0cmFjdGlvbiAqLworc3RydWN0IGF0aDEwa19od19vcHMgeworCWludCAoKnJ4X2Rlc2NfZ2V0X2wzX3BhZF9ieXRlcykoc3RydWN0IGh0dF9yeF9kZXNjICpyeGQpOworfTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBhdGgxMGtfaHdfb3BzIHFjYTk4OHhfb3BzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBhdGgxMGtfaHdfb3BzIHFjYTk5eDBfb3BzOworCitzdGF0aWMgaW5saW5lIGludAorYXRoMTBrX3J4X2Rlc2NfZ2V0X2wzX3BhZF9ieXRlcyhzdHJ1Y3QgYXRoMTBrX2h3X3BhcmFtcyAqaHcsCisJCQkJc3RydWN0IGh0dF9yeF9kZXNjICpyeGQpCit7CisJaWYgKGh3LT5od19vcHMtPnJ4X2Rlc2NfZ2V0X2wzX3BhZF9ieXRlcykKKwkJcmV0dXJuIGh3LT5od19vcHMtPnJ4X2Rlc2NfZ2V0X2wzX3BhZF9ieXRlcyhyeGQpOworCXJldHVybiAwOworfQorCiAvKiBUYXJnZXQgc3BlY2lmaWMgZGVmaW5lcyBmb3IgTUFJTiBmaXJtd2FyZSAqLwogI2RlZmluZSBUQVJHRVRfTlVNX1ZERVZTCQkJOAogI2RlZmluZSBUQVJHRVRfTlVNX1BFRVJfQVNUCQkJMgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9tYWMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvbWFjLmMKaW5kZXggMGJiZDBhMC4uNzYyOTdkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9tYWMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL21hYy5jCkBAIC04MjQsNyArODI0LDcgQEAKIAkJICovCiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFyLT5wZWVyX21hcCk7IGkrKykgewogCQkJaWYgKGFyLT5wZWVyX21hcFtpXSA9PSBwZWVyKSB7Ci0JCQkJYXRoMTBrX3dhcm4oYXIsICJyZW1vdmluZyBzdGFsZSBwZWVyX21hcCBlbnRyeSBmb3IgJXBNIChwdHIgJXAgaWR4ICVkKVxuIiwKKwkJCQlhdGgxMGtfd2FybihhciwgInJlbW92aW5nIHN0YWxlIHBlZXJfbWFwIGVudHJ5IGZvciAlcE0gKHB0ciAlcEsgaWR4ICVkKVxuIiwKIAkJCQkJICAgIHBlZXItPmFkZHIsIHBlZXIsIGkpOwogCQkJCWFyLT5wZWVyX21hcFtpXSA9IE5VTEw7CiAJCQl9CkBAIC0yNzkzLDcgKzI3OTMsNyBAQAogCiAJcmV0ID0gYXRoMTBrX3dtaV92ZGV2X2Rvd24oYXIsIGFydmlmLT52ZGV2X2lkKTsKIAlpZiAocmV0KQotCQlhdGgxMGtfd2FybihhciwgImZhaWVsZCB0byBkb3duIHZkZXYgJWk6ICVkXG4iLAorCQlhdGgxMGtfd2FybihhciwgImZhaWxlZCB0byBkb3duIHZkZXYgJWk6ICVkXG4iLAogCQkJICAgIGFydmlmLT52ZGV2X2lkLCByZXQpOwogCiAJYXJ2aWYtPmRlZl93ZXBfa2V5X2lkeCA9IC0xOwpAQCAtMzI1NSw2ICszMjU1LDggQEAKIAlpZiAoYXItPmh0dC50YXJnZXRfdmVyc2lvbl9tYWpvciA8IDMgJiYKIAkgICAgKGllZWU4MDIxMV9pc19udWxsZnVuYyhmYykgfHwgaWVlZTgwMjExX2lzX3Fvc19udWxsZnVuYyhmYykpICYmCiAJICAgICF0ZXN0X2JpdChBVEgxMEtfRldfRkVBVFVSRV9IQVNfV01JX01HTVRfVFgsCisJCSAgICAgIGFyLT5ydW5uaW5nX2Z3LT5md19maWxlLmZ3X2ZlYXR1cmVzKSAmJgorCSAgICAhdGVzdF9iaXQoQVRIMTBLX0ZXX0ZFQVRVUkVfU0tJUF9OVUxMX0ZVTkNfV0FSLAogCQkgICAgICBhci0+cnVubmluZ19mdy0+ZndfZmlsZS5md19mZWF0dXJlcykpCiAJCXJldHVybiBBVEgxMEtfSFdfVFhSWF9NR01UOwogCkBAIC0zNTI0LDcgKzM1MjYsNyBAQAogCiAJaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9UWF9PRkZDSEFOKSB7CiAJCWlmICghYXRoMTBrX21hY190eF9mcm1faGFzX2ZyZXEoYXIpKSB7Ci0JCQlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX01BQywgInF1ZXVlZCBvZmZjaGFubmVsIHNrYiAlcFxuIiwKKwkJCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfTUFDLCAicXVldWVkIG9mZmNoYW5uZWwgc2tiICVwS1xuIiwKIAkJCQkgICBza2IpOwogCiAJCQlza2JfcXVldWVfdGFpbCgmYXItPm9mZmNoYW5fdHhfcXVldWUsIHNrYik7CkBAIC0zNTg2LDcgKzM1ODgsNyBAQAogCiAJCW11dGV4X2xvY2soJmFyLT5jb25mX211dGV4KTsKIAotCQlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX01BQywgIm1hYyBvZmZjaGFubmVsIHNrYiAlcFxuIiwKKwkJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19NQUMsICJtYWMgb2ZmY2hhbm5lbCBza2IgJXBLXG4iLAogCQkJICAgc2tiKTsKIAogCQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CkBAIC0zNjQzLDcgKzM2NDUsNyBAQAogCQl0aW1lX2xlZnQgPQogCQl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmFyLT5vZmZjaGFuX3R4X2NvbXBsZXRlZCwgMyAqIEhaKTsKIAkJaWYgKHRpbWVfbGVmdCA9PSAwKQotCQkJYXRoMTBrX3dhcm4oYXIsICJ0aW1lZCBvdXQgd2FpdGluZyBmb3Igb2ZmY2hhbm5lbCBza2IgJXBcbiIsCisJCQlhdGgxMGtfd2FybihhciwgInRpbWVkIG91dCB3YWl0aW5nIGZvciBvZmZjaGFubmVsIHNrYiAlcEtcbiIsCiAJCQkJICAgIHNrYik7CiAKIAkJaWYgKCFwZWVyICYmIHRtcF9wZWVyX2NyZWF0ZWQpIHsKQEAgLTM3NzcsNyArMzc3OSw5IEBACiAJZW51bSBhdGgxMGtfaHdfdHhyeF9tb2RlIHR4bW9kZTsKIAllbnVtIGF0aDEwa19tYWNfdHhfcGF0aCB0eHBhdGg7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOwogCXNpemVfdCBza2JfbGVuOworCWJvb2wgaXNfbWdtdCwgaXNfcHJlc3A7CiAJaW50IHJldDsKIAogCXNwaW5fbG9ja19iaCgmYXItPmh0dC50eF9sb2NrKTsKQEAgLTM4MDEsNiArMzgwNSwyMiBAQAogCXNrYl9sZW4gPSBza2ItPmxlbjsKIAl0eG1vZGUgPSBhdGgxMGtfbWFjX3R4X2hfZ2V0X3R4bW9kZShhciwgdmlmLCBzdGEsIHNrYik7CiAJdHhwYXRoID0gYXRoMTBrX21hY190eF9oX2dldF90eHBhdGgoYXIsIHNrYiwgdHhtb2RlKTsKKwlpc19tZ210ID0gKHR4cGF0aCA9PSBBVEgxMEtfTUFDX1RYX0hUVF9NR01UKTsKKworCWlmIChpc19tZ210KSB7CisJCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKKwkJaXNfcHJlc3AgPSBpZWVlODAyMTFfaXNfcHJvYmVfcmVzcChoZHItPmZyYW1lX2NvbnRyb2wpOworCisJCXNwaW5fbG9ja19iaCgmYXItPmh0dC50eF9sb2NrKTsKKwkJcmV0ID0gYXRoMTBrX2h0dF90eF9tZ210X2luY19wZW5kaW5nKGh0dCwgaXNfbWdtdCwgaXNfcHJlc3ApOworCisJCWlmIChyZXQpIHsKKwkJCWF0aDEwa19odHRfdHhfZGVjX3BlbmRpbmcoaHR0KTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZhci0+aHR0LnR4X2xvY2spOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlzcGluX3VubG9ja19iaCgmYXItPmh0dC50eF9sb2NrKTsKKwl9CiAKIAlyZXQgPSBhdGgxMGtfbWFjX3R4KGFyLCB2aWYsIHN0YSwgdHhtb2RlLCB0eHBhdGgsIHNrYik7CiAJaWYgKHVubGlrZWx5KHJldCkpIHsKQEAgLTM4MDgsNiArMzgyOCw4IEBACiAKIAkJc3Bpbl9sb2NrX2JoKCZhci0+aHR0LnR4X2xvY2spOwogCQlhdGgxMGtfaHR0X3R4X2RlY19wZW5kaW5nKGh0dCk7CisJCWlmIChpc19tZ210KQorCQkJYXRoMTBrX2h0dF90eF9tZ210X2RlY19wZW5kaW5nKGh0dCk7CiAJCXNwaW5fdW5sb2NrX2JoKCZhci0+aHR0LnR4X2xvY2spOwogCiAJCXJldHVybiByZXQ7CkBAIC0zODk0LDcgKzM5MTYsNyBAQAogCQlhci0+c2Nhbi5yb2NfZnJlcSA9IDA7CiAJCWF0aDEwa19vZmZjaGFuX3R4X3B1cmdlKGFyKTsKIAkJY2FuY2VsX2RlbGF5ZWRfd29yaygmYXItPnNjYW4udGltZW91dCk7Ci0JCWNvbXBsZXRlX2FsbCgmYXItPnNjYW4uY29tcGxldGVkKTsKKwkJY29tcGxldGUoJmFyLT5zY2FuLmNvbXBsZXRlZCk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTQxMDAsMTMgKzQxMjIsMjkgQEAKIHsKIAlzdHJ1Y3QgYXRoMTBrICphciA9IGh3LT5wcml2OwogCXN0cnVjdCBhdGgxMGtfdHhxICphcnR4cSA9ICh2b2lkICopdHhxLT5kcnZfcHJpdjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4cSAqZl90eHE7CisJc3RydWN0IGF0aDEwa190eHEgKmZfYXJ0eHE7CisJaW50IHJldCA9IDA7CisJaW50IG1heCA9IDE2OwogCiAJc3Bpbl9sb2NrX2JoKCZhci0+dHhxc19sb2NrKTsKIAlpZiAobGlzdF9lbXB0eSgmYXJ0eHEtPmxpc3QpKQogCQlsaXN0X2FkZF90YWlsKCZhcnR4cS0+bGlzdCwgJmFyLT50eHFzKTsKKworCWZfYXJ0eHEgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhci0+dHhxcywgc3RydWN0IGF0aDEwa190eHEsIGxpc3QpOworCWZfdHhxID0gY29udGFpbmVyX29mKCh2b2lkICopZl9hcnR4cSwgc3RydWN0IGllZWU4MDIxMV90eHEsIGRydl9wcml2KTsKKwlsaXN0X2RlbF9pbml0KCZmX2FydHhxLT5saXN0KTsKKworCXdoaWxlIChhdGgxMGtfbWFjX3R4X2Nhbl9wdXNoKGh3LCBmX3R4cSkgJiYgbWF4LS0pIHsKKwkJcmV0ID0gYXRoMTBrX21hY190eF9wdXNoX3R4cShodywgZl90eHEpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJfQorCWlmIChyZXQgIT0gLUVOT0VOVCkKKwkJbGlzdF9hZGRfdGFpbCgmZl9hcnR4cS0+bGlzdCwgJmFyLT50eHFzKTsKIAlzcGluX3VubG9ja19iaCgmYXItPnR4cXNfbG9jayk7CiAKLQlhdGgxMGtfbWFjX3R4X3B1c2hfcGVuZGluZyhhcik7CisJYXRoMTBrX2h0dF90eF90eHFfdXBkYXRlKGh3LCBmX3R4cSk7CiAJYXRoMTBrX2h0dF90eF90eHFfdXBkYXRlKGh3LCB0eHEpOwogfQogCkBAIC01MTg2LDcgKzUyMjQsNyBAQAogCiAJcmV0ID0gYXRoMTBrX21vbml0b3JfcmVjYWxjKGFyKTsKIAlpZiAocmV0KQotCQlhdGgxMGtfd2FybihhciwgImZhaWxlZCB0byByZWNhbGMgbW9udGlvcjogJWRcbiIsIHJldCk7CisJCWF0aDEwa193YXJuKGFyLCAiZmFpbGVkIHRvIHJlY2FsYyBtb25pdG9yOiAlZFxuIiwgcmV0KTsKIAogCW11dGV4X3VubG9jaygmYXItPmNvbmZfbXV0ZXgpOwogfQpAQCAtNTk4NCw4ICs2MDIyLDggQEAKIAkJICogRXhpc3Rpbmcgc3RhdGlvbiBkZWxldGlvbi4KIAkJICovCiAJCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfTUFDLAotCQkJICAgIm1hYyB2ZGV2ICVkIHBlZXIgZGVsZXRlICVwTSAoc3RhIGdvbmUpXG4iLAotCQkJICAgYXJ2aWYtPnZkZXZfaWQsIHN0YS0+YWRkcik7CisJCQkgICAibWFjIHZkZXYgJWQgcGVlciBkZWxldGUgJXBNIHN0YSAlcEsgKHN0YSBnb25lKVxuIiwKKwkJCSAgIGFydmlmLT52ZGV2X2lkLCBzdGEtPmFkZHIsIHN0YSk7CiAKIAkJcmV0ID0gYXRoMTBrX3BlZXJfZGVsZXRlKGFyLCBhcnZpZi0+dmRldl9pZCwgc3RhLT5hZGRyKTsKIAkJaWYgKHJldCkKQEAgLTYwMDEsNyArNjAzOSw3IEBACiAJCQkJY29udGludWU7CiAKIAkJCWlmIChwZWVyLT5zdGEgPT0gc3RhKSB7Ci0JCQkJYXRoMTBrX3dhcm4oYXIsICJmb3VuZCBzdGEgcGVlciAlcE0gKHB0ciAlcCBpZCAlZCkgZW50cnkgb24gdmRldiAlaSBhZnRlciBpdCB3YXMgc3VwcG9zZWRseSByZW1vdmVkXG4iLAorCQkJCWF0aDEwa193YXJuKGFyLCAiZm91bmQgc3RhIHBlZXIgJXBNIChwdHIgJXBLIGlkICVkKSBlbnRyeSBvbiB2ZGV2ICVpIGFmdGVyIGl0IHdhcyBzdXBwb3NlZGx5IHJlbW92ZWRcbiIsCiAJCQkJCSAgICBzdGEtPmFkZHIsIHBlZXIsIGksIGFydmlmLT52ZGV2X2lkKTsKIAkJCQlwZWVyLT5zdGEgPSBOVUxMOwogCkBAIC02NTM4LDcgKzY1NzYsNyBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCi0JYXRoMTBrX21hY191cGRhdGVfYnNzX2NoYW5fc3VydmV5KGFyLCBzdXJ2ZXktPmNoYW5uZWwpOworCWF0aDEwa19tYWNfdXBkYXRlX2Jzc19jaGFuX3N1cnZleShhciwgJnNiYW5kLT5jaGFubmVsc1tpZHhdKTsKIAogCXNwaW5fbG9ja19iaCgmYXItPmRhdGFfbG9jayk7CiAJbWVtY3B5KHN1cnZleSwgYXJfc3VydmV5LCBzaXplb2YoKnN1cnZleSkpOwpAQCAtNzEzNCw3ICs3MTcyLDcgQEAKIAlzdHJ1Y3QgYXRoMTBrICphciA9IGh3LT5wcml2OwogCiAJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19NQUMsCi0JCSAgICJtYWMgY2hhbmN0eCBhZGQgZnJlcSAlaHUgd2lkdGggJWQgcHRyICVwXG4iLAorCQkgICAibWFjIGNoYW5jdHggYWRkIGZyZXEgJWh1IHdpZHRoICVkIHB0ciAlcEtcbiIsCiAJCSAgIGN0eC0+ZGVmLmNoYW4tPmNlbnRlcl9mcmVxLCBjdHgtPmRlZi53aWR0aCwgY3R4KTsKIAogCW11dGV4X2xvY2soJmFyLT5jb25mX211dGV4KTsKQEAgLTcxNTgsNyArNzE5Niw3IEBACiAJc3RydWN0IGF0aDEwayAqYXIgPSBody0+cHJpdjsKIAogCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfTUFDLAotCQkgICAibWFjIGNoYW5jdHggcmVtb3ZlIGZyZXEgJWh1IHdpZHRoICVkIHB0ciAlcFxuIiwKKwkJICAgIm1hYyBjaGFuY3R4IHJlbW92ZSBmcmVxICVodSB3aWR0aCAlZCBwdHIgJXBLXG4iLAogCQkgICBjdHgtPmRlZi5jaGFuLT5jZW50ZXJfZnJlcSwgY3R4LT5kZWYud2lkdGgsIGN0eCk7CiAKIAltdXRleF9sb2NrKCZhci0+Y29uZl9tdXRleCk7CkBAIC03MjIzLDcgKzcyNjEsNyBAQAogCW11dGV4X2xvY2soJmFyLT5jb25mX211dGV4KTsKIAogCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfTUFDLAotCQkgICAibWFjIGNoYW5jdHggY2hhbmdlIGZyZXEgJWh1IHdpZHRoICVkIHB0ciAlcCBjaGFuZ2VkICV4XG4iLAorCQkgICAibWFjIGNoYW5jdHggY2hhbmdlIGZyZXEgJWh1IHdpZHRoICVkIHB0ciAlcEsgY2hhbmdlZCAleFxuIiwKIAkJICAgY3R4LT5kZWYuY2hhbi0+Y2VudGVyX2ZyZXEsIGN0eC0+ZGVmLndpZHRoLCBjdHgsIGNoYW5nZWQpOwogCiAJLyogVGhpcyBzaG91bGRuJ3QgcmVhbGx5IGhhcHBlbiBiZWNhdXNlIGNoYW5uZWwgc3dpdGNoaW5nIHNob3VsZCB1c2UKQEAgLTcyODEsNyArNzMxOSw3IEBACiAJbXV0ZXhfbG9jaygmYXItPmNvbmZfbXV0ZXgpOwogCiAJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19NQUMsCi0JCSAgICJtYWMgY2hhbmN0eCBhc3NpZ24gcHRyICVwIHZkZXZfaWQgJWlcbiIsCisJCSAgICJtYWMgY2hhbmN0eCBhc3NpZ24gcHRyICVwSyB2ZGV2X2lkICVpXG4iLAogCQkgICBjdHgsIGFydmlmLT52ZGV2X2lkKTsKIAogCWlmIChXQVJOX09OKGFydmlmLT5pc19zdGFydGVkKSkgewpAQCAtNzM0Miw3ICs3MzgwLDcgQEAKIAltdXRleF9sb2NrKCZhci0+Y29uZl9tdXRleCk7CiAKIAlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX01BQywKLQkJICAgIm1hYyBjaGFuY3R4IHVuYXNzaWduIHB0ciAlcCB2ZGV2X2lkICVpXG4iLAorCQkgICAibWFjIGNoYW5jdHggdW5hc3NpZ24gcHRyICVwSyB2ZGV2X2lkICVpXG4iLAogCQkgICBjdHgsIGFydmlmLT52ZGV2X2lkKTsKIAogCVdBUk5fT04oIWFydmlmLT5pc19zdGFydGVkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvcGNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3BjaS5jCmluZGV4IDlhMjJjNDcuLjA0NTdlMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvcGNpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9wY2kuYwpAQCAtMTUwNiwxMiArMTUwNiwxMCBAQAogCWF0aDEwa19jZV9wZXJfZW5naW5lX3NlcnZpY2UoYXIsIHBpcGUpOwogfQogCi12b2lkIGF0aDEwa19wY2lfa2lsbF90YXNrbGV0KHN0cnVjdCBhdGgxMGsgKmFyKQorc3RhdGljIHZvaWQgYXRoMTBrX3BjaV9yeF9yZXRyeV9zeW5jKHN0cnVjdCBhdGgxMGsgKmFyKQogewogCXN0cnVjdCBhdGgxMGtfcGNpICphcl9wY2kgPSBhdGgxMGtfcGNpX3ByaXYoYXIpOwogCi0JdGFza2xldF9raWxsKCZhcl9wY2ktPmludHJfdHEpOwotCiAJZGVsX3RpbWVyX3N5bmMoJmFyX3BjaS0+cnhfcG9zdF9yZXRyeSk7CiB9CiAKQEAgLTE1NzAsNyArMTU2OCw3IEBACiAJCQkJCQkgdWxfcGlwZSwgZGxfcGlwZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGF0aDEwa19wY2lfaXJxX21zaV9md19tYXNrKHN0cnVjdCBhdGgxMGsgKmFyKQordm9pZCBhdGgxMGtfcGNpX2lycV9tc2lfZndfbWFzayhzdHJ1Y3QgYXRoMTBrICphcikKIHsKIAl1MzIgdmFsOwogCkBAIC0xNjkzLDE0ICsxNjkxLDEyIEBACiBzdGF0aWMgdm9pZCBhdGgxMGtfcGNpX3R4X3BpcGVfY2xlYW51cChzdHJ1Y3QgYXRoMTBrX3BjaV9waXBlICpwY2lfcGlwZSkKIHsKIAlzdHJ1Y3QgYXRoMTBrICphcjsKLQlzdHJ1Y3QgYXRoMTBrX3BjaSAqYXJfcGNpOwogCXN0cnVjdCBhdGgxMGtfY2VfcGlwZSAqY2VfcGlwZTsKIAlzdHJ1Y3QgYXRoMTBrX2NlX3JpbmcgKmNlX3Jpbmc7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgaTsKIAogCWFyID0gcGNpX3BpcGUtPmhpZl9jZV9zdGF0ZTsKLQlhcl9wY2kgPSBhdGgxMGtfcGNpX3ByaXYoYXIpOwogCWNlX3BpcGUgPSBwY2lfcGlwZS0+Y2VfaGRsOwogCWNlX3JpbmcgPSBjZV9waXBlLT5zcmNfcmluZzsKIApAQCAtMTc1Myw3ICsxNzQ5LDcgQEAKIAogdm9pZCBhdGgxMGtfcGNpX2ZsdXNoKHN0cnVjdCBhdGgxMGsgKmFyKQogewotCWF0aDEwa19wY2lfa2lsbF90YXNrbGV0KGFyKTsKKwlhdGgxMGtfcGNpX3J4X3JldHJ5X3N5bmMoYXIpOwogCWF0aDEwa19wY2lfYnVmZmVyX2NsZWFudXAoYXIpOwogfQogCkBAIC0xNzgwLDYgKzE3NzYsOCBAQAogCWF0aDEwa19wY2lfaXJxX2Rpc2FibGUoYXIpOwogCWF0aDEwa19wY2lfaXJxX3N5bmMoYXIpOwogCWF0aDEwa19wY2lfZmx1c2goYXIpOworCW5hcGlfc3luY2hyb25pemUoJmFyLT5uYXBpKTsKKwluYXBpX2Rpc2FibGUoJmFyLT5uYXBpKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZhcl9wY2ktPnBzX2xvY2ssIGZsYWdzKTsKIAlXQVJOX09OKGFyX3BjaS0+cHNfd2FrZV9yZWZjb3VudCA+IDApOwpAQCAtMjUzMyw2ICsyNTMxLDcgQEAKIAkJYXRoMTBrX2VycihhciwgImNvdWxkIG5vdCB3YWtlIHVwIHRhcmdldCBDUFU6ICVkXG4iLCByZXQpOwogCQlnb3RvIGVycl9jZTsKIAl9CisJbmFwaV9lbmFibGUoJmFyLT5uYXBpKTsKIAogCXJldHVybiAwOwogCkBAIC0yNzI1LDcgKzI3MjQsNyBAQAogCXJldHVybiAwOwogCiBlcnJfZnJlZToKLQlrZnJlZShkYXRhKTsKKwlrZnJlZShjYWxkYXRhKTsKIAogCXJldHVybiAtRUlOVkFMOwogfQpAQCAtMjc3MiwzNSArMjc3MSw1MyBAQAogCQlyZXR1cm4gSVJRX05PTkU7CiAJfQogCi0JaWYgKGFyX3BjaS0+b3Blcl9pcnFfbW9kZSA9PSBBVEgxMEtfUENJX0lSUV9MRUdBQ1kpIHsKLQkJaWYgKCFhdGgxMGtfcGNpX2lycV9wZW5kaW5nKGFyKSkKLQkJCXJldHVybiBJUlFfTk9ORTsKKwlpZiAoKGFyX3BjaS0+b3Blcl9pcnFfbW9kZSA9PSBBVEgxMEtfUENJX0lSUV9MRUdBQ1kpICYmCisJICAgICFhdGgxMGtfcGNpX2lycV9wZW5kaW5nKGFyKSkKKwkJcmV0dXJuIElSUV9OT05FOwogCi0JCWF0aDEwa19wY2lfZGlzYWJsZV9hbmRfY2xlYXJfbGVnYWN5X2lycShhcik7Ci0JfQotCi0JdGFza2xldF9zY2hlZHVsZSgmYXJfcGNpLT5pbnRyX3RxKTsKKwlhdGgxMGtfcGNpX2Rpc2FibGVfYW5kX2NsZWFyX2xlZ2FjeV9pcnEoYXIpOworCWF0aDEwa19wY2lfaXJxX21zaV9md19tYXNrKGFyKTsKKwluYXBpX3NjaGVkdWxlKCZhci0+bmFwaSk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyB2b2lkIGF0aDEwa19wY2lfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCitzdGF0aWMgaW50IGF0aDEwa19wY2lfbmFwaV9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqY3R4LCBpbnQgYnVkZ2V0KQogewotCXN0cnVjdCBhdGgxMGsgKmFyID0gKHN0cnVjdCBhdGgxMGsgKilkYXRhOwotCXN0cnVjdCBhdGgxMGtfcGNpICphcl9wY2kgPSBhdGgxMGtfcGNpX3ByaXYoYXIpOworCXN0cnVjdCBhdGgxMGsgKmFyID0gY29udGFpbmVyX29mKGN0eCwgc3RydWN0IGF0aDEwaywgbmFwaSk7CisJaW50IGRvbmUgPSAwOwogCiAJaWYgKGF0aDEwa19wY2lfaGFzX2Z3X2NyYXNoZWQoYXIpKSB7Ci0JCWF0aDEwa19wY2lfaXJxX2Rpc2FibGUoYXIpOwogCQlhdGgxMGtfcGNpX2Z3X2NyYXNoZWRfY2xlYXIoYXIpOwogCQlhdGgxMGtfcGNpX2Z3X2NyYXNoZWRfZHVtcChhcik7Ci0JCXJldHVybjsKKwkJbmFwaV9jb21wbGV0ZShjdHgpOworCQlyZXR1cm4gZG9uZTsKIAl9CiAKIAlhdGgxMGtfY2VfcGVyX2VuZ2luZV9zZXJ2aWNlX2FueShhcik7CiAKLQkvKiBSZS1lbmFibGUgbGVnYWN5IGlycSB0aGF0IHdhcyBkaXNhYmxlZCBpbiB0aGUgaXJxIGhhbmRsZXIgKi8KLQlpZiAoYXJfcGNpLT5vcGVyX2lycV9tb2RlID09IEFUSDEwS19QQ0lfSVJRX0xFR0FDWSkKKwlkb25lID0gYXRoMTBrX2h0dF90eHJ4X2NvbXBsX3Rhc2soYXIsIGJ1ZGdldCk7CisKKwlpZiAoZG9uZSA8IGJ1ZGdldCkgeworCQluYXBpX2NvbXBsZXRlKGN0eCk7CisJCS8qIEluIGNhc2Ugb2YgTVNJLCBpdCBpcyBwb3NzaWJsZSB0aGF0IGludGVycnVwdHMgYXJlIHJlY2VpdmVkCisJCSAqIHdoaWxlIE5BUEkgcG9sbCBpcyBpbnByb2dyZXNzLiBTbyBwZW5kaW5nIGludGVycnVwdHMgdGhhdCBhcmUKKwkJICogcmVjZWl2ZWQgYWZ0ZXIgcHJvY2Vzc2luZyBhbGwgY29weSBlbmdpbmUgcGlwZXMgYnkgTkFQSSBwb2xsCisJCSAqIHdpbGwgbm90IGJlIGhhbmRsZWQgYWdhaW4uIFRoaXMgaXMgY2F1c2luZyBmYWlsdXJlIHRvCisJCSAqIGNvbXBsZXRlIGJvb3Qgc2VxdWVuY2UgaW4geDg2IHBsYXRmb3JtLiBTbyBiZWZvcmUgZW5hYmxpbmcKKwkJICogaW50ZXJydXB0cyBzYWZlciB0byBjaGVjayBmb3IgcGVuZGluZyBpbnRlcnJ1cHRzIGZvcgorCQkgKiBpbW1lZGlhdGUgc2VydmljaW5nLgorCQkgKi8KKwkJaWYgKENFX0lOVEVSUlVQVF9TVU1NQVJZKGFyKSkgeworCQkJbmFwaV9yZXNjaGVkdWxlKGN0eCk7CisJCQlnb3RvIG91dDsKKwkJfQogCQlhdGgxMGtfcGNpX2VuYWJsZV9sZWdhY3lfaXJxKGFyKTsKKwkJYXRoMTBrX3BjaV9pcnFfbXNpX2Z3X3VubWFzayhhcik7CisJfQorCitvdXQ6CisJcmV0dXJuIGRvbmU7CiB9CiAKIHN0YXRpYyBpbnQgYXRoMTBrX3BjaV9yZXF1ZXN0X2lycV9tc2koc3RydWN0IGF0aDEwayAqYXIpCkBAIC0yODU4LDExICsyODc1LDEwIEBACiAJZnJlZV9pcnEoYXJfcGNpLT5wZGV2LT5pcnEsIGFyKTsKIH0KIAotdm9pZCBhdGgxMGtfcGNpX2luaXRfaXJxX3Rhc2tsZXRzKHN0cnVjdCBhdGgxMGsgKmFyKQordm9pZCBhdGgxMGtfcGNpX2luaXRfbmFwaShzdHJ1Y3QgYXRoMTBrICphcikKIHsKLQlzdHJ1Y3QgYXRoMTBrX3BjaSAqYXJfcGNpID0gYXRoMTBrX3BjaV9wcml2KGFyKTsKLQotCXRhc2tsZXRfaW5pdCgmYXJfcGNpLT5pbnRyX3RxLCBhdGgxMGtfcGNpX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKWFyKTsKKwluZXRpZl9uYXBpX2FkZCgmYXItPm5hcGlfZGV2LCAmYXItPm5hcGksIGF0aDEwa19wY2lfbmFwaV9wb2xsLAorCQkgICAgICAgQVRIMTBLX05BUElfQlVER0VUKTsKIH0KIAogc3RhdGljIGludCBhdGgxMGtfcGNpX2luaXRfaXJxKHN0cnVjdCBhdGgxMGsgKmFyKQpAQCAtMjg3MCw3ICsyODg2LDcgQEAKIAlzdHJ1Y3QgYXRoMTBrX3BjaSAqYXJfcGNpID0gYXRoMTBrX3BjaV9wcml2KGFyKTsKIAlpbnQgcmV0OwogCi0JYXRoMTBrX3BjaV9pbml0X2lycV90YXNrbGV0cyhhcik7CisJYXRoMTBrX3BjaV9pbml0X25hcGkoYXIpOwogCiAJaWYgKGF0aDEwa19wY2lfaXJxX21vZGUgIT0gQVRIMTBLX1BDSV9JUlFfQVVUTykKIAkJYXRoMTBrX2luZm8oYXIsICJsaW1pdGluZyBpcnEgbW9kZSB0bzogJWRcbiIsCkBAIC0zMDYyLDcgKzMwNzgsNyBAQAogCQlnb3RvIGVycl9tYXN0ZXI7CiAJfQogCi0JYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19CT09ULCAiYm9vdCBwY2lfbWVtIDB4JXBcbiIsIGFyX3BjaS0+bWVtKTsKKwlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0JPT1QsICJib290IHBjaV9tZW0gMHglcEtcbiIsIGFyX3BjaS0+bWVtKTsKIAlyZXR1cm4gMDsKIAogZXJyX21hc3RlcjoKQEAgLTMxMzEsNyArMzE0Nyw4IEBACiAKIHZvaWQgYXRoMTBrX3BjaV9yZWxlYXNlX3Jlc291cmNlKHN0cnVjdCBhdGgxMGsgKmFyKQogewotCWF0aDEwa19wY2lfa2lsbF90YXNrbGV0KGFyKTsKKwlhdGgxMGtfcGNpX3J4X3JldHJ5X3N5bmMoYXIpOworCW5ldGlmX25hcGlfZGVsKCZhci0+bmFwaSk7CiAJYXRoMTBrX3BjaV9jZV9kZWluaXQoYXIpOwogCWF0aDEwa19wY2lfZnJlZV9waXBlcyhhcik7CiB9CkBAIC0zMTYyLDcgKzMxNzksNiBAQAogCQlwY2lfaGFyZF9yZXNldCA9IGF0aDEwa19wY2lfcWNhOTg4eF9jaGlwX3Jlc2V0OwogCQlicmVhazsKIAljYXNlIFFDQTk4ODdfMV8wX0RFVklDRV9JRDoKLQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIlFDQTk4ODcgc3VwcG9ydCBpcyBzdGlsbCBleHBlcmltZW50YWwsIHRoZXJlIGFyZSBsaWtlbHkgYnVncy4gWW91IGhhdmUgYmVlbiB3YXJuZWQuXG4iKTsKIAkJaHdfcmV2ID0gQVRIMTBLX0hXX1FDQTk4ODc7CiAJCXBjaV9wcyA9IGZhbHNlOwogCQlwY2lfc29mdF9yZXNldCA9IGF0aDEwa19wY2lfd2FybV9yZXNldDsKQEAgLTMyOTgsNyArMzMxNCw3IEBACiAKIGVycl9mcmVlX2lycToKIAlhdGgxMGtfcGNpX2ZyZWVfaXJxKGFyKTsKLQlhdGgxMGtfcGNpX2tpbGxfdGFza2xldChhcik7CisJYXRoMTBrX3BjaV9yeF9yZXRyeV9zeW5jKGFyKTsKIAogZXJyX2RlaW5pdF9pcnE6CiAJYXRoMTBrX3BjaV9kZWluaXRfaXJxKGFyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvcGNpLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3BjaS5oCmluZGV4IDZlY2ExZGYuLjk4NTRhZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvcGNpLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9wY2kuaApAQCAtMTc3LDggKzE3Nyw2IEBACiAJLyogT3BlcmF0aW5nIGludGVycnVwdCBtb2RlICovCiAJZW51bSBhdGgxMGtfcGNpX2lycV9tb2RlIG9wZXJfaXJxX21vZGU7CiAKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgaW50cl90cTsKLQogCXN0cnVjdCBhdGgxMGtfcGNpX3BpcGUgcGlwZV9pbmZvW0NFX0NPVU5UX01BWF07CiAKIAkvKiBDb3B5IEVuZ2luZSB1c2VkIGZvciBEaWFnbm9zdGljIEFjY2Vzc2VzICovCkBAIC0yOTQsOCArMjkyLDcgQEAKIHZvaWQgYXRoMTBrX3BjaV9mcmVlX3BpcGVzKHN0cnVjdCBhdGgxMGsgKmFyKTsKIHZvaWQgYXRoMTBrX3BjaV9yeF9yZXBsZW5pc2hfcmV0cnkodW5zaWduZWQgbG9uZyBwdHIpOwogdm9pZCBhdGgxMGtfcGNpX2NlX2RlaW5pdChzdHJ1Y3QgYXRoMTBrICphcik7Ci12b2lkIGF0aDEwa19wY2lfaW5pdF9pcnFfdGFza2xldHMoc3RydWN0IGF0aDEwayAqYXIpOwotdm9pZCBhdGgxMGtfcGNpX2tpbGxfdGFza2xldChzdHJ1Y3QgYXRoMTBrICphcik7Cit2b2lkIGF0aDEwa19wY2lfaW5pdF9uYXBpKHN0cnVjdCBhdGgxMGsgKmFyKTsKIGludCBhdGgxMGtfcGNpX2luaXRfcGlwZXMoc3RydWN0IGF0aDEwayAqYXIpOwogaW50IGF0aDEwa19wY2lfaW5pdF9jb25maWcoc3RydWN0IGF0aDEwayAqYXIpOwogdm9pZCBhdGgxMGtfcGNpX3J4X3Bvc3Qoc3RydWN0IGF0aDEwayAqYXIpOwpAQCAtMzAzLDYgKzMwMCw3IEBACiB2b2lkIGF0aDEwa19wY2lfZW5hYmxlX2xlZ2FjeV9pcnEoc3RydWN0IGF0aDEwayAqYXIpOwogYm9vbCBhdGgxMGtfcGNpX2lycV9wZW5kaW5nKHN0cnVjdCBhdGgxMGsgKmFyKTsKIHZvaWQgYXRoMTBrX3BjaV9kaXNhYmxlX2FuZF9jbGVhcl9sZWdhY3lfaXJxKHN0cnVjdCBhdGgxMGsgKmFyKTsKK3ZvaWQgYXRoMTBrX3BjaV9pcnFfbXNpX2Z3X21hc2soc3RydWN0IGF0aDEwayAqYXIpOwogaW50IGF0aDEwa19wY2lfd2FpdF9mb3JfdGFyZ2V0X2luaXQoc3RydWN0IGF0aDEwayAqYXIpOwogaW50IGF0aDEwa19wY2lfc2V0dXBfcmVzb3VyY2Uoc3RydWN0IGF0aDEwayAqYXIpOwogdm9pZCBhdGgxMGtfcGNpX3JlbGVhc2VfcmVzb3VyY2Uoc3RydWN0IGF0aDEwayAqYXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9zd2FwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3N3YXAuYwppbmRleCAwYzVmNTg2Li5hZGY0NTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3N3YXAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3N3YXAuYwpAQCAtMTM0LDE3ICsxMzQsMTggQEAKIAlyZXR1cm4gc2VnX2luZm87CiB9CiAKLWludCBhdGgxMGtfc3dhcF9jb2RlX3NlZ19jb25maWd1cmUoc3RydWN0IGF0aDEwayAqYXIpCitpbnQgYXRoMTBrX3N3YXBfY29kZV9zZWdfY29uZmlndXJlKHN0cnVjdCBhdGgxMGsgKmFyLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBhdGgxMGtfZndfZmlsZSAqZndfZmlsZSkKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBhdGgxMGtfc3dhcF9jb2RlX3NlZ19pbmZvICpzZWdfaW5mbyA9IE5VTEw7CiAKLQlpZiAoIWFyLT5zd2FwLmZpcm13YXJlX3N3YXBfY29kZV9zZWdfaW5mbykKKwlpZiAoIWZ3X2ZpbGUtPmZpcm13YXJlX3N3YXBfY29kZV9zZWdfaW5mbykKIAkJcmV0dXJuIDA7CiAKIAlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0JPT1QsICJib290IGZvdW5kIGZpcm13YXJlIGNvZGUgc3dhcCBiaW5hcnlcbiIpOwogCi0Jc2VnX2luZm8gPSBhci0+c3dhcC5maXJtd2FyZV9zd2FwX2NvZGVfc2VnX2luZm87CisJc2VnX2luZm8gPSBmd19maWxlLT5maXJtd2FyZV9zd2FwX2NvZGVfc2VnX2luZm87CiAKIAlyZXQgPSBhdGgxMGtfYm1pX3dyaXRlX21lbW9yeShhciwgc2VnX2luZm8tPnRhcmdldF9hZGRyLAogCQkJCSAgICAgICZzZWdfaW5mby0+c2VnX2h3X2luZm8sCkBAIC0xNTgsMjggKzE1OSwyOSBAQAogCXJldHVybiAwOwogfQogCi12b2lkIGF0aDEwa19zd2FwX2NvZGVfc2VnX3JlbGVhc2Uoc3RydWN0IGF0aDEwayAqYXIpCit2b2lkIGF0aDEwa19zd2FwX2NvZGVfc2VnX3JlbGVhc2Uoc3RydWN0IGF0aDEwayAqYXIsCisJCQkJICBzdHJ1Y3QgYXRoMTBrX2Z3X2ZpbGUgKmZ3X2ZpbGUpCiB7Ci0JYXRoMTBrX3N3YXBfY29kZV9zZWdfZnJlZShhciwgYXItPnN3YXAuZmlybXdhcmVfc3dhcF9jb2RlX3NlZ19pbmZvKTsKKwlhdGgxMGtfc3dhcF9jb2RlX3NlZ19mcmVlKGFyLCBmd19maWxlLT5maXJtd2FyZV9zd2FwX2NvZGVfc2VnX2luZm8pOwogCiAJLyogRklYTUU6IHRoZXNlIHR3byBhc3NpZ25tZW50cyBsb29rIHRvIGJlaW4gd3JvbmcgcGxhY2UhIFNob3VsZG4ndAogCSAqIHRoZXkgYmUgaW4gYXRoMTBrX2NvcmVfZnJlZV9maXJtd2FyZV9maWxlcygpIGxpa2UgdGhlIHJlc3Q/CiAJICovCi0JYXItPm5vcm1hbF9tb2RlX2Z3LmZ3X2ZpbGUuY29kZXN3YXBfZGF0YSA9IE5VTEw7Ci0JYXItPm5vcm1hbF9tb2RlX2Z3LmZ3X2ZpbGUuY29kZXN3YXBfbGVuID0gMDsKKwlmd19maWxlLT5jb2Rlc3dhcF9kYXRhID0gTlVMTDsKKwlmd19maWxlLT5jb2Rlc3dhcF9sZW4gPSAwOwogCi0JYXItPnN3YXAuZmlybXdhcmVfc3dhcF9jb2RlX3NlZ19pbmZvID0gTlVMTDsKKwlmd19maWxlLT5maXJtd2FyZV9zd2FwX2NvZGVfc2VnX2luZm8gPSBOVUxMOwogfQogCi1pbnQgYXRoMTBrX3N3YXBfY29kZV9zZWdfaW5pdChzdHJ1Y3QgYXRoMTBrICphcikKK2ludCBhdGgxMGtfc3dhcF9jb2RlX3NlZ19pbml0KHN0cnVjdCBhdGgxMGsgKmFyLCBzdHJ1Y3QgYXRoMTBrX2Z3X2ZpbGUgKmZ3X2ZpbGUpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgYXRoMTBrX3N3YXBfY29kZV9zZWdfaW5mbyAqc2VnX2luZm87CiAJY29uc3Qgdm9pZCAqY29kZXN3YXBfZGF0YTsKIAlzaXplX3QgY29kZXN3YXBfbGVuOwogCi0JY29kZXN3YXBfZGF0YSA9IGFyLT5ub3JtYWxfbW9kZV9mdy5md19maWxlLmNvZGVzd2FwX2RhdGE7Ci0JY29kZXN3YXBfbGVuID0gYXItPm5vcm1hbF9tb2RlX2Z3LmZ3X2ZpbGUuY29kZXN3YXBfbGVuOworCWNvZGVzd2FwX2RhdGEgPSBmd19maWxlLT5jb2Rlc3dhcF9kYXRhOworCWNvZGVzd2FwX2xlbiA9IGZ3X2ZpbGUtPmNvZGVzd2FwX2xlbjsKIAogCWlmICghY29kZXN3YXBfbGVuIHx8ICFjb2Rlc3dhcF9kYXRhKQogCQlyZXR1cm4gMDsKQEAgLTIwMCw3ICsyMDIsNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCWFyLT5zd2FwLmZpcm13YXJlX3N3YXBfY29kZV9zZWdfaW5mbyA9IHNlZ19pbmZvOworCWZ3X2ZpbGUtPmZpcm13YXJlX3N3YXBfY29kZV9zZWdfaW5mbyA9IHNlZ19pbmZvOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3N3YXAuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvc3dhcC5oCmluZGV4IDM2OTkxYzcuLmY1ZGMwNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvc3dhcC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvc3dhcC5oCkBAIC0yMyw2ICsyMyw4IEBACiAvKiBDdXJyZW50bHkgb25seSBvbmUgc3dhcCBzZWdtZW50IGlzIHN1cHBvcnRlZCAqLwogI2RlZmluZSBBVEgxMEtfU1dBUF9DT0RFX1NFR19OVU1fU1VQUE9SVEVECTEKIAorc3RydWN0IGF0aDEwa19md19maWxlOworCiBzdHJ1Y3QgYXRoMTBrX3N3YXBfY29kZV9zZWdfdGx2IHsKIAlfX2xlMzIgYWRkcmVzczsKIAlfX2xlMzIgbGVuZ3RoOwpAQCAtNTgsOCArNjAsMTEgQEAKIAlkbWFfYWRkcl90IHBhZGRyW0FUSDEwS19TV0FQX0NPREVfU0VHX05VTV9TVVBQT1JURURdOwogfTsKIAotaW50IGF0aDEwa19zd2FwX2NvZGVfc2VnX2NvbmZpZ3VyZShzdHJ1Y3QgYXRoMTBrICphcik7Ci12b2lkIGF0aDEwa19zd2FwX2NvZGVfc2VnX3JlbGVhc2Uoc3RydWN0IGF0aDEwayAqYXIpOwotaW50IGF0aDEwa19zd2FwX2NvZGVfc2VnX2luaXQoc3RydWN0IGF0aDEwayAqYXIpOworaW50IGF0aDEwa19zd2FwX2NvZGVfc2VnX2NvbmZpZ3VyZShzdHJ1Y3QgYXRoMTBrICphciwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgYXRoMTBrX2Z3X2ZpbGUgKmZ3X2ZpbGUpOwordm9pZCBhdGgxMGtfc3dhcF9jb2RlX3NlZ19yZWxlYXNlKHN0cnVjdCBhdGgxMGsgKmFyLAorCQkJCSAgc3RydWN0IGF0aDEwa19md19maWxlICpmd19maWxlKTsKK2ludCBhdGgxMGtfc3dhcF9jb2RlX3NlZ19pbml0KHN0cnVjdCBhdGgxMGsgKmFyLAorCQkJICAgICAgc3RydWN0IGF0aDEwa19md19maWxlICpmd19maWxlKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3RhcmdhZGRycy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway90YXJnYWRkcnMuaAppbmRleCBhYWY1M2E4Li5hNDdjYWI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3RhcmdhZGRycy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvdGFyZ2FkZHJzLmgKQEAgLTQwNSw3ICs0MDUsNyBAQAogICogMS4gdGFyZ2V0IGZpcm13YXJlIHdvdWxkIGNoZWNrIG1hZ2ljIG51bWJlciBhbmQgaWYgaXQncyBhIG1hdGNoLCBmaXJtd2FyZQogICogICAgd291bGQgY29uc2lkZXIgdGhlIGJpdHNbMDoxNV0gYXJlIHZhbGlkIGFuZCBiYXNlIG9uIHRoYXQgdG8gY2FsY3VsYXRlCiAgKiAgICB0aGUgZW5kIG9mIERSQU0uIEVhcmx5IGFsbG9jYXRpb24gd291bGQgYmUgbG9jYXRlZCBhdCB0aGF0IGFyZWEgYW5kCi0gKiAgICBtYXkgYmUgcmVjbGFpbWVkIHdoZW4gbmVjZXNhcnkKKyAqICAgIG1heSBiZSByZWNsYWltZWQgd2hlbiBuZWNlc3NhcnkKICAqIDIuIGlmIG5vIG1hZ2ljIG51bWJlciBpcyBmb3VuZCwgZWFybHkgYWxsb2NhdGlvbiB3b3VsZCBoYXBwZW4gYXQgIl9lbmQiCiAgKiAgICBzeW1ib2wgb2YgUk9NIHdoaWNoIGlzIGxvY2F0ZWQgYmVmb3JlIHRoZSBhcHAtZGF0YSBhbmQgbWlnaHQgTk9UIGJlCiAgKiAgICByZS1jbGFpbWFibGUuIElmIHRoaXMgaXMgYWRvcHRlZCwgbGluayBzY3JpcHQgc2hvdWxkIGtlZXAgdGhpcyBpbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway90ZXN0bW9kZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway90ZXN0bW9kZS5jCmluZGV4IDEyMGY0MjMuLmVkODVmOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvdGVzdG1vZGUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3Rlc3Rtb2RlLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlICJ3bWkuaCIKICNpbmNsdWRlICJoaWYuaCIKICNpbmNsdWRlICJody5oIgorI2luY2x1ZGUgImNvcmUuaCIKIAogI2luY2x1ZGUgInRlc3Rtb2RlX2kuaCIKIApAQCAtNDUsNyArNDYsNyBAQAogCWludCByZXQ7CiAKIAlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX1RFU1RNT0RFLAotCQkgICAidGVzdG1vZGUgZXZlbnQgd21pIGNtZF9pZCAlZCBza2IgJXAgc2tiLT5sZW4gJWRcbiIsCisJCSAgICJ0ZXN0bW9kZSBldmVudCB3bWkgY21kX2lkICVkIHNrYiAlcEsgc2tiLT5sZW4gJWRcbiIsCiAJCSAgIGNtZF9pZCwgc2tiLCBza2ItPmxlbik7CiAKIAlhdGgxMGtfZGJnX2R1bXAoYXIsIEFUSDEwS19EQkdfVEVTVE1PREUsIE5VTEwsICIiLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKQEAgLTI0MCw2ICsyNDEsMTggQEAKIAkJZ290byBlcnI7CiAJfQogCisJaWYgKGFyLT50ZXN0bW9kZS51dGZfbW9kZV9mdy5md19maWxlLmNvZGVzd2FwX2RhdGEgJiYKKwkgICAgYXItPnRlc3Rtb2RlLnV0Zl9tb2RlX2Z3LmZ3X2ZpbGUuY29kZXN3YXBfbGVuKSB7CisJCXJldCA9IGF0aDEwa19zd2FwX2NvZGVfc2VnX2luaXQoYXIsCisJCQkJCQkmYXItPnRlc3Rtb2RlLnV0Zl9tb2RlX2Z3LmZ3X2ZpbGUpOworCQlpZiAocmV0KSB7CisJCQlhdGgxMGtfd2FybihhciwKKwkJCQkgICAgImZhaWxlZCB0byBpbml0IHV0ZiBjb2RlIHN3YXAgc2VnbWVudDogJWRcbiIsCisJCQkJICAgIHJldCk7CisJCQlnb3RvIGVycl9yZWxlYXNlX3V0Zl9tb2RlX2Z3OworCQl9CisJfQorCiAJc3Bpbl9sb2NrX2JoKCZhci0+ZGF0YV9sb2NrKTsKIAlhci0+dGVzdG1vZGUudXRmX21vbml0b3IgPSB0cnVlOwogCXNwaW5fdW5sb2NrX2JoKCZhci0+ZGF0YV9sb2NrKTsKQEAgLTI3OSw2ICsyOTIsMTEgQEAKIAlhdGgxMGtfaGlmX3Bvd2VyX2Rvd24oYXIpOwogCiBlcnJfcmVsZWFzZV91dGZfbW9kZV9mdzoKKwlpZiAoYXItPnRlc3Rtb2RlLnV0Zl9tb2RlX2Z3LmZ3X2ZpbGUuY29kZXN3YXBfZGF0YSAmJgorCSAgICBhci0+dGVzdG1vZGUudXRmX21vZGVfZncuZndfZmlsZS5jb2Rlc3dhcF9sZW4pCisJCWF0aDEwa19zd2FwX2NvZGVfc2VnX3JlbGVhc2UoYXIsCisJCQkJCSAgICAgJmFyLT50ZXN0bW9kZS51dGZfbW9kZV9mdy5md19maWxlKTsKKwogCXJlbGVhc2VfZmlybXdhcmUoYXItPnRlc3Rtb2RlLnV0Zl9tb2RlX2Z3LmZ3X2ZpbGUuZmlybXdhcmUpOwogCWFyLT50ZXN0bW9kZS51dGZfbW9kZV9mdy5md19maWxlLmZpcm13YXJlID0gTlVMTDsKIApAQCAtMzAxLDYgKzMxOSwxMSBAQAogCiAJc3Bpbl91bmxvY2tfYmgoJmFyLT5kYXRhX2xvY2spOwogCisJaWYgKGFyLT50ZXN0bW9kZS51dGZfbW9kZV9mdy5md19maWxlLmNvZGVzd2FwX2RhdGEgJiYKKwkgICAgYXItPnRlc3Rtb2RlLnV0Zl9tb2RlX2Z3LmZ3X2ZpbGUuY29kZXN3YXBfbGVuKQorCQlhdGgxMGtfc3dhcF9jb2RlX3NlZ19yZWxlYXNlKGFyLAorCQkJCQkgICAgICZhci0+dGVzdG1vZGUudXRmX21vZGVfZncuZndfZmlsZSk7CisKIAlyZWxlYXNlX2Zpcm13YXJlKGFyLT50ZXN0bW9kZS51dGZfbW9kZV9mdy5md19maWxlLmZpcm13YXJlKTsKIAlhci0+dGVzdG1vZGUudXRmX21vZGVfZncuZndfZmlsZS5maXJtd2FyZSA9IE5VTEw7CiAKQEAgLTM2MCw3ICszODMsNyBAQAogCWNtZF9pZCA9IG5sYV9nZXRfdTMyKHRiW0FUSDEwS19UTV9BVFRSX1dNSV9DTURJRF0pOwogCiAJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19URVNUTU9ERSwKLQkJICAgInRlc3Rtb2RlIGNtZCB3bWkgY21kX2lkICVkIGJ1ZiAlcCBidWZfbGVuICVkXG4iLAorCQkgICAidGVzdG1vZGUgY21kIHdtaSBjbWRfaWQgJWQgYnVmICVwSyBidWZfbGVuICVkXG4iLAogCQkgICBjbWRfaWQsIGJ1ZiwgYnVmX2xlbik7CiAKIAlhdGgxMGtfZGJnX2R1bXAoYXIsIEFUSDEwS19EQkdfVEVTVE1PREUsIE5VTEwsICIiLCBidWYsIGJ1Zl9sZW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway90aGVybWFsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3RoZXJtYWwuYwppbmRleCA0NDRiNTJjLi4wYTQ3MjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3RoZXJtYWwuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3RoZXJtYWwuYwpAQCAtMTkyLDcgKzE5Miw3IEBACiAKIAkvKiBBdm9pZCBsaW5raW5nIGVycm9yIG9uIGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzLCBJCiAJICogZ3Vlc3MgbGludXgvaHdtb24uaCBpcyBtaXNzaW5nIHByb3BlciBzdHVicy4gKi8KLQlpZiAoIWNvbmZpZ19lbmFibGVkKENPTkZJR19IV01PTikpCisJaWYgKCFJU19SRUFDSEFCTEUoQ09ORklHX0hXTU9OKSkKIAkJcmV0dXJuIDA7CiAKIAlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3Vwcyhhci0+ZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway90eHJ4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3R4cnguYwppbmRleCBiMjlhODZhLi45ODUyYzVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3R4cnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3R4cnguYwpAQCAtNDQsNyArNDQsNyBAQAogCWNvbXBsZXRlKCZhci0+b2ZmY2hhbl90eF9jb21wbGV0ZWQpOwogCWFyLT5vZmZjaGFuX3R4X3NrYiA9IE5VTEw7IC8qIGp1c3QgZm9yIHNhbml0eSAqLwogCi0JYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19IVFQsICJjb21wbGV0ZWQgb2ZmY2hhbm5lbCBza2IgJXBcbiIsIHNrYik7CisJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19IVFQsICJjb21wbGV0ZWQgb2ZmY2hhbm5lbCBza2IgJXBLXG4iLCBza2IpOwogb3V0OgogCXNwaW5fdW5sb2NrX2JoKCZhci0+ZGF0YV9sb2NrKTsKIH0KQEAgLTExOSw4ICsxMTksNiBAQAogCWllZWU4MDIxMV90eF9zdGF0dXMoaHR0LT5hci0+aHcsIG1zZHUpOwogCS8qIHdlIGRvIG5vdCBvd24gdGhlIG1zZHUgYW55bW9yZSAqLwogCi0JYXRoMTBrX21hY190eF9wdXNoX3BlbmRpbmcoYXIpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvd21pLW9wcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway93bWktb3BzLmgKaW5kZXggNjRlYmQzMC4uYzlhOGJiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway93bWktb3BzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway93bWktb3BzLmgKQEAgLTUxLDYgKzUxLDggQEAKIAkJCSAgICBzdHJ1Y3Qgd21pX3JvYW1fZXZfYXJnICphcmcpOwogCWludCAoKnB1bGxfd293X2V2ZW50KShzdHJ1Y3QgYXRoMTBrICphciwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgIHN0cnVjdCB3bWlfd293X2V2X2FyZyAqYXJnKTsKKwlpbnQgKCpwdWxsX2VjaG9fZXYpKHN0cnVjdCBhdGgxMGsgKmFyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgIHN0cnVjdCB3bWlfZWNob19ldl9hcmcgKmFyZyk7CiAJZW51bSB3bWlfdHhiZl9jb25mICgqZ2V0X3R4YmZfY29uZl9zY2hlbWUpKHN0cnVjdCBhdGgxMGsgKmFyKTsKIAogCXN0cnVjdCBza19idWZmICooKmdlbl9wZGV2X3N1c3BlbmQpKHN0cnVjdCBhdGgxMGsgKmFyLCB1MzIgc3VzcGVuZF9vcHQpOwpAQCAtMTIzLDcgKzEyNSw3IEBACiAJCQkJCSAgICAgZW51bSB3bWlfZm9yY2VfZndfaGFuZ190eXBlIHR5cGUsCiAJCQkJCSAgICAgdTMyIGRlbGF5X21zKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqKCpnZW5fbWdtdF90eCkoc3RydWN0IGF0aDEwayAqYXIsIHN0cnVjdCBza19idWZmICpza2IpOwotCXN0cnVjdCBza19idWZmICooKmdlbl9kYmdsb2dfY2ZnKShzdHJ1Y3QgYXRoMTBrICphciwgdTMyIG1vZHVsZV9lbmFibGUsCisJc3RydWN0IHNrX2J1ZmYgKigqZ2VuX2RiZ2xvZ19jZmcpKHN0cnVjdCBhdGgxMGsgKmFyLCB1NjQgbW9kdWxlX2VuYWJsZSwKIAkJCQkJICB1MzIgbG9nX2xldmVsKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqKCpnZW5fcGt0bG9nX2VuYWJsZSkoc3RydWN0IGF0aDEwayAqYXIsIHUzMiBmaWx0ZXIpOwogCXN0cnVjdCBza19idWZmICooKmdlbl9wa3Rsb2dfZGlzYWJsZSkoc3RydWN0IGF0aDEwayAqYXIpOwpAQCAtMTk0LDYgKzE5Niw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKigqZ2VuX3BkZXZfYnNzX2NoYW5faW5mb19yZXEpCiAJCQkJCShzdHJ1Y3QgYXRoMTBrICphciwKIAkJCQkJIGVudW0gd21pX2Jzc19zdXJ2ZXlfcmVxX3R5cGUgdHlwZSk7CisJc3RydWN0IHNrX2J1ZmYgKigqZ2VuX2VjaG8pKHN0cnVjdCBhdGgxMGsgKmFyLCB1MzIgdmFsdWUpOwogfTsKIAogaW50IGF0aDEwa193bWlfY21kX3NlbmQoc3RydWN0IGF0aDEwayAqYXIsIHN0cnVjdCBza19idWZmICpza2IsIHUzMiBjbWRfaWQpOwpAQCAtMzQ5LDYgKzM1MiwxNiBAQAogCXJldHVybiBhci0+d21pLm9wcy0+cHVsbF93b3dfZXZlbnQoYXIsIHNrYiwgYXJnKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQKK2F0aDEwa193bWlfcHVsbF9lY2hvX2V2KHN0cnVjdCBhdGgxMGsgKmFyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJc3RydWN0IHdtaV9lY2hvX2V2X2FyZyAqYXJnKQoreworCWlmICghYXItPndtaS5vcHMtPnB1bGxfZWNob19ldikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJcmV0dXJuIGFyLT53bWkub3BzLT5wdWxsX2VjaG9fZXYoYXIsIHNrYiwgYXJnKTsKK30KKwogc3RhdGljIGlubGluZSBlbnVtIHdtaV90eGJmX2NvbmYKIGF0aDEwa193bWlfZ2V0X3R4YmZfY29uZl9zY2hlbWUoc3RydWN0IGF0aDEwayAqYXIpCiB7CkBAIC05MzIsNyArOTQ1LDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLWF0aDEwa193bWlfZGJnbG9nX2NmZyhzdHJ1Y3QgYXRoMTBrICphciwgdTMyIG1vZHVsZV9lbmFibGUsIHUzMiBsb2dfbGV2ZWwpCithdGgxMGtfd21pX2RiZ2xvZ19jZmcoc3RydWN0IGF0aDEwayAqYXIsIHU2NCBtb2R1bGVfZW5hYmxlLCB1MzIgbG9nX2xldmVsKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAKQEAgLTEzODIsNCArMTM5NSwyMCBAQAogCQkJCSAgIHdtaS0+Y21kLT5wZGV2X2Jzc19jaGFuX2luZm9fcmVxdWVzdF9jbWRpZCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50CithdGgxMGtfd21pX2VjaG8oc3RydWN0IGF0aDEwayAqYXIsIHUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgYXRoMTBrX3dtaSAqd21pID0gJmFyLT53bWk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWlmICghd21pLT5vcHMtPmdlbl9lY2hvKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlza2IgPSB3bWktPm9wcy0+Z2VuX2VjaG8oYXIsIHZhbHVlKTsKKwlpZiAoSVNfRVJSKHNrYikpCisJCXJldHVybiBQVFJfRVJSKHNrYik7CisKKwlyZXR1cm4gYXRoMTBrX3dtaV9jbWRfc2VuZChhciwgc2tiLCB3bWktPmNtZC0+ZWNob19jbWRpZCk7Cit9CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway93bWktdGx2LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS10bHYuYwppbmRleCBlMDkzMzdlLi5lNjRmNTkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS10bHYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS10bHYuYwpAQCAtMTIyMyw2ICsxMjIzLDMzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYXRoMTBrX3dtaV90bHZfb3BfcHVsbF9lY2hvX2V2KHN0cnVjdCBhdGgxMGsgKmFyLAorCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgc3RydWN0IHdtaV9lY2hvX2V2X2FyZyAqYXJnKQoreworCWNvbnN0IHZvaWQgKip0YjsKKwljb25zdCBzdHJ1Y3Qgd21pX2VjaG9fZXZlbnQgKmV2OworCWludCByZXQ7CisKKwl0YiA9IGF0aDEwa193bWlfdGx2X3BhcnNlX2FsbG9jKGFyLCBza2ItPmRhdGEsIHNrYi0+bGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAoSVNfRVJSKHRiKSkgeworCQlyZXQgPSBQVFJfRVJSKHRiKTsKKwkJYXRoMTBrX3dhcm4oYXIsICJmYWlsZWQgdG8gcGFyc2UgdGx2OiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlldiA9IHRiW1dNSV9UTFZfVEFHX1NUUlVDVF9FQ0hPX0VWRU5UXTsKKwlpZiAoIWV2KSB7CisJCWtmcmVlKHRiKTsKKwkJcmV0dXJuIC1FUFJPVE87CisJfQorCisJYXJnLT52YWx1ZSA9IGV2LT52YWx1ZTsKKworCWtmcmVlKHRiKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBza19idWZmICoKIGF0aDEwa193bWlfdGx2X29wX2dlbl9wZGV2X3N1c3BlbmQoc3RydWN0IGF0aDEwayAqYXIsIHUzMiBvcHQpCiB7CkBAIC0yNDQxLDcgKzI0NjgsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgotYXRoMTBrX3dtaV90bHZfb3BfZ2VuX2RiZ2xvZ19jZmcoc3RydWN0IGF0aDEwayAqYXIsIHUzMiBtb2R1bGVfZW5hYmxlLAorYXRoMTBrX3dtaV90bHZfb3BfZ2VuX2RiZ2xvZ19jZmcoc3RydWN0IGF0aDEwayAqYXIsIHU2NCBtb2R1bGVfZW5hYmxlLAogCQkJCSB1MzIgbG9nX2xldmVsKSB7CiAJc3RydWN0IHdtaV90bHZfZGJnbG9nX2NtZCAqY21kOwogCXN0cnVjdCB3bWlfdGx2ICp0bHY7CkBAIC0zMDgxLDYgKzMxMDgsMzQgQEAKIAlyZXR1cm4gc2tiOwogfQogCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgorYXRoMTBrX3dtaV90bHZfb3BfZ2VuX2VjaG8oc3RydWN0IGF0aDEwayAqYXIsIHUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgd21pX2VjaG9fY21kICpjbWQ7CisJc3RydWN0IHdtaV90bHYgKnRsdjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXZvaWQgKnB0cjsKKwlzaXplX3QgbGVuOworCisJbGVuID0gc2l6ZW9mKCp0bHYpICsgc2l6ZW9mKCpjbWQpOworCXNrYiA9IGF0aDEwa193bWlfYWxsb2Nfc2tiKGFyLCBsZW4pOworCWlmICghc2tiKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXB0ciA9ICh2b2lkICopc2tiLT5kYXRhOworCXRsdiA9IHB0cjsKKwl0bHYtPnRhZyA9IF9fY3B1X3RvX2xlMTYoV01JX1RMVl9UQUdfU1RSVUNUX0VDSE9fQ01EKTsKKwl0bHYtPmxlbiA9IF9fY3B1X3RvX2xlMTYoc2l6ZW9mKCpjbWQpKTsKKwljbWQgPSAodm9pZCAqKXRsdi0+dmFsdWU7CisJY21kLT52YWx1ZSA9IGNwdV90b19sZTMyKHZhbHVlKTsKKworCXB0ciArPSBzaXplb2YoKnRsdik7CisJcHRyICs9IHNpemVvZigqY21kKTsKKworCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfV01JLCAid21pIHRsdiBlY2hvIHZhbHVlIDB4JTA4eFxuIiwgdmFsdWUpOworCXJldHVybiBza2I7Cit9CisKIC8qKioqKioqKioqKioqKioqLwogLyogVExWIG1hcHBpbmdzICovCiAvKioqKioqKioqKioqKioqKi8KQEAgLTM0MjksNiArMzQ4NCw3IEBACiAJLnB1bGxfZndfc3RhdHMgPSBhdGgxMGtfd21pX3Rsdl9vcF9wdWxsX2Z3X3N0YXRzLAogCS5wdWxsX3JvYW1fZXYgPSBhdGgxMGtfd21pX3Rsdl9vcF9wdWxsX3JvYW1fZXYsCiAJLnB1bGxfd293X2V2ZW50ID0gYXRoMTBrX3dtaV90bHZfb3BfcHVsbF93b3dfZXYsCisJLnB1bGxfZWNob19ldiA9IGF0aDEwa193bWlfdGx2X29wX3B1bGxfZWNob19ldiwKIAkuZ2V0X3R4YmZfY29uZl9zY2hlbWUgPSBhdGgxMGtfd21pX3Rsdl90eGJmX2NvbmZfc2NoZW1lLAogCiAJLmdlbl9wZGV2X3N1c3BlbmQgPSBhdGgxMGtfd21pX3Rsdl9vcF9nZW5fcGRldl9zdXNwZW5kLApAQCAtMzQ4NSw2ICszNTQxLDcgQEAKIAkuZ2VuX2FkYXB0aXZlX3FjcyA9IGF0aDEwa193bWlfdGx2X29wX2dlbl9hZGFwdGl2ZV9xY3MsCiAJLmZ3X3N0YXRzX2ZpbGwgPSBhdGgxMGtfd21pX21haW5fb3BfZndfc3RhdHNfZmlsbCwKIAkuZ2V0X3ZkZXZfc3VidHlwZSA9IGF0aDEwa193bWlfb3BfZ2V0X3ZkZXZfc3VidHlwZSwKKwkuZ2VuX2VjaG8gPSBhdGgxMGtfd21pX3Rsdl9vcF9nZW5fZWNobywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgd21pX3BlZXJfZmxhZ3NfbWFwIHdtaV90bHZfcGVlcl9mbGFnc19tYXAgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway93bWkuYwppbmRleCBkMjQ2Mjg4Li41NGRmNDI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvd21pLmMKQEAgLTI5LDYgKzI5LDkgQEAKICNpbmNsdWRlICJwMnAuaCIKICNpbmNsdWRlICJody5oIgogCisjZGVmaW5lIEFUSDEwS19XTUlfQkFSUklFUl9FQ0hPX0lEIDB4QkE5OTFFOQorI2RlZmluZSBBVEgxMEtfV01JX0JBUlJJRVJfVElNRU9VVF9IWiAoMyAqIEhaKQorCiAvKiBNQUlOIFdNSSBjbWQgdHJhY2sgKi8KIHN0YXRpYyBzdHJ1Y3Qgd21pX2NtZF9tYXAgd21pX2NtZF9tYXAgPSB7CiAJLmluaXRfY21kaWQgPSBXTUlfSU5JVF9DTURJRCwKQEAgLTE4NzQsNyArMTg3Nyw3IEBACiAJZXRoZXJfYWRkcl9jb3B5KGNtZC0+aGRyLnBlZXJfbWFjYWRkci5hZGRyLCBpZWVlODAyMTFfZ2V0X0RBKGhkcikpOwogCW1lbWNweShjbWQtPmJ1ZiwgbXNkdS0+ZGF0YSwgbXNkdS0+bGVuKTsKIAotCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfV01JLCAid21pIG1nbXQgdHggc2tiICVwIGxlbiAlZCBmdHlwZSAlMDJ4IHN0eXBlICUwMnhcbiIsCisJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19XTUksICJ3bWkgbWdtdCB0eCBza2IgJXBLIGxlbiAlZCBmdHlwZSAlMDJ4IHN0eXBlICUwMnhcbiIsCiAJCSAgIG1zZHUsIHNrYi0+bGVuLCBmYyAmIElFRUU4MDIxMV9GQ1RMX0ZUWVBFLAogCQkgICBmYyAmIElFRUU4MDIxMV9GQ1RMX1NUWVBFKTsKIAl0cmFjZV9hdGgxMGtfdHhfaGRyKGFyLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKQEAgLTIyNDAsNiArMjI0MywyOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgYm9vbCBhdGgxMGtfd21pX3J4X2lzX2RlY3J5cHRlZChzdHJ1Y3QgYXRoMTBrICphciwKKwkJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcikKK3sKKwlpZiAoIWllZWU4MDIxMV9oYXNfcHJvdGVjdGVkKGhkci0+ZnJhbWVfY29udHJvbCkpCisJCXJldHVybiBmYWxzZTsKKworCS8qIEZXIGRlbGl2ZXJzIFdFUCBTaGFyZWQgQXV0aCBmcmFtZSB3aXRoIFByb3RlY3RlZCBCaXQgc2V0IGFuZAorCSAqIGVuY3J5cHRlZCBwYXlsb2FkLiBIb3dldmVyIGluIGNhc2Ugb2YgUE1GIGl0IGRlbGl2ZXJzIGRlY3J5cHRlZAorCSAqIGZyYW1lcyB3aXRoIFByb3RlY3RlZCBCaXQgc2V0LgorCSAqLworCWlmIChpZWVlODAyMTFfaXNfYXV0aChoZHItPmZyYW1lX2NvbnRyb2wpKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBxY2E5OXgwIGJhc2VkIEZXIGRlbGl2ZXJzIGJyb2FkY2FzdCBvciBtdWx0aWNhc3QgbWFuYWdlbWVudCBmcmFtZXMKKwkgKiAoZXg6IGdyb3VwIHByaXZhY3kgYWN0aW9uIGZyYW1lcyBpbiBtZXNoKSBhcyBlbmNyeXB0ZWQgcGF5bG9hZC4KKwkgKi8KKwlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaWVlZTgwMjExX2dldF9EQShoZHIpKSAmJgorCSAgICBhci0+aHdfcGFyYW1zLnN3X2RlY3J5cHRfbWNhc3RfbWdtdCkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKIGludCBhdGgxMGtfd21pX2V2ZW50X21nbXRfcngoc3RydWN0IGF0aDEwayAqYXIsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHdtaV9tZ210X3J4X2V2X2FyZyBhcmcgPSB7fTsKQEAgLTIzMjYsMTEgKzIzNTIsNyBAQAogCiAJYXRoMTBrX3dtaV9oYW5kbGVfd2VwX3JlYXV0aChhciwgc2tiLCBzdGF0dXMpOwogCi0JLyogRlcgZGVsaXZlcnMgV0VQIFNoYXJlZCBBdXRoIGZyYW1lIHdpdGggUHJvdGVjdGVkIEJpdCBzZXQgYW5kCi0JICogZW5jcnlwdGVkIHBheWxvYWQuIEhvd2V2ZXIgaW4gY2FzZSBvZiBQTUYgaXQgZGVsaXZlcnMgZGVjcnlwdGVkCi0JICogZnJhbWVzIHdpdGggUHJvdGVjdGVkIEJpdCBzZXQuICovCi0JaWYgKGllZWU4MDIxMV9oYXNfcHJvdGVjdGVkKGhkci0+ZnJhbWVfY29udHJvbCkgJiYKLQkgICAgIWllZWU4MDIxMV9pc19hdXRoKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKKwlpZiAoYXRoMTBrX3dtaV9yeF9pc19kZWNyeXB0ZWQoYXIsIGhkcikpIHsKIAkJc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfREVDUllQVEVEOwogCiAJCWlmICghaWVlZTgwMjExX2lzX2FjdGlvbihoZHItPmZyYW1lX2NvbnRyb2wpICYmCkBAIC0yMzQ3LDcgKzIzNjksNyBAQAogCQlhdGgxMGtfbWFjX2hhbmRsZV9iZWFjb24oYXIsIHNrYik7CiAKIAlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX01HTVQsCi0JCSAgICJldmVudCBtZ210IHJ4IHNrYiAlcCBsZW4gJWQgZnR5cGUgJTAyeCBzdHlwZSAlMDJ4XG4iLAorCQkgICAiZXZlbnQgbWdtdCByeCBza2IgJXBLIGxlbiAlZCBmdHlwZSAlMDJ4IHN0eXBlICUwMnhcbiIsCiAJCSAgIHNrYiwgc2tiLT5sZW4sCiAJCSAgIGZjICYgSUVFRTgwMjExX0ZDVExfRlRZUEUsIGZjICYgSUVFRTgwMjExX0ZDVExfU1RZUEUpOwogCkBAIC0yNDk1LDcgKzI1MTcsMjEgQEAKIAogdm9pZCBhdGgxMGtfd21pX2V2ZW50X2VjaG8oc3RydWN0IGF0aDEwayAqYXIsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19XTUksICJXTUlfRUNIT19FVkVOVElEXG4iKTsKKwlzdHJ1Y3Qgd21pX2VjaG9fZXZfYXJnIGFyZyA9IHt9OworCWludCByZXQ7CisKKwlyZXQgPSBhdGgxMGtfd21pX3B1bGxfZWNob19ldihhciwgc2tiLCAmYXJnKTsKKwlpZiAocmV0KSB7CisJCWF0aDEwa193YXJuKGFyLCAiZmFpbGVkIHRvIHBhcnNlIGVjaG86ICVkXG4iLCByZXQpOworCQlyZXR1cm47CisJfQorCisJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19XTUksCisJCSAgICJ3bWkgZXZlbnQgZWNobyB2YWx1ZSAweCUwOHhcbiIsCisJCSAgIGxlMzJfdG9fY3B1KGFyZy52YWx1ZSkpOworCisJaWYgKGxlMzJfdG9fY3B1KGFyZy52YWx1ZSkgPT0gQVRIMTBLX1dNSV9CQVJSSUVSX0VDSE9fSUQpCisJCWNvbXBsZXRlKCZhci0+d21pLmJhcnJpZXIpOwogfQogCiBpbnQgYXRoMTBrX3dtaV9ldmVudF9kZWJ1Z19tZXNnKHN0cnVjdCBhdGgxMGsgKmFyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtMzQ3OCw2ICszNTE0LDEyIEBACiAJCQljb250aW51ZTsKIAkJfQogCisJCS8qIG1hYzgwMjExIHdvdWxkIGhhdmUgYWxyZWFkeSBhc2tlZCB1cyB0byBzdG9wIGJlYWNvbmluZyBhbmQKKwkJICogYnJpbmcgdGhlIHZkZXYgZG93biwgc28gY29udGludWUgaW4gdGhhdCBjYXNlCisJCSAqLworCQlpZiAoIWFydmlmLT5pc191cCkKKwkJCWNvbnRpbnVlOworCiAJCS8qIFRoZXJlIGFyZSBubyBjb21wbGV0aW9ucyBmb3IgYmVhY29ucyBzbyB3YWl0IGZvciBuZXh0IFNXQkEKIAkJICogYmVmb3JlIHRlbGxpbmcgbWFjODAyMTEgdG8gZGVjcmVtZW50IENTQSBjb3VudGVyCiAJCSAqCkBAIC0zNTI3LDcgKzM1NjksNiBAQAogCQkJCWF0aDEwa193YXJuKGFyLCAiZmFpbGVkIHRvIG1hcCBiZWFjb246ICVkXG4iLAogCQkJCQkgICAgcmV0KTsKIAkJCQlkZXZfa2ZyZWVfc2tiX2FueShiY24pOwotCQkJCXJldCA9IC1FSU87CiAJCQkJZ290byBza2lwOwogCQkJfQogCkBAIC00NzkyLDYgKzQ4MzMsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBhdGgxMGtfd21pX29wX3B1bGxfZWNob19ldihzdHJ1Y3QgYXRoMTBrICphciwKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgIHN0cnVjdCB3bWlfZWNob19ldl9hcmcgKmFyZykKK3sKKwlzdHJ1Y3Qgd21pX2VjaG9fZXZlbnQgKmV2ID0gKHZvaWQgKilza2ItPmRhdGE7CisKKwlhcmctPnZhbHVlID0gZXYtPnZhbHVlOworCisJcmV0dXJuIDA7Cit9CisKIGludCBhdGgxMGtfd21pX2V2ZW50X3JlYWR5KHN0cnVjdCBhdGgxMGsgKmFyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCB3bWlfcmR5X2V2X2FyZyBhcmcgPSB7fTsKQEAgLTUxMjQsNiArNTE3Niw3IEBACiB7CiAJc3RydWN0IHdtaV9jbWRfaGRyICpjbWRfaGRyOwogCWVudW0gd21pXzEwXzJfZXZlbnRfaWQgaWQ7CisJYm9vbCBjb25zdW1lZDsKIAogCWNtZF9oZHIgPSAoc3RydWN0IHdtaV9jbWRfaGRyICopc2tiLT5kYXRhOwogCWlkID0gTVMoX19sZTMyX3RvX2NwdShjbWRfaGRyLT5jbWRfaWQpLCBXTUlfQ01EX0hEUl9DTURfSUQpOwpAQCAtNTEzMyw2ICs1MTg2LDE4IEBACiAKIAl0cmFjZV9hdGgxMGtfd21pX2V2ZW50KGFyLCBpZCwgc2tiLT5kYXRhLCBza2ItPmxlbik7CiAKKwljb25zdW1lZCA9IGF0aDEwa190bV9ldmVudF93bWkoYXIsIGlkLCBza2IpOworCisJLyogUmVhZHkgZXZlbnQgbXVzdCBiZSBoYW5kbGVkIG5vcm1hbGx5IGFsc28gaW4gVVRGIG1vZGUgc28gdGhhdCB3ZQorCSAqIGtub3cgdGhlIFVURiBmaXJtd2FyZSBoYXMgYm9vdGVkLCBvdGhlcnMgd2UgYXJlIGp1c3QgYnlwYXNzIFdNSQorCSAqIGV2ZW50cyB0byB0ZXN0bW9kZS4KKwkgKi8KKwlpZiAoY29uc3VtZWQgJiYgaWQgIT0gV01JXzEwXzJfUkVBRFlfRVZFTlRJRCkgeworCQlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX1dNSSwKKwkJCSAgICJ3bWkgdGVzdG1vZGUgY29uc3VtZWQgMHgleFxuIiwgaWQpOworCQlnb3RvIG91dDsKKwl9CisKIAlzd2l0Y2ggKGlkKSB7CiAJY2FzZSBXTUlfMTBfMl9NR01UX1JYX0VWRU5USUQ6CiAJCWF0aDEwa193bWlfZXZlbnRfbWdtdF9yeChhciwgc2tiKTsKQEAgLTUyNDgsNiArNTMxMyw3IEBACiB7CiAJc3RydWN0IHdtaV9jbWRfaGRyICpjbWRfaGRyOwogCWVudW0gd21pXzEwXzRfZXZlbnRfaWQgaWQ7CisJYm9vbCBjb25zdW1lZDsKIAogCWNtZF9oZHIgPSAoc3RydWN0IHdtaV9jbWRfaGRyICopc2tiLT5kYXRhOwogCWlkID0gTVMoX19sZTMyX3RvX2NwdShjbWRfaGRyLT5jbWRfaWQpLCBXTUlfQ01EX0hEUl9DTURfSUQpOwpAQCAtNTI1Nyw2ICs1MzIzLDE4IEBACiAKIAl0cmFjZV9hdGgxMGtfd21pX2V2ZW50KGFyLCBpZCwgc2tiLT5kYXRhLCBza2ItPmxlbik7CiAKKwljb25zdW1lZCA9IGF0aDEwa190bV9ldmVudF93bWkoYXIsIGlkLCBza2IpOworCisJLyogUmVhZHkgZXZlbnQgbXVzdCBiZSBoYW5kbGVkIG5vcm1hbGx5IGFsc28gaW4gVVRGIG1vZGUgc28gdGhhdCB3ZQorCSAqIGtub3cgdGhlIFVURiBmaXJtd2FyZSBoYXMgYm9vdGVkLCBvdGhlcnMgd2UgYXJlIGp1c3QgYnlwYXNzIFdNSQorCSAqIGV2ZW50cyB0byB0ZXN0bW9kZS4KKwkgKi8KKwlpZiAoY29uc3VtZWQgJiYgaWQgIT0gV01JXzEwXzRfUkVBRFlfRVZFTlRJRCkgeworCQlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX1dNSSwKKwkJCSAgICJ3bWkgdGVzdG1vZGUgY29uc3VtZWQgMHgleFxuIiwgaWQpOworCQlnb3RvIG91dDsKKwl9CisKIAlzd2l0Y2ggKGlkKSB7CiAJY2FzZSBXTUlfMTBfNF9NR01UX1JYX0VWRU5USUQ6CiAJCWF0aDEwa193bWlfZXZlbnRfbWdtdF9yeChhciwgc2tiKTsKQEAgLTUzMDYsNiArNTM4NCw3IEBACiAJCWJyZWFrOwogCWNhc2UgV01JXzEwXzRfV09XX1dBS0VVUF9IT1NUX0VWRU5USUQ6CiAJY2FzZSBXTUlfMTBfNF9QRUVSX1JBVEVDT0RFX0xJU1RfRVZFTlRJRDoKKwljYXNlIFdNSV8xMF80X1dEU19QRUVSX0VWRU5USUQ6CiAJCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfV01JLAogCQkJICAgInJlY2VpdmVkIGV2ZW50IGlkICVkIG5vdCBpbXBsZW1lbnRlZFxuIiwgaWQpOwogCQlicmVhazsKQEAgLTY4NjMsNyArNjk0Miw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCi1hdGgxMGtfd21pX29wX2dlbl9kYmdsb2dfY2ZnKHN0cnVjdCBhdGgxMGsgKmFyLCB1MzIgbW9kdWxlX2VuYWJsZSwKK2F0aDEwa193bWlfb3BfZ2VuX2RiZ2xvZ19jZmcoc3RydWN0IGF0aDEwayAqYXIsIHU2NCBtb2R1bGVfZW5hYmxlLAogCQkJICAgICB1MzIgbG9nX2xldmVsKQogewogCXN0cnVjdCB3bWlfZGJnbG9nX2NmZ19jbWQgKmNtZDsKQEAgLTY5MDEsNiArNjk4MCw0NCBAQAogfQogCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgorYXRoMTBrX3dtaV8xMF80X29wX2dlbl9kYmdsb2dfY2ZnKHN0cnVjdCBhdGgxMGsgKmFyLCB1NjQgbW9kdWxlX2VuYWJsZSwKKwkJCQkgIHUzMiBsb2dfbGV2ZWwpCit7CisJc3RydWN0IHdtaV8xMF80X2RiZ2xvZ19jZmdfY21kICpjbWQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1MzIgY2ZnOworCisJc2tiID0gYXRoMTBrX3dtaV9hbGxvY19za2IoYXIsIHNpemVvZigqY21kKSk7CisJaWYgKCFza2IpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJY21kID0gKHN0cnVjdCB3bWlfMTBfNF9kYmdsb2dfY2ZnX2NtZCAqKXNrYi0+ZGF0YTsKKworCWlmIChtb2R1bGVfZW5hYmxlKSB7CisJCWNmZyA9IFNNKGxvZ19sZXZlbCwKKwkJCSBBVEgxMEtfREJHTE9HX0NGR19MT0dfTFZMKTsKKwl9IGVsc2UgeworCQkvKiBzZXQgYmFjayBkZWZhdWx0cywgYWxsIG1vZHVsZXMgd2l0aCBXQVJOIGxldmVsICovCisJCWNmZyA9IFNNKEFUSDEwS19EQkdMT0dfTEVWRUxfV0FSTiwKKwkJCSBBVEgxMEtfREJHTE9HX0NGR19MT0dfTFZMKTsKKwkJbW9kdWxlX2VuYWJsZSA9IH4wOworCX0KKworCWNtZC0+bW9kdWxlX2VuYWJsZSA9IF9fY3B1X3RvX2xlNjQobW9kdWxlX2VuYWJsZSk7CisJY21kLT5tb2R1bGVfdmFsaWQgPSBfX2NwdV90b19sZTY0KH4wKTsKKwljbWQtPmNvbmZpZ19lbmFibGUgPSBfX2NwdV90b19sZTMyKGNmZyk7CisJY21kLT5jb25maWdfdmFsaWQgPSBfX2NwdV90b19sZTMyKEFUSDEwS19EQkdMT0dfQ0ZHX0xPR19MVkxfTUFTSyk7CisKKwlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX1dNSSwKKwkJICAgIndtaSBkYmdsb2cgY2ZnIG1vZHVsZXMgMHglMDE2bGx4IDB4JTAxNmxseCBjb25maWcgJTA4eCAlMDh4XG4iLAorCQkgICBfX2xlNjRfdG9fY3B1KGNtZC0+bW9kdWxlX2VuYWJsZSksCisJCSAgIF9fbGU2NF90b19jcHUoY21kLT5tb2R1bGVfdmFsaWQpLAorCQkgICBfX2xlMzJfdG9fY3B1KGNtZC0+Y29uZmlnX2VuYWJsZSksCisJCSAgIF9fbGUzMl90b19jcHUoY21kLT5jb25maWdfdmFsaWQpKTsKKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgogYXRoMTBrX3dtaV9vcF9nZW5fcGt0bG9nX2VuYWJsZShzdHJ1Y3QgYXRoMTBrICphciwgdTMyIGV2X2JpdG1hcCkKIHsKIAlzdHJ1Y3Qgd21pX3BkZXZfcGt0bG9nX2VuYWJsZV9jbWQgKmNtZDsKQEAgLTc2NDksNiArNzc2Niw0OCBAQAogCXJldHVybiBza2I7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCithdGgxMGtfd21pX29wX2dlbl9lY2hvKHN0cnVjdCBhdGgxMGsgKmFyLCB1MzIgdmFsdWUpCit7CisJc3RydWN0IHdtaV9lY2hvX2NtZCAqY21kOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBhdGgxMGtfd21pX2FsbG9jX3NrYihhciwgc2l6ZW9mKCpjbWQpKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwljbWQgPSAoc3RydWN0IHdtaV9lY2hvX2NtZCAqKXNrYi0+ZGF0YTsKKwljbWQtPnZhbHVlID0gY3B1X3RvX2xlMzIodmFsdWUpOworCisJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19XTUksCisJCSAgICJ3bWkgZWNobyB2YWx1ZSAweCUwOHhcbiIsIHZhbHVlKTsKKwlyZXR1cm4gc2tiOworfQorCitpbnQKK2F0aDEwa193bWlfYmFycmllcihzdHJ1Y3QgYXRoMTBrICphcikKK3sKKwlpbnQgcmV0OworCWludCB0aW1lX2xlZnQ7CisKKwlzcGluX2xvY2tfYmgoJmFyLT5kYXRhX2xvY2spOworCXJlaW5pdF9jb21wbGV0aW9uKCZhci0+d21pLmJhcnJpZXIpOworCXNwaW5fdW5sb2NrX2JoKCZhci0+ZGF0YV9sb2NrKTsKKworCXJldCA9IGF0aDEwa193bWlfZWNobyhhciwgQVRIMTBLX1dNSV9CQVJSSUVSX0VDSE9fSUQpOworCWlmIChyZXQpIHsKKwkJYXRoMTBrX3dhcm4oYXIsICJmYWlsZWQgdG8gc3VibWl0IHdtaSBlY2hvOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl0aW1lX2xlZnQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmFyLT53bWkuYmFycmllciwKKwkJCQkJCUFUSDEwS19XTUlfQkFSUklFUl9USU1FT1VUX0haKTsKKwlpZiAoIXRpbWVfbGVmdCkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCB3bWlfb3BzIHdtaV9vcHMgPSB7CiAJLnJ4ID0gYXRoMTBrX3dtaV9vcF9yeCwKIAkubWFwX3N2YyA9IHdtaV9tYWluX3N2Y19tYXAsCkBAIC03NjY1LDYgKzc4MjQsNyBAQAogCS5wdWxsX3JkeSA9IGF0aDEwa193bWlfb3BfcHVsbF9yZHlfZXYsCiAJLnB1bGxfZndfc3RhdHMgPSBhdGgxMGtfd21pX21haW5fb3BfcHVsbF9md19zdGF0cywKIAkucHVsbF9yb2FtX2V2ID0gYXRoMTBrX3dtaV9vcF9wdWxsX3JvYW1fZXYsCisJLnB1bGxfZWNob19ldiA9IGF0aDEwa193bWlfb3BfcHVsbF9lY2hvX2V2LAogCiAJLmdlbl9wZGV2X3N1c3BlbmQgPSBhdGgxMGtfd21pX29wX2dlbl9wZGV2X3N1c3BlbmQsCiAJLmdlbl9wZGV2X3Jlc3VtZSA9IGF0aDEwa193bWlfb3BfZ2VuX3BkZXZfcmVzdW1lLApAQCAtNzcwOSw2ICs3ODY5LDcgQEAKIAkuZ2VuX2RlbGJhX3NlbmQgPSBhdGgxMGtfd21pX29wX2dlbl9kZWxiYV9zZW5kLAogCS5md19zdGF0c19maWxsID0gYXRoMTBrX3dtaV9tYWluX29wX2Z3X3N0YXRzX2ZpbGwsCiAJLmdldF92ZGV2X3N1YnR5cGUgPSBhdGgxMGtfd21pX29wX2dldF92ZGV2X3N1YnR5cGUsCisJLmdlbl9lY2hvID0gYXRoMTBrX3dtaV9vcF9nZW5fZWNobywKIAkvKiAuZ2VuX2Jjbl90bXBsIG5vdCBpbXBsZW1lbnRlZCAqLwogCS8qIC5nZW5fcHJiX3RtcGwgbm90IGltcGxlbWVudGVkICovCiAJLyogLmdlbl9wMnBfZ29fYmNuX2llIG5vdCBpbXBsZW1lbnRlZCAqLwpAQCAtNzczOCw2ICs3ODk5LDcgQEAKIAkucHVsbF9waHllcnIgPSBhdGgxMGtfd21pX29wX3B1bGxfcGh5ZXJyX2V2LAogCS5wdWxsX3JkeSA9IGF0aDEwa193bWlfb3BfcHVsbF9yZHlfZXYsCiAJLnB1bGxfcm9hbV9ldiA9IGF0aDEwa193bWlfb3BfcHVsbF9yb2FtX2V2LAorCS5wdWxsX2VjaG9fZXYgPSBhdGgxMGtfd21pX29wX3B1bGxfZWNob19ldiwKIAogCS5nZW5fcGRldl9zdXNwZW5kID0gYXRoMTBrX3dtaV9vcF9nZW5fcGRldl9zdXNwZW5kLAogCS5nZW5fcGRldl9yZXN1bWUgPSBhdGgxMGtfd21pX29wX2dlbl9wZGV2X3Jlc3VtZSwKQEAgLTc3NzcsNiArNzkzOSw3IEBACiAJLmdlbl9kZWxiYV9zZW5kID0gYXRoMTBrX3dtaV9vcF9nZW5fZGVsYmFfc2VuZCwKIAkuZndfc3RhdHNfZmlsbCA9IGF0aDEwa193bWlfMTB4X29wX2Z3X3N0YXRzX2ZpbGwsCiAJLmdldF92ZGV2X3N1YnR5cGUgPSBhdGgxMGtfd21pX29wX2dldF92ZGV2X3N1YnR5cGUsCisJLmdlbl9lY2hvID0gYXRoMTBrX3dtaV9vcF9nZW5fZWNobywKIAkvKiAuZ2VuX2Jjbl90bXBsIG5vdCBpbXBsZW1lbnRlZCAqLwogCS8qIC5nZW5fcHJiX3RtcGwgbm90IGltcGxlbWVudGVkICovCiAJLyogLmdlbl9wMnBfZ29fYmNuX2llIG5vdCBpbXBsZW1lbnRlZCAqLwpAQCAtNzc5Niw2ICs3OTU5LDcgQEAKIAkucHVsbF9zdmNfcmR5ID0gYXRoMTBrX3dtaV8xMHhfb3BfcHVsbF9zdmNfcmR5X2V2LAogCS5nZW5fcGRldl9zZXRfcmQgPSBhdGgxMGtfd21pXzEweF9vcF9nZW5fcGRldl9zZXRfcmQsCiAJLmdlbl9zdGFydF9zY2FuID0gYXRoMTBrX3dtaV8xMHhfb3BfZ2VuX3N0YXJ0X3NjYW4sCisJLmdlbl9lY2hvID0gYXRoMTBrX3dtaV9vcF9nZW5fZWNobywKIAogCS5wdWxsX3NjYW4gPSBhdGgxMGtfd21pX29wX3B1bGxfc2Nhbl9ldiwKIAkucHVsbF9tZ210X3J4ID0gYXRoMTBrX3dtaV9vcF9wdWxsX21nbXRfcnhfZXYsCkBAIC03ODA3LDYgKzc5NzEsNyBAQAogCS5wdWxsX3BoeWVyciA9IGF0aDEwa193bWlfb3BfcHVsbF9waHllcnJfZXYsCiAJLnB1bGxfcmR5ID0gYXRoMTBrX3dtaV9vcF9wdWxsX3JkeV9ldiwKIAkucHVsbF9yb2FtX2V2ID0gYXRoMTBrX3dtaV9vcF9wdWxsX3JvYW1fZXYsCisJLnB1bGxfZWNob19ldiA9IGF0aDEwa193bWlfb3BfcHVsbF9lY2hvX2V2LAogCiAJLmdlbl9wZGV2X3N1c3BlbmQgPSBhdGgxMGtfd21pX29wX2dlbl9wZGV2X3N1c3BlbmQsCiAJLmdlbl9wZGV2X3Jlc3VtZSA9IGF0aDEwa193bWlfb3BfZ2VuX3BkZXZfcmVzdW1lLApAQCAtNzg2Miw2ICs4MDI3LDcgQEAKIAkucHVsbF9zdmNfcmR5ID0gYXRoMTBrX3dtaV8xMHhfb3BfcHVsbF9zdmNfcmR5X2V2LAogCS5nZW5fcGRldl9zZXRfcmQgPSBhdGgxMGtfd21pXzEweF9vcF9nZW5fcGRldl9zZXRfcmQsCiAJLmdlbl9zdGFydF9zY2FuID0gYXRoMTBrX3dtaV8xMHhfb3BfZ2VuX3N0YXJ0X3NjYW4sCisJLmdlbl9lY2hvID0gYXRoMTBrX3dtaV9vcF9nZW5fZWNobywKIAogCS5wdWxsX3NjYW4gPSBhdGgxMGtfd21pX29wX3B1bGxfc2Nhbl9ldiwKIAkucHVsbF9tZ210X3J4ID0gYXRoMTBrX3dtaV9vcF9wdWxsX21nbXRfcnhfZXYsCkBAIC03ODczLDYgKzgwMzksNyBAQAogCS5wdWxsX3BoeWVyciA9IGF0aDEwa193bWlfb3BfcHVsbF9waHllcnJfZXYsCiAJLnB1bGxfcmR5ID0gYXRoMTBrX3dtaV9vcF9wdWxsX3JkeV9ldiwKIAkucHVsbF9yb2FtX2V2ID0gYXRoMTBrX3dtaV9vcF9wdWxsX3JvYW1fZXYsCisJLnB1bGxfZWNob19ldiA9IGF0aDEwa193bWlfb3BfcHVsbF9lY2hvX2V2LAogCiAJLmdlbl9wZGV2X3N1c3BlbmQgPSBhdGgxMGtfd21pX29wX2dlbl9wZGV2X3N1c3BlbmQsCiAJLmdlbl9wZGV2X3Jlc3VtZSA9IGF0aDEwa193bWlfb3BfZ2VuX3BkZXZfcmVzdW1lLApAQCAtNzk2OCw3ICs4MTM1LDcgQEAKIAkuZ2VuX3BkZXZfc2V0X3dtbSA9IGF0aDEwa193bWlfb3BfZ2VuX3BkZXZfc2V0X3dtbSwKIAkuZ2VuX2ZvcmNlX2Z3X2hhbmcgPSBhdGgxMGtfd21pX29wX2dlbl9mb3JjZV9md19oYW5nLAogCS5nZW5fbWdtdF90eCA9IGF0aDEwa193bWlfb3BfZ2VuX21nbXRfdHgsCi0JLmdlbl9kYmdsb2dfY2ZnID0gYXRoMTBrX3dtaV9vcF9nZW5fZGJnbG9nX2NmZywKKwkuZ2VuX2RiZ2xvZ19jZmcgPSBhdGgxMGtfd21pXzEwXzRfb3BfZ2VuX2RiZ2xvZ19jZmcsCiAJLmdlbl9wa3Rsb2dfZW5hYmxlID0gYXRoMTBrX3dtaV9vcF9nZW5fcGt0bG9nX2VuYWJsZSwKIAkuZ2VuX3BrdGxvZ19kaXNhYmxlID0gYXRoMTBrX3dtaV9vcF9nZW5fcGt0bG9nX2Rpc2FibGUsCiAJLmdlbl9wZGV2X3NldF9xdWlldF9tb2RlID0gYXRoMTBrX3dtaV9vcF9nZW5fcGRldl9zZXRfcXVpZXRfbW9kZSwKQEAgLTc5ODAsMTAgKzgxNDcsMTIgQEAKIAkuZXh0X3Jlc291cmNlX2NvbmZpZyA9IGF0aDEwa193bWlfMTBfNF9leHRfcmVzb3VyY2VfY29uZmlnLAogCiAJLyogc2hhcmVkIHdpdGggMTAuMiAqLworCS5wdWxsX2VjaG9fZXYgPSBhdGgxMGtfd21pX29wX3B1bGxfZWNob19ldiwKIAkuZ2VuX3JlcXVlc3Rfc3RhdHMgPSBhdGgxMGtfd21pX29wX2dlbl9yZXF1ZXN0X3N0YXRzLAogCS5nZW5fcGRldl9nZXRfdGVtcGVyYXR1cmUgPSBhdGgxMGtfd21pXzEwXzJfb3BfZ2VuX3BkZXZfZ2V0X3RlbXBlcmF0dXJlLAogCS5nZXRfdmRldl9zdWJ0eXBlID0gYXRoMTBrX3dtaV8xMF80X29wX2dldF92ZGV2X3N1YnR5cGUsCiAJLmdlbl9wZGV2X2Jzc19jaGFuX2luZm9fcmVxID0gYXRoMTBrX3dtaV8xMF8yX29wX2dlbl9wZGV2X2Jzc19jaGFuX2luZm8sCisJLmdlbl9lY2hvID0gYXRoMTBrX3dtaV9vcF9nZW5fZWNobywKIH07CiAKIGludCBhdGgxMGtfd21pX2F0dGFjaChzdHJ1Y3QgYXRoMTBrICphcikKQEAgLTgwMzYsNiArODIwNSw3IEBACiAKIAlpbml0X2NvbXBsZXRpb24oJmFyLT53bWkuc2VydmljZV9yZWFkeSk7CiAJaW5pdF9jb21wbGV0aW9uKCZhci0+d21pLnVuaWZpZWRfcmVhZHkpOworCWluaXRfY29tcGxldGlvbigmYXItPndtaS5iYXJyaWVyKTsKIAogCUlOSVRfV09SSygmYXItPnN2Y19yZHlfd29yaywgYXRoMTBrX3dtaV9ldmVudF9zZXJ2aWNlX3JlYWR5X3dvcmspOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway93bWkuaAppbmRleCAzZWY0Njg4Li4xYjI0M2M4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvd21pLmgKQEAgLTU1LDcgKzU1LDcgQEAKICAqICAgIHR5cGUuCiAgKgogICogNi4gQ29tbWVudCBlYWNoIHBhcmFtZXRlciBwYXJ0IG9mIHRoZSBXTUkgY29tbWFuZC9ldmVudCBzdHJ1Y3R1cmUgYnkKLSAqICAgIHVzaW5nIHRoZSAyIHN0YXJzIGF0IHRoZSBiZWdpbmluZyBvZiBDIGNvbW1lbnQgaW5zdGVhZCBvZiBvbmUgc3RhciB0bworICogICAgdXNpbmcgdGhlIDIgc3RhcnMgYXQgdGhlIGJlZ2lubmluZyBvZiBDIGNvbW1lbnQgaW5zdGVhZCBvZiBvbmUgc3RhciB0bwogICogICAgZW5hYmxlIEhUTUwgZG9jdW1lbnQgZ2VuZXJhdGlvbiB1c2luZyBEb3h5Z2VuLgogICoKICAqLwpAQCAtMTgwLDYgKzE4MCw3IEBACiAJV01JX1NFUlZJQ0VfTUVTSF9OT05fMTFTLAogCVdNSV9TRVJWSUNFX1BFRVJfU1RBVFMsCiAJV01JX1NFUlZJQ0VfUkVTVFJUX0NITkxfU1VQUE9SVCwKKwlXTUlfU0VSVklDRV9QRVJJT0RJQ19DSEFOX1NUQVRfU1VQUE9SVCwKIAlXTUlfU0VSVklDRV9UWF9NT0RFX1BVU0hfT05MWSwKIAlXTUlfU0VSVklDRV9UWF9NT0RFX1BVU0hfUFVMTCwKIAlXTUlfU0VSVklDRV9UWF9NT0RFX0RZTkFNSUMsCkBAIC0zMDUsNiArMzA2LDcgQEAKIAlXTUlfMTBfNF9TRVJWSUNFX1JFU1RSVF9DSE5MX1NVUFBPUlQsCiAJV01JXzEwXzRfU0VSVklDRV9QRUVSX1NUQVRTLAogCVdNSV8xMF80X1NFUlZJQ0VfTUVTSF8xMVMsCisJV01JXzEwXzRfU0VSVklDRV9QRVJJT0RJQ19DSEFOX1NUQVRfU1VQUE9SVCwKIAlXTUlfMTBfNF9TRVJWSUNFX1RYX01PREVfUFVTSF9PTkxZLAogCVdNSV8xMF80X1NFUlZJQ0VfVFhfTU9ERV9QVVNIX1BVTEwsCiAJV01JXzEwXzRfU0VSVklDRV9UWF9NT0RFX0RZTkFNSUMsCkBAIC00MDIsNiArNDA0LDcgQEAKIAlTVkNTVFIoV01JX1NFUlZJQ0VfTUVTSF9OT05fMTFTKTsKIAlTVkNTVFIoV01JX1NFUlZJQ0VfUEVFUl9TVEFUUyk7CiAJU1ZDU1RSKFdNSV9TRVJWSUNFX1JFU1RSVF9DSE5MX1NVUFBPUlQpOworCVNWQ1NUUihXTUlfU0VSVklDRV9QRVJJT0RJQ19DSEFOX1NUQVRfU1VQUE9SVCk7CiAJU1ZDU1RSKFdNSV9TRVJWSUNFX1RYX01PREVfUFVTSF9PTkxZKTsKIAlTVkNTVFIoV01JX1NFUlZJQ0VfVFhfTU9ERV9QVVNIX1BVTEwpOwogCVNWQ1NUUihXTUlfU0VSVklDRV9UWF9NT0RFX0RZTkFNSUMpOwpAQCAtNjUyLDYgKzY1NSw4IEBACiAJICAgICAgIFdNSV9TRVJWSUNFX1BFRVJfU1RBVFMsIGxlbik7CiAJU1ZDTUFQKFdNSV8xMF80X1NFUlZJQ0VfTUVTSF8xMVMsCiAJICAgICAgIFdNSV9TRVJWSUNFX01FU0hfMTFTLCBsZW4pOworCVNWQ01BUChXTUlfMTBfNF9TRVJWSUNFX1BFUklPRElDX0NIQU5fU1RBVF9TVVBQT1JULAorCSAgICAgICBXTUlfU0VSVklDRV9QRVJJT0RJQ19DSEFOX1NUQVRfU1VQUE9SVCwgbGVuKTsKIAlTVkNNQVAoV01JXzEwXzRfU0VSVklDRV9UWF9NT0RFX1BVU0hfT05MWSwKIAkgICAgICAgV01JX1NFUlZJQ0VfVFhfTU9ERV9QVVNIX09OTFksIGxlbik7CiAJU1ZDTUFQKFdNSV8xMF80X1NFUlZJQ0VfVFhfTU9ERV9QVVNIX1BVTEwsCkBAIC0yMDgyLDcgKzIwODcsNyBAQAogCSAqIEluIG9mZmxvYWQgbW9kZSB0YXJnZXQgc3VwcG9ydHMgZmVhdHVyZXMgbGlrZSBXT1csIGNoYXR0ZXIgYW5kCiAJICogb3RoZXIgcHJvdG9jb2wgb2ZmbG9hZHMuIEluIG9yZGVyIHRvIHN1cHBvcnQgdGhlbSBzb21lCiAJICogZnVuY3Rpb25hbGl0aWVzIGxpa2UgcmVvcmRlciBidWZmZXJpbmcsIFBOIGNoZWNraW5nIG5lZWQgdG8gYmUKLQkgKiBkb25lIGluIHRhcmdldC4gVGhpcyBkZXRlcm1pbmVzIG1heGltdW0gbnVtYmVyIG9mIHBlZXJzIHN1cG9ydGVkCisJICogZG9uZSBpbiB0YXJnZXQuIFRoaXMgZGV0ZXJtaW5lcyBtYXhpbXVtIG51bWJlciBvZiBwZWVycyBzdXBwb3J0ZWQKIAkgKiBieSB0YXJnZXQgaW4gb2ZmbG9hZCBtb2RlCiAJICovCiAJX19sZTMyIG51bV9vZmZsb2FkX3BlZXJzOwpAQCAtMjI2Myw3ICsyMjY4LDcgQEAKIAkgKiBNYXguIG51bWJlciBvZiBUeCBmcmFnbWVudHMgcGVyIE1TRFUKIAkgKiAgVGhpcyBwYXJhbWV0ZXIgY29udHJvbHMgdGhlIG1heCBudW1iZXIgb2YgVHggZnJhZ21lbnRzIHBlciBNU0RVLgogCSAqICBUaGlzIGlzIHNlbnQgYnkgdGhlIHRhcmdldCBhcyBwYXJ0IG9mIHRoZSBXTUlfU0VSVklDRV9SRUFEWSBldmVudAotCSAqICBhbmQgaXMgb3ZlcnJpZGVuIGJ5IHRoZSBPUyBzaGltIGFzIHJlcXVpcmVkLgorCSAqICBhbmQgaXMgb3ZlcnJpZGRlbiBieSB0aGUgT1Mgc2hpbSBhcyByZXF1aXJlZC4KIAkgKi8KIAlfX2xlMzIgbWF4X2ZyYWdfZW50cmllczsKIH0gX19wYWNrZWQ7CkBAIC0yNDQ1LDcgKzI0NTAsNyBAQAogCSAqIE1heC4gbnVtYmVyIG9mIFR4IGZyYWdtZW50cyBwZXIgTVNEVQogCSAqICBUaGlzIHBhcmFtZXRlciBjb250cm9scyB0aGUgbWF4IG51bWJlciBvZiBUeCBmcmFnbWVudHMgcGVyIE1TRFUuCiAJICogIFRoaXMgaXMgc2VudCBieSB0aGUgdGFyZ2V0IGFzIHBhcnQgb2YgdGhlIFdNSV9TRVJWSUNFX1JFQURZIGV2ZW50Ci0JICogIGFuZCBpcyBvdmVycmlkZW4gYnkgdGhlIE9TIHNoaW0gYXMgcmVxdWlyZWQuCisJICogIGFuZCBpcyBvdmVycmlkZGVuIGJ5IHRoZSBPUyBzaGltIGFzIHJlcXVpcmVkLgogCSAqLwogCV9fbGUzMiBtYXhfZnJhZ19lbnRyaWVzOwogfSBfX3BhY2tlZDsKQEAgLTI3MzksNyArMjc0NCw3IEBACiAJc3RydWN0IHdtaV9ob3N0X21lbV9jaHVua3MgbWVtX2NodW5rczsKIH0gX19wYWNrZWQ7CiAKLS8qIF8xMHggc3R1Y3R1cmUgaXMgZnJvbSAxMC5YIEZXIEFQSSAqLworLyogXzEweCBzdHJ1Y3R1cmUgaXMgZnJvbSAxMC5YIEZXIEFQSSAqLwogc3RydWN0IHdtaV9pbml0X2NtZF8xMHggewogCXN0cnVjdCB3bWlfcmVzb3VyY2VfY29uZmlnXzEweCByZXNvdXJjZV9jb25maWc7CiAJc3RydWN0IHdtaV9ob3N0X21lbV9jaHVua3MgbWVtX2NodW5rczsKQEAgLTM5NjIsNyArMzk2Nyw3IEBACiAJLyogaWxsZWdhbCByYXRlIHBoeSBlcnJvcnMgICovCiAJX19sZTMyIGlsbGdsX3JhdGVfcGh5X2VycjsKIAotCS8qIHdhbCBwZGV2IGNvbnRpbm91cyB4cmV0cnkgKi8KKwkvKiB3YWwgcGRldiBjb250aW51b3VzIHhyZXRyeSAqLwogCV9fbGUzMiBwZGV2X2NvbnRfeHJldHJ5OwogCiAJLyogd2FsIHBkZXYgY29udGlub3VzIHhyZXRyeSAqLwpAQCAtNDIxNywxMCArNDIyMiwxMCBAQAogICovCiBzdHJ1Y3Qgd21pX3BkZXZfc3RhdHNfYmFzZSB7CiAJX19sZTMyIGNoYW5fbmY7Ci0JX19sZTMyIHR4X2ZyYW1lX2NvdW50OwotCV9fbGUzMiByeF9mcmFtZV9jb3VudDsKLQlfX2xlMzIgcnhfY2xlYXJfY291bnQ7Ci0JX19sZTMyIGN5Y2xlX2NvdW50OworCV9fbGUzMiB0eF9mcmFtZV9jb3VudDsgLyogQ3ljbGVzIHNwZW50IHRyYW5zbWl0dGluZyBmcmFtZXMgKi8KKwlfX2xlMzIgcnhfZnJhbWVfY291bnQ7IC8qIEN5Y2xlcyBzcGVudCByZWNlaXZpbmcgZnJhbWVzICovCisJX19sZTMyIHJ4X2NsZWFyX2NvdW50OyAvKiBUb3RhbCBjaGFubmVsIGJ1c3kgdGltZSwgZXZpZGVudGx5ICovCisJX19sZTMyIGN5Y2xlX2NvdW50OyAvKiBUb3RhbCBvbi1jaGFubmVsIHRpbWUgKi8KIAlfX2xlMzIgcGh5X2Vycl9jb3VudDsKIAlfX2xlMzIgY2hhbl90eF9wd3I7CiB9IF9fcGFja2VkOwpAQCAtNDQ1Niw5ICs0NDYxLDkgQEAKIAlfX2xlMzIgZmxhZ3M7CiAJLyogc3NpZCBmaWVsZC4gT25seSB2YWxpZCBmb3IgQVAvR08vSUJTUy9CVEFtcCBWREVWIHR5cGUuICovCiAJc3RydWN0IHdtaV9zc2lkIHNzaWQ7Ci0JLyogYmVhY29uL3Byb2JlIHJlcG9uc2UgeG1pdCByYXRlLiBBcHBsaWNhYmxlIGZvciBTb2Z0QVAuICovCisJLyogYmVhY29uL3Byb2JlIHJlc3BvbnNlIHhtaXQgcmF0ZS4gQXBwbGljYWJsZSBmb3IgU29mdEFQLiAqLwogCV9fbGUzMiBiY25fdHhfcmF0ZTsKLQkvKiBiZWFjb24vcHJvYmUgcmVwb25zZSB4bWl0IHBvd2VyLiBBcHBsaWNhYmxlIGZvciBTb2Z0QVAuICovCisJLyogYmVhY29uL3Byb2JlIHJlc3BvbnNlIHhtaXQgcG93ZXIuIEFwcGxpY2FibGUgZm9yIFNvZnRBUC4gKi8KIAlfX2xlMzIgYmNuX3R4X3Bvd2VyOwogCS8qIG51bWJlciBvZiBwMnAgTk9BIGRlc2NyaXB0b3IocykgZnJvbSBzY2FuIGVudHJ5ICovCiAJX19sZTMyIG51bV9ub2FfZGVzY3JpcHRvcnM7CkBAIC00Njg2LDcgKzQ2OTEsNyBAQAogCVdNSV9WREVWX1BBUkFNX0JFQUNPTl9JTlRFUlZBTCwKIAkvKiBMaXN0ZW4gaW50ZXJ2YWwgaW4gVFVzICovCiAJV01JX1ZERVZfUEFSQU1fTElTVEVOX0lOVEVSVkFMLAotCS8qIG11dGljYXN0IHJhdGUgaW4gTWJwcyAqLworCS8qIG11bHRpY2FzdCByYXRlIGluIE1icHMgKi8KIAlXTUlfVkRFVl9QQVJBTV9NVUxUSUNBU1RfUkFURSwKIAkvKiBtYW5hZ2VtZW50IGZyYW1lIHJhdGUgaW4gTWJwcyAqLwogCVdNSV9WREVWX1BBUkFNX01HTVRfVFhfUkFURSwKQEAgLTQ4MTcsNyArNDgyMiw3IEBACiAJV01JXzEwWF9WREVWX1BBUkFNX0JFQUNPTl9JTlRFUlZBTCwKIAkvKiBMaXN0ZW4gaW50ZXJ2YWwgaW4gVFVzICovCiAJV01JXzEwWF9WREVWX1BBUkFNX0xJU1RFTl9JTlRFUlZBTCwKLQkvKiBtdXRpY2FzdCByYXRlIGluIE1icHMgKi8KKwkvKiBtdWx0aWNhc3QgcmF0ZSBpbiBNYnBzICovCiAJV01JXzEwWF9WREVWX1BBUkFNX01VTFRJQ0FTVF9SQVRFLAogCS8qIG1hbmFnZW1lbnQgZnJhbWUgcmF0ZSBpbiBNYnBzICovCiAJV01JXzEwWF9WREVWX1BBUkFNX01HTVRfVFhfUkFURSwKQEAgLTUwNjIsNyArNTA2Nyw3IEBACiB9IF9fcGFja2VkOwogCiAvKiBWREVWIHN0YXJ0IHJlc3BvbnNlIHN0YXR1cyBjb2RlcyAqLwotLyogVkRFViBzdWNjZXNmdWxseSBzdGFydGVkICovCisvKiBWREVWIHN1Y2Nlc3NmdWxseSBzdGFydGVkICovCiAjZGVmaW5lIFdNSV9JTklGSUVEX1ZERVZfU1RBUlRfUkVTUE9OU0VfU1RBVFVTX1NVQ0NFU1MJMHgwCiAKIC8qIHJlcXVlc3RlZCBWREVWIG5vdCBmb3VuZCAqLwpAQCAtNTM3OCw3ICs1MzgzLDcgQEAKICNkZWZpbmUgV01JX1VBUFNEX0FDX1RZUEVfVFJJRyAxCiAKICNkZWZpbmUgV01JX1VBUFNEX0FDX0JJVF9NQVNLKGFjLCB0eXBlKSBcCi0JKCh0eXBlID09ICBXTUlfVUFQU0RfQUNfVFlQRV9ERUxJKSA/ICgxIDw8IChhYyA8PCAxKSkgOiAoMSA8PCAoKGFjIDw8IDEpICsgMSkpKQorCSh0eXBlID09IFdNSV9VQVBTRF9BQ19UWVBFX0RFTEkgPyAxIDw8IChhYyA8PCAxKSA6IDEgPDwgKChhYyA8PCAxKSArIDEpKQogCiBlbnVtIHdtaV9zdGFfcHNfcGFyYW1fdWFwc2QgewogCVdNSV9TVEFfUFNfVUFQU0RfQUMwX0RFTElWRVJZX0VOID0gKDEgPDwgMCksCkBAIC02MTY5LDYgKzYxNzQsMjAgQEAKIAlfX2xlMzIgY29uZmlnX3ZhbGlkOwogfSBfX3BhY2tlZDsKIAorc3RydWN0IHdtaV8xMF80X2RiZ2xvZ19jZmdfY21kIHsKKwkvKiBiaXRtYXNrIHRvIGhvbGQgbW9kIGlkIGNvbmZpZyovCisJX19sZTY0IG1vZHVsZV9lbmFibGU7CisKKwkvKiBzZWUgQVRIMTBLX0RCR0xPR19DRkdfICovCisJX19sZTMyIGNvbmZpZ19lbmFibGU7CisKKwkvKiBtYXNrIG9mIG1vZHVsZSBpZCBiaXRzIHRvIGJlIGNoYW5nZWQgKi8KKwlfX2xlNjQgbW9kdWxlX3ZhbGlkOworCisJLyogbWFzayBvZiBjb25maWcgYml0cyB0byBiZSBjaGFuZ2VkLCBzZWUgQVRIMTBLX0RCR0xPR19DRkdfICovCisJX19sZTMyIGNvbmZpZ192YWxpZDsKK30gX19wYWNrZWQ7CisKIGVudW0gd21pX3JvYW1fcmVhc29uIHsKIAlXTUlfUk9BTV9SRUFTT05fQkVUVEVSX0FQID0gMSwKIAlXTUlfUk9BTV9SRUFTT05fQkVBQ09OX01JU1MgPSAyLApAQCAtNjI5Niw2ICs2MzE1LDEwIEBACiAJX19sZTMyIHJzc2k7CiB9OwogCitzdHJ1Y3Qgd21pX2VjaG9fZXZfYXJnIHsKKwlfX2xlMzIgdmFsdWU7Cit9OworCiBzdHJ1Y3Qgd21pX3BkZXZfdGVtcGVyYXR1cmVfZXZlbnQgewogCS8qIHRlbXBlcmF0dXJlIHZhbHVlIGluIENlbGNpdXMgZGVncmVlICovCiAJX19sZTMyIHRlbXBlcmF0dXJlOwpAQCAtNjYyNCw1ICs2NjQ3LDYgQEAKIAkJCQkgICAgICBjaGFyICpidWYpOwogaW50IGF0aDEwa193bWlfb3BfZ2V0X3ZkZXZfc3VidHlwZShzdHJ1Y3QgYXRoMTBrICphciwKIAkJCQkgICBlbnVtIHdtaV92ZGV2X3N1YnR5cGUgc3VidHlwZSk7CitpbnQgYXRoMTBrX3dtaV9iYXJyaWVyKHN0cnVjdCBhdGgxMGsgKmFyKTsKIAogI2VuZGlmIC8qIF9XTUlfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kZWJ1Zy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RlYnVnLmMKaW5kZXggOTI5ZDdjYy4uNGY4ZDllZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RlYnVnLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RlYnVnLmMKQEAgLTkwOSw3ICs5MDksNyBAQAogCXN0cnVjdCBhdGg1a19odyAqYWggPSBpbm9kZS0+aV9wcml2YXRlOwogCWJvb2wgcmVzOwogCWludCBpLCByZXQ7Ci0JdTMyIGVlc2l6ZTsKKwl1MzIgZWVzaXplOwkvKiBOQjogaW4gMTYtYml0IHdvcmRzICovCiAJdTE2IHZhbCwgKmJ1ZjsKIAogCS8qIEdldCBlZXByb20gc2l6ZSAqLwpAQCAtOTMyLDcgKzkzMiw3IEBACiAKIAkvKiBDcmVhdGUgYnVmZmVyIGFuZCByZWFkIGluIGVlcHJvbSAqLwogCi0JYnVmID0gdm1hbGxvYyhlZXNpemUpOworCWJ1ZiA9IHZtYWxsb2MoZWVzaXplICogMik7CiAJaWYgKCFidWYpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnI7CkBAIC05NTIsNyArOTUyLDcgQEAKIAl9CiAKIAllcC0+YnVmID0gYnVmOwotCWVwLT5sZW4gPSBpOworCWVwLT5sZW4gPSBlZXNpemUgKiAyOwogCiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKillcDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9jZmc4MDIxMS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9jZmc4MDIxMS5jCmluZGV4IDcyZTJlYzYuLmI3ZmUwYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY2ZnODAyMTEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NmZzgwMjExLmMKQEAgLTE0NDksMTQgKzE0NDksMTQgQEAKIAkJcmV0dXJuIC1FSU87CiAKIAlpZiAodGVzdF9iaXQoQ09OTkVDVEVELCAmdmlmLT5mbGFncykpIHsKLQkJYXItPnR4X3B3ciA9IDA7CisJCWFyLT50eF9wd3IgPSAyNTU7CiAKIAkJaWYgKGF0aDZrbF93bWlfZ2V0X3R4X3B3cl9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4KSAhPSAwKSB7CiAJCQlhdGg2a2xfZXJyKCJhdGg2a2xfd21pX2dldF90eF9wd3JfY21kIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCi0JCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGFyLT5ldmVudF93cSwgYXItPnR4X3B3ciAhPSAwLAorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhci0+ZXZlbnRfd3EsIGFyLT50eF9wd3IgIT0gMjU1LAogCQkJCQkJIDUgKiBIWik7CiAKIAkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2hpZi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9oaWYuYwppbmRleCAxOGMwNzA4Li5kMTk0MjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2hpZi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaGlmLmMKQEAgLTY0LDcgKzY0LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woYXRoNmtsX2hpZl9yd19jb21wX2hhbmRsZXIpOwogCi0jZGVmaW5lIFJFR19EVU1QX0NPVU5UX0FSNjAwMyAgIDYwCisjZGVmaW5lIFJFR0lTVEVSX0RVTVBfQ09VTlQgICAgIDYwCiAjZGVmaW5lIFJFR0lTVEVSX0RVTVBfTEVOX01BWCAgIDYwCiAKIHN0YXRpYyB2b2lkIGF0aDZrbF9oaWZfZHVtcF9md19jcmFzaChzdHJ1Y3QgYXRoNmtsICphcikKQEAgLTczLDkgKzczLDYgQEAKIAl1MzIgaSwgYWRkcmVzcywgcmVnZHVtcF9hZGRyID0gMDsKIAlpbnQgcmV0OwogCi0JaWYgKGFyLT50YXJnZXRfdHlwZSAhPSBUQVJHRVRfVFlQRV9BUjYwMDMpCi0JCXJldHVybjsKLQogCS8qIHRoZSByZWcgZHVtcCBwb2ludGVyIGlzIGNvcGllZCB0byB0aGUgaG9zdCBpbnRlcmVzdCBhcmVhICovCiAJYWRkcmVzcyA9IGF0aDZrbF9nZXRfaGlfaXRlbV9hZGRyKGFyLCBISV9JVEVNKGhpX2ZhaWx1cmVfc3RhdGUpKTsKIAlhZGRyZXNzID0gVEFSR19WVE9QKGFyLT50YXJnZXRfdHlwZSwgYWRkcmVzcyk7CkBAIC05NSw3ICs5Miw3IEBACiAKIAkvKiBmZXRjaCByZWdpc3RlciBkdW1wIGRhdGEgKi8KIAlyZXQgPSBhdGg2a2xfZGlhZ19yZWFkKGFyLCByZWdkdW1wX2FkZHIsICh1OCAqKSZyZWdkdW1wX3ZhbFswXSwKLQkJCQkgIFJFR19EVU1QX0NPVU5UX0FSNjAwMyAqIChzaXplb2YodTMyKSkpOworCQkJCSAgUkVHSVNURVJfRFVNUF9DT1VOVCAqIChzaXplb2YodTMyKSkpOwogCWlmIChyZXQpIHsKIAkJYXRoNmtsX3dhcm4oImZhaWxlZCB0byBnZXQgcmVnaXN0ZXIgZHVtcDogJWRcbiIsIHJldCk7CiAJCXJldHVybjsKQEAgLTEwNSw5ICsxMDIsOSBAQAogCWF0aDZrbF9pbmZvKCJodyAweCV4IGZ3ICVzXG4iLCBhci0+d2lwaHktPmh3X3ZlcnNpb24sCiAJCSAgICBhci0+d2lwaHktPmZ3X3ZlcnNpb24pOwogCi0JQlVJTERfQlVHX09OKFJFR19EVU1QX0NPVU5UX0FSNjAwMyAlIDQpOworCUJVSUxEX0JVR19PTihSRUdJU1RFUl9EVU1QX0NPVU5UICUgNCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgUkVHX0RVTVBfQ09VTlRfQVI2MDAzOyBpICs9IDQpIHsKKwlmb3IgKGkgPSAwOyBpIDwgUkVHSVNURVJfRFVNUF9DT1VOVDsgaSArPSA0KSB7CiAJCWF0aDZrbF9pbmZvKCIlZDogMHglOC44eCAweCU4Ljh4IDB4JTguOHggMHglOC44eFxuIiwKIAkJCSAgICBpLAogCQkJICAgIGxlMzJfdG9fY3B1KHJlZ2R1bXBfdmFsW2ldKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvd21pLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3dtaS5jCmluZGV4IGI4Y2YwNGQuLjNmZDFjYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvd21pLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC93bWkuYwpAQCAtMzUyMCw3ICszNTIwLDcgQEAKIAlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9BUF9TRVRfUFZCX0NNRElELAogCQkJCSAgTk9fU1lOQ19XTUlGTEFHKTsKIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIGludCBhdGg2a2xfd21pX3NldF9yeF9mcmFtZV9mb3JtYXRfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL0tjb25maWcgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvS2NvbmZpZwppbmRleCBmNjhjYjAwLi44ZjIzMWM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvS2NvbmZpZwpAQCAtMTgwLDcgKzE4MCw3IEBACiBjb25maWcgQVRIOUtfSFdSTkcKIAlib29sICJSYW5kb20gbnVtYmVyIGdlbmVyYXRvciBzdXBwb3J0IgogCWRlcGVuZHMgb24gQVRIOUsgJiYgKEhXX1JBTkRPTSA9IHkgfHwgSFdfUkFORE9NID0gQVRIOUspCi0JZGVmYXVsdCB5CisJZGVmYXVsdCBuCiAJLS0taGVscC0tLQogCSAgVGhpcyBvcHRpb24gaW5jb3Jwb3JhdGVzIHRoZSBBREMgcmVnaXN0ZXIgb3V0cHV0IGFzIGEgc291cmNlIG9mCiAJICByYW5kb21uZXNzIGludG8gTGludXggZW50cm9weSBwb29sICgvZGV2L3VyYW5kb20gYW5kIC9kZXYvcmFuZG9tKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyNTAwOF9waHkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjUwMDhfcGh5LmMKaW5kZXggMWIyNzFiOS4uOGVlYThkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyNTAwOF9waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI1MDA4X3BoeS5jCkBAIC0yNjAsOCArMjYwLDggQEAKIAlpbnQgY3VyX2JpbjsKIAlpbnQgdXBwZXIsIGxvd2VyLCBjdXJfdml0X21hc2s7CiAJaW50IGk7Ci0JaW50OF90IG1hc2tfbVsxMjNdOwotCWludDhfdCBtYXNrX3BbMTIzXTsKKwlpbnQ4X3QgbWFza19tWzEyM10gPSB7MH07CisJaW50OF90IG1hc2tfcFsxMjNdID0gezB9OwogCWludDhfdCBtYXNrX2FtdDsKIAlpbnQgdG1wX21hc2s7CiAJc3RhdGljIGNvbnN0IGludCBwaWxvdF9tYXNrX3JlZ1s0XSA9IHsKQEAgLTI3NCw5ICsyNzQsNiBAQAogCX07CiAJc3RhdGljIGNvbnN0IGludCBpbmNbNF0gPSB7IDAsIDEwMCwgMCwgMCB9OwogCi0JbWVtc2V0KCZtYXNrX20sIDAsIHNpemVvZihpbnQ4X3QpICogMTIzKTsKLQltZW1zZXQoJm1hc2tfcCwgMCwgc2l6ZW9mKGludDhfdCkgKiAxMjMpOwotCiAJY3VyX2JpbiA9IC02MDAwOwogCXVwcGVyID0gYmluICsgMTAwOwogCWxvd2VyID0gYmluIC0gMTAwOwpAQCAtMzAyLDcgKzI5OSw3IEBACiAJdXBwZXIgPSBiaW4gKyAxMjA7CiAJbG93ZXIgPSBiaW4gLSAxMjA7CiAKLQlmb3IgKGkgPSAwOyBpIDwgMTIzOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtYXNrX20pOyBpKyspIHsKIAkJaWYgKChjdXJfdml0X21hc2sgPiBsb3dlcikgJiYgKGN1cl92aXRfbWFzayA8IHVwcGVyKSkgewogCQkJLyogd29ya2Fyb3VuZCBmb3IgZ2NjIGJ1ZyAjMzcwMTQgKi8KIAkJCXZvbGF0aWxlIGludCB0bXBfdiA9IGFicyhjdXJfdml0X21hc2sgLSBiaW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19lZXByb20uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfZWVwcm9tLmMKaW5kZXggNWJkMmNiYS4uMDg2MDdkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19lZXByb20uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2VlcHJvbS5jCkBAIC0zMjUyLDcgKzMyNTIsOCBAQAogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IG1kYXRhX3NpemUgLyAyOyBpKyssIGRhdGErKykKLQkJYXRoOWtfaHdfbnZyYW1fcmVhZChhaCwgaSwgZGF0YSk7CisJCWlmICghYXRoOWtfaHdfbnZyYW1fcmVhZChhaCwgaSwgZGF0YSkpCisJCQlyZXR1cm4gLUVJTzsKIAogCXJldHVybiAwOwogfQpAQCAtMzI4Miw3ICszMjgzLDggQEAKIAlpZiAoYXRoOWtfaHdfdXNlX2ZsYXNoKGFoKSkgewogCQl1OCB0eHJ4OwogCi0JCWFyOTMwMF9lZXByb21fcmVzdG9yZV9mbGFzaChhaCwgbXB0ciwgbWRhdGFfc2l6ZSk7CisJCWlmIChhcjkzMDBfZWVwcm9tX3Jlc3RvcmVfZmxhc2goYWgsIG1wdHIsIG1kYXRhX3NpemUpKQorCQkJcmV0dXJuIC1FSU87CiAKIAkJLyogY2hlY2sgaWYgZWVwcm9tIGNvbnRhaW5zIHZhbGlkIGRhdGEgKi8KIAkJZWVwID0gKHN0cnVjdCBhcjkzMDBfZWVwcm9tICopIG1wdHI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZ3Bpby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2dwaW8uYwppbmRleCA0OTBmNzRkLi5kZGIyODg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZ3Bpby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ncGlvLmMKQEAgLTIyLDcgKzIyLDcgQEAKIAogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9MRURTCiAKLXZvaWQgYXRoX2ZpbGxfbGVkX3BpbihzdHJ1Y3QgYXRoX3NvZnRjICpzYykKK3N0YXRpYyB2b2lkIGF0aF9maWxsX2xlZF9waW4oc3RydWN0IGF0aF9zb2Z0YyAqc2MpCiB7CiAJc3RydWN0IGF0aF9odyAqYWggPSBzYy0+c2NfYWg7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmMKaW5kZXggZDFkMGMwNi4uMTRiMTNmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmMKQEAgLTI0ODIsNiArMjQ4Miw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWF0aDlrX2dwaW9fY2FwX2luaXQoYWgpOworCiAJaWYgKEFSX1NSRVZfOTQ4NShhaCkgfHwKIAkgICAgQVJfU1JFVl85Mjg1KGFoKSB8fAogCSAgICBBUl9TUkVWXzkzMzAoYWgpIHx8CkBAIC0yNTMxLDggKzI1MzMsNiBAQAogCWVsc2UKIAkJcENhcC0+aHdfY2FwcyAmPSB+QVRIOUtfSFdfQ0FQX0hUOwogCi0JYXRoOWtfZ3Bpb19jYXBfaW5pdChhaCk7Ci0KIAlpZiAoQVJfU1JFVl85MTYwXzEwX09SX0xBVEVSKGFoKSB8fCBBUl9TUkVWXzkxMDAoYWgpKQogCQlwQ2FwLT5ydHNfYWdncl9saW1pdCA9IEFUSF9BTVBEVV9MSU1JVF9NQVg7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWluLmMKaW5kZXggYTM5NDYyMi4uZTlmMzJiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFpbi5jCkBAIC03MTgsOSArNzE4LDEyIEBACiAJaWYgKCFhdGhfY29tcGxldGVfcmVzZXQoc2MsIGZhbHNlKSkKIAkJYWgtPnJlc2V0X3Bvd2VyX29uID0gZmFsc2U7CiAKLQlpZiAoYWgtPmxlZF9waW4gPj0gMCkKKwlpZiAoYWgtPmxlZF9waW4gPj0gMCkgewogCQlhdGg5a19od19zZXRfZ3BpbyhhaCwgYWgtPmxlZF9waW4sCiAJCQkJICAoYWgtPmNvbmZpZy5sZWRfYWN0aXZlX2hpZ2gpID8gMSA6IDApOworCQlhdGg5a19od19ncGlvX3JlcXVlc3Rfb3V0KGFoLCBhaC0+bGVkX3BpbiwgTlVMTCwKKwkJCQkJICBBUl9HUElPX09VVFBVVF9NVVhfQVNfT1VUUFVUKTsKKwl9CiAKIAkvKgogCSAqIFJlc2V0IGtleSBjYWNoZSB0byBzYW5lIGRlZmF1bHRzIChhbGwgZW50cmllcyBjbGVhcmVkKSBpbnN0ZWFkIG9mCkBAIC04NjQsOSArODY3LDExIEBACiAKIAlzcGluX2xvY2tfYmgoJnNjLT5zY19wY3VfbG9jayk7CiAKLQlpZiAoYWgtPmxlZF9waW4gPj0gMCkKKwlpZiAoYWgtPmxlZF9waW4gPj0gMCkgewogCQlhdGg5a19od19zZXRfZ3BpbyhhaCwgYWgtPmxlZF9waW4sCiAJCQkJICAoYWgtPmNvbmZpZy5sZWRfYWN0aXZlX2hpZ2gpID8gMCA6IDEpOworCQlhdGg5a19od19ncGlvX3JlcXVlc3RfaW4oYWgsIGFoLT5sZWRfcGluLCBOVUxMKTsKKwl9CiAKIAlhdGhfcHJlcGFyZV9yZXNldChzYyk7CiAKQEAgLTkxOSw3ICs5MjQsNyBAQAogCX0gZWxzZSB7CiAJCWlmIChpdGVyX2RhdGEtPnByaW1hcnlfYmVhY29uX3ZpZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUCAmJgogCQkgICAgdmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQKQotCQlpdGVyX2RhdGEtPnByaW1hcnlfYmVhY29uX3ZpZiA9IHZpZjsKKwkJCWl0ZXJfZGF0YS0+cHJpbWFyeV9iZWFjb25fdmlmID0gdmlmOwogCX0KIAogCWl0ZXJfZGF0YS0+YmVhY29ucyA9IHRydWU7CkBAIC0xMTU0LDYgKzExNTksNyBAQAogCQlib29sIGNoYW5nZWQgPSAoaXRlcl9kYXRhLnByaW1hcnlfc3RhICE9IGN0eC0+cHJpbWFyeV9zdGEpOwogCiAJCWlmIChpdGVyX2RhdGEucHJpbWFyeV9zdGEpIHsKKwkJCWl0ZXJfZGF0YS5wcmltYXJ5X2JlYWNvbl92aWYgPSBpdGVyX2RhdGEucHJpbWFyeV9zdGE7CiAJCQlpdGVyX2RhdGEuYmVhY29ucyA9IHRydWU7CiAJCQlhdGg5a19zZXRfYXNzb2Nfc3RhdGUoc2MsIGl0ZXJfZGF0YS5wcmltYXJ5X3N0YSwKIAkJCQkJICAgICAgY2hhbmdlZCk7CkBAIC0xNTYzLDEzICsxNTY5LDEzIEBACiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihzYy0+c2NfYWgpOwogCWludCByZXQgPSAwOwogCi0JaWYgKG9sZF9zdGF0ZSA9PSBJRUVFODAyMTFfU1RBX0FVVEggJiYKLQkgICAgbmV3X3N0YXRlID09IElFRUU4MDIxMV9TVEFfQVNTT0MpIHsKKwlpZiAob2xkX3N0YXRlID09IElFRUU4MDIxMV9TVEFfTk9URVhJU1QgJiYKKwkgICAgbmV3X3N0YXRlID09IElFRUU4MDIxMV9TVEFfTk9ORSkgewogCQlyZXQgPSBhdGg5a19zdGFfYWRkKGh3LCB2aWYsIHN0YSk7CiAJCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsCiAJCQkiQWRkIHN0YXRpb246ICVwTVxuIiwgc3RhLT5hZGRyKTsKLQl9IGVsc2UgaWYgKG9sZF9zdGF0ZSA9PSBJRUVFODAyMTFfU1RBX0FTU09DICYmCi0JCSAgIG5ld19zdGF0ZSA9PSBJRUVFODAyMTFfU1RBX0FVVEgpIHsKKwl9IGVsc2UgaWYgKG9sZF9zdGF0ZSA9PSBJRUVFODAyMTFfU1RBX05PTkUgJiYKKwkJICAgbmV3X3N0YXRlID09IElFRUU4MDIxMV9TVEFfTk9URVhJU1QpIHsKIAkJcmV0ID0gYXRoOWtfc3RhX3JlbW92ZShodywgdmlmLCBzdGEpOwogCQlhdGhfZGJnKGNvbW1vbiwgQ09ORklHLAogCQkJIlJlbW92ZSBzdGF0aW9uOiAlcE1cbiIsIHN0YS0+YWRkcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsveG1pdC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3htaXQuYwppbmRleCA4ZGRkNjA0Li41MmJmYmI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsveG1pdC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay94bWl0LmMKQEAgLTUwLDkgKzUwLDExIEBACiBzdGF0aWMgdm9pZCBhdGhfdHhfc2VuZF9ub3JtYWwoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBhdGhfdHhxICp0eHEsCiAJCQkgICAgICAgc3RydWN0IGF0aF9hdHhfdGlkICp0aWQsIHN0cnVjdCBza19idWZmICpza2IpOwogc3RhdGljIHZvaWQgYXRoX3R4X2NvbXBsZXRlKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgIGludCB0eF9mbGFncywgc3RydWN0IGF0aF90eHEgKnR4cSk7CisJCQkgICAgaW50IHR4X2ZsYWdzLCBzdHJ1Y3QgYXRoX3R4cSAqdHhxLAorCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpOwogc3RhdGljIHZvaWQgYXRoX3R4X2NvbXBsZXRlX2J1ZihzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF9idWYgKmJmLAogCQkJCXN0cnVjdCBhdGhfdHhxICp0eHEsIHN0cnVjdCBsaXN0X2hlYWQgKmJmX3EsCisJCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKIAkJCQlzdHJ1Y3QgYXRoX3R4X3N0YXR1cyAqdHMsIGludCB0eG9rKTsKIHN0YXRpYyB2b2lkIGF0aF90eF90eHFhZGRidWYoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBhdGhfdHhxICp0eHEsCiAJCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIGJvb2wgaW50ZXJuYWwpOwpAQCAtNzcsNiArNzksMjIgQEAKIC8qIEFnZ3JlZ2F0aW9uIGxvZ2ljICovCiAvKioqKioqKioqKioqKioqKioqKioqLwogCitzdGF0aWMgdm9pZCBhdGhfdHhfc3RhdHVzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhID0gaW5mby0+c3RhdHVzLnN0YXR1c19kcml2ZXJfZGF0YVswXTsKKworCWlmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfUkVRX1RYX1NUQVRVUykgeworCQlpZWVlODAyMTFfdHhfc3RhdHVzKGh3LCBza2IpOworCQlyZXR1cm47CisJfQorCisJaWYgKHN0YSkKKwkJaWVlZTgwMjExX3R4X3N0YXR1c19ub3NrYihodywgc3RhLCBpbmZvKTsKKworCWRldl9rZnJlZV9za2Ioc2tiKTsKK30KKwogdm9pZCBhdGhfdHhxX2xvY2soc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBhdGhfdHhxICp0eHEpCiAJX19hY3F1aXJlcygmdHhxLT5heHFfbG9jaykKIHsKQEAgLTkyLDYgKzExMCw3IEBACiB2b2lkIGF0aF90eHFfdW5sb2NrX2NvbXBsZXRlKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX3R4cSAqdHhxKQogCV9fcmVsZWFzZXMoJnR4cS0+YXhxX2xvY2spCiB7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBzYy0+aHc7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCBxOwogCXN0cnVjdCBza19idWZmICpza2I7CiAKQEAgLTEwMCw3ICsxMTksNyBAQAogCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKIAogCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZSgmcSkpKQotCQlpZWVlODAyMTFfdHhfc3RhdHVzKHNjLT5odywgc2tiKTsKKwkJYXRoX3R4X3N0YXR1cyhodywgc2tiKTsKIH0KIAogc3RhdGljIHZvaWQgYXRoX3R4X3F1ZXVlX3RpZChzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF90eHEgKnR4cSwKQEAgLTI1Myw3ICsyNzIsNyBAQAogCQl9CiAKIAkJbGlzdF9hZGRfdGFpbCgmYmYtPmxpc3QsICZiZl9oZWFkKTsKLQkJYXRoX3R4X2NvbXBsZXRlX2J1ZihzYywgYmYsIHR4cSwgJmJmX2hlYWQsICZ0cywgMCk7CisJCWF0aF90eF9jb21wbGV0ZV9idWYoc2MsIGJmLCB0eHEsICZiZl9oZWFkLCBOVUxMLCAmdHMsIDApOwogCX0KIAogCWlmIChzZW5kYmFyKSB7CkBAIC0zMTgsMTIgKzMzNywxMiBAQAogCQliZiA9IGZpLT5iZjsKIAogCQlpZiAoIWJmKSB7Ci0JCQlhdGhfdHhfY29tcGxldGUoc2MsIHNrYiwgQVRIX1RYX0VSUk9SLCB0eHEpOworCQkJYXRoX3R4X2NvbXBsZXRlKHNjLCBza2IsIEFUSF9UWF9FUlJPUiwgdHhxLCBOVUxMKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKIAkJbGlzdF9hZGRfdGFpbCgmYmYtPmxpc3QsICZiZl9oZWFkKTsKLQkJYXRoX3R4X2NvbXBsZXRlX2J1ZihzYywgYmYsIHR4cSwgJmJmX2hlYWQsICZ0cywgMCk7CisJCWF0aF90eF9jb21wbGV0ZV9idWYoc2MsIGJmLCB0eHEsICZiZl9oZWFkLCBOVUxMLCAmdHMsIDApOwogCX0KIH0KIApAQCAtNDI2LDE1ICs0NDUsMTQgQEAKIAogc3RhdGljIHZvaWQgYXRoX3R4X2NvbXBsZXRlX2FnZ3Ioc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBhdGhfdHhxICp0eHEsCiAJCQkJIHN0cnVjdCBhdGhfYnVmICpiZiwgc3RydWN0IGxpc3RfaGVhZCAqYmZfcSwKKwkJCQkgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJCQkgc3RydWN0IGF0aF9hdHhfdGlkICp0aWQsCiAJCQkJIHN0cnVjdCBhdGhfdHhfc3RhdHVzICp0cywgaW50IHR4b2spCiB7CiAJc3RydWN0IGF0aF9ub2RlICphbiA9IE5VTEw7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhOwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gc2MtPmh3OwogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CiAJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eF9pbmZvOwotCXN0cnVjdCBhdGhfYXR4X3RpZCAqdGlkID0gTlVMTDsKIAlzdHJ1Y3QgYXRoX2J1ZiAqYmZfbmV4dCwgKmJmX2xhc3QgPSBiZi0+YmZfbGFzdGJmOwogCXN0cnVjdCBsaXN0X2hlYWQgYmZfaGVhZDsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGJmX3BlbmRpbmc7CkBAIC00NjAsMTIgKzQ3OCw3IEBACiAJZm9yIChpID0gMDsgaSA8IHRzLT50c19yYXRlaW5kZXg7IGkrKykKIAkJcmV0cmllcyArPSByYXRlc1tpXS5jb3VudDsKIAotCXJjdV9yZWFkX2xvY2soKTsKLQotCXN0YSA9IGllZWU4MDIxMV9maW5kX3N0YV9ieV9pZmFkZHIoaHcsIGhkci0+YWRkcjEsIGhkci0+YWRkcjIpOwogCWlmICghc3RhKSB7Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCiAJCUlOSVRfTElTVF9IRUFEKCZiZl9oZWFkKTsKIAkJd2hpbGUgKGJmKSB7CiAJCQliZl9uZXh0ID0gYmYtPmJmX25leHQ7CkBAIC00NzMsNyArNDg2LDcgQEAKIAkJCWlmICghYmYtPmJmX3N0YXRlLnN0YWxlIHx8IGJmX25leHQgIT0gTlVMTCkKIAkJCQlsaXN0X21vdmVfdGFpbCgmYmYtPmxpc3QsICZiZl9oZWFkKTsKIAotCQkJYXRoX3R4X2NvbXBsZXRlX2J1ZihzYywgYmYsIHR4cSwgJmJmX2hlYWQsIHRzLCAwKTsKKwkJCWF0aF90eF9jb21wbGV0ZV9idWYoc2MsIGJmLCB0eHEsICZiZl9oZWFkLCBOVUxMLCB0cywgMCk7CiAKIAkJCWJmID0gYmZfbmV4dDsKIAkJfQpAQCAtNDgxLDcgKzQ5NCw2IEBACiAJfQogCiAJYW4gPSAoc3RydWN0IGF0aF9ub2RlICopc3RhLT5kcnZfcHJpdjsKLQl0aWQgPSBhdGhfZ2V0X3NrYl90aWQoc2MsIGFuLCBza2IpOwogCXNlcV9maXJzdCA9IHRpZC0+c2VxX3N0YXJ0OwogCWlzYmEgPSB0cy0+dHNfZmxhZ3MgJiBBVEg5S19UWF9CQTsKIApAQCAtNTgzLDcgKzU5NSw3IEBACiAJCQkJCQkJCXRzKTsKIAkJCX0KIAotCQkJYXRoX3R4X2NvbXBsZXRlX2J1ZihzYywgYmYsIHR4cSwgJmJmX2hlYWQsIHRzLAorCQkJYXRoX3R4X2NvbXBsZXRlX2J1ZihzYywgYmYsIHR4cSwgJmJmX2hlYWQsIHN0YSwgdHMsCiAJCQkJIXR4ZmFpbCk7CiAJCX0gZWxzZSB7CiAJCQlpZiAodHhfaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfU1RBVFVTX0VPU1ApIHsKQEAgLTYwNCw3ICs2MTYsOCBAQAogCQkJCQlhdGhfdHhfdXBkYXRlX2JhdyhzYywgdGlkLCBzZXFubyk7CiAKIAkJCQkJYXRoX3R4X2NvbXBsZXRlX2J1ZihzYywgYmYsIHR4cSwKLQkJCQkJCQkgICAgJmJmX2hlYWQsIHRzLCAwKTsKKwkJCQkJCQkgICAgJmJmX2hlYWQsIE5VTEwsIHRzLAorCQkJCQkJCSAgICAwKTsKIAkJCQkJYmFyX2luZGV4ID0gbWF4X3QoaW50LCBiYXJfaW5kZXgsCiAJCQkJCQlBVEhfQkFfSU5ERVgoc2VxX2ZpcnN0LCBzZXFubykpOwogCQkJCQlicmVhazsKQEAgLTY0OCw4ICs2NjEsNiBAQAogCQlhdGhfdHhxX2xvY2soc2MsIHR4cSk7CiAJfQogCi0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KIAlpZiAobmVlZHJlc2V0KQogCQlhdGg5a19xdWV1ZV9yZXNldChzYywgUkVTRVRfVFlQRV9UWF9FUlJPUik7CiB9CkBAIC02NjQsNyArNjc1LDExIEBACiAJCQkJICBzdHJ1Y3QgYXRoX3R4X3N0YXR1cyAqdHMsIHN0cnVjdCBhdGhfYnVmICpiZiwKIAkJCQkgIHN0cnVjdCBsaXN0X2hlYWQgKmJmX2hlYWQpCiB7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBzYy0+aHc7CiAJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOworCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwlzdHJ1Y3QgYXRoX2F0eF90aWQgKnRpZCA9IE5VTEw7CiAJYm9vbCB0eG9rLCBmbHVzaDsKIAogCXR4b2sgPSAhKHRzLT50c19zdGF0dXMgJiBBVEg5S19UWEVSUl9NQVNLKTsKQEAgLTY3Nyw2ICs2OTIsMTYgQEAKIAogCXRzLT5kdXJhdGlvbiA9IGF0aDlrX2h3X2dldF9kdXJhdGlvbihzYy0+c2NfYWgsIGJmLT5iZl9kZXNjLAogCQkJCQkgICAgIHRzLT50c19yYXRlaW5kZXgpOworCisJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIGJmLT5iZl9tcGR1LT5kYXRhOworCXN0YSA9IGllZWU4MDIxMV9maW5kX3N0YV9ieV9pZmFkZHIoaHcsIGhkci0+YWRkcjEsIGhkci0+YWRkcjIpOworCWlmIChzdGEpIHsKKwkJc3RydWN0IGF0aF9ub2RlICphbiA9IChzdHJ1Y3QgYXRoX25vZGUgKilzdGEtPmRydl9wcml2OworCQl0aWQgPSBhdGhfZ2V0X3NrYl90aWQoc2MsIGFuLCBiZi0+YmZfbXBkdSk7CisJCWlmICh0cy0+dHNfc3RhdHVzICYgKEFUSDlLX1RYRVJSX0ZJTFQgfCBBVEg5S19UWEVSUl9YUkVUUlkpKQorCQkJdGlkLT5jbGVhcl9wc19maWx0ZXIgPSB0cnVlOworCX0KKwogCWlmICghYmZfaXNhbXBkdShiZikpIHsKIAkJaWYgKCFmbHVzaCkgewogCQkJaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IoYmYtPmJmX21wZHUpOwpAQCAtNjg1LDkgKzcxMCw5IEBACiAJCQlhdGhfdHhfcmNfc3RhdHVzKHNjLCBiZiwgdHMsIDEsIHR4b2sgPyAwIDogMSwgdHhvayk7CiAJCQlhdGhfZHluYWNrX3NhbXBsZV90eF90cyhzYy0+c2NfYWgsIGJmLT5iZl9tcGR1LCB0cyk7CiAJCX0KLQkJYXRoX3R4X2NvbXBsZXRlX2J1ZihzYywgYmYsIHR4cSwgYmZfaGVhZCwgdHMsIHR4b2spOworCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgdHhxLCBiZl9oZWFkLCBzdGEsIHRzLCB0eG9rKTsKIAl9IGVsc2UKLQkJYXRoX3R4X2NvbXBsZXRlX2FnZ3Ioc2MsIHR4cSwgYmYsIGJmX2hlYWQsIHRzLCB0eG9rKTsKKwkJYXRoX3R4X2NvbXBsZXRlX2FnZ3Ioc2MsIHR4cSwgYmYsIGJmX2hlYWQsIHN0YSwgdGlkLCB0cywgdHhvayk7CiAKIAlpZiAoIWZsdXNoKQogCQlhdGhfdHhxX3NjaGVkdWxlKHNjLCB0eHEpOwpAQCAtOTIzLDcgKzk0OCw3IEBACiAJCQlsaXN0X2FkZCgmYmYtPmxpc3QsICZiZl9oZWFkKTsKIAkJCV9fc2tiX3VubGluayhza2IsICpxKTsKIAkJCWF0aF90eF91cGRhdGVfYmF3KHNjLCB0aWQsIHNlcW5vKTsKLQkJCWF0aF90eF9jb21wbGV0ZV9idWYoc2MsIGJmLCB0eHEsICZiZl9oZWFkLCAmdHMsIDApOworCQkJYXRoX3R4X2NvbXBsZXRlX2J1ZihzYywgYmYsIHR4cSwgJmJmX2hlYWQsIE5VTEwsICZ0cywgMCk7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC0xODMyLDYgKzE4NTcsNyBAQAogICovCiB2b2lkIGF0aF9kcmFpbnR4cShzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF90eHEgKnR4cSkKIHsKKwlyY3VfcmVhZF9sb2NrKCk7CiAJYXRoX3R4cV9sb2NrKHNjLCB0eHEpOwogCiAJaWYgKHNjLT5zY19haC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX0VETUEpIHsKQEAgLTE4NTAsNiArMTg3Niw3IEBACiAJYXRoX2RyYWluX3R4cV9saXN0KHNjLCB0eHEsICZ0eHEtPmF4cV9xKTsKIAogCWF0aF90eHFfdW5sb2NrX2NvbXBsZXRlKHNjLCB0eHEpOworCXJjdV9yZWFkX3VubG9jaygpOwogfQogCiBib29sIGF0aF9kcmFpbl9hbGxfdHhxKHN0cnVjdCBhdGhfc29mdGMgKnNjKQpAQCAtMjQ3Miw3ICsyNDk5LDggQEAKIC8qKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQgYXRoX3R4X2NvbXBsZXRlKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgIGludCB0eF9mbGFncywgc3RydWN0IGF0aF90eHEgKnR4cSkKKwkJCSAgICBpbnQgdHhfZmxhZ3MsIHN0cnVjdCBhdGhfdHhxICp0eHEsCisJCQkgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4X2luZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihzYy0+c2NfYWgpOwpAQCAtMjQ5MiwxNSArMjUyMCwxNyBAQAogCQkJdHhfaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1NUQVRfQUNLOwogCX0KIAotCXBhZHBvcyA9IGllZWU4MDIxMV9oZHJsZW4oaGRyLT5mcmFtZV9jb250cm9sKTsKLQlwYWRzaXplID0gcGFkcG9zICYgMzsKLQlpZiAocGFkc2l6ZSAmJiBza2ItPmxlbj5wYWRwb3MrcGFkc2l6ZSkgewotCQkvKgotCQkgKiBSZW1vdmUgTUFDIGhlYWRlciBwYWRkaW5nIGJlZm9yZSBnaXZpbmcgdGhlIGZyYW1lIGJhY2sgdG8KLQkJICogbWFjODAyMTEuCi0JCSAqLwotCQltZW1tb3ZlKHNrYi0+ZGF0YSArIHBhZHNpemUsIHNrYi0+ZGF0YSwgcGFkcG9zKTsKLQkJc2tiX3B1bGwoc2tiLCBwYWRzaXplKTsKKwlpZiAodHhfaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX1JFUV9UWF9TVEFUVVMpIHsKKwkJcGFkcG9zID0gaWVlZTgwMjExX2hkcmxlbihoZHItPmZyYW1lX2NvbnRyb2wpOworCQlwYWRzaXplID0gcGFkcG9zICYgMzsKKwkJaWYgKHBhZHNpemUgJiYgc2tiLT5sZW4+cGFkcG9zK3BhZHNpemUpIHsKKwkJCS8qCisJCQkgKiBSZW1vdmUgTUFDIGhlYWRlciBwYWRkaW5nIGJlZm9yZSBnaXZpbmcgdGhlIGZyYW1lIGJhY2sgdG8KKwkJCSAqIG1hYzgwMjExLgorCQkJICovCisJCQltZW1tb3ZlKHNrYi0+ZGF0YSArIHBhZHNpemUsIHNrYi0+ZGF0YSwgcGFkcG9zKTsKKwkJCXNrYl9wdWxsKHNrYiwgcGFkc2l6ZSk7CisJCX0KIAl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc2MtPnNjX3BtX2xvY2ssIGZsYWdzKTsKQEAgLTI1MTUsMTIgKzI1NDUsMTQgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2MtPnNjX3BtX2xvY2ssIGZsYWdzKTsKIAotCV9fc2tiX3F1ZXVlX3RhaWwoJnR4cS0+Y29tcGxldGVfcSwgc2tiKTsKIAlhdGhfdHhxX3NrYl9kb25lKHNjLCB0eHEsIHNrYik7CisJdHhfaW5mby0+c3RhdHVzLnN0YXR1c19kcml2ZXJfZGF0YVswXSA9IHN0YTsKKwlfX3NrYl9xdWV1ZV90YWlsKCZ0eHEtPmNvbXBsZXRlX3EsIHNrYik7CiB9CiAKIHN0YXRpYyB2b2lkIGF0aF90eF9jb21wbGV0ZV9idWYoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBhdGhfYnVmICpiZiwKIAkJCQlzdHJ1Y3QgYXRoX3R4cSAqdHhxLCBzdHJ1Y3QgbGlzdF9oZWFkICpiZl9xLAorCQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCiAJCQkJc3RydWN0IGF0aF90eF9zdGF0dXMgKnRzLCBpbnQgdHhvaykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYmYtPmJmX21wZHU7CkBAIC0yNTQ4LDcgKzI1ODAsNyBAQAogCQkJY29tcGxldGUoJnNjLT5wYXByZF9jb21wbGV0ZSk7CiAJfSBlbHNlIHsKIAkJYXRoX2RlYnVnX3N0YXRfdHgoc2MsIGJmLCB0cywgdHhxLCB0eF9mbGFncyk7Ci0JCWF0aF90eF9jb21wbGV0ZShzYywgc2tiLCB0eF9mbGFncywgdHhxKTsKKwkJYXRoX3R4X2NvbXBsZXRlKHNjLCBza2IsIHR4X2ZsYWdzLCB0eHEsIHN0YSk7CiAJfQogc2tpcF90eF9jb21wbGV0ZToKIAkvKiBBdCB0aGlzIHBvaW50LCBza2IgKGJmLT5iZl9tcGR1KSBpcyBjb25zdW1lZC4uLm1ha2Ugc3VyZSB3ZSBkb24ndApAQCAtMjcwMCwxMCArMjczMiwxMiBAQAogCXUzMiBxY3VtYXNrID0gKCgxIDw8IEFUSDlLX05VTV9UWF9RVUVVRVMpIC0gMSkgJiBhaC0+aW50cl90eHFzOwogCWludCBpOwogCisJcmN1X3JlYWRfbG9jaygpOwogCWZvciAoaSA9IDA7IGkgPCBBVEg5S19OVU1fVFhfUVVFVUVTOyBpKyspIHsKIAkJaWYgKEFUSF9UWFFfU0VUVVAoc2MsIGkpICYmIChxY3VtYXNrICYgKDEgPDwgaSkpKQogCQkJYXRoX3R4X3Byb2Nlc3NxKHNjLCAmc2MtPnR4LnR4cVtpXSk7CiAJfQorCXJjdV9yZWFkX3VubG9jaygpOwogfQogCiB2b2lkIGF0aF90eF9lZG1hX3Rhc2tsZXQoc3RydWN0IGF0aF9zb2Z0YyAqc2MpCkBAIC0yNzE3LDYgKzI3NTEsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKmZpZm9fbGlzdDsKIAlpbnQgc3RhdHVzOwogCisJcmN1X3JlYWRfbG9jaygpOwogCWZvciAoOzspIHsKIAkJaWYgKHRlc3RfYml0KEFUSF9PUF9IV19SRVNFVCwgJmNvbW1vbi0+b3BfZmxhZ3MpKQogCQkJYnJlYWs7CkBAIC0yNzg3LDYgKzI4MjIsNyBAQAogCQlhdGhfdHhfcHJvY2Vzc19idWZmZXIoc2MsIHR4cSwgJnRzLCBiZiwgJmJmX2hlYWQpOwogCQlhdGhfdHhxX3VubG9ja19jb21wbGV0ZShzYywgdHhxKTsKIAl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9kZWJ1Zy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL2RlYnVnLmMKaW5kZXggNjgwOGRiNC4uZWMzYTY0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL2RlYnVnLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL2RlYnVnLmMKQEAgLTc1LDcgKzc1LDggQEAKIAogCWlmICghYXIpCiAJCXJldHVybiAtRU5PREVWOwotCWRmb3BzID0gY29udGFpbmVyX29mKGZpbGUtPmZfb3AsIHN0cnVjdCBjYXJsOTE3MF9kZWJ1Z2ZzX2ZvcHMsIGZvcHMpOworCWRmb3BzID0gY29udGFpbmVyX29mKGRlYnVnZnNfcmVhbF9mb3BzKGZpbGUpLAorCQkJICAgICBzdHJ1Y3QgY2FybDkxNzBfZGVidWdmc19mb3BzLCBmb3BzKTsKIAogCWlmICghZGZvcHMtPnJlYWQpCiAJCXJldHVybiAtRU5PU1lTOwpAQCAtMTI3LDcgKzEyOCw4IEBACiAKIAlpZiAoIWFyKQogCQlyZXR1cm4gLUVOT0RFVjsKLQlkZm9wcyA9IGNvbnRhaW5lcl9vZihmaWxlLT5mX29wLCBzdHJ1Y3QgY2FybDkxNzBfZGVidWdmc19mb3BzLCBmb3BzKTsKKwlkZm9wcyA9IGNvbnRhaW5lcl9vZihkZWJ1Z2ZzX3JlYWxfZm9wcyhmaWxlKSwKKwkJCSAgICAgc3RydWN0IGNhcmw5MTcwX2RlYnVnZnNfZm9wcywgZm9wcyk7CiAKIAlpZiAoIWRmb3BzLT53cml0ZSkKIAkJcmV0dXJuIC1FTk9TWVM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvdXNiLmMKaW5kZXggNzY4NDJlNi4uOTlhYjIwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC91c2IuYwpAQCAtNjcwLDYgKzY3MCw3IEBACiAJYXItPnJlYWRsZW4gPSBvdXRsZW47CiAJc3Bpbl91bmxvY2tfYmgoJmFyLT5jbWRfbG9jayk7CiAKKwlyZWluaXRfY29tcGxldGlvbigmYXItPmNtZF93YWl0KTsKIAllcnIgPSBfX2Nhcmw5MTcwX2V4ZWNfY21kKGFyLCAmYXItPmNtZCwgZmFsc2UpOwogCiAJaWYgKCEoY21kICYgQ0FSTDkxNzBfQ01EX0FTWU5DX0ZMQUcpKSB7CkBAIC03NzgsMTAgKzc3OSw3IEBACiAJc3Bpbl9sb2NrX2JoKCZhci0+Y21kX2xvY2spOwogCWFyLT5yZWFkbGVuID0gMDsKIAlzcGluX3VubG9ja19iaCgmYXItPmNtZF9sb2NrKTsKLQljb21wbGV0ZV9hbGwoJmFyLT5jbWRfd2FpdCk7Ci0KLQkvKiBUaGlzIGlzIHJlcXVpcmVkIHRvIHByZXZlbnQgYW4gZWFybHkgY29tcGxldGlvbiBvbiBfc3RhcnQgKi8KLQlyZWluaXRfY29tcGxldGlvbigmYXItPmNtZF93YWl0KTsKKwljb21wbGV0ZSgmYXItPmNtZF93YWl0KTsKIAogCS8qCiAJICogTm90ZToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9kZnNfcGF0dGVybl9kZXRlY3Rvci5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Rmc19wYXR0ZXJuX2RldGVjdG9yLmMKaW5kZXggMmY4MTM2ZC4uNDEwMGZmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Rmc19wYXR0ZXJuX2RldGVjdG9yLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Rmc19wYXR0ZXJuX2RldGVjdG9yLmMKQEAgLTMzOCw3ICszMzgsNyBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgc3RydWN0IGRmc19wYXR0ZXJuX2RldGVjdG9yIGRlZmF1bHRfZHBkID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBkZnNfcGF0dGVybl9kZXRlY3RvciBkZWZhdWx0X2RwZCA9IHsKIAkuZXhpdAkJPSBkcGRfZXhpdCwKIAkuc2V0X2Rmc19kb21haW4JPSBkcGRfc2V0X2RvbWFpbiwKIAkuYWRkX3B1bHNlCT0gZHBkX2FkZF9wdWxzZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2NmZzgwMjExLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9jZmc4MDIxMS5jCmluZGV4IGYwZTExNzUuLmQxMTcyNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2NmZzgwMjExLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvY2ZnODAyMTEuYwpAQCAtMzU0LDEwICszNTQsMTMgQEAKIAl3aWxfZGJnX21pc2Mod2lsLCAiJXMoKSwgd2Rldj0weCVwIGlmdHlwZT0lZFxuIiwKIAkJICAgICBfX2Z1bmNfXywgd2Rldiwgd2Rldi0+aWZ0eXBlKTsKIAorCW11dGV4X2xvY2soJndpbC0+cDJwX3dkZXZfbXV0ZXgpOwogCWlmICh3aWwtPnNjYW5fcmVxdWVzdCkgewogCQl3aWxfZXJyKHdpbCwgIkFscmVhZHkgc2Nhbm5pbmdcbiIpOworCQltdXRleF91bmxvY2soJndpbC0+cDJwX3dkZXZfbXV0ZXgpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CisJbXV0ZXhfdW5sb2NrKCZ3aWwtPnAycF93ZGV2X211dGV4KTsKIAogCS8qIGNoZWNrIHdlIGFyZSBjbGllbnQgc2lkZSAqLwogCXN3aXRjaCAod2Rldi0+aWZ0eXBlKSB7CkBAIC03NjAsMTQgKzc2MywxMSBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIHN0cnVjdCB3aWxfdGlkX2NyeXB0b19yeF9zaW5nbGUgKgotd2lsX2ZpbmRfY3J5cHRvX2N0eChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIHU4IGtleV9pbmRleCwKLQkJICAgIGVudW0gd21pX2tleV91c2FnZSBrZXlfdXNhZ2UsIGNvbnN0IHU4ICptYWNfYWRkcikKK3N0YXRpYyBzdHJ1Y3Qgd2lsX3N0YV9pbmZvICoKK3dpbF9maW5kX3N0YV9ieV9rZXlfdXNhZ2Uoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLAorCQkJICBlbnVtIHdtaV9rZXlfdXNhZ2Uga2V5X3VzYWdlLCBjb25zdCB1OCAqbWFjX2FkZHIpCiB7CiAJaW50IGNpZCA9IC1FSU5WQUw7Ci0JaW50IHRpZCA9IDA7Ci0Jc3RydWN0IHdpbF9zdGFfaW5mbyAqczsKLQlzdHJ1Y3Qgd2lsX3RpZF9jcnlwdG9fcnggKmM7CiAKIAlpZiAoa2V5X3VzYWdlID09IFdNSV9LRVlfVVNFX1RYX0dST1VQKQogCQlyZXR1cm4gTlVMTDsgLyogbm90IG5lZWRlZCAqLwpAQCAtNzc4LDE4ICs3NzgsNzIgQEAKIAllbHNlIGlmIChrZXlfdXNhZ2UgPT0gV01JX0tFWV9VU0VfUlhfR1JPVVApCiAJCWNpZCA9IHdpbF9maW5kX2NpZF9ieV9pZHgod2lsLCAwKTsKIAlpZiAoY2lkIDwgMCkgewotCQl3aWxfZXJyKHdpbCwgIk5vIENJRCBmb3IgJXBNICVzWyVkXVxuIiwgbWFjX2FkZHIsCi0JCQlrZXlfdXNhZ2Vfc3RyW2tleV91c2FnZV0sIGtleV9pbmRleCk7CisJCXdpbF9lcnIod2lsLCAiTm8gQ0lEIGZvciAlcE0gJXNcbiIsIG1hY19hZGRyLAorCQkJa2V5X3VzYWdlX3N0cltrZXlfdXNhZ2VdKTsKIAkJcmV0dXJuIEVSUl9QVFIoY2lkKTsKIAl9CiAKLQlzID0gJndpbC0+c3RhW2NpZF07Ci0JaWYgKGtleV91c2FnZSA9PSBXTUlfS0VZX1VTRV9QQUlSV0lTRSkKLQkJYyA9ICZzLT50aWRfY3J5cHRvX3J4W3RpZF07Ci0JZWxzZQotCQljID0gJnMtPmdyb3VwX2NyeXB0b19yeDsKKwlyZXR1cm4gJndpbC0+c3RhW2NpZF07Cit9CiAKLQlyZXR1cm4gJmMtPmtleV9pZFtrZXlfaW5kZXhdOworc3RhdGljIHZvaWQgd2lsX3NldF9jcnlwdG9fcngodTgga2V5X2luZGV4LCBlbnVtIHdtaV9rZXlfdXNhZ2Uga2V5X3VzYWdlLAorCQkJICAgICAgc3RydWN0IHdpbF9zdGFfaW5mbyAqY3MsCisJCQkgICAgICBzdHJ1Y3Qga2V5X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCB3aWxfdGlkX2NyeXB0b19yeF9zaW5nbGUgKmNjOworCWludCB0aWQ7CisKKwlpZiAoIWNzKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGtleV91c2FnZSkgeworCWNhc2UgV01JX0tFWV9VU0VfUEFJUldJU0U6CisJCWZvciAodGlkID0gMDsgdGlkIDwgV0lMX1NUQV9USURfTlVNOyB0aWQrKykgeworCQkJY2MgPSAmY3MtPnRpZF9jcnlwdG9fcnhbdGlkXS5rZXlfaWRba2V5X2luZGV4XTsKKwkJCWlmIChwYXJhbXMtPnNlcSkKKwkJCQltZW1jcHkoY2MtPnBuLCBwYXJhbXMtPnNlcSwKKwkJCQkgICAgICAgSUVFRTgwMjExX0dDTVBfUE5fTEVOKTsKKwkJCWVsc2UKKwkJCQltZW1zZXQoY2MtPnBuLCAwLCBJRUVFODAyMTFfR0NNUF9QTl9MRU4pOworCQkJY2MtPmtleV9zZXQgPSB0cnVlOworCQl9CisJCWJyZWFrOworCWNhc2UgV01JX0tFWV9VU0VfUlhfR1JPVVA6CisJCWNjID0gJmNzLT5ncm91cF9jcnlwdG9fcngua2V5X2lkW2tleV9pbmRleF07CisJCWlmIChwYXJhbXMtPnNlcSkKKwkJCW1lbWNweShjYy0+cG4sIHBhcmFtcy0+c2VxLCBJRUVFODAyMTFfR0NNUF9QTl9MRU4pOworCQllbHNlCisJCQltZW1zZXQoY2MtPnBuLCAwLCBJRUVFODAyMTFfR0NNUF9QTl9MRU4pOworCQljYy0+a2V5X3NldCA9IHRydWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgd2lsX2RlbF9yeF9rZXkodTgga2V5X2luZGV4LCBlbnVtIHdtaV9rZXlfdXNhZ2Uga2V5X3VzYWdlLAorCQkJICAgc3RydWN0IHdpbF9zdGFfaW5mbyAqY3MpCit7CisJc3RydWN0IHdpbF90aWRfY3J5cHRvX3J4X3NpbmdsZSAqY2M7CisJaW50IHRpZDsKKworCWlmICghY3MpCisJCXJldHVybjsKKworCXN3aXRjaCAoa2V5X3VzYWdlKSB7CisJY2FzZSBXTUlfS0VZX1VTRV9QQUlSV0lTRToKKwkJZm9yICh0aWQgPSAwOyB0aWQgPCBXSUxfU1RBX1RJRF9OVU07IHRpZCsrKSB7CisJCQljYyA9ICZjcy0+dGlkX2NyeXB0b19yeFt0aWRdLmtleV9pZFtrZXlfaW5kZXhdOworCQkJY2MtPmtleV9zZXQgPSBmYWxzZTsKKwkJfQorCQlicmVhazsKKwljYXNlIFdNSV9LRVlfVVNFX1JYX0dST1VQOgorCQljYyA9ICZjcy0+Z3JvdXBfY3J5cHRvX3J4LmtleV9pZFtrZXlfaW5kZXhdOworCQljYy0+a2V5X3NldCA9IGZhbHNlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgd2lsX2NmZzgwMjExX2FkZF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwKQEAgLTgwMSwyNCArODU1LDI2IEBACiAJaW50IHJjOwogCXN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCA9IHdpcGh5X3RvX3dpbCh3aXBoeSk7CiAJZW51bSB3bWlfa2V5X3VzYWdlIGtleV91c2FnZSA9IHdpbF9kZXRlY3Rfa2V5X3VzYWdlKHdpbCwgcGFpcndpc2UpOwotCXN0cnVjdCB3aWxfdGlkX2NyeXB0b19yeF9zaW5nbGUgKmNjID0gd2lsX2ZpbmRfY3J5cHRvX2N0eCh3aWwsCi0JCQkJCQkJCSAga2V5X2luZGV4LAotCQkJCQkJCQkgIGtleV91c2FnZSwKLQkJCQkJCQkJICBtYWNfYWRkcik7CisJc3RydWN0IHdpbF9zdGFfaW5mbyAqY3MgPSB3aWxfZmluZF9zdGFfYnlfa2V5X3VzYWdlKHdpbCwga2V5X3VzYWdlLAorCQkJCQkJCSAgICBtYWNfYWRkcik7CisKKwlpZiAoIXBhcmFtcykgeworCQl3aWxfZXJyKHdpbCwgIk5VTEwgcGFyYW1zXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJd2lsX2RiZ19taXNjKHdpbCwgIiVzKCVwTSAlc1slZF0gUE4gJSpwaE4pXG4iLCBfX2Z1bmNfXywKIAkJICAgICBtYWNfYWRkciwga2V5X3VzYWdlX3N0cltrZXlfdXNhZ2VdLCBrZXlfaW5kZXgsCiAJCSAgICAgcGFyYW1zLT5zZXFfbGVuLCBwYXJhbXMtPnNlcSk7CiAKLQlpZiAoSVNfRVJSKGNjKSkgeworCWlmIChJU19FUlIoY3MpKSB7CiAJCXdpbF9lcnIod2lsLCAiTm90IGNvbm5lY3RlZCwgJXMoJXBNICVzWyVkXSBQTiAlKnBoTilcbiIsCiAJCQlfX2Z1bmNfXywgbWFjX2FkZHIsIGtleV91c2FnZV9zdHJba2V5X3VzYWdlXSwga2V5X2luZGV4LAogCQkJcGFyYW1zLT5zZXFfbGVuLCBwYXJhbXMtPnNlcSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChjYykKLQkJY2MtPmtleV9zZXQgPSBmYWxzZTsKKwl3aWxfZGVsX3J4X2tleShrZXlfaW5kZXgsIGtleV91c2FnZSwgY3MpOwogCiAJaWYgKHBhcmFtcy0+c2VxICYmIHBhcmFtcy0+c2VxX2xlbiAhPSBJRUVFODAyMTFfR0NNUF9QTl9MRU4pIHsKIAkJd2lsX2Vycih3aWwsCkBAIC04MzEsMTMgKzg4Nyw4IEBACiAKIAlyYyA9IHdtaV9hZGRfY2lwaGVyX2tleSh3aWwsIGtleV9pbmRleCwgbWFjX2FkZHIsIHBhcmFtcy0+a2V5X2xlbiwKIAkJCQlwYXJhbXMtPmtleSwga2V5X3VzYWdlKTsKLQlpZiAoKHJjID09IDApICYmIGNjKSB7Ci0JCWlmIChwYXJhbXMtPnNlcSkKLQkJCW1lbWNweShjYy0+cG4sIHBhcmFtcy0+c2VxLCBJRUVFODAyMTFfR0NNUF9QTl9MRU4pOwotCQllbHNlCi0JCQltZW1zZXQoY2MtPnBuLCAwLCBJRUVFODAyMTFfR0NNUF9QTl9MRU4pOwotCQljYy0+a2V5X3NldCA9IHRydWU7Ci0JfQorCWlmICghcmMpCisJCXdpbF9zZXRfY3J5cHRvX3J4KGtleV9pbmRleCwga2V5X3VzYWdlLCBjcywgcGFyYW1zKTsKIAogCXJldHVybiByYzsKIH0KQEAgLTg0OSwyMCArOTAwLDE4IEBACiB7CiAJc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsID0gd2lwaHlfdG9fd2lsKHdpcGh5KTsKIAllbnVtIHdtaV9rZXlfdXNhZ2Uga2V5X3VzYWdlID0gd2lsX2RldGVjdF9rZXlfdXNhZ2Uod2lsLCBwYWlyd2lzZSk7Ci0Jc3RydWN0IHdpbF90aWRfY3J5cHRvX3J4X3NpbmdsZSAqY2MgPSB3aWxfZmluZF9jcnlwdG9fY3R4KHdpbCwKLQkJCQkJCQkJICBrZXlfaW5kZXgsCi0JCQkJCQkJCSAga2V5X3VzYWdlLAotCQkJCQkJCQkgIG1hY19hZGRyKTsKKwlzdHJ1Y3Qgd2lsX3N0YV9pbmZvICpjcyA9IHdpbF9maW5kX3N0YV9ieV9rZXlfdXNhZ2Uod2lsLCBrZXlfdXNhZ2UsCisJCQkJCQkJICAgIG1hY19hZGRyKTsKIAogCXdpbF9kYmdfbWlzYyh3aWwsICIlcyglcE0gJXNbJWRdKVxuIiwgX19mdW5jX18sIG1hY19hZGRyLAogCQkgICAgIGtleV91c2FnZV9zdHJba2V5X3VzYWdlXSwga2V5X2luZGV4KTsKIAotCWlmIChJU19FUlIoY2MpKQorCWlmIChJU19FUlIoY3MpKQogCQl3aWxfaW5mbyh3aWwsICJOb3QgY29ubmVjdGVkLCAlcyglcE0gJXNbJWRdKVxuIiwgX19mdW5jX18sCiAJCQkgbWFjX2FkZHIsIGtleV91c2FnZV9zdHJba2V5X3VzYWdlXSwga2V5X2luZGV4KTsKIAotCWlmICghSVNfRVJSX09SX05VTEwoY2MpKQotCQljYy0+a2V5X3NldCA9IGZhbHNlOworCWlmICghSVNfRVJSX09SX05VTEwoY3MpKQorCQl3aWxfZGVsX3J4X2tleShrZXlfaW5kZXgsIGtleV91c2FnZSwgY3MpOwogCiAJcmV0dXJuIHdtaV9kZWxfY2lwaGVyX2tleSh3aWwsIGtleV9pbmRleCwgbWFjX2FkZHIsIGtleV91c2FnZSk7CiB9CkBAIC0xMzYzLDIzICsxNDEyLDE2IEBACiAJCQkJCSBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KQogewogCXN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCA9IHdpcGh5X3RvX3dpbCh3aXBoeSk7Ci0JdTggc3RhcnRlZDsKKwlzdHJ1Y3Qgd2lsX3AycF9pbmZvICpwMnAgPSAmd2lsLT5wMnA7CisKKwlpZiAoIXAycC0+cDJwX2Rldl9zdGFydGVkKQorCQlyZXR1cm47CiAKIAl3aWxfZGJnX21pc2Mod2lsLCAiJXM6IGVudGVyZWRcbiIsIF9fZnVuY19fKTsKIAltdXRleF9sb2NrKCZ3aWwtPm11dGV4KTsKLQlzdGFydGVkID0gd2lsX3AycF9zdG9wX2Rpc2NvdmVyeSh3aWwpOwotCWlmIChzdGFydGVkICYmIHdpbC0+c2Nhbl9yZXF1ZXN0KSB7Ci0JCXN0cnVjdCBjZmc4MDIxMV9zY2FuX2luZm8gaW5mbyA9IHsKLQkJCS5hYm9ydGVkID0gdHJ1ZSwKLQkJfTsKLQotCQljZmc4MDIxMV9zY2FuX2RvbmUod2lsLT5zY2FuX3JlcXVlc3QsICZpbmZvKTsKLQkJd2lsLT5zY2FuX3JlcXVlc3QgPSBOVUxMOwotCQl3aWwtPnJhZGlvX3dkZXYgPSB3aWwtPndkZXY7Ci0JfQorCXdpbF9wMnBfc3RvcF9yYWRpb19vcGVyYXRpb25zKHdpbCk7CisJcDJwLT5wMnBfZGV2X3N0YXJ0ZWQgPSAwOwogCW11dGV4X3VubG9jaygmd2lsLT5tdXRleCk7Ci0KLQl3aWwtPnAycC5wMnBfZGV2X3N0YXJ0ZWQgPSAwOwogfQogCiBzdGF0aWMgc3RydWN0IGNmZzgwMjExX29wcyB3aWxfY2ZnODAyMTFfb3BzID0gewpAQCAtMTQ2NCwxNCArMTUwNiw4IEBACiAJc2V0X3dpcGh5X2Rldih3ZGV2LT53aXBoeSwgZGV2KTsKIAl3aWxfd2lwaHlfaW5pdCh3ZGV2LT53aXBoeSk7CiAKLQlyYyA9IHdpcGh5X3JlZ2lzdGVyKHdkZXYtPndpcGh5KTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIG91dF9mYWlsZWRfcmVnOwotCiAJcmV0dXJuIHdkZXY7CiAKLW91dF9mYWlsZWRfcmVnOgotCXdpcGh5X2ZyZWUod2Rldi0+d2lwaHkpOwogb3V0OgogCWtmcmVlKHdkZXYpOwogCkBAIC0xNDg3LDcgKzE1MjMsNiBAQAogCWlmICghd2RldikKIAkJcmV0dXJuOwogCi0Jd2lwaHlfdW5yZWdpc3Rlcih3ZGV2LT53aXBoeSk7CiAJd2lwaHlfZnJlZSh3ZGV2LT53aXBoeSk7CiAJa2ZyZWUod2Rldik7CiB9CkBAIC0xNDk4LDExICsxNTMzLDExIEBACiAKIAltdXRleF9sb2NrKCZ3aWwtPnAycF93ZGV2X211dGV4KTsKIAlwMnBfd2RldiA9IHdpbC0+cDJwX3dkZXY7CisJd2lsLT5wMnBfd2RldiA9IE5VTEw7CisJd2lsLT5yYWRpb193ZGV2ID0gd2lsX3RvX3dkZXYod2lsKTsKKwltdXRleF91bmxvY2soJndpbC0+cDJwX3dkZXZfbXV0ZXgpOwogCWlmIChwMnBfd2RldikgewotCQl3aWwtPnAycF93ZGV2ID0gTlVMTDsKLQkJd2lsLT5yYWRpb193ZGV2ID0gd2lsX3RvX3dkZXYod2lsKTsKIAkJY2ZnODAyMTFfdW5yZWdpc3Rlcl93ZGV2KHAycF93ZGV2KTsKIAkJa2ZyZWUocDJwX3dkZXYpOwogCX0KLQltdXRleF91bmxvY2soJndpbC0+cDJwX3dkZXZfbXV0ZXgpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvZGVidWdmcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvZGVidWdmcy5jCmluZGV4IGE4MDk4YjQuLjVlNDA1OGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2RlYnVnZnMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9kZWJ1Z2ZzLmMKQEAgLTE1NTMsNiArMTU1Myw1NiBAQAogCS5vcGVuICA9IHNpbXBsZV9vcGVuLAogfTsKIAorLyotLS0tLS0tLS1GVyBjYXBhYmlsaXRpZXMtLS0tLS0tLS0tLS0qLworc3RhdGljIGludCB3aWxfZndfY2FwYWJpbGl0aWVzX2RlYnVnZnNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsID0gcy0+cHJpdmF0ZTsKKworCXNlcV9wcmludGYocywgImZ3X2NhcGFiaWxpdGllcyA6ICUqcGJcbiIsIFdNSV9GV19DQVBBQklMSVRZX01BWCwKKwkJICAgd2lsLT5md19jYXBhYmlsaXRpZXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2lsX2Z3X2NhcGFiaWxpdGllc19zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgd2lsX2Z3X2NhcGFiaWxpdGllc19kZWJ1Z2ZzX3Nob3csCisJCQkgICBpbm9kZS0+aV9wcml2YXRlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wc19md19jYXBhYmlsaXRpZXMgPSB7CisJLm9wZW4JCT0gd2lsX2Z3X2NhcGFiaWxpdGllc19zZXFfb3BlbiwKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorfTsKKworLyotLS0tLS0tLS1GVyB2ZXJzaW9uLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgd2lsX2Z3X3ZlcnNpb25fZGVidWdmc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwgPSBzLT5wcml2YXRlOworCisJaWYgKHdpbC0+ZndfdmVyc2lvblswXSkKKwkJc2VxX3ByaW50ZihzLCAiJXNcbiIsIHdpbC0+ZndfdmVyc2lvbik7CisJZWxzZQorCQlzZXFfcHV0cyhzLCAiTi9BXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdpbF9md192ZXJzaW9uX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCB3aWxfZndfdmVyc2lvbl9kZWJ1Z2ZzX3Nob3csCisJCQkgICBpbm9kZS0+aV9wcml2YXRlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wc19md192ZXJzaW9uID0geworCS5vcGVuCQk9IHdpbF9md192ZXJzaW9uX3NlcV9vcGVuLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCit9OworCiAvKi0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIHZvaWQgd2lsNjIxMF9kZWJ1Z2ZzX2luaXRfYmxvYnMoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLAogCQkJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICpkYmcpCkBAIC0xNjAzLDYgKzE2NTMsOCBAQAogCXsicmVjb3ZlcnkiLAlTX0lSVUdPIHwgU19JV1VTUiwJJmZvcHNfcmVjb3Zlcnl9LAogCXsibGVkX2NmZyIsCVNfSVJVR08gfCBTX0lXVVNSLAkmZm9wc19sZWRfY2ZnfSwKIAl7ImxlZF9ibGlua190aW1lIiwJU19JUlVHTyB8IFNfSVdVU1IsCSZmb3BzX2xlZF9ibGlua190aW1lfSwKKwl7ImZ3X2NhcGFiaWxpdGllcyIsCVNfSVJVR08sCSZmb3BzX2Z3X2NhcGFiaWxpdGllc30sCisJeyJmd192ZXJzaW9uIiwJU19JUlVHTywJCSZmb3BzX2Z3X3ZlcnNpb259LAogfTsKIAogc3RhdGljIHZvaWQgd2lsNjIxMF9kZWJ1Z2ZzX2luaXRfZmlsZXMoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLApAQCAtMTY0Myw3ICsxNjk1LDYgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGJnX29mZiBkYmdfd2lsX29mZltdID0gewogCVdJTF9GSUVMRChwcml2YWN5LAlTX0lSVUdPLAkJZG9mZl91MzIpLAogCVdJTF9GSUVMRChzdGF0dXNbMF0sCVNfSVJVR08gfCBTX0lXVVNSLAlkb2ZmX3Vsb25nKSwKLQlXSUxfRklFTEQoZndfdmVyc2lvbiwJU19JUlVHTywJCWRvZmZfdTMyKSwKIAlXSUxfRklFTEQoaHdfdmVyc2lvbiwJU19JUlVHTywJCWRvZmZfeDMyKSwKIAlXSUxfRklFTEQocmVjb3ZlcnlfY291bnQsIFNfSVJVR08sCQlkb2ZmX3UzMiksCiAJV0lMX0ZJRUxEKGFwX2lzb2xhdGUsCVNfSVJVR08sCQlkb2ZmX3UzMiksCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9mdy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvZncuaAppbmRleCA3YTJjNmMxLi4yZjJiOTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9mdy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2Z3LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDE0IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNCwyMDE2IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KICAqCiAgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKICAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKQEAgLTU4LDYgKzU4LDE1IEBACiAJdTggZGF0YVswXTsgLyogZnJlZS1mb3JtIGRhdGEgW2RhdGFfc2l6ZV0sIHNlZSBhYm92ZSAqLwogfSBfX3BhY2tlZDsKIAorLyogRlcgY2FwYWJpbGl0aWVzIGVuY29kZWQgaW5zaWRlIGEgY29tbWVudCByZWNvcmQgKi8KKyNkZWZpbmUgV0lMX0ZXX0NBUEFCSUxJVElFU19NQUdJQyAoMHhhYmNkZGNiYSkKK3N0cnVjdCB3aWxfZndfcmVjb3JkX2NhcGFiaWxpdGllcyB7IC8qIHR5cGUgPT0gd2lsX2Z3X3R5cGVfY29tbWVudCAqLworCS8qIGlkZW50aWZpZXMgY2FwYWJpbGl0aWVzIHJlY29yZCAqLworCV9fbGUzMiBtYWdpYzsKKwkvKiBjYXBhYmlsaXRpZXMgKHZhcmlhYmxlIHNpemUpLCBzZWUgZW51bSB3bWlfZndfY2FwYWJpbGl0eSAqLworCXU4IGNhcGFiaWxpdGllc1swXTsKK307CisKIC8qIHBlcmZvcm0gYWN0aW9uCiAgKiBkYXRhX3NpemUgPSBAaGVhZC5zaXplIC0gb2Zmc2V0b2Yoc3RydWN0IHdpbF9md19yZWNvcmRfYWN0aW9uLCBkYXRhKQogICovCkBAIC05Myw2ICsxMDIsOSBAQAogLyogZmlsZSBoZWFkZXIKICAqIEZpcnN0IHJlY29yZCBvZiBldmVyeSBmaWxlCiAgKi8KKy8qIHRoZSBGVyB2ZXJzaW9uIHByZWZpeCBpbiB0aGUgY29tbWVudCAqLworI2RlZmluZSBXSUxfRldfVkVSU0lPTl9QUkVGSVggIkZXIHZlcnNpb246ICIKKyNkZWZpbmUgV0lMX0ZXX1ZFUlNJT05fUFJFRklYX0xFTiAoc2l6ZW9mKFdJTF9GV19WRVJTSU9OX1BSRUZJWCkgLSAxKQogc3RydWN0IHdpbF9md19yZWNvcmRfZmlsZV9oZWFkZXIgewogCV9fbGUzMiBzaWduYXR1cmUgOyAvKiBXaWxvY2l0eSBzaWduYXR1cmUgKi8KIAlfX2xlMzIgcmVzZXJ2ZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9md19pbmMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2Z3X2luYy5jCmluZGV4IGQzMDY1N2UuLjhmNDBlYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2Z3X2luYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2Z3X2luYy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE2IFF1YWxjb21tIEF0aGVyb3MsIEluYy4KICAqCiAgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKICAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKQEAgLTExOCw2ICsxMTgsMTIgQEAKIAlyZXR1cm4gKGludClkbGVuOwogfQogCitzdGF0aWMgaW50IGZ3X2lnbm9yZV9zZWN0aW9uKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCSAgICAgc2l6ZV90IHNpemUpCit7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgZndfaGFuZGxlX2NvbW1lbnQoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCBjb25zdCB2b2lkICpkYXRhLAogCQkJICAgICBzaXplX3Qgc2l6ZSkKIHsKQEAgLTEyNiw2ICsxMzIsMjcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludAorZndfaGFuZGxlX2NhcGFiaWxpdGllcyhzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGNvbnN0IHZvaWQgKmRhdGEsCisJCSAgICAgICBzaXplX3Qgc2l6ZSkKK3sKKwljb25zdCBzdHJ1Y3Qgd2lsX2Z3X3JlY29yZF9jYXBhYmlsaXRpZXMgKnJlYyA9IGRhdGE7CisJc2l6ZV90IGNhcGFfc2l6ZTsKKworCWlmIChzaXplIDwgc2l6ZW9mKCpyZWMpIHx8CisJICAgIGxlMzJfdG9fY3B1KHJlYy0+bWFnaWMpICE9IFdJTF9GV19DQVBBQklMSVRJRVNfTUFHSUMpCisJCXJldHVybiAwOworCisJY2FwYV9zaXplID0gc2l6ZSAtIG9mZnNldG9mKHN0cnVjdCB3aWxfZndfcmVjb3JkX2NhcGFiaWxpdGllcywKKwkJCQkgICAgY2FwYWJpbGl0aWVzKTsKKwliaXRtYXBfemVybyh3aWwtPmZ3X2NhcGFiaWxpdGllcywgV01JX0ZXX0NBUEFCSUxJVFlfTUFYKTsKKwltZW1jcHkod2lsLT5md19jYXBhYmlsaXRpZXMsIHJlYy0+Y2FwYWJpbGl0aWVzLAorCSAgICAgICBtaW4oc2l6ZW9mKHdpbC0+ZndfY2FwYWJpbGl0aWVzKSwgY2FwYV9zaXplKSk7CisJd2lsX2hleF9kdW1wX2Z3KCJDQVBBIiwgRFVNUF9QUkVGSVhfT0ZGU0VULCAxNiwgMSwKKwkJCXJlYy0+Y2FwYWJpbGl0aWVzLCBjYXBhX3NpemUsIGZhbHNlKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBmd19oYW5kbGVfZGF0YShzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGNvbnN0IHZvaWQgKmRhdGEsCiAJCQkgIHNpemVfdCBzaXplKQogewpAQCAtMTk2LDYgKzIyMywxMyBAQAogCXdpbF9oZXhfZHVtcF9mdygiIiwgRFVNUF9QUkVGSVhfT0ZGU0VULCAxNiwgMSwgZC0+Y29tbWVudCwKIAkJCXNpemVvZihkLT5jb21tZW50KSwgdHJ1ZSk7CiAKKwlpZiAoIW1lbWNtcChkLT5jb21tZW50LCBXSUxfRldfVkVSU0lPTl9QUkVGSVgsCisJCSAgICBXSUxfRldfVkVSU0lPTl9QUkVGSVhfTEVOKSkKKwkJbWVtY3B5KHdpbC0+ZndfdmVyc2lvbiwKKwkJICAgICAgIGQtPmNvbW1lbnQgKyBXSUxfRldfVkVSU0lPTl9QUkVGSVhfTEVOLAorCQkgICAgICAgbWluKHNpemVvZihkLT5jb21tZW50KSAtIFdJTF9GV19WRVJTSU9OX1BSRUZJWF9MRU4sCisJCQkgICBzaXplb2Yod2lsLT5md192ZXJzaW9uKSAtIDEpKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0zODMsNDIgKzQxNyw1MSBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHsKIAlpbnQgdHlwZTsKLQlpbnQgKCpoYW5kbGVyKShzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKwlpbnQgKCpsb2FkX2hhbmRsZXIpKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCSAgICBzaXplX3Qgc2l6ZSk7CisJaW50ICgqcGFyc2VfaGFuZGxlcikoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCBjb25zdCB2b2lkICpkYXRhLAorCQkJICAgICBzaXplX3Qgc2l6ZSk7CiB9IHdpbF9md19oYW5kbGVyc1tdID0gewotCXt3aWxfZndfdHlwZV9jb21tZW50LCBmd19oYW5kbGVfY29tbWVudH0sCi0Je3dpbF9md190eXBlX2RhdGEsIGZ3X2hhbmRsZV9kYXRhfSwKLQl7d2lsX2Z3X3R5cGVfZmlsbCwgZndfaGFuZGxlX2ZpbGx9LAorCXt3aWxfZndfdHlwZV9jb21tZW50LCBmd19oYW5kbGVfY29tbWVudCwgZndfaGFuZGxlX2NhcGFiaWxpdGllc30sCisJe3dpbF9md190eXBlX2RhdGEsIGZ3X2hhbmRsZV9kYXRhLCBmd19pZ25vcmVfc2VjdGlvbn0sCisJe3dpbF9md190eXBlX2ZpbGwsIGZ3X2hhbmRsZV9maWxsLCBmd19pZ25vcmVfc2VjdGlvbn0sCiAJLyogd2lsX2Z3X3R5cGVfYWN0aW9uICovCiAJLyogd2lsX2Z3X3R5cGVfdmVyaWZ5ICovCi0Je3dpbF9md190eXBlX2ZpbGVfaGVhZGVyLCBmd19oYW5kbGVfZmlsZV9oZWFkZXJ9LAotCXt3aWxfZndfdHlwZV9kaXJlY3Rfd3JpdGUsIGZ3X2hhbmRsZV9kaXJlY3Rfd3JpdGV9LAotCXt3aWxfZndfdHlwZV9nYXRld2F5X2RhdGEsIGZ3X2hhbmRsZV9nYXRld2F5X2RhdGF9LAotCXt3aWxfZndfdHlwZV9nYXRld2F5X2RhdGE0LCBmd19oYW5kbGVfZ2F0ZXdheV9kYXRhNH0sCisJe3dpbF9md190eXBlX2ZpbGVfaGVhZGVyLCBmd19oYW5kbGVfZmlsZV9oZWFkZXIsCisJCWZ3X2hhbmRsZV9maWxlX2hlYWRlcn0sCisJe3dpbF9md190eXBlX2RpcmVjdF93cml0ZSwgZndfaGFuZGxlX2RpcmVjdF93cml0ZSwgZndfaWdub3JlX3NlY3Rpb259LAorCXt3aWxfZndfdHlwZV9nYXRld2F5X2RhdGEsIGZ3X2hhbmRsZV9nYXRld2F5X2RhdGEsIGZ3X2lnbm9yZV9zZWN0aW9ufSwKKwl7d2lsX2Z3X3R5cGVfZ2F0ZXdheV9kYXRhNCwgZndfaGFuZGxlX2dhdGV3YXlfZGF0YTQsCisJCWZ3X2lnbm9yZV9zZWN0aW9ufSwKIH07CiAKIHN0YXRpYyBpbnQgd2lsX2Z3X2hhbmRsZV9yZWNvcmQoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCBpbnQgdHlwZSwKLQkJCQljb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkKKwkJCQljb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgYm9vbCBsb2FkKQogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod2lsX2Z3X2hhbmRsZXJzKTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod2lsX2Z3X2hhbmRsZXJzKTsgaSsrKQogCQlpZiAod2lsX2Z3X2hhbmRsZXJzW2ldLnR5cGUgPT0gdHlwZSkKLQkJCXJldHVybiB3aWxfZndfaGFuZGxlcnNbaV0uaGFuZGxlcih3aWwsIGRhdGEsIHNpemUpOwotCX0KKwkJCXJldHVybiBsb2FkID8KKwkJCQl3aWxfZndfaGFuZGxlcnNbaV0ubG9hZF9oYW5kbGVyKAorCQkJCQl3aWwsIGRhdGEsIHNpemUpIDoKKwkJCQl3aWxfZndfaGFuZGxlcnNbaV0ucGFyc2VfaGFuZGxlcigKKwkJCQkJd2lsLCBkYXRhLCBzaXplKTsKIAogCXdpbF9lcnJfZncod2lsLCAidW5rbm93biByZWNvcmQgdHlwZTogJWRcbiIsIHR5cGUpOwogCXJldHVybiAtRUlOVkFMOwogfQogCiAvKioKLSAqIHdpbF9md19sb2FkIC0gbG9hZCBGVyBpbnRvIGRldmljZQotICoKLSAqIExvYWQgdGhlIEZXIGFuZCB1Q29kZSBjb2RlIGFuZCBkYXRhIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRldmljZQotICogbWVtb3J5IHJlZ2lvbnMKKyAqIHdpbF9md19wcm9jZXNzIC0gcHJvY2VzcyBzZWN0aW9uIGZyb20gRlcgZmlsZQorICogaWYgbG9hZCBpcyB0cnVlOiBMb2FkIHRoZSBGVyBhbmQgdUNvZGUgY29kZSBhbmQgZGF0YSB0byB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgZGV2aWNlIG1lbW9yeSByZWdpb25zLAorICogb3RoZXJ3aXNlIG9ubHkgcGFyc2UgYW5kIGxvb2sgZm9yIGNhcGFiaWxpdGllcwogICoKICAqIFJldHVybiBlcnJvciBjb2RlCiAgKi8KLXN0YXRpYyBpbnQgd2lsX2Z3X2xvYWQoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkKK3N0YXRpYyBpbnQgd2lsX2Z3X3Byb2Nlc3Moc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCBjb25zdCB2b2lkICpkYXRhLAorCQkJICBzaXplX3Qgc2l6ZSwgYm9vbCBsb2FkKQogewogCWludCByYyA9IDA7CiAJY29uc3Qgc3RydWN0IHdpbF9md19yZWNvcmRfaGVhZCAqaGRyOwpAQCAtNDM3LDcgKzQ4MCw3IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlyYyA9IHdpbF9md19oYW5kbGVfcmVjb3JkKHdpbCwgbGUxNl90b19jcHUoaGRyLT50eXBlKSwKLQkJCQkJICAmaGRyWzFdLCBoZHJfc3opOworCQkJCQkgICZoZHJbMV0sIGhkcl9zeiwgbG9hZCk7CiAJCWlmIChyYykKIAkJCXJldHVybiByYzsKIAl9CkBAIC00NTYsMTMgKzQ5OSwxNiBAQAogfQogCiAvKioKLSAqIHdpbF9yZXF1ZXN0X2Zpcm13YXJlIC0gUmVxdWVzdCBmaXJtd2FyZSBhbmQgbG9hZCB0byBkZXZpY2UKKyAqIHdpbF9yZXF1ZXN0X2Zpcm13YXJlIC0gUmVxdWVzdCBmaXJtd2FyZQogICoKLSAqIFJlcXVlc3QgZmlybXdhcmUgaW1hZ2UgZnJvbSB0aGUgZmlsZSBhbmQgbG9hZCBpdCB0byBkZXZpY2UKKyAqIFJlcXVlc3QgZmlybXdhcmUgaW1hZ2UgZnJvbSB0aGUgZmlsZQorICogSWYgbG9hZCBpcyB0cnVlLCBsb2FkIGZpcm13YXJlIHRvIGRldmljZSwgb3RoZXJ3aXNlCisgKiBvbmx5IHBhcnNlIGFuZCBleHRyYWN0IGNhcGFiaWxpdGllcwogICoKICAqIFJldHVybiBlcnJvciBjb2RlCiAgKi8KLWludCB3aWxfcmVxdWVzdF9maXJtd2FyZShzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGNvbnN0IGNoYXIgKm5hbWUpCitpbnQgd2lsX3JlcXVlc3RfZmlybXdhcmUoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCBjb25zdCBjaGFyICpuYW1lLAorCQkJIGJvb2wgbG9hZCkKIHsKIAlpbnQgcmMsIHJjMTsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwpAQCAtNDgyLDcgKzUyOCw3IEBACiAJCQlyYyA9IHJjMTsKIAkJCWdvdG8gb3V0OwogCQl9Ci0JCXJjID0gd2lsX2Z3X2xvYWQod2lsLCBkLCByYzEpOworCQlyYyA9IHdpbF9md19wcm9jZXNzKHdpbCwgZCwgcmMxLCBsb2FkKTsKIAkJaWYgKHJjIDwgMCkKIAkJCWdvdG8gb3V0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2ludGVycnVwdC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvaW50ZXJydXB0LmMKaW5kZXggMDExZTc0MS4uNjQwNDZlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvaW50ZXJydXB0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvaW50ZXJydXB0LmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTYgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgogICoKICAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQogICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQpAQCAtMTAxLDcgKzEwMSw3IEBACiAJICAgICAgbWFza19oYWxwID8gV0lMNjIxMF9JUlFfRElTQUJMRSA6IFdJTDYyMTBfSVJRX0RJU0FCTEVfTk9fSEFMUCk7CiB9CiAKLXN0YXRpYyB2b2lkIHdpbDYyMTBfbWFza19oYWxwKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCkKK3ZvaWQgd2lsNjIxMF9tYXNrX2hhbHAoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKQogewogCXdpbF9kYmdfaXJxKHdpbCwgIiVzKClcbiIsIF9fZnVuY19fKTsKIApAQCAtNTAzLDYgKzUwMywxMyBAQAogCQkJCW9mZnNldG9mKHN0cnVjdCBSR0ZfSUNSLCBJQ1IpKTsKIAkJdTMyIGltdl9taXNjID0gd2lsX3Iod2lsLCBSR0ZfRE1BX0VQX01JU0NfSUNSICsKIAkJCQkgICAgIG9mZnNldG9mKHN0cnVjdCBSR0ZfSUNSLCBJTVYpKTsKKworCQkvKiBIQUxQIGludGVycnVwdCBjYW4gYmUgdW5tYXNrZWQgd2hlbiBtaXNjIGludGVycnVwdHMgYXJlCisJCSAqIG1hc2tlZAorCQkgKi8KKwkJaWYgKGljcl9taXNjICYgQklUX0RNQV9FUF9NSVNDX0lDUl9IQUxQKQorCQkJcmV0dXJuIDA7CisKIAkJd2lsX2Vycih3aWwsICJJUlEgd2hlbiBpdCBzaG91bGQgYmUgbWFza2VkOiBwc2V1ZG8gMHglMDh4XG4iCiAJCQkJIlJ4ICAgaWNtOmljcjppbXYgMHglMDh4IDB4JTA4eCAweCUwOHhcbiIKIAkJCQkiVHggICBpY206aWNyOmltdiAweCUwOHggMHglMDh4IDB4JTA4eFxuIgpAQCAtNTkyLDcgKzU5OSw3IEBACiAKIHZvaWQgd2lsNjIxMF9zZXRfaGFscChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwpCiB7Ci0Jd2lsX2RiZ19taXNjKHdpbCwgIiVzKClcbiIsIF9fZnVuY19fKTsKKwl3aWxfZGJnX2lycSh3aWwsICIlcygpXG4iLCBfX2Z1bmNfXyk7CiAKIAl3aWxfdyh3aWwsIFJHRl9ETUFfRVBfTUlTQ19JQ1IgKyBvZmZzZXRvZihzdHJ1Y3QgUkdGX0lDUiwgSUNTKSwKIAkgICAgICBCSVRfRE1BX0VQX01JU0NfSUNSX0hBTFApOwpAQCAtNjAwLDcgKzYwNyw3IEBACiAKIHZvaWQgd2lsNjIxMF9jbGVhcl9oYWxwKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCkKIHsKLQl3aWxfZGJnX21pc2Mod2lsLCAiJXMoKVxuIiwgX19mdW5jX18pOworCXdpbF9kYmdfaXJxKHdpbCwgIiVzKClcbiIsIF9fZnVuY19fKTsKIAogCXdpbF93KHdpbCwgUkdGX0RNQV9FUF9NSVNDX0lDUiArIG9mZnNldG9mKHN0cnVjdCBSR0ZfSUNSLCBJQ1IpLAogCSAgICAgIEJJVF9ETUFfRVBfTUlTQ19JQ1JfSEFMUCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9tYWluLmMKaW5kZXggNGJjOTJlNS4uZTcxMzBiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL21haW4uYwpAQCAtMjMyLDYgKzIzMiw5IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSB3aWxfdG9fbmRldih3aWwpOwogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSB3aWwtPndkZXY7CiAKKwlpZiAodW5saWtlbHkoIW5kZXYpKQorCQlyZXR1cm47CisKIAltaWdodF9zbGVlcCgpOwogCXdpbF9pbmZvKHdpbCwgIiVzKGJzc2lkPSVwTSwgcmVhc29uPSVkLCBldiVzKVxuIiwgX19mdW5jX18sIGJzc2lkLAogCQkgcmVhc29uX2NvZGUsIGZyb21fZXZlbnQgPyAiKyIgOiAiLSIpOwpAQCAtODQ5LDYgKzg1Miw3IEBACiAJYml0bWFwX3plcm8od2lsLT5zdGF0dXMsIHdpbF9zdGF0dXNfbGFzdCk7CiAJbXV0ZXhfdW5sb2NrKCZ3aWwtPndtaV9tdXRleCk7CiAKKwltdXRleF9sb2NrKCZ3aWwtPnAycF93ZGV2X211dGV4KTsKIAlpZiAod2lsLT5zY2FuX3JlcXVlc3QpIHsKIAkJc3RydWN0IGNmZzgwMjExX3NjYW5faW5mbyBpbmZvID0gewogCQkJLmFib3J0ZWQgPSB0cnVlLApAQCAtODYwLDYgKzg2NCw3IEBACiAJCWNmZzgwMjExX3NjYW5fZG9uZSh3aWwtPnNjYW5fcmVxdWVzdCwgJmluZm8pOwogCQl3aWwtPnNjYW5fcmVxdWVzdCA9IE5VTEw7CiAJfQorCW11dGV4X3VubG9jaygmd2lsLT5wMnBfd2Rldl9tdXRleCk7CiAKIAl3aWxfbWFza19pcnEod2lsKTsKIApAQCAtODg4LDExICs4OTMsMTIgQEAKIAkJCSBXSUxfRlcyX05BTUUpOwogCiAJCXdpbF9oYWx0X2NwdSh3aWwpOworCQltZW1zZXQod2lsLT5md192ZXJzaW9uLCAwLCBzaXplb2Yod2lsLT5md192ZXJzaW9uKSk7CiAJCS8qIExvYWRpbmcgZi93IGZyb20gdGhlIGZpbGUgKi8KLQkJcmMgPSB3aWxfcmVxdWVzdF9maXJtd2FyZSh3aWwsIFdJTF9GV19OQU1FKTsKKwkJcmMgPSB3aWxfcmVxdWVzdF9maXJtd2FyZSh3aWwsIFdJTF9GV19OQU1FLCB0cnVlKTsKIAkJaWYgKHJjKQogCQkJcmV0dXJuIHJjOwotCQlyYyA9IHdpbF9yZXF1ZXN0X2Zpcm13YXJlKHdpbCwgV0lMX0ZXMl9OQU1FKTsKKwkJcmMgPSB3aWxfcmVxdWVzdF9maXJtd2FyZSh3aWwsIFdJTF9GVzJfTkFNRSwgdHJ1ZSk7CiAJCWlmIChyYykKIAkJCXJldHVybiByYzsKIApAQCAtMTAzNSwxMCArMTA0MSwxMCBAQAogCiBpbnQgX193aWxfZG93bihzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwpCiB7Ci0JaW50IHJjOwotCiAJV0FSTl9PTighbXV0ZXhfaXNfbG9ja2VkKCZ3aWwtPm11dGV4KSk7CiAKKwlzZXRfYml0KHdpbF9zdGF0dXNfcmVzZXR0aW5nLCB3aWwtPnN0YXR1cyk7CisKIAlpZiAod2lsLT5wbGF0Zm9ybV9vcHMuYnVzX3JlcXVlc3QpCiAJCXdpbC0+cGxhdGZvcm1fb3BzLmJ1c19yZXF1ZXN0KHdpbC0+cGxhdGZvcm1faGFuZGxlLCAwKTsKIApAQCAtMTA1MCw4ICsxMDU2LDkgQEAKIAl9CiAJd2lsX2VuYWJsZV9pcnEod2lsKTsKIAotCSh2b2lkKXdpbF9wMnBfc3RvcF9kaXNjb3Zlcnkod2lsKTsKKwl3aWxfcDJwX3N0b3BfcmFkaW9fb3BlcmF0aW9ucyh3aWwpOwogCisJbXV0ZXhfbG9jaygmd2lsLT5wMnBfd2Rldl9tdXRleCk7CiAJaWYgKHdpbC0+c2Nhbl9yZXF1ZXN0KSB7CiAJCXN0cnVjdCBjZmc4MDIxMV9zY2FuX2luZm8gaW5mbyA9IHsKIAkJCS5hYm9ydGVkID0gdHJ1ZSwKQEAgLTEwNjMsMTggKzEwNzAsNyBAQAogCQljZmc4MDIxMV9zY2FuX2RvbmUod2lsLT5zY2FuX3JlcXVlc3QsICZpbmZvKTsKIAkJd2lsLT5zY2FuX3JlcXVlc3QgPSBOVUxMOwogCX0KLQotCWlmICh0ZXN0X2JpdCh3aWxfc3RhdHVzX2Z3Y29ubmVjdGVkLCB3aWwtPnN0YXR1cykgfHwKLQkgICAgdGVzdF9iaXQod2lsX3N0YXR1c19md2Nvbm5lY3RpbmcsIHdpbC0+c3RhdHVzKSkgewotCi0JCW11dGV4X3VubG9jaygmd2lsLT5tdXRleCk7Ci0JCXJjID0gd21pX2NhbGwod2lsLCBXTUlfRElTQ09OTkVDVF9DTURJRCwgTlVMTCwgMCwKLQkJCSAgICAgIFdNSV9ESVNDT05ORUNUX0VWRU5USUQsIE5VTEwsIDAsCi0JCQkgICAgICBXSUw2MjEwX0RJU0NPTk5FQ1RfVE9fTVMpOwotCQltdXRleF9sb2NrKCZ3aWwtPm11dGV4KTsKLQkJaWYgKHJjKQotCQkJd2lsX2Vycih3aWwsICJ0aW1lb3V0IHdhaXRpbmcgZm9yIGRpc2Nvbm5lY3RcbiIpOwotCX0KKwltdXRleF91bmxvY2soJndpbC0+cDJwX3dkZXZfbXV0ZXgpOwogCiAJd2lsX3Jlc2V0KHdpbCwgZmFsc2UpOwogCkBAIC0xMTE4LDIzICsxMTE0LDI2IEBACiAKIAltdXRleF9sb2NrKCZ3aWwtPmhhbHAubG9jayk7CiAKLQl3aWxfZGJnX21pc2Mod2lsLCAiJXM6IHN0YXJ0LCBIQUxQIHJlZl9jbnQgKCVkKVxuIiwgX19mdW5jX18sCi0JCSAgICAgd2lsLT5oYWxwLnJlZl9jbnQpOworCXdpbF9kYmdfaXJxKHdpbCwgIiVzOiBzdGFydCwgSEFMUCByZWZfY250ICglZClcbiIsIF9fZnVuY19fLAorCQkgICAgd2lsLT5oYWxwLnJlZl9jbnQpOwogCiAJaWYgKCsrd2lsLT5oYWxwLnJlZl9jbnQgPT0gMSkgewogCQl3aWw2MjEwX3NldF9oYWxwKHdpbCk7CiAJCXJjID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZ3aWwtPmhhbHAuY29tcCwgdG9famlmZmllcyk7Ci0JCWlmICghcmMpCisJCWlmICghcmMpIHsKIAkJCXdpbF9lcnIod2lsLCAiJXM6IEhBTFAgdm90ZSB0aW1lZCBvdXRcbiIsIF9fZnVuY19fKTsKLQkJZWxzZQotCQkJd2lsX2RiZ19taXNjKHdpbCwKLQkJCQkgICAgICIlczogSEFMUCB2b3RlIGNvbXBsZXRlZCBhZnRlciAlZCBtc1xuIiwKLQkJCQkgICAgIF9fZnVuY19fLAotCQkJCSAgICAgamlmZmllc190b19tc2Vjcyh0b19qaWZmaWVzIC0gcmMpKTsKKwkJCS8qIE1hc2sgSEFMUCBhcyBkb25lIGluIGNhc2UgdGhlIGludGVycnVwdCBpcyByYWlzZWQgKi8KKwkJCXdpbDYyMTBfbWFza19oYWxwKHdpbCk7CisJCX0gZWxzZSB7CisJCQl3aWxfZGJnX2lycSh3aWwsCisJCQkJICAgICIlczogSEFMUCB2b3RlIGNvbXBsZXRlZCBhZnRlciAlZCBtc1xuIiwKKwkJCQkgICAgX19mdW5jX18sCisJCQkJICAgIGppZmZpZXNfdG9fbXNlY3ModG9famlmZmllcyAtIHJjKSk7CisJCX0KIAl9CiAKLQl3aWxfZGJnX21pc2Mod2lsLCAiJXM6IGVuZCwgSEFMUCByZWZfY250ICglZClcbiIsIF9fZnVuY19fLAotCQkgICAgIHdpbC0+aGFscC5yZWZfY250KTsKKwl3aWxfZGJnX2lycSh3aWwsICIlczogZW5kLCBIQUxQIHJlZl9jbnQgKCVkKVxuIiwgX19mdW5jX18sCisJCSAgICB3aWwtPmhhbHAucmVmX2NudCk7CiAKIAltdXRleF91bmxvY2soJndpbC0+aGFscC5sb2NrKTsKIH0KQEAgLTExNDUsMTYgKzExNDQsMTYgQEAKIAogCW11dGV4X2xvY2soJndpbC0+aGFscC5sb2NrKTsKIAotCXdpbF9kYmdfbWlzYyh3aWwsICIlczogc3RhcnQsIEhBTFAgcmVmX2NudCAoJWQpXG4iLCBfX2Z1bmNfXywKLQkJICAgICB3aWwtPmhhbHAucmVmX2NudCk7CisJd2lsX2RiZ19pcnEod2lsLCAiJXM6IHN0YXJ0LCBIQUxQIHJlZl9jbnQgKCVkKVxuIiwgX19mdW5jX18sCisJCSAgICB3aWwtPmhhbHAucmVmX2NudCk7CiAKIAlpZiAoLS13aWwtPmhhbHAucmVmX2NudCA9PSAwKSB7CiAJCXdpbDYyMTBfY2xlYXJfaGFscCh3aWwpOwotCQl3aWxfZGJnX21pc2Mod2lsLCAiJXM6IEhBTFAgdW52b3RlXG4iLCBfX2Z1bmNfXyk7CisJCXdpbF9kYmdfaXJxKHdpbCwgIiVzOiBIQUxQIHVudm90ZVxuIiwgX19mdW5jX18pOwogCX0KIAotCXdpbF9kYmdfbWlzYyh3aWwsICIlczogZW5kLCBIQUxQIHJlZl9jbnQgKCVkKVxuIiwgX19mdW5jX18sCi0JCSAgICAgd2lsLT5oYWxwLnJlZl9jbnQpOworCXdpbF9kYmdfaXJxKHdpbCwgIiVzOiBlbmQsIEhBTFAgcmVmX2NudCAoJWQpXG4iLCBfX2Z1bmNfXywKKwkJICAgIHdpbC0+aGFscC5yZWZfY250KTsKIAogCW11dGV4X3VubG9jaygmd2lsLT5oYWxwLmxvY2spOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvbmV0ZGV2LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9uZXRkZXYuYwppbmRleCAwOTg0MDk3NS4uNjFkZTVlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvbmV0ZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvbmV0ZGV2LmMKQEAgLTE3OSwxMyArMTc5LDYgQEAKIAlTRVRfTkVUREVWX0RFVihuZGV2LCB3aXBoeV9kZXYod2Rldi0+d2lwaHkpKTsKIAl3ZGV2LT5uZXRkZXYgPSBuZGV2OwogCi0JbmV0aWZfbmFwaV9hZGQobmRldiwgJndpbC0+bmFwaV9yeCwgd2lsNjIxMF9uZXRkZXZfcG9sbF9yeCwKLQkJICAgICAgIFdJTDYyMTBfTkFQSV9CVURHRVQpOwotCW5ldGlmX3R4X25hcGlfYWRkKG5kZXYsICZ3aWwtPm5hcGlfdHgsIHdpbDYyMTBfbmV0ZGV2X3BvbGxfdHgsCi0JCSAgICAgICBXSUw2MjEwX05BUElfQlVER0VUKTsKLQotCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhuZGV2KTsKLQogCXJldHVybiB3aWw7CiAKICBvdXRfcHJpdjoKQEAgLTIxNiwyNSArMjA5LDQ4IEBACiAKIGludCB3aWxfaWZfYWRkKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCkKIHsKKwlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gd2lsX3RvX3dkZXYod2lsKTsKKwlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2Rldi0+d2lwaHk7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSB3aWxfdG9fbmRldih3aWwpOwogCWludCByYzsKIAotCXdpbF9kYmdfbWlzYyh3aWwsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisJd2lsX2RiZ19taXNjKHdpbCwgImVudGVyZWQiKTsKKworCXN0cmxjcHkod2lwaHktPmZ3X3ZlcnNpb24sIHdpbC0+ZndfdmVyc2lvbiwgc2l6ZW9mKHdpcGh5LT5md192ZXJzaW9uKSk7CisKKwlyYyA9IHdpcGh5X3JlZ2lzdGVyKHdpcGh5KTsKKwlpZiAocmMgPCAwKSB7CisJCXdpbF9lcnIod2lsLCAiZmFpbGVkIHRvIHJlZ2lzdGVyIHdpcGh5LCBlcnIgJWRcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCW5ldGlmX25hcGlfYWRkKG5kZXYsICZ3aWwtPm5hcGlfcngsIHdpbDYyMTBfbmV0ZGV2X3BvbGxfcngsCisJCSAgICAgICBXSUw2MjEwX05BUElfQlVER0VUKTsKKwluZXRpZl90eF9uYXBpX2FkZChuZGV2LCAmd2lsLT5uYXBpX3R4LCB3aWw2MjEwX25ldGRldl9wb2xsX3R4LAorCQkJICBXSUw2MjEwX05BUElfQlVER0VUKTsKKworCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhuZGV2KTsKIAogCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOwogCWlmIChyYyA8IDApIHsKIAkJZGV2X2VycigmbmRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIG5ldGRldjogJWRcbiIsIHJjKTsKLQkJcmV0dXJuIHJjOworCQlnb3RvIG91dF93aXBoeTsKIAl9CiAKIAlyZXR1cm4gMDsKKworb3V0X3dpcGh5OgorCXdpcGh5X3VucmVnaXN0ZXIod2Rldi0+d2lwaHkpOworCXJldHVybiByYzsKIH0KIAogdm9pZCB3aWxfaWZfcmVtb3ZlKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHdpbF90b19uZGV2KHdpbCk7CisJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IHdpbF90b193ZGV2KHdpbCk7CiAKIAl3aWxfZGJnX21pc2Mod2lsLCAiJXMoKVxuIiwgX19mdW5jX18pOwogCiAJdW5yZWdpc3Rlcl9uZXRkZXYobmRldik7CisJd2lwaHlfdW5yZWdpc3Rlcih3ZGV2LT53aXBoeSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9wMnAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3AycC5jCmluZGV4IGUwZjhhYTAuLjQwODc3ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3AycC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3AycC5jCkBAIC0yNjMsMyArMjYzLDQ5IEBACiAJCW11dGV4X3VubG9jaygmd2lsLT5wMnBfd2Rldl9tdXRleCk7CiAJfQogfQorCit2b2lkIHdpbF9wMnBfc3RvcF9yYWRpb19vcGVyYXRpb25zKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCkKK3sKKwlzdHJ1Y3Qgd2lsX3AycF9pbmZvICpwMnAgPSAmd2lsLT5wMnA7CisJc3RydWN0IGNmZzgwMjExX3NjYW5faW5mbyBpbmZvID0geworCQkuYWJvcnRlZCA9IHRydWUsCisJfTsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJndpbC0+bXV0ZXgpOworCisJbXV0ZXhfbG9jaygmd2lsLT5wMnBfd2Rldl9tdXRleCk7CisKKwlpZiAod2lsLT5yYWRpb193ZGV2ICE9IHdpbC0+cDJwX3dkZXYpCisJCWdvdG8gb3V0OworCisJaWYgKCFwMnAtPmRpc2NvdmVyeV9zdGFydGVkKSB7CisJCS8qIFJlZ3VsYXIgc2NhbiBvbiB0aGUgcDJwIGRldmljZSAqLworCQlpZiAod2lsLT5zY2FuX3JlcXVlc3QgJiYKKwkJICAgIHdpbC0+c2Nhbl9yZXF1ZXN0LT53ZGV2ID09IHdpbC0+cDJwX3dkZXYpIHsKKwkJCWNmZzgwMjExX3NjYW5fZG9uZSh3aWwtPnNjYW5fcmVxdWVzdCwgJmluZm8pOworCQkJd2lsLT5zY2FuX3JlcXVlc3QgPSBOVUxMOworCQl9CisJCWdvdG8gb3V0OworCX0KKworCS8qIFNlYXJjaCBvciBsaXN0ZW4gb24gcDJwIGRldmljZSAqLworCW11dGV4X3VubG9jaygmd2lsLT5wMnBfd2Rldl9tdXRleCk7CisJd2lsX3AycF9zdG9wX2Rpc2NvdmVyeSh3aWwpOworCW11dGV4X2xvY2soJndpbC0+cDJwX3dkZXZfbXV0ZXgpOworCisJaWYgKHdpbC0+c2Nhbl9yZXF1ZXN0KSB7CisJCS8qIHNlYXJjaCAqLworCQljZmc4MDIxMV9zY2FuX2RvbmUod2lsLT5zY2FuX3JlcXVlc3QsICZpbmZvKTsKKwkJd2lsLT5zY2FuX3JlcXVlc3QgPSBOVUxMOworCX0gZWxzZSB7CisJCS8qIGxpc3RlbiAqLworCQljZmc4MDIxMV9yZW1haW5fb25fY2hhbm5lbF9leHBpcmVkKHdpbC0+cmFkaW9fd2RldiwKKwkJCQkJCSAgIHAycC0+Y29va2llLAorCQkJCQkJICAgJnAycC0+bGlzdGVuX2NoYW4sCisJCQkJCQkgICBHRlBfS0VSTkVMKTsKKwl9CisKK291dDoKKwl3aWwtPnJhZGlvX3dkZXYgPSB3aWwtPndkZXY7CisJbXV0ZXhfdW5sb2NrKCZ3aWwtPnAycF93ZGV2X211dGV4KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3BjaWVfYnVzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9wY2llX2J1cy5jCmluZGV4IDdiNWM0MjIuLjQ0NzQ2Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3BjaWVfYnVzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvcGNpZV9idXMuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KICNpbmNsdWRlICJ3aWw2MjEwLmgiCisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAKIHN0YXRpYyBib29sIHVzZV9tc2kgPSB0cnVlOwogbW9kdWxlX3BhcmFtKHVzZV9tc2ksIGJvb2wsIFNfSVJVR08pOwpAQCAtMzgsNiArMzksNyBAQAogCXUzMiByZXZfaWQgPSB3aWxfcih3aWwsIFJHRl9VU0VSX0pUQUdfREVWX0lEKTsKIAogCWJpdG1hcF96ZXJvKHdpbC0+aHdfY2FwYWJpbGl0aWVzLCBod19jYXBhYmlsaXR5X2xhc3QpOworCWJpdG1hcF96ZXJvKHdpbC0+ZndfY2FwYWJpbGl0aWVzLCBXTUlfRldfQ0FQQUJJTElUWV9NQVgpOwogCiAJc3dpdGNoIChyZXZfaWQpIHsKIAljYXNlIEpUQUdfREVWX0lEX1NQQVJST1dfQjA6CkBAIC01MSw2ICs1Myw5IEBACiAJfQogCiAJd2lsX2luZm8od2lsLCAiQm9hcmQgaGFyZHdhcmUgaXMgJXNcbiIsIHdpbC0+aHdfbmFtZSk7CisKKwkvKiBleHRyYWN0IEZXIGNhcGFiaWxpdGllcyBmcm9tIGZpbGUgd2l0aG91dCBsb2FkaW5nIHRoZSBGVyAqLworCXdpbF9yZXF1ZXN0X2Zpcm13YXJlKHdpbCwgV0lMX0ZXX05BTUUsIGZhbHNlKTsKIH0KIAogdm9pZCB3aWxfZGlzYWJsZV9pcnEoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKQpAQCAtMjkzLDYgKzI5OCw5IEBACiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKIAl3aWw2MjEwX2RlYnVnZnNfcmVtb3ZlKHdpbCk7CisJcnRubF9sb2NrKCk7CisJd2lsX3AycF93ZGV2X2ZyZWUod2lsKTsKKwlydG5sX3VubG9jaygpOwogCXdpbF9pZl9yZW1vdmUod2lsKTsKIAl3aWxfaWZfcGNpZV9kaXNhYmxlKHdpbCk7CiAJcGNpX2lvdW5tYXAocGRldiwgY3NyKTsKQEAgLTMwMCw3ICszMDgsNiBAQAogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAlpZiAod2lsLT5wbGF0Zm9ybV9vcHMudW5pbml0KQogCQl3aWwtPnBsYXRmb3JtX29wcy51bmluaXQod2lsLT5wbGF0Zm9ybV9oYW5kbGUpOwotCXdpbF9wMnBfd2Rldl9mcmVlKHdpbCk7CiAJd2lsX2lmX2ZyZWUod2lsKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvdHhyeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvdHhyeC5jCmluZGV4IGYyZjZhNDAuLjRjMzg1MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3R4cnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC90eHJ4LmMKQEAgLTg3Myw5ICs4NzMsMTIgQEAKIAkJcmMgPSAtRUlOVkFMOwogCQlnb3RvIG91dF9mcmVlOwogCX0KLQl2cmluZy0+aHd0YWlsID0gbGUzMl90b19jcHUocmVwbHkuY21kLnR4X3ZyaW5nX3RhaWxfcHRyKTsKIAorCXNwaW5fbG9ja19iaCgmdHhkYXRhLT5sb2NrKTsKKwl2cmluZy0+aHd0YWlsID0gbGUzMl90b19jcHUocmVwbHkuY21kLnR4X3ZyaW5nX3RhaWxfcHRyKTsKIAl0eGRhdGEtPmVuYWJsZWQgPSAxOworCXNwaW5fdW5sb2NrX2JoKCZ0eGRhdGEtPmxvY2spOworCiAJaWYgKHR4ZGF0YS0+ZG90MXhfb3BlbiAmJiAoYWdnX3dzaXplID49IDApKQogCQl3aWxfYWRkYmFfdHhfcmVxdWVzdCh3aWwsIGlkLCBhZ2dfd3NpemUpOwogCkBAIC05NTAsOSArOTUzLDExIEBACiAJCXJjID0gLUVJTlZBTDsKIAkJZ290byBvdXRfZnJlZTsKIAl9Ci0JdnJpbmctPmh3dGFpbCA9IGxlMzJfdG9fY3B1KHJlcGx5LmNtZC50eF92cmluZ190YWlsX3B0cik7CiAKKwlzcGluX2xvY2tfYmgoJnR4ZGF0YS0+bG9jayk7CisJdnJpbmctPmh3dGFpbCA9IGxlMzJfdG9fY3B1KHJlcGx5LmNtZC50eF92cmluZ190YWlsX3B0cik7CiAJdHhkYXRhLT5lbmFibGVkID0gMTsKKwlzcGluX3VubG9ja19iaCgmdHhkYXRhLT5sb2NrKTsKIAogCXJldHVybiAwOwogIG91dF9mcmVlOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvd2lsNjIxMC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvd2lsNjIxMC5oCmluZGV4IGVjYWI0YWYuLmE5NDljZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dpbDYyMTAuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC93aWw2MjEwLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpZm5kZWYgX19XSUw2MjEwX0hfXwogI2RlZmluZSBfX1dJTDYyMTBfSF9fCiAKKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CiAjaW5jbHVkZSA8bmV0L2NmZzgwMjExLmg+CkBAIC01NzYsMTAgKzU3NywxMSBAQAogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXY7CiAJdm9pZCBfX2lvbWVtICpjc3I7CiAJREVDTEFSRV9CSVRNQVAoc3RhdHVzLCB3aWxfc3RhdHVzX2xhc3QpOwotCXUzMiBmd192ZXJzaW9uOworCXU4IGZ3X3ZlcnNpb25bRVRIVE9PTF9GV1ZFUlNfTEVOXTsKIAl1MzIgaHdfdmVyc2lvbjsKIAljb25zdCBjaGFyICpod19uYW1lOwogCURFQ0xBUkVfQklUTUFQKGh3X2NhcGFiaWxpdGllcywgaHdfY2FwYWJpbGl0eV9sYXN0KTsKKwlERUNMQVJFX0JJVE1BUChmd19jYXBhYmlsaXRpZXMsIFdNSV9GV19DQVBBQklMSVRZX01BWCk7CiAJdTggbl9taWRzOyAvKiBudW1iZXIgb2YgYWRkaXRpb25hbCBNSURzIGFzIHJlcG9ydGVkIGJ5IEZXICovCiAJdTMyIHJlY292ZXJ5X2NvdW50OyAvKiBudW0gb2YgRlcgcmVjb3ZlcnkgYXR0ZW1wdHMgaW4gYSBzaG9ydCB0aW1lICovCiAJdTMyIHJlY292ZXJ5X3N0YXRlOyAvKiBGVyByZWNvdmVyeSBzdGF0ZSBtYWNoaW5lICovCkBAIC02NTcsNyArNjU5LDcgQEAKIAogCS8qIFAyUF9ERVZJQ0UgdmlmICovCiAJc3RydWN0IHdpcmVsZXNzX2RldiAqcDJwX3dkZXY7Ci0Jc3RydWN0IG11dGV4IHAycF93ZGV2X211dGV4OyAvKiBwcm90ZWN0IEBwMnBfd2RldiAqLworCXN0cnVjdCBtdXRleCBwMnBfd2Rldl9tdXRleDsgLyogcHJvdGVjdCBAcDJwX3dkZXYgYW5kIEBzY2FuX3JlcXVlc3QgKi8KIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICpyYWRpb193ZGV2OwogCiAJLyogSGlnaCBBY2Nlc3MgTGF0ZW5jeSBQb2xpY3kgdm90aW5nICovCkBAIC04MjgsNiArODMwLDcgQEAKIHZvaWQgd2lsX2NvbmZpZ3VyZV9pbnRlcnJ1cHRfbW9kZXJhdGlvbihzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwpOwogdm9pZCB3aWxfZGlzYWJsZV9pcnEoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKTsKIHZvaWQgd2lsX2VuYWJsZV9pcnEoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKTsKK3ZvaWQgd2lsNjIxMF9tYXNrX2hhbHAoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKTsKIAogLyogUDJQICovCiBib29sIHdpbF9wMnBfaXNfc29jaWFsX3NjYW4oc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxdWVzdCk7CkBAIC04NDAsNiArODQzLDcgQEAKIGludCB3aWxfcDJwX2NhbmNlbF9saXN0ZW4oc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCB1NjQgY29va2llKTsKIHZvaWQgd2lsX3AycF9saXN0ZW5fZXhwaXJlZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogdm9pZCB3aWxfcDJwX3NlYXJjaF9leHBpcmVkKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Cit2b2lkIHdpbF9wMnBfc3RvcF9yYWRpb19vcGVyYXRpb25zKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCk7CiAKIC8qIFdNSSBmb3IgUDJQICovCiBpbnQgd21pX3AycF9jZmcoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCBpbnQgY2hhbm5lbCwgaW50IGJpKTsKQEAgLTg5Myw3ICs4OTcsOCBAQAogaW50IHdpbF9pZnR5cGVfbmwyd21pKGVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSk7CiAKIGludCB3aWxfaW9jdGwoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCB2b2lkIF9fdXNlciAqZGF0YSwgaW50IGNtZCk7Ci1pbnQgd2lsX3JlcXVlc3RfZmlybXdhcmUoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCBjb25zdCBjaGFyICpuYW1lKTsKK2ludCB3aWxfcmVxdWVzdF9maXJtd2FyZShzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgYm9vbCBsb2FkKTsKIAogaW50IHdpbF9jYW5fc3VzcGVuZChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGJvb2wgaXNfcnVudGltZSk7CiBpbnQgd2lsX3N1c3BlbmQoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCBib29sIGlzX3J1bnRpbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvd21pLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC93bWkuYwppbmRleCA0ZDkyNTQxLi5mYWU0ZjEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC93bWkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC93bWkuYwpAQCAtMzEyLDE0ICszMTIsMTQgQEAKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gd2lsLT53ZGV2OwogCXN0cnVjdCB3bWlfcmVhZHlfZXZlbnQgKmV2dCA9IGQ7CiAKLQl3aWwtPmZ3X3ZlcnNpb24gPSBsZTMyX3RvX2NwdShldnQtPnN3X3ZlcnNpb24pOwogCXdpbC0+bl9taWRzID0gZXZ0LT5udW1vZl9hZGRpdGlvbmFsX21pZHM7CiAKLQl3aWxfaW5mbyh3aWwsICJGVyB2ZXIuICVkOyBNQUMgJXBNOyAlZCBNSUQnc1xuIiwgd2lsLT5md192ZXJzaW9uLAorCXdpbF9pbmZvKHdpbCwgIkZXIHZlci4gJXMoU1cgJWQpOyBNQUMgJXBNOyAlZCBNSUQnc1xuIiwKKwkJIHdpbC0+ZndfdmVyc2lvbiwgbGUzMl90b19jcHUoZXZ0LT5zd192ZXJzaW9uKSwKIAkJIGV2dC0+bWFjLCB3aWwtPm5fbWlkcyk7CiAJLyogaWdub3JlIE1BQyBhZGRyZXNzLCB3ZSBhbHJlYWR5IGhhdmUgaXQgZnJvbSB0aGUgYm9vdCBsb2FkZXIgKi8KLQlzbnByaW50Zih3ZGV2LT53aXBoeS0+ZndfdmVyc2lvbiwgc2l6ZW9mKHdkZXYtPndpcGh5LT5md192ZXJzaW9uKSwKLQkJICIlZCIsIHdpbC0+ZndfdmVyc2lvbik7CisJc3RybGNweSh3ZGV2LT53aXBoeS0+ZndfdmVyc2lvbiwgd2lsLT5md192ZXJzaW9uLAorCQlzaXplb2Yod2Rldi0+d2lwaHktPmZ3X3ZlcnNpb24pKTsKIAogCXdpbF9zZXRfcmVjb3Zlcnlfc3RhdGUod2lsLCBmd19yZWNvdmVyeV9pZGxlKTsKIAlzZXRfYml0KHdpbF9zdGF0dXNfZndyZWFkeSwgd2lsLT5zdGF0dXMpOwpAQCAtNDI0LDYgKzQyNCw3IEBACiBzdGF0aWMgdm9pZCB3bWlfZXZ0X3NjYW5fY29tcGxldGUoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCBpbnQgaWQsCiAJCQkJICB2b2lkICpkLCBpbnQgbGVuKQogeworCW11dGV4X2xvY2soJndpbC0+cDJwX3dkZXZfbXV0ZXgpOwogCWlmICh3aWwtPnNjYW5fcmVxdWVzdCkgewogCQlzdHJ1Y3Qgd21pX3NjYW5fY29tcGxldGVfZXZlbnQgKmRhdGEgPSBkOwogCQlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9pbmZvIGluZm8gPSB7CkBAIC00MzUsMTQgKzQzNiwxMyBAQAogCQkJICAgICB3aWwtPnNjYW5fcmVxdWVzdCwgaW5mby5hYm9ydGVkKTsKIAogCQlkZWxfdGltZXJfc3luYygmd2lsLT5zY2FuX3RpbWVyKTsKLQkJbXV0ZXhfbG9jaygmd2lsLT5wMnBfd2Rldl9tdXRleCk7CiAJCWNmZzgwMjExX3NjYW5fZG9uZSh3aWwtPnNjYW5fcmVxdWVzdCwgJmluZm8pOwogCQl3aWwtPnJhZGlvX3dkZXYgPSB3aWwtPndkZXY7Ci0JCW11dGV4X3VubG9jaygmd2lsLT5wMnBfd2Rldl9tdXRleCk7CiAJCXdpbC0+c2Nhbl9yZXF1ZXN0ID0gTlVMTDsKIAl9IGVsc2UgewogCQl3aWxfZXJyKHdpbCwgIlNDQU5fQ09NUExFVEUgd2hpbGUgbm90IHNjYW5uaW5nXG4iKTsKIAl9CisJbXV0ZXhfdW5sb2NrKCZ3aWwtPnAycF93ZGV2X211dGV4KTsKIH0KIAogc3RhdGljIHZvaWQgd21pX2V2dF9jb25uZWN0KHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgaW50IGlkLCB2b2lkICpkLCBpbnQgbGVuKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvd21pLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC93bWkuaAppbmRleCA2ODVmZTBkLi5mNDMwZThhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC93bWkuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC93bWkuaApAQCAtNDYsNiArNDYsMTYgQEAKIAlNSURfQlJPQURDQVNUCQk9IDB4RkYsCiB9OwogCisvKiBGVyBjYXBhYmlsaXR5IElEcworICogRWFjaCBJRCBtYXBzIHRvIGEgYml0IGluIGEgMzItYml0IGJpdG1hc2sgdmFsdWUgcHJvdmlkZWQgYnkgdGhlIEZXIHRvCisgKiB0aGUgaG9zdAorICovCitlbnVtIHdtaV9md19jYXBhYmlsaXR5IHsKKwlXTUlfRldfQ0FQQUJJTElUWV9GVE0JCT0gMCwKKwlXTUlfRldfQ0FQQUJJTElUWV9QU19DT05GSUcJPSAxLAorCVdNSV9GV19DQVBBQklMSVRZX01BWCwKK307CisKIC8qIFdNSV9DTURfSERSICovCiBzdHJ1Y3Qgd21pX2NtZF9oZHIgewogCXU4IG1pZDsKQEAgLTEyMCw2ICsxMzAsOCBAQAogCVdNSV9CRl9TTV9NR01UX0NNRElECQkJPSAweDgzOCwKIAlXTUlfQkZfUlhTU19NR01UX0NNRElECQkJPSAweDgzOSwKIAlXTUlfQkZfVFJJR19DTURJRAkJCT0gMHg4M0EsCisJV01JX0xJTktfTUFJTlRBSU5fQ0ZHX1dSSVRFX0NNRElECT0gMHg4NDIsCisJV01JX0xJTktfTUFJTlRBSU5fQ0ZHX1JFQURfQ01ESUQJPSAweDg0MywKIAlXTUlfU0VUX1NFQ1RPUlNfQ01ESUQJCQk9IDB4ODQ5LAogCVdNSV9NQUlOVEFJTl9QQVVTRV9DTURJRAkJPSAweDg1MCwKIAlXTUlfTUFJTlRBSU5fUkVTVU1FX0NNRElECQk9IDB4ODUxLApAQCAtMTM0LDEwICsxNDYsMTUgQEAKIAlXTUlfQkZfQ1RSTF9DTURJRAkJCT0gMHg4NjIsCiAJV01JX05PVElGWV9SRVFfQ01ESUQJCQk9IDB4ODYzLAogCVdNSV9HRVRfU1RBVFVTX0NNRElECQkJPSAweDg2NCwKKwlXTUlfR0VUX1JGX1NUQVRVU19DTURJRAkJCT0gMHg4NjYsCisJV01JX0dFVF9CQVNFQkFORF9UWVBFX0NNRElECQk9IDB4ODY3LAogCVdNSV9VTklUX1RFU1RfQ01ESUQJCQk9IDB4OTAwLAogCVdNSV9ISUNDVVBfQ01ESUQJCQk9IDB4OTAxLAogCVdNSV9GTEFTSF9SRUFEX0NNRElECQkJPSAweDkwMiwKIAlXTUlfRkxBU0hfV1JJVEVfQ01ESUQJCQk9IDB4OTAzLAorCS8qIFBvd2VyIG1hbmFnZW1lbnQgKi8KKwlXTUlfVFJBRkZJQ19ERUZFUlJBTF9DTURJRAkJPSAweDkwNCwKKwlXTUlfVFJBRkZJQ19SRVNVTUVfQ01ESUQJCT0gMHg5MDUsCiAJLyogUDJQICovCiAJV01JX1AyUF9DRkdfQ01ESUQJCQk9IDB4OTEwLAogCVdNSV9QT1JUX0FMTE9DQVRFX0NNRElECQkJPSAweDkxMSwKQEAgLTE1MCw2ICsxNjcsMjYgQEAKIAlXTUlfUENQX1NUQVJUX0NNRElECQkJPSAweDkxOCwKIAlXTUlfUENQX1NUT1BfQ01ESUQJCQk9IDB4OTE5LAogCVdNSV9HRVRfUENQX0ZBQ1RPUl9DTURJRAkJPSAweDkxQiwKKwkvKiBQb3dlciBTYXZlIENvbmZpZ3VyYXRpb24gQ29tbWFuZHMgKi8KKwlXTUlfUFNfREVWX1BST0ZJTEVfQ0ZHX0NNRElECQk9IDB4OTFDLAorCS8qIE5vdCBzdXBwb3J0ZWQgeWV0ICovCisJV01JX1BTX0RFVl9DRkdfQ01ESUQJCQk9IDB4OTFELAorCS8qIE5vdCBzdXBwb3J0ZWQgeWV0ICovCisJV01JX1BTX0RFVl9DRkdfUkVBRF9DTURJRAkJPSAweDkxRSwKKwkvKiBQZXIgTUFDIFBvd2VyIFNhdmUgQ29uZmlndXJhdGlvbiBjb21tYW5kcworCSAqIE5vdCBzdXBwb3J0ZWQgeWV0CisJICovCisJV01JX1BTX01JRF9DRkdfQ01ESUQJCQk9IDB4OTFGLAorCS8qIE5vdCBzdXBwb3J0ZWQgeWV0ICovCisJV01JX1BTX01JRF9DRkdfUkVBRF9DTURJRAkJPSAweDkyMCwKKwlXTUlfUlNfQ0ZHX0NNRElECQkJPSAweDkyMSwKKwlXTUlfR0VUX0RFVEFJTEVEX1JTX1JFU19DTURJRAkJPSAweDkyMiwKKwlXTUlfQU9BX01FQVNfQ01ESUQJCQk9IDB4OTIzLAorCVdNSV9UT0ZfU0VTU0lPTl9TVEFSVF9DTURJRAkJPSAweDk5MSwKKwlXTUlfVE9GX0dFVF9DQVBBQklMSVRJRVNfQ01ESUQJCT0gMHg5OTIsCisJV01JX1RPRl9TRVRfTENSX0NNRElECQkJPSAweDk5MywKKwlXTUlfVE9GX1NFVF9MQ0lfQ01ESUQJCQk9IDB4OTk0LAorCVdNSV9UT0ZfQ0hBTk5FTF9JTkZPX0NNRElECQk9IDB4OTk1LAogCVdNSV9TRVRfTUFDX0FERFJFU1NfQ01ESUQJCT0gMHhGMDAzLAogCVdNSV9BQk9SVF9TQ0FOX0NNRElECQkJPSAweEYwMDcsCiAJV01JX1NFVF9QUk9NSVNDVU9VU19NT0RFX0NNRElECQk9IDB4RjA0MSwKQEAgLTI5MSw5ICszMjgsOCBAQAogLyogV01JX1NUQVJUX1NDQU5fQ01ESUQgKi8KIHN0cnVjdCB3bWlfc3RhcnRfc2Nhbl9jbWQgewogCXU4IGRpcmVjdF9zY2FuX21hY19hZGRyW1dNSV9NQUNfTEVOXTsKLQkvKiBETUcgQmVhY29uIGZyYW1lIGlzIHRyYW5zbWl0dGVkIGR1cmluZyBhY3RpdmUgc2Nhbm5pbmcgKi8KKwkvKiBydW4gc2NhbiB3aXRoIGRpc2NvdmVyeSBiZWFjb24uIFJlbGV2YW50IGZvciBBQ1RJVkUgc2NhbiBvbmx5LiAqLwogCXU4IGRpc2NvdmVyeV9tb2RlOwotCS8qIHJlc2VydmVkICovCiAJdTggcmVzZXJ2ZWQ7CiAJLyogTWF4IGR1cmF0aW9uIGluIHRoZSBob21lIGNoYW5uZWwobXMpICovCiAJX19sZTMyIGR3ZWxsX3RpbWU7CkBAIC00NTMsNiArNDg5LDEyIEBACiAJdTggcmVzZXJ2ZWRbM107CiB9IF9fcGFja2VkOwogCisvKiBXTUlfVFJBRkZJQ19ERUZFUlJBTF9DTURJRCAqLworc3RydWN0IHdtaV90cmFmZmljX2RlZmVycmFsX2NtZCB7CisJLyogQml0IHZlY3RvcjogYml0WzBdIC0gd2FrZSBvbiBVbmljYXN0LCBiaXRbMV0gLSB3YWtlIG9uIEJyb2FkY2FzdCAqLworCXU4IHdha2V1cF90cmlnZ2VyOworfSBfX3BhY2tlZDsKKwogLyogV01JX1AyUF9DRkdfQ01ESUQgKi8KIGVudW0gd21pX2Rpc2NvdmVyeV9tb2RlIHsKIAlXTUlfRElTQ09WRVJZX01PREVfTk9OX09GRkxPQUQJPSAweDAwLApAQCAtODE4LDg1ICs4NjAsMTkzIEBACiAJX19sZTY0IG1lbV9iYXNlOwogfSBfX3BhY2tlZDsKIAorZW51bSB3bWlfYW9hX21lYXNfdHlwZSB7CisJV01JX0FPQV9QSEFTRV9NRUFTCT0gMHgwMCwKKwlXTUlfQU9BX1BIQVNFX0FNUF9NRUFTCT0gMHgwMSwKK307CisKKy8qIFdNSV9BT0FfTUVBU19DTURJRCAqLworc3RydWN0IHdtaV9hb2FfbWVhc19jbWQgeworCXU4IG1hY19hZGRyW1dNSV9NQUNfTEVOXTsKKwkvKiBjaGFubmVscyBJRHM6CisJICogMCAtIDU4MzIwIE1IegorCSAqIDEgLSA2MDQ4MCBNSHoKKwkgKiAyIC0gNjI2NDAgTUh6CisJICovCisJdTggY2hhbm5lbDsKKwkvKiBlbnVtIHdtaV9hb2FfbWVhc190eXBlICovCisJdTggYW9hX21lYXNfdHlwZTsKKwlfX2xlMzIgbWVhc19yZl9tYXNrOworfSBfX3BhY2tlZDsKKworZW51bSB3bWlfdG9mX2J1cnN0X2R1cmF0aW9uIHsKKwlXTUlfVE9GX0JVUlNUX0RVUkFUSU9OXzI1MF9VU0VDCQk9IDIsCisJV01JX1RPRl9CVVJTVF9EVVJBVElPTl81MDBfVVNFQwkJPSAzLAorCVdNSV9UT0ZfQlVSU1RfRFVSQVRJT05fMV9NU0VDCQk9IDQsCisJV01JX1RPRl9CVVJTVF9EVVJBVElPTl8yX01TRUMJCT0gNSwKKwlXTUlfVE9GX0JVUlNUX0RVUkFUSU9OXzRfTVNFQwkJPSA2LAorCVdNSV9UT0ZfQlVSU1RfRFVSQVRJT05fOF9NU0VDCQk9IDcsCisJV01JX1RPRl9CVVJTVF9EVVJBVElPTl8xNl9NU0VDCQk9IDgsCisJV01JX1RPRl9CVVJTVF9EVVJBVElPTl8zMl9NU0VDCQk9IDksCisJV01JX1RPRl9CVVJTVF9EVVJBVElPTl82NF9NU0VDCQk9IDEwLAorCVdNSV9UT0ZfQlVSU1RfRFVSQVRJT05fMTI4X01TRUMJCT0gMTEsCisJV01JX1RPRl9CVVJTVF9EVVJBVElPTl9OT19QUkVGRVJFTkNFUwk9IDE1LAorfTsKKworZW51bSB3bWlfdG9mX3Nlc3Npb25fc3RhcnRfZmxhZ3MgeworCVdNSV9UT0ZfU0VTU0lPTl9TVEFSVF9GTEFHX1NFQ1VSRUQJPSAweDEsCisJV01JX1RPRl9TRVNTSU9OX1NUQVJUX0ZMQUdfQVNBUAkJPSAweDIsCisJV01JX1RPRl9TRVNTSU9OX1NUQVJUX0ZMQUdfTENJX1JFUQk9IDB4NCwKKwlXTUlfVE9GX1NFU1NJT05fU1RBUlRfRkxBR19MQ1JfUkVRCT0gMHg4LAorfTsKKworLyogV01JX1RPRl9TRVNTSU9OX1NUQVJUX0NNRElEICovCitzdHJ1Y3Qgd21pX2Z0bV9kZXN0X2luZm8geworCXU4IGNoYW5uZWw7CisJLyogd21pX3RvZl9zZXNzaW9uX3N0YXJ0X2ZsYWdzX2UgKi8KKwl1OCBmbGFnczsKKwl1OCBpbml0aWFsX3Rva2VuOworCXU4IG51bV9vZl9mdG1fcGVyX2J1cnN0OworCXU4IG51bV9vZl9idXJzdHNfZXhwOworCS8qIHdtaV90b2ZfYnVyc3RfZHVyYXRpb25fZSAqLworCXU4IGJ1cnN0X2R1cmF0aW9uOworCS8qIEJ1cnN0IFBlcmlvZCBpbmRpY2F0ZSBpbnRlcnZhbCBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBidXJzdAorCSAqIGluc3RhbmNlcywgaW4gdW5pdHMgb2YgMTAwIG1zCisJICovCisJX19sZTE2IGJ1cnN0X3BlcmlvZDsKKwl1OCBkc3RfbWFjW1dNSV9NQUNfTEVOXTsKKwlfX2xlMTYgcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCisvKiBXTUlfVE9GX1NFU1NJT05fU1RBUlRfQ01ESUQgKi8KK3N0cnVjdCB3bWlfdG9mX3Nlc3Npb25fc3RhcnRfY21kIHsKKwlfX2xlMzIgc2Vzc2lvbl9pZDsKKwl1OCBudW1fb2ZfYW9hX21lYXN1cmVzOworCXU4IGFvYV90eXBlOworCV9fbGUxNiBudW1fb2ZfZGVzdDsKKwl1OCByZXNlcnZlZFs0XTsKKwlzdHJ1Y3Qgd21pX2Z0bV9kZXN0X2luZm8gZnRtX2Rlc3RfaW5mb1swXTsKK30gX19wYWNrZWQ7CisKK2VudW0gd21pX3RvZl9jaGFubmVsX2luZm9fcmVwb3J0X3R5cGUgeworCVdNSV9UT0ZfQ0hBTk5FTF9JTkZPX1RZUEVfQ0lSCQkJPSAweDEsCisJV01JX1RPRl9DSEFOTkVMX0lORk9fVFlQRV9SU1NJCQkJPSAweDIsCisJV01JX1RPRl9DSEFOTkVMX0lORk9fVFlQRV9TTlIJCQk9IDB4NCwKKwlXTUlfVE9GX0NIQU5ORUxfSU5GT19UWVBFX0RFQlVHX0RBVEEJCT0gMHg4LAorCVdNSV9UT0ZfQ0hBTk5FTF9JTkZPX1RZUEVfVkVORE9SX1NQRUNJRklDCT0gMHgxMCwKK307CisKKy8qIFdNSV9UT0ZfQ0hBTk5FTF9JTkZPX0NNRElEICovCitzdHJ1Y3Qgd21pX3RvZl9jaGFubmVsX2luZm9fY21kIHsKKwkvKiB3bWlfdG9mX2NoYW5uZWxfaW5mb19yZXBvcnRfdHlwZV9lICovCisJX19sZTMyIGNoYW5uZWxfaW5mb19yZXBvcnRfcmVxdWVzdDsKK30gX19wYWNrZWQ7CisKIC8qIFdNSSBFdmVudHMKICAqIExpc3Qgb2YgRXZlbnRzICh0YXJnZXQgdG8gaG9zdCkKICAqLwogZW51bSB3bWlfZXZlbnRfaWQgewotCVdNSV9SRUFEWV9FVkVOVElECQkJPSAweDEwMDEsCi0JV01JX0NPTk5FQ1RfRVZFTlRJRAkJCT0gMHgxMDAyLAotCVdNSV9ESVNDT05ORUNUX0VWRU5USUQJCQk9IDB4MTAwMywKLQlXTUlfU0NBTl9DT01QTEVURV9FVkVOVElECQk9IDB4MTAwQSwKLQlXTUlfUkVQT1JUX1NUQVRJU1RJQ1NfRVZFTlRJRAkJPSAweDEwMEIsCi0JV01JX1JEX01FTV9SU1BfRVZFTlRJRAkJCT0gMHgxODAwLAotCVdNSV9GV19SRUFEWV9FVkVOVElECQkJPSAweDE4MDEsCi0JV01JX0VYSVRfRkFTVF9NRU1fQUNDX01PREVfRVZFTlRJRAk9IDB4MjAwLAotCVdNSV9FQ0hPX1JTUF9FVkVOVElECQkJPSAweDE4MDMsCi0JV01JX0ZTX1RVTkVfRE9ORV9FVkVOVElECQk9IDB4MTgwQSwKLQlXTUlfQ09SUl9NRUFTVVJFX0VWRU5USUQJCT0gMHgxODBCLAotCVdNSV9SRUFEX1JTU0lfRVZFTlRJRAkJCT0gMHgxODBDLAotCVdNSV9URU1QX1NFTlNFX0RPTkVfRVZFTlRJRAkJPSAweDE4MEUsCi0JV01JX0RDX0NBTElCX0RPTkVfRVZFTlRJRAkJPSAweDE4MEYsCi0JV01JX0lRX1RYX0NBTElCX0RPTkVfRVZFTlRJRAkJPSAweDE4MTEsCi0JV01JX0lRX1JYX0NBTElCX0RPTkVfRVZFTlRJRAkJPSAweDE4MTIsCi0JV01JX1NFVF9XT1JLX01PREVfRE9ORV9FVkVOVElECQk9IDB4MTgxNSwKLQlXTUlfTE9fTEVBS0FHRV9DQUxJQl9ET05FX0VWRU5USUQJPSAweDE4MTYsCi0JV01JX01BUkxPTl9SX1JFQURfRE9ORV9FVkVOVElECQk9IDB4MTgxOCwKLQlXTUlfTUFSTE9OX1JfV1JJVEVfRE9ORV9FVkVOVElECQk9IDB4MTgxOSwKLQlXTUlfTUFSTE9OX1JfVFhSWF9TRUxfRE9ORV9FVkVOVElECT0gMHgxODFBLAotCVdNSV9TSUxFTlRfUlNTSV9DQUxJQl9ET05FX0VWRU5USUQJPSAweDE4MUQsCi0JV01JX1JGX1JYX1RFU1RfRE9ORV9FVkVOVElECQk9IDB4MTgxRSwKLQlXTUlfQ0ZHX1JYX0NIQUlOX0RPTkVfRVZFTlRJRAkJPSAweDE4MjAsCi0JV01JX1ZSSU5HX0NGR19ET05FX0VWRU5USUQJCT0gMHgxODIxLAotCVdNSV9CQV9TVEFUVVNfRVZFTlRJRAkJCT0gMHgxODIzLAotCVdNSV9SQ1BfQUREQkFfUkVRX0VWRU5USUQJCT0gMHgxODI0LAotCVdNSV9SQ1BfQUREQkFfUkVTUF9TRU5UX0VWRU5USUQJCT0gMHgxODI1LAotCVdNSV9ERUxCQV9FVkVOVElECQkJPSAweDE4MjYsCi0JV01JX0dFVF9TU0lEX0VWRU5USUQJCQk9IDB4MTgyOCwKLQlXTUlfR0VUX1BDUF9DSEFOTkVMX0VWRU5USUQJCT0gMHgxODJBLAotCVdNSV9TV19UWF9DT01QTEVURV9FVkVOVElECQk9IDB4MTgyQiwKLQlXTUlfUkVBRF9NQUNfUlhRX0VWRU5USUQJCT0gMHgxODMwLAotCVdNSV9SRUFEX01BQ19UWFFfRVZFTlRJRAkJPSAweDE4MzEsCi0JV01JX1dSSVRFX01BQ19SWFFfRVZFTlRJRAkJPSAweDE4MzIsCi0JV01JX1dSSVRFX01BQ19UWFFfRVZFTlRJRAkJPSAweDE4MzMsCi0JV01JX1dSSVRFX01BQ19YUV9GSUVMRF9FVkVOVElECQk9IDB4MTgzNCwKLQlXTUlfQkVBTUZPUk1JTkdfTUdNVF9ET05FX0VWRU5USUQJPSAweDE4MzYsCi0JV01JX0JGX1RYU1NfTUdNVF9ET05FX0VWRU5USUQJCT0gMHgxODM3LAotCVdNSV9CRl9SWFNTX01HTVRfRE9ORV9FVkVOVElECQk9IDB4MTgzOSwKLQlXTUlfUlNfTUdNVF9ET05FX0VWRU5USUQJCT0gMHgxODUyLAotCVdNSV9SRl9NR01UX1NUQVRVU19FVkVOVElECQk9IDB4MTg1MywKLQlXTUlfVEhFUk1BTF9USFJPVFRMSU5HX1NUQVRVU19FVkVOVElECT0gMHgxODU1LAotCVdNSV9CRl9TTV9NR01UX0RPTkVfRVZFTlRJRAkJPSAweDE4MzgsCi0JV01JX1JYX01HTVRfUEFDS0VUX0VWRU5USUQJCT0gMHgxODQwLAotCVdNSV9UWF9NR01UX1BBQ0tFVF9FVkVOVElECQk9IDB4MTg0MSwKLQlXTUlfT1RQX1JFQURfUkVTVUxUX0VWRU5USUQJCT0gMHgxODU2LAotCVdNSV9MRURfQ0ZHX0RPTkVfRVZFTlRJRAkJPSAweDE4NTgsCisJV01JX1JFQURZX0VWRU5USUQJCQkJPSAweDEwMDEsCisJV01JX0NPTk5FQ1RfRVZFTlRJRAkJCQk9IDB4MTAwMiwKKwlXTUlfRElTQ09OTkVDVF9FVkVOVElECQkJCT0gMHgxMDAzLAorCVdNSV9TQ0FOX0NPTVBMRVRFX0VWRU5USUQJCQk9IDB4MTAwQSwKKwlXTUlfUkVQT1JUX1NUQVRJU1RJQ1NfRVZFTlRJRAkJCT0gMHgxMDBCLAorCVdNSV9SRF9NRU1fUlNQX0VWRU5USUQJCQkJPSAweDE4MDAsCisJV01JX0ZXX1JFQURZX0VWRU5USUQJCQkJPSAweDE4MDEsCisJV01JX0VYSVRfRkFTVF9NRU1fQUNDX01PREVfRVZFTlRJRAkJPSAweDIwMCwKKwlXTUlfRUNIT19SU1BfRVZFTlRJRAkJCQk9IDB4MTgwMywKKwlXTUlfRlNfVFVORV9ET05FX0VWRU5USUQJCQk9IDB4MTgwQSwKKwlXTUlfQ09SUl9NRUFTVVJFX0VWRU5USUQJCQk9IDB4MTgwQiwKKwlXTUlfUkVBRF9SU1NJX0VWRU5USUQJCQkJPSAweDE4MEMsCisJV01JX1RFTVBfU0VOU0VfRE9ORV9FVkVOVElECQkJPSAweDE4MEUsCisJV01JX0RDX0NBTElCX0RPTkVfRVZFTlRJRAkJCT0gMHgxODBGLAorCVdNSV9JUV9UWF9DQUxJQl9ET05FX0VWRU5USUQJCQk9IDB4MTgxMSwKKwlXTUlfSVFfUlhfQ0FMSUJfRE9ORV9FVkVOVElECQkJPSAweDE4MTIsCisJV01JX1NFVF9XT1JLX01PREVfRE9ORV9FVkVOVElECQkJPSAweDE4MTUsCisJV01JX0xPX0xFQUtBR0VfQ0FMSUJfRE9ORV9FVkVOVElECQk9IDB4MTgxNiwKKwlXTUlfTUFSTE9OX1JfUkVBRF9ET05FX0VWRU5USUQJCQk9IDB4MTgxOCwKKwlXTUlfTUFSTE9OX1JfV1JJVEVfRE9ORV9FVkVOVElECQkJPSAweDE4MTksCisJV01JX01BUkxPTl9SX1RYUlhfU0VMX0RPTkVfRVZFTlRJRAkJPSAweDE4MUEsCisJV01JX1NJTEVOVF9SU1NJX0NBTElCX0RPTkVfRVZFTlRJRAkJPSAweDE4MUQsCisJV01JX1JGX1JYX1RFU1RfRE9ORV9FVkVOVElECQkJPSAweDE4MUUsCisJV01JX0NGR19SWF9DSEFJTl9ET05FX0VWRU5USUQJCQk9IDB4MTgyMCwKKwlXTUlfVlJJTkdfQ0ZHX0RPTkVfRVZFTlRJRAkJCT0gMHgxODIxLAorCVdNSV9CQV9TVEFUVVNfRVZFTlRJRAkJCQk9IDB4MTgyMywKKwlXTUlfUkNQX0FEREJBX1JFUV9FVkVOVElECQkJPSAweDE4MjQsCisJV01JX1JDUF9BRERCQV9SRVNQX1NFTlRfRVZFTlRJRAkJCT0gMHgxODI1LAorCVdNSV9ERUxCQV9FVkVOVElECQkJCT0gMHgxODI2LAorCVdNSV9HRVRfU1NJRF9FVkVOVElECQkJCT0gMHgxODI4LAorCVdNSV9HRVRfUENQX0NIQU5ORUxfRVZFTlRJRAkJCT0gMHgxODJBLAorCVdNSV9TV19UWF9DT01QTEVURV9FVkVOVElECQkJPSAweDE4MkIsCisJV01JX1JFQURfTUFDX1JYUV9FVkVOVElECQkJPSAweDE4MzAsCisJV01JX1JFQURfTUFDX1RYUV9FVkVOVElECQkJPSAweDE4MzEsCisJV01JX1dSSVRFX01BQ19SWFFfRVZFTlRJRAkJCT0gMHgxODMyLAorCVdNSV9XUklURV9NQUNfVFhRX0VWRU5USUQJCQk9IDB4MTgzMywKKwlXTUlfV1JJVEVfTUFDX1hRX0ZJRUxEX0VWRU5USUQJCQk9IDB4MTgzNCwKKwlXTUlfQkVBTUZPUk1JTkdfTUdNVF9ET05FX0VWRU5USUQJCT0gMHgxODM2LAorCVdNSV9CRl9UWFNTX01HTVRfRE9ORV9FVkVOVElECQkJPSAweDE4MzcsCisJV01JX0JGX1JYU1NfTUdNVF9ET05FX0VWRU5USUQJCQk9IDB4MTgzOSwKKwlXTUlfUlNfTUdNVF9ET05FX0VWRU5USUQJCQk9IDB4MTg1MiwKKwlXTUlfUkZfTUdNVF9TVEFUVVNfRVZFTlRJRAkJCT0gMHgxODUzLAorCVdNSV9USEVSTUFMX1RIUk9UVExJTkdfU1RBVFVTX0VWRU5USUQJCT0gMHgxODU1LAorCVdNSV9CRl9TTV9NR01UX0RPTkVfRVZFTlRJRAkJCT0gMHgxODM4LAorCVdNSV9SWF9NR01UX1BBQ0tFVF9FVkVOVElECQkJPSAweDE4NDAsCisJV01JX1RYX01HTVRfUEFDS0VUX0VWRU5USUQJCQk9IDB4MTg0MSwKKwlXTUlfTElOS19NQUlOVEFJTl9DRkdfV1JJVEVfRE9ORV9FVkVOVElECT0gMHgxODQyLAorCVdNSV9MSU5LX01BSU5UQUlOX0NGR19SRUFEX0RPTkVfRVZFTlRJRAkJPSAweDE4NDMsCisJV01JX09UUF9SRUFEX1JFU1VMVF9FVkVOVElECQkJPSAweDE4NTYsCisJV01JX0xFRF9DRkdfRE9ORV9FVkVOVElECQkJPSAweDE4NTgsCiAJLyogUGVyZm9ybWFuY2UgbW9uaXRvcmluZyBldmVudHMgKi8KLQlXTUlfREFUQV9QT1JUX09QRU5fRVZFTlRJRAkJPSAweDE4NjAsCi0JV01JX1dCRV9MSU5LX0RPV05fRVZFTlRJRAkJPSAweDE4NjEsCi0JV01JX0JGX0NUUkxfRE9ORV9FVkVOVElECQk9IDB4MTg2MiwKLQlXTUlfTk9USUZZX1JFUV9ET05FX0VWRU5USUQJCT0gMHgxODYzLAotCVdNSV9HRVRfU1RBVFVTX0RPTkVfRVZFTlRJRAkJPSAweDE4NjQsCi0JV01JX1ZSSU5HX0VOX0VWRU5USUQJCQk9IDB4MTg2NSwKLQlXTUlfVU5JVF9URVNUX0VWRU5USUQJCQk9IDB4MTkwMCwKLQlXTUlfRkxBU0hfUkVBRF9ET05FX0VWRU5USUQJCT0gMHgxOTAyLAotCVdNSV9GTEFTSF9XUklURV9ET05FX0VWRU5USUQJCT0gMHgxOTAzLAorCVdNSV9EQVRBX1BPUlRfT1BFTl9FVkVOVElECQkJPSAweDE4NjAsCisJV01JX1dCRV9MSU5LX0RPV05fRVZFTlRJRAkJCT0gMHgxODYxLAorCVdNSV9CRl9DVFJMX0RPTkVfRVZFTlRJRAkJCT0gMHgxODYyLAorCVdNSV9OT1RJRllfUkVRX0RPTkVfRVZFTlRJRAkJCT0gMHgxODYzLAorCVdNSV9HRVRfU1RBVFVTX0RPTkVfRVZFTlRJRAkJCT0gMHgxODY0LAorCVdNSV9WUklOR19FTl9FVkVOVElECQkJCT0gMHgxODY1LAorCVdNSV9HRVRfUkZfU1RBVFVTX0VWRU5USUQJCQk9IDB4MTg2NiwKKwlXTUlfR0VUX0JBU0VCQU5EX1RZUEVfRVZFTlRJRAkJCT0gMHgxODY3LAorCVdNSV9VTklUX1RFU1RfRVZFTlRJRAkJCQk9IDB4MTkwMCwKKwlXTUlfRkxBU0hfUkVBRF9ET05FX0VWRU5USUQJCQk9IDB4MTkwMiwKKwlXTUlfRkxBU0hfV1JJVEVfRE9ORV9FVkVOVElECQkJPSAweDE5MDMsCisJLyogUG93ZXIgbWFuYWdlbWVudCAqLworCVdNSV9UUkFGRklDX0RFRkVSUkFMX0VWRU5USUQJCQk9IDB4MTkwNCwKKwlXTUlfVFJBRkZJQ19SRVNVTUVfRVZFTlRJRAkJCT0gMHgxOTA1LAogCS8qIFAyUCAqLwotCVdNSV9QMlBfQ0ZHX0RPTkVfRVZFTlRJRAkJPSAweDE5MTAsCi0JV01JX1BPUlRfQUxMT0NBVEVEX0VWRU5USUQJCT0gMHgxOTExLAotCVdNSV9QT1JUX0RFTEVURURfRVZFTlRJRAkJPSAweDE5MTIsCi0JV01JX0xJU1RFTl9TVEFSVEVEX0VWRU5USUQJCT0gMHgxOTE0LAotCVdNSV9TRUFSQ0hfU1RBUlRFRF9FVkVOVElECQk9IDB4MTkxNSwKLQlXTUlfRElTQ09WRVJZX1NUQVJURURfRVZFTlRJRAkJPSAweDE5MTYsCi0JV01JX0RJU0NPVkVSWV9TVE9QUEVEX0VWRU5USUQJCT0gMHgxOTE3LAotCVdNSV9QQ1BfU1RBUlRFRF9FVkVOVElECQkJPSAweDE5MTgsCi0JV01JX1BDUF9TVE9QUEVEX0VWRU5USUQJCQk9IDB4MTkxOSwKLQlXTUlfUENQX0ZBQ1RPUl9FVkVOVElECQkJPSAweDE5MUEsCi0JV01JX1NFVF9DSEFOTkVMX0VWRU5USUQJCQk9IDB4OTAwMCwKLQlXTUlfQVNTT0NfUkVRX0VWRU5USUQJCQk9IDB4OTAwMSwKLQlXTUlfRUFQT0xfUlhfRVZFTlRJRAkJCT0gMHg5MDAyLAotCVdNSV9NQUNfQUREUl9SRVNQX0VWRU5USUQJCT0gMHg5MDAzLAotCVdNSV9GV19WRVJfRVZFTlRJRAkJCT0gMHg5MDA0LAotCVdNSV9BQ1NfUEFTU0lWRV9TQ0FOX0NPTVBMRVRFX0VWRU5USUQJPSAweDkwMDUsCisJV01JX1AyUF9DRkdfRE9ORV9FVkVOVElECQkJPSAweDE5MTAsCisJV01JX1BPUlRfQUxMT0NBVEVEX0VWRU5USUQJCQk9IDB4MTkxMSwKKwlXTUlfUE9SVF9ERUxFVEVEX0VWRU5USUQJCQk9IDB4MTkxMiwKKwlXTUlfTElTVEVOX1NUQVJURURfRVZFTlRJRAkJCT0gMHgxOTE0LAorCVdNSV9TRUFSQ0hfU1RBUlRFRF9FVkVOVElECQkJPSAweDE5MTUsCisJV01JX0RJU0NPVkVSWV9TVEFSVEVEX0VWRU5USUQJCQk9IDB4MTkxNiwKKwlXTUlfRElTQ09WRVJZX1NUT1BQRURfRVZFTlRJRAkJCT0gMHgxOTE3LAorCVdNSV9QQ1BfU1RBUlRFRF9FVkVOVElECQkJCT0gMHgxOTE4LAorCVdNSV9QQ1BfU1RPUFBFRF9FVkVOVElECQkJCT0gMHgxOTE5LAorCVdNSV9QQ1BfRkFDVE9SX0VWRU5USUQJCQkJPSAweDE5MUEsCisJLyogUG93ZXIgU2F2ZSBDb25maWd1cmF0aW9uIEV2ZW50cyAqLworCVdNSV9QU19ERVZfUFJPRklMRV9DRkdfRVZFTlRJRAkJCT0gMHgxOTFDLAorCS8qIE5vdCBzdXBwb3J0ZWQgeWV0ICovCisJV01JX1BTX0RFVl9DRkdfRVZFTlRJRAkJCQk9IDB4MTkxRCwKKwkvKiBOb3Qgc3VwcG9ydGVkIHlldCAqLworCVdNSV9QU19ERVZfQ0ZHX1JFQURfRVZFTlRJRAkJCT0gMHgxOTFFLAorCS8qIE5vdCBzdXBwb3J0ZWQgeWV0ICovCisJV01JX1BTX01JRF9DRkdfRVZFTlRJRAkJCQk9IDB4MTkxRiwKKwkvKiBOb3Qgc3VwcG9ydGVkIHlldCAqLworCVdNSV9QU19NSURfQ0ZHX1JFQURfRVZFTlRJRAkJCT0gMHgxOTIwLAorCVdNSV9SU19DRkdfRE9ORV9FVkVOVElECQkJCT0gMHgxOTIxLAorCVdNSV9HRVRfREVUQUlMRURfUlNfUkVTX0VWRU5USUQJCQk9IDB4MTkyMiwKKwlXTUlfQU9BX01FQVNfRVZFTlRJRAkJCQk9IDB4MTkyMywKKwlXTUlfVE9GX1NFU1NJT05fRU5EX0VWRU5USUQJCQk9IDB4MTk5MSwKKwlXTUlfVE9GX0dFVF9DQVBBQklMSVRJRVNfRVZFTlRJRAkJPSAweDE5OTIsCisJV01JX1RPRl9TRVRfTENSX0VWRU5USUQJCQkJPSAweDE5OTMsCisJV01JX1RPRl9TRVRfTENJX0VWRU5USUQJCQkJPSAweDE5OTQsCisJV01JX1RPRl9GVE1fUEVSX0RFU1RfUkVTX0VWRU5USUQJCT0gMHgxOTk1LAorCVdNSV9UT0ZfQ0hBTk5FTF9JTkZPX0VWRU5USUQJCQk9IDB4MTk5NiwKKwlXTUlfU0VUX0NIQU5ORUxfRVZFTlRJRAkJCQk9IDB4OTAwMCwKKwlXTUlfQVNTT0NfUkVRX0VWRU5USUQJCQkJPSAweDkwMDEsCisJV01JX0VBUE9MX1JYX0VWRU5USUQJCQkJPSAweDkwMDIsCisJV01JX01BQ19BRERSX1JFU1BfRVZFTlRJRAkJCT0gMHg5MDAzLAorCVdNSV9GV19WRVJfRVZFTlRJRAkJCQk9IDB4OTAwNCwKKwlXTUlfQUNTX1BBU1NJVkVfU0NBTl9DT01QTEVURV9FVkVOVElECQk9IDB4OTAwNSwKIH07CiAKIC8qIEV2ZW50cyBkYXRhIHN0cnVjdHVyZXMgKi8KQEAgLTk0MywxMCArMTA5Myw4NSBAQAogCiAvKiBXTUlfRldfVkVSX0VWRU5USUQgKi8KIHN0cnVjdCB3bWlfZndfdmVyX2V2ZW50IHsKLQl1OCBtYWpvcjsKLQl1OCBtaW5vcjsKLQlfX2xlMTYgc3VibWlub3I7Ci0JX19sZTE2IGJ1aWxkOworCS8qIEZXIGltYWdlIHZlcnNpb24gKi8KKwlfX2xlMzIgZndfbWFqb3I7CisJX19sZTMyIGZ3X21pbm9yOworCV9fbGUzMiBmd19zdWJtaW5vcjsKKwlfX2xlMzIgZndfYnVpbGQ7CisJLyogRlcgaW1hZ2UgYnVpbGQgdGltZSBzdGFtcCAqLworCV9fbGUzMiBob3VyOworCV9fbGUzMiBtaW51dGU7CisJX19sZTMyIHNlY29uZDsKKwlfX2xlMzIgZGF5OworCV9fbGUzMiBtb250aDsKKwlfX2xlMzIgeWVhcjsKKwkvKiBCb290IExvYWRlciBpbWFnZSB2ZXJzaW9uICovCisJX19sZTMyIGJsX21ham9yOworCV9fbGUzMiBibF9taW5vcjsKKwlfX2xlMzIgYmxfc3VibWlub3I7CisJX19sZTMyIGJsX2J1aWxkOworCS8qIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgRlcgY2FwYWJpbGllcyBhcnJheSAqLworCXU4IGZ3X2NhcGFiaWxpdGllc19sZW47CisJdTggcmVzZXJ2ZWRbM107CisJLyogRlcgY2FwYWJpbGl0aWVzIGluZm8KKwkgKiBNdXN0IGJlIHRoZSBsYXN0IG1lbWJlciBvZiB0aGUgc3RydWN0CisJICovCisJX19sZTMyIGZ3X2NhcGFiaWxpdGllc1swXTsKK30gX19wYWNrZWQ7CisKKy8qIFdNSV9HRVRfUkZfU1RBVFVTX0VWRU5USUQgKi8KK2VudW0gcmZfdHlwZSB7CisJUkZfVU5LTk9XTgk9IDB4MDAsCisJUkZfTUFSTE9OCT0gMHgwMSwKKwlSRl9TUEFSUk9XCT0gMHgwMiwKK307CisKKy8qIFdNSV9HRVRfUkZfU1RBVFVTX0VWRU5USUQgKi8KK2VudW0gYm9hcmRfZmlsZV9yZl90eXBlIHsKKwlCRl9SRl9NQVJMT04JPSAweDAwLAorCUJGX1JGX1NQQVJST1cJPSAweDAxLAorfTsKKworLyogV01JX0dFVF9SRl9TVEFUVVNfRVZFTlRJRCAqLworZW51bSByZl9zdGF0dXMgeworCVJGX09LCQkJPSAweDAwLAorCVJGX05PX0NPTU0JCT0gMHgwMSwKKwlSRl9XUk9OR19CT0FSRF9GSUxFCT0gMHgwMiwKK307CisKKy8qIFdNSV9HRVRfUkZfU1RBVFVTX0VWRU5USUQgKi8KK3N0cnVjdCB3bWlfZ2V0X3JmX3N0YXR1c19ldmVudCB7CisJLyogZW51bSByZl90eXBlICovCisJX19sZTMyIHJmX3R5cGU7CisJLyogYXR0YWNoZWQgUkZzIGJpdCB2ZWN0b3IgKi8KKwlfX2xlMzIgYXR0YWNoZWRfcmZfdmVjdG9yOworCS8qIGVuYWJsZWQgUkZzIGJpdCB2ZWN0b3IgKi8KKwlfX2xlMzIgZW5hYmxlZF9yZl92ZWN0b3I7CisJLyogZW51bSByZl9zdGF0dXMsIHJlZmVycyB0byBlbmFibGVkIFJGcyAqLworCXU4IHJmX3N0YXR1c1szMl07CisJLyogZW51bSBib2FyZCBmaWxlIFJGIHR5cGUgKi8KKwlfX2xlMzIgYm9hcmRfZmlsZV9yZl90eXBlOworCS8qIGJvYXJkIGZpbGUgcGxhdGZvcm0gdHlwZSAqLworCV9fbGUzMiBib2FyZF9maWxlX3BsYXRmb3JtX3R5cGU7CisJLyogYm9hcmQgZmlsZSB2ZXJzaW9uICovCisJX19sZTMyIGJvYXJkX2ZpbGVfdmVyc2lvbjsKKwlfX2xlMzIgcmVzZXJ2ZWRbMl07Cit9IF9fcGFja2VkOworCisvKiBXTUlfR0VUX0JBU0VCQU5EX1RZUEVfRVZFTlRJRCAqLworZW51bSBiYXNlYmFuZF90eXBlIHsKKwlCQVNFQkFORF9VTktOT1dOCT0gMHgwMCwKKwlCQVNFQkFORF9TUEFSUk9XX01fQTAJPSAweDAzLAorCUJBU0VCQU5EX1NQQVJST1dfTV9BMQk9IDB4MDQsCisJQkFTRUJBTkRfU1BBUlJPV19NX0IwCT0gMHgwNSwKKwlCQVNFQkFORF9TUEFSUk9XX01fQzAJPSAweDA2LAorCUJBU0VCQU5EX1NQQVJST1dfTV9EMAk9IDB4MDcsCit9OworCisvKiBXTUlfR0VUX0JBU0VCQU5EX1RZUEVfRVZFTlRJRCAqLworc3RydWN0IHdtaV9nZXRfYmFzZWJhbmRfdHlwZV9ldmVudCB7CisJLyogZW51bSBiYXNlYmFuZF90eXBlICovCisJX19sZTMyIGJhc2ViYW5kX3R5cGU7CiB9IF9fcGFja2VkOwogCiAvKiBXTUlfTUFDX0FERFJfUkVTUF9FVkVOVElEICovCkBAIC0xNDEwLDQgKzE2MzUsNTUzIEBACiAJX19sZTMyIHN0YXR1czsKIH0gX19wYWNrZWQ7CiAKKyNkZWZpbmUgV01JX05VTV9NQ1MJKDEzKQorCisvKiBSYXRlIHNlYXJjaCBwYXJhbWV0ZXJzIGNvbmZpZ3VyYXRpb24gcGVyIGNvbm5lY3Rpb24gKi8KK3N0cnVjdCB3bWlfcnNfY2ZnIHsKKwkvKiBUaGUgbWF4aW1hbCBhbGxvd2VkIFBFUiBmb3IgZWFjaCBNQ1MKKwkgKiBNQ1Mgd2lsbCBiZSBjb25zaWRlcmVkIGFzIGZhaWxlZCBpZiBQRVIgZHVyaW5nIFJTIGlzIGhpZ2hlcgorCSAqLworCXU4IHBlcl90aHJlc2hvbGRbV01JX05VTV9NQ1NdOworCS8qIE51bWJlciBvZiBNUERVcyBmb3IgZWFjaCBNQ1MKKwkgKiB0aGlzIGlzIHRoZSBtaW5pbWFsIHN0YXRpc3RpYyByZXF1aXJlZCB0byBtYWtlIGFuIGVkdWNhdGVkCisJICogZGVjaXNpb24KKwkgKi8KKwl1OCBtaW5fZnJhbWVfY250W1dNSV9OVU1fTUNTXTsKKwkvKiBzdG9wIHRocmVzaG9sZCBbMC0xMDBdICovCisJdTggc3RvcF90aDsKKwkvKiBNQ1MxIHN0b3AgdGhyZXNob2xkIFswLTEwMF0gKi8KKwl1OCBtY3MxX2ZhaWxfdGg7CisJdTggbWF4X2JhY2tfZmFpbHVyZV90aDsKKwkvKiBEZWJ1ZyBmZWF0dXJlIGZvciBkaXNhYmxpbmcgaW50ZXJuYWwgUlMgdHJpZ2dlciAod2hpY2ggaXMKKwkgKiBjdXJyZW50bHkgdHJpZ2dlcmVkIGJ5IEJGIERvbmUpCisJICovCisJdTggZGJnX2Rpc2FibGVfaW50ZXJuYWxfdHJpZ2dlcjsKKwlfX2xlMzIgYmFja19mYWlsdXJlX21hc2s7CisJX19sZTMyIG1jc19lbl92ZWM7Cit9IF9fcGFja2VkOworCisvKiBXTUlfUlNfQ0ZHX0NNRElEICovCitzdHJ1Y3Qgd21pX3JzX2NmZ19jbWQgeworCS8qIGNvbm5lY3Rpb24gaWQgKi8KKwl1OCBjaWQ7CisJLyogZW5hYmxlIG9yIGRpc2FibGUgcmF0ZSBzZWFyY2ggKi8KKwl1OCByc19lbmFibGU7CisJLyogcmF0ZSBzZWFyY2ggY29uZmlndXJhdGlvbiAqLworCXN0cnVjdCB3bWlfcnNfY2ZnIHJzX2NmZzsKK30gX19wYWNrZWQ7CisKKy8qIFdNSV9SU19DRkdfRE9ORV9FVkVOVElEICovCitzdHJ1Y3Qgd21pX3JzX2NmZ19kb25lX2V2ZW50IHsKKwl1OCBjaWQ7CisJLyogZW51bSB3bWlfZndfc3RhdHVzICovCisJdTggc3RhdHVzOworCXU4IHJlc2VydmVkWzJdOworfSBfX3BhY2tlZDsKKworLyogV01JX0dFVF9ERVRBSUxFRF9SU19SRVNfQ01ESUQgKi8KK3N0cnVjdCB3bWlfZ2V0X2RldGFpbGVkX3JzX3Jlc19jbWQgeworCS8qIGNvbm5lY3Rpb24gaWQgKi8KKwl1OCBjaWQ7CisJdTggcmVzZXJ2ZWRbM107Cit9IF9fcGFja2VkOworCisvKiBSUyByZXN1bHRzIHN0YXR1cyAqLworZW51bSB3bWlfcnNfcmVzdWx0c19zdGF0dXMgeworCVdNSV9SU19SRVNfVkFMSUQJPSAweDAwLAorCVdNSV9SU19SRVNfSU5WQUxJRAk9IDB4MDEsCit9OworCisvKiBSYXRlIHNlYXJjaCByZXN1bHRzICovCitzdHJ1Y3Qgd21pX3JzX3Jlc3VsdHMgeworCS8qIG51bWJlciBvZiBzZW50IE1QRFVzICovCisJdTggbnVtX29mX3R4X3BrdFtXTUlfTlVNX01DU107CisJLyogbnVtYmVyIG9mIG5vbi1hY2tlZCBNUERVcyAqLworCXU4IG51bV9vZl9ub25fYWNrZWRfcGt0W1dNSV9OVU1fTUNTXTsKKwkvKiBSUyB0aW1lc3RhbXAgKi8KKwlfX2xlMzIgdHNmOworCS8qIFJTIHNlbGVjdGVkIE1DUyAqLworCXU4IG1jczsKK30gX19wYWNrZWQ7CisKKy8qIFdNSV9HRVRfREVUQUlMRURfUlNfUkVTX0VWRU5USUQgKi8KK3N0cnVjdCB3bWlfZ2V0X2RldGFpbGVkX3JzX3Jlc19ldmVudCB7CisJdTggY2lkOworCS8qIGVudW0gd21pX3JzX3Jlc3VsdHNfc3RhdHVzICovCisJdTggc3RhdHVzOworCS8qIGRldGFpbGVkIHJzIHJlc3VsdHMgKi8KKwlzdHJ1Y3Qgd21pX3JzX3Jlc3VsdHMgcnNfcmVzdWx0czsKKwl1OCByZXNlcnZlZFszXTsKK30gX19wYWNrZWQ7CisKKy8qIGJyb2FkY2FzdCBjb25uZWN0aW9uIElEICovCisjZGVmaW5lIFdNSV9MSU5LX01BSU5UQUlOX0NGR19DSURfQlJPQURDQVNUCSgweEZGRkZGRkZGKQorCisvKiBUeXBlcyB3bWlfbGlua19tYWludGFpbl9jZmcgcHJlc2V0cyBmb3IgV01JX0xJTktfTUFJTlRBSU5fQ0ZHX1dSSVRFX0NNRCAqLworZW51bSB3bWlfbGlua19tYWludGFpbl9jZmdfdHlwZSB7CisJLyogQVAvUENQIGRlZmF1bHQgbm9ybWFsIChub24tRlNUKSBjb25maWd1cmF0aW9uIHNldHRpbmdzICovCisJV01JX0xJTktfTUFJTlRBSU5fQ0ZHX1RZUEVfREVGQVVMVF9OT1JNQUxfQVAJPSAweDAwLAorCS8qIEFQL1BDUCAgZGVmYXVsdCBGU1QgY29uZmlndXJhdGlvbiBzZXR0aW5ncyAqLworCVdNSV9MSU5LX01BSU5UQUlOX0NGR19UWVBFX0RFRkFVTFRfRlNUX0FQCT0gMHgwMSwKKwkvKiBTVEEgZGVmYXVsdCBub3JtYWwgKG5vbi1GU1QpIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgKi8KKwlXTUlfTElOS19NQUlOVEFJTl9DRkdfVFlQRV9ERUZBVUxUX05PUk1BTF9TVEEJPSAweDAyLAorCS8qIFNUQSBkZWZhdWx0IEZTVCBjb25maWd1cmF0aW9uIHNldHRpbmdzICovCisJV01JX0xJTktfTUFJTlRBSU5fQ0ZHX1RZUEVfREVGQVVMVF9GU1RfU1RBCT0gMHgwMywKKwkvKiBjdXN0b20gY29uZmlndXJhdGlvbiBzZXR0aW5ncyAqLworCVdNSV9MSU5LX01BSU5UQUlOX0NGR19UWVBFX0NVU1RPTQkJPSAweDA0LAorCS8qIG51bWJlciBvZiBkZWZpbmVkIGNvbmZpZ3VyYXRpb24gdHlwZXMgKi8KKwlXTUlfTElOS19NQUlOVEFJTl9DRkdfVFlQRVNfTlVNCQkJPSAweDA1LAorfTsKKworLyogUmVzcG9uc2Ugc3RhdHVzIGNvZGVzIGZvciBXTUlfTElOS19NQUlOVEFJTl9DRkdfV1JJVEUvUkVBRCBjb21tYW5kcyAqLworZW51bSB3bWlfbGlua19tYWludGFpbl9jZmdfcmVzcG9uc2Vfc3RhdHVzIHsKKwkvKiBXTUlfTElOS19NQUlOVEFJTl9DRkdfV1JJVEUvUkVBRCBjb21tYW5kIHN1Y2Nlc3NmdWxseSBhY2NvbXBsaXNoZWQKKwkgKi8KKwlXTUlfTElOS19NQUlOVEFJTl9DRkdfUkVTUE9OU0VfU1RBVFVTX09LCQk9IDB4MDAsCisJLyogRVJST1IgZHVlIHRvIGJhZCBhcmd1bWVudCBpbiBXTUlfTElOS19NQUlOVEFJTl9DRkdfV1JJVEUvUkVBRAorCSAqIGNvbW1hbmQgcmVxdWVzdAorCSAqLworCVdNSV9MSU5LX01BSU5UQUlOX0NGR19SRVNQT05TRV9TVEFUVVNfQkFEX0FSR1VNRU5UCT0gMHgwMSwKK307CisKKy8qIExpbmsgTG9zcyBhbmQgS2VlcCBBbGl2ZSBjb25maWd1cmF0aW9uICovCitzdHJ1Y3Qgd21pX2xpbmtfbWFpbnRhaW5fY2ZnIHsKKwkvKiBsaW5rX2xvc3NfZW5hYmxlX2RldGVjdG9yc192ZWMgKi8KKwlfX2xlMzIgbGlua19sb3NzX2VuYWJsZV9kZXRlY3RvcnNfdmVjOworCS8qIGRldGVjdG9ycyBjaGVjayBwZXJpb2QgdXNlYyAqLworCV9fbGUzMiBjaGVja19saW5rX2xvc3NfcGVyaW9kX3VzZWM7CisJLyogbWF4IGFsbG93ZWQgdHggYWdlaW5nICovCisJX19sZTMyIHR4X2FnZWluZ190aHJlc2hvbGRfdXNlYzsKKwkvKiBrZWVwIGFsaXZlIHBlcmlvZCBmb3IgaGlnaCBTTlIgKi8KKwlfX2xlMzIga2VlcF9hbGl2ZV9wZXJpb2RfdXNlY19oaWdoX3NucjsKKwkvKiBrZWVwIGFsaXZlIHBlcmlvZCBmb3IgbG93IFNOUiAqLworCV9fbGUzMiBrZWVwX2FsaXZlX3BlcmlvZF91c2VjX2xvd19zbnI7CisJLyogbG93ZXIgc25yIGxpbWl0IGZvciBrZWVwIGFsaXZlIHBlcmlvZCB1cGRhdGUgKi8KKwlfX2xlMzIga2VlcF9hbGl2ZV9zbnJfdGhyZXNob2xkX2xvd19kYjsKKwkvKiB1cHBlciBzbnIgbGltaXQgZm9yIGtlZXAgYWxpdmUgcGVyaW9kIHVwZGF0ZSAqLworCV9fbGUzMiBrZWVwX2FsaXZlX3Nucl90aHJlc2hvbGRfaGlnaF9kYjsKKwkvKiBudW0gb2Ygc3VjY2Vzc2l2ZSBiYWQgYmNvbnMgY2F1c2luZyBsaW5rLWxvc3MgKi8KKwlfX2xlMzIgYmFkX2JlYWNvbnNfbnVtX3RocmVzaG9sZDsKKwkvKiBTTlIgbGltaXQgZm9yIGJhZF9iZWFjb25zX2RldGVjdG9yICovCisJX19sZTMyIGJhZF9iZWFjb25zX3Nucl90aHJlc2hvbGRfZGI7Cit9IF9fcGFja2VkOworCisvKiBXTUlfTElOS19NQUlOVEFJTl9DRkdfV1JJVEVfQ01ESUQgKi8KK3N0cnVjdCB3bWlfbGlua19tYWludGFpbl9jZmdfd3JpdGVfY21kIHsKKwkvKiBlbnVtIHdtaV9saW5rX21haW50YWluX2NmZ190eXBlX2UgLSB0eXBlIG9mIHJlcXVlc3RlZCBkZWZhdWx0CisJICogY29uZmlndXJhdGlvbiB0byBiZSBhcHBsaWVkCisJICovCisJX19sZTMyIGNmZ190eXBlOworCS8qIHJlcXVlc3RlZCBjb25uZWN0aW9uIElEIG9yIFdNSV9MSU5LX01BSU5UQUlOX0NGR19DSURfQlJPQURDQVNUICovCisJX19sZTMyIGNpZDsKKwkvKiBjdXN0b20gY29uZmlndXJhdGlvbiBzZXR0aW5ncyB0byBiZSBhcHBsaWVkIChyZWxldmFudCBvbmx5IGlmCisJICogY2ZnX3R5cGU9PVdNSV9MSU5LX01BSU5UQUlOX0NGR19UWVBFX0NVU1RPTSkKKwkgKi8KKwlzdHJ1Y3Qgd21pX2xpbmtfbWFpbnRhaW5fY2ZnIGxtX2NmZzsKK30gX19wYWNrZWQ7CisKKy8qIFdNSV9MSU5LX01BSU5UQUlOX0NGR19SRUFEX0NNRElEICovCitzdHJ1Y3Qgd21pX2xpbmtfbWFpbnRhaW5fY2ZnX3JlYWRfY21kIHsKKwkvKiBjb25uZWN0aW9uIElEIHdoaWNoIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgYXJlIHJlcXVlc3RlZCAqLworCV9fbGUzMiBjaWQ7Cit9IF9fcGFja2VkOworCisvKiBXTUlfTElOS19NQUlOVEFJTl9DRkdfV1JJVEVfRE9ORV9FVkVOVElEICovCitzdHJ1Y3Qgd21pX2xpbmtfbWFpbnRhaW5fY2ZnX3dyaXRlX2RvbmVfZXZlbnQgeworCS8qIHJlcXVlc3RlZCBjb25uZWN0aW9uIElEICovCisJX19sZTMyIGNpZDsKKwkvKiB3bWlfbGlua19tYWludGFpbl9jZmdfcmVzcG9uc2Vfc3RhdHVzX2UgLSB3cml0ZSBzdGF0dXMgKi8KKwlfX2xlMzIgc3RhdHVzOworfSBfX3BhY2tlZDsKKworLyogXFdNSV9MSU5LX01BSU5UQUlOX0NGR19SRUFEX0RPTkVfRVZFTlQgKi8KK3N0cnVjdCB3bWlfbGlua19tYWludGFpbl9jZmdfcmVhZF9kb25lX2V2ZW50IHsKKwkvKiByZXF1ZXN0ZWQgY29ubmVjdGlvbiBJRCAqLworCV9fbGUzMiBjaWQ7CisJLyogd21pX2xpbmtfbWFpbnRhaW5fY2ZnX3Jlc3BvbnNlX3N0YXR1c19lIC0gcmVhZCBzdGF0dXMgKi8KKwlfX2xlMzIgc3RhdHVzOworCS8qIFJldHJpZXZlZCBjb25maWd1cmF0aW9uIHNldHRpbmdzICovCisJc3RydWN0IHdtaV9saW5rX21haW50YWluX2NmZyBsbV9jZmc7Cit9IF9fcGFja2VkOworCitlbnVtIHdtaV90cmFmZmljX2RlZmVycmFsX3N0YXR1cyB7CisJV01JX1RSQUZGSUNfREVGRVJSQUxfQVBQUk9WRUQJPSAweDAsCisJV01JX1RSQUZGSUNfREVGRVJSQUxfUkVKRUNURUQJPSAweDEsCit9OworCisvKiBXTUlfVFJBRkZJQ19ERUZFUlJBTF9FVkVOVElEICovCitzdHJ1Y3Qgd21pX3RyYWZmaWNfZGVmZXJyYWxfZXZlbnQgeworCS8qIGVudW0gd21pX3RyYWZmaWNfZGVmZXJyYWxfc3RhdHVzX2UgKi8KKwl1OCBzdGF0dXM7Cit9IF9fcGFja2VkOworCitlbnVtIHdtaV90cmFmZmljX3Jlc3VtZV9zdGF0dXMgeworCVdNSV9UUkFGRklDX1JFU1VNRV9TVUNDRVNTCT0gMHgwLAorCVdNSV9UUkFGRklDX1JFU1VNRV9GQUlMRUQJPSAweDEsCit9OworCisvKiBXTUlfVFJBRkZJQ19SRVNVTUVfRVZFTlRJRCAqLworc3RydWN0IHdtaV90cmFmZmljX3Jlc3VtZV9ldmVudCB7CisJLyogZW51bSB3bWlfdHJhZmZpY19yZXN1bWVfc3RhdHVzX2UgKi8KKwl1OCBzdGF0dXM7Cit9IF9fcGFja2VkOworCisvKiBQb3dlciBTYXZlIGNvbW1hbmQgY29tcGxldGlvbiBzdGF0dXMgY29kZXMgKi8KK2VudW0gd21pX3BzX2NmZ19jbWRfc3RhdHVzIHsKKwlXTUlfUFNfQ0ZHX0NNRF9TVEFUVVNfU1VDQ0VTUwk9IDB4MDAsCisJV01JX1BTX0NGR19DTURfU1RBVFVTX0JBRF9QQVJBTQk9IDB4MDEsCisJLyogb3RoZXIgZXJyb3IgKi8KKwlXTUlfUFNfQ0ZHX0NNRF9TVEFUVVNfRVJST1IJPSAweDAyLAorfTsKKworLyogRGV2aWNlIFBvd2VyIFNhdmUgUHJvZmlsZXMgKi8KK2VudW0gd21pX3BzX3Byb2ZpbGVfdHlwZSB7CisJV01JX1BTX1BST0ZJTEVfVFlQRV9ERUZBVUxUCQk9IDB4MDAsCisJV01JX1BTX1BST0ZJTEVfVFlQRV9QU19ESVNBQkxFRAkJPSAweDAxLAorCVdNSV9QU19QUk9GSUxFX1RZUEVfTUFYX1BTCQk9IDB4MDIsCisJV01JX1BTX1BST0ZJTEVfVFlQRV9MT1dfTEFURU5DWV9QUwk9IDB4MDMsCit9OworCisvKiBXTUlfUFNfREVWX1BST0ZJTEVfQ0ZHX0NNRElECisgKgorICogUG93ZXIgc2F2ZSBwcm9maWxlIHRvIGJlIHVzZWQgYnkgdGhlIGRldmljZQorICoKKyAqIFJldHVybmVkIGV2ZW50OgorICogLSBXTUlfUFNfREVWX1BST0ZJTEVfQ0ZHX0VWRU5USUQKKyAqLworc3RydWN0IHdtaV9wc19kZXZfcHJvZmlsZV9jZmdfY21kIHsKKwkvKiB3bWlfcHNfcHJvZmlsZV90eXBlX2UgKi8KKwl1OCBwc19wcm9maWxlOworCXU4IHJlc2VydmVkWzNdOworfSBfX3BhY2tlZDsKKworLyogV01JX1BTX0RFVl9QUk9GSUxFX0NGR19FVkVOVElEICovCitzdHJ1Y3Qgd21pX3BzX2Rldl9wcm9maWxlX2NmZ19ldmVudCB7CisJLyogd21pX3BzX2NmZ19jbWRfc3RhdHVzX2UgKi8KKwlfX2xlMzIgc3RhdHVzOworfSBfX3BhY2tlZDsKKworZW51bSB3bWlfcHNfbGV2ZWwgeworCVdNSV9QU19MRVZFTF9ERUVQX1NMRUVQCQk9IDB4MDAsCisJV01JX1BTX0xFVkVMX1NIQUxMT1dfU0xFRVAJPSAweDAxLAorCS8qIGF3YWtlID0gYWxsIFBTIG1lY2hhbmlzbXMgYXJlIGRpc2FibGVkICovCisJV01JX1BTX0xFVkVMX0FXQUtFCQk9IDB4MDIsCit9OworCitlbnVtIHdtaV9wc19kZWVwX3NsZWVwX2Nsa19sZXZlbCB7CisJLyogMzNrICovCisJV01JX1BTX0RFRVBfU0xFRVBfQ0xLX0xFVkVMX1JUQwkJPSAweDAwLAorCS8qIDEwayAqLworCVdNSV9QU19ERUVQX1NMRUVQX0NMS19MRVZFTF9PU0MJCT0gMHgwMSwKKwkvKiBAUlRDIExvdyBsYXRlbmN5ICovCisJV01JX1BTX0RFRVBfU0xFRVBfQ0xLX0xFVkVMX1JUQ19MVAk9IDB4MDIsCisJV01JX1BTX0RFRVBfU0xFRVBfQ0xLX0xFVkVMX1hUQUwJPSAweDAzLAorCVdNSV9QU19ERUVQX1NMRUVQX0NMS19MRVZFTF9TWVNDTEsJPSAweDA0LAorCS8qIE5vdCBBcHBsaWNhYmxlICovCisJV01JX1BTX0RFRVBfU0xFRVBfQ0xLX0xFVkVMX05fQQkJPSAweEZGLAorfTsKKworLyogUmVzcG9uc2UgYnkgdGhlIEZXIHRvIGEgRDMgZW50cnkgcmVxdWVzdCAqLworZW51bSB3bWlfcHNfZDNfcmVzcF9wb2xpY3kgeworCVdNSV9QU19EM19SRVNQX1BPTElDWV9ERUZBVUxUCT0gMHgwMCwKKwkvKiBkZWJ1ZyAtRDMgcmVxIGlzIGFsd2F5cyBkZW5pZWQgKi8KKwlXTUlfUFNfRDNfUkVTUF9QT0xJQ1lfREVOSUVECT0gMHgwMSwKKwkvKiBkZWJ1ZyAtRDMgcmVxIGlzIGFsd2F5cyBhcHByb3ZlZCAqLworCVdNSV9QU19EM19SRVNQX1BPTElDWV9BUFBST1ZFRAk9IDB4MDIsCit9OworCisvKiBEZXZpY2UgY29tbW9uIHBvd2VyIHNhdmUgY29uZmlndXJhdGlvbnMgKi8KK3N0cnVjdCB3bWlfcHNfZGV2X2NmZyB7CisJLyogbG93ZXN0IGxldmVsIG9mIFBTIGFsbG93ZWQgd2hpbGUgdW5hc3NvY2lhdGVkLCBlbnVtIHdtaV9wc19sZXZlbF9lCisJICovCisJdTggcHNfdW5hc3NvY19taW5fbGV2ZWw7CisJLyogbG93ZXN0IGRlZXAgc2xlZXAgY2xvY2sgbGV2ZWwgd2hpbGUgbm9uYXNzb2MsIGVudW0KKwkgKiB3bWlfcHNfZGVlcF9zbGVlcF9jbGtfbGV2ZWxfZQorCSAqLworCXU4IHBzX3VuYXNzb2NfZGVlcF9zbGVlcF9taW5fbGV2ZWw7CisJLyogbG93ZXN0IGxldmVsIG9mIFBTIGFsbG93ZWQgd2hpbGUgYXNzb2NpYXRlZCwgZW51bSB3bWlfcHNfbGV2ZWxfZSAqLworCXU4IHBzX2Fzc29jX21pbl9sZXZlbDsKKwkvKiBsb3dlc3QgZGVlcCBzbGVlcCBjbG9jayBsZXZlbCB3aGlsZSBhc3NvYywgZW51bQorCSAqIHdtaV9wc19kZWVwX3NsZWVwX2Nsa19sZXZlbF9lCisJICovCisJdTggcHNfYXNzb2NfZGVlcF9zbGVlcF9taW5fbGV2ZWw7CisJLyogZW51bSB3bWlfcHNfZGVlcF9zbGVlcF9jbGtfbGV2ZWxfZSAqLworCXU4IHBzX2Fzc29jX2xvd19sYXRlbmN5X2RzX21pbl9sZXZlbDsKKwkvKiBlbnVtIHdtaV9wc19kM19yZXNwX3BvbGljeV9lICovCisJdTggcHNfRDNfcmVzcG9uc2VfcG9saWN5OworCS8qIEJPT0wgKi8KKwl1OCBwc19EM19wbV9wbWVfZW5hYmxlZDsKKwkvKiBCT09MICovCisJdTggcHNfaGFscF9lbmFibGU7CisJdTggcHNfZGVlcF9zbGVlcF9lbnRlcl90aHJlc2hfbXNlYzsKKwkvKiBCT09MICovCisJdTggcHNfdm9sdGFnZV9zY2FsaW5nX2VuOworfSBfX3BhY2tlZDsKKworLyogV01JX1BTX0RFVl9DRkdfQ01ESUQKKyAqCisgKiBDb25maWd1cmUgY29tbW9uIFBvd2VyIFNhdmUgcGFyYW1ldGVycyBvZiB0aGUgZGV2aWNlIGFuZCBhbGwgTUlEcy4KKyAqCisgKiBSZXR1cm5lZCBldmVudDoKKyAqIC0gV01JX1BTX0RFVl9DRkdfRVZFTlRJRAorICovCitzdHJ1Y3Qgd21pX3BzX2Rldl9jZmdfY21kIHsKKwkvKiBEZXZpY2UgUG93ZXIgU2F2ZSBjb25maWd1cmF0aW9uIHRvIGJlIGFwcGxpZWQgKi8KKwlzdHJ1Y3Qgd21pX3BzX2Rldl9jZmcgcHNfZGV2X2NmZzsKKwkvKiBhbGlnbm1lbnQgdG8gMzJiICovCisJdTggcmVzZXJ2ZWRbMl07Cit9IF9fcGFja2VkOworCisvKiBXTUlfUFNfREVWX0NGR19FVkVOVElEICovCitzdHJ1Y3Qgd21pX3BzX2Rldl9jZmdfZXZlbnQgeworCS8qIHdtaV9wc19jZmdfY21kX3N0YXR1c19lICovCisJX19sZTMyIHN0YXR1czsKK30gX19wYWNrZWQ7CisKKy8qIFdNSV9QU19ERVZfQ0ZHX1JFQURfQ01ESUQKKyAqCisgKiByZXF1ZXN0IHRvIHJldHJpZXZlICBkZXZpY2UgUG93ZXIgU2F2ZSBjb25maWd1cmF0aW9uCisgKiAoV01JX1BTX0RFVl9DRkdfQ01EIHBhcmFtcykKKyAqCisgKiBSZXR1cm5lZCBldmVudDoKKyAqIC0gV01JX1BTX0RFVl9DRkdfUkVBRF9FVkVOVElECisgKi8KK3N0cnVjdCB3bWlfcHNfZGV2X2NmZ19yZWFkX2NtZCB7CisJX19sZTMyIHJlc2VydmVkOworfSBfX3BhY2tlZDsKKworLyogV01JX1BTX0RFVl9DRkdfUkVBRF9FVkVOVElEICovCitzdHJ1Y3Qgd21pX3BzX2Rldl9jZmdfcmVhZF9ldmVudCB7CisJLyogd21pX3BzX2NmZ19jbWRfc3RhdHVzX2UgKi8KKwlfX2xlMzIgc3RhdHVzOworCS8qIFJldHJpZXZlZCBkZXZpY2UgUG93ZXIgU2F2ZSBjb25maWd1cmF0aW9uIChXTUlfUFNfREVWX0NGR19DTUQKKwkgKiBwYXJhbXMpCisJICovCisJc3RydWN0IHdtaV9wc19kZXZfY2ZnIGRldl9wc19jZmc7CisJLyogYWxpZ25tZW50IHRvIDMyYiAqLworCXU4IHJlc2VydmVkWzJdOworfSBfX3BhY2tlZDsKKworLyogUGVyIE1hYyBQb3dlciBTYXZlIGNvbmZpZ3VyYXRpb25zICovCitzdHJ1Y3Qgd21pX3BzX21pZF9jZmcgeworCS8qIExvdyBwb3dlciBSWCBpbiBCVEkgaXMgZW5hYmxlZCwgQk9PTCAqLworCXU4IGJlYWNvbl9scHJ4X2VuYWJsZTsKKwkvKiBTeW5jIHRvIHNlY3RvciBJRCBlbmFibGVkLCBCT09MICovCisJdTggYmVhY29uX3N5bmNfdG9fc2VjdG9ySWRfZW5hYmxlOworCS8qIExvdyBwb3dlciBSWCBpbiBEVEkgaXMgZW5hYmxlZCwgQk9PTCAqLworCXU4IGZyYW1lX2V4Y2hhbmdlX2xwcnhfZW5hYmxlOworCS8qIFNsZWVwIEN5Y2xlIHdoaWxlIGluIHNjaGVkdWxlZCBQUywgMS0zMSAqLworCXU4IHNjaGVkdWxlZF9zbGVlcF9jeWNsZV9wb3cyOworCS8qIFN0YXkgQXdha2UgZm9yIGsgQklzIGV2ZXJ5IChzbGVlcF9jeWNsZSAtIGspIEJJcywgMS0zMSAqLworCXU4IHNjaGVkdWxlZF9udW1fb2ZfYXdha2VfYmlzOworCXU4IGFtX3RvX3RyYWZmaWNfbG9hZF90aHJlc2hfbWJwOworCXU4IHRyYWZmaWNfdG9fYW1fbG9hZF90aHJlc2hfbWJwczsKKwl1OCB0cmFmZmljX3RvX2FtX251bV9vZl9ub190cmFmZmljX2JpczsKKwkvKiBCT09MICovCisJdTggY29udGludW91c190cmFmZmljX3BzbTsKKwlfX2xlMTYgbm9fdHJhZmZpY190b19taW5fdXNlYzsKKwlfX2xlMTYgbm9fdHJhZmZpY190b19tYXhfdXNlYzsKKwlfX2xlMTYgc25vb3ppbmdfc2xlZXBfaW50ZXJ2YWxfbWlsaXNlYzsKKwl1OCBtYXhfbm9fZGF0YV9hd2FrZV9ldmVudHM7CisJLyogVHJpZ2dlciBXRUIgYWZ0ZXIgayBmYWlsZWQgYmVhY29ucyAqLworCXU4IG51bV9vZl9mYWlsZWRfYmVhY29uc19yeF90b190cmlnZ2VyX3dlYjsKKwkvKiBUcmlnZ2VyIEJGIGFmdGVyIGsgZmFpbGVkIGJlYWNvbnMgKi8KKwl1OCBudW1fb2ZfZmFpbGVkX2JlYWNvbnNfcnhfdG9fdHJpZ2dlcl9iZjsKKwkvKiBUcmlnZ2VyIFNPQiBhZnRlciBrIHN1Y2Nlc3NmdWwgYmVhY29ucyAqLworCXU4IG51bV9vZl9zdWNjZXNzZnVsX2JlYWNvbnNfcnhfdG9fdHJpZ2dlcl9zb2I7Cit9IF9fcGFja2VkOworCisvKiBXTUlfUFNfTUlEX0NGR19DTURJRAorICoKKyAqIENvbmZpZ3VyZSBQb3dlciBTYXZlIHBhcmFtZXRlcnMgb2YgYSBzcGVjaWZpYyBNSUQuCisgKiBUaGVzZSBwYXJhbWV0ZXJzIGFyZSByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIEJTUyB0aGlzIE1JRCBiZWxvbmdzIHRvLgorICoKKyAqIFJldHVybmVkIGV2ZW50OgorICogLSBXTUlfUFNfTUlEX0NGR19FVkVOVElECisgKi8KK3N0cnVjdCB3bWlfcHNfbWlkX2NmZ19jbWQgeworCS8qIE1BQyBJRCAqLworCXU4IG1pZDsKKwkvKiBtaWQgUFMgY29uZmlndXJhdGlvbiB0byBiZSBhcHBsaWVkICovCisJc3RydWN0IHdtaV9wc19taWRfY2ZnIHBzX21pZF9jZmc7Cit9IF9fcGFja2VkOworCisvKiBXTUlfUFNfTUlEX0NGR19FVkVOVElEICovCitzdHJ1Y3Qgd21pX3BzX21pZF9jZmdfZXZlbnQgeworCS8qIE1BQyBJRCAqLworCXU4IG1pZDsKKwkvKiBhbGlnbm1lbnQgdG8gMzJiICovCisJdTggcmVzZXJ2ZWRbM107CisJLyogd21pX3BzX2NmZ19jbWRfc3RhdHVzX2UgKi8KKwlfX2xlMzIgc3RhdHVzOworfSBfX3BhY2tlZDsKKworLyogV01JX1BTX01JRF9DRkdfUkVBRF9DTURJRAorICoKKyAqIHJlcXVlc3QgdG8gcmV0cmlldmUgUG93ZXIgU2F2ZSBjb25maWd1cmF0aW9uIG9mIG1pZAorICogKFdNSV9QU19NSURfQ0ZHX0NNRCBwYXJhbXMpCisgKgorICogUmV0dXJuZWQgZXZlbnQ6CisgKiAtIFdNSV9QU19NSURfQ0ZHX1JFQURfRVZFTlRJRAorICovCitzdHJ1Y3Qgd21pX3BzX21pZF9jZmdfcmVhZF9jbWQgeworCS8qIE1BQyBJRCAqLworCXU4IG1pZDsKKwkvKiBhbGlnbm1lbnQgdG8gMzJiICovCisJdTggcmVzZXJ2ZWRbM107Cit9IF9fcGFja2VkOworCisvKiBXTUlfUFNfTUlEX0NGR19SRUFEX0VWRU5USUQgKi8KK3N0cnVjdCB3bWlfcHNfbWlkX2NmZ19yZWFkX2V2ZW50IHsKKwkvKiBNQUMgSUQgKi8KKwl1OCBtaWQ7CisJLyogUmV0cmlldmVkIE1JRCBQb3dlciBTYXZlIGNvbmZpZ3VyYXRpb24oV01JX1BTX01JRF9DRkdfQ01EIHBhcmFtcykgKi8KKwlzdHJ1Y3Qgd21pX3BzX21pZF9jZmcgbWlkX3BzX2NmZzsKKwkvKiB3bWlfcHNfY2ZnX2NtZF9zdGF0dXNfZSAqLworCV9fbGUzMiBzdGF0dXM7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIFdNSV9BT0FfTUFYX0RBVEFfU0laRQkoMTI4KQorCitlbnVtIHdtaV9hb2FfbWVhc19zdGF0dXMgeworCVdNSV9BT0FfTUVBU19TVUNDRVNTCQk9IDB4MDAsCisJV01JX0FPQV9NRUFTX1BFRVJfSU5DQVBBQkxFCT0gMHgwMSwKKwlXTUlfQU9BX01FQVNfRkFJTFVSRQkJPSAweDAyLAorfTsKKworLyogV01JX0FPQV9NRUFTX0VWRU5USUQgKi8KK3N0cnVjdCB3bWlfYW9hX21lYXNfZXZlbnQgeworCXU4IG1hY19hZGRyW1dNSV9NQUNfTEVOXTsKKwkvKiBjaGFubmVscyBJRHM6CisJICogMCAtIDU4MzIwIE1IegorCSAqIDEgLSA2MDQ4MCBNSHoKKwkgKiAyIC0gNjI2NDAgTUh6CisJICovCisJdTggY2hhbm5lbDsKKwkvKiBlbnVtIHdtaV9hb2FfbWVhc190eXBlICovCisJdTggYW9hX21lYXNfdHlwZTsKKwkvKiBNZWFzdXJtZW50cyBhcmUgZnJvbSBSRnMsIGRlZmluZWQgYnkgdGhlIG1hc2sgKi8KKwlfX2xlMzIgbWVhc19yZl9tYXNrOworCS8qIGVudW0gd21pX2FvYV9tZWFzX3N0YXR1cyAqLworCXU4IG1lYXNfc3RhdHVzOworCXU4IHJlc2VydmVkOworCS8qIExlbmd0aCBvZiBtZWFzX2RhdGEgaW4gYnl0ZXMgKi8KKwlfX2xlMTYgbGVuZ3RoOworCXU4IG1lYXNfZGF0YVtXTUlfQU9BX01BWF9EQVRBX1NJWkVdOworfSBfX3BhY2tlZDsKKworLyogV01JX1RPRl9HRVRfQ0FQQUJJTElUSUVTX0VWRU5USUQgKi8KK3N0cnVjdCB3bWlfdG9mX2dldF9jYXBhYmlsaXRpZXNfZXZlbnQgeworCXU4IGZ0bV9jYXBhYmlsaXR5OworCS8qIG1heGltdW0gc3VwcG9ydGVkIG51bWJlciBvZiBkZXN0aW5hdGlvbiB0byBzdGFydCBUT0YgKi8KKwl1OCBtYXhfbnVtX29mX2Rlc3Q7CisJLyogbWF4aW11bSBzdXBwb3J0ZWQgbnVtYmVyIG9mIG1lYXN1cmVtZW50cyBwZXIgYnVyc3QgKi8KKwl1OCBtYXhfbnVtX29mX21lYXNfcGVyX2J1cnN0OworCXU4IHJlc2VydmVkOworCS8qIG1heGltdW0gc3VwcG9ydGVkIG11bHRpIGJ1cnN0cyAqLworCV9fbGUxNiBtYXhfbXVsdGlfYnVyc3RzX3Nlc3Npb25zOworCS8qIG1heGltdW0gc3VwcG9ydGVkIEZUTSBidXJzdCBkdXJhdGlvbiAsIHdtaV90b2ZfYnVyc3RfZHVyYXRpb25fZSAqLworCV9fbGUxNiBtYXhfZnRtX2J1cnN0X2R1cmF0aW9uOworCS8qIEFPQSBzdXBwb3J0ZWQgdHlwZXMgKi8KKwlfX2xlMzIgYW9hX3N1cHBvcnRlZF90eXBlczsKK30gX19wYWNrZWQ7CisKK2VudW0gd21pX3RvZl9zZXNzaW9uX2VuZF9zdGF0dXMgeworCVdNSV9UT0ZfU0VTU0lPTl9FTkRfTk9fRVJST1IJCT0gMHgwMCwKKwlXTUlfVE9GX1NFU1NJT05fRU5EX0ZBSUwJCT0gMHgwMSwKKwlXTUlfVE9GX1NFU1NJT05fRU5EX1BBUkFNU19FUlJPUgk9IDB4MDIsCisJV01JX1RPRl9TRVNTSU9OX0VORF9BQk9SVEVECQk9IDB4MDMsCit9OworCisvKiBXTUlfVE9GX1NFU1NJT05fRU5EX0VWRU5USUQgKi8KK3N0cnVjdCB3bWlfdG9mX3Nlc3Npb25fZW5kX2V2ZW50IHsKKwkvKiBGVE0gc2Vzc2lvbiBJRCAqLworCV9fbGUzMiBzZXNzaW9uX2lkOworCS8qIHdtaV90b2Zfc2Vzc2lvbl9lbmRfc3RhdHVzX2UgKi8KKwl1OCBzdGF0dXM7CisJdTggcmVzZXJ2ZWRbM107Cit9IF9fcGFja2VkOworCisvKiBSZXNwb25kZXIgRlRNIFJlc3VsdHMgKi8KK3N0cnVjdCB3bWlfcmVzcG9uZGVyX2Z0bV9yZXMgeworCXU4IHQxWzZdOworCXU4IHQyWzZdOworCXU4IHQzWzZdOworCXU4IHQ0WzZdOworCV9fbGUxNiB0b2RfZXJyOworCV9fbGUxNiB0b2FfZXJyOworCV9fbGUxNiB0b2RfZXJyX2luaXRpYXRvcjsKKwlfX2xlMTYgdG9hX2Vycl9pbml0aWF0b3I7Cit9IF9fcGFja2VkOworCitlbnVtIHdtaV90b2ZfZnRtX3Blcl9kZXN0X3Jlc19zdGF0dXMgeworCVdNSV9QRVJfREVTVF9SRVNfTk9fRVJST1IJCT0gMHgwMCwKKwlXTUlfUEVSX0RFU1RfUkVTX1RYX1JYX0ZBSUwJCT0gMHgwMSwKKwlXTUlfUEVSX0RFU1RfUkVTX1BBUkFNX0RPTlRfTUFUQ0gJPSAweDAyLAorfTsKKworZW51bSB3bWlfdG9mX2Z0bV9wZXJfZGVzdF9yZXNfZmxhZ3MgeworCVdNSV9QRVJfREVTVF9SRVNfUkVRX1NUQVJUCQk9IDB4MDEsCisJV01JX1BFUl9ERVNUX1JFU19CVVJTVF9SRVBPUlRfRU5ECT0gMHgwMiwKKwlXTUlfUEVSX0RFU1RfUkVTX1JFUV9FTkQJCT0gMHgwNCwKKwlXTUlfUEVSX0RFU1RfUkVTX1BBUkFNX1VQREFURQkJPSAweDA4LAorfTsKKworLyogV01JX1RPRl9GVE1fUEVSX0RFU1RfUkVTX0VWRU5USUQgKi8KK3N0cnVjdCB3bWlfdG9mX2Z0bV9wZXJfZGVzdF9yZXNfZXZlbnQgeworCS8qIEZUTSBzZXNzaW9uIElEICovCisJX19sZTMyIHNlc3Npb25faWQ7CisJLyogZGVzdGluYXRpb24gTUFDIGFkZHJlc3MgKi8KKwl1OCBkc3RfbWFjW1dNSV9NQUNfTEVOXTsKKwkvKiB3bWlfdG9mX2Z0bV9wZXJfZGVzdF9yZXNfZmxhZ3NfZSAqLworCXU4IGZsYWdzOworCS8qIHdtaV90b2ZfZnRtX3Blcl9kZXN0X3Jlc19zdGF0dXNfZSAqLworCXU4IHN0YXR1czsKKwkvKiByZXNwb25kZXIgQVNBUCAqLworCXU4IHJlc3BvbmRlcl9hc2FwOworCS8qIHJlc3BvbmRlciBudW1iZXIgb2YgRlRNIHBlciBidXJzdCAqLworCXU4IHJlc3BvbmRlcl9udW1fZnRtX3Blcl9idXJzdDsKKwkvKiByZXNwb25kZXIgbnVtYmVyIG9mIEZUTSBidXJzdCBleHBvbmVudCAqLworCXU4IHJlc3BvbmRlcl9udW1fZnRtX2J1cnN0c19leHA7CisJLyogcmVzcG9uZGVyIGJ1cnN0IGR1cmF0aW9uICx3bWlfdG9mX2J1cnN0X2R1cmF0aW9uX2UgKi8KKwl1OCByZXNwb25kZXJfYnVyc3RfZHVyYXRpb247CisJLyogcmVzcG9uZGVyIGJ1cnN0IHBlcmlvZCwgaW5kaWNhdGUgaW50ZXJ2YWwgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUKKwkgKiBidXJzdCBpbnN0YW5jZXMsIGluIHVuaXRzIG9mIDEwMCBtcworCSAqLworCV9fbGUxNiByZXNwb25kZXJfYnVyc3RfcGVyaW9kOworCS8qIHJlY2VpdmUgYnVyc3QgY291bnRlciAqLworCV9fbGUxNiBidXJzdHNfY250OworCS8qIHRzZiBvZiByZXNwb25kZXIgc3RhcnQgYnVyc3QgKi8KKwlfX2xlMzIgdHNmX3N5bmM7CisJLyogYWN0dWFsIHJlY2VpdmVkIGZ0bSBwZXIgYnVyc3QgKi8KKwl1OCBhY3R1YWxfZnRtX3Blcl9idXJzdDsKKwl1OCByZXNlcnZlZDBbN107CisJc3RydWN0IHdtaV9yZXNwb25kZXJfZnRtX3JlcyByZXNwb25kZXJfZnRtX3Jlc1swXTsKK30gX19wYWNrZWQ7CisKK2VudW0gd21pX3RvZl9jaGFubmVsX2luZm9fdHlwZSB7CisJV01JX1RPRl9DSEFOTkVMX0lORk9fQU9BCQk9IDB4MDAsCisJV01JX1RPRl9DSEFOTkVMX0lORk9fTENJCQk9IDB4MDEsCisJV01JX1RPRl9DSEFOTkVMX0lORk9fTENSCQk9IDB4MDIsCisJV01JX1RPRl9DSEFOTkVMX0lORk9fVkVORE9SX1NQRUNJRklDCT0gMHgwMywKKwlXTUlfVE9GX0NIQU5ORUxfSU5GT19DSVIJCT0gMHgwNCwKKwlXTUlfVE9GX0NIQU5ORUxfSU5GT19SU1NJCQk9IDB4MDUsCisJV01JX1RPRl9DSEFOTkVMX0lORk9fU05SCQk9IDB4MDYsCisJV01JX1RPRl9DSEFOTkVMX0lORk9fREVCVUcJCT0gMHgwNywKK307CisKKy8qIFdNSV9UT0ZfQ0hBTk5FTF9JTkZPX0VWRU5USUQgKi8KK3N0cnVjdCB3bWlfdG9mX2NoYW5uZWxfaW5mb19ldmVudCB7CisJLyogRlRNIHNlc3Npb24gSUQgKi8KKwlfX2xlMzIgc2Vzc2lvbl9pZDsKKwkvKiBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyAqLworCXU4IGRzdF9tYWNbV01JX01BQ19MRU5dOworCS8qIHdtaV90b2ZfY2hhbm5lbF9pbmZvX3R5cGVfZSAqLworCXU4IHR5cGU7CisJLyogZGF0YSByZXBvcnQgbGVuZ3RoICovCisJdTggbGVuOworCS8qIGRhdGEgcmVwb3J0IHBheWxvYWQgKi8KKwl1OCByZXBvcnRbMF07Cit9IF9fcGFja2VkOworCiAjZW5kaWYgLyogX19XSUxPQ0lUWV9XTUlfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9iNDMvZGVidWdmcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYjQzL2RlYnVnZnMuYwppbmRleCBiNGJjZDk0Li43NzA0NjM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9iNDMvZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2I0My9kZWJ1Z2ZzLmMKQEAgLTUyNCw3ICs1MjQsOCBAQAogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCi0JZGZvcHMgPSBjb250YWluZXJfb2YoZmlsZS0+Zl9vcCwgc3RydWN0IGI0M19kZWJ1Z2ZzX2ZvcHMsIGZvcHMpOworCWRmb3BzID0gY29udGFpbmVyX29mKGRlYnVnZnNfcmVhbF9mb3BzKGZpbGUpLAorCQkJICAgICBzdHJ1Y3QgYjQzX2RlYnVnZnNfZm9wcywgZm9wcyk7CiAJaWYgKCFkZm9wcy0+cmVhZCkgewogCQllcnIgPSAtRU5PU1lTOwogCQlnb3RvIG91dF91bmxvY2s7CkBAIC01ODUsNyArNTg2LDggQEAKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIAotCWRmb3BzID0gY29udGFpbmVyX29mKGZpbGUtPmZfb3AsIHN0cnVjdCBiNDNfZGVidWdmc19mb3BzLCBmb3BzKTsKKwlkZm9wcyA9IGNvbnRhaW5lcl9vZihkZWJ1Z2ZzX3JlYWxfZm9wcyhmaWxlKSwKKwkJCSAgICAgc3RydWN0IGI0M19kZWJ1Z2ZzX2ZvcHMsIGZvcHMpOwogCWlmICghZGZvcHMtPndyaXRlKSB7CiAJCWVyciA9IC1FTk9TWVM7CiAJCWdvdG8gb3V0X3VubG9jazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2I0M2xlZ2FjeS9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9iNDNsZWdhY3kvZGVidWdmcy5jCmluZGV4IDA5MDkxMGUuLjgyZWY1NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2I0M2xlZ2FjeS9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYjQzbGVnYWN5L2RlYnVnZnMuYwpAQCAtMjIxLDcgKzIyMSw4IEBACiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKLQlkZm9wcyA9IGNvbnRhaW5lcl9vZihmaWxlLT5mX29wLCBzdHJ1Y3QgYjQzbGVnYWN5X2RlYnVnZnNfZm9wcywgZm9wcyk7CisJZGZvcHMgPSBjb250YWluZXJfb2YoZGVidWdmc19yZWFsX2ZvcHMoZmlsZSksCisJCQkgICAgIHN0cnVjdCBiNDNsZWdhY3lfZGVidWdmc19mb3BzLCBmb3BzKTsKIAlpZiAoIWRmb3BzLT5yZWFkKSB7CiAJCWVyciA9IC1FTk9TWVM7CiAJCWdvdG8gb3V0X3VubG9jazsKQEAgLTI4Nyw3ICsyODgsOCBAQAogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCi0JZGZvcHMgPSBjb250YWluZXJfb2YoZmlsZS0+Zl9vcCwgc3RydWN0IGI0M2xlZ2FjeV9kZWJ1Z2ZzX2ZvcHMsIGZvcHMpOworCWRmb3BzID0gY29udGFpbmVyX29mKGRlYnVnZnNfcmVhbF9mb3BzKGZpbGUpLAorCQkJICAgICBzdHJ1Y3QgYjQzbGVnYWN5X2RlYnVnZnNfZm9wcywgZm9wcyk7CiAJaWYgKCFkZm9wcy0+d3JpdGUpIHsKIAkJZXJyID0gLUVOT1NZUzsKIAkJZ290byBvdXRfdW5sb2NrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2JjZGMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9iY2RjLmMKaW5kZXggZDFiYzUxZi4uMDM4YTk2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2JjZGMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvYmNkYy5jCkBAIC0xOTQsNyArMTk0LDcgQEAKIAl9CiAKIAkvKiBDaGVjayBpbmZvIGJ1ZmZlciAqLwotCWluZm8gPSAodm9pZCAqKSZtc2dbMV07CisJaW5mbyA9ICh2b2lkICopJmJjZGMtPmJ1ZlswXTsKIAogCS8qIENvcHkgaW5mbyBidWZmZXIgKi8KIAlpZiAoYnVmKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoLmMKaW5kZXggZjU0OWMyNS4uNzIxMzliNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGguYwpAQCAtNDIwLDcgKzQyMCw3IEBACiAKIHUzMiBicmNtZl9zZGlvZF9yZWdybChzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsIHUzMiBhZGRyLCBpbnQgKnJldCkKIHsKLQl1MzIgZGF0YTsKKwl1MzIgZGF0YSA9IDA7CiAJaW50IHJldHZhbDsKIAogCWJyY21mX2RiZyhTRElPLCAiYWRkcjoweCUwOHhcbiIsIGFkZHIpOwpAQCAtMTEwMSw2ICsxMTAxLDcgQEAKIAlCUkNNRl9TRElPX0RFVklDRShTRElPX0RFVklDRV9JRF9CUk9BRENPTV80MzM0MSksCiAJQlJDTUZfU0RJT19ERVZJQ0UoU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDMzNjIpLAogCUJSQ01GX1NESU9fREVWSUNFKFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzMzVfNDMzOSksCisJQlJDTUZfU0RJT19ERVZJQ0UoU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDMzOSksCiAJQlJDTUZfU0RJT19ERVZJQ0UoU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDM0MzApLAogCUJSQ01GX1NESU9fREVWSUNFKFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzNDUpLAogCUJSQ01GX1NESU9fREVWSUNFKFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzNTQpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2NmZzgwMjExLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvY2ZnODAyMTEuYwppbmRleCAyNjI4ZDVlLi5iNzc3ZTFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvY2ZnODAyMTEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvY2ZnODAyMTEuYwpAQCAtMTU5NSwxNSArMTU5NSw5IEBACiAJCXZhbCA9IDE7CiAJCWJyY21mX2RiZyhDT05OLCAic2hhcmVkIGtleVxuIik7CiAJCWJyZWFrOwotCWNhc2UgTkw4MDIxMV9BVVRIVFlQRV9BVVRPTUFUSUM6Ci0JCXZhbCA9IDI7Ci0JCWJyY21mX2RiZyhDT05OLCAiYXV0b21hdGljXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBOTDgwMjExX0FVVEhUWVBFX05FVFdPUktfRUFQOgotCQlicmNtZl9kYmcoQ09OTiwgIm5ldHdvcmsgZWFwXG4iKTsKIAlkZWZhdWx0OgogCQl2YWwgPSAyOwotCQlicmNtZl9lcnIoImludmFsaWQgYXV0aCB0eXBlICglZClcbiIsIHNtZS0+YXV0aF90eXBlKTsKKwkJYnJjbWZfZGJnKENPTk4sICJhdXRvbWF0aWMsIGF1dGggdHlwZSAoJWQpXG4iLCBzbWUtPmF1dGhfdHlwZSk7CiAJCWJyZWFrOwogCX0KIApAQCAtMjUzMyw3ICsyNTI3LDcgQEAKIAkJCQkgICAgIFdMX0JTU19JTkZPX01BWCk7CiAJaWYgKGVycikgewogCQlicmNtZl9lcnIoIkZhaWxlZCB0byBnZXQgYnNzIGluZm8gKCVkKVxuIiwgZXJyKTsKLQkJcmV0dXJuOworCQlnb3RvIG91dF9rZnJlZTsKIAl9CiAJc2ktPmZpbGxlZCB8PSBCSVQoTkw4MDIxMV9TVEFfSU5GT19CU1NfUEFSQU0pOwogCXNpLT5ic3NfcGFyYW0uYmVhY29uX2ludGVydmFsID0gbGUxNl90b19jcHUoYnVmLT5ic3NfbGUuYmVhY29uX3BlcmlvZCk7CkBAIC0yNTQ1LDYgKzI1MzksOSBAQAogCQlzaS0+YnNzX3BhcmFtLmZsYWdzIHw9IEJTU19QQVJBTV9GTEFHU19TSE9SVF9QUkVBTUJMRTsKIAlpZiAoY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UX1RJTUUpCiAJCXNpLT5ic3NfcGFyYW0uZmxhZ3MgfD0gQlNTX1BBUkFNX0ZMQUdTX1NIT1JUX1NMT1RfVElNRTsKKworb3V0X2tmcmVlOgorCWtmcmVlKGJ1Zik7CiB9CiAKIHN0YXRpYyBzMzIKQEAgLTM3MDMsNiArMzcwMCw3IEBACiAJCQkJIHN0cnVjdCBjZmc4MDIxMV93b3dsYW4gKndvd2wpCiB7CiAJdTMyIHdvd2xfY29uZmlnOworCXN0cnVjdCBicmNtZl93b3dsX3dha2VpbmRfbGUgd293bF93YWtlaW5kOwogCXUzMiBpOwogCiAJYnJjbWZfZGJnKFRSQUNFLCAiU3VzcGVuZCwgd293bCBjb25maWcuXG4iKTsKQEAgLTM3NDQsOCArMzc0Miw5IEBACiAJaWYgKCF0ZXN0X2JpdChCUkNNRl9WSUZfU1RBVFVTX0NPTk5FQ1RFRCwgJmlmcC0+dmlmLT5zbWVfc3RhdGUpKQogCQl3b3dsX2NvbmZpZyB8PSBCUkNNRl9XT1dMX1VOQVNTT0M7CiAKLQlicmNtZl9maWxfaW92YXJfZGF0YV9zZXQoaWZwLCAid293bF93YWtlaW5kIiwgImNsZWFyIiwKLQkJCQkgc2l6ZW9mKHN0cnVjdCBicmNtZl93b3dsX3dha2VpbmRfbGUpKTsKKwltZW1jcHkoJndvd2xfd2FrZWluZCwgImNsZWFyIiwgNik7CisJYnJjbWZfZmlsX2lvdmFyX2RhdGFfc2V0KGlmcCwgIndvd2xfd2FrZWluZCIsICZ3b3dsX3dha2VpbmQsCisJCQkJIHNpemVvZih3b3dsX3dha2VpbmQpKTsKIAlicmNtZl9maWxfaW92YXJfaW50X3NldChpZnAsICJ3b3dsIiwgd293bF9jb25maWcpOwogCWJyY21mX2ZpbF9pb3Zhcl9pbnRfc2V0KGlmcCwgIndvd2xfYWN0aXZhdGUiLCAxKTsKIAlicmNtZl9idXNfd293bF9jb25maWcoY2ZnLT5wdWItPmJ1c19pZiwgdHJ1ZSk7CkBAIC0zODg0LDExICszODgzLDExIEBACiAJaWYgKCFjaGVja192aWZfdXAoaWZwLT52aWYpKQogCQlyZXR1cm4gLUVJTzsKIAotCWJyY21mX2RiZyhDT05OLCAiZGVsX3Bta3NhIC0gUE1LIGJzc2lkID0gJXBNXG4iLCAmcG1rc2EtPmJzc2lkKTsKKwlicmNtZl9kYmcoQ09OTiwgImRlbF9wbWtzYSAtIFBNSyBic3NpZCA9ICVwTVxuIiwgcG1rc2EtPmJzc2lkKTsKIAogCW5wbWsgPSBsZTMyX3RvX2NwdShjZmctPnBta19saXN0Lm5wbWspOwogCWZvciAoaSA9IDA7IGkgPCBucG1rOyBpKyspCi0JCWlmICghbWVtY21wKCZwbWtzYS0+YnNzaWQsICZwbWtbaV0uYnNzaWQsIEVUSF9BTEVOKSkKKwkJaWYgKCFtZW1jbXAocG1rc2EtPmJzc2lkLCBwbWtbaV0uYnNzaWQsIEVUSF9BTEVOKSkKIAkJCWJyZWFrOwogCiAJaWYgKChucG1rID4gMCkgJiYgKGkgPCBucG1rKSkgewpAQCAtNDUwMiw2ICs0NTAxLDcgQEAKIAl1MTYgY2hhbnNwZWMgPSBjaGFuZGVmX3RvX2NoYW5zcGVjKCZjZmctPmQxMWluZiwgJnNldHRpbmdzLT5jaGFuZGVmKTsKIAlib29sIG1ic3M7CiAJaW50IGlzXzExZDsKKwlib29sIHN1cHBvcnRzXzExZDsKIAogCWJyY21mX2RiZyhUUkFDRSwgImN0cmxjaG49JWQsIGNlbnRlcj0lZCwgYnc9JWQsIGJlYWNvbl9pbnRlcnZhbD0lZCwgZHRpbV9wZXJpb2Q9JWQsXG4iLAogCQkgIHNldHRpbmdzLT5jaGFuZGVmLmNoYW4tPmh3X3ZhbHVlLApAQCAtNDUxNCwxMSArNDUxNCwxNiBAQAogCW1ic3MgPSBpZnAtPnZpZi0+bWJzczsKIAogCS8qIHN0b3JlIGN1cnJlbnQgMTFkIHNldHRpbmcgKi8KLQlicmNtZl9maWxfY21kX2ludF9nZXQoaWZwLCBCUkNNRl9DX0dFVF9SRUdVTEFUT1JZLCAmaWZwLT52aWYtPmlzXzExZCk7Ci0JY291bnRyeV9pZSA9IGJyY21mX3BhcnNlX3RsdnMoKHU4ICopc2V0dGluZ3MtPmJlYWNvbi50YWlsLAotCQkJCSAgICAgIHNldHRpbmdzLT5iZWFjb24udGFpbF9sZW4sCi0JCQkJICAgICAgV0xBTl9FSURfQ09VTlRSWSk7Ci0JaXNfMTFkID0gY291bnRyeV9pZSA/IDEgOiAwOworCWlmIChicmNtZl9maWxfY21kX2ludF9nZXQoaWZwLCBCUkNNRl9DX0dFVF9SRUdVTEFUT1JZLAorCQkJCSAgJmlmcC0+dmlmLT5pc18xMWQpKSB7CisJCXN1cHBvcnRzXzExZCA9IGZhbHNlOworCX0gZWxzZSB7CisJCWNvdW50cnlfaWUgPSBicmNtZl9wYXJzZV90bHZzKCh1OCAqKXNldHRpbmdzLT5iZWFjb24udGFpbCwKKwkJCQkJICAgICAgc2V0dGluZ3MtPmJlYWNvbi50YWlsX2xlbiwKKwkJCQkJICAgICAgV0xBTl9FSURfQ09VTlRSWSk7CisJCWlzXzExZCA9IGNvdW50cnlfaWUgPyAxIDogMDsKKwkJc3VwcG9ydHNfMTFkID0gdHJ1ZTsKKwl9CiAKIAltZW1zZXQoJnNzaWRfbGUsIDAsIHNpemVvZihzc2lkX2xlKSk7CiAJaWYgKHNldHRpbmdzLT5zc2lkID09IE5VTEwgfHwgc2V0dGluZ3MtPnNzaWRfbGVuID09IDApIHsKQEAgLTQ1MjcsNyArNDUzMiw3IEBACiAJCQkJKHU4ICopJnNldHRpbmdzLT5iZWFjb24uaGVhZFtpZV9vZmZzZXRdLAogCQkJCXNldHRpbmdzLT5iZWFjb24uaGVhZF9sZW4gLSBpZV9vZmZzZXQsCiAJCQkJV0xBTl9FSURfU1NJRCk7Ci0JCWlmICghc3NpZF9pZSkKKwkJaWYgKCFzc2lkX2llIHx8IHNzaWRfaWUtPmxlbiA+IElFRUU4MDIxMV9NQVhfU1NJRF9MRU4pCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQltZW1jcHkoc3NpZF9sZS5TU0lELCBzc2lkX2llLT5kYXRhLCBzc2lkX2llLT5sZW4pOwpAQCAtNDU3Nyw3ICs0NTgyLDcgQEAKIAogCS8qIFBhcmFtZXRlcnMgc2hhcmVkIGJ5IGFsbCByYWRpbyBpbnRlcmZhY2VzICovCiAJaWYgKCFtYnNzKSB7Ci0JCWlmIChpc18xMWQgIT0gaWZwLT52aWYtPmlzXzExZCkgeworCQlpZiAoKHN1cHBvcnRzXzExZCkgJiYgKGlzXzExZCAhPSBpZnAtPnZpZi0+aXNfMTFkKSkgewogCQkJZXJyID0gYnJjbWZfZmlsX2NtZF9pbnRfc2V0KGlmcCwgQlJDTUZfQ19TRVRfUkVHVUxBVE9SWSwKIAkJCQkJCSAgICBpc18xMWQpOwogCQkJaWYgKGVyciA8IDApIHsKQEAgLTQ2MTksNyArNDYyNCw3IEBACiAJCQlicmNtZl9lcnIoIlNFVCBJTkZSQSBlcnJvciAlZFxuIiwgZXJyKTsKIAkJCWdvdG8gZXhpdDsKIAkJfQotCX0gZWxzZSBpZiAoV0FSTl9PTihpc18xMWQgIT0gaWZwLT52aWYtPmlzXzExZCkpIHsKKwl9IGVsc2UgaWYgKFdBUk5fT04oc3VwcG9ydHNfMTFkICYmIChpc18xMWQgIT0gaWZwLT52aWYtPmlzXzExZCkpKSB7CiAJCS8qIE11bHRpcGxlLUJTUyBzaG91bGQgdXNlIHNhbWUgMTFkIGNvbmZpZ3VyYXRpb24gKi8KIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBleGl0OwpAQCAtNDc1MywxMSArNDc1OCw4IEBACiAJCQlicmNtZl9lcnIoInNldHRpbmcgSU5GUkEgbW9kZSBmYWlsZWQgJWRcbiIsIGVycik7CiAJCWlmIChicmNtZl9mZWF0X2lzX2VuYWJsZWQoaWZwLCBCUkNNRl9GRUFUX01CU1MpKQogCQkJYnJjbWZfZmlsX2lvdmFyX2ludF9zZXQoaWZwLCAibWJzcyIsIDApOwotCQllcnIgPSBicmNtZl9maWxfY21kX2ludF9zZXQoaWZwLCBCUkNNRl9DX1NFVF9SRUdVTEFUT1JZLAotCQkJCQkgICAgaWZwLT52aWYtPmlzXzExZCk7Ci0JCWlmIChlcnIgPCAwKQotCQkJYnJjbWZfZXJyKCJyZXN0b3JpbmcgUkVHVUxBVE9SWSBzZXR0aW5nIGZhaWxlZCAlZFxuIiwKLQkJCQkgIGVycik7CisJCWJyY21mX2ZpbF9jbWRfaW50X3NldChpZnAsIEJSQ01GX0NfU0VUX1JFR1VMQVRPUlksCisJCQkJICAgICAgaWZwLT52aWYtPmlzXzExZCk7CiAJCS8qIEJyaW5nIGRldmljZSBiYWNrIHVwIHNvIGl0IGNhbiBiZSB1c2VkIGFnYWluICovCiAJCWVyciA9IGJyY21mX2ZpbF9jbWRfaW50X3NldChpZnAsIEJSQ01GX0NfVVAsIDEpOwogCQlpZiAoZXJyIDwgMCkKQEAgLTU2MzUsNyArNTYzNyw3IEBACiAJCSAgaWZldmVudC0+YWN0aW9uLCBpZmV2ZW50LT5mbGFncywgaWZldmVudC0+aWZpZHgsCiAJCSAgaWZldmVudC0+YnNzY2ZnaWR4KTsKIAotCW11dGV4X2xvY2soJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CisJc3Bpbl9sb2NrKCZldmVudC0+dmlmX2V2ZW50X2xvY2spOwogCWV2ZW50LT5hY3Rpb24gPSBpZmV2ZW50LT5hY3Rpb247CiAJdmlmID0gZXZlbnQtPnZpZjsKIApAQCAtNTY0Myw3ICs1NjQ1LDcgQEAKIAljYXNlIEJSQ01GX0VfSUZfQUREOgogCQkvKiB3YWl0aW5nIHByb2Nlc3MgbWF5IGhhdmUgdGltZWQgb3V0ICovCiAJCWlmICghY2ZnLT52aWZfZXZlbnQudmlmKSB7Ci0JCQltdXRleF91bmxvY2soJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CisJCQlzcGluX3VubG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKIAkJCXJldHVybiAtRUJBREY7CiAJCX0KIApAQCAtNTY1NCwyNCArNTY1NiwyNCBAQAogCQkJaWZwLT5uZGV2LT5pZWVlODAyMTFfcHRyID0gJnZpZi0+d2RldjsKIAkJCVNFVF9ORVRERVZfREVWKGlmcC0+bmRldiwgd2lwaHlfZGV2KGNmZy0+d2lwaHkpKTsKIAkJfQotCQltdXRleF91bmxvY2soJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZldmVudC0+dmlmX2V2ZW50X2xvY2spOwogCQl3YWtlX3VwKCZldmVudC0+dmlmX3dxKTsKIAkJcmV0dXJuIDA7CiAKIAljYXNlIEJSQ01GX0VfSUZfREVMOgotCQltdXRleF91bmxvY2soJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZldmVudC0+dmlmX2V2ZW50X2xvY2spOwogCQkvKiBldmVudCBtYXkgbm90IGJlIHVwb24gdXNlciByZXF1ZXN0ICovCiAJCWlmIChicmNtZl9jZmc4MDIxMV92aWZfZXZlbnRfYXJtZWQoY2ZnKSkKIAkJCXdha2VfdXAoJmV2ZW50LT52aWZfd3EpOwogCQlyZXR1cm4gMDsKIAogCWNhc2UgQlJDTUZfRV9JRl9DSEFOR0U6Ci0JCW11dGV4X3VubG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CiAJCXdha2VfdXAoJmV2ZW50LT52aWZfd3EpOwogCQlyZXR1cm4gMDsKIAogCWRlZmF1bHQ6Ci0JCW11dGV4X3VubG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gLUVJTlZBTDsKQEAgLTU3OTIsNyArNTc5NCw3IEBACiBzdGF0aWMgdm9pZCBpbml0X3ZpZl9ldmVudChzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfdmlmX2V2ZW50ICpldmVudCkKIHsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZldmVudC0+dmlmX3dxKTsKLQltdXRleF9pbml0KCZldmVudC0+dmlmX2V2ZW50X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZldmVudC0+dmlmX2V2ZW50X2xvY2spOwogfQogCiBzdGF0aWMgczMyIGJyY21mX2RvbmdsZV9yb2FtKHN0cnVjdCBicmNtZl9pZiAqaWZwKQpAQCAtNjY5MSw5ICs2NjkzLDkgQEAKIHsKIAl1OCBldnRfYWN0aW9uOwogCi0JbXV0ZXhfbG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKKwlzcGluX2xvY2soJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CiAJZXZ0X2FjdGlvbiA9IGV2ZW50LT5hY3Rpb247Ci0JbXV0ZXhfdW5sb2NrKCZldmVudC0+dmlmX2V2ZW50X2xvY2spOworCXNwaW5fdW5sb2NrKCZldmVudC0+dmlmX2V2ZW50X2xvY2spOwogCXJldHVybiBldnRfYWN0aW9uID09IGFjdGlvbjsKIH0KIApAQCAtNjcwMiwxMCArNjcwNCwxMCBAQAogewogCXN0cnVjdCBicmNtZl9jZmc4MDIxMV92aWZfZXZlbnQgKmV2ZW50ID0gJmNmZy0+dmlmX2V2ZW50OwogCi0JbXV0ZXhfbG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKKwlzcGluX2xvY2soJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CiAJZXZlbnQtPnZpZiA9IHZpZjsKIAlldmVudC0+YWN0aW9uID0gMDsKLQltdXRleF91bmxvY2soJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CisJc3Bpbl91bmxvY2soJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CiB9CiAKIGJvb2wgYnJjbWZfY2ZnODAyMTFfdmlmX2V2ZW50X2FybWVkKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9pbmZvICpjZmcpCkBAIC02NzEzLDkgKzY3MTUsOSBAQAogCXN0cnVjdCBicmNtZl9jZmc4MDIxMV92aWZfZXZlbnQgKmV2ZW50ID0gJmNmZy0+dmlmX2V2ZW50OwogCWJvb2wgYXJtZWQ7CiAKLQltdXRleF9sb2NrKCZldmVudC0+dmlmX2V2ZW50X2xvY2spOworCXNwaW5fbG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKIAlhcm1lZCA9IGV2ZW50LT52aWYgIT0gTlVMTDsKLQltdXRleF91bmxvY2soJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CisJc3Bpbl91bmxvY2soJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CiAKIAlyZXR1cm4gYXJtZWQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvY2ZnODAyMTEuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9jZmc4MDIxMS5oCmluZGV4IDdkNzdmODYuLjg4ODk4MzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9jZmc4MDIxMS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9jZmc4MDIxMS5oCkBAIC0yMjcsNyArMjI3LDcgQEAKICAqLwogc3RydWN0IGJyY21mX2NmZzgwMjExX3ZpZl9ldmVudCB7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgdmlmX3dxOwotCXN0cnVjdCBtdXRleCB2aWZfZXZlbnRfbG9jazsKKwlzcGlubG9ja190IHZpZl9ldmVudF9sb2NrOwogCXU4IGFjdGlvbjsKIAlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfdmlmICp2aWY7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2NvcmUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9jb3JlLmMKaW5kZXggOGQxNmYwMi4uNWVhYWMxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2NvcmUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvY29yZS5jCkBAIC0xMzYsMjcgKzEzNiw2IEBACiAJCQkgIGVycik7CiB9CiAKLXN0YXRpYyB2b2lkCi1fYnJjbWZfc2V0X21hY19hZGRyZXNzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgYnJjbWZfaWYgKmlmcDsKLQlzMzIgZXJyOwotCi0JaWZwID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBicmNtZl9pZiwgc2V0bWFjYWRkcl93b3JrKTsKLQotCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyLCBic3NjZmdpZHg9JWRcbiIsIGlmcC0+YnNzY2ZnaWR4KTsKLQotCWVyciA9IGJyY21mX2ZpbF9pb3Zhcl9kYXRhX3NldChpZnAsICJjdXJfZXRoZXJhZGRyIiwgaWZwLT5tYWNfYWRkciwKLQkJCQkgICAgICAgRVRIX0FMRU4pOwotCWlmIChlcnIgPCAwKSB7Ci0JCWJyY21mX2VycigiU2V0dGluZyBjdXJfZXRoZXJhZGRyIGZhaWxlZCwgJWRcbiIsIGVycik7Ci0JfSBlbHNlIHsKLQkJYnJjbWZfZGJnKFRSQUNFLCAiTUFDIGFkZHJlc3MgdXBkYXRlZCB0byAlcE1cbiIsCi0JCQkgIGlmcC0+bWFjX2FkZHIpOwotCQltZW1jcHkoaWZwLT5uZGV2LT5kZXZfYWRkciwgaWZwLT5tYWNfYWRkciwgRVRIX0FMRU4pOwotCX0KLX0KLQogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiBzdGF0aWMgdm9pZCBfYnJjbWZfdXBkYXRlX25kdGFibGUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewpAQCAtMTkwLDEwICsxNjksMjAgQEAKIHsKIAlzdHJ1Y3QgYnJjbWZfaWYgKmlmcCA9IG5ldGRldl9wcml2KG5kZXYpOwogCXN0cnVjdCBzb2NrYWRkciAqc2EgPSAoc3RydWN0IHNvY2thZGRyICopYWRkcjsKKwlpbnQgZXJyOwogCi0JbWVtY3B5KCZpZnAtPm1hY19hZGRyLCBzYS0+c2FfZGF0YSwgRVRIX0FMRU4pOwotCXNjaGVkdWxlX3dvcmsoJmlmcC0+c2V0bWFjYWRkcl93b3JrKTsKLQlyZXR1cm4gMDsKKwlicmNtZl9kYmcoVFJBQ0UsICJFbnRlciwgYnNzY2ZnaWR4PSVkXG4iLCBpZnAtPmJzc2NmZ2lkeCk7CisKKwllcnIgPSBicmNtZl9maWxfaW92YXJfZGF0YV9zZXQoaWZwLCAiY3VyX2V0aGVyYWRkciIsIHNhLT5zYV9kYXRhLAorCQkJCSAgICAgICBFVEhfQUxFTik7CisJaWYgKGVyciA8IDApIHsKKwkJYnJjbWZfZXJyKCJTZXR0aW5nIGN1cl9ldGhlcmFkZHIgZmFpbGVkLCAlZFxuIiwgZXJyKTsKKwl9IGVsc2UgeworCQlicmNtZl9kYmcoVFJBQ0UsICJ1cGRhdGVkIHRvICVwTVxuIiwgc2EtPnNhX2RhdGEpOworCQltZW1jcHkoaWZwLT5tYWNfYWRkciwgc2EtPnNhX2RhdGEsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGlmcC0+bmRldi0+ZGV2X2FkZHIsIGlmcC0+bWFjX2FkZHIsIEVUSF9BTEVOKTsKKwl9CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQgYnJjbWZfbmV0ZGV2X3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKQEAgLTUxOSwxMyArNTA4LDkgQEAKIAluZGV2LT5uZWVkZWRfaGVhZHJvb20gKz0gZHJ2ci0+aGRybGVuOwogCW5kZXYtPmV0aHRvb2xfb3BzID0gJmJyY21mX2V0aHRvb2xfb3BzOwogCi0JZHJ2ci0+cnhzeiA9IG5kZXYtPm10dSArIG5kZXYtPmhhcmRfaGVhZGVyX2xlbiArCi0JCQkgICAgICBkcnZyLT5oZHJsZW47Ci0KIAkvKiBzZXQgdGhlIG1hYyBhZGRyZXNzICovCiAJbWVtY3B5KG5kZXYtPmRldl9hZGRyLCBpZnAtPm1hY19hZGRyLCBFVEhfQUxFTik7CiAKLQlJTklUX1dPUksoJmlmcC0+c2V0bWFjYWRkcl93b3JrLCBfYnJjbWZfc2V0X21hY19hZGRyZXNzKTsKIAlJTklUX1dPUksoJmlmcC0+bXVsdGljYXN0X3dvcmssIF9icmNtZl9zZXRfbXVsdGljYXN0X2xpc3QpOwogCUlOSVRfV09SSygmaWZwLT5uZG9mZmxvYWRfd29yaywgX2JyY21mX3VwZGF0ZV9uZHRhYmxlKTsKIApAQCAtNzMwLDcgKzcxNSw2IEBACiAJCX0KIAogCQlpZiAoaWZwLT5uZGV2LT5uZXRkZXZfb3BzID09ICZicmNtZl9uZXRkZXZfb3BzX3ByaSkgewotCQkJY2FuY2VsX3dvcmtfc3luYygmaWZwLT5zZXRtYWNhZGRyX3dvcmspOwogCQkJY2FuY2VsX3dvcmtfc3luYygmaWZwLT5tdWx0aWNhc3Rfd29yayk7CiAJCQljYW5jZWxfd29ya19zeW5jKCZpZnAtPm5kb2ZmbG9hZF93b3JrKTsKIAkJfQpAQCAtNzQzLDcgKzcyNyw3IEBACiAJCSAqIHNlcmlvdXMgdHJvdWJsZXNvbWUgc2lkZSBlZmZlY3RzLiBUaGUgcDJwIG1vZHVsZSB3aWxsIGNsZWFuCiAJCSAqIHVwIHRoZSBpZnAgaWYgbmVlZGVkLgogCQkgKi8KLQkJYnJjbWZfcDJwX2lmcF9yZW1vdmVkKGlmcCk7CisJCWJyY21mX3AycF9pZnBfcmVtb3ZlZChpZnAsIHJ0bmxfbG9ja2VkKTsKIAkJa2ZyZWUoaWZwKTsKIAl9CiB9CkBAIC04ODYsOSArODcwLDEyIEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBORVRERVZfRE9XTjoKLQkJaWYgKGkgPCBORE9MX01BWF9FTlRSSUVTKQotCQkJZm9yICg7IGkgPCBpZnAtPmlwdjZhZGRyX2lkeDsgaSsrKQorCQlpZiAoaSA8IE5ET0xfTUFYX0VOVFJJRVMpIHsKKwkJCWZvciAoOyBpIDwgaWZwLT5pcHY2YWRkcl9pZHggLSAxOyBpKyspCiAJCQkJdGFibGVbaV0gPSB0YWJsZVtpICsgMV07CisJCQltZW1zZXQoJnRhYmxlW2ldLCAwLCBzaXplb2YodGFibGVbaV0pKTsKKwkJCWlmcC0+aXB2NmFkZHJfaWR4LS07CisJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CkBAIC0xMDYxLDggKzEwNDgsNyBAQAogCQlicmNtZl9md3NfZGVsX2ludGVyZmFjZShpZnApOwogCQlicmNtZl9md3NfZGVpbml0KGRydnIpOwogCX0KLQlpZiAoaWZwKQotCQlicmNtZl9uZXRfZGV0YWNoKGlmcC0+bmRldiwgZmFsc2UpOworCWJyY21mX25ldF9kZXRhY2goaWZwLT5uZGV2LCBmYWxzZSk7CiAJaWYgKHAycF9pZnApCiAJCWJyY21mX25ldF9kZXRhY2gocDJwX2lmcC0+bmRldiwgZmFsc2UpOwogCWRydnItPmlmbGlzdFswXSA9IE5VTEw7CkBAIC0xMTY5LDcgKzExNTUsOCBAQAogCQkJCSAhYnJjbWZfZ2V0X3BlbmRfODAyMXhfY250KGlmcCksCiAJCQkJIE1BWF9XQUlUX0ZPUl84MDIxWF9UWCk7CiAKLQlXQVJOX09OKCFlcnIpOworCWlmICghZXJyKQorCQlicmNtZl9lcnIoIlRpbWVkIG91dCB3YWl0aW5nIGZvciBubyBwZW5kaW5nIDgwMi4xeCBwYWNrZXRzXG4iKTsKIAogCXJldHVybiAhZXJyOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2NvcmUuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9jb3JlLmgKaW5kZXggOGZhMzRjYS4uYzk0ZGNhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2NvcmUuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvY29yZS5oCkBAIC0xMTIsMTUgKzExMiwxMSBAQAogCiAJLyogSW50ZXJuYWwgYnJjbWYgaXRlbXMgKi8KIAl1aW50IGhkcmxlbjsJCS8qIFRvdGFsIEJSQ01GIGhlYWRlciBsZW5ndGggKHByb3RvICsgYnVzKSAqLwotCXVpbnQgcnhzejsJCS8qIFJ4IGJ1ZmZlciBzaXplIGJ1cyBtb2R1bGUgc2hvdWxkIHVzZSAqLwogCiAJLyogRG9uZ2xlIG1lZGlhIGluZm8gKi8KIAljaGFyIGZ3dmVyW0JSQ01GX0RSSVZFUl9GSVJNV0FSRV9WRVJTSU9OX0xFTl07CiAJdTggbWFjW0VUSF9BTEVOXTsJCS8qIE1BQyBhZGRyZXNzIG9idGFpbmVkIGZyb20gZG9uZ2xlICovCiAKLQkvKiBNdWx0aWNhc3QgZGF0YSBwYWNrZXRzIHNlbnQgdG8gZG9uZ2xlICovCi0JdW5zaWduZWQgbG9uZyB0eF9tdWx0aWNhc3Q7Ci0KIAlzdHJ1Y3QgbWFjX2FkZHJlc3MgYWRkcmVzc2VzW0JSQ01GX01BWF9JRlNdOwogCiAJc3RydWN0IGJyY21mX2lmICppZmxpc3RbQlJDTUZfTUFYX0lGU107CkBAIC0xNzYsNyArMTcyLDYgQEAKICAqIEB2aWY6IHBvaW50cyB0byBjZmc4MDIxMSBzcGVjaWZpYyBpbnRlcmZhY2UgaW5mb3JtYXRpb24uCiAgKiBAbmRldjogYXNzb2NpYXRlZCBuZXR3b3JrIGRldmljZS4KICAqIEBzdGF0czogaW50ZXJmYWNlIHNwZWNpZmljIG5ldHdvcmsgc3RhdGlzdGljcy4KLSAqIEBzZXRtYWNhZGRyX3dvcms6IHdvcmtlciBvYmplY3QgZm9yIHNldHRpbmcgbWFjIGFkZHJlc3MuCiAgKiBAbXVsdGljYXN0X3dvcms6IHdvcmtlciBvYmplY3QgZm9yIG11bHRpY2FzdCBwcm92aXNpb25pbmcuCiAgKiBAbmRvZmZsb2FkX3dvcms6IHdvcmtlciBvYmplY3QgZm9yIG5laWdoYm9yIGRpc2NvdmVyeSBvZmZsb2FkIGNvbmZpZ3VyYXRpb24uCiAgKiBAZndzX2Rlc2M6IGludGVyZmFjZSBzcGVjaWZpYyBmaXJtd2FyZS1zaWduYWxsaW5nIGRlc2NyaXB0b3IuCkBAIC0xOTMsNyArMTg4LDYgQEAKIAlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfdmlmICp2aWY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHNldG1hY2FkZHJfd29yazsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbXVsdGljYXN0X3dvcms7CiAJc3RydWN0IHdvcmtfc3RydWN0IG5kb2ZmbG9hZF93b3JrOwogCXN0cnVjdCBicmNtZl9md3NfbWFjX2Rlc2NyaXB0b3IgKmZ3c19kZXNjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2Zsb3dyaW5nLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvZmxvd3JpbmcuYwppbmRleCA3ZTI2OWY5Li5kMGI3MzhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvZmxvd3JpbmcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvZmxvd3JpbmcuYwpAQCAtMjM0LDEzICsyMzQsMjAgQEAKIAogdm9pZCBicmNtZl9mbG93cmluZ19kZWxldGUoc3RydWN0IGJyY21mX2Zsb3dyaW5nICpmbG93LCB1MTYgZmxvd2lkKQogeworCXN0cnVjdCBicmNtZl9idXMgKmJ1c19pZiA9IGRldl9nZXRfZHJ2ZGF0YShmbG93LT5kZXYpOwogCXN0cnVjdCBicmNtZl9mbG93cmluZ19yaW5nICpyaW5nOworCXN0cnVjdCBicmNtZl9pZiAqaWZwOwogCXUxNiBoYXNoX2lkeDsKKwl1OCBpZmlkeDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJcmluZyA9IGZsb3ctPnJpbmdzW2Zsb3dpZF07CiAJaWYgKCFyaW5nKQogCQlyZXR1cm47CisKKwlpZmlkeCA9IGJyY21mX2Zsb3dyaW5nX2lmaWR4X2dldChmbG93LCBmbG93aWQpOworCWlmcCA9IGJyY21mX2dldF9pZnAoYnVzX2lmLT5kcnZyLCBpZmlkeCk7CisKIAlicmNtZl9mbG93cmluZ19ibG9jayhmbG93LCBmbG93aWQsIGZhbHNlKTsKIAloYXNoX2lkeCA9IHJpbmctPmhhc2hfaWQ7CiAJZmxvdy0+aGFzaFtoYXNoX2lkeF0uaWZpZHggPSBCUkNNRl9GTE9XUklOR19JTlZBTElEX0lGSURYOwpAQCAtMjQ5LDcgKzI1Niw3IEBACiAKIAlza2IgPSBza2JfZGVxdWV1ZSgmcmluZy0+c2tibGlzdCk7CiAJd2hpbGUgKHNrYikgewotCQlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKHNrYik7CisJCWJyY21mX3R4ZmluYWxpemUoaWZwLCBza2IsIGZhbHNlKTsKIAkJc2tiID0gc2tiX2RlcXVldWUoJnJpbmctPnNrYmxpc3QpOwogCX0KIApAQCAtNDk1LDE0ICs1MDIsMTggQEAKIAl9IGVsc2UgewogCQlzZWFyY2ggPSBmbG93LT50ZGxzX2VudHJ5OwogCQlpZiAobWVtY21wKHNlYXJjaC0+bWFjLCBwZWVyLCBFVEhfQUxFTikgPT0gMCkKLQkJCXJldHVybjsKKwkJCWdvdG8gZnJlZV9lbnRyeTsKIAkJd2hpbGUgKHNlYXJjaC0+bmV4dCkgewogCQkJc2VhcmNoID0gc2VhcmNoLT5uZXh0OwogCQkJaWYgKG1lbWNtcChzZWFyY2gtPm1hYywgcGVlciwgRVRIX0FMRU4pID09IDApCi0JCQkJcmV0dXJuOworCQkJCWdvdG8gZnJlZV9lbnRyeTsKIAkJfQogCQlzZWFyY2gtPm5leHQgPSB0ZGxzX2VudHJ5OwogCX0KIAogCWZsb3ctPnRkbHNfYWN0aXZlID0gdHJ1ZTsKKwlyZXR1cm47CisKK2ZyZWVfZW50cnk6CisJa2ZyZWUodGRsc19lbnRyeSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvZndzaWduYWwuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9md3NpZ25hbC5jCmluZGV4IDlmOTAyNGEuLmExOTBmNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9md3NpZ25hbC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9md3NpZ25hbC5jCkBAIC0yMTA0LDggKzIxMDQsNiBAQAogCWlmICgoc2tiLT5wcmlvcml0eSA9PSAwKSB8fCAoc2tiLT5wcmlvcml0eSA+IDcpKQogCQlza2ItPnByaW9yaXR5ID0gY2ZnODAyMTFfY2xhc3NpZnk4MDIxZChza2IsIE5VTEwpOwogCi0JZHJ2ci0+dHhfbXVsdGljYXN0ICs9ICEhbXVsdGljYXN0OwotCiAJaWYgKGZ3cy0+YXZvaWRfcXVldWVpbmcpIHsKIAkJcmMgPSBicmNtZl9wcm90b190eGRhdGEoZHJ2ciwgaWZwLT5pZmlkeCwgMCwgc2tiKTsKIAkJaWYgKHJjIDwgMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9wMnAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9wMnAuYwppbmRleCA2NmY5NDJmLi5kZTE5YzdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvcDJwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL3AycC5jCkBAIC0yMjk3LDcgKzIyOTcsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXZvaWQgYnJjbWZfcDJwX2lmcF9yZW1vdmVkKHN0cnVjdCBicmNtZl9pZiAqaWZwKQordm9pZCBicmNtZl9wMnBfaWZwX3JlbW92ZWQoc3RydWN0IGJyY21mX2lmICppZnAsIGJvb2wgcnRubF9sb2NrZWQpCiB7CiAJc3RydWN0IGJyY21mX2NmZzgwMjExX2luZm8gKmNmZzsKIAlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfdmlmICp2aWY7CkBAIC0yMzA2LDkgKzIzMDYsMTEgQEAKIAl2aWYgPSBpZnAtPnZpZjsKIAljZmcgPSB3ZGV2X3RvX2NmZygmdmlmLT53ZGV2KTsKIAljZmctPnAycC5ic3NfaWR4W1AyUEFQSV9CU1NDRkdfREVWSUNFXS52aWYgPSBOVUxMOwotCXJ0bmxfbG9jaygpOworCWlmICghcnRubF9sb2NrZWQpCisJCXJ0bmxfbG9jaygpOwogCWNmZzgwMjExX3VucmVnaXN0ZXJfd2RldigmdmlmLT53ZGV2KTsKLQlydG5sX3VubG9jaygpOworCWlmICghcnRubF9sb2NrZWQpCisJCXJ0bmxfdW5sb2NrKCk7CiAJYnJjbWZfZnJlZV92aWYodmlmKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL3AycC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL3AycC5oCmluZGV4IGEzYmQxOGMuLjhjZTk0NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9wMnAuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvcDJwLmgKQEAgLTE1NSw3ICsxNTUsNyBAQAogaW50IGJyY21mX3AycF9kZWxfdmlmKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpOwogaW50IGJyY21mX3AycF9pZmNoYW5nZShzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfaW5mbyAqY2ZnLAogCQkgICAgICAgZW51bSBicmNtZl9maWxfcDJwX2lmX3R5cGVzIGlmX3R5cGUpOwotdm9pZCBicmNtZl9wMnBfaWZwX3JlbW92ZWQoc3RydWN0IGJyY21mX2lmICppZnApOwordm9pZCBicmNtZl9wMnBfaWZwX3JlbW92ZWQoc3RydWN0IGJyY21mX2lmICppZnAsIGJvb2wgcnRubF9sb2NrZWQpOwogaW50IGJyY21mX3AycF9zdGFydF9kZXZpY2Uoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IHdpcmVsZXNzX2RldiAqd2Rldik7CiB2b2lkIGJyY21mX3AycF9zdG9wX2RldmljZShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KTsKIGludCBicmNtZl9wMnBfc2Nhbl9wcmVwKHN0cnVjdCB3aXBoeSAqd2lwaHksCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvc2Rpby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL3NkaW8uYwppbmRleCA2OGFiM2FjLi5iODkyZGFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvc2Rpby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9zZGlvLmMKQEAgLTMxMyw2ICszMTMsNyBAQAogCiAjZGVmaW5lIEtTT19XQUlUX1VTIDUwCiAjZGVmaW5lIE1BWF9LU09fQVRURU1QVFMgKFBNVV9NQVhfVFJBTlNJVElPTl9ETFkvS1NPX1dBSVRfVVMpCisjZGVmaW5lIEJSQ01GX1NESU9fTUFYX0FDQ0VTU19FUlJPUlMJNQogCiAvKgogICogQ29udmVyc2lvbiBvZiA4MDIuMUQgcHJpb3JpdHkgdG8gcHJlY2VkZW5jZSBsZXZlbApAQCAtNjc3LDYgKzY3OCw3IEBACiB7CiAJdTggd3JfdmFsID0gMCwgcmRfdmFsLCBjbXBfdmFsLCBibWFzazsKIAlpbnQgZXJyID0gMDsKKwlpbnQgZXJyX2NudCA9IDA7CiAJaW50IHRyeV9jbnQgPSAwOwogCiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXI6IG9uPSVkXG4iLCBvbik7CkBAIC03MTIsOSArNzE0LDE0IEBACiAJCSAqLwogCQlyZF92YWwgPSBicmNtZl9zZGlvZF9yZWdyYihidXMtPnNkaW9kZXYsIFNCU0RJT19GVU5DMV9TTEVFUENTUiwKIAkJCQkJICAgJmVycik7Ci0JCWlmICgoKHJkX3ZhbCAmIGJtYXNrKSA9PSBjbXBfdmFsKSAmJiAhZXJyKQorCQlpZiAoIWVycikgeworCQkJaWYgKChyZF92YWwgJiBibWFzaykgPT0gY21wX3ZhbCkKKwkJCQlicmVhazsKKwkJCWVycl9jbnQgPSAwOworCQl9CisJCS8qIGJhaWwgb3V0IHVwb24gc3Vic2VxdWVudCBhY2Nlc3MgZXJyb3JzICovCisJCWlmIChlcnIgJiYgKGVycl9jbnQrKyA+IEJSQ01GX1NESU9fTUFYX0FDQ0VTU19FUlJPUlMpKQogCQkJYnJlYWs7Ci0KIAkJdWRlbGF5KEtTT19XQUlUX1VTKTsKIAkJYnJjbWZfc2Rpb2RfcmVnd2IoYnVzLT5zZGlvZGV2LCBTQlNESU9fRlVOQzFfU0xFRVBDU1IsCiAJCQkJICB3cl92YWwsICZlcnIpOwpAQCAtMzc1Nyw3ICszNzY0LDggQEAKIAl1MzIgdmFsLCByZXY7CiAKIAl2YWwgPSBicmNtZl9zZGlvZF9yZWdybChzZGlvZGV2LCBhZGRyLCBOVUxMKTsKLQlpZiAoc2Rpb2Rldi0+ZnVuY1swXS0+ZGV2aWNlID09IFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzMzVfNDMzOSAmJgorCWlmICgoc2Rpb2Rldi0+ZnVuY1swXS0+ZGV2aWNlID09IFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzMzVfNDMzOSB8fAorCSAgICAgc2Rpb2Rldi0+ZnVuY1swXS0+ZGV2aWNlID09IFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzMzkpICYmCiAJICAgIGFkZHIgPT0gQ09SRV9DQ19SRUcoU0lfRU5VTV9CQVNFLCBjaGlwaWQpKSB7CiAJCXJldiA9ICh2YWwgJiBDSURfUkVWX01BU0spID4+IENJRF9SRVZfU0hJRlQ7CiAJCWlmIChyZXYgPj0gMikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL3RyYWNlcG9pbnQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy90cmFjZXBvaW50LmMKaW5kZXggYTEwZjM1Yy4uZmU2NzU1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL3RyYWNlcG9pbnQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvdHJhY2Vwb2ludC5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaWZuZGVmIF9fQ0hFQ0tFUl9fCiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKICNpbmNsdWRlICJ0cmFjZXBvaW50LmgiCisjaW5jbHVkZSAiZGVidWcuaCIKIAogdm9pZCBfX2JyY21mX2Vycihjb25zdCBjaGFyICpmdW5jLCBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy91c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy91c2IuYwppbmRleCA5OGIxNWE5Li4yZjk3OGEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL3VzYi5jCkBAIC0xMDk5LDE1ICsxMDk5LDExIEBACiAJZGV2aW5mby0+dHhfZnJlZWNvdW50ID0gbnR4cTsKIAogCWRldmluZm8tPmN0bF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOwotCWlmICghZGV2aW5mby0+Y3RsX3VyYikgewotCQlicmNtZl9lcnIoInVzYl9hbGxvY191cmIgKGN0bCkgZmFpbGVkXG4iKTsKKwlpZiAoIWRldmluZm8tPmN0bF91cmIpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCWRldmluZm8tPmJ1bGtfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWRldmluZm8tPmJ1bGtfdXJiKSB7Ci0JCWJyY21mX2VycigidXNiX2FsbG9jX3VyYiAoYnVsaykgZmFpbGVkXG4iKTsKKwlpZiAoIWRldmluZm8tPmJ1bGtfdXJiKQogCQlnb3RvIGVycm9yOwotCX0KIAogCXJldHVybiAmZGV2aW5mby0+YnVzX3B1YjsKIApAQCAtMTQ2MiwxMSArMTQ1OCwxNSBAQAogI2RlZmluZSBCUkNNRl9VU0JfREVWSUNFKGRldl9pZCkJXAogCXsgVVNCX0RFVklDRShCUkNNX1VTQl9WRU5ET1JfSURfQlJPQURDT00sIGRldl9pZCkgfQogCisjZGVmaW5lIExJTktTWVNfVVNCX0RFVklDRShkZXZfaWQpCVwKKwl7IFVTQl9ERVZJQ0UoQlJDTV9VU0JfVkVORE9SX0lEX0xJTktTWVMsIGRldl9pZCkgfQorCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgYnJjbWZfdXNiX2RldmlkX3RhYmxlW10gPSB7CiAJQlJDTUZfVVNCX0RFVklDRShCUkNNX1VTQl80MzE0M19ERVZJQ0VfSUQpLAogCUJSQ01GX1VTQl9ERVZJQ0UoQlJDTV9VU0JfNDMyMzZfREVWSUNFX0lEKSwKIAlCUkNNRl9VU0JfREVWSUNFKEJSQ01fVVNCXzQzMjQyX0RFVklDRV9JRCksCiAJQlJDTUZfVVNCX0RFVklDRShCUkNNX1VTQl80MzU2OV9ERVZJQ0VfSUQpLAorCUxJTktTWVNfVVNCX0RFVklDRShCUkNNX1VTQl80MzIzNV9MSU5LU1lTX0RFVklDRV9JRCksCiAJeyBVU0JfREVWSUNFKEJSQ01fVVNCX1ZFTkRPUl9JRF9MRywgQlJDTV9VU0JfNDMyNDJfTEdfREVWSUNFX0lEKSB9LAogCS8qIHNwZWNpYWwgZW50cnkgZm9yIGRldmljZSB3aXRoIGZpcm13YXJlIGxvYWRlZCBhbmQgcnVubmluZyAqLwogCUJSQ01GX1VTQl9ERVZJQ0UoQlJDTV9VU0JfQkNNRldfREVWSUNFX0lEKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9pbmNsdWRlL2JyY21faHdfaWRzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvaW5jbHVkZS9icmNtX2h3X2lkcy5oCmluZGV4IDNjYzQyYmUuLmQwNDA3ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9pbmNsdWRlL2JyY21faHdfaWRzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2luY2x1ZGUvYnJjbV9od19pZHMuaApAQCAtMjIsNiArMjIsNyBAQAogCiAjZGVmaW5lIEJSQ01fVVNCX1ZFTkRPUl9JRF9CUk9BRENPTQkweDBhNWMKICNkZWZpbmUgQlJDTV9VU0JfVkVORE9SX0lEX0xHCQkweDA0M2UKKyNkZWZpbmUgQlJDTV9VU0JfVkVORE9SX0lEX0xJTktTWVMJMHgxM2IxCiAjZGVmaW5lIEJSQ01fUENJRV9WRU5ET1JfSURfQlJPQURDT00JUENJX1ZFTkRPUl9JRF9CUk9BRENPTQogCiAvKiBDaGlwY29tbW9uIENvcmUgQ2hpcCBJRHMgKi8KQEAgLTU4LDYgKzU5LDcgQEAKIAogLyogVVNCIERldmljZSBJRHMgKi8KICNkZWZpbmUgQlJDTV9VU0JfNDMxNDNfREVWSUNFX0lECTB4YmQxZQorI2RlZmluZSBCUkNNX1VTQl80MzIzNV9MSU5LU1lTX0RFVklDRV9JRAkweDAwMzkKICNkZWZpbmUgQlJDTV9VU0JfNDMyMzZfREVWSUNFX0lECTB4YmQxNwogI2RlZmluZSBCUkNNX1VTQl80MzI0Ml9ERVZJQ0VfSUQJMHhiZDFmCiAjZGVmaW5lIEJSQ01fVVNCXzQzMjQyX0xHX0RFVklDRV9JRAkweDMxMDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bGVnYWN5LzM5NDUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bGVnYWN5LzM5NDUuYwppbmRleCAyMDlkYzk5Li40ZGIzMjdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2xlZ2FjeS8zOTQ1LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsZWdhY3kvMzk0NS5jCkBAIC0yNjcxLDcgKzI2NzEsNyBAQAogCS5zZW5kX2xlZF9jbWQgPSBpbDM5NDVfc2VuZF9sZWRfY21kLAogfTsKIAotc3RhdGljIHN0cnVjdCBpbF9jZmcgaWwzOTQ1X2JnX2NmZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWxfY2ZnIGlsMzk0NV9iZ19jZmcgPSB7CiAJLm5hbWUgPSAiMzk0NUJHIiwKIAkuZndfbmFtZV9wcmUgPSBJTDM5NDVfRldfUFJFLAogCS51Y29kZV9hcGlfbWF4ID0gSUwzOTQ1X1VDT0RFX0FQSV9NQVgsCkBAIC0yNzAwLDcgKzI3MDAsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IGlsX2NmZyBpbDM5NDVfYWJnX2NmZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWxfY2ZnIGlsMzk0NV9hYmdfY2ZnID0gewogCS5uYW1lID0gIjM5NDVBQkciLAogCS5md19uYW1lX3ByZSA9IElMMzk0NV9GV19QUkUsCiAJLnVjb2RlX2FwaV9tYXggPSBJTDM5NDVfVUNPREVfQVBJX01BWCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bGVnYWN5L2NvbW1vbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsZWdhY3kvY29tbW9uLmgKaW5kZXggNzI2ZWRlMy4uM2JiYTUyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsZWdhY3kvY29tbW9uLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsZWdhY3kvY29tbW9uLmgKQEAgLTEzMjAsNyArMTMyMCw3IEBACiAJdTY0IHRpbWVzdGFtcDsKIAogCXVuaW9uIHsKLSNpZiBkZWZpbmVkKENPTkZJR19JV0wzOTQ1KSB8fCBkZWZpbmVkKENPTkZJR19JV0wzOTQ1X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JV0wzOTQ1KQogCQlzdHJ1Y3QgewogCQkJdm9pZCAqc2hhcmVkX3ZpcnQ7CiAJCQlkbWFfYWRkcl90IHNoYXJlZF9waHlzOwpAQCAtMTM1MSw3ICsxMzUxLDcgQEAKIAogCQl9IF8zOTQ1OwogI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfSVdMNDk2NSkgfHwgZGVmaW5lZChDT05GSUdfSVdMNDk2NV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVdMNDk2NSkKIAkJc3RydWN0IHsKIAkJCXN0cnVjdCBpbF9yeF9waHlfcmVzIGxhc3RfcGh5X3JlczsKIAkJCWJvb2wgbGFzdF9waHlfcmVzX3ZhbGlkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9kdm0vdWNvZGUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvZHZtL3Vjb2RlLmMKaW5kZXggYjY2MmNmMy4uYzc1MDljNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9kdm0vdWNvZGUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2R2bS91Y29kZS5jCkBAIC00NiwxNSArNDYsNiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IGZ3X2ltZyAqCi1pd2xfZ2V0X3Vjb2RlX2ltYWdlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgZW51bSBpd2xfdWNvZGVfdHlwZSB1Y29kZV90eXBlKQotewotCWlmICh1Y29kZV90eXBlID49IElXTF9VQ09ERV9UWVBFX01BWCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gJnByaXYtPmZ3LT5pbWdbdWNvZGVfdHlwZV07Ci19Ci0KIC8qCiAgKiAgQ2FsaWJyYXRpb24KICAqLwpAQCAtMzMwLDcgKzMyMSw3IEBACiAJZW51bSBpd2xfdWNvZGVfdHlwZSBvbGRfdHlwZTsKIAlzdGF0aWMgY29uc3QgdTE2IGFsaXZlX2NtZFtdID0geyBSRVBMWV9BTElWRSB9OwogCi0JZncgPSBpd2xfZ2V0X3Vjb2RlX2ltYWdlKHByaXYsIHVjb2RlX3R5cGUpOworCWZ3ID0gaXdsX2dldF91Y29kZV9pbWFnZShwcml2LT5mdywgdWNvZGVfdHlwZSk7CiAJaWYgKFdBUk5fT04oIWZ3KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLTcwMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLTcwMDAuYwppbmRleCA2NDY5MGMxNC4uZDRiNzNkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtNzAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLTcwMDAuYwpAQCAtNzMsMTMgKzczLDEzIEBACiAvKiBIaWdoZXN0IGZpcm13YXJlIEFQSSB2ZXJzaW9uIHN1cHBvcnRlZCAqLwogI2RlZmluZSBJV0w3MjYwX1VDT0RFX0FQSV9NQVgJMTcKICNkZWZpbmUgSVdMNzI2NV9VQ09ERV9BUElfTUFYCTE3Ci0jZGVmaW5lIElXTDcyNjVEX1VDT0RFX0FQSV9NQVgJMjQKLSNkZWZpbmUgSVdMMzE2OF9VQ09ERV9BUElfTUFYCTI0CisjZGVmaW5lIElXTDcyNjVEX1VDT0RFX0FQSV9NQVgJMjYKKyNkZWZpbmUgSVdMMzE2OF9VQ09ERV9BUElfTUFYCTI2CiAKIC8qIExvd2VzdCBmaXJtd2FyZSBBUEkgdmVyc2lvbiBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgSVdMNzI2MF9VQ09ERV9BUElfTUlOCTE2Ci0jZGVmaW5lIElXTDcyNjVfVUNPREVfQVBJX01JTgkxNgotI2RlZmluZSBJV0w3MjY1RF9VQ09ERV9BUElfTUlOCTE2CisjZGVmaW5lIElXTDcyNjBfVUNPREVfQVBJX01JTgkxNworI2RlZmluZSBJV0w3MjY1X1VDT0RFX0FQSV9NSU4JMTcKKyNkZWZpbmUgSVdMNzI2NURfVUNPREVfQVBJX01JTgkxNwogI2RlZmluZSBJV0wzMTY4X1VDT0RFX0FQSV9NSU4JMjAKIAogLyogTlZNIHZlcnNpb25zICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC04MDAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC04MDAwLmMKaW5kZXggNmM2NzI1ZS4uZDAyY2ExNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtODAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLTgwMDAuYwpAQCAtNzAsMTEgKzcwLDExIEBACiAjaW5jbHVkZSAiaXdsLWFnbi1ody5oIgogCiAvKiBIaWdoZXN0IGZpcm13YXJlIEFQSSB2ZXJzaW9uIHN1cHBvcnRlZCAqLwotI2RlZmluZSBJV0w4MDAwX1VDT0RFX0FQSV9NQVgJMjQKLSNkZWZpbmUgSVdMODI2NV9VQ09ERV9BUElfTUFYCTI0CisjZGVmaW5lIElXTDgwMDBfVUNPREVfQVBJX01BWAkyNgorI2RlZmluZSBJV0w4MjY1X1VDT0RFX0FQSV9NQVgJMjYKIAogLyogTG93ZXN0IGZpcm13YXJlIEFQSSB2ZXJzaW9uIHN1cHBvcnRlZCAqLwotI2RlZmluZSBJV0w4MDAwX1VDT0RFX0FQSV9NSU4JMTYKKyNkZWZpbmUgSVdMODAwMF9VQ09ERV9BUElfTUlOCTE3CiAjZGVmaW5lIElXTDgyNjVfVUNPREVfQVBJX01JTgkyMAogCiAvKiBOVk0gdmVyc2lvbnMgKi8KQEAgLTIxMiw2ICsyMTIsMTcgQEAKIAkudmh0X211X21pbW9fc3VwcG9ydGVkID0gdHJ1ZSwKIH07CiAKK2NvbnN0IHN0cnVjdCBpd2xfY2ZnIGl3bDgyNzVfMmFjX2NmZyA9IHsKKwkubmFtZSA9ICJJbnRlbChSKSBEdWFsIEJhbmQgV2lyZWxlc3MgQUMgODI3NSIsCisJLmZ3X25hbWVfcHJlID0gSVdMODI2NV9GV19QUkUsCisJSVdMX0RFVklDRV84MjY1LAorCS5odF9wYXJhbXMgPSAmaXdsODAwMF9odF9wYXJhbXMsCisJLm52bV92ZXIgPSBJV0w4MDAwX05WTV9WRVJTSU9OLAorCS5udm1fY2FsaWJfdmVyID0gSVdMODAwMF9UWF9QT1dFUl9WRVJTSU9OLAorCS5tYXhfaHRfYW1wZHVfZXhwb25lbnQgPSBJRUVFODAyMTFfSFRfTUFYX0FNUERVXzY0SywKKwkudmh0X211X21pbW9fc3VwcG9ydGVkID0gdHJ1ZSwKK307CisKIGNvbnN0IHN0cnVjdCBpd2xfY2ZnIGl3bDQxNjVfMmFjX2NmZyA9IHsKIAkubmFtZSA9ICJJbnRlbChSKSBEdWFsIEJhbmQgV2lyZWxlc3MgQUMgNDE2NSIsCiAJLmZ3X25hbWVfcHJlID0gSVdMODAwMF9GV19QUkUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC05MDAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC05MDAwLmMKaW5kZXggZmJhZjcwNS4uZmY4NTA0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtOTAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLTkwMDAuYwpAQCAtNTUsMTAgKzU1LDEwIEBACiAjaW5jbHVkZSAiaXdsLWFnbi1ody5oIgogCiAvKiBIaWdoZXN0IGZpcm13YXJlIEFQSSB2ZXJzaW9uIHN1cHBvcnRlZCAqLwotI2RlZmluZSBJV0w5MDAwX1VDT0RFX0FQSV9NQVgJMjQKKyNkZWZpbmUgSVdMOTAwMF9VQ09ERV9BUElfTUFYCTI2CiAKIC8qIExvd2VzdCBmaXJtd2FyZSBBUEkgdmVyc2lvbiBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgSVdMOTAwMF9VQ09ERV9BUElfTUlOCTE2CisjZGVmaW5lIElXTDkwMDBfVUNPREVfQVBJX01JTgkxNwogCiAvKiBOVk0gdmVyc2lvbnMgKi8KICNkZWZpbmUgSVdMOTAwMF9OVk1fVkVSU0lPTgkJMHgwYTFkCkBAIC03MiwxNSArNzIsMTUgQEAKICNkZWZpbmUgSVdMOTAwMF9TTUVNX09GRlNFVAkJMHg0MDAwMDAKICNkZWZpbmUgSVdMOTAwMF9TTUVNX0xFTgkJMHg2ODAwMAogCi0jZGVmaW5lICBJV0w5MDAwX0ZXX1BSRSAiaXdsd2lmaS05MDAwLXB1LWEwLWxjLWEwLSIKKyNkZWZpbmUgIElXTDkwMDBfRldfUFJFICJpd2x3aWZpLTkwMDAtcHUtYTAtamYtYTAtIgogI2RlZmluZSAgSVdMOTI2MF9GV19QUkUgIml3bHdpZmktOTI2MC10aC1hMC1qZi1hMC0iCi0jZGVmaW5lICBJV0w5MjYwTENfRldfUFJFICJpd2x3aWZpLTkyNjAtdGgtYTAtbGMtYTAtIgorI2RlZmluZSAgSVdMOTAwMExDX0ZXX1BSRSAiaXdsd2lmaS05MDAwLXB1LWEwLWxjLWEwLSIKICNkZWZpbmUgSVdMOTAwMF9NT0RVTEVfRklSTVdBUkUoYXBpKSBcCiAJSVdMOTAwMF9GV19QUkUgIi0iIF9fc3RyaW5naWZ5KGFwaSkgIi51Y29kZSIKICNkZWZpbmUgSVdMOTI2MF9NT0RVTEVfRklSTVdBUkUoYXBpKSBcCiAJSVdMOTI2MF9GV19QUkUgIi0iIF9fc3RyaW5naWZ5KGFwaSkgIi51Y29kZSIKLSNkZWZpbmUgSVdMOTI2MExDX01PRFVMRV9GSVJNV0FSRShhcGkpIFwKLQlJV0w5MjYwTENfRldfUFJFICItIiBfX3N0cmluZ2lmeShhcGkpICIudWNvZGUiCisjZGVmaW5lIElXTDkwMDBMQ19NT0RVTEVfRklSTVdBUkUoYXBpKSBcCisJSVdMOTAwMExDX0ZXX1BSRSAiLSIgX19zdHJpbmdpZnkoYXBpKSAiLnVjb2RlIgogCiAjZGVmaW5lIE5WTV9IV19TRUNUSU9OX05VTV9GQU1JTFlfOTAwMAkJMTAKIApAQCAtMTQ2LDQxICsxNDYsNzMgQEAKIAkubWFjX2FkZHJfZnJvbV9jc3IgPSB0cnVlLAkJCQkJXAogCS5yZl9pZCA9IHRydWUKIAorY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsOTE2MF8yYWNfY2ZnID0geworCS5uYW1lID0gIkludGVsKFIpIER1YWwgQmFuZCBXaXJlbGVzcyBBQyA5MTYwIiwKKwkuZndfbmFtZV9wcmUgPSBJV0w5MjYwX0ZXX1BSRSwKKwlJV0xfREVWSUNFXzkwMDAsCisJLmh0X3BhcmFtcyA9ICZpd2w5MDAwX2h0X3BhcmFtcywKKwkubnZtX3ZlciA9IElXTDkwMDBfTlZNX1ZFUlNJT04sCisJLm52bV9jYWxpYl92ZXIgPSBJV0w5MDAwX1RYX1BPV0VSX1ZFUlNJT04sCisJLm1heF9odF9hbXBkdV9leHBvbmVudCA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLLAorfTsKKwogY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsOTI2MF8yYWNfY2ZnID0gewotCQkubmFtZSA9ICJJbnRlbChSKSBEdWFsIEJhbmQgV2lyZWxlc3MgQUMgOTI2MCIsCi0JCS5md19uYW1lX3ByZSA9IElXTDkyNjBfRldfUFJFLAotCQlJV0xfREVWSUNFXzkwMDAsCi0JCS5odF9wYXJhbXMgPSAmaXdsOTAwMF9odF9wYXJhbXMsCi0JCS5udm1fdmVyID0gSVdMOTAwMF9OVk1fVkVSU0lPTiwKLQkJLm52bV9jYWxpYl92ZXIgPSBJV0w5MDAwX1RYX1BPV0VSX1ZFUlNJT04sCi0JCS5tYXhfaHRfYW1wZHVfZXhwb25lbnQgPSBJRUVFODAyMTFfSFRfTUFYX0FNUERVXzY0SywKKwkubmFtZSA9ICJJbnRlbChSKSBEdWFsIEJhbmQgV2lyZWxlc3MgQUMgOTI2MCIsCisJLmZ3X25hbWVfcHJlID0gSVdMOTI2MF9GV19QUkUsCisJSVdMX0RFVklDRV85MDAwLAorCS5odF9wYXJhbXMgPSAmaXdsOTAwMF9odF9wYXJhbXMsCisJLm52bV92ZXIgPSBJV0w5MDAwX05WTV9WRVJTSU9OLAorCS5udm1fY2FsaWJfdmVyID0gSVdMOTAwMF9UWF9QT1dFUl9WRVJTSU9OLAorCS5tYXhfaHRfYW1wZHVfZXhwb25lbnQgPSBJRUVFODAyMTFfSFRfTUFYX0FNUERVXzY0SywKK307CisKK2NvbnN0IHN0cnVjdCBpd2xfY2ZnIGl3bDkyNzBfMmFjX2NmZyA9IHsKKwkubmFtZSA9ICJJbnRlbChSKSBEdWFsIEJhbmQgV2lyZWxlc3MgQUMgOTI3MCIsCisJLmZ3X25hbWVfcHJlID0gSVdMOTI2MF9GV19QUkUsCisJSVdMX0RFVklDRV85MDAwLAorCS5odF9wYXJhbXMgPSAmaXdsOTAwMF9odF9wYXJhbXMsCisJLm52bV92ZXIgPSBJV0w5MDAwX05WTV9WRVJTSU9OLAorCS5udm1fY2FsaWJfdmVyID0gSVdMOTAwMF9UWF9QT1dFUl9WRVJTSU9OLAorCS5tYXhfaHRfYW1wZHVfZXhwb25lbnQgPSBJRUVFODAyMTFfSFRfTUFYX0FNUERVXzY0SywKK307CisKK2NvbnN0IHN0cnVjdCBpd2xfY2ZnIGl3bDk0NjBfMmFjX2NmZyA9IHsKKwkubmFtZSA9ICJJbnRlbChSKSBEdWFsIEJhbmQgV2lyZWxlc3MgQUMgOTQ2MCIsCisJLmZ3X25hbWVfcHJlID0gSVdMOTAwMF9GV19QUkUsCisJSVdMX0RFVklDRV85MDAwLAorCS5odF9wYXJhbXMgPSAmaXdsOTAwMF9odF9wYXJhbXMsCisJLm52bV92ZXIgPSBJV0w5MDAwX05WTV9WRVJTSU9OLAorCS5udm1fY2FsaWJfdmVyID0gSVdMOTAwMF9UWF9QT1dFUl9WRVJTSU9OLAorCS5tYXhfaHRfYW1wZHVfZXhwb25lbnQgPSBJRUVFODAyMTFfSFRfTUFYX0FNUERVXzY0SywKKwkuaW50ZWdyYXRlZCA9IHRydWUsCit9OworCitjb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2w5NTYwXzJhY19jZmcgPSB7CisJLm5hbWUgPSAiSW50ZWwoUikgRHVhbCBCYW5kIFdpcmVsZXNzIEFDIDk1NjAiLAorCS5md19uYW1lX3ByZSA9IElXTDkwMDBfRldfUFJFLAorCUlXTF9ERVZJQ0VfOTAwMCwKKwkuaHRfcGFyYW1zID0gJml3bDkwMDBfaHRfcGFyYW1zLAorCS5udm1fdmVyID0gSVdMOTAwMF9OVk1fVkVSU0lPTiwKKwkubnZtX2NhbGliX3ZlciA9IElXTDkwMDBfVFhfUE9XRVJfVkVSU0lPTiwKKwkubWF4X2h0X2FtcGR1X2V4cG9uZW50ID0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV82NEssCisJLmludGVncmF0ZWQgPSB0cnVlLAogfTsKIAogLyoKICAqIFRPRE8gdGhlIHN0cnVjdCBiZWxvdyBpcyBmb3IgaW50ZXJuYWwgdGVzdGluZyBvbmx5IHRoaXMgc2hvdWxkIGJlCiAgKiByZW1vdmVkIGJ5IEVPIDIwMTZ+CiAgKi8KLWNvbnN0IHN0cnVjdCBpd2xfY2ZnIGl3bDkyNjBsY18yYWNfY2ZnID0gewotCQkubmFtZSA9ICJJbnRlbChSKSBEdWFsIEJhbmQgV2lyZWxlc3MgQUMgOTI2MCIsCi0JCS5md19uYW1lX3ByZSA9IElXTDkyNjBMQ19GV19QUkUsCi0JCUlXTF9ERVZJQ0VfOTAwMCwKLQkJLmh0X3BhcmFtcyA9ICZpd2w5MDAwX2h0X3BhcmFtcywKLQkJLm52bV92ZXIgPSBJV0w5MDAwX05WTV9WRVJTSU9OLAotCQkubnZtX2NhbGliX3ZlciA9IElXTDkwMDBfVFhfUE9XRVJfVkVSU0lPTiwKLQkJLm1heF9odF9hbXBkdV9leHBvbmVudCA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLLAotfTsKLQotY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsNTE2NV8yYWNfY2ZnID0gewotCQkubmFtZSA9ICJJbnRlbChSKSBEdWFsIEJhbmQgV2lyZWxlc3MgQUMgNTE2NSIsCi0JCS5md19uYW1lX3ByZSA9IElXTDkwMDBfRldfUFJFLAotCQlJV0xfREVWSUNFXzkwMDAsCi0JCS5odF9wYXJhbXMgPSAmaXdsOTAwMF9odF9wYXJhbXMsCi0JCS5udm1fdmVyID0gSVdMOTAwMF9OVk1fVkVSU0lPTiwKLQkJLm52bV9jYWxpYl92ZXIgPSBJV0w5MDAwX1RYX1BPV0VSX1ZFUlNJT04sCi0JCS5tYXhfaHRfYW1wZHVfZXhwb25lbnQgPSBJRUVFODAyMTFfSFRfTUFYX0FNUERVXzY0SywKLQkJLmludGVncmF0ZWQgPSB0cnVlLAorY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsOTAwMGxjXzJhY19jZmcgPSB7CisJLm5hbWUgPSAiSW50ZWwoUikgRHVhbCBCYW5kIFdpcmVsZXNzIEFDIDkwMDAiLAorCS5md19uYW1lX3ByZSA9IElXTDkwMDBMQ19GV19QUkUsCisJSVdMX0RFVklDRV85MDAwLAorCS5odF9wYXJhbXMgPSAmaXdsOTAwMF9odF9wYXJhbXMsCisJLm52bV92ZXIgPSBJV0w5MDAwX05WTV9WRVJTSU9OLAorCS5udm1fY2FsaWJfdmVyID0gSVdMOTAwMF9UWF9QT1dFUl9WRVJTSU9OLAorCS5tYXhfaHRfYW1wZHVfZXhwb25lbnQgPSBJRUVFODAyMTFfSFRfTUFYX0FNUERVXzY0SywKKwkuaW50ZWdyYXRlZCA9IHRydWUsCiB9OwogCiBNT0RVTEVfRklSTVdBUkUoSVdMOTAwMF9NT0RVTEVfRklSTVdBUkUoSVdMOTAwMF9VQ09ERV9BUElfTUFYKSk7CiBNT0RVTEVfRklSTVdBUkUoSVdMOTI2MF9NT0RVTEVfRklSTVdBUkUoSVdMOTAwMF9VQ09ERV9BUElfTUFYKSk7Ci1NT0RVTEVfRklSTVdBUkUoSVdMOTI2MExDX01PRFVMRV9GSVJNV0FSRShJV0w5MDAwX1VDT0RFX0FQSV9NQVgpKTsKK01PRFVMRV9GSVJNV0FSRShJV0w5MDAwTENfTU9EVUxFX0ZJUk1XQVJFKElXTDkwMDBfVUNPREVfQVBJX01BWCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtYTAwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtYTAwMC5jCmluZGV4IDRkNzgyMzIuLmVhMTYxODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLWEwMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1hMDAwLmMKQEAgLTU1LDcgKzU1LDcgQEAKICNpbmNsdWRlICJpd2wtYWduLWh3LmgiCiAKIC8qIEhpZ2hlc3QgZmlybXdhcmUgQVBJIHZlcnNpb24gc3VwcG9ydGVkICovCi0jZGVmaW5lIElXTF9BMDAwX1VDT0RFX0FQSV9NQVgJMjQKKyNkZWZpbmUgSVdMX0EwMDBfVUNPREVfQVBJX01BWAkyNgogCiAvKiBMb3dlc3QgZmlybXdhcmUgQVBJIHZlcnNpb24gc3VwcG9ydGVkICovCiAjZGVmaW5lIElXTF9BMDAwX1VDT0RFX0FQSV9NSU4JMjQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLWNvbmZpZy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtY29uZmlnLmgKaW5kZXggNDIzYjIzMy4uMjY2MGNjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtY29uZmlnLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtY29uZmlnLmgKQEAgLTM1OSw3ICszNTksNiBAQAogCSAgICBoaWdoX3RlbXA6MSwKIAkgICAgbWFjX2FkZHJfZnJvbV9jc3I6MSwKIAkgICAgbHBfeHRhbF93b3JrYXJvdW5kOjEsCi0JICAgIG5vX3Bvd2VyX3VwX25pY19pbl9pbml0OjEsCiAJICAgIGRpc2FibGVfZHVtbXlfbm90aWZpY2F0aW9uOjEsCiAJICAgIGFwbWdfbm90X3N1cHBvcnRlZDoxLAogCSAgICBtcV9yeF9zdXBwb3J0ZWQ6MSwKQEAgLTQ0NSwxMyArNDQ0LDE3IEBACiBleHRlcm4gY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsODI2MF8ybl9jZmc7CiBleHRlcm4gY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsODI2MF8yYWNfY2ZnOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpd2xfY2ZnIGl3bDgyNjVfMmFjX2NmZzsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2w4Mjc1XzJhY19jZmc7CiBleHRlcm4gY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsNDE2NV8yYWNfY2ZnOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpd2xfY2ZnIGl3bDgyNjBfMmFjX3NkaW9fY2ZnOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpd2xfY2ZnIGl3bDgyNjVfMmFjX3NkaW9fY2ZnOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpd2xfY2ZnIGl3bDQxNjVfMmFjX3NkaW9fY2ZnOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBpd2xfY2ZnIGl3bDkwMDBsY18yYWNfY2ZnOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBpd2xfY2ZnIGl3bDkxNjBfMmFjX2NmZzsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2w5MjYwXzJhY19jZmc7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsOTI2MGxjXzJhY19jZmc7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsNTE2NV8yYWNfY2ZnOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBpd2xfY2ZnIGl3bDkyNzBfMmFjX2NmZzsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2w5NDYwXzJhY19jZmc7CitleHRlcm4gY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsOTU2MF8yYWNfY2ZnOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpd2xfY2ZnIGl3bGEwMDBfMmFjX2NmZzsKICNlbmRpZiAvKiBDT05GSUdfSVdMTVZNICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLWNzci5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtY3NyLmgKaW5kZXggODcxYWQwMi4uZDczZTlkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtY3NyLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtY3NyLmgKQEAgLTU4OSw2ICs1ODksOCBAQAogICogQ2F1c2VzIGZvciB0aGUgRkggcmVnaXN0ZXIgaW50ZXJydXB0cwogICovCiBlbnVtIG1zaXhfZmhfaW50X2NhdXNlcyB7CisJTVNJWF9GSF9JTlRfQ0FVU0VTX1EwCQkJPSBCSVQoMCksCisJTVNJWF9GSF9JTlRfQ0FVU0VTX1ExCQkJPSBCSVQoMSksCiAJTVNJWF9GSF9JTlRfQ0FVU0VTX0QyU19DSDBfTlVNCQk9IEJJVCgxNiksCiAJTVNJWF9GSF9JTlRfQ0FVU0VTX0QyU19DSDFfTlVNCQk9IEJJVCgxNyksCiAJTVNJWF9GSF9JTlRfQ0FVU0VTX1MyRAkJCT0gQklUKDE5KSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLWRldnRyYWNlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1kZXZ0cmFjZS5jCmluZGV4IDFkOWRkMTUzLi41MDUxMGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1kZXZ0cmFjZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLWRldnRyYWNlLmMKQEAgLTMzLDkgKzMzLDYgQEAKICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwogI2luY2x1ZGUgIml3bC1kZXZ0cmFjZS5oIgogCi1FWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0woaXdsd2lmaV9kZXZfaW93cml0ZTgpOwotRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MKGl3bHdpZmlfZGV2X2lvcmVhZDMyKTsKLUVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTChpd2x3aWZpX2Rldl9pb3dyaXRlMzIpOwogRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MKGl3bHdpZmlfZGV2X3Vjb2RlX2V2ZW50KTsKIEVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTChpd2x3aWZpX2Rldl91Y29kZV9lcnJvcik7CiBFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0woaXdsd2lmaV9kZXZfdWNvZGVfY29udF9ldmVudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1maC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtZmguaAppbmRleCAxZDZmNWQyLi4zM2VmNTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1maC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLWZoLmgKQEAgLTc3LDcgKzc3LDYgQEAKICAqLwogI2RlZmluZSBGSF9NRU1fTE9XRVJfQk9VTkQgICAgICAgICAgICAgICAgICAgKDB4MTAwMCkKICNkZWZpbmUgRkhfTUVNX1VQUEVSX0JPVU5EICAgICAgICAgICAgICAgICAgICgweDIwMDApCi0jZGVmaW5lIFRGSF9NRU1fTE9XRVJfQk9VTkQgICAgICAgICAgICAgICAgICAoMHhBMDYwMDApCiAKIC8qKgogICogS2VlcC1XYXJtIChLVykgYnVmZmVyIGJhc2UgYWRkcmVzcy4KQEAgLTEyMCw3ICsxMTksNyBAQAogI2RlZmluZSBGSF9NRU1fQ0JCQ18yMF8zMV9MT1dFUl9CT1VORAkJKEZIX01FTV9MT1dFUl9CT1VORCArIDB4QjIwKQogI2RlZmluZSBGSF9NRU1fQ0JCQ18yMF8zMV9VUFBFUl9CT1VORAkJKEZIX01FTV9MT1dFUl9CT1VORCArIDB4QjgwKQogLyogYTAwMCBURkQgdGFibGUgYWRkcmVzcywgNjQgYml0ICovCi0jZGVmaW5lIFRGSF9URkRRX0NCQl9UQUJMRQkJCShURkhfTUVNX0xPV0VSX0JPVU5EICsgMHgxQzAwKQorI2RlZmluZSBURkhfVEZEUV9DQkJfVEFCTEUJCQkoMHgxQzAwKQogCiAvKiBGaW5kIFRGRCBDQiBiYXNlIHBvaW50ZXIgZm9yIGdpdmVuIHF1ZXVlICovCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBGSF9NRU1fQ0JCQ19RVUVVRShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKQEAgLTE1Niw3ICsxNTUsNyBAQAogICogSW4gY2FzZSBvZiBEUkFNIHJlYWQgYWRkcmVzcyB3aGljaCBpcyBub3QgYWxpZ25lZCB0byAxMjhCLCB0aGUgVEZIIHdpbGwKICAqIGVuYWJsZSB0cmFuc2ZlciBzaXplIHdoaWNoIGRvZXNuJ3QgY3Jvc3MgNjRCIERSQU0gYWRkcmVzcyBib3VuZGFyeS4KICovCi0jZGVmaW5lIFRGSF9UUkFOU0ZFUl9NT0RFCQkoVEZIX01FTV9MT1dFUl9CT1VORCArIDB4MUY0MCkKKyNkZWZpbmUgVEZIX1RSQU5TRkVSX01PREUJCSgweDFGNDApCiAjZGVmaW5lIFRGSF9UUkFOU0ZFUl9NQVhfUEVORElOR19SRVEJMHhjCiAjZGVmaW5lIFRGSF9DSFVOS19TSVpFXzEyOAkJCUJJVCg4KQogI2RlZmluZSBURkhfQ0hVTktfU1BMSVRfTU9ERQkJQklUKDEwKQpAQCAtMTY3LDcgKzE2Niw3IEBACiAgKiB0aGUgc3RhcnQgb2YgdGhlIFRGRCBmaXJzdCBUQi4KICAqIEluIGNhc2Ugb2YgYSBEUkFNIFR4IENNRCB1cGRhdGUgdGhlIFRGSCB3aWxsIHVwZGF0ZSBQTiBhbmQgS2V5IElECiAgKi8KLSNkZWZpbmUgVEZIX1RYQ01EX1VQREFURV9DRkcJCShURkhfTUVNX0xPV0VSX0JPVU5EICsgMHgxRjQ4KQorI2RlZmluZSBURkhfVFhDTURfVVBEQVRFX0NGRwkJKDB4MUY0OCkKIC8qCiAgKiBDb250cm9scyBUWCBETUEgb3BlcmF0aW9uCiAgKgpAQCAtMTgxLDIyICsxODAsMjIgQEAKICAqIHNldCB0byAxIC0gaW50ZXJydXB0IGlzIHNlbnQgdG8gdGhlIGRyaXZlcgogICogQml0IDA6IEluZGljYXRlcyB0aGUgc25vb3AgY29uZmlndXJhdGlvbgogKi8KLSNkZWZpbmUgVEZIX1NSVl9ETUFfQ0hOTDBfQ1RSTAkoVEZIX01FTV9MT1dFUl9CT1VORCArIDB4MUY2MCkKKyNkZWZpbmUgVEZIX1NSVl9ETUFfQ0hOTDBfQ1RSTAkoMHgxRjYwKQogI2RlZmluZSBURkhfU1JWX0RNQV9TTk9PUAlCSVQoMCkKICNkZWZpbmUgVEZIX1NSVl9ETUFfVE9fRFJJVkVSCUJJVCgyNCkKICNkZWZpbmUgVEZIX1NSVl9ETUFfU1RBUlQJQklUKDMxKQogCiAvKiBEZWZpbmVzIHRoZSBETUEgU1JBTSB3cml0ZSBzdGFydCBhZGRyZXNzIHRvIHRyYW5zZmVyIGEgZGF0YSBibG9jayAqLwotI2RlZmluZSBURkhfU1JWX0RNQV9DSE5MMF9TUkFNX0FERFIJKFRGSF9NRU1fTE9XRVJfQk9VTkQgKyAweDFGNjQpCisjZGVmaW5lIFRGSF9TUlZfRE1BX0NITkwwX1NSQU1fQUREUgkoMHgxRjY0KQogCiAvKiBEZWZpbmVzIHRoZSA2NGJpdHMgRFJBTSBzdGFydCBhZGRyZXNzIHRvIHJlYWQgdGhlIERNQSBkYXRhIGJsb2NrIGZyb20gKi8KLSNkZWZpbmUgVEZIX1NSVl9ETUFfQ0hOTDBfRFJBTV9BRERSCShURkhfTUVNX0xPV0VSX0JPVU5EICsgMHgxRjY4KQorI2RlZmluZSBURkhfU1JWX0RNQV9DSE5MMF9EUkFNX0FERFIJKDB4MUY2OCkKIAogLyoKICAqIERlZmluZXMgdGhlIG51bWJlciBvZiBieXRlcyB0byB0cmFuc2ZlciBmcm9tIERSQU0gdG8gU1JBTS4KICAqIE5vdGUgdGhhdCB0aGlzIHJlZ2lzdGVyIG1heSBiZSBjb25maWd1cmVkIHdpdGggbm9uLWR3b3JkIGFsaWduZWQgc2l6ZS4KICAqLwotI2RlZmluZSBURkhfU1JWX0RNQV9DSE5MMF9CQwkoVEZIX01FTV9MT1dFUl9CT1VORCArIDB4MUY3MCkKKyNkZWZpbmUgVEZIX1NSVl9ETUFfQ0hOTDBfQkMJKDB4MUY3MCkKIAogLyoqCiAgKiBSeCBTUkFNIENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlcnMgKFJTQ1NSKQpAQCAtNjQ0LDYgKzY0Myw3IEBACiAjZGVmaW5lIFRGRF9RVUVVRV9CQ19TSVpFCShURkRfUVVFVUVfU0laRV9NQVggKyBURkRfUVVFVUVfU0laRV9CQ19EVVApCiAjZGVmaW5lIElXTF9UWF9ETUFfTUFTSyAgICAgICAgRE1BX0JJVF9NQVNLKDM2KQogI2RlZmluZSBJV0xfTlVNX09GX1RCUwkJMjAKKyNkZWZpbmUgSVdMX1RGSF9OVU1fVEJTCQkyNQogCiBzdGF0aWMgaW5saW5lIHU4IGl3bF9nZXRfZG1hX2hpX2FkZHIoZG1hX2FkZHJfdCBhZGRyKQogewpAQCAtNjY1LDI1ICs2NjUsMjkgQEAKIH0gX19wYWNrZWQ7CiAKIC8qKgotICogc3RydWN0IGl3bF90ZmQKKyAqIHN0cnVjdCBpd2xfdGZoX3RiIHRyYW5zbWl0IGJ1ZmZlciBkZXNjcmlwdG9yIHdpdGhpbiB0cmFuc21pdCBmcmFtZSBkZXNjcmlwdG9yCiAgKgotICogVHJhbnNtaXQgRnJhbWUgRGVzY3JpcHRvciAoVEZEKQorICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgZG1hIGFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0cmFuc21pc3Npb24gYWRkcmVzcwogICoKLSAqIEAgX19yZXNlcnZlZDFbM10gcmVzZXJ2ZWQKLSAqIEAgbnVtX3RicyAwLTQgbnVtYmVyIG9mIGFjdGl2ZSB0YnMKLSAqCSAgICAgNSAgIHJlc2VydmVkCi0gKiAJICAgICA2LTcgcGFkZGluZyAobm90IHVzZWQpCi0gKiBAIHRic1syMF0JdHJhbnNtaXQgZnJhbWUgYnVmZmVyIGRlc2NyaXB0b3JzCi0gKiBAIF9fcGFkIAlwYWRkaW5nCi0gKgorICogQHRiX2xlbiBsZW5ndGggb2YgdGhlIHR4IGJ1ZmZlcgorICogQGFkZHIgNjQgYml0cyBkbWEgYWRkcmVzcworICovCitzdHJ1Y3QgaXdsX3RmaF90YiB7CisJX19sZTE2IHRiX2xlbjsKKwlfX2xlNjQgYWRkcjsKK30gX19wYWNrZWQ7CisKKy8qKgogICogRWFjaCBUeCBxdWV1ZSB1c2VzIGEgY2lyY3VsYXIgYnVmZmVyIG9mIDI1NiBURkRzIHN0b3JlZCBpbiBob3N0IERSQU0uCiAgKiBCb3RoIGRyaXZlciBhbmQgZGV2aWNlIHNoYXJlIHRoZXNlIGNpcmN1bGFyIGJ1ZmZlcnMsIGVhY2ggb2Ygd2hpY2ggbXVzdCBiZQotICogY29udGlndW91cyAyNTYgVEZEcyB4IDEyOCBieXRlcy1wZXItVEZEID0gMzIgS0J5dGVzCisgKiBjb250aWd1b3VzIDI1NiBURkRzLgorICogRm9yIHByZSBhMDAwIEhXIGl0IGlzIDI1NiB4IDEyOCBieXRlcy1wZXItVEZEID0gMzIgS0J5dGVzCisgKiBGb3IgYTAwMCBIVyBhbmQgb24gaXQgaXMgMjU2IHggMjU2IGJ5dGVzLXBlci1URkQgPSA2NSBLQnl0ZXMKICAqCiAgKiBEcml2ZXIgbXVzdCBpbmRpY2F0ZSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgYmFzZSBvZiBlYWNoCiAgKiBjaXJjdWxhciBidWZmZXIgdmlhIHRoZSBGSF9NRU1fQ0JCQ19RVUVVRSByZWdpc3RlcnMuCiAgKgotICogRWFjaCBURkQgY29udGFpbnMgcG9pbnRlci9zaXplIGluZm9ybWF0aW9uIGZvciB1cCB0byAyMCBkYXRhIGJ1ZmZlcnMKKyAqIEVhY2ggVEZEIGNvbnRhaW5zIHBvaW50ZXIvc2l6ZSBpbmZvcm1hdGlvbiBmb3IgdXAgdG8gMjAgLyAyNSBkYXRhIGJ1ZmZlcnMKICAqIGluIGhvc3QgRFJBTS4gIFRoZXNlIGJ1ZmZlcnMgY29sbGVjdGl2ZWx5IGNvbnRhaW4gdGhlIChvbmUpIGZyYW1lIGRlc2NyaWJlZAogICogYnkgdGhlIFRGRC4gIEVhY2ggYnVmZmVyIG11c3QgYmUgYSBzaW5nbGUgY29udGlndW91cyBibG9jayBvZiBtZW1vcnkgd2l0aGluCiAgKiBpdHNlbGYsIGJ1dCBidWZmZXJzIG1heSBiZSBzY2F0dGVyZWQgaW4gaG9zdCBEUkFNLiAgRWFjaCBidWZmZXIgaGFzIG1heCBzaXplCkBAIC02OTIsNiArNjk2LDE2IEBACiAgKgogICogQSBtYXhpbXVtIG9mIDI1NSAobm90IDI1NiEpIFRGRHMgbWF5IGJlIG9uIGEgcXVldWUgd2FpdGluZyBmb3IgVHguCiAgKi8KKworLyoqCisgKiBzdHJ1Y3QgaXdsX3RmZCAtIFRyYW5zbWl0IEZyYW1lIERlc2NyaXB0b3IgKFRGRCkKKyAqIEAgX19yZXNlcnZlZDFbM10gcmVzZXJ2ZWQKKyAqIEAgbnVtX3RicyAwLTQgbnVtYmVyIG9mIGFjdGl2ZSB0YnMKKyAqCSAgICAgNSAgIHJlc2VydmVkCisgKgkgICAgIDYtNyBwYWRkaW5nIChub3QgdXNlZCkKKyAqIEAgdGJzWzIwXQl0cmFuc21pdCBmcmFtZSBidWZmZXIgZGVzY3JpcHRvcnMKKyAqIEAgX19wYWQJcGFkZGluZworICovCiBzdHJ1Y3QgaXdsX3RmZCB7CiAJdTggX19yZXNlcnZlZDFbM107CiAJdTggbnVtX3RiczsKQEAgLTY5OSw2ICs3MTMsMTkgQEAKIAlfX2xlMzIgX19wYWQ7CiB9IF9fcGFja2VkOwogCisvKioKKyAqIHN0cnVjdCBpd2xfdGZoX3RmZCAtIFRyYW5zbWl0IEZyYW1lIERlc2NyaXB0b3IgKFRGRCkKKyAqIEAgbnVtX3RicyAwLTQgbnVtYmVyIG9mIGFjdGl2ZSB0YnMKKyAqCSAgICAgNSAtMTUgICByZXNlcnZlZAorICogQCB0YnNbMjVdCXRyYW5zbWl0IGZyYW1lIGJ1ZmZlciBkZXNjcmlwdG9ycworICogQCBfX3BhZAlwYWRkaW5nCisgKi8KK3N0cnVjdCBpd2xfdGZoX3RmZCB7CisJX19sZTE2IG51bV90YnM7CisJc3RydWN0IGl3bF90ZmhfdGIgdGJzW0lXTF9URkhfTlVNX1RCU107CisJX19sZTMyIF9fcGFkOworfSBfX3BhY2tlZDsKKwogLyogS2VlcCBXYXJtIFNpemUgKi8KICNkZWZpbmUgSVdMX0tXX1NJWkUgMHgxMDAwCS8qIDRrICovCiAKQEAgLTcwNyw4ICs3MzQsMTMgQEAKIC8qKgogICogc3RydWN0IGl3bGFnbl9zY2hlZHFfYmNfdGJsIHNjaGVkdWxlciBieXRlIGNvdW50IHRhYmxlCiAgKgliYXNlIHBoeXNpY2FsIGFkZHJlc3MgcHJvdmlkZWQgYnkgU0NEX0RSQU1fQkFTRV9BRERSCisgKiBGb3IgZGV2aWNlcyB1cCB0byBhMDAwOgogICogQHRmZF9vZmZzZXQgIDAtMTIgLSB0eCBjb21tYW5kIGJ5dGUgY291bnQKLSAqCSAgICAgICAxMi0xNiAtIHN0YXRpb24gaW5kZXgKKyAqCQkxMi0xNiAtIHN0YXRpb24gaW5kZXgKKyAqIEZvciBhMDAwIGFuZCBvbjoKKyAqIEB0ZmRfb2Zmc2V0ICAwLTEyIC0gdHggY29tbWFuZCBieXRlIGNvdW50CisgKgkJMTItMTMgLSBudW1iZXIgb2YgNjQgYnl0ZSBjaHVua3MKKyAqCQkxNC0xNiAtIHJlc2VydmVkCiAgKi8KIHN0cnVjdCBpd2xhZ25fc2NkX2JjX3RibCB7CiAJX19sZTE2IHRmZF9vZmZzZXRbVEZEX1FVRVVFX0JDX1NJWkVdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtZnctZmlsZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtZnctZmlsZS5oCmluZGV4IDFiMWUwNDUuLmNlZWM1Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLWZ3LWZpbGUuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1mdy1maWxlLmgKQEAgLTE5OSw4ICsxOTksNiBAQAogICogQElXTF9VQ09ERV9UTFZfRkxBR1NfTkVXU0NBTjogbmV3IHVDb2RlIHNjYW4gYmVoYXZpb3Igb24gaGlkZGVuIFNTSUQsCiAgKgl0cmVhdHMgZ29vZCBDUkMgdGhyZXNob2xkIGFzIGEgYm9vbGVhbgogICogQElXTF9VQ09ERV9UTFZfRkxBR1NfTUZQOiBUaGlzIHVDb2RlIGltYWdlIHN1cHBvcnRzIE1GUCAoODAyLjExdykuCi0gKiBASVdMX1VDT0RFX1RMVl9GTEFHU19QMlA6IFRoaXMgdUNvZGUgaW1hZ2Ugc3VwcG9ydHMgUDJQLgotICogQElXTF9VQ09ERV9UTFZfRkxBR1NfRFdfQkNfVEFCTEU6IFRoZSBTQ0QgYnl0ZSBjb3VudCB0YWJsZSBpcyBpbiBEV09SRFMKICAqIEBJV0xfVUNPREVfVExWX0ZMQUdTX1VBUFNEX1NVUFBPUlQ6IFRoaXMgdUNvZGUgaW1hZ2Ugc3VwcG9ydHMgdUFQU0QKICAqIEBJV0xfVUNPREVfVExWX0ZMQUdTX1NIT1JUX0JMOiAxNiBlbnRyaWVzIG9mIGJsYWNrIGxpc3QgaW5zdGVhZCBvZiA2NCBpbiBzY2FuCiAgKglvZmZsb2FkIHByb2ZpbGUgY29uZmlnIGNvbW1hbmQuCkBAIC0yMTAsMzYgKzIwOCwyNCBAQAogICoJZnJvbSB0aGUgcHJvYmUgcmVxdWVzdCB0ZW1wbGF0ZS4KICAqIEBJV0xfVUNPREVfVExWX0ZMQUdTX05FV19OU09GRkxfU01BTEw6IG5ldyBOUyBvZmZsb2FkIChzbWFsbCB2ZXJzaW9uKQogICogQElXTF9VQ09ERV9UTFZfRkxBR1NfTkVXX05TT0ZGTF9MQVJHRTogbmV3IE5TIG9mZmxvYWQgKGxhcmdlIHZlcnNpb24pCi0gKiBASVdMX1VDT0RFX1RMVl9GTEFHU19QMlBfUE06IFAyUCBjbGllbnQgc3VwcG9ydHMgUE0gYXMgYSBzdGFuZCBhbG9uZSBNQUMKLSAqIEBJV0xfVUNPREVfVExWX0ZMQUdTX1AyUF9CU1NfUFNfRENNOiBzdXBwb3J0IHBvd2VyIHNhdmUgb24gQlNTIHN0YXRpb24gYW5kCi0gKglQMlAgY2xpZW50IGludGVyZmFjZXMgc2ltdWx0YW5lb3VzbHkgaWYgdGhleSBhcmUgaW4gZGlmZmVyZW50IGJpbmRpbmdzLgotICogQElXTF9VQ09ERV9UTFZfRkxBR1NfUDJQX0JTU19QU19TQ006IHN1cHBvcnQgcG93ZXIgc2F2ZSBvbiBCU1Mgc3RhdGlvbiBhbmQKLSAqCVAyUCBjbGllbnQgaW50ZXJmYWNlcyBzaW11bHRhbmVvdXNseSBpZiB0aGV5IGFyZSBpbiBzYW1lIGJpbmRpbmdzLgogICogQElXTF9VQ09ERV9UTFZfRkxBR1NfVUFQU0RfU1VQUE9SVDogR2VuZXJhbCBzdXBwb3J0IGZvciB1QVBTRAogICogQElXTF9VQ09ERV9UTFZfRkxBR1NfUDJQX1BTX1VBUFNEOiBQMlAgY2xpZW50IHN1cHBvcnRzIHVBUFNEIHBvd2VyIHNhdmUKICAqIEBJV0xfVUNPREVfVExWX0ZMQUdTX0JDQVNUX0ZJTFRFUklORzogdUNvZGUgc3VwcG9ydHMgYnJvYWRjYXN0IGZpbHRlcmluZy4KLSAqIEBJV0xfVUNPREVfVExWX0ZMQUdTX0dPX1VBUFNEOiBBUC9HTyBpbnRlcmZhY2VzIHN1cHBvcnQgdUFQU0QgY2xpZW50cwogICogQElXTF9VQ09ERV9UTFZfRkxBR1NfRUJTX1NVUFBPUlQ6IHRoaXMgdUNvZGUgaW1hZ2Ugc3VwcG9ydHMgRUJTLgogICovCiBlbnVtIGl3bF91Y29kZV90bHZfZmxhZyB7CiAJSVdMX1VDT0RFX1RMVl9GTEFHU19QQU4JCQk9IEJJVCgwKSwKIAlJV0xfVUNPREVfVExWX0ZMQUdTX05FV1NDQU4JCT0gQklUKDEpLAogCUlXTF9VQ09ERV9UTFZfRkxBR1NfTUZQCQkJPSBCSVQoMiksCi0JSVdMX1VDT0RFX1RMVl9GTEFHU19QMlAJCQk9IEJJVCgzKSwKLQlJV0xfVUNPREVfVExWX0ZMQUdTX0RXX0JDX1RBQkxFCQk9IEJJVCg0KSwKIAlJV0xfVUNPREVfVExWX0ZMQUdTX1NIT1JUX0JMCQk9IEJJVCg3KSwKIAlJV0xfVUNPREVfVExWX0ZMQUdTX0QzXzZfSVBWNl9BRERSUwk9IEJJVCgxMCksCiAJSVdMX1VDT0RFX1RMVl9GTEFHU19OT19CQVNJQ19TU0lECT0gQklUKDEyKSwKIAlJV0xfVUNPREVfVExWX0ZMQUdTX05FV19OU09GRkxfU01BTEwJPSBCSVQoMTUpLAogCUlXTF9VQ09ERV9UTFZfRkxBR1NfTkVXX05TT0ZGTF9MQVJHRQk9IEJJVCgxNiksCi0JSVdMX1VDT0RFX1RMVl9GTEFHU19QMlBfUE0JCT0gQklUKDIxKSwKLQlJV0xfVUNPREVfVExWX0ZMQUdTX0JTU19QMlBfUFNfRENNCT0gQklUKDIyKSwKLQlJV0xfVUNPREVfVExWX0ZMQUdTX0JTU19QMlBfUFNfU0NNCT0gQklUKDIzKSwKIAlJV0xfVUNPREVfVExWX0ZMQUdTX1VBUFNEX1NVUFBPUlQJPSBCSVQoMjQpLAogCUlXTF9VQ09ERV9UTFZfRkxBR1NfRUJTX1NVUFBPUlQJCT0gQklUKDI1KSwKIAlJV0xfVUNPREVfVExWX0ZMQUdTX1AyUF9QU19VQVBTRAk9IEJJVCgyNiksCiAJSVdMX1VDT0RFX1RMVl9GTEFHU19CQ0FTVF9GSUxURVJJTkcJPSBCSVQoMjkpLAotCUlXTF9VQ09ERV9UTFZfRkxBR1NfR09fVUFQU0QJCT0gQklUKDMwKSwKIH07CiAKIHR5cGVkZWYgdW5zaWduZWQgaW50IF9fYml0d2lzZV9fIGl3bF91Y29kZV90bHZfYXBpX3Q7CkBAIC0yNDksMjQgKzIzNSwyMSBAQAogICogQElXTF9VQ09ERV9UTFZfQVBJX0ZSQUdNRU5URURfU0NBTjogVGhpcyB1Y29kZSBzdXBwb3J0cyBhY3RpdmUgZHdlbGwgdGltZQogICoJbG9uZ2VyIHRoYW4gdGhlIHBhc3NpdmUgb25lLCB3aGljaCBpcyBlc3NlbnRpYWwgZm9yIGZyYWdtZW50ZWQgc2Nhbi4KICAqIEBJV0xfVUNPREVfVExWX0FQSV9XSUZJX01DQ19VUERBVEU6IHVjb2RlIHN1cHBvcnRzIE1DQyB1cGRhdGVzIHdpdGggc291cmNlLgotICogQElXTF9VQ09ERV9UTFZfQVBJX1dJREVfQ01EX0hEUjogdWNvZGUgc3VwcG9ydHMgd2lkZSBjb21tYW5kIGhlYWRlcgogICogQElXTF9VQ09ERV9UTFZfQVBJX0xRX1NTX1BBUkFNUzogQ29uZmlndXJlIFNUQkMvQkZFUiB2aWEgTFEgQ01EIHNzX3BhcmFtcwogICogQElXTF9VQ09ERV9UTFZfQVBJX05FV19WRVJTSU9OOiBuZXcgdmVyc2lvbmluZyBmb3JtYXQKLSAqIEBJV0xfVUNPREVfVExWX0FQSV9FWFRfU0NBTl9QUklPUklUWTogc2NhbiBBUElzIHVzZSA4LWxldmVsIHByaW9yaXR5Ci0gKglpbnN0ZWFkIG9mIDMuCi0gKiBASVdMX1VDT0RFX1RMVl9BUElfVFhfUE9XRVJfQ0hBSU46IFRYIHBvd2VyIEFQSSBoYXMgbGFyZ2VyIGNvbW1hbmQgc2l6ZQotICoJKGNvbW1hbmQgdmVyc2lvbiAzKSB0aGF0IHN1cHBvcnRzIHBlci1jaGFpbiBsaW1pdHMKKyAqIEBJV0xfVUNPREVfVExWX0FQSV9TQ0FOX1RTRl9SRVBPUlQ6IFNjYW4gc3RhcnQgdGltZSByZXBvcnRlZCBpbiBzY2FuCisgKglpdGVyYXRpb24gY29tcGxldGUgbm90aWZpY2F0aW9uLCBhbmQgdGhlIHRpbWVzdGFtcCByZXBvcnRlZCBmb3IgUlgKKyAqCXJlY2VpdmVkIGR1cmluZyBzY2FuLCBhcmUgcmVwb3J0ZWQgaW4gVFNGIG9mIHRoZSBtYWMgc3BlY2lmaWVkIGluIHRoZQorICoJc2NhbiByZXF1ZXN0LgogICoKICAqIEBOVU1fSVdMX1VDT0RFX1RMVl9BUEk6IG51bWJlciBvZiBiaXRzIHVzZWQKICAqLwogZW51bSBpd2xfdWNvZGVfdGx2X2FwaSB7CiAJSVdMX1VDT0RFX1RMVl9BUElfRlJBR01FTlRFRF9TQ0FOCT0gKF9fZm9yY2UgaXdsX3Vjb2RlX3Rsdl9hcGlfdCk4LAogCUlXTF9VQ09ERV9UTFZfQVBJX1dJRklfTUNDX1VQREFURQk9IChfX2ZvcmNlIGl3bF91Y29kZV90bHZfYXBpX3QpOSwKLQlJV0xfVUNPREVfVExWX0FQSV9XSURFX0NNRF9IRFIJCT0gKF9fZm9yY2UgaXdsX3Vjb2RlX3Rsdl9hcGlfdCkxNCwKIAlJV0xfVUNPREVfVExWX0FQSV9MUV9TU19QQVJBTVMJCT0gKF9fZm9yY2UgaXdsX3Vjb2RlX3Rsdl9hcGlfdCkxOCwKLQlJV0xfVUNPREVfVExWX0FQSV9ORVdfVkVSU0lPTiAgICAgICAgICAgPSAoX19mb3JjZSBpd2xfdWNvZGVfdGx2X2FwaV90KTIwLAotCUlXTF9VQ09ERV9UTFZfQVBJX0VYVF9TQ0FOX1BSSU9SSVRZCT0gKF9fZm9yY2UgaXdsX3Vjb2RlX3Rsdl9hcGlfdCkyNCwKLQlJV0xfVUNPREVfVExWX0FQSV9UWF9QT1dFUl9DSEFJTgk9IChfX2ZvcmNlIGl3bF91Y29kZV90bHZfYXBpX3QpMjcsCisJSVdMX1VDT0RFX1RMVl9BUElfTkVXX1ZFUlNJT04JCT0gKF9fZm9yY2UgaXdsX3Vjb2RlX3Rsdl9hcGlfdCkyMCwKKwlJV0xfVUNPREVfVExWX0FQSV9TQ0FOX1RTRl9SRVBPUlQJPSAoX19mb3JjZSBpd2xfdWNvZGVfdGx2X2FwaV90KTI4LAogCiAJTlVNX0lXTF9VQ09ERV9UTFZfQVBJCiAjaWZkZWYgX19DSEVDS0VSX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLWZ3LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1mdy5oCmluZGV4IDc0ZWE2OGQuLjVmMjI5NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLWZ3LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtZncuaApAQCAtMzI5LDQgKzMyOSwxMyBAQAogCXJldHVybiBjb25mX3Rsdi0+dXNuaWZmZXI7CiB9CiAKK3N0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IGZ3X2ltZyAqCitpd2xfZ2V0X3Vjb2RlX2ltYWdlKGNvbnN0IHN0cnVjdCBpd2xfZncgKmZ3LCBlbnVtIGl3bF91Y29kZV90eXBlIHVjb2RlX3R5cGUpCit7CisJaWYgKHVjb2RlX3R5cGUgPj0gSVdMX1VDT0RFX1RZUEVfTUFYKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiAmZnctPmltZ1t1Y29kZV90eXBlXTsKK30KKwogI2VuZGlmICAvKiBfX2l3bF9md19oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLWlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1pby5jCmluZGV4IDkyYzhiNWYuLmE5ZjY5ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLWlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtaW8uYwpAQCAtMjY3LDcgKzI2Nyw3IEBACiAJCUlXTF9DTURfTVEoY21kLCBSRkhfUV9GUkJEQ0JfV0lEWCwgaSk7CiAJCUlXTF9DTURfTVEoY21kLCBSRkhfUV9GUkJEQ0JfUklEWCwgaSk7CiAJCUlXTF9DTURfTVEoY21kLCBSRkhfUV9VUkJEX1NUVFNfV1BUUl9MU0IsIGkpOwotCX07CisJfQogCiAJc3dpdGNoIChjbWQpIHsKIAlJV0xfQ01EKFJGSF9SWEZfRE1BX0NGRyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1ub3RpZi13YWl0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1ub3RpZi13YWl0LmMKaW5kZXggOGFhMWYyYi4uODhmMjYwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtbm90aWYtd2FpdC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLW5vdGlmLXdhaXQuYwpAQCAtOTksOCArOTksMTIgQEAKIAkJCQljb250aW51ZTsKIAogCQkJZm9yIChpID0gMDsgaSA8IHctPm5fY21kczsgaSsrKSB7Ci0JCQkJaWYgKHctPmNtZHNbaV0gPT0KLQkJCQkgICAgV0lERV9JRChwa3QtPmhkci5ncm91cF9pZCwgcGt0LT5oZHIuY21kKSkgeworCQkJCXUxNiByZWNfaWQgPSBXSURFX0lEKHBrdC0+aGRyLmdyb3VwX2lkLAorCQkJCQkJICAgICBwa3QtPmhkci5jbWQpOworCisJCQkJaWYgKHctPmNtZHNbaV0gPT0gcmVjX2lkIHx8CisJCQkJICAgICghaXdsX2NtZF9ncm91cGlkKHctPmNtZHNbaV0pICYmCisJCQkJICAgICBERUZfSUQody0+Y21kc1tpXSkgPT0gcmVjX2lkKSkgewogCQkJCQlmb3VuZCA9IHRydWU7CiAJCQkJCWJyZWFrOwogCQkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLW52bS1wYXJzZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtbnZtLXBhcnNlLmMKaW5kZXggNDNmOGY3ZC4uM2JkNmZjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtbnZtLXBhcnNlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtbnZtLXBhcnNlLmMKQEAgLTY3LDYgKzY3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlICJpd2wtZHJ2LmgiCiAjaW5jbHVkZSAiaXdsLW1vZHBhcmFtcy5oIgogI2luY2x1ZGUgIml3bC1udm0tcGFyc2UuaCIKQEAgLTU2NCwxMSArNTY1LDE2IEBACiAJX19sZTMyIG1hY19hZGRyMCA9IGNwdV90b19sZTMyKGl3bF9yZWFkMzIodHJhbnMsIENTUl9NQUNfQUREUjBfU1RSQVApKTsKIAlfX2xlMzIgbWFjX2FkZHIxID0gY3B1X3RvX2xlMzIoaXdsX3JlYWQzMih0cmFucywgQ1NSX01BQ19BRERSMV9TVFJBUCkpOwogCi0JLyogSWYgT0VNIGRpZCBub3QgZnVzZSBhZGRyZXNzIC0gZ2V0IGl0IGZyb20gT1RQICovCi0JaWYgKCFtYWNfYWRkcjAgJiYgIW1hY19hZGRyMSkgewotCQltYWNfYWRkcjAgPSBjcHVfdG9fbGUzMihpd2xfcmVhZDMyKHRyYW5zLCBDU1JfTUFDX0FERFIwX09UUCkpOwotCQltYWNfYWRkcjEgPSBjcHVfdG9fbGUzMihpd2xfcmVhZDMyKHRyYW5zLCBDU1JfTUFDX0FERFIxX09UUCkpOwotCX0KKwlpd2xfZmxpcF9od19hZGRyZXNzKG1hY19hZGRyMCwgbWFjX2FkZHIxLCBkYXRhLT5od19hZGRyKTsKKwkvKgorCSAqIElmIHRoZSBPRU0gZnVzZWQgYSB2YWxpZCBhZGRyZXNzLCB1c2UgaXQgaW5zdGVhZCBvZiB0aGUgb25lIGluIHRoZQorCSAqIE9UUAorCSAqLworCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKGRhdGEtPmh3X2FkZHIpKQorCQlyZXR1cm47CisKKwltYWNfYWRkcjAgPSBjcHVfdG9fbGUzMihpd2xfcmVhZDMyKHRyYW5zLCBDU1JfTUFDX0FERFIwX09UUCkpOworCW1hY19hZGRyMSA9IGNwdV90b19sZTMyKGl3bF9yZWFkMzIodHJhbnMsIENTUl9NQUNfQUREUjFfT1RQKSk7CiAKIAlpd2xfZmxpcF9od19hZGRyZXNzKG1hY19hZGRyMCwgbWFjX2FkZHIxLCBkYXRhLT5od19hZGRyKTsKIH0KQEAgLTg5OSwzICs5MDUsOTEgQEAKIAlyZXR1cm4gcmVnZDsKIH0KIElXTF9FWFBPUlRfU1lNQk9MKGl3bF9wYXJzZV9udm1fbWNjX2luZm8pOworCisjaWZkZWYgQ09ORklHX0FDUEkKKyNkZWZpbmUgV1JERF9NRVRIT0QJCSJXUkREIgorI2RlZmluZSBXUkREX1dJRkkJCSgweDA3KQorI2RlZmluZSBXUkREX1dJR0lHCQkoMHgxMCkKKworc3RhdGljIHUzMiBpd2xfd3JkZF9nZXRfbWNjKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5pb24gYWNwaV9vYmplY3QgKndyZGQpCit7CisJdW5pb24gYWNwaV9vYmplY3QgKm1jY19wa2csICpkb21haW5fdHlwZSwgKm1jY192YWx1ZTsKKwl1MzIgaTsKKworCWlmICh3cmRkLT50eXBlICE9IEFDUElfVFlQRV9QQUNLQUdFIHx8CisJICAgIHdyZGQtPnBhY2thZ2UuY291bnQgPCAyIHx8CisJICAgIHdyZGQtPnBhY2thZ2UuZWxlbWVudHNbMF0udHlwZSAhPSBBQ1BJX1RZUEVfSU5URUdFUiB8fAorCSAgICB3cmRkLT5wYWNrYWdlLmVsZW1lbnRzWzBdLmludGVnZXIudmFsdWUgIT0gMCkgeworCQlJV0xfREVCVUdfRUVQUk9NKGRldiwgIlVuc3VwcG9ydGVkIHdyZGQgc3RydWN0dXJlXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMSA7IGkgPCB3cmRkLT5wYWNrYWdlLmNvdW50IDsgKytpKSB7CisJCW1jY19wa2cgPSAmd3JkZC0+cGFja2FnZS5lbGVtZW50c1tpXTsKKworCQlpZiAobWNjX3BrZy0+dHlwZSAhPSBBQ1BJX1RZUEVfUEFDS0FHRSB8fAorCQkgICAgbWNjX3BrZy0+cGFja2FnZS5jb3VudCA8IDIgfHwKKwkJICAgIG1jY19wa2ctPnBhY2thZ2UuZWxlbWVudHNbMF0udHlwZSAhPSBBQ1BJX1RZUEVfSU5URUdFUiB8fAorCQkgICAgbWNjX3BrZy0+cGFja2FnZS5lbGVtZW50c1sxXS50eXBlICE9IEFDUElfVFlQRV9JTlRFR0VSKSB7CisJCQltY2NfcGtnID0gTlVMTDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZG9tYWluX3R5cGUgPSAmbWNjX3BrZy0+cGFja2FnZS5lbGVtZW50c1swXTsKKwkJaWYgKGRvbWFpbl90eXBlLT5pbnRlZ2VyLnZhbHVlID09IFdSRERfV0lGSSkKKwkJCWJyZWFrOworCisJCW1jY19wa2cgPSBOVUxMOworCX0KKworCWlmIChtY2NfcGtnKSB7CisJCW1jY192YWx1ZSA9ICZtY2NfcGtnLT5wYWNrYWdlLmVsZW1lbnRzWzFdOworCQlyZXR1cm4gbWNjX3ZhbHVlLT5pbnRlZ2VyLnZhbHVlOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgaXdsX2dldF9iaW9zX21jYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKm1jYykKK3sKKwlhY3BpX2hhbmRsZSByb290X2hhbmRsZTsKKwlhY3BpX2hhbmRsZSBoYW5kbGU7CisJc3RydWN0IGFjcGlfYnVmZmVyIHdyZGQgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1MzIgbWNjX3ZhbDsKKworCXJvb3RfaGFuZGxlID0gQUNQSV9IQU5ETEUoZGV2KTsKKwlpZiAoIXJvb3RfaGFuZGxlKSB7CisJCUlXTF9ERUJVR19FRVBST00oZGV2LAorCQkJCSAiQ291bGQgbm90IHJldHJpZXZlIHJvb3QgcG9ydCBBQ1BJIGhhbmRsZVxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCS8qIEdldCB0aGUgbWV0aG9kJ3MgaGFuZGxlICovCisJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKHJvb3RfaGFuZGxlLCAoYWNwaV9zdHJpbmcpV1JERF9NRVRIT0QsCisJCQkJICZoYW5kbGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlJV0xfREVCVUdfRUVQUk9NKGRldiwgIldSRCBtZXRob2Qgbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJLyogQ2FsbCBXUkREIHdpdGggbm8gYXJndW1lbnRzICovCisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCBOVUxMLCBOVUxMLCAmd3JkZCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUlXTF9ERUJVR19FRVBST00oZGV2LCAiV1JEQyBpbnZvY2F0aW9uIGZhaWxlZCAoMHgleClcbiIsCisJCQkJIHN0YXR1cyk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCW1jY192YWwgPSBpd2xfd3JkZF9nZXRfbWNjKGRldiwgd3JkZC5wb2ludGVyKTsKKwlrZnJlZSh3cmRkLnBvaW50ZXIpOworCWlmICghbWNjX3ZhbCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwltY2NbMF0gPSAobWNjX3ZhbCA+PiA4KSAmIDB4ZmY7CisJbWNjWzFdID0gbWNjX3ZhbCAmIDB4ZmY7CisJbWNjWzJdID0gJ1wwJzsKKwlyZXR1cm4gMDsKK30KK0lXTF9FWFBPUlRfU1lNQk9MKGl3bF9nZXRfYmlvc19tY2MpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1udm0tcGFyc2UuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLW52bS1wYXJzZS5oCmluZGV4IGQ3MDRkNTIuLjcyNDllNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLW52bS1wYXJzZS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLW52bS1wYXJzZS5oCkBAIC01LDcgKzUsOCBAQAogICoKICAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKICAqCi0gKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTUgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQoYykgMjAxNiAgICAgICAgSW50ZWwgRGV1dHNjaGxhbmQgR21iSAogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwpAQCAtOTMsNCArOTQsMjEgQEAKIGl3bF9wYXJzZV9udm1fbWNjX2luZm8oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3QgaXdsX2NmZyAqY2ZnLAogCQkgICAgICAgaW50IG51bV9vZl9jaCwgX19sZTMyICpjaGFubmVscywgdTE2IGZ3X21jYyk7CiAKKyNpZmRlZiBDT05GSUdfQUNQSQorLyoqCisgKiBpd2xfZ2V0X2Jpb3NfbWNjIC0gcmVhZCBNQ0MgZnJvbSBCSU9TLCBpZiBhdmFpbGFibGUKKyAqCisgKiBAZGV2OiB0aGUgc3RydWN0IGRldmljZQorICogQG1jYzogb3V0cHV0IGJ1ZmZlciAoMyBieXRlcykgdGhhdCB3aWxsIGdldCB0aGUgTUNDCisgKgorICogVGhpcyBmdW5jdGlvbiB0cmllcyB0byByZWFkIHRoZSBjdXJyZW50IE1DQyBmcm9tIEFDUEkgaWYgYXZhaWxhYmxlLgorICovCitpbnQgaXdsX2dldF9iaW9zX21jYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKm1jYyk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgaXdsX2dldF9iaW9zX21jYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKm1jYykKK3sKKwlyZXR1cm4gLUVOT0VOVDsKK30KKyNlbmRpZgorCiAjZW5kaWYgLyogX19pd2xfbnZtX3BhcnNlX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtcGh5LWRiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1waHktZGIuYwppbmRleCA3YmViYTlhLi4yODkzODI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1waHktZGIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1waHktZGIuYwpAQCAtMTEwLDcgKzExMCw3IEBACiAJSVdMX1BIWV9EQl9NQVgKIH07CiAKLSNkZWZpbmUgUEhZX0RCX0NNRCAweDZjIC8qIFRFTVAgQVBJIC0gVGhlIGFjdHVhbCBpcyAweDhjICovCisjZGVmaW5lIFBIWV9EQl9DTUQgMHg2YwogCiAvKgogICogcGh5IGRiIC0gY29uZmlndXJlIG9wZXJhdGlvbmFsIHVjb2RlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1wcnBoLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1wcnBoLmgKaW5kZXggNDU5YmY3My4uNDA2ZWYzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtcHJwaC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLXBycGguaApAQCAtMzAyLDIyICszMDIsMTcgQEAKICNkZWZpbmUgT1NDX0NMS19GT1JDRV9DT05UUk9MCQkoMHg4KQogCiAjZGVmaW5lIEZIX1VDT0RFX0xPQURfU1RBVFVTCQkoMHgxQUYwKQotI2RlZmluZSBDU1JfVUNPREVfTE9BRF9TVEFUVVNfQUREUgkoMHgxRTcwKQotZW51bSBzZWN1cmVfbG9hZF9zdGF0dXNfcmVnIHsKLQlMTVBNX0NQVV9VQ09ERV9MT0FESU5HX1NUQVJURUQJCQk9IDB4MDAwMDAwMDEsCi0JTE1QTV9DUFVfSERSU19MT0FESU5HX0NPTVBMRVRFRAkJCT0gMHgwMDAwMDAwMywKLQlMTVBNX0NQVV9VQ09ERV9MT0FESU5HX0NPTVBMRVRFRAkJPSAweDAwMDAwMDA3LAotCUxNUE1fQ1BVX1NUQVRVU19OVU1fT0ZfTEFTVF9DT01QTEVURUQJCT0gMHgwMDAwMDBGOCwKLQlMTVBNX0NQVV9TVEFUVVNfTlVNX09GX0xBU1RfTE9BREVEX0JMT0NLCT0gMHgwMDAwRkYwMCwKLX07CiAKLSNkZWZpbmUgTE1QTV9TRUNVUkVfSU5TUEVDVE9SX0NPREVfQUREUgkoMHgxRTM4KQotI2RlZmluZSBMTVBNX1NFQ1VSRV9JTlNQRUNUT1JfREFUQV9BRERSCSgweDFFM0MpCisvKgorICogUmVwbGFjaW5nIEZIX1VDT0RFX0xPQURfU1RBVFVTCisgKiBUaGlzIHJlZ2lzdGVyIGlzIHdyaXRlbiBieSBkcml2ZXIgYW5kIGlzIHJlYWQgYnkgdUNvZGUgZHVyaW5nIGJvb3QgZmxvdy4KKyAqIE5vdGUgdGhpcyBhZGRyZXNzIGlzIGNsZWFyZWQgYWZ0ZXIgTUFDIHJlc2V0LgorICovCisjZGVmaW5lIFVSRUdfVUNPREVfTE9BRF9TVEFUVVMJCSgweGEwNWM0MCkKKwogI2RlZmluZSBMTVBNX1NFQ1VSRV9VQ09ERV9MT0FEX0NQVTFfSERSX0FERFIJKDB4MUU3OCkKICNkZWZpbmUgTE1QTV9TRUNVUkVfVUNPREVfTE9BRF9DUFUyX0hEUl9BRERSCSgweDFFN0MpCiAKLSNkZWZpbmUgTE1QTV9TRUNVUkVfSU5TUEVDVE9SX0NPREVfTUVNX1NQQUNFCSgweDQwMDAwMCkKLSNkZWZpbmUgTE1QTV9TRUNVUkVfSU5TUEVDVE9SX0RBVEFfTUVNX1NQQUNFCSgweDQwMjAwMCkKICNkZWZpbmUgTE1QTV9TRUNVUkVfQ1BVMV9IRFJfTUVNX1NQQUNFCQkoMHg0MjAwMDApCiAjZGVmaW5lIExNUE1fU0VDVVJFX0NQVTJfSERSX01FTV9TUEFDRQkJKDB4NDIwNDAwKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC10cmFucy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtdHJhbnMuYwppbmRleCA2MDY5YTlmLi5kNDJjYWIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC10cmFucy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLXRyYW5zLmMKQEAgLTY1LDYgKzY1LDcgQEAKIAogI2luY2x1ZGUgIml3bC10cmFucy5oIgogI2luY2x1ZGUgIml3bC1kcnYuaCIKKyNpbmNsdWRlICJpd2wtZmguaCIKIAogc3RydWN0IGl3bF90cmFucyAqaXdsX3RyYW5zX2FsbG9jKHVuc2lnbmVkIGludCBwcml2X3NpemUsCiAJCQkJICBzdHJ1Y3QgZGV2aWNlICpkZXYsCkBAIC03Nyw3ICs3OCw3IEBACiAJc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSBfX2tleTsKICNlbmRpZgogCi0JdHJhbnMgPSBremFsbG9jKHNpemVvZigqdHJhbnMpICsgcHJpdl9zaXplLCBHRlBfS0VSTkVMKTsKKwl0cmFucyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqdHJhbnMpICsgcHJpdl9zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRyYW5zKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMTAyLDE4ICsxMDMsMTQgQEAKIAkJCQkgIFNMQUJfSFdDQUNIRV9BTElHTiwKIAkJCQkgIE5VTEwpOwogCWlmICghdHJhbnMtPmRldl9jbWRfcG9vbCkKLQkJZ290byBmcmVlOworCQlyZXR1cm4gTlVMTDsKIAogCXJldHVybiB0cmFuczsKLSBmcmVlOgotCWtmcmVlKHRyYW5zKTsKLQlyZXR1cm4gTlVMTDsKIH0KIAogdm9pZCBpd2xfdHJhbnNfZnJlZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucykKIHsKIAlrbWVtX2NhY2hlX2Rlc3Ryb3kodHJhbnMtPmRldl9jbWRfcG9vbCk7Ci0Ja2ZyZWUodHJhbnMpOwogfQogCiBpbnQgaXdsX3RyYW5zX3NlbmRfY21kKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgaXdsX2hvc3RfY21kICpjbWQpCkBAIC0xMzksNiArMTM2LDkgQEAKIAlpZiAoIShjbWQtPmZsYWdzICYgQ01EX0FTWU5DKSkKIAkJbG9ja19tYXBfYWNxdWlyZV9yZWFkKCZ0cmFucy0+c3luY19jbWRfbG9ja2RlcF9tYXApOwogCisJaWYgKHRyYW5zLT53aWRlX2NtZF9oZWFkZXIgJiYgIWl3bF9jbWRfZ3JvdXBpZChjbWQtPmlkKSkKKwkJY21kLT5pZCA9IERFRl9JRChjbWQtPmlkKTsKKwogCXJldCA9IHRyYW5zLT5vcHMtPnNlbmRfY21kKHRyYW5zLCBjbWQpOwogCiAJaWYgKCEoY21kLT5mbGFncyAmIENNRF9BU1lOQykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC10cmFucy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtdHJhbnMuaAppbmRleCA1NTM1ZTIyLi4wMjk2MTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC10cmFucy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLXRyYW5zLmgKQEAgLTE1Myw2ICsxNTMsNyBAQAogCiAvKiBtYWtlIHUxNiB3aWRlIGlkIG91dCBvZiB1OCBncm91cCBhbmQgb3Bjb2RlICovCiAjZGVmaW5lIFdJREVfSUQoZ3JwLCBvcGNvZGUpICgoZ3JwIDw8IDgpIHwgb3Bjb2RlKQorI2RlZmluZSBERUZfSUQob3Bjb2RlKSAoKDEgPDwgOCkgfCAob3Bjb2RlKSkKIAogLyogZHVlIHRvIHRoZSBjb252ZXJzaW9uLCB0aGlzIGdyb3VwIGlzIHNwZWNpYWw7IG5ldyBncm91cHMKICAqIHNob3VsZCBiZSBkZWZpbmVkIGluIHRoZSBhcHByb3ByaWF0ZSBmdy1hcGkgaGVhZGVyIGZpbGVzCkBAIC0yNjIsOCArMjYzLDYgQEAKICAqCShpLmUuIG1hcmsgaXQgYXMgbm9uLWlkbGUpLgogICogQENNRF9XQU5UX0FTWU5DX0NBTExCQUNLOiB0aGUgb3BfbW9kZSdzIGFzeW5jIGNhbGxiYWNrIGZ1bmN0aW9uIG11c3QgYmUKICAqCWNhbGxlZCBhZnRlciB0aGlzIGNvbW1hbmQgY29tcGxldGVzLiBWYWxpZCBvbmx5IHdpdGggQ01EX0FTWU5DLgotICogQENNRF9UQl9CSVRNQVBfUE9TOiBQb3NpdGlvbiBvZiB0aGUgZmlyc3QgYml0IGZvciB0aGUgVEIgYml0bWFwLiBXZSBuZWVkIHRvCi0gKgljaGVjayB0aGF0IHdlIGxlYXZlIGVub3VnaCByb29tIGZvciB0aGUgVEJzIGJpdG1hcCB3aGljaCBuZWVkcyAyMCBiaXRzLgogICovCiBlbnVtIENNRF9NT0RFIHsKIAlDTURfQVNZTkMJCT0gQklUKDApLApAQCAtMjc0LDggKzI3Myw2IEBACiAJQ01EX01BS0VfVFJBTlNfSURMRQk9IEJJVCg1KSwKIAlDTURfV0FLRV9VUF9UUkFOUwk9IEJJVCg2KSwKIAlDTURfV0FOVF9BU1lOQ19DQUxMQkFDSwk9IEJJVCg3KSwKLQotCUNNRF9UQl9CSVRNQVBfUE9TCT0gMTEsCiB9OwogCiAjZGVmaW5lIERFRl9DTURfUEFZTE9BRF9TSVpFIDMyMApAQCAtNDg4LDcgKzQ4NSw2IEBACiAgKiBAYmNfdGFibGVfZHdvcmQ6IHNldCB0byB0cnVlIGlmIHRoZSBCQyB0YWJsZSBleHBlY3RzIHRoZSBieXRlIGNvdW50IHRvIGJlCiAgKglpbiBEV09SRCAoYXMgb3Bwb3NlZCB0byBieXRlcykKICAqIEBzY2Rfc2V0X2FjdGl2ZTogc2hvdWxkIHRoZSB0cmFuc3BvcnQgY29uZmlndXJlIHRoZSBTQ0QgZm9yIEhDTUQgcXVldWUKLSAqIEB3aWRlX2NtZF9oZWFkZXI6IGZpcm13YXJlIHN1cHBvcnRzIHdpZGUgaG9zdCBjb21tYW5kIGhlYWRlcgogICogQHN3X2NzdW1fdHg6IHRyYW5zcG9ydCBzaG91bGQgY29tcHV0ZSB0aGUgVENQIGNoZWNrc3VtCiAgKiBAY29tbWFuZF9ncm91cHM6IGFycmF5IG9mIGNvbW1hbmQgZ3JvdXBzLCBlYWNoIG1lbWJlciBpcyBhbiBhcnJheSBvZiB0aGUKICAqCWNvbW1hbmRzIGluIHRoZSBncm91cDsgZm9yIGRlYnVnZ2luZyBvbmx5CkBAIC01MTAsNyArNTA2LDYgQEAKIAllbnVtIGl3bF9hbXNkdV9zaXplIHJ4X2J1Zl9zaXplOwogCWJvb2wgYmNfdGFibGVfZHdvcmQ7CiAJYm9vbCBzY2Rfc2V0X2FjdGl2ZTsKLQlib29sIHdpZGVfY21kX2hlYWRlcjsKIAlib29sIHN3X2NzdW1fdHg7CiAJY29uc3Qgc3RydWN0IGl3bF9oY21kX2FyciAqY29tbWFuZF9ncm91cHM7CiAJaW50IGNvbW1hbmRfZ3JvdXBzX3NpemU7CkBAIC02NDksNiArNjQ0LDggQEAKIAl2b2lkICgqdHhxX3NldF9zaGFyZWRfbW9kZSkoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHUzMiB0eHFfaWQsCiAJCQkJICAgIGJvb2wgc2hhcmVkKTsKIAorCWRtYV9hZGRyX3QgKCpnZXRfdHhxX2J5dGVfdGFibGUpKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBpbnQgdHhxX2lkKTsKKwogCWludCAoKndhaXRfdHhfcXVldWVfZW1wdHkpKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCB1MzIgdHhxX2JtKTsKIAl2b2lkICgqZnJlZXplX3R4cV90aW1lcikoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHVuc2lnbmVkIGxvbmcgdHhxcywKIAkJCQkgYm9vbCBmcmVlemUpOwpAQCAtNzcyLDYgKzc2OSw3IEBACiAgKiBAaHdfaWRfc3RyOiBhIHN0cmluZyB3aXRoIGluZm8gYWJvdXQgSFcgSUQuIFNldCBkdXJpbmcgdHJhbnNwb3J0IGFsbG9jYXRpb24uCiAgKiBAcG1fc3VwcG9ydDogc2V0IHRvIHRydWUgaW4gc3RhcnRfaHcgaWYgbGluayBwbSBpcyBzdXBwb3J0ZWQKICAqIEBsdHJfZW5hYmxlZDogc2V0IHRvIHRydWUgaWYgdGhlIExUUiBpcyBlbmFibGVkCisgKiBAd2lkZV9jbWRfaGVhZGVyOiB0cnVlIHdoZW4gdWNvZGUgc3VwcG9ydHMgd2lkZSBjb21tYW5kIGhlYWRlciBmb3JtYXQKICAqIEBudW1fcnhfcXVldWVzOiBudW1iZXIgb2YgUlggcXVldWVzIGFsbG9jYXRlZCBieSB0aGUgdHJhbnNwb3J0OwogICoJdGhlIHRyYW5zcG9ydCBtdXN0IHNldCB0aGlzIGJlZm9yZSBjYWxsaW5nIGl3bF9kcnZfc3RhcnQoKQogICogQGRldl9jbWRfcG9vbDogcG9vbCBmb3IgVHggY21kIGFsbG9jYXRpb24gLSBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuCkBAIC04MjMsNiArODIxLDcgQEAKIAogCWNvbnN0IHN0cnVjdCBpd2xfaGNtZF9hcnIgKmNvbW1hbmRfZ3JvdXBzOwogCWludCBjb21tYW5kX2dyb3Vwc19zaXplOworCWJvb2wgd2lkZV9jbWRfaGVhZGVyOwogCiAJdTggbnVtX3J4X3F1ZXVlczsKIApAQCAtMTA3Myw2ICsxMDcyLDE1IEBACiAJCXRyYW5zLT5vcHMtPnR4cV9zZXRfc2hhcmVkX21vZGUodHJhbnMsIHF1ZXVlLCBzaGFyZWRfbW9kZSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBpd2xfdHJhbnNfZ2V0X3R4cV9ieXRlX3RhYmxlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAorCQkJCQkJICAgICAgaW50IHF1ZXVlKQoreworCS8qIHdlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgaWYgdGhlIHRyYW5zIGRvZXNuJ3Qgc3VwcG9ydCBpdCAqLworCUJVR19PTighdHJhbnMtPm9wcy0+Z2V0X3R4cV9ieXRlX3RhYmxlKTsKKworCXJldHVybiB0cmFucy0+b3BzLT5nZXRfdHhxX2J5dGVfdGFibGUodHJhbnMsIHF1ZXVlKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGl3bF90cmFuc190eHFfZW5hYmxlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBpbnQgcXVldWUsCiAJCQkJCWludCBmaWZvLCBpbnQgc3RhX2lkLCBpbnQgdGlkLAogCQkJCQlpbnQgZnJhbWVfbGltaXQsIHUxNiBzc24sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9kZWJ1Z2ZzLXZpZi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vZGVidWdmcy12aWYuYwppbmRleCBiMjMyNzE3Li4yZDZmNDRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9kZWJ1Z2ZzLXZpZi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2RlYnVnZnMtdmlmLmMKQEAgLTUwNCw2ICs1MDQsMjggQEAKIAlyZXR1cm4gIXN0cm5jbXAobmFtZSwgYnVmLCBsZW4pID8gYnVmICsgbGVuIDogTlVMTDsKIH0KIAorc3RhdGljIHNzaXplX3QgaXdsX2RiZ2ZzX29zX2RldmljZV90aW1lZGlmZl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkJIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpd2xfbXZtX3ZpZiAqbXZtdmlmID0gaXdsX212bV92aWZfZnJvbV9tYWM4MDIxMSh2aWYpOworCXN0cnVjdCBpd2xfbXZtICptdm0gPSBtdm12aWYtPm12bTsKKwl1MzIgY3Vycl9ncDI7CisJdTY0IGN1cnJfb3M7CisJczY0IGRpZmY7CisJY2hhciBidWZbNjRdOworCWNvbnN0IHNpemVfdCBidWZzeiA9IHNpemVvZihidWYpOworCWludCBwb3MgPSAwOworCisJaXdsX212bV9nZXRfc3luY190aW1lKG12bSwgJmN1cnJfZ3AyLCAmY3Vycl9vcyk7CisJZG9fZGl2KGN1cnJfb3MsIE5TRUNfUEVSX1VTRUMpOworCWRpZmYgPSBjdXJyX29zIC0gY3Vycl9ncDI7CisJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiZGlmZj0lbGxkXG4iLCBkaWZmKTsKKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKK30KKwogc3RhdGljIHNzaXplX3QgaXdsX2RiZ2ZzX3RvZl9lbmFibGVfd3JpdGUoc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJCQkJICBjaGFyICpidWYsCiAJCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCkBAIC0xNTMwLDYgKzE1NTIsOCBAQAogTVZNX0RFQlVHRlNfUkVBRF9XUklURV9GSUxFX09QUyh0b2ZfcmVzcG9uZGVyX3BhcmFtcywgMzIpOwogTVZNX0RFQlVHRlNfUkVBRF9XUklURV9GSUxFX09QUyhxdW90YV9taW4sIDMyKTsKIE1WTV9ERUJVR0ZTX1dSSVRFX0ZJTEVfT1BTKGxxbV9zZW5kX2NtZCwgNjQpOworTVZNX0RFQlVHRlNfUkVBRF9GSUxFX09QUyhvc19kZXZpY2VfdGltZWRpZmYpOworCiAKIHZvaWQgaXdsX212bV92aWZfZGJnZnNfcmVnaXN0ZXIoc3RydWN0IGl3bF9tdm0gKm12bSwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKIHsKQEAgLTE1NTQsOCArMTU3OCw3IEBACiAKIAlpZiAoaXdsbXZtX21vZF9wYXJhbXMucG93ZXJfc2NoZW1lICE9IElXTF9QT1dFUl9TQ0hFTUVfQ0FNICYmCiAJICAgICgodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYgIXZpZi0+cDJwKSB8fAotCSAgICAgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICYmIHZpZi0+cDJwICYmCi0JICAgICAgbXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfQlNTX1AyUF9QU19EQ00pKSkKKwkgICAgICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJiB2aWYtPnAycCkpKQogCQlNVk1fREVCVUdGU19BRERfRklMRV9WSUYocG1fcGFyYW1zLCBtdm12aWYtPmRiZ2ZzX2RpciwgU19JV1VTUiB8CiAJCQkJCSBTX0lSVVNSKTsKIApAQCAtMTU3MCw2ICsxNTkzLDggQEAKIAlNVk1fREVCVUdGU19BRERfRklMRV9WSUYocXVvdGFfbWluLCBtdm12aWYtPmRiZ2ZzX2RpciwKIAkJCQkgU19JUlVTUiB8IFNfSVdVU1IpOwogCU1WTV9ERUJVR0ZTX0FERF9GSUxFX1ZJRihscW1fc2VuZF9jbWQsIG12bXZpZi0+ZGJnZnNfZGlyLCBTX0lXVVNSKTsKKwlNVk1fREVCVUdGU19BRERfRklMRV9WSUYob3NfZGV2aWNlX3RpbWVkaWZmLAorCQkJCSBtdm12aWYtPmRiZ2ZzX2RpciwgU19JUlVTUik7CiAKIAlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYgIXZpZi0+cDJwICYmCiAJICAgIG12bXZpZiA9PSBtdm0tPmJmX2FsbG93ZWRfdmlmKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vZGVidWdmcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vZGVidWdmcy5jCmluZGV4IGIzNDQ4OTguLjUzOWQ3MTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2RlYnVnZnMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9kZWJ1Z2ZzLmMKQEAgLTkxNyw2ICs5MTcsNTkgQEAKIAlyZXR1cm4gcmV0ID86IGNvdW50OwogfQogCitzdGF0aWMgc3NpemVfdCBpd2xfZGJnZnNfaW5qZWN0X3BhY2tldF93cml0ZShzdHJ1Y3QgaXdsX212bSAqbXZtLAorCQkJCQkgICAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJCQkgICAgIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaXdsX3J4X2NtZF9idWZmZXIgcnhiID0geworCQkuX3J4X3BhZ2Vfb3JkZXIgPSAwLAorCQkudHJ1ZXNpemUgPSAwLCAvKiBub3QgdXNlZCAqLworCQkuX29mZnNldCA9IDAsCisJfTsKKwlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0OworCXN0cnVjdCBpd2xfcnhfbXBkdV9kZXNjICpkZXNjOworCWludCBiaW5fbGVuID0gY291bnQgLyAyOworCWludCByZXQgPSAtRUlOVkFMOworCisJLyogc3VwcG9ydGluZyBvbmx5IDkwMDAgZGVzY3JpcHRvciAqLworCWlmICghbXZtLT50cmFucy0+Y2ZnLT5tcV9yeF9zdXBwb3J0ZWQpCisJCXJldHVybiAtRU5PVFNVUFA7CisKKwlyeGIuX3BhZ2UgPSBhbGxvY19wYWdlcyhHRlBfQVRPTUlDLCAwKTsKKwlpZiAoIXJ4Yi5fcGFnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcGt0ID0gcnhiX2FkZHIoJnJ4Yik7CisKKwlyZXQgPSBoZXgyYmluKHBhZ2VfYWRkcmVzcyhyeGIuX3BhZ2UpLCBidWYsIGJpbl9sZW4pOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJLyogYXZvaWQgaW52YWxpZCBtZW1vcnkgYWNjZXNzICovCisJaWYgKGJpbl9sZW4gPCBzaXplb2YoKnBrdCkgKyBzaXplb2YoKmRlc2MpKQorCQlnb3RvIG91dDsKKworCS8qIGNoZWNrIHRoaXMgaXMgUlggcGFja2V0ICovCisJaWYgKFdJREVfSUQocGt0LT5oZHIuZ3JvdXBfaWQsIHBrdC0+aGRyLmNtZCkgIT0KKwkgICAgV0lERV9JRChMRUdBQ1lfR1JPVVAsIFJFUExZX1JYX01QRFVfQ01EKSkKKwkJZ290byBvdXQ7CisKKwkvKiBjaGVjayB0aGUgbGVuZ3RoIGluIG1ldGFkYXRhIG1hdGNoZXMgYWN0dWFsIHJlY2VpdmVkIGxlbmd0aCAqLworCWRlc2MgPSAodm9pZCAqKXBrdC0+ZGF0YTsKKwlpZiAobGUxNl90b19jcHUoZGVzYy0+bXBkdV9sZW4pICE9CisJICAgIChiaW5fbGVuIC0gc2l6ZW9mKCpkZXNjKSAtIHNpemVvZigqcGt0KSkpCisJCWdvdG8gb3V0OworCisJbG9jYWxfYmhfZGlzYWJsZSgpOworCWl3bF9tdm1fcnhfbXBkdV9tcShtdm0sIE5VTEwsICZyeGIsIDApOworCWxvY2FsX2JoX2VuYWJsZSgpOworCXJldCA9IDA7CisKK291dDoKKwlpd2xfZnJlZV9yeGIoJnJ4Yik7CisKKwlyZXR1cm4gcmV0ID86IGNvdW50OworfQorCiBzdGF0aWMgc3NpemVfdCBpd2xfZGJnZnNfZndfZGJnX2NvbmZfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCQkJICBjaGFyIF9fdXNlciAqdXNlcl9idWYsCiAJCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCkBAIC0xNDU0LDYgKzE1MDcsNyBAQAogTVZNX0RFQlVHRlNfV1JJVEVfRklMRV9PUFMobWF4X2Ftc2R1X2xlbiwgOCk7CiBNVk1fREVCVUdGU19XUklURV9GSUxFX09QUyhpbmRpcmVjdGlvbl90YmwsCiAJCQkgICAoSVdMX1JTU19JTkRJUkVDVElPTl9UQUJMRV9TSVpFICogMikpOworTVZNX0RFQlVHRlNfV1JJVEVfRklMRV9PUFMoaW5qZWN0X3BhY2tldCwgNTEyKTsKIAogI2lmZGVmIENPTkZJR19JV0xXSUZJX0JDQVNUX0ZJTFRFUklORwogTVZNX0RFQlVHRlNfUkVBRF9XUklURV9GSUxFX09QUyhiY2FzdF9maWx0ZXJzLCAyNTYpOwpAQCAtMTQ2NCw2ICsxNTE4LDEzMiBAQAogTVZNX0RFQlVHRlNfUkVBRF9XUklURV9GSUxFX09QUyhkM19zcmFtLCA4KTsKICNlbmRpZgogCitzdGF0aWMgc3NpemVfdCBpd2xfZGJnZnNfbWVtX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpd2xfbXZtICptdm0gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGl3bF9kYmdfbWVtX2FjY2Vzc19jbWQgY21kID0ge307CisJc3RydWN0IGl3bF9kYmdfbWVtX2FjY2Vzc19yc3AgKnJzcDsKKwlzdHJ1Y3QgaXdsX2hvc3RfY21kIGhjbWQgPSB7CisJCS5mbGFncyA9IENNRF9XQU5UX1NLQiB8IENNRF9TRU5EX0lOX1JGS0lMTCwKKwkJLmRhdGEgPSB7ICZjbWQsIH0sCisJCS5sZW4gPSB7IHNpemVvZihjbWQpIH0sCisJfTsKKwlzaXplX3QgZGVsdGEsIGxlbjsKKwlzc2l6ZV90IHJldDsKKworCWhjbWQuaWQgPSBpd2xfY21kX2lkKCpwcG9zID4+IDI0ID8gVU1BQ19SRF9XUiA6IExNQUNfUkRfV1IsCisJCQkgICAgIERFQlVHX0dST1VQLCAwKTsKKwljbWQub3AgPSBjcHVfdG9fbGUzMihERUJVR19NRU1fT1BfUkVBRCk7CisKKwkvKiBUYWtlIGNhcmUgb2YgYWxpZ25tZW50IG9mIGJvdGggdGhlIHBvc2l0aW9uIGFuZCB0aGUgbGVuZ3RoICovCisJZGVsdGEgPSAqcHBvcyAmIDB4MzsKKwljbWQuYWRkciA9IGNwdV90b19sZTMyKCpwcG9zIC0gZGVsdGEpOworCWNtZC5sZW4gPSBjcHVfdG9fbGUzMihtaW4oQUxJR04oY291bnQgKyBkZWx0YSwgNCkgLyA0LAorCQkJCSAgKHNpemVfdClERUJVR19NRU1fTUFYX1NJWkVfRFdPUkRTKSk7CisKKwltdXRleF9sb2NrKCZtdm0tPm11dGV4KTsKKwlyZXQgPSBpd2xfbXZtX3NlbmRfY21kKG12bSwgJmhjbWQpOworCW11dGV4X3VubG9jaygmbXZtLT5tdXRleCk7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJzcCA9ICh2b2lkICopaGNtZC5yZXNwX3BrdC0+ZGF0YTsKKwlpZiAobGUzMl90b19jcHUocnNwLT5zdGF0dXMpICE9IERFQlVHX01FTV9TVEFUVVNfU1VDQ0VTUykgeworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gb3V0OworCX0KKworCWxlbiA9IG1pbigoc2l6ZV90KWxlMzJfdG9fY3B1KHJzcC0+bGVuKSA8PCAyLAorCQkgIGl3bF9yeF9wYWNrZXRfcGF5bG9hZF9sZW4oaGNtZC5yZXNwX3BrdCkgLSBzaXplb2YoKnJzcCkpOworCWxlbiA9IG1pbihsZW4gLSBkZWx0YSwgY291bnQpOworCWlmIChsZW4gPCAwKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IGxlbiAtIGNvcHlfdG9fdXNlcih1c2VyX2J1ZiwgKHZvaWQgKilyc3AtPmRhdGEgKyBkZWx0YSwgbGVuKTsKKwkqcHBvcyArPSByZXQ7CisKK291dDoKKwlpd2xfZnJlZV9yZXNwKCZoY21kKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBpd2xfZGJnZnNfbWVtX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LAorCQkJCSAgIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaXdsX212bSAqbXZtID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpd2xfZGJnX21lbV9hY2Nlc3NfY21kICpjbWQ7CisJc3RydWN0IGl3bF9kYmdfbWVtX2FjY2Vzc19yc3AgKnJzcDsKKwlzdHJ1Y3QgaXdsX2hvc3RfY21kIGhjbWQgPSB7fTsKKwlzaXplX3QgY21kX3NpemU7CisJc2l6ZV90IGRhdGFfc2l6ZTsKKwl1MzIgb3AsIGxlbjsKKwlzc2l6ZV90IHJldDsKKworCWhjbWQuaWQgPSBpd2xfY21kX2lkKCpwcG9zID4+IDI0ID8gVU1BQ19SRF9XUiA6IExNQUNfUkRfV1IsCisJCQkgICAgIERFQlVHX0dST1VQLCAwKTsKKworCWlmICgqcHBvcyAmIDB4MyB8fCBjb3VudCA8IDQpIHsKKwkJb3AgPSBERUJVR19NRU1fT1BfV1JJVEVfQllURVM7CisJCWxlbiA9IG1pbihjb3VudCwgKHNpemVfdCkoNCAtICgqcHBvcyAmIDB4MykpKTsKKwkJZGF0YV9zaXplID0gbGVuOworCX0gZWxzZSB7CisJCW9wID0gREVCVUdfTUVNX09QX1dSSVRFOworCQlsZW4gPSBtaW4oY291bnQgPj4gMiwgKHNpemVfdClERUJVR19NRU1fTUFYX1NJWkVfRFdPUkRTKTsKKwkJZGF0YV9zaXplID0gbGVuIDw8IDI7CisJfQorCisJY21kX3NpemUgPSBzaXplb2YoKmNtZCkgKyBBTElHTihkYXRhX3NpemUsIDQpOworCWNtZCA9IGt6YWxsb2MoY21kX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghY21kKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNtZC0+b3AgPSBjcHVfdG9fbGUzMihvcCk7CisJY21kLT5sZW4gPSBjcHVfdG9fbGUzMihsZW4pOworCWNtZC0+YWRkciA9IGNwdV90b19sZTMyKCpwcG9zKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKiljbWQtPmRhdGEsIHVzZXJfYnVmLCBkYXRhX3NpemUpKSB7CisJCWtmcmVlKGNtZCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWhjbWQuZmxhZ3MgPSBDTURfV0FOVF9TS0IgfCBDTURfU0VORF9JTl9SRktJTEwsCisJaGNtZC5kYXRhWzBdID0gKHZvaWQgKiljbWQ7CisJaGNtZC5sZW5bMF0gPSBjbWRfc2l6ZTsKKworCW11dGV4X2xvY2soJm12bS0+bXV0ZXgpOworCXJldCA9IGl3bF9tdm1fc2VuZF9jbWQobXZtLCAmaGNtZCk7CisJbXV0ZXhfdW5sb2NrKCZtdm0tPm11dGV4KTsKKworCWtmcmVlKGNtZCk7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJzcCA9ICh2b2lkICopaGNtZC5yZXNwX3BrdC0+ZGF0YTsKKwlpZiAocnNwLT5zdGF0dXMgIT0gREVCVUdfTUVNX1NUQVRVU19TVUNDRVNTKSB7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gZGF0YV9zaXplOworCSpwcG9zICs9IHJldDsKKworb3V0OgorCWl3bF9mcmVlX3Jlc3AoJmhjbWQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGl3bF9kYmdmc19tZW1fb3BzID0geworCS5yZWFkID0gaXdsX2RiZ2ZzX21lbV9yZWFkLAorCS53cml0ZSA9IGl3bF9kYmdmc19tZW1fd3JpdGUsCisJLm9wZW4gPSBzaW1wbGVfb3BlbiwKKwkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCit9OworCiBpbnQgaXdsX212bV9kYmdmc19yZWdpc3RlcihzdHJ1Y3QgaXdsX212bSAqbXZtLCBzdHJ1Y3QgZGVudHJ5ICpkYmdmc19kaXIpCiB7CiAJc3RydWN0IGRlbnRyeSAqYmNhc3RfZGlyIF9fbWF5YmVfdW51c2VkOwpAQCAtMTUwMiw2ICsxNjgyLDcgQEAKIAlNVk1fREVCVUdGU19BRERfRklMRShzZW5kX2VjaG9fY21kLCBtdm0tPmRlYnVnZnNfZGlyLCBTX0lXVVNSKTsKIAlNVk1fREVCVUdGU19BRERfRklMRShjb250X3JlY29yZGluZywgbXZtLT5kZWJ1Z2ZzX2RpciwgU19JV1VTUik7CiAJTVZNX0RFQlVHRlNfQUREX0ZJTEUoaW5kaXJlY3Rpb25fdGJsLCBtdm0tPmRlYnVnZnNfZGlyLCBTX0lXVVNSKTsKKwlNVk1fREVCVUdGU19BRERfRklMRShpbmplY3RfcGFja2V0LCBtdm0tPmRlYnVnZnNfZGlyLCBTX0lXVVNSKTsKIAlpZiAoIWRlYnVnZnNfY3JlYXRlX2Jvb2woImVuYWJsZV9zY2FuX2l0ZXJhdGlvbl9ub3RpZiIsCiAJCQkJIFNfSVJVU1IgfCBTX0lXVVNSLAogCQkJCSBtdm0tPmRlYnVnZnNfZGlyLApAQCAtMTU2MCw2ICsxNzQxLDkgQEAKIAkJCQkgbXZtLT5kZWJ1Z2ZzX2RpciwgJm12bS0+bnZtX3BoeV9za3VfYmxvYikpCiAJCWdvdG8gZXJyOwogCisJZGVidWdmc19jcmVhdGVfZmlsZSgibWVtIiwgU19JUlVTUiB8IFNfSVdVU1IsIGRiZ2ZzX2RpciwgbXZtLAorCQkJICAgICZpd2xfZGJnZnNfbWVtX29wcyk7CisKIAkvKgogCSAqIENyZWF0ZSBhIHN5bWxpbmsgd2l0aCBtYWM4MDIxMS4gSXQgd2lsbCBiZSByZW1vdmVkIHdoZW4gbWFjODAyMTEKIAkgKiBleGlzdHMgKGJlZm9yZSB0aGUgb3Btb2RlIGV4aXN0cyB3aGljaCByZW1vdmVzIHRoZSB0YXJnZXQuKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vZnctYXBpLXBvd2VyLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1hcGktcG93ZXIuaAppbmRleCA0MDRiMGRlLi4zZmE0M2QxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1hcGktcG93ZXIuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1hcGktcG93ZXIuaApAQCAtMzEzLDM1ICszMTMsMjYgQEAKIAlJV0xfVFhfUE9XRVJfTU9ERV9TRVRfQUNLID0gMywKIH07IC8qIFRYX1BPV0VSX1JFRFVDRURfRkxBR1NfVFlQRV9BUElfRV9WRVJfNCAqLzsKIAorI2RlZmluZSBJV0xfTlVNX0NIQUlOX0xJTUlUUwkyCisjZGVmaW5lIElXTF9OVU1fU1VCX0JBTkRTCTUKKwogLyoqCi0gKiBzdHJ1Y3QgaXdsX2Rldl90eF9wb3dlcl9jbWRfdjIgLSBUWCBwb3dlciByZWR1Y3Rpb24gY29tbWFuZAorICogc3RydWN0IGl3bF9kZXZfdHhfcG93ZXJfY21kIC0gVFggcG93ZXIgcmVkdWN0aW9uIGNvbW1hbmQKICAqIEBzZXRfbW9kZTogc2VlICZlbnVtIGl3bF9kZXZfdHhfcG93ZXJfY21kX21vZGUKICAqIEBtYWNfY29udGV4dF9pZDogaWQgb2YgdGhlIG1hYyBjdHggZm9yIHdoaWNoIHdlIGFyZSByZWR1Y2luZyBUWCBwb3dlci4KICAqIEBwd3JfcmVzdHJpY3Rpb246IFRYIHBvd2VyIHJlc3RyaWN0aW9uIGluIDEvOCBkQm1zLgogICogQGRldl8yNDogZGV2aWNlIFRYIHBvd2VyIHJlc3RyaWN0aW9uIGluIDEvOCBkQm1zCiAgKiBAZGV2XzUyX2xvdzogZGV2aWNlIFRYIHBvd2VyIHJlc3RyaWN0aW9uIHVwcGVyIGJhbmQgLSBsb3cKICAqIEBkZXZfNTJfaGlnaDogZGV2aWNlIFRYIHBvd2VyIHJlc3RyaWN0aW9uIHVwcGVyIGJhbmQgLSBoaWdoCisgKiBAcGVyX2NoYWluX3Jlc3RyaWN0aW9uOiBwZXIgY2hhaW4gcmVzdHJpY3Rpb25zCiAgKi8KLXN0cnVjdCBpd2xfZGV2X3R4X3Bvd2VyX2NtZF92MiB7CitzdHJ1Y3QgaXdsX2Rldl90eF9wb3dlcl9jbWRfdjMgewogCV9fbGUzMiBzZXRfbW9kZTsKIAlfX2xlMzIgbWFjX2NvbnRleHRfaWQ7CiAJX19sZTE2IHB3cl9yZXN0cmljdGlvbjsKIAlfX2xlMTYgZGV2XzI0OwogCV9fbGUxNiBkZXZfNTJfbG93OwogCV9fbGUxNiBkZXZfNTJfaGlnaDsKLX0gX19wYWNrZWQ7IC8qIFRYX1JFRFVDRURfUE9XRVJfQVBJX1NfVkVSXzIgKi8KLQotI2RlZmluZSBJV0xfTlVNX0NIQUlOX0xJTUlUUwkyCi0jZGVmaW5lIElXTF9OVU1fU1VCX0JBTkRTCTUKLQotLyoqCi0gKiBzdHJ1Y3QgaXdsX2Rldl90eF9wb3dlcl9jbWQgLSBUWCBwb3dlciByZWR1Y3Rpb24gY29tbWFuZAotICogQHYyOiB2ZXJzaW9uIDIgb2YgdGhlIGNvbW1hbmQsIGVtYmVkZGVkIGhlcmUgZm9yIGVhc2llciBzb2Z0d2FyZSBoYW5kbGluZwotICogQHBlcl9jaGFpbl9yZXN0cmljdGlvbjogcGVyIGNoYWluIHJlc3RyaWN0aW9ucwotICovCi1zdHJ1Y3QgaXdsX2Rldl90eF9wb3dlcl9jbWRfdjMgewotCS8qIHYzIGlzIGp1c3QgYW4gZXh0ZW5zaW9uIG9mIHYyIC0ga2VlcCB0aGlzIGhlcmUgKi8KLQlzdHJ1Y3QgaXdsX2Rldl90eF9wb3dlcl9jbWRfdjIgdjI7CiAJX19sZTE2IHBlcl9jaGFpbl9yZXN0cmljdGlvbltJV0xfTlVNX0NIQUlOX0xJTUlUU11bSVdMX05VTV9TVUJfQkFORFNdOwogfSBfX3BhY2tlZDsgLyogVFhfUkVEVUNFRF9QT1dFUl9BUElfU19WRVJfMyAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1hcGktc2Nhbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vZnctYXBpLXNjYW4uaAppbmRleCBmMDFkYWIwLi4wYzI5NGM5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vZnctYXBpLXNjYW4uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1hcGktc2Nhbi5oCkBAIC03LDYgKzcsNyBAQAogICoKICAqIENvcHlyaWdodChjKSAyMDEyIC0gMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNSBJbnRlbCBNb2JpbGUgQ29tbXVuaWNhdGlvbnMgR21iSAorICogQ29weXJpZ2h0KGMpIDIwMTYgSW50ZWwgRGV1dHNjaGxhbmQgR21iSAogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwpAQCAtNjAzLDYgKzYwNCw4IEBACiAgKiBAdWlkOiBzY2FuIGlkLCAmZW51bSBpd2xfdW1hY19zY2FuX3VpZF9vZmZzZXRzCiAgKiBAb29jX3ByaW9yaXR5OiBvdXQgb2YgY2hhbm5lbCBwcmlvcml0eSAtICZlbnVtIGl3bF9zY2FuX3ByaW9yaXR5CiAgKiBAZ2VuZXJhbF9mbGFnczogJmVudW0gaXdsX3VtYWNfc2Nhbl9nZW5lcmFsX2ZsYWdzCisgKiBAcmVzZXJ2ZWQyOiBmb3IgZnV0dXJlIHVzZSBhbmQgYWxpZ25tZW50CisgKiBAc2Nhbl9zdGFydF9tYWNfaWQ6IHJlcG9ydCB0aGUgc2NhbiBzdGFydCBUU0YgdGltZSBhY2NvcmRpbmcgdG8gdGhpcyBtYWMgVFNGCiAgKiBAZXh0ZW5kZWRfZHdlbGw6IGR3ZWxsIHRpbWUgZm9yIGNoYW5uZWxzIDEsIDYgYW5kIDExCiAgKiBAYWN0aXZlX2R3ZWxsOiBkd2VsbCB0aW1lIGZvciBhY3RpdmUgc2NhbgogICogQHBhc3NpdmVfZHdlbGw6IGR3ZWxsIHRpbWUgZm9yIHBhc3NpdmUgc2NhbgpAQCAtNjIwLDggKzYyMywxMCBAQAogCV9fbGUzMiBmbGFnczsKIAlfX2xlMzIgdWlkOwogCV9fbGUzMiBvb2NfcHJpb3JpdHk7Ci0JLyogU0NBTl9HRU5FUkFMX1BBUkFNU19BUElfU19WRVJfMSAqLwotCV9fbGUzMiBnZW5lcmFsX2ZsYWdzOworCS8qIFNDQU5fR0VORVJBTF9QQVJBTVNfQVBJX1NfVkVSXzQgKi8KKwlfX2xlMTYgZ2VuZXJhbF9mbGFnczsKKwl1OCByZXNlcnZlZDI7CisJdTggc2Nhbl9zdGFydF9tYWNfaWQ7CiAJdTggZXh0ZW5kZWRfZHdlbGw7CiAJdTggYWN0aXZlX2R3ZWxsOwogCXU4IHBhc3NpdmVfZHdlbGw7CkBAIC02MjksNyArNjM0LDcgQEAKIAlfX2xlMzIgbWF4X291dF90aW1lOwogCV9fbGUzMiBzdXNwZW5kX3RpbWU7CiAJX19sZTMyIHNjYW5fcHJpb3JpdHk7Ci0JLyogU0NBTl9DSEFOTkVMX1BBUkFNU19BUElfU19WRVJfMSAqLworCS8qIFNDQU5fQ0hBTk5FTF9QQVJBTVNfQVBJX1NfVkVSXzQgKi8KIAl1OCBjaGFubmVsX2ZsYWdzOwogCXU4IG5fY2hhbm5lbHM7CiAJX19sZTE2IHJlc2VydmVkOwpAQCAtNzE4LDggKzcyMyw4IEBACiAgKiBAc3RhdHVzOiBvbmUgb2YgU0NBTl9DT01QX1NUQVRVU18qCiAgKiBAYnRfc3RhdHVzOiBCVCBvbi9vZmYgc3RhdHVzCiAgKiBAbGFzdF9jaGFubmVsOiBsYXN0IGNoYW5uZWwgdGhhdCB3YXMgc2Nhbm5lZAotICogQHRzZl9sb3c6IFRTRiB0aW1lciAobG93ZXIgaGFsZikgaW4gdXNlY3MKLSAqIEB0c2ZfaGlnaDogVFNGIHRpbWVyIChoaWdoZXIgaGFsZikgaW4gdXNlY3MKKyAqIEBzdGFydF90c2Y6IFRTRiB0aW1lciBpbiB1c2VjcyBvZiB0aGUgc2NhbiBzdGFydCB0aW1lIGZvciB0aGUgbWFjIHNwZWNpZmllZAorICoJaW4gJnN0cnVjdCBpd2xfc2Nhbl9yZXFfdW1hYy4KICAqIEByZXN1bHRzOiBhcnJheSBvZiBzY2FuIHJlc3VsdHMsIG9ubHkgInNjYW5uZWRfY2hhbm5lbHMiIG9mIHRoZW0gYXJlIHZhbGlkCiAgKi8KIHN0cnVjdCBpd2xfdW1hY19zY2FuX2l0ZXJfY29tcGxldGVfbm90aWYgewpAQCAtNzI4LDkgKzczMyw4IEBACiAJdTggc3RhdHVzOwogCXU4IGJ0X3N0YXR1czsKIAl1OCBsYXN0X2NoYW5uZWw7Ci0JX19sZTMyIHRzZl9sb3c7Ci0JX19sZTMyIHRzZl9oaWdoOworCV9fbGU2NCBzdGFydF90c2Y7CiAJc3RydWN0IGl3bF9zY2FuX3Jlc3VsdHNfbm90aWYgcmVzdWx0c1tdOwotfSBfX3BhY2tlZDsgLyogU0NBTl9JVEVSX0NPTVBMRVRFX05URl9VTUFDX0FQSV9TX1ZFUl8xICovCit9IF9fcGFja2VkOyAvKiBTQ0FOX0lURVJfQ09NUExFVEVfTlRGX1VNQUNfQVBJX1NfVkVSXzIgKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1hcGktc3RhLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1hcGktc3RhLmgKaW5kZXggZDFjNGZiOC4uNmM4ZTNjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vZnctYXBpLXN0YS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWFwaS1zdGEuaApAQCAtNDMzLDI1ICs0MzMsNDIgQEAKIH0gX19wYWNrZWQ7IC8qIFJFTU9WRV9TVEFfQ01EX0FQSV9TX1ZFUl8yICovCiAKIC8qKgorICogc3RydWN0IGl3bF9tdm1fbWdtdF9tY2FzdF9rZXlfY21kX3YxCisgKiAoIE1HTVRfTUNBU1RfS0VZID0gMHgxZiApCisgKiBAY3RybF9mbGFnczogJWl3bF9zdGFfa2V5X2ZsYWcKKyAqIEBpZ3RrOgorICogQGsxOiB1bnVzZWQKKyAqIEBrMjogdW51c2VkCisgKiBAc3RhX2lkOiBzdGF0aW9uIElEIHRoYXQgc3VwcG9ydCBJR1RLCisgKiBAa2V5X2lkOgorICogQHJlY2VpdmVfc2VxX2NudDogaW5pdGlhbCBSU0MvUE4gbmVlZGVkIGZvciByZXBsYXkgY2hlY2sKKyAqLworc3RydWN0IGl3bF9tdm1fbWdtdF9tY2FzdF9rZXlfY21kX3YxIHsKKwlfX2xlMzIgY3RybF9mbGFnczsKKwl1OCBpZ3RrWzE2XTsKKwl1OCBrMVsxNl07CisJdTggazJbMTZdOworCV9fbGUzMiBrZXlfaWQ7CisJX19sZTMyIHN0YV9pZDsKKwlfX2xlNjQgcmVjZWl2ZV9zZXFfY250OworfSBfX3BhY2tlZDsgLyogU0VDX01HTVRfTVVMVElDQVNUX0tFWV9DTURfQVBJX1NfVkVSXzEgKi8KKworLyoqCiAgKiBzdHJ1Y3QgaXdsX212bV9tZ210X21jYXN0X2tleV9jbWQKICAqICggTUdNVF9NQ0FTVF9LRVkgPSAweDFmICkKICAqIEBjdHJsX2ZsYWdzOiAlaXdsX3N0YV9rZXlfZmxhZwotICogQElHVEs6Ci0gKiBASzE6IHVudXNlZAotICogQEsyOiB1bnVzZWQKKyAqIEBpZ3RrOiBJR1RLIG1hc3RlciBrZXkKICAqIEBzdGFfaWQ6IHN0YXRpb24gSUQgdGhhdCBzdXBwb3J0IElHVEsKICAqIEBrZXlfaWQ6CiAgKiBAcmVjZWl2ZV9zZXFfY250OiBpbml0aWFsIFJTQy9QTiBuZWVkZWQgZm9yIHJlcGxheSBjaGVjawogICovCiBzdHJ1Y3QgaXdsX212bV9tZ210X21jYXN0X2tleV9jbWQgewogCV9fbGUzMiBjdHJsX2ZsYWdzOwotCXU4IElHVEtbMTZdOwotCXU4IEsxWzE2XTsKLQl1OCBLMlsxNl07CisJdTggaWd0a1szMl07CiAJX19sZTMyIGtleV9pZDsKIAlfX2xlMzIgc3RhX2lkOwogCV9fbGU2NCByZWNlaXZlX3NlcV9jbnQ7Ci19IF9fcGFja2VkOyAvKiBTRUNfTUdNVF9NVUxUSUNBU1RfS0VZX0NNRF9BUElfU19WRVJfMSAqLworfSBfX3BhY2tlZDsgLyogU0VDX01HTVRfTVVMVElDQVNUX0tFWV9DTURfQVBJX1NfVkVSXzIgKi8KIAogc3RydWN0IGl3bF9tdm1fd2VwX2tleSB7CiAJdTgga2V5X2luZGV4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vZnctYXBpLXR4LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1hcGktdHguaAppbmRleCA0MTQ0NjIzLi41OWNhOTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1hcGktdHguaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1hcGktdHguaApAQCAtODksNyArODksNiBAQAogICogQFRYX0NNRF9GTEdfTUhfUEFEOiBkcml2ZXIgaW5zZXJ0ZWQgMiBieXRlIHBhZGRpbmcgYWZ0ZXIgTUFDIGhlYWRlci4KICAqCVNob3VsZCBiZSBzZXQgZm9yIDI2LzMwIGxlbmd0aCBNQUMgaGVhZGVycwogICogQFRYX0NNRF9GTEdfUkVTUF9UT19EUlY6IHplcm8gdGhpcyBpZiB0aGUgcmVzcG9uc2Ugc2hvdWxkIGdvIG9ubHkgdG8gRlcKLSAqIEBUWF9DTURfRkxHX0NDTVBfQUdHOiB0aGlzIGZyYW1lIHVzZXMgQ0NNUCBmb3IgYWdncmVnYXRpb24gYWNjZWxlcmF0aW9uCiAgKiBAVFhfQ01EX0ZMR19US0lQX01JQ19ET05FOiBGVyBhbHJlYWR5IHBlcmZvcm1lZCBUS0lQIE1JQyBjYWxjdWxhdGlvbgogICogQFRYX0NNRF9GTEdfRFVSOiBkaXNhYmxlIGR1cmF0aW9uIG92ZXJ3cml0aW5nIHVzZWQgaW4gUFMtUG9sbCBBc3NvYy1pZAogICogQFRYX0NNRF9GTEdfRldfRFJPUDogRlcgc2hvdWxkIG1hcmsgZnJhbWUgdG8gYmUgZHJvcHBlZApAQCAtMTE2LDcgKzExNSw2IEBACiAJVFhfQ01EX0ZMR19LRUVQX1NFUV9DVEwJCT0gQklUKDE4KSwKIAlUWF9DTURfRkxHX01IX1BBRAkJPSBCSVQoMjApLAogCVRYX0NNRF9GTEdfUkVTUF9UT19EUlYJCT0gQklUKDIxKSwKLQlUWF9DTURfRkxHX0NDTVBfQUdHCQk9IEJJVCgyMiksCiAJVFhfQ01EX0ZMR19US0lQX01JQ19ET05FCT0gQklUKDIzKSwKIAlUWF9DTURfRkxHX0RVUgkJCT0gQklUKDI1KSwKIAlUWF9DTURfRkxHX0ZXX0RST1AJCT0gQklUKDI2KSwKQEAgLTE0OSw3ICsxNDcsNyBAQAogICogQFRYX0NNRF9TRUNfRVhUOiBleHRlbmRlZCBjaXBoZXIgYWxnb3JpdGhtLgogICogQFRYX0NNRF9TRUNfR0NNUDogR0NNUCBlbmNyeXB0aW9uIGFsZ29yaXRobS4KICAqIEBUWF9DTURfU0VDX0tFWTEyODogc2V0IGZvciAxMDQgYml0cyBXRVAga2V5LgotICogQFRDX0NNRF9TRUNfS0VZX0ZST01fVEFCTEU6IGZvciBhIG5vbi1XRVAga2V5LCBzZXQgaWYgdGhlIGtleSBzaG91bGQgYmUgdGFrZW4KKyAqIEBUWF9DTURfU0VDX0tFWV9GUk9NX1RBQkxFOiBmb3IgYSBub24tV0VQIGtleSwgc2V0IGlmIHRoZSBrZXkgc2hvdWxkIGJlIHRha2VuCiAgKglmcm9tIHRoZSB0YWJsZSBpbnN0ZWFkIG9mIGZyb20gdGhlIFRYIGNvbW1hbmQuCiAgKglJZiB0aGUga2V5IGlzIHRha2VuIGZyb20gdGhlIGtleSB0YWJsZSBpdHMgaW5kZXggc2hvdWxkIGJlIGdpdmVuIGJ5IHRoZQogICoJZmlyc3QgYnl0ZSBvZiB0aGUgVFggY29tbWFuZCBrZXkgZmllbGQuCkBAIC0xNjEsNyArMTU5LDcgQEAKIAlUWF9DTURfU0VDX0VYVAkJCT0gMHgwNCwKIAlUWF9DTURfU0VDX0dDTVAJCQk9IDB4MDUsCiAJVFhfQ01EX1NFQ19LRVkxMjgJCT0gMHgwOCwKLQlUQ19DTURfU0VDX0tFWV9GUk9NX1RBQkxFCT0gMHgwOCwKKwlUWF9DTURfU0VDX0tFWV9GUk9NX1RBQkxFCT0gMHgwOCwKIH07CiAKIC8qIFRPRE86IGhvdyBkb2VzIHRoZXNlIHZhbHVlcyBhcmUgT0sgd2l0aCBvbmx5IDE2IGJpdCB2YXJpYWJsZT8/PyAqLwpAQCAtNTc4LDYgKzU3Niw4NSBAQAogfSBfX3BhY2tlZDsKIAogLyoqCisgKiBzdHJ1Y3QgaXdsX212bV9jb21wcmVzc2VkX2JhX3RmZCAtIHByb2dyZXNzIG9mIGEgVEZEIHF1ZXVlCisgKiBAcV9udW06IFRGRCBxdWV1ZSBudW1iZXIKKyAqIEB0ZmRfaW5kZXg6IEluZGV4IG9mIGZpcnN0IHVuLWFja2VkIGZyYW1lIGluIHRoZSAgVEZEIHF1ZXVlCisgKi8KK3N0cnVjdCBpd2xfbXZtX2NvbXByZXNzZWRfYmFfdGZkIHsKKwl1OCBxX251bTsKKwl1OCByZXNlcnZlZDsKKwlfX2xlMTYgdGZkX2luZGV4OworfSBfX3BhY2tlZDsgLyogQ09NUFJFU1NFRF9CQV9URkRfQVBJX1NfVkVSXzEgKi8KKworLyoqCisgKiBzdHJ1Y3QgaXdsX212bV9jb21wcmVzc2VkX2JhX3JhdGlkIC0gcHJvZ3Jlc3Mgb2YgYSBSQSBUSUQgcXVldWUKKyAqIEBxX251bTogUkEgVElEIHF1ZXVlIG51bWJlcgorICogQHRpZDogVElEIG9mIHRoZSBxdWV1ZQorICogQHNzbjogQkEgd2luZG93IGN1cnJlbnQgU1NOCisgKi8KK3N0cnVjdCBpd2xfbXZtX2NvbXByZXNzZWRfYmFfcmF0aWQgeworCXU4IHFfbnVtOworCXU4IHRpZDsKKwlfX2xlMTYgc3NuOworfSBfX3BhY2tlZDsgLyogQ09NUFJFU1NFRF9CQV9SQVRJRF9BUElfU19WRVJfMSAqLworCisvKgorICogZW51bSBpd2xfbXZtX2JhX3Jlc3BfZmxhZ3MgLSBUWCBhZ2dyZWdhdGlvbiBzdGF0dXMKKyAqIEBJV0xfTVZNX0JBX1JFU1BfVFhfQUdHOiBnZW5lcmF0ZWQgZHVlIHRvIEJBCisgKiBASVdMX01WTV9CQV9SRVNQX1RYX0JBUjogZ2VuZXJhdGVkIGR1ZSB0byBCQSBhZnRlciBCQVIKKyAqIEBJV0xfTVZNX0JBX1JFU1BfVFhfQUdHX0ZBSUw6IGFnZ3JlZ2F0aW9uIGRpZG4ndCByZWNlaXZlIEJBCisgKiBASVdMX01WTV9CQV9SRVNQX1RYX1VOREVSUlVOOiBhZ2dyZWdhdGlvbiBnb3QgdW5kZXJydW4KKyAqIEBJV0xfTVZNX0JBX1JFU1BfVFhfQlRfS0lMTDogYWdncmVnYXRpb24gZ290IEJULWtpbGwKKyAqIEBJV0xfTVZNX0JBX1JFU1BfVFhfRFNQX1RJTUVPVVQ6IGFnZ3JlZ2F0aW9uIGRpZG4ndCBmaW5pc2ggd2l0aGluIHRoZQorICoJZXhwZWN0ZWQgdGltZQorICovCitlbnVtIGl3bF9tdm1fYmFfcmVzcF9mbGFncyB7CisJSVdMX01WTV9CQV9SRVNQX1RYX0FHRywKKwlJV0xfTVZNX0JBX1JFU1BfVFhfQkFSLAorCUlXTF9NVk1fQkFfUkVTUF9UWF9BR0dfRkFJTCwKKwlJV0xfTVZNX0JBX1JFU1BfVFhfVU5ERVJSVU4sCisJSVdMX01WTV9CQV9SRVNQX1RYX0JUX0tJTEwsCisJSVdMX01WTV9CQV9SRVNQX1RYX0RTUF9USU1FT1VUCit9OworCisvKioKKyAqIHN0cnVjdCBpd2xfbXZtX2NvbXByZXNzZWRfYmFfbm90aWYgLSBub3RpZmllcyBhYm91dCByZWNlcHRpb24gb2YgQkEKKyAqICggQkFfTk9USUYgPSAweGM1ICkKKyAqIEBmbGFnczogc3RhdHVzIGZsYWcsIHNlZSB0aGUgJml3bF9tdm1fYmFfcmVzcF9mbGFncworICogQHN0YV9pZDogSW5kZXggb2YgcmVjaXBpZW50IChCQS1zZW5kaW5nKSBzdGF0aW9uIGluIGZ3J3Mgc3RhdGlvbiB0YWJsZQorICogQHJlZHVjZWRfdHhwOiBwb3dlciByZWR1Y2VkIGFjY29yZGluZyB0byBUUEMuIFRoaXMgaXMgdGhlIGFjdHVhbCB2YWx1ZSBhbmQKKyAqCW5vdCBhIGNvcHkgZnJvbSB0aGUgTFEgY29tbWFuZC4gVGh1cywgaWYgbm90IHRoZSBmaXJzdCByYXRlIHdhcyB1c2VkCisgKglmb3IgVHgtaW5nIHRoZW4gdGhpcyB2YWx1ZSB3aWxsIGJlIHNldCB0byAwIGJ5IEZXLgorICogQGluaXRpYWxfcmF0ZTogVExDIHJhdGUgaW5mbywgaW5pdGlhbCByYXRlIGluZGV4LCBUTEMgdGFibGUgY29sb3IKKyAqIEByZXRyeV9jbnQ6IHJldHJ5IGNvdW50CisgKiBAcXVlcnlfYnl0ZV9jbnQ6IFNDRCBxdWVyeSBieXRlIGNvdW50CisgKiBAcXVlcnlfZnJhbWVfY250OiBTQ0QgcXVlcnkgZnJhbWUgY291bnQKKyAqIEB0eGVkOiBudW1iZXIgb2YgZnJhbWVzIHNlbnQgaW4gdGhlIGFnZ3JlZ2F0aW9uIChhbGwtVElEcykKKyAqIEBkb25lOiBudW1iZXIgb2YgZnJhbWVzIHRoYXQgd2VyZSBBY2tlZCBieSB0aGUgQkEgKGFsbC1USURzKQorICogQHdpcmVsZXNzX3RpbWU6IFdpcmVsZXNzLW1lZGlhIHRpbWUKKyAqIEB0eF9yYXRlOiB0aGUgcmF0ZSB0aGUgYWdncmVnYXRpb24gd2FzIHNlbnQgYXQKKyAqIEB0ZmRfY250OiBudW1iZXIgb2YgVEZELVEgZWxlbWVudHMKKyAqIEByYV90aWRfY250OiBudW1iZXIgb2YgUkFUSUQtUSBlbGVtZW50cworICovCitzdHJ1Y3QgaXdsX212bV9jb21wcmVzc2VkX2JhX25vdGlmIHsKKwlfX2xlMzIgZmxhZ3M7CisJdTggc3RhX2lkOworCXU4IHJlZHVjZWRfdHhwOworCXU4IGluaXRpYWxfcmF0ZTsKKwl1OCByZXRyeV9jbnQ7CisJX19sZTMyIHF1ZXJ5X2J5dGVfY250OworCV9fbGUxNiBxdWVyeV9mcmFtZV9jbnQ7CisJX19sZTE2IHR4ZWQ7CisJX19sZTE2IGRvbmU7CisJX19sZTMyIHdpcmVsZXNzX3RpbWU7CisJX19sZTMyIHR4X3JhdGU7CisJX19sZTE2IHRmZF9jbnQ7CisJX19sZTE2IHJhX3RpZF9jbnQ7CisJc3RydWN0IGl3bF9tdm1fY29tcHJlc3NlZF9iYV90ZmQgdGZkWzFdOworCXN0cnVjdCBpd2xfbXZtX2NvbXByZXNzZWRfYmFfcmF0aWQgcmFfdGlkWzBdOworfSBfX3BhY2tlZDsgLyogQ09NUFJFU1NFRF9CQV9SRVNfQVBJX1NfVkVSXzQgKi8KKworLyoqCiAgKiBzdHJ1Y3QgaXdsX21hY19iZWFjb25fY21kX3Y2IC0gYmVhY29uIHRlbXBsYXRlIGNvbW1hbmQKICAqIEB0eDogdGhlIHR4IGNvbW1hbmRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVhY29uIGZyYW1lCiAgKiBAdGVtcGxhdGVfaWQ6IGN1cnJlbnRseSBlcXVhbCB0byB0aGUgbWFjIGNvbnRleHQgaWQgb2YgdGhlIGNvcmVzcG9uZGluZwpAQCAtNjc1LDEzICs3NTIsMjEgQEAKIAkJCSAgICB0eF9yZXNwLT5mcmFtZV9jb3VudCkgJiAweGZmZjsKIH0KIAorLyogQXZhaWxhYmxlIG9wdGlvbnMgZm9yIHRoZSBTQ0RfUVVFVUVfQ0ZHIEhDTUQgKi8KK2VudW0gaXdsX3NjZF9jZmdfYWN0aW9ucyB7CisJU0NEX0NGR19ESVNBQkxFX1FVRVVFCQk9IDB4MCwKKwlTQ0RfQ0ZHX0VOQUJMRV9RVUVVRQkJPSAweDEsCisJU0NEX0NGR19VUERBVEVfUVVFVUVfVElECT0gMHgyLAorfTsKKwogLyoqCiAgKiBzdHJ1Y3QgaXdsX3NjZF90eHFfY2ZnX2NtZCAtIE5ldyB0eHEgaHcgc2NoZWR1bGVyIGNvbmZpZyBjb21tYW5kCiAgKiBAdG9rZW46CiAgKiBAc3RhX2lkOiBzdGF0aW9uIGlkCiAgKiBAdGlkOgogICogQHNjZF9xdWV1ZTogc2NoZWR1bGVyIHF1ZXVlIHRvIGNvbmZpdWcKLSAqIEBlbmFibGU6IDEgcXVldWUgZW5hYmxlLCAwIHF1ZXVlIGRpc2FibGUKKyAqIEBhY3Rpb246IDEgcXVldWUgZW5hYmxlLCAwIHF1ZXVlIGRpc2FibGUsIDIgY2hhbmdlIHR4cSdzIHRpZCBvd25lcgorICoJVmFsdWUgaXMgb25lIG9mICVpd2xfc2NkX2NmZ19hY3Rpb25zIG9wdGlvbnMKICAqIEBhZ2dyZWdhdGU6IDEgYWdncmVnYXRlZCBxdWV1ZSwgMCBvdGhlcndpc2UKICAqIEB0eF9maWZvOiAlZW51bSBpd2xfbXZtX3R4X2ZpZm8KICAqIEB3aW5kb3c6IEJBIHdpbmRvdyBzaXplCkBAIC02OTIsNyArNzc3LDcgQEAKIAl1OCBzdGFfaWQ7CiAJdTggdGlkOwogCXU4IHNjZF9xdWV1ZTsKLQl1OCBlbmFibGU7CisJdTggYWN0aW9uOwogCXU4IGFnZ3JlZ2F0ZTsKIAl1OCB0eF9maWZvOwogCXU4IHdpbmRvdzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWFwaS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vZnctYXBpLmgKaW5kZXggNzEwNzZmMC4uOTc2MzM2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vZnctYXBpLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vZnctYXBpLmgKQEAgLTIwNSw3ICsyMDUsNyBAQAogCS8qIFBoeSAqLwogCVBIWV9DT05GSUdVUkFUSU9OX0NNRCA9IDB4NmEsCiAJQ0FMSUJfUkVTX05PVElGX1BIWV9EQiA9IDB4NmIsCi0JLyogUEhZX0RCX0NNRCA9IDB4NmMsICovCisJUEhZX0RCX0NNRCA9IDB4NmMsCiAKIAkvKiBUb0YgLSA4MDIuMTFtYyBGVE0gKi8KIAlUT0ZfQ01EID0gMHgxMCwKQEAgLTM0MCw2ICszNDAsMTEgQEAKIAlTVE9SRURfQkVBQ09OX05URiA9IDB4RkYsCiB9OwogCitlbnVtIGl3bF9mbWFjX2RlYnVnX2NtZHMgeworCUxNQUNfUkRfV1IgPSAweDAsCisJVU1BQ19SRF9XUiA9IDB4MSwKK307CisKIC8qIGNvbW1hbmQgZ3JvdXBzICovCiBlbnVtIHsKIAlMRUdBQ1lfR1JPVVAgPSAweDAsCkBAIC0zNDksNiArMzU0LDcgQEAKIAlQSFlfT1BTX0dST1VQID0gMHg0LAogCURBVEFfUEFUSF9HUk9VUCA9IDB4NSwKIAlQUk9UX09GRkxPQURfR1JPVVAgPSAweGIsCisJREVCVUdfR1JPVVAgPSAweGYsCiB9OwogCiAvKioKQEAgLTQ4MiwxMyArNDg4LDE3IEBACiAgKiBAYmxvY2tfc2l6ZTogdGhlIGJsb2NrIHNpemUgaW4gcG93ZXJzIG9mIDIKICAqIEBibG9ja19udW06IG51bWJlciBvZiBibG9ja3Mgc3BlY2lmaWVkIGluIHRoZSBjb21tYW5kLgogICogQGRldmljZV9waHlfYWRkcjogdmlydHVhbCBhZGRyZXNzZXMgZnJvbSBkZXZpY2Ugc2lkZQorICoJMzIgYml0IGFkZHJlc3MgZm9yIEFQSSB2ZXJzaW9uIDEsIDY0IGJpdCBhZGRyZXNzIGZvciBBUEkgdmVyc2lvbiAyLgogKi8KIHN0cnVjdCBpd2xfZndfcGFnaW5nX2NtZCB7CiAJX19sZTMyIGZsYWdzOwogCV9fbGUzMiBibG9ja19zaXplOwogCV9fbGUzMiBibG9ja19udW07Ci0JX19sZTMyIGRldmljZV9waHlfYWRkcltOVU1fT0ZfRldfUEFHSU5HX0JMT0NLU107Ci19IF9fcGFja2VkOyAvKiBGV19QQUdJTkdfQkxPQ0tfQ01EX0FQSV9TX1ZFUl8xICovCisJdW5pb24geworCQlfX2xlMzIgYWRkcjMyW05VTV9PRl9GV19QQUdJTkdfQkxPQ0tTXTsKKwkJX19sZTY0IGFkZHI2NFtOVU1fT0ZfRldfUEFHSU5HX0JMT0NLU107CisJfSBkZXZpY2VfcGh5X2FkZHI7Cit9IF9fcGFja2VkOyAvKiBGV19QQUdJTkdfQkxPQ0tfQ01EX0FQSV9TX1ZFUl8yICovCiAKIC8qCiAgKiBGdyBpdGVtcyBJRCdzCkBAIC0xOTczLDggKzE5ODMsOSBAQAogCXN0cnVjdCBpd2xfdGRsc19jb25maWdfc3RhX2luZm9fcmVzIHN0YV9pbmZvW0lXTF9NVk1fVERMU19TVEFfQ09VTlRdOwogfSBfX3BhY2tlZDsgLyogVERMU19DT05GSUdfUlNQX0FQSV9TX1ZFUl8xICovCiAKLSNkZWZpbmUgVFhfRklGT19NQVhfTlVNCQk4Ci0jZGVmaW5lIFJYX0ZJRk9fTUFYX05VTQkJMgorI2RlZmluZSBUWF9GSUZPX01BWF9OVU1fOTAwMAkJOAorI2RlZmluZSBUWF9GSUZPX01BWF9OVU0JCQkxNQorI2RlZmluZSBSWF9GSUZPX01BWF9OVU0JCQkyCiAjZGVmaW5lIFRYX0ZJRk9fSU5URVJOQUxfTUFYX05VTQk2CiAKIC8qKgpAQCAtMjAwMCw2ICsyMDExLDIxIEBACiAgKiBOT1RFOiBvbiBmaXJtd2FyZSB0aGF0IGRvbid0IGhhdmUgSVdMX1VDT0RFX1RMVl9DQVBBX0VYVEVORF9TSEFSRURfTUVNX0NGRwogICoJIHNldCwgdGhlIGxhc3QgMyBtZW1iZXJzIGRvbid0IGV4aXN0LgogICovCitzdHJ1Y3QgaXdsX3NoYXJlZF9tZW1fY2ZnX3YxIHsKKwlfX2xlMzIgc2hhcmVkX21lbV9hZGRyOworCV9fbGUzMiBzaGFyZWRfbWVtX3NpemU7CisJX19sZTMyIHNhbXBsZV9idWZmX2FkZHI7CisJX19sZTMyIHNhbXBsZV9idWZmX3NpemU7CisJX19sZTMyIHR4Zmlmb19hZGRyOworCV9fbGUzMiB0eGZpZm9fc2l6ZVtUWF9GSUZPX01BWF9OVU1fOTAwMF07CisJX19sZTMyIHJ4Zmlmb19zaXplW1JYX0ZJRk9fTUFYX05VTV07CisJX19sZTMyIHBhZ2VfYnVmZl9hZGRyOworCV9fbGUzMiBwYWdlX2J1ZmZfc2l6ZTsKKwlfX2xlMzIgcnhmaWZvX2FkZHI7CisJX19sZTMyIGludGVybmFsX3R4Zmlmb19hZGRyOworCV9fbGUzMiBpbnRlcm5hbF90eGZpZm9fc2l6ZVtUWF9GSUZPX0lOVEVSTkFMX01BWF9OVU1dOworfSBfX3BhY2tlZDsgLyogU0hBUkVEX01FTV9BTExPQ19BUElfU19WRVJfMiAqLworCiBzdHJ1Y3QgaXdsX3NoYXJlZF9tZW1fY2ZnIHsKIAlfX2xlMzIgc2hhcmVkX21lbV9hZGRyOwogCV9fbGUzMiBzaGFyZWRfbWVtX3NpemU7CkBAIC0yMDEzLDcgKzIwMzksNyBAQAogCV9fbGUzMiByeGZpZm9fYWRkcjsKIAlfX2xlMzIgaW50ZXJuYWxfdHhmaWZvX2FkZHI7CiAJX19sZTMyIGludGVybmFsX3R4Zmlmb19zaXplW1RYX0ZJRk9fSU5URVJOQUxfTUFYX05VTV07Ci19IF9fcGFja2VkOyAvKiBTSEFSRURfTUVNX0FMTE9DX0FQSV9TX1ZFUl8yICovCit9IF9fcGFja2VkOyAvKiBTSEFSRURfTUVNX0FMTE9DX0FQSV9TX1ZFUl8zICovCiAKIC8qKgogICogVkhUIE1VLU1JTU8gZ3JvdXAgY29uZmlndXJhdGlvbgpAQCAtMjEyOSw0ICsyMTU1LDQ4IEBACiAJX19sZTMyIGlkX2FuZF9jb2xvcjsKIH0gX19wYWNrZWQ7IC8qIENIQU5ORUxfU1dJVENIX1NUQVJUX05URllfQVBJX1NfVkVSXzEgKi8KIAorLyogT3BlcmF0aW9uIHR5cGVzIGZvciB0aGUgZGVidWcgbWVtIGFjY2VzcyAqLworZW51bSB7CisJREVCVUdfTUVNX09QX1JFQUQgPSAwLAorCURFQlVHX01FTV9PUF9XUklURSA9IDEsCisJREVCVUdfTUVNX09QX1dSSVRFX0JZVEVTID0gMiwKK307CisKKyNkZWZpbmUgREVCVUdfTUVNX01BWF9TSVpFX0RXT1JEUyAzMgorCisvKioKKyAqIHN0cnVjdCBpd2xfZGJnX21lbV9hY2Nlc3NfY21kIC0gUmVxdWVzdCB0aGUgZGV2aWNlIHRvIHJlYWQvd3JpdGUgbWVtb3J5CisgKiBAb3A6IERFQlVHX01FTV9PUF8qCisgKiBAYWRkcjogYWRkcmVzcyB0byByZWFkL3dyaXRlIGZyb20vdG8KKyAqIEBsZW46IGluIGR3b3JkcywgdG8gcmVhZC93cml0ZQorICogQGRhdGE6IGZvciB3cml0ZSBvcGVhdGlvbnMsIGNvbnRhaW5zIHRoZSBzb3VyY2UgYnVmZmVyCisgKi8KK3N0cnVjdCBpd2xfZGJnX21lbV9hY2Nlc3NfY21kIHsKKwlfX2xlMzIgb3A7CisJX19sZTMyIGFkZHI7CisJX19sZTMyIGxlbjsKKwlfX2xlMzIgZGF0YVtdOworfSBfX3BhY2tlZDsgLyogREVCVUdfKFV8TClNQUNfUkRfV1JfQ01EX0FQSV9TX1ZFUl8xICovCisKKy8qIFN0YXR1cyByZXNwb25zZXMgZm9yIHRoZSBkZWJ1ZyBtZW0gYWNjZXNzICovCitlbnVtIHsKKwlERUJVR19NRU1fU1RBVFVTX1NVQ0NFU1MgPSAweDAsCisJREVCVUdfTUVNX1NUQVRVU19GQUlMRUQgPSAweDEsCisJREVCVUdfTUVNX1NUQVRVU19MT0NLRUQgPSAweDIsCisJREVCVUdfTUVNX1NUQVRVU19ISURERU4gPSAweDMsCisJREVCVUdfTUVNX1NUQVRVU19MRU5HVEggPSAweDQsCit9OworCisvKioKKyAqIHN0cnVjdCBpd2xfZGJnX21lbV9hY2Nlc3NfcnNwIC0gUmVzcG9uc2UgdG8gZGVidWcgbWVtIGNvbW1hbmRzCisgKiBAc3RhdHVzOiBERUJVR19NRU1fU1RBVFVTXyoKKyAqIEBsZW46IHJlYWQgZHdvcmRzICgwIGZvciB3cml0ZSBvcGVyYXRpb25zKQorICogQGRhdGE6IGNvbnRhaW5zIHRoZSByZWFkIERXcworICovCitzdHJ1Y3QgaXdsX2RiZ19tZW1fYWNjZXNzX3JzcCB7CisJX19sZTMyIHN0YXR1czsKKwlfX2xlMzIgbGVuOworCV9fbGUzMiBkYXRhW107Cit9IF9fcGFja2VkOyAvKiBERUJVR18oVXxMKU1BQ19SRF9XUl9SU1BfQVBJX1NfVkVSXzEgKi8KKwogI2VuZGlmIC8qIF9fZndfYXBpX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vZnctZGJnLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1kYmcuYwppbmRleCAxYWJjYWJiLi5kODlkMGExIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1kYmcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1kYmcuYwpAQCAtNDQwLDE0ICs0NDAsMTIgQEAKIAl7IC5zdGFydCA9IDB4MDBhMDQ1NjAsIC5lbmQgPSAweDAwYTA0NTdjIH0sCiAJeyAuc3RhcnQgPSAweDAwYTA0NTkwLCAuZW5kID0gMHgwMGEwNDU5OCB9LAogCXsgLnN0YXJ0ID0gMHgwMGEwNDVjMCwgLmVuZCA9IDB4MDBhMDQ1ZjQgfSwKLQl7IC5zdGFydCA9IDB4MDBhNDQwMDAsIC5lbmQgPSAweDAwYTdiZjgwIH0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGl3bF9wcnBoX3JhbmdlIGl3bF9wcnBoX2R1bXBfYWRkcl85MDAwW10gPSB7CiAJeyAuc3RhcnQgPSAweDAwYTA1YzAwLCAuZW5kID0gMHgwMGEwNWMxOCB9LAogCXsgLnN0YXJ0ID0gMHgwMGEwNTQwMCwgLmVuZCA9IDB4MDBhMDU2ZTggfSwKIAl7IC5zdGFydCA9IDB4MDBhMDgwMDAsIC5lbmQgPSAweDAwYTA5OGJjIH0sCi0JeyAuc3RhcnQgPSAweDAwYWRmYzAwLCAuZW5kID0gMHgwMGFkZmQxYyB9LAogCXsgLnN0YXJ0ID0gMHgwMGEwMjQwMCwgLmVuZCA9IDB4MDBhMDI3NTggfSwKIH07CiAKQEAgLTU1OSw3ICs1NTcsNyBAQAogCQkJCQkgc2l6ZW9mKHN0cnVjdCBpd2xfZndfZXJyb3JfZHVtcF9maWZvKTsKIAkJfQogCi0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1lbV9jZmctPnR4Zmlmb19zaXplKTsgaSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBtZW1fY2ZnLT5udW1fdHhmaWZvX2VudHJpZXM7IGkrKykgewogCQkJaWYgKCFtZW1fY2ZnLT50eGZpZm9fc2l6ZVtpXSkKIAkJCQljb250aW51ZTsKIApAQCAtOTYwLDUgKzk1OCw2IEBACiAJfQogCiAJbXZtLT5md19kYmdfY29uZiA9IGNvbmZfaWQ7Ci0JcmV0dXJuIHJldDsKKworCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vZnctZGJnLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1kYmcuaAppbmRleCBmN2RmZjc2Li5lOWYxYmU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1kYmcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1kYmcuaApAQCAtMTA1LDcgKzEwNSw4IEBACiB7CiAJdTMyIHRyaWdfdmlmID0gbGUzMl90b19jcHUodHJpZy0+dmlmX3R5cGUpOwogCi0JcmV0dXJuIHRyaWdfdmlmID09IElXTF9GV19EQkdfQ09ORl9WSUZfQU5ZIHx8IHZpZi0+dHlwZSA9PSB0cmlnX3ZpZjsKKwlyZXR1cm4gdHJpZ192aWYgPT0gSVdMX0ZXX0RCR19DT05GX1ZJRl9BTlkgfHwKKwkgICAgICAgaWVlZTgwMjExX3ZpZl90eXBlX3AycCh2aWYpID09IHRyaWdfdmlmOwogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy5jCmluZGV4IDdlMGNkYmYuLjg3MjA2NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vZncuYwpAQCAtOTAsMTUgKzkwLDYgQEAKIAl1MzIgc2NkX2Jhc2VfYWRkcjsKIH07CiAKLXN0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IGZ3X2ltZyAqCi1pd2xfZ2V0X3Vjb2RlX2ltYWdlKHN0cnVjdCBpd2xfbXZtICptdm0sIGVudW0gaXdsX3Vjb2RlX3R5cGUgdWNvZGVfdHlwZSkKLXsKLQlpZiAodWNvZGVfdHlwZSA+PSBJV0xfVUNPREVfVFlQRV9NQVgpCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuICZtdm0tPmZ3LT5pbWdbdWNvZGVfdHlwZV07Ci19Ci0KIHN0YXRpYyBpbnQgaXdsX3NlbmRfdHhfYW50X2NmZyhzdHJ1Y3QgaXdsX212bSAqbXZtLCB1OCB2YWxpZF90eF9hbnQpCiB7CiAJc3RydWN0IGl3bF90eF9hbnRfY2ZnX2NtZCB0eF9hbnRfY21kID0gewpAQCAtMzg1LDkgKzM3Niw3IEBACiAvKiBzZW5kIHBhZ2luZyBjbWQgdG8gRlcgaW4gY2FzZSBDUFUyIGhhcyBwYWdpbmcgaW1hZ2UgKi8KIHN0YXRpYyBpbnQgaXdsX3NlbmRfcGFnaW5nX2NtZChzdHJ1Y3QgaXdsX212bSAqbXZtLCBjb25zdCBzdHJ1Y3QgZndfaW1nICpmdykKIHsKLQlpbnQgYmxrX2lkeDsKLQlfX2xlMzIgZGV2X3BoeV9hZGRyOwotCXN0cnVjdCBpd2xfZndfcGFnaW5nX2NtZCBmd19wYWdpbmdfY21kID0geworCXN0cnVjdCBpd2xfZndfcGFnaW5nX2NtZCBwYWdpbmdfY21kID0gewogCQkuZmxhZ3MgPQogCQkJY3B1X3RvX2xlMzIoUEFHSU5HX0NNRF9JU19TRUNVUkVEIHwKIAkJCQkgICAgUEFHSU5HX0NNRF9JU19FTkFCTEVEIHwKQEAgLTM5NiwxOCArMzg1LDMyIEBACiAJCS5ibG9ja19zaXplID0gY3B1X3RvX2xlMzIoQkxPQ0tfMl9FWFBfU0laRSksCiAJCS5ibG9ja19udW0gPSBjcHVfdG9fbGUzMihtdm0tPm51bV9vZl9wYWdpbmdfYmxrKSwKIAl9OworCWludCBibGtfaWR4LCBzaXplID0gc2l6ZW9mKHBhZ2luZ19jbWQpOworCisJLyogQSBiaXQgaGFyZCBjb2RlZCAtIGJ1dCB0aGlzIGlzIHRoZSBvbGQgQVBJIGFuZCB3aWxsIGJlIGRlcHJlY2F0ZWQgKi8KKwlpZiAoIWl3bF9tdm1faGFzX25ld190eF9hcGkobXZtKSkKKwkJc2l6ZSAtPSBOVU1fT0ZfRldfUEFHSU5HX0JMT0NLUyAqIDQ7CiAKIAkvKiBsb29wIGZvciBmb3IgYWxsIHBhZ2luZyBibG9ja3MgKyBDU1MgYmxvY2sgKi8KIAlmb3IgKGJsa19pZHggPSAwOyBibGtfaWR4IDwgbXZtLT5udW1fb2ZfcGFnaW5nX2JsayArIDE7IGJsa19pZHgrKykgewotCQlkZXZfcGh5X2FkZHIgPQotCQkJY3B1X3RvX2xlMzIobXZtLT5md19wYWdpbmdfZGJbYmxrX2lkeF0uZndfcGFnaW5nX3BoeXMgPj4KLQkJCQkgICAgUEFHRV8yX0VYUF9TSVpFKTsKLQkJZndfcGFnaW5nX2NtZC5kZXZpY2VfcGh5X2FkZHJbYmxrX2lkeF0gPSBkZXZfcGh5X2FkZHI7CisJCWRtYV9hZGRyX3QgYWRkciA9IG12bS0+ZndfcGFnaW5nX2RiW2Jsa19pZHhdLmZ3X3BhZ2luZ19waHlzOworCisJCWFkZHIgPSBhZGRyID4+IFBBR0VfMl9FWFBfU0laRTsKKworCQlpZiAoaXdsX212bV9oYXNfbmV3X3R4X2FwaShtdm0pKSB7CisJCQlfX2xlNjQgcGh5X2FkZHIgPSBjcHVfdG9fbGU2NChhZGRyKTsKKworCQkJcGFnaW5nX2NtZC5kZXZpY2VfcGh5X2FkZHIuYWRkcjY0W2Jsa19pZHhdID0gcGh5X2FkZHI7CisJCX0gZWxzZSB7CisJCQlfX2xlMzIgcGh5X2FkZHIgPSBjcHVfdG9fbGUzMihhZGRyKTsKKworCQkJcGFnaW5nX2NtZC5kZXZpY2VfcGh5X2FkZHIuYWRkcjMyW2Jsa19pZHhdID0gcGh5X2FkZHI7CisJCX0KIAl9CiAKIAlyZXR1cm4gaXdsX212bV9zZW5kX2NtZF9wZHUobXZtLCBpd2xfY21kX2lkKEZXX1BBR0lOR19CTE9DS19DTUQsCiAJCQkJCQkgICAgSVdMX0FMV0FZU19MT05HX0dST1VQLCAwKSwKLQkJCQkgICAgMCwgc2l6ZW9mKGZ3X3BhZ2luZ19jbWQpLCAmZndfcGFnaW5nX2NtZCk7CisJCQkJICAgIDAsIHNpemUsICZwYWdpbmdfY21kKTsKIH0KIAogLyoKQEAgLTU4MCw5ICs1ODMsOSBAQAogCSAgICBpd2xfZndfZGJnX2NvbmZfdXNuaWZmZXIobXZtLT5mdywgRldfREJHX1NUQVJUX0ZST01fQUxJVkUpICYmCiAJICAgICEoZndfaGFzX2NhcGEoJm12bS0+ZnctPnVjb2RlX2NhcGEsCiAJCQkgIElXTF9VQ09ERV9UTFZfQ0FQQV9VU05JRkZFUl9VTklGSUVEKSkpCi0JCWZ3ID0gaXdsX2dldF91Y29kZV9pbWFnZShtdm0sIElXTF9VQ09ERV9SRUdVTEFSX1VTTklGRkVSKTsKKwkJZncgPSBpd2xfZ2V0X3Vjb2RlX2ltYWdlKG12bS0+ZncsIElXTF9VQ09ERV9SRUdVTEFSX1VTTklGRkVSKTsKIAllbHNlCi0JCWZ3ID0gaXdsX2dldF91Y29kZV9pbWFnZShtdm0sIHVjb2RlX3R5cGUpOworCQlmdyA9IGl3bF9nZXRfdWNvZGVfaW1hZ2UobXZtLT5mdywgdWNvZGVfdHlwZSk7CiAJaWYgKFdBUk5fT04oIWZ3KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJbXZtLT5jdXJfdWNvZGUgPSB1Y29kZV90eXBlOwpAQCAtODI2LDYgKzgyOSw1OSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIGl3bF9tdm1fcGFyc2Vfc2hhcmVkX21lbV9hMDAwKHN0cnVjdCBpd2xfbXZtICptdm0sCisJCQkJCSAgc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCkKK3sKKwlzdHJ1Y3QgaXdsX3NoYXJlZF9tZW1fY2ZnICptZW1fY2ZnID0gKHZvaWQgKilwa3QtPmRhdGE7CisJaW50IGk7CisKKwltdm0tPnNoYXJlZF9tZW1fY2ZnLm51bV90eGZpZm9fZW50cmllcyA9CisJCUFSUkFZX1NJWkUobXZtLT5zaGFyZWRfbWVtX2NmZy50eGZpZm9fc2l6ZSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWVtX2NmZy0+dHhmaWZvX3NpemUpOyBpKyspCisJCW12bS0+c2hhcmVkX21lbV9jZmcudHhmaWZvX3NpemVbaV0gPQorCQkJbGUzMl90b19jcHUobWVtX2NmZy0+dHhmaWZvX3NpemVbaV0pOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG12bS0+c2hhcmVkX21lbV9jZmcucnhmaWZvX3NpemUpOyBpKyspCisJCW12bS0+c2hhcmVkX21lbV9jZmcucnhmaWZvX3NpemVbaV0gPQorCQkJbGUzMl90b19jcHUobWVtX2NmZy0+cnhmaWZvX3NpemVbaV0pOworCisJQlVJTERfQlVHX09OKHNpemVvZihtdm0tPnNoYXJlZF9tZW1fY2ZnLmludGVybmFsX3R4Zmlmb19zaXplKSAhPQorCQkgICAgIHNpemVvZihtZW1fY2ZnLT5pbnRlcm5hbF90eGZpZm9fc2l6ZSkpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXZtLT5zaGFyZWRfbWVtX2NmZy5pbnRlcm5hbF90eGZpZm9fc2l6ZSk7CisJICAgICBpKyspCisJCW12bS0+c2hhcmVkX21lbV9jZmcuaW50ZXJuYWxfdHhmaWZvX3NpemVbaV0gPQorCQkJbGUzMl90b19jcHUobWVtX2NmZy0+aW50ZXJuYWxfdHhmaWZvX3NpemVbaV0pOworfQorCitzdGF0aWMgdm9pZCBpd2xfbXZtX3BhcnNlX3NoYXJlZF9tZW0oc3RydWN0IGl3bF9tdm0gKm12bSwKKwkJCQkgICAgIHN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QpCit7CisJc3RydWN0IGl3bF9zaGFyZWRfbWVtX2NmZ192MSAqbWVtX2NmZyA9ICh2b2lkICopcGt0LT5kYXRhOworCWludCBpOworCisJbXZtLT5zaGFyZWRfbWVtX2NmZy5udW1fdHhmaWZvX2VudHJpZXMgPQorCQlBUlJBWV9TSVpFKG12bS0+c2hhcmVkX21lbV9jZmcudHhmaWZvX3NpemUpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1lbV9jZmctPnR4Zmlmb19zaXplKTsgaSsrKQorCQltdm0tPnNoYXJlZF9tZW1fY2ZnLnR4Zmlmb19zaXplW2ldID0KKwkJCWxlMzJfdG9fY3B1KG1lbV9jZmctPnR4Zmlmb19zaXplW2ldKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtdm0tPnNoYXJlZF9tZW1fY2ZnLnJ4Zmlmb19zaXplKTsgaSsrKQorCQltdm0tPnNoYXJlZF9tZW1fY2ZnLnJ4Zmlmb19zaXplW2ldID0KKwkJCWxlMzJfdG9fY3B1KG1lbV9jZmctPnJ4Zmlmb19zaXplW2ldKTsKKworCS8qIG5ldyBBUEkgaGFzIG1vcmUgZGF0YSwgZnJvbSByeGZpZm9fYWRkciBmaWVsZCBhbmQgb24gKi8KKwlpZiAoZndfaGFzX2NhcGEoJm12bS0+ZnctPnVjb2RlX2NhcGEsCisJCQlJV0xfVUNPREVfVExWX0NBUEFfRVhURU5EX1NIQVJFRF9NRU1fQ0ZHKSkgeworCQlCVUlMRF9CVUdfT04oc2l6ZW9mKG12bS0+c2hhcmVkX21lbV9jZmcuaW50ZXJuYWxfdHhmaWZvX3NpemUpICE9CisJCQkgICAgIHNpemVvZihtZW1fY2ZnLT5pbnRlcm5hbF90eGZpZm9fc2l6ZSkpOworCisJCWZvciAoaSA9IDA7CisJCSAgICAgaSA8IEFSUkFZX1NJWkUobXZtLT5zaGFyZWRfbWVtX2NmZy5pbnRlcm5hbF90eGZpZm9fc2l6ZSk7CisJCSAgICAgaSsrKQorCQkJbXZtLT5zaGFyZWRfbWVtX2NmZy5pbnRlcm5hbF90eGZpZm9fc2l6ZVtpXSA9CisJCQkJbGUzMl90b19jcHUobWVtX2NmZy0+aW50ZXJuYWxfdHhmaWZvX3NpemVbaV0pOworCX0KK30KKwogc3RhdGljIHZvaWQgaXdsX212bV9nZXRfc2hhcmVkX21lbV9jb25mKHN0cnVjdCBpd2xfbXZtICptdm0pCiB7CiAJc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7CkBAIC04MzMsOSArODg5LDcgQEAKIAkJLmRhdGEgPSB7IE5VTEwsIH0sCiAJCS5sZW4gPSB7IDAsIH0sCiAJfTsKLQlzdHJ1Y3QgaXdsX3NoYXJlZF9tZW1fY2ZnICptZW1fY2ZnOwogCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3Q7Ci0JdTMyIGk7CiAKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZtdm0tPm11dGV4KTsKIApAQCAtODQ5LDQ1ICs5MDMsMTAgQEAKIAkJcmV0dXJuOwogCiAJcGt0ID0gY21kLnJlc3BfcGt0OwotCW1lbV9jZmcgPSAodm9pZCAqKXBrdC0+ZGF0YTsKLQotCW12bS0+c2hhcmVkX21lbV9jZmcuc2hhcmVkX21lbV9hZGRyID0KLQkJbGUzMl90b19jcHUobWVtX2NmZy0+c2hhcmVkX21lbV9hZGRyKTsKLQltdm0tPnNoYXJlZF9tZW1fY2ZnLnNoYXJlZF9tZW1fc2l6ZSA9Ci0JCWxlMzJfdG9fY3B1KG1lbV9jZmctPnNoYXJlZF9tZW1fc2l6ZSk7Ci0JbXZtLT5zaGFyZWRfbWVtX2NmZy5zYW1wbGVfYnVmZl9hZGRyID0KLQkJbGUzMl90b19jcHUobWVtX2NmZy0+c2FtcGxlX2J1ZmZfYWRkcik7Ci0JbXZtLT5zaGFyZWRfbWVtX2NmZy5zYW1wbGVfYnVmZl9zaXplID0KLQkJbGUzMl90b19jcHUobWVtX2NmZy0+c2FtcGxlX2J1ZmZfc2l6ZSk7Ci0JbXZtLT5zaGFyZWRfbWVtX2NmZy50eGZpZm9fYWRkciA9IGxlMzJfdG9fY3B1KG1lbV9jZmctPnR4Zmlmb19hZGRyKTsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtdm0tPnNoYXJlZF9tZW1fY2ZnLnR4Zmlmb19zaXplKTsgaSsrKQotCQltdm0tPnNoYXJlZF9tZW1fY2ZnLnR4Zmlmb19zaXplW2ldID0KLQkJCWxlMzJfdG9fY3B1KG1lbV9jZmctPnR4Zmlmb19zaXplW2ldKTsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtdm0tPnNoYXJlZF9tZW1fY2ZnLnJ4Zmlmb19zaXplKTsgaSsrKQotCQltdm0tPnNoYXJlZF9tZW1fY2ZnLnJ4Zmlmb19zaXplW2ldID0KLQkJCWxlMzJfdG9fY3B1KG1lbV9jZmctPnJ4Zmlmb19zaXplW2ldKTsKLQltdm0tPnNoYXJlZF9tZW1fY2ZnLnBhZ2VfYnVmZl9hZGRyID0KLQkJbGUzMl90b19jcHUobWVtX2NmZy0+cGFnZV9idWZmX2FkZHIpOwotCW12bS0+c2hhcmVkX21lbV9jZmcucGFnZV9idWZmX3NpemUgPQotCQlsZTMyX3RvX2NwdShtZW1fY2ZnLT5wYWdlX2J1ZmZfc2l6ZSk7Ci0KLQkvKiBuZXcgQVBJIGhhcyBtb3JlIGRhdGEgKi8KLQlpZiAoZndfaGFzX2NhcGEoJm12bS0+ZnctPnVjb2RlX2NhcGEsCi0JCQlJV0xfVUNPREVfVExWX0NBUEFfRVhURU5EX1NIQVJFRF9NRU1fQ0ZHKSkgewotCQltdm0tPnNoYXJlZF9tZW1fY2ZnLnJ4Zmlmb19hZGRyID0KLQkJCWxlMzJfdG9fY3B1KG1lbV9jZmctPnJ4Zmlmb19hZGRyKTsKLQkJbXZtLT5zaGFyZWRfbWVtX2NmZy5pbnRlcm5hbF90eGZpZm9fYWRkciA9Ci0JCQlsZTMyX3RvX2NwdShtZW1fY2ZnLT5pbnRlcm5hbF90eGZpZm9fYWRkcik7Ci0KLQkJQlVJTERfQlVHX09OKHNpemVvZihtdm0tPnNoYXJlZF9tZW1fY2ZnLmludGVybmFsX3R4Zmlmb19zaXplKSAhPQotCQkJICAgICBzaXplb2YobWVtX2NmZy0+aW50ZXJuYWxfdHhmaWZvX3NpemUpKTsKLQotCQlmb3IgKGkgPSAwOwotCQkgICAgIGkgPCBBUlJBWV9TSVpFKG12bS0+c2hhcmVkX21lbV9jZmcuaW50ZXJuYWxfdHhmaWZvX3NpemUpOwotCQkgICAgIGkrKykKLQkJCW12bS0+c2hhcmVkX21lbV9jZmcuaW50ZXJuYWxfdHhmaWZvX3NpemVbaV0gPQotCQkJCWxlMzJfdG9fY3B1KG1lbV9jZmctPmludGVybmFsX3R4Zmlmb19zaXplW2ldKTsKLQl9CisJaWYgKGl3bF9tdm1faGFzX25ld190eF9hcGkobXZtKSkKKwkJaXdsX212bV9wYXJzZV9zaGFyZWRfbWVtX2EwMDAobXZtLCBwa3QpOworCWVsc2UKKwkJaXdsX212bV9wYXJzZV9zaGFyZWRfbWVtKG12bSwgcGt0KTsKIAogCUlXTF9ERUJVR19JTkZPKG12bSwgIlNIQVJFRCBNRU0gQ0ZHOiBnb3QgbWVtb3J5IG9mZnNldHMvc2l6ZXNcbiIpOwogCkBAIC0xMDI3LDE5ICsxMDQ2LDExIEBACiB7CiAJc3RydWN0IGl3bF9tdm1fc2FyX3RhYmxlIHNhcl90YWJsZTsKIAlzdHJ1Y3QgaXdsX2Rldl90eF9wb3dlcl9jbWQgY21kID0gewotCQkudjMudjIuc2V0X21vZGUgPSBjcHVfdG9fbGUzMihJV0xfVFhfUE9XRVJfTU9ERV9TRVRfQ0hBSU5TKSwKKwkJLnYzLnNldF9tb2RlID0gY3B1X3RvX2xlMzIoSVdMX1RYX1BPV0VSX01PREVfU0VUX0NIQUlOUyksCiAJfTsKIAlpbnQgcmV0LCBpLCBqLCBpZHg7CiAJaW50IGxlbiA9IHNpemVvZihjbWQpOwogCi0JLyogd2UgY2FuJ3QgZG8gYW55dGhpbmcgd2l0aCB0aGUgdGFibGUgaWYgdGhlIEZXIGRvZXNuJ3Qgc3VwcG9ydCBpdCAqLwotCWlmICghZndfaGFzX2FwaSgmbXZtLT5mdy0+dWNvZGVfY2FwYSwKLQkJCUlXTF9VQ09ERV9UTFZfQVBJX1RYX1BPV0VSX0NIQUlOKSkgewotCQlJV0xfREVCVUdfUkFESU8obXZtLAotCQkJCSJGVyBkb2Vzbid0IHN1cHBvcnQgcGVyLWNoYWluIFRYIHBvd2VyIHNldHRpbmdzLlxuIik7Ci0JCXJldHVybiAwOwotCX0KLQogCWlmICghZndfaGFzX2NhcGEoJm12bS0+ZnctPnVjb2RlX2NhcGEsIElXTF9VQ09ERV9UTFZfQ0FQQV9UWF9QT1dFUl9BQ0spKQogCQlsZW4gPSBzaXplb2YoY21kLnYzKTsKIApAQCAtMTA5NiwyNyArMTEwNywyNyBAQAogCSAqIChmb3IgZXhhbXBsZSwgaWYgd2Ugd2VyZSBpbiBSRktJTEwpCiAJICovCiAJcmV0ID0gaXdsX3J1bl9pbml0X212bV91Y29kZShtdm0sIGZhbHNlKTsKLQlpZiAocmV0ICYmICFpd2xtdm1fbW9kX3BhcmFtcy5pbml0X2RiZykgeworCisJaWYgKGl3bG12bV9tb2RfcGFyYW1zLmluaXRfZGJnKQorCQlyZXR1cm4gMDsKKworCWlmIChyZXQpIHsKIAkJSVdMX0VSUihtdm0sICJGYWlsZWQgdG8gcnVuIElOSVQgdWNvZGU6ICVkXG4iLCByZXQpOwogCQkvKiB0aGlzIGNhbid0IGhhcHBlbiAqLwogCQlpZiAoV0FSTl9PTihyZXQgPiAwKSkKIAkJCXJldCA9IC1FUkZLSUxMOwogCQlnb3RvIGVycm9yOwogCX0KLQlpZiAoIWl3bG12bV9tb2RfcGFyYW1zLmluaXRfZGJnKSB7Ci0JCS8qCi0JCSAqIFN0b3AgYW5kIHN0YXJ0IHRoZSB0cmFuc3BvcnQgd2l0aG91dCBlbnRlcmluZyBsb3cgcG93ZXIKLQkJICogbW9kZS4gVGhpcyB3aWxsIHNhdmUgdGhlIHN0YXRlIG9mIG90aGVyIGNvbXBvbmVudHMgb24gdGhlCi0JCSAqIGRldmljZSB0aGF0IGFyZSB0cmlnZ2VyZWQgYnkgdGhlIElOSVQgZmlyd21hcmUgKE1GVUFSVCkuCi0JCSAqLwotCQlfaXdsX3RyYW5zX3N0b3BfZGV2aWNlKG12bS0+dHJhbnMsIGZhbHNlKTsKLQkJcmV0ID0gX2l3bF90cmFuc19zdGFydF9odyhtdm0tPnRyYW5zLCBmYWxzZSk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGVycm9yOwotCX0KIAotCWlmIChpd2xtdm1fbW9kX3BhcmFtcy5pbml0X2RiZykKLQkJcmV0dXJuIDA7CisJLyoKKwkgKiBTdG9wIGFuZCBzdGFydCB0aGUgdHJhbnNwb3J0IHdpdGhvdXQgZW50ZXJpbmcgbG93IHBvd2VyCisJICogbW9kZS4gVGhpcyB3aWxsIHNhdmUgdGhlIHN0YXRlIG9mIG90aGVyIGNvbXBvbmVudHMgb24gdGhlCisJICogZGV2aWNlIHRoYXQgYXJlIHRyaWdnZXJlZCBieSB0aGUgSU5JVCBmaXJ3bWFyZSAoTUZVQVJUKS4KKwkgKi8KKwlfaXdsX3RyYW5zX3N0b3BfZGV2aWNlKG12bS0+dHJhbnMsIGZhbHNlKTsKKwlyZXQgPSBfaXdsX3RyYW5zX3N0YXJ0X2h3KG12bS0+dHJhbnMsIGZhbHNlKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOwogCiAJcmV0ID0gaXdsX212bV9sb2FkX3Vjb2RlX3dhaXRfYWxpdmUobXZtLCBJV0xfVUNPREVfUkVHVUxBUik7CiAJaWYgKHJldCkgewpAQCAtMTIxNCw5ICsxMjI1LDEyIEBACiAJfQogCiAJLyogVE9ETzogcmVhZCB0aGUgYnVkZ2V0IGZyb20gQklPUyAvIFBsYXRmb3JtIE5WTSAqLwotCWlmIChpd2xfbXZtX2lzX2N0ZHBfc3VwcG9ydGVkKG12bSkgJiYgbXZtLT5jb29saW5nX2Rldi5jdXJfc3RhdGUgPiAwKQorCWlmIChpd2xfbXZtX2lzX2N0ZHBfc3VwcG9ydGVkKG12bSkgJiYgbXZtLT5jb29saW5nX2Rldi5jdXJfc3RhdGUgPiAwKSB7CiAJCXJldCA9IGl3bF9tdm1fY3RkcF9jb21tYW5kKG12bSwgQ1REUF9DTURfT1BFUkFUSU9OX1NUQVJULAogCQkJCQkgICBtdm0tPmNvb2xpbmdfZGV2LmN1cl9zdGF0ZSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCX0KICNlbHNlCiAJLyogSW5pdGlhbGl6ZSB0eCBiYWNrb2ZmcyB0byB0aGUgbWluaW1hbCBwb3NzaWJsZSAqLwogCWl3bF9tdm1fdHRfdHhfYmFja29mZihtdm0sIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vbWFjLWN0eHQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL21hYy1jdHh0LmMKaW5kZXggNjljNDJjZS4uNmI5NjJkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vbWFjLWN0eHQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9tYWMtY3R4dC5jCkBAIC01MzksNiArNTM5LDExIEBACiAJCQlpd2xfbXZtX2Rpc2FibGVfdHhxKG12bSwgSVdMX01WTV9PRkZDSEFOTkVMX1FVRVVFLAogCQkJCQkgICAgSVdMX01WTV9PRkZDSEFOTkVMX1FVRVVFLAogCQkJCQkgICAgSVdMX01BWF9USURfQ09VTlQsIDApOworCQllbHNlCisJCQlpd2xfbXZtX2Rpc2FibGVfdHhxKG12bSwKKwkJCQkJICAgIElXTF9NVk1fRFFBX1AyUF9ERVZJQ0VfUVVFVUUsCisJCQkJCSAgICB2aWYtPmh3X3F1ZXVlWzBdLCBJV0xfTUFYX1RJRF9DT1VOVCwKKwkJCQkJICAgIDApOwogCiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6CkBAIC03NjksMjYgKzc3NCw2IEBACiAJCWNtZC0+YWNbdHhmXS5maWZvc19tYXNrID0gQklUKHR4Zik7CiAJfQogCi0JaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkgewotCQkvKiBpbiBBUCBtb2RlLCB0aGUgTUNBU1QgRklGTyB0YWtlcyB0aGUgRURDQSBwYXJhbXMgZnJvbSBWTyAqLwotCQljbWQtPmFjW0lXTF9NVk1fVFhfRklGT19WT10uZmlmb3NfbWFzayB8PQotCQkJQklUKElXTF9NVk1fVFhfRklGT19NQ0FTVCk7Ci0KLQkJLyoKLQkJICogaW4gQVAgbW9kZSwgcGFzcyBwcm9iZSByZXF1ZXN0cyBhbmQgYmVhY29ucyBmcm9tIG90aGVyIEFQcwotCQkgKiAobmVlZGVkIGZvciBodCBwcm90ZWN0aW9uKTsgd2hlbiB0aGVyZSdyZSBubyBhbnkgYXNzb2NpYXRlZAotCQkgKiBzdGF0aW9uIGRvbid0IGFzayBGVyB0byBwYXNzIGJlYWNvbnMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeQotCQkgKiB3YWtlLXVwcy4KLQkJICovCi0JCWNtZC0+ZmlsdGVyX2ZsYWdzIHw9IGNwdV90b19sZTMyKE1BQ19GSUxURVJfSU5fUFJPQkVfUkVRVUVTVCk7Ci0JCWlmIChtdm12aWYtPmFwX2Fzc29jX3N0YV9jb3VudCB8fCAhbXZtLT5kcm9wX2Jjbl9hcF9tb2RlKSB7Ci0JCQljbWQtPmZpbHRlcl9mbGFncyB8PSBjcHVfdG9fbGUzMihNQUNfRklMVEVSX0lOX0JFQUNPTik7Ci0JCQlJV0xfREVCVUdfSEMobXZtLCAiQXNraW5nIEZXIHRvIHBhc3MgYmVhY29uc1xuIik7Ci0JCX0gZWxzZSB7Ci0JCQlJV0xfREVCVUdfSEMobXZtLCAiTm8gbmVlZCB0byByZWNlaXZlIGJlYWNvbnNcbiIpOwotCQl9Ci0JfQotCiAJaWYgKHZpZi0+YnNzX2NvbmYucW9zKQogCQljbWQtPnFvc19mbGFncyB8PSBjcHVfdG9fbGUzMihNQUNfUU9TX0ZMR19VUERBVEVfRURDQSk7CiAKQEAgLTExODYsNiArMTE3MSw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGl3bF9tdm1fbWFjX2N0eHRfY21kX2ZpbGxfYXAoc3RydWN0IGl3bF9tdm0gKm12bSwKIAkJCQkJIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJCSBzdHJ1Y3QgaXdsX21hY19jdHhfY21kICpjbWQsCiAJCQkJCSBzdHJ1Y3QgaXdsX21hY19kYXRhX2FwICpjdHh0X2FwLAogCQkJCQkgYm9vbCBhZGQpCiB7CkBAIC0xMTk2LDYgKzExODIsMjMgQEAKIAkJLmJlYWNvbl9kZXZpY2VfdHMgPSAwCiAJfTsKIAorCS8qIGluIEFQIG1vZGUsIHRoZSBNQ0FTVCBGSUZPIHRha2VzIHRoZSBFRENBIHBhcmFtcyBmcm9tIFZPICovCisJY21kLT5hY1tJV0xfTVZNX1RYX0ZJRk9fVk9dLmZpZm9zX21hc2sgfD0gQklUKElXTF9NVk1fVFhfRklGT19NQ0FTVCk7CisKKwkvKgorCSAqIGluIEFQIG1vZGUsIHBhc3MgcHJvYmUgcmVxdWVzdHMgYW5kIGJlYWNvbnMgZnJvbSBvdGhlciBBUHMKKwkgKiAobmVlZGVkIGZvciBodCBwcm90ZWN0aW9uKTsgd2hlbiB0aGVyZSdyZSBubyBhbnkgYXNzb2NpYXRlZAorCSAqIHN0YXRpb24gZG9uJ3QgYXNrIEZXIHRvIHBhc3MgYmVhY29ucyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5CisJICogd2FrZS11cHMuCisJICovCisJY21kLT5maWx0ZXJfZmxhZ3MgfD0gY3B1X3RvX2xlMzIoTUFDX0ZJTFRFUl9JTl9QUk9CRV9SRVFVRVNUKTsKKwlpZiAobXZtdmlmLT5hcF9hc3NvY19zdGFfY291bnQgfHwgIW12bS0+ZHJvcF9iY25fYXBfbW9kZSkgeworCQljbWQtPmZpbHRlcl9mbGFncyB8PSBjcHVfdG9fbGUzMihNQUNfRklMVEVSX0lOX0JFQUNPTik7CisJCUlXTF9ERUJVR19IQyhtdm0sICJBc2tpbmcgRlcgdG8gcGFzcyBiZWFjb25zXG4iKTsKKwl9IGVsc2UgeworCQlJV0xfREVCVUdfSEMobXZtLCAiTm8gbmVlZCB0byByZWNlaXZlIGJlYWNvbnNcbiIpOworCX0KKwogCWN0eHRfYXAtPmJpID0gY3B1X3RvX2xlMzIodmlmLT5ic3NfY29uZi5iZWFjb25faW50KTsKIAljdHh0X2FwLT5iaV9yZWNpcHJvY2FsID0KIAkJY3B1X3RvX2xlMzIoaXdsX212bV9yZWNpcHJvY2FsKHZpZi0+YnNzX2NvbmYuYmVhY29uX2ludCkpOwpAQCAtMTI1Myw3ICsxMjU2LDcgQEAKIAlpd2xfbXZtX21hY19jdHh0X2NtZF9jb21tb24obXZtLCB2aWYsICZjbWQsIE5VTEwsIGFjdGlvbik7CiAKIAkvKiBGaWxsIHRoZSBkYXRhIHNwZWNpZmljIGZvciBhcCBtb2RlICovCi0JaXdsX212bV9tYWNfY3R4dF9jbWRfZmlsbF9hcChtdm0sIHZpZiwgJmNtZC5hcCwKKwlpd2xfbXZtX21hY19jdHh0X2NtZF9maWxsX2FwKG12bSwgdmlmLCAmY21kLCAmY21kLmFwLAogCQkJCSAgICAgYWN0aW9uID09IEZXX0NUWFRfQUNUSU9OX0FERCk7CiAKIAlyZXR1cm4gaXdsX212bV9tYWNfY3R4dF9zZW5kX2NtZChtdm0sICZjbWQpOwpAQCAtMTI3Miw3ICsxMjc1LDcgQEAKIAlpd2xfbXZtX21hY19jdHh0X2NtZF9jb21tb24obXZtLCB2aWYsICZjbWQsIE5VTEwsIGFjdGlvbik7CiAKIAkvKiBGaWxsIHRoZSBkYXRhIHNwZWNpZmljIGZvciBHTyBtb2RlICovCi0JaXdsX212bV9tYWNfY3R4dF9jbWRfZmlsbF9hcChtdm0sIHZpZiwgJmNtZC5nby5hcCwKKwlpd2xfbXZtX21hY19jdHh0X2NtZF9maWxsX2FwKG12bSwgdmlmLCAmY21kLCAmY21kLmdvLmFwLAogCQkJCSAgICAgYWN0aW9uID09IEZXX0NUWFRfQUNUSU9OX0FERCk7CiAKIAljbWQuZ28uY3R3aW4gPSBjcHVfdG9fbGUzMihub2EtPm9wcHBzX2N0d2luZG93ICYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL21hYzgwMjExLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9tYWM4MDIxMS5jCmluZGV4IDZkNjA2NDUuLjMxOGVmZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL21hYzgwMjExLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vbWFjODAyMTEuYwpAQCAtNDY1LDcgKzQ2NSw3IEBACiAJaHctPnVhcHNkX3F1ZXVlcyA9IElXTF9NVk1fVUFQU0RfUVVFVUVTOwogCWh3LT51YXBzZF9tYXhfc3BfbGVuID0gSVdMX1VBUFNEX01BWF9TUDsKIAotCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKG12bS0+Y2lwaGVycykgPCBBUlJBWV9TSVpFKG12bV9jaXBoZXJzKSArIDQpOworCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKG12bS0+Y2lwaGVycykgPCBBUlJBWV9TSVpFKG12bV9jaXBoZXJzKSArIDYpOwogCW1lbWNweShtdm0tPmNpcGhlcnMsIG12bV9jaXBoZXJzLCBzaXplb2YobXZtX2NpcGhlcnMpKTsKIAlody0+d2lwaHktPm5fY2lwaGVyX3N1aXRlcyA9IEFSUkFZX1NJWkUobXZtX2NpcGhlcnMpOwogCWh3LT53aXBoeS0+Y2lwaGVyX3N1aXRlcyA9IG12bS0+Y2lwaGVyczsKQEAgLTQ3OSwxNyArNDc5LDIzIEBACiAJCWh3LT53aXBoeS0+bl9jaXBoZXJfc3VpdGVzKys7CiAJfQogCi0JLyoKLQkgKiBFbmFibGUgMTF3IGlmIGFkdmVydGlzZWQgYnkgZmlybXdhcmUgYW5kIHNvZnR3YXJlIGNyeXB0bwotCSAqIGlzIG5vdCBlbmFibGVkIChhcyB0aGUgZmlybXdhcmUgd2lsbCBpbnRlcnByZXQgc29tZSBtZ210Ci0JICogcGFja2V0cywgc28gZW5hYmxpbmcgaXQgd2l0aCBzb2Z0d2FyZSBjcnlwdG8gaXNuJ3Qgc2FmZSkKKwkvKiBFbmFibGUgMTF3IGlmIHNvZnR3YXJlIGNyeXB0byBpcyBub3QgZW5hYmxlZCAoYXMgdGhlCisJICogZmlybXdhcmUgd2lsbCBpbnRlcnByZXQgc29tZSBtZ210IHBhY2tldHMsIHNvIGVuYWJsaW5nIGl0CisJICogd2l0aCBzb2Z0d2FyZSBjcnlwdG8gaXNuJ3Qgc2FmZSkuCiAJICovCi0JaWYgKG12bS0+ZnctPnVjb2RlX2NhcGEuZmxhZ3MgJiBJV0xfVUNPREVfVExWX0ZMQUdTX01GUCAmJgotCSAgICAhaXdsd2lmaV9tb2RfcGFyYW1zLnN3X2NyeXB0bykgeworCWlmICghaXdsd2lmaV9tb2RfcGFyYW1zLnN3X2NyeXB0bykgewogCQlpZWVlODAyMTFfaHdfc2V0KGh3LCBNRlBfQ0FQQUJMRSk7CiAJCW12bS0+Y2lwaGVyc1tody0+d2lwaHktPm5fY2lwaGVyX3N1aXRlc10gPQogCQkJV0xBTl9DSVBIRVJfU1VJVEVfQUVTX0NNQUM7CiAJCWh3LT53aXBoeS0+bl9jaXBoZXJfc3VpdGVzKys7CisJCWlmIChpd2xfbXZtX2hhc19uZXdfcnhfYXBpKG12bSkpIHsKKwkJCW12bS0+Y2lwaGVyc1tody0+d2lwaHktPm5fY2lwaGVyX3N1aXRlc10gPQorCQkJCVdMQU5fQ0lQSEVSX1NVSVRFX0JJUF9HTUFDXzEyODsKKwkJCWh3LT53aXBoeS0+bl9jaXBoZXJfc3VpdGVzKys7CisJCQltdm0tPmNpcGhlcnNbaHctPndpcGh5LT5uX2NpcGhlcl9zdWl0ZXNdID0KKwkJCQlXTEFOX0NJUEhFUl9TVUlURV9CSVBfR01BQ18yNTY7CisJCQlody0+d2lwaHktPm5fY2lwaGVyX3N1aXRlcysrOworCQl9CiAJfQogCiAJLyogY3VycmVudGx5IEZXIEFQSSBzdXBwb3J0cyBvbmx5IG9uZSBvcHRpb25hbCBjaXBoZXIgc2NoZW1lICovCkBAIC01MzksOSArNTQ1LDcgQEAKIAkJaHctPndpcGh5LT5yZWd1bGF0b3J5X2ZsYWdzIHw9IFJFR1VMQVRPUllfQ1VTVE9NX1JFRyB8CiAJCQkJCSAgICAgICBSRUdVTEFUT1JZX0RJU0FCTEVfQkVBQ09OX0hJTlRTOwogCi0JaWYgKG12bS0+ZnctPnVjb2RlX2NhcGEuZmxhZ3MgJiBJV0xfVUNPREVfVExWX0ZMQUdTX0dPX1VBUFNEKQotCQlody0+d2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfQVBfVUFQU0Q7Ci0KKwlody0+d2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfQVBfVUFQU0Q7CiAJaHctPndpcGh5LT5mbGFncyB8PSBXSVBIWV9GTEFHX0hBU19DSEFOTkVMX1NXSVRDSDsKIAogCWh3LT53aXBoeS0+aWZhY2VfY29tYmluYXRpb25zID0gaXdsX212bV9pZmFjZV9jb21iaW5hdGlvbnM7CkBAIC02MjQsNiArNjI4LDcgQEAKIAlody0+d2lwaHktPmZlYXR1cmVzIHw9IE5MODAyMTFfRkVBVFVSRV9QMlBfR09fQ1RXSU4gfAogCQkJICAgICAgIE5MODAyMTFfRkVBVFVSRV9MT1dfUFJJT1JJVFlfU0NBTiB8CiAJCQkgICAgICAgTkw4MDIxMV9GRUFUVVJFX1AyUF9HT19PUFBQUyB8CisJCQkgICAgICAgTkw4MDIxMV9GRUFUVVJFX0FQX01PREVfQ0hBTl9XSURUSF9DSEFOR0UgfAogCQkJICAgICAgIE5MODAyMTFfRkVBVFVSRV9EWU5BTUlDX1NNUFMgfAogCQkJICAgICAgIE5MODAyMTFfRkVBVFVSRV9TVEFUSUNfU01QUyB8CiAJCQkgICAgICAgTkw4MDIxMV9GRUFUVVJFX1NVUFBPUlRTX1dNTV9BRE1JU1NJT047CkBAIC02NDQsNiArNjQ5LDE2IEBACiAJCQlJV0xfVUNPREVfVExWX0NBUEFfV0ZBX1RQQ19SRVBfSUVfU1VQUE9SVCkpCiAJCWh3LT53aXBoeS0+ZmVhdHVyZXMgfD0gTkw4MDIxMV9GRUFUVVJFX1dGQV9UUENfSUVfSU5fUFJPQkVTOwogCisJaWYgKGZ3X2hhc19hcGkoJm12bS0+ZnctPnVjb2RlX2NhcGEsCisJCSAgICAgICBJV0xfVUNPREVfVExWX0FQSV9TQ0FOX1RTRl9SRVBPUlQpKSB7CisJCXdpcGh5X2V4dF9mZWF0dXJlX3NldChody0+d2lwaHksCisJCQkJICAgICAgTkw4MDIxMV9FWFRfRkVBVFVSRV9TQ0FOX1NUQVJUX1RJTUUpOworCQl3aXBoeV9leHRfZmVhdHVyZV9zZXQoaHctPndpcGh5LAorCQkJCSAgICAgIE5MODAyMTFfRVhUX0ZFQVRVUkVfQlNTX1BBUkVOVF9UU0YpOworCQl3aXBoeV9leHRfZmVhdHVyZV9zZXQoaHctPndpcGh5LAorCQkJCSAgICAgIE5MODAyMTFfRVhUX0ZFQVRVUkVfU0VUX1NDQU5fRFdFTEwpOworCX0KKwogCW12bS0+cnRzX3RocmVzaG9sZCA9IElFRUU4MDIxMV9NQVhfUlRTX1RIUkVTSE9MRDsKIAogI2lmZGVmIENPTkZJR19QTV9TTEVFUApAQCAtNzExLDYgKzcyNiwxMCBAQAogCWlmIChyZXQpCiAJCWl3bF9tdm1fbGVkc19leGl0KG12bSk7CiAKKwlpZiAobXZtLT5jZmctPnZodF9tdV9taW1vX3N1cHBvcnRlZCkKKwkJd2lwaHlfZXh0X2ZlYXR1cmVfc2V0KGh3LT53aXBoeSwKKwkJCQkgICAgICBOTDgwMjExX0VYVF9GRUFUVVJFX01VX01JTU9fQUlSX1NOSUZGRVIpOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTI1MCwyMCArMTI2OSwxOCBAQAogCQkJCXMxNiB0eF9wb3dlcikKIHsKIAlzdHJ1Y3QgaXdsX2Rldl90eF9wb3dlcl9jbWQgY21kID0gewotCQkudjMudjIuc2V0X21vZGUgPSBjcHVfdG9fbGUzMihJV0xfVFhfUE9XRVJfTU9ERV9TRVRfTUFDKSwKLQkJLnYzLnYyLm1hY19jb250ZXh0X2lkID0KKwkJLnYzLnNldF9tb2RlID0gY3B1X3RvX2xlMzIoSVdMX1RYX1BPV0VSX01PREVfU0VUX01BQyksCisJCS52My5tYWNfY29udGV4dF9pZCA9CiAJCQljcHVfdG9fbGUzMihpd2xfbXZtX3ZpZl9mcm9tX21hYzgwMjExKHZpZiktPmlkKSwKLQkJLnYzLnYyLnB3cl9yZXN0cmljdGlvbiA9IGNwdV90b19sZTE2KDggKiB0eF9wb3dlciksCisJCS52My5wd3JfcmVzdHJpY3Rpb24gPSBjcHVfdG9fbGUxNig4ICogdHhfcG93ZXIpLAogCX07CiAJaW50IGxlbiA9IHNpemVvZihjbWQpOwogCiAJaWYgKHR4X3Bvd2VyID09IElXTF9ERUZBVUxUX01BWF9UWF9QT1dFUikKLQkJY21kLnYzLnYyLnB3cl9yZXN0cmljdGlvbiA9IGNwdV90b19sZTE2KElXTF9ERVZfTUFYX1RYX1BPV0VSKTsKKwkJY21kLnYzLnB3cl9yZXN0cmljdGlvbiA9IGNwdV90b19sZTE2KElXTF9ERVZfTUFYX1RYX1BPV0VSKTsKIAogCWlmICghZndfaGFzX2NhcGEoJm12bS0+ZnctPnVjb2RlX2NhcGEsIElXTF9VQ09ERV9UTFZfQ0FQQV9UWF9QT1dFUl9BQ0spKQogCQlsZW4gPSBzaXplb2YoY21kLnYzKTsKLQlpZiAoIWZ3X2hhc19hcGkoJm12bS0+ZnctPnVjb2RlX2NhcGEsIElXTF9VQ09ERV9UTFZfQVBJX1RYX1BPV0VSX0NIQUlOKSkKLQkJbGVuID0gc2l6ZW9mKGNtZC52My52Mik7CiAKIAlyZXR1cm4gaXdsX212bV9zZW5kX2NtZF9wZHUobXZtLCBSRURVQ0VfVFhfUE9XRVJfQ01ELCAwLCBsZW4sICZjbWQpOwogfQpAQCAtMjIyMCw2ICsyMjM3LDEwIEBACiAJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKIAkJaXdsX212bV9ic3NfaW5mb19jaGFuZ2VkX2FwX2lic3MobXZtLCB2aWYsIGJzc19jb25mLCBjaGFuZ2VzKTsKIAkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOgorCQlpZiAoY2hhbmdlcyAmIEJTU19DSEFOR0VEX01VX0dST1VQUykKKwkJCWl3bF9tdm1fdXBkYXRlX211X2dyb3Vwcyhtdm0sIHZpZik7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8qIHNob3VsZG4ndCBoYXBwZW4gKi8KIAkJV0FSTl9PTl9PTkNFKDEpOwpAQCAtMjc0Niw2ICsyNzY3LDggQEAKIAkJa2V5LT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfUFVUX0lWX1NQQUNFOwogCQlicmVhazsKIAljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDOgorCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQklQX0dNQUNfMTI4OgorCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQklQX0dNQUNfMjU2OgogCQlXQVJOX09OX09OQ0UoIWllZWU4MDIxMV9od19jaGVjayhodywgTUZQX0NBUEFCTEUpKTsKIAkJYnJlYWs7CiAJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKQEAgLTI3NzksOSArMjgwMiwxMSBAQAogCQkJICogR1RLIG9uIEFQIGludGVyZmFjZSBpcyBhIFRYLW9ubHkga2V5LCByZXR1cm4gMDsKIAkJCSAqIG9uIElCU1MgdGhleSdyZSBwZXItc3RhdGlvbiBhbmQgYmVjYXVzZSB3ZSdyZSBsYXp5CiAJCQkgKiB3ZSBkb24ndCBzdXBwb3J0IHRoZW0gZm9yIFJYLCBzbyBkbyB0aGUgc2FtZS4KLQkJCSAqIENNQUMgaW4gQVAvSUJTUyBtb2RlcyBtdXN0IGJlIGRvbmUgaW4gc29mdHdhcmUuCisJCQkgKiBDTUFDL0dNQUMgaW4gQVAvSUJTUyBtb2RlcyBtdXN0IGJlIGRvbmUgaW4gc29mdHdhcmUuCiAJCQkgKi8KLQkJCWlmIChrZXktPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQykKKwkJCWlmIChrZXktPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQyB8fAorCQkJICAgIGtleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX0JJUF9HTUFDXzEyOCB8fAorCQkJICAgIGtleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX0JJUF9HTUFDXzI1NikKIAkJCQlyZXQgPSAtRU9QTk9UU1VQUDsKIAkJCWVsc2UKIAkJCQlyZXQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vbXZtLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9tdm0uaAppbmRleCBiNGZjODZkLi5kMTdjYmY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9tdm0uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9tdm0uaApAQCAtNDY3LDYgKzQ2Nyw4IEBACiBzdGF0aWMgaW5saW5lIHN0cnVjdCBpd2xfbXZtX3ZpZiAqCiBpd2xfbXZtX3ZpZl9mcm9tX21hYzgwMjExKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCiB7CisJaWYgKCF2aWYpCisJCXJldHVybiBOVUxMOwogCXJldHVybiAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7CiB9CiAKQEAgLTYwMiwxNiArNjA0LDkgQEAKIH07CiAKIHN0cnVjdCBpd2xfbXZtX3NoYXJlZF9tZW1fY2ZnIHsKLQl1MzIgc2hhcmVkX21lbV9hZGRyOwotCXUzMiBzaGFyZWRfbWVtX3NpemU7Ci0JdTMyIHNhbXBsZV9idWZmX2FkZHI7Ci0JdTMyIHNhbXBsZV9idWZmX3NpemU7Ci0JdTMyIHR4Zmlmb19hZGRyOworCWludCBudW1fdHhmaWZvX2VudHJpZXM7CiAJdTMyIHR4Zmlmb19zaXplW1RYX0ZJRk9fTUFYX05VTV07CiAJdTMyIHJ4Zmlmb19zaXplW1JYX0ZJRk9fTUFYX05VTV07Ci0JdTMyIHBhZ2VfYnVmZl9hZGRyOwotCXUzMiBwYWdlX2J1ZmZfc2l6ZTsKLQl1MzIgcnhmaWZvX2FkZHI7CiAJdTMyIGludGVybmFsX3R4Zmlmb19hZGRyOwogCXUzMiBpbnRlcm5hbF90eGZpZm9fc2l6ZVtUWF9GSUZPX0lOVEVSTkFMX01BWF9OVU1dOwogfTsKQEAgLTY5Nyw2ICs2OTIsMTAgQEAKICAqCWl0LiBJbiB0aGlzIHN0YXRlLCB3aGVuIGEgbmV3IHF1ZXVlIGlzIG5lZWRlZCB0byBiZSBhbGxvY2F0ZWQgYnV0IG5vCiAgKglzdWNoIGZyZWUgcXVldWUgZXhpc3RzLCBhbiBpbmFjdGl2ZSBxdWV1ZSBtaWdodCBiZSBmcmVlZCBhbmQgZ2l2ZW4gdG8KICAqCXRoZSBuZXcgUkEvVElELgorICogQElXTF9NVk1fUVVFVUVfUkVDT05GSUdVUklORzogcXVldWUgaXMgYmVpbmcgcmVjb25maWd1cmVkCisgKglUaGlzIGlzIHRoZSBzdGF0ZSBvZiBhIHF1ZXVlIHRoYXQgaGFzIGhhZCB0cmFmZmljIHBhc3MgdGhyb3VnaCBpdCwgYnV0CisgKgluZWVkcyB0byBiZSByZWNvbmZpZ3VyZWQgZm9yIHNvbWUgcmVhc29uLCBlLmcuIHRoZSBxdWV1ZSBuZWVkcyB0bworICoJYmVjb21lIHVuc2hhcmVkIGFuZCBhZ2dyZWdhdGlvbnMgcmUtZW5hYmxlZCBvbi4KICAqLwogZW51bSBpd2xfbXZtX3F1ZXVlX3N0YXR1cyB7CiAJSVdMX01WTV9RVUVVRV9GUkVFLApAQCAtNzA0LDEwICs3MDMsMTEgQEAKIAlJV0xfTVZNX1FVRVVFX1JFQURZLAogCUlXTF9NVk1fUVVFVUVfU0hBUkVELAogCUlXTF9NVk1fUVVFVUVfSU5BQ1RJVkUsCisJSVdMX01WTV9RVUVVRV9SRUNPTkZJR1VSSU5HLAogfTsKIAogI2RlZmluZSBJV0xfTVZNX0RRQV9RVUVVRV9USU1FT1VUCSg1ICogSFopCi0jZGVmaW5lIElXTF9NVk1fTlVNX0NJUEhFUlMgICAgICAgICAgICAgOAorI2RlZmluZSBJV0xfTVZNX05VTV9DSVBIRVJTICAgICAgICAgICAgIDEwCiAKIHN0cnVjdCBpd2xfbXZtIHsKIAkvKiBmb3IgbG9nZ2VyIGFjY2VzcyAqLwpAQCAtNzY3LDYgKzc2Nyw3IEBACiAJCXU4IHJhX3N0YV9pZDsgLyogVGhlIFJBIHRoaXMgcXVldWUgaXMgbWFwcGVkIHRvLCBpZiBleGlzdHMgKi8KIAkJYm9vbCByZXNlcnZlZDsgLyogSXMgdGhpcyB0aGUgVFhRIHJlc2VydmVkIGZvciBhIFNUQSAqLwogCQl1OCBtYWM4MDIxMV9hYzsgLyogVGhlIG1hYzgwMjExIEFDIHRoaXMgcXVldWUgaXMgbWFwcGVkIHRvICovCisJCXU4IHR4cV90aWQ7IC8qIFRoZSBUSUQgIm93bmVyIiBvZiB0aGlzIHF1ZXVlKi8KIAkJdTE2IHRpZF9iaXRtYXA7IC8qIEJpdG1hcCBvZiB0aGUgVElEcyBtYXBwZWQgdG8gdGhpcyBxdWV1ZSAqLwogCQkvKiBUaW1lc3RhbXAgZm9yIGluYWN0aXZhdGlvbiBwZXIgVElEIG9mIHRoaXMgcXVldWUgKi8KIAkJdW5zaWduZWQgbG9uZyBsYXN0X2ZyYW1lX3RpbWVbSVdMX01BWF9USURfQ09VTlQgKyAxXTsKQEAgLTgyMCw2ICs4MjEsMTIgQEAKIAkvKiBVTUFDIHNjYW4gdHJhY2tpbmcgKi8KIAl1MzIgc2Nhbl91aWRfc3RhdHVzW0lXTF9NVk1fTUFYX1VNQUNfU0NBTlNdOwogCisJLyogc3RhcnQgdGltZSBvZiBsYXN0IHNjYW4gaW4gVFNGIG9mIHRoZSBtYWMgdGhhdCByZXF1ZXN0ZWQgdGhlIHNjYW4gKi8KKwl1NjQgc2Nhbl9zdGFydDsKKworCS8qIHRoZSB2aWYgdGhhdCByZXF1ZXN0ZWQgdGhlIGN1cnJlbnQgc2NhbiAqLworCXN0cnVjdCBpd2xfbXZtX3ZpZiAqc2Nhbl92aWY7CisKIAkvKiByeCBjaGFpbiBhbnRlbm5hcyBzZXQgdGhyb3VnaCBkZWJ1Z2ZzIGZvciB0aGUgc2NhbiBjb21tYW5kICovCiAJdTggc2Nhbl9yeF9hbnQ7CiAKQEAgLTExMjIsNiArMTEyOSwxOCBAQAogCQkobXZtLT50cmFucy0+cnVudGltZV9wbV9tb2RlICE9IElXTF9QTEFUX1BNX01PREVfRDBJMyk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBpd2xfbXZtX2lzX2RxYV9kYXRhX3F1ZXVlKHN0cnVjdCBpd2xfbXZtICptdm0sIHU4IHF1ZXVlKQoreworCXJldHVybiAocXVldWUgPj0gSVdMX01WTV9EUUFfTUlOX0RBVEFfUVVFVUUpICYmCisJICAgICAgIChxdWV1ZSA8PSBJV0xfTVZNX0RRQV9NQVhfREFUQV9RVUVVRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpd2xfbXZtX2lzX2RxYV9tZ210X3F1ZXVlKHN0cnVjdCBpd2xfbXZtICptdm0sIHU4IHF1ZXVlKQoreworCXJldHVybiAocXVldWUgPj0gSVdMX01WTV9EUUFfTUlOX01HTVRfUVVFVUUpICYmCisJICAgICAgIChxdWV1ZSA8PSBJV0xfTVZNX0RRQV9NQVhfTUdNVF9RVUVVRSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgYm9vbCBpd2xfbXZtX2lzX2xhcl9zdXBwb3J0ZWQoc3RydWN0IGl3bF9tdm0gKm12bSkKIHsKIAlib29sIG52bV9sYXIgPSBtdm0tPm52bV9kYXRhLT5sYXJfZW5hYmxlZDsKQEAgLTExOTIsNiArMTIxMSwxMiBAQAogCQkJICAgSVdMX1VDT0RFX1RMVl9DQVBBX01VTFRJX1FVRVVFX1JYX1NVUFBPUlQpOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgaXdsX212bV9oYXNfbmV3X3R4X2FwaShzdHJ1Y3QgaXdsX212bSAqbXZtKQoreworCS8qIFRPRE8gLSByZXBsYWNlIHdpdGggVExWIG9uY2UgZGVmaW5lZCAqLworCXJldHVybiBtdm0tPnRyYW5zLT5jZmctPnVzZV90Zmg7Cit9CisKIHN0YXRpYyBpbmxpbmUgYm9vbCBpd2xfbXZtX2lzX3R0X2luX2Z3KHN0cnVjdCBpd2xfbXZtICptdm0pCiB7CiAjaWZkZWYgQ09ORklHX1RIRVJNQUwKQEAgLTEyNDMsNiArMTI2OCw3IEBACiB2b2lkIGl3bF9tdm1fZHVtcF9uaWNfZXJyb3JfbG9nKHN0cnVjdCBpd2xfbXZtICptdm0pOwogdTggZmlyc3RfYW50ZW5uYSh1OCBtYXNrKTsKIHU4IGl3bF9tdm1fbmV4dF9hbnRlbm5hKHN0cnVjdCBpd2xfbXZtICptdm0sIHU4IHZhbGlkLCB1OCBsYXN0X2lkeCk7Cit2b2lkIGl3bF9tdm1fZ2V0X3N5bmNfdGltZShzdHJ1Y3QgaXdsX212bSAqbXZtLCB1MzIgKmdwMiwgdTY0ICpib290dGltZSk7CiAKIC8qIFR4IC8gSG9zdCBDb21tYW5kcyAqLwogaW50IF9fbXVzdF9jaGVjayBpd2xfbXZtX3NlbmRfY21kKHN0cnVjdCBpd2xfbXZtICptdm0sCkBAIC0xMjc5LDggKzEzMDUsNiBAQAogCiAJdHhfY21kLT5zZWNfY3RsID0gVFhfQ01EX1NFQ19DQ007CiAJbWVtY3B5KHR4X2NtZC0+a2V5LCBrZXljb25mLT5rZXksIGtleWNvbmYtPmtleWxlbik7Ci0JaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkKLQkJdHhfY21kLT50eF9mbGFncyB8PSBjcHVfdG9fbGUzMihUWF9DTURfRkxHX0NDTVBfQUdHKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGl3bF9tdm1fd2FpdF9mb3JfYXN5bmNfaGFuZGxlcnMoc3RydWN0IGl3bF9tdm0gKm12bSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL252bS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vbnZtLmMKaW5kZXggN2E2ODZmNi4uZWFkZTA5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vbnZtLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vbnZtLmMKQEAgLTY2LDcgKzY2LDYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgotI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlICJpd2wtdHJhbnMuaCIKICNpbmNsdWRlICJpd2wtY3NyLmgiCiAjaW5jbHVkZSAibXZtLmgiCkBAIC03NTEsOTYgKzc1MCw2IEBACiAJcmV0dXJuIHJlc3BfY3A7CiB9CiAKLSNpZmRlZiBDT05GSUdfQUNQSQotI2RlZmluZSBXUkRfTUVUSE9ECQkiV1JERCIKLSNkZWZpbmUgV1JERF9XSUZJCQkoMHgwNykKLSNkZWZpbmUgV1JERF9XSUdJRwkJKDB4MTApCi0KLXN0YXRpYyB1MzIgaXdsX212bV93cmRkX2dldF9tY2Moc3RydWN0IGl3bF9tdm0gKm12bSwgdW5pb24gYWNwaV9vYmplY3QgKndyZGQpCi17Ci0JdW5pb24gYWNwaV9vYmplY3QgKm1jY19wa2csICpkb21haW5fdHlwZSwgKm1jY192YWx1ZTsKLQl1MzIgaTsKLQotCWlmICh3cmRkLT50eXBlICE9IEFDUElfVFlQRV9QQUNLQUdFIHx8Ci0JICAgIHdyZGQtPnBhY2thZ2UuY291bnQgPCAyIHx8Ci0JICAgIHdyZGQtPnBhY2thZ2UuZWxlbWVudHNbMF0udHlwZSAhPSBBQ1BJX1RZUEVfSU5URUdFUiB8fAotCSAgICB3cmRkLT5wYWNrYWdlLmVsZW1lbnRzWzBdLmludGVnZXIudmFsdWUgIT0gMCkgewotCQlJV0xfREVCVUdfTEFSKG12bSwgIlVuc3VwcG9ydGVkIHdyZGQgc3RydWN0dXJlXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JZm9yIChpID0gMSA7IGkgPCB3cmRkLT5wYWNrYWdlLmNvdW50IDsgKytpKSB7Ci0JCW1jY19wa2cgPSAmd3JkZC0+cGFja2FnZS5lbGVtZW50c1tpXTsKLQotCQlpZiAobWNjX3BrZy0+dHlwZSAhPSBBQ1BJX1RZUEVfUEFDS0FHRSB8fAotCQkgICAgbWNjX3BrZy0+cGFja2FnZS5jb3VudCA8IDIgfHwKLQkJICAgIG1jY19wa2ctPnBhY2thZ2UuZWxlbWVudHNbMF0udHlwZSAhPSBBQ1BJX1RZUEVfSU5URUdFUiB8fAotCQkgICAgbWNjX3BrZy0+cGFja2FnZS5lbGVtZW50c1sxXS50eXBlICE9IEFDUElfVFlQRV9JTlRFR0VSKSB7Ci0JCQltY2NfcGtnID0gTlVMTDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJZG9tYWluX3R5cGUgPSAmbWNjX3BrZy0+cGFja2FnZS5lbGVtZW50c1swXTsKLQkJaWYgKGRvbWFpbl90eXBlLT5pbnRlZ2VyLnZhbHVlID09IFdSRERfV0lGSSkKLQkJCWJyZWFrOwotCi0JCW1jY19wa2cgPSBOVUxMOwotCX0KLQotCWlmIChtY2NfcGtnKSB7Ci0JCW1jY192YWx1ZSA9ICZtY2NfcGtnLT5wYWNrYWdlLmVsZW1lbnRzWzFdOwotCQlyZXR1cm4gbWNjX3ZhbHVlLT5pbnRlZ2VyLnZhbHVlOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGl3bF9tdm1fZ2V0X2Jpb3NfbWNjKHN0cnVjdCBpd2xfbXZtICptdm0sIGNoYXIgKm1jYykKLXsKLQlhY3BpX2hhbmRsZSByb290X2hhbmRsZTsKLQlhY3BpX2hhbmRsZSBoYW5kbGU7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIHdyZGQgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1MzIgbWNjX3ZhbDsKLQotCXJvb3RfaGFuZGxlID0gQUNQSV9IQU5ETEUobXZtLT5kZXYpOwotCWlmICghcm9vdF9oYW5kbGUpIHsKLQkJSVdMX0RFQlVHX0xBUihtdm0sCi0JCQkgICAgICAiQ291bGQgbm90IHJldHJpZXZlIHJvb3QgcG9ydCBBQ1BJIGhhbmRsZVxuIik7Ci0JCXJldHVybiAtRU5PRU5UOwotCX0KLQotCS8qIEdldCB0aGUgbWV0aG9kJ3MgaGFuZGxlICovCi0Jc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKHJvb3RfaGFuZGxlLCAoYWNwaV9zdHJpbmcpV1JEX01FVEhPRCwgJmhhbmRsZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUlXTF9ERUJVR19MQVIobXZtLCAiV1JEIG1ldGhvZCBub3QgZm91bmRcbiIpOwotCQlyZXR1cm4gLUVOT0VOVDsKLQl9Ci0KLQkvKiBDYWxsIFdSREQgd2l0aCBubyBhcmd1bWVudHMgKi8KLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsIE5VTEwsIE5VTEwsICZ3cmRkKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJSVdMX0RFQlVHX0xBUihtdm0sICJXUkRDIGludm9jYXRpb24gZmFpbGVkICgweCV4KVxuIiwgc3RhdHVzKTsKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQotCi0JbWNjX3ZhbCA9IGl3bF9tdm1fd3JkZF9nZXRfbWNjKG12bSwgd3JkZC5wb2ludGVyKTsKLQlrZnJlZSh3cmRkLnBvaW50ZXIpOwotCWlmICghbWNjX3ZhbCkKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0KLQltY2NbMF0gPSAobWNjX3ZhbCA+PiA4KSAmIDB4ZmY7Ci0JbWNjWzFdID0gbWNjX3ZhbCAmIDB4ZmY7Ci0JbWNjWzJdID0gJ1wwJzsKLQlyZXR1cm4gMDsKLX0KLSNlbHNlIC8qIENPTkZJR19BQ1BJICovCi1zdGF0aWMgaW50IGl3bF9tdm1fZ2V0X2Jpb3NfbWNjKHN0cnVjdCBpd2xfbXZtICptdm0sIGNoYXIgKm1jYykKLXsKLQlyZXR1cm4gLUVOT0VOVDsKLX0KLSNlbmRpZgotCiBpbnQgaXdsX212bV9pbml0X21jYyhzdHJ1Y3QgaXdsX212bSAqbXZtKQogewogCWJvb2wgdGx2X2xhcjsKQEAgLTg4NCw3ICs3OTMsNyBAQAogCQlyZXR1cm4gLUVJTzsKIAogCWlmIChpd2xfbXZtX2lzX3dpZmlfbWNjX3N1cHBvcnRlZChtdm0pICYmCi0JICAgICFpd2xfbXZtX2dldF9iaW9zX21jYyhtdm0sIG1jYykpIHsKKwkgICAgIWl3bF9nZXRfYmlvc19tY2MobXZtLT5kZXYsIG1jYykpIHsKIAkJa2ZyZWUocmVnZCk7CiAJCXJlZ2QgPSBpd2xfbXZtX2dldF9yZWdkb21haW4obXZtLT5ody0+d2lwaHksIG1jYywKIAkJCQkJICAgICBNQ0NfU09VUkNFX0JJT1MsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vb3BzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9vcHMuYwppbmRleCA1NWQ5MDk2Li4wNWZlNmRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9vcHMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9vcHMuYwpAQCAtMzU5LDYgKzM1OSw3IEBACiAJSENNRF9OQU1FKEJUX0NPRVhfQ0kpLAogCUhDTURfTkFNRShQSFlfQ09ORklHVVJBVElPTl9DTUQpLAogCUhDTURfTkFNRShDQUxJQl9SRVNfTk9USUZfUEhZX0RCKSwKKwlIQ01EX05BTUUoUEhZX0RCX0NNRCksCiAJSENNRF9OQU1FKFNDQU5fT0ZGTE9BRF9DT01QTEVURSksCiAJSENNRF9OQU1FKFNDQU5fT0ZGTE9BRF9VUERBVEVfUFJPRklMRVNfQ01EKSwKIAlIQ01EX05BTUUoU0NBTl9PRkZMT0FEX0NPTkZJR19DTUQpLApAQCAtNjUyLDExICs2NTMsOSBAQAogCS8qIHRoZSBoYXJkd2FyZSBzcGxpdHMgdGhlIEEtTVNEVSAqLwogCWlmIChtdm0tPmNmZy0+bXFfcnhfc3VwcG9ydGVkKQogCQl0cmFuc19jZmcucnhfYnVmX3NpemUgPSBJV0xfQU1TRFVfNEs7Ci0JdHJhbnNfY2ZnLndpZGVfY21kX2hlYWRlciA9IGZ3X2hhc19hcGkoJm12bS0+ZnctPnVjb2RlX2NhcGEsCi0JCQkJCSAgICAgICBJV0xfVUNPREVfVExWX0FQSV9XSURFX0NNRF9IRFIpOwogCi0JaWYgKG12bS0+ZnctPnVjb2RlX2NhcGEuZmxhZ3MgJiBJV0xfVUNPREVfVExWX0ZMQUdTX0RXX0JDX1RBQkxFKQotCQl0cmFuc19jZmcuYmNfdGFibGVfZHdvcmQgPSB0cnVlOworCXRyYW5zLT53aWRlX2NtZF9oZWFkZXIgPSB0cnVlOworCXRyYW5zX2NmZy5iY190YWJsZV9kd29yZCA9IHRydWU7CiAKIAl0cmFuc19jZmcuY29tbWFuZF9ncm91cHMgPSBpd2xfbXZtX2dyb3VwczsKIAl0cmFuc19jZmcuY29tbWFuZF9ncm91cHNfc2l6ZSA9IEFSUkFZX1NJWkUoaXdsX212bV9ncm91cHMpOwpAQCAtNzExLDM3ICs3MTAsMjEgQEAKIAkJSVdMX0RFQlVHX0VFUFJPTShtdm0tPnRyYW5zLT5kZXYsCiAJCQkJICJ3b3JraW5nIHdpdGhvdXQgZXh0ZXJuYWwgbnZtIGZpbGVcbiIpOwogCi0JaWYgKFdBUk4oY2ZnLT5ub19wb3dlcl91cF9uaWNfaW5faW5pdCAmJiAhbXZtLT5udm1fZmlsZV9uYW1lLAotCQkgIm5vdCBhbGxvd2luZyBwb3dlci11cCBhbmQgbm90IGhhdmluZyBudm1fZmlsZVxuIikpCisJZXJyID0gaXdsX3RyYW5zX3N0YXJ0X2h3KG12bS0+dHJhbnMpOworCWlmIChlcnIpCiAJCWdvdG8gb3V0X2ZyZWU7CiAKLQkvKgotCSAqIEV2ZW4gaWYgbnZtIGV4aXN0cyBpbiB0aGUgbnZtX2ZpbGUgZHJpdmVyIHNob3VsZCByZWFkIGFnYWluIHRoZSBudm0KLQkgKiBmcm9tIHRoZSBuaWMgYmVjYXVzZSB0aGVyZSBtaWdodCBiZSBlbnRyaWVzIHRoYXQgZXhpc3QgaW4gdGhlIE9UUAotCSAqIGFuZCBub3QgaW4gdGhlIGZpbGUuCi0JICogZm9yIG5pY3Mgd2l0aCBub19wb3dlcl91cF9uaWNfaW5faW5pdDogcmVseSBjb21wbGV0bGV5IG9uIG52bV9maWxlCi0JICovCi0JaWYgKGNmZy0+bm9fcG93ZXJfdXBfbmljX2luX2luaXQgJiYgbXZtLT5udm1fZmlsZV9uYW1lKSB7Ci0JCWVyciA9IGl3bF9udm1faW5pdChtdm0sIGZhbHNlKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gb3V0X2ZyZWU7Ci0JfSBlbHNlIHsKLQkJZXJyID0gaXdsX3RyYW5zX3N0YXJ0X2h3KG12bS0+dHJhbnMpOwotCQlpZiAoZXJyKQotCQkJZ290byBvdXRfZnJlZTsKLQotCQltdXRleF9sb2NrKCZtdm0tPm11dGV4KTsKLQkJaXdsX212bV9yZWYobXZtLCBJV0xfTVZNX1JFRl9JTklUX1VDT0RFKTsKLQkJZXJyID0gaXdsX3J1bl9pbml0X212bV91Y29kZShtdm0sIHRydWUpOwotCQlpZiAoIWVyciB8fCAhaXdsbXZtX21vZF9wYXJhbXMuaW5pdF9kYmcpCi0JCQlpd2xfbXZtX3N0b3BfZGV2aWNlKG12bSk7Ci0JCWl3bF9tdm1fdW5yZWYobXZtLCBJV0xfTVZNX1JFRl9JTklUX1VDT0RFKTsKLQkJbXV0ZXhfdW5sb2NrKCZtdm0tPm11dGV4KTsKLQkJLyogcmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIDEgaWYgc3VjY2VzcyBidXQgaW4gcmZraWxsICovCi0JCWlmIChlcnIgPCAwICYmICFpd2xtdm1fbW9kX3BhcmFtcy5pbml0X2RiZykgewotCQkJSVdMX0VSUihtdm0sICJGYWlsZWQgdG8gcnVuIElOSVQgdWNvZGU6ICVkXG4iLCBlcnIpOwotCQkJZ290byBvdXRfZnJlZTsKLQkJfQorCW11dGV4X2xvY2soJm12bS0+bXV0ZXgpOworCWl3bF9tdm1fcmVmKG12bSwgSVdMX01WTV9SRUZfSU5JVF9VQ09ERSk7CisJZXJyID0gaXdsX3J1bl9pbml0X212bV91Y29kZShtdm0sIHRydWUpOworCWlmICghZXJyIHx8ICFpd2xtdm1fbW9kX3BhcmFtcy5pbml0X2RiZykKKwkJaXdsX212bV9zdG9wX2RldmljZShtdm0pOworCWl3bF9tdm1fdW5yZWYobXZtLCBJV0xfTVZNX1JFRl9JTklUX1VDT0RFKTsKKwltdXRleF91bmxvY2soJm12bS0+bXV0ZXgpOworCS8qIHJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCAxIGlmIHN1Y2Nlc3MgYnV0IGluIHJma2lsbCAqLworCWlmIChlcnIgPCAwICYmICFpd2xtdm1fbW9kX3BhcmFtcy5pbml0X2RiZykgeworCQlJV0xfRVJSKG12bSwgIkZhaWxlZCB0byBydW4gSU5JVCB1Y29kZTogJWRcbiIsIGVycik7CisJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCiAJc2Nhbl9zaXplID0gaXdsX212bV9zY2FuX3NpemUobXZtKTsKQEAgLTc4Myw4ICs3NjYsOCBAQAogCWZsdXNoX2RlbGF5ZWRfd29yaygmbXZtLT5md19kdW1wX3drKTsKIAlpd2xfcGh5X2RiX2ZyZWUobXZtLT5waHlfZGIpOwogCWtmcmVlKG12bS0+c2Nhbl9jbWQpOwotCWlmICghY2ZnLT5ub19wb3dlcl91cF9uaWNfaW5faW5pdCB8fCAhbXZtLT5udm1fZmlsZV9uYW1lKQotCQlpd2xfdHJhbnNfb3BfbW9kZV9sZWF2ZSh0cmFucyk7CisJaXdsX3RyYW5zX29wX21vZGVfbGVhdmUodHJhbnMpOworCiAJaWVlZTgwMjExX2ZyZWVfaHcobXZtLT5odyk7CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC04NTcsOSArODQwLDcgQEAKIAlzdHJ1Y3QgaXdsX212bSAqbXZtID0KIAkJY29udGFpbmVyX29mKHdrLCBzdHJ1Y3QgaXdsX212bSwgYXN5bmNfaGFuZGxlcnNfd2spOwogCXN0cnVjdCBpd2xfYXN5bmNfaGFuZGxlcl9lbnRyeSAqZW50cnksICp0bXA7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsb2NhbF9saXN0OwotCi0JSU5JVF9MSVNUX0hFQUQoJmxvY2FsX2xpc3QpOworCUxJU1RfSEVBRChsb2NhbF9saXN0KTsKIAogCS8qIEVuc3VyZSB0aGF0IHdlIGFyZSBub3QgaW4gc3RvcCBmbG93IChjaGVjayBpd2xfbXZtX21hY19zdG9wKSAqLwogCkBAIC05NjYsMTAgKzk0NywxMSBAQAogewogCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwogCXN0cnVjdCBpd2xfbXZtICptdm0gPSBJV0xfT1BfTU9ERV9HRVRfTVZNKG9wX21vZGUpOworCXUxNiBjbWQgPSBXSURFX0lEKHBrdC0+aGRyLmdyb3VwX2lkLCBwa3QtPmhkci5jbWQpOwogCi0JaWYgKGxpa2VseShwa3QtPmhkci5jbWQgPT0gUkVQTFlfUlhfTVBEVV9DTUQpKQorCWlmIChsaWtlbHkoY21kID09IFdJREVfSUQoTEVHQUNZX0dST1VQLCBSRVBMWV9SWF9NUERVX0NNRCkpKQogCQlpd2xfbXZtX3J4X3J4X21wZHUobXZtLCBuYXBpLCByeGIpOwotCWVsc2UgaWYgKHBrdC0+aGRyLmNtZCA9PSBSRVBMWV9SWF9QSFlfQ01EKQorCWVsc2UgaWYgKGNtZCA9PSBXSURFX0lEKExFR0FDWV9HUk9VUCwgUkVQTFlfUlhfUEhZX0NNRCkpCiAJCWl3bF9tdm1fcnhfcnhfcGh5X2NtZChtdm0sIHJ4Yik7CiAJZWxzZQogCQlpd2xfbXZtX3J4X2NvbW1vbihtdm0sIHJ4YiwgcGt0KTsKQEAgLTk4MSwxMyArOTYzLDE0IEBACiB7CiAJc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CiAJc3RydWN0IGl3bF9tdm0gKm12bSA9IElXTF9PUF9NT0RFX0dFVF9NVk0ob3BfbW9kZSk7CisJdTE2IGNtZCA9IFdJREVfSUQocGt0LT5oZHIuZ3JvdXBfaWQsIHBrdC0+aGRyLmNtZCk7CiAKLQlpZiAobGlrZWx5KHBrdC0+aGRyLmNtZCA9PSBSRVBMWV9SWF9NUERVX0NNRCkpCisJaWYgKGxpa2VseShjbWQgPT0gV0lERV9JRChMRUdBQ1lfR1JPVVAsIFJFUExZX1JYX01QRFVfQ01EKSkpCiAJCWl3bF9tdm1fcnhfbXBkdV9tcShtdm0sIG5hcGksIHJ4YiwgMCk7Ci0JZWxzZSBpZiAodW5saWtlbHkocGt0LT5oZHIuZ3JvdXBfaWQgPT0gREFUQV9QQVRIX0dST1VQICYmCi0JCQkgIHBrdC0+aGRyLmNtZCA9PSBSWF9RVUVVRVNfTk9USUZJQ0FUSU9OKSkKKwllbHNlIGlmICh1bmxpa2VseShjbWQgPT0gV0lERV9JRChEQVRBX1BBVEhfR1JPVVAsCisJCQkJCSBSWF9RVUVVRVNfTk9USUZJQ0FUSU9OKSkpCiAJCWl3bF9tdm1fcnhfcXVldWVfbm90aWYobXZtLCByeGIsIDApOwotCWVsc2UgaWYgKHBrdC0+aGRyLmNtZCA9PSBGUkFNRV9SRUxFQVNFKQorCWVsc2UgaWYgKGNtZCA9PSBXSURFX0lEKExFR0FDWV9HUk9VUCwgRlJBTUVfUkVMRUFTRSkpCiAJCWl3bF9tdm1fcnhfZnJhbWVfcmVsZWFzZShtdm0sIG5hcGksIHJ4YiwgMCk7CiAJZWxzZQogCQlpd2xfbXZtX3J4X2NvbW1vbihtdm0sIHJ4YiwgcGt0KTsKQEAgLTE2NjYsMTMgKzE2NDksMTQgQEAKIHsKIAlzdHJ1Y3QgaXdsX212bSAqbXZtID0gSVdMX09QX01PREVfR0VUX01WTShvcF9tb2RlKTsKIAlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwl1MTYgY21kID0gV0lERV9JRChwa3QtPmhkci5ncm91cF9pZCwgcGt0LT5oZHIuY21kKTsKIAotCWlmICh1bmxpa2VseShwa3QtPmhkci5jbWQgPT0gRlJBTUVfUkVMRUFTRSkpCisJaWYgKHVubGlrZWx5KGNtZCA9PSBXSURFX0lEKExFR0FDWV9HUk9VUCwgRlJBTUVfUkVMRUFTRSkpKQogCQlpd2xfbXZtX3J4X2ZyYW1lX3JlbGVhc2UobXZtLCBuYXBpLCByeGIsIHF1ZXVlKTsKLQllbHNlIGlmICh1bmxpa2VseShwa3QtPmhkci5jbWQgPT0gUlhfUVVFVUVTX05PVElGSUNBVElPTiAmJgotCQkJICBwa3QtPmhkci5ncm91cF9pZCA9PSBEQVRBX1BBVEhfR1JPVVApKQorCWVsc2UgaWYgKHVubGlrZWx5KGNtZCA9PSBXSURFX0lEKERBVEFfUEFUSF9HUk9VUCwKKwkJCQkJIFJYX1FVRVVFU19OT1RJRklDQVRJT04pKSkKIAkJaXdsX212bV9yeF9xdWV1ZV9ub3RpZihtdm0sIHJ4YiwgcXVldWUpOwotCWVsc2UKKwllbHNlIGlmIChsaWtlbHkoY21kID09IFdJREVfSUQoTEVHQUNZX0dST1VQLCBSRVBMWV9SWF9NUERVX0NNRCkpKQogCQlpd2xfbXZtX3J4X21wZHVfbXEobXZtLCBuYXBpLCByeGIsIHF1ZXVlKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vcG93ZXIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL3Bvd2VyLmMKaW5kZXggZmY4NTg2NS4uYWY2ZDEwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vcG93ZXIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9wb3dlci5jCkBAIC02OTQsOCArNjk0LDcgQEAKIAogCS8qIGVuYWJsZSBQTSBvbiBwMnAgaWYgcDJwIHN0YW5kIGFsb25lICovCiAJaWYgKHZpZnMtPnAycF9hY3RpdmUgJiYgIXZpZnMtPmJzc19hY3RpdmUgJiYgIXZpZnMtPmFwX2FjdGl2ZSkgewotCQlpZiAobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfUDJQX1BNKQotCQkJcDJwX212bXZpZi0+cG1fZW5hYmxlZCA9IHRydWU7CisJCXAycF9tdm12aWYtPnBtX2VuYWJsZWQgPSB0cnVlOwogCQlyZXR1cm47CiAJfQogCkBAIC03MDcsMTIgKzcwNiwxMCBAQAogCQkJCSAgIGFwX212bXZpZi0+cGh5X2N0eHQtPmlkKTsKIAogCS8qIGNsaWVudHMgYXJlIG5vdCBzdGFuZCBhbG9uZTogZW5hYmxlIFBNIGlmIERDTSAqLwotCWlmICghKGNsaWVudF9zYW1lX2NoYW5uZWwgfHwgYXBfc2FtZV9jaGFubmVsKSAmJgotCSAgICAobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfQlNTX1AyUF9QU19EQ00pKSB7CisJaWYgKCEoY2xpZW50X3NhbWVfY2hhbm5lbCB8fCBhcF9zYW1lX2NoYW5uZWwpKSB7CiAJCWlmICh2aWZzLT5ic3NfYWN0aXZlKQogCQkJYnNzX212bXZpZi0+cG1fZW5hYmxlZCA9IHRydWU7Ci0JCWlmICh2aWZzLT5wMnBfYWN0aXZlICYmCi0JCSAgICAobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfUDJQX1BNKSkKKwkJaWYgKHZpZnMtPnAycF9hY3RpdmUpCiAJCQlwMnBfbXZtdmlmLT5wbV9lbmFibGVkID0gdHJ1ZTsKIAkJcmV0dXJuOwogCX0KQEAgLTcyMSwxMiArNzE4LDEwIEBACiAJICogVGhlcmUgaXMgb25seSBvbmUgY2hhbm5lbCBpbiB0aGUgc3lzdGVtIGFuZCB0aGVyZSBhcmUgb25seQogCSAqIGJzcyBhbmQgcDJwIGNsaWVudHMgdGhhdCBzaGFyZSBpdAogCSAqLwotCWlmIChjbGllbnRfc2FtZV9jaGFubmVsICYmICF2aWZzLT5hcF9hY3RpdmUgJiYKLQkgICAgKG12bS0+ZnctPnVjb2RlX2NhcGEuZmxhZ3MgJiBJV0xfVUNPREVfVExWX0ZMQUdTX0JTU19QMlBfUFNfU0NNKSkgeworCWlmIChjbGllbnRfc2FtZV9jaGFubmVsICYmICF2aWZzLT5hcF9hY3RpdmUpIHsKIAkJLyogc2hhcmUgc2FtZSBjaGFubmVsKi8KIAkJYnNzX212bXZpZi0+cG1fZW5hYmxlZCA9IHRydWU7Ci0JCWlmIChtdm0tPmZ3LT51Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19QMlBfUE0pCi0JCQlwMnBfbXZtdmlmLT5wbV9lbmFibGVkID0gdHJ1ZTsKKwkJcDJwX212bXZpZi0+cG1fZW5hYmxlZCA9IHRydWU7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9yeG1xLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9yeG1xLmMKaW5kZXggZGY2YzMyYy4uYTU3YzZlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vcnhtcS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL3J4bXEuYwpAQCAtMTMyLDcgKzEzMiw4IEBACiAJCSAgIElFRUU4MDIxMV9DQ01QX1BOX0xFTikgPD0gMCkKIAkJcmV0dXJuIC0xOwogCi0JbWVtY3B5KHB0a19wbi0+cVtxdWV1ZV0ucG5bdGlkXSwgcG4sIElFRUU4MDIxMV9DQ01QX1BOX0xFTik7CisJaWYgKCEoc3RhdHMtPmZsYWcgJiBSWF9GTEFHX0FNU0RVX01PUkUpKQorCQltZW1jcHkocHRrX3BuLT5xW3F1ZXVlXS5wblt0aWRdLCBwbiwgSUVFRTgwMjExX0NDTVBfUE5fTEVOKTsKIAlzdGF0cy0+ZmxhZyB8PSBSWF9GTEFHX1BOX1ZBTElEQVRFRDsKIAogCXJldHVybiAwOwpAQCAtNDE3LDEwICs0MTgsMTEgQEAKIAogCQlzc24gPSBpZWVlODAyMTFfc25faW5jKHNzbik7CiAKLQkJLyogaG9sZXMgYXJlIHZhbGlkIHNpbmNlIG5zc24gaW5kaWNhdGVzIGZyYW1lcyB3ZXJlIHJlY2VpdmVkLiAqLwotCQlpZiAoc2tiX3F1ZXVlX2VtcHR5KHNrYl9saXN0KSB8fCAhc2tiX3BlZWtfdGFpbChza2JfbGlzdCkpCi0JCQljb250aW51ZTsKLQkJLyogRW1wdHkgdGhlIGxpc3QuIFdpbGwgaGF2ZSBtb3JlIHRoYW4gb25lIGZyYW1lIGZvciBBLU1TRFUgKi8KKwkJLyoKKwkJICogRW1wdHkgdGhlIGxpc3QuIFdpbGwgaGF2ZSBtb3JlIHRoYW4gb25lIGZyYW1lIGZvciBBLU1TRFUuCisJCSAqIEVtcHR5IGxpc3QgaXMgdmFsaWQgYXMgd2VsbCBzaW5jZSBuc3NuIGluZGljYXRlcyBmcmFtZXMgd2VyZQorCQkgKiByZWNlaXZlZC4KKwkJICovCiAJCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZShza2JfbGlzdCkpKSB7CiAJCQlpd2xfbXZtX3Bhc3NfcGFja2V0X3RvX21hYzgwMjExKG12bSwgbmFwaSwgc2tiLAogCQkJCQkJCXJlb3JkZXJfYnVmLT5xdWV1ZSwKQEAgLTQzMyw3ICs0MzUsNyBAQAogCWlmIChyZW9yZGVyX2J1Zi0+bnVtX3N0b3JlZCAmJiAhcmVvcmRlcl9idWYtPnJlbW92ZWQpIHsKIAkJdTE2IGluZGV4ID0gcmVvcmRlcl9idWYtPmhlYWRfc24gJSByZW9yZGVyX2J1Zi0+YnVmX3NpemU7CiAKLQkJd2hpbGUgKCFza2JfcGVla190YWlsKCZyZW9yZGVyX2J1Zi0+ZW50cmllc1tpbmRleF0pKQorCQl3aGlsZSAoc2tiX3F1ZXVlX2VtcHR5KCZyZW9yZGVyX2J1Zi0+ZW50cmllc1tpbmRleF0pKQogCQkJaW5kZXggPSAoaW5kZXggKyAxKSAlIHJlb3JkZXJfYnVmLT5idWZfc2l6ZTsKIAkJLyogbW9kaWZ5IHRpbWVyIHRvIG1hdGNoIG5leHQgZnJhbWUncyBleHBpcmF0aW9uIHRpbWUgKi8KIAkJbW9kX3RpbWVyKCZyZW9yZGVyX2J1Zi0+cmVvcmRlcl90aW1lciwKQEAgLTQ1MSwxNyArNDUzLDE3IEBACiAJdTE2IHNuID0gMCwgaW5kZXggPSAwOwogCWJvb2wgZXhwaXJlZCA9IGZhbHNlOwogCi0Jc3Bpbl9sb2NrX2JoKCZidWYtPmxvY2spOworCXNwaW5fbG9jaygmYnVmLT5sb2NrKTsKIAogCWlmICghYnVmLT5udW1fc3RvcmVkIHx8IGJ1Zi0+cmVtb3ZlZCkgewotCQlzcGluX3VubG9ja19iaCgmYnVmLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmJ1Zi0+bG9jayk7CiAJCXJldHVybjsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgYnVmLT5idWZfc2l6ZSA7IGkrKykgewogCQlpbmRleCA9IChidWYtPmhlYWRfc24gKyBpKSAlIGJ1Zi0+YnVmX3NpemU7CiAKLQkJaWYgKCFza2JfcGVla190YWlsKCZidWYtPmVudHJpZXNbaW5kZXhdKSkKKwkJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmYnVmLT5lbnRyaWVzW2luZGV4XSkpCiAJCQljb250aW51ZTsKIAkJaWYgKCF0aW1lX2FmdGVyKGppZmZpZXMsIGJ1Zi0+cmVvcmRlcl90aW1lW2luZGV4XSArCiAJCQkJUlhfUkVPUkRFUl9CVUZfVElNRU9VVF9NUSkpCkBAIC00OTEsNyArNDkzLDcgQEAKIAkJCSAgYnVmLT5yZW9yZGVyX3RpbWVbaW5kZXhdICsKIAkJCSAgMSArIFJYX1JFT1JERVJfQlVGX1RJTUVPVVRfTVEpOwogCX0KLQlzcGluX3VubG9ja19iaCgmYnVmLT5sb2NrKTsKKwlzcGluX3VubG9jaygmYnVmLT5sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQgaXdsX212bV9kZWxfYmEoc3RydWN0IGl3bF9tdm0gKm12bSwgaW50IHF1ZXVlLApAQCAtNTAyLDcgKzUwNCw3IEBACiAJc3RydWN0IGl3bF9tdm1fcmVvcmRlcl9idWZmZXIgKnJlb3JkZXJfYnVmOwogCXU4IGJhaWQgPSBkYXRhLT5iYWlkOwogCi0JaWYgKFdBUk5fT05fT05DRShiYWlkID49IElXTF9SWF9SRU9SREVSX0RBVEFfSU5WQUxJRF9CQUlEKSkKKwlpZiAoV0FSTl9PTkNFKGJhaWQgPj0gSVdMX01BWF9CQUlELCAiaW52YWxpZCBCQUlEOiAleFxuIiwgYmFpZCkpCiAJCXJldHVybjsKIAogCXJjdV9yZWFkX2xvY2soKTsKQEAgLTU4OSw2ICs1OTEsMTEgQEAKIAliYWlkID0gKHJlb3JkZXIgJiBJV0xfUlhfTVBEVV9SRU9SREVSX0JBSURfTUFTSykgPj4KIAkJSVdMX1JYX01QRFVfUkVPUkRFUl9CQUlEX1NISUZUOwogCisJLyoKKwkgKiBUaGlzIGFsc28gY292ZXJzIHRoZSBjYXNlIG9mIHJlY2VpdmluZyBhIEJsb2NrIEFjayBSZXF1ZXN0CisJICogb3V0c2lkZSBhIEJBIHNlc3Npb247IHdlJ2xsIHBhc3MgaXQgdG8gbWFjODAyMTEgYW5kIHRoYXQKKwkgKiB0aGVuIHNlbmRzIGEgZGVsQkEgYWN0aW9uIGZyYW1lLgorCSAqLwogCWlmIChiYWlkID09IElXTF9SWF9SRU9SREVSX0RBVEFfSU5WQUxJRF9CQUlEKQogCQlyZXR1cm4gZmFsc2U7CiAKQEAgLTU5OCw5ICs2MDUsMTAgQEAKIAogCW12bV9zdGEgPSBpd2xfbXZtX3N0YV9mcm9tX21hYzgwMjExKHN0YSk7CiAKLQkvKiBub3QgYSBkYXRhIHBhY2tldCAqLwotCWlmICghaWVlZTgwMjExX2lzX2RhdGFfcW9zKGhkci0+ZnJhbWVfY29udHJvbCkgfHwKLQkgICAgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkpCisJLyogbm90IGEgZGF0YSBwYWNrZXQgb3IgYSBiYXIgKi8KKwlpZiAoIWllZWU4MDIxMV9pc19iYWNrX3JlcShoZHItPmZyYW1lX2NvbnRyb2wpICYmCisJICAgICghaWVlZTgwMjExX2lzX2RhdGFfcW9zKGhkci0+ZnJhbWVfY29udHJvbCkgfHwKKwkgICAgIGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpKSkKIAkJcmV0dXJuIGZhbHNlOwogCiAJaWYgKHVubGlrZWx5KCFpZWVlODAyMTFfaXNfZGF0YV9wcmVzZW50KGhkci0+ZnJhbWVfY29udHJvbCkpKQpAQCAtNjI0LDYgKzYzMiwxMSBAQAogCiAJc3Bpbl9sb2NrX2JoKCZidWZmZXItPmxvY2spOwogCisJaWYgKGllZWU4MDIxMV9pc19iYWNrX3JlcShoZHItPmZyYW1lX2NvbnRyb2wpKSB7CisJCWl3bF9tdm1fcmVsZWFzZV9mcmFtZXMobXZtLCBzdGEsIG5hcGksIGJ1ZmZlciwgbnNzbik7CisJCWdvdG8gZHJvcDsKKwl9CisKIAkvKgogCSAqIElmIHRoZXJlIHdhcyBhIHNpZ25pZmljYW50IGp1bXAgaW4gdGhlIG5zc24gLSBhZGp1c3QuCiAJICogSWYgdGhlIFNOIGlzIHNtYWxsZXIgdGhhbiB0aGUgTlNTTiBpdCBtaWdodCBuZWVkIHRvIGZpcnN0IGdvIGludG8KQEAgLTg4Myw2ICs4OTYsOSBAQAogCQkJdTggKnFjID0gaWVlZTgwMjExX2dldF9xb3NfY3RsKGhkcik7CiAKIAkJCSpxYyAmPSB+SUVFRTgwMjExX1FPU19DVExfQV9NU0RVX1BSRVNFTlQ7CisJCQlpZiAoIShkZXNjLT5hbXNkdV9pbmZvICYKKwkJCSAgICAgIElXTF9SWF9NUERVX0FNU0RVX0xBU1RfU1VCRlJBTUUpKQorCQkJCXJ4X3N0YXR1cy0+ZmxhZyB8PSBSWF9GTEFHX0FNU0RVX01PUkU7CiAJCX0KIAkJaWYgKGJhaWQgIT0gSVdMX1JYX1JFT1JERVJfREFUQV9JTlZBTElEX0JBSUQpCiAJCQlpd2xfbXZtX2FnZ19yeF9yZWNlaXZlZChtdm0sIGJhaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vc2Nhbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vc2Nhbi5jCmluZGV4IGRhYzEyMGYuLmYyNzlmZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL3NjYW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9zY2FuLmMKQEAgLTE0MSw2ICsxNDEsNyBAQAogCXN0cnVjdCBjZmc4MDIxMV9tYXRjaF9zZXQgKm1hdGNoX3NldHM7CiAJaW50IG5fc2Nhbl9wbGFuczsKIAlzdHJ1Y3QgY2ZnODAyMTFfc2NoZWRfc2Nhbl9wbGFuICpzY2FuX3BsYW5zOworCXUzMiBtZWFzdXJlbWVudF9kd2VsbDsKIH07CiAKIHN0YXRpYyB1OCBpd2xfbXZtX3NjYW5fcnhfYW50KHN0cnVjdCBpd2xfbXZtICptdm0pCkBAIC0yMzIsNiArMjMzLDI3IEBACiAJcmV0dXJuIElXTF9TQ0FOX1RZUEVfV0lMRDsKIH0KIAorc3RhdGljIGludAoraXdsX212bV9nZXRfbWVhc3VyZW1lbnRfZHdlbGwoc3RydWN0IGl3bF9tdm0gKm12bSwKKwkJCSAgICAgIHN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcSwKKwkJCSAgICAgIHN0cnVjdCBpd2xfbXZtX3NjYW5fcGFyYW1zICpwYXJhbXMpCit7CisJaWYgKCFyZXEtPmR1cmF0aW9uKQorCQlyZXR1cm4gMDsKKworCWlmIChyZXEtPmR1cmF0aW9uX21hbmRhdG9yeSAmJgorCSAgICByZXEtPmR1cmF0aW9uID4gc2Nhbl90aW1pbmdbcGFyYW1zLT50eXBlXS5tYXhfb3V0X3RpbWUpIHsKKwkJSVdMX0RFQlVHX1NDQU4obXZtLAorCQkJICAgICAgICJNZWFzdXJlbWVudCBzY2FuIC0gdG9vIGxvbmcgZHdlbGwgJWh1IChtYXggb3V0IHRpbWUgJXUpXG4iLAorCQkJICAgICAgIHJlcS0+ZHVyYXRpb24sCisJCQkgICAgICAgc2Nhbl90aW1pbmdbcGFyYW1zLT50eXBlXS5tYXhfb3V0X3RpbWUpOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJcmV0dXJuIG1pbl90KHUzMiwgKHUzMilyZXEtPmR1cmF0aW9uLAorCQkgICAgIHNjYW5fdGltaW5nW3BhcmFtcy0+dHlwZV0ubWF4X291dF90aW1lKTsKK30KKwogc3RhdGljIGlubGluZSBib29sIGl3bF9tdm1fcnJtX3NjYW5fbmVlZGVkKHN0cnVjdCBpd2xfbXZtICptdm0pCiB7CiAJLyogcmVxdWlyZSBycm0gc2NhbiB3aGVuZXZlciB0aGUgZncgc3VwcG9ydHMgaXQgKi8KQEAgLTcxNywyMiArNzM5LDYgQEAKIAlwYXJhbXMtPnByZXEuY29tbW9uX2RhdGEubGVuID0gY3B1X3RvX2xlMTYoaWVzLT5jb21tb25faWVfbGVuKTsKIH0KIAotc3RhdGljIF9fbGUzMiBpd2xfbXZtX3NjYW5fcHJpb3JpdHkoc3RydWN0IGl3bF9tdm0gKm12bSwKLQkJCQkgICAgZW51bSBpd2xfc2Nhbl9wcmlvcml0eV9leHQgcHJpbykKLXsKLQlpZiAoZndfaGFzX2FwaSgmbXZtLT5mdy0+dWNvZGVfY2FwYSwKLQkJICAgICAgIElXTF9VQ09ERV9UTFZfQVBJX0VYVF9TQ0FOX1BSSU9SSVRZKSkKLQkJcmV0dXJuIGNwdV90b19sZTMyKHByaW8pOwotCi0JaWYgKHByaW8gPD0gSVdMX1NDQU5fUFJJT1JJVFlfRVhUXzIpCi0JCXJldHVybiBjcHVfdG9fbGUzMihJV0xfU0NBTl9QUklPUklUWV9MT1cpOwotCi0JaWYgKHByaW8gPD0gSVdMX1NDQU5fUFJJT1JJVFlfRVhUXzQpCi0JCXJldHVybiBjcHVfdG9fbGUzMihJV0xfU0NBTl9QUklPUklUWV9NRURJVU0pOwotCi0JcmV0dXJuIGNwdV90b19sZTMyKElXTF9TQ0FOX1BSSU9SSVRZX0hJR0gpOwotfQotCiBzdGF0aWMgdm9pZCBpd2xfbXZtX3NjYW5fbG1hY19kd2VsbChzdHJ1Y3QgaXdsX212bSAqbXZtLAogCQkJCSAgICBzdHJ1Y3QgaXdsX3NjYW5fcmVxX2xtYWMgKmNtZCwKIAkJCQkgICAgc3RydWN0IGl3bF9tdm1fc2Nhbl9wYXJhbXMgKnBhcmFtcykKQEAgLTc0Myw3ICs3NDksNyBAQAogCWNtZC0+ZXh0ZW5kZWRfZHdlbGwgPSBzY2FuX3RpbWluZ1twYXJhbXMtPnR5cGVdLmR3ZWxsX2V4dGVuZGVkOwogCWNtZC0+bWF4X291dF90aW1lID0gY3B1X3RvX2xlMzIoc2Nhbl90aW1pbmdbcGFyYW1zLT50eXBlXS5tYXhfb3V0X3RpbWUpOwogCWNtZC0+c3VzcGVuZF90aW1lID0gY3B1X3RvX2xlMzIoc2Nhbl90aW1pbmdbcGFyYW1zLT50eXBlXS5zdXNwZW5kX3RpbWUpOwotCWNtZC0+c2Nhbl9wcmlvID0gaXdsX212bV9zY2FuX3ByaW9yaXR5KG12bSwgSVdMX1NDQU5fUFJJT1JJVFlfRVhUXzYpOworCWNtZC0+c2Nhbl9wcmlvID0gY3B1X3RvX2xlMzIoSVdMX1NDQU5fUFJJT1JJVFlfRVhUXzYpOwogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgaXdsX212bV9zY2FuX2ZpdHMoc3RydWN0IGl3bF9tdm0gKm12bSwgaW50IG5fc3NpZHMsCkBAIC0xMDMzLDIxICsxMDM5LDI0IEBACiAJCQkJICAgIHN0cnVjdCBpd2xfc2Nhbl9yZXFfdW1hYyAqY21kLAogCQkJCSAgICBzdHJ1Y3QgaXdsX212bV9zY2FuX3BhcmFtcyAqcGFyYW1zKQogewotCWNtZC0+ZXh0ZW5kZWRfZHdlbGwgPSBzY2FuX3RpbWluZ1twYXJhbXMtPnR5cGVdLmR3ZWxsX2V4dGVuZGVkOwotCWNtZC0+YWN0aXZlX2R3ZWxsID0gc2Nhbl90aW1pbmdbcGFyYW1zLT50eXBlXS5kd2VsbF9hY3RpdmU7Ci0JY21kLT5wYXNzaXZlX2R3ZWxsID0gc2Nhbl90aW1pbmdbcGFyYW1zLT50eXBlXS5kd2VsbF9wYXNzaXZlOworCWlmIChwYXJhbXMtPm1lYXN1cmVtZW50X2R3ZWxsKSB7CisJCWNtZC0+YWN0aXZlX2R3ZWxsID0gcGFyYW1zLT5tZWFzdXJlbWVudF9kd2VsbDsKKwkJY21kLT5wYXNzaXZlX2R3ZWxsID0gcGFyYW1zLT5tZWFzdXJlbWVudF9kd2VsbDsKKwkJY21kLT5leHRlbmRlZF9kd2VsbCA9IHBhcmFtcy0+bWVhc3VyZW1lbnRfZHdlbGw7CisJfSBlbHNlIHsKKwkJY21kLT5hY3RpdmVfZHdlbGwgPSBzY2FuX3RpbWluZ1twYXJhbXMtPnR5cGVdLmR3ZWxsX2FjdGl2ZTsKKwkJY21kLT5wYXNzaXZlX2R3ZWxsID0gc2Nhbl90aW1pbmdbcGFyYW1zLT50eXBlXS5kd2VsbF9wYXNzaXZlOworCQljbWQtPmV4dGVuZGVkX2R3ZWxsID0gc2Nhbl90aW1pbmdbcGFyYW1zLT50eXBlXS5kd2VsbF9leHRlbmRlZDsKKwl9CiAJY21kLT5mcmFnbWVudGVkX2R3ZWxsID0gc2Nhbl90aW1pbmdbcGFyYW1zLT50eXBlXS5kd2VsbF9mcmFnbWVudGVkOwogCWNtZC0+bWF4X291dF90aW1lID0gY3B1X3RvX2xlMzIoc2Nhbl90aW1pbmdbcGFyYW1zLT50eXBlXS5tYXhfb3V0X3RpbWUpOwogCWNtZC0+c3VzcGVuZF90aW1lID0gY3B1X3RvX2xlMzIoc2Nhbl90aW1pbmdbcGFyYW1zLT50eXBlXS5zdXNwZW5kX3RpbWUpOwotCWNtZC0+c2Nhbl9wcmlvcml0eSA9Ci0JCWl3bF9tdm1fc2Nhbl9wcmlvcml0eShtdm0sIElXTF9TQ0FOX1BSSU9SSVRZX0VYVF82KTsKKwljbWQtPnNjYW5fcHJpb3JpdHkgPSBjcHVfdG9fbGUzMihJV0xfU0NBTl9QUklPUklUWV9FWFRfNik7CiAKIAlpZiAoaXdsX212bV9pc19yZWd1bGFyX3NjYW4ocGFyYW1zKSkKLQkJY21kLT5vb2NfcHJpb3JpdHkgPQotCQkJaXdsX212bV9zY2FuX3ByaW9yaXR5KG12bSwgSVdMX1NDQU5fUFJJT1JJVFlfRVhUXzYpOworCQljbWQtPm9vY19wcmlvcml0eSA9IGNwdV90b19sZTMyKElXTF9TQ0FOX1BSSU9SSVRZX0VYVF82KTsKIAllbHNlCi0JCWNtZC0+b29jX3ByaW9yaXR5ID0KLQkJCWl3bF9tdm1fc2Nhbl9wcmlvcml0eShtdm0sIElXTF9TQ0FOX1BSSU9SSVRZX0VYVF8yKTsKKwkJY21kLT5vb2NfcHJpb3JpdHkgPSBjcHVfdG9fbGUzMihJV0xfU0NBTl9QUklPUklUWV9FWFRfMik7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xMDY3LDExICsxMDc2LDExIEBACiAJfQogfQogCi1zdGF0aWMgdTMyIGl3bF9tdm1fc2Nhbl91bWFjX2ZsYWdzKHN0cnVjdCBpd2xfbXZtICptdm0sCitzdGF0aWMgdTE2IGl3bF9tdm1fc2Nhbl91bWFjX2ZsYWdzKHN0cnVjdCBpd2xfbXZtICptdm0sCiAJCQkJICAgc3RydWN0IGl3bF9tdm1fc2Nhbl9wYXJhbXMgKnBhcmFtcywKIAkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQogewotCWludCBmbGFncyA9IDA7CisJdTE2IGZsYWdzID0gMDsKIAogCWlmIChwYXJhbXMtPm5fc3NpZHMgPT0gMCkKIAkJZmxhZ3MgPSBJV0xfVU1BQ19TQ0FOX0dFTl9GTEFHU19QQVNTSVZFOwpAQCAtMTA5Myw2ICsxMTAyLDkgQEAKIAlpZiAoIWl3bF9tdm1faXNfcmVndWxhcl9zY2FuKHBhcmFtcykpCiAJCWZsYWdzIHw9IElXTF9VTUFDX1NDQU5fR0VOX0ZMQUdTX1BFUklPRElDOwogCisJaWYgKHBhcmFtcy0+bWVhc3VyZW1lbnRfZHdlbGwpCisJCWZsYWdzIHw9IElXTF9VTUFDX1NDQU5fR0VOX0ZMQUdTX0lURVJfQ09NUExFVEU7CisKICNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVR0ZTCiAJaWYgKG12bS0+c2Nhbl9pdGVyX25vdGlmX2VuYWJsZWQpCiAJCWZsYWdzIHw9IElXTF9VTUFDX1NDQU5fR0VOX0ZMQUdTX0lURVJfQ09NUExFVEU7CkBAIC0xMTE5LDYgKzExMzEsNyBAQAogCQkJbXZtLT5mdy0+dWNvZGVfY2FwYS5uX3NjYW5fY2hhbm5lbHM7CiAJaW50IHVpZCwgaTsKIAl1MzIgc3NpZF9iaXRtYXAgPSAwOworCXN0cnVjdCBpd2xfbXZtX3ZpZiAqc2Nhbl92aWYgPSBpd2xfbXZtX3ZpZl9mcm9tX21hYzgwMjExKHZpZik7CiAKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZtdm0tPm11dGV4KTsKIApAQCAtMTEzNiw4ICsxMTQ5LDkgQEAKIAltdm0tPnNjYW5fdWlkX3N0YXR1c1t1aWRdID0gdHlwZTsKIAogCWNtZC0+dWlkID0gY3B1X3RvX2xlMzIodWlkKTsKLQljbWQtPmdlbmVyYWxfZmxhZ3MgPSBjcHVfdG9fbGUzMihpd2xfbXZtX3NjYW5fdW1hY19mbGFncyhtdm0sIHBhcmFtcywKKwljbWQtPmdlbmVyYWxfZmxhZ3MgPSBjcHVfdG9fbGUxNihpd2xfbXZtX3NjYW5fdW1hY19mbGFncyhtdm0sIHBhcmFtcywKIAkJCQkJCQkJIHZpZikpOworCWNtZC0+c2Nhbl9zdGFydF9tYWNfaWQgPSBzY2FuX3ZpZi0+aWQ7CiAKIAlpZiAodHlwZSA9PSBJV0xfTVZNX1NDQU5fU0NIRUQgfHwgdHlwZSA9PSBJV0xfTVZNX1NDQU5fTkVUREVURUNUKQogCQljbWQtPmZsYWdzID0gY3B1X3RvX2xlMzIoSVdMX1VNQUNfU0NBTl9GTEFHX1BSRUVNUFRJVkUpOwpAQCAtMTI4OSw2ICsxMzAzLDEyIEBACiAJCWl3bF9tdm1fZ2V0X3NjYW5fdHlwZShtdm0sCiAJCQkJICAgICAgdmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0UpOwogCisJcmV0ID0gaXdsX212bV9nZXRfbWVhc3VyZW1lbnRfZHdlbGwobXZtLCByZXEsICZwYXJhbXMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcGFyYW1zLm1lYXN1cmVtZW50X2R3ZWxsID0gcmV0OworCiAJaXdsX212bV9idWlsZF9zY2FuX3Byb2JlKG12bSwgdmlmLCBpZXMsICZwYXJhbXMpOwogCiAJaWYgKGZ3X2hhc19jYXBhKCZtdm0tPmZ3LT51Y29kZV9jYXBhLCBJV0xfVUNPREVfVExWX0NBUEFfVU1BQ19TQ0FOKSkgewpAQCAtMTMxNSw2ICsxMzM1LDcgQEAKIAogCUlXTF9ERUJVR19TQ0FOKG12bSwgIlNjYW4gcmVxdWVzdCB3YXMgc2VudCBzdWNjZXNzZnVsbHlcbiIpOwogCW12bS0+c2Nhbl9zdGF0dXMgfD0gSVdMX01WTV9TQ0FOX1JFR1VMQVI7CisJbXZtLT5zY2FuX3ZpZiA9IGl3bF9tdm1fdmlmX2Zyb21fbWFjODAyMTEodmlmKTsKIAlpd2xfbXZtX3JlZihtdm0sIElXTF9NVk1fUkVGX1NDQU4pOwogCiAJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV93cSwgJm12bS0+c2Nhbl90aW1lb3V0X2R3b3JrLApAQCAtMTQzNyw5ICsxNDU4LDEyIEBACiAJaWYgKG12bS0+c2Nhbl91aWRfc3RhdHVzW3VpZF0gPT0gSVdMX01WTV9TQ0FOX1JFR1VMQVIpIHsKIAkJc3RydWN0IGNmZzgwMjExX3NjYW5faW5mbyBpbmZvID0gewogCQkJLmFib3J0ZWQgPSBhYm9ydGVkLAorCQkJLnNjYW5fc3RhcnRfdHNmID0gbXZtLT5zY2FuX3N0YXJ0LAogCQl9OwogCisJCW1lbWNweShpbmZvLnRzZl9ic3NpZCwgbXZtLT5zY2FuX3ZpZi0+YnNzaWQsIEVUSF9BTEVOKTsKIAkJaWVlZTgwMjExX3NjYW5fY29tcGxldGVkKG12bS0+aHcsICZpbmZvKTsKKwkJbXZtLT5zY2FuX3ZpZiA9IE5VTEw7CiAJCWl3bF9tdm1fdW5yZWYobXZtLCBJV0xfTVZNX1JFRl9TQ0FOKTsKIAkJY2FuY2VsX2RlbGF5ZWRfd29yaygmbXZtLT5zY2FuX3RpbWVvdXRfZHdvcmspOwogCX0gZWxzZSBpZiAobXZtLT5zY2FuX3VpZF9zdGF0dXNbdWlkXSA9PSBJV0xfTVZNX1NDQU5fU0NIRUQpIHsKQEAgLTE0NzMsNiArMTQ5Nyw4IEBACiAJc3RydWN0IGl3bF91bWFjX3NjYW5faXRlcl9jb21wbGV0ZV9ub3RpZiAqbm90aWYgPSAodm9pZCAqKXBrdC0+ZGF0YTsKIAl1OCBidWZbMjU2XTsKIAorCW12bS0+c2Nhbl9zdGFydCA9IGxlNjRfdG9fY3B1KG5vdGlmLT5zdGFydF90c2YpOworCiAJSVdMX0RFQlVHX1NDQU4obXZtLAogCQkgICAgICAgIlVNQUMgU2NhbiBpdGVyYXRpb24gY29tcGxldGU6IHN0YXR1cz0weCV4IHNjYW5uZWRfY2hhbm5lbHM9JWQgY2hhbm5lbHMgbGlzdDogJXNcbiIsCiAJCSAgICAgICBub3RpZi0+c3RhdHVzLCBub3RpZi0+c2Nhbm5lZF9jaGFubmVscywKQEAgLTE0ODUsNiArMTUxMSwxMCBAQAogCQlpZWVlODAyMTFfc2NoZWRfc2Nhbl9yZXN1bHRzKG12bS0+aHcpOwogCQltdm0tPnNjaGVkX3NjYW5fcGFzc19hbGwgPSBTQ0hFRF9TQ0FOX1BBU1NfQUxMX0VOQUJMRUQ7CiAJfQorCisJSVdMX0RFQlVHX1NDQU4obXZtLAorCQkgICAgICAgIlVNQUMgU2NhbiBpdGVyYXRpb24gY29tcGxldGU6IHNjYW4gc3RhcnRlZCBhdCAlbGx1IChUU0YpXG4iLAorCQkgICAgICAgbXZtLT5zY2FuX3N0YXJ0KTsKIH0KIAogc3RhdGljIGludCBpd2xfbXZtX3VtYWNfc2Nhbl9hYm9ydChzdHJ1Y3QgaXdsX212bSAqbXZtLCBpbnQgdHlwZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL3N0YS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vc3RhLmMKaW5kZXggMzEzMGI5Yy4uZmM3NzE4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vc3RhLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vc3RhLmMKQEAgLTQ2OCw2ICs0NjgsMTEgQEAKIAkJICAgIGkgIT0gSVdMX01WTV9EUUFfQlNTX0NMSUVOVF9RVUVVRSkKIAkJCWNvbnRpbnVlOwogCisJCS8qIERvbid0IHRyeSBhbmQgdGFrZSBxdWV1ZXMgYmVpbmcgcmVjb25maWd1cmVkICovCisJCWlmIChtdm0tPnF1ZXVlX2luZm9bcXVldWVdLnN0YXR1cyA9PQorCQkgICAgSVdMX01WTV9RVUVVRV9SRUNPTkZJR1VSSU5HKQorCQkJY29udGludWU7CisKIAkJYWNfdG9fcXVldWVbbXZtLT5xdWV1ZV9pbmZvW2ldLm1hYzgwMjExX2FjXSA9IGk7CiAJfQogCkBAIC01MDEsMzEgKzUwNiwzNyBAQAogCQlxdWV1ZSA9IGFjX3RvX3F1ZXVlW0lFRUU4MDIxMV9BQ19WT107CiAKIAkvKiBNYWtlIHN1cmUgcXVldWUgZm91bmQgKG9yIG5vdCkgaXMgbGVnYWwgKi8KLQlpZiAoISgocXVldWUgPj0gSVdMX01WTV9EUUFfTUlOX01HTVRfUVVFVUUgJiYKLQkgICAgICAgcXVldWUgPD0gSVdMX01WTV9EUUFfTUFYX01HTVRfUVVFVUUpIHx8Ci0JICAgICAgKHF1ZXVlID49IElXTF9NVk1fRFFBX01JTl9EQVRBX1FVRVVFICYmCi0JICAgICAgIHF1ZXVlIDw9IElXTF9NVk1fRFFBX01BWF9EQVRBX1FVRVVFKSB8fAotCSAgICAgIChxdWV1ZSA9PSBJV0xfTVZNX0RRQV9CU1NfQ0xJRU5UX1FVRVVFKSkpIHsKKwlpZiAoIWl3bF9tdm1faXNfZHFhX2RhdGFfcXVldWUobXZtLCBxdWV1ZSkgJiYKKwkgICAgIWl3bF9tdm1faXNfZHFhX21nbXRfcXVldWUobXZtLCBxdWV1ZSkgJiYKKwkgICAgKHF1ZXVlICE9IElXTF9NVk1fRFFBX0JTU19DTElFTlRfUVVFVUUpKSB7CiAJCUlXTF9FUlIobXZtLCAiTm8gREFUQSBxdWV1ZXMgYXZhaWxhYmxlIHRvIHNoYXJlXG4iKTsKLQkJcXVldWUgPSAtRU5PU1BDOworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisKKwkvKiBNYWtlIHN1cmUgdGhlIHF1ZXVlIGlzbid0IGluIHRoZSBtaWRkbGUgb2YgYmVpbmcgcmVjb25maWd1cmVkICovCisJaWYgKG12bS0+cXVldWVfaW5mb1txdWV1ZV0uc3RhdHVzID09IElXTF9NVk1fUVVFVUVfUkVDT05GSUdVUklORykgeworCQlJV0xfRVJSKG12bSwKKwkJCSJUWFEgJWQgaXMgaW4gdGhlIG1pZGRsZSBvZiByZS1jb25maWcgLSB0cnkgYWdhaW5cbiIsCisJCQlxdWV1ZSk7CisJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJcmV0dXJuIHF1ZXVlOwogfQogCiAvKgotICogSWYgYSBnaXZlbiBxdWV1ZSBoYXMgYSBoaWdoZXIgQUMgdGhhbiB0aGUgVElEIHN0cmVhbSB0aGF0IGlzIGJlaW5nIGFkZGVkIHRvCi0gKiBpdCwgdGhlIHF1ZXVlIG5lZWRzIHRvIGJlIHJlZGlyZWN0ZWQgdG8gdGhlIGxvd2VyIEFDLiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhhdAorICogSWYgYSBnaXZlbiBxdWV1ZSBoYXMgYSBoaWdoZXIgQUMgdGhhbiB0aGUgVElEIHN0cmVhbSB0aGF0IGlzIGJlaW5nIGNvbXBhcmVkCisgKiB0bywgdGhlIHF1ZXVlIG5lZWRzIHRvIGJlIHJlZGlyZWN0ZWQgdG8gdGhlIGxvd2VyIEFDLiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhhdAogICogaW4gc3VjaCBhIGNhc2UsIG90aGVyd2lzZSAtIGlmIG5vIHJlZGlyZWN0aW9uIHJlcXVpcmVkIC0gaXQgZG9lcyBub3RoaW5nLAogICogdW5sZXNzIHRoZSAlZm9yY2UgcGFyYW0gaXMgdHJ1ZS4KICAqLwotc3RhdGljIGludCBpd2xfbXZtX3NjZF9xdWV1ZV9yZWRpcmVjdChzdHJ1Y3QgaXdsX212bSAqbXZtLCBpbnQgcXVldWUsIGludCB0aWQsCi0JCQkJICAgICAgaW50IGFjLCBpbnQgc3NuLCB1bnNpZ25lZCBpbnQgd2RnX3RpbWVvdXQsCi0JCQkJICAgICAgYm9vbCBmb3JjZSkKK2ludCBpd2xfbXZtX3NjZF9xdWV1ZV9yZWRpcmVjdChzdHJ1Y3QgaXdsX212bSAqbXZtLCBpbnQgcXVldWUsIGludCB0aWQsCisJCQkgICAgICAgaW50IGFjLCBpbnQgc3NuLCB1bnNpZ25lZCBpbnQgd2RnX3RpbWVvdXQsCisJCQkgICAgICAgYm9vbCBmb3JjZSkKIHsKIAlzdHJ1Y3QgaXdsX3NjZF90eHFfY2ZnX2NtZCBjbWQgPSB7CiAJCS5zY2RfcXVldWUgPSBxdWV1ZSwKLQkJLmVuYWJsZSA9IDAsCisJCS5hY3Rpb24gPSBTQ0RfQ0ZHX0RJU0FCTEVfUVVFVUUsCiAJfTsKIAlib29sIHNoYXJlZF9xdWV1ZTsKIAl1bnNpZ25lZCBsb25nIG1xOwpAQCAtNTUxLDExICs1NjIsMTIgQEAKIAogCWNtZC5zdGFfaWQgPSBtdm0tPnF1ZXVlX2luZm9bcXVldWVdLnJhX3N0YV9pZDsKIAljbWQudHhfZmlmbyA9IGl3bF9tdm1fYWNfdG9fdHhfZmlmb1ttdm0tPnF1ZXVlX2luZm9bcXVldWVdLm1hYzgwMjExX2FjXTsKKwljbWQudGlkID0gbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS50eHFfdGlkOwogCW1xID0gbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5od19xdWV1ZV90b19tYWM4MDIxMTsKIAlzaGFyZWRfcXVldWUgPSAobXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5od19xdWV1ZV9yZWZjb3VudCA+IDEpOwogCXNwaW5fdW5sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CiAKLQlJV0xfREVCVUdfVFhfUVVFVUVTKG12bSwgIlJlZGlyZWN0aW5nIHNoYXJlZCBUWFEgIyVkIHRvIEZJRk8gIyVkXG4iLAorCUlXTF9ERUJVR19UWF9RVUVVRVMobXZtLCAiUmVkaXJlY3RpbmcgVFhRICMlZCB0byBGSUZPICMlZFxuIiwKIAkJCSAgICBxdWV1ZSwgaXdsX212bV9hY190b190eF9maWZvW2FjXSk7CiAKIAkvKiBTdG9wIE1BQyBxdWV1ZXMgYW5kIHdhaXQgZm9yIHRoaXMgcXVldWUgdG8gZW1wdHkgKi8KQEAgLTU3Niw5ICs1ODgsMTIgQEAKIAkJCXJldCk7CiAKIAkvKiBNYWtlIHN1cmUgdGhlIFNDRCB3cnB0ciBpcyBjb3JyZWN0bHkgc2V0IGJlZm9yZSByZWNvbmZpZ3VyaW5nICovCi0JaXdsX3RyYW5zX3R4cV9lbmFibGUobXZtLT50cmFucywgcXVldWUsIGl3bF9tdm1fYWNfdG9fdHhfZmlmb1thY10sCi0JCQkgICAgIGNtZC5zdGFfaWQsIHRpZCwgTElOS19RVUFMX0FHR19GUkFNRV9MSU1JVF9ERUYsCi0JCQkgICAgIHNzbiwgd2RnX3RpbWVvdXQpOworCWl3bF90cmFuc190eHFfZW5hYmxlX2NmZyhtdm0tPnRyYW5zLCBxdWV1ZSwgc3NuLCBOVUxMLCB3ZGdfdGltZW91dCk7CisKKwkvKiBVcGRhdGUgdGhlIFRJRCAib3duZXIiIG9mIHRoZSBxdWV1ZSAqLworCXNwaW5fbG9ja19iaCgmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOworCW12bS0+cXVldWVfaW5mb1txdWV1ZV0udHhxX3RpZCA9IHRpZDsKKwlzcGluX3VubG9ja19iaCgmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOwogCiAJLyogVE9ETzogV29yay1hcm91bmQgU0NEIGJ1ZyB3aGVuIG1vdmluZyBiYWNrIGJ5IG11bHRpcGxlcyBvZiAweDQwICovCiAKQEAgLTcwOSw3ICs3MjQsNyBAQAogCWlmIChXQVJOX09OKHF1ZXVlIDw9IDApKSB7CiAJCUlXTF9FUlIobXZtLCAiTm8gYXZhaWxhYmxlIHF1ZXVlcyBmb3IgdGlkICVkIG9uIHN0YV9pZCAlZFxuIiwKIAkJCXRpZCwgY2ZnLnN0YV9pZCk7Ci0JCXJldHVybiAtRU5PU1BDOworCQlyZXR1cm4gcXVldWU7CiAJfQogCiAJLyoKQEAgLTcyOCwyMSArNzQzLDIzIEBACiAJaWYgKHVzaW5nX2luYWN0aXZlX3F1ZXVlKSB7CiAJCXN0cnVjdCBpd2xfc2NkX3R4cV9jZmdfY21kIGNtZCA9IHsKIAkJCS5zY2RfcXVldWUgPSBxdWV1ZSwKLQkJCS5lbmFibGUgPSAwLAorCQkJLmFjdGlvbiA9IFNDRF9DRkdfRElTQUJMRV9RVUVVRSwKIAkJfTsKLQkJdTggYWM7CisJCXU4IHR4cV9jdXJyX2FjOwogCiAJCWRpc2FibGVfYWdnX3RpZHMgPSBpd2xfbXZtX3JlbW92ZV9zdGFfcXVldWVfbWFya2luZyhtdm0sIHF1ZXVlKTsKIAogCQlzcGluX2xvY2tfYmgoJm12bS0+cXVldWVfaW5mb19sb2NrKTsKLQkJYWMgPSBtdm0tPnF1ZXVlX2luZm9bcXVldWVdLm1hYzgwMjExX2FjOworCQl0eHFfY3Vycl9hYyA9IG12bS0+cXVldWVfaW5mb1txdWV1ZV0ubWFjODAyMTFfYWM7CiAJCWNtZC5zdGFfaWQgPSBtdm0tPnF1ZXVlX2luZm9bcXVldWVdLnJhX3N0YV9pZDsKLQkJY21kLnR4X2ZpZm8gPSBpd2xfbXZtX2FjX3RvX3R4X2ZpZm9bYWNdOworCQljbWQudHhfZmlmbyA9IGl3bF9tdm1fYWNfdG9fdHhfZmlmb1t0eHFfY3Vycl9hY107CisJCWNtZC50aWQgPSBtdm0tPnF1ZXVlX2luZm9bcXVldWVdLnR4cV90aWQ7CiAJCXNwaW5fdW5sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CiAKIAkJLyogRGlzYWJsZSB0aGUgcXVldWUgKi8KLQkJaXdsX212bV9pbnZhbGlkYXRlX3N0YV9xdWV1ZShtdm0sIHF1ZXVlLCBkaXNhYmxlX2FnZ190aWRzLAotCQkJCQkgICAgIHRydWUpOworCQlpZiAoZGlzYWJsZV9hZ2dfdGlkcykKKwkJCWl3bF9tdm1faW52YWxpZGF0ZV9zdGFfcXVldWUobXZtLCBxdWV1ZSwKKwkJCQkJCSAgICAgZGlzYWJsZV9hZ2dfdGlkcywgZmFsc2UpOwogCQlpd2xfdHJhbnNfdHhxX2Rpc2FibGUobXZtLT50cmFucywgcXVldWUsIGZhbHNlKTsKIAkJcmV0ID0gaXdsX212bV9zZW5kX2NtZF9wZHUobXZtLCBTQ0RfUVVFVUVfQ0ZHLCAwLCBzaXplb2YoY21kKSwKIAkJCQkJICAgJmNtZCk7CkBAIC03NTgsNiArNzc1LDEwIEBACiAKIAkJCXJldHVybiByZXQ7CiAJCX0KKworCQkvKiBJZiBUWFEgaXMgYWxsb2NhdGVkIHRvIGFub3RoZXIgU1RBLCB1cGRhdGUgcmVtb3ZhbCBpbiBGVyAqLworCQlpZiAoY21kLnN0YV9pZCAhPSBtdm1zdGEtPnN0YV9pZCkKKwkJCWl3bF9tdm1faW52YWxpZGF0ZV9zdGFfcXVldWUobXZtLCBxdWV1ZSwgMCwgdHJ1ZSk7CiAJfQogCiAJSVdMX0RFQlVHX1RYX1FVRVVFUyhtdm0sCkBAIC04MjcsNiArODQ4LDExOSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIGl3bF9tdm1fY2hhbmdlX3F1ZXVlX293bmVyKHN0cnVjdCBpd2xfbXZtICptdm0sIGludCBxdWV1ZSkKK3sKKwlzdHJ1Y3QgaXdsX3NjZF90eHFfY2ZnX2NtZCBjbWQgPSB7CisJCS5zY2RfcXVldWUgPSBxdWV1ZSwKKwkJLmFjdGlvbiA9IFNDRF9DRkdfVVBEQVRFX1FVRVVFX1RJRCwKKwl9OworCXM4IHN0YV9pZDsKKwlpbnQgdGlkOworCXVuc2lnbmVkIGxvbmcgdGlkX2JpdG1hcDsKKwlpbnQgcmV0OworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmbXZtLT5tdXRleCk7CisKKwlzcGluX2xvY2tfYmgoJm12bS0+cXVldWVfaW5mb19sb2NrKTsKKwlzdGFfaWQgPSBtdm0tPnF1ZXVlX2luZm9bcXVldWVdLnJhX3N0YV9pZDsKKwl0aWRfYml0bWFwID0gbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS50aWRfYml0bWFwOworCXNwaW5fdW5sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CisKKwlpZiAoV0FSTighdGlkX2JpdG1hcCwgIlRYUSAlZCBoYXMgbm8gdGlkcyBhc3NpZ25lZCB0byBpdFxuIiwgcXVldWUpKQorCQlyZXR1cm47CisKKwkvKiBGaW5kIGFueSBUSUQgZm9yIHF1ZXVlICovCisJdGlkID0gZmluZF9maXJzdF9iaXQoJnRpZF9iaXRtYXAsIElXTF9NQVhfVElEX0NPVU5UICsgMSk7CisJY21kLnRpZCA9IHRpZDsKKwljbWQudHhfZmlmbyA9IGl3bF9tdm1fYWNfdG9fdHhfZmlmb1t0aWRfdG9fbWFjODAyMTFfYWNbdGlkXV07CisKKwlyZXQgPSBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIFNDRF9RVUVVRV9DRkcsIDAsIHNpemVvZihjbWQpLCAmY21kKTsKKwlpZiAocmV0KQorCQlJV0xfRVJSKG12bSwgIkZhaWxlZCB0byB1cGRhdGUgb3duZXIgb2YgVFhRICVkIChyZXQ9JWQpXG4iLAorCQkJcXVldWUsIHJldCk7CisJZWxzZQorCQlJV0xfREVCVUdfVFhfUVVFVUVTKG12bSwgIkNoYW5nZWQgVFhRICVkIG93bmVyc2hpcCB0byB0aWQgJWRcbiIsCisJCQkJICAgIHF1ZXVlLCB0aWQpOworfQorCitzdGF0aWMgdm9pZCBpd2xfbXZtX3Vuc2hhcmVfcXVldWUoc3RydWN0IGl3bF9tdm0gKm12bSwgaW50IHF1ZXVlKQoreworCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7CisJc3RydWN0IGl3bF9tdm1fc3RhICptdm1zdGE7CisJczggc3RhX2lkOworCWludCB0aWQgPSAtMTsKKwl1bnNpZ25lZCBsb25nIHRpZF9iaXRtYXA7CisJdW5zaWduZWQgaW50IHdkZ190aW1lb3V0OworCWludCBzc247CisJaW50IHJldCA9IHRydWU7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZtdm0tPm11dGV4KTsKKworCXNwaW5fbG9ja19iaCgmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOworCXN0YV9pZCA9IG12bS0+cXVldWVfaW5mb1txdWV1ZV0ucmFfc3RhX2lkOworCXRpZF9iaXRtYXAgPSBtdm0tPnF1ZXVlX2luZm9bcXVldWVdLnRpZF9iaXRtYXA7CisJc3Bpbl91bmxvY2tfYmgoJm12bS0+cXVldWVfaW5mb19sb2NrKTsKKworCS8qIEZpbmQgVElEIGZvciBxdWV1ZSwgYW5kIG1ha2Ugc3VyZSBpdCBpcyB0aGUgb25seSBvbmUgb24gdGhlIHF1ZXVlICovCisJdGlkID0gZmluZF9maXJzdF9iaXQoJnRpZF9iaXRtYXAsIElXTF9NQVhfVElEX0NPVU5UICsgMSk7CisJaWYgKHRpZF9iaXRtYXAgIT0gQklUKHRpZCkpIHsKKwkJSVdMX0VSUihtdm0sICJGYWlsZWQgdG8gdW5zaGFyZSBxICVkLCBhY3RpdmUgdGlkcz0weCVseFxuIiwKKwkJCXF1ZXVlLCB0aWRfYml0bWFwKTsKKwkJcmV0dXJuOworCX0KKworCUlXTF9ERUJVR19UWF9RVUVVRVMobXZtLCAiVW5zaGFyaW5nIFRYUSAlZCwga2VlcGluZyB0aWQgJWRcbiIsIHF1ZXVlLAorCQkJICAgIHRpZCk7CisKKwlzdGEgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKG12bS0+ZndfaWRfdG9fbWFjX2lkW3N0YV9pZF0sCisJCQkJCWxvY2tkZXBfaXNfaGVsZCgmbXZtLT5tdXRleCkpOworCisJaWYgKFdBUk5fT05fT05DRShJU19FUlJfT1JfTlVMTChzdGEpKSkKKwkJcmV0dXJuOworCisJbXZtc3RhID0gaXdsX212bV9zdGFfZnJvbV9tYWM4MDIxMShzdGEpOworCXdkZ190aW1lb3V0ID0gaXdsX212bV9nZXRfd2RfdGltZW91dChtdm0sIG12bXN0YS0+dmlmLCBmYWxzZSwgZmFsc2UpOworCisJc3NuID0gSUVFRTgwMjExX1NFUV9UT19TTihtdm1zdGEtPnRpZF9kYXRhW3RpZF0uc2VxX251bWJlcik7CisKKwlyZXQgPSBpd2xfbXZtX3NjZF9xdWV1ZV9yZWRpcmVjdChtdm0sIHF1ZXVlLCB0aWQsCisJCQkJCSB0aWRfdG9fbWFjODAyMTFfYWNbdGlkXSwgc3NuLAorCQkJCQkgd2RnX3RpbWVvdXQsIHRydWUpOworCWlmIChyZXQpIHsKKwkJSVdMX0VSUihtdm0sICJGYWlsZWQgdG8gcmVkaXJlY3QgVFhRICVkXG4iLCBxdWV1ZSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBJZiBhZ2dzIHNob3VsZCBiZSB0dXJuZWQgYmFjayBvbiAtIGRvIGl0ICovCisJaWYgKG12bXN0YS0+dGlkX2RhdGFbdGlkXS5zdGF0ZSA9PSBJV0xfQUdHX09OKSB7CisJCXN0cnVjdCBpd2xfbXZtX2FkZF9zdGFfY21kIGNtZCA9IHswfTsKKworCQltdm1zdGEtPnRpZF9kaXNhYmxlX2FnZyAmPSB+QklUKHRpZCk7CisKKwkJY21kLm1hY19pZF9uX2NvbG9yID0gY3B1X3RvX2xlMzIobXZtc3RhLT5tYWNfaWRfbl9jb2xvcik7CisJCWNtZC5zdGFfaWQgPSBtdm1zdGEtPnN0YV9pZDsKKwkJY21kLmFkZF9tb2RpZnkgPSBTVEFfTU9ERV9NT0RJRlk7CisJCWNtZC5tb2RpZnlfbWFzayA9IFNUQV9NT0RJRllfVElEX0RJU0FCTEVfVFg7CisJCWNtZC50ZmRfcXVldWVfbXNrID0gY3B1X3RvX2xlMzIobXZtc3RhLT50ZmRfcXVldWVfbXNrKTsKKwkJY21kLnRpZF9kaXNhYmxlX3R4ID0gY3B1X3RvX2xlMTYobXZtc3RhLT50aWRfZGlzYWJsZV9hZ2cpOworCisJCXJldCA9IGl3bF9tdm1fc2VuZF9jbWRfcGR1KG12bSwgQUREX1NUQSwgQ01EX0FTWU5DLAorCQkJCQkgICBpd2xfbXZtX2FkZF9zdGFfY21kX3NpemUobXZtKSwgJmNtZCk7CisJCWlmICghcmV0KSB7CisJCQlJV0xfREVCVUdfVFhfUVVFVUVTKG12bSwKKwkJCQkJICAgICJUWFEgIyVkIGlzIG5vdyBhZ2dyZWdhdGVkIGFnYWluXG4iLAorCQkJCQkgICAgcXVldWUpOworCisJCQkvKiBNYXJrIHF1ZXVlIGludGVuYWxseSBhcyBhZ2dyZWdhdGluZyBhZ2FpbiAqLworCQkJaXdsX3RyYW5zX3R4cV9zZXRfc2hhcmVkX21vZGUobXZtLT50cmFucywgcXVldWUsIGZhbHNlKTsKKwkJfQorCX0KKworCXNwaW5fbG9ja19iaCgmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOworCW12bS0+cXVldWVfaW5mb1txdWV1ZV0uc3RhdHVzID0gSVdMX01WTV9RVUVVRV9SRUFEWTsKKwlzcGluX3VubG9ja19iaCgmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOworfQorCiBzdGF0aWMgaW5saW5lIHU4IGl3bF9tdm1fdGlkX3RvX2FjX3F1ZXVlKGludCB0aWQpCiB7CiAJaWYgKHRpZCA9PSBJV0xfTUFYX1RJRF9DT1VOVCkKQEAgLTg5NCwxMyArMTAyOCw0MiBAQAogCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7CiAJc3RydWN0IGl3bF9tdm1fc3RhICptdm1zdGE7CiAJdW5zaWduZWQgbG9uZyBkZWZlcnJlZF90aWRfdHJhZmZpYzsKLQlpbnQgc3RhX2lkLCB0aWQ7CisJaW50IHF1ZXVlLCBzdGFfaWQsIHRpZDsKIAogCS8qIENoZWNrIGluYWN0aXZpdHkgb2YgcXVldWVzICovCiAJaXdsX212bV9pbmFjdGl2aXR5X2NoZWNrKG12bSk7CiAKIAltdXRleF9sb2NrKCZtdm0tPm11dGV4KTsKIAorCS8qIFJlY29uZmlndXJlIHF1ZXVlcyByZXF1aXJpbmcgcmVjb25maWd1YXRpb24gKi8KKwlmb3IgKHF1ZXVlID0gMDsgcXVldWUgPCBJV0xfTUFYX0hXX1FVRVVFUzsgcXVldWUrKykgeworCQlib29sIHJlY29uZmlnOworCQlib29sIGNoYW5nZV9vd25lcjsKKworCQlzcGluX2xvY2tfYmgoJm12bS0+cXVldWVfaW5mb19sb2NrKTsKKwkJcmVjb25maWcgPSAobXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5zdGF0dXMgPT0KKwkJCSAgICBJV0xfTVZNX1FVRVVFX1JFQ09ORklHVVJJTkcpOworCisJCS8qCisJCSAqIFdlIG5lZWQgdG8gdGFrZSBpbnRvIGFjY291bnQgYSBzaXR1YXRpb24gaW4gd2hpY2ggYSBUWFEgd2FzCisJCSAqIGFsbG9jYXRlZCB0byBUSUQgeCwgYW5kIHRoZW4gdHVybmVkIHNoYXJlZCBieSBhZGRpbmcgVElEcyB5CisJCSAqIGFuZCB6LiBJZiBUSUQgeCBiZWNvbWVzIGluYWN0aXZlIGFuZCBpcyByZW1vdmVkIGZyb20gdGhlIFRYUSwKKwkJICogb3duZXJzaGlwIG11c3QgYmUgZ2l2ZW4gdG8gb25lIG9mIHRoZSByZW1haW5pbmcgVElEcy4KKwkJICogVGhpcyBpcyBtYWlubHkgYmVjYXVzZSBpZiBUSUQgeCBjb250aW51ZXMgLSBhIG5ldyBxdWV1ZSBjYW4ndAorCQkgKiBiZSBhbGxvY2F0ZWQgZm9yIGl0IGFzIGxvbmcgYXMgaXQgaXMgYW4gb3duZXIgb2YgYW5vdGhlciBUWFEuCisJCSAqLworCQljaGFuZ2Vfb3duZXIgPSAhKG12bS0+cXVldWVfaW5mb1txdWV1ZV0udGlkX2JpdG1hcCAmCisJCQkJIEJJVChtdm0tPnF1ZXVlX2luZm9bcXVldWVdLnR4cV90aWQpKSAmJgorCQkJICAgICAgIChtdm0tPnF1ZXVlX2luZm9bcXVldWVdLnN0YXR1cyA9PQorCQkJCUlXTF9NVk1fUVVFVUVfU0hBUkVEKTsKKwkJc3Bpbl91bmxvY2tfYmgoJm12bS0+cXVldWVfaW5mb19sb2NrKTsKKworCQlpZiAocmVjb25maWcpCisJCQlpd2xfbXZtX3Vuc2hhcmVfcXVldWUobXZtLCBxdWV1ZSk7CisJCWVsc2UgaWYgKGNoYW5nZV9vd25lcikKKwkJCWl3bF9tdm1fY2hhbmdlX3F1ZXVlX293bmVyKG12bSwgcXVldWUpOworCX0KKwogCS8qIEdvIG92ZXIgYWxsIHN0YXRpb25zIHdpdGggZGVmZXJyZWQgdHJhZmZpYyAqLwogCWZvcl9lYWNoX3NldF9iaXQoc3RhX2lkLCBtdm0tPnN0YV9kZWZlcnJlZF9mcmFtZXMsCiAJCQkgSVdMX01WTV9TVEFUSU9OX0NPVU5UKSB7CkBAIC05NjMsNiArMTEyNiw2MSBAQAogCXJldHVybiAwOwogfQogCisvKgorICogSW4gRFFBIG1vZGUsIGFmdGVyIGEgSFcgcmVzdGFydCB0aGUgcXVldWVzIHNob3VsZCBiZSBhbGxvY2F0ZWQgYXMgYmVmb3JlLCBpbgorICogb3JkZXIgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zIHdoZW4gdGhlcmUgYXJlIHNoYXJlZCBxdWV1ZXMuIFRoaXMgZnVuY3Rpb24KKyAqIGRvZXMgdGhlIHJlLW1hcHBpbmcgYW5kIHF1ZXVlIGFsbG9jYXRpb24uCisgKgorICogTm90ZSB0aGF0IHJlLWVuYWJsaW5nIGFnZ3JlZ2F0aW9ucyBpc24ndCBkb25lIGluIHRoaXMgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIGl3bF9tdm1fcmVhbGxvY19xdWV1ZXNfYWZ0ZXJfcmVzdGFydChzdHJ1Y3QgaXdsX212bSAqbXZtLAorCQkJCQkJIHN0cnVjdCBpd2xfbXZtX3N0YSAqbXZtX3N0YSkKK3sKKwl1bnNpZ25lZCBpbnQgd2RnX3RpbWVvdXQgPQorCQkJaXdsX212bV9nZXRfd2RfdGltZW91dChtdm0sIG12bV9zdGEtPnZpZiwgZmFsc2UsIGZhbHNlKTsKKwlpbnQgaTsKKwlzdHJ1Y3QgaXdsX3RyYW5zX3R4cV9zY2RfY2ZnIGNmZyA9IHsKKwkJLnN0YV9pZCA9IG12bV9zdGEtPnN0YV9pZCwKKwkJLmZyYW1lX2xpbWl0ID0gSVdMX0ZSQU1FX0xJTUlULAorCX07CisKKwkvKiBNYWtlIHN1cmUgcmVzZXJ2ZWQgcXVldWUgaXMgc3RpbGwgbWFya2VkIGFzIHN1Y2ggKG9yIGFsbG9jYXRlZCkgKi8KKwltdm0tPnF1ZXVlX2luZm9bbXZtX3N0YS0+cmVzZXJ2ZWRfcXVldWVdLnN0YXR1cyA9CisJCUlXTF9NVk1fUVVFVUVfUkVTRVJWRUQ7CisKKwlmb3IgKGkgPSAwOyBpIDw9IElXTF9NQVhfVElEX0NPVU5UOyBpKyspIHsKKwkJc3RydWN0IGl3bF9tdm1fdGlkX2RhdGEgKnRpZF9kYXRhID0gJm12bV9zdGEtPnRpZF9kYXRhW2ldOworCQlpbnQgdHhxX2lkID0gdGlkX2RhdGEtPnR4cV9pZDsKKwkJaW50IGFjOworCQl1OCBtYWNfcXVldWU7CisKKwkJaWYgKHR4cV9pZCA9PSBJRUVFODAyMTFfSU5WQUxfSFdfUVVFVUUpCisJCQljb250aW51ZTsKKworCQlza2JfcXVldWVfaGVhZF9pbml0KCZ0aWRfZGF0YS0+ZGVmZXJyZWRfdHhfZnJhbWVzKTsKKworCQlhYyA9IHRpZF90b19tYWM4MDIxMV9hY1tpXTsKKwkJbWFjX3F1ZXVlID0gbXZtX3N0YS0+dmlmLT5od19xdWV1ZVthY107CisKKwkJY2ZnLnRpZCA9IGk7CisJCWNmZy5maWZvID0gaXdsX212bV9hY190b190eF9maWZvW2FjXTsKKwkJY2ZnLmFnZ3JlZ2F0ZSA9ICh0eHFfaWQgPj0gSVdMX01WTV9EUUFfTUlOX0RBVEFfUVVFVUUgfHwKKwkJCQkgdHhxX2lkID09IElXTF9NVk1fRFFBX0JTU19DTElFTlRfUVVFVUUpOworCisJCUlXTF9ERUJVR19UWF9RVUVVRVMobXZtLAorCQkJCSAgICAiUmUtbWFwcGluZyBzdGEgJWQgdGlkICVkIHRvIHF1ZXVlICVkXG4iLAorCQkJCSAgICBtdm1fc3RhLT5zdGFfaWQsIGksIHR4cV9pZCk7CisKKwkJaXdsX212bV9lbmFibGVfdHhxKG12bSwgdHhxX2lkLCBtYWNfcXVldWUsCisJCQkJICAgSUVFRTgwMjExX1NFUV9UT19TTih0aWRfZGF0YS0+c2VxX251bWJlciksCisJCQkJICAgJmNmZywgd2RnX3RpbWVvdXQpOworCisJCW12bS0+cXVldWVfaW5mb1t0eHFfaWRdLnN0YXR1cyA9IElXTF9NVk1fUVVFVUVfUkVBRFk7CisJfQorCisJYXRvbWljX3NldCgmbXZtLT5wZW5kaW5nX2ZyYW1lc1ttdm1fc3RhLT5zdGFfaWRdLCAwKTsKK30KKwogaW50IGl3bF9tdm1fYWRkX3N0YShzdHJ1Y3QgaXdsX212bSAqbXZtLAogCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCkBAIC05ODUsNiArMTIwMywxMyBAQAogCiAJc3Bpbl9sb2NrX2luaXQoJm12bV9zdGEtPmxvY2spOwogCisJLyogSW4gRFFBIG1vZGUsIGlmIHRoaXMgaXMgYSBIVyByZXN0YXJ0LCByZS1hbGxvYyBleGlzdGluZyBxdWV1ZXMgKi8KKwlpZiAoaXdsX212bV9pc19kcWFfc3VwcG9ydGVkKG12bSkgJiYKKwkgICAgdGVzdF9iaXQoSVdMX01WTV9TVEFUVVNfSU5fSFdfUkVTVEFSVCwgJm12bS0+c3RhdHVzKSkgeworCQlpd2xfbXZtX3JlYWxsb2NfcXVldWVzX2FmdGVyX3Jlc3RhcnQobXZtLCBtdm1fc3RhKTsKKwkJZ290byB1cGRhdGVfZnc7CisJfQorCiAJbXZtX3N0YS0+c3RhX2lkID0gc3RhX2lkOwogCW12bV9zdGEtPm1hY19pZF9uX2NvbG9yID0gRldfQ01EX0lEX0FORF9DT0xPUihtdm12aWYtPmlkLAogCQkJCQkJICAgICAgbXZtdmlmLT5jb2xvcik7CkBAIC0xMDQ4LDYgKzEyNzMsNyBAQAogCQkJZ290byBlcnI7CiAJfQogCit1cGRhdGVfZnc6CiAJcmV0ID0gaXdsX212bV9zdGFfc2VuZF90b19mdyhtdm0sIHN0YSwgZmFsc2UsIDApOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyOwpAQCAtMTA3MSwxMyArMTI5Nyw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGl3bF9tdm1fdXBkYXRlX3N0YShzdHJ1Y3QgaXdsX212bSAqbXZtLAotCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCi17Ci0JcmV0dXJuIGl3bF9tdm1fc3RhX3NlbmRfdG9fZncobXZtLCBzdGEsIHRydWUsIDApOwotfQotCiBpbnQgaXdsX212bV9kcmFpbl9zdGEoc3RydWN0IGl3bF9tdm0gKm12bSwgc3RydWN0IGl3bF9tdm1fc3RhICptdm1zdGEsCiAJCSAgICAgIGJvb2wgZHJhaW4pCiB7CkBAIC0xMjcwLDkgKzE0ODksMzEgQEAKIAkJcmV0ID0gaXdsX212bV9kcmFpbl9zdGEobXZtLCBtdm1fc3RhLCBmYWxzZSk7CiAKIAkJLyogSWYgRFFBIGlzIHN1cHBvcnRlZCAtIHRoZSBxdWV1ZXMgY2FuIGJlIGRpc2FibGVkIG5vdyAqLwotCQlpZiAoaXdsX212bV9pc19kcWFfc3VwcG9ydGVkKG12bSkpCisJCWlmIChpd2xfbXZtX2lzX2RxYV9zdXBwb3J0ZWQobXZtKSkgeworCQkJdTggcmVzZXJ2ZWRfdHhxID0gbXZtX3N0YS0+cmVzZXJ2ZWRfcXVldWU7CisJCQllbnVtIGl3bF9tdm1fcXVldWVfc3RhdHVzICpzdGF0dXM7CisKIAkJCWl3bF9tdm1fZGlzYWJsZV9zdGFfcXVldWVzKG12bSwgdmlmLCBtdm1fc3RhKTsKIAorCQkJLyoKKwkJCSAqIElmIG5vIHRyYWZmaWMgaGFzIGdvbmUgdGhyb3VnaCB0aGUgcmVzZXJ2ZWQgVFhRIC0gaXQKKwkJCSAqIGlzIHN0aWxsIG1hcmtlZCBhcyBJV0xfTVZNX1FVRVVFX1JFU0VSVkVELCBhbmQKKwkJCSAqIHNob3VsZCBiZSBtYW51YWxseSBtYXJrZWQgYXMgZnJlZSBhZ2FpbgorCQkJICovCisJCQlzcGluX2xvY2tfYmgoJm12bS0+cXVldWVfaW5mb19sb2NrKTsKKwkJCXN0YXR1cyA9ICZtdm0tPnF1ZXVlX2luZm9bcmVzZXJ2ZWRfdHhxXS5zdGF0dXM7CisJCQlpZiAoV0FSTigoKnN0YXR1cyAhPSBJV0xfTVZNX1FVRVVFX1JFU0VSVkVEKSAmJgorCQkJCSAoKnN0YXR1cyAhPSBJV0xfTVZNX1FVRVVFX0ZSRUUpLAorCQkJCSAic3RhX2lkICVkIHJlc2VydmVkIHR4cSAlZCBzdGF0dXMgJWQiLAorCQkJCSBtdm1fc3RhLT5zdGFfaWQsIHJlc2VydmVkX3R4cSwgKnN0YXR1cykpIHsKKwkJCQlzcGluX3VubG9ja19iaCgmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQkqc3RhdHVzID0gSVdMX01WTV9RVUVVRV9GUkVFOworCQkJc3Bpbl91bmxvY2tfYmgoJm12bS0+cXVldWVfaW5mb19sb2NrKTsKKwkJfQorCiAJCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgogCQkgICAgbXZtdmlmLT5hcF9zdGFfaWQgPT0gbXZtX3N0YS0+c3RhX2lkKSB7CiAJCQkvKiBpZiBhc3NvY2lhdGVkIC0gd2UgY2FuJ3QgcmVtb3ZlIHRoZSBBUCBTVEEgbm93ICovCkBAIC0xODAyLDExICsyMDQzLDkgQEAKIAkJYmFpZF9kYXRhLT5iYWlkID0gYmFpZDsKIAkJYmFpZF9kYXRhLT50aW1lb3V0ID0gdGltZW91dDsKIAkJYmFpZF9kYXRhLT5sYXN0X3J4ID0gamlmZmllczsKLQkJaW5pdF90aW1lcigmYmFpZF9kYXRhLT5zZXNzaW9uX3RpbWVyKTsKLQkJYmFpZF9kYXRhLT5zZXNzaW9uX3RpbWVyLmZ1bmN0aW9uID0KLQkJCWl3bF9tdm1fcnhfYWdnX3Nlc3Npb25fZXhwaXJlZDsKLQkJYmFpZF9kYXRhLT5zZXNzaW9uX3RpbWVyLmRhdGEgPQotCQkJKHVuc2lnbmVkIGxvbmcpJm12bS0+YmFpZF9tYXBbYmFpZF07CisJCXNldHVwX3RpbWVyKCZiYWlkX2RhdGEtPnNlc3Npb25fdGltZXIsCisJCQkgICAgaXdsX212bV9yeF9hZ2dfc2Vzc2lvbl9leHBpcmVkLAorCQkJICAgICh1bnNpZ25lZCBsb25nKSZtdm0tPmJhaWRfbWFwW2JhaWRdKTsKIAkJYmFpZF9kYXRhLT5tdm0gPSBtdm07CiAJCWJhaWRfZGF0YS0+dGlkID0gdGlkOwogCQliYWlkX2RhdGEtPnN0YV9pZCA9IG12bV9zdGEtPnN0YV9pZDsKQEAgLTE5NTYsNyArMjE5NSw3IEBACiAJCXJldHVybiAtRUlPOwogCX0KIAotCXNwaW5fbG9ja19iaCgmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOworCXNwaW5fbG9jaygmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOwogCiAJLyoKIAkgKiBOb3RlIHRoZSBwb3NzaWJsZSBjYXNlczoKQEAgLTE5NjcsMTQgKzIyMDYsMjAgQEAKIAkgKglub24tRFFBIG1vZGUsIHNpbmNlIHRoZSBUWFEgaGFzbid0IHlldCBiZWVuIGFsbG9jYXRlZAogCSAqLwogCXR4cV9pZCA9IG12bXN0YS0+dGlkX2RhdGFbdGlkXS50eHFfaWQ7Ci0JaWYgKCFpd2xfbXZtX2lzX2RxYV9zdXBwb3J0ZWQobXZtKSB8fAorCWlmIChpd2xfbXZtX2lzX2RxYV9zdXBwb3J0ZWQobXZtKSAmJgorCSAgICB1bmxpa2VseShtdm0tPnF1ZXVlX2luZm9bdHhxX2lkXS5zdGF0dXMgPT0gSVdMX01WTV9RVUVVRV9TSEFSRUQpKSB7CisJCXJldCA9IC1FTlhJTzsKKwkJSVdMX0RFQlVHX1RYX1FVRVVFUyhtdm0sCisJCQkJICAgICJDYW4ndCBzdGFydCB0aWQgJWQgYWdnIG9uIHNoYXJlZCBxdWV1ZSFcbiIsCisJCQkJICAgIHRpZCk7CisJCWdvdG8gcmVsZWFzZV9sb2NrczsKKwl9IGVsc2UgaWYgKCFpd2xfbXZtX2lzX2RxYV9zdXBwb3J0ZWQobXZtKSB8fAogCSAgICBtdm0tPnF1ZXVlX2luZm9bdHhxX2lkXS5zdGF0dXMgIT0gSVdMX01WTV9RVUVVRV9SRUFEWSkgewogCQl0eHFfaWQgPSBpd2xfbXZtX2ZpbmRfZnJlZV9xdWV1ZShtdm0sIG12bXN0YS0+c3RhX2lkLAogCQkJCQkJIG12bS0+Zmlyc3RfYWdnX3F1ZXVlLAogCQkJCQkJIG12bS0+bGFzdF9hZ2dfcXVldWUpOwogCQlpZiAodHhxX2lkIDwgMCkgewogCQkJcmV0ID0gdHhxX2lkOwotCQkJc3Bpbl91bmxvY2tfYmgoJm12bS0+cXVldWVfaW5mb19sb2NrKTsKIAkJCUlXTF9FUlIobXZtLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGFnZyBxdWV1ZVxuIik7CiAJCQlnb3RvIHJlbGVhc2VfbG9ja3M7CiAJCX0KQEAgLTE5ODIsNyArMjIyNyw4IEBACiAJCS8qIFRYUSBoYXNuJ3QgeWV0IGJlZW4gZW5hYmxlZCwgc28gbWFyayBpdCBvbmx5IGFzIHJlc2VydmVkICovCiAJCW12bS0+cXVldWVfaW5mb1t0eHFfaWRdLnN0YXR1cyA9IElXTF9NVk1fUVVFVUVfUkVTRVJWRUQ7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CisKKwlzcGluX3VubG9jaygmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOwogCiAJSVdMX0RFQlVHX1RYX1FVRVVFUyhtdm0sCiAJCQkgICAgIkFHRyBmb3IgdGlkICVkIHdpbGwgYmUgb24gcXVldWUgIyVkXG4iLApAQCAtMjAwNiw4ICsyMjUyLDExIEBACiAJfQogCiAJcmV0ID0gMDsKKwlnb3RvIG91dDsKIAogcmVsZWFzZV9sb2NrczoKKwlzcGluX3VubG9jaygmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOworb3V0OgogCXNwaW5fdW5sb2NrX2JoKCZtdm1zdGEtPmxvY2spOwogCiAJcmV0dXJuIHJldDsKQEAgLTIwMjMsNiArMjI3Miw3IEBACiAJCWl3bF9tdm1fZ2V0X3dkX3RpbWVvdXQobXZtLCB2aWYsIHN0YS0+dGRscywgZmFsc2UpOwogCWludCBxdWV1ZSwgcmV0OwogCWJvb2wgYWxsb2NfcXVldWUgPSB0cnVlOworCWVudW0gaXdsX212bV9xdWV1ZV9zdGF0dXMgcXVldWVfc3RhdHVzOwogCXUxNiBzc247CiAKIAlzdHJ1Y3QgaXdsX3RyYW5zX3R4cV9zY2RfY2ZnIGNmZyA9IHsKQEAgLTIwNDgsMTMgKzIyOTgsMTUgQEAKIAogCWNmZy5maWZvID0gaXdsX212bV9hY190b190eF9maWZvW3RpZF90b19tYWM4MDIxMV9hY1t0aWRdXTsKIAorCXNwaW5fbG9ja19iaCgmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOworCXF1ZXVlX3N0YXR1cyA9IG12bS0+cXVldWVfaW5mb1txdWV1ZV0uc3RhdHVzOworCXNwaW5fdW5sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CisKIAkvKiBJbiBEUUEgbW9kZSwgdGhlIGV4aXN0aW5nIHF1ZXVlIG1pZ2h0IG5lZWQgdG8gYmUgcmVjb25maWd1cmVkICovCiAJaWYgKGl3bF9tdm1faXNfZHFhX3N1cHBvcnRlZChtdm0pKSB7Ci0JCXNwaW5fbG9ja19iaCgmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOwogCQkvKiBNYXliZSB0aGVyZSBpcyBubyBuZWVkIHRvIGV2ZW4gYWxsb2MgYSBxdWV1ZS4uLiAqLwogCQlpZiAobXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5zdGF0dXMgPT0gSVdMX01WTV9RVUVVRV9SRUFEWSkKIAkJCWFsbG9jX3F1ZXVlID0gZmFsc2U7Ci0JCXNwaW5fdW5sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CiAKIAkJLyoKIAkJICogT25seSByZWNvbmZpZyB0aGUgU0NEIGZvciB0aGUgcXVldWUgaWYgdGhlIHdpbmRvdyBzaXplIGhhcwpAQCAtMjA4OSw5ICsyMzQxLDEyIEBACiAJCQkJICAgdmlmLT5od19xdWV1ZVt0aWRfdG9fbWFjODAyMTFfYWNbdGlkXV0sIHNzbiwKIAkJCQkgICAmY2ZnLCB3ZGdfdGltZW91dCk7CiAKLQlyZXQgPSBpd2xfbXZtX3N0YV90eF9hZ2cobXZtLCBzdGEsIHRpZCwgcXVldWUsIHRydWUpOwotCWlmIChyZXQpCi0JCXJldHVybiAtRUlPOworCS8qIFNlbmQgQUREX1NUQSBjb21tYW5kIHRvIGVuYWJsZSBhZ2dzIG9ubHkgaWYgdGhlIHF1ZXVlIGlzbid0IHNoYXJlZCAqLworCWlmIChxdWV1ZV9zdGF0dXMgIT0gSVdMX01WTV9RVUVVRV9TSEFSRUQpIHsKKwkJcmV0ID0gaXdsX212bV9zdGFfdHhfYWdnKG12bSwgc3RhLCB0aWQsIHF1ZXVlLCB0cnVlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAtRUlPOworCX0KIAogCS8qIE5vIG5lZWQgdG8gbWFyayBhcyByZXNlcnZlZCAqLwogCXNwaW5fbG9ja19iaCgmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOwpAQCAtMjEyMyw3ICsyMzc4LDYgQEAKIAl1MTYgdHhxX2lkOwogCWludCBlcnI7CiAKLQogCS8qCiAJICogSWYgbWFjODAyMTEgaXMgY2xlYW5pbmcgaXRzIHN0YXRlLCB0aGVuIHNheSB0aGF0IHdlIGZpbmlzaGVkIHNpbmNlCiAJICogb3VyIHN0YXRlIGhhcyBiZWVuIGNsZWFyZWQgYW55d2F5LgpAQCAtMjE1Miw2ICsyNDA2LDcgQEAKIAkgKi8KIAlpZiAobXZtLT5xdWV1ZV9pbmZvW3R4cV9pZF0uc3RhdHVzID09IElXTF9NVk1fUVVFVUVfUkVTRVJWRUQpCiAJCW12bS0+cXVldWVfaW5mb1t0eHFfaWRdLnN0YXR1cyA9IElXTF9NVk1fUVVFVUVfRlJFRTsKKwogCXNwaW5fdW5sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CiAKIAlzd2l0Y2ggKHRpZF9kYXRhLT5zdGF0ZSkgewpAQCAtMjQxMiw5ICsyNjY3LDE1IEBACiAJc3RydWN0IGl3bF9tdm1fbWdtdF9tY2FzdF9rZXlfY21kIGlndGtfY21kID0ge307CiAKIAkvKiB2ZXJpZnkgdGhlIGtleSBkZXRhaWxzIG1hdGNoIHRoZSByZXF1aXJlZCBjb21tYW5kJ3MgZXhwZWN0YXRpb25zICovCi0JaWYgKFdBUk5fT04oKGtleWNvbmYtPmNpcGhlciAhPSBXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQykgfHwKLQkJICAgIChrZXljb25mLT5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19QQUlSV0lTRSkgfHwKLQkJICAgIChrZXljb25mLT5rZXlpZHggIT0gNCAmJiBrZXljb25mLT5rZXlpZHggIT0gNSkpKQorCWlmIChXQVJOX09OKChrZXljb25mLT5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19QQUlSV0lTRSkgfHwKKwkJICAgIChrZXljb25mLT5rZXlpZHggIT0gNCAmJiBrZXljb25mLT5rZXlpZHggIT0gNSkgfHwKKwkJICAgIChrZXljb25mLT5jaXBoZXIgIT0gV0xBTl9DSVBIRVJfU1VJVEVfQUVTX0NNQUMgJiYKKwkJICAgICBrZXljb25mLT5jaXBoZXIgIT0gV0xBTl9DSVBIRVJfU1VJVEVfQklQX0dNQUNfMTI4ICYmCisJCSAgICAga2V5Y29uZi0+Y2lwaGVyICE9IFdMQU5fQ0lQSEVSX1NVSVRFX0JJUF9HTUFDXzI1NikpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChXQVJOX09OKCFpd2xfbXZtX2hhc19uZXdfcnhfYXBpKG12bSkgJiYKKwkJICAgIGtleWNvbmYtPmNpcGhlciAhPSBXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQykpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWd0a19jbWQua2V5X2lkID0gY3B1X3RvX2xlMzIoa2V5Y29uZi0+a2V5aWR4KTsKQEAgLTI0MzAsMTEgKzI2OTEsMTggQEAKIAkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQzoKIAkJCWlndGtfY21kLmN0cmxfZmxhZ3MgfD0gY3B1X3RvX2xlMzIoU1RBX0tFWV9GTEdfQ0NNKTsKIAkJCWJyZWFrOworCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0JJUF9HTUFDXzEyODoKKwkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9CSVBfR01BQ18yNTY6CisJCQlpZ3RrX2NtZC5jdHJsX2ZsYWdzIHw9IGNwdV90b19sZTMyKFNUQV9LRVlfRkxHX0dDTVApOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCi0JCW1lbWNweShpZ3RrX2NtZC5JR1RLLCBrZXljb25mLT5rZXksIGtleWNvbmYtPmtleWxlbik7CisJCW1lbWNweShpZ3RrX2NtZC5pZ3RrLCBrZXljb25mLT5rZXksIGtleWNvbmYtPmtleWxlbik7CisJCWlmIChrZXljb25mLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfQklQX0dNQUNfMjU2KQorCQkJaWd0a19jbWQuY3RybF9mbGFncyB8PQorCQkJCWNwdV90b19sZTMyKFNUQV9LRVlfRkxHX0tFWV8zMkJZVEVTKTsKIAkJaWVlZTgwMjExX2dldF9rZXlfcnhfc2VxKGtleWNvbmYsIDAsICZzZXEpOwogCQlwbiA9IHNlcS5hZXNfY21hYy5wbjsKIAkJaWd0a19jbWQucmVjZWl2ZV9zZXFfY250ID0gY3B1X3RvX2xlNjQoKCh1NjQpIHBuWzVdIDw8IDApIHwKQEAgLTI0NDksNiArMjcxNywxOSBAQAogCQkgICAgICAgcmVtb3ZlX2tleSA/ICJyZW1vdmluZyIgOiAiaW5zdGFsbGluZyIsCiAJCSAgICAgICBpZ3RrX2NtZC5zdGFfaWQpOwogCisJaWYgKCFpd2xfbXZtX2hhc19uZXdfcnhfYXBpKG12bSkpIHsKKwkJc3RydWN0IGl3bF9tdm1fbWdtdF9tY2FzdF9rZXlfY21kX3YxIGlndGtfY21kX3YxID0geworCQkJLmN0cmxfZmxhZ3MgPSBpZ3RrX2NtZC5jdHJsX2ZsYWdzLAorCQkJLmtleV9pZCA9IGlndGtfY21kLmtleV9pZCwKKwkJCS5zdGFfaWQgPSBpZ3RrX2NtZC5zdGFfaWQsCisJCQkucmVjZWl2ZV9zZXFfY250ID0gaWd0a19jbWQucmVjZWl2ZV9zZXFfY250CisJCX07CisKKwkJbWVtY3B5KGlndGtfY21kX3YxLmlndGssIGlndGtfY21kLmlndGssCisJCSAgICAgICBBUlJBWV9TSVpFKGlndGtfY21kX3YxLmlndGspKTsKKwkJcmV0dXJuIGl3bF9tdm1fc2VuZF9jbWRfcGR1KG12bSwgTUdNVF9NQ0FTVF9LRVksIDAsCisJCQkJCSAgICBzaXplb2YoaWd0a19jbWRfdjEpLCAmaWd0a19jbWRfdjEpOworCX0KIAlyZXR1cm4gaXdsX212bV9zZW5kX2NtZF9wZHUobXZtLCBNR01UX01DQVNUX0tFWSwgMCwKIAkJCQkgICAgc2l6ZW9mKGlndGtfY21kKSwgJmlndGtfY21kKTsKIH0KQEAgLTI1NzMsNyArMjg1NCw5IEBACiAJfQogCXN0YV9pZCA9IG12bV9zdGEtPnN0YV9pZDsKIAotCWlmIChrZXljb25mLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfQUVTX0NNQUMpIHsKKwlpZiAoa2V5Y29uZi0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDIHx8CisJICAgIGtleWNvbmYtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9CSVBfR01BQ18xMjggfHwKKwkgICAga2V5Y29uZi0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX0JJUF9HTUFDXzI1NikgewogCQlyZXQgPSBpd2xfbXZtX3NlbmRfc3RhX2lndGsobXZtLCBrZXljb25mLCBzdGFfaWQsIGZhbHNlKTsKIAkJZ290byBlbmQ7CiAJfQpAQCAtMjY1OSw3ICsyOTQyLDkgQEAKIAlJV0xfREVCVUdfV0VQKG12bSwgIm12bSByZW1vdmUgZHluYW1pYyBrZXk6IGlkeD0lZCBzdGE9JWRcbiIsCiAJCSAgICAgIGtleWNvbmYtPmtleWlkeCwgc3RhX2lkKTsKIAotCWlmIChrZXljb25mLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfQUVTX0NNQUMpCisJaWYgKGtleWNvbmYtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQyB8fAorCSAgICBrZXljb25mLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfQklQX0dNQUNfMTI4IHx8CisJICAgIGtleWNvbmYtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9CSVBfR01BQ18yNTYpCiAJCXJldHVybiBpd2xfbXZtX3NlbmRfc3RhX2lndGsobXZtLCBrZXljb25mLCBzdGFfaWQsIHRydWUpOwogCiAJaWYgKCFfX3Rlc3RfYW5kX2NsZWFyX2JpdChrZXljb25mLT5od19rZXlfaWR4LCBtdm0tPmZ3X2tleV90YWJsZSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL3N0YS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vc3RhLmgKaW5kZXggYmJjMWNhYi4uZTA2OGQ1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vc3RhLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vc3RhLmgKQEAgLTQ3Myw5ICs0NzMsMTQgQEAKIGludCBpd2xfbXZtX2FkZF9zdGEoc3RydWN0IGl3bF9tdm0gKm12bSwKIAkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKTsKLWludCBpd2xfbXZtX3VwZGF0ZV9zdGEoc3RydWN0IGl3bF9tdm0gKm12bSwKLQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKTsKKworc3RhdGljIGlubGluZSBpbnQgaXdsX212bV91cGRhdGVfc3RhKHN0cnVjdCBpd2xfbXZtICptdm0sCisJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKK3sKKwlyZXR1cm4gaXdsX212bV9zdGFfc2VuZF90b19mdyhtdm0sIHN0YSwgdHJ1ZSwgMCk7Cit9CisKIGludCBpd2xfbXZtX3JtX3N0YShzdHJ1Y3QgaXdsX212bSAqbXZtLAogCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKTsKQEAgLTU1NCw0ICs1NTksOCBAQAogdm9pZCBpd2xfbXZtX2NzYV9jbGllbnRfYWJzZW50KHN0cnVjdCBpd2xfbXZtICptdm0sIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwogdm9pZCBpd2xfbXZtX2FkZF9uZXdfZHFhX3N0cmVhbV93ayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndrKTsKIAoraW50IGl3bF9tdm1fc2NkX3F1ZXVlX3JlZGlyZWN0KHN0cnVjdCBpd2xfbXZtICptdm0sIGludCBxdWV1ZSwgaW50IHRpZCwKKwkJCSAgICAgICBpbnQgYWMsIGludCBzc24sIHVuc2lnbmVkIGludCB3ZGdfdGltZW91dCwKKwkJCSAgICAgICBib29sIGZvcmNlKTsKKwogI2VuZGlmIC8qIF9fc3RhX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vdHQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL3R0LmMKaW5kZXggNThmYzdiMy4uNjNhMDUxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vdHQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS90dC5jCkBAIC0yNDEsMTEgKzI0MSw4IEBACiAJfTsKIAl1MzIgY21kaWQ7CiAKLQlpZiAoZndfaGFzX2FwaSgmbXZtLT5mdy0+dWNvZGVfY2FwYSwgSVdMX1VDT0RFX1RMVl9BUElfV0lERV9DTURfSERSKSkKLQkJY21kaWQgPSBpd2xfY21kX2lkKENNRF9EVFNfTUVBU1VSRU1FTlRfVFJJR0dFUl9XSURFLAotCQkJCSAgIFBIWV9PUFNfR1JPVVAsIDApOwotCWVsc2UKLQkJY21kaWQgPSBDTURfRFRTX01FQVNVUkVNRU5UX1RSSUdHRVI7CisJY21kaWQgPSBpd2xfY21kX2lkKENNRF9EVFNfTUVBU1VSRU1FTlRfVFJJR0dFUl9XSURFLAorCQkJICAgUEhZX09QU19HUk9VUCwgMCk7CiAKIAlpZiAoIWZ3X2hhc19jYXBhKCZtdm0tPmZ3LT51Y29kZV9jYXBhLAogCQkJIElXTF9VQ09ERV9UTFZfQ0FQQV9FWFRFTkRFRF9EVFNfTUVBU1VSRSkpCkBAIC0yNjEsOSArMjU4LDYgQEAKIAkJCQkJICAgIERUU19NRUFTVVJFTUVOVF9OT1RJRl9XSURFKSB9OwogCWludCByZXQ7CiAKLQlpZiAoIWZ3X2hhc19hcGkoJm12bS0+ZnctPnVjb2RlX2NhcGEsIElXTF9VQ09ERV9UTFZfQVBJX1dJREVfQ01EX0hEUikpCi0JCXRlbXBfbm90aWZbMF0gPSBEVFNfTUVBU1VSRU1FTlRfTk9USUZJQ0FUSU9OOwotCiAJbG9ja2RlcF9hc3NlcnRfaGVsZCgmbXZtLT5tdXRleCk7CiAKIAlpd2xfaW5pdF9ub3RpZmljYXRpb25fd2FpdCgmbXZtLT5ub3RpZl93YWl0LCAmd2FpdF90ZW1wX25vdGlmLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vdHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL3R4LmMKaW5kZXggYzY1ODVhYi4uNjY5NTdhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vdHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS90eC5jCkBAIC0zNDYsNyArMzQ2LDcgQEAKIAogCXJhdGVfaWR4ID0gaW5mby0+Y29udHJvbC5yYXRlc1swXS5pZHg7CiAJLyogaWYgdGhlIHJhdGUgaXNuJ3QgYSB3ZWxsIGtub3duIGxlZ2FjeSByYXRlLCB0YWtlIHRoZSBsb3dlc3Qgb25lICovCi0JaWYgKHJhdGVfaWR4IDwgMCB8fCByYXRlX2lkeCA+IElXTF9SQVRFX0NPVU5UX0xFR0FDWSkKKwlpZiAocmF0ZV9pZHggPCAwIHx8IHJhdGVfaWR4ID49IElXTF9SQVRFX0NPVU5UX0xFR0FDWSkKIAkJcmF0ZV9pZHggPSByYXRlX2xvd2VzdF9pbmRleCgKIAkJCQkmbXZtLT5udm1fZGF0YS0+YmFuZHNbaW5mby0+YmFuZF0sIHN0YSk7CiAKQEAgLTQ0MSw3ICs0NDEsNyBAQAogCQkgKiBvbmUuCiAJCSAqIE5lZWQgdG8gaGFuZGxlIHRoaXMuCiAJCSAqLwotCQl0eF9jbWQtPnNlY19jdGwgfD0gVFhfQ01EX1NFQ19HQ01QIHwgVENfQ01EX1NFQ19LRVlfRlJPTV9UQUJMRTsKKwkJdHhfY21kLT5zZWNfY3RsIHw9IFRYX0NNRF9TRUNfR0NNUCB8IFRYX0NNRF9TRUNfS0VZX0ZST01fVEFCTEU7CiAJCXR4X2NtZC0+a2V5WzBdID0ga2V5Y29uZi0+aHdfa2V5X2lkeDsKIAkJaXdsX212bV9zZXRfdHhfY21kX3BuKGluZm8sIGNyeXB0b19oZHIpOwogCQlicmVhazsKQEAgLTQ5MCwxNiArNDkwLDM0IEBACiBzdGF0aWMgaW50IGl3bF9tdm1fZ2V0X2N0cmxfdmlmX3F1ZXVlKHN0cnVjdCBpd2xfbXZtICptdm0sCiAJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLCBfX2xlMTYgZmMpCiB7Ci0JaWYgKGl3bF9tdm1faXNfZHFhX3N1cHBvcnRlZChtdm0pKSB7Ci0JCWlmIChpbmZvLT5jb250cm9sLnZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCAmJgotCQkgICAgaWVlZTgwMjExX2lzX3Byb2JlX3Jlc3AoZmMpKQotCQkJcmV0dXJuIElXTF9NVk1fRFFBX0FQX1BST0JFX1JFU1BfUVVFVUU7Ci0JCWVsc2UgaWYgKGllZWU4MDIxMV9pc19tZ210KGZjKSAmJgotCQkJIGluZm8tPmNvbnRyb2wudmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0UpCi0JCQlyZXR1cm4gSVdMX01WTV9EUUFfUDJQX0RFVklDRV9RVUVVRTsKLQl9CisJaWYgKCFpd2xfbXZtX2lzX2RxYV9zdXBwb3J0ZWQobXZtKSkKKwkJcmV0dXJuIGluZm8tPmh3X3F1ZXVlOwogCi0JcmV0dXJuIGluZm8tPmh3X3F1ZXVlOworCXN3aXRjaCAoaW5mby0+Y29udHJvbC52aWYtPnR5cGUpIHsKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgorCQkvKgorCQkgKiBoYW5kbGUgbGVnYWN5IGhvc3RhcGQgYXMgd2VsbCwgd2hlcmUgc3RhdGlvbiBtYXkgYmUgYWRkZWQKKwkJICogb25seSBhZnRlciBhc3NvYy4KKwkJICovCisJCWlmIChpZWVlODAyMTFfaXNfcHJvYmVfcmVzcChmYykgfHwgaWVlZTgwMjExX2lzX2F1dGgoZmMpKQorCQkJcmV0dXJuIElXTF9NVk1fRFFBX0FQX1BST0JFX1JFU1BfUVVFVUU7CisJCWlmIChpbmZvLT5od19xdWV1ZSA9PSBpbmZvLT5jb250cm9sLnZpZi0+Y2FiX3F1ZXVlKQorCQkJcmV0dXJuIGluZm8tPmh3X3F1ZXVlOworCisJCVdBUk5fT05fT05DRSgxKTsKKwkJcmV0dXJuIElXTF9NVk1fRFFBX0FQX1BST0JFX1JFU1BfUVVFVUU7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFOgorCQlpZiAoaWVlZTgwMjExX2lzX21nbXQoZmMpKQorCQkJcmV0dXJuIElXTF9NVk1fRFFBX1AyUF9ERVZJQ0VfUVVFVUU7CisJCWlmIChpbmZvLT5od19xdWV1ZSA9PSBpbmZvLT5jb250cm9sLnZpZi0+Y2FiX3F1ZXVlKQorCQkJcmV0dXJuIGluZm8tPmh3X3F1ZXVlOworCisJCVdBUk5fT05fT05DRSgxKTsKKwkJcmV0dXJuIElXTF9NVk1fRFFBX1AyUF9ERVZJQ0VfUVVFVUU7CisJZGVmYXVsdDoKKwkJV0FSTl9PTkNFKDEsICJOb3QgYSBjdHJsIHZpZiwgbm8gYXZhaWxhYmxlIHF1ZXVlXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KIH0KIAogaW50IGl3bF9tdm1fdHhfc2tiX25vbl9zdGEoc3RydWN0IGl3bF9tdm0gKm12bSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTUxMyw2ICs1MzEsMTUgQEAKIAlpbnQgaGRybGVuID0gaWVlZTgwMjExX2hkcmxlbihoZHItPmZyYW1lX2NvbnRyb2wpOwogCWludCBxdWV1ZTsKIAorCS8qIElXTF9NVk1fT0ZGQ0hBTk5FTF9RVUVVRSBpcyB1c2VkIGZvciBST0MgcGFja2V0cyB0aGF0IGNhbiBiZSB1c2VkCisJICogaW4gMiBkaWZmZXJlbnQgdHlwZXMgb2YgdmlmcywgUDJQICYgU1RBVElPTi4gUDJQIHVzZXMgdGhlIG9mZmNoYW5uZWwKKwkgKiBxdWV1ZS4gU1RBVElPTiAoSFMyLjApIHVzZXMgdGhlIGF1eGlsaWFyeSBjb250ZXh0IG9mIHRoZSBGVywKKwkgKiBhbmQgaGVuY2UgbmVlZHMgdG8gYmUgc2VudCBvbiB0aGUgYXV4IHF1ZXVlCisJICovCisJaWYgKElFRUU4MDIxMV9TS0JfQ0Ioc2tiKS0+aHdfcXVldWUgPT0gSVdMX01WTV9PRkZDSEFOTkVMX1FVRVVFICYmCisJICAgIHNrYl9pbmZvLT5jb250cm9sLnZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQorCQlJRUVFODAyMTFfU0tCX0NCKHNrYiktPmh3X3F1ZXVlID0gbXZtLT5hdXhfcXVldWU7CisKIAltZW1jcHkoJmluZm8sIHNrYi0+Y2IsIHNpemVvZihpbmZvKSk7CiAKIAlpZiAoV0FSTl9PTl9PTkNFKGluZm8uZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKSkKQEAgLTUyNiwxNiArNTUzLDYgQEAKIAkvKiBUaGlzIGhvbGRzIHRoZSBhbXNkdSBoZWFkZXJzIGxlbmd0aCAqLwogCXNrYl9pbmZvLT5kcml2ZXJfZGF0YVswXSA9ICh2b2lkICopKHVpbnRwdHJfdCkwOwogCi0JLyoKLQkgKiBJV0xfTVZNX09GRkNIQU5ORUxfUVVFVUUgaXMgdXNlZCBmb3IgUk9DIHBhY2tldHMgdGhhdCBjYW4gYmUgdXNlZAotCSAqIGluIDIgZGlmZmVyZW50IHR5cGVzIG9mIHZpZnMsIFAyUCAmIFNUQVRJT04uIFAyUCB1c2VzIHRoZSBvZmZjaGFubmVsCi0JICogcXVldWUuIFNUQVRJT04gKEhTMi4wKSB1c2VzIHRoZSBhdXhpbGlhcnkgY29udGV4dCBvZiB0aGUgRlcsCi0JICogYW5kIGhlbmNlIG5lZWRzIHRvIGJlIHNlbnQgb24gdGhlIGF1eCBxdWV1ZQotCSAqLwotCWlmIChJRUVFODAyMTFfU0tCX0NCKHNrYiktPmh3X3F1ZXVlID09IElXTF9NVk1fT0ZGQ0hBTk5FTF9RVUVVRSAmJgotCSAgICBpbmZvLmNvbnRyb2wudmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCi0JCUlFRUU4MDIxMV9TS0JfQ0Ioc2tiKS0+aHdfcXVldWUgPSBtdm0tPmF1eF9xdWV1ZTsKLQogCXF1ZXVlID0gaW5mby5od19xdWV1ZTsKIAogCS8qCkBAIC01NjAsNiArNTc3LDkgQEAKIAkJCXN0YV9pZCA9IG12bXZpZi0+YmNhc3Rfc3RhLnN0YV9pZDsKIAkJCXF1ZXVlID0gaXdsX212bV9nZXRfY3RybF92aWZfcXVldWUobXZtLCAmaW5mbywKIAkJCQkJCQkgICBoZHItPmZyYW1lX2NvbnRyb2wpOworCQkJaWYgKHF1ZXVlIDwgMCkKKwkJCQlyZXR1cm4gLTE7CisKIAkJfSBlbHNlIGlmIChpbmZvLmNvbnRyb2wudmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYKIAkJCSAgIGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpKSB7CiAJCQl1OCBhcF9zdGFfaWQgPSBBQ0NFU1NfT05DRShtdm12aWYtPmFwX3N0YV9pZCk7CkBAIC04MzgsNiArODU4LDIyIEBACiAJfQogfQogCisvKiBDaGVjayBpZiB0aGVyZSBhcmUgYW55IHRpbWVkLW91dCBUSURzIG9uIGEgZ2l2ZW4gc2hhcmVkIFRYUSAqLworc3RhdGljIGJvb2wgaXdsX212bV90eHFfc2hvdWxkX3VwZGF0ZShzdHJ1Y3QgaXdsX212bSAqbXZtLCBpbnQgdHhxX2lkKQoreworCXVuc2lnbmVkIGxvbmcgcXVldWVfdGlkX2JpdG1hcCA9IG12bS0+cXVldWVfaW5mb1t0eHFfaWRdLnRpZF9iaXRtYXA7CisJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOworCWludCB0aWQ7CisKKwlmb3JfZWFjaF9zZXRfYml0KHRpZCwgJnF1ZXVlX3RpZF9iaXRtYXAsIElXTF9NQVhfVElEX0NPVU5UICsgMSkgeworCQlpZiAodGltZV9iZWZvcmUobXZtLT5xdWV1ZV9pbmZvW3R4cV9pZF0ubGFzdF9mcmFtZV90aW1lW3RpZF0gKworCQkJCUlXTF9NVk1fRFFBX1FVRVVFX1RJTUVPVVQsIG5vdykpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKIC8qCiAgKiBTZXRzIHRoZSBmaWVsZHMgaW4gdGhlIFR4IGNtZCB0aGF0IGFyZSBjcnlwdG8gcmVsYXRlZAogICovCkBAIC05MDQsOSArOTQwLDEzIEBACiAJCXRpZCA9IElXTF9NQVhfVElEX0NPVU5UOwogCX0KIAotCWlmIChpd2xfbXZtX2lzX2RxYV9zdXBwb3J0ZWQobXZtKSkKKwlpZiAoaXdsX212bV9pc19kcWFfc3VwcG9ydGVkKG12bSkpIHsKIAkJdHhxX2lkID0gbXZtc3RhLT50aWRfZGF0YVt0aWRdLnR4cV9pZDsKIAorCQlpZiAoaWVlZTgwMjExX2lzX21nbXQoZmMpKQorCQkJdHhfY21kLT50aWRfdHNwZWMgPSBJV0xfVElEX05PTl9RT1M7CisJfQorCiAJLyogQ29weSBNQUMgaGVhZGVyIGZyb20gc2tiIGludG8gY29tbWFuZCBidWZmZXIgKi8KIAltZW1jcHkodHhfY21kLT5oZHIsIGhkciwgaGRybGVuKTsKIApAQCAtOTQwLDcgKzk4MCw2IEBACiAJCQlpd2xfdHJhbnNfZnJlZV90eF9jbWQobXZtLT50cmFucywgZGV2X2NtZCk7CiAJCQlzcGluX3VubG9jaygmbXZtc3RhLT5sb2NrKTsKIAkJCXJldHVybiAwOwotCiAJCX0KIAogCQkvKiBJZiB3ZSBhcmUgaGVyZSAtIFRYUSBleGlzdHMgYW5kIG5lZWRzIHRvIGJlIHJlLWFjdGl2YXRlZCAqLwpAQCAtOTUzLDggKzk5MiwyNSBAQAogCQkJCSAgICB0eHFfaWQpOwogCX0KIAotCS8qIEtlZXAgdHJhY2sgb2YgdGhlIHRpbWUgb2YgdGhlIGxhc3QgZnJhbWUgZm9yIHRoaXMgUkEvVElEICovCi0JbXZtLT5xdWV1ZV9pbmZvW3R4cV9pZF0ubGFzdF9mcmFtZV90aW1lW3RpZF0gPSBqaWZmaWVzOworCWlmIChpd2xfbXZtX2lzX2RxYV9zdXBwb3J0ZWQobXZtKSkgeworCQkvKiBLZWVwIHRyYWNrIG9mIHRoZSB0aW1lIG9mIHRoZSBsYXN0IGZyYW1lIGZvciB0aGlzIFJBL1RJRCAqLworCQltdm0tPnF1ZXVlX2luZm9bdHhxX2lkXS5sYXN0X2ZyYW1lX3RpbWVbdGlkXSA9IGppZmZpZXM7CisKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSB0aW1lZC1vdXQgVElEcyAtIHNjaGVkdWxlIHRoZSB3b3JrZXIgdGhhdCB3aWxsCisJCSAqIHJlY29uZmlnIHRoZSBxdWV1ZXMgYW5kIHVwZGF0ZSB0aGVtCisJCSAqCisJCSAqIE5vdGUgdGhhdCB0aGUgbXZtLT5xdWV1ZV9pbmZvX2xvY2sgaXNuJ3QgYmVpbmcgdGFrZW4gaGVyZSBpbgorCQkgKiBvcmRlciB0byBub3Qgc2VyaWFsaXplIHRoZSBUWCBmbG93LiBUaGlzIGlzbid0IGRhbmdlcm91cworCQkgKiBiZWNhdXNlIHNjaGVkdWxpbmcgbXZtLT5hZGRfc3RyZWFtX3drIGNhbid0IHJ1aW4gdGhlIHN0YXRlLAorCQkgKiBhbmQgaWYgd2UgRE9OJ1Qgc2NoZWR1bGUgaXQgZHVlIHRvIHNvbWUgcmFjZSBjb25kaXRpb24gdGhlbgorCQkgKiBuZXh0IFRYIHdlIGdldCBoZXJlIHdlIHdpbGwuCisJCSAqLworCQlpZiAodW5saWtlbHkobXZtLT5xdWV1ZV9pbmZvW3R4cV9pZF0uc3RhdHVzID09CisJCQkgICAgIElXTF9NVk1fUVVFVUVfU0hBUkVEICYmCisJCQkgICAgIGl3bF9tdm1fdHhxX3Nob3VsZF91cGRhdGUobXZtLCB0eHFfaWQpKSkKKwkJCXNjaGVkdWxlX3dvcmsoJm12bS0+YWRkX3N0cmVhbV93ayk7CisJfQogCiAJSVdMX0RFQlVHX1RYKG12bSwgIlRYIHRvIFslZHwlZF0gUTolZCAtIHNlcTogMHgleFxuIiwgbXZtc3RhLT5zdGFfaWQsCiAJCSAgICAgdGlkLCB0eHFfaWQsIElFRUU4MDIxMV9TRVFfVE9fU04oc2VxX251bWJlcikpOwpAQCAtMTA2OCw5ICsxMTI0LDEzIEBACiAJCUlXTF9ERUJVR19UWF9RVUVVRVMobXZtLAogCQkJCSAgICAiQ2FuIGNvbnRpbnVlIERFTEJBIGZsb3cgc3NuID0gbmV4dF9yZWNsID0gJWRcbiIsCiAJCQkJICAgIHRpZF9kYXRhLT5uZXh0X3JlY2xhaW1lZCk7Ci0JCWl3bF9tdm1fZGlzYWJsZV90eHEobXZtLCB0aWRfZGF0YS0+dHhxX2lkLAotCQkJCSAgICB2aWYtPmh3X3F1ZXVlW3RpZF90b19tYWM4MDIxMV9hY1t0aWRdXSwgdGlkLAotCQkJCSAgICBDTURfQVNZTkMpOworCQlpZiAoIWl3bF9tdm1faXNfZHFhX3N1cHBvcnRlZChtdm0pKSB7CisJCQl1OCBtYWM4MDIxMV9hYyA9IHRpZF90b19tYWM4MDIxMV9hY1t0aWRdOworCisJCQlpd2xfbXZtX2Rpc2FibGVfdHhxKG12bSwgdGlkX2RhdGEtPnR4cV9pZCwKKwkJCQkJICAgIHZpZi0+aHdfcXVldWVbbWFjODAyMTFfYWNdLCB0aWQsCisJCQkJCSAgICBDTURfQVNZTkMpOworCQl9CiAJCXRpZF9kYXRhLT5zdGF0ZSA9IElXTF9BR0dfT0ZGOwogCQlpZWVlODAyMTFfc3RvcF90eF9iYV9jYl9pcnFzYWZlKHZpZiwgc3RhLT5hZGRyLCB0aWQpOwogCQlicmVhazsKQEAgLTE1NDgsNDEgKzE2MDgsMTYgQEAKIAkJaXdsX212bV9yeF90eF9jbWRfYWdnKG12bSwgcGt0KTsKIH0KIAotc3RhdGljIHZvaWQgaXdsX212bV90eF9pbmZvX2Zyb21fYmFfbm90aWYoc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLAotCQkJCQkgIHN0cnVjdCBpd2xfbXZtX2JhX25vdGlmICpiYV9ub3RpZiwKLQkJCQkJICBzdHJ1Y3QgaXdsX212bV90aWRfZGF0YSAqdGlkX2RhdGEpCitzdGF0aWMgdm9pZCBpd2xfbXZtX3R4X3JlY2xhaW0oc3RydWN0IGl3bF9tdm0gKm12bSwgaW50IHN0YV9pZCwgaW50IHRpZCwKKwkJCSAgICAgICBpbnQgdHhxLCBpbnQgaW5kZXgsCisJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICpiYV9pbmZvLCB1MzIgcmF0ZSkKIHsKLQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfU1RBVF9BTVBEVTsKLQlpbmZvLT5zdGF0dXMuYW1wZHVfYWNrX2xlbiA9IGJhX25vdGlmLT50eGVkXzJfZG9uZTsKLQlpbmZvLT5zdGF0dXMuYW1wZHVfbGVuID0gYmFfbm90aWYtPnR4ZWQ7Ci0JaXdsX212bV9od3JhdGVfdG9fdHhfc3RhdHVzKHRpZF9kYXRhLT5yYXRlX25fZmxhZ3MsCi0JCQkJICAgIGluZm8pOwotCS8qIFRPRE86IG5vdCBhY2NvdW50ZWQgaWYgdGhlIHdob2xlIEEtTVBEVSBmYWlsZWQgKi8KLQlpbmZvLT5zdGF0dXMudHhfdGltZSA9IHRpZF9kYXRhLT50eF90aW1lOwotCWluZm8tPnN0YXR1cy5zdGF0dXNfZHJpdmVyX2RhdGFbMF0gPQotCQkodm9pZCAqKSh1aW50cHRyX3QpYmFfbm90aWYtPnJlZHVjZWRfdHhwOwotCWluZm8tPnN0YXR1cy5zdGF0dXNfZHJpdmVyX2RhdGFbMV0gPQotCQkodm9pZCAqKSh1aW50cHRyX3QpdGlkX2RhdGEtPnJhdGVfbl9mbGFnczsKLX0KLQotdm9pZCBpd2xfbXZtX3J4X2JhX25vdGlmKHN0cnVjdCBpd2xfbXZtICptdm0sIHN0cnVjdCBpd2xfcnhfY21kX2J1ZmZlciAqcnhiKQotewotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXN0cnVjdCBpd2xfbXZtX2JhX25vdGlmICpiYV9ub3RpZiA9ICh2b2lkICopcGt0LT5kYXRhOwogCXN0cnVjdCBza19idWZmX2hlYWQgcmVjbGFpbWVkX3NrYnM7CiAJc3RydWN0IGl3bF9tdm1fdGlkX2RhdGEgKnRpZF9kYXRhOwogCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7CiAJc3RydWN0IGl3bF9tdm1fc3RhICptdm1zdGE7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlpbnQgc3RhX2lkLCB0aWQsIGZyZWVkOwotCS8qICJmbG93IiBjb3JyZXNwb25kcyB0byBUeCBxdWV1ZSAqLwotCXUxNiBzY2RfZmxvdyA9IGxlMTZfdG9fY3B1KGJhX25vdGlmLT5zY2RfZmxvdyk7Ci0JLyogInNzbiIgaXMgc3RhcnQgb2YgYmxvY2stYWNrIFR4IHdpbmRvdywgY29ycmVzcG9uZHMgdG8gaW5kZXgKLQkgKiAoaW4gVHggcXVldWUncyBjaXJjdWxhciBidWZmZXIpIG9mIGZpcnN0IFRGRC9mcmFtZSBpbiB3aW5kb3cgKi8KLQl1MTYgYmFfcmVzcF9zY2Rfc3NuID0gbGUxNl90b19jcHUoYmFfbm90aWYtPnNjZF9zc24pOwotCi0Jc3RhX2lkID0gYmFfbm90aWYtPnN0YV9pZDsKLQl0aWQgPSBiYV9ub3RpZi0+dGlkOworCWludCBmcmVlZDsKIAogCWlmIChXQVJOX09OQ0Uoc3RhX2lkID49IElXTF9NVk1fU1RBVElPTl9DT1VOVCB8fAogCQkgICAgICB0aWQgPj0gSVdMX01BWF9USURfQ09VTlQsCkBAIC0xNjAyLDEwICsxNjM3LDEwIEBACiAJbXZtc3RhID0gaXdsX212bV9zdGFfZnJvbV9tYWM4MDIxMShzdGEpOwogCXRpZF9kYXRhID0gJm12bXN0YS0+dGlkX2RhdGFbdGlkXTsKIAotCWlmICh0aWRfZGF0YS0+dHhxX2lkICE9IHNjZF9mbG93KSB7CisJaWYgKHRpZF9kYXRhLT50eHFfaWQgIT0gdHhxKSB7CiAJCUlXTF9FUlIobXZtLAotCQkJImludmFsaWQgQkEgbm90aWZpY2F0aW9uOiBRICVkLCB0aWQgJWQsIGZsb3cgJWRcbiIsCi0JCQl0aWRfZGF0YS0+dHhxX2lkLCB0aWQsIHNjZF9mbG93KTsKKwkJCSJpbnZhbGlkIEJBIG5vdGlmaWNhdGlvbjogUSAlZCwgdGlkICVkXG4iLAorCQkJdGlkX2RhdGEtPnR4cV9pZCwgdGlkKTsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybjsKIAl9CkBAIC0xNjE5LDI3ICsxNjU0LDE0IEBACiAJICogYmxvY2stYWNrIHdpbmRvdyAod2UgYXNzdW1lIHRoYXQgdGhleSd2ZSBiZWVuIHN1Y2Nlc3NmdWxseQogCSAqIHRyYW5zbWl0dGVkIC4uLiBpZiBub3QsIGl0J3MgdG9vIGxhdGUgYW55d2F5KS4KIAkgKi8KLQlpd2xfdHJhbnNfcmVjbGFpbShtdm0tPnRyYW5zLCBzY2RfZmxvdywgYmFfcmVzcF9zY2Rfc3NuLAotCQkJICAmcmVjbGFpbWVkX3NrYnMpOworCWl3bF90cmFuc19yZWNsYWltKG12bS0+dHJhbnMsIHR4cSwgaW5kZXgsICZyZWNsYWltZWRfc2ticyk7CiAKLQlJV0xfREVCVUdfVFhfUkVQTFkobXZtLAotCQkJICAgIkJBX05PVElGSUNBVElPTiBSZWNlaXZlZCBmcm9tICVwTSwgc3RhX2lkID0gJWRcbiIsCi0JCQkgICAodTggKikmYmFfbm90aWYtPnN0YV9hZGRyX2xvMzIsCi0JCQkgICBiYV9ub3RpZi0+c3RhX2lkKTsKLQlJV0xfREVCVUdfVFhfUkVQTFkobXZtLAotCQkJICAgIlRJRCA9ICVkLCBTZXFDdGwgPSAlZCwgYml0bWFwID0gMHglbGx4LCBzY2RfZmxvdyA9ICVkLCBzY2Rfc3NuID0gJWQgc2VudDolZCwgYWNrZWQ6JWRcbiIsCi0JCQkgICBiYV9ub3RpZi0+dGlkLCBsZTE2X3RvX2NwdShiYV9ub3RpZi0+c2VxX2N0bCksCi0JCQkgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGJhX25vdGlmLT5iaXRtYXApLAotCQkJICAgc2NkX2Zsb3csIGJhX3Jlc3Bfc2NkX3NzbiwgYmFfbm90aWYtPnR4ZWQsCi0JCQkgICBiYV9ub3RpZi0+dHhlZF8yX2RvbmUpOwotCi0JSVdMX0RFQlVHX1RYX1JFUExZKG12bSwgInJlZHVjZWQgdHhwIGZyb20gYmEgbm90aWYgJWRcbiIsCi0JCQkgICBiYV9ub3RpZi0+cmVkdWNlZF90eHApOwotCXRpZF9kYXRhLT5uZXh0X3JlY2xhaW1lZCA9IGJhX3Jlc3Bfc2NkX3NzbjsKKwl0aWRfZGF0YS0+bmV4dF9yZWNsYWltZWQgPSBpbmRleDsKIAogCWl3bF9tdm1fY2hlY2tfcmF0aWRfZW1wdHkobXZtLCBzdGEsIHRpZCk7CiAKIAlmcmVlZCA9IDA7CisJYmFfaW5mby0+c3RhdHVzLnN0YXR1c19kcml2ZXJfZGF0YVsxXSA9ICh2b2lkICopKHVpbnRwdHJfdClyYXRlOwogCiAJc2tiX3F1ZXVlX3dhbGsoJnJlY2xhaW1lZF9za2JzLCBza2IpIHsKIAkJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9ICh2b2lkICopc2tiLT5kYXRhOwpAQCAtMTY2MSw4ICsxNjgzLDEyIEBACiAKIAkJLyogdGhpcyBpcyB0aGUgZmlyc3Qgc2tiIHdlIGRlbGl2ZXIgaW4gdGhpcyBiYXRjaCAqLwogCQkvKiBwdXQgdGhlIHJhdGUgc2NhbGluZyBkYXRhIHRoZXJlICovCi0JCWlmIChmcmVlZCA9PSAxKQotCQkJaXdsX212bV90eF9pbmZvX2Zyb21fYmFfbm90aWYoaW5mbywgYmFfbm90aWYsIHRpZF9kYXRhKTsKKwkJaWYgKGZyZWVkID09IDEpIHsKKwkJCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9TVEFUX0FNUERVOworCQkJbWVtY3B5KCZpbmZvLT5zdGF0dXMsICZiYV9pbmZvLT5zdGF0dXMsCisJCQkgICAgICAgc2l6ZW9mKGJhX2luZm8tPnN0YXR1cykpOworCQkJaXdsX212bV9od3JhdGVfdG9fdHhfc3RhdHVzKHJhdGUsIGluZm8pOworCQl9CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgoJm12bXN0YS0+bG9jayk7CkBAIC0xNjcyLDcgKzE2OTgsNiBAQAogCSAqIFN0aWxsIGl0J3MgaW1wb3J0YW50IHRvIHVwZGF0ZSBSUyBhYm91dCBzZW50IHZzLiBhY2tlZC4KIAkgKi8KIAlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZyZWNsYWltZWRfc2ticykpIHsKLQkJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvIGJhX2luZm8gPSB7fTsKIAkJc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4X2NvbmYgKmNoYW5jdHhfY29uZiA9IE5VTEw7CiAKIAkJaWYgKG12bXN0YS0+dmlmKQpAQCAtMTY4MiwxMSArMTcwNywxMSBAQAogCQlpZiAoV0FSTl9PTl9PTkNFKCFjaGFuY3R4X2NvbmYpKQogCQkJZ290byBvdXQ7CiAKLQkJYmFfaW5mby5iYW5kID0gY2hhbmN0eF9jb25mLT5kZWYuY2hhbi0+YmFuZDsKLQkJaXdsX212bV90eF9pbmZvX2Zyb21fYmFfbm90aWYoJmJhX2luZm8sIGJhX25vdGlmLCB0aWRfZGF0YSk7CisJCWJhX2luZm8tPmJhbmQgPSBjaGFuY3R4X2NvbmYtPmRlZi5jaGFuLT5iYW5kOworCQlpd2xfbXZtX2h3cmF0ZV90b190eF9zdGF0dXMocmF0ZSwgYmFfaW5mbyk7CiAKIAkJSVdMX0RFQlVHX1RYX1JFUExZKG12bSwgIk5vIHJlY2xhaW0uIFVwZGF0ZSBycyBkaXJlY3RseVxuIik7Ci0JCWl3bF9tdm1fcnNfdHhfc3RhdHVzKG12bSwgc3RhLCB0aWQsICZiYV9pbmZvLCBmYWxzZSk7CisJCWl3bF9tdm1fcnNfdHhfc3RhdHVzKG12bSwgc3RhLCB0aWQsIGJhX2luZm8sIGZhbHNlKTsKIAl9CiAKIG91dDoKQEAgLTE2OTgsNiArMTcyMyw5MiBAQAogCX0KIH0KIAordm9pZCBpd2xfbXZtX3J4X2JhX25vdGlmKHN0cnVjdCBpd2xfbXZtICptdm0sIHN0cnVjdCBpd2xfcnhfY21kX2J1ZmZlciAqcnhiKQoreworCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCWludCBzdGFfaWQsIHRpZCwgdHhxLCBpbmRleDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gYmFfaW5mbyA9IHt9OworCXN0cnVjdCBpd2xfbXZtX2JhX25vdGlmICpiYV9ub3RpZjsKKwlzdHJ1Y3QgaXdsX212bV90aWRfZGF0YSAqdGlkX2RhdGE7CisJc3RydWN0IGl3bF9tdm1fc3RhICptdm1zdGE7CisKKwlpZiAoaXdsX212bV9oYXNfbmV3X3R4X2FwaShtdm0pKSB7CisJCXN0cnVjdCBpd2xfbXZtX2NvbXByZXNzZWRfYmFfbm90aWYgKmJhX3JlcyA9CisJCQkodm9pZCAqKXBrdC0+ZGF0YTsKKworCQlzdGFfaWQgPSBiYV9yZXMtPnN0YV9pZDsKKwkJYmFfaW5mby5zdGF0dXMuYW1wZHVfYWNrX2xlbiA9ICh1OClsZTE2X3RvX2NwdShiYV9yZXMtPmRvbmUpOworCQliYV9pbmZvLnN0YXR1cy5hbXBkdV9sZW4gPSAodTgpbGUxNl90b19jcHUoYmFfcmVzLT50eGVkKTsKKwkJYmFfaW5mby5zdGF0dXMudHhfdGltZSA9CisJCQkodTE2KWxlMzJfdG9fY3B1KGJhX3Jlcy0+d2lyZWxlc3NfdGltZSk7CisJCWJhX2luZm8uc3RhdHVzLnN0YXR1c19kcml2ZXJfZGF0YVswXSA9CisJCQkodm9pZCAqKSh1aW50cHRyX3QpYmFfcmVzLT5yZWR1Y2VkX3R4cDsKKworCQkvKgorCQkgKiBUT0RPOgorCQkgKiBXaGVuIHN1cHBvcnRpbmcgbXVsdGkgVElEIGFnZ3JlZ2F0aW9ucyAtIHdlIG5lZWQgdG8gbW92ZQorCQkgKiBuZXh0X3JlY2xhaW1lZCB0byBiZSBwZXIgVFhRIGFuZCBub3QgcGVyIFRJRCBvciBoYW5kbGUgaXQKKwkJICogaW4gYSBkaWZmZXJlbnQgd2F5LgorCQkgKiBUaGlzIHdpbGwgZ28gdG9nZXRoZXIgd2l0aCBTTiBhbmQgQWRkQkEgb2ZmbG9hZCBhbmQgY2Fubm90CisJCSAqIGJlIGhhbmRsZWQgcHJvcGVybHkgZm9yIG5vdy4KKwkJICovCisJCVdBUk5fT04obGUxNl90b19jcHUoYmFfcmVzLT50ZmRfY250KSAhPSAxKTsKKwkJaXdsX212bV90eF9yZWNsYWltKG12bSwgc3RhX2lkLCBiYV9yZXMtPnJhX3RpZFswXS50aWQsCisJCQkJICAgKGludCliYV9yZXMtPnRmZFswXS5xX251bSwKKwkJCQkgICBsZTE2X3RvX2NwdShiYV9yZXMtPnRmZFswXS50ZmRfaW5kZXgpLAorCQkJCSAgICZiYV9pbmZvLCBsZTMyX3RvX2NwdShiYV9yZXMtPnR4X3JhdGUpKTsKKworCQlJV0xfREVCVUdfVFhfUkVQTFkobXZtLAorCQkJCSAgICJCQV9OT1RJRklDQVRJT04gUmVjZWl2ZWQgZnJvbSBzdGFfaWQgPSAlZCwgZmxhZ3MgJXgsIHNlbnQ6JWQsIGFja2VkOiVkXG4iLAorCQkJCSAgIHN0YV9pZCwgbGUzMl90b19jcHUoYmFfcmVzLT5mbGFncyksCisJCQkJICAgbGUxNl90b19jcHUoYmFfcmVzLT50eGVkKSwKKwkJCQkgICBsZTE2X3RvX2NwdShiYV9yZXMtPmRvbmUpKTsKKwkJcmV0dXJuOworCX0KKworCWJhX25vdGlmID0gKHZvaWQgKilwa3QtPmRhdGE7CisJc3RhX2lkID0gYmFfbm90aWYtPnN0YV9pZDsKKwl0aWQgPSBiYV9ub3RpZi0+dGlkOworCS8qICJmbG93IiBjb3JyZXNwb25kcyB0byBUeCBxdWV1ZSAqLworCXR4cSA9IGxlMTZfdG9fY3B1KGJhX25vdGlmLT5zY2RfZmxvdyk7CisJLyogInNzbiIgaXMgc3RhcnQgb2YgYmxvY2stYWNrIFR4IHdpbmRvdywgY29ycmVzcG9uZHMgdG8gaW5kZXgKKwkgKiAoaW4gVHggcXVldWUncyBjaXJjdWxhciBidWZmZXIpIG9mIGZpcnN0IFRGRC9mcmFtZSBpbiB3aW5kb3cgKi8KKwlpbmRleCA9IGxlMTZfdG9fY3B1KGJhX25vdGlmLT5zY2Rfc3NuKTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwltdm1zdGEgPSBpd2xfbXZtX3N0YV9mcm9tX3N0YWlkX3JjdShtdm0sIHN0YV9pZCk7CisJaWYgKFdBUk5fT05fT05DRSghbXZtc3RhKSkgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJcmV0dXJuOworCX0KKworCXRpZF9kYXRhID0gJm12bXN0YS0+dGlkX2RhdGFbdGlkXTsKKworCWJhX2luZm8uc3RhdHVzLmFtcGR1X2Fja19sZW4gPSBiYV9ub3RpZi0+dHhlZF8yX2RvbmU7CisJYmFfaW5mby5zdGF0dXMuYW1wZHVfbGVuID0gYmFfbm90aWYtPnR4ZWQ7CisJYmFfaW5mby5zdGF0dXMudHhfdGltZSA9IHRpZF9kYXRhLT50eF90aW1lOworCWJhX2luZm8uc3RhdHVzLnN0YXR1c19kcml2ZXJfZGF0YVswXSA9CisJCSh2b2lkICopKHVpbnRwdHJfdCliYV9ub3RpZi0+cmVkdWNlZF90eHA7CisKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCWl3bF9tdm1fdHhfcmVjbGFpbShtdm0sIHN0YV9pZCwgdGlkLCB0eHEsIGluZGV4LCAmYmFfaW5mbywKKwkJCSAgIHRpZF9kYXRhLT5yYXRlX25fZmxhZ3MpOworCisJSVdMX0RFQlVHX1RYX1JFUExZKG12bSwKKwkJCSAgICJCQV9OT1RJRklDQVRJT04gUmVjZWl2ZWQgZnJvbSAlcE0sIHN0YV9pZCA9ICVkXG4iLAorCQkJICAgKHU4ICopJmJhX25vdGlmLT5zdGFfYWRkcl9sbzMyLCBiYV9ub3RpZi0+c3RhX2lkKTsKKworCUlXTF9ERUJVR19UWF9SRVBMWShtdm0sCisJCQkgICAiVElEID0gJWQsIFNlcUN0bCA9ICVkLCBiaXRtYXAgPSAweCVsbHgsIHNjZF9mbG93ID0gJWQsIHNjZF9zc24gPSAlZCBzZW50OiVkLCBhY2tlZDolZFxuIiwKKwkJCSAgIGJhX25vdGlmLT50aWQsIGxlMTZfdG9fY3B1KGJhX25vdGlmLT5zZXFfY3RsKSwKKwkJCSAgIGxlNjRfdG9fY3B1KGJhX25vdGlmLT5iaXRtYXApLCB0eHEsIGluZGV4LAorCQkJICAgYmFfbm90aWYtPnR4ZWQsIGJhX25vdGlmLT50eGVkXzJfZG9uZSk7CisKKwlJV0xfREVCVUdfVFhfUkVQTFkobXZtLCAicmVkdWNlZCB0eHAgZnJvbSBiYSBub3RpZiAlZFxuIiwKKwkJCSAgIGJhX25vdGlmLT5yZWR1Y2VkX3R4cCk7Cit9CisKIC8qCiAgKiBOb3RlIHRoYXQgdGhlcmUgYXJlIHRyYW5zcG9ydHMgdGhhdCBidWZmZXIgZnJhbWVzIGJlZm9yZSB0aGV5IHJlYWNoCiAgKiB0aGUgZmlybXdhcmUuIFRoaXMgbWVhbnMgdGhhdCBhZnRlciBmbHVzaF90eF9wYXRoIGlzIGNhbGxlZCwgdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS91dGlscy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vdXRpbHMuYwppbmRleCA2OGY0ZTdmLi5kMDRiYWJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS91dGlscy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL3V0aWxzLmMKQEAgLTUxMiw3ICs1MTIsNyBAQAogCQkJYmFzZSA9IG12bS0+ZnctPmluc3RfZXJybG9nX3B0cjsKIAl9CiAKLQlpZiAoYmFzZSA8IDB4ODAwMDAwKSB7CisJaWYgKGJhc2UgPCAweDQwMDAwMCkgewogCQlJV0xfRVJSKG12bSwKIAkJCSJOb3QgdmFsaWQgZXJyb3IgbG9nIHBvaW50ZXIgMHglMDhYIGZvciAlcyB1Q29kZVxuIiwKIAkJCWJhc2UsCkBAIC02MTAsNyArNjEwLDcgQEAKIHsKIAlzdHJ1Y3QgaXdsX3NjZF90eHFfY2ZnX2NtZCBjbWQgPSB7CiAJCS5zY2RfcXVldWUgPSBxdWV1ZSwKLQkJLmVuYWJsZSA9IDEsCisJCS5hY3Rpb24gPSBTQ0RfQ0ZHX0VOQUJMRV9RVUVVRSwKIAkJLndpbmRvdyA9IGZyYW1lX2xpbWl0LAogCQkuc3RhX2lkID0gc3RhX2lkLAogCQkuc3NuID0gY3B1X3RvX2xlMTYoc3NuKSwKQEAgLTY2OSw2ICs2NjksOCBAQAogCQkJCXRpZF90b19tYWM4MDIxMV9hY1tjZmctPnRpZF07CiAJCWVsc2UKIAkJCW12bS0+cXVldWVfaW5mb1txdWV1ZV0ubWFjODAyMTFfYWMgPSBJRUVFODAyMTFfQUNfVk87CisKKwkJbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS50eHFfdGlkID0gY2ZnLT50aWQ7CiAJfQogCiAJSVdMX0RFQlVHX1RYX1FVRVVFUyhtdm0sCkBAIC02ODIsNyArNjg0LDcgQEAKIAlpZiAoZW5hYmxlX3F1ZXVlKSB7CiAJCXN0cnVjdCBpd2xfc2NkX3R4cV9jZmdfY21kIGNtZCA9IHsKIAkJCS5zY2RfcXVldWUgPSBxdWV1ZSwKLQkJCS5lbmFibGUgPSAxLAorCQkJLmFjdGlvbiA9IFNDRF9DRkdfRU5BQkxFX1FVRVVFLAogCQkJLndpbmRvdyA9IGNmZy0+ZnJhbWVfbGltaXQsCiAJCQkuc3RhX2lkID0gY2ZnLT5zdGFfaWQsCiAJCQkuc3NuID0gY3B1X3RvX2xlMTYoc3NuKSwKQEAgLTcwOSw3ICs3MTEsNyBAQAogewogCXN0cnVjdCBpd2xfc2NkX3R4cV9jZmdfY21kIGNtZCA9IHsKIAkJLnNjZF9xdWV1ZSA9IHF1ZXVlLAotCQkuZW5hYmxlID0gMCwKKwkJLmFjdGlvbiA9IFNDRF9DRkdfRElTQUJMRV9RVUVVRSwKIAl9OwogCWJvb2wgcmVtb3ZlX21hY19xdWV1ZSA9IHRydWU7CiAJaW50IHJldDsKQEAgLTc0NCw4ICs3NDYsOSBAQAogCQkJfkJJVChtYWM4MDIxMV9xdWV1ZSk7CiAJbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5od19xdWV1ZV9yZWZjb3VudC0tOwogCi0JY21kLmVuYWJsZSA9IG12bS0+cXVldWVfaW5mb1txdWV1ZV0uaHdfcXVldWVfcmVmY291bnQgPyAxIDogMDsKLQlpZiAoIWNtZC5lbmFibGUpCisJY21kLmFjdGlvbiA9IG12bS0+cXVldWVfaW5mb1txdWV1ZV0uaHdfcXVldWVfcmVmY291bnQgPworCQlTQ0RfQ0ZHX0VOQUJMRV9RVUVVRSA6IFNDRF9DRkdfRElTQUJMRV9RVUVVRTsKKwlpZiAoY21kLmFjdGlvbiA9PSBTQ0RfQ0ZHX0RJU0FCTEVfUVVFVUUpCiAJCW12bS0+cXVldWVfaW5mb1txdWV1ZV0uc3RhdHVzID0gSVdMX01WTV9RVUVVRV9GUkVFOwogCiAJSVdMX0RFQlVHX1RYX1FVRVVFUyhtdm0sCkBAIC03NTUsMTIgKzc1OCwxMyBAQAogCQkJICAgIG12bS0+cXVldWVfaW5mb1txdWV1ZV0uaHdfcXVldWVfdG9fbWFjODAyMTEpOwogCiAJLyogSWYgdGhlIHF1ZXVlIGlzIHN0aWxsIGVuYWJsZWQgLSBub3RoaW5nIGxlZnQgdG8gZG8gaW4gdGhpcyBmdW5jICovCi0JaWYgKGNtZC5lbmFibGUpIHsKKwlpZiAoY21kLmFjdGlvbiA9PSBTQ0RfQ0ZHX0VOQUJMRV9RVUVVRSkgewogCQlzcGluX3VubG9ja19iaCgmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOwogCQlyZXR1cm47CiAJfQogCiAJY21kLnN0YV9pZCA9IG12bS0+cXVldWVfaW5mb1txdWV1ZV0ucmFfc3RhX2lkOworCWNtZC50aWQgPSBtdm0tPnF1ZXVlX2luZm9bcXVldWVdLnR4cV90aWQ7CiAKIAkvKiBNYWtlIHN1cmUgcXVldWUgaW5mbyBpcyBjb3JyZWN0IGV2ZW4gdGhvdWdoIHdlIG92ZXJ3cml0ZSBpdCAqLwogCVdBUk4obXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5od19xdWV1ZV9yZWZjb3VudCB8fApAQCAtMTEzMSw3ICsxMTM1LDEzIEBACiAJCQlCSVQobXZtc3RhLT52aWYtPmh3X3F1ZXVlW3RpZF90b19tYWM4MDIxMV9hY1t0aWRdXSk7CiAJfQogCi0JLyogVE9ETzogaWYgcXVldWUgd2FzIHNoYXJlZCAtIG5lZWQgdG8gcmUtZW5hYmxlIEFHR3MgKi8KKwkvKiBJZiB0aGUgcXVldWUgaXMgbWFya2VkIGFzIHNoYXJlZCAtICJ1bnNoYXJlIiBpdCAqLworCWlmIChtdm0tPnF1ZXVlX2luZm9bcXVldWVdLmh3X3F1ZXVlX3JlZmNvdW50ID09IDEgJiYKKwkgICAgbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5zdGF0dXMgPT0gSVdMX01WTV9RVUVVRV9TSEFSRUQpIHsKKwkJbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5zdGF0dXMgPSBJV0xfTVZNX1FVRVVFX1JFQ09ORklHVVJJTkc7CisJCUlXTF9ERUJVR19UWF9RVUVVRVMobXZtLCAiTWFya2luZyBROiVkIGZvciByZWNvbmZpZ1xuIiwKKwkJCQkgICAgcXVldWUpOworCX0KIH0KIAogdm9pZCBpd2xfbXZtX2luYWN0aXZpdHlfY2hlY2soc3RydWN0IGl3bF9tdm0gKm12bSkKQEAgLTEyMTUsNiArMTIyNSwyOCBAQAogCXJjdV9yZWFkX3VubG9jaygpOwogfQogCit2b2lkIGl3bF9tdm1fZ2V0X3N5bmNfdGltZShzdHJ1Y3QgaXdsX212bSAqbXZtLCB1MzIgKmdwMiwgdTY0ICpib290dGltZSkKK3sKKwlib29sIHBzX2Rpc2FibGVkOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmbXZtLT5tdXRleCk7CisKKwkvKiBEaXNhYmxlIHBvd2VyIHNhdmUgd2hlbiByZWFkaW5nIEdQMiAqLworCXBzX2Rpc2FibGVkID0gbXZtLT5wc19kaXNhYmxlZDsKKwlpZiAoIXBzX2Rpc2FibGVkKSB7CisJCW12bS0+cHNfZGlzYWJsZWQgPSB0cnVlOworCQlpd2xfbXZtX3Bvd2VyX3VwZGF0ZV9kZXZpY2UobXZtKTsKKwl9CisKKwkqZ3AyID0gaXdsX3JlYWRfcHJwaChtdm0tPnRyYW5zLCBERVZJQ0VfU1lTVEVNX1RJTUVfUkVHKTsKKwkqYm9vdHRpbWUgPSBrdGltZV9nZXRfYm9vdF9ucygpOworCisJaWYgKCFwc19kaXNhYmxlZCkgeworCQltdm0tPnBzX2Rpc2FibGVkID0gcHNfZGlzYWJsZWQ7CisJCWl3bF9tdm1fcG93ZXJfdXBkYXRlX2RldmljZShtdm0pOworCX0KK30KKwogaW50IGl3bF9tdm1fc2VuZF9scW1fY21kKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCQkgZW51bSBpd2xfbHFtX2NtZF9vcGVyYXRyaW9ucyBvcGVyYXRpb24sCiAJCQkgdTMyIGR1cmF0aW9uLCB1MzIgdGltZW91dCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvcGNpZS9kcnYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvcGNpZS9kcnYuYwppbmRleCA3OGNmOWE3Li4wMDFiZTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL3BjaWUvZHJ2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL2Rydi5jCkBAIC00ODcsNiArNDg3LDcgQEAKIAl7SVdMX1BDSV9ERVZJQ0UoMHgyNEZELCAweDExMzAsIGl3bDgyNjVfMmFjX2NmZyl9LAogCXtJV0xfUENJX0RFVklDRSgweDI0RkQsIDB4MDEzMCwgaXdsODI2NV8yYWNfY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MjRGRCwgMHgxMDEwLCBpd2w4MjY1XzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgyNEZELCAweDEwRDAsIGl3bDgyNjVfMmFjX2NmZyl9LAogCXtJV0xfUENJX0RFVklDRSgweDI0RkQsIDB4MDA1MCwgaXdsODI2NV8yYWNfY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MjRGRCwgMHgwMTUwLCBpd2w4MjY1XzJhY19jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgyNEZELCAweDkwMTAsIGl3bDgyNjVfMmFjX2NmZyl9LApAQCAtNTAwLDIyICs1MDEsMzYgQEAKIAl7SVdMX1BDSV9ERVZJQ0UoMHgyNEZELCAweDA5MzAsIGl3bDgyNjVfMmFjX2NmZyl9LAogCXtJV0xfUENJX0RFVklDRSgweDI0RkQsIDB4MDk1MCwgaXdsODI2NV8yYWNfY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MjRGRCwgMHgwODUwLCBpd2w4MjY1XzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgyNEZELCAweDAwMTIsIGl3bDgyNzVfMmFjX2NmZyl9LAogCiAvKiA5MDAwIFNlcmllcyAqLworCXtJV0xfUENJX0RFVklDRSgweDI3MUIsIDB4MDAxMCwgaXdsOTE2MF8yYWNfY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MjUyNiwgMHgwMDAwLCBpd2w5MjYwXzJhY19jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgyNTI2LCAweDAwMTAsIGl3bDkyNjBfMmFjX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDlERjAsIDB4MEExMCwgaXdsOTI2MF8yYWNfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4OURGMCwgMHgwMDEwLCBpd2w5MjYwXzJhY19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHg5REYwLCAweDAyMTAsIGl3bDkyNjBfMmFjX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDlERjAsIDB4MDQxMCwgaXdsOTI2MF8yYWNfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4OURGMCwgMHgwNjEwLCBpd2w5MjYwXzJhY19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHg5REYwLCAweDAzMTAsIGl3bDUxNjVfMmFjX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDlERjAsIDB4MDAwMCwgaXdsNTE2NV8yYWNfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4OURGMCwgMHgwNTEwLCBpd2w1MTY1XzJhY19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHg5REYwLCAweDIwMTAsIGl3bDUxNjVfMmFjX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDI1MjYsIDB4MTQyMCwgaXdsNTE2NV8yYWNfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4OURGMCwgMHgwNzEwLCBpd2w1MTY1XzJhY19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHg5REYwLCAweDJBMTAsIGl3bDUxNjVfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDI1MjYsIDB4MTQxMCwgaXdsOTI3MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4OURGMCwgMHgwQTEwLCBpd2w5NDYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHg5REYwLCAweDAwMTAsIGl3bDk0NjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDlERjAsIDB4MDIxMCwgaXdsOTQ2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4OURGMCwgMHgwNDEwLCBpd2w5NDYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHg5REYwLCAweDA2MTAsIGl3bDk0NjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDlERjAsIDB4MDMxMCwgaXdsOTQ2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4OURGMCwgMHgwMDAwLCBpd2w5NDYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHg5REYwLCAweDA1MTAsIGl3bDk0NjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDlERjAsIDB4MjAxMCwgaXdsOTQ2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MjUyNiwgMHgxNDIwLCBpd2w5NDYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHg5REYwLCAweDA3MTAsIGl3bDk0NjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDlERjAsIDB4MkExMCwgaXdsOTQ2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MzBEQywgMHgwMDYwLCBpd2w5NDYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgyNTI2LCAweDAwNjAsIGl3bDk0NjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDlERjAsIDB4MDA2MCwgaXdsOTQ2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4QTM3MCwgMHgwMDYwLCBpd2w5NDYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgzMURDLCAweDAwNjAsIGl3bDk0NjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDI1MjYsIDB4MDAzMCwgaXdsOTU2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4OURGMCwgMHgwMDMwLCBpd2w5NTYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHhBMzcwLCAweDAwMzAsIGl3bDk1NjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDMxREMsIDB4MDAzMCwgaXdsOTU2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MjUyNiwgMHgxMDMwLCBpd2w5NTYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHhBMzcwLCAweDEwMzAsIGl3bDk1NjBfMmFjX2NmZyl9LAogCiAvKiBhMDAwIFNlcmllcyAqLwogCXtJV0xfUENJX0RFVklDRSgweDI3MjAsIDB4MEExMCwgaXdsYTAwMF8yYWNfY2ZnKX0sCkBAIC02MDgsNyArNjIzLDYgQEAKIHsKIAljb25zdCBzdHJ1Y3QgaXdsX2NmZyAqY2ZnID0gKHN0cnVjdCBpd2xfY2ZnICopKGVudC0+ZHJpdmVyX2RhdGEpOwogCWNvbnN0IHN0cnVjdCBpd2xfY2ZnICpjZmdfNzI2NWQgX19tYXliZV91bnVzZWQgPSBOVUxMOwotCWNvbnN0IHN0cnVjdCBpd2xfY2ZnICpjZmdfOTI2MGxjIF9fbWF5YmVfdW51c2VkID0gTlVMTDsKIAlzdHJ1Y3QgaXdsX3RyYW5zICppd2xfdHJhbnM7CiAJaW50IHJldDsKIApAQCAtNjM3LDExICs2NTEsMTAgQEAKIAl9CiAKIAlpZiAoaXdsX3RyYW5zLT5jZmctPnJmX2lkKSB7Ci0JCWlmIChjZmcgPT0gJml3bDkyNjBfMmFjX2NmZykKLQkJCWNmZ185MjYwbGMgPSAmaXdsOTI2MGxjXzJhY19jZmc7Ci0JCWlmIChjZmdfOTI2MGxjICYmIGl3bF90cmFucy0+aHdfcmZfaWQgPT0gQ1NSX0hXX1JGX0lEX1RZUEVfTEMpIHsKLQkJCWNmZyA9IGNmZ185MjYwbGM7Ci0JCQlpd2xfdHJhbnMtPmNmZyA9IGNmZ185MjYwbGM7CisJCWlmIChjZmcgPT0gJml3bDk0NjBfMmFjX2NmZyAmJgorCQkgICAgaXdsX3RyYW5zLT5od19yZl9pZCA9PSBDU1JfSFdfUkZfSURfVFlQRV9MQykgeworCQkJY2ZnID0gJml3bDkwMDBsY18yYWNfY2ZnOworCQkJaXdsX3RyYW5zLT5jZmcgPSBjZmc7CiAJCX0KIAl9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvcGNpZS9pbnRlcm5hbC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL2ludGVybmFsLmgKaW5kZXggMTFlMzQ3ZC4uY2FjNmQ5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL2ludGVybmFsLmgKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KIAogI2luY2x1ZGUgIml3bC1maC5oIgogI2luY2x1ZGUgIml3bC1jc3IuaCIKQEAgLTQ5LDcgKzUwLDcgQEAKICAqIGJlIG5lZWRlZCBmb3IgcG90ZW50aWFsIGRhdGEgaW4gdGhlIFNLQidzIGhlYWQuIFRoZSByZW1haW5pbmcgb25lcyBjYW4KICAqIGJlIHVzZWQgZm9yIGZyYWdzLgogICovCi0jZGVmaW5lIElXTF9QQ0lFX01BWF9GUkFHUyAoSVdMX05VTV9PRl9UQlMgLSAzKQorI2RlZmluZSBJV0xfUENJRV9NQVhfRlJBR1MoeCkgKHgtPm1heF90YnMgLSAzKQogCiAvKgogICogUlggcmVsYXRlZCBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMKQEAgLTE5Miw0MSArMTkzLDkgQEAKIAkvKiBvbmx5IGZvciBTWU5DIGNvbW1hbmRzLCBpZmYgdGhlIHJlcGx5IHNrYiBpcyB3YW50ZWQgKi8KIAlzdHJ1Y3QgaXdsX2hvc3RfY21kICpzb3VyY2U7CiAJdTMyIGZsYWdzOworCXUzMiB0YnM7CiB9OwogCi0vKgotICogR2VuZXJpYyBxdWV1ZSBzdHJ1Y3R1cmUKLSAqCi0gKiBDb250YWlucyBjb21tb24gZGF0YSBmb3IgUnggYW5kIFR4IHF1ZXVlcy4KLSAqCi0gKiBOb3RlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gVEZEX1FVRVVFX1NJWkVfTUFYIGFuZCBuX3dpbmRvdzogdGhlIGhhcmR3YXJlCi0gKiBhbHdheXMgYXNzdW1lcyAyNTYgZGVzY3JpcHRvcnMsIHNvIFRGRF9RVUVVRV9TSVpFX01BWCBpcyBhbHdheXMgMjU2ICh1bmxlc3MKLSAqIHRoZXJlIG1pZ2h0IGJlIEhXIGNoYW5nZXMgaW4gdGhlIGZ1dHVyZSkuIEZvciB0aGUgbm9ybWFsIFRYCi0gKiBxdWV1ZXMsIG5fd2luZG93LCB3aGljaCBpcyB0aGUgc2l6ZSBvZiB0aGUgc29mdHdhcmUgcXVldWUgZGF0YQotICogaXMgYWxzbyAyNTY7IGhvd2V2ZXIsIGZvciB0aGUgY29tbWFuZCBxdWV1ZSwgbl93aW5kb3cgaXMgb25seQotICogMzIgc2luY2Ugd2UgZG9uJ3QgbmVlZCBzbyBtYW55IGNvbW1hbmRzIHBlbmRpbmcuIFNpbmNlIHRoZSBIVwotICogc3RpbGwgdXNlcyAyNTYgQkRzIGZvciBETUEgdGhvdWdoLCBURkRfUVVFVUVfU0laRV9NQVggc3RheXMgMjU2LiBBcyBhIHJlc3VsdCwKLSAqIHRoZSBzb2Z0d2FyZSBidWZmZXJzIChpbiB0aGUgdmFyaWFibGVzIEBtZXRhLCBAdHhiIGluIHN0cnVjdAotICogaXdsX3R4cSkgb25seSBoYXZlIDMyIGVudHJpZXMsIHdoaWxlIHRoZSBIVyBidWZmZXJzIChAdGZkcyBpbgotICogdGhlIHNhbWUgc3RydWN0KSBoYXZlIDI1Ni4KLSAqIFRoaXMgbWVhbnMgdGhhdCB3ZSBlbmQgdXAgd2l0aCB0aGUgZm9sbG93aW5nOgotICogIEhXIGVudHJpZXM6IHwgMCB8IC4uLiB8IE4gKiAzMiB8IC4uLiB8IE4gKiAzMiArIDMxIHwgLi4uIHwgMjU1IHwKLSAqICBTVyBlbnRyaWVzOiAgICAgICAgICAgfCAwICAgICAgfCAuLi4gfCAzMSAgICAgICAgICB8Ci0gKiB3aGVyZSBOIGlzIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgNy4gVGhpcyBtZWFucyB0aGF0IHRoZSBTVwotICogZGF0YSBpcyBhIHdpbmRvdyBvdmVybGF5ZWQgb3ZlciB0aGUgSFcgcXVldWUuCi0gKi8KLXN0cnVjdCBpd2xfcXVldWUgewotCWludCB3cml0ZV9wdHI7ICAgICAgIC8qIDEtc3QgZW1wdHkgZW50cnkgKGluZGV4KSBob3N0X3cqLwotCWludCByZWFkX3B0cjsgICAgICAgICAvKiBsYXN0IHVzZWQgZW50cnkgKGluZGV4KSBob3N0X3IqLwotCS8qIHVzZSBmb3IgbW9uaXRvcmluZyBhbmQgcmVjb3ZlcmluZyB0aGUgc3R1Y2sgcXVldWUgKi8KLQlkbWFfYWRkcl90IGRtYV9hZGRyOyAgIC8qIHBoeXNpY2FsIGFkZHIgZm9yIEJEJ3MgKi8KLQlpbnQgbl93aW5kb3c7CSAgICAgICAvKiBzYWZlIHF1ZXVlIHdpbmRvdyAqLwotCXUzMiBpZDsKLQlpbnQgbG93X21hcms7CSAgICAgICAvKiBsb3cgd2F0ZXJtYXJrLCByZXN1bWUgcXVldWUgaWYgZnJlZQotCQkJCSogc3BhY2UgbW9yZSB0aGFuIHRoaXMgKi8KLQlpbnQgaGlnaF9tYXJrOyAgICAgICAgIC8qIGhpZ2ggd2F0ZXJtYXJrLCBzdG9wIHF1ZXVlIGlmIGZyZWUKLQkJCQkqIHNwYWNlIGxlc3MgdGhhbiB0aGlzICovCi19OwogCiAjZGVmaW5lIFRGRF9UWF9DTURfU0xPVFMgMjU2CiAjZGVmaW5lIFRGRF9DTURfU0xPVFMgMzIKQEAgLTI3MywxMyArMjQyLDMyIEBACiAgKiBAd2RfdGltZW91dDogcXVldWUgd2F0Y2hkb2cgdGltZW91dCAoamlmZmllcykgLSBwZXIgcXVldWUKICAqIEBmcm96ZW46IHR4IHN0dWNrIHF1ZXVlIHRpbWVyIGlzIGZyb3plbgogICogQGZyb3plbl9leHBpcnlfcmVtYWluZGVyOiByZW1lbWJlciBob3cgbG9uZyB1bnRpbCB0aGUgdGltZXIgZmlyZXMKKyAqIEB3cml0ZV9wdHI6IDEtc3QgZW1wdHkgZW50cnkgKGluZGV4KSBob3N0X3cKKyAqIEByZWFkX3B0cjogbGFzdCB1c2VkIGVudHJ5IChpbmRleCkgaG9zdF9yCisgKiBAZG1hX2FkZHI6ICBwaHlzaWNhbCBhZGRyIGZvciBCRCdzCisgKiBAbl93aW5kb3c6IHNhZmUgcXVldWUgd2luZG93CisgKiBAaWQ6IHF1ZXVlIGlkCisgKiBAbG93X21hcms6IGxvdyB3YXRlcm1hcmssIHJlc3VtZSBxdWV1ZSBpZiBmcmVlIHNwYWNlIG1vcmUgdGhhbiB0aGlzCisgKiBAaGlnaF9tYXJrOiBoaWdoIHdhdGVybWFyaywgc3RvcCBxdWV1ZSBpZiBmcmVlIHNwYWNlIGxlc3MgdGhhbiB0aGlzCiAgKgogICogQSBUeCBxdWV1ZSBjb25zaXN0cyBvZiBjaXJjdWxhciBidWZmZXIgb2YgQkRzIChhLmsuYS4gVEZEcywgdHJhbnNtaXQgZnJhbWUKICAqIGRlc2NyaXB0b3JzKSBhbmQgcmVxdWlyZWQgbG9ja2luZyBzdHJ1Y3R1cmVzLgorICoKKyAqIE5vdGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBURkRfUVVFVUVfU0laRV9NQVggYW5kIG5fd2luZG93OiB0aGUgaGFyZHdhcmUKKyAqIGFsd2F5cyBhc3N1bWVzIDI1NiBkZXNjcmlwdG9ycywgc28gVEZEX1FVRVVFX1NJWkVfTUFYIGlzIGFsd2F5cyAyNTYgKHVubGVzcworICogdGhlcmUgbWlnaHQgYmUgSFcgY2hhbmdlcyBpbiB0aGUgZnV0dXJlKS4gRm9yIHRoZSBub3JtYWwgVFgKKyAqIHF1ZXVlcywgbl93aW5kb3csIHdoaWNoIGlzIHRoZSBzaXplIG9mIHRoZSBzb2Z0d2FyZSBxdWV1ZSBkYXRhCisgKiBpcyBhbHNvIDI1NjsgaG93ZXZlciwgZm9yIHRoZSBjb21tYW5kIHF1ZXVlLCBuX3dpbmRvdyBpcyBvbmx5CisgKiAzMiBzaW5jZSB3ZSBkb24ndCBuZWVkIHNvIG1hbnkgY29tbWFuZHMgcGVuZGluZy4gU2luY2UgdGhlIEhXCisgKiBzdGlsbCB1c2VzIDI1NiBCRHMgZm9yIERNQSB0aG91Z2gsIFRGRF9RVUVVRV9TSVpFX01BWCBzdGF5cyAyNTYuCisgKiBUaGlzIG1lYW5zIHRoYXQgd2UgZW5kIHVwIHdpdGggdGhlIGZvbGxvd2luZzoKKyAqICBIVyBlbnRyaWVzOiB8IDAgfCAuLi4gfCBOICogMzIgfCAuLi4gfCBOICogMzIgKyAzMSB8IC4uLiB8IDI1NSB8CisgKiAgU1cgZW50cmllczogICAgICAgICAgIHwgMCAgICAgIHwgLi4uIHwgMzEgICAgICAgICAgfAorICogd2hlcmUgTiBpcyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDcuIFRoaXMgbWVhbnMgdGhhdCB0aGUgU1cKKyAqIGRhdGEgaXMgYSB3aW5kb3cgb3ZlcmxheWVkIG92ZXIgdGhlIEhXIHF1ZXVlLgogICovCiBzdHJ1Y3QgaXdsX3R4cSB7Ci0Jc3RydWN0IGl3bF9xdWV1ZSBxOwotCXN0cnVjdCBpd2xfdGZkICp0ZmRzOworCXZvaWQgKnRmZHM7CiAJc3RydWN0IGl3bF9wY2llX2ZpcnN0X3RiX2J1ZiAqZmlyc3RfdGJfYnVmczsKIAlkbWFfYWRkcl90IGZpcnN0X3RiX2RtYTsKIAlzdHJ1Y3QgaXdsX3BjaWVfdHhxX2VudHJ5ICplbnRyaWVzOwpAQCAtMjk0LDYgKzI4MiwxNCBAQAogCWJvb2wgYmxvY2s7CiAJdW5zaWduZWQgbG9uZyB3ZF90aW1lb3V0OwogCXN0cnVjdCBza19idWZmX2hlYWQgb3ZlcmZsb3dfcTsKKworCWludCB3cml0ZV9wdHI7CisJaW50IHJlYWRfcHRyOworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJaW50IG5fd2luZG93OworCXUzMiBpZDsKKwlpbnQgbG93X21hcms7CisJaW50IGhpZ2hfbWFyazsKIH07CiAKIHN0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdApAQCAtMzA5LDYgKzMwNSwxNiBAQAogfTsKIAogLyoqCisgKiBlbnVtIGl3bF9zaGFyZWRfaXJxX2ZsYWdzIC0gbGV2ZWwgb2Ygc2hhcmluZyBmb3IgaXJxCisgKiBASVdMX1NIQVJFRF9JUlFfTk9OX1JYOiBpbnRlcnJ1cHQgdmVjdG9yIHNlcnZlcyBub24gcnggY2F1c2VzLgorICogQElXTF9TSEFSRURfSVJRX0ZJUlNUX1JTUzogaW50ZXJydXB0IHZlY3RvciBzZXJ2ZXMgZmlyc3QgUlNTIHF1ZXVlLgorICovCitlbnVtIGl3bF9zaGFyZWRfaXJxX2ZsYWdzIHsKKwlJV0xfU0hBUkVEX0lSUV9OT05fUlgJCT0gQklUKDApLAorCUlXTF9TSEFSRURfSVJRX0ZJUlNUX1JTUwk9IEJJVCgxKSwKK307CisKKy8qKgogICogc3RydWN0IGl3bF90cmFuc19wY2llIC0gUENJZSB0cmFuc3BvcnQgc3BlY2lmaWMgZGF0YQogICogQHJ4cTogYWxsIHRoZSBSWCBxdWV1ZSBkYXRhCiAgKiBAcnhfcG9vbDogaW5pdGlhbCBwb29sIG9mIGl3bF9yeF9tZW1fYnVmZmVyIGZvciBhbGwgdGhlIHF1ZXVlcwpAQCAtMzI2LDcgKzMzMiw2IEBACiAgKiBAcnhfYnVmX3NpemU6IFJ4IGJ1ZmZlciBzaXplCiAgKiBAYmNfdGFibGVfZHdvcmQ6IHRydWUgaWYgdGhlIEJDIHRhYmxlIGV4cGVjdHMgRFdPUkQgKGFzIG9wcG9zZWQgdG8gYnl0ZXMpCiAgKiBAc2NkX3NldF9hY3RpdmU6IHNob3VsZCB0aGUgdHJhbnNwb3J0IGNvbmZpZ3VyZSB0aGUgU0NEIGZvciBIQ01EIHF1ZXVlCi0gKiBAd2lkZV9jbWRfaGVhZGVyOiB0cnVlIHdoZW4gdWNvZGUgc3VwcG9ydHMgd2lkZSBjb21tYW5kIGhlYWRlciBmb3JtYXQKICAqIEBzd19jc3VtX3R4OiBpZiB0cnVlLCB0aGVuIHRoZSB0cmFuc3BvcnQgd2lsbCBjb21wdXRlIHRoZSBjc3VtIG9mIHRoZSBUWGVkCiAgKglmcmFtZS4KICAqIEByeF9wYWdlX29yZGVyOiBwYWdlIG9yZGVyIGZvciByZWNlaXZlIGJ1ZmZlciBzaXplCkBAIC0zMzgsOCArMzQzLDEwIEBACiAgKiBAZndfbW9uX3NpemU6IHNpemUgb2YgdGhlIGJ1ZmZlciBmb3IgdGhlIGZpcm13YXJlIG1vbml0b3IKICAqIEBtc2l4X2VudHJpZXM6IGFycmF5IG9mIE1TSS1YIGVudHJpZXMKICAqIEBtc2l4X2VuYWJsZWQ6IHRydWUgaWYgbWFuYWdlZCB0byBlbmFibGUgTVNJLVgKLSAqIEBhbGxvY2F0ZWRfdmVjdG9yOiB0aGUgbnVtYmVyIG9mIGludGVycnVwdCB2ZWN0b3IgYWxsb2NhdGVkIGJ5IHRoZSBPUwotICogQGRlZmF1bHRfaXJxX251bTogZGVmYXVsdCBpcnEgZm9yIG5vbiByeCBpbnRlcnJ1cHQKKyAqIEBzaGFyZWRfdmVjX21hc2s6IHRoZSB0eXBlIG9mIGNhdXNlcyB0aGUgc2hhcmVkIHZlY3RvciBoYW5kbGVzCisgKgkoc2VlIGl3bF9zaGFyZWRfaXJxX2ZsYWdzKS4KKyAqIEBhbGxvY192ZWNzOiB0aGUgbnVtYmVyIG9mIGludGVycnVwdCB2ZWN0b3JzIGFsbG9jYXRlZCBieSB0aGUgT1MKKyAqIEBkZWZfaXJxOiBkZWZhdWx0IGlycSBmb3Igbm9uIHJ4IGNhdXNlcwogICogQGZoX2luaXRfbWFzazogaW5pdGlhbCB1bm1hc2tlZCBmaCBjYXVzZXMKICAqIEBod19pbml0X21hc2s6IGluaXRpYWwgdW5tYXNrZWQgaHcgY2F1c2VzCiAgKiBAZmhfbWFzazogY3VycmVudCB1bm1hc2tlZCBmaCBjYXVzZXMKQEAgLTM5MSwxMSArMzk4LDEyIEBACiAJdW5zaWduZWQgaW50IGNtZF9xX3dkZ190aW1lb3V0OwogCXU4IG5fbm9fcmVjbGFpbV9jbWRzOwogCXU4IG5vX3JlY2xhaW1fY21kc1tNQVhfTk9fUkVDTEFJTV9DTURTXTsKKwl1OCBtYXhfdGJzOworCXUxNiB0ZmRfc2l6ZTsKIAogCWVudW0gaXdsX2Ftc2R1X3NpemUgcnhfYnVmX3NpemU7CiAJYm9vbCBiY190YWJsZV9kd29yZDsKIAlib29sIHNjZF9zZXRfYWN0aXZlOwotCWJvb2wgd2lkZV9jbWRfaGVhZGVyOwogCWJvb2wgc3dfY3N1bV90eDsKIAl1MzIgcnhfcGFnZV9vcmRlcjsKIApAQCAtNDEwLDEyICs0MTgsMTQgQEAKIAogCXN0cnVjdCBtc2l4X2VudHJ5IG1zaXhfZW50cmllc1tJV0xfTUFYX1JYX0hXX1FVRVVFU107CiAJYm9vbCBtc2l4X2VuYWJsZWQ7Ci0JdTMyIGFsbG9jYXRlZF92ZWN0b3I7Ci0JdTMyIGRlZmF1bHRfaXJxX251bTsKKwl1OCBzaGFyZWRfdmVjX21hc2s7CisJdTMyIGFsbG9jX3ZlY3M7CisJdTMyIGRlZl9pcnE7CiAJdTMyIGZoX2luaXRfbWFzazsKIAl1MzIgaHdfaW5pdF9tYXNrOwogCXUzMiBmaF9tYXNrOwogCXUzMiBod19tYXNrOworCWNwdW1hc2tfdCBhZmZpbml0eV9tYXNrW0lXTF9NQVhfUlhfSFdfUVVFVUVTXTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGl3bF90cmFuc19wY2llICoKQEAgLTQ3NCw2ICs0ODQsNyBAQAogCQkJCWJvb2wgY29uZmlndXJlX3NjZCk7CiB2b2lkIGl3bF90cmFuc19wY2llX3R4cV9zZXRfc2hhcmVkX21vZGUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHUzMiB0eHFfaWQsCiAJCQkJCWJvb2wgc2hhcmVkX21vZGUpOworZG1hX2FkZHJfdCBpd2xfdHJhbnNfcGNpZV9nZXRfdHhxX2J5dGVfdGFibGUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIGludCB0eHEpOwogdm9pZCBpd2xfdHJhbnNfcGNpZV9sb2dfc2NkX2Vycm9yKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAogCQkJCSAgc3RydWN0IGl3bF90eHEgKnR4cSk7CiBpbnQgaXdsX3RyYW5zX3BjaWVfdHgoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHN0cnVjdCBza19idWZmICpza2IsCkBAIC00ODYsMTEgKzQ5NywyMCBAQAogCQkJICAgIHN0cnVjdCBza19idWZmX2hlYWQgKnNrYnMpOwogdm9pZCBpd2xfdHJhbnNfcGNpZV90eF9yZXNldChzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucyk7CiAKLXN0YXRpYyBpbmxpbmUgdTE2IGl3bF9wY2llX3RmZF90Yl9nZXRfbGVuKHN0cnVjdCBpd2xfdGZkICp0ZmQsIHU4IGlkeCkKK3N0YXRpYyBpbmxpbmUgdTE2IGl3bF9wY2llX3RmZF90Yl9nZXRfbGVuKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCB2b2lkICpfdGZkLAorCQkJCQkgIHU4IGlkeCkKIHsKLQlzdHJ1Y3QgaXdsX3RmZF90YiAqdGIgPSAmdGZkLT50YnNbaWR4XTsKKwlpZiAodHJhbnMtPmNmZy0+dXNlX3RmaCkgeworCQlzdHJ1Y3QgaXdsX3RmaF90ZmQgKnRmZCA9IF90ZmQ7CisJCXN0cnVjdCBpd2xfdGZoX3RiICp0YiA9ICZ0ZmQtPnRic1tpZHhdOwogCi0JcmV0dXJuIGxlMTZfdG9fY3B1KHRiLT5oaV9uX2xlbikgPj4gNDsKKwkJcmV0dXJuIGxlMTZfdG9fY3B1KHRiLT50Yl9sZW4pOworCX0gZWxzZSB7CisJCXN0cnVjdCBpd2xfdGZkICp0ZmQgPSBfdGZkOworCQlzdHJ1Y3QgaXdsX3RmZF90YiAqdGIgPSAmdGZkLT50YnNbaWR4XTsKKworCQlyZXR1cm4gbGUxNl90b19jcHUodGItPmhpX25fbGVuKSA+PiA0OworCX0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC02MTcsOSArNjM3LDkgQEAKIHsKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwogCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCh0eHEtPnEuaWQsIHRyYW5zX3BjaWUtPnF1ZXVlX3N0b3BwZWQpKSB7Ci0JCUlXTF9ERUJVR19UWF9RVUVVRVModHJhbnMsICJXYWtlIGh3cSAlZFxuIiwgdHhxLT5xLmlkKTsKLQkJaXdsX29wX21vZGVfcXVldWVfbm90X2Z1bGwodHJhbnMtPm9wX21vZGUsIHR4cS0+cS5pZCk7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCh0eHEtPmlkLCB0cmFuc19wY2llLT5xdWV1ZV9zdG9wcGVkKSkgeworCQlJV0xfREVCVUdfVFhfUVVFVUVTKHRyYW5zLCAiV2FrZSBod3EgJWRcbiIsIHR4cS0+aWQpOworCQlpd2xfb3BfbW9kZV9xdWV1ZV9ub3RfZnVsbCh0cmFucy0+b3BfbW9kZSwgdHhxLT5pZCk7CiAJfQogfQogCkBAIC02MjgsMjIgKzY0OCwyMiBAQAogewogCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CiAKLQlpZiAoIXRlc3RfYW5kX3NldF9iaXQodHhxLT5xLmlkLCB0cmFuc19wY2llLT5xdWV1ZV9zdG9wcGVkKSkgewotCQlpd2xfb3BfbW9kZV9xdWV1ZV9mdWxsKHRyYW5zLT5vcF9tb2RlLCB0eHEtPnEuaWQpOwotCQlJV0xfREVCVUdfVFhfUVVFVUVTKHRyYW5zLCAiU3RvcCBod3EgJWRcbiIsIHR4cS0+cS5pZCk7CisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KHR4cS0+aWQsIHRyYW5zX3BjaWUtPnF1ZXVlX3N0b3BwZWQpKSB7CisJCWl3bF9vcF9tb2RlX3F1ZXVlX2Z1bGwodHJhbnMtPm9wX21vZGUsIHR4cS0+aWQpOworCQlJV0xfREVCVUdfVFhfUVVFVUVTKHRyYW5zLCAiU3RvcCBod3EgJWRcbiIsIHR4cS0+aWQpOwogCX0gZWxzZQogCQlJV0xfREVCVUdfVFhfUVVFVUVTKHRyYW5zLCAiaHdxICVkIGFscmVhZHkgc3RvcHBlZFxuIiwKLQkJCQkgICAgdHhxLT5xLmlkKTsKKwkJCQkgICAgdHhxLT5pZCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBpd2xfcXVldWVfdXNlZChjb25zdCBzdHJ1Y3QgaXdsX3F1ZXVlICpxLCBpbnQgaSkKK3N0YXRpYyBpbmxpbmUgYm9vbCBpd2xfcXVldWVfdXNlZChjb25zdCBzdHJ1Y3QgaXdsX3R4cSAqcSwgaW50IGkpCiB7CiAJcmV0dXJuIHEtPndyaXRlX3B0ciA+PSBxLT5yZWFkX3B0ciA/CiAJCShpID49IHEtPnJlYWRfcHRyICYmIGkgPCBxLT53cml0ZV9wdHIpIDoKIAkJIShpIDwgcS0+cmVhZF9wdHIgJiYgaSA+PSBxLT53cml0ZV9wdHIpOwogfQogCi1zdGF0aWMgaW5saW5lIHU4IGdldF9jbWRfaW5kZXgoc3RydWN0IGl3bF9xdWV1ZSAqcSwgdTMyIGluZGV4KQorc3RhdGljIGlubGluZSB1OCBnZXRfY21kX2luZGV4KHN0cnVjdCBpd2xfdHhxICpxLCB1MzIgaW5kZXgpCiB7CiAJcmV0dXJuIGluZGV4ICYgKHEtPm5fd2luZG93IC0gMSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL3BjaWUvcnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvcGNpZS9yeC5jCmluZGV4IDVjMzZlNmQuLjZmZTU1NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvcGNpZS9yeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvcGNpZS9yeC5jCkBAIC00ODcsMTUgKzQ4NywxMyBAQAogCiAJd2hpbGUgKHBlbmRpbmcpIHsKIAkJaW50IGk7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgbG9jYWxfYWxsb2NhdGVkOworCQlMSVNUX0hFQUQobG9jYWxfYWxsb2NhdGVkKTsKIAkJZ2ZwX3QgZ2ZwX21hc2sgPSBHRlBfS0VSTkVMOwogCiAJCS8qIERvIG5vdCBwb3N0IGEgd2FybmluZyBpZiB0aGVyZSBhcmUgb25seSBhIGZldyByZXF1ZXN0cyAqLwogCQlpZiAocGVuZGluZyA8IFJYX1BFTkRJTkdfV0FURVJNQVJLKQogCQkJZ2ZwX21hc2sgfD0gX19HRlBfTk9XQVJOOwogCi0JCUlOSVRfTElTVF9IRUFEKCZsb2NhbF9hbGxvY2F0ZWQpOwotCiAJCWZvciAoaSA9IDA7IGkgPCBSWF9DTEFJTV9SRVFfQUxMT0M7KSB7CiAJCQlzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YjsKIAkJCXN0cnVjdCBwYWdlICpwYWdlOwpAQCAtMTEwOCwxMyArMTEwNiwxNCBAQAogCQkJRkhfUlNDU1JfUlhRX1BPUyAhPSByeHEtPmlkKTsKIAogCQlJV0xfREVCVUdfUlgodHJhbnMsCi0JCQkgICAgICJjbWQgYXQgb2Zmc2V0ICVkOiAlcyAoMHglLjJ4LCBzZXEgMHgleClcbiIsCisJCQkgICAgICJjbWQgYXQgb2Zmc2V0ICVkOiAlcyAoJS4yeC4lMngsIHNlcSAweCV4KVxuIiwKIAkJCSAgICAgcnhjYi5fb2Zmc2V0LAogCQkJICAgICBpd2xfZ2V0X2NtZF9zdHJpbmcodHJhbnMsCiAJCQkJCQlpd2xfY21kX2lkKHBrdC0+aGRyLmNtZCwKIAkJCQkJCQkgICBwa3QtPmhkci5ncm91cF9pZCwKIAkJCQkJCQkgICAwKSksCi0JCQkgICAgIHBrdC0+aGRyLmNtZCwgbGUxNl90b19jcHUocGt0LT5oZHIuc2VxdWVuY2UpKTsKKwkJCSAgICAgcGt0LT5oZHIuZ3JvdXBfaWQsIHBrdC0+aGRyLmNtZCwKKwkJCSAgICAgbGUxNl90b19jcHUocGt0LT5oZHIuc2VxdWVuY2UpKTsKIAogCQlsZW4gPSBpd2xfcnhfcGFja2V0X2xlbihwa3QpOwogCQlsZW4gKz0gc2l6ZW9mKHUzMik7IC8qIGFjY291bnQgZm9yIHN0YXR1cyB3b3JkICovCkBAIC0xMTQyLDcgKzExNDEsNyBAQAogCiAJCXNlcXVlbmNlID0gbGUxNl90b19jcHUocGt0LT5oZHIuc2VxdWVuY2UpOwogCQlpbmRleCA9IFNFUV9UT19JTkRFWChzZXF1ZW5jZSk7Ci0JCWNtZF9pbmRleCA9IGdldF9jbWRfaW5kZXgoJnR4cS0+cSwgaW5kZXgpOworCQljbWRfaW5kZXggPSBnZXRfY21kX2luZGV4KHR4cSwgaW5kZXgpOwogCiAJCWlmIChyeHEtPmlkID09IDApCiAJCQlpd2xfb3BfbW9kZV9yeCh0cmFucy0+b3BfbW9kZSwgJnJ4cS0+bmFwaSwKQEAgLTE4ODUsNiArMTg4NCwyMCBAQAogCQkJICAgICAgaW50YV9maCwKIAkJCSAgICAgIGl3bF9yZWFkMzIodHJhbnMsIENTUl9NU0lYX0ZIX0lOVF9NQVNLX0FEKSk7CiAKKwlpZiAoKHRyYW5zX3BjaWUtPnNoYXJlZF92ZWNfbWFzayAmIElXTF9TSEFSRURfSVJRX05PTl9SWCkgJiYKKwkgICAgaW50YV9maCAmIE1TSVhfRkhfSU5UX0NBVVNFU19RMCkgeworCQlsb2NhbF9iaF9kaXNhYmxlKCk7CisJCWl3bF9wY2llX3J4X2hhbmRsZSh0cmFucywgMCk7CisJCWxvY2FsX2JoX2VuYWJsZSgpOworCX0KKworCWlmICgodHJhbnNfcGNpZS0+c2hhcmVkX3ZlY19tYXNrICYgSVdMX1NIQVJFRF9JUlFfRklSU1RfUlNTKSAmJgorCSAgICBpbnRhX2ZoICYgTVNJWF9GSF9JTlRfQ0FVU0VTX1ExKSB7CisJCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwkJaXdsX3BjaWVfcnhfaGFuZGxlKHRyYW5zLCAxKTsKKwkJbG9jYWxfYmhfZW5hYmxlKCk7CisJfQorCiAJLyogVGhpcyAiVHgiIERNQSBjaGFubmVsIGlzIHVzZWQgb25seSBmb3IgbG9hZGluZyB1Q29kZSAqLwogCWlmIChpbnRhX2ZoICYgTVNJWF9GSF9JTlRfQ0FVU0VTX0QyU19DSDBfTlVNKSB7CiAJCUlXTF9ERUJVR19JU1IodHJhbnMsICJ1Q29kZSBsb2FkIGludGVycnVwdFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL3BjaWUvdHJhbnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvcGNpZS90cmFucy5jCmluZGV4IDc0ZjJmMDMuLmFlOTU1MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvcGNpZS90cmFucy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvcGNpZS90cmFucy5jCkBAIC04MjcsMTAgKzgyNywxNiBAQAogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAotCQkvKiBOb3RpZnkgdGhlIHVjb2RlIG9mIHRoZSBsb2FkZWQgc2VjdGlvbiBudW1iZXIgYW5kIHN0YXR1cyAqLwotCQl2YWwgPSBpd2xfcmVhZF9kaXJlY3QzMih0cmFucywgRkhfVUNPREVfTE9BRF9TVEFUVVMpOwotCQl2YWwgPSB2YWwgfCAoc2VjX251bSA8PCBzaGlmdF9wYXJhbSk7Ci0JCWl3bF93cml0ZV9kaXJlY3QzMih0cmFucywgRkhfVUNPREVfTE9BRF9TVEFUVVMsIHZhbCk7CisJCS8qIE5vdGlmeSB1Y29kZSBvZiBsb2FkZWQgc2VjdGlvbiBudW1iZXIgYW5kIHN0YXR1cyAqLworCQlpZiAodHJhbnMtPmNmZy0+dXNlX3RmaCkgeworCQkJdmFsID0gaXdsX3JlYWRfcHJwaCh0cmFucywgVVJFR19VQ09ERV9MT0FEX1NUQVRVUyk7CisJCQl2YWwgPSB2YWwgfCAoc2VjX251bSA8PCBzaGlmdF9wYXJhbSk7CisJCQlpd2xfd3JpdGVfcHJwaCh0cmFucywgVVJFR19VQ09ERV9MT0FEX1NUQVRVUywgdmFsKTsKKwkJfSBlbHNlIHsKKwkJCXZhbCA9IGl3bF9yZWFkX2RpcmVjdDMyKHRyYW5zLCBGSF9VQ09ERV9MT0FEX1NUQVRVUyk7CisJCQl2YWwgPSB2YWwgfCAoc2VjX251bSA8PCBzaGlmdF9wYXJhbSk7CisJCQlpd2xfd3JpdGVfZGlyZWN0MzIodHJhbnMsIEZIX1VDT0RFX0xPQURfU1RBVFVTLCB2YWwpOworCQl9CiAJCXNlY19udW0gPSAoc2VjX251bSA8PCAxKSB8IDB4MTsKIAl9CiAKQEAgLTgzOCwxMCArODQ0LDIxIEBACiAKIAlpd2xfZW5hYmxlX2ludGVycnVwdHModHJhbnMpOwogCi0JaWYgKGNwdSA9PSAxKQotCQlpd2xfd3JpdGVfZGlyZWN0MzIodHJhbnMsIEZIX1VDT0RFX0xPQURfU1RBVFVTLCAweEZGRkYpOwotCWVsc2UKLQkJaXdsX3dyaXRlX2RpcmVjdDMyKHRyYW5zLCBGSF9VQ09ERV9MT0FEX1NUQVRVUywgMHhGRkZGRkZGRik7CisJaWYgKHRyYW5zLT5jZmctPnVzZV90ZmgpIHsKKwkJaWYgKGNwdSA9PSAxKQorCQkJaXdsX3dyaXRlX3BycGgodHJhbnMsIFVSRUdfVUNPREVfTE9BRF9TVEFUVVMsCisJCQkJICAgICAgIDB4RkZGRik7CisJCWVsc2UKKwkJCWl3bF93cml0ZV9wcnBoKHRyYW5zLCBVUkVHX1VDT0RFX0xPQURfU1RBVFVTLAorCQkJCSAgICAgICAweEZGRkZGRkZGKTsKKwl9IGVsc2UgeworCQlpZiAoY3B1ID09IDEpCisJCQlpd2xfd3JpdGVfZGlyZWN0MzIodHJhbnMsIEZIX1VDT0RFX0xPQURfU1RBVFVTLAorCQkJCQkgICAweEZGRkYpOworCQllbHNlCisJCQlpd2xfd3JpdGVfZGlyZWN0MzIodHJhbnMsIEZIX1VDT0RFX0xPQURfU1RBVFVTLAorCQkJCQkgICAweEZGRkZGRkZGKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTg4NiwxNCArOTAzLDYgQEAKIAkJCXJldHVybiByZXQ7CiAJfQogCi0JaWYgKHRyYW5zLT5jZmctPmRldmljZV9mYW1pbHkgPT0gSVdMX0RFVklDRV9GQU1JTFlfODAwMCkKLQkJaXdsX3NldF9iaXRzX3BycGgodHJhbnMsCi0JCQkJICBDU1JfVUNPREVfTE9BRF9TVEFUVVNfQUREUiwKLQkJCQkgIChMTVBNX0NQVV9VQ09ERV9MT0FESU5HX0NPTVBMRVRFRCB8Ci0JCQkJICAgTE1QTV9DUFVfSERSU19MT0FESU5HX0NPTVBMRVRFRCB8Ci0JCQkJICAgTE1QTV9DUFVfVUNPREVfTE9BRElOR19TVEFSVEVEKSA8PAotCQkJCQlzaGlmdF9wYXJhbSk7Ci0KIAkqZmlyc3RfdWNvZGVfc2VjdGlvbiA9IGxhc3RfcmVhZF9pZHg7CiAKIAlyZXR1cm4gMDsKQEAgLTExNjEsNyArMTE3MCw3IEBACiAJaWYgKHRyYW5zX3BjaWUtPm1zaXhfZW5hYmxlZCkgewogCQlpbnQgaTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgdHJhbnNfcGNpZS0+YWxsb2NhdGVkX3ZlY3RvcjsgaSsrKQorCQlmb3IgKGkgPSAwOyBpIDwgdHJhbnNfcGNpZS0+YWxsb2NfdmVjczsgaSsrKQogCQkJc3luY2hyb25pemVfaXJxKHRyYW5zX3BjaWUtPm1zaXhfZW50cmllc1tpXS52ZWN0b3IpOwogCX0gZWxzZSB7CiAJCXN5bmNocm9uaXplX2lycSh0cmFuc19wY2llLT5wY2lfZGV2LT5pcnEpOwpAQCAtMTQyMCwxMyArMTQyOSw1OCBAQAogCXtNU0lYX0hXX0lOVF9DQVVTRVNfUkVHX0hBUCwJCUNTUl9NU0lYX0hXX0lOVF9NQVNLX0FELCAweDJFfSwKIH07CiAKK3N0YXRpYyB2b2lkIGl3bF9wY2llX21hcF9ub25fcnhfY2F1c2VzKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQoreworCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9ICBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOworCWludCB2YWwgPSB0cmFuc19wY2llLT5kZWZfaXJxIHwgTVNJWF9OT05fQVVUT19DTEVBUl9DQVVTRTsKKwlpbnQgaTsKKworCS8qCisJICogQWNjZXNzIGFsbCBub24gUlggY2F1c2VzIGFuZCBtYXAgdGhlbSB0byB0aGUgZGVmYXVsdCBpcnEuCisJICogSW4gY2FzZSB3ZSBhcmUgbWlzc2luZyBhdCBsZWFzdCBvbmUgaW50ZXJydXB0IHZlY3RvciwKKwkgKiB0aGUgZmlyc3QgaW50ZXJydXB0IHZlY3RvciB3aWxsIHNlcnZlIG5vbi1SWCBhbmQgRkJRIGNhdXNlcy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjYXVzZXNfbGlzdCk7IGkrKykgeworCQlpd2xfd3JpdGU4KHRyYW5zLCBDU1JfTVNJWF9JVkFSKGNhdXNlc19saXN0W2ldLmFkZHIpLCB2YWwpOworCQlpd2xfY2xlYXJfYml0KHRyYW5zLCBjYXVzZXNfbGlzdFtpXS5tYXNrX3JlZywKKwkJCSAgICAgIGNhdXNlc19saXN0W2ldLmNhdXNlX251bSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpd2xfcGNpZV9tYXBfcnhfY2F1c2VzKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQoreworCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CisJdTMyIG9mZnNldCA9CisJCXRyYW5zX3BjaWUtPnNoYXJlZF92ZWNfbWFzayAmIElXTF9TSEFSRURfSVJRX0ZJUlNUX1JTUyA/IDEgOiAwOworCXUzMiB2YWwsIGlkeDsKKworCS8qCisJICogVGhlIGZpcnN0IFJYIHF1ZXVlIC0gZmFsbGJhY2sgcXVldWUsIHdoaWNoIGlzIGRlc2lnbmF0ZWQgZm9yCisJICogbWFuYWdlbWVudCBmcmFtZSwgY29tbWFuZCByZXNwb25zZXMgZXRjLCBpcyBhbHdheXMgbWFwcGVkIHRvIHRoZQorCSAqIGZpcnN0IGludGVycnVwdCB2ZWN0b3IuIFRoZSBvdGhlciBSWCBxdWV1ZXMgYXJlIG1hcHBlZCB0bworCSAqIHRoZSBvdGhlciAoTiAtIDIpIGludGVycnVwdCB2ZWN0b3JzLgorCSAqLworCXZhbCA9IEJJVChNU0lYX0ZIX0lOVF9DQVVTRVNfUSgwKSk7CisJZm9yIChpZHggPSAxOyBpZHggPCB0cmFucy0+bnVtX3J4X3F1ZXVlczsgaWR4KyspIHsKKwkJaXdsX3dyaXRlOCh0cmFucywgQ1NSX01TSVhfUlhfSVZBUihpZHgpLAorCQkJICAgTVNJWF9GSF9JTlRfQ0FVU0VTX1EoaWR4IC0gb2Zmc2V0KSk7CisJCXZhbCB8PSBCSVQoTVNJWF9GSF9JTlRfQ0FVU0VTX1EoaWR4KSk7CisJfQorCWl3bF93cml0ZTMyKHRyYW5zLCBDU1JfTVNJWF9GSF9JTlRfTUFTS19BRCwgfnZhbCk7CisKKwl2YWwgPSBNU0lYX0ZIX0lOVF9DQVVTRVNfUSgwKTsKKwlpZiAodHJhbnNfcGNpZS0+c2hhcmVkX3ZlY19tYXNrICYgSVdMX1NIQVJFRF9JUlFfTk9OX1JYKQorCQl2YWwgfD0gTVNJWF9OT05fQVVUT19DTEVBUl9DQVVTRTsKKwlpd2xfd3JpdGU4KHRyYW5zLCBDU1JfTVNJWF9SWF9JVkFSKDApLCB2YWwpOworCisJaWYgKHRyYW5zX3BjaWUtPnNoYXJlZF92ZWNfbWFzayAmIElXTF9TSEFSRURfSVJRX0ZJUlNUX1JTUykKKwkJaXdsX3dyaXRlOCh0cmFucywgQ1NSX01TSVhfUlhfSVZBUigxKSwgdmFsKTsKK30KKwogc3RhdGljIHZvaWQgaXdsX3BjaWVfaW5pdF9tc2l4KHN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSkKIHsKLQl1MzIgdmFsLCBtYXhfcnhfdmVjdG9yLCBpOwogCXN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zID0gdHJhbnNfcGNpZS0+dHJhbnM7CiAKLQltYXhfcnhfdmVjdG9yID0gdHJhbnNfcGNpZS0+YWxsb2NhdGVkX3ZlY3RvciAtIDE7Ci0KIAlpZiAoIXRyYW5zX3BjaWUtPm1zaXhfZW5hYmxlZCkgewogCQlpZiAodHJhbnMtPmNmZy0+bXFfcnhfc3VwcG9ydGVkKQogCQkJaXdsX3dyaXRlX3BycGgodHJhbnMsIFVSRUdfQ0hJQ0ssCkBAIC0xNDM3LDI1ICsxNDkxLDE2IEBACiAJaXdsX3dyaXRlX3BycGgodHJhbnMsIFVSRUdfQ0hJQ0ssIFVSRUdfQ0hJQ0tfTVNJWF9FTkFCTEUpOwogCiAJLyoKLQkgKiBFYWNoIGNhdXNlIGZyb20gdGhlIGxpc3QgYWJvdmUgYW5kIHRoZSBSWCBjYXVzZXMgaXMgcmVwcmVzZW50ZWQgYXMKLQkgKiBhIGJ5dGUgaW4gdGhlIElWQVIgdGFibGUuIFdlIGFjY2VzcyB0aGUgZmlyc3QgKE4gLSAxKSBieXRlcyBhbmQgbWFwCi0JICogdGhlbSB0byB0aGUgKE4gLSAxKSB2ZWN0b3JzIHNvIHRoZXNlIHZlY3RvcnMgd2lsbCBiZSB1c2VkIGFzIHJ4Ci0JICogdmVjdG9ycy4gVGhlbiBhY2Nlc3MgYWxsIG5vbiByeCBjYXVzZXMgYW5kIG1hcCB0aGVtIHRvIHRoZQotCSAqIGRlZmF1bHQgcXVldWUgKE4ndGggcXVldWUpLgorCSAqIEVhY2ggY2F1c2UgZnJvbSB0aGUgY2F1c2VzIGxpc3QgYWJvdmUgYW5kIHRoZSBSWCBjYXVzZXMgaXMKKwkgKiByZXByZXNlbnRlZCBhcyBhIGJ5dGUgaW4gdGhlIElWQVIgdGFibGUuIFRoZSBmaXJzdCBuaWJibGUKKwkgKiByZXByZXNlbnRzIHRoZSBib3VuZCBpbnRlcnJ1cHQgdmVjdG9yIG9mIHRoZSBjYXVzZSwgdGhlIHNlY29uZAorCSAqIHJlcHJlc2VudHMgbm8gYXV0byBjbGVhciBmb3IgdGhpcyBjYXVzZS4gVGhpcyB3aWxsIGJlIHNldCBpZiBpdHMKKwkgKiBpbnRlcnJ1cHQgdmVjdG9yIGlzIGJvdW5kIHRvIHNlcnZlIG90aGVyIGNhdXNlcy4KIAkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbWF4X3J4X3ZlY3RvcjsgaSsrKSB7Ci0JCWl3bF93cml0ZTgodHJhbnMsIENTUl9NU0lYX1JYX0lWQVIoaSksIE1TSVhfRkhfSU5UX0NBVVNFU19RKGkpKTsKLQkJaXdsX2NsZWFyX2JpdCh0cmFucywgQ1NSX01TSVhfRkhfSU5UX01BU0tfQUQsCi0JCQkgICAgICBCSVQoTVNJWF9GSF9JTlRfQ0FVU0VTX1EoaSkpKTsKLQl9CisJaXdsX3BjaWVfbWFwX3J4X2NhdXNlcyh0cmFucyk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjYXVzZXNfbGlzdCk7IGkrKykgewotCQl2YWwgPSB0cmFuc19wY2llLT5kZWZhdWx0X2lycV9udW0gfAotCQkJTVNJWF9OT05fQVVUT19DTEVBUl9DQVVTRTsKLQkJaXdsX3dyaXRlOCh0cmFucywgQ1NSX01TSVhfSVZBUihjYXVzZXNfbGlzdFtpXS5hZGRyKSwgdmFsKTsKLQkJaXdsX2NsZWFyX2JpdCh0cmFucywgY2F1c2VzX2xpc3RbaV0ubWFza19yZWcsCi0JCQkgICAgICBjYXVzZXNfbGlzdFtpXS5jYXVzZV9udW0pOwotCX0KKwlpd2xfcGNpZV9tYXBfbm9uX3J4X2NhdXNlcyh0cmFucyk7CisKIAl0cmFuc19wY2llLT5maF9pbml0X21hc2sgPQogCQl+aXdsX3JlYWQzMih0cmFucywgQ1NSX01TSVhfRkhfSU5UX01BU0tfQUQpOwogCXRyYW5zX3BjaWUtPmZoX21hc2sgPSB0cmFuc19wY2llLT5maF9pbml0X21hc2s7CkBAIC0xNDY4LDQwICsxNTEzLDU1IEBACiAJCQkJCXN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQogewogCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CisJaW50IG1heF9pcnFzLCBudW1faXJxcywgaSwgcmV0LCBucl9vbmxpbmVfY3B1czsKIAl1MTYgcGNpX2NtZDsKLQlpbnQgbWF4X3ZlY3RvcjsKLQlpbnQgcmV0LCBpOwogCi0JaWYgKHRyYW5zLT5jZmctPm1xX3J4X3N1cHBvcnRlZCkgewotCQltYXhfdmVjdG9yID0gbWluX3QodTMyLCAobnVtX3Bvc3NpYmxlX2NwdXMoKSArIDIpLAotCQkJCSAgIElXTF9NQVhfUlhfSFdfUVVFVUVTKTsKLQkJZm9yIChpID0gMDsgaSA8IG1heF92ZWN0b3I7IGkrKykKLQkJCXRyYW5zX3BjaWUtPm1zaXhfZW50cmllc1tpXS5lbnRyeSA9IGk7CisJaWYgKCF0cmFucy0+Y2ZnLT5tcV9yeF9zdXBwb3J0ZWQpCisJCWdvdG8gZW5hYmxlX21zaTsKIAotCQlyZXQgPSBwY2lfZW5hYmxlX21zaXhfcmFuZ2UocGRldiwgdHJhbnNfcGNpZS0+bXNpeF9lbnRyaWVzLAotCQkJCQkgICAgTVNJWF9NSU5fSU5URVJSVVBUX1ZFQ1RPUlMsCi0JCQkJCSAgICBtYXhfdmVjdG9yKTsKLQkJaWYgKHJldCA+IDEpIHsKLQkJCUlXTF9ERUJVR19JTkZPKHRyYW5zLAotCQkJCSAgICAgICAiRW5hYmxlIE1TSS1YIGFsbG9jYXRlICVkIGludGVycnVwdCB2ZWN0b3JcbiIsCi0JCQkJICAgICAgIHJldCk7Ci0JCQl0cmFuc19wY2llLT5hbGxvY2F0ZWRfdmVjdG9yID0gcmV0OwotCQkJdHJhbnNfcGNpZS0+ZGVmYXVsdF9pcnFfbnVtID0KLQkJCQl0cmFuc19wY2llLT5hbGxvY2F0ZWRfdmVjdG9yIC0gMTsKLQkJCXRyYW5zX3BjaWUtPnRyYW5zLT5udW1fcnhfcXVldWVzID0KLQkJCQl0cmFuc19wY2llLT5hbGxvY2F0ZWRfdmVjdG9yIC0gMTsKLQkJCXRyYW5zX3BjaWUtPm1zaXhfZW5hYmxlZCA9IHRydWU7CisJbnJfb25saW5lX2NwdXMgPSBudW1fb25saW5lX2NwdXMoKTsKKwltYXhfaXJxcyA9IG1pbl90KHUzMiwgbnJfb25saW5lX2NwdXMgKyAyLCBJV0xfTUFYX1JYX0hXX1FVRVVFUyk7CisJZm9yIChpID0gMDsgaSA8IG1heF9pcnFzOyBpKyspCisJCXRyYW5zX3BjaWUtPm1zaXhfZW50cmllc1tpXS5lbnRyeSA9IGk7CiAKLQkJCXJldHVybjsKLQkJfQorCW51bV9pcnFzID0gcGNpX2VuYWJsZV9tc2l4X3JhbmdlKHBkZXYsIHRyYW5zX3BjaWUtPm1zaXhfZW50cmllcywKKwkJCQkJIE1TSVhfTUlOX0lOVEVSUlVQVF9WRUNUT1JTLAorCQkJCQkgbWF4X2lycXMpOworCWlmIChudW1faXJxcyA8IDApIHsKIAkJSVdMX0RFQlVHX0lORk8odHJhbnMsCi0JCQkgICAgICAgInJldCA9ICVkICVzIG1vdmUgdG8gbXNpIG1vZGVcbiIsIHJldCwKLQkJCSAgICAgICAocmV0ID09IDEpID8KLQkJCSAgICAgICAiY2FuJ3QgYWxsb2NhdGUgbW9yZSB0aGFuIDEgaW50ZXJydXB0IHZlY3RvciIgOgotCQkJICAgICAgICJmYWlsZWQgdG8gZW5hYmxlIG1zaS14IG1vZGUiKTsKLQkJcGNpX2Rpc2FibGVfbXNpeChwZGV2KTsKKwkJCSAgICAgICAiRmFpbGVkIHRvIGVuYWJsZSBtc2kteCBtb2RlIChyZXQgJWQpLiBNb3ZpbmcgdG8gbXNpIG1vZGUuXG4iLAorCQkJICAgICAgIG51bV9pcnFzKTsKKwkJZ290byBlbmFibGVfbXNpOworCX0KKwl0cmFuc19wY2llLT5kZWZfaXJxID0gKG51bV9pcnFzID09IG1heF9pcnFzKSA/IG51bV9pcnFzIC0gMSA6IDA7CisKKwlJV0xfREVCVUdfSU5GTyh0cmFucywKKwkJICAgICAgICJNU0ktWCBlbmFibGVkLiAlZCBpbnRlcnJ1cHQgdmVjdG9ycyB3ZXJlIGFsbG9jYXRlZFxuIiwKKwkJICAgICAgIG51bV9pcnFzKTsKKworCS8qCisJICogSW4gY2FzZSB0aGUgT1MgcHJvdmlkZXMgZmV3ZXIgaW50ZXJydXB0cyB0aGFuIHJlcXVlc3RlZCwgZGlmZmVyZW50CisJICogY2F1c2VzIHdpbGwgc2hhcmUgdGhlIHNhbWUgaW50ZXJydXB0IHZlY3RvciBhcyBmb2xsb3dzOgorCSAqIE9uZSBpbnRlcnJ1cHQgbGVzczogbm9uIHJ4IGNhdXNlcyBzaGFyZWQgd2l0aCBGQlEuCisJICogVHdvIGludGVycnVwdHMgbGVzczogbm9uIHJ4IGNhdXNlcyBzaGFyZWQgd2l0aCBGQlEgYW5kIFJTUy4KKwkgKiBNb3JlIHRoYW4gdHdvIGludGVycnVwdHM6IHdlIHdpbGwgdXNlIGZld2VyIFJTUyBxdWV1ZXMuCisJICovCisJaWYgKG51bV9pcnFzIDw9IG5yX29ubGluZV9jcHVzKSB7CisJCXRyYW5zX3BjaWUtPnRyYW5zLT5udW1fcnhfcXVldWVzID0gbnVtX2lycXMgKyAxOworCQl0cmFuc19wY2llLT5zaGFyZWRfdmVjX21hc2sgPSBJV0xfU0hBUkVEX0lSUV9OT05fUlggfAorCQkJSVdMX1NIQVJFRF9JUlFfRklSU1RfUlNTOworCX0gZWxzZSBpZiAobnVtX2lycXMgPT0gbnJfb25saW5lX2NwdXMgKyAxKSB7CisJCXRyYW5zX3BjaWUtPnRyYW5zLT5udW1fcnhfcXVldWVzID0gbnVtX2lycXM7CisJCXRyYW5zX3BjaWUtPnNoYXJlZF92ZWNfbWFzayA9IElXTF9TSEFSRURfSVJRX05PTl9SWDsKKwl9IGVsc2UgeworCQl0cmFuc19wY2llLT50cmFucy0+bnVtX3J4X3F1ZXVlcyA9IG51bV9pcnFzIC0gMTsKIAl9CiAKKwl0cmFuc19wY2llLT5hbGxvY192ZWNzID0gbnVtX2lycXM7CisJdHJhbnNfcGNpZS0+bXNpeF9lbmFibGVkID0gdHJ1ZTsKKwlyZXR1cm47CisKK2VuYWJsZV9tc2k6CiAJcmV0ID0gcGNpX2VuYWJsZV9tc2kocGRldik7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwY2lfZW5hYmxlX21zaSBmYWlsZWQgLSAlZFxuIiwgcmV0KTsKQEAgLTE1MTQsMzYgKzE1NzQsNTcgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGl3bF9wY2llX2lycV9zZXRfYWZmaW5pdHkoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpCit7CisJaW50IGl0ZXJfcnhfcSwgaSwgcmV0LCBjcHUsIG9mZnNldDsKKwlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOworCisJaSA9IHRyYW5zX3BjaWUtPnNoYXJlZF92ZWNfbWFzayAmIElXTF9TSEFSRURfSVJRX0ZJUlNUX1JTUyA/IDAgOiAxOworCWl0ZXJfcnhfcSA9IHRyYW5zX3BjaWUtPnRyYW5zLT5udW1fcnhfcXVldWVzIC0gMSArIGk7CisJb2Zmc2V0ID0gMSArIGk7CisJZm9yICg7IGkgPCBpdGVyX3J4X3EgOyBpKyspIHsKKwkJLyoKKwkJICogR2V0IHRoZSBjcHUgcHJpb3IgdG8gdGhlIHBsYWNlIHRvIHNlYXJjaAorCQkgKiAoaS5lLiByZXR1cm4gd2lsbCBiZSA+IGkgLSAxKS4KKwkJICovCisJCWNwdSA9IGNwdW1hc2tfbmV4dChpIC0gb2Zmc2V0LCBjcHVfb25saW5lX21hc2spOworCQljcHVtYXNrX3NldF9jcHUoY3B1LCAmdHJhbnNfcGNpZS0+YWZmaW5pdHlfbWFza1tpXSk7CisJCXJldCA9IGlycV9zZXRfYWZmaW5pdHlfaGludCh0cmFuc19wY2llLT5tc2l4X2VudHJpZXNbaV0udmVjdG9yLAorCQkJCQkgICAgJnRyYW5zX3BjaWUtPmFmZmluaXR5X21hc2tbaV0pOworCQlpZiAocmV0KQorCQkJSVdMX0VSUih0cmFuc19wY2llLT50cmFucywKKwkJCQkiRmFpbGVkIHRvIHNldCBhZmZpbml0eSBtYXNrIGZvciBJUlEgJWRcbiIsCisJCQkJaSk7CisJfQorfQorCiBzdGF0aWMgaW50IGl3bF9wY2llX2luaXRfbXNpeF9oYW5kbGVyKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgICAgIHN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSkKIHsKLQlpbnQgaSwgbGFzdF92ZWN0b3I7CisJaW50IGk7CiAKLQlsYXN0X3ZlY3RvciA9IHRyYW5zX3BjaWUtPnRyYW5zLT5udW1fcnhfcXVldWVzOwotCi0JZm9yIChpID0gMDsgaSA8IHRyYW5zX3BjaWUtPmFsbG9jYXRlZF92ZWN0b3I7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCB0cmFuc19wY2llLT5hbGxvY192ZWNzOyBpKyspIHsKIAkJaW50IHJldDsKKwkJc3RydWN0IG1zaXhfZW50cnkgKm1zaXhfZW50cnk7CiAKLQkJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEodHJhbnNfcGNpZS0+bXNpeF9lbnRyaWVzW2ldLnZlY3RvciwKLQkJCQkJICAgaXdsX3BjaWVfbXNpeF9pc3IsCi0JCQkJCSAgIChpID09IGxhc3RfdmVjdG9yKSA/Ci0JCQkJCSAgIGl3bF9wY2llX2lycV9tc2l4X2hhbmRsZXIgOgotCQkJCQkgICBpd2xfcGNpZV9pcnFfcnhfbXNpeF9oYW5kbGVyLAotCQkJCQkgICBJUlFGX1NIQVJFRCwKLQkJCQkJICAgRFJWX05BTUUsCi0JCQkJCSAgICZ0cmFuc19wY2llLT5tc2l4X2VudHJpZXNbaV0pOworCQltc2l4X2VudHJ5ID0gJnRyYW5zX3BjaWUtPm1zaXhfZW50cmllc1tpXTsKKwkJcmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycSgmcGRldi0+ZGV2LAorCQkJCQkJbXNpeF9lbnRyeS0+dmVjdG9yLAorCQkJCQkJaXdsX3BjaWVfbXNpeF9pc3IsCisJCQkJCQkoaSA9PSB0cmFuc19wY2llLT5kZWZfaXJxKSA/CisJCQkJCQlpd2xfcGNpZV9pcnFfbXNpeF9oYW5kbGVyIDoKKwkJCQkJCWl3bF9wY2llX2lycV9yeF9tc2l4X2hhbmRsZXIsCisJCQkJCQlJUlFGX1NIQVJFRCwKKwkJCQkJCURSVl9OQU1FLAorCQkJCQkJbXNpeF9lbnRyeSk7CiAJCWlmIChyZXQpIHsKLQkJCWludCBqOwotCiAJCQlJV0xfRVJSKHRyYW5zX3BjaWUtPnRyYW5zLAogCQkJCSJFcnJvciBhbGxvY2F0aW5nIElSUSAlZFxuIiwgaSk7Ci0JCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQotCQkJCWZyZWVfaXJxKHRyYW5zX3BjaWUtPm1zaXhfZW50cmllc1tqXS52ZWN0b3IsCi0JCQkJCSAmdHJhbnNfcGNpZS0+bXNpeF9lbnRyaWVzW2pdKTsKLQkJCXBjaV9kaXNhYmxlX21zaXgocGRldik7CisKIAkJCXJldHVybiByZXQ7CiAJCX0KIAl9CisJaXdsX3BjaWVfaXJxX3NldF9hZmZpbml0eSh0cmFuc19wY2llLT50cmFucyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE2NzIsNyArMTc1Myw2IEBACiAJdHJhbnNfcGNpZS0+cnhfcGFnZV9vcmRlciA9CiAJCWl3bF90cmFuc19nZXRfcmJfc2l6ZV9vcmRlcih0cmFuc19wY2llLT5yeF9idWZfc2l6ZSk7CiAKLQl0cmFuc19wY2llLT53aWRlX2NtZF9oZWFkZXIgPSB0cmFuc19jZmctPndpZGVfY21kX2hlYWRlcjsKIAl0cmFuc19wY2llLT5iY190YWJsZV9kd29yZCA9IHRyYW5zX2NmZy0+YmNfdGFibGVfZHdvcmQ7CiAJdHJhbnNfcGNpZS0+c2NkX3NldF9hY3RpdmUgPSB0cmFuc19jZmctPnNjZF9zZXRfYWN0aXZlOwogCXRyYW5zX3BjaWUtPnN3X2NzdW1fdHggPSB0cmFuc19jZmctPnN3X2NzdW1fdHg7CkBAIC0xNzAzLDIyICsxNzgzLDE2IEBACiAJaXdsX3BjaWVfcnhfZnJlZSh0cmFucyk7CiAKIAlpZiAodHJhbnNfcGNpZS0+bXNpeF9lbmFibGVkKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCB0cmFuc19wY2llLT5hbGxvY2F0ZWRfdmVjdG9yOyBpKyspCi0JCQlmcmVlX2lycSh0cmFuc19wY2llLT5tc2l4X2VudHJpZXNbaV0udmVjdG9yLAotCQkJCSAmdHJhbnNfcGNpZS0+bXNpeF9lbnRyaWVzW2ldKTsKKwkJZm9yIChpID0gMDsgaSA8IHRyYW5zX3BjaWUtPmFsbG9jX3ZlY3M7IGkrKykgeworCQkJaXJxX3NldF9hZmZpbml0eV9oaW50KAorCQkJCXRyYW5zX3BjaWUtPm1zaXhfZW50cmllc1tpXS52ZWN0b3IsCisJCQkJTlVMTCk7CisJCX0KIAotCQlwY2lfZGlzYWJsZV9tc2l4KHRyYW5zX3BjaWUtPnBjaV9kZXYpOwogCQl0cmFuc19wY2llLT5tc2l4X2VuYWJsZWQgPSBmYWxzZTsKIAl9IGVsc2UgewotCQlmcmVlX2lycSh0cmFuc19wY2llLT5wY2lfZGV2LT5pcnEsIHRyYW5zKTsKLQogCQlpd2xfcGNpZV9mcmVlX2ljdCh0cmFucyk7Ci0KLQkJcGNpX2Rpc2FibGVfbXNpKHRyYW5zX3BjaWUtPnBjaV9kZXYpOwogCX0KLQlpb3VubWFwKHRyYW5zX3BjaWUtPmh3X2Jhc2UpOwotCXBjaV9yZWxlYXNlX3JlZ2lvbnModHJhbnNfcGNpZS0+cGNpX2Rldik7Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHRyYW5zX3BjaWUtPnBjaV9kZXYpOwogCiAJaXdsX3BjaWVfZnJlZV9md19tb25pdG9yKHRyYW5zKTsKIApAQCAtMTg5MCw3ICsxOTY0LDcgQEAKIAogCQl0eHEtPmZyb3plbiA9IGZyZWV6ZTsKIAotCQlpZiAodHhxLT5xLnJlYWRfcHRyID09IHR4cS0+cS53cml0ZV9wdHIpCisJCWlmICh0eHEtPnJlYWRfcHRyID09IHR4cS0+d3JpdGVfcHRyKQogCQkJZ290byBuZXh0X3F1ZXVlOwogCiAJCWlmIChmcmVlemUpIHsKQEAgLTE5MzgsNyArMjAxMiw3IEBACiAJCQl0eHEtPmJsb2NrLS07CiAJCQlpZiAoIXR4cS0+YmxvY2spIHsKIAkJCQlpd2xfd3JpdGUzMih0cmFucywgSEJVU19UQVJHX1dSUFRSLAotCQkJCQkgICAgdHhxLT5xLndyaXRlX3B0ciB8IChpIDw8IDgpKTsKKwkJCQkJICAgIHR4cS0+d3JpdGVfcHRyIHwgKGkgPDwgOCkpOwogCQkJfQogCQl9IGVsc2UgaWYgKGJsb2NrKSB7CiAJCQl0eHEtPmJsb2NrKys7CkBAIC0xOTU4LDEwICsyMDMyLDE0IEBACiAJaW50IGNudDsKIAogCUlXTF9FUlIodHJhbnMsICJDdXJyZW50IFNXIHJlYWRfcHRyICVkIHdyaXRlX3B0ciAlZFxuIiwKLQkJdHhxLT5xLnJlYWRfcHRyLCB0eHEtPnEud3JpdGVfcHRyKTsKKwkJdHhxLT5yZWFkX3B0ciwgdHhxLT53cml0ZV9wdHIpOworCisJaWYgKHRyYW5zLT5jZmctPnVzZV90ZmgpCisJCS8qIFRPRE86IGFjY2VzcyBuZXcgU0NEIHJlZ2lzdGVycyBhbmQgZHVtcCB0aGVtICovCisJCXJldHVybjsKIAogCXNjZF9zcmFtX2FkZHIgPSB0cmFuc19wY2llLT5zY2RfYmFzZV9hZGRyICsKLQkJCVNDRF9UWF9TVFRTX1FVRVVFX09GRlNFVCh0eHEtPnEuaWQpOworCQkJU0NEX1RYX1NUVFNfUVVFVUVfT0ZGU0VUKHR4cS0+aWQpOwogCWl3bF90cmFuc19yZWFkX21lbV9ieXRlcyh0cmFucywgc2NkX3NyYW1fYWRkciwgYnVmLCBzaXplb2YoYnVmKSk7CiAKIAlpd2xfcHJpbnRfaGV4X2Vycm9yKHRyYW5zLCBidWYsIHNpemVvZihidWYpKTsKQEAgLTE5OTYsNyArMjA3NCw2IEBACiB7CiAJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0gSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKIAlzdHJ1Y3QgaXdsX3R4cSAqdHhxOwotCXN0cnVjdCBpd2xfcXVldWUgKnE7CiAJaW50IGNudDsKIAl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CiAJaW50IHJldCA9IDA7CkBAIC0yMDE0LDEzICsyMDkxLDEyIEBACiAKIAkJSVdMX0RFQlVHX1RYX1FVRVVFUyh0cmFucywgIkVtcHR5aW5nIHF1ZXVlICVkLi4uXG4iLCBjbnQpOwogCQl0eHEgPSAmdHJhbnNfcGNpZS0+dHhxW2NudF07Ci0JCXEgPSAmdHhxLT5xOwotCQl3cl9wdHIgPSBBQ0NFU1NfT05DRShxLT53cml0ZV9wdHIpOworCQl3cl9wdHIgPSBBQ0NFU1NfT05DRSh0eHEtPndyaXRlX3B0cik7CiAKLQkJd2hpbGUgKHEtPnJlYWRfcHRyICE9IEFDQ0VTU19PTkNFKHEtPndyaXRlX3B0cikgJiYKKwkJd2hpbGUgKHR4cS0+cmVhZF9wdHIgIT0gQUNDRVNTX09OQ0UodHhxLT53cml0ZV9wdHIpICYmCiAJCSAgICAgICAhdGltZV9hZnRlcihqaWZmaWVzLAogCQkJCSAgIG5vdyArIG1zZWNzX3RvX2ppZmZpZXMoSVdMX0ZMVVNIX1dBSVRfTVMpKSkgewotCQkJdTggd3JpdGVfcHRyID0gQUNDRVNTX09OQ0UocS0+d3JpdGVfcHRyKTsKKwkJCXU4IHdyaXRlX3B0ciA9IEFDQ0VTU19PTkNFKHR4cS0+d3JpdGVfcHRyKTsKIAogCQkJaWYgKFdBUk5fT05DRSh3cl9wdHIgIT0gd3JpdGVfcHRyLAogCQkJCSAgICAgICJXUiBwb2ludGVyIG1vdmVkIHdoaWxlIGZsdXNoaW5nICVkIC0+ICVkXG4iLApAQCAtMjAyOSw3ICsyMTA1LDcgQEAKIAkJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKIAkJfQogCi0JCWlmIChxLT5yZWFkX3B0ciAhPSBxLT53cml0ZV9wdHIpIHsKKwkJaWYgKHR4cS0+cmVhZF9wdHIgIT0gdHhxLT53cml0ZV9wdHIpIHsKIAkJCUlXTF9FUlIodHJhbnMsCiAJCQkJImZhaWwgdG8gZmx1c2ggYWxsIHR4IGZpZm8gcXVldWVzIFEgJWRcbiIsIGNudCk7CiAJCQlyZXQgPSAtRVRJTUVET1VUOwpAQCAtMjE5Nyw3ICsyMjczLDYgQEAKIAlzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwogCXN0cnVjdCBpd2xfdHhxICp0eHE7Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcTsKIAljaGFyICpidWY7CiAJaW50IHBvcyA9IDA7CiAJaW50IGNudDsKQEAgLTIyMTUsMTAgKzIyOTAsOSBAQAogCiAJZm9yIChjbnQgPSAwOyBjbnQgPCB0cmFucy0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlczsgY250KyspIHsKIAkJdHhxID0gJnRyYW5zX3BjaWUtPnR4cVtjbnRdOwotCQlxID0gJnR4cS0+cTsKIAkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAogCQkJCSJod3EgJS4yZDogcmVhZD0ldSB3cml0ZT0ldSB1c2U9JWQgc3RvcD0lZCBuZWVkX3VwZGF0ZT0lZCBmcm96ZW49JWQlc1xuIiwKLQkJCQljbnQsIHEtPnJlYWRfcHRyLCBxLT53cml0ZV9wdHIsCisJCQkJY250LCB0eHEtPnJlYWRfcHRyLCB0eHEtPndyaXRlX3B0ciwKIAkJCQkhIXRlc3RfYml0KGNudCwgdHJhbnNfcGNpZS0+cXVldWVfdXNlZCksCiAJCQkJICEhdGVzdF9iaXQoY250LCB0cmFuc19wY2llLT5xdWV1ZV9zdG9wcGVkKSwKIAkJCQkgdHhxLT5uZWVkX3VwZGF0ZSwgdHhxLT5mcm96ZW4sCkBAIC0yNDI0LDEzICsyNDk4LDE0IEBACiB9CiAjZW5kaWYgLypDT05GSUdfSVdMV0lGSV9ERUJVR0ZTICovCiAKLXN0YXRpYyB1MzIgaXdsX3RyYW5zX3BjaWVfZ2V0X2NtZGxlbihzdHJ1Y3QgaXdsX3RmZCAqdGZkKQorc3RhdGljIHUzMiBpd2xfdHJhbnNfcGNpZV9nZXRfY21kbGVuKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCB2b2lkICp0ZmQpCiB7CisJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0gSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKIAl1MzIgY21kbGVuID0gMDsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBJV0xfTlVNX09GX1RCUzsgaSsrKQotCQljbWRsZW4gKz0gaXdsX3BjaWVfdGZkX3RiX2dldF9sZW4odGZkLCBpKTsKKwlmb3IgKGkgPSAwOyBpIDwgdHJhbnNfcGNpZS0+bWF4X3RiczsgaSsrKQorCQljbWRsZW4gKz0gaXdsX3BjaWVfdGZkX3RiX2dldF9sZW4odHJhbnMsIHRmZCwgaSk7CiAKIAlyZXR1cm4gY21kbGVuOwogfQpAQCAtMjY0NSw3ICsyNzIwLDcgQEAKIAogCS8qIGhvc3QgY29tbWFuZHMgKi8KIAlsZW4gKz0gc2l6ZW9mKCpkYXRhKSArCi0JCWNtZHEtPnEubl93aW5kb3cgKiAoc2l6ZW9mKCp0eGNtZCkgKyBURkRfTUFYX1BBWUxPQURfU0laRSk7CisJCWNtZHEtPm5fd2luZG93ICogKHNpemVvZigqdHhjbWQpICsgVEZEX01BWF9QQVlMT0FEX1NJWkUpOwogCiAJLyogRlcgbW9uaXRvciAqLwogCWlmICh0cmFuc19wY2llLT5md19tb25fcGFnZSkgewpAQCAtMjcxMywxMiArMjc4OCwxMyBAQAogCWRhdGEtPnR5cGUgPSBjcHVfdG9fbGUzMihJV0xfRldfRVJST1JfRFVNUF9UWENNRCk7CiAJdHhjbWQgPSAodm9pZCAqKWRhdGEtPmRhdGE7CiAJc3Bpbl9sb2NrX2JoKCZjbWRxLT5sb2NrKTsKLQlwdHIgPSBjbWRxLT5xLndyaXRlX3B0cjsKLQlmb3IgKGkgPSAwOyBpIDwgY21kcS0+cS5uX3dpbmRvdzsgaSsrKSB7Ci0JCXU4IGlkeCA9IGdldF9jbWRfaW5kZXgoJmNtZHEtPnEsIHB0cik7CisJcHRyID0gY21kcS0+d3JpdGVfcHRyOworCWZvciAoaSA9IDA7IGkgPCBjbWRxLT5uX3dpbmRvdzsgaSsrKSB7CisJCXU4IGlkeCA9IGdldF9jbWRfaW5kZXgoY21kcSwgcHRyKTsKIAkJdTMyIGNhcGxlbiwgY21kbGVuOwogCi0JCWNtZGxlbiA9IGl3bF90cmFuc19wY2llX2dldF9jbWRsZW4oJmNtZHEtPnRmZHNbcHRyXSk7CisJCWNtZGxlbiA9IGl3bF90cmFuc19wY2llX2dldF9jbWRsZW4odHJhbnMsIGNtZHEtPnRmZHMgKworCQkJCQkJICAgdHJhbnNfcGNpZS0+dGZkX3NpemUgKiBwdHIpOwogCQljYXBsZW4gPSBtaW5fdCh1MzIsIFRGRF9NQVhfUEFZTE9BRF9TSVpFLCBjbWRsZW4pOwogCiAJCWlmIChjbWRsZW4pIHsKQEAgLTI3ODgsNiArMjg2NCw4IEBACiAJLnR4cV9kaXNhYmxlID0gaXdsX3RyYW5zX3BjaWVfdHhxX2Rpc2FibGUsCiAJLnR4cV9lbmFibGUgPSBpd2xfdHJhbnNfcGNpZV90eHFfZW5hYmxlLAogCisJLmdldF90eHFfYnl0ZV90YWJsZSA9IGl3bF90cmFuc19wY2llX2dldF90eHFfYnl0ZV90YWJsZSwKKwogCS50eHFfc2V0X3NoYXJlZF9tb2RlID0gaXdsX3RyYW5zX3BjaWVfdHhxX3NldF9zaGFyZWRfbW9kZSwKIAogCS53YWl0X3R4X3F1ZXVlX2VtcHR5ID0gaXdsX3RyYW5zX3BjaWVfd2FpdF90eHFfZW1wdHksCkBAIC0yODIxLDEzICsyODk5LDE1IEBACiAJc3RydWN0IGl3bF90cmFucyAqdHJhbnM7CiAJaW50IHJldCwgYWRkcl9zaXplOwogCisJcmV0ID0gcGNpbV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyZXQpCisJCXJldHVybiBFUlJfUFRSKHJldCk7CisKIAl0cmFucyA9IGl3bF90cmFuc19hbGxvYyhzaXplb2Yoc3RydWN0IGl3bF90cmFuc19wY2llKSwKIAkJCQkmcGRldi0+ZGV2LCBjZmcsICZ0cmFuc19vcHNfcGNpZSwgMCk7CiAJaWYgKCF0cmFucykKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKLQl0cmFucy0+bWF4X3NrYl9mcmFncyA9IElXTF9QQ0lFX01BWF9GUkFHUzsKLQogCXRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwogCiAJdHJhbnNfcGNpZS0+dHJhbnMgPSB0cmFuczsKQEAgLTI4NDEsOSArMjkyMSw2IEBACiAJCWdvdG8gb3V0X25vX3BjaTsKIAl9CiAKLQlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKLQlpZiAocmV0KQotCQlnb3RvIG91dF9ub19wY2k7CiAKIAlpZiAoIWNmZy0+YmFzZV9wYXJhbXMtPnBjaWVfbDFfYWxsb3dlZCkgewogCQkvKgpAQCAtMjg2MSw2ICsyOTM4LDE2IEBACiAJZWxzZQogCQlhZGRyX3NpemUgPSAzNjsKIAorCWlmIChjZmctPnVzZV90ZmgpIHsKKwkJdHJhbnNfcGNpZS0+bWF4X3RicyA9IElXTF9URkhfTlVNX1RCUzsKKwkJdHJhbnNfcGNpZS0+dGZkX3NpemUgPSBzaXplb2Yoc3RydWN0IGl3bF90ZmhfdGZkKTsKKworCX0gZWxzZSB7CisJCXRyYW5zX3BjaWUtPm1heF90YnMgPSBJV0xfTlVNX09GX1RCUzsKKwkJdHJhbnNfcGNpZS0+dGZkX3NpemUgPSBzaXplb2Yoc3RydWN0IGl3bF90ZmQpOworCX0KKwl0cmFucy0+bWF4X3NrYl9mcmFncyA9IElXTF9QQ0lFX01BWF9GUkFHUyh0cmFuc19wY2llKTsKKwogCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwogCiAJcmV0ID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soYWRkcl9zaXplKSk7CkBAIC0yODc1LDIxICsyOTYyLDIxIEBACiAJCS8qIGJvdGggYXR0ZW1wdHMgZmFpbGVkOiAqLwogCQlpZiAocmV0KSB7CiAJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBzdWl0YWJsZSBETUEgYXZhaWxhYmxlXG4iKTsKLQkJCWdvdG8gb3V0X3BjaV9kaXNhYmxlX2RldmljZTsKKwkJCWdvdG8gb3V0X25vX3BjaTsKIAkJfQogCX0KIAotCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOworCXJldCA9IHBjaW1faW9tYXBfcmVnaW9uc19yZXF1ZXN0X2FsbChwZGV2LCBCSVQoMCksIERSVl9OQU1FKTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInBjaV9yZXF1ZXN0X3JlZ2lvbnMgZmFpbGVkXG4iKTsKLQkJZ290byBvdXRfcGNpX2Rpc2FibGVfZGV2aWNlOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwY2ltX2lvbWFwX3JlZ2lvbnNfcmVxdWVzdF9hbGwgZmFpbGVkXG4iKTsKKwkJZ290byBvdXRfbm9fcGNpOwogCX0KIAotCXRyYW5zX3BjaWUtPmh3X2Jhc2UgPSBwY2lfaW9yZW1hcF9iYXIocGRldiwgMCk7CisJdHJhbnNfcGNpZS0+aHdfYmFzZSA9IHBjaW1faW9tYXBfdGFibGUocGRldilbMF07CiAJaWYgKCF0cmFuc19wY2llLT5od19iYXNlKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInBjaV9pb3JlbWFwX2JhciBmYWlsZWRcbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwY2ltX2lvbWFwX3RhYmxlIGZhaWxlZFxuIik7CiAJCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0X3BjaV9yZWxlYXNlX3JlZ2lvbnM7CisJCWdvdG8gb3V0X25vX3BjaTsKIAl9CiAKIAkvKiBXZSBkaXNhYmxlIHRoZSBSRVRSWV9USU1FT1VUIHJlZ2lzdGVyICgweDQxKSB0byBrZWVwCkBAIC0yOTE2LDcgKzMwMDMsNyBAQAogCQlyZXQgPSBpd2xfcGNpZV9wcmVwYXJlX2NhcmRfaHcodHJhbnMpOwogCQlpZiAocmV0KSB7CiAJCQlJV0xfV0FSTih0cmFucywgIkV4aXQgSFcgbm90IHJlYWR5XG4iKTsKLQkJCWdvdG8gb3V0X3BjaV9kaXNhYmxlX21zaTsKKwkJCWdvdG8gb3V0X25vX3BjaTsKIAkJfQogCiAJCS8qCkBAIC0yOTMzLDcgKzMwMjAsNyBAQAogCQkJCSAgIDI1MDAwKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCUlXTF9ERUJVR19JTkZPKHRyYW5zLCAiRmFpbGVkIHRvIHdha2UgdXAgdGhlIG5pY1xuIik7Ci0JCQlnb3RvIG91dF9wY2lfZGlzYWJsZV9tc2k7CisJCQlnb3RvIG91dF9ub19wY2k7CiAJCX0KIAogCQlpZiAoaXdsX3RyYW5zX2dyYWJfbmljX2FjY2Vzcyh0cmFucywgJmZsYWdzKSkgewpAQCAtMjk2NSwxNSArMzA1MiwxNiBAQAogCiAJaWYgKHRyYW5zX3BjaWUtPm1zaXhfZW5hYmxlZCkgewogCQlpZiAoaXdsX3BjaWVfaW5pdF9tc2l4X2hhbmRsZXIocGRldiwgdHJhbnNfcGNpZSkpCi0JCQlnb3RvIG91dF9wY2lfcmVsZWFzZV9yZWdpb25zOworCQkJZ290byBvdXRfbm9fcGNpOwogCSB9IGVsc2UgewogCQlyZXQgPSBpd2xfcGNpZV9hbGxvY19pY3QodHJhbnMpOwogCQlpZiAocmV0KQotCQkJZ290byBvdXRfcGNpX2Rpc2FibGVfbXNpOworCQkJZ290byBvdXRfbm9fcGNpOwogCi0JCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKHBkZXYtPmlycSwgaXdsX3BjaWVfaXNyLAotCQkJCQkgICBpd2xfcGNpZV9pcnFfaGFuZGxlciwKLQkJCQkJICAgSVJRRl9TSEFSRUQsIERSVl9OQU1FLCB0cmFucyk7CisJCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoJnBkZXYtPmRldiwgcGRldi0+aXJxLAorCQkJCQkJaXdsX3BjaWVfaXNyLAorCQkJCQkJaXdsX3BjaWVfaXJxX2hhbmRsZXIsCisJCQkJCQlJUlFGX1NIQVJFRCwgRFJWX05BTUUsIHRyYW5zKTsKIAkJaWYgKHJldCkgewogCQkJSVdMX0VSUih0cmFucywgIkVycm9yIGFsbG9jYXRpbmcgSVJRICVkXG4iLCBwZGV2LT5pcnEpOwogCQkJZ290byBvdXRfZnJlZV9pY3Q7CkBAIC0yOTkxLDEyICszMDc5LDYgQEAKIAogb3V0X2ZyZWVfaWN0OgogCWl3bF9wY2llX2ZyZWVfaWN0KHRyYW5zKTsKLW91dF9wY2lfZGlzYWJsZV9tc2k6Ci0JcGNpX2Rpc2FibGVfbXNpKHBkZXYpOwotb3V0X3BjaV9yZWxlYXNlX3JlZ2lvbnM6Ci0JcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKLW91dF9wY2lfZGlzYWJsZV9kZXZpY2U6Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogb3V0X25vX3BjaToKIAlmcmVlX3BlcmNwdSh0cmFuc19wY2llLT50c29faGRyX3BhZ2UpOwogCWl3bF90cmFuc19mcmVlKHRyYW5zKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvcGNpZS90eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL3R4LmMKaW5kZXggMTg2NTBkYy4uZTlhMjc4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL3R4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL3R4LmMKQEAgLTcxLDcgKzcxLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgaW50IGl3bF9xdWV1ZV9zcGFjZShjb25zdCBzdHJ1Y3QgaXdsX3F1ZXVlICpxKQorc3RhdGljIGludCBpd2xfcXVldWVfc3BhY2UoY29uc3Qgc3RydWN0IGl3bF90eHEgKnEpCiB7CiAJdW5zaWduZWQgaW50IG1heDsKIAl1bnNpZ25lZCBpbnQgdXNlZDsKQEAgLTEwMiw3ICsxMDIsNyBAQAogLyoKICAqIGl3bF9xdWV1ZV9pbml0IC0gSW5pdGlhbGl6ZSBxdWV1ZSdzIGhpZ2gvbG93LXdhdGVyIGFuZCByZWFkL3dyaXRlIGluZGV4ZXMKICAqLwotc3RhdGljIGludCBpd2xfcXVldWVfaW5pdChzdHJ1Y3QgaXdsX3F1ZXVlICpxLCBpbnQgc2xvdHNfbnVtLCB1MzIgaWQpCitzdGF0aWMgaW50IGl3bF9xdWV1ZV9pbml0KHN0cnVjdCBpd2xfdHhxICpxLCBpbnQgc2xvdHNfbnVtLCB1MzIgaWQpCiB7CiAJcS0+bl93aW5kb3cgPSBzbG90c19udW07CiAJcS0+aWQgPSBpZDsKQEAgLTE1OCwxMyArMTU4LDEzIEBACiAKIAlzcGluX2xvY2soJnR4cS0+bG9jayk7CiAJLyogY2hlY2sgaWYgdHJpZ2dlcmVkIGVycm9uZW91c2x5ICovCi0JaWYgKHR4cS0+cS5yZWFkX3B0ciA9PSB0eHEtPnEud3JpdGVfcHRyKSB7CisJaWYgKHR4cS0+cmVhZF9wdHIgPT0gdHhxLT53cml0ZV9wdHIpIHsKIAkJc3Bpbl91bmxvY2soJnR4cS0+bG9jayk7CiAJCXJldHVybjsKIAl9CiAJc3Bpbl91bmxvY2soJnR4cS0+bG9jayk7CiAKLQlJV0xfRVJSKHRyYW5zLCAiUXVldWUgJWQgc3R1Y2sgZm9yICV1IG1zLlxuIiwgdHhxLT5xLmlkLAorCUlXTF9FUlIodHJhbnMsICJRdWV1ZSAlZCBzdHVjayBmb3IgJXUgbXMuXG4iLCB0eHEtPmlkLAogCQlqaWZmaWVzX3RvX21zZWNzKHR4cS0+d2RfdGltZW91dCkpOwogCiAJaXdsX3RyYW5zX3BjaWVfbG9nX3NjZF9lcnJvcih0cmFucywgdHhxKTsKQEAgLTE3NiwyMiArMTc2LDIxIEBACiAgKiBpd2xfcGNpZV90eHFfdXBkYXRlX2J5dGVfY250X3RibCAtIFNldCB1cCBlbnRyeSBpbiBUeCBieXRlLWNvdW50IGFycmF5CiAgKi8KIHN0YXRpYyB2b2lkIGl3bF9wY2llX3R4cV91cGRhdGVfYnl0ZV9jbnRfdGJsKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAotCQkJCQkgICAgIHN0cnVjdCBpd2xfdHhxICp0eHEsIHUxNiBieXRlX2NudCkKKwkJCQkJICAgICBzdHJ1Y3QgaXdsX3R4cSAqdHhxLCB1MTYgYnl0ZV9jbnQsCisJCQkJCSAgICAgaW50IG51bV90YnMpCiB7CiAJc3RydWN0IGl3bGFnbl9zY2RfYmNfdGJsICpzY2RfYmNfdGJsOwogCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7Ci0JaW50IHdyaXRlX3B0ciA9IHR4cS0+cS53cml0ZV9wdHI7Ci0JaW50IHR4cV9pZCA9IHR4cS0+cS5pZDsKKwlpbnQgd3JpdGVfcHRyID0gdHhxLT53cml0ZV9wdHI7CisJaW50IHR4cV9pZCA9IHR4cS0+aWQ7CiAJdTggc2VjX2N0bCA9IDA7Ci0JdTggc3RhX2lkID0gMDsKIAl1MTYgbGVuID0gYnl0ZV9jbnQgKyBJV0xfVFhfQ1JDX1NJWkUgKyBJV0xfVFhfREVMSU1JVEVSX1NJWkU7CiAJX19sZTE2IGJjX2VudDsKIAlzdHJ1Y3QgaXdsX3R4X2NtZCAqdHhfY21kID0KLQkJKHZvaWQgKikgdHhxLT5lbnRyaWVzW3R4cS0+cS53cml0ZV9wdHJdLmNtZC0+cGF5bG9hZDsKKwkJKHZvaWQgKil0eHEtPmVudHJpZXNbdHhxLT53cml0ZV9wdHJdLmNtZC0+cGF5bG9hZDsKIAogCXNjZF9iY190YmwgPSB0cmFuc19wY2llLT5zY2RfYmNfdGJscy5hZGRyOwogCi0Jc3RhX2lkID0gdHhfY21kLT5zdGFfaWQ7CiAJc2VjX2N0bCA9IHR4X2NtZC0+c2VjX2N0bDsKIAogCXN3aXRjaCAoc2VjX2N0bCAmIFRYX0NNRF9TRUNfTVNLKSB7CkBAIC0yMDUsMTQgKzIwNCwzMiBAQAogCQlsZW4gKz0gSUVFRTgwMjExX1dFUF9JVl9MRU4gKyBJRUVFODAyMTFfV0VQX0lDVl9MRU47CiAJCWJyZWFrOwogCX0KLQogCWlmICh0cmFuc19wY2llLT5iY190YWJsZV9kd29yZCkKIAkJbGVuID0gRElWX1JPVU5EX1VQKGxlbiwgNCk7CiAKIAlpZiAoV0FSTl9PTihsZW4gPiAweEZGRiB8fCB3cml0ZV9wdHIgPj0gVEZEX1FVRVVFX1NJWkVfTUFYKSkKIAkJcmV0dXJuOwogCi0JYmNfZW50ID0gY3B1X3RvX2xlMTYobGVuIHwgKHN0YV9pZCA8PCAxMikpOworCWlmICh0cmFucy0+Y2ZnLT51c2VfdGZoKSB7CisJCXU4IGZpbGxlZF90ZmRfc2l6ZSA9IG9mZnNldG9mKHN0cnVjdCBpd2xfdGZoX3RmZCwgdGJzKSArCisJCQkJICAgICBudW1fdGJzICogc2l6ZW9mKHN0cnVjdCBpd2xfdGZoX3RiKTsKKwkJLyoKKwkJICogZmlsbGVkX3RmZF9zaXplIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgZmlsbGVkIGJ5dGVzIGluIHRoZQorCQkgKiBURkQuCisJCSAqIERpdmlkaW5nIGl0IGJ5IDY0IHdpbGwgZ2l2ZSB0aGUgbnVtYmVyIG9mIGNodW5rcyB0byBmZXRjaAorCQkgKiB0byBTUkFNLSAwIGZvciBvbmUgY2h1bmssIDEgZm9yIDIgYW5kIHNvIG9uLgorCQkgKiBJZiwgZm9yIGV4YW1wbGUsIFRGRCBjb250YWlucyBvbmx5IDMgVEJzIHRoZW4gMzIgYnl0ZXMKKwkJICogb2YgdGhlIFRGRCBhcmUgdXNlZCwgYW5kIG9ubHkgb25lIGNodW5rIG9mIDY0IGJ5dGVzIHNob3VsZAorCQkgKiBiZSBmZXRjaGVkCisJCSAqLworCQl1OCBudW1fZmV0Y2hfY2h1bmtzID0gRElWX1JPVU5EX1VQKGZpbGxlZF90ZmRfc2l6ZSwgNjQpIC0gMTsKKworCQliY19lbnQgPSBjcHVfdG9fbGUxNihsZW4gfCAobnVtX2ZldGNoX2NodW5rcyA8PCAxMikpOworCX0gZWxzZSB7CisJCXU4IHN0YV9pZCA9IHR4X2NtZC0+c3RhX2lkOworCisJCWJjX2VudCA9IGNwdV90b19sZTE2KGxlbiB8IChzdGFfaWQgPDwgMTIpKTsKKwl9CiAKIAlzY2RfYmNfdGJsW3R4cV9pZF0udGZkX29mZnNldFt3cml0ZV9wdHJdID0gYmNfZW50OwogCkBAIC0yMjcsMTIgKzI0NCwxMiBAQAogCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9CiAJCUlXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CiAJc3RydWN0IGl3bGFnbl9zY2RfYmNfdGJsICpzY2RfYmNfdGJsID0gdHJhbnNfcGNpZS0+c2NkX2JjX3RibHMuYWRkcjsKLQlpbnQgdHhxX2lkID0gdHhxLT5xLmlkOwotCWludCByZWFkX3B0ciA9IHR4cS0+cS5yZWFkX3B0cjsKKwlpbnQgdHhxX2lkID0gdHhxLT5pZDsKKwlpbnQgcmVhZF9wdHIgPSB0eHEtPnJlYWRfcHRyOwogCXU4IHN0YV9pZCA9IDA7CiAJX19sZTE2IGJjX2VudDsKIAlzdHJ1Y3QgaXdsX3R4X2NtZCAqdHhfY21kID0KLQkJKHZvaWQgKil0eHEtPmVudHJpZXNbdHhxLT5xLnJlYWRfcHRyXS5jbWQtPnBheWxvYWQ7CisJCSh2b2lkICopdHhxLT5lbnRyaWVzW3JlYWRfcHRyXS5jbWQtPnBheWxvYWQ7CiAKIAlXQVJOX09OKHJlYWRfcHRyID49IFRGRF9RVUVVRV9TSVpFX01BWCk7CiAKQEAgLTI0MCw2ICsyNTcsNyBAQAogCQlzdGFfaWQgPSB0eF9jbWQtPnN0YV9pZDsKIAogCWJjX2VudCA9IGNwdV90b19sZTE2KDEgfCAoc3RhX2lkIDw8IDEyKSk7CisKIAlzY2RfYmNfdGJsW3R4cV9pZF0udGZkX29mZnNldFtyZWFkX3B0cl0gPSBiY19lbnQ7CiAKIAlpZiAocmVhZF9wdHIgPCBURkRfUVVFVUVfU0laRV9CQ19EVVApCkBAIC0yNTUsNyArMjczLDcgQEAKIHsKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwogCXUzMiByZWcgPSAwOwotCWludCB0eHFfaWQgPSB0eHEtPnEuaWQ7CisJaW50IHR4cV9pZCA9IHR4cS0+aWQ7CiAKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZ0eHEtPmxvY2spOwogCkBAIC0yODksMTAgKzMwNywxMCBAQAogCSAqIGlmIG5vdCBpbiBwb3dlci1zYXZlIG1vZGUsIHVDb2RlIHdpbGwgbmV2ZXIgc2xlZXAgd2hlbiB3ZSdyZQogCSAqIHRyeWluZyB0byB0eCAoZHVyaW5nIFJGS0lMTCwgd2UncmUgbm90IHRyeWluZyB0byB0eCkuCiAJICovCi0JSVdMX0RFQlVHX1RYKHRyYW5zLCAiUTolZCBXUjogMHgleFxuIiwgdHhxX2lkLCB0eHEtPnEud3JpdGVfcHRyKTsKKwlJV0xfREVCVUdfVFgodHJhbnMsICJROiVkIFdSOiAweCV4XG4iLCB0eHFfaWQsIHR4cS0+d3JpdGVfcHRyKTsKIAlpZiAoIXR4cS0+YmxvY2spCiAJCWl3bF93cml0ZTMyKHRyYW5zLCBIQlVTX1RBUkdfV1JQVFIsCi0JCQkgICAgdHhxLT5xLndyaXRlX3B0ciB8ICh0eHFfaWQgPDwgOCkpOworCQkJICAgIHR4cS0+d3JpdGVfcHRyIHwgKHR4cV9pZCA8PCA4KSk7CiB9CiAKIHZvaWQgaXdsX3BjaWVfdHhxX2NoZWNrX3dycHRycyhzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucykKQEAgLTMxMiw0OSArMzMwLDkzIEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgaXdsX3BjaWVfdGZkX3RiX2dldF9hZGRyKHN0cnVjdCBpd2xfdGZkICp0ZmQsIHU4IGlkeCkKK3N0YXRpYyBpbmxpbmUgdm9pZCAqaXdsX3BjaWVfZ2V0X3RmZChzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUsCisJCQkJICAgICBzdHJ1Y3QgaXdsX3R4cSAqdHhxLCBpbnQgaWR4KQogewotCXN0cnVjdCBpd2xfdGZkX3RiICp0YiA9ICZ0ZmQtPnRic1tpZHhdOwotCi0JZG1hX2FkZHJfdCBhZGRyID0gZ2V0X3VuYWxpZ25lZF9sZTMyKCZ0Yi0+bG8pOwotCWlmIChzaXplb2YoZG1hX2FkZHJfdCkgPiBzaXplb2YodTMyKSkKLQkJYWRkciB8PQotCQkoKGRtYV9hZGRyX3QpKGxlMTZfdG9fY3B1KHRiLT5oaV9uX2xlbikgJiAweEYpIDw8IDE2KSA8PCAxNjsKLQotCXJldHVybiBhZGRyOworCXJldHVybiB0eHEtPnRmZHMgKyB0cmFuc19wY2llLT50ZmRfc2l6ZSAqIGlkeDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGl3bF9wY2llX3RmZF9zZXRfdGIoc3RydWN0IGl3bF90ZmQgKnRmZCwgdTggaWR4LAotCQkJCSAgICAgICBkbWFfYWRkcl90IGFkZHIsIHUxNiBsZW4pCitzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgaXdsX3BjaWVfdGZkX3RiX2dldF9hZGRyKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAorCQkJCQkJICB2b2lkICpfdGZkLCB1OCBpZHgpCiB7Ci0Jc3RydWN0IGl3bF90ZmRfdGIgKnRiID0gJnRmZC0+dGJzW2lkeF07Ci0JdTE2IGhpX25fbGVuID0gbGVuIDw8IDQ7CiAKLQlwdXRfdW5hbGlnbmVkX2xlMzIoYWRkciwgJnRiLT5sbyk7Ci0JaWYgKHNpemVvZihkbWFfYWRkcl90KSA+IHNpemVvZih1MzIpKQotCQloaV9uX2xlbiB8PSAoKGFkZHIgPj4gMTYpID4+IDE2KSAmIDB4RjsKKwlpZiAodHJhbnMtPmNmZy0+dXNlX3RmaCkgeworCQlzdHJ1Y3QgaXdsX3RmaF90ZmQgKnRmZCA9IF90ZmQ7CisJCXN0cnVjdCBpd2xfdGZoX3RiICp0YiA9ICZ0ZmQtPnRic1tpZHhdOwogCi0JdGItPmhpX25fbGVuID0gY3B1X3RvX2xlMTYoaGlfbl9sZW4pOworCQlyZXR1cm4gKGRtYV9hZGRyX3QpKGxlNjRfdG9fY3B1KHRiLT5hZGRyKSk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGl3bF90ZmQgKnRmZCA9IF90ZmQ7CisJCXN0cnVjdCBpd2xfdGZkX3RiICp0YiA9ICZ0ZmQtPnRic1tpZHhdOworCQlkbWFfYWRkcl90IGFkZHIgPSBnZXRfdW5hbGlnbmVkX2xlMzIoJnRiLT5sbyk7CisJCWRtYV9hZGRyX3QgaGlfbGVuOwogCi0JdGZkLT5udW1fdGJzID0gaWR4ICsgMTsKKwkJaWYgKHNpemVvZihkbWFfYWRkcl90KSA8PSBzaXplb2YodTMyKSkKKwkJCXJldHVybiBhZGRyOworCisJCWhpX2xlbiA9IGxlMTZfdG9fY3B1KHRiLT5oaV9uX2xlbikgJiAweEY7CisKKwkJLyoKKwkJICogc2hpZnQgYnkgMTYgdHdpY2UgdG8gYXZvaWQgd2FybmluZ3Mgb24gMzItYml0CisJCSAqICh3aGVyZSB0aGlzIGNvZGUgbmV2ZXIgcnVucyBhbnl3YXkgZHVlIHRvIHRoZQorCQkgKiBpZiBzdGF0ZW1lbnQgYWJvdmUpCisJCSAqLworCQlyZXR1cm4gYWRkciB8ICgoaGlfbGVuIDw8IDE2KSA8PCAxNik7CisJfQogfQogCi1zdGF0aWMgaW5saW5lIHU4IGl3bF9wY2llX3RmZF9nZXRfbnVtX3RicyhzdHJ1Y3QgaXdsX3RmZCAqdGZkKQorc3RhdGljIGlubGluZSB2b2lkIGl3bF9wY2llX3RmZF9zZXRfdGIoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHZvaWQgKnRmZCwKKwkJCQkgICAgICAgdTggaWR4LCBkbWFfYWRkcl90IGFkZHIsIHUxNiBsZW4pCiB7Ci0JcmV0dXJuIHRmZC0+bnVtX3RicyAmIDB4MWY7CisJaWYgKHRyYW5zLT5jZmctPnVzZV90ZmgpIHsKKwkJc3RydWN0IGl3bF90ZmhfdGZkICp0ZmRfZmggPSAodm9pZCAqKXRmZDsKKwkJc3RydWN0IGl3bF90ZmhfdGIgKnRiID0gJnRmZF9maC0+dGJzW2lkeF07CisKKwkJcHV0X3VuYWxpZ25lZF9sZTY0KGFkZHIsICZ0Yi0+YWRkcik7CisJCXRiLT50Yl9sZW4gPSBjcHVfdG9fbGUxNihsZW4pOworCisJCXRmZF9maC0+bnVtX3RicyA9IGNwdV90b19sZTE2KGlkeCArIDEpOworCX0gZWxzZSB7CisJCXN0cnVjdCBpd2xfdGZkICp0ZmRfZmggPSAodm9pZCAqKXRmZDsKKwkJc3RydWN0IGl3bF90ZmRfdGIgKnRiID0gJnRmZF9maC0+dGJzW2lkeF07CisKKwkJdTE2IGhpX25fbGVuID0gbGVuIDw8IDQ7CisKKwkJcHV0X3VuYWxpZ25lZF9sZTMyKGFkZHIsICZ0Yi0+bG8pOworCQlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpID4gc2l6ZW9mKHUzMikpCisJCQloaV9uX2xlbiB8PSAoKGFkZHIgPj4gMTYpID4+IDE2KSAmIDB4RjsKKworCQl0Yi0+aGlfbl9sZW4gPSBjcHVfdG9fbGUxNihoaV9uX2xlbik7CisKKwkJdGZkX2ZoLT5udW1fdGJzID0gaWR4ICsgMTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggaXdsX3BjaWVfdGZkX2dldF9udW1fdGJzKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCB2b2lkICpfdGZkKQoreworCWlmICh0cmFucy0+Y2ZnLT51c2VfdGZoKSB7CisJCXN0cnVjdCBpd2xfdGZoX3RmZCAqdGZkID0gX3RmZDsKKworCQlyZXR1cm4gbGUxNl90b19jcHUodGZkLT5udW1fdGJzKSAmIDB4MWY7CisJfSBlbHNlIHsKKwkJc3RydWN0IGl3bF90ZmQgKnRmZCA9IF90ZmQ7CisKKwkJcmV0dXJuIHRmZC0+bnVtX3RicyAmIDB4MWY7CisJfQogfQogCiBzdGF0aWMgdm9pZCBpd2xfcGNpZV90ZmRfdW5tYXAoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCiAJCQkgICAgICAgc3RydWN0IGl3bF9jbWRfbWV0YSAqbWV0YSwKLQkJCSAgICAgICBzdHJ1Y3QgaXdsX3RmZCAqdGZkKQorCQkJICAgICAgIHN0cnVjdCBpd2xfdHhxICp0eHEsIGludCBpbmRleCkKIHsKLQlpbnQgaTsKLQlpbnQgbnVtX3RiczsKKwlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOworCWludCBpLCBudW1fdGJzOworCXZvaWQgKnRmZCA9IGl3bF9wY2llX2dldF90ZmQodHJhbnNfcGNpZSwgdHhxLCBpbmRleCk7CiAKIAkvKiBTYW5pdHkgY2hlY2sgb24gbnVtYmVyIG9mIGNodW5rcyAqLwotCW51bV90YnMgPSBpd2xfcGNpZV90ZmRfZ2V0X251bV90YnModGZkKTsKKwludW1fdGJzID0gaXdsX3BjaWVfdGZkX2dldF9udW1fdGJzKHRyYW5zLCB0ZmQpOwogCi0JaWYgKG51bV90YnMgPj0gSVdMX05VTV9PRl9UQlMpIHsKKwlpZiAobnVtX3RicyA+PSB0cmFuc19wY2llLT5tYXhfdGJzKSB7CiAJCUlXTF9FUlIodHJhbnMsICJUb28gbWFueSBjaHVua3M6ICVpXG4iLCBudW1fdGJzKTsKIAkJLyogQHRvZG8gaXNzdWUgZmF0YWwgZXJyb3IsIGl0IGlzIHF1aXRlIHNlcmlvdXMgc2l0dWF0aW9uICovCiAJCXJldHVybjsKQEAgLTM2MywxOCArNDI1LDMwIEBACiAJLyogZmlyc3QgVEIgaXMgbmV2ZXIgZnJlZWQgLSBpdCdzIHRoZSBiaWRpcmVjdGlvbmFsIERNQSBkYXRhICovCiAKIAlmb3IgKGkgPSAxOyBpIDwgbnVtX3RiczsgaSsrKSB7Ci0JCWlmIChtZXRhLT5mbGFncyAmIEJJVChpICsgQ01EX1RCX0JJVE1BUF9QT1MpKQorCQlpZiAobWV0YS0+dGJzICYgQklUKGkpKQogCQkJZG1hX3VubWFwX3BhZ2UodHJhbnMtPmRldiwKLQkJCQkgICAgICAgaXdsX3BjaWVfdGZkX3RiX2dldF9hZGRyKHRmZCwgaSksCi0JCQkJICAgICAgIGl3bF9wY2llX3RmZF90Yl9nZXRfbGVuKHRmZCwgaSksCisJCQkJICAgICAgIGl3bF9wY2llX3RmZF90Yl9nZXRfYWRkcih0cmFucywgdGZkLCBpKSwKKwkJCQkgICAgICAgaXdsX3BjaWVfdGZkX3RiX2dldF9sZW4odHJhbnMsIHRmZCwgaSksCiAJCQkJICAgICAgIERNQV9UT19ERVZJQ0UpOwogCQllbHNlCiAJCQlkbWFfdW5tYXBfc2luZ2xlKHRyYW5zLT5kZXYsCi0JCQkJCSBpd2xfcGNpZV90ZmRfdGJfZ2V0X2FkZHIodGZkLCBpKSwKLQkJCQkJIGl3bF9wY2llX3RmZF90Yl9nZXRfbGVuKHRmZCwgaSksCisJCQkJCSBpd2xfcGNpZV90ZmRfdGJfZ2V0X2FkZHIodHJhbnMsIHRmZCwKKwkJCQkJCQkJICBpKSwKKwkJCQkJIGl3bF9wY2llX3RmZF90Yl9nZXRfbGVuKHRyYW5zLCB0ZmQsCisJCQkJCQkJCSBpKSwKIAkJCQkJIERNQV9UT19ERVZJQ0UpOwogCX0KLQl0ZmQtPm51bV90YnMgPSAwOworCisJaWYgKHRyYW5zLT5jZmctPnVzZV90ZmgpIHsKKwkJc3RydWN0IGl3bF90ZmhfdGZkICp0ZmRfZmggPSAodm9pZCAqKXRmZDsKKworCQl0ZmRfZmgtPm51bV90YnMgPSAwOworCX0gZWxzZSB7CisJCXN0cnVjdCBpd2xfdGZkICp0ZmRfZmggPSAodm9pZCAqKXRmZDsKKworCQl0ZmRfZmgtPm51bV90YnMgPSAwOworCX0KKwogfQogCiAvKgpAQCAtMzg4LDIwICs0NjIsMTggQEAKICAqLwogc3RhdGljIHZvaWQgaXdsX3BjaWVfdHhxX2ZyZWVfdGZkKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgaXdsX3R4cSAqdHhxKQogewotCXN0cnVjdCBpd2xfdGZkICp0ZmRfdG1wID0gdHhxLT50ZmRzOwotCiAJLyogcmRfcHRyIGlzIGJvdW5kZWQgYnkgVEZEX1FVRVVFX1NJWkVfTUFYIGFuZAogCSAqIGlkeCBpcyBib3VuZGVkIGJ5IG5fd2luZG93CiAJICovCi0JaW50IHJkX3B0ciA9IHR4cS0+cS5yZWFkX3B0cjsKLQlpbnQgaWR4ID0gZ2V0X2NtZF9pbmRleCgmdHhxLT5xLCByZF9wdHIpOworCWludCByZF9wdHIgPSB0eHEtPnJlYWRfcHRyOworCWludCBpZHggPSBnZXRfY21kX2luZGV4KHR4cSwgcmRfcHRyKTsKIAogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnR4cS0+bG9jayk7CiAKIAkvKiBXZSBoYXZlIG9ubHkgcS0+bl93aW5kb3cgdHhxLT5lbnRyaWVzLCBidXQgd2UgdXNlCiAJICogVEZEX1FVRVVFX1NJWkVfTUFYIHRmZHMKIAkgKi8KLQlpd2xfcGNpZV90ZmRfdW5tYXAodHJhbnMsICZ0eHEtPmVudHJpZXNbaWR4XS5tZXRhLCAmdGZkX3RtcFtyZF9wdHJdKTsKKwlpd2xfcGNpZV90ZmRfdW5tYXAodHJhbnMsICZ0eHEtPmVudHJpZXNbaWR4XS5tZXRhLCB0eHEsIHJkX3B0cik7CiAKIAkvKiBmcmVlIFNLQiAqLwogCWlmICh0eHEtPmVudHJpZXMpIHsKQEAgLTQyMywyMyArNDk1LDIxIEBACiBzdGF0aWMgaW50IGl3bF9wY2llX3R4cV9idWlsZF90ZmQoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHN0cnVjdCBpd2xfdHhxICp0eHEsCiAJCQkJICBkbWFfYWRkcl90IGFkZHIsIHUxNiBsZW4sIGJvb2wgcmVzZXQpCiB7Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcTsKLQlzdHJ1Y3QgaXdsX3RmZCAqdGZkLCAqdGZkX3RtcDsKKwlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOworCXZvaWQgKnRmZDsKIAl1MzIgbnVtX3RiczsKIAotCXEgPSAmdHhxLT5xOwotCXRmZF90bXAgPSB0eHEtPnRmZHM7Ci0JdGZkID0gJnRmZF90bXBbcS0+d3JpdGVfcHRyXTsKKwl0ZmQgPSB0eHEtPnRmZHMgKyB0cmFuc19wY2llLT50ZmRfc2l6ZSAqIHR4cS0+d3JpdGVfcHRyOwogCiAJaWYgKHJlc2V0KQotCQltZW1zZXQodGZkLCAwLCBzaXplb2YoKnRmZCkpOworCQltZW1zZXQodGZkLCAwLCB0cmFuc19wY2llLT50ZmRfc2l6ZSk7CiAKLQludW1fdGJzID0gaXdsX3BjaWVfdGZkX2dldF9udW1fdGJzKHRmZCk7CisJbnVtX3RicyA9IGl3bF9wY2llX3RmZF9nZXRfbnVtX3Ricyh0cmFucywgdGZkKTsKIAotCS8qIEVhY2ggVEZEIGNhbiBwb2ludCB0byBhIG1heGltdW0gMjAgVHggYnVmZmVycyAqLwotCWlmIChudW1fdGJzID49IElXTF9OVU1fT0ZfVEJTKSB7CisJLyogRWFjaCBURkQgY2FuIHBvaW50IHRvIGEgbWF4aW11bSBtYXhfdGJzIFR4IGJ1ZmZlcnMgKi8KKwlpZiAobnVtX3RicyA+PSB0cmFuc19wY2llLT5tYXhfdGJzKSB7CiAJCUlXTF9FUlIodHJhbnMsICJFcnJvciBjYW4gbm90IHNlbmQgbW9yZSB0aGFuICVkIGNodW5rc1xuIiwKLQkJCUlXTF9OVU1fT0ZfVEJTKTsKKwkJCXRyYW5zX3BjaWUtPm1heF90YnMpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTQ0Nyw3ICs1MTcsNyBAQAogCQkgIlVuYWxpZ25lZCBhZGRyZXNzID0gJWxseFxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylhZGRyKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpd2xfcGNpZV90ZmRfc2V0X3RiKHRmZCwgbnVtX3RicywgYWRkciwgbGVuKTsKKwlpd2xfcGNpZV90ZmRfc2V0X3RiKHRyYW5zLCB0ZmQsIG51bV90YnMsIGFkZHIsIGxlbik7CiAKIAlyZXR1cm4gbnVtX3RiczsKIH0KQEAgLTQ1Nyw3ICs1MjcsNyBAQAogCQkJICAgICAgIHUzMiB0eHFfaWQpCiB7CiAJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0gSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKLQlzaXplX3QgdGZkX3N6ID0gc2l6ZW9mKHN0cnVjdCBpd2xfdGZkKSAqIFRGRF9RVUVVRV9TSVpFX01BWDsKKwlzaXplX3QgdGZkX3N6ID0gdHJhbnNfcGNpZS0+dGZkX3NpemUgKiBURkRfUVVFVUVfU0laRV9NQVg7CiAJc2l6ZV90IHRiMF9idWZfc3o7CiAJaW50IGk7CiAKQEAgLTQ2OCw3ICs1MzgsNyBAQAogCQkgICAgKHVuc2lnbmVkIGxvbmcpdHhxKTsKIAl0eHEtPnRyYW5zX3BjaWUgPSB0cmFuc19wY2llOwogCi0JdHhxLT5xLm5fd2luZG93ID0gc2xvdHNfbnVtOworCXR4cS0+bl93aW5kb3cgPSBzbG90c19udW07CiAKIAl0eHEtPmVudHJpZXMgPSBrY2FsbG9jKHNsb3RzX251bSwKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IGl3bF9wY2llX3R4cV9lbnRyeSksCkBAIC00ODksNyArNTU5LDcgQEAKIAkvKiBDaXJjdWxhciBidWZmZXIgb2YgdHJhbnNtaXQgZnJhbWUgZGVzY3JpcHRvcnMgKFRGRHMpLAogCSAqIHNoYXJlZCB3aXRoIGRldmljZSAqLwogCXR4cS0+dGZkcyA9IGRtYV9hbGxvY19jb2hlcmVudCh0cmFucy0+ZGV2LCB0ZmRfc3osCi0JCQkJICAgICAgICZ0eHEtPnEuZG1hX2FkZHIsIEdGUF9LRVJORUwpOworCQkJCSAgICAgICAmdHhxLT5kbWFfYWRkciwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0eHEtPnRmZHMpCiAJCWdvdG8gZXJyb3I7CiAKQEAgLTUwMywxMSArNTczLDExIEBACiAJaWYgKCF0eHEtPmZpcnN0X3RiX2J1ZnMpCiAJCWdvdG8gZXJyX2ZyZWVfdGZkczsKIAotCXR4cS0+cS5pZCA9IHR4cV9pZDsKKwl0eHEtPmlkID0gdHhxX2lkOwogCiAJcmV0dXJuIDA7CiBlcnJfZnJlZV90ZmRzOgotCWRtYV9mcmVlX2NvaGVyZW50KHRyYW5zLT5kZXYsIHRmZF9zeiwgdHhxLT50ZmRzLCB0eHEtPnEuZG1hX2FkZHIpOworCWRtYV9mcmVlX2NvaGVyZW50KHRyYW5zLT5kZXYsIHRmZF9zeiwgdHhxLT50ZmRzLCB0eHEtPmRtYV9hZGRyKTsKIGVycm9yOgogCWlmICh0eHEtPmVudHJpZXMgJiYgdHhxX2lkID09IHRyYW5zX3BjaWUtPmNtZF9xdWV1ZSkKIAkJZm9yIChpID0gMDsgaSA8IHNsb3RzX251bTsgaSsrKQpAQCAtNTMxLDcgKzYwMSw3IEBACiAJQlVJTERfQlVHX09OKFRGRF9RVUVVRV9TSVpFX01BWCAmIChURkRfUVVFVUVfU0laRV9NQVggLSAxKSk7CiAKIAkvKiBJbml0aWFsaXplIHF1ZXVlJ3MgaGlnaC9sb3ctd2F0ZXIgbWFya3MsIGFuZCBoZWFkL3RhaWwgaW5kZXhlcyAqLwotCXJldCA9IGl3bF9xdWV1ZV9pbml0KCZ0eHEtPnEsIHNsb3RzX251bSwgdHhxX2lkKTsKKwlyZXQgPSBpd2xfcXVldWVfaW5pdCh0eHEsIHNsb3RzX251bSwgdHhxX2lkKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC01NDUsMTAgKzYxNSwxMCBAQAogCWlmICh0cmFucy0+Y2ZnLT51c2VfdGZoKQogCQlpd2xfd3JpdGVfZGlyZWN0NjQodHJhbnMsCiAJCQkJICAgRkhfTUVNX0NCQkNfUVVFVUUodHJhbnMsIHR4cV9pZCksCi0JCQkJICAgdHhxLT5xLmRtYV9hZGRyKTsKKwkJCQkgICB0eHEtPmRtYV9hZGRyKTsKIAllbHNlCiAJCWl3bF93cml0ZV9kaXJlY3QzMih0cmFucywgRkhfTUVNX0NCQkNfUVVFVUUodHJhbnMsIHR4cV9pZCksCi0JCQkJICAgdHhxLT5xLmRtYV9hZGRyID4+IDgpOworCQkJCSAgIHR4cS0+ZG1hX2FkZHIgPj4gOCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTU5NSwxNSArNjY1LDE0IEBACiB7CiAJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0gSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKIAlzdHJ1Y3QgaXdsX3R4cSAqdHhxID0gJnRyYW5zX3BjaWUtPnR4cVt0eHFfaWRdOwotCXN0cnVjdCBpd2xfcXVldWUgKnEgPSAmdHhxLT5xOwogCiAJc3Bpbl9sb2NrX2JoKCZ0eHEtPmxvY2spOwotCXdoaWxlIChxLT53cml0ZV9wdHIgIT0gcS0+cmVhZF9wdHIpIHsKKwl3aGlsZSAodHhxLT53cml0ZV9wdHIgIT0gdHhxLT5yZWFkX3B0cikgewogCQlJV0xfREVCVUdfVFhfUkVQTFkodHJhbnMsICJRICVkIEZyZWUgJWRcbiIsCi0JCQkJICAgdHhxX2lkLCBxLT5yZWFkX3B0cik7CisJCQkJICAgdHhxX2lkLCB0eHEtPnJlYWRfcHRyKTsKIAogCQlpZiAodHhxX2lkICE9IHRyYW5zX3BjaWUtPmNtZF9xdWV1ZSkgewotCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHR4cS0+ZW50cmllc1txLT5yZWFkX3B0cl0uc2tiOworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHR4cS0+ZW50cmllc1t0eHEtPnJlYWRfcHRyXS5za2I7CiAKIAkJCWlmIChXQVJOX09OX09OQ0UoIXNrYikpCiAJCQkJY29udGludWU7CkBAIC02MTEsMTUgKzY4MCwxNSBAQAogCQkJaXdsX3BjaWVfZnJlZV90c29fcGFnZSh0cmFuc19wY2llLCBza2IpOwogCQl9CiAJCWl3bF9wY2llX3R4cV9mcmVlX3RmZCh0cmFucywgdHhxKTsKLQkJcS0+cmVhZF9wdHIgPSBpd2xfcXVldWVfaW5jX3dyYXAocS0+cmVhZF9wdHIpOworCQl0eHEtPnJlYWRfcHRyID0gaXdsX3F1ZXVlX2luY193cmFwKHR4cS0+cmVhZF9wdHIpOwogCi0JCWlmIChxLT5yZWFkX3B0ciA9PSBxLT53cml0ZV9wdHIpIHsKKwkJaWYgKHR4cS0+cmVhZF9wdHIgPT0gdHhxLT53cml0ZV9wdHIpIHsKIAkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZ0cmFuc19wY2llLT5yZWdfbG9jaywgZmxhZ3MpOwogCQkJaWYgKHR4cV9pZCAhPSB0cmFuc19wY2llLT5jbWRfcXVldWUpIHsKIAkJCQlJV0xfREVCVUdfUlBNKHRyYW5zLCAiUSAlZCAtIGxhc3QgdHggZnJlZWRcbiIsCi0JCQkJCSAgICAgIHEtPmlkKTsKKwkJCQkJICAgICAgdHhxLT5pZCk7CiAJCQkJaXdsX3RyYW5zX3VucmVmKHRyYW5zKTsKIAkJCX0gZWxzZSB7CiAJCQkJaXdsX3BjaWVfY2xlYXJfY21kX2luX2ZsaWdodCh0cmFucyk7CkBAIC02NjMsNyArNzMyLDcgQEAKIAogCS8qIERlLWFsbG9jIGFycmF5IG9mIGNvbW1hbmQvdHggYnVmZmVycyAqLwogCWlmICh0eHFfaWQgPT0gdHJhbnNfcGNpZS0+Y21kX3F1ZXVlKQotCQlmb3IgKGkgPSAwOyBpIDwgdHhxLT5xLm5fd2luZG93OyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IHR4cS0+bl93aW5kb3c7IGkrKykgewogCQkJa3pmcmVlKHR4cS0+ZW50cmllc1tpXS5jbWQpOwogCQkJa3pmcmVlKHR4cS0+ZW50cmllc1tpXS5mcmVlX2J1Zik7CiAJCX0KQEAgLTY3MSwxMyArNzQwLDEzIEBACiAJLyogRGUtYWxsb2MgY2lyY3VsYXIgYnVmZmVyIG9mIFRGRHMgKi8KIAlpZiAodHhxLT50ZmRzKSB7CiAJCWRtYV9mcmVlX2NvaGVyZW50KGRldiwKLQkJCQkgIHNpemVvZihzdHJ1Y3QgaXdsX3RmZCkgKiBURkRfUVVFVUVfU0laRV9NQVgsCi0JCQkJICB0eHEtPnRmZHMsIHR4cS0+cS5kbWFfYWRkcik7Ci0JCXR4cS0+cS5kbWFfYWRkciA9IDA7CisJCQkJICB0cmFuc19wY2llLT50ZmRfc2l6ZSAqIFRGRF9RVUVVRV9TSVpFX01BWCwKKwkJCQkgIHR4cS0+dGZkcywgdHhxLT5kbWFfYWRkcik7CisJCXR4cS0+ZG1hX2FkZHIgPSAwOwogCQl0eHEtPnRmZHMgPSBOVUxMOwogCiAJCWRtYV9mcmVlX2NvaGVyZW50KGRldiwKLQkJCQkgIHNpemVvZigqdHhxLT5maXJzdF90Yl9idWZzKSAqIHR4cS0+cS5uX3dpbmRvdywKKwkJCQkgIHNpemVvZigqdHhxLT5maXJzdF90Yl9idWZzKSAqIHR4cS0+bl93aW5kb3csCiAJCQkJICB0eHEtPmZpcnN0X3RiX2J1ZnMsIHR4cS0+Zmlyc3RfdGJfZG1hKTsKIAl9CiAKQEAgLTcwMyw2ICs3NzIsOSBAQAogCW1lbXNldCh0cmFuc19wY2llLT5xdWV1ZV9zdG9wcGVkLCAwLCBzaXplb2YodHJhbnNfcGNpZS0+cXVldWVfc3RvcHBlZCkpOwogCW1lbXNldCh0cmFuc19wY2llLT5xdWV1ZV91c2VkLCAwLCBzaXplb2YodHJhbnNfcGNpZS0+cXVldWVfdXNlZCkpOwogCisJaWYgKHRyYW5zLT5jZmctPnVzZV90ZmgpCisJCXJldHVybjsKKwogCXRyYW5zX3BjaWUtPnNjZF9iYXNlX2FkZHIgPQogCQlpd2xfcmVhZF9wcnBoKHRyYW5zLCBTQ0RfU1JBTV9CQVNFX0FERFIpOwogCkBAIC03NTgsMTQgKzgzMCwxNCBAQAogCQlpZiAodHJhbnMtPmNmZy0+dXNlX3RmaCkKIAkJCWl3bF93cml0ZV9kaXJlY3Q2NCh0cmFucywKIAkJCQkJICAgRkhfTUVNX0NCQkNfUVVFVUUodHJhbnMsIHR4cV9pZCksCi0JCQkJCSAgIHR4cS0+cS5kbWFfYWRkcik7CisJCQkJCSAgIHR4cS0+ZG1hX2FkZHIpOwogCQllbHNlCiAJCQlpd2xfd3JpdGVfZGlyZWN0MzIodHJhbnMsCiAJCQkJCSAgIEZIX01FTV9DQkJDX1FVRVVFKHRyYW5zLCB0eHFfaWQpLAotCQkJCQkgICB0eHEtPnEuZG1hX2FkZHIgPj4gOCk7CisJCQkJCSAgIHR4cS0+ZG1hX2FkZHIgPj4gOCk7CiAJCWl3bF9wY2llX3R4cV91bm1hcCh0cmFucywgdHhxX2lkKTsKLQkJdHhxLT5xLnJlYWRfcHRyID0gMDsKLQkJdHhxLT5xLndyaXRlX3B0ciA9IDA7CisJCXR4cS0+cmVhZF9wdHIgPSAwOworCQl0eHEtPndyaXRlX3B0ciA9IDA7CiAJfQogCiAJLyogVGVsbCBOSUMgd2hlcmUgdG8gZmluZCB0aGUgImtlZXAgd2FybSIgYnVmZmVyICovCkBAIC05NzAsMTEgKzEwNDIsMTMgQEAKIAkJfQogCX0KIAotCWlmICh0cmFucy0+Y2ZnLT51c2VfdGZoKQorCWlmICh0cmFucy0+Y2ZnLT51c2VfdGZoKSB7CiAJCWl3bF93cml0ZV9kaXJlY3QzMih0cmFucywgVEZIX1RSQU5TRkVSX01PREUsCiAJCQkJICAgVEZIX1RSQU5TRkVSX01BWF9QRU5ESU5HX1JFUSB8CiAJCQkJICAgVEZIX0NIVU5LX1NJWkVfMTI4IHwKIAkJCQkgICBURkhfQ0hVTktfU1BMSVRfTU9ERSk7CisJCXJldHVybiAwOworCX0KIAogCWl3bF9zZXRfYml0c19wcnBoKHRyYW5zLCBTQ0RfR1BfQ1RSTCwgU0NEX0dQX0NUUkxfQVVUT19BQ1RJVkVfTU9ERSk7CiAJaWYgKHRyYW5zLT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzID4gMjApCkBAIC0xMDA3LDcgKzEwODEsNyBAQAogCSAqIGlmIGVtcHR5IGRlbGV0ZSB0aW1lciwgb3RoZXJ3aXNlIG1vdmUgdGltZXIgZm9yd2FyZAogCSAqIHNpbmNlIHdlJ3JlIG1ha2luZyBwcm9ncmVzcyBvbiB0aGlzIHF1ZXVlCiAJICovCi0JaWYgKHR4cS0+cS5yZWFkX3B0ciA9PSB0eHEtPnEud3JpdGVfcHRyKQorCWlmICh0eHEtPnJlYWRfcHRyID09IHR4cS0+d3JpdGVfcHRyKQogCQlkZWxfdGltZXIoJnR4cS0+c3R1Y2tfdGltZXIpOwogCWVsc2UKIAkJbW9kX3RpbWVyKCZ0eHEtPnN0dWNrX3RpbWVyLCBqaWZmaWVzICsgdHhxLT53ZF90aW1lb3V0KTsKQEAgLTEwMjAsNyArMTA5NCw2IEBACiAJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0gSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKIAlzdHJ1Y3QgaXdsX3R4cSAqdHhxID0gJnRyYW5zX3BjaWUtPnR4cVt0eHFfaWRdOwogCWludCB0ZmRfbnVtID0gc3NuICYgKFRGRF9RVUVVRV9TSVpFX01BWCAtIDEpOwotCXN0cnVjdCBpd2xfcXVldWUgKnEgPSAmdHhxLT5xOwogCWludCBsYXN0X3RvX2ZyZWU7CiAKIAkvKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBtZWFudCB0byByZWxlYXNlIGNtZCBxdWV1ZSovCkBAIC0xMDM1LDIxICsxMTA4LDIxIEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWlmICh0eHEtPnEucmVhZF9wdHIgPT0gdGZkX251bSkKKwlpZiAodHhxLT5yZWFkX3B0ciA9PSB0ZmRfbnVtKQogCQlnb3RvIG91dDsKIAogCUlXTF9ERUJVR19UWF9SRVBMWSh0cmFucywgIltRICVkXSAlZCAtPiAlZCAoJWQpXG4iLAotCQkJICAgdHhxX2lkLCB0eHEtPnEucmVhZF9wdHIsIHRmZF9udW0sIHNzbik7CisJCQkgICB0eHFfaWQsIHR4cS0+cmVhZF9wdHIsIHRmZF9udW0sIHNzbik7CiAKIAkvKlNpbmNlIHdlIGZyZWUgdW50aWwgaW5kZXggX25vdF8gaW5jbHVzaXZlLCB0aGUgb25lIGJlZm9yZSBpbmRleCBpcwogCSAqIHRoZSBsYXN0IHdlIHdpbGwgZnJlZS4gVGhpcyBvbmUgbXVzdCBiZSB1c2VkICovCiAJbGFzdF90b19mcmVlID0gaXdsX3F1ZXVlX2RlY193cmFwKHRmZF9udW0pOwogCi0JaWYgKCFpd2xfcXVldWVfdXNlZChxLCBsYXN0X3RvX2ZyZWUpKSB7CisJaWYgKCFpd2xfcXVldWVfdXNlZCh0eHEsIGxhc3RfdG9fZnJlZSkpIHsKIAkJSVdMX0VSUih0cmFucywKIAkJCSIlczogUmVhZCBpbmRleCBmb3IgRE1BIHF1ZXVlIHR4cSBpZCAoJWQpLCBsYXN0X3RvX2ZyZWUgJWQgaXMgb3V0IG9mIHJhbmdlIFswLSVkXSAlZCAlZC5cbiIsCiAJCQlfX2Z1bmNfXywgdHhxX2lkLCBsYXN0X3RvX2ZyZWUsIFRGRF9RVUVVRV9TSVpFX01BWCwKLQkJCXEtPndyaXRlX3B0ciwgcS0+cmVhZF9wdHIpOworCQkJdHhxLT53cml0ZV9wdHIsIHR4cS0+cmVhZF9wdHIpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTEwNTcsOSArMTEzMCw5IEBACiAJCWdvdG8gb3V0OwogCiAJZm9yICg7Ci0JICAgICBxLT5yZWFkX3B0ciAhPSB0ZmRfbnVtOwotCSAgICAgcS0+cmVhZF9wdHIgPSBpd2xfcXVldWVfaW5jX3dyYXAocS0+cmVhZF9wdHIpKSB7Ci0JCXN0cnVjdCBza19idWZmICpza2IgPSB0eHEtPmVudHJpZXNbdHhxLT5xLnJlYWRfcHRyXS5za2I7CisJICAgICB0eHEtPnJlYWRfcHRyICE9IHRmZF9udW07CisJICAgICB0eHEtPnJlYWRfcHRyID0gaXdsX3F1ZXVlX2luY193cmFwKHR4cS0+cmVhZF9wdHIpKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSB0eHEtPmVudHJpZXNbdHhxLT5yZWFkX3B0cl0uc2tiOwogCiAJCWlmIChXQVJOX09OX09OQ0UoIXNrYikpCiAJCQljb250aW51ZTsKQEAgLTEwNjgsMTYgKzExNDEsMTcgQEAKIAogCQlfX3NrYl9xdWV1ZV90YWlsKHNrYnMsIHNrYik7CiAKLQkJdHhxLT5lbnRyaWVzW3R4cS0+cS5yZWFkX3B0cl0uc2tiID0gTlVMTDsKKwkJdHhxLT5lbnRyaWVzW3R4cS0+cmVhZF9wdHJdLnNrYiA9IE5VTEw7CiAKLQkJaXdsX3BjaWVfdHhxX2ludmFsX2J5dGVfY250X3RibCh0cmFucywgdHhxKTsKKwkJaWYgKCF0cmFucy0+Y2ZnLT51c2VfdGZoKQorCQkJaXdsX3BjaWVfdHhxX2ludmFsX2J5dGVfY250X3RibCh0cmFucywgdHhxKTsKIAogCQlpd2xfcGNpZV90eHFfZnJlZV90ZmQodHJhbnMsIHR4cSk7CiAJfQogCiAJaXdsX3BjaWVfdHhxX3Byb2dyZXNzKHR4cSk7CiAKLQlpZiAoaXdsX3F1ZXVlX3NwYWNlKCZ0eHEtPnEpID4gdHhxLT5xLmxvd19tYXJrICYmCisJaWYgKGl3bF9xdWV1ZV9zcGFjZSh0eHEpID4gdHhxLT5sb3dfbWFyayAmJgogCSAgICB0ZXN0X2JpdCh0eHFfaWQsIHRyYW5zX3BjaWUtPnF1ZXVlX3N0b3BwZWQpKSB7CiAJCXN0cnVjdCBza19idWZmX2hlYWQgb3ZlcmZsb3dfc2ticzsKIApAQCAtMTEwOSwxMiArMTE4MywxMiBAQAogCQl9CiAJCXNwaW5fbG9ja19iaCgmdHhxLT5sb2NrKTsKIAotCQlpZiAoaXdsX3F1ZXVlX3NwYWNlKCZ0eHEtPnEpID4gdHhxLT5xLmxvd19tYXJrKQorCQlpZiAoaXdsX3F1ZXVlX3NwYWNlKHR4cSkgPiB0eHEtPmxvd19tYXJrKQogCQkJaXdsX3dha2VfcXVldWUodHJhbnMsIHR4cSk7CiAJfQogCi0JaWYgKHEtPnJlYWRfcHRyID09IHEtPndyaXRlX3B0cikgewotCQlJV0xfREVCVUdfUlBNKHRyYW5zLCAiUSAlZCAtIGxhc3QgdHggcmVjbGFpbWVkXG4iLCBxLT5pZCk7CisJaWYgKHR4cS0+cmVhZF9wdHIgPT0gdHhxLT53cml0ZV9wdHIpIHsKKwkJSVdMX0RFQlVHX1JQTSh0cmFucywgIlEgJWQgLSBsYXN0IHR4IHJlY2xhaW1lZFxuIiwgdHhxLT5pZCk7CiAJCWl3bF90cmFuc191bnJlZih0cmFucyk7CiAJfQogCkBAIC0xMTc2LDMxICsxMjUwLDMwIEBACiB7CiAJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0gSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKIAlzdHJ1Y3QgaXdsX3R4cSAqdHhxID0gJnRyYW5zX3BjaWUtPnR4cVt0eHFfaWRdOwotCXN0cnVjdCBpd2xfcXVldWUgKnEgPSAmdHhxLT5xOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IG5mcmVlZCA9IDA7CiAKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZ0eHEtPmxvY2spOwogCi0JaWYgKChpZHggPj0gVEZEX1FVRVVFX1NJWkVfTUFYKSB8fCAoIWl3bF9xdWV1ZV91c2VkKHEsIGlkeCkpKSB7CisJaWYgKChpZHggPj0gVEZEX1FVRVVFX1NJWkVfTUFYKSB8fCAoIWl3bF9xdWV1ZV91c2VkKHR4cSwgaWR4KSkpIHsKIAkJSVdMX0VSUih0cmFucywKIAkJCSIlczogUmVhZCBpbmRleCBmb3IgRE1BIHF1ZXVlIHR4cSBpZCAoJWQpLCBpbmRleCAlZCBpcyBvdXQgb2YgcmFuZ2UgWzAtJWRdICVkICVkLlxuIiwKIAkJCV9fZnVuY19fLCB0eHFfaWQsIGlkeCwgVEZEX1FVRVVFX1NJWkVfTUFYLAotCQkJcS0+d3JpdGVfcHRyLCBxLT5yZWFkX3B0cik7CisJCQl0eHEtPndyaXRlX3B0ciwgdHhxLT5yZWFkX3B0cik7CiAJCXJldHVybjsKIAl9CiAKLQlmb3IgKGlkeCA9IGl3bF9xdWV1ZV9pbmNfd3JhcChpZHgpOyBxLT5yZWFkX3B0ciAhPSBpZHg7Ci0JICAgICBxLT5yZWFkX3B0ciA9IGl3bF9xdWV1ZV9pbmNfd3JhcChxLT5yZWFkX3B0cikpIHsKKwlmb3IgKGlkeCA9IGl3bF9xdWV1ZV9pbmNfd3JhcChpZHgpOyB0eHEtPnJlYWRfcHRyICE9IGlkeDsKKwkgICAgIHR4cS0+cmVhZF9wdHIgPSBpd2xfcXVldWVfaW5jX3dyYXAodHhxLT5yZWFkX3B0cikpIHsKIAogCQlpZiAobmZyZWVkKysgPiAwKSB7CiAJCQlJV0xfRVJSKHRyYW5zLCAiSENNRCBza2lwcGVkOiBpbmRleCAoJWQpICVkICVkXG4iLAotCQkJCWlkeCwgcS0+d3JpdGVfcHRyLCBxLT5yZWFkX3B0cik7CisJCQkJaWR4LCB0eHEtPndyaXRlX3B0ciwgdHhxLT5yZWFkX3B0cik7CiAJCQlpd2xfZm9yY2Vfbm1pKHRyYW5zKTsKIAkJfQogCX0KIAotCWlmIChxLT5yZWFkX3B0ciA9PSBxLT53cml0ZV9wdHIpIHsKKwlpZiAodHhxLT5yZWFkX3B0ciA9PSB0eHEtPndyaXRlX3B0cikgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHJhbnNfcGNpZS0+cmVnX2xvY2ssIGZsYWdzKTsKIAkJaXdsX3BjaWVfY2xlYXJfY21kX2luX2ZsaWdodCh0cmFucyk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRyYW5zX3BjaWUtPnJlZ19sb2NrLCBmbGFncyk7CkBAIC0xMjQ5LDYgKzEzMjIsOSBAQAogCWlmICh0ZXN0X2FuZF9zZXRfYml0KHR4cV9pZCwgdHJhbnNfcGNpZS0+cXVldWVfdXNlZCkpCiAJCVdBUk5fT05DRSgxLCAicXVldWUgJWQgYWxyZWFkeSB1c2VkIC0gZXhwZWN0IGlzc3VlcyIsIHR4cV9pZCk7CiAKKwlpZiAoY2ZnICYmIHRyYW5zLT5jZmctPnVzZV90ZmgpCisJCVdBUk5fT05DRSgxLCAiRXhwZWN0ZWQgbm8gY2FsbHMgdG8gU0NEIGNvbmZpZ3VyYXRpb24iKTsKKwogCXR4cS0+d2RfdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMod2RnX3RpbWVvdXQpOwogCiAJaWYgKGNmZykgewpAQCAtMTI4MywxNCArMTM1OSwxNCBAQAogCQkJICovCiAJCQlpd2xfc2NkX3R4cV9kaXNhYmxlX2FnZyh0cmFucywgdHhxX2lkKTsKIAotCQkJc3NuID0gdHhxLT5xLnJlYWRfcHRyOworCQkJc3NuID0gdHhxLT5yZWFkX3B0cjsKIAkJfQogCX0KIAogCS8qIFBsYWNlIGZpcnN0IFRGRCBhdCBpbmRleCBjb3JyZXNwb25kaW5nIHRvIHN0YXJ0IHNlcXVlbmNlIG51bWJlci4KIAkgKiBBc3N1bWVzIHRoYXQgc3NuX2lkeCBpcyB2YWxpZCAoIT0gMHhGRkYpICovCi0JdHhxLT5xLnJlYWRfcHRyID0gKHNzbiAmIDB4ZmYpOwotCXR4cS0+cS53cml0ZV9wdHIgPSAoc3NuICYgMHhmZik7CisJdHhxLT5yZWFkX3B0ciA9IChzc24gJiAweGZmKTsKKwl0eHEtPndyaXRlX3B0ciA9IChzc24gJiAweGZmKTsKIAlpd2xfd3JpdGVfZGlyZWN0MzIodHJhbnMsIEhCVVNfVEFSR19XUlBUUiwKIAkJCSAgIChzc24gJiAweGZmKSB8ICh0eHFfaWQgPDwgOCkpOwogCkBAIC0xMzQzLDYgKzE0MTksMTQgQEAKIAl0eHEtPmFtcGR1ID0gIXNoYXJlZF9tb2RlOwogfQogCitkbWFfYWRkcl90IGl3bF90cmFuc19wY2llX2dldF90eHFfYnl0ZV90YWJsZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgaW50IHR4cSkKK3sKKwlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOworCisJcmV0dXJuIHRyYW5zX3BjaWUtPnNjZF9iY190YmxzLmRtYSArCisJICAgICAgIHR4cSAqIHNpemVvZihzdHJ1Y3QgaXdsYWduX3NjZF9iY190YmwpOworfQorCiB2b2lkIGl3bF90cmFuc19wY2llX3R4cV9kaXNhYmxlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBpbnQgdHhxX2lkLAogCQkJCWJvb2wgY29uZmlndXJlX3NjZCkKIHsKQEAgLTEzNjYsNiArMTQ1MCw5IEBACiAJCXJldHVybjsKIAl9CiAKKwlpZiAoY29uZmlndXJlX3NjZCAmJiB0cmFucy0+Y2ZnLT51c2VfdGZoKQorCQlXQVJOX09OQ0UoMSwgIkV4cGVjdGVkIG5vIGNhbGxzIHRvIFNDRCBjb25maWd1cmF0aW9uIik7CisKIAlpZiAoY29uZmlndXJlX3NjZCkgewogCQlpd2xfc2NkX3R4cV9zZXRfaW5hY3RpdmUodHJhbnMsIHR4cV9pZCk7CiAKQEAgLTEzOTUsNyArMTQ4Miw2IEBACiB7CiAJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0gSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKIAlzdHJ1Y3QgaXdsX3R4cSAqdHhxID0gJnRyYW5zX3BjaWUtPnR4cVt0cmFuc19wY2llLT5jbWRfcXVldWVdOwotCXN0cnVjdCBpd2xfcXVldWUgKnEgPSAmdHhxLT5xOwogCXN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqb3V0X2NtZDsKIAlzdHJ1Y3QgaXdsX2NtZF9tZXRhICpvdXRfbWV0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTQxMCw3ICsxNDk2LDcgQEAKIAljb25zdCB1OCAqY21kZGF0YVtJV0xfTUFYX0NNRF9UQlNfUEVSX1RGRF07CiAJdTE2IGNtZGxlbltJV0xfTUFYX0NNRF9UQlNfUEVSX1RGRF07CiAKLQlpZiAoV0FSTighdHJhbnNfcGNpZS0+d2lkZV9jbWRfaGVhZGVyICYmCisJaWYgKFdBUk4oIXRyYW5zLT53aWRlX2NtZF9oZWFkZXIgJiYKIAkJIGdyb3VwX2lkID4gSVdMX0FMV0FZU19MT05HX0dST1VQLAogCQkgInVuc3VwcG9ydGVkIHdpZGUgY29tbWFuZCAlI3hcbiIsIGNtZC0+aWQpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE0OTQsNyArMTU4MCw3IEBACiAKIAlzcGluX2xvY2tfYmgoJnR4cS0+bG9jayk7CiAKLQlpZiAoaXdsX3F1ZXVlX3NwYWNlKHEpIDwgKChjbWQtPmZsYWdzICYgQ01EX0FTWU5DKSA/IDIgOiAxKSkgeworCWlmIChpd2xfcXVldWVfc3BhY2UodHhxKSA8ICgoY21kLT5mbGFncyAmIENNRF9BU1lOQykgPyAyIDogMSkpIHsKIAkJc3Bpbl91bmxvY2tfYmgoJnR4cS0+bG9jayk7CiAKIAkJSVdMX0VSUih0cmFucywgIk5vIHNwYWNlIGluIGNvbW1hbmQgcXVldWVcbiIpOwpAQCAtMTUwMyw3ICsxNTg5LDcgQEAKIAkJZ290byBmcmVlX2R1cF9idWY7CiAJfQogCi0JaWR4ID0gZ2V0X2NtZF9pbmRleChxLCBxLT53cml0ZV9wdHIpOworCWlkeCA9IGdldF9jbWRfaW5kZXgodHhxLCB0eHEtPndyaXRlX3B0cik7CiAJb3V0X2NtZCA9IHR4cS0+ZW50cmllc1tpZHhdLmNtZDsKIAlvdXRfbWV0YSA9ICZ0eHEtPmVudHJpZXNbaWR4XS5tZXRhOwogCkBAIC0xNTIyLDcgKzE2MDgsNyBAQAogCQlvdXRfY21kLT5oZHJfd2lkZS5yZXNlcnZlZCA9IDA7CiAJCW91dF9jbWQtPmhkcl93aWRlLnNlcXVlbmNlID0KIAkJCWNwdV90b19sZTE2KFFVRVVFX1RPX1NFUSh0cmFuc19wY2llLT5jbWRfcXVldWUpIHwKLQkJCQkJCSBJTkRFWF9UT19TRVEocS0+d3JpdGVfcHRyKSk7CisJCQkJCQkgSU5ERVhfVE9fU0VRKHR4cS0+d3JpdGVfcHRyKSk7CiAKIAkJY21kX3BvcyA9IHNpemVvZihzdHJ1Y3QgaXdsX2NtZF9oZWFkZXJfd2lkZSk7CiAJCWNvcHlfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXdsX2NtZF9oZWFkZXJfd2lkZSk7CkBAIC0xNTMwLDcgKzE2MTYsNyBAQAogCQlvdXRfY21kLT5oZHIuY21kID0gaXdsX2NtZF9vcGNvZGUoY21kLT5pZCk7CiAJCW91dF9jbWQtPmhkci5zZXF1ZW5jZSA9CiAJCQljcHVfdG9fbGUxNihRVUVVRV9UT19TRVEodHJhbnNfcGNpZS0+Y21kX3F1ZXVlKSB8Ci0JCQkJCQkgSU5ERVhfVE9fU0VRKHEtPndyaXRlX3B0cikpOworCQkJCQkJIElOREVYX1RPX1NFUSh0eHEtPndyaXRlX3B0cikpOwogCQlvdXRfY21kLT5oZHIuZ3JvdXBfaWQgPSAwOwogCiAJCWNtZF9wb3MgPSBzaXplb2Yoc3RydWN0IGl3bF9jbWRfaGVhZGVyKTsKQEAgLTE1ODAsNyArMTY2Niw3IEBACiAJCSAgICAgaXdsX2dldF9jbWRfc3RyaW5nKHRyYW5zLCBjbWQtPmlkKSwKIAkJICAgICBncm91cF9pZCwgb3V0X2NtZC0+aGRyLmNtZCwKIAkJICAgICBsZTE2X3RvX2NwdShvdXRfY21kLT5oZHIuc2VxdWVuY2UpLAotCQkgICAgIGNtZF9zaXplLCBxLT53cml0ZV9wdHIsIGlkeCwgdHJhbnNfcGNpZS0+Y21kX3F1ZXVlKTsKKwkJICAgICBjbWRfc2l6ZSwgdHhxLT53cml0ZV9wdHIsIGlkeCwgdHJhbnNfcGNpZS0+Y21kX3F1ZXVlKTsKIAogCS8qIHN0YXJ0IHRoZSBURkQgd2l0aCB0aGUgbWluaW11bSBjb3B5IGJ5dGVzICovCiAJdGIwX3NpemUgPSBtaW5fdChpbnQsIGNvcHlfc2l6ZSwgSVdMX0ZJUlNUX1RCX1NJWkUpOwpAQCAtMTU5Niw4ICsxNjgyLDggQEAKIAkJCQkJICAgY29weV9zaXplIC0gdGIwX3NpemUsCiAJCQkJCSAgIERNQV9UT19ERVZJQ0UpOwogCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IodHJhbnMtPmRldiwgcGh5c19hZGRyKSkgewotCQkJaXdsX3BjaWVfdGZkX3VubWFwKHRyYW5zLCBvdXRfbWV0YSwKLQkJCQkJICAgJnR4cS0+dGZkc1txLT53cml0ZV9wdHJdKTsKKwkJCWl3bF9wY2llX3RmZF91bm1hcCh0cmFucywgb3V0X21ldGEsIHR4cSwKKwkJCQkJICAgdHhxLT53cml0ZV9wdHIpOwogCQkJaWR4ID0gLUVOT01FTTsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC0xNjIwLDggKzE3MDYsOCBAQAogCQlwaHlzX2FkZHIgPSBkbWFfbWFwX3NpbmdsZSh0cmFucy0+ZGV2LCAodm9pZCAqKWRhdGEsCiAJCQkJCSAgIGNtZGxlbltpXSwgRE1BX1RPX0RFVklDRSk7CiAJCWlmIChkbWFfbWFwcGluZ19lcnJvcih0cmFucy0+ZGV2LCBwaHlzX2FkZHIpKSB7Ci0JCQlpd2xfcGNpZV90ZmRfdW5tYXAodHJhbnMsIG91dF9tZXRhLAotCQkJCQkgICAmdHhxLT50ZmRzW3EtPndyaXRlX3B0cl0pOworCQkJaXdsX3BjaWVfdGZkX3VubWFwKHRyYW5zLCBvdXRfbWV0YSwgdHhxLAorCQkJCQkgICB0eHEtPndyaXRlX3B0cik7CiAJCQlpZHggPSAtRU5PTUVNOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTE2MjksOCArMTcxNSw3IEBACiAJCWl3bF9wY2llX3R4cV9idWlsZF90ZmQodHJhbnMsIHR4cSwgcGh5c19hZGRyLCBjbWRsZW5baV0sIGZhbHNlKTsKIAl9CiAKLQlCVUlMRF9CVUdfT04oSVdMX05VTV9PRl9UQlMgKyBDTURfVEJfQklUTUFQX1BPUyA+Ci0JCSAgICAgc2l6ZW9mKG91dF9tZXRhLT5mbGFncykgKiBCSVRTX1BFUl9CWVRFKTsKKwlCVUlMRF9CVUdfT04oSVdMX1RGSF9OVU1fVEJTID4gc2l6ZW9mKG91dF9tZXRhLT50YnMpICogQklUU19QRVJfQllURSk7CiAJb3V0X21ldGEtPmZsYWdzID0gY21kLT5mbGFnczsKIAlpZiAoV0FSTl9PTl9PTkNFKHR4cS0+ZW50cmllc1tpZHhdLmZyZWVfYnVmKSkKIAkJa3pmcmVlKHR4cS0+ZW50cmllc1tpZHhdLmZyZWVfYnVmKTsKQEAgLTE2MzksNyArMTcyNCw3IEBACiAJdHJhY2VfaXdsd2lmaV9kZXZfaGNtZCh0cmFucy0+ZGV2LCBjbWQsIGNtZF9zaXplLCAmb3V0X2NtZC0+aGRyX3dpZGUpOwogCiAJLyogc3RhcnQgdGltZXIgaWYgcXVldWUgY3VycmVudGx5IGVtcHR5ICovCi0JaWYgKHEtPnJlYWRfcHRyID09IHEtPndyaXRlX3B0ciAmJiB0eHEtPndkX3RpbWVvdXQpCisJaWYgKHR4cS0+cmVhZF9wdHIgPT0gdHhxLT53cml0ZV9wdHIgJiYgdHhxLT53ZF90aW1lb3V0KQogCQltb2RfdGltZXIoJnR4cS0+c3R1Y2tfdGltZXIsIGppZmZpZXMgKyB0eHEtPndkX3RpbWVvdXQpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnRyYW5zX3BjaWUtPnJlZ19sb2NrLCBmbGFncyk7CkBAIC0xNjUxLDcgKzE3MzYsNyBAQAogCX0KIAogCS8qIEluY3JlbWVudCBhbmQgdXBkYXRlIHF1ZXVlJ3Mgd3JpdGUgaW5kZXggKi8KLQlxLT53cml0ZV9wdHIgPSBpd2xfcXVldWVfaW5jX3dyYXAocS0+d3JpdGVfcHRyKTsKKwl0eHEtPndyaXRlX3B0ciA9IGl3bF9xdWV1ZV9pbmNfd3JhcCh0eHEtPndyaXRlX3B0cik7CiAJaXdsX3BjaWVfdHhxX2luY193cl9wdHIodHJhbnMsIHR4cSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cmFuc19wY2llLT5yZWdfbG9jaywgZmxhZ3MpOwpAQCAtMTY4OSwyMCArMTc3NCwyMCBAQAogCWlmIChXQVJOKHR4cV9pZCAhPSB0cmFuc19wY2llLT5jbWRfcXVldWUsCiAJCSAid3JvbmcgY29tbWFuZCBxdWV1ZSAlZCAoc2hvdWxkIGJlICVkKSwgc2VxdWVuY2UgMHglWCByZWFkcD0lZCB3cml0ZXA9JWRcbiIsCiAJCSB0eHFfaWQsIHRyYW5zX3BjaWUtPmNtZF9xdWV1ZSwgc2VxdWVuY2UsCi0JCSB0cmFuc19wY2llLT50eHFbdHJhbnNfcGNpZS0+Y21kX3F1ZXVlXS5xLnJlYWRfcHRyLAotCQkgdHJhbnNfcGNpZS0+dHhxW3RyYW5zX3BjaWUtPmNtZF9xdWV1ZV0ucS53cml0ZV9wdHIpKSB7CisJCSB0cmFuc19wY2llLT50eHFbdHJhbnNfcGNpZS0+Y21kX3F1ZXVlXS5yZWFkX3B0ciwKKwkJIHRyYW5zX3BjaWUtPnR4cVt0cmFuc19wY2llLT5jbWRfcXVldWVdLndyaXRlX3B0cikpIHsKIAkJaXdsX3ByaW50X2hleF9lcnJvcih0cmFucywgcGt0LCAzMik7CiAJCXJldHVybjsKIAl9CiAKIAlzcGluX2xvY2tfYmgoJnR4cS0+bG9jayk7CiAKLQljbWRfaW5kZXggPSBnZXRfY21kX2luZGV4KCZ0eHEtPnEsIGluZGV4KTsKKwljbWRfaW5kZXggPSBnZXRfY21kX2luZGV4KHR4cSwgaW5kZXgpOwogCWNtZCA9IHR4cS0+ZW50cmllc1tjbWRfaW5kZXhdLmNtZDsKIAltZXRhID0gJnR4cS0+ZW50cmllc1tjbWRfaW5kZXhdLm1ldGE7CiAJY21kX2lkID0gaXdsX2NtZF9pZChjbWQtPmhkci5jbWQsIGdyb3VwX2lkLCAwKTsKIAotCWl3bF9wY2llX3RmZF91bm1hcCh0cmFucywgbWV0YSwgJnR4cS0+dGZkc1tpbmRleF0pOworCWl3bF9wY2llX3RmZF91bm1hcCh0cmFucywgbWV0YSwgdHhxLCBpbmRleCk7CiAKIAkvKiBJbnB1dCBlcnJvciBjaGVja2luZyBpcyBkb25lIHdoZW4gY29tbWFuZHMgYXJlIGFkZGVkIHRvIHF1ZXVlLiAqLwogCWlmIChtZXRhLT5mbGFncyAmIENNRF9XQU5UX1NLQikgewpAQCAtMTgxNSwxNCArMTkwMCwxMyBAQAogCQkJCSBIT1NUX0NPTVBMRVRFX1RJTUVPVVQpOwogCWlmICghcmV0KSB7CiAJCXN0cnVjdCBpd2xfdHhxICp0eHEgPSAmdHJhbnNfcGNpZS0+dHhxW3RyYW5zX3BjaWUtPmNtZF9xdWV1ZV07Ci0JCXN0cnVjdCBpd2xfcXVldWUgKnEgPSAmdHhxLT5xOwogCiAJCUlXTF9FUlIodHJhbnMsICJFcnJvciBzZW5kaW5nICVzOiB0aW1lIG91dCBhZnRlciAlZG1zLlxuIiwKIAkJCWl3bF9nZXRfY21kX3N0cmluZyh0cmFucywgY21kLT5pZCksCiAJCQlqaWZmaWVzX3RvX21zZWNzKEhPU1RfQ09NUExFVEVfVElNRU9VVCkpOwogCiAJCUlXTF9FUlIodHJhbnMsICJDdXJyZW50IENNRCBxdWV1ZSByZWFkX3B0ciAlZCB3cml0ZV9wdHIgJWRcbiIsCi0JCQlxLT5yZWFkX3B0ciwgcS0+d3JpdGVfcHRyKTsKKwkJCXR4cS0+cmVhZF9wdHIsIHR4cS0+d3JpdGVfcHRyKTsKIAogCQljbGVhcl9iaXQoU1RBVFVTX1NZTkNfSENNRF9BQ1RJVkUsICZ0cmFucy0+c3RhdHVzKTsKIAkJSVdMX0RFQlVHX0lORk8odHJhbnMsICJDbGVhcmluZyBIQ01EX0FDVElWRSBmb3IgY29tbWFuZCAlc1xuIiwKQEAgLTE5MDAsNyArMTk4NCw3IEBACiAJCQkgICAgIHN0cnVjdCBpd2xfY21kX21ldGEgKm91dF9tZXRhLAogCQkJICAgICBzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKmRldl9jbWQsIHUxNiB0YjFfbGVuKQogewotCXN0cnVjdCBpd2xfcXVldWUgKnEgPSAmdHhxLT5xOworCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CiAJdTE2IHRiMl9sZW47CiAJaW50IGk7CiAKQEAgLTE5MTUsOCArMTk5OSw4IEBACiAJCQkJCQkgICAgIHNrYi0+ZGF0YSArIGhkcl9sZW4sCiAJCQkJCQkgICAgIHRiMl9sZW4sIERNQV9UT19ERVZJQ0UpOwogCQlpZiAodW5saWtlbHkoZG1hX21hcHBpbmdfZXJyb3IodHJhbnMtPmRldiwgdGIyX3BoeXMpKSkgewotCQkJaXdsX3BjaWVfdGZkX3VubWFwKHRyYW5zLCBvdXRfbWV0YSwKLQkJCQkJICAgJnR4cS0+dGZkc1txLT53cml0ZV9wdHJdKTsKKwkJCWl3bF9wY2llX3RmZF91bm1hcCh0cmFucywgb3V0X21ldGEsIHR4cSwKKwkJCQkJICAgdHhxLT53cml0ZV9wdHIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJaXdsX3BjaWVfdHhxX2J1aWxkX3RmZCh0cmFucywgdHhxLCB0YjJfcGh5cywgdGIyX2xlbiwgZmFsc2UpOwpAQCAtMTkzNSwxOSArMjAxOSwxOSBAQAogCQkJCQkgICBza2JfZnJhZ19zaXplKGZyYWcpLCBETUFfVE9fREVWSUNFKTsKIAogCQlpZiAodW5saWtlbHkoZG1hX21hcHBpbmdfZXJyb3IodHJhbnMtPmRldiwgdGJfcGh5cykpKSB7Ci0JCQlpd2xfcGNpZV90ZmRfdW5tYXAodHJhbnMsIG91dF9tZXRhLAotCQkJCQkgICAmdHhxLT50ZmRzW3EtPndyaXRlX3B0cl0pOworCQkJaXdsX3BjaWVfdGZkX3VubWFwKHRyYW5zLCBvdXRfbWV0YSwgdHhxLAorCQkJCQkgICB0eHEtPndyaXRlX3B0cik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQl0Yl9pZHggPSBpd2xfcGNpZV90eHFfYnVpbGRfdGZkKHRyYW5zLCB0eHEsIHRiX3BoeXMsCiAJCQkJCQlza2JfZnJhZ19zaXplKGZyYWcpLCBmYWxzZSk7CiAKLQkJb3V0X21ldGEtPmZsYWdzIHw9IEJJVCh0Yl9pZHggKyBDTURfVEJfQklUTUFQX1BPUyk7CisJCW91dF9tZXRhLT50YnMgfD0gQklUKHRiX2lkeCk7CiAJfQogCiAJdHJhY2VfaXdsd2lmaV9kZXZfdHgodHJhbnMtPmRldiwgc2tiLAotCQkJICAgICAmdHhxLT50ZmRzW3R4cS0+cS53cml0ZV9wdHJdLAotCQkJICAgICBzaXplb2Yoc3RydWN0IGl3bF90ZmQpLAorCQkJICAgICBpd2xfcGNpZV9nZXRfdGZkKHRyYW5zX3BjaWUsIHR4cSwgdHhxLT53cml0ZV9wdHIpLAorCQkJICAgICB0cmFuc19wY2llLT50ZmRfc2l6ZSwKIAkJCSAgICAgJmRldl9jbWQtPmhkciwgSVdMX0ZJUlNUX1RCX1NJWkUgKyB0YjFfbGVuLAogCQkJICAgICBza2ItPmRhdGEgKyBoZHJfbGVuLCB0YjJfbGVuKTsKIAl0cmFjZV9pd2x3aWZpX2Rldl90eF9kYXRhKHRyYW5zLT5kZXYsIHNrYiwKQEAgLTIwMDgsNyArMjA5Miw2IEBACiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9ICh2b2lkICopc2tiLT5kYXRhOwogCXVuc2lnbmVkIGludCBzbmFwX2lwX3RjcF9oZHJsZW4sIGlwX2hkcmxlbiwgdG90YWxfbGVuLCBoZHJfcm9vbTsKIAl1bnNpZ25lZCBpbnQgbXNzID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKLQlzdHJ1Y3QgaXdsX3F1ZXVlICpxID0gJnR4cS0+cTsKIAl1MTYgbGVuZ3RoLCBpdl9sZW4sIGFtc2R1X3BhZDsKIAl1OCAqc3RhcnRfaGRyOwogCXN0cnVjdCBpd2xfdHNvX2hkcl9wYWdlICpoZHJfcGFnZTsKQEAgLTIwMjIsOCArMjEwNSw4IEBACiAJCUlFRUU4MDIxMV9DQ01QX0hEUl9MRU4gOiAwOwogCiAJdHJhY2VfaXdsd2lmaV9kZXZfdHgodHJhbnMtPmRldiwgc2tiLAotCQkJICAgICAmdHhxLT50ZmRzW3R4cS0+cS53cml0ZV9wdHJdLAotCQkJICAgICBzaXplb2Yoc3RydWN0IGl3bF90ZmQpLAorCQkJICAgICBpd2xfcGNpZV9nZXRfdGZkKHRyYW5zX3BjaWUsIHR4cSwgdHhxLT53cml0ZV9wdHIpLAorCQkJICAgICB0cmFuc19wY2llLT50ZmRfc2l6ZSwKIAkJCSAgICAgJmRldl9jbWQtPmhkciwgSVdMX0ZJUlNUX1RCX1NJWkUgKyB0YjFfbGVuLAogCQkJICAgICBOVUxMLCAwKTsKIApAQCAtMjE3OSw3ICsyMjYyLDcgQEAKIAlyZXR1cm4gMDsKIAogb3V0X3VubWFwOgotCWl3bF9wY2llX3RmZF91bm1hcCh0cmFucywgb3V0X21ldGEsICZ0eHEtPnRmZHNbcS0+d3JpdGVfcHRyXSk7CisJaXdsX3BjaWVfdGZkX3VubWFwKHRyYW5zLCBvdXRfbWV0YSwgdHhxLCB0eHEtPndyaXRlX3B0cik7CiAJcmV0dXJuIHJldDsKIH0KICNlbHNlIC8qIENPTkZJR19JTkVUICovCkBAIC0yMjAzLDkgKzIyODYsOSBAQAogCXN0cnVjdCBpd2xfdHhfY21kICp0eF9jbWQgPSAoc3RydWN0IGl3bF90eF9jbWQgKilkZXZfY21kLT5wYXlsb2FkOwogCXN0cnVjdCBpd2xfY21kX21ldGEgKm91dF9tZXRhOwogCXN0cnVjdCBpd2xfdHhxICp0eHE7Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcTsKIAlkbWFfYWRkcl90IHRiMF9waHlzLCB0YjFfcGh5cywgc2NyYXRjaF9waHlzOwogCXZvaWQgKnRiMV9hZGRyOworCXZvaWQgKnRmZDsKIAl1MTYgbGVuLCB0YjFfbGVuOwogCWJvb2wgd2FpdF93cml0ZV9wdHI7CiAJX19sZTE2IGZjOwpAQCAtMjIxNCw3ICsyMjk3LDYgQEAKIAlib29sIGFtc2R1OwogCiAJdHhxID0gJnRyYW5zX3BjaWUtPnR4cVt0eHFfaWRdOwotCXEgPSAmdHhxLT5xOwogCiAJaWYgKFdBUk5fT05DRSghdGVzdF9iaXQodHhxX2lkLCB0cmFuc19wY2llLT5xdWV1ZV91c2VkKSwKIAkJICAgICAgIlRYIG9uIHVudXNlZCBxdWV1ZSAlZFxuIiwgdHhxX2lkKSkKQEAgLTIyMzYsNyArMjMxOCw3IEBACiAJfQogCiAJaWYgKHNrYl9pc19ub25saW5lYXIoc2tiKSAmJgotCSAgICBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID4gSVdMX1BDSUVfTUFYX0ZSQUdTICYmCisJICAgIHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPiBJV0xfUENJRV9NQVhfRlJBR1ModHJhbnNfcGNpZSkgJiYKIAkgICAgX19za2JfbGluZWFyaXplKHNrYikpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0yMjQ5LDExICsyMzMxLDExIEBACiAKIAlzcGluX2xvY2soJnR4cS0+bG9jayk7CiAKLQlpZiAoaXdsX3F1ZXVlX3NwYWNlKHEpIDwgcS0+aGlnaF9tYXJrKSB7CisJaWYgKGl3bF9xdWV1ZV9zcGFjZSh0eHEpIDwgdHhxLT5oaWdoX21hcmspIHsKIAkJaXdsX3N0b3BfcXVldWUodHJhbnMsIHR4cSk7CiAKIAkJLyogZG9uJ3QgcHV0IHRoZSBwYWNrZXQgb24gdGhlIHJpbmcsIGlmIHRoZXJlIGlzIG5vIHJvb20gKi8KLQkJaWYgKHVubGlrZWx5KGl3bF9xdWV1ZV9zcGFjZShxKSA8IDMpKSB7CisJCWlmICh1bmxpa2VseShpd2xfcXVldWVfc3BhY2UodHhxKSA8IDMpKSB7CiAJCQlzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKipkZXZfY21kX3B0cjsKIAogCQkJZGV2X2NtZF9wdHIgPSAodm9pZCAqKSgodTggKilza2ItPmNiICsKQEAgLTIyNzQsMTkgKzIzNTYsMTkgQEAKIAkgKi8KIAl3aWZpX3NlcSA9IElFRUU4MDIxMV9TRVFfVE9fU04obGUxNl90b19jcHUoaGRyLT5zZXFfY3RybCkpOwogCVdBUk5fT05DRSh0eHEtPmFtcGR1ICYmCi0JCSAgKHdpZmlfc2VxICYgMHhmZikgIT0gcS0+d3JpdGVfcHRyLAorCQkgICh3aWZpX3NlcSAmIDB4ZmYpICE9IHR4cS0+d3JpdGVfcHRyLAogCQkgICJROiAlZCBXaUZpIFNlcSAlZCB0ZmROdW0gJWQiLAotCQkgIHR4cV9pZCwgd2lmaV9zZXEsIHEtPndyaXRlX3B0cik7CisJCSAgdHhxX2lkLCB3aWZpX3NlcSwgdHhxLT53cml0ZV9wdHIpOwogCiAJLyogU2V0IHVwIGRyaXZlciBkYXRhIGZvciB0aGlzIFRGRCAqLwotCXR4cS0+ZW50cmllc1txLT53cml0ZV9wdHJdLnNrYiA9IHNrYjsKLQl0eHEtPmVudHJpZXNbcS0+d3JpdGVfcHRyXS5jbWQgPSBkZXZfY21kOworCXR4cS0+ZW50cmllc1t0eHEtPndyaXRlX3B0cl0uc2tiID0gc2tiOworCXR4cS0+ZW50cmllc1t0eHEtPndyaXRlX3B0cl0uY21kID0gZGV2X2NtZDsKIAogCWRldl9jbWQtPmhkci5zZXF1ZW5jZSA9CiAJCWNwdV90b19sZTE2KCh1MTYpKFFVRVVFX1RPX1NFUSh0eHFfaWQpIHwKLQkJCSAgICBJTkRFWF9UT19TRVEocS0+d3JpdGVfcHRyKSkpOworCQkJICAgIElOREVYX1RPX1NFUSh0eHEtPndyaXRlX3B0cikpKTsKIAotCXRiMF9waHlzID0gaXdsX3BjaWVfZ2V0X2ZpcnN0X3RiX2RtYSh0eHEsIHEtPndyaXRlX3B0cik7CisJdGIwX3BoeXMgPSBpd2xfcGNpZV9nZXRfZmlyc3RfdGJfZG1hKHR4cSwgdHhxLT53cml0ZV9wdHIpOwogCXNjcmF0Y2hfcGh5cyA9IHRiMF9waHlzICsgc2l6ZW9mKHN0cnVjdCBpd2xfY21kX2hlYWRlcikgKwogCQkgICAgICAgb2Zmc2V0b2Yoc3RydWN0IGl3bF90eF9jbWQsIHNjcmF0Y2gpOwogCkBAIC0yMjk0LDcgKzIzNzYsNyBAQAogCXR4X2NtZC0+ZHJhbV9tc2JfcHRyID0gaXdsX2dldF9kbWFfaGlfYWRkcihzY3JhdGNoX3BoeXMpOwogCiAJLyogU2V0IHVwIGZpcnN0IGVtcHR5IGVudHJ5IGluIHF1ZXVlJ3MgYXJyYXkgb2YgVHgvY21kIGJ1ZmZlcnMgKi8KLQlvdXRfbWV0YSA9ICZ0eHEtPmVudHJpZXNbcS0+d3JpdGVfcHRyXS5tZXRhOworCW91dF9tZXRhID0gJnR4cS0+ZW50cmllc1t0eHEtPndyaXRlX3B0cl0ubWV0YTsKIAlvdXRfbWV0YS0+ZmxhZ3MgPSAwOwogCiAJLyoKQEAgLTIzMTksNyArMjQwMSw3IEBACiAJfQogCiAJLyogVGhlIGZpcnN0IFRCIHBvaW50cyB0byBiaS1kaXJlY3Rpb25hbCBETUEgZGF0YSAqLwotCW1lbWNweSgmdHhxLT5maXJzdF90Yl9idWZzW3EtPndyaXRlX3B0cl0sICZkZXZfY21kLT5oZHIsCisJbWVtY3B5KCZ0eHEtPmZpcnN0X3RiX2J1ZnNbdHhxLT53cml0ZV9wdHJdLCAmZGV2X2NtZC0+aGRyLAogCSAgICAgICBJV0xfRklSU1RfVEJfU0laRSk7CiAJaXdsX3BjaWVfdHhxX2J1aWxkX3RmZCh0cmFucywgdHhxLCB0YjBfcGh5cywKIAkJCSAgICAgICBJV0xfRklSU1RfVEJfU0laRSwgdHJ1ZSk7CkBAIC0yMzQ0LDEzICsyNDI2LDE1IEBACiAJCWdvdG8gb3V0X2VycjsKIAl9CiAKKwl0ZmQgPSBpd2xfcGNpZV9nZXRfdGZkKHRyYW5zX3BjaWUsIHR4cSwgdHhxLT53cml0ZV9wdHIpOwogCS8qIFNldCB1cCBlbnRyeSBmb3IgdGhpcyBURkQgaW4gVHggYnl0ZS1jb3VudCBhcnJheSAqLwotCWl3bF9wY2llX3R4cV91cGRhdGVfYnl0ZV9jbnRfdGJsKHRyYW5zLCB0eHEsIGxlMTZfdG9fY3B1KHR4X2NtZC0+bGVuKSk7CisJaXdsX3BjaWVfdHhxX3VwZGF0ZV9ieXRlX2NudF90YmwodHJhbnMsIHR4cSwgbGUxNl90b19jcHUodHhfY21kLT5sZW4pLAorCQkJCQkgaXdsX3BjaWVfdGZkX2dldF9udW1fdGJzKHRyYW5zLCB0ZmQpKTsKIAogCXdhaXRfd3JpdGVfcHRyID0gaWVlZTgwMjExX2hhc19tb3JlZnJhZ3MoZmMpOwogCiAJLyogc3RhcnQgdGltZXIgaWYgcXVldWUgY3VycmVudGx5IGVtcHR5ICovCi0JaWYgKHEtPnJlYWRfcHRyID09IHEtPndyaXRlX3B0cikgeworCWlmICh0eHEtPnJlYWRfcHRyID09IHR4cS0+d3JpdGVfcHRyKSB7CiAJCWlmICh0eHEtPndkX3RpbWVvdXQpIHsKIAkJCS8qCiAJCQkgKiBJZiB0aGUgVFhRIGlzIGFjdGl2ZSwgdGhlbiBzZXQgdGhlIHRpbWVyLCBpZiBub3QsCkBAIC0yMzY0LDEyICsyNDQ4LDEyIEBACiAJCQllbHNlCiAJCQkJdHhxLT5mcm96ZW5fZXhwaXJ5X3JlbWFpbmRlciA9IHR4cS0+d2RfdGltZW91dDsKIAkJfQotCQlJV0xfREVCVUdfUlBNKHRyYW5zLCAiUTogJWQgZmlyc3QgdHggLSB0YWtlIHJlZlxuIiwgcS0+aWQpOworCQlJV0xfREVCVUdfUlBNKHRyYW5zLCAiUTogJWQgZmlyc3QgdHggLSB0YWtlIHJlZlxuIiwgdHhxLT5pZCk7CiAJCWl3bF90cmFuc19yZWYodHJhbnMpOwogCX0KIAogCS8qIFRlbGwgZGV2aWNlIHRoZSB3cml0ZSBpbmRleCAqanVzdCBwYXN0KiB0aGlzIGxhdGVzdCBmaWxsZWQgVEZEICovCi0JcS0+d3JpdGVfcHRyID0gaXdsX3F1ZXVlX2luY193cmFwKHEtPndyaXRlX3B0cik7CisJdHhxLT53cml0ZV9wdHIgPSBpd2xfcXVldWVfaW5jX3dyYXAodHhxLT53cml0ZV9wdHIpOwogCWlmICghd2FpdF93cml0ZV9wdHIpCiAJCWl3bF9wY2llX3R4cV9pbmNfd3JfcHRyKHRyYW5zLCB0eHEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlcnNpbC9ob3N0YXAvaG9zdGFwX2lvY3RsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlcnNpbC9ob3N0YXAvaG9zdGFwX2lvY3RsLmMKaW5kZXggM2U1ZmE3OC4uYTU2NTZiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZXJzaWwvaG9zdGFwL2hvc3RhcF9pb2N0bC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVyc2lsL2hvc3RhcC9ob3N0YXBfaW9jdGwuYwpAQCAtMzA0MSwxMyArMzA0MSw5IEBACiAJICAgIHAtPmxlbmd0aCA+IDEwMjQgfHwgIXAtPnBvaW50ZXIpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcGFyYW0gPSBrbWFsbG9jKHAtPmxlbmd0aCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHBhcmFtID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKHBhcmFtLCBwLT5wb2ludGVyLCBwLT5sZW5ndGgpKSB7Ci0JCXJldCA9IC1FRkFVTFQ7Ci0JCWdvdG8gb3V0OworCXBhcmFtID0gbWVtZHVwX3VzZXIocC0+cG9pbnRlciwgcC0+bGVuZ3RoKTsKKwlpZiAoSVNfRVJSKHBhcmFtKSkgeworCQlyZXR1cm4gUFRSX0VSUihwYXJhbSk7CiAJfQogCiAJaWYgKHAtPmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgcHJpc20yX2Rvd25sb2FkX3BhcmFtKSArCkBAIC0zODAzLDEzICszNzk5LDkgQEAKIAkgICAgcC0+bGVuZ3RoID4gUFJJU00yX0hPU1RBUERfTUFYX0JVRl9TSVpFIHx8ICFwLT5wb2ludGVyKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXBhcmFtID0ga21hbGxvYyhwLT5sZW5ndGgsIEdGUF9LRVJORUwpOwotCWlmIChwYXJhbSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcihwYXJhbSwgcC0+cG9pbnRlciwgcC0+bGVuZ3RoKSkgewotCQlyZXQgPSAtRUZBVUxUOwotCQlnb3RvIG91dDsKKwlwYXJhbSA9IG1lbWR1cF91c2VyKHAtPnBvaW50ZXIsIHAtPmxlbmd0aCk7CisJaWYgKElTX0VSUihwYXJhbSkpIHsKKwkJcmV0dXJuIFBUUl9FUlIocGFyYW0pOwogCX0KIAogCXN3aXRjaCAocGFyYW0tPmNtZCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZXJzaWwvb3Jpbm9jby9vcmlub2NvX3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZXJzaWwvb3Jpbm9jby9vcmlub2NvX3VzYi5jCmluZGV4IDU2ZjEwOWIuLmJjYTY5MzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVyc2lsL29yaW5vY28vb3Jpbm9jb191c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlcnNpbC9vcmlub2NvL29yaW5vY29fdXNiLmMKQEAgLTE2MTMsMTAgKzE2MTMsOCBAQAogCQkJfQogCiAJCQl1cHJpdi0+cmVhZF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCQkJaWYgKCF1cHJpdi0+cmVhZF91cmIpIHsKLQkJCQllcnIoIk5vIGZyZWUgdXJicyBhdmFpbGFibGUiKTsKKwkJCWlmICghdXByaXYtPnJlYWRfdXJiKQogCQkJCWdvdG8gZXJyb3I7Ci0JCQl9CiAJCQlpZiAobGUxNl90b19jcHUoZXAtPndNYXhQYWNrZXRTaXplKSAhPSA2NCkKIAkJCQlwcl93YXJuKCJidWxrIGluOiB3TWF4UGFja2V0U2l6ZSE9IDY0XG4iKTsKIAkJCWlmIChlcC0+YkVuZHBvaW50QWRkcmVzcyAhPSAoMiB8IFVTQl9ESVJfSU4pKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFjODAyMTFfaHdzaW0uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hYzgwMjExX2h3c2ltLmMKaW5kZXggOGMzNWFjOC4uNDMxZjEzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFjODAyMTFfaHdzaW0uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYWM4MDIxMV9od3NpbS5jCkBAIC00ODcsNyArNDg3LDcgQEAKIH07CiAKIHN0YXRpYyBzcGlubG9ja190IGh3c2ltX3JhZGlvX2xvY2s7Ci1zdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBod3NpbV9yYWRpb3M7CitzdGF0aWMgTElTVF9IRUFEKGh3c2ltX3JhZGlvcyk7CiBzdGF0aWMgaW50IGh3c2ltX3JhZGlvX2lkeDsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbWFjODAyMTFfaHdzaW1fZHJpdmVyID0gewpAQCAtMzM3Niw3ICszMzc2LDYgQEAKIAkJbWFjODAyMTFfaHdzaW1fdW5hc3NpZ25fdmlmX2NoYW5jdHg7CiAKIAlzcGluX2xvY2tfaW5pdCgmaHdzaW1fcmFkaW9fbG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJmh3c2ltX3JhZGlvcyk7CiAKIAllcnIgPSByZWdpc3Rlcl9wZXJuZXRfZGV2aWNlKCZod3NpbV9uZXRfb3BzKTsKIAlpZiAoZXJyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9saWJlcnRhc190Zi9pZl91c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbGliZXJ0YXNfdGYvaWZfdXNiLmMKaW5kZXggNzk5YTJlZi4uZTBhZGU0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9saWJlcnRhc190Zi9pZl91c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL2xpYmVydGFzX3RmL2lmX3VzYi5jCkBAIC0xOTgsMjIgKzE5OCwxNiBAQAogCX0KIAogCWNhcmRwLT5yeF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghY2FyZHAtPnJ4X3VyYikgewotCQlsYnRmX2RlYl91c2JkKCZ1ZGV2LT5kZXYsICJSeCBVUkIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCWlmICghY2FyZHAtPnJ4X3VyYikKIAkJZ290byBkZWFsbG9jOwotCX0KIAogCWNhcmRwLT50eF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghY2FyZHAtPnR4X3VyYikgewotCQlsYnRmX2RlYl91c2JkKCZ1ZGV2LT5kZXYsICJUeCBVUkIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCWlmICghY2FyZHAtPnR4X3VyYikKIAkJZ290byBkZWFsbG9jOwotCX0KIAogCWNhcmRwLT5jbWRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNhcmRwLT5jbWRfdXJiKSB7Ci0JCWxidGZfZGViX3VzYmQoJnVkZXYtPmRldiwgIkNtZCBVUkIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCWlmICghY2FyZHAtPmNtZF91cmIpCiAJCWdvdG8gZGVhbGxvYzsKLQl9CiAKIAljYXJkcC0+ZXBfb3V0X2J1ZiA9IGttYWxsb2MoTVJWRFJWX0VUSF9UWF9QQUNLRVRfQlVGRkVSX1NJWkUsCiAJCQkJICAgIEdGUF9LRVJORUwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4LzExaC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4LzExaC5jCmluZGV4IDgxYzYwZDAuLjQzZGNjZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC8xMWguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvMTFoLmMKQEAgLTI2MCwyMiArMjYwLDE3IEBACiAKIAlyZHJfZXZlbnQgPSAodm9pZCAqKShza2ItPmRhdGEgKyBzaXplb2YodTMyKSk7CiAKLQlpZiAobGUzMl90b19jcHUocmRyX2V2ZW50LT5wYXNzZWQpKSB7Ci0JCW13aWZpZXhfZGJnKHByaXYtPmFkYXB0ZXIsIE1TRywKLQkJCSAgICAicmFkYXIgZGV0ZWN0ZWQ7IGluZGljYXRpbmcga2VybmVsXG4iKTsKLQkJaWYgKG13aWZpZXhfc3RvcF9yYWRhcl9kZXRlY3Rpb24ocHJpdiwgJnByaXYtPmRmc19jaGFuZGVmKSkKLQkJCW13aWZpZXhfZGJnKHByaXYtPmFkYXB0ZXIsIEVSUk9SLAotCQkJCSAgICAiRmFpbGVkIHRvIHN0b3AgQ0FDIGluIEZXXG4iKTsKLQkJY2ZnODAyMTFfcmFkYXJfZXZlbnQocHJpdi0+YWRhcHRlci0+d2lwaHksICZwcml2LT5kZnNfY2hhbmRlZiwKLQkJCQkgICAgIEdGUF9LRVJORUwpOwotCQltd2lmaWV4X2RiZyhwcml2LT5hZGFwdGVyLCBNU0csICJyZWdkb21haW46ICVkXG4iLAotCQkJICAgIHJkcl9ldmVudC0+cmVnX2RvbWFpbik7Ci0JCW13aWZpZXhfZGJnKHByaXYtPmFkYXB0ZXIsIE1TRywgInJhZGFyIGRldGVjdGlvbiB0eXBlOiAlZFxuIiwKLQkJCSAgICByZHJfZXZlbnQtPmRldF90eXBlKTsKLQl9IGVsc2UgewotCQltd2lmaWV4X2RiZyhwcml2LT5hZGFwdGVyLCBNU0csCi0JCQkgICAgImZhbHNlIHJhZGFyIGRldGVjdGlvbiBldmVudCFcbiIpOwotCX0KKwltd2lmaWV4X2RiZyhwcml2LT5hZGFwdGVyLCBNU0csCisJCSAgICAicmFkYXIgZGV0ZWN0ZWQ7IGluZGljYXRpbmcga2VybmVsXG4iKTsKKwlpZiAobXdpZmlleF9zdG9wX3JhZGFyX2RldGVjdGlvbihwcml2LCAmcHJpdi0+ZGZzX2NoYW5kZWYpKQorCQltd2lmaWV4X2RiZyhwcml2LT5hZGFwdGVyLCBFUlJPUiwKKwkJCSAgICAiRmFpbGVkIHRvIHN0b3AgQ0FDIGluIEZXXG4iKTsKKwljZmc4MDIxMV9yYWRhcl9ldmVudChwcml2LT5hZGFwdGVyLT53aXBoeSwgJnByaXYtPmRmc19jaGFuZGVmLAorCQkJICAgICBHRlBfS0VSTkVMKTsKKwltd2lmaWV4X2RiZyhwcml2LT5hZGFwdGVyLCBNU0csICJyZWdkb21haW46ICVkXG4iLAorCQkgICAgcmRyX2V2ZW50LT5yZWdfZG9tYWluKTsKKwltd2lmaWV4X2RiZyhwcml2LT5hZGFwdGVyLCBNU0csICJyYWRhciBkZXRlY3Rpb24gdHlwZTogJWRcbiIsCisJCSAgICByZHJfZXZlbnQtPmRldF90eXBlKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4LzExbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4LzExbi5oCmluZGV4IGFmZGQ1OGEuLmVhMGZhNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC8xMW4uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvMTFuLmgKQEAgLTE3MSw5ICsxNzEsMTAgQEAKIHN0YXRpYyBpbmxpbmUgaW50IG13aWZpZXhfaXNfc3RhXzExbl9lbmFibGVkKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCiAJCQkJCSAgICAgc3RydWN0IG13aWZpZXhfc3RhX25vZGUgKm5vZGUpCiB7Ci0KLQlpZiAoIW5vZGUgfHwgKHByaXYtPmJzc19yb2xlICE9IE1XSUZJRVhfQlNTX1JPTEVfVUFQKSB8fAotCSAgICAhcHJpdi0+YXBfMTFuX2VuYWJsZWQpCisJaWYgKCFub2RlIHx8ICgocHJpdi0+YnNzX3JvbGUgPT0gTVdJRklFWF9CU1NfUk9MRV9VQVApICYmCisJCSAgICAgICFwcml2LT5hcF8xMW5fZW5hYmxlZCkgfHwKKwkgICAgKChwcml2LT5ic3NfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgJiYKKwkgICAgICFwcml2LT5hZGFwdGVyLT5hZGhvY18xMW5fZW5hYmxlZCkpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIG5vZGUtPmlzXzExbl9lbmFibGVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4LzExbl9hZ2dyLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvMTFuX2FnZ3IuYwppbmRleCBkYzQ5YzNkLi5jNDdkNjM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvMTFuX2FnZ3IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvMTFuX2FnZ3IuYwpAQCAtMjA1LDcgKzIwNSw4IEBACiAKIAlkbyB7CiAJCS8qIENoZWNrIGlmIEFNU0RVIGNhbiBhY2NvbW1vZGF0ZSB0aGlzIE1TRFUgKi8KLQkJaWYgKHNrYl90YWlscm9vbShza2JfYWdncikgPCAoc2tiX3NyYy0+bGVuICsgTExDX1NOQVBfTEVOKSkKKwkJaWYgKChza2JfYWdnci0+bGVuICsgc2tiX3NyYy0+bGVuICsgTExDX1NOQVBfTEVOKSA+CisJCSAgICBhZGFwdGVyLT50eF9idWZfc2l6ZSkKIAkJCWJyZWFrOwogCiAJCXNrYl9zcmMgPSBza2JfZGVxdWV1ZSgmcHJhX2xpc3QtPnNrYl9oZWFkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC8xMW5fcnhyZW9yZGVyLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvMTFuX3J4cmVvcmRlci5jCmluZGV4IGE3NGNjNDMuLjk0NDgwMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC8xMW5fcnhyZW9yZGVyLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4LzExbl9yeHJlb3JkZXIuYwpAQCAtNzgsOCArNzgsMTUgQEAKICAqLwogc3RhdGljIGludCBtd2lmaWV4XzExbl9kaXNwYXRjaF9wa3Qoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgdm9pZCAqcGF5bG9hZCkKIHsKLQlpbnQgcmV0ID0gbXdpZmlleF8xMW5fZGlzcGF0Y2hfYW1zZHVfcGt0KHByaXYsIHBheWxvYWQpOwogCisJaW50IHJldDsKKworCWlmICghcGF5bG9hZCkgeworCQltd2lmaWV4X2RiZyhwcml2LT5hZGFwdGVyLCBJTkZPLCAiaW5mbzogZncgZHJvcCBkYXRhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gbXdpZmlleF8xMW5fZGlzcGF0Y2hfYW1zZHVfcGt0KHByaXYsIHBheWxvYWQpOwogCWlmICghcmV0KQogCQlyZXR1cm4gMDsKIApAQCAtOTIxLDMgKzkyOCw3MiBAQAogCWVsc2UKIAkJbXdpZmlleF91cGRhdGVfYW1wZHVfcnh3aW5zaXplKGFkYXB0ZXIsIGZhbHNlKTsKIH0KKworLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHJ4YmFfc3luYyBldmVudAorICovCit2b2lkIG13aWZpZXhfMTFuX3J4YmFfc3luY19ldmVudChzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAorCQkJCSB1OCAqZXZlbnRfYnVmLCB1MTYgbGVuKQoreworCXN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX3J4YmFfc3luYyAqdGx2X3J4YmEgPSAodm9pZCAqKWV2ZW50X2J1ZjsKKwl1MTYgdGx2X3R5cGUsIHRsdl9sZW47CisJc3RydWN0IG13aWZpZXhfcnhfcmVvcmRlcl90YmwgKnJ4X3Jlb3JfdGJsX3B0cjsKKwl1OCBpLCBqOworCXUxNiBzZXFfbnVtLCB0bHZfc2VxX251bSwgdGx2X2JpdG1hcF9sZW47CisJaW50IHRsdl9idWZfbGVmdCA9IGxlbjsKKwlpbnQgcmV0OworCXU4ICp0bXA7CisKKwltd2lmaWV4X2RiZ19kdW1wKHByaXYtPmFkYXB0ZXIsIEVWVF9ELCAiUlhCQV9TWU5DIGV2ZW50OiIsCisJCQkgZXZlbnRfYnVmLCBsZW4pOworCXdoaWxlICh0bHZfYnVmX2xlZnQgPj0gc2l6ZW9mKCp0bHZfcnhiYSkpIHsKKwkJdGx2X3R5cGUgPSBsZTE2X3RvX2NwdSh0bHZfcnhiYS0+aGVhZGVyLnR5cGUpOworCQl0bHZfbGVuICA9IGxlMTZfdG9fY3B1KHRsdl9yeGJhLT5oZWFkZXIubGVuKTsKKwkJaWYgKHRsdl90eXBlICE9IFRMVl9UWVBFX1JYQkFfU1lOQykgeworCQkJbXdpZmlleF9kYmcocHJpdi0+YWRhcHRlciwgRVJST1IsCisJCQkJICAgICJXcm9uZyBUTFYgaWQ9MHgleFxuIiwgdGx2X3R5cGUpOworCQkJcmV0dXJuOworCQl9CisKKwkJdGx2X3NlcV9udW0gPSBsZTE2X3RvX2NwdSh0bHZfcnhiYS0+c2VxX251bSk7CisJCXRsdl9iaXRtYXBfbGVuID0gbGUxNl90b19jcHUodGx2X3J4YmEtPmJpdG1hcF9sZW4pOworCQltd2lmaWV4X2RiZyhwcml2LT5hZGFwdGVyLCBJTkZPLAorCQkJICAgICIlcE0gdGlkPSVkIHNlcV9udW09JWQgYml0bWFwX2xlbj0lZFxuIiwKKwkJCSAgICB0bHZfcnhiYS0+bWFjLCB0bHZfcnhiYS0+dGlkLCB0bHZfc2VxX251bSwKKwkJCSAgICB0bHZfYml0bWFwX2xlbik7CisKKwkJcnhfcmVvcl90YmxfcHRyID0KKwkJCW13aWZpZXhfMTFuX2dldF9yeF9yZW9yZGVyX3RibChwcml2LCB0bHZfcnhiYS0+dGlkLAorCQkJCQkJICAgICAgIHRsdl9yeGJhLT5tYWMpOworCQlpZiAoIXJ4X3Jlb3JfdGJsX3B0cikgeworCQkJbXdpZmlleF9kYmcocHJpdi0+YWRhcHRlciwgRVJST1IsCisJCQkJICAgICJDYW4gbm90IGZpbmQgcnhfcmVvcmRlcl90YmwhIik7CisJCQlyZXR1cm47CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgdGx2X2JpdG1hcF9sZW47IGkrKykgeworCQkJZm9yIChqID0gMCA7IGogPCA4OyBqKyspIHsKKwkJCQlpZiAodGx2X3J4YmEtPmJpdG1hcFtpXSAmICgxIDw8IGopKSB7CisJCQkJCXNlcV9udW0gPSAoTUFYX1RJRF9WQUxVRSAtIDEpICYKKwkJCQkJCSh0bHZfc2VxX251bSArIGkgKiA4ICsgaik7CisKKwkJCQkJbXdpZmlleF9kYmcocHJpdi0+YWRhcHRlciwgRVJST1IsCisJCQkJCQkgICAgImRyb3AgcGFja2V0LHNlcT0lZFxuIiwKKwkJCQkJCSAgICBzZXFfbnVtKTsKKworCQkJCQlyZXQgPSBtd2lmaWV4XzExbl9yeF9yZW9yZGVyX3BrdAorCQkJCQkocHJpdiwgc2VxX251bSwgdGx2X3J4YmEtPnRpZCwKKwkJCQkJIHRsdl9yeGJhLT5tYWMsIDAsIE5VTEwpOworCisJCQkJCWlmIChyZXQpCisJCQkJCQltd2lmaWV4X2RiZyhwcml2LT5hZGFwdGVyLAorCQkJCQkJCSAgICBFUlJPUiwKKwkJCQkJCQkgICAgIkZhaWwgdG8gZHJvcCBwYWNrZXQiKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQl0bHZfYnVmX2xlZnQgLT0gKHNpemVvZigqdGx2X3J4YmEpICsgdGx2X2xlbik7CisJCXRtcCA9ICh1OCAqKXRsdl9yeGJhICsgdGx2X2xlbiArIHNpemVvZigqdGx2X3J4YmEpOworCQl0bHZfcnhiYSA9IChzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19yeGJhX3N5bmMgKil0bXA7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4LzExbl9yeHJlb3JkZXIuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC8xMW5fcnhyZW9yZGVyLmgKaW5kZXggNjNlY2VhOC4uMjJkOTkxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4LzExbl9yeHJlb3JkZXIuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvMTFuX3J4cmVvcmRlci5oCkBAIC04MSw1ICs4MSw2IEBACiBtd2lmaWV4XzExbl9nZXRfcnhfcmVvcmRlcl90Ymwoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgaW50IHRpZCwgdTggKnRhKTsKIHZvaWQgbXdpZmlleF8xMW5fZGVsX3J4X3Jlb3JkZXJfdGJsX2J5X3RhKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsIHU4ICp0YSk7CiB2b2lkIG13aWZpZXhfdXBkYXRlX3J4cmVvcl9mbGFncyhzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyLCB1OCBmbGFncyk7Ci0KK3ZvaWQgbXdpZmlleF8xMW5fcnhiYV9zeW5jX2V2ZW50KHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCisJCQkJIHU4ICpldmVudF9idWYsIHUxNiBsZW4pOwogI2VuZGlmIC8qIF9NV0lGSUVYXzExTl9SWFJFT1JERVJfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9jZmc4MDIxMS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2NmZzgwMjExLmMKaW5kZXggYThmZjk2OS4uMzljZTc2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2NmZzgwMjExLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2NmZzgwMjExLmMKQEAgLTQ4NCw2ICs0ODQsMjkgQEAKIH0KIAogLyoKKyAqIENGRzgwMi4xMSBvcGVyYXRpb24gaGFuZGxlciB0byBzZXQgZGVmYXVsdCBtZ210IGtleS4KKyAqLworc3RhdGljIGludAorbXdpZmlleF9jZmc4MDIxMV9zZXRfZGVmYXVsdF9tZ210X2tleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJICAgICAgdTgga2V5X2luZGV4KQoreworCXN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYgPSBtd2lmaWV4X25ldGRldl9nZXRfcHJpdihuZXRkZXYpOworCXN0cnVjdCBtd2lmaWV4X2RzX2VuY3J5cHRfa2V5IGVuY3J5cHRfa2V5OworCisJd2lwaHlfZGJnKHdpcGh5LCAic2V0IGRlZmF1bHQgbWdtdCBrZXksIGtleSBpbmRleD0lZFxuIiwga2V5X2luZGV4KTsKKworCW1lbXNldCgmZW5jcnlwdF9rZXksIDAsIHNpemVvZihzdHJ1Y3QgbXdpZmlleF9kc19lbmNyeXB0X2tleSkpOworCWVuY3J5cHRfa2V5LmtleV9sZW4gPSBXTEFOX0tFWV9MRU5fQ0NNUDsKKwllbmNyeXB0X2tleS5rZXlfaW5kZXggPSBrZXlfaW5kZXg7CisJZW5jcnlwdF9rZXkuaXNfaWd0a19kZWZfa2V5ID0gdHJ1ZTsKKwlldGhfYnJvYWRjYXN0X2FkZHIoZW5jcnlwdF9rZXkubWFjX2FkZHIpOworCisJcmV0dXJuIG13aWZpZXhfc2VuZF9jbWQocHJpdiwgSG9zdENtZF9DTURfODAyXzExX0tFWV9NQVRFUklBTCwKKwkJCQlIb3N0Q21kX0FDVF9HRU5fU0VULCB0cnVlLCAmZW5jcnlwdF9rZXksIHRydWUpOworfQorCisvKgogICogVGhpcyBmdW5jdGlvbiBzZW5kcyBkb21haW4gaW5mb3JtYXRpb24gdG8gdGhlIGZpcm13YXJlLgogICoKICAqIFRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gYXJlIHBhc3NlZCB0byB0aGUgZmlybXdhcmUgLQpAQCAtMjAxMiwxMCArMjAzNSw2IEBACiAJaWYgKG13aWZpZXhfZGVhdXRoZW50aWNhdGUocHJpdiwgTlVMTCkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JbXdpZmlleF9kYmcocHJpdi0+YWRhcHRlciwgTVNHLAotCQkgICAgImluZm86IHN1Y2Nlc3NmdWxseSBkaXNjb25uZWN0ZWQgZnJvbSAlcE06XHQiCi0JCSAgICAicmVhc29uIGNvZGUgJWRcbiIsIHByaXYtPmNmZ19ic3NpZCwgcmVhc29uX2NvZGUpOwotCiAJZXRoX3plcm9fYWRkcihwcml2LT5jZmdfYnNzaWQpOwogCXByaXYtPmhzMl9lbmFibGVkID0gZmFsc2U7CiAKQEAgLTI0ODUsNiArMjUwNCwxNiBAQAogCiAJcHJpdi0+c2Nhbl9yZXF1ZXN0ID0gcmVxdWVzdDsKIAorCWlmIChyZXF1ZXN0LT5mbGFncyAmIE5MODAyMTFfU0NBTl9GTEFHX1JBTkRPTV9BRERSKSB7CisJCWV0aGVyX2FkZHJfY29weShwcml2LT5yYW5kb21fbWFjLCByZXF1ZXN0LT5tYWNfYWRkcik7CisJCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKSB7CisJCQlwcml2LT5yYW5kb21fbWFjW2ldICY9IHJlcXVlc3QtPm1hY19hZGRyX21hc2tbaV07CisJCQlwcml2LT5yYW5kb21fbWFjW2ldIHw9IGdldF9yYW5kb21faW50KCkgJgorCQkJCQkgICAgICAgfihyZXF1ZXN0LT5tYWNfYWRkcl9tYXNrW2ldKTsKKwkJfQorCX0KKworCWV0aGVyX2FkZHJfY29weSh1c2VyX3NjYW5fY2ZnLT5yYW5kb21fbWFjLCBwcml2LT5yYW5kb21fbWFjKTsKIAl1c2VyX3NjYW5fY2ZnLT5udW1fc3NpZHMgPSByZXF1ZXN0LT5uX3NzaWRzOwogCXVzZXJfc2Nhbl9jZmctPnNzaWRfbGlzdCA9IHJlcXVlc3QtPnNzaWRzOwogCkBAIC0yNzI2LDcgKzI3NTUsNyBAQAogCQlodF9pbmZvLT5jYXAgJj0gfklFRUU4MDIxMV9IVF9DQVBfU0dJXzQwOwogCiAJaWYgKGFkYXB0ZXItPnVzZXJfZGV2X21jc19zdXBwb3J0ID09IEhUX1NUUkVBTV8yWDIpCi0JCWh0X2luZm8tPmNhcCB8PSAzIDw8IElFRUU4MDIxMV9IVF9DQVBfUlhfU1RCQ19TSElGVDsKKwkJaHRfaW5mby0+Y2FwIHw9IDIgPDwgSUVFRTgwMjExX0hUX0NBUF9SWF9TVEJDX1NISUZUOwogCWVsc2UKIAkJaHRfaW5mby0+Y2FwIHw9IDEgPDwgSUVFRTgwMjExX0hUX0NBUF9SWF9TVEJDX1NISUZUOwogCkBAIC0zOTEzLDYgKzM5NDIsODggQEAKIAlyZXR1cm4gcmV0OwogfQogCisjaWZkZWYgQ09ORklHX05MODAyMTFfVEVTVE1PREUKKworZW51bSBtd2lmaWV4X3RtX2F0dHIgeworCV9fTVdJRklFWF9UTV9BVFRSX0lOVkFMSUQJPSAwLAorCU1XSUZJRVhfVE1fQVRUUl9DTUQJCT0gMSwKKwlNV0lGSUVYX1RNX0FUVFJfREFUQQkJPSAyLAorCisJLyoga2VlcCBsYXN0ICovCisJX19NV0lGSUVYX1RNX0FUVFJfQUZURVJfTEFTVCwKKwlNV0lGSUVYX1RNX0FUVFJfTUFYCQk9IF9fTVdJRklFWF9UTV9BVFRSX0FGVEVSX0xBU1QgLSAxLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG13aWZpZXhfdG1fcG9saWN5W01XSUZJRVhfVE1fQVRUUl9NQVggKyAxXSA9IHsKKwlbTVdJRklFWF9UTV9BVFRSX0NNRF0JCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbTVdJRklFWF9UTV9BVFRSX0RBVEFdCQk9IHsgLnR5cGUgPSBOTEFfQklOQVJZLAorCQkJCQkgICAgLmxlbiA9IE1XSUZJRVhfU0laRV9PRl9DTURfQlVGRkVSIH0sCit9OworCitlbnVtIG13aWZpZXhfdG1fY29tbWFuZCB7CisJTVdJRklFWF9UTV9DTURfSE9TVENNRAk9IDAsCit9OworCitzdGF0aWMgaW50IG13aWZpZXhfdG1fY21kKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkgIHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiA9IG13aWZpZXhfbmV0ZGV2X2dldF9wcml2KHdkZXYtPm5ldGRldik7CisJc3RydWN0IG13aWZpZXhfZHNfbWlzY19jbWQgKmhvc3RjbWQ7CisJc3RydWN0IG5sYXR0ciAqdGJbTVdJRklFWF9UTV9BVFRSX01BWCArIDFdOworCXN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgZXJyOworCisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlhZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKworCWVyciA9IG5sYV9wYXJzZSh0YiwgTVdJRklFWF9UTV9BVFRSX01BWCwgZGF0YSwgbGVuLAorCQkJbXdpZmlleF90bV9wb2xpY3kpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoIXRiW01XSUZJRVhfVE1fQVRUUl9DTURdKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAobmxhX2dldF91MzIodGJbTVdJRklFWF9UTV9BVFRSX0NNRF0pKSB7CisJY2FzZSBNV0lGSUVYX1RNX0NNRF9IT1NUQ01EOgorCQlpZiAoIXRiW01XSUZJRVhfVE1fQVRUUl9EQVRBXSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWhvc3RjbWQgPSBremFsbG9jKHNpemVvZigqaG9zdGNtZCksIEdGUF9LRVJORUwpOworCQlpZiAoIWhvc3RjbWQpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlob3N0Y21kLT5sZW4gPSBubGFfbGVuKHRiW01XSUZJRVhfVE1fQVRUUl9EQVRBXSk7CisJCW1lbWNweShob3N0Y21kLT5jbWQsIG5sYV9kYXRhKHRiW01XSUZJRVhfVE1fQVRUUl9EQVRBXSksCisJCSAgICAgICBob3N0Y21kLT5sZW4pOworCisJCWlmIChtd2lmaWV4X3NlbmRfY21kKHByaXYsIDAsIDAsIDAsIGhvc3RjbWQsIHRydWUpKSB7CisJCQlkZXZfZXJyKHByaXYtPmFkYXB0ZXItPmRldiwgIkZhaWxlZCB0byBwcm9jZXNzIGhvc3RjbWRcbiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQkvKiBwcm9jZXNzIGhvc3RjbWQgcmVzcG9uc2UqLworCQlza2IgPSBjZmc4MDIxMV90ZXN0bW9kZV9hbGxvY19yZXBseV9za2Iod2lwaHksIGhvc3RjbWQtPmxlbik7CisJCWlmICghc2tiKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWVyciA9IG5sYV9wdXQoc2tiLCBNV0lGSUVYX1RNX0FUVFJfREFUQSwKKwkJCSAgICAgIGhvc3RjbWQtPmxlbiwgaG9zdGNtZC0+Y21kKTsKKwkJaWYgKGVycikgeworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gLUVNU0dTSVpFOworCQl9CisKKwkJZXJyID0gY2ZnODAyMTFfdGVzdG1vZGVfcmVwbHkoc2tiKTsKKwkJa2ZyZWUoaG9zdGNtZCk7CisJCXJldHVybiBlcnI7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KKyNlbmRpZgorCiBzdGF0aWMgaW50CiBtd2lmaWV4X2NmZzgwMjExX3N0YXJ0X3JhZGFyX2RldGVjdGlvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAogCQkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApAQCAtMzk5NCw2ICs0MTA1LDcgQEAKIAkubGVhdmVfaWJzcyA9IG13aWZpZXhfY2ZnODAyMTFfbGVhdmVfaWJzcywKIAkuYWRkX2tleSA9IG13aWZpZXhfY2ZnODAyMTFfYWRkX2tleSwKIAkuZGVsX2tleSA9IG13aWZpZXhfY2ZnODAyMTFfZGVsX2tleSwKKwkuc2V0X2RlZmF1bHRfbWdtdF9rZXkgPSBtd2lmaWV4X2NmZzgwMjExX3NldF9kZWZhdWx0X21nbXRfa2V5LAogCS5tZ210X3R4ID0gbXdpZmlleF9jZmc4MDIxMV9tZ210X3R4LAogCS5tZ210X2ZyYW1lX3JlZ2lzdGVyID0gbXdpZmlleF9jZmc4MDIxMV9tZ210X2ZyYW1lX3JlZ2lzdGVyLAogCS5yZW1haW5fb25fY2hhbm5lbCA9IG13aWZpZXhfY2ZnODAyMTFfcmVtYWluX29uX2NoYW5uZWwsCkBAIC00MDI1LDYgKzQxMzcsNyBAQAogCS50ZGxzX2NhbmNlbF9jaGFubmVsX3N3aXRjaCA9IG13aWZpZXhfY2ZnODAyMTFfdGRsc19jYW5jZWxfY2hhbl9zd2l0Y2gsCiAJLmFkZF9zdGF0aW9uID0gbXdpZmlleF9jZmc4MDIxMV9hZGRfc3RhdGlvbiwKIAkuY2hhbmdlX3N0YXRpb24gPSBtd2lmaWV4X2NmZzgwMjExX2NoYW5nZV9zdGF0aW9uLAorCUNGRzgwMjExX1RFU1RNT0RFX0NNRChtd2lmaWV4X3RtX2NtZCkKIAkuZ2V0X2NoYW5uZWwgPSBtd2lmaWV4X2NmZzgwMjExX2dldF9jaGFubmVsLAogCS5zdGFydF9yYWRhcl9kZXRlY3Rpb24gPSBtd2lmaWV4X2NmZzgwMjExX3N0YXJ0X3JhZGFyX2RldGVjdGlvbiwKIAkuY2hhbm5lbF9zd2l0Y2ggPSBtd2lmaWV4X2NmZzgwMjExX2NoYW5uZWxfc3dpdGNoLApAQCAtNDEzNSw5ICs0MjQ4LDEyIEBACiAJd2lwaHktPmNpcGhlcl9zdWl0ZXMgPSBtd2lmaWV4X2NpcGhlcl9zdWl0ZXM7CiAJd2lwaHktPm5fY2lwaGVyX3N1aXRlcyA9IEFSUkFZX1NJWkUobXdpZmlleF9jaXBoZXJfc3VpdGVzKTsKIAotCWlmIChhZGFwdGVyLT5yZWdpb25fY29kZSkKLQkJd2lwaHktPnJlZ3VsYXRvcnlfZmxhZ3MgfD0gUkVHVUxBVE9SWV9ESVNBQkxFX0JFQUNPTl9ISU5UUyB8CisJaWYgKGFkYXB0ZXItPnJlZ2QpIHsKKwkJd2lwaHktPnJlZ3VsYXRvcnlfZmxhZ3MgfD0gUkVHVUxBVE9SWV9DVVNUT01fUkVHIHwKKwkJCQkJICAgUkVHVUxBVE9SWV9ESVNBQkxFX0JFQUNPTl9ISU5UUyB8CiAJCQkJCSAgIFJFR1VMQVRPUllfQ09VTlRSWV9JRV9JR05PUkU7CisJCXdpcGh5X2FwcGx5X2N1c3RvbV9yZWd1bGF0b3J5KHdpcGh5LCBhZGFwdGVyLT5yZWdkKTsKKwl9CiAKIAlldGhlcl9hZGRyX2NvcHkod2lwaHktPnBlcm1fYWRkciwgYWRhcHRlci0+cGVybV9hZGRyKTsKIAl3aXBoeS0+c2lnbmFsX3R5cGUgPSBDRkc4MDIxMV9TSUdOQUxfVFlQRV9NQk07CkBAIC00MTczLDcgKzQyODksMTAgQEAKIAl3aXBoeS0+ZmVhdHVyZXMgfD0gTkw4MDIxMV9GRUFUVVJFX0hUX0lCU1MgfAogCQkJICAgTkw4MDIxMV9GRUFUVVJFX0lOQUNUSVZJVFlfVElNRVIgfAogCQkJICAgTkw4MDIxMV9GRUFUVVJFX0xPV19QUklPUklUWV9TQ0FOIHwKLQkJCSAgIE5MODAyMTFfRkVBVFVSRV9ORUVEX09CU1NfU0NBTjsKKwkJCSAgIE5MODAyMTFfRkVBVFVSRV9ORUVEX09CU1NfU0NBTiB8CisJCQkgICBOTDgwMjExX0ZFQVRVUkVfU0NBTl9SQU5ET01fTUFDX0FERFIgfAorCQkJICAgTkw4MDIxMV9GRUFUVVJFX1NDSEVEX1NDQU5fUkFORE9NX01BQ19BRERSIHwKKwkJCSAgIE5MODAyMTFfRkVBVFVSRV9ORF9SQU5ET01fTUFDX0FERFI7CiAKIAlpZiAoSVNTVVBQX1RETFNfRU5BQkxFRChhZGFwdGVyLT5md19jYXBfaW5mbykpCiAJCXdpcGh5LT5mZWF0dXJlcyB8PSBOTDgwMjExX0ZFQVRVUkVfVERMU19DSEFOTkVMX1NXSVRDSDsKQEAgLTQyMDAsMTkgKzQzMTksMjcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAocmVnX2FscGhhMiAmJiBtd2lmaWV4X2lzX3ZhbGlkX2FscGhhMihyZWdfYWxwaGEyKSkgewotCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBJTkZPLAotCQkJICAgICJkcml2ZXIgaGludCBhbHBoYTI6ICUyLjJzXG4iLCByZWdfYWxwaGEyKTsKLQkJcmVndWxhdG9yeV9oaW50KHdpcGh5LCByZWdfYWxwaGEyKTsKLQl9IGVsc2UgewotCQlpZiAoYWRhcHRlci0+cmVnaW9uX2NvZGUgPT0gMHgwMCkgewotCQkJbXdpZmlleF9kYmcoYWRhcHRlciwgV0FSTiwgIklnbm9yZSB3b3JsZCByZWd1bGF0b3J5IGRvbWFpblxuIik7CisJaWYgKCFhZGFwdGVyLT5yZWdkKSB7CisJCWlmIChyZWdfYWxwaGEyICYmIG13aWZpZXhfaXNfdmFsaWRfYWxwaGEyKHJlZ19hbHBoYTIpKSB7CisJCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBJTkZPLAorCQkJCSAgICAiZHJpdmVyIGhpbnQgYWxwaGEyOiAlMi4yc1xuIiwgcmVnX2FscGhhMik7CisJCQlyZWd1bGF0b3J5X2hpbnQod2lwaHksIHJlZ19hbHBoYTIpOwogCQl9IGVsc2UgewotCQkJY291bnRyeV9jb2RlID0KLQkJCQltd2lmaWV4XzExZF9jb2RlXzJfcmVnaW9uKGFkYXB0ZXItPnJlZ2lvbl9jb2RlKTsKLQkJCWlmIChjb3VudHJ5X2NvZGUgJiYKLQkJCSAgICByZWd1bGF0b3J5X2hpbnQod2lwaHksIGNvdW50cnlfY29kZSkpCi0JCQkJbXdpZmlleF9kYmcocHJpdi0+YWRhcHRlciwgRVJST1IsICJyZWd1bGF0b3J5X2hpbnQoKSBmYWlsZWRcbiIpOworCQkJaWYgKGFkYXB0ZXItPnJlZ2lvbl9jb2RlID09IDB4MDApIHsKKwkJCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBXQVJOLAorCQkJCQkgICAgIklnbm9yZSB3b3JsZCByZWd1bGF0b3J5IGRvbWFpblxuIik7CisJCQl9IGVsc2UgeworCQkJCXdpcGh5LT5yZWd1bGF0b3J5X2ZsYWdzIHw9CisJCQkJCVJFR1VMQVRPUllfRElTQUJMRV9CRUFDT05fSElOVFMgfAorCQkJCQlSRUdVTEFUT1JZX0NPVU5UUllfSUVfSUdOT1JFOworCQkJCWNvdW50cnlfY29kZSA9CisJCQkJCW13aWZpZXhfMTFkX2NvZGVfMl9yZWdpb24oCisJCQkJCQlhZGFwdGVyLT5yZWdpb25fY29kZSk7CisJCQkJaWYgKGNvdW50cnlfY29kZSAmJgorCQkJCSAgICByZWd1bGF0b3J5X2hpbnQod2lwaHksIGNvdW50cnlfY29kZSkpCisJCQkJCW13aWZpZXhfZGJnKHByaXYtPmFkYXB0ZXIsIEVSUk9SLAorCQkJCQkJICAgICJyZWd1bGF0b3J5X2hpbnQoKSBmYWlsZWRcbiIpOworCQkJfQogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvY21kZXZ0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvY21kZXZ0LmMKaW5kZXggYzI5ZjI2ZC4uNTM0NzcyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2NtZGV2dC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9jbWRldnQuYwpAQCAtNDgwLDEzICs0ODAsMjcgQEAKICAqLwogaW50IG13aWZpZXhfcHJvY2Vzc19ldmVudChzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyKQogewotCWludCByZXQ7CisJaW50IHJldCwgaTsKIAlzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2ID0KIAkJbXdpZmlleF9nZXRfcHJpdihhZGFwdGVyLCBNV0lGSUVYX0JTU19ST0xFX0FOWSk7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFkYXB0ZXItPmV2ZW50X3NrYjsKLQl1MzIgZXZlbnRjYXVzZSA9IGFkYXB0ZXItPmV2ZW50X2NhdXNlOworCXUzMiBldmVudGNhdXNlOwogCXN0cnVjdCBtd2lmaWV4X3J4aW5mbyAqcnhfaW5mbzsKIAorCWlmICgoYWRhcHRlci0+ZXZlbnRfY2F1c2UgJiBFVkVOVF9JRF9NQVNLKSA9PSBFVkVOVF9SQURBUl9ERVRFQ1RFRCkgeworCQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+cHJpdl9udW07IGkrKykgeworCQkJcHJpdiA9IGFkYXB0ZXItPnByaXZbaV07CisJCQlpZiAocHJpdiAmJiBtd2lmaWV4X2lzXzExaF9hY3RpdmUocHJpdikpIHsKKwkJCQlhZGFwdGVyLT5ldmVudF9jYXVzZSB8PQorCQkJCQkoKHByaXYtPmJzc19udW0gJiAweGZmKSA8PCAxNikgfAorCQkJCQkoKHByaXYtPmJzc190eXBlICYgMHhmZikgPDwgMjQpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJZXZlbnRjYXVzZSA9IGFkYXB0ZXItPmV2ZW50X2NhdXNlOworCiAJLyogU2F2ZSB0aGUgbGFzdCBldmVudCB0byBkZWJ1ZyBsb2cgKi8KIAlhZGFwdGVyLT5kYmcubGFzdF9ldmVudF9pbmRleCA9CiAJCQkoYWRhcHRlci0+ZGJnLmxhc3RfZXZlbnRfaW5kZXggKyAxKSAlIERCR19DTURfTlVNOwpAQCAtNTgxLDYgKzU5NSwxNCBAQAogCQkJcmV0dXJuIC0xOwogCQl9CiAJfQorCS8qIFdlIGRvbid0IGV4cGVjdCBjb21tYW5kcyBpbiBtYW51ZmFjdHVyaW5nIG1vZGUuIFRoZXkgYXJlIGNvb2tlZAorCSAqIGluIGFwcGxpY2F0aW9uIGFuZCByZWFkeSB0byBkb3dubG9hZCBidWZmZXIgaXMgcGFzc2VkIHRvIHRoZSBkcml2ZXIKKwkgKi8KKwlpZiAoYWRhcHRlci0+bWZnX21vZGUgJiYgY21kX25vKSB7CisJCWRldl9kYmcoYWRhcHRlci0+ZGV2LCAiSWdub3JpbmcgY29tbWFuZHMgaW4gbWFudWZhY3R1cmluZyBtb2RlXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwogCiAJLyogR2V0IGEgbmV3IGNvbW1hbmQgbm9kZSAqLwogCWNtZF9ub2RlID0gbXdpZmlleF9nZXRfY21kX25vZGUoYWRhcHRlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvZGVidWdmcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2RlYnVnZnMuYwppbmRleCBiY2NmMTdhLi5iOTI4NGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9kZWJ1Z2ZzLmMKQEAgLTExOCw2ICsxMTgsOCBAQAogCQlwICs9IHNwcmludGYocCwgImJzc2lkPVwiJXBNXCJcbiIsIGluZm8uYnNzaWQpOwogCQlwICs9IHNwcmludGYocCwgImNoYW5uZWw9XCIlZFwiXG4iLCAoaW50KSBpbmZvLmJzc19jaGFuKTsKIAkJcCArPSBzcHJpbnRmKHAsICJjb3VudHJ5X2NvZGUgPSBcIiVzXCJcbiIsIGluZm8uY291bnRyeV9jb2RlKTsKKwkJcCArPSBzcHJpbnRmKHAsICJyZWdpb25fY29kZT1cIjB4JXhcIlxuIiwKKwkJCSAgICAgcHJpdi0+YWRhcHRlci0+cmVnaW9uX2NvZGUpOwogCiAJCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBuZXRkZXYpCiAJCQlwICs9IHNwcmludGYocCwgIm11bHRpY2FzdF9hZGRyZXNzWyVkXT1cIiVwTVwiXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2Z3LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvZncuaAppbmRleCA1NTk2YjZiLi40YjE4OTRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvZncuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvZncuaApAQCAtNzgsNiArNzgsNyBAQAogCUtFWV9UWVBFX0lEX0FFUywKIAlLRVlfVFlQRV9JRF9XQVBJLAogCUtFWV9UWVBFX0lEX0FFU19DTUFDLAorCUtFWV9UWVBFX0lEX0FFU19DTUFDX0RFRiwKIH07CiAKICNkZWZpbmUgV1BBX1BOX1NJWkUJCTgKQEAgLTE3Niw2ICsxNzcsNyBAQAogI2RlZmluZSBUTFZfVFlQRV9QV0tfQ0lQSEVSICAgICAgICAgKFBST1BSSUVUQVJZX1RMVl9CQVNFX0lEICsgMTQ1KQogI2RlZmluZSBUTFZfVFlQRV9HV0tfQ0lQSEVSICAgICAgICAgKFBST1BSSUVUQVJZX1RMVl9CQVNFX0lEICsgMTQ2KQogI2RlZmluZSBUTFZfVFlQRV9UWF9QQVVTRSAgICAgICAgICAgKFBST1BSSUVUQVJZX1RMVl9CQVNFX0lEICsgMTQ4KQorI2RlZmluZSBUTFZfVFlQRV9SWEJBX1NZTkMgICAgICAgICAgKFBST1BSSUVUQVJZX1RMVl9CQVNFX0lEICsgMTUzKQogI2RlZmluZSBUTFZfVFlQRV9DT0FMRVNDRV9SVUxFICAgICAgKFBST1BSSUVUQVJZX1RMVl9CQVNFX0lEICsgMTU0KQogI2RlZmluZSBUTFZfVFlQRV9LRVlfUEFSQU1fVjIgICAgICAgKFBST1BSSUVUQVJZX1RMVl9CQVNFX0lEICsgMTU2KQogI2RlZmluZSBUTFZfVFlQRV9SRVBFQVRfQ09VTlQgICAgICAgKFBST1BSSUVUQVJZX1RMVl9CQVNFX0lEICsgMTc2KQpAQCAtMTg4LDYgKzE5MCw4IEBACiAjZGVmaW5lIFRMVl9CVENPRVhfV0xfQUdHUl9XSU5TSVpFICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAyMDIpCiAjZGVmaW5lIFRMVl9CVENPRVhfV0xfU0NBTlRJTUUgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAyMDMpCiAjZGVmaW5lIFRMVl9UWVBFX0JTU19NT0RFICAgICAgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAyMDYpCisjZGVmaW5lIFRMVl9UWVBFX1JBTkRPTV9NQUMgICAgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAyMzYpCisjZGVmaW5lIFRMVl9UWVBFX0NIQU5fQVRUUl9DRkcgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAyMzcpCiAKICNkZWZpbmUgTVdJRklFWF9UWF9EQVRBX0JVRl9TSVpFXzJLICAgICAgICAyMDQ4CiAKQEAgLTIwOCw2ICsyMTIsNyBAQAogCiAjZGVmaW5lIE1XSUZJRVhfVFhfREFUQV9CVUZfU0laRV80SyAgICAgICAgNDA5NgogI2RlZmluZSBNV0lGSUVYX1RYX0RBVEFfQlVGX1NJWkVfOEsgICAgICAgIDgxOTIKKyNkZWZpbmUgTVdJRklFWF9UWF9EQVRBX0JVRl9TSVpFXzEySyAgICAgICAxMjI4OAogCiAjZGVmaW5lIElTU1VQUF8xMU5FTkFCTEVEKEZ3Q2FwSW5mbykgKEZ3Q2FwSW5mbyAmIEJJVCgxMSkpCiAjZGVmaW5lIElTU1VQUF9URExTX0VOQUJMRUQoRndDYXBJbmZvKSAoRndDYXBJbmZvICYgQklUKDE0KSkKQEAgLTM3OSw2ICszODQsNyBAQAogI2RlZmluZSBIb3N0Q21kX0NNRF9NQ19QT0xJQ1kgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTIxCiAjZGVmaW5lIEhvc3RDbWRfQ01EX1RETFNfT1BFUiAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMjIKICNkZWZpbmUgSG9zdENtZF9DTURfU0RJT19TUF9SWF9BR0dSX0NGRyAgICAgICAgICAgICAgIDB4MDIyMworI2RlZmluZSBIb3N0Q21kX0NNRF9DSEFOX1JFR0lPTl9DRkcJCSAgICAgIDB4MDI0MgogCiAjZGVmaW5lIFBST1RPQ09MX05PX1NFQ1VSSVRZICAgICAgICAweDAxCiAjZGVmaW5lIFBST1RPQ09MX1NUQVRJQ19XRVAgICAgICAgICAweDAyCkBAIC00MTEsNiArNDE3LDE0IEBACiAJUDJQX01PREVfQ0xJRU5UID0gMywKIH07CiAKK2VudW0gbXdpZmlleF9jaGFubmVsX2ZsYWdzIHsKKwlNV0lGSUVYX0NIQU5ORUxfUEFTU0lWRSA9IEJJVCgwKSwKKwlNV0lGSUVYX0NIQU5ORUxfREZTID0gQklUKDEpLAorCU1XSUZJRVhfQ0hBTk5FTF9OT0hUNDAgPSBCSVQoMiksCisJTVdJRklFWF9DSEFOTkVMX05PSFQ4MCA9IEJJVCgzKSwKKwlNV0lGSUVYX0NIQU5ORUxfRElTQUJMRUQgPSBCSVQoNyksCit9OworCiAjZGVmaW5lIEhvc3RDbWRfUkVUX0JJVCAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwCiAjZGVmaW5lIEhvc3RDbWRfQUNUX0dFTl9HRVQgICAgICAgICAgICAgICAgICAgMHgwMDAwCiAjZGVmaW5lIEhvc3RDbWRfQUNUX0dFTl9TRVQgICAgICAgICAgICAgICAgICAgMHgwMDAxCkBAIC01MDQsNiArNTE4LDggQEAKICNkZWZpbmUgRVZFTlRfUlNTSV9ISUdIICAgICAgICAgICAgICAgICAweDAwMDAwMDFjCiAjZGVmaW5lIEVWRU5UX1NOUl9ISUdIICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxZAogI2RlZmluZSBFVkVOVF9JQlNTX0NPQUxFU0NFRCAgICAgICAgICAgIDB4MDAwMDAwMWUKKyNkZWZpbmUgRVZFTlRfSUJTU19TVEFfQ09OTkVDVCAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEVWRU5UX0lCU1NfU1RBX0RJU0NPTk5FQ1QgICAgICAgMHgwMDAwMDAyMQogI2RlZmluZSBFVkVOVF9EQVRBX1JTU0lfTE9XICAgICAgICAgICAgIDB4MDAwMDAwMjQKICNkZWZpbmUgRVZFTlRfREFUQV9TTlJfTE9XICAgICAgICAgICAgICAweDAwMDAwMDI1CiAjZGVmaW5lIEVWRU5UX0RBVEFfUlNTSV9ISUdIICAgICAgICAgICAgMHgwMDAwMDAyNgpAQCAtNTMxLDYgKzU0Nyw3IEBACiAjZGVmaW5lIEVWRU5UX0NIQU5ORUxfUkVQT1JUX1JEWSAgICAgICAgMHgwMDAwMDA1NAogI2RlZmluZSBFVkVOVF9UWF9EQVRBX1BBVVNFICAgICAgICAgICAgIDB4MDAwMDAwNTUKICNkZWZpbmUgRVZFTlRfRVhUX1NDQU5fUkVQT1JUICAgICAgICAgICAweDAwMDAwMDU4CisjZGVmaW5lIEVWRU5UX1JYQkFfU1lOQyAgICAgICAgICAgICAgICAgMHgwMDAwMDA1OQogI2RlZmluZSBFVkVOVF9CR19TQ0FOX1NUT1BQRUQgICAgICAgICAgIDB4MDAwMDAwNjUKICNkZWZpbmUgRVZFTlRfUkVNQUlOX09OX0NIQU5fRVhQSVJFRCAgICAweDAwMDAwMDVmCiAjZGVmaW5lIEVWRU5UX01VTFRJX0NIQU5fSU5GTyAgICAgICAgICAgMHgwMDAwMDA2YQpAQCAtNzM0LDYgKzc1MSwxNiBAQAogCXN0cnVjdCBtd2lmaWV4X2NoYW5fc2Nhbl9wYXJhbV9zZXQgY2hhbl9zY2FuX3BhcmFtWzFdOwogfSBfX3BhY2tlZDsKIAorc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfcnhiYV9zeW5jIHsKKwlzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19oZWFkZXIgaGVhZGVyOworCXU4IG1hY1tFVEhfQUxFTl07CisJdTggdGlkOworCXU4IHJlc2VydmVkOworCV9fbGUxNiBzZXFfbnVtOworCV9fbGUxNiBiaXRtYXBfbGVuOworCXU4IGJpdG1hcFsxXTsKK30gX19wYWNrZWQ7CisKIHN0cnVjdCBjaGFuX2JhbmRfcGFyYW1fc2V0IHsKIAl1OCByYWRpb190eXBlOwogCXU4IGNoYW5fbnVtYmVyOwpAQCAtNzgwLDYgKzgwNywxMSBAQAogCV9fbGUxNiBjaGFuX2dhcDsKIH0gX19wYWNrZWQ7CiAKK3N0cnVjdCBtd2lmaWV4X2llX3R5cGVzX3JhbmRvbV9tYWMgeworCXN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2hlYWRlciBoZWFkZXI7CisJdTggbWFjW0VUSF9BTEVOXTsKK30gX19wYWNrZWQ7CisKIHN0cnVjdCBtd2lmaWV4X2lldHlwZXNfY2hhbnN0YXRzIHsKIAlzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19oZWFkZXIgaGVhZGVyOwogCXN0cnVjdCBtd2lmaWV4X2Z3X2NoYW5fc3RhdHMgY2hhbnN0YXRzWzBdOwpAQCAtMTQ2NCw2ICsxNDk2LDcgQEAKIAkvKiBWYXJpYWJsZSBudW1iZXIgKGZpeGVkIG1heGltdW0pIG9mIGNoYW5uZWxzIHRvIHNjYW4gdXAgKi8KIAlzdHJ1Y3QgbXdpZmlleF91c2VyX3NjYW5fY2hhbiBjaGFuX2xpc3RbTVdJRklFWF9VU0VSX1NDQU5fQ0hBTl9NQVhdOwogCXUxNiBzY2FuX2NoYW5fZ2FwOworCXU4IHJhbmRvbV9tYWNbRVRIX0FMRU5dOwogfSBfX3BhY2tlZDsKIAogI2RlZmluZSBNV0lGSUVYX0JHX1NDQU5fQ0hBTl9NQVggMzgKQEAgLTE2NDYsNyArMTY3OSw3IEBACiB9OwogCiBzdHJ1Y3QgaG9zdF9jbWRfZHNfc3RhX2xpc3QgewotCXUxNiBzdGFfY291bnQ7CisJX19sZTE2IHN0YV9jb3VudDsKIAl1OCB0bHZbMF07CiB9IF9fcGFja2VkOwogCkBAIC0xNjY3LDYgKzE3MDAsMTIgQEAKIAl1OCB3bW1faWVbMV07CiB9OwogCitzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19tZ210X2ZyYW1lIHsKKwlzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19oZWFkZXIgaGVhZGVyOworCV9fbGUxNiBmcmFtZV9jb250cm9sOworCXU4IGZyYW1lX2NvbnRlbnRzWzBdOworfTsKKwogc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfd21tX3F1ZXVlX3N0YXR1cyB7CiAJc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaGVhZGVyIGhlYWRlcjsKIAl1OCBxdWV1ZV9pbmRleDsKQEAgLTIwMzQsMjYgKzIwNzMsMjYgQEAKIAogc3RydWN0IGhvc3RfY21kX2RzX3BjaWVfZGV0YWlscyB7CiAJLyogVFggYnVmZmVyIGRlc2NyaXB0b3IgcmluZyBhZGRyZXNzICovCi0JdTMyIHR4YmRfYWRkcl9sbzsKLQl1MzIgdHhiZF9hZGRyX2hpOworCV9fbGUzMiB0eGJkX2FkZHJfbG87CisJX19sZTMyIHR4YmRfYWRkcl9oaTsKIAkvKiBUWCBidWZmZXIgZGVzY3JpcHRvciByaW5nIGNvdW50ICovCi0JdTMyIHR4YmRfY291bnQ7CisJX19sZTMyIHR4YmRfY291bnQ7CiAKIAkvKiBSWCBidWZmZXIgZGVzY3JpcHRvciByaW5nIGFkZHJlc3MgKi8KLQl1MzIgcnhiZF9hZGRyX2xvOwotCXUzMiByeGJkX2FkZHJfaGk7CisJX19sZTMyIHJ4YmRfYWRkcl9sbzsKKwlfX2xlMzIgcnhiZF9hZGRyX2hpOwogCS8qIFJYIGJ1ZmZlciBkZXNjcmlwdG9yIHJpbmcgY291bnQgKi8KLQl1MzIgcnhiZF9jb3VudDsKKwlfX2xlMzIgcnhiZF9jb3VudDsKIAogCS8qIEV2ZW50IGJ1ZmZlciBkZXNjcmlwdG9yIHJpbmcgYWRkcmVzcyAqLwotCXUzMiBldnRiZF9hZGRyX2xvOwotCXUzMiBldnRiZF9hZGRyX2hpOworCV9fbGUzMiBldnRiZF9hZGRyX2xvOworCV9fbGUzMiBldnRiZF9hZGRyX2hpOwogCS8qIEV2ZW50IGJ1ZmZlciBkZXNjcmlwdG9yIHJpbmcgY291bnQgKi8KLQl1MzIgZXZ0YmRfY291bnQ7CisJX19sZTMyIGV2dGJkX2NvdW50OwogCiAJLyogU2xlZXAgY29va2llIGJ1ZmZlciBwaHlzaWNhbCBhZGRyZXNzICovCi0JdTMyIHNsZWVwX2Nvb2tpZV9hZGRyX2xvOwotCXUzMiBzbGVlcF9jb29raWVfYWRkcl9oaTsKKwlfX2xlMzIgc2xlZXBfY29va2llX2FkZHJfbG87CisJX19sZTMyIHNsZWVwX2Nvb2tpZV9hZGRyX2hpOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfcnNzaV90aHJlc2hvbGQgewpAQCAtMjA5Myw4ICsyMTMyLDggQEAKIAl1OCBjaGFuX2J1Zl93ZWlnaHQ7CiAJdTggYmFuZF9jb25maWc7CiAJdTggY2hhbl9udW07Ci0JdTMyIGNoYW5fdGltZTsKLQl1MzIgcmVzZXJ2ZWQ7CisJX19sZTMyIGNoYW5fdGltZTsKKwlfX2xlMzIgcmVzZXJ2ZWQ7CiAJdW5pb24gewogCQl1OCBzZGlvX2Z1bmNfbnVtOwogCQl1OCB1c2JfZXBfbnVtOwpAQCAtMjE4NSw3ICsyMjI0LDcgQEAKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBob3N0X2NtZF9kc193YWtldXBfcmVhc29uIHsKLQl1MTYgIHdha2V1cF9yZWFzb247CisJX19sZTE2ICB3YWtldXBfcmVhc29uOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IGhvc3RfY21kX2RzX2d0a19yZWtleV9wYXJhbXMgewpAQCAtMjE5Niw2ICsyMjM1LDEwIEBACiAJX19sZTMyIHJlcGxheV9jdHJfaGlnaDsKIH0gX19wYWNrZWQ7CiAKK3N0cnVjdCBob3N0X2NtZF9kc19jaGFuX3JlZ2lvbl9jZmcgeworCV9fbGUxNiBhY3Rpb247Cit9IF9fcGFja2VkOworCiBzdHJ1Y3QgaG9zdF9jbWRfZHNfY29tbWFuZCB7CiAJX19sZTE2IGNvbW1hbmQ7CiAJX19sZTE2IHNpemU7CkBAIC0yMjcwLDYgKzIzMTMsNyBAQAogCQlzdHJ1Y3QgaG9zdF9jbWRfZHNfcm9idXN0X2NvZXggY29leDsKIAkJc3RydWN0IGhvc3RfY21kX2RzX3dha2V1cF9yZWFzb24gaHNfd2FrZXVwX3JlYXNvbjsKIAkJc3RydWN0IGhvc3RfY21kX2RzX2d0a19yZWtleV9wYXJhbXMgcmVrZXk7CisJCXN0cnVjdCBob3N0X2NtZF9kc19jaGFuX3JlZ2lvbl9jZmcgcmVnX2NmZzsKIAl9IHBhcmFtczsKIH0gX19wYWNrZWQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9pbml0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvaW5pdC5jCmluZGV4IDE0ODljOTAuLjgyODM5ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9pbml0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2luaXQuYwpAQCAtMjk4LDYgKzI5OCw3IEBACiAJbWVtc2V0KCZhZGFwdGVyLT5hcnBfZmlsdGVyLCAwLCBzaXplb2YoYWRhcHRlci0+YXJwX2ZpbHRlcikpOwogCWFkYXB0ZXItPmFycF9maWx0ZXJfc2l6ZSA9IDA7CiAJYWRhcHRlci0+bWF4X21nbXRfaWVfaW5kZXggPSBNQVhfTUdNVF9JRV9JTkRFWDsKKwlhZGFwdGVyLT5tZmdfbW9kZSA9IG1mZ19tb2RlOwogCWFkYXB0ZXItPmtleV9hcGlfbWFqb3JfdmVyID0gMDsKIAlhZGFwdGVyLT5rZXlfYXBpX21pbm9yX3ZlciA9IDA7CiAJZXRoX2Jyb2FkY2FzdF9hZGRyKGFkYXB0ZXItPnBlcm1fYWRkcik7CkBAIC01NTMsMTUgKzU1NCwyMiBAQAogCQkJCXJldHVybiAtMTsKIAkJfQogCX0KKwlpZiAoYWRhcHRlci0+bWZnX21vZGUpIHsKKwkJYWRhcHRlci0+aHdfc3RhdHVzID0gTVdJRklFWF9IV19TVEFUVVNfUkVBRFk7CisJCXJldCA9IC1FSU5QUk9HUkVTUzsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+cHJpdl9udW07IGkrKykgeworCQkJaWYgKGFkYXB0ZXItPnByaXZbaV0pIHsKKwkJCQlyZXQgPSBtd2lmaWV4X3N0YV9pbml0X2NtZChhZGFwdGVyLT5wcml2W2ldLAorCQkJCQkJCSAgIGZpcnN0X3N0YSwgdHJ1ZSk7CisJCQkJaWYgKHJldCA9PSAtMSkKKwkJCQkJcmV0dXJuIC0xOwogCi0JZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPnByaXZfbnVtOyBpKyspIHsKLQkJaWYgKGFkYXB0ZXItPnByaXZbaV0pIHsKLQkJCXJldCA9IG13aWZpZXhfc3RhX2luaXRfY21kKGFkYXB0ZXItPnByaXZbaV0sIGZpcnN0X3N0YSwKLQkJCQkJCSAgIHRydWUpOwotCQkJaWYgKHJldCA9PSAtMSkKLQkJCQlyZXR1cm4gLTE7CisJCQkJZmlyc3Rfc3RhID0gZmFsc2U7CisJCQl9CiAKLQkJCWZpcnN0X3N0YSA9IGZhbHNlOworCisKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2lvY3RsLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvaW9jdGwuaAppbmRleCA3MDQyOTgxLi41MzZhYjgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvaW9jdGwuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvaW9jdGwuaApAQCAtMjYwLDYgKzI2MCw3IEBACiAJdTggaXNfaWd0a19rZXk7CiAJdTggaXNfY3VycmVudF93ZXBfa2V5OwogCXU4IGlzX3J4X3NlcV92YWxpZDsKKwl1OCBpc19pZ3RrX2RlZl9rZXk7CiB9OwogCiBzdHJ1Y3QgbXdpZmlleF9wb3dlcl9jZmcgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2pvaW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9qb2luLmMKaW5kZXggMWM3YjAwNi4uYjg5NTk2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2pvaW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvam9pbi5jCkBAIC02NjksOSArNjY5LDggQEAKIAlwcml2LT5hc3NvY19yc3Bfc2l6ZSA9IG1pbihsZTE2X3RvX2NwdShyZXNwLT5zaXplKSAtIFNfRFNfR0VOLAogCQkJCSAgIHNpemVvZihwcml2LT5hc3NvY19yc3BfYnVmKSk7CiAKLQltZW1jcHkocHJpdi0+YXNzb2NfcnNwX2J1ZiwgJnJlc3AtPnBhcmFtcywgcHJpdi0+YXNzb2NfcnNwX3NpemUpOwotCiAJYXNzb2NfcnNwLT5hX2lkID0gY3B1X3RvX2xlMTYoYWlkKTsKKwltZW1jcHkocHJpdi0+YXNzb2NfcnNwX2J1ZiwgJnJlc3AtPnBhcmFtcywgcHJpdi0+YXNzb2NfcnNwX3NpemUpOwogCiAJaWYgKHN0YXR1c19jb2RlKSB7CiAJCXByaXYtPmFkYXB0ZXItPmRiZy5udW1fY21kX2Fzc29jX2ZhaWx1cmUrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvbWFpbi5jCmluZGV4IGRiNDkyNWQuLjI0NzhjY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L21haW4uYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgIjExbi5oIgogCiAjZGVmaW5lIFZFUlNJT04JIjEuMCIKKyNkZWZpbmUgTUZHX0ZJUk1XQVJFCSJtd2lmaWV4X21mZy5iaW4iCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWdfbWFzayA9IE1XSUZJRVhfREVGQVVMVF9ERUJVR19NQVNLOwogbW9kdWxlX3BhcmFtKGRlYnVnX21hc2ssIHVpbnQsIDApOwpAQCAtMzcsNiArMzgsMTAgQEAKIE1PRFVMRV9QQVJNX0RFU0MoZHJpdmVyX21vZGUsCiAJCSAic3RhdGlvbj0weDEoZGVmYXVsdCksIGFwLXN0YT0weDMsIHN0YXRpb24tcDJwPTB4NSwgYXAtc3RhLXAycD0weDciKTsKIAorYm9vbCBtZmdfbW9kZTsKK21vZHVsZV9wYXJhbShtZmdfbW9kZSwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1mZ19tb2RlLCAibWFudWZhY3R1cmluZyBtb2RlIGVuYWJsZToxLCBkaXNhYmxlOjAiKTsKKwogLyoKICAqIFRoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIHRoZSBkZXZpY2UgYW5kIHBlcmZvcm1zIGFsbCB0aGUgbmVjZXNzYXJ5CiAgKiBpbml0aWFsaXphdGlvbnMuCkBAIC0xMzksNiArMTQ0LDggQEAKIAkJYWRhcHRlci0+bmRfaW5mbyA9IE5VTEw7CiAJfQogCisJa2ZyZWUoYWRhcHRlci0+cmVnZCk7CisKIAl2ZnJlZShhZGFwdGVyLT5jaGFuX3N0YXRzKTsKIAlrZnJlZShhZGFwdGVyKTsKIAlyZXR1cm4gMDsKQEAgLTQ4Niw5ICs0OTMsMTEgQEAKICAqLwogc3RhdGljIHZvaWQgbXdpZmlleF90ZXJtaW5hdGVfd29ya3F1ZXVlKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JZmx1c2hfd29ya3F1ZXVlKGFkYXB0ZXItPndvcmtxdWV1ZSk7Ci0JZGVzdHJveV93b3JrcXVldWUoYWRhcHRlci0+d29ya3F1ZXVlKTsKLQlhZGFwdGVyLT53b3JrcXVldWUgPSBOVUxMOworCWlmIChhZGFwdGVyLT53b3JrcXVldWUpIHsKKwkJZmx1c2hfd29ya3F1ZXVlKGFkYXB0ZXItPndvcmtxdWV1ZSk7CisJCWRlc3Ryb3lfd29ya3F1ZXVlKGFkYXB0ZXItPndvcmtxdWV1ZSk7CisJCWFkYXB0ZXItPndvcmtxdWV1ZSA9IE5VTEw7CisJfQogCiAJaWYgKGFkYXB0ZXItPnJ4X3dvcmtxdWV1ZSkgewogCQlmbHVzaF93b3JrcXVldWUoYWRhcHRlci0+cnhfd29ya3F1ZXVlKTsKQEAgLTU1OSwxNiArNTY4LDIxIEBACiAJCWdvdG8gZG9uZTsKIAl9CiAJLyogV2FpdCBmb3IgbXdpZmlleF9pbml0IHRvIGNvbXBsZXRlICovCi0Jd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGFkYXB0ZXItPmluaXRfd2FpdF9xLAotCQkJCSBhZGFwdGVyLT5pbml0X3dhaXRfcV93b2tlbik7Ci0JaWYgKGFkYXB0ZXItPmh3X3N0YXR1cyAhPSBNV0lGSUVYX0hXX1NUQVRVU19SRUFEWSkKLQkJZ290byBlcnJfaW5pdF9mdzsKKwlpZiAoIWFkYXB0ZXItPm1mZ19tb2RlKSB7CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhZGFwdGVyLT5pbml0X3dhaXRfcSwKKwkJCQkJIGFkYXB0ZXItPmluaXRfd2FpdF9xX3dva2VuKTsKKwkJaWYgKGFkYXB0ZXItPmh3X3N0YXR1cyAhPSBNV0lGSUVYX0hXX1NUQVRVU19SRUFEWSkKKwkJCWdvdG8gZXJyX2luaXRfZnc7CisJfQogCiAJcHJpdiA9IGFkYXB0ZXItPnByaXZbTVdJRklFWF9CU1NfUk9MRV9TVEFdOwotCWlmIChtd2lmaWV4X3JlZ2lzdGVyX2NmZzgwMjExKGFkYXB0ZXIpKSB7Ci0JCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVSUk9SLAotCQkJICAgICJjYW5ub3QgcmVnaXN0ZXIgd2l0aCBjZmc4MDIxMVxuIik7Ci0JCWdvdG8gZXJyX2luaXRfZnc7CisKKwlpZiAoIWFkYXB0ZXItPndpcGh5KSB7CisJCWlmIChtd2lmaWV4X3JlZ2lzdGVyX2NmZzgwMjExKGFkYXB0ZXIpKSB7CisJCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwKKwkJCQkgICAgImNhbm5vdCByZWdpc3RlciB3aXRoIGNmZzgwMjExXG4iKTsKKwkJCWdvdG8gZXJyX2luaXRfZnc7CisJCX0KIAl9CiAKIAlpZiAobXdpZmlleF9pbml0X2NoYW5uZWxfc2Nhbl9nYXAoYWRhcHRlcikpIHsKQEAgLTY2MiwxNiArNjc2LDQxIEBACiAvKgogICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgaGFyZHdhcmUgYW5kIGdldHMgZmlybXdhcmUuCiAgKi8KLXN0YXRpYyBpbnQgbXdpZmlleF9pbml0X2h3X2Z3KHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpCitzdGF0aWMgaW50IG13aWZpZXhfaW5pdF9od19mdyhzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyLAorCQkJICAgICAgYm9vbCByZXFfZndfbm93YWl0KQogewogCWludCByZXQ7CiAKLQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlX25vd2FpdChUSElTX01PRFVMRSwgMSwgYWRhcHRlci0+ZndfbmFtZSwKLQkJCQkgICAgICBhZGFwdGVyLT5kZXYsIEdGUF9LRVJORUwsIGFkYXB0ZXIsCi0JCQkJICAgICAgbXdpZmlleF9md19kcGMpOwotCWlmIChyZXQgPCAwKQotCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwKLQkJCSAgICAicmVxdWVzdF9maXJtd2FyZV9ub3dhaXQgZXJyb3IgJWRcbiIsIHJldCk7CisJLyogT3ZlcnJpZGUgZGVmYXVsdCBmaXJtd2FyZSB3aXRoIG1hbnVmYWN0dXJpbmcgb25lIGlmCisJICogbWFudWZhY3R1cmluZyBtb2RlIGlzIGVuYWJsZWQKKwkgKi8KKwlpZiAobWZnX21vZGUpIHsKKwkJaWYgKHN0cmxjcHkoYWRhcHRlci0+ZndfbmFtZSwgTUZHX0ZJUk1XQVJFLAorCQkJICAgIHNpemVvZihhZGFwdGVyLT5md19uYW1lKSkgPj0KKwkJCSAgICBzaXplb2YoYWRhcHRlci0+ZndfbmFtZSkpIHsKKwkJCXByX2VycigiJXM6IGZ3X25hbWUgdG9vIGxvbmchXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlpZiAocmVxX2Z3X25vd2FpdCkgeworCQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlX25vd2FpdChUSElTX01PRFVMRSwgMSwgYWRhcHRlci0+ZndfbmFtZSwKKwkJCQkJICAgICAgYWRhcHRlci0+ZGV2LCBHRlBfS0VSTkVMLCBhZGFwdGVyLAorCQkJCQkgICAgICBtd2lmaWV4X2Z3X2RwYyk7CisJCWlmIChyZXQgPCAwKQorCQkJbXdpZmlleF9kYmcoYWRhcHRlciwgRVJST1IsCisJCQkJICAgICJyZXF1ZXN0X2Zpcm13YXJlX25vd2FpdCBlcnJvciAlZFxuIiwgcmV0KTsKKwl9IGVsc2UgeworCQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZhZGFwdGVyLT5maXJtd2FyZSwKKwkJCQkgICAgICAgYWRhcHRlci0+ZndfbmFtZSwKKwkJCQkgICAgICAgYWRhcHRlci0+ZGV2KTsKKwkJaWYgKHJldCA8IDApCisJCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwKKwkJCQkgICAgInJlcXVlc3RfZmlybXdhcmUgZXJyb3IgJWRcbiIsIHJldCk7CisJCWVsc2UKKwkJCW13aWZpZXhfZndfZHBjKGFkYXB0ZXItPmZpcm13YXJlLCAodm9pZCAqKWFkYXB0ZXIpOworCX0KKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEzMjEsNiArMTM2MCwxOTkgQEAKIH0KIAogLyoKKyAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgZHVyaW5nIFBDSWUgZnVuY3Rpb24gbGV2ZWwgcmVzZXQuIFJlcXVpcmVkCisgKiBjb2RlIGlzIGV4dHJhY3RlZCBmcm9tIG13aWZpZXhfcmVtb3ZlX2NhcmQoKQorICovCitzdGF0aWMgaW50Cittd2lmaWV4X3NodXRkb3duX3N3KHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBzZW1hcGhvcmUgKnNlbSkKK3sKKwlzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2OworCWludCBpOworCisJaWYgKCFhZGFwdGVyKQorCQlnb3RvIGV4aXRfcmV0dXJuOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZShzZW0pKQorCQlnb3RvIGV4aXRfc2VtX2VycjsKKworCXByaXYgPSBtd2lmaWV4X2dldF9wcml2KGFkYXB0ZXIsIE1XSUZJRVhfQlNTX1JPTEVfQU5ZKTsKKwltd2lmaWV4X2RlYXV0aGVudGljYXRlKHByaXYsIE5VTEwpOworCisJLyogV2UgY2FuIG5vIGxvbmdlciBoYW5kbGUgaW50ZXJydXB0cyBvbmNlIHdlIHN0YXJ0IGRvaW5nIHRoZSB0ZWFyZG93bgorCSAqIGJlbG93LgorCSAqLworCWlmIChhZGFwdGVyLT5pZl9vcHMuZGlzYWJsZV9pbnQpCisJCWFkYXB0ZXItPmlmX29wcy5kaXNhYmxlX2ludChhZGFwdGVyKTsKKworCWFkYXB0ZXItPnN1cnByaXNlX3JlbW92ZWQgPSB0cnVlOworCW13aWZpZXhfdGVybWluYXRlX3dvcmtxdWV1ZShhZGFwdGVyKTsKKworCS8qIFN0b3AgZGF0YSAqLworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5wcml2X251bTsgaSsrKSB7CisJCXByaXYgPSBhZGFwdGVyLT5wcml2W2ldOworCQlpZiAocHJpdiAmJiBwcml2LT5uZXRkZXYpIHsKKwkJCW13aWZpZXhfc3RvcF9uZXRfZGV2X3F1ZXVlKHByaXYtPm5ldGRldiwgYWRhcHRlcik7CisJCQlpZiAobmV0aWZfY2Fycmllcl9vayhwcml2LT5uZXRkZXYpKQorCQkJCW5ldGlmX2NhcnJpZXJfb2ZmKHByaXYtPm5ldGRldik7CisJCQluZXRpZl9kZXZpY2VfZGV0YWNoKHByaXYtPm5ldGRldik7CisJCX0KKwl9CisKKwltd2lmaWV4X2RiZyhhZGFwdGVyLCBDTUQsICJjbWQ6IGNhbGxpbmcgbXdpZmlleF9zaHV0ZG93bl9kcnYuLi5cbiIpOworCWFkYXB0ZXItPmluaXRfd2FpdF9xX3dva2VuID0gZmFsc2U7CisKKwlpZiAobXdpZmlleF9zaHV0ZG93bl9kcnYoYWRhcHRlcikgPT0gLUVJTlBST0dSRVNTKQorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYWRhcHRlci0+aW5pdF93YWl0X3EsCisJCQkJCSBhZGFwdGVyLT5pbml0X3dhaXRfcV93b2tlbik7CisJaWYgKGFkYXB0ZXItPmlmX29wcy5kb3duX2RldikKKwkJYWRhcHRlci0+aWZfb3BzLmRvd25fZGV2KGFkYXB0ZXIpOworCisJbXdpZmlleF9kYmcoYWRhcHRlciwgQ01ELCAiY21kOiBtd2lmaWV4X3NodXRkb3duX2RydiBkb25lXG4iKTsKKwlpZiAoYXRvbWljX3JlYWQoJmFkYXB0ZXItPnJ4X3BlbmRpbmcpIHx8CisJICAgIGF0b21pY19yZWFkKCZhZGFwdGVyLT50eF9wZW5kaW5nKSB8fAorCSAgICBhdG9taWNfcmVhZCgmYWRhcHRlci0+Y21kX3BlbmRpbmcpKSB7CisJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVSUk9SLAorCQkJICAgICJyeF9wZW5kaW5nPSVkLCB0eF9wZW5kaW5nPSVkLFx0IgorCQkJICAgICJjbWRfcGVuZGluZz0lZFxuIiwKKwkJCSAgICBhdG9taWNfcmVhZCgmYWRhcHRlci0+cnhfcGVuZGluZyksCisJCQkgICAgYXRvbWljX3JlYWQoJmFkYXB0ZXItPnR4X3BlbmRpbmcpLAorCQkJICAgIGF0b21pY19yZWFkKCZhZGFwdGVyLT5jbWRfcGVuZGluZykpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5wcml2X251bTsgaSsrKSB7CisJCXByaXYgPSBhZGFwdGVyLT5wcml2W2ldOworCQlpZiAoIXByaXYpCisJCQljb250aW51ZTsKKwkJcnRubF9sb2NrKCk7CisJCWlmIChwcml2LT5uZXRkZXYgJiYKKwkJICAgIHByaXYtPndkZXYuaWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVEKQorCQkJbXdpZmlleF9kZWxfdmlydHVhbF9pbnRmKGFkYXB0ZXItPndpcGh5LCAmcHJpdi0+d2Rldik7CisJCXJ0bmxfdW5sb2NrKCk7CisJfQorCisJdXAoc2VtKTsKK2V4aXRfc2VtX2VycjoKKwltd2lmaWV4X2RiZyhhZGFwdGVyLCBJTkZPLCAiJXMsIHN1Y2Nlc3NmdWxcbiIsIF9fZnVuY19fKTsKK2V4aXRfcmV0dXJuOgorCXJldHVybiAwOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIGR1cmluZyBQQ0llIGZ1bmN0aW9uIGxldmVsIHJlc2V0LiBSZXF1aXJlZAorICogY29kZSBpcyBleHRyYWN0ZWQgZnJvbSBtd2lmaWV4X2FkZF9jYXJkKCkKKyAqLworc3RhdGljIGludAorbXdpZmlleF9yZWluaXRfc3coc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHNlbWFwaG9yZSAqc2VtLAorCQkgIHN0cnVjdCBtd2lmaWV4X2lmX29wcyAqaWZfb3BzLCB1OCBpZmFjZV90eXBlKQoreworCWNoYXIgZndfbmFtZVszMl07CisJc3RydWN0IHBjaWVfc2VydmljZV9jYXJkICpjYXJkID0gYWRhcHRlci0+Y2FyZDsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoc2VtKSkKKwkJZ290byBleGl0X3NlbV9lcnI7CisKKwltd2lmaWV4X2luaXRfbG9ja19saXN0KGFkYXB0ZXIpOworCWlmIChhZGFwdGVyLT5pZl9vcHMudXBfZGV2KQorCQlhZGFwdGVyLT5pZl9vcHMudXBfZGV2KGFkYXB0ZXIpOworCisJYWRhcHRlci0+aWZhY2VfdHlwZSA9IGlmYWNlX3R5cGU7CisJYWRhcHRlci0+Y2FyZF9zZW0gPSBzZW07CisKKwlhZGFwdGVyLT5od19zdGF0dXMgPSBNV0lGSUVYX0hXX1NUQVRVU19JTklUSUFMSVpJTkc7CisJYWRhcHRlci0+c3VycHJpc2VfcmVtb3ZlZCA9IGZhbHNlOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmFkYXB0ZXItPmluaXRfd2FpdF9xKTsKKwlhZGFwdGVyLT5pc19zdXNwZW5kZWQgPSBmYWxzZTsKKwlhZGFwdGVyLT5oc19hY3RpdmF0ZWQgPSBmYWxzZTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhZGFwdGVyLT5oc19hY3RpdmF0ZV93YWl0X3EpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmFkYXB0ZXItPmNtZF93YWl0X3Eud2FpdCk7CisJYWRhcHRlci0+Y21kX3dhaXRfcS5zdGF0dXMgPSAwOworCWFkYXB0ZXItPnNjYW5fd2FpdF9xX3dva2VuID0gZmFsc2U7CisKKwlpZiAoKG51bV9wb3NzaWJsZV9jcHVzKCkgPiAxKSB8fCBhZGFwdGVyLT5pZmFjZV90eXBlID09IE1XSUZJRVhfVVNCKQorCQlhZGFwdGVyLT5yeF93b3JrX2VuYWJsZWQgPSB0cnVlOworCisJYWRhcHRlci0+d29ya3F1ZXVlID0KKwkJYWxsb2Nfd29ya3F1ZXVlKCJNV0lGSUVYX1dPUktfUVVFVUUiLAorCQkJCVdRX0hJR0hQUkkgfCBXUV9NRU1fUkVDTEFJTSB8IFdRX1VOQk9VTkQsIDEpOworCWlmICghYWRhcHRlci0+d29ya3F1ZXVlKQorCQlnb3RvIGVycl9rbWFsbG9jOworCisJSU5JVF9XT1JLKCZhZGFwdGVyLT5tYWluX3dvcmssIG13aWZpZXhfbWFpbl93b3JrX3F1ZXVlKTsKKworCWlmIChhZGFwdGVyLT5yeF93b3JrX2VuYWJsZWQpIHsKKwkJYWRhcHRlci0+cnhfd29ya3F1ZXVlID0gYWxsb2Nfd29ya3F1ZXVlKCJNV0lGSUVYX1JYX1dPUktfUVVFVUUiLAorCQkJCQkJCVdRX0hJR0hQUkkgfAorCQkJCQkJCVdRX01FTV9SRUNMQUlNIHwKKwkJCQkJCQlXUV9VTkJPVU5ELCAxKTsKKwkJaWYgKCFhZGFwdGVyLT5yeF93b3JrcXVldWUpCisJCQlnb3RvIGVycl9rbWFsbG9jOworCQlJTklUX1dPUksoJmFkYXB0ZXItPnJ4X3dvcmssIG13aWZpZXhfcnhfd29ya19xdWV1ZSk7CisJfQorCisJLyogUmVnaXN0ZXIgdGhlIGRldmljZS4gRmlsbCB1cCB0aGUgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSB3aXRoCisJICogcmVsZXZhbnQgaW5mb3JtYXRpb24gZnJvbSB0aGUgY2FyZC4gU29tZSBjb2RlIGV4dHJhY3RlZCBmcm9tCisJICogbXdpZmlleF9yZWdpc3Rlcl9kZXYoKQorCSAqLworCW13aWZpZXhfZGJnKGFkYXB0ZXIsIElORk8sICIlcywgbXdpZmlleF9pbml0X2h3X2Z3KCkuLi5cbiIsIF9fZnVuY19fKTsKKwlzdHJjcHkoZndfbmFtZSwgYWRhcHRlci0+ZndfbmFtZSk7CisJc3RyY3B5KGFkYXB0ZXItPmZ3X25hbWUsIFBDSUU4OTk3X0RFRkFVTFRfV0lGSUZXX05BTUUpOworCisJYWRhcHRlci0+dHhfYnVmX3NpemUgPSBjYXJkLT5wY2llLnR4X2J1Zl9zaXplOworCWFkYXB0ZXItPmV4dF9zY2FuID0gY2FyZC0+cGNpZS5jYW5fZXh0X3NjYW47CisJaWYgKG13aWZpZXhfaW5pdF9od19mdyhhZGFwdGVyLCBmYWxzZSkpIHsKKwkJc3RyY3B5KGFkYXB0ZXItPmZ3X25hbWUsIGZ3X25hbWUpOworCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwKKwkJCSAgICAiJXM6IGZpcm13YXJlIGluaXQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX2luaXRfZnc7CisJfQorCXN0cmNweShhZGFwdGVyLT5md19uYW1lLCBmd19uYW1lKTsKKwltd2lmaWV4X2RiZyhhZGFwdGVyLCBJTkZPLCAiJXMsIHN1Y2Nlc3NmdWxcbiIsIF9fZnVuY19fKTsKKwl1cChzZW0pOworCXJldHVybiAwOworCitlcnJfaW5pdF9mdzoKKwltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwgImluZm86ICVzOiB1bnJlZ2lzdGVyIGRldmljZVxuIiwgX19mdW5jX18pOworCWlmIChhZGFwdGVyLT5pZl9vcHMudW5yZWdpc3Rlcl9kZXYpCisJCWFkYXB0ZXItPmlmX29wcy51bnJlZ2lzdGVyX2RldihhZGFwdGVyKTsKKwlpZiAoYWRhcHRlci0+aHdfc3RhdHVzID09IE1XSUZJRVhfSFdfU1RBVFVTX1JFQURZKSB7CisJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVSUk9SLAorCQkJICAgICJpbmZvOiAlczogc2h1dGRvd24gbXdpZmlleFxuIiwgX19mdW5jX18pOworCQlhZGFwdGVyLT5pbml0X3dhaXRfcV93b2tlbiA9IGZhbHNlOworCisJCWlmIChtd2lmaWV4X3NodXRkb3duX2RydihhZGFwdGVyKSA9PSAtRUlOUFJPR1JFU1MpCisJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYWRhcHRlci0+aW5pdF93YWl0X3EsCisJCQkJCQkgYWRhcHRlci0+aW5pdF93YWl0X3Ffd29rZW4pOworCX0KKworZXJyX2ttYWxsb2M6CisJbXdpZmlleF90ZXJtaW5hdGVfd29ya3F1ZXVlKGFkYXB0ZXIpOworCWFkYXB0ZXItPnN1cnByaXNlX3JlbW92ZWQgPSB0cnVlOworCXVwKHNlbSk7CitleGl0X3NlbV9lcnI6CisJbXdpZmlleF9kYmcoYWRhcHRlciwgSU5GTywgIiVzLCBlcnJvclxuIiwgX19mdW5jX18pOworCisJcmV0dXJuIC0xOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyBwcmUgYW5kIHBvc3QgUENJZSBmdW5jdGlvbiBsZXZlbCByZXNldHMuCisgKiBJdCBwZXJmb3JtcyBzb2Z0d2FyZSBjbGVhbnVwIHdpdGhvdXQgdG91Y2hpbmcgUENJZSBzcGVjaWZpYyBjb2RlLgorICogQWxzbywgZHVyaW5nIGluaXRpYWxpemF0aW9uIFBDSWUgc3R1ZmYgaXMgc2tpcHBlZC4KKyAqLwordm9pZCBtd2lmaWV4X2RvX2ZscihzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyLCBib29sIHByZXBhcmUpCit7CisJc3RydWN0IG13aWZpZXhfaWZfb3BzIGlmX29wczsKKworCWlmICghcHJlcGFyZSkgeworCQltd2lmaWV4X3JlaW5pdF9zdyhhZGFwdGVyLCBhZGFwdGVyLT5jYXJkX3NlbSwgJmlmX29wcywKKwkJCQkgIGFkYXB0ZXItPmlmYWNlX3R5cGUpOworCX0gZWxzZSB7CisJCW1lbWNweSgmaWZfb3BzLCAmYWRhcHRlci0+aWZfb3BzLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBtd2lmaWV4X2lmX29wcykpOworCQltd2lmaWV4X3NodXRkb3duX3N3KGFkYXB0ZXIsIGFkYXB0ZXItPmNhcmRfc2VtKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtd2lmaWV4X2RvX2Zscik7CisKKy8qCiAgKiBUaGlzIGZ1bmN0aW9uIGFkZHMgdGhlIGNhcmQuCiAgKgogICogVGhpcyBmdW5jdGlvbiBmb2xsb3dzIHRoZSBmb2xsb3dpbmcgbWFqb3Igc3RlcHMgdG8gc2V0IHVwIHRoZSBkZXZpY2UgLQpAQCAtMTM5MSw3ICsxNjIzLDcgQEAKIAkJZ290byBlcnJfcmVnaXN0ZXJkZXY7CiAJfQogCi0JaWYgKG13aWZpZXhfaW5pdF9od19mdyhhZGFwdGVyKSkgeworCWlmIChtd2lmaWV4X2luaXRfaHdfZncoYWRhcHRlciwgdHJ1ZSkpIHsKIAkJcHJfZXJyKCIlczogZmlybXdhcmUgaW5pdCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKIAkJZ290byBlcnJfaW5pdF9mdzsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvbWFpbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L21haW4uaAppbmRleCA5ZjZiYjQwLi4yNmRmMjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvbWFpbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9tYWluLmgKQEAgLTU4LDYgKzU4LDcgQEAKICNpbmNsdWRlICJzZGlvLmgiCiAKIGV4dGVybiBjb25zdCBjaGFyIGRyaXZlcl92ZXJzaW9uW107CitleHRlcm4gYm9vbCBtZmdfbW9kZTsKIAogc3RydWN0IG13aWZpZXhfYWRhcHRlcjsKIHN0cnVjdCBtd2lmaWV4X3ByaXZhdGU7CkBAIC02NzUsNiArNjc2LDcgQEAKIAlzdHJ1Y3QgbXdpZmlleF91c2VyX3NjYW5fY2hhbiBoaWRkZW5fY2hhbltNV0lGSUVYX1VTRVJfU0NBTl9DSEFOX01BWF07CiAJdTggYXNzb2NfcmVzcF9odF9wYXJhbTsKIAlib29sIGh0X3BhcmFtX3ByZXNlbnQ7CisJdTggcmFuZG9tX21hY1tFVEhfQUxFTl07CiB9OwogCiAKQEAgLTgyNyw2ICs4MjksOCBAQAogCXZvaWQgKCpkZWFnZ3JfcGt0KShzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICosIHN0cnVjdCBza19idWZmICopOwogCXZvaWQgKCptdWx0aV9wb3J0X3Jlc3luYykoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqKTsKIAlib29sICgqaXNfcG9ydF9yZWFkeSkoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqKTsKKwl2b2lkICgqZG93bl9kZXYpKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKik7CisJdm9pZCAoKnVwX2Rldikoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqKTsKIH07CiAKIHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgewpAQCAtOTg5LDYgKzk5Myw3IEBACiAJdTMyIGRydl9pbmZvX3NpemU7CiAJYm9vbCBzY2FuX2NoYW5fZ2FwX2VuYWJsZWQ7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCByeF9kYXRhX3E7CisJYm9vbCBtZmdfbW9kZTsKIAlzdHJ1Y3QgbXdpZmlleF9jaGFuX3N0YXRzICpjaGFuX3N0YXRzOwogCXUzMiBudW1faW5fY2hhbl9zdGF0czsKIAlpbnQgc3VydmV5X2lkeDsKQEAgLTEwMDQsNiArMTAwOSw3IEBACiAJYm9vbCB1c2JfbWNfc3RhdHVzOwogCWJvb2wgdXNiX21jX3NldHVwOwogCXN0cnVjdCBjZmc4MDIxMV93b3dsYW5fbmRfaW5mbyAqbmRfaW5mbzsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqcmVnZDsKIH07CiAKIHZvaWQgbXdpZmlleF9wcm9jZXNzX3R4X3F1ZXVlKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpOwpAQCAtMTYyNSw0ICsxNjMxLDUgQEAKIHZvaWQgbXdpZmlleF9kZXZfZGVidWdmc19pbml0KHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYpOwogdm9pZCBtd2lmaWV4X2Rldl9kZWJ1Z2ZzX3JlbW92ZShzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2KTsKICNlbmRpZgordm9pZCBtd2lmaWV4X2RvX2ZscihzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyLCBib29sIHByZXBhcmUpOwogI2VuZGlmIC8qICFfTVdJRklFWF9NQUlOX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvcGNpZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3BjaWUuYwppbmRleCA0NTNhYjZhLi4zYzNjNGYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvcGNpZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9wY2llLmMKQEAgLTIyNSw3ICsyMjUsNyBAQAogCWlmICghYWRhcHRlciB8fCAhYWRhcHRlci0+cHJpdl9udW0pCiAJCXJldHVybjsKIAotCWlmICh1c2VyX3JtbW9kKSB7CisJaWYgKHVzZXJfcm1tb2QgJiYgIWFkYXB0ZXItPm1mZ19tb2RlKSB7CiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiAJCWlmIChhZGFwdGVyLT5pc19zdXNwZW5kZWQpCiAJCQltd2lmaWV4X3BjaWVfcmVzdW1lKCZwZGV2LT5kZXYpOwpAQCAtMjc3LDYgKzI3Nyw1MiBAQAogCiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbXdpZmlleF9pZHMpOwogCitzdGF0aWMgdm9pZCBtd2lmaWV4X3BjaWVfcmVzZXRfbm90aWZ5KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBib29sIHByZXBhcmUpCit7CisJc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcjsKKwlzdHJ1Y3QgcGNpZV9zZXJ2aWNlX2NhcmQgKmNhcmQ7CisKKwlpZiAoIXBkZXYpIHsKKwkJcHJfZXJyKCIlczogUENJZSBkZXZpY2UgaXMgbm90IHNwZWNpZmllZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJY2FyZCA9IChzdHJ1Y3QgcGNpZV9zZXJ2aWNlX2NhcmQgKilwY2lfZ2V0X2RydmRhdGEocGRldik7CisJaWYgKCFjYXJkIHx8ICFjYXJkLT5hZGFwdGVyKSB7CisJCXByX2VycigiJXM6IENhcmQgb3IgYWRhcHRlciBzdHJ1Y3R1cmUgaXMgbm90IHZhbGlkICglbGQpXG4iLAorCQkgICAgICAgX19mdW5jX18sIChsb25nKWNhcmQpOworCQlyZXR1cm47CisJfQorCisJYWRhcHRlciA9IGNhcmQtPmFkYXB0ZXI7CisJbXdpZmlleF9kYmcoYWRhcHRlciwgSU5GTywKKwkJICAgICIlczogdmVuZG9yPTB4JTQuMDR4IGRldmljZT0weCU0LjA0eCByZXY9JWQgJXNcbiIsCisJCSAgICBfX2Z1bmNfXywgcGRldi0+dmVuZG9yLCBwZGV2LT5kZXZpY2UsCisJCSAgICBwZGV2LT5yZXZpc2lvbiwKKwkJICAgIHByZXBhcmUgPyAiUHJlLUZMUiIgOiAiUG9zdC1GTFIiKTsKKworCWlmIChwcmVwYXJlKSB7CisJCS8qIEtlcm5lbCB3b3VsZCBiZSBwZXJmb3JtaW5nIEZMUiBhZnRlciB0aGlzIG5vdGlmaWNhdGlvbi4KKwkJICogQ2xlYW51cCBhbGwgc29mdHdhcmUgd2l0aG91dCBjbGVhbmluZyBhbnl0aGluZyByZWxhdGVkIHRvCisJCSAqIFBDSWUgYW5kIEhXLgorCQkgKi8KKwkJbXdpZmlleF9kb19mbHIoYWRhcHRlciwgcHJlcGFyZSk7CisJCWFkYXB0ZXItPnN1cnByaXNlX3JlbW92ZWQgPSB0cnVlOworCX0gZWxzZSB7CisJCS8qIEtlcm5lbCBzdG9yZXMgYW5kIHJlc3RvcmVzIFBDSWUgZnVuY3Rpb24gY29udGV4dCBiZWZvcmUgYW5kCisJCSAqIGFmdGVyIHBlcmZvcm1pbmcgRkxSIHJlc3BlY3RpdmVseS4gUmVjb25maWd1cmUgdGhlIHNvZnR3YXJlCisJCSAqIGFuZCBmaXJtd2FyZSBpbmNsdWRpbmcgZmlybXdhcmUgcmVkb3dubG9hZAorCQkgKi8KKwkJYWRhcHRlci0+c3VycHJpc2VfcmVtb3ZlZCA9IGZhbHNlOworCQltd2lmaWV4X2RvX2ZscihhZGFwdGVyLCBwcmVwYXJlKTsKKwl9CisJbXdpZmlleF9kYmcoYWRhcHRlciwgSU5GTywgIiVzLCBzdWNjZXNzZnVsXG4iLCBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2Vycm9yX2hhbmRsZXJzIG13aWZpZXhfcGNpZV9lcnJfaGFuZGxlcltdID0geworCQl7IC5yZXNldF9ub3RpZnkgPSBtd2lmaWV4X3BjaWVfcmVzZXRfbm90aWZ5LCB9LAorfTsKKwogI2lmZGVmIENPTkZJR19QTV9TTEVFUAogLyogUG93ZXIgTWFuYWdlbWVudCBIb29rcyAqLwogc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKG13aWZpZXhfcGNpZV9wbV9vcHMsIG13aWZpZXhfcGNpZV9zdXNwZW5kLApAQCAtMjk1LDYgKzM0MSw3IEBACiAJfSwKICNlbmRpZgogCS5zaHV0ZG93biA9IG13aWZpZXhfcGNpZV9zaHV0ZG93biwKKwkuZXJyX2hhbmRsZXIgPSBtd2lmaWV4X3BjaWVfZXJyX2hhbmRsZXIsCiB9OwogCiAvKgpAQCAtMTk1Niw4ICsyMDAzLDYgQEAKIAkJCWlmIChmaXJtd2FyZV9sZW4gLSBvZmZzZXQgPCB0eGxlbikKIAkJCQl0eGxlbiA9IGZpcm13YXJlX2xlbiAtIG9mZnNldDsKIAotCQkJbXdpZmlleF9kYmcoYWRhcHRlciwgSU5GTywgIi4iKTsKLQogCQkJdHhfYmxvY2tzID0gKHR4bGVuICsgY2FyZC0+cGNpZS5ibGtzel9md19kbCAtIDEpIC8KIAkJCQkgICAgY2FyZC0+cGNpZS5ibGtzel9md19kbDsKIApAQCAtMjA0Myw2ICsyMDg4LDEwIEBACiAJCQlyZXQgPSAtMTsKIAkJZWxzZQogCQkJcmV0ID0gMDsKKworCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBJTkZPLCAiVHJ5ICVkIGlmIEZXIGlzIHJlYWR5IDwlZCwlI3g+IiwKKwkJCSAgICB0cmllcywgcmV0LCBmaXJtd2FyZV9zdGF0KTsKKwogCQlpZiAocmV0KQogCQkJY29udGludWU7CiAJCWlmIChmaXJtd2FyZV9zdGF0ID09IEZJUk1XQVJFX1JFQURZX1BDSUUpIHsKQEAgLTIwNzQsOCArMjEyMyw3IEBACiAJCWFkYXB0ZXItPndpbm5lciA9IDE7CiAJfSBlbHNlIHsKIAkJbXdpZmlleF9kYmcoYWRhcHRlciwgRVJST1IsCi0JCQkgICAgIlBDSS1FIGlzIG5vdCB0aGUgd2lubmVyIDwlI3gsJWQ+LCBleGl0IGRubGRcbiIsCi0JCQkgICAgcmV0LCBhZGFwdGVyLT53aW5uZXIpOworCQkJICAgICJQQ0ktRSBpcyBub3QgdGhlIHdpbm5lciA8JSN4PiIsIHdpbm5lcik7CiAJfQogCiAJcmV0dXJuIHJldDsKQEAgLTI4NjMsNyArMjkxMSw3IEBACiBzdGF0aWMgdm9pZCBtd2lmaWV4X3BjaWVfZ2V0X2Z3X25hbWUoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlpbnQgcmV2aXNpb25faWQgPSAwOwotCWludCB2ZXJzaW9uOworCWludCB2ZXJzaW9uLCBtYWdpYzsKIAlzdHJ1Y3QgcGNpZV9zZXJ2aWNlX2NhcmQgKmNhcmQgPSBhZGFwdGVyLT5jYXJkOwogCiAJc3dpdGNoIChjYXJkLT5kZXYtPmRldmljZSkgewpAQCAtMjg4OCwzMCArMjkzNiwxOSBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgUENJRV9ERVZJQ0VfSURfTUFSVkVMTF84OFc4OTk3OgotCQltd2lmaWV4X3JlYWRfcmVnKGFkYXB0ZXIsIDB4MGM0OCwgJnJldmlzaW9uX2lkKTsKKwkJbXdpZmlleF9yZWFkX3JlZyhhZGFwdGVyLCAweDgsICZyZXZpc2lvbl9pZCk7CiAJCW13aWZpZXhfcmVhZF9yZWcoYWRhcHRlciwgMHgwY2QwLCAmdmVyc2lvbik7CisJCW13aWZpZXhfcmVhZF9yZWcoYWRhcHRlciwgMHgwY2Q0LCAmbWFnaWMpOworCQlyZXZpc2lvbl9pZCAmPSAweGZmOwogCQl2ZXJzaW9uICY9IDB4NzsKLQkJc3dpdGNoIChyZXZpc2lvbl9pZCkgewotCQljYXNlIFBDSUU4OTk3X1YyOgotCQkJaWYgKHZlcnNpb24gPT0gQ0hJUF9WRVJfUENJRVVBUlQpCi0JCQkJc3RyY3B5KGFkYXB0ZXItPmZ3X25hbWUsCi0JCQkJICAgICAgIFBDSUVVQVJUODk5N19GV19OQU1FX1YyKTsKLQkJCWVsc2UKLQkJCQlzdHJjcHkoYWRhcHRlci0+ZndfbmFtZSwKLQkJCQkgICAgICAgUENJRVVTQjg5OTdfRldfTkFNRV9WMik7Ci0JCQlicmVhazsKLQkJY2FzZSBQQ0lFODk5N19aOgotCQkJaWYgKHZlcnNpb24gPT0gQ0hJUF9WRVJfUENJRVVBUlQpCi0JCQkJc3RyY3B5KGFkYXB0ZXItPmZ3X25hbWUsCi0JCQkJICAgICAgIFBDSUVVQVJUODk5N19GV19OQU1FX1opOwotCQkJZWxzZQotCQkJCXN0cmNweShhZGFwdGVyLT5md19uYW1lLAotCQkJCSAgICAgICBQQ0lFVVNCODk5N19GV19OQU1FX1opOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzdHJjcHkoYWRhcHRlci0+ZndfbmFtZSwgUENJRTg5OTdfREVGQVVMVF9GV19OQU1FKTsKLQkJCWJyZWFrOwotCQl9CisJCW1hZ2ljICY9IDB4ZmY7CisJCWlmIChyZXZpc2lvbl9pZCA9PSBQQ0lFODk5N19BMSAmJgorCQkgICAgbWFnaWMgPT0gQ0hJUF9NQUdJQ19WQUxVRSAmJgorCQkgICAgdmVyc2lvbiA9PSBDSElQX1ZFUl9QQ0lFVUFSVCkKKwkJCXN0cmNweShhZGFwdGVyLT5md19uYW1lLCBQQ0lFVUFSVDg5OTdfRldfTkFNRV9WNCk7CisJCWVsc2UKKwkJCXN0cmNweShhZGFwdGVyLT5md19uYW1lLCBQQ0lFVVNCODk5N19GV19OQU1FX1Y0KTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQpAQCAtMjk1Miw3ICsyOTg5LDYgQEAKIHN0YXRpYyB2b2lkIG13aWZpZXhfdW5yZWdpc3Rlcl9kZXYoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlzdHJ1Y3QgcGNpZV9zZXJ2aWNlX2NhcmQgKmNhcmQgPSBhZGFwdGVyLT5jYXJkOwotCWNvbnN0IHN0cnVjdCBtd2lmaWV4X3BjaWVfY2FyZF9yZWcgKnJlZzsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKIAlpbnQgaTsKIApAQCAtMjk3Niw4ICszMDEyLDkwIEBACiAJCQlpZiAoY2FyZC0+bXNpX2VuYWJsZSkKIAkJCQlwY2lfZGlzYWJsZV9tc2kocGRldik7CiAJICAgICAgIH0KKwl9Cit9CiAKLQkJcmVnID0gY2FyZC0+cGNpZS5yZWc7CisvKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBQQ0ktRSBob3N0IG1lbW9yeSBzcGFjZSwgV0NCIHJpbmdzLCBldGMuCisgKgorICogVGhlIGZvbGxvd2luZyBpbml0aWFsaXphdGlvbnMgc3RlcHMgYXJlIGZvbGxvd2VkIC0KKyAqICAgICAgLSBBbGxvY2F0ZSBUWEJEIHJpbmcgYnVmZmVycworICogICAgICAtIEFsbG9jYXRlIFJYQkQgcmluZyBidWZmZXJzCisgKiAgICAgIC0gQWxsb2NhdGUgZXZlbnQgQkQgcmluZyBidWZmZXJzCisgKiAgICAgIC0gQWxsb2NhdGUgY29tbWFuZCByZXNwb25zZSByaW5nIGJ1ZmZlcgorICogICAgICAtIEFsbG9jYXRlIHNsZWVwIGNvb2tpZSBidWZmZXIKKyAqIFBhcnQgb2YgbXdpZmlleF9wY2llX2luaXQoKSwgbm90IHJlc2V0IHRoZSBQQ0lFIHJlZ2lzdGVycworICovCitzdGF0aWMgdm9pZCBtd2lmaWV4X3BjaWVfdXBfZGV2KHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IHBjaWVfc2VydmljZV9jYXJkICpjYXJkID0gYWRhcHRlci0+Y2FyZDsKKwlpbnQgcmV0OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gY2FyZC0+ZGV2OworCWNvbnN0IHN0cnVjdCBtd2lmaWV4X3BjaWVfY2FyZF9yZWcgKnJlZyA9IGNhcmQtPnBjaWUucmVnOworCisJY2FyZC0+Y21kcnNwX2J1ZiA9IE5VTEw7CisJcmV0ID0gbXdpZmlleF9wY2llX2NyZWF0ZV90eGJkX3JpbmcoYWRhcHRlcik7CisJaWYgKHJldCkgeworCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgdHhiZCByaW5nXG4iKTsKKwkJZ290byBlcnJfY3JlX3R4YmQ7CisJfQorCisJcmV0ID0gbXdpZmlleF9wY2llX2NyZWF0ZV9yeGJkX3JpbmcoYWRhcHRlcik7CisJaWYgKHJldCkgeworCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgcnhiZCByaW5nXG4iKTsKKwkJZ290byBlcnJfY3JlX3J4YmQ7CisJfQorCisJcmV0ID0gbXdpZmlleF9wY2llX2NyZWF0ZV9ldnRiZF9yaW5nKGFkYXB0ZXIpOworCWlmIChyZXQpIHsKKwkJbXdpZmlleF9kYmcoYWRhcHRlciwgRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIGV2dGJkIHJpbmdcbiIpOworCQlnb3RvIGVycl9jcmVfZXZ0YmQ7CisJfQorCisJcmV0ID0gbXdpZmlleF9wY2llX2FsbG9jX2NtZHJzcF9idWYoYWRhcHRlcik7CisJaWYgKHJldCkgeworCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBjbWRidWYgYnVmZmVyXG4iKTsKKwkJZ290byBlcnJfYWxsb2NfY21kYnVmOworCX0KKworCWlmIChyZWctPnNsZWVwX2Nvb2tpZSkgeworCQlyZXQgPSBtd2lmaWV4X3BjaWVfYWxsb2Nfc2xlZXBfY29va2llX2J1ZihhZGFwdGVyKTsKKwkJaWYgKHJldCkgeworCQkJbXdpZmlleF9kYmcoYWRhcHRlciwgRVJST1IsICJGYWlsZWQgdG8gYWxsb2NhdGUgc2xlZXBfY29va2llIGJ1ZmZlclxuIik7CisJCQlnb3RvIGVycl9hbGxvY19jb29raWU7CisJCX0KKwl9IGVsc2UgeworCQljYXJkLT5zbGVlcF9jb29raWVfdmJhc2UgPSBOVUxMOworCX0KKwlyZXR1cm47CisKK2Vycl9hbGxvY19jb29raWU6CisJbXdpZmlleF9wY2llX2RlbGV0ZV9jbWRyc3BfYnVmKGFkYXB0ZXIpOworZXJyX2FsbG9jX2NtZGJ1ZjoKKwltd2lmaWV4X3BjaWVfZGVsZXRlX2V2dGJkX3JpbmcoYWRhcHRlcik7CitlcnJfY3JlX2V2dGJkOgorCW13aWZpZXhfcGNpZV9kZWxldGVfcnhiZF9yaW5nKGFkYXB0ZXIpOworZXJyX2NyZV9yeGJkOgorCW13aWZpZXhfcGNpZV9kZWxldGVfdHhiZF9yaW5nKGFkYXB0ZXIpOworZXJyX2NyZV90eGJkOgorCXBjaV9pb3VubWFwKHBkZXYsIGNhcmQtPnBjaV9tbWFwMSk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gY2xlYW5zIHVwIHRoZSBQQ0ktRSBob3N0IG1lbW9yeSBzcGFjZS4KKyAqIFNvbWUgY29kZSBpcyBleHRyYWN0ZWQgZnJvbSBtd2lmaWV4X3VucmVnaXN0ZXJfZGV2KCkKKyAqCisgKi8KK3N0YXRpYyB2b2lkIG13aWZpZXhfcGNpZV9kb3duX2RldihzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBwY2llX3NlcnZpY2VfY2FyZCAqY2FyZCA9IGFkYXB0ZXItPmNhcmQ7CisJY29uc3Qgc3RydWN0IG13aWZpZXhfcGNpZV9jYXJkX3JlZyAqcmVnID0gY2FyZC0+cGNpZS5yZWc7CisKKwlpZiAobXdpZmlleF93cml0ZV9yZWcoYWRhcHRlciwgcmVnLT5kcnZfcmR5LCAweDAwMDAwMDAwKSkKKwkJbXdpZmlleF9kYmcoYWRhcHRlciwgRVJST1IsICJGYWlsZWQgdG8gd3JpdGUgZHJpdmVyIG5vdC1yZWFkeSBzaWduYXR1cmVcbiIpOworCisJYWRhcHRlci0+c2VxX251bSA9IDA7CisJYWRhcHRlci0+dHhfYnVmX3NpemUgPSBNV0lGSUVYX1RYX0RBVEFfQlVGX1NJWkVfNEs7CisKKwlpZiAoY2FyZCkgewogCQlpZiAocmVnLT5zbGVlcF9jb29raWUpCiAJCQltd2lmaWV4X3BjaWVfZGVsZXRlX3NsZWVwX2Nvb2tpZV9idWYoYWRhcHRlcik7CiAKQEAgLTI5ODcsNiArMzEwNSw4IEBACiAJCW13aWZpZXhfcGNpZV9kZWxldGVfdHhiZF9yaW5nKGFkYXB0ZXIpOwogCQljYXJkLT5jbWRyc3BfYnVmID0gTlVMTDsKIAl9CisKKwlyZXR1cm47CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbXdpZmlleF9pZl9vcHMgcGNpZV9vcHMgPSB7CkBAIC0zMDEzLDYgKzMxMzMsOCBAQAogCS5jbGVhbl9wY2llX3JpbmcgPQkJbXdpZmlleF9jbGVhbl9wY2llX3JpbmdfYnVmLAogCS5yZWdfZHVtcCA9CQkJbXdpZmlleF9wY2llX3JlZ19kdW1wLAogCS5kZXZpY2VfZHVtcCA9CQkJbXdpZmlleF9wY2llX2RldmljZV9kdW1wLAorCS5kb3duX2RldiA9CQkJbXdpZmlleF9wY2llX2Rvd25fZGV2LAorCS51cF9kZXYgPQkJCW13aWZpZXhfcGNpZV91cF9kZXYsCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3BjaWUuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9wY2llLmgKaW5kZXggZjA1MDYxYy4uNDZmOTljYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3BjaWUuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvcGNpZS5oCkBAIC0zMiwxMSArMzIsOSBAQAogI2RlZmluZSBQQ0lFODg5N19ERUZBVUxUX0ZXX05BTUUgIm1ydmwvcGNpZTg4OTdfdWFwc3RhLmJpbiIKICNkZWZpbmUgUENJRTg4OTdfQTBfRldfTkFNRSAibXJ2bC9wY2llODg5N191YXBzdGFfYTAuYmluIgogI2RlZmluZSBQQ0lFODg5N19CMF9GV19OQU1FICJtcnZsL3BjaWU4ODk3X3VhcHN0YS5iaW4iCi0jZGVmaW5lIFBDSUU4OTk3X0RFRkFVTFRfRldfTkFNRSAibXJ2bC9wY2lldXNiODk5N19jb21ib192Mi5iaW4iCi0jZGVmaW5lIFBDSUVVQVJUODk5N19GV19OQU1FX1ogIm1ydmwvcGNpZXVhcnQ4OTk3X2NvbWJvLmJpbiIKLSNkZWZpbmUgUENJRVVBUlQ4OTk3X0ZXX05BTUVfVjIgIm1ydmwvcGNpZXVhcnQ4OTk3X2NvbWJvX3YyLmJpbiIKLSNkZWZpbmUgUENJRVVTQjg5OTdfRldfTkFNRV9aICJtcnZsL3BjaWV1c2I4OTk3X2NvbWJvLmJpbiIKLSNkZWZpbmUgUENJRVVTQjg5OTdfRldfTkFNRV9WMiAibXJ2bC9wY2lldXNiODk5N19jb21ib192Mi5iaW4iCisjZGVmaW5lIFBDSUVVQVJUODk5N19GV19OQU1FX1Y0ICJtcnZsL3BjaWV1YXJ0ODk5N19jb21ib192NC5iaW4iCisjZGVmaW5lIFBDSUVVU0I4OTk3X0ZXX05BTUVfVjQgIm1ydmwvcGNpZXVzYjg5OTdfY29tYm9fdjQuYmluIgorI2RlZmluZSBQQ0lFODk5N19ERUZBVUxUX1dJRklGV19OQU1FICJtcnZsL3BjaWU4OTk3X3dsYW5fdjQuYmluIgogCiAjZGVmaW5lIFBDSUVfVkVORE9SX0lEX01BUlZFTEwgICAgICAgICAgICAgICgweDExYWIpCiAjZGVmaW5lIFBDSUVfVkVORE9SX0lEX1YyX01BUlZFTEwgICAgICAgICAgICgweDFiNGIpCkBAIC00Niw5ICs0NCwxMCBAQAogCiAjZGVmaW5lIFBDSUU4ODk3X0EwCTB4MTEwMAogI2RlZmluZSBQQ0lFODg5N19CMAkweDEyMDAKLSNkZWZpbmUgUENJRTg5OTdfWgkweDAKLSNkZWZpbmUgUENJRTg5OTdfVjIJMHg0NzEKKyNkZWZpbmUgUENJRTg5OTdfQTAJMHgxMAorI2RlZmluZSBQQ0lFODk5N19BMQkweDExCiAjZGVmaW5lIENISVBfVkVSX1BDSUVVQVJUCTB4MworI2RlZmluZSBDSElQX01BR0lDX1ZBTFVFCTB4MjQKIAogLyogQ29uc3RhbnRzIGZvciBCdWZmZXIgRGVzY3JpcHRvciAoQkQpIHJpbmdzICovCiAjZGVmaW5lIE1XSUZJRVhfTUFYX1RYUlhfQkQJCQkweDIwCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc2Nhbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3NjYW4uYwppbmRleCAyMWVjODQ3Li45N2M5NzY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc2Nhbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9zY2FuLmMKQEAgLTgyMCw2ICs4MjAsNyBAQAogCXN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOwogCXN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX251bV9wcm9iZXMgKm51bV9wcm9iZXNfdGx2OwogCXN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX3NjYW5fY2hhbl9nYXAgKmNoYW5fZ2FwX3RsdjsKKwlzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19yYW5kb21fbWFjICpyYW5kb21fbWFjX3RsdjsKIAlzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc193aWxkY2FyZF9zc2lkX3BhcmFtcyAqd2lsZGNhcmRfc3NpZF90bHY7CiAJc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfYnNzaWRfbGlzdCAqYnNzaWRfdGx2OwogCXU4ICp0bHZfcG9zOwpAQCAtODM1LDYgKzgzNiw3IEBACiAJdTggc3NpZF9maWx0ZXI7CiAJc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaHRjYXAgKmh0X2NhcDsKIAlzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19ic3NfbW9kZSAqYnNzX21vZGU7CisJY29uc3QgdTggemVyb19tYWNbNl0gPSB7MCwgMCwgMCwgMCwgMCwgMH07CiAKIAkvKiBUaGUgdGx2X2J1Zl9sZW4gaXMgY2FsY3VsYXRlZCBmb3IgZWFjaCBzY2FuIGNvbW1hbmQuICBUaGUgVExWcyBhZGRlZAogCSAgIGluIHRoaXMgcm91dGluZSB3aWxsIGJlIHByZXNlcnZlZCBzaW5jZSB0aGUgcm91dGluZSB0aGF0IHNlbmRzIHRoZQpAQCAtOTY3LDYgKzk2OSwxOCBAQAogCQkJdGx2X3BvcyArPQogCQkJCSAgc2l6ZW9mKHN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX3NjYW5fY2hhbl9nYXApOwogCQl9CisKKwkJaWYgKCFldGhlcl9hZGRyX2VxdWFsKHVzZXJfc2Nhbl9pbi0+cmFuZG9tX21hYywgemVyb19tYWMpKSB7CisJCQlyYW5kb21fbWFjX3RsdiA9ICh2b2lkICopdGx2X3BvczsKKwkJCXJhbmRvbV9tYWNfdGx2LT5oZWFkZXIudHlwZSA9CisJCQkJCSBjcHVfdG9fbGUxNihUTFZfVFlQRV9SQU5ET01fTUFDKTsKKwkJCXJhbmRvbV9tYWNfdGx2LT5oZWFkZXIubGVuID0KKwkJCQkgICAgY3B1X3RvX2xlMTYoc2l6ZW9mKHJhbmRvbV9tYWNfdGx2LT5tYWMpKTsKKwkJCWV0aGVyX2FkZHJfY29weShyYW5kb21fbWFjX3Rsdi0+bWFjLAorCQkJCQl1c2VyX3NjYW5faW4tPnJhbmRvbV9tYWMpOworCQkJdGx2X3BvcyArPQorCQkJCSAgc2l6ZW9mKHN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX3JhbmRvbV9tYWMpOworCQl9CiAJfSBlbHNlIHsKIAkJc2Nhbl9jZmdfb3V0LT5ic3NfbW9kZSA9ICh1OCkgYWRhcHRlci0+c2Nhbl9tb2RlOwogCQludW1fcHJvYmVzID0gYWRhcHRlci0+c2Nhbl9wcm9iZXM7CkBAIC0xOTIyLDYgKzE5MzYsNyBAQAogCX0KIAogCWFkYXB0ZXItPmFjdGl2ZV9zY2FuX3RyaWdnZXJlZCA9IHRydWU7CisJZXRoZXJfYWRkcl9jb3B5KHVzZXJfc2Nhbl9jZmctPnJhbmRvbV9tYWMsIHByaXYtPnJhbmRvbV9tYWMpOwogCXVzZXJfc2Nhbl9jZmctPm51bV9zc2lkcyA9IHByaXYtPnNjYW5fcmVxdWVzdC0+bl9zc2lkczsKIAl1c2VyX3NjYW5fY2ZnLT5zc2lkX2xpc3QgPSBwcml2LT5zY2FuX3JlcXVlc3QtPnNzaWRzOwogCkBAIC0yMTc5LDE4ICsyMTk0LDE0IEBACiAKIAkJaWYgKGNoYW5fYmFuZF90bHYgJiYgYWRhcHRlci0+bmRfaW5mbykgewogCQkJYWRhcHRlci0+bmRfaW5mby0+bWF0Y2hlc1tpZHhdID0KLQkJCQlremFsbG9jKHNpemVvZigqcG1hdGNoKSArCi0JCQkJc2l6ZW9mKHUzMiksIEdGUF9BVE9NSUMpOworCQkJCWt6YWxsb2Moc2l6ZW9mKCpwbWF0Y2gpICsgc2l6ZW9mKHUzMiksCisJCQkJCUdGUF9BVE9NSUMpOwogCiAJCQlwbWF0Y2ggPSBhZGFwdGVyLT5uZF9pbmZvLT5tYXRjaGVzW2lkeF07CiAKIAkJCWlmIChwbWF0Y2gpIHsKLQkJCQltZW1zZXQocG1hdGNoLCAwLCBzaXplb2YoKnBtYXRjaCkpOwotCQkJCWlmIChjaGFuX2JhbmRfdGx2KSB7Ci0JCQkJCXBtYXRjaC0+bl9jaGFubmVscyA9IDE7Ci0JCQkJCXBtYXRjaC0+Y2hhbm5lbHNbMF0gPQotCQkJCQkJY2hhbl9iYW5kLT5jaGFuX251bWJlcjsKLQkJCQl9CisJCQkJcG1hdGNoLT5uX2NoYW5uZWxzID0gMTsKKwkJCQlwbWF0Y2gtPmNoYW5uZWxzWzBdID0gY2hhbl9iYW5kLT5jaGFuX251bWJlcjsKIAkJCX0KIAkJfQogCkBAIC0yNzYxLDYgKzI3NzIsNyBAQAogCWlmICghc2Nhbl9jZmcpCiAJCXJldHVybiAtRU5PTUVNOwogCisJZXRoZXJfYWRkcl9jb3B5KHNjYW5fY2ZnLT5yYW5kb21fbWFjLCBwcml2LT5yYW5kb21fbWFjKTsKIAlzY2FuX2NmZy0+c3NpZF9saXN0ID0gcmVxX3NzaWQ7CiAJc2Nhbl9jZmctPm51bV9zc2lkcyA9IDE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9zZGlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc2Rpby5jCmluZGV4IGQzZTE1NjEuLjg3MTg5NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9zZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3NkaW8uYwpAQCAtMTIyLDkgKzEyMiwxMSBAQAogCQkJCQkgICAgICAgSVJRRl9UUklHR0VSX0xPVywKIAkJCQkJICAgICAgICJ3aWZpX3dha2UiLCBjZmcpOwogCQkJaWYgKHJldCkgewotCQkJCWRldl9lcnIoZGV2LAorCQkJCWRldl9kYmcoZGV2LAogCQkJCQkiRmFpbGVkIHRvIHJlcXVlc3QgaXJxX3dpZmkgJWQgKCVkKVxuIiwKIAkJCQkJY2ZnLT5pcnFfd2lmaSwgcmV0KTsKKwkJCQljYXJkLT5wbHRfd2FrZV9jZmcgPSBOVUxMOworCQkJCXJldHVybiAwOwogCQkJfQogCQkJZGlzYWJsZV9pcnEoY2ZnLT5pcnFfd2lmaSk7CiAJCX0KQEAgLTI4OSw3ICsyOTEsNyBAQAogCiAJbXdpZmlleF9kYmcoYWRhcHRlciwgSU5GTywgImluZm86IFNESU8gZnVuYyBudW09JWRcbiIsIGZ1bmMtPm51bSk7CiAKLQlpZiAodXNlcl9ybW1vZCkgeworCWlmICh1c2VyX3JtbW9kICYmICFhZGFwdGVyLT5tZmdfbW9kZSkgewogCQlpZiAoYWRhcHRlci0+aXNfc3VzcGVuZGVkKQogCQkJbXdpZmlleF9zZGlvX3Jlc3VtZShhZGFwdGVyLT5kZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc3RhX2NtZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3N0YV9jbWQuYwppbmRleCA3ODk3MDM3Li4yYTE2MmMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc3RhX2NtZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9zdGFfY21kLmMKQEAgLTU5OCw2ICs1OTgsMTEgQEAKIAkJbWVtY3B5KGttLT5rZXlfcGFyYW1fc2V0LmtleV9wYXJhbXMuY21hY19hZXMua2V5LAogCQkgICAgICAgZW5jX2tleS0+a2V5X21hdGVyaWFsLCBlbmNfa2V5LT5rZXlfbGVuKTsKIAkJbGVuICs9IHNpemVvZihzdHJ1Y3QgbXdpZmlleF9jbWFjX2Flc19wYXJhbSk7CisJfSBlbHNlIGlmIChlbmNfa2V5LT5pc19pZ3RrX2RlZl9rZXkpIHsKKwkJbXdpZmlleF9kYmcoYWRhcHRlciwgSU5GTywKKwkJCSAgICAiJXM6IFNldCBDTUFDIGRlZmF1bHQgS2V5IGluZGV4XG4iLCBfX2Z1bmNfXyk7CisJCWttLT5rZXlfcGFyYW1fc2V0LmtleV90eXBlID0gS0VZX1RZUEVfSURfQUVTX0NNQUNfREVGOworCQlrbS0+a2V5X3BhcmFtX3NldC5rZXlfaWR4ID0gZW5jX2tleS0+a2V5X2luZGV4ICYgS0VZX0lOREVYX01BU0s7CiAJfSBlbHNlIHsKIAkJbXdpZmlleF9kYmcoYWRhcHRlciwgSU5GTywKIAkJCSAgICAiJXM6IFNldCBBRVMgS2V5XG4iLCBfX2Z1bmNfXyk7CkBAIC03MDYsMTUgKzcxMSwxMCBAQAogCQkJCSAgICAocHJpdi0+d2VwX2tleV9jdXJyX2luZGV4ICYgS0VZX0lOREVYX01BU0spKQogCQkJCQlrZXlfaW5mbyB8PSBLRVlfREVGQVVMVDsKIAkJCX0gZWxzZSB7Ci0JCQkJaWYgKG1hYykgewotCQkJCQlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIobWFjKSkKLQkJCQkJCWtleV9pbmZvIHw9IEtFWV9NQ0FTVDsKLQkJCQkJZWxzZQotCQkJCQkJa2V5X2luZm8gfD0gS0VZX1VOSUNBU1QgfAotCQkJCQkJCSAgICBLRVlfREVGQVVMVDsKLQkJCQl9IGVsc2UgeworCQkJCWlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihtYWMpKQogCQkJCQlrZXlfaW5mbyB8PSBLRVlfTUNBU1Q7Ci0JCQkJfQorCQkJCWVsc2UKKwkJCQkJa2V5X2luZm8gfD0gS0VZX1VOSUNBU1QgfCBLRVlfREVGQVVMVDsKIAkJCX0KIAkJfQogCQlrbS0+a2V5X3BhcmFtX3NldC5rZXlfaW5mbyA9IGNwdV90b19sZTE2KGtleV9pbmZvKTsKQEAgLTEyNDQsMjAgKzEyNDQsMjMgQEAKIAkJcmV0dXJuIDA7CiAKIAkvKiBTZW5kIHRoZSByaW5nIGJhc2UgYWRkcmVzc2VzIGFuZCBjb3VudCB0byBmaXJtd2FyZSAqLwotCWhvc3Rfc3BlYy0+dHhiZF9hZGRyX2xvID0gKHUzMikoY2FyZC0+dHhiZF9yaW5nX3BiYXNlKTsKLQlob3N0X3NwZWMtPnR4YmRfYWRkcl9oaSA9ICh1MzIpKCgodTY0KWNhcmQtPnR4YmRfcmluZ19wYmFzZSk+PjMyKTsKLQlob3N0X3NwZWMtPnR4YmRfY291bnQgPSBNV0lGSUVYX01BWF9UWFJYX0JEOwotCWhvc3Rfc3BlYy0+cnhiZF9hZGRyX2xvID0gKHUzMikoY2FyZC0+cnhiZF9yaW5nX3BiYXNlKTsKLQlob3N0X3NwZWMtPnJ4YmRfYWRkcl9oaSA9ICh1MzIpKCgodTY0KWNhcmQtPnJ4YmRfcmluZ19wYmFzZSk+PjMyKTsKLQlob3N0X3NwZWMtPnJ4YmRfY291bnQgPSBNV0lGSUVYX01BWF9UWFJYX0JEOwotCWhvc3Rfc3BlYy0+ZXZ0YmRfYWRkcl9sbyA9ICh1MzIpKGNhcmQtPmV2dGJkX3JpbmdfcGJhc2UpOwotCWhvc3Rfc3BlYy0+ZXZ0YmRfYWRkcl9oaSA9ICh1MzIpKCgodTY0KWNhcmQtPmV2dGJkX3JpbmdfcGJhc2UpPj4zMik7Ci0JaG9zdF9zcGVjLT5ldnRiZF9jb3VudCA9IE1XSUZJRVhfTUFYX0VWVF9CRDsKKwlob3N0X3NwZWMtPnR4YmRfYWRkcl9sbyA9IGNwdV90b19sZTMyKCh1MzIpKGNhcmQtPnR4YmRfcmluZ19wYmFzZSkpOworCWhvc3Rfc3BlYy0+dHhiZF9hZGRyX2hpID0KKwkJCWNwdV90b19sZTMyKCh1MzIpKCgodTY0KWNhcmQtPnR4YmRfcmluZ19wYmFzZSkgPj4gMzIpKTsKKwlob3N0X3NwZWMtPnR4YmRfY291bnQgPSBjcHVfdG9fbGUzMihNV0lGSUVYX01BWF9UWFJYX0JEKTsKKwlob3N0X3NwZWMtPnJ4YmRfYWRkcl9sbyA9IGNwdV90b19sZTMyKCh1MzIpKGNhcmQtPnJ4YmRfcmluZ19wYmFzZSkpOworCWhvc3Rfc3BlYy0+cnhiZF9hZGRyX2hpID0KKwkJCWNwdV90b19sZTMyKCh1MzIpKCgodTY0KWNhcmQtPnJ4YmRfcmluZ19wYmFzZSkgPj4gMzIpKTsKKwlob3N0X3NwZWMtPnJ4YmRfY291bnQgPSBjcHVfdG9fbGUzMihNV0lGSUVYX01BWF9UWFJYX0JEKTsKKwlob3N0X3NwZWMtPmV2dGJkX2FkZHJfbG8gPSBjcHVfdG9fbGUzMigodTMyKShjYXJkLT5ldnRiZF9yaW5nX3BiYXNlKSk7CisJaG9zdF9zcGVjLT5ldnRiZF9hZGRyX2hpID0KKwkJCWNwdV90b19sZTMyKCh1MzIpKCgodTY0KWNhcmQtPmV2dGJkX3JpbmdfcGJhc2UpID4+IDMyKSk7CisJaG9zdF9zcGVjLT5ldnRiZF9jb3VudCA9IGNwdV90b19sZTMyKE1XSUZJRVhfTUFYX0VWVF9CRCk7CiAJaWYgKGNhcmQtPnNsZWVwX2Nvb2tpZV92YmFzZSkgewogCQlob3N0X3NwZWMtPnNsZWVwX2Nvb2tpZV9hZGRyX2xvID0KLQkJCQkJCSh1MzIpKGNhcmQtPnNsZWVwX2Nvb2tpZV9wYmFzZSk7Ci0JCWhvc3Rfc3BlYy0+c2xlZXBfY29va2llX2FkZHJfaGkgPQotCQkJCSAodTMyKSgoKHU2NCkoY2FyZC0+c2xlZXBfY29va2llX3BiYXNlKSkgPj4gMzIpOworCQkJCWNwdV90b19sZTMyKCh1MzIpKGNhcmQtPnNsZWVwX2Nvb2tpZV9wYmFzZSkpOworCQlob3N0X3NwZWMtPnNsZWVwX2Nvb2tpZV9hZGRyX2hpID0gY3B1X3RvX2xlMzIoKHUzMikoKCh1NjQpCisJCQkJCShjYXJkLT5zbGVlcF9jb29raWVfcGJhc2UpKSA+PiAzMikpOwogCQltd2lmaWV4X2RiZyhwcml2LT5hZGFwdGVyLCBJTkZPLAogCQkJICAgICJzbGVlcF9jb29rX2xvIHBoeSBhZGRyOiAweCV4XG4iLAogCQkJICAgIGhvc3Rfc3BlYy0+c2xlZXBfY29va2llX2FkZHJfbG8pOwpAQCAtMTQ4Miw3ICsxNDg1LDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCS8qIHByb3BlcnR5IGhlYWRlciBpcyA2IGJ5dGVzLCBkYXRhIG11c3QgZml0IGluIGNtZCBidWZmZXIgKi8KLQkJaWYgKHByb3AgJiYgcHJvcC0+dmFsdWUgJiYgcHJvcC0+bGVuZ3RoID4gNiAmJgorCQlpZiAocHJvcC0+dmFsdWUgJiYgcHJvcC0+bGVuZ3RoID4gNiAmJgogCQkgICAgcHJvcC0+bGVuZ3RoIDw9IE1XSUZJRVhfU0laRV9PRl9DTURfQlVGRkVSIC0gU19EU19HRU4pIHsKIAkJCXJldCA9IG13aWZpZXhfc2VuZF9jbWQocHJpdiwgSG9zdENtZF9DTURfQ0ZHX0RBVEEsCiAJCQkJCSAgICAgICBIb3N0Q21kX0FDVF9HRU5fU0VULCAwLApAQCAtMTU5Niw2ICsxNTk5LDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgbXdpZmlleF9jbWRfY2hhbl9yZWdpb25fY2ZnKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCisJCQkJICAgICAgIHN0cnVjdCBob3N0X2NtZF9kc19jb21tYW5kICpjbWQsCisJCQkJICAgICAgIHUxNiBjbWRfYWN0aW9uKQoreworCXN0cnVjdCBob3N0X2NtZF9kc19jaGFuX3JlZ2lvbl9jZmcgKnJlZyA9ICZjbWQtPnBhcmFtcy5yZWdfY2ZnOworCisJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoSG9zdENtZF9DTURfQ0hBTl9SRUdJT05fQ0ZHKTsKKwljbWQtPnNpemUgPSBjcHVfdG9fbGUxNihzaXplb2YoKnJlZykgKyBTX0RTX0dFTik7CisKKwlpZiAoY21kX2FjdGlvbiA9PSBIb3N0Q21kX0FDVF9HRU5fR0VUKQorCQlyZWctPmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3Rpb24pOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQKIG13aWZpZXhfY21kX2NvYWxlc2NlX2NmZyhzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAogCQkJIHN0cnVjdCBob3N0X2NtZF9kc19jb21tYW5kICpjbWQsCkBAIC0yMTM2LDYgKzIxNTQsOSBAQAogCQlyZXQgPSBtd2lmaWV4X2NtZF9ndGtfcmVrZXlfb2ZmbG9hZChwcml2LCBjbWRfcHRyLCBjbWRfYWN0aW9uLAogCQkJCQkJICAgIGRhdGFfYnVmKTsKIAkJYnJlYWs7CisJY2FzZSBIb3N0Q21kX0NNRF9DSEFOX1JFR0lPTl9DRkc6CisJCXJldCA9IG13aWZpZXhfY21kX2NoYW5fcmVnaW9uX2NmZyhwcml2LCBjbWRfcHRyLCBjbWRfYWN0aW9uKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJbXdpZmlleF9kYmcocHJpdi0+YWRhcHRlciwgRVJST1IsCiAJCQkgICAgIlBSRVBfQ01EOiB1bmtub3duIGNtZC0gJSN4XG4iLCBjbWRfbm8pOwpAQCAtMjI3Myw2ICsyMjk0LDkgQEAKIAkJCWlmIChyZXQpCiAJCQkJcmV0dXJuIC0xOwogCQl9CisKKwkJbXdpZmlleF9zZW5kX2NtZChwcml2LCBIb3N0Q21kX0NNRF9DSEFOX1JFR0lPTl9DRkcsCisJCQkJIEhvc3RDbWRfQUNUX0dFTl9HRVQsIDAsIE5VTEwsIHRydWUpOwogCX0KIAogCS8qIGdldCB0eCByYXRlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc3RhX2NtZHJlc3AuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9zdGFfY21kcmVzcC5jCmluZGV4IGNjZjU0OTMyLi44NTQ4MDI3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3N0YV9jbWRyZXNwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3N0YV9jbWRyZXNwLmMKQEAgLTk2Miw3ICs5NjIsNyBAQAogCWludCBpOwogCXN0cnVjdCBtd2lmaWV4X3N0YV9ub2RlICpzdGFfbm9kZTsKIAotCWZvciAoaSA9IDA7IGkgPCBzdGFfbGlzdC0+c3RhX2NvdW50OyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgKGxlMTZfdG9fY3B1KHN0YV9saXN0LT5zdGFfY291bnQpKTsgaSsrKSB7CiAJCXN0YV9ub2RlID0gbXdpZmlleF9nZXRfc3RhX2VudHJ5KHByaXYsIHN0YV9pbmZvLT5tYWMpOwogCQlpZiAodW5saWtlbHkoIXN0YV9ub2RlKSkKIAkJCWNvbnRpbnVlOwpAQCAtMTAyMiw2ICsxMDIyLDEzOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKgorbXdpZmlleF9jcmVhdGVfY3VzdG9tX3JlZ2RvbWFpbihzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAorCQkJCXU4ICpidWYsIHUxNiBidWZfbGVuKQoreworCXUxNiBudW1fY2hhbiA9IGJ1Zl9sZW4gLyAyOworCXN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluICpyZWdkOworCXN0cnVjdCBpZWVlODAyMTFfcmVnX3J1bGUgKnJ1bGU7CisJYm9vbCBuZXdfcnVsZTsKKwlpbnQgcmVnZF9zaXplLCBpZHgsIGZyZXEsIHByZXZfZnJlcSA9IDA7CisJdTMyIGJ3LCBwcmV2X2J3ID0gMDsKKwl1OCBjaGZsYWdzLCBwcmV2X2NoZmxhZ3MgPSAwLCB2YWxpZF9ydWxlcyA9IDA7CisKKwlpZiAoV0FSTl9PTl9PTkNFKG51bV9jaGFuID4gTkw4MDIxMV9NQVhfU1VQUF9SRUdfUlVMRVMpKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCXJlZ2Rfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbikgKworCQkgICAgbnVtX2NoYW4gKiBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9yZWdfcnVsZSk7CisKKwlyZWdkID0ga3phbGxvYyhyZWdkX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghcmVnZCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IG51bV9jaGFuOyBpZHgrKykgeworCQl1OCBjaGFuOworCQllbnVtIG5sODAyMTFfYmFuZCBiYW5kOworCisJCWNoYW4gPSAqYnVmKys7CisJCWlmICghY2hhbikgeworCQkJa2ZyZWUocmVnZCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQljaGZsYWdzID0gKmJ1ZisrOworCQliYW5kID0gKGNoYW4gPD0gMTQpID8gTkw4MDIxMV9CQU5EXzJHSFogOiBOTDgwMjExX0JBTkRfNUdIWjsKKwkJZnJlcSA9IGllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeShjaGFuLCBiYW5kKTsKKwkJbmV3X3J1bGUgPSBmYWxzZTsKKworCQlpZiAoY2hmbGFncyAmIE1XSUZJRVhfQ0hBTk5FTF9ESVNBQkxFRCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChiYW5kID09IE5MODAyMTFfQkFORF81R0haKSB7CisJCQlpZiAoIShjaGZsYWdzICYgTVdJRklFWF9DSEFOTkVMX05PSFQ4MCkpCisJCQkJYncgPSBNSFpfVE9fS0haKDgwKTsKKwkJCWVsc2UgaWYgKCEoY2hmbGFncyAmIE1XSUZJRVhfQ0hBTk5FTF9OT0hUNDApKQorCQkJCWJ3ID0gTUhaX1RPX0tIWig0MCk7CisJCQllbHNlCisJCQkJYncgPSBNSFpfVE9fS0haKDIwKTsKKwkJfSBlbHNlIHsKKwkJCWlmICghKGNoZmxhZ3MgJiBNV0lGSUVYX0NIQU5ORUxfTk9IVDQwKSkKKwkJCQlidyA9IE1IWl9UT19LSFooNDApOworCQkJZWxzZQorCQkJCWJ3ID0gTUhaX1RPX0tIWigyMCk7CisJCX0KKworCQlpZiAoaWR4ID09IDAgfHwgcHJldl9jaGZsYWdzICE9IGNoZmxhZ3MgfHwgcHJldl9idyAhPSBidyB8fAorCQkgICAgZnJlcSAtIHByZXZfZnJlcSA+IDIwKSB7CisJCQl2YWxpZF9ydWxlcysrOworCQkJbmV3X3J1bGUgPSB0cnVlOworCQl9CisKKwkJcnVsZSA9ICZyZWdkLT5yZWdfcnVsZXNbdmFsaWRfcnVsZXMgLSAxXTsKKworCQlydWxlLT5mcmVxX3JhbmdlLmVuZF9mcmVxX2toeiA9IE1IWl9UT19LSFooZnJlcSArIDEwKTsKKworCQlwcmV2X2NoZmxhZ3MgPSBjaGZsYWdzOworCQlwcmV2X2ZyZXEgPSBmcmVxOworCQlwcmV2X2J3ID0gYnc7CisKKwkJaWYgKCFuZXdfcnVsZSkKKwkJCWNvbnRpbnVlOworCisJCXJ1bGUtPmZyZXFfcmFuZ2Uuc3RhcnRfZnJlcV9raHogPSBNSFpfVE9fS0haKGZyZXEgLSAxMCk7CisJCXJ1bGUtPnBvd2VyX3J1bGUubWF4X2VpcnAgPSBEQk1fVE9fTUJNKDE5KTsKKworCQlpZiAoY2hmbGFncyAmIE1XSUZJRVhfQ0hBTk5FTF9QQVNTSVZFKQorCQkJcnVsZS0+ZmxhZ3MgPSBOTDgwMjExX1JSRl9OT19JUjsKKworCQlpZiAoY2hmbGFncyAmIE1XSUZJRVhfQ0hBTk5FTF9ERlMpCisJCQlydWxlLT5mbGFncyA9IE5MODAyMTFfUlJGX0RGUzsKKworCQlydWxlLT5mcmVxX3JhbmdlLm1heF9iYW5kd2lkdGhfa2h6ID0gYnc7CisJfQorCisJcmVnZC0+bl9yZWdfcnVsZXMgPSB2YWxpZF9ydWxlczsKKwlyZWdkLT5hbHBoYTJbMF0gPSAnOSc7CisJcmVnZC0+YWxwaGEyWzFdID0gJzknOworCisJcmV0dXJuIHJlZ2Q7Cit9CisKK3N0YXRpYyBpbnQgbXdpZmlleF9yZXRfY2hhbl9yZWdpb25fY2ZnKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCisJCQkJICAgICAgIHN0cnVjdCBob3N0X2NtZF9kc19jb21tYW5kICpyZXNwKQoreworCXN0cnVjdCBob3N0X2NtZF9kc19jaGFuX3JlZ2lvbl9jZmcgKnJlZyA9ICZyZXNwLT5wYXJhbXMucmVnX2NmZzsKKwl1MTYgYWN0aW9uID0gbGUxNl90b19jcHUocmVnLT5hY3Rpb24pOworCXUxNiB0bHYsIHRsdl9idWZfbGVuLCB0bHZfYnVmX2xlZnQ7CisJc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaGVhZGVyICpoZWFkOworCXN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluICpyZWdkOworCXU4ICp0bHZfYnVmOworCisJaWYgKGFjdGlvbiAhPSBIb3N0Q21kX0FDVF9HRU5fR0VUKQorCQlyZXR1cm4gMDsKKworCXRsdl9idWYgPSAodTggKilyZWcgKyBzaXplb2YoKnJlZyk7CisJdGx2X2J1Zl9sZWZ0ID0gbGUxNl90b19jcHUocmVzcC0+c2l6ZSkgLSBTX0RTX0dFTiAtIHNpemVvZigqcmVnKTsKKworCXdoaWxlICh0bHZfYnVmX2xlZnQgPj0gc2l6ZW9mKCpoZWFkKSkgeworCQloZWFkID0gKHN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2hlYWRlciAqKXRsdl9idWY7CisJCXRsdiA9IGxlMTZfdG9fY3B1KGhlYWQtPnR5cGUpOworCQl0bHZfYnVmX2xlbiA9IGxlMTZfdG9fY3B1KGhlYWQtPmxlbik7CisKKwkJaWYgKHRsdl9idWZfbGVmdCA8IChzaXplb2YoKmhlYWQpICsgdGx2X2J1Zl9sZW4pKQorCQkJYnJlYWs7CisKKwkJc3dpdGNoICh0bHYpIHsKKwkJY2FzZSBUTFZfVFlQRV9DSEFOX0FUVFJfQ0ZHOgorCQkJbXdpZmlleF9kYmdfZHVtcChwcml2LT5hZGFwdGVyLCBDTURfRCwgIkNIQU46IiwKKwkJCQkJICh1OCAqKWhlYWQgKyBzaXplb2YoKmhlYWQpLAorCQkJCQkgdGx2X2J1Zl9sZW4pOworCQkJcmVnZCA9IG13aWZpZXhfY3JlYXRlX2N1c3RvbV9yZWdkb21haW4ocHJpdiwKKwkJCQkodTggKiloZWFkICsgc2l6ZW9mKCpoZWFkKSwgdGx2X2J1Zl9sZW4pOworCQkJaWYgKCFJU19FUlIocmVnZCkpCisJCQkJcHJpdi0+YWRhcHRlci0+cmVnZCA9IHJlZ2Q7CisJCQlicmVhazsKKwkJfQorCisJCXRsdl9idWYgKz0gKHNpemVvZigqaGVhZCkgKyB0bHZfYnVmX2xlbik7CisJCXRsdl9idWZfbGVmdCAtPSAoc2l6ZW9mKCpoZWFkKSArIHRsdl9idWZfbGVuKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgY29tbWFuZCByZXNwb25zZXMuCiAgKgpAQCAtMTIzOSw2ICsxMzcxLDkgQEAKIAkJYnJlYWs7CiAJY2FzZSBIb3N0Q21kX0NNRF9HVEtfUkVLRVlfT0ZGTE9BRF9DRkc6CiAJCWJyZWFrOworCWNhc2UgSG9zdENtZF9DTURfQ0hBTl9SRUdJT05fQ0ZHOgorCQlyZXQgPSBtd2lmaWV4X3JldF9jaGFuX3JlZ2lvbl9jZmcocHJpdiwgcmVzcCk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVSUk9SLAogCQkJICAgICJDTURfUkVTUDogdW5rbm93biBjbWQgcmVzcG9uc2UgJSN4XG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3N0YV9ldmVudC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3N0YV9ldmVudC5jCmluZGV4IGE0MjJmMzMuLjlkZjBjNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9zdGFfZXZlbnQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc3RhX2V2ZW50LmMKQEAgLTI1LDYgKzI1LDk5IEBACiAjaW5jbHVkZSAid21tLmgiCiAjaW5jbHVkZSAiMTFuLmgiCiAKKyNkZWZpbmUgTVdJRklFWF9JQlNTX0NPTk5FQ1RfRVZUX0ZJWF9TSVpFICAgIDEyCisKK3N0YXRpYyBpbnQgbXdpZmlleF9jaGVja19pYnNzX3BlZXJfY2FwYWJpbHRpZXMoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKKwkJCQkJICAgICAgIHN0cnVjdCBtd2lmaWV4X3N0YV9ub2RlICpzdGFfcHRyLAorCQkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKmV2ZW50KQoreworCWludCBldnRfbGVuLCBlbGVfbGVuOworCXU4ICpjdXJyOworCXN0cnVjdCBpZWVlX3R5cGVzX2hlYWRlciAqZWxlX2hkcjsKKwlzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19tZ210X2ZyYW1lICp0bHZfbWdtdF9mcmFtZTsKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqaHRfY2FwOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdmh0X2NhcCAqdmh0X2NhcDsKKworCXNrYl9wdWxsKGV2ZW50LCBNV0lGSUVYX0lCU1NfQ09OTkVDVF9FVlRfRklYX1NJWkUpOworCWV2dF9sZW4gPSBldmVudC0+bGVuOworCWN1cnIgPSBldmVudC0+ZGF0YTsKKworCW13aWZpZXhfZGJnX2R1bXAocHJpdi0+YWRhcHRlciwgRVZUX0QsICJpYnNzIHBlZXIgY2FwYWJpbHRpZXM6IiwKKwkJCSBldmVudC0+ZGF0YSwgZXZlbnQtPmxlbik7CisKKwlza2JfcHVzaChldmVudCwgTVdJRklFWF9JQlNTX0NPTk5FQ1RfRVZUX0ZJWF9TSVpFKTsKKworCXRsdl9tZ210X2ZyYW1lID0gKHZvaWQgKiljdXJyOworCWlmIChldnRfbGVuID49IHNpemVvZigqdGx2X21nbXRfZnJhbWUpICYmCisJICAgIGxlMTZfdG9fY3B1KHRsdl9tZ210X2ZyYW1lLT5oZWFkZXIudHlwZSkgPT0KKwkgICAgVExWX1RZUEVfVUFQX01HTVRfRlJBTUUpIHsKKwkJLyogTG9jYXRlIGN1cnIgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgYmVhY29uIHRsdiwKKwkJICogdGltZXN0YW1wIDggYnl0ZXMsIGJlYWNvbiBpbnRlcnZlbCAyIGJ5dGVzLAorCQkgKiBjYXBhYmlsaXR5IGluZm8gMiBieXRlcywgdG90YWxseSAxMiBieXRlIGJlYWNvbiBoZWFkZXIKKwkJICovCisJCWV2dF9sZW4gPSBsZTE2X3RvX2NwdSh0bHZfbWdtdF9mcmFtZS0+aGVhZGVyLmxlbik7CisJCWN1cnIgKz0gKHNpemVvZigqdGx2X21nbXRfZnJhbWUpICsgMTIpOworCX0gZWxzZSB7CisJCW13aWZpZXhfZGJnKHByaXYtPmFkYXB0ZXIsIE1TRywKKwkJCSAgICAibWFuYWdlbWVudCBmcmFtZSB0bHYgbm90IGZvdW5kIVxuIik7CisJCXJldHVybiAwOworCX0KKworCXdoaWxlIChldnRfbGVuID49IHNpemVvZigqZWxlX2hkcikpIHsKKwkJZWxlX2hkciA9IChzdHJ1Y3QgaWVlZV90eXBlc19oZWFkZXIgKiljdXJyOworCQllbGVfbGVuID0gZWxlX2hkci0+bGVuOworCisJCWlmIChldnRfbGVuIDwgZWxlX2xlbiArIHNpemVvZigqZWxlX2hkcikpCisJCQlicmVhazsKKworCQlzd2l0Y2ggKGVsZV9oZHItPmVsZW1lbnRfaWQpIHsKKwkJY2FzZSBXTEFOX0VJRF9IVF9DQVBBQklMSVRZOgorCQkJc3RhX3B0ci0+aXNfMTFuX2VuYWJsZWQgPSB0cnVlOworCQkJaHRfY2FwID0gKHZvaWQgKikoZWxlX2hkciArIDIpOworCQkJc3RhX3B0ci0+bWF4X2Ftc2R1ID0gbGUxNl90b19jcHUoaHRfY2FwLT5jYXBfaW5mbykgJgorCQkJCUlFRUU4MDIxMV9IVF9DQVBfTUFYX0FNU0RVID8KKwkJCQlNV0lGSUVYX1RYX0RBVEFfQlVGX1NJWkVfOEsgOgorCQkJCU1XSUZJRVhfVFhfREFUQV9CVUZfU0laRV80SzsKKwkJCW13aWZpZXhfZGJnKHByaXYtPmFkYXB0ZXIsIElORk8sCisJCQkJICAgICIxMW4gZW5hYmxlZCEsIG1heF9hbXNkdSA6ICVkXG4iLAorCQkJCSAgICBzdGFfcHRyLT5tYXhfYW1zZHUpOworCQkJYnJlYWs7CisKKwkJY2FzZSBXTEFOX0VJRF9WSFRfQ0FQQUJJTElUWToKKwkJCXN0YV9wdHItPmlzXzExYWNfZW5hYmxlZCA9IHRydWU7CisJCQl2aHRfY2FwID0gKHZvaWQgKikoZWxlX2hkciArIDIpOworCQkJLyogY2hlY2sgVkhUIE1BWE1QRFUgY2FwYWJpbGl0eSAqLworCQkJc3dpdGNoIChsZTMyX3RvX2NwdSh2aHRfY2FwLT52aHRfY2FwX2luZm8pICYgMHgzKSB7CisJCQljYXNlIElFRUU4MDIxMV9WSFRfQ0FQX01BWF9NUERVX0xFTkdUSF8xMTQ1NDoKKwkJCQlzdGFfcHRyLT5tYXhfYW1zZHUgPQorCQkJCQlNV0lGSUVYX1RYX0RBVEFfQlVGX1NJWkVfMTJLOworCQkJCWJyZWFrOworCQkJY2FzZSBJRUVFODAyMTFfVkhUX0NBUF9NQVhfTVBEVV9MRU5HVEhfNzk5MToKKwkJCQlzdGFfcHRyLT5tYXhfYW1zZHUgPQorCQkJCQlNV0lGSUVYX1RYX0RBVEFfQlVGX1NJWkVfOEs7CisJCQkJYnJlYWs7CisJCQljYXNlIElFRUU4MDIxMV9WSFRfQ0FQX01BWF9NUERVX0xFTkdUSF8zODk1OgorCQkJCXN0YV9wdHItPm1heF9hbXNkdSA9CisJCQkJCU1XSUZJRVhfVFhfREFUQV9CVUZfU0laRV80SzsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCW13aWZpZXhfZGJnKHByaXYtPmFkYXB0ZXIsIElORk8sCisJCQkJICAgICIxMWFjIGVuYWJsZWQhLCBtYXhfYW1zZHUgOiAlZFxuIiwKKwkJCQkgICAgc3RhX3B0ci0+bWF4X2Ftc2R1KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQljdXJyICs9IChlbGVfbGVuICsgc2l6ZW9mKCplbGVfaGRyKSk7CisJCWV2dF9sZW4gLT0gKGVsZV9sZW4gKyBzaXplb2YoKmVsZV9oZHIpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIFRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSBjb25uZWN0aW9uIHN0YXRlLgogICoKQEAgLTUxOSw2ICs2MTIsOCBAQAogICogICAgICAtIEVWRU5UX0xJTktfUVVBTElUWQogICogICAgICAtIEVWRU5UX1BSRV9CRUFDT05fTE9TVAogICogICAgICAtIEVWRU5UX0lCU1NfQ09BTEVTQ0VECisgKiAgICAgIC0gRVZFTlRfSUJTU19TVEFfQ09OTkVDVAorICogICAgICAtIEVWRU5UX0lCU1NfU1RBX0RJU0NPTk5FQ1QKICAqICAgICAgLSBFVkVOVF9XRVBfSUNWX0VSUgogICogICAgICAtIEVWRU5UX0JXX0NIQU5HRQogICogICAgICAtIEVWRU5UX0hPU1RXQUtFX1NUQUlFCkBAIC01NDcsOSArNjQyLDExIEBACiBpbnQgbXdpZmlleF9wcm9jZXNzX3N0YV9ldmVudChzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2KQogewogCXN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOwotCWludCByZXQgPSAwOworCWludCByZXQgPSAwLCBpOwogCXUzMiBldmVudGNhdXNlID0gYWRhcHRlci0+ZXZlbnRfY2F1c2U7CiAJdTE2IGN0cmwsIHJlYXNvbl9jb2RlOworCXU4IGlic3Nfc3RhX2FkZHJbRVRIX0FMRU5dOworCXN0cnVjdCBtd2lmaWV4X3N0YV9ub2RlICpzdGFfcHRyOwogCiAJc3dpdGNoIChldmVudGNhdXNlKSB7CiAJY2FzZSBFVkVOVF9EVU1NWV9IT1NUX1dBS0VVUF9TSUdOQUw6CkBAIC03MDgsNyArODA1LDExIEBACiAKIAljYXNlIEVWRU5UX0VYVF9TQ0FOX1JFUE9SVDoKIAkJbXdpZmlleF9kYmcoYWRhcHRlciwgRVZFTlQsICJldmVudDogRVhUX1NDQU4gUmVwb3J0XG4iKTsKLQkJaWYgKGFkYXB0ZXItPmV4dF9zY2FuICYmICFwcml2LT5zY2FuX2Fib3J0aW5nKQorCQkvKiBXZSBpbnRlbmQgdG8gc2tpcCB0aGlzIGV2ZW50IGR1cmluZyBzdXNwZW5kLCBidXQgaGFuZGxlCisJCSAqIGl0IGluIGludGVyZmFjZSBkaXNhYmxlZCBjYXNlCisJCSAqLworCQlpZiAoYWRhcHRlci0+ZXh0X3NjYW4gJiYgKCFwcml2LT5zY2FuX2Fib3J0aW5nIHx8CisJCQkJCSAgIW5ldGlmX3J1bm5pbmcocHJpdi0+bmV0ZGV2KSkpCiAJCQlyZXQgPSBtd2lmaWV4X2hhbmRsZV9ldmVudF9leHRfc2Nhbl9yZXBvcnQocHJpdiwKIAkJCQkJCWFkYXB0ZXItPmV2ZW50X3NrYi0+ZGF0YSk7CiAKQEAgLTc3MSw2ICs4NzIsMzkgQEAKIAkJCQlIb3N0Q21kX0NNRF84MDJfMTFfSUJTU19DT0FMRVNDSU5HX1NUQVRVUywKIAkJCQlIb3N0Q21kX0FDVF9HRU5fR0VULCAwLCBOVUxMLCBmYWxzZSk7CiAJCWJyZWFrOworCWNhc2UgRVZFTlRfSUJTU19TVEFfQ09OTkVDVDoKKwkJZXRoZXJfYWRkcl9jb3B5KGlic3Nfc3RhX2FkZHIsIGFkYXB0ZXItPmV2ZW50X2JvZHkgKyAyKTsKKwkJbXdpZmlleF9kYmcoYWRhcHRlciwgRVZFTlQsICJldmVudDogSUJTU19TVEFfQ09OTkVDVCAlcE1cbiIsCisJCQkgICAgaWJzc19zdGFfYWRkcik7CisJCXN0YV9wdHIgPSBtd2lmaWV4X2FkZF9zdGFfZW50cnkocHJpdiwgaWJzc19zdGFfYWRkcik7CisJCWlmIChzdGFfcHRyICYmIGFkYXB0ZXItPmFkaG9jXzExbl9lbmFibGVkKSB7CisJCQltd2lmaWV4X2NoZWNrX2lic3NfcGVlcl9jYXBhYmlsdGllcyhwcml2LCBzdGFfcHRyLAorCQkJCQkJCSAgICBhZGFwdGVyLT5ldmVudF9za2IpOworCQkJaWYgKHN0YV9wdHItPmlzXzExbl9lbmFibGVkKQorCQkJCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1RJRDsgaSsrKQorCQkJCQlzdGFfcHRyLT5hbXBkdV9zdGFbaV0gPQorCQkJCQlwcml2LT5hZ2dyX3ByaW9fdGJsW2ldLmFtcGR1X3VzZXI7CisJCQllbHNlCisJCQkJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fVElEOyBpKyspCisJCQkJCXN0YV9wdHItPmFtcGR1X3N0YVtpXSA9CisJCQkJCQlCQV9TVFJFQU1fTk9UX0FMTE9XRUQ7CisJCQltZW1zZXQoc3RhX3B0ci0+cnhfc2VxLCAweGZmLCBzaXplb2Yoc3RhX3B0ci0+cnhfc2VxKSk7CisJCX0KKworCQlicmVhazsKKwljYXNlIEVWRU5UX0lCU1NfU1RBX0RJU0NPTk5FQ1Q6CisJCWV0aGVyX2FkZHJfY29weShpYnNzX3N0YV9hZGRyLCBhZGFwdGVyLT5ldmVudF9ib2R5ICsgMik7CisJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVWRU5ULCAiZXZlbnQ6IElCU1NfU1RBX0RJU0NPTk5FQ1QgJXBNXG4iLAorCQkJICAgIGlic3Nfc3RhX2FkZHIpOworCQlzdGFfcHRyID0gbXdpZmlleF9nZXRfc3RhX2VudHJ5KHByaXYsIGlic3Nfc3RhX2FkZHIpOworCQlpZiAoc3RhX3B0ciAmJiBzdGFfcHRyLT5pc18xMW5fZW5hYmxlZCkgeworCQkJbXdpZmlleF8xMW5fZGVsX3J4X3Jlb3JkZXJfdGJsX2J5X3RhKHByaXYsCisJCQkJCQkJICAgICBpYnNzX3N0YV9hZGRyKTsKKwkJCW13aWZpZXhfZGVsX3R4X2JhX3N0cmVhbV90YmxfYnlfcmEocHJpdiwgaWJzc19zdGFfYWRkcik7CisJCX0KKwkJbXdpZmlleF93bW1fZGVsX3BlZXJfcmFfbGlzdChwcml2LCBpYnNzX3N0YV9hZGRyKTsKKwkJbXdpZmlleF9kZWxfc3RhX2VudHJ5KHByaXYsIGlic3Nfc3RhX2FkZHIpOworCQlicmVhazsKIAljYXNlIEVWRU5UX0FEREJBOgogCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFVkVOVCwgImV2ZW50OiBBRERCQSBSZXF1ZXN0XG4iKTsKIAkJbXdpZmlleF9zZW5kX2NtZChwcml2LCBIb3N0Q21kX0NNRF8xMU5fQUREQkFfUlNQLApAQCAtODY5LDYgKzEwMDMsMTIgQEAKIAkJbXdpZmlleF9idF9jb2V4X3dsYW5fcGFyYW1fdXBkYXRlX2V2ZW50KHByaXYsCiAJCQkJCQkJYWRhcHRlci0+ZXZlbnRfc2tiKTsKIAkJYnJlYWs7CisJY2FzZSBFVkVOVF9SWEJBX1NZTkM6CisJCWRldl9kYmcoYWRhcHRlci0+ZGV2LCAiRVZFTlQ6IFJYQkFfU1lOQ1xuIik7CisJCW13aWZpZXhfMTFuX3J4YmFfc3luY19ldmVudChwcml2LCBhZGFwdGVyLT5ldmVudF9ib2R5LAorCQkJCQkgICAgYWRhcHRlci0+ZXZlbnRfc2tiLT5sZW4gLQorCQkJCQkgICAgc2l6ZW9mKGV2ZW50Y2F1c2UpKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJbXdpZmlleF9kYmcoYWRhcHRlciwgRVJST1IsICJldmVudDogdW5rbm93biBldmVudCBpZDogJSN4XG4iLAogCQkJICAgIGV2ZW50Y2F1c2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3N0YV9pb2N0bC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3N0YV9pb2N0bC5jCmluZGV4IGUwNjY0N2EuLjY0NGYzYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9zdGFfaW9jdGwuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc3RhX2lvY3RsLmMKQEAgLTU3NCw3ICs1NzQsNyBAQAogCiAJYWRhcHRlci0+aHNfYWN0aXZhdGVfd2FpdF9xX3dva2VuID0gZmFsc2U7CiAKLQltZW1zZXQoJmhzY2ZnLCAwLCBzaXplb2Yoc3RydWN0IG13aWZpZXhfZHNfaHNfY2ZnKSk7CisJbWVtc2V0KCZoc2NmZywgMCwgc2l6ZW9mKGhzY2ZnKSk7CiAJaHNjZmcuaXNfaW52b2tlX2hvc3RjbWQgPSB0cnVlOwogCiAJYWRhcHRlci0+aHNfZW5hYmxpbmcgPSB0cnVlOwpAQCAtMTEzOCw3ICsxMTM4LDcgQEAKIHsKIAlzdHJ1Y3QgbXdpZmlleF9kc19lbmNyeXB0X2tleSBlbmNyeXB0X2tleTsKIAotCW1lbXNldCgmZW5jcnlwdF9rZXksIDAsIHNpemVvZihzdHJ1Y3QgbXdpZmlleF9kc19lbmNyeXB0X2tleSkpOworCW1lbXNldCgmZW5jcnlwdF9rZXksIDAsIHNpemVvZihlbmNyeXB0X2tleSkpOwogCWVuY3J5cHRfa2V5LmtleV9sZW4gPSBrZXlfbGVuOwogCWVuY3J5cHRfa2V5LmtleV9pbmRleCA9IGtleV9pbmRleDsKIApAQCAtMTE4MCw3ICsxMTgwLDcgQEAKIHsKIAlzdHJ1Y3QgbXdpZmlleF92ZXJfZXh0IHZlcl9leHQ7CiAKLQltZW1zZXQoJnZlcl9leHQsIDAsIHNpemVvZihzdHJ1Y3QgaG9zdF9jbWRfZHNfdmVyc2lvbl9leHQpKTsKKwltZW1zZXQoJnZlcl9leHQsIDAsIHNpemVvZih2ZXJfZXh0KSk7CiAJdmVyX2V4dC52ZXJzaW9uX3N0cl9zZWwgPSB2ZXJzaW9uX3N0cl9zZWw7CiAJaWYgKG13aWZpZXhfc2VuZF9jbWQocHJpdiwgSG9zdENtZF9DTURfVkVSU0lPTl9FWFQsCiAJCQkgICAgIEhvc3RDbWRfQUNUX0dFTl9HRVQsIDAsICZ2ZXJfZXh0LCB0cnVlKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC91YXBfZXZlbnQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC91YXBfZXZlbnQuYwppbmRleCA4NmZmNTQyLi5kMjRlY2EzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvdWFwX2V2ZW50LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3VhcF9ldmVudC5jCkBAIC0zMDYsNyArMzA2LDEyIEBACiAJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVWRU5ULCAiZXZlbnQ6IG11bHRpLWNoYW4gaW5mb1xuIik7CiAJCW13aWZpZXhfcHJvY2Vzc19tdWx0aV9jaGFuX2V2ZW50KHByaXYsIGFkYXB0ZXItPmV2ZW50X3NrYik7CiAJCWJyZWFrOwotCisJY2FzZSBFVkVOVF9SWEJBX1NZTkM6CisJCWRldl9kYmcoYWRhcHRlci0+ZGV2LCAiRVZFTlQ6IFJYQkFfU1lOQ1xuIik7CisJCW13aWZpZXhfMTFuX3J4YmFfc3luY19ldmVudChwcml2LCBhZGFwdGVyLT5ldmVudF9ib2R5LAorCQkJCQkgICAgYWRhcHRlci0+ZXZlbnRfc2tiLT5sZW4gLQorCQkJCQkgICAgc2l6ZW9mKGV2ZW50Y2F1c2UpKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJbXdpZmlleF9kYmcoYWRhcHRlciwgRVZFTlQsCiAJCQkgICAgImV2ZW50OiB1bmtub3duIGV2ZW50IGlkOiAlI3hcbiIsIGV2ZW50Y2F1c2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3VzYi5jCmluZGV4IDA4NTc1NzUuLjczZWIwODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC91c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvdXNiLmMKQEAgLTI3Myw2ICsyNzMsOCBAQAogCX0gZWxzZSB7CiAJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIERBVEEsCiAJCQkgICAgIiVzOiBEQVRBXG4iLCBfX2Z1bmNfXyk7CisJCW13aWZpZXhfd3JpdGVfZGF0YV9jb21wbGV0ZShhZGFwdGVyLCBjb250ZXh0LT5za2IsIDAsCisJCQkJCSAgICB1cmItPnN0YXR1cyA/IC0xIDogMCk7CiAJCWZvciAoaSA9IDA7IGkgPCBNV0lGSUVYX1RYX0RBVEFfUE9SVDsgaSsrKSB7CiAJCQlwb3J0ID0gJmNhcmQtPnBvcnRbaV07CiAJCQlpZiAoY29udGV4dC0+ZXAgPT0gcG9ydC0+dHhfZGF0YV9lcCkgewpAQCAtMjgyLDggKzI4NCw2IEBACiAJCQl9CiAJCX0KIAkJYWRhcHRlci0+ZGF0YV9zZW50ID0gZmFsc2U7Ci0JCW13aWZpZXhfd3JpdGVfZGF0YV9jb21wbGV0ZShhZGFwdGVyLCBjb250ZXh0LT5za2IsIDAsCi0JCQkJCSAgICB1cmItPnN0YXR1cyA/IC0xIDogMCk7CiAJfQogCiAJaWYgKGNhcmQtPm1jX3Jlc3luY19mbGFnKQpAQCAtNjExLDcgKzYxMSw3IEBACiAJaWYgKCFhZGFwdGVyLT5wcml2X251bSkKIAkJcmV0dXJuOwogCi0JaWYgKHVzZXJfcm1tb2QpIHsKKwlpZiAodXNlcl9ybW1vZCAmJiAhYWRhcHRlci0+bWZnX21vZGUpIHsKICNpZmRlZiBDT05GSUdfUE0KIAkJaWYgKGFkYXB0ZXItPmlzX3N1c3BlbmRlZCkKIAkJCW13aWZpZXhfdXNiX3Jlc3VtZShpbnRmKTsKQEAgLTY1NywxMSArNjU3LDggQEAKIAljYXJkLT50eF9jbWQuZXAgPSBjYXJkLT50eF9jbWRfZXA7CiAKIAljYXJkLT50eF9jbWQudXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNhcmQtPnR4X2NtZC51cmIpIHsKLQkJbXdpZmlleF9kYmcoYWRhcHRlciwgRVJST1IsCi0JCQkgICAgInR4X2NtZC51cmIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCWlmICghY2FyZC0+dHhfY21kLnVyYikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJZm9yIChpID0gMDsgaSA8IE1XSUZJRVhfVFhfREFUQV9QT1JUOyBpKyspIHsKIAkJcG9ydCA9ICZjYXJkLT5wb3J0W2ldOwpAQCAtNjc3LDExICs2NzQsOCBAQAogCQkJcG9ydC0+dHhfZGF0YV9saXN0W2pdLmVwID0gcG9ydC0+dHhfZGF0YV9lcDsKIAkJCXBvcnQtPnR4X2RhdGFfbGlzdFtqXS51cmIgPQogCQkJCQl1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCQkJaWYgKCFwb3J0LT50eF9kYXRhX2xpc3Rbal0udXJiKSB7Ci0JCQkJbXdpZmlleF9kYmcoYWRhcHRlciwgRVJST1IsCi0JCQkJCSAgICAidXJiIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJCWlmICghcG9ydC0+dHhfZGF0YV9saXN0W2pdLnVyYikKIAkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCX0KIAkJfQogCX0KIApAQCAtNjk3LDEwICs2OTEsOCBAQAogCWNhcmQtPnJ4X2NtZC5lcCA9IGNhcmQtPnJ4X2NtZF9lcDsKIAogCWNhcmQtPnJ4X2NtZC51cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghY2FyZC0+cnhfY21kLnVyYikgewotCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwgInJ4X2NtZC51cmIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCWlmICghY2FyZC0+cnhfY21kLnVyYikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJY2FyZC0+cnhfY21kLnNrYiA9IGRldl9hbGxvY19za2IoTVdJRklFWF9SWF9DTURfQlVGX1NJWkUpOwogCWlmICghY2FyZC0+cnhfY21kLnNrYikKQEAgLTcxNCwxMSArNzA2LDggQEAKIAkJY2FyZC0+cnhfZGF0YV9saXN0W2ldLmVwID0gY2FyZC0+cnhfZGF0YV9lcDsKIAogCQljYXJkLT5yeF9kYXRhX2xpc3RbaV0udXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFjYXJkLT5yeF9kYXRhX2xpc3RbaV0udXJiKSB7Ci0JCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwKLQkJCQkgICAgInJ4X2RhdGFfbGlzdFtdIHVyYiBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCWlmICghY2FyZC0+cnhfZGF0YV9saXN0W2ldLnVyYikKIAkJCXJldHVybiAtMTsKLQkJfQogCQlpZiAobXdpZmlleF91c2Jfc3VibWl0X3J4X3VyYigmY2FyZC0+cnhfZGF0YV9saXN0W2ldLAogCQkJCQkgICAgICBNV0lGSUVYX1JYX0RBVEFfQlVGX1NJWkUpKQogCQkJcmV0dXJuIC0xOwpAQCAtODUyLDcgKzg0MSw3IEBACiAJc3RydWN0IHVzYl90eF9kYXRhX3BvcnQgKnBvcnQgPSBOVUxMOwogCXU4ICpkYXRhID0gKHU4ICopc2tiLT5kYXRhOwogCXN0cnVjdCB1cmIgKnR4X3VyYjsKLQlpbnQgaWR4LCByZXQ7CisJaW50IGlkeCwgcmV0ID0gLUVJTlBST0dSRVNTOwogCiAJaWYgKGFkYXB0ZXItPmlzX3N1c3BlbmRlZCkgewogCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwKQEAgLTg3Niw4ICs4NjUsOSBAQAogCQkJCWlmIChhdG9taWNfcmVhZCgmcG9ydC0+dHhfZGF0YV91cmJfcGVuZGluZykKIAkJCQkgICAgPj0gTVdJRklFWF9UWF9EQVRBX1VSQikgewogCQkJCQlwb3J0LT5ibG9ja19zdGF0dXMgPSB0cnVlOwotCQkJCQlyZXQgPSAtRUJVU1k7Ci0JCQkJCWdvdG8gZG9uZTsKKwkJCQkJYWRhcHRlci0+ZGF0YV9zZW50ID0KKwkJCQkJCW13aWZpZXhfdXNiX2RhdGFfc2VudChhZGFwdGVyKTsKKwkJCQkJcmV0dXJuIC1FQlVTWTsKIAkJCQl9CiAJCQkJaWYgKHBvcnQtPnR4X2RhdGFfaXggPj0gTVdJRklFWF9UWF9EQVRBX1VSQikKIAkJCQkJcG9ydC0+dHhfZGF0YV9peCA9IDA7CkBAIC05MDgsNiArODk4LDE0IEBACiAJZWxzZQogCQlhdG9taWNfaW5jKCZwb3J0LT50eF9kYXRhX3VyYl9wZW5kaW5nKTsKIAorCWlmIChlcCAhPSBjYXJkLT50eF9jbWRfZXAgJiYKKwkgICAgYXRvbWljX3JlYWQoJnBvcnQtPnR4X2RhdGFfdXJiX3BlbmRpbmcpID09CisJCQkJCU1XSUZJRVhfVFhfREFUQV9VUkIpIHsKKwkJcG9ydC0+YmxvY2tfc3RhdHVzID0gdHJ1ZTsKKwkJYWRhcHRlci0+ZGF0YV9zZW50ID0gbXdpZmlleF91c2JfZGF0YV9zZW50KGFkYXB0ZXIpOworCQlyZXQgPSAtRU5PU1I7CisJfQorCiAJaWYgKHVzYl9zdWJtaXRfdXJiKHR4X3VyYiwgR0ZQX0FUT01JQykpIHsKIAkJbXdpZmlleF9kYmcoYWRhcHRlciwgRVJST1IsCiAJCQkgICAgIiVzOiB1c2Jfc3VibWl0X3VyYiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKQEAgLTkxNiwyOSArOTE0LDE1IEBACiAJCX0gZWxzZSB7CiAJCQlhdG9taWNfZGVjKCZwb3J0LT50eF9kYXRhX3VyYl9wZW5kaW5nKTsKIAkJCXBvcnQtPmJsb2NrX3N0YXR1cyA9IGZhbHNlOworCQkJYWRhcHRlci0+ZGF0YV9zZW50ID0gZmFsc2U7CiAJCQlpZiAocG9ydC0+dHhfZGF0YV9peCkKIAkJCQlwb3J0LT50eF9kYXRhX2l4LS07CiAJCQllbHNlCiAJCQkJcG9ydC0+dHhfZGF0YV9peCA9IE1XSUZJRVhfVFhfREFUQV9VUkI7CiAJCX0KLQotCQlyZXR1cm4gLTE7Ci0JfSBlbHNlIHsKLQkJaWYgKGVwICE9IGNhcmQtPnR4X2NtZF9lcCAmJgotCQkgICAgYXRvbWljX3JlYWQoJnBvcnQtPnR4X2RhdGFfdXJiX3BlbmRpbmcpID09Ci0JCQkJCQkJTVdJRklFWF9UWF9EQVRBX1VSQikgewotCQkJcG9ydC0+YmxvY2tfc3RhdHVzID0gdHJ1ZTsKLQkJCXJldCA9IC1FTk9TUjsKLQkJCWdvdG8gZG9uZTsKLQkJfQorCQlyZXQgPSAtMTsKIAl9CiAKLQlyZXR1cm4gLUVJTlBST0dSRVNTOwotCi1kb25lOgotCWlmIChlcCAhPSBjYXJkLT50eF9jbWRfZXApCi0JCWFkYXB0ZXItPmRhdGFfc2VudCA9IG13aWZpZXhfdXNiX2RhdGFfc2VudChhZGFwdGVyKTsKLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEwMzcsNiArMTAyMSwxMCBAQAogCQkJZG5sZF9jbWQgPSBsZTMyX3RvX2NwdShmd2RhdGEtPmZ3X2hkci5kbmxkX2NtZCk7CiAJCQl0bGVuICs9IHNpemVvZihzdHJ1Y3QgZndfaGVhZGVyKTsKIAorCQkJLyogQ29tbWFuZCA3IGRvZXNuJ3QgaGF2ZSBkYXRhIGxlbmd0aCBmaWVsZCAqLworCQkJaWYgKGRubGRfY21kID09IEZXX0NNRF83KQorCQkJCWRsZW4gPSAwOworCiAJCQltZW1jcHkoZndkYXRhLT5kYXRhLCAmZmlybXdhcmVbdGxlbl0sIGRsZW4pOwogCiAJCQlmd2RhdGEtPnNlcV9udW0gPSBjcHVfdG9fbGUzMihmd19zZXFudW0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3VzYi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3VzYi5oCmluZGV4IGI0ZTkyNDYuLjMwZThlYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC91c2IuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvdXNiLmgKQEAgLTQ2LDExICs0NiwxMiBAQAogI2RlZmluZSBVU0I4NzY2X0RFRkFVTFRfRldfTkFNRQkibXJ2bC91c2I4NzY2X3VhcHN0YS5iaW4iCiAjZGVmaW5lIFVTQjg3OTdfREVGQVVMVF9GV19OQU1FCSJtcnZsL3VzYjg3OTdfdWFwc3RhLmJpbiIKICNkZWZpbmUgVVNCODgwMV9ERUZBVUxUX0ZXX05BTUUJIm1ydmwvdXNiODgwMV91YXBzdGEuYmluIgotI2RlZmluZSBVU0I4OTk3X0RFRkFVTFRfRldfTkFNRQkibXJ2bC91c2I4OTk3X3VhcHN0YS5iaW4iCisjZGVmaW5lIFVTQjg5OTdfREVGQVVMVF9GV19OQU1FCSJtcnZsL3VzYnVzYjg5OTdfY29tYm9fdjQuYmluIgogCiAjZGVmaW5lIEZXX0ROTERfVFhfQlVGX1NJWkUJNjIwCiAjZGVmaW5lIEZXX0ROTERfUlhfQlVGX1NJWkUJMjA0OAogI2RlZmluZSBGV19IQVNfTEFTVF9CTE9DSwkweDAwMDAwMDA0CisjZGVmaW5lIEZXX0NNRF83CQkweDAwMDAwMDA3CiAKICNkZWZpbmUgRldfREFUQV9YTUlUX1NJWkUgXAogCShzaXplb2Yoc3RydWN0IGZ3X2hlYWRlcikgKyBkbGVuICsgc2l6ZW9mKHUzMikpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvdXRpbC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3V0aWwuYwppbmRleCA2NjgxYmUwLi4xOGZiYjk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvdXRpbC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC91dGlsLmMKQEAgLTM4Niw2ICszODYsNyBAQAogCQkJCSAgICAidW5rbm93biBwdWJsaWMgYWN0aW9uIGZyYW1lIGNhdGVnb3J5ICVkXG4iLAogCQkJCSAgICBjYXRlZ29yeSk7CiAJCX0KKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJbXdpZmlleF9kYmcocHJpdi0+YWRhcHRlciwgSU5GTywKIAkJICAgICJ1bmtub3duIG1nbXQgZnJhbWUgc3VidHlwZSAlI3hcbiIsIHN0eXBlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvZG1hLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L2RtYS5jCmluZGV4IDU3YTgwY2YuLmE4YmMwNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvZG1hLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9kbWEuYwpAQCAtMTAzLDcgKzEwMyw3IEBACiAKIAlpZiAodW5saWtlbHkocnh3aS0+emVyb1swXSB8fCByeHdpLT56ZXJvWzFdIHx8IHJ4d2ktPnplcm9bMl0pKQogCQlkZXZfZXJyX29uY2UoZGV2LT5kZXYsICJFcnJvcjogUlhXSSB6ZXJvIGZpZWxkcyBhcmUgc2V0XG4iKTsKLQlpZiAodW5saWtlbHkoTVQ3Nl9HRVQoTVRfUlhEX0lORk9fVFlQRSwgZmNlX2luZm8pKSkKKwlpZiAodW5saWtlbHkoRklFTERfR0VUKE1UX1JYRF9JTkZPX1RZUEUsIGZjZV9pbmZvKSkpCiAJCWRldl9lcnJfb25jZShkZXYtPmRldiwgIkVycm9yOiBSWCBwYXRoIHNlZW4gYSBub24tcGt0IHVyYlxuIik7CiAKIAl0cmFjZV9tdF9yeChkZXYsIHJ4d2ksIGZjZV9pbmZvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvZG1hLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L2RtYS5oCmluZGV4IDk3OGU4YTkuLjI3MGQxMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvZG1hLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9kbWEuaApAQCAtMTgsOCArMTgsNiBAQAogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KIAotI2luY2x1ZGUgInV0aWwuaCIKLQogI2RlZmluZSBNVF9ETUFfSERSX0xFTgkJCTQKICNkZWZpbmUgTVRfUlhfSU5GT19MRU4JCQk0CiAjZGVmaW5lIE1UX0ZDRV9JTkZPX0xFTgkJCTQKQEAgLTc5LDkgKzc3LDkgQEAKIAkgKi8KIAogCWluZm8gPSBmbGFncyB8Ci0JCU1UNzZfU0VUKE1UX1RYRF9JTkZPX0xFTiwgcm91bmRfdXAoc2tiLT5sZW4sIDQpKSB8Ci0JCU1UNzZfU0VUKE1UX1RYRF9JTkZPX0RfUE9SVCwgZF9wb3J0KSB8Ci0JCU1UNzZfU0VUKE1UX1RYRF9JTkZPX1RZUEUsIHR5cGUpOworCQlGSUVMRF9QUkVQKE1UX1RYRF9JTkZPX0xFTiwgcm91bmRfdXAoc2tiLT5sZW4sIDQpKSB8CisJCUZJRUxEX1BSRVAoTVRfVFhEX0lORk9fRF9QT1JULCBkX3BvcnQpIHwKKwkJRklFTERfUFJFUChNVF9UWERfSU5GT19UWVBFLCB0eXBlKTsKIAogCXB1dF91bmFsaWduZWRfbGUzMihpbmZvLCBza2JfcHVzaChza2IsIHNpemVvZihpbmZvKSkpOwogCXJldHVybiBza2JfcHV0X3BhZHRvKHNrYiwgcm91bmRfdXAoc2tiLT5sZW4sIDQpICsgNCk7CkBAIC05MCw3ICs4OCw3IEBACiBzdGF0aWMgaW5saW5lIGludAogbXQ3NjAxdV9kbWFfc2tiX3dyYXBfcGt0KHN0cnVjdCBza19idWZmICpza2IsIGVudW0gbXQ3Nl9xc2VsIHFzZWwsIHUzMiBmbGFncykKIHsKLQlmbGFncyB8PSBNVDc2X1NFVChNVF9UWERfUEtUX0lORk9fUVNFTCwgcXNlbCk7CisJZmxhZ3MgfD0gRklFTERfUFJFUChNVF9UWERfUEtUX0lORk9fUVNFTCwgcXNlbCk7CiAJcmV0dXJuIG10NzYwMXVfZG1hX3NrYl93cmFwKHNrYiwgV0xBTl9QT1JULCBETUFfUEFDS0VULCBmbGFncyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvZWVwcm9tLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L2VlcHJvbS5jCmluZGV4IDhkOGVlMDMuLmRhNmZhZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvZWVwcm9tLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9lZXByb20uYwpAQCAtNDUsOCArNDUsOCBAQAogCXZhbCA9IG10NzZfcnIoZGV2LCBNVF9FRlVTRV9DVFJMKTsKIAl2YWwgJj0gfihNVF9FRlVTRV9DVFJMX0FJTiB8CiAJCSBNVF9FRlVTRV9DVFJMX01PREUpOwotCXZhbCB8PSBNVDc2X1NFVChNVF9FRlVTRV9DVFJMX0FJTiwgYWRkciAmIH4weGYpIHwKLQkgICAgICAgTVQ3Nl9TRVQoTVRfRUZVU0VfQ1RSTF9NT0RFLCBtb2RlKSB8CisJdmFsIHw9IEZJRUxEX1BSRVAoTVRfRUZVU0VfQ1RSTF9BSU4sIGFkZHIgJiB+MHhmKSB8CisJICAgICAgIEZJRUxEX1BSRVAoTVRfRUZVU0VfQ1RSTF9NT0RFLCBtb2RlKSB8CiAJICAgICAgIE1UX0VGVVNFX0NUUkxfS0lDSzsKIAltdDc2X3dyKGRldiwgTVRfRUZVU0VfQ1RSTCwgdmFsKTsKIApAQCAtMTI4LDggKzEyOCw4IEBACiAJaWYgKCFmaWVsZF92YWxpZChuaWNfY29uZjAgPj4gOCkpCiAJCXJldHVybjsKIAotCWlmIChNVDc2X0dFVChNVF9FRV9OSUNfQ09ORl8wX1JYX1BBVEgsIG5pY19jb25mMCkgPiAxIHx8Ci0JICAgIE1UNzZfR0VUKE1UX0VFX05JQ19DT05GXzBfVFhfUEFUSCwgbmljX2NvbmYwKSA+IDEpCisJaWYgKEZJRUxEX0dFVChNVF9FRV9OSUNfQ09ORl8wX1JYX1BBVEgsIG5pY19jb25mMCkgPiAxIHx8CisJICAgIEZJRUxEX0dFVChNVF9FRV9OSUNfQ09ORl8wX1RYX1BBVEgsIG5pY19jb25mMCkgPiAxKQogCQlkZXZfZXJyKGRldi0+ZGV2LAogCQkJIkVycm9yOiBkZXZpY2UgaGFzIG1vcmUgdGhhbiAxIFJYL1RYIHN0cmVhbSFcbiIpOwogfQpAQCAtMTUwLDcgKzE1MCw3IEBACiAKIAltdDc2X3dyKGRldiwgTVRfTUFDX0FERFJfRFcwLCBnZXRfdW5hbGlnbmVkX2xlMzIoZGV2LT5tYWNhZGRyKSk7CiAJbXQ3Nl93cihkZXYsIE1UX01BQ19BRERSX0RXMSwgZ2V0X3VuYWxpZ25lZF9sZTE2KGRldi0+bWFjYWRkciArIDQpIHwKLQkJTVQ3Nl9TRVQoTVRfTUFDX0FERFJfRFcxX1UyTUVfTUFTSywgMHhmZikpOworCQlGSUVMRF9QUkVQKE1UX01BQ19BRERSX0RXMV9VMk1FX01BU0ssIDB4ZmYpKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTc2LDcgKzE3Niw3IEBACiAJdTggbWF4X3B3cjsKIAogCXZhbCA9IG10NzYwMXVfcnIoZGV2LCBNVF9UWF9BTENfQ0ZHXzApOwotCW1heF9wd3IgPSBNVDc2X0dFVChNVF9UWF9BTENfQ0ZHXzBfTElNSVRfMCwgdmFsKTsKKwltYXhfcHdyID0gRklFTERfR0VUKE1UX1RYX0FMQ19DRkdfMF9MSU1JVF8wLCB2YWwpOwogCiAJaWYgKG10NzYwMXVfaGFzX3Rzc2koZGV2LCBlZXByb20pKSB7CiAJCW10NzYwMXVfc2V0X2NoYW5uZWxfdGFyZ2V0X3Bvd2VyKGRldiwgZWVwcm9tLCBtYXhfcHdyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvaW5pdC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9pbml0LmMKaW5kZXggOGZhNzhkNy4uNDRkNDZlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9pbml0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9pbml0LmMKQEAgLTEwOCw4ICsxMDgsOSBAQAogewogCXUzMiB2YWw7CiAKLQl2YWwgPSBNVDc2X1NFVChNVF9VU0JfRE1BX0NGR19SWF9CVUxLX0FHR19UT1VULCBNVF9VU0JfQUdHUl9USU1FT1VUKSB8Ci0JICAgICAgTVQ3Nl9TRVQoTVRfVVNCX0RNQV9DRkdfUlhfQlVMS19BR0dfTE1ULCBNVF9VU0JfQUdHUl9TSVpFX0xJTUlUKSB8CisJdmFsID0gRklFTERfUFJFUChNVF9VU0JfRE1BX0NGR19SWF9CVUxLX0FHR19UT1VULCBNVF9VU0JfQUdHUl9USU1FT1VUKSB8CisJICAgICAgRklFTERfUFJFUChNVF9VU0JfRE1BX0NGR19SWF9CVUxLX0FHR19MTVQsCisJCQkgTVRfVVNCX0FHR1JfU0laRV9MSU1JVCkgfAogCSAgICAgIE1UX1VTQl9ETUFfQ0ZHX1JYX0JVTEtfRU4gfAogCSAgICAgIE1UX1VTQl9ETUFfQ0ZHX1RYX0JVTEtfRU47CiAJaWYgKGRldi0+aW5fbWF4X3BhY2tldCA9PSA1MTIpCkBAIC0zOTYsOCArMzk3LDkgQEAKIAogCW10NzYwMXVfcm13KGRldiwgTVRfVVNfQ1lDX0NGRywgTVRfVVNfQ1lDX0NOVCwgMHgxZSk7CiAKLQltdDc2MDF1X3dyKGRldiwgTVRfVFhPUF9DVFJMX0NGRywgTVQ3Nl9TRVQoTVRfVFhPUF9UUlVOX0VOLCAweDNmKSB8Ci0JCQkJCSAgTVQ3Nl9TRVQoTVRfVFhPUF9FWFRfQ0NBX0RMWSwgMHg1OCkpOworCW10NzYwMXVfd3IoZGV2LCBNVF9UWE9QX0NUUkxfQ0ZHLAorCQkgICBGSUVMRF9QUkVQKE1UX1RYT1BfVFJVTl9FTiwgMHgzZikgfAorCQkgICBGSUVMRF9QUkVQKE1UX1RYT1BfRVhUX0NDQV9ETFksIDB4NTgpKTsKIAogCXJldCA9IG10NzYwMXVfZWVwcm9tX2luaXQoZGV2KTsKIAlpZiAocmV0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9tYWMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvbWFjLmMKaW5kZXggZTIxYzUzZS4uM2M1NzYzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9tYWMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L21hYy5jCkBAIC0xOSwxMyArMTksMTMgQEAKIHN0YXRpYyB2b2lkCiBtdDc2X21hY19wcm9jZXNzX3R4X3JhdGUoc3RydWN0IGllZWU4MDIxMV90eF9yYXRlICp0eHJhdGUsIHUxNiByYXRlKQogewotCXU4IGlkeCA9IE1UNzZfR0VUKE1UX1RYV0lfUkFURV9NQ1MsIHJhdGUpOworCXU4IGlkeCA9IEZJRUxEX0dFVChNVF9UWFdJX1JBVEVfTUNTLCByYXRlKTsKIAogCXR4cmF0ZS0+aWR4ID0gMDsKIAl0eHJhdGUtPmZsYWdzID0gMDsKIAl0eHJhdGUtPmNvdW50ID0gMTsKIAotCXN3aXRjaCAoTVQ3Nl9HRVQoTVRfVFhXSV9SQVRFX1BIWV9NT0RFLCByYXRlKSkgeworCXN3aXRjaCAoRklFTERfR0VUKE1UX1RYV0lfUkFURV9QSFlfTU9ERSwgcmF0ZSkpIHsKIAljYXNlIE1UX1BIWV9UWVBFX09GRE06CiAJCXR4cmF0ZS0+aWR4ID0gaWR4ICsgNDsKIAkJcmV0dXJuOwpAQCAtNDcsNyArNDcsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKE1UNzZfR0VUKE1UX1RYV0lfUkFURV9CVywgcmF0ZSkgPT0gTVRfUEhZX0JXXzQwKQorCWlmIChGSUVMRF9HRVQoTVRfVFhXSV9SQVRFX0JXLCByYXRlKSA9PSBNVF9QSFlfQldfNDApCiAJCXR4cmF0ZS0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1JDXzQwX01IWl9XSURUSDsKIAogCWlmIChyYXRlICYgTVRfVFhXSV9SQVRFX1NHSSkKQEAgLTEyNSw5ICsxMjUsOSBAQAogCQlidyA9IDA7CiAJfQogCi0JcmF0ZXZhbCA9IE1UNzZfU0VUKE1UX1JYV0lfUkFURV9NQ1MsIHJhdGVfaWR4KTsKLQlyYXRldmFsIHw9IE1UNzZfU0VUKE1UX1JYV0lfUkFURV9QSFksIHBoeSk7Ci0JcmF0ZXZhbCB8PSBNVDc2X1NFVChNVF9SWFdJX1JBVEVfQlcsIGJ3KTsKKwlyYXRldmFsID0gRklFTERfUFJFUChNVF9SWFdJX1JBVEVfTUNTLCByYXRlX2lkeCk7CisJcmF0ZXZhbCB8PSBGSUVMRF9QUkVQKE1UX1JYV0lfUkFURV9QSFksIHBoeSk7CisJcmF0ZXZhbCB8PSBGSUVMRF9QUkVQKE1UX1JYV0lfUkFURV9CVywgYncpOwogCWlmIChyYXRlLT5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19TSE9SVF9HSSkKIAkJcmF0ZXZhbCB8PSBNVF9SWFdJX1JBVEVfU0dJOwogCkBAIC0xNTYsOSArMTU2LDkgQEAKIAlzdGF0LnN1Y2Nlc3MgPSAhISh2YWwgJiBNVF9UWF9TVEFUX0ZJRk9fU1VDQ0VTUyk7CiAJc3RhdC5hZ2dyID0gISEodmFsICYgTVRfVFhfU1RBVF9GSUZPX0FHR1IpOwogCXN0YXQuYWNrX3JlcSA9ICEhKHZhbCAmIE1UX1RYX1NUQVRfRklGT19BQ0tSRVEpOwotCXN0YXQucGt0aWQgPSBNVDc2X0dFVChNVF9UWF9TVEFUX0ZJRk9fUElEX1RZUEUsIHZhbCk7Ci0Jc3RhdC53Y2lkID0gTVQ3Nl9HRVQoTVRfVFhfU1RBVF9GSUZPX1dDSUQsIHZhbCk7Ci0Jc3RhdC5yYXRlID0gTVQ3Nl9HRVQoTVRfVFhfU1RBVF9GSUZPX1JBVEUsIHZhbCk7CisJc3RhdC5wa3RpZCA9IEZJRUxEX0dFVChNVF9UWF9TVEFUX0ZJRk9fUElEX1RZUEUsIHZhbCk7CisJc3RhdC53Y2lkID0gRklFTERfR0VUKE1UX1RYX1NUQVRfRklGT19XQ0lELCB2YWwpOworCXN0YXQucmF0ZSA9IEZJRUxEX0dFVChNVF9UWF9TVEFUX0ZJRk9fUkFURSwgdmFsKTsKIAogCXJldHVybiBzdGF0OwogfQpAQCAtMjcwLDcgKzI3MCw3IEBACiAJfQogCiAJdmFsICY9IH5NVF9CRUFDT05fVElNRV9DRkdfSU5UVkFMOwotCXZhbCB8PSBNVDc2X1NFVChNVF9CRUFDT05fVElNRV9DRkdfSU5UVkFMLCBpbnRlcnZhbCA8PCA0KSB8CisJdmFsIHw9IEZJRUxEX1BSRVAoTVRfQkVBQ09OX1RJTUVfQ0ZHX0lOVFZBTCwgaW50ZXJ2YWwgPDwgNCkgfAogCQlNVF9CRUFDT05fVElNRV9DRkdfVElNRVJfRU4gfAogCQlNVF9CRUFDT05fVElNRV9DRkdfU1lOQ19NT0RFIHwKIAkJTVRfQkVBQ09OX1RJTUVfQ0ZHX1RCVFRfRU47CkBAIC0zNDksOCArMzQ5LDggQEAKIAl1OCB6bWFjW0VUSF9BTEVOXSA9IHt9OwogCXUzMiBhdHRyOwogCi0JYXR0ciA9IE1UNzZfU0VUKE1UX1dDSURfQVRUUl9CU1NfSURYLCB2aWZfaWR4ICYgNykgfAotCSAgICAgICBNVDc2X1NFVChNVF9XQ0lEX0FUVFJfQlNTX0lEWF9FWFQsICEhKHZpZl9pZHggJiA4KSk7CisJYXR0ciA9IEZJRUxEX1BSRVAoTVRfV0NJRF9BVFRSX0JTU19JRFgsIHZpZl9pZHggJiA3KSB8CisJICAgICAgIEZJRUxEX1BSRVAoTVRfV0NJRF9BVFRSX0JTU19JRFhfRVhULCAhISh2aWZfaWR4ICYgOCkpOwogCiAJbXQ3Nl93cihkZXYsIE1UX1dDSURfQVRUUihpZHgpLCBhdHRyKTsKIApAQCAtMzgyLDE1ICszODIsMTUgQEAKIAlyY3VfcmVhZF91bmxvY2soKTsKIAogCW10NzYwMXVfd3IoZGV2LCBNVF9NQVhfTEVOX0NGRywgMHhhMGZmZiB8Ci0JCSAgIE1UNzZfU0VUKE1UX01BWF9MRU5fQ0ZHX0FNUERVLCBtaW5fZmFjdG9yKSk7CisJCSAgIEZJRUxEX1BSRVAoTVRfTUFYX0xFTl9DRkdfQU1QRFUsIG1pbl9mYWN0b3IpKTsKIH0KIAogc3RhdGljIHZvaWQKIG10NzZfbWFjX3Byb2Nlc3NfcmF0ZShzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHVzLCB1MTYgcmF0ZSkKIHsKLQl1OCBpZHggPSBNVDc2X0dFVChNVF9SWFdJX1JBVEVfTUNTLCByYXRlKTsKKwl1OCBpZHggPSBGSUVMRF9HRVQoTVRfUlhXSV9SQVRFX01DUywgcmF0ZSk7CiAKLQlzd2l0Y2ggKE1UNzZfR0VUKE1UX1JYV0lfUkFURV9QSFksIHJhdGUpKSB7CisJc3dpdGNoIChGSUVMRF9HRVQoTVRfUlhXSV9SQVRFX1BIWSwgcmF0ZSkpIHsKIAljYXNlIE1UX1BIWV9UWVBFX09GRE06CiAJCWlmIChXQVJOX09OKGlkeCA+PSA4KSkKIAkJCWlkeCA9IDA7CkBAIC00MzYsNyArNDM2LDcgQEAKIAkJCSAgdTE2IHJhdGUsIGludCByc3NpKQogewogCWRldi0+YmNuX2ZyZXFfb2ZmID0gcnh3aS0+ZnJlcV9vZmY7Ci0JZGV2LT5iY25fcGh5X21vZGUgPSBNVDc2X0dFVChNVF9SWFdJX1JBVEVfUEhZLCByYXRlKTsKKwlkZXYtPmJjbl9waHlfbW9kZSA9IEZJRUxEX0dFVChNVF9SWFdJX1JBVEVfUEhZLCByYXRlKTsKIAlkZXYtPmF2Z19yc3NpID0gKGRldi0+YXZnX3Jzc2kgKiAxNSkgLyAxNiArIChyc3NpIDw8IDgpOwogfQogCkBAIC00NTgsNyArNDU4LDcgQEAKIAl1MTYgcmF0ZSA9IGxlMTZfdG9fY3B1KHJ4d2ktPnJhdGUpOwogCWludCByc3NpOwogCi0JbGVuID0gTVQ3Nl9HRVQoTVRfUlhXSV9DVExfTVBEVV9MRU4sIGN0bCk7CisJbGVuID0gRklFTERfR0VUKE1UX1JYV0lfQ1RMX01QRFVfTEVOLCBjdGwpOwogCWlmIChsZW4gPCAxMCkKIAkJcmV0dXJuIDA7CiAKQEAgLTU0Miw4ICs1NDIsOCBAQAogCiAJdmFsID0gbXQ3NjAxdV9ycihkZXYsIE1UX1dDSURfQVRUUihpZHgpKTsKIAl2YWwgJj0gfk1UX1dDSURfQVRUUl9QS0VZX01PREUgJiB+TVRfV0NJRF9BVFRSX1BLRVlfTU9ERV9FWFQ7Ci0JdmFsIHw9IE1UNzZfU0VUKE1UX1dDSURfQVRUUl9QS0VZX01PREUsIGNpcGhlciAmIDcpIHwKLQkgICAgICAgTVQ3Nl9TRVQoTVRfV0NJRF9BVFRSX1BLRVlfTU9ERV9FWFQsIGNpcGhlciA+PiAzKTsKKwl2YWwgfD0gRklFTERfUFJFUChNVF9XQ0lEX0FUVFJfUEtFWV9NT0RFLCBjaXBoZXIgJiA3KSB8CisJICAgICAgIEZJRUxEX1BSRVAoTVRfV0NJRF9BVFRSX1BLRVlfTU9ERV9FWFQsIGNpcGhlciA+PiAzKTsKIAl2YWwgJj0gfk1UX1dDSURfQVRUUl9QQUlSV0lTRTsKIAl2YWwgfD0gTVRfV0NJRF9BVFRSX1BBSVJXSVNFICoKIAkJISEoa2V5ICYmIGtleS0+ZmxhZ3MgJiBJRUVFODAyMTFfS0VZX0ZMQUdfUEFJUldJU0UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L21haW4uYwppbmRleCBlNzBkZDk1Li40M2ViZDQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L21haW4uYwpAQCAtMTUsNyArMTUsNiBAQAogI2luY2x1ZGUgIm10NzYwMXUuaCIKICNpbmNsdWRlICJtYWMuaCIKICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KIAogc3RhdGljIGludCBtdDc2MDF1X3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9tY3UuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvbWN1LmMKaW5kZXggOTFjNGIzNC4uZGJkZmIzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9tY3UuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L21jdS5jCkBAIC00Myw4ICs0Myw4IEBACiAJCQkJCSAgICB1OCBzZXEsIGVudW0gbWN1X2NtZCBjbWQpCiB7CiAJV0FSTl9PTihtdDc2MDF1X2RtYV9za2Jfd3JhcChza2IsIENQVV9UWF9QT1JULCBETUFfQ09NTUFORCwKLQkJCQkgICAgIE1UNzZfU0VUKE1UX1RYRF9DTURfSU5GT19TRVEsIHNlcSkgfAotCQkJCSAgICAgTVQ3Nl9TRVQoTVRfVFhEX0NNRF9JTkZPX1RZUEUsIGNtZCkpKTsKKwkJCQkgICAgIEZJRUxEX1BSRVAoTVRfVFhEX0NNRF9JTkZPX1NFUSwgc2VxKSB8CisJCQkJICAgICBGSUVMRF9QUkVQKE1UX1RYRF9DTURfSU5GT19UWVBFLCBjbWQpKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmFjZV9tdF9tY3VfbXNnX3NlbmRfY3Moc3RydWN0IG10NzYwMXVfZGV2ICpkZXYsCkBAIC0xMDAsMTMgKzEwMCwxMyBAQAogCQkJZGV2X2VycihkZXYtPmRldiwgIkVycm9yOiBNQ1UgcmVzcCB1cmIgZmFpbGVkOiVkXG4iLAogCQkJCXVyYl9zdGF0dXMpOwogCi0JCWlmIChNVDc2X0dFVChNVF9SWERfQ01EX0lORk9fQ01EX1NFUSwgcnhmY2UpID09IHNlcSAmJgotCQkgICAgTVQ3Nl9HRVQoTVRfUlhEX0NNRF9JTkZPX0VWVF9UWVBFLCByeGZjZSkgPT0gQ01EX0RPTkUpCisJCWlmIChGSUVMRF9HRVQoTVRfUlhEX0NNRF9JTkZPX0NNRF9TRVEsIHJ4ZmNlKSA9PSBzZXEgJiYKKwkJICAgIEZJRUxEX0dFVChNVF9SWERfQ01EX0lORk9fRVZUX1RZUEUsIHJ4ZmNlKSA9PSBDTURfRE9ORSkKIAkJCXJldHVybiAwOwogCi0JCWRldl9lcnIoZGV2LT5kZXYsICJFcnJvcjogTUNVIHJlc3AgZXZ0OiVoaHggc2VxOiVoaHgtJWhoeCFcbiIsCi0JCQlNVDc2X0dFVChNVF9SWERfQ01EX0lORk9fRVZUX1RZUEUsIHJ4ZmNlKSwKLQkJCXNlcSwgTVQ3Nl9HRVQoTVRfUlhEX0NNRF9JTkZPX0NNRF9TRVEsIHJ4ZmNlKSk7CisJCWRldl9lcnIoZGV2LT5kZXYsICJFcnJvcjogTUNVIHJlc3AgZXZ0OiVseCBzZXE6JWhoeC0lbHghXG4iLAorCQkJRklFTERfR0VUKE1UX1JYRF9DTURfSU5GT19FVlRfVFlQRSwgcnhmY2UpLAorCQkJc2VxLCBGSUVMRF9HRVQoTVRfUlhEX0NNRF9JTkZPX0NNRF9TRVEsIHJ4ZmNlKSk7CiAJfQogCiAJZGV2X2VycihkZXYtPmRldiwgIkVycm9yOiAlcyB0aW1lZCBvdXRcbiIsIF9fZnVuY19fKTsKQEAgLTI5MSw5ICsyOTEsOSBAQAogCXUzMiB2YWw7CiAJaW50IHJldDsKIAotCXJlZyA9IGNwdV90b19sZTMyKE1UNzZfU0VUKE1UX1RYRF9JTkZPX1RZUEUsIERNQV9QQUNLRVQpIHwKLQkJCSAgTVQ3Nl9TRVQoTVRfVFhEX0lORk9fRF9QT1JULCBDUFVfVFhfUE9SVCkgfAotCQkJICBNVDc2X1NFVChNVF9UWERfSU5GT19MRU4sIGxlbikpOworCXJlZyA9IGNwdV90b19sZTMyKEZJRUxEX1BSRVAoTVRfVFhEX0lORk9fVFlQRSwgRE1BX1BBQ0tFVCkgfAorCQkJICBGSUVMRF9QUkVQKE1UX1RYRF9JTkZPX0RfUE9SVCwgQ1BVX1RYX1BPUlQpIHwKKwkJCSAgRklFTERfUFJFUChNVF9UWERfSU5GT19MRU4sIGxlbikpOwogCW1lbWNweShidWYuYnVmLCAmcmVnLCBzaXplb2YocmVnKSk7CiAJbWVtY3B5KGJ1Zi5idWYgKyBzaXplb2YocmVnKSwgZGF0YSwgbGVuKTsKIAltZW1zZXQoYnVmLmJ1ZiArIHNpemVvZihyZWcpICsgbGVuLCAwLCA4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvbXQ3NjAxdS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9tdDc2MDF1LmgKaW5kZXggNDI4YmQyZi4uYzdlYzQwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9tdDc2MDF1LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9tdDc2MDF1LmgKQEAgLTE1LDYgKzE1LDcgQEAKICNpZm5kZWYgTVQ3NjAxVV9ICiAjZGVmaW5lIE1UNzYwMVVfSAogCisjaW5jbHVkZSA8bGludXgvYml0ZmllbGQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgpAQCAtMjQsNyArMjUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KIAogI2luY2x1ZGUgInJlZ3MuaCIKLSNpbmNsdWRlICJ1dGlsLmgiCiAKICNkZWZpbmUgTVRfQ0FMSUJSQVRFX0lOVEVSVkFMCQkoNCAqIEhaKQogCkBAIC0yOTksNyArMjk5LDcgQEAKIAogLyogQ29tcGF0aWJpbGl0eSB3aXRoIG10NzYgKi8KICNkZWZpbmUgbXQ3Nl9ybXdfZmllbGQoX2RldiwgX3JlZywgX2ZpZWxkLCBfdmFsKQlcCi0JbXQ3Nl9ybXcoX2RldiwgX3JlZywgX2ZpZWxkLCBNVDc2X1NFVChfZmllbGQsIF92YWwpKQorCW10NzZfcm13KF9kZXYsIF9yZWcsIF9maWVsZCwgRklFTERfUFJFUChfZmllbGQsIF92YWwpKQogCiBzdGF0aWMgaW5saW5lIHUzMiBtdDc2X3JyKHN0cnVjdCBtdDc2MDF1X2RldiAqZGV2LCB1MzIgb2Zmc2V0KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9waHkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvcGh5LmMKaW5kZXggMTkwOGFmNi4uY2EwOWE1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L3BoeS5jCkBAIC00MSwxMSArNDEsMTIgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JbXQ3NjAxdV93cihkZXYsIE1UX1JGX0NTUl9DRkcsIE1UNzZfU0VUKE1UX1JGX0NTUl9DRkdfREFUQSwgdmFsdWUpIHwKLQkJCQkgICAgICAgTVQ3Nl9TRVQoTVRfUkZfQ1NSX0NGR19SRUdfQkFOSywgYmFuaykgfAotCQkJCSAgICAgICBNVDc2X1NFVChNVF9SRl9DU1JfQ0ZHX1JFR19JRCwgb2Zmc2V0KSB8Ci0JCQkJICAgICAgIE1UX1JGX0NTUl9DRkdfV1IgfAotCQkJCSAgICAgICBNVF9SRl9DU1JfQ0ZHX0tJQ0spOworCW10NzYwMXVfd3IoZGV2LCBNVF9SRl9DU1JfQ0ZHLAorCQkgICBGSUVMRF9QUkVQKE1UX1JGX0NTUl9DRkdfREFUQSwgdmFsdWUpIHwKKwkJICAgRklFTERfUFJFUChNVF9SRl9DU1JfQ0ZHX1JFR19CQU5LLCBiYW5rKSB8CisJCSAgIEZJRUxEX1BSRVAoTVRfUkZfQ1NSX0NGR19SRUdfSUQsIG9mZnNldCkgfAorCQkgICBNVF9SRl9DU1JfQ0ZHX1dSIHwKKwkJICAgTVRfUkZfQ1NSX0NGR19LSUNLKTsKIAl0cmFjZV9yZl93cml0ZShkZXYsIGJhbmssIG9mZnNldCwgdmFsdWUpOwogb3V0OgogCW11dGV4X3VubG9jaygmZGV2LT5yZWdfYXRvbWljX211dGV4KTsKQEAgLTc0LDE3ICs3NSwxOCBAQAogCWlmICghbXQ3Nl9wb2xsKGRldiwgTVRfUkZfQ1NSX0NGRywgTVRfUkZfQ1NSX0NGR19LSUNLLCAwLCAxMDApKQogCQlnb3RvIG91dDsKIAotCW10NzYwMXVfd3IoZGV2LCBNVF9SRl9DU1JfQ0ZHLCBNVDc2X1NFVChNVF9SRl9DU1JfQ0ZHX1JFR19CQU5LLCBiYW5rKSB8Ci0JCQkJICAgICAgIE1UNzZfU0VUKE1UX1JGX0NTUl9DRkdfUkVHX0lELCBvZmZzZXQpIHwKLQkJCQkgICAgICAgTVRfUkZfQ1NSX0NGR19LSUNLKTsKKwltdDc2MDF1X3dyKGRldiwgTVRfUkZfQ1NSX0NGRywKKwkJICAgRklFTERfUFJFUChNVF9SRl9DU1JfQ0ZHX1JFR19CQU5LLCBiYW5rKSB8CisJCSAgIEZJRUxEX1BSRVAoTVRfUkZfQ1NSX0NGR19SRUdfSUQsIG9mZnNldCkgfAorCQkgICBNVF9SRl9DU1JfQ0ZHX0tJQ0spOwogCiAJaWYgKCFtdDc2X3BvbGwoZGV2LCBNVF9SRl9DU1JfQ0ZHLCBNVF9SRl9DU1JfQ0ZHX0tJQ0ssIDAsIDEwMCkpCiAJCWdvdG8gb3V0OwogCiAJdmFsID0gbXQ3NjAxdV9ycihkZXYsIE1UX1JGX0NTUl9DRkcpOwotCWlmIChNVDc2X0dFVChNVF9SRl9DU1JfQ0ZHX1JFR19JRCwgdmFsKSA9PSBvZmZzZXQgJiYKLQkgICAgTVQ3Nl9HRVQoTVRfUkZfQ1NSX0NGR19SRUdfQkFOSywgdmFsKSA9PSBiYW5rKSB7Ci0JCXJldCA9IE1UNzZfR0VUKE1UX1JGX0NTUl9DRkdfREFUQSwgdmFsKTsKKwlpZiAoRklFTERfR0VUKE1UX1JGX0NTUl9DRkdfUkVHX0lELCB2YWwpID09IG9mZnNldCAmJgorCSAgICBGSUVMRF9HRVQoTVRfUkZfQ1NSX0NGR19SRUdfQkFOSywgdmFsKSA9PSBiYW5rKSB7CisJCXJldCA9IEZJRUxEX0dFVChNVF9SRl9DU1JfQ0ZHX0RBVEEsIHZhbCk7CiAJCXRyYWNlX3JmX3JlYWQoZGV2LCBiYW5rLCBvZmZzZXQsIHJldCk7CiAJfQogb3V0OgpAQCAtMTM5LDggKzE0MSw4IEBACiAJfQogCiAJbXQ3NjAxdV93cihkZXYsIE1UX0JCUF9DU1JfQ0ZHLAotCQkgICBNVDc2X1NFVChNVF9CQlBfQ1NSX0NGR19WQUwsIHZhbCkgfAotCQkgICBNVDc2X1NFVChNVF9CQlBfQ1NSX0NGR19SRUdfTlVNLCBvZmZzZXQpIHwKKwkJICAgRklFTERfUFJFUChNVF9CQlBfQ1NSX0NGR19WQUwsIHZhbCkgfAorCQkgICBGSUVMRF9QUkVQKE1UX0JCUF9DU1JfQ0ZHX1JFR19OVU0sIG9mZnNldCkgfAogCQkgICBNVF9CQlBfQ1NSX0NGR19SV19NT0RFIHwgTVRfQkJQX0NTUl9DRkdfQlVTWSk7CiAJdHJhY2VfYmJwX3dyaXRlKGRldiwgb2Zmc2V0LCB2YWwpOwogb3V0OgpAQCAtMTYzLDcgKzE2NSw3IEBACiAJCWdvdG8gb3V0OwogCiAJbXQ3NjAxdV93cihkZXYsIE1UX0JCUF9DU1JfQ0ZHLAotCQkgICBNVDc2X1NFVChNVF9CQlBfQ1NSX0NGR19SRUdfTlVNLCBvZmZzZXQpIHwKKwkJICAgRklFTERfUFJFUChNVF9CQlBfQ1NSX0NGR19SRUdfTlVNLCBvZmZzZXQpIHwKIAkJICAgTVRfQkJQX0NTUl9DRkdfUldfTU9ERSB8IE1UX0JCUF9DU1JfQ0ZHX0JVU1kgfAogCQkgICBNVF9CQlBfQ1NSX0NGR19SRUFEKTsKIApAQCAtMTcxLDggKzE3Myw4IEBACiAJCWdvdG8gb3V0OwogCiAJdmFsID0gbXQ3NjAxdV9ycihkZXYsIE1UX0JCUF9DU1JfQ0ZHKTsKLQlpZiAoTVQ3Nl9HRVQoTVRfQkJQX0NTUl9DRkdfUkVHX05VTSwgdmFsKSA9PSBvZmZzZXQpIHsKLQkJcmV0ID0gTVQ3Nl9HRVQoTVRfQkJQX0NTUl9DRkdfVkFMLCB2YWwpOworCWlmIChGSUVMRF9HRVQoTVRfQkJQX0NTUl9DRkdfUkVHX05VTSwgdmFsKSA9PSBvZmZzZXQpIHsKKwkJcmV0ID0gRklFTERfR0VUKE1UX0JCUF9DU1JfQ0ZHX1ZBTCwgdmFsKTsKIAkJdHJhY2VfYmJwX3JlYWQoZGV2LCBvZmZzZXQsIHJldCk7CiAJfQogb3V0OgpAQCAtMjQ5LDkgKzI1MSw5IEBACiAJCQkvKiBidzQwICovIHsgLTIsIDE2LCAzNCB9CiAJCX0KIAl9OwotCWludCBidyA9IE1UNzZfR0VUKE1UX1JYV0lfUkFURV9CVywgcmF0ZSk7Ci0JaW50IGF1eF9sbmEgPSBNVDc2X0dFVChNVF9SWFdJX0FOVF9BVVhfTE5BLCByeHdpLT5hbnQpOwotCWludCBsbmFfaWQgPSBNVDc2X0dFVChNVF9SWFdJX0dBSU5fUlNTSV9MTkFfSUQsIHJ4d2ktPmdhaW4pOworCWludCBidyA9IEZJRUxEX0dFVChNVF9SWFdJX1JBVEVfQlcsIHJhdGUpOworCWludCBhdXhfbG5hID0gRklFTERfR0VUKE1UX1JYV0lfQU5UX0FVWF9MTkEsIHJ4d2ktPmFudCk7CisJaW50IGxuYV9pZCA9IEZJRUxEX0dFVChNVF9SWFdJX0dBSU5fUlNTSV9MTkFfSUQsIHJ4d2ktPmdhaW4pOwogCWludCB2YWw7CiAKIAlpZiAobG5hX2lkKSAvKiBMTkEgaWQgY2FuIGJlIDAsIDIsIDMuICovCkBAIC0yNTksNyArMjYxLDcgQEAKIAogCXZhbCA9IDg7CiAJdmFsIC09IGxuYVthdXhfbG5hXVtid11bbG5hX2lkXTsKLQl2YWwgLT0gTVQ3Nl9HRVQoTVRfUlhXSV9HQUlOX1JTU0lfVkFMLCByeHdpLT5nYWluKTsKKwl2YWwgLT0gRklFTERfR0VUKE1UX1JYV0lfR0FJTl9SU1NJX1ZBTCwgcnh3aS0+Z2Fpbik7CiAJdmFsIC09IGRldi0+ZWUtPmxuYV9nYWluOwogCXZhbCAtPSBkZXYtPmVlLT5yc3NpX29mZnNldFswXTsKIApAQCAtOTM5LDcgKzk0MSw3IEBACiAJZGV2X2RiZyhkZXYtPmRldiwgImZpbmFsIGRpZmY6ICUwOHhcbiIsIGRpZmZfcHdyKTsKIAogCXZhbCA9IG10NzYwMXVfcnIoZGV2LCBNVF9UWF9BTENfQ0ZHXzEpOwotCWN1cnJfcHdyID0gczZfdG9faW50KE1UNzZfR0VUKE1UX1RYX0FMQ19DRkdfMV9URU1QX0NPTVAsIHZhbCkpOworCWN1cnJfcHdyID0gczZfdG9faW50KEZJRUxEX0dFVChNVF9UWF9BTENfQ0ZHXzFfVEVNUF9DT01QLCB2YWwpKTsKIAlkaWZmX3B3ciArPSBjdXJyX3B3cjsKIAl2YWwgPSAodmFsICYgfk1UX1RYX0FMQ19DRkdfMV9URU1QX0NPTVApIHwgaW50X3RvX3M2KGRpZmZfcHdyKTsKIAltdDc2MDF1X3dyKGRldiwgTVRfVFhfQUxDX0NGR18xLCB2YWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9yZWdzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L3JlZ3MuaAppbmRleCBhZmQ4OTc4Li4yN2E0MjlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L3JlZ3MuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L3JlZ3MuaApAQCAtMTcsMTAgKzE3LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogCi0jaWZuZGVmIEdFTk1BU0sKLSNkZWZpbmUgR0VOTUFTSyhoLCBsKSAgICAgICAoKChVMzJfQygxKSA8PCAoKGgpIC0gKGwpICsgMSkpIC0gMSkgPDwgKGwpKQotI2VuZGlmCi0KICNkZWZpbmUgTVRfQVNJQ19WRVJTSU9OCQkJMHgwMDAwCiAKICNkZWZpbmUgTVQ3NlhYX1JFVl9FMwkJMHgyMgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS90eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS90eC5jCmluZGV4IGEwYTMzZGMuLmFkNzdiZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvdHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L3R4LmMKQEAgLTE3NSwxMSArMTc1LDEyIEBACiAJCWJhX3NpemUgPSBtaW5fdChpbnQsIDYzLCBiYV9zaXplKTsKIAkJaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9SQVRFX0NUUkxfUFJPQkUpCiAJCQliYV9zaXplID0gMDsKLQkJdHh3aS0+YWNrX2N0bCB8PSBNVDc2X1NFVChNVF9UWFdJX0FDS19DVExfQkFfV0lORE9XLCBiYV9zaXplKTsKKwkJdHh3aS0+YWNrX2N0bCB8PSBGSUVMRF9QUkVQKE1UX1RYV0lfQUNLX0NUTF9CQV9XSU5ET1csIGJhX3NpemUpOwogCi0JCXR4d2ktPmZsYWdzID0gY3B1X3RvX2xlMTYoTVRfVFhXSV9GTEFHU19BTVBEVSB8Ci0JCQkJCSAgTVQ3Nl9TRVQoTVRfVFhXSV9GTEFHU19NUERVX0RFTlNJVFksCi0JCQkJCQkgICBzdGEtPmh0X2NhcC5hbXBkdV9kZW5zaXR5KSk7CisJCXR4d2ktPmZsYWdzID0KKwkJCWNwdV90b19sZTE2KE1UX1RYV0lfRkxBR1NfQU1QRFUgfAorCQkJCSAgICBGSUVMRF9QUkVQKE1UX1RYV0lfRkxBR1NfTVBEVV9ERU5TSVRZLAorCQkJCQkgICAgICAgc3RhLT5odF9jYXAuYW1wZHVfZGVuc2l0eSkpOwogCQlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX1JBVEVfQ1RSTF9QUk9CRSkKIAkJCXR4d2ktPmZsYWdzID0gMDsKIAl9CkBAIC0xODgsNyArMTg5LDcgQEAKIAogCWlzX3Byb2JlID0gISEoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX1JBVEVfQ1RSTF9QUk9CRSk7CiAJcGt0X2lkID0gbXQ3NjAxdV90eF9wa3RpZF9lbmMoZGV2LCByYXRlX2N0bCAmIDB4NywgaXNfcHJvYmUpOwotCXBrdF9sZW4gfD0gTVQ3Nl9TRVQoTVRfVFhXSV9MRU5fUEtUSUQsIHBrdF9pZCk7CisJcGt0X2xlbiB8PSBGSUVMRF9QUkVQKE1UX1RYV0lfTEVOX1BLVElELCBwa3RfaWQpOwogCXR4d2ktPmxlbl9jdGwgPSBjcHVfdG9fbGUxNihwa3RfbGVuKTsKIAogCXJldHVybiB0eHdpOwpAQCAtMjg1LDkgKzI4Niw5IEBACiAJV0FSTl9PTihjd19taW4gPiAweGYpOwogCVdBUk5fT04oY3dfbWF4ID4gMHhmKTsKIAotCXZhbCA9IE1UNzZfU0VUKE1UX0VEQ0FfQ0ZHX0FJRlNOLCBwYXJhbXMtPmFpZnMpIHwKLQkgICAgICBNVDc2X1NFVChNVF9FRENBX0NGR19DV01JTiwgY3dfbWluKSB8Ci0JICAgICAgTVQ3Nl9TRVQoTVRfRURDQV9DRkdfQ1dNQVgsIGN3X21heCk7CisJdmFsID0gRklFTERfUFJFUChNVF9FRENBX0NGR19BSUZTTiwgcGFyYW1zLT5haWZzKSB8CisJICAgICAgRklFTERfUFJFUChNVF9FRENBX0NGR19DV01JTiwgY3dfbWluKSB8CisJICAgICAgRklFTERfUFJFUChNVF9FRENBX0NGR19DV01BWCwgY3dfbWF4KTsKIAkvKiBUT0RPOiBiYXNlZCBvbiB1c2VyLWNvbnRyb2xsZWQgRW5hYmxlVHhCdXJzdCB2YXIgdmVuZG9yIGRydiBzZXRzCiAJICoJIGEgcmVhbGx5IGxvbmcgdHhvcCBvbiBBQzAgKHNlZSBjb25uZWN0LmM6MjAwOSkgYnV0IG9ubHkgb24KIAkgKgkgY29ubmVjdD8gV2hlbiBub3QgY29ubmVjdGVkIHNob3VsZCBiZSAwLgpAQCAtMjk1LDcgKzI5Niw3IEBACiAJaWYgKCFod19xKQogCQl2YWwgfD0gMHg2MDsKIAllbHNlCi0JCXZhbCB8PSBNVDc2X1NFVChNVF9FRENBX0NGR19UWE9QLCBwYXJhbXMtPnR4b3ApOworCQl2YWwgfD0gRklFTERfUFJFUChNVF9FRENBX0NGR19UWE9QLCBwYXJhbXMtPnR4b3ApOwogCW10NzZfd3IoZGV2LCBNVF9FRENBX0NGR19BQyhod19xKSwgdmFsKTsKIAogCXZhbCA9IG10NzZfcnIoZGV2LCBNVF9XTU1fVFhPUChod19xKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L3V0aWwuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvdXRpbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODkxNDBiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvdXRpbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBGZWxpeCBGaWV0a2F1IDxuYmRAb3BlbndydC5vcmc+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgLSAyMDA5IEl2byB2YW4gRG9vcm4gPEl2RG9vcm5AZ21haWwuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX19NVDc2X1VUSUxfSAotI2RlZmluZSBfX01UNzZfVVRJTF9ICi0KLS8qCi0gKiBQb3dlciBvZiB0d28gY2hlY2ssIHRoaXMgd2lsbCBjaGVjawotICogaWYgdGhlIG1hc2sgdGhhdCBoYXMgYmVlbiBnaXZlbiBjb250YWlucyBhbmQgY29udGlndW91cyBzZXQgb2YgYml0cy4KLSAqIE5vdGUgdGhhdCB3ZSBjYW5ub3QgdXNlIHRoZSBpc19wb3dlcl9vZl8yKCkgZnVuY3Rpb24gc2luY2UgdGhpcwotICogY2hlY2sgbXVzdCBiZSBkb25lIGF0IGNvbXBpbGUtdGltZS4KLSAqLwotI2RlZmluZSBpc19wb3dlcl9vZl90d28oeCkJKCAhKCh4KSAmICgoeCktMSkpICkKLSNkZWZpbmUgbG93X2JpdF9tYXNrKHgpCQkoICgoeCktMSkgJiB+KHgpICkKLSNkZWZpbmUgaXNfdmFsaWRfbWFzayh4KQlpc19wb3dlcl9vZl90d28oMUxVICsgKHgpICsgbG93X2JpdF9tYXNrKHgpKQotCi0vKgotICogTWFjcm9zIHRvIGZpbmQgZmlyc3Qgc2V0IGJpdCBpbiBhIHZhcmlhYmxlLgotICogVGhlc2UgbWFjcm9zIGJlaGF2ZSB0aGUgc2FtZSBhcyB0aGUgX19mZnMoKSBmdW5jdGlvbnMgYnV0Ci0gKiB0aGUgbW9zdCBpbXBvcnRhbnQgZGlmZmVyZW5jZSB0aGF0IHRoaXMgaXMgZG9uZSBkdXJpbmcKLSAqIGNvbXBpbGUtdGltZSByYXRoZXIgdGhlbiBydW4tdGltZS4KLSAqLwotI2RlZmluZSBjb21waWxlX2ZmczIoX194KSBcCi0JX19idWlsdGluX2Nob29zZV9leHByKCgoX194KSAmIDB4MSksIDAsIDEpCi0KLSNkZWZpbmUgY29tcGlsZV9mZnM0KF9feCkgXAotCV9fYnVpbHRpbl9jaG9vc2VfZXhwcigoKF9feCkgJiAweDMpLCBcCi0JCQkgICAgICAoY29tcGlsZV9mZnMyKChfX3gpKSksIFwKLQkJCSAgICAgIChjb21waWxlX2ZmczIoKF9feCkgPj4gMikgKyAyKSkKLQotI2RlZmluZSBjb21waWxlX2ZmczgoX194KSBcCi0JX19idWlsdGluX2Nob29zZV9leHByKCgoX194KSAmIDB4ZiksIFwKLQkJCSAgICAgIChjb21waWxlX2ZmczQoKF9feCkpKSwgXAotCQkJICAgICAgKGNvbXBpbGVfZmZzNCgoX194KSA+PiA0KSArIDQpKQotCi0jZGVmaW5lIGNvbXBpbGVfZmZzMTYoX194KSBcCi0JX19idWlsdGluX2Nob29zZV9leHByKCgoX194KSAmIDB4ZmYpLCBcCi0JCQkgICAgICAoY29tcGlsZV9mZnM4KChfX3gpKSksIFwKLQkJCSAgICAgIChjb21waWxlX2ZmczgoKF9feCkgPj4gOCkgKyA4KSkKLQotI2RlZmluZSBjb21waWxlX2ZmczMyKF9feCkgXAotCV9fYnVpbHRpbl9jaG9vc2VfZXhwcigoKF9feCkgJiAweGZmZmYpLCBcCi0JCQkgICAgICAoY29tcGlsZV9mZnMxNigoX194KSkpLCBcCi0JCQkgICAgICAoY29tcGlsZV9mZnMxNigoX194KSA+PiAxNikgKyAxNikpCi0KLS8qCi0gKiBUaGlzIG1hY3JvIHdpbGwgY2hlY2sgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIEZJRUxEezgsMTYsMzJ9IG1hY3JvcwotICogVGhlIG1hc2sgc2hvdWxkIGJlIGEgY29uc3RhbnQgbm9uLXplcm8gY29udGlndW91cyBzZXQgb2YgYml0cyB3aGljaAotICogZG9lcyBub3QgZXhjZWVkIHRoZSBnaXZlbiB0eXBlbGltaXQuCi0gKi8KLSNkZWZpbmUgRklFTERfQ0hFQ0soX19tYXNrKSBcCi0JQlVJTERfQlVHX09OKCEoX19tYXNrKSB8fCAhaXNfdmFsaWRfbWFzayhfX21hc2spKQotCi0jZGVmaW5lIE1UNzZfU0VUKF9tYXNrLCBfdmFsKQkJCQkJCVwKLQkoewkJCQkJCQkJXAotCQlGSUVMRF9DSEVDSyhfbWFzayk7CQkJCQlcCi0JCSgoKHUzMikgKF92YWwpKSA8PCBjb21waWxlX2ZmczMyKF9tYXNrKSkgJiBfbWFzazsJXAotCX0pCi0KLSNkZWZpbmUgTVQ3Nl9HRVQoX21hc2ssIF92YWwpCQkJCQkJXAotCSh7CQkJCQkJCQlcCi0JCUZJRUxEX0NIRUNLKF9tYXNrKTsJCQkJCVwKLQkJKHUzMikgKCgoX3ZhbCkgJiBfbWFzaykgPj4gY29tcGlsZV9mZnMzMihfbWFzaykpOwlcCi0JfSkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yYWxpbmsvcnQyeDAwL3J0MngwMHVzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmFsaW5rL3J0MngwMC9ydDJ4MDB1c2IuYwppbmRleCA3Y2YyNmM2Li42MDA1ZTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yYWxpbmsvcnQyeDAwL3J0MngwMHVzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JhbGluay9ydDJ4MDAvcnQyeDAwdXNiLmMKQEAgLTgzMSw4ICs4MzEsMTAgQEAKIAlydDJ4MDBkZXYtPmFuY2hvciA9IGRldm1fa21hbGxvYygmdXNiX2Rldi0+ZGV2LAogCQkJCQlzaXplb2Yoc3RydWN0IHVzYl9hbmNob3IpLAogCQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXJ0MngwMGRldi0+YW5jaG9yKQorCWlmICghcnQyeDAwZGV2LT5hbmNob3IpIHsKKwkJcmV0dmFsID0gLUVOT01FTTsKIAkJZ290byBleGl0X2ZyZWVfcmVnOworCX0KIAogCWluaXRfdXNiX2FuY2hvcihydDJ4MDBkZXYtPmFuY2hvcik7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bDh4eHh1L3J0bDh4eHh1LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bDh4eHh1L3J0bDh4eHh1LmgKaW5kZXggNDM0MWQ1Ni4uMTAxNjYyODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHUuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bDh4eHh1L3J0bDh4eHh1LmgKQEAgLTI5LDYgKzI5LDcgQEAKICNkZWZpbmUgUlRMOFhYWFVfREVCVUdfSDJDCQkweDgwMAogI2RlZmluZSBSVEw4WFhYVV9ERUJVR19BQ1RJT04JCTB4MTAwMAogI2RlZmluZSBSVEw4WFhYVV9ERUJVR19FRlVTRQkJMHgyMDAwCisjZGVmaW5lIFJUTDhYWFhVX0RFQlVHX0lOVEVSUlVQVAkweDQwMDAKIAogI2RlZmluZSBSVFdfVVNCX0NPTlRST0xfTVNHX1RJTUVPVVQJNTAwCiAjZGVmaW5lIFJUTDhYWFhVX01BWF9SRUdfUE9MTAkJNTAwCkBAIC00Myw2ICs0NCw3IEBACiAKICNkZWZpbmUgVFhfVE9UQUxfUEFHRV9OVU0JCTB4ZjgKICNkZWZpbmUgVFhfVE9UQUxfUEFHRV9OVU1fODE5MkUJCTB4ZjMKKyNkZWZpbmUgVFhfVE9UQUxfUEFHRV9OVU1fODcyM0IJCTB4ZjcKIC8qIChIUFEgKyBMUFEgKyBOUFEgKyBQVUJRKSA9IFRYX1RPVEFMX1BBR0VfTlVNICovCiAjZGVmaW5lIFRYX1BBR0VfTlVNX1BVQlEJCTB4ZTcKICNkZWZpbmUgVFhfUEFHRV9OVU1fSElfUFEJCTB4MGMKQEAgLTU0LDYgKzU2LDExIEBACiAjZGVmaW5lIFRYX1BBR0VfTlVNX0xPX1BRXzgxOTJFCQkweDBjCiAjZGVmaW5lIFRYX1BBR0VfTlVNX05PUk1fUFFfODE5MkUJMHgwMAogCisjZGVmaW5lIFRYX1BBR0VfTlVNX1BVQlFfODcyM0IJCTB4ZTcKKyNkZWZpbmUgVFhfUEFHRV9OVU1fSElfUFFfODcyM0IJCTB4MGMKKyNkZWZpbmUgVFhfUEFHRV9OVU1fTE9fUFFfODcyM0IJCTB4MDIKKyNkZWZpbmUgVFhfUEFHRV9OVU1fTk9STV9QUV84NzIzQgkweDAyCisKICNkZWZpbmUgUlRMX0ZXX1BBR0VfU0laRQkJNDA5NgogI2RlZmluZSBSVEw4WFhYVV9GSVJNV0FSRV9QT0xMX01BWAkxMDAwCiAKQEAgLTEzMTIsNyArMTMxOSw3IEBACiAJaW50ICgqcG93ZXJfb24pIChzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdik7CiAJdm9pZCAoKnBvd2VyX29mZikgKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KTsKIAl2b2lkICgqcmVzZXRfODA1MSkgKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KTsKLQlpbnQgKCpsbHRfaW5pdCkgKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2LCB1OCBsYXN0X3R4X3BhZ2UpOworCWludCAoKmxsdF9pbml0KSAoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYpOwogCXZvaWQgKCppbml0X3BoeV9iYikgKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KTsKIAlpbnQgKCppbml0X3BoeV9yZikgKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KTsKIAl2b2lkICgqcGh5X2luaXRfYW50ZW5uYV9zZWxlY3Rpb24pIChzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdik7CkBAIC0xMzMwLDExICsxMzM3LDE3IEBACiAJCQkJICB1MzIgcmFtYXNrLCBpbnQgc2dpKTsKIAl2b2lkICgqcmVwb3J0X2Nvbm5lY3QpIChzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdiwKIAkJCQl1OCBtYWNpZCwgYm9vbCBjb25uZWN0KTsKKwl2b2lkICgqZmlsbF90eGRlc2MpIChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkJICAgICBzdHJ1Y3QgcnRsOHh4eHVfdHhkZXNjMzIgKnR4X2Rlc2MsIHUzMiByYXRlLAorCQkJICAgICB1MTYgcmF0ZV9mbGFnLCBib29sIHNnaSwgYm9vbCBzaG9ydF9wcmVhbWJsZSwKKwkJCSAgICAgYm9vbCBhbXBkdV9lbmFibGUpOwogCWludCB3cml0ZU5fYmxvY2tfc2l6ZTsKIAlpbnQgcnhfYWdnX2J1Zl9zaXplOwogCWNoYXIgdHhfZGVzY19zaXplOwogCWNoYXIgcnhfZGVzY19zaXplOwotCWNoYXIgaGFzX3MwczE7CisJdTggaGFzX3MwczE6MTsKKwl1OCBoYXNfdHhfcmVwb3J0OjE7CisJdTggZ2VuMl90aGVybWFsX21ldGVyOjE7CiAJdTMyIGFkZGFfMXRfaW5pdDsKIAl1MzIgYWRkYV8xdF9wYXRoX29uOwogCXUzMiBhZGRhXzJ0X3BhdGhfb25fYTsKQEAgLTEzODgsMTQgKzE0MDEsMTQgQEAKIHZvaWQgcnRsOHh4eHVfZmlybXdhcmVfc2VsZl9yZXNldChzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdik7CiB2b2lkIHJ0bDh4eHh1X3Bvd2VyX29mZihzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdik7CiB2b2lkIHJ0bDh4eHh1X3Jlc2V0XzgwNTEoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYpOwotaW50IHJ0bDh4eHh1X2F1dG9fbGx0X3RhYmxlKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2LCB1OCBsYXN0X3R4X3BhZ2UpOworaW50IHJ0bDh4eHh1X2F1dG9fbGx0X3RhYmxlKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KTsKIHZvaWQgcnRsOHh4eHVfZ2VuMl9wcmVwYXJlX2NhbGlicmF0ZShzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdiwgdTggc3RhcnQpOwogaW50IHJ0bDh4eHh1X2ZsdXNoX2ZpZm8oc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYpOwogaW50IHJ0bDh4eHh1X2dlbjJfaDJjX2NtZChzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdiwKIAkJCSAgc3RydWN0IGgyY19jbWQgKmgyYywgaW50IGxlbik7CiBpbnQgcnRsOHh4eHVfYWN0aXZlX3RvX2xwcyhzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdik7CiB2b2lkIHJ0bDh4eHh1X2Rpc2FibGVkX3RvX2VtdShzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdik7Ci1pbnQgcnRsOHh4eHVfaW5pdF9sbHRfdGFibGUoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYsIHU4IGxhc3RfdHhfcGFnZSk7CitpbnQgcnRsOHh4eHVfaW5pdF9sbHRfdGFibGUoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYpOwogdm9pZCBydGw4eHh4dV9nZW4xX3BoeV9pcV9jYWxpYnJhdGUoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYpOwogdm9pZCBydGw4eHh4dV9nZW4xX2luaXRfcGh5X2JiKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KTsKIHZvaWQgcnRsOHh4eHVfZ2VuMV9zZXRfdHhfcG93ZXIoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYsCkBAIC0xNDIxLDYgKzE0MzQsMTQgQEAKIGludCBydGw4eHh4dV9nZW4yX2NoYW5uZWxfdG9fZ3JvdXAoaW50IGNoYW5uZWwpOwogYm9vbCBydGw4eHh4dV9nZW4yX3NpbXVsYXJpdHlfY29tcGFyZShzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdiwKIAkJCQkgICAgICBpbnQgcmVzdWx0W11bOF0sIGludCBjMSwgaW50IGMyKTsKK3ZvaWQgcnRsOHh4eHVfZmlsbF90eGRlc2NfdjEoc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKKwkJCSAgICAgc3RydWN0IHJ0bDh4eHh1X3R4ZGVzYzMyICp0eF9kZXNjLCB1MzIgcmF0ZSwKKwkJCSAgICAgdTE2IHJhdGVfZmxhZywgYm9vbCBzZ2ksIGJvb2wgc2hvcnRfcHJlYW1ibGUsCisJCQkgICAgIGJvb2wgYW1wZHVfZW5hYmxlKTsKK3ZvaWQgcnRsOHh4eHVfZmlsbF90eGRlc2NfdjIoc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKKwkJCSAgICAgc3RydWN0IHJ0bDh4eHh1X3R4ZGVzYzMyICp0eF9kZXNjMzIsIHUzMiByYXRlLAorCQkJICAgICB1MTYgcmF0ZV9mbGFnLCBib29sIHNnaSwgYm9vbCBzaG9ydF9wcmVhbWJsZSwKKwkJCSAgICAgYm9vbCBhbXBkdV9lbmFibGUpOwogCiBleHRlcm4gc3RydWN0IHJ0bDh4eHh1X2ZpbGVvcHMgcnRsODE5MmN1X2ZvcHM7CiBleHRlcm4gc3RydWN0IHJ0bDh4eHh1X2ZpbGVvcHMgcnRsODE5MmV1X2ZvcHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bDh4eHh1L3J0bDh4eHh1XzgxOTJjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bDh4eHh1L3J0bDh4eHh1XzgxOTJjLmMKaW5kZXggNjlkMWExNC4uZjllMjA1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGw4eHh4dS9ydGw4eHh4dV84MTkyYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfODE5MmMuYwpAQCAtNTY3LDYgKzU2Nyw3IEBACiAJLnNldF90eF9wb3dlciA9IHJ0bDh4eHh1X2dlbjFfc2V0X3R4X3Bvd2VyLAogCS51cGRhdGVfcmF0ZV9tYXNrID0gcnRsOHh4eHVfdXBkYXRlX3JhdGVfbWFzaywKIAkucmVwb3J0X2Nvbm5lY3QgPSBydGw4eHh4dV9nZW4xX3JlcG9ydF9jb25uZWN0LAorCS5maWxsX3R4ZGVzYyA9IHJ0bDh4eHh1X2ZpbGxfdHhkZXNjX3YxLAogCS53cml0ZU5fYmxvY2tfc2l6ZSA9IDEyOCwKIAkucnhfYWdnX2J1Zl9zaXplID0gMTYwMDAsCiAJLnR4X2Rlc2Nfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcnRsOHh4eHVfdHhkZXNjMzIpLApAQCAtNTc5LDUgKzU4MCw5IEBACiAJLnBicF9yeCA9IFBCUF9QQUdFX1NJWkVfMTI4LAogCS5wYnBfdHggPSBQQlBfUEFHRV9TSVpFXzEyOCwKIAkubWFjdGFibGUgPSBydGw4eHh4dV9nZW4xX21hY19pbml0X3RhYmxlLAorCS50b3RhbF9wYWdlX251bSA9IFRYX1RPVEFMX1BBR0VfTlVNLAorCS5wYWdlX251bV9oaSA9IFRYX1BBR0VfTlVNX0hJX1BRLAorCS5wYWdlX251bV9sbyA9IFRYX1BBR0VfTlVNX0xPX1BRLAorCS5wYWdlX251bV9ub3JtID0gVFhfUEFHRV9OVU1fTk9STV9QUSwKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfODE5MmUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfODE5MmUuYwppbmRleCA5YTE5OTRmLi5kZjU0ZDI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bDh4eHh1L3J0bDh4eHh1XzgxOTJlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGw4eHh4dS9ydGw4eHh4dV84MTkyZS5jCkBAIC0xMzk2LDYgKzEzOTYsMTE0IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBydGw4MTkyZXVfYWN0aXZlX3RvX2xwcyhzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcHJpdi0+dWRldi0+ZGV2OworCXU4IHZhbDg7CisJdTE2IHZhbDE2OworCXUzMiB2YWwzMjsKKwlpbnQgcmV0cnksIHJldHZhbDsKKworCXJ0bDh4eHh1X3dyaXRlOChwcml2LCBSRUdfVFhQQVVTRSwgMHhmZik7CisKKwlyZXRyeSA9IDEwMDsKKwlyZXR2YWwgPSAtRUJVU1k7CisJLyoKKwkgKiBQb2xsIDMyIGJpdCB3aWRlIDB4MDVmOCBmb3IgMHgwMDAwMDAwMCB0byBlbnN1cmUgbm8gVFggaXMgcGVuZGluZy4KKwkgKi8KKwlkbyB7CisJCXZhbDMyID0gcnRsOHh4eHVfcmVhZDMyKHByaXYsIFJFR19TQ0hfVFhfQ01EKTsKKwkJaWYgKCF2YWwzMikgeworCQkJcmV0dmFsID0gMDsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAocmV0cnktLSk7CisKKwlpZiAoIXJldHJ5KSB7CisJCWRldl93YXJuKGRldiwgIkZhaWxlZCB0byBmbHVzaCBUWCBxdWV1ZVxuIik7CisJCXJldHZhbCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogRGlzYWJsZSBDQ0sgYW5kIE9GRE0sIGNsb2NrIGdhdGVkICovCisJdmFsOCA9IHJ0bDh4eHh1X3JlYWQ4KHByaXYsIFJFR19TWVNfRlVOQyk7CisJdmFsOCAmPSB+U1lTX0ZVTkNfQkJSU1RCOworCXJ0bDh4eHh1X3dyaXRlOChwcml2LCBSRUdfU1lTX0ZVTkMsIHZhbDgpOworCisJdWRlbGF5KDIpOworCisJLyogUmVzZXQgd2hvbGUgQkIgKi8KKwl2YWw4ID0gcnRsOHh4eHVfcmVhZDgocHJpdiwgUkVHX1NZU19GVU5DKTsKKwl2YWw4ICY9IH5TWVNfRlVOQ19CQl9HTEJfUlNUTjsKKwlydGw4eHh4dV93cml0ZTgocHJpdiwgUkVHX1NZU19GVU5DLCB2YWw4KTsKKworCS8qIFJlc2V0IE1BQyBUUlggKi8KKwl2YWwxNiA9IHJ0bDh4eHh1X3JlYWQxNihwcml2LCBSRUdfQ1IpOworCXZhbDE2ICY9IDB4ZmYwMDsKKwl2YWwxNiB8PSAoQ1JfSENJX1RYRE1BX0VOQUJMRSB8IENSX0hDSV9SWERNQV9FTkFCTEUpOworCXJ0bDh4eHh1X3dyaXRlMTYocHJpdiwgUkVHX0NSLCB2YWwxNik7CisKKwl2YWwxNiA9IHJ0bDh4eHh1X3JlYWQxNihwcml2LCBSRUdfQ1IpOworCXZhbDE2ICY9IH5DUl9TRUNVUklUWV9FTkFCTEU7CisJcnRsOHh4eHVfd3JpdGUxNihwcml2LCBSRUdfQ1IsIHZhbDE2KTsKKworCXZhbDggPSBydGw4eHh4dV9yZWFkOChwcml2LCBSRUdfRFVBTF9UU0ZfUlNUKTsKKwl2YWw4IHw9IERVQUxfVFNGX1RYX09LOworCXJ0bDh4eHh1X3dyaXRlOChwcml2LCBSRUdfRFVBTF9UU0ZfUlNULCB2YWw4KTsKKworb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgcnRsODE5MmV1X2FjdGl2ZV90b19lbXUoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYpCit7CisJdTggdmFsODsKKwlpbnQgY291bnQsIHJldCA9IDA7CisKKwkvKiBUdXJuIG9mZiBSRiAqLworCXJ0bDh4eHh1X3dyaXRlOChwcml2LCBSRUdfUkZfQ1RSTCwgMCk7CisKKwkvKiBTd2l0Y2ggRFBEVF9TRUxfUCBvdXRwdXQgZnJvbSByZWdpc3RlciAweDY1WzJdICovCisJdmFsOCA9IHJ0bDh4eHh1X3JlYWQ4KHByaXYsIFJFR19MRURDRkcyKTsKKwl2YWw4ICY9IH5MRURDRkcyX0RQRFRfU0VMRUNUOworCXJ0bDh4eHh1X3dyaXRlOChwcml2LCBSRUdfTEVEQ0ZHMiwgdmFsOCk7CisKKwkvKiAweDAwMDVbMV0gPSAxIHR1cm4gb2ZmIE1BQyBieSBIVyBzdGF0ZSBtYWNoaW5lKi8KKwl2YWw4ID0gcnRsOHh4eHVfcmVhZDgocHJpdiwgUkVHX0FQU19GU01DTyArIDEpOworCXZhbDggfD0gQklUKDEpOworCXJ0bDh4eHh1X3dyaXRlOChwcml2LCBSRUdfQVBTX0ZTTUNPICsgMSwgdmFsOCk7CisKKwlmb3IgKGNvdW50ID0gUlRMOFhYWFVfTUFYX1JFR19QT0xMOyBjb3VudDsgY291bnQtLSkgeworCQl2YWw4ID0gcnRsOHh4eHVfcmVhZDgocHJpdiwgUkVHX0FQU19GU01DTyArIDEpOworCQlpZiAoKHZhbDggJiBCSVQoMSkpID09IDApCisJCQlicmVhazsKKwkJdWRlbGF5KDEwKTsKKwl9CisKKwlpZiAoIWNvdW50KSB7CisJCWRldl93YXJuKCZwcml2LT51ZGV2LT5kZXYsICIlczogRGlzYWJsaW5nIE1BQyB0aW1lZCBvdXRcbiIsCisJCQkgX19mdW5jX18pOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXhpdDsKKwl9CisKK2V4aXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBydGw4MTkyZXVfZW11X3RvX2Rpc2FibGVkKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KQoreworCXU4IHZhbDg7CisKKwkvKiAweDA0WzEyOjExXSA9IDAxIGVuYWJsZSBXTCBzdXNwZW5kICovCisJdmFsOCA9IHJ0bDh4eHh1X3JlYWQ4KHByaXYsIFJFR19BUFNfRlNNQ08gKyAxKTsKKwl2YWw4ICY9IH4oQklUKDMpIHwgQklUKDQpKTsKKwl2YWw4IHw9IEJJVCgzKTsKKwlydGw4eHh4dV93cml0ZTgocHJpdiwgUkVHX0FQU19GU01DTyArIDEsIHZhbDgpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgcnRsODE5MmV1X3Bvd2VyX29uKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KQogewogCXUxNiB2YWwxNjsKQEAgLTE0NDYsNiArMTU1NCw0MCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3ZvaWQgcnRsODE5MmV1X3Bvd2VyX29mZihzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdikKK3sKKwl1OCB2YWw4OworCXUxNiB2YWwxNjsKKworCXJ0bDh4eHh1X2ZsdXNoX2ZpZm8ocHJpdik7CisKKwl2YWw4ID0gcnRsOHh4eHVfcmVhZDgocHJpdiwgUkVHX1RYX1JFUE9SVF9DVFJMKTsKKwl2YWw4ICY9IH5UWF9SRVBPUlRfQ1RSTF9USU1FUl9FTkFCTEU7CisJcnRsOHh4eHVfd3JpdGU4KHByaXYsIFJFR19UWF9SRVBPUlRfQ1RSTCwgdmFsOCk7CisKKwkvKiBUdXJuIG9mZiBSRiAqLworCXJ0bDh4eHh1X3dyaXRlOChwcml2LCBSRUdfUkZfQ1RSTCwgMHgwMCk7CisKKwlydGw4MTkyZXVfYWN0aXZlX3RvX2xwcyhwcml2KTsKKworCS8qIFJlc2V0IEZpcm13YXJlIGlmIHJ1bm5pbmcgaW4gUkFNICovCisJaWYgKHJ0bDh4eHh1X3JlYWQ4KHByaXYsIFJFR19NQ1VfRldfREwpICYgTUNVX0ZXX1JBTV9TRUwpCisJCXJ0bDh4eHh1X2Zpcm13YXJlX3NlbGZfcmVzZXQocHJpdik7CisKKwkvKiBSZXNldCBNQ1UgKi8KKwl2YWwxNiA9IHJ0bDh4eHh1X3JlYWQxNihwcml2LCBSRUdfU1lTX0ZVTkMpOworCXZhbDE2ICY9IH5TWVNfRlVOQ19DUFVfRU5BQkxFOworCXJ0bDh4eHh1X3dyaXRlMTYocHJpdiwgUkVHX1NZU19GVU5DLCB2YWwxNik7CisKKwkvKiBSZXNldCBNQ1UgcmVhZHkgc3RhdHVzICovCisJcnRsOHh4eHVfd3JpdGU4KHByaXYsIFJFR19NQ1VfRldfREwsIDB4MDApOworCisJcnRsOHh4eHVfcmVzZXRfODA1MShwcml2KTsKKworCXJ0bDgxOTJldV9hY3RpdmVfdG9fZW11KHByaXYpOworCXJ0bDgxOTJldV9lbXVfdG9fZGlzYWJsZWQocHJpdik7Cit9CisKIHN0YXRpYyB2b2lkIHJ0bDgxOTJlX2VuYWJsZV9yZihzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdikKIHsKIAl1MzIgdmFsMzI7CkBAIC0xNDg3LDcgKzE2MjksNyBAQAogCS5wYXJzZV9lZnVzZSA9IHJ0bDgxOTJldV9wYXJzZV9lZnVzZSwKIAkubG9hZF9maXJtd2FyZSA9IHJ0bDgxOTJldV9sb2FkX2Zpcm13YXJlLAogCS5wb3dlcl9vbiA9IHJ0bDgxOTJldV9wb3dlcl9vbiwKLQkucG93ZXJfb2ZmID0gcnRsOHh4eHVfcG93ZXJfb2ZmLAorCS5wb3dlcl9vZmYgPSBydGw4MTkyZXVfcG93ZXJfb2ZmLAogCS5yZXNldF84MDUxID0gcnRsOHh4eHVfcmVzZXRfODA1MSwKIAkubGx0X2luaXQgPSBydGw4eHh4dV9hdXRvX2xsdF90YWJsZSwKIAkuaW5pdF9waHlfYmIgPSBydGw4MTkyZXVfaW5pdF9waHlfYmIsCkBAIC0xNTAxLDEwICsxNjQzLDEyIEBACiAJLnNldF90eF9wb3dlciA9IHJ0bDgxOTJlX3NldF90eF9wb3dlciwKIAkudXBkYXRlX3JhdGVfbWFzayA9IHJ0bDh4eHh1X2dlbjJfdXBkYXRlX3JhdGVfbWFzaywKIAkucmVwb3J0X2Nvbm5lY3QgPSBydGw4eHh4dV9nZW4yX3JlcG9ydF9jb25uZWN0LAorCS5maWxsX3R4ZGVzYyA9IHJ0bDh4eHh1X2ZpbGxfdHhkZXNjX3YyLAogCS53cml0ZU5fYmxvY2tfc2l6ZSA9IDEyOCwKIAkudHhfZGVzY19zaXplID0gc2l6ZW9mKHN0cnVjdCBydGw4eHh4dV90eGRlc2M0MCksCiAJLnJ4X2Rlc2Nfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcnRsOHh4eHVfcnhkZXNjMjQpLAogCS5oYXNfczBzMSA9IDAsCisJLmdlbjJfdGhlcm1hbF9tZXRlciA9IDEsCiAJLmFkZGFfMXRfaW5pdCA9IDB4MGZjMDE2MTYsCiAJLmFkZGFfMXRfcGF0aF9vbiA9IDB4MGZjMDE2MTYsCiAJLmFkZGFfMnRfcGF0aF9vbl9hID0gMHgwZmMwMTYxNiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfODcyM2EuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfODcyM2EuYwppbmRleCA2ODZjNTUxLi5hZWYzNzMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bDh4eHh1L3J0bDh4eHh1Xzg3MjNhLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGw4eHh4dS9ydGw4eHh4dV84NzIzYS5jCkBAIC0zODQsNiArMzg0LDcgQEAKIAkuc2V0X3R4X3Bvd2VyID0gcnRsOHh4eHVfZ2VuMV9zZXRfdHhfcG93ZXIsCiAJLnVwZGF0ZV9yYXRlX21hc2sgPSBydGw4eHh4dV91cGRhdGVfcmF0ZV9tYXNrLAogCS5yZXBvcnRfY29ubmVjdCA9IHJ0bDh4eHh1X2dlbjFfcmVwb3J0X2Nvbm5lY3QsCisJLmZpbGxfdHhkZXNjID0gcnRsOHh4eHVfZmlsbF90eGRlc2NfdjEsCiAJLndyaXRlTl9ibG9ja19zaXplID0gMTAyNCwKIAkucnhfYWdnX2J1Zl9zaXplID0gMTYwMDAsCiAJLnR4X2Rlc2Nfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcnRsOHh4eHVfdHhkZXNjMzIpLApAQCAtMzk2LDQgKzM5Nyw4IEBACiAJLnBicF9yeCA9IFBCUF9QQUdFX1NJWkVfMTI4LAogCS5wYnBfdHggPSBQQlBfUEFHRV9TSVpFXzEyOCwKIAkubWFjdGFibGUgPSBydGw4eHh4dV9nZW4xX21hY19pbml0X3RhYmxlLAorCS50b3RhbF9wYWdlX251bSA9IFRYX1RPVEFMX1BBR0VfTlVNLAorCS5wYWdlX251bV9oaSA9IFRYX1BBR0VfTlVNX0hJX1BRLAorCS5wYWdlX251bV9sbyA9IFRYX1BBR0VfTlVNX0xPX1BRLAorCS5wYWdlX251bV9ub3JtID0gVFhfUEFHRV9OVU1fTk9STV9QUSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bDh4eHh1L3J0bDh4eHh1Xzg3MjNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bDh4eHh1L3J0bDh4eHh1Xzg3MjNiLmMKaW5kZXggOWQ0NWFmYi4uNmMwODZiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGw4eHh4dS9ydGw4eHh4dV84NzIzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfODcyM2IuYwpAQCAtMTY2MiwxMCArMTY2MiwxMyBAQAogCS5zZXRfdHhfcG93ZXIgPSBydGw4NzIzYl9zZXRfdHhfcG93ZXIsCiAJLnVwZGF0ZV9yYXRlX21hc2sgPSBydGw4eHh4dV9nZW4yX3VwZGF0ZV9yYXRlX21hc2ssCiAJLnJlcG9ydF9jb25uZWN0ID0gcnRsOHh4eHVfZ2VuMl9yZXBvcnRfY29ubmVjdCwKKwkuZmlsbF90eGRlc2MgPSBydGw4eHh4dV9maWxsX3R4ZGVzY192MiwKIAkud3JpdGVOX2Jsb2NrX3NpemUgPSAxMDI0LAogCS50eF9kZXNjX3NpemUgPSBzaXplb2Yoc3RydWN0IHJ0bDh4eHh1X3R4ZGVzYzQwKSwKIAkucnhfZGVzY19zaXplID0gc2l6ZW9mKHN0cnVjdCBydGw4eHh4dV9yeGRlc2MyNCksCiAJLmhhc19zMHMxID0gMSwKKwkuaGFzX3R4X3JlcG9ydCA9IDEsCisJLmdlbjJfdGhlcm1hbF9tZXRlciA9IDEsCiAJLmFkZGFfMXRfaW5pdCA9IDB4MDFjMDAwMTQsCiAJLmFkZGFfMXRfcGF0aF9vbiA9IDB4MDFjMDAwMTQsCiAJLmFkZGFfMnRfcGF0aF9vbl9hID0gMHgwMWMwMDAxNCwKQEAgLTE2NzQsNCArMTY3Nyw4IEBACiAJLnBicF9yeCA9IFBCUF9QQUdFX1NJWkVfMjU2LAogCS5wYnBfdHggPSBQQlBfUEFHRV9TSVpFXzI1NiwKIAkubWFjdGFibGUgPSBydGw4NzIzYl9tYWNfaW5pdF90YWJsZSwKKwkudG90YWxfcGFnZV9udW0gPSBUWF9UT1RBTF9QQUdFX05VTV84NzIzQiwKKwkucGFnZV9udW1faGkgPSBUWF9QQUdFX05VTV9ISV9QUV84NzIzQiwKKwkucGFnZV9udW1fbG8gPSBUWF9QQUdFX05VTV9MT19QUV84NzIzQiwKKwkucGFnZV9udW1fbm9ybSA9IFRYX1BBR0VfTlVNX05PUk1fUFFfODcyM0IsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGw4eHh4dS9ydGw4eHh4dV9jb3JlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bDh4eHh1L3J0bDh4eHh1X2NvcmUuYwppbmRleCA3NzA0OGRiLi5iMmQ3ZjZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bDh4eHh1L3J0bDh4eHh1X2NvcmUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bDh4eHh1L3J0bDh4eHh1X2NvcmUuYwpAQCAtODk0LDcgKzg5NCw3IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotaW50CitzdGF0aWMgaW50CiBydGw4eHh4dV9nZW4xX2gyY19jbWQoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYsIHN0cnVjdCBoMmNfY21kICpoMmMsIGludCBsZW4pCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnByaXYtPnVkZXYtPmRldjsKQEAgLTI0NzIsMTAgKzI0NzIsMTMgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgcnRsOHh4eHVfaW5pdF9sbHRfdGFibGUoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYsIHU4IGxhc3RfdHhfcGFnZSkKK2ludCBydGw4eHh4dV9pbml0X2xsdF90YWJsZShzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdikKIHsKIAlpbnQgcmV0OwogCWludCBpOworCXU4IGxhc3RfdHhfcGFnZTsKKworCWxhc3RfdHhfcGFnZSA9IHByaXYtPmZvcHMtPnRvdGFsX3BhZ2VfbnVtOwogCiAJZm9yIChpID0gMDsgaSA8IGxhc3RfdHhfcGFnZTsgaSsrKSB7CiAJCXJldCA9IHJ0bDh4eHh1X2xsdF93cml0ZShwcml2LCBpLCBpICsgMSk7CkBAIC0yNTAzLDcgKzI1MDYsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBydGw4eHh4dV9hdXRvX2xsdF90YWJsZShzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdiwgdTggbGFzdF90eF9wYWdlKQoraW50IHJ0bDh4eHh1X2F1dG9fbGx0X3RhYmxlKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KQogewogCXUzMiB2YWwzMjsKIAlpbnQgcmV0ID0gMDsKQEAgLTM4NDcsMjggKzM4NTAsNiBAQAogCXJ0bDh4eHh1X3dyaXRlMzIocHJpdiwgUkVHX1JYX1dBSVRfQ0NBLCB2YWwzMik7CiB9CiAKLXN0YXRpYyB2b2lkIHJ0bDh4eHh1X29sZF9pbml0X3F1ZXVlX3Jlc2VydmVkX3BhZ2Uoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYpCi17Ci0JdTggdmFsODsKLQl1MzIgdmFsMzI7Ci0KLQlpZiAocHJpdi0+ZXBfdHhfbm9ybWFsX3F1ZXVlKQotCQl2YWw4ID0gVFhfUEFHRV9OVU1fTk9STV9QUTsKLQllbHNlCi0JCXZhbDggPSAwOwotCi0JcnRsOHh4eHVfd3JpdGU4KHByaXYsIFJFR19SUVBOX05QUSwgdmFsOCk7Ci0KLQl2YWwzMiA9IChUWF9QQUdFX05VTV9QVUJRIDw8IFJRUE5fUFVCX1BRX1NISUZUKSB8IFJRUE5fTE9BRDsKLQotCWlmIChwcml2LT5lcF90eF9oaWdoX3F1ZXVlKQotCQl2YWwzMiB8PSAoVFhfUEFHRV9OVU1fSElfUFEgPDwgUlFQTl9ISV9QUV9TSElGVCk7Ci0JaWYgKHByaXYtPmVwX3R4X2xvd19xdWV1ZSkKLQkJdmFsMzIgfD0gKFRYX1BBR0VfTlVNX0xPX1BRIDw8IFJRUE5fTE9fUFFfU0hJRlQpOwotCi0JcnRsOHh4eHVfd3JpdGUzMihwcml2LCBSRUdfUlFQTiwgdmFsMzIpOwotfQotCiBzdGF0aWMgdm9pZCBydGw4eHh4dV9pbml0X3F1ZXVlX3Jlc2VydmVkX3BhZ2Uoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IHJ0bDh4eHh1X2ZpbGVvcHMgKmZvcHMgPSBwcml2LT5mb3BzOwpAQCAtMzg5MSw3ICszODcyLDcgQEAKIAl2YWwzMiA9IChucSA8PCBSUVBOX05QUV9TSElGVCkgfCAoZXEgPDwgUlFQTl9FUFFfU0hJRlQpOwogCXJ0bDh4eHh1X3dyaXRlMzIocHJpdiwgUkVHX1JRUE5fTlBRLCB2YWwzMik7CiAKLQlwdWJxID0gZm9wcy0+dG90YWxfcGFnZV9udW0gLSBocSAtIGxxIC0gbnE7CisJcHVicSA9IGZvcHMtPnRvdGFsX3BhZ2VfbnVtIC0gaHEgLSBscSAtIG5xIC0gMTsKIAogCXZhbDMyID0gUlFQTl9MT0FEOwogCXZhbDMyIHw9IChocSA8PCBSUVBOX0hJX1BRX1NISUZUKTsKQEAgLTM5MDUsNiArMzg4Niw3IEBACiB7CiAJc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYgPSBody0+cHJpdjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcHJpdi0+dWRldi0+ZGV2OworCXN0cnVjdCBydGw4eHh4dV9maWxlb3BzICpmb3BzID0gcHJpdi0+Zm9wczsKIAlib29sIG1hY3Bvd2VyOwogCWludCByZXQ7CiAJdTggdmFsODsKQEAgLTM5MjMsMTggKzM5MDUsMTQgQEAKIAllbHNlCiAJCW1hY3Bvd2VyID0gdHJ1ZTsKIAotCXJldCA9IHByaXYtPmZvcHMtPnBvd2VyX29uKHByaXYpOworCXJldCA9IGZvcHMtPnBvd2VyX29uKHByaXYpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl93YXJuKGRldiwgIiVzOiBGYWlsZWQgcG93ZXIgb25cbiIsIF9fZnVuY19fKTsKIAkJZ290byBleGl0OwogCX0KIAotCWlmICghbWFjcG93ZXIpIHsKLQkJaWYgKHByaXYtPmZvcHMtPnRvdGFsX3BhZ2VfbnVtKQotCQkJcnRsOHh4eHVfaW5pdF9xdWV1ZV9yZXNlcnZlZF9wYWdlKHByaXYpOwotCQllbHNlCi0JCQlydGw4eHh4dV9vbGRfaW5pdF9xdWV1ZV9yZXNlcnZlZF9wYWdlKHByaXYpOwotCX0KKwlpZiAoIW1hY3Bvd2VyKQorCQlydGw4eHh4dV9pbml0X3F1ZXVlX3Jlc2VydmVkX3BhZ2UocHJpdik7CiAKIAlyZXQgPSBydGw4eHh4dV9pbml0X3F1ZXVlX3ByaW9yaXR5KHByaXYpOwogCWRldl9kYmcoZGV2LCAiJXM6IGluaXRfcXVldWVfcHJpb3JpdHkgJWlcbiIsIF9fZnVuY19fLCByZXQpOwpAQCAtMzk0NCwxOSArMzkyMiwxOSBAQAogCS8qCiAJICogU2V0IFJYIHBhZ2UgYm91bmRhcnkKIAkgKi8KLQlydGw4eHh4dV93cml0ZTE2KHByaXYsIFJFR19UUlhGRl9CTkRZICsgMiwgcHJpdi0+Zm9wcy0+dHJ4ZmZfYm91bmRhcnkpOworCXJ0bDh4eHh1X3dyaXRlMTYocHJpdiwgUkVHX1RSWEZGX0JORFkgKyAyLCBmb3BzLT50cnhmZl9ib3VuZGFyeSk7CiAKIAlyZXQgPSBydGw4eHh4dV9kb3dubG9hZF9maXJtd2FyZShwcml2KTsKLQlkZXZfZGJnKGRldiwgIiVzOiBkb3dubG9hZF9maXdtYXJlICVpXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwlkZXZfZGJnKGRldiwgIiVzOiBkb3dubG9hZF9maXJtd2FyZSAlaVxuIiwgX19mdW5jX18sIHJldCk7CiAJaWYgKHJldCkKIAkJZ290byBleGl0OwogCXJldCA9IHJ0bDh4eHh1X3N0YXJ0X2Zpcm13YXJlKHByaXYpOwotCWRldl9kYmcoZGV2LCAiJXM6IHN0YXJ0X2Zpd21hcmUgJWlcbiIsIF9fZnVuY19fLCByZXQpOworCWRldl9kYmcoZGV2LCAiJXM6IHN0YXJ0X2Zpcm13YXJlICVpXG4iLCBfX2Z1bmNfXywgcmV0KTsKIAlpZiAocmV0KQogCQlnb3RvIGV4aXQ7CiAKLQlpZiAocHJpdi0+Zm9wcy0+cGh5X2luaXRfYW50ZW5uYV9zZWxlY3Rpb24pCi0JCXByaXYtPmZvcHMtPnBoeV9pbml0X2FudGVubmFfc2VsZWN0aW9uKHByaXYpOworCWlmIChmb3BzLT5waHlfaW5pdF9hbnRlbm5hX3NlbGVjdGlvbikKKwkJZm9wcy0+cGh5X2luaXRfYW50ZW5uYV9zZWxlY3Rpb24ocHJpdik7CiAKIAlyZXQgPSBydGw4eHh4dV9pbml0X21hYyhwcml2KTsKIApAQCAtMzk2OSw3ICszOTQ3LDcgQEAKIAlpZiAocmV0KQogCQlnb3RvIGV4aXQ7CiAKLQlyZXQgPSBwcml2LT5mb3BzLT5pbml0X3BoeV9yZihwcml2KTsKKwlyZXQgPSBmb3BzLT5pbml0X3BoeV9yZihwcml2KTsKIAlpZiAocmV0KQogCQlnb3RvIGV4aXQ7CiAKQEAgLTM5OTQsMTMgKzM5NzIsNyBAQAogCQkvKgogCQkgKiBTZXQgVFggYnVmZmVyIGJvdW5kYXJ5CiAJCSAqLwotCQlpZiAocHJpdi0+cnRsX2NoaXAgPT0gUlRMODE5MkUpCi0JCQl2YWw4ID0gVFhfVE9UQUxfUEFHRV9OVU1fODE5MkUgKyAxOwotCQllbHNlCi0JCQl2YWw4ID0gVFhfVE9UQUxfUEFHRV9OVU0gKyAxOwotCi0JCWlmIChwcml2LT5ydGxfY2hpcCA9PSBSVEw4NzIzQikKLQkJCXZhbDggLT0gMTsKKwkJdmFsOCA9IGZvcHMtPnRvdGFsX3BhZ2VfbnVtICsgMTsKIAogCQlydGw4eHh4dV93cml0ZTgocHJpdiwgUkVHX1RYUEtUQlVGX0JDTlFfQkROWSwgdmFsOCk7CiAJCXJ0bDh4eHh1X3dyaXRlOChwcml2LCBSRUdfVFhQS1RCVUZfTUdRX0JETlksIHZhbDgpOwpAQCAtNDAxMywxNCArMzk4NSwxNCBAQAogCSAqIFRoZSB2ZW5kb3IgZHJpdmVycyBzZXQgUEJQIGZvciBhbGwgZGV2aWNlcywgZXhjZXB0IDgxOTJlLgogCSAqIFRoZXJlIGlzIG5vIGV4cGxhbmF0aW9uIGZvciB0aGlzIGluIGFueSBvZiB0aGUgc291cmNlcy4KIAkgKi8KLQl2YWw4ID0gKHByaXYtPmZvcHMtPnBicF9yeCA8PCBQQlBfUEFHRV9TSVpFX1JYX1NISUZUKSB8Ci0JCShwcml2LT5mb3BzLT5wYnBfdHggPDwgUEJQX1BBR0VfU0laRV9UWF9TSElGVCk7CisJdmFsOCA9IChmb3BzLT5wYnBfcnggPDwgUEJQX1BBR0VfU0laRV9SWF9TSElGVCkgfAorCQkoZm9wcy0+cGJwX3R4IDw8IFBCUF9QQUdFX1NJWkVfVFhfU0hJRlQpOwogCWlmIChwcml2LT5ydGxfY2hpcCAhPSBSVEw4MTkyRSkKIAkJcnRsOHh4eHVfd3JpdGU4KHByaXYsIFJFR19QQlAsIHZhbDgpOwogCiAJZGV2X2RiZyhkZXYsICIlczogbWFjcG93ZXIgJWlcbiIsIF9fZnVuY19fLCBtYWNwb3dlcik7CiAJaWYgKCFtYWNwb3dlcikgewotCQlyZXQgPSBwcml2LT5mb3BzLT5sbHRfaW5pdChwcml2LCBUWF9UT1RBTF9QQUdFX05VTSk7CisJCXJldCA9IGZvcHMtPmxsdF9pbml0KHByaXYpOwogCQlpZiAocmV0KSB7CiAJCQlkZXZfd2FybihkZXYsICIlczogTExUIHRhYmxlIGluaXQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiAJCQlnb3RvIGV4aXQ7CkBAIC00MDI5LDEzICs0MDAxLDEyIEBACiAJCS8qCiAJCSAqIENoaXAgc3BlY2lmaWMgcXVpcmtzCiAJCSAqLwotCQlwcml2LT5mb3BzLT51c2JfcXVpcmtzKHByaXYpOworCQlmb3BzLT51c2JfcXVpcmtzKHByaXYpOwogCiAJCS8qCi0JCSAqIFByZXN1bWFibHkgdGhpcyBpcyBmb3IgODE4OEVVIGFzIHdlbGwKLQkJICogRW5hYmxlIFRYIHJlcG9ydCBhbmQgVFggcmVwb3J0IHRpbWVyCisJCSAqIEVuYWJsZSBUWCByZXBvcnQgYW5kIFRYIHJlcG9ydCB0aW1lciBmb3IgODcyM2J1LzgxODhldS8uLi4KIAkJICovCi0JCWlmIChwcml2LT5ydGxfY2hpcCA9PSBSVEw4NzIzQikgeworCQlpZiAoZm9wcy0+aGFzX3R4X3JlcG9ydCkgewogCQkJdmFsOCA9IHJ0bDh4eHh1X3JlYWQ4KHByaXYsIFJFR19UWF9SRVBPUlRfQ1RSTCk7CiAJCQl2YWw4IHw9IFRYX1JFUE9SVF9DVFJMX1RJTUVSX0VOQUJMRTsKIAkJCXJ0bDh4eHh1X3dyaXRlOChwcml2LCBSRUdfVFhfUkVQT1JUX0NUUkwsIHZhbDgpOwpAQCAtNDE3MCw4ICs0MTQxLDggQEAKIAkJcnRsOHh4eHVfd3JpdGU4KHByaXYsIFJFR19SU1ZfQ1RSTCwgdmFsOCk7CiAJfQogCi0JaWYgKHByaXYtPmZvcHMtPmluaXRfYWdncmVnYXRpb24pCi0JCXByaXYtPmZvcHMtPmluaXRfYWdncmVnYXRpb24ocHJpdik7CisJaWYgKGZvcHMtPmluaXRfYWdncmVnYXRpb24pCisJCWZvcHMtPmluaXRfYWdncmVnYXRpb24ocHJpdik7CiAKIAkvKgogCSAqIEVuYWJsZSBDQ0sgYW5kIE9GRE0gYmxvY2sKQEAgLTQxODgsNyArNDE1OSw3IEBACiAJLyoKIAkgKiBTdGFydCBvdXQgd2l0aCBkZWZhdWx0IHBvd2VyIGxldmVscyBmb3IgY2hhbm5lbCA2LCAyME1IegogCSAqLwotCXByaXYtPmZvcHMtPnNldF90eF9wb3dlcihwcml2LCAxLCBmYWxzZSk7CisJZm9wcy0+c2V0X3R4X3Bvd2VyKHByaXYsIDEsIGZhbHNlKTsKIAogCS8qIExldCB0aGUgODA1MSB0YWtlIGNvbnRyb2wgb2YgYW50ZW5uYSBzZXR0aW5nICovCiAJaWYgKHByaXYtPnJ0bF9jaGlwICE9IFJUTDgxOTJFKSB7CkBAIC00MjA0LDggKzQxNzUsOCBAQAogCiAJcnRsOHh4eHVfd3JpdGUxNihwcml2LCBSRUdfRkFTVF9FRENBX0NUUkwsIDApOwogCi0JaWYgKHByaXYtPmZvcHMtPmluaXRfc3RhdGlzdGljcykKLQkJcHJpdi0+Zm9wcy0+aW5pdF9zdGF0aXN0aWNzKHByaXYpOworCWlmIChmb3BzLT5pbml0X3N0YXRpc3RpY3MpCisJCWZvcHMtPmluaXRfc3RhdGlzdGljcyhwcml2KTsKIAogCWlmIChwcml2LT5ydGxfY2hpcCA9PSBSVEw4MTkyRSkgewogCQkvKgpAQCAtNDIyMywxMiArNDE5NCwxMiBAQAogCiAJcnRsODcyM2FfcGh5X2xjX2NhbGlicmF0ZShwcml2KTsKIAotCXByaXYtPmZvcHMtPnBoeV9pcV9jYWxpYnJhdGUocHJpdik7CisJZm9wcy0+cGh5X2lxX2NhbGlicmF0ZShwcml2KTsKIAogCS8qCiAJICogVGhpcyBzaG91bGQgZW5hYmxlIHRoZXJtYWwgbWV0ZXIKIAkgKi8KLQlpZiAocHJpdi0+Zm9wcy0+dHhfZGVzY19zaXplID09IHNpemVvZihzdHJ1Y3QgcnRsOHh4eHVfdHhkZXNjNDApKQorCWlmIChmb3BzLT5nZW4yX3RoZXJtYWxfbWV0ZXIpCiAJCXJ0bDh4eHh1X3dyaXRlX3JmcmVnKHByaXYsCiAJCQkJICAgICBSRl9BLCBSRjYwNTJfUkVHX1RfTUVURVJfODcyM0IsIDB4MzdjZjgpOwogCWVsc2UKQEAgLTQ3ODMsNiArNDc1NCwxMTMgQEAKIAl9CiB9CiAKKy8qCisgKiBGaWxsIGluIHYxIChnZW4xKSBzcGVjaWZpYyBUWCBkZXNjcmlwdG9yIGJpdHMuCisgKiBUaGlzIGZvcm1hdCBpcyB1c2VkIG9uIDgxODhjdS84MTkyY3UvODcyM2F1CisgKi8KK3ZvaWQKK3J0bDh4eHh1X2ZpbGxfdHhkZXNjX3YxKHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCisJCQlzdHJ1Y3QgcnRsOHh4eHVfdHhkZXNjMzIgKnR4X2Rlc2MsIHUzMiByYXRlLAorCQkJdTE2IHJhdGVfZmxhZywgYm9vbCBzZ2ksIGJvb2wgc2hvcnRfcHJlYW1ibGUsCisJCQlib29sIGFtcGR1X2VuYWJsZSkKK3sKKwl1MTYgc2VxX251bWJlcjsKKworCXNlcV9udW1iZXIgPSBJRUVFODAyMTFfU0VRX1RPX1NOKGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0cmwpKTsKKworCXR4X2Rlc2MtPnR4ZHc1ID0gY3B1X3RvX2xlMzIocmF0ZSk7CisKKwlpZiAoaWVlZTgwMjExX2lzX2RhdGEoaGRyLT5mcmFtZV9jb250cm9sKSkKKwkJdHhfZGVzYy0+dHhkdzUgfD0gY3B1X3RvX2xlMzIoMHgwMDAxZmYwMCk7CisKKwl0eF9kZXNjLT50eGR3MyA9IGNwdV90b19sZTMyKCh1MzIpc2VxX251bWJlciA8PCBUWERFU0MzMl9TRVFfU0hJRlQpOworCisJaWYgKGFtcGR1X2VuYWJsZSkKKwkJdHhfZGVzYy0+dHhkdzEgfD0gY3B1X3RvX2xlMzIoVFhERVNDMzJfQUdHX0VOQUJMRSk7CisJZWxzZQorCQl0eF9kZXNjLT50eGR3MSB8PSBjcHVfdG9fbGUzMihUWERFU0MzMl9BR0dfQlJFQUspOworCisJaWYgKGllZWU4MDIxMV9pc19tZ210KGhkci0+ZnJhbWVfY29udHJvbCkpIHsKKwkJdHhfZGVzYy0+dHhkdzUgPSBjcHVfdG9fbGUzMihyYXRlKTsKKwkJdHhfZGVzYy0+dHhkdzQgfD0gY3B1X3RvX2xlMzIoVFhERVNDMzJfVVNFX0RSSVZFUl9SQVRFKTsKKwkJdHhfZGVzYy0+dHhkdzUgfD0gY3B1X3RvX2xlMzIoNiA8PCBUWERFU0MzMl9SRVRSWV9MSU1JVF9TSElGVCk7CisJCXR4X2Rlc2MtPnR4ZHc1IHw9IGNwdV90b19sZTMyKFRYREVTQzMyX1JFVFJZX0xJTUlUX0VOQUJMRSk7CisJfQorCisJaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhoZHItPmZyYW1lX2NvbnRyb2wpKQorCQl0eF9kZXNjLT50eGR3NCB8PSBjcHVfdG9fbGUzMihUWERFU0MzMl9RT1MpOworCisJaWYgKHNob3J0X3ByZWFtYmxlKQorCQl0eF9kZXNjLT50eGR3NCB8PSBjcHVfdG9fbGUzMihUWERFU0MzMl9TSE9SVF9QUkVBTUJMRSk7CisKKwlpZiAoc2dpKQorCQl0eF9kZXNjLT50eGR3NSB8PSBjcHVfdG9fbGUzMihUWERFU0MzMl9TSE9SVF9HSSk7CisKKwlpZiAocmF0ZV9mbGFnICYgSUVFRTgwMjExX1RYX1JDX1VTRV9SVFNfQ1RTKSB7CisJCS8qCisJCSAqIFVzZSBSVFMgcmF0ZSAyNE0gLSBkb2VzIHRoZSBtYWM4MDIxMSB0ZWxsCisJCSAqIHVzIHdoaWNoIHRvIHVzZT8KKwkJICovCisJCXR4X2Rlc2MtPnR4ZHc0IHw9IGNwdV90b19sZTMyKERFU0NfUkFURV8yNE0gPDwKKwkJCQkJICAgICAgVFhERVNDMzJfUlRTX1JBVEVfU0hJRlQpOworCQl0eF9kZXNjLT50eGR3NCB8PSBjcHVfdG9fbGUzMihUWERFU0MzMl9SVFNfQ1RTX0VOQUJMRSk7CisJCXR4X2Rlc2MtPnR4ZHc0IHw9IGNwdV90b19sZTMyKFRYREVTQzMyX0hXX1JUU19FTkFCTEUpOworCX0KK30KKworLyoKKyAqIEZpbGwgaW4gdjIgKGdlbjIpIHNwZWNpZmljIFRYIGRlc2NyaXB0b3IgYml0cy4KKyAqIFRoaXMgZm9ybWF0IGlzIHVzZWQgb24gODE5MmV1Lzg3MjNidQorICovCit2b2lkCitydGw4eHh4dV9maWxsX3R4ZGVzY192MihzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkJc3RydWN0IHJ0bDh4eHh1X3R4ZGVzYzMyICp0eF9kZXNjMzIsIHUzMiByYXRlLAorCQkJdTE2IHJhdGVfZmxhZywgYm9vbCBzZ2ksIGJvb2wgc2hvcnRfcHJlYW1ibGUsCisJCQlib29sIGFtcGR1X2VuYWJsZSkKK3sKKwlzdHJ1Y3QgcnRsOHh4eHVfdHhkZXNjNDAgKnR4X2Rlc2M0MDsKKwl1MTYgc2VxX251bWJlcjsKKworCXR4X2Rlc2M0MCA9IChzdHJ1Y3QgcnRsOHh4eHVfdHhkZXNjNDAgKil0eF9kZXNjMzI7CisKKwlzZXFfbnVtYmVyID0gSUVFRTgwMjExX1NFUV9UT19TTihsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKSk7CisKKwl0eF9kZXNjNDAtPnR4ZHc0ID0gY3B1X3RvX2xlMzIocmF0ZSk7CisJaWYgKGllZWU4MDIxMV9pc19kYXRhKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKKwkJdHhfZGVzYzQwLT50eGR3NCB8PSBjcHVfdG9fbGUzMigweDFmIDw8CisJCQkJCQlUWERFU0M0MF9EQVRBX1JBVEVfRkJfU0hJRlQpOworCX0KKworCXR4X2Rlc2M0MC0+dHhkdzkgPSBjcHVfdG9fbGUzMigodTMyKXNlcV9udW1iZXIgPDwgVFhERVNDNDBfU0VRX1NISUZUKTsKKworCWlmIChhbXBkdV9lbmFibGUpCisJCXR4X2Rlc2M0MC0+dHhkdzIgfD0gY3B1X3RvX2xlMzIoVFhERVNDNDBfQUdHX0VOQUJMRSk7CisJZWxzZQorCQl0eF9kZXNjNDAtPnR4ZHcyIHw9IGNwdV90b19sZTMyKFRYREVTQzQwX0FHR19CUkVBSyk7CisKKwlpZiAoaWVlZTgwMjExX2lzX21nbXQoaGRyLT5mcmFtZV9jb250cm9sKSkgeworCQl0eF9kZXNjNDAtPnR4ZHc0ID0gY3B1X3RvX2xlMzIocmF0ZSk7CisJCXR4X2Rlc2M0MC0+dHhkdzMgfD0gY3B1X3RvX2xlMzIoVFhERVNDNDBfVVNFX0RSSVZFUl9SQVRFKTsKKwkJdHhfZGVzYzQwLT50eGR3NCB8PQorCQkJY3B1X3RvX2xlMzIoNiA8PCBUWERFU0M0MF9SRVRSWV9MSU1JVF9TSElGVCk7CisJCXR4X2Rlc2M0MC0+dHhkdzQgfD0gY3B1X3RvX2xlMzIoVFhERVNDNDBfUkVUUllfTElNSVRfRU5BQkxFKTsKKwl9CisKKwlpZiAoc2hvcnRfcHJlYW1ibGUpCisJCXR4X2Rlc2M0MC0+dHhkdzUgfD0gY3B1X3RvX2xlMzIoVFhERVNDNDBfU0hPUlRfUFJFQU1CTEUpOworCisJaWYgKHJhdGVfZmxhZyAmIElFRUU4MDIxMV9UWF9SQ19VU0VfUlRTX0NUUykgeworCQkvKgorCQkgKiBVc2UgUlRTIHJhdGUgMjRNIC0gZG9lcyB0aGUgbWFjODAyMTEgdGVsbAorCQkgKiB1cyB3aGljaCB0byB1c2U/CisJCSAqLworCQl0eF9kZXNjNDAtPnR4ZHc0IHw9IGNwdV90b19sZTMyKERFU0NfUkFURV8yNE0gPDwKKwkJCQkJCVRYREVTQzQwX1JUU19SQVRFX1NISUZUKTsKKwkJdHhfZGVzYzQwLT50eGR3MyB8PSBjcHVfdG9fbGUzMihUWERFU0M0MF9SVFNfQ1RTX0VOQUJMRSk7CisJCXR4X2Rlc2M0MC0+dHhkdzMgfD0gY3B1X3RvX2xlMzIoVFhERVNDNDBfSFdfUlRTX0VOQUJMRSk7CisJfQorfQorCiBzdGF0aWMgdm9pZCBydGw4eHh4dV90eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCXN0cnVjdCBpZWVlODAyMTFfdHhfY29udHJvbCAqY29udHJvbCwKIAkJCXN0cnVjdCBza19idWZmICpza2IpCkBAIC00NzkyLDcgKzQ4NzAsNiBAQAogCXN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqdHhfcmF0ZSA9IGllZWU4MDIxMV9nZXRfdHhfcmF0ZShodywgdHhfaW5mbyk7CiAJc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYgPSBody0+cHJpdjsKIAlzdHJ1Y3QgcnRsOHh4eHVfdHhkZXNjMzIgKnR4X2Rlc2M7Ci0Jc3RydWN0IHJ0bDh4eHh1X3R4ZGVzYzQwICp0eF9kZXNjNDA7CiAJc3RydWN0IHJ0bDh4eHh1X3R4X3VyYiAqdHhfdXJiOwogCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEgPSBOVUxMOwogCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSB0eF9pbmZvLT5jb250cm9sLnZpZjsKQEAgLTQ4MDMsNyArNDg4MCw3IEBACiAJdTE2IHJhdGVfZmxhZyA9IHR4X2luZm8tPmNvbnRyb2wucmF0ZXNbMF0uZmxhZ3M7CiAJaW50IHR4X2Rlc2Nfc2l6ZSA9IHByaXYtPmZvcHMtPnR4X2Rlc2Nfc2l6ZTsKIAlpbnQgcmV0OwotCWJvb2wgdXNlZGVzYzQwLCBhbXBkdV9lbmFibGU7CisJYm9vbCB1c2VkZXNjNDAsIGFtcGR1X2VuYWJsZSwgc2dpID0gZmFsc2UsIHNob3J0X3ByZWFtYmxlID0gZmFsc2U7CiAKIAlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCB0eF9kZXNjX3NpemUpIHsKIAkJZGV2X3dhcm4oZGV2LApAQCAtNDg4MSwxMDcgKzQ5NTgsMjYgQEAKIAkJfQogCX0KIAotCWlmIChyYXRlX2ZsYWcgJiBJRUVFODAyMTFfVFhfUkNfTUNTKQorCWlmIChyYXRlX2ZsYWcgJiBJRUVFODAyMTFfVFhfUkNfTUNTICYmCisJICAgICFpZWVlODAyMTFfaXNfbWdtdChoZHItPmZyYW1lX2NvbnRyb2wpKQogCQlyYXRlID0gdHhfaW5mby0+Y29udHJvbC5yYXRlc1swXS5pZHggKyBERVNDX1JBVEVfTUNTMDsKIAllbHNlCiAJCXJhdGUgPSB0eF9yYXRlLT5od192YWx1ZTsKIAorCWlmIChyYXRlX2ZsYWcgJiBJRUVFODAyMTFfVFhfUkNfU0hPUlRfR0kgfHwKKwkgICAgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhoZHItPmZyYW1lX2NvbnRyb2wpICYmCisJICAgICBzdGEgJiYgc3RhLT5odF9jYXAuY2FwICYKKwkgICAgIChJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCB8IElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwKSkpCisJCXNnaSA9IHRydWU7CisKKwlpZiAocmF0ZV9mbGFnICYgSUVFRTgwMjExX1RYX1JDX1VTRV9TSE9SVF9QUkVBTUJMRSB8fAorCSAgICAoc3RhICYmIHZpZiAmJiB2aWYtPmJzc19jb25mLnVzZV9zaG9ydF9wcmVhbWJsZSkpCisJCXNob3J0X3ByZWFtYmxlID0gdHJ1ZTsKKwogCXNlcV9udW1iZXIgPSBJRUVFODAyMTFfU0VRX1RPX1NOKGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0cmwpKTsKLQlpZiAoIXVzZWRlc2M0MCkgewotCQl0eF9kZXNjLT50eGR3NSA9IGNwdV90b19sZTMyKHJhdGUpOwogCi0JCWlmIChpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpKQotCQkJdHhfZGVzYy0+dHhkdzUgfD0gY3B1X3RvX2xlMzIoMHgwMDAxZmYwMCk7Ci0KLQkJdHhfZGVzYy0+dHhkdzMgPQotCQkJY3B1X3RvX2xlMzIoKHUzMilzZXFfbnVtYmVyIDw8IFRYREVTQzMyX1NFUV9TSElGVCk7Ci0KLQkJaWYgKGFtcGR1X2VuYWJsZSkKLQkJCXR4X2Rlc2MtPnR4ZHcxIHw9IGNwdV90b19sZTMyKFRYREVTQzMyX0FHR19FTkFCTEUpOwotCQllbHNlCi0JCQl0eF9kZXNjLT50eGR3MSB8PSBjcHVfdG9fbGUzMihUWERFU0MzMl9BR0dfQlJFQUspOwotCi0JCWlmIChpZWVlODAyMTFfaXNfbWdtdChoZHItPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCQl0eF9kZXNjLT50eGR3NSA9IGNwdV90b19sZTMyKHR4X3JhdGUtPmh3X3ZhbHVlKTsKLQkJCXR4X2Rlc2MtPnR4ZHc0IHw9Ci0JCQkJY3B1X3RvX2xlMzIoVFhERVNDMzJfVVNFX0RSSVZFUl9SQVRFKTsKLQkJCXR4X2Rlc2MtPnR4ZHc1IHw9Ci0JCQkJY3B1X3RvX2xlMzIoNiA8PCBUWERFU0MzMl9SRVRSWV9MSU1JVF9TSElGVCk7Ci0JCQl0eF9kZXNjLT50eGR3NSB8PQotCQkJCWNwdV90b19sZTMyKFRYREVTQzMyX1JFVFJZX0xJTUlUX0VOQUJMRSk7Ci0JCX0KLQotCQlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGhkci0+ZnJhbWVfY29udHJvbCkpCi0JCQl0eF9kZXNjLT50eGR3NCB8PSBjcHVfdG9fbGUzMihUWERFU0MzMl9RT1MpOwotCi0JCWlmIChyYXRlX2ZsYWcgJiBJRUVFODAyMTFfVFhfUkNfVVNFX1NIT1JUX1BSRUFNQkxFIHx8Ci0JCSAgICAoc3RhICYmIHZpZiAmJiB2aWYtPmJzc19jb25mLnVzZV9zaG9ydF9wcmVhbWJsZSkpCi0JCQl0eF9kZXNjLT50eGR3NCB8PSBjcHVfdG9fbGUzMihUWERFU0MzMl9TSE9SVF9QUkVBTUJMRSk7Ci0KLQkJaWYgKHJhdGVfZmxhZyAmIElFRUU4MDIxMV9UWF9SQ19TSE9SVF9HSSB8fAotCQkgICAgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhoZHItPmZyYW1lX2NvbnRyb2wpICYmCi0JCSAgICAgc3RhICYmIHN0YS0+aHRfY2FwLmNhcCAmCi0JCSAgICAgKElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwIHwgSUVFRTgwMjExX0hUX0NBUF9TR0lfMjApKSkgewotCQkJdHhfZGVzYy0+dHhkdzUgfD0gY3B1X3RvX2xlMzIoVFhERVNDMzJfU0hPUlRfR0kpOwotCQl9Ci0KLQkJaWYgKHJhdGVfZmxhZyAmIElFRUU4MDIxMV9UWF9SQ19VU0VfUlRTX0NUUykgewotCQkJLyoKLQkJCSAqIFVzZSBSVFMgcmF0ZSAyNE0gLSBkb2VzIHRoZSBtYWM4MDIxMSB0ZWxsCi0JCQkgKiB1cyB3aGljaCB0byB1c2U/Ci0JCQkgKi8KLQkJCXR4X2Rlc2MtPnR4ZHc0IHw9Ci0JCQkJY3B1X3RvX2xlMzIoREVTQ19SQVRFXzI0TSA8PAotCQkJCQkgICAgVFhERVNDMzJfUlRTX1JBVEVfU0hJRlQpOwotCQkJdHhfZGVzYy0+dHhkdzQgfD0KLQkJCQljcHVfdG9fbGUzMihUWERFU0MzMl9SVFNfQ1RTX0VOQUJMRSk7Ci0JCQl0eF9kZXNjLT50eGR3NCB8PSBjcHVfdG9fbGUzMihUWERFU0MzMl9IV19SVFNfRU5BQkxFKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXR4X2Rlc2M0MCA9IChzdHJ1Y3QgcnRsOHh4eHVfdHhkZXNjNDAgKil0eF9kZXNjOwotCi0JCXR4X2Rlc2M0MC0+dHhkdzQgPSBjcHVfdG9fbGUzMihyYXRlKTsKLQkJaWYgKGllZWU4MDIxMV9pc19kYXRhKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKLQkJCXR4X2Rlc2MtPnR4ZHc0IHw9Ci0JCQkJY3B1X3RvX2xlMzIoMHgxZiA8PAotCQkJCQkgICAgVFhERVNDNDBfREFUQV9SQVRFX0ZCX1NISUZUKTsKLQkJfQotCi0JCXR4X2Rlc2M0MC0+dHhkdzkgPQotCQkJY3B1X3RvX2xlMzIoKHUzMilzZXFfbnVtYmVyIDw8IFRYREVTQzQwX1NFUV9TSElGVCk7Ci0KLQkJaWYgKGFtcGR1X2VuYWJsZSkKLQkJCXR4X2Rlc2M0MC0+dHhkdzIgfD0gY3B1X3RvX2xlMzIoVFhERVNDNDBfQUdHX0VOQUJMRSk7Ci0JCWVsc2UKLQkJCXR4X2Rlc2M0MC0+dHhkdzIgfD0gY3B1X3RvX2xlMzIoVFhERVNDNDBfQUdHX0JSRUFLKTsKLQotCQlpZiAoaWVlZTgwMjExX2lzX21nbXQoaGRyLT5mcmFtZV9jb250cm9sKSkgewotCQkJdHhfZGVzYzQwLT50eGR3NCA9IGNwdV90b19sZTMyKHR4X3JhdGUtPmh3X3ZhbHVlKTsKLQkJCXR4X2Rlc2M0MC0+dHhkdzMgfD0KLQkJCQljcHVfdG9fbGUzMihUWERFU0M0MF9VU0VfRFJJVkVSX1JBVEUpOwotCQkJdHhfZGVzYzQwLT50eGR3NCB8PQotCQkJCWNwdV90b19sZTMyKDYgPDwgVFhERVNDNDBfUkVUUllfTElNSVRfU0hJRlQpOwotCQkJdHhfZGVzYzQwLT50eGR3NCB8PQotCQkJCWNwdV90b19sZTMyKFRYREVTQzQwX1JFVFJZX0xJTUlUX0VOQUJMRSk7Ci0JCX0KLQotCQlpZiAocmF0ZV9mbGFnICYgSUVFRTgwMjExX1RYX1JDX1VTRV9TSE9SVF9QUkVBTUJMRSB8fAotCQkgICAgKHN0YSAmJiB2aWYgJiYgdmlmLT5ic3NfY29uZi51c2Vfc2hvcnRfcHJlYW1ibGUpKQotCQkJdHhfZGVzYzQwLT50eGR3NSB8PQotCQkJCWNwdV90b19sZTMyKFRYREVTQzQwX1NIT1JUX1BSRUFNQkxFKTsKLQotCQlpZiAocmF0ZV9mbGFnICYgSUVFRTgwMjExX1RYX1JDX1VTRV9SVFNfQ1RTKSB7Ci0JCQkvKgotCQkJICogVXNlIFJUUyByYXRlIDI0TSAtIGRvZXMgdGhlIG1hYzgwMjExIHRlbGwKLQkJCSAqIHVzIHdoaWNoIHRvIHVzZT8KLQkJCSAqLwotCQkJdHhfZGVzYy0+dHhkdzQgfD0KLQkJCQljcHVfdG9fbGUzMihERVNDX1JBVEVfMjRNIDw8Ci0JCQkJCSAgICBUWERFU0M0MF9SVFNfUkFURV9TSElGVCk7Ci0JCQl0eF9kZXNjLT50eGR3MyB8PSBjcHVfdG9fbGUzMihUWERFU0M0MF9SVFNfQ1RTX0VOQUJMRSk7Ci0JCQl0eF9kZXNjLT50eGR3MyB8PSBjcHVfdG9fbGUzMihUWERFU0M0MF9IV19SVFNfRU5BQkxFKTsKLQkJfQotCX0KKwlwcml2LT5mb3BzLT5maWxsX3R4ZGVzYyhoZHIsIHR4X2Rlc2MsIHJhdGUsIHJhdGVfZmxhZywKKwkJCQlzZ2ksIHNob3J0X3ByZWFtYmxlLCBhbXBkdV9lbmFibGUpOwogCiAJcnRsOHh4eHVfY2FsY190eF9kZXNjX2NzdW0odHhfZGVzYyk7CiAKQEAgLTUzNzksNyArNTM3NSw4IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnByaXYtPnVkZXYtPmRldjsKIAlpbnQgcmV0OwogCi0JZGV2X2RiZyhkZXYsICIlczogc3RhdHVzICVpXG4iLCBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCWlmIChydGw4eHh4dV9kZWJ1ZyAmIFJUTDhYWFhVX0RFQlVHX0lOVEVSUlVQVCkKKwkJZGV2X2RiZyhkZXYsICIlczogc3RhdHVzICVpXG4iLCBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwogCWlmICh1cmItPnN0YXR1cyA9PSAwKSB7CiAJCXVzYl9hbmNob3JfdXJiKHVyYiwgJnByaXYtPmludF9hbmNob3IpOwogCQlyZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwpAQCAtNTcwNCw3ICs1NzAxLDcgQEAKIAogCXN3aXRjaCAoYWN0aW9uKSB7CiAJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RBUlQ6Ci0JCWRldl9pbmZvKGRldiwgIiVzOiBJRUVFODAyMTFfQU1QRFVfVFhfU1RBUlRcbiIsIF9fZnVuY19fKTsKKwkJZGV2X2RiZyhkZXYsICIlczogSUVFRTgwMjExX0FNUERVX1RYX1NUQVJUXG4iLCBfX2Z1bmNfXyk7CiAJCWFtcGR1X2ZhY3RvciA9IHN0YS0+aHRfY2FwLmFtcGR1X2ZhY3RvcjsKIAkJYW1wZHVfZGVuc2l0eSA9IHN0YS0+aHRfY2FwLmFtcGR1X2RlbnNpdHk7CiAJCXJ0bDh4eHh1X3NldF9hbXBkdV9mYWN0b3IocHJpdiwgYW1wZHVfZmFjdG9yKTsKQEAgLTU3MTQsMjEgKzU3MTEsMjEgQEAKIAkJCWFtcGR1X2ZhY3RvciwgYW1wZHVfZGVuc2l0eSk7CiAJCWJyZWFrOwogCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX1NUT1BfRkxVU0g6Ci0JCWRldl9pbmZvKGRldiwgIiVzOiBJRUVFODAyMTFfQU1QRFVfVFhfU1RPUF9GTFVTSFxuIiwgX19mdW5jX18pOworCQlkZXZfZGJnKGRldiwgIiVzOiBJRUVFODAyMTFfQU1QRFVfVFhfU1RPUF9GTFVTSFxuIiwgX19mdW5jX18pOwogCQlydGw4eHh4dV9zZXRfYW1wZHVfZmFjdG9yKHByaXYsIDApOwogCQlydGw4eHh4dV9zZXRfYW1wZHVfbWluX3NwYWNlKHByaXYsIDApOwogCQlicmVhazsKIAljYXNlIElFRUU4MDIxMV9BTVBEVV9UWF9TVE9QX0ZMVVNIX0NPTlQ6Ci0JCWRldl9pbmZvKGRldiwgIiVzOiBJRUVFODAyMTFfQU1QRFVfVFhfU1RPUF9GTFVTSF9DT05UXG4iLAorCQlkZXZfZGJnKGRldiwgIiVzOiBJRUVFODAyMTFfQU1QRFVfVFhfU1RPUF9GTFVTSF9DT05UXG4iLAogCQkJIF9fZnVuY19fKTsKIAkJcnRsOHh4eHVfc2V0X2FtcGR1X2ZhY3Rvcihwcml2LCAwKTsKIAkJcnRsOHh4eHVfc2V0X2FtcGR1X21pbl9zcGFjZShwcml2LCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBJRUVFODAyMTFfQU1QRFVfUlhfU1RBUlQ6Ci0JCWRldl9pbmZvKGRldiwgIiVzOiBJRUVFODAyMTFfQU1QRFVfUlhfU1RBUlRcbiIsIF9fZnVuY19fKTsKKwkJZGV2X2RiZyhkZXYsICIlczogSUVFRTgwMjExX0FNUERVX1JYX1NUQVJUXG4iLCBfX2Z1bmNfXyk7CiAJCWJyZWFrOwogCWNhc2UgSUVFRTgwMjExX0FNUERVX1JYX1NUT1A6Ci0JCWRldl9pbmZvKGRldiwgIiVzOiBJRUVFODAyMTFfQU1QRFVfUlhfU1RPUFxuIiwgX19mdW5jX18pOworCQlkZXZfZGJnKGRldiwgIiVzOiBJRUVFODAyMTFfQU1QRFVfUlhfU1RPUFxuIiwgX19mdW5jX18pOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTU5NDcsNyArNTk0NCw3IEBACiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CiAJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldDsKIAlpbnQgdW50ZXN0ZWQgPSAxOwogCiAJdWRldiA9IHVzYl9nZXRfZGV2KGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSk7CkBAIC01OTcxLDYgKzU5NjgsMTggQEAKIAkJaWYgKGlkLT5pZFByb2R1Y3QgPT0gMHgxMDA0KQogCQkJdW50ZXN0ZWQgPSAwOwogCQlicmVhazsKKwljYXNlIDB4MjBmNDoKKwkJaWYgKGlkLT5pZFByb2R1Y3QgPT0gMHg2NDhiKQorCQkJdW50ZXN0ZWQgPSAwOworCQlicmVhazsKKwljYXNlIDB4MjAwMToKKwkJaWYgKGlkLT5pZFByb2R1Y3QgPT0gMHgzMzA4KQorCQkJdW50ZXN0ZWQgPSAwOworCQlicmVhazsKKwljYXNlIDB4MjM1NzoKKwkJaWYgKGlkLT5pZFByb2R1Y3QgPT0gMHgwMTA5KQorCQkJdW50ZXN0ZWQgPSAwOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CkBAIC01OTg3LDYgKzU5OTYsNyBAQAogCWh3ID0gaWVlZTgwMjExX2FsbG9jX2h3KHNpemVvZihzdHJ1Y3QgcnRsOHh4eHVfcHJpdiksICZydGw4eHh4dV9vcHMpOwogCWlmICghaHcpIHsKIAkJcmV0ID0gLUVOT01FTTsKKwkJcHJpdiA9IE5VTEw7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTYwMzUsNiArNjA0NSw4IEBACiAJfQogCiAJcmV0ID0gcnRsOHh4eHVfaW5pdF9kZXZpY2UoaHcpOworCWlmIChyZXQpCisJCWdvdG8gZXhpdDsKIAogCWh3LT53aXBoeS0+bWF4X3NjYW5fc3NpZHMgPSAxOwogCWh3LT53aXBoeS0+bWF4X3NjYW5faWVfbGVuID0gSUVFRTgwMjExX01BWF9EQVRBX0xFTjsKQEAgLTYwODUsOSArNjA5NywyMCBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCisJcmV0dXJuIDA7CisKIGV4aXQ6Ci0JaWYgKHJldCA8IDApCi0JCXVzYl9wdXRfZGV2KHVkZXYpOworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKKworCWlmIChwcml2KSB7CisJCWtmcmVlKHByaXYtPmZ3X2RhdGEpOworCQltdXRleF9kZXN0cm95KCZwcml2LT51c2JfYnVmX211dGV4KTsKKwkJbXV0ZXhfZGVzdHJveSgmcHJpdi0+aDJjX211dGV4KTsKKwl9CisJdXNiX3B1dF9kZXYodWRldik7CisKKwlpZWVlODAyMTFfZnJlZV9odyhodyk7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC02MTExLDYgKzYxMzQsMTEgQEAKIAltdXRleF9kZXN0cm95KCZwcml2LT51c2JfYnVmX211dGV4KTsKIAltdXRleF9kZXN0cm95KCZwcml2LT5oMmNfbXV0ZXgpOwogCisJaWYgKHByaXYtPnVkZXYtPnN0YXRlICE9IFVTQl9TVEFURV9OT1RBVFRBQ0hFRCkgeworCQlkZXZfaW5mbygmcHJpdi0+dWRldi0+ZGV2LAorCQkJICJEZXZpY2Ugc3RpbGwgYXR0YWNoZWQsIHRyeWluZyB0byByZXNldFxuIik7CisJCXVzYl9yZXNldF9kZXZpY2UocHJpdi0+dWRldik7CisJfQogCXVzYl9wdXRfZGV2KHByaXYtPnVkZXYpOwogCWllZWU4MDIxMV9mcmVlX2h3KGh3KTsKIH0KQEAgLTYxMjQsNiArNjE1Miw5IEBACiAJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpJnJ0bDg3MjNhdV9mb3BzfSwKIHtVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhVU0JfVkVORE9SX0lEX1JFQUxURUssIDB4ODE4YiwgMHhmZiwgMHhmZiwgMHhmZiksCiAJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpJnJ0bDgxOTJldV9mb3BzfSwKKy8qIFRlc3RlZCBieSBNeWNrZWwgSGFiZXRzICovCit7VVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oMHgyMzU3LCAweDAxMDksIDB4ZmYsIDB4ZmYsIDB4ZmYpLAorCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSZydGw4MTkyZXVfZm9wc30sCiB7VVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oVVNCX1ZFTkRPUl9JRF9SRUFMVEVLLCAweGI3MjAsIDB4ZmYsIDB4ZmYsIDB4ZmYpLAogCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSZydGw4NzIzYnVfZm9wc30sCiAjaWZkZWYgQ09ORklHX1JUTDhYWFhVX1VOVEVTVEVECkBAIC02MTQwLDYgKzYxNzEsMTIgQEAKIC8qIFRlc3RlZCBieSBBbmRyZWEgTWVyZWxsbyAqLwoge1VTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKDB4MDUwZCwgMHgxMDA0LCAweGZmLCAweGZmLCAweGZmKSwKIAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykmcnRsODE5MmN1X2ZvcHN9LAorLyogVGVzdGVkIGJ5IEpvY2VseW4gTWF5ZXIgKi8KK3tVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTygweDIwZjQsIDB4NjQ4YiwgMHhmZiwgMHhmZiwgMHhmZiksCisJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpJnJ0bDgxOTJjdV9mb3BzfSwKKy8qIFRlc3RlZCBieSBTdGVmYW5vIEJyYXZpICovCit7VVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oMHgyMDAxLCAweDMzMDgsIDB4ZmYsIDB4ZmYsIDB4ZmYpLAorCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSZydGw4MTkyY3VfZm9wc30sCiAvKiBDdXJyZW50bHkgdW50ZXN0ZWQgODE4OCBzZXJpZXMgZGV2aWNlcyAqLwoge1VTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFVTQl9WRU5ET1JfSURfUkVBTFRFSywgMHg4MTkxLCAweGZmLCAweGZmLCAweGZmKSwKIAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykmcnRsODE5MmN1X2ZvcHN9LApAQCAtNjE4Nyw4ICs2MjI0LDYgQEAKIAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykmcnRsODE5MmN1X2ZvcHN9LAoge1VTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKDB4MTNkMywgMHgzMzU3LCAweGZmLCAweGZmLCAweGZmKSwKIAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykmcnRsODE5MmN1X2ZvcHN9LAote1VTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKDB4MjAwMSwgMHgzMzA4LCAweGZmLCAweGZmLCAweGZmKSwKLQkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykmcnRsODE5MmN1X2ZvcHN9LAoge1VTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKDB4MjAwMSwgMHgzMzBiLCAweGZmLCAweGZmLCAweGZmKSwKIAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykmcnRsODE5MmN1X2ZvcHN9LAoge1VTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKDB4MjAxOSwgMHg0OTAyLCAweGZmLCAweGZmLCAweGZmKSwKQEAgLTYxOTksOCArNjIzNCw2IEBACiAJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpJnJ0bDgxOTJjdV9mb3BzfSwKIHtVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTygweDIwMTksIDB4ZWQxNywgMHhmZiwgMHhmZiwgMHhmZiksCiAJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpJnJ0bDgxOTJjdV9mb3BzfSwKLXtVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTygweDIwZjQsIDB4NjQ4YiwgMHhmZiwgMHhmZiwgMHhmZiksCi0JLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpJnJ0bDgxOTJjdV9mb3BzfSwKIHtVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTygweDQ4NTUsIDB4MDA5MCwgMHhmZiwgMHhmZiwgMHhmZiksCiAJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpJnJ0bDgxOTJjdV9mb3BzfSwKIHtVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTygweDQ4NTYsIDB4MDA5MSwgMHhmZiwgMHhmZiwgMHhmZiksCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bDh4eHh1L3J0bDh4eHh1X3JlZ3MuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfcmVncy5oCmluZGV4IDkyMWM1NjUuLjMxNWNjZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfcmVncy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfcmVncy5oCkBAIC0yMTMsMTAgKzIxMyw2NiBAQAogI2RlZmluZSBSRUdfSE1CT1hfRVhUXzEJCQkweDAwOGEKICNkZWZpbmUgUkVHX0hNQk9YX0VYVF8yCQkJMHgwMDhjCiAjZGVmaW5lIFJFR19ITUJPWF9FWFRfMwkJCTB4MDA4ZQorCiAvKiBJbnRlcnJ1cHQgcmVnaXN0ZXJzIGZvciA4MTkyZS84NzIzYnUvODgxMiAqLwogI2RlZmluZSBSRUdfSElNUjAJCQkweDAwYjAKKyNkZWZpbmUJIElNUjBfVFhDQ0sJCQlCSVQoMzApCS8qIFRYUlBUIGludGVycnVwdCB3aGVuIENDWCBiaXQKKwkJCQkJCSAgIG9mIHRoZSBwYWNrZXQgaXMgc2V0ICovCisjZGVmaW5lCSBJTVIwX1BTVElNRU9VVAkJCUJJVCgyOSkJLyogUG93ZXIgU2F2ZSBUaW1lIE91dCBJbnQgKi8KKyNkZWZpbmUJIElNUjBfR1RJTlQ0CQkJQklUKDI4KQkvKiBTZXQgd2hlbiBHVElNRVI0IGV4cGlyZXMgKi8KKyNkZWZpbmUJIElNUjBfR1RJTlQzCQkJQklUKDI3KQkvKiBTZXQgd2hlbiBHVElNRVIzIGV4cGlyZXMgKi8KKyNkZWZpbmUJIElNUjBfVEJERVIJCQlCSVQoMjYpCS8qIFRyYW5zbWl0IEJlYWNvbjAgRXJyb3IgKi8KKyNkZWZpbmUJIElNUjBfVEJET0sJCQlCSVQoMjUpCS8qIFRyYW5zbWl0IEJlYWNvbjAgT0sgKi8KKyNkZWZpbmUJIElNUjBfVFNGX0JJVDMyX1RPR0dMRQkJQklUKDI0KQkvKiBUU0YgVGltZXIgQklUMzIgdG9nZ2xlCisJCQkJCQkgICBpbmRpY2F0aW9uIGludGVycnVwdCAqLworI2RlZmluZQkgSU1SMF9CQ05ETUFJTlQwCQlCSVQoMjApCS8qIEJlYWNvbiBETUEgSW50ZXJydXB0IDAgKi8KKyNkZWZpbmUJIElNUjBfQkNOREVSUjAJCQlCSVQoMTYpCS8qIEJlYWNvbiBRdWV1ZSBETUEgRXJyb3IgMCAqLworI2RlZmluZQkgSU1SMF9IU0lTUl9JTkRfT05fSU5UCQlCSVQoMTUpCS8qIEhTSVNSIEluZGljYXRvciAoSFNJTVIgJgorCQkJCQkJICAgSFNJU1IgaXMgdHJ1ZSkgKi8KKyNkZWZpbmUJIElNUjBfQkNORE1BSU5UX0UJCUJJVCgxNCkJLyogQmVhY29uIERNQSBJbnRlcnJ1cHQKKwkJCQkJCSAgIEV4dGVuc2lvbiBmb3IgV2luNyAqLworI2RlZmluZQkgSU1SMF9BVElNRU5ECQkJQklUKDEyKQkvKiBDVFdpZG5vdyBFbmQgb3IKKwkJCQkJCSAgIEFUSU0gV2luZG93IEVuZCAqLworI2RlZmluZQkgSU1SMF9ISVNSMV9JTkRfSU5UCQlCSVQoMTEpCS8qIEhJU1IxIEluZGljYXRvcgorCQkJCQkJICAgKEhJU1IxICYgSElNUjEgaXMgdHJ1ZSkgKi8KKyNkZWZpbmUJIElNUjBfQzJIQ01ECQkJQklUKDEwKQkvKiBDUFUgdG8gSG9zdCBDb21tYW5kIElOVAorCQkJCQkJICAgU3RhdHVzLCBXcml0ZSAxIHRvIGNsZWFyICovCisjZGVmaW5lCSBJTVIwX0NQV00yCQkJQklUKDkpCS8qIENQVSBwb3dlciBNb2RlIGV4Y2hhbmdlIElOVAorCQkJCQkJICAgU3RhdHVzLCBXcml0ZSAxIHRvIGNsZWFyICovCisjZGVmaW5lCSBJTVIwX0NQV00JCQlCSVQoOCkJLyogQ1BVIHBvd2VyIE1vZGUgZXhjaGFuZ2UgSU5UCisJCQkJCQkgICBTdGF0dXMsIFdyaXRlIDEgdG8gY2xlYXIgKi8KKyNkZWZpbmUJIElNUjBfSElHSERPSwkJCUJJVCg3KQkvKiBIaWdoIFF1ZXVlIERNQSBPSyAqLworI2RlZmluZQkgSU1SMF9NR05URE9LCQkJQklUKDYpCS8qIE1hbmFnZW1lbnQgUXVldWUgRE1BIE9LICovCisjZGVmaW5lCSBJTVIwX0JLRE9LCQkJQklUKDUpCS8qIEFDX0JLIERNQSBPSyAqLworI2RlZmluZQkgSU1SMF9CRURPSwkJCUJJVCg0KQkvKiBBQ19CRSBETUEgT0sgKi8KKyNkZWZpbmUJIElNUjBfVklET0sJCQlCSVQoMykJLyogQUNfVkkgRE1BIE9LICovCisjZGVmaW5lCSBJTVIwX1ZPRE9LCQkJQklUKDIpCS8qIEFDX1ZPIERNQSBPSyAqLworI2RlZmluZQkgSU1SMF9SRFUJCQlCSVQoMSkJLyogUnggRGVzY3JpcHRvciBVbmF2YWlsYWJsZSAqLworI2RlZmluZQkgSU1SMF9ST0sJCQlCSVQoMCkJLyogUmVjZWl2ZSBETUEgT0sgKi8KICNkZWZpbmUgUkVHX0hJU1IwCQkJMHgwMGI0CiAjZGVmaW5lIFJFR19ISU1SMQkJCTB4MDBiOAorI2RlZmluZQkgSU1SMV9CQ05ETUFJTlQ3CQlCSVQoMjcpCS8qIEJlYWNvbiBETUEgSW50ZXJydXB0IDcgKi8KKyNkZWZpbmUJIElNUjFfQkNORE1BSU5UNgkJQklUKDI2KQkvKiBCZWFjb24gRE1BIEludGVycnVwdCA2ICovCisjZGVmaW5lCSBJTVIxX0JDTkRNQUlOVDUJCUJJVCgyNSkJLyogQmVhY29uIERNQSBJbnRlcnJ1cHQgNSAqLworI2RlZmluZQkgSU1SMV9CQ05ETUFJTlQ0CQlCSVQoMjQpCS8qIEJlYWNvbiBETUEgSW50ZXJydXB0IDQgKi8KKyNkZWZpbmUJIElNUjFfQkNORE1BSU5UMwkJQklUKDIzKQkvKiBCZWFjb24gRE1BIEludGVycnVwdCAzICovCisjZGVmaW5lCSBJTVIxX0JDTkRNQUlOVDIJCUJJVCgyMikJLyogQmVhY29uIERNQSBJbnRlcnJ1cHQgMiAqLworI2RlZmluZQkgSU1SMV9CQ05ETUFJTlQxCQlCSVQoMjEpCS8qIEJlYWNvbiBETUEgSW50ZXJydXB0IDEgKi8KKyNkZWZpbmUJIElNUjFfQkNOREVSUjcJCQlCSVQoMjApCS8qIEJlYWNvbiBRdWV1ZSBETUEgRXJyIEludCA3ICovCisjZGVmaW5lCSBJTVIxX0JDTkRFUlI2CQkJQklUKDE5KQkvKiBCZWFjb24gUXVldWUgRE1BIEVyciBJbnQgNiAqLworI2RlZmluZQkgSU1SMV9CQ05ERVJSNQkJCUJJVCgxOCkJLyogQmVhY29uIFF1ZXVlIERNQSBFcnIgSW50IDUgKi8KKyNkZWZpbmUJIElNUjFfQkNOREVSUjQJCQlCSVQoMTcpCS8qIEJlYWNvbiBRdWV1ZSBETUEgRXJyIEludCA0ICovCisjZGVmaW5lCSBJTVIxX0JDTkRFUlIzCQkJQklUKDE2KQkvKiBCZWFjb24gUXVldWUgRE1BIEVyciBJbnQgMyAqLworI2RlZmluZQkgSU1SMV9CQ05ERVJSMgkJCUJJVCgxNSkJLyogQmVhY29uIFF1ZXVlIERNQSBFcnIgSW50IDIgKi8KKyNkZWZpbmUJIElNUjFfQkNOREVSUjEJCQlCSVQoMTQpCS8qIEJlYWNvbiBRdWV1ZSBETUEgRXJyIEludCAxICovCisjZGVmaW5lCSBJTVIxX0FUSU1FTkRfRQkJCUJJVCgxMykJLyogQVRJTSBXaW5kb3cgRW5kIEV4dGVuc2lvbgorCQkJCQkJICAgZm9yIFdpbjcgKi8KKyNkZWZpbmUJIElNUjFfVFhFUlIJCQlCSVQoMTEpCS8qIFR4IEVycm9yIEZsYWcgSW50IFN0YXR1cywKKwkJCQkJCSAgIHdyaXRlIDEgdG8gY2xlYXIgKi8KKyNkZWZpbmUJIElNUjFfUlhFUlIJCQlCSVQoMTApCS8qIFJ4IEVycm9yIEZsYWcgSW50IFN0YXR1cywKKwkJCQkJCSAgIHdyaXRlIDEgdG8gY2xlYXIgKi8KKyNkZWZpbmUJIElNUjFfVFhGT1ZXCQkJQklUKDkpCS8qIFRyYW5zbWl0IEZJRk8gT3ZlcmZsb3cgKi8KKyNkZWZpbmUJIElNUjFfUlhGT1ZXCQkJQklUKDgpCS8qIFJlY2VpdmUgRklGTyBPdmVyZmxvdyAqLwogI2RlZmluZSBSRUdfSElTUjEJCQkweDAwYmMKIAogLyogIEhvc3Qgc3VzcGVuZCBjb3VudGVyIG9uIEZQR0EgcGxhdGZvcm0gKi8KQEAgLTYyMCw2ICs2NzYsNyBAQAogI2RlZmluZSBSRUdfU0NIX1RYQ01ECQkJMHgwNWQwCiAKIC8qIGRlZmluZSBSRUdfRldfVFNGX1NZTkNfQ05UCQkweDA0YTAgKi8KKyNkZWZpbmUgUkVHX1NDSF9UWF9DTUQJCQkweDA1ZjgKICNkZWZpbmUgUkVHX0ZXX1JFU0VUX1RTRl9DTlRfMQkJMHgwNWZjCiAjZGVmaW5lIFJFR19GV19SRVNFVF9UU0ZfQ05UXzAJCTB4MDVmZAogI2RlZmluZSBSRUdfRldfQkNOX0RJU19DTlQJCTB4MDVmZQpAQCAtNzgwLDYgKzgzNywxMCBAQAogI2RlZmluZSAgRlBHQV9SRl9NT0RFX09GRE0JCUJJVCgyNSkKIAogI2RlZmluZSBSRUdfRlBHQTBfVFhfSU5GTwkJMHgwODA0CisjZGVmaW5lICBGUEdBMF9UWF9JTkZPX09GRE1fUEFUSF9BCUJJVCgwKQorI2RlZmluZSAgRlBHQTBfVFhfSU5GT19PRkRNX1BBVEhfQglCSVQoMSkKKyNkZWZpbmUgIEZQR0EwX1RYX0lORk9fT0ZETV9QQVRIX0MJQklUKDIpCisjZGVmaW5lICBGUEdBMF9UWF9JTkZPX09GRE1fUEFUSF9ECUJJVCgzKQogI2RlZmluZSBSRUdfRlBHQTBfUFNEX0ZVTkMJCTB4MDgwOAogI2RlZmluZSBSRUdfRlBHQTBfVFhfR0FJTgkJMHgwODBjCiAjZGVmaW5lIFJFR19GUEdBMF9SRl9USU1JTkcxCQkweDA4MTAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9jb3JlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvY29yZS5jCmluZGV4IDQxZjc3ZjguLmY5NTc2MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL2NvcmUuYwpAQCAtNzY1LDcgKzc2NSw4IEBACiAJCQkJCW1hYy0+YndfNDAgPSBmYWxzZTsKIAkJCQkJbWFjLT5id184MCA9IGZhbHNlOwogCQkJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsCisJCQkJCQkgY2hhbm5lbF90eXBlKTsKIAkJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTExMzUsNyArMTEzNiw3IEBACiAJCQkJCW1hYy0+bW9kZSA9IFdJUkVMRVNTX01PREVfQUNfMjRHOwogCQkJfQogCi0JCQlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYgc3RhKQorCQkJaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQogCQkJCXJ0bHByaXYtPmNmZy0+b3BzLT51cGRhdGVfcmF0ZV90YmwoaHcsIHN0YSwgMCk7CiAJCQlyY3VfcmVhZF91bmxvY2soKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3BjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3BjaS5jCmluZGV4IGQxMjU4NmQuLjBkZmE5ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9wY2kuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcGNpLmMKQEAgLTE3OSw3ICsxNzksOCBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsCisJCQkgcnRscGNpLT5jb25zdF9zdXBwb3J0X3BjaWFzcG0pOwogCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9wcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3BzLmMKaW5kZXggOWE2NGY5Yi4uMThkOTc5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3BzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3BzLmMKQEAgLTE1MSw3ICsxNTEsNyBAQAogCiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBzdGF0ZV90b3NldCk7CiAJCWJyZWFrOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3JlZ2QuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9yZWdkLmMKaW5kZXggMzUyNDQ0MS4uNmVlNmJmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3JlZ2QuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcmVnZC5jCkBAIC0zNDUsOSArMzQ1LDkgQEAKIAkJcmV0dXJuICZydGxfcmVnZG9tX25vX21pZGJhbmQ7CiAJY2FzZSBDT1VOVFJZX0NPREVfSUM6CiAJCXJldHVybiAmcnRsX3JlZ2RvbV8xMTsKLQljYXNlIENPVU5UUllfQ09ERV9FVFNJOgogCWNhc2UgQ09VTlRSWV9DT0RFX1RFTEVDX05FVEdFQVI6CiAJCXJldHVybiAmcnRsX3JlZ2RvbV82MF82NDsKKwljYXNlIENPVU5UUllfQ09ERV9FVFNJOgogCWNhc2UgQ09VTlRSWV9DT0RFX1NQQUlOOgogCWNhc2UgQ09VTlRSWV9DT0RFX0ZSQU5DRToKIAljYXNlIENPVU5UUllfQ09ERV9JU1JBRUw6CkBAIC00MDYsNiArNDA2LDggQEAKIAkJcmV0dXJuIENPVU5UUllfQ09ERV9XT1JMRF9XSURFXzEzOwogCWNhc2UgMHgyMjoKIAkJcmV0dXJuIENPVU5UUllfQ09ERV9JQzsKKwljYXNlIDB4MjU6CisJCXJldHVybiBDT1VOVFJZX0NPREVfRVRTSTsKIAljYXNlIDB4MzI6CiAJCXJldHVybiBDT1VOVFJZX0NPREVfVEVMRUNfTkVUR0VBUjsKIAljYXNlIDB4NDE6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE4OGVlL2Z3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE4OGVlL2Z3LmMKaW5kZXggNjI5MTI1Ni4uNTM2MGQ1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxODhlZS9mdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTg4ZWUvZncuYwpAQCAtMzM0LDcgKzMzNCw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBib3hudW0pOwogCQkJYnJlYWs7CiAJCX0KIAkJaXNmd19yZWFkID0gX3J0bDg4ZV9jaGVja19md19yZWFkX2xhc3RfaDJjKGh3LCBib3hudW0pOwpAQCAtNDA1LDcgKzQwNSw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBjbWRfbGVuKTsKIAkJCWJyZWFrOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTg4ZWUvaHcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTg4ZWUvaHcuYwppbmRleCA0YWI2MjAxLi4zN2Q2ZWZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE4OGVlL2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxODhlZS9ody5jCkBAIC0zNTUsOSArMzU1LDExIEBACiAKIAkJKigodTY0ICopKHZhbCkpID0gdHNmOwogCQlicmVhazsgfQorCWNhc2UgSEFMX0RFRl9XT1dMQU46CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzICV4XG4iLCB2YXJpYWJsZSk7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCB2YXJpYWJsZSk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTU3MSw3ICs1NzMsOCBAQAogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCQkJIGVfYWNpKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtNzM1LDcgKzczOCw3IEBACiAJCWJyZWFrOyB9CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3MgJXhcbiIsIHZhcmlhYmxlKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHZhcmlhYmxlKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtMjM1Miw3ICsyMzU1LDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBlbmNfYWxnbyk7CiAJCQllbmNfYWxnbyA9IENBTV9US0lQOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTg4ZWUvbGVkLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE4OGVlL2xlZC5jCmluZGV4IGI1MDRiZDAuLmYwNWMyYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTg4ZWUvbGVkLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxODhlZS9sZWQuYwpAQCAtNjIsNyArNjIsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHBsZWQtPmxlZHBpbik7CiAJCWJyZWFrOwogCX0KIAlwbGVkLT5sZWRvbiA9IHRydWU7CkBAIC0xMDAsNyArMTAwLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBwbGVkLT5sZWRwaW4pOwogCQlicmVhazsKIAl9CiAJcGxlZC0+bGVkb24gPSBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTg4ZWUvcGh5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE4OGVlL3BoeS5jCmluZGV4IDc0OThhMTIuLmZmZmFhOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTg4ZWUvcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxODhlZS9waHkuYwpAQCAtMTM0Niw3ICsxMzQ2LDggQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsCisJCQkJIGN1cnJlbnRjbWQtPmNtZGlkKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTIxMjgsNyArMjEyOSw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBpb3R5cGUpOwogCQkJYnJlYWs7CiAJCX0KIAl9IHdoaWxlIChmYWxzZSk7CkBAIC0yMTY2LDcgKzIxNjcsOCBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsCisJCQkgcnRscGh5LT5jdXJyZW50X2lvX3R5cGUpOwogCQlicmVhazsKIAl9CiAJcnRscGh5LT5zZXRfaW9faW5wcm9ncmVzcyA9IGZhbHNlOwpAQCAtMjMxOSw3ICsyMzIxLDcgQEAKIAkJfQogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcmZwd3Jfc3RhdGUpOwogCQlicmVzdWx0ID0gZmFsc2U7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTg4ZWUvc3cuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTg4ZWUvc3cuYwppbmRleCA0N2UzMmNiLi5lN2IxMWI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE4OGVlL3N3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxODhlZS9zdy5jCkBAIC0yODAsNyArMjgwLDcgQEAKIAkuZGVidWcgPSBEQkdfRU1FUkcsCiB9OwogCi1zdGF0aWMgc3RydWN0IHJ0bF9oYWxfY2ZnIHJ0bDg4ZWVfaGFsX2NmZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRsX2hhbF9jZmcgcnRsODhlZV9oYWxfY2ZnID0gewogCS5iYXJfaWQgPSAyLAogCS53cml0ZV9yZWFkYmFjayA9IHRydWUsCiAJLm5hbWUgPSAicnRsODhlX3BjaSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmMvZndfY29tbW9uLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmMvZndfY29tbW9uLmMKaW5kZXggNDNmY2IyNS4uN2QxNTI0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjL2Z3X2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyYy9md19jb21tb24uYwpAQCAtMzUyLDcgKzM1Miw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBib3hudW0pOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtNDU2LDcgKzQ1Niw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBjbWRfbGVuKTsKIAkJCWJyZWFrOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyYy9waHlfY29tbW9uLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmMvcGh5X2NvbW1vbi5jCmluZGV4IDYwYWIyZWMuLjI3ZTNkNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyYy9waHlfY29tbW9uLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjL3BoeV9jb21tb24uYwpAQCAtOTEwLDcgKzkxMCw4IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLAorCQkJCSBjdXJyZW50Y21kLT5jbWRpZCk7CiAJCQlicmVhazsKIAkJfQogCkBAIC0xNTY3LDcgKzE1NjgsNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgaW90eXBlKTsKIAkJCWJyZWFrOwogCQl9CiAJfSB3aGlsZSAoZmFsc2UpOwpAQCAtMTYwNSw3ICsxNjA2LDggQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLAorCQkJIHJ0bHBoeS0+Y3VycmVudF9pb190eXBlKTsKIAkJYnJlYWs7CiAJfQogCXJ0bHBoeS0+c2V0X2lvX2lucHJvZ3Jlc3MgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY2UvaHcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY2UvaHcuYwppbmRleCAyNDQ2MDc5Li5hNDdiZTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmNlL2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjZS9ody5jCkBAIC0xNDEsOSArMTQxLDExIEBACiAKIAkJYnJlYWs7CiAJCX0KKwljYXNlIEhBTF9ERUZfV09XTEFOOgorCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHZhcmlhYmxlKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtMzY3LDcgKzM2OSw4IEBACiAJCQkJCWJyZWFrOwogCQkJCWRlZmF1bHQ6CiAJCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCQkJCSBlX2FjaSk7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KQEAgLTIxNTQsNyArMjE1Nyw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBlbmNfYWxnbyk7CiAJCQllbmNfYWxnbyA9IENBTV9US0lQOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY2UvbGVkLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmNlL2xlZC5jCmluZGV4IDgyODNlOWIyLi4yNGU0ODNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmNlL2xlZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY2UvbGVkLmMKQEAgLTYyLDcgKzYyLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBwbGVkLT5sZWRwaW4pOwogCQlicmVhazsKIAl9CiAJcGxlZC0+bGVkb24gPSB0cnVlOwpAQCAtOTcsNyArOTcsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHBsZWQtPmxlZHBpbik7CiAJCWJyZWFrOwogCX0KIAlwbGVkLT5sZWRvbiA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjZS9waHkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY2UvcGh5LmMKaW5kZXggMWVlNWE2YS4uNDZkMGQ5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjZS9waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmNlL3BoeS5jCkBAIC0zMDAsMTIgKzMwMCw5IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBSRjkwX1BBVEhfQzoKLQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7Ci0JCWJyZWFrOwogCWNhc2UgUkY5MF9QQVRIX0Q6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcmZwYXRoKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CkBAIC01NTQsNyArNTUxLDcgQEAKIAkJfQogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcmZwd3Jfc3RhdGUpOwogCQlicmVzdWx0ID0gZmFsc2U7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY2Uvc3cuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY2Uvc3cuYwppbmRleCA0NzgwYmRjLi44N2FhMjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmNlL3N3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjZS9zdy5jCkBAIC0yNTgsNyArMjU4LDcgQEAKIAkuZGVidWcgPSBEQkdfRU1FUkcsCiB9OwogCi1zdGF0aWMgc3RydWN0IHJ0bF9oYWxfY2ZnIHJ0bDkyY2VfaGFsX2NmZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRsX2hhbF9jZmcgcnRsOTJjZV9oYWxfY2ZnID0gewogCS5iYXJfaWQgPSAyLAogCS53cml0ZV9yZWFkYmFjayA9IHRydWUsCiAJLm5hbWUgPSAicnRsOTJjX3BjaSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmN1L2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmN1L2h3LmMKaW5kZXggODc4OTc1Mi4uYWU4ZjA1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjdS9ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY3UvaHcuYwpAQCAtMTU2MCw3ICsxNTYwLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCB2YXJpYWJsZSk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTE5MzEsNyArMTkzMSw3IEBACiAJCX0KIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHZhcmlhYmxlKTsKIAkJYnJlYWs7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjdS9sZWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY3UvbGVkLmMKaW5kZXggNzVhMmRlYi4uODUxNGFiNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY3UvbGVkLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjdS9sZWQuYwpAQCAtNjIsNyArNjIsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHBsZWQtPmxlZHBpbik7CiAJCWJyZWFrOwogCX0KIAlwbGVkLT5sZWRvbiA9IHRydWU7CkBAIC05NSw3ICs5NSw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcGxlZC0+bGVkcGluKTsKIAkJYnJlYWs7CiAJfQogCXBsZWQtPmxlZG9uID0gZmFsc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmN1L3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjdS9waHkuYwppbmRleCBjOTcyZmE1Li40YjI5NzY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmN1L3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY3UvcGh5LmMKQEAgLTI3NywxMiArMjc3LDkgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIFJGOTBfUEFUSF9DOgotCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKLQkJYnJlYWs7CiAJY2FzZSBSRjkwX1BBVEhfRDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCByZnBhdGgpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTUxNyw3ICs1MTQsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHJmcHdyX3N0YXRlKTsKIAkJYnJlc3VsdCA9IGZhbHNlOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmRlL2Z3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmRlL2Z3LmMKaW5kZXggNjJlZjgyMC4uOGRlMjljYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJkZS9mdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZGUvZncuYwpAQCAtNDM1LDcgKzQzNSw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBib3hudW0pOwogCQkJYnJlYWs7CiAJCX0KIAkJaXNmd19yZWFkID0gX3J0bDkyZF9jaGVja19md19yZWFkX2xhc3RfaDJjKGh3LCBib3hudW0pOwpAQCAtNTEyLDcgKzUxMiw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBjbWRfbGVuKTsKIAkJCWJyZWFrOwogCQl9CiAJCWJ3cml0ZV9zdWNjZXNzID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZGUvaHcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZGUvaHcuYwppbmRleCBiMGY2MzI0Li5kOTFmOGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmRlL2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJkZS9ody5jCkBAIC0xNjQsOSArMTY0LDExIEBACiAJY2FzZSBIV19WQVJfSU5UX0FDOgogCQkqKChib29sICopKHZhbCkpID0gcnRscHJpdi0+ZG0uZGlzYWJsZV90eF9pbnQ7CiAJCWJyZWFrOworCWNhc2UgSEFMX0RFRl9XT1dMQU46CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgdmFyaWFibGUpOwogCQlicmVhazsKIAl9CiB9CkBAIC0zNjEsNyArMzYzLDggQEAKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6CiAJCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCQkJIGVfYWNpKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtNTAyLDcgKzUwNSw3IEBACiAJfQogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgdmFyaWFibGUpOwogCQlicmVhazsKIAl9CiB9CkBAIC0xNzU3LDcgKzE3NjAsNyBAQAogCQlyZXR1cm47CiAKIAlpZiAocnRsX2dldF9od2luZm8oaHcsIHJ0bHByaXYsIEhXU0VUX01BWF9TSVpFLCBod2luZm8sIHBhcmFtcykpCi0JCXJldHVybjsKKwkJZ290byBleGl0OwogCiAJX3J0bDkyZGVfZWZ1c2VfdXBkYXRlX2NoaXBfdmVyc2lvbihodyk7CiAJX3J0bDkyZGVfcmVhZF9tYWNwaHltb2RlX2FuZF9iYW5kdHlwZShodywgaHdpbmZvKTsKQEAgLTE3OTAsNiArMTc5Myw3IEBACiAJCWJyZWFrOwogCX0KIAlydGxlZnVzZS0+dHhwd3JfZnJvbWVwcm9tID0gdHJ1ZTsKK2V4aXQ6CiAJa2ZyZWUoaHdpbmZvKTsKIH0KIApAQCAtMjE3MCw3ICsyMTc0LDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGVuY19hbGdvKTsKIAkJCWVuY19hbGdvID0gQ0FNX1RLSVA7CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJkZS9sZWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZGUvbGVkLmMKaW5kZXggNzZhNTdhZS4uODExYmE1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJkZS9sZWQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmRlL2xlZC5jCkBAIC03MSw3ICs3MSw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcGxlZC0+bGVkcGluKTsKIAkJYnJlYWs7CiAJfQogCXBsZWQtPmxlZG9uID0gdHJ1ZTsKQEAgLTEwNiw3ICsxMDYsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHBsZWQtPmxlZHBpbik7CiAJCWJyZWFrOwogCX0KIAlwbGVkLT5sZWRvbiA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJkZS9waHkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZGUvcGh5LmMKaW5kZXggZDMzNGQyYS4uMmExZWRmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJkZS9waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmRlL3BoeS5jCkBAIC01ODgsNyArNTg4LDcgQEAKIAkJCQkgKiBzZXR0aW5nLiAqLwogCQkJCXVkZWxheSgxKTsKIAkJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19UUkFDRSwKLQkJCQkJICJUaGUgUnRsODE5WEFHQ1RBQl9BcnJheV9UYWJsZVswXSBpcyAldWwgUnRsODE5WFBIWV9SRUdBcnJheVsxXSBpcyAldWxcbiIsCisJCQkJCSAiVGhlIFJ0bDgxOVhBR0NUQUJfQXJyYXlfVGFibGVbMF0gaXMgJXUgUnRsODE5WFBIWV9SRUdBcnJheVsxXSBpcyAldVxuIiwKIAkJCQkJIGFnY3RhYl9hcnJheV90YWJsZVtpXSwKIAkJCQkJIGFnY3RhYl9hcnJheV90YWJsZVtpICsgMV0pOwogCQkJfQpAQCAtNjA0LDcgKzYwNCw3IEBACiAJCQkJCSAqIHNldHRpbmcuICovCiAJCQkJCXVkZWxheSgxKTsKIAkJCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfVFJBQ0UsCi0JCQkJCQkgIlRoZSBSdGw4MTlYQUdDVEFCX0FycmF5X1RhYmxlWzBdIGlzICV1bCBSdGw4MTlYUEhZX1JFR0FycmF5WzFdIGlzICV1bFxuIiwKKwkJCQkJCSAiVGhlIFJ0bDgxOVhBR0NUQUJfQXJyYXlfVGFibGVbMF0gaXMgJXUgUnRsODE5WFBIWV9SRUdBcnJheVsxXSBpcyAldVxuIiwKIAkJCQkJCSBhZ2N0YWJfYXJyYXlfdGFibGVbaV0sCiAJCQkJCQkgYWdjdGFiX2FycmF5X3RhYmxlW2kgKyAxXSk7CiAJCQkJfQpAQCAtNjIwLDcgKzYyMCw3IEBACiAJCQkJCSAqIHNldHRpbmcuICovCiAJCQkJCXVkZWxheSgxKTsKIAkJCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9JTklULCBEQkdfVFJBQ0UsCi0JCQkJCQkgIlRoZSBSdGw4MTlYQUdDVEFCXzVHQXJyYXlfVGFibGVbMF0gaXMgJXVsIFJ0bDgxOVhQSFlfUkVHQXJyYXlbMV0gaXMgJXVsXG4iLAorCQkJCQkJICJUaGUgUnRsODE5WEFHQ1RBQl81R0FycmF5X1RhYmxlWzBdIGlzICV1IFJ0bDgxOVhQSFlfUkVHQXJyYXlbMV0gaXMgJXVcbiIsCiAJCQkJCQkgYWdjdGFiXzVnYXJyYXlfdGFibGVbaV0sCiAJCQkJCQkgYWdjdGFiXzVnYXJyYXlfdGFibGVbaSArIDFdKTsKIAkJCQl9CkBAIC04MzYsMTIgKzgzNiw5IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBSRjkwX1BBVEhfQzoKLQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7Ci0JCWJyZWFrOwogCWNhc2UgUkY5MF9QQVRIX0Q6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcmZwYXRoKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiB0cnVlOwpAQCAtMjg1MCw3ICsyODQ3LDggQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsCisJCQkJIGN1cnJlbnRjbWQtPmNtZGlkKTsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwpAQCAtMjk2Myw3ICsyOTYxLDggQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLAorCQkJIHJ0bHBoeS0+Y3VycmVudF9pb190eXBlKTsKIAkJYnJlYWs7CiAJfQogCXJ0bHBoeS0+c2V0X2lvX2lucHJvZ3Jlc3MgPSBmYWxzZTsKQEAgLTI5OTQsNyArMjk5Myw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBpb3R5cGUpOwogCQkJYnJlYWs7CiAJCX0KIAl9IHdoaWxlIChmYWxzZSk7CkBAIC0zMTgyLDcgKzMxODEsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHJmcHdyX3N0YXRlKTsKIAkJYnJlc3VsdCA9IGZhbHNlOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmRlL3N3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmRlL3N3LmMKaW5kZXggYzZlMDlhMS4uMDUzOGE0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJkZS9zdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZGUvc3cuYwpAQCAtMjYyLDcgKzI2Miw3IEBACiAJLmRlYnVnID0gREJHX0VNRVJHLAogfTsKIAotc3RhdGljIHN0cnVjdCBydGxfaGFsX2NmZyBydGw5MmRlX2hhbF9jZmcgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0bF9oYWxfY2ZnIHJ0bDkyZGVfaGFsX2NmZyA9IHsKIAkuYmFyX2lkID0gMiwKIAkud3JpdGVfcmVhZGJhY2sgPSB0cnVlLAogCS5uYW1lID0gInJ0bDgxOTJkZSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmVlL2Z3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmVlL2Z3LmMKaW5kZXggMDcwOGVlZC4uYjNmNmE5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJlZS9mdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZWUvZncuYwpAQCAtMzQ0LDcgKzM0NCw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBib3hudW0pOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtNDMzLDcgKzQzMyw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBjbWRfbGVuKTsKIAkJCWJyZWFrOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZWUvaHcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZWUvaHcuYwppbmRleCBiMDdhZjhkLi5lYmY2NjNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmVlL2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJlZS9ody5jCkBAIC0zMzgsOSArMzM4LDExIEBACiAJCSooKHU2NCAqKSh2YWwpKSA9IHRzZjsKIAkJfQogCQlicmVhazsKKwljYXNlIEhBTF9ERUZfV09XTEFOOgorCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0RNRVNHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2VzcyAleFxuIiwgdmFyaWFibGUpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgdmFyaWFibGUpOwogCQlicmVhazsKIAl9CiB9CkBAIC01NjYsNyArNTY4LDggQEAKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6CiAJCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19ETUVTRywKLQkJCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsCisJCQkJCSBlX2FjaSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTY4NSw3ICs2ODgsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0RNRVNHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2VzcyAleFxuIiwgdmFyaWFibGUpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgdmFyaWFibGUpOwogCQlicmVhazsKIAl9CiB9CkBAIC0yNDYzLDcgKzI0NjYsNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0RNRVNHLAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGVuY19hbGdvKTsKIAkJCWVuY19hbGdvID0gQ0FNX1RLSVA7CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJlZS9sZWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZWUvbGVkLmMKaW5kZXggODM4OGUzNy4uNDdkYTA1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJlZS9sZWQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmVlL2xlZC5jCkBAIC02MSw3ICs2MSw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcGxlZC0+bGVkcGluKTsKIAkJYnJlYWs7CiAJfQogCXBsZWQtPmxlZG9uID0gdHJ1ZTsKQEAgLTkxLDcgKzkxLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBwbGVkLT5sZWRwaW4pOwogCQlicmVhazsKIAl9CiAJcGxlZC0+bGVkb24gPSBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZWUvcGh5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmVlL3BoeS5jCmluZGV4IGJlYWZjOWEuLjVhZDdlNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZWUvcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJlZS9waHkuYwpAQCAtMTkyNyw3ICsxOTI3LDggQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsCisJCQkJIGN1cnJlbnRjbWQtPmNtZGlkKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTMwMDEsNyArMzAwMiw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBpb3R5cGUpOwogCQkJYnJlYWs7CiAJCX0KIAl9IHdoaWxlIChmYWxzZSk7CkBAIC0zMDQxLDcgKzMwNDIsOCBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsCisJCQkgcnRscGh5LT5jdXJyZW50X2lvX3R5cGUpOwogCQlicmVhazsKIAl9CiAJcnRscGh5LT5zZXRfaW9faW5wcm9ncmVzcyA9IGZhbHNlOwpAQCAtMzE4Nyw3ICszMTg5LDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCByZnB3cl9zdGF0ZSk7CiAJCWJyZXN1bHQgPSBmYWxzZTsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJlZS9zdy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJlZS9zdy5jCmluZGV4IGMzMWM2YmYuLmFjMjk5Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZWUvc3cuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmVlL3N3LmMKQEAgLTI2Miw3ICsyNjIsNyBAQAogCS5kZWJ1ZyA9IERCR19FTUVSRywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcnRsX2hhbF9jZmcgcnRsOTJlZV9oYWxfY2ZnID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBydGxfaGFsX2NmZyBydGw5MmVlX2hhbF9jZmcgPSB7CiAJLmJhcl9pZCA9IDIsCiAJLndyaXRlX3JlYWRiYWNrID0gdHJ1ZSwKIAkubmFtZSA9ICJydGw5MmVlX3BjaSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MnNlL2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MnNlL2h3LmMKaW5kZXggZGRmYTBhZS4uNTJlNDQzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJzZS9ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyc2UvaHcuYwpAQCAtNzcsOSArNzcsMTEgQEAKIAkJCSooKGJvb2wgKikodmFsKSkgPSBydGxwcml2LT5kbS5jdXJyZW50X21yY19zd2l0Y2g7CiAJCQlicmVhazsKIAkJfQorCWNhc2UgSEFMX0RFRl9XT1dMQU46CisJCWJyZWFrOwogCWRlZmF1bHQ6IHsKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCB2YXJpYWJsZSk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTI5Nyw3ICsyOTksOCBAQAogCQkJCQlicmVhazsKIAkJCQlkZWZhdWx0OgogCQkJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsCisJCQkJCQkgZV9hY2kpOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CkBAIC00MzMsNyArNDM2LDcgQEAKIAkJYnJlYWs7IH0KIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHZhcmlhYmxlKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0yNDY1LDcgKzI0NjgsNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgZW5jX2FsZ28pOwogCQkJZW5jX2FsZ28gPSBDQU1fVEtJUDsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MnNlL2xlZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJzZS9sZWQuYwppbmRleCA0NDk0OWI1Li45ODQ5Y2I5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MnNlL2xlZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyc2UvbGVkLmMKQEAgLTY4LDcgKzY4LDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBwbGVkLT5sZWRwaW4pOwogCQlicmVhazsKIAl9CiAJcGxlZC0+bGVkb24gPSB0cnVlOwpAQCAtMTA0LDcgKzEwNCw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcGxlZC0+bGVkcGluKTsKIAkJYnJlYWs7CiAJfQogCXBsZWQtPmxlZG9uID0gZmFsc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MnNlL3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJzZS9waHkuYwppbmRleCA4ODE4MjFmLi40YmI3NTU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MnNlL3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyc2UvcGh5LmMKQEAgLTQ0Miw3ICs0NDIsOCBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCQkgY3VycmVudGNtZC0+Y21kaWQpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtNjQ4LDcgKzY0OSw3IEBACiAJCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHJmcHdyX3N0YXRlKTsKIAkJYnJlc3VsdCA9IGZhbHNlOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MnNlL3N3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MnNlL3N3LmMKaW5kZXggMzFiYWNhNDEuLjVlOGUwMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyc2Uvc3cuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MnNlL3N3LmMKQEAgLTMwNiw3ICszMDYsNyBAQAogCiAvKiBCZWNhdXNlIG1lbW9yeSBSL1cgYnVyc3Rpbmcgd2lsbCBjYXVzZSBzeXN0ZW0gaGFuZy9jcmFzaAogICogZm9yIDkyc2UsIHNvIHdlIGRvbid0IHJlYWQgYmFjayBhZnRlciBldmVyeSB3cml0ZSBhY3Rpb24gKi8KLXN0YXRpYyBzdHJ1Y3QgcnRsX2hhbF9jZmcgcnRsOTJzZV9oYWxfY2ZnID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBydGxfaGFsX2NmZyBydGw5MnNlX2hhbF9jZmcgPSB7CiAJLmJhcl9pZCA9IDEsCiAJLndyaXRlX3JlYWRiYWNrID0gZmFsc2UsCiAJLm5hbWUgPSAicnRsOTJzX3BjaSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2FlL2Z3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2FlL2Z3LmMKaW5kZXggYjdjMGQzOC4uMTE4Njc1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNhZS9mdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYWUvZncuYwpAQCAtMTI0LDcgKzEyNCw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgYm94bnVtKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTIzMCw3ICsyMzAsNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGNtZF9sZW4pOwogCQkJYnJlYWs7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNhZS9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNhZS9ody5jCmluZGV4IGI4OGM3ZWUuLmY4YmUwYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYWUvaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2FlL2h3LmMKQEAgLTE0MSw5ICsxNDEsMTEgQEAKIAogCQkJYnJlYWs7CiAJCX0KKwljYXNlIEhBTF9ERUZfV09XTEFOOgorCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHZhcmlhYmxlKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtMzY2LDcgKzM2OCw4IEBACiAJCQkJCWJyZWFrOwogCQkJCWRlZmF1bHQ6CiAJCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCQkJCSBlX2FjaSk7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KQEAgLTU0Niw3ICs1NDksNyBAQAogCQl9CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCB2YXJpYWJsZSk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTE2NTQsNyArMTY1Nyw3IEBACiAJCQlydGxlZnVzZS0+YXV0b2xvYWRfZmFpbGZsYWcsIGh3aW5mbyk7CiAKIAlpZiAocnRsaGFsLT5vZW1faWQgIT0gUlRfQ0lEX0RFRkFVTFQpCi0JCXJldHVybjsKKwkJZ290byBleGl0OwogCiAJc3dpdGNoIChydGxlZnVzZS0+ZWVwcm9tX29lbWlkKSB7CiAJY2FzZSBFRVBST01fQ0lEX0RFRkFVTFQ6CkBAIC0yMjI1LDcgKzIyMjgsNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgZW5jX2FsZ28pOwogCQkJZW5jX2FsZ28gPSBDQU1fVEtJUDsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2FlL2xlZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNhZS9sZWQuYwppbmRleCAxMzE3MzM1Li5jN2JlOTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2FlL2xlZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYWUvbGVkLmMKQEAgLTYzLDcgKzYzLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcGxlZC0+bGVkcGluKTsKIAkJYnJlYWs7CiAJfQogCXBsZWQtPmxlZG9uID0gdHJ1ZTsKQEAgLTEwNSw3ICsxMDUsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBwbGVkLT5sZWRwaW4pOwogCQlicmVhazsKIAl9CiAJcGxlZC0+bGVkb24gPSBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYWUvcGh5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2FlL3BoeS5jCmluZGV4IDYwMWI3OGUuLjE3YjU4Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYWUvcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNhZS9waHkuYwpAQCAtMTAyMyw3ICsxMDIzLDggQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsCisJCQkJIGN1cnJlbnRjbWQtPmNtZGlkKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTE0OTksNyArMTUwMCw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBpb3R5cGUpOwogCQkJYnJlYWs7CiAJCX0KIAl9IHdoaWxlIChmYWxzZSk7CkBAIC0xNTM2LDcgKzE1MzcsOCBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsCisJCQkgcnRscGh5LT5jdXJyZW50X2lvX3R5cGUpOwogCQlicmVhazsKIAl9CiAJcnRscGh5LT5zZXRfaW9faW5wcm9ncmVzcyA9IGZhbHNlOwpAQCAtMTY4Miw3ICsxNjg0LDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCByZnB3cl9zdGF0ZSk7CiAJCWJyZXN1bHQgPSBmYWxzZTsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNhZS9zdy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNhZS9zdy5jCmluZGV4IGZmNDlhOGMuLjg5YzgyOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYWUvc3cuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2FlL3N3LmMKQEAgLTI3Niw3ICsyNzYsNyBAQAogCS5kaXNhYmxlX3dhdGNoZG9nID0gZmFsc2UsCiB9OwogCi1zdGF0aWMgc3RydWN0IHJ0bF9oYWxfY2ZnIHJ0bDg3MjNlX2hhbF9jZmcgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0bF9oYWxfY2ZnIHJ0bDg3MjNlX2hhbF9jZmcgPSB7CiAJLmJhcl9pZCA9IDIsCiAJLndyaXRlX3JlYWRiYWNrID0gdHJ1ZSwKIAkubmFtZSA9ICJydGw4NzIzZV9wY2kiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNiZS9mdy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNiZS9mdy5jCmluZGV4IGQ1ZGEwZjMuLjhjNWMyN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYmUvZncuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2JlL2Z3LmMKQEAgLTEyMiw3ICsxMjIsNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGJveG51bSk7CiAJCQlicmVhazsKIAkJfQogCkBAIC0xOTUsNyArMTk1LDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBjbWRfbGVuKTsKIAkJCWJyZWFrOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYmUvaHcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYmUvaHcuYwppbmRleCA4MmU0NDc2Li5hYmE2MGMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2JlL2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNiZS9ody5jCkBAIC0zNDgsOSArMzQ4LDExIEBACiAJCSooKHU2NCAqKSh2YWwpKSA9IHRzZjsKIAkJfQogCQlicmVhazsKKwljYXNlIEhBTF9ERUZfV09XTEFOOgorCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzICV4XG4iLCB2YXJpYWJsZSk7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCB2YXJpYWJsZSk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTYwNyw3ICs2MDksOCBAQAogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLAorCQkJCQkgZV9hY2kpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC03MjMsOCArNzI2LDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2VzcyAleFxuIiwKLQkJCSB2YXJpYWJsZSk7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCB2YXJpYWJsZSk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTI1NjUsNyArMjU2Nyw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBlbmNfYWxnbyk7CiAJCQllbmNfYWxnbyA9IENBTV9US0lQOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYmUvbGVkLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2JlL2xlZC5jCmluZGV4IDQxOTZlZmIuLjQ5NzkxM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYmUvbGVkLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNiZS9sZWQuYwpAQCAtNTgsNyArNTgsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBwbGVkLT5sZWRwaW4pOwogCQlicmVhazsKIAl9CiAJcGxlZC0+bGVkb24gPSB0cnVlOwpAQCAtMTAwLDcgKzEwMCw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHBsZWQtPmxlZHBpbik7CiAJCWJyZWFrOwogCX0KIAlwbGVkLT5sZWRvbiA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNiZS9waHkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYmUvcGh5LmMKaW5kZXggMjg1ODE4ZC4uM2NjMjIzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNiZS9waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2JlL3BoeS5jCkBAIC04MzcsNyArODM3LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBSRjkwX1BBVEhfRDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCByZnBhdGgpOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIHRydWU7CkBAIC0xNTA3LDcgKzE1MDcsOCBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCQkgY3VycmVudGNtZC0+Y21kaWQpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMjUxNSw3ICsyNTE2LDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGlvdHlwZSk7CiAJCQlicmVhazsKIAkJfQogCX0gd2hpbGUgKGZhbHNlKTsKQEAgLTI1NTMsNyArMjU1NCw4IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCSBydGxwaHktPmN1cnJlbnRfaW9fdHlwZSk7CiAJCWJyZWFrOwogCX0KIAlydGxwaHktPnNldF9pb19pbnByb2dyZXNzID0gZmFsc2U7CkBAIC0yNzA1LDcgKzI3MDcsNyBAQAogCiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCByZnB3cl9zdGF0ZSk7CiAJCWJyZXN1bHQgPSBmYWxzZTsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNiZS9zdy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNiZS9zdy5jCmluZGV4IDIxMDE3OTMuLjIwYjUzZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYmUvc3cuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2JlL3N3LmMKQEAgLTI3Niw3ICsyNzYsNyBAQAogCS5hbnRfc2VsID0gMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcnRsX2hhbF9jZmcgcnRsODcyM2JlX2hhbF9jZmcgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0bF9oYWxfY2ZnIHJ0bDg3MjNiZV9oYWxfY2ZnID0gewogCS5iYXJfaWQgPSAyLAogCS53cml0ZV9yZWFkYmFjayA9IHRydWUsCiAJLm5hbWUgPSAicnRsODcyM2JlX3BjaSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODgyMWFlL2Z3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODgyMWFlL2Z3LmMKaW5kZXggYTRmYzcwZS4uYjY2NTQ0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg4MjFhZS9mdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4ODIxYWUvZncuYwpAQCAtMzkyLDcgKzM5Miw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBib3hudW0pOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtNDgxLDcgKzQ4MSw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBjbWRfbGVuKTsKIAkJCWJyZWFrOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4ODIxYWUvaHcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4ODIxYWUvaHcuYwppbmRleCAwY2RkZjFhLi4xMjgxZWJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODgyMWFlL2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg4MjFhZS9ody5jCkBAIC00ODAsNyArNDgwLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2VzcyAleFxuIiwgdmFyaWFibGUpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgdmFyaWFibGUpOwogCQlicmVhazsKIAl9CiB9CkBAIC02NzEsNyArNjcxLDggQEAKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6CiAJCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCQkJIGVfYWNpKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtODAwLDcgKzgwMSw3IEBACiAJCWJyZWFrOyB9CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2VzcyAleFxuIiwgdmFyaWFibGUpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgdmFyaWFibGUpOwogCQlicmVhazsKIAl9CiB9CkBAIC0zOTM0LDcgKzM5MzUsNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgZW5jX2FsZ28pOwogCQkJZW5jX2FsZ28gPSBDQU1fVEtJUDsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODgyMWFlL2xlZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg4MjFhZS9sZWQuYwppbmRleCBiYTE5NDZhLi5mY2IzYjI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODgyMWFlL2xlZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4ODIxYWUvbGVkLmMKQEAgLTYwLDcgKzYwLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBwbGVkLT5sZWRwaW4pOwogCQlicmVhazsKIAl9CiAJcGxlZC0+bGVkb24gPSB0cnVlOwpAQCAtMTMzLDcgKzEzMyw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcGxlZC0+bGVkcGluKTsKIAkJYnJlYWs7CiAJfQogCXBsZWQtPmxlZG9uID0gZmFsc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODgyMWFlL3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg4MjFhZS9waHkuYwppbmRleCBhNzFiZmUzLi41ZGFkNDAyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg4MjFhZS9waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODgyMWFlL3BoeS5jCkBAIC0yMDYzLDEyICsyMDYzLDkgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIFJGOTBfUEFUSF9DOgotCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7Ci0JCWJyZWFrOwogCWNhc2UgUkY5MF9QQVRIX0Q6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHJmcGF0aCk7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gdHJ1ZTsKQEAgLTIxMzMsMTYgKzIxMzAsMTAgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFJGOTBfUEFUSF9COgotCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7Ci0JCWJyZWFrOwogCWNhc2UgUkY5MF9QQVRIX0M6Ci0JCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKLQkJYnJlYWs7CiAJY2FzZSBSRjkwX1BBVEhfRDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcmZwYXRoKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiB0cnVlOwpAQCAtNDY3MCw3ICs0NjYxLDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBpb3R5cGUpOwogCQkJYnJlYWs7CiAJCX0KIAl9IHdoaWxlIChmYWxzZSk7CkBAIC00NzE0LDcgKzQ3MDUsOCBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLAorCQkJIHJ0bHBoeS0+Y3VycmVudF9pb190eXBlKTsKIAkJYnJlYWs7CiAJfQogCXJ0bHBoeS0+c2V0X2lvX2lucHJvZ3Jlc3MgPSBmYWxzZTsKQEAgLTQ4MjAsNyArNDgxMiw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHJmcHdyX3N0YXRlKTsKIAkJYnJlc3VsdCA9IGZhbHNlOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODgyMWFlL3N3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODgyMWFlL3N3LmMKaW5kZXggNDE1OWY5Yi4uMjJmNjg3YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4ODIxYWUvc3cuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODgyMWFlL3N3LmMKQEAgLTMxNiw3ICszMTYsNyBAQAogCS5kaXNhYmxlX3dhdGNoZG9nID0gMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcnRsX2hhbF9jZmcgcnRsODgyMWFlX2hhbF9jZmcgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0bF9oYWxfY2ZnIHJ0bDg4MjFhZV9oYWxfY2ZnID0gewogCS5iYXJfaWQgPSAyLAogCS53cml0ZV9yZWFkYmFjayA9IHRydWUsCiAJLm5hbWUgPSAicnRsODgyMWFlX3BjaSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvdXNiLmMKaW5kZXggNDE2MTdiNy4uMzJhYTVjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS91c2IuYwpAQCAtNzM5LDExICs3MzksOCBAQAogCWZvciAoaSA9IDA7IGkgPCBydGx1c2ItPnJ4X3VyYl9udW07IGkrKykgewogCQllcnIgPSAtRU5PTUVNOwogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCQlpZiAoIXVyYikgewotCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9VU0IsIERCR19FTUVSRywKLQkJCQkgIkZhaWxlZCB0byBhbGxvYyBVUkIhIVxuIik7CisJCWlmICghdXJiKQogCQkJZ290byBlcnJfb3V0OwotCQl9CiAKIAkJZXJyID0gX3J0bF9wcmVwX3J4X3VyYihodywgcnRsdXNiLCB1cmIsIEdGUF9LRVJORUwpOwogCQlpZiAoZXJyIDwgMCkgewpAQCAtOTA3LDE1ICs5MDQsMTIgQEAKIHN0YXRpYyBzdHJ1Y3QgdXJiICpfcnRsX3VzYl90eF91cmJfc2V0dXAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGVwX251bSkKIHsKLQlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CiAJc3RydWN0IHJ0bF91c2IgKnJ0bHVzYiA9IHJ0bF91c2JkZXYocnRsX3VzYnByaXYoaHcpKTsKIAlzdHJ1Y3QgdXJiICpfdXJiOwogCiAJV0FSTl9PTihOVUxMID09IHNrYik7CiAJX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CiAJaWYgKCFfdXJiKSB7Ci0JCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfVVNCLCBEQkdfRU1FUkcsCi0JCQkgIkNhbid0IGFsbG9jYXRlIFVSQiBmb3IgYnVsayBvdXQhXG4iKTsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiBOVUxMOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS93aWZpLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvd2lmaS5oCmluZGV4IGM1MDg2YzIuLjU5NWY3ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS93aWZpLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3dpZmkuaApAQCAtMzk0LDExMCArMzk0LDExMCBAQAogfTsKIAogZW51bSBod192YXJpYWJsZXMgewotCUhXX1ZBUl9FVEhFUl9BRERSLAotCUhXX1ZBUl9NVUxUSUNBU1RfUkVHLAotCUhXX1ZBUl9CQVNJQ19SQVRFLAotCUhXX1ZBUl9CU1NJRCwKLQlIV19WQVJfTUVESUFfU1RBVFVTLAotCUhXX1ZBUl9TRUNVUklUWV9DT05GLAotCUhXX1ZBUl9CRUFDT05fSU5URVJWQUwsCi0JSFdfVkFSX0FUSU1fV0lORE9XLAotCUhXX1ZBUl9MSVNURU5fSU5URVJWQUwsCi0JSFdfVkFSX0NTX0NPVU5URVIsCi0JSFdfVkFSX0RFRkFVTFRLRVkwLAotCUhXX1ZBUl9ERUZBVUxUS0VZMSwKLQlIV19WQVJfREVGQVVMVEtFWTIsCi0JSFdfVkFSX0RFRkFVTFRLRVkzLAotCUhXX1ZBUl9TSUZTLAotCUhXX1ZBUl9SMlRfU0lGUywKLQlIV19WQVJfRElGUywKLQlIV19WQVJfRUlGUywKLQlIV19WQVJfU0xPVF9USU1FLAotCUhXX1ZBUl9BQ0tfUFJFQU1CTEUsCi0JSFdfVkFSX0NXX0NPTkZJRywKLQlIV19WQVJfQ1dfVkFMVUVTLAotCUhXX1ZBUl9SQVRFX0ZBTExCQUNLX0NPTlRST0wsCi0JSFdfVkFSX0NPTlRFTlRJT05fV0lORE9XLAotCUhXX1ZBUl9SRVRSWV9DT1VOVCwKLQlIV19WQVJfVFJfU1dJVENILAotCUhXX1ZBUl9DT01NQU5ELAotCUhXX1ZBUl9XUEFfQ09ORklHLAotCUhXX1ZBUl9BTVBEVV9NSU5fU1BBQ0UsCi0JSFdfVkFSX1NIT1JUR0lfREVOU0lUWSwKLQlIV19WQVJfQU1QRFVfRkFDVE9SLAotCUhXX1ZBUl9NQ1NfUkFURV9BVkFJTEFCTEUsCi0JSFdfVkFSX0FDX1BBUkFNLAotCUhXX1ZBUl9BQ01fQ1RSTCwKLQlIV19WQVJfRElTX1JlcV9Rc2l6ZSwKLQlIV19WQVJfQ0NYX0NITkxfTE9BRCwKLQlIV19WQVJfQ0NYX05PSVNFX0hJU1RPR1JBTSwKLQlIV19WQVJfQ0NYX0NMTV9OSE0sCi0JSFdfVkFSX1R4T1BMaW1pdCwKLQlIV19WQVJfVFVSQk9fTU9ERSwKLQlIV19WQVJfUkZfU1RBVEUsCi0JSFdfVkFSX1JGX09GRl9CWV9IVywKLQlIV19WQVJfQlVTX1NQRUVELAotCUhXX1ZBUl9TRVRfREVWX1BPV0VSLAorCUhXX1ZBUl9FVEhFUl9BRERSID0gMHgwLAorCUhXX1ZBUl9NVUxUSUNBU1RfUkVHID0gMHgxLAorCUhXX1ZBUl9CQVNJQ19SQVRFID0gMHgyLAorCUhXX1ZBUl9CU1NJRCA9IDB4MywKKwlIV19WQVJfTUVESUFfU1RBVFVTPSAweDQsCisJSFdfVkFSX1NFQ1VSSVRZX0NPTkY9IDB4NSwKKwlIV19WQVJfQkVBQ09OX0lOVEVSVkFMID0gMHg2LAorCUhXX1ZBUl9BVElNX1dJTkRPVyA9IDB4NywKKwlIV19WQVJfTElTVEVOX0lOVEVSVkFMID0gMHg4LAorCUhXX1ZBUl9DU19DT1VOVEVSID0gMHg5LAorCUhXX1ZBUl9ERUZBVUxUS0VZMCA9IDB4YSwKKwlIV19WQVJfREVGQVVMVEtFWTEgPSAweGIsCisJSFdfVkFSX0RFRkFVTFRLRVkyID0gMHhjLAorCUhXX1ZBUl9ERUZBVUxUS0VZMyA9IDB4ZCwKKwlIV19WQVJfU0lGUyA9IDB4ZSwKKwlIV19WQVJfUjJUX1NJRlMgPSAweGYsCisJSFdfVkFSX0RJRlMgPSAweDEwLAorCUhXX1ZBUl9FSUZTID0gMHgxMSwKKwlIV19WQVJfU0xPVF9USU1FID0gMHgxMiwKKwlIV19WQVJfQUNLX1BSRUFNQkxFID0gMHgxMywKKwlIV19WQVJfQ1dfQ09ORklHID0gMHgxNCwKKwlIV19WQVJfQ1dfVkFMVUVTID0gMHgxNSwKKwlIV19WQVJfUkFURV9GQUxMQkFDS19DT05UUk9MPSAweDE2LAorCUhXX1ZBUl9DT05URU5USU9OX1dJTkRPVyA9IDB4MTcsCisJSFdfVkFSX1JFVFJZX0NPVU5UID0gMHgxOCwKKwlIV19WQVJfVFJfU1dJVENIID0gMHgxOSwKKwlIV19WQVJfQ09NTUFORCA9IDB4MWEsCisJSFdfVkFSX1dQQV9DT05GSUcgPSAweDFiLAorCUhXX1ZBUl9BTVBEVV9NSU5fU1BBQ0UgPSAweDFjLAorCUhXX1ZBUl9TSE9SVEdJX0RFTlNJVFkgPSAweDFkLAorCUhXX1ZBUl9BTVBEVV9GQUNUT1IgPSAweDFlLAorCUhXX1ZBUl9NQ1NfUkFURV9BVkFJTEFCTEUgPSAweDFmLAorCUhXX1ZBUl9BQ19QQVJBTSA9IDB4MjAsCisJSFdfVkFSX0FDTV9DVFJMID0gMHgyMSwKKwlIV19WQVJfRElTX1JlcV9Rc2l6ZSA9IDB4MjIsCisJSFdfVkFSX0NDWF9DSE5MX0xPQUQgPSAweDIzLAorCUhXX1ZBUl9DQ1hfTk9JU0VfSElTVE9HUkFNID0gMHgyNCwKKwlIV19WQVJfQ0NYX0NMTV9OSE0gPSAweDI1LAorCUhXX1ZBUl9UeE9QTGltaXQgPSAweDI2LAorCUhXX1ZBUl9UVVJCT19NT0RFID0gMHgyNywKKwlIV19WQVJfUkZfU1RBVEUgPSAweDI4LAorCUhXX1ZBUl9SRl9PRkZfQllfSFcgPSAweDI5LAorCUhXX1ZBUl9CVVNfU1BFRUQgPSAweDJhLAorCUhXX1ZBUl9TRVRfREVWX1BPV0VSID0gMHgyYiwKIAotCUhXX1ZBUl9SQ1IsCi0JSFdfVkFSX1JBVFJfMCwKLQlIV19WQVJfUlJTUiwKLQlIV19WQVJfQ1BVX1JTVCwKLQlIV19WQVJfQ0hFQ0tfQlNTSUQsCi0JSFdfVkFSX0xCS19NT0RFLAotCUhXX1ZBUl9BRVNfMTFOX0ZJWCwKLQlIV19WQVJfVVNCX1JYX0FHR1IsCi0JSFdfVkFSX1VTRVJfQ09OVFJPTF9UVVJCT19NT0RFLAotCUhXX1ZBUl9SRVRSWV9MSU1JVCwKLQlIV19WQVJfSU5JVF9UWF9SQVRFLAotCUhXX1ZBUl9UWF9SQVRFX1JFRywKLQlIV19WQVJfRUZVU0VfVVNBR0UsCi0JSFdfVkFSX0VGVVNFX0JZVEVTLAotCUhXX1ZBUl9BVVRPTE9BRF9TVEFUVVMsCi0JSFdfVkFSX1JGXzJSX0RJU0FCTEUsCi0JSFdfVkFSX1NFVF9SUFdNLAotCUhXX1ZBUl9IMkNfRldfUFdSTU9ERSwKLQlIV19WQVJfSDJDX0ZXX0pPSU5CU1NSUFQsCi0JSFdfVkFSX0gyQ19GV19NRURJQVNUQVRVU1JQVCwKLQlIV19WQVJfSDJDX0ZXX1AyUF9QU19PRkZMT0FELAotCUhXX1ZBUl9GV19QU01PREVfU1RBVFVTLAotCUhXX1ZBUl9JTklUX1JUU19SQVRFLAotCUhXX1ZBUl9SRVNVTUVfQ0xLX09OLAotCUhXX1ZBUl9GV19MUFNfQUNUSU9OLAotCUhXX1ZBUl8xWDFfUkVDVl9DT01CSU5FLAotCUhXX1ZBUl9TVE9QX1NFTkRfQkVBQ09OLAotCUhXX1ZBUl9UU0ZfVElNRVIsCi0JSFdfVkFSX0lPX0NNRCwKKwlIV19WQVJfUkNSID0gMHgyYywKKwlIV19WQVJfUkFUUl8wID0gMHgyZCwKKwlIV19WQVJfUlJTUiA9IDB4MmUsCisJSFdfVkFSX0NQVV9SU1QgPSAweDJmLAorCUhXX1ZBUl9DSEVDS19CU1NJRCA9IDB4MzAsCisJSFdfVkFSX0xCS19NT0RFID0gMHgzMSwKKwlIV19WQVJfQUVTXzExTl9GSVggPSAweDMyLAorCUhXX1ZBUl9VU0JfUlhfQUdHUiA9IDB4MzMsCisJSFdfVkFSX1VTRVJfQ09OVFJPTF9UVVJCT19NT0RFID0gMHgzNCwKKwlIV19WQVJfUkVUUllfTElNSVQgPSAweDM1LAorCUhXX1ZBUl9JTklUX1RYX1JBVEUgPSAweDM2LAorCUhXX1ZBUl9UWF9SQVRFX1JFRyA9IDB4MzcsCisJSFdfVkFSX0VGVVNFX1VTQUdFID0gMHgzOCwKKwlIV19WQVJfRUZVU0VfQllURVMgPSAweDM5LAorCUhXX1ZBUl9BVVRPTE9BRF9TVEFUVVMgPSAweDNhLAorCUhXX1ZBUl9SRl8yUl9ESVNBQkxFID0gMHgzYiwKKwlIV19WQVJfU0VUX1JQV00gPSAweDNjLAorCUhXX1ZBUl9IMkNfRldfUFdSTU9ERSA9IDB4M2QsCisJSFdfVkFSX0gyQ19GV19KT0lOQlNTUlBUID0gMHgzZSwKKwlIV19WQVJfSDJDX0ZXX01FRElBU1RBVFVTUlBUID0gMHgzZiwKKwlIV19WQVJfSDJDX0ZXX1AyUF9QU19PRkZMT0FEID0gMHg0MCwKKwlIV19WQVJfRldfUFNNT0RFX1NUQVRVUyA9IDB4NDEsCisJSFdfVkFSX0lOSVRfUlRTX1JBVEUgPSAweDQyLAorCUhXX1ZBUl9SRVNVTUVfQ0xLX09OID0gMHg0MywKKwlIV19WQVJfRldfTFBTX0FDVElPTiA9IDB4NDQsCisJSFdfVkFSXzFYMV9SRUNWX0NPTUJJTkUgPSAweDQ1LAorCUhXX1ZBUl9TVE9QX1NFTkRfQkVBQ09OID0gMHg0NiwKKwlIV19WQVJfVFNGX1RJTUVSID0gMHg0NywKKwlIV19WQVJfSU9fQ01EID0gMHg0OCwKIAotCUhXX1ZBUl9SRl9SRUNPVkVSWSwKLQlIV19WQVJfSDJDX0ZXX1VQREFURV9HVEssCi0JSFdfVkFSX1dGX01BU0ssCi0JSFdfVkFSX1dGX0NSQywKLQlIV19WQVJfV0ZfSVNfTUFDX0FERFIsCi0JSFdfVkFSX0gyQ19GV19PRkZMT0FELAotCUhXX1ZBUl9SRVNFVF9XRkNSQywKKwlIV19WQVJfUkZfUkVDT1ZFUlkgPSAweDQ5LAorCUhXX1ZBUl9IMkNfRldfVVBEQVRFX0dUSyA9IDB4NGEsCisJSFdfVkFSX1dGX01BU0sgPSAweDRiLAorCUhXX1ZBUl9XRl9DUkMgPSAweDRjLAorCUhXX1ZBUl9XRl9JU19NQUNfQUREUiA9IDB4NGQsCisJSFdfVkFSX0gyQ19GV19PRkZMT0FEID0gMHg0ZSwKKwlIV19WQVJfUkVTRVRfV0ZDUkMgPSAweDRmLAogCi0JSFdfVkFSX0hBTkRMRV9GV19DMkgsCi0JSFdfVkFSX0RMX0ZXX1JTVkRfUEFHRSwKLQlIV19WQVJfQUlELAotCUhXX1ZBUl9IV19TRVFfRU5BQkxFLAotCUhXX1ZBUl9DT1JSRUNUX1RTRiwKLQlIV19WQVJfQkNOX1ZBTElELAotCUhXX1ZBUl9GV0xQU19SRl9PTiwKLQlIV19WQVJfRFVBTF9UU0ZfUlNULAotCUhXX1ZBUl9TV0lUQ0hfRVBIWV9Xb1dMQU4sCi0JSFdfVkFSX0lOVF9NSUdSQVRJT04sCi0JSFdfVkFSX0lOVF9BQywKLQlIV19WQVJfUkZfVElNSU5HLAorCUhXX1ZBUl9IQU5ETEVfRldfQzJIID0gMHg1MCwKKwlIV19WQVJfRExfRldfUlNWRF9QQUdFID0gMHg1MSwKKwlIV19WQVJfQUlEID0gMHg1MiwKKwlIV19WQVJfSFdfU0VRX0VOQUJMRSA9IDB4NTMsCisJSFdfVkFSX0NPUlJFQ1RfVFNGID0gMHg1NCwKKwlIV19WQVJfQkNOX1ZBTElEID0gMHg1NSwKKwlIV19WQVJfRldMUFNfUkZfT04gPSAweDU2LAorCUhXX1ZBUl9EVUFMX1RTRl9SU1QgPSAweDU3LAorCUhXX1ZBUl9TV0lUQ0hfRVBIWV9Xb1dMQU4gPSAweDU4LAorCUhXX1ZBUl9JTlRfTUlHUkFUSU9OID0gMHg1OSwKKwlIV19WQVJfSU5UX0FDID0gMHg1YSwKKwlIV19WQVJfUkZfVElNSU5HID0gMHg1YiwKIAotCUhBTF9ERUZfV09XTEFOLAotCUhXX1ZBUl9NUkMsCi0JSFdfVkFSX0tFRVBfQUxJVkUsCi0JSFdfVkFSX05BVl9VUFBFUiwKKwlIQUxfREVGX1dPV0xBTiA9IDB4NWMsCisJSFdfVkFSX01SQyA9IDB4NWQsCisJSFdfVkFSX0tFRVBfQUxJVkUgPSAweDVlLAorCUhXX1ZBUl9OQVZfVVBQRVIgPSAweDVmLAogCi0JSFdfVkFSX01HVF9GSUxURVIsCi0JSFdfVkFSX0NUUkxfRklMVEVSLAotCUhXX1ZBUl9EQVRBX0ZJTFRFUiwKKwlIV19WQVJfTUdUX0ZJTFRFUiA9IDB4NjAsCisJSFdfVkFSX0NUUkxfRklMVEVSID0gMHg2MSwKKwlIV19WQVJfREFUQV9GSUxURVIgPSAweDYyLAogfTsKIAogZW51bSBydF9tZWRpYV9zdGF0dXMgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2wxOHh4L2FjeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2wxOHh4L2FjeC5jCmluZGV4IDRiZTA0MDkuLmI1NTI1YTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsMTh4eC9hY3guYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDE4eHgvYWN4LmMKQEAgLTMwOSwzICszMDksMzIgQEAKIAlrZnJlZShhY3gpOwogCXJldHVybiByZXQ7CiB9CisKK2ludCB3bDE4eHhfYWN4X3RpbWVfc3luY19jZmcoc3RydWN0IHdsMTI3MSAqd2wpCit7CisJc3RydWN0IGFjeF90aW1lX3N5bmNfY2ZnICphY3g7CisJaW50IHJldDsKKworCXdsMTI3MV9kZWJ1ZyhERUJVR19BQ1gsICJhY3ggdGltZSBzeW5jIGNmZzogbW9kZSAlZCwgYWRkcjogJXBNIiwKKwkJICAgICB3bC0+Y29uZi5zZy5wYXJhbXNbV0wxOFhYX0NPTkZfU0dfVElNRV9TWU5DXSwKKwkJICAgICB3bC0+em9uZV9tYXN0ZXJfbWFjX2FkZHIpOworCisJYWN4ID0ga3phbGxvYyhzaXplb2YoKmFjeCksIEdGUF9LRVJORUwpOworCWlmICghYWN4KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWFjeC0+c3luY19tb2RlID0gd2wtPmNvbmYuc2cucGFyYW1zW1dMMThYWF9DT05GX1NHX1RJTUVfU1lOQ107CisJbWVtY3B5KGFjeC0+em9uZV9tYWNfYWRkciwgd2wtPnpvbmVfbWFzdGVyX21hY19hZGRyLCBFVEhfQUxFTik7CisKKwlyZXQgPSB3bDEyNzFfY21kX2NvbmZpZ3VyZSh3bCwgQUNYX1RJTUVfU1lOQ19DRkcsCisJCQkJICAgYWN4LCBzaXplb2YoKmFjeCkpOworCWlmIChyZXQgPCAwKSB7CisJCXdsMTI3MV93YXJuaW5nKCJhY3ggdGltZSBzeW5jIGNmZyBmYWlsZWQ6ICVkIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorb3V0OgorCWtmcmVlKGFjeCk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsMTh4eC9hY3guaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsMTh4eC9hY3guaAppbmRleCAzNDJhMjk5Li4yZWRiYmJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDE4eHgvYWN4LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2wxOHh4L2FjeC5oCkBAIC0zNyw2ICszNyw3IEBACiAJQUNYX1JYX0JBX0ZJTFRFUgkJID0gMHgwMDU4LAogCUFDWF9BUF9TTEVFUF9DRkcgICAgICAgICAgICAgICAgID0gMHgwMDU5LAogCUFDWF9EWU5BTUlDX1RSQUNFU19DRkcJCSA9IDB4MDA1QSwKKwlBQ1hfVElNRV9TWU5DX0NGRwkJID0gMHgwMDVCLAogfTsKIAogLyogbnVtYmVycyBvZiBiaXRzIHRoZSBsZW5ndGggZmllbGQgdGFrZXMgKGFkZCAxIGZvciB0aGUgYWN0dWFsIG51bWJlcikgKi8KQEAgLTM4OCw2ICszODksMTcgQEAKIAlfX2xlMzIgZHluYW1pY19md190cmFjZXM7CiB9IF9fcGFja2VkOwogCisvKgorICogQUNYX1RJTUVfU1lOQ19DRkcKKyAqIGNvbmZpZ3VyZSB0aGUgdGltZSBzeW5jIHBhcmFtZXRlcnMKKyAqLworc3RydWN0IGFjeF90aW1lX3N5bmNfY2ZnIHsKKwlzdHJ1Y3QgYWN4X2hlYWRlciBoZWFkZXI7CisJdTggc3luY19tb2RlOworCXU4IHpvbmVfbWFjX2FkZHJbRVRIX0FMRU5dOworCXU4IHBhZGRpbmdbMV07Cit9IF9fcGFja2VkOworCiBpbnQgd2wxOHh4X2FjeF9ob3N0X2lmX2NmZ19iaXRtYXAoc3RydWN0IHdsMTI3MSAqd2wsIHUzMiBob3N0X2NmZ19iaXRtYXAsCiAJCQkJICB1MzIgc2Rpb19ibGtfc2l6ZSwgdTMyIGV4dHJhX21lbV9ibGtzLAogCQkJCSAgdTMyIGxlbl9maWVsZF9zaXplKTsKQEAgLTQwMiw1ICs0MTQsNiBAQAogaW50IHdsMTh4eF9hY3hfcnhfYmFfZmlsdGVyKHN0cnVjdCB3bDEyNzEgKndsLCBib29sIGFjdGlvbik7CiBpbnQgd2wxOHh4X2FjeF9hcF9zbGVlcChzdHJ1Y3Qgd2wxMjcxICp3bCk7CiBpbnQgd2wxOHh4X2FjeF9keW5hbWljX2Z3X3RyYWNlcyhzdHJ1Y3Qgd2wxMjcxICp3bCk7CitpbnQgd2wxOHh4X2FjeF90aW1lX3N5bmNfY2ZnKHN0cnVjdCB3bDEyNzEgKndsKTsKIAogI2VuZGlmIC8qIF9fV0wxOFhYX0FDWF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsMTh4eC9ldmVudC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2wxOHh4L2V2ZW50LmMKaW5kZXggMmM1ZGY0My4uYjM2Y2UxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2wxOHh4L2V2ZW50LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2wxOHh4L2V2ZW50LmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CiAjaW5jbHVkZSAiZXZlbnQuaCIKICNpbmNsdWRlICJzY2FuLmgiCisjaW5jbHVkZSAiY29uZi5oIgogI2luY2x1ZGUgIi4uL3dsY29yZS9jbWQuaCIKICNpbmNsdWRlICIuLi93bGNvcmUvZGVidWcuaCIKICNpbmNsdWRlICIuLi93bGNvcmUvdmVuZG9yX2NtZC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2wxOHh4L21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsMTh4eC9tYWluLmMKaW5kZXggMDBhMDRkZi4uMDZkNjk0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2wxOHh4L21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDE4eHgvbWFpbi5jCkBAIC0xMzk3LDI1ICsxMzk3LDI0IEBACiAJcmV0dXJuIHJldDsKIH0KIAotI2RlZmluZSBXTDE4WFhfQ09ORl9GSUxFX05BTUUgInRpLWNvbm5lY3Rpdml0eS93bDE4eHgtY29uZi5iaW4iCi0KIHN0YXRpYyBpbnQgd2wxOHh4X2xvYWRfY29uZl9maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHdsY29yZV9jb25mICpjb25mLAotCQkJCSBzdHJ1Y3Qgd2wxOHh4X3ByaXZfY29uZiAqcHJpdl9jb25mKQorCQkJCSBzdHJ1Y3Qgd2wxOHh4X3ByaXZfY29uZiAqcHJpdl9jb25mLAorCQkJCSBjb25zdCBjaGFyICpmaWxlKQogewogCXN0cnVjdCB3bGNvcmVfY29uZl9maWxlICpjb25mX2ZpbGU7CiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKIAlpbnQgcmV0OwogCi0JcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIFdMMThYWF9DT05GX0ZJTEVfTkFNRSwgZGV2KTsKKwlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZmlsZSwgZGV2KTsKIAlpZiAocmV0IDwgMCkgewogCQl3bDEyNzFfZXJyb3IoImNvdWxkIG5vdCBnZXQgY29uZmlndXJhdGlvbiBiaW5hcnkgJXM6ICVkIiwKLQkJCSAgICAgV0wxOFhYX0NPTkZfRklMRV9OQU1FLCByZXQpOworCQkJICAgICBmaWxlLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCWlmIChmdy0+c2l6ZSAhPSBXTDE4WFhfQ09ORl9TSVpFKSB7Ci0JCXdsMTI3MV9lcnJvcigiY29uZmlndXJhdGlvbiBiaW5hcnkgZmlsZSBzaXplIGlzIHdyb25nLCBleHBlY3RlZCAlenUgZ290ICV6dSIsCi0JCQkgICAgIFdMMThYWF9DT05GX1NJWkUsIGZ3LT5zaXplKTsKKwkJd2wxMjcxX2Vycm9yKCIlcyBjb25maWd1cmF0aW9uIGJpbmFyeSBzaXplIGlzIHdyb25nLCBleHBlY3RlZCAlenUgZ290ICV6dSIsCisJCQkgICAgIGZpbGUsIFdMMThYWF9DT05GX1NJWkUsIGZ3LT5zaXplKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXRfcmVsZWFzZTsKIAl9CkBAIC0xNDQ4LDkgKzE0NDcsMTIgQEAKIAogc3RhdGljIGludCB3bDE4eHhfY29uZl9pbml0KHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHdsLT5wZGV2OworCXN0cnVjdCB3bGNvcmVfcGxhdGRldl9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CiAJc3RydWN0IHdsMTh4eF9wcml2ICpwcml2ID0gd2wtPnByaXY7CiAKLQlpZiAod2wxOHh4X2xvYWRfY29uZl9maWxlKGRldiwgJndsLT5jb25mLCAmcHJpdi0+Y29uZikgPCAwKSB7CisJaWYgKHdsMTh4eF9sb2FkX2NvbmZfZmlsZShkZXYsICZ3bC0+Y29uZiwgJnByaXYtPmNvbmYsCisJCQkJICBwZGF0YS0+ZmFtaWx5LT5jZmdfbmFtZSkgPCAwKSB7CiAJCXdsMTI3MV93YXJuaW5nKCJmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdCBjb25maWciKTsKIAogCQkvKiBhcHBseSBkcml2ZXIgZGVmYXVsdCBjb25maWd1cmF0aW9uICovCkBAIC0yMTQxLDQgKzIxNDMsMyBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwogTU9EVUxFX0FVVEhPUigiTHVjaWFubyBDb2VsaG8gPGNvZWxob0B0aS5jb20+Iik7CiBNT0RVTEVfRklSTVdBUkUoV0wxOFhYX0ZXX05BTUUpOwotTU9EVUxFX0ZJUk1XQVJFKFdMMThYWF9DT05GX0ZJTEVfTkFNRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvYm9vdC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL2Jvb3QuYwppbmRleCBmNzVkMzA0Li5mMDA1MDllIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvYm9vdC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS9ib290LmMKQEAgLTI4Miw2ICsyODIsOSBAQAogCiBpbnQgd2xjb3JlX2Jvb3RfdXBsb2FkX252cyhzdHJ1Y3Qgd2wxMjcxICp3bCkKIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gd2wtPnBkZXY7CisJc3RydWN0IHdsY29yZV9wbGF0ZGV2X2RhdGEgKnBkZXZfZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CisJY29uc3QgY2hhciAqbnZzX25hbWUgPSAidW5rbm93biI7CiAJc2l6ZV90IG52c19sZW4sIGJ1cnN0X2xlbjsKIAlpbnQgaTsKIAl1MzIgZGVzdF9hZGRyLCB2YWw7CkBAIC0yOTMsNiArMjk2LDkgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCisJaWYgKHBkZXZfZGF0YSAmJiBwZGV2X2RhdGEtPmZhbWlseSkKKwkJbnZzX25hbWUgPSBwZGV2X2RhdGEtPmZhbWlseS0+bnZzX25hbWU7CisKIAlpZiAod2wtPnF1aXJrcyAmIFdMQ09SRV9RVUlSS19MRUdBQ1lfTlZTKSB7CiAJCXN0cnVjdCB3bDEyNzFfbnZzX2ZpbGUgKm52cyA9CiAJCQkoc3RydWN0IHdsMTI3MV9udnNfZmlsZSAqKXdsLT5udnM7CkBAIC0zMTAsOCArMzE2LDkgQEAKIAkJaWYgKHdsLT5udnNfbGVuICE9IHNpemVvZihzdHJ1Y3Qgd2wxMjcxX252c19maWxlKSAmJgogCQkgICAgKHdsLT5udnNfbGVuICE9IFdMMTI3MV9JTklfTEVHQUNZX05WU19GSUxFX1NJWkUgfHwKIAkJICAgICB3bC0+ZW5hYmxlXzExYSkpIHsKLQkJCXdsMTI3MV9lcnJvcigibnZzIHNpemUgaXMgbm90IGFzIGV4cGVjdGVkOiAlenUgIT0gJXp1IiwKLQkJCQl3bC0+bnZzX2xlbiwgc2l6ZW9mKHN0cnVjdCB3bDEyNzFfbnZzX2ZpbGUpKTsKKwkJCXdsMTI3MV9lcnJvcigiJXMgc2l6ZSBpcyBub3QgYXMgZXhwZWN0ZWQ6ICV6dSAhPSAlenUiLAorCQkJCSAgICAgbnZzX25hbWUsIHdsLT5udnNfbGVuLAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCB3bDEyNzFfbnZzX2ZpbGUpKTsKIAkJCWtmcmVlKHdsLT5udnMpOwogCQkJd2wtPm52cyA9IE5VTEw7CiAJCQl3bC0+bnZzX2xlbiA9IDA7CkBAIC0zMjgsOCArMzM1LDggQEAKIAkJCWlmIChudnMtPmdlbmVyYWxfcGFyYW1zLmR1YWxfbW9kZV9zZWxlY3QpCiAJCQkJd2wtPmVuYWJsZV8xMWEgPSB0cnVlOwogCQl9IGVsc2UgewotCQkJd2wxMjcxX2Vycm9yKCJudnMgc2l6ZSBpcyBub3QgYXMgZXhwZWN0ZWQ6ICV6dSAhPSAlenUiLAotCQkJCSAgICAgd2wtPm52c19sZW4sCisJCQl3bDEyNzFfZXJyb3IoIiVzIHNpemUgaXMgbm90IGFzIGV4cGVjdGVkOiAlenUgIT0gJXp1IiwKKwkJCQkgICAgIG52c19uYW1lLCB3bC0+bnZzX2xlbiwKIAkJCQkgICAgIHNpemVvZihzdHJ1Y3Qgd2wxMjh4X252c19maWxlKSk7CiAJCQlrZnJlZSh3bC0+bnZzKTsKIAkJCXdsLT5udnMgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS9tYWluLmMKaW5kZXggMWQ2ODkxNi4uNDcxNTIxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvbWFpbi5jCkBAIC00OTg2LDcgKzQ5ODYsNiBAQAogCQlyZXR1cm4gcmV0OwogCiAJd2xfc3RhID0gKHN0cnVjdCB3bDEyNzFfc3RhdGlvbiAqKXN0YS0+ZHJ2X3ByaXY7Ci0Jd2xfc3RhLT53bCA9IHdsOwogCWhsaWQgPSB3bF9zdGEtPmhsaWQ7CiAKIAlyZXQgPSB3bDEyeHhfY21kX2FkZF9wZWVyKHdsLCB3bHZpZiwgc3RhLCBobGlkKTsKQEAgLTU3MDAsMTAgKzU2OTksMTEgQEAKIAltdXRleF91bmxvY2soJndsLT5tdXRleCk7CiB9CiAKLXN0YXRpYyB1MzIgd2xjb3JlX29wX2dldF9leHBlY3RlZF90aHJvdWdocHV0KHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCitzdGF0aWMgdTMyIHdsY29yZV9vcF9nZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQogewogCXN0cnVjdCB3bDEyNzFfc3RhdGlvbiAqd2xfc3RhID0gKHN0cnVjdCB3bDEyNzFfc3RhdGlvbiAqKXN0YS0+ZHJ2X3ByaXY7Ci0Jc3RydWN0IHdsMTI3MSAqd2wgPSB3bF9zdGEtPndsOworCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7CiAJdTggaGxpZCA9IHdsX3N0YS0+aGxpZDsKIAogCS8qIHJldHVybiBpbiB1bml0cyBvZiBLYnBzICovCkBAIC02NDEzLDkgKzY0MTMsMTIgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAJCXdsLT5udnNfbGVuID0gZnctPnNpemU7Ci0JfSBlbHNlIHsKKwl9IGVsc2UgaWYgKHBkZXZfZGF0YS0+ZmFtaWx5LT5udnNfbmFtZSkgewogCQl3bDEyNzFfZGVidWcoREVCVUdfQk9PVCwgIkNvdWxkIG5vdCBnZXQgbnZzIGZpbGUgJXMiLAotCQkJICAgICBXTDEyWFhfTlZTX05BTUUpOworCQkJICAgICBwZGV2X2RhdGEtPmZhbWlseS0+bnZzX25hbWUpOworCQl3bC0+bnZzID0gTlVMTDsKKwkJd2wtPm52c19sZW4gPSAwOworCX0gZWxzZSB7CiAJCXdsLT5udnMgPSBOVUxMOwogCQl3bC0+bnZzX2xlbiA9IDA7CiAJfQpAQCAtNjUxMCwyMSArNjUxMywyOSBAQAogCiBpbnQgd2xjb3JlX3Byb2JlKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCWludCByZXQ7CisJc3RydWN0IHdsY29yZV9wbGF0ZGV2X2RhdGEgKnBkZXZfZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CisJY29uc3QgY2hhciAqbnZzX25hbWU7CisJaW50IHJldCA9IDA7CiAKLQlpZiAoIXdsLT5vcHMgfHwgIXdsLT5wdGFibGUpCisJaWYgKCF3bC0+b3BzIHx8ICF3bC0+cHRhYmxlIHx8ICFwZGV2X2RhdGEpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJd2wtPmRldiA9ICZwZGV2LT5kZXY7CiAJd2wtPnBkZXYgPSBwZGV2OwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHdsKTsKIAotCXJldCA9IHJlcXVlc3RfZmlybXdhcmVfbm93YWl0KFRISVNfTU9EVUxFLCBGV19BQ1RJT05fSE9UUExVRywKLQkJCQkgICAgICBXTDEyWFhfTlZTX05BTUUsICZwZGV2LT5kZXYsIEdGUF9LRVJORUwsCi0JCQkJICAgICAgd2wsIHdsY29yZV9udnNfY2IpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXdsMTI3MV9lcnJvcigicmVxdWVzdF9maXJtd2FyZV9ub3dhaXQgZmFpbGVkOiAlZCIsIHJldCk7Ci0JCWNvbXBsZXRlX2FsbCgmd2wtPm52c19sb2FkaW5nX2NvbXBsZXRlKTsKKwlpZiAocGRldl9kYXRhLT5mYW1pbHkgJiYgcGRldl9kYXRhLT5mYW1pbHktPm52c19uYW1lKSB7CisJCW52c19uYW1lID0gcGRldl9kYXRhLT5mYW1pbHktPm52c19uYW1lOworCQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlX25vd2FpdChUSElTX01PRFVMRSwgRldfQUNUSU9OX0hPVFBMVUcsCisJCQkJCSAgICAgIG52c19uYW1lLCAmcGRldi0+ZGV2LCBHRlBfS0VSTkVMLAorCQkJCQkgICAgICB3bCwgd2xjb3JlX252c19jYik7CisJCWlmIChyZXQgPCAwKSB7CisJCQl3bDEyNzFfZXJyb3IoInJlcXVlc3RfZmlybXdhcmVfbm93YWl0IGZhaWxlZCBmb3IgJXM6ICVkIiwKKwkJCQkgICAgIG52c19uYW1lLCByZXQpOworCQkJY29tcGxldGVfYWxsKCZ3bC0+bnZzX2xvYWRpbmdfY29tcGxldGUpOworCQl9CisJfSBlbHNlIHsKKwkJd2xjb3JlX252c19jYihOVUxMLCB3bCk7CiAJfQogCiAJcmV0dXJuIHJldDsKQEAgLTY1MzMsOSArNjU0NCwxMSBAQAogCiBpbnQgd2xjb3JlX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCXN0cnVjdCB3bGNvcmVfcGxhdGRldl9kYXRhICpwZGV2X2RhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwogCXN0cnVjdCB3bDEyNzEgKndsID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ3bC0+bnZzX2xvYWRpbmdfY29tcGxldGUpOworCWlmIChwZGV2X2RhdGEtPmZhbWlseSAmJiBwZGV2X2RhdGEtPmZhbWlseS0+bnZzX25hbWUpCisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJndsLT5udnNfbG9hZGluZ19jb21wbGV0ZSk7CiAJaWYgKCF3bC0+aW5pdGlhbGl6ZWQpCiAJCXJldHVybiAwOwogCkBAIC02NTcyLDQgKzY1ODUsMyBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiTHVjaWFubyBDb2VsaG8gPGNvZWxob0B0aS5jb20+Iik7CiBNT0RVTEVfQVVUSE9SKCJKdXVzbyBPaWthcmluZW4gPGp1dXNvLm9pa2FyaW5lbkBub2tpYS5jb20+Iik7Ci1NT0RVTEVfRklSTVdBUkUoV0wxMlhYX05WU19OQU1FKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS9zZGlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvc2Rpby5jCmluZGV4IDU4MzlhY2IuLmE2ZTk0YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS9zZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL3NkaW8uYwpAQCAtMjE2LDE3ICsyMTYsMzMgQEAKIH07CiAKICNpZmRlZiBDT05GSUdfT0YKKworc3RhdGljIGNvbnN0IHN0cnVjdCB3aWxpbmtfZmFtaWx5X2RhdGEgd2wxMjd4X2RhdGEgPSB7CisJLm5hbWUgPSAid2wxMjd4IiwKKwkubnZzX25hbWUgPSAidGktY29ubmVjdGl2aXR5L3dsMTI3eC1udnMuYmluIiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2lsaW5rX2ZhbWlseV9kYXRhIHdsMTI4eF9kYXRhID0geworCS5uYW1lID0gIndsMTI4eCIsCisJLm52c19uYW1lID0gInRpLWNvbm5lY3Rpdml0eS93bDEyOHgtbnZzLmJpbiIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHdpbGlua19mYW1pbHlfZGF0YSB3bDE4eHhfZGF0YSA9IHsKKwkubmFtZSA9ICJ3bDE4eHgiLAorCS5jZmdfbmFtZSA9ICJ0aS1jb25uZWN0aXZpdHkvd2wxOHh4LWNvbmYuYmluIiwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdsY29yZV9zZGlvX29mX21hdGNoX3RhYmxlW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDEyNzEiIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDEyNzMiIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDEyODEiIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDEyODMiIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDE4MDEiIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDE4MDUiIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDE4MDciIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDE4MzEiIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDE4MzUiIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDE4MzciIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDEyNzEiLCAuZGF0YSA9ICZ3bDEyN3hfZGF0YSB9LAorCXsgLmNvbXBhdGlibGUgPSAidGksd2wxMjczIiwgLmRhdGEgPSAmd2wxMjd4X2RhdGEgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLHdsMTI4MSIsIC5kYXRhID0gJndsMTI4eF9kYXRhIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDEyODMiLCAuZGF0YSA9ICZ3bDEyOHhfZGF0YSB9LAorCXsgLmNvbXBhdGlibGUgPSAidGksd2wxODAxIiwgLmRhdGEgPSAmd2wxOHh4X2RhdGEgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLHdsMTgwNSIsIC5kYXRhID0gJndsMTh4eF9kYXRhIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDE4MDciLCAuZGF0YSA9ICZ3bDE4eHhfZGF0YSB9LAorCXsgLmNvbXBhdGlibGUgPSAidGksd2wxODMxIiwgLmRhdGEgPSAmd2wxOHh4X2RhdGEgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLHdsMTgzNSIsIC5kYXRhID0gJndsMTh4eF9kYXRhIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDE4MzciLCAuZGF0YSA9ICZ3bDE4eHhfZGF0YSB9LAogCXsgfQogfTsKIApAQCAtMjM0LDkgKzI1MCwxMyBAQAogCQkJICAgc3RydWN0IHdsY29yZV9wbGF0ZGV2X2RhdGEgKnBkZXZfZGF0YSkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkOwogCi0JaWYgKCFucCB8fCAhb2ZfbWF0Y2hfbm9kZSh3bGNvcmVfc2Rpb19vZl9tYXRjaF90YWJsZSwgbnApKQotCQlyZXR1cm4gLUVOT0RBVEE7CisJb2ZfaWQgPSBvZl9tYXRjaF9ub2RlKHdsY29yZV9zZGlvX29mX21hdGNoX3RhYmxlLCBucCk7CisJaWYgKCFvZl9pZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwZGV2X2RhdGEtPmZhbWlseSA9IG9mX2lkLT5kYXRhOwogCiAJKmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKIAlpZiAoISppcnEpIHsKQEAgLTI2Myw3ICsyODMsNyBAQAogc3RhdGljIGludCB3bDEyNzFfcHJvYmUoc3RydWN0IHNkaW9fZnVuYyAqZnVuYywKIAkJCQkgIGNvbnN0IHN0cnVjdCBzZGlvX2RldmljZV9pZCAqaWQpCiB7Ci0Jc3RydWN0IHdsY29yZV9wbGF0ZGV2X2RhdGEgcGRldl9kYXRhOworCXN0cnVjdCB3bGNvcmVfcGxhdGRldl9kYXRhICpwZGV2X2RhdGE7CiAJc3RydWN0IHdsMTJ4eF9zZGlvX2dsdWUgKmdsdWU7CiAJc3RydWN0IHJlc291cmNlIHJlc1sxXTsKIAltbWNfcG1fZmxhZ190IG1tY2ZsYWdzOwpAQCAtMjc1LDE0ICsyOTUsMTUgQEAKIAlpZiAoZnVuYy0+bnVtICE9IDB4MDIpCiAJCXJldHVybiAtRU5PREVWOwogCi0JbWVtc2V0KCZwZGV2X2RhdGEsIDB4MDAsIHNpemVvZihwZGV2X2RhdGEpKTsKLQlwZGV2X2RhdGEuaWZfb3BzID0gJnNkaW9fb3BzOworCXBkZXZfZGF0YSA9IGRldm1fa3phbGxvYygmZnVuYy0+ZGV2LCBzaXplb2YoKnBkZXZfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghcGRldl9kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKIAotCWdsdWUgPSBremFsbG9jKHNpemVvZigqZ2x1ZSksIEdGUF9LRVJORUwpOwotCWlmICghZ2x1ZSkgewotCQlkZXZfZXJyKCZmdW5jLT5kZXYsICJjYW4ndCBhbGxvY2F0ZSBnbHVlXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQorCXBkZXZfZGF0YS0+aWZfb3BzID0gJnNkaW9fb3BzOworCisJZ2x1ZSA9IGRldm1fa3phbGxvYygmZnVuYy0+ZGV2LCBzaXplb2YoKmdsdWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdsdWUpCisJCXJldHVybiAtRU5PTUVNOwogCiAJZ2x1ZS0+ZGV2ID0gJmZ1bmMtPmRldjsKIApAQCAtMjkyLDE2ICszMTMsMTYgQEAKIAkvKiBVc2UgYmxvY2sgbW9kZSBmb3IgdHJhbnNmZXJyaW5nIG92ZXIgb25lIGJsb2NrIHNpemUgb2YgZGF0YSAqLwogCWZ1bmMtPmNhcmQtPnF1aXJrcyB8PSBNTUNfUVVJUktfQkxLU1pfRk9SX0JZVEVfTU9ERTsKIAotCXJldCA9IHdsY29yZV9wcm9iZV9vZigmZnVuYy0+ZGV2LCAmaXJxLCAmcGRldl9kYXRhKTsKKwlyZXQgPSB3bGNvcmVfcHJvYmVfb2YoJmZ1bmMtPmRldiwgJmlycSwgcGRldl9kYXRhKTsKIAlpZiAocmV0KQotCQlnb3RvIG91dF9mcmVlX2dsdWU7CisJCWdvdG8gb3V0OwogCiAJLyogaWYgc2RpbyBjYW4ga2VlcCBwb3dlciB3aGlsZSBob3N0IGlzIHN1c3BlbmRlZCwgZW5hYmxlIHdvdyAqLwogCW1tY2ZsYWdzID0gc2Rpb19nZXRfaG9zdF9wbV9jYXBzKGZ1bmMpOwogCWRldl9kYmcoZ2x1ZS0+ZGV2LCAic2RpbyBQTSBjYXBzID0gMHgleFxuIiwgbW1jZmxhZ3MpOwogCiAJaWYgKG1tY2ZsYWdzICYgTU1DX1BNX0tFRVBfUE9XRVIpCi0JCXBkZXZfZGF0YS5wd3JfaW5fc3VzcGVuZCA9IHRydWU7CisJCXBkZXZfZGF0YS0+cHdyX2luX3N1c3BlbmQgPSB0cnVlOwogCiAJc2Rpb19zZXRfZHJ2ZGF0YShmdW5jLCBnbHVlKTsKIApAQCAtMzIzLDcgKzM0NCw3IEBACiAJaWYgKCFnbHVlLT5jb3JlKSB7CiAJCWRldl9lcnIoZ2x1ZS0+ZGV2LCAiY2FuJ3QgYWxsb2NhdGUgcGxhdGZvcm1fZGV2aWNlIik7CiAJCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X2ZyZWVfZ2x1ZTsKKwkJZ290byBvdXQ7CiAJfQogCiAJZ2x1ZS0+Y29yZS0+ZGV2LnBhcmVudCA9ICZmdW5jLT5kZXY7CkBAIC0zNDEsOCArMzYyLDggQEAKIAkJZ290byBvdXRfZGV2X3B1dDsKIAl9CiAKLQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEoZ2x1ZS0+Y29yZSwgJnBkZXZfZGF0YSwKLQkJCQkgICAgICAgc2l6ZW9mKHBkZXZfZGF0YSkpOworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShnbHVlLT5jb3JlLCBwZGV2X2RhdGEsCisJCQkJICAgICAgIHNpemVvZigqcGRldl9kYXRhKSk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGdsdWUtPmRldiwgImNhbid0IGFkZCBwbGF0Zm9ybSBkYXRhXG4iKTsKIAkJZ290byBvdXRfZGV2X3B1dDsKQEAgLTM1OCw5ICszNzksNiBAQAogb3V0X2Rldl9wdXQ6CiAJcGxhdGZvcm1fZGV2aWNlX3B1dChnbHVlLT5jb3JlKTsKIAotb3V0X2ZyZWVfZ2x1ZToKLQlrZnJlZShnbHVlKTsKLQogb3V0OgogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvc3BpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvc3BpLmMKaW5kZXggNmQyNDA0MC4uZjk0OWFkMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS9zcGkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvc3BpLmMKQEAgLTc5LDE5ICs3OSwxOSBAQAogI2RlZmluZSBXU1BJX01BWF9OVU1fT0ZfQ0hVTktTIFwKIAkoKFNQSV9BR0dSX0JVRkZFUl9TSVpFIC8gV1NQSV9NQVhfQ0hVTktfU0laRSkgKyAxKQogCi0KLXN0cnVjdCB3aWxpbmtfZmFtaWxpeV9kYXRhIHsKLQljaGFyIG5hbWVbOF07CitzdGF0aWMgY29uc3Qgc3RydWN0IHdpbGlua19mYW1pbHlfZGF0YSB3bDEyN3hfZGF0YSA9IHsKKwkubmFtZSA9ICJ3bDEyN3giLAorCS5udnNfbmFtZSA9ICJ0aS1jb25uZWN0aXZpdHkvd2wxMjd4LW52cy5iaW4iLAogfTsKIAotY29uc3Qgc3RydWN0IHdpbGlua19mYW1pbGl5X2RhdGEgKndpbGlua19kYXRhOworc3RhdGljIGNvbnN0IHN0cnVjdCB3aWxpbmtfZmFtaWx5X2RhdGEgd2wxMjh4X2RhdGEgPSB7CisJLm5hbWUgPSAid2wxMjh4IiwKKwkubnZzX25hbWUgPSAidGktY29ubmVjdGl2aXR5L3dsMTI4eC1udnMuYmluIiwKK307CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2lsaW5rX2ZhbWlsaXlfZGF0YSB3bDE4eHhfZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2lsaW5rX2ZhbWlseV9kYXRhIHdsMTh4eF9kYXRhID0gewogCS5uYW1lID0gIndsMTh4eCIsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHdpbGlua19mYW1pbGl5X2RhdGEgd2wxMnh4X2RhdGEgPSB7Ci0JLm5hbWUgPSAid2wxMnh4IiwKKwkuY2ZnX25hbWUgPSAidGktY29ubmVjdGl2aXR5L3dsMTh4eC1jb25mLmJpbiIsCiB9OwogCiBzdHJ1Y3Qgd2wxMnh4X3NwaV9nbHVlIHsKQEAgLTQyOSwxMCArNDI5LDEwIEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bGNvcmVfc3BpX29mX21hdGNoX3RhYmxlW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDEyNzEiLCAuZGF0YSA9ICZ3bDEyeHhfZGF0YX0sCi0JeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDEyNzMiLCAuZGF0YSA9ICZ3bDEyeHhfZGF0YX0sCi0JeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDEyODEiLCAuZGF0YSA9ICZ3bDEyeHhfZGF0YX0sCi0JeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDEyODMiLCAuZGF0YSA9ICZ3bDEyeHhfZGF0YX0sCisJeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDEyNzEiLCAuZGF0YSA9ICZ3bDEyN3hfZGF0YX0sCisJeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDEyNzMiLCAuZGF0YSA9ICZ3bDEyN3hfZGF0YX0sCisJeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDEyODEiLCAuZGF0YSA9ICZ3bDEyOHhfZGF0YX0sCisJeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDEyODMiLCAuZGF0YSA9ICZ3bDEyOHhfZGF0YX0sCiAJeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDE4MDEiLCAuZGF0YSA9ICZ3bDE4eHhfZGF0YX0sCiAJeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDE4MDUiLCAuZGF0YSA9ICZ3bDE4eHhfZGF0YX0sCiAJeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDE4MDciLCAuZGF0YSA9ICZ3bDE4eHhfZGF0YX0sCkBAIC00NjAsOSArNDYwLDkgQEAKIAlpZiAoIW9mX2lkKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXdpbGlua19kYXRhID0gb2ZfaWQtPmRhdGE7Ci0JZGV2X2luZm8oJnNwaS0+ZGV2LCAic2VsZWN0ZWQgY2hpcCBmYW1pbGl5IGlzICVzXG4iLAotCQkgd2lsaW5rX2RhdGEtPm5hbWUpOworCXBkZXZfZGF0YS0+ZmFtaWx5ID0gb2ZfaWQtPmRhdGE7CisJZGV2X2luZm8oJnNwaS0+ZGV2LCAic2VsZWN0ZWQgY2hpcCBmYW1pbHkgaXMgJXNcbiIsCisJCSBwZGV2X2RhdGEtPmZhbWlseS0+bmFtZSk7CiAKIAlpZiAob2ZfZmluZF9wcm9wZXJ0eShkdF9ub2RlLCAiY2xvY2steHRhbCIsIE5VTEwpKQogCQlwZGV2X2RhdGEtPnJlZl9jbG9ja194dGFsID0gdHJ1ZTsKQEAgLTQ3OSwxMyArNDc5LDE1IEBACiBzdGF0aWMgaW50IHdsMTI3MV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCXN0cnVjdCB3bDEyeHhfc3BpX2dsdWUgKmdsdWU7Ci0Jc3RydWN0IHdsY29yZV9wbGF0ZGV2X2RhdGEgcGRldl9kYXRhOworCXN0cnVjdCB3bGNvcmVfcGxhdGRldl9kYXRhICpwZGV2X2RhdGE7CiAJc3RydWN0IHJlc291cmNlIHJlc1sxXTsKIAlpbnQgcmV0OwogCi0JbWVtc2V0KCZwZGV2X2RhdGEsIDB4MDAsIHNpemVvZihwZGV2X2RhdGEpKTsKKwlwZGV2X2RhdGEgPSBkZXZtX2t6YWxsb2MoJnNwaS0+ZGV2LCBzaXplb2YoKnBkZXZfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghcGRldl9kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKIAotCXBkZXZfZGF0YS5pZl9vcHMgPSAmc3BpX29wczsKKwlwZGV2X2RhdGEtPmlmX29wcyA9ICZzcGlfb3BzOwogCiAJZ2x1ZSA9IGRldm1fa3phbGxvYygmc3BpLT5kZXYsIHNpemVvZigqZ2x1ZSksIEdGUF9LRVJORUwpOwogCWlmICghZ2x1ZSkgewpAQCAtNTA5LDcgKzUxMSw3IEBACiAJCXJldHVybiBQVFJfRVJSKGdsdWUtPnJlZyk7CiAJfQogCi0JcmV0ID0gd2xjb3JlX3Byb2JlX29mKHNwaSwgZ2x1ZSwgJnBkZXZfZGF0YSk7CisJcmV0ID0gd2xjb3JlX3Byb2JlX29mKHNwaSwgZ2x1ZSwgcGRldl9kYXRhKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoZ2x1ZS0+ZGV2LAogCQkJImNhbid0IGdldCBkZXZpY2UgdHJlZSBwYXJhbWV0ZXJzICglZClcbiIsIHJldCk7CkBAIC01MjIsNyArNTI0LDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlnbHVlLT5jb3JlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKHdpbGlua19kYXRhLT5uYW1lLAorCWdsdWUtPmNvcmUgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MocGRldl9kYXRhLT5mYW1pbHktPm5hbWUsCiAJCQkJCSAgIFBMQVRGT1JNX0RFVklEX0FVVE8pOwogCWlmICghZ2x1ZS0+Y29yZSkgewogCQlkZXZfZXJyKGdsdWUtPmRldiwgImNhbid0IGFsbG9jYXRlIHBsYXRmb3JtX2RldmljZVxuIik7CkBAIC01NDMsOCArNTQ1LDggQEAKIAkJZ290byBvdXRfZGV2X3B1dDsKIAl9CiAKLQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEoZ2x1ZS0+Y29yZSwgJnBkZXZfZGF0YSwKLQkJCQkgICAgICAgc2l6ZW9mKHBkZXZfZGF0YSkpOworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShnbHVlLT5jb3JlLCBwZGV2X2RhdGEsCisJCQkJICAgICAgIHNpemVvZigqcGRldl9kYXRhKSk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGdsdWUtPmRldiwgImNhbid0IGFkZCBwbGF0Zm9ybSBkYXRhXG4iKTsKIAkJZ290byBvdXRfZGV2X3B1dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS93bGNvcmUuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS93bGNvcmUuaAppbmRleCA4ZjI4YWEwLi4xODI3NTQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvd2xjb3JlLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL3dsY29yZS5oCkBAIC01MDEsNiArNTAxLDkgQEAKIAogCS8qIGR5bmFtaWMgZncgdHJhY2VzICovCiAJdTMyIGR5bmFtaWNfZndfdHJhY2VzOworCisJLyogdGltZSBzeW5jIHpvbmUgbWFzdGVyICovCisJdTggem9uZV9tYXN0ZXJfbWFjX2FkZHJbRVRIX0FMRU5dOwogfTsKIAogaW50IHdsY29yZV9wcm9iZShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvd2xjb3JlX2kuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS93bGNvcmVfaS5oCmluZGV4IDI0MmI0ZTMuLmU4NDA5ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS93bGNvcmVfaS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS93bGNvcmVfaS5oCkBAIC0zNSwxMiArMzUsMTEgQEAKICNpbmNsdWRlICJjb25mLmgiCiAjaW5jbHVkZSAiaW5pLmgiCiAKLS8qCi0gKiB3bDEyN3ggYW5kIHdsMTI4eCBhcmUgdXNpbmcgdGhlIHNhbWUgTlZTIGZpbGUgbmFtZS4gSG93ZXZlciwgdGhlCi0gKiBpbmkgcGFyYW1ldGVycyBiZXR3ZWVuIHRoZW0gYXJlIGRpZmZlcmVudC4gIFRoZSBkcml2ZXIgdmFsaWRhdGVzCi0gKiB0aGUgY29ycmVjdCBOVlMgc2l6ZSBpbiB3bDEyNzFfYm9vdF91cGxvYWRfbnZzKCkuCi0gKi8KLSNkZWZpbmUgV0wxMlhYX05WU19OQU1FICJ0aS1jb25uZWN0aXZpdHkvd2wxMjcxLW52cy5iaW4iCitzdHJ1Y3Qgd2lsaW5rX2ZhbWlseV9kYXRhIHsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKm52c19uYW1lOwkvKiB3bDEyeHggbnZzIGZpbGUgKi8KKwljb25zdCBjaGFyICpjZmdfbmFtZTsJLyogd2wxOHh4IGNmZyBmaWxlICovCit9OwogCiAjZGVmaW5lIFdMMTI3MV9UWF9TRUNVUklUWV9MTzE2KHMpICgodTE2KSgocykgJiAweGZmZmYpKQogI2RlZmluZSBXTDEyNzFfVFhfU0VDVVJJVFlfSEkzMihzKSAoKHUzMikoKChzKSA+PiAxNikgJiAweGZmZmZmZmZmKSkKQEAgLTIwOCw2ICsyMDcsNyBAQAogCiBzdHJ1Y3Qgd2xjb3JlX3BsYXRkZXZfZGF0YSB7CiAJc3RydWN0IHdsMTI3MV9pZl9vcGVyYXRpb25zICppZl9vcHM7CisJY29uc3Qgc3RydWN0IHdpbGlua19mYW1pbHlfZGF0YSAqZmFtaWx5OwogCiAJYm9vbCByZWZfY2xvY2tfeHRhbDsJLyogc3BlY2lmeSB3aGV0aGVyIHRoZSBjbG9jayBpcyBYVEFMIG9yIG5vdCAqLwogCXUzMiByZWZfY2xvY2tfZnJlcTsJLyogaW4gSGVydHogKi8KQEAgLTM0Nyw3ICszNDcsNiBAQAogCSAqIFVzZWQgaW4gYm90aCBBUCBhbmQgU1RBIG1vZGUuCiAJICovCiAJdTY0IHRvdGFsX2ZyZWVkX3BrdHM7Ci0Jc3RydWN0IHdsMTI3MSAqd2w7CiB9OwogCiBzdHJ1Y3Qgd2wxMnh4X3ZpZiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDFfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMzUwMV9jcy5jCmluZGV4IDgyZDk0ZjguLjkzMmYzZjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDFfY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDFfY3MuYwpAQCAtMTI1OCw3ICsxMjU4LDkgQEAKIHsKIAlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCByYyA9IC1FTk9ERVY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZ0aGlzLT5sb2NrLCBmbGFncyk7CiAJd2wzNTAxX2Jsb2NrX2ludGVycnVwdCh0aGlzKTsKIAogCWlmICh3bDM1MDFfaW5pdF9maXJtd2FyZSh0aGlzKSkgewpAQCAtMTI4MCwyMCArMTI4MiwxNyBAQAogCXByX2RlYnVnKCIlczogZGV2aWNlIHJlc2V0IiwgZGV2LT5uYW1lKTsKIAlyYyA9IDA7CiBvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhpcy0+bG9jaywgZmxhZ3MpOwogCXJldHVybiByYzsKIH0KIAogc3RhdGljIHZvaWQgd2wzNTAxX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgd2wzNTAxX2NhcmQgKnRoaXMgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZkZXYtPnN0YXRzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJjOwogCiAJc3RhdHMtPnR4X2Vycm9ycysrOwotCXNwaW5fbG9ja19pcnFzYXZlKCZ0aGlzLT5sb2NrLCBmbGFncyk7CiAJcmMgPSB3bDM1MDFfcmVzZXQoZGV2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGlzLT5sb2NrLCBmbGFncyk7CiAJaWYgKHJjKQogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFcnJvciAlZCByZXNldHRpbmcgY2FyZCBvbiBUeCB0aW1lb3V0IVxuIiwKIAkJICAgICAgIGRldi0+bmFtZSwgcmMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvenlkYXMvemQxMjExcncvemRfdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96eWRhcy96ZDEyMTFydy96ZF91c2IuYwppbmRleCBhOTEyZGMwLi5jNWVmZmQ2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvenlkYXMvemQxMjExcncvemRfdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvenlkYXMvemQxMjExcncvemRfdXNiLmMKQEAgLTE5Myw3ICsxOTMsNyBAQAogCQkJMCwgMCwgcCwgc2l6ZW9mKHJldCksIDUwMDAgLyogbXMgKi8pOwogCQlpZiAociAhPSBzaXplb2YocmV0KSkgewogCQkJZGV2X2VycigmdWRldi0+ZGV2LAotCQkJCSJjb250cm9sIHJlcXVlc3QgZmlybWV3YXJlIGNvbmZpcm1hdGlvbiBmYWlsZWQuIgorCQkJCSJjb250cm9sIHJlcXVlc3QgZmlybXdhcmUgY29uZmlybWF0aW9uIGZhaWxlZC4iCiAJCQkJIiBSZXR1cm4gdmFsdWUgJWRcbiIsIHIpOwogCQkJaWYgKHIgPj0gMCkKIAkJCQlyID0gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL2NvbW1vbi5oIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svY29tbW9uLmgKaW5kZXggODRkNmNiZC4uYjM4ZmIyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svY29tbW9uLmgKKysrIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svY29tbW9uLmgKQEAgLTI5Miw4ICsyOTIsNiBAQAogI2VuZGlmCiAKIAlzdHJ1Y3QgeGVuX25ldGlmX2N0cmxfYmFja19yaW5nIGN0cmw7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICpjdHJsX3Rhc2s7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgY3RybF93cTsKIAl1bnNpZ25lZCBpbnQgY3RybF9pcnE7CiAKIAkvKiBNaXNjZWxsYW5lb3VzIHByaXZhdGUgc3R1ZmYuICovCkBAIC0zNTksNyArMzU3LDcgQEAKIAogaW50IHhlbnZpZl9kZWFsbG9jX2t0aHJlYWQodm9pZCAqZGF0YSk7CiAKLWludCB4ZW52aWZfY3RybF9rdGhyZWFkKHZvaWQgKmRhdGEpOworaXJxcmV0dXJuX3QgeGVudmlmX2N0cmxfaXJxX2ZuKGludCBpcnEsIHZvaWQgKmRhdGEpOwogCiB2b2lkIHhlbnZpZl9yeF9xdWV1ZV90YWlsKHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svaGFzaC5jIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svaGFzaC5jCmluZGV4IGZiODdjYjMuLjYxM2JhYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL2hhc2guYworKysgYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9oYXNoLmMKQEAgLTMyLDE1ICszMiw2IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3QuaD4KIAotc3RhdGljIHZvaWQgeGVudmlmX2RlbF9oYXNoKHN0cnVjdCByY3VfaGVhZCAqcmN1KQotewotCXN0cnVjdCB4ZW52aWZfaGFzaF9jYWNoZV9lbnRyeSAqZW50cnk7Ci0KLQllbnRyeSA9IGNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCB4ZW52aWZfaGFzaF9jYWNoZV9lbnRyeSwgcmN1KTsKLQotCWtmcmVlKGVudHJ5KTsKLX0KLQogc3RhdGljIHZvaWQgeGVudmlmX2FkZF9oYXNoKHN0cnVjdCB4ZW52aWYgKnZpZiwgY29uc3QgdTggKnRhZywKIAkJCSAgICB1bnNpZ25lZCBpbnQgbGVuLCB1MzIgdmFsKQogewpAQCAtNzYsNyArNjcsNyBAQAogCQlpZiAoKyt2aWYtPmhhc2guY2FjaGUuY291bnQgPiB4ZW52aWZfaGFzaF9jYWNoZV9zaXplKSB7CiAJCQlsaXN0X2RlbF9yY3UoJm9sZGVzdC0+bGluayk7CiAJCQl2aWYtPmhhc2guY2FjaGUuY291bnQtLTsKLQkJCWNhbGxfcmN1KCZvbGRlc3QtPnJjdSwgeGVudmlmX2RlbF9oYXNoKTsKKwkJCWtmcmVlX3JjdShvbGRlc3QsIHJjdSk7CiAJCX0KIAl9CiAKQEAgLTExNCw3ICsxMDUsNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGVudHJ5LCAmdmlmLT5oYXNoLmNhY2hlLmxpc3QsIGxpbmspIHsKIAkJbGlzdF9kZWxfcmN1KCZlbnRyeS0+bGluayk7CiAJCXZpZi0+aGFzaC5jYWNoZS5jb3VudC0tOwotCQljYWxsX3JjdSgmZW50cnktPnJjdSwgeGVudmlmX2RlbF9oYXNoKTsKKwkJa2ZyZWVfcmN1KGVudHJ5LCByY3UpOwogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpZi0+aGFzaC5jYWNoZS5sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9pbnRlcmZhY2UuYyBiL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL2ludGVyZmFjZS5jCmluZGV4IDgzZGVlZWIuLmZiNTBjNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL2ludGVyZmFjZS5jCisrKyBiL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL2ludGVyZmFjZS5jCkBAIC0xMjgsMTUgKzEyOCw2IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1pcnFyZXR1cm5fdCB4ZW52aWZfY3RybF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXN0cnVjdCB4ZW52aWYgKnZpZiA9IGRldl9pZDsKLQotCXdha2VfdXAoJnZpZi0+Y3RybF93cSk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KIGludCB4ZW52aWZfcXVldWVfc3RvcHBlZChzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcXVldWUtPnZpZi0+ZGV2OwpAQCAtNTcwLDggKzU2MSw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHZpZi0+ZGV2OwogCXZvaWQgKmFkZHI7CiAJc3RydWN0IHhlbl9uZXRpZl9jdHJsX3NyaW5nICpzaGFyZWQ7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwotCWludCBlcnIgPSAtRU5PTUVNOworCWludCBlcnI7CiAKIAllcnIgPSB4ZW5idXNfbWFwX3JpbmdfdmFsbG9jKHhlbnZpZl90b194ZW5idXNfZGV2aWNlKHZpZiksCiAJCQkJICAgICAmcmluZ19yZWYsIDEsICZhZGRyKTsKQEAgLTU4MSwxMSArNTcxLDcgQEAKIAlzaGFyZWQgPSAoc3RydWN0IHhlbl9uZXRpZl9jdHJsX3NyaW5nICopYWRkcjsKIAlCQUNLX1JJTkdfSU5JVCgmdmlmLT5jdHJsLCBzaGFyZWQsIFhFTl9QQUdFX1NJWkUpOwogCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmdmlmLT5jdHJsX3dxKTsKLQotCWVyciA9IGJpbmRfaW50ZXJkb21haW5fZXZ0Y2huX3RvX2lycWhhbmRsZXIodmlmLT5kb21pZCwgZXZ0Y2huLAotCQkJCQkJICAgIHhlbnZpZl9jdHJsX2ludGVycnVwdCwKLQkJCQkJCSAgICAwLCBkZXYtPm5hbWUsIHZpZik7CisJZXJyID0gYmluZF9pbnRlcmRvbWFpbl9ldnRjaG5fdG9faXJxKHZpZi0+ZG9taWQsIGV2dGNobik7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyX3VubWFwOwogCkBAIC01OTMsMTkgKzU3OSwxMyBAQAogCiAJeGVudmlmX2luaXRfaGFzaCh2aWYpOwogCi0JdGFzayA9IGt0aHJlYWRfY3JlYXRlKHhlbnZpZl9jdHJsX2t0aHJlYWQsICh2b2lkICopdmlmLAotCQkJICAgICAgIiVzLWNvbnRyb2wiLCBkZXYtPm5hbWUpOwotCWlmIChJU19FUlIodGFzaykpIHsKLQkJcHJfd2FybigiQ291bGQgbm90IGFsbG9jYXRlIGt0aHJlYWQgZm9yICVzXG4iLCBkZXYtPm5hbWUpOwotCQllcnIgPSBQVFJfRVJSKHRhc2spOworCWVyciA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKHZpZi0+Y3RybF9pcnEsIE5VTEwsIHhlbnZpZl9jdHJsX2lycV9mbiwKKwkJCQkgICBJUlFGX09ORVNIT1QsICJ4ZW4tbmV0YmFjay1jdHJsIiwgdmlmKTsKKwlpZiAoZXJyKSB7CisJCXByX3dhcm4oIkNvdWxkIG5vdCBzZXR1cCBpcnEgaGFuZGxlciBmb3IgJXNcbiIsIGRldi0+bmFtZSk7CiAJCWdvdG8gZXJyX2RlaW5pdDsKIAl9CiAKLQlnZXRfdGFza19zdHJ1Y3QodGFzayk7Ci0JdmlmLT5jdHJsX3Rhc2sgPSB0YXNrOwotCi0Jd2FrZV91cF9wcm9jZXNzKHZpZi0+Y3RybF90YXNrKTsKLQogCXJldHVybiAwOwogCiBlcnJfZGVpbml0OgpAQCAtNzc0LDEyICs3NTQsNiBAQAogCiB2b2lkIHhlbnZpZl9kaXNjb25uZWN0X2N0cmwoc3RydWN0IHhlbnZpZiAqdmlmKQogewotCWlmICh2aWYtPmN0cmxfdGFzaykgewotCQlrdGhyZWFkX3N0b3AodmlmLT5jdHJsX3Rhc2spOwotCQlwdXRfdGFza19zdHJ1Y3QodmlmLT5jdHJsX3Rhc2spOwotCQl2aWYtPmN0cmxfdGFzayA9IE5VTEw7Ci0JfQotCiAJaWYgKHZpZi0+Y3RybF9pcnEpIHsKIAkJeGVudmlmX2RlaW5pdF9oYXNoKHZpZik7CiAJCXVuYmluZF9mcm9tX2lycWhhbmRsZXIodmlmLT5jdHJsX2lycSwgdmlmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL25ldGJhY2suYyBiL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL25ldGJhY2suYwppbmRleCBlZGJhZTBiLi4zZDBjOTg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9uZXRiYWNrLmMKKysrIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svbmV0YmFjay5jCkBAIC0yMzU5LDI0ICsyMzU5LDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCB4ZW52aWZfY3RybF9rdGhyZWFkKHZvaWQgKmRhdGEpCitpcnFyZXR1cm5fdCB4ZW52aWZfY3RybF9pcnFfZm4oaW50IGlycSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgeGVudmlmICp2aWYgPSBkYXRhOwogCi0JZm9yICg7OykgewotCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUodmlmLT5jdHJsX3dxLAotCQkJCQkgeGVudmlmX2N0cmxfd29ya190b2RvKHZpZikgfHwKLQkJCQkJIGt0aHJlYWRfc2hvdWxkX3N0b3AoKSk7Ci0JCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCi0JCQlicmVhazsKKwl3aGlsZSAoeGVudmlmX2N0cmxfd29ya190b2RvKHZpZikpCisJCXhlbnZpZl9jdHJsX2FjdGlvbih2aWYpOwogCi0JCXdoaWxlICh4ZW52aWZfY3RybF93b3JrX3RvZG8odmlmKSkKLQkJCXhlbnZpZl9jdHJsX2FjdGlvbih2aWYpOwotCi0JCWNvbmRfcmVzY2hlZCgpOwotCX0KLQotCXJldHVybiAwOworCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAogc3RhdGljIGludCBfX2luaXQgbmV0YmFja19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay94ZW5idXMuYyBiL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL3hlbmJ1cy5jCmluZGV4IDZhMzFmMjYuLmRhZjRjNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL3hlbmJ1cy5jCisrKyBiL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL3hlbmJ1cy5jCkBAIC0yNzEsNiArMjcxLDExIEBACiAJYmUtPmRldiA9IGRldjsKIAlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBiZSk7CiAKKwliZS0+c3RhdGUgPSBYZW5idXNTdGF0ZUluaXRpYWxpc2luZzsKKwllcnIgPSB4ZW5idXNfc3dpdGNoX3N0YXRlKGRldiwgWGVuYnVzU3RhdGVJbml0aWFsaXNpbmcpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDsKKwogCXNnID0gMTsKIAogCWRvIHsKQEAgLTM4MywxMSArMzg4LDYgQEAKIAogCWJlLT5ob3RwbHVnX3NjcmlwdCA9IHNjcmlwdDsKIAotCWVyciA9IHhlbmJ1c19zd2l0Y2hfc3RhdGUoZGV2LCBYZW5idXNTdGF0ZUluaXRXYWl0KTsKLQlpZiAoZXJyKQotCQlnb3RvIGZhaWw7Ci0KLQliZS0+c3RhdGUgPSBYZW5idXNTdGF0ZUluaXRXYWl0OwogCiAJLyogVGhpcyBraWNrcyBob3RwbHVnIHNjcmlwdHMsIHNvIGRvIGl0IGltbWVkaWF0ZWx5LiAqLwogCWVyciA9IGJhY2tlbmRfY3JlYXRlX3hlbnZpZihiZSk7CkBAIC00OTIsMjAgKzQ5MiwyMCBAQAogCiAvKiBIYW5kbGUgYmFja2VuZCBzdGF0ZSB0cmFuc2l0aW9uczoKICAqCi0gKiBUaGUgYmFja2VuZCBzdGF0ZSBzdGFydHMgaW4gSW5pdFdhaXQgYW5kIHRoZSBmb2xsb3dpbmcgdHJhbnNpdGlvbnMgYXJlCisgKiBUaGUgYmFja2VuZCBzdGF0ZSBzdGFydHMgaW4gSW5pdGlhbGlzaW5nIGFuZCB0aGUgZm9sbG93aW5nIHRyYW5zaXRpb25zIGFyZQogICogYWxsb3dlZC4KICAqCi0gKiBJbml0V2FpdCAtPiBDb25uZWN0ZWQKKyAqIEluaXRpYWxpc2luZyAtPiBJbml0V2FpdCAtPiBDb25uZWN0ZWQKKyAqICAgICAgICAgIFwKKyAqICAgICAgICAgICBcICAgICAgICBeICAgIFwgICAgICAgICB8CisgKiAgICAgICAgICAgIFwgICAgICAgfCAgICAgXCAgICAgICAgfAorICogICAgICAgICAgICAgXCAgICAgIHwgICAgICBcICAgICAgIHwKKyAqICAgICAgICAgICAgICBcICAgICB8ICAgICAgIFwgICAgICB8CisgKiAgICAgICAgICAgICAgIFwgICAgfCAgICAgICAgXCAgICAgfAorICogICAgICAgICAgICAgICAgXCAgIHwgICAgICAgICBcICAgIHwKKyAqICAgICAgICAgICAgICAgICBWICB8ICAgICAgICAgIFYgICBWCiAgKgotICogICAgXiAgICBcICAgICAgICAgfAotICogICAgfCAgICAgXCAgICAgICAgfAotICogICAgfCAgICAgIFwgICAgICAgfAotICogICAgfCAgICAgICBcICAgICAgfAotICogICAgfCAgICAgICAgXCAgICAgfAotICogICAgfCAgICAgICAgIFwgICAgfAotICogICAgfCAgICAgICAgICBWICAgVgotICoKLSAqICBDbG9zZWQgIDwtPiBDbG9zaW5nCisgKiAgICAgICAgICAgICAgICAgIENsb3NlZCAgPC0+IENsb3NpbmcKICAqCiAgKiBUaGUgc3RhdGUgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBldmVudHVhbCBzdGF0ZSBvZiB0aGUgYmFja2VuZCBhbmQgdGhlCiAgKiBmdW5jdGlvbiB0cmFuc2l0aW9ucyB0byB0aGF0IHN0YXRlIHZpYSB0aGUgc2hvcnRlc3QgcGF0aC4KQEAgLTUxNSw2ICs1MTUsMjAgQEAKIHsKIAl3aGlsZSAoYmUtPnN0YXRlICE9IHN0YXRlKSB7CiAJCXN3aXRjaCAoYmUtPnN0YXRlKSB7CisJCWNhc2UgWGVuYnVzU3RhdGVJbml0aWFsaXNpbmc6CisJCQlzd2l0Y2ggKHN0YXRlKSB7CisJCQljYXNlIFhlbmJ1c1N0YXRlSW5pdFdhaXQ6CisJCQljYXNlIFhlbmJ1c1N0YXRlQ29ubmVjdGVkOgorCQkJY2FzZSBYZW5idXNTdGF0ZUNsb3Npbmc6CisJCQkJYmFja2VuZF9zd2l0Y2hfc3RhdGUoYmUsIFhlbmJ1c1N0YXRlSW5pdFdhaXQpOworCQkJCWJyZWFrOworCQkJY2FzZSBYZW5idXNTdGF0ZUNsb3NlZDoKKwkJCQliYWNrZW5kX3N3aXRjaF9zdGF0ZShiZSwgWGVuYnVzU3RhdGVDbG9zZWQpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlCVUcoKTsKKwkJCX0KKwkJCWJyZWFrOwogCQljYXNlIFhlbmJ1c1N0YXRlQ2xvc2VkOgogCQkJc3dpdGNoIChzdGF0ZSkgewogCQkJY2FzZSBYZW5idXNTdGF0ZUluaXRXYWl0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQveGVuLW5ldGZyb250LmMgYi9kcml2ZXJzL25ldC94ZW4tbmV0ZnJvbnQuYwppbmRleCA5NmNjZDRlLi5lMTc4NzlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC94ZW4tbmV0ZnJvbnQuYworKysgYi9kcml2ZXJzL25ldC94ZW4tbmV0ZnJvbnQuYwpAQCAtNTY1LDYgKzU2NSw3IEBACiAJc3RydWN0IG5ldGZyb250X3F1ZXVlICpxdWV1ZSA9IE5VTEw7CiAJdW5zaWduZWQgaW50IG51bV9xdWV1ZXMgPSBkZXYtPnJlYWxfbnVtX3R4X3F1ZXVlczsKIAl1MTYgcXVldWVfaW5kZXg7CisJc3RydWN0IHNrX2J1ZmYgKm5za2I7CiAKIAkvKiBEcm9wIHRoZSBwYWNrZXQgaWYgbm8gcXVldWVzIGFyZSBzZXQgdXAgKi8KIAlpZiAobnVtX3F1ZXVlcyA8IDEpCkBAIC01OTMsNiArNTk0LDIwIEBACiAKIAlwYWdlID0gdmlydF90b19wYWdlKHNrYi0+ZGF0YSk7CiAJb2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2Uoc2tiLT5kYXRhKTsKKworCS8qIFRoZSBmaXJzdCByZXEgc2hvdWxkIGJlIGF0IGxlYXN0IEVUSF9ITEVOIHNpemUgb3IgdGhlIHBhY2tldCB3aWxsIGJlCisJICogZHJvcHBlZCBieSBuZXRiYWNrLgorCSAqLworCWlmICh1bmxpa2VseShQQUdFX1NJWkUgLSBvZmZzZXQgPCBFVEhfSExFTikpIHsKKwkJbnNrYiA9IHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7CisJCWlmICghbnNrYikKKwkJCWdvdG8gZHJvcDsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJc2tiID0gbnNrYjsKKwkJcGFnZSA9IHZpcnRfdG9fcGFnZShza2ItPmRhdGEpOworCQlvZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShza2ItPmRhdGEpOworCX0KKwogCWxlbiA9IHNrYl9oZWFkbGVuKHNrYik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcXVldWUtPnR4X2xvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnRiL250Yl90cmFuc3BvcnQuYyBiL2RyaXZlcnMvbnRiL250Yl90cmFuc3BvcnQuYwppbmRleCBkNWM1ODk0Li44NjAxYzEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL250Yi9udGJfdHJhbnNwb3J0LmMKKysrIGIvZHJpdmVycy9udGIvbnRiX3RyYW5zcG9ydC5jCkBAIC0xMDIsMTMgKzEwMiwxNiBAQAogCXZvaWQgKmJ1ZjsKIAl1bnNpZ25lZCBpbnQgbGVuOwogCXVuc2lnbmVkIGludCBmbGFnczsKKwlpbnQgcmV0cmllczsKKwlpbnQgZXJyb3JzOworCXVuc2lnbmVkIGludCB0eF9pbmRleDsKKwl1bnNpZ25lZCBpbnQgcnhfaW5kZXg7CiAKIAlzdHJ1Y3QgbnRiX3RyYW5zcG9ydF9xcCAqcXA7CiAJdW5pb24gewogCQlzdHJ1Y3QgbnRiX3BheWxvYWRfaGVhZGVyIF9faW9tZW0gKnR4X2hkcjsKIAkJc3RydWN0IG50Yl9wYXlsb2FkX2hlYWRlciAqcnhfaGRyOwogCX07Ci0JdW5zaWduZWQgaW50IGluZGV4OwogfTsKIAogc3RydWN0IG50Yl9yeF9pbmZvIHsKQEAgLTI1OSw2ICsyNjIsMTIgQEAKIHN0YXRpYyB2b2lkIG50Yl90cmFuc3BvcnRfcnhjX2RiKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IG50Yl9jdHhfb3BzIG50Yl90cmFuc3BvcnRfb3BzOwogc3RhdGljIHN0cnVjdCBudGJfY2xpZW50IG50Yl90cmFuc3BvcnRfY2xpZW50Oworc3RhdGljIGludCBudGJfYXN5bmNfdHhfc3VibWl0KHN0cnVjdCBudGJfdHJhbnNwb3J0X3FwICpxcCwKKwkJCSAgICAgICBzdHJ1Y3QgbnRiX3F1ZXVlX2VudHJ5ICplbnRyeSk7CitzdGF0aWMgdm9pZCBudGJfbWVtY3B5X3R4KHN0cnVjdCBudGJfcXVldWVfZW50cnkgKmVudHJ5LCB2b2lkIF9faW9tZW0gKm9mZnNldCk7CitzdGF0aWMgaW50IG50Yl9hc3luY19yeF9zdWJtaXQoc3RydWN0IG50Yl9xdWV1ZV9lbnRyeSAqZW50cnksIHZvaWQgKm9mZnNldCk7CitzdGF0aWMgdm9pZCBudGJfbWVtY3B5X3J4KHN0cnVjdCBudGJfcXVldWVfZW50cnkgKmVudHJ5LCB2b2lkICpvZmZzZXQpOworCiAKIHN0YXRpYyBpbnQgbnRiX3RyYW5zcG9ydF9idXNfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCkBAIC0xMjI5LDcgKzEyMzgsNyBAQAogCQkJYnJlYWs7CiAKIAkJZW50cnktPnJ4X2hkci0+ZmxhZ3MgPSAwOwotCQlpb3dyaXRlMzIoZW50cnktPmluZGV4LCAmcXAtPnJ4X2luZm8tPmVudHJ5KTsKKwkJaW93cml0ZTMyKGVudHJ5LT5yeF9pbmRleCwgJnFwLT5yeF9pbmZvLT5lbnRyeSk7CiAKIAkJY2JfZGF0YSA9IGVudHJ5LT5jYl9kYXRhOwogCQlsZW4gPSBlbnRyeS0+bGVuOwpAQCAtMTI0NywxMCArMTI1NiwzNiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFwLT5udGJfcnhfcV9sb2NrLCBpcnFmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIG50Yl9yeF9jb3B5X2NhbGxiYWNrKHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBudGJfcnhfY29weV9jYWxsYmFjayh2b2lkICpkYXRhLAorCQkJCSBjb25zdCBzdHJ1Y3QgZG1hZW5naW5lX3Jlc3VsdCAqcmVzKQogewogCXN0cnVjdCBudGJfcXVldWVfZW50cnkgKmVudHJ5ID0gZGF0YTsKIAorCS8qIHdlIG5lZWQgdG8gY2hlY2sgRE1BIHJlc3VsdHMgaWYgd2UgYXJlIHVzaW5nIERNQSAqLworCWlmIChyZXMpIHsKKwkJZW51bSBkbWFlbmdpbmVfdHhfcmVzdWx0IGRtYV9lcnIgPSByZXMtPnJlc3VsdDsKKworCQlzd2l0Y2ggKGRtYV9lcnIpIHsKKwkJY2FzZSBETUFfVFJBTlNfUkVBRF9GQUlMRUQ6CisJCWNhc2UgRE1BX1RSQU5TX1dSSVRFX0ZBSUxFRDoKKwkJCWVudHJ5LT5lcnJvcnMrKzsKKwkJY2FzZSBETUFfVFJBTlNfQUJPUlRFRDoKKwkJeworCQkJc3RydWN0IG50Yl90cmFuc3BvcnRfcXAgKnFwID0gZW50cnktPnFwOworCQkJdm9pZCAqb2Zmc2V0ID0gcXAtPnJ4X2J1ZmYgKyBxcC0+cnhfbWF4X2ZyYW1lICoKKwkJCQkJcXAtPnJ4X2luZGV4OworCisJCQludGJfbWVtY3B5X3J4KGVudHJ5LCBvZmZzZXQpOworCQkJcXAtPnJ4X21lbWNweSsrOworCQkJcmV0dXJuOworCQl9CisKKwkJY2FzZSBETUFfVFJBTlNfTk9FUlJPUjoKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCiAJZW50cnktPmZsYWdzIHw9IERFU0NfRE9ORV9GTEFHOwogCiAJbnRiX2NvbXBsZXRlX3J4YyhlbnRyeS0+cXApOwpAQCAtMTI2NiwxMCArMTMwMSwxMCBAQAogCS8qIEVuc3VyZSB0aGF0IHRoZSBkYXRhIGlzIGZ1bGx5IGNvcGllZCBvdXQgYmVmb3JlIGNsZWFyaW5nIHRoZSBmbGFnICovCiAJd21iKCk7CiAKLQludGJfcnhfY29weV9jYWxsYmFjayhlbnRyeSk7CisJbnRiX3J4X2NvcHlfY2FsbGJhY2soZW50cnksIE5VTEwpOwogfQogCi1zdGF0aWMgdm9pZCBudGJfYXN5bmNfcngoc3RydWN0IG50Yl9xdWV1ZV9lbnRyeSAqZW50cnksIHZvaWQgKm9mZnNldCkKK3N0YXRpYyBpbnQgbnRiX2FzeW5jX3J4X3N1Ym1pdChzdHJ1Y3QgbnRiX3F1ZXVlX2VudHJ5ICplbnRyeSwgdm9pZCAqb2Zmc2V0KQogewogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHhkOwogCXN0cnVjdCBudGJfdHJhbnNwb3J0X3FwICpxcCA9IGVudHJ5LT5xcDsKQEAgLTEyODIsMTMgKzEzMTcsNiBAQAogCWludCByZXRyaWVzID0gMDsKIAogCWxlbiA9IGVudHJ5LT5sZW47Ci0KLQlpZiAoIWNoYW4pCi0JCWdvdG8gZXJyOwotCi0JaWYgKGxlbiA8IGNvcHlfYnl0ZXMpCi0JCWdvdG8gZXJyOwotCiAJZGV2aWNlID0gY2hhbi0+ZGV2aWNlOwogCXBheV9vZmYgPSAoc2l6ZV90KW9mZnNldCAmIH5QQUdFX01BU0s7CiAJYnVmZl9vZmYgPSAoc2l6ZV90KWJ1ZiAmIH5QQUdFX01BU0s7CkBAIC0xMzE2LDcgKzEzNDQsOCBAQAogCXVubWFwLT5mcm9tX2NudCA9IDE7CiAKIAlmb3IgKHJldHJpZXMgPSAwOyByZXRyaWVzIDwgRE1BX1JFVFJJRVM7IHJldHJpZXMrKykgewotCQl0eGQgPSBkZXZpY2UtPmRldmljZV9wcmVwX2RtYV9tZW1jcHkoY2hhbiwgdW5tYXAtPmFkZHJbMV0sCisJCXR4ZCA9IGRldmljZS0+ZGV2aWNlX3ByZXBfZG1hX21lbWNweShjaGFuLAorCQkJCQkJICAgICB1bm1hcC0+YWRkclsxXSwKIAkJCQkJCSAgICAgdW5tYXAtPmFkZHJbMF0sIGxlbiwKIAkJCQkJCSAgICAgRE1BX1BSRVBfSU5URVJSVVBUKTsKIAkJaWYgKHR4ZCkKQEAgLTEzMzEsNyArMTM2MCw3IEBACiAJCWdvdG8gZXJyX2dldF91bm1hcDsKIAl9CiAKLQl0eGQtPmNhbGxiYWNrID0gbnRiX3J4X2NvcHlfY2FsbGJhY2s7CisJdHhkLT5jYWxsYmFja19yZXN1bHQgPSBudGJfcnhfY29weV9jYWxsYmFjazsKIAl0eGQtPmNhbGxiYWNrX3BhcmFtID0gZW50cnk7CiAJZG1hX3NldF91bm1hcCh0eGQsIHVubWFwKTsKIApAQCAtMTM0NSwxMyArMTM3NCwzOCBAQAogCiAJcXAtPnJ4X2FzeW5jKys7CiAKLQlyZXR1cm47CisJcmV0dXJuIDA7CiAKIGVycl9zZXRfdW5tYXA6CiAJZG1hZW5naW5lX3VubWFwX3B1dCh1bm1hcCk7CiBlcnJfZ2V0X3VubWFwOgogCWRtYWVuZ2luZV91bm1hcF9wdXQodW5tYXApOwogZXJyOgorCXJldHVybiAtRU5YSU87Cit9CisKK3N0YXRpYyB2b2lkIG50Yl9hc3luY19yeChzdHJ1Y3QgbnRiX3F1ZXVlX2VudHJ5ICplbnRyeSwgdm9pZCAqb2Zmc2V0KQoreworCXN0cnVjdCBudGJfdHJhbnNwb3J0X3FwICpxcCA9IGVudHJ5LT5xcDsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4gPSBxcC0+cnhfZG1hX2NoYW47CisJaW50IHJlczsKKworCWlmICghY2hhbikKKwkJZ290byBlcnI7CisKKwlpZiAoZW50cnktPmxlbiA8IGNvcHlfYnl0ZXMpCisJCWdvdG8gZXJyOworCisJcmVzID0gbnRiX2FzeW5jX3J4X3N1Ym1pdChlbnRyeSwgb2Zmc2V0KTsKKwlpZiAocmVzIDwgMCkKKwkJZ290byBlcnI7CisKKwlpZiAoIWVudHJ5LT5yZXRyaWVzKQorCQlxcC0+cnhfYXN5bmMrKzsKKworCXJldHVybjsKKworZXJyOgogCW50Yl9tZW1jcHlfcngoZW50cnksIG9mZnNldCk7CiAJcXAtPnJ4X21lbWNweSsrOwogfQpAQCAtMTM5Nyw3ICsxNDUxLDcgQEAKIAl9CiAKIAllbnRyeS0+cnhfaGRyID0gaGRyOwotCWVudHJ5LT5pbmRleCA9IHFwLT5yeF9pbmRleDsKKwllbnRyeS0+cnhfaW5kZXggPSBxcC0+cnhfaW5kZXg7CiAKIAlpZiAoaGRyLT5sZW4gPiBlbnRyeS0+bGVuKSB7CiAJCWRldl9kYmcoJnFwLT5uZGV2LT5wZGV2LT5kZXYsCkBAIC0xNDY3LDEyICsxNTIxLDM5IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBudGJfdHhfY29weV9jYWxsYmFjayh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgbnRiX3R4X2NvcHlfY2FsbGJhY2sodm9pZCAqZGF0YSwKKwkJCQkgY29uc3Qgc3RydWN0IGRtYWVuZ2luZV9yZXN1bHQgKnJlcykKIHsKIAlzdHJ1Y3QgbnRiX3F1ZXVlX2VudHJ5ICplbnRyeSA9IGRhdGE7CiAJc3RydWN0IG50Yl90cmFuc3BvcnRfcXAgKnFwID0gZW50cnktPnFwOwogCXN0cnVjdCBudGJfcGF5bG9hZF9oZWFkZXIgX19pb21lbSAqaGRyID0gZW50cnktPnR4X2hkcjsKIAorCS8qIHdlIG5lZWQgdG8gY2hlY2sgRE1BIHJlc3VsdHMgaWYgd2UgYXJlIHVzaW5nIERNQSAqLworCWlmIChyZXMpIHsKKwkJZW51bSBkbWFlbmdpbmVfdHhfcmVzdWx0IGRtYV9lcnIgPSByZXMtPnJlc3VsdDsKKworCQlzd2l0Y2ggKGRtYV9lcnIpIHsKKwkJY2FzZSBETUFfVFJBTlNfUkVBRF9GQUlMRUQ6CisJCWNhc2UgRE1BX1RSQU5TX1dSSVRFX0ZBSUxFRDoKKwkJCWVudHJ5LT5lcnJvcnMrKzsKKwkJY2FzZSBETUFfVFJBTlNfQUJPUlRFRDoKKwkJeworCQkJdm9pZCBfX2lvbWVtICpvZmZzZXQgPQorCQkJCXFwLT50eF9tdyArIHFwLT50eF9tYXhfZnJhbWUgKgorCQkJCWVudHJ5LT50eF9pbmRleDsKKworCQkJLyogcmVzdWJtaXQgdmlhIENQVSAqLworCQkJbnRiX21lbWNweV90eChlbnRyeSwgb2Zmc2V0KTsKKwkJCXFwLT50eF9tZW1jcHkrKzsKKwkJCXJldHVybjsKKwkJfQorCisJCWNhc2UgRE1BX1RSQU5TX05PRVJST1I6CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwogCWlvd3JpdGUzMihlbnRyeS0+ZmxhZ3MgfCBERVNDX0RPTkVfRkxBRywgJmhkci0+ZmxhZ3MpOwogCiAJbnRiX3BlZXJfZGJfc2V0KHFwLT5uZGV2LCBCSVRfVUxMKHFwLT5xcF9udW0pKTsKQEAgLTE1MDcsNDAgKzE1ODgsMjUgQEAKIAkvKiBFbnN1cmUgdGhhdCB0aGUgZGF0YSBpcyBmdWxseSBjb3BpZWQgb3V0IGJlZm9yZSBzZXR0aW5nIHRoZSBmbGFncyAqLwogCXdtYigpOwogCi0JbnRiX3R4X2NvcHlfY2FsbGJhY2soZW50cnkpOworCW50Yl90eF9jb3B5X2NhbGxiYWNrKGVudHJ5LCBOVUxMKTsKIH0KIAotc3RhdGljIHZvaWQgbnRiX2FzeW5jX3R4KHN0cnVjdCBudGJfdHJhbnNwb3J0X3FwICpxcCwKLQkJCSBzdHJ1Y3QgbnRiX3F1ZXVlX2VudHJ5ICplbnRyeSkKK3N0YXRpYyBpbnQgbnRiX2FzeW5jX3R4X3N1Ym1pdChzdHJ1Y3QgbnRiX3RyYW5zcG9ydF9xcCAqcXAsCisJCQkgICAgICAgc3RydWN0IG50Yl9xdWV1ZV9lbnRyeSAqZW50cnkpCiB7Ci0Jc3RydWN0IG50Yl9wYXlsb2FkX2hlYWRlciBfX2lvbWVtICpoZHI7CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eGQ7CiAJc3RydWN0IGRtYV9jaGFuICpjaGFuID0gcXAtPnR4X2RtYV9jaGFuOwogCXN0cnVjdCBkbWFfZGV2aWNlICpkZXZpY2U7CisJc2l6ZV90IGxlbiA9IGVudHJ5LT5sZW47CisJdm9pZCAqYnVmID0gZW50cnktPmJ1ZjsKIAlzaXplX3QgZGVzdF9vZmYsIGJ1ZmZfb2ZmOwogCXN0cnVjdCBkbWFlbmdpbmVfdW5tYXBfZGF0YSAqdW5tYXA7CiAJZG1hX2FkZHJfdCBkZXN0OwogCWRtYV9jb29raWVfdCBjb29raWU7Ci0Jdm9pZCBfX2lvbWVtICpvZmZzZXQ7Ci0Jc2l6ZV90IGxlbiA9IGVudHJ5LT5sZW47Ci0Jdm9pZCAqYnVmID0gZW50cnktPmJ1ZjsKIAlpbnQgcmV0cmllcyA9IDA7CiAKLQlvZmZzZXQgPSBxcC0+dHhfbXcgKyBxcC0+dHhfbWF4X2ZyYW1lICogcXAtPnR4X2luZGV4OwotCWhkciA9IG9mZnNldCArIHFwLT50eF9tYXhfZnJhbWUgLSBzaXplb2Yoc3RydWN0IG50Yl9wYXlsb2FkX2hlYWRlcik7Ci0JZW50cnktPnR4X2hkciA9IGhkcjsKLQotCWlvd3JpdGUzMihlbnRyeS0+bGVuLCAmaGRyLT5sZW4pOwotCWlvd3JpdGUzMigodTMyKXFwLT50eF9wa3RzLCAmaGRyLT52ZXIpOwotCi0JaWYgKCFjaGFuKQotCQlnb3RvIGVycjsKLQotCWlmIChsZW4gPCBjb3B5X2J5dGVzKQotCQlnb3RvIGVycjsKLQogCWRldmljZSA9IGNoYW4tPmRldmljZTsKLQlkZXN0ID0gcXAtPnR4X213X3BoeXMgKyBxcC0+dHhfbWF4X2ZyYW1lICogcXAtPnR4X2luZGV4OworCWRlc3QgPSBxcC0+dHhfbXdfcGh5cyArIHFwLT50eF9tYXhfZnJhbWUgKiBlbnRyeS0+dHhfaW5kZXg7CiAJYnVmZl9vZmYgPSAoc2l6ZV90KWJ1ZiAmIH5QQUdFX01BU0s7CiAJZGVzdF9vZmYgPSAoc2l6ZV90KWRlc3QgJiB+UEFHRV9NQVNLOwogCkBAIC0xNTYwLDggKzE2MjYsOSBAQAogCXVubWFwLT50b19jbnQgPSAxOwogCiAJZm9yIChyZXRyaWVzID0gMDsgcmV0cmllcyA8IERNQV9SRVRSSUVTOyByZXRyaWVzKyspIHsKLQkJdHhkID0gZGV2aWNlLT5kZXZpY2VfcHJlcF9kbWFfbWVtY3B5KGNoYW4sIGRlc3QsIHVubWFwLT5hZGRyWzBdLAotCQkJCQkJICAgICBsZW4sIERNQV9QUkVQX0lOVEVSUlVQVCk7CisJCXR4ZCA9IGRldmljZS0+ZGV2aWNlX3ByZXBfZG1hX21lbWNweShjaGFuLCBkZXN0LAorCQkJCQkJICAgICB1bm1hcC0+YWRkclswXSwgbGVuLAorCQkJCQkJICAgICBETUFfUFJFUF9JTlRFUlJVUFQpOwogCQlpZiAodHhkKQogCQkJYnJlYWs7CiAKQEAgLTE1NzQsNyArMTY0MSw3IEBACiAJCWdvdG8gZXJyX2dldF91bm1hcDsKIAl9CiAKLQl0eGQtPmNhbGxiYWNrID0gbnRiX3R4X2NvcHlfY2FsbGJhY2s7CisJdHhkLT5jYWxsYmFja19yZXN1bHQgPSBudGJfdHhfY29weV9jYWxsYmFjazsKIAl0eGQtPmNhbGxiYWNrX3BhcmFtID0gZW50cnk7CiAJZG1hX3NldF91bm1hcCh0eGQsIHVubWFwKTsKIApAQCAtMTU4NSwxNCArMTY1Miw0OCBAQAogCWRtYWVuZ2luZV91bm1hcF9wdXQodW5tYXApOwogCiAJZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcoY2hhbik7Ci0JcXAtPnR4X2FzeW5jKys7CiAKLQlyZXR1cm47CisJcmV0dXJuIDA7CiBlcnJfc2V0X3VubWFwOgogCWRtYWVuZ2luZV91bm1hcF9wdXQodW5tYXApOwogZXJyX2dldF91bm1hcDoKIAlkbWFlbmdpbmVfdW5tYXBfcHV0KHVubWFwKTsKIGVycjoKKwlyZXR1cm4gLUVOWElPOworfQorCitzdGF0aWMgdm9pZCBudGJfYXN5bmNfdHgoc3RydWN0IG50Yl90cmFuc3BvcnRfcXAgKnFwLAorCQkJIHN0cnVjdCBudGJfcXVldWVfZW50cnkgKmVudHJ5KQoreworCXN0cnVjdCBudGJfcGF5bG9hZF9oZWFkZXIgX19pb21lbSAqaGRyOworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiA9IHFwLT50eF9kbWFfY2hhbjsKKwl2b2lkIF9faW9tZW0gKm9mZnNldDsKKwlpbnQgcmVzOworCisJZW50cnktPnR4X2luZGV4ID0gcXAtPnR4X2luZGV4OworCW9mZnNldCA9IHFwLT50eF9tdyArIHFwLT50eF9tYXhfZnJhbWUgKiBlbnRyeS0+dHhfaW5kZXg7CisJaGRyID0gb2Zmc2V0ICsgcXAtPnR4X21heF9mcmFtZSAtIHNpemVvZihzdHJ1Y3QgbnRiX3BheWxvYWRfaGVhZGVyKTsKKwllbnRyeS0+dHhfaGRyID0gaGRyOworCisJaW93cml0ZTMyKGVudHJ5LT5sZW4sICZoZHItPmxlbik7CisJaW93cml0ZTMyKCh1MzIpcXAtPnR4X3BrdHMsICZoZHItPnZlcik7CisKKwlpZiAoIWNoYW4pCisJCWdvdG8gZXJyOworCisJaWYgKGVudHJ5LT5sZW4gPCBjb3B5X2J5dGVzKQorCQlnb3RvIGVycjsKKworCXJlcyA9IG50Yl9hc3luY190eF9zdWJtaXQocXAsIGVudHJ5KTsKKwlpZiAocmVzIDwgMCkKKwkJZ290byBlcnI7CisKKwlpZiAoIWVudHJ5LT5yZXRyaWVzKQorCQlxcC0+dHhfYXN5bmMrKzsKKworCXJldHVybjsKKworZXJyOgogCW50Yl9tZW1jcHlfdHgoZW50cnksIG9mZnNldCk7CiAJcXAtPnR4X21lbWNweSsrOwogfQpAQCAtMTkyOCw2ICsyMDI5LDkgQEAKIAllbnRyeS0+YnVmID0gZGF0YTsKIAllbnRyeS0+bGVuID0gbGVuOwogCWVudHJ5LT5mbGFncyA9IDA7CisJZW50cnktPnJldHJpZXMgPSAwOworCWVudHJ5LT5lcnJvcnMgPSAwOworCWVudHJ5LT5yeF9pbmRleCA9IDA7CiAKIAludGJfbGlzdF9hZGQoJnFwLT5udGJfcnhfcV9sb2NrLCAmZW50cnktPmVudHJ5LCAmcXAtPnJ4X3BlbmRfcSk7CiAKQEAgLTE5NzAsNiArMjA3NCw5IEBACiAJZW50cnktPmJ1ZiA9IGRhdGE7CiAJZW50cnktPmxlbiA9IGxlbjsKIAllbnRyeS0+ZmxhZ3MgPSAwOworCWVudHJ5LT5lcnJvcnMgPSAwOworCWVudHJ5LT5yZXRyaWVzID0gMDsKKwllbnRyeS0+dHhfaW5kZXggPSAwOwogCiAJcmMgPSBudGJfcHJvY2Vzc190eChxcCwgZW50cnkpOwogCWlmIChyYykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnZkaW1tL2J1cy5jIGIvZHJpdmVycy9udmRpbW0vYnVzLmMKaW5kZXggNDU4ZGFmOS4uOTM1ODY2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9udmRpbW0vYnVzLmMKKysrIGIvZHJpdmVycy9udmRpbW0vYnVzLmMKQEAgLTE4NSw4ICsxODUsMTIgQEAKIAkJcmV0dXJuIC1FTlhJTzsKIAogCW5kX2Rlc2MgPSBudmRpbW1fYnVzLT5uZF9kZXNjOworCS8qCisJICogaWYgbmRjdGwgZG9lcyBub3QgZXhpc3QsIGl0J3MgUE1FTV9MRUdBQ1kgYW5kCisJICogd2Ugd2FudCB0byBqdXN0IHByZXRlbmQgZXZlcnl0aGluZyBpcyBoYW5kbGVkLgorCSAqLwogCWlmICghbmRfZGVzYy0+bmRjdGwpCi0JCXJldHVybiAtRU5YSU87CisJCXJldHVybiBsZW47CiAKIAltZW1zZXQoJmFyc19jYXAsIDAsIHNpemVvZihhcnNfY2FwKSk7CiAJYXJzX2NhcC5hZGRyZXNzID0gcGh5czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnZkaW1tL2NvcmUuYyBiL2RyaXZlcnMvbnZkaW1tL2NvcmUuYwppbmRleCA3MTU1ODNmLi40ZDdiYmQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL252ZGltbS9jb3JlLmMKKysrIGIvZHJpdmVycy9udmRpbW0vY29yZS5jCkBAIC05OSw4ICs5OSwxMSBAQAogCW52ZGltbV9tYXAtPnNpemUgPSBzaXplOwogCWtyZWZfaW5pdCgmbnZkaW1tX21hcC0+a3JlZik7CiAKLQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihvZmZzZXQsIHNpemUsIGRldl9uYW1lKCZudmRpbW1fYnVzLT5kZXYpKSkKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihvZmZzZXQsIHNpemUsIGRldl9uYW1lKCZudmRpbW1fYnVzLT5kZXYpKSkgeworCQlkZXZfZXJyKCZudmRpbW1fYnVzLT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCAlcGEgKyAlemQgZm9yICVzXG4iLAorCQkJCSZvZmZzZXQsIHNpemUsIGRldl9uYW1lKGRldikpOwogCQlnb3RvIGVycl9yZXF1ZXN0X3JlZ2lvbjsKKwl9CiAKIAlpZiAoZmxhZ3MpCiAJCW52ZGltbV9tYXAtPm1lbSA9IG1lbXJlbWFwKG9mZnNldCwgc2l6ZSwgZmxhZ3MpOwpAQCAtMTcxLDYgKzE3NCw5IEBACiAJCWtyZWZfZ2V0KCZudmRpbW1fbWFwLT5rcmVmKTsKIAludmRpbW1fYnVzX3VubG9jayhkZXYpOwogCisJaWYgKCFudmRpbW1fbWFwKQorCQlyZXR1cm4gTlVMTDsKKwogCWlmIChkZXZtX2FkZF9hY3Rpb25fb3JfcmVzZXQoZGV2LCBudmRpbW1fbWFwX3B1dCwgbnZkaW1tX21hcCkpCiAJCXJldHVybiBOVUxMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL252ZGltbS9uZC5oIGIvZHJpdmVycy9udmRpbW0vbmQuaAppbmRleCA4MDI0YTBlLi4wYjc4YTgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL252ZGltbS9uZC5oCisrKyBiL2RyaXZlcnMvbnZkaW1tL25kLmgKQEAgLTUyLDEwICs1MiwyOCBAQAogc3RydWN0IG5kX3JlZ2lvbl9kYXRhIHsKIAlpbnQgbnNfY291bnQ7CiAJaW50IG5zX2FjdGl2ZTsKLQl1bnNpZ25lZCBpbnQgZmx1c2hfbWFzazsKLQl2b2lkIF9faW9tZW0gKmZsdXNoX3dwcVswXVswXTsKKwl1bnNpZ25lZCBpbnQgaGludHNfc2hpZnQ7CisJdm9pZCBfX2lvbWVtICpmbHVzaF93cHFbMF07CiB9OwogCitzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqbmRyZF9nZXRfZmx1c2hfd3BxKHN0cnVjdCBuZF9yZWdpb25fZGF0YSAqbmRyZCwKKwkJaW50IGRpbW0sIGludCBoaW50KQoreworCXVuc2lnbmVkIGludCBudW0gPSAxIDw8IG5kcmQtPmhpbnRzX3NoaWZ0OworCXVuc2lnbmVkIGludCBtYXNrID0gbnVtIC0gMTsKKworCXJldHVybiBuZHJkLT5mbHVzaF93cHFbZGltbSAqIG51bSArIChoaW50ICYgbWFzayldOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmRyZF9zZXRfZmx1c2hfd3BxKHN0cnVjdCBuZF9yZWdpb25fZGF0YSAqbmRyZCwgaW50IGRpbW0sCisJCWludCBoaW50LCB2b2lkIF9faW9tZW0gKmZsdXNoKQoreworCXVuc2lnbmVkIGludCBudW0gPSAxIDw8IG5kcmQtPmhpbnRzX3NoaWZ0OworCXVuc2lnbmVkIGludCBtYXNrID0gbnVtIC0gMTsKKworCW5kcmQtPmZsdXNoX3dwcVtkaW1tICogbnVtICsgKGhpbnQgJiBtYXNrKV0gPSBmbHVzaDsKK30KKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgbmRfbmFtZXNwYWNlX2luZGV4ICp0b19uYW1lc3BhY2VfaW5kZXgoCiAJCXN0cnVjdCBudmRpbW1fZHJ2ZGF0YSAqbmRkLCBpbnQgaSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnZkaW1tL3JlZ2lvbl9kZXZzLmMgYi9kcml2ZXJzL252ZGltbS9yZWdpb25fZGV2cy5jCmluZGV4IGU4ZDViYTcuLjRjMGFjNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbnZkaW1tL3JlZ2lvbl9kZXZzLmMKKysrIGIvZHJpdmVycy9udmRpbW0vcmVnaW9uX2RldnMuYwpAQCAtMzgsNyArMzgsNyBAQAogCiAJZGV2X2RiZyhkZXYsICIlczogbWFwICVkIGZsdXNoIGFkZHJlc3Mlc1xuIiwgbnZkaW1tX25hbWUobnZkaW1tKSwKIAkJCW52ZGltbS0+bnVtX2ZsdXNoLCBudmRpbW0tPm51bV9mbHVzaCA9PSAxID8gIiIgOiAiZXMiKTsKLQlmb3IgKGkgPSAwOyBpIDwgbnZkaW1tLT5udW1fZmx1c2g7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCAoMSA8PCBuZHJkLT5oaW50c19zaGlmdCk7IGkrKykgewogCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZudmRpbW0tPmZsdXNoX3dwcVtpXTsKIAkJdW5zaWduZWQgbG9uZyBwZm4gPSBQSFlTX1BGTihyZXMtPnN0YXJ0KTsKIAkJdm9pZCBfX2lvbWVtICpmbHVzaF9wYWdlOwpAQCAtNTQsMTQgKzU0LDE1IEBACiAKIAkJaWYgKGogPCBpKQogCQkJZmx1c2hfcGFnZSA9ICh2b2lkIF9faW9tZW0gKikgKCh1bnNpZ25lZCBsb25nKQotCQkJCQluZHJkLT5mbHVzaF93cHFbZGltbV1bal0gJiBQQUdFX01BU0spOworCQkJCQluZHJkX2dldF9mbHVzaF93cHEobmRyZCwgZGltbSwgaikKKwkJCQkJJiBQQUdFX01BU0spOwogCQllbHNlCiAJCQlmbHVzaF9wYWdlID0gZGV2bV9udmRpbW1faW9yZW1hcChkZXYsCi0JCQkJCVBIWVNfUEZOKHBmbiksIFBBR0VfU0laRSk7CisJCQkJCVBGTl9QSFlTKHBmbiksIFBBR0VfU0laRSk7CiAJCWlmICghZmx1c2hfcGFnZSkKIAkJCXJldHVybiAtRU5YSU87Ci0JCW5kcmQtPmZsdXNoX3dwcVtkaW1tXVtpXSA9IGZsdXNoX3BhZ2UKLQkJCSsgKHJlcy0+c3RhcnQgJiB+UEFHRV9NQVNLKTsKKwkJbmRyZF9zZXRfZmx1c2hfd3BxKG5kcmQsIGRpbW0sIGksIGZsdXNoX3BhZ2UKKwkJCQkrIChyZXMtPnN0YXJ0ICYgflBBR0VfTUFTSykpOwogCX0KIAogCXJldHVybiAwOwpAQCAtOTMsNyArOTQsMTAgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJZGV2X3NldF9kcnZkYXRhKGRldiwgbmRyZCk7CiAKLQluZHJkLT5mbHVzaF9tYXNrID0gKDEgPDwgaWxvZzIobnVtX2ZsdXNoKSkgLSAxOworCWlmICghbnVtX2ZsdXNoKQorCQlyZXR1cm4gMDsKKworCW5kcmQtPmhpbnRzX3NoaWZ0ID0gaWxvZzIobnVtX2ZsdXNoKTsKIAlmb3IgKGkgPSAwOyBpIDwgbmRfcmVnaW9uLT5uZHJfbWFwcGluZ3M7IGkrKykgewogCQlzdHJ1Y3QgbmRfbWFwcGluZyAqbmRfbWFwcGluZyA9ICZuZF9yZWdpb24tPm1hcHBpbmdbaV07CiAJCXN0cnVjdCBudmRpbW0gKm52ZGltbSA9IG5kX21hcHBpbmctPm52ZGltbTsKQEAgLTkwMCw4ICs5MDQsOCBAQAogCSAqLwogCXdtYigpOwogCWZvciAoaSA9IDA7IGkgPCBuZF9yZWdpb24tPm5kcl9tYXBwaW5nczsgaSsrKQotCQlpZiAobmRyZC0+Zmx1c2hfd3BxW2ldWzBdKQotCQkJd3JpdGVxKDEsIG5kcmQtPmZsdXNoX3dwcVtpXVtpZHggJiBuZHJkLT5mbHVzaF9tYXNrXSk7CisJCWlmIChuZHJkX2dldF9mbHVzaF93cHEobmRyZCwgaSwgMCkpCisJCQl3cml0ZXEoMSwgbmRyZF9nZXRfZmx1c2hfd3BxKG5kcmQsIGksIGlkeCkpOwogCXdtYigpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobnZkaW1tX2ZsdXNoKTsKQEAgLTkyNSw3ICs5MjksNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IG5kX3JlZ2lvbi0+bmRyX21hcHBpbmdzOyBpKyspCiAJCS8qIGZsdXNoIGhpbnRzIHByZXNlbnQsIGZsdXNoaW5nIHJlcXVpcmVkICovCi0JCWlmIChuZHJkLT5mbHVzaF93cHFbaV1bMF0pCisJCWlmIChuZHJkX2dldF9mbHVzaF93cHEobmRyZCwgaSwgMCkpCiAJCQlyZXR1cm4gMTsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL252bWUvaG9zdC9LY29uZmlnIGIvZHJpdmVycy9udm1lL2hvc3QvS2NvbmZpZwppbmRleCBkYjM5ZDUzLi5mN2QzN2E2IDEwMDY0NAotLS0gYS9kcml2ZXJzL252bWUvaG9zdC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbnZtZS9ob3N0L0tjb25maWcKQEAgLTMwLDggKzMwLDggQEAKIAogY29uZmlnIE5WTUVfUkRNQQogCXRyaXN0YXRlICJOVk0gRXhwcmVzcyBvdmVyIEZhYnJpY3MgUkRNQSBob3N0IGRyaXZlciIKLQlkZXBlbmRzIG9uIElORklOSUJBTkQKLQlkZXBlbmRzIG9uIEJMS19ERVZfTlZNRQorCWRlcGVuZHMgb24gSU5GSU5JQkFORCAmJiBCTE9DSworCXNlbGVjdCBOVk1FX0NPUkUKIAlzZWxlY3QgTlZNRV9GQUJSSUNTCiAJc2VsZWN0IFNHX1BPT0wKIAloZWxwCmRpZmYgLS1naXQgYS9kcml2ZXJzL252bWUvaG9zdC9jb3JlLmMgYi9kcml2ZXJzL252bWUvaG9zdC9jb3JlLmMKaW5kZXggN2ZmMmU4Mi4uMmZlYWNjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9udm1lL2hvc3QvY29yZS5jCisrKyBiL2RyaXZlcnMvbnZtZS9ob3N0L2NvcmUuYwpAQCAtODEsMTAgKzgxLDEyIEBACiBib29sIG52bWVfY2hhbmdlX2N0cmxfc3RhdGUoc3RydWN0IG52bWVfY3RybCAqY3RybCwKIAkJZW51bSBudm1lX2N0cmxfc3RhdGUgbmV3X3N0YXRlKQogewotCWVudW0gbnZtZV9jdHJsX3N0YXRlIG9sZF9zdGF0ZSA9IGN0cmwtPnN0YXRlOworCWVudW0gbnZtZV9jdHJsX3N0YXRlIG9sZF9zdGF0ZTsKIAlib29sIGNoYW5nZWQgPSBmYWxzZTsKIAogCXNwaW5fbG9ja19pcnEoJmN0cmwtPmxvY2spOworCisJb2xkX3N0YXRlID0gY3RybC0+c3RhdGU7CiAJc3dpdGNoIChuZXdfc3RhdGUpIHsKIAljYXNlIE5WTUVfQ1RSTF9MSVZFOgogCQlzd2l0Y2ggKG9sZF9zdGF0ZSkgewpAQCAtMTQwLDExICsxNDIsMTIgQEAKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZjdHJsLT5sb2NrKTsKIAogCWlmIChjaGFuZ2VkKQogCQljdHJsLT5zdGF0ZSA9IG5ld19zdGF0ZTsKIAorCXNwaW5fdW5sb2NrX2lycSgmY3RybC0+bG9jayk7CisKIAlyZXR1cm4gY2hhbmdlZDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG52bWVfY2hhbmdlX2N0cmxfc3RhdGUpOwpAQCAtNjA4LDcgKzYxMSw3IEBACiAKIAlyZXQgPSBfX252bWVfc3VibWl0X3N5bmNfY21kKGRldi0+YWRtaW5fcSwgJmMsICZjcWUsIE5VTEwsIDAsIDAsCiAJCQlOVk1FX1FJRF9BTlksIDAsIDApOwotCWlmIChyZXQgPj0gMCkKKwlpZiAocmV0ID49IDAgJiYgcmVzdWx0KQogCQkqcmVzdWx0ID0gbGUzMl90b19jcHUoY3FlLnJlc3VsdCk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTYyOCw3ICs2MzEsNyBAQAogCiAJcmV0ID0gX19udm1lX3N1Ym1pdF9zeW5jX2NtZChkZXYtPmFkbWluX3EsICZjLCAmY3FlLCBOVUxMLCAwLCAwLAogCQkJTlZNRV9RSURfQU5ZLCAwLCAwKTsKLQlpZiAocmV0ID49IDApCisJaWYgKHJldCA+PSAwICYmIHJlc3VsdCkKIAkJKnJlc3VsdCA9IGxlMzJfdG9fY3B1KGNxZS5yZXN1bHQpOwogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL252bWUvaG9zdC9mYWJyaWNzLmMgYi9kcml2ZXJzL252bWUvaG9zdC9mYWJyaWNzLmMKaW5kZXggZGM5OTY3Ni4uNGVmZjQ5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9udm1lL2hvc3QvZmFicmljcy5jCisrKyBiL2RyaXZlcnMvbnZtZS9ob3N0L2ZhYnJpY3MuYwpAQCAtNDcsOCArNDcsMTAgQEAKIAogCW11dGV4X2xvY2soJm52bWZfaG9zdHNfbXV0ZXgpOwogCWhvc3QgPSBfX252bWZfaG9zdF9maW5kKGhvc3RucW4pOwotCWlmIChob3N0KQorCWlmIChob3N0KSB7CisJCWtyZWZfZ2V0KCZob3N0LT5yZWYpOwogCQlnb3RvIG91dF91bmxvY2s7CisJfQogCiAJaG9zdCA9IGttYWxsb2Moc2l6ZW9mKCpob3N0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFob3N0KQpAQCAtNTYsNyArNTgsNyBAQAogCiAJa3JlZl9pbml0KCZob3N0LT5yZWYpOwogCW1lbWNweShob3N0LT5ucW4sIGhvc3RucW4sIE5WTUZfTlFOX1NJWkUpOwotCXV1aWRfbGVfZ2VuKCZob3N0LT5pZCk7CisJdXVpZF9iZV9nZW4oJmhvc3QtPmlkKTsKIAogCWxpc3RfYWRkX3RhaWwoJmhvc3QtPmxpc3QsICZudm1mX2hvc3RzKTsKIG91dF91bmxvY2s6CkBAIC03Myw5ICs3NSw5IEBACiAJCXJldHVybiBOVUxMOwogCiAJa3JlZl9pbml0KCZob3N0LT5yZWYpOwotCXV1aWRfbGVfZ2VuKCZob3N0LT5pZCk7CisJdXVpZF9iZV9nZW4oJmhvc3QtPmlkKTsKIAlzbnByaW50Zihob3N0LT5ucW4sIE5WTUZfTlFOX1NJWkUsCi0JCSJucW4uMjAxNC0wOC5vcmcubnZtZXhwcmVzczpOVk1mOnV1aWQ6JXBVbCIsICZob3N0LT5pZCk7CisJCSJucW4uMjAxNC0wOC5vcmcubnZtZXhwcmVzczpOVk1mOnV1aWQ6JXBVYiIsICZob3N0LT5pZCk7CiAKIAltdXRleF9sb2NrKCZudm1mX2hvc3RzX211dGV4KTsKIAlsaXN0X2FkZF90YWlsKCZob3N0LT5saXN0LCAmbnZtZl9ob3N0cyk7CkBAIC0zNjMsNyArMzY1LDE0IEBACiAJY21kLmNvbm5lY3Qub3Bjb2RlID0gbnZtZV9mYWJyaWNzX2NvbW1hbmQ7CiAJY21kLmNvbm5lY3QuZmN0eXBlID0gbnZtZV9mYWJyaWNzX3R5cGVfY29ubmVjdDsKIAljbWQuY29ubmVjdC5xaWQgPSAwOwotCWNtZC5jb25uZWN0LnNxc2l6ZSA9IGNwdV90b19sZTE2KGN0cmwtPnNxc2l6ZSk7CisKKwkvKgorCSAqIGZhYnJpY3Mgc3BlYyBzZXRzIGEgbWluaW11bSBvZiBkZXB0aCAzMiBmb3IgYWRtaW4gcXVldWUsCisJICogc28gc2V0IHRoZSBxdWV1ZSB3aXRoIHRoaXMgZGVwdGggYWx3YXlzIHVudGlsCisJICoganVzdGlmaWNhdGlvbiBvdGhlcndpc2UuCisJICovCisJY21kLmNvbm5lY3Quc3FzaXplID0gY3B1X3RvX2xlMTYoTlZNRl9BUV9ERVBUSCAtIDEpOworCiAJLyoKIAkgKiBTZXQga2VlcC1hbGl2ZSB0aW1lb3V0IGluIHNlY29uZHMgZ3JhbnVsYXJpdHkgKG1zICogMTAwMCkKIAkgKiBhbmQgYWRkIGEgZ3JhY2UgcGVyaW9kIGZvciBjb250cm9sbGVyIGthdG8gZW5mb3JjZW1lbnQKQEAgLTM3NSw3ICszODQsNyBAQAogCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQltZW1jcHkoJmRhdGEtPmhvc3RpZCwgJmN0cmwtPm9wdHMtPmhvc3QtPmlkLCBzaXplb2YodXVpZF9sZSkpOworCW1lbWNweSgmZGF0YS0+aG9zdGlkLCAmY3RybC0+b3B0cy0+aG9zdC0+aWQsIHNpemVvZih1dWlkX2JlKSk7CiAJZGF0YS0+Y250bGlkID0gY3B1X3RvX2xlMTYoMHhmZmZmKTsKIAlzdHJuY3B5KGRhdGEtPnN1YnN5c25xbiwgY3RybC0+b3B0cy0+c3Vic3lzbnFuLCBOVk1GX05RTl9TSVpFKTsKIAlzdHJuY3B5KGRhdGEtPmhvc3RucW4sIGN0cmwtPm9wdHMtPmhvc3QtPm5xbiwgTlZNRl9OUU5fU0laRSk7CkBAIC00MzQsNyArNDQzLDcgQEAKIAlpZiAoIWRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbWVtY3B5KCZkYXRhLT5ob3N0aWQsICZjdHJsLT5vcHRzLT5ob3N0LT5pZCwgc2l6ZW9mKHV1aWRfbGUpKTsKKwltZW1jcHkoJmRhdGEtPmhvc3RpZCwgJmN0cmwtPm9wdHMtPmhvc3QtPmlkLCBzaXplb2YodXVpZF9iZSkpOwogCWRhdGEtPmNudGxpZCA9IGNwdV90b19sZTE2KGN0cmwtPmNudGxpZCk7CiAJc3RybmNweShkYXRhLT5zdWJzeXNucW4sIGN0cmwtPm9wdHMtPnN1YnN5c25xbiwgTlZNRl9OUU5fU0laRSk7CiAJc3RybmNweShkYXRhLT5ob3N0bnFuLCBjdHJsLT5vcHRzLT5ob3N0LT5ucW4sIE5WTUZfTlFOX1NJWkUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9udm1lL2hvc3QvZmFicmljcy5oIGIvZHJpdmVycy9udm1lL2hvc3QvZmFicmljcy5oCmluZGV4IDg5ZGY1MmMuLjQ2ZTQ2MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbnZtZS9ob3N0L2ZhYnJpY3MuaAorKysgYi9kcml2ZXJzL252bWUvaG9zdC9mYWJyaWNzLmgKQEAgLTM0LDcgKzM0LDcgQEAKIAlzdHJ1Y3Qga3JlZgkJcmVmOwogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKIAljaGFyCQkJbnFuW05WTUZfTlFOX1NJWkVdOwotCXV1aWRfbGUJCQlpZDsKKwl1dWlkX2JlCQkJaWQ7CiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnZtZS9ob3N0L3BjaS5jIGIvZHJpdmVycy9udm1lL2hvc3QvcGNpLmMKaW5kZXggOGRjZjVhOS4uNjBmN2VhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9udm1lL2hvc3QvcGNpLmMKKysrIGIvZHJpdmVycy9udm1lL2hvc3QvcGNpLmMKQEAgLTE2OTMsNyArMTY5MywxMiBAQAogCQludm1lX3N1c3BlbmRfcXVldWUoZGV2LT5xdWV1ZXNbaV0pOwogCiAJaWYgKGNzdHMgJiBOVk1FX0NTVFNfQ0ZTIHx8ICEoY3N0cyAmIE5WTUVfQ1NUU19SRFkpKSB7Ci0JCW52bWVfc3VzcGVuZF9xdWV1ZShkZXYtPnF1ZXVlc1swXSk7CisJCS8qIEEgZGV2aWNlIG1pZ2h0IGJlY29tZSBJTyBpbmNhcGFibGUgdmVyeSBzb29uIGR1cmluZworCQkgKiBwcm9iZSwgYmVmb3JlIHRoZSBhZG1pbiBxdWV1ZSBpcyBjb25maWd1cmVkLiBUaHVzLAorCQkgKiBxdWV1ZV9jb3VudCBjYW4gYmUgMCBoZXJlLgorCQkgKi8KKwkJaWYgKGRldi0+cXVldWVfY291bnQpCisJCQludm1lX3N1c3BlbmRfcXVldWUoZGV2LT5xdWV1ZXNbMF0pOwogCX0gZWxzZSB7CiAJCW52bWVfZGlzYWJsZV9pb19xdWV1ZXMoZGV2KTsKIAkJbnZtZV9kaXNhYmxlX2FkbWluX3F1ZXVlKGRldiwgc2h1dGRvd24pOwpAQCAtMjExMiw2ICsyMTE3LDggQEAKIAkJLmRyaXZlcl9kYXRhID0gTlZNRV9RVUlSS19JREVOVElGWV9DTlMsIH0sCiAJeyBQQ0lfREVWSUNFKDB4MWM1OCwgMHgwMDAzKSwJLyogSEdTVCBhZGFwdGVyICovCiAJCS5kcml2ZXJfZGF0YSA9IE5WTUVfUVVJUktfREVMQVlfQkVGT1JFX0NIS19SRFksIH0sCisJeyBQQ0lfREVWSUNFKDB4MWM1ZiwgMHgwNTQwKSwJLyogTWVtYmxhemUgUGJsYXplNCBhZGFwdGVyICovCisJCS5kcml2ZXJfZGF0YSA9IE5WTUVfUVVJUktfREVMQVlfQkVGT1JFX0NIS19SRFksIH0sCiAJeyBQQ0lfREVWSUNFX0NMQVNTKFBDSV9DTEFTU19TVE9SQUdFX0VYUFJFU1MsIDB4ZmZmZmZmKSB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FQUExFLCAweDIwMDEpIH0sCiAJeyAwLCB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL252bWUvaG9zdC9yZG1hLmMgYi9kcml2ZXJzL252bWUvaG9zdC9yZG1hLmMKaW5kZXggOGQyODc1Yi4uZmJkYjIyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9udm1lL2hvc3QvcmRtYS5jCisrKyBiL2RyaXZlcnMvbnZtZS9ob3N0L3JkbWEuYwpAQCAtNDMsMTAgKzQzLDYgQEAKIAogI2RlZmluZSBOVk1FX1JETUFfTUFYX0lOTElORV9TRUdNRU5UUwkxCiAKLSNkZWZpbmUgTlZNRV9SRE1BX01BWF9QQUdFU19QRVJfTVIJNTEyCi0KLSNkZWZpbmUgTlZNRV9SRE1BX0RFRl9SRUNPTk5FQ1RfREVMQVkJMjAKLQogLyoKICAqIFdlIGhhbmRsZSBBRU4gY29tbWFuZHMgb3Vyc2VsdmVzIGFuZCBkb24ndCBldmVuIGxldCB0aGUKICAqIGJsb2NrIGxheWVyIGtub3cgYWJvdXQgdGhlbS4KQEAgLTc3LDcgKzczLDYgQEAKIAl1MzIJCQludW1fc2dlOwogCWludAkJCW5lbnRzOwogCWJvb2wJCQlpbmxpbmVfZGF0YTsKLQlib29sCQkJbmVlZF9pbnZhbDsKIAlzdHJ1Y3QgaWJfcmVnX3dyCXJlZ193cjsKIAlzdHJ1Y3QgaWJfY3FlCQlyZWdfY3FlOwogCXN0cnVjdCBudm1lX3JkbWFfcXVldWUgICpxdWV1ZTsKQEAgLTg3LDYgKzgyLDggQEAKIAogZW51bSBudm1lX3JkbWFfcXVldWVfZmxhZ3MgewogCU5WTUVfUkRNQV9RX0NPTk5FQ1RFRCA9ICgxIDw8IDApLAorCU5WTUVfUkRNQV9JQl9RVUVVRV9BTExPQ0FURUQgPSAoMSA8PCAxKSwKKwlOVk1FX1JETUFfUV9ERUxFVElORyA9ICgxIDw8IDIpLAogfTsKIAogc3RydWN0IG52bWVfcmRtYV9xdWV1ZSB7CkBAIC0yODYsNyArMjgzLDcgQEAKIAlzdHJ1Y3QgbnZtZV9yZG1hX3JlcXVlc3QgKnJlcSA9IGJsa19tcV9ycV90b19wZHUocnEpOwogCWludCByZXQgPSAwOwogCi0JaWYgKCFyZXEtPm5lZWRfaW52YWwpCisJaWYgKCFyZXEtPm1yLT5uZWVkX2ludmFsKQogCQlnb3RvIG91dDsKIAogCWliX2RlcmVnX21yKHJlcS0+bXIpOwpAQCAtMjk2LDkgKzI5MywxMCBAQAogCWlmIChJU19FUlIocmVxLT5tcikpIHsKIAkJcmV0ID0gUFRSX0VSUihyZXEtPm1yKTsKIAkJcmVxLT5tciA9IE5VTEw7CisJCWdvdG8gb3V0OwogCX0KIAotCXJlcS0+bmVlZF9pbnZhbCA9IGZhbHNlOworCXJlcS0+bXItPm5lZWRfaW52YWwgPSBmYWxzZTsKIAogb3V0OgogCXJldHVybiByZXQ7CkBAIC00ODUsOSArNDgzLDE0IEBACiAKIHN0YXRpYyB2b2lkIG52bWVfcmRtYV9kZXN0cm95X3F1ZXVlX2liKHN0cnVjdCBudm1lX3JkbWFfcXVldWUgKnF1ZXVlKQogewotCXN0cnVjdCBudm1lX3JkbWFfZGV2aWNlICpkZXYgPSBxdWV1ZS0+ZGV2aWNlOwotCXN0cnVjdCBpYl9kZXZpY2UgKmliZGV2ID0gZGV2LT5kZXY7CisJc3RydWN0IG52bWVfcmRtYV9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgaWJfZGV2aWNlICppYmRldjsKIAorCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KE5WTUVfUkRNQV9JQl9RVUVVRV9BTExPQ0FURUQsICZxdWV1ZS0+ZmxhZ3MpKQorCQlyZXR1cm47CisKKwlkZXYgPSBxdWV1ZS0+ZGV2aWNlOworCWliZGV2ID0gZGV2LT5kZXY7CiAJcmRtYV9kZXN0cm95X3FwKHF1ZXVlLT5jbV9pZCk7CiAJaWJfZnJlZV9jcShxdWV1ZS0+aWJfY3EpOwogCkBAIC01MzgsNiArNTQxLDcgQEAKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXRfZGVzdHJveV9xcDsKIAl9CisJc2V0X2JpdChOVk1FX1JETUFfSUJfUVVFVUVfQUxMT0NBVEVELCAmcXVldWUtPmZsYWdzKTsKIAogCXJldHVybiAwOwogCkBAIC01OTAsMTEgKzU5NCwxMyBAQAogCQlnb3RvIG91dF9kZXN0cm95X2NtX2lkOwogCX0KIAorCWNsZWFyX2JpdChOVk1FX1JETUFfUV9ERUxFVElORywgJnF1ZXVlLT5mbGFncyk7CiAJc2V0X2JpdChOVk1FX1JETUFfUV9DT05ORUNURUQsICZxdWV1ZS0+ZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiAKIG91dF9kZXN0cm95X2NtX2lkOgorCW52bWVfcmRtYV9kZXN0cm95X3F1ZXVlX2liKHF1ZXVlKTsKIAlyZG1hX2Rlc3Ryb3lfaWQocXVldWUtPmNtX2lkKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtNjEzLDcgKzYxOSw3IEBACiAKIHN0YXRpYyB2b2lkIG52bWVfcmRtYV9zdG9wX2FuZF9mcmVlX3F1ZXVlKHN0cnVjdCBudm1lX3JkbWFfcXVldWUgKnF1ZXVlKQogewotCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KE5WTUVfUkRNQV9RX0NPTk5FQ1RFRCwgJnF1ZXVlLT5mbGFncykpCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoTlZNRV9SRE1BX1FfREVMRVRJTkcsICZxdWV1ZS0+ZmxhZ3MpKQogCQlyZXR1cm47CiAJbnZtZV9yZG1hX3N0b3BfcXVldWUocXVldWUpOwogCW52bWVfcmRtYV9mcmVlX3F1ZXVlKHF1ZXVlKTsKQEAgLTY0NSw3ICs2NTEsOCBAQAogCWludCBpLCByZXQ7CiAKIAlmb3IgKGkgPSAxOyBpIDwgY3RybC0+cXVldWVfY291bnQ7IGkrKykgewotCQlyZXQgPSBudm1lX3JkbWFfaW5pdF9xdWV1ZShjdHJsLCBpLCBjdHJsLT5jdHJsLnNxc2l6ZSk7CisJCXJldCA9IG52bWVfcmRtYV9pbml0X3F1ZXVlKGN0cmwsIGksCisJCQkJCSAgIGN0cmwtPmN0cmwub3B0cy0+cXVldWVfc2l6ZSk7CiAJCWlmIChyZXQpIHsKIAkJCWRldl9pbmZvKGN0cmwtPmN0cmwuZGV2aWNlLAogCQkJCSJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBpL28gcXVldWU6ICVkXG4iLCByZXQpOwpAQCAtNjU2LDcgKzY2Myw3IEBACiAJcmV0dXJuIDA7CiAKIG91dF9mcmVlX3F1ZXVlczoKLQlmb3IgKDsgaSA+PSAxOyBpLS0pCisJZm9yIChpLS07IGkgPj0gMTsgaS0tKQogCQludm1lX3JkbWFfc3RvcF9hbmRfZnJlZV9xdWV1ZSgmY3RybC0+cXVldWVzW2ldKTsKIAogCXJldHVybiByZXQ7CkBAIC03NjUsOCArNzcyLDEzIEBACiB7CiAJc3RydWN0IG52bWVfcmRtYV9jdHJsICpjdHJsID0gY29udGFpbmVyX29mKHdvcmssCiAJCQlzdHJ1Y3QgbnZtZV9yZG1hX2N0cmwsIGVycl93b3JrKTsKKwlpbnQgaTsKIAogCW52bWVfc3RvcF9rZWVwX2FsaXZlKCZjdHJsLT5jdHJsKTsKKworCWZvciAoaSA9IDA7IGkgPCBjdHJsLT5xdWV1ZV9jb3VudDsgaSsrKQorCQljbGVhcl9iaXQoTlZNRV9SRE1BX1FfQ09OTkVDVEVELCAmY3RybC0+cXVldWVzW2ldLmZsYWdzKTsKKwogCWlmIChjdHJsLT5xdWV1ZV9jb3VudCA+IDEpCiAJCW52bWVfc3RvcF9xdWV1ZXMoJmN0cmwtPmN0cmwpOwogCWJsa19tcV9zdG9wX2h3X3F1ZXVlcyhjdHJsLT5jdHJsLmFkbWluX3EpOwpAQCAtODQ5LDcgKzg2MSw3IEBACiAJaWYgKCFibGtfcnFfYnl0ZXMocnEpKQogCQlyZXR1cm47CiAKLQlpZiAocmVxLT5uZWVkX2ludmFsKSB7CisJaWYgKHJlcS0+bXItPm5lZWRfaW52YWwpIHsKIAkJcmVzID0gbnZtZV9yZG1hX2ludl9ya2V5KHF1ZXVlLCByZXEpOwogCQlpZiAocmVzIDwgMCkgewogCQkJZGV2X2VycihjdHJsLT5jdHJsLmRldmljZSwKQEAgLTkzNSw3ICs5NDcsNyBAQAogCQkJICAgICBJQl9BQ0NFU1NfUkVNT1RFX1JFQUQgfAogCQkJICAgICBJQl9BQ0NFU1NfUkVNT1RFX1dSSVRFOwogCi0JcmVxLT5uZWVkX2ludmFsID0gdHJ1ZTsKKwlyZXEtPm1yLT5uZWVkX2ludmFsID0gdHJ1ZTsKIAogCXNnLT5hZGRyID0gY3B1X3RvX2xlNjQocmVxLT5tci0+aW92YSk7CiAJcHV0X3VuYWxpZ25lZF9sZTI0KHJlcS0+bXItPmxlbmd0aCwgc2ctPmxlbmd0aCk7CkBAIC05NTgsNyArOTcwLDcgQEAKIAogCXJlcS0+bnVtX3NnZSA9IDE7CiAJcmVxLT5pbmxpbmVfZGF0YSA9IGZhbHNlOwotCXJlcS0+bmVlZF9pbnZhbCA9IGZhbHNlOworCXJlcS0+bXItPm5lZWRfaW52YWwgPSBmYWxzZTsKIAogCWMtPmNvbW1vbi5mbGFncyB8PSBOVk1FX0NNRF9TR0xfTUVUQUJVRjsKIApAQCAtMTE0NSw3ICsxMTU3LDcgQEAKIAogCWlmICgod2MtPndjX2ZsYWdzICYgSUJfV0NfV0lUSF9JTlZBTElEQVRFKSAmJgogCSAgICB3Yy0+ZXguaW52YWxpZGF0ZV9ya2V5ID09IHJlcS0+bXItPnJrZXkpCi0JCXJlcS0+bmVlZF9pbnZhbCA9IGZhbHNlOworCQlyZXEtPm1yLT5uZWVkX2ludmFsID0gZmFsc2U7CiAKIAlibGtfbXFfY29tcGxldGVfcmVxdWVzdChycSwgc3RhdHVzKTsKIApAQCAtMTI3OCw4ICsxMjkwLDIyIEBACiAKIAlwcml2LnJlY2ZtdCA9IGNwdV90b19sZTE2KE5WTUVfUkRNQV9DTV9GTVRfMV8wKTsKIAlwcml2LnFpZCA9IGNwdV90b19sZTE2KG52bWVfcmRtYV9xdWV1ZV9pZHgocXVldWUpKTsKLQlwcml2LmhycXNpemUgPSBjcHVfdG9fbGUxNihxdWV1ZS0+cXVldWVfc2l6ZSk7Ci0JcHJpdi5oc3FzaXplID0gY3B1X3RvX2xlMTYocXVldWUtPnF1ZXVlX3NpemUpOworCS8qCisJICogc2V0IHRoZSBhZG1pbiBxdWV1ZSBkZXB0aCB0byB0aGUgbWluaW11bSBzaXplCisJICogc3BlY2lmaWVkIGJ5IHRoZSBGYWJyaWNzIHN0YW5kYXJkLgorCSAqLworCWlmIChwcml2LnFpZCA9PSAwKSB7CisJCXByaXYuaHJxc2l6ZSA9IGNwdV90b19sZTE2KE5WTUZfQVFfREVQVEgpOworCQlwcml2LmhzcXNpemUgPSBjcHVfdG9fbGUxNihOVk1GX0FRX0RFUFRIIC0gMSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogY3VycmVudCBpbnRlcnByZXRhdGlvbiBvZiB0aGUgZmFicmljcyBzcGVjCisJCSAqIGlzIGF0IG1pbmltdW0geW91IG1ha2UgaHJxc2l6ZSBzcXNpemUrMSwgb3IgYQorCQkgKiAxJ3MgYmFzZWQgcmVwcmVzZW50YXRpb24gb2Ygc3FzaXplLgorCQkgKi8KKwkJcHJpdi5ocnFzaXplID0gY3B1X3RvX2xlMTYocXVldWUtPnF1ZXVlX3NpemUpOworCQlwcml2LmhzcXNpemUgPSBjcHVfdG9fbGUxNihxdWV1ZS0+Y3RybC0+Y3RybC5zcXNpemUpOworCX0KIAogCXJldCA9IHJkbWFfY29ubmVjdChxdWV1ZS0+Y21faWQsICZwYXJhbSk7CiAJaWYgKHJldCkgewpAQCAtMTI5NSw1OCArMTMyMSw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyoqCi0gKiBudm1lX3JkbWFfZGV2aWNlX3VucGx1ZygpIC0gSGFuZGxlIFJETUEgZGV2aWNlIHVucGx1ZwotICogQHF1ZXVlOiAgICAgIFF1ZXVlIHRoYXQgb3ducyB0aGUgY21faWQgdGhhdCBjYXVnaHQgdGhlIGV2ZW50Ci0gKgotICogREVWSUNFX1JFTU9WQUwgZXZlbnQgbm90aWZpZXMgdXMgdGhhdCB0aGUgUkRNQSBkZXZpY2UgaXMgYWJvdXQKLSAqIHRvIHVucGx1ZyBzbyB3ZSBzaG91bGQgdGFrZSBjYXJlIG9mIGRlc3Ryb3lpbmcgb3VyIFJETUEgcmVzb3VyY2VzLgotICogVGhpcyBldmVudCB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgZWFjaCBhbGxvY2F0ZWQgY21faWQuCi0gKgotICogSW4gb3VyIGNhc2UsIHRoZSBSRE1BIHJlc291cmNlcyBhcmUgbWFuYWdlZCBwZXIgY29udHJvbGxlciBhbmQgbm90Ci0gKiBvbmx5IHBlciBxdWV1ZS4gU28gdGhlIHdheSB3ZSBoYW5kbGUgdGhpcyBpcyB3ZSB0cmlnZ2VyIGFuIGltcGxpY2l0Ci0gKiBjb250cm9sbGVyIGRlbGV0aW9uIHVwb24gdGhlIGZpcnN0IERFVklDRV9SRU1PVkFMIGV2ZW50IHdlIHNlZSwgYW5kCi0gKiBob2xkIHRoZSBldmVudCBpbmZsaWdodCB1bnRpbCB0aGUgY29udHJvbGxlciBkZWxldGlvbiBpcyBjb21wbGV0ZWQuCi0gKgotICogT25lIGV4Y2VwdGlvbiB0aGF0IHdlIG5lZWQgdG8gaGFuZGxlIGlzIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGUgY21faWQKLSAqIHRoYXQgY2F1Z2h0IHRoZSBldmVudC4gU2luY2Ugd2UgaG9sZCB0aGUgY2FsbG91dCB1bnRpbCB0aGUgY29udHJvbGxlcgotICogZGVsZXRpb24gaXMgY29tcGxldGVkLCB3ZSdsbCBkZWFkbG9jayBpZiB0aGUgY29udHJvbGxlciBkZWxldGlvbiB3aWxsCi0gKiBjYWxsIHJkbWFfZGVzdHJveV9pZCBvbiB0aGlzIHF1ZXVlJ3MgY21faWQuIFRodXMsIHdlIGNsYWltIG93bmVyc2hpcAotICogb2YgZGVzdHJveWluZyB0aGlzIHF1ZXVlIGJlZm9yZS1oYW5kLCBkZXN0cm95IHRoZSBxdWV1ZSByZXNvdXJjZXMsCi0gKiB0aGVuIHF1ZXVlIHRoZSBjb250cm9sbGVyIGRlbGV0aW9uIHdoaWNoIHdvbid0IGRlc3Ryb3kgdGhpcyBxdWV1ZSBhbmQKLSAqIHdlIGRlc3Ryb3kgdGhlIGNtX2lkIGltcGxpY2l0ZWx5IGJ5IHJldHVybmluZyBhIG5vbi16ZXJvIHJjIHRvIHRoZSBjYWxsb3V0LgotICovCi1zdGF0aWMgaW50IG52bWVfcmRtYV9kZXZpY2VfdW5wbHVnKHN0cnVjdCBudm1lX3JkbWFfcXVldWUgKnF1ZXVlKQotewotCXN0cnVjdCBudm1lX3JkbWFfY3RybCAqY3RybCA9IHF1ZXVlLT5jdHJsOwotCWludCByZXQ7Ci0KLQkvKiBPd24gdGhlIGNvbnRyb2xsZXIgZGVsZXRpb24gKi8KLQlpZiAoIW52bWVfY2hhbmdlX2N0cmxfc3RhdGUoJmN0cmwtPmN0cmwsIE5WTUVfQ1RSTF9ERUxFVElORykpCi0JCXJldHVybiAwOwotCi0JZGV2X3dhcm4oY3RybC0+Y3RybC5kZXZpY2UsCi0JCSJHb3QgcmRtYSBkZXZpY2UgcmVtb3ZhbCBldmVudCwgZGVsZXRpbmcgY3RybFxuIik7Ci0KLQkvKiBHZXQgcmlkIG9mIHJlY29ubmVjdCB3b3JrIGlmIGl0cyBydW5uaW5nICovCi0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZjdHJsLT5yZWNvbm5lY3Rfd29yayk7Ci0KLQkvKiBEaXNhYmxlIHRoZSBxdWV1ZSBzbyBjdHJsIGRlbGV0ZSB3b24ndCBmcmVlIGl0ICovCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChOVk1FX1JETUFfUV9DT05ORUNURUQsICZxdWV1ZS0+ZmxhZ3MpKSB7Ci0JCS8qIEZyZWUgdGhpcyBxdWV1ZSBvdXJzZWx2ZXMgKi8KLQkJbnZtZV9yZG1hX3N0b3BfcXVldWUocXVldWUpOwotCQludm1lX3JkbWFfZGVzdHJveV9xdWV1ZV9pYihxdWV1ZSk7Ci0KLQkJLyogUmV0dXJuIG5vbi16ZXJvIHNvIHRoZSBjbV9pZCB3aWxsIGRlc3Ryb3kgaW1wbGljaXRseSAqLwotCQlyZXQgPSAxOwotCX0KLQotCS8qIFF1ZXVlIGNvbnRyb2xsZXIgZGVsZXRpb24gKi8KLQlxdWV1ZV93b3JrKG52bWVfcmRtYV93cSwgJmN0cmwtPmRlbGV0ZV93b3JrKTsKLQlmbHVzaF93b3JrKCZjdHJsLT5kZWxldGVfd29yayk7Ci0JcmV0dXJuIHJldDsKLX0KLQogc3RhdGljIGludCBudm1lX3JkbWFfY21faGFuZGxlcihzdHJ1Y3QgcmRtYV9jbV9pZCAqY21faWQsCiAJCXN0cnVjdCByZG1hX2NtX2V2ZW50ICpldikKIHsKQEAgLTEzODgsOCArMTM2Miw4IEBACiAJCW52bWVfcmRtYV9lcnJvcl9yZWNvdmVyeShxdWV1ZS0+Y3RybCk7CiAJCWJyZWFrOwogCWNhc2UgUkRNQV9DTV9FVkVOVF9ERVZJQ0VfUkVNT1ZBTDoKLQkJLyogcmV0dXJuIDEgbWVhbnMgaW1wbGljaXkgQ00gSUQgZGVzdHJveSAqLwotCQlyZXR1cm4gbnZtZV9yZG1hX2RldmljZV91bnBsdWcocXVldWUpOworCQkvKiBkZXZpY2UgcmVtb3ZhbCBpcyBoYW5kbGVkIHZpYSB0aGUgaWJfY2xpZW50IEFQSSAqLworCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZXZfZXJyKHF1ZXVlLT5jdHJsLT5jdHJsLmRldmljZSwKIAkJCSJVbmV4cGVjdGVkIFJETUEgQ00gZXZlbnQgKCVkKVxuIiwgZXYtPmV2ZW50KTsKQEAgLTE0NjEsNyArMTQzNSw3IEBACiAJaWYgKHJxLT5jbWRfdHlwZSA9PSBSRVFfVFlQRV9GUyAmJiByZXFfb3AocnEpID09IFJFUV9PUF9GTFVTSCkKIAkJZmx1c2ggPSB0cnVlOwogCXJldCA9IG52bWVfcmRtYV9wb3N0X3NlbmQocXVldWUsIHNxZSwgcmVxLT5zZ2UsIHJlcS0+bnVtX3NnZSwKLQkJCXJlcS0+bmVlZF9pbnZhbCA/ICZyZXEtPnJlZ193ci53ciA6IE5VTEwsIGZsdXNoKTsKKwkJCXJlcS0+bXItPm5lZWRfaW52YWwgPyAmcmVxLT5yZWdfd3Iud3IgOiBOVUxMLCBmbHVzaCk7CiAJaWYgKHJldCkgewogCQludm1lX3JkbWFfdW5tYXBfZGF0YShxdWV1ZSwgcnEpOwogCQlnb3RvIGVycjsKQEAgLTE2OTAsMTUgKzE2NjQsMTkgQEAKIHN0YXRpYyBpbnQgbnZtZV9yZG1hX2RlbF9jdHJsKHN0cnVjdCBudm1lX2N0cmwgKm5jdHJsKQogewogCXN0cnVjdCBudm1lX3JkbWFfY3RybCAqY3RybCA9IHRvX3JkbWFfY3RybChuY3RybCk7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKIAorCS8qCisJICogS2VlcCBhIHJlZmVyZW5jZSB1bnRpbCBhbGwgd29yayBpcyBmbHVzaGVkIHNpbmNlCisJICogX19udm1lX3JkbWFfZGVsX2N0cmwgY2FuIGZyZWUgdGhlIGN0cmwgbWVtCisJICovCisJaWYgKCFrcmVmX2dldF91bmxlc3NfemVybygmY3RybC0+Y3RybC5rcmVmKSkKKwkJcmV0dXJuIC1FQlVTWTsKIAlyZXQgPSBfX252bWVfcmRtYV9kZWxfY3RybChjdHJsKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JZmx1c2hfd29yaygmY3RybC0+ZGVsZXRlX3dvcmspOwotCi0JcmV0dXJuIDA7CisJaWYgKCFyZXQpCisJCWZsdXNoX3dvcmsoJmN0cmwtPmRlbGV0ZV93b3JrKTsKKwludm1lX3B1dF9jdHJsKCZjdHJsLT5jdHJsKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBudm1lX3JkbWFfcmVtb3ZlX2N0cmxfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC0xODE2LDcgKzE3OTQsNyBAQAogCiAJbWVtc2V0KCZjdHJsLT50YWdfc2V0LCAwLCBzaXplb2YoY3RybC0+dGFnX3NldCkpOwogCWN0cmwtPnRhZ19zZXQub3BzID0gJm52bWVfcmRtYV9tcV9vcHM7Ci0JY3RybC0+dGFnX3NldC5xdWV1ZV9kZXB0aCA9IGN0cmwtPmN0cmwuc3FzaXplOworCWN0cmwtPnRhZ19zZXQucXVldWVfZGVwdGggPSBjdHJsLT5jdHJsLm9wdHMtPnF1ZXVlX3NpemU7CiAJY3RybC0+dGFnX3NldC5yZXNlcnZlZF90YWdzID0gMTsgLyogZmFicmljIGNvbm5lY3QgKi8KIAljdHJsLT50YWdfc2V0Lm51bWFfbm9kZSA9IE5VTUFfTk9fTk9ERTsKIAljdHJsLT50YWdfc2V0LmZsYWdzID0gQkxLX01RX0ZfU0hPVUxEX01FUkdFOwpAQCAtMTkxNCw3ICsxODkyLDcgQEAKIAlzcGluX2xvY2tfaW5pdCgmY3RybC0+bG9jayk7CiAKIAljdHJsLT5xdWV1ZV9jb3VudCA9IG9wdHMtPm5yX2lvX3F1ZXVlcyArIDE7IC8qICsxIGZvciBhZG1pbiBxdWV1ZSAqLwotCWN0cmwtPmN0cmwuc3FzaXplID0gb3B0cy0+cXVldWVfc2l6ZTsKKwljdHJsLT5jdHJsLnNxc2l6ZSA9IG9wdHMtPnF1ZXVlX3NpemUgLSAxOwogCWN0cmwtPmN0cmwua2F0byA9IG9wdHMtPmthdG87CiAKIAlyZXQgPSAtRU5PTUVNOwpAQCAtMTk5NSwyNyArMTk3Myw1NyBAQAogCS5jcmVhdGVfY3RybAk9IG52bWVfcmRtYV9jcmVhdGVfY3RybCwKIH07CiAKK3N0YXRpYyB2b2lkIG52bWVfcmRtYV9hZGRfb25lKHN0cnVjdCBpYl9kZXZpY2UgKmliX2RldmljZSkKK3sKK30KKworc3RhdGljIHZvaWQgbnZtZV9yZG1hX3JlbW92ZV9vbmUoc3RydWN0IGliX2RldmljZSAqaWJfZGV2aWNlLCB2b2lkICpjbGllbnRfZGF0YSkKK3sKKwlzdHJ1Y3QgbnZtZV9yZG1hX2N0cmwgKmN0cmw7CisKKwkvKiBEZWxldGUgYWxsIGNvbnRyb2xsZXJzIHVzaW5nIHRoaXMgZGV2aWNlICovCisJbXV0ZXhfbG9jaygmbnZtZV9yZG1hX2N0cmxfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3RybCwgJm52bWVfcmRtYV9jdHJsX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGN0cmwtPmRldmljZS0+ZGV2ICE9IGliX2RldmljZSkKKwkJCWNvbnRpbnVlOworCQlkZXZfaW5mbyhjdHJsLT5jdHJsLmRldmljZSwKKwkJCSJSZW1vdmluZyBjdHJsOiBOUU4gXCIlc1wiLCBhZGRyICVwSVNwXG4iLAorCQkJY3RybC0+Y3RybC5vcHRzLT5zdWJzeXNucW4sICZjdHJsLT5hZGRyKTsKKwkJX19udm1lX3JkbWFfZGVsX2N0cmwoY3RybCk7CisJfQorCW11dGV4X3VubG9jaygmbnZtZV9yZG1hX2N0cmxfbXV0ZXgpOworCisJZmx1c2hfd29ya3F1ZXVlKG52bWVfcmRtYV93cSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWJfY2xpZW50IG52bWVfcmRtYV9pYl9jbGllbnQgPSB7CisJLm5hbWUgICA9ICJudm1lX3JkbWEiLAorCS5hZGQgPSBudm1lX3JkbWFfYWRkX29uZSwKKwkucmVtb3ZlID0gbnZtZV9yZG1hX3JlbW92ZV9vbmUKK307CisKIHN0YXRpYyBpbnQgX19pbml0IG52bWVfcmRtYV9pbml0X21vZHVsZSh2b2lkKQogeworCWludCByZXQ7CisKIAludm1lX3JkbWFfd3EgPSBjcmVhdGVfd29ya3F1ZXVlKCJudm1lX3JkbWFfd3EiKTsKIAlpZiAoIW52bWVfcmRtYV93cSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlyZXQgPSBpYl9yZWdpc3Rlcl9jbGllbnQoJm52bWVfcmRtYV9pYl9jbGllbnQpOworCWlmIChyZXQpIHsKKwkJZGVzdHJveV93b3JrcXVldWUobnZtZV9yZG1hX3dxKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKIAludm1mX3JlZ2lzdGVyX3RyYW5zcG9ydCgmbnZtZV9yZG1hX3RyYW5zcG9ydCk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBudm1lX3JkbWFfY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKLQlzdHJ1Y3QgbnZtZV9yZG1hX2N0cmwgKmN0cmw7Ci0KIAludm1mX3VucmVnaXN0ZXJfdHJhbnNwb3J0KCZudm1lX3JkbWFfdHJhbnNwb3J0KTsKLQotCW11dGV4X2xvY2soJm52bWVfcmRtYV9jdHJsX211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN0cmwsICZudm1lX3JkbWFfY3RybF9saXN0LCBsaXN0KQotCQlfX252bWVfcmRtYV9kZWxfY3RybChjdHJsKTsKLQltdXRleF91bmxvY2soJm52bWVfcmRtYV9jdHJsX211dGV4KTsKLQorCWliX3VucmVnaXN0ZXJfY2xpZW50KCZudm1lX3JkbWFfaWJfY2xpZW50KTsKIAlkZXN0cm95X3dvcmtxdWV1ZShudm1lX3JkbWFfd3EpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL252bWUvdGFyZ2V0L0tjb25maWcgYi9kcml2ZXJzL252bWUvdGFyZ2V0L0tjb25maWcKaW5kZXggYTVjMzFjYi4uM2E1YjlkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9udm1lL3RhcmdldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbnZtZS90YXJnZXQvS2NvbmZpZwpAQCAtMTUsOCArMTUsOCBAQAogCiBjb25maWcgTlZNRV9UQVJHRVRfTE9PUAogCXRyaXN0YXRlICJOVk1lIGxvb3BiYWNrIGRldmljZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQkxLX0RFVl9OVk1FCiAJZGVwZW5kcyBvbiBOVk1FX1RBUkdFVAorCXNlbGVjdCBOVk1FX0NPUkUKIAlzZWxlY3QgTlZNRV9GQUJSSUNTCiAJc2VsZWN0IFNHX1BPT0wKIAloZWxwCmRpZmYgLS1naXQgYS9kcml2ZXJzL252bWUvdGFyZ2V0L2xvb3AuYyBiL2RyaXZlcnMvbnZtZS90YXJnZXQvbG9vcC5jCmluZGV4IDdhZmZkNDAuLjM5NWU2MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbnZtZS90YXJnZXQvbG9vcC5jCisrKyBiL2RyaXZlcnMvbnZtZS90YXJnZXQvbG9vcC5jCkBAIC01NTYsNyArNTU2LDcgQEAKIAogCW1lbXNldCgmY3RybC0+dGFnX3NldCwgMCwgc2l6ZW9mKGN0cmwtPnRhZ19zZXQpKTsKIAljdHJsLT50YWdfc2V0Lm9wcyA9ICZudm1lX2xvb3BfbXFfb3BzOwotCWN0cmwtPnRhZ19zZXQucXVldWVfZGVwdGggPSBjdHJsLT5jdHJsLnNxc2l6ZTsKKwljdHJsLT50YWdfc2V0LnF1ZXVlX2RlcHRoID0gY3RybC0+Y3RybC5vcHRzLT5xdWV1ZV9zaXplOwogCWN0cmwtPnRhZ19zZXQucmVzZXJ2ZWRfdGFncyA9IDE7IC8qIGZhYnJpYyBjb25uZWN0ICovCiAJY3RybC0+dGFnX3NldC5udW1hX25vZGUgPSBOVU1BX05PX05PREU7CiAJY3RybC0+dGFnX3NldC5mbGFncyA9IEJMS19NUV9GX1NIT1VMRF9NRVJHRTsKQEAgLTYyMCw3ICs2MjAsNyBAQAogCiAJcmV0ID0gLUVOT01FTTsKIAotCWN0cmwtPmN0cmwuc3FzaXplID0gb3B0cy0+cXVldWVfc2l6ZTsKKwljdHJsLT5jdHJsLnNxc2l6ZSA9IG9wdHMtPnF1ZXVlX3NpemUgLSAxOwogCWN0cmwtPmN0cmwua2F0byA9IG9wdHMtPmthdG87CiAKIAljdHJsLT5xdWV1ZXMgPSBrY2FsbG9jKG9wdHMtPm5yX2lvX3F1ZXVlcyArIDEsIHNpemVvZigqY3RybC0+cXVldWVzKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnZtZS90YXJnZXQvcmRtYS5jIGIvZHJpdmVycy9udm1lL3RhcmdldC9yZG1hLmMKaW5kZXggYjRkNjQ4NS4uMWNiZTZlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9udm1lL3RhcmdldC9yZG1hLmMKKysrIGIvZHJpdmVycy9udm1lL3RhcmdldC9yZG1hLmMKQEAgLTk3OCwxMCArOTc4LDExIEBACiAJCWNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgbnZtZXRfcmRtYV9xdWV1ZSwgcmVsZWFzZV93b3JrKTsKIAlzdHJ1Y3QgcmRtYV9jbV9pZCAqY21faWQgPSBxdWV1ZS0+Y21faWQ7CiAJc3RydWN0IG52bWV0X3JkbWFfZGV2aWNlICpkZXYgPSBxdWV1ZS0+ZGV2OworCWVudW0gbnZtZXRfcmRtYV9xdWV1ZV9zdGF0ZSBzdGF0ZSA9IHF1ZXVlLT5zdGF0ZTsKIAogCW52bWV0X3JkbWFfZnJlZV9xdWV1ZShxdWV1ZSk7CiAKLQlpZiAocXVldWUtPnN0YXRlICE9IE5WTUVUX1JETUFfSU5fREVWSUNFX1JFTU9WQUwpCisJaWYgKHN0YXRlICE9IE5WTUVUX1JETUFfSU5fREVWSUNFX1JFTU9WQUwpCiAJCXJkbWFfZGVzdHJveV9pZChjbV9pZCk7CiAKIAlrcmVmX3B1dCgmZGV2LT5yZWYsIG52bWV0X3JkbWFfZnJlZV9kZXYpOwpAQCAtMTAwMywxMCArMTAwNCwxMCBAQAogCXF1ZXVlLT5ob3N0X3FpZCA9IGxlMTZfdG9fY3B1KHJlcS0+cWlkKTsKIAogCS8qCi0JICogcmVxLT5oc3FzaXplIGNvcnJlc3BvbmRzIHRvIG91ciByZWN2IHF1ZXVlIHNpemUKKwkgKiByZXEtPmhzcXNpemUgY29ycmVzcG9uZHMgdG8gb3VyIHJlY3YgcXVldWUgc2l6ZSBwbHVzIDEKIAkgKiByZXEtPmhycXNpemUgY29ycmVzcG9uZHMgdG8gb3VyIHNlbmQgcXVldWUgc2l6ZQogCSAqLwotCXF1ZXVlLT5yZWN2X3F1ZXVlX3NpemUgPSBsZTE2X3RvX2NwdShyZXEtPmhzcXNpemUpOworCXF1ZXVlLT5yZWN2X3F1ZXVlX3NpemUgPSBsZTE2X3RvX2NwdShyZXEtPmhzcXNpemUpICsgMTsKIAlxdWV1ZS0+c2VuZF9xdWV1ZV9zaXplID0gbGUxNl90b19jcHUocmVxLT5ocnFzaXplKTsKIAogCWlmICghcXVldWUtPmhvc3RfcWlkICYmIHF1ZXVlLT5yZWN2X3F1ZXVlX3NpemUgPiBOVk1GX0FRX0RFUFRIKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9udm1lbS9yb2NrY2hpcC1lZnVzZS5jIGIvZHJpdmVycy9udm1lbS9yb2NrY2hpcC1lZnVzZS5jCmluZGV4IDRkM2YzOTEuLjQyMzkwN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbnZtZW0vcm9ja2NoaXAtZWZ1c2UuYworKysgYi9kcml2ZXJzL252bWVtL3JvY2tjaGlwLWVmdXNlLmMKQEAgLTIyLDE3ICsyMiwyOSBAQAogI2luY2x1ZGUgPGxpbnV4L252bWVtLXByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAotI2RlZmluZSBFRlVTRV9BX1NISUZUCQkJNgotI2RlZmluZSBFRlVTRV9BX01BU0sJCQkweDNmZgotI2RlZmluZSBFRlVTRV9QR0VOQgkJCUJJVCgzKQotI2RlZmluZSBFRlVTRV9MT0FECQkJQklUKDIpCi0jZGVmaW5lIEVGVVNFX1NUUk9CRQkJCUJJVCgxKQotI2RlZmluZSBFRlVTRV9DU0IJCQlCSVQoMCkKKyNkZWZpbmUgUkszMjg4X0FfU0hJRlQJCTYKKyNkZWZpbmUgUkszMjg4X0FfTUFTSwkJMHgzZmYKKyNkZWZpbmUgUkszMjg4X1BHRU5CCQlCSVQoMykKKyNkZWZpbmUgUkszMjg4X0xPQUQJCUJJVCgyKQorI2RlZmluZSBSSzMyODhfU1RST0JFCQlCSVQoMSkKKyNkZWZpbmUgUkszMjg4X0NTQgkJQklUKDApCiAKLSNkZWZpbmUgUkVHX0VGVVNFX0NUUkwJCQkweDAwMDAKLSNkZWZpbmUgUkVHX0VGVVNFX0RPVVQJCQkweDAwMDQKKyNkZWZpbmUgUkszMzk5X0FfU0hJRlQJCTE2CisjZGVmaW5lIFJLMzM5OV9BX01BU0sJCTB4M2ZmCisjZGVmaW5lIFJLMzM5OV9OQllURVMJCTQKKyNkZWZpbmUgUkszMzk5X1NUUk9CU0ZUU0VMCUJJVCg5KQorI2RlZmluZSBSSzMzOTlfUlNCCQlCSVQoNykKKyNkZWZpbmUgUkszMzk5X1BECQlCSVQoNSkKKyNkZWZpbmUgUkszMzk5X1BHRU5CCQlCSVQoMykKKyNkZWZpbmUgUkszMzk5X0xPQUQJCUJJVCgyKQorI2RlZmluZSBSSzMzOTlfU1RST0JFCQlCSVQoMSkKKyNkZWZpbmUgUkszMzk5X0NTQgkJQklUKDApCisKKyNkZWZpbmUgUkVHX0VGVVNFX0NUUkwJCTB4MDAwMAorI2RlZmluZSBSRUdfRUZVU0VfRE9VVAkJMHgwMDA0CiAKIHN0cnVjdCByb2NrY2hpcF9lZnVzZV9jaGlwIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CkBAIC00MCw4ICs1Miw4IEBACiAJc3RydWN0IGNsayAqY2xrOwogfTsKIAotc3RhdGljIGludCByb2NrY2hpcF9lZnVzZV9yZWFkKHZvaWQgKmNvbnRleHQsIHVuc2lnbmVkIGludCBvZmZzZXQsCi0JCQkgICAgICAgdm9pZCAqdmFsLCBzaXplX3QgYnl0ZXMpCitzdGF0aWMgaW50IHJvY2tjaGlwX3JrMzI4OF9lZnVzZV9yZWFkKHZvaWQgKmNvbnRleHQsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCQkJICAgICAgdm9pZCAqdmFsLCBzaXplX3QgYnl0ZXMpCiB7CiAJc3RydWN0IHJvY2tjaGlwX2VmdXNlX2NoaXAgKmVmdXNlID0gY29udGV4dDsKIAl1OCAqYnVmID0gdmFsOwpAQCAtNTMsMjcgKzY1LDgyIEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0Jd3JpdGVsKEVGVVNFX0xPQUQgfCBFRlVTRV9QR0VOQiwgZWZ1c2UtPmJhc2UgKyBSRUdfRUZVU0VfQ1RSTCk7CisJd3JpdGVsKFJLMzI4OF9MT0FEIHwgUkszMjg4X1BHRU5CLCBlZnVzZS0+YmFzZSArIFJFR19FRlVTRV9DVFJMKTsKIAl1ZGVsYXkoMSk7CiAJd2hpbGUgKGJ5dGVzLS0pIHsKIAkJd3JpdGVsKHJlYWRsKGVmdXNlLT5iYXNlICsgUkVHX0VGVVNFX0NUUkwpICYKLQkJCSAgICAgKH4oRUZVU0VfQV9NQVNLIDw8IEVGVVNFX0FfU0hJRlQpKSwKKwkJCSAgICAgKH4oUkszMjg4X0FfTUFTSyA8PCBSSzMyODhfQV9TSElGVCkpLAogCQkJICAgICBlZnVzZS0+YmFzZSArIFJFR19FRlVTRV9DVFJMKTsKIAkJd3JpdGVsKHJlYWRsKGVmdXNlLT5iYXNlICsgUkVHX0VGVVNFX0NUUkwpIHwKLQkJCSAgICAgKChvZmZzZXQrKyAmIEVGVVNFX0FfTUFTSykgPDwgRUZVU0VfQV9TSElGVCksCisJCQkgICAgICgob2Zmc2V0KysgJiBSSzMyODhfQV9NQVNLKSA8PCBSSzMyODhfQV9TSElGVCksCiAJCQkgICAgIGVmdXNlLT5iYXNlICsgUkVHX0VGVVNFX0NUUkwpOwogCQl1ZGVsYXkoMSk7CiAJCXdyaXRlbChyZWFkbChlZnVzZS0+YmFzZSArIFJFR19FRlVTRV9DVFJMKSB8Ci0JCQkgICAgIEVGVVNFX1NUUk9CRSwgZWZ1c2UtPmJhc2UgKyBSRUdfRUZVU0VfQ1RSTCk7CisJCQkgICAgIFJLMzI4OF9TVFJPQkUsIGVmdXNlLT5iYXNlICsgUkVHX0VGVVNFX0NUUkwpOwogCQl1ZGVsYXkoMSk7CiAJCSpidWYrKyA9IHJlYWRiKGVmdXNlLT5iYXNlICsgUkVHX0VGVVNFX0RPVVQpOwogCQl3cml0ZWwocmVhZGwoZWZ1c2UtPmJhc2UgKyBSRUdfRUZVU0VfQ1RSTCkgJgotCQkgICAgICh+RUZVU0VfU1RST0JFKSwgZWZ1c2UtPmJhc2UgKyBSRUdfRUZVU0VfQ1RSTCk7CisJCSAgICAgICAoflJLMzI4OF9TVFJPQkUpLCBlZnVzZS0+YmFzZSArIFJFR19FRlVTRV9DVFJMKTsKIAkJdWRlbGF5KDEpOwogCX0KIAogCS8qIFN3aXRjaCB0byBzdGFuZGJ5IG1vZGUgKi8KLQl3cml0ZWwoRUZVU0VfUEdFTkIgfCBFRlVTRV9DU0IsIGVmdXNlLT5iYXNlICsgUkVHX0VGVVNFX0NUUkwpOworCXdyaXRlbChSSzMyODhfUEdFTkIgfCBSSzMyODhfQ1NCLCBlZnVzZS0+YmFzZSArIFJFR19FRlVTRV9DVFJMKTsKKworCWNsa19kaXNhYmxlX3VucHJlcGFyZShlZnVzZS0+Y2xrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX3JrMzM5OV9lZnVzZV9yZWFkKHZvaWQgKmNvbnRleHQsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCQkJICAgICAgdm9pZCAqdmFsLCBzaXplX3QgYnl0ZXMpCit7CisJc3RydWN0IHJvY2tjaGlwX2VmdXNlX2NoaXAgKmVmdXNlID0gY29udGV4dDsKKwl1bnNpZ25lZCBpbnQgYWRkcl9zdGFydCwgYWRkcl9lbmQsIGFkZHJfb2Zmc2V0LCBhZGRyX2xlbjsKKwl1MzIgb3V0X3ZhbHVlOworCXU4ICpidWY7CisJaW50IHJldCwgaSA9IDA7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZWZ1c2UtPmNsayk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihlZnVzZS0+ZGV2LCAiZmFpbGVkIHRvIHByZXBhcmUvZW5hYmxlIGVmdXNlIGNsa1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJYWRkcl9zdGFydCA9IHJvdW5kZG93bihvZmZzZXQsIFJLMzM5OV9OQllURVMpIC8gUkszMzk5X05CWVRFUzsKKwlhZGRyX2VuZCA9IHJvdW5kdXAob2Zmc2V0ICsgYnl0ZXMsIFJLMzM5OV9OQllURVMpIC8gUkszMzk5X05CWVRFUzsKKwlhZGRyX29mZnNldCA9IG9mZnNldCAlIFJLMzM5OV9OQllURVM7CisJYWRkcl9sZW4gPSBhZGRyX2VuZCAtIGFkZHJfc3RhcnQ7CisKKwlidWYgPSBremFsbG9jKHNpemVvZigqYnVmKSAqIGFkZHJfbGVuICogUkszMzk5X05CWVRFUywgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGVmdXNlLT5jbGspOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl3cml0ZWwoUkszMzk5X0xPQUQgfCBSSzMzOTlfUEdFTkIgfCBSSzMzOTlfU1RST0JTRlRTRUwgfCBSSzMzOTlfUlNCLAorCSAgICAgICBlZnVzZS0+YmFzZSArIFJFR19FRlVTRV9DVFJMKTsKKwl1ZGVsYXkoMSk7CisJd2hpbGUgKGFkZHJfbGVuLS0pIHsKKwkJd3JpdGVsKHJlYWRsKGVmdXNlLT5iYXNlICsgUkVHX0VGVVNFX0NUUkwpIHwgUkszMzk5X1NUUk9CRSB8CisJCSAgICAgICAoKGFkZHJfc3RhcnQrKyAmIFJLMzM5OV9BX01BU0spIDw8IFJLMzM5OV9BX1NISUZUKSwKKwkJICAgICAgIGVmdXNlLT5iYXNlICsgUkVHX0VGVVNFX0NUUkwpOworCQl1ZGVsYXkoMSk7CisJCW91dF92YWx1ZSA9IHJlYWRsKGVmdXNlLT5iYXNlICsgUkVHX0VGVVNFX0RPVVQpOworCQl3cml0ZWwocmVhZGwoZWZ1c2UtPmJhc2UgKyBSRUdfRUZVU0VfQ1RSTCkgJiAoflJLMzM5OV9TVFJPQkUpLAorCQkgICAgICAgZWZ1c2UtPmJhc2UgKyBSRUdfRUZVU0VfQ1RSTCk7CisJCXVkZWxheSgxKTsKKworCQltZW1jcHkoJmJ1ZltpXSwgJm91dF92YWx1ZSwgUkszMzk5X05CWVRFUyk7CisJCWkgKz0gUkszMzk5X05CWVRFUzsKKwl9CisKKwkvKiBTd2l0Y2ggdG8gc3RhbmRieSBtb2RlICovCisJd3JpdGVsKFJLMzM5OV9QRCB8IFJLMzM5OV9DU0IsIGVmdXNlLT5iYXNlICsgUkVHX0VGVVNFX0NUUkwpOworCisJbWVtY3B5KHZhbCwgYnVmICsgYWRkcl9vZmZzZXQsIGJ5dGVzKTsKKworCWtmcmVlKGJ1Zik7CiAKIAljbGtfZGlzYWJsZV91bnByZXBhcmUoZWZ1c2UtPmNsayk7CiAKQEAgLTg5LDcgKzE1NiwyNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcm9ja2NoaXBfZWZ1c2VfbWF0Y2hbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInJvY2tjaGlwLHJvY2tjaGlwLWVmdXNlIiwgfSwKKwkvKiBkZXByZWNhdGVkIGJ1dCBrZXB0IGFyb3VuZCBmb3IgZHRzIGJpbmRpbmcgY29tcGF0aWJpbGl0eSAqLworCXsKKwkJLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscm9ja2NoaXAtZWZ1c2UiLAorCQkuZGF0YSA9ICh2b2lkICopJnJvY2tjaGlwX3JrMzI4OF9lZnVzZV9yZWFkLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMwNjZhLWVmdXNlIiwKKwkJLmRhdGEgPSAodm9pZCAqKSZyb2NrY2hpcF9yazMyODhfZWZ1c2VfcmVhZCwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMTg4LWVmdXNlIiwKKwkJLmRhdGEgPSAodm9pZCAqKSZyb2NrY2hpcF9yazMyODhfZWZ1c2VfcmVhZCwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMjg4LWVmdXNlIiwKKwkJLmRhdGEgPSAodm9pZCAqKSZyb2NrY2hpcF9yazMyODhfZWZ1c2VfcmVhZCwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMzk5LWVmdXNlIiwKKwkJLmRhdGEgPSAodm9pZCAqKSZyb2NrY2hpcF9yazMzOTlfZWZ1c2VfcmVhZCwKKwl9LAogCXsgLyogc2VudGluZWwgKi99LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHJvY2tjaGlwX2VmdXNlX21hdGNoKTsKQEAgLTk5LDYgKzE4NiwxNCBAQAogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCXN0cnVjdCBudm1lbV9kZXZpY2UgKm52bWVtOwogCXN0cnVjdCByb2NrY2hpcF9lZnVzZV9jaGlwICplZnVzZTsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCisJbWF0Y2ggPSBvZl9tYXRjaF9kZXZpY2UoZGV2LT5kcml2ZXItPm9mX21hdGNoX3RhYmxlLCBkZXYpOworCWlmICghbWF0Y2ggfHwgIW1hdGNoLT5kYXRhKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBtYXRjaCBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJZWZ1c2UgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCByb2NrY2hpcF9lZnVzZV9jaGlwKSwKIAkJCSAgICAgR0ZQX0tFUk5FTCk7CkBAIC0xMTYsNyArMjExLDcgQEAKIAogCWVmdXNlLT5kZXYgPSAmcGRldi0+ZGV2OwogCWVjb25maWcuc2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKLQllY29uZmlnLnJlZ19yZWFkID0gcm9ja2NoaXBfZWZ1c2VfcmVhZDsKKwllY29uZmlnLnJlZ19yZWFkID0gbWF0Y2gtPmRhdGE7CiAJZWNvbmZpZy5wcml2ID0gZWZ1c2U7CiAJZWNvbmZpZy5kZXYgPSBlZnVzZS0+ZGV2OwogCW52bWVtID0gbnZtZW1fcmVnaXN0ZXIoJmVjb25maWcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9iYXNlLmMgYi9kcml2ZXJzL29mL2Jhc2UuYwppbmRleCA3NzkyMjY2Li5hMGJjY2I1IDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL2Jhc2UuYworKysgYi9kcml2ZXJzL29mL2Jhc2UuYwpAQCAtMTE0NiwxNiArMTE0NiwxOCBAQAogICoKICAqIEBucDoJCWRldmljZSBub2RlIGZyb20gd2hpY2ggdGhlIHByb3BlcnR5IHZhbHVlIGlzIHRvIGJlIHJlYWQuCiAgKiBAcHJvcG5hbWU6CW5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNlYXJjaGVkLgotICogQGxlbjoJcmVxdWVzdGVkIGxlbmd0aCBvZiBwcm9wZXJ0eSB2YWx1ZQorICogQG1pbjoJbWluaW11bSBhbGxvd2VkIGxlbmd0aCBvZiBwcm9wZXJ0eSB2YWx1ZQorICogQG1heDoJbWF4aW11bSBhbGxvd2VkIGxlbmd0aCBvZiBwcm9wZXJ0eSB2YWx1ZSAoMCBtZWFucyB1bmxpbWl0ZWQpCisgKiBAbGVuOglpZiAhPU5VTEwsIGFjdHVhbCBsZW5ndGggaXMgd3JpdHRlbiB0byBoZXJlCiAgKgogICogU2VhcmNoIGZvciBhIHByb3BlcnR5IGluIGEgZGV2aWNlIG5vZGUgYW5kIHZhbGlkIHRoZSByZXF1ZXN0ZWQgc2l6ZS4KICAqIFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgaWYgdGhlIHByb3BlcnR5IGRvZXMgbm90CiAgKiAgZXhpc3QsIC1FTk9EQVRBIGlmIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYSB2YWx1ZSwgYW5kIC1FT1ZFUkZMT1cgaWYgdGhlCi0gKiBwcm9wZXJ0eSBkYXRhIGlzbid0IGxhcmdlIGVub3VnaC4KKyAqIHByb3BlcnR5IGRhdGEgaXMgdG9vIHNtYWxsIG9yIHRvbyBsYXJnZS4KICAqCiAgKi8KIHN0YXRpYyB2b2lkICpvZl9maW5kX3Byb3BlcnR5X3ZhbHVlX29mX3NpemUoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCWNvbnN0IGNoYXIgKnByb3BuYW1lLCB1MzIgbGVuKQorCQkJY29uc3QgY2hhciAqcHJvcG5hbWUsIHUzMiBtaW4sIHUzMiBtYXgsIHNpemVfdCAqbGVuKQogewogCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkobnAsIHByb3BuYW1lLCBOVUxMKTsKIApAQCAtMTE2Myw4ICsxMTY1LDEzIEBACiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCWlmICghcHJvcC0+dmFsdWUpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9EQVRBKTsKLQlpZiAobGVuID4gcHJvcC0+bGVuZ3RoKQorCWlmIChwcm9wLT5sZW5ndGggPCBtaW4pCiAJCXJldHVybiBFUlJfUFRSKC1FT1ZFUkZMT1cpOworCWlmIChtYXggJiYgcHJvcC0+bGVuZ3RoID4gbWF4KQorCQlyZXR1cm4gRVJSX1BUUigtRU9WRVJGTE9XKTsKKworCWlmIChsZW4pCisJCSpsZW4gPSBwcm9wLT5sZW5ndGg7CiAKIAlyZXR1cm4gcHJvcC0+dmFsdWU7CiB9CkBAIC0xMTg5LDcgKzExOTYsOSBAQAogCQkJCSAgICAgICB1MzIgaW5kZXgsIHUzMiAqb3V0X3ZhbHVlKQogewogCWNvbnN0IHUzMiAqdmFsID0gb2ZfZmluZF9wcm9wZXJ0eV92YWx1ZV9vZl9zaXplKG5wLCBwcm9wbmFtZSwKLQkJCQkJKChpbmRleCArIDEpICogc2l6ZW9mKCpvdXRfdmFsdWUpKSk7CisJCQkJCSgoaW5kZXggKyAxKSAqIHNpemVvZigqb3V0X3ZhbHVlKSksCisJCQkJCTAsCisJCQkJCU5VTEwpOwogCiAJaWYgKElTX0VSUih2YWwpKQogCQlyZXR1cm4gUFRSX0VSUih2YWwpOwpAQCAtMTIwMCwxMDIgKzEyMDksMTQ1IEBACiBFWFBPUlRfU1lNQk9MX0dQTChvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleCk7CiAKIC8qKgotICogb2ZfcHJvcGVydHlfcmVhZF91OF9hcnJheSAtIEZpbmQgYW5kIHJlYWQgYW4gYXJyYXkgb2YgdTggZnJvbSBhIHByb3BlcnR5LgorICogb2ZfcHJvcGVydHlfcmVhZF92YXJpYWJsZV91OF9hcnJheSAtIEZpbmQgYW5kIHJlYWQgYW4gYXJyYXkgb2YgdTggZnJvbSBhCisgKiBwcm9wZXJ0eSwgd2l0aCBib3VuZHMgb24gdGhlIG1pbmltdW0gYW5kIG1heGltdW0gYXJyYXkgc2l6ZS4KICAqCiAgKiBAbnA6CQlkZXZpY2Ugbm9kZSBmcm9tIHdoaWNoIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB0byBiZSByZWFkLgogICogQHByb3BuYW1lOgluYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBzZWFyY2hlZC4KICAqIEBvdXRfdmFsdWVzOglwb2ludGVyIHRvIHJldHVybiB2YWx1ZSwgbW9kaWZpZWQgb25seSBpZiByZXR1cm4gdmFsdWUgaXMgMC4KLSAqIEBzejoJCW51bWJlciBvZiBhcnJheSBlbGVtZW50cyB0byByZWFkCisgKiBAc3pfbWluOgltaW5pbXVtIG51bWJlciBvZiBhcnJheSBlbGVtZW50cyB0byByZWFkCisgKiBAc3pfbWF4OgltYXhpbXVtIG51bWJlciBvZiBhcnJheSBlbGVtZW50cyB0byByZWFkLCBpZiB6ZXJvIHRoZXJlIGlzIG5vCisgKgkJdXBwZXIgbGltaXQgb24gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZHRzIGVudHJ5IGJ1dCBvbmx5CisgKgkJc3pfbWluIHdpbGwgYmUgcmVhZC4KICAqCiAgKiBTZWFyY2ggZm9yIGEgcHJvcGVydHkgaW4gYSBkZXZpY2Ugbm9kZSBhbmQgcmVhZCA4LWJpdCB2YWx1ZShzKSBmcm9tCi0gKiBpdC4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgaWYgdGhlIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0LAotICogLUVOT0RBVEEgaWYgcHJvcGVydHkgZG9lcyBub3QgaGF2ZSBhIHZhbHVlLCBhbmQgLUVPVkVSRkxPVyBpZiB0aGUKLSAqIHByb3BlcnR5IGRhdGEgaXNuJ3QgbGFyZ2UgZW5vdWdoLgorICogaXQuIFJldHVybnMgbnVtYmVyIG9mIGVsZW1lbnRzIHJlYWQgb24gc3VjY2VzcywgLUVJTlZBTCBpZiB0aGUgcHJvcGVydHkKKyAqIGRvZXMgbm90IGV4aXN0LCAtRU5PREFUQSBpZiBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUsIGFuZCAtRU9WRVJGTE9XCisgKiBpZiB0aGUgcHJvcGVydHkgZGF0YSBpcyBzbWFsbGVyIHRoYW4gc3pfbWluIG9yIGxvbmdlciB0aGFuIHN6X21heC4KICAqCiAgKiBkdHMgZW50cnkgb2YgYXJyYXkgc2hvdWxkIGJlIGxpa2U6CiAgKglwcm9wZXJ0eSA9IC9iaXRzLyA4IDwweDUwIDB4NjAgMHg3MD47CiAgKgogICogVGhlIG91dF92YWx1ZXMgaXMgbW9kaWZpZWQgb25seSBpZiBhIHZhbGlkIHU4IHZhbHVlIGNhbiBiZSBkZWNvZGVkLgogICovCi1pbnQgb2ZfcHJvcGVydHlfcmVhZF91OF9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJY29uc3QgY2hhciAqcHJvcG5hbWUsIHU4ICpvdXRfdmFsdWVzLCBzaXplX3Qgc3opCitpbnQgb2ZfcHJvcGVydHlfcmVhZF92YXJpYWJsZV91OF9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQljb25zdCBjaGFyICpwcm9wbmFtZSwgdTggKm91dF92YWx1ZXMsCisJCQkJCXNpemVfdCBzel9taW4sIHNpemVfdCBzel9tYXgpCiB7CisJc2l6ZV90IHN6LCBjb3VudDsKIAljb25zdCB1OCAqdmFsID0gb2ZfZmluZF9wcm9wZXJ0eV92YWx1ZV9vZl9zaXplKG5wLCBwcm9wbmFtZSwKLQkJCQkJCShzeiAqIHNpemVvZigqb3V0X3ZhbHVlcykpKTsKKwkJCQkJCShzel9taW4gKiBzaXplb2YoKm91dF92YWx1ZXMpKSwKKwkJCQkJCShzel9tYXggKiBzaXplb2YoKm91dF92YWx1ZXMpKSwKKwkJCQkJCSZzeik7CiAKIAlpZiAoSVNfRVJSKHZhbCkpCiAJCXJldHVybiBQVFJfRVJSKHZhbCk7CiAKLQl3aGlsZSAoc3otLSkKKwlpZiAoIXN6X21heCkKKwkJc3ogPSBzel9taW47CisJZWxzZQorCQlzeiAvPSBzaXplb2YoKm91dF92YWx1ZXMpOworCisJY291bnQgPSBzejsKKwl3aGlsZSAoY291bnQtLSkKIAkJKm91dF92YWx1ZXMrKyA9ICp2YWwrKzsKLQlyZXR1cm4gMDsKKworCXJldHVybiBzejsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKG9mX3Byb3BlcnR5X3JlYWRfdThfYXJyYXkpOworRVhQT1JUX1NZTUJPTF9HUEwob2ZfcHJvcGVydHlfcmVhZF92YXJpYWJsZV91OF9hcnJheSk7CiAKIC8qKgotICogb2ZfcHJvcGVydHlfcmVhZF91MTZfYXJyYXkgLSBGaW5kIGFuZCByZWFkIGFuIGFycmF5IG9mIHUxNiBmcm9tIGEgcHJvcGVydHkuCisgKiBvZl9wcm9wZXJ0eV9yZWFkX3ZhcmlhYmxlX3UxNl9hcnJheSAtIEZpbmQgYW5kIHJlYWQgYW4gYXJyYXkgb2YgdTE2IGZyb20gYQorICogcHJvcGVydHksIHdpdGggYm91bmRzIG9uIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGFycmF5IHNpemUuCiAgKgogICogQG5wOgkJZGV2aWNlIG5vZGUgZnJvbSB3aGljaCB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdG8gYmUgcmVhZC4KICAqIEBwcm9wbmFtZToJbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgc2VhcmNoZWQuCiAgKiBAb3V0X3ZhbHVlczoJcG9pbnRlciB0byByZXR1cm4gdmFsdWUsIG1vZGlmaWVkIG9ubHkgaWYgcmV0dXJuIHZhbHVlIGlzIDAuCi0gKiBAc3o6CQludW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgdG8gcmVhZAorICogQHN6X21pbjoJbWluaW11bSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgdG8gcmVhZAorICogQHN6X21heDoJbWF4aW11bSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgdG8gcmVhZCwgaWYgemVybyB0aGVyZSBpcyBubworICoJCXVwcGVyIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGR0cyBlbnRyeSBidXQgb25seQorICoJCXN6X21pbiB3aWxsIGJlIHJlYWQuCiAgKgogICogU2VhcmNoIGZvciBhIHByb3BlcnR5IGluIGEgZGV2aWNlIG5vZGUgYW5kIHJlYWQgMTYtYml0IHZhbHVlKHMpIGZyb20KLSAqIGl0LiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVJTlZBTCBpZiB0aGUgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QsCi0gKiAtRU5PREFUQSBpZiBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUsIGFuZCAtRU9WRVJGTE9XIGlmIHRoZQotICogcHJvcGVydHkgZGF0YSBpc24ndCBsYXJnZSBlbm91Z2guCisgKiBpdC4gUmV0dXJucyBudW1iZXIgb2YgZWxlbWVudHMgcmVhZCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIHRoZSBwcm9wZXJ0eQorICogZG9lcyBub3QgZXhpc3QsIC1FTk9EQVRBIGlmIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYSB2YWx1ZSwgYW5kIC1FT1ZFUkZMT1cKKyAqIGlmIHRoZSBwcm9wZXJ0eSBkYXRhIGlzIHNtYWxsZXIgdGhhbiBzel9taW4gb3IgbG9uZ2VyIHRoYW4gc3pfbWF4LgogICoKICAqIGR0cyBlbnRyeSBvZiBhcnJheSBzaG91bGQgYmUgbGlrZToKICAqCXByb3BlcnR5ID0gL2JpdHMvIDE2IDwweDUwMDAgMHg2MDAwIDB4NzAwMD47CiAgKgogICogVGhlIG91dF92YWx1ZXMgaXMgbW9kaWZpZWQgb25seSBpZiBhIHZhbGlkIHUxNiB2YWx1ZSBjYW4gYmUgZGVjb2RlZC4KICAqLwotaW50IG9mX3Byb3BlcnR5X3JlYWRfdTE2X2FycmF5KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQljb25zdCBjaGFyICpwcm9wbmFtZSwgdTE2ICpvdXRfdmFsdWVzLCBzaXplX3Qgc3opCitpbnQgb2ZfcHJvcGVydHlfcmVhZF92YXJpYWJsZV91MTZfYXJyYXkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkJY29uc3QgY2hhciAqcHJvcG5hbWUsIHUxNiAqb3V0X3ZhbHVlcywKKwkJCQkJc2l6ZV90IHN6X21pbiwgc2l6ZV90IHN6X21heCkKIHsKKwlzaXplX3Qgc3osIGNvdW50OwogCWNvbnN0IF9fYmUxNiAqdmFsID0gb2ZfZmluZF9wcm9wZXJ0eV92YWx1ZV9vZl9zaXplKG5wLCBwcm9wbmFtZSwKLQkJCQkJCShzeiAqIHNpemVvZigqb3V0X3ZhbHVlcykpKTsKKwkJCQkJCShzel9taW4gKiBzaXplb2YoKm91dF92YWx1ZXMpKSwKKwkJCQkJCShzel9tYXggKiBzaXplb2YoKm91dF92YWx1ZXMpKSwKKwkJCQkJCSZzeik7CiAKIAlpZiAoSVNfRVJSKHZhbCkpCiAJCXJldHVybiBQVFJfRVJSKHZhbCk7CiAKLQl3aGlsZSAoc3otLSkKKwlpZiAoIXN6X21heCkKKwkJc3ogPSBzel9taW47CisJZWxzZQorCQlzeiAvPSBzaXplb2YoKm91dF92YWx1ZXMpOworCisJY291bnQgPSBzejsKKwl3aGlsZSAoY291bnQtLSkKIAkJKm91dF92YWx1ZXMrKyA9IGJlMTZfdG9fY3B1cCh2YWwrKyk7Ci0JcmV0dXJuIDA7CisKKwlyZXR1cm4gc3o7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChvZl9wcm9wZXJ0eV9yZWFkX3UxNl9hcnJheSk7CitFWFBPUlRfU1lNQk9MX0dQTChvZl9wcm9wZXJ0eV9yZWFkX3ZhcmlhYmxlX3UxNl9hcnJheSk7CiAKIC8qKgotICogb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkgLSBGaW5kIGFuZCByZWFkIGFuIGFycmF5IG9mIDMyIGJpdCBpbnRlZ2VycwotICogZnJvbSBhIHByb3BlcnR5LgorICogb2ZfcHJvcGVydHlfcmVhZF92YXJpYWJsZV91MzJfYXJyYXkgLSBGaW5kIGFuZCByZWFkIGFuIGFycmF5IG9mIDMyIGJpdAorICogaW50ZWdlcnMgZnJvbSBhIHByb3BlcnR5LCB3aXRoIGJvdW5kcyBvbiB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBhcnJheSBzaXplLgogICoKICAqIEBucDoJCWRldmljZSBub2RlIGZyb20gd2hpY2ggdGhlIHByb3BlcnR5IHZhbHVlIGlzIHRvIGJlIHJlYWQuCiAgKiBAcHJvcG5hbWU6CW5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNlYXJjaGVkLgogICogQG91dF92YWx1ZXM6CXBvaW50ZXIgdG8gcmV0dXJuIHZhbHVlLCBtb2RpZmllZCBvbmx5IGlmIHJldHVybiB2YWx1ZSBpcyAwLgotICogQHN6OgkJbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIHRvIHJlYWQKKyAqIEBzel9taW46CW1pbmltdW0gbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIHRvIHJlYWQKKyAqIEBzel9tYXg6CW1heGltdW0gbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIHRvIHJlYWQsIGlmIHplcm8gdGhlcmUgaXMgbm8KKyAqCQl1cHBlciBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBkdHMgZW50cnkgYnV0IG9ubHkKKyAqCQlzel9taW4gd2lsbCBiZSByZWFkLgogICoKICAqIFNlYXJjaCBmb3IgYSBwcm9wZXJ0eSBpbiBhIGRldmljZSBub2RlIGFuZCByZWFkIDMyLWJpdCB2YWx1ZShzKSBmcm9tCi0gKiBpdC4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgaWYgdGhlIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0LAotICogLUVOT0RBVEEgaWYgcHJvcGVydHkgZG9lcyBub3QgaGF2ZSBhIHZhbHVlLCBhbmQgLUVPVkVSRkxPVyBpZiB0aGUKLSAqIHByb3BlcnR5IGRhdGEgaXNuJ3QgbGFyZ2UgZW5vdWdoLgorICogaXQuIFJldHVybnMgbnVtYmVyIG9mIGVsZW1lbnRzIHJlYWQgb24gc3VjY2VzcywgLUVJTlZBTCBpZiB0aGUgcHJvcGVydHkKKyAqIGRvZXMgbm90IGV4aXN0LCAtRU5PREFUQSBpZiBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUsIGFuZCAtRU9WRVJGTE9XCisgKiBpZiB0aGUgcHJvcGVydHkgZGF0YSBpcyBzbWFsbGVyIHRoYW4gc3pfbWluIG9yIGxvbmdlciB0aGFuIHN6X21heC4KICAqCiAgKiBUaGUgb3V0X3ZhbHVlcyBpcyBtb2RpZmllZCBvbmx5IGlmIGEgdmFsaWQgdTMyIHZhbHVlIGNhbiBiZSBkZWNvZGVkLgogICovCi1pbnQgb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKK2ludCBvZl9wcm9wZXJ0eV9yZWFkX3ZhcmlhYmxlX3UzMl9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAogCQkJICAgICAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLCB1MzIgKm91dF92YWx1ZXMsCi0JCQkgICAgICAgc2l6ZV90IHN6KQorCQkJICAgICAgIHNpemVfdCBzel9taW4sIHNpemVfdCBzel9tYXgpCiB7CisJc2l6ZV90IHN6LCBjb3VudDsKIAljb25zdCBfX2JlMzIgKnZhbCA9IG9mX2ZpbmRfcHJvcGVydHlfdmFsdWVfb2Zfc2l6ZShucCwgcHJvcG5hbWUsCi0JCQkJCQkoc3ogKiBzaXplb2YoKm91dF92YWx1ZXMpKSk7CisJCQkJCQkoc3pfbWluICogc2l6ZW9mKCpvdXRfdmFsdWVzKSksCisJCQkJCQkoc3pfbWF4ICogc2l6ZW9mKCpvdXRfdmFsdWVzKSksCisJCQkJCQkmc3opOwogCiAJaWYgKElTX0VSUih2YWwpKQogCQlyZXR1cm4gUFRSX0VSUih2YWwpOwogCi0Jd2hpbGUgKHN6LS0pCisJaWYgKCFzel9tYXgpCisJCXN6ID0gc3pfbWluOworCWVsc2UKKwkJc3ogLz0gc2l6ZW9mKCpvdXRfdmFsdWVzKTsKKworCWNvdW50ID0gc3o7CisJd2hpbGUgKGNvdW50LS0pCiAJCSpvdXRfdmFsdWVzKysgPSBiZTMyX3RvX2NwdXAodmFsKyspOwotCXJldHVybiAwOworCisJcmV0dXJuIHN6OwogfQotRVhQT1JUX1NZTUJPTF9HUEwob2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkpOworRVhQT1JUX1NZTUJPTF9HUEwob2ZfcHJvcGVydHlfcmVhZF92YXJpYWJsZV91MzJfYXJyYXkpOwogCiAvKioKICAqIG9mX3Byb3BlcnR5X3JlYWRfdTY0IC0gRmluZCBhbmQgcmVhZCBhIDY0IGJpdCBpbnRlZ2VyIGZyb20gYSBwcm9wZXJ0eQpAQCAtMTMxNCw3ICsxMzY2LDkgQEAKIAkJCSB1NjQgKm91dF92YWx1ZSkKIHsKIAljb25zdCBfX2JlMzIgKnZhbCA9IG9mX2ZpbmRfcHJvcGVydHlfdmFsdWVfb2Zfc2l6ZShucCwgcHJvcG5hbWUsCi0JCQkJCQlzaXplb2YoKm91dF92YWx1ZSkpOworCQkJCQkJc2l6ZW9mKCpvdXRfdmFsdWUpLAorCQkJCQkJMCwKKwkJCQkJCU5VTEwpOwogCiAJaWYgKElTX0VSUih2YWwpKQogCQlyZXR1cm4gUFRSX0VSUih2YWwpOwpAQCAtMTMyNSwzOCArMTM3OSw1MSBAQAogRVhQT1JUX1NZTUJPTF9HUEwob2ZfcHJvcGVydHlfcmVhZF91NjQpOwogCiAvKioKLSAqIG9mX3Byb3BlcnR5X3JlYWRfdTY0X2FycmF5IC0gRmluZCBhbmQgcmVhZCBhbiBhcnJheSBvZiA2NCBiaXQgaW50ZWdlcnMKLSAqIGZyb20gYSBwcm9wZXJ0eS4KKyAqIG9mX3Byb3BlcnR5X3JlYWRfdmFyaWFibGVfdTY0X2FycmF5IC0gRmluZCBhbmQgcmVhZCBhbiBhcnJheSBvZiA2NCBiaXQKKyAqIGludGVnZXJzIGZyb20gYSBwcm9wZXJ0eSwgd2l0aCBib3VuZHMgb24gdGhlIG1pbmltdW0gYW5kIG1heGltdW0gYXJyYXkgc2l6ZS4KICAqCiAgKiBAbnA6CQlkZXZpY2Ugbm9kZSBmcm9tIHdoaWNoIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB0byBiZSByZWFkLgogICogQHByb3BuYW1lOgluYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBzZWFyY2hlZC4KICAqIEBvdXRfdmFsdWVzOglwb2ludGVyIHRvIHJldHVybiB2YWx1ZSwgbW9kaWZpZWQgb25seSBpZiByZXR1cm4gdmFsdWUgaXMgMC4KLSAqIEBzejoJCW51bWJlciBvZiBhcnJheSBlbGVtZW50cyB0byByZWFkCisgKiBAc3pfbWluOgltaW5pbXVtIG51bWJlciBvZiBhcnJheSBlbGVtZW50cyB0byByZWFkCisgKiBAc3pfbWF4OgltYXhpbXVtIG51bWJlciBvZiBhcnJheSBlbGVtZW50cyB0byByZWFkLCBpZiB6ZXJvIHRoZXJlIGlzIG5vCisgKgkJdXBwZXIgbGltaXQgb24gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZHRzIGVudHJ5IGJ1dCBvbmx5CisgKgkJc3pfbWluIHdpbGwgYmUgcmVhZC4KICAqCiAgKiBTZWFyY2ggZm9yIGEgcHJvcGVydHkgaW4gYSBkZXZpY2Ugbm9kZSBhbmQgcmVhZCA2NC1iaXQgdmFsdWUocykgZnJvbQotICogaXQuIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCwKLSAqIC1FTk9EQVRBIGlmIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYSB2YWx1ZSwgYW5kIC1FT1ZFUkZMT1cgaWYgdGhlCi0gKiBwcm9wZXJ0eSBkYXRhIGlzbid0IGxhcmdlIGVub3VnaC4KKyAqIGl0LiBSZXR1cm5zIG51bWJlciBvZiBlbGVtZW50cyByZWFkIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgaWYgdGhlIHByb3BlcnR5CisgKiBkb2VzIG5vdCBleGlzdCwgLUVOT0RBVEEgaWYgcHJvcGVydHkgZG9lcyBub3QgaGF2ZSBhIHZhbHVlLCBhbmQgLUVPVkVSRkxPVworICogaWYgdGhlIHByb3BlcnR5IGRhdGEgaXMgc21hbGxlciB0aGFuIHN6X21pbiBvciBsb25nZXIgdGhhbiBzel9tYXguCiAgKgogICogVGhlIG91dF92YWx1ZXMgaXMgbW9kaWZpZWQgb25seSBpZiBhIHZhbGlkIHU2NCB2YWx1ZSBjYW4gYmUgZGVjb2RlZC4KICAqLwotaW50IG9mX3Byb3BlcnR5X3JlYWRfdTY0X2FycmF5KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCitpbnQgb2ZfcHJvcGVydHlfcmVhZF92YXJpYWJsZV91NjRfYXJyYXkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKIAkJCSAgICAgICBjb25zdCBjaGFyICpwcm9wbmFtZSwgdTY0ICpvdXRfdmFsdWVzLAotCQkJICAgICAgIHNpemVfdCBzeikKKwkJCSAgICAgICBzaXplX3Qgc3pfbWluLCBzaXplX3Qgc3pfbWF4KQogeworCXNpemVfdCBzeiwgY291bnQ7CiAJY29uc3QgX19iZTMyICp2YWwgPSBvZl9maW5kX3Byb3BlcnR5X3ZhbHVlX29mX3NpemUobnAsIHByb3BuYW1lLAotCQkJCQkJKHN6ICogc2l6ZW9mKCpvdXRfdmFsdWVzKSkpOworCQkJCQkJKHN6X21pbiAqIHNpemVvZigqb3V0X3ZhbHVlcykpLAorCQkJCQkJKHN6X21heCAqIHNpemVvZigqb3V0X3ZhbHVlcykpLAorCQkJCQkJJnN6KTsKIAogCWlmIChJU19FUlIodmFsKSkKIAkJcmV0dXJuIFBUUl9FUlIodmFsKTsKIAotCXdoaWxlIChzei0tKSB7CisJaWYgKCFzel9tYXgpCisJCXN6ID0gc3pfbWluOworCWVsc2UKKwkJc3ogLz0gc2l6ZW9mKCpvdXRfdmFsdWVzKTsKKworCWNvdW50ID0gc3o7CisJd2hpbGUgKGNvdW50LS0pIHsKIAkJKm91dF92YWx1ZXMrKyA9IG9mX3JlYWRfbnVtYmVyKHZhbCwgMik7CiAJCXZhbCArPSAyOwogCX0KLQlyZXR1cm4gMDsKKworCXJldHVybiBzejsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKG9mX3Byb3BlcnR5X3JlYWRfdTY0X2FycmF5KTsKK0VYUE9SVF9TWU1CT0xfR1BMKG9mX3Byb3BlcnR5X3JlYWRfdmFyaWFibGVfdTY0X2FycmF5KTsKIAogLyoqCiAgKiBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyAtIEZpbmQgYW5kIHJlYWQgYSBzdHJpbmcgZnJvbSBhIHByb3BlcnR5CkBAIC0xNjMxLDggKzE2OTgsNyBAQAogCSAqLwogCiAgZXJyOgotCWlmIChpdC5ub2RlKQotCQlvZl9ub2RlX3B1dChpdC5ub2RlKTsKKwlvZl9ub2RlX3B1dChpdC5ub2RlKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTIzNDMsMjAgKzI0MDksMTMgQEAKIAljb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCwgaW50IHBvcnRfcmVnLCBpbnQgcmVnKQogewogCXN0cnVjdCBvZl9lbmRwb2ludCBlbmRwb2ludDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsICpwcmV2X25vZGUgPSBOVUxMOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IE5VTEw7CiAKLQl3aGlsZSAoMSkgewotCQlub2RlID0gb2ZfZ3JhcGhfZ2V0X25leHRfZW5kcG9pbnQocGFyZW50LCBwcmV2X25vZGUpOwotCQlvZl9ub2RlX3B1dChwcmV2X25vZGUpOwotCQlpZiAoIW5vZGUpCi0JCQlicmVhazsKLQorCWZvcl9lYWNoX2VuZHBvaW50X29mX25vZGUocGFyZW50LCBub2RlKSB7CiAJCW9mX2dyYXBoX3BhcnNlX2VuZHBvaW50KG5vZGUsICZlbmRwb2ludCk7CiAJCWlmICgoKHBvcnRfcmVnID09IC0xKSB8fCAoZW5kcG9pbnQucG9ydCA9PSBwb3J0X3JlZykpICYmCiAJCQkoKHJlZyA9PSAtMSkgfHwgKGVuZHBvaW50LmlkID09IHJlZykpKQogCQkJcmV0dXJuIG5vZGU7Ci0KLQkJcHJldl9ub2RlID0gbm9kZTsKIAl9CiAKIAlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvZmR0LmMgYi9kcml2ZXJzL29mL2ZkdC5jCmluZGV4IDU1ZjFiODMuLmM4OWQ1ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvZmR0LmMKKysrIGIvZHJpdmVycy9vZi9mZHQuYwpAQCAtNTE3LDcgKzUxNyw3IEBACiAJCXByX3dhcm5pbmcoIkVuZCBvZiB0cmVlIG1hcmtlciBvdmVyd3JpdHRlbjogJTA4eFxuIiwKIAkJCSAgIGJlMzJfdG9fY3B1cChtZW0gKyBzaXplKSk7CiAKLQlpZiAoZGV0YWNoZWQpIHsKKwlpZiAoZGV0YWNoZWQgJiYgbXlub2RlcykgewogCQlvZl9ub2RlX3NldF9mbGFnKCpteW5vZGVzLCBPRl9ERVRBQ0hFRCk7CiAJCXByX2RlYnVnKCJ1bmZsYXR0ZW5lZCB0cmVlIGlzIGRldGFjaGVkXG4iKTsKIAl9CkBAIC05MjQsNyArOTI0LDcgQEAKIAogI2lmZGVmIENPTkZJR19TRVJJQUxfRUFSTFlDT04KIAotc3RhdGljIGludCBfX2luaXQgZWFybHlfaW5pdF9kdF9zY2FuX2Nob3Nlbl9zZXJpYWwodm9pZCkKK2ludCBfX2luaXQgZWFybHlfaW5pdF9kdF9zY2FuX2Nob3Nlbl9zdGRvdXQodm9pZCkKIHsKIAlpbnQgb2Zmc2V0OwogCWNvbnN0IGNoYXIgKnAsICpxLCAqb3B0aW9ucyA9IE5VTEw7CkBAIC05NjgsMTUgKzk2OCw2IEBACiAJfQogCXJldHVybiAtRU5PREVWOwogfQotCi1zdGF0aWMgaW50IF9faW5pdCBzZXR1cF9vZl9lYXJseWNvbihjaGFyICpidWYpCi17Ci0JaWYgKGJ1ZikKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gZWFybHlfaW5pdF9kdF9zY2FuX2Nob3Nlbl9zZXJpYWwoKTsKLX0KLWVhcmx5X3BhcmFtKCJlYXJseWNvbiIsIHNldHVwX29mX2Vhcmx5Y29uKTsKICNlbmRpZgogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvaXJxLmMgYi9kcml2ZXJzL29mL2lycS5jCmluZGV4IDg5YTcxYzYuLmEyZTY4ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvaXJxLmMKKysrIGIvZHJpdmVycy9vZi9pcnEuYwpAQCAtNTQ0LDEyICs1NDQsMTUgQEAKIAogCQkJbGlzdF9kZWwoJmRlc2MtPmxpc3QpOwogCisJCQlvZl9ub2RlX3NldF9mbGFnKGRlc2MtPmRldiwgT0ZfUE9QVUxBVEVEKTsKKwogCQkJcHJfZGVidWcoIm9mX2lycV9pbml0OiBpbml0ICVzICglcCksIHBhcmVudCAlcFxuIiwKIAkJCQkgZGVzYy0+ZGV2LT5mdWxsX25hbWUsCiAJCQkJIGRlc2MtPmRldiwgZGVzYy0+aW50ZXJydXB0X3BhcmVudCk7CiAJCQlyZXQgPSBkZXNjLT5pcnFfaW5pdF9jYihkZXNjLT5kZXYsCiAJCQkJCQlkZXNjLT5pbnRlcnJ1cHRfcGFyZW50KTsKIAkJCWlmIChyZXQpIHsKKwkJCQlvZl9ub2RlX2NsZWFyX2ZsYWcoZGVzYy0+ZGV2LCBPRl9QT1BVTEFURUQpOwogCQkJCWtmcmVlKGRlc2MpOwogCQkJCWNvbnRpbnVlOwogCQkJfQpAQCAtNTU5LDggKzU2Miw2IEBACiAJCQkgKiBpdHMgY2hpbGRyZW4gY2FuIGdldCBwcm9jZXNzZWQgaW4gYSBzdWJzZXF1ZW50IHBhc3MuCiAJCQkgKi8KIAkJCWxpc3RfYWRkX3RhaWwoJmRlc2MtPmxpc3QsICZpbnRjX3BhcmVudF9saXN0KTsKLQotCQkJb2Zfbm9kZV9zZXRfZmxhZyhkZXNjLT5kZXYsIE9GX1BPUFVMQVRFRCk7CiAJCX0KIAogCQkvKiBHZXQgdGhlIG5leHQgcGVuZGluZyBwYXJlbnQgdGhhdCBtaWdodCBoYXZlIGNoaWxkcmVuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL29mX251bWEuYyBiL2RyaXZlcnMvb2Yvb2ZfbnVtYS5jCmluZGV4IGVkNWEwOTcuLmY2M2Q0YjBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL29mX251bWEuYworKysgYi9kcml2ZXJzL29mL29mX251bWEuYwpAQCAtMTYsNiArMTYsOCBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSAiT0Y6IE5VTUE6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgpAQCAtNDksMTAgKzUxLDkgQEAKIAkJaWYgKHIpCiAJCQljb250aW51ZTsKIAotCQlwcl9kZWJ1ZygiTlVNQTogQ1BVIG9uICV1XG4iLCBuaWQpOworCQlwcl9kZWJ1ZygiQ1BVIG9uICV1XG4iLCBuaWQpOwogCQlpZiAobmlkID49IE1BWF9OVU1OT0RFUykKLQkJCXByX3dhcm4oIk5VTUE6IE5vZGUgaWQgJXUgZXhjZWVkcyBtYXhpbXVtIHZhbHVlXG4iLAotCQkJCW5pZCk7CisJCQlwcl93YXJuKCJOb2RlIGlkICV1IGV4Y2VlZHMgbWF4aW11bSB2YWx1ZVxuIiwgbmlkKTsKIAkJZWxzZQogCQkJbm9kZV9zZXQobmlkLCBudW1hX25vZGVzX3BhcnNlZCk7CiAJfQpAQCAtNjMsMTMgKzY0LDkgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gTlVMTDsKIAlzdHJ1Y3QgcmVzb3VyY2UgcnNyYzsKIAl1MzIgbmlkOwotCWludCByID0gMDsKKwlpbnQgaSwgcjsKIAotCWZvciAoOzspIHsKLQkJbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgIm1lbW9yeSIpOwotCQlpZiAoIW5wKQotCQkJYnJlYWs7Ci0KKwlmb3JfZWFjaF9ub2RlX2J5X3R5cGUobnAsICJtZW1vcnkiKSB7CiAJCXIgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgIm51bWEtbm9kZS1pZCIsICZuaWQpOwogCQlpZiAociA9PSAtRUlOVkFMKQogCQkJLyoKQEAgLTc4LDI3ICs3NSwyMyBAQAogCQkJICogIm51bWEtbm9kZS1pZCIgcHJvcGVydHkKIAkJCSAqLwogCQkJY29udGludWU7Ci0JCWVsc2UgaWYgKHIpCi0JCQkvKiBzb21lIG90aGVyIGVycm9yICovCi0JCQlicmVhazsKIAotCQlyID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJzcmMpOwotCQlpZiAocikgewotCQkJcHJfZXJyKCJOVU1BOiBiYWQgcmVnIHByb3BlcnR5IGluIG1lbW9yeSBub2RlXG4iKTsKLQkJCWJyZWFrOworCQlpZiAobmlkID49IE1BWF9OVU1OT0RFUykgeworCQkJcHJfd2FybigiTm9kZSBpZCAldSBleGNlZWRzIG1heGltdW0gdmFsdWVcbiIsIG5pZCk7CisJCQlyID0gLUVJTlZBTDsKIAkJfQogCi0JCXByX2RlYnVnKCJOVU1BOiAgYmFzZSA9ICVsbHggbGVuID0gJWxseCwgbm9kZSA9ICV1XG4iLAotCQkJIHJzcmMuc3RhcnQsIHJzcmMuZW5kIC0gcnNyYy5zdGFydCArIDEsIG5pZCk7CisJCWZvciAoaSA9IDA7ICFyICYmICFvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCBpLCAmcnNyYyk7IGkrKykKKwkJCXIgPSBudW1hX2FkZF9tZW1ibGsobmlkLCByc3JjLnN0YXJ0LCByc3JjLmVuZCArIDEpOwogCi0KLQkJciA9IG51bWFfYWRkX21lbWJsayhuaWQsIHJzcmMuc3RhcnQsIHJzcmMuZW5kICsgMSk7Ci0JCWlmIChyKQotCQkJYnJlYWs7CisJCWlmICghaSB8fCByKSB7CisJCQlvZl9ub2RlX3B1dChucCk7CisJCQlwcl9lcnIoImJhZCBwcm9wZXJ0eSBpbiBtZW1vcnkgbm9kZVxuIik7CisJCQlyZXR1cm4gciA/IDogLUVJTlZBTDsKKwkJfQogCX0KLQlvZl9ub2RlX3B1dChucCk7CiAKLQlyZXR1cm4gcjsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBfX2luaXQgb2ZfbnVtYV9wYXJzZV9kaXN0YW5jZV9tYXBfdjEoc3RydWN0IGRldmljZV9ub2RlICptYXApCkBAIC0xMDcsMTcgKzEwMCwxNyBAQAogCWludCBlbnRyeV9jb3VudDsKIAlpbnQgaTsKIAotCXByX2luZm8oIk5VTUE6IHBhcnNpbmcgbnVtYS1kaXN0YW5jZS1tYXAtdjFcbiIpOworCXByX2luZm8oInBhcnNpbmcgbnVtYS1kaXN0YW5jZS1tYXAtdjFcbiIpOwogCiAJbWF0cml4ID0gb2ZfZ2V0X3Byb3BlcnR5KG1hcCwgImRpc3RhbmNlLW1hdHJpeCIsIE5VTEwpOwogCWlmICghbWF0cml4KSB7Ci0JCXByX2VycigiTlVNQTogTm8gZGlzdGFuY2UtbWF0cml4IHByb3BlcnR5IGluIGRpc3RhbmNlLW1hcFxuIik7CisJCXByX2VycigiTm8gZGlzdGFuY2UtbWF0cml4IHByb3BlcnR5IGluIGRpc3RhbmNlLW1hcFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWVudHJ5X2NvdW50ID0gb2ZfcHJvcGVydHlfY291bnRfdTMyX2VsZW1zKG1hcCwgImRpc3RhbmNlLW1hdHJpeCIpOwogCWlmIChlbnRyeV9jb3VudCA8PSAwKSB7Ci0JCXByX2VycigiTlVNQTogSW52YWxpZCBkaXN0YW5jZS1tYXRyaXhcbiIpOworCQlwcl9lcnIoIkludmFsaWQgZGlzdGFuY2UtbWF0cml4XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xMzIsNyArMTI1LDcgQEAKIAkJbWF0cml4Kys7CiAKIAkJbnVtYV9zZXRfZGlzdGFuY2Uobm9kZWEsIG5vZGViLCBkaXN0YW5jZSk7Ci0JCXByX2RlYnVnKCJOVU1BOiAgZGlzdGFuY2Vbbm9kZSVkIC0+IG5vZGUlZF0gPSAlZFxuIiwKKwkJcHJfZGVidWcoImRpc3RhbmNlW25vZGUlZCAtPiBub2RlJWRdID0gJWRcbiIsCiAJCQkgbm9kZWEsIG5vZGViLCBkaXN0YW5jZSk7CiAKIAkJLyogU2V0IGRlZmF1bHQgZGlzdGFuY2Ugb2Ygbm9kZSBCLT5BIHNhbWUgYXMgQS0+QiAqLwpAQCAtMTY2LDggKzE1OSw2IEBACiAJbnAgPSBvZl9ub2RlX2dldChkZXZpY2UpOwogCiAJd2hpbGUgKG5wKSB7Ci0JCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50OwotCiAJCXIgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgIm51bWEtbm9kZS1pZCIsICZuaWQpOwogCQkvKgogCQkgKiAtRUlOVkFMIGluZGljYXRlcyB0aGUgcHJvcGVydHkgd2FzIG5vdCBmb3VuZCwgYW5kCkBAIC0xNzgsMjIgKzE2OSwxNSBAQAogCQlpZiAociAhPSAtRUlOVkFMKQogCQkJYnJlYWs7CiAKLQkJcGFyZW50ID0gb2ZfZ2V0X3BhcmVudChucCk7Ci0JCW9mX25vZGVfcHV0KG5wKTsKLQkJbnAgPSBwYXJlbnQ7CisJCW5wID0gb2ZfZ2V0X25leHRfcGFyZW50KG5wKTsKIAl9CiAJaWYgKG5wICYmIHIpCi0JCXByX3dhcm4oIk5VTUE6IEludmFsaWQgXCJudW1hLW5vZGUtaWRcIiBwcm9wZXJ0eSBpbiBub2RlICVzXG4iLAorCQlwcl93YXJuKCJJbnZhbGlkIFwibnVtYS1ub2RlLWlkXCIgcHJvcGVydHkgaW4gbm9kZSAlc1xuIiwKIAkJCW5wLT5uYW1lKTsKIAlvZl9ub2RlX3B1dChucCk7CiAKLQlpZiAoIXIpIHsKLQkJaWYgKG5pZCA+PSBNQVhfTlVNTk9ERVMpCi0JCQlwcl93YXJuKCJOVU1BOiBOb2RlIGlkICV1IGV4Y2VlZHMgbWF4aW11bSB2YWx1ZVxuIiwKLQkJCQluaWQpOwotCQllbHNlCi0JCQlyZXR1cm4gbmlkOwotCX0KKwlpZiAoIXIpCisJCXJldHVybiBuaWQ7CiAKIAlyZXR1cm4gTlVNQV9OT19OT0RFOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9wbGF0Zm9ybS5jIGIvZHJpdmVycy9vZi9wbGF0Zm9ybS5jCmluZGV4IDhhYTE5NzYuLmY4MTFkMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL29mL3BsYXRmb3JtLmMKQEAgLTE0Miw2ICsxNDIsNyBAQAogCX0KIAogCWRldi0+ZGV2Lm9mX25vZGUgPSBvZl9ub2RlX2dldChucCk7CisJZGV2LT5kZXYuZndub2RlID0gJm5wLT5md25vZGU7CiAJZGV2LT5kZXYucGFyZW50ID0gcGFyZW50ID8gOiAmcGxhdGZvcm1fYnVzOwogCiAJaWYgKGJ1c19pZCkKQEAgLTI0MSw2ICsyNDIsNyBAQAogCiAJLyogc2V0dXAgZ2VuZXJpYyBkZXZpY2UgaW5mbyAqLwogCWRldi0+ZGV2Lm9mX25vZGUgPSBvZl9ub2RlX2dldChub2RlKTsKKwlkZXYtPmRldi5md25vZGUgPSAmbm9kZS0+Zndub2RlOwogCWRldi0+ZGV2LnBhcmVudCA9IHBhcmVudCA/IDogJnBsYXRmb3JtX2J1czsKIAlkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gcGxhdGZvcm1fZGF0YTsKIAlpZiAoYnVzX2lkKQpAQCAtNDk3LDYgKzQ5OSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvZl9wbGF0Zm9ybV9kZWZhdWx0X3BvcHVsYXRlKTsKIAorI2lmbmRlZiBDT05GSUdfUFBDCiBzdGF0aWMgaW50IF9faW5pdCBvZl9wbGF0Zm9ybV9kZWZhdWx0X3BvcHVsYXRlX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CkBAIC01MjEsNiArNTI0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIGFyY2hfaW5pdGNhbGxfc3luYyhvZl9wbGF0Zm9ybV9kZWZhdWx0X3BvcHVsYXRlX2luaXQpOworI2VuZGlmCiAKIHN0YXRpYyBpbnQgb2ZfcGxhdGZvcm1fZGV2aWNlX2Rlc3Ryb3koc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vcHJvZmlsZS90aW1lcl9pbnQuYyBiL2RyaXZlcnMvb3Byb2ZpbGUvdGltZXJfaW50LmMKaW5kZXggYmRlZjkxNi4uMjQ5OGE2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9vcHJvZmlsZS90aW1lcl9pbnQuYworKysgYi9kcml2ZXJzL29wcm9maWxlL3RpbWVyX2ludC5jCkBAIC03NCwzNyArNzQsMzkgQEAKIAlwdXRfb25saW5lX2NwdXMoKTsKIH0KIAotc3RhdGljIGludCBvcHJvZmlsZV9jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQgb3Byb2ZpbGVfdGltZXJfb25saW5lKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0JbG9uZyBjcHUgPSAobG9uZykgaGNwdTsKLQotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBDUFVfT05MSU5FOgotCWNhc2UgQ1BVX09OTElORV9GUk9aRU46Ci0JCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIF9fb3Byb2ZpbGVfaHJ0aW1lcl9zdGFydCwKLQkJCQkJIE5VTEwsIDEpOwotCQlicmVhazsKLQljYXNlIENQVV9ERUFEOgotCWNhc2UgQ1BVX0RFQURfRlJPWkVOOgotCQlfX29wcm9maWxlX2hydGltZXJfc3RvcChjcHUpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIE5PVElGWV9PSzsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCV9fb3Byb2ZpbGVfaHJ0aW1lcl9zdGFydChOVUxMKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgX19yZWZkYXRhIG9wcm9maWxlX2NwdV9ub3RpZmllciA9IHsKLQkubm90aWZpZXJfY2FsbCA9IG9wcm9maWxlX2NwdV9ub3RpZnksCi19Oworc3RhdGljIGludCBvcHJvZmlsZV90aW1lcl9wcmVwX2Rvd24odW5zaWduZWQgaW50IGNwdSkKK3sKKwlfX29wcm9maWxlX2hydGltZXJfc3RvcChjcHUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgZW51bSBjcHVocF9zdGF0ZSBocF9vbmxpbmU7CiAKIHN0YXRpYyBpbnQgb3Byb2ZpbGVfaHJ0aW1lcl9zZXR1cCh2b2lkKQogewotCXJldHVybiByZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJm9wcm9maWxlX2NwdV9ub3RpZmllcik7CisJaW50IHJldDsKKworCXJldCA9IGNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVBfT05MSU5FX0RZTiwKKwkJCQkJIm9wcm9maWxlL3RpbWVyOm9ubGluZSIsCisJCQkJCW9wcm9maWxlX3RpbWVyX29ubGluZSwKKwkJCQkJb3Byb2ZpbGVfdGltZXJfcHJlcF9kb3duKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlocF9vbmxpbmUgPSByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIG9wcm9maWxlX2hydGltZXJfc2h1dGRvd24odm9pZCkKIHsKLQl1bnJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmb3Byb2ZpbGVfY3B1X25vdGlmaWVyKTsKKwljcHVocF9yZW1vdmVfc3RhdGVfbm9jYWxscyhocF9vbmxpbmUpOwogfQogCiBpbnQgb3Byb2ZpbGVfdGltZXJfaW5pdChzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqb3BzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG9zdC1icmlkZ2UuYyBiL2RyaXZlcnMvcGNpL2hvc3QtYnJpZGdlLmMKaW5kZXggNWY0YTJlMC4uYWRkNjYyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG9zdC1icmlkZ2UuYworKysgYi9kcml2ZXJzL3BjaS9ob3N0LWJyaWRnZS5jCkBAIC00NCw2ICs0NCw3IEBACiAJYnJpZGdlLT5yZWxlYXNlX2ZuID0gcmVsZWFzZV9mbjsKIAlicmlkZ2UtPnJlbGVhc2VfZGF0YSA9IHJlbGVhc2VfZGF0YTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV9zZXRfaG9zdF9icmlkZ2VfcmVsZWFzZSk7CiAKIHZvaWQgcGNpYmlvc19yZXNvdXJjZV90b19idXMoc3RydWN0IHBjaV9idXMgKmJ1cywgc3RydWN0IHBjaV9idXNfcmVnaW9uICpyZWdpb24sCiAJCQkgICAgIHN0cnVjdCByZXNvdXJjZSAqcmVzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvbXNpLmMgYi9kcml2ZXJzL3BjaS9tc2kuYwppbmRleCBlYWZhNjEzLi5iZmRkMDc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9tc2kuYworKysgYi9kcml2ZXJzL3BjaS9tc2kuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpX2lvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CkBAIC01NDksMTUgKzU1MCwyMyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbXNpX2Rlc2MgKm1zaV9zZXR1cF9lbnRyeShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbnZlYykKK3N0YXRpYyBzdHJ1Y3QgbXNpX2Rlc2MgKgorbXNpX3NldHVwX2VudHJ5KHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBudmVjLCBib29sIGFmZmluaXR5KQogewotCXUxNiBjb250cm9sOworCXN0cnVjdCBjcHVtYXNrICptYXNrcyA9IE5VTEw7CiAJc3RydWN0IG1zaV9kZXNjICplbnRyeTsKKwl1MTYgY29udHJvbDsKKworCWlmIChhZmZpbml0eSkgeworCQltYXNrcyA9IGlycV9jcmVhdGVfYWZmaW5pdHlfbWFza3MoZGV2LT5pcnFfYWZmaW5pdHksIG52ZWMpOworCQlpZiAoIW1hc2tzKQorCQkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgYWZmaW5pdHkgbWFza3MsIGlnbm9yaW5nXG4iKTsKKwl9CiAKIAkvKiBNU0kgRW50cnkgSW5pdGlhbGl6YXRpb24gKi8KLQllbnRyeSA9IGFsbG9jX21zaV9lbnRyeSgmZGV2LT5kZXYpOworCWVudHJ5ID0gYWxsb2NfbXNpX2VudHJ5KCZkZXYtPmRldiwgbnZlYywgbWFza3MpOwogCWlmICghZW50cnkpCi0JCXJldHVybiBOVUxMOworCQlnb3RvIG91dDsKIAogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgZGV2LT5tc2lfY2FwICsgUENJX01TSV9GTEFHUywgJmNvbnRyb2wpOwogCkBAIC01NjgsOCArNTc3LDYgQEAKIAllbnRyeS0+bXNpX2F0dHJpYi5kZWZhdWx0X2lycQk9IGRldi0+aXJxOwkvKiBTYXZlIElPQVBJQyBJUlEgKi8KIAllbnRyeS0+bXNpX2F0dHJpYi5tdWx0aV9jYXAJPSAoY29udHJvbCAmIFBDSV9NU0lfRkxBR1NfUU1BU0spID4+IDE7CiAJZW50cnktPm1zaV9hdHRyaWIubXVsdGlwbGUJPSBpbG9nMihfX3JvdW5kdXBfcG93X29mX3R3byhudmVjKSk7Ci0JZW50cnktPm52ZWNfdXNlZAkJPSBudmVjOwotCWVudHJ5LT5hZmZpbml0eQkJCT0gZGV2LT5pcnFfYWZmaW5pdHk7CiAKIAlpZiAoY29udHJvbCAmIFBDSV9NU0lfRkxBR1NfNjRCSVQpCiAJCWVudHJ5LT5tYXNrX3BvcyA9IGRldi0+bXNpX2NhcCArIFBDSV9NU0lfTUFTS182NDsKQEAgLTU4MCw2ICs1ODcsOCBAQAogCWlmIChlbnRyeS0+bXNpX2F0dHJpYi5tYXNrYml0KQogCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBlbnRyeS0+bWFza19wb3MsICZlbnRyeS0+bWFza2VkKTsKIAorb3V0OgorCWtmcmVlKG1hc2tzKTsKIAlyZXR1cm4gZW50cnk7CiB9CiAKQEAgLTYwOCw3ICs2MTcsNyBAQAogICogYW4gZXJyb3IsIGFuZCBhIHBvc2l0aXZlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBpbnRlcnJ1cHRzCiAgKiB3aGljaCBjb3VsZCBoYXZlIGJlZW4gYWxsb2NhdGVkLgogICovCi1zdGF0aWMgaW50IG1zaV9jYXBhYmlsaXR5X2luaXQoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG52ZWMpCitzdGF0aWMgaW50IG1zaV9jYXBhYmlsaXR5X2luaXQoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG52ZWMsIGJvb2wgYWZmaW5pdHkpCiB7CiAJc3RydWN0IG1zaV9kZXNjICplbnRyeTsKIAlpbnQgcmV0OwpAQCAtNjE2LDcgKzYyNSw3IEBACiAKIAlwY2lfbXNpX3NldF9lbmFibGUoZGV2LCAwKTsJLyogRGlzYWJsZSBNU0kgZHVyaW5nIHNldCB1cCAqLwogCi0JZW50cnkgPSBtc2lfc2V0dXBfZW50cnkoZGV2LCBudmVjKTsKKwllbnRyeSA9IG1zaV9zZXR1cF9lbnRyeShkZXYsIG52ZWMsIGFmZmluaXR5KTsKIAlpZiAoIWVudHJ5KQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtNjc5LDI4ICs2ODgsMjkgQEAKIH0KIAogc3RhdGljIGludCBtc2l4X3NldHVwX2VudHJpZXMoc3RydWN0IHBjaV9kZXYgKmRldiwgdm9pZCBfX2lvbWVtICpiYXNlLAotCQkJICAgICAgc3RydWN0IG1zaXhfZW50cnkgKmVudHJpZXMsIGludCBudmVjKQorCQkJICAgICAgc3RydWN0IG1zaXhfZW50cnkgKmVudHJpZXMsIGludCBudmVjLAorCQkJICAgICAgYm9vbCBhZmZpbml0eSkKIHsKLQljb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzayA9IE5VTEw7CisJc3RydWN0IGNwdW1hc2sgKmN1cm1zaywgKm1hc2tzID0gTlVMTDsKIAlzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5OwotCWludCBjcHUgPSAtMSwgaTsKKwlpbnQgcmV0LCBpOwogCi0JZm9yIChpID0gMDsgaSA8IG52ZWM7IGkrKykgewotCQlpZiAoZGV2LT5pcnFfYWZmaW5pdHkpIHsKLQkJCWNwdSA9IGNwdW1hc2tfbmV4dChjcHUsIGRldi0+aXJxX2FmZmluaXR5KTsKLQkJCWlmIChjcHUgPj0gbnJfY3B1X2lkcykKLQkJCQljcHUgPSBjcHVtYXNrX2ZpcnN0KGRldi0+aXJxX2FmZmluaXR5KTsKLQkJCW1hc2sgPSBjcHVtYXNrX29mKGNwdSk7Ci0JCX0KKwlpZiAoYWZmaW5pdHkpIHsKKwkJbWFza3MgPSBpcnFfY3JlYXRlX2FmZmluaXR5X21hc2tzKGRldi0+aXJxX2FmZmluaXR5LCBudmVjKTsKKwkJaWYgKCFtYXNrcykKKwkJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIGFmZmluaXR5IG1hc2tzLCBpZ25vcmluZ1xuIik7CisJfQogCi0JCWVudHJ5ID0gYWxsb2NfbXNpX2VudHJ5KCZkZXYtPmRldik7CisJZm9yIChpID0gMCwgY3VybXNrID0gbWFza3M7IGkgPCBudmVjOyBpKyspIHsKKwkJZW50cnkgPSBhbGxvY19tc2lfZW50cnkoJmRldi0+ZGV2LCAxLCBjdXJtc2spOwogCQlpZiAoIWVudHJ5KSB7CiAJCQlpZiAoIWkpCiAJCQkJaW91bm1hcChiYXNlKTsKIAkJCWVsc2UKIAkJCQlmcmVlX21zaV9pcnFzKGRldik7CiAJCQkvKiBObyBlbm91Z2ggbWVtb3J5LiBEb24ndCB0cnkgYWdhaW4gKi8KLQkJCXJldHVybiAtRU5PTUVNOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OwogCQl9CiAKIAkJZW50cnktPm1zaV9hdHRyaWIuaXNfbXNpeAk9IDE7CkBAIC03MTEsMTIgKzcyMSwxNCBAQAogCQkJZW50cnktPm1zaV9hdHRyaWIuZW50cnlfbnIgPSBpOwogCQllbnRyeS0+bXNpX2F0dHJpYi5kZWZhdWx0X2lycQk9IGRldi0+aXJxOwogCQllbnRyeS0+bWFza19iYXNlCQk9IGJhc2U7Ci0JCWVudHJ5LT5udmVjX3VzZWQJCT0gMTsKLQkJZW50cnktPmFmZmluaXR5CQkJPSBtYXNrOwogCiAJCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5saXN0LCBkZXZfdG9fbXNpX2xpc3QoJmRldi0+ZGV2KSk7CisJCWlmIChtYXNrcykKKwkJCWN1cm1zaysrOwogCX0KLQorCXJldCA9IDA7CitvdXQ6CisJa2ZyZWUobWFza3MpOwogCXJldHVybiAwOwogfQogCkBAIC03NDUsOCArNzU3LDggQEAKICAqIHNpbmdsZSBNU0ktWCBpcnEuIEEgcmV0dXJuIG9mIHplcm8gaW5kaWNhdGVzIHRoZSBzdWNjZXNzZnVsIHNldHVwIG9mCiAgKiByZXF1ZXN0ZWQgTVNJLVggZW50cmllcyB3aXRoIGFsbG9jYXRlZCBpcnFzIG9yIG5vbi16ZXJvIGZvciBvdGhlcndpc2UuCiAgKiovCi1zdGF0aWMgaW50IG1zaXhfY2FwYWJpbGl0eV9pbml0KHN0cnVjdCBwY2lfZGV2ICpkZXYsCi0JCQkJc3RydWN0IG1zaXhfZW50cnkgKmVudHJpZXMsIGludCBudmVjKQorc3RhdGljIGludCBtc2l4X2NhcGFiaWxpdHlfaW5pdChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgbXNpeF9lbnRyeSAqZW50cmllcywKKwkJCQlpbnQgbnZlYywgYm9vbCBhZmZpbml0eSkKIHsKIAlpbnQgcmV0OwogCXUxNiBjb250cm9sOwpAQCAtNzYxLDcgKzc3Myw3IEBACiAJaWYgKCFiYXNlKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXJldCA9IG1zaXhfc2V0dXBfZW50cmllcyhkZXYsIGJhc2UsIGVudHJpZXMsIG52ZWMpOworCXJldCA9IG1zaXhfc2V0dXBfZW50cmllcyhkZXYsIGJhc2UsIGVudHJpZXMsIG52ZWMsIGFmZmluaXR5KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC05NDEsMjIgKzk1Myw4IEBACiB9CiBFWFBPUlRfU1lNQk9MKHBjaV9tc2l4X3ZlY19jb3VudCk7CiAKLS8qKgotICogcGNpX2VuYWJsZV9tc2l4IC0gY29uZmlndXJlIGRldmljZSdzIE1TSS1YIGNhcGFiaWxpdHkgc3RydWN0dXJlCi0gKiBAZGV2OiBwb2ludGVyIHRvIHRoZSBwY2lfZGV2IGRhdGEgc3RydWN0dXJlIG9mIE1TSS1YIGRldmljZSBmdW5jdGlvbgotICogQGVudHJpZXM6IHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgTVNJLVggZW50cmllcyAob3B0aW9uYWwpCi0gKiBAbnZlYzogbnVtYmVyIG9mIE1TSS1YIGlycXMgcmVxdWVzdGVkIGZvciBhbGxvY2F0aW9uIGJ5IGRldmljZSBkcml2ZXIKLSAqCi0gKiBTZXR1cCB0aGUgTVNJLVggY2FwYWJpbGl0eSBzdHJ1Y3R1cmUgb2YgZGV2aWNlIGZ1bmN0aW9uIHdpdGggdGhlIG51bWJlcgotICogb2YgcmVxdWVzdGVkIGlycXMgdXBvbiBpdHMgc29mdHdhcmUgZHJpdmVyIGNhbGwgdG8gcmVxdWVzdCBmb3IKLSAqIE1TSS1YIG1vZGUgZW5hYmxlZCBvbiBpdHMgaGFyZHdhcmUgZGV2aWNlIGZ1bmN0aW9uLiBBIHJldHVybiBvZiB6ZXJvCi0gKiBpbmRpY2F0ZXMgdGhlIHN1Y2Nlc3NmdWwgY29uZmlndXJhdGlvbiBvZiBNU0ktWCBjYXBhYmlsaXR5IHN0cnVjdHVyZQotICogd2l0aCBuZXcgYWxsb2NhdGVkIE1TSS1YIGlycXMuIEEgcmV0dXJuIG9mIDwgMCBpbmRpY2F0ZXMgYSBmYWlsdXJlLgotICogT3IgYSByZXR1cm4gb2YgPiAwIGluZGljYXRlcyB0aGF0IGRyaXZlciByZXF1ZXN0IGlzIGV4Y2VlZGluZyB0aGUgbnVtYmVyCi0gKiBvZiBpcnFzIG9yIE1TSS1YIHZlY3RvcnMgYXZhaWxhYmxlLiBEcml2ZXIgc2hvdWxkIHVzZSB0aGUgcmV0dXJuZWQgdmFsdWUgdG8KLSAqIHJlLXNlbmQgaXRzIHJlcXVlc3QuCi0gKiovCi1pbnQgcGNpX2VuYWJsZV9tc2l4KHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBtc2l4X2VudHJ5ICplbnRyaWVzLCBpbnQgbnZlYykKK3N0YXRpYyBpbnQgX19wY2lfZW5hYmxlX21zaXgoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IG1zaXhfZW50cnkgKmVudHJpZXMsCisJCQkgICAgIGludCBudmVjLCBib29sIGFmZmluaXR5KQogewogCWludCBucl9lbnRyaWVzOwogCWludCBpLCBqOwpAQCAtOTg4LDcgKzk4NiwyNyBAQAogCQlkZXZfaW5mbygmZGV2LT5kZXYsICJjYW4ndCBlbmFibGUgTVNJLVggKE1TSSBJUlEgYWxyZWFkeSBhc3NpZ25lZClcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JcmV0dXJuIG1zaXhfY2FwYWJpbGl0eV9pbml0KGRldiwgZW50cmllcywgbnZlYyk7CisJcmV0dXJuIG1zaXhfY2FwYWJpbGl0eV9pbml0KGRldiwgZW50cmllcywgbnZlYywgYWZmaW5pdHkpOworfQorCisvKioKKyAqIHBjaV9lbmFibGVfbXNpeCAtIGNvbmZpZ3VyZSBkZXZpY2UncyBNU0ktWCBjYXBhYmlsaXR5IHN0cnVjdHVyZQorICogQGRldjogcG9pbnRlciB0byB0aGUgcGNpX2RldiBkYXRhIHN0cnVjdHVyZSBvZiBNU0ktWCBkZXZpY2UgZnVuY3Rpb24KKyAqIEBlbnRyaWVzOiBwb2ludGVyIHRvIGFuIGFycmF5IG9mIE1TSS1YIGVudHJpZXMgKG9wdGlvbmFsKQorICogQG52ZWM6IG51bWJlciBvZiBNU0ktWCBpcnFzIHJlcXVlc3RlZCBmb3IgYWxsb2NhdGlvbiBieSBkZXZpY2UgZHJpdmVyCisgKgorICogU2V0dXAgdGhlIE1TSS1YIGNhcGFiaWxpdHkgc3RydWN0dXJlIG9mIGRldmljZSBmdW5jdGlvbiB3aXRoIHRoZSBudW1iZXIKKyAqIG9mIHJlcXVlc3RlZCBpcnFzIHVwb24gaXRzIHNvZnR3YXJlIGRyaXZlciBjYWxsIHRvIHJlcXVlc3QgZm9yCisgKiBNU0ktWCBtb2RlIGVuYWJsZWQgb24gaXRzIGhhcmR3YXJlIGRldmljZSBmdW5jdGlvbi4gQSByZXR1cm4gb2YgemVybworICogaW5kaWNhdGVzIHRoZSBzdWNjZXNzZnVsIGNvbmZpZ3VyYXRpb24gb2YgTVNJLVggY2FwYWJpbGl0eSBzdHJ1Y3R1cmUKKyAqIHdpdGggbmV3IGFsbG9jYXRlZCBNU0ktWCBpcnFzLiBBIHJldHVybiBvZiA8IDAgaW5kaWNhdGVzIGEgZmFpbHVyZS4KKyAqIE9yIGEgcmV0dXJuIG9mID4gMCBpbmRpY2F0ZXMgdGhhdCBkcml2ZXIgcmVxdWVzdCBpcyBleGNlZWRpbmcgdGhlIG51bWJlcgorICogb2YgaXJxcyBvciBNU0ktWCB2ZWN0b3JzIGF2YWlsYWJsZS4gRHJpdmVyIHNob3VsZCB1c2UgdGhlIHJldHVybmVkIHZhbHVlIHRvCisgKiByZS1zZW5kIGl0cyByZXF1ZXN0LgorICoqLworaW50IHBjaV9lbmFibGVfbXNpeChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgbXNpeF9lbnRyeSAqZW50cmllcywgaW50IG52ZWMpCit7CisJcmV0dXJuIF9fcGNpX2VuYWJsZV9tc2l4KGRldiwgZW50cmllcywgbnZlYywgZmFsc2UpOwogfQogRVhQT1JUX1NZTUJPTChwY2lfZW5hYmxlX21zaXgpOwogCkBAIC0xMDQxLDYgKzEwNTksNyBAQAogc3RhdGljIGludCBfX3BjaV9lbmFibGVfbXNpX3JhbmdlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBtaW52ZWMsIGludCBtYXh2ZWMsCiAJCXVuc2lnbmVkIGludCBmbGFncykKIHsKKwlib29sIGFmZmluaXR5ID0gZmxhZ3MgJiBQQ0lfSVJRX0FGRklOSVRZOwogCWludCBudmVjOwogCWludCByYzsKIApAQCAtMTA2OSwxOSArMTA4OCwxNyBAQAogCQludmVjID0gbWF4dmVjOwogCiAJZm9yICg7OykgewotCQlpZiAoIShmbGFncyAmIFBDSV9JUlFfTk9BRkZJTklUWSkpIHsKLQkJCWRldi0+aXJxX2FmZmluaXR5ID0gaXJxX2NyZWF0ZV9hZmZpbml0eV9tYXNrKCZudmVjKTsKKwkJaWYgKGFmZmluaXR5KSB7CisJCQludmVjID0gaXJxX2NhbGNfYWZmaW5pdHlfdmVjdG9ycyhkZXYtPmlycV9hZmZpbml0eSwKKwkJCQkJbnZlYyk7CiAJCQlpZiAobnZlYyA8IG1pbnZlYykKIAkJCQlyZXR1cm4gLUVOT1NQQzsKIAkJfQogCi0JCXJjID0gbXNpX2NhcGFiaWxpdHlfaW5pdChkZXYsIG52ZWMpOworCQlyYyA9IG1zaV9jYXBhYmlsaXR5X2luaXQoZGV2LCBudmVjLCBhZmZpbml0eSk7CiAJCWlmIChyYyA9PSAwKQogCQkJcmV0dXJuIG52ZWM7CiAKLQkJa2ZyZWUoZGV2LT5pcnFfYWZmaW5pdHkpOwotCQlkZXYtPmlycV9hZmZpbml0eSA9IE5VTEw7Ci0KIAkJaWYgKHJjIDwgMCkKIAkJCXJldHVybiByYzsKIAkJaWYgKHJjIDwgbWludmVjKQpAQCAtMTEwNSw3ICsxMTIyLDcgQEAKICAqKi8KIGludCBwY2lfZW5hYmxlX21zaV9yYW5nZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWludmVjLCBpbnQgbWF4dmVjKQogewotCXJldHVybiBfX3BjaV9lbmFibGVfbXNpX3JhbmdlKGRldiwgbWludmVjLCBtYXh2ZWMsIFBDSV9JUlFfTk9BRkZJTklUWSk7CisJcmV0dXJuIF9fcGNpX2VuYWJsZV9tc2lfcmFuZ2UoZGV2LCBtaW52ZWMsIG1heHZlYywgMCk7CiB9CiBFWFBPUlRfU1lNQk9MKHBjaV9lbmFibGVfbXNpX3JhbmdlKTsKIApAQCAtMTExMywyNiArMTEzMCwyNCBAQAogCQlzdHJ1Y3QgbXNpeF9lbnRyeSAqZW50cmllcywgaW50IG1pbnZlYywgaW50IG1heHZlYywKIAkJdW5zaWduZWQgaW50IGZsYWdzKQogewotCWludCBudmVjID0gbWF4dmVjOwotCWludCByYzsKKwlib29sIGFmZmluaXR5ID0gZmxhZ3MgJiBQQ0lfSVJRX0FGRklOSVRZOworCWludCByYywgbnZlYyA9IG1heHZlYzsKIAogCWlmIChtYXh2ZWMgPCBtaW52ZWMpCiAJCXJldHVybiAtRVJBTkdFOwogCiAJZm9yICg7OykgewotCQlpZiAoIShmbGFncyAmIFBDSV9JUlFfTk9BRkZJTklUWSkpIHsKLQkJCWRldi0+aXJxX2FmZmluaXR5ID0gaXJxX2NyZWF0ZV9hZmZpbml0eV9tYXNrKCZudmVjKTsKKwkJaWYgKGFmZmluaXR5KSB7CisJCQludmVjID0gaXJxX2NhbGNfYWZmaW5pdHlfdmVjdG9ycyhkZXYtPmlycV9hZmZpbml0eSwKKwkJCQkJbnZlYyk7CiAJCQlpZiAobnZlYyA8IG1pbnZlYykKIAkJCQlyZXR1cm4gLUVOT1NQQzsKIAkJfQogCi0JCXJjID0gcGNpX2VuYWJsZV9tc2l4KGRldiwgZW50cmllcywgbnZlYyk7CisJCXJjID0gX19wY2lfZW5hYmxlX21zaXgoZGV2LCBlbnRyaWVzLCBudmVjLCBhZmZpbml0eSk7CiAJCWlmIChyYyA9PSAwKQogCQkJcmV0dXJuIG52ZWM7CiAKLQkJa2ZyZWUoZGV2LT5pcnFfYWZmaW5pdHkpOwotCQlkZXYtPmlycV9hZmZpbml0eSA9IE5VTEw7Ci0KIAkJaWYgKHJjIDwgMCkKIAkJCXJldHVybiByYzsKIAkJaWYgKHJjIDwgbWludmVjKQpAQCAtMTE2MCw4ICsxMTc1LDcgQEAKIGludCBwY2lfZW5hYmxlX21zaXhfcmFuZ2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IG1zaXhfZW50cnkgKmVudHJpZXMsCiAJCWludCBtaW52ZWMsIGludCBtYXh2ZWMpCiB7Ci0JcmV0dXJuIF9fcGNpX2VuYWJsZV9tc2l4X3JhbmdlKGRldiwgZW50cmllcywgbWludmVjLCBtYXh2ZWMsCi0JCQlQQ0lfSVJRX05PQUZGSU5JVFkpOworCXJldHVybiBfX3BjaV9lbmFibGVfbXNpeF9yYW5nZShkZXYsIGVudHJpZXMsIG1pbnZlYywgbWF4dmVjLCAwKTsKIH0KIEVYUE9SVF9TWU1CT0wocGNpX2VuYWJsZV9tc2l4X3JhbmdlKTsKIApAQCAtMTE4NywyMiArMTIwMSwyNSBAQAogewogCWludCB2ZWNzID0gLUVOT1NQQzsKIAotCWlmICghKGZsYWdzICYgUENJX0lSUV9OT01TSVgpKSB7CisJaWYgKGZsYWdzICYgUENJX0lSUV9NU0lYKSB7CiAJCXZlY3MgPSBfX3BjaV9lbmFibGVfbXNpeF9yYW5nZShkZXYsIE5VTEwsIG1pbl92ZWNzLCBtYXhfdmVjcywKIAkJCQlmbGFncyk7CiAJCWlmICh2ZWNzID4gMCkKIAkJCXJldHVybiB2ZWNzOwogCX0KIAotCWlmICghKGZsYWdzICYgUENJX0lSUV9OT01TSSkpIHsKKwlpZiAoZmxhZ3MgJiBQQ0lfSVJRX01TSSkgewogCQl2ZWNzID0gX19wY2lfZW5hYmxlX21zaV9yYW5nZShkZXYsIG1pbl92ZWNzLCBtYXhfdmVjcywgZmxhZ3MpOwogCQlpZiAodmVjcyA+IDApCiAJCQlyZXR1cm4gdmVjczsKIAl9CiAKIAkvKiB1c2UgbGVnYWN5IGlycSBpZiBhbGxvd2VkICovCi0JaWYgKCEoZmxhZ3MgJiBQQ0lfSVJRX05PTEVHQUNZKSAmJiBtaW5fdmVjcyA9PSAxKQorCWlmICgoZmxhZ3MgJiBQQ0lfSVJRX0xFR0FDWSkgJiYgbWluX3ZlY3MgPT0gMSkgeworCQlwY2lfaW50eChkZXYsIDEpOwogCQlyZXR1cm4gMTsKKwl9CisKIAlyZXR1cm4gdmVjczsKIH0KIEVYUE9SVF9TWU1CT0wocGNpX2FsbG9jX2lycV92ZWN0b3JzKTsKQEAgLTEyNTQsNiArMTI3MSwzNyBAQAogfQogRVhQT1JUX1NZTUJPTChwY2lfaXJxX3ZlY3Rvcik7CiAKKy8qKgorICogcGNpX2lycV9nZXRfYWZmaW5pdHkgLSByZXR1cm4gdGhlIGFmZmluaXR5IG9mIGEgcGFydGljdWxhciBtc2kgdmVjdG9yCisgKiBAZGV2OglQQ0kgZGV2aWNlIHRvIG9wZXJhdGUgb24KKyAqIEBucjoJCWRldmljZS1yZWxhdGl2ZSBpbnRlcnJ1cHQgdmVjdG9yIGluZGV4ICgwLWJhc2VkKS4KKyAqLworY29uc3Qgc3RydWN0IGNwdW1hc2sgKnBjaV9pcnFfZ2V0X2FmZmluaXR5KHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBucikKK3sKKwlpZiAoZGV2LT5tc2l4X2VuYWJsZWQpIHsKKwkJc3RydWN0IG1zaV9kZXNjICplbnRyeTsKKwkJaW50IGkgPSAwOworCisJCWZvcl9lYWNoX3BjaV9tc2lfZW50cnkoZW50cnksIGRldikgeworCQkJaWYgKGkgPT0gbnIpCisJCQkJcmV0dXJuIGVudHJ5LT5hZmZpbml0eTsKKwkJCWkrKzsKKwkJfQorCQlXQVJOX09OX09OQ0UoMSk7CisJCXJldHVybiBOVUxMOworCX0gZWxzZSBpZiAoZGV2LT5tc2lfZW5hYmxlZCkgeworCQlzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5ID0gZmlyc3RfcGNpX21zaV9lbnRyeShkZXYpOworCisJCWlmIChXQVJOX09OX09OQ0UoIWVudHJ5IHx8IG5yID49IGVudHJ5LT5udmVjX3VzZWQpKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJcmV0dXJuICZlbnRyeS0+YWZmaW5pdHlbbnJdOworCX0gZWxzZSB7CisJCXJldHVybiBjcHVfcG9zc2libGVfbWFzazsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHBjaV9pcnFfZ2V0X2FmZmluaXR5KTsKKwogc3RydWN0IHBjaV9kZXYgKm1zaV9kZXNjX3RvX3BjaV9kZXYoc3RydWN0IG1zaV9kZXNjICpkZXNjKQogewogCXJldHVybiB0b19wY2lfZGV2KGRlc2MtPmRldik7CkBAIC0xNTAwLDggKzE1NDgsOCBAQAogCXBjaV9mb3JfZWFjaF9kbWFfYWxpYXMocGRldiwgZ2V0X21zaV9pZF9jYiwgJnJpZCk7CiAKIAlvZl9ub2RlID0gaXJxX2RvbWFpbl9nZXRfb2Zfbm9kZShkb21haW4pOwotCWlmIChvZl9ub2RlKQotCQlyaWQgPSBvZl9tc2lfbWFwX3JpZCgmcGRldi0+ZGV2LCBvZl9ub2RlLCByaWQpOworCXJpZCA9IG9mX25vZGUgPyBvZl9tc2lfbWFwX3JpZCgmcGRldi0+ZGV2LCBvZl9ub2RlLCByaWQpIDoKKwkJCWlvcnRfbXNpX21hcF9yaWQoJnBkZXYtPmRldiwgcmlkKTsKIAogCXJldHVybiByaWQ7CiB9CkBAIC0xNTE3LDkgKzE1NjUsMTMgQEAKICAqLwogc3RydWN0IGlycV9kb21haW4gKnBjaV9tc2lfZ2V0X2RldmljZV9kb21haW4oc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CisJc3RydWN0IGlycV9kb21haW4gKmRvbTsKIAl1MzIgcmlkID0gMDsKIAogCXBjaV9mb3JfZWFjaF9kbWFfYWxpYXMocGRldiwgZ2V0X21zaV9pZF9jYiwgJnJpZCk7Ci0JcmV0dXJuIG9mX21zaV9tYXBfZ2V0X2RldmljZV9kb21haW4oJnBkZXYtPmRldiwgcmlkKTsKKwlkb20gPSBvZl9tc2lfbWFwX2dldF9kZXZpY2VfZG9tYWluKCZwZGV2LT5kZXYsIHJpZCk7CisJaWYgKCFkb20pCisJCWRvbSA9IGlvcnRfZ2V0X2RldmljZV9kb21haW4oJnBkZXYtPmRldiwgcmlkKTsKKwlyZXR1cm4gZG9tOwogfQogI2VuZGlmIC8qIENPTkZJR19QQ0lfTVNJX0lSUV9ET01BSU4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS1taWQuYyBiL2RyaXZlcnMvcGNpL3BjaS1taWQuYwppbmRleCBjODc4YWE3Li41NWY0NTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktbWlkLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLW1pZC5jCkBAIC02MCw4ICs2MCwxMyBAQAogCiAjZGVmaW5lIElDUFUobW9kZWwpCXsgWDg2X1ZFTkRPUl9JTlRFTCwgNiwgbW9kZWwsIFg4Nl9GRUFUVVJFX0FOWSwgfQogCisvKgorICogVGhpcyB0YWJsZSBzaG91bGQgYmUgaW4gc3luYyB3aXRoIHRoZSBvbmUgaW4KKyAqIGFyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9wd3IuYy4KKyAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCB4ODZfY3B1X2lkIGxwc3NfY3B1X2lkc1tdID0gewotCUlDUFUoSU5URUxfRkFNNl9BVE9NX01FUlJJRklFTEQxKSwKKwlJQ1BVKElOVEVMX0ZBTTZfQVRPTV9QRU5XRUxMKSwKKwlJQ1BVKElOVEVMX0ZBTTZfQVRPTV9NRVJSSUZJRUxEKSwKIAl7fQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLmMgYi9kcml2ZXJzL3BjaS9wY2kuYwppbmRleCBhYWI5ZDUxLi40MTU5NTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2kuYworKysgYi9kcml2ZXJzL3BjaS9wY2kuYwpAQCAtNDgwLDYgKzQ4MCwzMCBAQAogRVhQT1JUX1NZTUJPTChwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2UpOwogCiAvKioKKyAqIHBjaV9maW5kX3Jlc291cmNlIC0gUmV0dXJuIG1hdGNoaW5nIFBDSSBkZXZpY2UgcmVzb3VyY2UKKyAqIEBkZXY6IFBDSSBkZXZpY2UgdG8gcXVlcnkKKyAqIEByZXM6IFJlc291cmNlIHRvIGxvb2sgZm9yCisgKgorICogR29lcyBvdmVyIHN0YW5kYXJkIFBDSSByZXNvdXJjZXMgKEJBUnMpIGFuZCBjaGVja3MgaWYgdGhlIGdpdmVuIHJlc291cmNlCisgKiBpcyBwYXJ0aWFsbHkgb3IgZnVsbHkgY29udGFpbmVkIGluIGFueSBvZiB0aGVtLiBJbiB0aGF0IGNhc2UgdGhlCisgKiBtYXRjaGluZyByZXNvdXJjZSBpcyByZXR1cm5lZCwgJU5VTEwgb3RoZXJ3aXNlLgorICovCitzdHJ1Y3QgcmVzb3VyY2UgKnBjaV9maW5kX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFBDSV9ST01fUkVTT1VSQ0U7IGkrKykgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSAmZGV2LT5yZXNvdXJjZVtpXTsKKworCQlpZiAoci0+c3RhcnQgJiYgcmVzb3VyY2VfY29udGFpbnMociwgcmVzKSkKKwkJCXJldHVybiByOworCX0KKworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChwY2lfZmluZF9yZXNvdXJjZSk7CisKKy8qKgogICogcGNpX2ZpbmRfcGNpZV9yb290X3BvcnQgLSByZXR1cm4gUENJZSBSb290IFBvcnQKICAqIEBkZXY6IFBDSSBkZXZpY2UgdG8gcXVlcnkKICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9xdWlya3MuYyBiL2RyaXZlcnMvcGNpL3F1aXJrcy5jCmluZGV4IDM3ZmYwMTUuLjQ0ZTBmZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jCisrKyBiL2RyaXZlcnMvcGNpL3F1aXJrcy5jCkBAIC0zMzI3LDkgKzMzMjcsOSBAQAogCWlmIChuaGktPnZlbmRvciAhPSBQQ0lfVkVORE9SX0lEX0lOVEVMCiAJCSAgICB8fCAobmhpLT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9JTlRFTF9MSUdIVF9SSURHRSAmJgogCQkJbmhpLT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9JTlRFTF9DQUNUVVNfUklER0VfNEMgJiYKKwkJCW5oaS0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfSU5URUxfRkFMQ09OX1JJREdFXzJDX05ISSAmJgogCQkJbmhpLT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9JTlRFTF9GQUxDT05fUklER0VfNENfTkhJKQotCQkgICAgfHwgbmhpLT5zdWJzeXN0ZW1fdmVuZG9yICE9IDB4MjIyMgotCQkgICAgfHwgbmhpLT5zdWJzeXN0ZW1fZGV2aWNlICE9IDB4MTExMSkKKwkJICAgIHx8IG5oaS0+Y2xhc3MgIT0gUENJX0NMQVNTX1NZU1RFTV9PVEhFUiA8PCA4KQogCQlnb3RvIG91dDsKIAlkZXZfaW5mbygmZGV2LT5kZXYsICJxdWlyazogd2FpdGluZyBmb3IgdGh1bmRlcmJvbHQgdG8gcmVlc3RhYmxpc2ggUENJIHR1bm5lbHMuLi5cbiIpOwogCWRldmljZV9wbV93YWl0X2Zvcl9kZXYoJmRldi0+ZGV2LCAmbmhpLT5kZXYpOwpAQCAtMzM0NCw2ICszMzQ0LDkgQEAKIAkJCSAgICAgICBQQ0lfREVWSUNFX0lEX0lOVEVMX0NBQ1RVU19SSURHRV80QywKIAkJCSAgICAgICBxdWlya19hcHBsZV93YWl0X2Zvcl90aHVuZGVyYm9sdCk7CiBERUNMQVJFX1BDSV9GSVhVUF9SRVNVTUVfRUFSTFkoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCSAgICAgICBQQ0lfREVWSUNFX0lEX0lOVEVMX0ZBTENPTl9SSURHRV8yQ19CUklER0UsCisJCQkgICAgICAgcXVpcmtfYXBwbGVfd2FpdF9mb3JfdGh1bmRlcmJvbHQpOworREVDTEFSRV9QQ0lfRklYVVBfUkVTVU1FX0VBUkxZKFBDSV9WRU5ET1JfSURfSU5URUwsCiAJCQkgICAgICAgUENJX0RFVklDRV9JRF9JTlRFTF9GQUxDT05fUklER0VfNENfQlJJREdFLAogCQkJICAgICAgIHF1aXJrX2FwcGxlX3dhaXRfZm9yX3RodW5kZXJib2x0KTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcmVtb3ZlLmMgYi9kcml2ZXJzL3BjaS9yZW1vdmUuYwppbmRleCBkMWVmN2FjLi5mOTM1N2UwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9yZW1vdmUuYworKysgYi9kcml2ZXJzL3BjaS9yZW1vdmUuYwpAQCAtNDAsNiArNDAsNyBAQAogCWxpc3RfZGVsKCZkZXYtPmJ1c19saXN0KTsKIAl1cF93cml0ZSgmcGNpX2J1c19zZW0pOwogCisJcGNpX2JyaWRnZV9kM19kZXZpY2VfcmVtb3ZlZChkZXYpOwogCXBjaV9mcmVlX3Jlc291cmNlcyhkZXYpOwogCXB1dF9kZXZpY2UoJmRldi0+ZGV2KTsKIH0KQEAgLTk2LDggKzk3LDYgQEAKIAkJZGV2LT5zdWJvcmRpbmF0ZSA9IE5VTEw7CiAJfQogCi0JcGNpX2JyaWRnZV9kM19kZXZpY2VfcmVtb3ZlZChkZXYpOwotCiAJcGNpX2Rlc3Ryb3lfZGV2KGRldik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jIGIvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKaW5kZXggYzc0MDU5ZS4uZjMwY2E3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKKysrIGIvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSAicGNpLmgiCiAKIHVuc2lnbmVkIGludCBwY2lfZmxhZ3M7CkBAIC0xODUyLDggKzE4NTMsMTMgQEAKIHsKIAlzdHJ1Y3QgcGNpX2J1cyAqcm9vdF9idXM7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJvb3RfYnVzLCAmcGNpX3Jvb3RfYnVzZXMsIG5vZGUpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyb290X2J1cywgJnBjaV9yb290X2J1c2VzLCBub2RlKSB7CiAJCXBjaV9hc3NpZ25fdW5hc3NpZ25lZF9yb290X2J1c19yZXNvdXJjZXMocm9vdF9idXMpOworCisJCS8qIE1ha2Ugc3VyZSB0aGUgcm9vdCBicmlkZ2UgaGFzIGEgY29tcGFuaW9uIEFDUEkgZGV2aWNlOiAqLworCQlpZiAoQUNQSV9IQU5ETEUocm9vdF9idXMtPmJyaWRnZSkpCisJCQlhY3BpX2lvYXBpY19hZGQoQUNQSV9IQU5ETEUocm9vdF9idXMtPmJyaWRnZSkpOworCX0KIH0KIAogdm9pZCBwY2lfYXNzaWduX3VuYXNzaWduZWRfYnJpZGdlX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqYnJpZGdlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvZHMuYyBiL2RyaXZlcnMvcGNtY2lhL2RzLmMKaW5kZXggNDg5ZWExMC4uNjliNWU4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvZHMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9kcy5jCkBAIC05NzcsNyArOTc3LDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKiBydW50aW1lIFBNIHN1cHBvcnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgaW50IHBjbWNpYV9kZXZfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CitzdGF0aWMgaW50IHBjbWNpYV9kZXZfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpOwogc3RhdGljIGludCBwY21jaWFfZGV2X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCiBzdGF0aWMgaW50IHJ1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCkBAIC05ODUsNyArOTg1LDcgQEAKIAlpbnQgcmM7CiAKIAlkZXZpY2VfbG9jayhkZXYpOwotCXJjID0gcGNtY2lhX2Rldl9zdXNwZW5kKGRldiwgUE1TR19TVVNQRU5EKTsKKwlyYyA9IHBjbWNpYV9kZXZfc3VzcGVuZChkZXYpOwogCWRldmljZV91bmxvY2soZGV2KTsKIAlyZXR1cm4gcmM7CiB9CkBAIC0xMTM1LDcgKzExMzUsNyBAQAogCiAvKiBQTSBzdXBwb3J0LCBhbHNvIG5lZWRlZCBmb3IgcmVzZXQgKi8KIAotc3RhdGljIGludCBwY21jaWFfZGV2X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCitzdGF0aWMgaW50IHBjbWNpYV9kZXZfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2ID0gdG9fcGNtY2lhX2RldihkZXYpOwogCXN0cnVjdCBwY21jaWFfZHJpdmVyICpwX2RydiA9IE5VTEw7CkBAIC0xNDEwLDYgKzE0MTAsOSBAQAogCS5yZW1vdmVfZGV2ID0gJnBjbWNpYV9idXNfcmVtb3ZlX3NvY2tldCwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBwY21jaWFfYnVzX3BtX29wcyA9IHsKKwlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhwY21jaWFfZGV2X3N1c3BlbmQsIHBjbWNpYV9kZXZfcmVzdW1lKQorfTsKIAogc3RydWN0IGJ1c190eXBlIHBjbWNpYV9idXNfdHlwZSA9IHsKIAkubmFtZSA9ICJwY21jaWEiLApAQCAtMTQxOCw4ICsxNDIxLDcgQEAKIAkuZGV2X2dyb3VwcyA9IHBjbWNpYV9kZXZfZ3JvdXBzLAogCS5wcm9iZSA9IHBjbWNpYV9kZXZpY2VfcHJvYmUsCiAJLnJlbW92ZSA9IHBjbWNpYV9kZXZpY2VfcmVtb3ZlLAotCS5zdXNwZW5kID0gcGNtY2lhX2Rldl9zdXNwZW5kLAotCS5yZXN1bWUgPSBwY21jaWFfZGV2X3Jlc3VtZSwKKwkucG0gPSAmcGNtY2lhX2J1c19wbV9vcHMsCiB9OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYXNlLmMgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfYmFzZS5jCmluZGV4IDQ4M2Y5MTkuLjkxYjVmNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYXNlLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuYwpAQCAtMjE0LDkgKzIxNCw4IEBACiB9CiAjZW5kaWYKIAotdm9pZCBweGEyeHhfY29uZmlndXJlX3NvY2tldHMoc3RydWN0IGRldmljZSAqZGV2KQordm9pZCBweGEyeHhfY29uZmlndXJlX3NvY2tldHMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGNtY2lhX2xvd19sZXZlbCAqb3BzKQogewotCXN0cnVjdCBwY21jaWFfbG93X2xldmVsICpvcHMgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CiAJLyoKIAkgKiBXZSBoYXZlIGF0IGxlYXN0IG9uZSBzb2NrZXQsIHNvIHNldCBNRUNSOkNJVAogCSAqIChDYXJkIElzIFRoZXJlKQpAQCAtMzIyLDcgKzMyMSw3IEBACiAJCQlnb3RvIGVycjE7CiAJfQogCi0JcHhhMnh4X2NvbmZpZ3VyZV9zb2NrZXRzKCZkZXYtPmRldik7CisJcHhhMnh4X2NvbmZpZ3VyZV9zb2NrZXRzKCZkZXYtPmRldiwgb3BzKTsKIAlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBzaW5mbyk7CiAKIAlyZXR1cm4gMDsKQEAgLTM0OCw3ICszNDcsOSBAQAogCiBzdGF0aWMgaW50IHB4YTJ4eF9kcnZfcGNtY2lhX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JcHhhMnh4X2NvbmZpZ3VyZV9zb2NrZXRzKGRldik7CisJc3RydWN0IHBjbWNpYV9sb3dfbGV2ZWwgKm9wcyA9IChzdHJ1Y3QgcGNtY2lhX2xvd19sZXZlbCAqKWRldi0+cGxhdGZvcm1fZGF0YTsKKworCXB4YTJ4eF9jb25maWd1cmVfc29ja2V0cyhkZXYsIG9wcyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYXNlLmggYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfYmFzZS5oCmluZGV4IGI2MDliNDUuLmU1OGM3YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYXNlLmgKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuaApAQCAtMSw0ICsxLDQgQEAKIGludCBweGEyeHhfZHJ2X3BjbWNpYV9hZGRfb25lKHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0KTsKIHZvaWQgcHhhMnh4X2Rydl9wY21jaWFfb3BzKHN0cnVjdCBwY21jaWFfbG93X2xldmVsICpvcHMpOwotdm9pZCBweGEyeHhfY29uZmlndXJlX3NvY2tldHMoc3RydWN0IGRldmljZSAqZGV2KTsKK3ZvaWQgcHhhMnh4X2NvbmZpZ3VyZV9zb2NrZXRzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBjbWNpYV9sb3dfbGV2ZWwgKm9wcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3NhMTExMV9iYWRnZTQuYyBiL2RyaXZlcnMvcGNtY2lhL3NhMTExMV9iYWRnZTQuYwppbmRleCAxMmYwZGQwLi4yZjQ5MDkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9zYTExMTFfYmFkZ2U0LmMKKysrIGIvZHJpdmVycy9wY21jaWEvc2ExMTExX2JhZGdlNC5jCkBAIC0xMzQsMjAgKzEzNCwxNCBAQAogCiBpbnQgcGNtY2lhX2JhZGdlNF9pbml0KHN0cnVjdCBzYTExMTFfZGV2ICpkZXYpCiB7Ci0JaW50IHJldCA9IC1FTk9ERVY7CisJcHJpbnRrKEtFUk5fSU5GTworCSAgICAgICAiJXM6IGJhZGdlNF9wY212Y2M9JWQsIGJhZGdlNF9wY212cHA9JWQsIGJhZGdlNF9jZnZjYz0lZFxuIiwKKwkgICAgICAgX19mdW5jX18sCisJICAgICAgIGJhZGdlNF9wY212Y2MsIGJhZGdlNF9wY212cHAsIGJhZGdlNF9jZnZjYyk7CiAKLQlpZiAobWFjaGluZV9pc19iYWRnZTQoKSkgewotCQlwcmludGsoS0VSTl9JTkZPCi0JCSAgICAgICAiJXM6IGJhZGdlNF9wY212Y2M9JWQsIGJhZGdlNF9wY212cHA9JWQsIGJhZGdlNF9jZnZjYz0lZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLAotCQkgICAgICAgYmFkZ2U0X3BjbXZjYywgYmFkZ2U0X3BjbXZwcCwgYmFkZ2U0X2NmdmNjKTsKLQotCQlzYTExeHhfZHJ2X3BjbWNpYV9vcHMoJmJhZGdlNF9wY21jaWFfb3BzKTsKLQkJcmV0ID0gc2ExMTExX3BjbWNpYV9hZGQoZGV2LCAmYmFkZ2U0X3BjbWNpYV9vcHMsCi0JCQkJc2ExMXh4X2Rydl9wY21jaWFfYWRkX29uZSk7Ci0JfQotCi0JcmV0dXJuIHJldDsKKwlzYTExeHhfZHJ2X3BjbWNpYV9vcHMoJmJhZGdlNF9wY21jaWFfb3BzKTsKKwlyZXR1cm4gc2ExMTExX3BjbWNpYV9hZGQoZGV2LCAmYmFkZ2U0X3BjbWNpYV9vcHMsCisJCQkJIHNhMTF4eF9kcnZfcGNtY2lhX2FkZF9vbmUpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBwY212X3NldHVwKGNoYXIgKnMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9zYTExMTFfZ2VuZXJpYy5jIGIvZHJpdmVycy9wY21jaWEvc2ExMTExX2dlbmVyaWMuYwppbmRleCBhMTUzMWZlLi4zZDk1ZGZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9zYTExMTFfZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3NhMTExMV9nZW5lcmljLmMKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvc2ExMTExLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKICNpbmNsdWRlICJzYTExMTFfZ2VuZXJpYy5oIgpAQCAtMjAzLDE5ICsyMDQsMzAgQEAKIAlzYTExMTFfd3JpdGVsKFBDU1NSX1MwX1NMRUVQIHwgUENTU1JfUzFfU0xFRVAsIGJhc2UgKyBQQ1NTUik7CiAJc2ExMTExX3dyaXRlbChQQ0NSX1MwX0ZMVCB8IFBDQ1JfUzFfRkxULCBiYXNlICsgUENDUik7CiAKKwlyZXQgPSAtRU5PREVWOwogI2lmZGVmIENPTkZJR19TQTExMDBfQkFER0U0Ci0JcGNtY2lhX2JhZGdlNF9pbml0KGRldik7CisJaWYgKG1hY2hpbmVfaXNfYmFkZ2U0KCkpCisJCXJldCA9IHBjbWNpYV9iYWRnZTRfaW5pdChkZXYpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1NBMTEwMF9KT1JOQURBNzIwCi0JcGNtY2lhX2pvcm5hZGE3MjBfaW5pdChkZXYpOworCWlmIChtYWNoaW5lX2lzX2pvcm5hZGE3MjAoKSkKKwkJcmV0ID0gcGNtY2lhX2pvcm5hZGE3MjBfaW5pdChkZXYpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0FSQ0hfTFVCQk9DSwotCXBjbWNpYV9sdWJib2NrX2luaXQoZGV2KTsKKwlpZiAobWFjaGluZV9pc19sdWJib2NrKCkpCisJCXJldCA9IHBjbWNpYV9sdWJib2NrX2luaXQoZGV2KTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19BU1NBQkVUX05FUE9OU0VUCi0JcGNtY2lhX25lcG9uc2V0X2luaXQoZGV2KTsKKwlpZiAobWFjaGluZV9pc19hc3NhYmV0KCkpCisJCXJldCA9IHBjbWNpYV9uZXBvbnNldF9pbml0KGRldik7CiAjZW5kaWYKLQlyZXR1cm4gMDsKKworCWlmIChyZXQpIHsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGRldi0+cmVzLnN0YXJ0LCA1MTIpOworCQlzYTExMTFfZGlzYWJsZV9kZXZpY2UoZGV2KTsKKwl9CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHBjbWNpYV9yZW1vdmUoc3RydWN0IHNhMTExMV9kZXYgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3NhMTExMV9qb3JuYWRhNzIwLmMgYi9kcml2ZXJzL3BjbWNpYS9zYTExMTFfam9ybmFkYTcyMC5jCmluZGV4IGMyYzMwNTguLjQ4MGEzZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3NhMTExMV9qb3JuYWRhNzIwLmMKKysrIGIvZHJpdmVycy9wY21jaWEvc2ExMTExX2pvcm5hZGE3MjAuYwpAQCAtOTQsMjIgKzk0LDE3IEBACiAKIGludCBwY21jaWFfam9ybmFkYTcyMF9pbml0KHN0cnVjdCBzYTExMTFfZGV2ICpzYWRldikKIHsKLQlpbnQgcmV0ID0gLUVOT0RFVjsKKwl1bnNpZ25lZCBpbnQgcGluID0gR1BJT19BMCB8IEdQSU9fQTEgfCBHUElPX0EyIHwgR1BJT19BMzsKIAotCWlmIChtYWNoaW5lX2lzX2pvcm5hZGE3MjAoKSkgewotCQl1bnNpZ25lZCBpbnQgcGluID0gR1BJT19BMCB8IEdQSU9fQTEgfCBHUElPX0EyIHwgR1BJT19BMzsKKwkvKiBGaXhtZTogd2h5IG1lc3NpbmcgYXJvdW5kIHdpdGggU0ExMXgwJ3MgR1BJTzE/ICovCisJR1JFUiB8PSAweDAwMDAwMDAyOwogCi0JCUdSRVIgfD0gMHgwMDAwMDAwMjsKKwkvKiBTZXQgR1BJT19BPDM6MT4gdG8gYmUgb3V0cHV0cyBmb3IgUENNQ0lBL0NGIHBvd2VyIGNvbnRyb2xsZXI6ICovCisJc2ExMTExX3NldF9pb19kaXIoc2FkZXYsIHBpbiwgMCwgMCk7CisJc2ExMTExX3NldF9pbyhzYWRldiwgcGluLCAwKTsKKwlzYTExMTFfc2V0X3NsZWVwX2lvKHNhZGV2LCBwaW4sIDApOwogCi0JCS8qIFNldCBHUElPX0E8MzoxPiB0byBiZSBvdXRwdXRzIGZvciBQQ01DSUEvQ0YgcG93ZXIgY29udHJvbGxlcjogKi8KLQkJc2ExMTExX3NldF9pb19kaXIoc2FkZXYsIHBpbiwgMCwgMCk7Ci0JCXNhMTExMV9zZXRfaW8oc2FkZXYsIHBpbiwgMCk7Ci0JCXNhMTExMV9zZXRfc2xlZXBfaW8oc2FkZXYsIHBpbiwgMCk7Ci0KLQkJc2ExMXh4X2Rydl9wY21jaWFfb3BzKCZqb3JuYWRhNzIwX3BjbWNpYV9vcHMpOwotCQlyZXQgPSBzYTExMTFfcGNtY2lhX2FkZChzYWRldiwgJmpvcm5hZGE3MjBfcGNtY2lhX29wcywKLQkJCQlzYTExeHhfZHJ2X3BjbWNpYV9hZGRfb25lKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OworCXNhMTF4eF9kcnZfcGNtY2lhX29wcygmam9ybmFkYTcyMF9wY21jaWFfb3BzKTsKKwlyZXR1cm4gc2ExMTExX3BjbWNpYV9hZGQoc2FkZXYsICZqb3JuYWRhNzIwX3BjbWNpYV9vcHMsCisJCQkJIHNhMTF4eF9kcnZfcGNtY2lhX2FkZF9vbmUpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvc2ExMTExX2x1YmJvY2suYyBiL2RyaXZlcnMvcGNtY2lhL3NhMTExMV9sdWJib2NrLmMKaW5kZXggYzVjYWY1Ny4uZTc0MWY0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvc2ExMTExX2x1YmJvY2suYworKysgYi9kcml2ZXJzL3BjbWNpYS9zYTExMTFfbHViYm9jay5jCkBAIC0yMTAsMjcgKzIxMCwyMSBAQAogCiBpbnQgcGNtY2lhX2x1YmJvY2tfaW5pdChzdHJ1Y3Qgc2ExMTExX2RldiAqc2FkZXYpCiB7Ci0JaW50IHJldCA9IC1FTk9ERVY7CisJLyoKKwkgKiBTZXQgR1BJT19BPDM6MD4gdG8gYmUgb3V0cHV0cyBmb3IgdGhlIE1BWDE2MDAsCisJICogYW5kIHN3aXRjaCB0byBzdGFuZGJ5IG1vZGUuCisJICovCisJc2ExMTExX3NldF9pb19kaXIoc2FkZXYsIEdQSU9fQTB8R1BJT19BMXxHUElPX0EyfEdQSU9fQTMsIDAsIDApOworCXNhMTExMV9zZXRfaW8oc2FkZXYsIEdQSU9fQTB8R1BJT19BMXxHUElPX0EyfEdQSU9fQTMsIDApOworCXNhMTExMV9zZXRfc2xlZXBfaW8oc2FkZXYsIEdQSU9fQTB8R1BJT19BMXxHUElPX0EyfEdQSU9fQTMsIDApOwogCi0JaWYgKG1hY2hpbmVfaXNfbHViYm9jaygpKSB7Ci0JCS8qCi0JCSAqIFNldCBHUElPX0E8MzowPiB0byBiZSBvdXRwdXRzIGZvciB0aGUgTUFYMTYwMCwKLQkJICogYW5kIHN3aXRjaCB0byBzdGFuZGJ5IG1vZGUuCi0JCSAqLwotCQlzYTExMTFfc2V0X2lvX2RpcihzYWRldiwgR1BJT19BMHxHUElPX0ExfEdQSU9fQTJ8R1BJT19BMywgMCwgMCk7Ci0JCXNhMTExMV9zZXRfaW8oc2FkZXYsIEdQSU9fQTB8R1BJT19BMXxHUElPX0EyfEdQSU9fQTMsIDApOwotCQlzYTExMTFfc2V0X3NsZWVwX2lvKHNhZGV2LCBHUElPX0EwfEdQSU9fQTF8R1BJT19BMnxHUElPX0EzLCAwKTsKKwkvKiBTZXQgQ0YgU29ja2V0IDEgcG93ZXIgdG8gc3RhbmRieSBtb2RlLiAqLworCWx1YmJvY2tfc2V0X21pc2Nfd3IoKDEgPDwgMTUpIHwgKDEgPDwgMTQpLCAwKTsKIAotCQkvKiBTZXQgQ0YgU29ja2V0IDEgcG93ZXIgdG8gc3RhbmRieSBtb2RlLiAqLwotCQlsdWJib2NrX3NldF9taXNjX3dyKCgxIDw8IDE1KSB8ICgxIDw8IDE0KSwgMCk7Ci0KLQkJcHhhMnh4X2Rydl9wY21jaWFfb3BzKCZsdWJib2NrX3BjbWNpYV9vcHMpOwotCQlweGEyeHhfY29uZmlndXJlX3NvY2tldHMoJnNhZGV2LT5kZXYpOwotCQlyZXQgPSBzYTExMTFfcGNtY2lhX2FkZChzYWRldiwgJmx1YmJvY2tfcGNtY2lhX29wcywKLQkJCQlweGEyeHhfZHJ2X3BjbWNpYV9hZGRfb25lKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OworCXB4YTJ4eF9kcnZfcGNtY2lhX29wcygmbHViYm9ja19wY21jaWFfb3BzKTsKKwlweGEyeHhfY29uZmlndXJlX3NvY2tldHMoJnNhZGV2LT5kZXYsICZsdWJib2NrX3BjbWNpYV9vcHMpOworCXJldHVybiBzYTExMTFfcGNtY2lhX2FkZChzYWRldiwgJmx1YmJvY2tfcGNtY2lhX29wcywKKwkJCQkgcHhhMnh4X2Rydl9wY21jaWFfYWRkX29uZSk7CiB9CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3NhMTExMV9uZXBvbnNldC5jIGIvZHJpdmVycy9wY21jaWEvc2ExMTExX25lcG9uc2V0LmMKaW5kZXggMWQ3ODczOS4uMDE5YzM5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvc2ExMTExX25lcG9uc2V0LmMKKysrIGIvZHJpdmVycy9wY21jaWEvc2ExMTExX25lcG9uc2V0LmMKQEAgLTExMCwyMCArMTEwLDE0IEBACiAKIGludCBwY21jaWFfbmVwb25zZXRfaW5pdChzdHJ1Y3Qgc2ExMTExX2RldiAqc2FkZXYpCiB7Ci0JaW50IHJldCA9IC1FTk9ERVY7Ci0KLQlpZiAobWFjaGluZV9pc19hc3NhYmV0KCkpIHsKLQkJLyoKLQkJICogU2V0IEdQSU9fQTwzOjA+IHRvIGJlIG91dHB1dHMgZm9yIHRoZSBNQVgxNjAwLAotCQkgKiBhbmQgc3dpdGNoIHRvIHN0YW5kYnkgbW9kZS4KLQkJICovCi0JCXNhMTExMV9zZXRfaW9fZGlyKHNhZGV2LCBHUElPX0EwfEdQSU9fQTF8R1BJT19BMnxHUElPX0EzLCAwLCAwKTsKLQkJc2ExMTExX3NldF9pbyhzYWRldiwgR1BJT19BMHxHUElPX0ExfEdQSU9fQTJ8R1BJT19BMywgMCk7Ci0JCXNhMTExMV9zZXRfc2xlZXBfaW8oc2FkZXYsIEdQSU9fQTB8R1BJT19BMXxHUElPX0EyfEdQSU9fQTMsIDApOwotCQlzYTExeHhfZHJ2X3BjbWNpYV9vcHMoJm5lcG9uc2V0X3BjbWNpYV9vcHMpOwotCQlyZXQgPSBzYTExMTFfcGNtY2lhX2FkZChzYWRldiwgJm5lcG9uc2V0X3BjbWNpYV9vcHMsCi0JCQkJc2ExMXh4X2Rydl9wY21jaWFfYWRkX29uZSk7Ci0JfQotCi0JcmV0dXJuIHJldDsKKwkvKgorCSAqIFNldCBHUElPX0E8MzowPiB0byBiZSBvdXRwdXRzIGZvciB0aGUgTUFYMTYwMCwKKwkgKiBhbmQgc3dpdGNoIHRvIHN0YW5kYnkgbW9kZS4KKwkgKi8KKwlzYTExMTFfc2V0X2lvX2RpcihzYWRldiwgR1BJT19BMHxHUElPX0ExfEdQSU9fQTJ8R1BJT19BMywgMCwgMCk7CisJc2ExMTExX3NldF9pbyhzYWRldiwgR1BJT19BMHxHUElPX0ExfEdQSU9fQTJ8R1BJT19BMywgMCk7CisJc2ExMTExX3NldF9zbGVlcF9pbyhzYWRldiwgR1BJT19BMHxHUElPX0ExfEdQSU9fQTJ8R1BJT19BMywgMCk7CisJc2ExMXh4X2Rydl9wY21jaWFfb3BzKCZuZXBvbnNldF9wY21jaWFfb3BzKTsKKwlyZXR1cm4gc2ExMTExX3BjbWNpYV9hZGQoc2FkZXYsICZuZXBvbnNldF9wY21jaWFfb3BzLAorCQkJCSBzYTExeHhfZHJ2X3BjbWNpYV9hZGRfb25lKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3NhMTF4eF9iYXNlLmMgYi9kcml2ZXJzL3BjbWNpYS9zYTExeHhfYmFzZS5jCmluZGV4IDlmNmVjODcuLjQ4MTQwYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3NhMTF4eF9iYXNlLmMKKysrIGIvZHJpdmVycy9wY21jaWEvc2ExMXh4X2Jhc2UuYwpAQCAtMTQ0LDE5ICsxNDQsMTkgQEAKIHNhMTEwMF9wY21jaWFfc2hvd190aW1pbmcoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3Qgc29jX3BjbWNpYV90aW1pbmcgdGltaW5nOwotCXVuc2lnbmVkIGludCBjbG9jayA9IGNsa19nZXRfcmF0ZShza3QtPmNsayk7CisJdW5zaWduZWQgaW50IGNsb2NrID0gY2xrX2dldF9yYXRlKHNrdC0+Y2xrKSAvIDEwMDA7CiAJdW5zaWduZWQgbG9uZyBtZWNyID0gTUVDUjsKIAljaGFyICpwID0gYnVmOwogCiAJc29jX2NvbW1vbl9wY21jaWFfZ2V0X3RpbWluZyhza3QsICZ0aW1pbmcpOwogCi0JcCs9c3ByaW50ZihwLCAiSS9PICAgICAgOiAldSAoJXUpXG4iLCB0aW1pbmcuaW8sCisJcCs9c3ByaW50ZihwLCAiSS9PICAgICAgOiAldW5zICgldW5zKVxuIiwgdGltaW5nLmlvLAogCQkgICBzYTExMDBfcGNtY2lhX2NtZF90aW1lKGNsb2NrLCBNRUNSX0JTSU9fR0VUKG1lY3IsIHNrdC0+bnIpKSk7CiAKLQlwKz1zcHJpbnRmKHAsICJhdHRyaWJ1dGU6ICV1ICgldSlcbiIsIHRpbWluZy5hdHRyLAorCXArPXNwcmludGYocCwgImF0dHJpYnV0ZTogJXVucyAoJXVucylcbiIsIHRpbWluZy5hdHRyLAogCQkgICBzYTExMDBfcGNtY2lhX2NtZF90aW1lKGNsb2NrLCBNRUNSX0JTQV9HRVQobWVjciwgc2t0LT5ucikpKTsKIAotCXArPXNwcmludGYocCwgImNvbW1vbiAgIDogJXUgKCV1KVxuIiwgdGltaW5nLm1lbSwKKwlwKz1zcHJpbnRmKHAsICJjb21tb24gICA6ICV1bnMgKCV1bnMpXG4iLCB0aW1pbmcubWVtLAogCQkgICBzYTExMDBfcGNtY2lhX2NtZF90aW1lKGNsb2NrLCBNRUNSX0JTTV9HRVQobWVjciwgc2t0LT5ucikpKTsKIAogCXJldHVybiBwIC0gYnVmOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvc29jX2NvbW1vbi5jIGIvZHJpdmVycy9wY21jaWEvc29jX2NvbW1vbi5jCmluZGV4IGVlZDVlOWMuLmQ1Y2E3NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3NvY19jb21tb24uYworKysgYi9kcml2ZXJzL3BjbWNpYS9zb2NfY29tbW9uLmMKQEAgLTIzNSw3ICsyMzUsNyBAQAogCXN0YXQgfD0gc2t0LT5jc19zdGF0ZS5WY2MgPyBTU19QT1dFUk9OIDogMDsKIAogCWlmIChza3QtPmNzX3N0YXRlLmZsYWdzICYgU1NfSU9DQVJEKQotCQlzdGF0IHw9IHN0YXRlLmJ2ZDEgPyBTU19TVFNDSEcgOiAwOworCQlzdGF0IHw9IHN0YXRlLmJ2ZDEgPyAwIDogU1NfU1RTQ0hHOwogCWVsc2UgewogCQlpZiAoc3RhdGUuYnZkMSA9PSAwKQogCQkJc3RhdCB8PSBTU19CQVRERUFEOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wZXJmL2FybV9wbXUuYyBiL2RyaXZlcnMvcGVyZi9hcm1fcG11LmMKaW5kZXggYzQ5NDYxMy4uYjM3YjU3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wZXJmL2FybV9wbXUuYworKysgYi9kcml2ZXJzL3BlcmYvYXJtX3BtdS5jCkBAIC01MzQsNiArNTM0LDI0IEBACiAJcmV0dXJuIGNwdW1hc2tfdGVzdF9jcHUoY3B1LCAmYXJtcG11LT5zdXBwb3J0ZWRfY3B1cyk7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IGFybXBtdV9jcHVtYXNrX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGFybV9wbXUgKmFybXBtdSA9IHRvX2FybV9wbXUoZGV2X2dldF9kcnZkYXRhKGRldikpOworCXJldHVybiBjcHVtYXBfcHJpbnRfdG9fcGFnZWJ1Zih0cnVlLCBidWYsICZhcm1wbXUtPnN1cHBvcnRlZF9jcHVzKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGNwdXMsIFNfSVJVR08sIGFybXBtdV9jcHVtYXNrX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYXJtcG11X2NvbW1vbl9hdHRyc1tdID0geworCSZkZXZfYXR0cl9jcHVzLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFybXBtdV9jb21tb25fYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSBhcm1wbXVfY29tbW9uX2F0dHJzLAorfTsKKwogc3RhdGljIHZvaWQgYXJtcG11X2luaXQoc3RydWN0IGFybV9wbXUgKmFybXBtdSkKIHsKIAlhdG9taWNfc2V0KCZhcm1wbXUtPmFjdGl2ZV9ldmVudHMsIDApOwpAQCAtNTQ5LDcgKzU2NywxMCBAQAogCQkuc3RvcAkJPSBhcm1wbXVfc3RvcCwKIAkJLnJlYWQJCT0gYXJtcG11X3JlYWQsCiAJCS5maWx0ZXJfbWF0Y2gJPSBhcm1wbXVfZmlsdGVyX21hdGNoLAorCQkuYXR0cl9ncm91cHMJPSBhcm1wbXUtPmF0dHJfZ3JvdXBzLAogCX07CisJYXJtcG11LT5hdHRyX2dyb3Vwc1tBUk1QTVVfQVRUUl9HUk9VUF9DT01NT05dID0KKwkJJmFybXBtdV9jb21tb25fYXR0cl9ncm91cDsKIH0KIAogLyogU2V0IGF0IHJ1bnRpbWUgd2hlbiB3ZSBrbm93IHdoYXQgQ1BVIHR5cGUgd2UgYXJlLiAqLwpAQCAtNjAyLDcgKzYyMyw3IEBACiAJaXJxcyA9IG1pbihwbXVfZGV2aWNlLT5udW1fcmVzb3VyY2VzLCBudW1fcG9zc2libGVfY3B1cygpKTsKIAogCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocG11X2RldmljZSwgMCk7Ci0JaWYgKGlycSA+PSAwICYmIGlycV9pc19wZXJjcHUoaXJxKSkgeworCWlmIChpcnEgPiAwICYmIGlycV9pc19wZXJjcHUoaXJxKSkgewogCQlvbl9lYWNoX2NwdV9tYXNrKCZjcHVfcG11LT5zdXBwb3J0ZWRfY3B1cywKIAkJCQkgY3B1X3BtdV9kaXNhYmxlX3BlcmNwdV9pcnEsICZpcnEsIDEpOwogCQlmcmVlX3BlcmNwdV9pcnEoaXJxLCAmaHdfZXZlbnRzLT5wZXJjcHVfcG11KTsKQEAgLTYxNiw3ICs2MzcsNyBAQAogCQkJaWYgKCFjcHVtYXNrX3Rlc3RfYW5kX2NsZWFyX2NwdShjcHUsICZjcHVfcG11LT5hY3RpdmVfaXJxcykpCiAJCQkJY29udGludWU7CiAJCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBtdV9kZXZpY2UsIGkpOwotCQkJaWYgKGlycSA+PSAwKQorCQkJaWYgKGlycSA+IDApCiAJCQkJZnJlZV9pcnEoaXJxLCBwZXJfY3B1X3B0cigmaHdfZXZlbnRzLT5wZXJjcHVfcG11LCBjcHUpKTsKIAkJfQogCX0KQEAgLTYzOCw3ICs2NTksNyBAQAogCX0KIAogCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocG11X2RldmljZSwgMCk7Ci0JaWYgKGlycSA+PSAwICYmIGlycV9pc19wZXJjcHUoaXJxKSkgeworCWlmIChpcnEgPiAwICYmIGlycV9pc19wZXJjcHUoaXJxKSkgewogCQllcnIgPSByZXF1ZXN0X3BlcmNwdV9pcnEoaXJxLCBoYW5kbGVyLCAiYXJtLXBtdSIsCiAJCQkJCSAmaHdfZXZlbnRzLT5wZXJjcHVfcG11KTsKIAkJaWYgKGVycikgewpAQCAtNjg4LDI4ICs3MDksMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIERFRklORV9TUElOTE9DSyhhcm1fcG11X2xvY2spOwotc3RhdGljIExJU1RfSEVBRChhcm1fcG11X2xpc3QpOwotCiAvKgogICogUE1VIGhhcmR3YXJlIGxvc2VzIGFsbCBjb250ZXh0IHdoZW4gYSBDUFUgZ29lcyBvZmZsaW5lLgogICogV2hlbiBhIENQVSBpcyBob3RwbHVnZ2VkIGJhY2sgaW4sIHNpbmNlIHNvbWUgaGFyZHdhcmUgcmVnaXN0ZXJzIGFyZQogICogVU5LTk9XTiBhdCByZXNldCwgdGhlIFBNVSBtdXN0IGJlIGV4cGxpY2l0bHkgcmVzZXQgdG8gYXZvaWQgcmVhZGluZwogICoganVuayB2YWx1ZXMgb3V0IG9mIHRoZW0uCiAgKi8KLXN0YXRpYyBpbnQgYXJtX3BlcmZfc3RhcnRpbmdfY3B1KHVuc2lnbmVkIGludCBjcHUpCitzdGF0aWMgaW50IGFybV9wZXJmX3N0YXJ0aW5nX2NwdSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSkKIHsKLQlzdHJ1Y3QgYXJtX3BtdSAqcG11OworCXN0cnVjdCBhcm1fcG11ICpwbXUgPSBobGlzdF9lbnRyeV9zYWZlKG5vZGUsIHN0cnVjdCBhcm1fcG11LCBub2RlKTsKIAotCXNwaW5fbG9jaygmYXJtX3BtdV9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBtdSwgJmFybV9wbXVfbGlzdCwgZW50cnkpIHsKLQotCQlpZiAoIWNwdW1hc2tfdGVzdF9jcHUoY3B1LCAmcG11LT5zdXBwb3J0ZWRfY3B1cykpCi0JCQljb250aW51ZTsKLQkJaWYgKHBtdS0+cmVzZXQpCi0JCQlwbXUtPnJlc2V0KHBtdSk7Ci0JfQotCXNwaW5fdW5sb2NrKCZhcm1fcG11X2xvY2spOworCWlmICghY3B1bWFza190ZXN0X2NwdShjcHUsICZwbXUtPnN1cHBvcnRlZF9jcHVzKSkKKwkJcmV0dXJuIDA7CisJaWYgKHBtdS0+cmVzZXQpCisJCXBtdS0+cmVzZXQocG11KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtODIxLDkgKzgzNCwxMCBAQAogCWlmICghY3B1X2h3X2V2ZW50cykKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzcGluX2xvY2soJmFybV9wbXVfbG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgmY3B1X3BtdS0+ZW50cnksICZhcm1fcG11X2xpc3QpOwotCXNwaW5fdW5sb2NrKCZhcm1fcG11X2xvY2spOworCWVyciA9IGNwdWhwX3N0YXRlX2FkZF9pbnN0YW5jZV9ub2NhbGxzKENQVUhQX0FQX1BFUkZfQVJNX1NUQVJUSU5HLAorCQkJCQkgICAgICAgJmNwdV9wbXUtPm5vZGUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZyZWU7CiAKIAllcnIgPSBjcHVfcG1fcG11X3JlZ2lzdGVyKGNwdV9wbXUpOwogCWlmIChlcnIpCkBAIC04NTksOSArODczLDkgQEAKIAlyZXR1cm4gMDsKIAogb3V0X3VucmVnaXN0ZXI6Ci0Jc3Bpbl9sb2NrKCZhcm1fcG11X2xvY2spOwotCWxpc3RfZGVsKCZjcHVfcG11LT5lbnRyeSk7Ci0Jc3Bpbl91bmxvY2soJmFybV9wbXVfbG9jayk7CisJY3B1aHBfc3RhdGVfcmVtb3ZlX2luc3RhbmNlX25vY2FsbHMoQ1BVSFBfQVBfUEVSRl9BUk1fU1RBUlRJTkcsCisJCQkJCSAgICAmY3B1X3BtdS0+bm9kZSk7CitvdXRfZnJlZToKIAlmcmVlX3BlcmNwdShjcHVfaHdfZXZlbnRzKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtODY5LDkgKzg4Myw4IEBACiBzdGF0aWMgdm9pZCBjcHVfcG11X2Rlc3Ryb3koc3RydWN0IGFybV9wbXUgKmNwdV9wbXUpCiB7CiAJY3B1X3BtX3BtdV91bnJlZ2lzdGVyKGNwdV9wbXUpOwotCXNwaW5fbG9jaygmYXJtX3BtdV9sb2NrKTsKLQlsaXN0X2RlbCgmY3B1X3BtdS0+ZW50cnkpOwotCXNwaW5fdW5sb2NrKCZhcm1fcG11X2xvY2spOworCWNwdWhwX3N0YXRlX3JlbW92ZV9pbnN0YW5jZV9ub2NhbGxzKENQVUhQX0FQX1BFUkZfQVJNX1NUQVJUSU5HLAorCQkJCQkgICAgJmNwdV9wbXUtPm5vZGUpOwogCWZyZWVfcGVyY3B1KGNwdV9wbXUtPmh3X2V2ZW50cyk7CiB9CiAKQEAgLTkxOSwxMiArOTMyLDEzIEBACiAKIAkJLyogQ2hlY2sgdGhlIElSUSB0eXBlIGFuZCBwcm9oaWJpdCBhIG1peCBvZiBQUElzIGFuZCBTUElzICovCiAJCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgaSk7Ci0JCWlmIChpcnEgPj0gMCkgeworCQlpZiAoaXJxID4gMCkgewogCQkJYm9vbCBzcGkgPSAhaXJxX2lzX3BlcmNwdShpcnEpOwogCiAJCQlpZiAoaSA+IDAgJiYgc3BpICE9IHVzaW5nX3NwaSkgewogCQkJCXByX2VycigiUFBJL1NQSSBJUlEgdHlwZSBtaXNtYXRjaCBmb3IgJXMhXG4iLAogCQkJCQlkbi0+bmFtZSk7CisJCQkJb2Zfbm9kZV9wdXQoZG4pOwogCQkJCWtmcmVlKGlycXMpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQpAQCAtOTY5LDcgKzk4Myw3IEBACiAJaWYgKGNwdW1hc2tfd2VpZ2h0KCZwbXUtPnN1cHBvcnRlZF9jcHVzKSA9PSAwKSB7CiAJCWludCBpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwogCi0JCWlmIChpcnFfaXNfcGVyY3B1KGlycSkpIHsKKwkJaWYgKGlycSA+IDAgJiYgaXJxX2lzX3BlcmNwdShpcnEpKSB7CiAJCQkvKiBJZiB1c2luZyBQUElzLCBjaGVjayB0aGUgYWZmaW5pdHkgb2YgdGhlIHBhcnRpdGlvbiAqLwogCQkJaW50IHJldDsKIApAQCAtMTAyOCw3ICsxMDQyLDcgQEAKIAkJcmV0ID0gb2ZfcG11X2lycV9jZmcocG11KTsKIAkJaWYgKCFyZXQpCiAJCQlyZXQgPSBpbml0X2ZuKHBtdSk7Ci0JfSBlbHNlIHsKKwl9IGVsc2UgaWYgKHByb2JlX3RhYmxlKSB7CiAJCWNwdW1hc2tfc2V0YWxsKCZwbXUtPnN1cHBvcnRlZF9jcHVzKTsKIAkJcmV0ID0gcHJvYmVfY3VycmVudF9wbXUocG11LCBwcm9iZV90YWJsZSk7CiAJfQpAQCAtMTAzOCw2ICsxMDUyLDcgQEAKIAkJZ290byBvdXRfZnJlZTsKIAl9CiAKKwogCXJldCA9IGNwdV9wbXVfaW5pdChwbXUpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0X2ZyZWU7CkBAIC0xMDY4LDkgKzEwODMsOSBAQAogewogCWludCByZXQ7CiAKLQlyZXQgPSBjcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX0FQX1BFUkZfQVJNX1NUQVJUSU5HLAotCQkJCQkiQVBfUEVSRl9BUk1fU1RBUlRJTkciLAotCQkJCQlhcm1fcGVyZl9zdGFydGluZ19jcHUsIE5VTEwpOworCXJldCA9IGNwdWhwX3NldHVwX3N0YXRlX211bHRpKENQVUhQX0FQX1BFUkZfQVJNX1NUQVJUSU5HLAorCQkJCSAgICAgICJBUF9QRVJGX0FSTV9TVEFSVElORyIsCisJCQkJICAgICAgYXJtX3BlcmZfc3RhcnRpbmdfY3B1LCBOVUxMKTsKIAlpZiAocmV0KQogCQlwcl9lcnIoIkNQVSBob3RwbHVnIG5vdGlmaWVyIGZvciBBUk0gUE1VIGNvdWxkIG5vdCBiZSByZWdpc3RlcmVkOiAlZFxuIiwKIAkJICAgICAgIHJldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9LY29uZmlnIGIvZHJpdmVycy9waHkvS2NvbmZpZwppbmRleCAxOWJmZjNhLi5mZTAwZjkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGh5L0tjb25maWcKQEAgLTI0LDYgKzI0LDE1IEBACiAJICBFbmFibGUgdGhpcyB0byBzdXBwb3J0IEJyb2FkY29tIFVTQiAyLjAgUEhZIGNvbm5lY3RlZCB0byB0aGUgVVNCCiAJICBjb250cm9sbGVyIG9uIE5vcnRoc3RhciBmYW1pbHkuCiAKK2NvbmZpZyBQSFlfQkNNX05TX1VTQjMKKwl0cmlzdGF0ZSAiQnJvYWRjb20gTm9ydGhzdGFyIFVTQiAzLjAgUEhZIERyaXZlciIKKwlkZXBlbmRzIG9uIEFSQ0hfQkNNX0lQUk9DIHx8IENPTVBJTEVfVEVTVAorCWRlcGVuZHMgb24gSEFTX0lPTUVNICYmIE9GCisJc2VsZWN0IEdFTkVSSUNfUEhZCisJaGVscAorCSAgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCBCcm9hZGNvbSBVU0IgMy4wIFBIWSBjb25uZWN0ZWQgdG8gdGhlIFVTQgorCSAgY29udHJvbGxlciBvbiBOb3J0aHN0YXIgZmFtaWx5LgorCiBjb25maWcgUEhZX0JFUkxJTl9VU0IKIAl0cmlzdGF0ZSAiTWFydmVsbCBCZXJsaW4gVVNCIFBIWSBEcml2ZXIiCiAJZGVwZW5kcyBvbiBBUkNIX0JFUkxJTiAmJiBSRVNFVF9DT05UUk9MTEVSICYmIEhBU19JT01FTSAmJiBPRgpAQCAtMjU4LDcgKzI2Nyw5IEBACiAJZGVwZW5kcyBvbiBSRVNFVF9DT05UUk9MTEVSCiAJZGVwZW5kcyBvbiBFWFRDT04KIAlkZXBlbmRzIG9uIFBPV0VSX1NVUFBMWQorCWRlcGVuZHMgb24gVVNCX1NVUFBPUlQKIAlzZWxlY3QgR0VORVJJQ19QSFkKKwlzZWxlY3QgVVNCX0NPTU1PTgogCWhlbHAKIAkgIEVuYWJsZSB0aGlzIHRvIHN1cHBvcnQgdGhlIHRyYW5zY2VpdmVyIHRoYXQgaXMgcGFydCBvZiBBbGx3aW5uZXIKIAkgIHN1bnhpIFNvQ3MuCkBAIC0zNTgsNiArMzY5LDE0IEBACiAJaGVscAogCSAgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCB0aGUgUm9ja2NoaXAgVVNCIDIuMCBQSFkuCiAKK2NvbmZpZyBQSFlfUk9DS0NISVBfSU5OT19VU0IyCisJdHJpc3RhdGUgIlJvY2tjaGlwIElOTk8gVVNCMlBIWSBEcml2ZXIiCisJZGVwZW5kcyBvbiAoQVJDSF9ST0NLQ0hJUCB8fCBDT01QSUxFX1RFU1QpICYmIE9GCisJZGVwZW5kcyBvbiBDT01NT05fQ0xLCisJc2VsZWN0IEdFTkVSSUNfUEhZCisJaGVscAorCSAgU3VwcG9ydCBmb3IgUm9ja2NoaXAgVVNCMi4wIFBIWSB3aXRoIElubm9zaWxpY29uIElQIGJsb2NrLgorCiBjb25maWcgUEhZX1JPQ0tDSElQX0VNTUMKIAl0cmlzdGF0ZSAiUm9ja2NoaXAgRU1NQyBQSFkgRHJpdmVyIgogCWRlcGVuZHMgb24gQVJDSF9ST0NLQ0hJUCAmJiBPRgpAQCAtMzcyLDYgKzM5MSwyMyBAQAogCWhlbHAKIAkgIEVuYWJsZSB0aGlzIHRvIHN1cHBvcnQgdGhlIFJvY2tjaGlwIERpc3BsYXkgUG9ydCBQSFkuCiAKK2NvbmZpZyBQSFlfUk9DS0NISVBfUENJRQorCXRyaXN0YXRlICJSb2NrY2hpcCBQQ0llIFBIWSBEcml2ZXIiCisJZGVwZW5kcyBvbiAoQVJDSF9ST0NLQ0hJUCAmJiBPRikgfHwgQ09NUElMRV9URVNUCisJc2VsZWN0IEdFTkVSSUNfUEhZCisJc2VsZWN0IE1GRF9TWVNDT04KKwloZWxwCisJICBFbmFibGUgdGhpcyB0byBzdXBwb3J0IHRoZSBSb2NrY2hpcCBQQ0llIFBIWS4KKworY29uZmlnIFBIWV9ST0NLQ0hJUF9UWVBFQworCXRyaXN0YXRlICJSb2NrY2hpcCBUWVBFQyBQSFkgRHJpdmVyIgorCWRlcGVuZHMgb24gT0YgJiYgKEFSQ0hfUk9DS0NISVAgfHwgQ09NUElMRV9URVNUKQorCXNlbGVjdCBFWFRDT04KKwlzZWxlY3QgR0VORVJJQ19QSFkKKwlzZWxlY3QgUkVTRVRfQ09OVFJPTExFUgorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIHRvIHN1cHBvcnQgdGhlIFJvY2tjaGlwIFVTQiBUWVBFQyBQSFkuCisKIGNvbmZpZyBQSFlfU1RfU1BFQVIxMzEwX01JUEhZCiAJdHJpc3RhdGUgIlNUIFNQRUFSMTMxMC1NSVBIWSBkcml2ZXIiCiAJc2VsZWN0IEdFTkVSSUNfUEhZCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9NYWtlZmlsZSBiL2RyaXZlcnMvcGh5L01ha2VmaWxlCmluZGV4IDkwYWUxOTguLmE1MzRjZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGh5L01ha2VmaWxlCkBAIC00LDYgKzQsNyBAQAogCiBvYmotJChDT05GSUdfR0VORVJJQ19QSFkpCQkrPSBwaHktY29yZS5vCiBvYmotJChDT05GSUdfUEhZX0JDTV9OU19VU0IyKQkJKz0gcGh5LWJjbS1ucy11c2IyLm8KK29iai0kKENPTkZJR19QSFlfQkNNX05TX1VTQjMpCQkrPSBwaHktYmNtLW5zLXVzYjMubwogb2JqLSQoQ09ORklHX1BIWV9CRVJMSU5fVVNCKQkJKz0gcGh5LWJlcmxpbi11c2Iubwogb2JqLSQoQ09ORklHX1BIWV9CRVJMSU5fU0FUQSkJCSs9IHBoeS1iZXJsaW4tc2F0YS5vCiBvYmotJChDT05GSUdfUEhZX0RBOFhYX1VTQikJCSs9IHBoeS1kYTh4eC11c2IubwpAQCAtMzksOCArNDAsMTEgQEAKIG9iai0kKENPTkZJR19QSFlfRVhZTk9TNV9VU0JEUkQpCSs9IHBoeS1leHlub3M1LXVzYmRyZC5vCiBvYmotJChDT05GSUdfUEhZX1FDT01fQVBRODA2NF9TQVRBKQkrPSBwaHktcWNvbS1hcHE4MDY0LXNhdGEubwogb2JqLSQoQ09ORklHX1BIWV9ST0NLQ0hJUF9VU0IpICs9IHBoeS1yb2NrY2hpcC11c2Iubworb2JqLSQoQ09ORklHX1BIWV9ST0NLQ0hJUF9JTk5PX1VTQjIpCSs9IHBoeS1yb2NrY2hpcC1pbm5vLXVzYjIubwogb2JqLSQoQ09ORklHX1BIWV9ST0NLQ0hJUF9FTU1DKSArPSBwaHktcm9ja2NoaXAtZW1tYy5vCitvYmotJChDT05GSUdfUEhZX1JPQ0tDSElQX1BDSUUpICs9IHBoeS1yb2NrY2hpcC1wY2llLm8KIG9iai0kKENPTkZJR19QSFlfUk9DS0NISVBfRFApCQkrPSBwaHktcm9ja2NoaXAtZHAubworb2JqLSQoQ09ORklHX1BIWV9ST0NLQ0hJUF9UWVBFQykgKz0gcGh5LXJvY2tjaGlwLXR5cGVjLm8KIG9iai0kKENPTkZJR19QSFlfUUNPTV9JUFE4MDZYX1NBVEEpCSs9IHBoeS1xY29tLWlwcTgwNngtc2F0YS5vCiBvYmotJChDT05GSUdfUEhZX1NUX1NQRUFSMTMxMF9NSVBIWSkJKz0gcGh5LXNwZWFyMTMxMC1taXBoeS5vCiBvYmotJChDT05GSUdfUEhZX1NUX1NQRUFSMTM0MF9NSVBIWSkJKz0gcGh5LXNwZWFyMTM0MC1taXBoeS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktYmNtLW5zLXVzYjMuYyBiL2RyaXZlcnMvcGh5L3BoeS1iY20tbnMtdXNiMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MjBmYTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BoeS9waHktYmNtLW5zLXVzYjMuYwpAQCAtMCwwICsxLDI3NCBAQAorLyoKKyAqIEJyb2FkY29tIE5vcnRoc3RhciBVU0IgMy4wIFBIWSBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgUmFmYcWCIE1pxYJlY2tpIDxyYWZhbEBtaWxlY2tpLnBsPgorICoKKyAqIEFsbCBtYWdpYyB2YWx1ZXMgdXNlZCBmb3IgaW5pdGlhbGl6YXRpb24gKGFuZCByZWxhdGVkIGNvbW1lbnRzKSB3ZXJlIG9idGFpbmVkCisgKiBmcm9tIEJyb2FkY29tJ3MgU0RLOgorICogQ29weXJpZ2h0IChjKSBCcm9hZGNvbSBDb3JwLCAyMDEyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYmNtYS9iY21hLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNkZWZpbmUgQkNNX05TX1VTQjNfTUlJX01OR19USU1FT1VUX1VTCTEwMDAJLyogdXNlY3MgKi8KKworZW51bSBiY21fbnNfZmFtaWx5IHsKKwlCQ01fTlNfVU5LTk9XTiwKKwlCQ01fTlNfQVgsCisJQkNNX05TX0JYLAorfTsKKworc3RydWN0IGJjbV9uc191c2IzIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJZW51bSBiY21fbnNfZmFtaWx5IGZhbWlseTsKKwl2b2lkIF9faW9tZW0gKmRtcDsKKwl2b2lkIF9faW9tZW0gKmNjYl9taWk7CisJc3RydWN0IHBoeSAqcGh5OworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYmNtX25zX3VzYjNfaWRfdGFibGVbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0gImJyY20sbnMtYXgtdXNiMy1waHkiLAorCQkuZGF0YSA9IChpbnQgKilCQ01fTlNfQVgsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gImJyY20sbnMtYngtdXNiMy1waHkiLAorCQkuZGF0YSA9IChpbnQgKilCQ01fTlNfQlgsCisJfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBiY21fbnNfdXNiM19pZF90YWJsZSk7CisKK3N0YXRpYyBpbnQgYmNtX25zX3VzYjNfd2FpdF9yZWcoc3RydWN0IGJjbV9uc191c2IzICp1c2IzLCB2b2lkIF9faW9tZW0gKmFkZHIsCisJCQkJdTMyIG1hc2ssIHUzMiB2YWx1ZSwgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQoreworCXVuc2lnbmVkIGxvbmcgZGVhZGxpbmUgPSBqaWZmaWVzICsgdGltZW91dDsKKwl1MzIgdmFsOworCisJZG8geworCQl2YWwgPSByZWFkbChhZGRyKTsKKwkJaWYgKCh2YWwgJiBtYXNrKSA9PSB2YWx1ZSkKKwkJCXJldHVybiAwOworCQljcHVfcmVsYXgoKTsKKwkJdWRlbGF5KDEwKTsKKwl9IHdoaWxlICghdGltZV9hZnRlcl9lcShqaWZmaWVzLCBkZWFkbGluZSkpOworCisJZGV2X2Vycih1c2IzLT5kZXYsICJUaW1lb3V0IHdhaXRpbmcgZm9yIHJlZ2lzdGVyICVwXG4iLCBhZGRyKTsKKworCXJldHVybiAtRUJVU1k7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGJjbV9uc191c2IzX21paV9tbmdfd2FpdF9pZGxlKHN0cnVjdCBiY21fbnNfdXNiMyAqdXNiMykKK3sKKwlyZXR1cm4gYmNtX25zX3VzYjNfd2FpdF9yZWcodXNiMywgdXNiMy0+Y2NiX21paSArIEJDTUFfQ0NCX01JSV9NTkdfQ1RMLAorCQkJCSAgICAweDAxMDAsIDB4MDAwMCwKKwkJCQkgICAgdXNlY3NfdG9famlmZmllcyhCQ01fTlNfVVNCM19NSUlfTU5HX1RJTUVPVVRfVVMpKTsKK30KKworc3RhdGljIGludCBiY21fbnNfdXNiM19taWlfbW5nX3dyaXRlMzIoc3RydWN0IGJjbV9uc191c2IzICp1c2IzLCB1MzIgdmFsdWUpCit7CisJaW50IGVycjsKKworCWVyciA9IGJjbV9uc191c2IzX21paV9tbmdfd2FpdF9pZGxlKHVzYjMpOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIodXNiMy0+ZGV2LCAiQ291bGRuJ3Qgd3JpdGUgMHglMDh4IHZhbHVlXG4iLCB2YWx1ZSk7CisJCXJldHVybiBlcnI7CisJfQorCisJd3JpdGVsKHZhbHVlLCB1c2IzLT5jY2JfbWlpICsgQkNNQV9DQ0JfTUlJX01OR19DTURfREFUQSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY21fbnNfdXNiM19waHlfaW5pdF9uc19ieChzdHJ1Y3QgYmNtX25zX3VzYjMgKnVzYjMpCit7CisJaW50IGVycjsKKworCS8qIEVuYWJsZSBNRElPLiBTZXR0aW5nIE1EQ0RJViBhcyAyNiAgKi8KKwl3cml0ZWwoMHgwMDAwMDA5YSwgdXNiMy0+Y2NiX21paSArIEJDTUFfQ0NCX01JSV9NTkdfQ1RMKTsKKworCS8qIFdhaXQgZm9yIE1ESU8/ICovCisJdWRlbGF5KDIpOworCisJLyogVVNCMyBQTEwgQmxvY2sgKi8KKwllcnIgPSBiY21fbnNfdXNiM19taWlfbW5nX3dyaXRlMzIodXNiMywgMHg1ODdlODAwMCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwkvKiBBc3NlcnQgQW5hX1BsbHNlcSBzdGFydCAqLworCWJjbV9uc191c2IzX21paV9tbmdfd3JpdGUzMih1c2IzLCAweDU4MDYxMDAwKTsKKworCS8qIEFzc2VydCBDTUwgRGl2aWRlciByYXRpbyB0byAyNiAqLworCWJjbV9uc191c2IzX21paV9tbmdfd3JpdGUzMih1c2IzLCAweDU4MmE2NDAwKTsKKworCS8qIEFzc2VydGluZyBQTEwgUmVzZXQgKi8KKwliY21fbnNfdXNiM19taWlfbW5nX3dyaXRlMzIodXNiMywgMHg1ODJlYzAwMCk7CisKKwkvKiBEZWFhc2VydGluZyBQTEwgUmVzZXQgKi8KKwliY21fbnNfdXNiM19taWlfbW5nX3dyaXRlMzIodXNiMywgMHg1ODJlODAwMCk7CisKKwkvKiBXYWl0aW5nIE1JSSBNZ3QgaW50ZXJmYWNlIGlkbGUgKi8KKwliY21fbnNfdXNiM19taWlfbW5nX3dhaXRfaWRsZSh1c2IzKTsKKworCS8qIERlYXNzZXJ0aW5nIFVTQjMgc3lzdGVtIHJlc2V0ICovCisJd3JpdGVsKDAsIHVzYjMtPmRtcCArIEJDTUFfUkVTRVRfQ1RMKTsKKworCS8qIFBMTCBmcmVxdWVuY3kgbW9uaXRvciBlbmFibGUgKi8KKwliY21fbnNfdXNiM19taWlfbW5nX3dyaXRlMzIodXNiMywgMHg1ODA2OTAwMCk7CisKKwkvKiBQSVBFIEJsb2NrICovCisJYmNtX25zX3VzYjNfbWlpX21uZ193cml0ZTMyKHVzYjMsIDB4NTg3ZTgwNjApOworCisJLyogQ01QTUFYICYgQ01QTUlOVEggc2V0dGluZyAqLworCWJjbV9uc191c2IzX21paV9tbmdfd3JpdGUzMih1c2IzLCAweDU4MGFmMzBkKTsKKworCS8qIERFR0xJVENIIE1JTiAmIE1BWCBzZXR0aW5nICovCisJYmNtX25zX3VzYjNfbWlpX21uZ193cml0ZTMyKHVzYjMsIDB4NTgwZTYzMDIpOworCisJLyogVFhQTUQgYmxvY2sgKi8KKwliY21fbnNfdXNiM19taWlfbW5nX3dyaXRlMzIodXNiMywgMHg1ODdlODA0MCk7CisKKwkvKiBFbmFibGluZyBTU0MgKi8KKwliY21fbnNfdXNiM19taWlfbW5nX3dyaXRlMzIodXNiMywgMHg1ODA2MTAwMyk7CisKKwkvKiBXYWl0aW5nIE1JSSBNZ3QgaW50ZXJmYWNlIGlkbGUgKi8KKwliY21fbnNfdXNiM19taWlfbW5nX3dhaXRfaWRsZSh1c2IzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbV9uc191c2IzX3BoeV9pbml0X25zX2F4KHN0cnVjdCBiY21fbnNfdXNiMyAqdXNiMykKK3sKKwlpbnQgZXJyOworCisJLyogRW5hYmxlIE1ESU8uIFNldHRpbmcgTURDRElWIGFzIDI2ICAqLworCXdyaXRlbCgweDAwMDAwMDlhLCB1c2IzLT5jY2JfbWlpICsgQkNNQV9DQ0JfTUlJX01OR19DVEwpOworCisJLyogV2FpdCBmb3IgTURJTz8gKi8KKwl1ZGVsYXkoMik7CisKKwkvKiBQTEwzMCBibG9jayAqLworCWVyciA9IGJjbV9uc191c2IzX21paV9tbmdfd3JpdGUzMih1c2IzLCAweDU4N2U4MDAwKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWJjbV9uc191c2IzX21paV9tbmdfd3JpdGUzMih1c2IzLCAweDU4MmE2NDAwKTsKKworCWJjbV9uc191c2IzX21paV9tbmdfd3JpdGUzMih1c2IzLCAweDU4N2U4MGUwKTsKKworCWJjbV9uc191c2IzX21paV9tbmdfd3JpdGUzMih1c2IzLCAweDU4MGEwMDljKTsKKworCS8qIEVuYWJsZSBTU0MgKi8KKwliY21fbnNfdXNiM19taWlfbW5nX3dyaXRlMzIodXNiMywgMHg1ODdlODA0MCk7CisKKwliY21fbnNfdXNiM19taWlfbW5nX3dyaXRlMzIodXNiMywgMHg1ODBhMjFkMyk7CisKKwliY21fbnNfdXNiM19taWlfbW5nX3dyaXRlMzIodXNiMywgMHg1ODA2MTAwMyk7CisKKwkvKiBXYWl0aW5nIE1JSSBNZ3QgaW50ZXJmYWNlIGlkbGUgKi8KKwliY21fbnNfdXNiM19taWlfbW5nX3dhaXRfaWRsZSh1c2IzKTsKKworCS8qIERlYXNzZXJ0aW5nIFVTQjMgc3lzdGVtIHJlc2V0ICovCisJd3JpdGVsKDAsIHVzYjMtPmRtcCArIEJDTUFfUkVTRVRfQ1RMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbV9uc191c2IzX3BoeV9pbml0KHN0cnVjdCBwaHkgKnBoeSkKK3sKKwlzdHJ1Y3QgYmNtX25zX3VzYjMgKnVzYjMgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKKwlpbnQgZXJyOworCisJLyogUGVyZm9ybSBVU0IzIHN5c3RlbSBzb2Z0IHJlc2V0ICovCisJd3JpdGVsKEJDTUFfUkVTRVRfQ1RMX1JFU0VULCB1c2IzLT5kbXAgKyBCQ01BX1JFU0VUX0NUTCk7CisKKwlzd2l0Y2ggKHVzYjMtPmZhbWlseSkgeworCWNhc2UgQkNNX05TX0FYOgorCQllcnIgPSBiY21fbnNfdXNiM19waHlfaW5pdF9uc19heCh1c2IzKTsKKwkJYnJlYWs7CisJY2FzZSBCQ01fTlNfQlg6CisJCWVyciA9IGJjbV9uc191c2IzX3BoeV9pbml0X25zX2J4KHVzYjMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlXQVJOX09OKDEpOworCQllcnIgPSAtRU5PVFNVUFA7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwaHlfb3BzIG9wcyA9IHsKKwkuaW5pdAkJPSBiY21fbnNfdXNiM19waHlfaW5pdCwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IGJjbV9uc191c2IzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZDsKKwlzdHJ1Y3QgYmNtX25zX3VzYjMgKnVzYjM7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IHBoeV9wcm92aWRlciAqcGh5X3Byb3ZpZGVyOworCisJdXNiMyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqdXNiMyksIEdGUF9LRVJORUwpOworCWlmICghdXNiMykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl1c2IzLT5kZXYgPSBkZXY7CisKKwlvZl9pZCA9IG9mX21hdGNoX2RldmljZShiY21fbnNfdXNiM19pZF90YWJsZSwgZGV2KTsKKwlpZiAoIW9mX2lkKQorCQlyZXR1cm4gLUVJTlZBTDsKKwl1c2IzLT5mYW1pbHkgPSAoZW51bSBiY21fbnNfZmFtaWx5KW9mX2lkLT5kYXRhOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgImRtcCIpOworCXVzYjMtPmRtcCA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CisJaWYgKElTX0VSUih1c2IzLT5kbXApKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIG1hcCBETVAgcmVnc1xuIik7CisJCXJldHVybiBQVFJfRVJSKHVzYjMtPmRtcCk7CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgImNjYi1taWkiKTsKKwl1c2IzLT5jY2JfbWlpID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHVzYjMtPmNjYl9taWkpKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIG1hcCBDaGlwQ29tbW9uIEIgTUlJIHJlZ3NcbiIpOworCQlyZXR1cm4gUFRSX0VSUih1c2IzLT5jY2JfbWlpKTsKKwl9CisKKwl1c2IzLT5waHkgPSBkZXZtX3BoeV9jcmVhdGUoZGV2LCBOVUxMLCAmb3BzKTsKKwlpZiAoSVNfRVJSKHVzYjMtPnBoeSkpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gY3JlYXRlIFBIWVxuIik7CisJCXJldHVybiBQVFJfRVJSKHVzYjMtPnBoeSk7CisJfQorCisJcGh5X3NldF9kcnZkYXRhKHVzYjMtPnBoeSwgdXNiMyk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgdXNiMyk7CisKKwlwaHlfcHJvdmlkZXIgPSBkZXZtX29mX3BoeV9wcm92aWRlcl9yZWdpc3RlcihkZXYsIG9mX3BoeV9zaW1wbGVfeGxhdGUpOworCWlmICghSVNfRVJSKHBoeV9wcm92aWRlcikpCisJCWRldl9pbmZvKGRldiwgIlJlZ2lzdGVyZWQgQnJvYWRjb20gTm9ydGhzdGFyIFVTQiAzLjAgUEhZIGRyaXZlclxuIik7CisKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKHBoeV9wcm92aWRlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJjbV9uc191c2IzX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gYmNtX25zX3VzYjNfcHJvYmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYmNtX25zX3VzYjMiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBiY21fbnNfdXNiM19pZF90YWJsZSwKKwl9LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYmNtX25zX3VzYjNfZHJpdmVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LWJjbS1uczItcGNpZS5jIGIvZHJpdmVycy9waHkvcGh5LWJjbS1uczItcGNpZS5jCmluZGV4IDk1MTNmN2EuLjRjN2QxMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3BoeS1iY20tbnMyLXBjaWUuYworKysgYi9kcml2ZXJzL3BoeS9waHktYmNtLW5zMi1wY2llLmMKQEAgLTE4LDExICsxOCw2IEBACiAjaW5jbHVkZSA8bGludXgvcGh5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgogCi1zdHJ1Y3QgbnMyX3BjaV9waHkgewotCXN0cnVjdCBtZGlvX2RldmljZSAqbWRpb2RldjsKLQlzdHJ1Y3QgcGh5ICpwaHk7Ci19OwotCiAjZGVmaW5lIEJMS19BRERSX1JFR19PRkZTRVQJMHgxZgogI2RlZmluZSBQTExfQUZFMV8xMDBNSFpfQkxLCTB4MjEwMAogI2RlZmluZSBQTExfQ0xLX0FNUF9PRkZTRVQJMHgwMwpAQCAtMzAsMTcgKzI1LDE3IEBACiAKIHN0YXRpYyBpbnQgbnMyX3BjaV9waHlfaW5pdChzdHJ1Y3QgcGh5ICpwKQogewotCXN0cnVjdCBuczJfcGNpX3BoeSAqcGh5ID0gcGh5X2dldF9kcnZkYXRhKHApOworCXN0cnVjdCBtZGlvX2RldmljZSAqbWRpb2RldiA9IHBoeV9nZXRfZHJ2ZGF0YShwKTsKIAlpbnQgcmM7CiAKIAkvKiBzZWxlY3QgdGhlIEFGRSAxMDBNSHogYmxvY2sgcGFnZSAqLwotCXJjID0gbWRpb2J1c193cml0ZShwaHktPm1kaW9kZXYtPmJ1cywgcGh5LT5tZGlvZGV2LT5hZGRyLAorCXJjID0gbWRpb2J1c193cml0ZShtZGlvZGV2LT5idXMsIG1kaW9kZXYtPmFkZHIsCiAJCQkgICBCTEtfQUREUl9SRUdfT0ZGU0VULCBQTExfQUZFMV8xMDBNSFpfQkxLKTsKIAlpZiAocmMpCiAJCWdvdG8gZXJyOwogCiAJLyogc2V0IHRoZSAxMDAgTUh6IHJlZmVyZW5jZSBjbG9jayBhbXBsaXR1ZGUgdG8gMi4wNSB2ICovCi0JcmMgPSBtZGlvYnVzX3dyaXRlKHBoeS0+bWRpb2Rldi0+YnVzLCBwaHktPm1kaW9kZXYtPmFkZHIsCisJcmMgPSBtZGlvYnVzX3dyaXRlKG1kaW9kZXYtPmJ1cywgbWRpb2Rldi0+YWRkciwKIAkJCSAgIFBMTF9DTEtfQU1QX09GRlNFVCwgUExMX0NMS19BTVBfMlAwNVYpOwogCWlmIChyYykKIAkJZ290byBlcnI7CkBAIC00OCwxOSArNDMsMTkgQEAKIAlyZXR1cm4gMDsKIAogZXJyOgotCWRldl9lcnIoJnBoeS0+bWRpb2Rldi0+ZGV2LCAiRXJyb3IgJWQgd3JpdGluZyB0byBwaHlcbiIsIHJjKTsKKwlkZXZfZXJyKCZtZGlvZGV2LT5kZXYsICJFcnJvciAlZCB3cml0aW5nIHRvIHBoeVxuIiwgcmMpOwogCXJldHVybiByYzsKIH0KIAotc3RhdGljIHN0cnVjdCBwaHlfb3BzIG5zMl9wY2lfcGh5X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGh5X29wcyBuczJfcGNpX3BoeV9vcHMgPSB7CiAJLmluaXQgPSBuczJfcGNpX3BoeV9pbml0LAorCS5vd25lciA9IFRISVNfTU9EVUxFLAogfTsKIAogc3RhdGljIGludCBuczJfcGNpX3BoeV9wcm9iZShzdHJ1Y3QgbWRpb19kZXZpY2UgKm1kaW9kZXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJm1kaW9kZXYtPmRldjsKIAlzdHJ1Y3QgcGh5X3Byb3ZpZGVyICpwcm92aWRlcjsKLQlzdHJ1Y3QgbnMyX3BjaV9waHkgKnA7CiAJc3RydWN0IHBoeSAqcGh5OwogCiAJcGh5ID0gZGV2bV9waHlfY3JlYXRlKGRldiwgZGV2LT5vZl9ub2RlLCAmbnMyX3BjaV9waHlfb3BzKTsKQEAgLTY5LDE2ICs2NCw3IEBACiAJCXJldHVybiBQVFJfRVJSKHBoeSk7CiAJfQogCi0JcCA9IGRldm1fa21hbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgbnMyX3BjaV9waHkpLAotCQkJIEdGUF9LRVJORUwpOwotCWlmICghcCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwLT5tZGlvZGV2ID0gbWRpb2RldjsKLQlkZXZfc2V0X2RydmRhdGEoZGV2LCBwKTsKLQotCXAtPnBoeSA9IHBoeTsKLQlwaHlfc2V0X2RydmRhdGEocGh5LCBwKTsKKwlwaHlfc2V0X2RydmRhdGEocGh5LCBtZGlvZGV2KTsKIAogCXByb3ZpZGVyID0gZGV2bV9vZl9waHlfcHJvdmlkZXJfcmVnaXN0ZXIoJnBoeS0+ZGV2LAogCQkJCQkJIG9mX3BoeV9zaW1wbGVfeGxhdGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LWJyY20tc2F0YS5jIGIvZHJpdmVycy9waHkvcGh5LWJyY20tc2F0YS5jCmluZGV4IDE4ZDY2MjYuLjhmZmM0NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3BoeS1icmNtLXNhdGEuYworKysgYi9kcml2ZXJzL3BoeS9waHktYnJjbS1zYXRhLmMKQEAgLTM2Nyw3ICszNjcsNyBAQAogCQlyYyA9IC1FTk9ERVY7CiAJfTsKIAotCXJldHVybiAwOworCXJldHVybiByYzsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwaHlfb3BzIHBoeV9vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktY29yZS5jIGIvZHJpdmVycy9waHkvcGh5LWNvcmUuYwppbmRleCA4ZWNhOTA2Li5hMjY4ZjRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9waHktY29yZS5jCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1jb3JlLmMKQEAgLTM1Nyw2ICszNTcsMjEgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBoeV9zZXRfbW9kZSk7CiAKK2ludCBwaHlfcmVzZXQoc3RydWN0IHBoeSAqcGh5KQoreworCWludCByZXQ7CisKKwlpZiAoIXBoeSB8fCAhcGh5LT5vcHMtPnJlc2V0KQorCQlyZXR1cm4gMDsKKworCW11dGV4X2xvY2soJnBoeS0+bXV0ZXgpOworCXJldCA9IHBoeS0+b3BzLT5yZXNldChwaHkpOworCW11dGV4X3VubG9jaygmcGh5LT5tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwocGh5X3Jlc2V0KTsKKwogLyoqCiAgKiBfb2ZfcGh5X2dldCgpIC0gbG9va3VwIGFuZCBvYnRhaW4gYSByZWZlcmVuY2UgdG8gYSBwaHkgYnkgcGhhbmRsZQogICogQG5wOiBkZXZpY2Vfbm9kZSBmb3Igd2hpY2ggdG8gZ2V0IHRoZSBwaHkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1kYTh4eC11c2IuYyBiL2RyaXZlcnMvcGh5L3BoeS1kYTh4eC11c2IuYwppbmRleCBiMmU1OWI2Li4zMmFlNzhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9waHktZGE4eHgtdXNiLmMKKysrIGIvZHJpdmVycy9waHkvcGh5LWRhOHh4LXVzYi5jCkBAIC0xNTQsNyArMTU0LDcgQEAKIAkJZF9waHktPnJlZ21hcCA9IHN5c2Nvbl9yZWdtYXBfbG9va3VwX2J5X2NvbXBhdGlibGUoCiAJCQkJCQkJInRpLGRhODMwLWNmZ2NoaXAiKTsKIAllbHNlCi0JCWRfcGh5LT5yZWdtYXAgPSBzeXNjb25fcmVnbWFwX2xvb2t1cF9ieV9wZGV2bmFtZSgic3lzY29uLjAiKTsKKwkJZF9waHktPnJlZ21hcCA9IHN5c2Nvbl9yZWdtYXBfbG9va3VwX2J5X3BkZXZuYW1lKCJzeXNjb24iKTsKIAlpZiAoSVNfRVJSKGRfcGh5LT5yZWdtYXApKSB7CiAJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGdldCBzeXNjb25cbiIpOwogCQlyZXR1cm4gUFRSX0VSUihkX3BoeS0+cmVnbWFwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1leHlub3M1LXVzYmRyZC5jIGIvZHJpdmVycy9waHkvcGh5LWV4eW5vczUtdXNiZHJkLmMKaW5kZXggMjA2OTZmNS4uMDdlZDYwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvcGh5LWV4eW5vczUtdXNiZHJkLmMKKysrIGIvZHJpdmVycy9waHkvcGh5LWV4eW5vczUtdXNiZHJkLmMKQEAgLTI0OSw3ICsyNDksNyBAQAogc3RhdGljIHVuc2lnbmVkIGludAogZXh5bm9zNV91c2JkcmRfcGlwZTNfc2V0X3JlZmNsayhzdHJ1Y3QgcGh5X3VzYl9pbnN0YW5jZSAqaW5zdCkKIHsKLQlzdGF0aWMgdTMyIHJlZzsKKwl1MzIgcmVnOwogCXN0cnVjdCBleHlub3M1X3VzYmRyZF9waHkgKnBoeV9kcmQgPSB0b191c2JkcmRfcGh5KGluc3QpOwogCiAJLyogcmVzdG9yZSBhbnkgcHJldmlvdXMgcmVmZXJlbmNlIGNsb2NrIHNldHRpbmdzICovCkBAIC0yOTUsNyArMjk1LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKIGV4eW5vczVfdXNiZHJkX3V0bWlfc2V0X3JlZmNsayhzdHJ1Y3QgcGh5X3VzYl9pbnN0YW5jZSAqaW5zdCkKIHsKLQlzdGF0aWMgdTMyIHJlZzsKKwl1MzIgcmVnOwogCXN0cnVjdCBleHlub3M1X3VzYmRyZF9waHkgKnBoeV9kcmQgPSB0b191c2JkcmRfcGh5KGluc3QpOwogCiAJLyogcmVzdG9yZSBhbnkgcHJldmlvdXMgcmVmZXJlbmNlIGNsb2NrIHNldHRpbmdzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktb21hcC11c2IyLmMgYi9kcml2ZXJzL3BoeS9waHktb21hcC11c2IyLmMKaW5kZXggYzEzNDk4OS4uZmU5MDlmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvcGh5LW9tYXAtdXNiMi5jCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1vbWFwLXVzYjIuYwpAQCAtMTMzLDExICsxMzMsNDkgQEAKIAlyZXR1cm4gb21hcF91c2JfcGh5X3Bvd2VyKHBoeSwgdHJ1ZSk7CiB9CiAKK3N0YXRpYyBpbnQgb21hcF91c2IyX2Rpc2FibGVfY2xvY2tzKHN0cnVjdCBvbWFwX3VzYiAqcGh5KQoreworCWNsa19kaXNhYmxlKHBoeS0+d2t1cGNsayk7CisJaWYgKCFJU19FUlIocGh5LT5vcHRjbGspKQorCQljbGtfZGlzYWJsZShwaHktPm9wdGNsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbWFwX3VzYjJfZW5hYmxlX2Nsb2NrcyhzdHJ1Y3Qgb21hcF91c2IgKnBoeSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gY2xrX2VuYWJsZShwaHktPndrdXBjbGspOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocGh5LT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIHdrdXBjbGsgJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyMDsKKwl9CisKKwlpZiAoIUlTX0VSUihwaHktPm9wdGNsaykpIHsKKwkJcmV0ID0gY2xrX2VuYWJsZShwaHktPm9wdGNsayk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKHBoeS0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBvcHRjbGsgJWRcbiIsIHJldCk7CisJCQlnb3RvIGVycjE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworZXJyMToKKwljbGtfZGlzYWJsZShwaHktPndrdXBjbGspOworCitlcnIwOgorCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgb21hcF91c2JfaW5pdChzdHJ1Y3QgcGh5ICp4KQogewogCXN0cnVjdCBvbWFwX3VzYiAqcGh5ID0gcGh5X2dldF9kcnZkYXRhKHgpOwogCXUzMiB2YWw7CiAKKwlvbWFwX3VzYjJfZW5hYmxlX2Nsb2NrcyhwaHkpOworCiAJaWYgKHBoeS0+ZmxhZ3MgJiBPTUFQX1VTQjJfQ0FMSUJSQVRFX0ZBTFNFX0RJU0NPTk5FQ1QpIHsKIAkJLyoKIAkJICoKQEAgLTE1NSw4ICsxOTMsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBvbWFwX3VzYl9leGl0KHN0cnVjdCBwaHkgKngpCit7CisJc3RydWN0IG9tYXBfdXNiICpwaHkgPSBwaHlfZ2V0X2RydmRhdGEoeCk7CisKKwlyZXR1cm4gb21hcF91c2IyX2Rpc2FibGVfY2xvY2tzKHBoeSk7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGh5X29wcyBvcHMgPSB7CiAJLmluaXQJCT0gb21hcF91c2JfaW5pdCwKKwkuZXhpdAkJPSBvbWFwX3VzYl9leGl0LAogCS5wb3dlcl9vbgk9IG9tYXBfdXNiX3Bvd2VyX29uLAogCS5wb3dlcl9vZmYJPSBvbWFwX3VzYl9wb3dlcl9vZmYsCiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLApAQCAtMzc2LDY1ICs0MjIsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19QTQotCi1zdGF0aWMgaW50IG9tYXBfdXNiMl9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKLQlzdHJ1Y3Qgb21hcF91c2IJKnBoeSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JY2xrX2Rpc2FibGUocGh5LT53a3VwY2xrKTsKLQlpZiAoIUlTX0VSUihwaHktPm9wdGNsaykpCi0JCWNsa19kaXNhYmxlKHBoeS0+b3B0Y2xrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG9tYXBfdXNiMl9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwotCXN0cnVjdCBvbWFwX3VzYgkqcGh5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0JaW50IHJldDsKLQotCXJldCA9IGNsa19lbmFibGUocGh5LT53a3VwY2xrKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHBoeS0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSB3a3VwY2xrICVkXG4iLCByZXQpOwotCQlnb3RvIGVycjA7Ci0JfQotCi0JaWYgKCFJU19FUlIocGh5LT5vcHRjbGspKSB7Ci0JCXJldCA9IGNsa19lbmFibGUocGh5LT5vcHRjbGspOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycihwaHktPmRldiwgIkZhaWxlZCB0byBlbmFibGUgb3B0Y2xrICVkXG4iLCByZXQpOwotCQkJZ290byBlcnIxOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWVycjE6Ci0JY2xrX2Rpc2FibGUocGh5LT53a3VwY2xrKTsKLQotZXJyMDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgb21hcF91c2IyX3BtX29wcyA9IHsKLQlTRVRfUlVOVElNRV9QTV9PUFMob21hcF91c2IyX3J1bnRpbWVfc3VzcGVuZCwgb21hcF91c2IyX3J1bnRpbWVfcmVzdW1lLAotCQlOVUxMKQotfTsKLQotI2RlZmluZSBERVZfUE1fT1BTICAgICAoJm9tYXBfdXNiMl9wbV9vcHMpCi0jZWxzZQotI2RlZmluZSBERVZfUE1fT1BTICAgICBOVUxMCi0jZW5kaWYKLQogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb21hcF91c2IyX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gb21hcF91c2IyX3Byb2JlLAogCS5yZW1vdmUJCT0gb21hcF91c2IyX3JlbW92ZSwKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAib21hcC11c2IyIiwKLQkJLnBtCT0gREVWX1BNX09QUywKIAkJLm9mX21hdGNoX3RhYmxlID0gb21hcF91c2IyX2lkX3RhYmxlLAogCX0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LXFjb20tdWZzLmMgYi9kcml2ZXJzL3BoeS9waHktcWNvbS11ZnMuYwppbmRleCAxMDdjYjU3Li4xOGE1YjQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9waHktcWNvbS11ZnMuYworKysgYi9kcml2ZXJzL3BoeS9waHktcWNvbS11ZnMuYwpAQCAtMjgzLDEwICsyODMsOCBAQAogCQkJZXJyID0gMDsKIAkJfQogCQlzbnByaW50Zihwcm9wX25hbWUsIE1BWF9QUk9QX05BTUUsICIlcy1hbHdheXMtb24iLCBuYW1lKTsKLQkJaWYgKG9mX2dldF9wcm9wZXJ0eShkZXYtPm9mX25vZGUsIHByb3BfbmFtZSwgTlVMTCkpCi0JCQl2cmVnLT5pc19hbHdheXNfb24gPSB0cnVlOwotCQllbHNlCi0JCQl2cmVnLT5pc19hbHdheXNfb24gPSBmYWxzZTsKKwkJdnJlZy0+aXNfYWx3YXlzX29uID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+b2Zfbm9kZSwKKwkJCQkJCQkgICBwcm9wX25hbWUpOwogCX0KIAogCWlmICghc3RyY21wKG5hbWUsICJ2ZGRhLXBsbCIpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktcmNhci1nZW4zLXVzYjIuYyBiL2RyaXZlcnMvcGh5L3BoeS1yY2FyLWdlbjMtdXNiMi5jCmluZGV4IDMxMTU2YzkuLjNkOTdlYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3BoeS1yY2FyLWdlbjMtdXNiMi5jCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1yY2FyLWdlbjMtdXNiMi5jCkBAIC0yODAsNiArMjgwLDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcmNhcl9nZW4zX3BoeV91c2IyX21hdGNoX3RhYmxlW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHVzYjItcGh5LXI4YTc3OTUiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHVzYjItcGh5LXI4YTc3OTYiIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHJjYXItZ2VuMy11c2IyLXBoeSIgfSwKIAl7IH0KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktcm9ja2NoaXAtaW5uby11c2IyLmMgYi9kcml2ZXJzL3BoeS9waHktcm9ja2NoaXAtaW5uby11c2IyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMyMDMxMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1yb2NrY2hpcC1pbm5vLXVzYjIuYwpAQCAtMCwwICsxLDcwNyBAQAorLyoKKyAqIFJvY2tjaGlwIFVTQjIuMCBQSFkgd2l0aCBJbm5vc2lsaWNvbiBJUCBibG9jayBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgRnV6aG91IFJvY2tjaGlwIEVsZWN0cm9uaWNzIENvLiwgTHRkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9zeXNjb24uaD4KKworI2RlZmluZSBCSVRfV1JJVEVBQkxFX1NISUZUCTE2CisjZGVmaW5lIFNDSEVEVUxFX0RFTEFZCSg2MCAqIEhaKQorCitlbnVtIHJvY2tjaGlwX3VzYjJwaHlfcG9ydF9pZCB7CisJVVNCMlBIWV9QT1JUX09URywKKwlVU0IyUEhZX1BPUlRfSE9TVCwKKwlVU0IyUEhZX05VTV9QT1JUUywKK307CisKK2VudW0gcm9ja2NoaXBfdXNiMnBoeV9ob3N0X3N0YXRlIHsKKwlQSFlfU1RBVEVfSFNfT05MSU5FCT0gMCwKKwlQSFlfU1RBVEVfRElTQ09OTkVDVAk9IDEsCisJUEhZX1NUQVRFX0NPTk5FQ1QJPSAyLAorCVBIWV9TVEFURV9GU19MU19PTkxJTkUJPSA0LAorfTsKKworc3RydWN0IHVzYjJwaHlfcmVnIHsKKwl1bnNpZ25lZCBpbnQJb2Zmc2V0OworCXVuc2lnbmVkIGludAliaXRlbmQ7CisJdW5zaWduZWQgaW50CWJpdHN0YXJ0OworCXVuc2lnbmVkIGludAlkaXNhYmxlOworCXVuc2lnbmVkIGludAllbmFibGU7Cit9OworCisvKioKKyAqIHN0cnVjdCByb2NrY2hpcF91c2IycGh5X3BvcnRfY2ZnOiB1c2ItcGh5IHBvcnQgY29uZmlndXJhdGlvbi4KKyAqIEBwaHlfc3VzOiBwaHkgc3VzcGVuZCByZWdpc3Rlci4KKyAqIEBsc19kZXRfZW46IGxpbmVzdGF0ZSBkZXRlY3Rpb24gZW5hYmxlIHJlZ2lzdGVyLgorICogQGxzX2RldF9zdDogbGluZXN0YXRlIGRldGVjdGlvbiBzdGF0ZSByZWdpc3Rlci4KKyAqIEBsc19kZXRfY2xyOiBsaW5lc3RhdGUgZGV0ZWN0aW9uIGNsZWFyIHJlZ2lzdGVyLgorICogQHV0bWlfbHM6IHV0bWkgbGluZXN0YXRlIHN0YXRlIHJlZ2lzdGVyLgorICogQHV0bWlfaHN0ZGV0OiB1dG1pIGhvc3QgZGlzY29ubmVjdCByZWdpc3Rlci4KKyAqLworc3RydWN0IHJvY2tjaGlwX3VzYjJwaHlfcG9ydF9jZmcgeworCXN0cnVjdCB1c2IycGh5X3JlZwlwaHlfc3VzOworCXN0cnVjdCB1c2IycGh5X3JlZwlsc19kZXRfZW47CisJc3RydWN0IHVzYjJwaHlfcmVnCWxzX2RldF9zdDsKKwlzdHJ1Y3QgdXNiMnBoeV9yZWcJbHNfZGV0X2NscjsKKwlzdHJ1Y3QgdXNiMnBoeV9yZWcJdXRtaV9sczsKKwlzdHJ1Y3QgdXNiMnBoeV9yZWcJdXRtaV9oc3RkZXQ7Cit9OworCisvKioKKyAqIHN0cnVjdCByb2NrY2hpcF91c2IycGh5X2NmZzogdXNiLXBoeSBjb25maWd1cmF0aW9uLgorICogQHJlZzogdGhlIGFkZHJlc3Mgb2Zmc2V0IG9mIGdyZiBmb3IgdXNiLXBoeSBjb25maWcuCisgKiBAbnVtX3BvcnRzOiBzcGVjaWZ5IGhvdyBtYW55IHBvcnRzIHRoYXQgdGhlIHBoeSBoYXMuCisgKiBAY2xrb3V0X2N0bDoga2VlcCBvbi90dXJuIG9mZiBvdXRwdXQgY2xrIG9mIHBoeS4KKyAqLworc3RydWN0IHJvY2tjaGlwX3VzYjJwaHlfY2ZnIHsKKwl1bnNpZ25lZCBpbnQJcmVnOworCXVuc2lnbmVkIGludAludW1fcG9ydHM7CisJc3RydWN0IHVzYjJwaHlfcmVnCWNsa291dF9jdGw7CisJY29uc3Qgc3RydWN0IHJvY2tjaGlwX3VzYjJwaHlfcG9ydF9jZmcJcG9ydF9jZmdzW1VTQjJQSFlfTlVNX1BPUlRTXTsKK307CisKKy8qKgorICogc3RydWN0IHJvY2tjaGlwX3VzYjJwaHlfcG9ydDogdXNiLXBoeSBwb3J0IGRhdGEuCisgKiBAcG9ydF9pZDogZmxhZyBmb3Igb3RnIHBvcnQgb3IgaG9zdCBwb3J0LgorICogQHN1c3BlbmRlZDogcGh5IHN1c3BlbmRlZCBmbGFnLgorICogQGxzX2lycTogSVJRIG51bWJlciBhc3NpZ25lZCBmb3IgbGluZXN0YXRlIGRldGVjdGlvbi4KKyAqIEBtdXRleDogZm9yIHJlZ2lzdGVyIHVwZGF0aW5nIGluIHNtX3dvcmsuCisgKiBAc21fd29yazogT1RHIHN0YXRlIG1hY2hpbmUgd29yay4KKyAqIEBwaHlfY2ZnOiBwb3J0IHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24sIGFzc2lnbmVkIGJ5IGRyaXZlciBkYXRhLgorICovCitzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeV9wb3J0IHsKKwlzdHJ1Y3QgcGh5CSpwaHk7CisJdW5zaWduZWQgaW50CXBvcnRfaWQ7CisJYm9vbAkJc3VzcGVuZGVkOworCWludAkJbHNfaXJxOworCXN0cnVjdCBtdXRleAltdXRleDsKKwlzdHJ1Y3QJCWRlbGF5ZWRfd29yayBzbV93b3JrOworCWNvbnN0IHN0cnVjdAlyb2NrY2hpcF91c2IycGh5X3BvcnRfY2ZnICpwb3J0X2NmZzsKK307CisKKy8qKgorICogc3RydWN0IHJvY2tjaGlwX3VzYjJwaHk6IHVzYjIuMCBwaHkgZHJpdmVyIGRhdGEuCisgKiBAZ3JmOiBHZW5lcmFsIFJlZ2lzdGVyIEZpbGVzIHJlZ21hcC4KKyAqIEBjbGs6IGNsb2NrIHN0cnVjdCBvZiBwaHkgaW5wdXQgY2xrLgorICogQGNsazQ4MG06IGNsb2NrIHN0cnVjdCBvZiBwaHkgb3V0cHV0IGNsay4KKyAqIEBjbGtfaHc6IGNsb2NrIHN0cnVjdCBvZiBwaHkgb3V0cHV0IGNsayBtYW5hZ2VtZW50LgorICogQHBoeV9jZmc6IHBoeSByZWdpc3RlciBjb25maWd1cmF0aW9uLCBhc3NpZ25lZCBieSBkcml2ZXIgZGF0YS4KKyAqIEBwb3J0czogcGh5IHBvcnQgaW5zdGFuY2UuCisgKi8KK3N0cnVjdCByb2NrY2hpcF91c2IycGh5IHsKKwlzdHJ1Y3QgZGV2aWNlCSpkZXY7CisJc3RydWN0IHJlZ21hcAkqZ3JmOworCXN0cnVjdCBjbGsJKmNsazsKKwlzdHJ1Y3QgY2xrCSpjbGs0ODBtOworCXN0cnVjdCBjbGtfaHcJY2xrNDgwbV9odzsKKwljb25zdCBzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeV9jZmcJKnBoeV9jZmc7CisJc3RydWN0IHJvY2tjaGlwX3VzYjJwaHlfcG9ydAlwb3J0c1tVU0IyUEhZX05VTV9QT1JUU107Cit9OworCitzdGF0aWMgaW5saW5lIGludCBwcm9wZXJ0eV9lbmFibGUoc3RydWN0IHJvY2tjaGlwX3VzYjJwaHkgKnJwaHksCisJCQkJICBjb25zdCBzdHJ1Y3QgdXNiMnBoeV9yZWcgKnJlZywgYm9vbCBlbikKK3sKKwl1bnNpZ25lZCBpbnQgdmFsLCBtYXNrLCB0bXA7CisKKwl0bXAgPSBlbiA/IHJlZy0+ZW5hYmxlIDogcmVnLT5kaXNhYmxlOworCW1hc2sgPSBHRU5NQVNLKHJlZy0+Yml0ZW5kLCByZWctPmJpdHN0YXJ0KTsKKwl2YWwgPSAodG1wIDw8IHJlZy0+Yml0c3RhcnQpIHwgKG1hc2sgPDwgQklUX1dSSVRFQUJMRV9TSElGVCk7CisKKwlyZXR1cm4gcmVnbWFwX3dyaXRlKHJwaHktPmdyZiwgcmVnLT5vZmZzZXQsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBwcm9wZXJ0eV9lbmFibGVkKHN0cnVjdCByb2NrY2hpcF91c2IycGh5ICpycGh5LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgdXNiMnBoeV9yZWcgKnJlZykKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCB0bXAsIG9yaWc7CisJdW5zaWduZWQgaW50IG1hc2sgPSBHRU5NQVNLKHJlZy0+Yml0ZW5kLCByZWctPmJpdHN0YXJ0KTsKKworCXJldCA9IHJlZ21hcF9yZWFkKHJwaHktPmdyZiwgcmVnLT5vZmZzZXQsICZvcmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gZmFsc2U7CisKKwl0bXAgPSAob3JpZyAmIG1hc2spID4+IHJlZy0+Yml0c3RhcnQ7CisJcmV0dXJuIHRtcCA9PSByZWctPmVuYWJsZTsKK30KKworc3RhdGljIGludCByb2NrY2hpcF91c2IycGh5X2NsazQ4MG1fZW5hYmxlKHN0cnVjdCBjbGtfaHcgKmh3KQoreworCXN0cnVjdCByb2NrY2hpcF91c2IycGh5ICpycGh5ID0KKwkJY29udGFpbmVyX29mKGh3LCBzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeSwgY2xrNDgwbV9odyk7CisJaW50IHJldDsKKworCS8qIHR1cm4gb24gNDgwbSBjbGsgb3V0cHV0IGlmIGl0IGlzIG9mZiAqLworCWlmICghcHJvcGVydHlfZW5hYmxlZChycGh5LCAmcnBoeS0+cGh5X2NmZy0+Y2xrb3V0X2N0bCkpIHsKKwkJcmV0ID0gcHJvcGVydHlfZW5hYmxlKHJwaHksICZycGh5LT5waHlfY2ZnLT5jbGtvdXRfY3RsLCB0cnVlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJLyogd2FpdHRpbmcgZm9yIHRoZSBjbGsgYmVjb21lIHN0YWJsZSAqLworCQltZGVsYXkoMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJvY2tjaGlwX3VzYjJwaHlfY2xrNDgwbV9kaXNhYmxlKHN0cnVjdCBjbGtfaHcgKmh3KQoreworCXN0cnVjdCByb2NrY2hpcF91c2IycGh5ICpycGh5ID0KKwkJY29udGFpbmVyX29mKGh3LCBzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeSwgY2xrNDgwbV9odyk7CisKKwkvKiB0dXJuIG9mZiA0ODBtIGNsayBvdXRwdXQgKi8KKwlwcm9wZXJ0eV9lbmFibGUocnBoeSwgJnJwaHktPnBoeV9jZmctPmNsa291dF9jdGwsIGZhbHNlKTsKK30KKworc3RhdGljIGludCByb2NrY2hpcF91c2IycGh5X2NsazQ4MG1fZW5hYmxlZChzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeSAqcnBoeSA9CisJCWNvbnRhaW5lcl9vZihodywgc3RydWN0IHJvY2tjaGlwX3VzYjJwaHksIGNsazQ4MG1faHcpOworCisJcmV0dXJuIHByb3BlcnR5X2VuYWJsZWQocnBoeSwgJnJwaHktPnBoeV9jZmctPmNsa291dF9jdGwpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZworcm9ja2NoaXBfdXNiMnBoeV9jbGs0ODBtX3JlY2FsY19yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSkKK3sKKwlyZXR1cm4gNDgwMDAwMDAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgcm9ja2NoaXBfdXNiMnBoeV9jbGtvdXRfb3BzID0geworCS5lbmFibGUgPSByb2NrY2hpcF91c2IycGh5X2NsazQ4MG1fZW5hYmxlLAorCS5kaXNhYmxlID0gcm9ja2NoaXBfdXNiMnBoeV9jbGs0ODBtX2Rpc2FibGUsCisJLmlzX2VuYWJsZWQgPSByb2NrY2hpcF91c2IycGh5X2NsazQ4MG1fZW5hYmxlZCwKKwkucmVjYWxjX3JhdGUgPSByb2NrY2hpcF91c2IycGh5X2NsazQ4MG1fcmVjYWxjX3JhdGUsCit9OworCitzdGF0aWMgdm9pZCByb2NrY2hpcF91c2IycGh5X2NsazQ4MG1fdW5yZWdpc3Rlcih2b2lkICpkYXRhKQoreworCXN0cnVjdCByb2NrY2hpcF91c2IycGh5ICpycGh5ID0gZGF0YTsKKworCW9mX2Nsa19kZWxfcHJvdmlkZXIocnBoeS0+ZGV2LT5vZl9ub2RlKTsKKwljbGtfdW5yZWdpc3RlcihycGh5LT5jbGs0ODBtKTsKK30KKworc3RhdGljIGludAorcm9ja2NoaXBfdXNiMnBoeV9jbGs0ODBtX3JlZ2lzdGVyKHN0cnVjdCByb2NrY2hpcF91c2IycGh5ICpycGh5KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IHJwaHktPmRldi0+b2Zfbm9kZTsKKwlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OworCWNvbnN0IGNoYXIgKmNsa19uYW1lOworCWludCByZXQ7CisKKwlpbml0LmZsYWdzID0gMDsKKwlpbml0Lm5hbWUgPSAiY2xrX3VzYnBoeV80ODBtIjsKKwlpbml0Lm9wcyA9ICZyb2NrY2hpcF91c2IycGh5X2Nsa291dF9vcHM7CisKKwkvKiBvcHRpb25hbCBvdmVycmlkZSBvZiB0aGUgY2xvY2tuYW1lICovCisJb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobm9kZSwgImNsb2NrLW91dHB1dC1uYW1lcyIsICZpbml0Lm5hbWUpOworCisJaWYgKHJwaHktPmNsaykgeworCQljbGtfbmFtZSA9IF9fY2xrX2dldF9uYW1lKHJwaHktPmNsayk7CisJCWluaXQucGFyZW50X25hbWVzID0gJmNsa19uYW1lOworCQlpbml0Lm51bV9wYXJlbnRzID0gMTsKKwl9IGVsc2UgeworCQlpbml0LnBhcmVudF9uYW1lcyA9IE5VTEw7CisJCWluaXQubnVtX3BhcmVudHMgPSAwOworCX0KKworCXJwaHktPmNsazQ4MG1faHcuaW5pdCA9ICZpbml0OworCisJLyogcmVnaXN0ZXIgdGhlIGNsb2NrICovCisJcnBoeS0+Y2xrNDgwbSA9IGNsa19yZWdpc3RlcihycGh5LT5kZXYsICZycGh5LT5jbGs0ODBtX2h3KTsKKwlpZiAoSVNfRVJSKHJwaHktPmNsazQ4MG0pKSB7CisJCXJldCA9IFBUUl9FUlIocnBoeS0+Y2xrNDgwbSk7CisJCWdvdG8gZXJyX3JldDsKKwl9CisKKwlyZXQgPSBvZl9jbGtfYWRkX3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgcnBoeS0+Y2xrNDgwbSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX2Nsa19wcm92aWRlcjsKKworCXJldCA9IGRldm1fYWRkX2FjdGlvbihycGh5LT5kZXYsIHJvY2tjaGlwX3VzYjJwaHlfY2xrNDgwbV91bnJlZ2lzdGVyLAorCQkJICAgICAgcnBoeSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3VucmVnX2FjdGlvbjsKKworCXJldHVybiAwOworCitlcnJfdW5yZWdfYWN0aW9uOgorCW9mX2Nsa19kZWxfcHJvdmlkZXIobm9kZSk7CitlcnJfY2xrX3Byb3ZpZGVyOgorCWNsa191bnJlZ2lzdGVyKHJwaHktPmNsazQ4MG0pOworZXJyX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX3VzYjJwaHlfaW5pdChzdHJ1Y3QgcGh5ICpwaHkpCit7CisJc3RydWN0IHJvY2tjaGlwX3VzYjJwaHlfcG9ydCAqcnBvcnQgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKKwlzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeSAqcnBoeSA9IGRldl9nZXRfZHJ2ZGF0YShwaHktPmRldi5wYXJlbnQpOworCWludCByZXQ7CisKKwlpZiAocnBvcnQtPnBvcnRfaWQgPT0gVVNCMlBIWV9QT1JUX0hPU1QpIHsKKwkJLyogY2xlYXIgbGluZXN0YXRlIGFuZCBlbmFibGUgbGluZXN0YXRlIGRldGVjdCBpcnEgKi8KKwkJbXV0ZXhfbG9jaygmcnBvcnQtPm11dGV4KTsKKworCQlyZXQgPSBwcm9wZXJ0eV9lbmFibGUocnBoeSwgJnJwb3J0LT5wb3J0X2NmZy0+bHNfZGV0X2NsciwgdHJ1ZSk7CisJCWlmIChyZXQpIHsKKwkJCW11dGV4X3VubG9jaygmcnBvcnQtPm11dGV4KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlyZXQgPSBwcm9wZXJ0eV9lbmFibGUocnBoeSwgJnJwb3J0LT5wb3J0X2NmZy0+bHNfZGV0X2VuLCB0cnVlKTsKKwkJaWYgKHJldCkgeworCQkJbXV0ZXhfdW5sb2NrKCZycG9ydC0+bXV0ZXgpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCW11dGV4X3VubG9jaygmcnBvcnQtPm11dGV4KTsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZycG9ydC0+c21fd29yaywgU0NIRURVTEVfREVMQVkpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX3VzYjJwaHlfcG93ZXJfb24oc3RydWN0IHBoeSAqcGh5KQoreworCXN0cnVjdCByb2NrY2hpcF91c2IycGh5X3BvcnQgKnJwb3J0ID0gcGh5X2dldF9kcnZkYXRhKHBoeSk7CisJc3RydWN0IHJvY2tjaGlwX3VzYjJwaHkgKnJwaHkgPSBkZXZfZ2V0X2RydmRhdGEocGh5LT5kZXYucGFyZW50KTsKKwlpbnQgcmV0OworCisJZGV2X2RiZygmcnBvcnQtPnBoeS0+ZGV2LCAicG9ydCBwb3dlciBvblxuIik7CisKKwlpZiAoIXJwb3J0LT5zdXNwZW5kZWQpCisJCXJldHVybiAwOworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHJwaHktPmNsazQ4MG0pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBwcm9wZXJ0eV9lbmFibGUocnBoeSwgJnJwb3J0LT5wb3J0X2NmZy0+cGh5X3N1cywgZmFsc2UpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlycG9ydC0+c3VzcGVuZGVkID0gZmFsc2U7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfdXNiMnBoeV9wb3dlcl9vZmYoc3RydWN0IHBoeSAqcGh5KQoreworCXN0cnVjdCByb2NrY2hpcF91c2IycGh5X3BvcnQgKnJwb3J0ID0gcGh5X2dldF9kcnZkYXRhKHBoeSk7CisJc3RydWN0IHJvY2tjaGlwX3VzYjJwaHkgKnJwaHkgPSBkZXZfZ2V0X2RydmRhdGEocGh5LT5kZXYucGFyZW50KTsKKwlpbnQgcmV0OworCisJZGV2X2RiZygmcnBvcnQtPnBoeS0+ZGV2LCAicG9ydCBwb3dlciBvZmZcbiIpOworCisJaWYgKHJwb3J0LT5zdXNwZW5kZWQpCisJCXJldHVybiAwOworCisJcmV0ID0gcHJvcGVydHlfZW5hYmxlKHJwaHksICZycG9ydC0+cG9ydF9jZmctPnBoeV9zdXMsIHRydWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlycG9ydC0+c3VzcGVuZGVkID0gdHJ1ZTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocnBoeS0+Y2xrNDgwbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByb2NrY2hpcF91c2IycGh5X2V4aXQoc3RydWN0IHBoeSAqcGh5KQoreworCXN0cnVjdCByb2NrY2hpcF91c2IycGh5X3BvcnQgKnJwb3J0ID0gcGh5X2dldF9kcnZkYXRhKHBoeSk7CisKKwlpZiAocnBvcnQtPnBvcnRfaWQgPT0gVVNCMlBIWV9QT1JUX0hPU1QpCisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcnBvcnQtPnNtX3dvcmspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGh5X29wcyByb2NrY2hpcF91c2IycGh5X29wcyA9IHsKKwkuaW5pdAkJPSByb2NrY2hpcF91c2IycGh5X2luaXQsCisJLmV4aXQJCT0gcm9ja2NoaXBfdXNiMnBoeV9leGl0LAorCS5wb3dlcl9vbgk9IHJvY2tjaGlwX3VzYjJwaHlfcG93ZXJfb24sCisJLnBvd2VyX29mZgk9IHJvY2tjaGlwX3VzYjJwaHlfcG93ZXJfb2ZmLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKKy8qCisgKiBUaGUgZnVuY3Rpb24gbWFuYWdlIGhvc3QtcGh5IHBvcnQgc3RhdGUgYW5kIHN1c3BlbmQvcmVzdW1lIHBoeSBwb3J0CisgKiB0byBzYXZlIHBvd2VyLgorICoKKyAqIHdlIHJlbHkgb24gdXRtaV9saW5lc3RhdGUgYW5kIHV0bWlfaG9zdGRpc2Nvbm5lY3QgdG8gaWRlbnRpZnkgd2hldGhlcgorICogZGV2aWNlcyBpcyBkaXNjb25uZWN0IG9yIG5vdC4gQmVzaWRlcywgd2UgZG8gbm90IG5lZWQgY2FyZSBpdCBpcyBGUy9MUworICogZGlzY29ubmVjdGVkIG9yIEhTIGRpc2Nvbm5lY3RlZCwgYWN0dWFsbHksIHdlIGp1c3Qgb25seSBuZWVkIGdldCB0aGUKKyAqIGRldmljZSBpcyBkaXNjb25uZWN0ZWQgYXQgbGFzdCB0aHJvdWdoIHJlYXJtIHRoZSBkZWxheWVkIHdvcmssCisgKiB0byBzdXNwZW5kIHRoZSBwaHkgcG9ydCBpbiBfUEhZX1NUQVRFX0RJU0NPTk5FQ1RfIGNhc2UuCisgKgorICogTk9URTogSXQgbWF5IGludm9rZSAqcGh5X3Bvd3Jfb2ZmIG9yICpwaHlfcG93ZXJfb24gd2hpY2ggd2lsbCBpbnZva2UKKyAqIHNvbWUgY2xrIHJlbGF0ZWQgQVBJcywgc28gZG8gbm90IGludm9rZSBpdCBmcm9tIGludGVycnVwdCBjb250ZXh0IGRpcmVjdGx5LgorICovCitzdGF0aWMgdm9pZCByb2NrY2hpcF91c2IycGh5X3NtX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCByb2NrY2hpcF91c2IycGh5X3BvcnQgKnJwb3J0ID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByb2NrY2hpcF91c2IycGh5X3BvcnQsIHNtX3dvcmsud29yayk7CisJc3RydWN0IHJvY2tjaGlwX3VzYjJwaHkgKnJwaHkgPSBkZXZfZ2V0X2RydmRhdGEocnBvcnQtPnBoeS0+ZGV2LnBhcmVudCk7CisJdW5zaWduZWQgaW50IHNoID0gcnBvcnQtPnBvcnRfY2ZnLT51dG1pX2hzdGRldC5iaXRlbmQgLQorCQkJICBycG9ydC0+cG9ydF9jZmctPnV0bWlfaHN0ZGV0LmJpdHN0YXJ0ICsgMTsKKwl1bnNpZ25lZCBpbnQgdWwsIHVoZCwgc3RhdGU7CisJdW5zaWduZWQgaW50IHVsX21hc2ssIHVoZF9tYXNrOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZycG9ydC0+bXV0ZXgpOworCisJcmV0ID0gcmVnbWFwX3JlYWQocnBoeS0+Z3JmLCBycG9ydC0+cG9ydF9jZmctPnV0bWlfbHMub2Zmc2V0LCAmdWwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG5leHRfc2NoZWR1bGU7CisKKwlyZXQgPSByZWdtYXBfcmVhZChycGh5LT5ncmYsIHJwb3J0LT5wb3J0X2NmZy0+dXRtaV9oc3RkZXQub2Zmc2V0LAorCQkJICAmdWhkKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBuZXh0X3NjaGVkdWxlOworCisJdWhkX21hc2sgPSBHRU5NQVNLKHJwb3J0LT5wb3J0X2NmZy0+dXRtaV9oc3RkZXQuYml0ZW5kLAorCQkJICAgcnBvcnQtPnBvcnRfY2ZnLT51dG1pX2hzdGRldC5iaXRzdGFydCk7CisJdWxfbWFzayA9IEdFTk1BU0socnBvcnQtPnBvcnRfY2ZnLT51dG1pX2xzLmJpdGVuZCwKKwkJCSAgcnBvcnQtPnBvcnRfY2ZnLT51dG1pX2xzLmJpdHN0YXJ0KTsKKworCS8qIHN0aXRjaCBvbiB1dG1pX2xzIGFuZCB1dG1pX2hzdGRldCBhcyBwaHkgc3RhdGUgKi8KKwlzdGF0ZSA9ICgodWhkICYgdWhkX21hc2spID4+IHJwb3J0LT5wb3J0X2NmZy0+dXRtaV9oc3RkZXQuYml0c3RhcnQpIHwKKwkJKCgodWwgJiB1bF9tYXNrKSA+PiBycG9ydC0+cG9ydF9jZmctPnV0bWlfbHMuYml0c3RhcnQpIDw8IHNoKTsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFBIWV9TVEFURV9IU19PTkxJTkU6CisJCWRldl9kYmcoJnJwb3J0LT5waHktPmRldiwgIkhTIG9ubGluZVxuIik7CisJCWJyZWFrOworCWNhc2UgUEhZX1NUQVRFX0ZTX0xTX09OTElORToKKwkJLyoKKwkJICogRm9yIEZTL0xTIGRldmljZSwgdGhlIG9ubGluZSBzdGF0ZSBzaGFyZSB3aXRoIGNvbm5lY3Qgc3RhdGUKKwkJICogZnJvbSB1dG1pX2xzIGFuZCB1dG1pX2hzdGRldCByZWdpc3Rlciwgc28gd2UgZGlzdGluZ3Vpc2gKKwkJICogdGhlbSB2aWEgc3VzcGVuZGVkIGZsYWcuCisJCSAqCisJCSAqIFBsdXMsIHRoZXJlIGFyZSB0d28gY2FzZXMsIG9uZSBpcyBELSBMaW5lIHB1bGwtdXAsIGFuZCBEKworCQkgKiBsaW5lIHB1bGwtZG93biwgdGhlIHN0YXRlIGlzIDQ7IGFub3RoZXIgaXMgRCsgbGluZSBwdWxsLXVwLAorCQkgKiBhbmQgRC0gbGluZSBwdWxsLWRvd24sIHRoZSBzdGF0ZSBpcyAyLgorCQkgKi8KKwkJaWYgKCFycG9ydC0+c3VzcGVuZGVkKSB7CisJCQkvKiBELSBsaW5lIHB1bGwtdXAsIEQrIGxpbmUgcHVsbC1kb3duICovCisJCQlkZXZfZGJnKCZycG9ydC0+cGh5LT5kZXYsICJGUy9MUyBvbmxpbmVcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBQSFlfU1RBVEVfQ09OTkVDVDoKKwkJaWYgKHJwb3J0LT5zdXNwZW5kZWQpIHsKKwkJCWRldl9kYmcoJnJwb3J0LT5waHktPmRldiwgIkNvbm5lY3RlZFxuIik7CisJCQlyb2NrY2hpcF91c2IycGh5X3Bvd2VyX29uKHJwb3J0LT5waHkpOworCQkJcnBvcnQtPnN1c3BlbmRlZCA9IGZhbHNlOworCQl9IGVsc2UgeworCQkJLyogRCsgbGluZSBwdWxsLXVwLCBELSBsaW5lIHB1bGwtZG93biAqLworCQkJZGV2X2RiZygmcnBvcnQtPnBoeS0+ZGV2LCAiRlMvTFMgb25saW5lXG4iKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFBIWV9TVEFURV9ESVNDT05ORUNUOgorCQlpZiAoIXJwb3J0LT5zdXNwZW5kZWQpIHsKKwkJCWRldl9kYmcoJnJwb3J0LT5waHktPmRldiwgIkRpc2Nvbm5lY3RlZFxuIik7CisJCQlyb2NrY2hpcF91c2IycGh5X3Bvd2VyX29mZihycG9ydC0+cGh5KTsKKwkJCXJwb3J0LT5zdXNwZW5kZWQgPSB0cnVlOworCQl9CisKKwkJLyoKKwkJICogYWN0aXZhdGUgdGhlIGxpbmVzdGF0ZSBkZXRlY3Rpb24gdG8gZ2V0IHRoZSBuZXh0IGRldmljZQorCQkgKiBwbHVnLWluIGlycS4KKwkJICovCisJCXByb3BlcnR5X2VuYWJsZShycGh5LCAmcnBvcnQtPnBvcnRfY2ZnLT5sc19kZXRfY2xyLCB0cnVlKTsKKwkJcHJvcGVydHlfZW5hYmxlKHJwaHksICZycG9ydC0+cG9ydF9jZmctPmxzX2RldF9lbiwgdHJ1ZSk7CisKKwkJLyoKKwkJICogd2UgZG9uJ3QgbmVlZCB0byByZWFybSB0aGUgZGVsYXllZCB3b3JrIHdoZW4gdGhlIHBoeSBwb3J0CisJCSAqIGlzIHN1c3BlbmRlZC4KKwkJICovCisJCW11dGV4X3VubG9jaygmcnBvcnQtPm11dGV4KTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWRldl9kYmcoJnJwb3J0LT5waHktPmRldiwgInVua25vd24gcGh5IHN0YXRlXG4iKTsKKwkJYnJlYWs7CisJfQorCituZXh0X3NjaGVkdWxlOgorCW11dGV4X3VubG9jaygmcnBvcnQtPm11dGV4KTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnJwb3J0LT5zbV93b3JrLCBTQ0hFRFVMRV9ERUxBWSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCByb2NrY2hpcF91c2IycGh5X2xpbmVzdGF0ZV9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeV9wb3J0ICpycG9ydCA9IGRhdGE7CisJc3RydWN0IHJvY2tjaGlwX3VzYjJwaHkgKnJwaHkgPSBkZXZfZ2V0X2RydmRhdGEocnBvcnQtPnBoeS0+ZGV2LnBhcmVudCk7CisKKwlpZiAoIXByb3BlcnR5X2VuYWJsZWQocnBoeSwgJnJwb3J0LT5wb3J0X2NmZy0+bHNfZGV0X3N0KSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJbXV0ZXhfbG9jaygmcnBvcnQtPm11dGV4KTsKKworCS8qIGRpc2FibGUgbGluZXN0YXRlIGRldGVjdCBpcnEgYW5kIGNsZWFyIGl0cyBzdGF0dXMgKi8KKwlwcm9wZXJ0eV9lbmFibGUocnBoeSwgJnJwb3J0LT5wb3J0X2NmZy0+bHNfZGV0X2VuLCBmYWxzZSk7CisJcHJvcGVydHlfZW5hYmxlKHJwaHksICZycG9ydC0+cG9ydF9jZmctPmxzX2RldF9jbHIsIHRydWUpOworCisJbXV0ZXhfdW5sb2NrKCZycG9ydC0+bXV0ZXgpOworCisJLyoKKwkgKiBJbiB0aGlzIGNhc2UgZm9yIGhvc3QgcGh5IHBvcnQsIGEgbmV3IGRldmljZSBpcyBwbHVnZ2VkIGluLAorCSAqIG1lYW53aGlsZSwgaWYgdGhlIHBoeSBwb3J0IGlzIHN1c3BlbmRlZCwgd2UgbmVlZCByZWFybSB0aGUgd29yayB0bworCSAqIHJlc3VtZSBpdCBhbmQgbWFuZ2UgaXRzIHN0YXRlczsgb3RoZXJ3aXNlLCB3ZSBkbyBub3RoaW5nIGFib3V0IHRoYXQuCisJICovCisJaWYgKHJwb3J0LT5zdXNwZW5kZWQgJiYgcnBvcnQtPnBvcnRfaWQgPT0gVVNCMlBIWV9QT1JUX0hPU1QpCisJCXJvY2tjaGlwX3VzYjJwaHlfc21fd29yaygmcnBvcnQtPnNtX3dvcmsud29yayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfdXNiMnBoeV9ob3N0X3BvcnRfaW5pdChzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeSAqcnBoeSwKKwkJCQkJICAgc3RydWN0IHJvY2tjaGlwX3VzYjJwaHlfcG9ydCAqcnBvcnQsCisJCQkJCSAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGRfbnApCit7CisJaW50IHJldDsKKworCXJwb3J0LT5wb3J0X2lkID0gVVNCMlBIWV9QT1JUX0hPU1Q7CisJcnBvcnQtPnBvcnRfY2ZnID0gJnJwaHktPnBoeV9jZmctPnBvcnRfY2Znc1tVU0IyUEhZX1BPUlRfSE9TVF07CisJcnBvcnQtPnN1c3BlbmRlZCA9IHRydWU7CisKKwltdXRleF9pbml0KCZycG9ydC0+bXV0ZXgpOworCUlOSVRfREVMQVlFRF9XT1JLKCZycG9ydC0+c21fd29yaywgcm9ja2NoaXBfdXNiMnBoeV9zbV93b3JrKTsKKworCXJwb3J0LT5sc19pcnEgPSBvZl9pcnFfZ2V0X2J5bmFtZShjaGlsZF9ucCwgImxpbmVzdGF0ZSIpOworCWlmIChycG9ydC0+bHNfaXJxIDwgMCkgeworCQlkZXZfZXJyKHJwaHktPmRldiwgIm5vIGxpbmVzdGF0ZSBpcnEgcHJvdmlkZWRcbiIpOworCQlyZXR1cm4gcnBvcnQtPmxzX2lycTsKKwl9CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKHJwaHktPmRldiwgcnBvcnQtPmxzX2lycSwgTlVMTCwKKwkJCQkJcm9ja2NoaXBfdXNiMnBoeV9saW5lc3RhdGVfaXJxLAorCQkJCQlJUlFGX09ORVNIT1QsCisJCQkJCSJyb2NrY2hpcF91c2IycGh5IiwgcnBvcnQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihycGh5LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBpcnEgaGFuZGxlXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByb2NrY2hpcF91c2IycGh5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGRfbnA7CisJc3RydWN0IHBoeV9wcm92aWRlciAqcHJvdmlkZXI7CisJc3RydWN0IHJvY2tjaGlwX3VzYjJwaHkgKnJwaHk7CisJY29uc3Qgc3RydWN0IHJvY2tjaGlwX3VzYjJwaHlfY2ZnICpwaHlfY2ZnczsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKKwl1bnNpZ25lZCBpbnQgcmVnOworCWludCBpbmRleCwgcmV0OworCisJcnBoeSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcnBoeSksIEdGUF9LRVJORUwpOworCWlmICghcnBoeSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltYXRjaCA9IG9mX21hdGNoX2RldmljZShkZXYtPmRyaXZlci0+b2ZfbWF0Y2hfdGFibGUsIGRldik7CisJaWYgKCFtYXRjaCB8fCAhbWF0Y2gtPmRhdGEpIHsKKwkJZGV2X2VycihkZXYsICJwaHkgY29uZmlncyBhcmUgbm90IGFzc2lnbmVkIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghZGV2LT5wYXJlbnQgfHwgIWRldi0+cGFyZW50LT5vZl9ub2RlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJwaHktPmdyZiA9IHN5c2Nvbl9ub2RlX3RvX3JlZ21hcChkZXYtPnBhcmVudC0+b2Zfbm9kZSk7CisJaWYgKElTX0VSUihycGh5LT5ncmYpKQorCQlyZXR1cm4gUFRSX0VSUihycGh5LT5ncmYpOworCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicmVnIiwgJnJlZykpIHsKKwkJZGV2X2VycihkZXYsICJ0aGUgcmVnIHByb3BlcnR5IGlzIG5vdCBhc3NpZ25lZCBpbiAlcyBub2RlXG4iLAorCQkJbnAtPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlycGh5LT5kZXYgPSBkZXY7CisJcGh5X2NmZ3MgPSBtYXRjaC0+ZGF0YTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBycGh5KTsKKworCS8qIGZpbmQgb3V0IGEgcHJvcGVyIGNvbmZpZyB3aGljaCBjYW4gYmUgbWF0Y2hlZCB3aXRoIGR0LiAqLworCWluZGV4ID0gMDsKKwl3aGlsZSAocGh5X2NmZ3NbaW5kZXhdLnJlZykgeworCQlpZiAocGh5X2NmZ3NbaW5kZXhdLnJlZyA9PSByZWcpIHsKKwkJCXJwaHktPnBoeV9jZmcgPSAmcGh5X2NmZ3NbaW5kZXhdOworCQkJYnJlYWs7CisJCX0KKworCQkrK2luZGV4OworCX0KKworCWlmICghcnBoeS0+cGh5X2NmZykgeworCQlkZXZfZXJyKGRldiwgIm5vIHBoeS1jb25maWcgY2FuIGJlIG1hdGNoZWQgd2l0aCAlcyBub2RlXG4iLAorCQkJbnAtPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlycGh5LT5jbGsgPSBvZl9jbGtfZ2V0X2J5X25hbWUobnAsICJwaHljbGsiKTsKKwlpZiAoIUlTX0VSUihycGh5LT5jbGspKSB7CisJCWNsa19wcmVwYXJlX2VuYWJsZShycGh5LT5jbGspOworCX0gZWxzZSB7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJubyBwaHljbGsgc3BlY2lmaWVkXG4iKTsKKwkJcnBoeS0+Y2xrID0gTlVMTDsKKwl9CisKKwlyZXQgPSByb2NrY2hpcF91c2IycGh5X2NsazQ4MG1fcmVnaXN0ZXIocnBoeSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZWdpc3RlciA0ODBtIG91dHB1dCBjbG9ja1xuIik7CisJCWdvdG8gZGlzYWJsZV9jbGtzOworCX0KKworCWluZGV4ID0gMDsKKwlmb3JfZWFjaF9hdmFpbGFibGVfY2hpbGRfb2Zfbm9kZShucCwgY2hpbGRfbnApIHsKKwkJc3RydWN0IHJvY2tjaGlwX3VzYjJwaHlfcG9ydCAqcnBvcnQgPSAmcnBoeS0+cG9ydHNbaW5kZXhdOworCQlzdHJ1Y3QgcGh5ICpwaHk7CisKKwkJLyoKKwkJICogVGhpcyBkcml2ZXIgYWltIHRvIHN1cHBvcnQgYm90aCBvdGctcG9ydCBhbmQgaG9zdC1wb3J0LAorCQkgKiBidXQgdW5mb3J0dW5hdGVseSwgdGhlIG90ZyBwYXJ0IGlzIG5vdCByZWFkeSBpbiBjdXJyZW50LAorCQkgKiBzbyB0aGlzIGNvbW1lbnRzIGFuZCBiZWxvdyBjb2RlcyBhcmUgaW50ZXJpbSwgd2hpY2ggc2hvdWxkCisJCSAqIGJlIGNoYW5nZWQgYWZ0ZXIgb3RnLXBvcnQgaXMgc3VwcGxpZWQgc29vbi4KKwkJICovCisJCWlmIChvZl9ub2RlX2NtcChjaGlsZF9ucC0+bmFtZSwgImhvc3QtcG9ydCIpKQorCQkJZ290byBuZXh0X2NoaWxkOworCisJCXBoeSA9IGRldm1fcGh5X2NyZWF0ZShkZXYsIGNoaWxkX25wLCAmcm9ja2NoaXBfdXNiMnBoeV9vcHMpOworCQlpZiAoSVNfRVJSKHBoeSkpIHsKKwkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBwaHlcbiIpOworCQkJcmV0ID0gUFRSX0VSUihwaHkpOworCQkJZ290byBwdXRfY2hpbGQ7CisJCX0KKworCQlycG9ydC0+cGh5ID0gcGh5OworCQlwaHlfc2V0X2RydmRhdGEocnBvcnQtPnBoeSwgcnBvcnQpOworCisJCXJldCA9IHJvY2tjaGlwX3VzYjJwaHlfaG9zdF9wb3J0X2luaXQocnBoeSwgcnBvcnQsIGNoaWxkX25wKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gcHV0X2NoaWxkOworCituZXh0X2NoaWxkOgorCQkvKiB0byBwcmV2ZW50IG91dCBvZiBib3VuZGFyeSAqLworCQlpZiAoKytpbmRleCA+PSBycGh5LT5waHlfY2ZnLT5udW1fcG9ydHMpCisJCQlicmVhazsKKwl9CisKKwlwcm92aWRlciA9IGRldm1fb2ZfcGh5X3Byb3ZpZGVyX3JlZ2lzdGVyKGRldiwgb2ZfcGh5X3NpbXBsZV94bGF0ZSk7CisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhwcm92aWRlcik7CisKK3B1dF9jaGlsZDoKKwlvZl9ub2RlX3B1dChjaGlsZF9ucCk7CitkaXNhYmxlX2Nsa3M6CisJaWYgKHJwaHktPmNsaykgeworCQljbGtfZGlzYWJsZV91bnByZXBhcmUocnBoeS0+Y2xrKTsKKwkJY2xrX3B1dChycGh5LT5jbGspOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJvY2tjaGlwX3VzYjJwaHlfY2ZnIHJrMzM2Nl9waHlfY2Znc1tdID0geworCXsKKwkJLnJlZyA9IDB4NzAwLAorCQkubnVtX3BvcnRzCT0gMiwKKwkJLmNsa291dF9jdGwJPSB7IDB4MDcyNCwgMTUsIDE1LCAxLCAwIH0sCisJCS5wb3J0X2NmZ3MJPSB7CisJCQlbVVNCMlBIWV9QT1JUX0hPU1RdID0geworCQkJCS5waHlfc3VzCT0geyAweDA3MjgsIDE1LCAwLCAwLCAweDFkMSB9LAorCQkJCS5sc19kZXRfZW4JPSB7IDB4MDY4MCwgNCwgNCwgMCwgMSB9LAorCQkJCS5sc19kZXRfc3QJPSB7IDB4MDY5MCwgNCwgNCwgMCwgMSB9LAorCQkJCS5sc19kZXRfY2xyCT0geyAweDA2YTAsIDQsIDQsIDAsIDEgfSwKKwkJCQkudXRtaV9scwk9IHsgMHgwNDljLCAxNCwgMTMsIDAsIDEgfSwKKwkJCQkudXRtaV9oc3RkZXQJPSB7IDB4MDQ5YywgMTIsIDEyLCAwLCAxIH0KKwkJCX0KKwkJfSwKKwl9LAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByb2NrY2hpcF91c2IycGh5X2NmZyByazMzOTlfcGh5X2NmZ3NbXSA9IHsKKwl7CisJCS5yZWcgPSAweGU0NTAsCisJCS5udW1fcG9ydHMJPSAyLAorCQkuY2xrb3V0X2N0bAk9IHsgMHhlNDUwLCA0LCA0LCAxLCAwIH0sCisJCS5wb3J0X2NmZ3MJPSB7CisJCQlbVVNCMlBIWV9QT1JUX0hPU1RdID0geworCQkJCS5waHlfc3VzCT0geyAweGU0NTgsIDEsIDAsIDB4MiwgMHgxIH0sCisJCQkJLmxzX2RldF9lbgk9IHsgMHhlM2MwLCA2LCA2LCAwLCAxIH0sCisJCQkJLmxzX2RldF9zdAk9IHsgMHhlM2UwLCA2LCA2LCAwLCAxIH0sCisJCQkJLmxzX2RldF9jbHIJPSB7IDB4ZTNkMCwgNiwgNiwgMCwgMSB9LAorCQkJCS51dG1pX2xzCT0geyAweGUyYWMsIDIyLCAyMSwgMCwgMSB9LAorCQkJCS51dG1pX2hzdGRldAk9IHsgMHhlMmFjLCAyMywgMjMsIDAsIDEgfQorCQkJfQorCQl9LAorCX0sCisJeworCQkucmVnID0gMHhlNDYwLAorCQkubnVtX3BvcnRzCT0gMiwKKwkJLmNsa291dF9jdGwJPSB7IDB4ZTQ2MCwgNCwgNCwgMSwgMCB9LAorCQkucG9ydF9jZmdzCT0geworCQkJW1VTQjJQSFlfUE9SVF9IT1NUXSA9IHsKKwkJCQkucGh5X3N1cwk9IHsgMHhlNDY4LCAxLCAwLCAweDIsIDB4MSB9LAorCQkJCS5sc19kZXRfZW4JPSB7IDB4ZTNjMCwgMTEsIDExLCAwLCAxIH0sCisJCQkJLmxzX2RldF9zdAk9IHsgMHhlM2UwLCAxMSwgMTEsIDAsIDEgfSwKKwkJCQkubHNfZGV0X2Nscgk9IHsgMHhlM2QwLCAxMSwgMTEsIDAsIDEgfSwKKwkJCQkudXRtaV9scwk9IHsgMHhlMmFjLCAyNiwgMjUsIDAsIDEgfSwKKwkJCQkudXRtaV9oc3RkZXQJPSB7IDB4ZTJhYywgMjcsIDI3LCAwLCAxIH0KKwkJCX0KKwkJfSwKKwl9LAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcm9ja2NoaXBfdXNiMnBoeV9kdF9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMzY2LXVzYjJwaHkiLCAuZGF0YSA9ICZyazMzNjZfcGh5X2NmZ3MgfSwKKwl7IC5jb21wYXRpYmxlID0gInJvY2tjaGlwLHJrMzM5OS11c2IycGh5IiwgLmRhdGEgPSAmcmszMzk5X3BoeV9jZmdzIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCByb2NrY2hpcF91c2IycGh5X2R0X21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcm9ja2NoaXBfdXNiMnBoeV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHJvY2tjaGlwX3VzYjJwaHlfcHJvYmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInJvY2tjaGlwLXVzYjJwaHkiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSByb2NrY2hpcF91c2IycGh5X2R0X21hdGNoLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihyb2NrY2hpcF91c2IycGh5X2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkZyYW5rIFdhbmcgPGZyYW5rLndhbmdAcm9jay1jaGlwcy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJvY2tjaGlwIFVTQjIuMCBQSFkgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktcm9ja2NoaXAtcGNpZS5jIGIvZHJpdmVycy9waHkvcGh5LXJvY2tjaGlwLXBjaWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmI0YzZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waHkvcGh5LXJvY2tjaGlwLXBjaWUuYwpAQCAtMCwwICsxLDM1NyBAQAorLyoKKyAqIFJvY2tjaGlwIFBDSWUgUEhZIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBTaGF3biBMaW4gPHNoYXduLmxpbkByb2NrLWNoaXBzLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxNiBST0NLQ0hJUCwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+CisKKy8qCisgKiBUaGUgaGlnaGVyIDE2LWJpdCBvZiB0aGlzIHJlZ2lzdGVyIGlzIHVzZWQgZm9yIHdyaXRlIHByb3RlY3Rpb24KKyAqIG9ubHkgaWYgQklUKHggKyAxNikgc2V0IHRvIDEgdGhlIEJJVCh4KSBjYW4gYmUgd3JpdHRlbi4KKyAqLworI2RlZmluZSBISVdPUkRfVVBEQVRFKHZhbCwgbWFzaywgc2hpZnQpIFwKKwkJKCh2YWwpIDw8IChzaGlmdCkgfCAobWFzaykgPDwgKChzaGlmdCkgKyAxNikpCisKKyNkZWZpbmUgUEhZX01BWF9MQU5FX05VTSAgICAgIDQKKyNkZWZpbmUgUEhZX0NGR19EQVRBX1NISUZUICAgIDcKKyNkZWZpbmUgUEhZX0NGR19BRERSX1NISUZUICAgIDEKKyNkZWZpbmUgUEhZX0NGR19EQVRBX01BU0sgICAgIDB4ZgorI2RlZmluZSBQSFlfQ0ZHX0FERFJfTUFTSyAgICAgMHgzZgorI2RlZmluZSBQSFlfQ0ZHX1JEX01BU0sgICAgICAgMHgzZmYKKyNkZWZpbmUgUEhZX0NGR19XUl9FTkFCTEUgICAgIDEKKyNkZWZpbmUgUEhZX0NGR19XUl9ESVNBQkxFICAgIDEKKyNkZWZpbmUgUEhZX0NGR19XUl9TSElGVCAgICAgIDAKKyNkZWZpbmUgUEhZX0NGR19XUl9NQVNLICAgICAgIDEKKyNkZWZpbmUgUEhZX0NGR19QTExfTE9DSyAgICAgIDB4MTAKKyNkZWZpbmUgUEhZX0NGR19DTEtfVEVTVCAgICAgIDB4MTAKKyNkZWZpbmUgUEhZX0NGR19DTEtfU0NDICAgICAgIDB4MTIKKyNkZWZpbmUgUEhZX0NGR19TRVBFX1JBVEUgICAgIEJJVCgzKQorI2RlZmluZSBQSFlfQ0ZHX1BMTF8xMDBNICAgICAgQklUKDMpCisjZGVmaW5lIFBIWV9QTExfTE9DS0VEICAgICAgICBCSVQoOSkKKyNkZWZpbmUgUEhZX1BMTF9PVVRQVVQgICAgICAgIEJJVCgxMCkKKyNkZWZpbmUgUEhZX0xBTkVfQV9TVEFUVVMgICAgIDB4MzAKKyNkZWZpbmUgUEhZX0xBTkVfQl9TVEFUVVMgICAgIDB4MzEKKyNkZWZpbmUgUEhZX0xBTkVfQ19TVEFUVVMgICAgIDB4MzIKKyNkZWZpbmUgUEhZX0xBTkVfRF9TVEFUVVMgICAgIDB4MzMKKyNkZWZpbmUgUEhZX0xBTkVfUlhfREVUX1NISUZUIDExCisjZGVmaW5lIFBIWV9MQU5FX1JYX0RFVF9USCAgICAweDEKKyNkZWZpbmUgUEhZX0xBTkVfSURMRV9PRkYgICAgIDB4MQorI2RlZmluZSBQSFlfTEFORV9JRExFX01BU0sgICAgMHgxCisjZGVmaW5lIFBIWV9MQU5FX0lETEVfQV9TSElGVCAzCisjZGVmaW5lIFBIWV9MQU5FX0lETEVfQl9TSElGVCA0CisjZGVmaW5lIFBIWV9MQU5FX0lETEVfQ19TSElGVCA1CisjZGVmaW5lIFBIWV9MQU5FX0lETEVfRF9TSElGVCA2CisKK3N0cnVjdCByb2NrY2hpcF9wY2llX2RhdGEgeworCXVuc2lnbmVkIGludCBwY2llX2NvbmY7CisJdW5zaWduZWQgaW50IHBjaWVfc3RhdHVzOworCXVuc2lnbmVkIGludCBwY2llX2xhbmVvZmY7Cit9OworCitzdHJ1Y3Qgcm9ja2NoaXBfcGNpZV9waHkgeworCXN0cnVjdCByb2NrY2hpcF9wY2llX2RhdGEgKnBoeV9kYXRhOworCXN0cnVjdCByZWdtYXAgKnJlZ19iYXNlOworCXN0cnVjdCByZXNldF9jb250cm9sICpwaHlfcnN0OworCXN0cnVjdCBjbGsgKmNsa19wY2llcGh5X3JlZjsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwaHlfd3JfY2ZnKHN0cnVjdCByb2NrY2hpcF9wY2llX3BoeSAqcmtfcGh5LAorCQkJICAgICAgdTMyIGFkZHIsIHUzMiBkYXRhKQoreworCXJlZ21hcF93cml0ZShya19waHktPnJlZ19iYXNlLCBya19waHktPnBoeV9kYXRhLT5wY2llX2NvbmYsCisJCSAgICAgSElXT1JEX1VQREFURShkYXRhLAorCQkJCSAgIFBIWV9DRkdfREFUQV9NQVNLLAorCQkJCSAgIFBIWV9DRkdfREFUQV9TSElGVCkgfAorCQkgICAgIEhJV09SRF9VUERBVEUoYWRkciwKKwkJCQkgICBQSFlfQ0ZHX0FERFJfTUFTSywKKwkJCQkgICBQSFlfQ0ZHX0FERFJfU0hJRlQpKTsKKwl1ZGVsYXkoMSk7CisJcmVnbWFwX3dyaXRlKHJrX3BoeS0+cmVnX2Jhc2UsIHJrX3BoeS0+cGh5X2RhdGEtPnBjaWVfY29uZiwKKwkJICAgICBISVdPUkRfVVBEQVRFKFBIWV9DRkdfV1JfRU5BQkxFLAorCQkJCSAgIFBIWV9DRkdfV1JfTUFTSywKKwkJCQkgICBQSFlfQ0ZHX1dSX1NISUZUKSk7CisJdWRlbGF5KDEpOworCXJlZ21hcF93cml0ZShya19waHktPnJlZ19iYXNlLCBya19waHktPnBoeV9kYXRhLT5wY2llX2NvbmYsCisJCSAgICAgSElXT1JEX1VQREFURShQSFlfQ0ZHX1dSX0RJU0FCTEUsCisJCQkJICAgUEhZX0NGR19XUl9NQVNLLAorCQkJCSAgIFBIWV9DRkdfV1JfU0hJRlQpKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgcGh5X3JkX2NmZyhzdHJ1Y3Qgcm9ja2NoaXBfcGNpZV9waHkgKnJrX3BoeSwKKwkJCSAgICAgdTMyIGFkZHIpCit7CisJdTMyIHZhbDsKKworCXJlZ21hcF93cml0ZShya19waHktPnJlZ19iYXNlLCBya19waHktPnBoeV9kYXRhLT5wY2llX2NvbmYsCisJCSAgICAgSElXT1JEX1VQREFURShhZGRyLAorCQkJCSAgIFBIWV9DRkdfUkRfTUFTSywKKwkJCQkgICBQSFlfQ0ZHX0FERFJfU0hJRlQpKTsKKwlyZWdtYXBfcmVhZChya19waHktPnJlZ19iYXNlLAorCQkgICAgcmtfcGh5LT5waHlfZGF0YS0+cGNpZV9zdGF0dXMsCisJCSAgICAmdmFsKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX3BjaWVfcGh5X3Bvd2VyX29mZihzdHJ1Y3QgcGh5ICpwaHkpCit7CisJc3RydWN0IHJvY2tjaGlwX3BjaWVfcGh5ICpya19waHkgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKKwlpbnQgZXJyID0gMDsKKworCWVyciA9IHJlc2V0X2NvbnRyb2xfYXNzZXJ0KHJrX3BoeS0+cGh5X3JzdCk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwaHktPmRldiwgImFzc2VydCBwaHlfcnN0IGVyciAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByb2NrY2hpcF9wY2llX3BoeV9wb3dlcl9vbihzdHJ1Y3QgcGh5ICpwaHkpCit7CisJc3RydWN0IHJvY2tjaGlwX3BjaWVfcGh5ICpya19waHkgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKKwlpbnQgZXJyID0gMDsKKwl1MzIgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCWVyciA9IHJlc2V0X2NvbnRyb2xfZGVhc3NlcnQocmtfcGh5LT5waHlfcnN0KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBoeS0+ZGV2LCAiZGVhc3NlcnQgcGh5X3JzdCBlcnIgJWRcbiIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJcmVnbWFwX3dyaXRlKHJrX3BoeS0+cmVnX2Jhc2UsIHJrX3BoeS0+cGh5X2RhdGEtPnBjaWVfY29uZiwKKwkJICAgICBISVdPUkRfVVBEQVRFKFBIWV9DRkdfUExMX0xPQ0ssCisJCQkJICAgUEhZX0NGR19BRERSX01BU0ssCisJCQkJICAgUEhZX0NGR19BRERSX1NISUZUKSk7CisKKwkvKgorCSAqIE5vIGRvY3VtZW50ZWQgdGltZW91dCB2YWx1ZSBmb3IgcGh5IG9wZXJhdGlvbiBiZWxvdywKKwkgKiBzbyB3ZSBtYWtlIGl0IGxhcmdlIGVub3VnaCBoZXJlLiBBbmQgd2UgdXNlIGxvb3AtYnJlYWsKKwkgKiBtZXRob2Qgd2hpY2ggc2hvdWxkIG5vdCBiZSBoYXJtZnVsLgorCSAqLworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDAwKTsKKworCWVyciA9IC1FSU5WQUw7CisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCXJlZ21hcF9yZWFkKHJrX3BoeS0+cmVnX2Jhc2UsCisJCQkgICAgcmtfcGh5LT5waHlfZGF0YS0+cGNpZV9zdGF0dXMsCisJCQkgICAgJnN0YXR1cyk7CisJCWlmIChzdGF0dXMgJiBQSFlfUExMX0xPQ0tFRCkgeworCQkJZGV2X2RiZygmcGh5LT5kZXYsICJwbGwgbG9ja2VkIVxuIik7CisJCQllcnIgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJbXNsZWVwKDIwKTsKKwl9CisKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBoeS0+ZGV2LCAicGxsIGxvY2sgdGltZW91dCFcbiIpOworCQlnb3RvIGVycl9wbGxfbG9jazsKKwl9CisKKwlwaHlfd3JfY2ZnKHJrX3BoeSwgUEhZX0NGR19DTEtfVEVTVCwgUEhZX0NGR19TRVBFX1JBVEUpOworCXBoeV93cl9jZmcocmtfcGh5LCBQSFlfQ0ZHX0NMS19TQ0MsIFBIWV9DRkdfUExMXzEwME0pOworCisJZXJyID0gLUVUSU1FRE9VVDsKKwl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJcmVnbWFwX3JlYWQocmtfcGh5LT5yZWdfYmFzZSwKKwkJCSAgICBya19waHktPnBoeV9kYXRhLT5wY2llX3N0YXR1cywKKwkJCSAgICAmc3RhdHVzKTsKKwkJaWYgKCEoc3RhdHVzICYgUEhZX1BMTF9PVVRQVVQpKSB7CisJCQlkZXZfZGJnKCZwaHktPmRldiwgInBsbCBvdXRwdXQgZW5hYmxlIGRvbmUhXG4iKTsKKwkJCWVyciA9IDA7CisJCQlicmVhazsKKwkJfQorCQltc2xlZXAoMjApOworCX0KKworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGh5LT5kZXYsICJwbGwgb3V0cHV0IGVuYWJsZSB0aW1lb3V0IVxuIik7CisJCWdvdG8gZXJyX3BsbF9sb2NrOworCX0KKworCXJlZ21hcF93cml0ZShya19waHktPnJlZ19iYXNlLCBya19waHktPnBoeV9kYXRhLT5wY2llX2NvbmYsCisJCSAgICAgSElXT1JEX1VQREFURShQSFlfQ0ZHX1BMTF9MT0NLLAorCQkJCSAgIFBIWV9DRkdfQUREUl9NQVNLLAorCQkJCSAgIFBIWV9DRkdfQUREUl9TSElGVCkpOworCWVyciA9IC1FSU5WQUw7CisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCXJlZ21hcF9yZWFkKHJrX3BoeS0+cmVnX2Jhc2UsCisJCQkgICAgcmtfcGh5LT5waHlfZGF0YS0+cGNpZV9zdGF0dXMsCisJCQkgICAgJnN0YXR1cyk7CisJCWlmIChzdGF0dXMgJiBQSFlfUExMX0xPQ0tFRCkgeworCQkJZGV2X2RiZygmcGh5LT5kZXYsICJwbGwgcmVsb2NrZWQhXG4iKTsKKwkJCWVyciA9IDA7CisJCQlicmVhazsKKwkJfQorCQltc2xlZXAoMjApOworCX0KKworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGh5LT5kZXYsICJwbGwgcmVsb2NrIHRpbWVvdXQhXG4iKTsKKwkJZ290byBlcnJfcGxsX2xvY2s7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9wbGxfbG9jazoKKwlyZXNldF9jb250cm9sX2Fzc2VydChya19waHktPnBoeV9yc3QpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfcGNpZV9waHlfaW5pdChzdHJ1Y3QgcGh5ICpwaHkpCit7CisJc3RydWN0IHJvY2tjaGlwX3BjaWVfcGh5ICpya19waHkgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKKwlpbnQgZXJyID0gMDsKKworCWVyciA9IGNsa19wcmVwYXJlX2VuYWJsZShya19waHktPmNsa19wY2llcGh5X3JlZik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwaHktPmRldiwgIkZhaWwgdG8gZW5hYmxlIHBjaWUgcmVmIGNsb2NrLlxuIik7CisJCWdvdG8gZXJyX3JlZmNsazsKKwl9CisKKwllcnIgPSByZXNldF9jb250cm9sX2Fzc2VydChya19waHktPnBoeV9yc3QpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGh5LT5kZXYsICJhc3NlcnQgcGh5X3JzdCBlcnIgJWRcbiIsIGVycik7CisJCWdvdG8gZXJyX3Jlc2V0OworCX0KKworCXJldHVybiBlcnI7CisKK2Vycl9yZXNldDoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocmtfcGh5LT5jbGtfcGNpZXBoeV9yZWYpOworZXJyX3JlZmNsazoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX3BjaWVfcGh5X2V4aXQoc3RydWN0IHBoeSAqcGh5KQoreworCXN0cnVjdCByb2NrY2hpcF9wY2llX3BoeSAqcmtfcGh5ID0gcGh5X2dldF9kcnZkYXRhKHBoeSk7CisJaW50IGVyciA9IDA7CisKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocmtfcGh5LT5jbGtfcGNpZXBoeV9yZWYpOworCisJZXJyID0gcmVzZXRfY29udHJvbF9kZWFzc2VydChya19waHktPnBoeV9yc3QpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGh5LT5kZXYsICJkZWFzc2VydCBwaHlfcnN0IGVyciAlZFxuIiwgZXJyKTsKKwkJZ290byBlcnJfcmVzZXQ7CisJfQorCisJcmV0dXJuIGVycjsKKworZXJyX3Jlc2V0OgorCWNsa19wcmVwYXJlX2VuYWJsZShya19waHktPmNsa19wY2llcGh5X3JlZik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwaHlfb3BzIG9wcyA9IHsKKwkuaW5pdAkJPSByb2NrY2hpcF9wY2llX3BoeV9pbml0LAorCS5leGl0CQk9IHJvY2tjaGlwX3BjaWVfcGh5X2V4aXQsCisJLnBvd2VyX29uCT0gcm9ja2NoaXBfcGNpZV9waHlfcG93ZXJfb24sCisJLnBvd2VyX29mZgk9IHJvY2tjaGlwX3BjaWVfcGh5X3Bvd2VyX29mZiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJvY2tjaGlwX3BjaWVfZGF0YSByazMzOTlfcGNpZV9kYXRhID0geworCS5wY2llX2NvbmYgPSAweGUyMjAsCisJLnBjaWVfc3RhdHVzID0gMHhlMmE0LAorCS5wY2llX2xhbmVvZmYgPSAweGUyMTQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCByb2NrY2hpcF9wY2llX3BoeV9kdF9pZHNbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0gInJvY2tjaGlwLHJrMzM5OS1wY2llLXBoeSIsCisJCS5kYXRhID0gJnJrMzM5OV9wY2llX2RhdGEsCisJfSwKKwl7fQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcm9ja2NoaXBfcGNpZV9waHlfZHRfaWRzKTsKKworc3RhdGljIGludCByb2NrY2hpcF9wY2llX3BoeV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IHJvY2tjaGlwX3BjaWVfcGh5ICpya19waHk7CisJc3RydWN0IHBoeSAqZ2VuZXJpY19waHk7CisJc3RydWN0IHBoeV9wcm92aWRlciAqcGh5X3Byb3ZpZGVyOworCXN0cnVjdCByZWdtYXAgKmdyZjsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZDsKKworCWdyZiA9IHN5c2Nvbl9ub2RlX3RvX3JlZ21hcChkZXYtPnBhcmVudC0+b2Zfbm9kZSk7CisJaWYgKElTX0VSUihncmYpKSB7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IGZpbmQgR1JGIHN5c2NvblxuIik7CisJCXJldHVybiBQVFJfRVJSKGdyZik7CisJfQorCisJcmtfcGh5ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpya19waHkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJrX3BoeSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlvZl9pZCA9IG9mX21hdGNoX2RldmljZShyb2NrY2hpcF9wY2llX3BoeV9kdF9pZHMsICZwZGV2LT5kZXYpOworCWlmICghb2ZfaWQpCisJCXJldHVybiAtRUlOVkFMOworCisJcmtfcGh5LT5waHlfZGF0YSA9IChzdHJ1Y3Qgcm9ja2NoaXBfcGNpZV9kYXRhICopb2ZfaWQtPmRhdGE7CisJcmtfcGh5LT5yZWdfYmFzZSA9IGdyZjsKKworCXJrX3BoeS0+cGh5X3JzdCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoZGV2LCAicGh5Iik7CisJaWYgKElTX0VSUihya19waHktPnBoeV9yc3QpKSB7CisJCWlmIChQVFJfRVJSKHJrX3BoeS0+cGh5X3JzdCkgIT0gLUVQUk9CRV9ERUZFUikKKwkJCWRldl9lcnIoZGV2LAorCQkJCSJtaXNzaW5nIHBoeSBwcm9wZXJ0eSBmb3IgcmVzZXQgY29udHJvbGxlclxuIik7CisJCXJldHVybiBQVFJfRVJSKHJrX3BoeS0+cGh5X3JzdCk7CisJfQorCisJcmtfcGh5LT5jbGtfcGNpZXBoeV9yZWYgPSBkZXZtX2Nsa19nZXQoZGV2LCAicmVmY2xrIik7CisJaWYgKElTX0VSUihya19waHktPmNsa19wY2llcGh5X3JlZikpIHsKKwkJZGV2X2VycihkZXYsICJyZWZjbGsgbm90IGZvdW5kLlxuIik7CisJCXJldHVybiBQVFJfRVJSKHJrX3BoeS0+Y2xrX3BjaWVwaHlfcmVmKTsKKwl9CisKKwlnZW5lcmljX3BoeSA9IGRldm1fcGh5X2NyZWF0ZShkZXYsIGRldi0+b2Zfbm9kZSwgJm9wcyk7CisJaWYgKElTX0VSUihnZW5lcmljX3BoeSkpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gY3JlYXRlIFBIWVxuIik7CisJCXJldHVybiBQVFJfRVJSKGdlbmVyaWNfcGh5KTsKKwl9CisKKwlwaHlfc2V0X2RydmRhdGEoZ2VuZXJpY19waHksIHJrX3BoeSk7CisJcGh5X3Byb3ZpZGVyID0gZGV2bV9vZl9waHlfcHJvdmlkZXJfcmVnaXN0ZXIoZGV2LCBvZl9waHlfc2ltcGxlX3hsYXRlKTsKKworCXJldHVybiBQVFJfRVJSX09SX1pFUk8ocGh5X3Byb3ZpZGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcm9ja2NoaXBfcGNpZV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHJvY2tjaGlwX3BjaWVfcGh5X3Byb2JlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJyb2NrY2hpcC1wY2llLXBoeSIsCisJCS5vZl9tYXRjaF90YWJsZSA9IHJvY2tjaGlwX3BjaWVfcGh5X2R0X2lkcywKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihyb2NrY2hpcF9wY2llX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIlNoYXduIExpbiA8c2hhd24ubGluQHJvY2stY2hpcHMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSb2NrY2hpcCBQQ0llIFBIWSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1yb2NrY2hpcC10eXBlYy5jIGIvZHJpdmVycy9waHkvcGh5LXJvY2tjaGlwLXR5cGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NmYjBmOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1yb2NrY2hpcC10eXBlYy5jCkBAIC0wLDAgKzEsMTAyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgRnV6aG91IFJvY2tjaGlwIEVsZWN0cm9uaWNzIENvLkx0ZAorICogQXV0aG9yOiBDaHJpcyBaaG9uZyA8enl3QHJvY2stY2hpcHMuY29tPgorICogICAgICAgICBLZXZlciBZYW5nIDxrZXZlci55YW5nQHJvY2stY2hpcHMuY29tPgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIFJPQ0tDSElQIFR5cGUtQyBQSFkgaGFzIHR3byBQTEwgY2xvY2tzLiBUaGUgZmlyc3QgUExMIGNsb2NrCisgKiBpcyB1c2VkIGZvciBVU0IzLCB0aGUgc2Vjb25kIFBMTCBjbG9jayBpcyB1c2VkIGZvciBEUC4gVGhpcyBUeXBlLUMgUEhZIGhhcworICogMyB3b3JraW5nIG1vZGVzOiBVU0IzIG9ubHkgbW9kZSwgRFAgb25seSBtb2RlLCBhbmQgVVNCMytEUCBtb2RlLgorICogQXQgVVNCMyBvbmx5IG1vZGUsIGJvdGggUExMIGNsb2NrcyBuZWVkIHRvIGJlIGluaXRpYWxpemVkLCB0aGlzIGFsbG93cyB0aGUKKyAqIFBIWSB0byBzd2l0Y2ggbW9kZSBiZXR3ZWVuIFVTQjMgYW5kIFVTQjMrRFAsIHdpdGhvdXQgZGlzY29ubmVjdGluZyB0aGUgVVNCCisgKiBkZXZpY2UuCisgKiBJbiBUaGUgRFAgb25seSBtb2RlLCBvbmx5IHRoZSBEUCBQTEwgbmVlZHMgdG8gYmUgcG93ZXJlZCBvbiwgYW5kIHRoZSA0IGxhbmVzCisgKiBhcmUgYWxsIHVzZWQgZm9yIERQLgorICoKKyAqIFRoaXMgZHJpdmVyIGdldHMgZXh0Y29uIGNhYmxlIHN0YXRlIGFuZCBwcm9wZXJ0eSwgdGhlbiBkZWNpZGVzIHdoaWNoIG1vZGUgdG8KKyAqIHNlbGVjdDoKKyAqCisgKiAxLiBVU0IzIG9ubHkgbW9kZToKKyAqICAgIEVYVENPTl9VU0Igb3IgRVhUQ09OX1VTQl9IT1NUIHN0YXRlIGlzIHRydWUsIGFuZAorICogICAgRVhUQ09OX1BST1BfVVNCX1NTIHByb3BlcnR5IGlzIHRydWUuCisgKiAgICBFWFRDT05fRElTUF9EUCBzdGF0ZSBpcyBmYWxzZS4KKyAqCisgKiAyLiBEUCBvbmx5IG1vZGU6CisgKiAgICBFWFRDT05fRElTUF9EUCBzdGF0ZSBpcyB0cnVlLCBhbmQKKyAqICAgIEVYVENPTl9QUk9QX1VTQl9TUyBwcm9wZXJ0eSBpcyBmYWxzZS4KKyAqICAgIElmIEVYVENPTl9VU0JfSE9TVCBzdGF0ZSBpcyB0cnVlLCBpdCBpcyBEUCArIFVTQjIgbW9kZSwgc2luY2UgdGhlIFVTQjIgcGh5CisgKiAgICBpcyBhIHNlcGFyYXRlIHBoeSwgc28gdGhpcyBjYXNlIGlzIHN0aWxsIERQIG9ubHkgbW9kZS4KKyAqCisgKiAzLiBVU0IzK0RQIG1vZGU6CisgKiAgICBFWFRDT05fVVNCX0hPU1QgYW5kIEVYVENPTl9ESVNQX0RQIGFyZSBib3RoIHRydWUsIGFuZAorICogICAgRVhUQ09OX1BST1BfVVNCX1NTIHByb3BlcnR5IGlzIHRydWUuCisgKgorICogVGhpcyBUeXBlLUMgUEhZIGRyaXZlciBzdXBwb3J0cyBub3JtYWwgYW5kIGZsaXAgb3JpZW50YXRpb24uIFRoZSBvcmllbnRhdGlvbgorICogaXMgcmVwb3J0ZWQgYnkgdGhlIEVYVENPTl9QUk9QX1VTQl9UWVBFQ19QT0xBUklUWSBwcm9wZXJ0eTogdHJ1ZSBpcyBmbGlwCisgKiBvcmllbnRhdGlvbiwgZmFsc2UgaXMgbm9ybWFsIG9yaWVudGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9leHRjb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9yZXNldC5oPgorCisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KKworI2RlZmluZSBDTU5fU1NNX0JBTkRHQVAJCQkoMHgyMSA8PCAyKQorI2RlZmluZSBDTU5fU1NNX0JJQVMJCQkoMHgyMiA8PCAyKQorI2RlZmluZSBDTU5fUExMU00wX1BMTEVOCQkoMHgyOSA8PCAyKQorI2RlZmluZSBDTU5fUExMU00wX1BMTFBSRQkJKDB4MmEgPDwgMikKKyNkZWZpbmUgQ01OX1BMTFNNMF9QTExWUkVGCQkoMHgyYiA8PCAyKQorI2RlZmluZSBDTU5fUExMU00wX1BMTExPQ0sJCSgweDJjIDw8IDIpCisjZGVmaW5lIENNTl9QTExTTTFfUExMRU4JCSgweDMxIDw8IDIpCisjZGVmaW5lIENNTl9QTExTTTFfUExMUFJFCQkoMHgzMiA8PCAyKQorI2RlZmluZSBDTU5fUExMU00xX1BMTFZSRUYJCSgweDMzIDw8IDIpCisjZGVmaW5lIENNTl9QTExTTTFfUExMTE9DSwkJKDB4MzQgPDwgMikKKyNkZWZpbmUgQ01OX1BMTFNNMV9VU0VSX0RFRl9DVFJMCSgweDM3IDw8IDIpCisjZGVmaW5lIENNTl9JQ0FMX09WUkQJCQkoMHhjMSA8PCAyKQorI2RlZmluZSBDTU5fUExMMF9WQ09DQUxfT1ZSRAkJKDB4ODMgPDwgMikKKyNkZWZpbmUgQ01OX1BMTDBfVkNPQ0FMX0lOSVQJCSgweDg0IDw8IDIpCisjZGVmaW5lIENNTl9QTEwwX1ZDT0NBTF9JVEVSCQkoMHg4NSA8PCAyKQorI2RlZmluZSBDTU5fUExMMF9MT0NLX1JFRkNOVF9TVEFSVAkoMHg5MCA8PCAyKQorI2RlZmluZSBDTU5fUExMMF9MT0NLX1BMTENOVF9TVEFSVAkoMHg5MiA8PCAyKQorI2RlZmluZSBDTU5fUExMMF9MT0NLX1BMTENOVF9USFIJKDB4OTMgPDwgMikKKyNkZWZpbmUgQ01OX1BMTDBfSU5URElWCQkJKDB4OTQgPDwgMikKKyNkZWZpbmUgQ01OX1BMTDBfRlJBQ0RJVgkJKDB4OTUgPDwgMikKKyNkZWZpbmUgQ01OX1BMTDBfSElHSF9USFIJCSgweDk2IDw8IDIpCisjZGVmaW5lIENNTl9QTEwwX0RTTV9ESUFHCQkoMHg5NyA8PCAyKQorI2RlZmluZSBDTU5fUExMMF9TU19DVFJMMQkJKDB4OTggPDwgMikKKyNkZWZpbmUgQ01OX1BMTDBfU1NfQ1RSTDIJCSgweDk5IDw8IDIpCisjZGVmaW5lIENNTl9QTEwxX1ZDT0NBTF9TVEFSVAkJKDB4YTEgPDwgMikKKyNkZWZpbmUgQ01OX1BMTDFfVkNPQ0FMX09WUkQJCSgweGEzIDw8IDIpCisjZGVmaW5lIENNTl9QTEwxX1ZDT0NBTF9JTklUCQkoMHhhNCA8PCAyKQorI2RlZmluZSBDTU5fUExMMV9WQ09DQUxfSVRFUgkJKDB4YTUgPDwgMikKKyNkZWZpbmUgQ01OX1BMTDFfTE9DS19SRUZDTlRfU1RBUlQJKDB4YjAgPDwgMikKKyNkZWZpbmUgQ01OX1BMTDFfTE9DS19QTExDTlRfU1RBUlQJKDB4YjIgPDwgMikKKyNkZWZpbmUgQ01OX1BMTDFfTE9DS19QTExDTlRfVEhSCSgweGIzIDw8IDIpCisjZGVmaW5lIENNTl9QTEwxX0lOVERJVgkJCSgweGI0IDw8IDIpCisjZGVmaW5lIENNTl9QTEwxX0ZSQUNESVYJCSgweGI1IDw8IDIpCisjZGVmaW5lIENNTl9QTEwxX0hJR0hfVEhSCQkoMHhiNiA8PCAyKQorI2RlZmluZSBDTU5fUExMMV9EU01fRElBRwkJKDB4YjcgPDwgMikKKyNkZWZpbmUgQ01OX1BMTDFfU1NfQ1RSTDEJCSgweGI4IDw8IDIpCisjZGVmaW5lIENNTl9QTEwxX1NTX0NUUkwyCQkoMHhiOSA8PCAyKQorI2RlZmluZSBDTU5fUlhDQUxfT1ZSRAkJCSgweGQxIDw8IDIpCisjZGVmaW5lIENNTl9UWFBVQ0FMX0NUUkwJCSgweGUwIDw8IDIpCisjZGVmaW5lIENNTl9UWFBVQ0FMX09WUkQJCSgweGUxIDw8IDIpCisjZGVmaW5lIENNTl9UWFBEQ0FMX09WUkQJCSgweGYxIDw8IDIpCisjZGVmaW5lIENNTl9ESUFHX1BMTDBfRkJIX09WUkQJCSgweDFjMCA8PCAyKQorI2RlZmluZSBDTU5fRElBR19QTEwwX0ZCTF9PVlJECQkoMHgxYzEgPDwgMikKKyNkZWZpbmUgQ01OX0RJQUdfUExMMF9PVlJECQkoMHgxYzIgPDwgMikKKyNkZWZpbmUgQ01OX0RJQUdfUExMMF9WMklfVFVORQkJKDB4MWM1IDw8IDIpCisjZGVmaW5lIENNTl9ESUFHX1BMTDBfQ1BfVFVORQkJKDB4MWM2IDw8IDIpCisjZGVmaW5lIENNTl9ESUFHX1BMTDBfTEZfUFJPRwkJKDB4MWM3IDw8IDIpCisjZGVmaW5lIENNTl9ESUFHX1BMTDFfRkJIX09WUkQJCSgweDFkMCA8PCAyKQorI2RlZmluZSBDTU5fRElBR19QTEwxX0ZCTF9PVlJECQkoMHgxZDEgPDwgMikKKyNkZWZpbmUgQ01OX0RJQUdfUExMMV9PVlJECQkoMHgxZDIgPDwgMikKKyNkZWZpbmUgQ01OX0RJQUdfUExMMV9WMklfVFVORQkJKDB4MWQ1IDw8IDIpCisjZGVmaW5lIENNTl9ESUFHX1BMTDFfQ1BfVFVORQkJKDB4MWQ2IDw8IDIpCisjZGVmaW5lIENNTl9ESUFHX1BMTDFfTEZfUFJPRwkJKDB4MWQ3IDw8IDIpCisjZGVmaW5lIENNTl9ESUFHX1BMTDFfUFRBVElTX1RVTkUxCSgweDFkOCA8PCAyKQorI2RlZmluZSBDTU5fRElBR19QTEwxX1BUQVRJU19UVU5FMgkoMHgxZDkgPDwgMikKKyNkZWZpbmUgQ01OX0RJQUdfUExMMV9JTkNMS19DVFJMCSgweDFkYSA8PCAyKQorI2RlZmluZSBDTU5fRElBR19IU0NMS19TRUwJCSgweDFlMCA8PCAyKQorCisjZGVmaW5lIFhDVlJfUFNNX1JDVFJMKG4pCQkoKDB4NDAwMSB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFhDVlJfUFNNX0NBTF9UTVIobikJCSgoMHg0MDAyIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgWENWUl9QU01fQTBJTl9UTVIobikJCSgoMHg0MDAzIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgVFhfVFhDQ19DQUxfU0NMUl9NVUxUKG4pCSgoMHg0MDQ3IHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgVFhfVFhDQ19DUE9TVF9NVUxUXzAwKG4pCSgoMHg0MDRjIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgVFhfVFhDQ19DUE9TVF9NVUxUXzAxKG4pCSgoMHg0MDRkIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgVFhfVFhDQ19DUE9TVF9NVUxUXzEwKG4pCSgoMHg0MDRlIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgVFhfVFhDQ19DUE9TVF9NVUxUXzExKG4pCSgoMHg0MDRmIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgVFhfVFhDQ19NR05GU19NVUxUXzAwMChuKQkoKDB4NDA1MCB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFRYX1RYQ0NfTUdORlNfTVVMVF8wMDEobikJKCgweDQwNTEgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9UWENDX01HTkZTX01VTFRfMDEwKG4pCSgoMHg0MDUyIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgVFhfVFhDQ19NR05GU19NVUxUXzAxMShuKQkoKDB4NDA1MyB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFRYX1RYQ0NfTUdORlNfTVVMVF8xMDAobikJKCgweDQwNTQgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9UWENDX01HTkZTX01VTFRfMTAxKG4pCSgoMHg0MDU1IHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgVFhfVFhDQ19NR05GU19NVUxUXzExMChuKQkoKDB4NDA1NiB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFRYX1RYQ0NfTUdORlNfTVVMVF8xMTEobikJKCgweDQwNTcgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBYQ1ZSX0RJQUdfUExMRFJDX0NUUkwobikJKCgweDQwZTAgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBYQ1ZSX0RJQUdfQklESV9DVFJMKG4pCQkoKDB4NDBlOCB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFhDVlJfRElBR19MQU5FX0ZDTV9FTl9NR04obikJKCgweDQwZjIgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9QU0NfQTAobikJCQkoKDB4NDEwMCB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFRYX1BTQ19BMShuKQkJCSgoMHg0MTAxIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgVFhfUFNDX0EyKG4pCQkJKCgweDQxMDIgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9QU0NfQTMobikJCQkoKDB4NDEwMyB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFRYX1JDVkRFVF9DVFJMKG4pCQkoKDB4NDEyMCB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFRYX1JDVkRFVF9FTl9UTVIobikJCSgoMHg0MTIyIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgVFhfUkNWREVUX1NUX1RNUihuKQkJKCgweDQxMjMgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9ESUFHX1RYX0RSVihuKQkJKCgweDQxZTEgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9ESUFHX0JHUkVGX1BSRURSVl9ERUxBWQkoMHg0MWU3IDw8IDIpCisjZGVmaW5lIFRYX0FOQV9DVFJMX1JFR18xCQkoMHg1MDIwIDw8IDIpCisjZGVmaW5lIFRYX0FOQV9DVFJMX1JFR18yCQkoMHg1MDIxIDw8IDIpCisjZGVmaW5lIFRYREFfQ09FRkZfQ0FMQ19DVFJMCQkoMHg1MDIyIDw8IDIpCisjZGVmaW5lIFRYX0RJR19DVFJMX1JFR18yCQkoMHg1MDI0IDw8IDIpCisjZGVmaW5lIFRYREFfQ1lBX0FVWERBX0NZQQkJKDB4NTAyNSA8PCAyKQorI2RlZmluZSBUWF9BTkFfQ1RSTF9SRUdfMwkJKDB4NTAyNiA8PCAyKQorI2RlZmluZSBUWF9BTkFfQ1RSTF9SRUdfNAkJKDB4NTAyNyA8PCAyKQorI2RlZmluZSBUWF9BTkFfQ1RSTF9SRUdfNQkJKDB4NTAyOSA8PCAyKQorCisjZGVmaW5lIFJYX1BTQ19BMChuKQkJCSgoMHg4MDAwIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgUlhfUFNDX0ExKG4pCQkJKCgweDgwMDEgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBSWF9QU0NfQTIobikJCQkoKDB4ODAwMiB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFJYX1BTQ19BMyhuKQkJCSgoMHg4MDAzIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgUlhfUFNDX0NBTChuKQkJCSgoMHg4MDA2IHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgUlhfUFNDX1JEWShuKQkJCSgoMHg4MDA3IHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgUlhfSVFQSV9JTExfQ0FMX09WUkQJCSgweDgwMjMgPDwgMikKKyNkZWZpbmUgUlhfRVBJX0lMTF9DQUxfT1ZSRAkJKDB4ODAzMyA8PCAyKQorI2RlZmluZSBSWF9TRENBTDBfT1ZSRAkJCSgweDgwNDEgPDwgMikKKyNkZWZpbmUgUlhfU0RDQUwxX09WUkQJCQkoMHg4MDQ5IDw8IDIpCisjZGVmaW5lIFJYX1NMQ19JTklUCQkJKDB4ODA2ZCA8PCAyKQorI2RlZmluZSBSWF9TTENfUlVOCQkJKDB4ODA2ZSA8PCAyKQorI2RlZmluZSBSWF9DRFJMRl9DTkZHMgkJCSgweDgwODEgPDwgMikKKyNkZWZpbmUgUlhfU0lHREVUX0hMX0ZJTFRfVE1SKG4pCSgoMHg4MDkwIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgUlhfU0xDX0lPUDBfT1ZSRAkJKDB4ODEwMSA8PCAyKQorI2RlZmluZSBSWF9TTENfSU9QMV9PVlJECQkoMHg4MTA1IDw8IDIpCisjZGVmaW5lIFJYX1NMQ19RT1AwX09WUkQJCSgweDgxMDkgPDwgMikKKyNkZWZpbmUgUlhfU0xDX1FPUDFfT1ZSRAkJKDB4ODEwZCA8PCAyKQorI2RlZmluZSBSWF9TTENfRU9QMF9PVlJECQkoMHg4MTExIDw8IDIpCisjZGVmaW5lIFJYX1NMQ19FT1AxX09WUkQJCSgweDgxMTUgPDwgMikKKyNkZWZpbmUgUlhfU0xDX0lPTjBfT1ZSRAkJKDB4ODExOSA8PCAyKQorI2RlZmluZSBSWF9TTENfSU9OMV9PVlJECQkoMHg4MTFkIDw8IDIpCisjZGVmaW5lIFJYX1NMQ19RT04wX09WUkQJCSgweDgxMjEgPDwgMikKKyNkZWZpbmUgUlhfU0xDX1FPTjFfT1ZSRAkJKDB4ODEyNSA8PCAyKQorI2RlZmluZSBSWF9TTENfRU9OMF9PVlJECQkoMHg4MTI5IDw8IDIpCisjZGVmaW5lIFJYX1NMQ19FT04xX09WUkQJCSgweDgxMmQgPDwgMikKKyNkZWZpbmUgUlhfU0xDX0lFUDBfT1ZSRAkJKDB4ODEzMSA8PCAyKQorI2RlZmluZSBSWF9TTENfSUVQMV9PVlJECQkoMHg4MTM1IDw8IDIpCisjZGVmaW5lIFJYX1NMQ19RRVAwX09WUkQJCSgweDgxMzkgPDwgMikKKyNkZWZpbmUgUlhfU0xDX1FFUDFfT1ZSRAkJKDB4ODEzZCA8PCAyKQorI2RlZmluZSBSWF9TTENfRUVQMF9PVlJECQkoMHg4MTQxIDw8IDIpCisjZGVmaW5lIFJYX1NMQ19FRVAxX09WUkQJCSgweDgxNDUgPDwgMikKKyNkZWZpbmUgUlhfU0xDX0lFTjBfT1ZSRAkJKDB4ODE0OSA8PCAyKQorI2RlZmluZSBSWF9TTENfSUVOMV9PVlJECQkoMHg4MTRkIDw8IDIpCisjZGVmaW5lIFJYX1NMQ19RRU4wX09WUkQJCSgweDgxNTEgPDwgMikKKyNkZWZpbmUgUlhfU0xDX1FFTjFfT1ZSRAkJKDB4ODE1NSA8PCAyKQorI2RlZmluZSBSWF9TTENfRUVOMF9PVlJECQkoMHg4MTU5IDw8IDIpCisjZGVmaW5lIFJYX1NMQ19FRU4xX09WUkQJCSgweDgxNWQgPDwgMikKKyNkZWZpbmUgUlhfUkVFX0NUUkxfREFUQV9NQVNLKG4pCSgoMHg4MWJiIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgUlhfRElBR19TSUdERVRfVFVORShuKQkJKCgweDgxZGMgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBSWF9ESUFHX1NDMkNfREVMQVkJCSgweDgxZTEgPDwgMikKKworI2RlZmluZSBQTUFfTEFORV9DRkcJCQkoMHhjMDAwIDw8IDIpCisjZGVmaW5lIFBJUEVfQ01OX0NUUkwxCQkJKDB4YzAwMSA8PCAyKQorI2RlZmluZSBQSVBFX0NNTl9DVFJMMgkJCSgweGMwMDIgPDwgMikKKyNkZWZpbmUgUElQRV9DT01fTE9DS19DRkcxCQkoMHhjMDAzIDw8IDIpCisjZGVmaW5lIFBJUEVfQ09NX0xPQ0tfQ0ZHMgkJKDB4YzAwNCA8PCAyKQorI2RlZmluZSBQSVBFX1JDVl9ERVRfSU5ICQkoMHhjMDA1IDw8IDIpCisjZGVmaW5lIERQX01PREVfQ1RMCQkJKDB4YzAwOCA8PCAyKQorI2RlZmluZSBEUF9DTEtfQ1RMCQkJKDB4YzAwOSA8PCAyKQorI2RlZmluZSBTVFMJCQkJKDB4YzAwRiA8PCAyKQorI2RlZmluZSBQSFlfSVNPX0NNTl9DVFJMCQkoMHhjMDEwIDw8IDIpCisjZGVmaW5lIFBIWV9EUF9UWF9DVEwJCQkoMHhjNDA4IDw8IDIpCisjZGVmaW5lIFBNQV9DTU5fQ1RSTDEJCQkoMHhjODAwIDw8IDIpCisjZGVmaW5lIFBIWV9QTUFfSVNPX0NNTl9DVFJMCQkoMHhjODEwIDw8IDIpCisjZGVmaW5lIFBIWV9JU09MQVRJT05fQ1RSTAkJKDB4YzgxZiA8PCAyKQorI2RlZmluZSBQSFlfUE1BX0lTT19YQ1ZSX0NUUkwobikJKCgweGNjMTEgfCAoKG4pIDw8IDYpKSA8PCAyKQorI2RlZmluZSBQSFlfUE1BX0lTT19MSU5LX01PREUobikJKCgweGNjMTIgfCAoKG4pIDw8IDYpKSA8PCAyKQorI2RlZmluZSBQSFlfUE1BX0lTT19QV1JTVF9DVFJMKG4pCSgoMHhjYzEzIHwgKChuKSA8PCA2KSkgPDwgMikKKyNkZWZpbmUgUEhZX1BNQV9JU09fVFhfREFUQV9MTyhuKQkoKDB4Y2MxNCB8ICgobikgPDwgNikpIDw8IDIpCisjZGVmaW5lIFBIWV9QTUFfSVNPX1RYX0RBVEFfSEkobikJKCgweGNjMTUgfCAoKG4pIDw8IDYpKSA8PCAyKQorI2RlZmluZSBQSFlfUE1BX0lTT19SWF9EQVRBX0xPKG4pCSgoMHhjYzE2IHwgKChuKSA8PCA2KSkgPDwgMikKKyNkZWZpbmUgUEhZX1BNQV9JU09fUlhfREFUQV9ISShuKQkoKDB4Y2MxNyB8ICgobikgPDwgNikpIDw8IDIpCisjZGVmaW5lIFRYX0JJU1RfQ1RSTChuKQkJCSgoMHg0MTQwIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgVFhfQklTVF9VRERXUihuKQkJKCgweDQxNDEgfCAoKG4pIDw8IDkpKSA8PCAyKQorCisvKgorICogU2VsZWN0cyB3aGljaCBQTEwgY2xvY2sgd2lsbCBiZSBkcml2ZW4gb24gdGhlIGFuYWxvZyBoaWdoIHNwZWVkCisgKiBjbG9jayAwOiBQTEwgMCBkaXYgMQorICogY2xvY2sgMTogUExMIDEgZGl2IDIKKyAqLworI2RlZmluZSBDTEtfUExMX0NPTkZJRwkJCTBYMzAKKyNkZWZpbmUgQ0xLX1BMTF9NQVNLCQkJMHgzMworCisjZGVmaW5lIENNTl9SRUFEWQkJCUJJVCgwKQorCisjZGVmaW5lIERQX1BMTF9DTE9DS19FTkFCTEUJCUJJVCgyKQorI2RlZmluZSBEUF9QTExfRU5BQkxFCQkJQklUKDApCisjZGVmaW5lIERQX1BMTF9EQVRBX1JBVEVfUkJSCQkoKDIgPDwgMTIpIHwgKDQgPDwgOCkpCisjZGVmaW5lIERQX1BMTF9EQVRBX1JBVEVfSEJSCQkoKDIgPDwgMTIpIHwgKDQgPDwgOCkpCisjZGVmaW5lIERQX1BMTF9EQVRBX1JBVEVfSEJSMgkJKCgxIDw8IDEyKSB8ICgyIDw8IDgpKQorCisjZGVmaW5lIERQX01PREVfQTAJCQlCSVQoNCkKKyNkZWZpbmUgRFBfTU9ERV9BMgkJCUJJVCg2KQorI2RlZmluZSBEUF9NT0RFX0VOVEVSX0EwCQkweGMxMDEKKyNkZWZpbmUgRFBfTU9ERV9FTlRFUl9BMgkJMHhjMTA0CisKKyNkZWZpbmUgUEhZX01PREVfU0VUX1RJTUVPVVQJCTEwMDAwMAorCisjZGVmaW5lIFBJTl9BU1NJR05fQ19FCQkJMHg1MWQ5CisjZGVmaW5lIFBJTl9BU1NJR05fRF9GCQkJMHg1MTAwCisKKyNkZWZpbmUgTU9ERV9ESVNDT05ORUNUCQkJMAorI2RlZmluZSBNT0RFX1VGUF9VU0IJCQlCSVQoMCkKKyNkZWZpbmUgTU9ERV9ERlBfVVNCCQkJQklUKDEpCisjZGVmaW5lIE1PREVfREZQX0RQCQkJQklUKDIpCisKK3N0cnVjdCB1c2IzcGh5X3JlZyB7CisJdTMyIG9mZnNldDsKKwl1MzIgZW5hYmxlX2JpdDsKKwl1MzIgd3JpdGVfZW5hYmxlOworfTsKKworc3RydWN0IHJvY2tjaGlwX3VzYjNwaHlfcG9ydF9jZmcgeworCXN0cnVjdCB1c2IzcGh5X3JlZyB0eXBlY19jb25uX2RpcjsKKwlzdHJ1Y3QgdXNiM3BoeV9yZWcgdXNiM3RvdXNiMl9lbjsKKwlzdHJ1Y3QgdXNiM3BoeV9yZWcgZXh0ZXJuYWxfcHNtOworCXN0cnVjdCB1c2IzcGh5X3JlZyBwaXBlX3N0YXR1czsKK307CisKK3N0cnVjdCByb2NrY2hpcF90eXBlY19waHkgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJc3RydWN0IGV4dGNvbl9kZXYgKmV4dGNvbjsKKwlzdHJ1Y3QgcmVnbWFwICpncmZfcmVnczsKKwlzdHJ1Y3QgY2xrICpjbGtfY29yZTsKKwlzdHJ1Y3QgY2xrICpjbGtfcmVmOworCXN0cnVjdCByZXNldF9jb250cm9sICp1cGh5X3JzdDsKKwlzdHJ1Y3QgcmVzZXRfY29udHJvbCAqcGlwZV9yc3Q7CisJc3RydWN0IHJlc2V0X2NvbnRyb2wgKnRjcGh5X3JzdDsKKwlzdHJ1Y3Qgcm9ja2NoaXBfdXNiM3BoeV9wb3J0X2NmZyBwb3J0X2NmZ3M7CisJLyogbXV0ZXggdG8gcHJvdGVjdCBhY2Nlc3MgdG8gaW5kaXZpZHVhbCBQSFlzICovCisJc3RydWN0IG11dGV4IGxvY2s7CisKKwlib29sIGZsaXA7CisJdTggbW9kZTsKK307CisKK3N0cnVjdCBwaHlfcmVnIHsKKwl1MTYgdmFsdWU7CisJdTMyIGFkZHI7Cit9OworCitzdHJ1Y3QgcGh5X3JlZyB1c2IzX3BsbF9jZmdbXSA9IHsKKwl7IDB4ZjAsCQlDTU5fUExMMF9WQ09DQUxfSU5JVCB9LAorCXsgMHgxOCwJCUNNTl9QTEwwX1ZDT0NBTF9JVEVSIH0sCisJeyAweGQwLAkJQ01OX1BMTDBfSU5URElWIH0sCisJeyAweDRhNGEsCUNNTl9QTEwwX0ZSQUNESVYgfSwKKwl7IDB4MzQsCQlDTU5fUExMMF9ISUdIX1RIUiB9LAorCXsgMHgxZWUsCUNNTl9QTEwwX1NTX0NUUkwxIH0sCisJeyAweDdmMDMsCUNNTl9QTEwwX1NTX0NUUkwyIH0sCisJeyAweDIwLAkJQ01OX1BMTDBfRFNNX0RJQUcgfSwKKwl7IDAsCQlDTU5fRElBR19QTEwwX09WUkQgfSwKKwl7IDAsCQlDTU5fRElBR19QTEwwX0ZCSF9PVlJEIH0sCisJeyAwLAkJQ01OX0RJQUdfUExMMF9GQkxfT1ZSRCB9LAorCXsgMHg3LAkJQ01OX0RJQUdfUExMMF9WMklfVFVORSB9LAorCXsgMHg0NSwJCUNNTl9ESUFHX1BMTDBfQ1BfVFVORSB9LAorCXsgMHg4LAkJQ01OX0RJQUdfUExMMF9MRl9QUk9HIH0sCit9OworCitzdHJ1Y3QgcGh5X3JlZyBkcF9wbGxfY2ZnW10gPSB7CisJeyAweGYwLAkJQ01OX1BMTDFfVkNPQ0FMX0lOSVQgfSwKKwl7IDB4MTgsCQlDTU5fUExMMV9WQ09DQUxfSVRFUiB9LAorCXsgMHgzMGI5LAlDTU5fUExMMV9WQ09DQUxfU1RBUlQgfSwKKwl7IDB4MjFjLAlDTU5fUExMMV9JTlRESVYgfSwKKwl7IDAsCQlDTU5fUExMMV9GUkFDRElWIH0sCisJeyAweDUsCQlDTU5fUExMMV9ISUdIX1RIUiB9LAorCXsgMHgzNSwJCUNNTl9QTEwxX1NTX0NUUkwxIH0sCisJeyAweDdmMWUsCUNNTl9QTEwxX1NTX0NUUkwyIH0sCisJeyAweDIwLAkJQ01OX1BMTDFfRFNNX0RJQUcgfSwKKwl7IDAsCQlDTU5fUExMU00xX1VTRVJfREVGX0NUUkwgfSwKKwl7IDAsCQlDTU5fRElBR19QTEwxX09WUkQgfSwKKwl7IDAsCQlDTU5fRElBR19QTEwxX0ZCSF9PVlJEIH0sCisJeyAwLAkJQ01OX0RJQUdfUExMMV9GQkxfT1ZSRCB9LAorCXsgMHg2LAkJQ01OX0RJQUdfUExMMV9WMklfVFVORSB9LAorCXsgMHg0NSwJCUNNTl9ESUFHX1BMTDFfQ1BfVFVORSB9LAorCXsgMHg4LAkJQ01OX0RJQUdfUExMMV9MRl9QUk9HIH0sCisJeyAweDEwMCwJQ01OX0RJQUdfUExMMV9QVEFUSVNfVFVORTEgfSwKKwl7IDB4NywJCUNNTl9ESUFHX1BMTDFfUFRBVElTX1RVTkUyIH0sCisJeyAweDQsCQlDTU5fRElBR19QTEwxX0lOQ0xLX0NUUkwgfSwKK307CisKK3N0YXRpYyB2b2lkIHRjcGh5X2NmZ18yNG0oc3RydWN0IHJvY2tjaGlwX3R5cGVjX3BoeSAqdGNwaHkpCit7CisJdTMyIGksIHJkYXRhOworCisJLyoKKwkgKiBjbW5fcmVmX2Nsa19zZWwgPSAzLCBzZWxlY3QgdGhlIDI0TWh6IGZvciBjbGsgcGFyZW50CisJICogY21uX3BzbV9jbGtfZGlnX2RpdiA9IDIsIHNldCB0aGUgY2xrIGRpdmlzaW9uIHRvIDIKKwkgKi8KKwl3cml0ZWwoMHg4MzAsIHRjcGh5LT5iYXNlICsgUE1BX0NNTl9DVFJMMSk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkvKgorCQkgKiBUaGUgZm9sbG93aW5nIFBIWSBjb25maWd1cmF0aW9uIGFzc3VtZXMgYSAyNCBNSHogcmVmZXJlbmNlCisJCSAqIGNsb2NrLgorCQkgKi8KKwkJd3JpdGVsKDB4OTAsIHRjcGh5LT5iYXNlICsgWENWUl9ESUFHX0xBTkVfRkNNX0VOX01HTihpKSk7CisJCXdyaXRlbCgweDk2MCwgdGNwaHktPmJhc2UgKyBUWF9SQ1ZERVRfRU5fVE1SKGkpKTsKKwkJd3JpdGVsKDB4MzAsIHRjcGh5LT5iYXNlICsgVFhfUkNWREVUX1NUX1RNUihpKSk7CisJfQorCisJcmRhdGEgPSByZWFkbCh0Y3BoeS0+YmFzZSArIENNTl9ESUFHX0hTQ0xLX1NFTCk7CisJcmRhdGEgJj0gfkNMS19QTExfTUFTSzsKKwlyZGF0YSB8PSBDTEtfUExMX0NPTkZJRzsKKwl3cml0ZWwocmRhdGEsIHRjcGh5LT5iYXNlICsgQ01OX0RJQUdfSFNDTEtfU0VMKTsKK30KKworc3RhdGljIHZvaWQgdGNwaHlfY2ZnX3VzYjNfcGxsKHN0cnVjdCByb2NrY2hpcF90eXBlY19waHkgKnRjcGh5KQoreworCXUzMiBpOworCisJLyogbG9hZCB0aGUgY29uZmlndXJhdGlvbiBvZiBQTEwwICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodXNiM19wbGxfY2ZnKTsgaSsrKQorCQl3cml0ZWwodXNiM19wbGxfY2ZnW2ldLnZhbHVlLAorCQkgICAgICAgdGNwaHktPmJhc2UgKyB1c2IzX3BsbF9jZmdbaV0uYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIHRjcGh5X2NmZ19kcF9wbGwoc3RydWN0IHJvY2tjaGlwX3R5cGVjX3BoeSAqdGNwaHkpCit7CisJdTMyIGk7CisKKwkvKiBzZXQgdGhlIGRlZmF1bHQgbW9kZSB0byBSQlIgKi8KKwl3cml0ZWwoRFBfUExMX0NMT0NLX0VOQUJMRSB8IERQX1BMTF9FTkFCTEUgfCBEUF9QTExfREFUQV9SQVRFX1JCUiwKKwkgICAgICAgdGNwaHktPmJhc2UgKyBEUF9DTEtfQ1RMKTsKKworCS8qIGxvYWQgdGhlIGNvbmZpZ3VyYXRpb24gb2YgUExMMSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRwX3BsbF9jZmcpOyBpKyspCisJCXdyaXRlbChkcF9wbGxfY2ZnW2ldLnZhbHVlLCB0Y3BoeS0+YmFzZSArIGRwX3BsbF9jZmdbaV0uYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIHRjcGh5X3R4X3VzYjNfY2ZnX2xhbmUoc3RydWN0IHJvY2tjaGlwX3R5cGVjX3BoeSAqdGNwaHksIHUzMiBsYW5lKQoreworCXdyaXRlbCgweDc3OTksIHRjcGh5LT5iYXNlICsgVFhfUFNDX0EwKGxhbmUpKTsKKwl3cml0ZWwoMHg3Nzk4LCB0Y3BoeS0+YmFzZSArIFRYX1BTQ19BMShsYW5lKSk7CisJd3JpdGVsKDB4NTA5OCwgdGNwaHktPmJhc2UgKyBUWF9QU0NfQTIobGFuZSkpOworCXdyaXRlbCgweDUwOTgsIHRjcGh5LT5iYXNlICsgVFhfUFNDX0EzKGxhbmUpKTsKKwl3cml0ZWwoMCwgdGNwaHktPmJhc2UgKyBUWF9UWENDX01HTkZTX01VTFRfMDAwKGxhbmUpKTsKKwl3cml0ZWwoMHhiZiwgdGNwaHktPmJhc2UgKyBYQ1ZSX0RJQUdfQklESV9DVFJMKGxhbmUpKTsKK30KKworc3RhdGljIHZvaWQgdGNwaHlfcnhfdXNiM19jZmdfbGFuZShzdHJ1Y3Qgcm9ja2NoaXBfdHlwZWNfcGh5ICp0Y3BoeSwgdTMyIGxhbmUpCit7CisJd3JpdGVsKDB4YTZmZCwgdGNwaHktPmJhc2UgKyBSWF9QU0NfQTAobGFuZSkpOworCXdyaXRlbCgweGE2ZmQsIHRjcGh5LT5iYXNlICsgUlhfUFNDX0ExKGxhbmUpKTsKKwl3cml0ZWwoMHhhNDEwLCB0Y3BoeS0+YmFzZSArIFJYX1BTQ19BMihsYW5lKSk7CisJd3JpdGVsKDB4MjQxMCwgdGNwaHktPmJhc2UgKyBSWF9QU0NfQTMobGFuZSkpOworCXdyaXRlbCgweDIzZmYsIHRjcGh5LT5iYXNlICsgUlhfUFNDX0NBTChsYW5lKSk7CisJd3JpdGVsKDB4MTMsIHRjcGh5LT5iYXNlICsgUlhfU0lHREVUX0hMX0ZJTFRfVE1SKGxhbmUpKTsKKwl3cml0ZWwoMHgwM2U3LCB0Y3BoeS0+YmFzZSArIFJYX1JFRV9DVFJMX0RBVEFfTUFTSyhsYW5lKSk7CisJd3JpdGVsKDB4MTAwNCwgdGNwaHktPmJhc2UgKyBSWF9ESUFHX1NJR0RFVF9UVU5FKGxhbmUpKTsKKwl3cml0ZWwoMHgyMDEwLCB0Y3BoeS0+YmFzZSArIFJYX1BTQ19SRFkobGFuZSkpOworCXdyaXRlbCgweGZiLCB0Y3BoeS0+YmFzZSArIFhDVlJfRElBR19CSURJX0NUUkwobGFuZSkpOworfQorCitzdGF0aWMgdm9pZCB0Y3BoeV9kcF9jZmdfbGFuZShzdHJ1Y3Qgcm9ja2NoaXBfdHlwZWNfcGh5ICp0Y3BoeSwgdTMyIGxhbmUpCit7CisJdTE2IHJkYXRhOworCisJd3JpdGVsKDB4YmVmYywgdGNwaHktPmJhc2UgKyBYQ1ZSX1BTTV9SQ1RSTChsYW5lKSk7CisJd3JpdGVsKDB4Njc5OSwgdGNwaHktPmJhc2UgKyBUWF9QU0NfQTAobGFuZSkpOworCXdyaXRlbCgweDY3OTgsIHRjcGh5LT5iYXNlICsgVFhfUFNDX0ExKGxhbmUpKTsKKwl3cml0ZWwoMHg5OCwgdGNwaHktPmJhc2UgKyBUWF9QU0NfQTIobGFuZSkpOworCXdyaXRlbCgweDk4LCB0Y3BoeS0+YmFzZSArIFRYX1BTQ19BMyhsYW5lKSk7CisKKwl3cml0ZWwoMCwgdGNwaHktPmJhc2UgKyBUWF9UWENDX01HTkZTX01VTFRfMDAwKGxhbmUpKTsKKwl3cml0ZWwoMCwgdGNwaHktPmJhc2UgKyBUWF9UWENDX01HTkZTX01VTFRfMDAxKGxhbmUpKTsKKwl3cml0ZWwoMCwgdGNwaHktPmJhc2UgKyBUWF9UWENDX01HTkZTX01VTFRfMDEwKGxhbmUpKTsKKwl3cml0ZWwoMCwgdGNwaHktPmJhc2UgKyBUWF9UWENDX01HTkZTX01VTFRfMDExKGxhbmUpKTsKKwl3cml0ZWwoMCwgdGNwaHktPmJhc2UgKyBUWF9UWENDX01HTkZTX01VTFRfMTAwKGxhbmUpKTsKKwl3cml0ZWwoMCwgdGNwaHktPmJhc2UgKyBUWF9UWENDX01HTkZTX01VTFRfMTAxKGxhbmUpKTsKKwl3cml0ZWwoMCwgdGNwaHktPmJhc2UgKyBUWF9UWENDX01HTkZTX01VTFRfMTEwKGxhbmUpKTsKKwl3cml0ZWwoMCwgdGNwaHktPmJhc2UgKyBUWF9UWENDX01HTkZTX01VTFRfMTExKGxhbmUpKTsKKwl3cml0ZWwoMCwgdGNwaHktPmJhc2UgKyBUWF9UWENDX0NQT1NUX01VTFRfMTAobGFuZSkpOworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfQ1BPU1RfTVVMVF8wMShsYW5lKSk7CisJd3JpdGVsKDAsIHRjcGh5LT5iYXNlICsgVFhfVFhDQ19DUE9TVF9NVUxUXzAwKGxhbmUpKTsKKwl3cml0ZWwoMCwgdGNwaHktPmJhc2UgKyBUWF9UWENDX0NQT1NUX01VTFRfMTEobGFuZSkpOworCisJd3JpdGVsKDB4MTI4LCB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfQ0FMX1NDTFJfTVVMVChsYW5lKSk7CisJd3JpdGVsKDB4NDAwLCB0Y3BoeS0+YmFzZSArIFRYX0RJQUdfVFhfRFJWKGxhbmUpKTsKKworCXJkYXRhID0gcmVhZGwodGNwaHktPmJhc2UgKyBYQ1ZSX0RJQUdfUExMRFJDX0NUUkwobGFuZSkpOworCXJkYXRhID0gKHJkYXRhICYgMHg4ZmZmKSB8IDB4NjAwMDsKKwl3cml0ZWwocmRhdGEsIHRjcGh5LT5iYXNlICsgWENWUl9ESUFHX1BMTERSQ19DVFJMKGxhbmUpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJvcGVydHlfZW5hYmxlKHN0cnVjdCByb2NrY2hpcF90eXBlY19waHkgKnRjcGh5LAorCQkJCSAgY29uc3Qgc3RydWN0IHVzYjNwaHlfcmVnICpyZWcsIGJvb2wgZW4pCit7CisJdTMyIG1hc2sgPSAxIDw8IHJlZy0+d3JpdGVfZW5hYmxlOworCXUzMiB2YWwgPSBlbiA8PCByZWctPmVuYWJsZV9iaXQ7CisKKwlyZXR1cm4gcmVnbWFwX3dyaXRlKHRjcGh5LT5ncmZfcmVncywgcmVnLT5vZmZzZXQsIHZhbCB8IG1hc2spOworfQorCitzdGF0aWMgdm9pZCB0Y3BoeV9kcF9hdXhfY2FsaWJyYXRpb24oc3RydWN0IHJvY2tjaGlwX3R5cGVjX3BoeSAqdGNwaHkpCit7CisJdTE2IHJkYXRhLCByZGF0YTIsIHZhbDsKKworCS8qIGRpc2FibGUgdHhkYV9jYWxfbGF0Y2hfZW4gZm9yIHJld3JpdGUgdGhlIGNhbGlicmF0aW9uIHZhbHVlcyAqLworCXJkYXRhID0gcmVhZGwodGNwaHktPmJhc2UgKyBUWF9BTkFfQ1RSTF9SRUdfMSk7CisJdmFsID0gcmRhdGEgJiAweGRmZmY7CisJd3JpdGVsKHZhbCwgdGNwaHktPmJhc2UgKyBUWF9BTkFfQ1RSTF9SRUdfMSk7CisKKwkvKgorCSAqIHJlYWQgYSByZXNpc3RvciBjYWxpYnJhdGlvbiBjb2RlIGZyb20gQ01OX1RYUFVDQUxfQ1RSTFs2OjBdIGFuZAorCSAqIHdyaXRlIGl0IHRvIFRYX0RJR19DVFJMX1JFR18yWzY6MF0sIGFuZCBkZWxheSAxbXMgdG8gbWFrZSBzdXJlIGl0CisJICogd29ya3MuCisJICovCisJcmRhdGEgPSByZWFkbCh0Y3BoeS0+YmFzZSArIFRYX0RJR19DVFJMX1JFR18yKTsKKwlyZGF0YSA9IHJkYXRhICYgMHhmZmMwOworCisJcmRhdGEyID0gcmVhZGwodGNwaHktPmJhc2UgKyBDTU5fVFhQVUNBTF9DVFJMKTsKKwlyZGF0YTIgPSByZGF0YTIgJiAweDNmOworCisJdmFsID0gcmRhdGEgfCByZGF0YTI7CisJd3JpdGVsKHZhbCwgdGNwaHktPmJhc2UgKyBUWF9ESUdfQ1RSTF9SRUdfMik7CisJdXNsZWVwX3JhbmdlKDEwMDAsIDEwNTApOworCisJLyoKKwkgKiBFbmFibGUgc2lnbmFsIGZvciBsYXRjaCB0aGF0IHNhbXBsZSBhbmQgaG9sZHMgY2FsaWJyYXRpb24gdmFsdWVzLgorCSAqIEFjdGl2YXRlIHRoaXMgc2lnbmFsIGZvciAxIGNsb2NrIGN5Y2xlIHRvIHNhbXBsZSBuZXcgY2FsaWJyYXRpb24KKwkgKiB2YWx1ZXMuCisJICovCisJcmRhdGEgPSByZWFkbCh0Y3BoeS0+YmFzZSArIFRYX0FOQV9DVFJMX1JFR18xKTsKKwl2YWwgPSByZGF0YSB8IDB4MjAwMDsKKwl3cml0ZWwodmFsLCB0Y3BoeS0+YmFzZSArIFRYX0FOQV9DVFJMX1JFR18xKTsKKwl1c2xlZXBfcmFuZ2UoMTUwLCAyMDApOworCisJLyogc2V0IFRYIFZvbHRhZ2UgTGV2ZWwgYW5kIFRYIERlZW1waGFzaXMgdG8gMCAqLworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFBIWV9EUF9UWF9DVEwpOworCS8qIHJlLWVuYWJsZSBkZWNhcCAqLworCXdyaXRlbCgweDEwMCwgdGNwaHktPmJhc2UgKyBUWF9BTkFfQ1RSTF9SRUdfMik7CisJd3JpdGVsKDB4MzAwLCB0Y3BoeS0+YmFzZSArIFRYX0FOQV9DVFJMX1JFR18yKTsKKwl3cml0ZWwoMHgyMDA4LCB0Y3BoeS0+YmFzZSArIFRYX0FOQV9DVFJMX1JFR18xKTsKKwl3cml0ZWwoMHgyMDE4LCB0Y3BoeS0+YmFzZSArIFRYX0FOQV9DVFJMX1JFR18xKTsKKworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX0FOQV9DVFJMX1JFR181KTsKKworCS8qCisJICogUHJvZ3JhbXMgdHhkYV9kcnZfbGRvX3Byb2dbMTU6MF0sIFNldHMgZHJpdmVyIExETworCSAqIHZvbHRhZ2UgMTYnaDEwMDEgZm9yIERQLUFVWC1UWCBhbmQgUlgKKwkgKi8KKwl3cml0ZWwoMHgxMDAxLCB0Y3BoeS0+YmFzZSArIFRYX0FOQV9DVFJMX1JFR180KTsKKworCS8qIHJlLWVuYWJsZXMgQmFuZGdhcCByZWZlcmVuY2UgZm9yIExETyAqLworCXdyaXRlbCgweDIwOTgsIHRjcGh5LT5iYXNlICsgVFhfQU5BX0NUUkxfUkVHXzEpOworCXdyaXRlbCgweDIxOTgsIHRjcGh5LT5iYXNlICsgVFhfQU5BX0NUUkxfUkVHXzEpOworCisJLyoKKwkgKiByZS1lbmFibGVzIHRoZSB0cmFuc21pdHRlciBwcmUtZHJpdmVyLCBkcml2ZXIgZGF0YSBzZWxlY3Rpb24gTVVYLAorCSAqIGFuZCByZWNlaXZlciBkZXRlY3QgY2lyY3VpdHMuCisJICovCisJd3JpdGVsKDB4MzAxLCB0Y3BoeS0+YmFzZSArIFRYX0FOQV9DVFJMX1JFR18yKTsKKwl3cml0ZWwoMHgzMDMsIHRjcGh5LT5iYXNlICsgVFhfQU5BX0NUUkxfUkVHXzIpOworCisJLyoKKwkgKiBCSVQgMTI6IENvbnRyb2xzIGF1eGRhX3BvbGFyaXR5LCB3aGljaCBzZWxlY3RzIHRoZSBwb2xhcml0eSBvZiB0aGUKKwkgKiB4Y3ZyOgorCSAqIDEsIFJldmVyc2VzIHRoZSBwb2xhcml0eSAoSWYgVFlQRUMsIFB1bGxzIHVwcyBhdXhfcCBhbmQgcHVsbAorCSAqIGRvd24gYXV4X20pCisJICogMCwgTm9ybWFsIHBvbGFyaXR5IChpZiBUWVBFX0MsIHB1bGxzIHVwIGF1eF9tIGFuZCBwdWxscyBkb3duCisJICogYXV4X3ApCisJICovCisJdmFsID0gMHhhMDc4OworCWlmICghdGNwaHktPmZsaXApCisJCXZhbCB8PSBCSVQoMTIpOworCXdyaXRlbCh2YWwsIHRjcGh5LT5iYXNlICsgVFhfQU5BX0NUUkxfUkVHXzEpOworCisJd3JpdGVsKDAsIHRjcGh5LT5iYXNlICsgVFhfQU5BX0NUUkxfUkVHXzMpOworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX0FOQV9DVFJMX1JFR180KTsKKwl3cml0ZWwoMCwgdGNwaHktPmJhc2UgKyBUWF9BTkFfQ1RSTF9SRUdfNSk7CisKKwkvKgorCSAqIENvbnRyb2xzIGxvd19wb3dlcl9zd2luZ19lbiwgc2V0IHRoZSB2b2x0YWdlIHN3aW5nIG9mIHRoZSBkcml2ZXIKKwkgKiB0byA0MDBtdi4gVGhlIHZhbHVlcwliZWxvdyBhcmUgcGVhayB0byBwZWFrIChkaWZmZXJlbnRpYWwpIHZhbHVlcy4KKwkgKi8KKwl3cml0ZWwoNCwgdGNwaHktPmJhc2UgKyBUWERBX0NPRUZGX0NBTENfQ1RSTCk7CisJd3JpdGVsKDAsIHRjcGh5LT5iYXNlICsgVFhEQV9DWUFfQVVYREFfQ1lBKTsKKworCS8qIENvbnRyb2xzIHR4X2hpZ2hfel90bV9lbiAqLworCXZhbCA9IHJlYWRsKHRjcGh5LT5iYXNlICsgVFhfRElHX0NUUkxfUkVHXzIpOworCXZhbCB8PSBCSVQoMTUpOworCXdyaXRlbCh2YWwsIHRjcGh5LT5iYXNlICsgVFhfRElHX0NUUkxfUkVHXzIpOworfQorCitzdGF0aWMgaW50IHRjcGh5X3BoeV9pbml0KHN0cnVjdCByb2NrY2hpcF90eXBlY19waHkgKnRjcGh5LCB1OCBtb2RlKQoreworCXN0cnVjdCByb2NrY2hpcF91c2IzcGh5X3BvcnRfY2ZnICpjZmcgPSAmdGNwaHktPnBvcnRfY2ZnczsKKwlpbnQgcmV0LCBpOworCXUzMiB2YWw7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUodGNwaHktPmNsa19jb3JlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIodGNwaHktPmRldiwgIkZhaWxlZCB0byBwcmVwYXJlX2VuYWJsZSBjb3JlIGNsb2NrXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUodGNwaHktPmNsa19yZWYpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycih0Y3BoeS0+ZGV2LCAiRmFpbGVkIHRvIHByZXBhcmVfZW5hYmxlIHJlZiBjbG9ja1xuIik7CisJCWdvdG8gZXJyX2Nsa19jb3JlOworCX0KKworCXJlc2V0X2NvbnRyb2xfZGVhc3NlcnQodGNwaHktPnRjcGh5X3JzdCk7CisKKwlwcm9wZXJ0eV9lbmFibGUodGNwaHksICZjZmctPnR5cGVjX2Nvbm5fZGlyLCB0Y3BoeS0+ZmxpcCk7CisKKwl0Y3BoeV9jZmdfMjRtKHRjcGh5KTsKKworCWlmIChtb2RlID09IE1PREVfREZQX0RQKSB7CisJCXRjcGh5X2NmZ19kcF9wbGwodGNwaHkpOworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQkJdGNwaHlfZHBfY2ZnX2xhbmUodGNwaHksIGkpOworCisJCXdyaXRlbChQSU5fQVNTSUdOX0NfRSwgdGNwaHktPmJhc2UgKyBQTUFfTEFORV9DRkcpOworCX0gZWxzZSB7CisJCXRjcGh5X2NmZ191c2IzX3BsbCh0Y3BoeSk7CisJCXRjcGh5X2NmZ19kcF9wbGwodGNwaHkpOworCQlpZiAodGNwaHktPmZsaXApIHsKKwkJCXRjcGh5X3R4X3VzYjNfY2ZnX2xhbmUodGNwaHksIDMpOworCQkJdGNwaHlfcnhfdXNiM19jZmdfbGFuZSh0Y3BoeSwgMik7CisJCQl0Y3BoeV9kcF9jZmdfbGFuZSh0Y3BoeSwgMCk7CisJCQl0Y3BoeV9kcF9jZmdfbGFuZSh0Y3BoeSwgMSk7CisJCX0gZWxzZSB7CisJCQl0Y3BoeV90eF91c2IzX2NmZ19sYW5lKHRjcGh5LCAwKTsKKwkJCXRjcGh5X3J4X3VzYjNfY2ZnX2xhbmUodGNwaHksIDEpOworCQkJdGNwaHlfZHBfY2ZnX2xhbmUodGNwaHksIDIpOworCQkJdGNwaHlfZHBfY2ZnX2xhbmUodGNwaHksIDMpOworCQl9CisKKwkJd3JpdGVsKFBJTl9BU1NJR05fRF9GLCB0Y3BoeS0+YmFzZSArIFBNQV9MQU5FX0NGRyk7CisJfQorCisJd3JpdGVsKERQX01PREVfRU5URVJfQTIsIHRjcGh5LT5iYXNlICsgRFBfTU9ERV9DVEwpOworCisJcmVzZXRfY29udHJvbF9kZWFzc2VydCh0Y3BoeS0+dXBoeV9yc3QpOworCisJcmV0ID0gcmVhZHhfcG9sbF90aW1lb3V0KHJlYWRsLCB0Y3BoeS0+YmFzZSArIFBNQV9DTU5fQ1RSTDEsCisJCQkJIHZhbCwgdmFsICYgQ01OX1JFQURZLCAxMCwKKwkJCQkgUEhZX01PREVfU0VUX1RJTUVPVVQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIodGNwaHktPmRldiwgIndhaXQgcG1hIHJlYWR5IHRpbWVvdXRcbiIpOworCQlyZXQgPSAtRVRJTUVET1VUOworCQlnb3RvIGVycl93YWl0X3BtYTsKKwl9CisKKwlyZXNldF9jb250cm9sX2RlYXNzZXJ0KHRjcGh5LT5waXBlX3JzdCk7CisKKwlyZXR1cm4gMDsKKworZXJyX3dhaXRfcG1hOgorCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KHRjcGh5LT51cGh5X3JzdCk7CisJcmVzZXRfY29udHJvbF9hc3NlcnQodGNwaHktPnRjcGh5X3JzdCk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHRjcGh5LT5jbGtfcmVmKTsKK2Vycl9jbGtfY29yZToKKwljbGtfZGlzYWJsZV91bnByZXBhcmUodGNwaHktPmNsa19jb3JlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB0Y3BoeV9waHlfZGVpbml0KHN0cnVjdCByb2NrY2hpcF90eXBlY19waHkgKnRjcGh5KQoreworCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KHRjcGh5LT50Y3BoeV9yc3QpOworCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KHRjcGh5LT51cGh5X3JzdCk7CisJcmVzZXRfY29udHJvbF9hc3NlcnQodGNwaHktPnBpcGVfcnN0KTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUodGNwaHktPmNsa19jb3JlKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUodGNwaHktPmNsa19yZWYpOworfQorCitzdGF0aWMgaW50IHRjcGh5X2dldF9tb2RlKHN0cnVjdCByb2NrY2hpcF90eXBlY19waHkgKnRjcGh5KQoreworCXN0cnVjdCBleHRjb25fZGV2ICplZGV2ID0gdGNwaHktPmV4dGNvbjsKKwl1bmlvbiBleHRjb25fcHJvcGVydHlfdmFsdWUgcHJvcGVydHk7CisJdW5zaWduZWQgaW50IGlkOworCWJvb2wgZGZwLCB1ZnAsIGRwOworCXU4IG1vZGU7CisJaW50IHJldDsKKworCXVmcCA9IGV4dGNvbl9nZXRfc3RhdGUoZWRldiwgRVhUQ09OX1VTQik7CisJZGZwID0gZXh0Y29uX2dldF9zdGF0ZShlZGV2LCBFWFRDT05fVVNCX0hPU1QpOworCWRwID0gZXh0Y29uX2dldF9zdGF0ZShlZGV2LCBFWFRDT05fRElTUF9EUCk7CisKKwltb2RlID0gTU9ERV9ERlBfVVNCOworCWlkID0gRVhUQ09OX1VTQl9IT1NUOworCisJaWYgKHVmcCkgeworCQltb2RlID0gTU9ERV9VRlBfVVNCOworCQlpZCA9IEVYVENPTl9VU0I7CisJfSBlbHNlIGlmIChkcCkgeworCQltb2RlID0gTU9ERV9ERlBfRFA7CisJCWlkID0gRVhUQ09OX0RJU1BfRFA7CisKKwkJcmV0ID0gZXh0Y29uX2dldF9wcm9wZXJ0eShlZGV2LCBpZCwgRVhUQ09OX1BST1BfVVNCX1NTLAorCQkJCQkgICZwcm9wZXJ0eSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIodGNwaHktPmRldiwgImdldCBzdXBlcnNwZWVkIHByb3BlcnR5IGZhaWxlZFxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJaWYgKHByb3BlcnR5LmludHZhbCkKKwkJCW1vZGUgfD0gTU9ERV9ERlBfVVNCOworCX0KKworCXJldCA9IGV4dGNvbl9nZXRfcHJvcGVydHkoZWRldiwgaWQsIEVYVENPTl9QUk9QX1VTQl9UWVBFQ19QT0xBUklUWSwKKwkJCQkgICZwcm9wZXJ0eSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHRjcGh5LT5kZXYsICJnZXQgcG9sYXJpdHkgcHJvcGVydHkgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl0Y3BoeS0+ZmxpcCA9IHByb3BlcnR5LmludHZhbCA/IDEgOiAwOworCisJcmV0dXJuIG1vZGU7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfdXNiM19waHlfcG93ZXJfb24oc3RydWN0IHBoeSAqcGh5KQoreworCXN0cnVjdCByb2NrY2hpcF90eXBlY19waHkgKnRjcGh5ID0gcGh5X2dldF9kcnZkYXRhKHBoeSk7CisJc3RydWN0IHJvY2tjaGlwX3VzYjNwaHlfcG9ydF9jZmcgKmNmZyA9ICZ0Y3BoeS0+cG9ydF9jZmdzOworCWNvbnN0IHN0cnVjdCB1c2IzcGh5X3JlZyAqcmVnID0gJmNmZy0+cGlwZV9zdGF0dXM7CisJaW50IHRpbWVvdXQsIG5ld19tb2RlLCByZXQgPSAwOworCXUzMiB2YWw7CisKKwltdXRleF9sb2NrKCZ0Y3BoeS0+bG9jayk7CisKKwluZXdfbW9kZSA9IHRjcGh5X2dldF9tb2RlKHRjcGh5KTsKKwlpZiAobmV3X21vZGUgPCAwKSB7CisJCXJldCA9IG5ld19tb2RlOworCQlnb3RvIHVubG9ja19yZXQ7CisJfQorCisJLyogRFAtb25seSBtb2RlOyBmYWxsIGJhY2sgdG8gVVNCMiAqLworCWlmICghKG5ld19tb2RlICYgKE1PREVfREZQX1VTQiB8IE1PREVfVUZQX1VTQikpKQorCQlnb3RvIHVubG9ja19yZXQ7CisKKwlpZiAodGNwaHktPm1vZGUgPT0gbmV3X21vZGUpCisJCWdvdG8gdW5sb2NrX3JldDsKKworCWlmICh0Y3BoeS0+bW9kZSA9PSBNT0RFX0RJU0NPTk5FQ1QpCisJCXRjcGh5X3BoeV9pbml0KHRjcGh5LCBuZXdfbW9kZSk7CisKKwkvKiB3YWl0IFRDUEhZIGZvciBwaXBlIHJlYWR5ICovCisJZm9yICh0aW1lb3V0ID0gMDsgdGltZW91dCA8IDEwMDsgdGltZW91dCsrKSB7CisJCXJlZ21hcF9yZWFkKHRjcGh5LT5ncmZfcmVncywgcmVnLT5vZmZzZXQsICZ2YWwpOworCQlpZiAoISh2YWwgJiBCSVQocmVnLT5lbmFibGVfYml0KSkpIHsKKwkJCXRjcGh5LT5tb2RlIHw9IG5ld19tb2RlICYgKE1PREVfREZQX1VTQiB8IE1PREVfVUZQX1VTQik7CisJCQlnb3RvIHVubG9ja19yZXQ7CisJCX0KKwkJdXNsZWVwX3JhbmdlKDEwLCAyMCk7CisJfQorCisJaWYgKHRjcGh5LT5tb2RlID09IE1PREVfRElTQ09OTkVDVCkKKwkJdGNwaHlfcGh5X2RlaW5pdCh0Y3BoeSk7CisKKwlyZXQgPSAtRVRJTUVET1VUOworCit1bmxvY2tfcmV0OgorCW11dGV4X3VubG9jaygmdGNwaHktPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfdXNiM19waHlfcG93ZXJfb2ZmKHN0cnVjdCBwaHkgKnBoeSkKK3sKKwlzdHJ1Y3Qgcm9ja2NoaXBfdHlwZWNfcGh5ICp0Y3BoeSA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOworCisJbXV0ZXhfbG9jaygmdGNwaHktPmxvY2spOworCisJaWYgKHRjcGh5LT5tb2RlID09IE1PREVfRElTQ09OTkVDVCkKKwkJZ290byB1bmxvY2s7CisKKwl0Y3BoeS0+bW9kZSAmPSB+KE1PREVfVUZQX1VTQiB8IE1PREVfREZQX1VTQik7CisJaWYgKHRjcGh5LT5tb2RlID09IE1PREVfRElTQ09OTkVDVCkKKwkJdGNwaHlfcGh5X2RlaW5pdCh0Y3BoeSk7CisKK3VubG9jazoKKwltdXRleF91bmxvY2soJnRjcGh5LT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwaHlfb3BzIHJvY2tjaGlwX3VzYjNfcGh5X29wcyA9IHsKKwkucG93ZXJfb24JPSByb2NrY2hpcF91c2IzX3BoeV9wb3dlcl9vbiwKKwkucG93ZXJfb2ZmCT0gcm9ja2NoaXBfdXNiM19waHlfcG93ZXJfb2ZmLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfZHBfcGh5X3Bvd2VyX29uKHN0cnVjdCBwaHkgKnBoeSkKK3sKKwlzdHJ1Y3Qgcm9ja2NoaXBfdHlwZWNfcGh5ICp0Y3BoeSA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOworCWludCBuZXdfbW9kZSwgcmV0ID0gMDsKKwl1MzIgdmFsOworCisJbXV0ZXhfbG9jaygmdGNwaHktPmxvY2spOworCisJbmV3X21vZGUgPSB0Y3BoeV9nZXRfbW9kZSh0Y3BoeSk7CisJaWYgKG5ld19tb2RlIDwgMCkgeworCQlyZXQgPSBuZXdfbW9kZTsKKwkJZ290byB1bmxvY2tfcmV0OworCX0KKworCWlmICghKG5ld19tb2RlICYgTU9ERV9ERlBfRFApKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gdW5sb2NrX3JldDsKKwl9CisKKwlpZiAodGNwaHktPm1vZGUgPT0gbmV3X21vZGUpCisJCWdvdG8gdW5sb2NrX3JldDsKKworCS8qCisJICogSWYgdGhlIFBIWSBoYXMgYmVlbiBwb3dlciBvbiwgYnV0IHRoZSBtb2RlIGlzIG5vdCBEUCBvbmx5IG1vZGUsCisJICogcmUtaW5pdCB0aGUgUEhZIGZvciBzZXR0aW5nIGFsbCBvZiA0IGxhbmVzIHRvIERQLgorCSAqLworCWlmIChuZXdfbW9kZSA9PSBNT0RFX0RGUF9EUCAmJiB0Y3BoeS0+bW9kZSAhPSBNT0RFX0RJU0NPTk5FQ1QpIHsKKwkJdGNwaHlfcGh5X2RlaW5pdCh0Y3BoeSk7CisJCXRjcGh5X3BoeV9pbml0KHRjcGh5LCBuZXdfbW9kZSk7CisJfSBlbHNlIGlmICh0Y3BoeS0+bW9kZSA9PSBNT0RFX0RJU0NPTk5FQ1QpIHsKKwkJdGNwaHlfcGh5X2luaXQodGNwaHksIG5ld19tb2RlKTsKKwl9CisKKwlyZXQgPSByZWFkeF9wb2xsX3RpbWVvdXQocmVhZGwsIHRjcGh5LT5iYXNlICsgRFBfTU9ERV9DVEwsCisJCQkJIHZhbCwgdmFsICYgRFBfTU9ERV9BMiwgMTAwMCwKKwkJCQkgUEhZX01PREVfU0VUX1RJTUVPVVQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIodGNwaHktPmRldiwgImZhaWxlZCB0byB3YWl0IFRDUEhZIGVudGVyIEEyXG4iKTsKKwkJZ290byBwb3dlcl9vbl9maW5pc2g7CisJfQorCisJdGNwaHlfZHBfYXV4X2NhbGlicmF0aW9uKHRjcGh5KTsKKworCXdyaXRlbChEUF9NT0RFX0VOVEVSX0EwLCB0Y3BoeS0+YmFzZSArIERQX01PREVfQ1RMKTsKKworCXJldCA9IHJlYWR4X3BvbGxfdGltZW91dChyZWFkbCwgdGNwaHktPmJhc2UgKyBEUF9NT0RFX0NUTCwKKwkJCQkgdmFsLCB2YWwgJiBEUF9NT0RFX0EwLCAxMDAwLAorCQkJCSBQSFlfTU9ERV9TRVRfVElNRU9VVCk7CisJaWYgKHJldCA8IDApIHsKKwkJd3JpdGVsKERQX01PREVfRU5URVJfQTIsIHRjcGh5LT5iYXNlICsgRFBfTU9ERV9DVEwpOworCQlkZXZfZXJyKHRjcGh5LT5kZXYsICJmYWlsZWQgdG8gd2FpdCBUQ1BIWSBlbnRlciBBMFxuIik7CisJCWdvdG8gcG93ZXJfb25fZmluaXNoOworCX0KKworCXRjcGh5LT5tb2RlIHw9IE1PREVfREZQX0RQOworCitwb3dlcl9vbl9maW5pc2g6CisJaWYgKHRjcGh5LT5tb2RlID09IE1PREVfRElTQ09OTkVDVCkKKwkJdGNwaHlfcGh5X2RlaW5pdCh0Y3BoeSk7Cit1bmxvY2tfcmV0OgorCW11dGV4X3VubG9jaygmdGNwaHktPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfZHBfcGh5X3Bvd2VyX29mZihzdHJ1Y3QgcGh5ICpwaHkpCit7CisJc3RydWN0IHJvY2tjaGlwX3R5cGVjX3BoeSAqdGNwaHkgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKKworCW11dGV4X2xvY2soJnRjcGh5LT5sb2NrKTsKKworCWlmICh0Y3BoeS0+bW9kZSA9PSBNT0RFX0RJU0NPTk5FQ1QpCisJCWdvdG8gdW5sb2NrOworCisJdGNwaHktPm1vZGUgJj0gfk1PREVfREZQX0RQOworCisJd3JpdGVsKERQX01PREVfRU5URVJfQTIsIHRjcGh5LT5iYXNlICsgRFBfTU9ERV9DVEwpOworCisJaWYgKHRjcGh5LT5tb2RlID09IE1PREVfRElTQ09OTkVDVCkKKwkJdGNwaHlfcGh5X2RlaW5pdCh0Y3BoeSk7CisKK3VubG9jazoKKwltdXRleF91bmxvY2soJnRjcGh5LT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwaHlfb3BzIHJvY2tjaGlwX2RwX3BoeV9vcHMgPSB7CisJLnBvd2VyX29uCT0gcm9ja2NoaXBfZHBfcGh5X3Bvd2VyX29uLAorCS5wb3dlcl9vZmYJPSByb2NrY2hpcF9kcF9waHlfcG93ZXJfb2ZmLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgdGNwaHlfZ2V0X3BhcmFtKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCB1c2IzcGh5X3JlZyAqcmVnLAorCQkJICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1MzIgYnVmZmVyWzNdOworCWludCByZXQ7CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShkZXYtPm9mX25vZGUsIG5hbWUsIGJ1ZmZlciwgMyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIkNhbiBub3QgcGFyc2UgJXNcbiIsIG5hbWUpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJlZy0+b2Zmc2V0ID0gYnVmZmVyWzBdOworCXJlZy0+ZW5hYmxlX2JpdCA9IGJ1ZmZlclsxXTsKKwlyZWctPndyaXRlX2VuYWJsZSA9IGJ1ZmZlclsyXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0Y3BoeV9wYXJzZV9kdChzdHJ1Y3Qgcm9ja2NoaXBfdHlwZWNfcGh5ICp0Y3BoeSwKKwkJCSAgc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCByb2NrY2hpcF91c2IzcGh5X3BvcnRfY2ZnICpjZmcgPSAmdGNwaHktPnBvcnRfY2ZnczsKKwlpbnQgcmV0OworCisJcmV0ID0gdGNwaHlfZ2V0X3BhcmFtKGRldiwgJmNmZy0+dHlwZWNfY29ubl9kaXIsCisJCQkgICAgICAicm9ja2NoaXAsdHlwZWMtY29ubi1kaXIiKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gdGNwaHlfZ2V0X3BhcmFtKGRldiwgJmNmZy0+dXNiM3RvdXNiMl9lbiwKKwkJCSAgICAgICJyb2NrY2hpcCx1c2IzdG91c2IyLWVuIik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHRjcGh5X2dldF9wYXJhbShkZXYsICZjZmctPmV4dGVybmFsX3BzbSwKKwkJCSAgICAgICJyb2NrY2hpcCxleHRlcm5hbC1wc20iKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gdGNwaHlfZ2V0X3BhcmFtKGRldiwgJmNmZy0+cGlwZV9zdGF0dXMsCisJCQkgICAgICAicm9ja2NoaXAscGlwZS1zdGF0dXMiKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdGNwaHktPmdyZl9yZWdzID0gc3lzY29uX3JlZ21hcF9sb29rdXBfYnlfcGhhbmRsZShkZXYtPm9mX25vZGUsCisJCQkJCQkJICAicm9ja2NoaXAsZ3JmIik7CisJaWYgKElTX0VSUih0Y3BoeS0+Z3JmX3JlZ3MpKSB7CisJCWRldl9lcnIoZGV2LCAiY291bGQgbm90IGZpbmQgZ3JmIGR0IG5vZGVcbiIpOworCQlyZXR1cm4gUFRSX0VSUih0Y3BoeS0+Z3JmX3JlZ3MpOworCX0KKworCXRjcGh5LT5jbGtfY29yZSA9IGRldm1fY2xrX2dldChkZXYsICJ0Y3BkY29yZSIpOworCWlmIChJU19FUlIodGNwaHktPmNsa19jb3JlKSkgeworCQlkZXZfZXJyKGRldiwgImNvdWxkIG5vdCBnZXQgdXBoeSBjb3JlIGNsb2NrXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIodGNwaHktPmNsa19jb3JlKTsKKwl9CisKKwl0Y3BoeS0+Y2xrX3JlZiA9IGRldm1fY2xrX2dldChkZXYsICJ0Y3BkcGh5LXJlZiIpOworCWlmIChJU19FUlIodGNwaHktPmNsa19yZWYpKSB7CisJCWRldl9lcnIoZGV2LCAiY291bGQgbm90IGdldCB1cGh5IHJlZiBjbG9ja1xuIik7CisJCXJldHVybiBQVFJfRVJSKHRjcGh5LT5jbGtfcmVmKTsKKwl9CisKKwl0Y3BoeS0+dXBoeV9yc3QgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0KGRldiwgInVwaHkiKTsKKwlpZiAoSVNfRVJSKHRjcGh5LT51cGh5X3JzdCkpIHsKKwkJZGV2X2VycihkZXYsICJubyB1cGh5X3JzdCByZXNldCBjb250cm9sIGZvdW5kXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIodGNwaHktPnVwaHlfcnN0KTsKKwl9CisKKwl0Y3BoeS0+cGlwZV9yc3QgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0KGRldiwgInVwaHktcGlwZSIpOworCWlmIChJU19FUlIodGNwaHktPnBpcGVfcnN0KSkgeworCQlkZXZfZXJyKGRldiwgIm5vIHBpcGVfcnN0IHJlc2V0IGNvbnRyb2wgZm91bmRcbiIpOworCQlyZXR1cm4gUFRSX0VSUih0Y3BoeS0+cGlwZV9yc3QpOworCX0KKworCXRjcGh5LT50Y3BoeV9yc3QgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0KGRldiwgInVwaHktdGNwaHkiKTsKKwlpZiAoSVNfRVJSKHRjcGh5LT50Y3BoeV9yc3QpKSB7CisJCWRldl9lcnIoZGV2LCAibm8gdGNwaHlfcnN0IHJlc2V0IGNvbnRyb2wgZm91bmRcbiIpOworCQlyZXR1cm4gUFRSX0VSUih0Y3BoeS0+dGNwaHlfcnN0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdHlwZWNfcGh5X3ByZV9pbml0KHN0cnVjdCByb2NrY2hpcF90eXBlY19waHkgKnRjcGh5KQoreworCXN0cnVjdCByb2NrY2hpcF91c2IzcGh5X3BvcnRfY2ZnICpjZmcgPSAmdGNwaHktPnBvcnRfY2ZnczsKKworCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KHRjcGh5LT50Y3BoeV9yc3QpOworCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KHRjcGh5LT51cGh5X3JzdCk7CisJcmVzZXRfY29udHJvbF9hc3NlcnQodGNwaHktPnBpcGVfcnN0KTsKKworCS8qIHNlbGVjdCBleHRlcm5hbCBwc20gY2xvY2sgKi8KKwlwcm9wZXJ0eV9lbmFibGUodGNwaHksICZjZmctPmV4dGVybmFsX3BzbSwgMSk7CisJcHJvcGVydHlfZW5hYmxlKHRjcGh5LCAmY2ZnLT51c2IzdG91c2IyX2VuLCAwKTsKKworCXRjcGh5LT5tb2RlID0gTU9ERV9ESVNDT05ORUNUOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX3R5cGVjX3BoeV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkX25wOworCXN0cnVjdCByb2NrY2hpcF90eXBlY19waHkgKnRjcGh5OworCXN0cnVjdCBwaHlfcHJvdmlkZXIgKnBoeV9wcm92aWRlcjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgcmV0OworCisJdGNwaHkgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnRjcGh5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0Y3BoeSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXRjcGh5LT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHRjcGh5LT5iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIodGNwaHktPmJhc2UpOworCisJcmV0ID0gdGNwaHlfcGFyc2VfZHQodGNwaHksIGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXRjcGh5LT5kZXYgPSBkZXY7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgdGNwaHkpOworCW11dGV4X2luaXQoJnRjcGh5LT5sb2NrKTsKKworCXR5cGVjX3BoeV9wcmVfaW5pdCh0Y3BoeSk7CisKKwl0Y3BoeS0+ZXh0Y29uID0gZXh0Y29uX2dldF9lZGV2X2J5X3BoYW5kbGUoZGV2LCAwKTsKKwlpZiAoSVNfRVJSKHRjcGh5LT5leHRjb24pKSB7CisJCWlmIChQVFJfRVJSKHRjcGh5LT5leHRjb24pICE9IC1FUFJPQkVfREVGRVIpCisJCQlkZXZfZXJyKGRldiwgIkludmFsaWQgb3IgbWlzc2luZyBleHRjb25cbiIpOworCQlyZXR1cm4gUFRSX0VSUih0Y3BoeS0+ZXh0Y29uKTsKKwl9CisKKwlwbV9ydW50aW1lX2VuYWJsZShkZXYpOworCisJZm9yX2VhY2hfYXZhaWxhYmxlX2NoaWxkX29mX25vZGUobnAsIGNoaWxkX25wKSB7CisJCXN0cnVjdCBwaHkgKnBoeTsKKworCQlpZiAoIW9mX25vZGVfY21wKGNoaWxkX25wLT5uYW1lLCAiZHAtcG9ydCIpKQorCQkJcGh5ID0gZGV2bV9waHlfY3JlYXRlKGRldiwgY2hpbGRfbnAsCisJCQkJCSAgICAgICZyb2NrY2hpcF9kcF9waHlfb3BzKTsKKwkJZWxzZSBpZiAoIW9mX25vZGVfY21wKGNoaWxkX25wLT5uYW1lLCAidXNiMy1wb3J0IikpCisJCQlwaHkgPSBkZXZtX3BoeV9jcmVhdGUoZGV2LCBjaGlsZF9ucCwKKwkJCQkJICAgICAgJnJvY2tjaGlwX3VzYjNfcGh5X29wcyk7CisJCWVsc2UKKwkJCWNvbnRpbnVlOworCisJCWlmIChJU19FUlIocGh5KSkgeworCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gY3JlYXRlIHBoeTogJXNcbiIsCisJCQkJY2hpbGRfbnAtPm5hbWUpOworCQkJcmV0dXJuIFBUUl9FUlIocGh5KTsKKwkJfQorCisJCXBoeV9zZXRfZHJ2ZGF0YShwaHksIHRjcGh5KTsKKwl9CisKKwlwaHlfcHJvdmlkZXIgPSBkZXZtX29mX3BoeV9wcm92aWRlcl9yZWdpc3RlcihkZXYsIG9mX3BoeV9zaW1wbGVfeGxhdGUpOworCWlmIChJU19FUlIocGh5X3Byb3ZpZGVyKSkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWdpc3RlciBwaHkgcHJvdmlkZXJcbiIpOworCQlyZXR1cm4gUFRSX0VSUihwaHlfcHJvdmlkZXIpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX3R5cGVjX3BoeV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcm9ja2NoaXBfdHlwZWNfcGh5X2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMzk5LXR5cGVjLXBoeSIgfSwKKwl7fQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcm9ja2NoaXBfdHlwZWNfcGh5X2R0X2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHJvY2tjaGlwX3R5cGVjX3BoeV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHJvY2tjaGlwX3R5cGVjX3BoeV9wcm9iZSwKKwkucmVtb3ZlCQk9IHJvY2tjaGlwX3R5cGVjX3BoeV9yZW1vdmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInJvY2tjaGlwLXR5cGVjLXBoeSIsCisJCS5vZl9tYXRjaF90YWJsZSA9IHJvY2tjaGlwX3R5cGVjX3BoeV9kdF9pZHMsCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIocm9ja2NoaXBfdHlwZWNfcGh5X2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkNocmlzIFpob25nIDx6eXdAcm9jay1jaGlwcy5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJLZXZlciBZYW5nIDxrZXZlci55YW5nQHJvY2stY2hpcHMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSb2NrY2hpcCBVU0IgVFlQRS1DIFBIWSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1yb2NrY2hpcC11c2IuYyBiL2RyaXZlcnMvcGh5L3BoeS1yb2NrY2hpcC11c2IuYwppbmRleCAyYTczODFmLi43MzQ5ODdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9waHktcm9ja2NoaXAtdXNiLmMKKysrIGIvZHJpdmVycy9waHkvcGh5LXJvY2tjaGlwLXVzYi5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KICNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvc3lzY29uLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAogc3RhdGljIGludCBlbmFibGVfdXNiX3VhcnQ7CiAKQEAgLTY0LDYgKzY1LDcgQEAKIAlzdHJ1Y3QgY2xrX2h3CWNsazQ4MG1faHc7CiAJc3RydWN0IHBoeQkqcGh5OwogCWJvb2wJCXVhcnRfZW5hYmxlZDsKKwlzdHJ1Y3QgcmVzZXRfY29udHJvbCAqcmVzZXQ7CiB9OwogCiBzdGF0aWMgaW50IHJvY2tjaGlwX3VzYl9waHlfcG93ZXIoc3RydWN0IHJvY2tjaGlwX3VzYl9waHkgKnBoeSwKQEAgLTE0NCw5ICsxNDYsMjMgQEAKIAlyZXR1cm4gY2xrX3ByZXBhcmVfZW5hYmxlKHBoeS0+Y2xrNDgwbSk7CiB9CiAKK3N0YXRpYyBpbnQgcm9ja2NoaXBfdXNiX3BoeV9yZXNldChzdHJ1Y3QgcGh5ICpfcGh5KQoreworCXN0cnVjdCByb2NrY2hpcF91c2JfcGh5ICpwaHkgPSBwaHlfZ2V0X2RydmRhdGEoX3BoeSk7CisKKwlpZiAocGh5LT5yZXNldCkgeworCQlyZXNldF9jb250cm9sX2Fzc2VydChwaHktPnJlc2V0KTsKKwkJdWRlbGF5KDEwKTsKKwkJcmVzZXRfY29udHJvbF9kZWFzc2VydChwaHktPnJlc2V0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBwaHlfb3BzIG9wcyA9IHsKIAkucG93ZXJfb24JPSByb2NrY2hpcF91c2JfcGh5X3Bvd2VyX29uLAogCS5wb3dlcl9vZmYJPSByb2NrY2hpcF91c2JfcGh5X3Bvd2VyX29mZiwKKwkucmVzZXQJCT0gcm9ja2NoaXBfdXNiX3BoeV9yZXNldCwKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiB9OwogCkBAIC0xODUsNiArMjAxLDEwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCXJrX3BoeS0+cmVzZXQgPSBvZl9yZXNldF9jb250cm9sX2dldChjaGlsZCwgInBoeS1yZXNldCIpOworCWlmIChJU19FUlIocmtfcGh5LT5yZXNldCkpCisJCXJrX3BoeS0+cmVzZXQgPSBOVUxMOworCiAJcmtfcGh5LT5yZWdfb2Zmc2V0ID0gcmVnX29mZnNldDsKIAogCXJrX3BoeS0+Y2xrID0gb2ZfY2xrX2dldF9ieV9uYW1lKGNoaWxkLCAicGh5Y2xrIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktc3VuNGktdXNiLmMgYi9kcml2ZXJzL3BoeS9waHktc3VuNGktdXNiLmMKaW5kZXggMGE0NWJjNi4uYjkzNDJhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvcGh5LXN1bjRpLXVzYi5jCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1zdW40aS11c2IuYwpAQCAtNDAsNiArNDAsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC91c2Ivb2YuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KIAogI2RlZmluZSBSRUdfSVNDUgkJCTB4MDAKQEAgLTQ5LDcgKzUxLDcgQEAKICNkZWZpbmUgUkVHX1BIWUNUTF9BMzMJCQkweDEwCiAjZGVmaW5lIFJFR19QSFlfVU5LX0gzCQkJMHgyMAogCi0jZGVmaW5lIFJFR19QTVVfVU5LX0gzCQkJMHgxMAorI2RlZmluZSBSRUdfUE1VX1VOSzEJCQkweDEwCiAKICNkZWZpbmUgUEhZQ1RMX0RBVEEJCQlCSVQoNykKIApAQCAtOTcsNiArOTksNyBAQAogCXN1bjZpX2EzMV9waHksCiAJc3VuOGlfYTMzX3BoeSwKIAlzdW44aV9oM19waHksCisJc3VuNTBpX2E2NF9waHksCiB9OwogCiBzdHJ1Y3Qgc3VuNGlfdXNiX3BoeV9jZmcgewpAQCAtMTA1LDEyICsxMDgsMTQgQEAKIAl1MzIgZGlzY190aHJlc2g7CiAJdTggcGh5Y3RsX29mZnNldDsKIAlib29sIGRlZGljYXRlZF9jbG9ja3M7CisJYm9vbCBlbmFibGVfcG11X3VuazE7CiB9OwogCiBzdHJ1Y3Qgc3VuNGlfdXNiX3BoeV9kYXRhIHsKIAl2b2lkIF9faW9tZW0gKmJhc2U7CiAJY29uc3Qgc3RydWN0IHN1bjRpX3VzYl9waHlfY2ZnICpjZmc7Ci0Jc3RydWN0IG11dGV4IG11dGV4OworCWVudW0gdXNiX2RyX21vZGUgZHJfbW9kZTsKKwlzcGlubG9ja190IHJlZ19sb2NrOyAvKiBndWFyZCBhY2Nlc3MgdG8gcGh5Y3RsIHJlZyAqLwogCXN0cnVjdCBzdW40aV91c2JfcGh5IHsKIAkJc3RydWN0IHBoeSAqcGh5OwogCQl2b2lkIF9faW9tZW0gKnBtdTsKQEAgLTEyOCw2ICsxMzMsNyBAQAogCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnZidXNfcG93ZXJfc3VwcGx5OwogCXN0cnVjdCBub3RpZmllcl9ibG9jayB2YnVzX3Bvd2VyX25iOwogCWJvb2wgdmJ1c19wb3dlcl9uYl9yZWdpc3RlcmVkOworCWJvb2wgZm9yY2Vfc2Vzc2lvbl9lbmQ7CiAJaW50IGlkX2RldF9pcnE7CiAJaW50IHZidXNfZGV0X2lycTsKIAlpbnQgaWRfZGV0OwpAQCAtMTc2LDEyICsxODIsMTQgQEAKIAlzdHJ1Y3Qgc3VuNGlfdXNiX3BoeV9kYXRhICpwaHlfZGF0YSA9IHRvX3N1bjRpX3VzYl9waHlfZGF0YShwaHkpOwogCXUzMiB0ZW1wLCB1c2JjX2JpdCA9IEJJVChwaHktPmluZGV4ICogMik7CiAJdm9pZCBfX2lvbWVtICpwaHljdGwgPSBwaHlfZGF0YS0+YmFzZSArIHBoeV9kYXRhLT5jZmctPnBoeWN0bF9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgaTsKIAotCW11dGV4X2xvY2soJnBoeV9kYXRhLT5tdXRleCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBoeV9kYXRhLT5yZWdfbG9jaywgZmxhZ3MpOwogCi0JaWYgKHBoeV9kYXRhLT5jZmctPnR5cGUgPT0gc3VuOGlfYTMzX3BoeSkgewotCQkvKiBBMzMgbmVlZHMgdXMgdG8gc2V0IHBoeWN0bCB0byAwIGV4cGxpY2l0bHkgKi8KKwlpZiAocGh5X2RhdGEtPmNmZy0+dHlwZSA9PSBzdW44aV9hMzNfcGh5IHx8CisJICAgIHBoeV9kYXRhLT5jZmctPnR5cGUgPT0gc3VuNTBpX2E2NF9waHkpIHsKKwkJLyogQTMzIG9yIEE2NCBuZWVkcyB1cyB0byBzZXQgcGh5Y3RsIHRvIDAgZXhwbGljaXRseSAqLwogCQl3cml0ZWwoMCwgcGh5Y3RsKTsKIAl9CiAKQEAgLTIxNSw3ICsyMjMsOCBAQAogCiAJCWRhdGEgPj49IDE7CiAJfQotCW11dGV4X3VubG9jaygmcGh5X2RhdGEtPm11dGV4KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoeV9kYXRhLT5yZWdfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBzdW40aV91c2JfcGh5X3Bhc3NieShzdHJ1Y3Qgc3VuNGlfdXNiX3BoeSAqcGh5LCBpbnQgZW5hYmxlKQpAQCAtMjU1LDE0ICsyNjQsMTYgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKKwlpZiAoZGF0YS0+Y2ZnLT5lbmFibGVfcG11X3VuazEpIHsKKwkJdmFsID0gcmVhZGwocGh5LT5wbXUgKyBSRUdfUE1VX1VOSzEpOworCQl3cml0ZWwodmFsICYgfjIsIHBoeS0+cG11ICsgUkVHX1BNVV9VTksxKTsKKwl9CisKIAlpZiAoZGF0YS0+Y2ZnLT50eXBlID09IHN1bjhpX2gzX3BoeSkgewogCQlpZiAocGh5LT5pbmRleCA9PSAwKSB7CiAJCQl2YWwgPSByZWFkbChkYXRhLT5iYXNlICsgUkVHX1BIWV9VTktfSDMpOwogCQkJd3JpdGVsKHZhbCAmIH4xLCBkYXRhLT5iYXNlICsgUkVHX1BIWV9VTktfSDMpOwogCQl9Ci0KLQkJdmFsID0gcmVhZGwocGh5LT5wbXUgKyBSRUdfUE1VX1VOS19IMyk7Ci0JCXdyaXRlbCh2YWwgJiB+MiwgcGh5LT5wbXUgKyBSRUdfUE1VX1VOS19IMyk7CiAJfSBlbHNlIHsKIAkJLyogRW5hYmxlIFVTQiA0NSBPaG0gcmVzaXN0b3IgY2FsaWJyYXRpb24gKi8KIAkJaWYgKHBoeS0+aW5kZXggPT0gMCkKQEAgLTI4NSwxNiArMjk2LDEwIEBACiAJCXN1bjRpX3VzYl9waHkwX3VwZGF0ZV9pc2NyKF9waHksIDAsIElTQ1JfRFBETV9QVUxMVVBfRU4pOwogCQlzdW40aV91c2JfcGh5MF91cGRhdGVfaXNjcihfcGh5LCAwLCBJU0NSX0lEX1BVTExVUF9FTik7CiAKLQkJaWYgKGRhdGEtPmlkX2RldF9ncGlvKSB7Ci0JCQkvKiBPVEcgbW9kZSwgZm9yY2UgSVNDUiBhbmQgY2FibGUgc3RhdGUgdXBkYXRlcyAqLwotCQkJZGF0YS0+aWRfZGV0ID0gLTE7Ci0JCQlkYXRhLT52YnVzX2RldCA9IC0xOwotCQkJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV93cSwgJmRhdGEtPmRldGVjdCwgMCk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBIb3N0IG9ubHkgbW9kZSAqLwotCQkJc3VuNGlfdXNiX3BoeTBfc2V0X2lkX2RldGVjdChfcGh5LCAwKTsKLQkJCXN1bjRpX3VzYl9waHkwX3NldF92YnVzX2RldGVjdChfcGh5LCAxKTsKLQkJfQorCQkvKiBGb3JjZSBJU0NSIGFuZCBjYWJsZSBzdGF0ZSB1cGRhdGVzICovCisJCWRhdGEtPmlkX2RldCA9IC0xOworCQlkYXRhLT52YnVzX2RldCA9IC0xOworCQlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX3dxLCAmZGF0YS0+ZGV0ZWN0LCAwKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTMxOSw2ICszMjQsMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzdW40aV91c2JfcGh5MF9nZXRfaWRfZGV0KHN0cnVjdCBzdW40aV91c2JfcGh5X2RhdGEgKmRhdGEpCit7CisJc3dpdGNoIChkYXRhLT5kcl9tb2RlKSB7CisJY2FzZSBVU0JfRFJfTU9ERV9PVEc6CisJCWlmIChkYXRhLT5pZF9kZXRfZ3BpbykKKwkJCXJldHVybiBncGlvZF9nZXRfdmFsdWVfY2Fuc2xlZXAoZGF0YS0+aWRfZGV0X2dwaW8pOworCQllbHNlCisJCQlyZXR1cm4gMTsgLyogRmFsbGJhY2sgdG8gcGVyaXBoZXJhbCBtb2RlICovCisJY2FzZSBVU0JfRFJfTU9ERV9IT1NUOgorCQlyZXR1cm4gMDsKKwljYXNlIFVTQl9EUl9NT0RFX1BFUklQSEVSQUw6CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJfQorfQorCiBzdGF0aWMgaW50IHN1bjRpX3VzYl9waHkwX2dldF92YnVzX2RldChzdHJ1Y3Qgc3VuNGlfdXNiX3BoeV9kYXRhICpkYXRhKQogewogCWlmIChkYXRhLT52YnVzX2RldF9ncGlvKQpAQCAtMzcyLDggKzM5MywxMCBAQAogCiAJLyogRm9yIHBoeTAgb25seSB0dXJuIG9uIFZidXMgaWYgd2UgZG9uJ3QgaGF2ZSBhbiBleHQuIFZidXMgKi8KIAlpZiAocGh5LT5pbmRleCA9PSAwICYmIHN1bjRpX3VzYl9waHkwX2hhdmVfdmJ1c19kZXQoZGF0YSkgJiYKLQkJCQlkYXRhLT52YnVzX2RldCkKKwkJCQlkYXRhLT52YnVzX2RldCkgeworCQlkZXZfd2FybigmX3BoeS0+ZGV2LCAiRXh0ZXJuYWwgdmJ1cyBkZXRlY3RlZCwgbm90IGVuYWJsaW5nIG91ciBvd24gdmJ1c1xuIik7CiAJCXJldHVybiAwOworCX0KIAogCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUocGh5LT52YnVzKTsKIAlpZiAocmV0KQpAQCAtNDA5LDYgKzQzMiwzNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHN1bjRpX3VzYl9waHlfc2V0X21vZGUoc3RydWN0IHBoeSAqX3BoeSwgZW51bSBwaHlfbW9kZSBtb2RlKQoreworCXN0cnVjdCBzdW40aV91c2JfcGh5ICpwaHkgPSBwaHlfZ2V0X2RydmRhdGEoX3BoeSk7CisJc3RydWN0IHN1bjRpX3VzYl9waHlfZGF0YSAqZGF0YSA9IHRvX3N1bjRpX3VzYl9waHlfZGF0YShwaHkpOworCisJaWYgKHBoeS0+aW5kZXggIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIFBIWV9NT0RFX1VTQl9IT1NUOgorCQlkYXRhLT5kcl9tb2RlID0gVVNCX0RSX01PREVfSE9TVDsKKwkJYnJlYWs7CisJY2FzZSBQSFlfTU9ERV9VU0JfREVWSUNFOgorCQlkYXRhLT5kcl9tb2RlID0gVVNCX0RSX01PREVfUEVSSVBIRVJBTDsKKwkJYnJlYWs7CisJY2FzZSBQSFlfTU9ERV9VU0JfT1RHOgorCQlkYXRhLT5kcl9tb2RlID0gVVNCX0RSX01PREVfT1RHOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfaW5mbygmX3BoeS0+ZGV2LCAiQ2hhbmdpbmcgZHJfbW9kZSB0byAlZFxuIiwgKGludClkYXRhLT5kcl9tb2RlKTsKKwlkYXRhLT5mb3JjZV9zZXNzaW9uX2VuZCA9IHRydWU7CisJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV93cSwgJmRhdGEtPmRldGVjdCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKwogdm9pZCBzdW40aV91c2JfcGh5X3NldF9zcXVlbGNoX2RldGVjdChzdHJ1Y3QgcGh5ICpfcGh5LCBib29sIGVuYWJsZWQpCiB7CiAJc3RydWN0IHN1bjRpX3VzYl9waHkgKnBoeSA9IHBoeV9nZXRfZHJ2ZGF0YShfcGh5KTsKQEAgLTQyMiw2ICs0NzQsNyBAQAogCS5leGl0CQk9IHN1bjRpX3VzYl9waHlfZXhpdCwKIAkucG93ZXJfb24JPSBzdW40aV91c2JfcGh5X3Bvd2VyX29uLAogCS5wb3dlcl9vZmYJPSBzdW40aV91c2JfcGh5X3Bvd2VyX29mZiwKKwkuc2V0X21vZGUJPSBzdW40aV91c2JfcGh5X3NldF9tb2RlLAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIH07CiAKQEAgLTQzMCw5ICs0ODMsMTMgQEAKIAlzdHJ1Y3Qgc3VuNGlfdXNiX3BoeV9kYXRhICpkYXRhID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzdW40aV91c2JfcGh5X2RhdGEsIGRldGVjdC53b3JrKTsKIAlzdHJ1Y3QgcGh5ICpwaHkwID0gZGF0YS0+cGh5c1swXS5waHk7Ci0JaW50IGlkX2RldCwgdmJ1c19kZXQsIGlkX25vdGlmeSA9IDAsIHZidXNfbm90aWZ5ID0gMDsKKwlib29sIGZvcmNlX3Nlc3Npb25fZW5kLCBpZF9ub3RpZnkgPSBmYWxzZSwgdmJ1c19ub3RpZnkgPSBmYWxzZTsKKwlpbnQgaWRfZGV0LCB2YnVzX2RldDsKIAotCWlkX2RldCA9IGdwaW9kX2dldF92YWx1ZV9jYW5zbGVlcChkYXRhLT5pZF9kZXRfZ3Bpbyk7CisJaWYgKHBoeTAgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWRfZGV0ID0gc3VuNGlfdXNiX3BoeTBfZ2V0X2lkX2RldChkYXRhKTsKIAl2YnVzX2RldCA9IHN1bjRpX3VzYl9waHkwX2dldF92YnVzX2RldChkYXRhKTsKIAogCW11dGV4X2xvY2soJnBoeTAtPm11dGV4KTsKQEAgLTQ0MiwyNiArNDk5LDMwIEBACiAJCXJldHVybjsKIAl9CiAKKwlmb3JjZV9zZXNzaW9uX2VuZCA9IGRhdGEtPmZvcmNlX3Nlc3Npb25fZW5kOworCWRhdGEtPmZvcmNlX3Nlc3Npb25fZW5kID0gZmFsc2U7CisKIAlpZiAoaWRfZGV0ICE9IGRhdGEtPmlkX2RldCkgewotCQkvKgotCQkgKiBXaGVuIGEgaG9zdCBjYWJsZSAoaWQgPT0gMCkgZ2V0cyBwbHVnZ2VkIGluIG9uIHN5c3RlbXMKLQkJICogd2l0aG91dCB2YnVzIGRldGVjdGlvbiByZXBvcnQgdmJ1cyBsb3cgZm9yIGxvbmcgZW5vdWdoIGZvcgotCQkgKiB0aGUgbXVzYi1pcCB0byBlbmQgdGhlIGN1cnJlbnQgZGV2aWNlIHNlc3Npb24uCi0JCSAqLwotCQlpZiAoIXN1bjRpX3VzYl9waHkwX2hhdmVfdmJ1c19kZXQoZGF0YSkgJiYgaWRfZGV0ID09IDApIHsKKwkJLyogaWQtY2hhbmdlLCBmb3JjZSBzZXNzaW9uIGVuZCBpZiB3ZSd2ZSBubyB2YnVzIGRldGVjdGlvbiAqLworCQlpZiAoZGF0YS0+ZHJfbW9kZSA9PSBVU0JfRFJfTU9ERV9PVEcgJiYKKwkJICAgICFzdW40aV91c2JfcGh5MF9oYXZlX3ZidXNfZGV0KGRhdGEpKQorCQkJZm9yY2Vfc2Vzc2lvbl9lbmQgPSB0cnVlOworCisJCS8qIFdoZW4gZW50ZXJpbmcgaG9zdCBtb2RlIChpZCA9IDApIGZvcmNlIGVuZCB0aGUgc2Vzc2lvbiBub3cgKi8KKwkJaWYgKGZvcmNlX3Nlc3Npb25fZW5kICYmIGlkX2RldCA9PSAwKSB7CiAJCQlzdW40aV91c2JfcGh5MF9zZXRfdmJ1c19kZXRlY3QocGh5MCwgMCk7CiAJCQltc2xlZXAoMjAwKTsKIAkJCXN1bjRpX3VzYl9waHkwX3NldF92YnVzX2RldGVjdChwaHkwLCAxKTsKIAkJfQogCQlzdW40aV91c2JfcGh5MF9zZXRfaWRfZGV0ZWN0KHBoeTAsIGlkX2RldCk7CiAJCWRhdGEtPmlkX2RldCA9IGlkX2RldDsKLQkJaWRfbm90aWZ5ID0gMTsKKwkJaWRfbm90aWZ5ID0gdHJ1ZTsKIAl9CiAKIAlpZiAodmJ1c19kZXQgIT0gZGF0YS0+dmJ1c19kZXQpIHsKIAkJc3VuNGlfdXNiX3BoeTBfc2V0X3ZidXNfZGV0ZWN0KHBoeTAsIHZidXNfZGV0KTsKIAkJZGF0YS0+dmJ1c19kZXQgPSB2YnVzX2RldDsKLQkJdmJ1c19ub3RpZnkgPSAxOworCQl2YnVzX25vdGlmeSA9IHRydWU7CiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZwaHkwLT5tdXRleCk7CkBAIC00NjksMTIgKzUzMCw4IEBACiAJaWYgKGlkX25vdGlmeSkgewogCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhkYXRhLT5leHRjb24sIEVYVENPTl9VU0JfSE9TVCwKIAkJCQkJIWlkX2RldCk7Ci0JCS8qCi0JCSAqIFdoZW4gYSBob3N0IGNhYmxlIGdldHMgdW5wbHVnZ2VkIChpZCA9PSAxKSBvbiBzeXN0ZW1zCi0JCSAqIHdpdGhvdXQgdmJ1cyBkZXRlY3Rpb24gcmVwb3J0IHZidXMgbG93IGZvciBsb25nIGVub3VnaCB0bwotCQkgKiB0aGUgbXVzYi1pcCB0byBlbmQgdGhlIGN1cnJlbnQgaG9zdCBzZXNzaW9uLgotCQkgKi8KLQkJaWYgKCFzdW40aV91c2JfcGh5MF9oYXZlX3ZidXNfZGV0KGRhdGEpICYmIGlkX2RldCA9PSAxKSB7CisJCS8qIFdoZW4gbGVhdmluZyBob3N0IG1vZGUgZm9yY2UgZW5kIHRoZSBzZXNzaW9uIGhlcmUgKi8KKwkJaWYgKGZvcmNlX3Nlc3Npb25fZW5kICYmIGlkX2RldCA9PSAxKSB7CiAJCQltdXRleF9sb2NrKCZwaHkwLT5tdXRleCk7CiAJCQlzdW40aV91c2JfcGh5MF9zZXRfdmJ1c19kZXRlY3QocGh5MCwgMCk7CiAJCQltc2xlZXAoMTAwMCk7CkBAIC01NjEsNyArNjE4LDcgQEAKIAlpZiAoIWRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbXV0ZXhfaW5pdCgmZGF0YS0+bXV0ZXgpOworCXNwaW5fbG9ja19pbml0KCZkYXRhLT5yZWdfbG9jayk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJmRhdGEtPmRldGVjdCwgc3VuNGlfdXNiX3BoeTBfaWRfdmJ1c19kZXRfc2Nhbik7CiAJZGV2X3NldF9kcnZkYXRhKGRldiwgZGF0YSk7CiAJZGF0YS0+Y2ZnID0gb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKGRldik7CkBAIC01OTMsMjMgKzY1MCwxNiBAQAogCQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CiAJfQogCi0JLyogdmJ1c19kZXQgd2l0aG91dCBpZF9kZXQgbWFrZXMgbm8gc2Vuc2UsIGFuZCBpcyBub3Qgc3VwcG9ydGVkICovCi0JaWYgKHN1bjRpX3VzYl9waHkwX2hhdmVfdmJ1c19kZXQoZGF0YSkgJiYgIWRhdGEtPmlkX2RldF9ncGlvKSB7Ci0JCWRldl9lcnIoZGV2LCAidXNiMF9pZF9kZXQgbWlzc2luZyBvciBpbnZhbGlkXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQorCWRhdGEtPmRyX21vZGUgPSBvZl91c2JfZ2V0X2RyX21vZGVfYnlfcGh5KG5wLCAwKTsKIAotCWlmIChkYXRhLT5pZF9kZXRfZ3BpbykgewotCQlkYXRhLT5leHRjb24gPSBkZXZtX2V4dGNvbl9kZXZfYWxsb2NhdGUoZGV2LAotCQkJCQkJCXN1bjRpX3VzYl9waHkwX2NhYmxlKTsKLQkJaWYgKElTX0VSUihkYXRhLT5leHRjb24pKQotCQkJcmV0dXJuIFBUUl9FUlIoZGF0YS0+ZXh0Y29uKTsKKwlkYXRhLT5leHRjb24gPSBkZXZtX2V4dGNvbl9kZXZfYWxsb2NhdGUoZGV2LCBzdW40aV91c2JfcGh5MF9jYWJsZSk7CisJaWYgKElTX0VSUihkYXRhLT5leHRjb24pKQorCQlyZXR1cm4gUFRSX0VSUihkYXRhLT5leHRjb24pOwogCi0JCXJldCA9IGRldm1fZXh0Y29uX2Rldl9yZWdpc3RlcihkZXYsIGRhdGEtPmV4dGNvbik7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGV4dGNvbjogJWRcbiIsIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9CisJcmV0ID0gZGV2bV9leHRjb25fZGV2X3JlZ2lzdGVyKGRldiwgZGF0YS0+ZXh0Y29uKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGV4dGNvbjogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IGRhdGEtPmNmZy0+bnVtX3BoeXM7IGkrKykgewpAQCAtNzEzLDYgKzc2Myw3IEBACiAJLmRpc2NfdGhyZXNoID0gMywKIAkucGh5Y3RsX29mZnNldCA9IFJFR19QSFlDVExfQTEwLAogCS5kZWRpY2F0ZWRfY2xvY2tzID0gZmFsc2UsCisJLmVuYWJsZV9wbXVfdW5rMSA9IGZhbHNlLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzdW40aV91c2JfcGh5X2NmZyBzdW41aV9hMTNfY2ZnID0gewpAQCAtNzIxLDYgKzc3Miw3IEBACiAJLmRpc2NfdGhyZXNoID0gMiwKIAkucGh5Y3RsX29mZnNldCA9IFJFR19QSFlDVExfQTEwLAogCS5kZWRpY2F0ZWRfY2xvY2tzID0gZmFsc2UsCisJLmVuYWJsZV9wbXVfdW5rMSA9IGZhbHNlLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzdW40aV91c2JfcGh5X2NmZyBzdW42aV9hMzFfY2ZnID0gewpAQCAtNzI5LDYgKzc4MSw3IEBACiAJLmRpc2NfdGhyZXNoID0gMywKIAkucGh5Y3RsX29mZnNldCA9IFJFR19QSFlDVExfQTEwLAogCS5kZWRpY2F0ZWRfY2xvY2tzID0gdHJ1ZSwKKwkuZW5hYmxlX3BtdV91bmsxID0gZmFsc2UsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1bjRpX3VzYl9waHlfY2ZnIHN1bjdpX2EyMF9jZmcgPSB7CkBAIC03MzcsNiArNzkwLDcgQEAKIAkuZGlzY190aHJlc2ggPSAyLAogCS5waHljdGxfb2Zmc2V0ID0gUkVHX1BIWUNUTF9BMTAsCiAJLmRlZGljYXRlZF9jbG9ja3MgPSBmYWxzZSwKKwkuZW5hYmxlX3BtdV91bmsxID0gZmFsc2UsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1bjRpX3VzYl9waHlfY2ZnIHN1bjhpX2EyM19jZmcgPSB7CkBAIC03NDUsNiArNzk5LDcgQEAKIAkuZGlzY190aHJlc2ggPSAzLAogCS5waHljdGxfb2Zmc2V0ID0gUkVHX1BIWUNUTF9BMTAsCiAJLmRlZGljYXRlZF9jbG9ja3MgPSB0cnVlLAorCS5lbmFibGVfcG11X3VuazEgPSBmYWxzZSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VuNGlfdXNiX3BoeV9jZmcgc3VuOGlfYTMzX2NmZyA9IHsKQEAgLTc1Myw2ICs4MDgsNyBAQAogCS5kaXNjX3RocmVzaCA9IDMsCiAJLnBoeWN0bF9vZmZzZXQgPSBSRUdfUEhZQ1RMX0EzMywKIAkuZGVkaWNhdGVkX2Nsb2NrcyA9IHRydWUsCisJLmVuYWJsZV9wbXVfdW5rMSA9IGZhbHNlLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzdW40aV91c2JfcGh5X2NmZyBzdW44aV9oM19jZmcgPSB7CkBAIC03NjAsNiArODE2LDE2IEBACiAJLnR5cGUgPSBzdW44aV9oM19waHksCiAJLmRpc2NfdGhyZXNoID0gMywKIAkuZGVkaWNhdGVkX2Nsb2NrcyA9IHRydWUsCisJLmVuYWJsZV9wbXVfdW5rMSA9IHRydWUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHN1bjRpX3VzYl9waHlfY2ZnIHN1bjUwaV9hNjRfY2ZnID0geworCS5udW1fcGh5cyA9IDIsCisJLnR5cGUgPSBzdW41MGlfYTY0X3BoeSwKKwkuZGlzY190aHJlc2ggPSAzLAorCS5waHljdGxfb2Zmc2V0ID0gUkVHX1BIWUNUTF9BMzMsCisJLmRlZGljYXRlZF9jbG9ja3MgPSB0cnVlLAorCS5lbmFibGVfcG11X3VuazEgPSB0cnVlLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VuNGlfdXNiX3BoeV9vZl9tYXRjaFtdID0gewpAQCAtNzcwLDYgKzgzNiw4IEBACiAJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuOGktYTIzLXVzYi1waHkiLCAuZGF0YSA9ICZzdW44aV9hMjNfY2ZnIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuOGktYTMzLXVzYi1waHkiLCAuZGF0YSA9ICZzdW44aV9hMzNfY2ZnIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuOGktaDMtdXNiLXBoeSIsIC5kYXRhID0gJnN1bjhpX2gzX2NmZyB9LAorCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjUwaS1hNjQtdXNiLXBoeSIsCisJICAuZGF0YSA9ICZzdW41MGlfYTY0X2NmZ30sCiAJeyB9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHN1bjRpX3VzYl9waHlfb2ZfbWF0Y2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LXN1bjlpLXVzYi5jIGIvZHJpdmVycy9waHkvcGh5LXN1bjlpLXVzYi5jCmluZGV4IGFjNGYzMWEuLjI4ZmNlNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3BoeS1zdW45aS11c2IuYworKysgYi9kcml2ZXJzL3BoeS9waHktc3VuOWktdXNiLmMKQEAgLTE0MSw5ICsxNDEsOSBAQAogCQl9CiAKIAkJcGh5LT5oc2ljX2NsayA9IGRldm1fY2xrX2dldChkZXYsICJoc2ljXzEyTSIpOwotCQlpZiAoSVNfRVJSKHBoeS0+Y2xrKSkgeworCQlpZiAoSVNfRVJSKHBoeS0+aHNpY19jbGspKSB7CiAJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgaHNpY18xMk0gY2xvY2tcbiIpOwotCQkJcmV0dXJuIFBUUl9FUlIocGh5LT5jbGspOworCQkJcmV0dXJuIFBUUl9FUlIocGh5LT5oc2ljX2Nsayk7CiAJCX0KIAogCQlwaHktPnJlc2V0ID0gZGV2bV9yZXNldF9jb250cm9sX2dldChkZXYsICJoc2ljIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktdHdsNDAzMC11c2IuYyBiL2RyaXZlcnMvcGh5L3BoeS10d2w0MDMwLXVzYi5jCmluZGV4IGQ5YjEwYTMuLjg3ZTYzMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3BoeS10d2w0MDMwLXVzYi5jCisrKyBiL2RyaXZlcnMvcGh5L3BoeS10d2w0MDMwLXVzYi5jCkBAIC0xNzIsNiArMTcyLDcgQEAKIAlpbnQJCQlpcnE7CiAJZW51bSBtdXNiX3ZidXNfaWRfc3RhdHVzIGxpbmtzdGF0OwogCWJvb2wJCQl2YnVzX3N1cHBsaWVkOworCWJvb2wJCQltdXNiX21haWxib3hfcGVuZGluZzsKIAogCXN0cnVjdCBkZWxheWVkX3dvcmsJaWRfd29ya2Fyb3VuZF93b3JrOwogfTsKQEAgLTQzOSw2ICs0NDAsMTcgQEAKIAkJCSAgKFBIWV9DTEtfQ1RSTF9DTE9DS0dBVElOR19FTiB8CiAJCQkgICBQSFlfQ0xLX0NUUkxfQ0xLMzJLX0VOKSk7CiAKKwl0d2w0MDMwX2kyY19hY2Nlc3ModHdsLCAxKTsKKwl0d2w0MDMwX3VzYl9zZXRfbW9kZSh0d2wsIHR3bC0+dXNiX21vZGUpOworCWlmICh0d2wtPnVzYl9tb2RlID09IFQyX1VTQl9NT0RFX1VMUEkpCisJCXR3bDQwMzBfaTJjX2FjY2Vzcyh0d2wsIDApOworCS8qCisJICogQWNjb3JkaW5nIHRvIHRoZSBUUFM2NTk1MCBUUk0sIHRoZXJlIGhhcyB0byBiZSBhdCBsZWFzdCA1MG1zCisJICogZGVsYXkgYmV0d2VlbiBzZXR0aW5nIFBPV0VSX0NUUkxfT1RHX0VOQUIgYW5kIGVuYWJsaW5nIGNoYXJnaW5nCisJICogc28gd2FpdCBoZXJlIHNvIHRoYXQgYSBmdWxseSBlbmFibGVkIHBoeSBjYW4gYmUgZXhwZWN0ZWQgYWZ0ZXIKKwkgKiByZXN1bWUKKwkgKi8KKwltc2xlZXAoNTApOwogCXJldHVybiAwOwogfQogCkBAIC00NTksMTEgKzQ3MSw2IEBACiAKIAlkZXZfZGJnKHR3bC0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIAlwbV9ydW50aW1lX2dldF9zeW5jKHR3bC0+ZGV2KTsKLQl0d2w0MDMwX2kyY19hY2Nlc3ModHdsLCAxKTsKLQl0d2w0MDMwX3VzYl9zZXRfbW9kZSh0d2wsIHR3bC0+dXNiX21vZGUpOwotCWlmICh0d2wtPnVzYl9tb2RlID09IFQyX1VTQl9NT0RFX1VMUEkpCi0JCXR3bDQwMzBfaTJjX2FjY2Vzcyh0d2wsIDApOwotCXR3bC0+bGlua3N0YXQgPSBNVVNCX1VOS05PV047CiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ0d2wtPmlkX3dvcmthcm91bmRfd29yaywgSFopOwogCiAJcmV0dXJuIDA7CkBAIC01NjksOSArNTc2LDEyIEBACiAJCQlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KHR3bC0+ZGV2KTsKIAkJCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKHR3bC0+ZGV2KTsKIAkJfQorCQl0d2wtPm11c2JfbWFpbGJveF9wZW5kaW5nID0gdHJ1ZTsKKwl9CisJaWYgKHR3bC0+bXVzYl9tYWlsYm94X3BlbmRpbmcpIHsKIAkJZXJyID0gbXVzYl9tYWlsYm94KHN0YXR1cyk7Ci0JCWlmIChlcnIpCi0JCQl0d2wtPmxpbmtzdGF0ID0gTVVTQl9VTktOT1dOOworCQlpZiAoIWVycikKKwkJCXR3bC0+bXVzYl9tYWlsYm94X3BlbmRpbmcgPSBmYWxzZTsKIAl9CiAKIAkvKiBkb24ndCBzY2hlZHVsZSBkdXJpbmcgc2xlZXAgLSBpcnEgd29ya3MgcmlnaHQgdGhlbiAqLwpAQCAtNjc2LDYgKzY4Niw3IEBACiAJdHdsLT5pcnEJCT0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKIAl0d2wtPnZidXNfc3VwcGxpZWQJPSBmYWxzZTsKIAl0d2wtPmxpbmtzdGF0CQk9IE1VU0JfVU5LTk9XTjsKKwl0d2wtPm11c2JfbWFpbGJveF9wZW5kaW5nID0gZmFsc2U7CiAKIAl0d2wtPnBoeS5kZXYJCT0gdHdsLT5kZXY7CiAJdHdsLT5waHkubGFiZWwJCT0gInR3bDQwMzAiOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvdGVncmEveHVzYi5jIGIvZHJpdmVycy9waHkvdGVncmEveHVzYi5jCmluZGV4IGVjODNkZmQuLjg3MzQyNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3RlZ3JhL3h1c2IuYworKysgYi9kcml2ZXJzL3BoeS90ZWdyYS94dXNiLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvdGVncmEveHVzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+CkBAIC0xMDEsNyArMTAyLDggQEAKIAlyZXR1cm4gb2ZfZmluZF9ub2RlX2J5X25hbWUobnAsIHBhZC0+c29jLT5sYW5lc1tpbmRleF0ubmFtZSk7CiB9CiAKLWludCB0ZWdyYV94dXNiX2xhbmVfbG9va3VwX2Z1bmN0aW9uKHN0cnVjdCB0ZWdyYV94dXNiX2xhbmUgKmxhbmUsCitzdGF0aWMgaW50Cit0ZWdyYV94dXNiX2xhbmVfbG9va3VwX2Z1bmN0aW9uKHN0cnVjdCB0ZWdyYV94dXNiX2xhbmUgKmxhbmUsCiAJCQkJICAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uKQogewogCXVuc2lnbmVkIGludCBpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL0tjb25maWcgYi9kcml2ZXJzL3BpbmN0cmwvS2NvbmZpZwppbmRleCBiM2ZlMWQzLi4wZTc1ZDk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvS2NvbmZpZworKysgYi9kcml2ZXJzL3BpbmN0cmwvS2NvbmZpZwpAQCAtMjU0LDYgKzI1NCw3IEBACiAJaGVscAogCSAgVGhpcyBzZWxlY3RzIHRoZSBwaW5jdHJsIGRyaXZlciBmb3IgWGlsaW54IFp5bnEuCiAKK3NvdXJjZSAiZHJpdmVycy9waW5jdHJsL2FzcGVlZC9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL3BpbmN0cmwvYmNtL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvcGluY3RybC9iZXJsaW4vS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9waW5jdHJsL2ZyZWVzY2FsZS9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL01ha2VmaWxlIGIvZHJpdmVycy9waW5jdHJsL01ha2VmaWxlCmluZGV4IDhlYmQ3YjguLjExYmFkMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BpbmN0cmwvTWFrZWZpbGUKQEAgLTM3LDYgKzM3LDcgQEAKIG9iai0kKENPTkZJR19QSU5DVFJMX1NUKSAJKz0gcGluY3RybC1zdC5vCiBvYmotJChDT05GSUdfUElOQ1RSTF9aWU5RKQkrPSBwaW5jdHJsLXp5bnEubwogCitvYmotJChDT05GSUdfQVJDSF9BU1BFRUQpCSs9IGFzcGVlZC8KIG9iai15CQkJCSs9IGJjbS8KIG9iai0kKENPTkZJR19QSU5DVFJMX0JFUkxJTikJKz0gYmVybGluLwogb2JqLXkJCQkJKz0gZnJlZXNjYWxlLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL2FzcGVlZC9LY29uZmlnIGIvZHJpdmVycy9waW5jdHJsL2FzcGVlZC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5OGVhYmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BpbmN0cmwvYXNwZWVkL0tjb25maWcKQEAgLTAsMCArMSwyNCBAQAorY29uZmlnIFBJTkNUUkxfQVNQRUVECisJYm9vbAorCWRlcGVuZHMgb24gKEFSQ0hfQVNQRUVEIHx8IENPTVBJTEVfVEVTVCkgJiYgT0YKKwlkZXBlbmRzIG9uIE1GRF9TWVNDT04KKwlzZWxlY3QgUElOTVVYCisJc2VsZWN0IFBJTkNPTkYKKwlzZWxlY3QgR0VORVJJQ19QSU5DT05GCisJc2VsZWN0IFJFR01BUF9NTUlPCisKK2NvbmZpZyBQSU5DVFJMX0FTUEVFRF9HNAorCWJvb2wgIkFzcGVlZCBHNCBTb0MgcGluIGNvbnRyb2wiCisJZGVwZW5kcyBvbiAoTUFDSF9BU1BFRURfRzQgfHwgQ09NUElMRV9URVNUKSAmJiBPRgorCXNlbGVjdCBQSU5DVFJMX0FTUEVFRAorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHBpbiBjb250cm9sbGVyIHN1cHBvcnQgZm9yIEFzcGVlZCdzIDR0aAorCSAgZ2VuZXJhdGlvbiBTb0NzLiBHUElPIGlzIHByb3ZpZGVkIGJ5IGEgc2VwYXJhdGUgR1BJTyBkcml2ZXIuCisKK2NvbmZpZyBQSU5DVFJMX0FTUEVFRF9HNQorCWJvb2wgIkFzcGVlZCBHNSBTb0MgcGluIGNvbnRyb2wiCisJZGVwZW5kcyBvbiAoTUFDSF9BU1BFRURfRzUgfHwgQ09NUElMRV9URVNUKSAmJiBPRgorCXNlbGVjdCBQSU5DVFJMX0FTUEVFRAorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHBpbiBjb250cm9sbGVyIHN1cHBvcnQgZm9yIEFzcGVlZCdzIDV0aAorCSAgZ2VuZXJhdGlvbiBTb0NzLiBHUElPIGlzIHByb3ZpZGVkIGJ5IGEgc2VwYXJhdGUgR1BJTyBkcml2ZXIuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvYXNwZWVkL01ha2VmaWxlIGIvZHJpdmVycy9waW5jdHJsL2FzcGVlZC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTFlZDBmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waW5jdHJsL2FzcGVlZC9NYWtlZmlsZQpAQCAtMCwwICsxLDYgQEAKKyMgQXNwZWVkIHBpbmN0cmwgc3VwcG9ydAorCitjY2ZsYWdzLXkgKz0gLVdvdmVycmlkZS1pbml0CitvYmotJChDT05GSUdfUElOQ1RSTF9BU1BFRUQpCSs9IHBpbmN0cmwtYXNwZWVkLm8KK29iai0kKENPTkZJR19QSU5DVFJMX0FTUEVFRF9HNCkJKz0gcGluY3RybC1hc3BlZWQtZzQubworb2JqLSQoQ09ORklHX1BJTkNUUkxfQVNQRUVEX0c1KQkrPSBwaW5jdHJsLWFzcGVlZC1nNS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvYXNwZWVkL3BpbmN0cmwtYXNwZWVkLWc0LmMgYi9kcml2ZXJzL3BpbmN0cmwvYXNwZWVkL3BpbmN0cmwtYXNwZWVkLWc0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIxYjA3MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGluY3RybC9hc3BlZWQvcGluY3RybC1hc3BlZWQtZzQuYwpAQCAtMCwwICsxLDEyMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgSUJNIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmN0cmwuaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3Bpbm11eC5oPgorI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGluY29uZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGluY29uZi1nZW5lcmljLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgIi4uL2NvcmUuaCIKKyNpbmNsdWRlICIuLi9waW5jdHJsLXV0aWxzLmgiCisjaW5jbHVkZSAicGluY3RybC1hc3BlZWQuaCIKKworLyoKKyAqIFVzZXMgdW5kZWZpbmVkIG1hY3JvcyBmb3Igc3ltYm9sIG5hbWluZyBhbmQgcmVmZXJlbmNlcywgZWcgR1BJT0EwLCBNQUMxTElOSywKKyAqIFRJTUVSMyBldGMuCisgKgorICogUGlucyBhcmUgZGVmaW5lZCBpbiBHUElPIGJhbmsgb3JkZXI6CisgKgorICogR1BJT0EwOiAwCisgKiAuLi4KKyAqIEdQSU9BNzogNworICogR1BJT0IwOiA4CisgKiAuLi4KKyAqIEdQSU9aNzogMjA3CisgKiBHUElPQUEwOiAyMDgKKyAqIC4uLgorICogR1BJT0FCMzogMjE5CisgKgorICogTm90IGFsbCBwaW5zIGhhdmUgdGhlaXIgc2lnbmFscyBkZWZpbmVkICh5ZXQpLgorICovCisKKyNkZWZpbmUgQTQgMgorU1NTRl9QSU5fREVDTChBNCwgR1BJT0EyLCBUSU1FUjMsIFNJR19ERVNDX1NFVChTQ1U4MCwgMikpOworCisjZGVmaW5lIEkyQzlfREVTQwlTSUdfREVTQ19TRVQoU0NVOTAsIDIyKQorCisjZGVmaW5lIEM1IDQKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0NMOSwgSTJDOSwgSTJDOV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVElNRVI1LCBUSU1FUjUsIFNJR19ERVNDX1NFVChTQ1U4MCwgNCkpOworTVNfUElOX0RFQ0woQzUsIEdQSU9BNCwgU0NMOSwgVElNRVI1KTsKKworRlVOQ19HUk9VUF9ERUNMKFRJTUVSNSwgQzUpOworCisjZGVmaW5lIEI0IDUKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBOSwgSTJDOSwgSTJDOV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVElNRVI2LCBUSU1FUjYsIFNJR19ERVNDX1NFVChTQ1U4MCwgNSkpOworTVNfUElOX0RFQ0woQjQsIEdQSU9BNSwgU0RBOSwgVElNRVI2KTsKKworRlVOQ19HUk9VUF9ERUNMKFRJTUVSNiwgQjQpOworRlVOQ19HUk9VUF9ERUNMKEkyQzksIEM1LCBCNCk7CisKKyNkZWZpbmUgTURJTzJfREVTQwlTSUdfREVTQ19TRVQoU0NVOTAsIDIpCisKKyNkZWZpbmUgQTMgNgorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShNREMyLCBNRElPMiwgTURJTzJfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFRJTUVSNywgVElNRVI3LCBTSUdfREVTQ19TRVQoU0NVODAsIDYpKTsKK01TX1BJTl9ERUNMKEEzLCBHUElPQTYsIE1EQzIsIFRJTUVSNyk7CisKK0ZVTkNfR1JPVVBfREVDTChUSU1FUjcsIEEzKTsKKworI2RlZmluZSBENSA3CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE1ESU8yLCBNRElPMiwgTURJTzJfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFRJTUVSOCwgVElNRVI4LCBTSUdfREVTQ19TRVQoU0NVODAsIDcpKTsKK01TX1BJTl9ERUNMKEQ1LCBHUElPQTcsIE1ESU8yLCBUSU1FUjgpOworCitGVU5DX0dST1VQX0RFQ0woVElNRVI4LCBENSk7CitGVU5DX0dST1VQX0RFQ0woTURJTzIsIEEzLCBENSk7CisKKyNkZWZpbmUgSDE5IDEzCisjZGVmaW5lIEgxOV9ERVNDICAgICAgICBTSUdfREVTQ19TRVQoU0NVODAsIDEzKQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShMUENQRCwgTFBDUEQsIEgxOV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTFBDU01JLCBMUENTTUksIEgxOV9ERVNDKTsKK01TX1BJTl9ERUNMKEgxOSwgR1BJT0I1LCBMUENQRCwgTFBDU01JKTsKKworRlVOQ19HUk9VUF9ERUNMKExQQ1BELCBIMTkpOworRlVOQ19HUk9VUF9ERUNMKExQQ1NNSSwgSDE5KTsKKworI2RlZmluZSBIMjAgMTQKK1NTU0ZfUElOX0RFQ0woSDIwLCBHUElPQjYsIExQQ1BNRSwgU0lHX0RFU0NfU0VUKFNDVTgwLCAxNCkpOworCisjZGVmaW5lIFNEMV9ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMCkKKyNkZWZpbmUgSTJDMTBfREVTQwlTSUdfREVTQ19TRVQoU0NVOTAsIDIzKQorCisjZGVmaW5lIEM0IDE2CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEMUNMSywgU0QxLCBTRDFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNDTDEwLCBJMkMxMCwgSTJDMTBfREVTQyk7CitNU19QSU5fREVDTChDNCwgR1BJT0MwLCBTRDFDTEssIFNDTDEwKTsKKworI2RlZmluZSBCMyAxNworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTRDFDTUQsIFNEMSwgU0QxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTREExMCwgSTJDMTAsIEkyQzEwX0RFU0MpOworTVNfUElOX0RFQ0woQjMsIEdQSU9DMSwgU0QxQ01ELCBTREExMCk7CisKK0ZVTkNfR1JPVVBfREVDTChJMkMxMCwgQzQsIEIzKTsKKworI2RlZmluZSBJMkMxMV9ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMjQpCisKKyNkZWZpbmUgQTIgMTgKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0QxREFUMCwgU0QxLCBTRDFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNDTDExLCBJMkMxMSwgSTJDMTFfREVTQyk7CitNU19QSU5fREVDTChBMiwgR1BJT0MyLCBTRDFEQVQwLCBTQ0wxMSk7CisKKyNkZWZpbmUgRTUgMTkKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0QxREFUMSwgU0QxLCBTRDFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEQTExLCBJMkMxMSwgSTJDMTFfREVTQyk7CitNU19QSU5fREVDTChFNSwgR1BJT0MzLCBTRDFEQVQxLCBTREExMSk7CisKK0ZVTkNfR1JPVVBfREVDTChJMkMxMSwgQTIsIEU1KTsKKworI2RlZmluZSBJMkMxMl9ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMjUpCisKKyNkZWZpbmUgRDQgMjAKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0QxREFUMiwgU0QxLCBTRDFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNDTDEyLCBJMkMxMiwgSTJDMTJfREVTQyk7CitNU19QSU5fREVDTChENCwgR1BJT0M0LCBTRDFEQVQyLCBTQ0wxMik7CisKKyNkZWZpbmUgQzMgMjEKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0QxREFUMywgU0QxLCBTRDFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEQTEyLCBJMkMxMiwgSTJDMTJfREVTQyk7CitNU19QSU5fREVDTChDMywgR1BJT0M1LCBTRDFEQVQzLCBTREExMik7CisKK0ZVTkNfR1JPVVBfREVDTChJMkMxMiwgRDQsIEMzKTsKKworI2RlZmluZSBJMkMxM19ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMjYpCisKKyNkZWZpbmUgQjIgMjIKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0QxQ0QsIFNEMSwgU0QxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTQ0wxMywgSTJDMTMsIEkyQzEzX0RFU0MpOworTVNfUElOX0RFQ0woQjIsIEdQSU9DNiwgU0QxQ0QsIFNDTDEzKTsKKworI2RlZmluZSBBMSAyMworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTRDFXUCwgU0QxLCBTRDFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEQTEzLCBJMkMxMywgSTJDMTNfREVTQyk7CitNU19QSU5fREVDTChBMSwgR1BJT0M3LCBTRDFXUCwgU0RBMTMpOworCitGVU5DX0dST1VQX0RFQ0woSTJDMTMsIEIyLCBBMSk7CitGVU5DX0dST1VQX0RFQ0woU0QxLCBDNCwgQjMsIEEyLCBFNSwgRDQsIEMzLCBCMiwgQTEpOworCisjZGVmaW5lIFNEMl9ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMSkKKyNkZWZpbmUgR1BJRF9ERVNDICAgICAgIFNJR19ERVNDX1NFVChIV19TVFJBUDEsIDIxKQorI2RlZmluZSBHUElEMF9ERVNDCVNJR19ERVNDX1NFVChTQ1U4QywgOCkKKworI2RlZmluZSBBMTggMjQKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0QyQ0xLLCBTRDIsIFNEMl9ERVNDKTsKK1NJR19FWFBSX0RFQ0woR1BJRDBJTiwgR1BJRDAsIEdQSUQwX0RFU0MpOworU0lHX0VYUFJfREVDTChHUElEMElOLCBHUElELCBHUElEX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoR1BJRDBJTiwgR1BJRDAsIEdQSUQpOworTVNfUElOX0RFQ0woQTE4LCBHUElPRDAsIFNEMkNMSywgR1BJRDBJTik7CisKKyNkZWZpbmUgRDE2IDI1CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEMkNNRCwgU0QyLCBTRDJfREVTQyk7CitTSUdfRVhQUl9ERUNMKEdQSUQwT1VULCBHUElEMCwgR1BJRDBfREVTQyk7CitTSUdfRVhQUl9ERUNMKEdQSUQwT1VULCBHUElELCBHUElEX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoR1BJRDBPVVQsIEdQSUQwLCBHUElEKTsKK01TX1BJTl9ERUNMKEQxNiwgR1BJT0QxLCBTRDJDTUQsIEdQSUQwT1VUKTsKKworRlVOQ19HUk9VUF9ERUNMKEdQSUQwLCBBMTgsIEQxNik7CisKKyNkZWZpbmUgR1BJRV9ERVNDICAgICAgIFNJR19ERVNDX1NFVChIV19TVFJBUDEsIDIyKQorI2RlZmluZSBHUElFMF9ERVNDICAgICAgU0lHX0RFU0NfU0VUKFNDVThDLCAxMikKKyNkZWZpbmUgR1BJRTJfREVTQyAgICAgIFNJR19ERVNDX1NFVChTQ1U4QywgMTMpCisjZGVmaW5lIEdQSUU0X0RFU0MgICAgICBTSUdfREVTQ19TRVQoU0NVOEMsIDE0KQorI2RlZmluZSBHUElFNl9ERVNDICAgICAgU0lHX0RFU0NfU0VUKFNDVThDLCAxNSkKKworI2RlZmluZSBEMTUgMzIKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTkNUUzMsIE5DVFMzLCBTSUdfREVTQ19TRVQoU0NVODAsIDE2KSk7CitTSUdfRVhQUl9ERUNMKEdQSUUwSU4sIEdQSUUwLCBHUElFMF9ERVNDKTsKK1NJR19FWFBSX0RFQ0woR1BJRTBJTiwgR1BJRSwgR1BJRV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKEdQSUUwSU4sIEdQSUUwLCBHUElFKTsKK01TX1BJTl9ERUNMKEQxNSwgR1BJT0UwLCBOQ1RTMywgR1BJRTBJTik7CisKK0ZVTkNfR1JPVVBfREVDTChOQ1RTMywgRDE1KTsKKworI2RlZmluZSBDMTUgMzMKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTkRDRDMsIE5EQ0QzLCBTSUdfREVTQ19TRVQoU0NVODAsIDE3KSk7CitTSUdfRVhQUl9ERUNMKEdQSUUwT1VULCBHUElFMCwgR1BJRTBfREVTQyk7CitTSUdfRVhQUl9ERUNMKEdQSUUwT1VULCBHUElFLCBHUElFX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoR1BJRTBPVVQsIEdQSUUwLCBHUElFKTsKK01TX1BJTl9ERUNMKEMxNSwgR1BJT0UxLCBORENEMywgR1BJRTBPVVQpOworCitGVU5DX0dST1VQX0RFQ0woTkRDRDMsIEMxNSk7CitGVU5DX0dST1VQX0RFQ0woR1BJRTAsIEQxNSwgQzE1KTsKKworI2RlZmluZSBCMTUgMzQKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTkRTUjMsIE5EU1IzLCBTSUdfREVTQ19TRVQoU0NVODAsIDE4KSk7CitTSUdfRVhQUl9ERUNMKEdQSUUySU4sIEdQSUUyLCBHUElFMl9ERVNDKTsKK1NJR19FWFBSX0RFQ0woR1BJRTJJTiwgR1BJRSwgR1BJRV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKEdQSUUySU4sIEdQSUUyLCBHUElFKTsKK01TX1BJTl9ERUNMKEIxNSwgR1BJT0UyLCBORFNSMywgR1BJRTJJTik7CisKK0ZVTkNfR1JPVVBfREVDTChORFNSMywgQjE1KTsKKworI2RlZmluZSBBMTUgMzUKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTlJJMywgTlJJMywgU0lHX0RFU0NfU0VUKFNDVTgwLCAxOSkpOworU0lHX0VYUFJfREVDTChHUElFMk9VVCwgR1BJRTIsIEdQSUUyX0RFU0MpOworU0lHX0VYUFJfREVDTChHUElFMk9VVCwgR1BJRSwgR1BJRV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKEdQSUUyT1VULCBHUElFMiwgR1BJRSk7CitNU19QSU5fREVDTChBMTUsIEdQSU9FMywgTlJJMywgR1BJRTJPVVQpOworCitGVU5DX0dST1VQX0RFQ0woTlJJMywgQTE1KTsKK0ZVTkNfR1JPVVBfREVDTChHUElFMiwgQjE1LCBBMTUpOworCisjZGVmaW5lIEUxNCAzNgorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShORFRSMywgTkRUUjMsIFNJR19ERVNDX1NFVChTQ1U4MCwgMjApKTsKK1NJR19FWFBSX0RFQ0woR1BJRTRJTiwgR1BJRTQsIEdQSUU0X0RFU0MpOworU0lHX0VYUFJfREVDTChHUElFNElOLCBHUElFLCBHUElFX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoR1BJRTRJTiwgR1BJRTQsIEdQSUUpOworTVNfUElOX0RFQ0woRTE0LCBHUElPRTQsIE5EVFIzLCBHUElFNElOKTsKKworRlVOQ19HUk9VUF9ERUNMKE5EVFIzLCBFMTQpOworCisjZGVmaW5lIEQxNCAzNworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShOUlRTMywgTlJUUzMsIFNJR19ERVNDX1NFVChTQ1U4MCwgMjEpKTsKK1NJR19FWFBSX0RFQ0woR1BJRTRPVVQsIEdQSUU0LCBHUElFNF9ERVNDKTsKK1NJR19FWFBSX0RFQ0woR1BJRTRPVVQsIEdQSUUsIEdQSUVfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChHUElFNE9VVCwgR1BJRTQsIEdQSUUpOworTVNfUElOX0RFQ0woRDE0LCBHUElPRTUsIE5SVFMzLCBHUElFNE9VVCk7CisKK0ZVTkNfR1JPVVBfREVDTChOUlRTMywgRDE0KTsKK0ZVTkNfR1JPVVBfREVDTChHUElFNCwgRTE0LCBEMTQpOworCisjZGVmaW5lIEMxNCAzOAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShUWEQzLCBUWEQzLCBTSUdfREVTQ19TRVQoU0NVODAsIDIyKSk7CitTSUdfRVhQUl9ERUNMKEdQSUU2SU4sIEdQSUU2LCBHUElFNl9ERVNDKTsKK1NJR19FWFBSX0RFQ0woR1BJRTZJTiwgR1BJRSwgR1BJRV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKEdQSUU2SU4sIEdQSUU2LCBHUElFKTsKK01TX1BJTl9ERUNMKEMxNCwgR1BJT0U2LCBUWEQzLCBHUElFNklOKTsKKworRlVOQ19HUk9VUF9ERUNMKFRYRDMsIEMxNCk7CisKKyNkZWZpbmUgQjE0IDM5CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJYRDMsIFJYRDMsIFNJR19ERVNDX1NFVChTQ1U4MCwgMjMpKTsKK1NJR19FWFBSX0RFQ0woR1BJRTZPVVQsIEdQSUU2LCBHUElFNl9ERVNDKTsKK1NJR19FWFBSX0RFQ0woR1BJRTZPVVQsIEdQSUUsIEdQSUVfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChHUElFNk9VVCwgR1BJRTYsIEdQSUUpOworTVNfUElOX0RFQ0woQjE0LCBHUElPRTcsIFJYRDMsIEdQSUU2T1VUKTsKKworRlVOQ19HUk9VUF9ERUNMKFJYRDMsIEIxNCk7CitGVU5DX0dST1VQX0RFQ0woR1BJRTYsIEMxNCwgQjE0KTsKKworI2RlZmluZSBEMTggNDAKK1NTU0ZfUElOX0RFQ0woRDE4LCBHUElPRjAsIE5DVFM0LCBTSUdfREVTQ19TRVQoU0NVODAsIDI0KSk7CisKKyNkZWZpbmUgQUNQSV9ERVNDICAgICAgIFNJR19ERVNDX0JJVChIV19TVFJBUDEsIDE5LCAwKQorCisjZGVmaW5lIEIxOSA0MQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShORENENCwgTkRDRDQsIFNJR19ERVNDX1NFVChTQ1U4MCwgMjUpKTsKK1NJR19FWFBSX0RFQ0woU0lPUEJJLCBTSU9QQkksIFNJR19ERVNDX1NFVChTQ1VBNCwgMTIpKTsKK1NJR19FWFBSX0RFQ0woU0lPUEJJLCBBQ1BJLCBBQ1BJX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoU0lPUEJJLCBTSU9QQkksIEFDUEkpOworTVNfUElOX0RFQ0woQjE5LCBHUElPRjEsIE5EQ0Q0LCBTSU9QQkkpOworRlVOQ19HUk9VUF9ERUNMKE5EQ0Q0LCBCMTkpOworRlVOQ19HUk9VUF9ERUNMKFNJT1BCSSwgQjE5KTsKKworI2RlZmluZSBEMTcgNDMKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTlJJNCwgTlJJNCwgU0lHX0RFU0NfU0VUKFNDVTgwLCAyNykpOworU0lHX0VYUFJfREVDTChTSU9QQk8sIFNJT1BCTywgU0lHX0RFU0NfU0VUKFNDVUE0LCAxNCkpOworU0lHX0VYUFJfREVDTChTSU9QQk8sIEFDUEksIEFDUElfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChTSU9QQk8sIFNJT1BCTywgQUNQSSk7CitNU19QSU5fREVDTChEMTcsIEdQSU9GMywgTlJJNCwgU0lPUEJPKTsKK0ZVTkNfR1JPVVBfREVDTChOUkk0LCBEMTcpOworRlVOQ19HUk9VUF9ERUNMKFNJT1BCTywgRDE3KTsKKworRlVOQ19HUk9VUF9ERUNMKEFDUEksIEIxOSwgRDE3KTsKKworI2RlZmluZSBFMTYgNDYKK1NTU0ZfUElOX0RFQ0woRTE2LCBHUElPRjYsIFRYRDQsIFNJR19ERVNDX1NFVChTQ1U4MCwgMzApKTsKKworI2RlZmluZSBDMTcgNDcKK1NTU0ZfUElOX0RFQ0woQzE3LCBHUElPRjcsIFJYRDQsIFNJR19ERVNDX1NFVChTQ1U4MCwgMzEpKTsKKworI2RlZmluZSBBQTIyIDU0CitTU1NGX1BJTl9ERUNMKEFBMjIsIEdQSU9HNiwgRkxCVVNZLCBTSUdfREVTQ19TRVQoU0NVODQsIDYpKTsKKworI2RlZmluZSBVMTggNTUKK1NTU0ZfUElOX0RFQ0woVTE4LCBHUElPRzcsIEZMV1AsIFNJR19ERVNDX1NFVChTQ1U4NCwgNykpOworCisjZGVmaW5lIFVBUlQ2X0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCA3KQorI2RlZmluZSBST00xNl9ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgNikKKyNkZWZpbmUgRkxBU0hfV0lERQlTSUdfREVTQ19TRVQoSFdfU1RSQVAxLCA0KQorI2RlZmluZSBCT09UX1NSQ19OT1IJeyBIV19TVFJBUDEsIEdFTk1BU0soMSwgMCksIDAsIDAgfQorCisjZGVmaW5lIEE4IDU2CitTSUdfRVhQUl9ERUNMKFJPTUQ4LCBST00xNiwgUk9NMTZfREVTQyk7CitTSUdfRVhQUl9ERUNMKFJPTUQ4LCBST00xNlMsIEZMQVNIX1dJREUsIEJPT1RfU1JDX05PUik7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChST01EOCwgUk9NMTYsIFJPTTE2Uyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE5DVFM2LCBOQ1RTNiwgVUFSVDZfREVTQyk7CitNU19QSU5fREVDTChBOCwgR1BJT0gwLCBST01EOCwgTkNUUzYpOworCisjZGVmaW5lIEM3IDU3CitTSUdfRVhQUl9ERUNMKFJPTUQ5LCBST00xNiwgUk9NMTZfREVTQyk7CitTSUdfRVhQUl9ERUNMKFJPTUQ5LCBST00xNlMsIEZMQVNIX1dJREUsIEJPT1RfU1JDX05PUik7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChST01EOSwgUk9NMTYsIFJPTTE2Uyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE5EQ0Q2LCBORENENiwgVUFSVDZfREVTQyk7CitNU19QSU5fREVDTChDNywgR1BJT0gxLCBST01EOSwgTkRDRDYpOworCisjZGVmaW5lIEI3IDU4CitTSUdfRVhQUl9ERUNMKFJPTUQxMCwgUk9NMTYsIFJPTTE2X0RFU0MpOworU0lHX0VYUFJfREVDTChST01EMTAsIFJPTTE2UywgRkxBU0hfV0lERSwgQk9PVF9TUkNfTk9SKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKFJPTUQxMCwgUk9NMTYsIFJPTTE2Uyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE5EU1I2LCBORFNSNiwgVUFSVDZfREVTQyk7CitNU19QSU5fREVDTChCNywgR1BJT0gyLCBST01EMTAsIE5EU1I2KTsKKworI2RlZmluZSBBNyA1OQorU0lHX0VYUFJfREVDTChST01EMTEsIFJPTTE2LCBST00xNl9ERVNDKTsKK1NJR19FWFBSX0RFQ0woUk9NRDExLCBST00xNlMsIEZMQVNIX1dJREUsIEJPT1RfU1JDX05PUik7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChST01EMTEsIFJPTTE2LCBST00xNlMpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShOUkk2LCBOUkk2LCBVQVJUNl9ERVNDKTsKK01TX1BJTl9ERUNMKEE3LCBHUElPSDMsIFJPTUQxMSwgTlJJNik7CisKKyNkZWZpbmUgRDcgNjAKK1NJR19FWFBSX0RFQ0woUk9NRDEyLCBST00xNiwgUk9NMTZfREVTQyk7CitTSUdfRVhQUl9ERUNMKFJPTUQxMiwgUk9NMTZTLCBGTEFTSF9XSURFLCBCT09UX1NSQ19OT1IpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoUk9NRDEyLCBST00xNiwgUk9NMTZTKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTkRUUjYsIE5EVFI2LCBVQVJUNl9ERVNDKTsKK01TX1BJTl9ERUNMKEQ3LCBHUElPSDQsIFJPTUQxMiwgTkRUUjYpOworCisjZGVmaW5lIEI2IDYxCitTSUdfRVhQUl9ERUNMKFJPTUQxMywgUk9NMTYsIFJPTTE2X0RFU0MpOworU0lHX0VYUFJfREVDTChST01EMTMsIFJPTTE2UywgRkxBU0hfV0lERSwgQk9PVF9TUkNfTk9SKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKFJPTUQxMywgUk9NMTYsIFJPTTE2Uyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE5SVFM2LCBOUlRTNiwgVUFSVDZfREVTQyk7CitNU19QSU5fREVDTChCNiwgR1BJT0g1LCBST01EMTMsIE5SVFM2KTsKKworI2RlZmluZSBBNiA2MgorU0lHX0VYUFJfREVDTChST01EMTQsIFJPTTE2LCBST00xNl9ERVNDKTsKK1NJR19FWFBSX0RFQ0woUk9NRDE0LCBST00xNlMsIEZMQVNIX1dJREUsIEJPT1RfU1JDX05PUik7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChST01EMTQsIFJPTTE2LCBST00xNlMpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShUWEQ2LCBUWEQ2LCBVQVJUNl9ERVNDKTsKK01TX1BJTl9ERUNMKEE2LCBHUElPSDYsIFJPTUQxNCwgVFhENik7CisKKyNkZWZpbmUgRTcgNjMKK1NJR19FWFBSX0RFQ0woUk9NRDE1LCBST00xNiwgUk9NMTZfREVTQyk7CitTSUdfRVhQUl9ERUNMKFJPTUQxNSwgUk9NMTZTLCBGTEFTSF9XSURFLCBCT09UX1NSQ19OT1IpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoUk9NRDE1LCBST00xNiwgUk9NMTZTKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUlhENiwgUlhENiwgVUFSVDZfREVTQyk7CitNU19QSU5fREVDTChFNywgR1BJT0g3LCBST01EMTUsIFJYRDYpOworCitGVU5DX0dST1VQX0RFQ0woVUFSVDYsIEE4LCBDNywgQjcsIEE3LCBENywgQjYsIEE2LCBFNyk7CisKKyNkZWZpbmUgSjMgNzUKK1NTU0ZfUElOX0RFQ0woSjMsIEdQSU9KMywgU0dQTUksIFNJR19ERVNDX1NFVChTQ1U4NCwgMTEpKTsKKworI2RlZmluZSBUNCA3NgorU1NTRl9QSU5fREVDTChUNCwgR1BJT0o0LCBWR0FIUywgU0lHX0RFU0NfU0VUKFNDVTg0LCAxMikpOworCisjZGVmaW5lIFUyIDc3CitTU1NGX1BJTl9ERUNMKFUyLCBHUElPSjUsIFZHQVZTLCBTSUdfREVTQ19TRVQoU0NVODQsIDEzKSk7CisKKyNkZWZpbmUgVDIgNzgKK1NTU0ZfUElOX0RFQ0woVDIsIEdQSU9KNiwgRERDQ0xLLCBTSUdfREVTQ19TRVQoU0NVODQsIDE0KSk7CisKKyNkZWZpbmUgVDEgNzkKK1NTU0ZfUElOX0RFQ0woVDEsIEdQSU9KNywgRERDREFULCBTSUdfREVTQ19TRVQoU0NVODQsIDE1KSk7CisKKyNkZWZpbmUgSTJDNV9ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMTgpCisKKyNkZWZpbmUgRTMgODAKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0NMNSwgSTJDNSwgSTJDNV9ERVNDKTsKK1NTX1BJTl9ERUNMKEUzLCBHUElPSzAsIFNDTDUpOworCisjZGVmaW5lIEQyIDgxCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEQTUsIEkyQzUsIEkyQzVfREVTQyk7CitTU19QSU5fREVDTChEMiwgR1BJT0sxLCBTREE1KTsKKworRlVOQ19HUk9VUF9ERUNMKEkyQzUsIEUzLCBEMik7CisKKyNkZWZpbmUgSTJDNl9ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMTkpCisKKyNkZWZpbmUgQzEgODIKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0NMNiwgSTJDNiwgSTJDNl9ERVNDKTsKK1NTX1BJTl9ERUNMKEMxLCBHUElPSzIsIFNDTDYpOworCisjZGVmaW5lIEY0IDgzCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEQTYsIEkyQzYsIEkyQzZfREVTQyk7CitTU19QSU5fREVDTChGNCwgR1BJT0szLCBTREE2KTsKKworRlVOQ19HUk9VUF9ERUNMKEkyQzYsIEMxLCBGNCk7CisKKyNkZWZpbmUgSTJDN19ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMjApCisKKyNkZWZpbmUgRTIgODQKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0NMNywgSTJDNywgSTJDN19ERVNDKTsKK1NTX1BJTl9ERUNMKEUyLCBHUElPSzQsIFNDTDcpOworCisjZGVmaW5lIEQxIDg1CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEQTcsIEkyQzcsIEkyQzdfREVTQyk7CitTU19QSU5fREVDTChEMSwgR1BJT0s1LCBTREE3KTsKKworRlVOQ19HUk9VUF9ERUNMKEkyQzcsIEUyLCBEMSk7CisKKyNkZWZpbmUgSTJDOF9ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMjEpCisKKyNkZWZpbmUgRzUgODYKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0NMOCwgSTJDOCwgSTJDOF9ERVNDKTsKK1NTX1BJTl9ERUNMKEc1LCBHUElPSzYsIFNDTDgpOworCisjZGVmaW5lIEYzIDg3CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEQTgsIEkyQzgsIEkyQzhfREVTQyk7CitTU19QSU5fREVDTChGMywgR1BJT0s3LCBTREE4KTsKKworRlVOQ19HUk9VUF9ERUNMKEkyQzgsIEc1LCBGMyk7CisKKyNkZWZpbmUgVTEgODgKK1NTU0ZfUElOX0RFQ0woVTEsIEdQSU9MMCwgTkNUUzEsIFNJR19ERVNDX1NFVChTQ1U4NCwgMTYpKTsKKworI2RlZmluZSBWUEkxOF9ERVNDCXsgU0NVOTAsIEdFTk1BU0soNSwgNCksIDEsIDAgfQorI2RlZmluZSBWUEkyNF9ERVNDCXsgU0NVOTAsIEdFTk1BU0soNSwgNCksIDIsIDAgfQorI2RlZmluZSBWUEkzMF9ERVNDCXsgU0NVOTAsIEdFTk1BU0soNSwgNCksIDMsIDAgfQorCisjZGVmaW5lIFQ1IDg5CisjZGVmaW5lIFQ1X0RFU0MgICAgICAgICBTSUdfREVTQ19TRVQoU0NVODQsIDE3KQorU0lHX0VYUFJfREVDTChWUElERSwgVlBJMTgsIFZQSTE4X0RFU0MsIFQ1X0RFU0MpOworU0lHX0VYUFJfREVDTChWUElERSwgVlBJMjQsIFZQSTI0X0RFU0MsIFQ1X0RFU0MpOworU0lHX0VYUFJfREVDTChWUElERSwgVlBJMzAsIFZQSTMwX0RFU0MsIFQ1X0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMKFZQSURFLCBTSUdfRVhQUl9QVFIoVlBJREUsIFZQSTE4KSwKKwkJU0lHX0VYUFJfUFRSKFZQSURFLCBWUEkyNCksCisJCVNJR19FWFBSX1BUUihWUElERSwgVlBJMzApKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTkRDRDEsIE5EQ0QxLCBUNV9ERVNDKTsKK01TX1BJTl9ERUNMKFQ1LCBHUElPTDEsIFZQSURFLCBORENEMSk7CitGVU5DX0dST1VQX0RFQ0woTkRDRDEsIFQ1KTsKKworI2RlZmluZSBVMyA5MAorI2RlZmluZSBVM19ERVNDICAgICAgICAgU0lHX0RFU0NfU0VUKFNDVTg0LCAxOCkKK1NJR19FWFBSX0RFQ0woVlBJT0RELCBWUEkxOCwgVlBJMThfREVTQywgVTNfREVTQyk7CitTSUdfRVhQUl9ERUNMKFZQSU9ERCwgVlBJMjQsIFZQSTI0X0RFU0MsIFUzX0RFU0MpOworU0lHX0VYUFJfREVDTChWUElPREQsIFZQSTMwLCBWUEkzMF9ERVNDLCBVM19ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTChWUElPREQsIFNJR19FWFBSX1BUUihWUElPREQsIFZQSTE4KSwKKwkJU0lHX0VYUFJfUFRSKFZQSU9ERCwgVlBJMjQpLAorCQlTSUdfRVhQUl9QVFIoVlBJT0RELCBWUEkzMCkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShORFNSMSwgTkRTUjEsIFUzX0RFU0MpOworTVNfUElOX0RFQ0woVTMsIEdQSU9MMiwgVlBJT0RELCBORFNSMSk7CitGVU5DX0dST1VQX0RFQ0woTkRTUjEsIFUzKTsKKworI2RlZmluZSBWMSA5MQorI2RlZmluZSBWMV9ERVNDICAgICAgICAgU0lHX0RFU0NfU0VUKFNDVTg0LCAxOSkKK1NJR19FWFBSX0RFQ0woVlBJSFMsIFZQSTE4LCBWUEkxOF9ERVNDLCBWMV9ERVNDKTsKK1NJR19FWFBSX0RFQ0woVlBJSFMsIFZQSTI0LCBWUEkyNF9ERVNDLCBWMV9ERVNDKTsKK1NJR19FWFBSX0RFQ0woVlBJSFMsIFZQSTMwLCBWUEkzMF9ERVNDLCBWMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTChWUElIUywgU0lHX0VYUFJfUFRSKFZQSUhTLCBWUEkxOCksCisJCVNJR19FWFBSX1BUUihWUElIUywgVlBJMjQpLAorCQlTSUdfRVhQUl9QVFIoVlBJSFMsIFZQSTMwKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE5SSTEsIE5SSTEsIFYxX0RFU0MpOworTVNfUElOX0RFQ0woVjEsIEdQSU9MMywgVlBJSFMsIE5SSTEpOworRlVOQ19HUk9VUF9ERUNMKE5SSTEsIFYxKTsKKworI2RlZmluZSBVNCA5MgorI2RlZmluZSBVNF9ERVNDICAgICAgICAgU0lHX0RFU0NfU0VUKFNDVTg0LCAyMCkKK1NJR19FWFBSX0RFQ0woVlBJVlMsIFZQSTE4LCBWUEkxOF9ERVNDLCBVNF9ERVNDKTsKK1NJR19FWFBSX0RFQ0woVlBJVlMsIFZQSTI0LCBWUEkyNF9ERVNDLCBVNF9ERVNDKTsKK1NJR19FWFBSX0RFQ0woVlBJVlMsIFZQSTMwLCBWUEkzMF9ERVNDLCBVNF9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTChWUElWUywgU0lHX0VYUFJfUFRSKFZQSVZTLCBWUEkxOCksCisJCVNJR19FWFBSX1BUUihWUElWUywgVlBJMjQpLAorCQlTSUdfRVhQUl9QVFIoVlBJVlMsIFZQSTMwKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE5EVFIxLCBORFRSMSwgVTRfREVTQyk7CitNU19QSU5fREVDTChVNCwgR1BJT0w0LCBWUElWUywgTkRUUjEpOworRlVOQ19HUk9VUF9ERUNMKE5EVFIxLCBVNCk7CisKKyNkZWZpbmUgVjIgOTMKKyNkZWZpbmUgVjJfREVTQyAgICAgICAgIFNJR19ERVNDX1NFVChTQ1U4NCwgMjEpCitTSUdfRVhQUl9ERUNMKFZQSUNMSywgVlBJMTgsIFZQSTE4X0RFU0MsIFYyX0RFU0MpOworU0lHX0VYUFJfREVDTChWUElDTEssIFZQSTI0LCBWUEkyNF9ERVNDLCBWMl9ERVNDKTsKK1NJR19FWFBSX0RFQ0woVlBJQ0xLLCBWUEkzMCwgVlBJMzBfREVTQywgVjJfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0woVlBJQ0xLLCBTSUdfRVhQUl9QVFIoVlBJQ0xLLCBWUEkxOCksCisJCVNJR19FWFBSX1BUUihWUElDTEssIFZQSTI0KSwKKwkJU0lHX0VYUFJfUFRSKFZQSUNMSywgVlBJMzApKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTlJUUzEsIE5SVFMxLCBWMl9ERVNDKTsKK01TX1BJTl9ERUNMKFYyLCBHUElPTDUsIFZQSUNMSywgTlJUUzEpOworRlVOQ19HUk9VUF9ERUNMKE5SVFMxLCBWMik7CisKKyNkZWZpbmUgVzEgOTQKKyNkZWZpbmUgVzFfREVTQyAgICAgICAgIFNJR19ERVNDX1NFVChTQ1U4NCwgMjIpCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFZQSUIwLCBWUEkzMCwgVlBJMzBfREVTQywgVzFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFRYRDEsIFRYRDEsIFcxX0RFU0MpOworTVNfUElOX0RFQ0woVzEsIEdQSU9MNiwgVlBJQjAsIFRYRDEpOworRlVOQ19HUk9VUF9ERUNMKFRYRDEsIFcxKTsKKworI2RlZmluZSBVNSA5NQorI2RlZmluZSBVNV9ERVNDICAgICAgICAgU0lHX0RFU0NfU0VUKFNDVTg0LCAyMykKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVlBJQjEsIFZQSTMwLCBWUEkzMF9ERVNDLCBVNV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUlhEMSwgUlhEMSwgVTVfREVTQyk7CitNU19QSU5fREVDTChVNSwgR1BJT0w3LCBWUElCMSwgUlhEMSk7CitGVU5DX0dST1VQX0RFQ0woUlhEMSwgVTUpOworCisjZGVmaW5lIFc0IDEwNAorI2RlZmluZSBXNF9ERVNDICAgICAgICAgU0lHX0RFU0NfU0VUKFNDVTg4LCAwKQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShWUElHMCwgVlBJMzAsIFZQSTMwX0RFU0MsIFc0X0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShQV00wLCBQV00wLCBXNF9ERVNDKTsKK01TX1BJTl9ERUNMKFc0LCBHUElPTjAsIFZQSUcwLCBQV00wKTsKK0ZVTkNfR1JPVVBfREVDTChQV00wLCBXNCk7CisKKyNkZWZpbmUgWTMgMTA1CisjZGVmaW5lIFkzX0RFU0MgICAgICAgICBTSUdfREVTQ19TRVQoU0NVODgsIDEpCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFZQSUcxLCBWUEkzMCwgVlBJMzBfREVTQywgWTNfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFBXTTEsIFBXTTEsIFkzX0RFU0MpOworTVNfUElOX0RFQ0woWTMsIEdQSU9OMSwgVlBJRzEsIFBXTTEpOworRlVOQ19HUk9VUF9ERUNMKFBXTTEsIFkzKTsKKworI2RlZmluZSBBQTIgMTA2CisjZGVmaW5lIEFBMl9ERVNDICAgICAgICBTSUdfREVTQ19TRVQoU0NVODgsIDIpCitTSUdfRVhQUl9ERUNMKFZQSUcyLCBWUEkxOCwgVlBJMThfREVTQywgQUEyX0RFU0MpOworU0lHX0VYUFJfREVDTChWUElHMiwgVlBJMjQsIFZQSTI0X0RFU0MsIEFBMl9ERVNDKTsKK1NJR19FWFBSX0RFQ0woVlBJRzIsIFZQSTMwLCBWUEkzMF9ERVNDLCBBQTJfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0woVlBJRzIsIFNJR19FWFBSX1BUUihWUElHMiwgVlBJMTgpLAorCQlTSUdfRVhQUl9QVFIoVlBJRzIsIFZQSTI0KSwKKwkJU0lHX0VYUFJfUFRSKFZQSUcyLCBWUEkzMCkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShQV00yLCBQV00yLCBBQTJfREVTQyk7CitNU19QSU5fREVDTChBQTIsIEdQSU9OMiwgVlBJRzIsIFBXTTIpOworRlVOQ19HUk9VUF9ERUNMKFBXTTIsIEFBMik7CisKKyNkZWZpbmUgQUIxIDEwNworI2RlZmluZSBBQjFfREVTQyAgICAgICAgU0lHX0RFU0NfU0VUKFNDVTg4LCAzKQorU0lHX0VYUFJfREVDTChWUElHMywgVlBJMTgsIFZQSTE4X0RFU0MsIEFCMV9ERVNDKTsKK1NJR19FWFBSX0RFQ0woVlBJRzMsIFZQSTI0LCBWUEkyNF9ERVNDLCBBQjFfREVTQyk7CitTSUdfRVhQUl9ERUNMKFZQSUczLCBWUEkzMCwgVlBJMzBfREVTQywgQUIxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMKFZQSUczLCBTSUdfRVhQUl9QVFIoVlBJRzMsIFZQSTE4KSwKKwkJU0lHX0VYUFJfUFRSKFZQSUcyLCBWUEkyNCksCisJCVNJR19FWFBSX1BUUihWUElHMiwgVlBJMzApKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUFdNMywgUFdNMywgQUIxX0RFU0MpOworTVNfUElOX0RFQ0woQUIxLCBHUElPTjMsIFZQSUczLCBQV00zKTsKK0ZVTkNfR1JPVVBfREVDTChQV00zLCBBQjEpOworCisjZGVmaW5lIFc1IDEwOAorI2RlZmluZSBXNV9ERVNDICAgICAgICAgU0lHX0RFU0NfU0VUKFNDVTg4LCA0KQorU0lHX0VYUFJfREVDTChWUElHNCwgVlBJMTgsIFZQSTE4X0RFU0MsIFc1X0RFU0MpOworU0lHX0VYUFJfREVDTChWUElHNCwgVlBJMjQsIFZQSTI0X0RFU0MsIFc1X0RFU0MpOworU0lHX0VYUFJfREVDTChWUElHNCwgVlBJMzAsIFZQSTMwX0RFU0MsIFc1X0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMKFZQSUc0LCBTSUdfRVhQUl9QVFIoVlBJRzQsIFZQSTE4KSwKKwkJU0lHX0VYUFJfUFRSKFZQSUcyLCBWUEkyNCksCisJCVNJR19FWFBSX1BUUihWUElHMiwgVlBJMzApKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUFdNNCwgUFdNNCwgVzVfREVTQyk7CitNU19QSU5fREVDTChXNSwgR1BJT040LCBWUElHNCwgUFdNNCk7CitGVU5DX0dST1VQX0RFQ0woUFdNNCwgVzUpOworCisjZGVmaW5lIFk0IDEwOQorI2RlZmluZSBZNF9ERVNDICAgICAgICAgU0lHX0RFU0NfU0VUKFNDVTg4LCA1KQorU0lHX0VYUFJfREVDTChWUElHNSwgVlBJMTgsIFZQSTE4X0RFU0MsIFk0X0RFU0MpOworU0lHX0VYUFJfREVDTChWUElHNSwgVlBJMjQsIFZQSTI0X0RFU0MsIFk0X0RFU0MpOworU0lHX0VYUFJfREVDTChWUElHNSwgVlBJMzAsIFZQSTMwX0RFU0MsIFk0X0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMKFZQSUc1LCBTSUdfRVhQUl9QVFIoVlBJRzUsIFZQSTE4KSwKKwkJU0lHX0VYUFJfUFRSKFZQSUcyLCBWUEkyNCksCisJCVNJR19FWFBSX1BUUihWUElHMiwgVlBJMzApKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUFdNNSwgUFdNNSwgWTRfREVTQyk7CitNU19QSU5fREVDTChZNCwgR1BJT041LCBWUElHNSwgUFdNNSk7CitGVU5DX0dST1VQX0RFQ0woUFdNNSwgWTQpOworCisjZGVmaW5lIEFBMyAxMTAKKyNkZWZpbmUgQUEzX0RFU0MgICAgICAgIFNJR19ERVNDX1NFVChTQ1U4OCwgNikKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVlBJRzYsIFZQSTMwLCBWUEkzMF9ERVNDLCBBQTNfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFBXTTYsIFBXTTYsIEFBM19ERVNDKTsKK01TX1BJTl9ERUNMKEFBMywgR1BJT042LCBWUElHNiwgUFdNNik7CitGVU5DX0dST1VQX0RFQ0woUFdNNiwgQUEzKTsKKworI2RlZmluZSBBQjIgMTExCisjZGVmaW5lIEFCMl9ERVNDICAgICAgICBTSUdfREVTQ19TRVQoU0NVODgsIDcpCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFZQSUc3LCBWUEkzMCwgVlBJMzBfREVTQywgQUIyX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShQV003LCBQV003LCBBQjJfREVTQyk7CitNU19QSU5fREVDTChBQjIsIEdQSU9ONywgVlBJRzcsIFBXTTcpOworRlVOQ19HUk9VUF9ERUNMKFBXTTcsIEFCMik7CisKKyNkZWZpbmUgVjYgMTEyCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFZQSUc4LCBWUEkyNCwgVlBJMjRfREVTQywgU0lHX0RFU0NfU0VUKFNDVTg4LCA4KSk7CitTU19QSU5fREVDTChWNiwgR1BJT08wLCBWUElHOCk7CisKKyNkZWZpbmUgWTUgMTEzCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFZQSUc5LCBWUEkyNCwgVlBJMjRfREVTQywgU0lHX0RFU0NfU0VUKFNDVTg4LCA5KSk7CitTU19QSU5fREVDTChZNSwgR1BJT08xLCBWUElHOSk7CisKK0ZVTkNfR1JPVVBfREVDTChWUEkxOCwgVDUsIFUzLCBWMSwgVTQsIFYyLCBBQTIyLCBXNSwgWTQsIEFBMywgQUIyKTsKK0ZVTkNfR1JPVVBfREVDTChWUEkyNCwgVDUsIFUzLCBWMSwgVTQsIFYyLCBBQTIyLCBXNSwgWTQsIEFBMywgQUIyLCBWNiwgWTUpOworRlVOQ19HUk9VUF9ERUNMKFZQSTMwLCBUNSwgVTMsIFYxLCBVNCwgVjIsIFcxLCBVNSwgVzQsIFkzLCBBQTIyLCBXNSwgWTQsIEFBMywKKwkJQUIyKTsKKworI2RlZmluZSBZNyAxMjUKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1A1LCBHUElPUDUpOworTVNfUElOX0RFQ0xfKFk3LCBTSUdfRVhQUl9MSVNUX1BUUihHUElPUDUpKTsKKworI2RlZmluZSBBQTcgMTI2CitTU1NGX1BJTl9ERUNMKEFBNywgR1BJT1A2LCBCTUNJTlQsIFNJR19ERVNDX1NFVChTQ1U4OCwgMjIpKTsKKworI2RlZmluZSBBQjcgMTI3CitTU1NGX1BJTl9ERUNMKEFCNywgR1BJT1A3LCBGTEFDSywgU0lHX0RFU0NfU0VUKFNDVTg4LCAyMykpOworCisjZGVmaW5lIEkyQzNfREVTQwlTSUdfREVTQ19TRVQoU0NVOTAsIDE2KQorCisjZGVmaW5lIEQzIDEyOAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTQ0wzLCBJMkMzLCBJMkMzX0RFU0MpOworU1NfUElOX0RFQ0woRDMsIEdQSU9RMCwgU0NMMyk7CisKKyNkZWZpbmUgQzIgMTI5CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEQTMsIEkyQzMsIEkyQzNfREVTQyk7CitTU19QSU5fREVDTChDMiwgR1BJT1ExLCBTREEzKTsKKworRlVOQ19HUk9VUF9ERUNMKEkyQzMsIEQzLCBDMik7CisKKyNkZWZpbmUgSTJDNF9ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMTcpCisKKyNkZWZpbmUgQjEgMTMwCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNDTDQsIEkyQzQsIEkyQzRfREVTQyk7CitTU19QSU5fREVDTChCMSwgR1BJT1EyLCBTQ0w0KTsKKworI2RlZmluZSBGNSAxMzEKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBNCwgSTJDNCwgSTJDNF9ERVNDKTsKK1NTX1BJTl9ERUNMKEY1LCBHUElPUTMsIFNEQTQpOworCitGVU5DX0dST1VQX0RFQ0woSTJDNCwgQjEsIEY1KTsKKworI2RlZmluZSBEQVNIOTAyOF9ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMjgpCisKKyNkZWZpbmUgSDIgMTM0CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKERBU0hIMiwgREFTSEgyLCBEQVNIOTAyOF9ERVNDKTsKK1NTX1BJTl9ERUNMKEgyLCBHUElPUTYsIERBU0hIMik7CisKKyNkZWZpbmUgSDEgMTM1CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKERBU0hIMSwgREFTSEgxLCBEQVNIOTAyOF9ERVNDKTsKK1NTX1BJTl9ERUNMKEgxLCBHUElPUTcsIERBU0hIMSk7CisKKyNkZWZpbmUgVjIwIDEzNgorU1NTRl9QSU5fREVDTChWMjAsIEdQSU9SMCwgUk9NQ1MxLCBTSUdfREVTQ19TRVQoU0NVODgsIDI0KSk7CisKKyNkZWZpbmUgVzIxIDEzNworU1NTRl9QSU5fREVDTChXMjEsIEdQSU9SMSwgUk9NQ1MyLCBTSUdfREVTQ19TRVQoU0NVODgsIDI1KSk7CisKKyNkZWZpbmUgWTIyIDEzOAorU1NTRl9QSU5fREVDTChZMjIsIEdQSU9SMiwgUk9NQ1MzLCBTSUdfREVTQ19TRVQoU0NVODgsIDI2KSk7CisKKyNkZWZpbmUgVTE5IDEzOQorU1NTRl9QSU5fREVDTChVMTksIEdQSU9SMywgUk9NQ1M0LCBTSUdfREVTQ19TRVQoU0NVODgsIDI3KSk7CisKKyNkZWZpbmUgVlBPT0ZGMF9ERVNDCXsgU0NVOTQsIEdFTk1BU0soMSwgMCksIDAsIDAgfQorI2RlZmluZSBWUE8xMl9ERVNDCXsgU0NVOTQsIEdFTk1BU0soMSwgMCksIDEsIDAgfQorI2RlZmluZSBWUE8yNF9ERVNDCXsgU0NVOTQsIEdFTk1BU0soMSwgMCksIDIsIDAgfQorI2RlZmluZSBWUE9PRkYxX0RFU0MJeyBTQ1U5NCwgR0VOTUFTSygxLCAwKSwgMywgMCB9CisjZGVmaW5lIFZQT19PRkZfMTIgICAgICB7IFNDVTk0LCAweDIsIDAsIDAgfQorI2RlZmluZSBWUE9fMjRfT0ZGICAgICAgU0lHX0RFU0NfU0VUKFNDVTk0LCAxKQorCisjZGVmaW5lIFYyMSAxNDAKKyNkZWZpbmUgVjIxX0RFU0MJU0lHX0RFU0NfU0VUKFNDVTg4LCAyOCkKK1NJR19FWFBSX0RFQ0woUk9NQTI0LCBST004LCBWMjFfREVTQywgVlBPX09GRl8xMik7CitTSUdfRVhQUl9ERUNMKFJPTUEyNCwgUk9NMTYsIFYyMV9ERVNDLCBWUE9fT0ZGXzEyKTsKK1NJR19FWFBSX0RFQ0woUk9NQTI0LCBST00xNlMsIFYyMV9ERVNDLCBWUE9fT0ZGXzEyKTsKK1NJR19FWFBSX0xJU1RfREVDTChST01BMjQsIFNJR19FWFBSX1BUUihST01BMjQsIFJPTTgpLAorCQlTSUdfRVhQUl9QVFIoUk9NQTI0LCBST00xNiksCisJCVNJR19FWFBSX1BUUihST01BMjQsIFJPTTE2UykpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShWUE9SNiwgVlBPMjQsIFYyMV9ERVNDLCBWUE9fMjRfT0ZGKTsKK01TX1BJTl9ERUNMKFYyMSwgR1BJT1I0LCBST01BMjQsIFZQT1I2KTsKKworI2RlZmluZSBXMjIgMTQxCisjZGVmaW5lIFcyMl9ERVNDCVNJR19ERVNDX1NFVChTQ1U4OCwgMjkpCitTSUdfRVhQUl9ERUNMKFJPTUEyNSwgUk9NOCwgVzIyX0RFU0MsIFZQT19PRkZfMTIpOworU0lHX0VYUFJfREVDTChST01BMjUsIFJPTTE2LCBXMjJfREVTQywgVlBPX09GRl8xMik7CitTSUdfRVhQUl9ERUNMKFJPTUEyNSwgUk9NMTZTLCBXMjJfREVTQywgVlBPX09GRl8xMik7CitTSUdfRVhQUl9MSVNUX0RFQ0woUk9NQTI1LCBTSUdfRVhQUl9QVFIoUk9NQTI1LCBST004KSwKKwkJU0lHX0VYUFJfUFRSKFJPTUEyNSwgUk9NMTYpLAorCQlTSUdfRVhQUl9QVFIoUk9NQTI1LCBST00xNlMpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVlBPUjcsIFZQTzI0LCBXMjJfREVTQywgVlBPXzI0X09GRik7CitNU19QSU5fREVDTChXMjIsIEdQSU9SNSwgUk9NQTI1LCBWUE9SNyk7CisKKyNkZWZpbmUgQzYgMTQyCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE1EQzEsIE1ESU8xLCBTSUdfREVTQ19TRVQoU0NVODgsIDMwKSk7CitTU19QSU5fREVDTChDNiwgR1BJT1I2LCBNREMxKTsKKworI2RlZmluZSBBNSAxNDMKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTURJTzEsIE1ESU8xLCBTSUdfREVTQ19TRVQoU0NVODgsIDMxKSk7CitTU19QSU5fREVDTChBNSwgR1BJT1I3LCBNRElPMSk7CisKK0ZVTkNfR1JPVVBfREVDTChNRElPMSwgQzYsIEE1KTsKKworI2RlZmluZSBVMjEgMTQ0CisjZGVmaW5lIFUyMV9ERVNDICAgICAgICBTSUdfREVTQ19TRVQoU0NVOEMsIDApCitTSUdfRVhQUl9ERUNMKFJPTUQ0LCBST004LCBVMjFfREVTQywgVlBPT0ZGMF9ERVNDKTsKK1NJR19FWFBSX0RFQ0woUk9NRDQsIFJPTTE2LCBVMjFfREVTQywgVlBPT0ZGMF9ERVNDKTsKK1NJR19FWFBSX0RFQ0woUk9NRDQsIFJPTTE2UywgVTIxX0RFU0MsIFZQT09GRjBfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0woUk9NRDQsIFNJR19FWFBSX1BUUihST01ENCwgUk9NOCksCisJCVNJR19FWFBSX1BUUihST01ENCwgUk9NMTYpLAorCQlTSUdfRVhQUl9QVFIoUk9NRDQsIFJPTTE2UykpOworU0lHX0VYUFJfREVDTChWUE9ERSwgVlBPMTIsIFUyMV9ERVNDLCBWUE8xMl9ERVNDKTsKK1NJR19FWFBSX0RFQ0woVlBPREUsIFZQTzI0LCBVMjFfREVTQywgVlBPMTJfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChWUE9ERSwgVlBPMTIsIFZQTzI0KTsKK01TX1BJTl9ERUNMKFUyMSwgR1BJT1MwLCBST01ENCwgVlBPREUpOworCisjZGVmaW5lIFQxOSAxNDUKKyNkZWZpbmUgVDE5X0RFU0MgICAgICAgIFNJR19ERVNDX1NFVChTQ1U4QywgMSkKK1NJR19FWFBSX0RFQ0woUk9NRDUsIFJPTTgsIFQxOV9ERVNDLCBWUE9PRkYwX0RFU0MpOworU0lHX0VYUFJfREVDTChST01ENSwgUk9NMTYsIFQxOV9ERVNDLCBWUE9PRkYwX0RFU0MpOworU0lHX0VYUFJfREVDTChST01ENSwgUk9NMTZTLCBUMTlfREVTQywgVlBPT0ZGMF9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTChST01ENSwgU0lHX0VYUFJfUFRSKFJPTUQ1LCBST004KSwKKwkJU0lHX0VYUFJfUFRSKFJPTUQ1LCBST00xNiksCisJCVNJR19FWFBSX1BUUihST01ENSwgUk9NMTZTKSk7CitTSUdfRVhQUl9ERUNMKFZQT0hTLCBWUE8xMiwgVDE5X0RFU0MsIFZQTzEyX0RFU0MpOworU0lHX0VYUFJfREVDTChWUE9IUywgVlBPMjQsIFQxOV9ERVNDLCBWUE8yNF9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKFZQT0hTLCBWUE8xMiwgVlBPMjQpOworTVNfUElOX0RFQ0woVDE5LCBHUElPUzEsIFJPTUQ1LCBWUE9IUyk7CisKKyNkZWZpbmUgVjIyIDE0NgorI2RlZmluZSBWMjJfREVTQyAgICAgICAgU0lHX0RFU0NfU0VUKFNDVThDLCAyKQorU0lHX0VYUFJfREVDTChST01ENiwgUk9NOCwgVjIyX0RFU0MsIFZQT09GRjBfREVTQyk7CitTSUdfRVhQUl9ERUNMKFJPTUQ2LCBST00xNiwgVjIyX0RFU0MsIFZQT09GRjBfREVTQyk7CitTSUdfRVhQUl9ERUNMKFJPTUQ2LCBST00xNlMsIFYyMl9ERVNDLCBWUE9PRkYwX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMKFJPTUQ2LCBTSUdfRVhQUl9QVFIoUk9NRDYsIFJPTTgpLAorCQlTSUdfRVhQUl9QVFIoUk9NRDYsIFJPTTE2KSwKKwkJU0lHX0VYUFJfUFRSKFJPTUQ2LCBST00xNlMpKTsKK1NJR19FWFBSX0RFQ0woVlBPVlMsIFZQTzEyLCBWMjJfREVTQywgVlBPMTJfREVTQyk7CitTSUdfRVhQUl9ERUNMKFZQT1ZTLCBWUE8yNCwgVjIyX0RFU0MsIFZQTzI0X0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoVlBPVlMsIFZQTzEyLCBWUE8yNCk7CitNU19QSU5fREVDTChWMjIsIEdQSU9TMiwgUk9NRDYsIFZQT1ZTKTsKKworI2RlZmluZSBVMjAgMTQ3CisjZGVmaW5lIFUyMF9ERVNDICAgICAgICBTSUdfREVTQ19TRVQoU0NVOEMsIDMpCitTSUdfRVhQUl9ERUNMKFJPTUQ3LCBST004LCBVMjBfREVTQywgVlBPT0ZGMF9ERVNDKTsKK1NJR19FWFBSX0RFQ0woUk9NRDcsIFJPTTE2LCBVMjBfREVTQywgVlBPT0ZGMF9ERVNDKTsKK1NJR19FWFBSX0RFQ0woUk9NRDcsIFJPTTE2UywgVTIwX0RFU0MsIFZQT09GRjBfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0woUk9NRDcsIFNJR19FWFBSX1BUUihST01ENywgUk9NOCksCisJCVNJR19FWFBSX1BUUihST01ENywgUk9NMTYpLAorCQlTSUdfRVhQUl9QVFIoUk9NRDcsIFJPTTE2UykpOworU0lHX0VYUFJfREVDTChWUE9DTEssIFZQTzEyLCBVMjBfREVTQywgVlBPMTJfREVTQyk7CitTSUdfRVhQUl9ERUNMKFZQT0NMSywgVlBPMjQsIFUyMF9ERVNDLCBWUE8yNF9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKFZQT0NMSywgVlBPMTIsIFZQTzI0KTsKK01TX1BJTl9ERUNMKFUyMCwgR1BJT1MzLCBST01ENywgVlBPQ0xLKTsKKworI2RlZmluZSBSMTggMTQ4CisjZGVmaW5lIFJPTU9FX0RFU0MgICAgICBTSUdfREVTQ19TRVQoU0NVOEMsIDQpCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9TNCwgR1BJT1M0KTsKK1NJR19FWFBSX0RFQ0woUk9NT0UsIFJPTTgsIFJPTU9FX0RFU0MpOworU0lHX0VYUFJfREVDTChST01PRSwgUk9NMTYsIFJPTU9FX0RFU0MpOworU0lHX0VYUFJfREVDTChST01PRSwgUk9NMTZTLCBST01PRV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTChST01PRSwgU0lHX0VYUFJfUFRSKFJPTU9FLCBST004KSwKKwkJU0lHX0VYUFJfUFRSKFJPTU9FLCBST00xNiksCisJCVNJR19FWFBSX1BUUihST01PRSwgUk9NMTZTKSk7CitNU19QSU5fREVDTF8oUjE4LCBTSUdfRVhQUl9MSVNUX1BUUihST01PRSksIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9TNCkpOworCisjZGVmaW5lIE4yMSAxNDkKKyNkZWZpbmUgUk9NV0VfREVTQyAgICAgIFNJR19ERVNDX1NFVChTQ1U4QywgNSkKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1M1LCBHUElPUzUpOworU0lHX0VYUFJfREVDTChST01XRSwgUk9NOCwgUk9NV0VfREVTQyk7CitTSUdfRVhQUl9ERUNMKFJPTVdFLCBST00xNiwgUk9NV0VfREVTQyk7CitTSUdfRVhQUl9ERUNMKFJPTVdFLCBST00xNlMsIFJPTVdFX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMKFJPTVdFLCBTSUdfRVhQUl9QVFIoUk9NV0UsIFJPTTgpLAorCQlTSUdfRVhQUl9QVFIoUk9NV0UsIFJPTTE2KSwKKwkJU0lHX0VYUFJfUFRSKFJPTVdFLCBST00xNlMpKTsKK01TX1BJTl9ERUNMXyhOMjEsIFNJR19FWFBSX0xJU1RfUFRSKFJPTVdFKSwgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1M1KSk7CisKKyNkZWZpbmUgTDIyIDE1MAorI2RlZmluZSBMMjJfREVTQyAgICAgICAgU0lHX0RFU0NfU0VUKFNDVThDLCA2KQorU0lHX0VYUFJfREVDTChST01BMjIsIFJPTTgsIEwyMl9ERVNDLCBWUE9fT0ZGXzEyKTsKK1NJR19FWFBSX0RFQ0woUk9NQTIyLCBST00xNiwgTDIyX0RFU0MsIFZQT19PRkZfMTIpOworU0lHX0VYUFJfREVDTChST01BMjIsIFJPTTE2UywgTDIyX0RFU0MsIFZQT19PRkZfMTIpOworU0lHX0VYUFJfTElTVF9ERUNMKFJPTUEyMiwgU0lHX0VYUFJfUFRSKFJPTUEyMiwgUk9NOCksCisJCVNJR19FWFBSX1BUUihST01BMjIsIFJPTTE2KSwKKwkJU0lHX0VYUFJfUFRSKFJPTUEyMiwgUk9NMTZTKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFZQT1I0LCBWUE8yNCwgTDIyX0RFU0MsIFZQT18yNF9PRkYpOworTVNfUElOX0RFQ0woTDIyLCBHUElPUzYsIFJPTUEyMiwgVlBPUjQpOworCisjZGVmaW5lIEsxOCAxNTEKKyNkZWZpbmUgSzE4X0RFU0MJU0lHX0RFU0NfU0VUKFNDVThDLCA3KQorU0lHX0VYUFJfREVDTChST01BMjMsIFJPTTgsIEsxOF9ERVNDLCBWUE9fT0ZGXzEyKTsKK1NJR19FWFBSX0RFQ0woUk9NQTIzLCBST00xNiwgSzE4X0RFU0MsIFZQT19PRkZfMTIpOworU0lHX0VYUFJfREVDTChST01BMjMsIFJPTTE2UywgSzE4X0RFU0MsIFZQT19PRkZfMTIpOworU0lHX0VYUFJfTElTVF9ERUNMKFJPTUEyMywgU0lHX0VYUFJfUFRSKFJPTUEyMywgUk9NOCksCisJCVNJR19FWFBSX1BUUihST01BMjMsIFJPTTE2KSwKKwkJU0lHX0VYUFJfUFRSKFJPTUEyMywgUk9NMTZTKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFZQT1I1LCBWUE8yNCwgSzE4X0RFU0MsIFZQT18yNF9PRkYpOworTVNfUElOX0RFQ0woSzE4LCBHUElPUzcsIFJPTUEyMywgVlBPUjUpOworCitGVU5DX0dST1VQX0RFQ0woUk9NOCwgVjIwLCBVMjEsIFQxOSwgVjIyLCBVMjAsIFIxOCwgTjIxLCBMMjIsIEsxOCwgVzIxLCBZMjIsCisJCVUxOSk7CitGVU5DX0dST1VQX0RFQ0woUk9NMTYsIFYyMCwgVTIxLCBUMTksIFYyMiwgVTIwLCBSMTgsIE4yMSwgTDIyLCBLMTgsCisJCUE4LCBDNywgQjcsIEE3LCBENywgQjYsIEE2LCBFNywgVzIxLCBZMjIsIFUxOSk7CitGVU5DX0dST1VQX0RFQ0woVlBPMTIsIFUyMSwgVDE5LCBWMjIsIFUyMCk7CitGVU5DX0dST1VQX0RFQ0woVlBPMjQsIFUyMSwgVDE5LCBWMjIsIFUyMCwgTDIyLCBLMTgsIFYyMSwgVzIyKTsKKworI2RlZmluZSBSTUlJMV9ERVNDICAgICAgU0lHX0RFU0NfQklUKEhXX1NUUkFQMSwgNiwgMCkKKworI2RlZmluZSBBMTIgMTUyCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9UMCwgR1BJT1QwLCBTSUdfREVTQ19TRVQoU0NVQTAsIDApKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTFUWEVOLCBSTUlJMSwgUk1JSTFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMVRYQ0ssIFJHTUlJMSk7CitNU19QSU5fREVDTF8oQTEyLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVDApLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMVRYRU4pLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFUWENLKSk7CisKKyNkZWZpbmUgQjEyIDE1MworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVDEsIEdQSU9UMSwgU0lHX0RFU0NfU0VUKFNDVUEwLCAxKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKERBU0hCMTIsIFJNSUkxLCBSTUlJMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkxVFhDVEwsIFJHTUlJMSk7CitNU19QSU5fREVDTF8oQjEyLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVDEpLCBTSUdfRVhQUl9MSVNUX1BUUihEQVNIQjEyKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkxVFhDVEwpKTsKKworI2RlZmluZSBDMTIgMTU0CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9UMiwgR1BJT1QyLCBTSUdfREVTQ19TRVQoU0NVQTAsIDIpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTFUWEQwLCBSTUlJMSwgUk1JSTFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMVRYRDAsIFJHTUlJMSk7CitNU19QSU5fREVDTF8oQzEyLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVDIpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMVRYRDApLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFUWEQwKSk7CisKKyNkZWZpbmUgRDEyIDE1NQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVDMsIEdQSU9UMywgU0lHX0RFU0NfU0VUKFNDVUEwLCAzKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkxVFhEMSwgUk1JSTEsIFJNSUkxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTFUWEQxLCBSR01JSTEpOworTVNfUElOX0RFQ0xfKEQxMiwgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1QzKSwgU0lHX0VYUFJfTElTVF9QVFIoUk1JSTFUWEQxKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkxVFhEMSkpOworCisjZGVmaW5lIEUxMiAxNTYKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1Q0LCBHUElPVDQsIFNJR19ERVNDX1NFVChTQ1VBMCwgNCkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShEQVNIRTEyLCBSTUlJMSwgUk1JSTFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMVRYRDIsIFJHTUlJMSk7CitNU19QSU5fREVDTF8oRTEyLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVDQpLCBTSUdfRVhQUl9MSVNUX1BUUihEQVNIRTEyKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkxVFhEMikpOworCisjZGVmaW5lIEExMyAxNTcKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1Q1LCBHUElPVDUsIFNJR19ERVNDX1NFVChTQ1VBMCwgNSkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShEQVNIQTEzLCBSTUlJMSwgUk1JSTFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMVRYRDMsIFJHTUlJMSk7CitNU19QSU5fREVDTF8oQTEzLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVDUpLCBTSUdfRVhQUl9MSVNUX1BUUihEQVNIQTEzKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkxVFhEMykpOworCisjZGVmaW5lIEUxMSAxNjQKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1U0LCBHUElPVTQsIFNJR19ERVNDX1NFVChTQ1VBMCwgMTIpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTFSQ0xLLCBSTUlJMSwgUk1JSTFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMVJYQ0ssIFJHTUlJMSk7CitNU19QSU5fREVDTF8oRTExLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVTQpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMVJDTEspLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFSWENLKSk7CisKKyNkZWZpbmUgRDExIDE2NQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVTUsIEdQSU9VNSwgU0lHX0RFU0NfU0VUKFNDVUEwLCAxMykpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShEQVNIRDExLCBSTUlJMSwgUk1JSTFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMVJYQ1RMLCBSR01JSTEpOworTVNfUElOX0RFQ0xfKEQxMSwgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1U1KSwgU0lHX0VYUFJfTElTVF9QVFIoREFTSEQxMSksCisJCVNJR19FWFBSX0xJU1RfUFRSKFJHTUlJMVJYQ1RMKSk7CisKKyNkZWZpbmUgQzExIDE2NgorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVTYsIEdQSU9VNiwgU0lHX0RFU0NfU0VUKFNDVUEwLCAxNCkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMVJYRDAsIFJNSUkxLCBSTUlJMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkxUlhEMCwgUkdNSUkxKTsKK01TX1BJTl9ERUNMXyhDMTEsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9VNiksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkxUlhEMCksCisJCVNJR19FWFBSX0xJU1RfUFRSKFJHTUlJMVJYRDApKTsKKworI2RlZmluZSBCMTEgMTY3CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9VNywgR1BJT1U3LCBTSUdfREVTQ19TRVQoU0NVQTAsIDE1KSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkxUlhEMSwgUk1JSTEsIFJNSUkxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTFSWEQxLCBSR01JSTEpOworTVNfUElOX0RFQ0xfKEIxMSwgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1U3KSwgU0lHX0VYUFJfTElTVF9QVFIoUk1JSTFSWEQxKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkxUlhEMSkpOworCisjZGVmaW5lIEExMSAxNjgKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1YwLCBHUElPVjAsIFNJR19ERVNDX1NFVChTQ1VBMCwgMTYpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTFDUlNEViwgUk1JSTEsIFJNSUkxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTFSWEQyLCBSR01JSTEpOworTVNfUElOX0RFQ0xfKEExMSwgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1YwKSwgU0lHX0VYUFJfTElTVF9QVFIoUk1JSTFDUlNEViksCisJCVNJR19FWFBSX0xJU1RfUFRSKFJHTUlJMVJYRDIpKTsKKworI2RlZmluZSBFMTAgMTY5CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9WMSwgR1BJT1YxLCBTSUdfREVTQ19TRVQoU0NVQTAsIDE3KSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkxUlhFUiwgUk1JSTEsIFJNSUkxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTFSWEQzLCBSR01JSTEpOworTVNfUElOX0RFQ0xfKEUxMCwgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1YxKSwgU0lHX0VYUFJfTElTVF9QVFIoUk1JSTFSWEVSKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkxUlhEMykpOworCitGVU5DX0dST1VQX0RFQ0woUk1JSTEsIEExMiwgQjEyLCBDMTIsIEQxMiwgRTEyLCBBMTMsIEUxMSwgRDExLCBDMTEsIEIxMSwgQTExLAorCQlFMTApOworRlVOQ19HUk9VUF9ERUNMKFJHTUlJMSwgQTEyLCBCMTIsIEMxMiwgRDEyLCBFMTIsIEExMywgRTExLCBEMTEsIEMxMSwgQjExLCBBMTEsCisJCUUxMCk7CisKKy8qIE5vdGUgd2UgYWNjb3VudCBmb3IgR1BJT1k0LUdQSU9ZNyBldmVuIHRob3VnaCB0aGV5J3JlIG5vdCB2YWxpZCwgdGh1cyAyMTYKKyAqIHBpbnMgYmVjb21lcyAyMjAuCisgKi8KKyNkZWZpbmUgQVNQRUVEX0c0X05SX1BJTlMgMjIwCisKKy8qIFBpbnMsIGdyb3VwcyBhbmQgZnVuY3Rpb25zIGFyZSBzb3J0KDEpOmVkIGFscGhhYmV0aWNhbGx5IGZvciBzYW5pdHkgKi8KKworc3RhdGljIHN0cnVjdCBwaW5jdHJsX3Bpbl9kZXNjIGFzcGVlZF9nNF9waW5zW0FTUEVFRF9HNF9OUl9QSU5TXSA9IHsKKwlBU1BFRURfUElOQ1RSTF9QSU4oQTEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBMTEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBMTIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBMTMpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBMTUpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBMTgpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKEEzKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQTQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBNSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEE2KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQTcpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBOCksCisJQVNQRUVEX1BJTkNUUkxfUElOKEFBMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKEFBMjIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBQTMpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBQTcpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBQjEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBQjIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBQjcpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihCMSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEIxMSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEIxMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKEIxNCksCisJQVNQRUVEX1BJTkNUUkxfUElOKEIxNSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEIxOSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEIyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQjMpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihCNCksCisJQVNQRUVEX1BJTkNUUkxfUElOKEI2KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQjcpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihDMSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEMxMSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEMxMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKEMxNCksCisJQVNQRUVEX1BJTkNUUkxfUElOKEMxNSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEMxNyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEMyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzMpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihDNCksCisJQVNQRUVEX1BJTkNUUkxfUElOKEM1KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzYpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihDNyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEQxKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRDExKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRDEyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRDE0KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRDE1KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRDE2KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRDE3KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRDE4KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRDIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihEMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEQ0KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRDUpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihENyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEUxMCksCisJQVNQRUVEX1BJTkNUUkxfUElOKEUxMSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEUxMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKEUxNCksCisJQVNQRUVEX1BJTkNUUkxfUElOKEUxNiksCisJQVNQRUVEX1BJTkNUUkxfUElOKEUyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRTMpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihFNSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEU3KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRjMpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihGNCksCisJQVNQRUVEX1BJTkNUUkxfUElOKEY1KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRzUpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihIMSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEgxOSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEgyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oSDIwKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oSjMpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihLMTgpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihMMjIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihOMjEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihSMTgpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihUMSksCisJQVNQRUVEX1BJTkNUUkxfUElOKFQxOSksCisJQVNQRUVEX1BJTkNUUkxfUElOKFQyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVDQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihUNSksCisJQVNQRUVEX1BJTkNUUkxfUElOKFUxKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVTE4KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVTE5KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVTIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihVMjApLAorCUFTUEVFRF9QSU5DVFJMX1BJTihVMjEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihVMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKFU0KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVTUpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihWMSksCisJQVNQRUVEX1BJTkNUUkxfUElOKFYyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVjIwKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVjIxKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVjIyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVjYpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihXMSksCisJQVNQRUVEX1BJTkNUUkxfUElOKFcyMSksCisJQVNQRUVEX1BJTkNUUkxfUElOKFcyMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKFc0KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVzUpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihZMjIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihZMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKFk0KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oWTUpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihZNyksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFzcGVlZF9waW5fZ3JvdXAgYXNwZWVkX2c0X2dyb3Vwc1tdID0geworCUFTUEVFRF9QSU5DVFJMX0dST1VQKEFDUEkpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEJNQ0lOVCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoRERDQ0xLKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChERENEQVQpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEZMQUNLKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChGTEJVU1kpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEZMV1ApLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEdQSUQwKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChHUElFMCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoR1BJRTIpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEdQSUU0KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChHUElFNiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDMTApLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEkyQzExKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChJMkMxMiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDMTMpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEkyQzMpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEkyQzQpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEkyQzUpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEkyQzYpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEkyQzcpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEkyQzgpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEkyQzkpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKExQQ1BEKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChMUENQTUUpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKExQQ1BNRSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoTFBDU01JKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChNRElPMSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoTURJTzIpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKE5DVFMxKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChOQ1RTMyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoTkNUUzQpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKE5EQ0QxKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChORENEMyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoTkRDRDQpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKE5EU1IxKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChORFNSMyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoTkRUUjEpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKE5EVFIzKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChOUkkxKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChOUkkzKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChOUkk0KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChOUlRTMSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoTlJUUzMpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFBXTTApLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFBXTTEpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFBXTTIpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFBXTTMpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFBXTTQpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFBXTTUpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFBXTTYpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFBXTTcpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFJHTUlJMSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUk1JSTEpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFJPTTE2KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChST004KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChST01DUzEpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFJPTUNTMiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUk9NQ1MzKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChST01DUzQpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFJYRDEpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFJYRDMpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFJYRDQpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFNEMSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoU0dQTUkpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFNJT1BCSSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoU0lPUEJPKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChUSU1FUjMpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFRJTUVSNSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoVElNRVI2KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChUSU1FUjcpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFRJTUVSOCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoVFhEMSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoVFhEMyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoVFhENCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoVUFSVDYpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFZHQUhTKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChWR0FWUyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoVlBJMTgpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFZQSTI0KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChWUEkzMCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoVlBPMTIpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFZQTzI0KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXNwZWVkX3Bpbl9mdW5jdGlvbiBhc3BlZWRfZzRfZnVuY3Rpb25zW10gPSB7CisJQVNQRUVEX1BJTkNUUkxfRlVOQyhBQ1BJKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEJNQ0lOVCksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhERENDTEspLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoRERDREFUKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEZMQUNLKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEZMQlVTWSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhGTFdQKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEdQSUQwKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEdQSUUwKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEdQSUUyKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEdQSUU0KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEdQSUU2KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEkyQzEwKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEkyQzExKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEkyQzEyKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEkyQzEzKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEkyQzMpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDNCksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhJMkM1KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEkyQzYpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDNyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhJMkM4KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEkyQzkpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoTFBDUEQpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoTFBDUE1FKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKExQQ1NNSSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhNRElPMSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhNRElPMiksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhOQ1RTMSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhOQ1RTMyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhOQ1RTNCksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhORENEMSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhORENEMyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhORENENCksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhORFNSMSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhORFNSMyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhORFRSMSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhORFRSMyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhOUkkxKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE5SSTMpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoTlJJNCksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhOUlRTMSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhOUlRTMyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhQV00wKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFBXTTEpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUFdNMiksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhQV00zKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFBXTTQpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUFdNNSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhQV002KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFBXTTcpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUkdNSUkxKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFJNSUkxKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFJPTTE2KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFJPTTgpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUk9NQ1MxKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFJPTUNTMiksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhST01DUzMpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUk9NQ1M0KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFJYRDEpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUlhEMyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhSWEQ0KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFNEMSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhTR1BNSSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhTSU9QQkkpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoU0lPUEJPKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFRJTUVSMyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhUSU1FUjUpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoVElNRVI2KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFRJTUVSNyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhUSU1FUjgpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoVFhEMSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhUWEQzKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFRYRDQpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoVUFSVDYpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoVkdBSFMpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoVkdBVlMpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoVlBJMTgpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoVlBJMjQpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoVlBJMzApLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoVlBPMTIpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoVlBPMjQpLAorfTsKKworc3RhdGljIHN0cnVjdCBhc3BlZWRfcGluY3RybF9kYXRhIGFzcGVlZF9nNF9waW5jdHJsX2RhdGEgPSB7CisJLnBpbnMgPSBhc3BlZWRfZzRfcGlucywKKwkubnBpbnMgPSBBUlJBWV9TSVpFKGFzcGVlZF9nNF9waW5zKSwKKwkuZ3JvdXBzID0gYXNwZWVkX2c0X2dyb3VwcywKKwkubmdyb3VwcyA9IEFSUkFZX1NJWkUoYXNwZWVkX2c0X2dyb3VwcyksCisJLmZ1bmN0aW9ucyA9IGFzcGVlZF9nNF9mdW5jdGlvbnMsCisJLm5mdW5jdGlvbnMgPSBBUlJBWV9TSVpFKGFzcGVlZF9nNF9mdW5jdGlvbnMpLAorfTsKKworc3RhdGljIHN0cnVjdCBwaW5tdXhfb3BzIGFzcGVlZF9nNF9waW5tdXhfb3BzID0geworCS5nZXRfZnVuY3Rpb25zX2NvdW50ID0gYXNwZWVkX3Bpbm11eF9nZXRfZm5fY291bnQsCisJLmdldF9mdW5jdGlvbl9uYW1lID0gYXNwZWVkX3Bpbm11eF9nZXRfZm5fbmFtZSwKKwkuZ2V0X2Z1bmN0aW9uX2dyb3VwcyA9IGFzcGVlZF9waW5tdXhfZ2V0X2ZuX2dyb3VwcywKKwkuc2V0X211eCA9IGFzcGVlZF9waW5tdXhfc2V0X211eCwKKwkuZ3Bpb19yZXF1ZXN0X2VuYWJsZSA9IGFzcGVlZF9ncGlvX3JlcXVlc3RfZW5hYmxlLAorCS5zdHJpY3QgPSB0cnVlLAorfTsKKworc3RhdGljIHN0cnVjdCBwaW5jdHJsX29wcyBhc3BlZWRfZzRfcGluY3RybF9vcHMgPSB7CisJLmdldF9ncm91cHNfY291bnQgPSBhc3BlZWRfcGluY3RybF9nZXRfZ3JvdXBzX2NvdW50LAorCS5nZXRfZ3JvdXBfbmFtZSA9IGFzcGVlZF9waW5jdHJsX2dldF9ncm91cF9uYW1lLAorCS5nZXRfZ3JvdXBfcGlucyA9IGFzcGVlZF9waW5jdHJsX2dldF9ncm91cF9waW5zLAorCS5waW5fZGJnX3Nob3cgPSBhc3BlZWRfcGluY3RybF9waW5fZGJnX3Nob3csCisJLmR0X25vZGVfdG9fbWFwID0gcGluY29uZl9nZW5lcmljX2R0X25vZGVfdG9fbWFwX3BpbiwKKwkuZHRfZnJlZV9tYXAgPSBwaW5jdHJsX3V0aWxzX2ZyZWVfbWFwLAorfTsKKworc3RhdGljIHN0cnVjdCBwaW5jdHJsX2Rlc2MgYXNwZWVkX2c0X3BpbmN0cmxfZGVzYyA9IHsKKwkubmFtZSA9ICJhc3BlZWQtZzQtcGluY3RybCIsCisJLnBpbnMgPSBhc3BlZWRfZzRfcGlucywKKwkubnBpbnMgPSBBUlJBWV9TSVpFKGFzcGVlZF9nNF9waW5zKSwKKwkucGN0bG9wcyA9ICZhc3BlZWRfZzRfcGluY3RybF9vcHMsCisJLnBteG9wcyA9ICZhc3BlZWRfZzRfcGlubXV4X29wcywKK307CisKK3N0YXRpYyBpbnQgYXNwZWVkX2c0X3BpbmN0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFzcGVlZF9nNF9waW5zKTsgaSsrKQorCQlhc3BlZWRfZzRfcGluc1tpXS5udW1iZXIgPSBpOworCisJcmV0dXJuIGFzcGVlZF9waW5jdHJsX3Byb2JlKHBkZXYsICZhc3BlZWRfZzRfcGluY3RybF9kZXNjLAorCQkJJmFzcGVlZF9nNF9waW5jdHJsX2RhdGEpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhc3BlZWRfZzRfcGluY3RybF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiYXNwZWVkLGFzdDI0MDAtcGluY3RybCIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJhc3BlZWQsZzQtcGluY3RybCIsIH0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXNwZWVkX2c0X3BpbmN0cmxfZHJpdmVyID0geworCS5wcm9iZSA9IGFzcGVlZF9nNF9waW5jdHJsX3Byb2JlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFzcGVlZC1nNC1waW5jdHJsIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gYXNwZWVkX2c0X3BpbmN0cmxfb2ZfbWF0Y2gsCisJfSwKK307CisKK3N0YXRpYyBpbnQgYXNwZWVkX2c0X3BpbmN0cmxfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFzcGVlZF9nNF9waW5jdHJsX2RyaXZlcik7Cit9CisKK2FyY2hfaW5pdGNhbGwoYXNwZWVkX2c0X3BpbmN0cmxfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvYXNwZWVkL3BpbmN0cmwtYXNwZWVkLWc1LmMgYi9kcml2ZXJzL3BpbmN0cmwvYXNwZWVkL3BpbmN0cmwtYXNwZWVkLWc1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFhYjg2NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGluY3RybC9hc3BlZWQvcGluY3RybC1hc3BlZWQtZzUuYwpAQCAtMCwwICsxLDgwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBJQk0gQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGluY3RybC5oPgorI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGlubXV4Lmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jb25mLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jb25mLWdlbmVyaWMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAiLi4vY29yZS5oIgorI2luY2x1ZGUgIi4uL3BpbmN0cmwtdXRpbHMuaCIKKyNpbmNsdWRlICJwaW5jdHJsLWFzcGVlZC5oIgorCisjZGVmaW5lIEFTUEVFRF9HNV9OUl9QSU5TIDIyOAorCisjZGVmaW5lIENPTkQxCQlTSUdfREVTQ19CSVQoU0NVOTAsIDYsIDApCisjZGVmaW5lIENPTkQyCQl7IFNDVTk0LCBHRU5NQVNLKDEsIDApLCAwLCAwIH0KKworI2RlZmluZSBCMTQgMAorU1NTRl9QSU5fREVDTChCMTQsIEdQSU9BMCwgTUFDMUxJTkssIFNJR19ERVNDX1NFVChTQ1U4MCwgMCkpOworCisjZGVmaW5lIEUxMyAzCitTU1NGX1BJTl9ERUNMKEUxMywgR1BJT0EzLCBUSU1FUjQsIFNJR19ERVNDX1NFVChTQ1U4MCwgMykpOworCisjZGVmaW5lIEkyQzlfREVTQwlTSUdfREVTQ19TRVQoU0NVOTAsIDIyKQorCisjZGVmaW5lIEMxNCA0CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNDTDksIEkyQzksIEkyQzlfREVTQywgQ09ORDEpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShUSU1FUjUsIFRJTUVSNSwgU0lHX0RFU0NfU0VUKFNDVTgwLCA0KSwgQ09ORDEpOworTVNfUElOX0RFQ0woQzE0LCBHUElPQTQsIFNDTDksIFRJTUVSNSk7CisKK0ZVTkNfR1JPVVBfREVDTChUSU1FUjUsIEMxNCk7CisKKyNkZWZpbmUgQTEzIDUKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBOSwgSTJDOSwgSTJDOV9ERVNDLCBDT05EMSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFRJTUVSNiwgVElNRVI2LCBTSUdfREVTQ19TRVQoU0NVODAsIDUpLCBDT05EMSk7CitNU19QSU5fREVDTChBMTMsIEdQSU9BNSwgU0RBOSwgVElNRVI2KTsKKworRlVOQ19HUk9VUF9ERUNMKFRJTUVSNiwgQTEzKTsKKworRlVOQ19HUk9VUF9ERUNMKEkyQzksIEMxNCwgQTEzKTsKKworI2RlZmluZSBNRElPMl9ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMikKKworI2RlZmluZSBDMTMgNgorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShNREMyLCBNRElPMiwgTURJTzJfREVTQywgQ09ORDEpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShUSU1FUjcsIFRJTUVSNywgU0lHX0RFU0NfU0VUKFNDVTgwLCA2KSwgQ09ORDEpOworTVNfUElOX0RFQ0woQzEzLCBHUElPQTYsIE1EQzIsIFRJTUVSNyk7CisKK0ZVTkNfR1JPVVBfREVDTChUSU1FUjcsIEMxMyk7CisKKyNkZWZpbmUgQjEzIDcKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTURJTzIsIE1ESU8yLCBNRElPMl9ERVNDLCBDT05EMSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFRJTUVSOCwgVElNRVI4LCBTSUdfREVTQ19TRVQoU0NVODAsIDcpLCBDT05EMSk7CitNU19QSU5fREVDTChCMTMsIEdQSU9BNywgTURJTzIsIFRJTUVSOCk7CisKK0ZVTkNfR1JPVVBfREVDTChUSU1FUjgsIEIxMyk7CisKK0ZVTkNfR1JPVVBfREVDTChNRElPMiwgQzEzLCBCMTMpOworCisjZGVmaW5lIEgyMCAxNQorR1BJT19QSU5fREVDTChIMjAsIEdQSU9CNyk7CisKKyNkZWZpbmUgU0QxX0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAwKQorCisjZGVmaW5lIEMxMiAxNgorI2RlZmluZSBJMkMxMF9ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMjMpCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEMUNMSywgU0QxLCBTRDFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNDTDEwLCBJMkMxMCwgSTJDMTBfREVTQyk7CitNU19QSU5fREVDTChDMTIsIEdQSU9DMCwgU0QxQ0xLLCBTQ0wxMCk7CisKKyNkZWZpbmUgQTEyIDE3CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEMUNNRCwgU0QxLCBTRDFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEQTEwLCBJMkMxMCwgSTJDMTBfREVTQyk7CitNU19QSU5fREVDTChBMTIsIEdQSU9DMSwgU0QxQ01ELCBTREExMCk7CisKK0ZVTkNfR1JPVVBfREVDTChJMkMxMCwgQzEyLCBBMTIpOworCisjZGVmaW5lIEIxMiAxOAorI2RlZmluZSBJMkMxMV9ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMjQpCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEMURBVDAsIFNEMSwgU0QxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTQ0wxMSwgSTJDMTEsIEkyQzExX0RFU0MpOworTVNfUElOX0RFQ0woQjEyLCBHUElPQzIsIFNEMURBVDAsIFNDTDExKTsKKworI2RlZmluZSBEOSAgMTkKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0QxREFUMSwgU0QxLCBTRDFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEQTExLCBJMkMxMSwgSTJDMTFfREVTQyk7CitNU19QSU5fREVDTChEOSwgR1BJT0MzLCBTRDFEQVQxLCBTREExMSk7CisKK0ZVTkNfR1JPVVBfREVDTChJMkMxMSwgQjEyLCBEOSk7CisKKyNkZWZpbmUgRDEwIDIwCisjZGVmaW5lIEkyQzEyX0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAyNSkKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0QxREFUMiwgU0QxLCBTRDFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNDTDEyLCBJMkMxMiwgSTJDMTJfREVTQyk7CitNU19QSU5fREVDTChEMTAsIEdQSU9DNCwgU0QxREFUMiwgU0NMMTIpOworCisjZGVmaW5lIEUxMiAyMQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTRDFEQVQzLCBTRDEsIFNEMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBMTIsIEkyQzEyLCBJMkMxMl9ERVNDKTsKK01TX1BJTl9ERUNMKEUxMiwgR1BJT0M1LCBTRDFEQVQzLCBTREExMik7CisKK0ZVTkNfR1JPVVBfREVDTChJMkMxMiwgRDEwLCBFMTIpOworCisjZGVmaW5lIEMxMSAyMgorI2RlZmluZSBJMkMxM19ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMjYpCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEMUNELCBTRDEsIFNEMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0NMMTMsIEkyQzEzLCBJMkMxM19ERVNDKTsKK01TX1BJTl9ERUNMKEMxMSwgR1BJT0M2LCBTRDFDRCwgU0NMMTMpOworCisjZGVmaW5lIEIxMSAyMworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTRDFXUCwgU0QxLCBTRDFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEQTEzLCBJMkMxMywgSTJDMTNfREVTQyk7CitNU19QSU5fREVDTChCMTEsIEdQSU9DNywgU0QxV1AsIFNEQTEzKTsKKworRlVOQ19HUk9VUF9ERUNMKEkyQzEzLCBDMTEsIEIxMSk7CitGVU5DX0dST1VQX0RFQ0woU0QxLCBDMTIsIEExMiwgQjEyLCBEOSwgRDEwLCBFMTIsIEMxMSwgQjExKTsKKworI2RlZmluZSBTRDJfREVTQyAgICAgICAgU0lHX0RFU0NfU0VUKFNDVTkwLCAxKQorI2RlZmluZSBHUElEMF9ERVNDICAgICAgU0lHX0RFU0NfU0VUKFNDVThDLCA4KQorI2RlZmluZSBHUElEX0RFU0MgICAgICAgU0lHX0RFU0NfU0VUKEhXX1NUUkFQMSwgMjEpCisKKyNkZWZpbmUgRjE5IDI0CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEMkNMSywgU0QyLCBTRDJfREVTQyk7CitTSUdfRVhQUl9ERUNMKEdQSUQwSU4sIEdQSUQwLCBHUElEMF9ERVNDKTsKK1NJR19FWFBSX0RFQ0woR1BJRDBJTiwgR1BJRCwgR1BJRF9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKEdQSUQwSU4sIEdQSUQwLCBHUElEKTsKK01TX1BJTl9ERUNMKEYxOSwgR1BJT0QwLCBTRDJDTEssIEdQSUQwSU4pOworCisjZGVmaW5lIEUyMSAyNQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTRDJDTUQsIFNEMiwgU0QyX0RFU0MpOworU0lHX0VYUFJfREVDTChHUElEME9VVCwgR1BJRDAsIEdQSUQwX0RFU0MpOworU0lHX0VYUFJfREVDTChHUElEME9VVCwgR1BJRCwgR1BJRF9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKEdQSUQwT1VULCBHUElEMCwgR1BJRCk7CitNU19QSU5fREVDTChFMjEsIEdQSU9EMSwgU0QyQ01ELCBHUElEME9VVCk7CisKK0ZVTkNfR1JPVVBfREVDTChHUElEMCwgRjE5LCBFMjEpOworCisjZGVmaW5lIEdQSUQyX0RFU0MgICAgICBTSUdfREVTQ19TRVQoU0NVOEMsIDkpCisKKyNkZWZpbmUgRDIwIDI2CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEMkRBVDAsIFNEMiwgU0QyX0RFU0MpOworU0lHX0VYUFJfREVDTChHUElEMklOLCBHUElEMiwgR1BJRDJfREVTQyk7CitTSUdfRVhQUl9ERUNMKEdQSUQySU4sIEdQSUQsIEdQSURfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChHUElEMklOLCBHUElEMiwgR1BJRCk7CitNU19QSU5fREVDTChEMjAsIEdQSU9EMiwgU0QyREFUMCwgR1BJRDJJTik7CisKKyNkZWZpbmUgRDIxIDI3CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEMkRBVDEsIFNEMiwgU0QyX0RFU0MpOworU0lHX0VYUFJfREVDTChHUElEMk9VVCwgR1BJRDIsIEdQSUQyX0RFU0MpOworU0lHX0VYUFJfREVDTChHUElEMk9VVCwgR1BJRCwgR1BJRF9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKEdQSUQyT1VULCBHUElEMiwgR1BJRCk7CitNU19QSU5fREVDTChEMjEsIEdQSU9EMywgU0QyREFUMSwgR1BJRDJPVVQpOworCitGVU5DX0dST1VQX0RFQ0woR1BJRDIsIEQyMCwgRDIxKTsKKworI2RlZmluZSBHUElFX0RFU0MJU0lHX0RFU0NfU0VUKEhXX1NUUkFQMSwgMjEpCisjZGVmaW5lIEdQSUUwX0RFU0MJU0lHX0RFU0NfU0VUKFNDVThDLCAxMikKKworI2RlZmluZSBCMjAgMzIKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTkNUUzMsIE5DVFMzLCBTSUdfREVTQ19TRVQoU0NVODAsIDE2KSk7CitTSUdfRVhQUl9ERUNMKEdQSUUwSU4sIEdQSUUwLCBHUElFMF9ERVNDKTsKK1NJR19FWFBSX0RFQ0woR1BJRTBJTiwgR1BJRSwgR1BJRV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKEdQSUUwSU4sIEdQSUUwLCBHUElFKTsKK01TX1BJTl9ERUNMKEIyMCwgR1BJT0UwLCBOQ1RTMywgR1BJRTBJTik7CisKKyNkZWZpbmUgQzIwIDMzCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE5EQ0QzLCBORENEMywgU0lHX0RFU0NfU0VUKFNDVTgwLCAxNykpOworU0lHX0VYUFJfREVDTChHUElFME9VVCwgR1BJRTAsIEdQSUUwX0RFU0MpOworU0lHX0VYUFJfREVDTChHUElFME9VVCwgR1BJRSwgR1BJRV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKEdQSUUwT1VULCBHUElFMCwgR1BJRSk7CitNU19QSU5fREVDTChDMjAsIEdQSUUwLCBORENEMywgR1BJRTBPVVQpOworCitGVU5DX0dST1VQX0RFQ0woR1BJRTAsIEIyMCwgQzIwKTsKKworI2RlZmluZSBTUEkxX0RFU0MJU0lHX0RFU0NfU0VUKEhXX1NUUkFQMSwgMTMpCisjZGVmaW5lIEMxOCA2NAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTWVNDUywgU1BJMSwgQ09ORDEsIFNQSTFfREVTQyk7CitTU19QSU5fREVDTChDMTgsIEdQSU9JMCwgU1lTQ1MpOworCisjZGVmaW5lIEUxNSA2NQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTWVNDSywgU1BJMSwgQ09ORDEsIFNQSTFfREVTQyk7CitTU19QSU5fREVDTChFMTUsIEdQSU9JMSwgU1lTQ0spOworCisjZGVmaW5lIEExNCA2NgorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTWVNNT1NJLCBTUEkxLCBDT05EMSwgU1BJMV9ERVNDKTsKK1NTX1BJTl9ERUNMKEExNCwgR1BJT0kyLCBTWVNNT1NJKTsKKworI2RlZmluZSBDMTYgNjcKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU1lTTUlTTywgU1BJMSwgQ09ORDEsIFNQSTFfREVTQyk7CitTU19QSU5fREVDTChDMTYsIEdQSU9JMywgU1lTTUlTTyk7CisKK0ZVTkNfR1JPVVBfREVDTChTUEkxLCBDMTgsIEUxNSwgQTE0LCBDMTYpOworCisjZGVmaW5lIEwyIDczCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNHUE1MRCwgU0dQTSwgU0lHX0RFU0NfU0VUKFNDVTg0LCA5KSk7CitTU19QSU5fREVDTChMMiwgR1BJT0oxLCBTR1BNTEQpOworCisjZGVmaW5lIE4zIDc0CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNHUE1PLCBTR1BNLCBTSUdfREVTQ19TRVQoU0NVODQsIDEwKSk7CitTU19QSU5fREVDTChOMywgR1BJT0oyLCBTR1BNTyk7CisKKyNkZWZpbmUgTjQgNzUKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0dQTUksIFNHUE0sIFNJR19ERVNDX1NFVChTQ1U4NCwgMTEpKTsKK1NTX1BJTl9ERUNMKE40LCBHUElPSjMsIFNHUE1JKTsKKworI2RlZmluZSBJMkM1X0RFU0MgICAgICAgU0lHX0RFU0NfU0VUKFNDVTkwLCAxOCkKKworI2RlZmluZSBMMyA4MAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTQ0w1LCBJMkM1LCBJMkM1X0RFU0MpOworU1NfUElOX0RFQ0woTDMsIEdQSU9LMCwgU0NMNSk7CisKKyNkZWZpbmUgTDQgODEKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBNSwgSTJDNSwgSTJDNV9ERVNDKTsKK1NTX1BJTl9ERUNMKEw0LCBHUElPSzEsIFNEQTUpOworCitGVU5DX0dST1VQX0RFQ0woSTJDNSwgTDMsIEw0KTsKKworI2RlZmluZSBJMkM2X0RFU0MgICAgICAgU0lHX0RFU0NfU0VUKFNDVTkwLCAxOSkKKworI2RlZmluZSBMMSA4MgorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTQ0w2LCBJMkM2LCBJMkM2X0RFU0MpOworU1NfUElOX0RFQ0woTDEsIEdQSU9LMiwgU0NMNik7CisKKyNkZWZpbmUgTjIgODMKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBNiwgSTJDNiwgSTJDNl9ERVNDKTsKK1NTX1BJTl9ERUNMKE4yLCBHUElPSzMsIFNEQTYpOworCitGVU5DX0dST1VQX0RFQ0woSTJDNiwgTDEsIE4yKTsKKworI2RlZmluZSBJMkM3X0RFU0MgICAgICAgU0lHX0RFU0NfU0VUKFNDVTkwLCAyMCkKKworI2RlZmluZSBOMSA4NAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTQ0w3LCBJMkM3LCBJMkM3X0RFU0MpOworU1NfUElOX0RFQ0woTjEsIEdQSU9LNCwgU0NMNyk7CisKKyNkZWZpbmUgUDEgODUKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBNywgSTJDNywgSTJDN19ERVNDKTsKK1NTX1BJTl9ERUNMKFAxLCBHUElPSzUsIFNEQTcpOworCitGVU5DX0dST1VQX0RFQ0woSTJDNywgTjEsIFAxKTsKKworI2RlZmluZSBJMkM4X0RFU0MgICAgICAgU0lHX0RFU0NfU0VUKFNDVTkwLCAyMSkKKworI2RlZmluZSBQMiA4NgorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTQ0w4LCBJMkM4LCBJMkM4X0RFU0MpOworU1NfUElOX0RFQ0woUDIsIEdQSU9LNiwgU0NMOCk7CisKKyNkZWZpbmUgUjEgODcKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBOCwgSTJDOCwgSTJDOF9ERVNDKTsKK1NTX1BJTl9ERUNMKFIxLCBHUElPSzcsIFNEQTgpOworCitGVU5DX0dST1VQX0RFQ0woSTJDOCwgUDIsIFIxKTsKKworI2RlZmluZSBWUElPRkYwX0RFU0MgICAgeyBTQ1U5MCwgR0VOTUFTSyg1LCA0KSwgMCwgMCB9CisjZGVmaW5lIFZQSU9GRjFfREVTQyAgICB7IFNDVTkwLCBHRU5NQVNLKDUsIDQpLCAxLCAwIH0KKyNkZWZpbmUgVlBJMjRfREVTQyAgICAgIHsgU0NVOTAsIEdFTk1BU0soNSwgNCksIDIsIDAgfQorI2RlZmluZSBWUElSU1ZEX0RFU0MgICAgeyBTQ1U5MCwgR0VOTUFTSyg1LCA0KSwgMywgMCB9CisKKyNkZWZpbmUgVjIgMTA0CisjZGVmaW5lIFYyX0RFU0MgICAgICAgICBTSUdfREVTQ19TRVQoU0NVODgsIDApCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKERBU0hOMCwgREFTSE4wLCBWUElSU1ZEX0RFU0MsIFYyX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShQV00wLCBQV00wLCBWMl9ERVNDLCBDT05EMik7CitNU19QSU5fREVDTChWMiwgR1BJT04wLCBEQVNITjAsIFBXTTApOworRlVOQ19HUk9VUF9ERUNMKFBXTTAsIFYyKTsKKworI2RlZmluZSBXMiAxMDUKKyNkZWZpbmUgVzJfREVTQyAgICAgICAgIFNJR19ERVNDX1NFVChTQ1U4OCwgMSkKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoREFTSE4xLCBEQVNITjEsIFZQSVJTVkRfREVTQywgVzJfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFBXTTEsIFBXTTEsIFcyX0RFU0MsIENPTkQyKTsKK01TX1BJTl9ERUNMKFcyLCBHUElPTjEsIERBU0hOMSwgUFdNMSk7CitGVU5DX0dST1VQX0RFQ0woUFdNMSwgVzIpOworCisjZGVmaW5lIFYzIDEwNgorI2RlZmluZSBWM19ERVNDICAgICAgICAgU0lHX0RFU0NfU0VUKFNDVTg4LCAyKQorU0lHX0VYUFJfREVDTChWUElHMiwgVlBJMjQsIFZQSTI0X0RFU0MsIFYzX0RFU0MsIENPTkQyKTsKK1NJR19FWFBSX0RFQ0woVlBJRzIsIFZQSVJTVkQsIFZQSVJTVkRfREVTQywgVjNfREVTQywgQ09ORDIpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoVlBJRzIsIFZQSTI0LCBWUElSU1ZEKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUFdNMiwgUFdNMiwgVjNfREVTQywgQ09ORDIpOworTVNfUElOX0RFQ0woVjMsIEdQSU9OMiwgVlBJRzIsIFBXTTIpOworRlVOQ19HUk9VUF9ERUNMKFBXTTIsIFYzKTsKKworI2RlZmluZSBVMyAxMDcKKyNkZWZpbmUgVTNfREVTQyAgICAgICAgIFNJR19ERVNDX1NFVChTQ1U4OCwgMykKK1NJR19FWFBSX0RFQ0woVlBJRzMsIFZQSTI0LCBWUEkyNF9ERVNDLCBVM19ERVNDLCBDT05EMik7CitTSUdfRVhQUl9ERUNMKFZQSUczLCBWUElSU1ZELCBWUElSU1ZEX0RFU0MsIFUzX0RFU0MsIENPTkQyKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKFZQSUczLCBWUEkyNCwgVlBJUlNWRCk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFBXTTMsIFBXTTMsIFUzX0RFU0MsIENPTkQyKTsKK01TX1BJTl9ERUNMKFUzLCBHUElPTjMsIFZQSUczLCBQV00zKTsKK0ZVTkNfR1JPVVBfREVDTChQV00zLCBVMyk7CisKKyNkZWZpbmUgVzMgMTA4CisjZGVmaW5lIFczX0RFU0MgICAgICAgICBTSUdfREVTQ19TRVQoU0NVODgsIDQpCitTSUdfRVhQUl9ERUNMKFZQSUc0LCBWUEkyNCwgVlBJMjRfREVTQywgVzNfREVTQywgQ09ORDIpOworU0lHX0VYUFJfREVDTChWUElHNCwgVlBJUlNWRCwgVlBJUlNWRF9ERVNDLCBXM19ERVNDLCBDT05EMik7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChWUElHNCwgVlBJMjQsIFZQSVJTVkQpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShQV000LCBQV000LCBXM19ERVNDLCBDT05EMik7CitNU19QSU5fREVDTChXMywgR1BJT040LCBWUElHNCwgUFdNNCk7CitGVU5DX0dST1VQX0RFQ0woUFdNNCwgVzMpOworCisjZGVmaW5lIEFBMyAxMDkKKyNkZWZpbmUgQUEzX0RFU0MgICAgICAgIFNJR19ERVNDX1NFVChTQ1U4OCwgNSkKK1NJR19FWFBSX0RFQ0woVlBJRzUsIFZQSTI0LCBWUEkyNF9ERVNDLCBBQTNfREVTQywgQ09ORDIpOworU0lHX0VYUFJfREVDTChWUElHNSwgVlBJUlNWRCwgVlBJUlNWRF9ERVNDLCBBQTNfREVTQywgQ09ORDIpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoVlBJRzUsIFZQSTI0LCBWUElSU1ZEKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUFdNNSwgUFdNNSwgQUEzX0RFU0MsIENPTkQyKTsKK01TX1BJTl9ERUNMKEFBMywgR1BJT041LCBWUElHNSwgUFdNNSk7CitGVU5DX0dST1VQX0RFQ0woUFdNNSwgQUEzKTsKKworI2RlZmluZSBZMyAxMTAKKyNkZWZpbmUgWTNfREVTQyAgICAgICAgIFNJR19ERVNDX1NFVChTQ1U4OCwgNikKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVlBJRzYsIFZQSTI0LCBWUEkyNF9ERVNDLCBZM19ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUFdNNiwgUFdNNiwgWTNfREVTQywgQ09ORDIpOworTVNfUElOX0RFQ0woWTMsIEdQSU9ONiwgVlBJRzYsIFBXTTYpOworRlVOQ19HUk9VUF9ERUNMKFBXTTYsIFkzKTsKKworI2RlZmluZSBUNCAxMTEKKyNkZWZpbmUgVDRfREVTQyAgICAgICAgIFNJR19ERVNDX1NFVChTQ1U4OCwgNykKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVlBJRzcsIFZQSTI0LCBWUEkyNF9ERVNDLCBUNF9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUFdNNywgUFdNNywgVDRfREVTQywgQ09ORDIpOworTVNfUElOX0RFQ0woVDQsIEdQSU9ONywgVlBJRzcsIFBXTTcpOworRlVOQ19HUk9VUF9ERUNMKFBXTTcsIFQ0KTsKKworI2RlZmluZSBWNiAxMjcKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoREFTSFY2LCBEQVNIVjYsIFNJR19ERVNDX1NFVChTQ1U5MCwgMjgpLAorCQlTSUdfREVTQ19TRVQoU0NVODgsIDIzKSk7CitTU19QSU5fREVDTChWNiwgR1BJT1A3LCBEQVNIVjYpOworCisjZGVmaW5lIEkyQzNfREVTQwlTSUdfREVTQ19TRVQoU0NVOTAsIDE2KQorCisjZGVmaW5lIEExMSAxMjgKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0NMMywgSTJDMywgSTJDM19ERVNDKTsKK1NTX1BJTl9ERUNMKEExMSwgR1BJT1EwLCBTQ0wzKTsKKworI2RlZmluZSBBMTAgMTI5CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEQTMsIEkyQzMsIEkyQzNfREVTQyk7CitTU19QSU5fREVDTChBMTAsIEdQSU9RMSwgU0RBMyk7CisKK0ZVTkNfR1JPVVBfREVDTChJMkMzLCBBMTEsIEExMCk7CisKKyNkZWZpbmUgSTJDNF9ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMTcpCisKKyNkZWZpbmUgQTkgMTMwCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNDTDQsIEkyQzQsIEkyQzRfREVTQyk7CitTU19QSU5fREVDTChBOSwgR1BJT1EyLCBTQ0w0KTsKKworI2RlZmluZSBCOSAxMzEKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBNCwgSTJDNCwgSTJDNF9ERVNDKTsKK1NTX1BJTl9ERUNMKEI5LCBHUElPUTMsIFNEQTQpOworCitGVU5DX0dST1VQX0RFQ0woSTJDNCwgQTksIEI5KTsKKworI2RlZmluZSBJMkMxNF9ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMjcpCisKKyNkZWZpbmUgTjIxIDEzMgorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTQ0wxNCwgSTJDMTQsIEkyQzE0X0RFU0MpOworU1NfUElOX0RFQ0woTjIxLCBHUElPUTQsIFNDTDE0KTsKKworI2RlZmluZSBOMjIgMTMzCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEQTE0LCBJMkMxNCwgSTJDMTRfREVTQyk7CitTU19QSU5fREVDTChOMjIsIEdQSU9RNSwgU0RBMTQpOworCitGVU5DX0dST1VQX0RFQ0woSTJDMTQsIE4yMSwgTjIyKTsKKworI2RlZmluZSBCMTAgMTM0CitTU1NGX1BJTl9ERUNMKEIxMCwgR1BJT1E2LCBPU0NDTEssIFNJR19ERVNDX1NFVChTQ1UyQywgMSkpOworCisjZGVmaW5lIE4yMCAxMzUKK1NTU0ZfUElOX0RFQ0woTjIwLCBHUElPUTcsIFBFV0FLRSwgU0lHX0RFU0NfU0VUKFNDVTJDLCAyOSkpOworCisjZGVmaW5lIEQ4IDE0MgorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShNREMxLCBNRElPMSwgU0lHX0RFU0NfU0VUKFNDVTg4LCAzMCkpOworU1NfUElOX0RFQ0woRDgsIEdQSU9SNiwgTURDMSk7CisKKyNkZWZpbmUgRTEwIDE0MworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShNRElPMSwgTURJTzEsIFNJR19ERVNDX1NFVChTQ1U4OCwgMzEpKTsKK1NTX1BJTl9ERUNMKEUxMCwgR1BJT1I3LCBNRElPMSk7CisKK0ZVTkNfR1JPVVBfREVDTChNRElPMSwgRDgsIEUxMCk7CisKKy8qIFJHTUlJMS9STUlJMSAqLworCisjZGVmaW5lIFJNSUkxX0RFU0MgICAgICBTSUdfREVTQ19CSVQoSFdfU1RSQVAxLCA2LCAwKQorI2RlZmluZSBSTUlJMl9ERVNDICAgICAgU0lHX0RFU0NfQklUKEhXX1NUUkFQMSwgNywgMCkKKworI2RlZmluZSBCNSAxNTIKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1QwLCBHUElPVDAsIFNJR19ERVNDX1NFVChTQ1VBMCwgMCkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMVJDTEtPLCBSTUlJMSwgUk1JSTFfREVTQywKKwkJU0lHX0RFU0NfU0VUKFNDVTQ4LCAyOSkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTFUWENLLCBSR01JSTEpOworTVNfUElOX0RFQ0xfKEI1LCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVDApLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMVJDTEtPKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkxVFhDSykpOworCisjZGVmaW5lIEU5IDE1MworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVDEsIEdQSU9UMSwgU0lHX0RFU0NfU0VUKFNDVUEwLCAxKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkxVFhFTiwgUk1JSTEsIFJNSUkxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTFUWENUTCwgUkdNSUkxKTsKK01TX1BJTl9ERUNMXyhFOSwgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1QxKSwgU0lHX0VYUFJfTElTVF9QVFIoUk1JSTFUWEVOKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkxVFhDVEwpKTsKKworI2RlZmluZSBGOSAxNTQKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1QyLCBHUElPVDIsIFNJR19ERVNDX1NFVChTQ1VBMCwgMikpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMVRYRDAsIFJNSUkxLCBSTUlJMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkxVFhEMCwgUkdNSUkxKTsKK01TX1BJTl9ERUNMXyhGOSwgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1QyKSwgU0lHX0VYUFJfTElTVF9QVFIoUk1JSTFUWEQwKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkxVFhEMCkpOworCisjZGVmaW5lIEE1IDE1NQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVDMsIEdQSU9UMywgU0lHX0RFU0NfU0VUKFNDVUEwLCAzKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkxVFhEMSwgUk1JSTEsIFJNSUkxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTFUWEQxLCBSR01JSTEpOworTVNfUElOX0RFQ0xfKEE1LCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVDMpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMVRYRDEpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFUWEQxKSk7CisKKyNkZWZpbmUgRTcgMTU2CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9UNCwgR1BJT1Q0LCBTSUdfREVTQ19TRVQoU0NVQTAsIDQpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTFEQVNIMCwgUk1JSTEsIFJNSUkxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTFUWEQyLCBSR01JSTEpOworTVNfUElOX0RFQ0xfKEU3LCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVDQpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMURBU0gwKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkxVFhEMikpOworCisjZGVmaW5lIEQ3IDE1NworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVDUsIEdQSU9UNSwgU0lHX0RFU0NfU0VUKFNDVUEwLCA1KSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkxREFTSDEsIFJNSUkxLCBSTUlJMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkxVFhEMywgUkdNSUkxKTsKK01TX1BJTl9ERUNMXyhENywgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1Q1KSwgU0lHX0VYUFJfTElTVF9QVFIoUk1JSTFEQVNIMSksCisJCVNJR19FWFBSX0xJU1RfUFRSKFJHTUlJMVRYRDMpKTsKKworI2RlZmluZSBCMiAxNTgKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1Q2LCBHUElPVDYsIFNJR19ERVNDX1NFVChTQ1VBMCwgNikpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMlJDTEtPLCBSTUlJMiwgUk1JSTJfREVTQywKKwkJU0lHX0RFU0NfU0VUKFNDVTQ4LCAzMCkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTJUWENLLCBSR01JSTIpOworTVNfUElOX0RFQ0xfKEIyLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVDYpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMlJDTEtPKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkyVFhDSykpOworCisjZGVmaW5lIEIxIDE1OQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVDcsIEdQSU9UNywgU0lHX0RFU0NfU0VUKFNDVUEwLCA3KSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkyVFhFTiwgUk1JSTIsIFJNSUkyX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTJUWENUTCwgUkdNSUkyKTsKK01TX1BJTl9ERUNMXyhCMSwgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1Q3KSwgU0lHX0VYUFJfTElTVF9QVFIoUk1JSTJUWEVOKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkyVFhDVEwpKTsKKworI2RlZmluZSBBMiAxNjAKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1UwLCBHUElPVTAsIFNJR19ERVNDX1NFVChTQ1VBMCwgOCkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMlRYRDAsIFJNSUkyLCBSTUlJMl9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkyVFhEMCwgUkdNSUkyKTsKK01TX1BJTl9ERUNMXyhBMiwgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1UwKSwgU0lHX0VYUFJfTElTVF9QVFIoUk1JSTJUWEQwKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkyVFhEMCkpOworCisjZGVmaW5lIEIzIDE2MQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVTEsIEdQSU9VMSwgU0lHX0RFU0NfU0VUKFNDVUEwLCA5KSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkyVFhEMSwgUk1JSTIsIFJNSUkyX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTJUWEQxLCBSR01JSTIpOworTVNfUElOX0RFQ0xfKEIzLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVTEpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMlRYRDEpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTJUWEQxKSk7CisKKyNkZWZpbmUgRDUgMTYyCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9VMiwgR1BJT1UyLCBTSUdfREVTQ19TRVQoU0NVQTAsIDEwKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkyREFTSDAsIFJNSUkyLCBSTUlJMl9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkyVFhEMiwgUkdNSUkyKTsKK01TX1BJTl9ERUNMXyhENSwgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1UyKSwgU0lHX0VYUFJfTElTVF9QVFIoUk1JSTJEQVNIMCksCisJCVNJR19FWFBSX0xJU1RfUFRSKFJHTUlJMlRYRDIpKTsKKworI2RlZmluZSBENCAxNjMKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1UzLCBHUElPVTMsIFNJR19ERVNDX1NFVChTQ1VBMCwgMTEpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTJEQVNIMSwgUk1JSTIsIFJNSUkyX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTJUWEQzLCBSR01JSTIpOworTVNfUElOX0RFQ0xfKEQ0LCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVTMpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMkRBU0gxKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkyVFhEMykpOworCisjZGVmaW5lIEI0IDE2NAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVTQsIEdQSU9VNCwgU0lHX0RFU0NfU0VUKFNDVUEwLCAxMikpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMVJDTEtJLCBSTUlJMSwgUk1JSTFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMVJYQ0ssIFJHTUlJMSk7CitNU19QSU5fREVDTF8oQjQsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9VNCksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkxUkNMS0kpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFSWENLKSk7CisKKyNkZWZpbmUgQTQgMTY1CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9VNSwgR1BJT1U1LCBTSUdfREVTQ19TRVQoU0NVQTAsIDEzKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkxREFTSDIsIFJNSUkxLCBSTUlJMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkxUlhDVEwsIFJHTUlJMSk7CitNU19QSU5fREVDTF8oQTQsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9VNSksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkxREFTSDIpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFSWENUTCkpOworCisjZGVmaW5lIEEzIDE2NgorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVTYsIEdQSU9VNiwgU0lHX0RFU0NfU0VUKFNDVUEwLCAxNCkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMVJYRDAsIFJNSUkxLCBSTUlJMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkxUlhEMCwgUkdNSUkxKTsKK01TX1BJTl9ERUNMXyhBMywgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1U2KSwgU0lHX0VYUFJfTElTVF9QVFIoUk1JSTFSWEQwKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkxUlhEMCkpOworCisjZGVmaW5lIEQ2IDE2NworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVTcsIEdQSU9VNywgU0lHX0RFU0NfU0VUKFNDVUEwLCAxNSkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMVJYRDEsIFJNSUkxLCBSTUlJMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkxUlhEMSwgUkdNSUkxKTsKK01TX1BJTl9ERUNMXyhENiwgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1U3KSwgU0lHX0VYUFJfTElTVF9QVFIoUk1JSTFSWEQxKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkxUlhEMSkpOworCisjZGVmaW5lIEM1IDE2OAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVjAsIEdQSU9WMCwgU0lHX0RFU0NfU0VUKFNDVUEwLCAxNikpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMUNSU0RWLCBSTUlJMSwgUk1JSTFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMVJYRDIsIFJHTUlJMSk7CitNU19QSU5fREVDTF8oQzUsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9WMCksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkxQ1JTRFYpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFSWEQyKSk7CisKKyNkZWZpbmUgQzQgMTY5CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9WMSwgR1BJT1YxLCBTSUdfREVTQ19TRVQoU0NVQTAsIDE3KSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkxUlhFUiwgUk1JSTEsIFJNSUkxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTFSWEQzLCBSR01JSTEpOworTVNfUElOX0RFQ0xfKEM0LCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVjEpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMVJYRVIpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFSWEQzKSk7CisKK0ZVTkNfR1JPVVBfREVDTChSR01JSTEsIEI0LCBBNCwgQTMsIEQ2LCBDNSwgQzQsIEI1LCBFOSwgRjksIEE1LCBFNywgRDcpOworRlVOQ19HUk9VUF9ERUNMKFJNSUkxLCBCNCwgQTMsIEQ2LCBDNSwgQzQsIEI1LCBFOSwgRjksIEE1KTsKKworI2RlZmluZSBDMiAxNzAKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1YyLCBHUElPVjIsIFNJR19ERVNDX1NFVChTQ1VBMCwgMTgpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTJSQ0xLSSwgUk1JSTIsIFJNSUkyX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTJSWENLLCBSR01JSTIpOworTVNfUElOX0RFQ0xfKEMyLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVjIpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMlJDTEtJKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkyUlhDSykpOworCisjZGVmaW5lIEMxIDE3MQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVjMsIEdQSU9WMywgU0lHX0RFU0NfU0VUKFNDVUEwLCAxOSkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMkRBU0gyLCBSTUlJMiwgUk1JSTJfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMlJYQ1RMLCBSR01JSTIpOworTVNfUElOX0RFQ0xfKEMxLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVjMpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMkRBU0gyKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkyUlhDVEwpKTsKKworI2RlZmluZSBDMyAxNzIKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1Y0LCBHUElPVjQsIFNJR19ERVNDX1NFVChTQ1VBMCwgMjApKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTJSWEQwLCBSTUlJMiwgUk1JSTJfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMlJYRDAsIFJHTUlJMik7CitNU19QSU5fREVDTF8oQzMsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9WNCksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkyUlhEMCksCisJCVNJR19FWFBSX0xJU1RfUFRSKFJHTUlJMlJYRDApKTsKKworI2RlZmluZSBEMSAxNzMKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1Y1LCBHUElPVjUsIFNJR19ERVNDX1NFVChTQ1VBMCwgMjEpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTJSWEQxLCBSTUlJMiwgUk1JSTJfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMlJYRDEsIFJHTUlJMik7CitNU19QSU5fREVDTF8oRDEsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9WNSksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkyUlhEMSksCisJCVNJR19FWFBSX0xJU1RfUFRSKFJHTUlJMlJYRDEpKTsKKworI2RlZmluZSBEMiAxNzQKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1Y2LCBHUElPVjYsIFNJR19ERVNDX1NFVChTQ1VBMCwgMjIpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTJDUlNEViwgUk1JSTIsIFJNSUkyX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTJSWEQyLCBSR01JSTIpOworTVNfUElOX0RFQ0xfKEQyLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVjYpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMkNSU0RWKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkyUlhEMikpOworCisjZGVmaW5lIEU2IDE3NQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVjcsIEdQSU9WNywgU0lHX0RFU0NfU0VUKFNDVUEwLCAyMykpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMlJYRVIsIFJNSUkyLCBSTUlJMl9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkyUlhEMywgUkdNSUkyKTsKK01TX1BJTl9ERUNMXyhFNiwgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1Y3KSwgU0lHX0VYUFJfTElTVF9QVFIoUk1JSTJSWEVSKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkyUlhEMykpOworCitGVU5DX0dST1VQX0RFQ0woUkdNSUkyLCBCMiwgQjEsIEEyLCBCMywgRDUsIEQ0LCBDMiwgQzEsIEMzLCBEMSwgRDIsIEU2KTsKK0ZVTkNfR1JPVVBfREVDTChSTUlJMiwgQjIsIEIxLCBBMiwgQjMsIEMyLCBDMywgRDEsIEQyLCBFNik7CisKKy8qIFBpbnMsIGdyb3VwcyBhbmQgZnVuY3Rpb25zIGFyZSBzb3J0KDEpOmVkIGFscGhhYmV0aWNhbGx5IGZvciBzYW5pdHkgKi8KKworc3RhdGljIHN0cnVjdCBwaW5jdHJsX3Bpbl9kZXNjIGFzcGVlZF9nNV9waW5zW0FTUEVFRF9HNV9OUl9QSU5TXSA9IHsKKwlBU1BFRURfUElOQ1RSTF9QSU4oQTEwKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQTExKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQTEyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQTEzKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQTE0KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQTIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEE0KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQTUpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBOSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEFBMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEIxKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQjEwKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQjExKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQjEyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQjEzKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQjE0KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQjIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihCMjApLAorCUFTUEVFRF9QSU5DVFJMX1BJTihCMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEI0KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQjUpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihCOSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEMxKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzExKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzEyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzEzKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzE0KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzE2KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzE4KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihDMjApLAorCUFTUEVFRF9QSU5DVFJMX1BJTihDMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEM0KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzUpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihEMSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEQxMCksCisJQVNQRUVEX1BJTkNUUkxfUElOKEQyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRDIwKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRDIxKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRDQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihENSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEQ2KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRDcpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihEOCksCisJQVNQRUVEX1BJTkNUUkxfUElOKEQ5KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRTEwKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRTEyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRTEzKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRTE1KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRTIxKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRTYpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihFNyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEU5KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRjE5KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRjkpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihIMjApLAorCUFTUEVFRF9QSU5DVFJMX1BJTihMMSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEwyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oTDMpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihMNCksCisJQVNQRUVEX1BJTkNUUkxfUElOKE4xKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oTjIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihOMjApLAorCUFTUEVFRF9QSU5DVFJMX1BJTihOMjEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihOMjIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihOMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKE40KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oUDEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihQMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKFIxKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVDQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihVMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKFYyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVjMpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihWNiksCisJQVNQRUVEX1BJTkNUUkxfUElOKFcyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVzMpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihZMyksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFzcGVlZF9waW5fZ3JvdXAgYXNwZWVkX2c1X2dyb3Vwc1tdID0geworCUFTUEVFRF9QSU5DVFJMX0dST1VQKEdQSUQwKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChHUElEMiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoR1BJRTApLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEkyQzEwKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChJMkMxMSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDMTIpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEkyQzEzKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChJMkMxNCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDMyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDNCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDNSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDNiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDNyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDOCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDOSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoTUFDMUxJTkspLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKE1ESU8xKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChNRElPMiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoT1NDQ0xLKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChQRVdBS0UpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFBXTTApLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFBXTTEpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFBXTTIpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFBXTTMpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFBXTTQpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFBXTTUpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFBXTTYpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFBXTTcpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFJHTUlJMSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUkdNSUkyKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChSTUlJMSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUk1JSTIpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFNEMSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoU1BJMSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoVElNRVI0KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChUSU1FUjUpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFRJTUVSNiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoVElNRVI3KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChUSU1FUjgpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhc3BlZWRfcGluX2Z1bmN0aW9uIGFzcGVlZF9nNV9mdW5jdGlvbnNbXSA9IHsKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEdQSUQwKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEdQSUQyKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEdQSUUwKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEkyQzEwKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEkyQzExKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEkyQzEyKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEkyQzEzKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEkyQzE0KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEkyQzMpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDNCksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhJMkM1KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEkyQzYpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDNyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhJMkM4KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEkyQzkpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoTUFDMUxJTkspLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoTURJTzEpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoTURJTzIpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoT1NDQ0xLKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFBFV0FLRSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhQV00wKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFBXTTEpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUFdNMiksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhQV00zKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFBXTTQpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUFdNNSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhQV002KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFBXTTcpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUkdNSUkxKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFJHTUlJMiksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhSTUlJMSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhSTUlJMiksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhTRDEpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoU1BJMSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhUSU1FUjQpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoVElNRVI1KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFRJTUVSNiksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhUSU1FUjcpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoVElNRVI4KSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXNwZWVkX3BpbmN0cmxfZGF0YSBhc3BlZWRfZzVfcGluY3RybF9kYXRhID0geworCS5waW5zID0gYXNwZWVkX2c1X3BpbnMsCisJLm5waW5zID0gQVJSQVlfU0laRShhc3BlZWRfZzVfcGlucyksCisJLmdyb3VwcyA9IGFzcGVlZF9nNV9ncm91cHMsCisJLm5ncm91cHMgPSBBUlJBWV9TSVpFKGFzcGVlZF9nNV9ncm91cHMpLAorCS5mdW5jdGlvbnMgPSBhc3BlZWRfZzVfZnVuY3Rpb25zLAorCS5uZnVuY3Rpb25zID0gQVJSQVlfU0laRShhc3BlZWRfZzVfZnVuY3Rpb25zKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGlubXV4X29wcyBhc3BlZWRfZzVfcGlubXV4X29wcyA9IHsKKwkuZ2V0X2Z1bmN0aW9uc19jb3VudCA9IGFzcGVlZF9waW5tdXhfZ2V0X2ZuX2NvdW50LAorCS5nZXRfZnVuY3Rpb25fbmFtZSA9IGFzcGVlZF9waW5tdXhfZ2V0X2ZuX25hbWUsCisJLmdldF9mdW5jdGlvbl9ncm91cHMgPSBhc3BlZWRfcGlubXV4X2dldF9mbl9ncm91cHMsCisJLnNldF9tdXggPSBhc3BlZWRfcGlubXV4X3NldF9tdXgsCisJLmdwaW9fcmVxdWVzdF9lbmFibGUgPSBhc3BlZWRfZ3Bpb19yZXF1ZXN0X2VuYWJsZSwKKwkuc3RyaWN0ID0gdHJ1ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGluY3RybF9vcHMgYXNwZWVkX2c1X3BpbmN0cmxfb3BzID0geworCS5nZXRfZ3JvdXBzX2NvdW50ID0gYXNwZWVkX3BpbmN0cmxfZ2V0X2dyb3Vwc19jb3VudCwKKwkuZ2V0X2dyb3VwX25hbWUgPSBhc3BlZWRfcGluY3RybF9nZXRfZ3JvdXBfbmFtZSwKKwkuZ2V0X2dyb3VwX3BpbnMgPSBhc3BlZWRfcGluY3RybF9nZXRfZ3JvdXBfcGlucywKKwkucGluX2RiZ19zaG93ID0gYXNwZWVkX3BpbmN0cmxfcGluX2RiZ19zaG93LAorCS5kdF9ub2RlX3RvX21hcCA9IHBpbmNvbmZfZ2VuZXJpY19kdF9ub2RlX3RvX21hcF9waW4sCisJLmR0X2ZyZWVfbWFwID0gcGluY3RybF91dGlsc19mcmVlX21hcCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGluY3RybF9kZXNjIGFzcGVlZF9nNV9waW5jdHJsX2Rlc2MgPSB7CisJLm5hbWUgPSAiYXNwZWVkLWc1LXBpbmN0cmwiLAorCS5waW5zID0gYXNwZWVkX2c1X3BpbnMsCisJLm5waW5zID0gQVJSQVlfU0laRShhc3BlZWRfZzVfcGlucyksCisJLnBjdGxvcHMgPSAmYXNwZWVkX2c1X3BpbmN0cmxfb3BzLAorCS5wbXhvcHMgPSAmYXNwZWVkX2c1X3Bpbm11eF9vcHMsCit9OworCitzdGF0aWMgaW50IGFzcGVlZF9nNV9waW5jdHJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhc3BlZWRfZzVfcGlucyk7IGkrKykKKwkJYXNwZWVkX2c1X3BpbnNbaV0ubnVtYmVyID0gaTsKKworCXJldHVybiBhc3BlZWRfcGluY3RybF9wcm9iZShwZGV2LCAmYXNwZWVkX2c1X3BpbmN0cmxfZGVzYywKKwkJCSZhc3BlZWRfZzVfcGluY3RybF9kYXRhKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYXNwZWVkX2c1X3BpbmN0cmxfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImFzcGVlZCxhc3QyNTAwLXBpbmN0cmwiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiYXNwZWVkLGc1LXBpbmN0cmwiLCB9LAorCXsgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFzcGVlZF9nNV9waW5jdHJsX2RyaXZlciA9IHsKKwkucHJvYmUgPSBhc3BlZWRfZzVfcGluY3RybF9wcm9iZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhc3BlZWQtZzUtcGluY3RybCIsCisJCS5vZl9tYXRjaF90YWJsZSA9IGFzcGVlZF9nNV9waW5jdHJsX29mX21hdGNoLAorCX0sCit9OworCitzdGF0aWMgaW50IGFzcGVlZF9nNV9waW5jdHJsX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhc3BlZWRfZzVfcGluY3RybF9kcml2ZXIpOworfQorCithcmNoX2luaXRjYWxsKGFzcGVlZF9nNV9waW5jdHJsX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL2FzcGVlZC9waW5jdHJsLWFzcGVlZC5jIGIvZHJpdmVycy9waW5jdHJsL2FzcGVlZC9waW5jdHJsLWFzcGVlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOTFmOWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BpbmN0cmwvYXNwZWVkL3BpbmN0cmwtYXNwZWVkLmMKQEAgLTAsMCArMSw0OTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgSUJNIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlICIuLi9jb3JlLmgiCisjaW5jbHVkZSAicGluY3RybC1hc3BlZWQuaCIKKworaW50IGFzcGVlZF9waW5jdHJsX2dldF9ncm91cHNfY291bnQoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2KQoreworCXN0cnVjdCBhc3BlZWRfcGluY3RybF9kYXRhICpwZGF0YSA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOworCisJcmV0dXJuIHBkYXRhLT5uZ3JvdXBzOworfQorCitjb25zdCBjaGFyICphc3BlZWRfcGluY3RybF9nZXRfZ3JvdXBfbmFtZShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCXVuc2lnbmVkIGludCBncm91cCkKK3sKKwlzdHJ1Y3QgYXNwZWVkX3BpbmN0cmxfZGF0YSAqcGRhdGEgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKworCXJldHVybiBwZGF0YS0+Z3JvdXBzW2dyb3VwXS5uYW1lOworfQorCitpbnQgYXNwZWVkX3BpbmN0cmxfZ2V0X2dyb3VwX3BpbnMoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAorCQkJCSAgdW5zaWduZWQgaW50IGdyb3VwLCBjb25zdCB1bnNpZ25lZCBpbnQgKipwaW5zLAorCQkJCSAgdW5zaWduZWQgaW50ICpucGlucykKK3sKKwlzdHJ1Y3QgYXNwZWVkX3BpbmN0cmxfZGF0YSAqcGRhdGEgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKworCSpwaW5zID0gJnBkYXRhLT5ncm91cHNbZ3JvdXBdLnBpbnNbMF07CisJKm5waW5zID0gcGRhdGEtPmdyb3Vwc1tncm91cF0ubnBpbnM7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBhc3BlZWRfcGluY3RybF9waW5fZGJnX3Nob3coc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAorCQkJCSBzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc2VxX3ByaW50ZihzLCAiICVzIiwgZGV2X25hbWUocGN0bGRldi0+ZGV2KSk7Cit9CisKK2ludCBhc3BlZWRfcGlubXV4X2dldF9mbl9jb3VudChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYpCit7CisJc3RydWN0IGFzcGVlZF9waW5jdHJsX2RhdGEgKnBkYXRhID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7CisKKwlyZXR1cm4gcGRhdGEtPm5mdW5jdGlvbnM7Cit9CisKK2NvbnN0IGNoYXIgKmFzcGVlZF9waW5tdXhfZ2V0X2ZuX25hbWUoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbikKK3sKKwlzdHJ1Y3QgYXNwZWVkX3BpbmN0cmxfZGF0YSAqcGRhdGEgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKworCXJldHVybiBwZGF0YS0+ZnVuY3Rpb25zW2Z1bmN0aW9uXS5uYW1lOworfQorCitpbnQgYXNwZWVkX3Bpbm11eF9nZXRfZm5fZ3JvdXBzKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJCQl1bnNpZ25lZCBpbnQgZnVuY3Rpb24sCisJCQkJY29uc3QgY2hhciAqIGNvbnN0ICoqZ3JvdXBzLAorCQkJCXVuc2lnbmVkIGludCAqIGNvbnN0IG51bV9ncm91cHMpCit7CisJc3RydWN0IGFzcGVlZF9waW5jdHJsX2RhdGEgKnBkYXRhID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7CisKKwkqZ3JvdXBzID0gcGRhdGEtPmZ1bmN0aW9uc1tmdW5jdGlvbl0uZ3JvdXBzOworCSpudW1fZ3JvdXBzID0gcGRhdGEtPmZ1bmN0aW9uc1tmdW5jdGlvbl0ubmdyb3VwczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXNwZWVkX3NpZ19kZXNjX3ByaW50X3ZhbCgKKwkJY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZGVzYyAqZGVzYywgYm9vbCBlbmFibGUsIHUzMiBydikKK3sKKwlwcl9kZWJ1ZygiU0NVJXhbMHglMDh4XT0weCV4LCBnb3QgMHgleCBmcm9tIDB4JTA4eFxuIiwgZGVzYy0+cmVnLAorCQkJZGVzYy0+bWFzaywgZW5hYmxlID8gZGVzYy0+ZW5hYmxlIDogZGVzYy0+ZGlzYWJsZSwKKwkJCShydiAmIGRlc2MtPm1hc2spID4+IF9fZmZzKGRlc2MtPm1hc2spLCBydik7Cit9CisKKy8qKgorICogUXVlcnkgdGhlIGVuYWJsZWQgb3IgZGlzYWJsZWQgc3RhdGUgb2YgYSBzaWduYWwgZGVzY3JpcHRvcgorICoKKyAqIEBkZXNjOiBUaGUgc2lnbmFsIGRlc2NyaXB0b3Igb2YgaW50ZXJlc3QKKyAqIEBlbmFibGVkOiBUcnVlIHRvIHF1ZXJ5IHRoZSBlbmFibGVkIHN0YXRlLCBmYWxzZSB0byBxdWVyeSBkaXNhYmxlZCBzdGF0ZQorICogQHJlZ21hcDogVGhlIFNDVSByZWdtYXAgaW5zdGFuY2UKKyAqCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGRlc2NyaXB0b3IncyBiaXRmaWVsZCBpcyBjb25maWd1cmVkIHRvIHRoZSBzdGF0ZQorICogc2VsZWN0ZWQgYnkgQGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZQorICoKKyAqIEV2YWx1YXRpb24gb2YgZGVzY3JpcHRvciBzdGF0ZSBpcyBub24tdHJpdmlhbCBpbiB0aGF0IGl0IGlzIG5vdCBhIGJpbmFyeQorICogb3V0Y29tZTogVGhlIGJpdGZpZWxkcyBjYW4gYmUgZ3JlYXRlciB0aGFuIG9uZSBiaXQgaW4gc2l6ZSBhbmQgdGh1cyBjYW4gdGFrZQorICogYSB2YWx1ZSB0aGF0IGlzIG5laXRoZXIgdGhlIGVuYWJsZWQgbm9yIGRpc2FibGVkIHN0YXRlIHJlY29yZGVkIGluIHRoZQorICogZGVzY3JpcHRvciAodHlwaWNhbGx5IHRoaXMgbWVhbnMgYSBkaWZmZXJlbnQgZnVuY3Rpb24gdG8gdGhlIG9uZSBvZiBpbnRlcmVzdAorICogaXMgZW5hYmxlZCkuIFRodXMgd2UgbXVzdCBleHBsaWNpdGx5IHRlc3QgZm9yIGVpdGhlciBjb25kaXRpb24gYXMgcmVxdWlyZWQuCisgKi8KK3N0YXRpYyBib29sIGFzcGVlZF9zaWdfZGVzY19ldmFsKGNvbnN0IHN0cnVjdCBhc3BlZWRfc2lnX2Rlc2MgKmRlc2MsCisJCQkJIGJvb2wgZW5hYmxlZCwgc3RydWN0IHJlZ21hcCAqbWFwKQoreworCXVuc2lnbmVkIGludCByYXc7CisJdTMyIHdhbnQ7CisKKwlpZiAocmVnbWFwX3JlYWQobWFwLCBkZXNjLT5yZWcsICZyYXcpIDwgMCkKKwkJcmV0dXJuIGZhbHNlOworCisJYXNwZWVkX3NpZ19kZXNjX3ByaW50X3ZhbChkZXNjLCBlbmFibGVkLCByYXcpOworCXdhbnQgPSBlbmFibGVkID8gZGVzYy0+ZW5hYmxlIDogZGVzYy0+ZGlzYWJsZTsKKworCXJldHVybiAoKHJhdyAmIGRlc2MtPm1hc2spID4+IF9fZmZzKGRlc2MtPm1hc2spKSA9PSB3YW50OworfQorCisvKioKKyAqIFF1ZXJ5IHRoZSBlbmFibGVkIG9yIGRpc2FibGVkIHN0YXRlIGZvciBhIG11eCBmdW5jdGlvbidzIHNpZ25hbCBvbiBhIHBpbgorICoKKyAqIEBleHByOiBBbiBleHByZXNzaW9uIGNvbnRyb2xsaW5nIHRoZSBzaWduYWwgZm9yIGEgbXV4IGZ1bmN0aW9uIG9uIGEgcGluCisgKiBAZW5hYmxlZDogVHJ1ZSB0byBxdWVyeSB0aGUgZW5hYmxlZCBzdGF0ZSwgZmFsc2UgdG8gcXVlcnkgZGlzYWJsZWQgc3RhdGUKKyAqIEByZWdtYXA6IFRoZSBTQ1UgcmVnbWFwIGluc3RhbmNlCisgKgorICogQHJldHVybiBUcnVlIGlmIHRoZSBleHByZXNzaW9uIGNvbXBvc2VkIGJ5IEBlbmFibGVkIGV2YWx1YXRlcyB0cnVlLCBmYWxzZQorICogb3RoZXJ3aXNlCisgKgorICogQSBtdXggZnVuY3Rpb24gaXMgZW5hYmxlZCBvciBkaXNhYmxlZCBpZiB0aGUgZnVuY3Rpb24ncyBzaWduYWwgZXhwcmVzc2lvbgorICogZm9yIGVhY2ggcGluIGluIHRoZSBmdW5jdGlvbidzIHBpbiBncm91cCBldmFsdWF0ZXMgdHJ1ZSBmb3IgdGhlIGRlc2lyZWQKKyAqIHN0YXRlLiBBbiBzaWduYWwgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdHJ1ZSBpZiBhbGwgb2YgaXRzIGFzc29jaWF0ZWQgc2lnbmFsCisgKiBkZXNjcmlwdG9ycyBldmFsdWF0ZSB0cnVlIGZvciB0aGUgZGVzaXJlZCBzdGF0ZS4KKyAqCisgKiBJZiBhbiBleHByZXNzaW9uJ3Mgc3RhdGUgaXMgZGVzY3JpYmVkIGJ5IG1vcmUgdGhhbiBvbmUgYml0LCBlaXRoZXIgdGhyb3VnaAorICogbXVsdGktYml0IGJpdGZpZWxkcyBpbiBhIHNpbmdsZSBzaWduYWwgZGVzY3JpcHRvciBvciB0aHJvdWdoIG11bHRpcGxlIHNpZ25hbAorICogZGVzY3JpcHRvcnMgb2YgYSBzaW5nbGUgYml0IHRoZW4gaXQgaXMgcG9zc2libGUgZm9yIHRoZSBleHByZXNzaW9uIHRvIGJlIGluCisgKiBuZWl0aGVyIHRoZSBlbmFibGVkIG5vciBkaXNhYmxlZCBzdGF0ZS4gVGh1cyB3ZSBtdXN0IGV4cGxpY2l0bHkgdGVzdCBmb3IKKyAqIGVpdGhlciBjb25kaXRpb24gYXMgcmVxdWlyZWQuCisgKi8KK3N0YXRpYyBib29sIGFzcGVlZF9zaWdfZXhwcl9ldmFsKGNvbnN0IHN0cnVjdCBhc3BlZWRfc2lnX2V4cHIgKmV4cHIsCisJCQkJIGJvb2wgZW5hYmxlZCwgc3RydWN0IHJlZ21hcCAqbWFwKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGV4cHItPm5kZXNjczsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBhc3BlZWRfc2lnX2Rlc2MgKmRlc2MgPSAmZXhwci0+ZGVzY3NbaV07CisKKwkJaWYgKCFhc3BlZWRfc2lnX2Rlc2NfZXZhbChkZXNjLCBlbmFibGVkLCBtYXApKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCisvKioKKyAqIENvbmZpZ3VyZSBhIHBpbidzIHNpZ25hbCBieSBhcHBseWluZyBhbiBleHByZXNzaW9uJ3MgZGVzY3JpcHRvciBzdGF0ZSBmb3IKKyAqIGFsbCBkZXNjcmlwdG9ycyBpbiB0aGUgZXhwcmVzc2lvbi4KKyAqCisgKiBAZXhwcjogVGhlIGV4cHJlc3Npb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBmdW5jdGlvbiB3aG9zZSBzaWduYWwgaXMgdG8gYmUKKyAqICAgICAgICBjb25maWd1cmVkCisgKiBAZW5hYmxlOiB0cnVlIHRvIGVuYWJsZSBhbiBmdW5jdGlvbidzIHNpZ25hbCB0aHJvdWdoIGEgcGluJ3Mgc2lnbmFsCisgKiAgICAgICAgICBleHByZXNzaW9uLCBmYWxzZSB0byBkaXNhYmxlIHRoZSBmdW5jdGlvbidzIHNpZ25hbAorICogQG1hcDogVGhlIFNDVSdzIHJlZ21hcCBpbnN0YW5jZSBmb3IgcGlubXV4IHJlZ2lzdGVyIGFjY2Vzcy4KKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGV4cHJlc3Npb24gaXMgY29uZmlndXJlZCBhcyByZXF1ZXN0ZWQsIGZhbHNlIG90aGVyd2lzZQorICovCitzdGF0aWMgYm9vbCBhc3BlZWRfc2lnX2V4cHJfc2V0KGNvbnN0IHN0cnVjdCBhc3BlZWRfc2lnX2V4cHIgKmV4cHIsCisJCQkJYm9vbCBlbmFibGUsIHN0cnVjdCByZWdtYXAgKm1hcCkKK3sKKwlpbnQgaTsKKwlib29sIHJldDsKKworCXJldCA9IGFzcGVlZF9zaWdfZXhwcl9ldmFsKGV4cHIsIGVuYWJsZSwgbWFwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IGV4cHItPm5kZXNjczsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBhc3BlZWRfc2lnX2Rlc2MgKmRlc2MgPSAmZXhwci0+ZGVzY3NbaV07CisJCXUzMiBwYXR0ZXJuID0gZW5hYmxlID8gZGVzYy0+ZW5hYmxlIDogZGVzYy0+ZGlzYWJsZTsKKworCQkvKgorCQkgKiBTdHJhcCByZWdpc3RlcnMgYXJlIGNvbmZpZ3VyZWQgaW4gaGFyZHdhcmUgb3IgYnkgZWFybHktYm9vdAorCQkgKiBmaXJtd2FyZS4gVHJlYXQgdGhlbSBhcyByZWFkLW9ubHkgZGVzcGl0ZSB0aGF0IHdlIGNhbiB3cml0ZQorCQkgKiB0aGVtLiBUaGlzIG1heSBtZWFuIHRoYXQgY2VydGFpbiBmdW5jdGlvbnMgY2Fubm90IGJlCisJCSAqIGRlY29uZmlndXJlZCBhbmQgaXMgdGhlIHJlYXNvbiB3ZSByZS1ldmFsdWF0ZSBhZnRlciB3cml0aW5nCisJCSAqIGFsbCBkZXNjcmlwdG9yIGJpdHMuCisJCSAqLworCQlpZiAoZGVzYy0+cmVnID09IEhXX1NUUkFQMSB8fCBkZXNjLT5yZWcgPT0gSFdfU1RSQVAyKQorCQkJY29udGludWU7CisKKwkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKG1hcCwgZGVzYy0+cmVnLCBkZXNjLT5tYXNrLAorCQkJCXBhdHRlcm4gPDwgX19mZnMoZGVzYy0+bWFzaykpID09IDA7CisKKwkJaWYgKCFyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBhc3BlZWRfc2lnX2V4cHJfZXZhbChleHByLCBlbmFibGUsIG1hcCk7Cit9CisKK3N0YXRpYyBib29sIGFzcGVlZF9zaWdfZXhwcl9lbmFibGUoY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZXhwciAqZXhwciwKKwkJCQkgICBzdHJ1Y3QgcmVnbWFwICptYXApCit7CisJcmV0dXJuIGFzcGVlZF9zaWdfZXhwcl9zZXQoZXhwciwgdHJ1ZSwgbWFwKTsKK30KKworc3RhdGljIGJvb2wgYXNwZWVkX3NpZ19leHByX2Rpc2FibGUoY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZXhwciAqZXhwciwKKwkJCQkgICAgc3RydWN0IHJlZ21hcCAqbWFwKQoreworCXJldHVybiBhc3BlZWRfc2lnX2V4cHJfc2V0KGV4cHIsIGZhbHNlLCBtYXApOworfQorCisvKioKKyAqIERpc2FibGUgYSBzaWduYWwgb24gYSBwaW4gYnkgZGlzYWJsaW5nIGFsbCBwcm92aWRlZCBzaWduYWwgZXhwcmVzc2lvbnMuCisgKgorICogQGV4cHJzOiBUaGUgbGlzdCBvZiBzaWduYWwgZXhwcmVzc2lvbnMgKGZyb20gYSBwcmlvcml0eSBsZXZlbCBvbiBhIHBpbikKKyAqIEBtYXA6IFRoZSBTQ1UncyByZWdtYXAgaW5zdGFuY2UgZm9yIHBpbm11eCByZWdpc3RlciBhY2Nlc3MuCisgKgorICogQHJldHVybiB0cnVlIGlmIGFsbCBleHByZXNzaW9ucyBpbiB0aGUgbGlzdCBhcmUgc3VjY2Vzc2Z1bGx5IGRpc2FibGVkLCBmYWxzZQorICogb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBib29sIGFzcGVlZF9kaXNhYmxlX3NpZyhjb25zdCBzdHJ1Y3QgYXNwZWVkX3NpZ19leHByICoqZXhwcnMsCisJCQkgICAgICAgc3RydWN0IHJlZ21hcCAqbWFwKQoreworCWJvb2wgZGlzYWJsZWQgPSB0cnVlOworCisJaWYgKCFleHBycykKKwkJcmV0dXJuIHRydWU7CisKKwl3aGlsZSAoKmV4cHJzKSB7CisJCWJvb2wgcmV0OworCisJCXJldCA9IGFzcGVlZF9zaWdfZXhwcl9kaXNhYmxlKCpleHBycywgbWFwKTsKKwkJZGlzYWJsZWQgPSBkaXNhYmxlZCAmJiByZXQ7CisKKwkJZXhwcnMrKzsKKwl9CisKKwlyZXR1cm4gZGlzYWJsZWQ7Cit9CisKKy8qKgorICogU2VhcmNoIGZvciB0aGUgc2lnbmFsIGV4cHJlc3Npb24gbmVlZGVkIHRvIGVuYWJsZSB0aGUgcGluJ3Mgc2lnbmFsIGZvciB0aGUKKyAqIHJlcXVlc3RlZCBmdW5jdGlvbi4KKyAqCisgKiBAZXhwcnM6IExpc3Qgb2Ygc2lnbmFsIGV4cHJlc3Npb25zIChoYXlzdGFjaykKKyAqIEBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIGZ1bmN0aW9uIChuZWVkbGUpCisgKgorICogQHJldHVybiBBIHBvaW50ZXIgdG8gdGhlIHNpZ25hbCBleHByZXNzaW9uIHdob3NlIGZ1bmN0aW9uIHRhZyBtYXRjaGVzIHRoZQorICogICAgICAgICBwcm92aWRlZCBuYW1lLCBvdGhlcndpc2UgTlVMTC4KKyAqCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXNwZWVkX3NpZ19leHByICphc3BlZWRfZmluZF9leHByX2J5X25hbWUoCisJCWNvbnN0IHN0cnVjdCBhc3BlZWRfc2lnX2V4cHIgKipleHBycywgY29uc3QgY2hhciAqbmFtZSkKK3sKKwl3aGlsZSAoKmV4cHJzKSB7CisJCWlmIChzdHJjbXAoKCpleHBycyktPmZ1bmN0aW9uLCBuYW1lKSA9PSAwKQorCQkJcmV0dXJuICpleHByczsKKwkJZXhwcnMrKzsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNoYXIgKmdldF9kZWZpbmVkX2F0dHJpYnV0ZShjb25zdCBzdHJ1Y3QgYXNwZWVkX3Bpbl9kZXNjICpwZGVzYywKKwkJCQkgICBjb25zdCBjaGFyICooKmdldCkoCisJCQkJCSAgIGNvbnN0IHN0cnVjdCBhc3BlZWRfc2lnX2V4cHIgKikpCit7CisJY2hhciAqZm91bmQgPSBOVUxMOworCXNpemVfdCBsZW4gPSAwOworCWNvbnN0IHN0cnVjdCBhc3BlZWRfc2lnX2V4cHIgKioqcHJpb3MsICoqZnVuY3MsICpleHByOworCisJcHJpb3MgPSBwZGVzYy0+cHJpb3M7CisKKwl3aGlsZSAoKGZ1bmNzID0gKnByaW9zKSkgeworCQl3aGlsZSAoKGV4cHIgPSAqZnVuY3MpKSB7CisJCQljb25zdCBjaGFyICpzdHIgPSBnZXQoZXhwcik7CisJCQlzaXplX3QgZGVsdGEgPSBzdHJsZW4oc3RyKSArIDI7CisJCQljaGFyICpleHBhbmRlZDsKKworCQkJZXhwYW5kZWQgPSBrcmVhbGxvYyhmb3VuZCwgbGVuICsgZGVsdGEgKyAxLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghZXhwYW5kZWQpIHsKKwkJCQlrZnJlZShmb3VuZCk7CisJCQkJcmV0dXJuIGV4cGFuZGVkOworCQkJfQorCisJCQlmb3VuZCA9IGV4cGFuZGVkOworCQkJZm91bmRbbGVuXSA9ICdcMCc7CisJCQlsZW4gKz0gZGVsdGE7CisKKwkJCXN0cmNhdChmb3VuZCwgc3RyKTsKKwkJCXN0cmNhdChmb3VuZCwgIiwgIik7CisKKwkJCWZ1bmNzKys7CisJCX0KKwkJcHJpb3MrKzsKKwl9CisKKwlpZiAobGVuIDwgMikgeworCQlrZnJlZShmb3VuZCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWZvdW5kW2xlbiAtIDJdID0gJ1wwJzsKKworCXJldHVybiBmb3VuZDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmFzcGVlZF9zaWdfZXhwcl9mdW5jdGlvbihjb25zdCBzdHJ1Y3QgYXNwZWVkX3NpZ19leHByICpleHByKQoreworCXJldHVybiBleHByLT5mdW5jdGlvbjsKK30KKworc3RhdGljIGNoYXIgKmdldF9kZWZpbmVkX2Z1bmN0aW9ucyhjb25zdCBzdHJ1Y3QgYXNwZWVkX3Bpbl9kZXNjICpwZGVzYykKK3sKKwlyZXR1cm4gZ2V0X2RlZmluZWRfYXR0cmlidXRlKHBkZXNjLCBhc3BlZWRfc2lnX2V4cHJfZnVuY3Rpb24pOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYXNwZWVkX3NpZ19leHByX3NpZ25hbChjb25zdCBzdHJ1Y3QgYXNwZWVkX3NpZ19leHByICpleHByKQoreworCXJldHVybiBleHByLT5zaWduYWw7Cit9CisKK3N0YXRpYyBjaGFyICpnZXRfZGVmaW5lZF9zaWduYWxzKGNvbnN0IHN0cnVjdCBhc3BlZWRfcGluX2Rlc2MgKnBkZXNjKQoreworCXJldHVybiBnZXRfZGVmaW5lZF9hdHRyaWJ1dGUocGRlc2MsIGFzcGVlZF9zaWdfZXhwcl9zaWduYWwpOworfQorCitpbnQgYXNwZWVkX3Bpbm11eF9zZXRfbXV4KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwgdW5zaWduZWQgaW50IGZ1bmN0aW9uLAorCQkJICB1bnNpZ25lZCBpbnQgZ3JvdXApCit7CisJaW50IGk7CisJY29uc3Qgc3RydWN0IGFzcGVlZF9waW5jdHJsX2RhdGEgKnBkYXRhID0KKwkJcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7CisJY29uc3Qgc3RydWN0IGFzcGVlZF9waW5fZ3JvdXAgKnBncm91cCA9ICZwZGF0YS0+Z3JvdXBzW2dyb3VwXTsKKwljb25zdCBzdHJ1Y3QgYXNwZWVkX3Bpbl9mdW5jdGlvbiAqcGZ1bmMgPQorCQkmcGRhdGEtPmZ1bmN0aW9uc1tmdW5jdGlvbl07CisKKwlmb3IgKGkgPSAwOyBpIDwgcGdyb3VwLT5ucGluczsgaSsrKSB7CisJCWludCBwaW4gPSBwZ3JvdXAtPnBpbnNbaV07CisJCWNvbnN0IHN0cnVjdCBhc3BlZWRfcGluX2Rlc2MgKnBkZXNjID0gcGRhdGEtPnBpbnNbcGluXS5kcnZfZGF0YTsKKwkJY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZXhwciAqZXhwciA9IE5VTEw7CisJCWNvbnN0IHN0cnVjdCBhc3BlZWRfc2lnX2V4cHIgKipmdW5jczsKKwkJY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZXhwciAqKipwcmlvczsKKworCQlpZiAoIXBkZXNjKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcHJpb3MgPSBwZGVzYy0+cHJpb3M7CisKKwkJaWYgKCFwcmlvcykKKwkJCWNvbnRpbnVlOworCisJCS8qIERpc2FibGUgZnVuY3Rpb25zIGF0IGEgaGlnaGVyIHByaW9yaXR5IHRoYW4gdGhhdCByZXF1ZXN0ZWQgKi8KKwkJd2hpbGUgKChmdW5jcyA9ICpwcmlvcykpIHsKKwkJCWV4cHIgPSBhc3BlZWRfZmluZF9leHByX2J5X25hbWUoZnVuY3MsIHBmdW5jLT5uYW1lKTsKKworCQkJaWYgKGV4cHIpCisJCQkJYnJlYWs7CisKKwkJCWlmICghYXNwZWVkX2Rpc2FibGVfc2lnKGZ1bmNzLCBwZGF0YS0+bWFwKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCisJCQlwcmlvcysrOworCQl9CisKKwkJaWYgKCFleHByKSB7CisJCQljaGFyICpmdW5jdGlvbnMgPSBnZXRfZGVmaW5lZF9mdW5jdGlvbnMocGRlc2MpOworCQkJY2hhciAqc2lnbmFscyA9IGdldF9kZWZpbmVkX3NpZ25hbHMocGRlc2MpOworCisJCQlwcl93YXJuKCJObyBmdW5jdGlvbiAlcyBmb3VuZCBvbiBwaW4gJXMgKCVkKS4gRm91bmQgc2lnbmFsKHMpICVzIGZvciBmdW5jdGlvbihzKSAlc1xuIiwKKwkJCQlwZnVuYy0+bmFtZSwgcGRlc2MtPm5hbWUsIHBpbiwgc2lnbmFscywKKwkJCQlmdW5jdGlvbnMpOworCQkJa2ZyZWUoc2lnbmFscyk7CisJCQlrZnJlZShmdW5jdGlvbnMpOworCisJCQlyZXR1cm4gLUVOWElPOworCQl9CisKKwkJaWYgKCFhc3BlZWRfc2lnX2V4cHJfZW5hYmxlKGV4cHIsIHBkYXRhLT5tYXApKQorCQkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2wgYXNwZWVkX2V4cHJfaXNfZ3Bpbyhjb25zdCBzdHJ1Y3QgYXNwZWVkX3NpZ19leHByICpleHByKQoreworCS8qCisJICogVGhlIHNpZ25hbCB0eXBlIGlzIEdQSU8gaWYgdGhlIHNpZ25hbCBuYW1lIGhhcyAiR1BJTyIgYXMgYSBwcmVmaXguCisJICogc3RybmNtcCAocmF0aGVyIHRoYW4gc3RyY21wKSBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgcHJlZml4CisJICogcmVxdWlyZW1lbnQuCisJICoKKwkgKiBleHByLT5zaWduYWwgbWlnaHQgbG9vayBsaWtlICJHUElPVDMiIGluIHRoZSBHUElPIGNhc2UuCisJICovCisJcmV0dXJuIHN0cm5jbXAoZXhwci0+c2lnbmFsLCAiR1BJTyIsIDQpID09IDA7Cit9CisKK3N0YXRpYyBib29sIGFzcGVlZF9ncGlvX2luX2V4cHJzKGNvbnN0IHN0cnVjdCBhc3BlZWRfc2lnX2V4cHIgKipleHBycykKK3sKKwlpZiAoIWV4cHJzKQorCQlyZXR1cm4gZmFsc2U7CisKKwl3aGlsZSAoKmV4cHJzKSB7CisJCWlmIChhc3BlZWRfZXhwcl9pc19ncGlvKCpleHBycykpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJZXhwcnMrKzsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK2ludCBhc3BlZWRfZ3Bpb19yZXF1ZXN0X2VuYWJsZShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCQkgICAgICAgc3RydWN0IHBpbmN0cmxfZ3Bpb19yYW5nZSAqcmFuZ2UsCisJCQkgICAgICAgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwljb25zdCBzdHJ1Y3QgYXNwZWVkX3BpbmN0cmxfZGF0YSAqcGRhdGEgPQorCQlwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKwljb25zdCBzdHJ1Y3QgYXNwZWVkX3Bpbl9kZXNjICpwZGVzYyA9IHBkYXRhLT5waW5zW29mZnNldF0uZHJ2X2RhdGE7CisJY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZXhwciAqKipwcmlvcywgKipmdW5jcywgKmV4cHI7CisKKwlpZiAoIXBkZXNjKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXByaW9zID0gcGRlc2MtPnByaW9zOworCisJaWYgKCFwcmlvcykKKwkJcmV0dXJuIC1FTlhJTzsKKworCS8qIERpc2FibGUgYW55IGZ1bmN0aW9ucyBvZiBoaWdoZXIgcHJpb3JpdHkgdGhhbiBHUElPICovCisJd2hpbGUgKChmdW5jcyA9ICpwcmlvcykpIHsKKwkJaWYgKGFzcGVlZF9ncGlvX2luX2V4cHJzKGZ1bmNzKSkKKwkJCWJyZWFrOworCisJCWlmICghYXNwZWVkX2Rpc2FibGVfc2lnKGZ1bmNzLCBwZGF0YS0+bWFwKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJcHJpb3MrKzsKKwl9CisKKwlpZiAoIWZ1bmNzKSB7CisJCWNoYXIgKnNpZ25hbHMgPSBnZXRfZGVmaW5lZF9zaWduYWxzKHBkZXNjKTsKKworCQlwcl93YXJuKCJObyBHUElPIHNpZ25hbCB0eXBlIGZvdW5kIG9uIHBpbiAlcyAoJWQpLiBGb3VuZDogJXNcbiIsCisJCQlwZGVzYy0+bmFtZSwgb2Zmc2V0LCBzaWduYWxzKTsKKwkJa2ZyZWUoc2lnbmFscyk7CisKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlleHByID0gKmZ1bmNzOworCisJLyoKKwkgKiBEaXNhYmxpbmcgYWxsIGhpZ2hlci1wcmlvcml0eSBleHByZXNzaW9ucyBpcyBlbm91Z2ggdG8gZW5hYmxlIHRoZQorCSAqIGxvd2VzdC1wcmlvcml0eSBzaWduYWwgdHlwZS4gQXMgc3VjaCBpdCBoYXMgbm8gYXNzb2NpYXRlZAorCSAqIGV4cHJlc3Npb24uCisJICovCisJaWYgKCFleHByKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogSWYgR1BJTyBpcyBub3QgdGhlIGxvd2VzdCBwcmlvcml0eSBzaWduYWwgdHlwZSwgYXNzdW1lIHRoZXJlIGlzIG9ubHkKKwkgKiBvbmUgZXhwcmVzc2lvbiBkZWZpbmVkIHRvIGVuYWJsZSB0aGUgR1BJTyBmdW5jdGlvbgorCSAqLworCWlmICghYXNwZWVkX3NpZ19leHByX2VuYWJsZShleHByLCBwZGF0YS0+bWFwKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXJldHVybiAwOworfQorCitpbnQgYXNwZWVkX3BpbmN0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCSBzdHJ1Y3QgcGluY3RybF9kZXNjICpwZGVzYywKKwkJCSBzdHJ1Y3QgYXNwZWVkX3BpbmN0cmxfZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IGRldmljZSAqcGFyZW50OworCXN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bDsKKworCXBhcmVudCA9IHBkZXYtPmRldi5wYXJlbnQ7CisJaWYgKCFwYXJlbnQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gcGFyZW50IGZvciBzeXNjb24gcGluY29udHJvbGxlclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXBkYXRhLT5tYXAgPSBzeXNjb25fbm9kZV90b19yZWdtYXAocGFyZW50LT5vZl9ub2RlKTsKKwlpZiAoSVNfRVJSKHBkYXRhLT5tYXApKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIHJlZ21hcCBmb3Igc3lzY29uIHBpbmNvbnRyb2xsZXIgcGFyZW50XG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIocGRhdGEtPm1hcCk7CisJfQorCisJcGN0bCA9IHBpbmN0cmxfcmVnaXN0ZXIocGRlc2MsICZwZGV2LT5kZXYsIHBkYXRhKTsKKworCWlmIChJU19FUlIocGN0bCkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHBpbmN0cmxcbiIpOworCQlyZXR1cm4gUFRSX0VSUihwY3RsKTsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9hc3BlZWQvcGluY3RybC1hc3BlZWQuaCBiL2RyaXZlcnMvcGluY3RybC9hc3BlZWQvcGluY3RybC1hc3BlZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTcyZWY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waW5jdHJsL2FzcGVlZC9waW5jdHJsLWFzcGVlZC5oCkBAIC0wLDAgKzEsNTY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IElCTSBDb3JwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBQSU5DVFJMX0FTUEVFRAorI2RlZmluZSBQSU5DVFJMX0FTUEVFRAorCisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jdHJsLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5tdXguaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmNvbmYuaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmNvbmYtZ2VuZXJpYy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorCisvKgorICogVGhlIEFTUEVFRCBTb0NzIHByb3ZpZGUgdHlwaWNhbGx5IG1vcmUgdGhhbiAyMDAgcGlucyBmb3IgR1BJTyBhbmQgb3RoZXIKKyAqIGZ1bmN0aW9ucy4gVGhlIFNvQyBmdW5jdGlvbiBlbmFibGVkIG9uIGEgcGluIGlzIGRldGVybWluZWQgb24gYSBwcmlvcml0eQorICogYmFzaXMgd2hlcmUgYSBnaXZlbiBwaW4gY2FuIHByb3ZpZGUgYSBudW1iZXIgb2YgZGlmZmVyZW50IHNpZ25hbCB0eXBlcy4KKyAqCisgKiBUaGUgc2lnbmFsIGFjdGl2ZSBvbiBhIHBpbiBpcyBkZXNjcmliZWQgYnkgYm90aCBhIHByaW9yaXR5IGxldmVsIGFuZAorICogY29tcG91bmQgbG9naWNhbCBleHByZXNzaW9ucyBpbnZvbHZpbmcgbXVsdGlwbGUgb3BlcmF0b3JzLCByZWdpc3RlcnMgYW5kCisgKiBiaXRzLiBTb21lIGRpZmZpY3VsdHkgYXJpc2VzIGFzIHRoZSBwaW4ncyBmdW5jdGlvbiBiaXQgbWFza3MgZm9yIGVhY2gKKyAqIHByaW9yaXR5IGxldmVsIGFyZSBmcmVxdWVudGx5IG5vdCB0aGUgc2FtZSAoaS5lLiBjYW5ub3QganVzdCBmbGlwIGEgYml0IHRvCisgKiBjaGFuZ2UgZnJvbSBhIGhpZ2ggdG8gbG93IHByaW9yaXR5IHNpZ25hbCksIG9yIGV2ZW4gaW4gdGhlIHNhbWUgcmVnaXN0ZXIuCisgKiBGdXJ0aGVyLCBub3QgYWxsIHNpZ25hbHMgY2FuIGJlIHVubXV4ZWQsIGFzIHNvbWUgZXhwcmVzc2lvbnMgZGVwZW5kIG9uCisgKiB2YWx1ZXMgaW4gdGhlIGhhcmR3YXJlIHN0cmFwcGluZyByZWdpc3RlciAod2hpY2ggaXMgdHJlYXRlZCBhcyByZWFkLW9ubHkpLgorICoKKyAqIFNvQyBNdWx0aS1mdW5jdGlvbiBQaW4gRXhwcmVzc2lvbiBFeGFtcGxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogSGVyZSBhcmUgc29tZSBzYW1wbGUgbXV4IGNvbmZpZ3VyYXRpb25zIGZyb20gdGhlIEFTVDI0MDAgYW5kIEFTVDI1MDAKKyAqIGRhdGFzaGVldHMgdG8gaWxsdXN0cmF0ZSB0aGUgY29ybmVyIGNhc2VzLCByb3VnaGx5IGluIG9yZGVyIG9mIGxlYXN0IHRvIG1vc3QKKyAqIGNvcm5lci4gVGhlIHNpZ25hbCBwcmlvcml0aWVzIGFyZSBpbiBkZWNlbmRpbmcgb3JkZXIgZnJvbSBQMCAoaGlnaGVzdCkuCisgKgorICogRDYgaXMgYSBwaW4gd2l0aCBhIHNpbmdsZSBmdW5jdGlvbiAoYmVzaWRlIEdQSU8pOyBhIGhpZ2ggcHJpb3JpdHkgc2lnbmFsCisgKiB0aGF0IHBhcnRpY2lwYXRlcyBpbiBvbmUgZnVuY3Rpb246CisgKgorICogQmFsbCB8IERlZmF1bHQgfCBQMCBTaWduYWwgfCBQMCBFeHByZXNzaW9uICAgICAgICAgICAgICAgfCBQMSBTaWduYWwgfCBQMSBFeHByZXNzaW9uIHwgT3RoZXIKKyAqIC0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLQorICogIEQ2ICAgIEdQSU9BMCAgICBNQUMxTElOSyAgICBTQ1U4MFswXT0xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT0EwCisgKiAtLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0KKyAqCisgKiBDNSBpcyBhIG11bHRpLXNpZ25hbCBwaW4gKGhpZ2ggYW5kIGxvdyBwcmlvcml0eSBzaWduYWxzKS4gSGVyZSB3ZSB0b3VjaAorICogZGlmZmVyZW50IHJlZ2lzdGVycyBmb3IgdGhlIGRpZmZlcmVudCBmdW5jdGlvbnMgdGhhdCBlbmFibGUgZWFjaCBzaWduYWw6CisgKgorICogLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tCisgKiAgQzUgICAgR1BJT0E0ICAgIFNDTDkgICAgICAgIFNDVTkwWzIyXT0xICAgICAgICAgICAgICAgICAgIFRJTUVSNSAgICAgIFNDVTgwWzRdPTEgICAgICBHUElPQTQKKyAqIC0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLQorICoKKyAqIEUxOSBpcyBhIHNpbmdsZS1zaWduYWwgcGluIHdpdGggdHdvIGZ1bmN0aW9ucyB0aGF0IGluZmx1ZW5jZSB0aGUgYWN0aXZlCisgKiBzaWduYWwuIEluIHRoaXMgY2FzZSBib3RoIGJpdHMgaGF2ZSB0aGUgc2FtZSBtZWFuaW5nIC0gZW5hYmxlIGEgZGVkaWNhdGVkCisgKiBMUEMgcmVzZXQgcGluLiBIb3dldmVyIGl0J3Mgbm90IGFsd2F5cyB0aGUgY2FzZSB0aGF0IHRoZSBiaXRzIGluIHRoZQorICogT1ItcmVsYXRpb25zaGlwIGhhdmUgdGhlIHNhbWUgbWVhbmluZy4KKyAqCisgKiAtLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0KKyAqICBFMTkgICBHUElPQjQgICAgTFBDUlNUIyAgICAgU0NVODBbMTJdPTEgfCBTdHJhcFsxNF09MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQSU9CNAorICogLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tCisgKgorICogRm9yIGV4YW1wbGUsIHBpbiBCMTkgaGFzIGEgbG93LXByaW9yaXR5IHNpZ25hbCB0aGF0J3MgZW5hYmxlZCBieSB0d28KKyAqIGRpc3RpbmN0IFNvQyBmdW5jdGlvbnM6IEEgc3BlY2lmaWMgU0lPUEJJIGJpdCBpbiByZWdpc3RlciBTQ1VBNCwgYW5kIGFuIEFDUEkKKyAqIGJpdCBpbiB0aGUgU1RSQVAgcmVnaXN0ZXIuIFRoZSBBQ1BJIGJpdCBjb25maWd1cmVzIHNpZ25hbHMgb24gcGlucyBpbgorICogYWRkaXRpb24gdG8gQjE5LiBCb3RoIG9mIHRoZSBsb3cgcHJpb3JpdHkgZnVuY3Rpb25zIGFzIHdlbGwgYXMgdGhlIGhpZ2gKKyAqIHByaW9yaXR5IGZ1bmN0aW9uIG11c3QgYmUgZGlzYWJsZWQgZm9yIEdQSU9GMSB0byBiZSB1c2VkLgorICoKKyAqIEJhbGwgfCBEZWZhdWx0IHwgUDAgU2lnbmFsIHwgUDAgRXhwcmVzc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUDEgU2lnbmFsIHwgUDEgRXhwcmVzc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgfCBPdGhlcgorICogLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLQorICogIEIxOSAgIEdQSU9GMSAgICBORENENCAgICAgICBTQ1U4MFsyNV09MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSU9QQkkjICAgICBTQ1VBNFsxMl09MSB8IFN0cmFwWzE5XT0wICAgICAgICAgICAgICAgIEdQSU9GMQorICogLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLQorICoKKyAqIEZvciBwaW4gRTE4LCB0aGUgU29DIEFORHMgdGhlIGV4cGVjdGVkIHN0YXRlIG9mIHRocmVlIGJpdHMgdG8gZGV0ZXJtaW5lIHRoZQorICogcGluJ3MgYWN0aXZlIHNpZ25hbDoKKyAqCisgKiAqIFNDVTNDWzNdOiBFbmFibGUgZXh0ZXJuYWwgU09DIHJlc2V0IGZ1bmN0aW9uCisgKiAqIFNDVTgwWzE1XTogRW5hYmxlIFNQSUNTMSMgb3IgRVhUUlNUIyBmdW5jdGlvbiBwaW4KKyAqICogU0NVOTBbMzFdOiBTZWxlY3QgU1BJIGludGVyZmFjZSBDUyMgb3V0cHV0CisgKgorICogLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLQorICogIEUxOCAgIEdQSU9CNyAgICBFWFRSU1QjICAgICBTQ1UzQ1szXT0xICYgU0NVODBbMTVdPTEgJiBTQ1U5MFszMV09MCAgICBTUElDUzEjICAgICBTQ1UzQ1szXT0xICYgU0NVODBbMTVdPTEgJiBTQ1U5MFszMV09MSAgIEdQSU9CNworICogLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLQorICoKKyAqIChCaXRzIFNDVTNDWzNdIGFuZCBTQ1U4MFsxNV0gYXBwZWFyIHRvIG9ubHkgYmUgdXNlZCBpbiB0aGUgZXhwcmVzc2lvbnMgZm9yCisgKiBzZWxlY3RpbmcgdGhlIHNpZ25hbHMgb24gcGluIEUxOCkKKyAqCisgKiBQaW4gVDUgaXMgYSBtdWx0aS1zaWduYWwgcGluIHdpdGggYSBtb3JlIGNvbXBsZXggY29uZmlndXJhdGlvbjoKKyAqCisgKiBCYWxsIHwgRGVmYXVsdCB8IFAwIFNpZ25hbCB8IFAwIEV4cHJlc3Npb24gICAgICAgICAgICAgICAgfCBQMSBTaWduYWwgfCBQMSBFeHByZXNzaW9uIHwgT3RoZXIKKyAqIC0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0KKyAqICBUNSAgICBHUElPTDEgICAgVlBJREUgICAgICAgU0NVOTBbNTo0XSE9MCAmIFNDVTg0WzE3XT0xICAgIE5EQ0QxICAgICAgIFNDVTg0WzE3XT0xICAgICBHUElPTDEKKyAqIC0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0KKyAqCisgKiBUaGUgaGlnaCBwcmlvcml0eSBzaWduYWwgY29uZmlndXJhdGlvbiBpcyBiZXN0IHRob3VnaHQgb2YgaW4gdGVybXMgb2YgaXRzCisgKiBleHBsb2RlZCBmb3JtLCB3aXRoIHJlZmVyZW5jZSB0byB0aGUgU0NVOTBbNTo0XSBiaXRzOgorICoKKyAqICogU0NVOTBbNTo0XT0wMDogZGlzYWJsZQorICogKiBTQ1U5MFs1OjRdPTAxOiAxOCBiaXRzIChSNi9HNi9CNikgdmlkZW8gbW9kZS4KKyAqICogU0NVOTBbNTo0XT0xMDogMjQgYml0cyAoUjgvRzgvQjgpIHZpZGVvIG1vZGUuCisgKiAqIFNDVTkwWzU6NF09MTE6IDMwIGJpdHMgKFIxMC9HMTAvQjEwKSB2aWRlbyBtb2RlLgorICoKKyAqIFJlLXdyaXRpbmc6CisgKgorICogLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLQorICogIFQ1ICAgIEdQSU9MMSAgICBWUElERSAgICAgIChTQ1U5MFs1OjRdPTEgJiBTQ1U4NFsxN109MSkgICAgTkRDRDEgICAgICAgU0NVODRbMTddPTEgICAgIEdQSU9MMQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKFNDVTkwWzU6NF09MiAmIFNDVTg0WzE3XT0xKQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKFNDVTkwWzU6NF09MyAmIFNDVTg0WzE3XT0xKQorICogLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLQorICoKKyAqIEZvciByZWZlcmVuY2UgdGhlIFNDVTg0WzE3XSBiaXQgY29uZmlndXJlIHRoZSAiVUFSVDEgTkRDRDEgb3IgVmlkZW8gVlBJREUKKyAqIGZ1bmN0aW9uIHBpbiIsIHdoZXJlIHRoZSBzaWduYWwgaXRzZWxmIGlzIGRldGVybWluZWQgYnkgd2hldGhlciBTQ1U5NFs1OjRdCisgKiBpcyBkaXNhYmxlZCBvciBpbiBvbmUgb2YgdGhlIDE4LCAyNCBvciAzMGJpdCB2aWRlbyBtb2Rlcy4KKyAqCisgKiBPdGhlciB2aWRlby1pbnB1dC1yZWxhdGVkIHBpbnMgcmVxdWlyZSBhbiBleHBsaWNpdCBzdGF0ZSBpbiBTQ1U5MFs1OjRdLCBlLmcuCisgKiBXMSBhbmQgVTU6CisgKgorICogLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLQorICogIFcxICAgIEdQSU9MNiAgICBWUElCMCAgICAgICBTQ1U5MFs1OjRdPTMgJiBTQ1U4NFsyMl09MSAgICAgVFhEMSAgICAgICAgU0NVODRbMjJdPTEgICAgIEdQSU9MNgorICogIFU1ICAgIEdQSU9MNyAgICBWUElCMSAgICAgICBTQ1U5MFs1OjRdPTMgJiBTQ1U4NFsyM109MSAgICAgUlhEMSAgICAgICAgU0NVODRbMjNdPTEgICAgIEdQSU9MNworICogLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLQorICoKKyAqIFRoZSBleGFtcGxlcyBvZiBUNSBhbmQgVzEgYXJlIHBhcnRpY3VsYXJseSBmZXJ0aWxlLCBhcyB0aGV5IGFsc28gZGVtb25zdHJhdGUKKyAqIHRoYXQgZGVzcGl0ZSBvcGVyYXRpbmcgYXMgcGFydCBvZiB0aGUgdmlkZW8gaW5wdXQgYnVzIGVhY2ggc2lnbmFsIG5lZWRzIHRvCisgKiBiZSBlbmFibGVkIGluZGl2aWR1YWxseSB2aWEgaXQncyBvd24gU0NVODQgKGluIHRoZSBjYXNlcyBvZiBUNSBhbmQgVzEpCisgKiByZWdpc3RlciBiaXQuIFRoaXMgaXMgYSBsaXR0bGUgY3JhenkgaWYgdGhlIGJ1cyBkb2Vzbid0IGhhdmUgb3B0aW9uYWwKKyAqIHNpZ25hbHMsIGJ1dCBpcyB1c2VkIHRvIGRlY2VudCBlZmZlY3Qgd2l0aCBzb21lIG9mIHRoZSBVQVJUcyB3aGVyZSBub3QgYWxsCisgKiBzaWduYWxzIGFyZSByZXF1aXJlZC4gSG93ZXZlciwgdGhpcyBpc24ndCBkb25lIGNvbnNpc3RlbnRseSAtIFVBUlQxIGlzCisgKiBlbmFibGVkIG9uIGEgcGVyLXBpbiBiYXNpcywgYW5kIGJ5IGNvbnRyYXN0LCBhbGwgc2lnbmFscyBmb3IgVUFSVDYgYXJlCisgKiBlbmFibGVkIGJ5IGEgc2luZ2xlIGJpdC4KKyAqCisgKiBGdXJ0aGVyLCB0aGUgaGlnaCBhbmQgbG93IHByaW9yaXR5IHNpZ25hbHMgbGlzdGVkIGluIHRoZSB0YWJsZSBhYm92ZSBzaGFyZQorICogYSBjb25maWd1cmF0aW9uIGJpdC4gVGhlIFZQSSBzaWduYWxzIHNob3VsZCBvcGVyYXRlIGluIGNvbmNlcnQgaW4gYSBzaW5nbGUKKyAqIGZ1bmN0aW9uLCBidXQgdGhlIFVBUlQgc2lnbmFscyBzaG91bGQgcmV0YWluIHRoZSBhYmlsaXR5IHRvIGJlIGNvbmZpZ3VyZWQKKyAqIGluZGVwZW5kZW50bHkuIFRoaXMgcHVzaGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBkb3duIHRoZSBwYXRoIG9mIHRhZ2dpbmcgYQorICogc2lnbmFsJ3MgZXhwcmVzc2lvbnMgd2l0aCB0aGUgZnVuY3Rpb24gdGhleSBwYXJ0aWNpcGF0ZSBpbiwgcmF0aGVyIHRoYW4KKyAqIGRlZmluaW5nIG1hc2tzIGFmZmVjdGluZyBtdWx0aXBsZSBzaWduYWxzIHBlciBmdW5jdGlvbi4gVGhlIGxhdHRlciBhcHByb2FjaAorICogZmFpbHMgaW4gdGhpcyBpbnN0YW5jZSB3aGVyZSBhcHBseWluZyB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIFVBUlQgcGluIG9mCisgKiBpbnRlcmVzdCB3aWxsIHN0b21wIG9uIHRoZSBzdGF0ZSBvZiBvdGhlciBVQVJUIHNpZ25hbHMgd2hlbiBkaXNhYmxpbmcgdGhlCisgKiBWUEkgZnVuY3Rpb25zIG9uIHRoZSBjdXJyZW50IHBpbi4KKyAqCisgKiBCYWxsIHwgIERlZmF1bHQgICB8IFAwIFNpZ25hbCB8IFAwIEV4cHJlc3Npb24gICAgICAgICAgICAgfCBQMSBTaWduYWwgfCBQMSBFeHByZXNzaW9uIHwgT3RoZXIKKyAqIC0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLQorICogIEExMiAgIFJHTUlJMVRYQ0sgICBHUElPVDAgICAgICBTQ1VBMFswXT0xICAgICAgICAgICAgICAgICAgUk1JSTFUWEVOICAgU3RyYXBbNl09MCAgICAgIFJHTUlJMVRYQ0sKKyAqICBCMTIgICBSR01JSTFUWENUTCAgR1BJT1QxICAgICAgU0NVQTBbMV09MSAgICAgICAgICAgICAgICAgIOKAkyAgICAgICAgICAgU3RyYXBbNl09MCAgICAgIFJHTUlJMVRYQ1RMCisgKiAtLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0KKyAqCisgKiBBMTIgZGVtb25zdHJhdGVzIHRoYXQgdGhlICJPdGhlciIgc2lnbmFsIGlzbid0IGFsd2F5cyBHUElPIC0gaW4gdGhpcyBjYXNlCisgKiBHUElPVDAgaXMgYSBoaWdoLXByaW9yaXR5IHNpZ25hbCBhbmQgUkdNSUkxVFhDSyBpcyBPdGhlci4gVGh1cywgR1BJTworICogc2hvdWxkIGJlIHRyZWF0ZWQgbGlrZSBhbnkgb3RoZXIgc2lnbmFsIHR5cGUgd2l0aCBmdWxsIGZ1bmN0aW9uIGV4cHJlc3Npb24KKyAqIHJlcXVpcmVtZW50cywgYW5kIG5vdCBhc3N1bWVkIHRvIGJlIHRoZSBkZWZhdWx0IGNhc2UuIFNlcGFyYXRlbHksIEdQSU9UMCBhbmQKKyAqIEdQSU9UMSdzIHNpZ25hbCBkZXNjcmlwdG9yIGJpdHMgYXJlIGRpc3RpbmN0LCB0aGVyZWZvcmUgd2UgbXVzdCBpdGVyYXRlIGFsbAorICogcGlucyBpbiB0aGUgZnVuY3Rpb24ncyBncm91cCB0byBkaXNhYmxlIHRoZSBoaWdoZXItcHJpb3JpdHkgc2lnbmFscyBzdWNoCisgKiB0aGF0IHRoZSBzaWduYWwgZm9yIHRoZSBmdW5jdGlvbiBvZiBpbnRlcmVzdCBpcyBjb3JyZWN0bHkgZW5hYmxlZC4KKyAqCisgKiBGaW5hbGx5LCB0aHJlZSBwcmlvcml0eSBsZXZlbHMgYXJlbid0IGFsd2F5cyBlbm91Z2g7IHRoZSBBU1QyNTAwIGJyaW5ncyB3aXRoCisgKiBpdCAxOCBwaW5zIG9mIGZpdmUgcHJpb3JpdHkgbGV2ZWxzLCBob3dldmVyIHRoZSAxOCBwaW5zIG9ubHkgdXNlIHRocmVlIG9mCisgKiB0aGUgZml2ZSBwcmlvcml0eSBsZXZlbHMuCisgKgorICogVWx0aW1hdGVseSB0aGUgcmVxdWlyZW1lbnQgdG8gY29udHJvbCBwaW5zIGluIHRoZSBleGFtcGxlcyBhYm92ZSBkcml2ZSB0aGUKKyAqIGRlc2lnbjoKKyAqCisgKiAqIFBpbnMgcHJvdmlkZSBzaWduYWxzIGFjY29yZGluZyB0byBmdW5jdGlvbnMgYWN0aXZhdGVkIGluIHRoZSBtdXgKKyAqICAgY29uZmlndXJhdGlvbgorICoKKyAqICogUGlucyBwcm92aWRlIHVwIHRvIGZpdmUgc2lnbmFsIHR5cGVzIGluIGEgcHJpb3JpdHkgb3JkZXIKKyAqCisgKiAqIEZvciBwcmlvcml0aWVzIGxldmVscyBkZWZpbmVkIG9uIGEgcGluLCBlYWNoIHByaW9yaXR5IHByb3ZpZGVzIG9uZSBzaWduYWwKKyAqCisgKiAqIEVuYWJsaW5nIGxvd2VyIHByaW9yaXR5IHNpZ25hbHMgcmVxdWlyZXMgaGlnaGVyIHByaW9yaXR5IHNpZ25hbHMgYmUKKyAqICAgZGlzYWJsZWQKKyAqCisgKiAqIEEgZnVuY3Rpb24gcmVwcmVzZW50cyBhIHNldCBvZiBzaWduYWxzOyBmdW5jdGlvbnMgYXJlIGRpc3RpbmN0IGlmIHRoZWlyCisgKiAgIHNldHMgb2Ygc2lnbmFscyBhcmUgbm90IGVxdWFsCisgKgorICogKiBTaWduYWxzIHBhcnRpY2lwYXRlIGluIG9uZSBvciBtb3JlIGZ1bmN0aW9ucworICoKKyAqICogQSBmdW5jdGlvbiBpcyBkZXNjcmliZWQgYnkgYW4gZXhwcmVzc2lvbiBvZiBvbmUgb3IgbW9yZSBzaWduYWwKKyAqICAgZGVzY3JpcHRvcnMsIHdoaWNoIGNvbXBhcmUgYml0IHZhbHVlcyBpbiBhIHJlZ2lzdGVyCisgKgorICogKiBBIHNpZ25hbCBleHByZXNzaW9uIGlzIHRoZSBzbWFsbGVzdCBzZXQgb2Ygc2lnbmFsIGRlc2NyaXB0b3JzIHdob3NlCisgKiAgIGNvbXBhcmlzb25zIG11c3QgZXZhbHVhdGUgJ3RydWUnIGZvciBhIHNpZ25hbCB0byBiZSBlbmFibGVkIG9uIGEgcGluLgorICoKKyAqICogQSBmdW5jdGlvbidzIHNpZ25hbCBpcyBhY3RpdmUgb24gYSBwaW4gaWYgZXZhbHVhdGluZyBhbGwgc2lnbmFsCisgKiAgIGRlc2NyaXB0b3JzIGluIHRoZSBwaW4ncyBzaWduYWwgZXhwcmVzc2lvbiBmb3IgdGhlIGZ1bmN0aW9uIHlpZWxkcyBhICd0cnVlJworICogICByZXN1bHQKKyAqCisgKiAqIEEgc2lnbmFsIGF0IGEgZ2l2ZW4gcHJpb3JpdHkgb24gYSBnaXZlbiBwaW4gaXMgYWN0aXZlIGlmIGFueSBvZiB0aGUKKyAqICAgZnVuY3Rpb25zIGluIHdoaWNoIHRoZSBzaWduYWwgcGFydGljaXBhdGVzIGFyZSBhY3RpdmUsIGFuZCBubyBoaWdoZXIKKyAqICAgcHJpb3JpdHkgc2lnbmFsIG9uIHRoZSBwaW4gaXMgYWN0aXZlCisgKgorICogKiBHUElPIGlzIGNvbmZpZ3VyZWQgcGVyLXBpbgorICoKKyAqIEFuZCBzbzoKKyAqCisgKiAqIFRvIGRpc2FibGUgYSBzaWduYWwsIGFueSBmdW5jdGlvbihzKSBhY3RpdmF0aW5nIHRoZSBzaWduYWwgbXVzdCBiZQorICogICBkaXNhYmxlZAorICoKKyAqICogRWFjaCBwaW4gbXVzdCBrbm93IHRoZSBzaWduYWwgZXhwcmVzc2lvbnMgb2YgZnVuY3Rpb25zIGluIHdoaWNoIGl0CisgKiAgIHBhcnRpY2lwYXRlcywgZm9yIHRoZSBwdXJwb3NlIG9mIGVuYWJsaW5nIHRoZSBPdGhlciBmdW5jdGlvbi4gVGhpcyBpcyBkb25lCisgKiAgIGJ5IGRlYWN0aXZhdGluZyBhbGwgZnVuY3Rpb25zIHRoYXQgYWN0aXZhdGUgaGlnaGVyIHByaW9yaXR5IHNpZ25hbHMgb24gdGhlCisgKiAgIHBpbi4KKyAqCisgKiBBcyBhIGNvbmNyZXRlIGV4YW1wbGU6CisgKgorICogKiBUNSBwcm92aWRlcyB0aHJlZSBzaWduYWxzIHR5cGVzOiBWUElERSwgTkRDRDEgYW5kIEdQSU8KKyAqCisgKiAqIFRoZSBWUElERSBzaWduYWwgcGFydGljaXBhdGVzIGluIDMgZnVuY3Rpb25zOiBWUEkxOCwgVlBJMjQgYW5kIFZQSTMwCisgKgorICogKiBUaGUgTkRDRDEgc2lnbmFsIHBhcnRpY2lwYXRlcyBpbiBqdXN0IGl0cyBvd24gTkRDRDEgZnVuY3Rpb24KKyAqCisgKiAqIFZQSURFIGlzIGhpZ2ggcHJpb3JpdHksIE5EQ0QxIGlzIGxvdyBwcmlvcml0eSwgYW5kIEdQSU9MMSBpcyB0aGUgbGVhc3QKKyAqICAgcHJpb3JpdGlzZWQKKyAqCisgKiAqIFRoZSBwcmVyZXF1aXNpdCBmb3IgYWN0aXZhdGluZyB0aGUgTkRDRDEgc2lnbmFsIGlzIHRoYXQgdGhlIFZQSTE4LCBWUEkyNAorICogICBhbmQgVlBJMzAgZnVuY3Rpb25zIGFsbCBiZSBkaXNhYmxlZAorICoKKyAqICogU2ltaWxhcmx5LCBhbGwgb2YgVlBJMTgsIFZQSTI0LCBWUEkzMCBhbmQgTkRDRDEgZnVuY3Rpb25zIG11c3QgYmUgZGlzYWJsZWQKKyAqICAgdG8gcHJvdmlkZSBHUElPTDYKKyAqCisgKiBDb25zaWRlcmF0aW9ucworICogLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBJZiBwaW5jdHJsIGFsbG93cyB1cyB0byBhbGxvY2F0ZSBhIHBpbiB3ZSBjYW4gY29uZmlndXJlIGEgZnVuY3Rpb24gd2l0aG91dAorICogY29uY2VybiBmb3IgdGhlIGZ1bmN0aW9uIG9mIGFscmVhZHkgYWxsb2NhdGVkIHBpbnMsIGlmIHBpbiBncm91cHMgYXJlCisgKiBjcmVhdGVkIHdpdGggcmVzcGVjdCB0byB0aGUgU29DIGZ1bmN0aW9ucyBpbiB3aGljaCB0aGV5IHBhcnRpY2lwYXRlLiBUaGlzIGlzCisgKiBpbnR1aXRpdmUsIGJ1dCBpdCBkaWQgbm90IGZlZWwgb2J2aW91cyBmcm9tIHRoZSBiaXQvcGluIHJlbGF0aW9uc2hpcHMuCisgKgorICogQ29udmVyc2VseSwgZmFpbGluZyB0byBhbGxvY2F0ZSBhbGwgcGlucyBpbiBhIGdyb3VwIGluZGljYXRlcyBzb21lIGJpdHMgKGFzCisgKiB3ZWxsIGFzIHBpbnMpIHJlcXVpcmVkIGZvciB0aGUgZ3JvdXAncyBjb25maWd1cmF0aW9uIHdpbGwgYWxyZWFkeSBiZSBpbiB1c2UsCisgKiBsaWtlbHkgaW4gYSB3YXkgdGhhdCdzIGluY29uc2lzdGVudCB3aXRoIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIGZhaWxlZAorICogZ3JvdXAuCisgKi8KKworLyoKKyAqIFRoZSAiTXVsdGktZnVuY3Rpb24gUGlucyBNYXBwaW5nIGFuZCBDb250cm9sIiB0YWJsZSBpbiB0aGUgU29DIGRhdGFzaGVldAorICogcmVmZXJlbmNlcyByZWdpc3RlcnMgYnkgdGhlIGRldmljZS9vZmZzZXQgbW5lbW9uaWMuIFRoZSByZWdpc3RlciBtYWNyb3MKKyAqIGJlbG93IGFyZSBuYW1lZCB0aGUgc2FtZSB3YXkgdG8gZWFzZSB0cmFuc2NyaXB0aW9uIGFuZCB2ZXJpZmljYXRpb24gKGFzCisgKiBvcHBvc2VkIHRvIG5hbWluZyB0aGVtIGUuZy4gUElOTVVYX0NUUkxfWzAtOV0pLiBGdXJ0aGVyLCBzaWduYWwgZXhwcmVzc2lvbnMKKyAqIHJlZmVyZW5jZSByZWdpc3RlcnMgYmV5b25kIHRob3NlIGRlZGljYXRlZCB0byBwaW5tdXgsIHN1Y2ggYXMgdGhlIHN5c3RlbQorICogcmVzZXQgY29udHJvbCBhbmQgTUFDIGNsb2NrIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLiBUaGUgQVNUMjUwMCBnb2VzIGEgc3RlcAorICogZnVydGhlciBhbmQgcmVmZXJlbmNlcyByZWdpc3RlcnMgaW4gdGhlIGdyYXBoaWNzIElQIGJsb2NrLCBidXQgdGhhdCBpc24ndAorICogaGFuZGxlZCB5ZXQuCisgKi8KKyNkZWZpbmUgU0NVMkMgICAgICAgICAgIDB4MkMgLyogTWlzYy4gQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBTQ1UzQyAgICAgICAgICAgMHgzQyAvKiBTeXN0ZW0gUmVzZXQgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0NVNDggICAgICAgICAgIDB4NDggLyogTUFDIEludGVyZmFjZSBDbG9jayBEZWxheSBTZXR0aW5nICovCisjZGVmaW5lIEhXX1NUUkFQMSAgICAgICAweDcwIC8qIEFTVDI0MDAgc3RyYXBwaW5nIGlzIDMzIGJpdHMsIGlzIHNwbGl0ICovCisjZGVmaW5lIFNDVTgwICAgICAgICAgICAweDgwIC8qIE11bHRpLWZ1bmN0aW9uIFBpbiBDb250cm9sICMxICovCisjZGVmaW5lIFNDVTg0ICAgICAgICAgICAweDg0IC8qIE11bHRpLWZ1bmN0aW9uIFBpbiBDb250cm9sICMyICovCisjZGVmaW5lIFNDVTg4ICAgICAgICAgICAweDg4IC8qIE11bHRpLWZ1bmN0aW9uIFBpbiBDb250cm9sICMzICovCisjZGVmaW5lIFNDVThDICAgICAgICAgICAweDhDIC8qIE11bHRpLWZ1bmN0aW9uIFBpbiBDb250cm9sICM0ICovCisjZGVmaW5lIFNDVTkwICAgICAgICAgICAweDkwIC8qIE11bHRpLWZ1bmN0aW9uIFBpbiBDb250cm9sICM1ICovCisjZGVmaW5lIFNDVTk0ICAgICAgICAgICAweDk0IC8qIE11bHRpLWZ1bmN0aW9uIFBpbiBDb250cm9sICM2ICovCisjZGVmaW5lIFNDVUEwICAgICAgICAgICAweEEwIC8qIE11bHRpLWZ1bmN0aW9uIFBpbiBDb250cm9sICM3ICovCisjZGVmaW5lIFNDVUE0ICAgICAgICAgICAweEE0IC8qIE11bHRpLWZ1bmN0aW9uIFBpbiBDb250cm9sICM4ICovCisjZGVmaW5lIFNDVUE4ICAgICAgICAgICAweEE4IC8qIE11bHRpLWZ1bmN0aW9uIFBpbiBDb250cm9sICM5ICovCisjZGVmaW5lIEhXX1NUUkFQMiAgICAgICAweEQwIC8qIFN0cmFwcGluZyAqLworCisgLyoqCisgICogQSBzaWduYWwgZGVzY3JpcHRvciwgd2hpY2ggZGVzY3JpYmVzIHRoZSByZWdpc3RlciwgYml0cyBhbmQgdGhlCisgICogZW5hYmxlL2Rpc2FibGUgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIGNvbXBhcmVkIG9yIHdyaXR0ZW4uCisgICoKKyAgKiBAcmVnOiBUaGUgcmVnaXN0ZXIgb2Zmc2V0IGZyb20gYmFzZSBpbiBieXRlcworICAqIEBtYXNrOiBUaGUgbWFzayB0byBhcHBseSB0byB0aGUgcmVnaXN0ZXIuIFRoZSBsb3dlc3Qgc2V0IGJpdCBvZiB0aGUgbWFzayBpcworICAqICAgICAgICB1c2VkIHRvIGRlcml2ZSB0aGUgc2hpZnQgdmFsdWUuCisgICogQGVuYWJsZTogVGhlIHZhbHVlIHRoYXQgZW5hYmxlcyB0aGUgZnVuY3Rpb24uIFZhbHVlIHNob3VsZCBiZSBpbiB0aGUgTFNCcywKKyAgKiAgICAgICAgICBub3QgYXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBtYXNrLgorICAqIEBkaXNhYmxlOiBUaGUgdmFsdWUgdGhhdCBkaXNhYmxlcyB0aGUgZnVuY3Rpb24uIFZhbHVlIHNob3VsZCBiZSBpbiB0aGUKKyAgKiAgICAgICAgICAgTFNCcywgbm90IGF0IHRoZSBwb3NpdGlvbiBvZiB0aGUgbWFzay4KKyAgKi8KK3N0cnVjdCBhc3BlZWRfc2lnX2Rlc2MgeworCXVuc2lnbmVkIGludCByZWc7CisJdTMyIG1hc2s7CisJdTMyIGVuYWJsZTsKKwl1MzIgZGlzYWJsZTsKK307CisKKy8qKgorICogRGVzY3JpYmVzIGEgc2lnbmFsIGV4cHJlc3Npb24uIFRoZSBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBieSBBTkRpbmcgdGhlCisgKiBldmFsdWF0aW9uIG9mIHRoZSBkZXNjcmlwdG9ycy4KKyAqCisgKiBAc2lnbmFsOiBUaGUgc2lnbmFsIG5hbWUgZm9yIHRoZSBwcmlvcml0eSBsZXZlbCBvbiB0aGUgcGluLiBJZiB0aGUgc2lnbmFsCisgKiAgICAgICAgICB0eXBlIGlzIEdQSU8sIHRoZW4gdGhlIHNpZ25hbCBuYW1lIG11c3QgYmVnaW4gd2l0aCB0aGUgc3RyaW5nCisgKiAgICAgICAgICAiR1BJTyIsIGUuZy4gR1BJT0EwLCBHUElPVDQgZXRjLgorICogQGZ1bmN0aW9uOiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdGhlIHNpZ25hbCBwYXJ0aWNpcGF0ZXMgaW4gZm9yIHRoZQorICogICAgICAgICAgICBhc3NvY2lhdGVkIGV4cHJlc3Npb24KKyAqIEBuZGVzY3M6IFRoZSBudW1iZXIgb2Ygc2lnbmFsIGRlc2NyaXB0b3JzIGluIHRoZSBleHByZXNzaW9uCisgKiBAZGVzY3M6IFBvaW50ZXIgdG8gYW4gYXJyYXkgb2Ygc2lnbmFsIGRlc2NyaXB0b3JzIHRoYXQgY29tcHJpc2UgdGhlCisgKiAgICAgICAgIGZ1bmN0aW9uIGV4cHJlc3Npb24KKyAqLworc3RydWN0IGFzcGVlZF9zaWdfZXhwciB7CisJY29uc3QgY2hhciAqc2lnbmFsOworCWNvbnN0IGNoYXIgKmZ1bmN0aW9uOworCWludCBuZGVzY3M7CisJY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZGVzYyAqZGVzY3M7Cit9OworCisvKioKKyAqIEEgc3RydWN0IGNhcHR1cmluZyB0aGUgbGlzdCBvZiBleHByZXNzaW9ucyBlbmFibGluZyBzaWduYWxzIGF0IGVhY2ggcHJpb3JpdHkKKyAqIGZvciBhIGdpdmVuIHBpbi4gVGhlIHNpZ25hbCBjb25maWd1cmF0aW9uIGZvciBhIHByaW9yaXR5IGxldmVsIGlzIGV2YWx1YXRlZAorICogYnkgT1JpbmcgdGhlIGV2YWx1YXRpb24gb2YgdGhlIHNpZ25hbCBleHByZXNzaW9ucyBpbiB0aGUgcmVzcGVjdGl2ZQorICogcHJpb3JpdHkncyBsaXN0LgorICoKKyAqIEBuYW1lOiBBIG5hbWUgZm9yIHRoZSBwaW4KKyAqIEBwcmlvczogQSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGV4cHJlc3Npb24gbGlzdCBwb2ludGVycworICoKKyAqLworc3RydWN0IGFzcGVlZF9waW5fZGVzYyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBzdHJ1Y3QgYXNwZWVkX3NpZ19leHByICoqKnByaW9zOworfTsKKworLyogTWFjcm8gaGVsbCAqLworCisvKioKKyAqIFNob3J0LWhhbmQgbWFjcm8gZm9yIGRlc2NyaWJpbmcgYSBjb25maWd1cmF0aW9uIGVuYWJsZWQgYnkgdGhlIHN0YXRlIG9mIG9uZQorICogYml0LiBUaGUgZGlzYWJsZSB2YWx1ZSBpcyBkZXJpdmVkLgorICoKKyAqIEByZWc6IFRoZSBzaWduYWwncyBhc3NvY2lhdGVkIHJlZ2lzdGVyLCBvZmZzZXQgZnJvbSBiYXNlCisgKiBAaWR4OiBUaGUgc2lnbmFsJ3MgYml0IGluZGV4IGluIHRoZSByZWdpc3RlcgorICogQHZhbDogVGhlIHZhbHVlICgwIG9yIDEpIHRoYXQgZW5hYmxlcyB0aGUgZnVuY3Rpb24KKyAqLworI2RlZmluZSBTSUdfREVTQ19CSVQocmVnLCBpZHgsIHZhbCkgXAorCXsgcmVnLCBCSVRfTUFTSyhpZHgpLCB2YWwsICgoKHZhbCkgKyAxKSAmIDEpIH0KKworLyoqCisgKiBBIGZ1cnRoZXIgc2hvcnQtaGFuZCBtYWNybyBkZXNjcmliaW5nIGEgY29uZmlndXJhdGlvbiBlbmFibGVkIHdpdGggYSBzZXQgYml0LgorICoKKyAqIEByZWc6IFRoZSBjb25maWd1cmF0aW9uJ3MgYXNzb2NpYXRlZCByZWdpc3Rlciwgb2Zmc2V0IGZyb20gYmFzZQorICogQGlkeDogVGhlIGNvbmZpZ3VyYXRpb24ncyBiaXQgaW5kZXggaW4gdGhlIHJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgU0lHX0RFU0NfU0VUKHJlZywgaWR4KSBTSUdfREVTQ19CSVQocmVnLCBpZHgsIDEpCisKKyNkZWZpbmUgU0lHX0RFU0NfTElTVF9TWU0oc2lnLCBmdW5jKSBzaWdfZGVzY3NfICMjIHNpZyAjIyBfICMjIGZ1bmMKKyNkZWZpbmUgU0lHX0RFU0NfTElTVF9ERUNMKHNpZywgZnVuYywgLi4uKSBcCisJc3RhdGljIGNvbnN0IHN0cnVjdCBhc3BlZWRfc2lnX2Rlc2MgU0lHX0RFU0NfTElTVF9TWU0oc2lnLCBmdW5jKVtdID0gXAorCQl7IF9fVkFfQVJHU19fIH0KKworI2RlZmluZSBTSUdfRVhQUl9TWU0oc2lnLCBmdW5jKSBzaWdfZXhwcl8gIyMgc2lnICMjIF8gIyMgZnVuYworI2RlZmluZSBTSUdfRVhQUl9ERUNMXyhzaWcsIGZ1bmMpIFwKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZXhwciBTSUdfRVhQUl9TWU0oc2lnLCBmdW5jKSA9IFwKKwl7IFwKKwkJLnNpZ25hbCA9ICNzaWcsIFwKKwkJLmZ1bmN0aW9uID0gI2Z1bmMsIFwKKwkJLm5kZXNjcyA9IEFSUkFZX1NJWkUoU0lHX0RFU0NfTElTVF9TWU0oc2lnLCBmdW5jKSksIFwKKwkJLmRlc2NzID0gJihTSUdfREVTQ19MSVNUX1NZTShzaWcsIGZ1bmMpKVswXSwgXAorCX0KKworLyoqCisgKiBEZWNsYXJlIGEgc2lnbmFsIGV4cHJlc3Npb24uCisgKgorICogQHNpZzogQSBtYWNybyBzeW1ib2wgbmFtZSBmb3IgdGhlIHNpZ25hbCAoaXMgc3ViamVjdGVkIHRvIHN0cmluZ2lmaWNhdGlvbgorICogICAgICAgIGFuZCB0b2tlbiBwYXN0aW5nKQorICogQGZ1bmM6IFRoZSBmdW5jdGlvbiBpbiB3aGljaCB0aGUgc2lnbmFsIGlzIHBhcnRpY2lwYXRpbmcKKyAqIEAuLi46IFNpZ25hbCBkZXNjcmlwdG9ycyB0aGF0IGRlZmluZSB0aGUgc2lnbmFsIGV4cHJlc3Npb24KKyAqCisgKiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBkZWNsYXJlcyB0aGUgUk9NRDggc2lnbmFsIGZvciB0aGUgUk9NMTYgZnVuY3Rpb246CisgKgorICogICAgIFNJR19FWFBSX0RFQ0woUk9NRDgsIFJPTTE2LCBTSUdfREVTQ19TRVQoU0NVOTAsIDYpKTsKKyAqCisgKiBBbmQgd2l0aCBtdWx0aXBsZSBzaWduYWwgZGVzY3JpcHRvcnM6CisgKgorICogICAgIFNJR19FWFBSX0RFQ0woUk9NRDgsIFJPTTE2UywgU0lHX0RFU0NfU0VUKEhXX1NUUkFQMSwgNCksCisgKiAgICAgICAgICAgICAgeyBIV19TVFJBUDEsIEdFTk1BU0soMSwgMCksIDAsIDAgfSk7CisgKi8KKyNkZWZpbmUgU0lHX0VYUFJfREVDTChzaWcsIGZ1bmMsIC4uLikgXAorCVNJR19ERVNDX0xJU1RfREVDTChzaWcsIGZ1bmMsIF9fVkFfQVJHU19fKTsgXAorCVNJR19FWFBSX0RFQ0xfKHNpZywgZnVuYykKKworLyoqCisgKiBEZWNsYXJlIGEgcG9pbnRlciB0byBhIHNpZ25hbCBleHByZXNzaW9uCisgKgorICogQHNpZzogVGhlIG1hY3JvIHN5bWJvbCBuYW1lIGZvciB0aGUgc2lnbmFsIChzdWJqZWN0ZWQgdG8gdG9rZW4gcGFzdGluZykKKyAqIEBmdW5jOiBUaGUgbWFjcm8gc3ltYm9sIG5hbWUgZm9yIHRoZSBmdW5jdGlvbiAoc3ViamVjdGVkIHRvIHRva2VuIHBhc3RpbmcpCisgKi8KKyNkZWZpbmUgU0lHX0VYUFJfUFRSKHNpZywgZnVuYykgKCZTSUdfRVhQUl9TWU0oc2lnLCBmdW5jKSkKKworI2RlZmluZSBTSUdfRVhQUl9MSVNUX1NZTShzaWcpIHNpZ19leHByc18gIyMgc2lnCisKKy8qKgorICogRGVjbGFyZSBhIHNpZ25hbCBleHByZXNzaW9uIGxpc3QgZm9yIHJlZmVyZW5jZSBpbiBhIHN0cnVjdCBhc3BlZWRfcGluX3ByaW8uCisgKgorICogQHNpZzogQSBtYWNybyBzeW1ib2wgbmFtZSBmb3IgdGhlIHNpZ25hbCAoaXMgc3ViamVjdGVkIHRvIHRva2VuIHBhc3RpbmcpCisgKiBALi4uOiBTaWduYWwgZXhwcmVzc2lvbiBzdHJ1Y3R1cmUgcG9pbnRlcnMgKHVzZSBTSUdfRVhQUl9QVFIoKSkKKyAqCisgKiBGb3IgZXhhbXBsZSwgdGhlIDE2LWJpdCBST00gYnVzIGNhbiBiZSBlbmFibGVkIGJ5IG9uZSBvZiB0d28gcG9zc2libGUgc2lnbmFsCisgKiBleHByZXNzaW9uczoKKyAqCisgKiAgICAgU0lHX0VYUFJfREVDTChST01EOCwgUk9NMTYsIFNJR19ERVNDX1NFVChTQ1U5MCwgNikpOworICogICAgIFNJR19FWFBSX0RFQ0woUk9NRDgsIFJPTTE2UywgU0lHX0RFU0NfU0VUKEhXX1NUUkFQMSwgNCksCisgKiAgICAgICAgICAgICAgeyBIV19TVFJBUDEsIEdFTk1BU0soMSwgMCksIDAsIDAgfSk7CisgKiAgICAgU0lHX0VYUFJfTElTVF9ERUNMKFJPTUQ4LCBTSUdfRVhQUl9QVFIoUk9NRDgsIFJPTTE2KSwKKyAqICAgICAgICAgICAgICBTSUdfRVhQUl9QVFIoUk9NRDgsIFJPTTE2UykpOworICovCisjZGVmaW5lIFNJR19FWFBSX0xJU1RfREVDTChzaWcsIC4uLikgXAorCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXNwZWVkX3NpZ19leHByICpTSUdfRVhQUl9MSVNUX1NZTShzaWcpW10gPSBcCisJCXsgX19WQV9BUkdTX18sIE5VTEwgfQorCisvKioKKyAqIEEgc2hvcnQtaGFuZCBtYWNybyBmb3IgZGVjbGFyaW5nIGEgZnVuY3Rpb24gZXhwcmVzc2lvbiBhbmQgYW4gZXhwcmVzc2lvbgorICogbGlzdCB3aXRoIGEgc2luZ2xlIGZ1bmN0aW9uLgorICoKKyAqIEBmdW5jOiBBIG1hY3JvIHN5bWJvbCBuYW1lIGZvciB0aGUgZnVuY3Rpb24gKGlzIHN1YmplY3RlZCB0byB0b2tlbiBwYXN0aW5nKQorICogQC4uLjogRnVuY3Rpb24gZGVzY3JpcHRvcnMgdGhhdCBkZWZpbmUgdGhlIGZ1bmN0aW9uIGV4cHJlc3Npb24KKyAqCisgKiBGb3IgZXhhbXBsZSwgc2lnbmFsIE5DVFM2IHBhcnRpY2lwYXRlcyBpbiBpdHMgb3duIGZ1bmN0aW9uIHdpdGggb25lIGdyb3VwOgorICoKKyAqICAgICBTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE5DVFM2LCBOQ1RTNiwgU0lHX0RFU0NfU0VUKFNDVTkwLCA3KSk7CisgKi8KKyNkZWZpbmUgU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShzaWcsIGZ1bmMsIC4uLikgXAorCVNJR19ERVNDX0xJU1RfREVDTChzaWcsIGZ1bmMsIF9fVkFfQVJHU19fKTsgXAorCVNJR19FWFBSX0RFQ0xfKHNpZywgZnVuYyk7IFwKKwlTSUdfRVhQUl9MSVNUX0RFQ0woc2lnLCBTSUdfRVhQUl9QVFIoc2lnLCBmdW5jKSkKKworI2RlZmluZSBTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChzaWcsIGYwLCBmMSkgXAorCVNJR19FWFBSX0xJU1RfREVDTChzaWcsIFNJR19FWFBSX1BUUihzaWcsIGYwKSwgU0lHX0VYUFJfUFRSKHNpZywgZjEpKQorCisjZGVmaW5lIFNJR19FWFBSX0xJU1RfUFRSKHNpZykgKCZTSUdfRVhQUl9MSVNUX1NZTShzaWcpWzBdKQorCisjZGVmaW5lIFBJTl9FWFBSU19TWU0ocGluKSBwaW5fZXhwcnNfICMjIHBpbgorI2RlZmluZSBQSU5fRVhQUlNfUFRSKHBpbikgKCZQSU5fRVhQUlNfU1lNKHBpbilbMF0pCisjZGVmaW5lIFBJTl9TWU0ocGluKSBwaW5fICMjIHBpbgorCisjZGVmaW5lIE1TX1BJTl9ERUNMXyhwaW4sIC4uLikgXAorCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXNwZWVkX3NpZ19leHByICoqUElOX0VYUFJTX1NZTShwaW4pW10gPSBcCisJCXsgX19WQV9BUkdTX18sIE5VTEwgfTsgXAorCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXNwZWVkX3Bpbl9kZXNjIFBJTl9TWU0ocGluKSA9IFwKKwkJeyAjcGluLCBQSU5fRVhQUlNfUFRSKHBpbikgfQorCisvKioKKyAqIERlY2xhcmUgYSBtdWx0aS1zaWduYWwgcGluCisgKgorICogQHBpbjogVGhlIHBpbiBudW1iZXIKKyAqIEBvdGhlcjogTWFjcm8gbmFtZSBmb3IgIm90aGVyIiBmdW5jdGlvbmFsaXR5IChzdWJqZWN0ZWQgdG8gc3RyaW5naWZpY2F0aW9uKQorICogQGhpZ2g6IE1hY3JvIG5hbWUgZm9yIHRoZSBoaWdoZXN0IHByaW9yaXR5IHNpZ25hbCBmdW5jdGlvbnMKKyAqIEBsb3c6IE1hY3JvIG5hbWUgZm9yIHRoZSBsb3cgc2lnbmFsIGZ1bmN0aW9ucworICoKKyAqIEZvciBleGFtcGxlOgorICoKKyAqICAgICAjZGVmaW5lIEE4IDU2CisgKiAgICAgU0lHX0VYUFJfREVDTChST01EOCwgUk9NMTYsIFNJR19ERVNDX1NFVChTQ1U5MCwgNikpOworICogICAgIFNJR19FWFBSX0RFQ0woUk9NRDgsIFJPTTE2UywgU0lHX0RFU0NfU0VUKEhXX1NUUkFQMSwgNCksCisgKiAgICAgICAgICAgICAgeyBIV19TVFJBUDEsIEdFTk1BU0soMSwgMCksIDAsIDAgfSk7CisgKiAgICAgU0lHX0VYUFJfTElTVF9ERUNMKFJPTUQ4LCBTSUdfRVhQUl9QVFIoUk9NRDgsIFJPTTE2KSwKKyAqICAgICAgICAgICAgICBTSUdfRVhQUl9QVFIoUk9NRDgsIFJPTTE2UykpOworICogICAgIFNJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTkNUUzYsIE5DVFM2LCBTSUdfREVTQ19TRVQoU0NVOTAsIDcpKTsKKyAqICAgICBNU19QSU5fREVDTChBOCwgR1BJT0gwLCBST01EOCwgTkNUUzYpOworICovCisjZGVmaW5lIE1TX1BJTl9ERUNMKHBpbiwgb3RoZXIsIGhpZ2gsIGxvdykgXAorCVNJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUob3RoZXIsIG90aGVyKTsgXAorCU1TX1BJTl9ERUNMXyhwaW4sIFwKKwkJCVNJR19FWFBSX0xJU1RfUFRSKGhpZ2gpLCBcCisJCQlTSUdfRVhQUl9MSVNUX1BUUihsb3cpLCBcCisJCQlTSUdfRVhQUl9MSVNUX1BUUihvdGhlcikpCisKKyNkZWZpbmUgUElOX0dST1VQX1NZTShmdW5jKSBwaW5zXyAjIyBmdW5jCisjZGVmaW5lIEZVTkNfR1JPVVBfU1lNKGZ1bmMpIGdyb3Vwc18gIyMgZnVuYworI2RlZmluZSBGVU5DX0dST1VQX0RFQ0woZnVuYywgLi4uKSBcCisJc3RhdGljIGNvbnN0IGludCBQSU5fR1JPVVBfU1lNKGZ1bmMpW10gPSB7IF9fVkFfQVJHU19fIH07IFwKKwlzdGF0aWMgY29uc3QgY2hhciAqRlVOQ19HUk9VUF9TWU0oZnVuYylbXSA9IHsgI2Z1bmMgfQorCisvKioKKyAqIERlY2xhcmUgYSBzaW5nbGUgc2lnbmFsIHBpbgorICoKKyAqIEBwaW46IFRoZSBwaW4gbnVtYmVyCisgKiBAb3RoZXI6IE1hY3JvIG5hbWUgZm9yICJvdGhlciIgZnVuY3Rpb25hbGl0eSAoc3ViamVjdGVkIHRvIHN0cmluZ2lmaWNhdGlvbikKKyAqIEBzaWc6IE1hY3JvIG5hbWUgZm9yIHRoZSBzaWduYWwgKHN1YmplY3RlZCB0byBzdHJpbmdpZmljYXRpb24pCisgKgorICogRm9yIGV4YW1wbGU6CisgKgorICogICAgICNkZWZpbmUgRTMgODAKKyAqICAgICBTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNDTDUsIEkyQzUsIEkyQzVfREVTQyk7CisgKiAgICAgU1NfUElOX0RFQ0woRTMsIEdQSU9LMCwgU0NMNSk7CisgKi8KKyNkZWZpbmUgU1NfUElOX0RFQ0wocGluLCBvdGhlciwgc2lnKSBcCisJU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShvdGhlciwgb3RoZXIpOyBcCisJTVNfUElOX0RFQ0xfKHBpbiwgU0lHX0VYUFJfTElTVF9QVFIoc2lnKSwgU0lHX0VYUFJfTElTVF9QVFIob3RoZXIpKQorCisvKioKKyAqIFNpbmdsZSBzaWduYWwsIHNpbmdsZSBmdW5jdGlvbiBwaW4gZGVjbGFyYXRpb24KKyAqCisgKiBAcGluOiBUaGUgcGluIG51bWJlcgorICogQG90aGVyOiBNYWNybyBuYW1lIGZvciAib3RoZXIiIGZ1bmN0aW9uYWxpdHkgKHN1YmplY3RlZCB0byBzdHJpbmdpZmljYXRpb24pCisgKiBAc2lnOiBNYWNybyBuYW1lIGZvciB0aGUgc2lnbmFsIChzdWJqZWN0ZWQgdG8gc3RyaW5naWZpY2F0aW9uKQorICogQC4uLjogU2lnbmFsIGRlc2NyaXB0b3JzIHRoYXQgZGVmaW5lIHRoZSBmdW5jdGlvbiBleHByZXNzaW9uCisgKgorICogRm9yIGV4YW1wbGU6CisgKgorICogICAgU1NTRl9QSU5fREVDTChBNCwgR1BJT0EyLCBUSU1FUjMsIFNJR19ERVNDX1NFVChTQ1U4MCwgMikpOworICovCisjZGVmaW5lIFNTU0ZfUElOX0RFQ0wocGluLCBvdGhlciwgc2lnLCAuLi4pIFwKKwlTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKHNpZywgc2lnLCBfX1ZBX0FSR1NfXyk7IFwKKwlTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKG90aGVyLCBvdGhlcik7IFwKKwlNU19QSU5fREVDTF8ocGluLCBTSUdfRVhQUl9MSVNUX1BUUihzaWcpLCBTSUdfRVhQUl9MSVNUX1BUUihvdGhlcikpOyBcCisJRlVOQ19HUk9VUF9ERUNMKHNpZywgcGluKQorCisjZGVmaW5lIEdQSU9fUElOX0RFQ0wocGluLCBncGlvKSBcCisJU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShncGlvLCBncGlvKTsgXAorCU1TX1BJTl9ERUNMXyhwaW4sIFNJR19FWFBSX0xJU1RfUFRSKGdwaW8pKQorCitzdHJ1Y3QgYXNwZWVkX3BpbmN0cmxfZGF0YSB7CisJc3RydWN0IHJlZ21hcCAqbWFwOworCisJY29uc3Qgc3RydWN0IHBpbmN0cmxfcGluX2Rlc2MgKnBpbnM7CisJY29uc3QgdW5zaWduZWQgaW50IG5waW5zOworCisJY29uc3Qgc3RydWN0IGFzcGVlZF9waW5fZ3JvdXAgKmdyb3VwczsKKwljb25zdCB1bnNpZ25lZCBpbnQgbmdyb3VwczsKKworCWNvbnN0IHN0cnVjdCBhc3BlZWRfcGluX2Z1bmN0aW9uICpmdW5jdGlvbnM7CisJY29uc3QgdW5zaWduZWQgaW50IG5mdW5jdGlvbnM7Cit9OworCisjZGVmaW5lIEFTUEVFRF9QSU5DVFJMX1BJTihuYW1lXykgXAorCVtuYW1lX10gPSB7IFwKKwkJLm51bWJlciA9IG5hbWVfLCBcCisJCS5uYW1lID0gI25hbWVfLCBcCisJCS5kcnZfZGF0YSA9ICh2b2lkICopICYoUElOX1NZTShuYW1lXykpIFwKKwl9CisKK3N0cnVjdCBhc3BlZWRfcGluX2dyb3VwIHsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IHVuc2lnbmVkIGludCAqcGluczsKKwljb25zdCB1bnNpZ25lZCBpbnQgbnBpbnM7Cit9OworCisjZGVmaW5lIEFTUEVFRF9QSU5DVFJMX0dST1VQKG5hbWVfKSB7IFwKKwkubmFtZSA9ICNuYW1lXywgXAorCS5waW5zID0gJihQSU5fR1JPVVBfU1lNKG5hbWVfKSlbMF0sIFwKKwkubnBpbnMgPSBBUlJBWV9TSVpFKFBJTl9HUk9VUF9TWU0obmFtZV8pKSwgXAorfQorCitzdHJ1Y3QgYXNwZWVkX3Bpbl9mdW5jdGlvbiB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpjb25zdCAqZ3JvdXBzOworCXVuc2lnbmVkIGludCBuZ3JvdXBzOworfTsKKworI2RlZmluZSBBU1BFRURfUElOQ1RSTF9GVU5DKG5hbWVfLCAuLi4pIHsgXAorCS5uYW1lID0gI25hbWVfLCBcCisJLmdyb3VwcyA9ICZGVU5DX0dST1VQX1NZTShuYW1lXylbMF0sIFwKKwkubmdyb3VwcyA9IEFSUkFZX1NJWkUoRlVOQ19HUk9VUF9TWU0obmFtZV8pKSwgXAorfQorCitpbnQgYXNwZWVkX3BpbmN0cmxfZ2V0X2dyb3Vwc19jb3VudChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYpOworY29uc3QgY2hhciAqYXNwZWVkX3BpbmN0cmxfZ2V0X2dyb3VwX25hbWUoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAorCQl1bnNpZ25lZCBpbnQgZ3JvdXApOworaW50IGFzcGVlZF9waW5jdHJsX2dldF9ncm91cF9waW5zKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJdW5zaWduZWQgaW50IGdyb3VwLCBjb25zdCB1bnNpZ25lZCBpbnQgKipwaW5zLAorCQl1bnNpZ25lZCBpbnQgKm5waW5zKTsKK3ZvaWQgYXNwZWVkX3BpbmN0cmxfcGluX2RiZ19zaG93KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJc3RydWN0IHNlcV9maWxlICpzLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KTsKK2ludCBhc3BlZWRfcGlubXV4X2dldF9mbl9jb3VudChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYpOworY29uc3QgY2hhciAqYXNwZWVkX3Bpbm11eF9nZXRfZm5fbmFtZShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCXVuc2lnbmVkIGludCBmdW5jdGlvbik7CitpbnQgYXNwZWVkX3Bpbm11eF9nZXRfZm5fZ3JvdXBzKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJdW5zaWduZWQgaW50IGZ1bmN0aW9uLCBjb25zdCBjaGFyICogY29uc3QgKipncm91cHMsCisJCXVuc2lnbmVkIGludCAqIGNvbnN0IG51bV9ncm91cHMpOworaW50IGFzcGVlZF9waW5tdXhfc2V0X211eChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsIHVuc2lnbmVkIGludCBmdW5jdGlvbiwKKwkJdW5zaWduZWQgaW50IGdyb3VwKTsKK2ludCBhc3BlZWRfZ3Bpb19yZXF1ZXN0X2VuYWJsZShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCXN0cnVjdCBwaW5jdHJsX2dwaW9fcmFuZ2UgKnJhbmdlLAorCQl1bnNpZ25lZCBpbnQgb2Zmc2V0KTsKK2ludCBhc3BlZWRfcGluY3RybF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQlzdHJ1Y3QgcGluY3RybF9kZXNjICpwZGVzYywKKwkJc3RydWN0IGFzcGVlZF9waW5jdHJsX2RhdGEgKnBkYXRhKTsKKworI2VuZGlmIC8qIFBJTkNUUkxfQVNQRUVEICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvYmNtL3BpbmN0cmwtYmNtMjgxeHguYyBiL2RyaXZlcnMvcGluY3RybC9iY20vcGluY3RybC1iY20yODF4eC5jCmluZGV4IDU4MmY2ZGYuLmE1MzMxZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9iY20vcGluY3RybC1iY20yODF4eC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9iY20vcGluY3RybC1iY20yODF4eC5jCkBAIC0xMDE4LDcgKzEwMTgsNyBAQAogCXNlcV9wcmludGYocywgIiAlcyIsIGRldl9uYW1lKHBjdGxkZXYtPmRldikpOwogfQogCi1zdGF0aWMgc3RydWN0IHBpbmN0cmxfb3BzIGJjbTI4MXh4X3BpbmN0cmxfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwaW5jdHJsX29wcyBiY20yODF4eF9waW5jdHJsX29wcyA9IHsKIAkuZ2V0X2dyb3Vwc19jb3VudCA9IGJjbTI4MXh4X3BpbmN0cmxfZ2V0X2dyb3Vwc19jb3VudCwKIAkuZ2V0X2dyb3VwX25hbWUgPSBiY20yODF4eF9waW5jdHJsX2dldF9ncm91cF9uYW1lLAogCS5nZXRfZ3JvdXBfcGlucyA9IGJjbTI4MXh4X3BpbmN0cmxfZ2V0X2dyb3VwX3BpbnMsCkBAIC0xMDgwLDcgKzEwODAsNyBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIHN0cnVjdCBwaW5tdXhfb3BzIGJjbTI4MXh4X3BpbmN0cmxfcGlubXV4X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGlubXV4X29wcyBiY20yODF4eF9waW5jdHJsX3Bpbm11eF9vcHMgPSB7CiAJLmdldF9mdW5jdGlvbnNfY291bnQgPSBiY20yODF4eF9waW5jdHJsX2dldF9mY25zX2NvdW50LAogCS5nZXRfZnVuY3Rpb25fbmFtZSA9IGJjbTI4MXh4X3BpbmN0cmxfZ2V0X2Zjbl9uYW1lLAogCS5nZXRfZnVuY3Rpb25fZ3JvdXBzID0gYmNtMjgxeHhfcGluY3RybF9nZXRfZmNuX2dyb3VwcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9iY20vcGluY3RybC1uczItbXV4LmMgYi9kcml2ZXJzL3BpbmN0cmwvYmNtL3BpbmN0cmwtbnMyLW11eC5jCmluZGV4IGNhODE3ODkuLjEzYTRjMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9iY20vcGluY3RybC1uczItbXV4LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL2JjbS9waW5jdHJsLW5zMi1tdXguYwpAQCAtNTMxLDcgKzUzMSw3IEBACiAJc2VxX3ByaW50ZihzLCAiICVzIiwgZGV2X25hbWUocGN0cmxfZGV2LT5kZXYpKTsKIH0KIAotc3RhdGljIHN0cnVjdCBwaW5jdHJsX29wcyBuczJfcGluY3RybF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBpbmN0cmxfb3BzIG5zMl9waW5jdHJsX29wcyA9IHsKIAkuZ2V0X2dyb3Vwc19jb3VudCA9IG5zMl9nZXRfZ3JvdXBzX2NvdW50LAogCS5nZXRfZ3JvdXBfbmFtZSA9IG5zMl9nZXRfZ3JvdXBfbmFtZSwKIAkuZ2V0X2dyb3VwX3BpbnMgPSBuczJfZ2V0X2dyb3VwX3BpbnMsCkBAIC05NTksNyArOTU5LDcgQEAKIG91dDoKIAlyZXR1cm4gcmV0OwogfQotc3RhdGljIHN0cnVjdCBwaW5tdXhfb3BzIG5zMl9waW5tdXhfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwaW5tdXhfb3BzIG5zMl9waW5tdXhfb3BzID0gewogCS5nZXRfZnVuY3Rpb25zX2NvdW50ID0gbnMyX2dldF9mdW5jdGlvbnNfY291bnQsCiAJLmdldF9mdW5jdGlvbl9uYW1lID0gbnMyX2dldF9mdW5jdGlvbl9uYW1lLAogCS5nZXRfZnVuY3Rpb25fZ3JvdXBzID0gbnMyX2dldF9mdW5jdGlvbl9ncm91cHMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvYmNtL3BpbmN0cmwtbnNwLW11eC5jIGIvZHJpdmVycy9waW5jdHJsL2JjbS9waW5jdHJsLW5zcC1tdXguYwppbmRleCA0MTQ5ZGIzLi4zNWMxNzY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvYmNtL3BpbmN0cmwtbnNwLW11eC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9iY20vcGluY3RybC1uc3AtbXV4LmMKQEAgLTM0OCw3ICszNDgsNyBAQAogCXNlcV9wcmludGYocywgIiAlcyIsIGRldl9uYW1lKHBjdHJsX2Rldi0+ZGV2KSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGluY3RybF9vcHMgbnNwX3BpbmN0cmxfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwaW5jdHJsX29wcyBuc3BfcGluY3RybF9vcHMgPSB7CiAJLmdldF9ncm91cHNfY291bnQgPSBuc3BfZ2V0X2dyb3Vwc19jb3VudCwKIAkuZ2V0X2dyb3VwX25hbWUgPSBuc3BfZ2V0X2dyb3VwX25hbWUsCiAJLmdldF9ncm91cF9waW5zID0gbnNwX2dldF9ncm91cF9waW5zLApAQCAtNTE4LDcgKzUxOCw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGluY3RybC0+bG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgc3RydWN0IHBpbm11eF9vcHMgbnNwX3Bpbm11eF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBpbm11eF9vcHMgbnNwX3Bpbm11eF9vcHMgPSB7CiAJLmdldF9mdW5jdGlvbnNfY291bnQgPSBuc3BfZ2V0X2Z1bmN0aW9uc19jb3VudCwKIAkuZ2V0X2Z1bmN0aW9uX25hbWUgPSBuc3BfZ2V0X2Z1bmN0aW9uX25hbWUsCiAJLmdldF9mdW5jdGlvbl9ncm91cHMgPSBuc3BfZ2V0X2Z1bmN0aW9uX2dyb3VwcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9mcmVlc2NhbGUvcGluY3RybC1pbXguYyBiL2RyaXZlcnMvcGluY3RybC9mcmVlc2NhbGUvcGluY3RybC1pbXguYwppbmRleCA3MTM5MTc1Li40NzYxMzIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvZnJlZXNjYWxlL3BpbmN0cmwtaW14LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL2ZyZWVzY2FsZS9waW5jdHJsLWlteC5jCkBAIC0zMTUsNyArMzE1LDcgQEAKIAogCS8qIEN1cnJlbnRseSBpbXBsZW1lbnRhdGlvbiBvbmx5IGZvciBzaGFyZWQgbXV4L2NvbmYgcmVnaXN0ZXIgKi8KIAlpZiAoIShpbmZvLT5mbGFncyAmIFNIQVJFX01VWF9DT05GX1JFRykpCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gMDsKIAogCXBpbl9yZWcgPSAmaW5mby0+cGluX3JlZ3Nbb2Zmc2V0XTsKIAlpZiAocGluX3JlZy0+bXV4X3JlZyA9PSAtMSkKQEAgLTM4MCw3ICszODAsNyBAQAogCSAqIFRoZXkgYXJlIHBhcnQgb2YgdGhlIHNoYXJlZCBtdXgvY29uZiByZWdpc3Rlci4KIAkgKi8KIAlpZiAoIShpbmZvLT5mbGFncyAmIFNIQVJFX01VWF9DT05GX1JFRykpCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gMDsKIAogCXBpbl9yZWcgPSAmaW5mby0+cGluX3JlZ3Nbb2Zmc2V0XTsKIAlpZiAocGluX3JlZy0+bXV4X3JlZyA9PSAtMSkKQEAgLTUwMSw3ICs1MDEsNyBAQAogCQlyZXQgPSBpbXhfcGluY29uZl9nZXQocGN0bGRldiwgcGluLT5waW4sICZjb25maWcpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuOwotCQlzZXFfcHJpbnRmKHMsICIlczogMHglbHgiLCBuYW1lLCBjb25maWcpOworCQlzZXFfcHJpbnRmKHMsICIgICVzOiAweCVseFxuIiwgbmFtZSwgY29uZmlnKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9pbnRlbC9waW5jdHJsLWNoZXJyeXZpZXcuYyBiL2RyaXZlcnMvcGluY3RybC9pbnRlbC9waW5jdHJsLWNoZXJyeXZpZXcuYwppbmRleCA1NzQ5YTRlZS4uMzAzODlmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL2ludGVsL3BpbmN0cmwtY2hlcnJ5dmlldy5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9pbnRlbC9waW5jdHJsLWNoZXJyeXZpZXcuYwpAQCAtMTM0LDYgKzEzNCw3IEBACiAgKiBAZ3Bpb19yYW5nZXM6IEFuIGFycmF5IG9mIEdQSU8gcmFuZ2VzIGluIHRoaXMgY29tbXVuaXR5CiAgKiBAbmdwaW9fcmFuZ2VzOiBOdW1iZXIgb2YgR1BJTyByYW5nZXMKICAqIEBuZ3Bpb3M6IFRvdGFsIG51bWJlciBvZiBHUElPcyBpbiB0aGlzIGNvbW11bml0eQorICogQG5pcnFzOiBUb3RhbCBudW1iZXIgb2YgSVJRcyB0aGlzIGNvbW11bml0eSBjYW4gZ2VuZXJhdGUKICAqLwogc3RydWN0IGNodl9jb21tdW5pdHkgewogCWNvbnN0IGNoYXIgKnVpZDsKQEAgLTE0Niw2ICsxNDcsNyBAQAogCWNvbnN0IHN0cnVjdCBjaHZfZ3Bpb19waW5yYW5nZSAqZ3Bpb19yYW5nZXM7CiAJc2l6ZV90IG5ncGlvX3JhbmdlczsKIAlzaXplX3QgbmdwaW9zOworCXNpemVfdCBuaXJxczsKIH07CiAKIHN0cnVjdCBjaHZfcGluX2NvbnRleHQgewpAQCAtMzk2LDYgKzM5OCwxMiBAQAogCS5ncGlvX3JhbmdlcyA9IHNvdXRod2VzdF9ncGlvX3JhbmdlcywKIAkubmdwaW9fcmFuZ2VzID0gQVJSQVlfU0laRShzb3V0aHdlc3RfZ3Bpb19yYW5nZXMpLAogCS5uZ3Bpb3MgPSBBUlJBWV9TSVpFKHNvdXRod2VzdF9waW5zKSwKKwkvKgorCSAqIFNvdXRod2VzdCBjb21tdW5pdHkgY2FuIGJlbmVyYXRlIEdQSU8gaW50ZXJydXB0cyBvbmx5IGZvciB0aGUKKwkgKiBmaXJzdCA4IGludGVycnVwdHMuIFRoZSB1cHBlciBoYWxmICg4LTE1KSBjYW4gb25seSBiZSB1c2VkIHRvCisJICogdHJpZ2dlciBHUEVzLgorCSAqLworCS5uaXJxcyA9IDgsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBpbmN0cmxfcGluX2Rlc2Mgbm9ydGhfcGluc1tdID0gewpAQCAtNDc5LDYgKzQ4NywxMiBAQAogCS5ncGlvX3JhbmdlcyA9IG5vcnRoX2dwaW9fcmFuZ2VzLAogCS5uZ3Bpb19yYW5nZXMgPSBBUlJBWV9TSVpFKG5vcnRoX2dwaW9fcmFuZ2VzKSwKIAkubmdwaW9zID0gQVJSQVlfU0laRShub3J0aF9waW5zKSwKKwkvKgorCSAqIE5vcnRoIGNvbW11bml0eSBjYW4gYmVuZXJhdGUgR1BJTyBpbnRlcnJ1cHRzIG9ubHkgZm9yIHRoZSBmaXJzdAorCSAqIDggaW50ZXJydXB0cy4gVGhlIHVwcGVyIGhhbGYgKDgtMTUpIGNhbiBvbmx5IGJlIHVzZWQgdG8gdHJpZ2dlcgorCSAqIEdQRXMuCisJICovCisJLm5pcnFzID0gOCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGluY3RybF9waW5fZGVzYyBlYXN0X3BpbnNbXSA9IHsKQEAgLTUyMSw2ICs1MzUsNyBAQAogCS5ncGlvX3JhbmdlcyA9IGVhc3RfZ3Bpb19yYW5nZXMsCiAJLm5ncGlvX3JhbmdlcyA9IEFSUkFZX1NJWkUoZWFzdF9ncGlvX3JhbmdlcyksCiAJLm5ncGlvcyA9IEFSUkFZX1NJWkUoZWFzdF9waW5zKSwKKwkubmlycXMgPSAxNiwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGluY3RybF9waW5fZGVzYyBzb3V0aGVhc3RfcGluc1tdID0gewpAQCAtNjQ2LDYgKzY2MSw3IEBACiAJLmdwaW9fcmFuZ2VzID0gc291dGhlYXN0X2dwaW9fcmFuZ2VzLAogCS5uZ3Bpb19yYW5nZXMgPSBBUlJBWV9TSVpFKHNvdXRoZWFzdF9ncGlvX3JhbmdlcyksCiAJLm5ncGlvcyA9IEFSUkFZX1NJWkUoc291dGhlYXN0X3BpbnMpLAorCS5uaXJxcyA9IDE2LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjaHZfY29tbXVuaXR5ICpjaHZfY29tbXVuaXRpZXNbXSA9IHsKQEAgLTE0OTcsNyArMTUxMyw3IEBACiAJY2hhaW5lZF9pcnFfZW50ZXIoY2hpcCwgZGVzYyk7CiAKIAlwZW5kaW5nID0gcmVhZGwocGN0cmwtPnJlZ3MgKyBDSFZfSU5UU1RBVCk7Ci0JZm9yX2VhY2hfc2V0X2JpdChpbnRyX2xpbmUsICZwZW5kaW5nLCAxNikgeworCWZvcl9lYWNoX3NldF9iaXQoaW50cl9saW5lLCAmcGVuZGluZywgcGN0cmwtPmNvbW11bml0eS0+bmlycXMpIHsKIAkJdW5zaWduZWQgaXJxLCBvZmZzZXQ7CiAKIAkJb2Zmc2V0ID0gcGN0cmwtPmludHJfbGluZXNbaW50cl9saW5lXTsKQEAgLTE1MjAsOCArMTUzNiw5IEBACiAJY2hpcC0+bGFiZWwgPSBkZXZfbmFtZShwY3RybC0+ZGV2KTsKIAljaGlwLT5wYXJlbnQgPSBwY3RybC0+ZGV2OwogCWNoaXAtPmJhc2UgPSAtMTsKKwljaGlwLT5pcnFfbmVlZF92YWxpZF9tYXNrID0gdHJ1ZTsKIAotCXJldCA9IGdwaW9jaGlwX2FkZF9kYXRhKGNoaXAsIHBjdHJsKTsKKwlyZXQgPSBkZXZtX2dwaW9jaGlwX2FkZF9kYXRhKHBjdHJsLT5kZXYsIGNoaXAsIHBjdHJsKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIocGN0cmwtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBncGlvY2hpcFxuIik7CiAJCXJldHVybiByZXQ7CkBAIC0xNTMzLDMxICsxNTUwLDQwIEBACiAJCQkJCSAgICAgcmFuZ2UtPmJhc2UsIHJhbmdlLT5ucGlucyk7CiAJCWlmIChyZXQpIHsKIAkJCWRldl9lcnIocGN0cmwtPmRldiwgImZhaWxlZCB0byBhZGQgR1BJTyBwaW4gcmFuZ2VcbiIpOwotCQkJZ290byBmYWlsOworCQkJcmV0dXJuIHJldDsKIAkJfQogCiAJCW9mZnNldCArPSByYW5nZS0+bnBpbnM7CiAJfQogCi0JLyogTWFzayBhbmQgY2xlYXIgYWxsIGludGVycnVwdHMgKi8KLQljaHZfd3JpdGVsKDAsIHBjdHJsLT5yZWdzICsgQ0hWX0lOVE1BU0spOworCS8qIERvIG5vdCBhZGQgR1BJT3MgdGhhdCBjYW4gb25seSBnZW5lcmF0ZSBHUEVzIHRvIHRoZSBJUlEgZG9tYWluICovCisJZm9yIChpID0gMDsgaSA8IHBjdHJsLT5jb21tdW5pdHktPm5waW5zOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IHBpbmN0cmxfcGluX2Rlc2MgKmRlc2M7CisJCXUzMiBpbnRzZWw7CisKKwkJZGVzYyA9ICZwY3RybC0+Y29tbXVuaXR5LT5waW5zW2ldOworCisJCWludHNlbCA9IHJlYWRsKGNodl9wYWRyZWcocGN0cmwsIGRlc2MtPm51bWJlciwgQ0hWX1BBRENUUkwwKSk7CisJCWludHNlbCAmPSBDSFZfUEFEQ1RSTDBfSU5UU0VMX01BU0s7CisJCWludHNlbCA+Pj0gQ0hWX1BBRENUUkwwX0lOVFNFTF9TSElGVDsKKworCQlpZiAoaW50c2VsID49IHBjdHJsLT5jb21tdW5pdHktPm5pcnFzKQorCQkJY2xlYXJfYml0KGksIGNoaXAtPmlycV92YWxpZF9tYXNrKTsKKwl9CisKKwkvKiBDbGVhciBhbGwgaW50ZXJydXB0cyAqLwogCWNodl93cml0ZWwoMHhmZmZmLCBwY3RybC0+cmVncyArIENIVl9JTlRTVEFUKTsKIAogCXJldCA9IGdwaW9jaGlwX2lycWNoaXBfYWRkKGNoaXAsICZjaHZfZ3Bpb19pcnFjaGlwLCAwLAotCQkJCSAgIGhhbmRsZV9zaW1wbGVfaXJxLCBJUlFfVFlQRV9OT05FKTsKKwkJCQkgICBoYW5kbGVfYmFkX2lycSwgSVJRX1RZUEVfTk9ORSk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKHBjdHJsLT5kZXYsICJmYWlsZWQgdG8gYWRkIElSUSBjaGlwXG4iKTsKLQkJZ290byBmYWlsOworCQlyZXR1cm4gcmV0OwogCX0KIAogCWdwaW9jaGlwX3NldF9jaGFpbmVkX2lycWNoaXAoY2hpcCwgJmNodl9ncGlvX2lycWNoaXAsIGlycSwKIAkJCQkgICAgIGNodl9ncGlvX2lycV9oYW5kbGVyKTsKIAlyZXR1cm4gMDsKLQotZmFpbDoKLQlncGlvY2hpcF9yZW1vdmUoY2hpcCk7Ci0KLQlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGNodl9waW5jdHJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC0xNjI1LDE1ICsxNjUxLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjaHZfcGluY3RybF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgY2h2X3BpbmN0cmwgKnBjdHJsID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0KLQlncGlvY2hpcF9yZW1vdmUoJnBjdHJsLT5jaGlwKTsKLQotCXJldHVybiAwOwotfQotCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiBzdGF0aWMgaW50IGNodl9waW5jdHJsX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewpAQCAtMTczMCw3ICsxNzQ3LDYgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgY2h2X3BpbmN0cmxfZHJpdmVyID0gewogCS5wcm9iZSA9IGNodl9waW5jdHJsX3Byb2JlLAotCS5yZW1vdmUgPSBjaHZfcGluY3RybF9yZW1vdmUsCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAiY2hlcnJ5dmlldy1waW5jdHJsIiwKIAkJLnBtID0gJmNodl9waW5jdHJsX3BtX29wcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9pbnRlbC9waW5jdHJsLWludGVsLmMgYi9kcml2ZXJzL3BpbmN0cmwvaW50ZWwvcGluY3RybC1pbnRlbC5jCmluZGV4IDI1N2NhYjEuLjYzMzg3YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9pbnRlbC9waW5jdHJsLWludGVsLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL2ludGVsL3BpbmN0cmwtaW50ZWwuYwpAQCAtODYsNiArODYsNyBAQAogICogQGNvbW11bml0aWVzOiBBbGwgY29tbXVuaXRpZXMgaW4gdGhpcyBwaW4gY29udHJvbGxlcgogICogQG5jb21tdW5pdGllczogTnVtYmVyIG9mIGNvbW11bml0aWVzIGluIHRoaXMgcGluIGNvbnRyb2xsZXIKICAqIEBjb250ZXh0OiBDb25maWd1cmF0aW9uIHNhdmVkIG92ZXIgc3lzdGVtIHNsZWVwCisgKiBAaXJxOiBwaW5jdHJsL0dQSU8gY2hpcCBpcnEgbnVtYmVyCiAgKi8KIHN0cnVjdCBpbnRlbF9waW5jdHJsIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CkBAIC05Nyw2ICs5OCw3IEBACiAJc3RydWN0IGludGVsX2NvbW11bml0eSAqY29tbXVuaXRpZXM7CiAJc2l6ZV90IG5jb21tdW5pdGllczsKIAlzdHJ1Y3QgaW50ZWxfcGluY3RybF9jb250ZXh0IGNvbnRleHQ7CisJaW50IGlycTsKIH07CiAKICNkZWZpbmUgcGluX3RvX3BhZG5vKGMsIHApCSgocCkgLSAoYyktPnBpbl9iYXNlKQpAQCAtNzkzLDM4ICs3OTUsMTIgQEAKIHsKIAlzdHJ1Y3QgZ3Bpb19jaGlwICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwogCXN0cnVjdCBpbnRlbF9waW5jdHJsICpwY3RybCA9IGdwaW9jaGlwX2dldF9kYXRhKGdjKTsKLQljb25zdCBzdHJ1Y3QgaW50ZWxfY29tbXVuaXR5ICpjb21tdW5pdHk7CiAJdW5zaWduZWQgcGluID0gaXJxZF90b19od2lycShkKTsKLQl1bnNpZ25lZCBwYWRubywgZ3BwLCBncHBfb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIGdwZV9lbjsKIAotCWNvbW11bml0eSA9IGludGVsX2dldF9jb21tdW5pdHkocGN0cmwsIHBpbik7Ci0JaWYgKCFjb21tdW5pdHkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZwY3RybC0+bG9jaywgZmxhZ3MpOwotCi0JcGFkbm8gPSBwaW5fdG9fcGFkbm8oY29tbXVuaXR5LCBwaW4pOwotCWdwcCA9IHBhZG5vIC8gY29tbXVuaXR5LT5ncHBfc2l6ZTsKLQlncHBfb2Zmc2V0ID0gcGFkbm8gJSBjb21tdW5pdHktPmdwcF9zaXplOwotCi0JLyogQ2xlYXIgdGhlIGV4aXN0aW5nIHdha2Ugc3RhdHVzICovCi0Jd3JpdGVsKEJJVChncHBfb2Zmc2V0KSwgY29tbXVuaXR5LT5yZWdzICsgR1BJX0dQRV9TVFMgKyBncHAgKiA0KTsKLQotCS8qCi0JICogVGhlIGNvbnRyb2xsZXIgd2lsbCBnZW5lcmF0ZSB3YWtlIHdoZW4gR1BFIG9mIHRoZSBjb3JyZXNwb25kaW5nCi0JICogcGFkIGlzIGVuYWJsZWQgYW5kIGl0IGlzIG5vdCByb3V0ZWQgdG8gU0NJIChHUElST1VUU0NJIGlzIG5vdAotCSAqIHNldCkuCi0JICovCi0JZ3BlX2VuID0gcmVhZGwoY29tbXVuaXR5LT5yZWdzICsgR1BJX0dQRV9FTiArIGdwcCAqIDQpOwogCWlmIChvbikKLQkJZ3BlX2VuIHw9IEJJVChncHBfb2Zmc2V0KTsKKwkJZW5hYmxlX2lycV93YWtlKHBjdHJsLT5pcnEpOwogCWVsc2UKLQkJZ3BlX2VuICY9IH5CSVQoZ3BwX29mZnNldCk7Ci0Jd3JpdGVsKGdwZV9lbiwgY29tbXVuaXR5LT5yZWdzICsgR1BJX0dQRV9FTiArIGdwcCAqIDQpOwotCi0JcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CisJCWRpc2FibGVfaXJxX3dha2UocGN0cmwtPmlycSk7CiAKIAlkZXZfZGJnKHBjdHJsLT5kZXYsICIlc2FibGUgd2FrZSBmb3IgcGluICV1XG4iLCBvbiA/ICJlbiIgOiAiZGlzIiwgcGluKTsKIAlyZXR1cm4gMDsKQEAgLTkwNSw2ICs4ODEsNyBAQAogCXBjdHJsLT5jaGlwLmxhYmVsID0gZGV2X25hbWUocGN0cmwtPmRldik7CiAJcGN0cmwtPmNoaXAucGFyZW50ID0gcGN0cmwtPmRldjsKIAlwY3RybC0+Y2hpcC5iYXNlID0gLTE7CisJcGN0cmwtPmlycSA9IGlycTsKIAogCXJldCA9IGdwaW9jaGlwX2FkZF9kYXRhKCZwY3RybC0+Y2hpcCwgcGN0cmwpOwogCWlmIChyZXQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9pbnRlbC9waW5jdHJsLW1lcnJpZmllbGQuYyBiL2RyaXZlcnMvcGluY3RybC9pbnRlbC9waW5jdHJsLW1lcnJpZmllbGQuYwppbmRleCBlYjQ5OTBmLi43ODI2YzdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvaW50ZWwvcGluY3RybC1tZXJyaWZpZWxkLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL2ludGVsL3BpbmN0cmwtbWVycmlmaWVsZC5jCkBAIC0xMSw2ICsxMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGluY29uZi5oPgpAQCAtODUzLDcgKzg1NCw3IEBACiAJICovCiAJbmZhbWlsaWVzID0gQVJSQVlfU0laRShtcmZsZF9mYW1pbGllcyksCiAJZmFtaWxpZXMgPSBkZXZtX2ttZW1kdXAoJnBkZXYtPmRldiwgbXJmbGRfZmFtaWxpZXMsCi0JCQkJCSAgICBuZmFtaWxpZXMgKiBzaXplb2YobXJmbGRfZmFtaWxpZXMpLAorCQkJCQkgICAgc2l6ZW9mKG1yZmxkX2ZhbWlsaWVzKSwKIAkJCQkJICAgIEdGUF9LRVJORUwpOwogCWlmICghZmFtaWxpZXMpCiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL21lZGlhdGVrL3BpbmN0cmwtbXRrLWNvbW1vbi5jIGIvZHJpdmVycy9waW5jdHJsL21lZGlhdGVrL3BpbmN0cmwtbXRrLWNvbW1vbi5jCmluZGV4IGNlNTU0ZTAuLmY5YWVmMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9tZWRpYXRlay9waW5jdHJsLW10ay1jb21tb24uYworKysgYi9kcml2ZXJzL3BpbmN0cmwvbWVkaWF0ZWsvcGluY3RybC1tdGstY29tbW9uLmMKQEAgLTE1LDcgKzE1LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby9kcml2ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KQEAgLTEwNTUsNyArMTA1NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIG10a19ncGlvX2NoaXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCBtdGtfZ3Bpb19jaGlwID0gewogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLnJlcXVlc3QJCT0gZ3Bpb2NoaXBfZ2VuZXJpY19yZXF1ZXN0LAogCS5mcmVlCQkJPSBncGlvY2hpcF9nZW5lcmljX2ZyZWUsCkBAIC0xNDk2LDcgKzE0OTUsMyBAQAogCWdwaW9jaGlwX3JlbW92ZShwY3RsLT5jaGlwKTsKIAlyZXR1cm4gcmV0OwogfQotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk1lZGlhVGVrIFBpbmN0cmwgRHJpdmVyIik7Ci1NT0RVTEVfQVVUSE9SKCJIb25nemhvdSBZYW5nIDxob25nemhvdS55YW5nQG1lZGlhdGVrLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9tZXNvbi9waW5jdHJsLW1lc29uLWd4YmIuYyBiL2RyaXZlcnMvcGluY3RybC9tZXNvbi9waW5jdHJsLW1lc29uLWd4YmIuYwppbmRleCBjYjRkNmFkLi5jMzkyOGFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvbWVzb24vcGluY3RybC1tZXNvbi1neGJiLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb24tZ3hiYi5jCkBAIC0xNTYsNiArMTU2LDExIEBACiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGVtbWNfY21kX3BpbnNbXSA9IHsgUElOKEJPT1RfMTAsIEVFX09GRikgfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZW1tY19kc19waW5zW10gPSB7IFBJTihCT09UXzE1LCBFRV9PRkYpIH07CiAKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbm9yX2RfcGluc1tdCQk9IHsgUElOKEJPT1RfMTEsIEVFX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbm9yX3FfcGluc1tdCQk9IHsgUElOKEJPT1RfMTIsIEVFX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbm9yX2NfcGluc1tdCQk9IHsgUElOKEJPT1RfMTMsIEVFX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbm9yX2NzX3BpbnNbXQkJPSB7IFBJTihCT09UXzE1LCBFRV9PRkYpIH07CisKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RjYXJkX2QwX3BpbnNbXSA9IHsgUElOKENBUkRfMSwgRUVfT0ZGKSB9Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGNhcmRfZDFfcGluc1tdID0geyBQSU4oQ0FSRF8wLCBFRV9PRkYpIH07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkY2FyZF9kMl9waW5zW10gPSB7IFBJTihDQVJEXzUsIEVFX09GRikgfTsKQEAgLTE2Myw2ICsxNjgsMjMgQEAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RjYXJkX2NtZF9waW5zW10gPSB7IFBJTihDQVJEXzMsIEVFX09GRikgfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RjYXJkX2Nsa19waW5zW10gPSB7IFBJTihDQVJEXzIsIEVFX09GRikgfTsKIAorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGlvX2QwX3BpbnNbXSA9IHsgUElOKEdQSU9YXzAsIEVFX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2Rpb19kMV9waW5zW10gPSB7IFBJTihHUElPWF8xLCBFRV9PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaW9fZDJfcGluc1tdID0geyBQSU4oR1BJT1hfMiwgRUVfT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGlvX2QzX3BpbnNbXSA9IHsgUElOKEdQSU9YXzMsIEVFX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2Rpb19jbWRfcGluc1tdID0geyBQSU4oR1BJT1hfNCwgRUVfT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGlvX2Nsa19waW5zW10gPSB7IFBJTihHUElPWF81LCBFRV9PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaW9faXJxX3BpbnNbXSA9IHsgUElOKEdQSU9YXzcsIEVFX09GRikgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBuYW5kX2NlMF9waW5zW10JPSB7IFBJTihCT09UXzgsIEVFX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbmFuZF9jZTFfcGluc1tdCT0geyBQSU4oQk9PVF85LCBFRV9PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5hbmRfcmIwX3BpbnNbXQk9IHsgUElOKEJPT1RfMTAsIEVFX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbmFuZF9hbGVfcGluc1tdCT0geyBQSU4oQk9PVF8xMSwgRUVfT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBuYW5kX2NsZV9waW5zW10JPSB7IFBJTihCT09UXzEyLCBFRV9PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5hbmRfd2VuX2Nsa19waW5zW10JPSB7IFBJTihCT09UXzEzLCBFRV9PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5hbmRfcmVuX3dyX3BpbnNbXQk9IHsgUElOKEJPT1RfMTQsIEVFX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbmFuZF9kcXNfcGluc1tdCT0geyBQSU4oQk9PVF8xNSwgRUVfT0ZGKSB9OworCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfdHhfYV9waW5zW10JPSB7IFBJTihHUElPWF8xMiwgRUVfT0ZGKSB9Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X3J4X2FfcGluc1tdCT0geyBQSU4oR1BJT1hfMTMsIEVFX09GRikgfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF9jdHNfYV9waW5zW10JPSB7IFBJTihHUElPWF8xNCwgRUVfT0ZGKSB9OwpAQCAtMTc4LDYgKzIwMCwxNSBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X2N0c19jX3BpbnNbXQk9IHsgUElOKEdQSU9YXzExLCBFRV9PRkYpIH07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfcnRzX2NfcGluc1tdCT0geyBQSU4oR1BJT1hfMTIsIEVFX09GRikgfTsKIAorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmNfc2NrX2FfcGluc1tdCT0geyBQSU4oR1BJT0RWXzI1LCBFRV9PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyY19zZGFfYV9waW5zW10JPSB7IFBJTihHUElPRFZfMjQsIEVFX09GRikgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmNfc2NrX2JfcGluc1tdCT0geyBQSU4oR1BJT0RWXzI3LCBFRV9PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyY19zZGFfYl9waW5zW10JPSB7IFBJTihHUElPRFZfMjYsIEVFX09GRikgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmNfc2NrX2NfcGluc1tdCT0geyBQSU4oR1BJT0RWXzI5LCBFRV9PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyY19zZGFfY19waW5zW10JPSB7IFBJTihHUElPRFZfMjgsIEVFX09GRikgfTsKKwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBldGhfbWRpb19waW5zW10JPSB7IFBJTihHUElPWl8wLCBFRV9PRkYpIH07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGV0aF9tZGNfcGluc1tdCT0geyBQSU4oR1BJT1pfMSwgRUVfT0ZGKSB9Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBldGhfY2xrX3J4X2Nsa19waW5zW10JPSB7IFBJTihHUElPWl8yLCBFRV9PRkYpIH07CkBAIC0xOTMsNiArMjI0LDE0IEBACiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGV0aF90eGQyX3BpbnNbXQk9IHsgUElOKEdQSU9aXzEyLCBFRV9PRkYpIH07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGV0aF90eGQzX3BpbnNbXQk9IHsgUElOKEdQSU9aXzEzLCBFRV9PRkYpIH07CiAKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcHdtX2FfeF9waW5zW10JPSB7IFBJTihHUElPWF82LCBFRV9PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHB3bV9hX3lfcGluc1tdCT0geyBQSU4oR1BJT1lfMTYsIEVFX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcHdtX2JfcGluc1tdCQk9IHsgUElOKEdQSU9EVl8yOSwgRUVfT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwd21fZF9waW5zW10JCT0geyBQSU4oR1BJT0RWXzI4LCBFRV9PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHB3bV9lX3BpbnNbXQkJPSB7IFBJTihHUElPWF8xOSwgRUVfT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwd21fZl94X3BpbnNbXQk9IHsgUElOKEdQSU9YXzcsIEVFX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcHdtX2ZfeV9waW5zW10JPSB7IFBJTihHUElPWV8xNSwgRUVfT0ZGKSB9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBpbmN0cmxfcGluX2Rlc2MgbWVzb25fZ3hiYl9hb2J1c19waW5zW10gPSB7CiAJTUVTT05fUElOKEdQSU9BT18wLCAwKSwKIAlNRVNPTl9QSU4oR1BJT0FPXzEsIDApLApAQCAtMjI1LDYgKzI2NCwxMyBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmNfc2xhdmVfc2NrX2FvX3BpbnNbXSA9IHtQSU4oR1BJT0FPXzQsIDApIH07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyY19zbGF2ZV9zZGFfYW9fcGluc1tdID0ge1BJTihHUElPQU9fNSwgMCkgfTsKIAorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByZW1vdGVfaW5wdXRfYW9fcGluc1tdID0ge1BJTihHUElPQU9fNywgMCkgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwd21fYW9fYV8zX3BpbnNbXQk9IHsgUElOKEdQSU9BT18zLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwd21fYW9fYV82X3BpbnNbXQk9IHsgUElOKEdQSU9BT182LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwd21fYW9fYV8xMl9waW5zW10JPSB7IFBJTihHUElPQU9fMTIsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHB3bV9hb19iX3BpbnNbXQk9IHsgUElOKEdQSU9BT18xMywgMCkgfTsKKwogc3RhdGljIHN0cnVjdCBtZXNvbl9wbXhfZ3JvdXAgbWVzb25fZ3hiYl9wZXJpcGhzX2dyb3Vwc1tdID0gewogCUdQSU9fR1JPVVAoR1BJT1pfMCwgRUVfT0ZGKSwKIAlHUElPX0dST1VQKEdQSU9aXzEsIEVFX09GRiksCkBAIC0zNTUsMTYgKzQwMSwyOCBAQAogCUdQSU9fR1JPVVAoR1BJT19URVNUX04sIEVFX09GRiksCiAKIAkvKiBCYW5rIFggKi8KKwlHUk9VUChzZGlvX2QwLAkJOCwJNSksCisJR1JPVVAoc2Rpb19kMSwJCTgsCTQpLAorCUdST1VQKHNkaW9fZDIsCQk4LAkzKSwKKwlHUk9VUChzZGlvX2QzLAkJOCwJMiksCisJR1JPVVAoc2Rpb19jbWQsCQk4LAkxKSwKKwlHUk9VUChzZGlvX2NsaywJCTgsCTApLAorCUdST1VQKHNkaW9faXJxLAkJOCwJMTEpLAogCUdST1VQKHVhcnRfdHhfYSwJNCwJMTMpLAogCUdST1VQKHVhcnRfcnhfYSwJNCwJMTIpLAogCUdST1VQKHVhcnRfY3RzX2EsCTQsCTExKSwKIAlHUk9VUCh1YXJ0X3J0c19hLAk0LAkxMCksCisJR1JPVVAocHdtX2FfeCwJCTMsCTE3KSwKKwlHUk9VUChwd21fZSwJCTIsCTMwKSwKKwlHUk9VUChwd21fZl94LAkJMywJMTgpLAogCiAJLyogQmFuayBZICovCiAJR1JPVVAodWFydF9jdHNfYywJMSwJMTkpLAogCUdST1VQKHVhcnRfcnRzX2MsCTEsCTE4KSwKIAlHUk9VUCh1YXJ0X3R4X2MsCTEsCTE3KSwKIAlHUk9VUCh1YXJ0X3J4X2MsCTEsCTE2KSwKKwlHUk9VUChwd21fYV95LAkJMSwJMjEpLAorCUdST1VQKHB3bV9mX3ksCQkxLAkyMCksCiAKIAkvKiBCYW5rIFogKi8KIAlHUk9VUChldGhfbWRpbywJCTYsCTEpLApAQCAtMzg3LDEyICs0NDUsMzIgQEAKIAlHUk9VUCh1YXJ0X3J4X2IsCTIsCTI4KSwKIAlHUk9VUCh1YXJ0X2N0c19iLAkyLAkyNyksCiAJR1JPVVAodWFydF9ydHNfYiwJMiwJMjYpLAorCUdST1VQKHB3bV9iLAkJMywJMjEpLAorCUdST1VQKHB3bV9kLAkJMywJMjApLAorCUdST1VQKGkyY19zY2tfYSwJNywJMjcpLAorCUdST1VQKGkyY19zZGFfYSwJNywJMjYpLAorCUdST1VQKGkyY19zY2tfYiwJNywJMjUpLAorCUdST1VQKGkyY19zZGFfYiwJNywJMjQpLAorCUdST1VQKGkyY19zY2tfYywJNywJMjMpLAorCUdST1VQKGkyY19zZGFfYywJNywJMjIpLAogCiAJLyogQmFuayBCT09UICovCiAJR1JPVVAoZW1tY19uYW5kX2QwNywJNCwJMzApLAogCUdST1VQKGVtbWNfY2xrLAkJNCwJMTgpLAogCUdST1VQKGVtbWNfY21kLAkJNCwJMTkpLAogCUdST1VQKGVtbWNfZHMsCQk0LAkzMSksCisJR1JPVVAobm9yX2QsCQk1LAkxKSwKKwlHUk9VUChub3JfcSwJCTUsCTMpLAorCUdST1VQKG5vcl9jLAkJNSwJMiksCisJR1JPVVAobm9yX2NzLAkJNSwJMCksCisJR1JPVVAobmFuZF9jZTAsCQk0LAkyNiksCisJR1JPVVAobmFuZF9jZTEsCQk0LAkyNyksCisJR1JPVVAobmFuZF9yYjAsCQk0LAkyNSksCisJR1JPVVAobmFuZF9hbGUsCQk0LAkyNCksCisJR1JPVVAobmFuZF9jbGUsCQk0LAkyMyksCisJR1JPVVAobmFuZF93ZW5fY2xrLAk0LAkyMiksCisJR1JPVVAobmFuZF9yZW5fd3IsCTQsCTIxKSwKKwlHUk9VUChuYW5kX2RxcywJCTQsCTIwKSwKIAogCS8qIEJhbmsgQ0FSRCAqLwogCUdST1VQKHNkY2FyZF9kMSwJMiwJMTQpLApAQCAtNDMyLDYgKzUxMCwxMSBAQAogCUdST1VQKGkyY19zZGFfYW8sCTAsCTUpLAogCUdST1VQKGkyY19zbGF2ZV9zY2tfYW8sIDAsCTIpLAogCUdST1VQKGkyY19zbGF2ZV9zZGFfYW8sIDAsCTEpLAorCUdST1VQKHJlbW90ZV9pbnB1dF9hbywJMCwJMCksCisJR1JPVVAocHdtX2FvX2FfMywJMCwJMjIpLAorCUdST1VQKHB3bV9hb19hXzYsCTAsCTE4KSwKKwlHUk9VUChwd21fYW9fYV8xMiwJMCwJMTcpLAorCUdST1VQKHB3bV9hb19iLAkJMCwJMyksCiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdwaW9fcGVyaXBoc19ncm91cHNbXSA9IHsKQEAgLTQ3NSwxMSArNTU4LDI1IEBACiAJImVtbWNfbmFuZF9kMDciLCAiZW1tY19jbGsiLCAiZW1tY19jbWQiLCAiZW1tY19kcyIsCiB9OwogCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5vcl9ncm91cHNbXSA9IHsKKwkibm9yX2QiLCAibm9yX3EiLCAibm9yX2MiLCAibm9yX2NzIiwKK307CisKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2RjYXJkX2dyb3Vwc1tdID0gewogCSJzZGNhcmRfZDAiLCAic2RjYXJkX2QxIiwgInNkY2FyZF9kMiIsICJzZGNhcmRfZDMiLAogCSJzZGNhcmRfY21kIiwgInNkY2FyZF9jbGsiLAogfTsKIAorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZGlvX2dyb3Vwc1tdID0geworCSJzZGlvX2QwIiwgInNkaW9fZDEiLCAic2Rpb19kMiIsICJzZGlvX2QzIiwKKwkic2Rpb19jbWQiLCAic2Rpb19jbGsiLCAic2Rpb19pcnEiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW5kX2dyb3Vwc1tdID0geworCSJuYW5kX2NlMCIsICJuYW5kX2NlMSIsICJuYW5kX3JiMCIsICJuYW5kX2FsZSIsICJuYW5kX2NsZSIsCisJIm5hbmRfd2VuX2NsayIsICJuYW5kX3Jlbl93ciIsICJuYW5kX2RxcyIsCit9OworCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVhcnRfYV9ncm91cHNbXSA9IHsKIAkidWFydF90eF9hIiwgInVhcnRfcnhfYSIsICJ1YXJ0X2N0c19hIiwgInVhcnRfcnRzX2EiLAogfTsKQEAgLTQ5Miw2ICs1ODksMTggQEAKIAkidWFydF90eF9jIiwgInVhcnRfcnhfYyIsICJ1YXJ0X2N0c19jIiwgInVhcnRfcnRzX2MiLAogfTsKIAorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmNfYV9ncm91cHNbXSA9IHsKKwkiaTJjX3Nja19hIiwgImkyY19zZGFfYSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyY19iX2dyb3Vwc1tdID0geworCSJpMmNfc2NrX2IiLCAiaTJjX3NkYV9iIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJjX2NfZ3JvdXBzW10gPSB7CisJImkyY19zY2tfYyIsICJpMmNfc2RhX2MiLAorfTsKKwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBldGhfZ3JvdXBzW10gPSB7CiAJImV0aF9tZGlvIiwgImV0aF9tZGMiLCAiZXRoX2Nsa19yeF9jbGsiLCAiZXRoX3J4X2R2IiwKIAkiZXRoX3J4ZDAiLCAiZXRoX3J4ZDEiLCAiZXRoX3J4ZDIiLCAiZXRoX3J4ZDMiLApAQCAtNDk5LDYgKzYwOCwzNCBAQAogCSJldGhfdHhkMCIsICJldGhfdHhkMSIsICJldGhfdHhkMiIsICJldGhfdHhkMyIsCiB9OwogCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3bV9hX3hfZ3JvdXBzW10gPSB7CisJInB3bV9hX3giLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd21fYV95X2dyb3Vwc1tdID0geworCSJwd21fYV95IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdtX2JfZ3JvdXBzW10gPSB7CisJInB3bV9iIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdtX2RfZ3JvdXBzW10gPSB7CisJInB3bV9kIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdtX2VfZ3JvdXBzW10gPSB7CisJInB3bV9lIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdtX2ZfeF9ncm91cHNbXSA9IHsKKwkicHdtX2ZfeCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3bV9mX3lfZ3JvdXBzW10gPSB7CisJInB3bV9mX3kiLAorfTsKKwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBncGlvX2FvYnVzX2dyb3Vwc1tdID0gewogCSJHUElPQU9fMCIsICJHUElPQU9fMSIsICJHUElPQU9fMiIsICJHUElPQU9fMyIsICJHUElPQU9fNCIsCiAJIkdQSU9BT181IiwgIkdQSU9BT182IiwgIkdQSU9BT183IiwgIkdQSU9BT184IiwgIkdQSU9BT185IiwKQEAgLTUyMSwxNCArNjU4LDQ3IEBACiAJImkyY19zbGF2ZV9zZGtfYW8iLCAiaTJjX3NsYXZlX3NkYV9hbyIsCiB9OwogCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJlbW90ZV9pbnB1dF9hb19ncm91cHNbXSA9IHsKKwkicmVtb3RlX2lucHV0X2FvIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdtX2FvX2FfM19ncm91cHNbXSA9IHsKKwkicHdtX2FvX2FfMyIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3bV9hb19hXzZfZ3JvdXBzW10gPSB7CisJInB3bV9hb19hXzYiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd21fYW9fYV8xMl9ncm91cHNbXSA9IHsKKwkicHdtX2FvX2FfMTIiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd21fYW9fYl9ncm91cHNbXSA9IHsKKwkicHdtX2FvX2IiLAorfTsKKwogc3RhdGljIHN0cnVjdCBtZXNvbl9wbXhfZnVuYyBtZXNvbl9neGJiX3BlcmlwaHNfZnVuY3Rpb25zW10gPSB7CiAJRlVOQ1RJT04oZ3Bpb19wZXJpcGhzKSwKIAlGVU5DVElPTihlbW1jKSwKKwlGVU5DVElPTihub3IpLAogCUZVTkNUSU9OKHNkY2FyZCksCisJRlVOQ1RJT04oc2RpbyksCisJRlVOQ1RJT04obmFuZCksCiAJRlVOQ1RJT04odWFydF9hKSwKIAlGVU5DVElPTih1YXJ0X2IpLAogCUZVTkNUSU9OKHVhcnRfYyksCisJRlVOQ1RJT04oaTJjX2EpLAorCUZVTkNUSU9OKGkyY19iKSwKKwlGVU5DVElPTihpMmNfYyksCiAJRlVOQ1RJT04oZXRoKSwKKwlGVU5DVElPTihwd21fYV94KSwKKwlGVU5DVElPTihwd21fYV95KSwKKwlGVU5DVElPTihwd21fYiksCisJRlVOQ1RJT04ocHdtX2QpLAorCUZVTkNUSU9OKHB3bV9lKSwKKwlGVU5DVElPTihwd21fZl94KSwKKwlGVU5DVElPTihwd21fZl95KSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbWVzb25fcG14X2Z1bmMgbWVzb25fZ3hiYl9hb2J1c19mdW5jdGlvbnNbXSA9IHsKQEAgLTUzNyw2ICs3MDcsMTEgQEAKIAlGVU5DVElPTih1YXJ0X2FvX2IpLAogCUZVTkNUSU9OKGkyY19hbyksCiAJRlVOQ1RJT04oaTJjX3NsYXZlX2FvKSwKKwlGVU5DVElPTihyZW1vdGVfaW5wdXRfYW8pLAorCUZVTkNUSU9OKHB3bV9hb19hXzMpLAorCUZVTkNUSU9OKHB3bV9hb19hXzYpLAorCUZVTkNUSU9OKHB3bV9hb19hXzEyKSwKKwlGVU5DVElPTihwd21fYW9fYiksCiB9OwogCiBzdGF0aWMgc3RydWN0IG1lc29uX2JhbmsgbWVzb25fZ3hiYl9wZXJpcGhzX2JhbmtzW10gPSB7CkBAIC01NTYsMzggKzczMSwyOCBAQAogCUJBTksoIkFPIiwgICBQSU4oR1BJT0FPXzAsIDApLCAgUElOKEdQSU9BT18xMywgMCksIDAsICAwLCAgMCwgMTYsICAwLCAgMCwgIDAsIDE2LCAgMSwgIDApLAogfTsKIAotc3RhdGljIHN0cnVjdCBtZXNvbl9kb21haW5fZGF0YSBtZXNvbl9neGJiX3BlcmlwaHNfZG9tYWluX2RhdGEgPSB7Ci0JLm5hbWUJCT0gInBlcmlwaHMtYmFua3MiLAotCS5iYW5rcwkJPSBtZXNvbl9neGJiX3BlcmlwaHNfYmFua3MsCi0JLm51bV9iYW5rcwk9IEFSUkFZX1NJWkUobWVzb25fZ3hiYl9wZXJpcGhzX2JhbmtzKSwKLQkucGluX2Jhc2UJPSAxNCwKLQkubnVtX3BpbnMJPSAxMjAsCi19OwotCi1zdGF0aWMgc3RydWN0IG1lc29uX2RvbWFpbl9kYXRhIG1lc29uX2d4YmJfYW9idXNfZG9tYWluX2RhdGEgPSB7Ci0JLm5hbWUJCT0gImFvYnVzLWJhbmtzIiwKLQkuYmFua3MJCT0gbWVzb25fZ3hiYl9hb2J1c19iYW5rcywKLQkubnVtX2JhbmtzCT0gQVJSQVlfU0laRShtZXNvbl9neGJiX2FvYnVzX2JhbmtzKSwKLQkucGluX2Jhc2UJPSAwLAotCS5udW1fcGlucwk9IDE0LAotfTsKLQogc3RydWN0IG1lc29uX3BpbmN0cmxfZGF0YSBtZXNvbl9neGJiX3BlcmlwaHNfcGluY3RybF9kYXRhID0geworCS5uYW1lCQk9ICJwZXJpcGhzLWJhbmtzIiwKKwkucGluX2Jhc2UJPSAxNCwKIAkucGlucwkJPSBtZXNvbl9neGJiX3BlcmlwaHNfcGlucywKIAkuZ3JvdXBzCQk9IG1lc29uX2d4YmJfcGVyaXBoc19ncm91cHMsCiAJLmZ1bmNzCQk9IG1lc29uX2d4YmJfcGVyaXBoc19mdW5jdGlvbnMsCi0JLmRvbWFpbl9kYXRhCT0gJm1lc29uX2d4YmJfcGVyaXBoc19kb21haW5fZGF0YSwKKwkuYmFua3MJCT0gbWVzb25fZ3hiYl9wZXJpcGhzX2JhbmtzLAogCS5udW1fcGlucwk9IEFSUkFZX1NJWkUobWVzb25fZ3hiYl9wZXJpcGhzX3BpbnMpLAogCS5udW1fZ3JvdXBzCT0gQVJSQVlfU0laRShtZXNvbl9neGJiX3BlcmlwaHNfZ3JvdXBzKSwKIAkubnVtX2Z1bmNzCT0gQVJSQVlfU0laRShtZXNvbl9neGJiX3BlcmlwaHNfZnVuY3Rpb25zKSwKKwkubnVtX2JhbmtzCT0gQVJSQVlfU0laRShtZXNvbl9neGJiX3BlcmlwaHNfYmFua3MpLAogfTsKIAogc3RydWN0IG1lc29uX3BpbmN0cmxfZGF0YSBtZXNvbl9neGJiX2FvYnVzX3BpbmN0cmxfZGF0YSA9IHsKKwkubmFtZQkJPSAiYW9idXMtYmFua3MiLAorCS5waW5fYmFzZQk9IDAsCiAJLnBpbnMJCT0gbWVzb25fZ3hiYl9hb2J1c19waW5zLAogCS5ncm91cHMJCT0gbWVzb25fZ3hiYl9hb2J1c19ncm91cHMsCiAJLmZ1bmNzCQk9IG1lc29uX2d4YmJfYW9idXNfZnVuY3Rpb25zLAotCS5kb21haW5fZGF0YQk9ICZtZXNvbl9neGJiX2FvYnVzX2RvbWFpbl9kYXRhLAorCS5iYW5rcwkJPSBtZXNvbl9neGJiX2FvYnVzX2JhbmtzLAogCS5udW1fcGlucwk9IEFSUkFZX1NJWkUobWVzb25fZ3hiYl9hb2J1c19waW5zKSwKIAkubnVtX2dyb3Vwcwk9IEFSUkFZX1NJWkUobWVzb25fZ3hiYl9hb2J1c19ncm91cHMpLAogCS5udW1fZnVuY3MJPSBBUlJBWV9TSVpFKG1lc29uX2d4YmJfYW9idXNfZnVuY3Rpb25zKSwKKwkubnVtX2JhbmtzCT0gQVJSQVlfU0laRShtZXNvbl9neGJiX2FvYnVzX2JhbmtzKSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvbWVzb24vcGluY3RybC1tZXNvbi5jIGIvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb24uYwppbmRleCAxMTYyM2M2Li41NzEyMmVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvbWVzb24vcGluY3RybC1tZXNvbi5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9tZXNvbi9waW5jdHJsLW1lc29uLmMKQEAgLTIxLDkgKzIxLDggQEAKICAqIGRvbWFpbiB3aGljaCBjYW4ndCBiZSBwb3dlcmVkIG9mZjsgdGhlIGJhbmsgYWxzbyB1c2VzIGEgc2V0IG9mCiAgKiByZWdpc3RlcnMgZGlmZmVyZW50IGZyb20gdGhlIG90aGVyIGJhbmtzLgogICoKLSAqIEZvciBlYWNoIG9mIHRoZSB0d28gcG93ZXIgZG9tYWlucyAocmVndWxhciBhbmQgYWx3YXlzLW9uKSB0aGVyZSBhcmUKLSAqIDQgZGlmZmVyZW50IHJlZ2lzdGVyIHJhbmdlcyB0aGF0IGNvbnRyb2wgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzCi0gKiBvZiB0aGUgcGluczoKKyAqIEZvciBlYWNoIHBpbiBjb250cm9sbGVyIHRoZXJlIGFyZSA0IGRpZmZlcmVudCByZWdpc3RlciByYW5nZXMgdGhhdAorICogY29udHJvbCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgb2YgdGhlIHBpbnM6CiAgKiAgMSkgcGluIG11eGluZwogICogIDIpIHB1bGwgZW5hYmxlL2Rpc2FibGUKICAqICAzKSBwdWxsIHVwL2Rvd24KQEAgLTMzLDggKzMyLDggQEAKICAqIGRpcmVjdGlvbiBhcmUgdGhlIHNhbWUgYW5kIHRodXMgdGhlcmUgYXJlIG9ubHkgMyByZWdpc3RlciByYW5nZXMuCiAgKgogICogRXZlcnkgcGlubXV4IGdyb3VwIGNhbiBiZSBlbmFibGVkIGJ5IGEgc3BlY2lmaWMgYml0IGluIHRoZSBmaXJzdAotICogcmVnaXN0ZXIgcmFuZ2Ugb2YgdGhlIGRvbWFpbjsgd2hlbiBhbGwgZ3JvdXBzIGZvciBhIGdpdmVuIHBpbiBhcmUKLSAqIGRpc2FibGVkIHRoZSBwaW4gYWN0cyBhcyBhIEdQSU8uCisgKiByZWdpc3RlciByYW5nZTsgd2hlbiBhbGwgZ3JvdXBzIGZvciBhIGdpdmVuIHBpbiBhcmUgZGlzYWJsZWQgdGhlCisgKiBwaW4gYWN0cyBhcyBhIEdQSU8uCiAgKgogICogRm9yIHRoZSBwdWxsIGFuZCBHUElPIGNvbmZpZ3VyYXRpb24gZXZlcnkgYmFuayB1c2VzIGEgY29udGlndW91cwogICogc2V0IG9mIGJpdHMgaW4gdGhlIHJlZ2lzdGVyIHNldHMgZGVzY3JpYmVkIGFib3ZlOyB0aGUgc2FtZSByZWdpc3RlcgpAQCAtNjYsMjEgKzY1LDIxIEBACiAvKioKICAqIG1lc29uX2dldF9iYW5rKCkgLSBmaW5kIHRoZSBiYW5rIGNvbnRhaW5pbmcgYSBnaXZlbiBwaW4KICAqCi0gKiBAZG9tYWluOgl0aGUgZG9tYWluIGNvbnRhaW5pbmcgdGhlIHBpbgorICogQHBjOgkJdGhlIHBpbmN0cmwgaW5zdGFuY2UKICAqIEBwaW46CXRoZSBwaW4gbnVtYmVyCiAgKiBAYmFuazoJdGhlIGZvdW5kIGJhbmsKICAqCiAgKiBSZXR1cm46CTAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvcgogICovCi1zdGF0aWMgaW50IG1lc29uX2dldF9iYW5rKHN0cnVjdCBtZXNvbl9kb21haW4gKmRvbWFpbiwgdW5zaWduZWQgaW50IHBpbiwKK3N0YXRpYyBpbnQgbWVzb25fZ2V0X2Jhbmsoc3RydWN0IG1lc29uX3BpbmN0cmwgKnBjLCB1bnNpZ25lZCBpbnQgcGluLAogCQkJICBzdHJ1Y3QgbWVzb25fYmFuayAqKmJhbmspCiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgZG9tYWluLT5kYXRhLT5udW1fYmFua3M7IGkrKykgewotCQlpZiAocGluID49IGRvbWFpbi0+ZGF0YS0+YmFua3NbaV0uZmlyc3QgJiYKLQkJICAgIHBpbiA8PSBkb21haW4tPmRhdGEtPmJhbmtzW2ldLmxhc3QpIHsKLQkJCSpiYW5rID0gJmRvbWFpbi0+ZGF0YS0+YmFua3NbaV07CisJZm9yIChpID0gMDsgaSA8IHBjLT5kYXRhLT5udW1fYmFua3M7IGkrKykgeworCQlpZiAocGluID49IHBjLT5kYXRhLT5iYW5rc1tpXS5maXJzdCAmJgorCQkgICAgcGluIDw9IHBjLT5kYXRhLT5iYW5rc1tpXS5sYXN0KSB7CisJCQkqYmFuayA9ICZwYy0+ZGF0YS0+YmFua3NbaV07CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KQEAgLTg5LDMzICs4OCw2IEBACiB9CiAKIC8qKgotICogbWVzb25fZ2V0X2RvbWFpbl9hbmRfYmFuaygpIC0gZmluZCBkb21haW4gYW5kIGJhbmsgY29udGFpbmluZyBhIGdpdmVuIHBpbgotICoKLSAqIEBwYzoJCU1lc29uIHBpbiBjb250cm9sbGVyIGRldmljZQotICogQHBpbjoJdGhlIHBpbiBudW1iZXIKLSAqIEBkb21haW46CXRoZSBmb3VuZCBkb21haW4KLSAqIEBiYW5rOgl0aGUgZm91bmQgYmFuawotICoKLSAqIFJldHVybjoJMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yCi0gKi8KLXN0YXRpYyBpbnQgbWVzb25fZ2V0X2RvbWFpbl9hbmRfYmFuayhzdHJ1Y3QgbWVzb25fcGluY3RybCAqcGMsIHVuc2lnbmVkIGludCBwaW4sCi0JCQkJICAgICBzdHJ1Y3QgbWVzb25fZG9tYWluICoqZG9tYWluLAotCQkJCSAgICAgc3RydWN0IG1lc29uX2JhbmsgKipiYW5rKQotewotCXN0cnVjdCBtZXNvbl9kb21haW4gKmQ7Ci0KLQlkID0gcGMtPmRvbWFpbjsKLQotCWlmIChwaW4gPj0gZC0+ZGF0YS0+cGluX2Jhc2UgJiYKLQkgICAgcGluIDwgZC0+ZGF0YS0+cGluX2Jhc2UgKyBkLT5kYXRhLT5udW1fcGlucykgewotCQkqZG9tYWluID0gZDsKLQkJcmV0dXJuIG1lc29uX2dldF9iYW5rKGQsIHBpbiwgYmFuayk7Ci0JfQotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLS8qKgogICogbWVzb25fY2FsY19yZWdfYW5kX2JpdCgpIC0gY2FsY3VsYXRlIHJlZ2lzdGVyIGFuZCBiaXQgZm9yIGEgcGluCiAgKgogICogQGJhbms6CXRoZSBiYW5rIGNvbnRhaW5pbmcgdGhlIHBpbgpAQCAtMTkwLDcgKzE2Miw2IEBACiAJCQkJCSAgIHVuc2lnbmVkIGludCBwaW4sIGludCBzZWxfZ3JvdXApCiB7CiAJc3RydWN0IG1lc29uX3BteF9ncm91cCAqZ3JvdXA7Ci0Jc3RydWN0IG1lc29uX2RvbWFpbiAqZG9tYWluOwogCWludCBpLCBqOwogCiAJZm9yIChpID0gMDsgaSA8IHBjLT5kYXRhLT5udW1fZ3JvdXBzOyBpKyspIHsKQEAgLTIwMSw4ICsxNzIsNyBAQAogCQlmb3IgKGogPSAwOyBqIDwgZ3JvdXAtPm51bV9waW5zOyBqKyspIHsKIAkJCWlmIChncm91cC0+cGluc1tqXSA9PSBwaW4pIHsKIAkJCQkvKiBXZSBoYXZlIGZvdW5kIGEgZ3JvdXAgdXNpbmcgdGhlIHBpbiAqLwotCQkJCWRvbWFpbiA9IHBjLT5kb21haW47Ci0JCQkJcmVnbWFwX3VwZGF0ZV9iaXRzKGRvbWFpbi0+cmVnX211eCwKKwkJCQlyZWdtYXBfdXBkYXRlX2JpdHMocGMtPnJlZ19tdXgsCiAJCQkJCQkgICBncm91cC0+cmVnICogNCwKIAkJCQkJCSAgIEJJVChncm91cC0+Yml0KSwgMCk7CiAJCQl9CkBAIC0yMTYsNyArMTg2LDYgQEAKIAlzdHJ1Y3QgbWVzb25fcGluY3RybCAqcGMgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY2Rldik7CiAJc3RydWN0IG1lc29uX3BteF9mdW5jICpmdW5jID0gJnBjLT5kYXRhLT5mdW5jc1tmdW5jX251bV07CiAJc3RydWN0IG1lc29uX3BteF9ncm91cCAqZ3JvdXAgPSAmcGMtPmRhdGEtPmdyb3Vwc1tncm91cF9udW1dOwotCXN0cnVjdCBtZXNvbl9kb21haW4gKmRvbWFpbiA9IHBjLT5kb21haW47CiAJaW50IGksIHJldCA9IDA7CiAKIAlkZXZfZGJnKHBjLT5kZXYsICJlbmFibGUgZnVuY3Rpb24gJXMsIGdyb3VwICVzXG4iLCBmdW5jLT5uYW1lLApAQCAtMjMxLDcgKzIwMCw3IEBACiAKIAkvKiBGdW5jdGlvbiAwIChHUElPKSBkb2Vzbid0IG5lZWQgYW55IGFkZGl0aW9uYWwgc2V0dGluZyAqLwogCWlmIChmdW5jX251bSkKLQkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGRvbWFpbi0+cmVnX211eCwgZ3JvdXAtPnJlZyAqIDQsCisJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhwYy0+cmVnX211eCwgZ3JvdXAtPnJlZyAqIDQsCiAJCQkJCSBCSVQoZ3JvdXAtPmJpdCksIEJJVChncm91cC0+Yml0KSk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMjg3LDE0ICsyNTYsMTMgQEAKIAkJCSAgICAgdW5zaWduZWQgbG9uZyAqY29uZmlncywgdW5zaWduZWQgbnVtX2NvbmZpZ3MpCiB7CiAJc3RydWN0IG1lc29uX3BpbmN0cmwgKnBjID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGNkZXYpOwotCXN0cnVjdCBtZXNvbl9kb21haW4gKmRvbWFpbjsKIAlzdHJ1Y3QgbWVzb25fYmFuayAqYmFuazsKIAllbnVtIHBpbl9jb25maWdfcGFyYW0gcGFyYW07CiAJdW5zaWduZWQgaW50IHJlZywgYml0OwogCWludCBpLCByZXQ7CiAJdTE2IGFyZzsKIAotCXJldCA9IG1lc29uX2dldF9kb21haW5fYW5kX2JhbmsocGMsIHBpbiwgJmRvbWFpbiwgJmJhbmspOworCXJldCA9IG1lc29uX2dldF9iYW5rKHBjLCBwaW4sICZiYW5rKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC0zMDcsNyArMjc1LDcgQEAKIAkJCWRldl9kYmcocGMtPmRldiwgInBpbiAldTogZGlzYWJsZSBiaWFzXG4iLCBwaW4pOwogCiAJCQltZXNvbl9jYWxjX3JlZ19hbmRfYml0KGJhbmssIHBpbiwgUkVHX1BVTEwsICZyZWcsICZiaXQpOwotCQkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGRvbWFpbi0+cmVnX3B1bGwsIHJlZywKKwkJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhwYy0+cmVnX3B1bGwsIHJlZywKIAkJCQkJCSBCSVQoYml0KSwgMCk7CiAJCQlpZiAocmV0KQogCQkJCXJldHVybiByZXQ7CkBAIC0zMTcsMTMgKzI4NSwxMyBAQAogCiAJCQltZXNvbl9jYWxjX3JlZ19hbmRfYml0KGJhbmssIHBpbiwgUkVHX1BVTExFTiwKIAkJCQkJICAgICAgICZyZWcsICZiaXQpOwotCQkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGRvbWFpbi0+cmVnX3B1bGxlbiwgcmVnLAorCQkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHBjLT5yZWdfcHVsbGVuLCByZWcsCiAJCQkJCQkgQklUKGJpdCksIEJJVChiaXQpKTsKIAkJCWlmIChyZXQpCiAJCQkJcmV0dXJuIHJldDsKIAogCQkJbWVzb25fY2FsY19yZWdfYW5kX2JpdChiYW5rLCBwaW4sIFJFR19QVUxMLCAmcmVnLCAmYml0KTsKLQkJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhkb21haW4tPnJlZ19wdWxsLCByZWcsCisJCQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMocGMtPnJlZ19wdWxsLCByZWcsCiAJCQkJCQkgQklUKGJpdCksIEJJVChiaXQpKTsKIAkJCWlmIChyZXQpCiAJCQkJcmV0dXJuIHJldDsKQEAgLTMzMywxMyArMzAxLDEzIEBACiAKIAkJCW1lc29uX2NhbGNfcmVnX2FuZF9iaXQoYmFuaywgcGluLCBSRUdfUFVMTEVOLAogCQkJCQkgICAgICAgJnJlZywgJmJpdCk7Ci0JCQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoZG9tYWluLT5yZWdfcHVsbGVuLCByZWcsCisJCQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMocGMtPnJlZ19wdWxsZW4sIHJlZywKIAkJCQkJCSBCSVQoYml0KSwgQklUKGJpdCkpOwogCQkJaWYgKHJldCkKIAkJCQlyZXR1cm4gcmV0OwogCiAJCQltZXNvbl9jYWxjX3JlZ19hbmRfYml0KGJhbmssIHBpbiwgUkVHX1BVTEwsICZyZWcsICZiaXQpOwotCQkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGRvbWFpbi0+cmVnX3B1bGwsIHJlZywKKwkJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhwYy0+cmVnX3B1bGwsIHJlZywKIAkJCQkJCSBCSVQoYml0KSwgMCk7CiAJCQlpZiAocmV0KQogCQkJCXJldHVybiByZXQ7CkBAIC0zNTQsMTggKzMyMiwxNyBAQAogCiBzdGF0aWMgaW50IG1lc29uX3BpbmNvbmZfZ2V0X3B1bGwoc3RydWN0IG1lc29uX3BpbmN0cmwgKnBjLCB1bnNpZ25lZCBpbnQgcGluKQogewotCXN0cnVjdCBtZXNvbl9kb21haW4gKmRvbWFpbjsKIAlzdHJ1Y3QgbWVzb25fYmFuayAqYmFuazsKIAl1bnNpZ25lZCBpbnQgcmVnLCBiaXQsIHZhbDsKIAlpbnQgcmV0LCBjb25mOwogCi0JcmV0ID0gbWVzb25fZ2V0X2RvbWFpbl9hbmRfYmFuayhwYywgcGluLCAmZG9tYWluLCAmYmFuayk7CisJcmV0ID0gbWVzb25fZ2V0X2JhbmsocGMsIHBpbiwgJmJhbmspOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAltZXNvbl9jYWxjX3JlZ19hbmRfYml0KGJhbmssIHBpbiwgUkVHX1BVTExFTiwgJnJlZywgJmJpdCk7CiAKLQlyZXQgPSByZWdtYXBfcmVhZChkb21haW4tPnJlZ19wdWxsZW4sIHJlZywgJnZhbCk7CisJcmV0ID0gcmVnbWFwX3JlYWQocGMtPnJlZ19wdWxsZW4sIHJlZywgJnZhbCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMzc0LDcgKzM0MSw3IEBACiAJfSBlbHNlIHsKIAkJbWVzb25fY2FsY19yZWdfYW5kX2JpdChiYW5rLCBwaW4sIFJFR19QVUxMLCAmcmVnLCAmYml0KTsKIAotCQlyZXQgPSByZWdtYXBfcmVhZChkb21haW4tPnJlZ19wdWxsLCByZWcsICZ2YWwpOworCQlyZXQgPSByZWdtYXBfcmVhZChwYy0+cmVnX3B1bGwsIHJlZywgJnZhbCk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCkBAIC00NTIsODIgKzQxOSw4MiBAQAogCiBzdGF0aWMgdm9pZCBtZXNvbl9ncGlvX2ZyZWUoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgZ3BpbykKIHsKLQlzdHJ1Y3QgbWVzb25fZG9tYWluICpkb21haW4gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKwlzdHJ1Y3QgbWVzb25fcGluY3RybCAqcGMgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKIAotCXBpbmN0cmxfZnJlZV9ncGlvKGRvbWFpbi0+ZGF0YS0+cGluX2Jhc2UgKyBncGlvKTsKKwlwaW5jdHJsX2ZyZWVfZ3BpbyhwYy0+ZGF0YS0+cGluX2Jhc2UgKyBncGlvKTsKIH0KIAogc3RhdGljIGludCBtZXNvbl9ncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBncGlvKQogewotCXN0cnVjdCBtZXNvbl9kb21haW4gKmRvbWFpbiA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCXN0cnVjdCBtZXNvbl9waW5jdHJsICpwYyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOwogCXVuc2lnbmVkIGludCByZWcsIGJpdCwgcGluOwogCXN0cnVjdCBtZXNvbl9iYW5rICpiYW5rOwogCWludCByZXQ7CiAKLQlwaW4gPSBkb21haW4tPmRhdGEtPnBpbl9iYXNlICsgZ3BpbzsKLQlyZXQgPSBtZXNvbl9nZXRfYmFuayhkb21haW4sIHBpbiwgJmJhbmspOworCXBpbiA9IHBjLT5kYXRhLT5waW5fYmFzZSArIGdwaW87CisJcmV0ID0gbWVzb25fZ2V0X2JhbmsocGMsIHBpbiwgJmJhbmspOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAltZXNvbl9jYWxjX3JlZ19hbmRfYml0KGJhbmssIHBpbiwgUkVHX0RJUiwgJnJlZywgJmJpdCk7CiAKLQlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGRvbWFpbi0+cmVnX2dwaW8sIHJlZywgQklUKGJpdCksIEJJVChiaXQpKTsKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHBjLT5yZWdfZ3BpbywgcmVnLCBCSVQoYml0KSwgQklUKGJpdCkpOwogfQogCiBzdGF0aWMgaW50IG1lc29uX2dwaW9fZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBncGlvLAogCQkJCSAgICAgICBpbnQgdmFsdWUpCiB7Ci0Jc3RydWN0IG1lc29uX2RvbWFpbiAqZG9tYWluID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisJc3RydWN0IG1lc29uX3BpbmN0cmwgKnBjID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CiAJdW5zaWduZWQgaW50IHJlZywgYml0LCBwaW47CiAJc3RydWN0IG1lc29uX2JhbmsgKmJhbms7CiAJaW50IHJldDsKIAotCXBpbiA9IGRvbWFpbi0+ZGF0YS0+cGluX2Jhc2UgKyBncGlvOwotCXJldCA9IG1lc29uX2dldF9iYW5rKGRvbWFpbiwgcGluLCAmYmFuayk7CisJcGluID0gcGMtPmRhdGEtPnBpbl9iYXNlICsgZ3BpbzsKKwlyZXQgPSBtZXNvbl9nZXRfYmFuayhwYywgcGluLCAmYmFuayk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAogCW1lc29uX2NhbGNfcmVnX2FuZF9iaXQoYmFuaywgcGluLCBSRUdfRElSLCAmcmVnLCAmYml0KTsKLQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoZG9tYWluLT5yZWdfZ3BpbywgcmVnLCBCSVQoYml0KSwgMCk7CisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHBjLT5yZWdfZ3BpbywgcmVnLCBCSVQoYml0KSwgMCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAogCW1lc29uX2NhbGNfcmVnX2FuZF9iaXQoYmFuaywgcGluLCBSRUdfT1VULCAmcmVnLCAmYml0KTsKLQlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGRvbWFpbi0+cmVnX2dwaW8sIHJlZywgQklUKGJpdCksCisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhwYy0+cmVnX2dwaW8sIHJlZywgQklUKGJpdCksCiAJCQkJICB2YWx1ZSA/IEJJVChiaXQpIDogMCk7CiB9CiAKIHN0YXRpYyB2b2lkIG1lc29uX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGdwaW8sIGludCB2YWx1ZSkKIHsKLQlzdHJ1Y3QgbWVzb25fZG9tYWluICpkb21haW4gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKwlzdHJ1Y3QgbWVzb25fcGluY3RybCAqcGMgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKIAl1bnNpZ25lZCBpbnQgcmVnLCBiaXQsIHBpbjsKIAlzdHJ1Y3QgbWVzb25fYmFuayAqYmFuazsKIAlpbnQgcmV0OwogCi0JcGluID0gZG9tYWluLT5kYXRhLT5waW5fYmFzZSArIGdwaW87Ci0JcmV0ID0gbWVzb25fZ2V0X2JhbmsoZG9tYWluLCBwaW4sICZiYW5rKTsKKwlwaW4gPSBwYy0+ZGF0YS0+cGluX2Jhc2UgKyBncGlvOworCXJldCA9IG1lc29uX2dldF9iYW5rKHBjLCBwaW4sICZiYW5rKTsKIAlpZiAocmV0KQogCQlyZXR1cm47CiAKIAltZXNvbl9jYWxjX3JlZ19hbmRfYml0KGJhbmssIHBpbiwgUkVHX09VVCwgJnJlZywgJmJpdCk7Ci0JcmVnbWFwX3VwZGF0ZV9iaXRzKGRvbWFpbi0+cmVnX2dwaW8sIHJlZywgQklUKGJpdCksCisJcmVnbWFwX3VwZGF0ZV9iaXRzKHBjLT5yZWdfZ3BpbywgcmVnLCBCSVQoYml0KSwKIAkJCSAgIHZhbHVlID8gQklUKGJpdCkgOiAwKTsKIH0KIAogc3RhdGljIGludCBtZXNvbl9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBncGlvKQogewotCXN0cnVjdCBtZXNvbl9kb21haW4gKmRvbWFpbiA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCXN0cnVjdCBtZXNvbl9waW5jdHJsICpwYyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOwogCXVuc2lnbmVkIGludCByZWcsIGJpdCwgdmFsLCBwaW47CiAJc3RydWN0IG1lc29uX2JhbmsgKmJhbms7CiAJaW50IHJldDsKIAotCXBpbiA9IGRvbWFpbi0+ZGF0YS0+cGluX2Jhc2UgKyBncGlvOwotCXJldCA9IG1lc29uX2dldF9iYW5rKGRvbWFpbiwgcGluLCAmYmFuayk7CisJcGluID0gcGMtPmRhdGEtPnBpbl9iYXNlICsgZ3BpbzsKKwlyZXQgPSBtZXNvbl9nZXRfYmFuayhwYywgcGluLCAmYmFuayk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAogCW1lc29uX2NhbGNfcmVnX2FuZF9iaXQoYmFuaywgcGluLCBSRUdfSU4sICZyZWcsICZiaXQpOwotCXJlZ21hcF9yZWFkKGRvbWFpbi0+cmVnX2dwaW8sIHJlZywgJnZhbCk7CisJcmVnbWFwX3JlYWQocGMtPnJlZ19ncGlvLCByZWcsICZ2YWwpOwogCiAJcmV0dXJuICEhKHZhbCAmIEJJVChiaXQpKTsKIH0KQEAgLTU2MiwzNSArNTI5LDMyIEBACiAKIHN0YXRpYyBpbnQgbWVzb25fZ3Bpb2xpYl9yZWdpc3RlcihzdHJ1Y3QgbWVzb25fcGluY3RybCAqcGMpCiB7Ci0Jc3RydWN0IG1lc29uX2RvbWFpbiAqZG9tYWluOwogCWludCByZXQ7CiAKLQlkb21haW4gPSBwYy0+ZG9tYWluOworCXBjLT5jaGlwLmxhYmVsID0gcGMtPmRhdGEtPm5hbWU7CisJcGMtPmNoaXAucGFyZW50ID0gcGMtPmRldjsKKwlwYy0+Y2hpcC5yZXF1ZXN0ID0gbWVzb25fZ3Bpb19yZXF1ZXN0OworCXBjLT5jaGlwLmZyZWUgPSBtZXNvbl9ncGlvX2ZyZWU7CisJcGMtPmNoaXAuZGlyZWN0aW9uX2lucHV0ID0gbWVzb25fZ3Bpb19kaXJlY3Rpb25faW5wdXQ7CisJcGMtPmNoaXAuZGlyZWN0aW9uX291dHB1dCA9IG1lc29uX2dwaW9fZGlyZWN0aW9uX291dHB1dDsKKwlwYy0+Y2hpcC5nZXQgPSBtZXNvbl9ncGlvX2dldDsKKwlwYy0+Y2hpcC5zZXQgPSBtZXNvbl9ncGlvX3NldDsKKwlwYy0+Y2hpcC5iYXNlID0gcGMtPmRhdGEtPnBpbl9iYXNlOworCXBjLT5jaGlwLm5ncGlvID0gcGMtPmRhdGEtPm51bV9waW5zOworCXBjLT5jaGlwLmNhbl9zbGVlcCA9IGZhbHNlOworCXBjLT5jaGlwLm9mX25vZGUgPSBwYy0+b2Zfbm9kZTsKKwlwYy0+Y2hpcC5vZl9ncGlvX25fY2VsbHMgPSAyOwogCi0JZG9tYWluLT5jaGlwLmxhYmVsID0gZG9tYWluLT5kYXRhLT5uYW1lOwotCWRvbWFpbi0+Y2hpcC5wYXJlbnQgPSBwYy0+ZGV2OwotCWRvbWFpbi0+Y2hpcC5yZXF1ZXN0ID0gbWVzb25fZ3Bpb19yZXF1ZXN0OwotCWRvbWFpbi0+Y2hpcC5mcmVlID0gbWVzb25fZ3Bpb19mcmVlOwotCWRvbWFpbi0+Y2hpcC5kaXJlY3Rpb25faW5wdXQgPSBtZXNvbl9ncGlvX2RpcmVjdGlvbl9pbnB1dDsKLQlkb21haW4tPmNoaXAuZGlyZWN0aW9uX291dHB1dCA9IG1lc29uX2dwaW9fZGlyZWN0aW9uX291dHB1dDsKLQlkb21haW4tPmNoaXAuZ2V0ID0gbWVzb25fZ3Bpb19nZXQ7Ci0JZG9tYWluLT5jaGlwLnNldCA9IG1lc29uX2dwaW9fc2V0OwotCWRvbWFpbi0+Y2hpcC5iYXNlID0gZG9tYWluLT5kYXRhLT5waW5fYmFzZTsKLQlkb21haW4tPmNoaXAubmdwaW8gPSBkb21haW4tPmRhdGEtPm51bV9waW5zOwotCWRvbWFpbi0+Y2hpcC5jYW5fc2xlZXAgPSBmYWxzZTsKLQlkb21haW4tPmNoaXAub2Zfbm9kZSA9IGRvbWFpbi0+b2Zfbm9kZTsKLQlkb21haW4tPmNoaXAub2ZfZ3Bpb19uX2NlbGxzID0gMjsKLQotCXJldCA9IGdwaW9jaGlwX2FkZF9kYXRhKCZkb21haW4tPmNoaXAsIGRvbWFpbik7CisJcmV0ID0gZ3Bpb2NoaXBfYWRkX2RhdGEoJnBjLT5jaGlwLCBwYyk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKHBjLT5kZXYsICJjYW4ndCBhZGQgZ3BpbyBjaGlwICVzXG4iLAotCQkJZG9tYWluLT5kYXRhLT5uYW1lKTsKKwkJCXBjLT5kYXRhLT5uYW1lKTsKIAkJZ290byBmYWlsOwogCX0KIAotCXJldCA9IGdwaW9jaGlwX2FkZF9waW5fcmFuZ2UoJmRvbWFpbi0+Y2hpcCwgZGV2X25hbWUocGMtPmRldiksCi0JCQkJICAgICAwLCBkb21haW4tPmRhdGEtPnBpbl9iYXNlLAotCQkJCSAgICAgZG9tYWluLT5jaGlwLm5ncGlvKTsKKwlyZXQgPSBncGlvY2hpcF9hZGRfcGluX3JhbmdlKCZwYy0+Y2hpcCwgZGV2X25hbWUocGMtPmRldiksCisJCQkJICAgICAwLCBwYy0+ZGF0YS0+cGluX2Jhc2UsCisJCQkJICAgICBwYy0+Y2hpcC5uZ3Bpbyk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKHBjLT5kZXYsICJjYW4ndCBhZGQgcGluIHJhbmdlXG4iKTsKIAkJZ290byBmYWlsOwpAQCAtNTk4LDcgKzU2Miw3IEBACiAKIAlyZXR1cm4gMDsKIGZhaWw6Ci0JZ3Bpb2NoaXBfcmVtb3ZlKCZwYy0+ZG9tYWluLT5jaGlwKTsKKwlncGlvY2hpcF9yZW1vdmUoJnBjLT5jaGlwKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC02MzcsNTggKzYwMSw0NiBAQAogc3RhdGljIGludCBtZXNvbl9waW5jdHJsX3BhcnNlX2R0KHN0cnVjdCBtZXNvbl9waW5jdHJsICpwYywKIAkJCQkgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCXN0cnVjdCBtZXNvbl9kb21haW4gKmRvbWFpbjsKLQlpbnQgbnVtX2RvbWFpbnMgPSAwOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsICpncGlvX25wID0gTlVMTDsKIAogCWZvcl9lYWNoX2NoaWxkX29mX25vZGUobm9kZSwgbnApIHsKIAkJaWYgKCFvZl9maW5kX3Byb3BlcnR5KG5wLCAiZ3Bpby1jb250cm9sbGVyIiwgTlVMTCkpCiAJCQljb250aW51ZTsKLQkJbnVtX2RvbWFpbnMrKzsKKwkJaWYgKGdwaW9fbnApIHsKKwkJCWRldl9lcnIocGMtPmRldiwgIm11bHRpcGxlIGdwaW8gbm9kZXNcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJZ3Bpb19ucCA9IG5wOwogCX0KIAotCWlmIChudW1fZG9tYWlucyAhPSAxKSB7Ci0JCWRldl9lcnIocGMtPmRldiwgIndyb25nIG51bWJlciBvZiBzdWJub2Rlc1xuIik7CisJaWYgKCFncGlvX25wKSB7CisJCWRldl9lcnIocGMtPmRldiwgIm5vIGdwaW8gbm9kZSBmb3VuZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXBjLT5kb21haW4gPSBkZXZtX2t6YWxsb2MocGMtPmRldiwgc2l6ZW9mKHN0cnVjdCBtZXNvbl9kb21haW4pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBjLT5kb21haW4pCi0JCXJldHVybiAtRU5PTUVNOworCXBjLT5vZl9ub2RlID0gZ3Bpb19ucDsKIAotCWRvbWFpbiA9IHBjLT5kb21haW47Ci0JZG9tYWluLT5kYXRhID0gcGMtPmRhdGEtPmRvbWFpbl9kYXRhOworCXBjLT5yZWdfbXV4ID0gbWVzb25fbWFwX3Jlc291cmNlKHBjLCBncGlvX25wLCAibXV4Iik7CisJaWYgKElTX0VSUihwYy0+cmVnX211eCkpIHsKKwkJZGV2X2VycihwYy0+ZGV2LCAibXV4IHJlZ2lzdGVycyBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gUFRSX0VSUihwYy0+cmVnX211eCk7CisJfQogCi0JZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShub2RlLCBucCkgewotCQlpZiAoIW9mX2ZpbmRfcHJvcGVydHkobnAsICJncGlvLWNvbnRyb2xsZXIiLCBOVUxMKSkKLQkJCWNvbnRpbnVlOworCXBjLT5yZWdfcHVsbCA9IG1lc29uX21hcF9yZXNvdXJjZShwYywgZ3Bpb19ucCwgInB1bGwiKTsKKwlpZiAoSVNfRVJSKHBjLT5yZWdfcHVsbCkpIHsKKwkJZGV2X2VycihwYy0+ZGV2LCAicHVsbCByZWdpc3RlcnMgbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIocGMtPnJlZ19wdWxsKTsKKwl9CiAKLQkJZG9tYWluLT5vZl9ub2RlID0gbnA7CisJcGMtPnJlZ19wdWxsZW4gPSBtZXNvbl9tYXBfcmVzb3VyY2UocGMsIGdwaW9fbnAsICJwdWxsLWVuYWJsZSIpOworCS8qIFVzZSBwdWxsIHJlZ2lvbiBpZiBwdWxsLWVuYWJsZSBvbmUgaXMgbm90IHByZXNlbnQgKi8KKwlpZiAoSVNfRVJSKHBjLT5yZWdfcHVsbGVuKSkKKwkJcGMtPnJlZ19wdWxsZW4gPSBwYy0+cmVnX3B1bGw7CiAKLQkJZG9tYWluLT5yZWdfbXV4ID0gbWVzb25fbWFwX3Jlc291cmNlKHBjLCBucCwgIm11eCIpOwotCQlpZiAoSVNfRVJSKGRvbWFpbi0+cmVnX211eCkpIHsKLQkJCWRldl9lcnIocGMtPmRldiwgIm11eCByZWdpc3RlcnMgbm90IGZvdW5kXG4iKTsKLQkJCXJldHVybiBQVFJfRVJSKGRvbWFpbi0+cmVnX211eCk7Ci0JCX0KLQotCQlkb21haW4tPnJlZ19wdWxsID0gbWVzb25fbWFwX3Jlc291cmNlKHBjLCBucCwgInB1bGwiKTsKLQkJaWYgKElTX0VSUihkb21haW4tPnJlZ19wdWxsKSkgewotCQkJZGV2X2VycihwYy0+ZGV2LCAicHVsbCByZWdpc3RlcnMgbm90IGZvdW5kXG4iKTsKLQkJCXJldHVybiBQVFJfRVJSKGRvbWFpbi0+cmVnX3B1bGwpOwotCQl9Ci0KLQkJZG9tYWluLT5yZWdfcHVsbGVuID0gbWVzb25fbWFwX3Jlc291cmNlKHBjLCBucCwgInB1bGwtZW5hYmxlIik7Ci0JCS8qIFVzZSBwdWxsIHJlZ2lvbiBpZiBwdWxsLWVuYWJsZSBvbmUgaXMgbm90IHByZXNlbnQgKi8KLQkJaWYgKElTX0VSUihkb21haW4tPnJlZ19wdWxsZW4pKQotCQkJZG9tYWluLT5yZWdfcHVsbGVuID0gZG9tYWluLT5yZWdfcHVsbDsKLQotCQlkb21haW4tPnJlZ19ncGlvID0gbWVzb25fbWFwX3Jlc291cmNlKHBjLCBucCwgImdwaW8iKTsKLQkJaWYgKElTX0VSUihkb21haW4tPnJlZ19ncGlvKSkgewotCQkJZGV2X2VycihwYy0+ZGV2LCAiZ3BpbyByZWdpc3RlcnMgbm90IGZvdW5kXG4iKTsKLQkJCXJldHVybiBQVFJfRVJSKGRvbWFpbi0+cmVnX2dwaW8pOwotCQl9Ci0KLQkJYnJlYWs7CisJcGMtPnJlZ19ncGlvID0gbWVzb25fbWFwX3Jlc291cmNlKHBjLCBncGlvX25wLCAiZ3BpbyIpOworCWlmIChJU19FUlIocGMtPnJlZ19ncGlvKSkgeworCQlkZXZfZXJyKHBjLT5kZXYsICJncGlvIHJlZ2lzdGVycyBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gUFRSX0VSUihwYy0+cmVnX2dwaW8pOwogCX0KIAogCXJldHVybiAwOwpAQCAtNzI3LDEzICs2NzksNyBAQAogCQlyZXR1cm4gUFRSX0VSUihwYy0+cGNkZXYpOwogCX0KIAotCXJldCA9IG1lc29uX2dwaW9saWJfcmVnaXN0ZXIocGMpOwotCWlmIChyZXQpIHsKLQkJcGluY3RybF91bnJlZ2lzdGVyKHBjLT5wY2Rldik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7CisJcmV0dXJuIG1lc29uX2dwaW9saWJfcmVnaXN0ZXIocGMpOwogfQogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtZXNvbl9waW5jdHJsX2RyaXZlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9tZXNvbi9waW5jdHJsLW1lc29uLmggYi9kcml2ZXJzL3BpbmN0cmwvbWVzb24vcGluY3RybC1tZXNvbi5oCmluZGV4IGQ4OTQ0MmUuLjk4YjUwODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9tZXNvbi9waW5jdHJsLW1lc29uLmgKKysrIGIvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb24uaApAQCAtOTUsNTQgKzk1LDE3IEBACiAJc3RydWN0IG1lc29uX3JlZ19kZXNjIHJlZ3NbTlVNX1JFR107CiB9OwogCi0vKioKLSAqIHN0cnVjdCBtZXNvbl9kb21haW5fZGF0YSAtIGRvbWFpbiBwbGF0Zm9ybSBkYXRhCi0gKgotICogQG5hbWU6CW5hbWUgb2YgdGhlIGRvbWFpbgotICogQGJhbmtzOglzZXQgb2YgYmFua3MgYmVsb25naW5nIHRvIHRoZSBkb21haW4KLSAqIEBudW1fYmFua3M6CW51bWJlciBvZiBiYW5rcyBpbiB0aGUgZG9tYWluCi0gKi8KLXN0cnVjdCBtZXNvbl9kb21haW5fZGF0YSB7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQlzdHJ1Y3QgbWVzb25fYmFuayAqYmFua3M7Ci0JdW5zaWduZWQgaW50IG51bV9iYW5rczsKLQl1bnNpZ25lZCBpbnQgcGluX2Jhc2U7Ci0JdW5zaWduZWQgaW50IG51bV9waW5zOwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgbWVzb25fZG9tYWluCi0gKgotICogQHJlZ19tdXg6CXJlZ2lzdGVycyBmb3IgbXV4IHNldHRpbmdzCi0gKiBAcmVnX3B1bGxlbjoJcmVnaXN0ZXJzIGZvciBwdWxsLWVuYWJsZSBzZXR0aW5ncwotICogQHJlZ19wdWxsOglyZWdpc3RlcnMgZm9yIHB1bGwgc2V0dGluZ3MKLSAqIEByZWdfZ3BpbzoJcmVnaXN0ZXJzIGZvciBncGlvIHNldHRpbmdzCi0gKiBAY2hpcDoJZ3BpbyBjaGlwIGFzc29jaWF0ZWQgd2l0aCB0aGUgZG9tYWluCi0gKiBAZGF0YTsJcGxhdGZvcm0gZGF0YSBmb3IgdGhlIGRvbWFpbgotICogQG5vZGU6CWRldmljZSB0cmVlIG5vZGUgZm9yIHRoZSBkb21haW4KLSAqCi0gKiBBIGRvbWFpbiByZXByZXNlbnRzIGEgc2V0IG9mIGJhbmtzIGNvbnRyb2xsZWQgYnkgdGhlIHNhbWUgc2V0IG9mCi0gKiByZWdpc3RlcnMuCi0gKi8KLXN0cnVjdCBtZXNvbl9kb21haW4gewotCXN0cnVjdCByZWdtYXAgKnJlZ19tdXg7Ci0Jc3RydWN0IHJlZ21hcCAqcmVnX3B1bGxlbjsKLQlzdHJ1Y3QgcmVnbWFwICpyZWdfcHVsbDsKLQlzdHJ1Y3QgcmVnbWFwICpyZWdfZ3BpbzsKLQotCXN0cnVjdCBncGlvX2NoaXAgY2hpcDsKLQlzdHJ1Y3QgbWVzb25fZG9tYWluX2RhdGEgKmRhdGE7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlOwotfTsKLQogc3RydWN0IG1lc29uX3BpbmN0cmxfZGF0YSB7CisJY29uc3QgY2hhciAqbmFtZTsKIAljb25zdCBzdHJ1Y3QgcGluY3RybF9waW5fZGVzYyAqcGluczsKIAlzdHJ1Y3QgbWVzb25fcG14X2dyb3VwICpncm91cHM7CiAJc3RydWN0IG1lc29uX3BteF9mdW5jICpmdW5jczsKLQlzdHJ1Y3QgbWVzb25fZG9tYWluX2RhdGEgKmRvbWFpbl9kYXRhOworCXVuc2lnbmVkIGludCBwaW5fYmFzZTsKIAl1bnNpZ25lZCBpbnQgbnVtX3BpbnM7CiAJdW5zaWduZWQgaW50IG51bV9ncm91cHM7CiAJdW5zaWduZWQgaW50IG51bV9mdW5jczsKKwlzdHJ1Y3QgbWVzb25fYmFuayAqYmFua3M7CisJdW5zaWduZWQgaW50IG51bV9iYW5rczsKIH07CiAKIHN0cnVjdCBtZXNvbl9waW5jdHJsIHsKQEAgLTE1MCw3ICsxMTMsMTIgQEAKIAlzdHJ1Y3QgcGluY3RybF9kZXYgKnBjZGV2OwogCXN0cnVjdCBwaW5jdHJsX2Rlc2MgZGVzYzsKIAlzdHJ1Y3QgbWVzb25fcGluY3RybF9kYXRhICpkYXRhOwotCXN0cnVjdCBtZXNvbl9kb21haW4gKmRvbWFpbjsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdfbXV4OworCXN0cnVjdCByZWdtYXAgKnJlZ19wdWxsZW47CisJc3RydWN0IHJlZ21hcCAqcmVnX3B1bGw7CisJc3RydWN0IHJlZ21hcCAqcmVnX2dwaW87CisJc3RydWN0IGdwaW9fY2hpcCBjaGlwOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZTsKIH07CiAKICNkZWZpbmUgUElOKHgsIGIpCShiICsgeCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9tZXNvbi9waW5jdHJsLW1lc29uOC5jIGIvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb244LmMKaW5kZXggMzJkZTE5MS4uMDdmMWNiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb244LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb244LmMKQEAgLTkzMSwzOCArOTMxLDI4IEBACiAJQkFOSygiQU8iLCAgIFBJTihHUElPQU9fMCwgQU9fT0ZGKSwgUElOKEdQSU9fVEVTVF9OLCBBT19PRkYpLCAwLCAgMCwgIDAsIDE2LCAgMCwgIDAsICAwLCAxNiwgIDEsICAwKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbWVzb25fZG9tYWluX2RhdGEgbWVzb244X2NidXNfZG9tYWluX2RhdGEgPSB7Ci0JLm5hbWUJCT0gImNidXMtYmFua3MiLAotCS5iYW5rcwkJPSBtZXNvbjhfY2J1c19iYW5rcywKLQkubnVtX2JhbmtzCT0gQVJSQVlfU0laRShtZXNvbjhfY2J1c19iYW5rcyksCi0JLnBpbl9iYXNlCT0gMCwKLQkubnVtX3BpbnMJPSAxMjAsCi19OwotCi1zdGF0aWMgc3RydWN0IG1lc29uX2RvbWFpbl9kYXRhIG1lc29uOF9hb2J1c19kb21haW5fZGF0YSA9IHsKLQkubmFtZQkJPSAiYW8tYmFuayIsCi0JLmJhbmtzCQk9IG1lc29uOF9hb2J1c19iYW5rcywKLQkubnVtX2JhbmtzCT0gQVJSQVlfU0laRShtZXNvbjhfYW9idXNfYmFua3MpLAotCS5waW5fYmFzZQk9IDEyMCwKLQkubnVtX3BpbnMJPSAxNiwKLX07Ci0KIHN0cnVjdCBtZXNvbl9waW5jdHJsX2RhdGEgbWVzb244X2NidXNfcGluY3RybF9kYXRhID0geworCS5uYW1lCQk9ICJjYnVzLWJhbmtzIiwKKwkucGluX2Jhc2UJPSAwLAogCS5waW5zCQk9IG1lc29uOF9jYnVzX3BpbnMsCiAJLmdyb3VwcwkJPSBtZXNvbjhfY2J1c19ncm91cHMsCiAJLmZ1bmNzCQk9IG1lc29uOF9jYnVzX2Z1bmN0aW9ucywKLQkuZG9tYWluX2RhdGEJPSAmbWVzb244X2NidXNfZG9tYWluX2RhdGEsCisJLmJhbmtzCQk9IG1lc29uOF9jYnVzX2JhbmtzLAogCS5udW1fcGlucwk9IEFSUkFZX1NJWkUobWVzb244X2NidXNfcGlucyksCiAJLm51bV9ncm91cHMJPSBBUlJBWV9TSVpFKG1lc29uOF9jYnVzX2dyb3VwcyksCiAJLm51bV9mdW5jcwk9IEFSUkFZX1NJWkUobWVzb244X2NidXNfZnVuY3Rpb25zKSwKKwkubnVtX2JhbmtzCT0gQVJSQVlfU0laRShtZXNvbjhfY2J1c19iYW5rcyksCiB9OwogCiBzdHJ1Y3QgbWVzb25fcGluY3RybF9kYXRhIG1lc29uOF9hb2J1c19waW5jdHJsX2RhdGEgPSB7CisJLm5hbWUJCT0gImFvLWJhbmsiLAorCS5waW5fYmFzZQk9IDEyMCwKIAkucGlucwkJPSBtZXNvbjhfYW9idXNfcGlucywKIAkuZ3JvdXBzCQk9IG1lc29uOF9hb2J1c19ncm91cHMsCiAJLmZ1bmNzCQk9IG1lc29uOF9hb2J1c19mdW5jdGlvbnMsCi0JLmRvbWFpbl9kYXRhCT0gJm1lc29uOF9hb2J1c19kb21haW5fZGF0YSwKKwkuYmFua3MJCT0gbWVzb244X2FvYnVzX2JhbmtzLAogCS5udW1fcGlucwk9IEFSUkFZX1NJWkUobWVzb244X2FvYnVzX3BpbnMpLAogCS5udW1fZ3JvdXBzCT0gQVJSQVlfU0laRShtZXNvbjhfYW9idXNfZ3JvdXBzKSwKIAkubnVtX2Z1bmNzCT0gQVJSQVlfU0laRShtZXNvbjhfYW9idXNfZnVuY3Rpb25zKSwKKwkubnVtX2JhbmtzCT0gQVJSQVlfU0laRShtZXNvbjhfYW9idXNfYmFua3MpLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9tZXNvbi9waW5jdHJsLW1lc29uOGIuYyBiL2RyaXZlcnMvcGluY3RybC9tZXNvbi9waW5jdHJsLW1lc29uOGIuYwppbmRleCA4NzRmMmVkLi43NmYwNzdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvbWVzb24vcGluY3RybC1tZXNvbjhiLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb244Yi5jCkBAIC04OTYsMzggKzg5NiwyOCBAQAogCUJBTksoIkFPIiwgICBQSU4oR1BJT0FPXzAsIEFPX09GRiksIFBJTihHUElPX1RFU1RfTiwgQU9fT0ZGKSwgMCwgIDAsICAwLCAxNiwgIDAsICAwLCAgMCwgMTYsICAxLCAgMCksCiB9OwogCi1zdGF0aWMgc3RydWN0IG1lc29uX2RvbWFpbl9kYXRhIG1lc29uOGJfY2J1c19kb21haW5fZGF0YSA9IHsKLQkubmFtZQkJPSAiY2J1cy1iYW5rcyIsCi0JLmJhbmtzCQk9IG1lc29uOGJfY2J1c19iYW5rcywKLQkubnVtX2JhbmtzCT0gQVJSQVlfU0laRShtZXNvbjhiX2NidXNfYmFua3MpLAotCS5waW5fYmFzZQk9IDAsCi0JLm51bV9waW5zCT0gMTMwLAotfTsKLQotc3RhdGljIHN0cnVjdCBtZXNvbl9kb21haW5fZGF0YSBtZXNvbjhiX2FvYnVzX2RvbWFpbl9kYXRhID0gewotCS5uYW1lCQk9ICJhb2J1cy1iYW5rcyIsCi0JLmJhbmtzCQk9IG1lc29uOGJfYW9idXNfYmFua3MsCi0JLm51bV9iYW5rcwk9IEFSUkFZX1NJWkUobWVzb244Yl9hb2J1c19iYW5rcyksCi0JLnBpbl9iYXNlCT0gMTMwLAotCS5udW1fcGlucwk9IDE2LAotfTsKLQogc3RydWN0IG1lc29uX3BpbmN0cmxfZGF0YSBtZXNvbjhiX2NidXNfcGluY3RybF9kYXRhID0geworCS5uYW1lCQk9ICJjYnVzLWJhbmtzIiwKKwkucGluX2Jhc2UJPSAwLAogCS5waW5zCQk9IG1lc29uOGJfY2J1c19waW5zLAogCS5ncm91cHMJCT0gbWVzb244Yl9jYnVzX2dyb3VwcywKIAkuZnVuY3MJCT0gbWVzb244Yl9jYnVzX2Z1bmN0aW9ucywKLQkuZG9tYWluX2RhdGEJPSAmbWVzb244Yl9jYnVzX2RvbWFpbl9kYXRhLAorCS5iYW5rcwkJPSBtZXNvbjhiX2NidXNfYmFua3MsCiAJLm51bV9waW5zCT0gQVJSQVlfU0laRShtZXNvbjhiX2NidXNfcGlucyksCiAJLm51bV9ncm91cHMJPSBBUlJBWV9TSVpFKG1lc29uOGJfY2J1c19ncm91cHMpLAogCS5udW1fZnVuY3MJPSBBUlJBWV9TSVpFKG1lc29uOGJfY2J1c19mdW5jdGlvbnMpLAorCS5udW1fYmFua3MJPSBBUlJBWV9TSVpFKG1lc29uOGJfY2J1c19iYW5rcyksCiB9OwogCiBzdHJ1Y3QgbWVzb25fcGluY3RybF9kYXRhIG1lc29uOGJfYW9idXNfcGluY3RybF9kYXRhID0geworCS5uYW1lCQk9ICJhb2J1cy1iYW5rcyIsCisJLnBpbl9iYXNlCT0gMTMwLAogCS5waW5zCQk9IG1lc29uOGJfYW9idXNfcGlucywKIAkuZ3JvdXBzCQk9IG1lc29uOGJfYW9idXNfZ3JvdXBzLAogCS5mdW5jcwkJPSBtZXNvbjhiX2FvYnVzX2Z1bmN0aW9ucywKLQkuZG9tYWluX2RhdGEJPSAmbWVzb244Yl9hb2J1c19kb21haW5fZGF0YSwKKwkuYmFua3MJCT0gbWVzb244Yl9hb2J1c19iYW5rcywKIAkubnVtX3BpbnMJPSBBUlJBWV9TSVpFKG1lc29uOGJfYW9idXNfcGlucyksCiAJLm51bV9ncm91cHMJPSBBUlJBWV9TSVpFKG1lc29uOGJfYW9idXNfZ3JvdXBzKSwKIAkubnVtX2Z1bmNzCT0gQVJSQVlfU0laRShtZXNvbjhiX2FvYnVzX2Z1bmN0aW9ucyksCisJLm51bV9iYW5rcwk9IEFSUkFZX1NJWkUobWVzb244Yl9hb2J1c19iYW5rcyksCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL25vbWFkaWsvcGluY3RybC1hYng1MDAuYyBiL2RyaXZlcnMvcGluY3RybC9ub21hZGlrL3BpbmN0cmwtYWJ4NTAwLmMKaW5kZXggN2QzNDNjMi4uZjk1MDAxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL25vbWFkaWsvcGluY3RybC1hYng1MDAuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvbm9tYWRpay9waW5jdHJsLWFieDUwMC5jCkBAIC00LDYgKzQsOCBAQAogICogQXV0aG9yOiBQYXRyaWNlIENob3RhcmQgPHBhdHJpY2UuY2hvdGFyZEBzdC5jb20+CiAgKiBMaWNlbnNlIHRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSB2ZXJzaW9uIDIKICAqCisgKiBEcml2ZXIgYWxsb3dzIHRvIHVzZSBBeEI1eHggdW51c2VkIHBpbnMgdG8gYmUgdXNlZCBhcyBHUElPCisgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KQEAgLTEyLDcgKzE0LDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KQEAgLTEyNjksOCArMTI3MCwzIEBACiAJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYWJ4NTAwX2dwaW9fZHJpdmVyKTsKIH0KIGNvcmVfaW5pdGNhbGwoYWJ4NTAwX2dwaW9faW5pdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIlBhdHJpY2UgQ2hvdGFyZCA8cGF0cmljZS5jaG90YXJkQHN0LmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGFsbG93cyB0byB1c2UgQXhCNXh4IHVudXNlZCBwaW5zIHRvIGJlIHVzZWQgYXMgR1BJTyIpOwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTphYng1MDAtZ3BpbyIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL25vbWFkaWsvcGluY3RybC1ub21hZGlrLmMgYi9kcml2ZXJzL3BpbmN0cmwvbm9tYWRpay9waW5jdHJsLW5vbWFkaWsuYwppbmRleCAzNWY2MjE4Li5kMzE4Y2EwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvbm9tYWRpay9waW5jdHJsLW5vbWFkaWsuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvbm9tYWRpay9waW5jdHJsLW5vbWFkaWsuYwpAQCAtMTEsNyArMTEsNiBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0xMTEwLDEwICsxMTA5LDggQEAKIAkJcmV0dXJuIFBUUl9FUlIobm1rX2NoaXApOwogCX0KIAotCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJzdCxzdXBwb3J0cy1zbGVlcG1vZGUiLCBOVUxMKSkKLQkJc3VwcG9ydHNfc2xlZXBtb2RlID0gdHJ1ZTsKLQllbHNlCi0JCXN1cHBvcnRzX3NsZWVwbW9kZSA9IGZhbHNlOworCXN1cHBvcnRzX3NsZWVwbW9kZSA9CisJCW9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgInN0LHN1cHBvcnRzLXNsZWVwbW9kZSIpOwogCiAJLyogQ29ycmVjdCBwbGF0Zm9ybSBkZXZpY2UgSUQgKi8KIAlkZXYtPmlkID0gbm1rX2NoaXAtPmJhbms7CkBAIC0xMTgwLDcgKzExNzcsNyBAQAogCQkJCSAgIGlycWNoaXAsCiAJCQkJICAgMCwKIAkJCQkgICBoYW5kbGVfZWRnZV9pcnEsCi0JCQkJICAgSVJRX1RZUEVfRURHRV9GQUxMSU5HKTsKKwkJCQkgICBJUlFfVFlQRV9OT05FKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJmRldi0+ZGV2LCAiY291bGQgbm90IGFkZCBpcnFjaGlwXG4iKTsKIAkJZ3Bpb2NoaXBfcmVtb3ZlKCZubWtfY2hpcC0+Y2hpcCk7CkBAIC0xOTg1LDcgKzE5ODIsMyBAQAogCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm5ta19waW5jdHJsX2RyaXZlcik7CiB9CiBjb3JlX2luaXRjYWxsKG5ta19waW5jdHJsX2luaXQpOwotCi1NT0RVTEVfQVVUSE9SKCJQcmFmdWxsYSBXQURBU0tBUiBhbmQgQWxlc3NhbmRybyBSdWJpbmkiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTm9tYWRpayBHUElPIERyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYW1kLmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hbWQuYwppbmRleCA2MzRiNGQzLi5hZWEzMTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hbWQuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hbWQuYwpAQCAtNDMsMTcgKzQzLDYgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2Rldi0+bG9jaywgZmxhZ3MpOwogCXBpbl9yZWcgPSByZWFkbChncGlvX2Rldi0+YmFzZSArIG9mZnNldCAqIDQpOwotCS8qCi0JICogU3VwcG9zZSBCSU9TIG9yIEJvb3Rsb2FkZXIgc2V0cyBzcGVjaWZpYyBkZWJvdW5jZSBmb3IgdGhlCi0JICogR1BJTy4gaWYgbm90LCBzZXQgZGVib3VuY2UgdG8gYmUgIDIuNzVtcyBhbmQgcmVtb3ZlIGdsaXRjaC4KLQkqLwotCWlmICgocGluX3JlZyAmIERCX1RNUl9PVVRfTUFTSykgPT0gMCkgewotCQlwaW5fcmVnIHw9IDB4ZjsKLQkJcGluX3JlZyB8PSBCSVQoREJfVE1SX09VVF9VTklUX09GRik7Ci0JCXBpbl9yZWcgfD0gREJfVFlQRV9SRU1PVkVfR0xJVENIIDw8IERCX0NOVFJMX09GRjsKLQkJcGluX3JlZyAmPSB+QklUKERCX1RNUl9MQVJHRV9PRkYpOwotCX0KLQogCXBpbl9yZWcgJj0gfkJJVChPVVRQVVRfRU5BQkxFX09GRik7CiAJd3JpdGVsKHBpbl9yZWcsIGdwaW9fZGV2LT5iYXNlICsgb2Zmc2V0ICogNCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19kZXYtPmxvY2ssIGZsYWdzKTsKQEAgLTMyNiwxNSArMzE1LDYgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2Rldi0+bG9jaywgZmxhZ3MpOwogCXBpbl9yZWcgPSByZWFkbChncGlvX2Rldi0+YmFzZSArIChkLT5od2lycSkqNCk7Ci0JLyoKLQkJU3VwcG9zZSBCSU9TIG9yIEJvb3Rsb2FkZXIgc2V0cyBzcGVjaWZpYyBkZWJvdW5jZSBmb3IgdGhlCi0JCUdQSU8uIGlmIG5vdCwgc2V0IGRlYm91bmNlIHRvIGJlICAyLjc1bXMuCi0JKi8KLQlpZiAoKHBpbl9yZWcgJiBEQl9UTVJfT1VUX01BU0spID09IDApIHsKLQkJcGluX3JlZyB8PSAweGY7Ci0JCXBpbl9yZWcgfD0gQklUKERCX1RNUl9PVVRfVU5JVF9PRkYpOwotCQlwaW5fcmVnICY9IH5CSVQoREJfVE1SX0xBUkdFX09GRik7Ci0JfQogCXBpbl9yZWcgfD0gQklUKElOVEVSUlVQVF9FTkFCTEVfT0ZGKTsKIAlwaW5fcmVnIHw9IEJJVChJTlRFUlJVUFRfTUFTS19PRkYpOwogCXdyaXRlbChwaW5fcmVnLCBncGlvX2Rldi0+YmFzZSArIChkLT5od2lycSkqNCk7CkBAIC00MDMsMTIgKzM4MywyNiBAQAogCWludCByZXQgPSAwOwogCXUzMiBwaW5fcmVnOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYm9vbCBsZXZlbF90cmlnOworCXUzMiBhY3RpdmVfbGV2ZWw7CiAJc3RydWN0IGdwaW9fY2hpcCAqZ2MgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKIAlzdHJ1Y3QgYW1kX2dwaW8gKmdwaW9fZGV2ID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoZ2MpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fZGV2LT5sb2NrLCBmbGFncyk7CiAJcGluX3JlZyA9IHJlYWRsKGdwaW9fZGV2LT5iYXNlICsgKGQtPmh3aXJxKSo0KTsKIAorCS8qCisJICogV2hlbiBsZXZlbF90cmlnIGlzIHNldCBFREdFIGFuZCBhY3RpdmVfbGV2ZWwgaXMgc2V0IEhJR0ggaW4gQklPUworCSAqIGRlZmF1bHQgc2V0dGluZ3MsIGlnbm9yZSBpbmNvbWluZyBzZXR0aW5ncyBmcm9tIGNsaWVudCBhbmQgdXNlCisJICogQklPUyBzZXR0aW5ncyB0byBjb25maWd1cmUgR1BJTyByZWdpc3Rlci4KKwkgKi8KKwlsZXZlbF90cmlnID0gIShwaW5fcmVnICYgKExFVkVMX1RSSUdHRVIgPDwgTEVWRUxfVFJJR19PRkYpKTsKKwlhY3RpdmVfbGV2ZWwgPSBwaW5fcmVnICYgKEFDVElWRV9MRVZFTF9NQVNLIDw8IEFDVElWRV9MRVZFTF9PRkYpOworCisJaWYobGV2ZWxfdHJpZyAmJgorCSAgICgoYWN0aXZlX2xldmVsID4+IEFDVElWRV9MRVZFTF9PRkYpID09IEFDVElWRV9ISUdIKSkKKwkJdHlwZSA9IElSUV9UWVBFX0VER0VfRkFMTElORzsKKwogCXN3aXRjaCAodHlwZSAmIElSUV9UWVBFX1NFTlNFX01BU0spIHsKIAljYXNlIElSUV9UWVBFX0VER0VfUklTSU5HOgogCQlwaW5fcmVnICY9IH5CSVQoTEVWRUxfVFJJR19PRkYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYXQ5MS5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYXQ5MS5jCmluZGV4IDgwZGFlYWQuLjlmMDkwNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWF0OTEuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hdDkxLmMKQEAgLTE2MTQsNyArMTYxNCw3IEBACiAJCQkJICAgJmdwaW9faXJxY2hpcCwKIAkJCQkgICAwLAogCQkJCSAgIGhhbmRsZV9lZGdlX2lycSwKLQkJCQkgICBJUlFfVFlQRV9FREdFX0JPVEgpOworCQkJCSAgIElSUV9UWVBFX05PTkUpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiYXQ5MV9ncGlvLiVkOiBDb3VsZG4ndCBhZGQgaXJxY2hpcCB0byBncGlvY2hpcC5cbiIsCiAJCQlhdDkxX2dwaW8tPnBpb2NfaWR4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXBhbG1hcy5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtcGFsbWFzLmMKaW5kZXggOGVkYjNmOGMuLmEzMDE0NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXBhbG1hcy5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXBhbG1hcy5jCkBAIC0xMDA0LDkgKzEwMDQsNyBAQAogCWJvb2wgZW5hYmxlX2R2ZnMyID0gZmFsc2U7CiAKIAlpZiAocGRldi0+ZGV2Lm9mX25vZGUpIHsKLQkJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7Ci0JCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKHBhbG1hc19waW5jdHJsX29mX21hdGNoLCAmcGRldi0+ZGV2KTsKLQkJcGluY3RybF9kYXRhID0gbWF0Y2gtPmRhdGE7CisJCXBpbmN0cmxfZGF0YSA9IG9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YSgmcGRldi0+ZGV2KTsKIAkJZW5hYmxlX2R2ZnMxID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKHBkZXYtPmRldi5vZl9ub2RlLAogCQkJCQkidGkscGFsbWFzLWVuYWJsZS1kdmZzMSIpOwogCQllbmFibGVfZHZmczIgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wocGRldi0+ZGV2Lm9mX25vZGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1waXN0YWNoaW8uYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXBpc3RhY2hpby5jCmluZGV4IGM2ZDQxMGUuLjU1Mzc1YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXBpc3RhY2hpby5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXBpc3RhY2hpby5jCkBAIC04MDksMTcgKzgwOSwxNyBAQAogCQkJICAgUEFEU19GVU5DVElPTl9TRUxFQ1QyLCAxMiwgMHgzKSwKIAlNRklPX01VWF9QSU5fR1JPVVAoODMsIE1JUFNfUExMX0xPQ0ssIE1JUFNfVFJBQ0VfREFUQSwgVVNCX0RFQlVHLAogCQkJICAgUEFEU19GVU5DVElPTl9TRUxFQ1QyLCAxNCwgMHgzKSwKLQlNRklPX01VWF9QSU5fR1JPVVAoODQsIFNZU19QTExfTE9DSywgTUlQU19UUkFDRV9EQVRBLCBVU0JfREVCVUcsCisJTUZJT19NVVhfUElOX0dST1VQKDg0LCBBVURJT19QTExfTE9DSywgTUlQU19UUkFDRV9EQVRBLCBVU0JfREVCVUcsCiAJCQkgICBQQURTX0ZVTkNUSU9OX1NFTEVDVDIsIDE2LCAweDMpLAotCU1GSU9fTVVYX1BJTl9HUk9VUCg4NSwgV0lGSV9QTExfTE9DSywgTUlQU19UUkFDRV9EQVRBLCBTREhPU1RfREVCVUcsCisJTUZJT19NVVhfUElOX0dST1VQKDg1LCBSUFVfVl9QTExfTE9DSywgTUlQU19UUkFDRV9EQVRBLCBTREhPU1RfREVCVUcsCiAJCQkgICBQQURTX0ZVTkNUSU9OX1NFTEVDVDIsIDE4LCAweDMpLAotCU1GSU9fTVVYX1BJTl9HUk9VUCg4NiwgQlRfUExMX0xPQ0ssIE1JUFNfVFJBQ0VfREFUQSwgU0RIT1NUX0RFQlVHLAorCU1GSU9fTVVYX1BJTl9HUk9VUCg4NiwgUlBVX0xfUExMX0xPQ0ssIE1JUFNfVFJBQ0VfREFUQSwgU0RIT1NUX0RFQlVHLAogCQkJICAgUEFEU19GVU5DVElPTl9TRUxFQ1QyLCAyMCwgMHgzKSwKLQlNRklPX01VWF9QSU5fR1JPVVAoODcsIFJQVV9WX1BMTF9MT0NLLCBEUkVRMiwgU09DSUZfREVCVUcsCisJTUZJT19NVVhfUElOX0dST1VQKDg3LCBTWVNfUExMX0xPQ0ssIERSRVEyLCBTT0NJRl9ERUJVRywKIAkJCSAgIFBBRFNfRlVOQ1RJT05fU0VMRUNUMiwgMjIsIDB4MyksCi0JTUZJT19NVVhfUElOX0dST1VQKDg4LCBSUFVfTF9QTExfTE9DSywgRFJFUTMsIFNPQ0lGX0RFQlVHLAorCU1GSU9fTVVYX1BJTl9HUk9VUCg4OCwgV0lGSV9QTExfTE9DSywgRFJFUTMsIFNPQ0lGX0RFQlVHLAogCQkJICAgUEFEU19GVU5DVElPTl9TRUxFQ1QyLCAyNCwgMHgzKSwKLQlNRklPX01VWF9QSU5fR1JPVVAoODksIEFVRElPX1BMTF9MT0NLLCBEUkVRNCwgRFJFUTUsCisJTUZJT19NVVhfUElOX0dST1VQKDg5LCBCVF9QTExfTE9DSywgRFJFUTQsIERSRVE1LAogCQkJICAgUEFEU19GVU5DVElPTl9TRUxFQ1QyLCAyNiwgMHgzKSwKIAlQSU5fR1JPVVAoVENLLCAidGNrIiksCiAJUElOX0dST1VQKFRSU1ROLCAidHJzdG4iKSwKQEAgLTE0MzIsNyArMTQzMiw2IEBACiB7CiAJc3RydWN0IHBpc3RhY2hpb19waW5jdHJsICpwY3RsOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCWludCByZXQ7CiAKIAlwY3RsID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcGN0bCksIEdGUF9LRVJORUwpOwogCWlmICghcGN0bCkKQEAgLTE0NjQsMTMgKzE0NjMsNyBAQAogCQlyZXR1cm4gUFRSX0VSUihwY3RsLT5wY3RsZGV2KTsKIAl9CiAKLQlyZXQgPSBwaXN0YWNoaW9fZ3Bpb19yZWdpc3RlcihwY3RsKTsKLQlpZiAocmV0IDwgMCkgewotCQlwaW5jdHJsX3VucmVnaXN0ZXIocGN0bC0+cGN0bGRldik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHBpc3RhY2hpb19ncGlvX3JlZ2lzdGVyKHBjdGwpOwogfQogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwaXN0YWNoaW9fcGluY3RybF9kcml2ZXIgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1yb2NrY2hpcC5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtcm9ja2NoaXAuYwppbmRleCA0NDkwMmM2Li40OWJmN2RjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1yb2NrY2hpcC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXJvY2tjaGlwLmMKQEAgLTIzLDcgKzIzLDcgQEAKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgpAQCAtMjcwNCw3ICsyNzA0LDYgQEAKIAkJLmRhdGEgPSAodm9pZCAqKSZyazMzOTlfcGluX2N0cmwgfSwKIAl7fSwKIH07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCByb2NrY2hpcF9waW5jdHJsX2R0X21hdGNoKTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcm9ja2NoaXBfcGluY3RybF9kcml2ZXIgPSB7CiAJLnByb2JlCQk9IHJvY2tjaGlwX3BpbmN0cmxfcHJvYmUsCkBAIC0yNzIwLDcgKzI3MTksMyBAQAogCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnJvY2tjaGlwX3BpbmN0cmxfZHJpdmVyKTsKIH0KIHBvc3Rjb3JlX2luaXRjYWxsKHJvY2tjaGlwX3BpbmN0cmxfZHJ2X3JlZ2lzdGVyKTsKLQotTU9EVUxFX0FVVEhPUigiSGVpa28gU3R1ZWJuZXIgPGhlaWtvQHNudGVjaC5kZT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiUm9ja2NoaXAgcGluY3RybCBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXN0LmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1zdC5jCmluZGV4IDBkZTFjNjcuLjk5ZGE0Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXN0LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtc3QuYwpAQCAtMzM1LDYxICszMzUsMjUgQEAKIH07CiAKIC8qIFNPQyBzcGVjaWZpYyBkYXRhICovCi0vKiBTVGlINDE1IGRhdGEgKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3RpaDQxNV9pbnB1dF9kZWxheXNbXSA9IHswLCA1MDAsIDEwMDAsIDE1MDB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzdGloNDE1X291dHB1dF9kZWxheXNbXSA9IHswLCAxMDAwLCAyMDAwLCAzMDAwfTsKIAotI2RlZmluZSBTVElINDE1X1BDVFJMX0NPTU1PTl9EQVRBCQkJCVwKLQkucnRfc3R5bGUJPSBzdF9yZXRpbWVfc3R5bGVfcGFja2VkLAkJXAotCS5pbnB1dF9kZWxheXMJPSBzdGloNDE1X2lucHV0X2RlbGF5cywJCQlcCi0JLm5pbnB1dF9kZWxheXMJPSBBUlJBWV9TSVpFKHN0aWg0MTVfaW5wdXRfZGVsYXlzKSwJXAotCS5vdXRwdXRfZGVsYXlzID0gc3RpaDQxNV9vdXRwdXRfZGVsYXlzLAkJCVwKLQkubm91dHB1dF9kZWxheXMgPSBBUlJBWV9TSVpFKHN0aWg0MTVfb3V0cHV0X2RlbGF5cykKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzdF9wY3RsX2RhdGEgIHN0aWg0MTVfc2JjX2RhdGEgPSB7Ci0JU1RJSDQxNV9QQ1RSTF9DT01NT05fREFUQSwKLQkuYWx0ID0gMCwgLm9lID0gNSwgLnB1ID0gNywgLm9kID0gOSwgLnJ0ID0gMTYsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN0X3BjdGxfZGF0YSAgc3RpaDQxNV9mcm9udF9kYXRhID0gewotCVNUSUg0MTVfUENUUkxfQ09NTU9OX0RBVEEsCi0JLmFsdCA9IDAsIC5vZSA9IDgsIC5wdSA9IDEwLCAub2QgPSAxMiwgLnJ0ID0gMTYsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN0X3BjdGxfZGF0YSAgc3RpaDQxNV9yZWFyX2RhdGEgPSB7Ci0JU1RJSDQxNV9QQ1RSTF9DT01NT05fREFUQSwKLQkuYWx0ID0gMCwgLm9lID0gNiwgLnB1ID0gOCwgLm9kID0gMTAsIC5ydCA9IDM4LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzdF9wY3RsX2RhdGEgIHN0aWg0MTVfbGVmdF9kYXRhID0gewotCVNUSUg0MTVfUENUUkxfQ09NTU9OX0RBVEEsCi0JLmFsdCA9IDAsIC5vZSA9IDMsIC5wdSA9IDQsIC5vZCA9IDUsIC5ydCA9IDYsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN0X3BjdGxfZGF0YSAgc3RpaDQxNV9yaWdodF9kYXRhID0gewotCVNUSUg0MTVfUENUUkxfQ09NTU9OX0RBVEEsCi0JLmFsdCA9IDAsIC5vZSA9IDUsIC5wdSA9IDcsIC5vZCA9IDksIC5ydCA9IDExLAotfTsKLQotLyogU1RpSDQxNiBkYXRhICovCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHN0aWg0MTZfZGVsYXlzW10gPSB7MCwgMzAwLCA1MDAsIDc1MCwgMTAwMCwgMTI1MCwKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3RpaDQwN19kZWxheXNbXSA9IHswLCAzMDAsIDUwMCwgNzUwLCAxMDAwLCAxMjUwLAogCQkJMTUwMCwgMTc1MCwgMjAwMCwgMjI1MCwgMjUwMCwgMjc1MCwgMzAwMCwgMzI1MCB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN0X3BjdGxfZGF0YSAgc3RpaDQxNl9kYXRhID0gewotCS5ydF9zdHlsZQk9IHN0X3JldGltZV9zdHlsZV9kZWRpY2F0ZWQsCi0JLmlucHV0X2RlbGF5cwk9IHN0aWg0MTZfZGVsYXlzLAotCS5uaW5wdXRfZGVsYXlzCT0gQVJSQVlfU0laRShzdGloNDE2X2RlbGF5cyksCi0JLm91dHB1dF9kZWxheXMJPSBzdGloNDE2X2RlbGF5cywKLQkubm91dHB1dF9kZWxheXMgPSBBUlJBWV9TSVpFKHN0aWg0MTZfZGVsYXlzKSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RfcGN0bF9kYXRhICBzdGloNDA3X2RhdGEgPSB7CisJLnJ0X3N0eWxlICAgICAgID0gc3RfcmV0aW1lX3N0eWxlX2RlZGljYXRlZCwKKwkuaW5wdXRfZGVsYXlzICAgPSBzdGloNDA3X2RlbGF5cywKKwkubmlucHV0X2RlbGF5cyAgPSBBUlJBWV9TSVpFKHN0aWg0MDdfZGVsYXlzKSwKKwkub3V0cHV0X2RlbGF5cyAgPSBzdGloNDA3X2RlbGF5cywKKwkubm91dHB1dF9kZWxheXMgPSBBUlJBWV9TSVpFKHN0aWg0MDdfZGVsYXlzKSwKIAkuYWx0ID0gMCwgLm9lID0gNDAsIC5wdSA9IDUwLCAub2QgPSA2MCwgLnJ0ID0gMTAwLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzdF9wY3RsX2RhdGEgc3RpaDQwN19mbGFzaGRhdGEgPSB7CiAJLnJ0X3N0eWxlCT0gc3RfcmV0aW1lX3N0eWxlX25vbmUsCi0JLmlucHV0X2RlbGF5cwk9IHN0aWg0MTZfZGVsYXlzLAotCS5uaW5wdXRfZGVsYXlzCT0gQVJSQVlfU0laRShzdGloNDE2X2RlbGF5cyksCi0JLm91dHB1dF9kZWxheXMJPSBzdGloNDE2X2RlbGF5cywKLQkubm91dHB1dF9kZWxheXMgPSBBUlJBWV9TSVpFKHN0aWg0MTZfZGVsYXlzKSwKKwkuaW5wdXRfZGVsYXlzCT0gc3RpaDQwN19kZWxheXMsCisJLm5pbnB1dF9kZWxheXMJPSBBUlJBWV9TSVpFKHN0aWg0MDdfZGVsYXlzKSwKKwkub3V0cHV0X2RlbGF5cwk9IHN0aWg0MDdfZGVsYXlzLAorCS5ub3V0cHV0X2RlbGF5cyA9IEFSUkFZX1NJWkUoc3RpaDQwN19kZWxheXMpLAogCS5hbHQgPSAwLAogCS5vZSA9IC0xLCAvKiBOb3QgQXZhaWxhYmxlICovCiAJLnB1ID0gLTEsIC8qIE5vdCBBdmFpbGFibGUgKi8KQEAgLTc5OSwyMSArNzYzLDYgQEAKIAlyZXR1cm4gKGRpcmVjdGlvbiA9PSBTVF9HUElPX0RJUkVDVElPTl9JTik7CiB9CiAKLXN0YXRpYyBpbnQgc3RfZ3Bpb194bGF0ZShzdHJ1Y3QgZ3Bpb19jaGlwICpnYywKLQkJCWNvbnN0IHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmdwaW9zcGVjLCB1MzIgKmZsYWdzKQotewotCWlmIChXQVJOX09OKGdjLT5vZl9ncGlvX25fY2VsbHMgPCAxKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoV0FSTl9PTihncGlvc3BlYy0+YXJnc19jb3VudCA8IGdjLT5vZl9ncGlvX25fY2VsbHMpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChncGlvc3BlYy0+YXJnc1swXSA+IGdjLT5uZ3BpbykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gZ3Bpb3NwZWMtPmFyZ3NbMF07Ci19Ci0KIC8qIFBpbmN0cmwgR3JvdXBzICovCiBzdGF0aWMgaW50IHN0X3BjdGxfZ2V0X2dyb3Vwc19jb3VudChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYpCiB7CkBAIC0xNDg2LDggKzE0MzUsNiBAQAogCS5kaXJlY3Rpb25fb3V0cHV0CT0gc3RfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0LAogCS5nZXRfZGlyZWN0aW9uCQk9IHN0X2dwaW9fZ2V0X2RpcmVjdGlvbiwKIAkubmdwaW8JCQk9IFNUX0dQSU9fUElOU19QRVJfQkFOSywKLQkub2ZfZ3Bpb19uX2NlbGxzCT0gMSwKLQkub2ZfeGxhdGUJCT0gc3RfZ3Bpb194bGF0ZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgc3RfZ3Bpb19pcnFjaGlwID0gewpAQCAtMTU3OSwyMSArMTUyNiw5IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN0X3BjdGxfb2ZfbWF0Y2hbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MTUtc2JjLXBpbmN0cmwiLCAuZGF0YSA9ICZzdGloNDE1X3NiY19kYXRhIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzdCxzdGloNDE1LXJlYXItcGluY3RybCIsIC5kYXRhID0gJnN0aWg0MTVfcmVhcl9kYXRhIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzdCxzdGloNDE1LWxlZnQtcGluY3RybCIsIC5kYXRhID0gJnN0aWg0MTVfbGVmdF9kYXRhIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzdCxzdGloNDE1LXJpZ2h0LXBpbmN0cmwiLAotCQkuZGF0YSA9ICZzdGloNDE1X3JpZ2h0X2RhdGEgfSwKLQl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MTUtZnJvbnQtcGluY3RybCIsCi0JCS5kYXRhID0gJnN0aWg0MTVfZnJvbnRfZGF0YSB9LAotCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNi1zYmMtcGluY3RybCIsIC5kYXRhID0gJnN0aWg0MTZfZGF0YX0sCi0JeyAuY29tcGF0aWJsZSA9ICJzdCxzdGloNDE2LWZyb250LXBpbmN0cmwiLCAuZGF0YSA9ICZzdGloNDE2X2RhdGF9LAotCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNi1yZWFyLXBpbmN0cmwiLCAuZGF0YSA9ICZzdGloNDE2X2RhdGF9LAotCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNi1mdmRwLWZlLXBpbmN0cmwiLCAuZGF0YSA9ICZzdGloNDE2X2RhdGF9LAotCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNi1mdmRwLWxpdGUtcGluY3RybCIsIC5kYXRhID0gJnN0aWg0MTZfZGF0YX0sCi0JeyAuY29tcGF0aWJsZSA9ICJzdCxzdGloNDA3LXNiYy1waW5jdHJsIiwgLmRhdGEgPSAmc3RpaDQxNl9kYXRhfSwKLQl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MDctZnJvbnQtcGluY3RybCIsIC5kYXRhID0gJnN0aWg0MTZfZGF0YX0sCi0JeyAuY29tcGF0aWJsZSA9ICJzdCxzdGloNDA3LXJlYXItcGluY3RybCIsIC5kYXRhID0gJnN0aWg0MTZfZGF0YX0sCisJeyAuY29tcGF0aWJsZSA9ICJzdCxzdGloNDA3LXNiYy1waW5jdHJsIiwgLmRhdGEgPSAmc3RpaDQwN19kYXRhfSwKKwl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MDctZnJvbnQtcGluY3RybCIsIC5kYXRhID0gJnN0aWg0MDdfZGF0YX0sCisJeyAuY29tcGF0aWJsZSA9ICJzdCxzdGloNDA3LXJlYXItcGluY3RybCIsIC5kYXRhID0gJnN0aWg0MDdfZGF0YX0sCiAJeyAuY29tcGF0aWJsZSA9ICJzdCxzdGloNDA3LWZsYXNoLXBpbmN0cmwiLCAuZGF0YSA9ICZzdGloNDA3X2ZsYXNoZGF0YX0sCiAJeyAvKiBzZW50aW5lbCAqLyB9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtenlucS5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtenlucS5jCmluZGV4IDdhZmRiZWQuLmUwZWNmZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXp5bnEuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC16eW5xLmMKQEAgLTIzMyw3ICsyMzMsNyBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGlvMV8wX3BpbnNbXSA9IHsxMCwgMTEsIDEyLCAxMywgMTQsIDE1fTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RpbzFfMV9waW5zW10gPSB7MjIsIDIzLCAyNCwgMjUsIDI2LCAyN307CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaW8xXzJfcGluc1tdID0gezM0LCAzNSwgMzYsIDM3LCAzOCwgMzl9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGlvMV8zX3BpbnNbXSA9IHs0NiwgNDcsIDQ4LCA0OSwgNDAsIDUxfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RpbzFfM19waW5zW10gPSB7NDYsIDQ3LCA0OCwgNDksIDUwLCA1MX07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaW8wX2VtaW9fd3BfcGluc1tdID0gezU0fTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RpbzBfZW1pb19jZF9waW5zW10gPSB7NTV9Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGlvMV9lbWlvX3dwX3BpbnNbXSA9IHs1Nn07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcWNvbS9waW5jdHJsLW1zbS5jIGIvZHJpdmVycy9waW5jdHJsL3Fjb20vcGluY3RybC1tc20uYwppbmRleCA1MWM0MmQ3Li43NzVjODgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcWNvbS9waW5jdHJsLW1zbS5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9xY29tL3BpbmN0cmwtbXNtLmMKQEAgLTE1Niw3ICsxNTYsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZwY3RybC0+bG9jaywgZmxhZ3MpOwogCiAJdmFsID0gcmVhZGwocGN0cmwtPnJlZ3MgKyBnLT5jdGxfcmVnKTsKLQl2YWwgJj0gbWFzazsKKwl2YWwgJj0gfm1hc2s7CiAJdmFsIHw9IGkgPDwgZy0+bXV4X2JpdDsKIAl3cml0ZWwodmFsLCBwY3RybC0+cmVncyArIGctPmN0bF9yZWcpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcWNvbS9waW5jdHJsLXNwbWktZ3Bpby5jIGIvZHJpdmVycy9waW5jdHJsL3Fjb20vcGluY3RybC1zcG1pLWdwaW8uYwppbmRleCA2ODZhY2NiLi42NjRiNjQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcWNvbS9waW5jdHJsLXNwbWktZ3Bpby5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9xY29tL3BpbmN0cmwtc3BtaS1ncGlvLmMKQEAgLTgwMCw2ICs4MDAsNyBAQAogCXsgLmNvbXBhdGlibGUgPSAicWNvbSxwbTg5NDEtZ3BpbyIgfSwJLyogMzYgR1BJTydzICovCiAJeyAuY29tcGF0aWJsZSA9ICJxY29tLHBtODk5NC1ncGlvIiB9LAkvKiAyMiBHUElPJ3MgKi8KIAl7IC5jb21wYXRpYmxlID0gInFjb20scG1hODA4NC1ncGlvIiB9LAkvKiAyMiBHUElPJ3MgKi8KKwl7IC5jb21wYXRpYmxlID0gInFjb20sc3BtaS1ncGlvIiB9LCAvKiBHZW5lcmljICovCiAJeyB9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3Fjb20vcGluY3RybC1zcG1pLW1wcC5jIGIvZHJpdmVycy9waW5jdHJsL3Fjb20vcGluY3RybC1zcG1pLW1wcC5jCmluZGV4IDE3MzVmZmUuLjY1NTZkYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9xY29tL3BpbmN0cmwtc3BtaS1tcHAuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcWNvbS9waW5jdHJsLXNwbWktbXBwLmMKQEAgLTkxNCw2ICs5MTQsNyBAQAogCXsgLmNvbXBhdGlibGUgPSAicWNvbSxwbTg5NDEtbXBwIiB9LAkvKiA4IE1QUCdzICovCiAJeyAuY29tcGF0aWJsZSA9ICJxY29tLHBtODk5NC1tcHAiIH0sCS8qIDggTVBQJ3MgKi8KIAl7IC5jb21wYXRpYmxlID0gInFjb20scG1hODA4NC1tcHAiIH0sCS8qIDggTVBQJ3MgKi8KKwl7IC5jb21wYXRpYmxlID0gInFjb20sc3BtaS1tcHAiIH0sCS8qIEdlbmVyaWMgKi8KIAl7IH0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc2Ftc3VuZy9waW5jdHJsLWV4eW5vcy5jIGIvZHJpdmVycy9waW5jdHJsL3NhbXN1bmcvcGluY3RybC1leHlub3MuYwppbmRleCAwNTFiNWJmLi5kMzJmYTJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc2Ftc3VuZy9waW5jdHJsLWV4eW5vcy5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9zYW1zdW5nL3BpbmN0cmwtZXh5bm9zLmMKQEAgLTQyOCwxNCArNDI4LDEwIEBACiAJaW50IGVpbnRfaXJxOwogCiAJY2hhaW5lZF9pcnFfZW50ZXIoY2hpcCwgZGVzYyk7Ci0JY2hpcC0+aXJxX21hc2soJmRlc2MtPmlycV9kYXRhKTsKLQotCWlmIChjaGlwLT5pcnFfYWNrKQotCQljaGlwLT5pcnFfYWNrKCZkZXNjLT5pcnFfZGF0YSk7CiAKIAllaW50X2lycSA9IGlycV9saW5lYXJfcmV2bWFwKGJhbmstPmlycV9kb21haW4sIGVpbnRkLT5pcnEpOwogCWdlbmVyaWNfaGFuZGxlX2lycShlaW50X2lycSk7Ci0JY2hpcC0+aXJxX3VubWFzaygmZGVzYy0+aXJxX2RhdGEpOworCiAJY2hhaW5lZF9pcnFfZXhpdChjaGlwLCBkZXNjKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3NhbXN1bmcvcGluY3RybC1zYW1zdW5nLmMgYi9kcml2ZXJzL3BpbmN0cmwvc2Ftc3VuZy9waW5jdHJsLXNhbXN1bmcuYwppbmRleCA1MTNmZTZiLi42MjA3MjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc2Ftc3VuZy9waW5jdHJsLXNhbXN1bmcuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvc2Ftc3VuZy9waW5jdHJsLXNhbXN1bmcuYwpAQCAtMTA0MSwxNyArMTA0MSw5IEBACiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJaW50IHJldDsKIAotCWlmICghZGV2LT5vZl9ub2RlKSB7Ci0JCWRldl9lcnIoZGV2LCAiZGV2aWNlIHRyZWUgbm9kZSBub3QgZm91bmRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KIAlkcnZkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpkcnZkYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkcnZkYXRhKSB7Ci0JCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZHJpdmVyJ3MgIgotCQkJCSJwcml2YXRlIGRhdGFcbiIpOworCWlmICghZHJ2ZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJY3RybCA9IHNhbXN1bmdfcGluY3RybF9nZXRfc29jX2RhdGEoZHJ2ZGF0YSwgcGRldik7CiAJaWYgKElTX0VSUihjdHJsKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9LY29uZmlnIGIvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9LY29uZmlnCmluZGV4IDQxNWRkODAuLjA3ZWNhNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvS2NvbmZpZworKysgYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL0tjb25maWcKQEAgLTU0LDYgKzU0LDExIEBACiAJZGVwZW5kcyBvbiBBUkNIX1I4QTc3OTEKIAlzZWxlY3QgUElOQ1RSTF9TSF9QRkMKIAorY29uZmlnIFBJTkNUUkxfUEZDX1I4QTc3OTIKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBBUkNIX1I4QTc3OTIKKwlzZWxlY3QgUElOQ1RSTF9TSF9QRkMKKwogY29uZmlnIFBJTkNUUkxfUEZDX1I4QTc3OTMKIAlkZWZfYm9vbCB5CiAJZGVwZW5kcyBvbiBBUkNIX1I4QTc3OTMKQEAgLTY5LDYgKzc0LDExIEBACiAJZGVwZW5kcyBvbiBBUkNIX1I4QTc3OTUKIAlzZWxlY3QgUElOQ1RSTF9TSF9QRkMKIAorY29uZmlnIFBJTkNUUkxfUEZDX1I4QTc3OTYKKyAgICAgICAgZGVmX2Jvb2wgeQorICAgICAgICBkZXBlbmRzIG9uIEFSQ0hfUjhBNzc5NgorICAgICAgICBzZWxlY3QgUElOQ1RSTF9TSF9QRkMKKwogY29uZmlnIFBJTkNUUkxfUEZDX1NINzIwMwogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzIwMwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9NYWtlZmlsZSBiL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvTWFrZWZpbGUKaW5kZXggOGEyYzg3MS4uMmRkYThjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL01ha2VmaWxlCkBAIC03LDkgKzcsMTEgQEAKIG9iai0kKENPTkZJR19QSU5DVFJMX1BGQ19SOEE3Nzc5KQkrPSBwZmMtcjhhNzc3OS5vCiBvYmotJChDT05GSUdfUElOQ1RSTF9QRkNfUjhBNzc5MCkJKz0gcGZjLXI4YTc3OTAubwogb2JqLSQoQ09ORklHX1BJTkNUUkxfUEZDX1I4QTc3OTEpCSs9IHBmYy1yOGE3NzkxLm8KK29iai0kKENPTkZJR19QSU5DVFJMX1BGQ19SOEE3NzkyKQkrPSBwZmMtcjhhNzc5Mi5vCiBvYmotJChDT05GSUdfUElOQ1RSTF9QRkNfUjhBNzc5MykJKz0gcGZjLXI4YTc3OTEubwogb2JqLSQoQ09ORklHX1BJTkNUUkxfUEZDX1I4QTc3OTQpCSs9IHBmYy1yOGE3Nzk0Lm8KIG9iai0kKENPTkZJR19QSU5DVFJMX1BGQ19SOEE3Nzk1KQkrPSBwZmMtcjhhNzc5NS5vCitvYmotJChDT05GSUdfUElOQ1RSTF9QRkNfUjhBNzc5NikJKz0gcGZjLXI4YTc3OTYubwogb2JqLSQoQ09ORklHX1BJTkNUUkxfUEZDX1NINzIwMykJKz0gcGZjLXNoNzIwMy5vCiBvYmotJChDT05GSUdfUElOQ1RSTF9QRkNfU0g3MjY0KQkrPSBwZmMtc2g3MjY0Lm8KIG9iai0kKENPTkZJR19QSU5DVFJMX1BGQ19TSDcyNjkpCSs9IHBmYy1zaDcyNjkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9jb3JlLmMgYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL2NvcmUuYwppbmRleCBhM2I4MjA0Li5mM2E4ODk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL2NvcmUuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL2NvcmUuYwpAQCAtNDk0LDYgKzQ5NCwxMiBAQAogCQkuZGF0YSA9ICZyOGE3NzkxX3Bpbm11eF9pbmZvLAogCX0sCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfUElOQ1RSTF9QRkNfUjhBNzc5MgorCXsKKwkJLmNvbXBhdGlibGUgPSAicmVuZXNhcyxwZmMtcjhhNzc5MiIsCisJCS5kYXRhID0gJnI4YTc3OTJfcGlubXV4X2luZm8sCisJfSwKKyNlbmRpZgogI2lmZGVmIENPTkZJR19QSU5DVFJMX1BGQ19SOEE3NzkzCiAJewogCQkuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHBmYy1yOGE3NzkzIiwKQEAgLTUxMiw2ICs1MTgsMTIgQEAKIAkJLmRhdGEgPSAmcjhhNzc5NV9waW5tdXhfaW5mbywKIAl9LAogI2VuZGlmCisjaWZkZWYgQ09ORklHX1BJTkNUUkxfUEZDX1I4QTc3OTYKKwl7CisJCS5jb21wYXRpYmxlID0gInJlbmVzYXMscGZjLXI4YTc3OTYiLAorCQkuZGF0YSA9ICZyOGE3Nzk2X3Bpbm11eF9pbmZvLAorCX0sCisjZW5kaWYKICNpZmRlZiBDT05GSUdfUElOQ1RSTF9QRkNfU0g3M0EwCiAJewogCQkuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHBmYy1zaDczYTAiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9wZmMtcjhhNzc5MS5jIGIvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9wZmMtcjhhNzc5MS5jCmluZGV4IDBjMWE2MGMuLjdjYTM3YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvcGZjLXI4YTc3OTEuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BmYy1yOGE3NzkxLmMKQEAgLTEzLDYgKzEzLDEwIEBACiAKICNpbmNsdWRlICJzaF9wZmMuaCIKIAorLyoKKyAqIFBpbnMgMC0yMyBhc3NpZ25lZCB0byBHUElPIGJhbmsgNiBjYW4gYmUgdXNlZCBmb3IgU0QgaW50ZXJmYWNlcyBpbgorICogd2hpY2ggY2FzZSB0aGV5IHN1cHBvcnQgYm90aCAzLjNWIGFuZCAxLjhWIHNpZ25hbGxpbmcuCisgKi8KICNkZWZpbmUgQ1BVX0FMTF9QT1JUKGZuLCBzZngpCQkJCQkJXAogCVBPUlRfR1BfMzIoMCwgZm4sIHNmeCksCQkJCQkJXAogCVBPUlRfR1BfMjYoMSwgZm4sIHNmeCksCQkJCQkJXApAQCAtMjAsNyArMjQsMTUgQEAKIAlQT1JUX0dQXzMyKDMsIGZuLCBzZngpLAkJCQkJCVwKIAlQT1JUX0dQXzMyKDQsIGZuLCBzZngpLAkJCQkJCVwKIAlQT1JUX0dQXzMyKDUsIGZuLCBzZngpLAkJCQkJCVwKLQlQT1JUX0dQXzMyKDYsIGZuLCBzZngpLAkJCQkJCVwKKwlQT1JUX0dQX0NGR18yNCg2LCBmbiwgc2Z4LCBTSF9QRkNfUElOX0NGR19JT19WT0xUQUdFKSwJCVwKKwlQT1JUX0dQXzEoNiwgMjQsIGZuLCBzZngpLAkJCQkJXAorCVBPUlRfR1BfMSg2LCAyNSwgZm4sIHNmeCksCQkJCQlcCisJUE9SVF9HUF8xKDYsIDI2LCBmbiwgc2Z4KSwJCQkJCVwKKwlQT1JUX0dQXzEoNiwgMjcsIGZuLCBzZngpLAkJCQkJXAorCVBPUlRfR1BfMSg2LCAyOCwgZm4sIHNmeCksCQkJCQlcCisJUE9SVF9HUF8xKDYsIDI5LCBmbiwgc2Z4KSwJCQkJCVwKKwlQT1JUX0dQXzEoNiwgMzAsIGZuLCBzZngpLAkJCQkJXAorCVBPUlRfR1BfMSg2LCAzMSwgZm4sIHNmeCksCQkJCQlcCiAJUE9SVF9HUF8yNig3LCBmbiwgc2Z4KQogCiBlbnVtIHsKQEAgLTY0MDQsOSArNjQxNiwyNCBAQAogCXsgfSwKIH07CiAKK3N0YXRpYyBpbnQgcjhhNzc5MV9waW5fdG9fcG9jY3RybChzdHJ1Y3Qgc2hfcGZjICpwZmMsIHVuc2lnbmVkIGludCBwaW4sIHUzMiAqcG9jY3RybCkKK3sKKwlpZiAocGluIDwgUkNBUl9HUF9QSU4oNiwgMCkgfHwgcGluID4gUkNBUl9HUF9QSU4oNiwgMjMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSpwb2NjdHJsID0gMHhlNjA2MDA4YzsKKworCXJldHVybiAzMSAtIChwaW4gJiAweDFmKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9wZmNfc29jX29wZXJhdGlvbnMgcjhhNzc5MV9waW5tdXhfb3BzID0geworCS5waW5fdG9fcG9jY3RybCA9IHI4YTc3OTFfcGluX3RvX3BvY2N0cmwsCit9OworCiAjaWZkZWYgQ09ORklHX1BJTkNUUkxfUEZDX1I4QTc3OTEKIGNvbnN0IHN0cnVjdCBzaF9wZmNfc29jX2luZm8gcjhhNzc5MV9waW5tdXhfaW5mbyA9IHsKIAkubmFtZSA9ICJyOGE3NzkxMF9wZmMiLAorCS5vcHMgPSAmcjhhNzc5MV9waW5tdXhfb3BzLAogCS51bmxvY2tfcmVnID0gMHhlNjA2MDAwMCwgLyogUE1NUiAqLwogCiAJLmZ1bmN0aW9uID0geyBQSU5NVVhfRlVOQ1RJT05fQkVHSU4sIFBJTk1VWF9GVU5DVElPTl9FTkQgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvcGZjLXI4YTc3OTIuYyBiL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvcGZjLXI4YTc3OTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWJhZGI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9wZmMtcjhhNzc5Mi5jCkBAIC0wLDAgKzEsMjczOSBAQAorLyoKKyAqIHI4YTc3OTIgcHJvY2Vzc29yIHN1cHBvcnQgLSBQRkMgaGFyZHdhcmUgYmxvY2suCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTQgUmVuZXNhcyBFbGVjdHJvbmljcyBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDE2IENvZ2VudCBFbWJlZGRlZCwgSW5jLiwgPHNvdXJjZUBjb2dlbnRlbWJlZGRlZC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAic2hfcGZjLmgiCisKKyNkZWZpbmUgQ1BVX0FMTF9QT1JUKGZuLCBzZngpCQkJCQkJXAorCVBPUlRfR1BfMjkoMCwgZm4sIHNmeCksCQkJCQkJXAorCVBPUlRfR1BfMjMoMSwgZm4sIHNmeCksCQkJCQkJXAorCVBPUlRfR1BfMzIoMiwgZm4sIHNmeCksCQkJCQkJXAorCVBPUlRfR1BfMjgoMywgZm4sIHNmeCksCQkJCQkJXAorCVBPUlRfR1BfMTcoNCwgZm4sIHNmeCksCQkJCQkJXAorCVBPUlRfR1BfMTcoNSwgZm4sIHNmeCksCQkJCQkJXAorCVBPUlRfR1BfMTcoNiwgZm4sIHNmeCksCQkJCQkJXAorCVBPUlRfR1BfMTcoNywgZm4sIHNmeCksCQkJCQkJXAorCVBPUlRfR1BfMTcoOCwgZm4sIHNmeCksCQkJCQkJXAorCVBPUlRfR1BfMTcoOSwgZm4sIHNmeCksCQkJCQkJXAorCVBPUlRfR1BfMzIoMTAsIGZuLCBzZngpLAkJCQkJXAorCVBPUlRfR1BfMzAoMTEsIGZuLCBzZngpCisKK2VudW0geworCVBJTk1VWF9SRVNFUlZFRCA9IDAsCisKKwlQSU5NVVhfREFUQV9CRUdJTiwKKwlHUF9BTEwoREFUQSksCisJUElOTVVYX0RBVEFfRU5ELAorCisJUElOTVVYX0ZVTkNUSU9OX0JFR0lOLAorCUdQX0FMTChGTiksCisKKwkvKiBHUFNSMCAqLworCUZOX0lQMF8wLCBGTl9JUDBfMSwgRk5fSVAwXzIsIEZOX0lQMF8zLCBGTl9JUDBfNCwgRk5fSVAwXzUsCisJRk5fSVAwXzYsIEZOX0lQMF83LCBGTl9JUDBfOCwgRk5fSVAwXzksIEZOX0lQMF8xMCwgRk5fSVAwXzExLAorCUZOX0lQMF8xMiwgRk5fSVAwXzEzLCBGTl9JUDBfMTQsIEZOX0lQMF8xNSwgRk5fSVAwXzE2LAorCUZOX0lQMF8xNywgRk5fSVAwXzE4LCBGTl9JUDBfMTksIEZOX0lQMF8yMCwgRk5fSVAwXzIxLAorCUZOX0lQMF8yMiwgRk5fSVAwXzIzLCBGTl9JUDFfMCwgRk5fSVAxXzEsIEZOX0lQMV8yLAorCUZOX0lQMV8zLCBGTl9JUDFfNCwKKworCS8qIEdQU1IxICovCisJRk5fSVAxXzUsIEZOX0lQMV82LCBGTl9JUDFfNywgRk5fSVAxXzgsIEZOX0lQMV85LCBGTl9JUDFfMTAsCisJRk5fSVAxXzExLCBGTl9JUDFfMTIsIEZOX0lQMV8xMywgRk5fSVAxXzE0LCBGTl9JUDFfMTUsIEZOX0lQMV8xNiwKKwlGTl9EVTFfREIyX0MwX0RBVEExMiwgRk5fRFUxX0RCM19DMV9EQVRBMTMsIEZOX0RVMV9EQjRfQzJfREFUQTE0LAorCUZOX0RVMV9EQjVfQzNfREFUQTE1LCBGTl9EVTFfREI2X0M0LCBGTl9EVTFfREI3X0M1LAorCUZOX0RVMV9FWEhTWU5DX0RVMV9IU1lOQywgRk5fRFUxX0VYVlNZTkNfRFUxX1ZTWU5DLAorCUZOX0RVMV9FWE9EREZfRFUxX09EREZfRElTUF9DREUsIEZOX0RVMV9ESVNQLCBGTl9EVTFfQ0RFLAorCisJLyogR1BTUjIgKi8KKwlGTl9EMCwgRk5fRDEsIEZOX0QyLCBGTl9EMywgRk5fRDQsIEZOX0Q1LCBGTl9ENiwgRk5fRDcsCisJRk5fRDgsIEZOX0Q5LCBGTl9EMTAsIEZOX0QxMSwgRk5fRDEyLCBGTl9EMTMsIEZOX0QxNCwgRk5fRDE1LAorCUZOX0EwLCBGTl9BMSwgRk5fQTIsIEZOX0EzLCBGTl9BNCwgRk5fQTUsIEZOX0E2LCBGTl9BNywKKwlGTl9BOCwgRk5fQTksIEZOX0ExMCwgRk5fQTExLCBGTl9BMTIsIEZOX0ExMywgRk5fQTE0LCBGTl9BMTUsCisKKwkvKiBHUFNSMyAqLworCUZOX0ExNiwgRk5fQTE3LCBGTl9BMTgsIEZOX0ExOSwgRk5fSVAxXzE3LCBGTl9JUDFfMTgsCisJRk5fQ1MxX05fQTI2LCBGTl9FWF9DUzBfTiwgRk5fRVhfQ1MxX04sIEZOX0VYX0NTMl9OLCBGTl9FWF9DUzNfTiwKKwlGTl9FWF9DUzRfTiwgRk5fRVhfQ1M1X04sIEZOX0JTX04sIEZOX1JEX04sIEZOX1JEX1dSX04sCisJRk5fV0UwX04sIEZOX1dFMV9OLCBGTl9FWF9XQUlUMCwgRk5fSVJRMCwgRk5fSVJRMSwgRk5fSVJRMiwgRk5fSVJRMywKKwlGTl9JUDFfMTksIEZOX0lQMV8yMCwgRk5fSVAxXzIxLCBGTl9JUDFfMjIsIEZOX0NTMF9OLAorCisJLyogR1BTUjQgKi8KKwlGTl9WSTBfQ0xLLCBGTl9WSTBfQ0xLRU5CLCBGTl9WSTBfSFNZTkNfTiwgRk5fVkkwX1ZTWU5DX04sCisJRk5fVkkwX0QwX0IwX0MwLCBGTl9WSTBfRDFfQjFfQzEsIEZOX1ZJMF9EMl9CMl9DMiwgRk5fVkkwX0QzX0IzX0MzLAorCUZOX1ZJMF9ENF9CNF9DNCwgRk5fVkkwX0Q1X0I1X0M1LCBGTl9WSTBfRDZfQjZfQzYsIEZOX1ZJMF9EN19CN19DNywKKwlGTl9WSTBfRDhfRzBfWTAsIEZOX1ZJMF9EOV9HMV9ZMSwgRk5fVkkwX0QxMF9HMl9ZMiwgRk5fVkkwX0QxMV9HM19ZMywKKwlGTl9WSTBfRklFTEQsCisKKwkvKiBHUFNSNSAqLworCUZOX1ZJMV9DTEssIEZOX1ZJMV9DTEtFTkIsIEZOX1ZJMV9IU1lOQ19OLCBGTl9WSTFfVlNZTkNfTiwKKwlGTl9WSTFfRDBfQjBfQzAsIEZOX1ZJMV9EMV9CMV9DMSwgRk5fVkkxX0QyX0IyX0MyLCBGTl9WSTFfRDNfQjNfQzMsCisJRk5fVkkxX0Q0X0I0X0M0LCBGTl9WSTFfRDVfQjVfQzUsIEZOX1ZJMV9ENl9CNl9DNiwgRk5fVkkxX0Q3X0I3X0M3LAorCUZOX1ZJMV9EOF9HMF9ZMCwgRk5fVkkxX0Q5X0cxX1kxLCBGTl9WSTFfRDEwX0cyX1kyLCBGTl9WSTFfRDExX0czX1kzLAorCUZOX1ZJMV9GSUVMRCwKKworCS8qIEdQU1I2ICovCisJRk5fSVAyXzAsIEZOX0lQMl8xLCBGTl9JUDJfMiwgRk5fSVAyXzMsIEZOX0lQMl80LCBGTl9JUDJfNSwgRk5fSVAyXzYsCisJRk5fSVAyXzcsIEZOX0lQMl84LCBGTl9JUDJfOSwgRk5fSVAyXzEwLCBGTl9JUDJfMTEsIEZOX0lQMl8xMiwKKwlGTl9JUDJfMTMsIEZOX0lQMl8xNCwgRk5fSVAyXzE1LCBGTl9JUDJfMTYsCisKKwkvKiBHUFNSNyAqLworCUZOX0lQM18wLCBGTl9JUDNfMSwgRk5fSVAzXzIsIEZOX0lQM18zLCBGTl9JUDNfNCwgRk5fSVAzXzUsIEZOX0lQM182LAorCUZOX0lQM183LCBGTl9JUDNfOCwgRk5fSVAzXzksIEZOX0lQM18xMCwgRk5fSVAzXzExLCBGTl9JUDNfMTIsCisJRk5fSVAzXzEzLCBGTl9WSTNfRDEwX1kyLCBGTl9JUDNfMTQsIEZOX1ZJM19GSUVMRCwKKworCS8qIEdQU1I4ICovCisJRk5fVkk0X0NMSywgRk5fSVA0XzAsIEZOX0lQNF8xLCBGTl9JUDRfM18yLCBGTl9JUDRfNCwgRk5fSVA0XzZfNSwKKwlGTl9JUDRfOF83LCBGTl9JUDRfMTBfOSwgRk5fSVA0XzEyXzExLCBGTl9JUDRfMTRfMTMsIEZOX0lQNF8xNl8xNSwKKwlGTl9JUDRfMThfMTcsIEZOX0lQNF8yMF8xOSwgRk5fSVA0XzIxLCBGTl9JUDRfMjIsIEZOX0lQNF8yMywgRk5fSVA0XzI0LAorCisJLyogR1BTUjkgKi8KKwlGTl9WSTVfQ0xLLCBGTl9JUDVfMCwgRk5fSVA1XzEsIEZOX0lQNV8yLCBGTl9JUDVfMywgRk5fSVA1XzQsIEZOX0lQNV81LAorCUZOX0lQNV82LCBGTl9JUDVfNywgRk5fSVA1XzgsIEZOX0lQNV85LCBGTl9JUDVfMTAsIEZOX0lQNV8xMSwKKwlGTl9WSTVfRDlfWTEsIEZOX1ZJNV9EMTBfWTIsIEZOX1ZJNV9EMTFfWTMsIEZOX1ZJNV9GSUVMRCwKKworCS8qIEdQU1IxMCAqLworCUZOX0lQNl8wLCBGTl9JUDZfMSwgRk5fSFJUUzBfTiwgRk5fSVA2XzIsIEZOX0lQNl8zLCBGTl9JUDZfNCwgRk5fSVA2XzUsCisJRk5fSENUUzFfTiwgRk5fSVA2XzYsIEZOX0lQNl83LAlGTl9TQ0swLCBGTl9DVFMwX04sIEZOX1JUUzBfTiwKKwlGTl9UWDAsIEZOX1JYMCwgRk5fU0NLMSwgRk5fQ1RTMV9OLCBGTl9SVFMxX04sIEZOX1RYMSwgRk5fUlgxLAorCUZOX0lQNl85XzgsIEZOX0lQNl8xMV8xMCwgRk5fSVA2XzEzXzEyLCBGTl9JUDZfMTVfMTQsIEZOX0lQNl8xNiwKKwlGTl9JUDZfMThfMTcsIEZOX1NDSUZfQ0xLLCBGTl9DQU4wX1RYLCBGTl9DQU4wX1JYLCBGTl9DQU5fQ0xLLAorCUZOX0NBTjFfVFgsIEZOX0NBTjFfUlgsCisKKwkvKiBHUFNSMTEgKi8KKwlGTl9JUDdfMV8wLCBGTl9JUDdfM18yLCBGTl9JUDdfNV80LCBGTl9JUDdfNiwgRk5fSVA3XzcsIEZOX1NEMF9DTEssCisJRk5fU0QwX0NNRCwgRk5fU0QwX0RBVDAsIEZOX1NEMF9EQVQxLCBGTl9TRDBfREFUMiwgRk5fU0QwX0RBVDMsCisJRk5fU0QwX0NELCBGTl9TRDBfV1AsIEZOX0lQN185XzgsIEZOX0lQN18xMV8xMCwgRk5fSVA3XzEzXzEyLAorCUZOX0lQN18xNV8xNCwgRk5fSVA3XzE2LCBGTl9JUDdfMTcsIEZOX0lQN18xOCwgRk5fSVA3XzE5LCBGTl9JUDdfMjAsCisJRk5fQURJQ0xLLCBGTl9BRElDU19TQU1QLCBGTl9BRElEQVRBLCBGTl9BRElDSFMwLCBGTl9BRElDSFMxLAorCUZOX0FESUNIUzIsIEZOX0FWUzEsIEZOX0FWUzIsCisKKwkvKiBJUFNSMCAqLworCUZOX0RVMF9EUjBfREFUQTAsIEZOX0RVMF9EUjFfREFUQTEsIEZOX0RVMF9EUjJfWTRfREFUQTIsCisJRk5fRFUwX0RSM19ZNV9EQVRBMywgRk5fRFUwX0RSNF9ZNl9EQVRBNCwgRk5fRFUwX0RSNV9ZN19EQVRBNSwKKwlGTl9EVTBfRFI2X1k4X0RBVEE2LCBGTl9EVTBfRFI3X1k5X0RBVEE3LCBGTl9EVTBfREcwX0RBVEE4LAorCUZOX0RVMF9ERzFfREFUQTksIEZOX0RVMF9ERzJfQzZfREFUQTEwLCBGTl9EVTBfREczX0M3X0RBVEExMSwKKwlGTl9EVTBfREc0X1kwX0RBVEExMiwgRk5fRFUwX0RHNV9ZMV9EQVRBMTMsIEZOX0RVMF9ERzZfWTJfREFUQTE0LAorCUZOX0RVMF9ERzdfWTNfREFUQTE1LCBGTl9EVTBfREIwLCBGTl9EVTBfREIxLCBGTl9EVTBfREIyX0MwLAorCUZOX0RVMF9EQjNfQzEsIEZOX0RVMF9EQjRfQzIsIEZOX0RVMF9EQjVfQzMsIEZOX0RVMF9EQjZfQzQsCisJRk5fRFUwX0RCN19DNSwKKworCS8qIElQU1IxICovCisJRk5fRFUwX0VYSFNZTkNfRFUwX0hTWU5DLCBGTl9EVTBfRVhWU1lOQ19EVTBfVlNZTkMsCisJRk5fRFUwX0VYT0RERl9EVTBfT0RERl9ESVNQX0NERSwgRk5fRFUwX0RJU1AsIEZOX0RVMF9DREUsCisJRk5fRFUxX0RSMl9ZNF9EQVRBMCwgRk5fRFUxX0RSM19ZNV9EQVRBMSwgRk5fRFUxX0RSNF9ZNl9EQVRBMiwKKwlGTl9EVTFfRFI1X1k3X0RBVEEzLCBGTl9EVTFfRFI2X0RBVEE0LCBGTl9EVTFfRFI3X0RBVEE1LAorCUZOX0RVMV9ERzJfQzZfREFUQTYsIEZOX0RVMV9ERzNfQzdfREFUQTcsIEZOX0RVMV9ERzRfWTBfREFUQTgsCisJRk5fRFUxX0RHNV9ZMV9EQVRBOSwgRk5fRFUxX0RHNl9ZMl9EQVRBMTAsIEZOX0RVMV9ERzdfWTNfREFUQTExLAorCUZOX0EyMCwgRk5fTU9TSV9JTzAsIEZOX0EyMSwgRk5fTUlTT19JTzEsIEZOX0EyMiwgRk5fSU8yLAorCUZOX0EyMywgRk5fSU8zLCBGTl9BMjQsIEZOX1NQQ0xLLCBGTl9BMjUsIEZOX1NTTCwKKworCS8qIElQU1IyICovCisJRk5fVkkyX0NMSywgRk5fQVZCX1JYX0NMSywgRk5fVkkyX0NMS0VOQiwgRk5fQVZCX1JYX0RWLAorCUZOX1ZJMl9IU1lOQ19OLCBGTl9BVkJfUlhEMCwgRk5fVkkyX1ZTWU5DX04sIEZOX0FWQl9SWEQxLAorCUZOX1ZJMl9EMF9DMCwgRk5fQVZCX1JYRDIsIEZOX1ZJMl9EMV9DMSwgRk5fQVZCX1JYRDMsCisJRk5fVkkyX0QyX0MyLCBGTl9BVkJfUlhENCwgRk5fVkkyX0QzX0MzLCBGTl9BVkJfUlhENSwKKwlGTl9WSTJfRDRfQzQsIEZOX0FWQl9SWEQ2LCBGTl9WSTJfRDVfQzUsIEZOX0FWQl9SWEQ3LAorCUZOX1ZJMl9ENl9DNiwgRk5fQVZCX1JYX0VSLCBGTl9WSTJfRDdfQzcsIEZOX0FWQl9DT0wsCisJRk5fVkkyX0Q4X1kwLCBGTl9BVkJfVFhEMywgRk5fVkkyX0Q5X1kxLCBGTl9BVkJfVFhfRU4sCisJRk5fVkkyX0QxMF9ZMiwgRk5fQVZCX1RYRDAsIEZOX1ZJMl9EMTFfWTMsIEZOX0FWQl9UWEQxLAorCUZOX1ZJMl9GSUVMRCwgRk5fQVZCX1RYRDIsCisKKwkvKiBJUFNSMyAqLworCUZOX1ZJM19DTEssIEZOX0FWQl9UWF9DTEssIEZOX1ZJM19DTEtFTkIsIEZOX0FWQl9UWEQ0LAorCUZOX1ZJM19IU1lOQ19OLCBGTl9BVkJfVFhENSwgRk5fVkkzX1ZTWU5DX04sIEZOX0FWQl9UWEQ2LAorCUZOX1ZJM19EMF9DMCwgRk5fQVZCX1RYRDcsIEZOX1ZJM19EMV9DMSwgRk5fQVZCX1RYX0VSLAorCUZOX1ZJM19EMl9DMiwgRk5fQVZCX0dUWF9DTEssIEZOX1ZJM19EM19DMywgRk5fQVZCX01EQywKKwlGTl9WSTNfRDRfQzQsIEZOX0FWQl9NRElPLCBGTl9WSTNfRDVfQzUsIEZOX0FWQl9MSU5LLAorCUZOX1ZJM19ENl9DNiwgRk5fQVZCX01BR0lDLCBGTl9WSTNfRDdfQzcsIEZOX0FWQl9QSFlfSU5ULAorCUZOX1ZJM19EOF9ZMCwgRk5fQVZCX0NSUywgRk5fVkkzX0Q5X1kxLCBGTl9BVkJfR1RYUkVGQ0xLLAorCUZOX1ZJM19EMTFfWTMsIEZOX0FWQl9BVlRQX01BVENILAorCisJLyogSVBTUjQgKi8KKwlGTl9WSTRfQ0xLRU5CLCBGTl9WSTBfRDEyX0c0X1k0LCBGTl9WSTRfSFNZTkNfTiwgRk5fVkkwX0QxM19HNV9ZNSwKKwlGTl9WSTRfVlNZTkNfTiwgRk5fVkkwX0QxNF9HNl9ZNiwgRk5fUkRSX0NMS09VVCwKKwlGTl9WSTRfRDBfQzAsIEZOX1ZJMF9EMTVfRzdfWTcsCisJRk5fVkk0X0QxX0MxLCBGTl9WSTBfRDE2X1IwLCBGTl9WSTFfRDEyX0c0X1k0LAorCUZOX1ZJNF9EMl9DMiwgRk5fVkkwX0QxN19SMSwgRk5fVkkxX0QxM19HNV9ZNSwKKwlGTl9WSTRfRDNfQzMsIEZOX1ZJMF9EMThfUjIsIEZOX1ZJMV9EMTRfRzZfWTYsCisJRk5fVkk0X0Q0X0M0LCBGTl9WSTBfRDE5X1IzLCBGTl9WSTFfRDE1X0c3X1k3LAorCUZOX1ZJNF9ENV9DNSwgRk5fVkkwX0QyMF9SNCwgRk5fVkkyX0QxMl9ZNCwKKwlGTl9WSTRfRDZfQzYsIEZOX1ZJMF9EMjFfUjUsIEZOX1ZJMl9EMTNfWTUsCisJRk5fVkk0X0Q3X0M3LCBGTl9WSTBfRDIyX1I2LCBGTl9WSTJfRDE0X1k2LAorCUZOX1ZJNF9EOF9ZMCwgRk5fVkkwX0QyM19SNywgRk5fVkkyX0QxNV9ZNywKKwlGTl9WSTRfRDlfWTEsIEZOX1ZJM19EMTJfWTQsIEZOX1ZJNF9EMTBfWTIsIEZOX1ZJM19EMTNfWTUsCisJRk5fVkk0X0QxMV9ZMywgRk5fVkkzX0QxNF9ZNiwgRk5fVkk0X0ZJRUxELCBGTl9WSTNfRDE1X1k3LAorCisJLyogSVBTUjUgKi8KKwlGTl9WSTVfQ0xLRU5CLCBGTl9WSTFfRDEyX0c0X1k0X0IsIEZOX1ZJNV9IU1lOQ19OLCBGTl9WSTFfRDEzX0c1X1k1X0IsCisJRk5fVkk1X1ZTWU5DX04sIEZOX1ZJMV9EMTRfRzZfWTZfQiwgRk5fVkk1X0QwX0MwLCBGTl9WSTFfRDE1X0c3X1k3X0IsCisJRk5fVkk1X0QxX0MxLCBGTl9WSTFfRDE2X1IwLCBGTl9WSTVfRDJfQzIsIEZOX1ZJMV9EMTdfUjEsCisJRk5fVkk1X0QzX0MzLCBGTl9WSTFfRDE4X1IyLCBGTl9WSTVfRDRfQzQsIEZOX1ZJMV9EMTlfUjMsCisJRk5fVkk1X0Q1X0M1LCBGTl9WSTFfRDIwX1I0LCBGTl9WSTVfRDZfQzYsIEZOX1ZJMV9EMjFfUjUsCisJRk5fVkk1X0Q3X0M3LCBGTl9WSTFfRDIyX1I2LCBGTl9WSTVfRDhfWTAsIEZOX1ZJMV9EMjNfUjcsCisKKwkvKiBJUFNSNiAqLworCUZOX01TSU9GMF9TQ0ssIEZOX0hTQ0swLCBGTl9NU0lPRjBfU1lOQywgRk5fSENUUzBfTiwKKwlGTl9NU0lPRjBfVFhELCBGTl9IVFgwLCBGTl9NU0lPRjBfUlhELCBGTl9IUlgwLAorCUZOX01TSU9GMV9TQ0ssIEZOX0hTQ0sxLCBGTl9NU0lPRjFfU1lOQywgRk5fSFJUUzFfTiwKKwlGTl9NU0lPRjFfVFhELCBGTl9IVFgxLCBGTl9NU0lPRjFfUlhELCBGTl9IUlgxLAorCUZOX0RSQUNLMCwgRk5fU0NLMiwgRk5fREFDSzAsIEZOX1RYMiwgRk5fRFJFUTBfTiwgRk5fUlgyLAorCUZOX0RBQ0sxLCBGTl9TQ0szLCBGTl9UWDMsIEZOX0RSRVExX04sIEZOX1JYMywKKworCS8qIElQU1I3ICovCisJRk5fUFdNMCwgRk5fVENMSzEsIEZOX0ZTT19DRkVfMCwgRk5fUFdNMSwgRk5fVENMSzIsIEZOX0ZTT19DRkVfMSwKKwlGTl9QV00yLCBGTl9UQ0xLMywgRk5fRlNPX1RPRSwgRk5fUFdNMywgRk5fUFdNNCwKKwlGTl9TU0lfU0NLMzQsIEZOX1RQVTBUTzAsIEZOX1NTSV9XUzM0LCBGTl9UUFUwVE8xLAorCUZOX1NTSV9TREFUQTMsIEZOX1RQVTBUTzIsIEZOX1NTSV9TQ0s0LCBGTl9UUFUwVE8zLAorCUZOX1NTSV9XUzQsIEZOX1NTSV9TREFUQTQsIEZOX0FVRElPX0NMS09VVCwKKwlGTl9BVURJT19DTEtBLCBGTl9BVURJT19DTEtCLAorCisJLyogTU9EX1NFTCAqLworCUZOX1NFTF9WSTFfMCwgRk5fU0VMX1ZJMV8xLAorCVBJTk1VWF9GVU5DVElPTl9FTkQsCisKKwlQSU5NVVhfTUFSS19CRUdJTiwKKwlEVTFfREIyX0MwX0RBVEExMl9NQVJLLCBEVTFfREIzX0MxX0RBVEExM19NQVJLLAorCURVMV9EQjRfQzJfREFUQTE0X01BUkssIERVMV9EQjVfQzNfREFUQTE1X01BUkssCisJRFUxX0RCNl9DNF9NQVJLLCBEVTFfREI3X0M1X01BUkssIERVMV9FWEhTWU5DX0RVMV9IU1lOQ19NQVJLLAorCURVMV9FWFZTWU5DX0RVMV9WU1lOQ19NQVJLLCBEVTFfRVhPRERGX0RVMV9PRERGX0RJU1BfQ0RFX01BUkssCisJRFUxX0RJU1BfTUFSSywgRFUxX0NERV9NQVJLLAorCisJRDBfTUFSSywgRDFfTUFSSywgRDJfTUFSSywgRDNfTUFSSywgRDRfTUFSSywgRDVfTUFSSywgRDZfTUFSSywKKwlEN19NQVJLLCBEOF9NQVJLLCBEOV9NQVJLLCBEMTBfTUFSSywgRDExX01BUkssIEQxMl9NQVJLLCBEMTNfTUFSSywKKwlEMTRfTUFSSywgRDE1X01BUkssIEEwX01BUkssIEExX01BUkssIEEyX01BUkssIEEzX01BUkssIEE0X01BUkssCisJQTVfTUFSSywgQTZfTUFSSywgQTdfTUFSSywgQThfTUFSSywgQTlfTUFSSywgQTEwX01BUkssIEExMV9NQVJLLAorCUExMl9NQVJLLCBBMTNfTUFSSywgQTE0X01BUkssIEExNV9NQVJLLAorCisJQTE2X01BUkssIEExN19NQVJLLCBBMThfTUFSSywgQTE5X01BUkssIENTMV9OX0EyNl9NQVJLLAorCUVYX0NTMF9OX01BUkssIEVYX0NTMV9OX01BUkssIEVYX0NTMl9OX01BUkssIEVYX0NTM19OX01BUkssCisJRVhfQ1M0X05fTUFSSywgRVhfQ1M1X05fTUFSSywgQlNfTl9NQVJLLCBSRF9OX01BUkssIFJEX1dSX05fTUFSSywKKwlXRTBfTl9NQVJLLCBXRTFfTl9NQVJLLCBFWF9XQUlUMF9NQVJLLAorCUlSUTBfTUFSSywgSVJRMV9NQVJLLCBJUlEyX01BUkssIElSUTNfTUFSSywgQ1MwX05fTUFSSywKKworCVZJMF9DTEtfTUFSSywgVkkwX0NMS0VOQl9NQVJLLCBWSTBfSFNZTkNfTl9NQVJLLCBWSTBfVlNZTkNfTl9NQVJLLAorCVZJMF9EMF9CMF9DMF9NQVJLLCBWSTBfRDFfQjFfQzFfTUFSSywgVkkwX0QyX0IyX0MyX01BUkssCisJVkkwX0QzX0IzX0MzX01BUkssIFZJMF9ENF9CNF9DNF9NQVJLLCBWSTBfRDVfQjVfQzVfTUFSSywKKwlWSTBfRDZfQjZfQzZfTUFSSywgVkkwX0Q3X0I3X0M3X01BUkssIFZJMF9EOF9HMF9ZMF9NQVJLLAorCVZJMF9EOV9HMV9ZMV9NQVJLLCBWSTBfRDEwX0cyX1kyX01BUkssIFZJMF9EMTFfRzNfWTNfTUFSSywKKwlWSTBfRklFTERfTUFSSywKKworCVZJMV9DTEtfTUFSSywgVkkxX0NMS0VOQl9NQVJLLCBWSTFfSFNZTkNfTl9NQVJLLCBWSTFfVlNZTkNfTl9NQVJLLAorCVZJMV9EMF9CMF9DMF9NQVJLLCBWSTFfRDFfQjFfQzFfTUFSSywgVkkxX0QyX0IyX0MyX01BUkssCisJVkkxX0QzX0IzX0MzX01BUkssIFZJMV9ENF9CNF9DNF9NQVJLLCBWSTFfRDVfQjVfQzVfTUFSSywKKwlWSTFfRDZfQjZfQzZfTUFSSywgVkkxX0Q3X0I3X0M3X01BUkssIFZJMV9EOF9HMF9ZMF9NQVJLLAorCVZJMV9EOV9HMV9ZMV9NQVJLLCBWSTFfRDEwX0cyX1kyX01BUkssIFZJMV9EMTFfRzNfWTNfTUFSSywKKwlWSTFfRklFTERfTUFSSywKKworCVZJM19EMTBfWTJfTUFSSywgVkkzX0ZJRUxEX01BUkssCisKKwlWSTRfQ0xLX01BUkssCisKKwlWSTVfQ0xLX01BUkssIFZJNV9EOV9ZMV9NQVJLLCBWSTVfRDEwX1kyX01BUkssIFZJNV9EMTFfWTNfTUFSSywKKwlWSTVfRklFTERfTUFSSywKKworCUhSVFMwX05fTUFSSywgSENUUzFfTl9NQVJLLCBTQ0swX01BUkssIENUUzBfTl9NQVJLLCBSVFMwX05fTUFSSywKKwlUWDBfTUFSSywgUlgwX01BUkssIFNDSzFfTUFSSywgQ1RTMV9OX01BUkssIFJUUzFfTl9NQVJLLAorCVRYMV9NQVJLLCBSWDFfTUFSSywgU0NJRl9DTEtfTUFSSywgQ0FOMF9UWF9NQVJLLCBDQU4wX1JYX01BUkssCisJQ0FOX0NMS19NQVJLLCBDQU4xX1RYX01BUkssIENBTjFfUlhfTUFSSywKKworCVNEMF9DTEtfTUFSSywgU0QwX0NNRF9NQVJLLCBTRDBfREFUMF9NQVJLLCBTRDBfREFUMV9NQVJLLAorCVNEMF9EQVQyX01BUkssIFNEMF9EQVQzX01BUkssIFNEMF9DRF9NQVJLLCBTRDBfV1BfTUFSSywKKwlBRElDTEtfTUFSSywgQURJQ1NfU0FNUF9NQVJLLCBBRElEQVRBX01BUkssIEFESUNIUzBfTUFSSywKKwlBRElDSFMxX01BUkssIEFESUNIUzJfTUFSSywgQVZTMV9NQVJLLCBBVlMyX01BUkssCisKKwkvKiBJUFNSMCAqLworCURVMF9EUjBfREFUQTBfTUFSSywgRFUwX0RSMV9EQVRBMV9NQVJLLCBEVTBfRFIyX1k0X0RBVEEyX01BUkssCisJRFUwX0RSM19ZNV9EQVRBM19NQVJLLCBEVTBfRFI0X1k2X0RBVEE0X01BUkssIERVMF9EUjVfWTdfREFUQTVfTUFSSywKKwlEVTBfRFI2X1k4X0RBVEE2X01BUkssIERVMF9EUjdfWTlfREFUQTdfTUFSSywgRFUwX0RHMF9EQVRBOF9NQVJLLAorCURVMF9ERzFfREFUQTlfTUFSSywgRFUwX0RHMl9DNl9EQVRBMTBfTUFSSywgRFUwX0RHM19DN19EQVRBMTFfTUFSSywKKwlEVTBfREc0X1kwX0RBVEExMl9NQVJLLCBEVTBfREc1X1kxX0RBVEExM19NQVJLLCBEVTBfREc2X1kyX0RBVEExNF9NQVJLLAorCURVMF9ERzdfWTNfREFUQTE1X01BUkssIERVMF9EQjBfTUFSSywgRFUwX0RCMV9NQVJLLAorCURVMF9EQjJfQzBfTUFSSywgRFUwX0RCM19DMV9NQVJLLCBEVTBfREI0X0MyX01BUkssIERVMF9EQjVfQzNfTUFSSywKKwlEVTBfREI2X0M0X01BUkssIERVMF9EQjdfQzVfTUFSSywKKworCS8qIElQU1IxICovCisJRFUwX0VYSFNZTkNfRFUwX0hTWU5DX01BUkssIERVMF9FWFZTWU5DX0RVMF9WU1lOQ19NQVJLLAorCURVMF9FWE9EREZfRFUwX09EREZfRElTUF9DREVfTUFSSywgRFUwX0RJU1BfTUFSSywgRFUwX0NERV9NQVJLLAorCURVMV9EUjJfWTRfREFUQTBfTUFSSywgRFUxX0RSM19ZNV9EQVRBMV9NQVJLLCBEVTFfRFI0X1k2X0RBVEEyX01BUkssCisJRFUxX0RSNV9ZN19EQVRBM19NQVJLLCBEVTFfRFI2X0RBVEE0X01BUkssIERVMV9EUjdfREFUQTVfTUFSSywKKwlEVTFfREcyX0M2X0RBVEE2X01BUkssIERVMV9ERzNfQzdfREFUQTdfTUFSSywgRFUxX0RHNF9ZMF9EQVRBOF9NQVJLLAorCURVMV9ERzVfWTFfREFUQTlfTUFSSywgRFUxX0RHNl9ZMl9EQVRBMTBfTUFSSywgRFUxX0RHN19ZM19EQVRBMTFfTUFSSywKKwlBMjBfTUFSSywgTU9TSV9JTzBfTUFSSywgQTIxX01BUkssIE1JU09fSU8xX01BUkssIEEyMl9NQVJLLCBJTzJfTUFSSywKKwlBMjNfTUFSSywgSU8zX01BUkssIEEyNF9NQVJLLCBTUENMS19NQVJLLCBBMjVfTUFSSywgU1NMX01BUkssCisKKwkvKiBJUFNSMiAqLworCVZJMl9DTEtfTUFSSywgQVZCX1JYX0NMS19NQVJLLCBWSTJfQ0xLRU5CX01BUkssIEFWQl9SWF9EVl9NQVJLLAorCVZJMl9IU1lOQ19OX01BUkssIEFWQl9SWEQwX01BUkssIFZJMl9WU1lOQ19OX01BUkssIEFWQl9SWEQxX01BUkssCisJVkkyX0QwX0MwX01BUkssIEFWQl9SWEQyX01BUkssIFZJMl9EMV9DMV9NQVJLLCBBVkJfVFhfQ0xLX01BUkssCisJVkkyX0QyX0MyX01BUkssIEFWQl9SWEQ0X01BUkssIFZJMl9EM19DM19NQVJLLCBBVkJfUlhENV9NQVJLLAorCVZJMl9ENF9DNF9NQVJLLCBBVkJfUlhENl9NQVJLLCBWSTJfRDVfQzVfTUFSSywgQVZCX1JYRDdfTUFSSywKKwlWSTJfRDZfQzZfTUFSSywgQVZCX1JYX0VSX01BUkssIFZJMl9EN19DN19NQVJLLCBBVkJfQ09MX01BUkssCisJVkkyX0Q4X1kwX01BUkssIEFWQl9SWEQzX01BUkssIFZJMl9EOV9ZMV9NQVJLLCBBVkJfVFhfRU5fTUFSSywKKwlWSTJfRDEwX1kyX01BUkssIEFWQl9UWEQwX01BUkssCisJVkkyX0QxMV9ZM19NQVJLLCBBVkJfVFhEMV9NQVJLLCBWSTJfRklFTERfTUFSSywgQVZCX1RYRDJfTUFSSywKKworCS8qIElQU1IzICovCisJVkkzX0NMS19NQVJLLCBBVkJfVFhEM19NQVJLLCBWSTNfQ0xLRU5CX01BUkssIEFWQl9UWEQ0X01BUkssCisJVkkzX0hTWU5DX05fTUFSSywgQVZCX1RYRDVfTUFSSywgVkkzX1ZTWU5DX05fTUFSSywgQVZCX1RYRDZfTUFSSywKKwlWSTNfRDBfQzBfTUFSSywgQVZCX1RYRDdfTUFSSywgVkkzX0QxX0MxX01BUkssIEFWQl9UWF9FUl9NQVJLLAorCVZJM19EMl9DMl9NQVJLLCBBVkJfR1RYX0NMS19NQVJLLCBWSTNfRDNfQzNfTUFSSywgQVZCX01EQ19NQVJLLAorCVZJM19ENF9DNF9NQVJLLCBBVkJfTURJT19NQVJLLCBWSTNfRDVfQzVfTUFSSywgQVZCX0xJTktfTUFSSywKKwlWSTNfRDZfQzZfTUFSSywgQVZCX01BR0lDX01BUkssIFZJM19EN19DN19NQVJLLCBBVkJfUEhZX0lOVF9NQVJLLAorCVZJM19EOF9ZMF9NQVJLLCBBVkJfQ1JTX01BUkssIFZJM19EOV9ZMV9NQVJLLCBBVkJfR1RYUkVGQ0xLX01BUkssCisJVkkzX0QxMV9ZM19NQVJLLCBBVkJfQVZUUF9NQVRDSF9NQVJLLAorCisJLyogSVBTUjQgKi8KKwlWSTRfQ0xLRU5CX01BUkssIFZJMF9EMTJfRzRfWTRfTUFSSywgVkk0X0hTWU5DX05fTUFSSywKKwlWSTBfRDEzX0c1X1k1X01BUkssIFZJNF9WU1lOQ19OX01BUkssIFZJMF9EMTRfRzZfWTZfTUFSSywKKwlSRFJfQ0xLT1VUX01BUkssIFZJNF9EMF9DMF9NQVJLLCBWSTBfRDE1X0c3X1k3X01BUkssIFZJNF9EMV9DMV9NQVJLLAorCVZJMF9EMTZfUjBfTUFSSywgVkkxX0QxMl9HNF9ZNF9NQVJLLCBWSTRfRDJfQzJfTUFSSywgVkkwX0QxN19SMV9NQVJLLAorCVZJMV9EMTNfRzVfWTVfTUFSSywgVkk0X0QzX0MzX01BUkssIFZJMF9EMThfUjJfTUFSSywgVkkxX0QxNF9HNl9ZNl9NQVJLLAorCVZJNF9ENF9DNF9NQVJLLAlWSTBfRDE5X1IzX01BUkssIFZJMV9EMTVfRzdfWTdfTUFSSywgVkk0X0Q1X0M1X01BUkssCisJVkkwX0QyMF9SNF9NQVJLLCBWSTJfRDEyX1k0X01BUkssIFZJNF9ENl9DNl9NQVJLLCBWSTBfRDIxX1I1X01BUkssCisJVkkyX0QxM19ZNV9NQVJLLCBWSTRfRDdfQzdfTUFSSywgVkkwX0QyMl9SNl9NQVJLLCBWSTJfRDE0X1k2X01BUkssCisJVkk0X0Q4X1kwX01BUkssIFZJMF9EMjNfUjdfTUFSSywgVkkyX0QxNV9ZN19NQVJLLCBWSTRfRDlfWTFfTUFSSywKKwlWSTNfRDEyX1k0X01BUkssIFZJNF9EMTBfWTJfTUFSSywgVkkzX0QxM19ZNV9NQVJLLCBWSTRfRDExX1kzX01BUkssCisJVkkzX0QxNF9ZNl9NQVJLLCBWSTRfRklFTERfTUFSSywgVkkzX0QxNV9ZN19NQVJLLAorCisJLyogSVBTUjUgKi8KKwlWSTVfQ0xLRU5CX01BUkssIFZJMV9EMTJfRzRfWTRfQl9NQVJLLCBWSTVfSFNZTkNfTl9NQVJLLAorCVZJMV9EMTNfRzVfWTVfQl9NQVJLLCBWSTVfVlNZTkNfTl9NQVJLLCBWSTFfRDE0X0c2X1k2X0JfTUFSSywKKwlWSTVfRDBfQzBfTUFSSywgVkkxX0QxNV9HN19ZN19CX01BUkssIFZJNV9EMV9DMV9NQVJLLCBWSTFfRDE2X1IwX01BUkssCisJVkk1X0QyX0MyX01BUkssIFZJMV9EMTdfUjFfTUFSSywgVkk1X0QzX0MzX01BUkssIFZJMV9EMThfUjJfTUFSSywKKwlWSTVfRDRfQzRfTUFSSywgVkkxX0QxOV9SM19NQVJLLCBWSTVfRDVfQzVfTUFSSywgVkkxX0QyMF9SNF9NQVJLLAorCVZJNV9ENl9DNl9NQVJLLCBWSTFfRDIxX1I1X01BUkssIFZJNV9EN19DN19NQVJLLCBWSTFfRDIyX1I2X01BUkssCisJVkk1X0Q4X1kwX01BUkssIFZJMV9EMjNfUjdfTUFSSywKKworCS8qIElQU1I2ICovCisJTVNJT0YwX1NDS19NQVJLLCBIU0NLMF9NQVJLLCBNU0lPRjBfU1lOQ19NQVJLLCBIQ1RTMF9OX01BUkssCisJTVNJT0YwX1RYRF9NQVJLLCBIVFgwX01BUkssIE1TSU9GMF9SWERfTUFSSywgSFJYMF9NQVJLLAorCU1TSU9GMV9TQ0tfTUFSSywgSFNDSzFfTUFSSywgTVNJT0YxX1NZTkNfTUFSSywgSFJUUzFfTl9NQVJLLAorCU1TSU9GMV9UWERfTUFSSywgSFRYMV9NQVJLLCBNU0lPRjFfUlhEX01BUkssIEhSWDFfTUFSSywKKwlEUkFDSzBfTUFSSywgU0NLMl9NQVJLLCBEQUNLMF9NQVJLLCBUWDJfTUFSSywgRFJFUTBfTl9NQVJLLAorCVJYMl9NQVJLLCBEQUNLMV9NQVJLLCBTQ0szX01BUkssIFRYM19NQVJLLCBEUkVRMV9OX01BUkssCisJUlgzX01BUkssCisKKwkvKiBJUFNSNyAqLworCVBXTTBfTUFSSywgVENMSzFfTUFSSywgRlNPX0NGRV8wX01BUkssIFBXTTFfTUFSSywgVENMSzJfTUFSSywKKwlGU09fQ0ZFXzFfTUFSSywgUFdNMl9NQVJLLCBUQ0xLM19NQVJLLCBGU09fVE9FX01BUkssIFBXTTNfTUFSSywKKwlQV000X01BUkssIFNTSV9TQ0szNF9NQVJLLCBUUFUwVE8wX01BUkssIFNTSV9XUzM0X01BUkssIFRQVTBUTzFfTUFSSywKKwlTU0lfU0RBVEEzX01BUkssIFRQVTBUTzJfTUFSSywgU1NJX1NDSzRfTUFSSywgVFBVMFRPM19NQVJLLAorCVNTSV9XUzRfTUFSSywgU1NJX1NEQVRBNF9NQVJLLCBBVURJT19DTEtPVVRfTUFSSywgQVVESU9fQ0xLQV9NQVJLLAorCUFVRElPX0NMS0JfTUFSSywKKwlQSU5NVVhfTUFSS19FTkQsCit9OworCitzdGF0aWMgY29uc3QgdTE2IHBpbm11eF9kYXRhW10gPSB7CisJUElOTVVYX0RBVEFfR1BfQUxMKCksIC8qIFBJTk1VWF9EQVRBKEdQX01fTl9EQVRBLCBHUF9NX05fRk4uLi4pLCAqLworCisJUElOTVVYX1NJTkdMRShEVTFfREIyX0MwX0RBVEExMiksCisJUElOTVVYX1NJTkdMRShEVTFfREIzX0MxX0RBVEExMyksCisJUElOTVVYX1NJTkdMRShEVTFfREI0X0MyX0RBVEExNCksCisJUElOTVVYX1NJTkdMRShEVTFfREI1X0MzX0RBVEExNSksCisJUElOTVVYX1NJTkdMRShEVTFfREI2X0M0KSwKKwlQSU5NVVhfU0lOR0xFKERVMV9EQjdfQzUpLAorCVBJTk1VWF9TSU5HTEUoRFUxX0VYSFNZTkNfRFUxX0hTWU5DKSwKKwlQSU5NVVhfU0lOR0xFKERVMV9FWFZTWU5DX0RVMV9WU1lOQyksCisJUElOTVVYX1NJTkdMRShEVTFfRVhPRERGX0RVMV9PRERGX0RJU1BfQ0RFKSwKKwlQSU5NVVhfU0lOR0xFKERVMV9ESVNQKSwKKwlQSU5NVVhfU0lOR0xFKERVMV9DREUpLAorCVBJTk1VWF9TSU5HTEUoRDApLAorCVBJTk1VWF9TSU5HTEUoRDEpLAorCVBJTk1VWF9TSU5HTEUoRDIpLAorCVBJTk1VWF9TSU5HTEUoRDMpLAorCVBJTk1VWF9TSU5HTEUoRDQpLAorCVBJTk1VWF9TSU5HTEUoRDUpLAorCVBJTk1VWF9TSU5HTEUoRDYpLAorCVBJTk1VWF9TSU5HTEUoRDcpLAorCVBJTk1VWF9TSU5HTEUoRDgpLAorCVBJTk1VWF9TSU5HTEUoRDkpLAorCVBJTk1VWF9TSU5HTEUoRDEwKSwKKwlQSU5NVVhfU0lOR0xFKEQxMSksCisJUElOTVVYX1NJTkdMRShEMTIpLAorCVBJTk1VWF9TSU5HTEUoRDEzKSwKKwlQSU5NVVhfU0lOR0xFKEQxNCksCisJUElOTVVYX1NJTkdMRShEMTUpLAorCVBJTk1VWF9TSU5HTEUoQTApLAorCVBJTk1VWF9TSU5HTEUoQTEpLAorCVBJTk1VWF9TSU5HTEUoQTIpLAorCVBJTk1VWF9TSU5HTEUoQTMpLAorCVBJTk1VWF9TSU5HTEUoQTQpLAorCVBJTk1VWF9TSU5HTEUoQTUpLAorCVBJTk1VWF9TSU5HTEUoQTYpLAorCVBJTk1VWF9TSU5HTEUoQTcpLAorCVBJTk1VWF9TSU5HTEUoQTgpLAorCVBJTk1VWF9TSU5HTEUoQTkpLAorCVBJTk1VWF9TSU5HTEUoQTEwKSwKKwlQSU5NVVhfU0lOR0xFKEExMSksCisJUElOTVVYX1NJTkdMRShBMTIpLAorCVBJTk1VWF9TSU5HTEUoQTEzKSwKKwlQSU5NVVhfU0lOR0xFKEExNCksCisJUElOTVVYX1NJTkdMRShBMTUpLAorCVBJTk1VWF9TSU5HTEUoQTE2KSwKKwlQSU5NVVhfU0lOR0xFKEExNyksCisJUElOTVVYX1NJTkdMRShBMTgpLAorCVBJTk1VWF9TSU5HTEUoQTE5KSwKKwlQSU5NVVhfU0lOR0xFKENTMV9OX0EyNiksCisJUElOTVVYX1NJTkdMRShFWF9DUzBfTiksCisJUElOTVVYX1NJTkdMRShFWF9DUzFfTiksCisJUElOTVVYX1NJTkdMRShFWF9DUzJfTiksCisJUElOTVVYX1NJTkdMRShFWF9DUzNfTiksCisJUElOTVVYX1NJTkdMRShFWF9DUzRfTiksCisJUElOTVVYX1NJTkdMRShFWF9DUzVfTiksCisJUElOTVVYX1NJTkdMRShCU19OKSwKKwlQSU5NVVhfU0lOR0xFKFJEX04pLAorCVBJTk1VWF9TSU5HTEUoUkRfV1JfTiksCisJUElOTVVYX1NJTkdMRShXRTBfTiksCisJUElOTVVYX1NJTkdMRShXRTFfTiksCisJUElOTVVYX1NJTkdMRShFWF9XQUlUMCksCisJUElOTVVYX1NJTkdMRShJUlEwKSwKKwlQSU5NVVhfU0lOR0xFKElSUTEpLAorCVBJTk1VWF9TSU5HTEUoSVJRMiksCisJUElOTVVYX1NJTkdMRShJUlEzKSwKKwlQSU5NVVhfU0lOR0xFKENTMF9OKSwKKwlQSU5NVVhfU0lOR0xFKFZJMF9DTEspLAorCVBJTk1VWF9TSU5HTEUoVkkwX0NMS0VOQiksCisJUElOTVVYX1NJTkdMRShWSTBfSFNZTkNfTiksCisJUElOTVVYX1NJTkdMRShWSTBfVlNZTkNfTiksCisJUElOTVVYX1NJTkdMRShWSTBfRDBfQjBfQzApLAorCVBJTk1VWF9TSU5HTEUoVkkwX0QxX0IxX0MxKSwKKwlQSU5NVVhfU0lOR0xFKFZJMF9EMl9CMl9DMiksCisJUElOTVVYX1NJTkdMRShWSTBfRDNfQjNfQzMpLAorCVBJTk1VWF9TSU5HTEUoVkkwX0Q0X0I0X0M0KSwKKwlQSU5NVVhfU0lOR0xFKFZJMF9ENV9CNV9DNSksCisJUElOTVVYX1NJTkdMRShWSTBfRDZfQjZfQzYpLAorCVBJTk1VWF9TSU5HTEUoVkkwX0Q3X0I3X0M3KSwKKwlQSU5NVVhfU0lOR0xFKFZJMF9EOF9HMF9ZMCksCisJUElOTVVYX1NJTkdMRShWSTBfRDlfRzFfWTEpLAorCVBJTk1VWF9TSU5HTEUoVkkwX0QxMF9HMl9ZMiksCisJUElOTVVYX1NJTkdMRShWSTBfRDExX0czX1kzKSwKKwlQSU5NVVhfU0lOR0xFKFZJMF9GSUVMRCksCisJUElOTVVYX1NJTkdMRShWSTFfQ0xLKSwKKwlQSU5NVVhfU0lOR0xFKFZJMV9DTEtFTkIpLAorCVBJTk1VWF9TSU5HTEUoVkkxX0hTWU5DX04pLAorCVBJTk1VWF9TSU5HTEUoVkkxX1ZTWU5DX04pLAorCVBJTk1VWF9TSU5HTEUoVkkxX0QwX0IwX0MwKSwKKwlQSU5NVVhfU0lOR0xFKFZJMV9EMV9CMV9DMSksCisJUElOTVVYX1NJTkdMRShWSTFfRDJfQjJfQzIpLAorCVBJTk1VWF9TSU5HTEUoVkkxX0QzX0IzX0MzKSwKKwlQSU5NVVhfU0lOR0xFKFZJMV9ENF9CNF9DNCksCisJUElOTVVYX1NJTkdMRShWSTFfRDVfQjVfQzUpLAorCVBJTk1VWF9TSU5HTEUoVkkxX0Q2X0I2X0M2KSwKKwlQSU5NVVhfU0lOR0xFKFZJMV9EN19CN19DNyksCisJUElOTVVYX1NJTkdMRShWSTFfRDhfRzBfWTApLAorCVBJTk1VWF9TSU5HTEUoVkkxX0Q5X0cxX1kxKSwKKwlQSU5NVVhfU0lOR0xFKFZJMV9EMTBfRzJfWTIpLAorCVBJTk1VWF9TSU5HTEUoVkkxX0QxMV9HM19ZMyksCisJUElOTVVYX1NJTkdMRShWSTFfRklFTEQpLAorCVBJTk1VWF9TSU5HTEUoVkkzX0QxMF9ZMiksCisJUElOTVVYX1NJTkdMRShWSTNfRklFTEQpLAorCVBJTk1VWF9TSU5HTEUoVkk0X0NMSyksCisJUElOTVVYX1NJTkdMRShWSTVfQ0xLKSwKKwlQSU5NVVhfU0lOR0xFKFZJNV9EOV9ZMSksCisJUElOTVVYX1NJTkdMRShWSTVfRDEwX1kyKSwKKwlQSU5NVVhfU0lOR0xFKFZJNV9EMTFfWTMpLAorCVBJTk1VWF9TSU5HTEUoVkk1X0ZJRUxEKSwKKwlQSU5NVVhfU0lOR0xFKEhSVFMwX04pLAorCVBJTk1VWF9TSU5HTEUoSENUUzFfTiksCisJUElOTVVYX1NJTkdMRShTQ0swKSwKKwlQSU5NVVhfU0lOR0xFKENUUzBfTiksCisJUElOTVVYX1NJTkdMRShSVFMwX04pLAorCVBJTk1VWF9TSU5HTEUoVFgwKSwKKwlQSU5NVVhfU0lOR0xFKFJYMCksCisJUElOTVVYX1NJTkdMRShTQ0sxKSwKKwlQSU5NVVhfU0lOR0xFKENUUzFfTiksCisJUElOTVVYX1NJTkdMRShSVFMxX04pLAorCVBJTk1VWF9TSU5HTEUoVFgxKSwKKwlQSU5NVVhfU0lOR0xFKFJYMSksCisJUElOTVVYX1NJTkdMRShTQ0lGX0NMSyksCisJUElOTVVYX1NJTkdMRShDQU4wX1RYKSwKKwlQSU5NVVhfU0lOR0xFKENBTjBfUlgpLAorCVBJTk1VWF9TSU5HTEUoQ0FOX0NMSyksCisJUElOTVVYX1NJTkdMRShDQU4xX1RYKSwKKwlQSU5NVVhfU0lOR0xFKENBTjFfUlgpLAorCVBJTk1VWF9TSU5HTEUoU0QwX0NMSyksCisJUElOTVVYX1NJTkdMRShTRDBfQ01EKSwKKwlQSU5NVVhfU0lOR0xFKFNEMF9EQVQwKSwKKwlQSU5NVVhfU0lOR0xFKFNEMF9EQVQxKSwKKwlQSU5NVVhfU0lOR0xFKFNEMF9EQVQyKSwKKwlQSU5NVVhfU0lOR0xFKFNEMF9EQVQzKSwKKwlQSU5NVVhfU0lOR0xFKFNEMF9DRCksCisJUElOTVVYX1NJTkdMRShTRDBfV1ApLAorCVBJTk1VWF9TSU5HTEUoQURJQ0xLKSwKKwlQSU5NVVhfU0lOR0xFKEFESUNTX1NBTVApLAorCVBJTk1VWF9TSU5HTEUoQURJREFUQSksCisJUElOTVVYX1NJTkdMRShBRElDSFMwKSwKKwlQSU5NVVhfU0lOR0xFKEFESUNIUzEpLAorCVBJTk1VWF9TSU5HTEUoQURJQ0hTMiksCisJUElOTVVYX1NJTkdMRShBVlMxKSwKKwlQSU5NVVhfU0lOR0xFKEFWUzIpLAorCisJLyogSVBTUjAgKi8KKwlQSU5NVVhfSVBTUl9HUFNSKElQMF8wLCBEVTBfRFIwX0RBVEEwKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMF8xLCBEVTBfRFIxX0RBVEExKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMF8yLCBEVTBfRFIyX1k0X0RBVEEyKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMF8zLCBEVTBfRFIzX1k1X0RBVEEzKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMF80LCBEVTBfRFI0X1k2X0RBVEE0KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMF81LCBEVTBfRFI1X1k3X0RBVEE1KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMF82LCBEVTBfRFI2X1k4X0RBVEE2KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMF83LCBEVTBfRFI3X1k5X0RBVEE3KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMF84LCBEVTBfREcwX0RBVEE4KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMF85LCBEVTBfREcxX0RBVEE5KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMF8xMCwgRFUwX0RHMl9DNl9EQVRBMTApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzExLCBEVTBfREczX0M3X0RBVEExMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDBfMTIsIERVMF9ERzRfWTBfREFUQTEyKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMF8xMywgRFUwX0RHNV9ZMV9EQVRBMTMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzE0LCBEVTBfREc2X1kyX0RBVEExNCksCisJUElOTVVYX0lQU1JfR1BTUihJUDBfMTUsIERVMF9ERzdfWTNfREFUQTE1KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMF8xNiwgRFUwX0RCMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDBfMTcsIERVMF9EQjEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzE4LCBEVTBfREIyX0MwKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMF8xOSwgRFUwX0RCM19DMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDBfMjAsIERVMF9EQjRfQzIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzIxLCBEVTBfREI1X0MzKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMF8yMiwgRFUwX0RCNl9DNCksCisJUElOTVVYX0lQU1JfR1BTUihJUDBfMjMsIERVMF9EQjdfQzUpLAorCisJLyogSVBTUjEgKi8KKwlQSU5NVVhfSVBTUl9HUFNSKElQMV8wLCBEVTBfRVhIU1lOQ19EVTBfSFNZTkMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzEsIERVMF9FWFZTWU5DX0RVMF9WU1lOQyksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMiwgRFUwX0VYT0RERl9EVTBfT0RERl9ESVNQX0NERSksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMywgRFUwX0RJU1ApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzQsIERVMF9DREUpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzUsIERVMV9EUjJfWTRfREFUQTApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzYsIERVMV9EUjNfWTVfREFUQTEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzcsIERVMV9EUjRfWTZfREFUQTIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzgsIERVMV9EUjVfWTdfREFUQTMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzksIERVMV9EUjZfREFUQTQpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzEwLCBEVTFfRFI3X0RBVEE1KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV8xMSwgRFUxX0RHMl9DNl9EQVRBNiksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMTIsIERVMV9ERzNfQzdfREFUQTcpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzEzLCBEVTFfREc0X1kwX0RBVEE4KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV8xNCwgRFUxX0RHNV9ZMV9EQVRBOSksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMTUsIERVMV9ERzZfWTJfREFUQTEwKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV8xNiwgRFUxX0RHN19ZM19EQVRBMTEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzE3LCBBMjApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzE3LCBNT1NJX0lPMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMTgsIEEyMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMTgsIE1JU09fSU8xKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV8xOSwgQTIyKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV8xOSwgSU8yKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV8yMCwgQTIzKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV8yMCwgSU8zKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV8yMSwgQTI0KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV8yMSwgU1BDTEspLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzIyLCBBMjUpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzIyLCBTU0wpLAorCisJLyogSVBTUjIgKi8KKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8wLCBWSTJfQ0xLKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8wLCBBVkJfUlhfQ0xLKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8xLCBWSTJfQ0xLRU5CKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8xLCBBVkJfUlhfRFYpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzIsIFZJMl9IU1lOQ19OKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8yLCBBVkJfUlhEMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfMywgVkkyX1ZTWU5DX04pLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzMsIEFWQl9SWEQxKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl80LCBWSTJfRDBfQzApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzQsIEFWQl9SWEQyKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl81LCBWSTJfRDFfQzEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzUsIEFWQl9SWEQzKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl82LCBWSTJfRDJfQzIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzYsIEFWQl9SWEQ0KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl83LCBWSTJfRDNfQzMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzcsIEFWQl9SWEQ1KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl84LCBWSTJfRDRfQzQpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzgsIEFWQl9SWEQ2KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl85LCBWSTJfRDVfQzUpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzksIEFWQl9SWEQ3KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8xMCwgVkkyX0Q2X0M2KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8xMCwgQVZCX1JYX0VSKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8xMSwgVkkyX0Q3X0M3KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8xMSwgQVZCX0NPTCksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfMTIsIFZJMl9EOF9ZMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfMTIsIEFWQl9UWEQzKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8xMywgVkkyX0Q5X1kxKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8xMywgQVZCX1RYX0VOKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8xNCwgVkkyX0QxMF9ZMiksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfMTQsIEFWQl9UWEQwKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8xNSwgVkkyX0QxMV9ZMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfMTUsIEFWQl9UWEQxKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8xNiwgVkkyX0ZJRUxEKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8xNiwgQVZCX1RYRDIpLAorCisJLyogSVBTUjMgKi8KKwlQSU5NVVhfSVBTUl9HUFNSKElQM18wLCBWSTNfQ0xLKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQM18wLCBBVkJfVFhfQ0xLKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQM18xLCBWSTNfQ0xLRU5CKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQM18xLCBBVkJfVFhENCksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMiwgVkkzX0hTWU5DX04pLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzIsIEFWQl9UWEQ1KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQM18zLCBWSTNfVlNZTkNfTiksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMywgQVZCX1RYRDYpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzQsIFZJM19EMF9DMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfNCwgQVZCX1RYRDcpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzUsIFZJM19EMV9DMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfNSwgQVZCX1RYX0VSKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQM182LCBWSTNfRDJfQzIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzYsIEFWQl9HVFhfQ0xLKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQM183LCBWSTNfRDNfQzMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzcsIEFWQl9NREMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzgsIFZJM19ENF9DNCksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfOCwgQVZCX01ESU8pLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzksIFZJM19ENV9DNSksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfOSwgQVZCX0xJTkspLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzEwLCBWSTNfRDZfQzYpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzEwLCBBVkJfTUFHSUMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzExLCBWSTNfRDdfQzcpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzExLCBBVkJfUEhZX0lOVCksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMTIsIFZJM19EOF9ZMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMTIsIEFWQl9DUlMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzEzLCBWSTNfRDlfWTEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzEzLCBBVkJfR1RYUkVGQ0xLKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQM18xNCwgVkkzX0QxMV9ZMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMTQsIEFWQl9BVlRQX01BVENIKSwKKworCS8qIElQU1I0ICovCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMCwgVkk0X0NMS0VOQiksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMCwgVkkwX0QxMl9HNF9ZNCksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMSwgVkk0X0hTWU5DX04pLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzEsIFZJMF9EMTNfRzVfWTUpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzNfMiwgVkk0X1ZTWU5DX04pLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzNfMiwgVkkwX0QxNF9HNl9ZNiksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfNCwgVkk0X0QwX0MwKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF80LCBWSTBfRDE1X0c3X1k3KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF82XzUsIFZJNF9EMV9DMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfNl81LCBWSTBfRDE2X1IwKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNF82XzUsIFZJMV9EMTJfRzRfWTQsIFNFTF9WSTFfMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfOF83LCBWSTRfRDJfQzIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzhfNywgVkkwX0QxN19SMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDRfOF83LCBWSTFfRDEzX0c1X1k1LCBTRUxfVkkxXzApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzEwXzksIFZJNF9EM19DMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMTBfOSwgVkkwX0QxOF9SMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDRfMTBfOSwgVkkxX0QxNF9HNl9ZNiwgU0VMX1ZJMV8wKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8xMl8xMSwgVkk0X0Q0X0M0KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8xMl8xMSwgVkkwX0QxOV9SMyksCisJUElOTVVYX0lQU1JfTVNFTChJUDRfMTJfMTEsIFZJMV9EMTVfRzdfWTcsIFNFTF9WSTFfMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMTRfMTMsIFZJNF9ENV9DNSksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMTRfMTMsIFZJMF9EMjBfUjQpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzE0XzEzLCBWSTJfRDEyX1k0KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8xNl8xNSwgVkk0X0Q2X0M2KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8xNl8xNSwgVkkwX0QyMV9SNSksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMTZfMTUsIFZJMl9EMTNfWTUpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzE4XzE3LCBWSTRfRDdfQzcpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzE4XzE3LCBWSTBfRDIyX1I2KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8xOF8xNywgVkkyX0QxNF9ZNiksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMjBfMTksIFZJNF9EOF9ZMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMjBfMTksIFZJMF9EMjNfUjcpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzIwXzE5LCBWSTJfRDE1X1k3KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8yMSwgVkk0X0Q5X1kxKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8yMSwgVkkzX0QxMl9ZNCksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMjIsIFZJNF9EMTBfWTIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzIyLCBWSTNfRDEzX1k1KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8yMywgVkk0X0QxMV9ZMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMjMsIFZJM19EMTRfWTYpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzI0LCBWSTRfRklFTEQpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzI0LCBWSTNfRDE1X1k3KSwKKworCS8qIElQU1I1ICovCisJUElOTVVYX0lQU1JfR1BTUihJUDVfMCwgVkk1X0NMS0VOQiksCisJUElOTVVYX0lQU1JfTVNFTChJUDVfMCwgVkkxX0QxMl9HNF9ZNF9CLCBTRUxfVkkxXzEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzEsIFZJNV9IU1lOQ19OKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNV8xLCBWSTFfRDEzX0c1X1k1X0IsIFNFTF9WSTFfMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDVfMiwgVkk1X1ZTWU5DX04pLAorCVBJTk1VWF9JUFNSX01TRUwoSVA1XzIsIFZJMV9EMTRfRzZfWTZfQiwgU0VMX1ZJMV8xKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV8zLCBWSTVfRDBfQzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVA1XzMsIFZJMV9EMTVfRzdfWTdfQiwgU0VMX1ZJMV8xKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV80LCBWSTVfRDFfQzEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzQsIFZJMV9EMTZfUjApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzUsIFZJNV9EMl9DMiksCisJUElOTVVYX0lQU1JfR1BTUihJUDVfNSwgVkkxX0QxN19SMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDVfNiwgVkk1X0QzX0MzKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV82LCBWSTFfRDE4X1IyKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV83LCBWSTVfRDRfQzQpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzcsIFZJMV9EMTlfUjMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzgsIFZJNV9ENV9DNSksCisJUElOTVVYX0lQU1JfR1BTUihJUDVfOCwgVkkxX0QyMF9SNCksCisJUElOTVVYX0lQU1JfR1BTUihJUDVfOSwgVkk1X0Q2X0M2KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV85LCBWSTFfRDIxX1I1KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV8xMCwgVkk1X0Q3X0M3KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV8xMCwgVkkxX0QyMl9SNiksCisJUElOTVVYX0lQU1JfR1BTUihJUDVfMTEsIFZJNV9EOF9ZMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDVfMTEsIFZJMV9EMjNfUjcpLAorCisJLyogSVBTUjYgKi8KKwlQSU5NVVhfSVBTUl9HUFNSKElQNl8wLCBNU0lPRjBfU0NLKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNl8wLCBIU0NLMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfMSwgTVNJT0YwX1NZTkMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzEsIEhDVFMwX04pLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzIsIE1TSU9GMF9UWEQpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzIsIEhUWDApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzMsIE1TSU9GMF9SWEQpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzMsIEhSWDApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzQsIE1TSU9GMV9TQ0spLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzQsIEhTQ0sxKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNl81LCBNU0lPRjFfU1lOQyksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfNSwgSFJUUzFfTiksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfNiwgTVNJT0YxX1RYRCksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfNiwgSFRYMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfNywgTVNJT0YxX1JYRCksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfNywgSFJYMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfOV84LCBEUkFDSzApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzlfOCwgU0NLMiksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfMTFfMTAsIERBQ0swKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNl8xMV8xMCwgVFgyKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNl8xM18xMiwgRFJFUTBfTiksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfMTNfMTIsIFJYMiksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfMTVfMTQsIERBQ0sxKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNl8xNV8xNCwgU0NLMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfMTYsIFRYMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfMThfMTcsIERSRVExX04pLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzE4XzE3LCBSWDMpLAorCisJLyogSVBTUjcgKi8KKwlQSU5NVVhfSVBTUl9HUFNSKElQN18xXzAsIFBXTTApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzFfMCwgVENMSzEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzFfMCwgRlNPX0NGRV8wKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQN18zXzIsIFBXTTEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzNfMiwgVENMSzIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzNfMiwgRlNPX0NGRV8xKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQN181XzQsIFBXTTIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzVfNCwgVENMSzMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzVfNCwgRlNPX1RPRSksCisJUElOTVVYX0lQU1JfR1BTUihJUDdfNiwgUFdNMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDdfNywgUFdNNCksCisJUElOTVVYX0lQU1JfR1BTUihJUDdfOV84LCBTU0lfU0NLMzQpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzlfOCwgVFBVMFRPMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDdfMTFfMTAsIFNTSV9XUzM0KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQN18xMV8xMCwgVFBVMFRPMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDdfMTNfMTIsIFNTSV9TREFUQTMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzEzXzEyLCBUUFUwVE8yKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQN18xNV8xNCwgU1NJX1NDSzQpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzE1XzE0LCBUUFUwVE8zKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQN18xNiwgU1NJX1dTNCksCisJUElOTVVYX0lQU1JfR1BTUihJUDdfMTcsIFNTSV9TREFUQTQpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzE4LCBBVURJT19DTEtPVVQpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzE5LCBBVURJT19DTEtBKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQN18yMCwgQVVESU9fQ0xLQiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNoX3BmY19waW4gcGlubXV4X3BpbnNbXSA9IHsKKwlQSU5NVVhfR1BJT19HUF9BTEwoKSwKK307CisKKy8qIC0gQVZCIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGF2Yl9saW5rX3BpbnNbXSA9IHsKKwlSQ0FSX0dQX1BJTig3LCA5KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGF2Yl9saW5rX211eFtdID0geworCUFWQl9MSU5LX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBhdmJfbWFnaWNfcGluc1tdID0geworCVJDQVJfR1BfUElOKDcsIDEwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGF2Yl9tYWdpY19tdXhbXSA9IHsKKwlBVkJfTUFHSUNfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGF2Yl9waHlfaW50X3BpbnNbXSA9IHsKKwlSQ0FSX0dQX1BJTig3LCAxMSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBhdmJfcGh5X2ludF9tdXhbXSA9IHsKKwlBVkJfUEhZX0lOVF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYXZiX21kaW9fcGluc1tdID0geworCVJDQVJfR1BfUElOKDcsIDcpLCBSQ0FSX0dQX1BJTig3LCA4KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGF2Yl9tZGlvX211eFtdID0geworCUFWQl9NRENfTUFSSywgQVZCX01ESU9fTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGF2Yl9taWlfcGluc1tdID0geworCVJDQVJfR1BfUElOKDYsIDE0KSwgUkNBUl9HUF9QSU4oNiwgMTUpLCBSQ0FSX0dQX1BJTig2LCAxNiksCisJUkNBUl9HUF9QSU4oNiwgMTIpLAorCisJUkNBUl9HUF9QSU4oNiwgMiksICBSQ0FSX0dQX1BJTig2LCAzKSwgIFJDQVJfR1BfUElOKDYsIDQpLAorCVJDQVJfR1BfUElOKDYsIDUpLAorCisJUkNBUl9HUF9QSU4oNiwgMTApLCBSQ0FSX0dQX1BJTig2LCAwKSwgIFJDQVJfR1BfUElOKDYsIDEpLAorCVJDQVJfR1BfUElOKDcsIDEyKSwgUkNBUl9HUF9QSU4oNiwgMTMpLCBSQ0FSX0dQX1BJTig3LCA1KSwKKwlSQ0FSX0dQX1BJTig3LCAwKSwgIFJDQVJfR1BfUElOKDYsIDExKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGF2Yl9taWlfbXV4W10gPSB7CisJQVZCX1RYRDBfTUFSSywgQVZCX1RYRDFfTUFSSywgQVZCX1RYRDJfTUFSSywKKwlBVkJfVFhEM19NQVJLLAorCisJQVZCX1JYRDBfTUFSSywgQVZCX1JYRDFfTUFSSywgQVZCX1JYRDJfTUFSSywKKwlBVkJfUlhEM19NQVJLLAorCisJQVZCX1JYX0VSX01BUkssIEFWQl9SWF9DTEtfTUFSSywgQVZCX1JYX0RWX01BUkssCisJQVZCX0NSU19NQVJLLCBBVkJfVFhfRU5fTUFSSywgQVZCX1RYX0VSX01BUkssCisJQVZCX1RYX0NMS19NQVJLLCBBVkJfQ09MX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBhdmJfZ21paV9waW5zW10gPSB7CisJUkNBUl9HUF9QSU4oNiwgMTQpLCBSQ0FSX0dQX1BJTig2LCAxNSksIFJDQVJfR1BfUElOKDYsIDE2KSwKKwlSQ0FSX0dQX1BJTig2LCAxMiksIFJDQVJfR1BfUElOKDcsIDEpLCAgUkNBUl9HUF9QSU4oNywgMiksCisJUkNBUl9HUF9QSU4oNywgMyksICBSQ0FSX0dQX1BJTig3LCA0KSwKKworCVJDQVJfR1BfUElOKDYsIDIpLCAgUkNBUl9HUF9QSU4oNiwgMyksIFJDQVJfR1BfUElOKDYsIDQpLAorCVJDQVJfR1BfUElOKDYsIDUpLCAgUkNBUl9HUF9QSU4oNiwgNiksIFJDQVJfR1BfUElOKDYsIDcpLAorCVJDQVJfR1BfUElOKDYsIDgpLCAgUkNBUl9HUF9QSU4oNiwgOSksCisKKwlSQ0FSX0dQX1BJTig2LCAxMCksIFJDQVJfR1BfUElOKDYsIDApLCBSQ0FSX0dQX1BJTig2LCAxKSwKKwlSQ0FSX0dQX1BJTig3LCAxMiksIFJDQVJfR1BfUElOKDcsIDYpLCBSQ0FSX0dQX1BJTig3LCAxMyksCisJUkNBUl9HUF9QSU4oNiwgMTMpLCBSQ0FSX0dQX1BJTig3LCA1KSwgUkNBUl9HUF9QSU4oNywgMCksCisJUkNBUl9HUF9QSU4oNiwgMTEpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYXZiX2dtaWlfbXV4W10gPSB7CisJQVZCX1RYRDBfTUFSSywgQVZCX1RYRDFfTUFSSywgQVZCX1RYRDJfTUFSSywKKwlBVkJfVFhEM19NQVJLLCBBVkJfVFhENF9NQVJLLCBBVkJfVFhENV9NQVJLLAorCUFWQl9UWEQ2X01BUkssIEFWQl9UWEQ3X01BUkssCisKKwlBVkJfUlhEMF9NQVJLLCBBVkJfUlhEMV9NQVJLLCBBVkJfUlhEMl9NQVJLLAorCUFWQl9SWEQzX01BUkssIEFWQl9SWEQ0X01BUkssIEFWQl9SWEQ1X01BUkssCisJQVZCX1JYRDZfTUFSSywgQVZCX1JYRDdfTUFSSywKKworCUFWQl9SWF9FUl9NQVJLLCBBVkJfUlhfQ0xLX01BUkssIEFWQl9SWF9EVl9NQVJLLAorCUFWQl9DUlNfTUFSSywgQVZCX0dUWF9DTEtfTUFSSywgQVZCX0dUWFJFRkNMS19NQVJLLAorCUFWQl9UWF9FTl9NQVJLLCBBVkJfVFhfRVJfTUFSSywgQVZCX1RYX0NMS19NQVJLLAorCUFWQl9DT0xfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGF2Yl9hdnRwX21hdGNoX3BpbnNbXSA9IHsKKwlSQ0FSX0dQX1BJTig3LCAxNSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBhdmJfYXZ0cF9tYXRjaF9tdXhbXSA9IHsKKwlBVkJfQVZUUF9NQVRDSF9NQVJLLAorfTsKKy8qIC0gQ0FOIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNhbjBfZGF0YV9waW5zW10gPSB7CisJLyogVFgsIFJYICovCisJUkNBUl9HUF9QSU4oMTAsIDI3KSwgUkNBUl9HUF9QSU4oMTAsIDI4KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNhbjBfZGF0YV9tdXhbXSA9IHsKKwlDQU4wX1RYX01BUkssIENBTjBfUlhfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNhbjFfZGF0YV9waW5zW10gPSB7CisJLyogVFgsIFJYICovCisJUkNBUl9HUF9QSU4oMTAsIDMwKSwgUkNBUl9HUF9QSU4oMTAsIDMxKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNhbjFfZGF0YV9tdXhbXSA9IHsKKwlDQU4xX1RYX01BUkssIENBTjFfUlhfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNhbl9jbGtfcGluc1tdID0geworCS8qIENBTl9DTEsgKi8KKwlSQ0FSX0dQX1BJTigxMCwgMjkpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgY2FuX2Nsa19tdXhbXSA9IHsKKwlDQU5fQ0xLX01BUkssCit9OworLyogLSBEVSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHUwX3JnYjY2Nl9waW5zW10gPSB7CisJLyogUls3OjJdLCBHWzc6Ml0sIEJbNzoyXSAqLworCVJDQVJfR1BfUElOKDAsIDcpLCBSQ0FSX0dQX1BJTigwLCA2KSwgUkNBUl9HUF9QSU4oMCwgNSksCisJUkNBUl9HUF9QSU4oMCwgNCksIFJDQVJfR1BfUElOKDAsIDMpLCBSQ0FSX0dQX1BJTigwLCAyKSwKKwlSQ0FSX0dQX1BJTigwLCAxNSksIFJDQVJfR1BfUElOKDAsIDE0KSwgUkNBUl9HUF9QSU4oMCwgMTMpLAorCVJDQVJfR1BfUElOKDAsIDEyKSwgUkNBUl9HUF9QSU4oMCwgMTEpLCBSQ0FSX0dQX1BJTigwLCAxMCksCisJUkNBUl9HUF9QSU4oMCwgMjMpLCBSQ0FSX0dQX1BJTigwLCAyMiksIFJDQVJfR1BfUElOKDAsIDIxKSwKKwlSQ0FSX0dQX1BJTigwLCAyMCksIFJDQVJfR1BfUElOKDAsIDE5KSwgUkNBUl9HUF9QSU4oMCwgMTgpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHUwX3JnYjY2Nl9tdXhbXSA9IHsKKwlEVTBfRFI3X1k5X0RBVEE3X01BUkssIERVMF9EUjZfWThfREFUQTZfTUFSSywgRFUwX0RSNV9ZN19EQVRBNV9NQVJLLAorCURVMF9EUjRfWTZfREFUQTRfTUFSSywgRFUwX0RSM19ZNV9EQVRBM19NQVJLLCBEVTBfRFIyX1k0X0RBVEEyX01BUkssCisJRFUwX0RHN19ZM19EQVRBMTVfTUFSSywgRFUwX0RHNl9ZMl9EQVRBMTRfTUFSSywgRFUwX0RHNV9ZMV9EQVRBMTNfTUFSSywKKwlEVTBfREc0X1kwX0RBVEExMl9NQVJLLCBEVTBfREczX0M3X0RBVEExMV9NQVJLLCBEVTBfREcyX0M2X0RBVEExMF9NQVJLLAorCURVMF9EQjdfQzVfTUFSSywgRFUwX0RCNl9DNF9NQVJLLCBEVTBfREI1X0MzX01BUkssCisJRFUwX0RCNF9DMl9NQVJLLCBEVTBfREIzX0MxX01BUkssIERVMF9EQjJfQzBfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR1MF9yZ2I4ODhfcGluc1tdID0geworCS8qIFJbNzowXSwgR1s3OjBdLCBCWzc6MF0gKi8KKwlSQ0FSX0dQX1BJTigwLCA3KSwgUkNBUl9HUF9QSU4oMCwgNiksIFJDQVJfR1BfUElOKDAsIDUpLAorCVJDQVJfR1BfUElOKDAsIDQpLCBSQ0FSX0dQX1BJTigwLCAzKSwgUkNBUl9HUF9QSU4oMCwgMiksCisJUkNBUl9HUF9QSU4oMCwgMSksIFJDQVJfR1BfUElOKDAsIDApLAorCVJDQVJfR1BfUElOKDAsIDE1KSwgUkNBUl9HUF9QSU4oMCwgMTQpLCBSQ0FSX0dQX1BJTigwLCAxMyksCisJUkNBUl9HUF9QSU4oMCwgMTIpLCBSQ0FSX0dQX1BJTigwLCAxMSksIFJDQVJfR1BfUElOKDAsIDEwKSwKKwlSQ0FSX0dQX1BJTigwLCA5KSwgUkNBUl9HUF9QSU4oMCwgOCksCisJUkNBUl9HUF9QSU4oMCwgMjMpLCBSQ0FSX0dQX1BJTigwLCAyMiksIFJDQVJfR1BfUElOKDAsIDIxKSwKKwlSQ0FSX0dQX1BJTigwLCAyMCksIFJDQVJfR1BfUElOKDAsIDE5KSwgUkNBUl9HUF9QSU4oMCwgMTgpLAorCVJDQVJfR1BfUElOKDAsIDE3KSwgUkNBUl9HUF9QSU4oMCwgMTYpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHUwX3JnYjg4OF9tdXhbXSA9IHsKKwlEVTBfRFI3X1k5X0RBVEE3X01BUkssIERVMF9EUjZfWThfREFUQTZfTUFSSywgRFUwX0RSNV9ZN19EQVRBNV9NQVJLLAorCURVMF9EUjRfWTZfREFUQTRfTUFSSywgRFUwX0RSM19ZNV9EQVRBM19NQVJLLCBEVTBfRFIyX1k0X0RBVEEyX01BUkssCisJRFUwX0RSMV9EQVRBMV9NQVJLLCBEVTBfRFIwX0RBVEEwX01BUkssCisJRFUwX0RHN19ZM19EQVRBMTVfTUFSSywgRFUwX0RHNl9ZMl9EQVRBMTRfTUFSSywgRFUwX0RHNV9ZMV9EQVRBMTNfTUFSSywKKwlEVTBfREc0X1kwX0RBVEExMl9NQVJLLCBEVTBfREczX0M3X0RBVEExMV9NQVJLLCBEVTBfREcyX0M2X0RBVEExMF9NQVJLLAorCURVMF9ERzFfREFUQTlfTUFSSywgRFUwX0RHMF9EQVRBOF9NQVJLLAorCURVMF9EQjdfQzVfTUFSSywgRFUwX0RCNl9DNF9NQVJLLCBEVTBfREI1X0MzX01BUkssCisJRFUwX0RCNF9DMl9NQVJLLCBEVTBfREIzX0MxX01BUkssIERVMF9EQjJfQzBfTUFSSywKKwlEVTBfREIxX01BUkssIERVMF9EQjBfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR1MF9zeW5jX3BpbnNbXSA9IHsKKwkvKiBFWFZTWU5DL1ZTWU5DLCBFWEhTWU5DL0hTWU5DICovCisJUkNBUl9HUF9QSU4oMCwgMjUpLCBSQ0FSX0dQX1BJTigwLCAyNCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdTBfc3luY19tdXhbXSA9IHsKKwlEVTBfRVhWU1lOQ19EVTBfVlNZTkNfTUFSSywgRFUwX0VYSFNZTkNfRFUwX0hTWU5DX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdTBfb2RkZl9waW5zW10gPSB7CisJLyogRVhPRERGL09EREYvRElTUC9DREUgKi8KKwlSQ0FSX0dQX1BJTigwLCAyNiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdTBfb2RkZl9tdXhbXSA9IHsKKwlEVTBfRVhPRERGX0RVMF9PRERGX0RJU1BfQ0RFX01BUksKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR1MF9kaXNwX3BpbnNbXSA9IHsKKwkvKiBESVNQICovCisJUkNBUl9HUF9QSU4oMCwgMjcpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHUwX2Rpc3BfbXV4W10gPSB7CisJRFUwX0RJU1BfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR1MF9jZGVfcGluc1tdID0geworCS8qIENERSAqLworCVJDQVJfR1BfUElOKDAsIDI4KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR1MF9jZGVfbXV4W10gPSB7CisJRFUwX0NERV9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHUxX3JnYjY2Nl9waW5zW10gPSB7CisJLyogUls3OjJdLCBHWzc6Ml0sIEJbNzoyXSAqLworCVJDQVJfR1BfUElOKDEsIDUpLCBSQ0FSX0dQX1BJTigxLCA0KSwgUkNBUl9HUF9QSU4oMSwgMyksCisJUkNBUl9HUF9QSU4oMSwgMiksIFJDQVJfR1BfUElOKDEsIDEpLCBSQ0FSX0dQX1BJTigxLCAwKSwKKwlSQ0FSX0dQX1BJTigxLCAxMSksIFJDQVJfR1BfUElOKDEsIDEwKSwgUkNBUl9HUF9QSU4oMSwgOSksCisJUkNBUl9HUF9QSU4oMSwgOCksIFJDQVJfR1BfUElOKDEsIDcpLCBSQ0FSX0dQX1BJTigxLCA2KSwKKwlSQ0FSX0dQX1BJTigxLCAxNyksIFJDQVJfR1BfUElOKDEsIDE2KSwgUkNBUl9HUF9QSU4oMSwgMTUpLAorCVJDQVJfR1BfUElOKDEsIDE0KSwgUkNBUl9HUF9QSU4oMSwgMTMpLCBSQ0FSX0dQX1BJTigxLCAxMiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdTFfcmdiNjY2X211eFtdID0geworCURVMV9EUjdfREFUQTVfTUFSSywgRFUxX0RSNl9EQVRBNF9NQVJLLCBEVTFfRFI1X1k3X0RBVEEzX01BUkssCisJRFUxX0RSNF9ZNl9EQVRBMl9NQVJLLCBEVTFfRFIzX1k1X0RBVEExX01BUkssIERVMV9EUjJfWTRfREFUQTBfTUFSSywKKwlEVTFfREc3X1kzX0RBVEExMV9NQVJLLCBEVTFfREc2X1kyX0RBVEExMF9NQVJLLCBEVTFfREc1X1kxX0RBVEE5X01BUkssCisJRFUxX0RHNF9ZMF9EQVRBOF9NQVJLLCBEVTFfREczX0M3X0RBVEE3X01BUkssIERVMV9ERzJfQzZfREFUQTZfTUFSSywKKwlEVTFfREI3X0M1X01BUkssIERVMV9EQjZfQzRfTUFSSywgRFUxX0RCNV9DM19EQVRBMTVfTUFSSywKKwlEVTFfREI0X0MyX0RBVEExNF9NQVJLLCBEVTFfREIzX0MxX0RBVEExM19NQVJLLCBEVTFfREIyX0MwX0RBVEExMl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHUxX3N5bmNfcGluc1tdID0geworCS8qIEVYVlNZTkMvVlNZTkMsIEVYSFNZTkMvSFNZTkMgKi8KKwlSQ0FSX0dQX1BJTigxLCAxOSksIFJDQVJfR1BfUElOKDEsIDE4KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR1MV9zeW5jX211eFtdID0geworCURVMV9FWFZTWU5DX0RVMV9WU1lOQ19NQVJLLCBEVTFfRVhIU1lOQ19EVTFfSFNZTkNfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR1MV9vZGRmX3BpbnNbXSA9IHsKKwkvKiBFWE9EREYvT0RERi9ESVNQL0NERSAqLworCVJDQVJfR1BfUElOKDEsIDIwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR1MV9vZGRmX211eFtdID0geworCURVMV9FWE9EREZfRFUxX09EREZfRElTUF9DREVfTUFSSworfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHUxX2Rpc3BfcGluc1tdID0geworCS8qIERJU1AgKi8KKwlSQ0FSX0dQX1BJTigxLCAyMSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdTFfZGlzcF9tdXhbXSA9IHsKKwlEVTFfRElTUF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHUxX2NkZV9waW5zW10gPSB7CisJLyogQ0RFICovCisJUkNBUl9HUF9QSU4oMSwgMjIpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHUxX2NkZV9tdXhbXSA9IHsKKwlEVTFfQ0RFX01BUkssCit9OworLyogLSBJTlRDIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaW50Y19pcnEwX3BpbnNbXSA9IHsKKwkvKiBJUlEwICovCisJUkNBUl9HUF9QSU4oMywgMTkpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaW50Y19pcnEwX211eFtdID0geworCUlSUTBfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGludGNfaXJxMV9waW5zW10gPSB7CisJLyogSVJRMSAqLworCVJDQVJfR1BfUElOKDMsIDIwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGludGNfaXJxMV9tdXhbXSA9IHsKKwlJUlExX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpbnRjX2lycTJfcGluc1tdID0geworCS8qIElSUTIgKi8KKwlSQ0FSX0dQX1BJTigzLCAyMSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpbnRjX2lycTJfbXV4W10gPSB7CisJSVJRMl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaW50Y19pcnEzX3BpbnNbXSA9IHsKKwkvKiBJUlEzICovCisJUkNBUl9HUF9QSU4oMywgMjIpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaW50Y19pcnEzX211eFtdID0geworCUlSUTNfTUFSSywKK307CisvKiAtIExCU0MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBsYnNjX2NzMF9waW5zW10gPSB7CisJLyogQ1MwIyAqLworCVJDQVJfR1BfUElOKDMsIDI3KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGxic2NfY3MwX211eFtdID0geworCUNTMF9OX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBsYnNjX2NzMV9waW5zW10gPSB7CisJLyogQ1MxI19BMjYgKi8KKwlSQ0FSX0dQX1BJTigzLCA2KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGxic2NfY3MxX211eFtdID0geworCUNTMV9OX0EyNl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbGJzY19leF9jczBfcGluc1tdID0geworCS8qIEVYX0NTMCMgKi8KKwlSQ0FSX0dQX1BJTigzLCA3KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGxic2NfZXhfY3MwX211eFtdID0geworCUVYX0NTMF9OX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBsYnNjX2V4X2NzMV9waW5zW10gPSB7CisJLyogRVhfQ1MxIyAqLworCVJDQVJfR1BfUElOKDMsIDgpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbGJzY19leF9jczFfbXV4W10gPSB7CisJRVhfQ1MxX05fTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGxic2NfZXhfY3MyX3BpbnNbXSA9IHsKKwkvKiBFWF9DUzIjICovCisJUkNBUl9HUF9QSU4oMywgOSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBsYnNjX2V4X2NzMl9tdXhbXSA9IHsKKwlFWF9DUzJfTl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbGJzY19leF9jczNfcGluc1tdID0geworCS8qIEVYX0NTMyMgKi8KKwlSQ0FSX0dQX1BJTigzLCAxMCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBsYnNjX2V4X2NzM19tdXhbXSA9IHsKKwlFWF9DUzNfTl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbGJzY19leF9jczRfcGluc1tdID0geworCS8qIEVYX0NTNCMgKi8KKwlSQ0FSX0dQX1BJTigzLCAxMSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBsYnNjX2V4X2NzNF9tdXhbXSA9IHsKKwlFWF9DUzRfTl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbGJzY19leF9jczVfcGluc1tdID0geworCS8qIEVYX0NTNSMgKi8KKwlSQ0FSX0dQX1BJTigzLCAxMiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBsYnNjX2V4X2NzNV9tdXhbXSA9IHsKKwlFWF9DUzVfTl9NQVJLLAorfTsKKy8qIC0gTVNJT0YwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9jbGtfcGluc1tdID0geworCS8qIFNDSyAqLworCVJDQVJfR1BfUElOKDEwLCAwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMF9jbGtfbXV4W10gPSB7CisJTVNJT0YwX1NDS19NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3N5bmNfcGluc1tdID0geworCS8qIFNZTkMgKi8KKwlSQ0FSX0dQX1BJTigxMCwgMSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfc3luY19tdXhbXSA9IHsKKwlNU0lPRjBfU1lOQ19NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3J4X3BpbnNbXSA9IHsKKwkvKiBSWEQgKi8KKwlSQ0FSX0dQX1BJTigxMCwgNCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfcnhfbXV4W10gPSB7CisJTVNJT0YwX1JYRF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YwX3R4X3BpbnNbXSA9IHsKKwkvKiBUWEQgKi8KKwlSQ0FSX0dQX1BJTigxMCwgMyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjBfdHhfbXV4W10gPSB7CisJTVNJT0YwX1RYRF9NQVJLLAorfTsKKy8qIC0gTVNJT0YxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9jbGtfcGluc1tdID0geworCS8qIFNDSyAqLworCVJDQVJfR1BfUElOKDEwLCA1KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1zaW9mMV9jbGtfbXV4W10gPSB7CisJTVNJT0YxX1NDS19NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3N5bmNfcGluc1tdID0geworCS8qIFNZTkMgKi8KKwlSQ0FSX0dQX1BJTigxMCwgNiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfc3luY19tdXhbXSA9IHsKKwlNU0lPRjFfU1lOQ19NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3J4X3BpbnNbXSA9IHsKKwkvKiBSWEQgKi8KKwlSQ0FSX0dQX1BJTigxMCwgOSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfcnhfbXV4W10gPSB7CisJTVNJT0YxX1JYRF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbXNpb2YxX3R4X3BpbnNbXSA9IHsKKwkvKiBUWEQgKi8KKwlSQ0FSX0dQX1BJTigxMCwgOCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtc2lvZjFfdHhfbXV4W10gPSB7CisJTVNJT0YxX1RYRF9NQVJLLAorfTsKKy8qIC0gUVNQSSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHFzcGlfY3RybF9waW5zW10gPSB7CisJLyogU1BDTEssIFNTTCAqLworCVJDQVJfR1BfUElOKDMsIDI1KSwgUkNBUl9HUF9QSU4oMywgMjYpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcXNwaV9jdHJsX211eFtdID0geworCVNQQ0xLX01BUkssIFNTTF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcXNwaV9kYXRhMl9waW5zW10gPSB7CisJLyogTU9TSV9JTzAsIE1JU09fSU8xICovCisJUkNBUl9HUF9QSU4oMywgNCksIFJDQVJfR1BfUElOKDMsIDUpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcXNwaV9kYXRhMl9tdXhbXSA9IHsKKwlNT1NJX0lPMF9NQVJLLCBNSVNPX0lPMV9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcXNwaV9kYXRhNF9waW5zW10gPSB7CisJLyogTU9TSV9JTzAsIE1JU09fSU8xLCBJTzIsIElPMyAqLworCVJDQVJfR1BfUElOKDMsIDQpLCBSQ0FSX0dQX1BJTigzLCA1KSwgUkNBUl9HUF9QSU4oMywgMjMpLAorCVJDQVJfR1BfUElOKDMsIDI0KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHFzcGlfZGF0YTRfbXV4W10gPSB7CisJTU9TSV9JTzBfTUFSSywgTUlTT19JTzFfTUFSSywgSU8yX01BUkssCUlPM19NQVJLLAorfTsKKy8qIC0gU0NJRjAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYwX2RhdGFfcGluc1tdID0geworCS8qIFJYLCBUWCAqLworCVJDQVJfR1BfUElOKDEwLCAxNCksIFJDQVJfR1BfUElOKDEwLCAxMyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmMF9kYXRhX211eFtdID0geworCVJYMF9NQVJLLCBUWDBfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYwX2Nsa19waW5zW10gPSB7CisJLyogU0NLICovCisJUkNBUl9HUF9QSU4oMTAsIDEwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYwX2Nsa19tdXhbXSA9IHsKKwlTQ0swX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmMF9jdHJsX3BpbnNbXSA9IHsKKwkvKiBSVFMsIENUUyAqLworCVJDQVJfR1BfUElOKDEwLCAxMiksIFJDQVJfR1BfUElOKDEwLCAxMSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmMF9jdHJsX211eFtdID0geworCVJUUzBfTl9NQVJLLCBDVFMwX05fTUFSSywKK307CisvKiAtIFNDSUYzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmM19kYXRhX3BpbnNbXSA9IHsKKwkvKiBSWCwgVFggKi8KKwlSQ0FSX0dQX1BJTigxMCwgMjUpLCBSQ0FSX0dQX1BJTigxMCwgMjQpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjNfZGF0YV9tdXhbXSA9IHsKKwlSWDNfTUFSSywgVFgzX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmM19jbGtfcGluc1tdID0geworCS8qIFNDSyAqLworCVJDQVJfR1BfUElOKDEwLCAyMyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmM19jbGtfbXV4W10gPSB7CisJU0NLM19NQVJLLAorfTsKKy8qIC0gU0RISTAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkwX2RhdGExX3BpbnNbXSA9IHsKKwkvKiBEQVQwICovCisJUkNBUl9HUF9QSU4oMTEsIDcpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTBfZGF0YTFfbXV4W10gPSB7CisJU0QwX0RBVDBfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkwX2RhdGE0X3BpbnNbXSA9IHsKKwkvKiBEQVRbMC0zXSAqLworCVJDQVJfR1BfUElOKDExLCA3KSwgUkNBUl9HUF9QSU4oMTEsIDgpLAorCVJDQVJfR1BfUElOKDExLCA5KSwgUkNBUl9HUF9QSU4oMTEsIDEwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkwX2RhdGE0X211eFtdID0geworCVNEMF9EQVQwX01BUkssIFNEMF9EQVQxX01BUkssIFNEMF9EQVQyX01BUkssIFNEMF9EQVQzX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMF9jdHJsX3BpbnNbXSA9IHsKKwkvKiBDTEssIENNRCAqLworCVJDQVJfR1BfUElOKDExLCA1KSwgUkNBUl9HUF9QSU4oMTEsIDYpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTBfY3RybF9tdXhbXSA9IHsKKwlTRDBfQ0xLX01BUkssIFNEMF9DTURfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkwX2NkX3BpbnNbXSA9IHsKKwkvKiBDRCAqLworCVJDQVJfR1BfUElOKDExLCAxMSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMF9jZF9tdXhbXSA9IHsKKwlTRDBfQ0RfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkwX3dwX3BpbnNbXSA9IHsKKwkvKiBXUCAqLworCVJDQVJfR1BfUElOKDExLCAxMiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMF93cF9tdXhbXSA9IHsKKwlTRDBfV1BfTUFSSywKK307CisvKiAtIFZJTjAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGNvbnN0IHVuaW9uIHZpbl9kYXRhIHZpbjBfZGF0YV9waW5zID0geworCS5kYXRhMjQgPSB7CisJCS8qIEIgKi8KKwkJUkNBUl9HUF9QSU4oNCwgNCksIFJDQVJfR1BfUElOKDQsIDUpLAorCQlSQ0FSX0dQX1BJTig0LCA2KSwgUkNBUl9HUF9QSU4oNCwgNyksCisJCVJDQVJfR1BfUElOKDQsIDgpLCBSQ0FSX0dQX1BJTig0LCA5KSwKKwkJUkNBUl9HUF9QSU4oNCwgMTApLCBSQ0FSX0dQX1BJTig0LCAxMSksCisJCS8qIEcgKi8KKwkJUkNBUl9HUF9QSU4oNCwgMTIpLCBSQ0FSX0dQX1BJTig0LCAxMyksCisJCVJDQVJfR1BfUElOKDQsIDE0KSwgUkNBUl9HUF9QSU4oNCwgMTUpLAorCQlSQ0FSX0dQX1BJTig4LCAxKSwgUkNBUl9HUF9QSU4oOCwgMiksCisJCVJDQVJfR1BfUElOKDgsIDMpLCBSQ0FSX0dQX1BJTig4LCA0KSwKKwkJLyogUiAqLworCQlSQ0FSX0dQX1BJTig4LCA1KSwgUkNBUl9HUF9QSU4oOCwgNiksCisJCVJDQVJfR1BfUElOKDgsIDcpLCBSQ0FSX0dQX1BJTig4LCA4KSwKKwkJUkNBUl9HUF9QSU4oOCwgOSksIFJDQVJfR1BfUElOKDgsIDEwKSwKKwkJUkNBUl9HUF9QSU4oOCwgMTEpLCBSQ0FSX0dQX1BJTig4LCAxMiksCisJfSwKK307CitzdGF0aWMgY29uc3QgdW5pb24gdmluX2RhdGEgdmluMF9kYXRhX211eCA9IHsKKwkuZGF0YTI0ID0geworCQkvKiBCICovCisJCVZJMF9EMF9CMF9DMF9NQVJLLCBWSTBfRDFfQjFfQzFfTUFSSywKKwkJVkkwX0QyX0IyX0MyX01BUkssIFZJMF9EM19CM19DM19NQVJLLAorCQlWSTBfRDRfQjRfQzRfTUFSSywgVkkwX0Q1X0I1X0M1X01BUkssCisJCVZJMF9ENl9CNl9DNl9NQVJLLCBWSTBfRDdfQjdfQzdfTUFSSywKKwkJLyogRyAqLworCQlWSTBfRDhfRzBfWTBfTUFSSywgVkkwX0Q5X0cxX1kxX01BUkssCisJCVZJMF9EMTBfRzJfWTJfTUFSSywgVkkwX0QxMV9HM19ZM19NQVJLLAorCQlWSTBfRDEyX0c0X1k0X01BUkssIFZJMF9EMTNfRzVfWTVfTUFSSywKKwkJVkkwX0QxNF9HNl9ZNl9NQVJLLCBWSTBfRDE1X0c3X1k3X01BUkssCisJCS8qIFIgKi8KKwkJVkkwX0QxNl9SMF9NQVJLLCBWSTBfRDE3X1IxX01BUkssCisJCVZJMF9EMThfUjJfTUFSSywgVkkwX0QxOV9SM19NQVJLLAorCQlWSTBfRDIwX1I0X01BUkssIFZJMF9EMjFfUjVfTUFSSywKKwkJVkkwX0QyMl9SNl9NQVJLLCBWSTBfRDIzX1I3X01BUkssCisJfSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjBfZGF0YTE4X3BpbnNbXSA9IHsKKwkvKiBCICovCisJUkNBUl9HUF9QSU4oNCwgNiksIFJDQVJfR1BfUElOKDQsIDcpLAorCVJDQVJfR1BfUElOKDQsIDgpLCBSQ0FSX0dQX1BJTig0LCA5KSwKKwlSQ0FSX0dQX1BJTig0LCAxMCksIFJDQVJfR1BfUElOKDQsIDExKSwKKwkvKiBHICovCisJUkNBUl9HUF9QSU4oNCwgMTQpLCBSQ0FSX0dQX1BJTig0LCAxNSksCisJUkNBUl9HUF9QSU4oOCwgMSksIFJDQVJfR1BfUElOKDgsIDIpLAorCVJDQVJfR1BfUElOKDgsIDMpLCBSQ0FSX0dQX1BJTig4LCA0KSwKKwkvKiBSICovCisJUkNBUl9HUF9QSU4oOCwgNyksIFJDQVJfR1BfUElOKDgsIDgpLAorCVJDQVJfR1BfUElOKDgsIDkpLCBSQ0FSX0dQX1BJTig4LCAxMCksCisJUkNBUl9HUF9QSU4oOCwgMTEpLCBSQ0FSX0dQX1BJTig4LCAxMiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW4wX2RhdGExOF9tdXhbXSA9IHsKKwkvKiBCICovCisJVkkwX0QyX0IyX0MyX01BUkssIFZJMF9EM19CM19DM19NQVJLLAorCVZJMF9ENF9CNF9DNF9NQVJLLCBWSTBfRDVfQjVfQzVfTUFSSywKKwlWSTBfRDZfQjZfQzZfTUFSSywgVkkwX0Q3X0I3X0M3X01BUkssCisJLyogRyAqLworCVZJMF9EMTBfRzJfWTJfTUFSSywgVkkwX0QxMV9HM19ZM19NQVJLLAorCVZJMF9EMTJfRzRfWTRfTUFSSywgVkkwX0QxM19HNV9ZNV9NQVJLLAorCVZJMF9EMTRfRzZfWTZfTUFSSywgVkkwX0QxNV9HN19ZN19NQVJLLAorCS8qIFIgKi8KKwlWSTBfRDE4X1IyX01BUkssIFZJMF9EMTlfUjNfTUFSSywKKwlWSTBfRDIwX1I0X01BUkssIFZJMF9EMjFfUjVfTUFSSywKKwlWSTBfRDIyX1I2X01BUkssIFZJMF9EMjNfUjdfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjBfc3luY19waW5zW10gPSB7CisJLyogSFNZTkMjLCBWU1lOQyMgKi8KKwlSQ0FSX0dQX1BJTig0LCAyKSwgUkNBUl9HUF9QSU4oNCwgMyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW4wX3N5bmNfbXV4W10gPSB7CisJVkkwX0hTWU5DX05fTUFSSywgVkkwX1ZTWU5DX05fTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjBfZmllbGRfcGluc1tdID0geworCVJDQVJfR1BfUElOKDQsIDE2KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjBfZmllbGRfbXV4W10gPSB7CisJVkkwX0ZJRUxEX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW4wX2Nsa2VuYl9waW5zW10gPSB7CisJUkNBUl9HUF9QSU4oNCwgMSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW4wX2Nsa2VuYl9tdXhbXSA9IHsKKwlWSTBfQ0xLRU5CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW4wX2Nsa19waW5zW10gPSB7CisJUkNBUl9HUF9QSU4oNCwgMCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW4wX2Nsa19tdXhbXSA9IHsKKwlWSTBfQ0xLX01BUkssCit9OworLyogLSBWSU4xIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjb25zdCB1bmlvbiB2aW5fZGF0YSB2aW4xX2RhdGFfcGlucyA9IHsKKwkuZGF0YTI0ID0geworCQkvKiBCICovCisJCVJDQVJfR1BfUElOKDUsIDQpLCBSQ0FSX0dQX1BJTig1LCA1KSwKKwkJUkNBUl9HUF9QSU4oNSwgNiksIFJDQVJfR1BfUElOKDUsIDcpLAorCQlSQ0FSX0dQX1BJTig1LCA4KSwgUkNBUl9HUF9QSU4oNSwgOSksCisJCVJDQVJfR1BfUElOKDUsIDEwKSwgUkNBUl9HUF9QSU4oNSwgMTEpLAorCQkvKiBHICovCisJCVJDQVJfR1BfUElOKDUsIDEyKSwgUkNBUl9HUF9QSU4oNSwgMTMpLAorCQlSQ0FSX0dQX1BJTig1LCAxNCksIFJDQVJfR1BfUElOKDUsIDE1KSwKKwkJUkNBUl9HUF9QSU4oOCwgNSksIFJDQVJfR1BfUElOKDgsIDYpLAorCQlSQ0FSX0dQX1BJTig4LCA3KSwgUkNBUl9HUF9QSU4oOCwgOCksCisJCS8qIFIgKi8KKwkJUkNBUl9HUF9QSU4oOSwgNSksIFJDQVJfR1BfUElOKDksIDYpLAorCQlSQ0FSX0dQX1BJTig5LCA3KSwgUkNBUl9HUF9QSU4oOSwgOCksCisJCVJDQVJfR1BfUElOKDksIDkpLCBSQ0FSX0dQX1BJTig5LCAxMCksCisJCVJDQVJfR1BfUElOKDksIDExKSwgUkNBUl9HUF9QSU4oOSwgMTIpLAorCX0sCit9Oworc3RhdGljIGNvbnN0IHVuaW9uIHZpbl9kYXRhIHZpbjFfZGF0YV9tdXggPSB7CisJLmRhdGEyNCA9IHsKKwkJLyogQiAqLworCQlWSTFfRDBfQjBfQzBfTUFSSywgVkkxX0QxX0IxX0MxX01BUkssCisJCVZJMV9EMl9CMl9DMl9NQVJLLCBWSTFfRDNfQjNfQzNfTUFSSywKKwkJVkkxX0Q0X0I0X0M0X01BUkssIFZJMV9ENV9CNV9DNV9NQVJLLAorCQlWSTFfRDZfQjZfQzZfTUFSSywgVkkxX0Q3X0I3X0M3X01BUkssCisJCS8qIEcgKi8KKwkJVkkxX0Q4X0cwX1kwX01BUkssIFZJMV9EOV9HMV9ZMV9NQVJLLAorCQlWSTFfRDEwX0cyX1kyX01BUkssIFZJMV9EMTFfRzNfWTNfTUFSSywKKwkJVkkxX0QxMl9HNF9ZNF9NQVJLLCBWSTFfRDEzX0c1X1k1X01BUkssCisJCVZJMV9EMTRfRzZfWTZfTUFSSywgVkkxX0QxNV9HN19ZN19NQVJLLAorCQkvKiBSICovCisJCVZJMV9EMTZfUjBfTUFSSywgVkkxX0QxN19SMV9NQVJLLAorCQlWSTFfRDE4X1IyX01BUkssIFZJMV9EMTlfUjNfTUFSSywKKwkJVkkxX0QyMF9SNF9NQVJLLCBWSTFfRDIxX1I1X01BUkssCisJCVZJMV9EMjJfUjZfTUFSSywgVkkxX0QyM19SN19NQVJLLAorCX0sCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW4xX2RhdGExOF9waW5zW10gPSB7CisJLyogQiAqLworCVJDQVJfR1BfUElOKDUsIDYpLCBSQ0FSX0dQX1BJTig1LCA3KSwKKwlSQ0FSX0dQX1BJTig1LCA4KSwgUkNBUl9HUF9QSU4oNSwgOSksCisJUkNBUl9HUF9QSU4oNSwgMTApLCBSQ0FSX0dQX1BJTig1LCAxMSksCisJLyogRyAqLworCVJDQVJfR1BfUElOKDUsIDE0KSwgUkNBUl9HUF9QSU4oNSwgMTUpLAorCVJDQVJfR1BfUElOKDgsIDUpLCBSQ0FSX0dQX1BJTig4LCA2KSwKKwlSQ0FSX0dQX1BJTig4LCA3KSwgUkNBUl9HUF9QSU4oOCwgOCksCisJLyogUiAqLworCVJDQVJfR1BfUElOKDksIDcpLCBSQ0FSX0dQX1BJTig5LCA4KSwKKwlSQ0FSX0dQX1BJTig5LCA5KSwgUkNBUl9HUF9QSU4oOSwgMTApLAorCVJDQVJfR1BfUElOKDksIDExKSwgUkNBUl9HUF9QSU4oOSwgMTIpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluMV9kYXRhMThfbXV4W10gPSB7CisJLyogQiAqLworCVZJMV9EMl9CMl9DMl9NQVJLLCBWSTFfRDNfQjNfQzNfTUFSSywKKwlWSTFfRDRfQjRfQzRfTUFSSywgVkkxX0Q1X0I1X0M1X01BUkssCisJVkkxX0Q2X0I2X0M2X01BUkssIFZJMV9EN19CN19DN19NQVJLLAorCS8qIEcgKi8KKwlWSTFfRDEwX0cyX1kyX01BUkssIFZJMV9EMTFfRzNfWTNfTUFSSywKKwlWSTFfRDEyX0c0X1k0X01BUkssIFZJMV9EMTNfRzVfWTVfTUFSSywKKwlWSTFfRDE0X0c2X1k2X01BUkssIFZJMV9EMTVfRzdfWTdfTUFSSywKKwkvKiBSICovCisJVkkxX0QxOF9SMl9NQVJLLCBWSTFfRDE5X1IzX01BUkssCisJVkkxX0QyMF9SNF9NQVJLLCBWSTFfRDIxX1I1X01BUkssCisJVkkxX0QyMl9SNl9NQVJLLCBWSTFfRDIzX1I3X01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuaW9uIHZpbl9kYXRhIHZpbjFfZGF0YV9iX3BpbnMgPSB7CisJLmRhdGEyNCA9IHsKKwkJLyogQiAqLworCQlSQ0FSX0dQX1BJTig1LCA0KSwgUkNBUl9HUF9QSU4oNSwgNSksCisJCVJDQVJfR1BfUElOKDUsIDYpLCBSQ0FSX0dQX1BJTig1LCA3KSwKKwkJUkNBUl9HUF9QSU4oNSwgOCksIFJDQVJfR1BfUElOKDUsIDkpLAorCQlSQ0FSX0dQX1BJTig1LCAxMCksIFJDQVJfR1BfUElOKDUsIDExKSwKKwkJLyogRyAqLworCQlSQ0FSX0dQX1BJTig1LCAxMiksIFJDQVJfR1BfUElOKDUsIDEzKSwKKwkJUkNBUl9HUF9QSU4oNSwgMTQpLCBSQ0FSX0dQX1BJTig1LCAxNSksCisJCVJDQVJfR1BfUElOKDksIDEpLCBSQ0FSX0dQX1BJTig5LCAyKSwKKwkJUkNBUl9HUF9QSU4oOSwgMyksIFJDQVJfR1BfUElOKDksIDQpLAorCQkvKiBSICovCisJCVJDQVJfR1BfUElOKDksIDUpLCBSQ0FSX0dQX1BJTig5LCA2KSwKKwkJUkNBUl9HUF9QSU4oOSwgNyksIFJDQVJfR1BfUElOKDksIDgpLAorCQlSQ0FSX0dQX1BJTig5LCA5KSwgUkNBUl9HUF9QSU4oOSwgMTApLAorCQlSQ0FSX0dQX1BJTig5LCAxMSksIFJDQVJfR1BfUElOKDksIDEyKSwKKwl9LAorfTsKK3N0YXRpYyBjb25zdCB1bmlvbiB2aW5fZGF0YSB2aW4xX2RhdGFfYl9tdXggPSB7CisJLmRhdGEyNCA9IHsKKwkJLyogQiAqLworCQlWSTFfRDBfQjBfQzBfTUFSSywgVkkxX0QxX0IxX0MxX01BUkssCisJCVZJMV9EMl9CMl9DMl9NQVJLLCBWSTFfRDNfQjNfQzNfTUFSSywKKwkJVkkxX0Q0X0I0X0M0X01BUkssIFZJMV9ENV9CNV9DNV9NQVJLLAorCQlWSTFfRDZfQjZfQzZfTUFSSywgVkkxX0Q3X0I3X0M3X01BUkssCisJCS8qIEcgKi8KKwkJVkkxX0Q4X0cwX1kwX01BUkssIFZJMV9EOV9HMV9ZMV9NQVJLLAorCQlWSTFfRDEwX0cyX1kyX01BUkssIFZJMV9EMTFfRzNfWTNfTUFSSywKKwkJVkkxX0QxMl9HNF9ZNF9CX01BUkssIFZJMV9EMTNfRzVfWTVfQl9NQVJLLAorCQlWSTFfRDE0X0c2X1k2X0JfTUFSSywgVkkxX0QxNV9HN19ZN19CX01BUkssCisJCS8qIFIgKi8KKwkJVkkxX0QxNl9SMF9NQVJLLCBWSTFfRDE3X1IxX01BUkssCisJCVZJMV9EMThfUjJfTUFSSywgVkkxX0QxOV9SM19NQVJLLAorCQlWSTFfRDIwX1I0X01BUkssIFZJMV9EMjFfUjVfTUFSSywKKwkJVkkxX0QyMl9SNl9NQVJLLCBWSTFfRDIzX1I3X01BUkssCisJfSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjFfZGF0YTE4X2JfcGluc1tdID0geworCS8qIEIgKi8KKwlSQ0FSX0dQX1BJTig1LCA2KSwgUkNBUl9HUF9QSU4oNSwgNyksCisJUkNBUl9HUF9QSU4oNSwgOCksIFJDQVJfR1BfUElOKDUsIDkpLAorCVJDQVJfR1BfUElOKDUsIDEwKSwgUkNBUl9HUF9QSU4oNSwgMTEpLAorCS8qIEcgKi8KKwlSQ0FSX0dQX1BJTig1LCAxNCksIFJDQVJfR1BfUElOKDUsIDE1KSwKKwlSQ0FSX0dQX1BJTig5LCAxKSwgUkNBUl9HUF9QSU4oOSwgMiksCisJUkNBUl9HUF9QSU4oOSwgMyksIFJDQVJfR1BfUElOKDksIDQpLAorCS8qIFIgKi8KKwlSQ0FSX0dQX1BJTig5LCA3KSwgUkNBUl9HUF9QSU4oOSwgOCksCisJUkNBUl9HUF9QSU4oOSwgOSksIFJDQVJfR1BfUElOKDksIDEwKSwKKwlSQ0FSX0dQX1BJTig5LCAxMSksIFJDQVJfR1BfUElOKDksIDEyKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjFfZGF0YTE4X2JfbXV4W10gPSB7CisJLyogQiAqLworCVZJMV9EMl9CMl9DMl9NQVJLLCBWSTFfRDNfQjNfQzNfTUFSSywKKwlWSTFfRDRfQjRfQzRfTUFSSywgVkkxX0Q1X0I1X0M1X01BUkssCisJVkkxX0Q2X0I2X0M2X01BUkssIFZJMV9EN19CN19DN19NQVJLLAorCS8qIEcgKi8KKwlWSTFfRDEwX0cyX1kyX01BUkssIFZJMV9EMTFfRzNfWTNfTUFSSywKKwlWSTFfRDEyX0c0X1k0X0JfTUFSSywgVkkxX0QxM19HNV9ZNV9CX01BUkssCisJVkkxX0QxNF9HNl9ZNl9CX01BUkssIFZJMV9EMTVfRzdfWTdfQl9NQVJLLAorCS8qIFIgKi8KKwlWSTFfRDE4X1IyX01BUkssIFZJMV9EMTlfUjNfTUFSSywKKwlWSTFfRDIwX1I0X01BUkssIFZJMV9EMjFfUjVfTUFSSywKKwlWSTFfRDIyX1I2X01BUkssIFZJMV9EMjNfUjdfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjFfc3luY19waW5zW10gPSB7CisJLyogSFNZTkMjLCBWU1lOQyMgKi8KKwlSQ0FSX0dQX1BJTig1LCAyKSwgUkNBUl9HUF9QSU4oNSwgMyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW4xX3N5bmNfbXV4W10gPSB7CisJVkkxX0hTWU5DX05fTUFSSywgVkkxX1ZTWU5DX05fTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjFfZmllbGRfcGluc1tdID0geworCVJDQVJfR1BfUElOKDUsIDE2KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjFfZmllbGRfbXV4W10gPSB7CisJVkkxX0ZJRUxEX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW4xX2Nsa2VuYl9waW5zW10gPSB7CisJUkNBUl9HUF9QSU4oNSwgMSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW4xX2Nsa2VuYl9tdXhbXSA9IHsKKwlWSTFfQ0xLRU5CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW4xX2Nsa19waW5zW10gPSB7CisJUkNBUl9HUF9QSU4oNSwgMCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW4xX2Nsa19tdXhbXSA9IHsKKwlWSTFfQ0xLX01BUkssCit9OworLyogLSBWSU4yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjb25zdCB1bmlvbiB2aW5fZGF0YSB2aW4yX2RhdGFfcGlucyA9IHsKKwkuZGF0YTE2ID0geworCQlSQ0FSX0dQX1BJTig2LCA0KSwgUkNBUl9HUF9QSU4oNiwgNSksCisJCVJDQVJfR1BfUElOKDYsIDYpLCBSQ0FSX0dQX1BJTig2LCA3KSwKKwkJUkNBUl9HUF9QSU4oNiwgOCksIFJDQVJfR1BfUElOKDYsIDkpLAorCQlSQ0FSX0dQX1BJTig2LCAxMCksIFJDQVJfR1BfUElOKDYsIDExKSwKKwkJUkNBUl9HUF9QSU4oNiwgMTIpLCBSQ0FSX0dQX1BJTig2LCAxMyksCisJCVJDQVJfR1BfUElOKDYsIDE0KSwgUkNBUl9HUF9QSU4oNiwgMTUpLAorCQlSQ0FSX0dQX1BJTig4LCA5KSwgUkNBUl9HUF9QSU4oOCwgMTApLAorCQlSQ0FSX0dQX1BJTig4LCAxMSksIFJDQVJfR1BfUElOKDgsIDEyKSwKKwl9LAorfTsKK3N0YXRpYyBjb25zdCB1bmlvbiB2aW5fZGF0YSB2aW4yX2RhdGFfbXV4ID0geworCS5kYXRhMTYgPSB7CisJCVZJMl9EMF9DMF9NQVJLLCBWSTJfRDFfQzFfTUFSSywKKwkJVkkyX0QyX0MyX01BUkssCVZJMl9EM19DM19NQVJLLAorCQlWSTJfRDRfQzRfTUFSSywgVkkyX0Q1X0M1X01BUkssCisJCVZJMl9ENl9DNl9NQVJLLCBWSTJfRDdfQzdfTUFSSywKKwkJVkkyX0Q4X1kwX01BUkssCVZJMl9EOV9ZMV9NQVJLLAorCQlWSTJfRDEwX1kyX01BUkssIFZJMl9EMTFfWTNfTUFSSywKKwkJVkkyX0QxMl9ZNF9NQVJLLCBWSTJfRDEzX1k1X01BUkssCisJCVZJMl9EMTRfWTZfTUFSSywgVkkyX0QxNV9ZN19NQVJLLAorCX0sCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW4yX3N5bmNfcGluc1tdID0geworCS8qIEhTWU5DIywgVlNZTkMjICovCisJUkNBUl9HUF9QSU4oNiwgMiksIFJDQVJfR1BfUElOKDYsIDMpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluMl9zeW5jX211eFtdID0geworCVZJMl9IU1lOQ19OX01BUkssIFZJMl9WU1lOQ19OX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW4yX2ZpZWxkX3BpbnNbXSA9IHsKKwlSQ0FSX0dQX1BJTig2LCAxNiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW4yX2ZpZWxkX211eFtdID0geworCVZJMl9GSUVMRF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluMl9jbGtlbmJfcGluc1tdID0geworCVJDQVJfR1BfUElOKDYsIDEpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluMl9jbGtlbmJfbXV4W10gPSB7CisJVkkyX0NMS0VOQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluMl9jbGtfcGluc1tdID0geworCVJDQVJfR1BfUElOKDYsIDApLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluMl9jbGtfbXV4W10gPSB7CisJVkkyX0NMS19NQVJLLAorfTsKKy8qIC0gVklOMyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgdW5pb24gdmluX2RhdGEgdmluM19kYXRhX3BpbnMgPSB7CisJLmRhdGExNiA9IHsKKwkJUkNBUl9HUF9QSU4oNywgNCksIFJDQVJfR1BfUElOKDcsIDUpLAorCQlSQ0FSX0dQX1BJTig3LCA2KSwgUkNBUl9HUF9QSU4oNywgNyksCisJCVJDQVJfR1BfUElOKDcsIDgpLCBSQ0FSX0dQX1BJTig3LCA5KSwKKwkJUkNBUl9HUF9QSU4oNywgMTApLCBSQ0FSX0dQX1BJTig3LCAxMSksCisJCVJDQVJfR1BfUElOKDcsIDEyKSwgUkNBUl9HUF9QSU4oNywgMTMpLAorCQlSQ0FSX0dQX1BJTig3LCAxNCksIFJDQVJfR1BfUElOKDcsIDE1KSwKKwkJUkNBUl9HUF9QSU4oOCwgMTMpLCBSQ0FSX0dQX1BJTig4LCAxNCksCisJCVJDQVJfR1BfUElOKDgsIDE1KSwgUkNBUl9HUF9QSU4oOCwgMTYpLAorCX0sCit9Oworc3RhdGljIGNvbnN0IHVuaW9uIHZpbl9kYXRhIHZpbjNfZGF0YV9tdXggPSB7CisJLmRhdGExNiA9IHsKKwkJVkkzX0QwX0MwX01BUkssIFZJM19EMV9DMV9NQVJLLAorCQlWSTNfRDJfQzJfTUFSSywJVkkzX0QzX0MzX01BUkssCisJCVZJM19ENF9DNF9NQVJLLCBWSTNfRDVfQzVfTUFSSywKKwkJVkkzX0Q2X0M2X01BUkssIFZJM19EN19DN19NQVJLLAorCQlWSTNfRDhfWTBfTUFSSywgVkkzX0Q5X1kxX01BUkssCisJCVZJM19EMTBfWTJfTUFSSywgVkkzX0QxMV9ZM19NQVJLLAorCQlWSTNfRDEyX1k0X01BUkssIFZJM19EMTNfWTVfTUFSSywKKwkJVkkzX0QxNF9ZNl9NQVJLLCBWSTNfRDE1X1k3X01BUkssCisJfSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjNfc3luY19waW5zW10gPSB7CisJLyogSFNZTkMjLCBWU1lOQyMgKi8KKwlSQ0FSX0dQX1BJTig3LCAyKSwgUkNBUl9HUF9QSU4oNywgMyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW4zX3N5bmNfbXV4W10gPSB7CisJVkkzX0hTWU5DX05fTUFSSywgVkkzX1ZTWU5DX05fTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjNfZmllbGRfcGluc1tdID0geworCVJDQVJfR1BfUElOKDcsIDE2KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjNfZmllbGRfbXV4W10gPSB7CisJVkkzX0ZJRUxEX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW4zX2Nsa2VuYl9waW5zW10gPSB7CisJUkNBUl9HUF9QSU4oNywgMSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW4zX2Nsa2VuYl9tdXhbXSA9IHsKKwlWSTNfQ0xLRU5CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW4zX2Nsa19waW5zW10gPSB7CisJUkNBUl9HUF9QSU4oNywgMCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW4zX2Nsa19tdXhbXSA9IHsKKwlWSTNfQ0xLX01BUkssCit9OworLyogLSBWSU40IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjb25zdCB1bmlvbiB2aW5fZGF0YSB2aW40X2RhdGFfcGlucyA9IHsKKwkuZGF0YTEyID0geworCQlSQ0FSX0dQX1BJTig4LCA0KSwgUkNBUl9HUF9QSU4oOCwgNSksCisJCVJDQVJfR1BfUElOKDgsIDYpLCBSQ0FSX0dQX1BJTig4LCA3KSwKKwkJUkNBUl9HUF9QSU4oOCwgOCksIFJDQVJfR1BfUElOKDgsIDkpLAorCQlSQ0FSX0dQX1BJTig4LCAxMCksIFJDQVJfR1BfUElOKDgsIDExKSwKKwkJUkNBUl9HUF9QSU4oOCwgMTIpLCBSQ0FSX0dQX1BJTig4LCAxMyksCisJCVJDQVJfR1BfUElOKDgsIDE0KSwgUkNBUl9HUF9QSU4oOCwgMTUpLAorCX0sCit9Oworc3RhdGljIGNvbnN0IHVuaW9uIHZpbl9kYXRhIHZpbjRfZGF0YV9tdXggPSB7CisJLmRhdGExMiA9IHsKKwkJVkk0X0QwX0MwX01BUkssIFZJNF9EMV9DMV9NQVJLLAorCQlWSTRfRDJfQzJfTUFSSywgVkk0X0QzX0MzX01BUkssCisJCVZJNF9ENF9DNF9NQVJLLCBWSTRfRDVfQzVfTUFSSywKKwkJVkk0X0Q2X0M2X01BUkssIFZJNF9EN19DN19NQVJLLAorCQlWSTRfRDhfWTBfTUFSSywJVkk0X0Q5X1kxX01BUkssCisJCVZJNF9EMTBfWTJfTUFSSywgVkk0X0QxMV9ZM19NQVJLLAorCX0sCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW40X3N5bmNfcGluc1tdID0geworCSAvKiBIU1lOQyMsIFZTWU5DIyAqLworCVJDQVJfR1BfUElOKDgsIDIpLCBSQ0FSX0dQX1BJTig4LCAzKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjRfc3luY19tdXhbXSA9IHsKKwlWSTRfSFNZTkNfTl9NQVJLLCBWSTRfVlNZTkNfTl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluNF9maWVsZF9waW5zW10gPSB7CisJUkNBUl9HUF9QSU4oOCwgMTYpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmluNF9maWVsZF9tdXhbXSA9IHsKKwlWSTRfRklFTERfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjRfY2xrZW5iX3BpbnNbXSA9IHsKKwlSQ0FSX0dQX1BJTig4LCAxKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjRfY2xrZW5iX211eFtdID0geworCVZJNF9DTEtFTkJfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjRfY2xrX3BpbnNbXSA9IHsKKwlSQ0FSX0dQX1BJTig4LCAwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjRfY2xrX211eFtdID0geworCVZJNF9DTEtfTUFSSywKK307CisvKiAtIFZJTjUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGNvbnN0IHVuaW9uIHZpbl9kYXRhIHZpbjVfZGF0YV9waW5zID0geworCS5kYXRhMTIgPSB7CisJCVJDQVJfR1BfUElOKDksIDQpLCBSQ0FSX0dQX1BJTig5LCA1KSwKKwkJUkNBUl9HUF9QSU4oOSwgNiksIFJDQVJfR1BfUElOKDksIDcpLAorCQlSQ0FSX0dQX1BJTig5LCA4KSwgUkNBUl9HUF9QSU4oOSwgOSksCisJCVJDQVJfR1BfUElOKDksIDEwKSwgUkNBUl9HUF9QSU4oOSwgMTEpLAorCQlSQ0FSX0dQX1BJTig5LCAxMiksIFJDQVJfR1BfUElOKDksIDEzKSwKKwkJUkNBUl9HUF9QSU4oOSwgMTQpLCBSQ0FSX0dQX1BJTig5LCAxNSksCisJfSwKK307CitzdGF0aWMgY29uc3QgdW5pb24gdmluX2RhdGEgdmluNV9kYXRhX211eCA9IHsKKwkuZGF0YTEyID0geworCQlWSTVfRDBfQzBfTUFSSywgVkk1X0QxX0MxX01BUkssCisJCVZJNV9EMl9DMl9NQVJLLCBWSTVfRDNfQzNfTUFSSywKKwkJVkk1X0Q0X0M0X01BUkssIFZJNV9ENV9DNV9NQVJLLAorCQlWSTVfRDZfQzZfTUFSSywgVkk1X0Q3X0M3X01BUkssCisJCVZJNV9EOF9ZMF9NQVJLLCBWSTVfRDlfWTFfTUFSSywKKwkJVkk1X0QxMF9ZMl9NQVJLLCBWSTVfRDExX1kzX01BUkssCisJfSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjVfc3luY19waW5zW10gPSB7CisJLyogSFNZTkMjLCBWU1lOQyMgKi8KKwlSQ0FSX0dQX1BJTig5LCAyKSwgUkNBUl9HUF9QSU4oOSwgMyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW41X3N5bmNfbXV4W10gPSB7CisJVkk1X0hTWU5DX05fTUFSSywgVkk1X1ZTWU5DX05fTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjVfZmllbGRfcGluc1tdID0geworCVJDQVJfR1BfUElOKDksIDE2KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZpbjVfZmllbGRfbXV4W10gPSB7CisJVkk1X0ZJRUxEX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW41X2Nsa2VuYl9waW5zW10gPSB7CisJUkNBUl9HUF9QSU4oOSwgMSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW41X2Nsa2VuYl9tdXhbXSA9IHsKKwlWSTVfQ0xLRU5CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW41X2Nsa19waW5zW10gPSB7CisJUkNBUl9HUF9QSU4oOSwgMCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2aW41X2Nsa19tdXhbXSA9IHsKKwlWSTVfQ0xLX01BUkssCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNoX3BmY19waW5fZ3JvdXAgcGlubXV4X2dyb3Vwc1tdID0geworCVNIX1BGQ19QSU5fR1JPVVAoYXZiX2xpbmspLAorCVNIX1BGQ19QSU5fR1JPVVAoYXZiX21hZ2ljKSwKKwlTSF9QRkNfUElOX0dST1VQKGF2Yl9waHlfaW50KSwKKwlTSF9QRkNfUElOX0dST1VQKGF2Yl9tZGlvKSwKKwlTSF9QRkNfUElOX0dST1VQKGF2Yl9taWkpLAorCVNIX1BGQ19QSU5fR1JPVVAoYXZiX2dtaWkpLAorCVNIX1BGQ19QSU5fR1JPVVAoYXZiX2F2dHBfbWF0Y2gpLAorCVNIX1BGQ19QSU5fR1JPVVAoY2FuMF9kYXRhKSwKKwlTSF9QRkNfUElOX0dST1VQKGNhbjFfZGF0YSksCisJU0hfUEZDX1BJTl9HUk9VUChjYW5fY2xrKSwKKwlTSF9QRkNfUElOX0dST1VQKGR1MF9yZ2I2NjYpLAorCVNIX1BGQ19QSU5fR1JPVVAoZHUwX3JnYjg4OCksCisJU0hfUEZDX1BJTl9HUk9VUChkdTBfc3luYyksCisJU0hfUEZDX1BJTl9HUk9VUChkdTBfb2RkZiksCisJU0hfUEZDX1BJTl9HUk9VUChkdTBfZGlzcCksCisJU0hfUEZDX1BJTl9HUk9VUChkdTBfY2RlKSwKKwlTSF9QRkNfUElOX0dST1VQKGR1MV9yZ2I2NjYpLAorCVNIX1BGQ19QSU5fR1JPVVAoZHUxX3N5bmMpLAorCVNIX1BGQ19QSU5fR1JPVVAoZHUxX29kZGYpLAorCVNIX1BGQ19QSU5fR1JPVVAoZHUxX2Rpc3ApLAorCVNIX1BGQ19QSU5fR1JPVVAoZHUxX2NkZSksCisJU0hfUEZDX1BJTl9HUk9VUChpbnRjX2lycTApLAorCVNIX1BGQ19QSU5fR1JPVVAoaW50Y19pcnExKSwKKwlTSF9QRkNfUElOX0dST1VQKGludGNfaXJxMiksCisJU0hfUEZDX1BJTl9HUk9VUChpbnRjX2lycTMpLAorCVNIX1BGQ19QSU5fR1JPVVAobGJzY19jczApLAorCVNIX1BGQ19QSU5fR1JPVVAobGJzY19jczEpLAorCVNIX1BGQ19QSU5fR1JPVVAobGJzY19leF9jczApLAorCVNIX1BGQ19QSU5fR1JPVVAobGJzY19leF9jczEpLAorCVNIX1BGQ19QSU5fR1JPVVAobGJzY19leF9jczIpLAorCVNIX1BGQ19QSU5fR1JPVVAobGJzY19leF9jczMpLAorCVNIX1BGQ19QSU5fR1JPVVAobGJzY19leF9jczQpLAorCVNIX1BGQ19QSU5fR1JPVVAobGJzY19leF9jczUpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YwX2NsayksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjBfc3luYyksCisJU0hfUEZDX1BJTl9HUk9VUChtc2lvZjBfcngpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YwX3R4KSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV9jbGspLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3N5bmMpLAorCVNIX1BGQ19QSU5fR1JPVVAobXNpb2YxX3J4KSwKKwlTSF9QRkNfUElOX0dST1VQKG1zaW9mMV90eCksCisJU0hfUEZDX1BJTl9HUk9VUChxc3BpX2N0cmwpLAorCVNIX1BGQ19QSU5fR1JPVVAocXNwaV9kYXRhMiksCisJU0hfUEZDX1BJTl9HUk9VUChxc3BpX2RhdGE0KSwKKwlTSF9QRkNfUElOX0dST1VQKHNjaWYwX2RhdGEpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjBfY2xrKSwKKwlTSF9QRkNfUElOX0dST1VQKHNjaWYwX2N0cmwpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjNfZGF0YSksCisJU0hfUEZDX1BJTl9HUk9VUChzY2lmM19jbGspLAorCVNIX1BGQ19QSU5fR1JPVVAoc2RoaTBfZGF0YTEpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2RoaTBfZGF0YTQpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2RoaTBfY3RybCksCisJU0hfUEZDX1BJTl9HUk9VUChzZGhpMF9jZCksCisJU0hfUEZDX1BJTl9HUk9VUChzZGhpMF93cCksCisJVklOX0RBVEFfUElOX0dST1VQKHZpbjBfZGF0YSwgMjQpLAorCVZJTl9EQVRBX1BJTl9HUk9VUCh2aW4wX2RhdGEsIDIwKSwKKwlTSF9QRkNfUElOX0dST1VQKHZpbjBfZGF0YTE4KSwKKwlWSU5fREFUQV9QSU5fR1JPVVAodmluMF9kYXRhLCAxNiksCisJVklOX0RBVEFfUElOX0dST1VQKHZpbjBfZGF0YSwgMTIpLAorCVZJTl9EQVRBX1BJTl9HUk9VUCh2aW4wX2RhdGEsIDEwKSwKKwlWSU5fREFUQV9QSU5fR1JPVVAodmluMF9kYXRhLCA4KSwKKwlTSF9QRkNfUElOX0dST1VQKHZpbjBfc3luYyksCisJU0hfUEZDX1BJTl9HUk9VUCh2aW4wX2ZpZWxkKSwKKwlTSF9QRkNfUElOX0dST1VQKHZpbjBfY2xrZW5iKSwKKwlTSF9QRkNfUElOX0dST1VQKHZpbjBfY2xrKSwKKwlWSU5fREFUQV9QSU5fR1JPVVAodmluMV9kYXRhLCAyNCksCisJVklOX0RBVEFfUElOX0dST1VQKHZpbjFfZGF0YSwgMjApLAorCVNIX1BGQ19QSU5fR1JPVVAodmluMV9kYXRhMTgpLAorCVZJTl9EQVRBX1BJTl9HUk9VUCh2aW4xX2RhdGEsIDE2KSwKKwlWSU5fREFUQV9QSU5fR1JPVVAodmluMV9kYXRhLCAxMiksCisJVklOX0RBVEFfUElOX0dST1VQKHZpbjFfZGF0YSwgMTApLAorCVZJTl9EQVRBX1BJTl9HUk9VUCh2aW4xX2RhdGEsIDgpLAorCVZJTl9EQVRBX1BJTl9HUk9VUCh2aW4xX2RhdGFfYiwgMjQpLAorCVZJTl9EQVRBX1BJTl9HUk9VUCh2aW4xX2RhdGFfYiwgMjApLAorCVNIX1BGQ19QSU5fR1JPVVAodmluMV9kYXRhMThfYiksCisJVklOX0RBVEFfUElOX0dST1VQKHZpbjFfZGF0YV9iLCAxNiksCisJU0hfUEZDX1BJTl9HUk9VUCh2aW4xX3N5bmMpLAorCVNIX1BGQ19QSU5fR1JPVVAodmluMV9maWVsZCksCisJU0hfUEZDX1BJTl9HUk9VUCh2aW4xX2Nsa2VuYiksCisJU0hfUEZDX1BJTl9HUk9VUCh2aW4xX2NsayksCisJVklOX0RBVEFfUElOX0dST1VQKHZpbjJfZGF0YSwgMTYpLAorCVZJTl9EQVRBX1BJTl9HUk9VUCh2aW4yX2RhdGEsIDEyKSwKKwlWSU5fREFUQV9QSU5fR1JPVVAodmluMl9kYXRhLCAxMCksCisJVklOX0RBVEFfUElOX0dST1VQKHZpbjJfZGF0YSwgOCksCisJU0hfUEZDX1BJTl9HUk9VUCh2aW4yX3N5bmMpLAorCVNIX1BGQ19QSU5fR1JPVVAodmluMl9maWVsZCksCisJU0hfUEZDX1BJTl9HUk9VUCh2aW4yX2Nsa2VuYiksCisJU0hfUEZDX1BJTl9HUk9VUCh2aW4yX2NsayksCisJVklOX0RBVEFfUElOX0dST1VQKHZpbjNfZGF0YSwgMTYpLAorCVZJTl9EQVRBX1BJTl9HUk9VUCh2aW4zX2RhdGEsIDEyKSwKKwlWSU5fREFUQV9QSU5fR1JPVVAodmluM19kYXRhLCAxMCksCisJVklOX0RBVEFfUElOX0dST1VQKHZpbjNfZGF0YSwgOCksCisJU0hfUEZDX1BJTl9HUk9VUCh2aW4zX3N5bmMpLAorCVNIX1BGQ19QSU5fR1JPVVAodmluM19maWVsZCksCisJU0hfUEZDX1BJTl9HUk9VUCh2aW4zX2Nsa2VuYiksCisJU0hfUEZDX1BJTl9HUk9VUCh2aW4zX2NsayksCisJVklOX0RBVEFfUElOX0dST1VQKHZpbjRfZGF0YSwgMTIpLAorCVZJTl9EQVRBX1BJTl9HUk9VUCh2aW40X2RhdGEsIDEwKSwKKwlWSU5fREFUQV9QSU5fR1JPVVAodmluNF9kYXRhLCA4KSwKKwlTSF9QRkNfUElOX0dST1VQKHZpbjRfc3luYyksCisJU0hfUEZDX1BJTl9HUk9VUCh2aW40X2ZpZWxkKSwKKwlTSF9QRkNfUElOX0dST1VQKHZpbjRfY2xrZW5iKSwKKwlTSF9QRkNfUElOX0dST1VQKHZpbjRfY2xrKSwKKwlWSU5fREFUQV9QSU5fR1JPVVAodmluNV9kYXRhLCAxMiksCisJVklOX0RBVEFfUElOX0dST1VQKHZpbjVfZGF0YSwgMTApLAorCVZJTl9EQVRBX1BJTl9HUk9VUCh2aW41X2RhdGEsIDgpLAorCVNIX1BGQ19QSU5fR1JPVVAodmluNV9zeW5jKSwKKwlTSF9QRkNfUElOX0dST1VQKHZpbjVfZmllbGQpLAorCVNIX1BGQ19QSU5fR1JPVVAodmluNV9jbGtlbmIpLAorCVNIX1BGQ19QSU5fR1JPVVAodmluNV9jbGspLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdmJfZ3JvdXBzW10gPSB7CisJImF2Yl9saW5rIiwKKwkiYXZiX21hZ2ljIiwKKwkiYXZiX3BoeV9pbnQiLAorCSJhdmJfbWRpbyIsCisJImF2Yl9taWkiLAorCSJhdmJfZ21paSIsCisJImF2Yl9hdnRwX21hdGNoIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2FuMF9ncm91cHNbXSA9IHsKKwkiY2FuMF9kYXRhIiwKKwkiY2FuX2NsayIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNhbjFfZ3JvdXBzW10gPSB7CisJImNhbjFfZGF0YSIsCisJImNhbl9jbGsiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkdTBfZ3JvdXBzW10gPSB7CisJImR1MF9yZ2I2NjYiLAorCSJkdTBfcmdiODg4IiwKKwkiZHUwX3N5bmMiLAorCSJkdTBfb2RkZiIsCisJImR1MF9kaXNwIiwKKwkiZHUwX2NkZSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGR1MV9ncm91cHNbXSA9IHsKKwkiZHUxX3JnYjY2NiIsCisJImR1MV9zeW5jIiwKKwkiZHUxX29kZGYiLAorCSJkdTFfZGlzcCIsCisJImR1MV9jZGUiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpbnRjX2dyb3Vwc1tdID0geworCSJpbnRjX2lycTAiLAorCSJpbnRjX2lycTEiLAorCSJpbnRjX2lycTIiLAorCSJpbnRjX2lycTMiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsYnNjX2dyb3Vwc1tdID0geworCSJsYnNjX2NzMCIsCisJImxic2NfY3MxIiwKKwkibGJzY19leF9jczAiLAorCSJsYnNjX2V4X2NzMSIsCisJImxic2NfZXhfY3MyIiwKKwkibGJzY19leF9jczMiLAorCSJsYnNjX2V4X2NzNCIsCisJImxic2NfZXhfY3M1IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbXNpb2YwX2dyb3Vwc1tdID0geworCSJtc2lvZjBfY2xrIiwKKwkibXNpb2YwX3N5bmMiLAorCSJtc2lvZjBfcngiLAorCSJtc2lvZjBfdHgiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtc2lvZjFfZ3JvdXBzW10gPSB7CisJIm1zaW9mMV9jbGsiLAorCSJtc2lvZjFfc3luYyIsCisJIm1zaW9mMV9yeCIsCisJIm1zaW9mMV90eCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFzcGlfZ3JvdXBzW10gPSB7CisJInFzcGlfY3RybCIsCisJInFzcGlfZGF0YTIiLAorCSJxc3BpX2RhdGE0IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2NpZjBfZ3JvdXBzW10gPSB7CisJInNjaWYwX2RhdGEiLAorCSJzY2lmMF9jbGsiLAorCSJzY2lmMF9jdHJsIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2NpZjNfZ3JvdXBzW10gPSB7CisJInNjaWYzX2RhdGEiLAorCSJzY2lmM19jbGsiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZGhpMF9ncm91cHNbXSA9IHsKKwkic2RoaTBfZGF0YTEiLAorCSJzZGhpMF9kYXRhNCIsCisJInNkaGkwX2N0cmwiLAorCSJzZGhpMF9jZCIsCisJInNkaGkwX3dwIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmluMF9ncm91cHNbXSA9IHsKKwkidmluMF9kYXRhMjQiLAorCSJ2aW4wX2RhdGEyMCIsCisJInZpbjBfZGF0YTE4IiwKKwkidmluMF9kYXRhMTYiLAorCSJ2aW4wX2RhdGExMiIsCisJInZpbjBfZGF0YTEwIiwKKwkidmluMF9kYXRhOCIsCisJInZpbjBfc3luYyIsCisJInZpbjBfZmllbGQiLAorCSJ2aW4wX2Nsa2VuYiIsCisJInZpbjBfY2xrIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmluMV9ncm91cHNbXSA9IHsKKwkidmluMV9kYXRhMjQiLAorCSJ2aW4xX2RhdGEyMCIsCisJInZpbjFfZGF0YTE4IiwKKwkidmluMV9kYXRhMTYiLAorCSJ2aW4xX2RhdGExMiIsCisJInZpbjFfZGF0YTEwIiwKKwkidmluMV9kYXRhOCIsCisJInZpbjFfZGF0YTI0X2IiLAorCSJ2aW4xX2RhdGEyMF9iIiwKKwkidmluMV9kYXRhMTZfYiIsCisJInZpbjFfc3luYyIsCisJInZpbjFfZmllbGQiLAorCSJ2aW4xX2Nsa2VuYiIsCisJInZpbjFfY2xrIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmluMl9ncm91cHNbXSA9IHsKKwkidmluMl9kYXRhMTYiLAorCSJ2aW4yX2RhdGExMiIsCisJInZpbjJfZGF0YTEwIiwKKwkidmluMl9kYXRhOCIsCisJInZpbjJfc3luYyIsCisJInZpbjJfZmllbGQiLAorCSJ2aW4yX2Nsa2VuYiIsCisJInZpbjJfY2xrIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmluM19ncm91cHNbXSA9IHsKKwkidmluM19kYXRhMTYiLAorCSJ2aW4zX2RhdGExMiIsCisJInZpbjNfZGF0YTEwIiwKKwkidmluM19kYXRhOCIsCisJInZpbjNfc3luYyIsCisJInZpbjNfZmllbGQiLAorCSJ2aW4zX2Nsa2VuYiIsCisJInZpbjNfY2xrIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmluNF9ncm91cHNbXSA9IHsKKwkidmluNF9kYXRhMTIiLAorCSJ2aW40X2RhdGExMCIsCisJInZpbjRfZGF0YTgiLAorCSJ2aW40X3N5bmMiLAorCSJ2aW40X2ZpZWxkIiwKKwkidmluNF9jbGtlbmIiLAorCSJ2aW40X2NsayIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZpbjVfZ3JvdXBzW10gPSB7CisJInZpbjVfZGF0YTEyIiwKKwkidmluNV9kYXRhMTAiLAorCSJ2aW41X2RhdGE4IiwKKwkidmluNV9zeW5jIiwKKwkidmluNV9maWVsZCIsCisJInZpbjVfY2xrZW5iIiwKKwkidmluNV9jbGsiLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9wZmNfZnVuY3Rpb24gcGlubXV4X2Z1bmN0aW9uc1tdID0geworCVNIX1BGQ19GVU5DVElPTihhdmIpLAorCVNIX1BGQ19GVU5DVElPTihjYW4wKSwKKwlTSF9QRkNfRlVOQ1RJT04oY2FuMSksCisJU0hfUEZDX0ZVTkNUSU9OKGR1MCksCisJU0hfUEZDX0ZVTkNUSU9OKGR1MSksCisJU0hfUEZDX0ZVTkNUSU9OKGludGMpLAorCVNIX1BGQ19GVU5DVElPTihsYnNjKSwKKwlTSF9QRkNfRlVOQ1RJT04obXNpb2YwKSwKKwlTSF9QRkNfRlVOQ1RJT04obXNpb2YxKSwKKwlTSF9QRkNfRlVOQ1RJT04ocXNwaSksCisJU0hfUEZDX0ZVTkNUSU9OKHNjaWYwKSwKKwlTSF9QRkNfRlVOQ1RJT04oc2NpZjMpLAorCVNIX1BGQ19GVU5DVElPTihzZGhpMCksCisJU0hfUEZDX0ZVTkNUSU9OKHZpbjApLAorCVNIX1BGQ19GVU5DVElPTih2aW4xKSwKKwlTSF9QRkNfRlVOQ1RJT04odmluMiksCisJU0hfUEZDX0ZVTkNUSU9OKHZpbjMpLAorCVNIX1BGQ19GVU5DVElPTih2aW40KSwKKwlTSF9QRkNfRlVOQ1RJT04odmluNSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBpbm11eF9jZmdfcmVnIHBpbm11eF9jb25maWdfcmVnc1tdID0geworCXsgUElOTVVYX0NGR19SRUcoIkdQU1IwIiwgMHhFNjA2MDAwNCwgMzIsIDEpIHsKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJR1BfMF8yOF9GTiwgRk5fSVAxXzQsCisJCUdQXzBfMjdfRk4sIEZOX0lQMV8zLAorCQlHUF8wXzI2X0ZOLCBGTl9JUDFfMiwKKwkJR1BfMF8yNV9GTiwgRk5fSVAxXzEsCisJCUdQXzBfMjRfRk4sIEZOX0lQMV8wLAorCQlHUF8wXzIzX0ZOLCBGTl9JUDBfMjMsCisJCUdQXzBfMjJfRk4sIEZOX0lQMF8yMiwKKwkJR1BfMF8yMV9GTiwgRk5fSVAwXzIxLAorCQlHUF8wXzIwX0ZOLCBGTl9JUDBfMjAsCisJCUdQXzBfMTlfRk4sIEZOX0lQMF8xOSwKKwkJR1BfMF8xOF9GTiwgRk5fSVAwXzE4LAorCQlHUF8wXzE3X0ZOLCBGTl9JUDBfMTcsCisJCUdQXzBfMTZfRk4sIEZOX0lQMF8xNiwKKwkJR1BfMF8xNV9GTiwgRk5fSVAwXzE1LAorCQlHUF8wXzE0X0ZOLCBGTl9JUDBfMTQsCisJCUdQXzBfMTNfRk4sIEZOX0lQMF8xMywKKwkJR1BfMF8xMl9GTiwgRk5fSVAwXzEyLAorCQlHUF8wXzExX0ZOLCBGTl9JUDBfMTEsCisJCUdQXzBfMTBfRk4sIEZOX0lQMF8xMCwKKwkJR1BfMF85X0ZOLCBGTl9JUDBfOSwKKwkJR1BfMF84X0ZOLCBGTl9JUDBfOCwKKwkJR1BfMF83X0ZOLCBGTl9JUDBfNywKKwkJR1BfMF82X0ZOLCBGTl9JUDBfNiwKKwkJR1BfMF81X0ZOLCBGTl9JUDBfNSwKKwkJR1BfMF80X0ZOLCBGTl9JUDBfNCwKKwkJR1BfMF8zX0ZOLCBGTl9JUDBfMywKKwkJR1BfMF8yX0ZOLCBGTl9JUDBfMiwKKwkJR1BfMF8xX0ZOLCBGTl9JUDBfMSwKKwkJR1BfMF8wX0ZOLCBGTl9JUDBfMCB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJHUFNSMSIsIDB4RTYwNjAwMDgsIDMyLCAxKSB7CisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCUdQXzFfMjJfRk4sIEZOX0RVMV9DREUsCisJCUdQXzFfMjFfRk4sIEZOX0RVMV9ESVNQLAorCQlHUF8xXzIwX0ZOLCBGTl9EVTFfRVhPRERGX0RVMV9PRERGX0RJU1BfQ0RFLAorCQlHUF8xXzE5X0ZOLCBGTl9EVTFfRVhWU1lOQ19EVTFfVlNZTkMsCisJCUdQXzFfMThfRk4sIEZOX0RVMV9FWEhTWU5DX0RVMV9IU1lOQywKKwkJR1BfMV8xN19GTiwgRk5fRFUxX0RCN19DNSwKKwkJR1BfMV8xNl9GTiwgRk5fRFUxX0RCNl9DNCwKKwkJR1BfMV8xNV9GTiwgRk5fRFUxX0RCNV9DM19EQVRBMTUsCisJCUdQXzFfMTRfRk4sIEZOX0RVMV9EQjRfQzJfREFUQTE0LAorCQlHUF8xXzEzX0ZOLCBGTl9EVTFfREIzX0MxX0RBVEExMywKKwkJR1BfMV8xMl9GTiwgRk5fRFUxX0RCMl9DMF9EQVRBMTIsCisJCUdQXzFfMTFfRk4sIEZOX0lQMV8xNiwKKwkJR1BfMV8xMF9GTiwgRk5fSVAxXzE1LAorCQlHUF8xXzlfRk4sIEZOX0lQMV8xNCwKKwkJR1BfMV84X0ZOLCBGTl9JUDFfMTMsCisJCUdQXzFfN19GTiwgRk5fSVAxXzEyLAorCQlHUF8xXzZfRk4sIEZOX0lQMV8xMSwKKwkJR1BfMV81X0ZOLCBGTl9JUDFfMTAsCisJCUdQXzFfNF9GTiwgRk5fSVAxXzksCisJCUdQXzFfM19GTiwgRk5fSVAxXzgsCisJCUdQXzFfMl9GTiwgRk5fSVAxXzcsCisJCUdQXzFfMV9GTiwgRk5fSVAxXzYsCisJCUdQXzFfMF9GTiwgRk5fSVAxXzUsIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIkdQU1IyIiwgMHhFNjA2MDAwQywgMzIsIDEpIHsKKwkJR1BfMl8zMV9GTiwgRk5fQTE1LAorCQlHUF8yXzMwX0ZOLCBGTl9BMTQsCisJCUdQXzJfMjlfRk4sIEZOX0ExMywKKwkJR1BfMl8yOF9GTiwgRk5fQTEyLAorCQlHUF8yXzI3X0ZOLCBGTl9BMTEsCisJCUdQXzJfMjZfRk4sIEZOX0ExMCwKKwkJR1BfMl8yNV9GTiwgRk5fQTksCisJCUdQXzJfMjRfRk4sIEZOX0E4LAorCQlHUF8yXzIzX0ZOLCBGTl9BNywKKwkJR1BfMl8yMl9GTiwgRk5fQTYsCisJCUdQXzJfMjFfRk4sIEZOX0E1LAorCQlHUF8yXzIwX0ZOLCBGTl9BNCwKKwkJR1BfMl8xOV9GTiwgRk5fQTMsCisJCUdQXzJfMThfRk4sIEZOX0EyLAorCQlHUF8yXzE3X0ZOLCBGTl9BMSwKKwkJR1BfMl8xNl9GTiwgRk5fQTAsCisJCUdQXzJfMTVfRk4sIEZOX0QxNSwKKwkJR1BfMl8xNF9GTiwgRk5fRDE0LAorCQlHUF8yXzEzX0ZOLCBGTl9EMTMsCisJCUdQXzJfMTJfRk4sIEZOX0QxMiwKKwkJR1BfMl8xMV9GTiwgRk5fRDExLAorCQlHUF8yXzEwX0ZOLCBGTl9EMTAsCisJCUdQXzJfOV9GTiwgRk5fRDksCisJCUdQXzJfOF9GTiwgRk5fRDgsCisJCUdQXzJfN19GTiwgRk5fRDcsCisJCUdQXzJfNl9GTiwgRk5fRDYsCisJCUdQXzJfNV9GTiwgRk5fRDUsCisJCUdQXzJfNF9GTiwgRk5fRDQsCisJCUdQXzJfM19GTiwgRk5fRDMsCisJCUdQXzJfMl9GTiwgRk5fRDIsCisJCUdQXzJfMV9GTiwgRk5fRDEsCisJCUdQXzJfMF9GTiwgRk5fRDAgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiR1BTUjMiLCAweEU2MDYwMDEwLCAzMiwgMSkgeworCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQlHUF8zXzI3X0ZOLCBGTl9DUzBfTiwKKwkJR1BfM18yNl9GTiwgRk5fSVAxXzIyLAorCQlHUF8zXzI1X0ZOLCBGTl9JUDFfMjEsCisJCUdQXzNfMjRfRk4sIEZOX0lQMV8yMCwKKwkJR1BfM18yM19GTiwgRk5fSVAxXzE5LAorCQlHUF8zXzIyX0ZOLCBGTl9JUlEzLAorCQlHUF8zXzIxX0ZOLCBGTl9JUlEyLAorCQlHUF8zXzIwX0ZOLCBGTl9JUlExLAorCQlHUF8zXzE5X0ZOLCBGTl9JUlEwLAorCQlHUF8zXzE4X0ZOLCBGTl9FWF9XQUlUMCwKKwkJR1BfM18xN19GTiwgRk5fV0UxX04sCisJCUdQXzNfMTZfRk4sIEZOX1dFMF9OLAorCQlHUF8zXzE1X0ZOLCBGTl9SRF9XUl9OLAorCQlHUF8zXzE0X0ZOLCBGTl9SRF9OLAorCQlHUF8zXzEzX0ZOLCBGTl9CU19OLAorCQlHUF8zXzEyX0ZOLCBGTl9FWF9DUzVfTiwKKwkJR1BfM18xMV9GTiwgRk5fRVhfQ1M0X04sCisJCUdQXzNfMTBfRk4sIEZOX0VYX0NTM19OLAorCQlHUF8zXzlfRk4sIEZOX0VYX0NTMl9OLAorCQlHUF8zXzhfRk4sIEZOX0VYX0NTMV9OLAorCQlHUF8zXzdfRk4sIEZOX0VYX0NTMF9OLAorCQlHUF8zXzZfRk4sIEZOX0NTMV9OX0EyNiwKKwkJR1BfM181X0ZOLCBGTl9JUDFfMTgsCisJCUdQXzNfNF9GTiwgRk5fSVAxXzE3LAorCQlHUF8zXzNfRk4sIEZOX0ExOSwKKwkJR1BfM18yX0ZOLCBGTl9BMTgsCisJCUdQXzNfMV9GTiwgRk5fQTE3LAorCQlHUF8zXzBfRk4sIEZOX0ExNiB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJHUFNSNCIsIDB4RTYwNjAwMTQsIDMyLCAxKSB7CisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCUdQXzRfMTZfRk4sIEZOX1ZJMF9GSUVMRCwKKwkJR1BfNF8xNV9GTiwgRk5fVkkwX0QxMV9HM19ZMywKKwkJR1BfNF8xNF9GTiwgRk5fVkkwX0QxMF9HMl9ZMiwKKwkJR1BfNF8xM19GTiwgRk5fVkkwX0Q5X0cxX1kxLAorCQlHUF80XzEyX0ZOLCBGTl9WSTBfRDhfRzBfWTAsCisJCUdQXzRfMTFfRk4sIEZOX1ZJMF9EN19CN19DNywKKwkJR1BfNF8xMF9GTiwgRk5fVkkwX0Q2X0I2X0M2LAorCQlHUF80XzlfRk4sIEZOX1ZJMF9ENV9CNV9DNSwKKwkJR1BfNF84X0ZOLCBGTl9WSTBfRDRfQjRfQzQsCisJCUdQXzRfN19GTiwgRk5fVkkwX0QzX0IzX0MzLAorCQlHUF80XzZfRk4sIEZOX1ZJMF9EMl9CMl9DMiwKKwkJR1BfNF81X0ZOLCBGTl9WSTBfRDFfQjFfQzEsCisJCUdQXzRfNF9GTiwgRk5fVkkwX0QwX0IwX0MwLAorCQlHUF80XzNfRk4sIEZOX1ZJMF9WU1lOQ19OLAorCQlHUF80XzJfRk4sIEZOX1ZJMF9IU1lOQ19OLAorCQlHUF80XzFfRk4sIEZOX1ZJMF9DTEtFTkIsCisJCUdQXzRfMF9GTiwgRk5fVkkwX0NMSyB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJHUFNSNSIsIDB4RTYwNjAwMTgsIDMyLCAxKSB7CisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCUdQXzVfMTZfRk4sIEZOX1ZJMV9GSUVMRCwKKwkJR1BfNV8xNV9GTiwgRk5fVkkxX0QxMV9HM19ZMywKKwkJR1BfNV8xNF9GTiwgRk5fVkkxX0QxMF9HMl9ZMiwKKwkJR1BfNV8xM19GTiwgRk5fVkkxX0Q5X0cxX1kxLAorCQlHUF81XzEyX0ZOLCBGTl9WSTFfRDhfRzBfWTAsCisJCUdQXzVfMTFfRk4sIEZOX1ZJMV9EN19CN19DNywKKwkJR1BfNV8xMF9GTiwgRk5fVkkxX0Q2X0I2X0M2LAorCQlHUF81XzlfRk4sIEZOX1ZJMV9ENV9CNV9DNSwKKwkJR1BfNV84X0ZOLCBGTl9WSTFfRDRfQjRfQzQsCisJCUdQXzVfN19GTiwgRk5fVkkxX0QzX0IzX0MzLAorCQlHUF81XzZfRk4sIEZOX1ZJMV9EMl9CMl9DMiwKKwkJR1BfNV81X0ZOLCBGTl9WSTFfRDFfQjFfQzEsCisJCUdQXzVfNF9GTiwgRk5fVkkxX0QwX0IwX0MwLAorCQlHUF81XzNfRk4sIEZOX1ZJMV9WU1lOQ19OLAorCQlHUF81XzJfRk4sIEZOX1ZJMV9IU1lOQ19OLAorCQlHUF81XzFfRk4sIEZOX1ZJMV9DTEtFTkIsCisJCUdQXzVfMF9GTiwgRk5fVkkxX0NMSyB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJHUFNSNiIsIDB4RTYwNjAwMUMsIDMyLCAxKSB7CisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCUdQXzZfMTZfRk4sIEZOX0lQMl8xNiwKKwkJR1BfNl8xNV9GTiwgRk5fSVAyXzE1LAorCQlHUF82XzE0X0ZOLCBGTl9JUDJfMTQsCisJCUdQXzZfMTNfRk4sIEZOX0lQMl8xMywKKwkJR1BfNl8xMl9GTiwgRk5fSVAyXzEyLAorCQlHUF82XzExX0ZOLCBGTl9JUDJfMTEsCisJCUdQXzZfMTBfRk4sIEZOX0lQMl8xMCwKKwkJR1BfNl85X0ZOLCBGTl9JUDJfOSwKKwkJR1BfNl84X0ZOLCBGTl9JUDJfOCwKKwkJR1BfNl83X0ZOLCBGTl9JUDJfNywKKwkJR1BfNl82X0ZOLCBGTl9JUDJfNiwKKwkJR1BfNl81X0ZOLCBGTl9JUDJfNSwKKwkJR1BfNl80X0ZOLCBGTl9JUDJfNCwKKwkJR1BfNl8zX0ZOLCBGTl9JUDJfMywKKwkJR1BfNl8yX0ZOLCBGTl9JUDJfMiwKKwkJR1BfNl8xX0ZOLCBGTl9JUDJfMSwKKwkJR1BfNl8wX0ZOLCBGTl9JUDJfMCB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJHUFNSNyIsIDB4RTYwNjAwMjAsIDMyLCAxKSB7CisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCUdQXzdfMTZfRk4sIEZOX1ZJM19GSUVMRCwKKwkJR1BfN18xNV9GTiwgRk5fSVAzXzE0LAorCQlHUF83XzE0X0ZOLCBGTl9WSTNfRDEwX1kyLAorCQlHUF83XzEzX0ZOLCBGTl9JUDNfMTMsCisJCUdQXzdfMTJfRk4sIEZOX0lQM18xMiwKKwkJR1BfN18xMV9GTiwgRk5fSVAzXzExLAorCQlHUF83XzEwX0ZOLCBGTl9JUDNfMTAsCisJCUdQXzdfOV9GTiwgRk5fSVAzXzksCisJCUdQXzdfOF9GTiwgRk5fSVAzXzgsCisJCUdQXzdfN19GTiwgRk5fSVAzXzcsCisJCUdQXzdfNl9GTiwgRk5fSVAzXzYsCisJCUdQXzdfNV9GTiwgRk5fSVAzXzUsCisJCUdQXzdfNF9GTiwgRk5fSVAzXzQsCisJCUdQXzdfM19GTiwgRk5fSVAzXzMsCisJCUdQXzdfMl9GTiwgRk5fSVAzXzIsCisJCUdQXzdfMV9GTiwgRk5fSVAzXzEsCisJCUdQXzdfMF9GTiwgRk5fSVAzXzAgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiR1BTUjgiLCAweEU2MDYwMDI0LCAzMiwgMSkgeworCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQlHUF84XzE2X0ZOLCBGTl9JUDRfMjQsCisJCUdQXzhfMTVfRk4sIEZOX0lQNF8yMywKKwkJR1BfOF8xNF9GTiwgRk5fSVA0XzIyLAorCQlHUF84XzEzX0ZOLCBGTl9JUDRfMjEsCisJCUdQXzhfMTJfRk4sIEZOX0lQNF8yMF8xOSwKKwkJR1BfOF8xMV9GTiwgRk5fSVA0XzE4XzE3LAorCQlHUF84XzEwX0ZOLCBGTl9JUDRfMTZfMTUsCisJCUdQXzhfOV9GTiwgRk5fSVA0XzE0XzEzLAorCQlHUF84XzhfRk4sIEZOX0lQNF8xMl8xMSwKKwkJR1BfOF83X0ZOLCBGTl9JUDRfMTBfOSwKKwkJR1BfOF82X0ZOLCBGTl9JUDRfOF83LAorCQlHUF84XzVfRk4sIEZOX0lQNF82XzUsCisJCUdQXzhfNF9GTiwgRk5fSVA0XzQsCisJCUdQXzhfM19GTiwgRk5fSVA0XzNfMiwKKwkJR1BfOF8yX0ZOLCBGTl9JUDRfMSwKKwkJR1BfOF8xX0ZOLCBGTl9JUDRfMCwKKwkJR1BfOF8wX0ZOLCBGTl9WSTRfQ0xLIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIkdQU1I5IiwgMHhFNjA2MDAyOCwgMzIsIDEpIHsKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJR1BfOV8xNl9GTiwgRk5fVkk1X0ZJRUxELAorCQlHUF85XzE1X0ZOLCBGTl9WSTVfRDExX1kzLAorCQlHUF85XzE0X0ZOLCBGTl9WSTVfRDEwX1kyLAorCQlHUF85XzEzX0ZOLCBGTl9WSTVfRDlfWTEsCisJCUdQXzlfMTJfRk4sIEZOX0lQNV8xMSwKKwkJR1BfOV8xMV9GTiwgRk5fSVA1XzEwLAorCQlHUF85XzEwX0ZOLCBGTl9JUDVfOSwKKwkJR1BfOV85X0ZOLCBGTl9JUDVfOCwKKwkJR1BfOV84X0ZOLCBGTl9JUDVfNywKKwkJR1BfOV83X0ZOLCBGTl9JUDVfNiwKKwkJR1BfOV82X0ZOLCBGTl9JUDVfNSwKKwkJR1BfOV81X0ZOLCBGTl9JUDVfNCwKKwkJR1BfOV80X0ZOLCBGTl9JUDVfMywKKwkJR1BfOV8zX0ZOLCBGTl9JUDVfMiwKKwkJR1BfOV8yX0ZOLCBGTl9JUDVfMSwKKwkJR1BfOV8xX0ZOLCBGTl9JUDVfMCwKKwkJR1BfOV8wX0ZOLCBGTl9WSTVfQ0xLIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIkdQU1IxMCIsIDB4RTYwNjAwMkMsIDMyLCAxKSB7CisJCUdQXzEwXzMxX0ZOLCBGTl9DQU4xX1JYLAorCQlHUF8xMF8zMF9GTiwgRk5fQ0FOMV9UWCwKKwkJR1BfMTBfMjlfRk4sIEZOX0NBTl9DTEssCisJCUdQXzEwXzI4X0ZOLCBGTl9DQU4wX1JYLAorCQlHUF8xMF8yN19GTiwgRk5fQ0FOMF9UWCwKKwkJR1BfMTBfMjZfRk4sIEZOX1NDSUZfQ0xLLAorCQlHUF8xMF8yNV9GTiwgRk5fSVA2XzE4XzE3LAorCQlHUF8xMF8yNF9GTiwgRk5fSVA2XzE2LAorCQlHUF8xMF8yM19GTiwgRk5fSVA2XzE1XzE0LAorCQlHUF8xMF8yMl9GTiwgRk5fSVA2XzEzXzEyLAorCQlHUF8xMF8yMV9GTiwgRk5fSVA2XzExXzEwLAorCQlHUF8xMF8yMF9GTiwgRk5fSVA2XzlfOCwKKwkJR1BfMTBfMTlfRk4sIEZOX1JYMSwKKwkJR1BfMTBfMThfRk4sIEZOX1RYMSwKKwkJR1BfMTBfMTdfRk4sIEZOX1JUUzFfTiwKKwkJR1BfMTBfMTZfRk4sIEZOX0NUUzFfTiwKKwkJR1BfMTBfMTVfRk4sIEZOX1NDSzEsCisJCUdQXzEwXzE0X0ZOLCBGTl9SWDAsCisJCUdQXzEwXzEzX0ZOLCBGTl9UWDAsCisJCUdQXzEwXzEyX0ZOLCBGTl9SVFMwX04sCisJCUdQXzEwXzExX0ZOLCBGTl9DVFMwX04sCisJCUdQXzEwXzEwX0ZOLCBGTl9TQ0swLAorCQlHUF8xMF85X0ZOLCBGTl9JUDZfNywKKwkJR1BfMTBfOF9GTiwgRk5fSVA2XzYsCisJCUdQXzEwXzdfRk4sIEZOX0hDVFMxX04sCisJCUdQXzEwXzZfRk4sIEZOX0lQNl81LAorCQlHUF8xMF81X0ZOLCBGTl9JUDZfNCwKKwkJR1BfMTBfNF9GTiwgRk5fSVA2XzMsCisJCUdQXzEwXzNfRk4sIEZOX0lQNl8yLAorCQlHUF8xMF8yX0ZOLCBGTl9IUlRTMF9OLAorCQlHUF8xMF8xX0ZOLCBGTl9JUDZfMSwKKwkJR1BfMTBfMF9GTiwgRk5fSVA2XzAgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiR1BTUjExIiwgMHhFNjA2MDAzMCwgMzIsIDEpIHsKKwkJMCwgMCwKKwkJMCwgMCwKKwkJR1BfMTFfMjlfRk4sIEZOX0FWUzIsCisJCUdQXzExXzI4X0ZOLCBGTl9BVlMxLAorCQlHUF8xMV8yN19GTiwgRk5fQURJQ0hTMiwKKwkJR1BfMTFfMjZfRk4sIEZOX0FESUNIUzEsCisJCUdQXzExXzI1X0ZOLCBGTl9BRElDSFMwLAorCQlHUF8xMV8yNF9GTiwgRk5fQURJREFUQSwKKwkJR1BfMTFfMjNfRk4sIEZOX0FESUNTX1NBTVAsCisJCUdQXzExXzIyX0ZOLCBGTl9BRElDTEssCisJCUdQXzExXzIxX0ZOLCBGTl9JUDdfMjAsCisJCUdQXzExXzIwX0ZOLCBGTl9JUDdfMTksCisJCUdQXzExXzE5X0ZOLCBGTl9JUDdfMTgsCisJCUdQXzExXzE4X0ZOLCBGTl9JUDdfMTcsCisJCUdQXzExXzE3X0ZOLCBGTl9JUDdfMTYsCisJCUdQXzExXzE2X0ZOLCBGTl9JUDdfMTVfMTQsCisJCUdQXzExXzE1X0ZOLCBGTl9JUDdfMTNfMTIsCisJCUdQXzExXzE0X0ZOLCBGTl9JUDdfMTFfMTAsCisJCUdQXzExXzEzX0ZOLCBGTl9JUDdfOV84LAorCQlHUF8xMV8xMl9GTiwgRk5fU0QwX1dQLAorCQlHUF8xMV8xMV9GTiwgRk5fU0QwX0NELAorCQlHUF8xMV8xMF9GTiwgRk5fU0QwX0RBVDMsCisJCUdQXzExXzlfRk4sIEZOX1NEMF9EQVQyLAorCQlHUF8xMV84X0ZOLCBGTl9TRDBfREFUMSwKKwkJR1BfMTFfN19GTiwgRk5fU0QwX0RBVDAsCisJCUdQXzExXzZfRk4sIEZOX1NEMF9DTUQsCisJCUdQXzExXzVfRk4sIEZOX1NEMF9DTEssCisJCUdQXzExXzRfRk4sIEZOX0lQN183LAorCQlHUF8xMV8zX0ZOLCBGTl9JUDdfNiwKKwkJR1BfMTFfMl9GTiwgRk5fSVA3XzVfNCwKKwkJR1BfMTFfMV9GTiwgRk5fSVA3XzNfMiwKKwkJR1BfMTFfMF9GTiwgRk5fSVA3XzFfMCB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHX1ZBUigiSVBTUjAiLCAweEU2MDYwMDQwLCAzMiwKKwkJCSAgICAgNCwgNCwKKwkJCSAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKwkJCSAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKwkJCSAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSkgeworCQkvKiBJUDBfMzFfMjggWzRdICovCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCS8qIElQMF8yN18yNCBbNF0gKi8KKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJLyogSVAwXzIzIFsxXSAqLworCQlGTl9EVTBfREI3X0M1LCAwLAorCQkvKiBJUDBfMjIgWzFdICovCisJCUZOX0RVMF9EQjZfQzQsIDAsCisJCS8qIElQMF8yMSBbMV0gKi8KKwkJRk5fRFUwX0RCNV9DMywgMCwKKwkJLyogSVAwXzIwIFsxXSAqLworCQlGTl9EVTBfREI0X0MyLCAwLAorCQkvKiBJUDBfMTkgWzFdICovCisJCUZOX0RVMF9EQjNfQzEsIDAsCisJCS8qIElQMF8xOCBbMV0gKi8KKwkJRk5fRFUwX0RCMl9DMCwgMCwKKwkJLyogSVAwXzE3IFsxXSAqLworCQlGTl9EVTBfREIxLCAwLAorCQkvKiBJUDBfMTYgWzFdICovCisJCUZOX0RVMF9EQjAsIDAsCisJCS8qIElQMF8xNSBbMV0gKi8KKwkJRk5fRFUwX0RHN19ZM19EQVRBMTUsIDAsCisJCS8qIElQMF8xNCBbMV0gKi8KKwkJRk5fRFUwX0RHNl9ZMl9EQVRBMTQsIDAsCisJCS8qIElQMF8xMyBbMV0gKi8KKwkJRk5fRFUwX0RHNV9ZMV9EQVRBMTMsIDAsCisJCS8qIElQMF8xMiBbMV0gKi8KKwkJRk5fRFUwX0RHNF9ZMF9EQVRBMTIsIDAsCisJCS8qIElQMF8xMSBbMV0gKi8KKwkJRk5fRFUwX0RHM19DN19EQVRBMTEsIDAsCisJCS8qIElQMF8xMCBbMV0gKi8KKwkJRk5fRFUwX0RHMl9DNl9EQVRBMTAsIDAsCisJCS8qIElQMF85IFsxXSAqLworCQlGTl9EVTBfREcxX0RBVEE5LCAwLAorCQkvKiBJUDBfOCBbMV0gKi8KKwkJRk5fRFUwX0RHMF9EQVRBOCwgMCwKKwkJLyogSVAwXzcgWzFdICovCisJCUZOX0RVMF9EUjdfWTlfREFUQTcsIDAsCisJCS8qIElQMF82IFsxXSAqLworCQlGTl9EVTBfRFI2X1k4X0RBVEE2LCAwLAorCQkvKiBJUDBfNSBbMV0gKi8KKwkJRk5fRFUwX0RSNV9ZN19EQVRBNSwgMCwKKwkJLyogSVAwXzQgWzFdICovCisJCUZOX0RVMF9EUjRfWTZfREFUQTQsIDAsCisJCS8qIElQMF8zIFsxXSAqLworCQlGTl9EVTBfRFIzX1k1X0RBVEEzLCAwLAorCQkvKiBJUDBfMiBbMV0gKi8KKwkJRk5fRFUwX0RSMl9ZNF9EQVRBMiwgMCwKKwkJLyogSVAwXzEgWzFdICovCisJCUZOX0RVMF9EUjFfREFUQTEsIDAsCisJCS8qIElQMF8wIFsxXSAqLworCQlGTl9EVTBfRFIwX0RBVEEwLCAwIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUdfVkFSKCJJUFNSMSIsIDB4RTYwNjAwNDQsIDMyLAorCQkJICAgICA0LCA0LAorCQkJICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorCQkJICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorCQkJICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxKSB7CisJCS8qIElQMV8zMV8yOCBbNF0gKi8KKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJLyogSVAxXzI3XzI0IFs0XSAqLworCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkvKiBJUDFfMjMgWzFdICovCisJCTAsIDAsCisJCS8qIElQMV8yMiBbMV0gKi8KKwkJRk5fQTI1LCBGTl9TU0wsCisJCS8qIElQMV8yMSBbMV0gKi8KKwkJRk5fQTI0LCBGTl9TUENMSywKKwkJLyogSVAxXzIwIFsxXSAqLworCQlGTl9BMjMsIEZOX0lPMywKKwkJLyogSVAxXzE5IFsxXSAqLworCQlGTl9BMjIsIEZOX0lPMiwKKwkJLyogSVAxXzE4IFsxXSAqLworCQlGTl9BMjEsIEZOX01JU09fSU8xLAorCQkvKiBJUDFfMTcgWzFdICovCisJCUZOX0EyMCwgRk5fTU9TSV9JTzAsCisJCS8qIElQMV8xNiBbMV0gKi8KKwkJRk5fRFUxX0RHN19ZM19EQVRBMTEsIDAsCisJCS8qIElQMV8xNSBbMV0gKi8KKwkJRk5fRFUxX0RHNl9ZMl9EQVRBMTAsIDAsCisJCS8qIElQMV8xNCBbMV0gKi8KKwkJRk5fRFUxX0RHNV9ZMV9EQVRBOSwgMCwKKwkJLyogSVAxXzEzIFsxXSAqLworCQlGTl9EVTFfREc0X1kwX0RBVEE4LCAwLAorCQkvKiBJUDFfMTIgWzFdICovCisJCUZOX0RVMV9ERzNfQzdfREFUQTcsIDAsCisJCS8qIElQMV8xMSBbMV0gKi8KKwkJRk5fRFUxX0RHMl9DNl9EQVRBNiwgMCwKKwkJLyogSVAxXzEwIFsxXSAqLworCQlGTl9EVTFfRFI3X0RBVEE1LCAwLAorCQkvKiBJUDFfOSBbMV0gKi8KKwkJRk5fRFUxX0RSNl9EQVRBNCwgMCwKKwkJLyogSVAxXzggWzFdICovCisJCUZOX0RVMV9EUjVfWTdfREFUQTMsIDAsCisJCS8qIElQMV83IFsxXSAqLworCQlGTl9EVTFfRFI0X1k2X0RBVEEyLCAwLAorCQkvKiBJUDFfNiBbMV0gKi8KKwkJRk5fRFUxX0RSM19ZNV9EQVRBMSwgMCwKKwkJLyogSVAxXzUgWzFdICovCisJCUZOX0RVMV9EUjJfWTRfREFUQTAsIDAsCisJCS8qIElQMV80IFsxXSAqLworCQlGTl9EVTBfQ0RFLCAwLAorCQkvKiBJUDFfMyBbMV0gKi8KKwkJRk5fRFUwX0RJU1AsIDAsCisJCS8qIElQMV8yIFsxXSAqLworCQlGTl9EVTBfRVhPRERGX0RVMF9PRERGX0RJU1BfQ0RFLCAwLAorCQkvKiBJUDFfMSBbMV0gKi8KKwkJRk5fRFUwX0VYVlNZTkNfRFUwX1ZTWU5DLCAwLAorCQkvKiBJUDFfMCBbMV0gKi8KKwkJRk5fRFUwX0VYSFNZTkNfRFUwX0hTWU5DLCAwIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUdfVkFSKCJJUFNSMiIsIDB4RTYwNjAwNDgsIDMyLAorCQkJICAgICA0LCA0LAorCQkJICAgICA0LCAzLCAxLAorCQkJICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorCQkJICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxKSB7CisJCS8qIElQMl8zMV8yOCBbNF0gKi8KKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJLyogSVAyXzI3XzI0IFs0XSAqLworCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkvKiBJUDJfMjNfMjAgWzRdICovCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCS8qIElQMl8xOV8xNyBbM10gKi8KKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJLyogSVAyXzE2IFsxXSAqLworCQlGTl9WSTJfRklFTEQsIEZOX0FWQl9UWEQyLAorCQkvKiBJUDJfMTUgWzFdICovCisJCUZOX1ZJMl9EMTFfWTMsIEZOX0FWQl9UWEQxLAorCQkvKiBJUDJfMTQgWzFdICovCisJCUZOX1ZJMl9EMTBfWTIsIEZOX0FWQl9UWEQwLAorCQkvKiBJUDJfMTMgWzFdICovCisJCUZOX1ZJMl9EOV9ZMSwgRk5fQVZCX1RYX0VOLAorCQkvKiBJUDJfMTIgWzFdICovCisJCUZOX1ZJMl9EOF9ZMCwgRk5fQVZCX1RYRDMsCisJCS8qIElQMl8xMSBbMV0gKi8KKwkJRk5fVkkyX0Q3X0M3LCBGTl9BVkJfQ09MLAorCQkvKiBJUDJfMTAgWzFdICovCisJCUZOX1ZJMl9ENl9DNiwgRk5fQVZCX1JYX0VSLAorCQkvKiBJUDJfOSBbMV0gKi8KKwkJRk5fVkkyX0Q1X0M1LCBGTl9BVkJfUlhENywKKwkJLyogSVAyXzggWzFdICovCisJCUZOX1ZJMl9ENF9DNCwgRk5fQVZCX1JYRDYsCisJCS8qIElQMl83IFsxXSAqLworCQlGTl9WSTJfRDNfQzMsIEZOX0FWQl9SWEQ1LAorCQkvKiBJUDJfNiBbMV0gKi8KKwkJRk5fVkkyX0QyX0MyLCBGTl9BVkJfUlhENCwKKwkJLyogSVAyXzUgWzFdICovCisJCUZOX1ZJMl9EMV9DMSwgRk5fQVZCX1JYRDMsCisJCS8qIElQMl80IFsxXSAqLworCQlGTl9WSTJfRDBfQzAsIEZOX0FWQl9SWEQyLAorCQkvKiBJUDJfMyBbMV0gKi8KKwkJRk5fVkkyX1ZTWU5DX04sIEZOX0FWQl9SWEQxLAorCQkvKiBJUDJfMiBbMV0gKi8KKwkJRk5fVkkyX0hTWU5DX04sIEZOX0FWQl9SWEQwLAorCQkvKiBJUDJfMSBbMV0gKi8KKwkJRk5fVkkyX0NMS0VOQiwgRk5fQVZCX1JYX0RWLAorCQkvKiBJUDJfMCBbMV0gKi8KKwkJRk5fVkkyX0NMSywgRk5fQVZCX1JYX0NMSyB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHX1ZBUigiSVBTUjMiLCAweEU2MDYwMDRDLCAzMiwKKwkJCSAgICAgNCwgNCwKKwkJCSAgICAgNCwgNCwKKwkJCSAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKwkJCSAgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSkgeworCQkvKiBJUDNfMzFfMjggWzRdICovCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCS8qIElQM18yN18yNCBbNF0gKi8KKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJLyogSVAzXzIzXzIwIFs0XSAqLworCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkvKiBJUDNfMTlfMTYgWzRdICovCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCS8qIElQM18xNSBbMV0gKi8KKwkJMCwgMCwKKwkJLyogSVAzXzE0IFsxXSAqLworCQlGTl9WSTNfRDExX1kzLCBGTl9BVkJfQVZUUF9NQVRDSCwKKwkJLyogSVAzXzEzIFsxXSAqLworCQlGTl9WSTNfRDlfWTEsIEZOX0FWQl9HVFhSRUZDTEssCisJCS8qIElQM18xMiBbMV0gKi8KKwkJRk5fVkkzX0Q4X1kwLCBGTl9BVkJfQ1JTLAorCQkvKiBJUDNfMTEgWzFdICovCisJCUZOX1ZJM19EN19DNywgRk5fQVZCX1BIWV9JTlQsCisJCS8qIElQM18xMCBbMV0gKi8KKwkJRk5fVkkzX0Q2X0M2LCBGTl9BVkJfTUFHSUMsCisJCS8qIElQM185IFsxXSAqLworCQlGTl9WSTNfRDVfQzUsIEZOX0FWQl9MSU5LLAorCQkvKiBJUDNfOCBbMV0gKi8KKwkJRk5fVkkzX0Q0X0M0LCBGTl9BVkJfTURJTywKKwkJLyogSVAzXzcgWzFdICovCisJCUZOX1ZJM19EM19DMywgRk5fQVZCX01EQywKKwkJLyogSVAzXzYgWzFdICovCisJCUZOX1ZJM19EMl9DMiwgRk5fQVZCX0dUWF9DTEssCisJCS8qIElQM181IFsxXSAqLworCQlGTl9WSTNfRDFfQzEsIEZOX0FWQl9UWF9FUiwKKwkJLyogSVAzXzQgWzFdICovCisJCUZOX1ZJM19EMF9DMCwgRk5fQVZCX1RYRDcsCisJCS8qIElQM18zIFsxXSAqLworCQlGTl9WSTNfVlNZTkNfTiwgRk5fQVZCX1RYRDYsCisJCS8qIElQM18yIFsxXSAqLworCQlGTl9WSTNfSFNZTkNfTiwgRk5fQVZCX1RYRDUsCisJCS8qIElQM18xIFsxXSAqLworCQlGTl9WSTNfQ0xLRU5CLCBGTl9BVkJfVFhENCwKKwkJLyogSVAzXzAgWzFdICovCisJCUZOX1ZJM19DTEssIEZOX0FWQl9UWF9DTEsgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFR19WQVIoIklQU1I0IiwgMHhFNjA2MDA1MCwgMzIsCisJCQkgICAgIDQsIDMsIDEsCisJCQkgICAgIDEsIDEsIDEsIDIsIDIsIDIsCisJCQkgICAgIDIsIDIsIDIsIDIsIDIsIDEsIDIsIDEsIDEpIHsKKwkJLyogSVA0XzMxXzI4IFs0XSAqLworCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkvKiBJUDRfMjdfMjUgWzNdICovCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCS8qIElQNF8yNCBbMV0gKi8KKwkJRk5fVkk0X0ZJRUxELCBGTl9WSTNfRDE1X1k3LAorCQkvKiBJUDRfMjMgWzFdICovCisJCUZOX1ZJNF9EMTFfWTMsIEZOX1ZJM19EMTRfWTYsCisJCS8qIElQNF8yMiBbMV0gKi8KKwkJRk5fVkk0X0QxMF9ZMiwgRk5fVkkzX0QxM19ZNSwKKwkJLyogSVA0XzIxIFsxXSAqLworCQlGTl9WSTRfRDlfWTEsIEZOX1ZJM19EMTJfWTQsCisJCS8qIElQNF8yMF8xOSBbMl0gKi8KKwkJRk5fVkk0X0Q4X1kwLCBGTl9WSTBfRDIzX1I3LCBGTl9WSTJfRDE1X1k3LCAwLAorCQkvKiBJUDRfMThfMTcgWzJdICovCisJCUZOX1ZJNF9EN19DNywgRk5fVkkwX0QyMl9SNiwgRk5fVkkyX0QxNF9ZNiwgMCwKKwkJLyogSVA0XzE2XzE1IFsyXSAqLworCQlGTl9WSTRfRDZfQzYsIEZOX1ZJMF9EMjFfUjUsIEZOX1ZJMl9EMTNfWTUsIDAsCisJCS8qIElQNF8xNF8xMyBbMl0gKi8KKwkJRk5fVkk0X0Q1X0M1LCBGTl9WSTBfRDIwX1I0LCBGTl9WSTJfRDEyX1k0LCAwLAorCQkvKiBJUDRfMTJfMTEgWzJdICovCisJCUZOX1ZJNF9ENF9DNCwgRk5fVkkwX0QxOV9SMywgRk5fVkkxX0QxNV9HN19ZNywgMCwKKwkJLyogSVA0XzEwXzkgWzJdICovCisJCUZOX1ZJNF9EM19DMywgRk5fVkkwX0QxOF9SMiwgRk5fVkkxX0QxNF9HNl9ZNiwgMCwKKwkJLyogSVA0XzhfNyBbMl0gKi8KKwkJRk5fVkk0X0QyX0MyLCAwLCBGTl9WSTBfRDE3X1IxLCBGTl9WSTFfRDEzX0c1X1k1LAorCQkvKiBJUDRfNl81IFsyXSAqLworCQlGTl9WSTRfRDFfQzEsIEZOX1ZJMF9EMTZfUjAsIEZOX1ZJMV9EMTJfRzRfWTQsIDAsCisJCS8qIElQNF80IFsxXSAqLworCQlGTl9WSTRfRDBfQzAsIEZOX1ZJMF9EMTVfRzdfWTcsCisJCS8qIElQNF8zXzIgWzJdICovCisJCUZOX1ZJNF9WU1lOQ19OLCBGTl9WSTBfRDE0X0c2X1k2LCAwLCAwLAorCQkvKiBJUDRfMSBbMV0gKi8KKwkJRk5fVkk0X0hTWU5DX04sIEZOX1ZJMF9EMTNfRzVfWTUsCisJCS8qIElQNF8wIFsxXSAqLworCQlGTl9WSTRfQ0xLRU5CLCBGTl9WSTBfRDEyX0c0X1k0IH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUdfVkFSKCJJUFNSNSIsIDB4RTYwNjAwNTQsIDMyLAorCQkJICAgICA0LCA0LAorCQkJICAgICA0LCA0LAorCQkJICAgICA0LCAxLCAxLCAxLCAxLAorCQkJICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxKSB7CisJCS8qIElQNV8zMV8yOCBbNF0gKi8KKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJLyogSVA1XzI3XzI0IFs0XSAqLworCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkvKiBJUDVfMjNfMjAgWzRdICovCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCS8qIElQNV8xOV8xNiBbNF0gKi8KKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJLyogSVA1XzE1XzEyIFs0XSAqLworCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkvKiBJUDVfMTEgWzFdICovCisJCUZOX1ZJNV9EOF9ZMCwgRk5fVkkxX0QyM19SNywKKwkJLyogSVA1XzEwIFsxXSAqLworCQlGTl9WSTVfRDdfQzcsIEZOX1ZJMV9EMjJfUjYsCisJCS8qIElQNV85IFsxXSAqLworCQlGTl9WSTVfRDZfQzYsIEZOX1ZJMV9EMjFfUjUsCisJCS8qIElQNV84IFsxXSAqLworCQlGTl9WSTVfRDVfQzUsIEZOX1ZJMV9EMjBfUjQsCisJCS8qIElQNV83IFsxXSAqLworCQlGTl9WSTVfRDRfQzQsIEZOX1ZJMV9EMTlfUjMsCisJCS8qIElQNV82IFsxXSAqLworCQlGTl9WSTVfRDNfQzMsIEZOX1ZJMV9EMThfUjIsCisJCS8qIElQNV81IFsxXSAqLworCQlGTl9WSTVfRDJfQzIsIEZOX1ZJMV9EMTdfUjEsCisJCS8qIElQNV80IFsxXSAqLworCQlGTl9WSTVfRDFfQzEsIEZOX1ZJMV9EMTZfUjAsCisJCS8qIElQNV8zIFsxXSAqLworCQlGTl9WSTVfRDBfQzAsIEZOX1ZJMV9EMTVfRzdfWTdfQiwKKwkJLyogSVA1XzIgWzFdICovCisJCUZOX1ZJNV9WU1lOQ19OLCBGTl9WSTFfRDE0X0c2X1k2X0IsCisJCS8qIElQNV8xIFsxXSAqLworCQlGTl9WSTVfSFNZTkNfTiwgRk5fVkkxX0QxM19HNV9ZNV9CLAorCQkvKiBJUDVfMCBbMV0gKi8KKwkJRk5fVkk1X0NMS0VOQiwgRk5fVkkxX0QxMl9HNF9ZNF9CIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUdfVkFSKCJJUFNSNiIsIDB4RTYwNjAwNTgsIDMyLAorCQkJICAgICA0LCA0LAorCQkJICAgICA0LCAxLCAyLCAxLAorCQkJICAgICAyLCAyLCAyLCAyLAorCQkJICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxKSB7CisJCS8qIElQNl8zMV8yOCBbNF0gKi8KKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJLyogSVA2XzI3XzI0IFs0XSAqLworCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkvKiBJUDZfMjNfMjAgWzRdICovCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCS8qIElQNl8xOSBbMV0gKi8KKwkJMCwgMCwKKwkJLyogSVA2XzE4XzE3IFsyXSAqLworCQlGTl9EUkVRMV9OLCBGTl9SWDMsIDAsIDAsCisJCS8qIElQNl8xNiBbMV0gKi8KKwkJRk5fVFgzLCAwLAorCQkvKiBJUDZfMTVfMTQgWzJdICovCisJCUZOX0RBQ0sxLCBGTl9TQ0szLCAwLCAwLAorCQkvKiBJUDZfMTNfMTIgWzJdICovCisJCUZOX0RSRVEwX04sIEZOX1JYMiwgMCwgMCwKKwkJLyogSVA2XzExXzEwIFsyXSAqLworCQlGTl9EQUNLMCwgRk5fVFgyLCAwLCAwLAorCQkvKiBJUDZfOV84IFsyXSAqLworCQlGTl9EUkFDSzAsIEZOX1NDSzIsIDAsIDAsCisJCS8qIElQNl83IFsxXSAqLworCQlGTl9NU0lPRjFfUlhELCBGTl9IUlgxLAorCQkvKiBJUDZfNiBbMV0gKi8KKwkJRk5fTVNJT0YxX1RYRCwgRk5fSFRYMSwKKwkJLyogSVA2XzUgWzFdICovCisJCUZOX01TSU9GMV9TWU5DLCBGTl9IUlRTMV9OLAorCQkvKiBJUDZfNCBbMV0gKi8KKwkJRk5fTVNJT0YxX1NDSywgRk5fSFNDSzEsCisJCS8qIElQNl8zIFsxXSAqLworCQlGTl9NU0lPRjBfUlhELCBGTl9IUlgwLAorCQkvKiBJUDZfMiBbMV0gKi8KKwkJRk5fTVNJT0YwX1RYRCwgRk5fSFRYMCwKKwkJLyogSVA2XzEgWzFdICovCisJCUZOX01TSU9GMF9TWU5DLCBGTl9IQ1RTMF9OLAorCQkvKiBJUDZfMCBbMV0gKi8KKwkJRk5fTVNJT0YwX1NDSywgRk5fSFNDSzAgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFR19WQVIoIklQU1I3IiwgMHhFNjA2MDA1QywgMzIsCisJCQkgICAgIDQsIDQsCisJCQkgICAgIDMsIDEsIDEsIDEsIDEsIDEsCisJCQkgICAgIDIsIDIsIDIsIDIsCisJCQkgICAgIDEsIDEsIDIsIDIsIDIpIHsKKwkJLyogSVA3XzMxXzI4IFs0XSAqLworCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkvKiBJUDdfMjdfMjQgWzRdICovCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCS8qIElQN18yM18yMSBbM10gKi8KKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJLyogSVA3XzIwIFsxXSAqLworCQlGTl9BVURJT19DTEtCLCAwLAorCQkvKiBJUDdfMTkgWzFdICovCisJCUZOX0FVRElPX0NMS0EsIDAsCisJCS8qIElQN18xOCBbMV0gKi8KKwkJRk5fQVVESU9fQ0xLT1VULCAwLAorCQkvKiBJUDdfMTcgWzFdICovCisJCUZOX1NTSV9TREFUQTQsIDAsCisJCS8qIElQN18xNiBbMV0gKi8KKwkJRk5fU1NJX1dTNCwgMCwKKwkJLyogSVA3XzE1XzE0IFsyXSAqLworCQlGTl9TU0lfU0NLNCwgRk5fVFBVMFRPMywgMCwgMCwKKwkJLyogSVA3XzEzXzEyIFsyXSAqLworCQlGTl9TU0lfU0RBVEEzLCBGTl9UUFUwVE8yLCAwLCAwLAorCQkvKiBJUDdfMTFfMTAgWzJdICovCisJCUZOX1NTSV9XUzM0LCBGTl9UUFUwVE8xLCAwLCAwLAorCQkvKiBJUDdfOV84IFsyXSAqLworCQlGTl9TU0lfU0NLMzQsIEZOX1RQVTBUTzAsIDAsIDAsCisJCS8qIElQN183IFsxXSAqLworCQlGTl9QV000LCAwLAorCQkvKiBJUDdfNiBbMV0gKi8KKwkJRk5fUFdNMywgMCwKKwkJLyogSVA3XzVfNCBbMl0gKi8KKwkJRk5fUFdNMiwgRk5fVENMSzMsIEZOX0ZTT19UT0UsIDAsCisJCS8qIElQN18zXzIgWzJdICovCisJCUZOX1BXTTEsIEZOX1RDTEsyLCBGTl9GU09fQ0ZFXzEsIDAsCisJCS8qIElQN18xXzAgWzJdICovCisJCUZOX1BXTTAsIEZOX1RDTEsxLCBGTl9GU09fQ0ZFXzAsIDAgfQorCX0sCisJeyB9LAorfTsKKworY29uc3Qgc3RydWN0IHNoX3BmY19zb2NfaW5mbyByOGE3NzkyX3Bpbm11eF9pbmZvID0geworCS5uYW1lID0gInI4YTc3OTIwX3BmYyIsCisJLnVubG9ja19yZWcgPSAweGU2MDYwMDAwLCAvKiBQTU1SICovCisKKwkuZnVuY3Rpb24gPSB7IFBJTk1VWF9GVU5DVElPTl9CRUdJTiwgUElOTVVYX0ZVTkNUSU9OX0VORCB9LAorCisJLnBpbnMgPSBwaW5tdXhfcGlucywKKwkubnJfcGlucyA9IEFSUkFZX1NJWkUocGlubXV4X3BpbnMpLAorCS5ncm91cHMgPSBwaW5tdXhfZ3JvdXBzLAorCS5ucl9ncm91cHMgPSBBUlJBWV9TSVpFKHBpbm11eF9ncm91cHMpLAorCS5mdW5jdGlvbnMgPSBwaW5tdXhfZnVuY3Rpb25zLAorCS5ucl9mdW5jdGlvbnMgPSBBUlJBWV9TSVpFKHBpbm11eF9mdW5jdGlvbnMpLAorCisJLmNmZ19yZWdzID0gcGlubXV4X2NvbmZpZ19yZWdzLAorCisJLnBpbm11eF9kYXRhID0gcGlubXV4X2RhdGEsCisJLnBpbm11eF9kYXRhX3NpemUgPSBBUlJBWV9TSVpFKHBpbm11eF9kYXRhKSwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BmYy1yOGE3Nzk0LmMgYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BmYy1yOGE3Nzk0LmMKaW5kZXggOGJjMmNmMGMuLmVkNzM0ZjU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BmYy1yOGE3Nzk0LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9wZmMtcjhhNzc5NC5jCkBAIC0yMiw3ICsyMiw5IEBACiAJUE9SVF9HUF8zMigzLCBmbiwgc2Z4KSwJCQkJCQlcCiAJUE9SVF9HUF8zMig0LCBmbiwgc2Z4KSwJCQkJCQlcCiAJUE9SVF9HUF8yOCg1LCBmbiwgc2Z4KSwJCQkJCQlcCi0JUE9SVF9HUF8yNig2LCBmbiwgc2Z4KQorCVBPUlRfR1BfQ0ZHXzI0KDYsIGZuLCBzZngsIFNIX1BGQ19QSU5fQ0ZHX0lPX1ZPTFRBR0UpLAkJXAorCVBPUlRfR1BfMSg2LCAyNCwgZm4sIHNmeCksCQkJCQlcCisJUE9SVF9HUF8xKDYsIDI1LCBmbiwgc2Z4KQogCiBlbnVtIHsKIAlQSU5NVVhfUkVTRVJWRUQgPSAwLApAQCAtNTE2MCw4ICs1MTYyLDMyIEBACiAJeyB9LAogfTsKIAorc3RhdGljIGludCByOGE3Nzk0X3Bpbl90b19wb2NjdHJsKHN0cnVjdCBzaF9wZmMgKnBmYywgdW5zaWduZWQgaW50IHBpbiwgdTMyICpwb2NjdHJsKQoreworCSpwb2NjdHJsID0gMHhlNjA2MDA2YzsKKworCXN3aXRjaCAocGluICYgMHgxZikgeworCWNhc2UgNjogcmV0dXJuIDIzOworCWNhc2UgNzogcmV0dXJuIDE2OworCWNhc2UgMTQ6IHJldHVybiAxNTsKKwljYXNlIDE1OiByZXR1cm4gODsKKwljYXNlIDAgLi4uIDU6CisJY2FzZSA4IC4uLiAxMzoKKwkJcmV0dXJuIDIyIC0gKHBpbiAmIDB4MWYpOworCWNhc2UgMTYgLi4uIDIzOgorCQlyZXR1cm4gNDcgLSAocGluICYgMHgxZik7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfcGZjX3NvY19vcGVyYXRpb25zIHI4YTc3OTRfcGlubXV4X29wcyA9IHsKKwkucGluX3RvX3BvY2N0cmwgPSByOGE3Nzk0X3Bpbl90b19wb2NjdHJsLAorfTsKKwogY29uc3Qgc3RydWN0IHNoX3BmY19zb2NfaW5mbyByOGE3Nzk0X3Bpbm11eF9pbmZvID0gewogCS5uYW1lID0gInI4YTc3OTQwX3BmYyIsCisJLm9wcyA9ICZyOGE3Nzk0X3Bpbm11eF9vcHMsCiAJLnVubG9ja19yZWcgPSAweGU2MDYwMDAwLCAvKiBQTU1SICovCiAKIAkuZnVuY3Rpb24gPSB7IFBJTk1VWF9GVU5DVElPTl9CRUdJTiwgUElOTVVYX0ZVTkNUSU9OX0VORCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9wZmMtcjhhNzc5NS5jIGIvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9wZmMtcjhhNzc5NS5jCmluZGV4IGI3NGNkZDMuLjJlOGNjMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvcGZjLXI4YTc3OTUuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BmYy1yOGE3Nzk1LmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogUi1DYXIgR2VuMyBwcm9jZXNzb3Igc3VwcG9ydCAtIFBGQyBoYXJkd2FyZSBibG9jay4KKyAqIFI4QTc3OTUgcHJvY2Vzc29yIHN1cHBvcnQgLSBQRkMgaGFyZHdhcmUgYmxvY2suCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDE1ICBSZW5lc2FzIEVsZWN0cm9uaWNzIENvcnBvcmF0aW9uCiAgKgpAQCAtMTMsMTkgKzEzLDIzIEBACiAjaW5jbHVkZSAiY29yZS5oIgogI2luY2x1ZGUgInNoX3BmYy5oIgogCisjZGVmaW5lIENGR19GTEFHUyAoU0hfUEZDX1BJTl9DRkdfRFJJVkVfU1RSRU5HVEggfCBcCisJCSAgIFNIX1BGQ19QSU5fQ0ZHX1BVTExfVVAgfCBcCisJCSAgIFNIX1BGQ19QSU5fQ0ZHX1BVTExfRE9XTikKKwogI2RlZmluZSBDUFVfQUxMX1BPUlQoZm4sIHNmeCkJCQkJCQlcCi0JUE9SVF9HUF9DRkdfMTYoMCwgZm4sIHNmeCwgU0hfUEZDX1BJTl9DRkdfRFJJVkVfU1RSRU5HVEgpLAlcCi0JUE9SVF9HUF9DRkdfMjgoMSwgZm4sIHNmeCwgU0hfUEZDX1BJTl9DRkdfRFJJVkVfU1RSRU5HVEgpLAlcCi0JUE9SVF9HUF9DRkdfMTUoMiwgZm4sIHNmeCwgU0hfUEZDX1BJTl9DRkdfRFJJVkVfU1RSRU5HVEgpLAlcCi0JUE9SVF9HUF9DRkdfMTIoMywgZm4sIHNmeCwgU0hfUEZDX1BJTl9DRkdfRFJJVkVfU1RSRU5HVEggfCBTSF9QRkNfUElOX0NGR19JT19WT0xUQUdFKSwJXAotCVBPUlRfR1BfQ0ZHXzEoMywgMTIsIGZuLCBzZngsIFNIX1BGQ19QSU5fQ0ZHX0RSSVZFX1NUUkVOR1RIKSwJXAotCVBPUlRfR1BfQ0ZHXzEoMywgMTMsIGZuLCBzZngsIFNIX1BGQ19QSU5fQ0ZHX0RSSVZFX1NUUkVOR1RIKSwJXAotCVBPUlRfR1BfQ0ZHXzEoMywgMTQsIGZuLCBzZngsIFNIX1BGQ19QSU5fQ0ZHX0RSSVZFX1NUUkVOR1RIKSwJXAotCVBPUlRfR1BfQ0ZHXzEoMywgMTUsIGZuLCBzZngsIFNIX1BGQ19QSU5fQ0ZHX0RSSVZFX1NUUkVOR1RIKSwJXAotCVBPUlRfR1BfQ0ZHXzE4KDQsIGZuLCBzZngsIFNIX1BGQ19QSU5fQ0ZHX0RSSVZFX1NUUkVOR1RIIHwgU0hfUEZDX1BJTl9DRkdfSU9fVk9MVEFHRSksCVwKLQlQT1JUX0dQX0NGR18yNig1LCBmbiwgc2Z4LCBTSF9QRkNfUElOX0NGR19EUklWRV9TVFJFTkdUSCksCVwKLQlQT1JUX0dQX0NGR18zMig2LCBmbiwgc2Z4LCBTSF9QRkNfUElOX0NGR19EUklWRV9TVFJFTkdUSCksCVwKLQlQT1JUX0dQX0NGR180KDcsIGZuLCBzZngsIFNIX1BGQ19QSU5fQ0ZHX0RSSVZFX1NUUkVOR1RIKQorCVBPUlRfR1BfQ0ZHXzE2KDAsIGZuLCBzZngsIENGR19GTEFHUyksCVwKKwlQT1JUX0dQX0NGR18yOCgxLCBmbiwgc2Z4LCBDRkdfRkxBR1MpLAlcCisJUE9SVF9HUF9DRkdfMTUoMiwgZm4sIHNmeCwgQ0ZHX0ZMQUdTKSwJXAorCVBPUlRfR1BfQ0ZHXzEyKDMsIGZuLCBzZngsIENGR19GTEFHUyB8IFNIX1BGQ19QSU5fQ0ZHX0lPX1ZPTFRBR0UpLAlcCisJUE9SVF9HUF9DRkdfMSgzLCAxMiwgZm4sIHNmeCwgQ0ZHX0ZMQUdTKSwJXAorCVBPUlRfR1BfQ0ZHXzEoMywgMTMsIGZuLCBzZngsIENGR19GTEFHUyksCVwKKwlQT1JUX0dQX0NGR18xKDMsIDE0LCBmbiwgc2Z4LCBDRkdfRkxBR1MpLAlcCisJUE9SVF9HUF9DRkdfMSgzLCAxNSwgZm4sIHNmeCwgQ0ZHX0ZMQUdTKSwJXAorCVBPUlRfR1BfQ0ZHXzE4KDQsIGZuLCBzZngsIENGR19GTEFHUyB8IFNIX1BGQ19QSU5fQ0ZHX0lPX1ZPTFRBR0UpLAlcCisJUE9SVF9HUF9DRkdfMjYoNSwgZm4sIHNmeCwgQ0ZHX0ZMQUdTKSwJXAorCVBPUlRfR1BfQ0ZHXzMyKDYsIGZuLCBzZngsIENGR19GTEFHUyksCVwKKwlQT1JUX0dQX0NGR180KDcsIGZuLCBzZngsIENGR19GTEFHUykKIC8qCiAgKiBGXygpIDoganVzdCBpbmZvcm1hdGlvbgogICogRk0oKSA6IG1hY3JvIGZvciBGTl94eHggLyB4eHhfTUFSSwpAQCAtMTg3MSw2ICsxODc1LDg2IEBACiAJUklGM19EMV9CX01BUkssCiB9OwogCisvKiAtIERVIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdV9yZ2I2NjZfcGluc1tdID0geworCS8qIFJbNzoyXSwgR1s3OjJdLCBCWzc6Ml0gKi8KKwlSQ0FSX0dQX1BJTigwLCAxNSksIFJDQVJfR1BfUElOKDAsIDE0KSwgUkNBUl9HUF9QSU4oMCwgMTMpLAorCVJDQVJfR1BfUElOKDAsIDEyKSwgUkNBUl9HUF9QSU4oMCwgMTEpLCBSQ0FSX0dQX1BJTigwLCAxMCksCisJUkNBUl9HUF9QSU4oMSwgMTUpLCBSQ0FSX0dQX1BJTigxLCAxNCksIFJDQVJfR1BfUElOKDEsIDEzKSwKKwlSQ0FSX0dQX1BJTigxLCAxMiksIFJDQVJfR1BfUElOKDEsIDE5KSwgUkNBUl9HUF9QSU4oMSwgMTgpLAorCVJDQVJfR1BfUElOKDEsIDcpLCAgUkNBUl9HUF9QSU4oMSwgNiksICBSQ0FSX0dQX1BJTigxLCA1KSwKKwlSQ0FSX0dQX1BJTigxLCA0KSwgIFJDQVJfR1BfUElOKDEsIDMpLCAgUkNBUl9HUF9QSU4oMSwgMiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdV9yZ2I2NjZfbXV4W10gPSB7CisJRFVfRFI3X01BUkssIERVX0RSNl9NQVJLLCBEVV9EUjVfTUFSSywgRFVfRFI0X01BUkssCisJRFVfRFIzX01BUkssIERVX0RSMl9NQVJLLAorCURVX0RHN19NQVJLLCBEVV9ERzZfTUFSSywgRFVfREc1X01BUkssIERVX0RHNF9NQVJLLAorCURVX0RHM19NQVJLLCBEVV9ERzJfTUFSSywKKwlEVV9EQjdfTUFSSywgRFVfREI2X01BUkssIERVX0RCNV9NQVJLLCBEVV9EQjRfTUFSSywKKwlEVV9EQjNfTUFSSywgRFVfREIyX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdV9yZ2I4ODhfcGluc1tdID0geworCS8qIFJbNzowXSwgR1s3OjBdLCBCWzc6MF0gKi8KKwlSQ0FSX0dQX1BJTigwLCAxNSksIFJDQVJfR1BfUElOKDAsIDE0KSwgUkNBUl9HUF9QSU4oMCwgMTMpLAorCVJDQVJfR1BfUElOKDAsIDEyKSwgUkNBUl9HUF9QSU4oMCwgMTEpLCBSQ0FSX0dQX1BJTigwLCAxMCksCisJUkNBUl9HUF9QSU4oMCwgOSksICBSQ0FSX0dQX1BJTigwLCA4KSwKKwlSQ0FSX0dQX1BJTigxLCAxNSksIFJDQVJfR1BfUElOKDEsIDE0KSwgUkNBUl9HUF9QSU4oMSwgMTMpLAorCVJDQVJfR1BfUElOKDEsIDEyKSwgUkNBUl9HUF9QSU4oMSwgMTkpLCBSQ0FSX0dQX1BJTigxLCAxOCksCisJUkNBUl9HUF9QSU4oMSwgMTcpLCBSQ0FSX0dQX1BJTigxLCAxNiksCisJUkNBUl9HUF9QSU4oMSwgNyksICBSQ0FSX0dQX1BJTigxLCA2KSwgIFJDQVJfR1BfUElOKDEsIDUpLAorCVJDQVJfR1BfUElOKDEsIDQpLCAgUkNBUl9HUF9QSU4oMSwgMyksICBSQ0FSX0dQX1BJTigxLCAyKSwKKwlSQ0FSX0dQX1BJTigxLCAxKSwgIFJDQVJfR1BfUElOKDEsIDApLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHVfcmdiODg4X211eFtdID0geworCURVX0RSN19NQVJLLCBEVV9EUjZfTUFSSywgRFVfRFI1X01BUkssIERVX0RSNF9NQVJLLAorCURVX0RSM19NQVJLLCBEVV9EUjJfTUFSSywgRFVfRFIxX01BUkssIERVX0RSMF9NQVJLLAorCURVX0RHN19NQVJLLCBEVV9ERzZfTUFSSywgRFVfREc1X01BUkssIERVX0RHNF9NQVJLLAorCURVX0RHM19NQVJLLCBEVV9ERzJfTUFSSywgRFVfREcxX01BUkssIERVX0RHMF9NQVJLLAorCURVX0RCN19NQVJLLCBEVV9EQjZfTUFSSywgRFVfREI1X01BUkssIERVX0RCNF9NQVJLLAorCURVX0RCM19NQVJLLCBEVV9EQjJfTUFSSywgRFVfREIxX01BUkssIERVX0RCMF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHVfY2xrX291dF8wX3BpbnNbXSA9IHsKKwkvKiBDTEtPVVQgKi8KKwlSQ0FSX0dQX1BJTigxLCAyNyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdV9jbGtfb3V0XzBfbXV4W10gPSB7CisJRFVfRE9UQ0xLT1VUMF9NQVJLCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdV9jbGtfb3V0XzFfcGluc1tdID0geworCS8qIENMS09VVCAqLworCVJDQVJfR1BfUElOKDIsIDMpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHVfY2xrX291dF8xX211eFtdID0geworCURVX0RPVENMS09VVDFfTUFSSworfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHVfc3luY19waW5zW10gPSB7CisJLyogRVhWU1lOQy9WU1lOQywgRVhIU1lOQy9IU1lOQyAqLworCVJDQVJfR1BfUElOKDIsIDUpLCBSQ0FSX0dQX1BJTigyLCA0KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR1X3N5bmNfbXV4W10gPSB7CisJRFVfRVhWU1lOQ19EVV9WU1lOQ19NQVJLLCBEVV9FWEhTWU5DX0RVX0hTWU5DX01BUksKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR1X29kZGZfcGluc1tdID0geworCS8qIEVYRElTUC9FWE9EREYvRVhDREUgKi8KKwlSQ0FSX0dQX1BJTigyLCAyKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR1X29kZGZfbXV4W10gPSB7CisJRFVfRVhPRERGX0RVX09EREZfRElTUF9DREVfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR1X2NkZV9waW5zW10gPSB7CisJLyogQ0RFICovCisJUkNBUl9HUF9QSU4oMiwgMCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdV9jZGVfbXV4W10gPSB7CisJRFVfQ0RFX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdV9kaXNwX3BpbnNbXSA9IHsKKwkvKiBESVNQICovCisJUkNBUl9HUF9QSU4oMiwgMSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdV9kaXNwX211eFtdID0geworCURVX0RJU1BfTUFSSywKK307CiAvKiAtIEhTQ0lGMCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBoc2NpZjBfZGF0YV9waW5zW10gPSB7CiAJLyogUlgsIFRYICovCkBAIC0zNTkzLDYgKzM2NzcsMTQgQEAKIAlTSF9QRkNfUElOX0dST1VQKGRyaWYzX2N0cmxfYiksCiAJU0hfUEZDX1BJTl9HUk9VUChkcmlmM19kYXRhMF9iKSwKIAlTSF9QRkNfUElOX0dST1VQKGRyaWYzX2RhdGExX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAoZHVfcmdiNjY2KSwKKwlTSF9QRkNfUElOX0dST1VQKGR1X3JnYjg4OCksCisJU0hfUEZDX1BJTl9HUk9VUChkdV9jbGtfb3V0XzApLAorCVNIX1BGQ19QSU5fR1JPVVAoZHVfY2xrX291dF8xKSwKKwlTSF9QRkNfUElOX0dST1VQKGR1X3N5bmMpLAorCVNIX1BGQ19QSU5fR1JPVVAoZHVfb2RkZiksCisJU0hfUEZDX1BJTl9HUk9VUChkdV9jZGUpLAorCVNIX1BGQ19QSU5fR1JPVVAoZHVfZGlzcCksCiAJU0hfUEZDX1BJTl9HUk9VUChoc2NpZjBfZGF0YSksCiAJU0hfUEZDX1BJTl9HUk9VUChoc2NpZjBfY2xrKSwKIAlTSF9QRkNfUElOX0dST1VQKGhzY2lmMF9jdHJsKSwKQEAgLTM5MTgsNiArNDAxMCwxNyBAQAogCSJkcmlmM19kYXRhMV9iIiwKIH07CiAKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZHVfZ3JvdXBzW10gPSB7CisJImR1X3JnYjY2NiIsCisJImR1X3JnYjg4OCIsCisJImR1X2Nsa19vdXRfMCIsCisJImR1X2Nsa19vdXRfMSIsCisJImR1X3N5bmMiLAorCSJkdV9vZGRmIiwKKwkiZHVfY2RlIiwKKwkiZHVfZGlzcCIsCit9OworCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGhzY2lmMF9ncm91cHNbXSA9IHsKIAkiaHNjaWYwX2RhdGEiLAogCSJoc2NpZjBfY2xrIiwKQEAgLTQyNjUsNiArNDM2OCw3IEBACiAJU0hfUEZDX0ZVTkNUSU9OKGRyaWYxKSwKIAlTSF9QRkNfRlVOQ1RJT04oZHJpZjIpLAogCVNIX1BGQ19GVU5DVElPTihkcmlmMyksCisJU0hfUEZDX0ZVTkNUSU9OKGR1KSwKIAlTSF9QRkNfRlVOQ1RJT04oaHNjaWYwKSwKIAlTSF9QRkNfRlVOQ1RJT04oaHNjaWYxKSwKIAlTSF9QRkNfRlVOQ1RJT04oaHNjaWYyKSwKQEAgLTUwNzMsOCArNTE3NywyMzQgQEAKIAlyZXR1cm4gYml0OwogfQogCisjZGVmaW5lIFBVRU4JMHhlNjA2MDQwMAorI2RlZmluZSBQVUQJMHhlNjA2MDQ0MAorCisjZGVmaW5lIFBVMAkweDAwCisjZGVmaW5lIFBVMQkweDA0CisjZGVmaW5lIFBVMgkweDA4CisjZGVmaW5lIFBVMwkweDBjCisjZGVmaW5lIFBVNAkweDEwCisjZGVmaW5lIFBVNQkweDE0CisjZGVmaW5lIFBVNgkweDE4CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCXUxNiByZWcgOiAxMTsKKwl1MTYgYml0IDogNTsKK30gcHVsbHVwc1tdID0geworCVtSQ0FSX0dQX1BJTigyLCAxMSldID0geyBQVTAsIDMxIH0sCS8qIEFWQl9QSFlfSU5UICovCisJW1JDQVJfR1BfUElOKDIsIDEwKV0gPSB7IFBVMCwgMzAgfSwJLyogQVZCX01BR0lDICovCisJW1JDQVJfR1BfUElOKDIsICA5KV0gPSB7IFBVMCwgMjkgfSwJLyogQVZCX01EQyAqLworCisJW1JDQVJfR1BfUElOKDEsIDE5KV0gPSB7IFBVMSwgMzEgfSwJLyogQTE5ICovCisJW1JDQVJfR1BfUElOKDEsIDE4KV0gPSB7IFBVMSwgMzAgfSwJLyogQTE4ICovCisJW1JDQVJfR1BfUElOKDEsIDE3KV0gPSB7IFBVMSwgMjkgfSwJLyogQTE3ICovCisJW1JDQVJfR1BfUElOKDEsIDE2KV0gPSB7IFBVMSwgMjggfSwJLyogQTE2ICovCisJW1JDQVJfR1BfUElOKDEsIDE1KV0gPSB7IFBVMSwgMjcgfSwJLyogQTE1ICovCisJW1JDQVJfR1BfUElOKDEsIDE0KV0gPSB7IFBVMSwgMjYgfSwJLyogQTE0ICovCisJW1JDQVJfR1BfUElOKDEsIDEzKV0gPSB7IFBVMSwgMjUgfSwJLyogQTEzICovCisJW1JDQVJfR1BfUElOKDEsIDEyKV0gPSB7IFBVMSwgMjQgfSwJLyogQTEyICovCisJW1JDQVJfR1BfUElOKDEsIDExKV0gPSB7IFBVMSwgMjMgfSwJLyogQTExICovCisJW1JDQVJfR1BfUElOKDEsIDEwKV0gPSB7IFBVMSwgMjIgfSwJLyogQTEwICovCisJW1JDQVJfR1BfUElOKDEsICA5KV0gPSB7IFBVMSwgMjEgfSwJLyogQTkgKi8KKwlbUkNBUl9HUF9QSU4oMSwgIDgpXSA9IHsgUFUxLCAyMCB9LAkvKiBBOCAqLworCVtSQ0FSX0dQX1BJTigxLCAgNyldID0geyBQVTEsIDE5IH0sCS8qIEE3ICovCisJW1JDQVJfR1BfUElOKDEsICA2KV0gPSB7IFBVMSwgMTggfSwJLyogQTYgKi8KKwlbUkNBUl9HUF9QSU4oMSwgIDUpXSA9IHsgUFUxLCAxNyB9LAkvKiBBNSAqLworCVtSQ0FSX0dQX1BJTigxLCAgNCldID0geyBQVTEsIDE2IH0sCS8qIEE0ICovCisJW1JDQVJfR1BfUElOKDEsICAzKV0gPSB7IFBVMSwgMTUgfSwJLyogQTMgKi8KKwlbUkNBUl9HUF9QSU4oMSwgIDIpXSA9IHsgUFUxLCAxNCB9LAkvKiBBMiAqLworCVtSQ0FSX0dQX1BJTigxLCAgMSldID0geyBQVTEsIDEzIH0sCS8qIEExICovCisJW1JDQVJfR1BfUElOKDEsICAwKV0gPSB7IFBVMSwgMTIgfSwJLyogQTAgKi8KKwlbUkNBUl9HUF9QSU4oMiwgIDgpXSA9IHsgUFUxLCAxMSB9LAkvKiBQV00yX0EgKi8KKwlbUkNBUl9HUF9QSU4oMiwgIDcpXSA9IHsgUFUxLCAxMCB9LAkvKiBQV00xX0EgKi8KKwlbUkNBUl9HUF9QSU4oMiwgIDYpXSA9IHsgUFUxLCAgOSB9LAkvKiBQV00wICovCisJW1JDQVJfR1BfUElOKDIsICA1KV0gPSB7IFBVMSwgIDggfSwJLyogSVJRNSAqLworCVtSQ0FSX0dQX1BJTigyLCAgNCldID0geyBQVTEsICA3IH0sCS8qIElSUTQgKi8KKwlbUkNBUl9HUF9QSU4oMiwgIDMpXSA9IHsgUFUxLCAgNiB9LAkvKiBJUlEzICovCisJW1JDQVJfR1BfUElOKDIsICAyKV0gPSB7IFBVMSwgIDUgfSwJLyogSVJRMiAqLworCVtSQ0FSX0dQX1BJTigyLCAgMSldID0geyBQVTEsICA0IH0sCS8qIElSUTEgKi8KKwlbUkNBUl9HUF9QSU4oMiwgIDApXSA9IHsgUFUxLCAgMyB9LAkvKiBJUlEwICovCisJW1JDQVJfR1BfUElOKDIsIDE0KV0gPSB7IFBVMSwgIDIgfSwJLyogQVZCX0FWVFBfQ0FQVFVSRV9BICovCisJW1JDQVJfR1BfUElOKDIsIDEzKV0gPSB7IFBVMSwgIDEgfSwJLyogQVZCX0FWVFBfTUFUQ0hfQSAqLworCVtSQ0FSX0dQX1BJTigyLCAxMildID0geyBQVTEsICAwIH0sCS8qIEFWQl9MSU5LICovCisKKwlbUkNBUl9HUF9QSU4oNywgIDMpXSA9IHsgUFUyLCAyOSB9LAkvKiBIRE1JMV9DRUMgKi8KKwlbUkNBUl9HUF9QSU4oNywgIDIpXSA9IHsgUFUyLCAyOCB9LAkvKiBIRE1JMF9DRUMgKi8KKwlbUkNBUl9HUF9QSU4oNywgIDEpXSA9IHsgUFUyLCAyNyB9LAkvKiBBVlMyICovCisJW1JDQVJfR1BfUElOKDcsICAwKV0gPSB7IFBVMiwgMjYgfSwJLyogQVZTMSAqLworCVtSQ0FSX0dQX1BJTigwLCAxNSldID0geyBQVTIsIDI1IH0sCS8qIEQxNSAqLworCVtSQ0FSX0dQX1BJTigwLCAxNCldID0geyBQVTIsIDI0IH0sCS8qIEQxNCAqLworCVtSQ0FSX0dQX1BJTigwLCAxMyldID0geyBQVTIsIDIzIH0sCS8qIEQxMyAqLworCVtSQ0FSX0dQX1BJTigwLCAxMildID0geyBQVTIsIDIyIH0sCS8qIEQxMiAqLworCVtSQ0FSX0dQX1BJTigwLCAxMSldID0geyBQVTIsIDIxIH0sCS8qIEQxMSAqLworCVtSQ0FSX0dQX1BJTigwLCAxMCldID0geyBQVTIsIDIwIH0sCS8qIEQxMCAqLworCVtSQ0FSX0dQX1BJTigwLCAgOSldID0geyBQVTIsIDE5IH0sCS8qIEQ5ICovCisJW1JDQVJfR1BfUElOKDAsICA4KV0gPSB7IFBVMiwgMTggfSwJLyogRDggKi8KKwlbUkNBUl9HUF9QSU4oMCwgIDcpXSA9IHsgUFUyLCAxNyB9LAkvKiBENyAqLworCVtSQ0FSX0dQX1BJTigwLCAgNildID0geyBQVTIsIDE2IH0sCS8qIEQ2ICovCisJW1JDQVJfR1BfUElOKDAsICA1KV0gPSB7IFBVMiwgMTUgfSwJLyogRDUgKi8KKwlbUkNBUl9HUF9QSU4oMCwgIDQpXSA9IHsgUFUyLCAxNCB9LAkvKiBENCAqLworCVtSQ0FSX0dQX1BJTigwLCAgMyldID0geyBQVTIsIDEzIH0sCS8qIEQzICovCisJW1JDQVJfR1BfUElOKDAsICAyKV0gPSB7IFBVMiwgMTIgfSwJLyogRDIgKi8KKwlbUkNBUl9HUF9QSU4oMCwgIDEpXSA9IHsgUFUyLCAxMSB9LAkvKiBEMSAqLworCVtSQ0FSX0dQX1BJTigwLCAgMCldID0geyBQVTIsIDEwIH0sCS8qIEQwICovCisJW1JDQVJfR1BfUElOKDEsIDI3KV0gPSB7IFBVMiwgIDggfSwJLyogRVhfV0FJVDBfQSAqLworCVtSQ0FSX0dQX1BJTigxLCAyNildID0geyBQVTIsICA3IH0sCS8qIFdFMV9OICovCisJW1JDQVJfR1BfUElOKDEsIDI1KV0gPSB7IFBVMiwgIDYgfSwJLyogV0UwX04gKi8KKwlbUkNBUl9HUF9QSU4oMSwgMjQpXSA9IHsgUFUyLCAgNSB9LAkvKiBSRF9XUl9OICovCisJW1JDQVJfR1BfUElOKDEsIDIzKV0gPSB7IFBVMiwgIDQgfSwJLyogUkRfTiAqLworCVtSQ0FSX0dQX1BJTigxLCAyMildID0geyBQVTIsICAzIH0sCS8qIEJTX04gKi8KKwlbUkNBUl9HUF9QSU4oMSwgMjEpXSA9IHsgUFUyLCAgMiB9LAkvKiBDUzFfTl9BMjYgKi8KKwlbUkNBUl9HUF9QSU4oMSwgMjApXSA9IHsgUFUyLCAgMSB9LAkvKiBDUzBfTiAqLworCisJW1JDQVJfR1BfUElOKDQsICA5KV0gPSB7IFBVMywgMzEgfSwJLyogU0QzX0RBVDAgKi8KKwlbUkNBUl9HUF9QSU4oNCwgIDgpXSA9IHsgUFUzLCAzMCB9LAkvKiBTRDNfQ01EICovCisJW1JDQVJfR1BfUElOKDQsICA3KV0gPSB7IFBVMywgMjkgfSwJLyogU0QzX0NMSyAqLworCVtSQ0FSX0dQX1BJTig0LCAgNildID0geyBQVTMsIDI4IH0sCS8qIFNEMl9EUyAqLworCVtSQ0FSX0dQX1BJTig0LCAgNSldID0geyBQVTMsIDI3IH0sCS8qIFNEMl9EQVQzICovCisJW1JDQVJfR1BfUElOKDQsICA0KV0gPSB7IFBVMywgMjYgfSwJLyogU0QyX0RBVDIgKi8KKwlbUkNBUl9HUF9QSU4oNCwgIDMpXSA9IHsgUFUzLCAyNSB9LAkvKiBTRDJfREFUMSAqLworCVtSQ0FSX0dQX1BJTig0LCAgMildID0geyBQVTMsIDI0IH0sCS8qIFNEMl9EQVQwICovCisJW1JDQVJfR1BfUElOKDQsICAxKV0gPSB7IFBVMywgMjMgfSwJLyogU0QyX0NNRCAqLworCVtSQ0FSX0dQX1BJTig0LCAgMCldID0geyBQVTMsIDIyIH0sCS8qIFNEMl9DTEsgKi8KKwlbUkNBUl9HUF9QSU4oMywgMTEpXSA9IHsgUFUzLCAyMSB9LAkvKiBTRDFfREFUMyAqLworCVtSQ0FSX0dQX1BJTigzLCAxMCldID0geyBQVTMsIDIwIH0sCS8qIFNEMV9EQVQyICovCisJW1JDQVJfR1BfUElOKDMsICA5KV0gPSB7IFBVMywgMTkgfSwJLyogU0QxX0RBVDEgKi8KKwlbUkNBUl9HUF9QSU4oMywgIDgpXSA9IHsgUFUzLCAxOCB9LAkvKiBTRDFfREFUMCAqLworCVtSQ0FSX0dQX1BJTigzLCAgNyldID0geyBQVTMsIDE3IH0sCS8qIFNEMV9DTUQgKi8KKwlbUkNBUl9HUF9QSU4oMywgIDYpXSA9IHsgUFUzLCAxNiB9LAkvKiBTRDFfQ0xLICovCisJW1JDQVJfR1BfUElOKDMsICA1KV0gPSB7IFBVMywgMTUgfSwJLyogU0QwX0RBVDMgKi8KKwlbUkNBUl9HUF9QSU4oMywgIDQpXSA9IHsgUFUzLCAxNCB9LAkvKiBTRDBfREFUMiAqLworCVtSQ0FSX0dQX1BJTigzLCAgMyldID0geyBQVTMsIDEzIH0sCS8qIFNEMF9EQVQxICovCisJW1JDQVJfR1BfUElOKDMsICAyKV0gPSB7IFBVMywgMTIgfSwJLyogU0QwX0RBVDAgKi8KKwlbUkNBUl9HUF9QSU4oMywgIDEpXSA9IHsgUFUzLCAxMSB9LAkvKiBTRDBfQ01EICovCisJW1JDQVJfR1BfUElOKDMsICAwKV0gPSB7IFBVMywgMTAgfSwJLyogU0QwX0NMSyAqLworCisJW1JDQVJfR1BfUElOKDUsIDE5KV0gPSB7IFBVNCwgMzEgfSwJLyogTVNJT0YwX1NTMSAqLworCVtSQ0FSX0dQX1BJTig1LCAxOCldID0geyBQVTQsIDMwIH0sCS8qIE1TSU9GMF9TWU5DICovCisJW1JDQVJfR1BfUElOKDUsIDE3KV0gPSB7IFBVNCwgMjkgfSwJLyogTVNJT0YwX1NDSyAqLworCVtSQ0FSX0dQX1BJTig1LCAxNildID0geyBQVTQsIDI4IH0sCS8qIEhSVFMwX04gKi8KKwlbUkNBUl9HUF9QSU4oNSwgMTUpXSA9IHsgUFU0LCAyNyB9LAkvKiBIQ1RTMF9OICovCisJW1JDQVJfR1BfUElOKDUsIDE0KV0gPSB7IFBVNCwgMjYgfSwJLyogSFRYMCAqLworCVtSQ0FSX0dQX1BJTig1LCAxMyldID0geyBQVTQsIDI1IH0sCS8qIEhSWDAgKi8KKwlbUkNBUl9HUF9QSU4oNSwgMTIpXSA9IHsgUFU0LCAyNCB9LAkvKiBIU0NLMCAqLworCVtSQ0FSX0dQX1BJTig1LCAxMSldID0geyBQVTQsIDIzIH0sCS8qIFJYMl9BICovCisJW1JDQVJfR1BfUElOKDUsIDEwKV0gPSB7IFBVNCwgMjIgfSwJLyogVFgyX0EgKi8KKwlbUkNBUl9HUF9QSU4oNSwgIDkpXSA9IHsgUFU0LCAyMSB9LAkvKiBTQ0syICovCisJW1JDQVJfR1BfUElOKDUsICA4KV0gPSB7IFBVNCwgMjAgfSwJLyogUlRTMV9OX1RBTlMgKi8KKwlbUkNBUl9HUF9QSU4oNSwgIDcpXSA9IHsgUFU0LCAxOSB9LAkvKiBDVFMxX04gKi8KKwlbUkNBUl9HUF9QSU4oNSwgIDYpXSA9IHsgUFU0LCAxOCB9LAkvKiBUWDFfQSAqLworCVtSQ0FSX0dQX1BJTig1LCAgNSldID0geyBQVTQsIDE3IH0sCS8qIFJYMV9BICovCisJW1JDQVJfR1BfUElOKDUsICA0KV0gPSB7IFBVNCwgMTYgfSwJLyogUlRTMF9OX1RBTlMgKi8KKwlbUkNBUl9HUF9QSU4oNSwgIDMpXSA9IHsgUFU0LCAxNSB9LAkvKiBDVFMwX04gKi8KKwlbUkNBUl9HUF9QSU4oNSwgIDIpXSA9IHsgUFU0LCAxNCB9LAkvKiBUWDAgKi8KKwlbUkNBUl9HUF9QSU4oNSwgIDEpXSA9IHsgUFU0LCAxMyB9LAkvKiBSWDAgKi8KKwlbUkNBUl9HUF9QSU4oNSwgIDApXSA9IHsgUFU0LCAxMiB9LAkvKiBTQ0swICovCisJW1JDQVJfR1BfUElOKDMsIDE1KV0gPSB7IFBVNCwgMTEgfSwJLyogU0QxX1dQICovCisJW1JDQVJfR1BfUElOKDMsIDE0KV0gPSB7IFBVNCwgMTAgfSwJLyogU0QxX0NEICovCisJW1JDQVJfR1BfUElOKDMsIDEzKV0gPSB7IFBVNCwgIDkgfSwJLyogU0QwX1dQICovCisJW1JDQVJfR1BfUElOKDMsIDEyKV0gPSB7IFBVNCwgIDggfSwJLyogU0QwX0NEICovCisJW1JDQVJfR1BfUElOKDQsIDE3KV0gPSB7IFBVNCwgIDcgfSwJLyogU0QzX0RTICovCisJW1JDQVJfR1BfUElOKDQsIDE2KV0gPSB7IFBVNCwgIDYgfSwJLyogU0QzX0RBVDcgKi8KKwlbUkNBUl9HUF9QSU4oNCwgMTUpXSA9IHsgUFU0LCAgNSB9LAkvKiBTRDNfREFUNiAqLworCVtSQ0FSX0dQX1BJTig0LCAxNCldID0geyBQVTQsICA0IH0sCS8qIFNEM19EQVQ1ICovCisJW1JDQVJfR1BfUElOKDQsIDEzKV0gPSB7IFBVNCwgIDMgfSwJLyogU0QzX0RBVDQgKi8KKwlbUkNBUl9HUF9QSU4oNCwgMTIpXSA9IHsgUFU0LCAgMiB9LAkvKiBTRDNfREFUMyAqLworCVtSQ0FSX0dQX1BJTig0LCAxMSldID0geyBQVTQsICAxIH0sCS8qIFNEM19EQVQyICovCisJW1JDQVJfR1BfUElOKDQsIDEwKV0gPSB7IFBVNCwgIDAgfSwJLyogU0QzX0RBVDEgKi8KKworCVtSQ0FSX0dQX1BJTig2LCAyNCldID0geyBQVTUsIDMxIH0sCS8qIFVTQjBfUFdFTiAqLworCVtSQ0FSX0dQX1BJTig2LCAyMyldID0geyBQVTUsIDMwIH0sCS8qIEFVRElPX0NMS0JfQiAqLworCVtSQ0FSX0dQX1BJTig2LCAyMildID0geyBQVTUsIDI5IH0sCS8qIEFVRElPX0NMS0FfQSAqLworCVtSQ0FSX0dQX1BJTig2LCAyMSldID0geyBQVTUsIDI4IH0sCS8qIFNTSV9TREFUQTlfQSAqLworCVtSQ0FSX0dQX1BJTig2LCAyMCldID0geyBQVTUsIDI3IH0sCS8qIFNTSV9TREFUQTggKi8KKwlbUkNBUl9HUF9QSU4oNiwgMTkpXSA9IHsgUFU1LCAyNiB9LAkvKiBTU0lfU0RBVEE3ICovCisJW1JDQVJfR1BfUElOKDYsIDE4KV0gPSB7IFBVNSwgMjUgfSwJLyogU1NJX1dTNzggKi8KKwlbUkNBUl9HUF9QSU4oNiwgMTcpXSA9IHsgUFU1LCAyNCB9LAkvKiBTU0lfU0NLNzggKi8KKwlbUkNBUl9HUF9QSU4oNiwgMTYpXSA9IHsgUFU1LCAyMyB9LAkvKiBTU0lfU0RBVEE2ICovCisJW1JDQVJfR1BfUElOKDYsIDE1KV0gPSB7IFBVNSwgMjIgfSwJLyogU1NJX1dTNiAqLworCVtSQ0FSX0dQX1BJTig2LCAxNCldID0geyBQVTUsIDIxIH0sCS8qIFNTSV9TQ0s2ICovCisJW1JDQVJfR1BfUElOKDYsIDEzKV0gPSB7IFBVNSwgMjAgfSwJLyogU1NJX1NEQVRBNSAqLworCVtSQ0FSX0dQX1BJTig2LCAxMildID0geyBQVTUsIDE5IH0sCS8qIFNTSV9XUzUgKi8KKwlbUkNBUl9HUF9QSU4oNiwgMTEpXSA9IHsgUFU1LCAxOCB9LAkvKiBTU0lfU0NLNSAqLworCVtSQ0FSX0dQX1BJTig2LCAxMCldID0geyBQVTUsIDE3IH0sCS8qIFNTSV9TREFUQTQgKi8KKwlbUkNBUl9HUF9QSU4oNiwgIDkpXSA9IHsgUFU1LCAxNiB9LAkvKiBTU0lfV1M0ICovCisJW1JDQVJfR1BfUElOKDYsICA4KV0gPSB7IFBVNSwgMTUgfSwJLyogU1NJX1NDSzQgKi8KKwlbUkNBUl9HUF9QSU4oNiwgIDcpXSA9IHsgUFU1LCAxNCB9LAkvKiBTU0lfU0RBVEEzICovCisJW1JDQVJfR1BfUElOKDYsICA2KV0gPSB7IFBVNSwgMTMgfSwJLyogU1NJX1dTMzQgKi8KKwlbUkNBUl9HUF9QSU4oNiwgIDUpXSA9IHsgUFU1LCAxMiB9LAkvKiBTU0lfU0NLMzQgKi8KKwlbUkNBUl9HUF9QSU4oNiwgIDQpXSA9IHsgUFU1LCAxMSB9LAkvKiBTU0lfU0RBVEEyX0EgKi8KKwlbUkNBUl9HUF9QSU4oNiwgIDMpXSA9IHsgUFU1LCAxMCB9LAkvKiBTU0lfU0RBVEExX0EgKi8KKwlbUkNBUl9HUF9QSU4oNiwgIDIpXSA9IHsgUFU1LCAgOSB9LAkvKiBTU0lfU0RBVEEwICovCisJW1JDQVJfR1BfUElOKDYsICAxKV0gPSB7IFBVNSwgIDggfSwJLyogU1NJX1dTMDEyMzkgKi8KKwlbUkNBUl9HUF9QSU4oNiwgIDApXSA9IHsgUFU1LCAgNyB9LAkvKiBTU0lfU0NLMDEyMzkgKi8KKwlbUkNBUl9HUF9QSU4oNSwgMjUpXSA9IHsgUFU1LCAgNSB9LAkvKiBNTEJfREFUICovCisJW1JDQVJfR1BfUElOKDUsIDI0KV0gPSB7IFBVNSwgIDQgfSwJLyogTUxCX1NJRyAqLworCVtSQ0FSX0dQX1BJTig1LCAyMyldID0geyBQVTUsICAzIH0sCS8qIE1MQl9DTEsgKi8KKwlbUkNBUl9HUF9QSU4oNSwgMjIpXSA9IHsgUFU1LCAgMiB9LAkvKiBNU0lPRjBfUlhEICovCisJW1JDQVJfR1BfUElOKDUsIDIxKV0gPSB7IFBVNSwgIDEgfSwJLyogTVNJT0YwX1NTMiAqLworCVtSQ0FSX0dQX1BJTig1LCAyMCldID0geyBQVTUsICAwIH0sCS8qIE1TSU9GMF9UWEQgKi8KKworCVtSQ0FSX0dQX1BJTig2LCAzMSldID0geyBQVTYsICA2IH0sCS8qIFVTQjMxX09WQyAqLworCVtSQ0FSX0dQX1BJTig2LCAzMCldID0geyBQVTYsICA1IH0sCS8qIFVTQjMxX1BXRU4gKi8KKwlbUkNBUl9HUF9QSU4oNiwgMjkpXSA9IHsgUFU2LCAgNCB9LAkvKiBVU0IzMF9PVkMgKi8KKwlbUkNBUl9HUF9QSU4oNiwgMjgpXSA9IHsgUFU2LCAgMyB9LAkvKiBVU0IzMF9QV0VOICovCisJW1JDQVJfR1BfUElOKDYsIDI3KV0gPSB7IFBVNiwgIDIgfSwJLyogVVNCMV9PVkMgKi8KKwlbUkNBUl9HUF9QSU4oNiwgMjYpXSA9IHsgUFU2LCAgMSB9LAkvKiBVU0IxX1BXRU4gKi8KKwlbUkNBUl9HUF9QSU4oNiwgMjUpXSA9IHsgUFU2LCAgMCB9LAkvKiBVU0IwX09WQyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGludCByOGE3Nzk1X3Bpbm11eF9nZXRfYmlhcyhzdHJ1Y3Qgc2hfcGZjICpwZmMsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgcGluKQoreworCXUzMiByZWc7CisJdTMyIGJpdDsKKworCWlmIChXQVJOX09OX09OQ0UoIXB1bGx1cHNbcGluXS5yZWcpKQorCQlyZXR1cm4gUElOX0NPTkZJR19CSUFTX0RJU0FCTEU7CisKKwlyZWcgPSBwdWxsdXBzW3Bpbl0ucmVnOworCWJpdCA9IEJJVChwdWxsdXBzW3Bpbl0uYml0KTsKKworCWlmIChzaF9wZmNfcmVhZF9yZWcocGZjLCBQVUVOICsgcmVnLCAzMikgJiBiaXQpIHsKKwkJaWYgKHNoX3BmY19yZWFkX3JlZyhwZmMsIFBVRCArIHJlZywgMzIpICYgYml0KQorCQkJcmV0dXJuIFBJTl9DT05GSUdfQklBU19QVUxMX1VQOworCQllbHNlCisJCQlyZXR1cm4gUElOX0NPTkZJR19CSUFTX1BVTExfRE9XTjsKKwl9IGVsc2UKKwkJcmV0dXJuIFBJTl9DT05GSUdfQklBU19ESVNBQkxFOworfQorCitzdGF0aWMgdm9pZCByOGE3Nzk1X3Bpbm11eF9zZXRfYmlhcyhzdHJ1Y3Qgc2hfcGZjICpwZmMsIHVuc2lnbmVkIGludCBwaW4sCisJCQkJICAgdW5zaWduZWQgaW50IGJpYXMpCit7CisJdTMyIGVuYWJsZSwgdXBkb3duOworCXUzMiByZWc7CisJdTMyIGJpdDsKKworCWlmIChXQVJOX09OX09OQ0UoIXB1bGx1cHNbcGluXS5yZWcpKQorCQlyZXR1cm47CisKKwlyZWcgPSBwdWxsdXBzW3Bpbl0ucmVnOworCWJpdCA9IEJJVChwdWxsdXBzW3Bpbl0uYml0KTsKKworCWVuYWJsZSA9IHNoX3BmY19yZWFkX3JlZyhwZmMsIFBVRU4gKyByZWcsIDMyKSAmIH5iaXQ7CisJaWYgKGJpYXMgIT0gUElOX0NPTkZJR19CSUFTX0RJU0FCTEUpCisJCWVuYWJsZSB8PSBiaXQ7CisKKwl1cGRvd24gPSBzaF9wZmNfcmVhZF9yZWcocGZjLCBQVUQgKyByZWcsIDMyKSAmIH5iaXQ7CisJaWYgKGJpYXMgPT0gUElOX0NPTkZJR19CSUFTX1BVTExfVVApCisJCXVwZG93biB8PSBiaXQ7CisKKwlzaF9wZmNfd3JpdGVfcmVnKHBmYywgUFVEICsgcmVnLCAzMiwgdXBkb3duKTsKKwlzaF9wZmNfd3JpdGVfcmVnKHBmYywgUFVFTiArIHJlZywgMzIsIGVuYWJsZSk7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfcGZjX3NvY19vcGVyYXRpb25zIHI4YTc3OTVfcGlubXV4X29wcyA9IHsKIAkucGluX3RvX3BvY2N0cmwgPSByOGE3Nzk1X3Bpbl90b19wb2NjdHJsLAorCS5nZXRfYmlhcyA9IHI4YTc3OTVfcGlubXV4X2dldF9iaWFzLAorCS5zZXRfYmlhcyA9IHI4YTc3OTVfcGlubXV4X3NldF9iaWFzLAogfTsKIAogY29uc3Qgc3RydWN0IHNoX3BmY19zb2NfaW5mbyByOGE3Nzk1X3Bpbm11eF9pbmZvID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9wZmMtcjhhNzc5Ni5jIGIvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9wZmMtcjhhNzc5Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjOWI2NzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BmYy1yOGE3Nzk2LmMKQEAgLTAsMCArMSwyNjcxIEBACisvKgorICogUjhBNzc5NiBwcm9jZXNzb3Igc3VwcG9ydCAtIFBGQyBoYXJkd2FyZSBibG9jay4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgUmVuZXNhcyBFbGVjdHJvbmljcyBDb3JwLgorICoKKyAqIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0aGUgZHJpdmVycy9waW5jdHJsL3NoLXBmYy9wZmMtcjhhNzc5NS5jCisgKgorICogUi1DYXIgR2VuMyBwcm9jZXNzb3Igc3VwcG9ydCAtIFBGQyBoYXJkd2FyZSBibG9jay4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgIFJlbmVzYXMgRWxlY3Ryb25pY3MgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAic2hfcGZjLmgiCisKKyNkZWZpbmUgQ1BVX0FMTF9QT1JUKGZuLCBzZngpCQkJCQkJXAorCVBPUlRfR1BfMTYoMCwgZm4sIHNmeCksCQkJCQkJXAorCVBPUlRfR1BfMjkoMSwgZm4sIHNmeCksCQkJCQkJXAorCVBPUlRfR1BfMTUoMiwgZm4sIHNmeCksCQkJCQkJXAorCVBPUlRfR1BfQ0ZHXzEyKDMsIGZuLCBzZngsIFNIX1BGQ19QSU5fQ0ZHX0lPX1ZPTFRBR0UpLAkJXAorCVBPUlRfR1BfMSgzLCAxMiwgZm4sIHNmeCksCQkJCQlcCisJUE9SVF9HUF8xKDMsIDEzLCBmbiwgc2Z4KSwJCQkJCVwKKwlQT1JUX0dQXzEoMywgMTQsIGZuLCBzZngpLAkJCQkJXAorCVBPUlRfR1BfMSgzLCAxNSwgZm4sIHNmeCksCQkJCQlcCisJUE9SVF9HUF9DRkdfMTgoNCwgZm4sIHNmeCwgU0hfUEZDX1BJTl9DRkdfSU9fVk9MVEFHRSksCQlcCisJUE9SVF9HUF8yNig1LCBmbiwgc2Z4KSwJCQkJCQlcCisJUE9SVF9HUF8zMig2LCBmbiwgc2Z4KSwJCQkJCQlcCisJUE9SVF9HUF80KDcsIGZuLCBzZngpCisvKgorICogRl8oKSA6IGp1c3QgaW5mb3JtYXRpb24KKyAqIEZNKCkgOiBtYWNybyBmb3IgRk5feHh4IC8geHh4X01BUksKKyAqLworCisvKiBHUFNSMCAqLworI2RlZmluZSBHUFNSMF8xNQlGXyhEMTUsCQkJSVA3XzExXzgpCisjZGVmaW5lIEdQU1IwXzE0CUZfKEQxNCwJCQlJUDdfN180KQorI2RlZmluZSBHUFNSMF8xMwlGXyhEMTMsCQkJSVA3XzNfMCkKKyNkZWZpbmUgR1BTUjBfMTIJRl8oRDEyLAkJCUlQNl8zMV8yOCkKKyNkZWZpbmUgR1BTUjBfMTEJRl8oRDExLAkJCUlQNl8yN18yNCkKKyNkZWZpbmUgR1BTUjBfMTAJRl8oRDEwLAkJCUlQNl8yM18yMCkKKyNkZWZpbmUgR1BTUjBfOQkJRl8oRDksCQkJSVA2XzE5XzE2KQorI2RlZmluZSBHUFNSMF84CQlGXyhEOCwJCQlJUDZfMTVfMTIpCisjZGVmaW5lIEdQU1IwXzcJCUZfKEQ3LAkJCUlQNl8xMV84KQorI2RlZmluZSBHUFNSMF82CQlGXyhENiwJCQlJUDZfN180KQorI2RlZmluZSBHUFNSMF81CQlGXyhENSwJCQlJUDZfM18wKQorI2RlZmluZSBHUFNSMF80CQlGXyhENCwJCQlJUDVfMzFfMjgpCisjZGVmaW5lIEdQU1IwXzMJCUZfKEQzLAkJCUlQNV8yN18yNCkKKyNkZWZpbmUgR1BTUjBfMgkJRl8oRDIsCQkJSVA1XzIzXzIwKQorI2RlZmluZSBHUFNSMF8xCQlGXyhEMSwJCQlJUDVfMTlfMTYpCisjZGVmaW5lIEdQU1IwXzAJCUZfKEQwLAkJCUlQNV8xNV8xMikKKworLyogR1BTUjEgKi8KKyNkZWZpbmUgR1BTUjFfMjgJRk0oQ0xLT1VUKQorI2RlZmluZSBHUFNSMV8yNwlGXyhFWF9XQUlUMF9BLAkJSVA1XzExXzgpCisjZGVmaW5lIEdQU1IxXzI2CUZfKFdFMV9OLAkJSVA1XzdfNCkKKyNkZWZpbmUgR1BTUjFfMjUJRl8oV0UwX04sCQlJUDVfM18wKQorI2RlZmluZSBHUFNSMV8yNAlGXyhSRF9XUl9OLAkJSVA0XzMxXzI4KQorI2RlZmluZSBHUFNSMV8yMwlGXyhSRF9OLAkJSVA0XzI3XzI0KQorI2RlZmluZSBHUFNSMV8yMglGXyhCU19OLAkJSVA0XzIzXzIwKQorI2RlZmluZSBHUFNSMV8yMQlGXyhDUzFfTl9BMjYsCQlJUDRfMTlfMTYpCisjZGVmaW5lIEdQU1IxXzIwCUZfKENTMF9OLAkJSVA0XzE1XzEyKQorI2RlZmluZSBHUFNSMV8xOQlGXyhBMTksCQkJSVA0XzExXzgpCisjZGVmaW5lIEdQU1IxXzE4CUZfKEExOCwJCQlJUDRfN180KQorI2RlZmluZSBHUFNSMV8xNwlGXyhBMTcsCQkJSVA0XzNfMCkKKyNkZWZpbmUgR1BTUjFfMTYJRl8oQTE2LAkJCUlQM18zMV8yOCkKKyNkZWZpbmUgR1BTUjFfMTUJRl8oQTE1LAkJCUlQM18yN18yNCkKKyNkZWZpbmUgR1BTUjFfMTQJRl8oQTE0LAkJCUlQM18yM18yMCkKKyNkZWZpbmUgR1BTUjFfMTMJRl8oQTEzLAkJCUlQM18xOV8xNikKKyNkZWZpbmUgR1BTUjFfMTIJRl8oQTEyLAkJCUlQM18xNV8xMikKKyNkZWZpbmUgR1BTUjFfMTEJRl8oQTExLAkJCUlQM18xMV84KQorI2RlZmluZSBHUFNSMV8xMAlGXyhBMTAsCQkJSVAzXzdfNCkKKyNkZWZpbmUgR1BTUjFfOQkJRl8oQTksCQkJSVAzXzNfMCkKKyNkZWZpbmUgR1BTUjFfOAkJRl8oQTgsCQkJSVAyXzMxXzI4KQorI2RlZmluZSBHUFNSMV83CQlGXyhBNywJCQlJUDJfMjdfMjQpCisjZGVmaW5lIEdQU1IxXzYJCUZfKEE2LAkJCUlQMl8yM18yMCkKKyNkZWZpbmUgR1BTUjFfNQkJRl8oQTUsCQkJSVAyXzE5XzE2KQorI2RlZmluZSBHUFNSMV80CQlGXyhBNCwJCQlJUDJfMTVfMTIpCisjZGVmaW5lIEdQU1IxXzMJCUZfKEEzLAkJCUlQMl8xMV84KQorI2RlZmluZSBHUFNSMV8yCQlGXyhBMiwJCQlJUDJfN180KQorI2RlZmluZSBHUFNSMV8xCQlGXyhBMSwJCQlJUDJfM18wKQorI2RlZmluZSBHUFNSMV8wCQlGXyhBMCwJCQlJUDFfMzFfMjgpCisKKy8qIEdQU1IyICovCisjZGVmaW5lIEdQU1IyXzE0CUZfKEFWQl9BVlRQX0NBUFRVUkVfQSwJSVAwXzIzXzIwKQorI2RlZmluZSBHUFNSMl8xMwlGXyhBVkJfQVZUUF9NQVRDSF9BLAlJUDBfMTlfMTYpCisjZGVmaW5lIEdQU1IyXzEyCUZfKEFWQl9MSU5LLAkJSVAwXzE1XzEyKQorI2RlZmluZSBHUFNSMl8xMQlGXyhBVkJfUEhZX0lOVCwJCUlQMF8xMV84KQorI2RlZmluZSBHUFNSMl8xMAlGXyhBVkJfTUFHSUMsCQlJUDBfN180KQorI2RlZmluZSBHUFNSMl85CQlGXyhBVkJfTURDLAkJSVAwXzNfMCkKKyNkZWZpbmUgR1BTUjJfOAkJRl8oUFdNMl9BLAkJSVAxXzI3XzI0KQorI2RlZmluZSBHUFNSMl83CQlGXyhQV00xX0EsCQlJUDFfMjNfMjApCisjZGVmaW5lIEdQU1IyXzYJCUZfKFBXTTAsCQlJUDFfMTlfMTYpCisjZGVmaW5lIEdQU1IyXzUJCUZfKElSUTUsCQlJUDFfMTVfMTIpCisjZGVmaW5lIEdQU1IyXzQJCUZfKElSUTQsCQlJUDFfMTFfOCkKKyNkZWZpbmUgR1BTUjJfMwkJRl8oSVJRMywJCUlQMV83XzQpCisjZGVmaW5lIEdQU1IyXzIJCUZfKElSUTIsCQlJUDFfM18wKQorI2RlZmluZSBHUFNSMl8xCQlGXyhJUlExLAkJSVAwXzMxXzI4KQorI2RlZmluZSBHUFNSMl8wCQlGXyhJUlEwLAkJSVAwXzI3XzI0KQorCisvKiBHUFNSMyAqLworI2RlZmluZSBHUFNSM18xNQlGXyhTRDFfV1AsCQlJUDExXzIzXzIwKQorI2RlZmluZSBHUFNSM18xNAlGXyhTRDFfQ0QsCQlJUDExXzE5XzE2KQorI2RlZmluZSBHUFNSM18xMwlGXyhTRDBfV1AsCQlJUDExXzE1XzEyKQorI2RlZmluZSBHUFNSM18xMglGXyhTRDBfQ0QsCQlJUDExXzExXzgpCisjZGVmaW5lIEdQU1IzXzExCUZfKFNEMV9EQVQzLAkJSVA4XzMxXzI4KQorI2RlZmluZSBHUFNSM18xMAlGXyhTRDFfREFUMiwJCUlQOF8yN18yNCkKKyNkZWZpbmUgR1BTUjNfOQkJRl8oU0QxX0RBVDEsCQlJUDhfMjNfMjApCisjZGVmaW5lIEdQU1IzXzgJCUZfKFNEMV9EQVQwLAkJSVA4XzE5XzE2KQorI2RlZmluZSBHUFNSM183CQlGXyhTRDFfQ01ELAkJSVA4XzE1XzEyKQorI2RlZmluZSBHUFNSM182CQlGXyhTRDFfQ0xLLAkJSVA4XzExXzgpCisjZGVmaW5lIEdQU1IzXzUJCUZfKFNEMF9EQVQzLAkJSVA4XzdfNCkKKyNkZWZpbmUgR1BTUjNfNAkJRl8oU0QwX0RBVDIsCQlJUDhfM18wKQorI2RlZmluZSBHUFNSM18zCQlGXyhTRDBfREFUMSwJCUlQN18zMV8yOCkKKyNkZWZpbmUgR1BTUjNfMgkJRl8oU0QwX0RBVDAsCQlJUDdfMjdfMjQpCisjZGVmaW5lIEdQU1IzXzEJCUZfKFNEMF9DTUQsCQlJUDdfMjNfMjApCisjZGVmaW5lIEdQU1IzXzAJCUZfKFNEMF9DTEssCQlJUDdfMTlfMTYpCisKKy8qIEdQU1I0ICovCisjZGVmaW5lIEdQU1I0XzE3CUZfKFNEM19EUywJCUlQMTFfMTFfOCkKKyNkZWZpbmUgR1BTUjRfMTYJRl8oU0QzX0RBVDcsCQlJUDEwXzdfNCkKKyNkZWZpbmUgR1BTUjRfMTUJRl8oU0QzX0RBVDYsCQlJUDEwXzNfMCkKKyNkZWZpbmUgR1BTUjRfMTQJRl8oU0QzX0RBVDUsCQlJUDlfMzFfMjgpCisjZGVmaW5lIEdQU1I0XzEzCUZfKFNEM19EQVQ0LAkJSVA5XzI3XzI0KQorI2RlZmluZSBHUFNSNF8xMglGXyhTRDNfREFUMywJCUlQMTBfMTlfMTYpCisjZGVmaW5lIEdQU1I0XzExCUZfKFNEM19EQVQyLAkJSVAxMF8xNV8xMikKKyNkZWZpbmUgR1BTUjRfMTAJRl8oU0QzX0RBVDEsCQlJUDEwXzExXzgpCisjZGVmaW5lIEdQU1I0XzkJCUZfKFNEM19EQVQwLAkJSVAxMF83XzQpCisjZGVmaW5lIEdQU1I0XzgJCUZfKFNEM19DTUQsCQlJUDEwXzNfMCkKKyNkZWZpbmUgR1BTUjRfNwkJRl8oU0QzX0NMSywJCUlQOV8zMV8yOCkKKyNkZWZpbmUgR1BTUjRfNgkJRl8oU0QyX0RTLAkJSVA5XzIzXzIwKQorI2RlZmluZSBHUFNSNF81CQlGXyhTRDJfREFUMywJCUlQOV8xOV8xNikKKyNkZWZpbmUgR1BTUjRfNAkJRl8oU0QyX0RBVDIsCQlJUDlfMTVfMTIpCisjZGVmaW5lIEdQU1I0XzMJCUZfKFNEMl9EQVQxLAkJSVA5XzExXzgpCisjZGVmaW5lIEdQU1I0XzIJCUZfKFNEMl9EQVQwLAkJSVA5XzdfNCkKKyNkZWZpbmUgR1BTUjRfMQkJRl8oU0QyX0NNRCwJCUlQOV83XzQpCisjZGVmaW5lIEdQU1I0XzAJCUZfKFNEMl9DTEssCQlJUDlfM18wKQorCisvKiBHUFNSNSAqLworI2RlZmluZSBHUFNSNV8yNQlGXyhNTEJfREFULAkJSVAxNF8xOV8xNikKKyNkZWZpbmUgR1BTUjVfMjQJRl8oTUxCX1NJRywJCUlQMTRfMTVfMTIpCisjZGVmaW5lIEdQU1I1XzIzCUZfKE1MQl9DTEssCQlJUDE0XzExXzgpCisjZGVmaW5lIEdQU1I1XzIyCUZNKE1TSU9GMF9SWEQpCisjZGVmaW5lIEdQU1I1XzIxCUZfKE1TSU9GMF9TUzIsCQlJUDE0XzdfNCkKKyNkZWZpbmUgR1BTUjVfMjAJRk0oTVNJT0YwX1RYRCkKKyNkZWZpbmUgR1BTUjVfMTkJRl8oTVNJT0YwX1NTMSwJCUlQMTRfM18wKQorI2RlZmluZSBHUFNSNV8xOAlGXyhNU0lPRjBfU1lOQywJCUlQMTNfMzFfMjgpCisjZGVmaW5lIEdQU1I1XzE3CUZNKE1TSU9GMF9TQ0spCisjZGVmaW5lIEdQU1I1XzE2CUZfKEhSVFMwX04sCQlJUDEzXzI3XzI0KQorI2RlZmluZSBHUFNSNV8xNQlGXyhIQ1RTMF9OLAkJSVAxM18yM18yMCkKKyNkZWZpbmUgR1BTUjVfMTQJRl8oSFRYMCwJCUlQMTNfMTlfMTYpCisjZGVmaW5lIEdQU1I1XzEzCUZfKEhSWDAsCQlJUDEzXzE1XzEyKQorI2RlZmluZSBHUFNSNV8xMglGXyhIU0NLMCwJCUlQMTNfMTFfOCkKKyNkZWZpbmUgR1BTUjVfMTEJRl8oUlgyX0EsCQlJUDEzXzdfNCkKKyNkZWZpbmUgR1BTUjVfMTAJRl8oVFgyX0EsCQlJUDEzXzNfMCkKKyNkZWZpbmUgR1BTUjVfOQkJRl8oU0NLMiwJCUlQMTJfMzFfMjgpCisjZGVmaW5lIEdQU1I1XzgJCUZfKFJUUzFfTl9UQU5TLAkJSVAxMl8yN18yNCkKKyNkZWZpbmUgR1BTUjVfNwkJRl8oQ1RTMV9OLAkJSVAxMl8yM18yMCkKKyNkZWZpbmUgR1BTUjVfNgkJRl8oVFgxX0EsCQlJUDEyXzE5XzE2KQorI2RlZmluZSBHUFNSNV81CQlGXyhSWDFfQSwJCUlQMTJfMTVfMTIpCisjZGVmaW5lIEdQU1I1XzQJCUZfKFJUUzBfTl9UQU5TLAkJSVAxMl8xMV84KQorI2RlZmluZSBHUFNSNV8zCQlGXyhDVFMwX04sCQlJUDEyXzdfNCkKKyNkZWZpbmUgR1BTUjVfMgkJRl8oVFgwLAkJCUlQMTJfM18wKQorI2RlZmluZSBHUFNSNV8xCQlGXyhSWDAsCQkJSVAxMV8zMV8yOCkKKyNkZWZpbmUgR1BTUjVfMAkJRl8oU0NLMCwJCUlQMTFfMjdfMjQpCisKKy8qIEdQU1I2ICovCisjZGVmaW5lIEdQU1I2XzMxCUZfKEdQNl8zMSwJCUlQMThfN180KQorI2RlZmluZSBHUFNSNl8zMAlGXyhHUDZfMzAsCQlJUDE4XzNfMCkKKyNkZWZpbmUgR1BTUjZfMjkJRl8oVVNCMzBfT1ZDLAkJSVAxN18zMV8yOCkKKyNkZWZpbmUgR1BTUjZfMjgJRl8oVVNCMzBfUFdFTiwJCUlQMTdfMjdfMjQpCisjZGVmaW5lIEdQU1I2XzI3CUZfKFVTQjFfT1ZDLAkJSVAxN18yM18yMCkKKyNkZWZpbmUgR1BTUjZfMjYJRl8oVVNCMV9QV0VOLAkJSVAxN18xOV8xNikKKyNkZWZpbmUgR1BTUjZfMjUJRl8oVVNCMF9PVkMsCQlJUDE3XzE1XzEyKQorI2RlZmluZSBHUFNSNl8yNAlGXyhVU0IwX1BXRU4sCQlJUDE3XzExXzgpCisjZGVmaW5lIEdQU1I2XzIzCUZfKEFVRElPX0NMS0JfQiwJSVAxN183XzQpCisjZGVmaW5lIEdQU1I2XzIyCUZfKEFVRElPX0NMS0FfQSwJSVAxN18zXzApCisjZGVmaW5lIEdQU1I2XzIxCUZfKFNTSV9TREFUQTlfQSwJSVAxNl8zMV8yOCkKKyNkZWZpbmUgR1BTUjZfMjAJRl8oU1NJX1NEQVRBOCwJCUlQMTZfMjdfMjQpCisjZGVmaW5lIEdQU1I2XzE5CUZfKFNTSV9TREFUQTcsCQlJUDE2XzIzXzIwKQorI2RlZmluZSBHUFNSNl8xOAlGXyhTU0lfV1M3OCwJCUlQMTZfMTlfMTYpCisjZGVmaW5lIEdQU1I2XzE3CUZfKFNTSV9TQ0s3OCwJCUlQMTZfMTVfMTIpCisjZGVmaW5lIEdQU1I2XzE2CUZfKFNTSV9TREFUQTYsCQlJUDE2XzExXzgpCisjZGVmaW5lIEdQU1I2XzE1CUZfKFNTSV9XUzYsCQlJUDE2XzdfNCkKKyNkZWZpbmUgR1BTUjZfMTQJRl8oU1NJX1NDSzYsCQlJUDE2XzNfMCkKKyNkZWZpbmUgR1BTUjZfMTMJRk0oU1NJX1NEQVRBNSkKKyNkZWZpbmUgR1BTUjZfMTIJRk0oU1NJX1dTNSkKKyNkZWZpbmUgR1BTUjZfMTEJRk0oU1NJX1NDSzUpCisjZGVmaW5lIEdQU1I2XzEwCUZfKFNTSV9TREFUQTQsCQlJUDE1XzMxXzI4KQorI2RlZmluZSBHUFNSNl85CQlGXyhTU0lfV1M0LAkJSVAxNV8yN18yNCkKKyNkZWZpbmUgR1BTUjZfOAkJRl8oU1NJX1NDSzQsCQlJUDE1XzIzXzIwKQorI2RlZmluZSBHUFNSNl83CQlGXyhTU0lfU0RBVEEzLAkJSVAxNV8xOV8xNikKKyNkZWZpbmUgR1BTUjZfNgkJRl8oU1NJX1dTMzQsCQlJUDE1XzE1XzEyKQorI2RlZmluZSBHUFNSNl81CQlGXyhTU0lfU0NLMzQsCQlJUDE1XzExXzgpCisjZGVmaW5lIEdQU1I2XzQJCUZfKFNTSV9TREFUQTJfQSwJSVAxNV83XzQpCisjZGVmaW5lIEdQU1I2XzMJCUZfKFNTSV9TREFUQTFfQSwJSVAxNV8zXzApCisjZGVmaW5lIEdQU1I2XzIJCUZfKFNTSV9TREFUQTAsCQlJUDE0XzMxXzI4KQorI2RlZmluZSBHUFNSNl8xCQlGXyhTU0lfV1MwMTI5LAkJSVAxNF8yN18yNCkKKyNkZWZpbmUgR1BTUjZfMAkJRl8oU1NJX1NDSzAxMjksCQlJUDE0XzIzXzIwKQorCisvKiBHUFNSNyAqLworI2RlZmluZSBHUFNSN18zCQlGTShHUDdfMDMpCisjZGVmaW5lIEdQU1I3XzIJCUZNKEhETUkwX0NFQykKKyNkZWZpbmUgR1BTUjdfMQkJRk0oQVZTMikKKyNkZWZpbmUgR1BTUjdfMAkJRk0oQVZTMSkKKworCisvKiBJUFNSeCAqLwkJLyogMCAqLwkJCS8qIDEgKi8JCS8qIDIgKi8JCQkvKiAzICovCQkJCS8qIDQgKi8JCS8qIDUgKi8JCS8qIDYgKi8JCQkvKiA3ICovCQkvKiA4ICovCQkJLyogOSAqLwkJLyogQSAqLwkJLyogQiAqLwkJLyogQyAtIEYgKi8KKyNkZWZpbmUgSVAwXzNfMAkJRk0oQVZCX01EQykJCUZfKDAsIDApCUZNKE1TSU9GMl9TUzJfQykJRl8oMCwgMCkJCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMF83XzQJCUZNKEFWQl9NQUdJQykJCUZfKDAsIDApCUZNKE1TSU9GMl9TUzFfQykJRk0oU0NLNF9BKQkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAwXzExXzgJRk0oQVZCX1BIWV9JTlQpCQlGXygwLCAwKQlGTShNU0lPRjJfU1lOQ19DKQlGTShSWDRfQSkJCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMF8xNV8xMglGTShBVkJfTElOSykJCUZfKDAsIDApCUZNKE1TSU9GMl9TQ0tfQykJRk0oVFg0X0EpCQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDBfMTlfMTYJRk0oQVZCX0FWVFBfTUFUQ0hfQSkJRl8oMCwgMCkJRk0oTVNJT0YyX1JYRF9DKQlGTShDVFM0X05fQSkJCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMF8yM18yMAlGTShBVkJfQVZUUF9DQVBUVVJFX0EpCUZfKDAsIDApCUZNKE1TSU9GMl9UWERfQykJRk0oUlRTNF9OX1RBTlNfQSkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAwXzI3XzI0CUZNKElSUTApCQlGTShRUE9MQikJRl8oMCwgMCkJCUZNKERVX0NERSkJCQlGTShWSTRfREFUQTBfQikgRk0oQ0FOMF9UWF9CKQlGTShDQU5GRDBfVFhfQikJCUZNKE1TSU9GM19TUzFfRSkgRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMF8zMV8yOAlGTShJUlExKQkJRk0oUVBPTEEpCUZfKDAsIDApCQlGTShEVV9ESVNQKQkJCUZNKFZJNF9EQVRBMV9CKSBGTShDQU4wX1JYX0IpCUZNKENBTkZEMF9SWF9CKQkJRk0oTVNJT0YzX1NTMl9FKSBGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxXzNfMAkJRk0oSVJRMikJCUZNKFFDUFZfUURFKQlGXygwLCAwKQkJRk0oRFVfRVhPRERGX0RVX09EREZfRElTUF9DREUpCUZNKFZJNF9EQVRBMl9CKSBGXygwLCAwKQlGXygwLCAwKQkJRk0oTVNJT0YzX1NZTkNfRSkgRl8oMCwgMCkJCUZNKFBXTTNfQikJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxXzdfNAkJRk0oSVJRMykJCUZNKFFTVFZCX1FWRSkJRk0oQTI1KQkJCUZNKERVX0RPVENMS09VVDEpCQlGTShWSTRfREFUQTNfQikgRl8oMCwgMCkJRl8oMCwgMCkJCUZNKE1TSU9GM19TQ0tfRSkgRl8oMCwgMCkJCUZNKFBXTTRfQikJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxXzExXzgJRk0oSVJRNCkJCUZNKFFTVEhfUUhTKQlGTShBMjQpCQkJRk0oRFVfRVhIU1lOQ19EVV9IU1lOQykJCUZNKFZJNF9EQVRBNF9CKSBGXygwLCAwKQlGXygwLCAwKQkJRk0oTVNJT0YzX1JYRF9FKSBGXygwLCAwKQkJRk0oUFdNNV9CKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDFfMTVfMTIJRk0oSVJRNSkJCUZNKFFTVEJfUUhFKQlGTShBMjMpCQkJRk0oRFVfRVhWU1lOQ19EVV9WU1lOQykJCUZNKFZJNF9EQVRBNV9CKSBGXygwLCAwKQlGXygwLCAwKQkJRk0oTVNJT0YzX1RYRF9FKSBGXygwLCAwKQkJRk0oUFdNNl9CKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDFfMTlfMTYJRk0oUFdNMCkJCUZNKEFWQl9BVlRQX1BQUylGTShBMjIpCQkJRl8oMCwgMCkJCQlGTShWSTRfREFUQTZfQikJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGTShJRUNMS19CKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDFfMjNfMjAJRk0oUFdNMV9BKQkJRl8oMCwgMCkJRk0oQTIxKQkJCUZNKEhSWDNfRCkJCQlGTShWSTRfREFUQTdfQikJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGTShJRVJYX0IpCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMV8yN18yNAlGTShQV00yX0EpCQlGXygwLCAwKQlGTShBMjApCQkJRk0oSFRYM19EKQkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRk0oSUVUWF9CKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDFfMzFfMjgJRk0oQTApCQkJRk0oTENET1VUMTYpCUZNKE1TSU9GM19TWU5DX0IpCUZfKDAsIDApCQkJRk0oVkk0X0RBVEE4KQlGXygwLCAwKQlGTShEVV9EQjApCQlGXygwLCAwKQlGXygwLCAwKQkJRk0oUFdNM19BKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDJfM18wCQlGTShBMSkJCQlGTShMQ0RPVVQxNykJRk0oTVNJT0YzX1RYRF9CKQlGXygwLCAwKQkJCUZNKFZJNF9EQVRBOSkJRl8oMCwgMCkJRk0oRFVfREIxKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZNKFBXTTRfQSkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAyXzdfNAkJRk0oQTIpCQkJRk0oTENET1VUMTgpCUZNKE1TSU9GM19TQ0tfQikJRl8oMCwgMCkJCQlGTShWSTRfREFUQTEwKQlGXygwLCAwKQlGTShEVV9EQjIpCQlGXygwLCAwKQlGXygwLCAwKQkJRk0oUFdNNV9BKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDJfMTFfOAlGTShBMykJCQlGTShMQ0RPVVQxOSkJRk0oTVNJT0YzX1JYRF9CKQlGXygwLCAwKQkJCUZNKFZJNF9EQVRBMTEpCUZfKDAsIDApCUZNKERVX0RCMykJCUZfKDAsIDApCUZfKDAsIDApCQlGTShQV002X0EpCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMl8xNV8xMglGTShBNCkJCQlGTShMQ0RPVVQyMCkJRk0oTVNJT0YzX1NTMV9CKQlGXygwLCAwKQkJCUZNKFZJNF9EQVRBMTIpCUZNKFZJNV9EQVRBMTIpCUZNKERVX0RCNCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDJfMTlfMTYJRk0oQTUpCQkJRk0oTENET1VUMjEpCUZNKE1TSU9GM19TUzJfQikJRk0oU0NLNF9CKQkJCUZNKFZJNF9EQVRBMTMpCUZNKFZJNV9EQVRBMTMpCUZNKERVX0RCNSkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDJfMjNfMjAJRk0oQTYpCQkJRk0oTENET1VUMjIpCUZNKE1TSU9GMl9TUzFfQSkJRk0oUlg0X0IpCQkJRk0oVkk0X0RBVEExNCkJRk0oVkk1X0RBVEExNCkJRk0oRFVfREI2KQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMl8yN18yNAlGTShBNykJCQlGTShMQ0RPVVQyMykJRk0oTVNJT0YyX1NTMl9BKQlGTShUWDRfQikJCQlGTShWSTRfREFUQTE1KQlGTShWSTVfREFUQTE1KQlGTShEVV9EQjcpCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAyXzMxXzI4CUZNKEE4KQkJCUZNKFJYM19CKQlGTShNU0lPRjJfU1lOQ19BKQlGTShIUlg0X0IpCQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJCUZNKFNEQTZfQSkJRk0oQVZCX0FWVFBfTUFUQ0hfQikJRk0oUFdNMV9CKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDNfM18wCQlGTShBOSkJCQlGXygwLCAwKQlGTShNU0lPRjJfU0NLX0EpCUZNKENUUzRfTl9CKQkJCUZfKDAsIDApCUZNKFZJNV9WU1lOQ19OKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQM183XzQJCUZNKEExMCkJCQlGXygwLCAwKQlGTShNU0lPRjJfUlhEX0EpCUZNKFJUUzRfTl9UQU5TX0IpCQlGXygwLCAwKQlGTShWSTVfSFNZTkNfTikJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDNfMTFfOAlGTShBMTEpCQkJRk0oVFgzX0IpCUZNKE1TSU9GMl9UWERfQSkJRk0oSFRYNF9CKQkJCUZNKEhTQ0s0KQlGTShWSTVfRklFTEQpCUZfKDAsIDApCQlGTShTQ0w2X0EpCUZNKEFWQl9BVlRQX0NBUFRVUkVfQikJRk0oUFdNMl9CKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorCisvKiBJUFNSeCAqLwkJLyogMCAqLwkJCS8qIDEgKi8JCS8qIDIgKi8JCQkvKiAzICovCQkJCS8qIDQgKi8JCS8qIDUgKi8JCS8qIDYgKi8JCQkvKiA3ICovCQkvKiA4ICovCQkJLyogOSAqLwkJLyogQSAqLwkJLyogQiAqLwkJLyogQyAtIEYgKi8KKyNkZWZpbmUgSVAzXzE1XzEyCUZNKEExMikJCQlGTShMQ0RPVVQxMikJRk0oTVNJT0YzX1NDS19DKQlGXygwLCAwKQkJCUZNKEhSWDRfQSkJRk0oVkk1X0RBVEE4KQlGTShEVV9ERzQpCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAzXzE5XzE2CUZNKEExMykJCQlGTShMQ0RPVVQxMykJRk0oTVNJT0YzX1NZTkNfQykJRl8oMCwgMCkJCQlGTShIVFg0X0EpCUZNKFZJNV9EQVRBOSkJRk0oRFVfREc1KQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQM18yM18yMAlGTShBMTQpCQkJRk0oTENET1VUMTQpCUZNKE1TSU9GM19SWERfQykJRl8oMCwgMCkJCQlGTShIQ1RTNF9OKQlGTShWSTVfREFUQTEwKQlGTShEVV9ERzYpCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAzXzI3XzI0CUZNKEExNSkJCQlGTShMQ0RPVVQxNSkJRk0oTVNJT0YzX1RYRF9DKQlGXygwLCAwKQkJCUZNKEhSVFM0X04pCUZNKFZJNV9EQVRBMTEpCUZNKERVX0RHNykJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDNfMzFfMjgJRk0oQTE2KQkJCUZNKExDRE9VVDgpCUZfKDAsIDApCQlGXygwLCAwKQkJCUZNKFZJNF9GSUVMRCkJRl8oMCwgMCkJRk0oRFVfREcwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQNF8zXzAJCUZNKEExNykJCQlGTShMQ0RPVVQ5KQlGXygwLCAwKQkJRl8oMCwgMCkJCQlGTShWSTRfVlNZTkNfTikJRl8oMCwgMCkJRk0oRFVfREcxKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQNF83XzQJCUZNKEExOCkJCQlGTShMQ0RPVVQxMCkJRl8oMCwgMCkJCUZfKDAsIDApCQkJRk0oVkk0X0hTWU5DX04pCUZfKDAsIDApCUZNKERVX0RHMikJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDRfMTFfOAlGTShBMTkpCQkJRk0oTENET1VUMTEpCUZfKDAsIDApCQlGXygwLCAwKQkJCUZNKFZJNF9DTEtFTkIpCUZfKDAsIDApCUZNKERVX0RHMykJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDRfMTVfMTIJRk0oQ1MwX04pCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJCQlGXygwLCAwKQlGTShWSTVfQ0xLRU5CKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQNF8xOV8xNglGTShDUzFfTl9BMjYpCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJCQlGXygwLCAwKQlGTShWSTVfQ0xLKQlGXygwLCAwKQkJRk0oRVhfV0FJVDBfQikJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQNF8yM18yMAlGTShCU19OKQkJRk0oUVNUVkFfUVZTKQlGTShNU0lPRjNfU0NLX0QpCUZNKFNDSzMpCQkJRk0oSFNDSzMpCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGTShDQU4xX1RYKQkJRk0oQ0FORkQxX1RYKQlGTShJRVRYX0EpCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQNF8yN18yNAlGTShSRF9OKQkJRl8oMCwgMCkJRk0oTVNJT0YzX1NZTkNfRCkJRk0oUlgzX0EpCQkJRk0oSFJYM19BKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRk0oQ0FOMF9UWF9BKQkJRk0oQ0FORkQwX1RYX0EpCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQNF8zMV8yOAlGTShSRF9XUl9OKQkJRl8oMCwgMCkJRk0oTVNJT0YzX1JYRF9EKQlGTShUWDNfQSkJCQlGTShIVFgzX0EpCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGTShDQU4wX1JYX0EpCQlGTShDQU5GRDBfUlhfQSkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA1XzNfMAkJRk0oV0UwX04pCQlGXygwLCAwKQlGTShNU0lPRjNfVFhEX0QpCUZNKENUUzNfTikJCQlGTShIQ1RTM19OKQlGXygwLCAwKQlGXygwLCAwKQkJRk0oU0NMNl9CKQlGTShDQU5fQ0xLKQkJRl8oMCwgMCkJRk0oSUVDTEtfQSkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA1XzdfNAkJRk0oV0UxX04pCQlGXygwLCAwKQlGTShNU0lPRjNfU1MxX0QpCUZNKFJUUzNfTl9UQU5TKQkJCUZNKEhSVFMzX04pCUZfKDAsIDApCUZfKDAsIDApCQlGTShTREE2X0IpCUZNKENBTjFfUlgpCQlGTShDQU5GRDFfUlgpCUZNKElFUlhfQSkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA1XzExXzgJRk0oRVhfV0FJVDBfQSkJCUZNKFFDTEspCUZfKDAsIDApCQlGXygwLCAwKQkJCUZNKFZJNF9DTEspCUZfKDAsIDApCUZNKERVX0RPVENMS09VVDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDVfMTVfMTIJRk0oRDApCQkJRk0oTVNJT0YyX1NTMV9CKUZNKE1TSU9GM19TQ0tfQSkJRl8oMCwgMCkJCQlGTShWSTRfREFUQTE2KQlGTShWSTVfREFUQTApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA1XzE5XzE2CUZNKEQxKQkJCUZNKE1TSU9GMl9TUzJfQilGTShNU0lPRjNfU1lOQ19BKQlGXygwLCAwKQkJCUZNKFZJNF9EQVRBMTcpCUZNKFZJNV9EQVRBMSkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDVfMjNfMjAJRk0oRDIpCQkJRl8oMCwgMCkJRk0oTVNJT0YzX1JYRF9BKQlGXygwLCAwKQkJCUZNKFZJNF9EQVRBMTgpCUZNKFZJNV9EQVRBMikJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDVfMjdfMjQJRk0oRDMpCQkJRl8oMCwgMCkJRk0oTVNJT0YzX1RYRF9BKQlGXygwLCAwKQkJCUZNKFZJNF9EQVRBMTkpCUZNKFZJNV9EQVRBMykJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDVfMzFfMjgJRk0oRDQpCQkJRk0oTVNJT0YyX1NDS19CKUZfKDAsIDApCQlGXygwLCAwKQkJCUZNKFZJNF9EQVRBMjApCUZNKFZJNV9EQVRBNCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDZfM18wCQlGTShENSkJCQlGTShNU0lPRjJfU1lOQ19CKUZfKDAsIDApCQlGXygwLCAwKQkJCUZNKFZJNF9EQVRBMjEpCUZNKFZJNV9EQVRBNSkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDZfN180CQlGTShENikJCQlGTShNU0lPRjJfUlhEX0IpRl8oMCwgMCkJCUZfKDAsIDApCQkJRk0oVkk0X0RBVEEyMikJRk0oVkk1X0RBVEE2KQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQNl8xMV84CUZNKEQ3KQkJCUZNKE1TSU9GMl9UWERfQilGXygwLCAwKQkJRl8oMCwgMCkJCQlGTShWSTRfREFUQTIzKQlGTShWSTVfREFUQTcpCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA2XzE1XzEyCUZNKEQ4KQkJCUZNKExDRE9VVDApCUZNKE1TSU9GMl9TQ0tfRCkJRk0oU0NLNF9DKQkJCUZNKFZJNF9EQVRBMF9BKQlGXygwLCAwKQlGTShEVV9EUjApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA2XzE5XzE2CUZNKEQ5KQkJCUZNKExDRE9VVDEpCUZNKE1TSU9GMl9TWU5DX0QpCUZfKDAsIDApCQkJRk0oVkk0X0RBVEExX0EpCUZfKDAsIDApCUZNKERVX0RSMSkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDZfMjNfMjAJRk0oRDEwKQkJCUZNKExDRE9VVDIpCUZNKE1TSU9GMl9SWERfRCkJRk0oSFJYM19CKQkJCUZNKFZJNF9EQVRBMl9BKQlGTShDVFM0X05fQykJRk0oRFVfRFIyKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQNl8yN18yNAlGTShEMTEpCQkJRk0oTENET1VUMykJRk0oTVNJT0YyX1RYRF9EKQlGTShIVFgzX0IpCQkJRk0oVkk0X0RBVEEzX0EpCUZNKFJUUzRfTl9UQU5TX0MpRk0oRFVfRFIzKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQNl8zMV8yOAlGTShEMTIpCQkJRk0oTENET1VUNCkJRk0oTVNJT0YyX1NTMV9EKQlGTShSWDRfQykJCQlGTShWSTRfREFUQTRfQSkJRl8oMCwgMCkJRk0oRFVfRFI0KQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisKKy8qIElQU1J4ICovCQkvKiAwICovCQkJLyogMSAqLwkJLyogMiAqLwkJCS8qIDMgKi8JCQkJLyogNCAqLwkJLyogNSAqLwkJLyogNiAqLwkJCS8qIDcgKi8JCS8qIDggKi8JCQkvKiA5ICovCQkvKiBBICovCQkvKiBCICovCQkvKiBDIC0gRiAqLworI2RlZmluZSBJUDdfM18wCQlGTShEMTMpCQkJRk0oTENET1VUNSkJRk0oTVNJT0YyX1NTMl9EKQlGTShUWDRfQykJCQlGTShWSTRfREFUQTVfQSkJRl8oMCwgMCkJRk0oRFVfRFI1KQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQN183XzQJCUZNKEQxNCkJCQlGTShMQ0RPVVQ2KQlGTShNU0lPRjNfU1MxX0EpCUZNKEhSWDNfQykJCQlGTShWSTRfREFUQTZfQSkJRl8oMCwgMCkJRk0oRFVfRFI2KQkJRk0oU0NMNl9DKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA3XzExXzgJRk0oRDE1KQkJCUZNKExDRE9VVDcpCUZNKE1TSU9GM19TUzJfQSkJRk0oSFRYM19DKQkJCUZNKFZJNF9EQVRBN19BKQlGXygwLCAwKQlGTShEVV9EUjcpCQlGTShTREE2X0MpCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDdfMTVfMTIJRk0oRlNDTEtTVCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA3XzE5XzE2CUZNKFNEMF9DTEspCQlGXygwLCAwKQlGTShNU0lPRjFfU0NLX0UpCUZfKDAsIDApCQkJRl8oMCwgMCkJRl8oMCwgMCkJRk0oU1RQX09QV01fMF9CKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA3XzIzXzIwCUZNKFNEMF9DTUQpCQlGXygwLCAwKQlGTShNU0lPRjFfU1lOQ19FKQlGXygwLCAwKQkJCUZfKDAsIDApCUZfKDAsIDApCUZNKFNUUF9JVkNYTzI3XzBfQikJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQN18yN18yNAlGTShTRDBfREFUMCkJCUZfKDAsIDApCUZNKE1TSU9GMV9SWERfRSkJRl8oMCwgMCkJCQlGXygwLCAwKQlGTShUU19TQ0swX0IpCUZNKFNUUF9JU0NMS18wX0IpCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDdfMzFfMjgJRk0oU0QwX0RBVDEpCQlGXygwLCAwKQlGTShNU0lPRjFfVFhEX0UpCUZfKDAsIDApCQkJRl8oMCwgMCkJRk0oVFNfU1BTWU5DMF9CKUZNKFNUUF9JU1NZTkNfMF9CKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA4XzNfMAkJRk0oU0QwX0RBVDIpCQlGXygwLCAwKQlGTShNU0lPRjFfU1MxX0UpCUZfKDAsIDApCQkJRl8oMCwgMCkJRk0oVFNfU0RBVDBfQikJRk0oU1RQX0lTRF8wX0IpCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA4XzdfNAkJRk0oU0QwX0RBVDMpCQlGXygwLCAwKQlGTShNU0lPRjFfU1MyX0UpCUZfKDAsIDApCQkJRl8oMCwgMCkJRk0oVFNfU0RFTjBfQikJRk0oU1RQX0lTRU5fMF9CKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA4XzExXzgJRk0oU0QxX0NMSykJCUZfKDAsIDApCUZNKE1TSU9GMV9TQ0tfRykJRl8oMCwgMCkJCQlGXygwLCAwKQlGTShTSU0wX0NMS19BKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQOF8xNV8xMglGTShTRDFfQ01EKQkJRl8oMCwgMCkJRk0oTVNJT0YxX1NZTkNfRykJRk0oTkZDRV9OX0IpCQkJRl8oMCwgMCkJRk0oU0lNMF9EX0EpCUZNKFNUUF9JVkNYTzI3XzFfQikJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQOF8xOV8xNglGTShTRDFfREFUMCkJCUZNKFNEMl9EQVQ0KQlGTShNU0lPRjFfUlhEX0cpCUZNKE5GV1BfTl9CKQkJCUZfKDAsIDApCUZNKFRTX1NDSzFfQikJRk0oU1RQX0lTQ0xLXzFfQikJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQOF8yM18yMAlGTShTRDFfREFUMSkJCUZNKFNEMl9EQVQ1KQlGTShNU0lPRjFfVFhEX0cpCUZNKE5GREFUQTE0X0IpCQkJRl8oMCwgMCkJRk0oVFNfU1BTWU5DMV9CKUZNKFNUUF9JU1NZTkNfMV9CKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVA4XzI3XzI0CUZNKFNEMV9EQVQyKQkJRk0oU0QyX0RBVDYpCUZNKE1TSU9GMV9TUzFfRykJRk0oTkZEQVRBMTVfQikJCQlGXygwLCAwKQlGTShUU19TREFUMV9CKQlGTShTVFBfSVNEXzFfQikJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDhfMzFfMjgJRk0oU0QxX0RBVDMpCQlGTShTRDJfREFUNykJRk0oTVNJT0YxX1NTMl9HKQlGTShORlJCX05fQikJCQlGXygwLCAwKQlGTShUU19TREVOMV9CKQlGTShTVFBfSVNFTl8xX0IpCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDlfM18wCQlGTShTRDJfQ0xLKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZNKE5GREFUQTgpCQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDlfN180CQlGTShTRDJfQ01EKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZNKE5GREFUQTkpCQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDlfMTFfOAlGTShTRDJfREFUMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGTShORkRBVEExMCkJCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQOV8xNV8xMglGTShTRDJfREFUMSkJCUZfKDAsIDApCUZfKDAsIDApCQlGTShORkRBVEExMSkJCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQOV8xOV8xNglGTShTRDJfREFUMikJCUZfKDAsIDApCUZfKDAsIDApCQlGTShORkRBVEExMikJCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQOV8yM18yMAlGTShTRDJfREFUMykJCUZfKDAsIDApCUZfKDAsIDApCQlGTShORkRBVEExMykJCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQOV8yN18yNAlGTShTRDJfRFMpCQlGXygwLCAwKQlGXygwLCAwKQkJRk0oTkZBTEUpCQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZNKFNBVEFfREVWU0xQX0IpCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQOV8zMV8yOAlGTShTRDNfQ0xLKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZNKE5GV0VfTikJCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTBfM18wCUZNKFNEM19DTUQpCQlGXygwLCAwKQlGXygwLCAwKQkJRk0oTkZSRV9OKQkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxMF83XzQJRk0oU0QzX0RBVDApCQlGXygwLCAwKQlGXygwLCAwKQkJRk0oTkZEQVRBMCkJCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTBfMTFfOAlGTShTRDNfREFUMSkJCUZfKDAsIDApCUZfKDAsIDApCQlGTShORkRBVEExKQkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxMF8xNV8xMglGTShTRDNfREFUMikJCUZfKDAsIDApCUZfKDAsIDApCQlGTShORkRBVEEyKQkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxMF8xOV8xNglGTShTRDNfREFUMykJCUZfKDAsIDApCUZfKDAsIDApCQlGTShORkRBVEEzKQkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxMF8yM18yMAlGTShTRDNfREFUNCkJCUZNKFNEMl9DRF9BKQlGXygwLCAwKQkJRk0oTkZEQVRBNCkJCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTBfMjdfMjQJRk0oU0QzX0RBVDUpCQlGTShTRDJfV1BfQSkJRl8oMCwgMCkJCUZNKE5GREFUQTUpCQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDEwXzMxXzI4CUZNKFNEM19EQVQ2KQkJRk0oU0QzX0NEKQlGXygwLCAwKQkJRk0oTkZEQVRBNikJCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTFfM18wCUZNKFNEM19EQVQ3KQkJRk0oU0QzX1dQKQlGXygwLCAwKQkJRk0oTkZEQVRBNykJCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTFfN180CUZNKFNEM19EUykJCUZfKDAsIDApCUZfKDAsIDApCQlGTShORkNMRSkJCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTFfMTFfOAlGTShTRDBfQ0QpCQlGXygwLCAwKQlGTShORkRBVEExNF9BKQkJRl8oMCwgMCkJCQlGTShTQ0wyX0IpCUZNKFNJTTBfUlNUX0EpCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKworLyogSVBTUnggKi8JCS8qIDAgKi8JCQkvKiAxICovCQkvKiAyICovCQkJLyogMyAqLwkJCQkvKiA0ICovCQkvKiA1ICovCQkvKiA2ICovCQkJLyogNyAqLwkJLyogOCAqLwkJCS8qIDkgKi8JCS8qIEEgKi8JCS8qIEIgKi8JCS8qIEMgLSBGICovCisjZGVmaW5lIElQMTFfMTVfMTIJRk0oU0QwX1dQKQkJRl8oMCwgMCkJRk0oTkZEQVRBMTVfQSkJCUZfKDAsIDApCQkJRk0oU0RBMl9CKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTFfMTlfMTYJRk0oU0QxX0NEKQkJRl8oMCwgMCkJRk0oTkZSQl9OX0EpCQlGXygwLCAwKQkJCUZfKDAsIDApCUZNKFNJTTBfQ0xLX0IpCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxMV8yM18yMAlGTShTRDFfV1ApCQlGXygwLCAwKQlGTShORkNFX05fQSkJCUZfKDAsIDApCQkJRl8oMCwgMCkJRk0oU0lNMF9EX0IpCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxMV8yN18yNAlGTShTQ0swKQkJRk0oSFNDSzFfQikJRk0oTVNJT0YxX1NTMl9CKQlGTShBVURJT19DTEtDX0IpCQlGTShTREEyX0EpCUZNKFNJTTBfUlNUX0IpCUZNKFNUUF9PUFdNXzBfQykJRk0oUklGMF9DTEtfQikJRl8oMCwgMCkJCUZNKEFESUNIUzIpCUZNKFNDSzVfQikJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxMV8zMV8yOAlGTShSWDApCQkJRk0oSFJYMV9CKQlGXygwLCAwKQkJRl8oMCwgMCkJCQlGXygwLCAwKQlGTShUU19TQ0swX0MpCUZNKFNUUF9JU0NMS18wX0MpCUZNKFJJRjBfRDBfQikJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTJfM18wCUZNKFRYMCkJCQlGTShIVFgxX0IpCUZfKDAsIDApCQlGXygwLCAwKQkJCUZfKDAsIDApCUZNKFRTX1NQU1lOQzBfQylGTShTVFBfSVNTWU5DXzBfQykJRk0oUklGMF9EMV9CKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxMl83XzQJRk0oQ1RTMF9OKQkJRk0oSENUUzFfTl9CKQlGTShNU0lPRjFfU1lOQ19CKQlGXygwLCAwKQkJCUZfKDAsIDApCUZNKFRTX1NQU1lOQzFfQylGTShTVFBfSVNTWU5DXzFfQykJRk0oUklGMV9TWU5DX0IpCUZNKEFVRElPX0NMS09VVF9DKQlGTShBRElDU19TQU1QKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDEyXzExXzgJRk0oUlRTMF9OX1RBTlMpCQlGTShIUlRTMV9OX0IpCUZNKE1TSU9GMV9TUzFfQikJRk0oQVVESU9fQ0xLQV9CKQkJRk0oU0NMMl9BKQlGXygwLCAwKQlGTShTVFBfSVZDWE8yN18xX0MpCUZNKFJJRjBfU1lOQ19CKQlGTShGU09fVE9FX0EpCQlGTShBRElDSFMxKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDEyXzE1XzEyCUZNKFJYMV9BKQkJRk0oSFJYMV9BKQlGXygwLCAwKQkJRl8oMCwgMCkJCQlGXygwLCAwKQlGTShUU19TREFUMF9DKQlGTShTVFBfSVNEXzBfQykJCUZNKFJJRjFfQ0xLX0MpCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDEyXzE5XzE2CUZNKFRYMV9BKQkJRk0oSFRYMV9BKQlGXygwLCAwKQkJRl8oMCwgMCkJCQlGXygwLCAwKQlGTShUU19TREVOMF9DKQlGTShTVFBfSVNFTl8wX0MpCUZNKFJJRjFfRDBfQykJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTJfMjNfMjAJRk0oQ1RTMV9OKQkJRk0oSENUUzFfTl9BKQlGTShNU0lPRjFfUlhEX0IpCUZfKDAsIDApCQkJRl8oMCwgMCkJRk0oVFNfU0RFTjFfQykJRk0oU1RQX0lTRU5fMV9DKQlGTShSSUYxX0QwX0IpCUZfKDAsIDApCQlGTShBRElEQVRBKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDEyXzI3XzI0CUZNKFJUUzFfTl9UQU5TKQkJRk0oSFJUUzFfTl9BKQlGTShNU0lPRjFfVFhEX0IpCUZfKDAsIDApCQkJRl8oMCwgMCkJRk0oVFNfU0RBVDFfQykJRk0oU1RQX0lTRF8xX0MpCQlGTShSSUYxX0QxX0IpCUZfKDAsIDApCQlGTShBRElDSFMwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDEyXzMxXzI4CUZNKFNDSzIpCQlGTShTQ0lGX0NMS19CKQlGTShNU0lPRjFfU0NLX0IpCUZfKDAsIDApCQkJRl8oMCwgMCkJRk0oVFNfU0NLMV9DKQlGTShTVFBfSVNDTEtfMV9DKQlGTShSSUYxX0NMS19CKQlGXygwLCAwKQkJRk0oQURJQ0xLKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDEzXzNfMAlGTShUWDJfQSkJCUZfKDAsIDApCUZfKDAsIDApCQlGTShTRDJfQ0RfQikJCQlGTShTQ0wxX0EpCUZfKDAsIDApCUZNKEZNQ0xLX0EpCQlGTShSSUYxX0QxX0MpCUZfKDAsIDApCQlGTShGU09fQ0ZFXzBfQikJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxM183XzQJRk0oUlgyX0EpCQlGXygwLCAwKQlGXygwLCAwKQkJRk0oU0QyX1dQX0IpCQkJRk0oU0RBMV9BKQlGXygwLCAwKQlGTShGTUlOX0EpCQlGTShSSUYxX1NZTkNfQykJRl8oMCwgMCkJCUZNKEZTT19DRkVfMV9CKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDEzXzExXzgJRk0oSFNDSzApCQlGXygwLCAwKQlGTShNU0lPRjFfU0NLX0QpCUZNKEFVRElPX0NMS0JfQSkJCUZNKFNTSV9TREFUQTFfQilGTShUU19TQ0swX0QpCUZNKFNUUF9JU0NMS18wX0QpCUZNKFJJRjBfQ0xLX0MpCUZfKDAsIDApCQlGXygwLCAwKQlGTShSWDVfQikJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxM18xNV8xMglGTShIUlgwKQkJRl8oMCwgMCkJRk0oTVNJT0YxX1JYRF9EKQlGXygwLCAwKQkJCUZNKFNTSV9TREFUQTJfQilGTShUU19TREVOMF9EKQlGTShTVFBfSVNFTl8wX0QpCUZNKFJJRjBfRDBfQykJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTNfMTlfMTYJRk0oSFRYMCkJCUZfKDAsIDApCUZNKE1TSU9GMV9UWERfRCkJRl8oMCwgMCkJCQlGTShTU0lfU0RBVEE5X0IpRk0oVFNfU0RBVDBfRCkJRk0oU1RQX0lTRF8wX0QpCQlGTShSSUYwX0QxX0MpCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDEzXzIzXzIwCUZNKEhDVFMwX04pCQlGTShSWDJfQikJRk0oTVNJT0YxX1NZTkNfRCkJRl8oMCwgMCkJCQlGTShTU0lfU0NLOV9BKQlGTShUU19TUFNZTkMwX0QpRk0oU1RQX0lTU1lOQ18wX0QpCUZNKFJJRjBfU1lOQ19DKQlGTShBVURJT19DTEtPVVQxX0EpCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTNfMjdfMjQJRk0oSFJUUzBfTikJCUZNKFRYMl9CKQlGTShNU0lPRjFfU1MxX0QpCUZfKDAsIDApCQkJRk0oU1NJX1dTOV9BKQlGXygwLCAwKQlGTShTVFBfSVZDWE8yN18wX0QpCUZNKEJQRkNMS19BKQlGTShBVURJT19DTEtPVVQyX0EpCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTNfMzFfMjgJRk0oTVNJT0YwX1NZTkMpCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRk0oQVVESU9fQ0xLT1VUX0EpCUZfKDAsIDApCUZNKFRYNV9CKQlGXygwLCAwKQlGXygwLCAwKSBGTShCUEZDTEtfRCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxNF8zXzAJRk0oTVNJT0YwX1NTMSkJCUZNKFJYNV9BKQlGTShORldQX05fQSkJCUZNKEFVRElPX0NMS0FfQykJCUZNKFNTSV9TQ0syX0EpCUZfKDAsIDApCUZNKFNUUF9JVkNYTzI3XzBfQykJRl8oMCwgMCkJRk0oQVVESU9fQ0xLT1VUM19BKQlGXygwLCAwKQlGTShUQ0xLMV9CKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDE0XzdfNAlGTShNU0lPRjBfU1MyKQkJRk0oVFg1X0EpCUZNKE1TSU9GMV9TUzJfRCkJRk0oQVVESU9fQ0xLQ19BKQkJRk0oU1NJX1dTMl9BKQlGXygwLCAwKQlGTShTVFBfT1BXTV8wX0QpCUZfKDAsIDApCUZNKEFVRElPX0NMS09VVF9EKQlGXygwLCAwKQlGTShTUEVFRElOX0IpCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTRfMTFfOAlGTShNTEJfQ0xLKQkJRl8oMCwgMCkJRk0oTVNJT0YxX1NDS19GKQlGXygwLCAwKQkJCUZNKFNDTDFfQikJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDE0XzE1XzEyCUZNKE1MQl9TSUcpCQlGTShSWDFfQikJRk0oTVNJT0YxX1NZTkNfRikJRl8oMCwgMCkJCQlGTShTREExX0IpCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxNF8xOV8xNglGTShNTEJfREFUKQkJRk0oVFgxX0IpCUZNKE1TSU9GMV9SWERfRikJRl8oMCwgMCkJCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTRfMjNfMjAJRk0oU1NJX1NDSzAxMjkpCQlGXygwLCAwKQlGTShNU0lPRjFfVFhEX0YpCUZfKDAsIDApCQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDE0XzI3XzI0CUZNKFNTSV9XUzAxMjkpCQlGXygwLCAwKQlGTShNU0lPRjFfU1MxX0YpCUZfKDAsIDApCQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorCisvKiBJUFNSeCAqLwkJLyogMCAqLwkJCS8qIDEgKi8JCS8qIDIgKi8JCQkvKiAzICovCQkJCS8qIDQgKi8JCS8qIDUgKi8JCS8qIDYgKi8JCQkvKiA3ICovCQkvKiA4ICovCQkJLyogOSAqLwkJLyogQSAqLwkJLyogQiAqLwkJLyogQyAtIEYgKi8KKyNkZWZpbmUgSVAxNF8zMV8yOAlGTShTU0lfU0RBVEEwKQkJRl8oMCwgMCkJRk0oTVNJT0YxX1NTMl9GKQlGXygwLCAwKQkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxNV8zXzAJRk0oU1NJX1NEQVRBMV9BKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTVfN180CUZNKFNTSV9TREFUQTJfQSkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCQkJRk0oU1NJX1NDSzFfQikJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDE1XzExXzgJRk0oU1NJX1NDSzM0KQkJRl8oMCwgMCkJRk0oTVNJT0YxX1NTMV9BKQlGXygwLCAwKQkJCUZfKDAsIDApCUZfKDAsIDApCUZNKFNUUF9PUFdNXzBfQSkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTVfMTVfMTIJRk0oU1NJX1dTMzQpCQlGTShIQ1RTMl9OX0EpCUZNKE1TSU9GMV9TUzJfQSkJRl8oMCwgMCkJCQlGXygwLCAwKQlGXygwLCAwKQlGTShTVFBfSVZDWE8yN18wX0EpCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDE1XzE5XzE2CUZNKFNTSV9TREFUQTMpCQlGTShIUlRTMl9OX0EpCUZNKE1TSU9GMV9UWERfQSkJRl8oMCwgMCkJCQlGXygwLCAwKQlGTShUU19TQ0swX0EpCUZNKFNUUF9JU0NMS18wX0EpCUZNKFJJRjBfRDFfQSkJRk0oUklGMl9EMF9BKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxNV8yM18yMAlGTShTU0lfU0NLNCkJCUZNKEhSWDJfQSkJRk0oTVNJT0YxX1NDS19BKQlGXygwLCAwKQkJCUZfKDAsIDApCUZNKFRTX1NEQVQwX0EpCUZNKFNUUF9JU0RfMF9BKQkJRk0oUklGMF9DTEtfQSkJRk0oUklGMl9DTEtfQSkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTVfMjdfMjQJRk0oU1NJX1dTNCkJCUZNKEhUWDJfQSkJRk0oTVNJT0YxX1NZTkNfQSkJRl8oMCwgMCkJCQlGXygwLCAwKQlGTShUU19TREVOMF9BKQlGTShTVFBfSVNFTl8wX0EpCUZNKFJJRjBfU1lOQ19BKQlGTShSSUYyX1NZTkNfQSkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTVfMzFfMjgJRk0oU1NJX1NEQVRBNCkJCUZNKEhTQ0syX0EpCUZNKE1TSU9GMV9SWERfQSkJRl8oMCwgMCkJCQlGXygwLCAwKQlGTShUU19TUFNZTkMwX0EpRk0oU1RQX0lTU1lOQ18wX0EpCUZNKFJJRjBfRDBfQSkJRk0oUklGMl9EMV9BKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxNl8zXzAJRk0oU1NJX1NDSzYpCQlGXygwLCAwKQlGXygwLCAwKQkJRk0oU0lNMF9SU1RfRCkJCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTZfN180CUZNKFNTSV9XUzYpCQlGXygwLCAwKQlGXygwLCAwKQkJRk0oU0lNMF9EX0QpCQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDE2XzExXzgJRk0oU1NJX1NEQVRBNikJCUZfKDAsIDApCUZfKDAsIDApCQlGTShTSU0wX0NMS19EKQkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxNl8xNV8xMglGTShTU0lfU0NLNzgpCQlGTShIUlgyX0IpCUZNKE1TSU9GMV9TQ0tfQykJRl8oMCwgMCkJCQlGXygwLCAwKQlGTShUU19TQ0sxX0EpCUZNKFNUUF9JU0NMS18xX0EpCUZNKFJJRjFfQ0xLX0EpCUZNKFJJRjNfQ0xLX0EpCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDE2XzE5XzE2CUZNKFNTSV9XUzc4KQkJRk0oSFRYMl9CKQlGTShNU0lPRjFfU1lOQ19DKQlGXygwLCAwKQkJCUZfKDAsIDApCUZNKFRTX1NEQVQxX0EpCUZNKFNUUF9JU0RfMV9BKQkJRk0oUklGMV9TWU5DX0EpCUZNKFJJRjNfU1lOQ19BKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxNl8yM18yMAlGTShTU0lfU0RBVEE3KQkJRk0oSENUUzJfTl9CKQlGTShNU0lPRjFfUlhEX0MpCUZfKDAsIDApCQkJRl8oMCwgMCkJRk0oVFNfU0RFTjFfQSkJRk0oU1RQX0lTRU5fMV9BKQlGTShSSUYxX0QwX0EpCUZNKFJJRjNfRDBfQSkJCUZfKDAsIDApCUZNKFRDTEsyX0EpCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTZfMjdfMjQJRk0oU1NJX1NEQVRBOCkJCUZNKEhSVFMyX05fQikJRk0oTVNJT0YxX1RYRF9DKQlGXygwLCAwKQkJCUZfKDAsIDApCUZNKFRTX1NQU1lOQzFfQSlGTShTVFBfSVNTWU5DXzFfQSkJRk0oUklGMV9EMV9BKQlGTShSSUYzX0QxX0EpCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDE2XzMxXzI4CUZNKFNTSV9TREFUQTlfQSkJRk0oSFNDSzJfQikJRk0oTVNJT0YxX1NTMV9DKQlGTShIU0NLMV9BKQkJCUZNKFNTSV9XUzFfQikJRk0oU0NLMSkJRk0oU1RQX0lWQ1hPMjdfMV9BKQlGTShTQ0s1X0EpCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKQlGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDE3XzNfMAlGTShBVURJT19DTEtBX0EpCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQkJCUZfKDAsIDApCUZfKDAsIDApCUZfKDAsIDApCQlGXygwLCAwKQlGXygwLCAwKQkJRl8oMCwgMCkJRl8oMCwgMCkJRk0oQ0M1X09TQ09VVCkJRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxN183XzQJRk0oQVVESU9fQ0xLQl9CKQlGTShTQ0lGX0NMS19BKQlGXygwLCAwKQkJRl8oMCwgMCkJCQlGXygwLCAwKQlGXygwLCAwKQlGTShTVFBfSVZDWE8yN18xX0QpCUZNKFJFTU9DT05fQSkJRl8oMCwgMCkJCUZfKDAsIDApCUZNKFRDTEsxX0EpCUZfKDAsIDApCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTdfMTFfOAlGTShVU0IwX1BXRU4pCQlGXygwLCAwKQlGXygwLCAwKQkJRk0oU0lNMF9SU1RfQykJCQlGXygwLCAwKQlGTShUU19TQ0sxX0QpCUZNKFNUUF9JU0NMS18xX0QpCUZNKEJQRkNMS19CKQlGTShSSUYzX0NMS19CKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRk0oSFNDSzJfQykgRl8oMCwgMCkgRl8oMCwgMCkKKyNkZWZpbmUgSVAxN18xNV8xMglGTShVU0IwX09WQykJCUZfKDAsIDApCUZfKDAsIDApCQlGTShTSU0wX0RfQykJCQlGXygwLCAwKQlGTShUU19TREFUMV9EKQlGTShTVFBfSVNEXzFfRCkJCUZfKDAsIDApCUZNKFJJRjNfU1lOQ19CKQkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkJRl8oMCwgMCkgRk0oSFJYMl9DKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDE3XzE5XzE2CUZNKFVTQjFfUFdFTikJCUZfKDAsIDApCUZfKDAsIDApCQlGTShTSU0wX0NMS19DKQkJCUZNKFNTSV9TQ0sxX0EpCUZNKFRTX1NDSzBfRSkJRk0oU1RQX0lTQ0xLXzBfRSkJRk0oRk1DTEtfQikJRk0oUklGMl9DTEtfQikJCUZfKDAsIDApCUZNKFNQRUVESU5fQSkJRl8oMCwgMCkJRl8oMCwgMCkgRk0oSFRYMl9DKSBGXygwLCAwKSBGXygwLCAwKQorI2RlZmluZSBJUDE3XzIzXzIwCUZNKFVTQjFfT1ZDKQkJRl8oMCwgMCkJRk0oTVNJT0YxX1NTMl9DKQlGXygwLCAwKQkJCUZNKFNTSV9XUzFfQSkJRk0oVFNfU0RBVDBfRSkJRk0oU1RQX0lTRF8wX0UpCQlGTShGTUlOX0IpCUZNKFJJRjJfU1lOQ19CKQkJRl8oMCwgMCkJRk0oUkVNT0NPTl9CKQlGXygwLCAwKQlGXygwLCAwKSBGTShIQ1RTMl9OX0MpIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTdfMjdfMjQJRk0oVVNCMzBfUFdFTikJCUZfKDAsIDApCUZfKDAsIDApCQlGTShBVURJT19DTEtPVVRfQikJCUZNKFNTSV9TQ0syX0IpCUZNKFRTX1NERU4xX0QpCUZNKFNUUF9JU0VOXzFfRCkJRk0oU1RQX09QV01fMF9FKUZNKFJJRjNfRDBfQikJCUZfKDAsIDApCUZNKFRDTEsyX0IpCUZNKFRQVTBUTzApCUZNKEJQRkNMS19DKSBGTShIUlRTMl9OX0MpIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMTdfMzFfMjgJRk0oVVNCMzBfT1ZDKQkJRl8oMCwgMCkJRl8oMCwgMCkJCUZNKEFVRElPX0NMS09VVDFfQikJCUZNKFNTSV9XUzJfQikJRk0oVFNfU1BTWU5DMV9EKUZNKFNUUF9JU1NZTkNfMV9EKQlGTShTVFBfSVZDWE8yN18wX0UpRk0oUklGM19EMV9CKQlGXygwLCAwKQlGTShGU09fVE9FX0IpCUZNKFRQVTBUTzEpCUZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApIEZfKDAsIDApCisjZGVmaW5lIElQMThfM18wCUZNKEdQNl8zMCkJCUZfKDAsIDApCUZfKDAsIDApCQlGTShBVURJT19DTEtPVVQyX0IpCQlGTShTU0lfU0NLOV9CKQlGTShUU19TREVOMF9FKQlGTShTVFBfSVNFTl8wX0UpCUZfKDAsIDApCUZNKFJJRjJfRDBfQikJCUZfKDAsIDApCUZNKEZTT19DRkVfMF9BKQlGTShUUFUwVE8yKQlGXygwLCAwKSBGTShGTUNMS19DKSBGTShGTUNMS19EKSBGXygwLCAwKQorI2RlZmluZSBJUDE4XzdfNAlGTShHUDZfMzEpCQlGXygwLCAwKQlGXygwLCAwKQkJRk0oQVVESU9fQ0xLT1VUM19CKQkJRk0oU1NJX1dTOV9CKQlGTShUU19TUFNZTkMwX0UpRk0oU1RQX0lTU1lOQ18wX0UpCUZfKDAsIDApCUZNKFJJRjJfRDFfQikJCUZfKDAsIDApCUZNKEZTT19DRkVfMV9BKQlGTShUUFUwVE8zKQlGXygwLCAwKSBGTShGTUlOX0MpIEZNKEZNSU5fRCkgRl8oMCwgMCkKKworI2RlZmluZSBQSU5NVVhfR1BTUglcCitcCisJCQkJCQkJCQkJCQlHUFNSNl8zMSBcCisJCQkJCQkJCQkJCQlHUFNSNl8zMCBcCisJCQkJCQkJCQkJCQlHUFNSNl8yOSBcCisJCUdQU1IxXzI4CQkJCQkJCQkJR1BTUjZfMjggXAorCQlHUFNSMV8yNwkJCQkJCQkJCUdQU1I2XzI3IFwKKwkJR1BTUjFfMjYJCQkJCQkJCQlHUFNSNl8yNiBcCisJCUdQU1IxXzI1CQkJCQkJCUdQU1I1XzI1CUdQU1I2XzI1IFwKKwkJR1BTUjFfMjQJCQkJCQkJR1BTUjVfMjQJR1BTUjZfMjQgXAorCQlHUFNSMV8yMwkJCQkJCQlHUFNSNV8yMwlHUFNSNl8yMyBcCisJCUdQU1IxXzIyCQkJCQkJCUdQU1I1XzIyCUdQU1I2XzIyIFwKKwkJR1BTUjFfMjEJCQkJCQkJR1BTUjVfMjEJR1BTUjZfMjEgXAorCQlHUFNSMV8yMAkJCQkJCQlHUFNSNV8yMAlHUFNSNl8yMCBcCisJCUdQU1IxXzE5CQkJCQkJCUdQU1I1XzE5CUdQU1I2XzE5IFwKKwkJR1BTUjFfMTgJCQkJCQkJR1BTUjVfMTgJR1BTUjZfMTggXAorCQlHUFNSMV8xNwkJCQkJR1BTUjRfMTcJR1BTUjVfMTcJR1BTUjZfMTcgXAorCQlHUFNSMV8xNgkJCQkJR1BTUjRfMTYJR1BTUjVfMTYJR1BTUjZfMTYgXAorR1BTUjBfMTUJR1BTUjFfMTUJCQlHUFNSM18xNQlHUFNSNF8xNQlHUFNSNV8xNQlHUFNSNl8xNSBcCitHUFNSMF8xNAlHUFNSMV8xNAlHUFNSMl8xNAlHUFNSM18xNAlHUFNSNF8xNAlHUFNSNV8xNAlHUFNSNl8xNCBcCitHUFNSMF8xMwlHUFNSMV8xMwlHUFNSMl8xMwlHUFNSM18xMwlHUFNSNF8xMwlHUFNSNV8xMwlHUFNSNl8xMyBcCitHUFNSMF8xMglHUFNSMV8xMglHUFNSMl8xMglHUFNSM18xMglHUFNSNF8xMglHUFNSNV8xMglHUFNSNl8xMiBcCitHUFNSMF8xMQlHUFNSMV8xMQlHUFNSMl8xMQlHUFNSM18xMQlHUFNSNF8xMQlHUFNSNV8xMQlHUFNSNl8xMSBcCitHUFNSMF8xMAlHUFNSMV8xMAlHUFNSMl8xMAlHUFNSM18xMAlHUFNSNF8xMAlHUFNSNV8xMAlHUFNSNl8xMCBcCitHUFNSMF85CQlHUFNSMV85CQlHUFNSMl85CQlHUFNSM185CQlHUFNSNF85CQlHUFNSNV85CQlHUFNSNl85IFwKK0dQU1IwXzgJCUdQU1IxXzgJCUdQU1IyXzgJCUdQU1IzXzgJCUdQU1I0XzgJCUdQU1I1XzgJCUdQU1I2XzggXAorR1BTUjBfNwkJR1BTUjFfNwkJR1BTUjJfNwkJR1BTUjNfNwkJR1BTUjRfNwkJR1BTUjVfNwkJR1BTUjZfNyBcCitHUFNSMF82CQlHUFNSMV82CQlHUFNSMl82CQlHUFNSM182CQlHUFNSNF82CQlHUFNSNV82CQlHUFNSNl82IFwKK0dQU1IwXzUJCUdQU1IxXzUJCUdQU1IyXzUJCUdQU1IzXzUJCUdQU1I0XzUJCUdQU1I1XzUJCUdQU1I2XzUgXAorR1BTUjBfNAkJR1BTUjFfNAkJR1BTUjJfNAkJR1BTUjNfNAkJR1BTUjRfNAkJR1BTUjVfNAkJR1BTUjZfNCBcCitHUFNSMF8zCQlHUFNSMV8zCQlHUFNSMl8zCQlHUFNSM18zCQlHUFNSNF8zCQlHUFNSNV8zCQlHUFNSNl8zCQlHUFNSN18zIFwKK0dQU1IwXzIJCUdQU1IxXzIJCUdQU1IyXzIJCUdQU1IzXzIJCUdQU1I0XzIJCUdQU1I1XzIJCUdQU1I2XzIJCUdQU1I3XzIgXAorR1BTUjBfMQkJR1BTUjFfMQkJR1BTUjJfMQkJR1BTUjNfMQkJR1BTUjRfMQkJR1BTUjVfMQkJR1BTUjZfMQkJR1BTUjdfMSBcCitHUFNSMF8wCQlHUFNSMV8wCQlHUFNSMl8wCQlHUFNSM18wCQlHUFNSNF8wCQlHUFNSNV8wCQlHUFNSNl8wCQlHUFNSN18wCisKKyNkZWZpbmUgUElOTVVYX0lQU1IJCQkJXAorXAorRk0oSVAwXzNfMCkJSVAwXzNfMAkJRk0oSVAxXzNfMCkJSVAxXzNfMAkJRk0oSVAyXzNfMCkJSVAyXzNfMAkJRk0oSVAzXzNfMCkJSVAzXzNfMCBcCitGTShJUDBfN180KQlJUDBfN180CQlGTShJUDFfN180KQlJUDFfN180CQlGTShJUDJfN180KQlJUDJfN180CQlGTShJUDNfN180KQlJUDNfN180IFwKK0ZNKElQMF8xMV84KQlJUDBfMTFfOAlGTShJUDFfMTFfOCkJSVAxXzExXzgJRk0oSVAyXzExXzgpCUlQMl8xMV84CUZNKElQM18xMV84KQlJUDNfMTFfOCBcCitGTShJUDBfMTVfMTIpCUlQMF8xNV8xMglGTShJUDFfMTVfMTIpCUlQMV8xNV8xMglGTShJUDJfMTVfMTIpCUlQMl8xNV8xMglGTShJUDNfMTVfMTIpCUlQM18xNV8xMiBcCitGTShJUDBfMTlfMTYpCUlQMF8xOV8xNglGTShJUDFfMTlfMTYpCUlQMV8xOV8xNglGTShJUDJfMTlfMTYpCUlQMl8xOV8xNglGTShJUDNfMTlfMTYpCUlQM18xOV8xNiBcCitGTShJUDBfMjNfMjApCUlQMF8yM18yMAlGTShJUDFfMjNfMjApCUlQMV8yM18yMAlGTShJUDJfMjNfMjApCUlQMl8yM18yMAlGTShJUDNfMjNfMjApCUlQM18yM18yMCBcCitGTShJUDBfMjdfMjQpCUlQMF8yN18yNAlGTShJUDFfMjdfMjQpCUlQMV8yN18yNAlGTShJUDJfMjdfMjQpCUlQMl8yN18yNAlGTShJUDNfMjdfMjQpCUlQM18yN18yNCBcCitGTShJUDBfMzFfMjgpCUlQMF8zMV8yOAlGTShJUDFfMzFfMjgpCUlQMV8zMV8yOAlGTShJUDJfMzFfMjgpCUlQMl8zMV8yOAlGTShJUDNfMzFfMjgpCUlQM18zMV8yOCBcCitcCitGTShJUDRfM18wKQlJUDRfM18wCQlGTShJUDVfM18wKQlJUDVfM18wCQlGTShJUDZfM18wKQlJUDZfM18wCQlGTShJUDdfM18wKQlJUDdfM18wIFwKK0ZNKElQNF83XzQpCUlQNF83XzQJCUZNKElQNV83XzQpCUlQNV83XzQJCUZNKElQNl83XzQpCUlQNl83XzQJCUZNKElQN183XzQpCUlQN183XzQgXAorRk0oSVA0XzExXzgpCUlQNF8xMV84CUZNKElQNV8xMV84KQlJUDVfMTFfOAlGTShJUDZfMTFfOCkJSVA2XzExXzgJRk0oSVA3XzExXzgpCUlQN18xMV84IFwKK0ZNKElQNF8xNV8xMikJSVA0XzE1XzEyCUZNKElQNV8xNV8xMikJSVA1XzE1XzEyCUZNKElQNl8xNV8xMikJSVA2XzE1XzEyCUZNKElQN18xNV8xMikJSVA3XzE1XzEyIFwKK0ZNKElQNF8xOV8xNikJSVA0XzE5XzE2CUZNKElQNV8xOV8xNikJSVA1XzE5XzE2CUZNKElQNl8xOV8xNikJSVA2XzE5XzE2CUZNKElQN18xOV8xNikJSVA3XzE5XzE2IFwKK0ZNKElQNF8yM18yMCkJSVA0XzIzXzIwCUZNKElQNV8yM18yMCkJSVA1XzIzXzIwCUZNKElQNl8yM18yMCkJSVA2XzIzXzIwCUZNKElQN18yM18yMCkJSVA3XzIzXzIwIFwKK0ZNKElQNF8yN18yNCkJSVA0XzI3XzI0CUZNKElQNV8yN18yNCkJSVA1XzI3XzI0CUZNKElQNl8yN18yNCkJSVA2XzI3XzI0CUZNKElQN18yN18yNCkJSVA3XzI3XzI0IFwKK0ZNKElQNF8zMV8yOCkJSVA0XzMxXzI4CUZNKElQNV8zMV8yOCkJSVA1XzMxXzI4CUZNKElQNl8zMV8yOCkJSVA2XzMxXzI4CUZNKElQN18zMV8yOCkJSVA3XzMxXzI4IFwKK1wKK0ZNKElQOF8zXzApCUlQOF8zXzAJCUZNKElQOV8zXzApCUlQOV8zXzAJCUZNKElQMTBfM18wKQlJUDEwXzNfMAlGTShJUDExXzNfMCkJSVAxMV8zXzAgXAorRk0oSVA4XzdfNCkJSVA4XzdfNAkJRk0oSVA5XzdfNCkJSVA5XzdfNAkJRk0oSVAxMF83XzQpCUlQMTBfN180CUZNKElQMTFfN180KQlJUDExXzdfNCBcCitGTShJUDhfMTFfOCkJSVA4XzExXzgJRk0oSVA5XzExXzgpCUlQOV8xMV84CUZNKElQMTBfMTFfOCkJSVAxMF8xMV84CUZNKElQMTFfMTFfOCkJSVAxMV8xMV84IFwKK0ZNKElQOF8xNV8xMikJSVA4XzE1XzEyCUZNKElQOV8xNV8xMikJSVA5XzE1XzEyCUZNKElQMTBfMTVfMTIpCUlQMTBfMTVfMTIJRk0oSVAxMV8xNV8xMikJSVAxMV8xNV8xMiBcCitGTShJUDhfMTlfMTYpCUlQOF8xOV8xNglGTShJUDlfMTlfMTYpCUlQOV8xOV8xNglGTShJUDEwXzE5XzE2KQlJUDEwXzE5XzE2CUZNKElQMTFfMTlfMTYpCUlQMTFfMTlfMTYgXAorRk0oSVA4XzIzXzIwKQlJUDhfMjNfMjAJRk0oSVA5XzIzXzIwKQlJUDlfMjNfMjAJRk0oSVAxMF8yM18yMCkJSVAxMF8yM18yMAlGTShJUDExXzIzXzIwKQlJUDExXzIzXzIwIFwKK0ZNKElQOF8yN18yNCkJSVA4XzI3XzI0CUZNKElQOV8yN18yNCkJSVA5XzI3XzI0CUZNKElQMTBfMjdfMjQpCUlQMTBfMjdfMjQJRk0oSVAxMV8yN18yNCkJSVAxMV8yN18yNCBcCitGTShJUDhfMzFfMjgpCUlQOF8zMV8yOAlGTShJUDlfMzFfMjgpCUlQOV8zMV8yOAlGTShJUDEwXzMxXzI4KQlJUDEwXzMxXzI4CUZNKElQMTFfMzFfMjgpCUlQMTFfMzFfMjggXAorXAorRk0oSVAxMl8zXzApCUlQMTJfM18wCUZNKElQMTNfM18wKQlJUDEzXzNfMAlGTShJUDE0XzNfMCkJSVAxNF8zXzAJRk0oSVAxNV8zXzApCUlQMTVfM18wIFwKK0ZNKElQMTJfN180KQlJUDEyXzdfNAlGTShJUDEzXzdfNCkJSVAxM183XzQJRk0oSVAxNF83XzQpCUlQMTRfN180CUZNKElQMTVfN180KQlJUDE1XzdfNCBcCitGTShJUDEyXzExXzgpCUlQMTJfMTFfOAlGTShJUDEzXzExXzgpCUlQMTNfMTFfOAlGTShJUDE0XzExXzgpCUlQMTRfMTFfOAlGTShJUDE1XzExXzgpCUlQMTVfMTFfOCBcCitGTShJUDEyXzE1XzEyKQlJUDEyXzE1XzEyCUZNKElQMTNfMTVfMTIpCUlQMTNfMTVfMTIJRk0oSVAxNF8xNV8xMikJSVAxNF8xNV8xMglGTShJUDE1XzE1XzEyKQlJUDE1XzE1XzEyIFwKK0ZNKElQMTJfMTlfMTYpCUlQMTJfMTlfMTYJRk0oSVAxM18xOV8xNikJSVAxM18xOV8xNglGTShJUDE0XzE5XzE2KQlJUDE0XzE5XzE2CUZNKElQMTVfMTlfMTYpCUlQMTVfMTlfMTYgXAorRk0oSVAxMl8yM18yMCkJSVAxMl8yM18yMAlGTShJUDEzXzIzXzIwKQlJUDEzXzIzXzIwCUZNKElQMTRfMjNfMjApCUlQMTRfMjNfMjAJRk0oSVAxNV8yM18yMCkJSVAxNV8yM18yMCBcCitGTShJUDEyXzI3XzI0KQlJUDEyXzI3XzI0CUZNKElQMTNfMjdfMjQpCUlQMTNfMjdfMjQJRk0oSVAxNF8yN18yNCkJSVAxNF8yN18yNAlGTShJUDE1XzI3XzI0KQlJUDE1XzI3XzI0IFwKK0ZNKElQMTJfMzFfMjgpCUlQMTJfMzFfMjgJRk0oSVAxM18zMV8yOCkJSVAxM18zMV8yOAlGTShJUDE0XzMxXzI4KQlJUDE0XzMxXzI4CUZNKElQMTVfMzFfMjgpCUlQMTVfMzFfMjggXAorXAorRk0oSVAxNl8zXzApCUlQMTZfM18wCUZNKElQMTdfM18wKQlJUDE3XzNfMAlGTShJUDE4XzNfMCkJSVAxOF8zXzAgXAorRk0oSVAxNl83XzQpCUlQMTZfN180CUZNKElQMTdfN180KQlJUDE3XzdfNAlGTShJUDE4XzdfNCkJSVAxOF83XzQgXAorRk0oSVAxNl8xMV84KQlJUDE2XzExXzgJRk0oSVAxN18xMV84KQlJUDE3XzExXzggXAorRk0oSVAxNl8xNV8xMikJSVAxNl8xNV8xMglGTShJUDE3XzE1XzEyKQlJUDE3XzE1XzEyIFwKK0ZNKElQMTZfMTlfMTYpCUlQMTZfMTlfMTYJRk0oSVAxN18xOV8xNikJSVAxN18xOV8xNiBcCitGTShJUDE2XzIzXzIwKQlJUDE2XzIzXzIwCUZNKElQMTdfMjNfMjApCUlQMTdfMjNfMjAgXAorRk0oSVAxNl8yN18yNCkJSVAxNl8yN18yNAlGTShJUDE3XzI3XzI0KQlJUDE3XzI3XzI0IFwKK0ZNKElQMTZfMzFfMjgpCUlQMTZfMzFfMjgJRk0oSVAxN18zMV8yOCkJSVAxN18zMV8yOAorCisvKiBNT0RfU0VMMCAqLwkJCS8qIDAgKi8JCQkvKiAxICovCQkJLyogMiAqLwkJCS8qIDMgKi8JCQkvKiA0ICovCQkJLyogNSAqLwkJCS8qIDYgKi8JCQkvKiA3ICovCisjZGVmaW5lIE1PRF9TRUwwXzMxXzMwXzI5CUZNKFNFTF9NU0lPRjNfMCkJRk0oU0VMX01TSU9GM18xKQlGTShTRUxfTVNJT0YzXzIpCUZNKFNFTF9NU0lPRjNfMykJRk0oU0VMX01TSU9GM180KQlGXygwLCAwKQkJRl8oMCwgMCkJCUZfKDAsIDApCisjZGVmaW5lIE1PRF9TRUwwXzI4XzI3CQlGTShTRUxfTVNJT0YyXzApCUZNKFNFTF9NU0lPRjJfMSkJRk0oU0VMX01TSU9GMl8yKQlGTShTRUxfTVNJT0YyXzMpCisjZGVmaW5lIE1PRF9TRUwwXzI2XzI1XzI0CUZNKFNFTF9NU0lPRjFfMCkJRk0oU0VMX01TSU9GMV8xKQlGTShTRUxfTVNJT0YxXzIpCUZNKFNFTF9NU0lPRjFfMykJRk0oU0VMX01TSU9GMV80KQlGTShTRUxfTVNJT0YxXzUpCUZNKFNFTF9NU0lPRjFfNikJRl8oMCwgMCkKKyNkZWZpbmUgTU9EX1NFTDBfMjMJCUZNKFNFTF9MQlNDXzApCQlGTShTRUxfTEJTQ18xKQorI2RlZmluZSBNT0RfU0VMMF8yMgkJRk0oU0VMX0lFQlVTXzApCQlGTShTRUxfSUVCVVNfMSkKKyNkZWZpbmUgTU9EX1NFTDBfMjEJCUZNKFNFTF9JMkMyXzApCQlGTShTRUxfSTJDMl8xKQorI2RlZmluZSBNT0RfU0VMMF8yMAkJRk0oU0VMX0kyQzFfMCkJCUZNKFNFTF9JMkMxXzEpCisjZGVmaW5lIE1PRF9TRUwwXzE5CQlGTShTRUxfSFNDSUY0XzApCUZNKFNFTF9IU0NJRjRfMSkKKyNkZWZpbmUgTU9EX1NFTDBfMThfMTcJCUZNKFNFTF9IU0NJRjNfMCkJRk0oU0VMX0hTQ0lGM18xKQlGTShTRUxfSFNDSUYzXzIpCUZNKFNFTF9IU0NJRjNfMykKKyNkZWZpbmUgTU9EX1NFTDBfMTYJCUZNKFNFTF9IU0NJRjFfMCkJRk0oU0VMX0hTQ0lGMV8xKQorI2RlZmluZSBNT0RfU0VMMF8xNQkJRk0oU0VMX0ZTT18wKQkJRk0oU0VMX0ZTT18xKQorI2RlZmluZSBNT0RfU0VMMF8xNF8xMwkJRk0oU0VMX0hTQ0lGMl8wKQlGTShTRUxfSFNDSUYyXzEpCUZNKFNFTF9IU0NJRjJfMikJRl8oMCwgMCkKKyNkZWZpbmUgTU9EX1NFTDBfMTIJCUZNKFNFTF9FVEhFUkFWQl8wKQlGTShTRUxfRVRIRVJBVkJfMSkKKyNkZWZpbmUgTU9EX1NFTDBfMTEJCUZNKFNFTF9EUklGM18wKQkJRk0oU0VMX0RSSUYzXzEpCisjZGVmaW5lIE1PRF9TRUwwXzEwCQlGTShTRUxfRFJJRjJfMCkJCUZNKFNFTF9EUklGMl8xKQorI2RlZmluZSBNT0RfU0VMMF85XzgJCUZNKFNFTF9EUklGMV8wKQkJRk0oU0VMX0RSSUYxXzEpCQlGTShTRUxfRFJJRjFfMikJCUZfKDAsIDApCisjZGVmaW5lIE1PRF9TRUwwXzdfNgkJRk0oU0VMX0RSSUYwXzApCQlGTShTRUxfRFJJRjBfMSkJCUZNKFNFTF9EUklGMF8yKQkJRl8oMCwgMCkKKyNkZWZpbmUgTU9EX1NFTDBfNQkJRk0oU0VMX0NBTkZEMF8wKQlGTShTRUxfQ0FORkQwXzEpCisjZGVmaW5lIE1PRF9TRUwwXzRfMwkJRk0oU0VMX0FER19BXzApCQlGTShTRUxfQURHX0FfMSkJCUZNKFNFTF9BREdfQV8yKQkJRk0oU0VMX0FER19BXzMpCisjZGVmaW5lIE1PRF9TRUwwXzIJCUZNKFNFTF81TElORV8wKQkJRk0oU0VMXzVMSU5FXzEpCisKKy8qIE1PRF9TRUwxICovCQkJLyogMCAqLwkJCS8qIDEgKi8JCQkvKiAyICovCQkJLyogMyAqLwkJCS8qIDQgKi8JCQkvKiA1ICovCQkJLyogNiAqLwkJCS8qIDcgKi8KKyNkZWZpbmUgTU9EX1NFTDFfMzFfMzAJCUZNKFNFTF9UU0lGMV8wKQkJRk0oU0VMX1RTSUYxXzEpCQlGTShTRUxfVFNJRjFfMikJCUZNKFNFTF9UU0lGMV8zKQorI2RlZmluZSBNT0RfU0VMMV8yOV8yOF8yNwlGTShTRUxfVFNJRjBfMCkJCUZNKFNFTF9UU0lGMF8xKQkJRk0oU0VMX1RTSUYwXzIpCQlGTShTRUxfVFNJRjBfMykJCUZNKFNFTF9UU0lGMF80KQkJRl8oMCwgMCkJCUZfKDAsIDApCQlGXygwLCAwKQorI2RlZmluZSBNT0RfU0VMMV8yNgkJRk0oU0VMX1RJTUVSX1RNVV8wKQlGTShTRUxfVElNRVJfVE1VXzEpCisjZGVmaW5lIE1PRF9TRUwxXzI1XzI0CQlGTShTRUxfU1NQMV8xXzApCUZNKFNFTF9TU1AxXzFfMSkJRk0oU0VMX1NTUDFfMV8yKQlGTShTRUxfU1NQMV8xXzMpCisjZGVmaW5lIE1PRF9TRUwxXzIzXzIyXzIxCUZNKFNFTF9TU1AxXzBfMCkJRk0oU0VMX1NTUDFfMF8xKQlGTShTRUxfU1NQMV8wXzIpCUZNKFNFTF9TU1AxXzBfMykJRk0oU0VMX1NTUDFfMF80KQlGXygwLCAwKQkJRl8oMCwgMCkJCUZfKDAsIDApCisjZGVmaW5lIE1PRF9TRUwxXzIwCQlGTShTRUxfU1NJXzApCQlGTShTRUxfU1NJXzEpCisjZGVmaW5lIE1PRF9TRUwxXzE5CQlGTShTRUxfU1BFRURfUFVMU0VfMCkJRk0oU0VMX1NQRUVEX1BVTFNFXzEpCisjZGVmaW5lIE1PRF9TRUwxXzE4XzE3CQlGTShTRUxfU0lNQ0FSRF8wKQlGTShTRUxfU0lNQ0FSRF8xKQlGTShTRUxfU0lNQ0FSRF8yKQlGTShTRUxfU0lNQ0FSRF8zKQorI2RlZmluZSBNT0RfU0VMMV8xNgkJRk0oU0VMX1NESEkyXzApCQlGTShTRUxfU0RISTJfMSkKKyNkZWZpbmUgTU9EX1NFTDFfMTVfMTQJCUZNKFNFTF9TQ0lGNF8wKQkJRk0oU0VMX1NDSUY0XzEpCQlGTShTRUxfU0NJRjRfMikJCUZfKDAsIDApCisjZGVmaW5lIE1PRF9TRUwxXzEzCQlGTShTRUxfU0NJRjNfMCkJCUZNKFNFTF9TQ0lGM18xKQorI2RlZmluZSBNT0RfU0VMMV8xMgkJRk0oU0VMX1NDSUYyXzApCQlGTShTRUxfU0NJRjJfMSkKKyNkZWZpbmUgTU9EX1NFTDFfMTEJCUZNKFNFTF9TQ0lGMV8wKQkJRk0oU0VMX1NDSUYxXzEpCisjZGVmaW5lIE1PRF9TRUwxXzEwCQlGTShTRUxfU0FUQV8wKQkJRk0oU0VMX1NBVEFfMSkKKyNkZWZpbmUgTU9EX1NFTDFfOQkJRk0oU0VMX1JFTU9DT05fMCkJRk0oU0VMX1JFTU9DT05fMSkKKyNkZWZpbmUgTU9EX1NFTDFfNgkJRk0oU0VMX1JDQU4wXzApCQlGTShTRUxfUkNBTjBfMSkKKyNkZWZpbmUgTU9EX1NFTDFfNQkJRk0oU0VMX1BXTTZfMCkJCUZNKFNFTF9QV002XzEpCisjZGVmaW5lIE1PRF9TRUwxXzQJCUZNKFNFTF9QV001XzApCQlGTShTRUxfUFdNNV8xKQorI2RlZmluZSBNT0RfU0VMMV8zCQlGTShTRUxfUFdNNF8wKQkJRk0oU0VMX1BXTTRfMSkKKyNkZWZpbmUgTU9EX1NFTDFfMgkJRk0oU0VMX1BXTTNfMCkJCUZNKFNFTF9QV00zXzEpCisjZGVmaW5lIE1PRF9TRUwxXzEJCUZNKFNFTF9QV00yXzApCQlGTShTRUxfUFdNMl8xKQorI2RlZmluZSBNT0RfU0VMMV8wCQlGTShTRUxfUFdNMV8wKQkJRk0oU0VMX1BXTTFfMSkKKworLyogTU9EX1NFTDEgKi8JCQkvKiAwICovCQkJLyogMSAqLwkJCS8qIDIgKi8JCQkvKiAzICovCQkJLyogNCAqLwkJCS8qIDUgKi8JCQkvKiA2ICovCQkJLyogNyAqLworI2RlZmluZSBNT0RfU0VMMl8zMQkJRk0oSTJDX1NFTF81XzApCQlGTShJMkNfU0VMXzVfMSkKKyNkZWZpbmUgTU9EX1NFTDJfMzAJCUZNKEkyQ19TRUxfM18wKQkJRk0oSTJDX1NFTF8zXzEpCisjZGVmaW5lIE1PRF9TRUwyXzI5CQlGTShJMkNfU0VMXzBfMCkJCUZNKEkyQ19TRUxfMF8xKQorI2RlZmluZSBNT0RfU0VMMl8yOF8yNwkJRk0oU0VMX0ZNXzApCQlGTShTRUxfRk1fMSkJCUZNKFNFTF9GTV8yKQkJRk0oU0VMX0ZNXzMpCisjZGVmaW5lIE1PRF9TRUwyXzI2CQlGTShTRUxfU0NJRjVfMCkJCUZNKFNFTF9TQ0lGNV8xKQorI2RlZmluZSBNT0RfU0VMMl8yNV8yNF8yMwlGTShTRUxfSTJDNl8wKQkJRk0oU0VMX0kyQzZfMSkJCUZNKFNFTF9JMkM2XzIpCQlGXygwLCAwKQkJRl8oMCwgMCkJCUZfKDAsIDApCQlGXygwLCAwKQkJRl8oMCwgMCkKKyNkZWZpbmUgTU9EX1NFTDJfMjIJCUZNKFNFTF9OREZfMCkJCUZNKFNFTF9OREZfMSkKKyNkZWZpbmUgTU9EX1NFTDJfMjEJCUZNKFNFTF9TU0kyXzApCQlGTShTRUxfU1NJMl8xKQorI2RlZmluZSBNT0RfU0VMMl8yMAkJRk0oU0VMX1NTSTlfMCkJCUZNKFNFTF9TU0k5XzEpCisjZGVmaW5lIE1PRF9TRUwyXzE5CQlGTShTRUxfVElNRVJfVE1VMl8wKQlGTShTRUxfVElNRVJfVE1VMl8xKQorI2RlZmluZSBNT0RfU0VMMl8xOAkJRk0oU0VMX0FER19CXzApCQlGTShTRUxfQURHX0JfMSkKKyNkZWZpbmUgTU9EX1NFTDJfMTcJCUZNKFNFTF9BREdfQ18wKQkJRk0oU0VMX0FER19DXzEpCisjZGVmaW5lIE1PRF9TRUwyXzAJCUZNKFNFTF9WSU40XzApCQlGTShTRUxfVklONF8xKQorCisjZGVmaW5lIFBJTk1VWF9NT0RfU0VMUwlcCitcCitNT0RfU0VMMF8zMV8zMF8yOQlNT0RfU0VMMV8zMV8zMAkJTU9EX1NFTDJfMzEgXAorCQkJCQkJTU9EX1NFTDJfMzAgXAorCQkJTU9EX1NFTDFfMjlfMjhfMjcJTU9EX1NFTDJfMjkgXAorTU9EX1NFTDBfMjhfMjcJCQkJCU1PRF9TRUwyXzI4XzI3IFwKK01PRF9TRUwwXzI2XzI1XzI0CU1PRF9TRUwxXzI2CQlNT0RfU0VMMl8yNiBcCisJCQlNT0RfU0VMMV8yNV8yNAkJTU9EX1NFTDJfMjVfMjRfMjMgXAorTU9EX1NFTDBfMjMJCU1PRF9TRUwxXzIzXzIyXzIxIFwKK01PRF9TRUwwXzIyCQkJCQlNT0RfU0VMMl8yMiBcCitNT0RfU0VMMF8yMQkJCQkJTU9EX1NFTDJfMjEgXAorTU9EX1NFTDBfMjAJCU1PRF9TRUwxXzIwCQlNT0RfU0VMMl8yMCBcCitNT0RfU0VMMF8xOQkJTU9EX1NFTDFfMTkJCU1PRF9TRUwyXzE5IFwKK01PRF9TRUwwXzE4XzE3CQlNT0RfU0VMMV8xOF8xNwkJTU9EX1NFTDJfMTggXAorCQkJCQkJTU9EX1NFTDJfMTcgXAorTU9EX1NFTDBfMTYJCU1PRF9TRUwxXzE2IFwKK01PRF9TRUwwXzE1CQlNT0RfU0VMMV8xNV8xNCBcCitNT0RfU0VMMF8xNF8xMyBcCisJCQlNT0RfU0VMMV8xMyBcCitNT0RfU0VMMF8xMgkJTU9EX1NFTDFfMTIgXAorTU9EX1NFTDBfMTEJCU1PRF9TRUwxXzExIFwKK01PRF9TRUwwXzEwCQlNT0RfU0VMMV8xMCBcCitNT0RfU0VMMF85XzgJCU1PRF9TRUwxXzkgXAorTU9EX1NFTDBfN182IFwKKwkJCU1PRF9TRUwxXzYgXAorTU9EX1NFTDBfNQkJTU9EX1NFTDFfNSBcCitNT0RfU0VMMF80XzMJCU1PRF9TRUwxXzQgXAorCQkJTU9EX1NFTDFfMyBcCitNT0RfU0VMMF8yCQlNT0RfU0VMMV8yIFwKKwkJCU1PRF9TRUwxXzEgXAorCQkJTU9EX1NFTDFfMAkJTU9EX1NFTDJfMAorCitlbnVtIHsKKwlQSU5NVVhfUkVTRVJWRUQgPSAwLAorCisJUElOTVVYX0RBVEFfQkVHSU4sCisJR1BfQUxMKERBVEEpLAorCVBJTk1VWF9EQVRBX0VORCwKKworI2RlZmluZSBGXyh4LCB5KQorI2RlZmluZSBGTSh4KQlGTl8jI3gsCisJUElOTVVYX0ZVTkNUSU9OX0JFR0lOLAorCUdQX0FMTChGTiksCisJUElOTVVYX0dQU1IKKwlQSU5NVVhfSVBTUgorCVBJTk1VWF9NT0RfU0VMUworCVBJTk1VWF9GVU5DVElPTl9FTkQsCisjdW5kZWYgRl8KKyN1bmRlZiBGTQorCisjZGVmaW5lIEZfKHgsIHkpCisjZGVmaW5lIEZNKHgpCXgjI19NQVJLLAorCVBJTk1VWF9NQVJLX0JFR0lOLAorCVBJTk1VWF9HUFNSCisJUElOTVVYX0lQU1IKKwlQSU5NVVhfTU9EX1NFTFMKKwlQSU5NVVhfTUFSS19FTkQsCisjdW5kZWYgRl8KKyN1bmRlZiBGTQorfTsKKworc3RhdGljIGNvbnN0IHUxNiBwaW5tdXhfZGF0YVtdID0geworCVBJTk1VWF9EQVRBX0dQX0FMTCgpLAorCisJUElOTVVYX1NJTkdMRShBVlMxKSwKKwlQSU5NVVhfU0lOR0xFKEFWUzIpLAorCVBJTk1VWF9TSU5HTEUoQ0xLT1VUKSwKKwlQSU5NVVhfU0lOR0xFKEdQN18wMyksCisJUElOTVVYX1NJTkdMRShIRE1JMF9DRUMpLAorCVBJTk1VWF9TSU5HTEUoTVNJT0YwX1JYRCksCisJUElOTVVYX1NJTkdMRShNU0lPRjBfU0NLKSwKKwlQSU5NVVhfU0lOR0xFKE1TSU9GMF9UWEQpLAorCVBJTk1VWF9TSU5HTEUoU1NJX1NDSzUpLAorCVBJTk1VWF9TSU5HTEUoU1NJX1NEQVRBNSksCisJUElOTVVYX1NJTkdMRShTU0lfV1M1KSwKKworCS8qIElQU1IwICovCisJUElOTVVYX0lQU1JfR1BTUihJUDBfM18wLAlBVkJfTURDKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMF8zXzAsCU1TSU9GMl9TUzJfQywJCVNFTF9NU0lPRjJfMiksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMF83XzQsCUFWQl9NQUdJQyksCisJUElOTVVYX0lQU1JfTVNFTChJUDBfN180LAlNU0lPRjJfU1MxX0MsCQlTRUxfTVNJT0YyXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAwXzdfNCwJU0NLNF9BLAkJCVNFTF9TQ0lGNF8wKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzExXzgsCUFWQl9QSFlfSU5UKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMF8xMV84LAlNU0lPRjJfU1lOQ19DLAkJU0VMX01TSU9GMl8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMF8xMV84LAlSWDRfQSwJCQlTRUxfU0NJRjRfMCksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMF8xNV8xMiwJQVZCX0xJTkspLAorCVBJTk1VWF9JUFNSX01TRUwoSVAwXzE1XzEyLAlNU0lPRjJfU0NLX0MsCQlTRUxfTVNJT0YyXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAwXzE1XzEyLAlUWDRfQSwJCQlTRUxfU0NJRjRfMCksCisKKwlQSU5NVVhfSVBTUl9NU0VMKElQMF8xOV8xNiwJQVZCX0FWVFBfTUFUQ0hfQSwJU0VMX0VUSEVSQVZCXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAwXzE5XzE2LAlNU0lPRjJfUlhEX0MsCQlTRUxfTVNJT0YyXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAwXzE5XzE2LAlDVFM0X05fQSwJCVNFTF9TQ0lGNF8wKSwKKworCVBJTk1VWF9JUFNSX01TRUwoSVAwXzIzXzIwLAlBVkJfQVZUUF9DQVBUVVJFX0EsCVNFTF9FVEhFUkFWQl8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMF8yM18yMCwJTVNJT0YyX1RYRF9DLAkJU0VMX01TSU9GMl8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMF8yM18yMCwJUlRTNF9OX1RBTlNfQSwJCVNFTF9TQ0lGNF8wKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzI3XzI0LAlJUlEwKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMF8yN18yNCwJUVBPTEIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzI3XzI0LAlEVV9DREUpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAwXzI3XzI0LAlWSTRfREFUQTBfQiwJCVNFTF9WSU40XzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAwXzI3XzI0LAlDQU4wX1RYX0IsCQlTRUxfUkNBTjBfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDBfMjdfMjQsCUNBTkZEMF9UWF9CLAkJU0VMX0NBTkZEMF8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMF8yN18yNCwJTVNJT0YzX1NTMl9FLAkJU0VMX01TSU9GM180KSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzMxXzI4LAlJUlExKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMF8zMV8yOCwJUVBPTEEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAwXzMxXzI4LAlEVV9ESVNQKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMF8zMV8yOCwJVkk0X0RBVEExX0IsCQlTRUxfVklONF8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMF8zMV8yOCwJQ0FOMF9SWF9CLAkJU0VMX1JDQU4wXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAwXzMxXzI4LAlDQU5GRDBfUlhfQiwJCVNFTF9DQU5GRDBfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDBfMjdfMjQsCU1TSU9GM19TUzFfRSwJCVNFTF9NU0lPRjNfNCksCisKKwkvKiBJUFNSMSAqLworCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzNfMCwJSVJRMiksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfM18wLAlRQ1BWX1FERSksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfM18wLAlEVV9FWE9EREZfRFVfT0RERl9ESVNQX0NERSksCisJUElOTVVYX0lQU1JfTVNFTChJUDFfM18wLAlWSTRfREFUQTJfQiwJCVNFTF9WSU40XzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxXzNfMCwJUFdNM19CLAkJCVNFTF9QV00zXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxXzNfMCwJTVNJT0YzX1NZTkNfRSwJCVNFTF9NU0lPRjNfNCksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV83XzQsCUlSUTMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzdfNCwJUVNUVkJfUVZFKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV83XzQsCUEyNSksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfN180LAlEVV9ET1RDTEtPVVQxKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMV83XzQsCVZJNF9EQVRBM19CLAkJU0VMX1ZJTjRfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDFfN180LAlQV000X0IsCQkJU0VMX1BXTTRfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDFfN180LAlNU0lPRjNfU0NLX0UsCQlTRUxfTVNJT0YzXzQpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMTFfOCwJSVJRNCksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMTFfOCwJUVNUSF9RSFMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzExXzgsCUEyNCksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMTFfOCwJRFVfRVhIU1lOQ19EVV9IU1lOQyksCisJUElOTVVYX0lQU1JfTVNFTChJUDFfMTFfOCwJVkk0X0RBVEE0X0IsCQlTRUxfVklONF8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMV8xMV84LAlQV001X0IsCQkJU0VMX1BXTTVfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDFfMTFfOCwJTVNJT0YzX1JYRF9FLAkJU0VMX01TSU9GM180KSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzE1XzEyLAlJUlE1KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV8xNV8xMiwJUVNUQl9RSEUpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzE1XzEyLAlBMjMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzE1XzEyLAlEVV9FWFZTWU5DX0RVX1ZTWU5DKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMV8xNV8xMiwJVkk0X0RBVEE1X0IsCQlTRUxfVklONF8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMV8xNV8xMiwJUFdNNl9CLAkJCVNFTF9QV002XzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxXzE1XzEyLAlNU0lPRjNfVFhEX0UsCQlTRUxfTVNJT0YzXzQpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMTlfMTYsCVBXTTApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzE5XzE2LAlBVkJfQVZUUF9QUFMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzE5XzE2LAlBMjIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxXzE5XzE2LAlWSTRfREFUQTZfQiwJCVNFTF9WSU40XzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxXzE5XzE2LAlJRUNMS19CLAkJU0VMX0lFQlVTXzEpLAorCisJUElOTVVYX0lQU1JfTVNFTChJUDFfMjNfMjAsCVBXTTFfQSwJCQlTRUxfUFdNMV8wKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMV8yM18yMCwJQTIxKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMV8yM18yMCwJSFJYM19ELAkJCVNFTF9IU0NJRjNfMyksCisJUElOTVVYX0lQU1JfTVNFTChJUDFfMjNfMjAsCVZJNF9EQVRBN19CLAkJU0VMX1ZJTjRfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDFfMjNfMjAsCUlFUlhfQiwJCQlTRUxfSUVCVVNfMSksCisKKwlQSU5NVVhfSVBTUl9NU0VMKElQMV8yN18yNCwJUFdNMl9BLAkJCVNFTF9QV00yXzApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzI3XzI0LAlBMjApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxXzI3XzI0LAlIVFgzX0QsCQkJU0VMX0hTQ0lGM18zKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMV8yN18yNCwJSUVUWF9CLAkJCVNFTF9JRUJVU18xKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxXzMxXzI4LAlBMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMzFfMjgsCUxDRE9VVDE2KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMV8zMV8yOCwJTVNJT0YzX1NZTkNfQiwJCVNFTF9NU0lPRjNfMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMzFfMjgsCVZJNF9EQVRBOCksCisJUElOTVVYX0lQU1JfR1BTUihJUDFfMzFfMjgsCURVX0RCMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDFfMzFfMjgsCVBXTTNfQSwJCQlTRUxfUFdNM18wKSwKKworCS8qIElQU1IyICovCisJUElOTVVYX0lQU1JfR1BTUihJUDJfM18wLAlBMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfM18wLAlMQ0RPVVQxNyksCisJUElOTVVYX0lQU1JfTVNFTChJUDJfM18wLAlNU0lPRjNfVFhEX0IsCQlTRUxfTVNJT0YzXzEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzNfMCwJVkk0X0RBVEE5KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8zXzAsCURVX0RCMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDJfM18wLAlQV000X0EsCQkJU0VMX1BXTTRfMCksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl83XzQsCUEyKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl83XzQsCUxDRE9VVDE4KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMl83XzQsCU1TSU9GM19TQ0tfQiwJCVNFTF9NU0lPRjNfMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfN180LAlWSTRfREFUQTEwKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl83XzQsCURVX0RCMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDJfN180LAlQV001X0EsCQkJU0VMX1BXTTVfMCksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8xMV84LAlBMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfMTFfOCwJTENET1VUMTkpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAyXzExXzgsCU1TSU9GM19SWERfQiwJCVNFTF9NU0lPRjNfMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfMTFfOCwJVkk0X0RBVEExMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfMTFfOCwJRFVfREIzKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMl8xMV84LAlQV002X0EsCQkJU0VMX1BXTTZfMCksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8xNV8xMiwJQTQpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzE1XzEyLAlMQ0RPVVQyMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDJfMTVfMTIsCU1TSU9GM19TUzFfQiwJCVNFTF9NU0lPRjNfMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfMTVfMTIsCVZJNF9EQVRBMTIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzE1XzEyLAlWSTVfREFUQTEyKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8xNV8xMiwJRFVfREI0KSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzE5XzE2LAlBNSksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfMTlfMTYsCUxDRE9VVDIxKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMl8xOV8xNiwJTVNJT0YzX1NTMl9CLAkJU0VMX01TSU9GM18xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMl8xOV8xNiwJU0NLNF9CLAkJCVNFTF9TQ0lGNF8xKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8xOV8xNiwJVkk0X0RBVEExMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfMTlfMTYsCVZJNV9EQVRBMTMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzE5XzE2LAlEVV9EQjUpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDJfMjNfMjAsCUE2KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8yM18yMCwJTENET1VUMjIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAyXzIzXzIwLAlNU0lPRjJfU1MxX0EsCQlTRUxfTVNJT0YyXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAyXzIzXzIwLAlSWDRfQiwJCQlTRUxfU0NJRjRfMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfMjNfMjAsCVZJNF9EQVRBMTQpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzIzXzIwLAlWSTVfREFUQTE0KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8yM18yMCwJRFVfREI2KSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzI3XzI0LAlBNyksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfMjdfMjQsCUxDRE9VVDIzKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMl8yN18yNCwJTVNJT0YyX1NTMl9BLAkJU0VMX01TSU9GMl8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMl8yN18yNCwJVFg0X0IsCQkJU0VMX1NDSUY0XzEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAyXzI3XzI0LAlWSTRfREFUQTE1KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8yN18yNCwJVkk1X0RBVEExNSksCisJUElOTVVYX0lQU1JfR1BTUihJUDJfMjdfMjQsCURVX0RCNyksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMl8zMV8yOCwJQTgpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAyXzMxXzI4LAlSWDNfQiwJCQlTRUxfU0NJRjNfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDJfMzFfMjgsCU1TSU9GMl9TWU5DX0EsCQlTRUxfTVNJT0YyXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAyXzMxXzI4LAlIUlg0X0IsCQkJU0VMX0hTQ0lGNF8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMl8zMV8yOCwJU0RBNl9BLAkJCVNFTF9JMkM2XzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAyXzMxXzI4LAlBVkJfQVZUUF9NQVRDSF9CLAlTRUxfRVRIRVJBVkJfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDJfMzFfMjgsCVBXTTFfQiwJCQlTRUxfUFdNMV8xKSwKKworCS8qIElQU1IzICovCisJUElOTVVYX0lQU1JfR1BTUihJUDNfM18wLAlBOSksCisJUElOTVVYX0lQU1JfTVNFTChJUDNfM18wLAlNU0lPRjJfU0NLX0EsCQlTRUxfTVNJT0YyXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAzXzNfMCwJQ1RTNF9OX0IsCQlTRUxfU0NJRjRfMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfM18wLAlWSTVfVlNZTkNfTiksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQM183XzQsCUExMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDNfN180LAlNU0lPRjJfUlhEX0EsCQlTRUxfTVNJT0YyXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAzXzdfNCwJUlRTNF9OX1RBTlNfQiwJCVNFTF9TQ0lGNF8xKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQM183XzQsCVZJNV9IU1lOQ19OKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzExXzgsCUExMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDNfMTFfOCwJVFgzX0IsCQkJU0VMX1NDSUYzXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAzXzExXzgsCU1TSU9GMl9UWERfQSwJCVNFTF9NU0lPRjJfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDNfMTFfOCwJSFRYNF9CLAkJCVNFTF9IU0NJRjRfMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMTFfOCwJSFNDSzQpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzExXzgsCVZJNV9GSUVMRCksCisJUElOTVVYX0lQU1JfTVNFTChJUDNfMTFfOCwJU0NMNl9BLAkJCVNFTF9JMkM2XzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAzXzExXzgsCUFWQl9BVlRQX0NBUFRVUkVfQiwJU0VMX0VUSEVSQVZCXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAzXzExXzgsCVBXTTJfQiwJCQlTRUxfUFdNMl8xKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzE1XzEyLAlBMTIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzE1XzEyLAlMQ0RPVVQxMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDNfMTVfMTIsCU1TSU9GM19TQ0tfQywJCVNFTF9NU0lPRjNfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDNfMTVfMTIsCUhSWDRfQSwJCQlTRUxfSFNDSUY0XzApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzE1XzEyLAlWSTVfREFUQTgpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzE1XzEyLAlEVV9ERzQpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMTlfMTYsCUExMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMTlfMTYsCUxDRE9VVDEzKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQM18xOV8xNiwJTVNJT0YzX1NZTkNfQywJCVNFTF9NU0lPRjNfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDNfMTlfMTYsCUhUWDRfQSwJCQlTRUxfSFNDSUY0XzApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzE5XzE2LAlWSTVfREFUQTkpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzE5XzE2LAlEVV9ERzUpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMjNfMjAsCUExNCksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMjNfMjAsCUxDRE9VVDE0KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQM18yM18yMCwJTVNJT0YzX1JYRF9DLAkJU0VMX01TSU9GM18yKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQM18yM18yMCwJSENUUzRfTiksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMjNfMjAsCVZJNV9EQVRBMTApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzIzXzIwLAlEVV9ERzYpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMjdfMjQsCUExNSksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMjdfMjQsCUxDRE9VVDE1KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQM18yN18yNCwJTVNJT0YzX1RYRF9DLAkJU0VMX01TSU9GM18yKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQM18yN18yNCwJSFJUUzRfTiksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMjdfMjQsCVZJNV9EQVRBMTEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzI3XzI0LAlEVV9ERzcpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMzFfMjgsCUExNiksCisJUElOTVVYX0lQU1JfR1BTUihJUDNfMzFfMjgsCUxDRE9VVDgpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzMxXzI4LAlWSTRfRklFTEQpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAzXzMxXzI4LAlEVV9ERzApLAorCisJLyogSVBTUjQgKi8KKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8zXzAsCUExNyksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfM18wLAlMQ0RPVVQ5KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8zXzAsCVZJNF9WU1lOQ19OKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8zXzAsCURVX0RHMSksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF83XzQsCUExOCksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfN180LAlMQ0RPVVQxMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfN180LAlWSTRfSFNZTkNfTiksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfN180LAlEVV9ERzIpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMTFfOCwJQTE5KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8xMV84LAlMQ0RPVVQxMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMTFfOCwJVkk0X0NMS0VOQiksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMTFfOCwJRFVfREczKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzE1XzEyLAlDUzBfTiksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMTVfMTIsCVZJNV9DTEtFTkIpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMTlfMTYsCUNTMV9OX0EyNiksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMTlfMTYsCVZJNV9DTEspLAorCVBJTk1VWF9JUFNSX01TRUwoSVA0XzE5XzE2LAlFWF9XQUlUMF9CLAkJU0VMX0xCU0NfMSksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8yM18yMCwJQlNfTiksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMjNfMjAsCVFTVFZBX1FWUyksCisJUElOTVVYX0lQU1JfTVNFTChJUDRfMjNfMjAsCU1TSU9GM19TQ0tfRCwJCVNFTF9NU0lPRjNfMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMjNfMjAsCVNDSzMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzIzXzIwLAlIU0NLMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMjNfMjAsCUNBTjFfVFgpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA0XzIzXzIwLAlDQU5GRDFfVFgpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA0XzIzXzIwLAlJRVRYX0EsCQkJU0VMX0lFQlVTXzApLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDRfMjdfMjQsCVJEX04pLAorCVBJTk1VWF9JUFNSX01TRUwoSVA0XzI3XzI0LAlNU0lPRjNfU1lOQ19ELAkJU0VMX01TSU9GM18zKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNF8yN18yNCwJUlgzX0EsCQkJU0VMX1NDSUYzXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVA0XzI3XzI0LAlIUlgzX0EsCQkJU0VMX0hTQ0lGM18wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNF8yN18yNCwJQ0FOMF9UWF9BLAkJU0VMX1JDQU4wXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVA0XzI3XzI0LAlDQU5GRDBfVFhfQSwJCVNFTF9DQU5GRDBfMCksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQNF8zMV8yOCwJUkRfV1JfTiksCisJUElOTVVYX0lQU1JfTVNFTChJUDRfMzFfMjgsCU1TSU9GM19SWERfRCwJCVNFTF9NU0lPRjNfMyksCisJUElOTVVYX0lQU1JfTVNFTChJUDRfMzFfMjgsCVRYM19BLAkJCVNFTF9TQ0lGM18wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNF8zMV8yOCwJSFRYM19BLAkJCVNFTF9IU0NJRjNfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDRfMzFfMjgsCUNBTjBfUlhfQSwJCVNFTF9SQ0FOMF8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNF8zMV8yOCwJQ0FORkQwX1JYX0EsCQlTRUxfQ0FORkQwXzApLAorCisJLyogSVBTUjUgKi8KKwlQSU5NVVhfSVBTUl9HUFNSKElQNV8zXzAsCVdFMF9OKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNV8zXzAsCU1TSU9GM19UWERfRCwJCVNFTF9NU0lPRjNfMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDVfM18wLAlDVFMzX04pLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzNfMCwJSENUUzNfTiksCisJUElOTVVYX0lQU1JfTVNFTChJUDVfM18wLAlTQ0w2X0IsCQkJU0VMX0kyQzZfMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDVfM18wLAlDQU5fQ0xLKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNV8zXzAsCUlFQ0xLX0EsCQlTRUxfSUVCVVNfMCksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV83XzQsCVdFMV9OKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNV83XzQsCU1TSU9GM19TUzFfRCwJCVNFTF9NU0lPRjNfMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDVfN180LAlSVFMzX05fVEFOUyksCisJUElOTVVYX0lQU1JfR1BTUihJUDVfN180LAlIUlRTM19OKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNV83XzQsCVNEQTZfQiwJCQlTRUxfSTJDNl8xKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV83XzQsCUNBTjFfUlgpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzdfNCwJQ0FORkQxX1JYKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNV83XzQsCUlFUlhfQSwJCQlTRUxfSUVCVVNfMCksCisKKwlQSU5NVVhfSVBTUl9NU0VMKElQNV8xMV84LAlFWF9XQUlUMF9BLAkJU0VMX0xCU0NfMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDVfMTFfOCwJUUNMSyksCisJUElOTVVYX0lQU1JfR1BTUihJUDVfMTFfOCwJVkk0X0NMSyksCisJUElOTVVYX0lQU1JfR1BTUihJUDVfMTFfOCwJRFVfRE9UQ0xLT1VUMCksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV8xNV8xMiwJRDApLAorCVBJTk1VWF9JUFNSX01TRUwoSVA1XzE1XzEyLAlNU0lPRjJfU1MxX0IsCQlTRUxfTVNJT0YyXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA1XzE1XzEyLAlNU0lPRjNfU0NLX0EsCQlTRUxfTVNJT0YzXzApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzE1XzEyLAlWSTRfREFUQTE2KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV8xNV8xMiwJVkk1X0RBVEEwKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzE5XzE2LAlEMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDVfMTlfMTYsCU1TSU9GMl9TUzJfQiwJCVNFTF9NU0lPRjJfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDVfMTlfMTYsCU1TSU9GM19TWU5DX0EsCQlTRUxfTVNJT0YzXzApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzE5XzE2LAlWSTRfREFUQTE3KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV8xOV8xNiwJVkk1X0RBVEExKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzIzXzIwLAlEMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDVfMjNfMjAsCU1TSU9GM19SWERfQSwJCVNFTF9NU0lPRjNfMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDVfMjNfMjAsCVZJNF9EQVRBMTgpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzIzXzIwLAlWSTVfREFUQTIpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDVfMjdfMjQsCUQzKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNV8yN18yNCwJTVNJT0YzX1RYRF9BLAkJU0VMX01TSU9GM18wKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV8yN18yNCwJVkk0X0RBVEExOSksCisJUElOTVVYX0lQU1JfR1BTUihJUDVfMjdfMjQsCVZJNV9EQVRBMyksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV8zMV8yOCwJRDQpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA1XzMxXzI4LAlNU0lPRjJfU0NLX0IsCQlTRUxfTVNJT0YyXzEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA1XzMxXzI4LAlWSTRfREFUQTIwKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNV8zMV8yOCwJVkk1X0RBVEE0KSwKKworCS8qIElQU1I2ICovCisJUElOTVVYX0lQU1JfR1BTUihJUDZfM18wLAlENSksCisJUElOTVVYX0lQU1JfTVNFTChJUDZfM18wLAlNU0lPRjJfU1lOQ19CLAkJU0VMX01TSU9GMl8xKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNl8zXzAsCVZJNF9EQVRBMjEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzNfMCwJVkk1X0RBVEE1KSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzdfNCwJRDYpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA2XzdfNCwJTVNJT0YyX1JYRF9CLAkJU0VMX01TSU9GMl8xKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNl83XzQsCVZJNF9EQVRBMjIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzdfNCwJVkk1X0RBVEE2KSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzExXzgsCUQ3KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNl8xMV84LAlNU0lPRjJfVFhEX0IsCQlTRUxfTVNJT0YyXzEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzExXzgsCVZJNF9EQVRBMjMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzExXzgsCVZJNV9EQVRBNyksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQNl8xNV8xMiwJRDgpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzE1XzEyLAlMQ0RPVVQwKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNl8xNV8xMiwJTVNJT0YyX1NDS19ELAkJU0VMX01TSU9GMl8zKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNl8xNV8xMiwJU0NLNF9DLAkJCVNFTF9TQ0lGNF8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNl8xNV8xMiwJVkk0X0RBVEEwX0EsCQlTRUxfVklONF8wKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNl8xNV8xMiwJRFVfRFIwKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzE5XzE2LAlEOSksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfMTlfMTYsCUxDRE9VVDEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA2XzE5XzE2LAlNU0lPRjJfU1lOQ19ELAkJU0VMX01TSU9GMl8zKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNl8xOV8xNiwJVkk0X0RBVEExX0EsCQlTRUxfVklONF8wKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNl8xOV8xNiwJRFVfRFIxKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzIzXzIwLAlEMTApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzIzXzIwLAlMQ0RPVVQyKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNl8yM18yMCwJTVNJT0YyX1JYRF9ELAkJU0VMX01TSU9GMl8zKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNl8yM18yMCwJSFJYM19CLAkJCVNFTF9IU0NJRjNfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDZfMjNfMjAsCVZJNF9EQVRBMl9BLAkJU0VMX1ZJTjRfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDZfMjNfMjAsCUNUUzRfTl9DLAkJU0VMX1NDSUY0XzIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzIzXzIwLAlEVV9EUjIpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDZfMjdfMjQsCUQxMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDZfMjdfMjQsCUxDRE9VVDMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA2XzI3XzI0LAlNU0lPRjJfVFhEX0QsCQlTRUxfTVNJT0YyXzMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA2XzI3XzI0LAlIVFgzX0IsCQkJU0VMX0hTQ0lGM18xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNl8yN18yNCwJVkk0X0RBVEEzX0EsCQlTRUxfVklONF8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNl8yN18yNCwJUlRTNF9OX1RBTlNfQywJCVNFTF9TQ0lGNF8yKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQNl8yN18yNCwJRFVfRFIzKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzMxXzI4LAlEMTIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzMxXzI4LAlMQ0RPVVQ0KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNl8zMV8yOCwJTVNJT0YyX1NTMV9ELAkJU0VMX01TSU9GMl8zKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQNl8zMV8yOCwJUlg0X0MsCQkJU0VMX1NDSUY0XzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA2XzMxXzI4LAlWSTRfREFUQTRfQSwJCVNFTF9WSU40XzApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA2XzMxXzI4LAlEVV9EUjQpLAorCisJLyogSVBTUjcgKi8KKwlQSU5NVVhfSVBTUl9HUFNSKElQN18zXzAsCUQxMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDdfM18wLAlMQ0RPVVQ1KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQN18zXzAsCU1TSU9GMl9TUzJfRCwJCVNFTF9NU0lPRjJfMyksCisJUElOTVVYX0lQU1JfTVNFTChJUDdfM18wLAlUWDRfQywJCQlTRUxfU0NJRjRfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDdfM18wLAlWSTRfREFUQTVfQSwJCVNFTF9WSU40XzApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzNfMCwJRFVfRFI1KSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzdfNCwJRDE0KSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQN183XzQsCUxDRE9VVDYpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA3XzdfNCwJTVNJT0YzX1NTMV9BLAkJU0VMX01TSU9GM18wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQN183XzQsCUhSWDNfQywJCQlTRUxfSFNDSUYzXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA3XzdfNCwJVkk0X0RBVEE2X0EsCQlTRUxfVklONF8wKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQN183XzQsCURVX0RSNiksCisJUElOTVVYX0lQU1JfTVNFTChJUDdfN180LAlTQ0w2X0MsCQkJU0VMX0kyQzZfMiksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQN18xMV84LAlEMTUpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzExXzgsCUxDRE9VVDcpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA3XzExXzgsCU1TSU9GM19TUzJfQSwJCVNFTF9NU0lPRjNfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDdfMTFfOCwJSFRYM19DLAkJCVNFTF9IU0NJRjNfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDdfMTFfOCwJVkk0X0RBVEE3X0EsCQlTRUxfVklONF8wKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQN18xMV84LAlEVV9EUjcpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA3XzExXzgsCVNEQTZfQywJCQlTRUxfSTJDNl8yKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzE1XzEyLAlGU0NMS1NUKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzE5XzE2LAlTRDBfQ0xLKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQN18xOV8xNiwJTVNJT0YxX1NDS19FLAkJU0VMX01TSU9GMV80KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQN18xOV8xNiwJU1RQX09QV01fMF9CLAkJU0VMX1NTUDFfMF8xKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzIzXzIwLAlTRDBfQ01EKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQN18yM18yMCwJTVNJT0YxX1NZTkNfRSwJCVNFTF9NU0lPRjFfNCksCisJUElOTVVYX0lQU1JfTVNFTChJUDdfMjNfMjAsCVNUUF9JVkNYTzI3XzBfQiwJU0VMX1NTUDFfMF8xKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA3XzI3XzI0LAlTRDBfREFUMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDdfMjdfMjQsCU1TSU9GMV9SWERfRSwJCVNFTF9NU0lPRjFfNCksCisJUElOTVVYX0lQU1JfTVNFTChJUDdfMjdfMjQsCVRTX1NDSzBfQiwJCVNFTF9UU0lGMF8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQN18yN18yNCwJU1RQX0lTQ0xLXzBfQiwJCVNFTF9TU1AxXzBfMSksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQN18zMV8yOCwJU0QwX0RBVDEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA3XzMxXzI4LAlNU0lPRjFfVFhEX0UsCQlTRUxfTVNJT0YxXzQpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA3XzMxXzI4LAlUU19TUFNZTkMwX0IsCQlTRUxfVFNJRjBfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDdfMzFfMjgsCVNUUF9JU1NZTkNfMF9CLAkJU0VMX1NTUDFfMF8xKSwKKworCS8qIElQU1I4ICovCisJUElOTVVYX0lQU1JfR1BTUihJUDhfM18wLAlTRDBfREFUMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDhfM18wLAlNU0lPRjFfU1MxX0UsCQlTRUxfTVNJT0YxXzQpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA4XzNfMCwJVFNfU0RBVDBfQiwJCVNFTF9UU0lGMF8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQOF8zXzAsCVNUUF9JU0RfMF9CLAkJU0VMX1NTUDFfMF8xKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA4XzdfNCwJU0QwX0RBVDMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA4XzdfNCwJTVNJT0YxX1NTMl9FLAkJU0VMX01TSU9GMV80KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQOF83XzQsCVRTX1NERU4wX0IsCQlTRUxfVFNJRjBfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDhfN180LAlTVFBfSVNFTl8wX0IsCQlTRUxfU1NQMV8wXzEpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDhfMTFfOCwJU0QxX0NMSyksCisJUElOTVVYX0lQU1JfTVNFTChJUDhfMTFfOCwJTVNJT0YxX1NDS19HLAkJU0VMX01TSU9GMV82KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQOF8xMV84LAlTSU0wX0NMS19BLAkJU0VMX1NJTUNBUkRfMCksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQOF8xNV8xMiwJU0QxX0NNRCksCisJUElOTVVYX0lQU1JfTVNFTChJUDhfMTVfMTIsCU1TSU9GMV9TWU5DX0csCQlTRUxfTVNJT0YxXzYpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA4XzE1XzEyLAlORkNFX05fQiwJCVNFTF9OREZfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDhfMTVfMTIsCVNJTTBfRF9BLAkJU0VMX1NJTUNBUkRfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDhfMTVfMTIsCVNUUF9JVkNYTzI3XzFfQiwJU0VMX1NTUDFfMV8xKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA4XzE5XzE2LAlTRDFfREFUMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDhfMTlfMTYsCVNEMl9EQVQ0KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQOF8xOV8xNiwJTVNJT0YxX1JYRF9HLAkJU0VMX01TSU9GMV82KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQOF8xOV8xNiwJTkZXUF9OX0IsCQlTRUxfTkRGXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA4XzE5XzE2LAlUU19TQ0sxX0IsCQlTRUxfVFNJRjFfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDhfMTlfMTYsCVNUUF9JU0NMS18xX0IsCQlTRUxfU1NQMV8xXzEpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDhfMjNfMjAsCVNEMV9EQVQxKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQOF8yM18yMCwJU0QyX0RBVDUpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA4XzIzXzIwLAlNU0lPRjFfVFhEX0csCQlTRUxfTVNJT0YxXzYpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA4XzIzXzIwLAlORkRBVEExNF9CLAkJU0VMX05ERl8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQOF8yM18yMCwJVFNfU1BTWU5DMV9CLAkJU0VMX1RTSUYxXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA4XzIzXzIwLAlTVFBfSVNTWU5DXzFfQiwJCVNFTF9TU1AxXzFfMSksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQOF8yN18yNCwJU0QxX0RBVDIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA4XzI3XzI0LAlTRDJfREFUNiksCisJUElOTVVYX0lQU1JfTVNFTChJUDhfMjdfMjQsCU1TSU9GMV9TUzFfRywJCVNFTF9NU0lPRjFfNiksCisJUElOTVVYX0lQU1JfTVNFTChJUDhfMjdfMjQsCU5GREFUQTE1X0IsCQlTRUxfTkRGXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA4XzI3XzI0LAlUU19TREFUMV9CLAkJU0VMX1RTSUYxXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVA4XzI3XzI0LAlTVFBfSVNEXzFfQiwJCVNFTF9TU1AxXzFfMSksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQOF8zMV8yOCwJU0QxX0RBVDMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA4XzMxXzI4LAlTRDJfREFUNyksCisJUElOTVVYX0lQU1JfTVNFTChJUDhfMzFfMjgsCU1TSU9GMV9TUzJfRywJCVNFTF9NU0lPRjFfNiksCisJUElOTVVYX0lQU1JfTVNFTChJUDhfMzFfMjgsCU5GUkJfTl9CLAkJU0VMX05ERl8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQOF8zMV8yOCwJVFNfU0RFTjFfQiwJCVNFTF9UU0lGMV8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQOF8zMV8yOCwJU1RQX0lTRU5fMV9CLAkJU0VMX1NTUDFfMV8xKSwKKworCS8qIElQU1I5ICovCisJUElOTVVYX0lQU1JfR1BTUihJUDlfM18wLAlTRDJfQ0xLKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQOV8zXzAsCU5GREFUQTgpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDlfN180LAlTRDJfQ01EKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQOV83XzQsCU5GREFUQTkpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDlfMTFfOCwJU0QyX0RBVDApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA5XzExXzgsCU5GREFUQTEwKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA5XzE1XzEyLAlTRDJfREFUMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDlfMTVfMTIsCU5GREFUQTExKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA5XzE5XzE2LAlTRDJfREFUMiksCisJUElOTVVYX0lQU1JfR1BTUihJUDlfMTlfMTYsCU5GREFUQTEyKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA5XzIzXzIwLAlTRDJfREFUMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDlfMjNfMjAsCU5GREFUQTEzKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVA5XzI3XzI0LAlTRDJfRFMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVA5XzI3XzI0LAlORkFMRSksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQOV8zMV8yOCwJU0QzX0NMSyksCisJUElOTVVYX0lQU1JfR1BTUihJUDlfMzFfMjgsCU5GV0VfTiksCisKKwkvKiBJUFNSMTAgKi8KKwlQSU5NVVhfSVBTUl9HUFNSKElQMTBfM18wLAlTRDNfQ01EKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTBfM18wLAlORlJFX04pLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDEwXzdfNCwJU0QzX0RBVDApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxMF83XzQsCU5GREFUQTApLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDEwXzExXzgsCVNEM19EQVQxKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTBfMTFfOCwJTkZEQVRBMSksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTBfMTVfMTIsCVNEM19EQVQyKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTBfMTVfMTIsCU5GREFUQTIpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDEwXzE5XzE2LAlTRDNfREFUMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDEwXzE5XzE2LAlORkRBVEEzKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxMF8yM18yMCwJU0QzX0RBVDQpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMF8yM18yMCwJU0QyX0NEX0EsCQlTRUxfU0RISTJfMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDEwXzIzXzIwLAlORkRBVEE0KSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxMF8yN18yNCwJU0QzX0RBVDUpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMF8yN18yNCwJU0QyX1dQX0EsCQlTRUxfU0RISTJfMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDEwXzI3XzI0LAlORkRBVEE1KSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxMF8zMV8yOCwJU0QzX0RBVDYpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxMF8zMV8yOCwJU0QzX0NEKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTBfMzFfMjgsCU5GREFUQTYpLAorCisJLyogSVBTUjExICovCisJUElOTVVYX0lQU1JfR1BTUihJUDExXzNfMCwJU0QzX0RBVDcpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxMV8zXzAsCVNEM19XUCksCisJUElOTVVYX0lQU1JfR1BTUihJUDExXzNfMCwJTkZEQVRBNyksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTFfN180LAlTRDNfRFMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxMV83XzQsCU5GQ0xFKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxMV8xMV84LAlTRDBfQ0QpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMV8xMV84LAlTQ0wyX0IsCQkJU0VMX0kyQzJfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDExXzExXzgsCVNJTTBfUlNUX0EsCQlTRUxfU0lNQ0FSRF8wKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxMV8xNV8xMiwJU0QwX1dQKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTFfMTVfMTIsCVNEQTJfQiwJCQlTRUxfSTJDMl8xKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxMV8xOV8xNiwJU0QxX0NEKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTFfMTlfMTYsCVNJTTBfQ0xLX0IsCQlTRUxfU0lNQ0FSRF8xKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxMV8yM18yMCwJU0QxX1dQKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTFfMjNfMjAsCVNJTTBfRF9CLAkJU0VMX1NJTUNBUkRfMSksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTFfMjdfMjQsCVNDSzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMV8yN18yNCwJSFNDSzFfQiwJCVNFTF9IU0NJRjFfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDExXzI3XzI0LAlNU0lPRjFfU1MyX0IsCQlTRUxfTVNJT0YxXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMV8yN18yNCwJQVVESU9fQ0xLQ19CLAkJU0VMX0FER19DXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMV8yN18yNCwJU0RBMl9BLAkJCVNFTF9JMkMyXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMV8yN18yNCwJU0lNMF9SU1RfQiwJCVNFTF9TSU1DQVJEXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMV8yN18yNCwJU1RQX09QV01fMF9DLAkJU0VMX1NTUDFfMF8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTFfMjdfMjQsCVJJRjBfQ0xLX0IsCQlTRUxfRFJJRjBfMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDExXzI3XzI0LAlBRElDSFMyKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTFfMjdfMjQsCVNDSzVfQiwJCQlTRUxfU0NJRjVfMSksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTFfMzFfMjgsCVJYMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDExXzMxXzI4LAlIUlgxX0IsCQkJU0VMX0hTQ0lGMV8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTFfMzFfMjgsCVRTX1NDSzBfQywJCVNFTF9UU0lGMF8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTFfMzFfMjgsCVNUUF9JU0NMS18wX0MsCQlTRUxfU1NQMV8wXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMV8zMV8yOCwJUklGMF9EMF9CLAkJU0VMX0RSSUYwXzEpLAorCisJLyogSVBTUjEyICovCisJUElOTVVYX0lQU1JfR1BTUihJUDEyXzNfMCwJVFgwKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTJfM18wLAlIVFgxX0IsCQkJU0VMX0hTQ0lGMV8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTJfM18wLAlUU19TUFNZTkMwX0MsCQlTRUxfVFNJRjBfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzNfMCwJU1RQX0lTU1lOQ18wX0MsCQlTRUxfU1NQMV8wXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMl8zXzAsCVJJRjBfRDFfQiwJCVNFTF9EUklGMF8xKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxMl83XzQsCUNUUzBfTiksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzdfNCwJSENUUzFfTl9CLAkJU0VMX0hTQ0lGMV8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTJfN180LAlNU0lPRjFfU1lOQ19CLAkJU0VMX01TSU9GMV8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTJfN180LAlUU19TUFNZTkMxX0MsCQlTRUxfVFNJRjFfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzdfNCwJU1RQX0lTU1lOQ18xX0MsCQlTRUxfU1NQMV8xXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMl83XzQsCVJJRjFfU1lOQ19CLAkJU0VMX0RSSUYxXzEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxMl83XzQsCUFVRElPX0NMS09VVF9DKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTJfN180LAlBRElDU19TQU1QKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxMl8xMV84LAlSVFMwX05fVEFOUyksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzExXzgsCUhSVFMxX05fQiwJCVNFTF9IU0NJRjFfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzExXzgsCU1TSU9GMV9TUzFfQiwJCVNFTF9NU0lPRjFfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzExXzgsCUFVRElPX0NMS0FfQiwJCVNFTF9BREdfQV8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTJfMTFfOCwJU0NMMl9BLAkJCVNFTF9JMkMyXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMl8xMV84LAlTVFBfSVZDWE8yN18xX0MsCVNFTF9TU1AxXzFfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzExXzgsCVJJRjBfU1lOQ19CLAkJU0VMX0RSSUYwXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMl8xMV84LAlGU09fVE9FX0EsCQlTRUxfRlNPXzApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxMl8xMV84LAlBRElDSFMxKSwKKworCVBJTk1VWF9JUFNSX01TRUwoSVAxMl8xNV8xMiwJUlgxX0EsCQkJU0VMX1NDSUYxXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMl8xNV8xMiwJSFJYMV9BLAkJCVNFTF9IU0NJRjFfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzE1XzEyLAlUU19TREFUMF9DLAkJU0VMX1RTSUYwXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMl8xNV8xMiwJU1RQX0lTRF8wX0MsCQlTRUxfU1NQMV8wXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMl8xNV8xMiwJUklGMV9DTEtfQywJCVNFTF9EUklGMV8yKSwKKworCVBJTk1VWF9JUFNSX01TRUwoSVAxMl8xOV8xNiwJVFgxX0EsCQkJU0VMX1NDSUYxXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMl8xOV8xNiwJSFRYMV9BLAkJCVNFTF9IU0NJRjFfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzE5XzE2LAlUU19TREVOMF9DLAkJU0VMX1RTSUYwXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMl8xOV8xNiwJU1RQX0lTRU5fMF9DLAkJU0VMX1NTUDFfMF8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTJfMTlfMTYsCVJJRjFfRDBfQywJCVNFTF9EUklGMV8yKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxMl8yM18yMCwJQ1RTMV9OKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTJfMjNfMjAsCUhDVFMxX05fQSwJCVNFTF9IU0NJRjFfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzIzXzIwLAlNU0lPRjFfUlhEX0IsCQlTRUxfTVNJT0YxXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMl8yM18yMCwJVFNfU0RFTjFfQywJCVNFTF9UU0lGMV8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTJfMjNfMjAsCVNUUF9JU0VOXzFfQywJCVNFTF9TU1AxXzFfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzIzXzIwLAlSSUYxX0QwX0IsCQlTRUxfRFJJRjFfMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDEyXzIzXzIwLAlBRElEQVRBKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxMl8yN18yNCwJUlRTMV9OX1RBTlMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMl8yN18yNCwJSFJUUzFfTl9BLAkJU0VMX0hTQ0lGMV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTJfMjdfMjQsCU1TSU9GMV9UWERfQiwJCVNFTF9NU0lPRjFfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzI3XzI0LAlUU19TREFUMV9DLAkJU0VMX1RTSUYxXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMl8yN18yNCwJU1RQX0lTRF8xX0MsCQlTRUxfU1NQMV8xXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMl8yN18yNCwJUklGMV9EMV9CLAkJU0VMX0RSSUYxXzEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxMl8yN18yNCwJQURJQ0hTMCksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTJfMzFfMjgsCVNDSzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxMl8zMV8yOCwJU0NJRl9DTEtfQiwJCVNFTF9TQ0lGMV8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTJfMzFfMjgsCU1TSU9GMV9TQ0tfQiwJCVNFTF9NU0lPRjFfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzMxXzI4LAlUU19TQ0sxX0MsCQlTRUxfVFNJRjFfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDEyXzMxXzI4LAlTVFBfSVNDTEtfMV9DLAkJU0VMX1NTUDFfMV8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTJfMzFfMjgsCVJJRjFfQ0xLX0IsCQlTRUxfRFJJRjFfMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDEyXzMxXzI4LAlBRElDTEspLAorCisJLyogSVBTUjEzICovCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzNfMCwJVFgyX0EsCQkJU0VMX1NDSUYyXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM18zXzAsCVNEMl9DRF9CLAkJU0VMX1NESEkyXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM18zXzAsCVNDTDFfQSwJCQlTRUxfSTJDMV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTNfM18wLAlGTUNMS19BLAkJU0VMX0ZNXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM18zXzAsCVJJRjFfRDFfQywJCVNFTF9EUklGMV8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTNfM18wLAlGU09fQ0ZFXzBfQiwJCVNFTF9GU09fMSksCisKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTNfN180LAlSWDJfQSwJCQlTRUxfU0NJRjJfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzdfNCwJU0QyX1dQX0IsCQlTRUxfU0RISTJfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzdfNCwJU0RBMV9BLAkJCVNFTF9JMkMxXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM183XzQsCUZNSU5fQSwJCQlTRUxfRk1fMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzdfNCwJUklGMV9TWU5DX0MsCQlTRUxfRFJJRjFfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzdfNCwJRlNPX0NGRV8xX0IsCQlTRUxfRlNPXzEpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDEzXzExXzgsCUhTQ0swKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTNfMTFfOCwJTVNJT0YxX1NDS19ELAkJU0VMX01TSU9GMV8zKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTNfMTFfOCwJQVVESU9fQ0xLQl9BLAkJU0VMX0FER19CXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM18xMV84LAlTU0lfU0RBVEExX0IsCQlTRUxfU1NJXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM18xMV84LAlUU19TQ0swX0QsCQlTRUxfVFNJRjBfMyksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzExXzgsCVNUUF9JU0NMS18wX0QsCQlTRUxfU1NQMV8wXzMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM18xMV84LAlSSUYwX0NMS19DLAkJU0VMX0RSSUYwXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM18xMV84LAlSWDVfQiwJCQlTRUxfU0NJRjVfMSksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTNfMTVfMTIsCUhSWDApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM18xNV8xMiwJTVNJT0YxX1JYRF9ELAkJU0VMX01TSU9GMV8zKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTNfMTVfMTIsCVNTSV9TREFUQTJfQiwJCVNFTF9TU0lfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzE1XzEyLAlUU19TREVOMF9ELAkJU0VMX1RTSUYwXzMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM18xNV8xMiwJU1RQX0lTRU5fMF9ELAkJU0VMX1NTUDFfMF8zKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTNfMTVfMTIsCVJJRjBfRDBfQywJCVNFTF9EUklGMF8yKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxM18xOV8xNiwJSFRYMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzE5XzE2LAlNU0lPRjFfVFhEX0QsCQlTRUxfTVNJT0YxXzMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM18xOV8xNiwJU1NJX1NEQVRBOV9CLAkJU0VMX1NTSV8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTNfMTlfMTYsCVRTX1NEQVQwX0QsCQlTRUxfVFNJRjBfMyksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzE5XzE2LAlTVFBfSVNEXzBfRCwJCVNFTF9TU1AxXzBfMyksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzE5XzE2LAlSSUYwX0QxX0MsCQlTRUxfRFJJRjBfMiksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTNfMjNfMjAsCUhDVFMwX04pLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM18yM18yMCwJUlgyX0IsCQkJU0VMX1NDSUYyXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM18yM18yMCwJTVNJT0YxX1NZTkNfRCwJCVNFTF9NU0lPRjFfMyksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzIzXzIwLAlTU0lfU0NLOV9BLAkJU0VMX1NTSV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTNfMjNfMjAsCVRTX1NQU1lOQzBfRCwJCVNFTF9UU0lGMF8zKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTNfMjNfMjAsCVNUUF9JU1NZTkNfMF9ELAkJU0VMX1NTUDFfMF8zKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTNfMjNfMjAsCVJJRjBfU1lOQ19DLAkJU0VMX0RSSUYwXzIpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxM18yM18yMCwJQVVESU9fQ0xLT1VUMV9BKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxM18yN18yNCwJSFJUUzBfTiksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzI3XzI0LAlUWDJfQiwJCQlTRUxfU0NJRjJfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDEzXzI3XzI0LAlNU0lPRjFfU1MxX0QsCQlTRUxfTVNJT0YxXzMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM18yN18yNCwJU1NJX1dTOV9BLAkJU0VMX1NTSV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTNfMjdfMjQsCVNUUF9JVkNYTzI3XzBfRCwJU0VMX1NTUDFfMF8zKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTNfMjdfMjQsCUJQRkNMS19BLAkJU0VMX0ZNXzApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxM18yN18yNCwJQVVESU9fQ0xLT1VUMl9BKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxM18zMV8yOCwJTVNJT0YwX1NZTkMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxM18zMV8yOCwJQVVESU9fQ0xLT1VUX0EpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM18zMV8yOCwJVFg1X0IsCQkJU0VMX1NDSUY1XzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxM18zMV8yOCwJQlBGQ0xLX0QsCQlTRUxfRk1fMyksCisKKwkvKiBJUFNSMTQgKi8KKwlQSU5NVVhfSVBTUl9HUFNSKElQMTRfM18wLAlNU0lPRjBfU1MxKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTRfM18wLAlSWDVfQSwJCQlTRUxfU0NJRjVfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE0XzNfMCwJTkZXUF9OX0EsCQlTRUxfTkRGXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNF8zXzAsCUFVRElPX0NMS0FfQywJCVNFTF9BREdfQV8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTRfM18wLAlTU0lfU0NLMl9BLAkJU0VMX1NTSV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTRfM18wLAlTVFBfSVZDWE8yN18wX0MsCVNFTF9TU1AxXzBfMiksCisJUElOTVVYX0lQU1JfR1BTUihJUDE0XzNfMCwJQVVESU9fQ0xLT1VUM19BKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTRfM18wLAlUQ0xLMV9CLAkJU0VMX1RJTUVSX1RNVV8xKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxNF83XzQsCU1TSU9GMF9TUzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNF83XzQsCVRYNV9BLAkJCVNFTF9TQ0lGNV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTRfN180LAlNU0lPRjFfU1MyX0QsCQlTRUxfTVNJT0YxXzMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNF83XzQsCUFVRElPX0NMS0NfQSwJCVNFTF9BREdfQ18wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTRfN180LAlTU0lfV1MyX0EsCQlTRUxfU1NJXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNF83XzQsCVNUUF9PUFdNXzBfRCwJCVNFTF9TU1AxXzBfMyksCisJUElOTVVYX0lQU1JfR1BTUihJUDE0XzdfNCwJQVVESU9fQ0xLT1VUX0QpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNF83XzQsCVNQRUVESU5fQiwJCVNFTF9TUEVFRF9QVUxTRV8xKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxNF8xMV84LAlNTEJfQ0xLKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTRfMTFfOCwJTVNJT0YxX1NDS19GLAkJU0VMX01TSU9GMV81KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTRfMTFfOCwJU0NMMV9CLAkJCVNFTF9JMkMxXzEpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDE0XzE1XzEyLAlNTEJfU0lHKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTRfMTVfMTIsCVJYMV9CLAkJCVNFTF9TQ0lGMV8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTRfMTVfMTIsCU1TSU9GMV9TWU5DX0YsCQlTRUxfTVNJT0YxXzUpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNF8xNV8xMiwJU0RBMV9CLAkJCVNFTF9JMkMxXzEpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDE0XzE5XzE2LAlNTEJfREFUKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTRfMTlfMTYsCVRYMV9CLAkJCVNFTF9TQ0lGMV8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTRfMTlfMTYsCU1TSU9GMV9SWERfRiwJCVNFTF9NU0lPRjFfNSksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTRfMjNfMjAsCVNTSV9TQ0swMTI5KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTRfMjNfMjAsCU1TSU9GMV9UWERfRiwJCVNFTF9NU0lPRjFfNSksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTRfMjdfMjQsCVNTSV9XUzAxMjkpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNF8yN18yNCwJTVNJT0YxX1NTMV9GLAkJU0VMX01TSU9GMV81KSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxNF8zMV8yOCwJU1NJX1NEQVRBMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE0XzMxXzI4LAlNU0lPRjFfU1MyX0YsCQlTRUxfTVNJT0YxXzUpLAorCisJLyogSVBTUjE1ICovCisJUElOTVVYX0lQU1JfTVNFTChJUDE1XzNfMCwJU1NJX1NEQVRBMV9BLAkJU0VMX1NTSV8wKSwKKworCVBJTk1VWF9JUFNSX01TRUwoSVAxNV83XzQsCVNTSV9TREFUQTJfQSwJCVNFTF9TU0lfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE1XzdfNCwJU1NJX1NDSzFfQiwJCVNFTF9TU0lfMSksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTVfMTFfOCwJU1NJX1NDSzM0KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTVfMTFfOCwJTVNJT0YxX1NTMV9BLAkJU0VMX01TSU9GMV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTVfMTFfOCwJU1RQX09QV01fMF9BLAkJU0VMX1NTUDFfMF8wKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxNV8xNV8xMiwJU1NJX1dTMzQpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNV8xNV8xMiwJSENUUzJfTl9BLAkJU0VMX0hTQ0lGMl8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTVfMTVfMTIsCU1TSU9GMV9TUzJfQSwJCVNFTF9NU0lPRjFfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE1XzE1XzEyLAlTVFBfSVZDWE8yN18wX0EsCVNFTF9TU1AxXzBfMCksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTVfMTlfMTYsCVNTSV9TREFUQTMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNV8xOV8xNiwJSFJUUzJfTl9BLAkJU0VMX0hTQ0lGMl8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTVfMTlfMTYsCU1TSU9GMV9UWERfQSwJCVNFTF9NU0lPRjFfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE1XzE5XzE2LAlUU19TQ0swX0EsCQlTRUxfVFNJRjBfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE1XzE5XzE2LAlTVFBfSVNDTEtfMF9BLAkJU0VMX1NTUDFfMF8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTVfMTlfMTYsCVJJRjBfRDFfQSwJCVNFTF9EUklGMF8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTVfMTlfMTYsCVJJRjJfRDBfQSwJCVNFTF9EUklGMl8wKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxNV8yM18yMCwJU1NJX1NDSzQpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNV8yM18yMCwJSFJYMl9BLAkJCVNFTF9IU0NJRjJfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE1XzIzXzIwLAlNU0lPRjFfU0NLX0EsCQlTRUxfTVNJT0YxXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNV8yM18yMCwJVFNfU0RBVDBfQSwJCVNFTF9UU0lGMF8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTVfMjNfMjAsCVNUUF9JU0RfMF9BLAkJU0VMX1NTUDFfMF8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTVfMjNfMjAsCVJJRjBfQ0xLX0EsCQlTRUxfRFJJRjBfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE1XzIzXzIwLAlSSUYyX0NMS19BLAkJU0VMX0RSSUYyXzApLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDE1XzI3XzI0LAlTU0lfV1M0KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTVfMjdfMjQsCUhUWDJfQSwJCQlTRUxfSFNDSUYyXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNV8yN18yNCwJTVNJT0YxX1NZTkNfQSwJCVNFTF9NU0lPRjFfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE1XzI3XzI0LAlUU19TREVOMF9BLAkJU0VMX1RTSUYwXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNV8yN18yNCwJU1RQX0lTRU5fMF9BLAkJU0VMX1NTUDFfMF8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTVfMjdfMjQsCVJJRjBfU1lOQ19BLAkJU0VMX0RSSUYwXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNV8yN18yNCwJUklGMl9TWU5DX0EsCQlTRUxfRFJJRjJfMCksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTVfMzFfMjgsCVNTSV9TREFUQTQpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNV8zMV8yOCwJSFNDSzJfQSwJCVNFTF9IU0NJRjJfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE1XzMxXzI4LAlNU0lPRjFfUlhEX0EsCQlTRUxfTVNJT0YxXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNV8zMV8yOCwJVFNfU1BTWU5DMF9BLAkJU0VMX1RTSUYwXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNV8zMV8yOCwJU1RQX0lTU1lOQ18wX0EsCQlTRUxfU1NQMV8wXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNV8zMV8yOCwJUklGMF9EMF9BLAkJU0VMX0RSSUYwXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNV8zMV8yOCwJUklGMl9EMV9BLAkJU0VMX0RSSUYyXzApLAorCisJLyogSVBTUjE2ICovCisJUElOTVVYX0lQU1JfR1BTUihJUDE2XzNfMCwJU1NJX1NDSzYpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNl8zXzAsCVNJTTBfUlNUX0QsCQlTRUxfU0lNQ0FSRF8zKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxNl83XzQsCVNTSV9XUzYpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNl83XzQsCVNJTTBfRF9ELAkJU0VMX1NJTUNBUkRfMyksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTZfMTFfOCwJU1NJX1NEQVRBNiksCisJUElOTVVYX0lQU1JfTVNFTChJUDE2XzExXzgsCVNJTTBfQ0xLX0QsCQlTRUxfU0lNQ0FSRF8zKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxNl8xNV8xMiwJU1NJX1NDSzc4KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTZfMTVfMTIsCUhSWDJfQiwJCQlTRUxfSFNDSUYyXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNl8xNV8xMiwJTVNJT0YxX1NDS19DLAkJU0VMX01TSU9GMV8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTZfMTVfMTIsCVRTX1NDSzFfQSwJCVNFTF9UU0lGMV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTZfMTVfMTIsCVNUUF9JU0NMS18xX0EsCQlTRUxfU1NQMV8xXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNl8xNV8xMiwJUklGMV9DTEtfQSwJCVNFTF9EUklGMV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTZfMTVfMTIsCVJJRjNfQ0xLX0EsCQlTRUxfRFJJRjNfMCksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTZfMTlfMTYsCVNTSV9XUzc4KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTZfMTlfMTYsCUhUWDJfQiwJCQlTRUxfSFNDSUYyXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNl8xOV8xNiwJTVNJT0YxX1NZTkNfQywJCVNFTF9NU0lPRjFfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDE2XzE5XzE2LAlUU19TREFUMV9BLAkJU0VMX1RTSUYxXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNl8xOV8xNiwJU1RQX0lTRF8xX0EsCQlTRUxfU1NQMV8xXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNl8xOV8xNiwJUklGMV9TWU5DX0EsCQlTRUxfRFJJRjFfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE2XzE5XzE2LAlSSUYzX1NZTkNfQSwJCVNFTF9EUklGM18wKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxNl8yM18yMCwJU1NJX1NEQVRBNyksCisJUElOTVVYX0lQU1JfTVNFTChJUDE2XzIzXzIwLAlIQ1RTMl9OX0IsCQlTRUxfSFNDSUYyXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNl8yM18yMCwJTVNJT0YxX1JYRF9DLAkJU0VMX01TSU9GMV8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTZfMjNfMjAsCVRTX1NERU4xX0EsCQlTRUxfVFNJRjFfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE2XzIzXzIwLAlTVFBfSVNFTl8xX0EsCQlTRUxfU1NQMV8xXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNl8yM18yMCwJUklGMV9EMF9BLAkJU0VMX0RSSUYxXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNl8yM18yMCwJUklGM19EMF9BLAkJU0VMX0RSSUYzXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNl8yM18yMCwJVENMSzJfQSwJCVNFTF9USU1FUl9UTVVfMCksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTZfMjdfMjQsCVNTSV9TREFUQTgpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxNl8yN18yNCwJSFJUUzJfTl9CLAkJU0VMX0hTQ0lGMl8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTZfMjdfMjQsCU1TSU9GMV9UWERfQywJCVNFTF9NU0lPRjFfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDE2XzI3XzI0LAlUU19TUFNZTkMxX0EsCQlTRUxfVFNJRjFfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE2XzI3XzI0LAlTVFBfSVNTWU5DXzFfQSwJCVNFTF9TU1AxXzFfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE2XzI3XzI0LAlSSUYxX0QxX0EsCQlTRUxfRFJJRjFfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE2XzI3XzI0LAlSSUYzX0QxX0EsCQlTRUxfRFJJRjNfMCksCisKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTZfMzFfMjgsCVNTSV9TREFUQTlfQSwJCVNFTF9TU0lfMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE2XzMxXzI4LAlIU0NLMl9CLAkJU0VMX0hTQ0lGMl8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTZfMzFfMjgsCU1TSU9GMV9TUzFfQywJCVNFTF9NU0lPRjFfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDE2XzMxXzI4LAlIU0NLMV9BLAkJU0VMX0hTQ0lGMV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTZfMzFfMjgsCVNTSV9XUzFfQiwJCVNFTF9TU0lfMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDE2XzMxXzI4LAlTQ0sxKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTZfMzFfMjgsCVNUUF9JVkNYTzI3XzFfQSwJU0VMX1NTUDFfMV8wKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTZfMzFfMjgsCVNDSzVfQSksCisKKwkvKiBJUFNSMTcgKi8KKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfM18wLAlBVURJT19DTEtBX0EsCQlTRUxfQURHX0FfMCksCisJUElOTVVYX0lQU1JfR1BTUihJUDE3XzNfMCwJQ0M1X09TQ09VVCksCisKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfN180LAlBVURJT19DTEtCX0IsCQlTRUxfQURHX0JfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzdfNCwJU0NJRl9DTEtfQSwJCVNFTF9TQ0lGMV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfN180LAlTVFBfSVZDWE8yN18xX0QsCVNFTF9TU1AxXzFfMyksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzdfNCwJUkVNT0NPTl9BLAkJU0VMX1JFTU9DT05fMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzdfNCwJVENMSzFfQSwJCVNFTF9USU1FUl9UTVVfMCksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTdfMTFfOCwJVVNCMF9QV0VOKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMTFfOCwJU0lNMF9SU1RfQywJCVNFTF9TSU1DQVJEXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxN18xMV84LAlUU19TQ0sxX0QsCQlTRUxfVFNJRjFfMyksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzExXzgsCVNUUF9JU0NMS18xX0QsCQlTRUxfU1NQMV8xXzMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxN18xMV84LAlCUEZDTEtfQiwJCVNFTF9GTV8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMTFfOCwJUklGM19DTEtfQiwJCVNFTF9EUklGM18xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMTFfOCwJSFNDSzJfQywJCVNFTF9IU0NJRjJfMiksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTdfMTVfMTIsCVVTQjBfT1ZDKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMTVfMTIsCVNJTTBfRF9DLAkJU0VMX1NJTUNBUkRfMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzE1XzEyLAlUU19TREFUMV9ELAkJU0VMX1RTSUYxXzMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxN18xNV8xMiwJU1RQX0lTRF8xX0QsCQlTRUxfU1NQMV8xXzMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxN18xNV8xMiwJUklGM19TWU5DX0IsCQlTRUxfRFJJRjNfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzE1XzEyLAlIUlgyX0MsCQkJU0VMX0hTQ0lGMl8yKSwKKworCVBJTk1VWF9JUFNSX0dQU1IoSVAxN18xOV8xNiwJVVNCMV9QV0VOKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMTlfMTYsCVNJTTBfQ0xLX0MsCQlTRUxfU0lNQ0FSRF8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMTlfMTYsCVNTSV9TQ0sxX0EsCQlTRUxfU1NJXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxN18xOV8xNiwJVFNfU0NLMF9FLAkJU0VMX1RTSUYwXzQpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxN18xOV8xNiwJU1RQX0lTQ0xLXzBfRSwJCVNFTF9TU1AxXzBfNCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzE5XzE2LAlGTUNMS19CLAkJU0VMX0ZNXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxN18xOV8xNiwJUklGMl9DTEtfQiwJCVNFTF9EUklGMl8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMTlfMTYsCVNQRUVESU5fQSwJCVNFTF9TUEVFRF9QVUxTRV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMTlfMTYsCUhUWDJfQywJCQlTRUxfSFNDSUYyXzIpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDE3XzIzXzIwLAlVU0IxX09WQyksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzIzXzIwLAlNU0lPRjFfU1MyX0MsCQlTRUxfTVNJT0YxXzIpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxN18yM18yMCwJU1NJX1dTMV9BLAkJU0VMX1NTSV8wKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMjNfMjAsCVRTX1NEQVQwX0UsCQlTRUxfVFNJRjBfNCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzIzXzIwLAlTVFBfSVNEXzBfRSwJCVNFTF9TU1AxXzBfNCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzIzXzIwLAlGTUlOX0IsCQkJU0VMX0ZNXzEpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxN18yM18yMCwJUklGMl9TWU5DX0IsCQlTRUxfRFJJRjJfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzIzXzIwLAlSRU1PQ09OX0IsCQlTRUxfUkVNT0NPTl8xKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMjNfMjAsCUhDVFMyX05fQywJCVNFTF9IU0NJRjJfMiksCisKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTdfMjdfMjQsCVVTQjMwX1BXRU4pLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxN18yN18yNCwJQVVESU9fQ0xLT1VUX0IpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxN18yN18yNCwJU1NJX1NDSzJfQiwJCVNFTF9TU0lfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzI3XzI0LAlUU19TREVOMV9ELAkJU0VMX1RTSUYxXzMpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxN18yN18yNCwJU1RQX0lTRU5fMV9ELAkJU0VMX1NTUDFfMV8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMjdfMjQsCVNUUF9PUFdNXzBfRSwJCVNFTF9TU1AxXzBfNCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzI3XzI0LAlSSUYzX0QwX0IsCQlTRUxfRFJJRjNfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzI3XzI0LAlUQ0xLMl9CLAkJU0VMX1RJTUVSX1RNVV8xKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMTdfMjdfMjQsCVRQVTBUTzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxN18yN18yNCwJQlBGQ0xLX0MsCQlTRUxfRk1fMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzI3XzI0LAlIUlRTMl9OX0MsCQlTRUxfSFNDSUYyXzIpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDE3XzMxXzI4LAlVU0IzMF9PVkMpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxN18zMV8yOCwJQVVESU9fQ0xLT1VUMV9CKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMTdfMzFfMjgsCVNTSV9XUzJfQiwJCVNFTF9TU0lfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzMxXzI4LAlUU19TUFNZTkMxX0QsCQlTRUxfVFNJRjFfMyksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzMxXzI4LAlTVFBfSVNTWU5DXzFfRCwJCVNFTF9TU1AxXzFfMyksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzMxXzI4LAlTVFBfSVZDWE8yN18wX0UsCVNFTF9TU1AxXzBfNCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzMxXzI4LAlSSUYzX0QxX0IsCQlTRUxfRFJJRjNfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDE3XzMxXzI4LAlGU09fVE9FX0IsCQlTRUxfRlNPXzEpLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxN18zMV8yOCwJVFBVMFRPMSksCisKKwkvKiBJUFNSMTggKi8KKwlQSU5NVVhfSVBTUl9HUFNSKElQMThfM18wLAlHUDZfMzApLAorCVBJTk1VWF9JUFNSX0dQU1IoSVAxOF8zXzAsCUFVRElPX0NMS09VVDJfQiksCisJUElOTVVYX0lQU1JfTVNFTChJUDE4XzNfMCwJU1NJX1NDSzlfQiwJCVNFTF9TU0lfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDE4XzNfMCwJVFNfU0RFTjBfRSwJCVNFTF9UU0lGMF80KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMThfM18wLAlTVFBfSVNFTl8wX0UsCQlTRUxfU1NQMV8wXzQpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxOF8zXzAsCVJJRjJfRDBfQiwJCVNFTF9EUklGMl8xKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMThfM18wLAlUUFUwVE8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMThfM18wLAlGU09fQ0ZFXzBfQSwJCVNFTF9GU09fMCksCisJUElOTVVYX0lQU1JfTVNFTChJUDE4XzNfMCwJRk1DTEtfQywJCVNFTF9GTV8yKSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMThfM18wLAlGTUNMS19ELAkJU0VMX0ZNXzMpLAorCisJUElOTVVYX0lQU1JfR1BTUihJUDE4XzdfNCwJR1A2XzMxKSwKKwlQSU5NVVhfSVBTUl9HUFNSKElQMThfN180LAlBVURJT19DTEtPVVQzX0IpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxOF83XzQsCVNTSV9XUzlfQiwJCVNFTF9TU0lfMSksCisJUElOTVVYX0lQU1JfTVNFTChJUDE4XzdfNCwJVFNfU1BTWU5DMF9FLAkJU0VMX1RTSUYwXzQpLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxOF83XzQsCVNUUF9JU1NZTkNfMF9FLAkJU0VMX1NTUDFfMF80KSwKKwlQSU5NVVhfSVBTUl9NU0VMKElQMThfN180LAlSSUYyX0QxX0IsCQlTRUxfRFJJRjJfMSksCisJUElOTVVYX0lQU1JfR1BTUihJUDE4XzdfNCwJVFBVMFRPMyksCisJUElOTVVYX0lQU1JfTVNFTChJUDE4XzdfNCwJRlNPX0NGRV8xX0EsCQlTRUxfRlNPXzApLAorCVBJTk1VWF9JUFNSX01TRUwoSVAxOF83XzQsCUZNSU5fQywJCQlTRUxfRk1fMiksCisJUElOTVVYX0lQU1JfTVNFTChJUDE4XzdfNCwJRk1JTl9ELAkJCVNFTF9GTV8zKSwKKworCS8qIEkyQyAqLworCVBJTk1VWF9JUFNSX05PR1AoMCwJCUkyQ19TRUxfMF8xKSwKKwlQSU5NVVhfSVBTUl9OT0dQKDAsCQlJMkNfU0VMXzNfMSksCisJUElOTVVYX0lQU1JfTk9HUCgwLAkJSTJDX1NFTF81XzEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9wZmNfcGluIHBpbm11eF9waW5zW10gPSB7CisJUElOTVVYX0dQSU9fR1BfQUxMKCksCit9OworCisvKiAtIFNDSUYwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmMF9kYXRhX3BpbnNbXSA9IHsKKwkvKiBSWCwgVFggKi8KKwlSQ0FSX0dQX1BJTig1LCAxKSwgUkNBUl9HUF9QSU4oNSwgMiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmMF9kYXRhX211eFtdID0geworCVJYMF9NQVJLLCBUWDBfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYwX2Nsa19waW5zW10gPSB7CisJLyogU0NLICovCisJUkNBUl9HUF9QSU4oNSwgMCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmMF9jbGtfbXV4W10gPSB7CisJU0NLMF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjBfY3RybF9waW5zW10gPSB7CisJLyogUlRTLCBDVFMgKi8KKwlSQ0FSX0dQX1BJTig1LCA0KSwgUkNBUl9HUF9QSU4oNSwgMyksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmMF9jdHJsX211eFtdID0geworCVJUUzBfTl9UQU5TX01BUkssIENUUzBfTl9NQVJLLAorfTsKKy8qIC0gU0NJRjEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYxX2RhdGFfYV9waW5zW10gPSB7CisJLyogUlgsIFRYICovCisJUkNBUl9HUF9QSU4oNSwgNSksIFJDQVJfR1BfUElOKDUsIDYpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjFfZGF0YV9hX211eFtdID0geworCVJYMV9BX01BUkssIFRYMV9BX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmMV9jbGtfcGluc1tdID0geworCS8qIFNDSyAqLworCVJDQVJfR1BfUElOKDYsIDIxKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYxX2Nsa19tdXhbXSA9IHsKKwlTQ0sxX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmMV9jdHJsX3BpbnNbXSA9IHsKKwkvKiBSVFMsIENUUyAqLworCVJDQVJfR1BfUElOKDUsIDgpLCBSQ0FSX0dQX1BJTig1LCA3KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYxX2N0cmxfbXV4W10gPSB7CisJUlRTMV9OX1RBTlNfTUFSSywgQ1RTMV9OX01BUkssCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYxX2RhdGFfYl9waW5zW10gPSB7CisJLyogUlgsIFRYICovCisJUkNBUl9HUF9QSU4oNSwgMjQpLCBSQ0FSX0dQX1BJTig1LCAyNSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmMV9kYXRhX2JfbXV4W10gPSB7CisJUlgxX0JfTUFSSywgVFgxX0JfTUFSSywKK307CisvKiAtIFNDSUYyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmMl9kYXRhX2FfcGluc1tdID0geworCS8qIFJYLCBUWCAqLworCVJDQVJfR1BfUElOKDUsIDExKSwgUkNBUl9HUF9QSU4oNSwgMTApLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjJfZGF0YV9hX211eFtdID0geworCVJYMl9BX01BUkssIFRYMl9BX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmMl9jbGtfcGluc1tdID0geworCS8qIFNDSyAqLworCVJDQVJfR1BfUElOKDUsIDkpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjJfY2xrX211eFtdID0geworCVNDSzJfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYyX2RhdGFfYl9waW5zW10gPSB7CisJLyogUlgsIFRYICovCisJUkNBUl9HUF9QSU4oNSwgMTUpLCBSQ0FSX0dQX1BJTig1LCAxNiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmMl9kYXRhX2JfbXV4W10gPSB7CisJUlgyX0JfTUFSSywgVFgyX0JfTUFSSywKK307CisvKiAtIFNDSUYzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmM19kYXRhX2FfcGluc1tdID0geworCS8qIFJYLCBUWCAqLworCVJDQVJfR1BfUElOKDEsIDIzKSwgUkNBUl9HUF9QSU4oMSwgMjQpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjNfZGF0YV9hX211eFtdID0geworCVJYM19BX01BUkssIFRYM19BX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmM19jbGtfcGluc1tdID0geworCS8qIFNDSyAqLworCVJDQVJfR1BfUElOKDEsIDIyKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYzX2Nsa19tdXhbXSA9IHsKKwlTQ0szX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmM19jdHJsX3BpbnNbXSA9IHsKKwkvKiBSVFMsIENUUyAqLworCVJDQVJfR1BfUElOKDEsIDI2KSwgUkNBUl9HUF9QSU4oMSwgMjUpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjNfY3RybF9tdXhbXSA9IHsKKwlSVFMzX05fVEFOU19NQVJLLCBDVFMzX05fTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYzX2RhdGFfYl9waW5zW10gPSB7CisJLyogUlgsIFRYICovCisJUkNBUl9HUF9QSU4oMSwgOCksIFJDQVJfR1BfUElOKDEsIDExKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWYzX2RhdGFfYl9tdXhbXSA9IHsKKwlSWDNfQl9NQVJLLCBUWDNfQl9NQVJLLAorfTsKKy8qIC0gU0NJRjQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWY0X2RhdGFfYV9waW5zW10gPSB7CisJLyogUlgsIFRYICovCisJUkNBUl9HUF9QSU4oMiwgMTEpLCBSQ0FSX0dQX1BJTigyLCAxMiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmNF9kYXRhX2FfbXV4W10gPSB7CisJUlg0X0FfTUFSSywgVFg0X0FfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWY0X2Nsa19hX3BpbnNbXSA9IHsKKwkvKiBTQ0sgKi8KKwlSQ0FSX0dQX1BJTigyLCAxMCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmNF9jbGtfYV9tdXhbXSA9IHsKKwlTQ0s0X0FfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWY0X2N0cmxfYV9waW5zW10gPSB7CisJLyogUlRTLCBDVFMgKi8KKwlSQ0FSX0dQX1BJTigyLCAxNCksIFJDQVJfR1BfUElOKDIsIDEzKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWY0X2N0cmxfYV9tdXhbXSA9IHsKKwlSVFM0X05fVEFOU19BX01BUkssIENUUzRfTl9BX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmNF9kYXRhX2JfcGluc1tdID0geworCS8qIFJYLCBUWCAqLworCVJDQVJfR1BfUElOKDEsIDYpLCBSQ0FSX0dQX1BJTigxLCA3KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWY0X2RhdGFfYl9tdXhbXSA9IHsKKwlSWDRfQl9NQVJLLCBUWDRfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjRfY2xrX2JfcGluc1tdID0geworCS8qIFNDSyAqLworCVJDQVJfR1BfUElOKDEsIDUpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjRfY2xrX2JfbXV4W10gPSB7CisJU0NLNF9CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmNF9jdHJsX2JfcGluc1tdID0geworCS8qIFJUUywgQ1RTICovCisJUkNBUl9HUF9QSU4oMSwgMTApLCBSQ0FSX0dQX1BJTigxLCA5KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWY0X2N0cmxfYl9tdXhbXSA9IHsKKwlSVFM0X05fVEFOU19CX01BUkssIENUUzRfTl9CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmNF9kYXRhX2NfcGluc1tdID0geworCS8qIFJYLCBUWCAqLworCVJDQVJfR1BfUElOKDAsIDEyKSwgUkNBUl9HUF9QSU4oMCwgMTMpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjRfZGF0YV9jX211eFtdID0geworCVJYNF9DX01BUkssIFRYNF9DX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmNF9jbGtfY19waW5zW10gPSB7CisJLyogU0NLICovCisJUkNBUl9HUF9QSU4oMCwgOCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmNF9jbGtfY19tdXhbXSA9IHsKKwlTQ0s0X0NfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWY0X2N0cmxfY19waW5zW10gPSB7CisJLyogUlRTLCBDVFMgKi8KKwlSQ0FSX0dQX1BJTigwLCAxMSksIFJDQVJfR1BfUElOKDAsIDEwKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWY0X2N0cmxfY19tdXhbXSA9IHsKKwlSVFM0X05fVEFOU19DX01BUkssIENUUzRfTl9DX01BUkssCit9OworLyogLSBTQ0lGNSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjVfZGF0YV9hX3BpbnNbXSA9IHsKKwkvKiBSWCwgVFggKi8KKwlSQ0FSX0dQX1BJTig1LCAxOSksIFJDQVJfR1BfUElOKDUsIDIxKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWY1X2RhdGFfYV9tdXhbXSA9IHsKKwlSWDVfQV9NQVJLLCBUWDVfQV9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjVfY2xrX2FfcGluc1tdID0geworCS8qIFNDSyAqLworCVJDQVJfR1BfUElOKDYsIDIxKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWY1X2Nsa19hX211eFtdID0geworCVNDSzVfQV9NQVJLLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmNV9kYXRhX2JfcGluc1tdID0geworCS8qIFJYLCBUWCAqLworCVJDQVJfR1BfUElOKDUsIDEyKSwgUkNBUl9HUF9QSU4oNSwgMTgpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZjVfZGF0YV9iX211eFtdID0geworCVJYNV9CX01BUkssIFRYNV9CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmNV9jbGtfYl9waW5zW10gPSB7CisJLyogU0NLICovCisJUkNBUl9HUF9QSU4oNSwgMCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmNV9jbGtfYl9tdXhbXSA9IHsKKwlTQ0s1X0JfTUFSSywKK307CisKKy8qIC0gU0NJRiBDbG9jayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNjaWZfY2xrX2FfcGluc1tdID0geworCS8qIFNDSUZfQ0xLICovCisJUkNBUl9HUF9QSU4oNiwgMjMpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZl9jbGtfYV9tdXhbXSA9IHsKKwlTQ0lGX0NMS19BX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzY2lmX2Nsa19iX3BpbnNbXSA9IHsKKwkvKiBTQ0lGX0NMSyAqLworCVJDQVJfR1BfUElOKDUsIDkpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2NpZl9jbGtfYl9tdXhbXSA9IHsKKwlTQ0lGX0NMS19CX01BUkssCit9OworCisvKiAtIFNESEkwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMF9kYXRhMV9waW5zW10gPSB7CisJLyogRDAgKi8KKwlSQ0FSX0dQX1BJTigzLCAyKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkwX2RhdGExX211eFtdID0geworCVNEMF9EQVQwX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMF9kYXRhNF9waW5zW10gPSB7CisJLyogRFswOjNdICovCisJUkNBUl9HUF9QSU4oMywgMiksIFJDQVJfR1BfUElOKDMsIDMpLAorCVJDQVJfR1BfUElOKDMsIDQpLCBSQ0FSX0dQX1BJTigzLCA1KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkwX2RhdGE0X211eFtdID0geworCVNEMF9EQVQwX01BUkssIFNEMF9EQVQxX01BUkssCisJU0QwX0RBVDJfTUFSSywgU0QwX0RBVDNfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkwX2N0cmxfcGluc1tdID0geworCS8qIENMSywgQ01EICovCisJUkNBUl9HUF9QSU4oMywgMCksIFJDQVJfR1BfUElOKDMsIDEpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTBfY3RybF9tdXhbXSA9IHsKKwlTRDBfQ0xLX01BUkssIFNEMF9DTURfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkwX2NkX3BpbnNbXSA9IHsKKwkvKiBDRCAqLworCVJDQVJfR1BfUElOKDMsIDEyKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkwX2NkX211eFtdID0geworCVNEMF9DRF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTBfd3BfcGluc1tdID0geworCS8qIFdQICovCisJUkNBUl9HUF9QSU4oMywgMTMpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTBfd3BfbXV4W10gPSB7CisJU0QwX1dQX01BUkssCit9OworLyogLSBTREhJMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTFfZGF0YTFfcGluc1tdID0geworCS8qIEQwICovCisJUkNBUl9HUF9QSU4oMywgOCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMV9kYXRhMV9tdXhbXSA9IHsKKwlTRDFfREFUMF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTFfZGF0YTRfcGluc1tdID0geworCS8qIERbMDozXSAqLworCVJDQVJfR1BfUElOKDMsIDgpLCAgUkNBUl9HUF9QSU4oMywgOSksCisJUkNBUl9HUF9QSU4oMywgMTApLCBSQ0FSX0dQX1BJTigzLCAxMSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMV9kYXRhNF9tdXhbXSA9IHsKKwlTRDFfREFUMF9NQVJLLCBTRDFfREFUMV9NQVJLLAorCVNEMV9EQVQyX01BUkssIFNEMV9EQVQzX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMV9jdHJsX3BpbnNbXSA9IHsKKwkvKiBDTEssIENNRCAqLworCVJDQVJfR1BfUElOKDMsIDYpLCBSQ0FSX0dQX1BJTigzLCA3KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkxX2N0cmxfbXV4W10gPSB7CisJU0QxX0NMS19NQVJLLCBTRDFfQ01EX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMV9jZF9waW5zW10gPSB7CisJLyogQ0QgKi8KKwlSQ0FSX0dQX1BJTigzLCAxNCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMV9jZF9tdXhbXSA9IHsKKwlTRDFfQ0RfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkxX3dwX3BpbnNbXSA9IHsKKwkvKiBXUCAqLworCVJDQVJfR1BfUElOKDMsIDE1KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkxX3dwX211eFtdID0geworCVNEMV9XUF9NQVJLLAorfTsKKy8qIC0gU0RISTIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkyX2RhdGExX3BpbnNbXSA9IHsKKwkvKiBEMCAqLworCVJDQVJfR1BfUElOKDQsIDIpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTJfZGF0YTFfbXV4W10gPSB7CisJU0QyX0RBVDBfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkyX2RhdGE0X3BpbnNbXSA9IHsKKwkvKiBEWzA6M10gKi8KKwlSQ0FSX0dQX1BJTig0LCAyKSwgUkNBUl9HUF9QSU4oNCwgMyksCisJUkNBUl9HUF9QSU4oNCwgNCksIFJDQVJfR1BfUElOKDQsIDUpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTJfZGF0YTRfbXV4W10gPSB7CisJU0QyX0RBVDBfTUFSSywgU0QyX0RBVDFfTUFSSywKKwlTRDJfREFUMl9NQVJLLCBTRDJfREFUM19NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTJfZGF0YThfcGluc1tdID0geworCS8qIERbMDo3XSAqLworCVJDQVJfR1BfUElOKDQsIDIpLCAgUkNBUl9HUF9QSU4oNCwgMyksCisJUkNBUl9HUF9QSU4oNCwgNCksICBSQ0FSX0dQX1BJTig0LCA1KSwKKwlSQ0FSX0dQX1BJTigzLCA4KSwgIFJDQVJfR1BfUElOKDMsIDkpLAorCVJDQVJfR1BfUElOKDMsIDEwKSwgUkNBUl9HUF9QSU4oMywgMTEpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTJfZGF0YThfbXV4W10gPSB7CisJU0QyX0RBVDBfTUFSSywgU0QyX0RBVDFfTUFSSywKKwlTRDJfREFUMl9NQVJLLCBTRDJfREFUM19NQVJLLAorCVNEMl9EQVQ0X01BUkssIFNEMl9EQVQ1X01BUkssCisJU0QyX0RBVDZfTUFSSywgU0QyX0RBVDdfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkyX2N0cmxfcGluc1tdID0geworCS8qIENMSywgQ01EICovCisJUkNBUl9HUF9QSU4oNCwgMCksIFJDQVJfR1BfUElOKDQsIDEpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTJfY3RybF9tdXhbXSA9IHsKKwlTRDJfQ0xLX01BUkssIFNEMl9DTURfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkyX2NkX2FfcGluc1tdID0geworCS8qIENEICovCisJUkNBUl9HUF9QSU4oNCwgMTMpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTJfY2RfYV9tdXhbXSA9IHsKKwlTRDJfQ0RfQV9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTJfY2RfYl9waW5zW10gPSB7CisJLyogQ0QgKi8KKwlSQ0FSX0dQX1BJTig1LCAxMCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMl9jZF9iX211eFtdID0geworCVNEMl9DRF9CX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMl93cF9hX3BpbnNbXSA9IHsKKwkvKiBXUCAqLworCVJDQVJfR1BfUElOKDQsIDE0KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkyX3dwX2FfbXV4W10gPSB7CisJU0QyX1dQX0FfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkyX3dwX2JfcGluc1tdID0geworCS8qIFdQICovCisJUkNBUl9HUF9QSU4oNSwgMTEpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTJfd3BfYl9tdXhbXSA9IHsKKwlTRDJfV1BfQl9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTJfZHNfcGluc1tdID0geworCS8qIERTICovCisJUkNBUl9HUF9QSU4oNCwgNiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpMl9kc19tdXhbXSA9IHsKKwlTRDJfRFNfTUFSSywKK307CisvKiAtIFNESEkzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpM19kYXRhMV9waW5zW10gPSB7CisJLyogRDAgKi8KKwlSQ0FSX0dQX1BJTig0LCA5KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkzX2RhdGExX211eFtdID0geworCVNEM19EQVQwX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpM19kYXRhNF9waW5zW10gPSB7CisJLyogRFswOjNdICovCisJUkNBUl9HUF9QSU4oNCwgOSksICBSQ0FSX0dQX1BJTig0LCAxMCksCisJUkNBUl9HUF9QSU4oNCwgMTEpLCBSQ0FSX0dQX1BJTig0LCAxMiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpM19kYXRhNF9tdXhbXSA9IHsKKwlTRDNfREFUMF9NQVJLLCBTRDNfREFUMV9NQVJLLAorCVNEM19EQVQyX01BUkssIFNEM19EQVQzX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpM19kYXRhOF9waW5zW10gPSB7CisJLyogRFswOjddICovCisJUkNBUl9HUF9QSU4oNCwgOSksICBSQ0FSX0dQX1BJTig0LCAxMCksCisJUkNBUl9HUF9QSU4oNCwgMTEpLCBSQ0FSX0dQX1BJTig0LCAxMiksCisJUkNBUl9HUF9QSU4oNCwgMTMpLCBSQ0FSX0dQX1BJTig0LCAxNCksCisJUkNBUl9HUF9QSU4oNCwgMTUpLCBSQ0FSX0dQX1BJTig0LCAxNiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpM19kYXRhOF9tdXhbXSA9IHsKKwlTRDNfREFUMF9NQVJLLCBTRDNfREFUMV9NQVJLLAorCVNEM19EQVQyX01BUkssIFNEM19EQVQzX01BUkssCisJU0QzX0RBVDRfTUFSSywgU0QzX0RBVDVfTUFSSywKKwlTRDNfREFUNl9NQVJLLCBTRDNfREFUN19NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTNfY3RybF9waW5zW10gPSB7CisJLyogQ0xLLCBDTUQgKi8KKwlSQ0FSX0dQX1BJTig0LCA3KSwgUkNBUl9HUF9QSU4oNCwgOCksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpM19jdHJsX211eFtdID0geworCVNEM19DTEtfTUFSSywgU0QzX0NNRF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTNfY2RfcGluc1tdID0geworCS8qIENEICovCisJUkNBUl9HUF9QSU4oNCwgMTUpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RoaTNfY2RfbXV4W10gPSB7CisJU0QzX0NEX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpM193cF9waW5zW10gPSB7CisJLyogV1AgKi8KKwlSQ0FSX0dQX1BJTig0LCAxNiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGhpM193cF9tdXhbXSA9IHsKKwlTRDNfV1BfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkzX2RzX3BpbnNbXSA9IHsKKwkvKiBEUyAqLworCVJDQVJfR1BfUElOKDQsIDE3KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaGkzX2RzX211eFtdID0geworCVNEM19EU19NQVJLLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9wZmNfcGluX2dyb3VwIHBpbm11eF9ncm91cHNbXSA9IHsKKwlTSF9QRkNfUElOX0dST1VQKHNjaWYwX2RhdGEpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjBfY2xrKSwKKwlTSF9QRkNfUElOX0dST1VQKHNjaWYwX2N0cmwpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjFfZGF0YV9hKSwKKwlTSF9QRkNfUElOX0dST1VQKHNjaWYxX2NsayksCisJU0hfUEZDX1BJTl9HUk9VUChzY2lmMV9jdHJsKSwKKwlTSF9QRkNfUElOX0dST1VQKHNjaWYxX2RhdGFfYiksCisJU0hfUEZDX1BJTl9HUk9VUChzY2lmMl9kYXRhX2EpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjJfY2xrKSwKKwlTSF9QRkNfUElOX0dST1VQKHNjaWYyX2RhdGFfYiksCisJU0hfUEZDX1BJTl9HUk9VUChzY2lmM19kYXRhX2EpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjNfY2xrKSwKKwlTSF9QRkNfUElOX0dST1VQKHNjaWYzX2N0cmwpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjNfZGF0YV9iKSwKKwlTSF9QRkNfUElOX0dST1VQKHNjaWY0X2RhdGFfYSksCisJU0hfUEZDX1BJTl9HUk9VUChzY2lmNF9jbGtfYSksCisJU0hfUEZDX1BJTl9HUk9VUChzY2lmNF9jdHJsX2EpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjRfZGF0YV9iKSwKKwlTSF9QRkNfUElOX0dST1VQKHNjaWY0X2Nsa19iKSwKKwlTSF9QRkNfUElOX0dST1VQKHNjaWY0X2N0cmxfYiksCisJU0hfUEZDX1BJTl9HUk9VUChzY2lmNF9kYXRhX2MpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjRfY2xrX2MpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjRfY3RybF9jKSwKKwlTSF9QRkNfUElOX0dST1VQKHNjaWY1X2RhdGFfYSksCisJU0hfUEZDX1BJTl9HUk9VUChzY2lmNV9jbGtfYSksCisJU0hfUEZDX1BJTl9HUk9VUChzY2lmNV9kYXRhX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2NpZjVfY2xrX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2NpZl9jbGtfYSksCisJU0hfUEZDX1BJTl9HUk9VUChzY2lmX2Nsa19iKSwKKwlTSF9QRkNfUElOX0dST1VQKHNkaGkwX2RhdGExKSwKKwlTSF9QRkNfUElOX0dST1VQKHNkaGkwX2RhdGE0KSwKKwlTSF9QRkNfUElOX0dST1VQKHNkaGkwX2N0cmwpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2RoaTBfY2QpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2RoaTBfd3ApLAorCVNIX1BGQ19QSU5fR1JPVVAoc2RoaTFfZGF0YTEpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2RoaTFfZGF0YTQpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2RoaTFfY3RybCksCisJU0hfUEZDX1BJTl9HUk9VUChzZGhpMV9jZCksCisJU0hfUEZDX1BJTl9HUk9VUChzZGhpMV93cCksCisJU0hfUEZDX1BJTl9HUk9VUChzZGhpMl9kYXRhMSksCisJU0hfUEZDX1BJTl9HUk9VUChzZGhpMl9kYXRhNCksCisJU0hfUEZDX1BJTl9HUk9VUChzZGhpMl9kYXRhOCksCisJU0hfUEZDX1BJTl9HUk9VUChzZGhpMl9jdHJsKSwKKwlTSF9QRkNfUElOX0dST1VQKHNkaGkyX2NkX2EpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2RoaTJfd3BfYSksCisJU0hfUEZDX1BJTl9HUk9VUChzZGhpMl9jZF9iKSwKKwlTSF9QRkNfUElOX0dST1VQKHNkaGkyX3dwX2IpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2RoaTJfZHMpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2RoaTNfZGF0YTEpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2RoaTNfZGF0YTQpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2RoaTNfZGF0YTgpLAorCVNIX1BGQ19QSU5fR1JPVVAoc2RoaTNfY3RybCksCisJU0hfUEZDX1BJTl9HUk9VUChzZGhpM19jZCksCisJU0hfUEZDX1BJTl9HUk9VUChzZGhpM193cCksCisJU0hfUEZDX1BJTl9HUk9VUChzZGhpM19kcyksCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNjaWYwX2dyb3Vwc1tdID0geworCSJzY2lmMF9kYXRhIiwKKwkic2NpZjBfY2xrIiwKKwkic2NpZjBfY3RybCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNjaWYxX2dyb3Vwc1tdID0geworCSJzY2lmMV9kYXRhX2EiLAorCSJzY2lmMV9jbGsiLAorCSJzY2lmMV9jdHJsIiwKKwkic2NpZjFfZGF0YV9iIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2NpZjJfZ3JvdXBzW10gPSB7CisJInNjaWYyX2RhdGFfYSIsCisJInNjaWYyX2NsayIsCisJInNjaWYyX2RhdGFfYiIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNjaWYzX2dyb3Vwc1tdID0geworCSJzY2lmM19kYXRhX2EiLAorCSJzY2lmM19jbGsiLAorCSJzY2lmM19jdHJsIiwKKwkic2NpZjNfZGF0YV9iIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2NpZjRfZ3JvdXBzW10gPSB7CisJInNjaWY0X2RhdGFfYSIsCisJInNjaWY0X2Nsa19hIiwKKwkic2NpZjRfY3RybF9hIiwKKwkic2NpZjRfZGF0YV9iIiwKKwkic2NpZjRfY2xrX2IiLAorCSJzY2lmNF9jdHJsX2IiLAorCSJzY2lmNF9kYXRhX2MiLAorCSJzY2lmNF9jbGtfYyIsCisJInNjaWY0X2N0cmxfYyIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNjaWY1X2dyb3Vwc1tdID0geworCSJzY2lmNV9kYXRhX2EiLAorCSJzY2lmNV9jbGtfYSIsCisJInNjaWY1X2RhdGFfYiIsCisJInNjaWY1X2Nsa19iIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2NpZl9jbGtfZ3JvdXBzW10gPSB7CisJInNjaWZfY2xrX2EiLAorCSJzY2lmX2Nsa19iIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2RoaTBfZ3JvdXBzW10gPSB7CisJInNkaGkwX2RhdGExIiwKKwkic2RoaTBfZGF0YTQiLAorCSJzZGhpMF9jdHJsIiwKKwkic2RoaTBfY2QiLAorCSJzZGhpMF93cCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkaGkxX2dyb3Vwc1tdID0geworCSJzZGhpMV9kYXRhMSIsCisJInNkaGkxX2RhdGE0IiwKKwkic2RoaTFfY3RybCIsCisJInNkaGkxX2NkIiwKKwkic2RoaTFfd3AiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZGhpMl9ncm91cHNbXSA9IHsKKwkic2RoaTJfZGF0YTEiLAorCSJzZGhpMl9kYXRhNCIsCisJInNkaGkyX2RhdGE4IiwKKwkic2RoaTJfY3RybCIsCisJInNkaGkyX2NkX2EiLAorCSJzZGhpMl93cF9hIiwKKwkic2RoaTJfY2RfYiIsCisJInNkaGkyX3dwX2IiLAorCSJzZGhpMl9kcyIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkaGkzX2dyb3Vwc1tdID0geworCSJzZGhpM19kYXRhMSIsCisJInNkaGkzX2RhdGE0IiwKKwkic2RoaTNfZGF0YTgiLAorCSJzZGhpM19jdHJsIiwKKwkic2RoaTNfY2QiLAorCSJzZGhpM193cCIsCisJInNkaGkzX2RzIiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfcGZjX2Z1bmN0aW9uIHBpbm11eF9mdW5jdGlvbnNbXSA9IHsKKwlTSF9QRkNfRlVOQ1RJT04oc2NpZjApLAorCVNIX1BGQ19GVU5DVElPTihzY2lmMSksCisJU0hfUEZDX0ZVTkNUSU9OKHNjaWYyKSwKKwlTSF9QRkNfRlVOQ1RJT04oc2NpZjMpLAorCVNIX1BGQ19GVU5DVElPTihzY2lmNCksCisJU0hfUEZDX0ZVTkNUSU9OKHNjaWY1KSwKKwlTSF9QRkNfRlVOQ1RJT04oc2NpZl9jbGspLAorCVNIX1BGQ19GVU5DVElPTihzZGhpMCksCisJU0hfUEZDX0ZVTkNUSU9OKHNkaGkxKSwKKwlTSF9QRkNfRlVOQ1RJT04oc2RoaTIpLAorCVNIX1BGQ19GVU5DVElPTihzZGhpMyksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBpbm11eF9jZmdfcmVnIHBpbm11eF9jb25maWdfcmVnc1tdID0geworI2RlZmluZSBGXyh4LCB5KQlGTl8jI3kKKyNkZWZpbmUgRk0oeCkJCUZOXyMjeAorCXsgUElOTVVYX0NGR19SRUcoIkdQU1IwIiwgMHhlNjA2MDEwMCwgMzIsIDEpIHsKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJR1BfMF8xNV9GTiwJR1BTUjBfMTUsCisJCUdQXzBfMTRfRk4sCUdQU1IwXzE0LAorCQlHUF8wXzEzX0ZOLAlHUFNSMF8xMywKKwkJR1BfMF8xMl9GTiwJR1BTUjBfMTIsCisJCUdQXzBfMTFfRk4sCUdQU1IwXzExLAorCQlHUF8wXzEwX0ZOLAlHUFNSMF8xMCwKKwkJR1BfMF85X0ZOLAlHUFNSMF85LAorCQlHUF8wXzhfRk4sCUdQU1IwXzgsCisJCUdQXzBfN19GTiwJR1BTUjBfNywKKwkJR1BfMF82X0ZOLAlHUFNSMF82LAorCQlHUF8wXzVfRk4sCUdQU1IwXzUsCisJCUdQXzBfNF9GTiwJR1BTUjBfNCwKKwkJR1BfMF8zX0ZOLAlHUFNSMF8zLAorCQlHUF8wXzJfRk4sCUdQU1IwXzIsCisJCUdQXzBfMV9GTiwJR1BTUjBfMSwKKwkJR1BfMF8wX0ZOLAlHUFNSMF8wLCB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJHUFNSMSIsIDB4ZTYwNjAxMDQsIDMyLCAxKSB7CisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCUdQXzFfMjhfRk4sCUdQU1IxXzI4LAorCQlHUF8xXzI3X0ZOLAlHUFNSMV8yNywKKwkJR1BfMV8yNl9GTiwJR1BTUjFfMjYsCisJCUdQXzFfMjVfRk4sCUdQU1IxXzI1LAorCQlHUF8xXzI0X0ZOLAlHUFNSMV8yNCwKKwkJR1BfMV8yM19GTiwJR1BTUjFfMjMsCisJCUdQXzFfMjJfRk4sCUdQU1IxXzIyLAorCQlHUF8xXzIxX0ZOLAlHUFNSMV8yMSwKKwkJR1BfMV8yMF9GTiwJR1BTUjFfMjAsCisJCUdQXzFfMTlfRk4sCUdQU1IxXzE5LAorCQlHUF8xXzE4X0ZOLAlHUFNSMV8xOCwKKwkJR1BfMV8xN19GTiwJR1BTUjFfMTcsCisJCUdQXzFfMTZfRk4sCUdQU1IxXzE2LAorCQlHUF8xXzE1X0ZOLAlHUFNSMV8xNSwKKwkJR1BfMV8xNF9GTiwJR1BTUjFfMTQsCisJCUdQXzFfMTNfRk4sCUdQU1IxXzEzLAorCQlHUF8xXzEyX0ZOLAlHUFNSMV8xMiwKKwkJR1BfMV8xMV9GTiwJR1BTUjFfMTEsCisJCUdQXzFfMTBfRk4sCUdQU1IxXzEwLAorCQlHUF8xXzlfRk4sCUdQU1IxXzksCisJCUdQXzFfOF9GTiwJR1BTUjFfOCwKKwkJR1BfMV83X0ZOLAlHUFNSMV83LAorCQlHUF8xXzZfRk4sCUdQU1IxXzYsCisJCUdQXzFfNV9GTiwJR1BTUjFfNSwKKwkJR1BfMV80X0ZOLAlHUFNSMV80LAorCQlHUF8xXzNfRk4sCUdQU1IxXzMsCisJCUdQXzFfMl9GTiwJR1BTUjFfMiwKKwkJR1BfMV8xX0ZOLAlHUFNSMV8xLAorCQlHUF8xXzBfRk4sCUdQU1IxXzAsIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIkdQU1IyIiwgMHhlNjA2MDEwOCwgMzIsIDEpIHsKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJR1BfMl8xNF9GTiwJR1BTUjJfMTQsCisJCUdQXzJfMTNfRk4sCUdQU1IyXzEzLAorCQlHUF8yXzEyX0ZOLAlHUFNSMl8xMiwKKwkJR1BfMl8xMV9GTiwJR1BTUjJfMTEsCisJCUdQXzJfMTBfRk4sCUdQU1IyXzEwLAorCQlHUF8yXzlfRk4sCUdQU1IyXzksCisJCUdQXzJfOF9GTiwJR1BTUjJfOCwKKwkJR1BfMl83X0ZOLAlHUFNSMl83LAorCQlHUF8yXzZfRk4sCUdQU1IyXzYsCisJCUdQXzJfNV9GTiwJR1BTUjJfNSwKKwkJR1BfMl80X0ZOLAlHUFNSMl80LAorCQlHUF8yXzNfRk4sCUdQU1IyXzMsCisJCUdQXzJfMl9GTiwJR1BTUjJfMiwKKwkJR1BfMl8xX0ZOLAlHUFNSMl8xLAorCQlHUF8yXzBfRk4sCUdQU1IyXzAsIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIkdQU1IzIiwgMHhlNjA2MDEwYywgMzIsIDEpIHsKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJMCwgMCwKKwkJR1BfM18xNV9GTiwJR1BTUjNfMTUsCisJCUdQXzNfMTRfRk4sCUdQU1IzXzE0LAorCQlHUF8zXzEzX0ZOLAlHUFNSM18xMywKKwkJR1BfM18xMl9GTiwJR1BTUjNfMTIsCisJCUdQXzNfMTFfRk4sCUdQU1IzXzExLAorCQlHUF8zXzEwX0ZOLAlHUFNSM18xMCwKKwkJR1BfM185X0ZOLAlHUFNSM185LAorCQlHUF8zXzhfRk4sCUdQU1IzXzgsCisJCUdQXzNfN19GTiwJR1BTUjNfNywKKwkJR1BfM182X0ZOLAlHUFNSM182LAorCQlHUF8zXzVfRk4sCUdQU1IzXzUsCisJCUdQXzNfNF9GTiwJR1BTUjNfNCwKKwkJR1BfM18zX0ZOLAlHUFNSM18zLAorCQlHUF8zXzJfRk4sCUdQU1IzXzIsCisJCUdQXzNfMV9GTiwJR1BTUjNfMSwKKwkJR1BfM18wX0ZOLAlHUFNSM18wLCB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJHUFNSNCIsIDB4ZTYwNjAxMTAsIDMyLCAxKSB7CisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCUdQXzRfMTdfRk4sCUdQU1I0XzE3LAorCQlHUF80XzE2X0ZOLAlHUFNSNF8xNiwKKwkJR1BfNF8xNV9GTiwJR1BTUjRfMTUsCisJCUdQXzRfMTRfRk4sCUdQU1I0XzE0LAorCQlHUF80XzEzX0ZOLAlHUFNSNF8xMywKKwkJR1BfNF8xMl9GTiwJR1BTUjRfMTIsCisJCUdQXzRfMTFfRk4sCUdQU1I0XzExLAorCQlHUF80XzEwX0ZOLAlHUFNSNF8xMCwKKwkJR1BfNF85X0ZOLAlHUFNSNF85LAorCQlHUF80XzhfRk4sCUdQU1I0XzgsCisJCUdQXzRfN19GTiwJR1BTUjRfNywKKwkJR1BfNF82X0ZOLAlHUFNSNF82LAorCQlHUF80XzVfRk4sCUdQU1I0XzUsCisJCUdQXzRfNF9GTiwJR1BTUjRfNCwKKwkJR1BfNF8zX0ZOLAlHUFNSNF8zLAorCQlHUF80XzJfRk4sCUdQU1I0XzIsCisJCUdQXzRfMV9GTiwJR1BTUjRfMSwKKwkJR1BfNF8wX0ZOLAlHUFNSNF8wLCB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJHUFNSNSIsIDB4ZTYwNjAxMTQsIDMyLCAxKSB7CisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCTAsIDAsCisJCUdQXzVfMjVfRk4sCUdQU1I1XzI1LAorCQlHUF81XzI0X0ZOLAlHUFNSNV8yNCwKKwkJR1BfNV8yM19GTiwJR1BTUjVfMjMsCisJCUdQXzVfMjJfRk4sCUdQU1I1XzIyLAorCQlHUF81XzIxX0ZOLAlHUFNSNV8yMSwKKwkJR1BfNV8yMF9GTiwJR1BTUjVfMjAsCisJCUdQXzVfMTlfRk4sCUdQU1I1XzE5LAorCQlHUF81XzE4X0ZOLAlHUFNSNV8xOCwKKwkJR1BfNV8xN19GTiwJR1BTUjVfMTcsCisJCUdQXzVfMTZfRk4sCUdQU1I1XzE2LAorCQlHUF81XzE1X0ZOLAlHUFNSNV8xNSwKKwkJR1BfNV8xNF9GTiwJR1BTUjVfMTQsCisJCUdQXzVfMTNfRk4sCUdQU1I1XzEzLAorCQlHUF81XzEyX0ZOLAlHUFNSNV8xMiwKKwkJR1BfNV8xMV9GTiwJR1BTUjVfMTEsCisJCUdQXzVfMTBfRk4sCUdQU1I1XzEwLAorCQlHUF81XzlfRk4sCUdQU1I1XzksCisJCUdQXzVfOF9GTiwJR1BTUjVfOCwKKwkJR1BfNV83X0ZOLAlHUFNSNV83LAorCQlHUF81XzZfRk4sCUdQU1I1XzYsCisJCUdQXzVfNV9GTiwJR1BTUjVfNSwKKwkJR1BfNV80X0ZOLAlHUFNSNV80LAorCQlHUF81XzNfRk4sCUdQU1I1XzMsCisJCUdQXzVfMl9GTiwJR1BTUjVfMiwKKwkJR1BfNV8xX0ZOLAlHUFNSNV8xLAorCQlHUF81XzBfRk4sCUdQU1I1XzAsIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIkdQU1I2IiwgMHhlNjA2MDExOCwgMzIsIDEpIHsKKwkJR1BfNl8zMV9GTiwJR1BTUjZfMzEsCisJCUdQXzZfMzBfRk4sCUdQU1I2XzMwLAorCQlHUF82XzI5X0ZOLAlHUFNSNl8yOSwKKwkJR1BfNl8yOF9GTiwJR1BTUjZfMjgsCisJCUdQXzZfMjdfRk4sCUdQU1I2XzI3LAorCQlHUF82XzI2X0ZOLAlHUFNSNl8yNiwKKwkJR1BfNl8yNV9GTiwJR1BTUjZfMjUsCisJCUdQXzZfMjRfRk4sCUdQU1I2XzI0LAorCQlHUF82XzIzX0ZOLAlHUFNSNl8yMywKKwkJR1BfNl8yMl9GTiwJR1BTUjZfMjIsCisJCUdQXzZfMjFfRk4sCUdQU1I2XzIxLAorCQlHUF82XzIwX0ZOLAlHUFNSNl8yMCwKKwkJR1BfNl8xOV9GTiwJR1BTUjZfMTksCisJCUdQXzZfMThfRk4sCUdQU1I2XzE4LAorCQlHUF82XzE3X0ZOLAlHUFNSNl8xNywKKwkJR1BfNl8xNl9GTiwJR1BTUjZfMTYsCisJCUdQXzZfMTVfRk4sCUdQU1I2XzE1LAorCQlHUF82XzE0X0ZOLAlHUFNSNl8xNCwKKwkJR1BfNl8xM19GTiwJR1BTUjZfMTMsCisJCUdQXzZfMTJfRk4sCUdQU1I2XzEyLAorCQlHUF82XzExX0ZOLAlHUFNSNl8xMSwKKwkJR1BfNl8xMF9GTiwJR1BTUjZfMTAsCisJCUdQXzZfOV9GTiwJR1BTUjZfOSwKKwkJR1BfNl84X0ZOLAlHUFNSNl84LAorCQlHUF82XzdfRk4sCUdQU1I2XzcsCisJCUdQXzZfNl9GTiwJR1BTUjZfNiwKKwkJR1BfNl81X0ZOLAlHUFNSNl81LAorCQlHUF82XzRfRk4sCUdQU1I2XzQsCisJCUdQXzZfM19GTiwJR1BTUjZfMywKKwkJR1BfNl8yX0ZOLAlHUFNSNl8yLAorCQlHUF82XzFfRk4sCUdQU1I2XzEsCisJCUdQXzZfMF9GTiwJR1BTUjZfMCwgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiR1BTUjciLCAweGU2MDYwMTFjLCAzMiwgMSkgeworCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQkwLCAwLAorCQlHUF83XzNfRk4sIEdQU1I3XzMsCisJCUdQXzdfMl9GTiwgR1BTUjdfMiwKKwkJR1BfN18xX0ZOLCBHUFNSN18xLAorCQlHUF83XzBfRk4sIEdQU1I3XzAsIH0KKwl9LAorI3VuZGVmIEZfCisjdW5kZWYgRk0KKworI2RlZmluZSBGXyh4LCB5KQl4LAorI2RlZmluZSBGTSh4KQkJRk5fIyN4LAorCXsgUElOTVVYX0NGR19SRUcoIklQU1IwIiwgMHhlNjA2MDIwMCwgMzIsIDQpIHsKKwkJSVAwXzMxXzI4CisJCUlQMF8yN18yNAorCQlJUDBfMjNfMjAKKwkJSVAwXzE5XzE2CisJCUlQMF8xNV8xMgorCQlJUDBfMTFfOAorCQlJUDBfN180CisJCUlQMF8zXzAgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiSVBTUjEiLCAweGU2MDYwMjA0LCAzMiwgNCkgeworCQlJUDFfMzFfMjgKKwkJSVAxXzI3XzI0CisJCUlQMV8yM18yMAorCQlJUDFfMTlfMTYKKwkJSVAxXzE1XzEyCisJCUlQMV8xMV84CisJCUlQMV83XzQKKwkJSVAxXzNfMCB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJJUFNSMiIsIDB4ZTYwNjAyMDgsIDMyLCA0KSB7CisJCUlQMl8zMV8yOAorCQlJUDJfMjdfMjQKKwkJSVAyXzIzXzIwCisJCUlQMl8xOV8xNgorCQlJUDJfMTVfMTIKKwkJSVAyXzExXzgKKwkJSVAyXzdfNAorCQlJUDJfM18wIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIklQU1IzIiwgMHhlNjA2MDIwYywgMzIsIDQpIHsKKwkJSVAzXzMxXzI4CisJCUlQM18yN18yNAorCQlJUDNfMjNfMjAKKwkJSVAzXzE5XzE2CisJCUlQM18xNV8xMgorCQlJUDNfMTFfOAorCQlJUDNfN180CisJCUlQM18zXzAgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiSVBTUjQiLCAweGU2MDYwMjEwLCAzMiwgNCkgeworCQlJUDRfMzFfMjgKKwkJSVA0XzI3XzI0CisJCUlQNF8yM18yMAorCQlJUDRfMTlfMTYKKwkJSVA0XzE1XzEyCisJCUlQNF8xMV84CisJCUlQNF83XzQKKwkJSVA0XzNfMCB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJJUFNSNSIsIDB4ZTYwNjAyMTQsIDMyLCA0KSB7CisJCUlQNV8zMV8yOAorCQlJUDVfMjdfMjQKKwkJSVA1XzIzXzIwCisJCUlQNV8xOV8xNgorCQlJUDVfMTVfMTIKKwkJSVA1XzExXzgKKwkJSVA1XzdfNAorCQlJUDVfM18wIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIklQU1I2IiwgMHhlNjA2MDIxOCwgMzIsIDQpIHsKKwkJSVA2XzMxXzI4CisJCUlQNl8yN18yNAorCQlJUDZfMjNfMjAKKwkJSVA2XzE5XzE2CisJCUlQNl8xNV8xMgorCQlJUDZfMTFfOAorCQlJUDZfN180CisJCUlQNl8zXzAgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiSVBTUjciLCAweGU2MDYwMjFjLCAzMiwgNCkgeworCQlJUDdfMzFfMjgKKwkJSVA3XzI3XzI0CisJCUlQN18yM18yMAorCQlJUDdfMTlfMTYKKwkJSVA3XzE1XzEyCisJCUlQN18xMV84CisJCUlQN183XzQKKwkJSVA3XzNfMCB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJJUFNSOCIsIDB4ZTYwNjAyMjAsIDMyLCA0KSB7CisJCUlQOF8zMV8yOAorCQlJUDhfMjdfMjQKKwkJSVA4XzIzXzIwCisJCUlQOF8xOV8xNgorCQlJUDhfMTVfMTIKKwkJSVA4XzExXzgKKwkJSVA4XzdfNAorCQlJUDhfM18wIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIklQU1I5IiwgMHhlNjA2MDIyNCwgMzIsIDQpIHsKKwkJSVA5XzMxXzI4CisJCUlQOV8yN18yNAorCQlJUDlfMjNfMjAKKwkJSVA5XzE5XzE2CisJCUlQOV8xNV8xMgorCQlJUDlfMTFfOAorCQlJUDlfN180CisJCUlQOV8zXzAgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiSVBTUjEwIiwgMHhlNjA2MDIyOCwgMzIsIDQpIHsKKwkJSVAxMF8zMV8yOAorCQlJUDEwXzI3XzI0CisJCUlQMTBfMjNfMjAKKwkJSVAxMF8xOV8xNgorCQlJUDEwXzE1XzEyCisJCUlQMTBfMTFfOAorCQlJUDEwXzdfNAorCQlJUDEwXzNfMCB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJJUFNSMTEiLCAweGU2MDYwMjJjLCAzMiwgNCkgeworCQlJUDExXzMxXzI4CisJCUlQMTFfMjdfMjQKKwkJSVAxMV8yM18yMAorCQlJUDExXzE5XzE2CisJCUlQMTFfMTVfMTIKKwkJSVAxMV8xMV84CisJCUlQMTFfN180CisJCUlQMTFfM18wIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIklQU1IxMiIsIDB4ZTYwNjAyMzAsIDMyLCA0KSB7CisJCUlQMTJfMzFfMjgKKwkJSVAxMl8yN18yNAorCQlJUDEyXzIzXzIwCisJCUlQMTJfMTlfMTYKKwkJSVAxMl8xNV8xMgorCQlJUDEyXzExXzgKKwkJSVAxMl83XzQKKwkJSVAxMl8zXzAgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiSVBTUjEzIiwgMHhlNjA2MDIzNCwgMzIsIDQpIHsKKwkJSVAxM18zMV8yOAorCQlJUDEzXzI3XzI0CisJCUlQMTNfMjNfMjAKKwkJSVAxM18xOV8xNgorCQlJUDEzXzE1XzEyCisJCUlQMTNfMTFfOAorCQlJUDEzXzdfNAorCQlJUDEzXzNfMCB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJJUFNSMTQiLCAweGU2MDYwMjM4LCAzMiwgNCkgeworCQlJUDE0XzMxXzI4CisJCUlQMTRfMjdfMjQKKwkJSVAxNF8yM18yMAorCQlJUDE0XzE5XzE2CisJCUlQMTRfMTVfMTIKKwkJSVAxNF8xMV84CisJCUlQMTRfN180CisJCUlQMTRfM18wIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIklQU1IxNSIsIDB4ZTYwNjAyM2MsIDMyLCA0KSB7CisJCUlQMTVfMzFfMjgKKwkJSVAxNV8yN18yNAorCQlJUDE1XzIzXzIwCisJCUlQMTVfMTlfMTYKKwkJSVAxNV8xNV8xMgorCQlJUDE1XzExXzgKKwkJSVAxNV83XzQKKwkJSVAxNV8zXzAgfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiSVBTUjE2IiwgMHhlNjA2MDI0MCwgMzIsIDQpIHsKKwkJSVAxNl8zMV8yOAorCQlJUDE2XzI3XzI0CisJCUlQMTZfMjNfMjAKKwkJSVAxNl8xOV8xNgorCQlJUDE2XzE1XzEyCisJCUlQMTZfMTFfOAorCQlJUDE2XzdfNAorCQlJUDE2XzNfMCB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJJUFNSMTciLCAweGU2MDYwMjQ0LCAzMiwgNCkgeworCQlJUDE3XzMxXzI4CisJCUlQMTdfMjdfMjQKKwkJSVAxN18yM18yMAorCQlJUDE3XzE5XzE2CisJCUlQMTdfMTVfMTIKKwkJSVAxN18xMV84CisJCUlQMTdfN180CisJCUlQMTdfM18wIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIklQU1IxOCIsIDB4ZTYwNjAyNDgsIDMyLCA0KSB7CisJCS8qIElQMThfMzFfMjggKi8gMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJLyogSVAxOF8yN18yNCAqLyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkvKiBJUDE4XzIzXzIwICovIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCS8qIElQMThfMTlfMTYgKi8gMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJLyogSVAxOF8xNV8xMiAqLyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkvKiBJUDE4XzExXzggICovIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCUlQMThfN180CisJCUlQMThfM18wIH0KKwl9LAorI3VuZGVmIEZfCisjdW5kZWYgRk0KKworI2RlZmluZSBGXyh4LCB5KQl4LAorI2RlZmluZSBGTSh4KQkJRk5fIyN4LAorCXsgUElOTVVYX0NGR19SRUdfVkFSKCJNT0RfU0VMMCIsIDB4ZTYwNjA1MDAsIDMyLAorCQkJICAgICAzLCAyLCAzLCAxLCAxLCAxLCAxLCAxLCAyLCAxLAorCQkJICAgICAxLCAyLCAxLCAxLCAxLCAyLCAyLCAxLCAyLCAzKSB7CisJCU1PRF9TRUwwXzMxXzMwXzI5CisJCU1PRF9TRUwwXzI4XzI3CisJCU1PRF9TRUwwXzI2XzI1XzI0CisJCU1PRF9TRUwwXzIzCisJCU1PRF9TRUwwXzIyCisJCU1PRF9TRUwwXzIxCisJCU1PRF9TRUwwXzIwCisJCU1PRF9TRUwwXzE5CisJCU1PRF9TRUwwXzE4XzE3CisJCU1PRF9TRUwwXzE2CisJCU1PRF9TRUwwXzE1CisJCU1PRF9TRUwwXzE0XzEzCisJCU1PRF9TRUwwXzEyCisJCU1PRF9TRUwwXzExCisJCU1PRF9TRUwwXzEwCisJCU1PRF9TRUwwXzlfOAorCQlNT0RfU0VMMF83XzYKKwkJTU9EX1NFTDBfNQorCQlNT0RfU0VMMF80XzMKKwkJLyogUkVTRVJWRUQgMiwgMSwgMCAqLworCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUdfVkFSKCJNT0RfU0VMMSIsIDB4ZTYwNjA1MDQsIDMyLAorCQkJICAgICAyLCAzLCAxLCAyLCAzLCAxLCAxLCAyLCAxLAorCQkJICAgICAyLCAxLCAxLCAxLCAxLCAxLCAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxKSB7CisJCU1PRF9TRUwxXzMxXzMwCisJCU1PRF9TRUwxXzI5XzI4XzI3CisJCU1PRF9TRUwxXzI2CisJCU1PRF9TRUwxXzI1XzI0CisJCU1PRF9TRUwxXzIzXzIyXzIxCisJCU1PRF9TRUwxXzIwCisJCU1PRF9TRUwxXzE5CisJCU1PRF9TRUwxXzE4XzE3CisJCU1PRF9TRUwxXzE2CisJCU1PRF9TRUwxXzE1XzE0CisJCU1PRF9TRUwxXzEzCisJCU1PRF9TRUwxXzEyCisJCU1PRF9TRUwxXzExCisJCU1PRF9TRUwxXzEwCisJCU1PRF9TRUwxXzkKKwkJMCwgMCwgMCwgMCwgLyogUkVTRVJWRUQgOCwgNyAqLworCQlNT0RfU0VMMV82CisJCU1PRF9TRUwxXzUKKwkJTU9EX1NFTDFfNAorCQlNT0RfU0VMMV8zCisJCU1PRF9TRUwxXzIKKwkJTU9EX1NFTDFfMQorCQlNT0RfU0VMMV8wIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUdfVkFSKCJNT0RfU0VMMiIsIDB4ZTYwNjA1MDgsIDMyLAorCQkJICAgICAxLCAxLCAxLCAyLCAxLCAzLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorCQkJICAgICA0LCA0LCA0LCAzLCAxKSB7CisJCU1PRF9TRUwyXzMxCisJCU1PRF9TRUwyXzMwCisJCU1PRF9TRUwyXzI5CisJCU1PRF9TRUwyXzI4XzI3CisJCU1PRF9TRUwyXzI2CisJCU1PRF9TRUwyXzI1XzI0XzIzCisJCU1PRF9TRUwyXzIyCisJCU1PRF9TRUwyXzIxCisJCU1PRF9TRUwyXzIwCisJCU1PRF9TRUwyXzE5CisJCU1PRF9TRUwyXzE4CisJCU1PRF9TRUwyXzE3CisJCS8qIFJFU0VSVkVEIDE2ICovCisJCTAsIDAsCisJCS8qIFJFU0VSVkVEIDE1LCAxNCwgMTMsIDEyICovCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCS8qIFJFU0VSVkVEIDExLCAxMCwgOSwgOCAqLworCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorCQkvKiBSRVNFUlZFRCA3LCA2LCA1LCA0ICovCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCS8qIFJFU0VSVkVEIDMsIDIsIDEgKi8KKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJTU9EX1NFTDJfMCB9CisJfSwKKwl7IH0sCit9OworCitzdGF0aWMgaW50IHI4YTc3OTZfcGluX3RvX3BvY2N0cmwoc3RydWN0IHNoX3BmYyAqcGZjLCB1bnNpZ25lZCBpbnQgcGluLCB1MzIgKnBvY2N0cmwpCit7CisJaW50IGJpdCA9IC1FSU5WQUw7CisKKwkqcG9jY3RybCA9IDB4ZTYwNjAzODA7CisKKwlpZiAocGluID49IFJDQVJfR1BfUElOKDMsIDApICYmIHBpbiA8PSBSQ0FSX0dQX1BJTigzLCAxMSkpCisJCWJpdCA9IHBpbiAmIDB4MWY7CisKKwlpZiAocGluID49IFJDQVJfR1BfUElOKDQsIDApICYmIHBpbiA8PSBSQ0FSX0dQX1BJTig0LCAxNykpCisJCWJpdCA9IChwaW4gJiAweDFmKSArIDEyOworCisJcmV0dXJuIGJpdDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9wZmNfc29jX29wZXJhdGlvbnMgcjhhNzc5Nl9waW5tdXhfb3BzID0geworCS5waW5fdG9fcG9jY3RybCA9IHI4YTc3OTZfcGluX3RvX3BvY2N0cmwsCit9OworCitjb25zdCBzdHJ1Y3Qgc2hfcGZjX3NvY19pbmZvIHI4YTc3OTZfcGlubXV4X2luZm8gPSB7CisJLm5hbWUgPSAicjhhNzc5NjBfcGZjIiwKKwkub3BzID0gJnI4YTc3OTZfcGlubXV4X29wcywKKwkudW5sb2NrX3JlZyA9IDB4ZTYwNjAwMDAsIC8qIFBNTVIgKi8KKworCS5mdW5jdGlvbiA9IHsgUElOTVVYX0ZVTkNUSU9OX0JFR0lOLCBQSU5NVVhfRlVOQ1RJT05fRU5EIH0sCisKKwkucGlucyA9IHBpbm11eF9waW5zLAorCS5ucl9waW5zID0gQVJSQVlfU0laRShwaW5tdXhfcGlucyksCisJLmdyb3VwcyA9IHBpbm11eF9ncm91cHMsCisJLm5yX2dyb3VwcyA9IEFSUkFZX1NJWkUocGlubXV4X2dyb3VwcyksCisJLmZ1bmN0aW9ucyA9IHBpbm11eF9mdW5jdGlvbnMsCisJLm5yX2Z1bmN0aW9ucyA9IEFSUkFZX1NJWkUocGlubXV4X2Z1bmN0aW9ucyksCisKKwkuY2ZnX3JlZ3MgPSBwaW5tdXhfY29uZmlnX3JlZ3MsCisKKwkucGlubXV4X2RhdGEgPSBwaW5tdXhfZGF0YSwKKwkucGlubXV4X2RhdGFfc2l6ZSA9IEFSUkFZX1NJWkUocGlubXV4X2RhdGEpLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvcGluY3RybC5jIGIvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9waW5jdHJsLmMKaW5kZXggZTIwOGVlMC4uYzU3NzI1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9waW5jdHJsLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9waW5jdHJsLmMKQEAgLTU5Niw2ICs1OTYsNyBAQAogCXN0cnVjdCBzaF9wZmMgKnBmYyA9IHBteC0+cGZjOwogCWVudW0gcGluX2NvbmZpZ19wYXJhbSBwYXJhbSA9IHBpbmNvbmZfdG9fY29uZmlnX3BhcmFtKCpjb25maWcpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGFyZzsKIAogCWlmICghc2hfcGZjX3BpbmNvbmZfdmFsaWRhdGUocGZjLCBfcGluLCBwYXJhbSkpCiAJCXJldHVybiAtRU5PVFNVUFA7CkBAIC02MTYsNyArNjE3LDcgQEAKIAkJaWYgKGJpYXMgIT0gcGFyYW0pCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQkqY29uZmlnID0gMDsKKwkJYXJnID0gMDsKIAkJYnJlYWs7CiAJfQogCkBAIC02MjcsNyArNjI4LDcgQEAKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCi0JCSpjb25maWcgPSByZXQ7CisJCWFyZyA9IHJldDsKIAkJYnJlYWs7CiAJfQogCkBAIC02NDYsNyArNjQ3LDcgQEAKIAkJdmFsID0gc2hfcGZjX3JlYWRfcmVnKHBmYywgcG9jY3RybCwgMzIpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZmMtPmxvY2ssIGZsYWdzKTsKIAotCQkqY29uZmlnID0gKHZhbCAmIEJJVChiaXQpKSA/IDMzMDAgOiAxODAwOworCQlhcmcgPSAodmFsICYgQklUKGJpdCkpID8gMzMwMCA6IDE4MDA7CiAJCWJyZWFrOwogCX0KIApAQCAtNjU0LDYgKzY1NSw3IEBACiAJCXJldHVybiAtRU5PVFNVUFA7CiAJfQogCisJKmNvbmZpZyA9IHBpbmNvbmZfdG9fY29uZmlnX3BhY2tlZChwYXJhbSwgYXJnKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9zaF9wZmMuaCBiL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvc2hfcGZjLmgKaW5kZXggNWU5NjZjMC4uMjM0NTQyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9zaF9wZmMuaAorKysgYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3NoX3BmYy5oCkBAIC0yNTcsOSArMjU3LDExIEBACiBleHRlcm4gY29uc3Qgc3RydWN0IHNoX3BmY19zb2NfaW5mbyByOGE3Nzc5X3Bpbm11eF9pbmZvOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBzaF9wZmNfc29jX2luZm8gcjhhNzc5MF9waW5tdXhfaW5mbzsKIGV4dGVybiBjb25zdCBzdHJ1Y3Qgc2hfcGZjX3NvY19pbmZvIHI4YTc3OTFfcGlubXV4X2luZm87CitleHRlcm4gY29uc3Qgc3RydWN0IHNoX3BmY19zb2NfaW5mbyByOGE3NzkyX3Bpbm11eF9pbmZvOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBzaF9wZmNfc29jX2luZm8gcjhhNzc5M19waW5tdXhfaW5mbzsKIGV4dGVybiBjb25zdCBzdHJ1Y3Qgc2hfcGZjX3NvY19pbmZvIHI4YTc3OTRfcGlubXV4X2luZm87CiBleHRlcm4gY29uc3Qgc3RydWN0IHNoX3BmY19zb2NfaW5mbyByOGE3Nzk1X3Bpbm11eF9pbmZvOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzaF9wZmNfc29jX2luZm8gcjhhNzc5Nl9waW5tdXhfaW5mbzsKIGV4dGVybiBjb25zdCBzdHJ1Y3Qgc2hfcGZjX3NvY19pbmZvIHNoNzIwM19waW5tdXhfaW5mbzsKIGV4dGVybiBjb25zdCBzdHJ1Y3Qgc2hfcGZjX3NvY19pbmZvIHNoNzI2NF9waW5tdXhfaW5mbzsKIGV4dGVybiBjb25zdCBzdHJ1Y3Qgc2hfcGZjX3NvY19pbmZvIHNoNzI2OV9waW5tdXhfaW5mbzsKQEAgLTM1NCw3MiArMzU2LDEwMyBAQAogICogR1AgcG9ydCBzdHlsZSAoMzIgcG9ydHMgYmFua3MpCiAgKi8KIAotI2RlZmluZSBQT1JUX0dQX0NGR18xKGJhbmssIHBpbiwgZm4sIHNmeCwgY2ZnKSBmbihiYW5rLCBwaW4sIEdQXyMjYmFuayMjXyMjcGluLCBzZngsIGNmZykKKyNkZWZpbmUgUE9SVF9HUF9DRkdfMShiYW5rLCBwaW4sIGZuLCBzZngsIGNmZykJCQkJXAorCWZuKGJhbmssIHBpbiwgR1BfIyNiYW5rIyNfIyNwaW4sIHNmeCwgY2ZnKQogI2RlZmluZSBQT1JUX0dQXzEoYmFuaywgcGluLCBmbiwgc2Z4KQlQT1JUX0dQX0NGR18xKGJhbmssIHBpbiwgZm4sIHNmeCwgMCkKIAotI2RlZmluZSBQT1JUX0dQX0NGR180KGJhbmssIGZuLCBzZngsIGNmZykJCQkJCQlcCi0JUE9SVF9HUF9DRkdfMShiYW5rLCAwLCAgZm4sIHNmeCwgY2ZnKSwgUE9SVF9HUF9DRkdfMShiYW5rLCAxLCAgZm4sIHNmeCwgY2ZnKSwJXAotCVBPUlRfR1BfQ0ZHXzEoYmFuaywgMiwgIGZuLCBzZngsIGNmZyksIFBPUlRfR1BfQ0ZHXzEoYmFuaywgMywgIGZuLCBzZngsIGNmZykKKyNkZWZpbmUgUE9SVF9HUF9DRkdfNChiYW5rLCBmbiwgc2Z4LCBjZmcpCQkJCVwKKwlQT1JUX0dQX0NGR18xKGJhbmssIDAsICBmbiwgc2Z4LCBjZmcpLAkJCQlcCisJUE9SVF9HUF9DRkdfMShiYW5rLCAxLCAgZm4sIHNmeCwgY2ZnKSwJCQkJXAorCVBPUlRfR1BfQ0ZHXzEoYmFuaywgMiwgIGZuLCBzZngsIGNmZyksCQkJCVwKKwlQT1JUX0dQX0NGR18xKGJhbmssIDMsICBmbiwgc2Z4LCBjZmcpCiAjZGVmaW5lIFBPUlRfR1BfNChiYW5rLCBmbiwgc2Z4KQlQT1JUX0dQX0NGR180KGJhbmssIGZuLCBzZngsIDApCiAKLSNkZWZpbmUgUE9SVF9HUF9DRkdfOChiYW5rLCBmbiwgc2Z4LCBjZmcpCQkJCQkJXAotCVBPUlRfR1BfQ0ZHXzQoYmFuaywgZm4sIHNmeCwgY2ZnKSwJCQkJCQlcCi0JUE9SVF9HUF9DRkdfMShiYW5rLCA0LCAgZm4sIHNmeCwgY2ZnKSwgUE9SVF9HUF9DRkdfMShiYW5rLCA1LCAgZm4sIHNmeCwgY2ZnKSwJXAotCVBPUlRfR1BfQ0ZHXzEoYmFuaywgNiwgIGZuLCBzZngsIGNmZyksIFBPUlRfR1BfQ0ZHXzEoYmFuaywgNywgIGZuLCBzZngsIGNmZykKKyNkZWZpbmUgUE9SVF9HUF9DRkdfOChiYW5rLCBmbiwgc2Z4LCBjZmcpCQkJCVwKKwlQT1JUX0dQX0NGR180KGJhbmssIGZuLCBzZngsIGNmZyksCQkJCVwKKwlQT1JUX0dQX0NGR18xKGJhbmssIDQsICBmbiwgc2Z4LCBjZmcpLAkJCQlcCisJUE9SVF9HUF9DRkdfMShiYW5rLCA1LCAgZm4sIHNmeCwgY2ZnKSwJCQkJXAorCVBPUlRfR1BfQ0ZHXzEoYmFuaywgNiwgIGZuLCBzZngsIGNmZyksCQkJCVwKKwlQT1JUX0dQX0NGR18xKGJhbmssIDcsICBmbiwgc2Z4LCBjZmcpCiAjZGVmaW5lIFBPUlRfR1BfOChiYW5rLCBmbiwgc2Z4KQlQT1JUX0dQX0NGR184KGJhbmssIGZuLCBzZngsIDApCiAKLSNkZWZpbmUgUE9SVF9HUF9DRkdfOShiYW5rLCBmbiwgc2Z4LCBjZmcpCQkJCQkJXAotCVBPUlRfR1BfQ0ZHXzgoYmFuaywgZm4sIHNmeCwgY2ZnKSwJCQkJCQlcCisjZGVmaW5lIFBPUlRfR1BfQ0ZHXzkoYmFuaywgZm4sIHNmeCwgY2ZnKQkJCQlcCisJUE9SVF9HUF9DRkdfOChiYW5rLCBmbiwgc2Z4LCBjZmcpLAkJCQlcCiAJUE9SVF9HUF9DRkdfMShiYW5rLCA4LCAgZm4sIHNmeCwgY2ZnKQogI2RlZmluZSBQT1JUX0dQXzkoYmFuaywgZm4sIHNmeCkJUE9SVF9HUF9DRkdfOShiYW5rLCBmbiwgc2Z4LCAwKQogCi0jZGVmaW5lIFBPUlRfR1BfQ0ZHXzEyKGJhbmssIGZuLCBzZngsIGNmZykJCQkJCQlcCi0JUE9SVF9HUF9DRkdfOChiYW5rLCBmbiwgc2Z4LCBjZmcpLAkJCQkJCVwKLQlQT1JUX0dQX0NGR18xKGJhbmssIDgsICBmbiwgc2Z4LCBjZmcpLCBQT1JUX0dQX0NGR18xKGJhbmssIDksICBmbiwgc2Z4LCBjZmcpLAlcCi0JUE9SVF9HUF9DRkdfMShiYW5rLCAxMCwgZm4sIHNmeCwgY2ZnKSwgUE9SVF9HUF9DRkdfMShiYW5rLCAxMSwgZm4sIHNmeCwgY2ZnKQorI2RlZmluZSBQT1JUX0dQX0NGR18xMihiYW5rLCBmbiwgc2Z4LCBjZmcpCQkJCVwKKwlQT1JUX0dQX0NGR185KGJhbmssIGZuLCBzZngsIGNmZyksCQkJCVwKKwlQT1JUX0dQX0NGR18xKGJhbmssIDksICBmbiwgc2Z4LCBjZmcpLAkJCQlcCisJUE9SVF9HUF9DRkdfMShiYW5rLCAxMCwgZm4sIHNmeCwgY2ZnKSwJCQkJXAorCVBPUlRfR1BfQ0ZHXzEoYmFuaywgMTEsIGZuLCBzZngsIGNmZykKICNkZWZpbmUgUE9SVF9HUF8xMihiYW5rLCBmbiwgc2Z4KQlQT1JUX0dQX0NGR18xMihiYW5rLCBmbiwgc2Z4LCAwKQogCi0jZGVmaW5lIFBPUlRfR1BfQ0ZHXzE0KGJhbmssIGZuLCBzZngsIGNmZykJCQkJCQlcCi0JUE9SVF9HUF9DRkdfMTIoYmFuaywgZm4sIHNmeCwgY2ZnKSwJCQkJCQlcCi0JUE9SVF9HUF9DRkdfMShiYW5rLCAxMiwgZm4sIHNmeCwgY2ZnKSwgUE9SVF9HUF9DRkdfMShiYW5rLCAxMywgZm4sIHNmeCwgY2ZnKQorI2RlZmluZSBQT1JUX0dQX0NGR18xNChiYW5rLCBmbiwgc2Z4LCBjZmcpCQkJCVwKKwlQT1JUX0dQX0NGR18xMihiYW5rLCBmbiwgc2Z4LCBjZmcpLAkJCQlcCisJUE9SVF9HUF9DRkdfMShiYW5rLCAxMiwgZm4sIHNmeCwgY2ZnKSwJCQkJXAorCVBPUlRfR1BfQ0ZHXzEoYmFuaywgMTMsIGZuLCBzZngsIGNmZykKICNkZWZpbmUgUE9SVF9HUF8xNChiYW5rLCBmbiwgc2Z4KQlQT1JUX0dQX0NGR18xNChiYW5rLCBmbiwgc2Z4LCAwKQogCi0jZGVmaW5lIFBPUlRfR1BfQ0ZHXzE1KGJhbmssIGZuLCBzZngsIGNmZykJCQkJCQlcCi0JUE9SVF9HUF9DRkdfMTQoYmFuaywgZm4sIHNmeCwgY2ZnKSwJCQkJCQlcCisjZGVmaW5lIFBPUlRfR1BfQ0ZHXzE1KGJhbmssIGZuLCBzZngsIGNmZykJCQkJXAorCVBPUlRfR1BfQ0ZHXzE0KGJhbmssIGZuLCBzZngsIGNmZyksCQkJCVwKIAlQT1JUX0dQX0NGR18xKGJhbmssIDE0LCBmbiwgc2Z4LCBjZmcpCiAjZGVmaW5lIFBPUlRfR1BfMTUoYmFuaywgZm4sIHNmeCkJUE9SVF9HUF9DRkdfMTUoYmFuaywgZm4sIHNmeCwgMCkKIAotI2RlZmluZSBQT1JUX0dQX0NGR18xNihiYW5rLCBmbiwgc2Z4LCBjZmcpCQkJCQkJXAotCVBPUlRfR1BfQ0ZHXzE0KGJhbmssIGZuLCBzZngsIGNmZyksCQkJCQkJXAotCVBPUlRfR1BfQ0ZHXzEoYmFuaywgMTQsIGZuLCBzZngsIGNmZyksIFBPUlRfR1BfQ0ZHXzEoYmFuaywgMTUsIGZuLCBzZngsIGNmZykKKyNkZWZpbmUgUE9SVF9HUF9DRkdfMTYoYmFuaywgZm4sIHNmeCwgY2ZnKQkJCQlcCisJUE9SVF9HUF9DRkdfMTUoYmFuaywgZm4sIHNmeCwgY2ZnKSwJCQkJXAorCVBPUlRfR1BfQ0ZHXzEoYmFuaywgMTUsIGZuLCBzZngsIGNmZykKICNkZWZpbmUgUE9SVF9HUF8xNihiYW5rLCBmbiwgc2Z4KQlQT1JUX0dQX0NGR18xNihiYW5rLCBmbiwgc2Z4LCAwKQogCi0jZGVmaW5lIFBPUlRfR1BfQ0ZHXzE4KGJhbmssIGZuLCBzZngsIGNmZykJCQkJCQlcCi0JUE9SVF9HUF9DRkdfMTYoYmFuaywgZm4sIHNmeCwgY2ZnKSwJCQkJCQlcCi0JUE9SVF9HUF9DRkdfMShiYW5rLCAxNiwgZm4sIHNmeCwgY2ZnKSwgUE9SVF9HUF9DRkdfMShiYW5rLCAxNywgZm4sIHNmeCwgY2ZnKQorI2RlZmluZSBQT1JUX0dQX0NGR18xNyhiYW5rLCBmbiwgc2Z4LCBjZmcpCQkJCVwKKwlQT1JUX0dQX0NGR18xNihiYW5rLCBmbiwgc2Z4LCBjZmcpLAkJCQlcCisJUE9SVF9HUF9DRkdfMShiYW5rLCAxNiwgZm4sIHNmeCwgY2ZnKQorI2RlZmluZSBQT1JUX0dQXzE3KGJhbmssIGZuLCBzZngpCVBPUlRfR1BfQ0ZHXzE3KGJhbmssIGZuLCBzZngsIDApCisKKyNkZWZpbmUgUE9SVF9HUF9DRkdfMTgoYmFuaywgZm4sIHNmeCwgY2ZnKQkJCQlcCisJUE9SVF9HUF9DRkdfMTcoYmFuaywgZm4sIHNmeCwgY2ZnKSwJCQkJXAorCVBPUlRfR1BfQ0ZHXzEoYmFuaywgMTcsIGZuLCBzZngsIGNmZykKICNkZWZpbmUgUE9SVF9HUF8xOChiYW5rLCBmbiwgc2Z4KQlQT1JUX0dQX0NGR18xOChiYW5rLCBmbiwgc2Z4LCAwKQogCi0jZGVmaW5lIFBPUlRfR1BfQ0ZHXzI2KGJhbmssIGZuLCBzZngsIGNmZykJCQkJCQlcCi0JUE9SVF9HUF9DRkdfMTgoYmFuaywgZm4sIHNmeCwgY2ZnKSwJCQkJCQlcCi0JUE9SVF9HUF9DRkdfMShiYW5rLCAxOCwgZm4sIHNmeCwgY2ZnKSwgUE9SVF9HUF9DRkdfMShiYW5rLCAxOSwgZm4sIHNmeCwgY2ZnKSwJXAotCVBPUlRfR1BfQ0ZHXzEoYmFuaywgMjAsIGZuLCBzZngsIGNmZyksIFBPUlRfR1BfQ0ZHXzEoYmFuaywgMjEsIGZuLCBzZngsIGNmZyksCVwKLQlQT1JUX0dQX0NGR18xKGJhbmssIDIyLCBmbiwgc2Z4LCBjZmcpLCBQT1JUX0dQX0NGR18xKGJhbmssIDIzLCBmbiwgc2Z4LCBjZmcpLAlcCi0JUE9SVF9HUF9DRkdfMShiYW5rLCAyNCwgZm4sIHNmeCwgY2ZnKSwgUE9SVF9HUF9DRkdfMShiYW5rLCAyNSwgZm4sIHNmeCwgY2ZnKQorI2RlZmluZSBQT1JUX0dQX0NGR18yMyhiYW5rLCBmbiwgc2Z4LCBjZmcpCQkJCVwKKwlQT1JUX0dQX0NGR18xOChiYW5rLCBmbiwgc2Z4LCBjZmcpLAkJCQlcCisJUE9SVF9HUF9DRkdfMShiYW5rLCAxOCwgZm4sIHNmeCwgY2ZnKSwJCQkJXAorCVBPUlRfR1BfQ0ZHXzEoYmFuaywgMTksIGZuLCBzZngsIGNmZyksCQkJCVwKKwlQT1JUX0dQX0NGR18xKGJhbmssIDIwLCBmbiwgc2Z4LCBjZmcpLAkJCQlcCisJUE9SVF9HUF9DRkdfMShiYW5rLCAyMSwgZm4sIHNmeCwgY2ZnKSwJCQkJXAorCVBPUlRfR1BfQ0ZHXzEoYmFuaywgMjIsIGZuLCBzZngsIGNmZykKKyNkZWZpbmUgUE9SVF9HUF8yMyhiYW5rLCBmbiwgc2Z4KQlQT1JUX0dQX0NGR18yMyhiYW5rLCBmbiwgc2Z4LCAwKQorCisjZGVmaW5lIFBPUlRfR1BfQ0ZHXzI0KGJhbmssIGZuLCBzZngsIGNmZykJCQkJXAorCVBPUlRfR1BfQ0ZHXzIzKGJhbmssIGZuLCBzZngsIGNmZyksCQkJCVwKKwlQT1JUX0dQX0NGR18xKGJhbmssIDIzLCBmbiwgc2Z4LCBjZmcpCisjZGVmaW5lIFBPUlRfR1BfMjQoYmFuaywgZm4sIHNmeCkJUE9SVF9HUF9DRkdfMjQoYmFuaywgZm4sIHNmeCwgMCkKKworI2RlZmluZSBQT1JUX0dQX0NGR18yNihiYW5rLCBmbiwgc2Z4LCBjZmcpCQkJCVwKKwlQT1JUX0dQX0NGR18yNChiYW5rLCBmbiwgc2Z4LCBjZmcpLAkJCQlcCisJUE9SVF9HUF9DRkdfMShiYW5rLCAyNCwgZm4sIHNmeCwgY2ZnKSwJCQkJXAorCVBPUlRfR1BfQ0ZHXzEoYmFuaywgMjUsIGZuLCBzZngsIGNmZykKICNkZWZpbmUgUE9SVF9HUF8yNihiYW5rLCBmbiwgc2Z4KQlQT1JUX0dQX0NGR18yNihiYW5rLCBmbiwgc2Z4LCAwKQogCi0jZGVmaW5lIFBPUlRfR1BfQ0ZHXzI4KGJhbmssIGZuLCBzZngsIGNmZykJCQkJCQlcCi0JUE9SVF9HUF9DRkdfMjYoYmFuaywgZm4sIHNmeCwgY2ZnKSwJCQkJCQlcCi0JUE9SVF9HUF9DRkdfMShiYW5rLCAyNiwgZm4sIHNmeCwgY2ZnKSwgUE9SVF9HUF9DRkdfMShiYW5rLCAyNywgZm4sIHNmeCwgY2ZnKQorI2RlZmluZSBQT1JUX0dQX0NGR18yOChiYW5rLCBmbiwgc2Z4LCBjZmcpCQkJCVwKKwlQT1JUX0dQX0NGR18yNihiYW5rLCBmbiwgc2Z4LCBjZmcpLAkJCQlcCisJUE9SVF9HUF9DRkdfMShiYW5rLCAyNiwgZm4sIHNmeCwgY2ZnKSwJCQkJXAorCVBPUlRfR1BfQ0ZHXzEoYmFuaywgMjcsIGZuLCBzZngsIGNmZykKICNkZWZpbmUgUE9SVF9HUF8yOChiYW5rLCBmbiwgc2Z4KQlQT1JUX0dQX0NGR18yOChiYW5rLCBmbiwgc2Z4LCAwKQogCi0jZGVmaW5lIFBPUlRfR1BfQ0ZHXzMwKGJhbmssIGZuLCBzZngsIGNmZykJCQkJCQlcCi0JUE9SVF9HUF9DRkdfMjgoYmFuaywgZm4sIHNmeCwgY2ZnKSwJCQkJCQlcCi0JUE9SVF9HUF9DRkdfMShiYW5rLCAyOCwgZm4sIHNmeCwgY2ZnKSwgUE9SVF9HUF9DRkdfMShiYW5rLCAyOSwgZm4sIHNmeCwgY2ZnKQorI2RlZmluZSBQT1JUX0dQX0NGR18yOShiYW5rLCBmbiwgc2Z4LCBjZmcpCQkJCVwKKwlQT1JUX0dQX0NGR18yOChiYW5rLCBmbiwgc2Z4LCBjZmcpLAkJCQlcCisJUE9SVF9HUF9DRkdfMShiYW5rLCAyOCwgZm4sIHNmeCwgY2ZnKQorI2RlZmluZSBQT1JUX0dQXzI5KGJhbmssIGZuLCBzZngpCVBPUlRfR1BfQ0ZHXzI5KGJhbmssIGZuLCBzZngsIDApCisKKyNkZWZpbmUgUE9SVF9HUF9DRkdfMzAoYmFuaywgZm4sIHNmeCwgY2ZnKQkJCQlcCisJUE9SVF9HUF9DRkdfMjkoYmFuaywgZm4sIHNmeCwgY2ZnKSwJCQkJXAorCVBPUlRfR1BfQ0ZHXzEoYmFuaywgMjksIGZuLCBzZngsIGNmZykKICNkZWZpbmUgUE9SVF9HUF8zMChiYW5rLCBmbiwgc2Z4KQlQT1JUX0dQX0NGR18zMChiYW5rLCBmbiwgc2Z4LCAwKQogCi0jZGVmaW5lIFBPUlRfR1BfQ0ZHXzMyKGJhbmssIGZuLCBzZngsIGNmZykJCQkJCQlcCi0JUE9SVF9HUF9DRkdfMzAoYmFuaywgZm4sIHNmeCwgY2ZnKSwJCQkJCQlcCi0JUE9SVF9HUF9DRkdfMShiYW5rLCAzMCwgZm4sIHNmeCwgY2ZnKSwgUE9SVF9HUF9DRkdfMShiYW5rLCAzMSwgZm4sIHNmeCwgY2ZnKQorI2RlZmluZSBQT1JUX0dQX0NGR18zMihiYW5rLCBmbiwgc2Z4LCBjZmcpCQkJCVwKKwlQT1JUX0dQX0NGR18zMChiYW5rLCBmbiwgc2Z4LCBjZmcpLAkJCQlcCisJUE9SVF9HUF9DRkdfMShiYW5rLCAzMCwgZm4sIHNmeCwgY2ZnKSwJCQkJXAorCVBPUlRfR1BfQ0ZHXzEoYmFuaywgMzEsIGZuLCBzZngsIGNmZykKICNkZWZpbmUgUE9SVF9HUF8zMihiYW5rLCBmbiwgc2Z4KQlQT1JUX0dQX0NGR18zMihiYW5rLCBmbiwgc2Z4LCAwKQogCiAjZGVmaW5lIFBPUlRfR1BfMzJfUkVWKGJhbmssIGZuLCBzZngpCQkJCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc2lyZi9waW5jdHJsLWF0bGFzNy5jIGIvZHJpdmVycy9waW5jdHJsL3NpcmYvcGluY3RybC1hdGxhczcuYwppbmRleCAxOTk1MmY3Li43ZjMwNDE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc2lyZi9waW5jdHJsLWF0bGFzNy5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9zaXJmL3BpbmN0cmwtYXRsYXM3LmMKQEAgLTcsNyArNyw3IEBACiAgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlci4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CkBAIC02MTU4LDYgKzYxNTgsMyBAQAogCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmF0bGFzN19ncGlvX2RyaXZlcik7CiB9CiBzdWJzeXNfaW5pdGNhbGwoYXRsYXM3X2dwaW9faW5pdCk7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiU0lSRlNPQyBBdGxhczcgcGluIGNvbnRyb2wgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc2lyZi9waW5jdHJsLXNpcmYuYyBiL2RyaXZlcnMvcGluY3RybC9zaXJmL3BpbmN0cmwtc2lyZi5jCmluZGV4IDc2MmMwYzkuLjBkZjcyYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zaXJmL3BpbmN0cmwtc2lyZi5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9zaXJmL3BpbmN0cmwtc2lyZi5jCkBAIC0xLDYgKzEsMTEgQEAKIC8qCiAgKiBwaW5tdXggZHJpdmVyIGZvciBDU1IgU2lSRnByaW1hSUkKICAqCisgKiBBdXRob3JzOgorICoJUm9uZ2p1biBZaW5nIDxyb25nanVuLnlpbmdAY3NyLmNvbT4KKyAqCVl1cGluZyBMdW8gPHl1cGluZy5sdW9AY3NyLmNvbT4KKyAqCUJhcnJ5IFNvbmcgPGJhb2h1YS5zb25nQGNzci5jb20+CisgKgogICogQ29weXJpZ2h0IChjKSAyMDExIC0gMjAxNCBDYW1icmlkZ2UgU2lsaWNvbiBSYWRpbyBMaW1pdGVkLCBhIENTUiBwbGMgZ3JvdXAKICAqIGNvbXBhbnkuCiAgKgpAQCAtOCw3ICsxMyw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgpAQCAtODg0LDkgKzg4OCwzIEBACiAJcmV0dXJuIHNpcmZzb2NfZ3Bpb19wcm9iZShucCk7CiB9CiBzdWJzeXNfaW5pdGNhbGwoc2lyZnNvY19ncGlvX2luaXQpOwotCi1NT0RVTEVfQVVUSE9SKCJSb25nanVuIFlpbmcgPHJvbmdqdW4ueWluZ0Bjc3IuY29tPiIpOwotTU9EVUxFX0FVVEhPUigiWXVwaW5nIEx1byA8eXVwaW5nLmx1b0Bjc3IuY29tPiIpOwotTU9EVUxFX0FVVEhPUigiQmFycnkgU29uZyA8YmFvaHVhLnNvbmdAY3NyLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiU0lSRlNPQyBwaW4gY29udHJvbCBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9zdG0zMi9LY29uZmlnIGIvZHJpdmVycy9waW5jdHJsL3N0bTMyL0tjb25maWcKaW5kZXggNGM0MGRhZS4uYzAzZGNlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3N0bTMyL0tjb25maWcKKysrIGIvZHJpdmVycy9waW5jdHJsL3N0bTMyL0tjb25maWcKQEAgLTYsMTYgKzYsMTcgQEAKIAlzZWxlY3QgUElOTVVYCiAJc2VsZWN0IEdFTkVSSUNfUElOQ09ORgogCXNlbGVjdCBHUElPTElCCisJc2VsZWN0IE1GRF9TWVNDT04KIAogY29uZmlnIFBJTkNUUkxfU1RNMzJGNDI5CiAJYm9vbCAiU1RNaWNyb2VsZWN0cm9uaWNzIFNUTTMyRjQyOSBwaW4gY29udHJvbCIgaWYgQ09NUElMRV9URVNUICYmICFNQUNIX1NUTTMyRjQyOQotCWRlcGVuZHMgb24gT0YKKwlkZXBlbmRzIG9uIE9GICYmIElSUV9ET01BSU5fSElFUkFSQ0hZCiAJZGVmYXVsdCBNQUNIX1NUTTMyRjQyOQogCXNlbGVjdCBQSU5DVFJMX1NUTTMyCiAKIGNvbmZpZyBQSU5DVFJMX1NUTTMyRjc0NgogCWJvb2wgIlNUTWljcm9lbGVjdHJvbmljcyBTVE0zMkY3NDYgcGluIGNvbnRyb2wiIGlmIENPTVBJTEVfVEVTVCAmJiAhTUFDSF9TVE0zMkY3NDYKLQlkZXBlbmRzIG9uIE9GCisJZGVwZW5kcyBvbiBPRiAmJiBJUlFfRE9NQUlOX0hJRVJBUkNIWQogCWRlZmF1bHQgTUFDSF9TVE0zMkY3NDYKIAlzZWxlY3QgUElOQ1RSTF9TVE0zMgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc3RtMzIvcGluY3RybC1zdG0zMi5jIGIvZHJpdmVycy9waW5jdHJsL3N0bTMyL3BpbmN0cmwtc3RtMzIuYwppbmRleCA0YWU1OTZiLi4yMDA2NjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc3RtMzIvcGluY3RybC1zdG0zMi5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9zdG0zMi9waW5jdHJsLXN0bTMyLmMKQEAgLTgsNiArOCw4IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9zeXNjb24uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KQEAgLTIwLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmN0cmwuaD4KICNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3Bpbm11eC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCkBAIC00MCw2ICs0Myw3IEBACiAjZGVmaW5lIFNUTTMyX0dQSU9fQUZSSAkJMHgyNAogCiAjZGVmaW5lIFNUTTMyX0dQSU9fUElOU19QRVJfQkFOSyAxNgorI2RlZmluZSBTVE0zMl9HUElPX0lSUV9MSU5FCSAxNgogCiAjZGVmaW5lIGdwaW9fcmFuZ2VfdG9fYmFuayhjaGlwKSBcCiAJCWNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3Qgc3RtMzJfZ3Bpb19iYW5rLCByYW5nZSkKQEAgLTY1LDYgKzY5LDggQEAKIAlzcGlubG9ja190IGxvY2s7CiAJc3RydWN0IGdwaW9fY2hpcCBncGlvX2NoaXA7CiAJc3RydWN0IHBpbmN0cmxfZ3Bpb19yYW5nZSByYW5nZTsKKwlzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlOworCXN0cnVjdCBpcnFfZG9tYWluICpkb21haW47CiB9OwogCiBzdHJ1Y3Qgc3RtMzJfcGluY3RybCB7CkBAIC03Nyw2ICs4Myw5IEBACiAJc3RydWN0IHN0bTMyX2dwaW9fYmFuayAqYmFua3M7CiAJdW5zaWduZWQgbmJhbmtzOwogCWNvbnN0IHN0cnVjdCBzdG0zMl9waW5jdHJsX21hdGNoX2RhdGEgKm1hdGNoX2RhdGE7CisJc3RydWN0IGlycV9kb21haW4JKmRvbWFpbjsKKwlzdHJ1Y3QgcmVnbWFwCQkqcmVnbWFwOworCXN0cnVjdCByZWdtYXBfZmllbGQJKmlycW11eFtTVE0zMl9HUElPX1BJTlNfUEVSX0JBTktdOwogfTsKIAogc3RhdGljIGlubGluZSBpbnQgc3RtMzJfZ3Bpb19waW4oaW50IGdwaW8pCkBAIC0xNzQsMTcgKzE4MywxMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgc3RtMzJfZ3Bpb190ZW1wbGF0ZSA9IHsKKworc3RhdGljIGludCBzdG0zMl9ncGlvX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCBzdG0zMl9ncGlvX2JhbmsgKmJhbmsgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKwlzdHJ1Y3QgaXJxX2Z3c3BlYyBmd3NwZWM7CisKKwlmd3NwZWMuZndub2RlID0gYmFuay0+Zndub2RlOworCWZ3c3BlYy5wYXJhbV9jb3VudCA9IDI7CisJZndzcGVjLnBhcmFtWzBdID0gb2Zmc2V0OworCWZ3c3BlYy5wYXJhbVsxXSA9IElSUV9UWVBFX05PTkU7CisKKwlyZXR1cm4gaXJxX2NyZWF0ZV9md3NwZWNfbWFwcGluZygmZndzcGVjKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2NoaXAgc3RtMzJfZ3Bpb190ZW1wbGF0ZSA9IHsKIAkucmVxdWVzdAkJPSBzdG0zMl9ncGlvX3JlcXVlc3QsCiAJLmZyZWUJCQk9IHN0bTMyX2dwaW9fZnJlZSwKIAkuZ2V0CQkJPSBzdG0zMl9ncGlvX2dldCwKIAkuc2V0CQkJPSBzdG0zMl9ncGlvX3NldCwKIAkuZGlyZWN0aW9uX2lucHV0CT0gc3RtMzJfZ3Bpb19kaXJlY3Rpb25faW5wdXQsCiAJLmRpcmVjdGlvbl9vdXRwdXQJPSBzdG0zMl9ncGlvX2RpcmVjdGlvbl9vdXRwdXQsCisJLnRvX2lycQkJCT0gc3RtMzJfZ3Bpb190b19pcnEsCit9OworCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHN0bTMyX2dwaW9faXJxX2NoaXAgPSB7CisJLm5hbWUgICAgICAgICAgID0gInN0bTMyZ3BpbyIsCisJLmlycV9lb2kJPSBpcnFfY2hpcF9lb2lfcGFyZW50LAorCS5pcnFfbWFzayAgICAgICA9IGlycV9jaGlwX21hc2tfcGFyZW50LAorCS5pcnFfdW5tYXNrICAgICA9IGlycV9jaGlwX3VubWFza19wYXJlbnQsCisJLmlycV9zZXRfdHlwZSAgID0gaXJxX2NoaXBfc2V0X3R5cGVfcGFyZW50LAorfTsKKworc3RhdGljIGludCBzdG0zMl9ncGlvX2RvbWFpbl90cmFuc2xhdGUoc3RydWN0IGlycV9kb21haW4gKmQsCisJCQkJICAgICAgIHN0cnVjdCBpcnFfZndzcGVjICpmd3NwZWMsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmh3aXJxLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKnR5cGUpCit7CisJaWYgKChmd3NwZWMtPnBhcmFtX2NvdW50ICE9IDIpIHx8CisJICAgIChmd3NwZWMtPnBhcmFtWzBdID49IFNUTTMyX0dQSU9fSVJRX0xJTkUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSpod2lycSA9IGZ3c3BlYy0+cGFyYW1bMF07CisJKnR5cGUgPSBmd3NwZWMtPnBhcmFtWzFdOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzdG0zMl9ncGlvX2RvbWFpbl9hY3RpdmF0ZShzdHJ1Y3QgaXJxX2RvbWFpbiAqZCwKKwkJCQkgICAgICAgc3RydWN0IGlycV9kYXRhICppcnFfZGF0YSkKK3sKKwlzdHJ1Y3Qgc3RtMzJfZ3Bpb19iYW5rICpiYW5rID0gZC0+aG9zdF9kYXRhOworCXN0cnVjdCBzdG0zMl9waW5jdHJsICpwY3RsID0gZGV2X2dldF9kcnZkYXRhKGJhbmstPmdwaW9fY2hpcC5wYXJlbnQpOworCisJcmVnbWFwX2ZpZWxkX3dyaXRlKHBjdGwtPmlycW11eFtpcnFfZGF0YS0+aHdpcnFdLCBiYW5rLT5yYW5nZS5pZCk7Cit9CisKK3N0YXRpYyBpbnQgc3RtMzJfZ3Bpb19kb21haW5fYWxsb2Moc3RydWN0IGlycV9kb21haW4gKmQsCisJCQkJICAgdW5zaWduZWQgaW50IHZpcnEsCisJCQkJICAgdW5zaWduZWQgaW50IG5yX2lycXMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHN0bTMyX2dwaW9fYmFuayAqYmFuayA9IGQtPmhvc3RfZGF0YTsKKwlzdHJ1Y3Qgc3RtMzJfcGluY3RybCAqcGN0bCA9IGRldl9nZXRfZHJ2ZGF0YShiYW5rLT5ncGlvX2NoaXAucGFyZW50KTsKKwlzdHJ1Y3QgaXJxX2Z3c3BlYyAqZndzcGVjID0gZGF0YTsKKwlzdHJ1Y3QgaXJxX2Z3c3BlYyBwYXJlbnRfZndzcGVjOworCWlycV9od19udW1iZXJfdCBod2lycTsKKwlpbnQgcmV0OworCisJaHdpcnEgPSBmd3NwZWMtPnBhcmFtWzBdOworCXBhcmVudF9md3NwZWMuZndub2RlID0gZC0+cGFyZW50LT5md25vZGU7CisJcGFyZW50X2Z3c3BlYy5wYXJhbV9jb3VudCA9IDI7CisJcGFyZW50X2Z3c3BlYy5wYXJhbVswXSA9IGZ3c3BlYy0+cGFyYW1bMF07CisJcGFyZW50X2Z3c3BlYy5wYXJhbVsxXSA9IGZ3c3BlYy0+cGFyYW1bMV07CisKKwlpcnFfZG9tYWluX3NldF9od2lycV9hbmRfY2hpcChkLCB2aXJxLCBod2lycSwgJnN0bTMyX2dwaW9faXJxX2NoaXAsCisJCQkJICAgICAgYmFuayk7CisKKwlyZXQgPSBncGlvY2hpcF9sb2NrX2FzX2lycSgmYmFuay0+Z3Bpb19jaGlwLCBod2lycSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHBjdGwtPmRldiwgIlVuYWJsZSB0byBjb25maWd1cmUgU1RNMzIgJXMlbGQgYXMgSVJRXG4iLAorCQkJYmFuay0+Z3Bpb19jaGlwLmxhYmVsLCBod2lycSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gaXJxX2RvbWFpbl9hbGxvY19pcnFzX3BhcmVudChkLCB2aXJxLCBucl9pcnFzLCAmcGFyZW50X2Z3c3BlYyk7CisJaWYgKHJldCkKKwkJZ3Bpb2NoaXBfdW5sb2NrX2FzX2lycSgmYmFuay0+Z3Bpb19jaGlwLCBod2lycSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzdG0zMl9ncGlvX2RvbWFpbl9mcmVlKHN0cnVjdCBpcnFfZG9tYWluICpkLCB1bnNpZ25lZCBpbnQgdmlycSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgbnJfaXJxcykKK3sKKwlzdHJ1Y3Qgc3RtMzJfZ3Bpb19iYW5rICpiYW5rID0gZC0+aG9zdF9kYXRhOworCXN0cnVjdCBpcnFfZGF0YSAqZGF0YSA9IGlycV9nZXRfaXJxX2RhdGEodmlycSk7CisKKwlpcnFfZG9tYWluX2ZyZWVfaXJxc19jb21tb24oZCwgdmlycSwgbnJfaXJxcyk7CisJZ3Bpb2NoaXBfdW5sb2NrX2FzX2lycSgmYmFuay0+Z3Bpb19jaGlwLCBkYXRhLT5od2lycSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXJxX2RvbWFpbl9vcHMgc3RtMzJfZ3Bpb19kb21haW5fb3BzID0geworCS50cmFuc2xhdGUgICAgICA9IHN0bTMyX2dwaW9fZG9tYWluX3RyYW5zbGF0ZSwKKwkuYWxsb2MgICAgICAgICAgPSBzdG0zMl9ncGlvX2RvbWFpbl9hbGxvYywKKwkuZnJlZSAgICAgICAgICAgPSBzdG0zMl9ncGlvX2RvbWFpbl9mcmVlLAorCS5hY3RpdmF0ZQk9IHN0bTMyX2dwaW9fZG9tYWluX2FjdGl2YXRlLAogfTsKIAogLyogUGluY3RybCBmdW5jdGlvbnMgKi8KLQogc3RhdGljIHN0cnVjdCBzdG0zMl9waW5jdHJsX2dyb3VwICoKIHN0bTMyX3BjdHJsX2ZpbmRfZ3JvdXBfYnlfcGluKHN0cnVjdCBzdG0zMl9waW5jdHJsICpwY3RsLCB1MzIgcGluKQogewpAQCAtODU3LDYgKzk2MiwxNyBAQAogCXJhbmdlLT5waW5fYmFzZSA9IHJhbmdlLT5iYXNlID0gcmFuZ2UtPmlkICogU1RNMzJfR1BJT19QSU5TX1BFUl9CQU5LOwogCXJhbmdlLT5ucGlucyA9IGJhbmstPmdwaW9fY2hpcC5uZ3BpbzsKIAlyYW5nZS0+Z2MgPSAmYmFuay0+Z3Bpb19jaGlwOworCisJLyogY3JlYXRlIGlycSBoaWVyYXJjaGljYWwgZG9tYWluICovCisJYmFuay0+Zndub2RlID0gb2Zfbm9kZV90b19md25vZGUobnApOworCisJYmFuay0+ZG9tYWluID0gaXJxX2RvbWFpbl9jcmVhdGVfaGllcmFyY2h5KHBjdGwtPmRvbWFpbiwgMCwKKwkJCQkJU1RNMzJfR1BJT19JUlFfTElORSwgYmFuay0+Zndub2RlLAorCQkJCQkmc3RtMzJfZ3Bpb19kb21haW5fb3BzLCBiYW5rKTsKKworCWlmICghYmFuay0+ZG9tYWluKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCWVyciA9IGdwaW9jaGlwX2FkZF9kYXRhKCZiYW5rLT5ncGlvX2NoaXAsIGJhbmspOwogCWlmIChlcnIpIHsKIAkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gYWRkIGdwaW9jaGlwKCVkKSFcbiIsIGJhbmtfbnIpOwpAQCAtODY3LDYgKzk4Myw0NyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHN0bTMyX3BjdHJsX2R0X3NldHVwX2lycShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJICAgc3RydWN0IHN0bTMyX3BpbmN0cmwgKnBjdGwpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlLCAqcGFyZW50OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IHJlZ21hcCAqcm07CisJaW50IG9mZnNldCwgcmV0LCBpOworCisJcGFyZW50ID0gb2ZfaXJxX2ZpbmRfcGFyZW50KG5wKTsKKwlpZiAoIXBhcmVudCkKKwkJcmV0dXJuIC1FTlhJTzsKKworCXBjdGwtPmRvbWFpbiA9IGlycV9maW5kX2hvc3QocGFyZW50KTsKKwlpZiAoIXBjdGwtPmRvbWFpbikKKwkJcmV0dXJuIC1FTlhJTzsKKworCXBjdGwtPnJlZ21hcCA9IHN5c2Nvbl9yZWdtYXBfbG9va3VwX2J5X3BoYW5kbGUobnAsICJzdCxzeXNjZmciKTsKKwlpZiAoSVNfRVJSKHBjdGwtPnJlZ21hcCkpCisJCXJldHVybiBQVFJfRVJSKHBjdGwtPnJlZ21hcCk7CisKKwlybSA9IHBjdGwtPnJlZ21hcDsKKworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2luZGV4KG5wLCAic3Qsc3lzY2ZnIiwgMSwgJm9mZnNldCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBTVE0zMl9HUElPX1BJTlNfUEVSX0JBTks7IGkrKykgeworCQlzdHJ1Y3QgcmVnX2ZpZWxkIG11eDsKKworCQltdXgucmVnID0gb2Zmc2V0ICsgKGkgLyA0KSAqIDQ7CisJCW11eC5sc2IgPSAoaSAlIDQpICogNDsKKwkJbXV4Lm1zYiA9IG11eC5sc2IgKyAzOworCisJCXBjdGwtPmlycW11eFtpXSA9IGRldm1fcmVnbWFwX2ZpZWxkX2FsbG9jKGRldiwgcm0sIG11eCk7CisJCWlmIChJU19FUlIocGN0bC0+aXJxbXV4W2ldKSkKKwkJCXJldHVybiBQVFJfRVJSKHBjdGwtPmlycW11eFtpXSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgc3RtMzJfcGN0cmxfYnVpbGRfc3RhdGUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgc3RtMzJfcGluY3RybCAqcGN0bCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwpAQCAtOTM1LDYgKzEwOTIsMTAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJcmV0ID0gc3RtMzJfcGN0cmxfZHRfc2V0dXBfaXJxKHBkZXYsIHBjdGwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKG5wLCBjaGlsZCkKIAkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChjaGlsZCwgImdwaW8tY29udHJvbGxlciIpKQogCQkJYmFua3MrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9zdW54aS9LY29uZmlnIGIvZHJpdmVycy9waW5jdHJsL3N1bnhpL0tjb25maWcKaW5kZXggYWFmMDc1Yi4uYmZmMWZmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3N1bnhpL0tjb25maWcKKysrIGIvZHJpdmVycy9waW5jdHJsL3N1bnhpL0tjb25maWcKQEAgLTE3LDYgKzE3LDEwIEBACiAJZGVmX2Jvb2wgTUFDSF9TVU41SQogCXNlbGVjdCBQSU5DVFJMX1NVTlhJCiAKK2NvbmZpZyBQSU5DVFJMX0dSOAorCWRlZl9ib29sIE1BQ0hfU1VONUkKKwlzZWxlY3QgUElOQ1RSTF9TVU5YSV9DT01NT04KKwogY29uZmlnIFBJTkNUUkxfU1VONklfQTMxCiAJZGVmX2Jvb2wgTUFDSF9TVU42SQogCXNlbGVjdCBQSU5DVFJMX1NVTlhJCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc3VueGkvTWFrZWZpbGUgYi9kcml2ZXJzL3BpbmN0cmwvc3VueGkvTWFrZWZpbGUKaW5kZXggMmQ4YjY0ZS4uOTVmOTNkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3N1bnhpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGluY3RybC9zdW54aS9NYWtlZmlsZQpAQCAtNSw2ICs1LDcgQEAKIG9iai0kKENPTkZJR19QSU5DVFJMX1NVTjRJX0ExMCkJCSs9IHBpbmN0cmwtc3VuNGktYTEwLm8KIG9iai0kKENPTkZJR19QSU5DVFJMX1NVTjVJX0ExMFMpCSs9IHBpbmN0cmwtc3VuNWktYTEwcy5vCiBvYmotJChDT05GSUdfUElOQ1RSTF9TVU41SV9BMTMpCQkrPSBwaW5jdHJsLXN1bjVpLWExMy5vCitvYmotJChDT05GSUdfUElOQ1RSTF9HUjgpCQkrPSBwaW5jdHJsLWdyOC5vCiBvYmotJChDT05GSUdfUElOQ1RSTF9TVU42SV9BMzEpCQkrPSBwaW5jdHJsLXN1bjZpLWEzMS5vCiBvYmotJChDT05GSUdfUElOQ1RSTF9TVU42SV9BMzFTKQkrPSBwaW5jdHJsLXN1bjZpLWEzMXMubwogb2JqLSQoQ09ORklHX1BJTkNUUkxfU1VONklfQTMxX1IpCSs9IHBpbmN0cmwtc3VuNmktYTMxLXIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtZ3I4LmMgYi9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1ncjguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTA0ZDJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtZ3I4LmMKQEAgLTAsMCArMSw1NDEgQEAKKy8qCisgKiBOZXh0VGhpbmcgR1I4IFNvQ3MgcGluY3RybCBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IE15bGVuZSBKb3NzZXJhbmQKKyAqCisgKiBCYXNlZCBvbiBwaW5jdHJsLXN1bjVpLWExMy5jCisgKgorICogTXlsZW5lIEpvc3NlcmFuZCA8bXlsZW5lLmpvc3NlcmFuZEBmcmVlLWVsZWN0cm9ucy5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jdHJsLmg+CisKKyNpbmNsdWRlICJwaW5jdHJsLXN1bnhpLmgiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VueGlfZGVzY19waW4gc3VuNWlfZ3I4X3BpbnNbXSA9IHsKKwkvKiBIb2xlICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEIsIDApLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImkyYzAiKSksCQkvKiBTQ0sgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQiwgMSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAiaTJjMCIpKSwJCS8qIFNEQSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihCLCAyKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJwd20wIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAic3BkaWYiKSwJCS8qIERPICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgMTYpKSwJCS8qIEVJTlQxNiAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihCLCAzKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJpcjAiKSwJCS8qIFRYICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgMTcpKSwJCS8qIEVJTlQxNyAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihCLCA0KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJpcjAiKSwJCS8qIFJYICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgMTgpKSwJCS8qIEVJTlQxOCAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihCLCA1KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJpMnMwIiksCQkvKiBNQ0xLICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgMTkpKSwJCS8qIEVJTlQxOSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihCLCA2KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJpMnMwIiksCQkvKiBCQ0xLICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgMjApKSwJCS8qIEVJTlQyMCAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihCLCA3KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJpMnMwIiksCQkvKiBMUkNLICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgMjEpKSwJCS8qIEVJTlQyMSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihCLCA4KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJpMnMwIiksCQkvKiBETyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUSgweDYsIDIyKSksCQkvKiBFSU5UMjIgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQiwgOSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAiaTJzMCIpLAkJLyogREkgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJzcGRpZiIpLAkJLyogREkgKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAyMykpLAkJLyogRUlOVDIzICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEIsIDEwKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJzcGkyIiksCQkvKiBDUzEgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJzcGRpZiIpLAkJLyogRE8gKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAyNCkpLAkJLyogRUlOVDI0ICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEIsIDExKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJzcGkyIiksCQkvKiBDUzAgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJqdGFnIiksCQkvKiBNUzAgKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAyNSkpLAkJLyogRUlOVDI1ICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEIsIDEyKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJzcGkyIiksCQkvKiBDTEsgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJqdGFnIiksCQkvKiBDSzAgKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAyNikpLAkJLyogRUlOVDI2ICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEIsIDEzKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJzcGkyIiksCQkvKiBNT1NJICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAianRhZyIpLAkJLyogRE8wICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgMjcpKSwJCS8qIEVJTlQyNyAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihCLCAxNCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAic3BpMiIpLAkJLyogTUlTTyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImp0YWciKSwJCS8qIERJMCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUSgweDYsIDI4KSksCQkvKiBFSU5UMjggKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQiwgMTUpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImkyYzEiKSksCQkvKiBTQ0sgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQiwgMTYpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImkyYzEiKSksCQkvKiBTREEgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQiwgMTcpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImkyYzIiKSksCQkvKiBTQ0sgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQiwgMTgpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImkyYzIiKSksCQkvKiBTREEgKi8KKwkvKiBIb2xlICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEMsIDApLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm5hbmQwIiksCQkvKiBOV0UgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJzcGkwIikpLAkJLyogTU9TSSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihDLCAxKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJuYW5kMCIpLAkJLyogTkFMRSAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgInNwaTAiKSksCQkvKiBNSVNPICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEMsIDIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm5hbmQwIiksCQkvKiBOQ0xFICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAic3BpMCIpKSwJCS8qIENMSyAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihDLCAzKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJuYW5kMCIpLAkJLyogTkNFMSAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgInNwaTAiKSksCQkvKiBDUzAgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQywgNCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibmFuZDAiKSksCS8qIE5DRTAgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQywgNSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibmFuZDAiKSksCS8qIE5SRSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihDLCA2KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJuYW5kMCIpLAkJLyogTlJCMCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgIm1tYzIiKSksCQkvKiBDTUQgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQywgNyksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibmFuZDAiKSwJCS8qIE5SQjEgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJtbWMyIikpLAkJLyogQ0xLICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEMsIDgpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm5hbmQwIiksCQkvKiBORFEwICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAibW1jMiIpKSwJCS8qIEQwICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEMsIDkpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm5hbmQwIiksCQkvKiBORFExICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAibW1jMiIpKSwJCS8qIEQxICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEMsIDEwKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJuYW5kMCIpLAkJLyogTkRRMiAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgIm1tYzIiKSksCQkvKiBEMiAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihDLCAxMSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibmFuZDAiKSwJCS8qIE5EUTMgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJtbWMyIikpLAkJLyogRDMgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQywgMTIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm5hbmQwIiksCQkvKiBORFE0ICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAibW1jMiIpKSwJCS8qIEQ0ICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEMsIDEzKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJuYW5kMCIpLAkJLyogTkRRNSAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgIm1tYzIiKSksCQkvKiBENSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihDLCAxNCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibmFuZDAiKSwJCS8qIE5EUTYgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJtbWMyIikpLAkJLyogRDYgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQywgMTUpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm5hbmQwIiksCQkvKiBORFE3ICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAibW1jMiIpKSwJCS8qIEQ3ICovCisJLyogSG9sZSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihDLCAxOSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibmFuZDAiKSwJCS8qIE5EUVMgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJ1YXJ0MiIpLAkJLyogUlggKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDQsICJ1YXJ0MyIpKSwJLyogUlRTICovCisJLyogSG9sZSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihELCAyKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJsY2QwIiksCQkvKiBEMiAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgInVhcnQyIikpLAkvKiBUWCAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihELCAzKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJsY2QwIiksCQkvKiBEMyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgInVhcnQyIikpLAkvKiBSWCAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihELCA0KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJsY2QwIiksCQkvKiBENCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgInVhcnQyIikpLAkvKiBDVFMgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRCwgNSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibGNkMCIpLAkJLyogRDUgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJ1YXJ0MiIpKSwJLyogUlRTICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEQsIDYpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImxjZDAiKSwJCS8qIEQ2ICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiZW1hYyIpKSwJCS8qIEVDUlMgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRCwgNyksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibGNkMCIpLAkJLyogRDcgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJlbWFjIikpLAkJLyogRUNPTCAqLworCS8qIEhvbGUgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRCwgMTApLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImxjZDAiKSwJCS8qIEQxMCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImVtYWMiKSksCQkvKiBFUlhEMCAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihELCAxMSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibGNkMCIpLAkJLyogRDExICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiZW1hYyIpKSwJCS8qIEVSWEQxICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEQsIDEyKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJsY2QwIiksCQkvKiBEMTIgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJlbWFjIikpLAkJLyogRVJYRDIgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRCwgMTMpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImxjZDAiKSwJCS8qIEQxMyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImVtYWMiKSksCQkvKiBFUlhEMyAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihELCAxNCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibGNkMCIpLAkJLyogRDE0ICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiZW1hYyIpKSwJCS8qIEVSWENLICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEQsIDE1KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJsY2QwIiksCQkvKiBEMTUgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJlbWFjIikpLAkJLyogRVJYRVJSICovCisJLyogSG9sZSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihELCAxOCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibGNkMCIpLAkJLyogRDE4ICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiZW1hYyIpKSwJCS8qIEVSWERWICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEQsIDE5KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJsY2QwIiksCQkvKiBEMTkgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJlbWFjIikpLAkJLyogRVRYRDAgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRCwgMjApLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImxjZDAiKSwJCS8qIEQyMCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImVtYWMiKSksCQkvKiBFVFhEMSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihELCAyMSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibGNkMCIpLAkJLyogRDIxICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiZW1hYyIpKSwJCS8qIEVUWEQyICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEQsIDIyKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJsY2QwIiksCQkvKiBEMjIgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJlbWFjIikpLAkJLyogRVRYRDMgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRCwgMjMpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImxjZDAiKSwJCS8qIEQyMyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImVtYWMiKSksCQkvKiBFVFhFTiAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihELCAyNCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibGNkMCIpLAkJLyogQ0xLICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiZW1hYyIpKSwJCS8qIEVUWENLICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEQsIDI1KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJsY2QwIiksCQkvKiBERSAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImVtYWMiKSksCQkvKiBFVFhFUlIqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihELCAyNiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibGNkMCIpLAkJLyogSFNZTkMgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJlbWFjIikpLAkJLyogRU1EQyAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihELCAyNyksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibGNkMCIpLAkJLyogVlNZTkMgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJlbWFjIikpLAkJLyogRU1ESU8gKi8KKwkvKiBIb2xlICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEUsIDApLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJ0czAiKSwJCS8qIENMSyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImNzaTAiKSwJCS8qIFBDTEsgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDQsICJzcGkyIiksCQkvKiBDUzAgKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAxNCkpLAkJLyogRUlOVDE0ICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEUsIDEpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJ0czAiKSwJCS8qIEVSUiAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImNzaTAiKSwJCS8qIE1DTEsgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDQsICJzcGkyIiksCQkvKiBDTEsgKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAxNSkpLAkJLyogRUlOVDE1ICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEUsIDIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJ0czAiKSwJCS8qIFNZTkMgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJjc2kwIiksCQkvKiBIU1lOQyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NCwgInNwaTIiKSksCQkvKiBNT1NJICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEUsIDMpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInRzMCIpLAkJLyogRFZMRCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImNzaTAiKSwJCS8qIFZTWU5DICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAic3BpMiIpKSwJCS8qIE1JU08gKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRSwgNCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAidHMwIiksCQkvKiBEMCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImNzaTAiKSwJCS8qIEQwICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAibW1jMiIpKSwJCS8qIEQwICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEUsIDUpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInRzMCIpLAkJLyogRDEgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJjc2kwIiksCQkvKiBEMSAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NCwgIm1tYzIiKSksCQkvKiBEMSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihFLCA2KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJ0czAiKSwJCS8qIEQyICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiY3NpMCIpLAkJLyogRDIgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDQsICJtbWMyIikpLAkJLyogRDIgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRSwgNyksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAidHMwIiksCQkvKiBEMyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImNzaTAiKSwJCS8qIEQzICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAibW1jMiIpKSwJCS8qIEQzICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEUsIDgpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInRzMCIpLAkJLyogRDQgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJjc2kwIiksCQkvKiBENCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NCwgIm1tYzIiKSksCQkvKiBDTUQgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRSwgOSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAidHMwIiksCQkvKiBENSAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImNzaTAiKSwJCS8qIEQ1ICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAibW1jMiIpKSwJCS8qIENMSyAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihFLCAxMCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAidHMwIiksCQkvKiBENiAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImNzaTAiKSwJCS8qIEQ2ICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAidWFydDEiKSksCS8qIFRYICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEUsIDExKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJ0czAiKSwJCS8qIEQ3ICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiY3NpMCIpLAkJLyogRDcgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDQsICJ1YXJ0MSIpKSwJLyogUlggKi8KKwkvKiBIb2xlICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEYsIDApLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm1tYzAiKSwJCS8qIEQxICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAianRhZyIpKSwJCS8qIE1TMSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihGLCAxKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJtbWMwIiksCQkvKiBEMCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NCwgImp0YWciKSksCQkvKiBESTEgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRiwgMiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibW1jMCIpLAkJLyogQ0xLICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAidWFydDAiKSksCS8qIFRYICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEYsIDMpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm1tYzAiKSwJCS8qIENNRCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NCwgImp0YWciKSksCQkvKiBETzEgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRiwgNCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibW1jMCIpLAkJLyogRDMgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDQsICJ1YXJ0MCIpKSwJLyogUlggKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRiwgNSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibW1jMCIpLAkJLyogRDIgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDQsICJqdGFnIikpLAkJLyogQ0sxICovCisJLyogSG9sZSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihHLCAwKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAiZ3BzIiksCQkvKiBDTEsgKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAwKSksCQkvKiBFSU5UMCAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihHLCAxKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAiZ3BzIiksCQkvKiBTSUdOICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgMSkpLAkJLyogRUlOVDEgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRywgMiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImdwcyIpLAkJLyogTUFHICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgMikpLAkJLyogRUlOVDIgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRywgMyksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibW1jMSIpLAkJLyogQ01EICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAibXMiKSwJCS8qIEJTICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAidWFydDEiKSwJCS8qIFRYICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgMykpLAkJLyogRUlOVDMgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRywgNCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibW1jMSIpLAkJLyogQ0xLICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAibXMiKSwJCS8qIENMSyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NCwgInVhcnQxIiksCQkvKiBSWCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUSgweDYsIDQpKSwJCS8qIEVJTlQ0ICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEcsIDUpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm1tYzEiKSwJCS8qIEQwICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAibXMiKSwJCS8qIEQwICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAidWFydDEiKSwJCS8qIENUUyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUSgweDYsIDUpKSwJCS8qIEVJTlQ1ICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEcsIDYpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm1tYzEiKSwJCS8qIEQxICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAibXMiKSwJCS8qIEQxICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAidWFydDEiKSwJCS8qIFJUUyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NSwgInVhcnQyIiksCQkvKiBSVFMgKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCA2KSksCQkvKiBFSU5UNiAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihHLCA3KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJtbWMxIiksCQkvKiBEMiAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgIm1zIiksCQkvKiBEMiAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NSwgInVhcnQyIiksCQkvKiBUWCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUSgweDYsIDcpKSwJCS8qIEVJTlQ3ICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEcsIDgpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm1tYzEiKSwJCS8qIEQzICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAibXMiKSwJCS8qIEQzICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg1LCAidWFydDIiKSwJCS8qIFJYICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgOCkpLAkJLyogRUlOVDggKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRywgOSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAic3BpMSIpLAkJLyogQ1MwICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAidWFydDMiKSwJCS8qIFRYICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgOSkpLAkJLyogRUlOVDkgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRywgMTApLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInNwaTEiKSwJCS8qIENMSyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgInVhcnQzIiksCQkvKiBSWCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUSgweDYsIDEwKSksCQkvKiBFSU5UMTAgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRywgMTEpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInNwaTEiKSwJCS8qIE1PU0kgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJ1YXJ0MyIpLAkJLyogQ1RTICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgMTEpKSwJCS8qIEVJTlQxMSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihHLCAxMiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAic3BpMSIpLAkJLyogTUlTTyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgInVhcnQzIiksCQkvKiBSVFMgKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAxMikpLAkJLyogRUlOVDEyICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEcsIDEzKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJzcGkxIiksCQkvKiBDUzEgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJwd20xIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHg1LCAidWFydDIiKSwJCS8qIENUUyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUSgweDYsIDEzKSksCQkvKiBFSU5UMTMgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VueGlfcGluY3RybF9kZXNjIHN1bjVpX2dyOF9waW5jdHJsX2RhdGEgPSB7CisJLnBpbnMgPSBzdW41aV9ncjhfcGlucywKKwkubnBpbnMgPSBBUlJBWV9TSVpFKHN1bjVpX2dyOF9waW5zKSwKKwkuaXJxX2JhbmtzID0gMSwKK307CisKK3N0YXRpYyBpbnQgc3VuNWlfZ3I4X3BpbmN0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gc3VueGlfcGluY3RybF9pbml0KHBkZXYsCisJCQkJICAmc3VuNWlfZ3I4X3BpbmN0cmxfZGF0YSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN1bjVpX2dyOF9waW5jdHJsX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJuZXh0dGhpbmcsZ3I4LXBpbmN0cmwiLCB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc3VuNWlfZ3I4X3BpbmN0cmxfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzdW41aV9ncjhfcGluY3RybF9kcml2ZXIgPSB7CisJLnByb2JlCT0gc3VuNWlfZ3I4X3BpbmN0cmxfcHJvYmUsCisJLmRyaXZlcgk9IHsKKwkJLm5hbWUJCT0gImdyOC1waW5jdHJsIiwKKwkJLm9mX21hdGNoX3RhYmxlCT0gc3VuNWlfZ3I4X3BpbmN0cmxfbWF0Y2gsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHN1bjVpX2dyOF9waW5jdHJsX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIk15bGVuZSBKb3NzZXJhbmQgPG15bGVuZS5qb3NzZXJhbmRAZnJlZS1lbGVjdHJvbnMuY29tIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk5leHRUaGluZyBHUjggcGluY3RybCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjZpLWEzMS5jIGIvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuNmktYTMxLmMKaW5kZXggMDIyODYzYS4uYTcwYjUyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuNmktYTMxLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuNmktYTMxLmMKQEAgLTg5NiwxMCArODk2LDE4IEBACiAJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSksCiAJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEgsIDI3KSwKIAkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCi0JCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJLyoKKwkJICogVGhlIFNQRElGIGJsb2NrIGlzIG5vdCByZWZlcmVuY2VkIGF0IGFsbCBpbiB0aGUgQTMxIHVzZXIKKwkJICogbWFudWFsLiBIb3dldmVyIGl0IGlzIGRlc2NyaWJlZCBpbiB0aGUgY29kZSBsZWFrZWQgYW5kIHRoZQorCQkgKiBjb25maWd1cmF0aW9uIGZpbGVzIHN1cHBsaWVkIGJ5IHZlbmRvcnMuCisJCSAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgInNwZGlmIikpLCAgICAgICAgLyogU1BESUYgSU4gKi8KIAlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oSCwgMjgpLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKLQkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkvKiBVbmRvY3VtZW50ZWQgbXV4IGZ1bmN0aW9uIC0gc2VlIGFib3ZlICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAic3BkaWYiKSksICAgICAgICAvKiBTUERJRiBPVVQgKi8KIAlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oSCwgMjkpLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKIAkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuOGktYTIzLmMgYi9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW44aS1hMjMuYwppbmRleCBjZTQ4M2IwLi5mOWQ2NjFlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuOGktYTIzLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuOGktYTIzLmMKQEAgLTQ4NSwxMiArNDg1LDEyIEBACiAJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEcsIDgpLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKIAkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAotCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInVhcnQyIiksCQkvKiBSVFMgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJ1YXJ0MSIpLAkJLyogUlRTICovCiAJCSAgU1VOWElfRlVOQ1RJT05fSVJRX0JBTksoMHg0LCAyLCA4KSksCS8qIFBHX0VJTlQ4ICovCiAJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEcsIDkpLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKIAkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAotCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInVhcnQyIiksCQkvKiBDVFMgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJ1YXJ0MSIpLAkJLyogQ1RTICovCiAJCSAgU1VOWElfRlVOQ1RJT05fSVJRX0JBTksoMHg0LCAyLCA5KSksCS8qIFBHX0VJTlQ5ICovCiAJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEcsIDEwKSwKIAkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW44aS1hMzMuYyBiL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjhpLWEzMy5jCmluZGV4IDMwNDBhYmUuLjMxMzFjYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjhpLWEzMy5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjhpLWEzMy5jCkBAIC00MDcsMTIgKzQwNywxMiBAQAogCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihHLCA4KSwKIAkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCiAJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKLQkJICBTVU5YSV9GVU5DVElPTigweDIsICJ1YXJ0MiIpLAkJLyogUlRTICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAidWFydDEiKSwJCS8qIFJUUyAqLwogCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUV9CQU5LKDB4NCwgMSwgOCkpLAkvKiBQR19FSU5UOCAqLwogCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihHLCA5KSwKIAkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCiAJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKLQkJICBTVU5YSV9GVU5DVElPTigweDIsICJ1YXJ0MiIpLAkJLyogQ1RTICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAidWFydDEiKSwJCS8qIENUUyAqLwogCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUV9CQU5LKDB4NCwgMSwgOSkpLAkvKiBQR19FSU5UOSAqLwogCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihHLCAxMCksCiAJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuOGktaDMuYyBiL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjhpLWgzLmMKaW5kZXggMjZhMmFkMy4uNTE4YTkyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuOGktaDMuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW44aS1oMy5jCkBAIC02MCw3ICs2MCw2IEBACiAJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCiAJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAic2ltIiksCQkvKiBQV1JFTiAqLwotCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgInB3bTEiKSwKIAkJICBTVU5YSV9GVU5DVElPTl9JUlFfQkFOSygweDYsIDAsIDYpKSwJLyogUEFfRUlOVDYgKi8KIAlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQSwgNyksCiAJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VueGkuYyBiL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bnhpLmMKaW5kZXggNTQ0NTVhZi4uMGZhY2JlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VueGkuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW54aS5jCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSAiLi4vY29yZS5oIgotI2luY2x1ZGUgIi4uLy4uL2dwaW8vZ3Bpb2xpYi5oIgogI2luY2x1ZGUgInBpbmN0cmwtc3VueGkuaCIKIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBzdW54aV9waW5jdHJsX2VkZ2VfaXJxX2NoaXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL29scGMvb2xwYy1lYy5jIGIvZHJpdmVycy9wbGF0Zm9ybS9vbHBjL29scGMtZWMuYwppbmRleCBmOTliMTgzLi4zNzRhODAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL29scGMvb2xwYy1lYy5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0vb2xwYy9vbHBjLWVjLmMKQEAgLTEsNiArMSw4IEBACiAvKgogICogR2VuZXJpYyBkcml2ZXIgZm9yIHRoZSBPTFBDIEVtYmVkZGVkIENvbnRyb2xsZXIuCiAgKgorICogQXV0aG9yOiBBbmRyZXMgU2Fsb21vbiA8ZGlsaW5nZXJAcXVldWVkLm5ldD4KKyAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBPbmUgTGFwdG9wIHBlciBDaGlsZCBGb3VuZGF0aW9uLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwgdjIgb3IgbGF0ZXIuCkBAIC0xMiw3ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvb2xwYy1lYy5oPgogI2luY2x1ZGUgPGFzbS9vbHBjLmg+CkBAIC0zMjYsOCArMzI4LDQgQEAKIHsKIAlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZvbHBjX2VjX3BsYXRfZHJpdmVyKTsKIH0KLQogYXJjaF9pbml0Y2FsbChvbHBjX2VjX2luaXRfbW9kdWxlKTsKLQotTU9EVUxFX0FVVEhPUigiQW5kcmVzIFNhbG9tb24gPGRpbGluZ2VyQHF1ZXVlZC5uZXQ+Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9wbWNfaXBjLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9wbWNfaXBjLmMKaW5kZXggYjg2ZTFiYy4uYTUxMWQ1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaW50ZWxfcG1jX2lwYy5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX3BtY19pcGMuYwpAQCAtNjUxLDExICs2NTEsMTUgQEAKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gaXBjX2NyZWF0ZV90Y29fZGV2aWNlKCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGlwY2Rldi5kZXYsICJGYWlsZWQgdG8gYWRkIHRjbyBwbGF0Zm9ybSBkZXZpY2VcbiIpOwotCQlyZXR1cm4gcmV0OworCS8qIElmIHdlIGhhdmUgQUNQSSBiYXNlZCB3YXRjaGRvZyB1c2UgdGhhdCBpbnN0ZWFkICovCisJaWYgKCFhY3BpX2hhc193YXRjaGRvZygpKSB7CisJCXJldCA9IGlwY19jcmVhdGVfdGNvX2RldmljZSgpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGlwY2Rldi5kZXYsICJGYWlsZWQgdG8gYWRkIHRjbyBwbGF0Zm9ybSBkZXZpY2VcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQogCX0KKwogCXJldCA9IGlwY19jcmVhdGVfcHVuaXRfZGV2aWNlKCk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGlwY2Rldi5kZXYsICJGYWlsZWQgdG8gYWRkIHB1bml0IHBsYXRmb3JtIGRldmljZVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9pbnRlbF9wbWljX2dwaW8uYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX3BtaWNfZ3Bpby5jCmluZGV4IDYzYjM3MWQuLjkxYWU1ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX3BtaWNfZ3Bpby5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX3BtaWNfZ3Bpby5jCkBAIC0xLDYgKzEsOCBAQAogLyogTW9vcmVzdG93biBQTUlDIEdQSU8gKGFjY2VzcyB0aHJvdWdoIElQQykgZHJpdmVyCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDggLSAyMDA5LCBJbnRlbCBDb3Jwb3JhdGlvbi4KICAqCisgKiBBdXRob3I6IEFsZWsgRHUgPGFsZWsuZHVAaW50ZWwuY29tPgorICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCkBAIC0yMSw3ICsyMyw2IEBACiAKICNkZWZpbmUgcHJfZm10KGZtdCkgIiVzOiAiIGZtdCwgX19mdW5jX18KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC0zMjIsOSArMzIzLDQgQEAKIHsKIAlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwbGF0Zm9ybV9wbWljX2dwaW9fZHJpdmVyKTsKIH0KLQogc3Vic3lzX2luaXRjYWxsKHBsYXRmb3JtX3BtaWNfZ3Bpb19pbml0KTsKLQotTU9EVUxFX0FVVEhPUigiQWxlayBEdSA8YWxlay5kdUBpbnRlbC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIE1vb3Jlc3Rvd24gUE1JQyBHUElPIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvaXNhcG5wL2NvcmUuYyBiL2RyaXZlcnMvcG5wL2lzYXBucC9jb3JlLmMKaW5kZXggY2Y4OGY5YjYuLmQ4YmY1YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL2lzYXBucC9jb3JlLmMKKysrIGIvZHJpdmVycy9wbnAvaXNhcG5wL2NvcmUuYwpAQCAtMzQsNyArMzQsNyBAQAogICogIDIwMDMtMDgtMTEJUmVzb3VyY2UgTWFuYWdlbWVudCBVcGRhdGVzIC0gQWRhbSBCZWxheSA8YW1ieDFAbmVvLnJyLmNvbT4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC01NCw4ICs1NCw2IEBACiBzdGF0aWMgaW50IGlzYXBucF9yZXNldCA9IDE7CS8qIHJlc2V0IGFsbCBQblAgY2FyZHMgKGRlYWN0aXZhdGUpICovCiBzdGF0aWMgaW50IGlzYXBucF92ZXJib3NlID0gMTsJLyogdmVyYm9zZSBtb2RlICovCiAKLU1PRFVMRV9BVVRIT1IoIkphcm9zbGF2IEt5c2VsYSA8cGVyZXhAcGVyZXguY3o+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkdlbmVyaWMgSVNBIFBsdWcgJiBQbGF5IHN1cHBvcnQiKTsKIG1vZHVsZV9wYXJhbShpc2FwbnBfZGlzYWJsZSwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoaXNhcG5wX2Rpc2FibGUsICJJU0EgUGx1ZyAmIFBsYXkgZGlzYWJsZSIpOwogbW9kdWxlX3BhcmFtKGlzYXBucF9yZHAsIGludCwgMCk7CkBAIC02NCw3ICs2Miw2IEBACiBNT0RVTEVfUEFSTV9ERVNDKGlzYXBucF9yZXNldCwgIklTQSBQbHVnICYgUGxheSByZXNldCBhbGwgY2FyZHMiKTsKIG1vZHVsZV9wYXJhbShpc2FwbnBfdmVyYm9zZSwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoaXNhcG5wX3ZlcmJvc2UsICJJU0EgUGx1ZyAmIFBsYXkgdmVyYm9zZSBtb2RlIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKICNkZWZpbmUgX1BJRFhSCQkweDI3OQogI2RlZmluZSBfUE5QV1JQCQkweGE3OQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9LY29uZmlnIGIvZHJpdmVycy9wb3dlci9LY29uZmlnCmluZGV4IGFjZDRhMTUuLjYzNDU0YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvS2NvbmZpZworKysgYi9kcml2ZXJzL3Bvd2VyL0tjb25maWcKQEAgLTEsNTE3ICsxLDMgQEAKLW1lbnVjb25maWcgUE9XRVJfU1VQUExZCi0JYm9vbCAiUG93ZXIgc3VwcGx5IGNsYXNzIHN1cHBvcnQiCi0JaGVscAotCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgcG93ZXIgc3VwcGx5IGNsYXNzIHN1cHBvcnQuIFRoaXMgYWxsb3dzCi0JICBwb3dlciBzdXBwbHkgKGJhdHRlcmllcywgQUMsIFVTQikgbW9uaXRvcmluZyBieSB1c2Vyc3BhY2UKLQkgIHZpYSBzeXNmcyBhbmQgdWV2ZW50IChpZiBhdmFpbGFibGUpIGFuZC9vciBBUE0ga2VybmVsIGludGVyZmFjZQotCSAgKGlmIHNlbGVjdGVkIGJlbG93KS4KLQotaWYgUE9XRVJfU1VQUExZCi0KLWNvbmZpZyBQT1dFUl9TVVBQTFlfREVCVUcKLQlib29sICJQb3dlciBzdXBwbHkgZGVidWciCi0JaGVscAotCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgZGVidWdnaW5nIG1lc3NhZ2VzIGZvciBwb3dlciBzdXBwbHkgY2xhc3MKLQkgIGFuZCBkcml2ZXJzLgotCi1jb25maWcgUERBX1BPV0VSCi0JdHJpc3RhdGUgIkdlbmVyaWMgUERBL3Bob25lIHBvd2VyIGRyaXZlciIKLQlkZXBlbmRzIG9uICFTMzkwCi0JaGVscAotCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgZ2VuZXJpYyBwb3dlciBkcml2ZXIgZm9yIFBEQXMgYW5kIHBob25lcyB3aXRoCi0JICBvbmUgb3IgdHdvIGV4dGVybmFsIHBvd2VyIHN1cHBsaWVzIChBQy9VU0IpIGNvbm5lY3RlZCB0byBtYWluIGFuZAotCSAgYmFja3VwIGJhdHRlcmllcywgYW5kIG9wdGlvbmFsIGJ1aWx0aW4gY2hhcmdlci4KLQotY29uZmlnIEFQTV9QT1dFUgotCXRyaXN0YXRlICJBUE0gZW11bGF0aW9uIGZvciBjbGFzcyBiYXR0ZXJpZXMiCi0JZGVwZW5kcyBvbiBBUE1fRU1VTEFUSU9OCi0JaGVscAotCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgc3VwcG9ydCBBUE0gc3RhdHVzIGVtdWxhdGlvbiB1c2luZwotCSAgYmF0dGVyeSBjbGFzcyBkZXZpY2VzLgotCi1jb25maWcgR0VORVJJQ19BRENfQkFUVEVSWQotCXRyaXN0YXRlICJHZW5lcmljIGJhdHRlcnkgc3VwcG9ydCB1c2luZyBJSU8iCi0JZGVwZW5kcyBvbiBJSU8KLQloZWxwCi0JICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgZ2VuZXJpYyBiYXR0ZXJ5IGRyaXZlcgotCSAgd2hpY2ggdXNlcyBJSU8gZnJhbWV3b3JrIHRvIHJlYWQgYWRjLgotCi1jb25maWcgTUFYODkyNV9QT1dFUgotCXRyaXN0YXRlICJNQVg4OTI1IGJhdHRlcnkgY2hhcmdlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gTUZEX01BWDg5MjUKLQloZWxwCi0JICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgYmF0dGVyeSBjaGFyZ2VyIGluIHRoZSBNYXhpbQotCSAgTUFYODkyNSBQTUlDLgotCi1jb25maWcgV004MzFYX0JBQ0tVUAotCXRyaXN0YXRlICJXTTgzMVggYmFja3VwIGJhdHRlcnkgY2hhcmdlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gTUZEX1dNODMxWAotCWhlbHAKLQkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBiYWNrdXAgYmF0dGVyeSBjaGFyZ2VyCi0JICBpbiB0aGUgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODMxeCBQTUlDcy4KLQotY29uZmlnIFdNODMxWF9QT1dFUgotCXRyaXN0YXRlICJXTTgzMVggUE1VIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBNRkRfV004MzFYCi0JaGVscAotCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIHBvd2VyIG1hbmFnZW1lbnQgdW5pdAotCSAgcHJvdmlkZWQgYnkgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODMxeCBQTUlDcy4KLQotY29uZmlnIFdNODM1MF9QT1dFUgotICAgICAgICB0cmlzdGF0ZSAiV004MzUwIFBNVSBzdXBwb3J0IgotICAgICAgICBkZXBlbmRzIG9uIE1GRF9XTTgzNTAKLSAgICAgICAgaGVscAotICAgICAgICAgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBwb3dlciBtYW5hZ2VtZW50IHVuaXQKLQkgIHByb3ZpZGVkIGJ5IHRoZSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgV004MzUwIFBNSUMuCi0KLWNvbmZpZyBURVNUX1BPV0VSCi0JdHJpc3RhdGUgIlRlc3QgcG93ZXIgZHJpdmVyIgotCWhlbHAKLQkgIFRoaXMgZHJpdmVyIGlzIHVzZWQgZm9yIHRlc3RpbmcuIEl0J3Mgc2FmZSB0byBzYXkgTSBoZXJlLgotCi1jb25maWcgQkFUVEVSWV84OFBNODYwWAotCXRyaXN0YXRlICJNYXJ2ZWxsIDg4UE04NjB4IGJhdHRlcnkgZHJpdmVyIgotCWRlcGVuZHMgb24gTUZEXzg4UE04NjBYCi0JaGVscAotCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgYmF0dGVyeSBtb25pdG9yIGZvciBNYXJ2ZWxsIDg4UE04NjB4IGNoaXAuCi0KLWNvbmZpZyBCQVRURVJZX0FDVDg5NDVBCi0JdHJpc3RhdGUgIkFjdGl2ZS1zZW1pIEFDVDg5NDVBIGNoYXJnZXIgZHJpdmVyIgotCWRlcGVuZHMgb24gTUZEX0FDVDg5NDVBIHx8IENPTVBJTEVfVEVTVAotCWhlbHAKLQkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHBvd2VyIHN1cHBseSBwcm92aWRlZCBieQotCSAgQWN0aXZlLXNlbWkgQWN0aXZlUGF0aCBBQ1Q4OTQ1QSBjaGFyZ2VyLgotCi1jb25maWcgQkFUVEVSWV9EUzI3NjAKLQl0cmlzdGF0ZSAiRFMyNzYwIGJhdHRlcnkgZHJpdmVyIChIUCBpUEFRICYgb3RoZXJzKSIKLQlkZXBlbmRzIG9uIFcxICYmIFcxX1NMQVZFX0RTMjc2MAotCWhlbHAKLQkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIGJhdHRlcmllcyB3aXRoIGRzMjc2MCBjaGlwLgotCi1jb25maWcgQkFUVEVSWV9EUzI3ODAKLQl0cmlzdGF0ZSAiRFMyNzgwIGJhdHRlcnkgZHJpdmVyIgotCWRlcGVuZHMgb24gSEFTX0lPTUVNCi0Jc2VsZWN0IFcxCi0Jc2VsZWN0IFcxX1NMQVZFX0RTMjc4MAotCWhlbHAKLQkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIGJhdHRlcmllcyB3aXRoIGRzMjc4MCBjaGlwLgotCi1jb25maWcgQkFUVEVSWV9EUzI3ODEKLQl0cmlzdGF0ZSAiRFMyNzgxIGJhdHRlcnkgZHJpdmVyIgotCWRlcGVuZHMgb24gSEFTX0lPTUVNCi0Jc2VsZWN0IFcxCi0Jc2VsZWN0IFcxX1NMQVZFX0RTMjc4MQotCWhlbHAKLQkgIElmIHlvdSBlbmFibGUgdGhpcyB5b3Ugd2lsbCBoYXZlIHRoZSBEUzI3ODEgYmF0dGVyeSBkcml2ZXIgc3VwcG9ydC4KLQotCSAgVGhlIGJhdHRlcnkgbW9uaXRvciBjaGlwIGlzIHVzZWQgaW4gbWFueSBiYXR0ZXJpZXMvZGV2aWNlcwotCSAgYXMgdGhlIG9uZSB3aG8gaXMgcmVzcG9uc2libGUgZm9yIGNoYXJnaW5nL2Rpc2NoYXJnaW5nL21vbml0b3JpbmcKLQkgIExpKyBiYXR0ZXJpZXMuCi0KLQkgIElmIHlvdSBhcmUgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIEJBVFRFUllfRFMyNzgyCi0JdHJpc3RhdGUgIkRTMjc4Mi9EUzI3ODYgc3RhbmRhbG9uZSBnYXMtZ2F1Z2UiCi0JZGVwZW5kcyBvbiBJMkMKLQloZWxwCi0JICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgRFMyNzgyL0RTMjc4NiBzdGFuZGFsb25lIGJhdHRlcnkKLQkgIGdhcy1nYXVnZS4KLQotY29uZmlnIEJBVFRFUllfUE1VCi0JdHJpc3RhdGUgIkFwcGxlIFBNVSBiYXR0ZXJ5IgotCWRlcGVuZHMgb24gUFBDMzIgJiYgQURCX1BNVQotCWhlbHAKLQkgIFNheSBZIGhlcmUgdG8gZXhwb3NlIGJhdHRlcnkgaW5mb3JtYXRpb24gb24gQXBwbGUgbWFjaGluZXMKLQkgIHRocm91Z2ggdGhlIGdlbmVyaWMgYmF0dGVyeSBjbGFzcy4KLQotY29uZmlnIEJBVFRFUllfT0xQQwotCXRyaXN0YXRlICJPbmUgTGFwdG9wIFBlciBDaGlsZCBiYXR0ZXJ5IgotCWRlcGVuZHMgb24gWDg2XzMyICYmIE9MUEMKLQloZWxwCi0JICBTYXkgWSB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIGJhdHRlcnkgb24gdGhlIE9MUEMgbGFwdG9wLgotCi1jb25maWcgQkFUVEVSWV9UT1NBCi0JdHJpc3RhdGUgIlNoYXJwIFNMLTYwMDAgKHRvc2EpIGJhdHRlcnkiCi0JZGVwZW5kcyBvbiBNQUNIX1RPU0EgJiYgTUZEX1RDNjM5M1hCICYmIFRPVUNIU0NSRUVOX1dNOTdYWAotCWhlbHAKLQkgIFNheSBZIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgYmF0dGVyeSBvbiB0aGUgU2hhcnAgWmF1cnVzCi0JICBTTC02MDAwICh0b3NhKSBtb2RlbHMuCi0KLWNvbmZpZyBCQVRURVJZX0NPTExJRQotCXRyaXN0YXRlICJTaGFycCBTTC01NTAwIChjb2xsaWUpIGJhdHRlcnkiCi0JZGVwZW5kcyBvbiBTQTExMDBfQ09MTElFICYmIE1DUF9VQ0IxMjAwCi0JaGVscAotCSAgU2F5IFkgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBiYXR0ZXJ5IG9uIHRoZSBTaGFycCBaYXVydXMKLQkgIFNMLTU1MDAgKGNvbGxpZSkgbW9kZWxzLgotCi1jb25maWcgQkFUVEVSWV9JUEFRX01JQ1JPCi0JdHJpc3RhdGUgImlQQVEgQXRtZWwgTWljcm8gQVNJQyBiYXR0ZXJ5IGRyaXZlciIKLQlkZXBlbmRzIG9uIE1GRF9JUEFRX01JQ1JPCi0JaGVscAotCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIG1vbml0b3IgYmF0dGVyeSBzdGF0dXMgb24KLQkgIENvbXBhcS9IUCBpUEFRIGgzMTAwIGFuZCBoMzYwMC4KLQotY29uZmlnIEJBVFRFUllfV005N1hYCi0JYm9vbCAiV005N3h4IGdlbmVyaWMgYmF0dGVyeSBkcml2ZXIiCi0JZGVwZW5kcyBvbiBUT1VDSFNDUkVFTl9XTTk3WFg9eQotCWhlbHAKLQkgIFNheSBZIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBiYXR0ZXJ5IG1lYXN1cmVkIGJ5IFdNOTd4eCBhdXggcG9ydC4KLQotY29uZmlnIEJBVFRFUllfU0JTCi0gICAgICAgIHRyaXN0YXRlICJTQlMgQ29tcGxpYW50IGdhcyBnYXVnZSIKLSAgICAgICAgZGVwZW5kcyBvbiBJMkMKLSAgICAgICAgaGVscAotCSAgU2F5IFkgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBTQlMgYmF0dGVyeSBkcml2ZXIgZm9yIFNCUy1jb21wbGlhbnQKLQkgIGdhcyBnYXVnZXMuCi0KLWNvbmZpZyBCQVRURVJZX0JRMjdYWFgKLQl0cmlzdGF0ZSAiQlEyN3h4eCBiYXR0ZXJ5IGRyaXZlciIKLQloZWxwCi0JICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBiYXR0ZXJpZXMgd2l0aCBCUTI3eHh4IGNoaXBzLgotCi1jb25maWcgQkFUVEVSWV9CUTI3WFhYX0kyQwotCXRyaXN0YXRlICJCUTI3eHh4IEkyQyBzdXBwb3J0IgotCWRlcGVuZHMgb24gQkFUVEVSWV9CUTI3WFhYCi0JZGVwZW5kcyBvbiBJMkMKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBiYXR0ZXJpZXMgd2l0aCBCUTI3eHh4IGNoaXBzCi0JICBjb25uZWN0ZWQgb3ZlciBhbiBJMkMgYnVzLgotCi1jb25maWcgQkFUVEVSWV9EQTkwMzAKLQl0cmlzdGF0ZSAiREE5MDMwIGJhdHRlcnkgZHJpdmVyIgotCWRlcGVuZHMgb24gUE1JQ19EQTkwM1gKLQloZWxwCi0JICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBiYXR0ZXJpZXMgY2hhcmdlciBpbnRlZ3JhdGVkIGludG8KLQkgIERBOTAzMCBQTUlDLgotCi1jb25maWcgQkFUVEVSWV9EQTkwNTIKLQl0cmlzdGF0ZSAiRGlhbG9nIERBOTA1MiBCYXR0ZXJ5IgotCWRlcGVuZHMgb24gUE1JQ19EQTkwNTIKLQloZWxwCi0JICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBiYXR0ZXJpZXMgY2hhcmdlciBpbnRlZ3JhdGVkIGludG8KLQkgIERBOTA1MiBQTUlDLgotCi1jb25maWcgQ0hBUkdFUl9EQTkxNTAKLQl0cmlzdGF0ZSAiRGlhbG9nIFNlbWljb25kdWN0b3IgREE5MTUwIENoYXJnZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE1GRF9EQTkxNTAKLQlkZXBlbmRzIG9uIERBOTE1MF9HUEFEQwotCWRlcGVuZHMgb24gSUlPCi0JaGVscAotCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgc3VwcG9ydCBmb3IgY2hhcmdlciB1bml0IG9mIHRoZSBEQTkxNTAKLQkgIEludGVncmF0ZWQgQ2hhcmdlciAmIEZ1ZWwtR2F1Z2UgSUMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsIGJlCi0JICBjYWxsZWQgZGE5MTUwLWNoYXJnZXIuCi0KLWNvbmZpZyBCQVRURVJZX0RBOTE1MAotCXRyaXN0YXRlICJEaWFsb2cgU2VtaWNvbmR1Y3RvciBEQTkxNTAgRnVlbCBHYXVnZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gTUZEX0RBOTE1MAotCWhlbHAKLQkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBGdWVsLUdhdWdlIHVuaXQgb2YgdGhlIERBOTE1MAotCSAgSW50ZWdyYXRlZCBDaGFyZ2VyICYgRnVlbC1HYXVnZSBJQwotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbCBiZQotCSAgY2FsbGVkIGRhOTE1MC1mZy4KLQotY29uZmlnIEFYUDI4OF9DSEFSR0VSCi0JdHJpc3RhdGUgIlgtUG93ZXJzIEFYUDI4OCBDaGFyZ2VyIgotCWRlcGVuZHMgb24gTUZEX0FYUDIwWCAmJiBFWFRDT05fQVhQMjg4Ci0JaGVscAotCSAgU2F5IHllcyBoZXJlIHRvIGhhdmUgc3VwcG9ydCBYLVBvd2VyIEFYUDI4OCBwb3dlciBtYW5hZ2VtZW50IElDIChQTUlDKQotCSAgaW50ZWdyYXRlZCBjaGFyZ2VyLgotCi1jb25maWcgQVhQMjg4X0ZVRUxfR0FVR0UKLQl0cmlzdGF0ZSAiWC1Qb3dlcnMgQVhQMjg4IEZ1ZWwgR2F1Z2UiCi0JZGVwZW5kcyBvbiBNRkRfQVhQMjBYICYmIElJTwotCWhlbHAKLQkgIFNheSB5ZXMgaGVyZSB0byBoYXZlIHN1cHBvcnQgZm9yIFgtUG93ZXIgcG93ZXIgbWFuYWdlbWVudCBJQyAoUE1JQykKLQkgIEZ1ZWwgR2F1Z2UuIFRoZSBkZXZpY2UgcHJvdmlkZXMgYmF0dGVyeSBzdGF0aXN0aWNzIGFuZCBzdGF0dXMKLQkgIG1vbml0b3JpbmcgYXMgd2VsbCBhcyBhbGVydHMgZm9yIGJhdHRlcnkgb3Zlci91bmRlciB2b2x0YWdlIGFuZAotCSAgb3Zlci91bmRlciB0ZW1wZXJhdHVyZS4KLQotY29uZmlnIEJBVFRFUllfTUFYMTcwNDAKLQl0cmlzdGF0ZSAiTWF4aW0gTUFYMTcwNDAgRnVlbCBHYXVnZSIKLQlkZXBlbmRzIG9uIEkyQwotCWhlbHAKLQkgIE1BWDE3MDQwIGlzIGZ1ZWwtZ2F1Z2Ugc3lzdGVtcyBmb3IgbGl0aGl1bS1pb24gKExpKykgYmF0dGVyaWVzCi0JICBpbiBoYW5kaGVsZCBhbmQgcG9ydGFibGUgZXF1aXBtZW50LiBUaGUgTUFYMTcwNDAgaXMgY29uZmlndXJlZAotCSAgdG8gb3BlcmF0ZSB3aXRoIGEgc2luZ2xlIGxpdGhpdW0gY2VsbAotCi1jb25maWcgQkFUVEVSWV9NQVgxNzA0MgotCXRyaXN0YXRlICJNYXhpbSBNQVgxNzA0Mi8xNzA0Ny8xNzA1MC84OTk3Lzg5NjYgRnVlbCBHYXVnZSIKLQlkZXBlbmRzIG9uIEkyQwotCXNlbGVjdCBSRUdNQVBfSTJDCi0JaGVscAotCSAgTUFYMTcwNDIgaXMgZnVlbC1nYXVnZSBzeXN0ZW1zIGZvciBsaXRoaXVtLWlvbiAoTGkrKSBiYXR0ZXJpZXMKLQkgIGluIGhhbmRoZWxkIGFuZCBwb3J0YWJsZSBlcXVpcG1lbnQuIFRoZSBNQVgxNzA0MiBpcyBjb25maWd1cmVkCi0JICB0byBvcGVyYXRlIHdpdGggYSBzaW5nbGUgbGl0aGl1bSBjZWxsLiBNQVg4OTk3IGFuZCBNQVg4OTY2IGFyZQotCSAgbXVsdGktZnVuY3Rpb24gZGV2aWNlcyB0aGF0IGluY2x1ZGUgZnVlbCBnYXVhZ2VzIHRoYXQgYXJlIGNvbXBhdGlibGUKLQkgIHdpdGggTUFYMTcwNDIuIFRoaXMgZHJpdmVyIGFsc28gc3VwcG9ydHMgbWF4MTcwNDcvNTAgY2hpcHMgd2hpY2ggYXJlCi0JICBpbXByb3ZlZCB2ZXJzaW9uIG9mIG1heDE3MDQyLgotCi1jb25maWcgQkFUVEVSWV9aMgotCXRyaXN0YXRlICJaMiBiYXR0ZXJ5IGRyaXZlciIKLQlkZXBlbmRzIG9uIEkyQyAmJiBNQUNIX1pJUElUMgotCWhlbHAKLQkgIFNheSBZIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIGJhdHRlcnkgb24gdGhlIFppcGl0IFoyLgotCi1jb25maWcgQkFUVEVSWV9TM0NfQURDCi0JdHJpc3RhdGUgIkJhdHRlcnkgZHJpdmVyIGZvciBTYW1zdW5nIEFEQyBiYXNlZCBtb25pdG9yaW5nIgotCWRlcGVuZHMgb24gUzNDX0FEQwotCWhlbHAKLQkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIGlQQVEgaDE5MzAvaDE5NDAvcngxOTUwIGJhdHRlcnkKLQotY29uZmlnIEJBVFRFUllfVFdMNDAzMF9NQURDCi0JdHJpc3RhdGUgIlRXTDQwMzAgTUFEQyBiYXR0ZXJ5IGRyaXZlciIKLQlkZXBlbmRzIG9uIFRXTDQwMzBfTUFEQwotCWhlbHAKLQkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHRoaXMgZHVtYiBkcml2ZXIgZm9yIGJhdHRlcmllcyBtYW5hZ2VkCi0JICB0aHJvdWdoIHRoZSBUV0w0MDMwIE1BREMuCi0KLWNvbmZpZyBDSEFSR0VSXzg4UE04NjBYCi0JdHJpc3RhdGUgIk1hcnZlbGwgODhQTTg2MHggQ2hhcmdlciBkcml2ZXIiCi0JZGVwZW5kcyBvbiBNRkRfODhQTTg2MFggJiYgQkFUVEVSWV84OFBNODYwWAotCWhlbHAKLQkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIGNoYXJnZXIgZm9yIE1hcnZlbGwgODhQTTg2MHggY2hpcC4KLQotY29uZmlnIENIQVJHRVJfUENGNTA2MzMKLQl0cmlzdGF0ZSAiTlhQIFBDRjUwNjMzIE1CQyIKLQlkZXBlbmRzIG9uIE1GRF9QQ0Y1MDYzMwotCWhlbHAKLQkgU2F5IFkgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBOWFAgUENGNTA2MzMgTWFpbiBCYXR0ZXJ5IENoYXJnZXIuCi0KLWNvbmZpZyBCQVRURVJZX0paNDc0MAotCXRyaXN0YXRlICJJbmdlbmljIEpaNDc0MCBiYXR0ZXJ5IgotCWRlcGVuZHMgb24gTUFDSF9KWjQ3NDAKLQlkZXBlbmRzIG9uIE1GRF9KWjQ3NDBfQURDCi0JaGVscAotCSAgU2F5IFkgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBiYXR0ZXJ5IG9uIEluZ2VuaWMgSlo0NzQwIGJhc2VkCi0JICBib2FyZHMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBiZSBidWlsZCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbCBiZQotCSAgY2FsbGVkIGp6NDc0MC1iYXR0ZXJ5LgotCi1jb25maWcgQkFUVEVSWV9JTlRFTF9NSUQKLQl0cmlzdGF0ZSAiQmF0dGVyeSBkcml2ZXIgZm9yIEludGVsIE1JRCBwbGF0Zm9ybXMiCi0JZGVwZW5kcyBvbiBJTlRFTF9TQ1VfSVBDICYmIFNQSQotCWhlbHAKLQkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHRoZSBiYXR0ZXJ5IGRyaXZlciBvbiBJbnRlbCBNSUQKLQkgIHBsYXRmb3Jtcy4KLQotY29uZmlnIEJBVFRFUllfUlg1MQotCXRyaXN0YXRlICJOb2tpYSBSWC01MSAoTjkwMCkgYmF0dGVyeSBkcml2ZXIiCi0JZGVwZW5kcyBvbiBUV0w0MDMwX01BREMKLQloZWxwCi0JICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBiYXR0ZXJ5IGluZm9ybWF0aW9uIG9uIE5va2lhCi0JICBSWC01MSwgYWxzbyBrbm93biBhcyBOOTAwIHRhYmxldC4KLQotY29uZmlnIENIQVJHRVJfSVNQMTcwNAotCXRyaXN0YXRlICJJU1AxNzA0IFVTQiBDaGFyZ2VyIERldGVjdGlvbiIKLQlkZXBlbmRzIG9uIFVTQl9QSFkKLQlkZXBlbmRzIG9uIFVTQl9HQURHRVQgfHwgIVVTQl9HQURHRVQgIyBpZiBVU0JfR0FER0VUPW0sIHRoaXMgY2FuJ3QgYmUgJ3knCi0JaGVscAotCSAgU2F5IFkgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIFVTQiBDaGFyZ2VyIERldGVjdGlvbiB3aXRoCi0JICBJU1AxNzA3L0lTUDE3MDQgVVNCIHRyYW5zY2VpdmVycy4KLQotY29uZmlnIENIQVJHRVJfTUFYODkwMwotCXRyaXN0YXRlICJNQVg4OTAzIEJhdHRlcnkgREMtREMgQ2hhcmdlciBmb3IgVVNCIGFuZCBBZGFwdGVyIFBvd2VyIgotCWhlbHAKLQkgIFNheSBZIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgTUFYODkwMyBEQy1EQyBjaGFyZ2VyIGFuZCBzeXNmcy4KLQkgIFRoZSBkcml2ZXIgc3VwcG9ydHMgY29udHJvbGxpbmcgY2hhcmdlci1lbmFibGUgYW5kIGN1cnJlbnQtbGltaXQKLQkgIHBpbnMgYmFzZWQgb24gdGhlIHN0YXR1cyBvZiBjaGFyZ2VyIGNvbm5lY3Rpb25zIHdpdGggaW50ZXJydXB0Ci0JICBoYW5kbGVycy4KLQotY29uZmlnIENIQVJHRVJfVFdMNDAzMAotCXRyaXN0YXRlICJPTUFQIFRXTDQwMzAgQkNJIGNoYXJnZXIgZHJpdmVyIgotCWRlcGVuZHMgb24gSUlPICYmIFRXTDQwMzBfQ09SRQotCWhlbHAKLQkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIFRXTDQwMzAgQmF0dGVyeSBDaGFyZ2UgSW50ZXJmYWNlLgotCi1jb25maWcgQ0hBUkdFUl9MUDg3MjcKLQl0cmlzdGF0ZSAiVEkvTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMUDg3MjcgY2hhcmdlciBkcml2ZXIiCi0JZGVwZW5kcyBvbiBJMkMKLQloZWxwCi0JICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBMUDg3MjcgQ2hhcmdlciBEcml2ZXIuCi0KLWNvbmZpZyBDSEFSR0VSX0xQODc4OAotCXRyaXN0YXRlICJUSSBMUDg3ODggY2hhcmdlciBkcml2ZXIiCi0JZGVwZW5kcyBvbiBNRkRfTFA4Nzg4Ci0JZGVwZW5kcyBvbiBMUDg3ODhfQURDCi0JZGVwZW5kcyBvbiBJSU8KLQloZWxwCi0JICBTYXkgWSB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIExQODc4OCBsaW5lYXIgY2hhcmdlci4KLQotY29uZmlnIENIQVJHRVJfR1BJTwotCXRyaXN0YXRlICJHUElPIGNoYXJnZXIiCi0JZGVwZW5kcyBvbiBHUElPTElCIHx8IENPTVBJTEVfVEVTVAotCWhlbHAKLQkgIFNheSBZIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgY2hhcmdlcnMgd2hpY2ggcmVwb3J0IHRoZWlyIG9ubGluZSBzdGF0dXMKLQkgIHRocm91Z2ggYSBHUElPIHBpbi4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGJlIGJ1aWxkIGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsIGJlCi0JICBjYWxsZWQgZ3Bpby1jaGFyZ2VyLgotCi1jb25maWcgQ0hBUkdFUl9NQU5BR0VSCi0JYm9vbCAiQmF0dGVyeSBjaGFyZ2VyIG1hbmFnZXIgZm9yIG11bHRpcGxlIGNoYXJnZXJzIgotCWRlcGVuZHMgb24gUkVHVUxBVE9SCi0Jc2VsZWN0IEVYVENPTgotCWhlbHAKLSAgICAgICAgICBTYXkgWSB0byBlbmFibGUgY2hhcmdlci1tYW5hZ2VyIHN1cHBvcnQsIHdoaWNoIGFsbG93cyBtdWx0aXBsZQotICAgICAgICAgIGNoYXJnZXJzIGF0dGFjaGVkIHRvIGEgYmF0dGVyeSBhbmQgbXVsdGlwbGUgYmF0dGVyaWVzIGF0dGFjaGVkIHRvIGEKLSAgICAgICAgICBzeXN0ZW0uIFRoZSBjaGFyZ2VyLW1hbmFnZXIgYWxzbyBjYW4gbW9uaXRvciBjaGFyZ2luZyBzdGF0dXMgaW4KLSAgICAgICAgICBydW50aW1lIGFuZCBpbiBzdXNwZW5kLXRvLVJBTSBieSB3YWtpbmcgdXAgdGhlIHN5c3RlbSBwZXJpb2RpY2FsbHkKLSAgICAgICAgICB3aXRoIGhlbHAgb2Ygc3VzcGVuZF9hZ2FpbiBzdXBwb3J0LgotCi1jb25maWcgQ0hBUkdFUl9NQVgxNDU3NwotCXRyaXN0YXRlICJNYXhpbSBNQVgxNDU3Ny83NzgzNiBiYXR0ZXJ5IGNoYXJnZXIgZHJpdmVyIgotCWRlcGVuZHMgb24gTUZEX01BWDE0NTc3Ci0JaGVscAotCSAgU2F5IFkgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBiYXR0ZXJ5IGNoYXJnZXIgY29udHJvbCBzeXNmcyBhbmQKLQkgIHBsYXRmb3JtIGRhdGEgb2YgTUFYMTQ1NzcvNzc4MzYgTVVJQ3MuCi0KLWNvbmZpZyBDSEFSR0VSX01BWDc3NjkzCi0JdHJpc3RhdGUgIk1heGltIE1BWDc3NjkzIGJhdHRlcnkgY2hhcmdlciBkcml2ZXIiCi0JZGVwZW5kcyBvbiBNRkRfTUFYNzc2OTMKLQloZWxwCi0JICBTYXkgWSB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIE1heGltIE1BWDc3NjkzIGJhdHRlcnkgY2hhcmdlci4KLQotY29uZmlnIENIQVJHRVJfTUFYODk5NwotCXRyaXN0YXRlICJNYXhpbSBNQVg4OTk3L01BWDg5NjYgUE1JQyBiYXR0ZXJ5IGNoYXJnZXIgZHJpdmVyIgotCWRlcGVuZHMgb24gTUZEX01BWDg5OTcgJiYgUkVHVUxBVE9SX01BWDg5OTcKLQloZWxwCi0JICBTYXkgWSB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIGJhdHRlcnkgY2hhcmdlciBjb250cm9sIHN5c2ZzIGFuZAotCSAgcGxhdGZvcm0gZGF0YSBvZiBNQVg4OTk3L0xQMzk3NCBQTUlDcy4KLQotY29uZmlnIENIQVJHRVJfTUFYODk5OAotCXRyaXN0YXRlICJNYXhpbSBNQVg4OTk4L0xQMzk3NCBQTUlDIGJhdHRlcnkgY2hhcmdlciBkcml2ZXIiCi0JZGVwZW5kcyBvbiBNRkRfTUFYODk5OCAmJiBSRUdVTEFUT1JfTUFYODk5OAotCWhlbHAKLQkgIFNheSBZIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgYmF0dGVyeSBjaGFyZ2VyIGNvbnRyb2wgc3lzZnMgYW5kCi0JICBwbGF0Zm9ybSBkYXRhIG9mIE1BWDg5OTgvTFAzOTc0IFBNSUNzLgotCi1jb25maWcgQ0hBUkdFUl9RQ09NX1NNQkIKLQl0cmlzdGF0ZSAiUXVhbGNvbW0gU3dpdGNoLU1vZGUgQmF0dGVyeSBDaGFyZ2VyIGFuZCBCb29zdCIKLQlkZXBlbmRzIG9uIE1GRF9TUE1JX1BNSUMgfHwgQ09NUElMRV9URVNUCi0JZGVwZW5kcyBvbiBPRgotCWRlcGVuZHMgb24gRVhUQ09OCi0JaGVscAotCSAgU2F5IFkgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgU3dpdGNoLU1vZGUgQmF0dGVyeSBDaGFyZ2VyIGFuZAotCSAgQm9vc3QgKFNNQkIpIGhhcmR3YXJlIGZvdW5kIGluIFF1YWxjb21tIFBNODk0MSBQTUlDcy4gIFRoZSBjaGFyZ2VyCi0JICBpcyBhbiBpbnRlZ3JhdGVkLCBzaW5nbGUtY2VsbCBsaXRoaXVtLWlvbiBiYXR0ZXJ5IGNoYXJnZXIuICBEVAotCSAgY29uZmlndXJhdGlvbiBpcyByZXF1aXJlZCBmb3IgbG9hZGluZywgc2VlIHRoZSBkZXZpY2V0cmVlCi0JICBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbC4gIFRoZSBiYXNlIG5hbWUgZm9yIHRoaXMgZHJpdmVyIGlzCi0JICAncG04OTQxX2NoYXJnZXInLgotCi1jb25maWcgQ0hBUkdFUl9CUTI0MTVYCi0JdHJpc3RhdGUgIlRJIEJRMjQxNXggYmF0dGVyeSBjaGFyZ2VyIGRyaXZlciIKLQlkZXBlbmRzIG9uIEkyQwotCWhlbHAKLQkgIFNheSBZIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgVEkgQlEyNDE1eCBiYXR0ZXJ5IGNoYXJnZXIKLQkgIFBNSUNzLgotCi0JICBZb3UnbGwgbmVlZCB0aGlzIGRyaXZlciB0byBjaGFyZ2UgYmF0dGVyaWVzIG9uIGUuZy4gTm9raWEKLQkgIFJYLTUxL045MDAuCi0KLWNvbmZpZyBDSEFSR0VSX0JRMjQxOTAKLQl0cmlzdGF0ZSAiVEkgQlEyNDE5MCBiYXR0ZXJ5IGNoYXJnZXIgZHJpdmVyIgotCWRlcGVuZHMgb24gSTJDCi0JZGVwZW5kcyBvbiBHUElPTElCIHx8IENPTVBJTEVfVEVTVAotCWhlbHAKLQkgIFNheSBZIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgVEkgQlEyNDE5MCBiYXR0ZXJ5IGNoYXJnZXIuCi0KLWNvbmZpZyBDSEFSR0VSX0JRMjQyNTcKLQl0cmlzdGF0ZSAiVEkgQlEyNDI1MC8yNDI1MS8yNDI1NyBiYXR0ZXJ5IGNoYXJnZXIgZHJpdmVyIgotCWRlcGVuZHMgb24gSTJDCi0JZGVwZW5kcyBvbiBHUElPTElCIHx8IENPTVBJTEVfVEVTVAotCWRlcGVuZHMgb24gUkVHTUFQX0kyQwotCWhlbHAKLQkgIFNheSBZIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgVEkgQlEyNDI1MCwgQlEyNDI1MSwgYW5kIEJRMjQyNTcgYmF0dGVyeQotCSAgY2hhcmdlcnMuCi0KLWNvbmZpZyBDSEFSR0VSX0JRMjQ3MzUKLQl0cmlzdGF0ZSAiVEkgQlEyNDczNSBiYXR0ZXJ5IGNoYXJnZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEkyQwotCWRlcGVuZHMgb24gR1BJT0xJQiB8fCBDT01QSUxFX1RFU1QKLQloZWxwCi0JICBTYXkgWSB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIFRJIEJRMjQ3MzUgYmF0dGVyeSBjaGFyZ2VyLgotCi1jb25maWcgQ0hBUkdFUl9CUTI1ODkwCi0JdHJpc3RhdGUgIlRJIEJRMjU4OTAgYmF0dGVyeSBjaGFyZ2VyIGRyaXZlciIKLQlkZXBlbmRzIG9uIEkyQwotCWRlcGVuZHMgb24gR1BJT0xJQiB8fCBDT01QSUxFX1RFU1QKLQlzZWxlY3QgUkVHTUFQX0kyQwotCWhlbHAKLQkgIFNheSBZIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgVEkgQlEyNTg5MCBiYXR0ZXJ5IGNoYXJnZXIuCi0KLWNvbmZpZyBDSEFSR0VSX1NNQjM0NwotCXRyaXN0YXRlICJTdW1taXQgTWljcm9lbGVjdHJvbmljcyBTTUIzNDcgQmF0dGVyeSBDaGFyZ2VyIgotCWRlcGVuZHMgb24gSTJDCi0Jc2VsZWN0IFJFR01BUF9JMkMKLQloZWxwCi0JICBTYXkgWSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIFN1bW1pdCBNaWNyb2VsZWN0cm9uaWNzIFNNQjM0NwotCSAgQmF0dGVyeSBDaGFyZ2VyLgotCi1jb25maWcgQ0hBUkdFUl9UUFM2NTA5MAotCXRyaXN0YXRlICJUUFM2NTA5MCBiYXR0ZXJ5IGNoYXJnZXIgZHJpdmVyIgotCWRlcGVuZHMgb24gTUZEX1RQUzY1MDkwCi0JaGVscAotCSBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBiYXR0ZXJ5IGNoYXJnaW5nIHdpdGggVFBTNjUwOTAKLQkgUE1JQyBjaGlwcy4KLQotY29uZmlnIENIQVJHRVJfVFBTNjUyMTcKLQl0cmlzdGF0ZSAiVFBTNjUyMTcgYmF0dGVyeSBjaGFyZ2VyIGRyaXZlciIKLQlkZXBlbmRzIG9uIE1GRF9UUFM2NTIxNwotCWhlbHAKLQkgU2F5IFkgaGVyZSB0byBlbmFibGUgc3VwcG9ydCBmb3IgYmF0dGVyeSBjaGFyZ2luZyB3aXRoIFRQUzY1MjE3Ci0JIFBNSUMgY2hpcHMuCi0KLWNvbmZpZyBCQVRURVJZX0dBVUdFX0xUQzI5NDEKLQl0cmlzdGF0ZSAiTFRDMjk0MS9MVEMyOTQzIEJhdHRlcnkgR2F1Z2UgRHJpdmVyIgotCWRlcGVuZHMgb24gSTJDCi0JaGVscAotCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIExUQzI5NDEgYW5kIExUQzI5NDMgQmF0dGVyeQotCSAgR2F1Z2UgSUMuIFRoZSBkcml2ZXIgcmVwb3J0cyB0aGUgY2hhcmdlIGNvdW50IGNvbnRpbnVvdXNseSwgYW5kCi0JICBtZWFzdXJlcyB0aGUgdm9sdGFnZSBhbmQgdGVtcGVyYXR1cmUgZXZlcnkgMTAgc2Vjb25kcy4KLQotY29uZmlnIEFCODUwMF9CTQotCWJvb2wgIkFCODUwMCBCYXR0ZXJ5IE1hbmFnZW1lbnQgRHJpdmVyIgotCWRlcGVuZHMgb24gQUI4NTAwX0NPUkUgJiYgQUI4NTAwX0dQQURDCi0JaGVscAotCSAgU2F5IFkgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBBQjg1MDAgYmF0dGVyeSBtYW5hZ2VtZW50LgotCi1jb25maWcgQkFUVEVSWV9HT0xERklTSAotCXRyaXN0YXRlICJHb2xkZmlzaCBiYXR0ZXJ5IGRyaXZlciIKLQlkZXBlbmRzIG9uIEdPTERGSVNIIHx8IENPTVBJTEVfVEVTVAotCWRlcGVuZHMgb24gSEFTX0lPTUVNCi0JaGVscAotCSAgU2F5IFkgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBiYXR0ZXJ5IGFuZCBBQyBwb3dlciBpbiB0aGUKLQkgIEdvbGRmaXNoIGVtdWxhdG9yLgotCi1jb25maWcgQkFUVEVSWV9SVDUwMzMKLQl0cmlzdGF0ZSAiUlQ1MDMzIGZ1ZWwgZ2F1Z2Ugc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE1GRF9SVDUwMzMKLQloZWxwCi0JICBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgYmF0dGVyeSBmdWVsIGdhdWdlIGluIFJpY2h0ZWsgUlQ1MDMzIFBNSUMuCi0JICBUaGUgZnVlbGdhdWdlIGNhbGN1bGF0ZXMgYW5kIGRldGVybWluZXMgdGhlIGJhdHRlcnkgc3RhdGUgb2YgY2hhcmdlCi0JICBhY2NvcmRpbmcgdG8gYmF0dGVyeSBvcGVuIGNpcmN1aXQgdm9sdGFnZS4KLQotY29uZmlnIENIQVJHRVJfUlQ5NDU1Ci0JdHJpc3RhdGUgIlJpY2h0ZWsgUlQ5NDU1IGJhdHRlcnkgY2hhcmdlciBkcml2ZXIiCi0JZGVwZW5kcyBvbiBJMkMKLQlkZXBlbmRzIG9uIEdQSU9MSUIgfHwgQ09NUElMRV9URVNUCi0Jc2VsZWN0IFJFR01BUF9JMkMKLQloZWxwCi0JICBTYXkgWSB0byBlbmFibGUgc3VwcG9ydCBmb3IgUmljaHRlayBSVDk0NTUgYmF0dGVyeSBjaGFyZ2VyLgotCi1jb25maWcgQVhQMjBYX1BPV0VSCi0JdHJpc3RhdGUgIkFYUDIweCBwb3dlciBzdXBwbHkgZHJpdmVyIgotCWRlcGVuZHMgb24gTUZEX0FYUDIwWAotCWhlbHAKLQkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBwb3dlciBzdXBwbHkgZmVhdHVyZXMgb2YKLQkgIEFYUDIweCBQTUlDLgotCi1lbmRpZiAjIFBPV0VSX1NVUFBMWQotCi1zb3VyY2UgImRyaXZlcnMvcG93ZXIvcmVzZXQvS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9wb3dlci9hdnMvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9wb3dlci9yZXNldC9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL3Bvd2VyL3N1cHBseS9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9NYWtlZmlsZSBiL2RyaXZlcnMvcG93ZXIvTWFrZWZpbGUKaW5kZXggZTQ2Yjc1ZC4uZmYzNWM3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3Bvd2VyL01ha2VmaWxlCkBAIC0xLDc2ICsxLDMgQEAKLXN1YmRpci1jY2ZsYWdzLSQoQ09ORklHX1BPV0VSX1NVUFBMWV9ERUJVRykgOj0gLURERUJVRwotCi1wb3dlcl9zdXBwbHkteQkJCQk6PSBwb3dlcl9zdXBwbHlfY29yZS5vCi1wb3dlcl9zdXBwbHktJChDT05GSUdfU1lTRlMpCQkrPSBwb3dlcl9zdXBwbHlfc3lzZnMubwotcG93ZXJfc3VwcGx5LSQoQ09ORklHX0xFRFNfVFJJR0dFUlMpCSs9IHBvd2VyX3N1cHBseV9sZWRzLm8KLQotb2JqLSQoQ09ORklHX1BPV0VSX1NVUFBMWSkJKz0gcG93ZXJfc3VwcGx5Lm8KLW9iai0kKENPTkZJR19HRU5FUklDX0FEQ19CQVRURVJZKQkrPSBnZW5lcmljLWFkYy1iYXR0ZXJ5Lm8KLQotb2JqLSQoQ09ORklHX1BEQV9QT1dFUikJCSs9IHBkYV9wb3dlci5vCi1vYmotJChDT05GSUdfQVBNX1BPV0VSKQkJKz0gYXBtX3Bvd2VyLm8KLW9iai0kKENPTkZJR19BWFAyMFhfUE9XRVIpCSs9IGF4cDIweF91c2JfcG93ZXIubwotb2JqLSQoQ09ORklHX01BWDg5MjVfUE9XRVIpCSs9IG1heDg5MjVfcG93ZXIubwotb2JqLSQoQ09ORklHX1dNODMxWF9CQUNLVVApCSs9IHdtODMxeF9iYWNrdXAubwotb2JqLSQoQ09ORklHX1dNODMxWF9QT1dFUikJKz0gd204MzF4X3Bvd2VyLm8KLW9iai0kKENPTkZJR19XTTgzNTBfUE9XRVIpCSs9IHdtODM1MF9wb3dlci5vCi1vYmotJChDT05GSUdfVEVTVF9QT1dFUikJKz0gdGVzdF9wb3dlci5vCi0KLW9iai0kKENPTkZJR19CQVRURVJZXzg4UE04NjBYKQkrPSA4OHBtODYweF9iYXR0ZXJ5Lm8KLW9iai0kKENPTkZJR19CQVRURVJZX0FDVDg5NDVBKQkrPSBhY3Q4OTQ1YV9jaGFyZ2VyLm8KLW9iai0kKENPTkZJR19CQVRURVJZX0RTMjc2MCkJKz0gZHMyNzYwX2JhdHRlcnkubwotb2JqLSQoQ09ORklHX0JBVFRFUllfRFMyNzgwKQkrPSBkczI3ODBfYmF0dGVyeS5vCi1vYmotJChDT05GSUdfQkFUVEVSWV9EUzI3ODEpCSs9IGRzMjc4MV9iYXR0ZXJ5Lm8KLW9iai0kKENPTkZJR19CQVRURVJZX0RTMjc4MikJKz0gZHMyNzgyX2JhdHRlcnkubwotb2JqLSQoQ09ORklHX0JBVFRFUllfR0FVR0VfTFRDMjk0MSkJKz0gbHRjMjk0MS1iYXR0ZXJ5LWdhdWdlLm8KLW9iai0kKENPTkZJR19CQVRURVJZX0dPTERGSVNIKQkrPSBnb2xkZmlzaF9iYXR0ZXJ5Lm8KLW9iai0kKENPTkZJR19CQVRURVJZX1BNVSkJKz0gcG11X2JhdHRlcnkubwotb2JqLSQoQ09ORklHX0JBVFRFUllfT0xQQykJKz0gb2xwY19iYXR0ZXJ5Lm8KLW9iai0kKENPTkZJR19CQVRURVJZX1RPU0EpCSs9IHRvc2FfYmF0dGVyeS5vCi1vYmotJChDT05GSUdfQkFUVEVSWV9DT0xMSUUpCSs9IGNvbGxpZV9iYXR0ZXJ5Lm8KLW9iai0kKENPTkZJR19CQVRURVJZX0lQQVFfTUlDUk8pICs9IGlwYXFfbWljcm9fYmF0dGVyeS5vCi1vYmotJChDT05GSUdfQkFUVEVSWV9XTTk3WFgpCSs9IHdtOTd4eF9iYXR0ZXJ5Lm8KLW9iai0kKENPTkZJR19CQVRURVJZX1NCUykJKz0gc2JzLWJhdHRlcnkubwotb2JqLSQoQ09ORklHX0JBVFRFUllfQlEyN1hYWCkJKz0gYnEyN3h4eF9iYXR0ZXJ5Lm8KLW9iai0kKENPTkZJR19CQVRURVJZX0JRMjdYWFhfSTJDKSArPSBicTI3eHh4X2JhdHRlcnlfaTJjLm8KLW9iai0kKENPTkZJR19CQVRURVJZX0RBOTAzMCkJKz0gZGE5MDMwX2JhdHRlcnkubwotb2JqLSQoQ09ORklHX0JBVFRFUllfREE5MDUyKQkrPSBkYTkwNTItYmF0dGVyeS5vCi1vYmotJChDT05GSUdfQ0hBUkdFUl9EQTkxNTApCSs9IGRhOTE1MC1jaGFyZ2VyLm8KLW9iai0kKENPTkZJR19CQVRURVJZX0RBOTE1MCkJKz0gZGE5MTUwLWZnLm8KLW9iai0kKENPTkZJR19CQVRURVJZX01BWDE3MDQwKQkrPSBtYXgxNzA0MF9iYXR0ZXJ5Lm8KLW9iai0kKENPTkZJR19CQVRURVJZX01BWDE3MDQyKQkrPSBtYXgxNzA0Ml9iYXR0ZXJ5Lm8KLW9iai0kKENPTkZJR19CQVRURVJZX1oyKQkrPSB6Ml9iYXR0ZXJ5Lm8KLW9iai0kKENPTkZJR19CQVRURVJZX1JUNTAzMykJKz0gcnQ1MDMzX2JhdHRlcnkubwotb2JqLSQoQ09ORklHX0NIQVJHRVJfUlQ5NDU1KQkrPSBydDk0NTVfY2hhcmdlci5vCi1vYmotJChDT05GSUdfQkFUVEVSWV9TM0NfQURDKQkrPSBzM2NfYWRjX2JhdHRlcnkubwotb2JqLSQoQ09ORklHX0JBVFRFUllfVFdMNDAzMF9NQURDKQkrPSB0d2w0MDMwX21hZGNfYmF0dGVyeS5vCi1vYmotJChDT05GSUdfQ0hBUkdFUl84OFBNODYwWCkJKz0gODhwbTg2MHhfY2hhcmdlci5vCi1vYmotJChDT05GSUdfQ0hBUkdFUl9QQ0Y1MDYzMykJKz0gcGNmNTA2MzMtY2hhcmdlci5vCi1vYmotJChDT05GSUdfQkFUVEVSWV9KWjQ3NDApCSs9IGp6NDc0MC1iYXR0ZXJ5Lm8KLW9iai0kKENPTkZJR19CQVRURVJZX0lOVEVMX01JRCkJKz0gaW50ZWxfbWlkX2JhdHRlcnkubwotb2JqLSQoQ09ORklHX0JBVFRFUllfUlg1MSkJKz0gcng1MV9iYXR0ZXJ5Lm8KLW9iai0kKENPTkZJR19BQjg1MDBfQk0pCQkrPSBhYjg1MDBfYm1kYXRhLm8gYWI4NTAwX2NoYXJnZXIubyBhYjg1MDBfZmcubyBhYjg1MDBfYnRlbXAubyBhYng1MDBfY2hhcmdhbGcubyBwbTIzMDFfY2hhcmdlci5vCi1vYmotJChDT05GSUdfQ0hBUkdFUl9JU1AxNzA0KQkrPSBpc3AxNzA0X2NoYXJnZXIubwotb2JqLSQoQ09ORklHX0NIQVJHRVJfTUFYODkwMykJKz0gbWF4ODkwM19jaGFyZ2VyLm8KLW9iai0kKENPTkZJR19DSEFSR0VSX1RXTDQwMzApCSs9IHR3bDQwMzBfY2hhcmdlci5vCi1vYmotJChDT05GSUdfQ0hBUkdFUl9MUDg3MjcpCSs9IGxwODcyN19jaGFyZ2VyLm8KLW9iai0kKENPTkZJR19DSEFSR0VSX0xQODc4OCkJKz0gbHA4Nzg4LWNoYXJnZXIubwotb2JqLSQoQ09ORklHX0NIQVJHRVJfR1BJTykJKz0gZ3Bpby1jaGFyZ2VyLm8KLW9iai0kKENPTkZJR19DSEFSR0VSX01BTkFHRVIpCSs9IGNoYXJnZXItbWFuYWdlci5vCi1vYmotJChDT05GSUdfQ0hBUkdFUl9NQVgxNDU3NykJKz0gbWF4MTQ1NzdfY2hhcmdlci5vCi1vYmotJChDT05GSUdfQ0hBUkdFUl9NQVg3NzY5MykJKz0gbWF4Nzc2OTNfY2hhcmdlci5vCi1vYmotJChDT05GSUdfQ0hBUkdFUl9NQVg4OTk3KQkrPSBtYXg4OTk3X2NoYXJnZXIubwotb2JqLSQoQ09ORklHX0NIQVJHRVJfTUFYODk5OCkJKz0gbWF4ODk5OF9jaGFyZ2VyLm8KLW9iai0kKENPTkZJR19DSEFSR0VSX1FDT01fU01CQikJKz0gcWNvbV9zbWJiLm8KLW9iai0kKENPTkZJR19DSEFSR0VSX0JRMjQxNVgpCSs9IGJxMjQxNXhfY2hhcmdlci5vCi1vYmotJChDT05GSUdfQ0hBUkdFUl9CUTI0MTkwKQkrPSBicTI0MTkwX2NoYXJnZXIubwotb2JqLSQoQ09ORklHX0NIQVJHRVJfQlEyNDI1NykJKz0gYnEyNDI1N19jaGFyZ2VyLm8KLW9iai0kKENPTkZJR19DSEFSR0VSX0JRMjQ3MzUpCSs9IGJxMjQ3MzUtY2hhcmdlci5vCi1vYmotJChDT05GSUdfQ0hBUkdFUl9CUTI1ODkwKQkrPSBicTI1ODkwX2NoYXJnZXIubwogb2JqLSQoQ09ORklHX1BPV0VSX0FWUykJCSs9IGF2cy8KLW9iai0kKENPTkZJR19DSEFSR0VSX1NNQjM0NykJKz0gc21iMzQ3LWNoYXJnZXIubwotb2JqLSQoQ09ORklHX0NIQVJHRVJfVFBTNjUwOTApCSs9IHRwczY1MDkwLWNoYXJnZXIubwotb2JqLSQoQ09ORklHX0NIQVJHRVJfVFBTNjUyMTcpCSs9IHRwczY1MjE3X2NoYXJnZXIubwogb2JqLSQoQ09ORklHX1BPV0VSX1JFU0VUKQkrPSByZXNldC8KLW9iai0kKENPTkZJR19BWFAyODhfRlVFTF9HQVVHRSkgKz0gYXhwMjg4X2Z1ZWxfZ2F1Z2Uubwotb2JqLSQoQ09ORklHX0FYUDI4OF9DSEFSR0VSKQkrPSBheHAyODhfY2hhcmdlci5vCitvYmotJChDT05GSUdfUE9XRVJfU1VQUExZKQkrPSBzdXBwbHkvCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2FiODUwMF9idGVtcC5jIGIvZHJpdmVycy9wb3dlci9hYjg1MDBfYnRlbXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyZTVkZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3Bvd2VyL2FiODUwMF9idGVtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIxMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBTVC1Fcmljc3NvbiBTQSAyMDEyCi0gKgotICogQmF0dGVyeSB0ZW1wZXJhdHVyZSBkcml2ZXIgZm9yIEFCODUwMAotICoKLSAqIExpY2Vuc2UgVGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyCi0gKiBBdXRob3I6Ci0gKglKb2hhbiBQYWxzc29uIDxqb2hhbi5wYWxzc29uQHN0ZXJpY3Nzb24uY29tPgotICoJS2FybCBLb21pZXJvd3NraSA8a2FybC5rb21pZXJvd3NraUBzdGVyaWNzc29uLmNvbT4KLSAqCUFydW4gUiBNdXJ0aHkgPGFydW4ubXVydGh5QHN0ZXJpY3Nzb24uY29tPgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL2FieDUwMC5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9hYng1MDAvYWI4NTAwLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL2FieDUwMC9hYjg1MDAtYm0uaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvYWJ4NTAwL2FiODUwMC1ncGFkYy5oPgotCi0jZGVmaW5lIFZUVk9VVF9WCQkJMTgwMAotCi0jZGVmaW5lIEJURU1QX1RIRVJNQUxfTE9XX0xJTUlUCQktMTAKLSNkZWZpbmUgQlRFTVBfVEhFUk1BTF9NRURfTElNSVQJCTAKLSNkZWZpbmUgQlRFTVBfVEhFUk1BTF9ISUdIX0xJTUlUXzUyCTUyCi0jZGVmaW5lIEJURU1QX1RIRVJNQUxfSElHSF9MSU1JVF81Nwk1NwotI2RlZmluZSBCVEVNUF9USEVSTUFMX0hJR0hfTElNSVRfNjIJNjIKLQotI2RlZmluZSBCVEVNUF9CQVRDVFJMX0NVUlJfU1JDXzdVQQk3Ci0jZGVmaW5lIEJURU1QX0JBVENUUkxfQ1VSUl9TUkNfMjBVQQkyMAotCi0jZGVmaW5lIEJURU1QX0JBVENUUkxfQ1VSUl9TUkNfMTZVQQkxNgotI2RlZmluZSBCVEVNUF9CQVRDVFJMX0NVUlJfU1JDXzE4VUEJMTgKLQotI2RlZmluZSBCVEVNUF9CQVRDVFJMX0NVUlJfU1JDXzYwVUEJNjAKLSNkZWZpbmUgQlRFTVBfQkFUQ1RSTF9DVVJSX1NSQ18xMjBVQQkxMjAKLQotLyoqCi0gKiBzdHJ1Y3QgYWI4NTAwX2J0ZW1wX2ludGVycnVwdHMgLSBhYjg1MDAgaW50ZXJydXB0cwotICogQG5hbWU6CW5hbWUgb2YgdGhlIGludGVycnVwdAotICogQGlzcgkJZnVuY3Rpb24gcG9pbnRlciB0byB0aGUgaXNyCi0gKi8KLXN0cnVjdCBhYjg1MDBfYnRlbXBfaW50ZXJydXB0cyB7Ci0JY2hhciAqbmFtZTsKLQlpcnFyZXR1cm5fdCAoKmlzcikoaW50IGlycSwgdm9pZCAqZGF0YSk7Ci19OwotCi1zdHJ1Y3QgYWI4NTAwX2J0ZW1wX2V2ZW50cyB7Ci0JYm9vbCBiYXR0X3JlbTsKLQlib29sIGJ0ZW1wX2hpZ2g7Ci0JYm9vbCBidGVtcF9tZWRoaWdoOwotCWJvb2wgYnRlbXBfbG93bWVkOwotCWJvb2wgYnRlbXBfbG93OwotCWJvb2wgYWNfY29ubjsKLQlib29sIHVzYl9jb25uOwotfTsKLQotc3RydWN0IGFiODUwMF9idGVtcF9yYW5nZXMgewotCWludCBidGVtcF9oaWdoX2xpbWl0OwotCWludCBidGVtcF9tZWRfbGltaXQ7Ci0JaW50IGJ0ZW1wX2xvd19saW1pdDsKLX07Ci0KLS8qKgotICogc3RydWN0IGFiODUwMF9idGVtcCAtIGFiODUwMCBCVEVNUCBkZXZpY2UgaW5mb3JtYXRpb24KLSAqIEBkZXY6CQlQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgZGV2aWNlCi0gKiBAbm9kZToJCUxpc3Qgb2YgQUI4NTAwIEJURU1QcywgaGVuY2UgcHJlcGFyZWQgZm9yIHJlZW50cmFuY2UKLSAqIEBjdXJyX3NvdXJjZToJV2hhdCBjdXJyZW50IHNvdXJjZSB3ZSB1c2UsIGluIHVBCi0gKiBAYmF0X3RlbXA6CQlEaXNwYXRjaGVkIGJhdHRlcnkgdGVtcGVyYXR1cmUgaW4gZGVncmVlIENlbGNpdXMKLSAqIEBwcmV2X2JhdF90ZW1wCUxhc3QgbWVhc3VyZWQgYmF0dGVyeSB0ZW1wZXJhdHVyZSBpbiBkZWdyZWUgQ2VsY2l1cwotICogQHBhcmVudDoJCVBvaW50ZXIgdG8gdGhlIHN0cnVjdCBhYjg1MDAKLSAqIEBncGFkYzoJCVBvaW50ZXIgdG8gdGhlIHN0cnVjdCBncGFkYwotICogQGZnOgkJCVBvaW50ZXIgdG8gdGhlIHN0cnVjdCBmZwotICogQGJtOiAgICAgICAgICAgCVBsYXRmb3JtIHNwZWNpZmljIGJhdHRlcnkgbWFuYWdlbWVudCBpbmZvcm1hdGlvbgotICogQGJ0ZW1wX3BzeToJCVN0cnVjdHVyZSBmb3IgQlRFTVAgc3BlY2lmaWMgYmF0dGVyeSBwcm9wZXJ0aWVzCi0gKiBAZXZlbnRzOgkJU3RydWN0dXJlIGZvciBpbmZvcm1hdGlvbiBhYm91dCBldmVudHMgdHJpZ2dlcmVkCi0gKiBAYnRlbXBfcmFuZ2VzOglCYXR0ZXJ5IHRlbXBlcmF0dXJlIHJhbmdlIHN0cnVjdHVyZQotICogQGJ0ZW1wX3dxOgkJV29yayBxdWV1ZSBmb3IgbWVhc3VyaW5nIHRoZSB0ZW1wZXJhdHVyZSBwZXJpb2RpY2FsbHkKLSAqIEBidGVtcF9wZXJpb2RpY193b3JrOglXb3JrIGZvciBtZWFzdXJpbmcgdGhlIHRlbXBlcmF0dXJlIHBlcmlvZGljYWxseQotICogQGluaXRpYWxpemVkOglUcnVlIGlmIGJhdHRlcnkgaWQgcmVhZC4KLSAqLwotc3RydWN0IGFiODUwMF9idGVtcCB7Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKLQlpbnQgY3Vycl9zb3VyY2U7Ci0JaW50IGJhdF90ZW1wOwotCWludCBwcmV2X2JhdF90ZW1wOwotCXN0cnVjdCBhYjg1MDAgKnBhcmVudDsKLQlzdHJ1Y3QgYWI4NTAwX2dwYWRjICpncGFkYzsKLQlzdHJ1Y3QgYWI4NTAwX2ZnICpmZzsKLQlzdHJ1Y3QgYWJ4NTAwX2JtX2RhdGEgKmJtOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmJ0ZW1wX3BzeTsKLQlzdHJ1Y3QgYWI4NTAwX2J0ZW1wX2V2ZW50cyBldmVudHM7Ci0Jc3RydWN0IGFiODUwMF9idGVtcF9yYW5nZXMgYnRlbXBfcmFuZ2VzOwotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpidGVtcF93cTsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGJ0ZW1wX3BlcmlvZGljX3dvcms7Ci0JYm9vbCBpbml0aWFsaXplZDsKLX07Ci0KLS8qIEJURU1QIHBvd2VyIHN1cHBseSBwcm9wZXJ0aWVzICovCi1zdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgYWI4NTAwX2J0ZW1wX3Byb3BzW10gPSB7Ci0JUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUsCi0JUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWSwKLQlQT1dFUl9TVVBQTFlfUFJPUF9URU1QLAotfTsKLQotc3RhdGljIExJU1RfSEVBRChhYjg1MDBfYnRlbXBfbGlzdCk7Ci0KLS8qKgotICogYWI4NTAwX2J0ZW1wX2dldCgpIC0gcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgcHJpbWFyeSBBQjg1MDAgQlRFTVAKLSAqIChpLmUuIHRoZSBmaXJzdCBCVEVNUCBpbiB0aGUgaW5zdGFuY2UgbGlzdCkKLSAqLwotc3RydWN0IGFiODUwMF9idGVtcCAqYWI4NTAwX2J0ZW1wX2dldCh2b2lkKQotewotCXN0cnVjdCBhYjg1MDBfYnRlbXAgKmJ0ZW1wOwotCWJ0ZW1wID0gbGlzdF9maXJzdF9lbnRyeSgmYWI4NTAwX2J0ZW1wX2xpc3QsIHN0cnVjdCBhYjg1MDBfYnRlbXAsIG5vZGUpOwotCi0JcmV0dXJuIGJ0ZW1wOwotfQotRVhQT1JUX1NZTUJPTChhYjg1MDBfYnRlbXBfZ2V0KTsKLQotLyoqCi0gKiBhYjg1MDBfYnRlbXBfYmF0Y3RybF92b2x0X3RvX3JlcygpIC0gY29udmVydCBiYXRjdHJsIHZvbHRhZ2UgdG8gcmVzaXN0YW5jZQotICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2J0ZW1wIHN0cnVjdHVyZQotICogQHZfYmF0Y3RybDoJbWVhc3VyZWQgYmF0Y3RybCB2b2x0YWdlCi0gKiBAaW5zdF9jdXJyOgltZWFzdXJlZCBpbnN0YW50IGN1cnJlbnQKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGJhdHRlcnkgcmVzaXN0YW5jZSB0aGF0IGlzCi0gKiBkZXJpdmVkIGZyb20gdGhlIEJBVENUUkwgdm9sdGFnZS4KLSAqIFJldHVybnMgdmFsdWUgaW4gT2htcy4KLSAqLwotc3RhdGljIGludCBhYjg1MDBfYnRlbXBfYmF0Y3RybF92b2x0X3RvX3JlcyhzdHJ1Y3QgYWI4NTAwX2J0ZW1wICpkaSwKLQlpbnQgdl9iYXRjdHJsLCBpbnQgaW5zdF9jdXJyKQotewotCWludCByYnM7Ci0KLQlpZiAoaXNfYWI4NTAwXzFwMV9vcl9lYXJsaWVyKGRpLT5wYXJlbnQpKSB7Ci0JCS8qCi0JCSAqIEZvciBBQkIgY3V0MS4wIGFuZCAxLjEgQkFUX0NUUkwgaXMgaW50ZXJuYWxseQotCQkgKiBjb25uZWN0ZWQgdG8gMS44ViB0aHJvdWdoIGEgNDUwayByZXNpc3RvcgotCQkgKi8KLQkJcmV0dXJuICg0NTAwMDAgKiAodl9iYXRjdHJsKSkgLyAoMTgwMCAtIHZfYmF0Y3RybCk7Ci0JfQotCi0JaWYgKGRpLT5ibS0+YWRjX3RoZXJtID09IEFCeDUwMF9BRENfVEhFUk1fQkFUQ1RSTCkgewotCQkvKgotCQkgKiBJZiB0aGUgYmF0dGVyeSBoYXMgaW50ZXJuYWwgTlRDLCB3ZSB1c2UgdGhlIGN1cnJlbnQKLQkJICogc291cmNlIHRvIGNhbGN1bGF0ZSB0aGUgcmVzaXN0YW5jZS4KLQkJICovCi0JCXJicyA9ICh2X2JhdGN0cmwgKiAxMDAwCi0JCSAgICAgICAtIGRpLT5ibS0+Z25kX2xpZnRfcmVzaXN0YW5jZSAqIGluc3RfY3VycikKLQkJICAgICAgLyBkaS0+Y3Vycl9zb3VyY2U7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogQkFUX0NUUkwgaXMgaW50ZXJuYWxseQotCQkgKiBjb25uZWN0ZWQgdG8gMS44ViB0aHJvdWdoIGEgODBrIHJlc2lzdG9yCi0JCSAqLwotCQlyYnMgPSAoODAwMDAgKiAodl9iYXRjdHJsKSkgLyAoMTgwMCAtIHZfYmF0Y3RybCk7Ci0JfQotCi0JcmV0dXJuIHJiczsKLX0KLQotLyoqCi0gKiBhYjg1MDBfYnRlbXBfcmVhZF9iYXRjdHJsX3ZvbHRhZ2UoKSAtIG1lYXN1cmUgYmF0Y3RybCB2b2x0YWdlCi0gKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfYnRlbXAgc3RydWN0dXJlCi0gKgotICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB2b2x0YWdlIG9uIEJBVENUUkwuIFJldHVybnMgdmFsdWUgaW4gbVYuCi0gKi8KLXN0YXRpYyBpbnQgYWI4NTAwX2J0ZW1wX3JlYWRfYmF0Y3RybF92b2x0YWdlKHN0cnVjdCBhYjg1MDBfYnRlbXAgKmRpKQotewotCWludCB2YnRlbXA7Ci0Jc3RhdGljIGludCBwcmV2OwotCi0JdmJ0ZW1wID0gYWI4NTAwX2dwYWRjX2NvbnZlcnQoZGktPmdwYWRjLCBCQVRfQ1RSTCk7Ci0JaWYgKHZidGVtcCA8IDApIHsKLQkJZGV2X2VycihkaS0+ZGV2LAotCQkJIiVzIGdwYWRjIGNvbnZlcnNpb24gZmFpbGVkLCB1c2luZyBwcmV2aW91cyB2YWx1ZSIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiBwcmV2OwotCX0KLQlwcmV2ID0gdmJ0ZW1wOwotCXJldHVybiB2YnRlbXA7Ci19Ci0KLS8qKgotICogYWI4NTAwX2J0ZW1wX2N1cnJfc291cmNlX2VuYWJsZSgpIC0gZW5hYmxlL2Rpc2FibGUgYmF0Y3RybCBjdXJyZW50IHNvdXJjZQotICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2J0ZW1wIHN0cnVjdHVyZQotICogQGVuYWJsZToJZW5hYmxlIG9yIGRpc2FibGUgdGhlIGN1cnJlbnQgc291cmNlCi0gKgotICogRW5hYmxlIG9yIGRpc2FibGUgdGhlIGN1cnJlbnQgc291cmNlcyBmb3IgdGhlIEJhdEN0cmwgQUQgY2hhbm5lbAotICovCi1zdGF0aWMgaW50IGFiODUwMF9idGVtcF9jdXJyX3NvdXJjZV9lbmFibGUoc3RydWN0IGFiODUwMF9idGVtcCAqZGksCi0JYm9vbCBlbmFibGUpCi17Ci0JaW50IGN1cnI7Ci0JaW50IHJldCA9IDA7Ci0KLQkvKgotCSAqIEJBVENUUkwgY3VycmVudCBzb3VyY2VzIGFyZSBpbmNsdWRlZCBvbiBBQjg1MDAgY3V0Mi4wCi0JICogYW5kIGZ1dHVyZSB2ZXJzaW9ucwotCSAqLwotCWlmIChpc19hYjg1MDBfMXAxX29yX2VhcmxpZXIoZGktPnBhcmVudCkpCi0JCXJldHVybiAwOwotCi0JLyogT25seSBkbyB0aGlzIGZvciBiYXR0ZXJpZXMgd2l0aCBpbnRlcm5hbCBOVEMgKi8KLQlpZiAoZGktPmJtLT5hZGNfdGhlcm0gPT0gQUJ4NTAwX0FEQ19USEVSTV9CQVRDVFJMICYmIGVuYWJsZSkgewotCi0JCWlmIChpc19hYjg1NDAoZGktPnBhcmVudCkpIHsKLQkJCWlmIChkaS0+Y3Vycl9zb3VyY2UgPT0gQlRFTVBfQkFUQ1RSTF9DVVJSX1NSQ182MFVBKQotCQkJCWN1cnIgPSBCQVRfQ1RSTF82MFVfRU5BOwotCQkJZWxzZQotCQkJCWN1cnIgPSBCQVRfQ1RSTF8xMjBVX0VOQTsKLQkJfSBlbHNlIGlmIChpc19hYjk1NDAoZGktPnBhcmVudCkgfHwgaXNfYWI4NTA1KGRpLT5wYXJlbnQpKSB7Ci0JCQlpZiAoZGktPmN1cnJfc291cmNlID09IEJURU1QX0JBVENUUkxfQ1VSUl9TUkNfMTZVQSkKLQkJCQljdXJyID0gQkFUX0NUUkxfMTZVX0VOQTsKLQkJCWVsc2UKLQkJCQljdXJyID0gQkFUX0NUUkxfMThVX0VOQTsKLQkJfSBlbHNlIHsKLQkJCWlmIChkaS0+Y3Vycl9zb3VyY2UgPT0gQlRFTVBfQkFUQ1RSTF9DVVJSX1NSQ183VUEpCi0JCQkJY3VyciA9IEJBVF9DVFJMXzdVX0VOQTsKLQkJCWVsc2UKLQkJCQljdXJyID0gQkFUX0NUUkxfMjBVX0VOQTsKLQkJfQotCi0JCWRldl9kYmcoZGktPmRldiwgIlNldCBCQVRDVFJMICVkdUFcbiIsIGRpLT5jdXJyX3NvdXJjZSk7Ci0KLQkJcmV0ID0gYWJ4NTAwX21hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCi0JCQlBQjg1MDBfQ0hBUkdFUiwgQUI4NTAwX0JBVF9DVFJMX0NVUlJFTlRfU09VUkNFLAotCQkJRk9SQ0VfQkFUX0NUUkxfQ01QX0hJR0gsIEZPUkNFX0JBVF9DVFJMX0NNUF9ISUdIKTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgZmFpbGVkIHNldHRpbmcgY21wX2ZvcmNlXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQotCQkvKgotCQkgKiBXZSBoYXZlIHRvIHdhaXQgb25lIDMya0h6IGN5Y2xlIGJlZm9yZSBlbmFibGluZwotCQkgKiB0aGUgY3VycmVudCBzb3VyY2UsIHNpbmNlIEZvcmNlQmF0Q3RybENtcEhpZ2ggbmVlZHMKLQkJICogdG8gYmUgd3JpdHRlbiBpbiBhIHNlcGFyYXRlIGN5Y2xlCi0JCSAqLwotCQl1ZGVsYXkoMzIpOwotCi0JCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAotCQkJQUI4NTAwX0NIQVJHRVIsIEFCODUwMF9CQVRfQ1RSTF9DVVJSRU5UX1NPVVJDRSwKLQkJCUZPUkNFX0JBVF9DVFJMX0NNUF9ISUdIIHwgY3Vycik7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoZGktPmRldiwgIiVzIGZhaWxlZCBlbmFibGluZyBjdXJyZW50IHNvdXJjZVxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCQlnb3RvIGRpc2FibGVfY3Vycl9zb3VyY2U7Ci0JCX0KLQl9IGVsc2UgaWYgKGRpLT5ibS0+YWRjX3RoZXJtID09IEFCeDUwMF9BRENfVEhFUk1fQkFUQ1RSTCAmJiAhZW5hYmxlKSB7Ci0JCWRldl9kYmcoZGktPmRldiwgIkRpc2FibGUgQkFUQ1RSTCBjdXJyIHNvdXJjZVxuIik7Ci0KLQkJaWYgKGlzX2FiODU0MChkaS0+cGFyZW50KSkgewotCQkJLyogV3JpdGUgMCB0byB0aGUgY3VyciBiaXRzICovCi0JCQlyZXQgPSBhYng1MDBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoCi0JCQkJZGktPmRldiwKLQkJCQlBQjg1MDBfQ0hBUkdFUiwgQUI4NTAwX0JBVF9DVFJMX0NVUlJFTlRfU09VUkNFLAotCQkJCUJBVF9DVFJMXzYwVV9FTkEgfCBCQVRfQ1RSTF8xMjBVX0VOQSwKLQkJCQl+KEJBVF9DVFJMXzYwVV9FTkEgfCBCQVRfQ1RSTF8xMjBVX0VOQSkpOwotCQl9IGVsc2UgaWYgKGlzX2FiOTU0MChkaS0+cGFyZW50KSB8fCBpc19hYjg1MDUoZGktPnBhcmVudCkpIHsKLQkJCS8qIFdyaXRlIDAgdG8gdGhlIGN1cnIgYml0cyAqLwotCQkJcmV0ID0gYWJ4NTAwX21hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKAotCQkJCWRpLT5kZXYsCi0JCQkJQUI4NTAwX0NIQVJHRVIsIEFCODUwMF9CQVRfQ1RSTF9DVVJSRU5UX1NPVVJDRSwKLQkJCQlCQVRfQ1RSTF8xNlVfRU5BIHwgQkFUX0NUUkxfMThVX0VOQSwKLQkJCQl+KEJBVF9DVFJMXzE2VV9FTkEgfCBCQVRfQ1RSTF8xOFVfRU5BKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBXcml0ZSAwIHRvIHRoZSBjdXJyIGJpdHMgKi8KLQkJCXJldCA9IGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZSgKLQkJCQlkaS0+ZGV2LAotCQkJCUFCODUwMF9DSEFSR0VSLCBBQjg1MDBfQkFUX0NUUkxfQ1VSUkVOVF9TT1VSQ0UsCi0JCQkJQkFUX0NUUkxfN1VfRU5BIHwgQkFUX0NUUkxfMjBVX0VOQSwKLQkJCQl+KEJBVF9DVFJMXzdVX0VOQSB8IEJBVF9DVFJMXzIwVV9FTkEpKTsKLQkJfQotCi0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoZGktPmRldiwgIiVzIGZhaWxlZCBkaXNhYmxpbmcgY3VycmVudCBzb3VyY2VcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJZ290byBkaXNhYmxlX2N1cnJfc291cmNlOwotCQl9Ci0KLQkJLyogRW5hYmxlIFB1bGwtVXAgYW5kIGNvbXBhcmF0b3IgKi8KLQkJcmV0ID0gYWJ4NTAwX21hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCi0JCQlBQjg1MDBfQ0hBUkdFUiwJQUI4NTAwX0JBVF9DVFJMX0NVUlJFTlRfU09VUkNFLAotCQkJQkFUX0NUUkxfUFVMTF9VUF9FTkEgfCBCQVRfQ1RSTF9DTVBfRU5BLAotCQkJQkFUX0NUUkxfUFVMTF9VUF9FTkEgfCBCQVRfQ1RSTF9DTVBfRU5BKTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgZmFpbGVkIGVuYWJsaW5nIFBVIGFuZCBjb21wXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCWdvdG8gZW5hYmxlX3B1X2NvbXA7Ci0JCX0KLQotCQkvKgotCQkgKiBXZSBoYXZlIHRvIHdhaXQgb25lIDMya0h6IGN5Y2xlIGJlZm9yZSBkaXNhYmxpbmcKLQkJICogRm9yY2VCYXRDdHJsQ21wSGlnaCBzaW5jZSB0aGlzIG5lZWRzIHRvIGJlIHdyaXR0ZW4KLQkJICogaW4gYSBzZXBhcmF0ZSBjeWNsZQotCQkgKi8KLQkJdWRlbGF5KDMyKTsKLQotCQkvKiBEaXNhYmxlICdmb3JjZSBjb21wYXJhdG9yJyAqLwotCQlyZXQgPSBhYng1MDBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKLQkJCUFCODUwMF9DSEFSR0VSLCBBQjg1MDBfQkFUX0NUUkxfQ1VSUkVOVF9TT1VSQ0UsCi0JCQlGT1JDRV9CQVRfQ1RSTF9DTVBfSElHSCwgfkZPUkNFX0JBVF9DVFJMX0NNUF9ISUdIKTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgZmFpbGVkIGRpc2FibGluZyBmb3JjZSBjb21wXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCWdvdG8gZGlzYWJsZV9mb3JjZV9jb21wOwotCQl9Ci0JfQotCXJldHVybiByZXQ7Ci0KLQkvKgotCSAqIFdlIGhhdmUgdG8gdHJ5IHVuc2V0dGluZyBGT1JDRV9CQVRfQ1RSTF9DTVBfSElHSCBvbmUgbW9yZSB0aW1lCi0JICogaWYgd2UgZ290IGFuIGVycm9yIGFib3ZlCi0JICovCi1kaXNhYmxlX2N1cnJfc291cmNlOgotCWlmIChpc19hYjg1NDAoZGktPnBhcmVudCkpIHsKLQkJLyogV3JpdGUgMCB0byB0aGUgY3VyciBiaXRzICovCi0JCXJldCA9IGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAotCQkJQUI4NTAwX0NIQVJHRVIsIEFCODUwMF9CQVRfQ1RSTF9DVVJSRU5UX1NPVVJDRSwKLQkJCUJBVF9DVFJMXzYwVV9FTkEgfCBCQVRfQ1RSTF8xMjBVX0VOQSwKLQkJCX4oQkFUX0NUUkxfNjBVX0VOQSB8IEJBVF9DVFJMXzEyMFVfRU5BKSk7Ci0JfSBlbHNlIGlmIChpc19hYjk1NDAoZGktPnBhcmVudCkgfHwgaXNfYWI4NTA1KGRpLT5wYXJlbnQpKSB7Ci0JCS8qIFdyaXRlIDAgdG8gdGhlIGN1cnIgYml0cyAqLwotCQlyZXQgPSBhYng1MDBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKLQkJCUFCODUwMF9DSEFSR0VSLCBBQjg1MDBfQkFUX0NUUkxfQ1VSUkVOVF9TT1VSQ0UsCi0JCQlCQVRfQ1RSTF8xNlVfRU5BIHwgQkFUX0NUUkxfMThVX0VOQSwKLQkJCX4oQkFUX0NUUkxfMTZVX0VOQSB8IEJBVF9DVFJMXzE4VV9FTkEpKTsKLQl9IGVsc2UgewotCQkvKiBXcml0ZSAwIHRvIHRoZSBjdXJyIGJpdHMgKi8KLQkJcmV0ID0gYWJ4NTAwX21hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCi0JCQlBQjg1MDBfQ0hBUkdFUiwgQUI4NTAwX0JBVF9DVFJMX0NVUlJFTlRfU09VUkNFLAotCQkJQkFUX0NUUkxfN1VfRU5BIHwgQkFUX0NUUkxfMjBVX0VOQSwKLQkJCX4oQkFUX0NUUkxfN1VfRU5BIHwgQkFUX0NUUkxfMjBVX0VOQSkpOwotCX0KLQotCWlmIChyZXQpIHsKLQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgZmFpbGVkIGRpc2FibGluZyBjdXJyZW50IHNvdXJjZVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci1lbmFibGVfcHVfY29tcDoKLQkvKiBFbmFibGUgUHVsbC1VcCBhbmQgY29tcGFyYXRvciAqLwotCXJldCA9IGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAotCQlBQjg1MDBfQ0hBUkdFUiwJQUI4NTAwX0JBVF9DVFJMX0NVUlJFTlRfU09VUkNFLAotCQlCQVRfQ1RSTF9QVUxMX1VQX0VOQSB8IEJBVF9DVFJMX0NNUF9FTkEsCi0JCUJBVF9DVFJMX1BVTExfVVBfRU5BIHwgQkFUX0NUUkxfQ01QX0VOQSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRpLT5kZXYsICIlcyBmYWlsZWQgZW5hYmxpbmcgUFUgYW5kIGNvbXBcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi1kaXNhYmxlX2ZvcmNlX2NvbXA6Ci0JLyoKLQkgKiBXZSBoYXZlIHRvIHdhaXQgb25lIDMya0h6IGN5Y2xlIGJlZm9yZSBkaXNhYmxpbmcKLQkgKiBGb3JjZUJhdEN0cmxDbXBIaWdoIHNpbmNlIHRoaXMgbmVlZHMgdG8gYmUgd3JpdHRlbgotCSAqIGluIGEgc2VwYXJhdGUgY3ljbGUKLQkgKi8KLQl1ZGVsYXkoMzIpOwotCi0JLyogRGlzYWJsZSAnZm9yY2UgY29tcGFyYXRvcicgKi8KLQlyZXQgPSBhYng1MDBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKLQkJQUI4NTAwX0NIQVJHRVIsIEFCODUwMF9CQVRfQ1RSTF9DVVJSRU5UX1NPVVJDRSwKLQkJRk9SQ0VfQkFUX0NUUkxfQ01QX0hJR0gsIH5GT1JDRV9CQVRfQ1RSTF9DTVBfSElHSCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRpLT5kZXYsICIlcyBmYWlsZWQgZGlzYWJsaW5nIGZvcmNlIGNvbXBcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBhYjg1MDBfYnRlbXBfZ2V0X2JhdGN0cmxfcmVzKCkgLSBnZXQgYmF0dGVyeSByZXNpc3RhbmNlCi0gKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfYnRlbXAgc3RydWN0dXJlCi0gKgotICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBiYXR0ZXJ5IHBhY2sgaWRlbnRpZmljYXRpb24gcmVzaXN0YW5jZS4KLSAqIFJldHVybnMgdmFsdWUgaW4gT2htcy4KLSAqLwotc3RhdGljIGludCBhYjg1MDBfYnRlbXBfZ2V0X2JhdGN0cmxfcmVzKHN0cnVjdCBhYjg1MDBfYnRlbXAgKmRpKQotewotCWludCByZXQ7Ci0JaW50IGJhdGN0cmwgPSAwOwotCWludCByZXM7Ci0JaW50IGluc3RfY3VycjsKLQlpbnQgaTsKLQotCS8qCi0JICogQkFUQ1RSTCBjdXJyZW50IHNvdXJjZXMgYXJlIGluY2x1ZGVkIG9uIEFCODUwMCBjdXQyLjAKLQkgKiBhbmQgZnV0dXJlIHZlcnNpb25zCi0JICovCi0JcmV0ID0gYWI4NTAwX2J0ZW1wX2N1cnJfc291cmNlX2VuYWJsZShkaSwgdHJ1ZSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRpLT5kZXYsICIlcyBjdXJyIHNvdXJjZSBlbmFibGVkIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWlmICghZGktPmZnKQotCQlkaS0+ZmcgPSBhYjg1MDBfZmdfZ2V0KCk7Ci0JaWYgKCFkaS0+ZmcpIHsKLQkJZGV2X2VycihkaS0+ZGV2LCAiTm8gZmcgZm91bmRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXQgPSBhYjg1MDBfZmdfaW5zdF9jdXJyX3N0YXJ0KGRpLT5mZyk7Ci0KLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZGktPmRldiwgIkZhaWxlZCB0byBzdGFydCBjdXJyZW50IG1lYXN1cmVtZW50XG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlkbyB7Ci0JCW1zbGVlcCgyMCk7Ci0JfSB3aGlsZSAoIWFiODUwMF9mZ19pbnN0X2N1cnJfc3RhcnRlZChkaS0+ZmcpKTsKLQotCWkgPSAwOwotCi0JZG8gewotCQliYXRjdHJsICs9IGFiODUwMF9idGVtcF9yZWFkX2JhdGN0cmxfdm9sdGFnZShkaSk7Ci0JCWkrKzsKLQkJbXNsZWVwKDIwKTsKLQl9IHdoaWxlICghYWI4NTAwX2ZnX2luc3RfY3Vycl9kb25lKGRpLT5mZykpOwotCWJhdGN0cmwgLz0gaTsKLQotCXJldCA9IGFiODUwMF9mZ19pbnN0X2N1cnJfZmluYWxpemUoZGktPmZnLCAmaW5zdF9jdXJyKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZGktPmRldiwgIkZhaWxlZCB0byBmaW5hbGl6ZSBjdXJyZW50IG1lYXN1cmVtZW50XG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXMgPSBhYjg1MDBfYnRlbXBfYmF0Y3RybF92b2x0X3RvX3JlcyhkaSwgYmF0Y3RybCwgaW5zdF9jdXJyKTsKLQotCXJldCA9IGFiODUwMF9idGVtcF9jdXJyX3NvdXJjZV9lbmFibGUoZGksIGZhbHNlKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZGktPmRldiwgIiVzIGN1cnIgc291cmNlIGRpc2FibGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JZGV2X2RiZyhkaS0+ZGV2LCAiJXMgYmF0Y3RybDogJWQgcmVzOiAlZCBpbnN0X2N1cnI6ICVkIHNhbXBsZXM6ICVkXG4iLAotCQlfX2Z1bmNfXywgYmF0Y3RybCwgcmVzLCBpbnN0X2N1cnIsIGkpOwotCi0JcmV0dXJuIHJlczsKLX0KLQotLyoqCi0gKiBhYjg1MDBfYnRlbXBfcmVzX3RvX3RlbXAoKSAtIHJlc2lzdGFuY2UgdG8gdGVtcGVyYXR1cmUKLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9idGVtcCBzdHJ1Y3R1cmUKLSAqIEB0Ymw6CXBvaW50ZXIgdG8gdGhlIHJlc2lhdGFuY2UgdG8gdGVtcGVyYXR1cmUgdGFibGUKLSAqIEB0Ymxfc2l6ZToJc2l6ZSBvZiB0aGUgcmVzaXN0YW5jZSB0byB0ZW1wZXJhdHVyZSB0YWJsZQotICogQHJlczoJcmVzaXN0YW5jZSB0byBjYWxjdWxhdGUgdGhlIHRlbXBlcmF0dXJlIGZyb20KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGJhdHRlcnkgdGVtcGVyYXR1cmUgaW4gZGVncmVlcyBDZWxjaXVzCi0gKiBiYXNlZCBvbiB0aGUgTlRDIHJlc2lzdGFuY2UuCi0gKi8KLXN0YXRpYyBpbnQgYWI4NTAwX2J0ZW1wX3Jlc190b190ZW1wKHN0cnVjdCBhYjg1MDBfYnRlbXAgKmRpLAotCWNvbnN0IHN0cnVjdCBhYng1MDBfcmVzX3RvX3RlbXAgKnRibCwgaW50IHRibF9zaXplLCBpbnQgcmVzKQotewotCWludCBpLCB0ZW1wOwotCS8qCi0JICogQ2FsY3VsYXRlIHRoZSBmb3JtdWxhIGZvciB0aGUgc3RyYWlnaHQgbGluZQotCSAqIFNpbXBsZSBpbnRlcnBvbGF0aW9uIGlmIHdlIGFyZSB3aXRoaW4KLQkgKiB0aGUgcmVzaXN0YW5jZSB0YWJsZSBsaW1pdHMsIGV4dHJhcG9sYXRlCi0JICogaWYgcmVzaXN0YW5jZSBpcyBvdXRzaWRlIHRoZSBsaW1pdHMuCi0JICovCi0JaWYgKHJlcyA+IHRibFswXS5yZXNpc3QpCi0JCWkgPSAwOwotCWVsc2UgaWYgKHJlcyA8PSB0YmxbdGJsX3NpemUgLSAxXS5yZXNpc3QpCi0JCWkgPSB0Ymxfc2l6ZSAtIDI7Ci0JZWxzZSB7Ci0JCWkgPSAwOwotCQl3aGlsZSAoIShyZXMgPD0gdGJsW2ldLnJlc2lzdCAmJgotCQkJcmVzID4gdGJsW2kgKyAxXS5yZXNpc3QpKQotCQkJaSsrOwotCX0KLQotCXRlbXAgPSB0YmxbaV0udGVtcCArICgodGJsW2kgKyAxXS50ZW1wIC0gdGJsW2ldLnRlbXApICoKLQkJKHJlcyAtIHRibFtpXS5yZXNpc3QpKSAvICh0YmxbaSArIDFdLnJlc2lzdCAtIHRibFtpXS5yZXNpc3QpOwotCXJldHVybiB0ZW1wOwotfQotCi0vKioKLSAqIGFiODUwMF9idGVtcF9tZWFzdXJlX3RlbXAoKSAtIG1lYXN1cmUgYmF0dGVyeSB0ZW1wZXJhdHVyZQotICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2J0ZW1wIHN0cnVjdHVyZQotICoKLSAqIFJldHVybnMgYmF0dGVyeSB0ZW1wZXJhdHVyZSAob24gc3VjY2VzcykgZWxzZSB0aGUgcHJldmlvdXMgdGVtcGVyYXR1cmUKLSAqLwotc3RhdGljIGludCBhYjg1MDBfYnRlbXBfbWVhc3VyZV90ZW1wKHN0cnVjdCBhYjg1MDBfYnRlbXAgKmRpKQotewotCWludCB0ZW1wOwotCXN0YXRpYyBpbnQgcHJldjsKLQlpbnQgcmJhdCwgcm50Yywgdm50YzsKLQl1OCBpZDsKLQotCWlkID0gZGktPmJtLT5iYXR0X2lkOwotCi0JaWYgKGRpLT5ibS0+YWRjX3RoZXJtID09IEFCeDUwMF9BRENfVEhFUk1fQkFUQ1RSTCAmJgotCQkJaWQgIT0gQkFUVEVSWV9VTktOT1dOKSB7Ci0KLQkJcmJhdCA9IGFiODUwMF9idGVtcF9nZXRfYmF0Y3RybF9yZXMoZGkpOwotCQlpZiAocmJhdCA8IDApIHsKLQkJCWRldl9lcnIoZGktPmRldiwgIiVzIGdldCBiYXRjdHJsIHJlcyBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJLyoKLQkJCSAqIFJldHVybiBvdXQtb2YtcmFuZ2UgdGVtcGVyYXR1cmUgc28gdGhhdAotCQkJICogY2hhcmdpbmcgaXMgc3RvcHBlZAotCQkJICovCi0JCQlyZXR1cm4gQlRFTVBfVEhFUk1BTF9MT1dfTElNSVQ7Ci0JCX0KLQotCQl0ZW1wID0gYWI4NTAwX2J0ZW1wX3Jlc190b190ZW1wKGRpLAotCQkJZGktPmJtLT5iYXRfdHlwZVtpZF0ucl90b190X3RibCwKLQkJCWRpLT5ibS0+YmF0X3R5cGVbaWRdLm5fdGVtcF90YmxfZWxlbWVudHMsIHJiYXQpOwotCX0gZWxzZSB7Ci0JCXZudGMgPSBhYjg1MDBfZ3BhZGNfY29udmVydChkaS0+Z3BhZGMsIEJURU1QX0JBTEwpOwotCQlpZiAodm50YyA8IDApIHsKLQkJCWRldl9lcnIoZGktPmRldiwKLQkJCQkiJXMgZ3BhZGMgY29udmVyc2lvbiBmYWlsZWQsIgotCQkJCSIgdXNpbmcgcHJldmlvdXMgdmFsdWVcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiBwcmV2OwotCQl9Ci0JCS8qCi0JCSAqIFRoZSBQQ0IgTlRDIGlzIHNvdXJjZWQgZnJvbSBWVFZPVVQgdmlhIGEgMjMwa09obQotCQkgKiByZXNpc3Rvci4KLQkJICovCi0JCXJudGMgPSAyMzAwMDAgKiB2bnRjIC8gKFZUVk9VVF9WIC0gdm50Yyk7Ci0KLQkJdGVtcCA9IGFiODUwMF9idGVtcF9yZXNfdG9fdGVtcChkaSwKLQkJCWRpLT5ibS0+YmF0X3R5cGVbaWRdLnJfdG9fdF90YmwsCi0JCQlkaS0+Ym0tPmJhdF90eXBlW2lkXS5uX3RlbXBfdGJsX2VsZW1lbnRzLCBybnRjKTsKLQkJcHJldiA9IHRlbXA7Ci0JfQotCWRldl9kYmcoZGktPmRldiwgIkJhdHRlcnkgdGVtcGVyYXR1cmUgaXMgJWRcbiIsIHRlbXApOwotCXJldHVybiB0ZW1wOwotfQotCi0vKioKLSAqIGFiODUwMF9idGVtcF9pZCgpIC0gSWRlbnRpZnkgdGhlIGNvbm5lY3RlZCBiYXR0ZXJ5Ci0gKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfYnRlbXAgc3RydWN0dXJlCi0gKgotICogVGhpcyBmdW5jdGlvbiB3aWxsIHRyeSB0byBpZGVudGlmeSB0aGUgYmF0dGVyeSBieSByZWFkaW5nIHRoZSBJRAotICogcmVzaXN0b3IuIFNvbWUgYnJhbmRzIHVzZSBhIGNvbWJpbmVkIElEIHJlc2lzdG9yIHdpdGggYSBOVEMgcmVzaXN0b3IgdG8KLSAqIGJvdGggYmUgYWJsZSB0byBpZGVudGlmeSBhbmQgdG8gcmVhZCB0aGUgdGVtcGVyYXR1cmUgb2YgaXQuCi0gKi8KLXN0YXRpYyBpbnQgYWI4NTAwX2J0ZW1wX2lkKHN0cnVjdCBhYjg1MDBfYnRlbXAgKmRpKQotewotCWludCByZXM7Ci0JdTggaTsKLQlpZiAoaXNfYWI4NTQwKGRpLT5wYXJlbnQpKQotCQlkaS0+Y3Vycl9zb3VyY2UgPSBCVEVNUF9CQVRDVFJMX0NVUlJfU1JDXzYwVUE7Ci0JZWxzZSBpZiAoaXNfYWI5NTQwKGRpLT5wYXJlbnQpIHx8IGlzX2FiODUwNShkaS0+cGFyZW50KSkKLQkJZGktPmN1cnJfc291cmNlID0gQlRFTVBfQkFUQ1RSTF9DVVJSX1NSQ18xNlVBOwotCWVsc2UKLQkJZGktPmN1cnJfc291cmNlID0gQlRFTVBfQkFUQ1RSTF9DVVJSX1NSQ183VUE7Ci0KLQlkaS0+Ym0tPmJhdHRfaWQgPSBCQVRURVJZX1VOS05PV047Ci0KLQlyZXMgPSAgYWI4NTAwX2J0ZW1wX2dldF9iYXRjdHJsX3JlcyhkaSk7Ci0JaWYgKHJlcyA8IDApIHsKLQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgZ2V0IGJhdGN0cmwgcmVzIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQotCS8qIEJBVFRFUllfVU5LTk9XTiBpcyBkZWZpbmVkIG9uIHBvc2l0aW9uIDAsIHNraXAgaXQhICovCi0JZm9yIChpID0gQkFUVEVSWV9VTktOT1dOICsgMTsgaSA8IGRpLT5ibS0+bl9idHlwZXM7IGkrKykgewotCQlpZiAoKHJlcyA8PSBkaS0+Ym0tPmJhdF90eXBlW2ldLnJlc2lzX2hpZ2gpICYmCi0JCQkocmVzID49IGRpLT5ibS0+YmF0X3R5cGVbaV0ucmVzaXNfbG93KSkgewotCQkJZGV2X2RiZyhkaS0+ZGV2LCAiQmF0dGVyeSBkZXRlY3RlZCBvbiAlcyIKLQkJCQkiIGxvdyAlZCA8IHJlcyAlZCA8IGhpZ2g6ICVkIgotCQkJCSIgaW5kZXg6ICVkXG4iLAotCQkJCWRpLT5ibS0+YWRjX3RoZXJtID09IEFCeDUwMF9BRENfVEhFUk1fQkFUQ1RSTCA/Ci0JCQkJIkJBVENUUkwiIDogIkJBVFRFTVAiLAotCQkJCWRpLT5ibS0+YmF0X3R5cGVbaV0ucmVzaXNfbG93LCByZXMsCi0JCQkJZGktPmJtLT5iYXRfdHlwZVtpXS5yZXNpc19oaWdoLCBpKTsKLQotCQkJZGktPmJtLT5iYXR0X2lkID0gaTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKGRpLT5ibS0+YmF0dF9pZCA9PSBCQVRURVJZX1VOS05PV04pIHsKLQkJZGV2X3dhcm4oZGktPmRldiwgIkJhdHRlcnkgaWRlbnRpZmllZCBhcyB1bmtub3duIgotCQkJIiwgcmVzaXN0YW5jZSAlZCBPaG1cbiIsIHJlcyk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0JLyoKLQkgKiBXZSBvbmx5IGhhdmUgdG8gY2hhbmdlIGN1cnJlbnQgc291cmNlIGlmIHRoZQotCSAqIGRldGVjdGVkIHR5cGUgaXMgVHlwZSAxLgotCSAqLwotCWlmIChkaS0+Ym0tPmFkY190aGVybSA9PSBBQng1MDBfQURDX1RIRVJNX0JBVENUUkwgJiYKLQkgICAgZGktPmJtLT5iYXR0X2lkID09IDEpIHsKLQkJaWYgKGlzX2FiODU0MChkaS0+cGFyZW50KSkgewotCQkJZGV2X2RiZyhkaS0+ZGV2LAotCQkJCSJTZXQgQkFUQ1RSTCBjdXJyZW50IHNvdXJjZSB0byA2MHVBXG4iKTsKLQkJCWRpLT5jdXJyX3NvdXJjZSA9IEJURU1QX0JBVENUUkxfQ1VSUl9TUkNfNjBVQTsKLQkJfSBlbHNlIGlmIChpc19hYjk1NDAoZGktPnBhcmVudCkgfHwgaXNfYWI4NTA1KGRpLT5wYXJlbnQpKSB7Ci0JCQlkZXZfZGJnKGRpLT5kZXYsCi0JCQkJIlNldCBCQVRDVFJMIGN1cnJlbnQgc291cmNlIHRvIDE2dUFcbiIpOwotCQkJZGktPmN1cnJfc291cmNlID0gQlRFTVBfQkFUQ1RSTF9DVVJSX1NSQ18xNlVBOwotCQl9IGVsc2UgewotCQkJZGV2X2RiZyhkaS0+ZGV2LCAiU2V0IEJBVENUUkwgY3VycmVudCBzb3VyY2UgdG8gMjB1QVxuIik7Ci0JCQlkaS0+Y3Vycl9zb3VyY2UgPSBCVEVNUF9CQVRDVFJMX0NVUlJfU1JDXzIwVUE7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gZGktPmJtLT5iYXR0X2lkOwotfQotCi0vKioKLSAqIGFiODUwMF9idGVtcF9wZXJpb2RpY193b3JrKCkgLSBNZWFzdXJpbmcgdGhlIHRlbXBlcmF0dXJlIHBlcmlvZGljYWxseQotICogQHdvcms6CXBvaW50ZXIgdG8gdGhlIHdvcmtfc3RydWN0IHN0cnVjdHVyZQotICoKLSAqIFdvcmsgZnVuY3Rpb24gZm9yIG1lYXN1cmluZyB0aGUgdGVtcGVyYXR1cmUgcGVyaW9kaWNhbGx5Ci0gKi8KLXN0YXRpYyB2b2lkIGFiODUwMF9idGVtcF9wZXJpb2RpY193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlpbnQgaW50ZXJ2YWw7Ci0JaW50IGJhdF90ZW1wOwotCXN0cnVjdCBhYjg1MDBfYnRlbXAgKmRpID0gY29udGFpbmVyX29mKHdvcmssCi0JCXN0cnVjdCBhYjg1MDBfYnRlbXAsIGJ0ZW1wX3BlcmlvZGljX3dvcmsud29yayk7Ci0KLQlpZiAoIWRpLT5pbml0aWFsaXplZCkgewotCQkvKiBJZGVudGlmeSB0aGUgYmF0dGVyeSAqLwotCQlpZiAoYWI4NTAwX2J0ZW1wX2lkKGRpKSA8IDApCi0JCQlkZXZfd2FybihkaS0+ZGV2LCAiZmFpbGVkIHRvIGlkZW50aWZ5IHRoZSBiYXR0ZXJ5XG4iKTsKLQl9Ci0KLQliYXRfdGVtcCA9IGFiODUwMF9idGVtcF9tZWFzdXJlX3RlbXAoZGkpOwotCS8qCi0JICogRmlsdGVyIGJhdHRlcnkgdGVtcGVyYXR1cmUuCi0JICogQWxsb3cgZGlyZWN0IHVwZGF0ZXMgb24gdGVtcGVyYXR1cmUgb25seSBpZiB0d28gc2FtcGxlcyByZXN1bHQgaW4KLQkgKiBzYW1lIHRlbXBlcmF0dXJlLiBFbHNlIG9ubHkgYWxsb3cgMSBkZWdyZWUgY2hhbmdlIGZyb20gcHJldmlvdXMKLQkgKiByZXBvcnRlZCB2YWx1ZSBpbiB0aGUgZGlyZWN0aW9uIG9mIHRoZSBuZXcgbWVhc3VyZW1lbnQuCi0JICovCi0JaWYgKChiYXRfdGVtcCA9PSBkaS0+cHJldl9iYXRfdGVtcCkgfHwgIWRpLT5pbml0aWFsaXplZCkgewotCQlpZiAoKGRpLT5iYXRfdGVtcCAhPSBkaS0+cHJldl9iYXRfdGVtcCkgfHwgIWRpLT5pbml0aWFsaXplZCkgewotCQkJZGktPmluaXRpYWxpemVkID0gdHJ1ZTsKLQkJCWRpLT5iYXRfdGVtcCA9IGJhdF90ZW1wOwotCQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGktPmJ0ZW1wX3BzeSk7Ci0JCX0KLQl9IGVsc2UgaWYgKGJhdF90ZW1wIDwgZGktPnByZXZfYmF0X3RlbXApIHsKLQkJZGktPmJhdF90ZW1wLS07Ci0JCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5idGVtcF9wc3kpOwotCX0gZWxzZSBpZiAoYmF0X3RlbXAgPiBkaS0+cHJldl9iYXRfdGVtcCkgewotCQlkaS0+YmF0X3RlbXArKzsKLQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGktPmJ0ZW1wX3BzeSk7Ci0JfQotCWRpLT5wcmV2X2JhdF90ZW1wID0gYmF0X3RlbXA7Ci0KLQlpZiAoZGktPmV2ZW50cy5hY19jb25uIHx8IGRpLT5ldmVudHMudXNiX2Nvbm4pCi0JCWludGVydmFsID0gZGktPmJtLT50ZW1wX2ludGVydmFsX2NoZzsKLQllbHNlCi0JCWludGVydmFsID0gZGktPmJtLT50ZW1wX2ludGVydmFsX25vY2hnOwotCi0JLyogU2NoZWR1bGUgYSBuZXcgbWVhc3VyZW1lbnQgKi8KLQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmJ0ZW1wX3dxLAotCQkmZGktPmJ0ZW1wX3BlcmlvZGljX3dvcmssCi0JCXJvdW5kX2ppZmZpZXMoaW50ZXJ2YWwgKiBIWikpOwotfQotCi0vKioKLSAqIGFiODUwMF9idGVtcF9iYXRjdHJsaW5kYl9oYW5kbGVyKCkgLSBiYXR0ZXJ5IHJlbW92YWwgZGV0ZWN0ZWQKLSAqIEBpcnE6ICAgICAgIGludGVycnVwdCBudW1iZXIKLSAqIEBfZGk6ICAgICAgIHZvaWQgcG9pbnRlciB0aGF0IGhhcyB0byBhZGRyZXNzIG9mIGFiODUwMF9idGVtcAotICoKLSAqIFJldHVybnMgSVJRIHN0YXR1cyhJUlFfSEFORExFRCkKLSAqLwotc3RhdGljIGlycXJldHVybl90IGFiODUwMF9idGVtcF9iYXRjdHJsaW5kYl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKl9kaSkKLXsKLQlzdHJ1Y3QgYWI4NTAwX2J0ZW1wICpkaSA9IF9kaTsKLQlkZXZfZXJyKGRpLT5kZXYsICJCYXR0ZXJ5IHJlbW92YWwgZGV0ZWN0ZWQhXG4iKTsKLQotCWRpLT5ldmVudHMuYmF0dF9yZW0gPSB0cnVlOwotCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5idGVtcF9wc3kpOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKioKLSAqIGFiODUwMF9idGVtcF90ZW1wbG93X2hhbmRsZXIoKSAtIGJhdHRlcnkgdGVtcCBsb3dlciB0aGFuIDEwIGRlZ3JlZXMKLSAqIEBpcnE6ICAgICAgIGludGVycnVwdCBudW1iZXIKLSAqIEBfZGk6ICAgICAgIHZvaWQgcG9pbnRlciB0aGF0IGhhcyB0byBhZGRyZXNzIG9mIGFiODUwMF9idGVtcAotICoKLSAqIFJldHVybnMgSVJRIHN0YXR1cyhJUlFfSEFORExFRCkKLSAqLwotc3RhdGljIGlycXJldHVybl90IGFiODUwMF9idGVtcF90ZW1wbG93X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqX2RpKQotewotCXN0cnVjdCBhYjg1MDBfYnRlbXAgKmRpID0gX2RpOwotCi0JaWYgKGlzX2FiODUwMF8zcDNfb3JfZWFybGllcihkaS0+cGFyZW50KSkgewotCQlkZXZfZGJnKGRpLT5kZXYsICJJZ25vcmUgZmFsc2UgYnRlbXAgbG93IGlycSIKLQkJCSIgZm9yIEFCQiBjdXQgMS4wLCAxLjEsIDIuMCBhbmQgMy4zXG4iKTsKLQl9IGVsc2UgewotCQlkZXZfY3JpdChkaS0+ZGV2LCAiQmF0dGVyeSB0ZW1wZXJhdHVyZSBsb3dlciB0aGFuIC0xMGRlZyBjXG4iKTsKLQotCQlkaS0+ZXZlbnRzLmJ0ZW1wX2xvdyA9IHRydWU7Ci0JCWRpLT5ldmVudHMuYnRlbXBfaGlnaCA9IGZhbHNlOwotCQlkaS0+ZXZlbnRzLmJ0ZW1wX21lZGhpZ2ggPSBmYWxzZTsKLQkJZGktPmV2ZW50cy5idGVtcF9sb3dtZWQgPSBmYWxzZTsKLQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGktPmJ0ZW1wX3BzeSk7Ci0JfQotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKioKLSAqIGFiODUwMF9idGVtcF90ZW1waGlnaF9oYW5kbGVyKCkgLSBiYXR0ZXJ5IHRlbXAgaGlnaGVyIHRoYW4gbWF4IHRlbXAKLSAqIEBpcnE6ICAgICAgIGludGVycnVwdCBudW1iZXIKLSAqIEBfZGk6ICAgICAgIHZvaWQgcG9pbnRlciB0aGF0IGhhcyB0byBhZGRyZXNzIG9mIGFiODUwMF9idGVtcAotICoKLSAqIFJldHVybnMgSVJRIHN0YXR1cyhJUlFfSEFORExFRCkKLSAqLwotc3RhdGljIGlycXJldHVybl90IGFiODUwMF9idGVtcF90ZW1waGlnaF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKl9kaSkKLXsKLQlzdHJ1Y3QgYWI4NTAwX2J0ZW1wICpkaSA9IF9kaTsKLQotCWRldl9jcml0KGRpLT5kZXYsICJCYXR0ZXJ5IHRlbXBlcmF0dXJlIGlzIGhpZ2hlciB0aGFuIE1BWCB0ZW1wXG4iKTsKLQotCWRpLT5ldmVudHMuYnRlbXBfaGlnaCA9IHRydWU7Ci0JZGktPmV2ZW50cy5idGVtcF9tZWRoaWdoID0gZmFsc2U7Ci0JZGktPmV2ZW50cy5idGVtcF9sb3dtZWQgPSBmYWxzZTsKLQlkaS0+ZXZlbnRzLmJ0ZW1wX2xvdyA9IGZhbHNlOwotCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5idGVtcF9wc3kpOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKioKLSAqIGFiODUwMF9idGVtcF9sb3dtZWRfaGFuZGxlcigpIC0gYmF0dGVyeSB0ZW1wIGJldHdlZW4gbG93IGFuZCBtZWRpdW0KLSAqIEBpcnE6ICAgICAgIGludGVycnVwdCBudW1iZXIKLSAqIEBfZGk6ICAgICAgIHZvaWQgcG9pbnRlciB0aGF0IGhhcyB0byBhZGRyZXNzIG9mIGFiODUwMF9idGVtcAotICoKLSAqIFJldHVybnMgSVJRIHN0YXR1cyhJUlFfSEFORExFRCkKLSAqLwotc3RhdGljIGlycXJldHVybl90IGFiODUwMF9idGVtcF9sb3dtZWRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpfZGkpCi17Ci0Jc3RydWN0IGFiODUwMF9idGVtcCAqZGkgPSBfZGk7Ci0KLQlkZXZfZGJnKGRpLT5kZXYsICJCYXR0ZXJ5IHRlbXBlcmF0dXJlIGlzIGJldHdlZW4gbG93IGFuZCBtZWRpdW1cbiIpOwotCi0JZGktPmV2ZW50cy5idGVtcF9sb3dtZWQgPSB0cnVlOwotCWRpLT5ldmVudHMuYnRlbXBfbWVkaGlnaCA9IGZhbHNlOwotCWRpLT5ldmVudHMuYnRlbXBfaGlnaCA9IGZhbHNlOwotCWRpLT5ldmVudHMuYnRlbXBfbG93ID0gZmFsc2U7Ci0JcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGktPmJ0ZW1wX3BzeSk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qKgotICogYWI4NTAwX2J0ZW1wX21lZGhpZ2hfaGFuZGxlcigpIC0gYmF0dGVyeSB0ZW1wIGJldHdlZW4gbWVkaXVtIGFuZCBoaWdoCi0gKiBAaXJxOiAgICAgICBpbnRlcnJ1cHQgbnVtYmVyCi0gKiBAX2RpOiAgICAgICB2b2lkIHBvaW50ZXIgdGhhdCBoYXMgdG8gYWRkcmVzcyBvZiBhYjg1MDBfYnRlbXAKLSAqCi0gKiBSZXR1cm5zIElSUSBzdGF0dXMoSVJRX0hBTkRMRUQpCi0gKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBhYjg1MDBfYnRlbXBfbWVkaGlnaF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKl9kaSkKLXsKLQlzdHJ1Y3QgYWI4NTAwX2J0ZW1wICpkaSA9IF9kaTsKLQotCWRldl9kYmcoZGktPmRldiwgIkJhdHRlcnkgdGVtcGVyYXR1cmUgaXMgYmV0d2VlbiBtZWRpdW0gYW5kIGhpZ2hcbiIpOwotCi0JZGktPmV2ZW50cy5idGVtcF9tZWRoaWdoID0gdHJ1ZTsKLQlkaS0+ZXZlbnRzLmJ0ZW1wX2xvd21lZCA9IGZhbHNlOwotCWRpLT5ldmVudHMuYnRlbXBfaGlnaCA9IGZhbHNlOwotCWRpLT5ldmVudHMuYnRlbXBfbG93ID0gZmFsc2U7Ci0JcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGktPmJ0ZW1wX3BzeSk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qKgotICogYWI4NTAwX2J0ZW1wX3BlcmlvZGljKCkgLSBQZXJpb2RpYyB0ZW1wZXJhdHVyZSBtZWFzdXJlbWVudHMKLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9idGVtcCBzdHJ1Y3R1cmUKLSAqIEBlbmFibGU6CWVuYWJsZSBvciBkaXNhYmxlIHBlcmlvZGljIHRlbXBlcmF0dXJlIG1lYXN1cmVtZW50cwotICoKLSAqIFN0YXJ0cyBvZiBzdG9wcyBwZXJpb2RpYyB0ZW1wZXJhdHVyZSBtZWFzdXJlbWVudHMuIFBlcmlvZGljIG1lYXN1cmVtZW50cwotICogc2hvdWxkIG9ubHkgYmUgZG9uZSB3aGVuIGEgY2hhcmdlciBpcyBjb25uZWN0ZWQuCi0gKi8KLXN0YXRpYyB2b2lkIGFiODUwMF9idGVtcF9wZXJpb2RpYyhzdHJ1Y3QgYWI4NTAwX2J0ZW1wICpkaSwKLQlib29sIGVuYWJsZSkKLXsKLQlkZXZfZGJnKGRpLT5kZXYsICJFbmFibGUgcGVyaW9kaWMgdGVtcGVyYXR1cmUgbWVhc3VyZW1lbnRzOiAlZFxuIiwKLQkJZW5hYmxlKTsKLQkvKgotCSAqIE1ha2Ugc3VyZSBhIG5ldyBtZWFzdXJlbWVudCBpcyBkb25lIGRpcmVjdGx5IGJ5IGNhbmNlbGxpbmcKLQkgKiBhbnkgcGVuZGluZyB3b3JrCi0JICovCi0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZkaS0+YnRlbXBfcGVyaW9kaWNfd29yayk7Ci0KLQlpZiAoZW5hYmxlKQotCQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmJ0ZW1wX3dxLCAmZGktPmJ0ZW1wX3BlcmlvZGljX3dvcmssIDApOwotfQotCi0vKioKLSAqIGFiODUwMF9idGVtcF9nZXRfdGVtcCgpIC0gZ2V0IGJhdHRlcnkgdGVtcGVyYXR1cmUKLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9idGVtcCBzdHJ1Y3R1cmUKLSAqCi0gKiBSZXR1cm5zIGJhdHRlcnkgdGVtcGVyYXR1cmUKLSAqLwotaW50IGFiODUwMF9idGVtcF9nZXRfdGVtcChzdHJ1Y3QgYWI4NTAwX2J0ZW1wICpkaSkKLXsKLQlpbnQgdGVtcCA9IDA7Ci0KLQkvKgotCSAqIFRoZSBCVEVNUCBldmVudHMgYXJlIG5vdCByZWxpYWJlIG9uIEFCODUwMCBjdXQzLjMKLQkgKiBhbmQgcHJpb3IgdmVyc2lvbnMKLQkgKi8KLQlpZiAoaXNfYWI4NTAwXzNwM19vcl9lYXJsaWVyKGRpLT5wYXJlbnQpKSB7Ci0JCXRlbXAgPSBkaS0+YmF0X3RlbXAgKiAxMDsKLQl9IGVsc2UgewotCQlpZiAoZGktPmV2ZW50cy5idGVtcF9sb3cpIHsKLQkJCWlmICh0ZW1wID4gZGktPmJ0ZW1wX3Jhbmdlcy5idGVtcF9sb3dfbGltaXQpCi0JCQkJdGVtcCA9IGRpLT5idGVtcF9yYW5nZXMuYnRlbXBfbG93X2xpbWl0ICogMTA7Ci0JCQllbHNlCi0JCQkJdGVtcCA9IGRpLT5iYXRfdGVtcCAqIDEwOwotCQl9IGVsc2UgaWYgKGRpLT5ldmVudHMuYnRlbXBfaGlnaCkgewotCQkJaWYgKHRlbXAgPCBkaS0+YnRlbXBfcmFuZ2VzLmJ0ZW1wX2hpZ2hfbGltaXQpCi0JCQkJdGVtcCA9IGRpLT5idGVtcF9yYW5nZXMuYnRlbXBfaGlnaF9saW1pdCAqIDEwOwotCQkJZWxzZQotCQkJCXRlbXAgPSBkaS0+YmF0X3RlbXAgKiAxMDsKLQkJfSBlbHNlIGlmIChkaS0+ZXZlbnRzLmJ0ZW1wX2xvd21lZCkgewotCQkJaWYgKHRlbXAgPiBkaS0+YnRlbXBfcmFuZ2VzLmJ0ZW1wX21lZF9saW1pdCkKLQkJCQl0ZW1wID0gZGktPmJ0ZW1wX3Jhbmdlcy5idGVtcF9tZWRfbGltaXQgKiAxMDsKLQkJCWVsc2UKLQkJCQl0ZW1wID0gZGktPmJhdF90ZW1wICogMTA7Ci0JCX0gZWxzZSBpZiAoZGktPmV2ZW50cy5idGVtcF9tZWRoaWdoKSB7Ci0JCQlpZiAodGVtcCA8IGRpLT5idGVtcF9yYW5nZXMuYnRlbXBfbWVkX2xpbWl0KQotCQkJCXRlbXAgPSBkaS0+YnRlbXBfcmFuZ2VzLmJ0ZW1wX21lZF9saW1pdCAqIDEwOwotCQkJZWxzZQotCQkJCXRlbXAgPSBkaS0+YmF0X3RlbXAgKiAxMDsKLQkJfSBlbHNlCi0JCQl0ZW1wID0gZGktPmJhdF90ZW1wICogMTA7Ci0JfQotCXJldHVybiB0ZW1wOwotfQotRVhQT1JUX1NZTUJPTChhYjg1MDBfYnRlbXBfZ2V0X3RlbXApOwotCi0vKioKLSAqIGFiODUwMF9idGVtcF9nZXRfYmF0Y3RybF90ZW1wKCkgLSBnZXQgdGhlIHRlbXBlcmF0dXJlCi0gKiBAYnRlbXA6ICAgICAgcG9pbnRlciB0byB0aGUgYnRlbXAgc3RydWN0dXJlCi0gKgotICogUmV0dXJucyB0aGUgYmF0Y3RybCB0ZW1wZXJhdHVyZSBpbiBtaWxsaWRlZ3JlZXMKLSAqLwotaW50IGFiODUwMF9idGVtcF9nZXRfYmF0Y3RybF90ZW1wKHN0cnVjdCBhYjg1MDBfYnRlbXAgKmJ0ZW1wKQotewotCXJldHVybiBidGVtcC0+YmF0X3RlbXAgKiAxMDAwOwotfQotRVhQT1JUX1NZTUJPTChhYjg1MDBfYnRlbXBfZ2V0X2JhdGN0cmxfdGVtcCk7Ci0KLS8qKgotICogYWI4NTAwX2J0ZW1wX2dldF9wcm9wZXJ0eSgpIC0gZ2V0IHRoZSBidGVtcCBwcm9wZXJ0aWVzCi0gKiBAcHN5OiAgICAgICAgcG9pbnRlciB0byB0aGUgcG93ZXJfc3VwcGx5IHN0cnVjdHVyZQotICogQHBzcDogICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBzdHJ1Y3R1cmUKLSAqIEB2YWw6ICAgICAgICBwb2ludGVyIHRvIHRoZSBwb3dlcl9zdXBwbHlfcHJvcHZhbCB1bmlvbgotICoKLSAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgd2hlbiBhbiBhcHBsaWNhdGlvbiB0cmllcyB0byBnZXQgdGhlIGJ0ZW1wCi0gKiBwcm9wZXJ0aWVzIGJ5IHJlYWRpbmcgdGhlIHN5c2ZzIGZpbGVzLgotICogb25saW5lOglwcmVzZW5jZSBvZiB0aGUgYmF0dGVyeQotICogcHJlc2VudDoJcHJlc2VuY2Ugb2YgdGhlIGJhdHRlcnkKLSAqIHRlY2hub2xvZ3k6CWJhdHRlcnkgdGVjaG5vbG9neQotICogdGVtcDoJYmF0dGVyeSB0ZW1wZXJhdHVyZQotICogUmV0dXJucyBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZSBlbHNlIDAob24gc3VjY2VzcykKLSAqLwotc3RhdGljIGludCBhYjg1MDBfYnRlbXBfZ2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKLQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCi0JdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKLXsKLQlzdHJ1Y3QgYWI4NTAwX2J0ZW1wICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwotCi0Jc3dpdGNoIChwc3ApIHsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ6Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkU6Ci0JCWlmIChkaS0+ZXZlbnRzLmJhdHRfcmVtKQotCQkJdmFsLT5pbnR2YWwgPSAwOwotCQllbHNlCi0JCQl2YWwtPmludHZhbCA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWToKLQkJdmFsLT5pbnR2YWwgPSBkaS0+Ym0tPmJhdF90eXBlW2RpLT5ibS0+YmF0dF9pZF0ubmFtZTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QOgotCQl2YWwtPmludHZhbCA9IGFiODUwMF9idGVtcF9nZXRfdGVtcChkaSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhYjg1MDBfYnRlbXBfZ2V0X2V4dF9wc3lfZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5OwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmV4dCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWNvbnN0IGNoYXIgKipzdXBwbGljYW50cyA9IChjb25zdCBjaGFyICoqKWV4dC0+c3VwcGxpZWRfdG87Ci0Jc3RydWN0IGFiODUwMF9idGVtcCAqZGk7Ci0JdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgcmV0OwotCWludCBqOwotCi0JcHN5ID0gKHN0cnVjdCBwb3dlcl9zdXBwbHkgKilkYXRhOwotCWRpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7Ci0KLQkvKgotCSAqIEZvciBhbGwgcHN5IHdoZXJlIHRoZSBuYW1lIG9mIHlvdXIgZHJpdmVyCi0JICogYXBwZWFycyBpbiBhbnkgc3VwcGxpZWRfdG8KLQkgKi8KLQlqID0gbWF0Y2hfc3RyaW5nKHN1cHBsaWNhbnRzLCBleHQtPm51bV9zdXBwbGljYW50cywgcHN5LT5kZXNjLT5uYW1lKTsKLQlpZiAoaiA8IDApCi0JCXJldHVybiAwOwotCi0JLyogR28gdGhyb3VnaCBhbGwgcHJvcGVydGllcyBmb3IgdGhlIHBzeSAqLwotCWZvciAoaiA9IDA7IGogPCBleHQtPmRlc2MtPm51bV9wcm9wZXJ0aWVzOyBqKyspIHsKLQkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHJvcDsKLQkJcHJvcCA9IGV4dC0+ZGVzYy0+cHJvcGVydGllc1tqXTsKLQotCQlpZiAocG93ZXJfc3VwcGx5X2dldF9wcm9wZXJ0eShleHQsIHByb3AsICZyZXQpKQotCQkJY29udGludWU7Ci0KLQkJc3dpdGNoIChwcm9wKSB7Ci0JCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDoKLQkJCXN3aXRjaCAoZXh0LT5kZXNjLT50eXBlKSB7Ci0JCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TOgotCQkJCS8qIEFDIGRpc2Nvbm5lY3RlZCAqLwotCQkJCWlmICghcmV0LmludHZhbCAmJiBkaS0+ZXZlbnRzLmFjX2Nvbm4pIHsKLQkJCQkJZGktPmV2ZW50cy5hY19jb25uID0gZmFsc2U7Ci0JCQkJfQotCQkJCS8qIEFDIGNvbm5lY3RlZCAqLwotCQkJCWVsc2UgaWYgKHJldC5pbnR2YWwgJiYgIWRpLT5ldmVudHMuYWNfY29ubikgewotCQkJCQlkaS0+ZXZlbnRzLmFjX2Nvbm4gPSB0cnVlOwotCQkJCQlpZiAoIWRpLT5ldmVudHMudXNiX2Nvbm4pCi0JCQkJCQlhYjg1MDBfYnRlbXBfcGVyaW9kaWMoZGksIHRydWUpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgUE9XRVJfU1VQUExZX1RZUEVfVVNCOgotCQkJCS8qIFVTQiBkaXNjb25uZWN0ZWQgKi8KLQkJCQlpZiAoIXJldC5pbnR2YWwgJiYgZGktPmV2ZW50cy51c2JfY29ubikgewotCQkJCQlkaS0+ZXZlbnRzLnVzYl9jb25uID0gZmFsc2U7Ci0JCQkJfQotCQkJCS8qIFVTQiBjb25uZWN0ZWQgKi8KLQkJCQllbHNlIGlmIChyZXQuaW50dmFsICYmICFkaS0+ZXZlbnRzLnVzYl9jb25uKSB7Ci0JCQkJCWRpLT5ldmVudHMudXNiX2Nvbm4gPSB0cnVlOwotCQkJCQlpZiAoIWRpLT5ldmVudHMuYWNfY29ubikKLQkJCQkJCWFiODUwMF9idGVtcF9wZXJpb2RpYyhkaSwgdHJ1ZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogYWI4NTAwX2J0ZW1wX2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQoKSAtIGNhbGxiYWNrIGZvciBwb3dlciBzdXBwbHkgY2hhbmdlcwotICogQHBzeTogICAgICAgcG9pbnRlciB0byB0aGUgc3RydWN0dXJlIHBvd2VyX3N1cHBseQotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgcG9pbnRpbmcgdG8gdGhlIGZ1bmN0aW9uIHBvaW50ZXIgZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZAotICogb2YgdGhlIHN0cnVjdHVyZSBwb3dlcl9zdXBwbHkuCi0gKiBUaGlzIGZ1bmN0aW9uIGdldHMgZXhlY3V0ZWQgd2hlbiB0aGVyZSBpcyBhIGNoYW5nZSBpbiB0aGUgZXh0ZXJuYWwgcG93ZXIKLSAqIHN1cHBseSB0byB0aGUgYnRlbXAuCi0gKi8KLXN0YXRpYyB2b2lkIGFiODUwMF9idGVtcF9leHRlcm5hbF9wb3dlcl9jaGFuZ2VkKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSkKLXsKLQlzdHJ1Y3QgYWI4NTAwX2J0ZW1wICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwotCi0JY2xhc3NfZm9yX2VhY2hfZGV2aWNlKHBvd2VyX3N1cHBseV9jbGFzcywgTlVMTCwKLQkJZGktPmJ0ZW1wX3BzeSwgYWI4NTAwX2J0ZW1wX2dldF9leHRfcHN5X2RhdGEpOwotfQotCi0vKiBhYjg1MDAgYnRlbXAgZHJpdmVyIGludGVycnVwdHMgYW5kIHRoZWlyIHJlc3BlY3RpdmUgaXNyICovCi1zdGF0aWMgc3RydWN0IGFiODUwMF9idGVtcF9pbnRlcnJ1cHRzIGFiODUwMF9idGVtcF9pcnFbXSA9IHsKLQl7IkJBVF9DVFJMX0lOREIiLCBhYjg1MDBfYnRlbXBfYmF0Y3RybGluZGJfaGFuZGxlcn0sCi0JeyJCVEVNUF9MT1ciLCBhYjg1MDBfYnRlbXBfdGVtcGxvd19oYW5kbGVyfSwKLQl7IkJURU1QX0hJR0giLCBhYjg1MDBfYnRlbXBfdGVtcGhpZ2hfaGFuZGxlcn0sCi0JeyJCVEVNUF9MT1dfTUVESVVNIiwgYWI4NTAwX2J0ZW1wX2xvd21lZF9oYW5kbGVyfSwKLQl7IkJURU1QX01FRElVTV9ISUdIIiwgYWI4NTAwX2J0ZW1wX21lZGhpZ2hfaGFuZGxlcn0sCi19OwotCi0jaWYgZGVmaW5lZChDT05GSUdfUE0pCi1zdGF0aWMgaW50IGFiODUwMF9idGVtcF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgYWI4NTAwX2J0ZW1wICpkaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JYWI4NTAwX2J0ZW1wX3BlcmlvZGljKGRpLCB0cnVlKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFiODUwMF9idGVtcF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCi0JcG1fbWVzc2FnZV90IHN0YXRlKQotewotCXN0cnVjdCBhYjg1MDBfYnRlbXAgKmRpID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0KLQlhYjg1MDBfYnRlbXBfcGVyaW9kaWMoZGksIGZhbHNlKTsKLQotCXJldHVybiAwOwotfQotI2Vsc2UKLSNkZWZpbmUgYWI4NTAwX2J0ZW1wX3N1c3BlbmQgICAgICBOVUxMCi0jZGVmaW5lIGFiODUwMF9idGVtcF9yZXN1bWUgICAgICAgTlVMTAotI2VuZGlmCi0KLXN0YXRpYyBpbnQgYWI4NTAwX2J0ZW1wX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBhYjg1MDBfYnRlbXAgKmRpID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0JaW50IGksIGlycTsKLQotCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFiODUwMF9idGVtcF9pcnEpOyBpKyspIHsKLQkJaXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgYWI4NTAwX2J0ZW1wX2lycVtpXS5uYW1lKTsKLQkJZnJlZV9pcnEoaXJxLCBkaSk7Ci0JfQotCi0JLyogRGVsZXRlIHRoZSB3b3JrIHF1ZXVlICovCi0JZGVzdHJveV93b3JrcXVldWUoZGktPmJ0ZW1wX3dxKTsKLQotCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoZGktPmJ0ZW1wX3BzeSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNoYXIgKnN1cHBseV9pbnRlcmZhY2VbXSA9IHsKLQkiYWI4NTAwX2NoYXJnYWxnIiwKLQkiYWI4NTAwX2ZnIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgYWI4NTAwX2J0ZW1wX2Rlc2MgPSB7Ci0JLm5hbWUJCQk9ICJhYjg1MDBfYnRlbXAiLAotCS50eXBlCQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZLAotCS5wcm9wZXJ0aWVzCQk9IGFiODUwMF9idGVtcF9wcm9wcywKLQkubnVtX3Byb3BlcnRpZXMJCT0gQVJSQVlfU0laRShhYjg1MDBfYnRlbXBfcHJvcHMpLAotCS5nZXRfcHJvcGVydHkJCT0gYWI4NTAwX2J0ZW1wX2dldF9wcm9wZXJ0eSwKLQkuZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZAk9IGFiODUwMF9idGVtcF9leHRlcm5hbF9wb3dlcl9jaGFuZ2VkLAotfTsKLQotc3RhdGljIGludCBhYjg1MDBfYnRlbXBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7Ci0Jc3RydWN0IGFieDUwMF9ibV9kYXRhICpwbGF0ID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgcHN5X2NmZyA9IHt9OwotCXN0cnVjdCBhYjg1MDBfYnRlbXAgKmRpOwotCWludCBpcnEsIGksIHJldCA9IDA7Ci0JdTggdmFsOwotCi0JZGkgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpkaSksIEdGUF9LRVJORUwpOwotCWlmICghZGkpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXMgbm8gbWVtIGZvciBhYjg1MDBfYnRlbXBcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JaWYgKCFwbGF0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIGJhdHRlcnkgbWFuYWdlbWVudCBkYXRhIHN1cHBsaWVkXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWRpLT5ibSA9IHBsYXQ7Ci0KLQlpZiAobnApIHsKLQkJcmV0ID0gYWI4NTAwX2JtX29mX3Byb2JlKCZwZGV2LT5kZXYsIG5wLCBkaS0+Ym0pOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGJhdHRlcnkgaW5mb3JtYXRpb25cbiIpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCS8qIGdldCBwYXJlbnQgZGF0YSAqLwotCWRpLT5kZXYgPSAmcGRldi0+ZGV2OwotCWRpLT5wYXJlbnQgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7Ci0JZGktPmdwYWRjID0gYWI4NTAwX2dwYWRjX2dldCgiYWI4NTAwLWdwYWRjLjAiKTsKLQotCWRpLT5pbml0aWFsaXplZCA9IGZhbHNlOwotCi0JcHN5X2NmZy5zdXBwbGllZF90byA9IHN1cHBseV9pbnRlcmZhY2U7Ci0JcHN5X2NmZy5udW1fc3VwcGxpY2FudHMgPSBBUlJBWV9TSVpFKHN1cHBseV9pbnRlcmZhY2UpOwotCXBzeV9jZmcuZHJ2X2RhdGEgPSBkaTsKLQotCS8qIENyZWF0ZSBhIHdvcmsgcXVldWUgZm9yIHRoZSBidGVtcCAqLwotCWRpLT5idGVtcF93cSA9Ci0JCWNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJhYjg1MDBfYnRlbXBfd3EiKTsKLQlpZiAoZGktPmJ0ZW1wX3dxID09IE5VTEwpIHsKLQkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSB3b3JrIHF1ZXVlXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyogSW5pdCB3b3JrIGZvciBtZWFzdXJpbmcgdGVtcGVyYXR1cmUgcGVyaW9kaWNhbGx5ICovCi0JSU5JVF9ERUZFUlJBQkxFX1dPUksoJmRpLT5idGVtcF9wZXJpb2RpY193b3JrLAotCQlhYjg1MDBfYnRlbXBfcGVyaW9kaWNfd29yayk7Ci0KLQkvKiBTZXQgQlRFTVAgdGhlcm1hbCBsaW1pdHMuIExvdyBhbmQgTWVkIGFyZSBmaXhlZCAqLwotCWRpLT5idGVtcF9yYW5nZXMuYnRlbXBfbG93X2xpbWl0ID0gQlRFTVBfVEhFUk1BTF9MT1dfTElNSVQ7Ci0JZGktPmJ0ZW1wX3Jhbmdlcy5idGVtcF9tZWRfbGltaXQgPSBCVEVNUF9USEVSTUFMX01FRF9MSU1JVDsKLQotCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfQ0hBUkdFUiwKLQkJQUI4NTAwX0JURU1QX0hJR0hfVEgsICZ2YWwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoZGktPmRldiwgIiVzIGFiODUwMCByZWFkIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGZyZWVfYnRlbXBfd3E7Ci0JfQotCXN3aXRjaCAodmFsKSB7Ci0JY2FzZSBCVEVNUF9ISUdIX1RIXzU3XzA6Ci0JY2FzZSBCVEVNUF9ISUdIX1RIXzU3XzE6Ci0JCWRpLT5idGVtcF9yYW5nZXMuYnRlbXBfaGlnaF9saW1pdCA9Ci0JCQlCVEVNUF9USEVSTUFMX0hJR0hfTElNSVRfNTc7Ci0JCWJyZWFrOwotCWNhc2UgQlRFTVBfSElHSF9USF81MjoKLQkJZGktPmJ0ZW1wX3Jhbmdlcy5idGVtcF9oaWdoX2xpbWl0ID0KLQkJCUJURU1QX1RIRVJNQUxfSElHSF9MSU1JVF81MjsKLQkJYnJlYWs7Ci0JY2FzZSBCVEVNUF9ISUdIX1RIXzYyOgotCQlkaS0+YnRlbXBfcmFuZ2VzLmJ0ZW1wX2hpZ2hfbGltaXQgPQotCQkJQlRFTVBfVEhFUk1BTF9ISUdIX0xJTUlUXzYyOwotCQlicmVhazsKLQl9Ci0KLQkvKiBSZWdpc3RlciBCVEVNUCBwb3dlciBzdXBwbHkgY2xhc3MgKi8KLQlkaS0+YnRlbXBfcHN5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKGRpLT5kZXYsICZhYjg1MDBfYnRlbXBfZGVzYywKLQkJCQkJICAgICAgJnBzeV9jZmcpOwotCWlmIChJU19FUlIoZGktPmJ0ZW1wX3BzeSkpIHsKLQkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIEJURU1QIHBzeVxuIik7Ci0JCXJldCA9IFBUUl9FUlIoZGktPmJ0ZW1wX3BzeSk7Ci0JCWdvdG8gZnJlZV9idGVtcF93cTsKLQl9Ci0KLQkvKiBSZWdpc3RlciBpbnRlcnJ1cHRzICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWI4NTAwX2J0ZW1wX2lycSk7IGkrKykgewotCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCBhYjg1MDBfYnRlbXBfaXJxW2ldLm5hbWUpOwotCQlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShpcnEsIE5VTEwsIGFiODUwMF9idGVtcF9pcnFbaV0uaXNyLAotCQkJSVJRRl9TSEFSRUQgfCBJUlFGX05PX1NVU1BFTkQsCi0JCQlhYjg1MDBfYnRlbXBfaXJxW2ldLm5hbWUsIGRpKTsKLQotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCAlcyBJUlEgJWQ6ICVkXG4iCi0JCQkJLCBhYjg1MDBfYnRlbXBfaXJxW2ldLm5hbWUsIGlycSwgcmV0KTsKLQkJCWdvdG8gZnJlZV9pcnE7Ci0JCX0KLQkJZGV2X2RiZyhkaS0+ZGV2LCAiUmVxdWVzdGVkICVzIElSUSAlZDogJWRcbiIsCi0JCQlhYjg1MDBfYnRlbXBfaXJxW2ldLm5hbWUsIGlycSwgcmV0KTsKLQl9Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkaSk7Ci0KLQkvKiBLaWNrIG9mZiBwZXJpb2RpYyB0ZW1wZXJhdHVyZSBtZWFzdXJlbWVudHMgKi8KLQlhYjg1MDBfYnRlbXBfcGVyaW9kaWMoZGksIHRydWUpOwotCWxpc3RfYWRkX3RhaWwoJmRpLT5ub2RlLCAmYWI4NTAwX2J0ZW1wX2xpc3QpOwotCi0JcmV0dXJuIHJldDsKLQotZnJlZV9pcnE6Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoZGktPmJ0ZW1wX3BzeSk7Ci0KLQkvKiBXZSBhbHNvIGhhdmUgdG8gZnJlZSBhbGwgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQgaXJxcyAqLwotCWZvciAoaSA9IGkgLSAxOyBpID49IDA7IGktLSkgewotCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCBhYjg1MDBfYnRlbXBfaXJxW2ldLm5hbWUpOwotCQlmcmVlX2lycShpcnEsIGRpKTsKLQl9Ci1mcmVlX2J0ZW1wX3dxOgotCWRlc3Ryb3lfd29ya3F1ZXVlKGRpLT5idGVtcF93cSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYWI4NTAwX2J0ZW1wX21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJzdGVyaWNzc29uLGFiODUwMC1idGVtcCIsIH0sCi0JeyB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYWI4NTAwX2J0ZW1wX2RyaXZlciA9IHsKLQkucHJvYmUgPSBhYjg1MDBfYnRlbXBfcHJvYmUsCi0JLnJlbW92ZSA9IGFiODUwMF9idGVtcF9yZW1vdmUsCi0JLnN1c3BlbmQgPSBhYjg1MDBfYnRlbXBfc3VzcGVuZCwKLQkucmVzdW1lID0gYWI4NTAwX2J0ZW1wX3Jlc3VtZSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJhYjg1MDAtYnRlbXAiLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBhYjg1MDBfYnRlbXBfbWF0Y2gsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFiODUwMF9idGVtcF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYWI4NTAwX2J0ZW1wX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhYjg1MDBfYnRlbXBfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhYjg1MDBfYnRlbXBfZHJpdmVyKTsKLX0KLQotZGV2aWNlX2luaXRjYWxsKGFiODUwMF9idGVtcF9pbml0KTsKLW1vZHVsZV9leGl0KGFiODUwMF9idGVtcF9leGl0KTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotTU9EVUxFX0FVVEhPUigiSm9oYW4gUGFsc3NvbiwgS2FybCBLb21pZXJvd3NraSwgQXJ1biBSIE11cnRoeSIpOwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTphYjg1MDAtYnRlbXAiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQUI4NTAwIGJhdHRlcnkgdGVtcGVyYXR1cmUgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2FiODUwMF9jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL2FiODUwMF9jaGFyZ2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZGU1ZDQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9wb3dlci9hYjg1MDBfY2hhcmdlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzc2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBTVC1Fcmljc3NvbiBTQSAyMDEyCi0gKgotICogQ2hhcmdlciBkcml2ZXIgZm9yIEFCODUwMAotICoKLSAqIExpY2Vuc2UgVGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyCi0gKiBBdXRob3I6Ci0gKglKb2hhbiBQYWxzc29uIDxqb2hhbi5wYWxzc29uQHN0ZXJpY3Nzb24uY29tPgotICoJS2FybCBLb21pZXJvd3NraSA8a2FybC5rb21pZXJvd3NraUBzdGVyaWNzc29uLmNvbT4KLSAqCUFydW4gUiBNdXJ0aHkgPGFydW4ubXVydGh5QHN0ZXJpY3Nzb24uY29tPgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jaW5jbHVkZSA8bGludXgva29iamVjdC5oPgotI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvYWJ4NTAwL2FiODUwMC5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9hYng1MDAuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvYWJ4NTAwL2FiODUwMC1ibS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9hYng1MDAvYWI4NTAwLWdwYWRjLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL2FieDUwMC91eDUwMF9jaGFyZ2FsZy5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi9vdGcuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotCi0vKiBDaGFyZ2VyIGNvbnN0YW50cyAqLwotI2RlZmluZSBOT19QV19DT05OCQkJMAotI2RlZmluZSBBQ19QV19DT05OCQkJMQotI2RlZmluZSBVU0JfUFdfQ09OTgkJCTIKLQotI2RlZmluZSBNQUlOX1dET0dfRU5BCQkJMHgwMQotI2RlZmluZSBNQUlOX1dET0dfS0lDSwkJCTB4MDIKLSNkZWZpbmUgTUFJTl9XRE9HX0RJUwkJCTB4MDAKLSNkZWZpbmUgQ0hBUkdfV0RfS0lDSwkJCTB4MDEKLSNkZWZpbmUgTUFJTl9DSF9FTkEJCQkweDAxCi0jZGVmaW5lIE1BSU5fQ0hfTk9fT1ZFUlNIT09UX0VOQV9OCTB4MDIKLSNkZWZpbmUgVVNCX0NIX0VOQQkJCTB4MDEKLSNkZWZpbmUgVVNCX0NIR19OT19PVkVSU0hPT1RfRU5BX04JMHgwMgotI2RlZmluZSBNQUlOX0NIX0RFVAkJCTB4MDEKLSNkZWZpbmUgTUFJTl9DSF9DVl9PTgkJCTB4MDQKLSNkZWZpbmUgVVNCX0NIX0NWX09OCQkJMHgwOAotI2RlZmluZSBWQlVTX0RFVF9EQk5DMTAwCQkweDAyCi0jZGVmaW5lIFZCVVNfREVUX0RCTkMxCQkJMHgwMQotI2RlZmluZSBPVFBfRU5BQkxFX1dECQkJMHgwMQotI2RlZmluZSBEUk9QX0NPVU5UX1JFU0VUCQkweDAxCi0jZGVmaW5lIFVTQl9DSF9ERVQJCQkweDAxCi0KLSNkZWZpbmUgTUFJTl9DSF9JTlBVVF9DVVJSX1NISUZUCTQKLSNkZWZpbmUgVkJVU19JTl9DVVJSX0xJTV9TSElGVAkJNAotI2RlZmluZSBBQjg1NDBfVkJVU19JTl9DVVJSX0xJTV9TSElGVAkyCi0jZGVmaW5lIEFVVE9fVkJVU19JTl9DVVJSX0xJTV9TSElGVAk0Ci0jZGVmaW5lIEFCODU0MF9BVVRPX1ZCVVNfSU5fQ1VSUl9NQVNLCTB4M0YKLSNkZWZpbmUgVkJVU19JTl9DVVJSX0xJTV9SRVRSWV9TRVRfVElNRQkzMCAvKiBzZWNvbmRzICovCi0KLSNkZWZpbmUgTEVEX0lORElDQVRPUl9QV01fRU5BCQkweDAxCi0jZGVmaW5lIExFRF9JTkRJQ0FUT1JfUFdNX0RJUwkJMHgwMAotI2RlZmluZSBMRURfSU5EX0NVUl81TUEJCQkweDA0Ci0jZGVmaW5lIExFRF9JTkRJQ0FUT1JfUFdNX0RVVFlfMjUyXzI1NgkweEJGCi0KLS8qIEhXIGZhaWx1cmUgY29uc3RhbnRzICovCi0jZGVmaW5lIE1BSU5fQ0hfVEhfUFJPVAkJCTB4MDIKLSNkZWZpbmUgVkJVU19DSF9OT0sJCQkweDA4Ci0jZGVmaW5lIFVTQl9DSF9USF9QUk9UCQkJMHgwMgotI2RlZmluZSBWQlVTX09WVl9USAkJCTB4MDEKLSNkZWZpbmUgTUFJTl9DSF9OT0sJCQkweDAxCi0jZGVmaW5lIFZCVVNfREVUCQkJMHg4MAotCi0jZGVmaW5lIE1BSU5fQ0hfU1RBVFVTMl9NQUlOQ0hHRFJPUAkJMHg4MAotI2RlZmluZSBNQUlOX0NIX1NUQVRVUzJfTUFJTkNIQVJHRVJERVREQk5DCTB4NDAKLSNkZWZpbmUgVVNCX0NIX1ZCVVNEUk9QCQkJCTB4NDAKLSNkZWZpbmUgVVNCX0NIX1ZCVVNERVREQk5DCQkJMHgwMQotCi0vKiBVc2JMaW5lU3RhdHVzIHJlZ2lzdGVyIGJpdCBtYXNrcyAqLwotI2RlZmluZSBBQjg1MDBfVVNCX0xJTktfU1RBVFVTCQkweDc4Ci0jZGVmaW5lIEFCODUwNV9VU0JfTElOS19TVEFUVVMJCTB4RjgKLSNkZWZpbmUgQUI4NTAwX1NURF9IT1NUX1NVU1AJCTB4MTgKLSNkZWZpbmUgVVNCX0xJTktfU1RBVFVTX1NISUZUCQkzCi0KLS8qIFdhdGNoZG9nIHRpbWVvdXQgY29uc3RhbnQgKi8KLSNkZWZpbmUgV0RfVElNRVIJCQkweDMwIC8qIDRtaW4gKi8KLSNkZWZpbmUgV0RfS0lDS19JTlRFUlZBTAkJKDYwICogSFopCi0KLS8qIExvd2VzdCBjaGFyZ2VyIHZvbHRhZ2UgaXMgMy4zOVYgLT4gMHg0RSAqLwotI2RlZmluZSBMT1dfVk9MVF9SRUcJCQkweDRFCi0KLS8qIFN0ZXAgdXAvZG93biBkZWxheSBpbiB1cyAqLwotI2RlZmluZSBTVEVQX1VERUxBWQkJCTEwMDAKLQotI2RlZmluZSBDSEFSR0VSX1NUQVRVU19QT0xMIDEwIC8qIGluIG1zICovCi0KLSNkZWZpbmUgQ0hHX1dEX0lOVEVSVkFMCQkJKDYwICogSFopCi0KLSNkZWZpbmUgQUI4NTAwX1NXX0NPTlRST0xfRkFMTEJBQ0sJMHgwMwotLyogV2FpdCBmb3IgZW51bWVyYXRpb24gYmVmb3JlIGNoYXJpbmcgaW4gdXMgKi8KLSNkZWZpbmUgV0FJVF9BQ0FfUklEX0VOVU1FUkFUSU9OCSg1ICogMTAwMCkKLS8qRXh0ZXJuYWwgY2hhcmdlciBjb250cm9sKi8KLSNkZWZpbmUgQUI4NTAwX1NZU19DSEFSR0VSX0NPTlRST0xfUkVHCQkweDUyCi0jZGVmaW5lIEVYVEVSTkFMX0NIQVJHRVJfRElTQUJMRV9SRUdfVkFMCTB4MDMKLSNkZWZpbmUgRVhURVJOQUxfQ0hBUkdFUl9FTkFCTEVfUkVHX1ZBTAkJMHgwNwotCi0vKiBVc2JMaW5lU3RhdHVzIHJlZ2lzdGVyIC0gdXNiIHR5cGVzICovCi1lbnVtIGFiODUwMF9jaGFyZ2VyX2xpbmtfc3RhdHVzIHsKLQlVU0JfU1RBVF9OT1RfQ09ORklHVVJFRCwKLQlVU0JfU1RBVF9TVERfSE9TVF9OQywKLQlVU0JfU1RBVF9TVERfSE9TVF9DX05TLAotCVVTQl9TVEFUX1NURF9IT1NUX0NfUywKLQlVU0JfU1RBVF9IT1NUX0NIR19OTSwKLQlVU0JfU1RBVF9IT1NUX0NIR19IUywKLQlVU0JfU1RBVF9IT1NUX0NIR19IU19DSElSUCwKLQlVU0JfU1RBVF9ERURJQ0FURURfQ0hHLAotCVVTQl9TVEFUX0FDQV9SSURfQSwKLQlVU0JfU1RBVF9BQ0FfUklEX0IsCi0JVVNCX1NUQVRfQUNBX1JJRF9DX05NLAotCVVTQl9TVEFUX0FDQV9SSURfQ19IUywKLQlVU0JfU1RBVF9BQ0FfUklEX0NfSFNfQ0hJUlAsCi0JVVNCX1NUQVRfSE1fSURHTkQsCi0JVVNCX1NUQVRfUkVTRVJWRUQsCi0JVVNCX1NUQVRfTk9UX1ZBTElEX0xJTkssCi0JVVNCX1NUQVRfUEhZX0VOLAotCVVTQl9TVEFUX1NVUF9OT19JREdORF9WQlVTLAotCVVTQl9TVEFUX1NVUF9JREdORF9WQlVTLAotCVVTQl9TVEFUX0NIQVJHRVJfTElORV8xLAotCVVTQl9TVEFUX0NBUktJVF8xLAotCVVTQl9TVEFUX0NBUktJVF8yLAotCVVTQl9TVEFUX0FDQV9ET0NLX0NIQVJHRVIsCi19OwotCi1lbnVtIGFiODUwMF91c2Jfc3RhdGUgewotCUFCODUwMF9CTV9VU0JfU1RBVEVfUkVTRVRfSFMsCS8qIEhpZ2hTcGVlZCBSZXNldCAqLwotCUFCODUwMF9CTV9VU0JfU1RBVEVfUkVTRVRfRlMsCS8qIEZ1bGxTcGVlZC9Mb3dTcGVlZCBSZXNldCAqLwotCUFCODUwMF9CTV9VU0JfU1RBVEVfQ09ORklHVVJFRCwKLQlBQjg1MDBfQk1fVVNCX1NUQVRFX1NVU1BFTkQsCi0JQUI4NTAwX0JNX1VTQl9TVEFURV9SRVNVTUUsCi0JQUI4NTAwX0JNX1VTQl9TVEFURV9NQVgsCi19OwotCi0vKiBWQlVTIGlucHV0IGN1cnJlbnQgbGltaXRzIHN1cHBvcnRlZCBpbiBBQjg1MDAgaW4gbUEgKi8KLSNkZWZpbmUgVVNCX0NIX0lQX0NVUl9MVkxfMFAwNQkJNTAKLSNkZWZpbmUgVVNCX0NIX0lQX0NVUl9MVkxfMFAwOQkJOTgKLSNkZWZpbmUgVVNCX0NIX0lQX0NVUl9MVkxfMFAxOQkJMTkzCi0jZGVmaW5lIFVTQl9DSF9JUF9DVVJfTFZMXzBQMjkJCTI5MAotI2RlZmluZSBVU0JfQ0hfSVBfQ1VSX0xWTF8wUDM4CQkzODAKLSNkZWZpbmUgVVNCX0NIX0lQX0NVUl9MVkxfMFA0NQkJNDUwCi0jZGVmaW5lIFVTQl9DSF9JUF9DVVJfTFZMXzBQNQkJNTAwCi0jZGVmaW5lIFVTQl9DSF9JUF9DVVJfTFZMXzBQNgkJNjAwCi0jZGVmaW5lIFVTQl9DSF9JUF9DVVJfTFZMXzBQNwkJNzAwCi0jZGVmaW5lIFVTQl9DSF9JUF9DVVJfTFZMXzBQOAkJODAwCi0jZGVmaW5lIFVTQl9DSF9JUF9DVVJfTFZMXzBQOQkJOTAwCi0jZGVmaW5lIFVTQl9DSF9JUF9DVVJfTFZMXzFQMAkJMTAwMAotI2RlZmluZSBVU0JfQ0hfSVBfQ1VSX0xWTF8xUDEJCTExMDAKLSNkZWZpbmUgVVNCX0NIX0lQX0NVUl9MVkxfMVAzCQkxMzAwCi0jZGVmaW5lIFVTQl9DSF9JUF9DVVJfTFZMXzFQNAkJMTQwMAotI2RlZmluZSBVU0JfQ0hfSVBfQ1VSX0xWTF8xUDUJCTE1MDAKLQotI2RlZmluZSBWQkFUX1RSRVNIX0lQX0NVUl9SRUQJCTM4MDAKLQotI2RlZmluZSB0b19hYjg1MDBfY2hhcmdlcl91c2JfZGV2aWNlX2luZm8oeCkgY29udGFpbmVyX29mKCh4KSwgXAotCXN0cnVjdCBhYjg1MDBfY2hhcmdlciwgdXNiX2NoZykKLSNkZWZpbmUgdG9fYWI4NTAwX2NoYXJnZXJfYWNfZGV2aWNlX2luZm8oeCkgY29udGFpbmVyX29mKCh4KSwgXAotCXN0cnVjdCBhYjg1MDBfY2hhcmdlciwgYWNfY2hnKQotCi0vKioKLSAqIHN0cnVjdCBhYjg1MDBfY2hhcmdlcl9pbnRlcnJ1cHRzIC0gYWI4NTAwIGludGVydXB0cwotICogQG5hbWU6CW5hbWUgb2YgdGhlIGludGVycnVwdAotICogQGlzcgkJZnVuY3Rpb24gcG9pbnRlciB0byB0aGUgaXNyCi0gKi8KLXN0cnVjdCBhYjg1MDBfY2hhcmdlcl9pbnRlcnJ1cHRzIHsKLQljaGFyICpuYW1lOwotCWlycXJldHVybl90ICgqaXNyKShpbnQgaXJxLCB2b2lkICpkYXRhKTsKLX07Ci0KLXN0cnVjdCBhYjg1MDBfY2hhcmdlcl9pbmZvIHsKLQlpbnQgY2hhcmdlcl9jb25uZWN0ZWQ7Ci0JaW50IGNoYXJnZXJfb25saW5lOwotCWludCBjaGFyZ2VyX3ZvbHRhZ2U7Ci0JaW50IGN2X2FjdGl2ZTsKLQlib29sIHdkX2V4cGlyZWQ7Ci0JaW50IGNoYXJnZXJfY3VycmVudDsKLX07Ci0KLXN0cnVjdCBhYjg1MDBfY2hhcmdlcl9ldmVudF9mbGFncyB7Ci0JYm9vbCBtYWluZXh0Y2hub3RvazsKLQlib29sIG1haW5fdGhlcm1hbF9wcm90OwotCWJvb2wgdXNiX3RoZXJtYWxfcHJvdDsKLQlib29sIHZidXNfb3Z2OwotCWJvb2wgdXNiY2hhcmdlcm5vdG9rOwotCWJvb2wgY2hnd2RleHA7Ci0JYm9vbCB2YnVzX2NvbGxhcHNlOwotCWJvb2wgdmJ1c19kcm9wX2VuZDsKLX07Ci0KLXN0cnVjdCBhYjg1MDBfY2hhcmdlcl91c2Jfc3RhdGUgewotCWludCB1c2JfY3VycmVudDsKLQlpbnQgdXNiX2N1cnJlbnRfdG1wOwotCWVudW0gYWI4NTAwX3VzYl9zdGF0ZSBzdGF0ZTsKLQllbnVtIGFiODUwMF91c2Jfc3RhdGUgc3RhdGVfdG1wOwotCXNwaW5sb2NrX3QgdXNiX2xvY2s7Ci19OwotCi1zdHJ1Y3QgYWI4NTAwX2NoYXJnZXJfbWF4X3VzYl9pbl9jdXJyIHsKLQlpbnQgdXNiX3R5cGVfbWF4OwotCWludCBzZXRfbWF4OwotCWludCBjYWxjdWxhdGVkX21heDsKLX07Ci0KLS8qKgotICogc3RydWN0IGFiODUwMF9jaGFyZ2VyIC0gYWI4NTAwIENoYXJnZXIgZGV2aWNlIGluZm9ybWF0aW9uCi0gKiBAZGV2OgkJUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIGRldmljZQotICogQHZidXNfZGV0ZWN0ZWQ6CVZCVVMgZGV0ZWN0ZWQKLSAqIEB2YnVzX2RldGVjdGVkX3N0YXJ0OgotICoJCQlWQlVTIGRldGVjdGVkIGR1cmluZyBzdGFydHVwCi0gKiBAYWNfY29ubjoJCVRoaXMgd2lsbCBiZSB0cnVlIHdoZW4gdGhlIEFDIGNoYXJnZXIgaGFzIGJlZW4gcGx1Z2dlZAotICogQHZkZGFkY19lbl9hYzoJSW5kaWNhdGUgaWYgVkREIEFEQyBzdXBwbHkgaXMgZW5hYmxlZCBiZWNhdXNlIEFDCi0gKgkJCWNoYXJnZXIgaXMgZW5hYmxlZAotICogQHZkZGFkY19lbl91c2I6CUluZGljYXRlIGlmIFZERCBBREMgc3VwcGx5IGlzIGVuYWJsZWQgYmVjYXVzZSBVU0IKLSAqCQkJY2hhcmdlciBpcyBlbmFibGVkCi0gKiBAdmJhdAkJQmF0dGVyeSB2b2x0YWdlCi0gKiBAb2xkX3ZiYXQJCVByZXZpb3VzbHkgbWVhc3VyZWQgYmF0dGVyeSB2b2x0YWdlCi0gKiBAdXNiX2RldmljZV9pc191bnJlY29nbmlzZWQJVVNCIGRldmljZSBpcyB1bnJlY29nbmlzZWQgYnkgdGhlIGhhcmR3YXJlCi0gKiBAYXV0b3Bvd2VyCQlJbmRpY2F0ZSBpZiB3ZSBzaG91bGQgaGF2ZSBhdXRvbWF0aWMgcHdyb24gYWZ0ZXIgcHdybG9zcwotICogQGF1dG9wb3dlcl9jZmcJcGxhdGZvcm0gc3BlY2lmaWMgcG93ZXIgY29uZmlnIHN1cHBvcnQgZm9yICJwd3JvbiBhZnRlciBwd3Jsb3NzIgotICogQGludmFsaWRfY2hhcmdlcl9kZXRlY3Rfc3RhdGUgU3RhdGUgd2hlbiBmb3JjaW5nIEFCIHRvIHVzZSBpbnZhbGlkIGNoYXJnZXIKLSAqIEBpc19hY2FfcmlkOgkJSW5jaWNhdGUgaWYgYWNjZXNzb3J5IGlzIEFDQSB0eXBlCi0gKiBAY3VycmVudF9zdGVwcGluZ19zZXNzaW9uczoKLSAqCQkJQ291bnRlciBmb3IgY3VycmVudCBzdGVwcGluZyBzZXNzaW9ucwotICogQHBhcmVudDoJCVBvaW50ZXIgdG8gdGhlIHN0cnVjdCBhYjg1MDAKLSAqIEBncGFkYzoJCVBvaW50ZXIgdG8gdGhlIHN0cnVjdCBncGFkYwotICogQGJtOiAgICAgICAgICAgCVBsYXRmb3JtIHNwZWNpZmljIGJhdHRlcnkgbWFuYWdlbWVudCBpbmZvcm1hdGlvbgotICogQGZsYWdzOgkJU3RydWN0dXJlIGZvciBpbmZvcm1hdGlvbiBhYm91dCBldmVudHMgdHJpZ2dlcmVkCi0gKiBAdXNiX3N0YXRlOgkJU3RydWN0dXJlIGZvciB1c2Igc3RhY2sgaW5mb3JtYXRpb24KLSAqIEBtYXhfdXNiX2luX2N1cnI6CU1heCBVU0IgY2hhcmdlciBpbnB1dCBjdXJyZW50Ci0gKiBAYWNfY2hnOgkJQUMgY2hhcmdlciBwb3dlciBzdXBwbHkKLSAqIEB1c2JfY2hnOgkJVVNCIGNoYXJnZXIgcG93ZXIgc3VwcGx5Ci0gKiBAYWM6CQkJU3RydWN0dXJlIHRoYXQgaG9sZHMgdGhlIEFDIGNoYXJnZXIgcHJvcGVydGllcwotICogQHVzYjoJCVN0cnVjdHVyZSB0aGF0IGhvbGRzIHRoZSBVU0IgY2hhcmdlciBwcm9wZXJ0aWVzCi0gKiBAcmVndToJCVBvaW50ZXIgdG8gdGhlIHN0cnVjdCByZWd1bGF0b3IKLSAqIEBjaGFyZ2VyX3dxOgkJV29yayBxdWV1ZSBmb3IgdGhlIElSUXMgYW5kIGNoZWNraW5nIEhXIHN0YXRlCi0gKiBAdXNiX2lwdF9jcm50X2xvY2s6CUxvY2sgdG8gcHJvdGVjdCBWQlVTIGlucHV0IGN1cnJlbnQgc2V0dGluZyBmcm9tIG11dHVhbHMKLSAqIEBwbV9sb2NrOgkJTG9jayB0byBwcmV2ZW50IHN5c3RlbSB0byBzdXNwZW5kCi0gKiBAY2hlY2tfdmJhdF93b3JrCVdvcmsgZm9yIGNoZWNraW5nIHZiYXQgdGhyZXNob2xkIHRvIGFkanVzdCB2YnVzIGN1cnJlbnQKLSAqIEBjaGVja19od19mYWlsdXJlX3dvcms6CVdvcmsgZm9yIGNoZWNraW5nIEhXIHN0YXRlCi0gKiBAY2hlY2tfdXNiY2hnbm90b2tfd29yazoJV29yayBmb3IgY2hlY2tpbmcgVVNCIGNoYXJnZXIgbm90IG9rIHN0YXR1cwotICogQGtpY2tfd2Rfd29yazoJCVdvcmsgZm9yIGtpY2tpbmcgdGhlIGNoYXJnZXIgd2F0Y2hkb2cgaW4gY2FzZQotICoJCQkJb2YgQUJCIHJldiAxLiogZHVlIHRvIHRoZSB3YXRjaG9nIGxvZ2ljIGJ1ZwotICogQGFjX2NoYXJnZXJfYXR0YWNoZWRfd29yazoJV29yayBmb3IgY2hlY2tpbmcgaWYgQUMgY2hhcmdlciBpcyBzdGlsbAotICoJCQkJY29ubmVjdGVkCi0gKiBAdXNiX2NoYXJnZXJfYXR0YWNoZWRfd29yazoJV29yayBmb3IgY2hlY2tpbmcgaWYgVVNCIGNoYXJnZXIgaXMgc3RpbGwKLSAqCQkJCWNvbm5lY3RlZAotICogQGFjX3dvcms6CQkJV29yayBmb3IgY2hlY2tpbmcgQUMgY2hhcmdlciBjb25uZWN0aW9uCi0gKiBAZGV0ZWN0X3VzYl90eXBlX3dvcms6CVdvcmsgZm9yIGRldGVjdGluZyB0aGUgVVNCIHR5cGUgY29ubmVjdGVkCi0gKiBAdXNiX2xpbmtfc3RhdHVzX3dvcms6CVdvcmsgZm9yIGNoZWNraW5nIHRoZSBuZXcgVVNCIGxpbmsgc3RhdHVzCi0gKiBAdXNiX3N0YXRlX2NoYW5nZWRfd29yazoJV29yayBmb3IgY2hlY2tpbmcgVVNCIHN0YXRlCi0gKiBAYXR0YWNoX3dvcms6CQlXb3JrIGZvciBkZXRlY3RpbmcgVVNCIHR5cGUKLSAqIEB2YnVzX2Ryb3BfZW5kX3dvcms6CQlXb3JrIGZvciBkZXRlY3RpbmcgVkJVUyBkcm9wIGVuZAotICogQGNoZWNrX21haW5fdGhlcm1hbF9wcm90X3dvcms6Ci0gKgkJCQlXb3JrIGZvciBjaGVja2luZyBNYWluIHRoZXJtYWwgc3RhdHVzCi0gKiBAY2hlY2tfdXNiX3RoZXJtYWxfcHJvdF93b3JrOgotICoJCQkJV29yayBmb3IgY2hlY2tpbmcgVVNCIHRoZXJtYWwgc3RhdHVzCi0gKiBAY2hhcmdlcl9hdHRhY2hlZF9tdXRleDoJRm9yIGNvbnRyb2xsaW5nIHRoZSB3YWtlbG9jawotICovCi1zdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgewotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlib29sIHZidXNfZGV0ZWN0ZWQ7Ci0JYm9vbCB2YnVzX2RldGVjdGVkX3N0YXJ0OwotCWJvb2wgYWNfY29ubjsKLQlib29sIHZkZGFkY19lbl9hYzsKLQlib29sIHZkZGFkY19lbl91c2I7Ci0JaW50IHZiYXQ7Ci0JaW50IG9sZF92YmF0OwotCWJvb2wgdXNiX2RldmljZV9pc191bnJlY29nbmlzZWQ7Ci0JYm9vbCBhdXRvcG93ZXI7Ci0JYm9vbCBhdXRvcG93ZXJfY2ZnOwotCWludCBpbnZhbGlkX2NoYXJnZXJfZGV0ZWN0X3N0YXRlOwotCWludCBpc19hY2FfcmlkOwotCWF0b21pY190IGN1cnJlbnRfc3RlcHBpbmdfc2Vzc2lvbnM7Ci0Jc3RydWN0IGFiODUwMCAqcGFyZW50OwotCXN0cnVjdCBhYjg1MDBfZ3BhZGMgKmdwYWRjOwotCXN0cnVjdCBhYng1MDBfYm1fZGF0YSAqYm07Ci0Jc3RydWN0IGFiODUwMF9jaGFyZ2VyX2V2ZW50X2ZsYWdzIGZsYWdzOwotCXN0cnVjdCBhYjg1MDBfY2hhcmdlcl91c2Jfc3RhdGUgdXNiX3N0YXRlOwotCXN0cnVjdCBhYjg1MDBfY2hhcmdlcl9tYXhfdXNiX2luX2N1cnIgbWF4X3VzYl9pbl9jdXJyOwotCXN0cnVjdCB1eDUwMF9jaGFyZ2VyIGFjX2NoZzsKLQlzdHJ1Y3QgdXg1MDBfY2hhcmdlciB1c2JfY2hnOwotCXN0cnVjdCBhYjg1MDBfY2hhcmdlcl9pbmZvIGFjOwotCXN0cnVjdCBhYjg1MDBfY2hhcmdlcl9pbmZvIHVzYjsKLQlzdHJ1Y3QgcmVndWxhdG9yICpyZWd1OwotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpjaGFyZ2VyX3dxOwotCXN0cnVjdCBtdXRleCB1c2JfaXB0X2NybnRfbG9jazsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGNoZWNrX3ZiYXRfd29yazsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGNoZWNrX2h3X2ZhaWx1cmVfd29yazsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGNoZWNrX3VzYmNoZ25vdG9rX3dvcms7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBraWNrX3dkX3dvcms7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayB1c2Jfc3RhdGVfY2hhbmdlZF93b3JrOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgYXR0YWNoX3dvcms7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBhY19jaGFyZ2VyX2F0dGFjaGVkX3dvcms7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayB1c2JfY2hhcmdlcl9hdHRhY2hlZF93b3JrOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgdmJ1c19kcm9wX2VuZF93b3JrOwotCXN0cnVjdCB3b3JrX3N0cnVjdCBhY193b3JrOwotCXN0cnVjdCB3b3JrX3N0cnVjdCBkZXRlY3RfdXNiX3R5cGVfd29yazsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdXNiX2xpbmtfc3RhdHVzX3dvcms7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IGNoZWNrX21haW5fdGhlcm1hbF9wcm90X3dvcms7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IGNoZWNrX3VzYl90aGVybWFsX3Byb3Rfd29yazsKLQlzdHJ1Y3QgdXNiX3BoeSAqdXNiX3BoeTsKLQlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbmI7Ci0Jc3RydWN0IG11dGV4IGNoYXJnZXJfYXR0YWNoZWRfbXV0ZXg7Ci19OwotCi0vKiBBQyBwcm9wZXJ0aWVzICovCi1zdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgYWI4NTAwX2NoYXJnZXJfYWNfcHJvcHNbXSA9IHsKLQlQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEgsCi0JUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUsCi0JUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1csCi0JUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9BVkcsCi0JUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1csCi19OwotCi0vKiBVU0IgcHJvcGVydGllcyAqLwotc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IGFiODUwMF9jaGFyZ2VyX3VzYl9wcm9wc1tdID0gewotCVBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX0FWRywKLQlQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5ULAotCVBPV0VSX1NVUFBMWV9QUk9QX09OTElORSwKLQlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVywKLQlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX0FWRywKLQlQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVywKLX07Ci0KLS8qCi0gKiBGdW5jdGlvbiBmb3IgZW5hYmxpbmcgYW5kIGRpc2FibGluZyBzdyBmYWxsYmFjayBtb2RlCi0gKiBzaG91bGQgYWx3YXlzIGJlIGRpc2FibGVkIHdoZW4gbm8gY2hhcmdlciBpcyBjb25uZWN0ZWQuCi0gKi8KLXN0YXRpYyB2b2lkIGFiODUwMF9lbmFibGVfZGlzYWJsZV9zd19mYWxsYmFjayhzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpLAotCQlib29sIGZhbGxiYWNrKQotewotCXU4IHZhbDsKLQl1OCByZWc7Ci0JdTggYmFuazsKLQl1OCBiaXQ7Ci0JaW50IHJldDsKLQotCWRldl9kYmcoZGktPmRldiwgIlNXIEZhbGxiYWNrOiAlZFxuIiwgZmFsbGJhY2spOwotCi0JaWYgKGlzX2FiODUwMChkaS0+cGFyZW50KSkgewotCQliYW5rID0gMHgxNTsKLQkJcmVnID0gMHgwOwotCQliaXQgPSAzOwotCX0gZWxzZSB7Ci0JCWJhbmsgPSBBQjg1MDBfU1lTX0NUUkwxX0JMT0NLOwotCQlyZWcgPSBBQjg1MDBfU1dfQ09OVFJPTF9GQUxMQkFDSzsKLQkJYml0ID0gMDsKLQl9Ci0KLQkvKiByZWFkIHRoZSByZWdpc3RlciBjb250YWluaW5nIGZhbGxiYWNrIGJpdCAqLwotCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBiYW5rLCByZWcsICZ2YWwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoZGktPmRldiwgIiVkIHJlYWQgZmFpbGVkXG4iLCBfX0xJTkVfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoaXNfYWI4NTAwKGRpLT5wYXJlbnQpKSB7Ci0JCS8qIGVuYWJsZSB0aGUgT1BUIGVtdWxhdGlvbiByZWdpc3RlcnMgKi8KLQkJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIDB4MTEsIDB4MDAsIDB4Mik7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoZGktPmRldiwgIiVkIHdyaXRlIGZhaWxlZFxuIiwgX19MSU5FX18pOwotCQkJZ290byBkaXNhYmxlX290cDsKLQkJfQotCX0KLQotCWlmIChmYWxsYmFjaykKLQkJdmFsIHw9ICgxIDw8IGJpdCk7Ci0JZWxzZQotCQl2YWwgJj0gfigxIDw8IGJpdCk7Ci0KLQkvKiB3cml0ZSBiYWNrIHRoZSBjaGFuZ2VkIGZhbGxiYWNrIGJpdCB2YWx1ZSB0byByZWdpc3RlciAqLwotCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBiYW5rLCByZWcsIHZhbCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRpLT5kZXYsICIlZCB3cml0ZSBmYWlsZWRcbiIsIF9fTElORV9fKTsKLQl9Ci0KLWRpc2FibGVfb3RwOgotCWlmIChpc19hYjg1MDAoZGktPnBhcmVudCkpIHsKLQkJLyogZGlzYWJsZSB0aGUgc2V0IE9UUCByZWdpc3RlcnMgYWdhaW4gKi8KLQkJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIDB4MTEsIDB4MDAsIDB4MCk7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoZGktPmRldiwgIiVkIHdyaXRlIGZhaWxlZFxuIiwgX19MSU5FX18pOwotCQl9Ci0JfQotfQotCi0vKioKLSAqIGFiODUwMF9wb3dlcl9zdXBwbHlfY2hhbmdlZCAtIGEgd3JhcHBlciB3aXRoIGxvY2FsIGV4dGVudGlvbnMgZm9yCi0gKiBwb3dlcl9zdXBwbHlfY2hhbmdlZAotICogQGRpOgkgIHBvaW50ZXIgdG8gdGhlIGFiODUwMF9jaGFyZ2VyIHN0cnVjdHVyZQotICogQHBzeTogIHBvaW50ZXIgdG8gcG93ZXJfc3VwcGx5X3RoYXQgaGF2ZSBjaGFuZ2VkLgotICoKLSAqLwotc3RhdGljIHZvaWQgYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKHN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGksCi0JCQkJCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSkKLXsKLQlpZiAoZGktPmF1dG9wb3dlcl9jZmcpIHsKLQkJaWYgKCFkaS0+dXNiLmNoYXJnZXJfY29ubmVjdGVkICYmCi0JCSAgICAhZGktPmFjLmNoYXJnZXJfY29ubmVjdGVkICYmCi0JCSAgICBkaS0+YXV0b3Bvd2VyKSB7Ci0JCQlkaS0+YXV0b3Bvd2VyID0gZmFsc2U7Ci0JCQlhYjg1MDBfZW5hYmxlX2Rpc2FibGVfc3dfZmFsbGJhY2soZGksIGZhbHNlKTsKLQkJfSBlbHNlIGlmICghZGktPmF1dG9wb3dlciAmJgotCQkJICAgKGRpLT5hYy5jaGFyZ2VyX2Nvbm5lY3RlZCB8fAotCQkJICAgIGRpLT51c2IuY2hhcmdlcl9jb25uZWN0ZWQpKSB7Ci0JCQlkaS0+YXV0b3Bvd2VyID0gdHJ1ZTsKLQkJCWFiODUwMF9lbmFibGVfZGlzYWJsZV9zd19mYWxsYmFjayhkaSwgdHJ1ZSk7Ci0JCX0KLQl9Ci0JcG93ZXJfc3VwcGx5X2NoYW5nZWQocHN5KTsKLX0KLQotc3RhdGljIHZvaWQgYWI4NTAwX2NoYXJnZXJfc2V0X3VzYl9jb25uZWN0ZWQoc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSwKLQlib29sIGNvbm5lY3RlZCkKLXsKLQlpZiAoY29ubmVjdGVkICE9IGRpLT51c2IuY2hhcmdlcl9jb25uZWN0ZWQpIHsKLQkJZGV2X2RiZyhkaS0+ZGV2LCAiVVNCIGNvbm5lY3RlZDolaVxuIiwgY29ubmVjdGVkKTsKLQkJZGktPnVzYi5jaGFyZ2VyX2Nvbm5lY3RlZCA9IGNvbm5lY3RlZDsKLQotCQlpZiAoIWNvbm5lY3RlZCkKLQkJCWRpLT5mbGFncy52YnVzX2Ryb3BfZW5kID0gZmFsc2U7Ci0KLQkJc3lzZnNfbm90aWZ5KCZkaS0+dXNiX2NoZy5wc3ktPmRldi5rb2JqLCBOVUxMLCAicHJlc2VudCIpOwotCi0JCWlmIChjb25uZWN0ZWQpIHsKLQkJCW11dGV4X2xvY2soJmRpLT5jaGFyZ2VyX2F0dGFjaGVkX211dGV4KTsKLQkJCW11dGV4X3VubG9jaygmZGktPmNoYXJnZXJfYXR0YWNoZWRfbXV0ZXgpOwotCi0JCQlpZiAoaXNfYWI4NTAwKGRpLT5wYXJlbnQpKQotCQkJCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Y2hhcmdlcl93cSwKLQkJCQkJICAgJmRpLT51c2JfY2hhcmdlcl9hdHRhY2hlZF93b3JrLAotCQkJCQkgICBIWik7Ci0JCX0gZWxzZSB7Ci0JCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmRpLT51c2JfY2hhcmdlcl9hdHRhY2hlZF93b3JrKTsKLQkJCW11dGV4X2xvY2soJmRpLT5jaGFyZ2VyX2F0dGFjaGVkX211dGV4KTsKLQkJCW11dGV4X3VubG9jaygmZGktPmNoYXJnZXJfYXR0YWNoZWRfbXV0ZXgpOwotCQl9Ci0JfQotfQotCi0vKioKLSAqIGFiODUwMF9jaGFyZ2VyX2dldF9hY192b2x0YWdlKCkgLSBnZXQgYWMgY2hhcmdlciB2b2x0YWdlCi0gKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfY2hhcmdlciBzdHJ1Y3R1cmUKLSAqCi0gKiBSZXR1cm5zIGFjIGNoYXJnZXIgdm9sdGFnZSAob24gc3VjY2VzcykKLSAqLwotc3RhdGljIGludCBhYjg1MDBfY2hhcmdlcl9nZXRfYWNfdm9sdGFnZShzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpKQotewotCWludCB2Y2g7Ci0KLQkvKiBPbmx5IG1lYXN1cmUgdm9sdGFnZSBpZiB0aGUgY2hhcmdlciBpcyBjb25uZWN0ZWQgKi8KLQlpZiAoZGktPmFjLmNoYXJnZXJfY29ubmVjdGVkKSB7Ci0JCXZjaCA9IGFiODUwMF9ncGFkY19jb252ZXJ0KGRpLT5ncGFkYywgTUFJTl9DSEFSR0VSX1YpOwotCQlpZiAodmNoIDwgMCkKLQkJCWRldl9lcnIoZGktPmRldiwgIiVzIGdwYWRjIGNvbnYgZmFpbGVkLFxuIiwgX19mdW5jX18pOwotCX0gZWxzZSB7Ci0JCXZjaCA9IDA7Ci0JfQotCXJldHVybiB2Y2g7Ci19Ci0KLS8qKgotICogYWI4NTAwX2NoYXJnZXJfYWNfY3YoKSAtIGNoZWNrIGlmIHRoZSBtYWluIGNoYXJnZXIgaXMgaW4gQ1YgbW9kZQotICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2NoYXJnZXIgc3RydWN0dXJlCi0gKgotICogUmV0dXJucyBhYyBjaGFyZ2VyIENWIG1vZGUgKG9uIHN1Y2Nlc3MpIGVsc2UgZXJyb3IgY29kZQotICovCi1zdGF0aWMgaW50IGFiODUwMF9jaGFyZ2VyX2FjX2N2KHN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGkpCi17Ci0JdTggdmFsOwotCWludCByZXQgPSAwOwotCi0JLyogT25seSBjaGVjayBDViBtb2RlIGlmIHRoZSBjaGFyZ2VyIGlzIG9ubGluZSAqLwotCWlmIChkaS0+YWMuY2hhcmdlcl9vbmxpbmUpIHsKLQkJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9DSEFSR0VSLAotCQkJQUI4NTAwX0NIX1NUQVRVUzFfUkVHLCAmdmFsKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoZGktPmRldiwgIiVzIGFiODUwMCByZWFkIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlpZiAodmFsICYgTUFJTl9DSF9DVl9PTikKLQkJCXJldCA9IDE7Ci0JCWVsc2UKLQkJCXJldCA9IDA7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBhYjg1MDBfY2hhcmdlcl9nZXRfdmJ1c192b2x0YWdlKCkgLSBnZXQgdmJ1cyB2b2x0YWdlCi0gKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfY2hhcmdlciBzdHJ1Y3R1cmUKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHZidXMgdm9sdGFnZS4KLSAqIFJldHVybnMgdmJ1cyB2b2x0YWdlIChvbiBzdWNjZXNzKQotICovCi1zdGF0aWMgaW50IGFiODUwMF9jaGFyZ2VyX2dldF92YnVzX3ZvbHRhZ2Uoc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSkKLXsKLQlpbnQgdmNoOwotCi0JLyogT25seSBtZWFzdXJlIHZvbHRhZ2UgaWYgdGhlIGNoYXJnZXIgaXMgY29ubmVjdGVkICovCi0JaWYgKGRpLT51c2IuY2hhcmdlcl9jb25uZWN0ZWQpIHsKLQkJdmNoID0gYWI4NTAwX2dwYWRjX2NvbnZlcnQoZGktPmdwYWRjLCBWQlVTX1YpOwotCQlpZiAodmNoIDwgMCkKLQkJCWRldl9lcnIoZGktPmRldiwgIiVzIGdwYWRjIGNvbnYgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JfSBlbHNlIHsKLQkJdmNoID0gMDsKLQl9Ci0JcmV0dXJuIHZjaDsKLX0KLQotLyoqCi0gKiBhYjg1MDBfY2hhcmdlcl9nZXRfdXNiX2N1cnJlbnQoKSAtIGdldCB1c2IgY2hhcmdlciBjdXJyZW50Ci0gKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfY2hhcmdlciBzdHJ1Y3R1cmUKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHVzYiBjaGFyZ2VyIGN1cnJlbnQuCi0gKiBSZXR1cm5zIHVzYiBjdXJyZW50IChvbiBzdWNjZXNzKSBhbmQgZXJyb3IgY29kZSBvbiBmYWlsdXJlCi0gKi8KLXN0YXRpYyBpbnQgYWI4NTAwX2NoYXJnZXJfZ2V0X3VzYl9jdXJyZW50KHN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGkpCi17Ci0JaW50IGljaDsKLQotCS8qIE9ubHkgbWVhc3VyZSBjdXJyZW50IGlmIHRoZSBjaGFyZ2VyIGlzIG9ubGluZSAqLwotCWlmIChkaS0+dXNiLmNoYXJnZXJfb25saW5lKSB7Ci0JCWljaCA9IGFiODUwMF9ncGFkY19jb252ZXJ0KGRpLT5ncGFkYywgVVNCX0NIQVJHRVJfQyk7Ci0JCWlmIChpY2ggPCAwKQotCQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgZ3BhZGMgY29udiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQl9IGVsc2UgewotCQlpY2ggPSAwOwotCX0KLQlyZXR1cm4gaWNoOwotfQotCi0vKioKLSAqIGFiODUwMF9jaGFyZ2VyX2dldF9hY19jdXJyZW50KCkgLSBnZXQgYWMgY2hhcmdlciBjdXJyZW50Ci0gKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfY2hhcmdlciBzdHJ1Y3R1cmUKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGFjIGNoYXJnZXIgY3VycmVudC4KLSAqIFJldHVybnMgYWMgY3VycmVudCAob24gc3VjY2VzcykgYW5kIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KLSAqLwotc3RhdGljIGludCBhYjg1MDBfY2hhcmdlcl9nZXRfYWNfY3VycmVudChzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpKQotewotCWludCBpY2g7Ci0KLQkvKiBPbmx5IG1lYXN1cmUgY3VycmVudCBpZiB0aGUgY2hhcmdlciBpcyBvbmxpbmUgKi8KLQlpZiAoZGktPmFjLmNoYXJnZXJfb25saW5lKSB7Ci0JCWljaCA9IGFiODUwMF9ncGFkY19jb252ZXJ0KGRpLT5ncGFkYywgTUFJTl9DSEFSR0VSX0MpOwotCQlpZiAoaWNoIDwgMCkKLQkJCWRldl9lcnIoZGktPmRldiwgIiVzIGdwYWRjIGNvbnYgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JfSBlbHNlIHsKLQkJaWNoID0gMDsKLQl9Ci0JcmV0dXJuIGljaDsKLX0KLQotLyoqCi0gKiBhYjg1MDBfY2hhcmdlcl91c2JfY3YoKSAtIGNoZWNrIGlmIHRoZSB1c2IgY2hhcmdlciBpcyBpbiBDViBtb2RlCi0gKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfY2hhcmdlciBzdHJ1Y3R1cmUKLSAqCi0gKiBSZXR1cm5zIGFjIGNoYXJnZXIgQ1YgbW9kZSAob24gc3VjY2VzcykgZWxzZSBlcnJvciBjb2RlCi0gKi8KLXN0YXRpYyBpbnQgYWI4NTAwX2NoYXJnZXJfdXNiX2N2KHN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGkpCi17Ci0JaW50IHJldDsKLQl1OCB2YWw7Ci0KLQkvKiBPbmx5IGNoZWNrIENWIG1vZGUgaWYgdGhlIGNoYXJnZXIgaXMgb25saW5lICovCi0JaWYgKGRpLT51c2IuY2hhcmdlcl9vbmxpbmUpIHsKLQkJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9DSEFSR0VSLAotCQkJQUI4NTAwX0NIX1VTQkNIX1NUQVQxX1JFRywgJnZhbCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKGRpLT5kZXYsICIlcyBhYjg1MDAgcmVhZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJaWYgKHZhbCAmIFVTQl9DSF9DVl9PTikKLQkJCXJldCA9IDE7Ci0JCWVsc2UKLQkJCXJldCA9IDA7Ci0JfSBlbHNlIHsKLQkJcmV0ID0gMDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIGFiODUwMF9jaGFyZ2VyX2RldGVjdF9jaGFyZ2VycygpIC0gRGV0ZWN0IHRoZSBjb25uZWN0ZWQgY2hhcmdlcnMKLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9jaGFyZ2VyIHN0cnVjdHVyZQotICogQHByb2JlOglpZiBwcm9iZSwgZG9uJ3QgZGVsYXkgYW5kIHdhaXQgZm9yIEhXCi0gKgotICogUmV0dXJucyB0aGUgdHlwZSBvZiBjaGFyZ2VyIGNvbm5lY3RlZC4KLSAqIEZvciBVU0IgaXQgd2lsbCBub3QgbWVhbiB3ZSBjYW4gYWN0dWFsbHkgY2hhcmdlIGZyb20gaXQKLSAqIGJ1dCB0aGF0IHRoZXJlIGlzIGEgVVNCIGNhYmxlIGNvbm5lY3RlZCB0aGF0IHdlIGhhdmUgdG8KLSAqIGlkZW50aWZ5LiBUaGlzIGlzIHVzZWQgZHVyaW5nIHN0YXJ0dXAgd2hlbiB3ZSBkb24ndCBnZXQKLSAqIGludGVycnVwdHMgb2YgdGhlIGNoYXJnZXIgZGV0ZWN0aW9uCi0gKgotICogUmV0dXJucyBhbiBpbnRlZ2VyIHZhbHVlLCB0aGF0IG1lYW5zLAotICogTk9fUFdfQ09OTiAgbm8gcG93ZXIgc3VwcGx5IGlzIGNvbm5lY3RlZAotICogQUNfUFdfQ09OTiAgaWYgdGhlIEFDIHBvd2VyIHN1cHBseSBpcyBjb25uZWN0ZWQKLSAqIFVTQl9QV19DT05OICBpZiB0aGUgVVNCIHBvd2VyIHN1cHBseSBpcyBjb25uZWN0ZWQKLSAqIEFDX1BXX0NPTk4gKyBVU0JfUFdfQ09OTiBpZiBVU0IgYW5kIEFDIHBvd2VyIHN1cHBsaWVzIGFyZSBib3RoIGNvbm5lY3RlZAotICovCi1zdGF0aWMgaW50IGFiODUwMF9jaGFyZ2VyX2RldGVjdF9jaGFyZ2VycyhzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpLCBib29sIHByb2JlKQotewotCWludCByZXN1bHQgPSBOT19QV19DT05OOwotCWludCByZXQ7Ci0JdTggdmFsOwotCi0JLyogQ2hlY2sgZm9yIEFDIGNoYXJnZXIgKi8KLQlyZXQgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX0NIQVJHRVIsCi0JCUFCODUwMF9DSF9TVEFUVVMxX1JFRywgJnZhbCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgYWI4NTAwIHJlYWQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JaWYgKHZhbCAmIE1BSU5fQ0hfREVUKQotCQlyZXN1bHQgPSBBQ19QV19DT05OOwotCi0JLyogQ2hlY2sgZm9yIFVTQiBjaGFyZ2VyICovCi0KLQlpZiAoIXByb2JlKSB7Ci0JCS8qCi0JCSAqIEFCODUwMCBzYXlzIFZCVVNfREVUX0RCTkMxICYgVkJVU19ERVRfREJOQzEwMAotCQkgKiB3aGVuIGRpc2Nvbm5lY3RpbmcgQUNBIGV2ZW4gdGhvdWdoIG5vCi0JCSAqIGNoYXJnZXIgd2FzIGNvbm5lY3RlZC4gVHJ5IHdhaXRpbmcgYSBsaXR0bGUKLQkJICogbG9uZ2VyIHRoYW4gdGhlIDEwMCBtcyBvZiBWQlVTX0RFVF9EQk5DMTAwLi4uCi0JCSAqLwotCQltc2xlZXAoMTEwKTsKLQl9Ci0JcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9DSEFSR0VSLAotCQlBQjg1MDBfQ0hfVVNCQ0hfU1RBVDFfUkVHLCAmdmFsKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGRpLT5kZXYsICIlcyBhYjg1MDAgcmVhZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JZGV2X2RiZyhkaS0+ZGV2LAotCQkiJXMgQUI4NTAwX0NIX1VTQkNIX1NUQVQxX1JFRyAleFxuIiwgX19mdW5jX18sCi0JCXZhbCk7Ci0JaWYgKCh2YWwgJiBWQlVTX0RFVF9EQk5DMSkgJiYgKHZhbCAmIFZCVVNfREVUX0RCTkMxMDApKQotCQlyZXN1bHQgfD0gVVNCX1BXX0NPTk47Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIGFiODUwMF9jaGFyZ2VyX21heF91c2JfY3VycigpIC0gZ2V0IHRoZSBtYXggY3VyciBmb3IgdGhlIFVTQiB0eXBlCi0gKiBAZGk6CQkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2NoYXJnZXIgc3RydWN0dXJlCi0gKiBAbGlua19zdGF0dXM6CXRoZSBpZGVudGlmaWVkIFVTQiB0eXBlCi0gKgotICogR2V0IHRoZSBtYXhpbXVtIGN1cnJlbnQgdGhhdCBpcyBhbGxvd2VkIHRvIGJlIGRyYXduIGZyb20gdGhlIGhvc3QKLSAqIGJhc2VkIG9uIHRoZSBVU0IgdHlwZS4KLSAqIFJldHVybnMgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUgZWxzZSAwIG9uIHN1Y2Nlc3MKLSAqLwotc3RhdGljIGludCBhYjg1MDBfY2hhcmdlcl9tYXhfdXNiX2N1cnIoc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSwKLQkJZW51bSBhYjg1MDBfY2hhcmdlcl9saW5rX3N0YXR1cyBsaW5rX3N0YXR1cykKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWRpLT51c2JfZGV2aWNlX2lzX3VucmVjb2duaXNlZCA9IGZhbHNlOwotCi0JLyoKLQkgKiBQbGF0Zm9ybSBvbmx5IHN1cHBvcnRzIFVTQiAyLjAuCi0JICogVGhpcyBtZWFucyB0aGF0IGNoYXJnaW5nIGN1cnJlbnQgZnJvbSBVU0Igc291cmNlCi0JICogaXMgbWF4aW11bSA1MDAgbUEuIEV2ZXJ5IG9jY3VyZW5jZSBvZiBVU0JfU1RBVF8qX0hPU1RfKgotCSAqIHNob3VsZCBzZXQgVVNCX0NIX0lQX0NVUl9MVkxfMFA1LgotCSAqLwotCi0Jc3dpdGNoIChsaW5rX3N0YXR1cykgewotCWNhc2UgVVNCX1NUQVRfU1REX0hPU1RfTkM6Ci0JY2FzZSBVU0JfU1RBVF9TVERfSE9TVF9DX05TOgotCWNhc2UgVVNCX1NUQVRfU1REX0hPU1RfQ19TOgotCQlkZXZfZGJnKGRpLT5kZXYsICJVU0IgVHlwZSAtIFN0YW5kYXJkIGhvc3QgaXMgIgotCQkJImRldGVjdGVkIHRocm91Z2ggVVNCIGRyaXZlclxuIik7Ci0JCWRpLT5tYXhfdXNiX2luX2N1cnIudXNiX3R5cGVfbWF4ID0gVVNCX0NIX0lQX0NVUl9MVkxfMFA1OwotCQlkaS0+aXNfYWNhX3JpZCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgVVNCX1NUQVRfSE9TVF9DSEdfSFNfQ0hJUlA6Ci0JCWRpLT5tYXhfdXNiX2luX2N1cnIudXNiX3R5cGVfbWF4ID0gVVNCX0NIX0lQX0NVUl9MVkxfMFA1OwotCQlkaS0+aXNfYWNhX3JpZCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgVVNCX1NUQVRfSE9TVF9DSEdfSFM6Ci0JCWRpLT5tYXhfdXNiX2luX2N1cnIudXNiX3R5cGVfbWF4ID0gVVNCX0NIX0lQX0NVUl9MVkxfMFA1OwotCQlkaS0+aXNfYWNhX3JpZCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgVVNCX1NUQVRfQUNBX1JJRF9DX0hTOgotCQlkaS0+bWF4X3VzYl9pbl9jdXJyLnVzYl90eXBlX21heCA9IFVTQl9DSF9JUF9DVVJfTFZMXzBQOTsKLQkJZGktPmlzX2FjYV9yaWQgPSAwOwotCQlicmVhazsKLQljYXNlIFVTQl9TVEFUX0FDQV9SSURfQToKLQkJLyoKLQkJICogRGVkaWNhdGVkIGNoYXJnZXIgbGV2ZWwgbWludXMgbWF4aW11bSBjdXJyZW50IGFjY2Vzc29yeQotCQkgKiBjYW4gY29uc3VtZSAoOTAwbUEpLiBDbG9zZXN0IGxldmVsIGlzIDUwMG1BCi0JCSAqLwotCQlkZXZfZGJnKGRpLT5kZXYsICJVU0JfU1RBVF9BQ0FfUklEX0EgZGV0ZWN0ZWRcbiIpOwotCQlkaS0+bWF4X3VzYl9pbl9jdXJyLnVzYl90eXBlX21heCA9IFVTQl9DSF9JUF9DVVJfTFZMXzBQNTsKLQkJZGktPmlzX2FjYV9yaWQgPSAxOwotCQlicmVhazsKLQljYXNlIFVTQl9TVEFUX0FDQV9SSURfQjoKLQkJLyoKLQkJICogRGVkaWNhdGVkIGNoYXJnZXIgbGV2ZWwgbWludXMgMTIwbUEgKDIwbUEgZm9yIEFDQSBhbmQKLQkJICogMTAwbUEgZm9yIHBvdGVudGlhbCBhY2Nlc3NvcnkpLiBDbG9zZXN0IGxldmVsIGlzIDEzMDBtQQotCQkgKi8KLQkJZGktPm1heF91c2JfaW5fY3Vyci51c2JfdHlwZV9tYXggPSBVU0JfQ0hfSVBfQ1VSX0xWTF8xUDM7Ci0JCWRldl9kYmcoZGktPmRldiwgIlVTQiBUeXBlIC0gMHglMDJ4IE1heEN1cnI6ICVkIiwgbGlua19zdGF0dXMsCi0JCQkJZGktPm1heF91c2JfaW5fY3Vyci51c2JfdHlwZV9tYXgpOwotCQlkaS0+aXNfYWNhX3JpZCA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgVVNCX1NUQVRfSE9TVF9DSEdfTk06Ci0JCWRpLT5tYXhfdXNiX2luX2N1cnIudXNiX3R5cGVfbWF4ID0gVVNCX0NIX0lQX0NVUl9MVkxfMFA1OwotCQlkaS0+aXNfYWNhX3JpZCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgVVNCX1NUQVRfREVESUNBVEVEX0NIRzoKLQkJZGktPm1heF91c2JfaW5fY3Vyci51c2JfdHlwZV9tYXggPSBVU0JfQ0hfSVBfQ1VSX0xWTF8xUDU7Ci0JCWRpLT5pc19hY2FfcmlkID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBVU0JfU1RBVF9BQ0FfUklEX0NfSFNfQ0hJUlA6Ci0JY2FzZSBVU0JfU1RBVF9BQ0FfUklEX0NfTk06Ci0JCWRpLT5tYXhfdXNiX2luX2N1cnIudXNiX3R5cGVfbWF4ID0gVVNCX0NIX0lQX0NVUl9MVkxfMVA1OwotCQlkaS0+aXNfYWNhX3JpZCA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgVVNCX1NUQVRfTk9UX0NPTkZJR1VSRUQ6Ci0JCWlmIChkaS0+dmJ1c19kZXRlY3RlZCkgewotCQkJZGktPnVzYl9kZXZpY2VfaXNfdW5yZWNvZ25pc2VkID0gdHJ1ZTsKLQkJCWRldl9kYmcoZGktPmRldiwgIlVTQiBUeXBlIC0gTGVnYWN5IGNoYXJnZXIuXG4iKTsKLQkJCWRpLT5tYXhfdXNiX2luX2N1cnIudXNiX3R5cGVfbWF4ID0KLQkJCQkJCVVTQl9DSF9JUF9DVVJfTFZMXzFQNTsKLQkJCWJyZWFrOwotCQl9Ci0JY2FzZSBVU0JfU1RBVF9ITV9JREdORDoKLQkJZGV2X2VycihkaS0+ZGV2LCAiVVNCIFR5cGUgLSBDaGFyZ2luZyBub3QgYWxsb3dlZFxuIik7Ci0JCWRpLT5tYXhfdXNiX2luX2N1cnIudXNiX3R5cGVfbWF4ID0gVVNCX0NIX0lQX0NVUl9MVkxfMFAwNTsKLQkJcmV0ID0gLUVOWElPOwotCQlicmVhazsKLQljYXNlIFVTQl9TVEFUX1JFU0VSVkVEOgotCQlpZiAoaXNfYWI4NTAwKGRpLT5wYXJlbnQpKSB7Ci0JCQlkaS0+ZmxhZ3MudmJ1c19jb2xsYXBzZSA9IHRydWU7Ci0JCQlkZXZfZXJyKGRpLT5kZXYsICJVU0IgVHlwZSAtIFVTQl9TVEFUX1JFU0VSVkVEICIKLQkJCQkJCSJWQlVTIGhhcyBjb2xsYXBzZWRcbiIpOwotCQkJcmV0ID0gLUVOWElPOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSB7Ci0JCQlkZXZfZGJnKGRpLT5kZXYsICJVU0IgVHlwZSAtIENoYXJnaW5nIG5vdCBhbGxvd2VkXG4iKTsKLQkJCWRpLT5tYXhfdXNiX2luX2N1cnIudXNiX3R5cGVfbWF4ID0KLQkJCQkJCVVTQl9DSF9JUF9DVVJfTFZMXzBQMDU7Ci0JCQlkZXZfZGJnKGRpLT5kZXYsICJVU0IgVHlwZSAtIDB4JTAyeCBNYXhDdXJyOiAlZCIsCi0JCQkJbGlua19zdGF0dXMsCi0JCQkJZGktPm1heF91c2JfaW5fY3Vyci51c2JfdHlwZV9tYXgpOwotCQkJcmV0ID0gLUVOWElPOwotCQkJYnJlYWs7Ci0JCX0KLQljYXNlIFVTQl9TVEFUX0NBUktJVF8xOgotCWNhc2UgVVNCX1NUQVRfQ0FSS0lUXzI6Ci0JY2FzZSBVU0JfU1RBVF9BQ0FfRE9DS19DSEFSR0VSOgotCWNhc2UgVVNCX1NUQVRfQ0hBUkdFUl9MSU5FXzE6Ci0JCWRpLT5tYXhfdXNiX2luX2N1cnIudXNiX3R5cGVfbWF4ID0gVVNCX0NIX0lQX0NVUl9MVkxfMFA1OwotCQlkZXZfZGJnKGRpLT5kZXYsICJVU0IgVHlwZSAtIDB4JTAyeCBNYXhDdXJyOiAlZCIsIGxpbmtfc3RhdHVzLAotCQkJCWRpLT5tYXhfdXNiX2luX2N1cnIudXNiX3R5cGVfbWF4KTsKLQkJYnJlYWs7Ci0JY2FzZSBVU0JfU1RBVF9OT1RfVkFMSURfTElOSzoKLQkJZGV2X2VycihkaS0+ZGV2LCAiVVNCIFR5cGUgaW52YWxpZCAtIHRyeSBjaGFyZ2luZyBhbnl3YXlcbiIpOwotCQlkaS0+bWF4X3VzYl9pbl9jdXJyLnVzYl90eXBlX21heCA9IFVTQl9DSF9JUF9DVVJfTFZMXzBQNTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlkZXZfZXJyKGRpLT5kZXYsICJVU0IgVHlwZSAtIFVua25vd25cbiIpOwotCQlkaS0+bWF4X3VzYl9pbl9jdXJyLnVzYl90eXBlX21heCA9IFVTQl9DSF9JUF9DVVJfTFZMXzBQMDU7Ci0JCXJldCA9IC1FTlhJTzsKLQkJYnJlYWs7Ci0JfTsKLQotCWRpLT5tYXhfdXNiX2luX2N1cnIuc2V0X21heCA9IGRpLT5tYXhfdXNiX2luX2N1cnIudXNiX3R5cGVfbWF4OwotCWRldl9kYmcoZGktPmRldiwgIlVTQiBUeXBlIC0gMHglMDJ4IE1heEN1cnI6ICVkIiwKLQkJbGlua19zdGF0dXMsIGRpLT5tYXhfdXNiX2luX2N1cnIuc2V0X21heCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIGFiODUwMF9jaGFyZ2VyX3JlYWRfdXNiX3R5cGUoKSAtIHJlYWQgdGhlIHR5cGUgb2YgdXNiIGNvbm5lY3RlZAotICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2NoYXJnZXIgc3RydWN0dXJlCi0gKgotICogRGV0ZWN0IHRoZSB0eXBlIG9mIHRoZSBwbHVnZ2VkIFVTQgotICogUmV0dXJucyBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZSBlbHNlIDAgb24gc3VjY2VzcwotICovCi1zdGF0aWMgaW50IGFiODUwMF9jaGFyZ2VyX3JlYWRfdXNiX3R5cGUoc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSkKLXsKLQlpbnQgcmV0OwotCXU4IHZhbDsKLQotCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAotCQlBQjg1MDBfSU5URVJSVVBULCBBQjg1MDBfSVRfU09VUkNFMjFfUkVHLCAmdmFsKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGRpLT5kZXYsICIlcyBhYjg1MDAgcmVhZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JaWYgKGlzX2FiODUwMChkaS0+cGFyZW50KSkKLQkJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9VU0IsCi0JCQlBQjg1MDBfVVNCX0xJTkVfU1RBVF9SRUcsICZ2YWwpOwotCWVsc2UKLQkJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCi0JCQlBQjg1MDBfVVNCLCBBQjg1MDBfVVNCX0xJTksxX1NUQVRfUkVHLCAmdmFsKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGRpLT5kZXYsICIlcyBhYjg1MDAgcmVhZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBnZXQgdGhlIFVTQiB0eXBlICovCi0JaWYgKGlzX2FiODUwMChkaS0+cGFyZW50KSkKLQkJdmFsID0gKHZhbCAmIEFCODUwMF9VU0JfTElOS19TVEFUVVMpID4+IFVTQl9MSU5LX1NUQVRVU19TSElGVDsKLQllbHNlCi0JCXZhbCA9ICh2YWwgJiBBQjg1MDVfVVNCX0xJTktfU1RBVFVTKSA+PiBVU0JfTElOS19TVEFUVVNfU0hJRlQ7Ci0JcmV0ID0gYWI4NTAwX2NoYXJnZXJfbWF4X3VzYl9jdXJyKGRpLAotCQkoZW51bSBhYjg1MDBfY2hhcmdlcl9saW5rX3N0YXR1cykgdmFsKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogYWI4NTAwX2NoYXJnZXJfZGV0ZWN0X3VzYl90eXBlKCkgLSBnZXQgdGhlIHR5cGUgb2YgdXNiIGNvbm5lY3RlZAotICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2NoYXJnZXIgc3RydWN0dXJlCi0gKgotICogRGV0ZWN0IHRoZSB0eXBlIG9mIHRoZSBwbHVnZ2VkIFVTQgotICogUmV0dXJucyBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZSBlbHNlIDAgb24gc3VjY2VzcwotICovCi1zdGF0aWMgaW50IGFiODUwMF9jaGFyZ2VyX2RldGVjdF91c2JfdHlwZShzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpKQotewotCWludCBpLCByZXQ7Ci0JdTggdmFsOwotCi0JLyoKLQkgKiBPbiBnZXR0aW5nIHRoZSBWQlVTIHJpc2luZyBlZGdlIGRldGVjdCBpbnRlcnJ1cHQgdGhlcmUKLQkgKiBpcyBhIDI1MG1zIGRlbGF5IGFmdGVyIHdoaWNoIHRoZSByZWdpc3RlciBVc2JMaW5lU3RhdHVzCi0JICogaXMgZmlsbGVkIHdpdGggdmFsaWQgZGF0YS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQltc2xlZXAoMjUwKTsKLQkJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCi0JCQlBQjg1MDBfSU5URVJSVVBULCBBQjg1MDBfSVRfU09VUkNFMjFfUkVHLAotCQkJJnZhbCk7Ci0JCWRldl9kYmcoZGktPmRldiwgIiVzIEFCODUwMF9JVF9TT1VSQ0UyMV9SRUcgJXhcbiIsCi0JCQlfX2Z1bmNfXywgdmFsKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoZGktPmRldiwgIiVzIGFiODUwMCByZWFkIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCWlmIChpc19hYjg1MDAoZGktPnBhcmVudCkpCi0JCQlyZXQgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKLQkJCQlBQjg1MDBfVVNCLCBBQjg1MDBfVVNCX0xJTkVfU1RBVF9SRUcsICZ2YWwpOwotCQllbHNlCi0JCQlyZXQgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKLQkJCQlBQjg1MDBfVVNCLCBBQjg1MDBfVVNCX0xJTksxX1NUQVRfUkVHLCAmdmFsKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoZGktPmRldiwgIiVzIGFiODUwMCByZWFkIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCQlkZXZfZGJnKGRpLT5kZXYsICIlcyBBQjg1MDBfVVNCX0xJTkVfU1RBVF9SRUcgJXhcbiIsIF9fZnVuY19fLAotCQkJdmFsKTsKLQkJLyoKLQkJICogVW50aWwgdGhlIElUIHNvdXJjZSByZWdpc3RlciBpcyByZWFkIHRoZSBVc2JMaW5lU3RhdHVzCi0JCSAqIHJlZ2lzdGVyIGlzIG5vdCB1cGRhdGVkLCBoZW5jZSBkb2luZyB0aGUgc2FtZQotCQkgKiBSZXZpc2l0IHRoaXM6Ci0JCSAqLwotCi0JCS8qIGdldCB0aGUgVVNCIHR5cGUgKi8KLQkJaWYgKGlzX2FiODUwMChkaS0+cGFyZW50KSkKLQkJCXZhbCA9ICh2YWwgJiBBQjg1MDBfVVNCX0xJTktfU1RBVFVTKSA+PgotCQkJCQkJCVVTQl9MSU5LX1NUQVRVU19TSElGVDsKLQkJZWxzZQotCQkJdmFsID0gKHZhbCAmIEFCODUwNV9VU0JfTElOS19TVEFUVVMpID4+Ci0JCQkJCQkJVVNCX0xJTktfU1RBVFVTX1NISUZUOwotCQlpZiAodmFsKQotCQkJYnJlYWs7Ci0JfQotCXJldCA9IGFiODUwMF9jaGFyZ2VyX21heF91c2JfY3VycihkaSwKLQkJKGVudW0gYWI4NTAwX2NoYXJnZXJfbGlua19zdGF0dXMpIHZhbCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogVGhpcyBhcnJheSBtYXBzIHRoZSByYXcgaGV4IHZhbHVlIHRvIGNoYXJnZXIgdm9sdGFnZSB1c2VkIGJ5IHRoZSBBQjg1MDAKLSAqIFZhbHVlcyB0YWtlbiBmcm9tIHRoZSBVTTA4MzYKLSAqLwotc3RhdGljIGludCBhYjg1MDBfY2hhcmdlcl92b2x0YWdlX21hcFtdID0gewotCTM1MDAgLAotCTM1MjUgLAotCTM1NTAgLAotCTM1NzUgLAotCTM2MDAgLAotCTM2MjUgLAotCTM2NTAgLAotCTM2NzUgLAotCTM3MDAgLAotCTM3MjUgLAotCTM3NTAgLAotCTM3NzUgLAotCTM4MDAgLAotCTM4MjUgLAotCTM4NTAgLAotCTM4NzUgLAotCTM5MDAgLAotCTM5MjUgLAotCTM5NTAgLAotCTM5NzUgLAotCTQwMDAgLAotCTQwMjUgLAotCTQwNTAgLAotCTQwNjAgLAotCTQwNzAgLAotCTQwODAgLAotCTQwOTAgLAotCTQxMDAgLAotCTQxMTAgLAotCTQxMjAgLAotCTQxMzAgLAotCTQxNDAgLAotCTQxNTAgLAotCTQxNjAgLAotCTQxNzAgLAotCTQxODAgLAotCTQxOTAgLAotCTQyMDAgLAotCTQyMTAgLAotCTQyMjAgLAotCTQyMzAgLAotCTQyNDAgLAotCTQyNTAgLAotCTQyNjAgLAotCTQyNzAgLAotCTQyODAgLAotCTQyOTAgLAotCTQzMDAgLAotCTQzMTAgLAotCTQzMjAgLAotCTQzMzAgLAotCTQzNDAgLAotCTQzNTAgLAotCTQzNjAgLAotCTQzNzAgLAotCTQzODAgLAotCTQzOTAgLAotCTQ0MDAgLAotCTQ0MTAgLAotCTQ0MjAgLAotCTQ0MzAgLAotCTQ0NDAgLAotCTQ0NTAgLAotCTQ0NjAgLAotCTQ0NzAgLAotCTQ0ODAgLAotCTQ0OTAgLAotCTQ1MDAgLAotCTQ1MTAgLAotCTQ1MjAgLAotCTQ1MzAgLAotCTQ1NDAgLAotCTQ1NTAgLAotCTQ1NjAgLAotCTQ1NzAgLAotCTQ1ODAgLAotCTQ1OTAgLAotCTQ2MDAgLAotfTsKLQotc3RhdGljIGludCBhYjg1MDBfdm9sdGFnZV90b19yZWd2YWwoaW50IHZvbHRhZ2UpCi17Ci0JaW50IGk7Ci0KLQkvKiBTcGVjaWFsIGNhc2UgZm9yIHZvbHRhZ2UgYmVsb3cgMy41ViAqLwotCWlmICh2b2x0YWdlIDwgYWI4NTAwX2NoYXJnZXJfdm9sdGFnZV9tYXBbMF0pCi0JCXJldHVybiBMT1dfVk9MVF9SRUc7Ci0KLQlmb3IgKGkgPSAxOyBpIDwgQVJSQVlfU0laRShhYjg1MDBfY2hhcmdlcl92b2x0YWdlX21hcCk7IGkrKykgewotCQlpZiAodm9sdGFnZSA8IGFiODUwMF9jaGFyZ2VyX3ZvbHRhZ2VfbWFwW2ldKQotCQkJcmV0dXJuIGkgLSAxOwotCX0KLQotCS8qIElmIG5vdCBsYXN0IGVsZW1lbnQsIHJldHVybiBlcnJvciAqLwotCWkgPSBBUlJBWV9TSVpFKGFiODUwMF9jaGFyZ2VyX3ZvbHRhZ2VfbWFwKSAtIDE7Ci0JaWYgKHZvbHRhZ2UgPT0gYWI4NTAwX2NoYXJnZXJfdm9sdGFnZV9tYXBbaV0pCi0JCXJldHVybiBpOwotCWVsc2UKLQkJcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50IGFiODUwMF9jdXJyZW50X3RvX3JlZ3ZhbChzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpLCBpbnQgY3VycikKLXsKLQlpbnQgaTsKLQotCWlmIChjdXJyIDwgZGktPmJtLT5jaGdfb3V0cHV0X2N1cnJbMF0pCi0JCXJldHVybiAwOwotCi0JZm9yIChpID0gMDsgaSA8IGRpLT5ibS0+bl9jaGdfb3V0X2N1cnI7IGkrKykgewotCQlpZiAoY3VyciA8IGRpLT5ibS0+Y2hnX291dHB1dF9jdXJyW2ldKQotCQkJcmV0dXJuIGkgLSAxOwotCX0KLQotCS8qIElmIG5vdCBsYXN0IGVsZW1lbnQsIHJldHVybiBlcnJvciAqLwotCWkgPSBkaS0+Ym0tPm5fY2hnX291dF9jdXJyIC0gMTsKLQlpZiAoY3VyciA9PSBkaS0+Ym0tPmNoZ19vdXRwdXRfY3VycltpXSkKLQkJcmV0dXJuIGk7Ci0JZWxzZQotCQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQgYWI4NTAwX3ZidXNfaW5fY3Vycl90b19yZWd2YWwoc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSwgaW50IGN1cnIpCi17Ci0JaW50IGk7Ci0KLQlpZiAoY3VyciA8IGRpLT5ibS0+Y2hnX2lucHV0X2N1cnJbMF0pCi0JCXJldHVybiAwOwotCi0JZm9yIChpID0gMDsgaSA8IGRpLT5ibS0+bl9jaGdfaW5fY3VycjsgaSsrKSB7Ci0JCWlmIChjdXJyIDwgZGktPmJtLT5jaGdfaW5wdXRfY3VycltpXSkKLQkJCXJldHVybiBpIC0gMTsKLQl9Ci0KLQkvKiBJZiBub3QgbGFzdCBlbGVtZW50LCByZXR1cm4gZXJyb3IgKi8KLQlpID0gZGktPmJtLT5uX2NoZ19pbl9jdXJyIC0gMTsKLQlpZiAoY3VyciA9PSBkaS0+Ym0tPmNoZ19pbnB1dF9jdXJyW2ldKQotCQlyZXR1cm4gaTsKLQllbHNlCi0JCXJldHVybiAtMTsKLX0KLQotLyoqCi0gKiBhYjg1MDBfY2hhcmdlcl9nZXRfdXNiX2N1cigpIC0gZ2V0IHVzYiBjdXJyZW50Ci0gKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfY2hhcmdlciBzdHJ1Y3RyZQotICoKLSAqIFRoZSB1c2Igc3RhY2sgcHJvdmlkZXMgdGhlIG1heGltdW0gY3VycmVudCB0aGF0IGNhbiBiZSBkcmF3biBmcm9tCi0gKiB0aGUgc3RhbmRhcmQgdXNiIGhvc3QuIFRoaXMgd2lsbCBiZSBpbiBtQS4KLSAqIFRoaXMgZnVuY3Rpb24gY29udmVydHMgY3VycmVudCBpbiBtQSB0byBhIHZhbHVlIHRoYXQgY2FuIGJlIHdyaXR0ZW4KLSAqIHRvIHRoZSByZWdpc3Rlci4gUmV0dXJucyAtMSBpZiBjaGFyZ2luZyBpcyBub3QgYWxsb3dlZAotICovCi1zdGF0aWMgaW50IGFiODUwMF9jaGFyZ2VyX2dldF91c2JfY3VyKHN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGkpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3dpdGNoIChkaS0+dXNiX3N0YXRlLnVzYl9jdXJyZW50KSB7Ci0JY2FzZSAxMDA6Ci0JCWRpLT5tYXhfdXNiX2luX2N1cnIudXNiX3R5cGVfbWF4ID0gVVNCX0NIX0lQX0NVUl9MVkxfMFAwOTsKLQkJYnJlYWs7Ci0JY2FzZSAyMDA6Ci0JCWRpLT5tYXhfdXNiX2luX2N1cnIudXNiX3R5cGVfbWF4ID0gVVNCX0NIX0lQX0NVUl9MVkxfMFAxOTsKLQkJYnJlYWs7Ci0JY2FzZSAzMDA6Ci0JCWRpLT5tYXhfdXNiX2luX2N1cnIudXNiX3R5cGVfbWF4ID0gVVNCX0NIX0lQX0NVUl9MVkxfMFAyOTsKLQkJYnJlYWs7Ci0JY2FzZSA0MDA6Ci0JCWRpLT5tYXhfdXNiX2luX2N1cnIudXNiX3R5cGVfbWF4ID0gVVNCX0NIX0lQX0NVUl9MVkxfMFAzODsKLQkJYnJlYWs7Ci0JY2FzZSA1MDA6Ci0JCWRpLT5tYXhfdXNiX2luX2N1cnIudXNiX3R5cGVfbWF4ID0gVVNCX0NIX0lQX0NVUl9MVkxfMFA1OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkaS0+bWF4X3VzYl9pbl9jdXJyLnVzYl90eXBlX21heCA9IFVTQl9DSF9JUF9DVVJfTFZMXzBQMDU7Ci0JCXJldCA9IC1FUEVSTTsKLQkJYnJlYWs7Ci0JfTsKLQlkaS0+bWF4X3VzYl9pbl9jdXJyLnNldF9tYXggPSBkaS0+bWF4X3VzYl9pbl9jdXJyLnVzYl90eXBlX21heDsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIGFiODUwMF9jaGFyZ2VyX2NoZWNrX2NvbnRpbnVlX3N0ZXBwaW5nKCkgLSBDaGVjayB0byBhbGxvdyBzdGVwcGluZwotICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2NoYXJnZXIgc3RydWN0dXJlCi0gKiBAcmVnOglzZWxlY3Qgd2hhdCBjaGFyZ2VyIHJlZ2lzdGVyIHRvIGNoZWNrCi0gKgotICogQ2hlY2sgaWYgY3VycmVudCBzdGVwcGluZyBzaG91bGQgYmUgYWxsb3dlZCB0byBjb250aW51ZS4KLSAqIENoZWNrcyBpZiBjaGFyZ2VyIHNvdXJjZSBoYXMgbm90IGNvbGxhcHNlZC4gSWYgaXQgaGFzLCBmdXJ0aGVyIHN0ZXBwaW5nCi0gKiBpcyBub3QgYWxsb3dlZC4KLSAqLwotc3RhdGljIGJvb2wgYWI4NTAwX2NoYXJnZXJfY2hlY2tfY29udGludWVfc3RlcHBpbmcoc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSwKLQkJCQkJCSAgIGludCByZWcpCi17Ci0JaWYgKHJlZyA9PSBBQjg1MDBfVVNCQ0hfSVBUX0NSTlRMVkxfUkVHKQotCQlyZXR1cm4gIWRpLT5mbGFncy52YnVzX2Ryb3BfZW5kOwotCWVsc2UKLQkJcmV0dXJuIHRydWU7Ci19Ci0KLS8qKgotICogYWI4NTAwX2NoYXJnZXJfc2V0X2N1cnJlbnQoKSAtIHNldCBjaGFyZ2VyIGN1cnJlbnQKLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9jaGFyZ2VyIHN0cnVjdHVyZQotICogQGljaDoJY2hhcmdlciBjdXJyZW50LCBpbiBtQQotICogQHJlZzoJc2VsZWN0IHdoYXQgY2hhcmdlciByZWdpc3RlciB0byBzZXQKLSAqCi0gKiBTZXQgY2hhcmdlciBjdXJyZW50LgotICogVGhlcmUgaXMgbm8gc3RhdGUgbWFjaGluZSBpbiB0aGUgQUIgdG8gc3RlcCB1cC9kb3duIHRoZSBjaGFyZ2VyCi0gKiBjdXJyZW50IHRvIGF2b2lkIGRpcHMgYW5kIHNwaWtlcyBvbiBNQUlOLCBWQlVTIGFuZCBWQkFUIHdoZW4KLSAqIGNoYXJnaW5nIGlzIHN0YXJ0ZWQuIEluc3RlYWQgd2UgbmVlZCB0byBpbXBsZW1lbnQKLSAqIHRoaXMgY2hhcmdlciBjdXJyZW50IHN0ZXAtdXAvZG93biBoZXJlLgotICogUmV0dXJucyBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZSBlbHNlIDAob24gc3VjY2VzcykKLSAqLwotc3RhdGljIGludCBhYjg1MDBfY2hhcmdlcl9zZXRfY3VycmVudChzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpLAotCWludCBpY2gsIGludCByZWcpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IGN1cnJfaW5kZXgsIHByZXZfY3Vycl9pbmRleCwgc2hpZnRfdmFsdWUsIGk7Ci0JdTggcmVnX3ZhbHVlOwotCXUzMiBzdGVwX3VkZWxheTsKLQlib29sIG5vX3N0ZXBwaW5nID0gZmFsc2U7Ci0KLQlhdG9taWNfaW5jKCZkaS0+Y3VycmVudF9zdGVwcGluZ19zZXNzaW9ucyk7Ci0KLQlyZXQgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX0NIQVJHRVIsCi0JCXJlZywgJnJlZ192YWx1ZSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgcmVhZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBleGl0X3NldF9jdXJyZW50OwotCX0KLQotCXN3aXRjaCAocmVnKSB7Ci0JY2FzZSBBQjg1MDBfTUNIX0lQVF9DVVJMVkxfUkVHOgotCQlzaGlmdF92YWx1ZSA9IE1BSU5fQ0hfSU5QVVRfQ1VSUl9TSElGVDsKLQkJcHJldl9jdXJyX2luZGV4ID0gKHJlZ192YWx1ZSA+PiBzaGlmdF92YWx1ZSk7Ci0JCWN1cnJfaW5kZXggPSBhYjg1MDBfY3VycmVudF90b19yZWd2YWwoZGksIGljaCk7Ci0JCXN0ZXBfdWRlbGF5ID0gU1RFUF9VREVMQVk7Ci0JCWlmICghZGktPmFjLmNoYXJnZXJfY29ubmVjdGVkKQotCQkJbm9fc3RlcHBpbmcgPSB0cnVlOwotCQlicmVhazsKLQljYXNlIEFCODUwMF9VU0JDSF9JUFRfQ1JOVExWTF9SRUc6Ci0JCWlmIChpc19hYjg1NDAoZGktPnBhcmVudCkpCi0JCQlzaGlmdF92YWx1ZSA9IEFCODU0MF9WQlVTX0lOX0NVUlJfTElNX1NISUZUOwotCQllbHNlCi0JCQlzaGlmdF92YWx1ZSA9IFZCVVNfSU5fQ1VSUl9MSU1fU0hJRlQ7Ci0JCXByZXZfY3Vycl9pbmRleCA9IChyZWdfdmFsdWUgPj4gc2hpZnRfdmFsdWUpOwotCQljdXJyX2luZGV4ID0gYWI4NTAwX3ZidXNfaW5fY3Vycl90b19yZWd2YWwoZGksIGljaCk7Ci0JCXN0ZXBfdWRlbGF5ID0gU1RFUF9VREVMQVkgKiAxMDA7Ci0KLQkJaWYgKCFkaS0+dXNiLmNoYXJnZXJfY29ubmVjdGVkKQotCQkJbm9fc3RlcHBpbmcgPSB0cnVlOwotCQlicmVhazsKLQljYXNlIEFCODUwMF9DSF9PUFRfQ1JOVExWTF9SRUc6Ci0JCXNoaWZ0X3ZhbHVlID0gMDsKLQkJcHJldl9jdXJyX2luZGV4ID0gKHJlZ192YWx1ZSA+PiBzaGlmdF92YWx1ZSk7Ci0JCWN1cnJfaW5kZXggPSBhYjg1MDBfY3VycmVudF90b19yZWd2YWwoZGksIGljaCk7Ci0JCXN0ZXBfdWRlbGF5ID0gU1RFUF9VREVMQVk7Ci0JCWlmIChjdXJyX2luZGV4ICYmIChjdXJyX2luZGV4IC0gcHJldl9jdXJyX2luZGV4KSA+IDEpCi0JCQlzdGVwX3VkZWxheSAqPSAxMDA7Ci0KLQkJaWYgKCFkaS0+dXNiLmNoYXJnZXJfY29ubmVjdGVkICYmICFkaS0+YWMuY2hhcmdlcl9jb25uZWN0ZWQpCi0JCQlub19zdGVwcGluZyA9IHRydWU7Ci0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgY3VycmVudCByZWdpc3RlciBub3QgdmFsaWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVOWElPOwotCQlnb3RvIGV4aXRfc2V0X2N1cnJlbnQ7Ci0JfQotCi0JaWYgKGN1cnJfaW5kZXggPCAwKSB7Ci0JCWRldl9lcnIoZGktPmRldiwgInJlcXVlc3RlZCBjdXJyZW50IGxpbWl0IG91dC1vZi1yYW5nZVxuIik7Ci0JCXJldCA9IC1FTlhJTzsKLQkJZ290byBleGl0X3NldF9jdXJyZW50OwotCX0KLQotCS8qIG9ubHkgdXBkYXRlIGN1cnJlbnQgaWYgaXQncyBiZWVuIGNoYW5nZWQgKi8KLQlpZiAocHJldl9jdXJyX2luZGV4ID09IGN1cnJfaW5kZXgpIHsKLQkJZGV2X2RiZyhkaS0+ZGV2LCAiJXMgY3VycmVudCBub3QgY2hhbmdlZCBmb3IgcmVnOiAweCUwMnhcbiIsCi0JCQlfX2Z1bmNfXywgcmVnKTsKLQkJcmV0ID0gMDsKLQkJZ290byBleGl0X3NldF9jdXJyZW50OwotCX0KLQotCWRldl9kYmcoZGktPmRldiwgIiVzIHNldCBjaGFyZ2VyIGN1cnJlbnQ6ICVkIG1BIGZvciByZWc6IDB4JTAyeFxuIiwKLQkJX19mdW5jX18sIGljaCwgcmVnKTsKLQotCWlmIChub19zdGVwcGluZykgewotCQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX0NIQVJHRVIsCi0JCQkJCXJlZywgKHU4KWN1cnJfaW5kZXggPDwgc2hpZnRfdmFsdWUpOwotCQlpZiAocmV0KQotCQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgd3JpdGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JfSBlbHNlIGlmIChwcmV2X2N1cnJfaW5kZXggPiBjdXJyX2luZGV4KSB7Ci0JCWZvciAoaSA9IHByZXZfY3Vycl9pbmRleCAtIDE7IGkgPj0gY3Vycl9pbmRleDsgaS0tKSB7Ci0JCQlkZXZfZGJnKGRpLT5kZXYsICJjdXJyIGNoYW5nZV8xIHRvOiAleCBmb3IgMHglMDJ4XG4iLAotCQkJCSh1OCkgaSA8PCBzaGlmdF92YWx1ZSwgcmVnKTsKLQkJCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAotCQkJCUFCODUwMF9DSEFSR0VSLCByZWcsICh1OClpIDw8IHNoaWZ0X3ZhbHVlKTsKLQkJCWlmIChyZXQpIHsKLQkJCQlkZXZfZXJyKGRpLT5kZXYsICIlcyB3cml0ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCQlnb3RvIGV4aXRfc2V0X2N1cnJlbnQ7Ci0JCQl9Ci0JCQlpZiAoaSAhPSBjdXJyX2luZGV4KQotCQkJCXVzbGVlcF9yYW5nZShzdGVwX3VkZWxheSwgc3RlcF91ZGVsYXkgKiAyKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWJvb2wgYWxsb3cgPSB0cnVlOwotCQlmb3IgKGkgPSBwcmV2X2N1cnJfaW5kZXggKyAxOyBpIDw9IGN1cnJfaW5kZXggJiYgYWxsb3c7IGkrKykgewotCQkJZGV2X2RiZyhkaS0+ZGV2LCAiY3VyciBjaGFuZ2VfMiB0bzogJXggZm9yIDB4JTAyeFxuIiwKLQkJCQkodTgpaSA8PCBzaGlmdF92YWx1ZSwgcmVnKTsKLQkJCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAotCQkJCUFCODUwMF9DSEFSR0VSLCByZWcsICh1OClpIDw8IHNoaWZ0X3ZhbHVlKTsKLQkJCWlmIChyZXQpIHsKLQkJCQlkZXZfZXJyKGRpLT5kZXYsICIlcyB3cml0ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCQlnb3RvIGV4aXRfc2V0X2N1cnJlbnQ7Ci0JCQl9Ci0JCQlpZiAoaSAhPSBjdXJyX2luZGV4KQotCQkJCXVzbGVlcF9yYW5nZShzdGVwX3VkZWxheSwgc3RlcF91ZGVsYXkgKiAyKTsKLQotCQkJYWxsb3cgPSBhYjg1MDBfY2hhcmdlcl9jaGVja19jb250aW51ZV9zdGVwcGluZyhkaSwgcmVnKTsKLQkJfQotCX0KLQotZXhpdF9zZXRfY3VycmVudDoKLQlhdG9taWNfZGVjKCZkaS0+Y3VycmVudF9zdGVwcGluZ19zZXNzaW9ucyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIGFiODUwMF9jaGFyZ2VyX3NldF92YnVzX2luX2N1cnIoKSAtIHNldCBWQlVTIGlucHV0IGN1cnJlbnQgbGltaXQKLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9jaGFyZ2VyIHN0cnVjdHVyZQotICogQGljaF9pbjoJY2hhcmdlciBpbnB1dCBjdXJyZW50IGxpbWl0Ci0gKgotICogU2V0cyB0aGUgY3VycmVudCB0aGF0IGNhbiBiZSBkcmF3biBmcm9tIHRoZSBVU0IgaG9zdAotICogUmV0dXJucyBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZSBlbHNlIDAob24gc3VjY2VzcykKLSAqLwotc3RhdGljIGludCBhYjg1MDBfY2hhcmdlcl9zZXRfdmJ1c19pbl9jdXJyKHN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGksCi0JCWludCBpY2hfaW4pCi17Ci0JaW50IG1pbl92YWx1ZTsKLQlpbnQgcmV0OwotCi0JLyogV2Ugc2hvdWxkIGFsd2F5cyB1c2UgdG8gbG93ZXN0IGN1cnJlbnQgbGltaXQgKi8KLQltaW5fdmFsdWUgPSBtaW4oZGktPmJtLT5jaGdfcGFyYW1zLT51c2JfY3Vycl9tYXgsIGljaF9pbik7Ci0JaWYgKGRpLT5tYXhfdXNiX2luX2N1cnIuc2V0X21heCA+IDApCi0JCW1pbl92YWx1ZSA9IG1pbihkaS0+bWF4X3VzYl9pbl9jdXJyLnNldF9tYXgsIG1pbl92YWx1ZSk7Ci0KLQlpZiAoZGktPnVzYl9zdGF0ZS51c2JfY3VycmVudCA+PSAwKQotCQltaW5fdmFsdWUgPSBtaW4oZGktPnVzYl9zdGF0ZS51c2JfY3VycmVudCwgbWluX3ZhbHVlKTsKLQotCXN3aXRjaCAobWluX3ZhbHVlKSB7Ci0JY2FzZSAxMDA6Ci0JCWlmIChkaS0+dmJhdCA8IFZCQVRfVFJFU0hfSVBfQ1VSX1JFRCkKLQkJCW1pbl92YWx1ZSA9IFVTQl9DSF9JUF9DVVJfTFZMXzBQMDU7Ci0JCWJyZWFrOwotCWNhc2UgNTAwOgotCQlpZiAoZGktPnZiYXQgPCBWQkFUX1RSRVNIX0lQX0NVUl9SRUQpCi0JCQltaW5fdmFsdWUgPSBVU0JfQ0hfSVBfQ1VSX0xWTF8wUDQ1OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlkZXZfaW5mbyhkaS0+ZGV2LCAiVkJVUyBpbnB1dCBjdXJyZW50IGxpbWl0IHNldCB0byAlZCBtQVxuIiwgbWluX3ZhbHVlKTsKLQotCW11dGV4X2xvY2soJmRpLT51c2JfaXB0X2NybnRfbG9jayk7Ci0JcmV0ID0gYWI4NTAwX2NoYXJnZXJfc2V0X2N1cnJlbnQoZGksIG1pbl92YWx1ZSwKLQkJQUI4NTAwX1VTQkNIX0lQVF9DUk5UTFZMX1JFRyk7Ci0JbXV0ZXhfdW5sb2NrKCZkaS0+dXNiX2lwdF9jcm50X2xvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBhYjg1MDBfY2hhcmdlcl9zZXRfbWFpbl9pbl9jdXJyKCkgLSBzZXQgbWFpbiBjaGFyZ2VyIGlucHV0IGN1cnJlbnQKLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9jaGFyZ2VyIHN0cnVjdHVyZQotICogQGljaF9pbjoJaW5wdXQgY2hhcmdlciBjdXJyZW50LCBpbiBtQQotICoKLSAqIFNldCBtYWluIGNoYXJnZXIgaW5wdXQgY3VycmVudC4KLSAqIFJldHVybnMgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUgZWxzZSAwKG9uIHN1Y2Nlc3MpCi0gKi8KLXN0YXRpYyBpbnQgYWI4NTAwX2NoYXJnZXJfc2V0X21haW5faW5fY3VycihzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpLAotCWludCBpY2hfaW4pCi17Ci0JcmV0dXJuIGFiODUwMF9jaGFyZ2VyX3NldF9jdXJyZW50KGRpLCBpY2hfaW4sCi0JCUFCODUwMF9NQ0hfSVBUX0NVUkxWTF9SRUcpOwotfQotCi0vKioKLSAqIGFiODUwMF9jaGFyZ2VyX3NldF9vdXRwdXRfY3VycigpIC0gc2V0IGNoYXJnZXIgb3V0cHV0IGN1cnJlbnQKLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9jaGFyZ2VyIHN0cnVjdHVyZQotICogQGljaF9vdXQ6CW91dHB1dCBjaGFyZ2VyIGN1cnJlbnQsIGluIG1BCi0gKgotICogU2V0IGNoYXJnZXIgb3V0cHV0IGN1cnJlbnQuCi0gKiBSZXR1cm5zIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlIGVsc2UgMChvbiBzdWNjZXNzKQotICovCi1zdGF0aWMgaW50IGFiODUwMF9jaGFyZ2VyX3NldF9vdXRwdXRfY3VycihzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpLAotCWludCBpY2hfb3V0KQotewotCXJldHVybiBhYjg1MDBfY2hhcmdlcl9zZXRfY3VycmVudChkaSwgaWNoX291dCwKLQkJQUI4NTAwX0NIX09QVF9DUk5UTFZMX1JFRyk7Ci19Ci0KLS8qKgotICogYWI4NTAwX2NoYXJnZXJfbGVkX2VuKCkgLSB0dXJuIG9uL29mZiBjaGFyZ2lnbiBsZWQKLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9jaGFyZ2VyIHN0cnVjdHVyZQotICogQG9uOgkJZmxhZyB0byB0dXJuIG9uL29mZiB0aGUgY2hhcmdpZ24gbGVkCi0gKgotICogUG93ZXIgT04vT0ZGIGNoYXJnaW5nIExFRCBpbmRpY2F0aW9uCi0gKiBSZXR1cm5zIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlIGVsc2UgMChvbiBzdWNjZXNzKQotICovCi1zdGF0aWMgaW50IGFiODUwMF9jaGFyZ2VyX2xlZF9lbihzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpLCBpbnQgb24pCi17Ci0JaW50IHJldDsKLQotCWlmIChvbikgewotCQkvKiBQb3dlciBPTiBjaGFyZ2luZyBMRUQgaW5kaWNhdG9yLCBzZXQgTEVEIGN1cnJlbnQgdG8gNW1BICovCi0JCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfQ0hBUkdFUiwKLQkJCUFCODUwMF9MRURfSU5ESUNBVE9SX1BXTV9DVFJMLAotCQkJKExFRF9JTkRfQ1VSXzVNQSB8IExFRF9JTkRJQ0FUT1JfUFdNX0VOQSkpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKGRpLT5kZXYsICJQb3dlciBPTiBMRUQgZmFpbGVkXG4iKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJLyogTEVEIGluZGljYXRvciBQV00gZHV0eSBjeWNsZSAyNTIvMjU2ICovCi0JCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfQ0hBUkdFUiwKLQkJCUFCODUwMF9MRURfSU5ESUNBVE9SX1BXTV9EVVRZLAotCQkJTEVEX0lORElDQVRPUl9QV01fRFVUWV8yNTJfMjU2KTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2VycihkaS0+ZGV2LCAiU2V0IExFRCBQV00gZHV0eSBjeWNsZSBmYWlsZWRcbiIpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIFBvd2VyIG9mZiBjaGFyZ2luZyBMRUQgaW5kaWNhdG9yICovCi0JCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfQ0hBUkdFUiwKLQkJCUFCODUwMF9MRURfSU5ESUNBVE9SX1BXTV9DVFJMLAotCQkJTEVEX0lORElDQVRPUl9QV01fRElTKTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2VycihkaS0+ZGV2LCAiUG93ZXItb2ZmIExFRCBmYWlsZWRcbiIpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogYWI4NTAwX2NoYXJnZXJfYWNfZW4oKSAtIGVuYWJsZSBvciBkaXNhYmxlIGFjIGNoYXJnaW5nCi0gKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfY2hhcmdlciBzdHJ1Y3R1cmUKLSAqIEBlbmFibGU6CWVuYWJsZS9kaXNhYmxlIGZsYWcKLSAqIEB2c2V0OgljaGFyZ2luZyB2b2x0YWdlCi0gKiBAaXNldDoJY2hhcmdpbmcgY3VycmVudAotICoKLSAqIEVuYWJsZS9EaXNhYmxlIEFDL01haW5zIGNoYXJnaW5nIGFuZCB0dXJucyBvbi9vZmYgdGhlIGNoYXJnaW5nIGxlZAotICogcmVzcGVjdGl2ZWx5LgotICoqLwotc3RhdGljIGludCBhYjg1MDBfY2hhcmdlcl9hY19lbihzdHJ1Y3QgdXg1MDBfY2hhcmdlciAqY2hhcmdlciwKLQlpbnQgZW5hYmxlLCBpbnQgdnNldCwgaW50IGlzZXQpCi17Ci0JaW50IHJldDsKLQlpbnQgdm9sdF9pbmRleDsKLQlpbnQgY3Vycl9pbmRleDsKLQlpbnQgaW5wdXRfY3Vycl9pbmRleDsKLQl1OCBvdmVyc2hvb3QgPSAwOwotCi0Jc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IHRvX2FiODUwMF9jaGFyZ2VyX2FjX2RldmljZV9pbmZvKGNoYXJnZXIpOwotCi0JaWYgKGVuYWJsZSkgewotCQkvKiBDaGVjayBpZiBBQyBpcyBjb25uZWN0ZWQgKi8KLQkJaWYgKCFkaS0+YWMuY2hhcmdlcl9jb25uZWN0ZWQpIHsKLQkJCWRldl9lcnIoZGktPmRldiwgIkFDIGNoYXJnZXIgbm90IGNvbm5lY3RlZFxuIik7Ci0JCQlyZXR1cm4gLUVOWElPOwotCQl9Ci0KLQkJLyogRW5hYmxlIEFDIGNoYXJnaW5nICovCi0JCWRldl9kYmcoZGktPmRldiwgIkVuYWJsZSBBQzogJWRtViAlZG1BXG4iLCB2c2V0LCBpc2V0KTsKLQotCQkvKgotCQkgKiBEdWUgdG8gYSBidWcgaW4gQUI4NTAwLCBCVEVNUF9ISUdIL0xPVyBpbnRlcnJ1cHRzCi0JCSAqIHdpbGwgYmUgdHJpZ2dlcmVkIGV2ZXJ5dGltZSB3ZSBlbmFibGUgdGhlIFZERCBBREMgc3VwcGx5LgotCQkgKiBUaGlzIHdpbGwgdHVybiBvZmYgY2hhcmdpbmcgZm9yIGEgc2hvcnQgd2hpbGUuCi0JCSAqIEl0IGNhbiBiZSBhdm9pZGVkIGJ5IGhhdmluZyB0aGUgc3VwcGx5IG9uIHdoZW4KLQkJICogdGhlcmUgaXMgYSBjaGFyZ2VyIGVuYWJsZWQuIE5vcm1hbGx5IHRoZSBWREQgQURDIHN1cHBseQotCQkgKiBpcyBlbmFibGVkIGV2ZXJ5dGltZSBhIEdQQURDIGNvbnZlcnNpb24gaXMgdHJpZ2dlcmVkLiBXZSB3aWxsCi0JCSAqIGZvcmNlIGl0IHRvIGJlIGVuYWJsZWQgZnJvbSB0aGlzIGRyaXZlciB0byBoYXZlCi0JCSAqIHRoZSBHUEFEQyBtb2R1bGUgaW5kZXBlbmRhbnQgb2YgdGhlIEFCODUwMCBjaGFyZ2VycwotCQkgKi8KLQkJaWYgKCFkaS0+dmRkYWRjX2VuX2FjKSB7Ci0JCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKGRpLT5yZWd1KTsKLQkJCWlmIChyZXQpCi0JCQkJZGV2X3dhcm4oZGktPmRldiwKLQkJCQkJIkZhaWxlZCB0byBlbmFibGUgcmVndWxhdG9yXG4iKTsKLQkJCWVsc2UKLQkJCQlkaS0+dmRkYWRjX2VuX2FjID0gdHJ1ZTsKLQkJfQotCi0JCS8qIENoZWNrIGlmIHRoZSByZXF1ZXN0ZWQgdm9sdGFnZSBvciBjdXJyZW50IGlzIHZhbGlkICovCi0JCXZvbHRfaW5kZXggPSBhYjg1MDBfdm9sdGFnZV90b19yZWd2YWwodnNldCk7Ci0JCWN1cnJfaW5kZXggPSBhYjg1MDBfY3VycmVudF90b19yZWd2YWwoZGksIGlzZXQpOwotCQlpbnB1dF9jdXJyX2luZGV4ID0gYWI4NTAwX2N1cnJlbnRfdG9fcmVndmFsKGRpLAotCQkJZGktPmJtLT5jaGdfcGFyYW1zLT5hY19jdXJyX21heCk7Ci0JCWlmICh2b2x0X2luZGV4IDwgMCB8fCBjdXJyX2luZGV4IDwgMCB8fCBpbnB1dF9jdXJyX2luZGV4IDwgMCkgewotCQkJZGV2X2VycihkaS0+ZGV2LAotCQkJCSJDaGFyZ2VyIHZvbHRhZ2Ugb3IgY3VycmVudCB0b28gaGlnaCwgIgotCQkJCSJjaGFyZ2luZyBub3Qgc3RhcnRlZFxuIik7Ci0JCQlyZXR1cm4gLUVOWElPOwotCQl9Ci0KLQkJLyogQ2hWb2x0TGV2ZWw6IG1heGltdW0gYmF0dGVyeSBjaGFyZ2luZyB2b2x0YWdlICovCi0JCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfQ0hBUkdFUiwKLQkJCUFCODUwMF9DSF9WT0xUX0xWTF9SRUcsICh1OCkgdm9sdF9pbmRleCk7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoZGktPmRldiwgIiVzIHdyaXRlIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCQkvKiBNYWluQ2hJbnB1dEN1cnI6IGN1cnJlbnQgdGhhdCBjYW4gYmUgZHJhd24gZnJvbSB0aGUgY2hhcmdlciovCi0JCXJldCA9IGFiODUwMF9jaGFyZ2VyX3NldF9tYWluX2luX2N1cnIoZGksCi0JCQlkaS0+Ym0tPmNoZ19wYXJhbXMtPmFjX2N1cnJfbWF4KTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgRmFpbGVkIHRvIHNldCBNYWluQ2hJbnB1dEN1cnJcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCQkvKiBDaE91dHB1dEN1cmVudExldmVsOiBwcm90ZWN0ZWQgb3V0cHV0IGN1cnJlbnQgKi8KLQkJcmV0ID0gYWI4NTAwX2NoYXJnZXJfc2V0X291dHB1dF9jdXJyKGRpLCBpc2V0KTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgIgotCQkJCSJGYWlsZWQgdG8gc2V0IENoT3V0cHV0Q3VyZW50TGV2ZWxcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCS8qIENoZWNrIGlmIFZCQVQgb3ZlcnNob290IGNvbnRyb2wgc2hvdWxkIGJlIGVuYWJsZWQgKi8KLQkJaWYgKCFkaS0+Ym0tPmVuYWJsZV9vdmVyc2hvb3QpCi0JCQlvdmVyc2hvb3QgPSBNQUlOX0NIX05PX09WRVJTSE9PVF9FTkFfTjsKLQotCQkvKiBFbmFibGUgTWFpbiBDaGFyZ2VyICovCi0JCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfQ0hBUkdFUiwKLQkJCUFCODUwMF9NQ0hfQ1RSTDEsIE1BSU5fQ0hfRU5BIHwgb3ZlcnNob290KTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgd3JpdGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJLyogUG93ZXIgb24gY2hhcmdpbmcgTEVEIGluZGljYXRpb24gKi8KLQkJcmV0ID0gYWI4NTAwX2NoYXJnZXJfbGVkX2VuKGRpLCB0cnVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIExFRFxuIik7Ci0KLQkJZGktPmFjLmNoYXJnZXJfb25saW5lID0gMTsKLQl9IGVsc2UgewotCQkvKiBEaXNhYmxlIEFDIGNoYXJnaW5nICovCi0JCWlmIChpc19hYjg1MDBfMXAxX29yX2VhcmxpZXIoZGktPnBhcmVudCkpIHsKLQkJCS8qCi0JCQkgKiBGb3IgQUJCIHJldmlzaW9uIDEuMCBhbmQgMS4xIHRoZXJlIGlzIGEgYnVnIGluIHRoZQotCQkJICogd2F0Y2hkb2cgbG9naWMuIFRoYXQgbWVhbnMgd2UgaGF2ZSB0byBjb250aW5vdXNseQotCQkJICoga2ljayB0aGUgY2hhcmdlciB3YXRjaGRvZyBldmVuIHdoZW4gbm8gY2hhcmdlciBpcwotCQkJICogY29ubmVjdGVkLiBUaGlzIGlzIG9ubHkgdmFsaWQgb25jZSB0aGUgQUMgY2hhcmdlcgotCQkJICogaGFzIGJlZW4gZW5hYmxlZC4gVGhpcyBpcyBhIGJ1ZyB0aGF0IGlzIG5vdCBoYW5kbGVkCi0JCQkgKiBieSB0aGUgYWxnb3JpdGhtIGFuZCB0aGUgd2F0Y2hkb2cgaGF2ZSB0byBiZSBraWNrZWQKLQkJCSAqIGJ5IHRoZSBjaGFyZ2VyIGRyaXZlciB3aGVuIHRoZSBBQyBjaGFyZ2VyCi0JCQkgKiBpcyBkaXNhYmxlZAotCQkJICovCi0JCQlpZiAoZGktPmFjX2Nvbm4pIHsKLQkJCQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmNoYXJnZXJfd3EsCi0JCQkJCSZkaS0+a2lja193ZF93b3JrLAotCQkJCQlyb3VuZF9qaWZmaWVzKFdEX0tJQ0tfSU5URVJWQUwpKTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIFdlIGNhbid0IHR1cm4gb2ZmIGNoYXJnaW5nIGNvbXBsZXRlbHkKLQkJCSAqIGR1ZSB0byBhIGJ1ZyBpbiBBQjg1MDAgY3V0MS4KLQkJCSAqIElmIHdlIGRvLCBjaGFyZ2luZyB3aWxsIG5vdCBzdGFydCBhZ2Fpbi4KLQkJCSAqIFRoYXQgaXMgd2h5IHdlIHNldCB0aGUgbG93ZXN0IHZvbHRhZ2UKLQkJCSAqIGFuZCBjdXJyZW50IHBvc3NpYmxlCi0JCQkgKi8KLQkJCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAotCQkJCUFCODUwMF9DSEFSR0VSLAotCQkJCUFCODUwMF9DSF9WT0xUX0xWTF9SRUcsIENIX1ZPTF9MVkxfM1A1KTsKLQkJCWlmIChyZXQpIHsKLQkJCQlkZXZfZXJyKGRpLT5kZXYsCi0JCQkJCSIlcyB3cml0ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCi0JCQlyZXQgPSBhYjg1MDBfY2hhcmdlcl9zZXRfb3V0cHV0X2N1cnIoZGksIDApOwotCQkJaWYgKHJldCkgewotCQkJCWRldl9lcnIoZGktPmRldiwgIiVzICIKLQkJCQkJIkZhaWxlZCB0byBzZXQgQ2hPdXRwdXRDdXJlbnRMZXZlbFxuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKLQkJCQlBQjg1MDBfQ0hBUkdFUiwKLQkJCQlBQjg1MDBfTUNIX0NUUkwxLCAwKTsKLQkJCWlmIChyZXQpIHsKLQkJCQlkZXZfZXJyKGRpLT5kZXYsCi0JCQkJCSIlcyB3cml0ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCQl9Ci0KLQkJcmV0ID0gYWI4NTAwX2NoYXJnZXJfbGVkX2VuKGRpLCBmYWxzZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIGRpc2FibGUgTEVEXG4iKTsKLQotCQlkaS0+YWMuY2hhcmdlcl9vbmxpbmUgPSAwOwotCQlkaS0+YWMud2RfZXhwaXJlZCA9IGZhbHNlOwotCi0JCS8qIERpc2FibGUgcmVndWxhdG9yIGlmIGVuYWJsZWQgKi8KLQkJaWYgKGRpLT52ZGRhZGNfZW5fYWMpIHsKLQkJCXJlZ3VsYXRvcl9kaXNhYmxlKGRpLT5yZWd1KTsKLQkJCWRpLT52ZGRhZGNfZW5fYWMgPSBmYWxzZTsKLQkJfQotCi0JCWRldl9kYmcoZGktPmRldiwgIiVzIERpc2FibGVkIEFDIGNoYXJnaW5nXG4iLCBfX2Z1bmNfXyk7Ci0JfQotCWFiODUwMF9wb3dlcl9zdXBwbHlfY2hhbmdlZChkaSwgZGktPmFjX2NoZy5wc3kpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBhYjg1MDBfY2hhcmdlcl91c2JfZW4oKSAtIGVuYWJsZSB1c2IgY2hhcmdpbmcKLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9jaGFyZ2VyIHN0cnVjdHVyZQotICogQGVuYWJsZToJZW5hYmxlL2Rpc2FibGUgZmxhZwotICogQHZzZXQ6CWNoYXJnaW5nIHZvbHRhZ2UKLSAqIEBpY2hfb3V0OgljaGFyZ2VyIG91dHB1dCBjdXJyZW50Ci0gKgotICogRW5hYmxlL0Rpc2FibGUgVVNCIGNoYXJnaW5nIGFuZCB0dXJucyBvbi9vZmYgdGhlIGNoYXJnaW5nIGxlZCByZXNwZWN0aXZlbHkuCi0gKiBSZXR1cm5zIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlIGVsc2UgMChvbiBzdWNjZXNzKQotICovCi1zdGF0aWMgaW50IGFiODUwMF9jaGFyZ2VyX3VzYl9lbihzdHJ1Y3QgdXg1MDBfY2hhcmdlciAqY2hhcmdlciwKLQlpbnQgZW5hYmxlLCBpbnQgdnNldCwgaW50IGljaF9vdXQpCi17Ci0JaW50IHJldDsKLQlpbnQgdm9sdF9pbmRleDsKLQlpbnQgY3Vycl9pbmRleDsKLQl1OCBvdmVyc2hvb3QgPSAwOwotCi0Jc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IHRvX2FiODUwMF9jaGFyZ2VyX3VzYl9kZXZpY2VfaW5mbyhjaGFyZ2VyKTsKLQotCWlmIChlbmFibGUpIHsKLQkJLyogQ2hlY2sgaWYgVVNCIGlzIGNvbm5lY3RlZCAqLwotCQlpZiAoIWRpLT51c2IuY2hhcmdlcl9jb25uZWN0ZWQpIHsKLQkJCWRldl9lcnIoZGktPmRldiwgIlVTQiBjaGFyZ2VyIG5vdCBjb25uZWN0ZWRcbiIpOwotCQkJcmV0dXJuIC1FTlhJTzsKLQkJfQotCi0JCS8qCi0JCSAqIER1ZSB0byBhIGJ1ZyBpbiBBQjg1MDAsIEJURU1QX0hJR0gvTE9XIGludGVycnVwdHMKLQkJICogd2lsbCBiZSB0cmlnZ2VyZWQgZXZlcnl0aW1lIHdlIGVuYWJsZSB0aGUgVkREIEFEQyBzdXBwbHkuCi0JCSAqIFRoaXMgd2lsbCB0dXJuIG9mZiBjaGFyZ2luZyBmb3IgYSBzaG9ydCB3aGlsZS4KLQkJICogSXQgY2FuIGJlIGF2b2lkZWQgYnkgaGF2aW5nIHRoZSBzdXBwbHkgb24gd2hlbgotCQkgKiB0aGVyZSBpcyBhIGNoYXJnZXIgZW5hYmxlZC4gTm9ybWFsbHkgdGhlIFZERCBBREMgc3VwcGx5Ci0JCSAqIGlzIGVuYWJsZWQgZXZlcnl0aW1lIGEgR1BBREMgY29udmVyc2lvbiBpcyB0cmlnZ2VyZWQuIFdlIHdpbGwKLQkJICogZm9yY2UgaXQgdG8gYmUgZW5hYmxlZCBmcm9tIHRoaXMgZHJpdmVyIHRvIGhhdmUKLQkJICogdGhlIEdQQURDIG1vZHVsZSBpbmRlcGVuZGFudCBvZiB0aGUgQUI4NTAwIGNoYXJnZXJzCi0JCSAqLwotCQlpZiAoIWRpLT52ZGRhZGNfZW5fdXNiKSB7Ci0JCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKGRpLT5yZWd1KTsKLQkJCWlmIChyZXQpCi0JCQkJZGV2X3dhcm4oZGktPmRldiwKLQkJCQkJIkZhaWxlZCB0byBlbmFibGUgcmVndWxhdG9yXG4iKTsKLQkJCWVsc2UKLQkJCQlkaS0+dmRkYWRjX2VuX3VzYiA9IHRydWU7Ci0JCX0KLQotCQkvKiBFbmFibGUgVVNCIGNoYXJnaW5nICovCi0JCWRldl9kYmcoZGktPmRldiwgIkVuYWJsZSBVU0I6ICVkbVYgJWRtQVxuIiwgdnNldCwgaWNoX291dCk7Ci0KLQkJLyogQ2hlY2sgaWYgdGhlIHJlcXVlc3RlZCB2b2x0YWdlIG9yIGN1cnJlbnQgaXMgdmFsaWQgKi8KLQkJdm9sdF9pbmRleCA9IGFiODUwMF92b2x0YWdlX3RvX3JlZ3ZhbCh2c2V0KTsKLQkJY3Vycl9pbmRleCA9IGFiODUwMF9jdXJyZW50X3RvX3JlZ3ZhbChkaSwgaWNoX291dCk7Ci0JCWlmICh2b2x0X2luZGV4IDwgMCB8fCBjdXJyX2luZGV4IDwgMCkgewotCQkJZGV2X2VycihkaS0+ZGV2LAotCQkJCSJDaGFyZ2VyIHZvbHRhZ2Ugb3IgY3VycmVudCB0b28gaGlnaCwgIgotCQkJCSJjaGFyZ2luZyBub3Qgc3RhcnRlZFxuIik7Ci0JCQlyZXR1cm4gLUVOWElPOwotCQl9Ci0KLQkJLyogQ2hWb2x0TGV2ZWw6IG1heCB2b2x0YWdlIHVwdG8gd2hpY2ggYmF0dGVyeSBjYW4gYmUgY2hhcmdlZCAqLwotCQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX0NIQVJHRVIsCi0JCQlBQjg1MDBfQ0hfVk9MVF9MVkxfUkVHLCAodTgpIHZvbHRfaW5kZXgpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKGRpLT5kZXYsICIlcyB3cml0ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJLyogQ2hlY2sgaWYgVkJBVCBvdmVyc2hvb3QgY29udHJvbCBzaG91bGQgYmUgZW5hYmxlZCAqLwotCQlpZiAoIWRpLT5ibS0+ZW5hYmxlX292ZXJzaG9vdCkKLQkJCW92ZXJzaG9vdCA9IFVTQl9DSEdfTk9fT1ZFUlNIT09UX0VOQV9OOwotCi0JCS8qIEVuYWJsZSBVU0IgQ2hhcmdlciAqLwotCQlkZXZfZGJnKGRpLT5kZXYsCi0JCQkiRW5hYmxpbmcgVVNCIHdpdGggd3JpdGUgdG8gQUI4NTAwX1VTQkNIX0NUUkwxX1JFR1xuIik7Ci0JCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfQ0hBUkdFUiwKLQkJCUFCODUwMF9VU0JDSF9DVFJMMV9SRUcsIFVTQl9DSF9FTkEgfCBvdmVyc2hvb3QpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKGRpLT5kZXYsICIlcyB3cml0ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQotCQkvKiBJZiBzdWNjZXNzIHBvd2VyIG9uIGNoYXJnaW5nIExFRCBpbmRpY2F0aW9uICovCi0JCXJldCA9IGFiODUwMF9jaGFyZ2VyX2xlZF9lbihkaSwgdHJ1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBMRURcbiIpOwotCi0JCWRpLT51c2IuY2hhcmdlcl9vbmxpbmUgPSAxOwotCi0JCS8qIFVTQkNoSW5wdXRDdXJyOiBjdXJyZW50IHRoYXQgY2FuIGJlIGRyYXduIGZyb20gdGhlIHVzYiAqLwotCQlyZXQgPSBhYjg1MDBfY2hhcmdlcl9zZXRfdmJ1c19pbl9jdXJyKGRpLAotCQkJCQlkaS0+bWF4X3VzYl9pbl9jdXJyLnVzYl90eXBlX21heCk7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoZGktPmRldiwgInNldHRpbmcgVVNCQ2hJbnB1dEN1cnIgZmFpbGVkXG4iKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQotCQkvKiBDaE91dHB1dEN1cmVudExldmVsOiBwcm90ZWN0ZWQgb3V0cHV0IGN1cnJlbnQgKi8KLQkJcmV0ID0gYWI4NTAwX2NoYXJnZXJfc2V0X291dHB1dF9jdXJyKGRpLCBpY2hfb3V0KTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgIgotCQkJCSJGYWlsZWQgdG8gc2V0IENoT3V0cHV0Q3VyZW50TGV2ZWxcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Y2hhcmdlcl93cSwgJmRpLT5jaGVja192YmF0X3dvcmssIEhaKTsKLQotCX0gZWxzZSB7Ci0JCS8qIERpc2FibGUgVVNCIGNoYXJnaW5nICovCi0JCWRldl9kYmcoZGktPmRldiwgIiVzIERpc2FibGVkIFVTQiBjaGFyZ2luZ1xuIiwgX19mdW5jX18pOwotCQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKLQkJCUFCODUwMF9DSEFSR0VSLAotCQkJQUI4NTAwX1VTQkNIX0NUUkwxX1JFRywgMCk7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoZGktPmRldiwKLQkJCQkiJXMgd3JpdGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJcmV0ID0gYWI4NTAwX2NoYXJnZXJfbGVkX2VuKGRpLCBmYWxzZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIGRpc2FibGUgTEVEXG4iKTsKLQkJLyogVVNCQ2hJbnB1dEN1cnI6IGN1cnJlbnQgdGhhdCBjYW4gYmUgZHJhd24gZnJvbSB0aGUgdXNiICovCi0JCXJldCA9IGFiODUwMF9jaGFyZ2VyX3NldF92YnVzX2luX2N1cnIoZGksIDApOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKGRpLT5kZXYsICJzZXR0aW5nIFVTQkNoSW5wdXRDdXJyIGZhaWxlZFxuIik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJLyogQ2hPdXRwdXRDdXJlbnRMZXZlbDogcHJvdGVjdGVkIG91dHB1dCBjdXJyZW50ICovCi0JCXJldCA9IGFiODUwMF9jaGFyZ2VyX3NldF9vdXRwdXRfY3VycihkaSwgMCk7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoZGktPmRldiwgIiVzICIKLQkJCQkiRmFpbGVkIHRvIHJlc2V0IENoT3V0cHV0Q3VyZW50TGV2ZWxcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCQlkaS0+dXNiLmNoYXJnZXJfb25saW5lID0gMDsKLQkJZGktPnVzYi53ZF9leHBpcmVkID0gZmFsc2U7Ci0KLQkJLyogRGlzYWJsZSByZWd1bGF0b3IgaWYgZW5hYmxlZCAqLwotCQlpZiAoZGktPnZkZGFkY19lbl91c2IpIHsKLQkJCXJlZ3VsYXRvcl9kaXNhYmxlKGRpLT5yZWd1KTsKLQkJCWRpLT52ZGRhZGNfZW5fdXNiID0gZmFsc2U7Ci0JCX0KLQotCQlkZXZfZGJnKGRpLT5kZXYsICIlcyBEaXNhYmxlZCBVU0IgY2hhcmdpbmdcbiIsIF9fZnVuY19fKTsKLQotCQkvKiBDYW5jZWwgYW55IHBlbmRpbmcgVmJhdCBjaGVjayB3b3JrICovCi0JCWNhbmNlbF9kZWxheWVkX3dvcmsoJmRpLT5jaGVja192YmF0X3dvcmspOwotCi0JfQotCWFiODUwMF9wb3dlcl9zdXBwbHlfY2hhbmdlZChkaSwgZGktPnVzYl9jaGcucHN5KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYWI4NTAwX2V4dGVybmFsX2NoYXJnZXJfcHJlcGFyZShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKmNoYXJnZXJfbmIsCi0JCQkJdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqZGF0YSkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGRhdGE7Ci0JLypUb2dnbGUgRXh0ZXJuYWwgY2hhcmdlciBjb250cm9sIHBpbiovCi0JcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRldiwgQUI4NTAwX1NZU19DVFJMMV9CTE9DSywKLQkJCQkgIEFCODUwMF9TWVNfQ0hBUkdFUl9DT05UUk9MX1JFRywKLQkJCQkgIEVYVEVSTkFMX0NIQVJHRVJfRElTQUJMRV9SRUdfVkFMKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGRldiwgIndyaXRlIHJlZyBmYWlsZWQgJWRcbiIsIHJldCk7Ci0JCWdvdG8gb3V0OwotCX0KLQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGV2LCBBQjg1MDBfU1lTX0NUUkwxX0JMT0NLLAotCQkJCSAgQUI4NTAwX1NZU19DSEFSR0VSX0NPTlRST0xfUkVHLAotCQkJCSAgRVhURVJOQUxfQ0hBUkdFUl9FTkFCTEVfUkVHX1ZBTCk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIoZGV2LCAiV3JpdGUgcmVnIGZhaWxlZCAlZFxuIiwgcmV0KTsKLQotb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogYWI4NTAwX2NoYXJnZXJfdXNiX2NoZWNrX2VuYWJsZSgpIC0gZW5hYmxlIHVzYiBjaGFyZ2luZwotICogQGNoYXJnZXI6CXBvaW50ZXIgdG8gdGhlIHV4NTAwX2NoYXJnZXIgc3RydWN0dXJlCi0gKiBAdnNldDoJY2hhcmdpbmcgdm9sdGFnZQotICogQGlzZXQ6CWNoYXJnZXIgb3V0cHV0IGN1cnJlbnQKLSAqCi0gKiBDaGVjayBpZiB0aGUgVkJVUyBjaGFyZ2VyIGhhcyBiZWVuIGRpc2Nvbm5lY3RlZCBhbmQgcmVjb25uZWN0ZWQgd2l0aG91dAotICogQUI4NTAwIHJpc2luZyBhbiBpbnRlcnJ1cHQuIFJldHVybnMgMCBvbiBzdWNjZXNzLgotICovCi1zdGF0aWMgaW50IGFiODUwMF9jaGFyZ2VyX3VzYl9jaGVja19lbmFibGUoc3RydWN0IHV4NTAwX2NoYXJnZXIgKmNoYXJnZXIsCi0JaW50IHZzZXQsIGludCBpc2V0KQotewotCXU4IHVzYmNoX2N0cmwxID0gMDsKLQlpbnQgcmV0ID0gMDsKLQotCXN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGkgPSB0b19hYjg1MDBfY2hhcmdlcl91c2JfZGV2aWNlX2luZm8oY2hhcmdlcik7Ci0KLQlpZiAoIWRpLT51c2IuY2hhcmdlcl9jb25uZWN0ZWQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX0NIQVJHRVIsCi0JCQkJQUI4NTAwX1VTQkNIX0NUUkwxX1JFRywgJnVzYmNoX2N0cmwxKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGRpLT5kZXYsICJhYjg1MDAgcmVhZCBmYWlsZWQgJWRcbiIsIF9fTElORV9fKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JZGV2X2RiZyhkaS0+ZGV2LCAiVVNCIGNoYXJnZXIgY3RybDogMHglMDJ4XG4iLCB1c2JjaF9jdHJsMSk7Ci0KLQlpZiAoISh1c2JjaF9jdHJsMSAmIFVTQl9DSF9FTkEpKSB7Ci0JCWRldl9pbmZvKGRpLT5kZXYsICJDaGFyZ2luZyBoYXMgYmVlbiBkaXNhYmxlZCBhYm5vcm1hbGx5IGFuZCB3aWxsIGJlIHJlLWVuYWJsZWRcbiIpOwotCi0JCXJldCA9IGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAotCQkJCQlBQjg1MDBfQ0hBUkdFUiwgQUI4NTAwX0NIQVJHRVJfQ1RSTCwKLQkJCQkJRFJPUF9DT1VOVF9SRVNFVCwgRFJPUF9DT1VOVF9SRVNFVCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKGRpLT5kZXYsICJhYjg1MDAgd3JpdGUgZmFpbGVkICVkXG4iLCBfX0xJTkVfXyk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJcmV0ID0gYWI4NTAwX2NoYXJnZXJfdXNiX2VuKCZkaS0+dXNiX2NoZywgdHJ1ZSwgdnNldCwgaXNldCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKGRpLT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIFZCVVMgY2hhcmdlciAlZFxuIiwKLQkJCQkJX19MSU5FX18pOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIGFiODUwMF9jaGFyZ2VyX2FjX2NoZWNrX2VuYWJsZSgpIC0gZW5hYmxlIHVzYiBjaGFyZ2luZwotICogQGNoYXJnZXI6CXBvaW50ZXIgdG8gdGhlIHV4NTAwX2NoYXJnZXIgc3RydWN0dXJlCi0gKiBAdnNldDoJY2hhcmdpbmcgdm9sdGFnZQotICogQGlzZXQ6CWNoYXJnZXIgb3V0cHV0IGN1cnJlbnQKLSAqCi0gKiBDaGVjayBpZiB0aGUgQUMgY2hhcmdlciBoYXMgYmVlbiBkaXNjb25uZWN0ZWQgYW5kIHJlY29ubmVjdGVkIHdpdGhvdXQKLSAqIEFCODUwMCByaXNpbmcgYW4gaW50ZXJydXB0LiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KLSAqLwotc3RhdGljIGludCBhYjg1MDBfY2hhcmdlcl9hY19jaGVja19lbmFibGUoc3RydWN0IHV4NTAwX2NoYXJnZXIgKmNoYXJnZXIsCi0JaW50IHZzZXQsIGludCBpc2V0KQotewotCXU4IG1haW5jaF9jdHJsMSA9IDA7Ci0JaW50IHJldCA9IDA7Ci0KLQlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpID0gdG9fYWI4NTAwX2NoYXJnZXJfYWNfZGV2aWNlX2luZm8oY2hhcmdlcik7Ci0KLQlpZiAoIWRpLT5hYy5jaGFyZ2VyX2Nvbm5lY3RlZCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfQ0hBUkdFUiwKLQkJCQlBQjg1MDBfTUNIX0NUUkwxLCAmbWFpbmNoX2N0cmwxKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGRpLT5kZXYsICJhYjg1MDAgcmVhZCBmYWlsZWQgJWRcbiIsIF9fTElORV9fKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JZGV2X2RiZyhkaS0+ZGV2LCAiQUMgY2hhcmdlciBjdHJsOiAweCUwMnhcbiIsIG1haW5jaF9jdHJsMSk7Ci0KLQlpZiAoIShtYWluY2hfY3RybDEgJiBNQUlOX0NIX0VOQSkpIHsKLQkJZGV2X2luZm8oZGktPmRldiwgIkNoYXJnaW5nIGhhcyBiZWVuIGRpc2FibGVkIGFibm9ybWFsbHkgYW5kIHdpbGwgYmUgcmUtZW5hYmxlZFxuIik7Ci0KLQkJcmV0ID0gYWJ4NTAwX21hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCi0JCQkJCUFCODUwMF9DSEFSR0VSLCBBQjg1MDBfQ0hBUkdFUl9DVFJMLAotCQkJCQlEUk9QX0NPVU5UX1JFU0VULCBEUk9QX0NPVU5UX1JFU0VUKTsKLQotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycihkaS0+ZGV2LCAiYWI4NTAwIHdyaXRlIGZhaWxlZCAlZFxuIiwgX19MSU5FX18pOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCXJldCA9IGFiODUwMF9jaGFyZ2VyX2FjX2VuKCZkaS0+dXNiX2NoZywgdHJ1ZSwgdnNldCwgaXNldCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIEFDIGNoYXJnZXIgJWRcbiIsCi0JCQkJX19MSU5FX18pOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIGFiODUwMF9jaGFyZ2VyX3dhdGNoZG9nX2tpY2soKSAtIGtpY2sgY2hhcmdlciB3YXRjaGRvZwotICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2NoYXJnZXIgc3RydWN0dXJlCi0gKgotICogS2ljayBjaGFyZ2VyIHdhdGNoZG9nCi0gKiBSZXR1cm5zIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlIGVsc2UgMChvbiBzdWNjZXNzKQotICovCi1zdGF0aWMgaW50IGFiODUwMF9jaGFyZ2VyX3dhdGNoZG9nX2tpY2soc3RydWN0IHV4NTAwX2NoYXJnZXIgKmNoYXJnZXIpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpOwotCi0JaWYgKGNoYXJnZXItPnBzeS0+ZGVzYy0+dHlwZSA9PSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUykKLQkJZGkgPSB0b19hYjg1MDBfY2hhcmdlcl9hY19kZXZpY2VfaW5mbyhjaGFyZ2VyKTsKLQllbHNlIGlmIChjaGFyZ2VyLT5wc3ktPmRlc2MtPnR5cGUgPT0gUE9XRVJfU1VQUExZX1RZUEVfVVNCKQotCQlkaSA9IHRvX2FiODUwMF9jaGFyZ2VyX3VzYl9kZXZpY2VfaW5mbyhjaGFyZ2VyKTsKLQllbHNlCi0JCXJldHVybiAtRU5YSU87Ci0KLQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX0NIQVJHRVIsCi0JCUFCODUwMF9DSEFSR19XRF9DVFJMLCBDSEFSR19XRF9LSUNLKTsKLQlpZiAocmV0KQotCQlkZXZfZXJyKGRpLT5kZXYsICJGYWlsZWQgdG8ga2ljayBXRCFcbiIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBhYjg1MDBfY2hhcmdlcl91cGRhdGVfY2hhcmdlcl9jdXJyZW50KCkgLSB1cGRhdGUgY2hhcmdlciBjdXJyZW50Ci0gKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfY2hhcmdlciBzdHJ1Y3R1cmUKLSAqCi0gKiBVcGRhdGUgdGhlIGNoYXJnZXIgb3V0cHV0IGN1cnJlbnQgZm9yIHRoZSBzcGVjaWZpZWQgY2hhcmdlcgotICogUmV0dXJucyBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZSBlbHNlIDAob24gc3VjY2VzcykKLSAqLwotc3RhdGljIGludCBhYjg1MDBfY2hhcmdlcl91cGRhdGVfY2hhcmdlcl9jdXJyZW50KHN0cnVjdCB1eDUwMF9jaGFyZ2VyICpjaGFyZ2VyLAotCQlpbnQgaWNoX291dCkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGk7Ci0KLQlpZiAoY2hhcmdlci0+cHN5LT5kZXNjLT50eXBlID09IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TKQotCQlkaSA9IHRvX2FiODUwMF9jaGFyZ2VyX2FjX2RldmljZV9pbmZvKGNoYXJnZXIpOwotCWVsc2UgaWYgKGNoYXJnZXItPnBzeS0+ZGVzYy0+dHlwZSA9PSBQT1dFUl9TVVBQTFlfVFlQRV9VU0IpCi0JCWRpID0gdG9fYWI4NTAwX2NoYXJnZXJfdXNiX2RldmljZV9pbmZvKGNoYXJnZXIpOwotCWVsc2UKLQkJcmV0dXJuIC1FTlhJTzsKLQotCXJldCA9IGFiODUwMF9jaGFyZ2VyX3NldF9vdXRwdXRfY3VycihkaSwgaWNoX291dCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRpLT5kZXYsICIlcyAiCi0JCQkiRmFpbGVkIHRvIHNldCBDaE91dHB1dEN1cmVudExldmVsXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qIFJlc2V0IHRoZSBtYWluIGFuZCB1c2IgZHJvcCBpbnB1dCBjdXJyZW50IG1lYXN1cmVtZW50IGNvdW50ZXIgKi8KLQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX0NIQVJHRVIsCi0JCQkJQUI4NTAwX0NIQVJHRVJfQ1RSTCwgRFJPUF9DT1VOVF9SRVNFVCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRpLT5kZXYsICIlcyB3cml0ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIGFiODU0MF9jaGFyZ2VyX3Bvd2VyX3BhdGhfZW5hYmxlKCkgLSBlbmFibGUgdXNiIHBvd2VyIHBhdGggbW9kZQotICogQGNoYXJnZXI6CXBvaW50ZXIgdG8gdGhlIHV4NTAwX2NoYXJnZXIgc3RydWN0dXJlCi0gKiBAZW5hYmxlOgllbmFibGUvZGlzYWJsZSBmbGFnCi0gKgotICogRW5hYmxlIG9yIGRpc2FibGUgdGhlIHBvd2VyIHBhdGggZm9yIHVzYiBtb2RlCi0gKiBSZXR1cm5zIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlIGVsc2UgMChvbiBzdWNjZXNzKQotICovCi1zdGF0aWMgaW50IGFiODU0MF9jaGFyZ2VyX3Bvd2VyX3BhdGhfZW5hYmxlKHN0cnVjdCB1eDUwMF9jaGFyZ2VyICpjaGFyZ2VyLAotCQlib29sIGVuYWJsZSkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGk7Ci0KLQlpZiAoY2hhcmdlci0+cHN5LT5kZXNjLT50eXBlID09IFBPV0VSX1NVUFBMWV9UWVBFX1VTQikKLQkJZGkgPSB0b19hYjg1MDBfY2hhcmdlcl91c2JfZGV2aWNlX2luZm8oY2hhcmdlcik7Ci0JZWxzZQotCQlyZXR1cm4gLUVOWElPOwotCi0JcmV0ID0gYWJ4NTAwX21hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCi0JCQkJQUI4NTAwX0NIQVJHRVIsIEFCODU0MF9VU0JfUFBfTU9ERV9SRUcsCi0JCQkJQlVTX1BPV0VSX1BBVEhfTU9ERV9FTkEsIGVuYWJsZSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRpLT5kZXYsICIlcyB3cml0ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0KLS8qKgotICogYWI4NTQwX2NoYXJnZXJfdXNiX3ByZV9jaGdfZW5hYmxlKCkgLSBlbmFibGUgdXNiIHByZSBjaGFuZ2UKLSAqIEBjaGFyZ2VyOglwb2ludGVyIHRvIHRoZSB1eDUwMF9jaGFyZ2VyIHN0cnVjdHVyZQotICogQGVuYWJsZToJZW5hYmxlL2Rpc2FibGUgZmxhZwotICoKLSAqIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBwcmUtY2hhZ2UgZm9yIHVzYiBtb2RlCi0gKiBSZXR1cm5zIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlIGVsc2UgMChvbiBzdWNjZXNzKQotICovCi1zdGF0aWMgaW50IGFiODU0MF9jaGFyZ2VyX3VzYl9wcmVfY2hnX2VuYWJsZShzdHJ1Y3QgdXg1MDBfY2hhcmdlciAqY2hhcmdlciwKLQkJYm9vbCBlbmFibGUpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpOwotCi0JaWYgKGNoYXJnZXItPnBzeS0+ZGVzYy0+dHlwZSA9PSBQT1dFUl9TVVBQTFlfVFlQRV9VU0IpCi0JCWRpID0gdG9fYWI4NTAwX2NoYXJnZXJfdXNiX2RldmljZV9pbmZvKGNoYXJnZXIpOwotCWVsc2UKLQkJcmV0dXJuIC1FTlhJTzsKLQotCXJldCA9IGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAotCQkJCUFCODUwMF9DSEFSR0VSLCBBQjg1NDBfVVNCX1BQX0NIUl9SRUcsCi0JCQkJQlVTX1BPV0VSX1BBVEhfUFJFQ0hHX0VOQSwgZW5hYmxlKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZGktPmRldiwgIiVzIHdyaXRlIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYWI4NTAwX2NoYXJnZXJfZ2V0X2V4dF9wc3lfZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5OwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmV4dCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWNvbnN0IGNoYXIgKipzdXBwbGljYW50cyA9IChjb25zdCBjaGFyICoqKWV4dC0+c3VwcGxpZWRfdG87Ci0Jc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaTsKLQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCByZXQ7Ci0JaW50IGo7Ci0Jc3RydWN0IHV4NTAwX2NoYXJnZXIgKnVzYl9jaGc7Ci0KLQl1c2JfY2hnID0gKHN0cnVjdCB1eDUwMF9jaGFyZ2VyICopZGF0YTsKLQlwc3kgPSB1c2JfY2hnLT5wc3k7Ci0KLQlkaSA9IHRvX2FiODUwMF9jaGFyZ2VyX3VzYl9kZXZpY2VfaW5mbyh1c2JfY2hnKTsKLQotCS8qIEZvciBhbGwgcHN5IHdoZXJlIHRoZSBkcml2ZXIgbmFtZSBhcHBlYXJzIGluIGFueSBzdXBwbGllZF90byAqLwotCWogPSBtYXRjaF9zdHJpbmcoc3VwcGxpY2FudHMsIGV4dC0+bnVtX3N1cHBsaWNhbnRzLCBwc3ktPmRlc2MtPm5hbWUpOwotCWlmIChqIDwgMCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBHbyB0aHJvdWdoIGFsbCBwcm9wZXJ0aWVzIGZvciB0aGUgcHN5ICovCi0JZm9yIChqID0gMDsgaiA8IGV4dC0+ZGVzYy0+bnVtX3Byb3BlcnRpZXM7IGorKykgewotCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwcm9wOwotCQlwcm9wID0gZXh0LT5kZXNjLT5wcm9wZXJ0aWVzW2pdOwotCi0JCWlmIChwb3dlcl9zdXBwbHlfZ2V0X3Byb3BlcnR5KGV4dCwgcHJvcCwgJnJldCkpCi0JCQljb250aW51ZTsKLQotCQlzd2l0Y2ggKHByb3ApIHsKLQkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKLQkJCXN3aXRjaCAoZXh0LT5kZXNjLT50eXBlKSB7Ci0JCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk6Ci0JCQkJZGktPnZiYXQgPSByZXQuaW50dmFsIC8gMTAwMDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGFiODUwMF9jaGFyZ2VyX2NoZWNrX3ZiYXRfd29yaygpIC0ga2VlcCB2YnVzIGN1cnJlbnQgd2l0aGluIHNwZWMKLSAqIEB3b3JrCXBvaW50ZXIgdG8gdGhlIHdvcmtfc3RydWN0IHN0cnVjdHVyZQotICoKLSAqIER1ZSB0byBhIGFzaWMgYnVnIGl0IGlzIG5lY2Vzc2FyeSB0byBsb3dlciB0aGUgaW5wdXQgY3VycmVudCB0byB0aGUgdmJ1cwotICogY2hhcmdlciB3aGVuIGNoYXJnaW5nIHdpdGggYXQgc29tZSBzcGVjaWZpYyBsZXZlbHMuIFRoaXMgaXNzdWUgaXMgb25seSB2YWxpZAotICogZm9yIGJlbG93IGEgY2VydGFpbiBiYXR0ZXJ5IHZvbHRhZ2UuIFRoaXMgZnVuY3Rpb24gbWFrZXMgc3VyZSB0aGF0IHRoZQotICogdGhlIGFsbG93ZWQgY3VycmVudCBsaW1pdCBpc24ndCBleGNlZWRlZC4KLSAqLwotc3RhdGljIHZvaWQgYWI4NTAwX2NoYXJnZXJfY2hlY2tfdmJhdF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlpbnQgdCA9IDEwOwotCXN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGkgPSBjb250YWluZXJfb2Yod29yaywKLQkJc3RydWN0IGFiODUwMF9jaGFyZ2VyLCBjaGVja192YmF0X3dvcmsud29yayk7Ci0KLQljbGFzc19mb3JfZWFjaF9kZXZpY2UocG93ZXJfc3VwcGx5X2NsYXNzLCBOVUxMLAotCQlkaS0+dXNiX2NoZy5wc3ksIGFiODUwMF9jaGFyZ2VyX2dldF9leHRfcHN5X2RhdGEpOwotCi0JLyogRmlyc3QgcnVuIG9sZF92YmF0IGlzIDAuICovCi0JaWYgKGRpLT5vbGRfdmJhdCA9PSAwKQotCQlkaS0+b2xkX3ZiYXQgPSBkaS0+dmJhdDsKLQotCWlmICghKChkaS0+b2xkX3ZiYXQgPD0gVkJBVF9UUkVTSF9JUF9DVVJfUkVEICYmCi0JCWRpLT52YmF0IDw9IFZCQVRfVFJFU0hfSVBfQ1VSX1JFRCkgfHwKLQkJKGRpLT5vbGRfdmJhdCA+IFZCQVRfVFJFU0hfSVBfQ1VSX1JFRCAmJgotCQlkaS0+dmJhdCA+IFZCQVRfVFJFU0hfSVBfQ1VSX1JFRCkpKSB7Ci0KLQkJZGV2X2RiZyhkaS0+ZGV2LCAiVmJhdCBkaWQgY3Jvc3MgdGhyZXNob2xkLCBjdXJyOiAlZCwgbmV3OiAlZCwiCi0JCQkiIG9sZDogJWRcbiIsIGRpLT5tYXhfdXNiX2luX2N1cnIudXNiX3R5cGVfbWF4LAotCQkJZGktPnZiYXQsIGRpLT5vbGRfdmJhdCk7Ci0JCWFiODUwMF9jaGFyZ2VyX3NldF92YnVzX2luX2N1cnIoZGksCi0JCQkJCWRpLT5tYXhfdXNiX2luX2N1cnIudXNiX3R5cGVfbWF4KTsKLQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGktPnVzYl9jaGcucHN5KTsKLQl9Ci0KLQlkaS0+b2xkX3ZiYXQgPSBkaS0+dmJhdDsKLQotCS8qCi0JICogTm8gbmVlZCB0byBjaGVjayB0aGUgYmF0dGVyeSB2b2x0YWdlIGV2ZXJ5IHNlY29uZCB3aGVuIG5vdCBjbG9zZSB0bwotCSAqIHRoZSB0aHJlc2hvbGQuCi0JICovCi0JaWYgKGRpLT52YmF0IDwgKFZCQVRfVFJFU0hfSVBfQ1VSX1JFRCArIDEwMCkgJiYKLQkJKGRpLT52YmF0ID4gKFZCQVRfVFJFU0hfSVBfQ1VSX1JFRCAtIDEwMCkpKQotCQkJdCA9IDE7Ci0KLQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmNoYXJnZXJfd3EsICZkaS0+Y2hlY2tfdmJhdF93b3JrLCB0ICogSFopOwotfQotCi0vKioKLSAqIGFiODUwMF9jaGFyZ2VyX2NoZWNrX2h3X2ZhaWx1cmVfd29yaygpIC0gY2hlY2sgbWFpbiBjaGFyZ2VyIGZhaWx1cmUKLSAqIEB3b3JrOglwb2ludGVyIHRvIHRoZSB3b3JrX3N0cnVjdCBzdHJ1Y3R1cmUKLSAqCi0gKiBXb3JrIHF1ZXVlIGZ1bmN0aW9uIGZvciBjaGVja2luZyB0aGUgbWFpbiBjaGFyZ2VyIHN0YXR1cwotICovCi1zdGF0aWMgdm9pZCBhYjg1MDBfY2hhcmdlcl9jaGVja19od19mYWlsdXJlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCWludCByZXQ7Ci0JdTggcmVnX3ZhbHVlOwotCi0Jc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IGNvbnRhaW5lcl9vZih3b3JrLAotCQlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIsIGNoZWNrX2h3X2ZhaWx1cmVfd29yay53b3JrKTsKLQotCS8qIENoZWNrIGlmIHRoZSBzdGF0dXMgYml0cyBmb3IgSFcgZmFpbHVyZSBpcyBzdGlsbCBhY3RpdmUgKi8KLQlpZiAoZGktPmZsYWdzLm1haW5leHRjaG5vdG9rKSB7Ci0JCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAotCQkJQUI4NTAwX0NIQVJHRVIsIEFCODUwMF9DSF9TVEFUVVMyX1JFRywgJnJlZ192YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKGRpLT5kZXYsICIlcyBhYjg1MDAgcmVhZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIShyZWdfdmFsdWUgJiBNQUlOX0NIX05PSykpIHsKLQkJCWRpLT5mbGFncy5tYWluZXh0Y2hub3RvayA9IGZhbHNlOwotCQkJYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLCBkaS0+YWNfY2hnLnBzeSk7Ci0JCX0KLQl9Ci0JaWYgKGRpLT5mbGFncy52YnVzX292dikgewotCQlyZXQgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKLQkJCUFCODUwMF9DSEFSR0VSLCBBQjg1MDBfQ0hfVVNCQ0hfU1RBVDJfUkVHLAotCQkJJnJlZ192YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKGRpLT5kZXYsICIlcyBhYjg1MDAgcmVhZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIShyZWdfdmFsdWUgJiBWQlVTX09WVl9USCkpIHsKLQkJCWRpLT5mbGFncy52YnVzX292diA9IGZhbHNlOwotCQkJYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLCBkaS0+dXNiX2NoZy5wc3kpOwotCQl9Ci0JfQotCS8qIElmIHdlIHN0aWxsIGhhdmUgYSBmYWlsdXJlLCBzY2hlZHVsZSBhIG5ldyBjaGVjayAqLwotCWlmIChkaS0+ZmxhZ3MubWFpbmV4dGNobm90b2sgfHwgZGktPmZsYWdzLnZidXNfb3Z2KSB7Ci0JCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Y2hhcmdlcl93cSwKLQkJCSZkaS0+Y2hlY2tfaHdfZmFpbHVyZV93b3JrLCByb3VuZF9qaWZmaWVzKEhaKSk7Ci0JfQotfQotCi0vKioKLSAqIGFiODUwMF9jaGFyZ2VyX2tpY2tfd2F0Y2hkb2dfd29yaygpIC0ga2ljayB0aGUgd2F0Y2hkb2cKLSAqIEB3b3JrOglwb2ludGVyIHRvIHRoZSB3b3JrX3N0cnVjdCBzdHJ1Y3R1cmUKLSAqCi0gKiBXb3JrIHF1ZXVlIGZ1bmN0aW9uIGZvciBraWNraW5nIHRoZSBjaGFyZ2VyIHdhdGNoZG9nLgotICoKLSAqIEZvciBBQkIgcmV2aXNpb24gMS4wIGFuZCAxLjEgdGhlcmUgaXMgYSBidWcgaW4gdGhlIHdhdGNoZG9nCi0gKiBsb2dpYy4gVGhhdCBtZWFucyB3ZSBoYXZlIHRvIGNvbnRpbm91c2x5IGtpY2sgdGhlIGNoYXJnZXIKLSAqIHdhdGNoZG9nIGV2ZW4gd2hlbiBubyBjaGFyZ2VyIGlzIGNvbm5lY3RlZC4gVGhpcyBpcyBvbmx5Ci0gKiB2YWxpZCBvbmNlIHRoZSBBQyBjaGFyZ2VyIGhhcyBiZWVuIGVuYWJsZWQuIFRoaXMgaXMKLSAqIGEgYnVnIHRoYXQgaXMgbm90IGhhbmRsZWQgYnkgdGhlIGFsZ29yaXRobSBhbmQgdGhlCi0gKiB3YXRjaGRvZyBoYXZlIHRvIGJlIGtpY2tlZCBieSB0aGUgY2hhcmdlciBkcml2ZXIKLSAqIHdoZW4gdGhlIEFDIGNoYXJnZXIgaXMgZGlzYWJsZWQKLSAqLwotc3RhdGljIHZvaWQgYWI4NTAwX2NoYXJnZXJfa2lja193YXRjaGRvZ193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlpbnQgcmV0OwotCi0Jc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IGNvbnRhaW5lcl9vZih3b3JrLAotCQlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIsIGtpY2tfd2Rfd29yay53b3JrKTsKLQotCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfQ0hBUkdFUiwKLQkJQUI4NTAwX0NIQVJHX1dEX0NUUkwsIENIQVJHX1dEX0tJQ0spOwotCWlmIChyZXQpCi0JCWRldl9lcnIoZGktPmRldiwgIkZhaWxlZCB0byBraWNrIFdEIVxuIik7Ci0KLQkvKiBTY2hlZHVsZSBhIG5ldyB3YXRjaGRvZyBraWNrICovCi0JcXVldWVfZGVsYXllZF93b3JrKGRpLT5jaGFyZ2VyX3dxLAotCQkmZGktPmtpY2tfd2Rfd29yaywgcm91bmRfamlmZmllcyhXRF9LSUNLX0lOVEVSVkFMKSk7Ci19Ci0KLS8qKgotICogYWI4NTAwX2NoYXJnZXJfYWNfd29yaygpIC0gd29yayB0byBnZXQgYW5kIHNldCBtYWluIGNoYXJnZXIgc3RhdHVzCi0gKiBAd29yazoJcG9pbnRlciB0byB0aGUgd29ya19zdHJ1Y3Qgc3RydWN0dXJlCi0gKgotICogV29yayBxdWV1ZSBmdW5jdGlvbiBmb3IgY2hlY2tpbmcgdGhlIG1haW4gY2hhcmdlciBzdGF0dXMKLSAqLwotc3RhdGljIHZvaWQgYWI4NTAwX2NoYXJnZXJfYWNfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0JaW50IHJldDsKLQotCXN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGkgPSBjb250YWluZXJfb2Yod29yaywKLQkJc3RydWN0IGFiODUwMF9jaGFyZ2VyLCBhY193b3JrKTsKLQotCS8qCi0JICogU2luY2Ugd2UgY2FuJ3QgYmUgc3VyZSB0aGF0IHRoZSBldmVudHMgYXJlIHJlY2VpdmVkCi0JICogc3luY2hyb25vdXNseSwgd2UgaGF2ZSB0aGUgY2hlY2sgaWYgdGhlIG1haW4gY2hhcmdlciBpcwotCSAqIGNvbm5lY3RlZCBieSByZWFkaW5nIHRoZSBzdGF0dXMgcmVnaXN0ZXIKLQkgKi8KLQlyZXQgPSBhYjg1MDBfY2hhcmdlcl9kZXRlY3RfY2hhcmdlcnMoZGksIGZhbHNlKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuOwotCi0JaWYgKHJldCAmIEFDX1BXX0NPTk4pIHsKLQkJZGktPmFjLmNoYXJnZXJfY29ubmVjdGVkID0gMTsKLQkJZGktPmFjX2Nvbm4gPSB0cnVlOwotCX0gZWxzZSB7Ci0JCWRpLT5hYy5jaGFyZ2VyX2Nvbm5lY3RlZCA9IDA7Ci0JfQotCi0JYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLCBkaS0+YWNfY2hnLnBzeSk7Ci0Jc3lzZnNfbm90aWZ5KCZkaS0+YWNfY2hnLnBzeS0+ZGV2LmtvYmosIE5VTEwsICJwcmVzZW50Iik7Ci19Ci0KLXN0YXRpYyB2b2lkIGFiODUwMF9jaGFyZ2VyX3VzYl9hdHRhY2hlZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpID0gY29udGFpbmVyX29mKHdvcmssCi0JCQkJCQkgc3RydWN0IGFiODUwMF9jaGFyZ2VyLAotCQkJCQkJIHVzYl9jaGFyZ2VyX2F0dGFjaGVkX3dvcmsud29yayk7Ci0JaW50IHVzYmNoID0gKFVTQl9DSF9WQlVTRFJPUCB8IFVTQl9DSF9WQlVTREVUREJOQyk7Ci0JaW50IHJldCwgaTsKLQl1OCBzdGF0dmFsOwotCi0JZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCi0JCQkJCQkJQUI4NTAwX0NIQVJHRVIsCi0JCQkJCQkJQUI4NTAwX0NIX1VTQkNIX1NUQVQxX1JFRywKLQkJCQkJCQkmc3RhdHZhbCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKGRpLT5kZXYsICJhYjg1MDAgcmVhZCBmYWlsZWQgJWRcbiIsIF9fTElORV9fKTsKLQkJCWdvdG8gcmVzY2hlZHVsZTsKLQkJfQotCQlpZiAoKHN0YXR2YWwgJiB1c2JjaCkgIT0gdXNiY2gpCi0JCQlnb3RvIHJlc2NoZWR1bGU7Ci0KLQkJbXNsZWVwKENIQVJHRVJfU1RBVFVTX1BPTEwpOwotCX0KLQotCWFiODUwMF9jaGFyZ2VyX3VzYl9lbigmZGktPnVzYl9jaGcsIDAsIDAsIDApOwotCi0JbXV0ZXhfbG9jaygmZGktPmNoYXJnZXJfYXR0YWNoZWRfbXV0ZXgpOwotCW11dGV4X3VubG9jaygmZGktPmNoYXJnZXJfYXR0YWNoZWRfbXV0ZXgpOwotCi0JcmV0dXJuOwotCi1yZXNjaGVkdWxlOgotCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Y2hhcmdlcl93cSwKLQkJCSAgICZkaS0+dXNiX2NoYXJnZXJfYXR0YWNoZWRfd29yaywKLQkJCSAgIEhaKTsKLX0KLQotc3RhdGljIHZvaWQgYWI4NTAwX2NoYXJnZXJfYWNfYXR0YWNoZWRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0KLQlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpID0gY29udGFpbmVyX29mKHdvcmssCi0JCQkJCQkgc3RydWN0IGFiODUwMF9jaGFyZ2VyLAotCQkJCQkJIGFjX2NoYXJnZXJfYXR0YWNoZWRfd29yay53b3JrKTsKLQlpbnQgbWFpbmNoID0gKE1BSU5fQ0hfU1RBVFVTMl9NQUlOQ0hHRFJPUCB8Ci0JCSAgICAgIE1BSU5fQ0hfU1RBVFVTMl9NQUlOQ0hBUkdFUkRFVERCTkMpOwotCWludCByZXQsIGk7Ci0JdTggc3RhdHZhbDsKLQotCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAotCQkJCQkJCUFCODUwMF9DSEFSR0VSLAotCQkJCQkJCUFCODUwMF9DSF9TVEFUVVMyX1JFRywKLQkJCQkJCQkmc3RhdHZhbCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKGRpLT5kZXYsICJhYjg1MDAgcmVhZCBmYWlsZWQgJWRcbiIsIF9fTElORV9fKTsKLQkJCWdvdG8gcmVzY2hlZHVsZTsKLQkJfQotCi0JCWlmICgoc3RhdHZhbCAmIG1haW5jaCkgIT0gbWFpbmNoKQotCQkJZ290byByZXNjaGVkdWxlOwotCi0JCW1zbGVlcChDSEFSR0VSX1NUQVRVU19QT0xMKTsKLQl9Ci0KLQlhYjg1MDBfY2hhcmdlcl9hY19lbigmZGktPmFjX2NoZywgMCwgMCwgMCk7Ci0JcXVldWVfd29yayhkaS0+Y2hhcmdlcl93cSwgJmRpLT5hY193b3JrKTsKLQotCW11dGV4X2xvY2soJmRpLT5jaGFyZ2VyX2F0dGFjaGVkX211dGV4KTsKLQltdXRleF91bmxvY2soJmRpLT5jaGFyZ2VyX2F0dGFjaGVkX211dGV4KTsKLQotCXJldHVybjsKLQotcmVzY2hlZHVsZToKLQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmNoYXJnZXJfd3EsCi0JCQkgICAmZGktPmFjX2NoYXJnZXJfYXR0YWNoZWRfd29yaywKLQkJCSAgIEhaKTsKLX0KLQotLyoqCi0gKiBhYjg1MDBfY2hhcmdlcl9kZXRlY3RfdXNiX3R5cGVfd29yaygpIC0gd29yayB0byBkZXRlY3QgVVNCIHR5cGUKLSAqIEB3b3JrOglQb2ludGVyIHRvIHRoZSB3b3JrX3N0cnVjdCBzdHJ1Y3R1cmUKLSAqCi0gKiBEZXRlY3QgdGhlIHR5cGUgb2YgVVNCIHBsdWdnZWQKLSAqLwotc3RhdGljIHZvaWQgYWI4NTAwX2NoYXJnZXJfZGV0ZWN0X3VzYl90eXBlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCWludCByZXQ7Ci0KLQlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpID0gY29udGFpbmVyX29mKHdvcmssCi0JCXN0cnVjdCBhYjg1MDBfY2hhcmdlciwgZGV0ZWN0X3VzYl90eXBlX3dvcmspOwotCi0JLyoKLQkgKiBTaW5jZSB3ZSBjYW4ndCBiZSBzdXJlIHRoYXQgdGhlIGV2ZW50cyBhcmUgcmVjZWl2ZWQKLQkgKiBzeW5jaHJvbm91c2x5LCB3ZSBoYXZlIHRoZSBjaGVjayBpZiBpcwotCSAqIGNvbm5lY3RlZCBieSByZWFkaW5nIHRoZSBzdGF0dXMgcmVnaXN0ZXIKLQkgKi8KLQlyZXQgPSBhYjg1MDBfY2hhcmdlcl9kZXRlY3RfY2hhcmdlcnMoZGksIGZhbHNlKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuOwotCi0JaWYgKCEocmV0ICYgVVNCX1BXX0NPTk4pKSB7Ci0JCWRldl9kYmcoZGktPmRldiwgIiVzIGRpLT52YnVzX2RldGVjdGVkID0gZmFsc2VcbiIsIF9fZnVuY19fKTsKLQkJZGktPnZidXNfZGV0ZWN0ZWQgPSBmYWxzZTsKLQkJYWI4NTAwX2NoYXJnZXJfc2V0X3VzYl9jb25uZWN0ZWQoZGksIGZhbHNlKTsKLQkJYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLCBkaS0+dXNiX2NoZy5wc3kpOwotCX0gZWxzZSB7Ci0JCWRldl9kYmcoZGktPmRldiwgIiVzIGRpLT52YnVzX2RldGVjdGVkID0gdHJ1ZVxuIiwgX19mdW5jX18pOwotCQlkaS0+dmJ1c19kZXRlY3RlZCA9IHRydWU7Ci0KLQkJaWYgKGlzX2FiODUwMF8xcDFfb3JfZWFybGllcihkaS0+cGFyZW50KSkgewotCQkJcmV0ID0gYWI4NTAwX2NoYXJnZXJfZGV0ZWN0X3VzYl90eXBlKGRpKTsKLQkJCWlmICghcmV0KSB7Ci0JCQkJYWI4NTAwX2NoYXJnZXJfc2V0X3VzYl9jb25uZWN0ZWQoZGksIHRydWUpOwotCQkJCWFiODUwMF9wb3dlcl9zdXBwbHlfY2hhbmdlZChkaSwKLQkJCQkJCQkgICAgZGktPnVzYl9jaGcucHN5KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBGb3IgQUJCIGN1dDIuMCBhbmQgb253YXJkcyB3ZSBoYXZlIGFuIElSUSwKLQkJCSAqIFVTQl9MSU5LX1NUQVRVUyB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIFVTQgotCQkJICogbGluayBzdGF0dXMgY2hhbmdlcy4gVGhlIGV4Y2VwdGlvbiBpcyBVU0IgY29ubmVjdGVkCi0JCQkgKiBkdXJpbmcgc3RhcnR1cC4gVGhlbiB3ZSBkb24ndCBnZXQgYQotCQkJICogVVNCX0xJTktfU1RBVFVTIElSUQotCQkJICovCi0JCQlpZiAoZGktPnZidXNfZGV0ZWN0ZWRfc3RhcnQpIHsKLQkJCQlkaS0+dmJ1c19kZXRlY3RlZF9zdGFydCA9IGZhbHNlOwotCQkJCXJldCA9IGFiODUwMF9jaGFyZ2VyX2RldGVjdF91c2JfdHlwZShkaSk7Ci0JCQkJaWYgKCFyZXQpIHsKLQkJCQkJYWI4NTAwX2NoYXJnZXJfc2V0X3VzYl9jb25uZWN0ZWQoZGksCi0JCQkJCQl0cnVlKTsKLQkJCQkJYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLAotCQkJCQkJZGktPnVzYl9jaGcucHN5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLS8qKgotICogYWI4NTAwX2NoYXJnZXJfdXNiX2xpbmtfYXR0YWNoX3dvcmsoKSAtIHdvcmsgdG8gZGV0ZWN0IFVTQiB0eXBlCi0gKiBAd29yazoJcG9pbnRlciB0byB0aGUgd29ya19zdHJ1Y3Qgc3RydWN0dXJlCi0gKgotICogRGV0ZWN0IHRoZSB0eXBlIG9mIFVTQiBwbHVnZ2VkCi0gKi8KLXN0YXRpYyB2b2lkIGFiODUwMF9jaGFyZ2VyX3VzYl9saW5rX2F0dGFjaF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhYjg1MDBfY2hhcmdlciwgYXR0YWNoX3dvcmsud29yayk7Ci0JaW50IHJldDsKLQotCS8qIFVwZGF0ZSBtYXhpbXVtIGlucHV0IGN1cnJlbnQgaWYgVVNCIGVudW1lcmF0aW9uIGlzIG5vdCBkZXRlY3RlZCAqLwotCWlmICghZGktPnVzYi5jaGFyZ2VyX29ubGluZSkgewotCQlyZXQgPSBhYjg1MDBfY2hhcmdlcl9zZXRfdmJ1c19pbl9jdXJyKGRpLAotCQkJCQlkaS0+bWF4X3VzYl9pbl9jdXJyLnVzYl90eXBlX21heCk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm47Ci0JfQotCi0JYWI4NTAwX2NoYXJnZXJfc2V0X3VzYl9jb25uZWN0ZWQoZGksIHRydWUpOwotCWFiODUwMF9wb3dlcl9zdXBwbHlfY2hhbmdlZChkaSwgZGktPnVzYl9jaGcucHN5KTsKLX0KLQotLyoqCi0gKiBhYjg1MDBfY2hhcmdlcl91c2JfbGlua19zdGF0dXNfd29yaygpIC0gd29yayB0byBkZXRlY3QgVVNCIHR5cGUKLSAqIEB3b3JrOglwb2ludGVyIHRvIHRoZSB3b3JrX3N0cnVjdCBzdHJ1Y3R1cmUKLSAqCi0gKiBEZXRlY3QgdGhlIHR5cGUgb2YgVVNCIHBsdWdnZWQKLSAqLwotc3RhdGljIHZvaWQgYWI4NTAwX2NoYXJnZXJfdXNiX2xpbmtfc3RhdHVzX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCWludCBkZXRlY3RlZF9jaGFyZ2VyczsKLQlpbnQgcmV0OwotCXU4IHZhbDsKLQl1OCBsaW5rX3N0YXR1czsKLQotCXN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGkgPSBjb250YWluZXJfb2Yod29yaywKLQkJc3RydWN0IGFiODUwMF9jaGFyZ2VyLCB1c2JfbGlua19zdGF0dXNfd29yayk7Ci0KLQkvKgotCSAqIFNpbmNlIHdlIGNhbid0IGJlIHN1cmUgdGhhdCB0aGUgZXZlbnRzIGFyZSByZWNlaXZlZAotCSAqIHN5bmNocm9ub3VzbHksIHdlIGhhdmUgdGhlIGNoZWNrIGlmICBpcwotCSAqIGNvbm5lY3RlZCBieSByZWFkaW5nIHRoZSBzdGF0dXMgcmVnaXN0ZXIKLQkgKi8KLQlkZXRlY3RlZF9jaGFyZ2VycyA9IGFiODUwMF9jaGFyZ2VyX2RldGVjdF9jaGFyZ2VycyhkaSwgZmFsc2UpOwotCWlmIChkZXRlY3RlZF9jaGFyZ2VycyA8IDApCi0JCXJldHVybjsKLQotCS8qCi0JICogU29tZSBjaGFyZ2VycyB0aGF0IGJyZWFrcyB0aGUgVVNCIHNwZWMgaXMKLQkgKiBpZGVudGlmaWVkIGFzIGludmFsaWQgYnkgQUI4NTAwIGFuZCBpdCByZWZ1c2UKLQkgKiB0byBzdGFydCB0aGUgY2hhcmdpbmcgcHJvY2Vzcy4gYnV0IGJ5IGp1bXBpbmcKLQkgKiB0aHJ1IGEgZmV3IGhvb3BzIGl0IGNhbiBiZSBmb3JjZWQgdG8gc3RhcnQuCi0JICovCi0JaWYgKGlzX2FiODUwMChkaS0+cGFyZW50KSkKLQkJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9VU0IsCi0JCQkJCUFCODUwMF9VU0JfTElORV9TVEFUX1JFRywgJnZhbCk7Ci0JZWxzZQotCQlyZXQgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX1VTQiwKLQkJCQkJQUI4NTAwX1VTQl9MSU5LMV9TVEFUX1JFRywgJnZhbCk7Ci0KLQlpZiAocmV0ID49IDApCi0JCWRldl9kYmcoZGktPmRldiwgIlVzYkxpbmVTdGF0dXMgcmVnaXN0ZXIgPSAweCUwMnhcbiIsIHZhbCk7Ci0JZWxzZQotCQlkZXZfZGJnKGRpLT5kZXYsICJFcnJvciByZWFkaW5nIFVTQiBsaW5rIHN0YXR1c1xuIik7Ci0KLQlpZiAoaXNfYWI4NTAwKGRpLT5wYXJlbnQpKQotCQlsaW5rX3N0YXR1cyA9IEFCODUwMF9VU0JfTElOS19TVEFUVVM7Ci0JZWxzZQotCQlsaW5rX3N0YXR1cyA9IEFCODUwNV9VU0JfTElOS19TVEFUVVM7Ci0KLQlpZiAoZGV0ZWN0ZWRfY2hhcmdlcnMgJiBVU0JfUFdfQ09OTikgewotCQlpZiAoKCh2YWwgJiBsaW5rX3N0YXR1cykgPj4gVVNCX0xJTktfU1RBVFVTX1NISUZUKSA9PQotCQkJCVVTQl9TVEFUX05PVF9WQUxJRF9MSU5LICYmCi0JCQkJZGktPmludmFsaWRfY2hhcmdlcl9kZXRlY3Rfc3RhdGUgPT0gMCkgewotCQkJZGV2X2RiZyhkaS0+ZGV2LAotCQkJCQkiSW52YWxpZCBjaGFyZ2VyIGRldGVjdGVkLCBzdGF0ZT0gMFxuIik7Ci0JCQkvKkVuYWJsZSBjaGFyZ2VyKi8KLQkJCWFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAotCQkJCQlBQjg1MDBfQ0hBUkdFUiwgQUI4NTAwX1VTQkNIX0NUUkwxX1JFRywKLQkJCQkJVVNCX0NIX0VOQSwgVVNCX0NIX0VOQSk7Ci0JCQkvKkVuYWJsZSBjaGFyZ2VyIGRldGVjdGlvbiovCi0JCQlhYng1MDBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKLQkJCQkJQUI4NTAwX1VTQiwgQUI4NTAwX1VTQl9MSU5FX0NUUkwyX1JFRywKLQkJCQkJVVNCX0NIX0RFVCwgVVNCX0NIX0RFVCk7Ci0JCQlkaS0+aW52YWxpZF9jaGFyZ2VyX2RldGVjdF9zdGF0ZSA9IDE7Ci0JCQkvKmV4aXQgYW5kIHdhaXQgZm9yIG5ldyBsaW5rIHN0YXR1cyBpbnRlcnJ1cHQuKi8KLQkJCXJldHVybjsKLQotCQl9Ci0JCWlmIChkaS0+aW52YWxpZF9jaGFyZ2VyX2RldGVjdF9zdGF0ZSA9PSAxKSB7Ci0JCQlkZXZfZGJnKGRpLT5kZXYsCi0JCQkJCSJJbnZhbGlkIGNoYXJnZXIgZGV0ZWN0ZWQsIHN0YXRlPSAxXG4iKTsKLQkJCS8qU3RvcCBjaGFyZ2VyIGRldGVjdGlvbiovCi0JCQlhYng1MDBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKLQkJCQkJQUI4NTAwX1VTQiwgQUI4NTAwX1VTQl9MSU5FX0NUUkwyX1JFRywKLQkJCQkJVVNCX0NIX0RFVCwgMHgwMCk7Ci0JCQkvKkNoZWNrIGxpbmsgc3RhdHVzKi8KLQkJCWlmIChpc19hYjg1MDAoZGktPnBhcmVudCkpCi0JCQkJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCi0JCQkJCUFCODUwMF9VU0IsIEFCODUwMF9VU0JfTElORV9TVEFUX1JFRywKLQkJCQkJJnZhbCk7Ci0JCQllbHNlCi0JCQkJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCi0JCQkJCUFCODUwMF9VU0IsIEFCODUwMF9VU0JfTElOSzFfU1RBVF9SRUcsCi0JCQkJCSZ2YWwpOwotCi0JCQlkZXZfZGJnKGRpLT5kZXYsICJVU0IgbGluayBzdGF0dXM9IDB4JTAyeFxuIiwKLQkJCQkodmFsICYgbGlua19zdGF0dXMpID4+IFVTQl9MSU5LX1NUQVRVU19TSElGVCk7Ci0JCQlkaS0+aW52YWxpZF9jaGFyZ2VyX2RldGVjdF9zdGF0ZSA9IDI7Ci0JCX0KLQl9IGVsc2UgewotCQlkaS0+aW52YWxpZF9jaGFyZ2VyX2RldGVjdF9zdGF0ZSA9IDA7Ci0JfQotCi0JaWYgKCEoZGV0ZWN0ZWRfY2hhcmdlcnMgJiBVU0JfUFdfQ09OTikpIHsKLQkJZGktPnZidXNfZGV0ZWN0ZWQgPSBmYWxzZTsKLQkJYWI4NTAwX2NoYXJnZXJfc2V0X3VzYl9jb25uZWN0ZWQoZGksIGZhbHNlKTsKLQkJYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLCBkaS0+dXNiX2NoZy5wc3kpOwotCQlyZXR1cm47Ci0JfQotCi0JZGV2X2RiZyhkaS0+ZGV2LCIlcyBkaS0+dmJ1c19kZXRlY3RlZCA9IHRydWVcbiIsX19mdW5jX18pOwotCWRpLT52YnVzX2RldGVjdGVkID0gdHJ1ZTsKLQlyZXQgPSBhYjg1MDBfY2hhcmdlcl9yZWFkX3VzYl90eXBlKGRpKTsKLQlpZiAocmV0KSB7Ci0JCWlmIChyZXQgPT0gLUVOWElPKSB7Ci0JCQkvKiBObyB2YWxpZCBjaGFyZ2VyIHR5cGUgZGV0ZWN0ZWQgKi8KLQkJCWFiODUwMF9jaGFyZ2VyX3NldF91c2JfY29ubmVjdGVkKGRpLCBmYWxzZSk7Ci0JCQlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksIGRpLT51c2JfY2hnLnBzeSk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCWlmIChkaS0+dXNiX2RldmljZV9pc191bnJlY29nbmlzZWQpIHsKLQkJZGV2X2RiZyhkaS0+ZGV2LAotCQkJIlBvdGVudGlhbCBMZWdhY3kgQ2hhcmdlciBkZXZpY2UuICIKLQkJCSJEZWxheSB3b3JrIGZvciAlZCBtc2VjIGZvciBVU0IgZW51bSAiCi0JCQkidG8gZmluaXNoIiwKLQkJCVdBSVRfQUNBX1JJRF9FTlVNRVJBVElPTik7Ci0JCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Y2hhcmdlcl93cSwKLQkJCQkgICAmZGktPmF0dGFjaF93b3JrLAotCQkJCSAgIG1zZWNzX3RvX2ppZmZpZXMoV0FJVF9BQ0FfUklEX0VOVU1FUkFUSU9OKSk7Ci0JfSBlbHNlIGlmIChkaS0+aXNfYWNhX3JpZCA9PSAxKSB7Ci0JCS8qIE9ubHkgd2FpdCBvbmNlICovCi0JCWRpLT5pc19hY2FfcmlkKys7Ci0JCWRldl9kYmcoZGktPmRldiwKLQkJCSIlcyBXYWl0ICVkIG1zZWMgZm9yIFVTQiBlbnVtIHRvIGZpbmlzaCIsCi0JCQlfX2Z1bmNfXywgV0FJVF9BQ0FfUklEX0VOVU1FUkFUSU9OKTsKLQkJcXVldWVfZGVsYXllZF93b3JrKGRpLT5jaGFyZ2VyX3dxLAotCQkJCSAgICZkaS0+YXR0YWNoX3dvcmssCi0JCQkJICAgbXNlY3NfdG9famlmZmllcyhXQUlUX0FDQV9SSURfRU5VTUVSQVRJT04pKTsKLQl9IGVsc2UgewotCQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmNoYXJnZXJfd3EsCi0JCQkJICAgJmRpLT5hdHRhY2hfd29yaywKLQkJCQkgICAwKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGFiODUwMF9jaGFyZ2VyX3VzYl9zdGF0ZV9jaGFuZ2VkX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCWludCByZXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGkgPSBjb250YWluZXJfb2Yod29yaywKLQkJc3RydWN0IGFiODUwMF9jaGFyZ2VyLCB1c2Jfc3RhdGVfY2hhbmdlZF93b3JrLndvcmspOwotCi0JaWYgKCFkaS0+dmJ1c19kZXRlY3RlZCkJewotCQlkZXZfZGJnKGRpLT5kZXYsCi0JCQkiJXMgIWRpLT52YnVzX2RldGVjdGVkXG4iLAotCQkJX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRpLT51c2Jfc3RhdGUudXNiX2xvY2ssIGZsYWdzKTsKLQlkaS0+dXNiX3N0YXRlLnN0YXRlID0gZGktPnVzYl9zdGF0ZS5zdGF0ZV90bXA7Ci0JZGktPnVzYl9zdGF0ZS51c2JfY3VycmVudCA9IGRpLT51c2Jfc3RhdGUudXNiX2N1cnJlbnRfdG1wOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpLT51c2Jfc3RhdGUudXNiX2xvY2ssIGZsYWdzKTsKLQotCWRldl9kYmcoZGktPmRldiwgIiVzIFVTQiBzdGF0ZTogMHglMDJ4IG1BOiAlZFxuIiwKLQkJX19mdW5jX18sIGRpLT51c2Jfc3RhdGUuc3RhdGUsIGRpLT51c2Jfc3RhdGUudXNiX2N1cnJlbnQpOwotCi0Jc3dpdGNoIChkaS0+dXNiX3N0YXRlLnN0YXRlKSB7Ci0JY2FzZSBBQjg1MDBfQk1fVVNCX1NUQVRFX1JFU0VUX0hTOgotCWNhc2UgQUI4NTAwX0JNX1VTQl9TVEFURV9SRVNFVF9GUzoKLQljYXNlIEFCODUwMF9CTV9VU0JfU1RBVEVfU1VTUEVORDoKLQljYXNlIEFCODUwMF9CTV9VU0JfU1RBVEVfTUFYOgotCQlhYjg1MDBfY2hhcmdlcl9zZXRfdXNiX2Nvbm5lY3RlZChkaSwgZmFsc2UpOwotCQlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksIGRpLT51c2JfY2hnLnBzeSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQjg1MDBfQk1fVVNCX1NUQVRFX1JFU1VNRToKLQkJLyoKLQkJICogd2hlbiBzdXNwZW5kLT5yZXN1bWUgdGhlcmUgc2hvdWxkIGJlIGRlbGF5Ci0JCSAqIG9mIDFzZWMgZm9yIGVuYWJsaW5nIGNoYXJnaW5nCi0JCSAqLwotCQltc2xlZXAoMTAwMCk7Ci0JCS8qIEludGVudGlvbmFsIGZhbGwgdGhyb3VnaCAqLwotCWNhc2UgQUI4NTAwX0JNX1VTQl9TVEFURV9DT05GSUdVUkVEOgotCQkvKgotCQkgKiBVU0IgaXMgY29uZmlndXJlZCwgZW5hYmxlIGNoYXJnaW5nIHdpdGggdGhlIGNoYXJnaW5nCi0JCSAqIGlucHV0IGN1cnJlbnQgb2J0YWluZWQgZnJvbSBVU0IgZHJpdmVyCi0JCSAqLwotCQlpZiAoIWFiODUwMF9jaGFyZ2VyX2dldF91c2JfY3VyKGRpKSkgewotCQkJLyogVXBkYXRlIG1heGltdW0gaW5wdXQgY3VycmVudCAqLwotCQkJcmV0ID0gYWI4NTAwX2NoYXJnZXJfc2V0X3ZidXNfaW5fY3VycihkaSwKLQkJCQkJZGktPm1heF91c2JfaW5fY3Vyci51c2JfdHlwZV9tYXgpOwotCQkJaWYgKHJldCkKLQkJCQlyZXR1cm47Ci0KLQkJCWFiODUwMF9jaGFyZ2VyX3NldF91c2JfY29ubmVjdGVkKGRpLCB0cnVlKTsKLQkJCWFiODUwMF9wb3dlcl9zdXBwbHlfY2hhbmdlZChkaSwgZGktPnVzYl9jaGcucHN5KTsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX07Ci19Ci0KLS8qKgotICogYWI4NTAwX2NoYXJnZXJfY2hlY2tfdXNiY2hhcmdlcm5vdG9rX3dvcmsoKSAtIGNoZWNrIFVTQiBjaGcgbm90IG9rIHN0YXR1cwotICogQHdvcms6CXBvaW50ZXIgdG8gdGhlIHdvcmtfc3RydWN0IHN0cnVjdHVyZQotICoKLSAqIFdvcmsgcXVldWUgZnVuY3Rpb24gZm9yIGNoZWNraW5nIHRoZSBVU0IgY2hhcmdlciBOb3QgT0sgc3RhdHVzCi0gKi8KLXN0YXRpYyB2b2lkIGFiODUwMF9jaGFyZ2VyX2NoZWNrX3VzYmNoYXJnZXJub3Rva193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlpbnQgcmV0OwotCXU4IHJlZ192YWx1ZTsKLQlib29sIHByZXZfc3RhdHVzOwotCi0Jc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IGNvbnRhaW5lcl9vZih3b3JrLAotCQlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIsIGNoZWNrX3VzYmNoZ25vdG9rX3dvcmsud29yayk7Ci0KLQkvKiBDaGVjayBpZiB0aGUgc3RhdHVzIGJpdCBmb3IgdXNiY2hhcmdlcm5vdG9rIGlzIHN0aWxsIGFjdGl2ZSAqLwotCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAotCQlBQjg1MDBfQ0hBUkdFUiwgQUI4NTAwX0NIX1VTQkNIX1NUQVQyX1JFRywgJnJlZ192YWx1ZSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgYWI4NTAwIHJlYWQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0JcHJldl9zdGF0dXMgPSBkaS0+ZmxhZ3MudXNiY2hhcmdlcm5vdG9rOwotCi0JaWYgKHJlZ192YWx1ZSAmIFZCVVNfQ0hfTk9LKSB7Ci0JCWRpLT5mbGFncy51c2JjaGFyZ2Vybm90b2sgPSB0cnVlOwotCQkvKiBDaGVjayBhZ2FpbiBpbiAxc2VjICovCi0JCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Y2hhcmdlcl93cSwKLQkJCSZkaS0+Y2hlY2tfdXNiY2hnbm90b2tfd29yaywgSFopOwotCX0gZWxzZSB7Ci0JCWRpLT5mbGFncy51c2JjaGFyZ2Vybm90b2sgPSBmYWxzZTsKLQkJZGktPmZsYWdzLnZidXNfY29sbGFwc2UgPSBmYWxzZTsKLQl9Ci0KLQlpZiAocHJldl9zdGF0dXMgIT0gZGktPmZsYWdzLnVzYmNoYXJnZXJub3RvaykKLQkJYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLCBkaS0+dXNiX2NoZy5wc3kpOwotfQotCi0vKioKLSAqIGFiODUwMF9jaGFyZ2VyX2NoZWNrX21haW5fdGhlcm1hbF9wcm90X3dvcmsoKSAtIGNoZWNrIG1haW4gdGhlcm1hbCBzdGF0dXMKLSAqIEB3b3JrOglwb2ludGVyIHRvIHRoZSB3b3JrX3N0cnVjdCBzdHJ1Y3R1cmUKLSAqCi0gKiBXb3JrIHF1ZXVlIGZ1bmN0aW9uIGZvciBjaGVja2luZyB0aGUgTWFpbiB0aGVybWFsIHByb3Qgc3RhdHVzCi0gKi8KLXN0YXRpYyB2b2lkIGFiODUwMF9jaGFyZ2VyX2NoZWNrX21haW5fdGhlcm1hbF9wcm90X3dvcmsoCi0Jc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCWludCByZXQ7Ci0JdTggcmVnX3ZhbHVlOwotCi0Jc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IGNvbnRhaW5lcl9vZih3b3JrLAotCQlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIsIGNoZWNrX21haW5fdGhlcm1hbF9wcm90X3dvcmspOwotCi0JLyogQ2hlY2sgaWYgdGhlIHN0YXR1cyBiaXQgZm9yIG1haW5fdGhlcm1hbF9wcm90IGlzIHN0aWxsIGFjdGl2ZSAqLwotCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAotCQlBQjg1MDBfQ0hBUkdFUiwgQUI4NTAwX0NIX1NUQVRVUzJfUkVHLCAmcmVnX3ZhbHVlKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGRpLT5kZXYsICIlcyBhYjg1MDAgcmVhZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAocmVnX3ZhbHVlICYgTUFJTl9DSF9USF9QUk9UKQotCQlkaS0+ZmxhZ3MubWFpbl90aGVybWFsX3Byb3QgPSB0cnVlOwotCWVsc2UKLQkJZGktPmZsYWdzLm1haW5fdGhlcm1hbF9wcm90ID0gZmFsc2U7Ci0KLQlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksIGRpLT5hY19jaGcucHN5KTsKLX0KLQotLyoqCi0gKiBhYjg1MDBfY2hhcmdlcl9jaGVja191c2JfdGhlcm1hbF9wcm90X3dvcmsoKSAtIGNoZWNrIHVzYiB0aGVybWFsIHN0YXR1cwotICogQHdvcms6CXBvaW50ZXIgdG8gdGhlIHdvcmtfc3RydWN0IHN0cnVjdHVyZQotICoKLSAqIFdvcmsgcXVldWUgZnVuY3Rpb24gZm9yIGNoZWNraW5nIHRoZSBVU0IgdGhlcm1hbCBwcm90IHN0YXR1cwotICovCi1zdGF0aWMgdm9pZCBhYjg1MDBfY2hhcmdlcl9jaGVja191c2JfdGhlcm1hbF9wcm90X3dvcmsoCi0Jc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCWludCByZXQ7Ci0JdTggcmVnX3ZhbHVlOwotCi0Jc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IGNvbnRhaW5lcl9vZih3b3JrLAotCQlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIsIGNoZWNrX3VzYl90aGVybWFsX3Byb3Rfd29yayk7Ci0KLQkvKiBDaGVjayBpZiB0aGUgc3RhdHVzIGJpdCBmb3IgdXNiX3RoZXJtYWxfcHJvdCBpcyBzdGlsbCBhY3RpdmUgKi8KLQlyZXQgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKLQkJQUI4NTAwX0NIQVJHRVIsIEFCODUwMF9DSF9VU0JDSF9TVEFUMl9SRUcsICZyZWdfdmFsdWUpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoZGktPmRldiwgIiVzIGFiODUwMCByZWFkIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCWlmIChyZWdfdmFsdWUgJiBVU0JfQ0hfVEhfUFJPVCkKLQkJZGktPmZsYWdzLnVzYl90aGVybWFsX3Byb3QgPSB0cnVlOwotCWVsc2UKLQkJZGktPmZsYWdzLnVzYl90aGVybWFsX3Byb3QgPSBmYWxzZTsKLQotCWFiODUwMF9wb3dlcl9zdXBwbHlfY2hhbmdlZChkaSwgZGktPnVzYl9jaGcucHN5KTsKLX0KLQotLyoqCi0gKiBhYjg1MDBfY2hhcmdlcl9tYWluY2h1bnBsdWdkZXRfaGFuZGxlcigpIC0gbWFpbiBjaGFyZ2VyIHVucGx1Z2dlZAotICogQGlycTogICAgICAgaW50ZXJydXB0IG51bWJlcgotICogQF9kaTogICAgICAgcG9pbnRlciB0byB0aGUgYWI4NTAwX2NoYXJnZXIgc3RydWN0dXJlCi0gKgotICogUmV0dXJucyBJUlEgc3RhdHVzKElSUV9IQU5ETEVEKQotICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgYWI4NTAwX2NoYXJnZXJfbWFpbmNodW5wbHVnZGV0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqX2RpKQotewotCXN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGkgPSBfZGk7Ci0KLQlkZXZfZGJnKGRpLT5kZXYsICJNYWluIGNoYXJnZXIgdW5wbHVnZ2VkXG4iKTsKLQlxdWV1ZV93b3JrKGRpLT5jaGFyZ2VyX3dxLCAmZGktPmFjX3dvcmspOwotCi0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZkaS0+YWNfY2hhcmdlcl9hdHRhY2hlZF93b3JrKTsKLQltdXRleF9sb2NrKCZkaS0+Y2hhcmdlcl9hdHRhY2hlZF9tdXRleCk7Ci0JbXV0ZXhfdW5sb2NrKCZkaS0+Y2hhcmdlcl9hdHRhY2hlZF9tdXRleCk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qKgotICogYWI4NTAwX2NoYXJnZXJfbWFpbmNocGx1Z2RldF9oYW5kbGVyKCkgLSBtYWluIGNoYXJnZXIgcGx1Z2dlZAotICogQGlycTogICAgICAgaW50ZXJydXB0IG51bWJlcgotICogQF9kaTogICAgICAgcG9pbnRlciB0byB0aGUgYWI4NTAwX2NoYXJnZXIgc3RydWN0dXJlCi0gKgotICogUmV0dXJucyBJUlEgc3RhdHVzKElSUV9IQU5ETEVEKQotICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgYWI4NTAwX2NoYXJnZXJfbWFpbmNocGx1Z2RldF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKl9kaSkKLXsKLQlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpID0gX2RpOwotCi0JZGV2X2RiZyhkaS0+ZGV2LCAiTWFpbiBjaGFyZ2VyIHBsdWdnZWRcbiIpOwotCXF1ZXVlX3dvcmsoZGktPmNoYXJnZXJfd3EsICZkaS0+YWNfd29yayk7Ci0KLQltdXRleF9sb2NrKCZkaS0+Y2hhcmdlcl9hdHRhY2hlZF9tdXRleCk7Ci0JbXV0ZXhfdW5sb2NrKCZkaS0+Y2hhcmdlcl9hdHRhY2hlZF9tdXRleCk7Ci0KLQlpZiAoaXNfYWI4NTAwKGRpLT5wYXJlbnQpKQotCQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmNoYXJnZXJfd3EsCi0JCQkgICAmZGktPmFjX2NoYXJnZXJfYXR0YWNoZWRfd29yaywKLQkJCSAgIEhaKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qKgotICogYWI4NTAwX2NoYXJnZXJfbWFpbmV4dGNobm90b2tfaGFuZGxlcigpIC0gbWFpbiBjaGFyZ2VyIG5vdCBvawotICogQGlycTogICAgICAgaW50ZXJydXB0IG51bWJlcgotICogQF9kaTogICAgICAgcG9pbnRlciB0byB0aGUgYWI4NTAwX2NoYXJnZXIgc3RydWN0dXJlCi0gKgotICogUmV0dXJucyBJUlEgc3RhdHVzKElSUV9IQU5ETEVEKQotICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgYWI4NTAwX2NoYXJnZXJfbWFpbmV4dGNobm90b2tfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpfZGkpCi17Ci0Jc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IF9kaTsKLQotCWRldl9kYmcoZGktPmRldiwgIk1haW4gY2hhcmdlciBub3Qgb2tcbiIpOwotCWRpLT5mbGFncy5tYWluZXh0Y2hub3RvayA9IHRydWU7Ci0JYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLCBkaS0+YWNfY2hnLnBzeSk7Ci0KLQkvKiBTY2hlZHVsZSBhIG5ldyBIVyBmYWlsdXJlIGNoZWNrICovCi0JcXVldWVfZGVsYXllZF93b3JrKGRpLT5jaGFyZ2VyX3dxLCAmZGktPmNoZWNrX2h3X2ZhaWx1cmVfd29yaywgMCk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qKgotICogYWI4NTAwX2NoYXJnZXJfbWFpbmNodGhwcm90cl9oYW5kbGVyKCkgLSBEaWUgdGVtcCBpcyBhYm92ZSBtYWluIGNoYXJnZXIKLSAqIHRoZXJtYWwgcHJvdGVjdGlvbiB0aHJlc2hvbGQKLSAqIEBpcnE6ICAgICAgIGludGVycnVwdCBudW1iZXIKLSAqIEBfZGk6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGFiODUwMF9jaGFyZ2VyIHN0cnVjdHVyZQotICoKLSAqIFJldHVybnMgSVJRIHN0YXR1cyhJUlFfSEFORExFRCkKLSAqLwotc3RhdGljIGlycXJldHVybl90IGFiODUwMF9jaGFyZ2VyX21haW5jaHRocHJvdHJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpfZGkpCi17Ci0Jc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IF9kaTsKLQotCWRldl9kYmcoZGktPmRldiwKLQkJIkRpZSB0ZW1wIGFib3ZlIE1haW4gY2hhcmdlciB0aGVybWFsIHByb3RlY3Rpb24gdGhyZXNob2xkXG4iKTsKLQlxdWV1ZV93b3JrKGRpLT5jaGFyZ2VyX3dxLCAmZGktPmNoZWNrX21haW5fdGhlcm1hbF9wcm90X3dvcmspOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKioKLSAqIGFiODUwMF9jaGFyZ2VyX21haW5jaHRocHJvdGZfaGFuZGxlcigpIC0gRGllIHRlbXAgaXMgYmVsb3cgbWFpbiBjaGFyZ2VyCi0gKiB0aGVybWFsIHByb3RlY3Rpb24gdGhyZXNob2xkCi0gKiBAaXJxOiAgICAgICBpbnRlcnJ1cHQgbnVtYmVyCi0gKiBAX2RpOiAgICAgICBwb2ludGVyIHRvIHRoZSBhYjg1MDBfY2hhcmdlciBzdHJ1Y3R1cmUKLSAqCi0gKiBSZXR1cm5zIElSUSBzdGF0dXMoSVJRX0hBTkRMRUQpCi0gKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBhYjg1MDBfY2hhcmdlcl9tYWluY2h0aHByb3RmX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqX2RpKQotewotCXN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGkgPSBfZGk7Ci0KLQlkZXZfZGJnKGRpLT5kZXYsCi0JCSJEaWUgdGVtcCBvayBmb3IgTWFpbiBjaGFyZ2VyIHRoZXJtYWwgcHJvdGVjdGlvbiB0aHJlc2hvbGRcbiIpOwotCXF1ZXVlX3dvcmsoZGktPmNoYXJnZXJfd3EsICZkaS0+Y2hlY2tfbWFpbl90aGVybWFsX3Byb3Rfd29yayk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGFiODUwMF9jaGFyZ2VyX3ZidXNfZHJvcF9lbmRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IGNvbnRhaW5lcl9vZih3b3JrLAotCQlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIsIHZidXNfZHJvcF9lbmRfd29yay53b3JrKTsKLQlpbnQgcmV0LCBjdXJyOwotCXU4IHJlZ192YWx1ZTsKLQotCWRpLT5mbGFncy52YnVzX2Ryb3BfZW5kID0gZmFsc2U7Ci0KLQkvKiBSZXNldCB0aGUgZHJvcCBjb3VudGVyICovCi0JYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCi0JCQkJICBBQjg1MDBfQ0hBUkdFUiwgQUI4NTAwX0NIQVJHRVJfQ1RSTCwgMHgwMSk7Ci0KLQlpZiAoaXNfYWI4NTQwKGRpLT5wYXJlbnQpKQotCQlyZXQgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX0NIQVJHRVIsCi0JCQkJQUI4NTQwX0NIX1VTQkNIX1NUQVQzX1JFRywgJnJlZ192YWx1ZSk7Ci0JZWxzZQotCQlyZXQgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX0NIQVJHRVIsCi0JCQkJQUI4NTAwX0NIX1VTQkNIX1NUQVQyX1JFRywgJnJlZ192YWx1ZSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgcmVhZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChpc19hYjg1NDAoZGktPnBhcmVudCkpCi0JCWN1cnIgPSBkaS0+Ym0tPmNoZ19pbnB1dF9jdXJyWwotCQkJcmVnX3ZhbHVlICYgQUI4NTQwX0FVVE9fVkJVU19JTl9DVVJSX01BU0tdOwotCWVsc2UKLQkJY3VyciA9IGRpLT5ibS0+Y2hnX2lucHV0X2N1cnJbCi0JCQlyZWdfdmFsdWUgPj4gQVVUT19WQlVTX0lOX0NVUlJfTElNX1NISUZUXTsKLQotCWlmIChkaS0+bWF4X3VzYl9pbl9jdXJyLmNhbGN1bGF0ZWRfbWF4ICE9IGN1cnIpIHsKLQkJLyogVVNCIHNvdXJjZSBpcyBjb2xsYXBzaW5nICovCi0JCWRpLT5tYXhfdXNiX2luX2N1cnIuY2FsY3VsYXRlZF9tYXggPSBjdXJyOwotCQlkZXZfZGJnKGRpLT5kZXYsCi0JCQkgIlZCVVMgaW5wdXQgY3VycmVudCBsaW1pdGluZyB0byAlZCBtQVxuIiwKLQkJCSBkaS0+bWF4X3VzYl9pbl9jdXJyLmNhbGN1bGF0ZWRfbWF4KTsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBVU0Igc291cmNlIGNhbiBub3QgZ2l2ZSBtb3JlIHRoYW4gdGhpcyBhbW91bnQuCi0JCSAqIFRha2luZyBtb3JlIHdpbGwgY29sbGFwc2UgdGhlIHNvdXJjZS4KLQkJICovCi0JCWRpLT5tYXhfdXNiX2luX2N1cnIuc2V0X21heCA9Ci0JCQlkaS0+bWF4X3VzYl9pbl9jdXJyLmNhbGN1bGF0ZWRfbWF4OwotCQlkZXZfZGJnKGRpLT5kZXYsCi0JCQkgIlZCVVMgaW5wdXQgY3VycmVudCBsaW1pdGVkIHRvICVkIG1BXG4iLAotCQkJIGRpLT5tYXhfdXNiX2luX2N1cnIuc2V0X21heCk7Ci0JfQotCi0JaWYgKGRpLT51c2IuY2hhcmdlcl9jb25uZWN0ZWQpCi0JCWFiODUwMF9jaGFyZ2VyX3NldF92YnVzX2luX2N1cnIoZGksCi0JCQkJCWRpLT5tYXhfdXNiX2luX2N1cnIudXNiX3R5cGVfbWF4KTsKLX0KLQotLyoqCi0gKiBhYjg1MDBfY2hhcmdlcl92YnVzZGV0Zl9oYW5kbGVyKCkgLSBWQlVTIGZhbGxpbmcgZGV0ZWN0ZWQKLSAqIEBpcnE6ICAgICAgIGludGVycnVwdCBudW1iZXIKLSAqIEBfZGk6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGFiODUwMF9jaGFyZ2VyIHN0cnVjdHVyZQotICoKLSAqIFJldHVybnMgSVJRIHN0YXR1cyhJUlFfSEFORExFRCkKLSAqLwotc3RhdGljIGlycXJldHVybl90IGFiODUwMF9jaGFyZ2VyX3ZidXNkZXRmX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqX2RpKQotewotCXN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGkgPSBfZGk7Ci0KLQlkaS0+dmJ1c19kZXRlY3RlZCA9IGZhbHNlOwotCWRldl9kYmcoZGktPmRldiwgIlZCVVMgZmFsbGluZyBkZXRlY3RlZFxuIik7Ci0JcXVldWVfd29yayhkaS0+Y2hhcmdlcl93cSwgJmRpLT5kZXRlY3RfdXNiX3R5cGVfd29yayk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qKgotICogYWI4NTAwX2NoYXJnZXJfdmJ1c2RldHJfaGFuZGxlcigpIC0gVkJVUyByaXNpbmcgZGV0ZWN0ZWQKLSAqIEBpcnE6ICAgICAgIGludGVycnVwdCBudW1iZXIKLSAqIEBfZGk6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGFiODUwMF9jaGFyZ2VyIHN0cnVjdHVyZQotICoKLSAqIFJldHVybnMgSVJRIHN0YXR1cyhJUlFfSEFORExFRCkKLSAqLwotc3RhdGljIGlycXJldHVybl90IGFiODUwMF9jaGFyZ2VyX3ZidXNkZXRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqX2RpKQotewotCXN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGkgPSBfZGk7Ci0KLQlkaS0+dmJ1c19kZXRlY3RlZCA9IHRydWU7Ci0JZGV2X2RiZyhkaS0+ZGV2LCAiVkJVUyByaXNpbmcgZGV0ZWN0ZWRcbiIpOwotCi0JcXVldWVfd29yayhkaS0+Y2hhcmdlcl93cSwgJmRpLT5kZXRlY3RfdXNiX3R5cGVfd29yayk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qKgotICogYWI4NTAwX2NoYXJnZXJfdXNibGlua3N0YXR1c19oYW5kbGVyKCkgLSBVU0IgbGluayBzdGF0dXMgaGFzIGNoYW5nZWQKLSAqIEBpcnE6ICAgICAgIGludGVycnVwdCBudW1iZXIKLSAqIEBfZGk6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGFiODUwMF9jaGFyZ2VyIHN0cnVjdHVyZQotICoKLSAqIFJldHVybnMgSVJRIHN0YXR1cyhJUlFfSEFORExFRCkKLSAqLwotc3RhdGljIGlycXJldHVybl90IGFiODUwMF9jaGFyZ2VyX3VzYmxpbmtzdGF0dXNfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpfZGkpCi17Ci0Jc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IF9kaTsKLQotCWRldl9kYmcoZGktPmRldiwgIlVTQiBsaW5rIHN0YXR1cyBjaGFuZ2VkXG4iKTsKLQotCXF1ZXVlX3dvcmsoZGktPmNoYXJnZXJfd3EsICZkaS0+dXNiX2xpbmtfc3RhdHVzX3dvcmspOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKioKLSAqIGFiODUwMF9jaGFyZ2VyX3VzYmNodGhwcm90cl9oYW5kbGVyKCkgLSBEaWUgdGVtcCBpcyBhYm92ZSB1c2IgY2hhcmdlcgotICogdGhlcm1hbCBwcm90ZWN0aW9uIHRocmVzaG9sZAotICogQGlycTogICAgICAgaW50ZXJydXB0IG51bWJlcgotICogQF9kaTogICAgICAgcG9pbnRlciB0byB0aGUgYWI4NTAwX2NoYXJnZXIgc3RydWN0dXJlCi0gKgotICogUmV0dXJucyBJUlEgc3RhdHVzKElSUV9IQU5ETEVEKQotICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgYWI4NTAwX2NoYXJnZXJfdXNiY2h0aHByb3RyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqX2RpKQotewotCXN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGkgPSBfZGk7Ci0KLQlkZXZfZGJnKGRpLT5kZXYsCi0JCSJEaWUgdGVtcCBhYm92ZSBVU0IgY2hhcmdlciB0aGVybWFsIHByb3RlY3Rpb24gdGhyZXNob2xkXG4iKTsKLQlxdWV1ZV93b3JrKGRpLT5jaGFyZ2VyX3dxLCAmZGktPmNoZWNrX3VzYl90aGVybWFsX3Byb3Rfd29yayk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qKgotICogYWI4NTAwX2NoYXJnZXJfdXNiY2h0aHByb3RmX2hhbmRsZXIoKSAtIERpZSB0ZW1wIGlzIGJlbG93IHVzYiBjaGFyZ2VyCi0gKiB0aGVybWFsIHByb3RlY3Rpb24gdGhyZXNob2xkCi0gKiBAaXJxOiAgICAgICBpbnRlcnJ1cHQgbnVtYmVyCi0gKiBAX2RpOiAgICAgICBwb2ludGVyIHRvIHRoZSBhYjg1MDBfY2hhcmdlciBzdHJ1Y3R1cmUKLSAqCi0gKiBSZXR1cm5zIElSUSBzdGF0dXMoSVJRX0hBTkRMRUQpCi0gKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBhYjg1MDBfY2hhcmdlcl91c2JjaHRocHJvdGZfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpfZGkpCi17Ci0Jc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IF9kaTsKLQotCWRldl9kYmcoZGktPmRldiwKLQkJIkRpZSB0ZW1wIG9rIGZvciBVU0IgY2hhcmdlciB0aGVybWFsIHByb3RlY3Rpb24gdGhyZXNob2xkXG4iKTsKLQlxdWV1ZV93b3JrKGRpLT5jaGFyZ2VyX3dxLCAmZGktPmNoZWNrX3VzYl90aGVybWFsX3Byb3Rfd29yayk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qKgotICogYWI4NTAwX2NoYXJnZXJfdXNiY2hhcmdlcm5vdG9rcl9oYW5kbGVyKCkgLSBVU0IgY2hhcmdlciBub3Qgb2sgZGV0ZWN0ZWQKLSAqIEBpcnE6ICAgICAgIGludGVycnVwdCBudW1iZXIKLSAqIEBfZGk6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGFiODUwMF9jaGFyZ2VyIHN0cnVjdHVyZQotICoKLSAqIFJldHVybnMgSVJRIHN0YXR1cyhJUlFfSEFORExFRCkKLSAqLwotc3RhdGljIGlycXJldHVybl90IGFiODUwMF9jaGFyZ2VyX3VzYmNoYXJnZXJub3Rva3JfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpfZGkpCi17Ci0Jc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IF9kaTsKLQotCWRldl9kYmcoZGktPmRldiwgIk5vdCBhbGxvd2VkIFVTQiBjaGFyZ2VyIGRldGVjdGVkXG4iKTsKLQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmNoYXJnZXJfd3EsICZkaS0+Y2hlY2tfdXNiY2hnbm90b2tfd29yaywgMCk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qKgotICogYWI4NTAwX2NoYXJnZXJfY2h3ZGV4cF9oYW5kbGVyKCkgLSBDaGFyZ2VyIHdhdGNoZG9nIGV4cGlyZWQKLSAqIEBpcnE6ICAgICAgIGludGVycnVwdCBudW1iZXIKLSAqIEBfZGk6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGFiODUwMF9jaGFyZ2VyIHN0cnVjdHVyZQotICoKLSAqIFJldHVybnMgSVJRIHN0YXR1cyhJUlFfSEFORExFRCkKLSAqLwotc3RhdGljIGlycXJldHVybl90IGFiODUwMF9jaGFyZ2VyX2Nod2RleHBfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpfZGkpCi17Ci0Jc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IF9kaTsKLQotCWRldl9kYmcoZGktPmRldiwgIkNoYXJnZXIgd2F0Y2hkb2cgZXhwaXJlZFxuIik7Ci0KLQkvKgotCSAqIFRoZSBjaGFyZ2VyIHRoYXQgd2FzIG9ubGluZSB3aGVuIHRoZSB3YXRjaGRvZyBleHBpcmVkCi0JICogbmVlZHMgdG8gYmUgcmVzdGFydGVkIGZvciBjaGFyZ2luZyB0byBzdGFydCBhZ2FpbgotCSAqLwotCWlmIChkaS0+YWMuY2hhcmdlcl9vbmxpbmUpIHsKLQkJZGktPmFjLndkX2V4cGlyZWQgPSB0cnVlOwotCQlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksIGRpLT5hY19jaGcucHN5KTsKLQl9Ci0JaWYgKGRpLT51c2IuY2hhcmdlcl9vbmxpbmUpIHsKLQkJZGktPnVzYi53ZF9leHBpcmVkID0gdHJ1ZTsKLQkJYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLCBkaS0+dXNiX2NoZy5wc3kpOwotCX0KLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotLyoqCi0gKiBhYjg1MDBfY2hhcmdlcl92YnVzY2hkcm9wZW5kX2hhbmRsZXIoKSAtIFZCVVMgZHJvcCByZW1vdmVkCi0gKiBAaXJxOiAgICAgICBpbnRlcnJ1cHQgbnVtYmVyCi0gKiBAX2RpOiAgICAgICBwb2ludGVyIHRvIHRoZSBhYjg1MDBfY2hhcmdlciBzdHJ1Y3R1cmUKLSAqCi0gKiBSZXR1cm5zIElSUSBzdGF0dXMoSVJRX0hBTkRMRUQpCi0gKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBhYjg1MDBfY2hhcmdlcl92YnVzY2hkcm9wZW5kX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqX2RpKQotewotCXN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGkgPSBfZGk7Ci0KLQlkZXZfZGJnKGRpLT5kZXYsICJWQlVTIGNoYXJnZXIgZHJvcCBlbmRlZFxuIik7Ci0JZGktPmZsYWdzLnZidXNfZHJvcF9lbmQgPSB0cnVlOwotCi0JLyoKLQkgKiBWQlVTIG1pZ2h0IGhhdmUgZHJvcHBlZCBkdWUgdG8gYmFkIGNvbm5lY3Rpb24uCi0JICogU2NoZWR1bGUgYSBuZXcgaW5wdXQgbGltaXQgc2V0IHRvIHRoZSB2YWx1ZSBTVyByZXF1ZXN0cy4KLQkgKi8KLQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmNoYXJnZXJfd3EsICZkaS0+dmJ1c19kcm9wX2VuZF93b3JrLAotCQkJICAgcm91bmRfamlmZmllcyhWQlVTX0lOX0NVUlJfTElNX1JFVFJZX1NFVF9USU1FICogSFopKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotLyoqCi0gKiBhYjg1MDBfY2hhcmdlcl92YnVzb3Z2X2hhbmRsZXIoKSAtIFZCVVMgb3ZlcnZvbHRhZ2UgZGV0ZWN0ZWQKLSAqIEBpcnE6ICAgICAgIGludGVycnVwdCBudW1iZXIKLSAqIEBfZGk6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGFiODUwMF9jaGFyZ2VyIHN0cnVjdHVyZQotICoKLSAqIFJldHVybnMgSVJRIHN0YXR1cyhJUlFfSEFORExFRCkKLSAqLwotc3RhdGljIGlycXJldHVybl90IGFiODUwMF9jaGFyZ2VyX3ZidXNvdnZfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpfZGkpCi17Ci0Jc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IF9kaTsKLQotCWRldl9kYmcoZGktPmRldiwgIlZCVVMgb3ZlcnZvbHRhZ2UgZGV0ZWN0ZWRcbiIpOwotCWRpLT5mbGFncy52YnVzX292diA9IHRydWU7Ci0JYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLCBkaS0+dXNiX2NoZy5wc3kpOwotCi0JLyogU2NoZWR1bGUgYSBuZXcgSFcgZmFpbHVyZSBjaGVjayAqLwotCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Y2hhcmdlcl93cSwgJmRpLT5jaGVja19od19mYWlsdXJlX3dvcmssIDApOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKioKLSAqIGFiODUwMF9jaGFyZ2VyX2FjX2dldF9wcm9wZXJ0eSgpIC0gZ2V0IHRoZSBhYy9tYWlucyBwcm9wZXJ0aWVzCi0gKiBAcHN5OiAgICAgICBwb2ludGVyIHRvIHRoZSBwb3dlcl9zdXBwbHkgc3RydWN0dXJlCi0gKiBAcHNwOiAgICAgICBwb2ludGVyIHRvIHRoZSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgc3RydWN0dXJlCi0gKiBAdmFsOiAgICAgICBwb2ludGVyIHRvIHRoZSBwb3dlcl9zdXBwbHlfcHJvcHZhbCB1bmlvbgotICoKLSAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgd2hlbiBhbiBhcHBsaWNhdGlvbiB0cmllcyB0byBnZXQgdGhlIGFjL21haW5zCi0gKiBwcm9wZXJ0aWVzIGJ5IHJlYWRpbmcgdGhlIHN5c2ZzIGZpbGVzLgotICogQUMvTWFpbnMgcHJvcGVydGllcyBhcmUgb25saW5lLCBwcmVzZW50IGFuZCB2b2x0YWdlLgotICogb25saW5lOiAgICAgYWMvbWFpbnMgY2hhcmdpbmcgaXMgaW4gcHJvZ3Jlc3Mgb3Igbm90Ci0gKiBwcmVzZW50OiAgICBwcmVzZW5jZSBvZiB0aGUgYWMvbWFpbnMKLSAqIHZvbHRhZ2U6ICAgIEFDL01haW5zIHZvbHRhZ2UKLSAqIFJldHVybnMgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUgZWxzZSAwKG9uIHN1Y2Nlc3MpCi0gKi8KLXN0YXRpYyBpbnQgYWI4NTAwX2NoYXJnZXJfYWNfZ2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKLQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCi0JdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKLXsKLQlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpOwotCWludCByZXQ7Ci0KLQlkaSA9IHRvX2FiODUwMF9jaGFyZ2VyX2FjX2RldmljZV9pbmZvKHBzeV90b191eDUwMF9jaGFyZ2VyKHBzeSkpOwotCi0Jc3dpdGNoIChwc3ApIHsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSDoKLQkJaWYgKGRpLT5mbGFncy5tYWluZXh0Y2hub3RvaykKLQkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9VTlNQRUNfRkFJTFVSRTsKLQkJZWxzZSBpZiAoZGktPmFjLndkX2V4cGlyZWQgfHwgZGktPnVzYi53ZF9leHBpcmVkKQotCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0RFQUQ7Ci0JCWVsc2UgaWYgKGRpLT5mbGFncy5tYWluX3RoZXJtYWxfcHJvdCkKLQkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSSEVBVDsKLQkJZWxzZQotCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0Q7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FOgotCQl2YWwtPmludHZhbCA9IGRpLT5hYy5jaGFyZ2VyX29ubGluZTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOgotCQl2YWwtPmludHZhbCA9IGRpLT5hYy5jaGFyZ2VyX2Nvbm5lY3RlZDsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKLQkJcmV0ID0gYWI4NTAwX2NoYXJnZXJfZ2V0X2FjX3ZvbHRhZ2UoZGkpOwotCQlpZiAocmV0ID49IDApCi0JCQlkaS0+YWMuY2hhcmdlcl92b2x0YWdlID0gcmV0OwotCQkvKiBPbiBlcnJvciwgdXNlIHByZXZpb3VzIHZhbHVlICovCi0JCXZhbC0+aW50dmFsID0gZGktPmFjLmNoYXJnZXJfdm9sdGFnZSAqIDEwMDA7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9BVkc6Ci0JCS8qCi0JCSAqIFRoaXMgcHJvcGVydHkgaXMgdXNlZCB0byBpbmRpY2F0ZSB3aGVuIENWIG1vZGUgaXMgZW50ZXJlZAotCQkgKiBmb3IgdGhlIEFDIGNoYXJnZXIKLQkJICovCi0JCWRpLT5hYy5jdl9hY3RpdmUgPSBhYjg1MDBfY2hhcmdlcl9hY19jdihkaSk7Ci0JCXZhbC0+aW50dmFsID0gZGktPmFjLmN2X2FjdGl2ZTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVzoKLQkJcmV0ID0gYWI4NTAwX2NoYXJnZXJfZ2V0X2FjX2N1cnJlbnQoZGkpOwotCQlpZiAocmV0ID49IDApCi0JCQlkaS0+YWMuY2hhcmdlcl9jdXJyZW50ID0gcmV0OwotCQl2YWwtPmludHZhbCA9IGRpLT5hYy5jaGFyZ2VyX2N1cnJlbnQgKiAxMDAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogYWI4NTAwX2NoYXJnZXJfdXNiX2dldF9wcm9wZXJ0eSgpIC0gZ2V0IHRoZSB1c2IgcHJvcGVydGllcwotICogQHBzeTogICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvd2VyX3N1cHBseSBzdHJ1Y3R1cmUKLSAqIEBwc3A6ICAgICAgICBwb2ludGVyIHRvIHRoZSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgc3RydWN0dXJlCi0gKiBAdmFsOiAgICAgICAgcG9pbnRlciB0byB0aGUgcG93ZXJfc3VwcGx5X3Byb3B2YWwgdW5pb24KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIHdoZW4gYW4gYXBwbGljYXRpb24gdHJpZXMgdG8gZ2V0IHRoZSB1c2IKLSAqIHByb3BlcnRpZXMgYnkgcmVhZGluZyB0aGUgc3lzZnMgZmlsZXMuCi0gKiBVU0IgcHJvcGVydGllcyBhcmUgb25saW5lLCBwcmVzZW50IGFuZCB2b2x0YWdlLgotICogb25saW5lOiAgICAgdXNiIGNoYXJnaW5nIGlzIGluIHByb2dyZXNzIG9yIG5vdAotICogcHJlc2VudDogICAgcHJlc2VuY2Ugb2YgdGhlIHVzYgotICogdm9sdGFnZTogICAgdmJ1cyB2b2x0YWdlCi0gKiBSZXR1cm5zIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlIGVsc2UgMChvbiBzdWNjZXNzKQotICovCi1zdGF0aWMgaW50IGFiODUwMF9jaGFyZ2VyX3VzYl9nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAotCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKLQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQotewotCXN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGk7Ci0JaW50IHJldDsKLQotCWRpID0gdG9fYWI4NTAwX2NoYXJnZXJfdXNiX2RldmljZV9pbmZvKHBzeV90b191eDUwMF9jaGFyZ2VyKHBzeSkpOwotCi0Jc3dpdGNoIChwc3ApIHsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSDoKLQkJaWYgKGRpLT5mbGFncy51c2JjaGFyZ2Vybm90b2spCi0JCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfVU5TUEVDX0ZBSUxVUkU7Ci0JCWVsc2UgaWYgKGRpLT5hYy53ZF9leHBpcmVkIHx8IGRpLT51c2Iud2RfZXhwaXJlZCkKLQkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9ERUFEOwotCQllbHNlIGlmIChkaS0+ZmxhZ3MudXNiX3RoZXJtYWxfcHJvdCkKLQkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSSEVBVDsKLQkJZWxzZSBpZiAoZGktPmZsYWdzLnZidXNfb3Z2KQotCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJWT0xUQUdFOwotCQllbHNlCi0JCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfR09PRDsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkU6Ci0JCXZhbC0+aW50dmFsID0gZGktPnVzYi5jaGFyZ2VyX29ubGluZTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOgotCQl2YWwtPmludHZhbCA9IGRpLT51c2IuY2hhcmdlcl9jb25uZWN0ZWQ7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c6Ci0JCXJldCA9IGFiODUwMF9jaGFyZ2VyX2dldF92YnVzX3ZvbHRhZ2UoZGkpOwotCQlpZiAocmV0ID49IDApCi0JCQlkaS0+dXNiLmNoYXJnZXJfdm9sdGFnZSA9IHJldDsKLQkJdmFsLT5pbnR2YWwgPSBkaS0+dXNiLmNoYXJnZXJfdm9sdGFnZSAqIDEwMDA7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9BVkc6Ci0JCS8qCi0JCSAqIFRoaXMgcHJvcGVydHkgaXMgdXNlZCB0byBpbmRpY2F0ZSB3aGVuIENWIG1vZGUgaXMgZW50ZXJlZAotCQkgKiBmb3IgdGhlIFVTQiBjaGFyZ2VyCi0JCSAqLwotCQlkaS0+dXNiLmN2X2FjdGl2ZSA9IGFiODUwMF9jaGFyZ2VyX3VzYl9jdihkaSk7Ci0JCXZhbC0+aW50dmFsID0gZGktPnVzYi5jdl9hY3RpdmU7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1c6Ci0JCXJldCA9IGFiODUwMF9jaGFyZ2VyX2dldF91c2JfY3VycmVudChkaSk7Ci0JCWlmIChyZXQgPj0gMCkKLQkJCWRpLT51c2IuY2hhcmdlcl9jdXJyZW50ID0gcmV0OwotCQl2YWwtPmludHZhbCA9IGRpLT51c2IuY2hhcmdlcl9jdXJyZW50ICogMTAwMDsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX0FWRzoKLQkJLyoKLQkJICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGluZGljYXRlIHdoZW4gVkJVUyBoYXMgY29sbGFwc2VkCi0JCSAqIGR1ZSB0byB0b28gaGlnaCBvdXRwdXQgY3VycmVudCBmcm9tIHRoZSBVU0IgY2hhcmdlcgotCQkgKi8KLQkJaWYgKGRpLT5mbGFncy52YnVzX2NvbGxhcHNlKQotCQkJdmFsLT5pbnR2YWwgPSAxOwotCQllbHNlCi0JCQl2YWwtPmludHZhbCA9IDA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBhYjg1MDBfY2hhcmdlcl9pbml0X2h3X3JlZ2lzdGVycygpIC0gU2V0IHVwIGNoYXJnZXIgcmVsYXRlZCByZWdpc3RlcnMKLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9jaGFyZ2VyIHN0cnVjdHVyZQotICoKLSAqIFNldCB1cCBjaGFyZ2VyIE9WViwgd2F0Y2hkb2cgYW5kIG1heGltdW0gdm9sdGFnZSByZWdpc3RlcnMgYXMgd2VsbCBhcwotICogY2hhcmdpbmcgb2YgdGhlIGJhY2t1cCBiYXR0ZXJ5Ci0gKi8KLXN0YXRpYyBpbnQgYWI4NTAwX2NoYXJnZXJfaW5pdF9od19yZWdpc3RlcnMoc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSkKLXsKLQlpbnQgcmV0ID0gMDsKLQl1OCBidXBfdmNoX3JhbmdlID0gMCwgdmJ1cDMzX3ZydGNuID0gMDsKLQotCS8qIFNldHVwIG1heGltdW0gY2hhcmdlciBjdXJyZW50IGFuZCB2b2x0YWdlIGZvciBBQkIgY3V0Mi4wICovCi0JaWYgKCFpc19hYjg1MDBfMXAxX29yX2VhcmxpZXIoZGktPnBhcmVudCkpIHsKLQkJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCi0JCQlBQjg1MDBfQ0hBUkdFUiwKLQkJCUFCODUwMF9DSF9WT0xUX0xWTF9NQVhfUkVHLCBDSF9WT0xfTFZMXzRQNik7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoZGktPmRldiwKLQkJCQkiZmFpbGVkIHRvIHNldCBDSF9WT0xUX0xWTF9NQVhfUkVHXG4iKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJaWYgKGlzX2FiODU0MChkaS0+cGFyZW50KSkKLQkJCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAotCQkJCUFCODUwMF9DSEFSR0VSLCBBQjg1MDBfQ0hfT1BUX0NSTlRMVkxfTUFYX1JFRywKLQkJCQlDSF9PUF9DVVJfTFZMXzJQKTsKLQkJZWxzZQotCQkJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCi0JCQkJQUI4NTAwX0NIQVJHRVIsIEFCODUwMF9DSF9PUFRfQ1JOVExWTF9NQVhfUkVHLAotCQkJCUNIX09QX0NVUl9MVkxfMVA2KTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2VycihkaS0+ZGV2LAotCQkJCSJmYWlsZWQgdG8gc2V0IENIX09QVF9DUk5UTFZMX01BWF9SRUdcbiIpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KLQlpZiAoaXNfYWI5NTQwXzJwMChkaS0+cGFyZW50KSB8fCBpc19hYjk1NDBfM3AwKGRpLT5wYXJlbnQpCi0JIHx8IGlzX2FiODUwNV8ycDAoZGktPnBhcmVudCkgfHwgaXNfYWI4NTQwKGRpLT5wYXJlbnQpKQotCQlyZXQgPSBhYng1MDBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKLQkJCUFCODUwMF9DSEFSR0VSLAotCQkJQUI4NTAwX1VTQkNIX0NUUkwyX1JFRywKLQkJCVZCVVNfQVVUT19JTl9DVVJSX0xJTV9FTkEsCi0JCQlWQlVTX0FVVE9fSU5fQ1VSUl9MSU1fRU5BKTsKLQllbHNlCi0JCS8qCi0JCSAqIFZCVVMgT1ZWIHNldCB0byA2LjNWIGFuZCBlbmFibGUgYXV0b21hdGljIGN1cnJlbnQgbGltaXRhdGlvbgotCQkgKi8KLQkJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCi0JCQlBQjg1MDBfQ0hBUkdFUiwKLQkJCUFCODUwMF9VU0JDSF9DVFJMMl9SRUcsCi0JCQlWQlVTX09WVl9TRUxFQ1RfNlAzViB8IFZCVVNfQVVUT19JTl9DVVJSX0xJTV9FTkEpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihkaS0+ZGV2LAotCQkJImZhaWxlZCB0byBzZXQgYXV0b21hdGljIGN1cnJlbnQgbGltaXRhdGlvblxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIEVuYWJsZSBtYWluIHdhdGNoZG9nIGluIE9UUCAqLwotCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAotCQlBQjg1MDBfT1RQX0VNVUwsIEFCODUwMF9PVFBfQ09ORl8xNSwgT1RQX0VOQUJMRV9XRCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIG1haW4gV0QgaW4gT1RQXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogRW5hYmxlIG1haW4gd2F0Y2hkb2cgKi8KLQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKLQkJQUI4NTAwX1NZU19DVFJMMl9CTE9DSywKLQkJQUI4NTAwX01BSU5fV0RPR19DVFJMX1JFRywgTUFJTl9XRE9HX0VOQSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZSB0byBlbmFibGUgbWFpbiB3YXRjaGRvZ1xuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qCi0JICogRHVlIHRvIGludGVybmFsIHN5bmNocm9uaXNhdGlvbiwgRW5hYmxlIGFuZCBLaWNrIHdhdGNoZG9nIGJpdHMKLQkgKiBjYW5ub3QgYmUgZW5hYmxlZCBpbiBhIHNpbmdsZSB3cml0ZS4KLQkgKiBBIG1pbmltdW0gZGVsYXkgb2YgMiozMiBrSHogcGVyaW9kICg2Mi41wrVzKSBtdXN0IGJlIGluc2VydGVkCi0JICogYmV0d2VlbiB3cml0aW5nIEVuYWJsZSB0aGVuIEtpY2sgYml0cy4KLQkgKi8KLQl1ZGVsYXkoNjMpOwotCi0JLyogS2ljayBtYWluIHdhdGNoZG9nICovCi0JcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCi0JCUFCODUwMF9TWVNfQ1RSTDJfQkxPQ0ssCi0JCUFCODUwMF9NQUlOX1dET0dfQ1RSTF9SRUcsCi0JCShNQUlOX1dET0dfRU5BIHwgTUFJTl9XRE9HX0tJQ0spKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byBraWNrIG1haW4gd2F0Y2hkb2dcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBEaXNhYmxlIG1haW4gd2F0Y2hkb2cgKi8KLQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKLQkJQUI4NTAwX1NZU19DVFJMMl9CTE9DSywKLQkJQUI4NTAwX01BSU5fV0RPR19DVFJMX1JFRywgTUFJTl9XRE9HX0RJUyk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gZGlzYWJsZSBtYWluIHdhdGNoZG9nXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogU2V0IHdhdGNoZG9nIHRpbWVvdXQgKi8KLQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX0NIQVJHRVIsCi0JCUFCODUwMF9DSF9XRF9USU1FUl9SRUcsIFdEX1RJTUVSKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byBzZXQgY2hhcmdlciB3YXRjaGRvZyB0aW1lb3V0XG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmV0ID0gYWI4NTAwX2NoYXJnZXJfbGVkX2VuKGRpLCBmYWxzZSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIGRpc2FibGUgTEVEXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogQmFja3VwIGJhdHRlcnkgdm9sdGFnZSBhbmQgY3VycmVudCAqLwotCWlmIChkaS0+Ym0tPmJrdXBfYmF0X3YgPiBCVVBfVkNIX1NFTF8zUDFWKQotCQlidXBfdmNoX3JhbmdlID0gQlVQX1ZDSF9SQU5HRTsKLQlpZiAoZGktPmJtLT5ia3VwX2JhdF92ID09IEJVUF9WQ0hfU0VMXzNQM1YpCi0JCXZidXAzM192cnRjbiA9IFZCVVAzM19WUlRDTjsKLQotCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAotCQlBQjg1MDBfUlRDLAotCQlBQjg1MDBfUlRDX0JBQ0tVUF9DSEdfUkVHLAotCQkoZGktPmJtLT5ia3VwX2JhdF92ICYgMHgzKSB8IGRpLT5ibS0+Ymt1cF9iYXRfaSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gc2V0dXAgYmFja3VwIGJhdHRlcnkgY2hhcmdpbmdcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKGlzX2FiODU0MChkaS0+cGFyZW50KSkgewotCQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKLQkJCUFCODUwMF9SVEMsCi0JCQlBQjg1MDBfUlRDX0NUUkwxX1JFRywKLQkJCWJ1cF92Y2hfcmFuZ2UgfCB2YnVwMzNfdnJ0Y24pOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKGRpLT5kZXYsCi0JCQkJImZhaWxlZCB0byBzZXR1cCBiYWNrdXAgYmF0dGVyeSBjaGFyZ2luZ1xuIik7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQotCS8qIEVuYWJsZSBiYWNrdXAgYmF0dGVyeSBjaGFyZ2luZyAqLwotCWFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAotCQlBQjg1MDBfUlRDLCBBQjg1MDBfUlRDX0NUUkxfUkVHLAotCQlSVENfQlVQX0NIX0VOQSwgUlRDX0JVUF9DSF9FTkEpOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKGRpLT5kZXYsICIlcyBtYXNrIGFuZCBzZXQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoaXNfYWI4NTQwKGRpLT5wYXJlbnQpKSB7Ci0JCXJldCA9IGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAotCQkJQUI4NTAwX0NIQVJHRVIsIEFCODU0MF9VU0JfUFBfTU9ERV9SRUcsCi0JCQlCVVNfVlNZU19WT0xfU0VMRUNUX01BU0ssIEJVU19WU1lTX1ZPTF9TRUxFQ1RfM1A2Vik7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoZGktPmRldiwKLQkJCQkiZmFpbGVkIHRvIHNldHVwIHVzYiBwb3dlciBwYXRoIHZzeXMgdm9sdGFnZVxuIik7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlyZXQgPSBhYng1MDBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKLQkJCUFCODUwMF9DSEFSR0VSLCBBQjg1NDBfVVNCX1BQX0NIUl9SRUcsCi0JCQlCVVNfUFBfUFJFQ0hHX0NVUlJFTlRfTUFTSywgMCk7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoZGktPmRldiwKLQkJCQkiZmFpbGVkIHRvIHNldHVwIHVzYiBwb3dlciBwYXRoIHByZWNoYWdlIGN1cnJlbnRcbiIpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KLW91dDoKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogYWI4NTAwIGNoYXJnZXIgZHJpdmVyIGludGVycnVwdHMgYW5kIHRoZWlyIHJlc3BlY3RpdmUgaXNyCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgYWI4NTAwX2NoYXJnZXJfaW50ZXJydXB0cyBhYjg1MDBfY2hhcmdlcl9pcnFbXSA9IHsKLQl7Ik1BSU5fQ0hfVU5QTFVHX0RFVCIsIGFiODUwMF9jaGFyZ2VyX21haW5jaHVucGx1Z2RldF9oYW5kbGVyfSwKLQl7Ik1BSU5fQ0hBUkdFX1BMVUdfREVUIiwgYWI4NTAwX2NoYXJnZXJfbWFpbmNocGx1Z2RldF9oYW5kbGVyfSwKLQl7Ik1BSU5fRVhUX0NIX05PVF9PSyIsIGFiODUwMF9jaGFyZ2VyX21haW5leHRjaG5vdG9rX2hhbmRsZXJ9LAotCXsiTUFJTl9DSF9USF9QUk9UX1IiLCBhYjg1MDBfY2hhcmdlcl9tYWluY2h0aHByb3RyX2hhbmRsZXJ9LAotCXsiTUFJTl9DSF9USF9QUk9UX0YiLCBhYjg1MDBfY2hhcmdlcl9tYWluY2h0aHByb3RmX2hhbmRsZXJ9LAotCXsiVkJVU19ERVRfRiIsIGFiODUwMF9jaGFyZ2VyX3ZidXNkZXRmX2hhbmRsZXJ9LAotCXsiVkJVU19ERVRfUiIsIGFiODUwMF9jaGFyZ2VyX3ZidXNkZXRyX2hhbmRsZXJ9LAotCXsiVVNCX0xJTktfU1RBVFVTIiwgYWI4NTAwX2NoYXJnZXJfdXNibGlua3N0YXR1c19oYW5kbGVyfSwKLQl7IlVTQl9DSF9USF9QUk9UX1IiLCBhYjg1MDBfY2hhcmdlcl91c2JjaHRocHJvdHJfaGFuZGxlcn0sCi0JeyJVU0JfQ0hfVEhfUFJPVF9GIiwgYWI4NTAwX2NoYXJnZXJfdXNiY2h0aHByb3RmX2hhbmRsZXJ9LAotCXsiVVNCX0NIQVJHRVJfTk9UX09LUiIsIGFiODUwMF9jaGFyZ2VyX3VzYmNoYXJnZXJub3Rva3JfaGFuZGxlcn0sCi0JeyJWQlVTX09WViIsIGFiODUwMF9jaGFyZ2VyX3ZidXNvdnZfaGFuZGxlcn0sCi0JeyJDSF9XRF9FWFAiLCBhYjg1MDBfY2hhcmdlcl9jaHdkZXhwX2hhbmRsZXJ9LAotCXsiVkJVU19DSF9EUk9QX0VORCIsIGFiODUwMF9jaGFyZ2VyX3ZidXNjaGRyb3BlbmRfaGFuZGxlcn0sCi19OwotCi1zdGF0aWMgaW50IGFiODUwMF9jaGFyZ2VyX3VzYl9ub3RpZmllcl9jYWxsKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCi0JCXVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnBvd2VyKQotewotCXN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGkgPQotCQljb250YWluZXJfb2YobmIsIHN0cnVjdCBhYjg1MDBfY2hhcmdlciwgbmIpOwotCWVudW0gYWI4NTAwX3VzYl9zdGF0ZSBibV91c2Jfc3RhdGU7Ci0JdW5zaWduZWQgbUEgPSAqKCh1bnNpZ25lZCAqKXBvd2VyKTsKLQotCWlmICghZGkpCi0JCXJldHVybiBOT1RJRllfRE9ORTsKLQotCWlmIChldmVudCAhPSBVU0JfRVZFTlRfVkJVUykgewotCQlkZXZfZGJnKGRpLT5kZXYsICJub3QgYSBzdGFuZGFyZCBob3N0LCByZXR1cm5pbmdcbiIpOwotCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0JfQotCi0JLyogVE9ETzogU3RhdGUgaXMgZmFicmljYXRlICBoZXJlLiBTZWUgaWYgY2hhcmdlciByZWFsbHkgbmVlZHMgVVNCCi0JICogc3RhdGUgb3IgaWYgbUEgaXMgZW5vdWdoCi0JICovCi0JaWYgKChkaS0+dXNiX3N0YXRlLnVzYl9jdXJyZW50ID09IDIpICYmIChtQSA+IDIpKQotCQlibV91c2Jfc3RhdGUgPSBBQjg1MDBfQk1fVVNCX1NUQVRFX1JFU1VNRTsKLQllbHNlIGlmIChtQSA9PSAwKQotCQlibV91c2Jfc3RhdGUgPSBBQjg1MDBfQk1fVVNCX1NUQVRFX1JFU0VUX0hTOwotCWVsc2UgaWYgKG1BID09IDIpCi0JCWJtX3VzYl9zdGF0ZSA9IEFCODUwMF9CTV9VU0JfU1RBVEVfU1VTUEVORDsKLQllbHNlIGlmIChtQSA+PSA4KSAvKiA4LCAxMDAsIDUwMCAqLwotCQlibV91c2Jfc3RhdGUgPSBBQjg1MDBfQk1fVVNCX1NUQVRFX0NPTkZJR1VSRUQ7Ci0JZWxzZSAvKiBTaG91bGQgbmV2ZXIgb2NjdXIgKi8KLQkJYm1fdXNiX3N0YXRlID0gQUI4NTAwX0JNX1VTQl9TVEFURV9SRVNFVF9GUzsKLQotCWRldl9kYmcoZGktPmRldiwgIiVzIHVzYl9zdGF0ZTogMHglMDJ4IG1BOiAlZFxuIiwKLQkJX19mdW5jX18sIGJtX3VzYl9zdGF0ZSwgbUEpOwotCi0Jc3Bpbl9sb2NrKCZkaS0+dXNiX3N0YXRlLnVzYl9sb2NrKTsKLQlkaS0+dXNiX3N0YXRlLnN0YXRlX3RtcCA9IGJtX3VzYl9zdGF0ZTsKLQlkaS0+dXNiX3N0YXRlLnVzYl9jdXJyZW50X3RtcCA9IG1BOwotCXNwaW5fdW5sb2NrKCZkaS0+dXNiX3N0YXRlLnVzYl9sb2NrKTsKLQotCS8qCi0JICogd2FpdCBmb3Igc29tZSB0aW1lIHVudGlsIHlvdSBnZXQgdXBkYXRlcyBmcm9tIHRoZSB1c2Igc3RhY2sKLQkgKiBhbmQgbmVnb3RpYXRpb25zIGFyZSBjb21wbGV0ZWQKLQkgKi8KLQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmNoYXJnZXJfd3EsICZkaS0+dXNiX3N0YXRlX2NoYW5nZWRfd29yaywgSFovMik7Ci0KLQlyZXR1cm4gTk9USUZZX09LOwotfQotCi0jaWYgZGVmaW5lZChDT05GSUdfUE0pCi1zdGF0aWMgaW50IGFiODUwMF9jaGFyZ2VyX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCByZXQ7Ci0Jc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JLyoKLQkgKiBGb3IgQUJCIHJldmlzaW9uIDEuMCBhbmQgMS4xIHRoZXJlIGlzIGEgYnVnIGluIHRoZSB3YXRjaGRvZwotCSAqIGxvZ2ljLiBUaGF0IG1lYW5zIHdlIGhhdmUgdG8gY29udGlub3VzbHkga2ljayB0aGUgY2hhcmdlcgotCSAqIHdhdGNoZG9nIGV2ZW4gd2hlbiBubyBjaGFyZ2VyIGlzIGNvbm5lY3RlZC4gVGhpcyBpcyBvbmx5Ci0JICogdmFsaWQgb25jZSB0aGUgQUMgY2hhcmdlciBoYXMgYmVlbiBlbmFibGVkLiBUaGlzIGlzCi0JICogYSBidWcgdGhhdCBpcyBub3QgaGFuZGxlZCBieSB0aGUgYWxnb3JpdGhtIGFuZCB0aGUKLQkgKiB3YXRjaGRvZyBoYXZlIHRvIGJlIGtpY2tlZCBieSB0aGUgY2hhcmdlciBkcml2ZXIKLQkgKiB3aGVuIHRoZSBBQyBjaGFyZ2VyIGlzIGRpc2FibGVkCi0JICovCi0JaWYgKGRpLT5hY19jb25uICYmIGlzX2FiODUwMF8xcDFfb3JfZWFybGllcihkaS0+cGFyZW50KSkgewotCQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX0NIQVJHRVIsCi0JCQlBQjg1MDBfQ0hBUkdfV0RfQ1RSTCwgQ0hBUkdfV0RfS0lDSyk7Ci0JCWlmIChyZXQpCi0JCQlkZXZfZXJyKGRpLT5kZXYsICJGYWlsZWQgdG8ga2ljayBXRCFcbiIpOwotCi0JCS8qIElmIG5vdCBhbHJlYWR5IHBlbmRpbmcgc3RhcnQgYSBuZXcgdGltZXIgKi8KLQkJcXVldWVfZGVsYXllZF93b3JrKGRpLT5jaGFyZ2VyX3dxLCAmZGktPmtpY2tfd2Rfd29yaywKLQkJCQkgICByb3VuZF9qaWZmaWVzKFdEX0tJQ0tfSU5URVJWQUwpKTsKLQl9Ci0KLQkvKiBJZiB3ZSBzdGlsbCBoYXZlIGEgSFcgZmFpbHVyZSwgc2NoZWR1bGUgYSBuZXcgY2hlY2sgKi8KLQlpZiAoZGktPmZsYWdzLm1haW5leHRjaG5vdG9rIHx8IGRpLT5mbGFncy52YnVzX292dikgewotCQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmNoYXJnZXJfd3EsCi0JCQkmZGktPmNoZWNrX2h3X2ZhaWx1cmVfd29yaywgMCk7Ci0JfQotCi0JaWYgKGRpLT5mbGFncy52YnVzX2Ryb3BfZW5kKQotCQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmNoYXJnZXJfd3EsICZkaS0+dmJ1c19kcm9wX2VuZF93b3JrLCAwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFiODUwMF9jaGFyZ2VyX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQlwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0Jc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JLyogQ2FuY2VsIGFueSBwZW5kaW5nIGpvYnMgKi8KLQljYW5jZWxfZGVsYXllZF93b3JrKCZkaS0+Y2hlY2tfaHdfZmFpbHVyZV93b3JrKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZkaS0+dmJ1c19kcm9wX2VuZF93b3JrKTsKLQotCWZsdXNoX2RlbGF5ZWRfd29yaygmZGktPmF0dGFjaF93b3JrKTsKLQlmbHVzaF9kZWxheWVkX3dvcmsoJmRpLT51c2JfY2hhcmdlcl9hdHRhY2hlZF93b3JrKTsKLQlmbHVzaF9kZWxheWVkX3dvcmsoJmRpLT5hY19jaGFyZ2VyX2F0dGFjaGVkX3dvcmspOwotCWZsdXNoX2RlbGF5ZWRfd29yaygmZGktPmNoZWNrX3VzYmNoZ25vdG9rX3dvcmspOwotCWZsdXNoX2RlbGF5ZWRfd29yaygmZGktPmNoZWNrX3ZiYXRfd29yayk7Ci0JZmx1c2hfZGVsYXllZF93b3JrKCZkaS0+a2lja193ZF93b3JrKTsKLQotCWZsdXNoX3dvcmsoJmRpLT51c2JfbGlua19zdGF0dXNfd29yayk7Ci0JZmx1c2hfd29yaygmZGktPmFjX3dvcmspOwotCWZsdXNoX3dvcmsoJmRpLT5kZXRlY3RfdXNiX3R5cGVfd29yayk7Ci0KLQlpZiAoYXRvbWljX3JlYWQoJmRpLT5jdXJyZW50X3N0ZXBwaW5nX3Nlc3Npb25zKSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbHNlCi0jZGVmaW5lIGFiODUwMF9jaGFyZ2VyX3N1c3BlbmQgICAgICBOVUxMCi0jZGVmaW5lIGFiODUwMF9jaGFyZ2VyX3Jlc3VtZSAgICAgICBOVUxMCi0jZW5kaWYKLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBjaGFyZ2VyX25iID0gewotCS5ub3RpZmllcl9jYWxsID0gYWI4NTAwX2V4dGVybmFsX2NoYXJnZXJfcHJlcGFyZSwKLX07Ci0KLXN0YXRpYyBpbnQgYWI4NTAwX2NoYXJnZXJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCWludCBpLCBpcnEsIHJldDsKLQotCS8qIERpc2FibGUgQUMgY2hhcmdpbmcgKi8KLQlhYjg1MDBfY2hhcmdlcl9hY19lbigmZGktPmFjX2NoZywgZmFsc2UsIDAsIDApOwotCi0JLyogRGlzYWJsZSBVU0IgY2hhcmdpbmcgKi8KLQlhYjg1MDBfY2hhcmdlcl91c2JfZW4oJmRpLT51c2JfY2hnLCBmYWxzZSwgMCwgMCk7Ci0KLQkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhYjg1MDBfY2hhcmdlcl9pcnEpOyBpKyspIHsKLQkJaXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgYWI4NTAwX2NoYXJnZXJfaXJxW2ldLm5hbWUpOwotCQlmcmVlX2lycShpcnEsIGRpKTsKLQl9Ci0KLQkvKiBCYWNrdXAgYmF0dGVyeSB2b2x0YWdlIGFuZCBjdXJyZW50IGRpc2FibGUgKi8KLQlyZXQgPSBhYng1MDBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKLQkJQUI4NTAwX1JUQywgQUI4NTAwX1JUQ19DVFJMX1JFRywgUlRDX0JVUF9DSF9FTkEsIDApOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKGRpLT5kZXYsICIlcyBtYXNrIGFuZCBzZXQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0KLQl1c2JfdW5yZWdpc3Rlcl9ub3RpZmllcihkaS0+dXNiX3BoeSwgJmRpLT5uYik7Ci0JdXNiX3B1dF9waHkoZGktPnVzYl9waHkpOwotCi0JLyogRGVsZXRlIHRoZSB3b3JrIHF1ZXVlICovCi0JZGVzdHJveV93b3JrcXVldWUoZGktPmNoYXJnZXJfd3EpOwotCi0JLyogVW5yZWdpc3RlciBleHRlcm5hbCBjaGFyZ2VyIGVuYWJsZSBub3RpZmllciAqLwotCWlmICghZGktPmFjX2NoZy5lbmFibGVkKQotCQlibG9ja2luZ19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKAotCQkJJmNoYXJnZXJfbm90aWZpZXJfbGlzdCwgJmNoYXJnZXJfbmIpOwotCi0JZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKLQlpZiAoZGktPnVzYl9jaGcuZW5hYmxlZCkKLQkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoZGktPnVzYl9jaGcucHN5KTsKLQotCWlmIChkaS0+YWNfY2hnLmVuYWJsZWQgJiYgIWRpLT5hY19jaGcuZXh0ZXJuYWwpCi0JCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGRpLT5hY19jaGcucHN5KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY2hhciAqc3VwcGx5X2ludGVyZmFjZVtdID0gewotCSJhYjg1MDBfY2hhcmdhbGciLAotCSJhYjg1MDBfZmciLAotCSJhYjg1MDBfYnRlbXAiLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBhYjg1MDBfYWNfY2hnX2Rlc2MgPSB7Ci0JLm5hbWUJCT0gImFiODUwMF9hYyIsCi0JLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlMsCi0JLnByb3BlcnRpZXMJPSBhYjg1MDBfY2hhcmdlcl9hY19wcm9wcywKLQkubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKGFiODUwMF9jaGFyZ2VyX2FjX3Byb3BzKSwKLQkuZ2V0X3Byb3BlcnR5CT0gYWI4NTAwX2NoYXJnZXJfYWNfZ2V0X3Byb3BlcnR5LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBhYjg1MDBfdXNiX2NoZ19kZXNjID0gewotCS5uYW1lCQk9ICJhYjg1MDBfdXNiIiwKLQkudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9VU0IsCi0JLnByb3BlcnRpZXMJPSBhYjg1MDBfY2hhcmdlcl91c2JfcHJvcHMsCi0JLm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRShhYjg1MDBfY2hhcmdlcl91c2JfcHJvcHMpLAotCS5nZXRfcHJvcGVydHkJPSBhYjg1MDBfY2hhcmdlcl91c2JfZ2V0X3Byb3BlcnR5LAotfTsKLQotc3RhdGljIGludCBhYjg1MDBfY2hhcmdlcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKLQlzdHJ1Y3QgYWJ4NTAwX2JtX2RhdGEgKnBsYXQgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBhY19wc3lfY2ZnID0ge30sIHVzYl9wc3lfY2ZnID0ge307Ci0Jc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaTsKLQlpbnQgaXJxLCBpLCBjaGFyZ2VyX3N0YXR1cywgcmV0ID0gMCwgY2hfc3RhdDsKLQotCWRpID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZGkpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzIG5vIG1lbSBmb3IgYWI4NTAwX2NoYXJnZXJcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JaWYgKCFwbGF0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIGJhdHRlcnkgbWFuYWdlbWVudCBkYXRhIHN1cHBsaWVkXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWRpLT5ibSA9IHBsYXQ7Ci0KLQlpZiAobnApIHsKLQkJcmV0ID0gYWI4NTAwX2JtX29mX3Byb2JlKCZwZGV2LT5kZXYsIG5wLCBkaS0+Ym0pOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGJhdHRlcnkgaW5mb3JtYXRpb25cbiIpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCQlkaS0+YXV0b3Bvd2VyX2NmZyA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImF1dG9wb3dlcl9jZmciKTsKLQl9IGVsc2UKLQkJZGktPmF1dG9wb3dlcl9jZmcgPSBmYWxzZTsKLQotCS8qIGdldCBwYXJlbnQgZGF0YSAqLwotCWRpLT5kZXYgPSAmcGRldi0+ZGV2OwotCWRpLT5wYXJlbnQgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7Ci0JZGktPmdwYWRjID0gYWI4NTAwX2dwYWRjX2dldCgiYWI4NTAwLWdwYWRjLjAiKTsKLQotCS8qIGluaXRpYWxpemUgbG9jayAqLwotCXNwaW5fbG9ja19pbml0KCZkaS0+dXNiX3N0YXRlLnVzYl9sb2NrKTsKLQltdXRleF9pbml0KCZkaS0+dXNiX2lwdF9jcm50X2xvY2spOwotCi0JZGktPmF1dG9wb3dlciA9IGZhbHNlOwotCWRpLT5pbnZhbGlkX2NoYXJnZXJfZGV0ZWN0X3N0YXRlID0gMDsKLQotCS8qIEFDIGFuZCBVU0Igc3VwcGx5IGNvbmZpZyAqLwotCWFjX3BzeV9jZmcuc3VwcGxpZWRfdG8gPSBzdXBwbHlfaW50ZXJmYWNlOwotCWFjX3BzeV9jZmcubnVtX3N1cHBsaWNhbnRzID0gQVJSQVlfU0laRShzdXBwbHlfaW50ZXJmYWNlKTsKLQlhY19wc3lfY2ZnLmRydl9kYXRhID0gJmRpLT5hY19jaGc7Ci0JdXNiX3BzeV9jZmcuc3VwcGxpZWRfdG8gPSBzdXBwbHlfaW50ZXJmYWNlOwotCXVzYl9wc3lfY2ZnLm51bV9zdXBwbGljYW50cyA9IEFSUkFZX1NJWkUoc3VwcGx5X2ludGVyZmFjZSk7Ci0JdXNiX3BzeV9jZmcuZHJ2X2RhdGEgPSAmZGktPnVzYl9jaGc7Ci0KLQkvKiBBQyBzdXBwbHkgKi8KLQkvKiB1eDUwMF9jaGFyZ2VyIHN1Yi1jbGFzcyAqLwotCWRpLT5hY19jaGcub3BzLmVuYWJsZSA9ICZhYjg1MDBfY2hhcmdlcl9hY19lbjsKLQlkaS0+YWNfY2hnLm9wcy5jaGVja19lbmFibGUgPSAmYWI4NTAwX2NoYXJnZXJfYWNfY2hlY2tfZW5hYmxlOwotCWRpLT5hY19jaGcub3BzLmtpY2tfd2QgPSAmYWI4NTAwX2NoYXJnZXJfd2F0Y2hkb2dfa2ljazsKLQlkaS0+YWNfY2hnLm9wcy51cGRhdGVfY3VyciA9ICZhYjg1MDBfY2hhcmdlcl91cGRhdGVfY2hhcmdlcl9jdXJyZW50OwotCWRpLT5hY19jaGcubWF4X291dF92b2x0ID0gYWI4NTAwX2NoYXJnZXJfdm9sdGFnZV9tYXBbCi0JCUFSUkFZX1NJWkUoYWI4NTAwX2NoYXJnZXJfdm9sdGFnZV9tYXApIC0gMV07Ci0JZGktPmFjX2NoZy5tYXhfb3V0X2N1cnIgPQotCQlkaS0+Ym0tPmNoZ19vdXRwdXRfY3VycltkaS0+Ym0tPm5fY2hnX291dF9jdXJyIC0gMV07Ci0JZGktPmFjX2NoZy53ZHRfcmVmcmVzaCA9IENIR19XRF9JTlRFUlZBTDsKLQlkaS0+YWNfY2hnLmVuYWJsZWQgPSBkaS0+Ym0tPmFjX2VuYWJsZWQ7Ci0JZGktPmFjX2NoZy5leHRlcm5hbCA9IGZhbHNlOwotCi0JLypub3RpZmllciBmb3IgZXh0ZXJuYWwgY2hhcmdlciBlbmFibGluZyovCi0JaWYgKCFkaS0+YWNfY2hnLmVuYWJsZWQpCi0JCWJsb2NraW5nX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKAotCQkJJmNoYXJnZXJfbm90aWZpZXJfbGlzdCwgJmNoYXJnZXJfbmIpOwotCi0JLyogVVNCIHN1cHBseSAqLwotCS8qIHV4NTAwX2NoYXJnZXIgc3ViLWNsYXNzICovCi0JZGktPnVzYl9jaGcub3BzLmVuYWJsZSA9ICZhYjg1MDBfY2hhcmdlcl91c2JfZW47Ci0JZGktPnVzYl9jaGcub3BzLmNoZWNrX2VuYWJsZSA9ICZhYjg1MDBfY2hhcmdlcl91c2JfY2hlY2tfZW5hYmxlOwotCWRpLT51c2JfY2hnLm9wcy5raWNrX3dkID0gJmFiODUwMF9jaGFyZ2VyX3dhdGNoZG9nX2tpY2s7Ci0JZGktPnVzYl9jaGcub3BzLnVwZGF0ZV9jdXJyID0gJmFiODUwMF9jaGFyZ2VyX3VwZGF0ZV9jaGFyZ2VyX2N1cnJlbnQ7Ci0JZGktPnVzYl9jaGcub3BzLnBwX2VuYWJsZSA9ICZhYjg1NDBfY2hhcmdlcl9wb3dlcl9wYXRoX2VuYWJsZTsKLQlkaS0+dXNiX2NoZy5vcHMucHJlX2NoZ19lbmFibGUgPSAmYWI4NTQwX2NoYXJnZXJfdXNiX3ByZV9jaGdfZW5hYmxlOwotCWRpLT51c2JfY2hnLm1heF9vdXRfdm9sdCA9IGFiODUwMF9jaGFyZ2VyX3ZvbHRhZ2VfbWFwWwotCQlBUlJBWV9TSVpFKGFiODUwMF9jaGFyZ2VyX3ZvbHRhZ2VfbWFwKSAtIDFdOwotCWRpLT51c2JfY2hnLm1heF9vdXRfY3VyciA9Ci0JCWRpLT5ibS0+Y2hnX291dHB1dF9jdXJyW2RpLT5ibS0+bl9jaGdfb3V0X2N1cnIgLSAxXTsKLQlkaS0+dXNiX2NoZy53ZHRfcmVmcmVzaCA9IENIR19XRF9JTlRFUlZBTDsKLQlkaS0+dXNiX2NoZy5lbmFibGVkID0gZGktPmJtLT51c2JfZW5hYmxlZDsKLQlkaS0+dXNiX2NoZy5leHRlcm5hbCA9IGZhbHNlOwotCWRpLT51c2JfY2hnLnBvd2VyX3BhdGggPSBkaS0+Ym0tPnVzYl9wb3dlcl9wYXRoOwotCWRpLT51c2Jfc3RhdGUudXNiX2N1cnJlbnQgPSAtMTsKLQotCS8qIENyZWF0ZSBhIHdvcmsgcXVldWUgZm9yIHRoZSBjaGFyZ2VyICovCi0JZGktPmNoYXJnZXJfd3EgPQotCQljcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiYWI4NTAwX2NoYXJnZXJfd3EiKTsKLQlpZiAoZGktPmNoYXJnZXJfd3EgPT0gTlVMTCkgewotCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIHdvcmsgcXVldWVcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQltdXRleF9pbml0KCZkaS0+Y2hhcmdlcl9hdHRhY2hlZF9tdXRleCk7Ci0KLQkvKiBJbml0IHdvcmsgZm9yIEhXIGZhaWx1cmUgY2hlY2sgKi8KLQlJTklUX0RFRkVSUkFCTEVfV09SSygmZGktPmNoZWNrX2h3X2ZhaWx1cmVfd29yaywKLQkJYWI4NTAwX2NoYXJnZXJfY2hlY2tfaHdfZmFpbHVyZV93b3JrKTsKLQlJTklUX0RFRkVSUkFCTEVfV09SSygmZGktPmNoZWNrX3VzYmNoZ25vdG9rX3dvcmssCi0JCWFiODUwMF9jaGFyZ2VyX2NoZWNrX3VzYmNoYXJnZXJub3Rva193b3JrKTsKLQotCUlOSVRfREVMQVlFRF9XT1JLKCZkaS0+YWNfY2hhcmdlcl9hdHRhY2hlZF93b3JrLAotCQkJICBhYjg1MDBfY2hhcmdlcl9hY19hdHRhY2hlZF93b3JrKTsKLQlJTklUX0RFTEFZRURfV09SSygmZGktPnVzYl9jaGFyZ2VyX2F0dGFjaGVkX3dvcmssCi0JCQkgIGFiODUwMF9jaGFyZ2VyX3VzYl9hdHRhY2hlZF93b3JrKTsKLQotCS8qCi0JICogRm9yIEFCQiByZXZpc2lvbiAxLjAgYW5kIDEuMSB0aGVyZSBpcyBhIGJ1ZyBpbiB0aGUgd2F0Y2hkb2cKLQkgKiBsb2dpYy4gVGhhdCBtZWFucyB3ZSBoYXZlIHRvIGNvbnRpbm91c2x5IGtpY2sgdGhlIGNoYXJnZXIKLQkgKiB3YXRjaGRvZyBldmVuIHdoZW4gbm8gY2hhcmdlciBpcyBjb25uZWN0ZWQuIFRoaXMgaXMgb25seQotCSAqIHZhbGlkIG9uY2UgdGhlIEFDIGNoYXJnZXIgaGFzIGJlZW4gZW5hYmxlZC4gVGhpcyBpcwotCSAqIGEgYnVnIHRoYXQgaXMgbm90IGhhbmRsZWQgYnkgdGhlIGFsZ29yaXRobSBhbmQgdGhlCi0JICogd2F0Y2hkb2cgaGF2ZSB0byBiZSBraWNrZWQgYnkgdGhlIGNoYXJnZXIgZHJpdmVyCi0JICogd2hlbiB0aGUgQUMgY2hhcmdlciBpcyBkaXNhYmxlZAotCSAqLwotCUlOSVRfREVGRVJSQUJMRV9XT1JLKCZkaS0+a2lja193ZF93b3JrLAotCQlhYjg1MDBfY2hhcmdlcl9raWNrX3dhdGNoZG9nX3dvcmspOwotCi0JSU5JVF9ERUZFUlJBQkxFX1dPUksoJmRpLT5jaGVja192YmF0X3dvcmssCi0JCWFiODUwMF9jaGFyZ2VyX2NoZWNrX3ZiYXRfd29yayk7Ci0KLQlJTklUX0RFTEFZRURfV09SSygmZGktPmF0dGFjaF93b3JrLAotCQlhYjg1MDBfY2hhcmdlcl91c2JfbGlua19hdHRhY2hfd29yayk7Ci0KLQlJTklUX0RFTEFZRURfV09SSygmZGktPnVzYl9zdGF0ZV9jaGFuZ2VkX3dvcmssCi0JCWFiODUwMF9jaGFyZ2VyX3VzYl9zdGF0ZV9jaGFuZ2VkX3dvcmspOwotCi0JSU5JVF9ERUxBWUVEX1dPUksoJmRpLT52YnVzX2Ryb3BfZW5kX3dvcmssCi0JCWFiODUwMF9jaGFyZ2VyX3ZidXNfZHJvcF9lbmRfd29yayk7Ci0KLQkvKiBJbml0IHdvcmsgZm9yIGNoYXJnZXIgZGV0ZWN0aW9uICovCi0JSU5JVF9XT1JLKCZkaS0+dXNiX2xpbmtfc3RhdHVzX3dvcmssCi0JCWFiODUwMF9jaGFyZ2VyX3VzYl9saW5rX3N0YXR1c193b3JrKTsKLQlJTklUX1dPUksoJmRpLT5hY193b3JrLCBhYjg1MDBfY2hhcmdlcl9hY193b3JrKTsKLQlJTklUX1dPUksoJmRpLT5kZXRlY3RfdXNiX3R5cGVfd29yaywKLQkJYWI4NTAwX2NoYXJnZXJfZGV0ZWN0X3VzYl90eXBlX3dvcmspOwotCi0JLyogSW5pdCB3b3JrIGZvciBjaGVja2luZyBIVyBzdGF0dXMgKi8KLQlJTklUX1dPUksoJmRpLT5jaGVja19tYWluX3RoZXJtYWxfcHJvdF93b3JrLAotCQlhYjg1MDBfY2hhcmdlcl9jaGVja19tYWluX3RoZXJtYWxfcHJvdF93b3JrKTsKLQlJTklUX1dPUksoJmRpLT5jaGVja191c2JfdGhlcm1hbF9wcm90X3dvcmssCi0JCWFiODUwMF9jaGFyZ2VyX2NoZWNrX3VzYl90aGVybWFsX3Byb3Rfd29yayk7Ci0KLQkvKgotCSAqIFZERCBBREMgc3VwcGx5IG5lZWRzIHRvIGJlIGVuYWJsZWQgZnJvbSB0aGlzIGRyaXZlciB3aGVuIHRoZXJlCi0JICogaXMgYSBjaGFyZ2VyIGNvbm5lY3RlZCB0byBhdm9pZCBlcnJvbmVvdXMgQlRFTVBfSElHSC9MT1cKLQkgKiBpbnRlcnJ1cHRzIGR1cmluZyBjaGFyZ2luZwotCSAqLwotCWRpLT5yZWd1ID0gZGV2bV9yZWd1bGF0b3JfZ2V0KGRpLT5kZXYsICJ2ZGRhZGMiKTsKLQlpZiAoSVNfRVJSKGRpLT5yZWd1KSkgewotCQlyZXQgPSBQVFJfRVJSKGRpLT5yZWd1KTsKLQkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIGdldCB2ZGRhZGMgcmVndWxhdG9yXG4iKTsKLQkJZ290byBmcmVlX2NoYXJnZXJfd3E7Ci0JfQotCi0KLQkvKiBJbml0aWFsaXplIE9WViwgYW5kIG90aGVyIHJlZ2lzdGVycyAqLwotCXJldCA9IGFiODUwMF9jaGFyZ2VyX2luaXRfaHdfcmVnaXN0ZXJzKGRpKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIEFCQiByZWdpc3RlcnNcbiIpOwotCQlnb3RvIGZyZWVfY2hhcmdlcl93cTsKLQl9Ci0KLQkvKiBSZWdpc3RlciBBQyBjaGFyZ2VyIGNsYXNzICovCi0JaWYgKGRpLT5hY19jaGcuZW5hYmxlZCkgewotCQlkaS0+YWNfY2hnLnBzeSA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcihkaS0+ZGV2LAotCQkJCQkJICAgICAgICZhYjg1MDBfYWNfY2hnX2Rlc2MsCi0JCQkJCQkgICAgICAgJmFjX3BzeV9jZmcpOwotCQlpZiAoSVNfRVJSKGRpLT5hY19jaGcucHN5KSkgewotCQkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIEFDIGNoYXJnZXJcbiIpOwotCQkJcmV0ID0gUFRSX0VSUihkaS0+YWNfY2hnLnBzeSk7Ci0JCQlnb3RvIGZyZWVfY2hhcmdlcl93cTsKLQkJfQotCX0KLQotCS8qIFJlZ2lzdGVyIFVTQiBjaGFyZ2VyIGNsYXNzICovCi0JaWYgKGRpLT51c2JfY2hnLmVuYWJsZWQpIHsKLQkJZGktPnVzYl9jaGcucHN5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKGRpLT5kZXYsCi0JCQkJCQkJJmFiODUwMF91c2JfY2hnX2Rlc2MsCi0JCQkJCQkJJnVzYl9wc3lfY2ZnKTsKLQkJaWYgKElTX0VSUihkaS0+dXNiX2NoZy5wc3kpKSB7Ci0JCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgVVNCIGNoYXJnZXJcbiIpOwotCQkJcmV0ID0gUFRSX0VSUihkaS0+dXNiX2NoZy5wc3kpOwotCQkJZ290byBmcmVlX2FjOwotCQl9Ci0JfQotCi0JZGktPnVzYl9waHkgPSB1c2JfZ2V0X3BoeShVU0JfUEhZX1RZUEVfVVNCMik7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGRpLT51c2JfcGh5KSkgewotCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gZ2V0IHVzYiB0cmFuc2NlaXZlclxuIik7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZnJlZV91c2I7Ci0JfQotCWRpLT5uYi5ub3RpZmllcl9jYWxsID0gYWI4NTAwX2NoYXJnZXJfdXNiX25vdGlmaWVyX2NhbGw7Ci0JcmV0ID0gdXNiX3JlZ2lzdGVyX25vdGlmaWVyKGRpLT51c2JfcGh5LCAmZGktPm5iKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byByZWdpc3RlciB1c2Igbm90aWZpZXJcbiIpOwotCQlnb3RvIHB1dF91c2JfcGh5OwotCX0KLQotCS8qIElkZW50aWZ5IHRoZSBjb25uZWN0ZWQgY2hhcmdlciB0eXBlcyBkdXJpbmcgc3RhcnR1cCAqLwotCWNoYXJnZXJfc3RhdHVzID0gYWI4NTAwX2NoYXJnZXJfZGV0ZWN0X2NoYXJnZXJzKGRpLCB0cnVlKTsKLQlpZiAoY2hhcmdlcl9zdGF0dXMgJiBBQ19QV19DT05OKSB7Ci0JCWRpLT5hYy5jaGFyZ2VyX2Nvbm5lY3RlZCA9IDE7Ci0JCWRpLT5hY19jb25uID0gdHJ1ZTsKLQkJYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLCBkaS0+YWNfY2hnLnBzeSk7Ci0JCXN5c2ZzX25vdGlmeSgmZGktPmFjX2NoZy5wc3ktPmRldi5rb2JqLCBOVUxMLCAicHJlc2VudCIpOwotCX0KLQotCWlmIChjaGFyZ2VyX3N0YXR1cyAmIFVTQl9QV19DT05OKSB7Ci0JCWRpLT52YnVzX2RldGVjdGVkID0gdHJ1ZTsKLQkJZGktPnZidXNfZGV0ZWN0ZWRfc3RhcnQgPSB0cnVlOwotCQlxdWV1ZV93b3JrKGRpLT5jaGFyZ2VyX3dxLAotCQkJJmRpLT5kZXRlY3RfdXNiX3R5cGVfd29yayk7Ci0JfQotCi0JLyogUmVnaXN0ZXIgaW50ZXJydXB0cyAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFiODUwMF9jaGFyZ2VyX2lycSk7IGkrKykgewotCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCBhYjg1MDBfY2hhcmdlcl9pcnFbaV0ubmFtZSk7Ci0JCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGlycSwgTlVMTCwgYWI4NTAwX2NoYXJnZXJfaXJxW2ldLmlzciwKLQkJCUlSUUZfU0hBUkVEIHwgSVJRRl9OT19TVVNQRU5ELAotCQkJYWI4NTAwX2NoYXJnZXJfaXJxW2ldLm5hbWUsIGRpKTsKLQotCQlpZiAocmV0ICE9IDApIHsKLQkJCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byByZXF1ZXN0ICVzIElSUSAlZDogJWRcbiIKLQkJCQksIGFiODUwMF9jaGFyZ2VyX2lycVtpXS5uYW1lLCBpcnEsIHJldCk7Ci0JCQlnb3RvIGZyZWVfaXJxOwotCQl9Ci0JCWRldl9kYmcoZGktPmRldiwgIlJlcXVlc3RlZCAlcyBJUlEgJWQ6ICVkXG4iLAotCQkJYWI4NTAwX2NoYXJnZXJfaXJxW2ldLm5hbWUsIGlycSwgcmV0KTsKLQl9Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkaSk7Ci0KLQltdXRleF9sb2NrKCZkaS0+Y2hhcmdlcl9hdHRhY2hlZF9tdXRleCk7Ci0KLQljaF9zdGF0ID0gYWI4NTAwX2NoYXJnZXJfZGV0ZWN0X2NoYXJnZXJzKGRpLCBmYWxzZSk7Ci0KLQlpZiAoKGNoX3N0YXQgJiBBQ19QV19DT05OKSA9PSBBQ19QV19DT05OKSB7Ci0JCWlmIChpc19hYjg1MDAoZGktPnBhcmVudCkpCi0JCQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmNoYXJnZXJfd3EsCi0JCQkJCSAgICZkaS0+YWNfY2hhcmdlcl9hdHRhY2hlZF93b3JrLAotCQkJCQkgICBIWik7Ci0JfQotCWlmICgoY2hfc3RhdCAmIFVTQl9QV19DT05OKSA9PSBVU0JfUFdfQ09OTikgewotCQlpZiAoaXNfYWI4NTAwKGRpLT5wYXJlbnQpKQotCQkJcXVldWVfZGVsYXllZF93b3JrKGRpLT5jaGFyZ2VyX3dxLAotCQkJCQkgICAmZGktPnVzYl9jaGFyZ2VyX2F0dGFjaGVkX3dvcmssCi0JCQkJCSAgIEhaKTsKLQl9Ci0KLQltdXRleF91bmxvY2soJmRpLT5jaGFyZ2VyX2F0dGFjaGVkX211dGV4KTsKLQotCXJldHVybiByZXQ7Ci0KLWZyZWVfaXJxOgotCXVzYl91bnJlZ2lzdGVyX25vdGlmaWVyKGRpLT51c2JfcGh5LCAmZGktPm5iKTsKLQotCS8qIFdlIGFsc28gaGF2ZSB0byBmcmVlIGFsbCBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZCBpcnFzICovCi0JZm9yIChpID0gaSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCWlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsIGFiODUwMF9jaGFyZ2VyX2lycVtpXS5uYW1lKTsKLQkJZnJlZV9pcnEoaXJxLCBkaSk7Ci0JfQotcHV0X3VzYl9waHk6Ci0JdXNiX3B1dF9waHkoZGktPnVzYl9waHkpOwotZnJlZV91c2I6Ci0JaWYgKGRpLT51c2JfY2hnLmVuYWJsZWQpCi0JCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGRpLT51c2JfY2hnLnBzeSk7Ci1mcmVlX2FjOgotCWlmIChkaS0+YWNfY2hnLmVuYWJsZWQpCi0JCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGRpLT5hY19jaGcucHN5KTsKLWZyZWVfY2hhcmdlcl93cToKLQlkZXN0cm95X3dvcmtxdWV1ZShkaS0+Y2hhcmdlcl93cSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYWI4NTAwX2NoYXJnZXJfbWF0Y2hbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInN0ZXJpY3Nzb24sYWI4NTAwLWNoYXJnZXIiLCB9LAotCXsgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFiODUwMF9jaGFyZ2VyX2RyaXZlciA9IHsKLQkucHJvYmUgPSBhYjg1MDBfY2hhcmdlcl9wcm9iZSwKLQkucmVtb3ZlID0gYWI4NTAwX2NoYXJnZXJfcmVtb3ZlLAotCS5zdXNwZW5kID0gYWI4NTAwX2NoYXJnZXJfc3VzcGVuZCwKLQkucmVzdW1lID0gYWI4NTAwX2NoYXJnZXJfcmVzdW1lLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImFiODUwMC1jaGFyZ2VyIiwKLQkJLm9mX21hdGNoX3RhYmxlID0gYWI4NTAwX2NoYXJnZXJfbWF0Y2gsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFiODUwMF9jaGFyZ2VyX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhYjg1MDBfY2hhcmdlcl9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYWI4NTAwX2NoYXJnZXJfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhYjg1MDBfY2hhcmdlcl9kcml2ZXIpOwotfQotCi1zdWJzeXNfaW5pdGNhbGxfc3luYyhhYjg1MDBfY2hhcmdlcl9pbml0KTsKLW1vZHVsZV9leGl0KGFiODUwMF9jaGFyZ2VyX2V4aXQpOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci1NT0RVTEVfQVVUSE9SKCJKb2hhbiBQYWxzc29uLCBLYXJsIEtvbWllcm93c2tpLCBBcnVuIFIgTXVydGh5Iik7Ci1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOmFiODUwMC1jaGFyZ2VyIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkFCODUwMCBjaGFyZ2VyIG1hbmFnZW1lbnQgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2FiODUwMF9mZy5jIGIvZHJpdmVycy9wb3dlci9hYjg1MDBfZmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEzNmNmOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3Bvd2VyL2FiODUwMF9mZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzI3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBTVC1Fcmljc3NvbiBBQiAyMDEyCi0gKgotICogTWFpbiBhbmQgQmFjay11cCBiYXR0ZXJ5IG1hbmFnZW1lbnQgZHJpdmVyLgotICoKLSAqIE5vdGU6IEJhY2t1cCBiYXR0ZXJ5IG1hbmFnZW1lbnQgaXMgcmVxdWlyZWQgaW4gY2FzZSBvZiBMaS1Jb24gYmF0dGVyeSBhbmQgbm90Ci0gKiBmb3IgY2FwYWNpdGl2ZSBiYXR0ZXJ5LiBIUkVGIGJvYXJkcyBoYXZlIGNhcGFjaXRpdmUgYmF0dGVyeSBhbmQgaGVuY2UgYmFja3VwCi0gKiBiYXR0ZXJ5IG1hbmFnZW1lbnQgaXMgbm90IHVzZWQgYW5kIHRoZSBzdXBwb3J0ZWQgY29kZSBpcyBhdmFpbGFibGUgaW4gdGhpcwotICogZHJpdmVyLgotICoKLSAqIExpY2Vuc2UgVGVybXM6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyCi0gKiBBdXRob3I6Ci0gKglKb2hhbiBQYWxzc29uIDxqb2hhbi5wYWxzc29uQHN0ZXJpY3Nzb24uY29tPgotICoJS2FybCBLb21pZXJvd3NraSA8a2FybC5rb21pZXJvd3NraUBzdGVyaWNzc29uLmNvbT4KLSAqCUFydW4gUiBNdXJ0aHkgPGFydW4ubXVydGh5QHN0ZXJpY3Nzb24uY29tPgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+Ci0jaW5jbHVkZSA8bGludXgva29iamVjdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lNjQuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9hYng1MDAuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvYWJ4NTAwL2FiODUwMC5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9hYng1MDAvYWI4NTAwLWJtLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL2FieDUwMC9hYjg1MDAtZ3BhZGMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLQotI2RlZmluZSBNSUxMSV9UT19NSUNSTwkJCTEwMDAKLSNkZWZpbmUgRkdfTFNCX0lOX01BCQkJMTYyNwotI2RlZmluZSBRTFNCX05BTk9fQU1QX0hPVVJTX1gxMAkJMTA3MQotI2RlZmluZSBJTlNfQ1VSUl9USU1FT1VUCQkoMyAqIEhaKQotCi0jZGVmaW5lIFNFQ19UT19TQU1QTEUoUykJCShTICogNCkKLQotI2RlZmluZSBOQlJfQVZHX1NBTVBMRVMJCQkyMAotCi0jZGVmaW5lIExPV19CQVRfQ0hFQ0tfSU5URVJWQUwJCShIWiAvIDE2KSAvKiA2Mi41IG1zICovCi0KLSNkZWZpbmUgVkFMSURfQ0FQQUNJVFlfU0VDCQkoNDUgKiA2MCkgLyogNDUgbWludXRlcyAqLwotI2RlZmluZSBCQVRUX09LX01JTgkJCTIzNjAgLyogbVYgKi8KLSNkZWZpbmUgQkFUVF9PS19JTkNSRU1FTlQJCTUwIC8qIG1WICovCi0jZGVmaW5lIEJBVFRfT0tfTUFYX05SX0lOQ1JFTUVOVFMJMHhFCi0KLS8qIEZHIGNvbnN0YW50cyAqLwotI2RlZmluZSBCQVRUX09WVgkJCTB4MDEKLQotI2RlZmluZSBpbnRlcnBvbGF0ZSh4LCB4MSwgeTEsIHgyLCB5MikgXAotCSgoeTEpICsgKCgoKHkyKSAtICh5MSkpICogKCh4KSAtICh4MSkpKSAvICgoeDIpIC0gKHgxKSkpKTsKLQotLyoqCi0gKiBzdHJ1Y3QgYWI4NTAwX2ZnX2ludGVycnVwdHMgLSBhYjg1MDAgZmcgaW50ZXJ1cHRzCi0gKiBAbmFtZToJbmFtZSBvZiB0aGUgaW50ZXJydXB0Ci0gKiBAaXNyCQlmdW5jdGlvbiBwb2ludGVyIHRvIHRoZSBpc3IKLSAqLwotc3RydWN0IGFiODUwMF9mZ19pbnRlcnJ1cHRzIHsKLQljaGFyICpuYW1lOwotCWlycXJldHVybl90ICgqaXNyKShpbnQgaXJxLCB2b2lkICpkYXRhKTsKLX07Ci0KLWVudW0gYWI4NTAwX2ZnX2Rpc2NoYXJnZV9zdGF0ZSB7Ci0JQUI4NTAwX0ZHX0RJU0NIQVJHRV9JTklULAotCUFCODUwMF9GR19ESVNDSEFSR0VfSU5JVE1FQVNVUklORywKLQlBQjg1MDBfRkdfRElTQ0hBUkdFX0lOSVRfUkVDT1ZFUlksCi0JQUI4NTAwX0ZHX0RJU0NIQVJHRV9SRUNPVkVSWSwKLQlBQjg1MDBfRkdfRElTQ0hBUkdFX1JFQURPVVRfSU5JVCwKLQlBQjg1MDBfRkdfRElTQ0hBUkdFX1JFQURPVVQsCi0JQUI4NTAwX0ZHX0RJU0NIQVJHRV9XQUtFVVAsCi19OwotCi1zdGF0aWMgY2hhciAqZGlzY2hhcmdlX3N0YXRlW10gPSB7Ci0JIkRJU0NIQVJHRV9JTklUIiwKLQkiRElTQ0hBUkdFX0lOSVRNRUFTVVJJTkciLAotCSJESVNDSEFSR0VfSU5JVF9SRUNPVkVSWSIsCi0JIkRJU0NIQVJHRV9SRUNPVkVSWSIsCi0JIkRJU0NIQVJHRV9SRUFET1VUX0lOSVQiLAotCSJESVNDSEFSR0VfUkVBRE9VVCIsCi0JIkRJU0NIQVJHRV9XQUtFVVAiLAotfTsKLQotZW51bSBhYjg1MDBfZmdfY2hhcmdlX3N0YXRlIHsKLQlBQjg1MDBfRkdfQ0hBUkdFX0lOSVQsCi0JQUI4NTAwX0ZHX0NIQVJHRV9SRUFET1VULAotfTsKLQotc3RhdGljIGNoYXIgKmNoYXJnZV9zdGF0ZVtdID0gewotCSJDSEFSR0VfSU5JVCIsCi0JIkNIQVJHRV9SRUFET1VUIiwKLX07Ci0KLWVudW0gYWI4NTAwX2ZnX2NhbGlicmF0aW9uX3N0YXRlIHsKLQlBQjg1MDBfRkdfQ0FMSUJfSU5JVCwKLQlBQjg1MDBfRkdfQ0FMSUJfV0FJVCwKLQlBQjg1MDBfRkdfQ0FMSUJfRU5ELAotfTsKLQotc3RydWN0IGFiODUwMF9mZ19hdmdfY2FwIHsKLQlpbnQgYXZnOwotCWludCBzYW1wbGVzW05CUl9BVkdfU0FNUExFU107Ci0JdGltZTY0X3QgdGltZV9zdGFtcHNbTkJSX0FWR19TQU1QTEVTXTsKLQlpbnQgcG9zOwotCWludCBuYnJfc2FtcGxlczsKLQlpbnQgc3VtOwotfTsKLQotc3RydWN0IGFiODUwMF9mZ19jYXBfc2NhbGluZyB7Ci0JYm9vbCBlbmFibGU7Ci0JaW50IGNhcF90b19zY2FsZVsyXTsKLQlpbnQgZGlzYWJsZV9jYXBfbGV2ZWw7Ci0JaW50IHNjYWxlZF9jYXA7Ci19OwotCi1zdHJ1Y3QgYWI4NTAwX2ZnX2JhdHRlcnlfY2FwYWNpdHkgewotCWludCBtYXhfbWFoX2Rlc2lnbjsKLQlpbnQgbWF4X21haDsKLQlpbnQgbWFoOwotCWludCBwZXJtaWxsZTsKLQlpbnQgbGV2ZWw7Ci0JaW50IHByZXZfbWFoOwotCWludCBwcmV2X3BlcmNlbnQ7Ci0JaW50IHByZXZfbGV2ZWw7Ci0JaW50IHVzZXJfbWFoOwotCXN0cnVjdCBhYjg1MDBfZmdfY2FwX3NjYWxpbmcgY2FwX3NjYWxlOwotfTsKLQotc3RydWN0IGFiODUwMF9mZ19mbGFncyB7Ci0JYm9vbCBmZ19lbmFibGVkOwotCWJvb2wgY29udl9kb25lOwotCWJvb2wgY2hhcmdpbmc7Ci0JYm9vbCBmdWxseV9jaGFyZ2VkOwotCWJvb2wgZm9yY2VfZnVsbDsKLQlib29sIGxvd19iYXRfZGVsYXk7Ci0JYm9vbCBsb3dfYmF0OwotCWJvb2wgYmF0X292djsKLQlib29sIGJhdHRfdW5rbm93bjsKLQlib29sIGNhbGlicmF0ZTsKLQlib29sIHVzZXJfY2FwOwotCWJvb2wgYmF0dF9pZF9yZWNlaXZlZDsKLX07Ci0KLXN0cnVjdCBpbnN0X2N1cnJfcmVzdWx0X2xpc3QgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlpbnQgKnJlc3VsdDsKLX07Ci0KLS8qKgotICogc3RydWN0IGFiODUwMF9mZyAtIGFiODUwMCBGRyBkZXZpY2UgaW5mb3JtYXRpb24KLSAqIEBkZXY6CQlQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgZGV2aWNlCi0gKiBAbm9kZToJCWEgbGlzdCBvZiBBQjg1MDAgRkdzLCBoZW5jZSBwcmVwYXJlZCBmb3IgcmVlbnRyYW5jZQotICogQGlycQkJCWhvbGRzIHRoZSBDQ0VPQyBpbnRlcnJ1cHQgbnVtYmVyCi0gKiBAdmJhdDoJCUJhdHRlcnkgdm9sdGFnZSBpbiBtVgotICogQHZiYXRfbm9tOgkJTm9taW5hbCBiYXR0ZXJ5IHZvbHRhZ2UgaW4gbVYKLSAqIEBpbnN0X2N1cnI6CQlJbnN0YW50ZW5vdXMgYmF0dGVyeSBjdXJyZW50IGluIG1BCi0gKiBAYXZnX2N1cnI6CQlBdmVyYWdlIGJhdHRlcnkgY3VycmVudCBpbiBtQQotICogQGJhdF90ZW1wCQliYXR0ZXJ5IHRlbXBlcmF0dXJlCi0gKiBAZmdfc2FtcGxlczoJCU51bWJlciBvZiBzYW1wbGVzIHVzZWQgaW4gdGhlIEZHIGFjY3VtdWxhdGlvbgotICogQGFjY3VfY2hhcmdlOglBY2N1bXVsYXRlZCBjaGFyZ2UgZnJvbSB0aGUgbGFzdCBjb252ZXJzaW9uCi0gKiBAcmVjb3ZlcnlfY250OglDb3VudGVyIGZvciByZWNvdmVyeSBtb2RlCi0gKiBAaGlnaF9jdXJyX2NudDoJQ291bnRlciBmb3IgaGlnaCBjdXJyZW50IG1vZGUKLSAqIEBpbml0X2NudDoJCUNvdW50ZXIgZm9yIGluaXQgbW9kZQotICogQGxvd19iYXRfY250CQlDb3VudGVyIGZvciBudW1iZXIgb2YgY29uc2VjdXRpdmUgbG93IGJhdHRlcnkgbWVhc3VyZXMKLSAqIEBuYnJfY2Nlb2NfaXJxX2NudAlDb3VudGVyIGZvciBudW1iZXIgb2YgQ0NFT0MgaXJxcyByZWNlaXZlZCBzaW5jZSBlbmFibGVkCi0gKiBAcmVjb3ZlcnlfbmVlZGVkOglJbmRpY2F0ZSBpZiByZWNvdmVyeSBpcyBuZWVkZWQKLSAqIEBoaWdoX2N1cnJfbW9kZToJSW5kaWNhdGUgaWYgd2UncmUgaW4gaGlnaCBjdXJyZW50IG1vZGUKLSAqIEBpbml0X2NhcGFjaXR5OglJbmRpY2F0ZSBpZiBpbml0aWFsIGNhcGFjaXR5IG1lYXN1cmluZyBzaG91bGQgYmUgZG9uZQotICogQHR1cm5fb2ZmX2ZnOglUcnVlIGlmIGZnIHdhcyBvZmYgYmVmb3JlIGN1cnJlbnQgbWVhc3VyZW1lbnQKLSAqIEBjYWxpYl9zdGF0ZQkJU3RhdGUgZHVyaW5nIG9mZnNldCBjYWxpYnJhdGlvbgotICogQGRpc2NoYXJnZV9zdGF0ZToJQ3VycmVudCBkaXNjaGFyZ2Ugc3RhdGUKLSAqIEBjaGFyZ2Vfc3RhdGU6CUN1cnJlbnQgY2hhcmdlIHN0YXRlCi0gKiBAYWI4NTAwX2ZnX3N0YXJ0ZWQJQ29tcGxldGlvbiBzdHJ1Y3QgdXNlZCBmb3IgdGhlIGluc3RhbnQgY3VycmVudCBzdGFydAotICogQGFiODUwMF9mZ19jb21wbGV0ZQlDb21wbGV0aW9uIHN0cnVjdCB1c2VkIGZvciB0aGUgaW5zdGFudCBjdXJyZW50IHJlYWRpbmcKLSAqIEBmbGFnczoJCVN0cnVjdHVyZSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgZXZlbnRzIHRyaWdnZXJlZAotICogQGJhdF9jYXA6CQlTdHJ1Y3R1cmUgZm9yIGJhdHRlcnkgY2FwYWNpdHkgc3BlY2lmaWMgcGFyYW1ldGVycwotICogQGF2Z19jYXA6CQlBdmVyYWdlIGNhcGFjaXR5IGZpbHRlcgotICogQHBhcmVudDoJCVBvaW50ZXIgdG8gdGhlIHN0cnVjdCBhYjg1MDAKLSAqIEBncGFkYzoJCVBvaW50ZXIgdG8gdGhlIHN0cnVjdCBncGFkYwotICogQGJtOiAgICAgICAgICAgCVBsYXRmb3JtIHNwZWNpZmljIGJhdHRlcnkgbWFuYWdlbWVudCBpbmZvcm1hdGlvbgotICogQGZnX3BzeToJCVN0cnVjdHVyZSB0aGF0IGhvbGRzIHRoZSBGRyBzcGVjaWZpYyBiYXR0ZXJ5IHByb3BlcnRpZXMKLSAqIEBmZ193cToJCVdvcmsgcXVldWUgZm9yIHJ1bm5pbmcgdGhlIEZHIGFsZ29yaXRobQotICogQGZnX3BlcmlvZGljX3dvcms6CVdvcmsgdG8gcnVuIHRoZSBGRyBhbGdvcml0aG0gcGVyaW9kaWNhbGx5Ci0gKiBAZmdfbG93X2JhdF93b3JrOglXb3JrIHRvIGNoZWNrIGxvdyBiYXQgY29uZGl0aW9uCi0gKiBAZmdfcmVpbml0X3dvcmsJV29yayB1c2VkIHRvIHJlc2V0IGFuZCByZWluaXRpYWxpc2UgdGhlIEZHIGFsZ29yaXRobQotICogQGZnX3dvcms6CQlXb3JrIHRvIHJ1biB0aGUgRkcgYWxnb3JpdGhtIGluc3RhbnRseQotICogQGZnX2FjY19jdXJfd29yazoJV29yayB0byByZWFkIHRoZSBGRyBhY2N1bXVsYXRvcgotICogQGZnX2NoZWNrX2h3X2ZhaWx1cmVfd29yazoJV29yayBmb3IgY2hlY2tpbmcgSFcgc3RhdGUKLSAqIEBjY19sb2NrOgkJTXV0ZXggZm9yIGxvY2tpbmcgdGhlIENDCi0gKiBAZmdfa29iamVjdDoJCVN0cnVjdHVyZSBvZiB0eXBlIGtvYmplY3QKLSAqLwotc3RydWN0IGFiODUwMF9mZyB7Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKLQlpbnQgaXJxOwotCWludCB2YmF0OwotCWludCB2YmF0X25vbTsKLQlpbnQgaW5zdF9jdXJyOwotCWludCBhdmdfY3VycjsKLQlpbnQgYmF0X3RlbXA7Ci0JaW50IGZnX3NhbXBsZXM7Ci0JaW50IGFjY3VfY2hhcmdlOwotCWludCByZWNvdmVyeV9jbnQ7Ci0JaW50IGhpZ2hfY3Vycl9jbnQ7Ci0JaW50IGluaXRfY250OwotCWludCBsb3dfYmF0X2NudDsKLQlpbnQgbmJyX2NjZW9jX2lycV9jbnQ7Ci0JYm9vbCByZWNvdmVyeV9uZWVkZWQ7Ci0JYm9vbCBoaWdoX2N1cnJfbW9kZTsKLQlib29sIGluaXRfY2FwYWNpdHk7Ci0JYm9vbCB0dXJuX29mZl9mZzsKLQllbnVtIGFiODUwMF9mZ19jYWxpYnJhdGlvbl9zdGF0ZSBjYWxpYl9zdGF0ZTsKLQllbnVtIGFiODUwMF9mZ19kaXNjaGFyZ2Vfc3RhdGUgZGlzY2hhcmdlX3N0YXRlOwotCWVudW0gYWI4NTAwX2ZnX2NoYXJnZV9zdGF0ZSBjaGFyZ2Vfc3RhdGU7Ci0Jc3RydWN0IGNvbXBsZXRpb24gYWI4NTAwX2ZnX3N0YXJ0ZWQ7Ci0Jc3RydWN0IGNvbXBsZXRpb24gYWI4NTAwX2ZnX2NvbXBsZXRlOwotCXN0cnVjdCBhYjg1MDBfZmdfZmxhZ3MgZmxhZ3M7Ci0Jc3RydWN0IGFiODUwMF9mZ19iYXR0ZXJ5X2NhcGFjaXR5IGJhdF9jYXA7Ci0Jc3RydWN0IGFiODUwMF9mZ19hdmdfY2FwIGF2Z19jYXA7Ci0Jc3RydWN0IGFiODUwMCAqcGFyZW50OwotCXN0cnVjdCBhYjg1MDBfZ3BhZGMgKmdwYWRjOwotCXN0cnVjdCBhYng1MDBfYm1fZGF0YSAqYm07Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqZmdfcHN5OwotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpmZ193cTsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGZnX3BlcmlvZGljX3dvcms7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBmZ19sb3dfYmF0X3dvcms7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBmZ19yZWluaXRfd29yazsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZmdfd29yazsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZmdfYWNjX2N1cl93b3JrOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgZmdfY2hlY2tfaHdfZmFpbHVyZV93b3JrOwotCXN0cnVjdCBtdXRleCBjY19sb2NrOwotCXN0cnVjdCBrb2JqZWN0IGZnX2tvYmplY3Q7Ci19Owotc3RhdGljIExJU1RfSEVBRChhYjg1MDBfZmdfbGlzdCk7Ci0KLS8qKgotICogYWI4NTAwX2ZnX2dldCgpIC0gcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgcHJpbWFyeSBBQjg1MDAgZnVlbCBnYXVnZQotICogKGkuZS4gdGhlIGZpcnN0IGZ1ZWwgZ2F1Z2UgaW4gdGhlIGluc3RhbmNlIGxpc3QpCi0gKi8KLXN0cnVjdCBhYjg1MDBfZmcgKmFiODUwMF9mZ19nZXQodm9pZCkKLXsKLQlzdHJ1Y3QgYWI4NTAwX2ZnICpmZzsKLQotCWlmIChsaXN0X2VtcHR5KCZhYjg1MDBfZmdfbGlzdCkpCi0JCXJldHVybiBOVUxMOwotCi0JZmcgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhYjg1MDBfZmdfbGlzdCwgc3RydWN0IGFiODUwMF9mZywgbm9kZSk7Ci0JcmV0dXJuIGZnOwotfQotCi0vKiBNYWluIGJhdHRlcnkgcHJvcGVydGllcyAqLwotc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IGFiODUwMF9mZ19wcm9wc1tdID0gewotCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfQVZHLAotCVBPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9GVUxMX0RFU0lHTiwKLQlQT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfRlVMTCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfTk9XLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMX0RFU0lHTiwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZX0xFVkVMLAotfTsKLQotLyoKLSAqIFRoaXMgYXJyYXkgbWFwcyB0aGUgcmF3IGhleCB2YWx1ZSB0byBsb3diYXQgdm9sdGFnZSB1c2VkIGJ5IHRoZSBBQjg1MDAKLSAqIFZhbHVlcyB0YWtlbiBmcm9tIHRoZSBVTTA4MzYKLSAqLwotc3RhdGljIGludCBhYjg1MDBfZmdfbG93YmF0X3ZvbHRhZ2VfbWFwW10gPSB7Ci0JMjMwMCAsCi0JMjMyNSAsCi0JMjM1MCAsCi0JMjM3NSAsCi0JMjQwMCAsCi0JMjQyNSAsCi0JMjQ1MCAsCi0JMjQ3NSAsCi0JMjUwMCAsCi0JMjUyNSAsCi0JMjU1MCAsCi0JMjU3NSAsCi0JMjYwMCAsCi0JMjYyNSAsCi0JMjY1MCAsCi0JMjY3NSAsCi0JMjcwMCAsCi0JMjcyNSAsCi0JMjc1MCAsCi0JMjc3NSAsCi0JMjgwMCAsCi0JMjgyNSAsCi0JMjg1MCAsCi0JMjg3NSAsCi0JMjkwMCAsCi0JMjkyNSAsCi0JMjk1MCAsCi0JMjk3NSAsCi0JMzAwMCAsCi0JMzAyNSAsCi0JMzA1MCAsCi0JMzA3NSAsCi0JMzEwMCAsCi0JMzEyNSAsCi0JMzE1MCAsCi0JMzE3NSAsCi0JMzIwMCAsCi0JMzIyNSAsCi0JMzI1MCAsCi0JMzI3NSAsCi0JMzMwMCAsCi0JMzMyNSAsCi0JMzM1MCAsCi0JMzM3NSAsCi0JMzQwMCAsCi0JMzQyNSAsCi0JMzQ1MCAsCi0JMzQ3NSAsCi0JMzUwMCAsCi0JMzUyNSAsCi0JMzU1MCAsCi0JMzU3NSAsCi0JMzYwMCAsCi0JMzYyNSAsCi0JMzY1MCAsCi0JMzY3NSAsCi0JMzcwMCAsCi0JMzcyNSAsCi0JMzc1MCAsCi0JMzc3NSAsCi0JMzgwMCAsCi0JMzgyNSAsCi0JMzg1MCAsCi0JMzg1MCAsCi19OwotCi1zdGF0aWMgdTggYWI4NTAwX3ZvbHRfdG9fcmVndmFsKGludCB2b2x0YWdlKQotewotCWludCBpOwotCi0JaWYgKHZvbHRhZ2UgPCBhYjg1MDBfZmdfbG93YmF0X3ZvbHRhZ2VfbWFwWzBdKQotCQlyZXR1cm4gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFiODUwMF9mZ19sb3diYXRfdm9sdGFnZV9tYXApOyBpKyspIHsKLQkJaWYgKHZvbHRhZ2UgPCBhYjg1MDBfZmdfbG93YmF0X3ZvbHRhZ2VfbWFwW2ldKQotCQkJcmV0dXJuICh1OCkgaSAtIDE7Ci0JfQotCi0JLyogSWYgbm90IGNhcHR1cmVkIGFib3ZlLCByZXR1cm4gaW5kZXggb2YgbGFzdCBlbGVtZW50ICovCi0JcmV0dXJuICh1OCkgQVJSQVlfU0laRShhYjg1MDBfZmdfbG93YmF0X3ZvbHRhZ2VfbWFwKSAtIDE7Ci19Ci0KLS8qKgotICogYWI4NTAwX2ZnX2lzX2xvd19jdXJyKCkgLSBMb3cgb3IgaGlnaCBjdXJyZW50IG1vZGUKLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKLSAqIEBjdXJyOgl0aGUgY3VycmVudCB0byBiYXNlIG9yIG91ciBkZWNpc2lvbiBvbgotICoKLSAqIExvdyBjdXJyZW50IG1vZGUgaWYgdGhlIGN1cnJlbnQgY29uc3VtcHRpb24gaXMgYmVsb3cgYSBjZXJ0YWluIHRocmVzaG9sZAotICovCi1zdGF0aWMgaW50IGFiODUwMF9mZ19pc19sb3dfY3VycihzdHJ1Y3QgYWI4NTAwX2ZnICpkaSwgaW50IGN1cnIpCi17Ci0JLyoKLQkgKiBXZSB3YW50IHRvIGtub3cgaWYgd2UncmUgaW4gbG93IGN1cnJlbnQgbW9kZQotCSAqLwotCWlmIChjdXJyID4gLWRpLT5ibS0+ZmdfcGFyYW1zLT5oaWdoX2N1cnJfdGhyZXNob2xkKQotCQlyZXR1cm4gdHJ1ZTsKLQllbHNlCi0JCXJldHVybiBmYWxzZTsKLX0KLQotLyoqCi0gKiBhYjg1MDBfZmdfYWRkX2NhcF9zYW1wbGUoKSAtIEFkZCBjYXBhY2l0eSB0byBhdmVyYWdlIGZpbHRlcgotICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2ZnIHN0cnVjdHVyZQotICogQHNhbXBsZToJdGhlIGNhcGFjaXR5IGluIG1BaCB0byBhZGQgdG8gdGhlIGZpbHRlcgotICoKLSAqIEEgY2FwYWNpdHkgaXMgYWRkZWQgdG8gdGhlIGZpbHRlciBhbmQgYSBuZXcgbWVhbiBjYXBhY2l0eSBpcyBjYWxjdWxhdGVkIGFuZAotICogcmV0dXJuZWQKLSAqLwotc3RhdGljIGludCBhYjg1MDBfZmdfYWRkX2NhcF9zYW1wbGUoc3RydWN0IGFiODUwMF9mZyAqZGksIGludCBzYW1wbGUpCi17Ci0Jc3RydWN0IHRpbWVzcGVjNjQgdHM2NDsKLQlzdHJ1Y3QgYWI4NTAwX2ZnX2F2Z19jYXAgKmF2ZyA9ICZkaS0+YXZnX2NhcDsKLQotCWdldG5zdGltZW9mZGF5NjQoJnRzNjQpOwotCi0JZG8gewotCQlhdmctPnN1bSArPSBzYW1wbGUgLSBhdmctPnNhbXBsZXNbYXZnLT5wb3NdOwotCQlhdmctPnNhbXBsZXNbYXZnLT5wb3NdID0gc2FtcGxlOwotCQlhdmctPnRpbWVfc3RhbXBzW2F2Zy0+cG9zXSA9IHRzNjQudHZfc2VjOwotCQlhdmctPnBvcysrOwotCi0JCWlmIChhdmctPnBvcyA9PSBOQlJfQVZHX1NBTVBMRVMpCi0JCQlhdmctPnBvcyA9IDA7Ci0KLQkJaWYgKGF2Zy0+bmJyX3NhbXBsZXMgPCBOQlJfQVZHX1NBTVBMRVMpCi0JCQlhdmctPm5icl9zYW1wbGVzKys7Ci0KLQkJLyoKLQkJICogQ2hlY2sgdGhlIHRpbWUgc3RhbXAgZm9yIGVhY2ggc2FtcGxlLiBJZiB0b28gb2xkLAotCQkgKiByZXBsYWNlIHdpdGggbGF0ZXN0IHNhbXBsZQotCQkgKi8KLQl9IHdoaWxlICh0czY0LnR2X3NlYyAtIFZBTElEX0NBUEFDSVRZX1NFQyA+IGF2Zy0+dGltZV9zdGFtcHNbYXZnLT5wb3NdKTsKLQotCWF2Zy0+YXZnID0gYXZnLT5zdW0gLyBhdmctPm5icl9zYW1wbGVzOwotCi0JcmV0dXJuIGF2Zy0+YXZnOwotfQotCi0vKioKLSAqIGFiODUwMF9mZ19jbGVhcl9jYXBfc2FtcGxlcygpIC0gQ2xlYXIgYXZlcmFnZSBmaWx0ZXIKLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKLSAqCi0gKiBUaGUgY2FwYWNpdHkgZmlsdGVyIGlzIGlzIHJlc2V0IHRvIHplcm8uCi0gKi8KLXN0YXRpYyB2b2lkIGFiODUwMF9mZ19jbGVhcl9jYXBfc2FtcGxlcyhzdHJ1Y3QgYWI4NTAwX2ZnICpkaSkKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgYWI4NTAwX2ZnX2F2Z19jYXAgKmF2ZyA9ICZkaS0+YXZnX2NhcDsKLQotCWF2Zy0+cG9zID0gMDsKLQlhdmctPm5icl9zYW1wbGVzID0gMDsKLQlhdmctPnN1bSA9IDA7Ci0JYXZnLT5hdmcgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IE5CUl9BVkdfU0FNUExFUzsgaSsrKSB7Ci0JCWF2Zy0+c2FtcGxlc1tpXSA9IDA7Ci0JCWF2Zy0+dGltZV9zdGFtcHNbaV0gPSAwOwotCX0KLX0KLQotLyoqCi0gKiBhYjg1MDBfZmdfZmlsbF9jYXBfc2FtcGxlKCkgLSBGaWxsIGF2ZXJhZ2UgZmlsdGVyCi0gKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfZmcgc3RydWN0dXJlCi0gKiBAc2FtcGxlOgl0aGUgY2FwYWNpdHkgaW4gbUFoIHRvIGZpbGwgdGhlIGZpbHRlciB3aXRoCi0gKgotICogVGhlIGNhcGFjaXR5IGZpbHRlciBpcyBmaWxsZWQgd2l0aCBhIGNhcGFjaXR5IGluIG1BaAotICovCi1zdGF0aWMgdm9pZCBhYjg1MDBfZmdfZmlsbF9jYXBfc2FtcGxlKHN0cnVjdCBhYjg1MDBfZmcgKmRpLCBpbnQgc2FtcGxlKQotewotCWludCBpOwotCXN0cnVjdCB0aW1lc3BlYzY0IHRzNjQ7Ci0Jc3RydWN0IGFiODUwMF9mZ19hdmdfY2FwICphdmcgPSAmZGktPmF2Z19jYXA7Ci0KLQlnZXRuc3RpbWVvZmRheTY0KCZ0czY0KTsKLQotCWZvciAoaSA9IDA7IGkgPCBOQlJfQVZHX1NBTVBMRVM7IGkrKykgewotCQlhdmctPnNhbXBsZXNbaV0gPSBzYW1wbGU7Ci0JCWF2Zy0+dGltZV9zdGFtcHNbaV0gPSB0czY0LnR2X3NlYzsKLQl9Ci0KLQlhdmctPnBvcyA9IDA7Ci0JYXZnLT5uYnJfc2FtcGxlcyA9IE5CUl9BVkdfU0FNUExFUzsKLQlhdmctPnN1bSA9IHNhbXBsZSAqIE5CUl9BVkdfU0FNUExFUzsKLQlhdmctPmF2ZyA9IHNhbXBsZTsKLX0KLQotLyoqCi0gKiBhYjg1MDBfZmdfY291bG9tYl9jb3VudGVyKCkgLSBlbmFibGUgY291bG9tYiBjb3VudGVyCi0gKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfZmcgc3RydWN0dXJlCi0gKiBAZW5hYmxlOgllbmFibGUvZGlzYWJsZQotICoKLSAqIEVuYWJsZS9EaXNhYmxlIGNvdWxvbWIgY291bnRlci4KLSAqIE9uIGZhaWx1cmUgcmV0dXJucyBuZWdhdGl2ZSB2YWx1ZS4KLSAqLwotc3RhdGljIGludCBhYjg1MDBfZmdfY291bG9tYl9jb3VudGVyKHN0cnVjdCBhYjg1MDBfZmcgKmRpLCBib29sIGVuYWJsZSkKLXsKLQlpbnQgcmV0ID0gMDsKLQltdXRleF9sb2NrKCZkaS0+Y2NfbG9jayk7Ci0JaWYgKGVuYWJsZSkgewotCQkvKiBUbyBiZSBhYmxlIHRvIHJlcHJvZ3JhbSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMsIHdlIGhhdmUgdG8KLQkJICogZmlyc3Qgc3RvcCB0aGUgQ0MgYW5kIHRoZW4gZW5hYmxlIGl0IGFnYWluICovCi0JCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfUlRDLAotCQkJQUI4NTAwX1JUQ19DQ19DT05GX1JFRywgMHgwMCk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGNjX2VycjsKLQotCQkvKiBQcm9ncmFtIHRoZSBzYW1wbGVzICovCi0JCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAotCQkJQUI4NTAwX0dBU19HQVVHRSwgQUI4NTAwX0dBU0dfQ0NfTkNPVl9BQ0NVLAotCQkJZGktPmZnX3NhbXBsZXMpOwotCQlpZiAocmV0KQotCQkJZ290byBjY19lcnI7Ci0KLQkJLyogU3RhcnQgdGhlIENDICovCi0JCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfUlRDLAotCQkJQUI4NTAwX1JUQ19DQ19DT05GX1JFRywKLQkJCShDQ19ERUVQX1NMRUVQX0VOQSB8IENDX1BXUl9VUF9FTkEpKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gY2NfZXJyOwotCi0JCWRpLT5mbGFncy5mZ19lbmFibGVkID0gdHJ1ZTsKLQl9IGVsc2UgewotCQkvKiBDbGVhciBhbnkgcGVuZGluZyByZWFkIHJlcXVlc3RzICovCi0JCXJldCA9IGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAotCQkJQUI4NTAwX0dBU19HQVVHRSwgQUI4NTAwX0dBU0dfQ0NfQ1RSTF9SRUcsCi0JCQkoUkVTRVRfQUNDVSB8IFJFQURfUkVRKSwgMCk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGNjX2VycjsKLQotCQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKLQkJCUFCODUwMF9HQVNfR0FVR0UsIEFCODUwMF9HQVNHX0NDX05DT1ZfQUNDVV9DVFJMLCAwKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gY2NfZXJyOwotCi0JCS8qIFN0b3AgdGhlIENDICovCi0JCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfUlRDLAotCQkJQUI4NTAwX1JUQ19DQ19DT05GX1JFRywgMCk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGNjX2VycjsKLQotCQlkaS0+ZmxhZ3MuZmdfZW5hYmxlZCA9IGZhbHNlOwotCi0JfQotCWRldl9kYmcoZGktPmRldiwgIiBDQyBlbmFibGVkOiAlZCBTYW1wbGVzOiAlZFxuIiwKLQkJZW5hYmxlLCBkaS0+Zmdfc2FtcGxlcyk7Ci0KLQltdXRleF91bmxvY2soJmRpLT5jY19sb2NrKTsKLQotCXJldHVybiByZXQ7Ci1jY19lcnI6Ci0JZGV2X2VycihkaS0+ZGV2LCAiJXMgRW5hYmxpbmcgY291bG9tYiBjb3VudGVyIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCW11dGV4X3VubG9jaygmZGktPmNjX2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogYWI4NTAwX2ZnX2luc3RfY3Vycl9zdGFydCgpIC0gc3RhcnQgYmF0dGVyeSBpbnN0YW50YW5lb3VzIGN1cnJlbnQKLSAqIEBkaTogICAgICAgICBwb2ludGVyIHRvIHRoZSBhYjg1MDBfZmcgc3RydWN0dXJlCi0gKgotICogUmV0dXJucyAwIG9yIGVycm9yIGNvZGUKLSAqIE5vdGU6IFRoaXMgaXMgcGFydCAib25lIiBhbmQgaGFzIHRvIGJlIGNhbGxlZCBiZWZvcmUKLSAqIGFiODUwMF9mZ19pbnN0X2N1cnJfZmluYWxpemUoKQotICovCi1pbnQgYWI4NTAwX2ZnX2luc3RfY3Vycl9zdGFydChzdHJ1Y3QgYWI4NTAwX2ZnICpkaSkKLXsKLQl1OCByZWdfdmFsOwotCWludCByZXQ7Ci0KLQltdXRleF9sb2NrKCZkaS0+Y2NfbG9jayk7Ci0KLQlkaS0+bmJyX2NjZW9jX2lycV9jbnQgPSAwOwotCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfUlRDLAotCQlBQjg1MDBfUlRDX0NDX0NPTkZfUkVHLCAmcmVnX3ZhbCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZmFpbDsKLQotCWlmICghKHJlZ192YWwgJiBDQ19QV1JfVVBfRU5BKSkgewotCQlkZXZfZGJnKGRpLT5kZXYsICIlcyBFbmFibGUgRkdcbiIsIF9fZnVuY19fKTsKLQkJZGktPnR1cm5fb2ZmX2ZnID0gdHJ1ZTsKLQotCQkvKiBQcm9ncmFtIHRoZSBzYW1wbGVzICovCi0JCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAotCQkJQUI4NTAwX0dBU19HQVVHRSwgQUI4NTAwX0dBU0dfQ0NfTkNPVl9BQ0NVLAotCQkJU0VDX1RPX1NBTVBMRSgxMCkpOwotCQlpZiAocmV0KQotCQkJZ290byBmYWlsOwotCi0JCS8qIFN0YXJ0IHRoZSBDQyAqLwotCQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX1JUQywKLQkJCUFCODUwMF9SVENfQ0NfQ09ORl9SRUcsCi0JCQkoQ0NfREVFUF9TTEVFUF9FTkEgfCBDQ19QV1JfVVBfRU5BKSk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGZhaWw7Ci0JfSBlbHNlIHsKLQkJZGktPnR1cm5fb2ZmX2ZnID0gZmFsc2U7Ci0JfQotCi0JLyogUmV0dXJuIGFuZCBXRkkgKi8KLQlyZWluaXRfY29tcGxldGlvbigmZGktPmFiODUwMF9mZ19zdGFydGVkKTsKLQlyZWluaXRfY29tcGxldGlvbigmZGktPmFiODUwMF9mZ19jb21wbGV0ZSk7Ci0JZW5hYmxlX2lycShkaS0+aXJxKTsKLQotCS8qIE5vdGU6IGNjX2xvY2sgaXMgc3RpbGwgbG9ja2VkICovCi0JcmV0dXJuIDA7Ci1mYWlsOgotCW11dGV4X3VubG9jaygmZGktPmNjX2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogYWI4NTAwX2ZnX2luc3RfY3Vycl9zdGFydGVkKCkgLSBjaGVjayBpZiBmZyBjb252ZXJzaW9uIGhhcyBzdGFydGVkCi0gKiBAZGk6ICAgICAgICAgcG9pbnRlciB0byB0aGUgYWI4NTAwX2ZnIHN0cnVjdHVyZQotICoKLSAqIFJldHVybnMgMSBpZiBjb252ZXJzaW9uIHN0YXJ0ZWQsIDAgaWYgc3RpbGwgd2FpdGluZwotICovCi1pbnQgYWI4NTAwX2ZnX2luc3RfY3Vycl9zdGFydGVkKHN0cnVjdCBhYjg1MDBfZmcgKmRpKQotewotCXJldHVybiBjb21wbGV0aW9uX2RvbmUoJmRpLT5hYjg1MDBfZmdfc3RhcnRlZCk7Ci19Ci0KLS8qKgotICogYWI4NTAwX2ZnX2luc3RfY3Vycl9kb25lKCkgLSBjaGVjayBpZiBmZyBjb252ZXJzaW9uIGlzIGRvbmUKLSAqIEBkaTogICAgICAgICBwb2ludGVyIHRvIHRoZSBhYjg1MDBfZmcgc3RydWN0dXJlCi0gKgotICogUmV0dXJucyAxIGlmIGNvbnZlcnNpb24gZG9uZSwgMCBpZiBzdGlsbCB3YWl0aW5nCi0gKi8KLWludCBhYjg1MDBfZmdfaW5zdF9jdXJyX2RvbmUoc3RydWN0IGFiODUwMF9mZyAqZGkpCi17Ci0JcmV0dXJuIGNvbXBsZXRpb25fZG9uZSgmZGktPmFiODUwMF9mZ19jb21wbGV0ZSk7Ci19Ci0KLS8qKgotICogYWI4NTAwX2ZnX2luc3RfY3Vycl9maW5hbGl6ZSgpIC0gYmF0dGVyeSBpbnN0YW50YW5lb3VzIGN1cnJlbnQKLSAqIEBkaTogICAgICAgICBwb2ludGVyIHRvIHRoZSBhYjg1MDBfZmcgc3RydWN0dXJlCi0gKiBAcmVzOgliYXR0ZXJ5IGluc3RhbnRlbm91cyBjdXJyZW50KG9uIHN1Y2Nlc3MpCi0gKgotICogUmV0dXJucyAwIG9yIGFuIGVycm9yIGNvZGUKLSAqIE5vdGU6IFRoaXMgaXMgcGFydCAidHdvIiBhbmQgaGFzIHRvIGJlIGNhbGxlZCBhdCBlYXJsaWVzdCAyNTAgbXMKLSAqIGFmdGVyIGFiODUwMF9mZ19pbnN0X2N1cnJfc3RhcnQoKQotICovCi1pbnQgYWI4NTAwX2ZnX2luc3RfY3Vycl9maW5hbGl6ZShzdHJ1Y3QgYWI4NTAwX2ZnICpkaSwgaW50ICpyZXMpCi17Ci0JdTggbG93LCBoaWdoOwotCWludCB2YWw7Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0KLQlpZiAoIWNvbXBsZXRpb25fZG9uZSgmZGktPmFiODUwMF9mZ19jb21wbGV0ZSkpIHsKLQkJdGltZW91dCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgKLQkJCSZkaS0+YWI4NTAwX2ZnX2NvbXBsZXRlLAotCQkJSU5TX0NVUlJfVElNRU9VVCk7Ci0JCWRldl9kYmcoZGktPmRldiwgIkZpbmFsaXplIHRpbWU6ICVkIG1zXG4iLAotCQkJamlmZmllc190b19tc2VjcyhJTlNfQ1VSUl9USU1FT1VUIC0gdGltZW91dCkpOwotCQlpZiAoIXRpbWVvdXQpIHsKLQkJCXJldCA9IC1FVElNRTsKLQkJCWRpc2FibGVfaXJxKGRpLT5pcnEpOwotCQkJZGktPm5icl9jY2VvY19pcnFfY250ID0gMDsKLQkJCWRldl9lcnIoZGktPmRldiwgImNvbXBsZXRpb24gdGltZWQgb3V0IFslZF1cbiIsCi0JCQkJX19MSU5FX18pOwotCQkJZ290byBmYWlsOwotCQl9Ci0JfQotCi0JZGlzYWJsZV9pcnEoZGktPmlycSk7Ci0JZGktPm5icl9jY2VvY19pcnFfY250ID0gMDsKLQotCXJldCA9IGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAotCQkJQUI4NTAwX0dBU19HQVVHRSwgQUI4NTAwX0dBU0dfQ0NfQ1RSTF9SRUcsCi0JCQlSRUFEX1JFUSwgUkVBRF9SRVEpOwotCi0JLyogMTAwdVMgYmV0d2VlbiByZWFkIHJlcXVlc3QgYW5kIHJlYWQgaXMgbmVlZGVkICovCi0JdXNsZWVwX3JhbmdlKDEwMCwgMTAwKTsKLQotCS8qIFJlYWQgQ0MgU2FtcGxlIGNvbnZlcnNpb24gdmFsdWUgTG93IGFuZCBoaWdoICovCi0JcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9HQVNfR0FVR0UsCi0JCUFCODUwMF9HQVNHX0NDX1NNUExfQ05WTF9SRUcsICAmbG93KTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBmYWlsOwotCi0JcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9HQVNfR0FVR0UsCi0JCUFCODUwMF9HQVNHX0NDX1NNUExfQ05WSF9SRUcsICAmaGlnaCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZmFpbDsKLQotCS8qCi0JICogbmVnYXRpdmUgdmFsdWUgZm9yIERpc2NoYXJnaW5nCi0JICogY29udmVydCAyJ3MgY29tcGxpbWVudCBpbnRvIGRlY2ltYWwKLQkgKi8KLQlpZiAoaGlnaCAmIDB4MTApCi0JCXZhbCA9IChsb3cgfCAoaGlnaCA8PCA4KSB8IDB4RkZGRkUwMDApOwotCWVsc2UKLQkJdmFsID0gKGxvdyB8IChoaWdoIDw8IDgpKTsKLQotCS8qCi0JICogQ29udmVydCB0byB1bml0IHZhbHVlIGluIG1BCi0JICogRnVsbCBzY2FsZSBpbnB1dCB2b2x0YWdlIGlzCi0JICogNjMuMTYwbVYgPT4gTFNCID0gNjMuMTYwbVYvKDQwOTYqcmVzKSA9IDEuNTQybUEKLQkgKiBHaXZlbiBhIDI1MG1zIGNvbnZlcnNpb24gY3ljbGUgdGltZSB0aGUgTFNCIGNvcnJlc3BvbmRzCi0JICogdG8gMTA3LjEgbkFoLiBDb252ZXJ0IHRvIGN1cnJlbnQgYnkgZGl2aWRpbmcgYnkgdGhlIGNvbnZlcnNpb24KLQkgKiB0aW1lIGluIGhvdXJzICgyNTBtcyA9IDEgLyAoMzYwMCAqIDQpaCkKLQkgKiAxMDcuMW5BaCBhc3N1bWVzIDEwbU9obSwgYnV0IGZnX3JlcyBpcyBpbiAwLjFtT2htCi0JICovCi0JdmFsID0gKHZhbCAqIFFMU0JfTkFOT19BTVBfSE9VUlNfWDEwICogMzYgKiA0KSAvCi0JCSgxMDAwICogZGktPmJtLT5mZ19yZXMpOwotCi0JaWYgKGRpLT50dXJuX29mZl9mZykgewotCQlkZXZfZGJnKGRpLT5kZXYsICIlcyBEaXNhYmxlIEZHXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJLyogQ2xlYXIgYW55IHBlbmRpbmcgcmVhZCByZXF1ZXN0cyAqLwotCQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKLQkJCUFCODUwMF9HQVNfR0FVR0UsIEFCODUwMF9HQVNHX0NDX0NUUkxfUkVHLCAwKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZmFpbDsKLQotCQkvKiBTdG9wIHRoZSBDQyAqLwotCQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX1JUQywKLQkJCUFCODUwMF9SVENfQ0NfQ09ORl9SRUcsIDApOwotCQlpZiAocmV0KQotCQkJZ290byBmYWlsOwotCX0KLQltdXRleF91bmxvY2soJmRpLT5jY19sb2NrKTsKLQkoKnJlcykgPSB2YWw7Ci0KLQlyZXR1cm4gMDsKLWZhaWw6Ci0JbXV0ZXhfdW5sb2NrKCZkaS0+Y2NfbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBhYjg1MDBfZmdfaW5zdF9jdXJyX2Jsb2NraW5nKCkgLSBiYXR0ZXJ5IGluc3RhbnRhbmVvdXMgY3VycmVudAotICogQGRpOiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKLSAqIEByZXM6CWJhdHRlcnkgaW5zdGFudGVub3VzIGN1cnJlbnQob24gc3VjY2VzcykKLSAqCi0gKiBSZXR1cm5zIDAgZWxzZSBlcnJvciBjb2RlCi0gKi8KLWludCBhYjg1MDBfZmdfaW5zdF9jdXJyX2Jsb2NraW5nKHN0cnVjdCBhYjg1MDBfZmcgKmRpKQotewotCWludCByZXQ7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OwotCWludCByZXMgPSAwOwotCi0JcmV0ID0gYWI4NTAwX2ZnX2luc3RfY3Vycl9zdGFydChkaSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRpLT5kZXYsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBmZ19pbnN0XG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogV2FpdCBmb3IgQ0MgdG8gYWN0dWFsbHkgc3RhcnQgKi8KLQlpZiAoIWNvbXBsZXRpb25fZG9uZSgmZGktPmFiODUwMF9mZ19zdGFydGVkKSkgewotCQl0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KAotCQkJJmRpLT5hYjg1MDBfZmdfc3RhcnRlZCwKLQkJCUlOU19DVVJSX1RJTUVPVVQpOwotCQlkZXZfZGJnKGRpLT5kZXYsICJTdGFydCB0aW1lOiAlZCBtc1xuIiwKLQkJCWppZmZpZXNfdG9fbXNlY3MoSU5TX0NVUlJfVElNRU9VVCAtIHRpbWVvdXQpKTsKLQkJaWYgKCF0aW1lb3V0KSB7Ci0JCQlyZXQgPSAtRVRJTUU7Ci0JCQlkZXZfZXJyKGRpLT5kZXYsICJjb21wbGV0aW9uIHRpbWVkIG91dCBbJWRdXG4iLAotCQkJCV9fTElORV9fKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCX0KLQotCXJldCA9IGFiODUwMF9mZ19pbnN0X2N1cnJfZmluYWxpemUoZGksICZyZXMpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihkaS0+ZGV2LCAiRmFpbGVkIHRvIGZpbmFsaXplIGZnX2luc3RcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlkZXZfZGJnKGRpLT5kZXYsICIlcyBpbnN0YW50IGN1cnJlbnQ6ICVkIiwgX19mdW5jX18sIHJlcyk7Ci0JcmV0dXJuIHJlczsKLWZhaWw6Ci0JZGlzYWJsZV9pcnEoZGktPmlycSk7Ci0JbXV0ZXhfdW5sb2NrKCZkaS0+Y2NfbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBhYjg1MDBfZmdfYWNjX2N1cl93b3JrKCkgLSBhdmVyYWdlIGJhdHRlcnkgY3VycmVudAotICogQHdvcms6CXBvaW50ZXIgdG8gdGhlIHdvcmtfc3RydWN0IHN0cnVjdHVyZQotICoKLSAqIFVwZGF0ZWQgdGhlIGF2ZXJhZ2UgYmF0dGVyeSBjdXJyZW50IG9idGFpbmVkIGZyb20gdGhlCi0gKiBjb3Vsb21iIGNvdW50ZXIuCi0gKi8KLXN0YXRpYyB2b2lkIGFiODUwMF9mZ19hY2NfY3VyX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCWludCB2YWw7Ci0JaW50IHJldDsKLQl1OCBsb3csIG1lZCwgaGlnaDsKLQotCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gY29udGFpbmVyX29mKHdvcmssCi0JCXN0cnVjdCBhYjg1MDBfZmcsIGZnX2FjY19jdXJfd29yayk7Ci0KLQltdXRleF9sb2NrKCZkaS0+Y2NfbG9jayk7Ci0JcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9HQVNfR0FVR0UsCi0JCUFCODUwMF9HQVNHX0NDX05DT1ZfQUNDVV9DVFJMLCBSRF9OQ09OVl9BQ0NVX1JFUSk7Ci0JaWYgKHJldCkKLQkJZ290byBleGl0OwotCi0JcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9HQVNfR0FVR0UsCi0JCUFCODUwMF9HQVNHX0NDX05DT1ZfQUNDVV9MT1csICAmbG93KTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBleGl0OwotCi0JcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9HQVNfR0FVR0UsCi0JCUFCODUwMF9HQVNHX0NDX05DT1ZfQUNDVV9NRUQsICAmbWVkKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBleGl0OwotCi0JcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9HQVNfR0FVR0UsCi0JCUFCODUwMF9HQVNHX0NDX05DT1ZfQUNDVV9ISUdILCAmaGlnaCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXhpdDsKLQotCS8qIENoZWNrIGZvciBzaWduIGJpdCBpbiBjYXNlIG9mIG5lZ2F0aXZlIHZhbHVlLCAyJ3MgY29tcGxpbWVudCAqLwotCWlmIChoaWdoICYgMHgxMCkKLQkJdmFsID0gKGxvdyB8IChtZWQgPDwgOCkgfCAoaGlnaCA8PCAxNikgfCAweEZGRTAwMDAwKTsKLQllbHNlCi0JCXZhbCA9IChsb3cgfCAobWVkIDw8IDgpIHwgKGhpZ2ggPDwgMTYpKTsKLQotCS8qCi0JICogQ29udmVydCB0byB1QWgKLQkgKiBHaXZlbiBhIDI1MG1zIGNvbnZlcnNpb24gY3ljbGUgdGltZSB0aGUgTFNCIGNvcnJlc3BvbmRzCi0JICogdG8gMTEyLjkgbkFoLgotCSAqIDExMi45bkFoIGFzc3VtZXMgMTBtT2htLCBidXQgZmdfcmVzIGlzIGluIDAuMW1PaG0KLQkgKi8KLQlkaS0+YWNjdV9jaGFyZ2UgPSAodmFsICogUUxTQl9OQU5PX0FNUF9IT1VSU19YMTApIC8KLQkJKDEwMCAqIGRpLT5ibS0+ZmdfcmVzKTsKLQotCS8qCi0JICogQ29udmVydCB0byB1bml0IHZhbHVlIGluIG1BCi0JICogYnkgZGl2aWRpbmcgYnkgdGhlIGNvbnZlcnNpb24KLQkgKiB0aW1lIGluIGhvdXJzICg9IHNhbXBsZXMgLyAoMzYwMCAqIDQpaCkKLQkgKiBhbmQgbXVsdGlwbHkgd2l0aCAxMDAwCi0JICovCi0JZGktPmF2Z19jdXJyID0gKHZhbCAqIFFMU0JfTkFOT19BTVBfSE9VUlNfWDEwICogMzYpIC8KLQkJKDEwMDAgKiBkaS0+Ym0tPmZnX3JlcyAqIChkaS0+Zmdfc2FtcGxlcyAvIDQpKTsKLQotCWRpLT5mbGFncy5jb252X2RvbmUgPSB0cnVlOwotCi0JbXV0ZXhfdW5sb2NrKCZkaS0+Y2NfbG9jayk7Ci0KLQlxdWV1ZV93b3JrKGRpLT5mZ193cSwgJmRpLT5mZ193b3JrKTsKLQotCWRldl9kYmcoZGktPmRldiwgImZnX3JlczogJWQsIGZnX3NhbXBsZXM6ICVkLCBnYXNnOiAlZCwgYWNjdV9jaGFyZ2U6ICVkIFxuIiwKLQkJCQlkaS0+Ym0tPmZnX3JlcywgZGktPmZnX3NhbXBsZXMsIHZhbCwgZGktPmFjY3VfY2hhcmdlKTsKLQlyZXR1cm47Ci1leGl0OgotCWRldl9lcnIoZGktPmRldiwKLQkJIkZhaWxlZCB0byByZWFkIG9yIHdyaXRlIGdhcyBnYXVnZSByZWdpc3RlcnNcbiIpOwotCW11dGV4X3VubG9jaygmZGktPmNjX2xvY2spOwotCXF1ZXVlX3dvcmsoZGktPmZnX3dxLCAmZGktPmZnX3dvcmspOwotfQotCi0vKioKLSAqIGFiODUwMF9mZ19iYXRfdm9sdGFnZSgpIC0gZ2V0IGJhdHRlcnkgdm9sdGFnZQotICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2ZnIHN0cnVjdHVyZQotICoKLSAqIFJldHVybnMgYmF0dGVyeSB2b2x0YWdlKG9uIHN1Y2Nlc3MpIGVsc2UgZXJyb3IgY29kZQotICovCi1zdGF0aWMgaW50IGFiODUwMF9mZ19iYXRfdm9sdGFnZShzdHJ1Y3QgYWI4NTAwX2ZnICpkaSkKLXsKLQlpbnQgdmJhdDsKLQlzdGF0aWMgaW50IHByZXY7Ci0KLQl2YmF0ID0gYWI4NTAwX2dwYWRjX2NvbnZlcnQoZGktPmdwYWRjLCBNQUlOX0JBVF9WKTsKLQlpZiAodmJhdCA8IDApIHsKLQkJZGV2X2VycihkaS0+ZGV2LAotCQkJIiVzIGdwYWRjIGNvbnZlcnNpb24gZmFpbGVkLCB1c2luZyBwcmV2aW91cyB2YWx1ZVxuIiwKLQkJCV9fZnVuY19fKTsKLQkJcmV0dXJuIHByZXY7Ci0JfQotCi0JcHJldiA9IHZiYXQ7Ci0JcmV0dXJuIHZiYXQ7Ci19Ci0KLS8qKgotICogYWI4NTAwX2ZnX3ZvbHRfdG9fY2FwYWNpdHkoKSAtIFZvbHRhZ2UgYmFzZWQgY2FwYWNpdHkKLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKLSAqIEB2b2x0YWdlOglUaGUgdm9sdGFnZSB0byBjb252ZXJ0IHRvIGEgY2FwYWNpdHkKLSAqCi0gKiBSZXR1cm5zIGJhdHRlcnkgY2FwYWNpdHkgaW4gcGVyIG1pbGxlIGJhc2VkIG9uIHZvbHRhZ2UKLSAqLwotc3RhdGljIGludCBhYjg1MDBfZmdfdm9sdF90b19jYXBhY2l0eShzdHJ1Y3QgYWI4NTAwX2ZnICpkaSwgaW50IHZvbHRhZ2UpCi17Ci0JaW50IGksIHRibF9zaXplOwotCWNvbnN0IHN0cnVjdCBhYng1MDBfdl90b19jYXAgKnRibDsKLQlpbnQgY2FwID0gMDsKLQotCXRibCA9IGRpLT5ibS0+YmF0X3R5cGVbZGktPmJtLT5iYXR0X2lkXS52X3RvX2NhcF90YmwsCi0JdGJsX3NpemUgPSBkaS0+Ym0tPmJhdF90eXBlW2RpLT5ibS0+YmF0dF9pZF0ubl92X2NhcF90YmxfZWxlbWVudHM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgdGJsX3NpemU7ICsraSkgewotCQlpZiAodm9sdGFnZSA+IHRibFtpXS52b2x0YWdlKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKChpID4gMCkgJiYgKGkgPCB0Ymxfc2l6ZSkpIHsKLQkJY2FwID0gaW50ZXJwb2xhdGUodm9sdGFnZSwKLQkJCXRibFtpXS52b2x0YWdlLAotCQkJdGJsW2ldLmNhcGFjaXR5ICogMTAsCi0JCQl0YmxbaS0xXS52b2x0YWdlLAotCQkJdGJsW2ktMV0uY2FwYWNpdHkgKiAxMCk7Ci0JfSBlbHNlIGlmIChpID09IDApIHsKLQkJY2FwID0gMTAwMDsKLQl9IGVsc2UgewotCQljYXAgPSAwOwotCX0KLQotCWRldl9kYmcoZGktPmRldiwgIiVzIFZiYXQ6ICVkLCBDYXA6ICVkIHBlciBtaWxsZSIsCi0JCV9fZnVuY19fLCB2b2x0YWdlLCBjYXApOwotCi0JcmV0dXJuIGNhcDsKLX0KLQotLyoqCi0gKiBhYjg1MDBfZmdfdW5jb21wX3ZvbHRfdG9fY2FwYWNpdHkoKSAtIFVuY29tcGVuc2F0ZWQgdm9sdGFnZSBiYXNlZCBjYXBhY2l0eQotICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2ZnIHN0cnVjdHVyZQotICoKLSAqIFJldHVybnMgYmF0dGVyeSBjYXBhY2l0eSBiYXNlZCBvbiBiYXR0ZXJ5IHZvbHRhZ2UgdGhhdCBpcyBub3QgY29tcGVuc2F0ZWQKLSAqIGZvciB0aGUgdm9sdGFnZSBkcm9wIGR1ZSB0byB0aGUgbG9hZAotICovCi1zdGF0aWMgaW50IGFiODUwMF9mZ191bmNvbXBfdm9sdF90b19jYXBhY2l0eShzdHJ1Y3QgYWI4NTAwX2ZnICpkaSkKLXsKLQlkaS0+dmJhdCA9IGFiODUwMF9mZ19iYXRfdm9sdGFnZShkaSk7Ci0JcmV0dXJuIGFiODUwMF9mZ192b2x0X3RvX2NhcGFjaXR5KGRpLCBkaS0+dmJhdCk7Ci19Ci0KLS8qKgotICogYWI4NTAwX2ZnX2JhdHRlcnlfcmVzaXN0YW5jZSgpIC0gUmV0dXJucyB0aGUgYmF0dGVyeSBpbm5lciByZXNpc3RhbmNlCi0gKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfZmcgc3RydWN0dXJlCi0gKgotICogUmV0dXJucyBiYXR0ZXJ5IGlubmVyIHJlc2lzdGFuY2UgYWRkZWQgd2l0aCB0aGUgZnVlbCBnYXVnZSByZXNpc3RvciB2YWx1ZQotICogdG8gZ2V0IHRoZSB0b3RhbCByZXNpc3RhbmNlIGluIHRoZSB3aG9sZSBsaW5rIGZyb20gZ25kIHRvIGJhdCsgbm9kZS4KLSAqLwotc3RhdGljIGludCBhYjg1MDBfZmdfYmF0dGVyeV9yZXNpc3RhbmNlKHN0cnVjdCBhYjg1MDBfZmcgKmRpKQotewotCWludCBpLCB0Ymxfc2l6ZTsKLQljb25zdCBzdHJ1Y3QgYmF0cmVzX3ZzX3RlbXAgKnRibDsKLQlpbnQgcmVzaXN0ID0gMDsKLQotCXRibCA9IGRpLT5ibS0+YmF0X3R5cGVbZGktPmJtLT5iYXR0X2lkXS5iYXRyZXNfdGJsOwotCXRibF9zaXplID0gZGktPmJtLT5iYXRfdHlwZVtkaS0+Ym0tPmJhdHRfaWRdLm5fYmF0cmVzX3RibF9lbGVtZW50czsKLQotCWZvciAoaSA9IDA7IGkgPCB0Ymxfc2l6ZTsgKytpKSB7Ci0JCWlmIChkaS0+YmF0X3RlbXAgLyAxMCA+IHRibFtpXS50ZW1wKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKChpID4gMCkgJiYgKGkgPCB0Ymxfc2l6ZSkpIHsKLQkJcmVzaXN0ID0gaW50ZXJwb2xhdGUoZGktPmJhdF90ZW1wIC8gMTAsCi0JCQl0YmxbaV0udGVtcCwKLQkJCXRibFtpXS5yZXNpc3QsCi0JCQl0YmxbaS0xXS50ZW1wLAotCQkJdGJsW2ktMV0ucmVzaXN0KTsKLQl9IGVsc2UgaWYgKGkgPT0gMCkgewotCQlyZXNpc3QgPSB0YmxbMF0ucmVzaXN0OwotCX0gZWxzZSB7Ci0JCXJlc2lzdCA9IHRibFt0Ymxfc2l6ZSAtIDFdLnJlc2lzdDsKLQl9Ci0KLQlkZXZfZGJnKGRpLT5kZXYsICIlcyBUZW1wOiAlZCBiYXR0ZXJ5IGludGVybmFsIHJlc2lzdGFuY2U6ICVkIgotCSAgICAiIGZnIHJlc2lzdGFuY2UgJWQsIHRvdGFsOiAlZCAobU9obSlcbiIsCi0JCV9fZnVuY19fLCBkaS0+YmF0X3RlbXAsIHJlc2lzdCwgZGktPmJtLT5mZ19yZXMgLyAxMCwKLQkJKGRpLT5ibS0+ZmdfcmVzIC8gMTApICsgcmVzaXN0KTsKLQotCS8qIGZnX3JlcyB2YXJpYWJsZSBpcyBpbiAwLjFtT2htICovCi0JcmVzaXN0ICs9IGRpLT5ibS0+ZmdfcmVzIC8gMTA7Ci0KLQlyZXR1cm4gcmVzaXN0OwotfQotCi0vKioKLSAqIGFiODUwMF9mZ19sb2FkX2NvbXBfdm9sdF90b19jYXBhY2l0eSgpIC0gTG9hZCBjb21wZW5zYXRlZCB2b2x0YWdlIGJhc2VkIGNhcGFjaXR5Ci0gKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfZmcgc3RydWN0dXJlCi0gKgotICogUmV0dXJucyBiYXR0ZXJ5IGNhcGFjaXR5IGJhc2VkIG9uIGJhdHRlcnkgdm9sdGFnZSB0aGF0IGlzIGxvYWQgY29tcGVuc2F0ZWQKLSAqIGZvciB0aGUgdm9sdGFnZSBkcm9wCi0gKi8KLXN0YXRpYyBpbnQgYWI4NTAwX2ZnX2xvYWRfY29tcF92b2x0X3RvX2NhcGFjaXR5KHN0cnVjdCBhYjg1MDBfZmcgKmRpKQotewotCWludCB2YmF0X2NvbXAsIHJlczsKLQlpbnQgaSA9IDA7Ci0JaW50IHZiYXQgPSAwOwotCi0JYWI4NTAwX2ZnX2luc3RfY3Vycl9zdGFydChkaSk7Ci0KLQlkbyB7Ci0JCXZiYXQgKz0gYWI4NTAwX2ZnX2JhdF92b2x0YWdlKGRpKTsKLQkJaSsrOwotCQl1c2xlZXBfcmFuZ2UoNTAwMCwgNjAwMCk7Ci0JfSB3aGlsZSAoIWFiODUwMF9mZ19pbnN0X2N1cnJfZG9uZShkaSkpOwotCi0JYWI4NTAwX2ZnX2luc3RfY3Vycl9maW5hbGl6ZShkaSwgJmRpLT5pbnN0X2N1cnIpOwotCi0JZGktPnZiYXQgPSB2YmF0IC8gaTsKLQlyZXMgPSBhYjg1MDBfZmdfYmF0dGVyeV9yZXNpc3RhbmNlKGRpKTsKLQotCS8qIFVzZSBPaG1zIGxhdyB0byBnZXQgdGhlIGxvYWQgY29tcGVuc2F0ZWQgdm9sdGFnZSAqLwotCXZiYXRfY29tcCA9IGRpLT52YmF0IC0gKGRpLT5pbnN0X2N1cnIgKiByZXMpIC8gMTAwMDsKLQotCWRldl9kYmcoZGktPmRldiwgIiVzIE1lYXN1cmVkIFZiYXQ6ICVkbVYsQ29tcGVuc2F0ZWQgVmJhdCAlZG1WLCAiCi0JCSJSOiAlZG1PaG0sIEN1cnJlbnQ6ICVkbUEgVmJhdCBTYW1wbGVzOiAlZFxuIiwKLQkJX19mdW5jX18sIGRpLT52YmF0LCB2YmF0X2NvbXAsIHJlcywgZGktPmluc3RfY3VyciwgaSk7Ci0KLQlyZXR1cm4gYWI4NTAwX2ZnX3ZvbHRfdG9fY2FwYWNpdHkoZGksIHZiYXRfY29tcCk7Ci19Ci0KLS8qKgotICogYWI4NTAwX2ZnX2NvbnZlcnRfbWFoX3RvX3Blcm1pbGxlKCkgLSBDYXBhY2l0eSBpbiBtQWggdG8gcGVybWlsbGUKLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKLSAqIEBjYXBfbWFoOgljYXBhY2l0eSBpbiBtQWgKLSAqCi0gKiBDb252ZXJ0cyBjYXBhY2l0eSBpbiBtQWggdG8gY2FwYWNpdHkgaW4gcGVybWlsbGUKLSAqLwotc3RhdGljIGludCBhYjg1MDBfZmdfY29udmVydF9tYWhfdG9fcGVybWlsbGUoc3RydWN0IGFiODUwMF9mZyAqZGksIGludCBjYXBfbWFoKQotewotCXJldHVybiAoY2FwX21haCAqIDEwMDApIC8gZGktPmJhdF9jYXAubWF4X21haF9kZXNpZ247Ci19Ci0KLS8qKgotICogYWI4NTAwX2ZnX2NvbnZlcnRfcGVybWlsbGVfdG9fbWFoKCkgLSBDYXBhY2l0eSBpbiBwZXJtaWxsZSB0byBtQWgKLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKLSAqIEBjYXBfcG06CWNhcGFjaXR5IGluIHBlcm1pbGxlCi0gKgotICogQ29udmVydHMgY2FwYWNpdHkgaW4gcGVybWlsbGUgdG8gY2FwYWNpdHkgaW4gbUFoCi0gKi8KLXN0YXRpYyBpbnQgYWI4NTAwX2ZnX2NvbnZlcnRfcGVybWlsbGVfdG9fbWFoKHN0cnVjdCBhYjg1MDBfZmcgKmRpLCBpbnQgY2FwX3BtKQotewotCXJldHVybiBjYXBfcG0gKiBkaS0+YmF0X2NhcC5tYXhfbWFoX2Rlc2lnbiAvIDEwMDA7Ci19Ci0KLS8qKgotICogYWI4NTAwX2ZnX2NvbnZlcnRfbWFoX3RvX3V3aCgpIC0gQ2FwYWNpdHkgaW4gbUFoIHRvIHVXaAotICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2ZnIHN0cnVjdHVyZQotICogQGNhcF9tYWg6CWNhcGFjaXR5IGluIG1BaAotICoKLSAqIENvbnZlcnRzIGNhcGFjaXR5IGluIG1BaCB0byBjYXBhY2l0eSBpbiB1V2gKLSAqLwotc3RhdGljIGludCBhYjg1MDBfZmdfY29udmVydF9tYWhfdG9fdXdoKHN0cnVjdCBhYjg1MDBfZmcgKmRpLCBpbnQgY2FwX21haCkKLXsKLQl1NjQgZGl2X3JlczsKLQl1MzIgZGl2X3JlbTsKLQotCWRpdl9yZXMgPSAoKHU2NCkgY2FwX21haCkgKiAoKHU2NCkgZGktPnZiYXRfbm9tKTsKLQlkaXZfcmVtID0gZG9fZGl2KGRpdl9yZXMsIDEwMDApOwotCi0JLyogTWFrZSBzdXJlIHRvIHJvdW5kIHVwd2FyZHMgaWYgbmVjZXNzYXJ5ICovCi0JaWYgKGRpdl9yZW0gPj0gMTAwMCAvIDIpCi0JCWRpdl9yZXMrKzsKLQotCXJldHVybiAoaW50KSBkaXZfcmVzOwotfQotCi0vKioKLSAqIGFiODUwMF9mZ19jYWxjX2NhcF9jaGFyZ2luZygpIC0gQ2FsY3VsYXRlIHJlbWFpbmluZyBjYXBhY2l0eSB3aGlsZSBjaGFyZ2luZwotICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2ZnIHN0cnVjdHVyZQotICoKLSAqIFJldHVybiB0aGUgY2FwYWNpdHkgaW4gbUFoIGJhc2VkIG9uIHByZXZpb3VzIGNhbGN1bGF0ZWQgY2FwY2l0eSBhbmQgdGhlIEZHCi0gKiBhY2N1bXVsYXRvciByZWdpc3RlciB2YWx1ZS4gVGhlIGZpbHRlciBpcyBmaWxsZWQgd2l0aCB0aGlzIGNhcGFjaXR5Ci0gKi8KLXN0YXRpYyBpbnQgYWI4NTAwX2ZnX2NhbGNfY2FwX2NoYXJnaW5nKHN0cnVjdCBhYjg1MDBfZmcgKmRpKQotewotCWRldl9kYmcoZGktPmRldiwgIiVzIGNhcF9tYWggJWQgYWNjdV9jaGFyZ2UgJWRcbiIsCi0JCV9fZnVuY19fLAotCQlkaS0+YmF0X2NhcC5tYWgsCi0JCWRpLT5hY2N1X2NoYXJnZSk7Ci0KLQkvKiBDYXBhY2l0eSBzaG91bGQgbm90IGJlIGxlc3MgdGhhbiAwICovCi0JaWYgKGRpLT5iYXRfY2FwLm1haCArIGRpLT5hY2N1X2NoYXJnZSA+IDApCi0JCWRpLT5iYXRfY2FwLm1haCArPSBkaS0+YWNjdV9jaGFyZ2U7Ci0JZWxzZQotCQlkaS0+YmF0X2NhcC5tYWggPSAwOwotCS8qCi0JICogV2UgZm9yY2UgY2FwYWNpdHkgdG8gMTAwJSBvbmNlIHdoZW4gdGhlIGFsZ29yaXRobQotCSAqIHJlcG9ydHMgdGhhdCBpdCdzIGZ1bGwuCi0JICovCi0JaWYgKGRpLT5iYXRfY2FwLm1haCA+PSBkaS0+YmF0X2NhcC5tYXhfbWFoX2Rlc2lnbiB8fAotCQlkaS0+ZmxhZ3MuZm9yY2VfZnVsbCkgewotCQlkaS0+YmF0X2NhcC5tYWggPSBkaS0+YmF0X2NhcC5tYXhfbWFoX2Rlc2lnbjsKLQl9Ci0KLQlhYjg1MDBfZmdfZmlsbF9jYXBfc2FtcGxlKGRpLCBkaS0+YmF0X2NhcC5tYWgpOwotCWRpLT5iYXRfY2FwLnBlcm1pbGxlID0KLQkJYWI4NTAwX2ZnX2NvbnZlcnRfbWFoX3RvX3Blcm1pbGxlKGRpLCBkaS0+YmF0X2NhcC5tYWgpOwotCi0JLyogV2UgbmVlZCB0byB1cGRhdGUgYmF0dGVyeSB2b2x0YWdlIGFuZCBpbnN0IGN1cnJlbnQgd2hlbiBjaGFyZ2luZyAqLwotCWRpLT52YmF0ID0gYWI4NTAwX2ZnX2JhdF92b2x0YWdlKGRpKTsKLQlkaS0+aW5zdF9jdXJyID0gYWI4NTAwX2ZnX2luc3RfY3Vycl9ibG9ja2luZyhkaSk7Ci0KLQlyZXR1cm4gZGktPmJhdF9jYXAubWFoOwotfQotCi0vKioKLSAqIGFiODUwMF9mZ19jYWxjX2NhcF9kaXNjaGFyZ2Vfdm9sdGFnZSgpIC0gQ2FwYWNpdHkgaW4gZGlzY2hhcmdlIHdpdGggdm9sdGFnZQotICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2ZnIHN0cnVjdHVyZQotICogQGNvbXA6CWlmIHZvbHRhZ2Ugc2hvdWxkIGJlIGxvYWQgY29tcGVuc2F0ZWQgYmVmb3JlIGNhcGFjaXR5IGNhbGMKLSAqCi0gKiBSZXR1cm4gdGhlIGNhcGFjaXR5IGluIG1BaCBiYXNlZCBvbiB0aGUgYmF0dGVyeSB2b2x0YWdlLiBUaGUgdm9sdGFnZSBjYW4KLSAqIGVpdGhlciBiZSBsb2FkIGNvbXBlbnNhdGVkIG9yIG5vdC4gVGhpcyB2YWx1ZSBpcyBhZGRlZCB0byB0aGUgZmlsdGVyIGFuZCBhCi0gKiBuZXcgbWVhbiB2YWx1ZSBpcyBjYWxjdWxhdGVkIGFuZCByZXR1cm5lZC4KLSAqLwotc3RhdGljIGludCBhYjg1MDBfZmdfY2FsY19jYXBfZGlzY2hhcmdlX3ZvbHRhZ2Uoc3RydWN0IGFiODUwMF9mZyAqZGksIGJvb2wgY29tcCkKLXsKLQlpbnQgcGVybWlsbGUsIG1haDsKLQotCWlmIChjb21wKQotCQlwZXJtaWxsZSA9IGFiODUwMF9mZ19sb2FkX2NvbXBfdm9sdF90b19jYXBhY2l0eShkaSk7Ci0JZWxzZQotCQlwZXJtaWxsZSA9IGFiODUwMF9mZ191bmNvbXBfdm9sdF90b19jYXBhY2l0eShkaSk7Ci0KLQltYWggPSBhYjg1MDBfZmdfY29udmVydF9wZXJtaWxsZV90b19tYWgoZGksIHBlcm1pbGxlKTsKLQotCWRpLT5iYXRfY2FwLm1haCA9IGFiODUwMF9mZ19hZGRfY2FwX3NhbXBsZShkaSwgbWFoKTsKLQlkaS0+YmF0X2NhcC5wZXJtaWxsZSA9Ci0JCWFiODUwMF9mZ19jb252ZXJ0X21haF90b19wZXJtaWxsZShkaSwgZGktPmJhdF9jYXAubWFoKTsKLQotCXJldHVybiBkaS0+YmF0X2NhcC5tYWg7Ci19Ci0KLS8qKgotICogYWI4NTAwX2ZnX2NhbGNfY2FwX2Rpc2NoYXJnZV9mZygpIC0gQ2FwYWNpdHkgaW4gZGlzY2hhcmdlIHdpdGggRkcKLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKLSAqCi0gKiBSZXR1cm4gdGhlIGNhcGFjaXR5IGluIG1BaCBiYXNlZCBvbiBwcmV2aW91cyBjYWxjdWxhdGVkIGNhcGNpdHkgYW5kIHRoZSBGRwotICogYWNjdW11bGF0b3IgcmVnaXN0ZXIgdmFsdWUuIFRoaXMgdmFsdWUgaXMgYWRkZWQgdG8gdGhlIGZpbHRlciBhbmQgYQotICogbmV3IG1lYW4gdmFsdWUgaXMgY2FsY3VsYXRlZCBhbmQgcmV0dXJuZWQuCi0gKi8KLXN0YXRpYyBpbnQgYWI4NTAwX2ZnX2NhbGNfY2FwX2Rpc2NoYXJnZV9mZyhzdHJ1Y3QgYWI4NTAwX2ZnICpkaSkKLXsKLQlpbnQgcGVybWlsbGVfdm9sdCwgcGVybWlsbGU7Ci0KLQlkZXZfZGJnKGRpLT5kZXYsICIlcyBjYXBfbWFoICVkIGFjY3VfY2hhcmdlICVkXG4iLAotCQlfX2Z1bmNfXywKLQkJZGktPmJhdF9jYXAubWFoLAotCQlkaS0+YWNjdV9jaGFyZ2UpOwotCi0JLyogQ2FwYWNpdHkgc2hvdWxkIG5vdCBiZSBsZXNzIHRoYW4gMCAqLwotCWlmIChkaS0+YmF0X2NhcC5tYWggKyBkaS0+YWNjdV9jaGFyZ2UgPiAwKQotCQlkaS0+YmF0X2NhcC5tYWggKz0gZGktPmFjY3VfY2hhcmdlOwotCWVsc2UKLQkJZGktPmJhdF9jYXAubWFoID0gMDsKLQotCWlmIChkaS0+YmF0X2NhcC5tYWggPj0gZGktPmJhdF9jYXAubWF4X21haF9kZXNpZ24pCi0JCWRpLT5iYXRfY2FwLm1haCA9IGRpLT5iYXRfY2FwLm1heF9tYWhfZGVzaWduOwotCi0JLyoKLQkgKiBDaGVjayBhZ2FpbnN0IHZvbHRhZ2UgYmFzZWQgY2FwYWNpdHkuIEl0IGNhbiBub3QgYmUgbG93ZXIKLQkgKiB0aGFuIHdoYXQgdGhlIHVuY29tcGVuc2F0ZWQgdm9sdGFnZSBzYXlzCi0JICovCi0JcGVybWlsbGUgPSBhYjg1MDBfZmdfY29udmVydF9tYWhfdG9fcGVybWlsbGUoZGksIGRpLT5iYXRfY2FwLm1haCk7Ci0JcGVybWlsbGVfdm9sdCA9IGFiODUwMF9mZ191bmNvbXBfdm9sdF90b19jYXBhY2l0eShkaSk7Ci0KLQlpZiAocGVybWlsbGUgPCBwZXJtaWxsZV92b2x0KSB7Ci0JCWRpLT5iYXRfY2FwLnBlcm1pbGxlID0gcGVybWlsbGVfdm9sdDsKLQkJZGktPmJhdF9jYXAubWFoID0gYWI4NTAwX2ZnX2NvbnZlcnRfcGVybWlsbGVfdG9fbWFoKGRpLAotCQkJZGktPmJhdF9jYXAucGVybWlsbGUpOwotCi0JCWRldl9kYmcoZGktPmRldiwgIiVzIHZvbHRhZ2UgYmFzZWQ6IHBlcm0gJWQgcGVybV92b2x0ICVkXG4iLAotCQkJX19mdW5jX18sCi0JCQlwZXJtaWxsZSwKLQkJCXBlcm1pbGxlX3ZvbHQpOwotCi0JCWFiODUwMF9mZ19maWxsX2NhcF9zYW1wbGUoZGksIGRpLT5iYXRfY2FwLm1haCk7Ci0JfSBlbHNlIHsKLQkJYWI4NTAwX2ZnX2ZpbGxfY2FwX3NhbXBsZShkaSwgZGktPmJhdF9jYXAubWFoKTsKLQkJZGktPmJhdF9jYXAucGVybWlsbGUgPQotCQkJYWI4NTAwX2ZnX2NvbnZlcnRfbWFoX3RvX3Blcm1pbGxlKGRpLCBkaS0+YmF0X2NhcC5tYWgpOwotCX0KLQotCXJldHVybiBkaS0+YmF0X2NhcC5tYWg7Ci19Ci0KLS8qKgotICogYWI4NTAwX2ZnX2NhcGFjaXR5X2xldmVsKCkgLSBHZXQgdGhlIGJhdHRlcnkgY2FwYWNpdHkgbGV2ZWwKLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKLSAqCi0gKiBHZXQgdGhlIGJhdHRlcnkgY2FwYWNpdHkgbGV2ZWwgYmFzZWQgb24gdGhlIGNhcGFjaXR5IGluIHBlcmNlbnQKLSAqLwotc3RhdGljIGludCBhYjg1MDBfZmdfY2FwYWNpdHlfbGV2ZWwoc3RydWN0IGFiODUwMF9mZyAqZGkpCi17Ci0JaW50IHJldCwgcGVyY2VudDsKLQotCXBlcmNlbnQgPSBESVZfUk9VTkRfQ0xPU0VTVChkaS0+YmF0X2NhcC5wZXJtaWxsZSwgMTApOwotCi0JaWYgKHBlcmNlbnQgPD0gZGktPmJtLT5jYXBfbGV2ZWxzLT5jcml0aWNhbCB8fAotCQlkaS0+ZmxhZ3MubG93X2JhdCkKLQkJcmV0ID0gUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX0NSSVRJQ0FMOwotCWVsc2UgaWYgKHBlcmNlbnQgPD0gZGktPmJtLT5jYXBfbGV2ZWxzLT5sb3cpCi0JCXJldCA9IFBPV0VSX1NVUFBMWV9DQVBBQ0lUWV9MRVZFTF9MT1c7Ci0JZWxzZSBpZiAocGVyY2VudCA8PSBkaS0+Ym0tPmNhcF9sZXZlbHMtPm5vcm1hbCkKLQkJcmV0ID0gUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX05PUk1BTDsKLQllbHNlIGlmIChwZXJjZW50IDw9IGRpLT5ibS0+Y2FwX2xldmVscy0+aGlnaCkKLQkJcmV0ID0gUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX0hJR0g7Ci0JZWxzZQotCQlyZXQgPSBQT1dFUl9TVVBQTFlfQ0FQQUNJVFlfTEVWRUxfRlVMTDsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogYWI4NTAwX2ZnX2NhbGN1bGF0ZV9zY2FsZWRfY2FwYWNpdHkoKSAtIENhcGFjaXR5IHNjYWxpbmcKLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKLSAqCi0gKiBDYWxjdWxhdGVzIHRoZSBjYXBhY2l0eSB0byBiZSBzaG93biB0byB1cHBlciBsYXllcnMuIFNjYWxlcyB0aGUgY2FwYWNpdHkKLSAqIHRvIGhhdmUgMTAwJSBhcyBhIHJlZmVyZW5jZSBmcm9tIHRoZSBhY3R1YWwgY2FwYWNpdHkgdXBvbiByZW1vdmFsIG9mIGNoYXJnZXIKLSAqIHdoZW4gY2hhcmdpbmcgaXMgaW4gbWFpbnRlbmFuY2UgbW9kZS4KLSAqLwotc3RhdGljIGludCBhYjg1MDBfZmdfY2FsY3VsYXRlX3NjYWxlZF9jYXBhY2l0eShzdHJ1Y3QgYWI4NTAwX2ZnICpkaSkKLXsKLQlzdHJ1Y3QgYWI4NTAwX2ZnX2NhcF9zY2FsaW5nICpjcyA9ICZkaS0+YmF0X2NhcC5jYXBfc2NhbGU7Ci0JaW50IGNhcGFjaXR5ID0gZGktPmJhdF9jYXAucHJldl9wZXJjZW50OwotCi0JaWYgKCFjcy0+ZW5hYmxlKQotCQlyZXR1cm4gY2FwYWNpdHk7Ci0KLQkvKgotCSAqIEFzIGxvbmcgYXMgd2UgYXJlIGluIGZ1bGx5IGNoYXJnZSBtb2RlIHNjYWxlIHRoZSBjYXBhY2l0eQotCSAqIHRvIHNob3cgMTAwJS4KLQkgKi8KLQlpZiAoZGktPmZsYWdzLmZ1bGx5X2NoYXJnZWQpIHsKLQkJY3MtPmNhcF90b19zY2FsZVswXSA9IDEwMDsKLQkJY3MtPmNhcF90b19zY2FsZVsxXSA9Ci0JCQltYXgoY2FwYWNpdHksIGRpLT5ibS0+ZmdfcGFyYW1zLT5tYWludF90aHJlcyk7Ci0JCWRldl9kYmcoZGktPmRldiwgIlNjYWxlIGNhcCB3aXRoICVkLyVkXG4iLAotCQkJIGNzLT5jYXBfdG9fc2NhbGVbMF0sIGNzLT5jYXBfdG9fc2NhbGVbMV0pOwotCX0KLQotCS8qIENhbGN1bGF0ZXMgdGhlIHNjYWxlZCBjYXBhY2l0eS4gKi8KLQlpZiAoKGNzLT5jYXBfdG9fc2NhbGVbMF0gIT0gY3MtPmNhcF90b19zY2FsZVsxXSkKLQkJCQkJJiYgKGNzLT5jYXBfdG9fc2NhbGVbMV0gPiAwKSkKLQkJY2FwYWNpdHkgPSBtaW4oMTAwLAotCQkJCSBESVZfUk9VTkRfQ0xPU0VTVChkaS0+YmF0X2NhcC5wcmV2X3BlcmNlbnQgKgotCQkJCQkJIGNzLT5jYXBfdG9fc2NhbGVbMF0sCi0JCQkJCQkgY3MtPmNhcF90b19zY2FsZVsxXSkpOwotCi0JaWYgKGRpLT5mbGFncy5jaGFyZ2luZykgewotCQlpZiAoY2FwYWNpdHkgPCBjcy0+ZGlzYWJsZV9jYXBfbGV2ZWwpIHsKLQkJCWNzLT5kaXNhYmxlX2NhcF9sZXZlbCA9IGNhcGFjaXR5OwotCQkJZGV2X2RiZyhkaS0+ZGV2LCAiQ2FwIHRvIHN0b3Agc2NhbGUgbG93ZXJlZCAlZCUlXG4iLAotCQkJCWNzLT5kaXNhYmxlX2NhcF9sZXZlbCk7Ci0JCX0gZWxzZSBpZiAoIWRpLT5mbGFncy5mdWxseV9jaGFyZ2VkKSB7Ci0JCQlpZiAoZGktPmJhdF9jYXAucHJldl9wZXJjZW50ID49Ci0JCQkgICAgY3MtPmRpc2FibGVfY2FwX2xldmVsKSB7Ci0JCQkJZGV2X2RiZyhkaS0+ZGV2LCAiRGlzYWJsaW5nIHNjYWxlZCBjYXBhY2l0eVxuIik7Ci0JCQkJY3MtPmVuYWJsZSA9IGZhbHNlOwotCQkJCWNhcGFjaXR5ID0gZGktPmJhdF9jYXAucHJldl9wZXJjZW50OwotCQkJfSBlbHNlIHsKLQkJCQlkZXZfZGJnKGRpLT5kZXYsCi0JCQkJCSJXYWl0aW5nIGluIGNhcCB0byBsZXZlbCAlZCUlXG4iLAotCQkJCQljcy0+ZGlzYWJsZV9jYXBfbGV2ZWwpOwotCQkJCWNhcGFjaXR5ID0gY3MtPmRpc2FibGVfY2FwX2xldmVsOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIGNhcGFjaXR5OwotfQotCi0vKioKLSAqIGFiODUwMF9mZ191cGRhdGVfY2FwX3NjYWxlcnMoKSAtIENhcGFjaXR5IHNjYWxpbmcKLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKLSAqCi0gKiBUbyBiZSBjYWxsZWQgd2hlbiBzdGF0ZSBjaGFuZ2UgZnJvbSBjaGFyZ2U8LT5kaXNjaGFyZ2UgdG8gdXBkYXRlCi0gKiB0aGUgY2FwYWNpdHkgc2NhbGVycy4KLSAqLwotc3RhdGljIHZvaWQgYWI4NTAwX2ZnX3VwZGF0ZV9jYXBfc2NhbGVycyhzdHJ1Y3QgYWI4NTAwX2ZnICpkaSkKLXsKLQlzdHJ1Y3QgYWI4NTAwX2ZnX2NhcF9zY2FsaW5nICpjcyA9ICZkaS0+YmF0X2NhcC5jYXBfc2NhbGU7Ci0KLQlpZiAoIWNzLT5lbmFibGUpCi0JCXJldHVybjsKLQlpZiAoZGktPmZsYWdzLmNoYXJnaW5nKSB7Ci0JCWRpLT5iYXRfY2FwLmNhcF9zY2FsZS5kaXNhYmxlX2NhcF9sZXZlbCA9Ci0JCQlkaS0+YmF0X2NhcC5jYXBfc2NhbGUuc2NhbGVkX2NhcDsKLQkJZGV2X2RiZyhkaS0+ZGV2LCAiQ2FwIHRvIHN0b3Agc2NhbGUgYXQgY2hhcmdlICVkJSVcbiIsCi0JCQkJZGktPmJhdF9jYXAuY2FwX3NjYWxlLmRpc2FibGVfY2FwX2xldmVsKTsKLQl9IGVsc2UgewotCQlpZiAoY3MtPnNjYWxlZF9jYXAgIT0gMTAwKSB7Ci0JCQljcy0+Y2FwX3RvX3NjYWxlWzBdID0gY3MtPnNjYWxlZF9jYXA7Ci0JCQljcy0+Y2FwX3RvX3NjYWxlWzFdID0gZGktPmJhdF9jYXAucHJldl9wZXJjZW50OwotCQl9IGVsc2UgewotCQkJY3MtPmNhcF90b19zY2FsZVswXSA9IDEwMDsKLQkJCWNzLT5jYXBfdG9fc2NhbGVbMV0gPQotCQkJCW1heChkaS0+YmF0X2NhcC5wcmV2X3BlcmNlbnQsCi0JCQkJICAgIGRpLT5ibS0+ZmdfcGFyYW1zLT5tYWludF90aHJlcyk7Ci0JCX0KLQotCQlkZXZfZGJnKGRpLT5kZXYsICJDYXAgdG8gc2NhbGUgYXQgZGlzY2hhcmdlICVkLyVkXG4iLAotCQkJCWNzLT5jYXBfdG9fc2NhbGVbMF0sIGNzLT5jYXBfdG9fc2NhbGVbMV0pOwotCX0KLX0KLQotLyoqCi0gKiBhYjg1MDBfZmdfY2hlY2tfY2FwYWNpdHlfbGltaXRzKCkgLSBDaGVjayBpZiBjYXBhY2l0eSBoYXMgY2hhbmdlZAotICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2ZnIHN0cnVjdHVyZQotICogQGluaXQ6CWNhcGFjaXR5IGlzIGFsbG93ZWQgdG8gZ28gdXAgaW4gaW5pdCBtb2RlCi0gKgotICogQ2hlY2sgaWYgY2FwYWNpdHkgb3IgY2FwYWNpdHkgbGltaXQgaGFzIGNoYW5nZWQgYW5kIG5vdGlmeSB0aGUgc3lzdGVtCi0gKiBhYm91dCBpdCB1c2luZyB0aGUgcG93ZXJfc3VwcGx5IGZyYW1ld29yawotICovCi1zdGF0aWMgdm9pZCBhYjg1MDBfZmdfY2hlY2tfY2FwYWNpdHlfbGltaXRzKHN0cnVjdCBhYjg1MDBfZmcgKmRpLCBib29sIGluaXQpCi17Ci0JYm9vbCBjaGFuZ2VkID0gZmFsc2U7Ci0JaW50IHBlcmNlbnQgPSBESVZfUk9VTkRfQ0xPU0VTVChkaS0+YmF0X2NhcC5wZXJtaWxsZSwgMTApOwotCi0JZGktPmJhdF9jYXAubGV2ZWwgPSBhYjg1MDBfZmdfY2FwYWNpdHlfbGV2ZWwoZGkpOwotCi0JaWYgKGRpLT5iYXRfY2FwLmxldmVsICE9IGRpLT5iYXRfY2FwLnByZXZfbGV2ZWwpIHsKLQkJLyoKLQkJICogV2UgZG8gbm90IGFsbG93IHJlcG9ydGVkIGNhcGFjaXR5IGxldmVsIHRvIGdvIHVwCi0JCSAqIHVubGVzcyB3ZSdyZSBjaGFyZ2luZyBvciBpZiB3ZSdyZSBpbiBpbml0Ci0JCSAqLwotCQlpZiAoISghZGktPmZsYWdzLmNoYXJnaW5nICYmIGRpLT5iYXRfY2FwLmxldmVsID4KLQkJCWRpLT5iYXRfY2FwLnByZXZfbGV2ZWwpIHx8IGluaXQpIHsKLQkJCWRldl9kYmcoZGktPmRldiwgImxldmVsIGNoYW5nZWQgZnJvbSAlZCB0byAlZFxuIiwKLQkJCQlkaS0+YmF0X2NhcC5wcmV2X2xldmVsLAotCQkJCWRpLT5iYXRfY2FwLmxldmVsKTsKLQkJCWRpLT5iYXRfY2FwLnByZXZfbGV2ZWwgPSBkaS0+YmF0X2NhcC5sZXZlbDsKLQkJCWNoYW5nZWQgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJZGV2X2RiZyhkaS0+ZGV2LCAibGV2ZWwgbm90IGFsbG93ZWQgdG8gZ28gdXAgIgotCQkJCSJzaW5jZSBubyBjaGFyZ2VyIGlzIGNvbm5lY3RlZDogJWQgdG8gJWRcbiIsCi0JCQkJZGktPmJhdF9jYXAucHJldl9sZXZlbCwKLQkJCQlkaS0+YmF0X2NhcC5sZXZlbCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIElmIHdlIGhhdmUgcmVjZWl2ZWQgdGhlIExPV19CQVQgSVJRLCBzZXQgY2FwYWNpdHkgdG8gMCB0byBpbml0aWF0ZQotCSAqIHNodXRkb3duCi0JICovCi0JaWYgKGRpLT5mbGFncy5sb3dfYmF0KSB7Ci0JCWRldl9kYmcoZGktPmRldiwgIkJhdHRlcnkgbG93LCBzZXQgY2FwYWNpdHkgdG8gMFxuIik7Ci0JCWRpLT5iYXRfY2FwLnByZXZfcGVyY2VudCA9IDA7Ci0JCWRpLT5iYXRfY2FwLnBlcm1pbGxlID0gMDsKLQkJcGVyY2VudCA9IDA7Ci0JCWRpLT5iYXRfY2FwLnByZXZfbWFoID0gMDsKLQkJZGktPmJhdF9jYXAubWFoID0gMDsKLQkJY2hhbmdlZCA9IHRydWU7Ci0JfSBlbHNlIGlmIChkaS0+ZmxhZ3MuZnVsbHlfY2hhcmdlZCkgewotCQkvKgotCQkgKiBXZSByZXBvcnQgMTAwJSBpZiBhbGdvcml0aG0gcmVwb3J0ZWQgZnVsbHkgY2hhcmdlZAotCQkgKiBhbmQgc2hvdyAxMDAlIGR1cmluZyBtYWludGVuYW5jZSBjaGFyZ2luZyAoc2NhbGluZykuCi0JCSAqLwotCQlpZiAoZGktPmZsYWdzLmZvcmNlX2Z1bGwpIHsKLQkJCWRpLT5iYXRfY2FwLnByZXZfcGVyY2VudCA9IHBlcmNlbnQ7Ci0JCQlkaS0+YmF0X2NhcC5wcmV2X21haCA9IGRpLT5iYXRfY2FwLm1haDsKLQotCQkJY2hhbmdlZCA9IHRydWU7Ci0KLQkJCWlmICghZGktPmJhdF9jYXAuY2FwX3NjYWxlLmVuYWJsZSAmJgotCQkJCQkJZGktPmJtLT5jYXBhY2l0eV9zY2FsaW5nKSB7Ci0JCQkJZGktPmJhdF9jYXAuY2FwX3NjYWxlLmVuYWJsZSA9IHRydWU7Ci0JCQkJZGktPmJhdF9jYXAuY2FwX3NjYWxlLmNhcF90b19zY2FsZVswXSA9IDEwMDsKLQkJCQlkaS0+YmF0X2NhcC5jYXBfc2NhbGUuY2FwX3RvX3NjYWxlWzFdID0KLQkJCQkJCWRpLT5iYXRfY2FwLnByZXZfcGVyY2VudDsKLQkJCQlkaS0+YmF0X2NhcC5jYXBfc2NhbGUuZGlzYWJsZV9jYXBfbGV2ZWwgPSAxMDA7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZGktPmJhdF9jYXAucHJldl9wZXJjZW50ICE9IHBlcmNlbnQpIHsKLQkJCWRldl9kYmcoZGktPmRldiwKLQkJCQkiYmF0dGVyeSByZXBvcnRlZCBmdWxsICIKLQkJCQkiYnV0IGNhcGFjaXR5IGRyb3BwaW5nOiAlZFxuIiwKLQkJCQlwZXJjZW50KTsKLQkJCWRpLT5iYXRfY2FwLnByZXZfcGVyY2VudCA9IHBlcmNlbnQ7Ci0JCQlkaS0+YmF0X2NhcC5wcmV2X21haCA9IGRpLT5iYXRfY2FwLm1haDsKLQotCQkJY2hhbmdlZCA9IHRydWU7Ci0JCX0KLQl9IGVsc2UgaWYgKGRpLT5iYXRfY2FwLnByZXZfcGVyY2VudCAhPSBwZXJjZW50KSB7Ci0JCWlmIChwZXJjZW50ID09IDApIHsKLQkJCS8qCi0JCQkgKiBXZSB3aWxsIG5vdCByZXBvcnQgMCUgdW5sZXNzIHdlJ3ZlIGdvdAotCQkJICogdGhlIExPV19CQVQgSVJRLCBubyBtYXR0ZXIgd2hhdCB0aGUgRkcKLQkJCSAqIGFsZ29yaXRobSBzYXlzLgotCQkJICovCi0JCQlkaS0+YmF0X2NhcC5wcmV2X3BlcmNlbnQgPSAxOwotCQkJcGVyY2VudCA9IDE7Ci0KLQkJCWNoYW5nZWQgPSB0cnVlOwotCQl9IGVsc2UgaWYgKCEoIWRpLT5mbGFncy5jaGFyZ2luZyAmJgotCQkJcGVyY2VudCA+IGRpLT5iYXRfY2FwLnByZXZfcGVyY2VudCkgfHwgaW5pdCkgewotCQkJLyoKLQkJCSAqIFdlIGRvIG5vdCBhbGxvdyByZXBvcnRlZCBjYXBhY2l0eSB0byBnbyB1cAotCQkJICogdW5sZXNzIHdlJ3JlIGNoYXJnaW5nIG9yIGlmIHdlJ3JlIGluIGluaXQKLQkJCSAqLwotCQkJZGV2X2RiZyhkaS0+ZGV2LAotCQkJCSJjYXBhY2l0eSBjaGFuZ2VkIGZyb20gJWQgdG8gJWQgKCVkKVxuIiwKLQkJCQlkaS0+YmF0X2NhcC5wcmV2X3BlcmNlbnQsCi0JCQkJcGVyY2VudCwKLQkJCQlkaS0+YmF0X2NhcC5wZXJtaWxsZSk7Ci0JCQlkaS0+YmF0X2NhcC5wcmV2X3BlcmNlbnQgPSBwZXJjZW50OwotCQkJZGktPmJhdF9jYXAucHJldl9tYWggPSBkaS0+YmF0X2NhcC5tYWg7Ci0KLQkJCWNoYW5nZWQgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJZGV2X2RiZyhkaS0+ZGV2LCAiY2FwYWNpdHkgbm90IGFsbG93ZWQgdG8gZ28gdXAgc2luY2UgIgotCQkJCSJubyBjaGFyZ2VyIGlzIGNvbm5lY3RlZDogJWQgdG8gJWQgKCVkKVxuIiwKLQkJCQlkaS0+YmF0X2NhcC5wcmV2X3BlcmNlbnQsCi0JCQkJcGVyY2VudCwKLQkJCQlkaS0+YmF0X2NhcC5wZXJtaWxsZSk7Ci0JCX0KLQl9Ci0KLQlpZiAoY2hhbmdlZCkgewotCQlpZiAoZGktPmJtLT5jYXBhY2l0eV9zY2FsaW5nKSB7Ci0JCQlkaS0+YmF0X2NhcC5jYXBfc2NhbGUuc2NhbGVkX2NhcCA9Ci0JCQkJYWI4NTAwX2ZnX2NhbGN1bGF0ZV9zY2FsZWRfY2FwYWNpdHkoZGkpOwotCi0JCQlkZXZfaW5mbyhkaS0+ZGV2LCAiY2FwYWNpdHk9JWQgKCVkKVxuIiwKLQkJCQlkaS0+YmF0X2NhcC5wcmV2X3BlcmNlbnQsCi0JCQkJZGktPmJhdF9jYXAuY2FwX3NjYWxlLnNjYWxlZF9jYXApOwotCQl9Ci0JCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5mZ19wc3kpOwotCQlpZiAoZGktPmZsYWdzLmZ1bGx5X2NoYXJnZWQgJiYgZGktPmZsYWdzLmZvcmNlX2Z1bGwpIHsKLQkJCWRldl9kYmcoZGktPmRldiwgIkJhdHRlcnkgZnVsbCwgbm90aWZ5aW5nLlxuIik7Ci0JCQlkaS0+ZmxhZ3MuZm9yY2VfZnVsbCA9IGZhbHNlOwotCQkJc3lzZnNfbm90aWZ5KCZkaS0+Zmdfa29iamVjdCwgTlVMTCwgImNoYXJnZV9mdWxsIik7Ci0JCX0KLQkJc3lzZnNfbm90aWZ5KCZkaS0+Zmdfa29iamVjdCwgTlVMTCwgImNoYXJnZV9ub3ciKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGFiODUwMF9mZ19jaGFyZ2Vfc3RhdGVfdG8oc3RydWN0IGFiODUwMF9mZyAqZGksCi0JZW51bSBhYjg1MDBfZmdfY2hhcmdlX3N0YXRlIG5ld19zdGF0ZSkKLXsKLQlkZXZfZGJnKGRpLT5kZXYsICJDaGFyZ2Ugc3RhdGUgZnJvbSAlZCBbJXNdIHRvICVkIFslc11cbiIsCi0JCWRpLT5jaGFyZ2Vfc3RhdGUsCi0JCWNoYXJnZV9zdGF0ZVtkaS0+Y2hhcmdlX3N0YXRlXSwKLQkJbmV3X3N0YXRlLAotCQljaGFyZ2Vfc3RhdGVbbmV3X3N0YXRlXSk7Ci0KLQlkaS0+Y2hhcmdlX3N0YXRlID0gbmV3X3N0YXRlOwotfQotCi1zdGF0aWMgdm9pZCBhYjg1MDBfZmdfZGlzY2hhcmdlX3N0YXRlX3RvKHN0cnVjdCBhYjg1MDBfZmcgKmRpLAotCWVudW0gYWI4NTAwX2ZnX2Rpc2NoYXJnZV9zdGF0ZSBuZXdfc3RhdGUpCi17Ci0JZGV2X2RiZyhkaS0+ZGV2LCAiRGlzaGFyZ2Ugc3RhdGUgZnJvbSAlZCBbJXNdIHRvICVkIFslc11cbiIsCi0JCWRpLT5kaXNjaGFyZ2Vfc3RhdGUsCi0JCWRpc2NoYXJnZV9zdGF0ZVtkaS0+ZGlzY2hhcmdlX3N0YXRlXSwKLQkJbmV3X3N0YXRlLAotCQlkaXNjaGFyZ2Vfc3RhdGVbbmV3X3N0YXRlXSk7Ci0KLQlkaS0+ZGlzY2hhcmdlX3N0YXRlID0gbmV3X3N0YXRlOwotfQotCi0vKioKLSAqIGFiODUwMF9mZ19hbGdvcml0aG1fY2hhcmdpbmcoKSAtIEZHIGFsZ29yaXRobSBmb3Igd2hlbiBjaGFyZ2luZwotICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2ZnIHN0cnVjdHVyZQotICoKLSAqIEJhdHRlcnkgY2FwYWNpdHkgY2FsY3VsYXRpb24gc3RhdGUgbWFjaGluZSBmb3Igd2hlbiB3ZSdyZSBjaGFyZ2luZwotICovCi1zdGF0aWMgdm9pZCBhYjg1MDBfZmdfYWxnb3JpdGhtX2NoYXJnaW5nKHN0cnVjdCBhYjg1MDBfZmcgKmRpKQotewotCS8qCi0JICogSWYgd2UgY2hhbmdlIHRvIGRpc2NoYXJnZSBtb2RlCi0JICogd2Ugc2hvdWxkIHN0YXJ0IHdpdGggcmVjb3ZlcnkKLQkgKi8KLQlpZiAoZGktPmRpc2NoYXJnZV9zdGF0ZSAhPSBBQjg1MDBfRkdfRElTQ0hBUkdFX0lOSVRfUkVDT1ZFUlkpCi0JCWFiODUwMF9mZ19kaXNjaGFyZ2Vfc3RhdGVfdG8oZGksCi0JCQlBQjg1MDBfRkdfRElTQ0hBUkdFX0lOSVRfUkVDT1ZFUlkpOwotCi0Jc3dpdGNoIChkaS0+Y2hhcmdlX3N0YXRlKSB7Ci0JY2FzZSBBQjg1MDBfRkdfQ0hBUkdFX0lOSVQ6Ci0JCWRpLT5mZ19zYW1wbGVzID0gU0VDX1RPX1NBTVBMRSgKLQkJCWRpLT5ibS0+ZmdfcGFyYW1zLT5hY2N1X2NoYXJnaW5nKTsKLQotCQlhYjg1MDBfZmdfY291bG9tYl9jb3VudGVyKGRpLCB0cnVlKTsKLQkJYWI4NTAwX2ZnX2NoYXJnZV9zdGF0ZV90byhkaSwgQUI4NTAwX0ZHX0NIQVJHRV9SRUFET1VUKTsKLQotCQlicmVhazsKLQotCWNhc2UgQUI4NTAwX0ZHX0NIQVJHRV9SRUFET1VUOgotCQkvKgotCQkgKiBSZWFkIHRoZSBGRyBhbmQgY2FsY3VsYXRlIHRoZSBuZXcgY2FwYWNpdHkKLQkJICovCi0JCW11dGV4X2xvY2soJmRpLT5jY19sb2NrKTsKLQkJaWYgKCFkaS0+ZmxhZ3MuY29udl9kb25lICYmICFkaS0+ZmxhZ3MuZm9yY2VfZnVsbCkgewotCQkJLyogV2Fzbid0IHRoZSBDQyBJUlEgdGhhdCBnb3QgdXMgaGVyZSAqLwotCQkJbXV0ZXhfdW5sb2NrKCZkaS0+Y2NfbG9jayk7Ci0JCQlkZXZfZGJnKGRpLT5kZXYsICIlcyBDQyBjb252IG5vdCBkb25lXG4iLAotCQkJCV9fZnVuY19fKTsKLQotCQkJYnJlYWs7Ci0JCX0KLQkJZGktPmZsYWdzLmNvbnZfZG9uZSA9IGZhbHNlOwotCQltdXRleF91bmxvY2soJmRpLT5jY19sb2NrKTsKLQotCQlhYjg1MDBfZmdfY2FsY19jYXBfY2hhcmdpbmcoZGkpOwotCi0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JLyogQ2hlY2sgY2FwYWNpdHkgbGltaXRzICovCi0JYWI4NTAwX2ZnX2NoZWNrX2NhcGFjaXR5X2xpbWl0cyhkaSwgZmFsc2UpOwotfQotCi1zdGF0aWMgdm9pZCBmb3JjZV9jYXBhY2l0eShzdHJ1Y3QgYWI4NTAwX2ZnICpkaSkKLXsKLQlpbnQgY2FwOwotCi0JYWI4NTAwX2ZnX2NsZWFyX2NhcF9zYW1wbGVzKGRpKTsKLQljYXAgPSBkaS0+YmF0X2NhcC51c2VyX21haDsKLQlpZiAoY2FwID4gZGktPmJhdF9jYXAubWF4X21haF9kZXNpZ24pIHsKLQkJZGV2X2RiZyhkaS0+ZGV2LCAiUmVtYWluaW5nIGNhcCAlZCBjYW4ndCBiZSBiaWdnZXIgdGhhbiB0b3RhbCIKLQkJCSIgJWRcbiIsIGNhcCwgZGktPmJhdF9jYXAubWF4X21haF9kZXNpZ24pOwotCQljYXAgPSBkaS0+YmF0X2NhcC5tYXhfbWFoX2Rlc2lnbjsKLQl9Ci0JYWI4NTAwX2ZnX2ZpbGxfY2FwX3NhbXBsZShkaSwgZGktPmJhdF9jYXAudXNlcl9tYWgpOwotCWRpLT5iYXRfY2FwLnBlcm1pbGxlID0gYWI4NTAwX2ZnX2NvbnZlcnRfbWFoX3RvX3Blcm1pbGxlKGRpLCBjYXApOwotCWRpLT5iYXRfY2FwLm1haCA9IGNhcDsKLQlhYjg1MDBfZmdfY2hlY2tfY2FwYWNpdHlfbGltaXRzKGRpLCB0cnVlKTsKLX0KLQotc3RhdGljIGJvb2wgY2hlY2tfc3lzZnNfY2FwYWNpdHkoc3RydWN0IGFiODUwMF9mZyAqZGkpCi17Ci0JaW50IGNhcCwgbG93ZXIsIHVwcGVyOwotCWludCBjYXBfcGVybWlsbGU7Ci0KLQljYXAgPSBkaS0+YmF0X2NhcC51c2VyX21haDsKLQotCWNhcF9wZXJtaWxsZSA9IGFiODUwMF9mZ19jb252ZXJ0X21haF90b19wZXJtaWxsZShkaSwKLQkJZGktPmJhdF9jYXAudXNlcl9tYWgpOwotCi0JbG93ZXIgPSBkaS0+YmF0X2NhcC5wZXJtaWxsZSAtIGRpLT5ibS0+ZmdfcGFyYW1zLT51c2VyX2NhcF9saW1pdCAqIDEwOwotCXVwcGVyID0gZGktPmJhdF9jYXAucGVybWlsbGUgKyBkaS0+Ym0tPmZnX3BhcmFtcy0+dXNlcl9jYXBfbGltaXQgKiAxMDsKLQotCWlmIChsb3dlciA8IDApCi0JCWxvd2VyID0gMDsKLQkvKiAxMDAwIGlzIHBlcm1pbGxlLCAtPiAxMDAgcGVyY2VudCAqLwotCWlmICh1cHBlciA+IDEwMDApCi0JCXVwcGVyID0gMTAwMDsKLQotCWRldl9kYmcoZGktPmRldiwgIkNhcGFjaXR5IGxpbWl0czoiCi0JCSIgKExvd2VyOiAlZCBVc2VyOiAlZCBVcHBlcjogJWQpIFt1c2VyOiAlZCwgd2FzOiAlZF1cbiIsCi0JCWxvd2VyLCBjYXBfcGVybWlsbGUsIHVwcGVyLCBjYXAsIGRpLT5iYXRfY2FwLm1haCk7Ci0KLQkvKiBJZiB3aXRoaW4gbGltaXRzLCB1c2UgdGhlIHNhdmVkIGNhcGFjaXR5IGFuZCBleGl0IGVzdGltYXRpb24uLi4qLwotCWlmIChjYXBfcGVybWlsbGUgPiBsb3dlciAmJiBjYXBfcGVybWlsbGUgPCB1cHBlcikgewotCQlkZXZfZGJnKGRpLT5kZXYsICJPSyEgVXNpbmcgdXNlcnMgY2FwICVkIHVBaCBub3dcbiIsIGNhcCk7Ci0JCWZvcmNlX2NhcGFjaXR5KGRpKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCWRldl9kYmcoZGktPmRldiwgIkNhcGFjaXR5IGZyb20gdXNlciBvdXQgb2YgbGltaXRzLCBpZ25vcmluZyIpOwotCXJldHVybiBmYWxzZTsKLX0KLQotLyoqCi0gKiBhYjg1MDBfZmdfYWxnb3JpdGhtX2Rpc2NoYXJnaW5nKCkgLSBGRyBhbGdvcml0aG0gZm9yIHdoZW4gZGlzY2hhcmdpbmcKLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKLSAqCi0gKiBCYXR0ZXJ5IGNhcGFjaXR5IGNhbGN1bGF0aW9uIHN0YXRlIG1hY2hpbmUgZm9yIHdoZW4gd2UncmUgZGlzY2hhcmdpbmcKLSAqLwotc3RhdGljIHZvaWQgYWI4NTAwX2ZnX2FsZ29yaXRobV9kaXNjaGFyZ2luZyhzdHJ1Y3QgYWI4NTAwX2ZnICpkaSkKLXsKLQlpbnQgc2xlZXBfdGltZTsKLQotCS8qIElmIHdlIGNoYW5nZSB0byBjaGFyZ2UgbW9kZSB3ZSBzaG91bGQgc3RhcnQgd2l0aCBpbml0ICovCi0JaWYgKGRpLT5jaGFyZ2Vfc3RhdGUgIT0gQUI4NTAwX0ZHX0NIQVJHRV9JTklUKQotCQlhYjg1MDBfZmdfY2hhcmdlX3N0YXRlX3RvKGRpLCBBQjg1MDBfRkdfQ0hBUkdFX0lOSVQpOwotCi0Jc3dpdGNoIChkaS0+ZGlzY2hhcmdlX3N0YXRlKSB7Ci0JY2FzZSBBQjg1MDBfRkdfRElTQ0hBUkdFX0lOSVQ6Ci0JCS8qIFdlIHVzZSB0aGUgRkcgSVJRIHRvIHdvcmsgb24gKi8KLQkJZGktPmluaXRfY250ID0gMDsKLQkJZGktPmZnX3NhbXBsZXMgPSBTRUNfVE9fU0FNUExFKGRpLT5ibS0+ZmdfcGFyYW1zLT5pbml0X3RpbWVyKTsKLQkJYWI4NTAwX2ZnX2NvdWxvbWJfY291bnRlcihkaSwgdHJ1ZSk7Ci0JCWFiODUwMF9mZ19kaXNjaGFyZ2Vfc3RhdGVfdG8oZGksCi0JCQlBQjg1MDBfRkdfRElTQ0hBUkdFX0lOSVRNRUFTVVJJTkcpOwotCi0JCS8qIEludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0JY2FzZSBBQjg1MDBfRkdfRElTQ0hBUkdFX0lOSVRNRUFTVVJJTkc6Ci0JCS8qCi0JCSAqIERpc2NhcmQgYSBudW1iZXIgb2Ygc2FtcGxlcyBkdXJpbmcgc3RhcnR1cC4KLQkJICogQWZ0ZXIgdGhhdCwgdXNlIGNvbXBlbnNhdGVkIHZvbHRhZ2UgZm9yIGEgZmV3Ci0JCSAqIHNhbXBsZXMgdG8gZ2V0IGFuIGluaXRpYWwgY2FwYWNpdHkuCi0JCSAqIFRoZW4gZ28gdG8gUkVBRE9VVAotCQkgKi8KLQkJc2xlZXBfdGltZSA9IGRpLT5ibS0+ZmdfcGFyYW1zLT5pbml0X3RpbWVyOwotCi0JCS8qIERpc2NhcmQgdGhlIGZpcnN0IFt4XSBzZWNvbmRzICovCi0JCWlmIChkaS0+aW5pdF9jbnQgPiBkaS0+Ym0tPmZnX3BhcmFtcy0+aW5pdF9kaXNjYXJkX3RpbWUpIHsKLQkJCWFiODUwMF9mZ19jYWxjX2NhcF9kaXNjaGFyZ2Vfdm9sdGFnZShkaSwgdHJ1ZSk7Ci0KLQkJCWFiODUwMF9mZ19jaGVja19jYXBhY2l0eV9saW1pdHMoZGksIHRydWUpOwotCQl9Ci0KLQkJZGktPmluaXRfY250ICs9IHNsZWVwX3RpbWU7Ci0JCWlmIChkaS0+aW5pdF9jbnQgPiBkaS0+Ym0tPmZnX3BhcmFtcy0+aW5pdF90b3RhbF90aW1lKQotCQkJYWI4NTAwX2ZnX2Rpc2NoYXJnZV9zdGF0ZV90byhkaSwKLQkJCQlBQjg1MDBfRkdfRElTQ0hBUkdFX1JFQURPVVRfSU5JVCk7Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIEFCODUwMF9GR19ESVNDSEFSR0VfSU5JVF9SRUNPVkVSWToKLQkJZGktPnJlY292ZXJ5X2NudCA9IDA7Ci0JCWRpLT5yZWNvdmVyeV9uZWVkZWQgPSB0cnVlOwotCQlhYjg1MDBfZmdfZGlzY2hhcmdlX3N0YXRlX3RvKGRpLAotCQkJQUI4NTAwX0ZHX0RJU0NIQVJHRV9SRUNPVkVSWSk7Ci0KLQkJLyogSW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLQotCWNhc2UgQUI4NTAwX0ZHX0RJU0NIQVJHRV9SRUNPVkVSWToKLQkJc2xlZXBfdGltZSA9IGRpLT5ibS0+ZmdfcGFyYW1zLT5yZWNvdmVyeV9zbGVlcF90aW1lcjsKLQotCQkvKgotCQkgKiBXZSBzaG91bGQgY2hlY2sgdGhlIHBvd2VyIGNvbnN1bXB0aW9uCi0JCSAqIElmIGxvdywgZ28gdG8gUkVBRE9VVCAoYWZ0ZXIgeCBtaW4pIG9yCi0JCSAqIFJFQ09WRVJZX1NMRUVQIGlmIHRpbWUgbGVmdC4KLQkJICogSWYgaGlnaCwgZ28gdG8gUkVBRE9VVAotCQkgKi8KLQkJZGktPmluc3RfY3VyciA9IGFiODUwMF9mZ19pbnN0X2N1cnJfYmxvY2tpbmcoZGkpOwotCi0JCWlmIChhYjg1MDBfZmdfaXNfbG93X2N1cnIoZGksIGRpLT5pbnN0X2N1cnIpKSB7Ci0JCQlpZiAoZGktPnJlY292ZXJ5X2NudCA+Ci0JCQkJZGktPmJtLT5mZ19wYXJhbXMtPnJlY292ZXJ5X3RvdGFsX3RpbWUpIHsKLQkJCQlkaS0+Zmdfc2FtcGxlcyA9IFNFQ19UT19TQU1QTEUoCi0JCQkJCWRpLT5ibS0+ZmdfcGFyYW1zLT5hY2N1X2hpZ2hfY3Vycik7Ci0JCQkJYWI4NTAwX2ZnX2NvdWxvbWJfY291bnRlcihkaSwgdHJ1ZSk7Ci0JCQkJYWI4NTAwX2ZnX2Rpc2NoYXJnZV9zdGF0ZV90byhkaSwKLQkJCQkJQUI4NTAwX0ZHX0RJU0NIQVJHRV9SRUFET1VUKTsKLQkJCQlkaS0+cmVjb3ZlcnlfbmVlZGVkID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Zmdfd3EsCi0JCQkJCSZkaS0+ZmdfcGVyaW9kaWNfd29yaywKLQkJCQkJc2xlZXBfdGltZSAqIEhaKTsKLQkJCX0KLQkJCWRpLT5yZWNvdmVyeV9jbnQgKz0gc2xlZXBfdGltZTsKLQkJfSBlbHNlIHsKLQkJCWRpLT5mZ19zYW1wbGVzID0gU0VDX1RPX1NBTVBMRSgKLQkJCQlkaS0+Ym0tPmZnX3BhcmFtcy0+YWNjdV9oaWdoX2N1cnIpOwotCQkJYWI4NTAwX2ZnX2NvdWxvbWJfY291bnRlcihkaSwgdHJ1ZSk7Ci0JCQlhYjg1MDBfZmdfZGlzY2hhcmdlX3N0YXRlX3RvKGRpLAotCQkJCUFCODUwMF9GR19ESVNDSEFSR0VfUkVBRE9VVCk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFCODUwMF9GR19ESVNDSEFSR0VfUkVBRE9VVF9JTklUOgotCQlkaS0+Zmdfc2FtcGxlcyA9IFNFQ19UT19TQU1QTEUoCi0JCQlkaS0+Ym0tPmZnX3BhcmFtcy0+YWNjdV9oaWdoX2N1cnIpOwotCQlhYjg1MDBfZmdfY291bG9tYl9jb3VudGVyKGRpLCB0cnVlKTsKLQkJYWI4NTAwX2ZnX2Rpc2NoYXJnZV9zdGF0ZV90byhkaSwKLQkJCQlBQjg1MDBfRkdfRElTQ0hBUkdFX1JFQURPVVQpOwotCQlicmVhazsKLQotCWNhc2UgQUI4NTAwX0ZHX0RJU0NIQVJHRV9SRUFET1VUOgotCQlkaS0+aW5zdF9jdXJyID0gYWI4NTAwX2ZnX2luc3RfY3Vycl9ibG9ja2luZyhkaSk7Ci0KLQkJaWYgKGFiODUwMF9mZ19pc19sb3dfY3VycihkaSwgZGktPmluc3RfY3VycikpIHsKLQkJCS8qIERldGVjdCBtb2RlIGNoYW5nZSAqLwotCQkJaWYgKGRpLT5oaWdoX2N1cnJfbW9kZSkgewotCQkJCWRpLT5oaWdoX2N1cnJfbW9kZSA9IGZhbHNlOwotCQkJCWRpLT5oaWdoX2N1cnJfY250ID0gMDsKLQkJCX0KLQotCQkJaWYgKGRpLT5yZWNvdmVyeV9uZWVkZWQpIHsKLQkJCQlhYjg1MDBfZmdfZGlzY2hhcmdlX3N0YXRlX3RvKGRpLAotCQkJCQlBQjg1MDBfRkdfRElTQ0hBUkdFX0lOSVRfUkVDT1ZFUlkpOwotCi0JCQkJcXVldWVfZGVsYXllZF93b3JrKGRpLT5mZ193cSwKLQkJCQkJJmRpLT5mZ19wZXJpb2RpY193b3JrLCAwKTsKLQotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlhYjg1MDBfZmdfY2FsY19jYXBfZGlzY2hhcmdlX3ZvbHRhZ2UoZGksIHRydWUpOwotCQl9IGVsc2UgewotCQkJbXV0ZXhfbG9jaygmZGktPmNjX2xvY2spOwotCQkJaWYgKCFkaS0+ZmxhZ3MuY29udl9kb25lKSB7Ci0JCQkJLyogV2Fzbid0IHRoZSBDQyBJUlEgdGhhdCBnb3QgdXMgaGVyZSAqLwotCQkJCW11dGV4X3VubG9jaygmZGktPmNjX2xvY2spOwotCQkJCWRldl9kYmcoZGktPmRldiwgIiVzIENDIGNvbnYgbm90IGRvbmVcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQotCQkJCWJyZWFrOwotCQkJfQotCQkJZGktPmZsYWdzLmNvbnZfZG9uZSA9IGZhbHNlOwotCQkJbXV0ZXhfdW5sb2NrKCZkaS0+Y2NfbG9jayk7Ci0KLQkJCS8qIERldGVjdCBtb2RlIGNoYW5nZSAqLwotCQkJaWYgKCFkaS0+aGlnaF9jdXJyX21vZGUpIHsKLQkJCQlkaS0+aGlnaF9jdXJyX21vZGUgPSB0cnVlOwotCQkJCWRpLT5oaWdoX2N1cnJfY250ID0gMDsKLQkJCX0KLQotCQkJZGktPmhpZ2hfY3Vycl9jbnQgKz0KLQkJCQlkaS0+Ym0tPmZnX3BhcmFtcy0+YWNjdV9oaWdoX2N1cnI7Ci0JCQlpZiAoZGktPmhpZ2hfY3Vycl9jbnQgPgotCQkJCWRpLT5ibS0+ZmdfcGFyYW1zLT5oaWdoX2N1cnJfdGltZSkKLQkJCQlkaS0+cmVjb3ZlcnlfbmVlZGVkID0gdHJ1ZTsKLQotCQkJYWI4NTAwX2ZnX2NhbGNfY2FwX2Rpc2NoYXJnZV9mZyhkaSk7Ci0JCX0KLQotCQlhYjg1MDBfZmdfY2hlY2tfY2FwYWNpdHlfbGltaXRzKGRpLCBmYWxzZSk7Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIEFCODUwMF9GR19ESVNDSEFSR0VfV0FLRVVQOgotCQlhYjg1MDBfZmdfY2FsY19jYXBfZGlzY2hhcmdlX3ZvbHRhZ2UoZGksIHRydWUpOwotCi0JCWRpLT5mZ19zYW1wbGVzID0gU0VDX1RPX1NBTVBMRSgKLQkJCWRpLT5ibS0+ZmdfcGFyYW1zLT5hY2N1X2hpZ2hfY3Vycik7Ci0JCWFiODUwMF9mZ19jb3Vsb21iX2NvdW50ZXIoZGksIHRydWUpOwotCQlhYjg1MDBfZmdfZGlzY2hhcmdlX3N0YXRlX3RvKGRpLAotCQkJCUFCODUwMF9GR19ESVNDSEFSR0VfUkVBRE9VVCk7Ci0KLQkJYWI4NTAwX2ZnX2NoZWNrX2NhcGFjaXR5X2xpbWl0cyhkaSwgZmFsc2UpOwotCi0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotfQotCi0vKioKLSAqIGFiODUwMF9mZ19hbGdvcml0aG1fY2FsaWJyYXRlKCkgLSBJbnRlcm5hbCBjb2x1bWIgY291bnRlciBvZmZzZXQgY2FsaWJyYXRpb24KLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKLSAqCi0gKi8KLXN0YXRpYyB2b2lkIGFiODUwMF9mZ19hbGdvcml0aG1fY2FsaWJyYXRlKHN0cnVjdCBhYjg1MDBfZmcgKmRpKQotewotCWludCByZXQ7Ci0KLQlzd2l0Y2ggKGRpLT5jYWxpYl9zdGF0ZSkgewotCWNhc2UgQUI4NTAwX0ZHX0NBTElCX0lOSVQ6Ci0JCWRldl9kYmcoZGktPmRldiwgIkNhbGlicmF0aW9uIG9uZ29pbmcuLi5cbiIpOwotCi0JCXJldCA9IGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAotCQkJQUI4NTAwX0dBU19HQVVHRSwgQUI4NTAwX0dBU0dfQ0NfQ1RSTF9SRUcsCi0JCQlDQ19JTlRfQ0FMX05fQVZHX01BU0ssIENDX0lOVF9DQUxfU0FNUExFU184KTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGVycjsKLQotCQlyZXQgPSBhYng1MDBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKLQkJCUFCODUwMF9HQVNfR0FVR0UsIEFCODUwMF9HQVNHX0NDX0NUUkxfUkVHLAotCQkJQ0NfSU5UQVZHT0ZGU0VUX0VOQSwgQ0NfSU5UQVZHT0ZGU0VUX0VOQSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBlcnI7Ci0JCWRpLT5jYWxpYl9zdGF0ZSA9IEFCODUwMF9GR19DQUxJQl9XQUlUOwotCQlicmVhazsKLQljYXNlIEFCODUwMF9GR19DQUxJQl9FTkQ6Ci0JCXJldCA9IGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAotCQkJQUI4NTAwX0dBU19HQVVHRSwgQUI4NTAwX0dBU0dfQ0NfQ1RSTF9SRUcsCi0JCQlDQ19NVVhPRkZTRVQsIENDX01VWE9GRlNFVCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBlcnI7Ci0JCWRpLT5mbGFncy5jYWxpYnJhdGUgPSBmYWxzZTsKLQkJZGV2X2RiZyhkaS0+ZGV2LCAiQ2FsaWJyYXRpb24gZG9uZS4uLlxuIik7Ci0JCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Zmdfd3EsICZkaS0+ZmdfcGVyaW9kaWNfd29yaywgMCk7Ci0JCWJyZWFrOwotCWNhc2UgQUI4NTAwX0ZHX0NBTElCX1dBSVQ6Ci0JCWRldl9kYmcoZGktPmRldiwgIkNhbGlicmF0aW9uIFdGSVxuIik7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCXJldHVybjsKLWVycjoKLQkvKiBTb21ldGhpbmcgd2VudCB3cm9uZywgZG9uJ3QgY2FsaWJyYXRlIHRoZW4gKi8KLQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gY2FsaWJyYXRlIHRoZSBDQ1xuIik7Ci0JZGktPmZsYWdzLmNhbGlicmF0ZSA9IGZhbHNlOwotCWRpLT5jYWxpYl9zdGF0ZSA9IEFCODUwMF9GR19DQUxJQl9JTklUOwotCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Zmdfd3EsICZkaS0+ZmdfcGVyaW9kaWNfd29yaywgMCk7Ci19Ci0KLS8qKgotICogYWI4NTAwX2ZnX2FsZ29yaXRobSgpIC0gRW50cnkgcG9pbnQgZm9yIHRoZSBGRyBhbGdvcml0aG0KLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKLSAqCi0gKiBFbnRyeSBwb2ludCBmb3IgdGhlIGJhdHRlcnkgY2FwYWNpdHkgY2FsY3VsYXRpb24gc3RhdGUgbWFjaGluZQotICovCi1zdGF0aWMgdm9pZCBhYjg1MDBfZmdfYWxnb3JpdGhtKHN0cnVjdCBhYjg1MDBfZmcgKmRpKQotewotCWlmIChkaS0+ZmxhZ3MuY2FsaWJyYXRlKQotCQlhYjg1MDBfZmdfYWxnb3JpdGhtX2NhbGlicmF0ZShkaSk7Ci0JZWxzZSB7Ci0JCWlmIChkaS0+ZmxhZ3MuY2hhcmdpbmcpCi0JCQlhYjg1MDBfZmdfYWxnb3JpdGhtX2NoYXJnaW5nKGRpKTsKLQkJZWxzZQotCQkJYWI4NTAwX2ZnX2FsZ29yaXRobV9kaXNjaGFyZ2luZyhkaSk7Ci0JfQotCi0JZGV2X2RiZyhkaS0+ZGV2LCAiW0ZHX0RBVEFdICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICIKLQkJIiVkICVkICVkICVkICVkICVkICVkXG4iLAotCQlkaS0+YmF0X2NhcC5tYXhfbWFoX2Rlc2lnbiwKLQkJZGktPmJhdF9jYXAubWF4X21haCwKLQkJZGktPmJhdF9jYXAubWFoLAotCQlkaS0+YmF0X2NhcC5wZXJtaWxsZSwKLQkJZGktPmJhdF9jYXAubGV2ZWwsCi0JCWRpLT5iYXRfY2FwLnByZXZfbWFoLAotCQlkaS0+YmF0X2NhcC5wcmV2X3BlcmNlbnQsCi0JCWRpLT5iYXRfY2FwLnByZXZfbGV2ZWwsCi0JCWRpLT52YmF0LAotCQlkaS0+aW5zdF9jdXJyLAotCQlkaS0+YXZnX2N1cnIsCi0JCWRpLT5hY2N1X2NoYXJnZSwKLQkJZGktPmZsYWdzLmNoYXJnaW5nLAotCQlkaS0+Y2hhcmdlX3N0YXRlLAotCQlkaS0+ZGlzY2hhcmdlX3N0YXRlLAotCQlkaS0+aGlnaF9jdXJyX21vZGUsCi0JCWRpLT5yZWNvdmVyeV9uZWVkZWQpOwotfQotCi0vKioKLSAqIGFiODUwMF9mZ19wZXJpb2RpY193b3JrKCkgLSBSdW4gdGhlIEZHIHN0YXRlIG1hY2hpbmUgcGVyaW9kaWNhbGx5Ci0gKiBAd29yazoJcG9pbnRlciB0byB0aGUgd29ya19zdHJ1Y3Qgc3RydWN0dXJlCi0gKgotICogV29yayBxdWV1ZSBmdW5jdGlvbiBmb3IgcGVyaW9kaWMgd29yawotICovCi1zdGF0aWMgdm9pZCBhYjg1MDBfZmdfcGVyaW9kaWNfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGFiODUwMF9mZyAqZGkgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFiODUwMF9mZywKLQkJZmdfcGVyaW9kaWNfd29yay53b3JrKTsKLQotCWlmIChkaS0+aW5pdF9jYXBhY2l0eSkgewotCQkvKiBHZXQgYW4gaW5pdGlhbCBjYXBhY2l0eSBjYWxjdWxhdGlvbiAqLwotCQlhYjg1MDBfZmdfY2FsY19jYXBfZGlzY2hhcmdlX3ZvbHRhZ2UoZGksIHRydWUpOwotCQlhYjg1MDBfZmdfY2hlY2tfY2FwYWNpdHlfbGltaXRzKGRpLCB0cnVlKTsKLQkJZGktPmluaXRfY2FwYWNpdHkgPSBmYWxzZTsKLQotCQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmZnX3dxLCAmZGktPmZnX3BlcmlvZGljX3dvcmssIDApOwotCX0gZWxzZSBpZiAoZGktPmZsYWdzLnVzZXJfY2FwKSB7Ci0JCWlmIChjaGVja19zeXNmc19jYXBhY2l0eShkaSkpIHsKLQkJCWFiODUwMF9mZ19jaGVja19jYXBhY2l0eV9saW1pdHMoZGksIHRydWUpOwotCQkJaWYgKGRpLT5mbGFncy5jaGFyZ2luZykKLQkJCQlhYjg1MDBfZmdfY2hhcmdlX3N0YXRlX3RvKGRpLAotCQkJCQlBQjg1MDBfRkdfQ0hBUkdFX0lOSVQpOwotCQkJZWxzZQotCQkJCWFiODUwMF9mZ19kaXNjaGFyZ2Vfc3RhdGVfdG8oZGksCi0JCQkJCUFCODUwMF9GR19ESVNDSEFSR0VfUkVBRE9VVF9JTklUKTsKLQkJfQotCQlkaS0+ZmxhZ3MudXNlcl9jYXAgPSBmYWxzZTsKLQkJcXVldWVfZGVsYXllZF93b3JrKGRpLT5mZ193cSwgJmRpLT5mZ19wZXJpb2RpY193b3JrLCAwKTsKLQl9IGVsc2UKLQkJYWI4NTAwX2ZnX2FsZ29yaXRobShkaSk7Ci0KLX0KLQotLyoqCi0gKiBhYjg1MDBfZmdfY2hlY2tfaHdfZmFpbHVyZV93b3JrKCkgLSBDaGVjayBPVlZfQkFUIGNvbmRpdGlvbgotICogQHdvcms6CXBvaW50ZXIgdG8gdGhlIHdvcmtfc3RydWN0IHN0cnVjdHVyZQotICoKLSAqIFdvcmsgcXVldWUgZnVuY3Rpb24gZm9yIGNoZWNraW5nIHRoZSBPVlZfQkFUIGNvbmRpdGlvbgotICovCi1zdGF0aWMgdm9pZCBhYjg1MDBfZmdfY2hlY2tfaHdfZmFpbHVyZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlpbnQgcmV0OwotCXU4IHJlZ192YWx1ZTsKLQotCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhYjg1MDBfZmcsCi0JCWZnX2NoZWNrX2h3X2ZhaWx1cmVfd29yay53b3JrKTsKLQotCS8qCi0JICogSWYgd2UgaGF2ZSBoYWQgYSBiYXR0ZXJ5IG92ZXItdm9sdGFnZSBzaXR1YXRpb24sCi0JICogY2hlY2sgb3Z2LWJpdCB0byBzZWUgaWYgaXQgc2hvdWxkIGJlIHJlc2V0LgotCSAqLwotCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAotCQlBQjg1MDBfQ0hBUkdFUiwgQUI4NTAwX0NIX1NUQVRfUkVHLAotCQkmcmVnX3ZhbHVlKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGRpLT5kZXYsICIlcyBhYjg1MDAgcmVhZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoKHJlZ192YWx1ZSAmIEJBVFRfT1ZWKSA9PSBCQVRUX09WVikgewotCQlpZiAoIWRpLT5mbGFncy5iYXRfb3Z2KSB7Ci0JCQlkZXZfZGJnKGRpLT5kZXYsICJCYXR0ZXJ5IE9WVlxuIik7Ci0JCQlkaS0+ZmxhZ3MuYmF0X292diA9IHRydWU7Ci0JCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChkaS0+ZmdfcHN5KTsKLQkJfQotCQkvKiBOb3QgeWV0IHJlY292ZXJlZCBmcm9tIG92diwgcmVzY2hlZHVsZSB0aGlzIHRlc3QgKi8KLQkJcXVldWVfZGVsYXllZF93b3JrKGRpLT5mZ193cSwgJmRpLT5mZ19jaGVja19od19mYWlsdXJlX3dvcmssCi0JCQkJICAgSFopOwotCQl9IGVsc2UgewotCQkJZGV2X2RiZyhkaS0+ZGV2LCAiQmF0dGVyeSByZWNvdmVyZWQgZnJvbSBPVlZcbiIpOwotCQkJZGktPmZsYWdzLmJhdF9vdnYgPSBmYWxzZTsKLQkJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5mZ19wc3kpOwotCX0KLX0KLQotLyoqCi0gKiBhYjg1MDBfZmdfbG93X2JhdF93b3JrKCkgLSBDaGVjayBMT1dfQkFUIGNvbmRpdGlvbgotICogQHdvcms6CXBvaW50ZXIgdG8gdGhlIHdvcmtfc3RydWN0IHN0cnVjdHVyZQotICoKLSAqIFdvcmsgcXVldWUgZnVuY3Rpb24gZm9yIGNoZWNraW5nIHRoZSBMT1dfQkFUIGNvbmRpdGlvbgotICovCi1zdGF0aWMgdm9pZCBhYjg1MDBfZmdfbG93X2JhdF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlpbnQgdmJhdDsKLQotCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhYjg1MDBfZmcsCi0JCWZnX2xvd19iYXRfd29yay53b3JrKTsKLQotCXZiYXQgPSBhYjg1MDBfZmdfYmF0X3ZvbHRhZ2UoZGkpOwotCi0JLyogQ2hlY2sgaWYgTE9XX0JBVCBzdGlsbCBmdWxmaWxsZWQgKi8KLQlpZiAodmJhdCA8IGRpLT5ibS0+ZmdfcGFyYW1zLT5sb3diYXRfdGhyZXNob2xkKSB7Ci0JCS8qIElzIGl0IHRpbWUgdG8gc2h1dCBkb3duPyAqLwotCQlpZiAoZGktPmxvd19iYXRfY250IDwgMSkgewotCQkJZGktPmZsYWdzLmxvd19iYXQgPSB0cnVlOwotCQkJZGV2X3dhcm4oZGktPmRldiwgIlNodXQgZG93biBwZW5kaW5nLi4uXG4iKTsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkqIEVsc2Ugd2UgbmVlZCB0byByZS1zY2hlZHVsZSB0aGlzIGNoZWNrIHRvIGJlIGFibGUgdG8gZGV0ZWN0Ci0JCQkqIGlmIHRoZSB2b2x0YWdlIGluY3JlYXNlcyBhZ2FpbiBkdXJpbmcgY2hhcmdpbmcgb3IKLQkJCSogZHVlIHRvIGRlY3JlYXNpbmcgbG9hZC4KLQkJCSovCi0JCQlkaS0+bG93X2JhdF9jbnQtLTsKLQkJCWRldl93YXJuKGRpLT5kZXYsICJCYXR0ZXJ5IHZvbHRhZ2Ugc3RpbGwgTE9XXG4iKTsKLQkJCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Zmdfd3EsICZkaS0+ZmdfbG93X2JhdF93b3JrLAotCQkJCXJvdW5kX2ppZmZpZXMoTE9XX0JBVF9DSEVDS19JTlRFUlZBTCkpOwotCQl9Ci0JfSBlbHNlIHsKLQkJZGktPmZsYWdzLmxvd19iYXRfZGVsYXkgPSBmYWxzZTsKLQkJZGktPmxvd19iYXRfY250ID0gMTA7Ci0JCWRldl93YXJuKGRpLT5kZXYsICJCYXR0ZXJ5IHZvbHRhZ2UgT0sgYWdhaW5cbiIpOwotCX0KLQotCS8qIFRoaXMgaXMgbmVlZGVkIHRvIGRpc3BhdGNoIExPV19CQVQgKi8KLQlhYjg1MDBfZmdfY2hlY2tfY2FwYWNpdHlfbGltaXRzKGRpLCBmYWxzZSk7Ci19Ci0KLS8qKgotICogYWI4NTAwX2ZnX2JhdHRva19jYWxjIC0gY2FsY3VsYXRlIHRoZSBiaXQgcGF0dGVybiBjb3JyZXNwb25kaW5nCi0gKiB0byB0aGUgdGFyZ2V0IHZvbHRhZ2UuCi0gKiBAZGk6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKLSAqIEB0YXJnZXQgICAgdGFyZ2V0IHZvbHRhZ2UKLSAqCi0gKiBSZXR1cm5zIGJpdCBwYXR0ZXJuIGNsb3Nlc3QgdG8gdGhlIHRhcmdldCB2b2x0YWdlCi0gKiB2YWxpZCByZXR1cm4gdmFsdWVzIGFyZSAwLTE0LiAoMC1CQVRUX09LX01BWF9OUl9JTkNSRU1FTlRTKQotICovCi0KLXN0YXRpYyBpbnQgYWI4NTAwX2ZnX2JhdHRva19jYWxjKHN0cnVjdCBhYjg1MDBfZmcgKmRpLCBpbnQgdGFyZ2V0KQotewotCWlmICh0YXJnZXQgPiBCQVRUX09LX01JTiArCi0JCShCQVRUX09LX0lOQ1JFTUVOVCAqIEJBVFRfT0tfTUFYX05SX0lOQ1JFTUVOVFMpKQotCQlyZXR1cm4gQkFUVF9PS19NQVhfTlJfSU5DUkVNRU5UUzsKLQlpZiAodGFyZ2V0IDwgQkFUVF9PS19NSU4pCi0JCXJldHVybiAwOwotCXJldHVybiAodGFyZ2V0IC0gQkFUVF9PS19NSU4pIC8gQkFUVF9PS19JTkNSRU1FTlQ7Ci19Ci0KLS8qKgotICogYWI4NTAwX2ZnX2JhdHRva19pbml0X2h3X3JlZ2lzdGVyIC0gaW5pdCBiYXR0b2sgbGV2ZWxzCi0gKiBAZGk6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKLSAqCi0gKi8KLQotc3RhdGljIGludCBhYjg1MDBfZmdfYmF0dG9rX2luaXRfaHdfcmVnaXN0ZXIoc3RydWN0IGFiODUwMF9mZyAqZGkpCi17Ci0JaW50IHNlbGVjdGVkOwotCWludCBzZWwwOwotCWludCBzZWwxOwotCWludCBjYnBfc2VsMDsKLQlpbnQgY2JwX3NlbDE7Ci0JaW50IHJldDsKLQlpbnQgbmV3X3ZhbDsKLQotCXNlbDAgPSBkaS0+Ym0tPmZnX3BhcmFtcy0+YmF0dG9rX2ZhbGxpbmdfdGhfc2VsMDsKLQlzZWwxID0gZGktPmJtLT5mZ19wYXJhbXMtPmJhdHRva19yYWlzaW5nX3RoX3NlbDE7Ci0KLQljYnBfc2VsMCA9IGFiODUwMF9mZ19iYXR0b2tfY2FsYyhkaSwgc2VsMCk7Ci0JY2JwX3NlbDEgPSBhYjg1MDBfZmdfYmF0dG9rX2NhbGMoZGksIHNlbDEpOwotCi0Jc2VsZWN0ZWQgPSBCQVRUX09LX01JTiArIGNicF9zZWwwICogQkFUVF9PS19JTkNSRU1FTlQ7Ci0KLQlpZiAoc2VsZWN0ZWQgIT0gc2VsMCkKLQkJZGV2X3dhcm4oZGktPmRldiwgIkludmFsaWQgdm9sdGFnZSBzdGVwOiVkLCB1c2luZyAlZCAlZFxuIiwKLQkJCXNlbDAsIHNlbGVjdGVkLCBjYnBfc2VsMCk7Ci0KLQlzZWxlY3RlZCA9IEJBVFRfT0tfTUlOICsgY2JwX3NlbDEgKiBCQVRUX09LX0lOQ1JFTUVOVDsKLQotCWlmIChzZWxlY3RlZCAhPSBzZWwxKQotCQlkZXZfd2FybihkaS0+ZGV2LCAiSW52YWxpZCB2b2x0YWdlIHN0ZXA6JWQsIHVzaW5nICVkICVkXG4iLAotCQkJc2VsMSwgc2VsZWN0ZWQsIGNicF9zZWwxKTsKLQotCW5ld192YWwgPSBjYnBfc2VsMCB8IChjYnBfc2VsMSA8PCA0KTsKLQotCWRldl9kYmcoZGktPmRldiwgInVzaW5nOiAleCAlZCAlZFxuIiwgbmV3X3ZhbCwgY2JwX3NlbDAsIGNicF9zZWwxKTsKLQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX1NZU19DVFJMMl9CTE9DSywKLQkJQUI4NTAwX0JBVFRfT0tfUkVHLCBuZXdfdmFsKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIGFiODUwMF9mZ19pbnN0YW50X3dvcmsoKSAtIFJ1biB0aGUgRkcgc3RhdGUgbWFjaGluZSBpbnN0YW50bHkKLSAqIEB3b3JrOglwb2ludGVyIHRvIHRoZSB3b3JrX3N0cnVjdCBzdHJ1Y3R1cmUKLSAqCi0gKiBXb3JrIHF1ZXVlIGZ1bmN0aW9uIGZvciBpbnN0YW50IHdvcmsKLSAqLwotc3RhdGljIHZvaWQgYWI4NTAwX2ZnX2luc3RhbnRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGFiODUwMF9mZyAqZGkgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFiODUwMF9mZywgZmdfd29yayk7Ci0KLQlhYjg1MDBfZmdfYWxnb3JpdGhtKGRpKTsKLX0KLQotLyoqCi0gKiBhYjg1MDBfZmdfY2NfZGF0YV9lbmRfaGFuZGxlcigpIC0gZW5kIG9mIGRhdGEgY29udmVyc2lvbiBpc3IuCi0gKiBAaXJxOiAgICAgICBpbnRlcnJ1cHQgbnVtYmVyCi0gKiBAX2RpOiAgICAgICBwb2ludGVyIHRvIHRoZSBhYjg1MDBfZmcgc3RydWN0dXJlCi0gKgotICogUmV0dXJucyBJUlEgc3RhdHVzKElSUV9IQU5ETEVEKQotICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgYWI4NTAwX2ZnX2NjX2RhdGFfZW5kX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqX2RpKQotewotCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gX2RpOwotCWlmICghZGktPm5icl9jY2VvY19pcnFfY250KSB7Ci0JCWRpLT5uYnJfY2Nlb2NfaXJxX2NudCsrOwotCQljb21wbGV0ZSgmZGktPmFiODUwMF9mZ19zdGFydGVkKTsKLQl9IGVsc2UgewotCQlkaS0+bmJyX2NjZW9jX2lycV9jbnQgPSAwOwotCQljb21wbGV0ZSgmZGktPmFiODUwMF9mZ19jb21wbGV0ZSk7Ci0JfQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotLyoqCi0gKiBhYjg1MDBfZmdfY2NfaW50X2NhbGliX2hhbmRsZXIgKCkgLSBlbmQgb2YgY2FsaWJyYXRpb24gaXNyLgotICogQGlycTogICAgICAgaW50ZXJydXB0IG51bWJlcgotICogQF9kaTogICAgICAgcG9pbnRlciB0byB0aGUgYWI4NTAwX2ZnIHN0cnVjdHVyZQotICoKLSAqIFJldHVybnMgSVJRIHN0YXR1cyhJUlFfSEFORExFRCkKLSAqLwotc3RhdGljIGlycXJldHVybl90IGFiODUwMF9mZ19jY19pbnRfY2FsaWJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpfZGkpCi17Ci0Jc3RydWN0IGFiODUwMF9mZyAqZGkgPSBfZGk7Ci0JZGktPmNhbGliX3N0YXRlID0gQUI4NTAwX0ZHX0NBTElCX0VORDsKLQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmZnX3dxLCAmZGktPmZnX3BlcmlvZGljX3dvcmssIDApOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotLyoqCi0gKiBhYjg1MDBfZmdfY2NfY29udmVuZF9oYW5kbGVyKCkgLSBpc3IgdG8gZ2V0IGJhdHRlcnkgYXZnIGN1cnJlbnQuCi0gKiBAaXJxOiAgICAgICBpbnRlcnJ1cHQgbnVtYmVyCi0gKiBAX2RpOiAgICAgICBwb2ludGVyIHRvIHRoZSBhYjg1MDBfZmcgc3RydWN0dXJlCi0gKgotICogUmV0dXJucyBJUlEgc3RhdHVzKElSUV9IQU5ETEVEKQotICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgYWI4NTAwX2ZnX2NjX2NvbnZlbmRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpfZGkpCi17Ci0Jc3RydWN0IGFiODUwMF9mZyAqZGkgPSBfZGk7Ci0KLQlxdWV1ZV93b3JrKGRpLT5mZ193cSwgJmRpLT5mZ19hY2NfY3VyX3dvcmspOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKioKLSAqIGFiODUwMF9mZ19iYXR0X292dl9oYW5kbGVyKCkgLSBCYXR0ZXJ5IE9WViBvY2N1cmVkCi0gKiBAaXJxOiAgICAgICBpbnRlcnJ1cHQgbnVtYmVyCi0gKiBAX2RpOiAgICAgICBwb2ludGVyIHRvIHRoZSBhYjg1MDBfZmcgc3RydWN0dXJlCi0gKgotICogUmV0dXJucyBJUlEgc3RhdHVzKElSUV9IQU5ETEVEKQotICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgYWI4NTAwX2ZnX2JhdHRfb3Z2X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqX2RpKQotewotCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gX2RpOwotCi0JZGV2X2RiZyhkaS0+ZGV2LCAiQmF0dGVyeSBPVlZcbiIpOwotCi0JLyogU2NoZWR1bGUgYSBuZXcgSFcgZmFpbHVyZSBjaGVjayAqLwotCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Zmdfd3EsICZkaS0+ZmdfY2hlY2tfaHdfZmFpbHVyZV93b3JrLCAwKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotLyoqCi0gKiBhYjg1MDBfZmdfbG93YmF0Zl9oYW5kbGVyKCkgLSBCYXR0ZXJ5IHZvbHRhZ2UgaXMgYmVsb3cgTE9XIHRocmVzaG9sZAotICogQGlycTogICAgICAgaW50ZXJydXB0IG51bWJlcgotICogQF9kaTogICAgICAgcG9pbnRlciB0byB0aGUgYWI4NTAwX2ZnIHN0cnVjdHVyZQotICoKLSAqIFJldHVybnMgSVJRIHN0YXR1cyhJUlFfSEFORExFRCkKLSAqLwotc3RhdGljIGlycXJldHVybl90IGFiODUwMF9mZ19sb3diYXRmX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqX2RpKQotewotCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gX2RpOwotCi0JLyogSW5pdGlhdGUgaGFuZGxpbmcgaW4gYWI4NTAwX2ZnX2xvd19iYXRfd29yaygpIGlmIG5vdCBhbHJlYWR5IGluaXRpYXRlZC4gKi8KLQlpZiAoIWRpLT5mbGFncy5sb3dfYmF0X2RlbGF5KSB7Ci0JCWRldl93YXJuKGRpLT5kZXYsICJCYXR0ZXJ5IHZvbHRhZ2UgaXMgYmVsb3cgTE9XIHRocmVzaG9sZFxuIik7Ci0JCWRpLT5mbGFncy5sb3dfYmF0X2RlbGF5ID0gdHJ1ZTsKLQkJLyoKLQkJICogU3RhcnQgYSB0aW1lciB0byBjaGVjayBMT1dfQkFUIGFnYWluIGFmdGVyIHNvbWUgdGltZQotCQkgKiBUaGlzIGlzIGRvbmUgdG8gYXZvaWQgc2h1dGRvd24gb24gc2luZ2xlIHZvbHRhZ2UgZGlwcwotCQkgKi8KLQkJcXVldWVfZGVsYXllZF93b3JrKGRpLT5mZ193cSwgJmRpLT5mZ19sb3dfYmF0X3dvcmssCi0JCQlyb3VuZF9qaWZmaWVzKExPV19CQVRfQ0hFQ0tfSU5URVJWQUwpKTsKLQl9Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKioKLSAqIGFiODUwMF9mZ19nZXRfcHJvcGVydHkoKSAtIGdldCB0aGUgZmcgcHJvcGVydGllcwotICogQHBzeToJcG9pbnRlciB0byB0aGUgcG93ZXJfc3VwcGx5IHN0cnVjdHVyZQotICogQHBzcDoJcG9pbnRlciB0byB0aGUgcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHN0cnVjdHVyZQotICogQHZhbDoJcG9pbnRlciB0byB0aGUgcG93ZXJfc3VwcGx5X3Byb3B2YWwgdW5pb24KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIHdoZW4gYW4gYXBwbGljYXRpb24gdHJpZXMgdG8gZ2V0IHRoZQotICogZmcgcHJvcGVydGllcyBieSByZWFkaW5nIHRoZSBzeXNmcyBmaWxlcy4KLSAqIHZvbHRhZ2Vfbm93OgkJYmF0dGVyeSB2b2x0YWdlCi0gKiBjdXJyZW50X25vdzoJCWJhdHRlcnkgaW5zdGFudCBjdXJyZW50Ci0gKiBjdXJyZW50X2F2ZzoJCWJhdHRlcnkgYXZlcmFnZSBjdXJyZW50Ci0gKiBjaGFyZ2VfZnVsbF9kZXNpZ246CWNhcGFjaXR5IHdoZXJlIGJhdHRlcnkgaXMgY29uc2lkZXJlZCBmdWxsCi0gKiBjaGFyZ2Vfbm93OgkJYmF0dGVyeSBjYXBhY2l0eSBpbiBuQWgKLSAqIGNhcGFjaXR5OgkJY2FwYWNpdHkgaW4gcGVyY2VudAotICogY2FwYWNpdHlfbGV2ZWw6CWNhcGFjaXR5IGxldmVsCi0gKgotICogUmV0dXJucyBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZSBlbHNlIDAgb24gc3VjY2VzcwotICovCi1zdGF0aWMgaW50IGFiODUwMF9mZ19nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAotCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKLQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQotewotCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7Ci0KLQkvKgotCSAqIElmIGJhdHRlcnkgaXMgaWRlbnRpZmllZCBhcyB1bmtub3duIGFuZCBjaGFyZ2luZyBvZiB1bmtub3duCi0JICogYmF0dGVyaWVzIGlzIGRpc2FibGVkLCB3ZSBhbHdheXMgcmVwb3J0IDEwMCUgY2FwYWNpdHkgYW5kCi0JICogY2FwYWNpdHkgbGV2ZWwgVU5LTk9XTiwgc2luY2Ugd2UgY2FuJ3QgY2FsY3VsYXRlCi0JICogcmVtYWluaW5nIGNhcGFjaXR5Ci0JICovCi0KLQlzd2l0Y2ggKHBzcCkgewotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c6Ci0JCWlmIChkaS0+ZmxhZ3MuYmF0X292dikKLQkJCXZhbC0+aW50dmFsID0gQkFUVF9PVlZfVkFMVUUgKiAxMDAwOwotCQllbHNlCi0JCQl2YWwtPmludHZhbCA9IGRpLT52YmF0ICogMTAwMDsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVzoKLQkJdmFsLT5pbnR2YWwgPSBkaS0+aW5zdF9jdXJyICogMTAwMDsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX0FWRzoKLQkJdmFsLT5pbnR2YWwgPSBkaS0+YXZnX2N1cnIgKiAxMDAwOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9GVUxMX0RFU0lHTjoKLQkJdmFsLT5pbnR2YWwgPSBhYjg1MDBfZmdfY29udmVydF9tYWhfdG9fdXdoKGRpLAotCQkJCWRpLT5iYXRfY2FwLm1heF9tYWhfZGVzaWduKTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfRlVMTDoKLQkJdmFsLT5pbnR2YWwgPSBhYjg1MDBfZmdfY29udmVydF9tYWhfdG9fdXdoKGRpLAotCQkJCWRpLT5iYXRfY2FwLm1heF9tYWgpOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9OT1c6Ci0JCWlmIChkaS0+ZmxhZ3MuYmF0dF91bmtub3duICYmICFkaS0+Ym0tPmNoZ191bmtub3duX2JhdCAmJgotCQkJCWRpLT5mbGFncy5iYXR0X2lkX3JlY2VpdmVkKQotCQkJdmFsLT5pbnR2YWwgPSBhYjg1MDBfZmdfY29udmVydF9tYWhfdG9fdXdoKGRpLAotCQkJCQlkaS0+YmF0X2NhcC5tYXhfbWFoKTsKLQkJZWxzZQotCQkJdmFsLT5pbnR2YWwgPSBhYjg1MDBfZmdfY29udmVydF9tYWhfdG9fdXdoKGRpLAotCQkJCQlkaS0+YmF0X2NhcC5wcmV2X21haCk7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTExfREVTSUdOOgotCQl2YWwtPmludHZhbCA9IGRpLT5iYXRfY2FwLm1heF9tYWhfZGVzaWduOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMOgotCQl2YWwtPmludHZhbCA9IGRpLT5iYXRfY2FwLm1heF9tYWg7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVzoKLQkJaWYgKGRpLT5mbGFncy5iYXR0X3Vua25vd24gJiYgIWRpLT5ibS0+Y2hnX3Vua25vd25fYmF0ICYmCi0JCQkJZGktPmZsYWdzLmJhdHRfaWRfcmVjZWl2ZWQpCi0JCQl2YWwtPmludHZhbCA9IGRpLT5iYXRfY2FwLm1heF9tYWg7Ci0JCWVsc2UKLQkJCXZhbC0+aW50dmFsID0gZGktPmJhdF9jYXAucHJldl9tYWg7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFk6Ci0JCWlmIChkaS0+ZmxhZ3MuYmF0dF91bmtub3duICYmICFkaS0+Ym0tPmNoZ191bmtub3duX2JhdCAmJgotCQkJCWRpLT5mbGFncy5iYXR0X2lkX3JlY2VpdmVkKQotCQkJdmFsLT5pbnR2YWwgPSAxMDA7Ci0JCWVsc2UKLQkJCXZhbC0+aW50dmFsID0gZGktPmJhdF9jYXAucHJldl9wZXJjZW50OwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZX0xFVkVMOgotCQlpZiAoZGktPmZsYWdzLmJhdHRfdW5rbm93biAmJiAhZGktPmJtLT5jaGdfdW5rbm93bl9iYXQgJiYKLQkJCQlkaS0+ZmxhZ3MuYmF0dF9pZF9yZWNlaXZlZCkKLQkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX1VOS05PV047Ci0JCWVsc2UKLQkJCXZhbC0+aW50dmFsID0gZGktPmJhdF9jYXAucHJldl9sZXZlbDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFiODUwMF9mZ19nZXRfZXh0X3BzeV9kYXRhKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3k7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqZXh0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JY29uc3QgY2hhciAqKnN1cHBsaWNhbnRzID0gKGNvbnN0IGNoYXIgKiopZXh0LT5zdXBwbGllZF90bzsKLQlzdHJ1Y3QgYWI4NTAwX2ZnICpkaTsKLQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCByZXQ7Ci0JaW50IGo7Ci0KLQlwc3kgPSAoc3RydWN0IHBvd2VyX3N1cHBseSAqKWRhdGE7Ci0JZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKLQotCS8qCi0JICogRm9yIGFsbCBwc3kgd2hlcmUgdGhlIG5hbWUgb2YgeW91ciBkcml2ZXIKLQkgKiBhcHBlYXJzIGluIGFueSBzdXBwbGllZF90bwotCSAqLwotCWogPSBtYXRjaF9zdHJpbmcoc3VwcGxpY2FudHMsIGV4dC0+bnVtX3N1cHBsaWNhbnRzLCBwc3ktPmRlc2MtPm5hbWUpOwotCWlmIChqIDwgMCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBHbyB0aHJvdWdoIGFsbCBwcm9wZXJ0aWVzIGZvciB0aGUgcHN5ICovCi0JZm9yIChqID0gMDsgaiA8IGV4dC0+ZGVzYy0+bnVtX3Byb3BlcnRpZXM7IGorKykgewotCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwcm9wOwotCQlwcm9wID0gZXh0LT5kZXNjLT5wcm9wZXJ0aWVzW2pdOwotCi0JCWlmIChwb3dlcl9zdXBwbHlfZ2V0X3Byb3BlcnR5KGV4dCwgcHJvcCwgJnJldCkpCi0JCQljb250aW51ZTsKLQotCQlzd2l0Y2ggKHByb3ApIHsKLQkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6Ci0JCQlzd2l0Y2ggKGV4dC0+ZGVzYy0+dHlwZSkgewotCQkJY2FzZSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOgotCQkJCXN3aXRjaCAocmV0LmludHZhbCkgewotCQkJCWNhc2UgUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOgotCQkJCWNhc2UgUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORzoKLQkJCQljYXNlIFBPV0VSX1NVUFBMWV9TVEFUVVNfTk9UX0NIQVJHSU5HOgotCQkJCQlpZiAoIWRpLT5mbGFncy5jaGFyZ2luZykKLQkJCQkJCWJyZWFrOwotCQkJCQlkaS0+ZmxhZ3MuY2hhcmdpbmcgPSBmYWxzZTsKLQkJCQkJZGktPmZsYWdzLmZ1bGx5X2NoYXJnZWQgPSBmYWxzZTsKLQkJCQkJaWYgKGRpLT5ibS0+Y2FwYWNpdHlfc2NhbGluZykKLQkJCQkJCWFiODUwMF9mZ191cGRhdGVfY2FwX3NjYWxlcnMoZGkpOwotCQkJCQlxdWV1ZV93b3JrKGRpLT5mZ193cSwgJmRpLT5mZ193b3JrKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQT1dFUl9TVVBQTFlfU1RBVFVTX0ZVTEw6Ci0JCQkJCWlmIChkaS0+ZmxhZ3MuZnVsbHlfY2hhcmdlZCkKLQkJCQkJCWJyZWFrOwotCQkJCQlkaS0+ZmxhZ3MuZnVsbHlfY2hhcmdlZCA9IHRydWU7Ci0JCQkJCWRpLT5mbGFncy5mb3JjZV9mdWxsID0gdHJ1ZTsKLQkJCQkJLyogU2F2ZSBjdXJyZW50IGNhcGFjaXR5IGFzIG1heGltdW0gKi8KLQkJCQkJZGktPmJhdF9jYXAubWF4X21haCA9IGRpLT5iYXRfY2FwLm1haDsKLQkJCQkJcXVldWVfd29yayhkaS0+Zmdfd3EsICZkaS0+Zmdfd29yayk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzoKLQkJCQkJaWYgKGRpLT5mbGFncy5jaGFyZ2luZyAmJgotCQkJCQkJIWRpLT5mbGFncy5mdWxseV9jaGFyZ2VkKQotCQkJCQkJYnJlYWs7Ci0JCQkJCWRpLT5mbGFncy5jaGFyZ2luZyA9IHRydWU7Ci0JCQkJCWRpLT5mbGFncy5mdWxseV9jaGFyZ2VkID0gZmFsc2U7Ci0JCQkJCWlmIChkaS0+Ym0tPmNhcGFjaXR5X3NjYWxpbmcpCi0JCQkJCQlhYjg1MDBfZmdfdXBkYXRlX2NhcF9zY2FsZXJzKGRpKTsKLQkJCQkJcXVldWVfd29yayhkaS0+Zmdfd3EsICZkaS0+Zmdfd29yayk7Ci0JCQkJCWJyZWFrOwotCQkJCX07Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQkJfTsKLQkJCWJyZWFrOwotCQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1k6Ci0JCQlzd2l0Y2ggKGV4dC0+ZGVzYy0+dHlwZSkgewotCQkJY2FzZSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOgotCQkJCWlmICghZGktPmZsYWdzLmJhdHRfaWRfcmVjZWl2ZWQgJiYKLQkJCQkgICAgZGktPmJtLT5iYXR0X2lkICE9IEJBVFRFUllfVU5LTk9XTikgewotCQkJCQljb25zdCBzdHJ1Y3QgYWJ4NTAwX2JhdHRlcnlfdHlwZSAqYjsKLQotCQkJCQliID0gJihkaS0+Ym0tPmJhdF90eXBlW2RpLT5ibS0+YmF0dF9pZF0pOwotCi0JCQkJCWRpLT5mbGFncy5iYXR0X2lkX3JlY2VpdmVkID0gdHJ1ZTsKLQotCQkJCQlkaS0+YmF0X2NhcC5tYXhfbWFoX2Rlc2lnbiA9Ci0JCQkJCQlNSUxMSV9UT19NSUNSTyAqCi0JCQkJCQliLT5jaGFyZ2VfZnVsbF9kZXNpZ247Ci0KLQkJCQkJZGktPmJhdF9jYXAubWF4X21haCA9Ci0JCQkJCQlkaS0+YmF0X2NhcC5tYXhfbWFoX2Rlc2lnbjsKLQotCQkJCQlkaS0+dmJhdF9ub20gPSBiLT5ub21pbmFsX3ZvbHRhZ2U7Ci0JCQkJfQotCi0JCQkJaWYgKHJldC5pbnR2YWwpCi0JCQkJCWRpLT5mbGFncy5iYXR0X3Vua25vd24gPSBmYWxzZTsKLQkJCQllbHNlCi0JCQkJCWRpLT5mbGFncy5iYXR0X3Vua25vd24gPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVA6Ci0JCQlzd2l0Y2ggKGV4dC0+ZGVzYy0+dHlwZSkgewotCQkJY2FzZSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOgotCQkJCWlmIChkaS0+ZmxhZ3MuYmF0dF9pZF9yZWNlaXZlZCkKLQkJCQkJZGktPmJhdF90ZW1wID0gcmV0LmludHZhbDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGFiODUwMF9mZ19pbml0X2h3X3JlZ2lzdGVycygpIC0gU2V0IHVwIEZHIHJlbGF0ZWQgcmVnaXN0ZXJzCi0gKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfZmcgc3RydWN0dXJlCi0gKgotICogU2V0IHVwIGJhdHRlcnkgT1ZWLCBsb3cgYmF0dGVyeSB2b2x0YWdlIHJlZ2lzdGVycwotICovCi1zdGF0aWMgaW50IGFiODUwMF9mZ19pbml0X2h3X3JlZ2lzdGVycyhzdHJ1Y3QgYWI4NTAwX2ZnICpkaSkKLXsKLQlpbnQgcmV0OwotCi0JLyogU2V0IFZCQVQgT1ZWIHRocmVzaG9sZCAqLwotCXJldCA9IGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAotCQlBQjg1MDBfQ0hBUkdFUiwKLQkJQUI4NTAwX0JBVFRfT1ZWLAotCQlCQVRUX09WVl9USF80UDc1LAotCQlCQVRUX09WVl9USF80UDc1KTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byBzZXQgQkFUVF9PVlZcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBFbmFibGUgVkJBVCBPVlYgZGV0ZWN0aW9uICovCi0JcmV0ID0gYWJ4NTAwX21hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCi0JCUFCODUwMF9DSEFSR0VSLAotCQlBQjg1MDBfQkFUVF9PVlYsCi0JCUJBVFRfT1ZWX0VOQSwKLQkJQkFUVF9PVlZfRU5BKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byBlbmFibGUgQkFUVF9PVlZcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBMb3cgQmF0dGVyeSBWb2x0YWdlICovCi0JcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCi0JCUFCODUwMF9TWVNfQ1RSTDJfQkxPQ0ssCi0JCUFCODUwMF9MT1dfQkFUX1JFRywKLQkJYWI4NTAwX3ZvbHRfdG9fcmVndmFsKAotCQkJZGktPmJtLT5mZ19wYXJhbXMtPmxvd2JhdF90aHJlc2hvbGQpIDw8IDEgfAotCQlMT1dfQkFUX0VOQUJMRSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRpLT5kZXYsICIlcyB3cml0ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogQmF0dGVyeSBPSyB0aHJlc2hvbGQgKi8KLQlyZXQgPSBhYjg1MDBfZmdfYmF0dG9rX2luaXRfaHdfcmVnaXN0ZXIoZGkpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihkaS0+ZGV2LCAiQmF0dE9rIGluaXQgd3JpdGUgZmFpbGVkLlxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmICgoKGlzX2FiODUwNShkaS0+cGFyZW50KSB8fCBpc19hYjk1NDAoZGktPnBhcmVudCkpICYmCi0JCQlhYng1MDBfZ2V0X2NoaXBfaWQoZGktPmRldikgPj0gQUI4NTAwX0NVVDJQMCkKLQkJCXx8IGlzX2FiODU0MChkaS0+cGFyZW50KSkgewotCQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX1JUQywKLQkJCUFCODUwNV9SVENfUENVVF9NQVhfVElNRV9SRUcsIGRpLT5ibS0+ZmdfcGFyYW1zLT5wY3V0X21heF90aW1lKTsKLQotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKGRpLT5kZXYsICIlcyB3cml0ZSBmYWlsZWQgQUI4NTA1X1JUQ19QQ1VUX01BWF9USU1FX1JFR1xuIiwgX19mdW5jX18pOwotCQkJZ290byBvdXQ7Ci0JCX07Ci0KLQkJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9SVEMsCi0JCQlBQjg1MDVfUlRDX1BDVVRfRkxBR19USU1FX1JFRywgZGktPmJtLT5mZ19wYXJhbXMtPnBjdXRfZmxhZ190aW1lKTsKLQotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKGRpLT5kZXYsICIlcyB3cml0ZSBmYWlsZWQgQUI4NTA1X1JUQ19QQ1VUX0ZMQUdfVElNRV9SRUdcbiIsIF9fZnVuY19fKTsKLQkJCWdvdG8gb3V0OwotCQl9OwotCi0JCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfUlRDLAotCQkJQUI4NTA1X1JUQ19QQ1VUX1JFU1RBUlRfUkVHLCBkaS0+Ym0tPmZnX3BhcmFtcy0+cGN1dF9tYXhfcmVzdGFydCk7Ci0KLQkJaWYgKHJldCkgewotCQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgd3JpdGUgZmFpbGVkIEFCODUwNV9SVENfUENVVF9SRVNUQVJUX1JFR1xuIiwgX19mdW5jX18pOwotCQkJZ290byBvdXQ7Ci0JCX07Ci0KLQkJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9SVEMsCi0JCQlBQjg1MDVfUlRDX1BDVVRfREVCT1VOQ0VfUkVHLCBkaS0+Ym0tPmZnX3BhcmFtcy0+cGN1dF9kZWJvdW5jZV90aW1lKTsKLQotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKGRpLT5kZXYsICIlcyB3cml0ZSBmYWlsZWQgQUI4NTA1X1JUQ19QQ1VUX0RFQk9VTkNFX1JFR1xuIiwgX19mdW5jX18pOwotCQkJZ290byBvdXQ7Ci0JCX07Ci0KLQkJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9SVEMsCi0JCQlBQjg1MDVfUlRDX1BDVVRfQ1RMX1NUQVRVU19SRUcsIGRpLT5ibS0+ZmdfcGFyYW1zLT5wY3V0X2VuYWJsZSk7Ci0KLQkJaWYgKHJldCkgewotCQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgd3JpdGUgZmFpbGVkIEFCODUwNV9SVENfUENVVF9DVExfU1RBVFVTX1JFR1xuIiwgX19mdW5jX18pOwotCQkJZ290byBvdXQ7Ci0JCX07Ci0JfQotb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogYWI4NTAwX2ZnX2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQoKSAtIGNhbGxiYWNrIGZvciBwb3dlciBzdXBwbHkgY2hhbmdlcwotICogQHBzeTogICAgICAgcG9pbnRlciB0byB0aGUgc3RydWN0dXJlIHBvd2VyX3N1cHBseQotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGVudHJ5IHBvaW50IG9mIHRoZSBwb2ludGVyIGV4dGVybmFsX3Bvd2VyX2NoYW5nZWQKLSAqIG9mIHRoZSBzdHJ1Y3R1cmUgcG93ZXJfc3VwcGx5LgotICogVGhpcyBmdW5jdGlvbiBnZXRzIGV4ZWN1dGVkIHdoZW4gdGhlcmUgaXMgYSBjaGFuZ2UgaW4gYW55IGV4dGVybmFsIHBvd2VyCi0gKiBzdXBwbHkgdGhhdCB0aGlzIGRyaXZlciBuZWVkcyB0byBiZSBub3RpZmllZCBvZi4KLSAqLwotc3RhdGljIHZvaWQgYWI4NTAwX2ZnX2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KQotewotCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7Ci0KLQljbGFzc19mb3JfZWFjaF9kZXZpY2UocG93ZXJfc3VwcGx5X2NsYXNzLCBOVUxMLAotCQlkaS0+ZmdfcHN5LCBhYjg1MDBfZmdfZ2V0X2V4dF9wc3lfZGF0YSk7Ci19Ci0KLS8qKgotICogYWJhYjg1MDBfZmdfcmVpbml0X3dvcmsoKSAtIHdvcmsgdG8gcmVzZXQgdGhlIEZHIGFsZ29yaXRobQotICogQHdvcms6CXBvaW50ZXIgdG8gdGhlIHdvcmtfc3RydWN0IHN0cnVjdHVyZQotICoKLSAqIFVzZWQgdG8gcmVzZXQgdGhlIGN1cnJlbnQgYmF0dGVyeSBjYXBhY2l0eSB0byBiZSBhYmxlIHRvCi0gKiByZXRyaWdnZXIgYSBuZXcgdm9sdGFnZSBiYXNlIGNhcGFjaXR5IGNhbGN1bGF0aW9uLiBGb3IKLSAqIHRlc3QgYW5kIHZlcmlmaWNhdGlvbiBwdXJwb3NlLgotICovCi1zdGF0aWMgdm9pZCBhYjg1MDBfZmdfcmVpbml0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhYjg1MDBfZmcsCi0JCWZnX3JlaW5pdF93b3JrLndvcmspOwotCi0JaWYgKGRpLT5mbGFncy5jYWxpYnJhdGUgPT0gZmFsc2UpIHsKLQkJZGV2X2RiZyhkaS0+ZGV2LCAiUmVzZXR0aW5nIEZHIHN0YXRlIG1hY2hpbmUgdG8gaW5pdC5cbiIpOwotCQlhYjg1MDBfZmdfY2xlYXJfY2FwX3NhbXBsZXMoZGkpOwotCQlhYjg1MDBfZmdfY2FsY19jYXBfZGlzY2hhcmdlX3ZvbHRhZ2UoZGksIHRydWUpOwotCQlhYjg1MDBfZmdfY2hhcmdlX3N0YXRlX3RvKGRpLCBBQjg1MDBfRkdfQ0hBUkdFX0lOSVQpOwotCQlhYjg1MDBfZmdfZGlzY2hhcmdlX3N0YXRlX3RvKGRpLCBBQjg1MDBfRkdfRElTQ0hBUkdFX0lOSVQpOwotCQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmZnX3dxLCAmZGktPmZnX3BlcmlvZGljX3dvcmssIDApOwotCi0JfSBlbHNlIHsKLQkJZGV2X2VycihkaS0+ZGV2LCAiUmVzaWR1YWwgb2Zmc2V0IGNhbGlicmF0aW9uIG9uZ29pbmcgIgotCQkJInJldHJ5aW5nLi5cbiIpOwotCQkvKiBXYWl0IG9uZSBzZWNvbmQgdW50aWwgbmV4dCB0cnkqLwotCQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmZnX3dxLCAmZGktPmZnX3JlaW5pdF93b3JrLAotCQkJcm91bmRfamlmZmllcygxKSk7Ci0JfQotfQotCi0vKiBFeHBvc3VyZSB0byB0aGUgc3lzZnMgaW50ZXJmYWNlICovCi0KLXN0cnVjdCBhYjg1MDBfZmdfc3lzZnNfZW50cnkgewotCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKLQlzc2l6ZV90ICgqc2hvdykoc3RydWN0IGFiODUwMF9mZyAqLCBjaGFyICopOwotCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IGFiODUwMF9mZyAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7Ci19OwotCi1zdGF0aWMgc3NpemVfdCBjaGFyZ2VfZnVsbF9zaG93KHN0cnVjdCBhYjg1MDBfZmcgKmRpLCBjaGFyICpidWYpCi17Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRpLT5iYXRfY2FwLm1heF9tYWgpOwotfQotCi1zdGF0aWMgc3NpemVfdCBjaGFyZ2VfZnVsbF9zdG9yZShzdHJ1Y3QgYWI4NTAwX2ZnICpkaSwgY29uc3QgY2hhciAqYnVmLAotCQkJCSBzaXplX3QgY291bnQpCi17Ci0JdW5zaWduZWQgbG9uZyBjaGFyZ2VfZnVsbDsKLQlzc2l6ZV90IHJldDsKLQotCXJldCA9IGtzdHJ0b3VsKGJ1ZiwgMTAsICZjaGFyZ2VfZnVsbCk7Ci0KLQlkZXZfZGJnKGRpLT5kZXYsICJSZXQgJXpkIGNoYXJnZV9mdWxsICVsdSIsIHJldCwgY2hhcmdlX2Z1bGwpOwotCi0JaWYgKCFyZXQpIHsKLQkJZGktPmJhdF9jYXAubWF4X21haCA9IChpbnQpIGNoYXJnZV9mdWxsOwotCQlyZXQgPSBjb3VudDsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgY2hhcmdlX25vd19zaG93KHN0cnVjdCBhYjg1MDBfZmcgKmRpLCBjaGFyICpidWYpCi17Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRpLT5iYXRfY2FwLnByZXZfbWFoKTsKLX0KLQotc3RhdGljIHNzaXplX3QgY2hhcmdlX25vd19zdG9yZShzdHJ1Y3QgYWI4NTAwX2ZnICpkaSwgY29uc3QgY2hhciAqYnVmLAotCQkJCSBzaXplX3QgY291bnQpCi17Ci0JdW5zaWduZWQgbG9uZyBjaGFyZ2Vfbm93OwotCXNzaXplX3QgcmV0OwotCi0JcmV0ID0ga3N0cnRvdWwoYnVmLCAxMCwgJmNoYXJnZV9ub3cpOwotCi0JZGV2X2RiZyhkaS0+ZGV2LCAiUmV0ICV6ZCBjaGFyZ2Vfbm93ICVsdSB3YXMgJWQiLAotCQlyZXQsIGNoYXJnZV9ub3csIGRpLT5iYXRfY2FwLnByZXZfbWFoKTsKLQotCWlmICghcmV0KSB7Ci0JCWRpLT5iYXRfY2FwLnVzZXJfbWFoID0gKGludCkgY2hhcmdlX25vdzsKLQkJZGktPmZsYWdzLnVzZXJfY2FwID0gdHJ1ZTsKLQkJcmV0ID0gY291bnQ7Ci0JCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Zmdfd3EsICZkaS0+ZmdfcGVyaW9kaWNfd29yaywgMCk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYWI4NTAwX2ZnX3N5c2ZzX2VudHJ5IGNoYXJnZV9mdWxsX2F0dHIgPQotCV9fQVRUUihjaGFyZ2VfZnVsbCwgMDY0NCwgY2hhcmdlX2Z1bGxfc2hvdywgY2hhcmdlX2Z1bGxfc3RvcmUpOwotCi1zdGF0aWMgc3RydWN0IGFiODUwMF9mZ19zeXNmc19lbnRyeSBjaGFyZ2Vfbm93X2F0dHIgPQotCV9fQVRUUihjaGFyZ2Vfbm93LCAwNjQ0LCBjaGFyZ2Vfbm93X3Nob3csIGNoYXJnZV9ub3dfc3RvcmUpOwotCi1zdGF0aWMgc3NpemVfdAotYWI4NTAwX2ZnX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYWI4NTAwX2ZnX3N5c2ZzX2VudHJ5ICplbnRyeTsKLQlzdHJ1Y3QgYWI4NTAwX2ZnICpkaTsKLQotCWVudHJ5ID0gY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBhYjg1MDBfZmdfc3lzZnNfZW50cnksIGF0dHIpOwotCWRpID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBhYjg1MDBfZmcsIGZnX2tvYmplY3QpOwotCi0JaWYgKCFlbnRyeS0+c2hvdykKLQkJcmV0dXJuIC1FSU87Ci0KLQlyZXR1cm4gZW50cnktPnNob3coZGksIGJ1Zik7Ci19Ci1zdGF0aWMgc3NpemVfdAotYWI4NTAwX2ZnX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCi0JCXNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgYWI4NTAwX2ZnX3N5c2ZzX2VudHJ5ICplbnRyeTsKLQlzdHJ1Y3QgYWI4NTAwX2ZnICpkaTsKLQotCWVudHJ5ID0gY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBhYjg1MDBfZmdfc3lzZnNfZW50cnksIGF0dHIpOwotCWRpID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBhYjg1MDBfZmcsIGZnX2tvYmplY3QpOwotCi0JaWYgKCFlbnRyeS0+c3RvcmUpCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuIGVudHJ5LT5zdG9yZShkaSwgYnVmLCBjb3VudCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3lzZnNfb3BzIGFiODUwMF9mZ19zeXNmc19vcHMgPSB7Ci0JLnNob3cgPSBhYjg1MDBfZmdfc2hvdywKLQkuc3RvcmUgPSBhYjg1MDBfZmdfc3RvcmUsCi19OwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWI4NTAwX2ZnX2F0dHJzW10gPSB7Ci0JJmNoYXJnZV9mdWxsX2F0dHIuYXR0ciwKLQkmY2hhcmdlX25vd19hdHRyLmF0dHIsCi0JTlVMTCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGFiODUwMF9mZ19rdHlwZSA9IHsKLQkuc3lzZnNfb3BzID0gJmFiODUwMF9mZ19zeXNmc19vcHMsCi0JLmRlZmF1bHRfYXR0cnMgPSBhYjg1MDBfZmdfYXR0cnMsCi19OwotCi0vKioKLSAqIGFiODUwMF9jaGFyZ2FsZ19zeXNmc19leGl0KCkgLSBkZS1pbml0IG9mIHN5c2ZzIGVudHJ5Ci0gKiBAZGk6ICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBhYjg1MDBfY2hhcmdhbGcKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIGVudHJ5IGluIHN5c2ZzLgotICovCi1zdGF0aWMgdm9pZCBhYjg1MDBfZmdfc3lzZnNfZXhpdChzdHJ1Y3QgYWI4NTAwX2ZnICpkaSkKLXsKLQlrb2JqZWN0X2RlbCgmZGktPmZnX2tvYmplY3QpOwotfQotCi0vKioKLSAqIGFiODUwMF9jaGFyZ2FsZ19zeXNmc19pbml0KCkgLSBpbml0IG9mIHN5c2ZzIGVudHJ5Ci0gKiBAZGk6ICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBhYjg1MDBfY2hhcmdhbGcKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGFkZHMgYW4gZW50cnkgaW4gc3lzZnMuCi0gKiBSZXR1cm5zIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlIGVsc2UgMChvbiBzdWNjZXNzKQotICovCi1zdGF0aWMgaW50IGFiODUwMF9mZ19zeXNmc19pbml0KHN0cnVjdCBhYjg1MDBfZmcgKmRpKQotewotCWludCByZXQgPSAwOwotCi0JcmV0ID0ga29iamVjdF9pbml0X2FuZF9hZGQoJmRpLT5mZ19rb2JqZWN0LAotCQkmYWI4NTAwX2ZnX2t0eXBlLAotCQlOVUxMLCAiYmF0dGVyeSIpOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGVudHJ5XG4iKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGFiODUwNV9wb3dlcmN1dF9mbGFndGltZV9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgIGNoYXIgKmJ1ZikKLXsKLQlpbnQgcmV0OwotCXU4IHJlZ192YWx1ZTsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWI4NTAwX2ZnICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwotCi0JcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9SVEMsCi0JCUFCODUwNV9SVENfUENVVF9GTEFHX1RJTUVfUkVHLCAmcmVnX3ZhbHVlKTsKLQotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlYWQgQUI4NTA1X1JUQ19QQ1VUX0ZMQUdfVElNRV9SRUdcbiIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCAocmVnX3ZhbHVlICYgMHg3RikpOwotCi1mYWlsOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGFiODUwNV9wb3dlcmN1dF9mbGFndGltZV93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCWludCByZXQ7Ci0JbG9uZyB1bnNpZ25lZCByZWdfdmFsdWU7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFiODUwMF9mZyAqZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKLQotCXJlZ192YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwotCi0JaWYgKHJlZ192YWx1ZSA+IDB4N0YpIHsKLQkJZGV2X2VycihkZXYsICJJbmNvcnJlY3QgcGFyYW1ldGVyLCBlY2hvIDAgKDEuOThzKSAtIDEyNyAoMTUuNjI1bXMpIGZvciBmbGFndGltZVxuIik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX1JUQywKLQkJQUI4NTA1X1JUQ19QQ1VUX0ZMQUdfVElNRV9SRUcsICh1OClyZWdfdmFsdWUpOwotCi0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHNldCBBQjg1MDVfUlRDX1BDVVRfRkxBR19USU1FX1JFR1xuIik7Ci0KLWZhaWw6Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBhYjg1MDVfcG93ZXJjdXRfbWF4dGltZV9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgIGNoYXIgKmJ1ZikKLXsKLQlpbnQgcmV0OwotCXU4IHJlZ192YWx1ZTsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWI4NTAwX2ZnICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwotCi0JcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9SVEMsCi0JCUFCODUwNV9SVENfUENVVF9NQVhfVElNRV9SRUcsICZyZWdfdmFsdWUpOwotCi0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVhZCBBQjg1MDVfUlRDX1BDVVRfTUFYX1RJTUVfUkVHXG4iKTsKLQkJZ290byBmYWlsOwotCX0KLQotCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgKHJlZ192YWx1ZSAmIDB4N0YpKTsKLQotZmFpbDoKLQlyZXR1cm4gcmV0OwotCi19Ci0KLXN0YXRpYyBzc2l6ZV90IGFiODUwNV9wb3dlcmN1dF9tYXh0aW1lX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0JaW50IHJldDsKLQlpbnQgcmVnX3ZhbHVlOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7Ci0KLQlyZWdfdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKLQlpZiAocmVnX3ZhbHVlID4gMHg3RikgewotCQlkZXZfZXJyKGRldiwgIkluY29ycmVjdCBwYXJhbWV0ZXIsIGVjaG8gMCAoMC4wcykgLSAxMjcgKDEuOThzKSBmb3IgbWF4dGltZVxuIik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX1JUQywKLQkJQUI4NTA1X1JUQ19QQ1VUX01BWF9USU1FX1JFRywgKHU4KXJlZ192YWx1ZSk7Ci0KLQlpZiAocmV0IDwgMCkKLQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gc2V0IEFCODUwNV9SVENfUENVVF9NQVhfVElNRV9SRUdcbiIpOwotCi1mYWlsOgotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3QgYWI4NTA1X3Bvd2VyY3V0X3Jlc3RhcnRfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgICBjaGFyICpidWYpCi17Ci0JaW50IHJldDsKLQl1OCByZWdfdmFsdWU7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFiODUwMF9mZyAqZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKLQotCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfUlRDLAotCQlBQjg1MDVfUlRDX1BDVVRfUkVTVEFSVF9SRUcsICZyZWdfdmFsdWUpOwotCi0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVhZCBBQjg1MDVfUlRDX1BDVVRfUkVTVEFSVF9SRUdcbiIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCAocmVnX3ZhbHVlICYgMHhGKSk7Ci0KLWZhaWw6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgYWI4NTA1X3Bvd2VyY3V0X3Jlc3RhcnRfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCWludCByZXQ7Ci0JaW50IHJlZ192YWx1ZTsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWI4NTAwX2ZnICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwotCi0JcmVnX3ZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7Ci0JaWYgKHJlZ192YWx1ZSA+IDB4RikgewotCQlkZXZfZXJyKGRldiwgIkluY29ycmVjdCBwYXJhbWV0ZXIsIGVjaG8gMCAtIDE1IGZvciBudW1iZXIgb2YgcmVzdGFydFxuIik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX1JUQywKLQkJCQkJCUFCODUwNV9SVENfUENVVF9SRVNUQVJUX1JFRywgKHU4KXJlZ192YWx1ZSk7Ci0KLQlpZiAocmV0IDwgMCkKLQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gc2V0IEFCODUwNV9SVENfUENVVF9SRVNUQVJUX1JFR1xuIik7Ci0KLWZhaWw6Ci0JcmV0dXJuIGNvdW50OwotCi19Ci0KLXN0YXRpYyBzc2l6ZV90IGFiODUwNV9wb3dlcmN1dF90aW1lcl9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkJICBjaGFyICpidWYpCi17Ci0JaW50IHJldDsKLQl1OCByZWdfdmFsdWU7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFiODUwMF9mZyAqZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKLQotCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfUlRDLAotCQkJCQkJQUI4NTA1X1JUQ19QQ1VUX1RJTUVfUkVHLCAmcmVnX3ZhbHVlKTsKLQotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlYWQgQUI4NTA1X1JUQ19QQ1VUX1RJTUVfUkVHXG4iKTsKLQkJZ290byBmYWlsOwotCX0KLQotCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgKHJlZ192YWx1ZSAmIDB4N0YpKTsKLQotZmFpbDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCBhYjg1MDVfcG93ZXJjdXRfcmVzdGFydF9jb3VudGVyX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCQkJICAgIGNoYXIgKmJ1ZikKLXsKLQlpbnQgcmV0OwotCXU4IHJlZ192YWx1ZTsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWI4NTAwX2ZnICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwotCi0JcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9SVEMsCi0JCQkJCQlBQjg1MDVfUlRDX1BDVVRfUkVTVEFSVF9SRUcsICZyZWdfdmFsdWUpOwotCi0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVhZCBBQjg1MDVfUlRDX1BDVVRfUkVTVEFSVF9SRUdcbiIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCAocmVnX3ZhbHVlICYgMHhGMCkgPj4gNCk7Ci0KLWZhaWw6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgYWI4NTA1X3Bvd2VyY3V0X3JlYWQoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICAgY2hhciAqYnVmKQotewotCWludCByZXQ7Ci0JdTggcmVnX3ZhbHVlOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7Ci0KLQlyZXQgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX1JUQywKLQkJCQkJCUFCODUwNV9SVENfUENVVF9DVExfU1RBVFVTX1JFRywgJnJlZ192YWx1ZSk7Ci0KLQlpZiAocmV0IDwgMCkKLQkJZ290byBmYWlsOwotCi0JcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCAocmVnX3ZhbHVlICYgMHgxKSk7Ci0KLWZhaWw6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgYWI4NTA1X3Bvd2VyY3V0X3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0JaW50IHJldDsKLQlpbnQgcmVnX3ZhbHVlOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7Ci0KLQlyZWdfdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKLQlpZiAocmVnX3ZhbHVlID4gMHgxKSB7Ci0JCWRldl9lcnIoZGV2LCAiSW5jb3JyZWN0IHBhcmFtZXRlciwgZWNobyAwLzEgdG8gZGlzYWJsZS9lbmFibGUgUGN1dCBmZWF0dXJlXG4iKTsKLQkJZ290byBmYWlsOwotCX0KLQotCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfUlRDLAotCQkJCQkJQUI4NTA1X1JUQ19QQ1VUX0NUTF9TVEFUVVNfUkVHLCAodTgpcmVnX3ZhbHVlKTsKLQotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBzZXQgQUI4NTA1X1JUQ19QQ1VUX0NUTF9TVEFUVVNfUkVHXG4iKTsKLQotZmFpbDoKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGFiODUwNV9wb3dlcmN1dF9mbGFnX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCSBjaGFyICpidWYpCi17Ci0KLQlpbnQgcmV0OwotCXU4IHJlZ192YWx1ZTsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWI4NTAwX2ZnICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwotCi0JcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9SVEMsCi0JCQkJCQlBQjg1MDVfUlRDX1BDVVRfQ1RMX1NUQVRVU19SRUcsICAmcmVnX3ZhbHVlKTsKLQotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlYWQgQUI4NTA1X1JUQ19QQ1VUX0NUTF9TVEFUVVNfUkVHXG4iKTsKLQkJZ290byBmYWlsOwotCX0KLQotCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgKChyZWdfdmFsdWUgJiAweDEwKSA+PiA0KSk7Ci0KLWZhaWw6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgYWI4NTA1X3Bvd2VyY3V0X2RlYm91bmNlX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCQkgICAgIGNoYXIgKmJ1ZikKLXsKLQlpbnQgcmV0OwotCXU4IHJlZ192YWx1ZTsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWI4NTAwX2ZnICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwotCi0JcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9SVEMsCi0JCQkJCQlBQjg1MDVfUlRDX1BDVVRfREVCT1VOQ0VfUkVHLCAgJnJlZ192YWx1ZSk7Ci0KLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWFkIEFCODUwNV9SVENfUENVVF9ERUJPVU5DRV9SRUdcbiIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCAocmVnX3ZhbHVlICYgMHg3KSk7Ci0KLWZhaWw6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgYWI4NTA1X3Bvd2VyY3V0X2RlYm91bmNlX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCWludCByZXQ7Ci0JaW50IHJlZ192YWx1ZTsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWI4NTAwX2ZnICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwotCi0JcmVnX3ZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7Ci0JaWYgKHJlZ192YWx1ZSA+IDB4NykgewotCQlkZXZfZXJyKGRldiwgIkluY29ycmVjdCBwYXJhbWV0ZXIsIGVjaG8gMCB0byA3IGZvciBkZWJvdW5jZSBzZXR0aW5nXG4iKTsKLQkJZ290byBmYWlsOwotCX0KLQotCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfUlRDLAotCQkJCQkJQUI4NTA1X1JUQ19QQ1VUX0RFQk9VTkNFX1JFRywgKHU4KXJlZ192YWx1ZSk7Ci0KLQlpZiAocmV0IDwgMCkKLQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gc2V0IEFCODUwNV9SVENfUENVVF9ERUJPVU5DRV9SRUdcbiIpOwotCi1mYWlsOgotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3QgYWI4NTA1X3Bvd2VyY3V0X2VuYWJsZV9zdGF0dXNfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCQkJICBjaGFyICpidWYpCi17Ci0JaW50IHJldDsKLQl1OCByZWdfdmFsdWU7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFiODUwMF9mZyAqZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKLQotCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfUlRDLAotCQkJCQkJQUI4NTA1X1JUQ19QQ1VUX0NUTF9TVEFUVVNfUkVHLCAmcmVnX3ZhbHVlKTsKLQotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlYWQgQUI4NTA1X1JUQ19QQ1VUX0NUTF9TVEFUVVNfUkVHXG4iKTsKLQkJZ290byBmYWlsOwotCX0KLQotCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgKChyZWdfdmFsdWUgJiAweDIwKSA+PiA1KSk7Ci0KLWZhaWw6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGFiODUwNV9mZ19zeXNmc19wc3lfYXR0cnNbXSA9IHsKLQlfX0FUVFIocG93ZXJjdXRfZmxhZ3RpbWUsIChTX0lSVUdPIHwgU19JV1VTUiB8IFNfSVdHUlApLAotCQlhYjg1MDVfcG93ZXJjdXRfZmxhZ3RpbWVfcmVhZCwgYWI4NTA1X3Bvd2VyY3V0X2ZsYWd0aW1lX3dyaXRlKSwKLQlfX0FUVFIocG93ZXJjdXRfbWF4dGltZSwgKFNfSVJVR08gfCBTX0lXVVNSIHwgU19JV0dSUCksCi0JCWFiODUwNV9wb3dlcmN1dF9tYXh0aW1lX3JlYWQsIGFiODUwNV9wb3dlcmN1dF9tYXh0aW1lX3dyaXRlKSwKLQlfX0FUVFIocG93ZXJjdXRfcmVzdGFydF9tYXgsIChTX0lSVUdPIHwgU19JV1VTUiB8IFNfSVdHUlApLAotCQlhYjg1MDVfcG93ZXJjdXRfcmVzdGFydF9yZWFkLCBhYjg1MDVfcG93ZXJjdXRfcmVzdGFydF93cml0ZSksCi0JX19BVFRSKHBvd2VyY3V0X3RpbWVyLCBTX0lSVUdPLCBhYjg1MDVfcG93ZXJjdXRfdGltZXJfcmVhZCwgTlVMTCksCi0JX19BVFRSKHBvd2VyY3V0X3Jlc3RhcnRfY291bnRlciwgU19JUlVHTywKLQkJYWI4NTA1X3Bvd2VyY3V0X3Jlc3RhcnRfY291bnRlcl9yZWFkLCBOVUxMKSwKLQlfX0FUVFIocG93ZXJjdXRfZW5hYmxlLCAoU19JUlVHTyB8IFNfSVdVU1IgfCBTX0lXR1JQKSwKLQkJYWI4NTA1X3Bvd2VyY3V0X3JlYWQsIGFiODUwNV9wb3dlcmN1dF93cml0ZSksCi0JX19BVFRSKHBvd2VyY3V0X2ZsYWcsIFNfSVJVR08sIGFiODUwNV9wb3dlcmN1dF9mbGFnX3JlYWQsIE5VTEwpLAotCV9fQVRUUihwb3dlcmN1dF9kZWJvdW5jZV90aW1lLCAoU19JUlVHTyB8IFNfSVdVU1IgfCBTX0lXR1JQKSwKLQkJYWI4NTA1X3Bvd2VyY3V0X2RlYm91bmNlX3JlYWQsIGFiODUwNV9wb3dlcmN1dF9kZWJvdW5jZV93cml0ZSksCi0JX19BVFRSKHBvd2VyY3V0X2VuYWJsZV9zdGF0dXMsIFNfSVJVR08sCi0JCWFiODUwNV9wb3dlcmN1dF9lbmFibGVfc3RhdHVzX3JlYWQsIE5VTEwpLAotfTsKLQotc3RhdGljIGludCBhYjg1MDBfZmdfc3lzZnNfcHN5X2NyZWF0ZV9hdHRycyhzdHJ1Y3QgYWI4NTAwX2ZnICpkaSkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWlmICgoKGlzX2FiODUwNShkaS0+cGFyZW50KSB8fCBpc19hYjk1NDAoZGktPnBhcmVudCkpICYmCi0JICAgICBhYng1MDBfZ2V0X2NoaXBfaWQoZGktPmRldikgPj0gQUI4NTAwX0NVVDJQMCkKLQkgICAgfHwgaXNfYWI4NTQwKGRpLT5wYXJlbnQpKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFiODUwNV9mZ19zeXNmc19wc3lfYXR0cnMpOyBpKyspCi0JCQlpZiAoZGV2aWNlX2NyZWF0ZV9maWxlKCZkaS0+ZmdfcHN5LT5kZXYsCi0JCQkJCSAgICAgICAmYWI4NTA1X2ZnX3N5c2ZzX3BzeV9hdHRyc1tpXSkpCi0JCQkJZ290byBzeXNmc19wc3lfY3JlYXRlX2F0dHJzX2ZhaWxlZF9hYjg1MDU7Ci0JfQotCXJldHVybiAwOwotc3lzZnNfcHN5X2NyZWF0ZV9hdHRyc19mYWlsZWRfYWI4NTA1OgotCWRldl9lcnIoJmRpLT5mZ19wc3ktPmRldiwgIkZhaWxlZCBjcmVhdGluZyBzeXNmcyBwc3kgYXR0cnMgZm9yIGFiODUwNS5cbiIpOwotCXdoaWxlIChpLS0pCi0JCWRldmljZV9yZW1vdmVfZmlsZSgmZGktPmZnX3BzeS0+ZGV2LAotCQkJCSAgICZhYjg1MDVfZmdfc3lzZnNfcHN5X2F0dHJzW2ldKTsKLQotCXJldHVybiAtRUlPOwotfQotCi1zdGF0aWMgdm9pZCBhYjg1MDBfZmdfc3lzZnNfcHN5X3JlbW92ZV9hdHRycyhzdHJ1Y3QgYWI4NTAwX2ZnICpkaSkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWlmICgoKGlzX2FiODUwNShkaS0+cGFyZW50KSB8fCBpc19hYjk1NDAoZGktPnBhcmVudCkpICYmCi0JICAgICBhYng1MDBfZ2V0X2NoaXBfaWQoZGktPmRldikgPj0gQUI4NTAwX0NVVDJQMCkKLQkgICAgfHwgaXNfYWI4NTQwKGRpLT5wYXJlbnQpKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFiODUwNV9mZ19zeXNmc19wc3lfYXR0cnMpOyBpKyspCi0JCQkodm9pZClkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRpLT5mZ19wc3ktPmRldiwKLQkJCQkJCSAmYWI4NTA1X2ZnX3N5c2ZzX3BzeV9hdHRyc1tpXSk7Ci0JfQotfQotCi0vKiBFeHBvc3VyZSB0byB0aGUgc3lzZnMgaW50ZXJmYWNlIDw8RU5EPj4gKi8KLQotI2lmIGRlZmluZWQoQ09ORklHX1BNKQotc3RhdGljIGludCBhYjg1MDBfZmdfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGFiODUwMF9mZyAqZGkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCS8qCi0JICogQ2hhbmdlIHN0YXRlIGlmIHdlJ3JlIG5vdCBjaGFyZ2luZy4gSWYgd2UncmUgY2hhcmdpbmcgd2Ugd2lsbCB3YWtlCi0JICogdXAgb24gdGhlIEZHIElSUQotCSAqLwotCWlmICghZGktPmZsYWdzLmNoYXJnaW5nKSB7Ci0JCWFiODUwMF9mZ19kaXNjaGFyZ2Vfc3RhdGVfdG8oZGksIEFCODUwMF9GR19ESVNDSEFSR0VfV0FLRVVQKTsKLQkJcXVldWVfd29yayhkaS0+Zmdfd3EsICZkaS0+Zmdfd29yayk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWI4NTAwX2ZnX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQlwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0Jc3RydWN0IGFiODUwMF9mZyAqZGkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWZsdXNoX2RlbGF5ZWRfd29yaygmZGktPmZnX3BlcmlvZGljX3dvcmspOwotCWZsdXNoX3dvcmsoJmRpLT5mZ193b3JrKTsKLQlmbHVzaF93b3JrKCZkaS0+ZmdfYWNjX2N1cl93b3JrKTsKLQlmbHVzaF9kZWxheWVkX3dvcmsoJmRpLT5mZ19yZWluaXRfd29yayk7Ci0JZmx1c2hfZGVsYXllZF93b3JrKCZkaS0+ZmdfbG93X2JhdF93b3JrKTsKLQlmbHVzaF9kZWxheWVkX3dvcmsoJmRpLT5mZ19jaGVja19od19mYWlsdXJlX3dvcmspOwotCi0JLyoKLQkgKiBJZiB0aGUgRkcgaXMgZW5hYmxlZCB3ZSB3aWxsIGRpc2FibGUgaXQgYmVmb3JlIGdvaW5nIHRvIHN1c3BlbmQKLQkgKiBvbmx5IGlmIHdlJ3JlIG5vdCBjaGFyZ2luZwotCSAqLwotCWlmIChkaS0+ZmxhZ3MuZmdfZW5hYmxlZCAmJiAhZGktPmZsYWdzLmNoYXJnaW5nKQotCQlhYjg1MDBfZmdfY291bG9tYl9jb3VudGVyKGRpLCBmYWxzZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbHNlCi0jZGVmaW5lIGFiODUwMF9mZ19zdXNwZW5kICAgICAgTlVMTAotI2RlZmluZSBhYjg1MDBfZmdfcmVzdW1lICAgICAgIE5VTEwKLSNlbmRpZgotCi1zdGF0aWMgaW50IGFiODUwMF9mZ19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgYWI4NTAwX2ZnICpkaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JbGlzdF9kZWwoJmRpLT5ub2RlKTsKLQotCS8qIERpc2FibGUgY291bG9tYiBjb3VudGVyICovCi0JcmV0ID0gYWI4NTAwX2ZnX2NvdWxvbWJfY291bnRlcihkaSwgZmFsc2UpOwotCWlmIChyZXQpCi0JCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byBkaXNhYmxlIGNvdWxvbWIgY291bnRlclxuIik7Ci0KLQlkZXN0cm95X3dvcmtxdWV1ZShkaS0+Zmdfd3EpOwotCWFiODUwMF9mZ19zeXNmc19leGl0KGRpKTsKLQotCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7Ci0JYWI4NTAwX2ZnX3N5c2ZzX3BzeV9yZW1vdmVfYXR0cnMoZGkpOwotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGRpLT5mZ19wc3kpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qIGFiODUwMCBmZyBkcml2ZXIgaW50ZXJydXB0cyBhbmQgdGhlaXIgcmVzcGVjdGl2ZSBpc3IgKi8KLXN0YXRpYyBzdHJ1Y3QgYWI4NTAwX2ZnX2ludGVycnVwdHMgYWI4NTAwX2ZnX2lycV90aFtdID0gewotCXsiTkNPTlZfQUNDVSIsIGFiODUwMF9mZ19jY19jb252ZW5kX2hhbmRsZXJ9LAotCXsiQkFUVF9PVlYiLCBhYjg1MDBfZmdfYmF0dF9vdnZfaGFuZGxlcn0sCi0JeyJMT1dfQkFUX0YiLCBhYjg1MDBfZmdfbG93YmF0Zl9oYW5kbGVyfSwKLQl7IkNDX0lOVF9DQUxJQiIsIGFiODUwMF9mZ19jY19pbnRfY2FsaWJfaGFuZGxlcn0sCi19OwotCi1zdGF0aWMgc3RydWN0IGFiODUwMF9mZ19pbnRlcnJ1cHRzIGFiODUwMF9mZ19pcnFfYmhbXSA9IHsKLQl7IkNDRU9DIiwgYWI4NTAwX2ZnX2NjX2RhdGFfZW5kX2hhbmRsZXJ9LAotfTsKLQotc3RhdGljIGNoYXIgKnN1cHBseV9pbnRlcmZhY2VbXSA9IHsKLQkiYWI4NTAwX2NoYXJnYWxnIiwKLQkiYWI4NTAwX3VzYiIsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGFiODUwMF9mZ19kZXNjID0gewotCS5uYW1lCQkJPSAiYWI4NTAwX2ZnIiwKLQkudHlwZQkJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKLQkucHJvcGVydGllcwkJPSBhYjg1MDBfZmdfcHJvcHMsCi0JLm51bV9wcm9wZXJ0aWVzCQk9IEFSUkFZX1NJWkUoYWI4NTAwX2ZnX3Byb3BzKSwKLQkuZ2V0X3Byb3BlcnR5CQk9IGFiODUwMF9mZ19nZXRfcHJvcGVydHksCi0JLmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQJPSBhYjg1MDBfZmdfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCwKLX07Ci0KLXN0YXRpYyBpbnQgYWI4NTAwX2ZnX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOwotCXN0cnVjdCBhYng1MDBfYm1fZGF0YSAqcGxhdCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKLQlzdHJ1Y3QgYWI4NTAwX2ZnICpkaTsKLQlpbnQgaSwgaXJxOwotCWludCByZXQgPSAwOwotCi0JZGkgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpkaSksIEdGUF9LRVJORUwpOwotCWlmICghZGkpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXMgbm8gbWVtIGZvciBhYjg1MDBfZmdcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JaWYgKCFwbGF0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIGJhdHRlcnkgbWFuYWdlbWVudCBkYXRhIHN1cHBsaWVkXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWRpLT5ibSA9IHBsYXQ7Ci0KLQlpZiAobnApIHsKLQkJcmV0ID0gYWI4NTAwX2JtX29mX3Byb2JlKCZwZGV2LT5kZXYsIG5wLCBkaS0+Ym0pOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGJhdHRlcnkgaW5mb3JtYXRpb25cbiIpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCW11dGV4X2luaXQoJmRpLT5jY19sb2NrKTsKLQotCS8qIGdldCBwYXJlbnQgZGF0YSAqLwotCWRpLT5kZXYgPSAmcGRldi0+ZGV2OwotCWRpLT5wYXJlbnQgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7Ci0JZGktPmdwYWRjID0gYWI4NTAwX2dwYWRjX2dldCgiYWI4NTAwLWdwYWRjLjAiKTsKLQotCXBzeV9jZmcuc3VwcGxpZWRfdG8gPSBzdXBwbHlfaW50ZXJmYWNlOwotCXBzeV9jZmcubnVtX3N1cHBsaWNhbnRzID0gQVJSQVlfU0laRShzdXBwbHlfaW50ZXJmYWNlKTsKLQlwc3lfY2ZnLmRydl9kYXRhID0gZGk7Ci0KLQlkaS0+YmF0X2NhcC5tYXhfbWFoX2Rlc2lnbiA9IE1JTExJX1RPX01JQ1JPICoKLQkJZGktPmJtLT5iYXRfdHlwZVtkaS0+Ym0tPmJhdHRfaWRdLmNoYXJnZV9mdWxsX2Rlc2lnbjsKLQotCWRpLT5iYXRfY2FwLm1heF9tYWggPSBkaS0+YmF0X2NhcC5tYXhfbWFoX2Rlc2lnbjsKLQotCWRpLT52YmF0X25vbSA9IGRpLT5ibS0+YmF0X3R5cGVbZGktPmJtLT5iYXR0X2lkXS5ub21pbmFsX3ZvbHRhZ2U7Ci0KLQlkaS0+aW5pdF9jYXBhY2l0eSA9IHRydWU7Ci0KLQlhYjg1MDBfZmdfY2hhcmdlX3N0YXRlX3RvKGRpLCBBQjg1MDBfRkdfQ0hBUkdFX0lOSVQpOwotCWFiODUwMF9mZ19kaXNjaGFyZ2Vfc3RhdGVfdG8oZGksIEFCODUwMF9GR19ESVNDSEFSR0VfSU5JVCk7Ci0KLQkvKiBDcmVhdGUgYSB3b3JrIHF1ZXVlIGZvciBydW5uaW5nIHRoZSBGRyBhbGdvcml0aG0gKi8KLQlkaS0+Zmdfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiYWI4NTAwX2ZnX3dxIik7Ci0JaWYgKGRpLT5mZ193cSA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byBjcmVhdGUgd29yayBxdWV1ZVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCS8qIEluaXQgd29yayBmb3IgcnVubmluZyB0aGUgZmcgYWxnb3JpdGhtIGluc3RhbnRseSAqLwotCUlOSVRfV09SSygmZGktPmZnX3dvcmssIGFiODUwMF9mZ19pbnN0YW50X3dvcmspOwotCi0JLyogSW5pdCB3b3JrIGZvciBnZXR0aW5nIHRoZSBiYXR0ZXJ5IGFjY3VtdWxhdGVkIGN1cnJlbnQgKi8KLQlJTklUX1dPUksoJmRpLT5mZ19hY2NfY3VyX3dvcmssIGFiODUwMF9mZ19hY2NfY3VyX3dvcmspOwotCi0JLyogSW5pdCB3b3JrIGZvciByZWluaXRpYWxpc2luZyB0aGUgZmcgYWxnb3JpdGhtICovCi0JSU5JVF9ERUZFUlJBQkxFX1dPUksoJmRpLT5mZ19yZWluaXRfd29yaywKLQkJYWI4NTAwX2ZnX3JlaW5pdF93b3JrKTsKLQotCS8qIFdvcmsgZGVsYXllZCBRdWV1ZSB0byBydW4gdGhlIHN0YXRlIG1hY2hpbmUgKi8KLQlJTklUX0RFRkVSUkFCTEVfV09SSygmZGktPmZnX3BlcmlvZGljX3dvcmssCi0JCWFiODUwMF9mZ19wZXJpb2RpY193b3JrKTsKLQotCS8qIFdvcmsgdG8gY2hlY2sgbG93IGJhdHRlcnkgY29uZGl0aW9uICovCi0JSU5JVF9ERUZFUlJBQkxFX1dPUksoJmRpLT5mZ19sb3dfYmF0X3dvcmssCi0JCWFiODUwMF9mZ19sb3dfYmF0X3dvcmspOwotCi0JLyogSW5pdCB3b3JrIGZvciBIVyBmYWlsdXJlIGNoZWNrICovCi0JSU5JVF9ERUZFUlJBQkxFX1dPUksoJmRpLT5mZ19jaGVja19od19mYWlsdXJlX3dvcmssCi0JCWFiODUwMF9mZ19jaGVja19od19mYWlsdXJlX3dvcmspOwotCi0JLyogUmVzZXQgYmF0dGVyeSBsb3cgdm9sdGFnZSBmbGFnICovCi0JZGktPmZsYWdzLmxvd19iYXQgPSBmYWxzZTsKLQotCS8qIEluaXRpYWxpemUgbG93IGJhdHRlcnkgY291bnRlciAqLwotCWRpLT5sb3dfYmF0X2NudCA9IDEwOwotCi0JLyogSW5pdGlhbGl6ZSBPVlYsIGFuZCBvdGhlciByZWdpc3RlcnMgKi8KLQlyZXQgPSBhYjg1MDBfZmdfaW5pdF9od19yZWdpc3RlcnMoZGkpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgcmVnaXN0ZXJzXG4iKTsKLQkJZ290byBmcmVlX2luc3RfY3Vycl93cTsKLQl9Ci0KLQkvKiBDb25zaWRlciBiYXR0ZXJ5IHVua25vd24gdW50aWwgd2UncmUgaW5mb3JtZWQgb3RoZXJ3aXNlICovCi0JZGktPmZsYWdzLmJhdHRfdW5rbm93biA9IHRydWU7Ci0JZGktPmZsYWdzLmJhdHRfaWRfcmVjZWl2ZWQgPSBmYWxzZTsKLQotCS8qIFJlZ2lzdGVyIEZHIHBvd2VyIHN1cHBseSBjbGFzcyAqLwotCWRpLT5mZ19wc3kgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoZGktPmRldiwgJmFiODUwMF9mZ19kZXNjLCAmcHN5X2NmZyk7Ci0JaWYgKElTX0VSUihkaS0+ZmdfcHN5KSkgewotCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgRkcgcHN5XG4iKTsKLQkJcmV0ID0gUFRSX0VSUihkaS0+ZmdfcHN5KTsKLQkJZ290byBmcmVlX2luc3RfY3Vycl93cTsKLQl9Ci0KLQlkaS0+Zmdfc2FtcGxlcyA9IFNFQ19UT19TQU1QTEUoZGktPmJtLT5mZ19wYXJhbXMtPmluaXRfdGltZXIpOwotCWFiODUwMF9mZ19jb3Vsb21iX2NvdW50ZXIoZGksIHRydWUpOwotCi0JLyoKLQkgKiBJbml0aWFsaXplIGNvbXBsZXRpb24gdXNlZCB0byBub3RpZnkgY29tcGxldGlvbiBhbmQgc3RhcnQKLQkgKiBvZiBpbnN0IGN1cnJlbnQKLQkgKi8KLQlpbml0X2NvbXBsZXRpb24oJmRpLT5hYjg1MDBfZmdfc3RhcnRlZCk7Ci0JaW5pdF9jb21wbGV0aW9uKCZkaS0+YWI4NTAwX2ZnX2NvbXBsZXRlKTsKLQotCS8qIFJlZ2lzdGVyIHByaW1hcnkgaW50ZXJydXB0IGhhbmRsZXJzICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWI4NTAwX2ZnX2lycV90aCk7IGkrKykgewotCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCBhYjg1MDBfZmdfaXJxX3RoW2ldLm5hbWUpOwotCQlyZXQgPSByZXF1ZXN0X2lycShpcnEsIGFiODUwMF9mZ19pcnFfdGhbaV0uaXNyLAotCQkJCSAgSVJRRl9TSEFSRUQgfCBJUlFGX05PX1NVU1BFTkQsCi0JCQkJICBhYjg1MDBfZmdfaXJxX3RoW2ldLm5hbWUsIGRpKTsKLQotCQlpZiAocmV0ICE9IDApIHsKLQkJCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byByZXF1ZXN0ICVzIElSUSAlZDogJWRcbiIsCi0JCQkJYWI4NTAwX2ZnX2lycV90aFtpXS5uYW1lLCBpcnEsIHJldCk7Ci0JCQlnb3RvIGZyZWVfaXJxOwotCQl9Ci0JCWRldl9kYmcoZGktPmRldiwgIlJlcXVlc3RlZCAlcyBJUlEgJWQ6ICVkXG4iLAotCQkJYWI4NTAwX2ZnX2lycV90aFtpXS5uYW1lLCBpcnEsIHJldCk7Ci0JfQotCi0JLyogUmVnaXN0ZXIgdGhyZWFkZWQgaW50ZXJydXB0IGhhbmRsZXIgKi8KLQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCBhYjg1MDBfZmdfaXJxX2JoWzBdLm5hbWUpOwotCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGlycSwgTlVMTCwgYWI4NTAwX2ZnX2lycV9iaFswXS5pc3IsCi0JCQkJSVJRRl9TSEFSRUQgfCBJUlFGX05PX1NVU1BFTkQgfCBJUlFGX09ORVNIT1QsCi0JCQlhYjg1MDBfZmdfaXJxX2JoWzBdLm5hbWUsIGRpKTsKLQotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCAlcyBJUlEgJWQ6ICVkXG4iLAotCQkJYWI4NTAwX2ZnX2lycV9iaFswXS5uYW1lLCBpcnEsIHJldCk7Ci0JCWdvdG8gZnJlZV9pcnE7Ci0JfQotCWRldl9kYmcoZGktPmRldiwgIlJlcXVlc3RlZCAlcyBJUlEgJWQ6ICVkXG4iLAotCQlhYjg1MDBfZmdfaXJxX2JoWzBdLm5hbWUsIGlycSwgcmV0KTsKLQotCWRpLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAiQ0NFT0MiKTsKLQlkaXNhYmxlX2lycShkaS0+aXJxKTsKLQlkaS0+bmJyX2NjZW9jX2lycV9jbnQgPSAwOwotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGkpOwotCi0JcmV0ID0gYWI4NTAwX2ZnX3N5c2ZzX2luaXQoZGkpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBlbnRyeVxuIik7Ci0JCWdvdG8gZnJlZV9pcnE7Ci0JfQotCi0JcmV0ID0gYWI4NTAwX2ZnX3N5c2ZzX3BzeV9jcmVhdGVfYXR0cnMoZGkpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBGRyBwc3lcbiIpOwotCQlhYjg1MDBfZmdfc3lzZnNfZXhpdChkaSk7Ci0JCWdvdG8gZnJlZV9pcnE7Ci0JfQotCi0JLyogQ2FsaWJyYXRlIHRoZSBmZyBmaXJzdCB0aW1lICovCi0JZGktPmZsYWdzLmNhbGlicmF0ZSA9IHRydWU7Ci0JZGktPmNhbGliX3N0YXRlID0gQUI4NTAwX0ZHX0NBTElCX0lOSVQ7Ci0KLQkvKiBVc2Ugcm9vbSB0ZW1wIGFzIGRlZmF1bHQgdmFsdWUgdW50aWwgd2UgZ2V0IGFuIHVwZGF0ZSBmcm9tIGRyaXZlci4gKi8KLQlkaS0+YmF0X3RlbXAgPSAyMTA7Ci0KLQkvKiBSdW4gdGhlIEZHIGFsZ29yaXRobSAqLwotCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Zmdfd3EsICZkaS0+ZmdfcGVyaW9kaWNfd29yaywgMCk7Ci0KLQlsaXN0X2FkZF90YWlsKCZkaS0+bm9kZSwgJmFiODUwMF9mZ19saXN0KTsKLQotCXJldHVybiByZXQ7Ci0KLWZyZWVfaXJxOgotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGRpLT5mZ19wc3kpOwotCi0JLyogV2UgYWxzbyBoYXZlIHRvIGZyZWUgYWxsIHJlZ2lzdGVyZWQgaXJxcyAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFiODUwMF9mZ19pcnFfdGgpOyBpKyspIHsKLQkJaXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgYWI4NTAwX2ZnX2lycV90aFtpXS5uYW1lKTsKLQkJZnJlZV9pcnEoaXJxLCBkaSk7Ci0JfQotCWlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsIGFiODUwMF9mZ19pcnFfYmhbMF0ubmFtZSk7Ci0JZnJlZV9pcnEoaXJxLCBkaSk7Ci1mcmVlX2luc3RfY3Vycl93cToKLQlkZXN0cm95X3dvcmtxdWV1ZShkaS0+Zmdfd3EpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFiODUwMF9mZ19tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAic3Rlcmljc3NvbixhYjg1MDAtZmciLCB9LAotCXsgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFiODUwMF9mZ19kcml2ZXIgPSB7Ci0JLnByb2JlID0gYWI4NTAwX2ZnX3Byb2JlLAotCS5yZW1vdmUgPSBhYjg1MDBfZmdfcmVtb3ZlLAotCS5zdXNwZW5kID0gYWI4NTAwX2ZnX3N1c3BlbmQsCi0JLnJlc3VtZSA9IGFiODUwMF9mZ19yZXN1bWUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAiYWI4NTAwLWZnIiwKLQkJLm9mX21hdGNoX3RhYmxlID0gYWI4NTAwX2ZnX21hdGNoLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBhYjg1MDBfZmdfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFiODUwMF9mZ19kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYWI4NTAwX2ZnX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYWI4NTAwX2ZnX2RyaXZlcik7Ci19Ci0KLXN1YnN5c19pbml0Y2FsbF9zeW5jKGFiODUwMF9mZ19pbml0KTsKLW1vZHVsZV9leGl0KGFiODUwMF9mZ19leGl0KTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotTU9EVUxFX0FVVEhPUigiSm9oYW4gUGFsc3NvbiwgS2FybCBLb21pZXJvd3NraSIpOwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTphYjg1MDAtZmciKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQUI4NTAwIEZ1ZWwgR2F1Z2UgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2FieDUwMF9jaGFyZ2FsZy5jIGIvZHJpdmVycy9wb3dlci9hYng1MDBfY2hhcmdhbGcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkxMDRiMS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3Bvd2VyL2FieDUwMF9jaGFyZ2FsZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBTVC1Fcmljc3NvbiBTQSAyMDEyCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgU29ueSBNb2JpbGUgQ29tbXVuaWNhdGlvbnMgQUIKLSAqCi0gKiBDaGFyZ2luZyBhbGdvcml0aG0gZHJpdmVyIGZvciBhYng1MDAgdmFyaWFudHMKLSAqCi0gKiBMaWNlbnNlIFRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2MgotICogQXV0aG9yczoKLSAqCUpvaGFuIFBhbHNzb24gPGpvaGFuLnBhbHNzb25Ac3Rlcmljc3Nvbi5jb20+Ci0gKglLYXJsIEtvbWllcm93c2tpIDxrYXJsLmtvbWllcm93c2tpQHN0ZXJpY3Nzb24uY29tPgotICoJQXJ1biBSIE11cnRoeSA8YXJ1bi5tdXJ0aHlAc3Rlcmljc3Nvbi5jb20+Ci0gKglBdXRob3I6IEltcmUgU3VueWkgPGltcmUuc3VueWlAc29ueW1vYmlsZS5jb20+Ci0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL2FieDUwMC5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9hYng1MDAvYWI4NTAwLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL2FieDUwMC91eDUwMF9jaGFyZ2FsZy5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9hYng1MDAvYWI4NTAwLWJtLmg+Ci0jaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KLQotLyogV2F0Y2hkb2cga2ljayBpbnRlcnZhbCAqLwotI2RlZmluZSBDSEdfV0RfSU5URVJWQUwJCQkoNiAqIEhaKQotCi0vKiBFbmQtb2YtY2hhcmdlIGNyaXRlcmlhIGNvdW50ZXIgKi8KLSNkZWZpbmUgRU9DX0NPTkRfQ05UCQkJMTAKLQotLyogT25lIGhvdXIgZXhwcmVzc2VkIGluIHNlY29uZHMgKi8KLSNkZWZpbmUgT05FX0hPVVJfSU5fU0VDT05EUyAgICAgICAgICAgIDM2MDAKLQotLyogRml2ZSBtaW51dGVzIGV4cHJlc3NlZCBpbiBzZWNvbmRzICovCi0jZGVmaW5lIEZJVkVfTUlOVVRFU19JTl9TRUNPTkRTICAgICAgICAzMDAKLQotLyogUGx1cyBtYXJnaW4gZm9yIHRoZSBsb3cgYmF0dGVyeSB0aHJlc2hvbGQgKi8KLSNkZWZpbmUgQkFUX1BMVVNfTUFSR0lOICAgICAgICAgICAgICAgICgxMDApCi0KLSNkZWZpbmUgQ0hBUkdBTEdfQ1VSUl9TVEVQX0xPVwkJMAotI2RlZmluZSBDSEFSR0FMR19DVVJSX1NURVBfSElHSAkxMDAKLQotZW51bSBhYng1MDBfY2hhcmdlcnMgewotCU5PX0NIRywKLQlBQ19DSEcsCi0JVVNCX0NIRywKLX07Ci0KLXN0cnVjdCBhYng1MDBfY2hhcmdhbGdfY2hhcmdlcl9pbmZvIHsKLQllbnVtIGFieDUwMF9jaGFyZ2VycyBjb25uX2NoZzsKLQllbnVtIGFieDUwMF9jaGFyZ2VycyBwcmV2X2Nvbm5fY2hnOwotCWVudW0gYWJ4NTAwX2NoYXJnZXJzIG9ubGluZV9jaGc7Ci0JZW51bSBhYng1MDBfY2hhcmdlcnMgcHJldl9vbmxpbmVfY2hnOwotCWVudW0gYWJ4NTAwX2NoYXJnZXJzIGNoYXJnZXJfdHlwZTsKLQlib29sIHVzYl9jaGdfb2s7Ci0JYm9vbCBhY19jaGdfb2s7Ci0JaW50IHVzYl92b2x0OwotCWludCB1c2JfY3VycjsKLQlpbnQgYWNfdm9sdDsKLQlpbnQgYWNfY3VycjsKLQlpbnQgdXNiX3ZzZXQ7Ci0JaW50IHVzYl9pc2V0OwotCWludCBhY192c2V0OwotCWludCBhY19pc2V0OwotfTsKLQotc3RydWN0IGFieDUwMF9jaGFyZ2FsZ19zdXNwZW5zaW9uX3N0YXR1cyB7Ci0JYm9vbCBzdXNwZW5kZWRfY2hhbmdlOwotCWJvb2wgYWNfc3VzcGVuZGVkOwotCWJvb2wgdXNiX3N1c3BlbmRlZDsKLX07Ci0KLXN0cnVjdCBhYng1MDBfY2hhcmdhbGdfY3VycmVudF9zdGVwX3N0YXR1cyB7Ci0JYm9vbCBjdXJyX3N0ZXBfY2hhbmdlOwotCWludCBjdXJyX3N0ZXA7Ci19OwotCi1zdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnX2JhdHRlcnlfZGF0YSB7Ci0JaW50IHRlbXA7Ci0JaW50IHZvbHQ7Ci0JaW50IGF2Z19jdXJyOwotCWludCBpbnN0X2N1cnI7Ci0JaW50IHBlcmNlbnQ7Ci19OwotCi1lbnVtIGFieDUwMF9jaGFyZ2FsZ19zdGF0ZXMgewotCVNUQVRFX0hBTkRIRUxEX0lOSVQsCi0JU1RBVEVfSEFOREhFTEQsCi0JU1RBVEVfQ0hHX05PVF9PS19JTklULAotCVNUQVRFX0NIR19OT1RfT0ssCi0JU1RBVEVfSFdfVEVNUF9QUk9URUNUX0lOSVQsCi0JU1RBVEVfSFdfVEVNUF9QUk9URUNULAotCVNUQVRFX05PUk1BTF9JTklULAotCVNUQVRFX1VTQl9QUF9QUkVfQ0hBUkdFLAotCVNUQVRFX05PUk1BTCwKLQlTVEFURV9XQUlUX0ZPUl9SRUNIQVJHRV9JTklULAotCVNUQVRFX1dBSVRfRk9SX1JFQ0hBUkdFLAotCVNUQVRFX01BSU5URU5BTkNFX0FfSU5JVCwKLQlTVEFURV9NQUlOVEVOQU5DRV9BLAotCVNUQVRFX01BSU5URU5BTkNFX0JfSU5JVCwKLQlTVEFURV9NQUlOVEVOQU5DRV9CLAotCVNUQVRFX1RFTVBfVU5ERVJPVkVSX0lOSVQsCi0JU1RBVEVfVEVNUF9VTkRFUk9WRVIsCi0JU1RBVEVfVEVNUF9MT1dISUdIX0lOSVQsCi0JU1RBVEVfVEVNUF9MT1dISUdILAotCVNUQVRFX1NVU1BFTkRFRF9JTklULAotCVNUQVRFX1NVU1BFTkRFRCwKLQlTVEFURV9PVlZfUFJPVEVDVF9JTklULAotCVNUQVRFX09WVl9QUk9URUNULAotCVNUQVRFX1NBRkVUWV9USU1FUl9FWFBJUkVEX0lOSVQsCi0JU1RBVEVfU0FGRVRZX1RJTUVSX0VYUElSRUQsCi0JU1RBVEVfQkFUVF9SRU1PVkVEX0lOSVQsCi0JU1RBVEVfQkFUVF9SRU1PVkVELAotCVNUQVRFX1dEX0VYUElSRURfSU5JVCwKLQlTVEFURV9XRF9FWFBJUkVELAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKnN0YXRlc1tdID0gewotCSJIQU5ESEVMRF9JTklUIiwKLQkiSEFOREhFTEQiLAotCSJDSEdfTk9UX09LX0lOSVQiLAotCSJDSEdfTk9UX09LIiwKLQkiSFdfVEVNUF9QUk9URUNUX0lOSVQiLAotCSJIV19URU1QX1BST1RFQ1QiLAotCSJOT1JNQUxfSU5JVCIsCi0JIlVTQl9QUF9QUkVfQ0hBUkdFIiwKLQkiTk9STUFMIiwKLQkiV0FJVF9GT1JfUkVDSEFSR0VfSU5JVCIsCi0JIldBSVRfRk9SX1JFQ0hBUkdFIiwKLQkiTUFJTlRFTkFOQ0VfQV9JTklUIiwKLQkiTUFJTlRFTkFOQ0VfQSIsCi0JIk1BSU5URU5BTkNFX0JfSU5JVCIsCi0JIk1BSU5URU5BTkNFX0IiLAotCSJURU1QX1VOREVST1ZFUl9JTklUIiwKLQkiVEVNUF9VTkRFUk9WRVIiLAotCSJURU1QX0xPV0hJR0hfSU5JVCIsCi0JIlRFTVBfTE9XSElHSCIsCi0JIlNVU1BFTkRFRF9JTklUIiwKLQkiU1VTUEVOREVEIiwKLQkiT1ZWX1BST1RFQ1RfSU5JVCIsCi0JIk9WVl9QUk9URUNUIiwKLQkiU0FGRVRZX1RJTUVSX0VYUElSRURfSU5JVCIsCi0JIlNBRkVUWV9USU1FUl9FWFBJUkVEIiwKLQkiQkFUVF9SRU1PVkVEX0lOSVQiLAotCSJCQVRUX1JFTU9WRUQiLAotCSJXRF9FWFBJUkVEX0lOSVQiLAotCSJXRF9FWFBJUkVEIiwKLX07Ci0KLXN0cnVjdCBhYng1MDBfY2hhcmdhbGdfZXZlbnRzIHsKLQlib29sIGJhdHRfdW5rbm93bjsKLQlib29sIG1haW5leHRjaG5vdG9rOwotCWJvb2wgYmF0dF9vdnY7Ci0JYm9vbCBiYXR0X3JlbTsKLQlib29sIGJ0ZW1wX3VuZGVyb3ZlcjsKLQlib29sIGJ0ZW1wX2xvd2hpZ2g7Ci0JYm9vbCBtYWluX3RoZXJtYWxfcHJvdDsKLQlib29sIHVzYl90aGVybWFsX3Byb3Q7Ci0JYm9vbCBtYWluX292djsKLQlib29sIHZidXNfb3Z2OwotCWJvb2wgdXNiY2hhcmdlcm5vdG9rOwotCWJvb2wgc2FmZXR5X3RpbWVyX2V4cGlyZWQ7Ci0JYm9vbCBtYWludGVuYW5jZV90aW1lcl9leHBpcmVkOwotCWJvb2wgYWNfd2RfZXhwaXJlZDsKLQlib29sIHVzYl93ZF9leHBpcmVkOwotCWJvb2wgYWNfY3ZfYWN0aXZlOwotCWJvb2wgdXNiX2N2X2FjdGl2ZTsKLQlib29sIHZidXNfY29sbGFwc2VkOwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgYWJ4NTAwX2NoYXJnZV9jdXJyX21heGltaXphdGlvbiAtIENoYXJnZXIgbWF4aW1pemF0aW9uIHBhcmFtZXRlcnMKLSAqIEBvcmlnaW5hbF9pc2V0Ogl0aGUgbm9uIG9wdGltaXplZC9tYXhpbWlzZWQgY2hhcmdlciBjdXJyZW50Ci0gKiBAY3VycmVudF9pc2V0Ogl0aGUgY2hhcmdpbmcgY3VycmVudCB1c2VkIGF0IHRoaXMgbW9tZW50Ci0gKiBAdGVzdF9kZWx0YV9pOgl0aGUgZGVsdGEgYmV0d2VlbiB0aGUgY3VycmVudCB3ZSB3YW50IHRvIGNoYXJnZSBhbmQgdGhlCi0JCQljdXJyZW50IHRoYXQgaXMgcmVhbGx5IGdvaW5nIGludG8gdGhlIGJhdHRlcnkKLSAqIEBjb25kaXRpb25fY250OgludW1iZXIgb2YgaXRlcmF0aW9ucyBuZWVkZWQgYmVmb3JlIGEgbmV3IGNoYXJnZXIgY3VycmVudAotCQkJaXMgc2V0Ci0gKiBAbWF4X2N1cnJlbnQ6CW1heGltdW0gY2hhcmdlciBjdXJyZW50Ci0gKiBAd2FpdF9jbnQ6CQl0byBhdm9pZCB0b28gZmFzdCBjdXJyZW50IHN0ZXAgZG93biBpbiBjYXNlIG9mIGNoYXJnZXIKLSAqCQkJdm9sdGFnZSBjb2xsYXBzZSwgd2UgaW5zZXJ0IHRoaXMgZGVsYXkgYmV0d2VlbiBzdGVwCi0gKgkJCWRvd24KLSAqIEBsZXZlbDoJCXRlbGxzIGluIGhvdyBtYW55IHN0ZXBzIHRoZSBjaGFyZ2luZyBjdXJyZW50IGhhcyBiZWVuCi0JCQlpbmNyZWFzZWQKLSAqLwotc3RydWN0IGFieDUwMF9jaGFyZ2VfY3Vycl9tYXhpbWl6YXRpb24gewotCWludCBvcmlnaW5hbF9pc2V0OwotCWludCBjdXJyZW50X2lzZXQ7Ci0JaW50IHRlc3RfZGVsdGFfaTsKLQlpbnQgY29uZGl0aW9uX2NudDsKLQlpbnQgbWF4X2N1cnJlbnQ7Ci0JaW50IHdhaXRfY250OwotCXU4IGxldmVsOwotfTsKLQotZW51bSBtYXhpbV9yZXQgewotCU1BWElNX1JFVF9OT0FDVElPTiwKLQlNQVhJTV9SRVRfQ0hBTkdFLAotCU1BWElNX1JFVF9JQkFUX1RPT19ISUdILAotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnIC0gYWJ4NTAwIENoYXJnaW5nIGFsZ29yaXRobSBkZXZpY2UgaW5mb3JtYXRpb24KLSAqIEBkZXY6CQlwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgZGV2aWNlCi0gKiBAY2hhcmdlX3N0YXR1czoJYmF0dGVyeSBvcGVyYXRpbmcgc3RhdHVzCi0gKiBAZW9jX2NudDoJCWNvdW50ZXIgdXNlZCB0byBkZXRlcm1pbmUgZW5kLW9mX2NoYXJnZQotICogQG1haW50ZW5hbmNlX2NoZzoJaW5kaWNhdGUgaWYgbWFpbnRlbmFuY2UgY2hhcmdlIGlzIGFjdGl2ZQotICogQHRfaHlzdF9ub3JtCQl0ZW1wZXJhdHVyZSBoeXN0ZXJlc2lzIHdoZW4gdGhlIHRlbXBlcmF0dXJlIGhhcyBiZWVuCi0gKgkJCW92ZXIgb3IgdW5kZXIgbm9ybWFsIGxpbWl0cwotICogQHRfaHlzdF9sb3doaWdoCXRlbXBlcmF0dXJlIGh5c3RlcmVzaXMgd2hlbiB0aGUgdGVtcGVyYXR1cmUgaGFzIGJlZW4KLSAqCQkJb3ZlciBvciB1bmRlciB0aGUgaGlnaCBvciBsb3cgbGltaXRzCi0gKiBAY2hhcmdlX3N0YXRlOgljdXJyZW50IHN0YXRlIG9mIHRoZSBjaGFyZ2luZyBhbGdvcml0aG0KLSAqIEBjY20JCQljaGFyZ2luZyBjdXJyZW50IG1heGltaXphdGlvbiBwYXJhbWV0ZXJzCi0gKiBAY2hnX2luZm86CQlpbmZvcm1hdGlvbiBhYm91dCBjb25uZWN0ZWQgY2hhcmdlciB0eXBlcwotICogQGJhdHRfZGF0YToJCWRhdGEgb2YgdGhlIGJhdHRlcnkKLSAqIEBzdXNwX3N0YXR1czoJY3VycmVudCBjaGFyZ2VyIHN1c3BlbnNpb24gc3RhdHVzCi0gKiBAYm06ICAgICAgICAgICAJUGxhdGZvcm0gc3BlY2lmaWMgYmF0dGVyeSBtYW5hZ2VtZW50IGluZm9ybWF0aW9uCi0gKiBAY3Vycl9zdGF0dXM6CUN1cnJlbnQgc3RlcCBzdGF0dXMgZm9yIG92ZXItY3VycmVudCBwcm90ZWN0aW9uCi0gKiBAcGFyZW50OgkJcG9pbnRlciB0byB0aGUgc3RydWN0IGFieDUwMAotICogQGNoYXJnYWxnX3BzeToJc3RydWN0dXJlIHRoYXQgaG9sZHMgdGhlIGJhdHRlcnkgcHJvcGVydGllcyBleHBvc2VkIGJ5Ci0gKgkJCXRoZSBjaGFyZ2luZyBhbGdvcml0aG0KLSAqIEBldmVudHM6CQlzdHJ1Y3R1cmUgZm9yIGluZm9ybWF0aW9uIGFib3V0IGV2ZW50cyB0cmlnZ2VyZWQKLSAqIEBjaGFyZ2FsZ193cToJCXdvcmsgcXVldWUgZm9yIHJ1bm5pbmcgdGhlIGNoYXJnaW5nIGFsZ29yaXRobQotICogQGNoYXJnYWxnX3BlcmlvZGljX3dvcms6CXdvcmsgdG8gcnVuIHRoZSBjaGFyZ2luZyBhbGdvcml0aG0gcGVyaW9kaWNhbGx5Ci0gKiBAY2hhcmdhbGdfd2Rfd29yazoJCXdvcmsgdG8ga2ljayB0aGUgY2hhcmdlciB3YXRjaGRvZyBwZXJpb2RpY2FsbHkKLSAqIEBjaGFyZ2FsZ193b3JrOgkJd29yayB0byBydW4gdGhlIGNoYXJnaW5nIGFsZ29yaXRobSBpbnN0YW50bHkKLSAqIEBzYWZldHlfdGltZXI6CQljaGFyZ2luZyBzYWZldHkgdGltZXIKLSAqIEBtYWludGVuYW5jZV90aW1lcjoJCW1haW50ZW5hbmNlIGNoYXJnaW5nIHRpbWVyCi0gKiBAY2hhcmdhbGdfa29iamVjdDoJCXN0cnVjdHVyZSBvZiB0eXBlIGtvYmplY3QKLSAqLwotc3RydWN0IGFieDUwMF9jaGFyZ2FsZyB7Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCWludCBjaGFyZ2Vfc3RhdHVzOwotCWludCBlb2NfY250OwotCWJvb2wgbWFpbnRlbmFuY2VfY2hnOwotCWludCB0X2h5c3Rfbm9ybTsKLQlpbnQgdF9oeXN0X2xvd2hpZ2g7Ci0JZW51bSBhYng1MDBfY2hhcmdhbGdfc3RhdGVzIGNoYXJnZV9zdGF0ZTsKLQlzdHJ1Y3QgYWJ4NTAwX2NoYXJnZV9jdXJyX21heGltaXphdGlvbiBjY207Ci0Jc3RydWN0IGFieDUwMF9jaGFyZ2FsZ19jaGFyZ2VyX2luZm8gY2hnX2luZm87Ci0Jc3RydWN0IGFieDUwMF9jaGFyZ2FsZ19iYXR0ZXJ5X2RhdGEgYmF0dF9kYXRhOwotCXN0cnVjdCBhYng1MDBfY2hhcmdhbGdfc3VzcGVuc2lvbl9zdGF0dXMgc3VzcF9zdGF0dXM7Ci0Jc3RydWN0IGFiODUwMCAqcGFyZW50OwotCXN0cnVjdCBhYng1MDBfY2hhcmdhbGdfY3VycmVudF9zdGVwX3N0YXR1cyBjdXJyX3N0YXR1czsKLQlzdHJ1Y3QgYWJ4NTAwX2JtX2RhdGEgKmJtOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmNoYXJnYWxnX3BzeTsKLQlzdHJ1Y3QgdXg1MDBfY2hhcmdlciAqYWNfY2hnOwotCXN0cnVjdCB1eDUwMF9jaGFyZ2VyICp1c2JfY2hnOwotCXN0cnVjdCBhYng1MDBfY2hhcmdhbGdfZXZlbnRzIGV2ZW50czsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqY2hhcmdhbGdfd3E7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBjaGFyZ2FsZ19wZXJpb2RpY193b3JrOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgY2hhcmdhbGdfd2Rfd29yazsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY2hhcmdhbGdfd29yazsKLQlzdHJ1Y3QgaHJ0aW1lciBzYWZldHlfdGltZXI7Ci0Jc3RydWN0IGhydGltZXIgbWFpbnRlbmFuY2VfdGltZXI7Ci0Jc3RydWN0IGtvYmplY3QgY2hhcmdhbGdfa29iamVjdDsKLX07Ci0KLS8qRXh0ZXJuYWwgY2hhcmdlciBwcmVwYXJlIG5vdGlmaWVyKi8KLUJMT0NLSU5HX05PVElGSUVSX0hFQUQoY2hhcmdlcl9ub3RpZmllcl9saXN0KTsKLQotLyogTWFpbiBiYXR0ZXJ5IHByb3BlcnRpZXMgKi8KLXN0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBhYng1MDBfY2hhcmdhbGdfcHJvcHNbXSA9IHsKLQlQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMsCi0JUE9XRVJfU1VQUExZX1BST1BfSEVBTFRILAotfTsKLQotc3RydWN0IGFieDUwMF9jaGFyZ2FsZ19zeXNmc19lbnRyeSB7Ci0Jc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwotCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICosIGNoYXIgKik7Ci0Jc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKLX07Ci0KLS8qKgotICogYWJ4NTAwX2NoYXJnYWxnX3NhZmV0eV90aW1lcl9leHBpcmVkKCkgLSBFeHBpcmF0aW9uIG9mIHRoZSBzYWZldHkgdGltZXIKLSAqIEB0aW1lcjogICAgIHBvaW50ZXIgdG8gdGhlIGhydGltZXIgc3RydWN0dXJlCi0gKgotICogVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCB3aGVuIHRoZSBzYWZldHkgdGltZXIgZm9yIHRoZSBjaGFyZ2VyCi0gKiBleHBpcmVzCi0gKi8KLXN0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydAotYWJ4NTAwX2NoYXJnYWxnX3NhZmV0eV90aW1lcl9leHBpcmVkKHN0cnVjdCBocnRpbWVyICp0aW1lcikKLXsKLQlzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSA9IGNvbnRhaW5lcl9vZih0aW1lciwgc3RydWN0IGFieDUwMF9jaGFyZ2FsZywKLQkJCQkJCSAgc2FmZXR5X3RpbWVyKTsKLQlkZXZfZXJyKGRpLT5kZXYsICJTYWZldHkgdGltZXIgZXhwaXJlZFxuIik7Ci0JZGktPmV2ZW50cy5zYWZldHlfdGltZXJfZXhwaXJlZCA9IHRydWU7Ci0KLQkvKiBUcmlnZ2VyIGV4ZWN1dGlvbiBvZiB0aGUgYWxnb3JpdGhtIGluc3RhbnRseSAqLwotCXF1ZXVlX3dvcmsoZGktPmNoYXJnYWxnX3dxLCAmZGktPmNoYXJnYWxnX3dvcmspOwotCi0JcmV0dXJuIEhSVElNRVJfTk9SRVNUQVJUOwotfQotCi0vKioKLSAqIGFieDUwMF9jaGFyZ2FsZ19tYWludGVuYW5jZV90aW1lcl9leHBpcmVkKCkgLSBFeHBpcmF0aW9uIG9mCi0gKiB0aGUgbWFpbnRlbmFuY2UgdGltZXIKLSAqIEB0aW1lcjogICAgIHBvaW50ZXIgdG8gdGhlIHRpbWVyIHN0cnVjdHVyZQotICoKLSAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgd2hlbiB0aGUgbWFpbnRlbmVuY2UgdGltZXIKLSAqIGV4cGlyZXMKLSAqLwotc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0Ci1hYng1MDBfY2hhcmdhbGdfbWFpbnRlbmFuY2VfdGltZXJfZXhwaXJlZChzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCi17Ci0KLQlzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSA9IGNvbnRhaW5lcl9vZih0aW1lciwgc3RydWN0IGFieDUwMF9jaGFyZ2FsZywKLQkJCQkJCSAgbWFpbnRlbmFuY2VfdGltZXIpOwotCi0JZGV2X2RiZyhkaS0+ZGV2LCAiTWFpbnRlbmFuY2UgdGltZXIgZXhwaXJlZFxuIik7Ci0JZGktPmV2ZW50cy5tYWludGVuYW5jZV90aW1lcl9leHBpcmVkID0gdHJ1ZTsKLQotCS8qIFRyaWdnZXIgZXhlY3V0aW9uIG9mIHRoZSBhbGdvcml0aG0gaW5zdGFudGx5ICovCi0JcXVldWVfd29yayhkaS0+Y2hhcmdhbGdfd3EsICZkaS0+Y2hhcmdhbGdfd29yayk7Ci0KLQlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7Ci19Ci0KLS8qKgotICogYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKCkgLSBDaGFuZ2UgY2hhcmdlIHN0YXRlCi0gKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYng1MDBfY2hhcmdhbGcgc3RydWN0dXJlCi0gKgotICogVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCB3aGVuIGEgY2hhcmdlIHN0YXRlIGNoYW5nZSBzaG91bGQgb2NjdXIKLSAqLwotc3RhdGljIHZvaWQgYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKHN0cnVjdCBhYng1MDBfY2hhcmdhbGcgKmRpLAotCWVudW0gYWJ4NTAwX2NoYXJnYWxnX3N0YXRlcyBzdGF0ZSkKLXsKLQlkZXZfZGJnKGRpLT5kZXYsCi0JCSJTdGF0ZSBjaGFuZ2VkOiAlcyAoRnJvbSBzdGF0ZTogWyVkXSAlcyA9dG89PiBbJWRdICVzIClcbiIsCi0JCWRpLT5jaGFyZ2Vfc3RhdGUgPT0gc3RhdGUgPyAiTk8iIDogIllFUyIsCi0JCWRpLT5jaGFyZ2Vfc3RhdGUsCi0JCXN0YXRlc1tkaS0+Y2hhcmdlX3N0YXRlXSwKLQkJc3RhdGUsCi0JCXN0YXRlc1tzdGF0ZV0pOwotCi0JZGktPmNoYXJnZV9zdGF0ZSA9IHN0YXRlOwotfQotCi1zdGF0aWMgaW50IGFieDUwMF9jaGFyZ2FsZ19jaGVja19jaGFyZ2VyX2VuYWJsZShzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSkKLXsKLQlzd2l0Y2ggKGRpLT5jaGFyZ2Vfc3RhdGUpIHsKLQljYXNlIFNUQVRFX05PUk1BTDoKLQljYXNlIFNUQVRFX01BSU5URU5BTkNFX0E6Ci0JY2FzZSBTVEFURV9NQUlOVEVOQU5DRV9COgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoZGktPmNoZ19pbmZvLmNoYXJnZXJfdHlwZSAmIFVTQl9DSEcpIHsKLQkJcmV0dXJuIGRpLT51c2JfY2hnLT5vcHMuY2hlY2tfZW5hYmxlKGRpLT51c2JfY2hnLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRpLT5ibS0+YmF0X3R5cGVbZGktPmJtLT5iYXR0X2lkXS5ub3JtYWxfdm9sX2x2bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkaS0+Ym0tPmJhdF90eXBlW2RpLT5ibS0+YmF0dF9pZF0ubm9ybWFsX2N1cl9sdmwpOwotCX0gZWxzZSBpZiAoKGRpLT5jaGdfaW5mby5jaGFyZ2VyX3R5cGUgJiBBQ19DSEcpICYmCi0JCSAgICEoZGktPmFjX2NoZy0+ZXh0ZXJuYWwpKSB7Ci0JCXJldHVybiBkaS0+YWNfY2hnLT5vcHMuY2hlY2tfZW5hYmxlKGRpLT5hY19jaGcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGktPmJtLT5iYXRfdHlwZVtkaS0+Ym0tPmJhdHRfaWRdLm5vcm1hbF92b2xfbHZsLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRpLT5ibS0+YmF0X3R5cGVbZGktPmJtLT5iYXR0X2lkXS5ub3JtYWxfY3VyX2x2bCk7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGFieDUwMF9jaGFyZ2FsZ19jaGVja19jaGFyZ2VyX2Nvbm5lY3Rpb24oKSAtIENoZWNrIGNoYXJnZXIgY29ubmVjdGlvbiBjaGFuZ2UKLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFieDUwMF9jaGFyZ2FsZyBzdHJ1Y3R1cmUKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hlY2sgaWYgdGhlcmUgaXMgYSBjaGFuZ2UgaW4gdGhlIGNoYXJnZXIgY29ubmVjdGlvbgotICogYW5kIGNoYW5nZSBjaGFyZ2Ugc3RhdGUgYWNjb3JkaW5nbHkuIEFDIGhhcyBwcmVjZWRlbmNlIG92ZXIgVVNCLgotICovCi1zdGF0aWMgaW50IGFieDUwMF9jaGFyZ2FsZ19jaGVja19jaGFyZ2VyX2Nvbm5lY3Rpb24oc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGkpCi17Ci0JaWYgKGRpLT5jaGdfaW5mby5jb25uX2NoZyAhPSBkaS0+Y2hnX2luZm8ucHJldl9jb25uX2NoZyB8fAotCQlkaS0+c3VzcF9zdGF0dXMuc3VzcGVuZGVkX2NoYW5nZSkgewotCQkvKgotCQkgKiBDaGFyZ2VyIHN0YXRlIGNoYW5nZWQgb3Igc3VzcGVuc2lvbgotCQkgKiBoYXMgY2hhbmdlZCBzaW5jZSBsYXN0IHVwZGF0ZQotCQkgKi8KLQkJaWYgKChkaS0+Y2hnX2luZm8uY29ubl9jaGcgJiBBQ19DSEcpICYmCi0JCQkhZGktPnN1c3Bfc3RhdHVzLmFjX3N1c3BlbmRlZCkgewotCQkJZGV2X2RiZyhkaS0+ZGV2LCAiQ2hhcmdpbmcgc291cmNlIGlzIEFDXG4iKTsKLQkJCWlmIChkaS0+Y2hnX2luZm8uY2hhcmdlcl90eXBlICE9IEFDX0NIRykgewotCQkJCWRpLT5jaGdfaW5mby5jaGFyZ2VyX3R5cGUgPSBBQ19DSEc7Ci0JCQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9OT1JNQUxfSU5JVCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoKGRpLT5jaGdfaW5mby5jb25uX2NoZyAmIFVTQl9DSEcpICYmCi0JCQkhZGktPnN1c3Bfc3RhdHVzLnVzYl9zdXNwZW5kZWQpIHsKLQkJCWRldl9kYmcoZGktPmRldiwgIkNoYXJnaW5nIHNvdXJjZSBpcyBVU0JcbiIpOwotCQkJZGktPmNoZ19pbmZvLmNoYXJnZXJfdHlwZSA9IFVTQl9DSEc7Ci0JCQlhYng1MDBfY2hhcmdhbGdfc3RhdGVfdG8oZGksIFNUQVRFX05PUk1BTF9JTklUKTsKLQkJfSBlbHNlIGlmIChkaS0+Y2hnX2luZm8uY29ubl9jaGcgJiYKLQkJCShkaS0+c3VzcF9zdGF0dXMuYWNfc3VzcGVuZGVkIHx8Ci0JCQlkaS0+c3VzcF9zdGF0dXMudXNiX3N1c3BlbmRlZCkpIHsKLQkJCWRldl9kYmcoZGktPmRldiwgIkNoYXJnaW5nIGlzIHN1c3BlbmRlZFxuIik7Ci0JCQlkaS0+Y2hnX2luZm8uY2hhcmdlcl90eXBlID0gTk9fQ0hHOwotCQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9TVVNQRU5ERURfSU5JVCk7Ci0JCX0gZWxzZSB7Ci0JCQlkZXZfZGJnKGRpLT5kZXYsICJDaGFyZ2luZyBzb3VyY2UgaXMgT0ZGXG4iKTsKLQkJCWRpLT5jaGdfaW5mby5jaGFyZ2VyX3R5cGUgPSBOT19DSEc7Ci0JCQlhYng1MDBfY2hhcmdhbGdfc3RhdGVfdG8oZGksIFNUQVRFX0hBTkRIRUxEX0lOSVQpOwotCQl9Ci0JCWRpLT5jaGdfaW5mby5wcmV2X2Nvbm5fY2hnID0gZGktPmNoZ19pbmZvLmNvbm5fY2hnOwotCQlkaS0+c3VzcF9zdGF0dXMuc3VzcGVuZGVkX2NoYW5nZSA9IGZhbHNlOwotCX0KLQlyZXR1cm4gZGktPmNoZ19pbmZvLmNvbm5fY2hnOwotfQotCi0vKioKLSAqIGFieDUwMF9jaGFyZ2FsZ19jaGVja19jdXJyZW50X3N0ZXBfc3RhdHVzKCkgLSBDaGVjayBjaGFyZ2luZyBjdXJyZW50Ci0gKiBzdGVwIHN0YXR1cy4KLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFieDUwMF9jaGFyZ2FsZyBzdHJ1Y3R1cmUKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hlY2sgaWYgdGhlcmUgaXMgYSBjaGFuZ2UgaW4gdGhlIGNoYXJnaW5nIGN1cnJlbnQgc3RlcAotICogYW5kIGNoYW5nZSBjaGFyZ2Ugc3RhdGUgYWNjb3JkaW5nbHkuCi0gKi8KLXN0YXRpYyB2b2lkIGFieDUwMF9jaGFyZ2FsZ19jaGVja19jdXJyZW50X3N0ZXBfc3RhdHVzCi0JKHN0cnVjdCBhYng1MDBfY2hhcmdhbGcgKmRpKQotewotCWlmIChkaS0+Y3Vycl9zdGF0dXMuY3Vycl9zdGVwX2NoYW5nZSkKLQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9OT1JNQUxfSU5JVCk7Ci0JZGktPmN1cnJfc3RhdHVzLmN1cnJfc3RlcF9jaGFuZ2UgPSBmYWxzZTsKLX0KLQotLyoqCi0gKiBhYng1MDBfY2hhcmdhbGdfc3RhcnRfc2FmZXR5X3RpbWVyKCkgLSBTdGFydCBjaGFyZ2luZyBzYWZldHkgdGltZXIKLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFieDUwMF9jaGFyZ2FsZyBzdHJ1Y3R1cmUKLSAqCi0gKiBUaGUgc2FmZXR5IHRpbWVyIGlzIHVzZWQgdG8gYXZvaWQgb3ZlcmNoYXJnaW5nIG9mIG9sZCBvciBiYWQgYmF0dGVyaWVzLgotICogVGhlcmUgYXJlIGRpZmZlcmVudCB0aW1lcnMgZm9yIEFDIGFuZCBVU0IKLSAqLwotc3RhdGljIHZvaWQgYWJ4NTAwX2NoYXJnYWxnX3N0YXJ0X3NhZmV0eV90aW1lcihzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSkKLXsKLQkvKiBDaGFyZ2VyLWRlcGVuZGVudCBleHBpcmF0aW9uIHRpbWUgaW4gaG91cnMqLwotCWludCB0aW1lcl9leHBpcmF0aW9uID0gMDsKLQotCXN3aXRjaCAoZGktPmNoZ19pbmZvLmNoYXJnZXJfdHlwZSkgewotCWNhc2UgQUNfQ0hHOgotCQl0aW1lcl9leHBpcmF0aW9uID0gZGktPmJtLT5tYWluX3NhZmV0eV90bXJfaDsKLQkJYnJlYWs7Ci0KLQljYXNlIFVTQl9DSEc6Ci0JCXRpbWVyX2V4cGlyYXRpb24gPSBkaS0+Ym0tPnVzYl9zYWZldHlfdG1yX2g7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJZGV2X2VycihkaS0+ZGV2LCAiVW5rbm93biBjaGFyZ2VyIHRvIGNoYXJnZSBmcm9tXG4iKTsKLQkJYnJlYWs7Ci0JfQotCi0JZGktPmV2ZW50cy5zYWZldHlfdGltZXJfZXhwaXJlZCA9IGZhbHNlOwotCWhydGltZXJfc2V0X2V4cGlyZXNfcmFuZ2UoJmRpLT5zYWZldHlfdGltZXIsCi0JCWt0aW1lX3NldCh0aW1lcl9leHBpcmF0aW9uICogT05FX0hPVVJfSU5fU0VDT05EUywgMCksCi0JCWt0aW1lX3NldChGSVZFX01JTlVURVNfSU5fU0VDT05EUywgMCkpOwotCWhydGltZXJfc3RhcnRfZXhwaXJlcygmZGktPnNhZmV0eV90aW1lciwgSFJUSU1FUl9NT0RFX1JFTCk7Ci19Ci0KLS8qKgotICogYWJ4NTAwX2NoYXJnYWxnX3N0b3Bfc2FmZXR5X3RpbWVyKCkgLSBTdG9wIGNoYXJnaW5nIHNhZmV0eSB0aW1lcgotICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWJ4NTAwX2NoYXJnYWxnIHN0cnVjdHVyZQotICoKLSAqIFRoZSBzYWZldHkgdGltZXIgaXMgc3RvcHBlZCB3aGVuZXZlciB0aGUgTk9STUFMIHN0YXRlIGlzIGV4aXRlZAotICovCi1zdGF0aWMgdm9pZCBhYng1MDBfY2hhcmdhbGdfc3RvcF9zYWZldHlfdGltZXIoc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGkpCi17Ci0JaWYgKGhydGltZXJfdHJ5X3RvX2NhbmNlbCgmZGktPnNhZmV0eV90aW1lcikgPj0gMCkKLQkJZGktPmV2ZW50cy5zYWZldHlfdGltZXJfZXhwaXJlZCA9IGZhbHNlOwotfQotCi0vKioKLSAqIGFieDUwMF9jaGFyZ2FsZ19zdGFydF9tYWludGVuYW5jZV90aW1lcigpIC0gU3RhcnQgY2hhcmdpbmcgbWFpbnRlbmFuY2UgdGltZXIKLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFieDUwMF9jaGFyZ2FsZyBzdHJ1Y3R1cmUKLSAqIEBkdXJhdGlvbjoJZHVyYXRpb24gb2YgdGhlciBtYWludGVuYW5jZSB0aW1lciBpbiBob3VycwotICoKLSAqIFRoZSBtYWludGVuYW5jZSB0aW1lciBpcyB1c2VkIHRvIG1haW50YWluIHRoZSBjaGFyZ2UgaW4gdGhlIGJhdHRlcnkgb25jZQotICogdGhlIGJhdHRlcnkgaXMgY29uc2lkZXJlZCBmdWxsLiBUaGVzZSB0aW1lcnMgYXJlIGNob3NlbiB0byBtYXRjaCB0aGUKLSAqIGRpc2NoYXJnZSBjdXJ2ZSBvZiB0aGUgYmF0dGVyeQotICovCi1zdGF0aWMgdm9pZCBhYng1MDBfY2hhcmdhbGdfc3RhcnRfbWFpbnRlbmFuY2VfdGltZXIoc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGksCi0JaW50IGR1cmF0aW9uKQotewotCWhydGltZXJfc2V0X2V4cGlyZXNfcmFuZ2UoJmRpLT5tYWludGVuYW5jZV90aW1lciwKLQkJa3RpbWVfc2V0KGR1cmF0aW9uICogT05FX0hPVVJfSU5fU0VDT05EUywgMCksCi0JCWt0aW1lX3NldChGSVZFX01JTlVURVNfSU5fU0VDT05EUywgMCkpOwotCWRpLT5ldmVudHMubWFpbnRlbmFuY2VfdGltZXJfZXhwaXJlZCA9IGZhbHNlOwotCWhydGltZXJfc3RhcnRfZXhwaXJlcygmZGktPm1haW50ZW5hbmNlX3RpbWVyLCBIUlRJTUVSX01PREVfUkVMKTsKLX0KLQotLyoqCi0gKiBhYng1MDBfY2hhcmdhbGdfc3RvcF9tYWludGVuYW5jZV90aW1lcigpIC0gU3RvcCBtYWludGVuYW5jZSB0aW1lcgotICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWJ4NTAwX2NoYXJnYWxnIHN0cnVjdHVyZQotICoKLSAqIFRoZSBtYWludGVuYW5jZSB0aW1lciBpcyBzdG9wcGVkIHdoZW5ldmVyIG1haW50ZW5hbmNlIGVuZHMgb3Igd2hlbiBhbm90aGVyCi0gKiBzdGF0ZSBpcyBlbnRlcmVkCi0gKi8KLXN0YXRpYyB2b2lkIGFieDUwMF9jaGFyZ2FsZ19zdG9wX21haW50ZW5hbmNlX3RpbWVyKHN0cnVjdCBhYng1MDBfY2hhcmdhbGcgKmRpKQotewotCWlmIChocnRpbWVyX3RyeV90b19jYW5jZWwoJmRpLT5tYWludGVuYW5jZV90aW1lcikgPj0gMCkKLQkJZGktPmV2ZW50cy5tYWludGVuYW5jZV90aW1lcl9leHBpcmVkID0gZmFsc2U7Ci19Ci0KLS8qKgotICogYWJ4NTAwX2NoYXJnYWxnX2tpY2tfd2F0Y2hkb2coKSAtIEtpY2sgY2hhcmdlciB3YXRjaGRvZwotICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWJ4NTAwX2NoYXJnYWxnIHN0cnVjdHVyZQotICoKLSAqIFRoZSBjaGFyZ2VyIHdhdGNoZG9nIGhhdmUgdG8gYmUga2lja2VkIHBlcmlvZGljYWxseSB3aGVuZXZlciB0aGUgY2hhcmdlciBpcwotICogb24sIGVsc2UgdGhlIEFCQiB3aWxsIHJlc2V0IHRoZSBzeXN0ZW0KLSAqLwotc3RhdGljIGludCBhYng1MDBfY2hhcmdhbGdfa2lja193YXRjaGRvZyhzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSkKLXsKLQkvKiBDaGVjayBpZiBjaGFyZ2VyIGV4aXN0cyBhbmQga2ljayB3YXRjaGRvZyBpZiBjaGFyZ2luZyAqLwotCWlmIChkaS0+YWNfY2hnICYmIGRpLT5hY19jaGctPm9wcy5raWNrX3dkICYmCi0JICAgIGRpLT5jaGdfaW5mby5vbmxpbmVfY2hnICYgQUNfQ0hHKSB7Ci0JCS8qCi0JCSAqIElmIEFCIGNoYXJnZXIgd2F0Y2hkb2cgZXhwaXJlZCwgcG0yeHh4IGNoYXJnaW5nCi0JCSAqIGdldHMgZGlzYWJsZWQuIFRvIGJlIHNhZmUsIGtpY2sgYm90aCBBQiBjaGFyZ2VyIHdhdGNoZG9nCi0JCSAqIGFuZCBwbTJ4eHggd2F0Y2hkb2cuCi0JCSAqLwotCQlpZiAoZGktPmFjX2NoZy0+ZXh0ZXJuYWwgJiYKLQkJICAgIGRpLT51c2JfY2hnICYmIGRpLT51c2JfY2hnLT5vcHMua2lja193ZCkKLQkJCWRpLT51c2JfY2hnLT5vcHMua2lja193ZChkaS0+dXNiX2NoZyk7Ci0KLQkJcmV0dXJuIGRpLT5hY19jaGctPm9wcy5raWNrX3dkKGRpLT5hY19jaGcpOwotCX0KLQllbHNlIGlmIChkaS0+dXNiX2NoZyAmJiBkaS0+dXNiX2NoZy0+b3BzLmtpY2tfd2QgJiYKLQkJCWRpLT5jaGdfaW5mby5vbmxpbmVfY2hnICYgVVNCX0NIRykKLQkJcmV0dXJuIGRpLT51c2JfY2hnLT5vcHMua2lja193ZChkaS0+dXNiX2NoZyk7Ci0KLQlyZXR1cm4gLUVOWElPOwotfQotCi0vKioKLSAqIGFieDUwMF9jaGFyZ2FsZ19hY19lbigpIC0gVHVybiBvbi9vZmYgdGhlIEFDIGNoYXJnZXIKLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFieDUwMF9jaGFyZ2FsZyBzdHJ1Y3R1cmUKLSAqIEBlbmFibGU6CWNoYXJnZXIgb24vb2ZmCi0gKiBAdnNldDoJcmVxdWVzdGVkIGNoYXJnZXIgb3V0cHV0IHZvbHRhZ2UKLSAqIEBpc2V0OglyZXF1ZXN0ZWQgY2hhcmdlciBvdXRwdXQgY3VycmVudAotICoKLSAqIFRoZSBBQyBjaGFyZ2VyIHdpbGwgYmUgdHVybmVkIG9uL29mZiB3aXRoIHRoZSByZXF1ZXN0ZWQgY2hhcmdlIHZvbHRhZ2UgYW5kCi0gKiBjdXJyZW50Ci0gKi8KLXN0YXRpYyBpbnQgYWJ4NTAwX2NoYXJnYWxnX2FjX2VuKHN0cnVjdCBhYng1MDBfY2hhcmdhbGcgKmRpLCBpbnQgZW5hYmxlLAotCWludCB2c2V0LCBpbnQgaXNldCkKLXsKLQlzdGF0aWMgaW50IGFieDUwMF9jaGFyZ2FsZ19leF9hY19lbmFibGVfdG9nZ2xlOwotCi0JaWYgKCFkaS0+YWNfY2hnIHx8ICFkaS0+YWNfY2hnLT5vcHMuZW5hYmxlKQotCQlyZXR1cm4gLUVOWElPOwotCi0JLyogU2VsZWN0IG1heGltdW0gb2Ygd2hhdCBib3RoIHRoZSBjaGFyZ2VyIGFuZCB0aGUgYmF0dGVyeSBzdXBwb3J0cyAqLwotCWlmIChkaS0+YWNfY2hnLT5tYXhfb3V0X3ZvbHQpCi0JCXZzZXQgPSBtaW4odnNldCwgZGktPmFjX2NoZy0+bWF4X291dF92b2x0KTsKLQlpZiAoZGktPmFjX2NoZy0+bWF4X291dF9jdXJyKQotCQlpc2V0ID0gbWluKGlzZXQsIGRpLT5hY19jaGctPm1heF9vdXRfY3Vycik7Ci0KLQlkaS0+Y2hnX2luZm8uYWNfaXNldCA9IGlzZXQ7Ci0JZGktPmNoZ19pbmZvLmFjX3ZzZXQgPSB2c2V0OwotCi0JLyogRW5hYmxlIGV4dGVybmFsIGNoYXJnZXIgKi8KLQlpZiAoZW5hYmxlICYmIGRpLT5hY19jaGctPmV4dGVybmFsICYmCi0JICAgICFhYng1MDBfY2hhcmdhbGdfZXhfYWNfZW5hYmxlX3RvZ2dsZSkgewotCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZjaGFyZ2VyX25vdGlmaWVyX2xpc3QsCi0JCQkJCSAgICAgMCwgZGktPmRldik7Ci0JCWFieDUwMF9jaGFyZ2FsZ19leF9hY19lbmFibGVfdG9nZ2xlKys7Ci0JfQotCi0JcmV0dXJuIGRpLT5hY19jaGctPm9wcy5lbmFibGUoZGktPmFjX2NoZywgZW5hYmxlLCB2c2V0LCBpc2V0KTsKLX0KLQotLyoqCi0gKiBhYng1MDBfY2hhcmdhbGdfdXNiX2VuKCkgLSBUdXJuIG9uL29mZiB0aGUgVVNCIGNoYXJnZXIKLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFieDUwMF9jaGFyZ2FsZyBzdHJ1Y3R1cmUKLSAqIEBlbmFibGU6CWNoYXJnZXIgb24vb2ZmCi0gKiBAdnNldDoJcmVxdWVzdGVkIGNoYXJnZXIgb3V0cHV0IHZvbHRhZ2UKLSAqIEBpc2V0OglyZXF1ZXN0ZWQgY2hhcmdlciBvdXRwdXQgY3VycmVudAotICoKLSAqIFRoZSBVU0IgY2hhcmdlciB3aWxsIGJlIHR1cm5lZCBvbi9vZmYgd2l0aCB0aGUgcmVxdWVzdGVkIGNoYXJnZSB2b2x0YWdlIGFuZAotICogY3VycmVudAotICovCi1zdGF0aWMgaW50IGFieDUwMF9jaGFyZ2FsZ191c2JfZW4oc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGksIGludCBlbmFibGUsCi0JaW50IHZzZXQsIGludCBpc2V0KQotewotCWlmICghZGktPnVzYl9jaGcgfHwgIWRpLT51c2JfY2hnLT5vcHMuZW5hYmxlKQotCQlyZXR1cm4gLUVOWElPOwotCi0JLyogU2VsZWN0IG1heGltdW0gb2Ygd2hhdCBib3RoIHRoZSBjaGFyZ2VyIGFuZCB0aGUgYmF0dGVyeSBzdXBwb3J0cyAqLwotCWlmIChkaS0+dXNiX2NoZy0+bWF4X291dF92b2x0KQotCQl2c2V0ID0gbWluKHZzZXQsIGRpLT51c2JfY2hnLT5tYXhfb3V0X3ZvbHQpOwotCWlmIChkaS0+dXNiX2NoZy0+bWF4X291dF9jdXJyKQotCQlpc2V0ID0gbWluKGlzZXQsIGRpLT51c2JfY2hnLT5tYXhfb3V0X2N1cnIpOwotCi0JZGktPmNoZ19pbmZvLnVzYl9pc2V0ID0gaXNldDsKLQlkaS0+Y2hnX2luZm8udXNiX3ZzZXQgPSB2c2V0OwotCi0JcmV0dXJuIGRpLT51c2JfY2hnLT5vcHMuZW5hYmxlKGRpLT51c2JfY2hnLCBlbmFibGUsIHZzZXQsIGlzZXQpOwotfQotCi0gLyoqCi0gKiBhYjg1NDBfY2hhcmdhbGdfdXNiX3BwX2VuKCkgLSBFbmFibGUvIGRpc2FibGUgVVNCIHBvd2VyIHBhdGgKLSAqIEBkaTogICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgYWJ4NTAwX2NoYXJnYWxnIHN0cnVjdHVyZQotICogQGVuYWJsZTogICAgcG93ZXIgcGF0aCBlbmFibGUvZGlzYWJsZQotICoKLSAqIFRoZSBVU0IgcG93ZXIgcGF0aCB3aWxsIGJlIGVuYWJsZS8gZGlzYWJsZQotICovCi1zdGF0aWMgaW50IGFiODU0MF9jaGFyZ2FsZ191c2JfcHBfZW4oc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGksIGJvb2wgZW5hYmxlKQotewotCWlmICghZGktPnVzYl9jaGcgfHwgIWRpLT51c2JfY2hnLT5vcHMucHBfZW5hYmxlKQotCQlyZXR1cm4gLUVOWElPOwotCi0JcmV0dXJuIGRpLT51c2JfY2hnLT5vcHMucHBfZW5hYmxlKGRpLT51c2JfY2hnLCBlbmFibGUpOwotfQotCi0vKioKLSAqIGFiODU0MF9jaGFyZ2FsZ191c2JfcHJlX2NoZ19lbigpIC0gRW5hYmxlLyBkaXNhYmxlIFVTQiBwcmUtY2hhcmdlCi0gKiBAZGk6ICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGFieDUwMF9jaGFyZ2FsZyBzdHJ1Y3R1cmUKLSAqIEBlbmFibGU6ICAgIFVTQiBwcmUtY2hhcmdlIGVuYWJsZS9kaXNhYmxlCi0gKgotICogVGhlIFVTQiBVU0IgcHJlLWNoYXJnZSB3aWxsIGJlIGVuYWJsZS8gZGlzYWJsZQotICovCi1zdGF0aWMgaW50IGFiODU0MF9jaGFyZ2FsZ191c2JfcHJlX2NoZ19lbihzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSwKLQkJCQkJICBib29sIGVuYWJsZSkKLXsKLQlpZiAoIWRpLT51c2JfY2hnIHx8ICFkaS0+dXNiX2NoZy0+b3BzLnByZV9jaGdfZW5hYmxlKQotCQlyZXR1cm4gLUVOWElPOwotCi0JcmV0dXJuIGRpLT51c2JfY2hnLT5vcHMucHJlX2NoZ19lbmFibGUoZGktPnVzYl9jaGcsIGVuYWJsZSk7Ci19Ci0KLS8qKgotICogYWJ4NTAwX2NoYXJnYWxnX3VwZGF0ZV9jaGdfY3VycigpIC0gVXBkYXRlIGNoYXJnZXIgY3VycmVudAotICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWJ4NTAwX2NoYXJnYWxnIHN0cnVjdHVyZQotICogQGlzZXQ6CXJlcXVlc3RlZCBjaGFyZ2VyIG91dHB1dCBjdXJyZW50Ci0gKgotICogVGhlIGNoYXJnZXIgb3V0cHV0IGN1cnJlbnQgd2lsbCBiZSB1cGRhdGVkIGZvciB0aGUgY2hhcmdlcgotICogdGhhdCBpcyBjdXJyZW50bHkgaW4gdXNlCi0gKi8KLXN0YXRpYyBpbnQgYWJ4NTAwX2NoYXJnYWxnX3VwZGF0ZV9jaGdfY3VycihzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSwKLQkJaW50IGlzZXQpCi17Ci0JLyogQ2hlY2sgaWYgY2hhcmdlciBleGlzdHMgYW5kIHVwZGF0ZSBjdXJyZW50IGlmIGNoYXJnaW5nICovCi0JaWYgKGRpLT5hY19jaGcgJiYgZGktPmFjX2NoZy0+b3BzLnVwZGF0ZV9jdXJyICYmCi0JCQlkaS0+Y2hnX2luZm8uY2hhcmdlcl90eXBlICYgQUNfQ0hHKSB7Ci0JCS8qCi0JCSAqIFNlbGVjdCBtYXhpbXVtIG9mIHdoYXQgYm90aCB0aGUgY2hhcmdlcgotCQkgKiBhbmQgdGhlIGJhdHRlcnkgc3VwcG9ydHMKLQkJICovCi0JCWlmIChkaS0+YWNfY2hnLT5tYXhfb3V0X2N1cnIpCi0JCQlpc2V0ID0gbWluKGlzZXQsIGRpLT5hY19jaGctPm1heF9vdXRfY3Vycik7Ci0KLQkJZGktPmNoZ19pbmZvLmFjX2lzZXQgPSBpc2V0OwotCi0JCXJldHVybiBkaS0+YWNfY2hnLT5vcHMudXBkYXRlX2N1cnIoZGktPmFjX2NoZywgaXNldCk7Ci0JfSBlbHNlIGlmIChkaS0+dXNiX2NoZyAmJiBkaS0+dXNiX2NoZy0+b3BzLnVwZGF0ZV9jdXJyICYmCi0JCQlkaS0+Y2hnX2luZm8uY2hhcmdlcl90eXBlICYgVVNCX0NIRykgewotCQkvKgotCQkgKiBTZWxlY3QgbWF4aW11bSBvZiB3aGF0IGJvdGggdGhlIGNoYXJnZXIKLQkJICogYW5kIHRoZSBiYXR0ZXJ5IHN1cHBvcnRzCi0JCSAqLwotCQlpZiAoZGktPnVzYl9jaGctPm1heF9vdXRfY3VycikKLQkJCWlzZXQgPSBtaW4oaXNldCwgZGktPnVzYl9jaGctPm1heF9vdXRfY3Vycik7Ci0KLQkJZGktPmNoZ19pbmZvLnVzYl9pc2V0ID0gaXNldDsKLQotCQlyZXR1cm4gZGktPnVzYl9jaGctPm9wcy51cGRhdGVfY3VycihkaS0+dXNiX2NoZywgaXNldCk7Ci0JfQotCi0JcmV0dXJuIC1FTlhJTzsKLX0KLQotLyoqCi0gKiBhYng1MDBfY2hhcmdhbGdfc3RvcF9jaGFyZ2luZygpIC0gU3RvcCBjaGFyZ2luZwotICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWJ4NTAwX2NoYXJnYWxnIHN0cnVjdHVyZQotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gYW55IHN0YXRlIHdoZXJlIGNoYXJnaW5nIHNob3VsZCBiZSBzdG9wcGVkLgotICogQWxsIGNoYXJnaW5nIGlzIGRpc2FibGVkIGFuZCBhbGwgc3RhdHVzIHBhcmFtZXRlcnMgYW5kIHRpbWVycyBhcmUgY2hhbmdlZAotICogYWNjb3JkaW5nbHkKLSAqLwotc3RhdGljIHZvaWQgYWJ4NTAwX2NoYXJnYWxnX3N0b3BfY2hhcmdpbmcoc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGkpCi17Ci0JYWJ4NTAwX2NoYXJnYWxnX2FjX2VuKGRpLCBmYWxzZSwgMCwgMCk7Ci0JYWJ4NTAwX2NoYXJnYWxnX3VzYl9lbihkaSwgZmFsc2UsIDAsIDApOwotCWFieDUwMF9jaGFyZ2FsZ19zdG9wX3NhZmV0eV90aW1lcihkaSk7Ci0JYWJ4NTAwX2NoYXJnYWxnX3N0b3BfbWFpbnRlbmFuY2VfdGltZXIoZGkpOwotCWRpLT5jaGFyZ2Vfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19OT1RfQ0hBUkdJTkc7Ci0JZGktPm1haW50ZW5hbmNlX2NoZyA9IGZhbHNlOwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJmRpLT5jaGFyZ2FsZ193ZF93b3JrKTsKLQlwb3dlcl9zdXBwbHlfY2hhbmdlZChkaS0+Y2hhcmdhbGdfcHN5KTsKLX0KLQotLyoqCi0gKiBhYng1MDBfY2hhcmdhbGdfaG9sZF9jaGFyZ2luZygpIC0gUGF1c2VzIGNoYXJnaW5nCi0gKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYng1MDBfY2hhcmdhbGcgc3RydWN0dXJlCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdGhlIGNhc2Ugd2hlcmUgbWFpbnRlbmFuY2UgY2hhcmdpbmcgaGFzIGJlZW4KLSAqIGRpc2FibGVkIGFuZCBpbnN0ZWFkIGEgYmF0dGVyeSB2b2x0YWdlIG1vZGUgaXMgZW50ZXJlZCB0byBjaGVjayB3aGVuIHRoZQotICogYmF0dGVyeSB2b2x0YWdlIGhhcyByZWFjaGVkIGEgY2VydGFpbiByZWNoYXJnZSB2b2x0YWdlCi0gKi8KLXN0YXRpYyB2b2lkIGFieDUwMF9jaGFyZ2FsZ19ob2xkX2NoYXJnaW5nKHN0cnVjdCBhYng1MDBfY2hhcmdhbGcgKmRpKQotewotCWFieDUwMF9jaGFyZ2FsZ19hY19lbihkaSwgZmFsc2UsIDAsIDApOwotCWFieDUwMF9jaGFyZ2FsZ191c2JfZW4oZGksIGZhbHNlLCAwLCAwKTsKLQlhYng1MDBfY2hhcmdhbGdfc3RvcF9zYWZldHlfdGltZXIoZGkpOwotCWFieDUwMF9jaGFyZ2FsZ19zdG9wX21haW50ZW5hbmNlX3RpbWVyKGRpKTsKLQlkaS0+Y2hhcmdlX3N0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7Ci0JZGktPm1haW50ZW5hbmNlX2NoZyA9IGZhbHNlOwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJmRpLT5jaGFyZ2FsZ193ZF93b3JrKTsKLQlwb3dlcl9zdXBwbHlfY2hhbmdlZChkaS0+Y2hhcmdhbGdfcHN5KTsKLX0KLQotLyoqCi0gKiBhYng1MDBfY2hhcmdhbGdfc3RhcnRfY2hhcmdpbmcoKSAtIFN0YXJ0IHRoZSBjaGFyZ2VyCi0gKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYng1MDBfY2hhcmdhbGcgc3RydWN0dXJlCi0gKiBAdnNldDoJcmVxdWVzdGVkIGNoYXJnZXIgb3V0cHV0IHZvbHRhZ2UKLSAqIEBpc2V0OglyZXF1ZXN0ZWQgY2hhcmdlciBvdXRwdXQgY3VycmVudAotICoKLSAqIEEgY2hhcmdlciB3aWxsIGJlIGVuYWJsZWQgZGVwZW5kaW5nIG9uIHRoZSByZXF1ZXN0ZWQgY2hhcmdlciB0eXBlIHRoYXQgd2FzCi0gKiBkZXRlY3RlZCBwcmV2aW91c2x5LgotICovCi1zdGF0aWMgdm9pZCBhYng1MDBfY2hhcmdhbGdfc3RhcnRfY2hhcmdpbmcoc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGksCi0JaW50IHZzZXQsIGludCBpc2V0KQotewotCXN3aXRjaCAoZGktPmNoZ19pbmZvLmNoYXJnZXJfdHlwZSkgewotCWNhc2UgQUNfQ0hHOgotCQlkZXZfZGJnKGRpLT5kZXYsCi0JCQkiQUMgcGFyYW1ldGVyczogVnNldCAlZCwgSWNoICVkXG4iLCB2c2V0LCBpc2V0KTsKLQkJYWJ4NTAwX2NoYXJnYWxnX3VzYl9lbihkaSwgZmFsc2UsIDAsIDApOwotCQlhYng1MDBfY2hhcmdhbGdfYWNfZW4oZGksIHRydWUsIHZzZXQsIGlzZXQpOwotCQlicmVhazsKLQotCWNhc2UgVVNCX0NIRzoKLQkJZGV2X2RiZyhkaS0+ZGV2LAotCQkJIlVTQiBwYXJhbWV0ZXJzOiBWc2V0ICVkLCBJY2ggJWRcbiIsIHZzZXQsIGlzZXQpOwotCQlhYng1MDBfY2hhcmdhbGdfYWNfZW4oZGksIGZhbHNlLCAwLCAwKTsKLQkJYWJ4NTAwX2NoYXJnYWxnX3VzYl9lbihkaSwgdHJ1ZSwgdnNldCwgaXNldCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJZGV2X2VycihkaS0+ZGV2LCAiVW5rbm93biBjaGFyZ2VyIHRvIGNoYXJnZSBmcm9tXG4iKTsKLQkJYnJlYWs7Ci0JfQotfQotCi0vKioKLSAqIGFieDUwMF9jaGFyZ2FsZ19jaGVja190ZW1wKCkgLSBDaGVjayBiYXR0ZXJ5IHRlbXBlcmF0dXJlIHJhbmdlcwotICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWJ4NTAwX2NoYXJnYWxnIHN0cnVjdHVyZQotICoKLSAqIFRoZSBiYXR0ZXJ5IHRlbXBlcmF0dXJlIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgcHJlZGVmaW5lZCBsaW1pdHMgYW5kIHRoZQotICogY2hhcmdlIHN0YXRlIGlzIGNoYW5nZWQgYWNjb3JkaW5nbHkKLSAqLwotc3RhdGljIHZvaWQgYWJ4NTAwX2NoYXJnYWxnX2NoZWNrX3RlbXAoc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGkpCi17Ci0JaWYgKGRpLT5iYXR0X2RhdGEudGVtcCA+IChkaS0+Ym0tPnRlbXBfbG93ICsgZGktPnRfaHlzdF9ub3JtKSAmJgotCQlkaS0+YmF0dF9kYXRhLnRlbXAgPCAoZGktPmJtLT50ZW1wX2hpZ2ggLSBkaS0+dF9oeXN0X25vcm0pKSB7Ci0JCS8qIFRlbXAgT0shICovCi0JCWRpLT5ldmVudHMuYnRlbXBfdW5kZXJvdmVyID0gZmFsc2U7Ci0JCWRpLT5ldmVudHMuYnRlbXBfbG93aGlnaCA9IGZhbHNlOwotCQlkaS0+dF9oeXN0X25vcm0gPSAwOwotCQlkaS0+dF9oeXN0X2xvd2hpZ2ggPSAwOwotCX0gZWxzZSB7Ci0JCWlmICgoKGRpLT5iYXR0X2RhdGEudGVtcCA+PSBkaS0+Ym0tPnRlbXBfaGlnaCkgJiYKLQkJCShkaS0+YmF0dF9kYXRhLnRlbXAgPAotCQkJCShkaS0+Ym0tPnRlbXBfb3ZlciAtIGRpLT50X2h5c3RfbG93aGlnaCkpKSB8fAotCQkJKChkaS0+YmF0dF9kYXRhLnRlbXAgPgotCQkJCShkaS0+Ym0tPnRlbXBfdW5kZXIgKyBkaS0+dF9oeXN0X2xvd2hpZ2gpKSAmJgotCQkJKGRpLT5iYXR0X2RhdGEudGVtcCA8PSBkaS0+Ym0tPnRlbXBfbG93KSkpIHsKLQkJCS8qIFRFTVAgbWlub3IhISEhISAqLwotCQkJZGktPmV2ZW50cy5idGVtcF91bmRlcm92ZXIgPSBmYWxzZTsKLQkJCWRpLT5ldmVudHMuYnRlbXBfbG93aGlnaCA9IHRydWU7Ci0JCQlkaS0+dF9oeXN0X25vcm0gPSBkaS0+Ym0tPnRlbXBfaHlzdGVyZXNpczsKLQkJCWRpLT50X2h5c3RfbG93aGlnaCA9IDA7Ci0JCX0gZWxzZSBpZiAoZGktPmJhdHRfZGF0YS50ZW1wIDw9IGRpLT5ibS0+dGVtcF91bmRlciB8fAotCQkJZGktPmJhdHRfZGF0YS50ZW1wID49IGRpLT5ibS0+dGVtcF9vdmVyKSB7Ci0JCQkvKiBURU1QIG1ham9yISEhISEgKi8KLQkJCWRpLT5ldmVudHMuYnRlbXBfdW5kZXJvdmVyID0gdHJ1ZTsKLQkJCWRpLT5ldmVudHMuYnRlbXBfbG93aGlnaCA9IGZhbHNlOwotCQkJZGktPnRfaHlzdF9ub3JtID0gMDsKLQkJCWRpLT50X2h5c3RfbG93aGlnaCA9IGRpLT5ibS0+dGVtcF9oeXN0ZXJlc2lzOwotCQl9IGVsc2UgewotCQkvKiBXaXRoaW4gaHlzdGVyZXNpcyAqLwotCQlkZXZfZGJnKGRpLT5kZXYsICJXaXRoaW4gaHlzdGVyZXNpcyBsaW1pdCB0ZW1wOiAlZCAiCi0JCQkJImh5c3RfbG93aGlnaCAlZCwgaHlzdCBub3JtYWwgJWRcbiIsCi0JCQkJZGktPmJhdHRfZGF0YS50ZW1wLCBkaS0+dF9oeXN0X2xvd2hpZ2gsCi0JCQkJZGktPnRfaHlzdF9ub3JtKTsKLQkJfQotCX0KLX0KLQotLyoqCi0gKiBhYng1MDBfY2hhcmdhbGdfY2hlY2tfY2hhcmdlcl92b2x0YWdlKCkgLSBDaGVjayBjaGFyZ2VyIHZvbHRhZ2UKLSAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFieDUwMF9jaGFyZ2FsZyBzdHJ1Y3R1cmUKLSAqCi0gKiBDaGFyZ2VyIHZvbHRhZ2UgaXMgY2hlY2tlZCBhZ2FpbnN0IG1heGltdW0gbGltaXQKLSAqLwotc3RhdGljIHZvaWQgYWJ4NTAwX2NoYXJnYWxnX2NoZWNrX2NoYXJnZXJfdm9sdGFnZShzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSkKLXsKLQlpZiAoZGktPmNoZ19pbmZvLnVzYl92b2x0ID4gZGktPmJtLT5jaGdfcGFyYW1zLT51c2Jfdm9sdF9tYXgpCi0JCWRpLT5jaGdfaW5mby51c2JfY2hnX29rID0gZmFsc2U7Ci0JZWxzZQotCQlkaS0+Y2hnX2luZm8udXNiX2NoZ19vayA9IHRydWU7Ci0KLQlpZiAoZGktPmNoZ19pbmZvLmFjX3ZvbHQgPiBkaS0+Ym0tPmNoZ19wYXJhbXMtPmFjX3ZvbHRfbWF4KQotCQlkaS0+Y2hnX2luZm8uYWNfY2hnX29rID0gZmFsc2U7Ci0JZWxzZQotCQlkaS0+Y2hnX2luZm8uYWNfY2hnX29rID0gdHJ1ZTsKLQotfQotCi0vKioKLSAqIGFieDUwMF9jaGFyZ2FsZ19lbmRfb2ZfY2hhcmdlKCkgLSBDaGVjayBpZiBlbmQtb2YtY2hhcmdlIGNyaXRlcmlhIGlzIGZ1bGZpbGxlZAotICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWJ4NTAwX2NoYXJnYWxnIHN0cnVjdHVyZQotICoKLSAqIEVuZC1vZi1jaGFyZ2UgY3JpdGVyaWEgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIGJhdHRlcnkgdm9sdGFnZSBpcyBhYm92ZSBhCi0gKiBjZXJ0YWluIGxpbWl0IGFuZCB0aGUgYmF0dGVyeSBjdXJyZW50IGlzIGJlbG93IGEgY2VydGFpbiBsaW1pdCBmb3IgYQotICogcHJlZGVmaW5lZCBudW1iZXIgb2YgY29uc2VjdXRpdmUgc2Vjb25kcy4gSWYgdHJ1ZSwgdGhlIGJhdHRlcnkgaXMgZnVsbAotICovCi1zdGF0aWMgdm9pZCBhYng1MDBfY2hhcmdhbGdfZW5kX29mX2NoYXJnZShzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSkKLXsKLQlpZiAoZGktPmNoYXJnZV9zdGF0dXMgPT0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORyAmJgotCQlkaS0+Y2hhcmdlX3N0YXRlID09IFNUQVRFX05PUk1BTCAmJgotCQkhZGktPm1haW50ZW5hbmNlX2NoZyAmJiAoZGktPmJhdHRfZGF0YS52b2x0ID49Ci0JCWRpLT5ibS0+YmF0X3R5cGVbZGktPmJtLT5iYXR0X2lkXS50ZXJtaW5hdGlvbl92b2wgfHwKLQkJZGktPmV2ZW50cy51c2JfY3ZfYWN0aXZlIHx8IGRpLT5ldmVudHMuYWNfY3ZfYWN0aXZlKSAmJgotCQlkaS0+YmF0dF9kYXRhLmF2Z19jdXJyIDwKLQkJZGktPmJtLT5iYXRfdHlwZVtkaS0+Ym0tPmJhdHRfaWRdLnRlcm1pbmF0aW9uX2N1cnIgJiYKLQkJZGktPmJhdHRfZGF0YS5hdmdfY3VyciA+IDApIHsKLQkJaWYgKCsrZGktPmVvY19jbnQgPj0gRU9DX0NPTkRfQ05UKSB7Ci0JCQlkaS0+ZW9jX2NudCA9IDA7Ci0JCQlpZiAoKGRpLT5jaGdfaW5mby5jaGFyZ2VyX3R5cGUgJiBVU0JfQ0hHKSAmJgotCQkJICAgKGRpLT51c2JfY2hnLT5wb3dlcl9wYXRoKSkKLQkJCQlhYjg1NDBfY2hhcmdhbGdfdXNiX3BwX2VuKGRpLCB0cnVlKTsKLQkJCWRpLT5jaGFyZ2Vfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19GVUxMOwotCQkJZGktPm1haW50ZW5hbmNlX2NoZyA9IHRydWU7Ci0JCQlkZXZfZGJnKGRpLT5kZXYsICJFT0MgcmVhY2hlZCFcbiIpOwotCQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGktPmNoYXJnYWxnX3BzeSk7Ci0JCX0gZWxzZSB7Ci0JCQlkZXZfZGJnKGRpLT5kZXYsCi0JCQkJIiBFT0MgbGltaXQgcmVhY2hlZCBmb3IgdGhlICVkIgotCQkJCSIgdGltZSwgb3V0IG9mICVkIGJlZm9yZSBFT0NcbiIsCi0JCQkJZGktPmVvY19jbnQsCi0JCQkJRU9DX0NPTkRfQ05UKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWRpLT5lb2NfY250ID0gMDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGluaXRfbWF4aW1fY2hnX2N1cnIoc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGkpCi17Ci0JZGktPmNjbS5vcmlnaW5hbF9pc2V0ID0KLQkJZGktPmJtLT5iYXRfdHlwZVtkaS0+Ym0tPmJhdHRfaWRdLm5vcm1hbF9jdXJfbHZsOwotCWRpLT5jY20uY3VycmVudF9pc2V0ID0KLQkJZGktPmJtLT5iYXRfdHlwZVtkaS0+Ym0tPmJhdHRfaWRdLm5vcm1hbF9jdXJfbHZsOwotCWRpLT5jY20udGVzdF9kZWx0YV9pID0gZGktPmJtLT5tYXhpLT5jaGFyZ2VyX2N1cnJfc3RlcDsKLQlkaS0+Y2NtLm1heF9jdXJyZW50ID0gZGktPmJtLT5tYXhpLT5jaGdfY3VycjsKLQlkaS0+Y2NtLmNvbmRpdGlvbl9jbnQgPSBkaS0+Ym0tPm1heGktPndhaXRfY3ljbGVzOwotCWRpLT5jY20ubGV2ZWwgPSAwOwotfQotCi0vKioKLSAqIGFieDUwMF9jaGFyZ2FsZ19jaGdfY3Vycl9tYXhpbSAtIGluY3JlYXNlcyB0aGUgY2hhcmdlciBjdXJyZW50IHRvCi0gKgkJCWNvbXBlbnNhdGUgZm9yIHRoZSBzeXN0ZW0gbG9hZAotICogQGRpCQlwb2ludGVyIHRvIHRoZSBhYng1MDBfY2hhcmdhbGcgc3RydWN0dXJlCi0gKgotICogVGhpcyBtYXhpbWl6YXRpb24gZnVuY3Rpb24gaXMgdXNlZCB0byByYWlzZSB0aGUgY2hhcmdlciBjdXJyZW50IHRvIGdldCB0aGUKLSAqIGJhdHRlcnkgY3VycmVudCBhcyBjbG9zZSB0byB0aGUgb3B0aW1hbCB2YWx1ZSBhcyBwb3NzaWJsZS4gVGhlIGJhdHRlcnkKLSAqIGN1cnJlbnQgZHVyaW5nIGNoYXJnaW5nIGlzIGFmZmVjdGVkIGJ5IHRoZSBzeXN0ZW0gbG9hZAotICovCi1zdGF0aWMgZW51bSBtYXhpbV9yZXQgYWJ4NTAwX2NoYXJnYWxnX2NoZ19jdXJyX21heGltKHN0cnVjdCBhYng1MDBfY2hhcmdhbGcgKmRpKQotewotCWludCBkZWx0YV9pOwotCi0JaWYgKCFkaS0+Ym0tPm1heGktPmVuYV9tYXhpKQotCQlyZXR1cm4gTUFYSU1fUkVUX05PQUNUSU9OOwotCi0JZGVsdGFfaSA9IGRpLT5jY20ub3JpZ2luYWxfaXNldCAtIGRpLT5iYXR0X2RhdGEuaW5zdF9jdXJyOwotCi0JaWYgKGRpLT5ldmVudHMudmJ1c19jb2xsYXBzZWQpIHsKLQkJZGV2X2RiZyhkaS0+ZGV2LCAiQ2hhcmdlciB2b2x0YWdlIGhhcyBjb2xsYXBzZWQgJWRcbiIsCi0JCQkJZGktPmNjbS53YWl0X2NudCk7Ci0JCWlmIChkaS0+Y2NtLndhaXRfY250ID09IDApIHsKLQkJCWRldl9kYmcoZGktPmRldiwgImxvd2VyaW5nIGN1cnJlbnRcbiIpOwotCQkJZGktPmNjbS53YWl0X2NudCsrOwotCQkJZGktPmNjbS5jb25kaXRpb25fY250ID0gZGktPmJtLT5tYXhpLT53YWl0X2N5Y2xlczsKLQkJCWRpLT5jY20ubWF4X2N1cnJlbnQgPQotCQkJCWRpLT5jY20uY3VycmVudF9pc2V0IC0gZGktPmNjbS50ZXN0X2RlbHRhX2k7Ci0JCQlkaS0+Y2NtLmN1cnJlbnRfaXNldCA9IGRpLT5jY20ubWF4X2N1cnJlbnQ7Ci0JCQlkaS0+Y2NtLmxldmVsLS07Ci0JCQlyZXR1cm4gTUFYSU1fUkVUX0NIQU5HRTsKLQkJfSBlbHNlIHsKLQkJCWRldl9kYmcoZGktPmRldiwgIndhaXRpbmdcbiIpOwotCQkJLyogTGV0J3MgZ28gaW4gaGVyZSB0d2ljZSBiZWZvcmUgbG93ZXJpbmcgY3VyciBhZ2FpbiAqLwotCQkJZGktPmNjbS53YWl0X2NudCA9IChkaS0+Y2NtLndhaXRfY250ICsgMSkgJSAzOwotCQkJcmV0dXJuIE1BWElNX1JFVF9OT0FDVElPTjsKLQkJfQotCX0KLQotCWRpLT5jY20ud2FpdF9jbnQgPSAwOwotCi0JaWYgKChkaS0+YmF0dF9kYXRhLmluc3RfY3VyciA+IGRpLT5jY20ub3JpZ2luYWxfaXNldCkpIHsKLQkJZGV2X2RiZyhkaS0+ZGV2LCAiIE1heGltaXphdGlvbiBJYmF0ICglZG1BKSB0b28gaGlnaCIKLQkJCSIgKGxpbWl0ICVkbUEpIChjdXJyZW50IGlzZXQ6ICVkbUEpIVxuIiwKLQkJCWRpLT5iYXR0X2RhdGEuaW5zdF9jdXJyLCBkaS0+Y2NtLm9yaWdpbmFsX2lzZXQsCi0JCQlkaS0+Y2NtLmN1cnJlbnRfaXNldCk7Ci0KLQkJaWYgKGRpLT5jY20uY3VycmVudF9pc2V0ID09IGRpLT5jY20ub3JpZ2luYWxfaXNldCkKLQkJCXJldHVybiBNQVhJTV9SRVRfTk9BQ1RJT047Ci0KLQkJZGktPmNjbS5jb25kaXRpb25fY250ID0gZGktPmJtLT5tYXhpLT53YWl0X2N5Y2xlczsKLQkJZGktPmNjbS5jdXJyZW50X2lzZXQgPSBkaS0+Y2NtLm9yaWdpbmFsX2lzZXQ7Ci0JCWRpLT5jY20ubGV2ZWwgPSAwOwotCi0JCXJldHVybiBNQVhJTV9SRVRfSUJBVF9UT09fSElHSDsKLQl9Ci0KLQlpZiAoZGVsdGFfaSA+IGRpLT5jY20udGVzdF9kZWx0YV9pICYmCi0JCShkaS0+Y2NtLmN1cnJlbnRfaXNldCArIGRpLT5jY20udGVzdF9kZWx0YV9pKSA8Ci0JCWRpLT5jY20ubWF4X2N1cnJlbnQpIHsKLQkJaWYgKGRpLT5jY20uY29uZGl0aW9uX2NudC0tID09IDApIHsKLQkJCS8qIEluY3Jlc2UgdGhlIGlzZXQgd2l0aCBjY28udGVzdF9kZWx0YV9pICovCi0JCQlkaS0+Y2NtLmNvbmRpdGlvbl9jbnQgPSBkaS0+Ym0tPm1heGktPndhaXRfY3ljbGVzOwotCQkJZGktPmNjbS5jdXJyZW50X2lzZXQgKz0gZGktPmNjbS50ZXN0X2RlbHRhX2k7Ci0JCQlkaS0+Y2NtLmxldmVsKys7Ci0JCQlkZXZfZGJnKGRpLT5kZXYsICIgTWF4aW1pemF0aW9uIG5lZWRlZCwgaW5jcmVhc2UiCi0JCQkJIiB3aXRoICVkIG1BIHRvICVkbUEgKE9wdGltYWwgaWJhdDogJWQpIgotCQkJCSIgTGV2ZWwgJWRcbiIsCi0JCQkJZGktPmNjbS50ZXN0X2RlbHRhX2ksCi0JCQkJZGktPmNjbS5jdXJyZW50X2lzZXQsCi0JCQkJZGktPmNjbS5vcmlnaW5hbF9pc2V0LAotCQkJCWRpLT5jY20ubGV2ZWwpOwotCQkJcmV0dXJuIE1BWElNX1JFVF9DSEFOR0U7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gTUFYSU1fUkVUX05PQUNUSU9OOwotCQl9Ci0JfSAgZWxzZSB7Ci0JCWRpLT5jY20uY29uZGl0aW9uX2NudCA9IGRpLT5ibS0+bWF4aS0+d2FpdF9jeWNsZXM7Ci0JCXJldHVybiBNQVhJTV9SRVRfTk9BQ1RJT047Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBoYW5kbGVfbWF4aW1fY2hnX2N1cnIoc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGkpCi17Ci0JZW51bSBtYXhpbV9yZXQgcmV0OwotCWludCByZXN1bHQ7Ci0KLQlyZXQgPSBhYng1MDBfY2hhcmdhbGdfY2hnX2N1cnJfbWF4aW0oZGkpOwotCXN3aXRjaCAocmV0KSB7Ci0JY2FzZSBNQVhJTV9SRVRfQ0hBTkdFOgotCQlyZXN1bHQgPSBhYng1MDBfY2hhcmdhbGdfdXBkYXRlX2NoZ19jdXJyKGRpLAotCQkJZGktPmNjbS5jdXJyZW50X2lzZXQpOwotCQlpZiAocmVzdWx0KQotCQkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIHNldCBjaGcgY3VyclxuIik7Ci0JCWJyZWFrOwotCWNhc2UgTUFYSU1fUkVUX0lCQVRfVE9PX0hJR0g6Ci0JCXJlc3VsdCA9IGFieDUwMF9jaGFyZ2FsZ191cGRhdGVfY2hnX2N1cnIoZGksCi0JCQlkaS0+Ym0tPmJhdF90eXBlW2RpLT5ibS0+YmF0dF9pZF0ubm9ybWFsX2N1cl9sdmwpOwotCQlpZiAocmVzdWx0KQotCQkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIHNldCBjaGcgY3VyclxuIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBNQVhJTV9SRVRfTk9BQ1RJT046Ci0JZGVmYXVsdDoKLQkJLyogRG8gbm90aGluZy4uKi8KLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgaW50IGFieDUwMF9jaGFyZ2FsZ19nZXRfZXh0X3BzeV9kYXRhKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3k7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqZXh0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JY29uc3QgY2hhciAqKnN1cHBsaWNhbnRzID0gKGNvbnN0IGNoYXIgKiopZXh0LT5zdXBwbGllZF90bzsKLQlzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaTsKLQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCByZXQ7Ci0JaW50IGo7Ci0JYm9vbCBjYXBhY2l0eV91cGRhdGVkID0gZmFsc2U7Ci0KLQlwc3kgPSAoc3RydWN0IHBvd2VyX3N1cHBseSAqKWRhdGE7Ci0JZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKLQkvKiBGb3IgYWxsIHBzeSB3aGVyZSB0aGUgZHJpdmVyIG5hbWUgYXBwZWFycyBpbiBhbnkgc3VwcGxpZWRfdG8gKi8KLQlqID0gbWF0Y2hfc3RyaW5nKHN1cHBsaWNhbnRzLCBleHQtPm51bV9zdXBwbGljYW50cywgcHN5LT5kZXNjLT5uYW1lKTsKLQlpZiAoaiA8IDApCi0JCXJldHVybiAwOwotCi0JLyoKLQkgKiAgSWYgZXh0ZXJuYWwgaXMgbm90IHJlZ2lzdGVyaW5nICdQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWScgdG8gaXRzCi0JICogcHJvcGVydHkgYmVjYXVzZSBvZiBoYW5kbGluZyB0aGF0IHN5c2ZzIGVudHJ5IG9uIGl0cyBvd24sIHRoaXMgaXMKLQkgKiB0aGUgcGxhY2UgdG8gZ2V0IHRoZSBiYXR0ZXJ5IGNhcGFjaXR5LgotCSAqLwotCWlmICghcG93ZXJfc3VwcGx5X2dldF9wcm9wZXJ0eShleHQsIFBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZLCAmcmV0KSkgewotCQlkaS0+YmF0dF9kYXRhLnBlcmNlbnQgPSByZXQuaW50dmFsOwotCQljYXBhY2l0eV91cGRhdGVkID0gdHJ1ZTsKLQl9Ci0KLQkvKiBHbyB0aHJvdWdoIGFsbCBwcm9wZXJ0aWVzIGZvciB0aGUgcHN5ICovCi0JZm9yIChqID0gMDsgaiA8IGV4dC0+ZGVzYy0+bnVtX3Byb3BlcnRpZXM7IGorKykgewotCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwcm9wOwotCQlwcm9wID0gZXh0LT5kZXNjLT5wcm9wZXJ0aWVzW2pdOwotCi0JCS8qCi0JCSAqIEluaXRpYWxpemUgY2hhcmdlcnMgaWYgbm90IGFscmVhZHkgZG9uZS4KLQkJICogVGhlIGFiODUwMF9jaGFyZ2VyKi8KLQkJaWYgKCFkaS0+YWNfY2hnICYmCi0JCQlleHQtPmRlc2MtPnR5cGUgPT0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlMpCi0JCQlkaS0+YWNfY2hnID0gcHN5X3RvX3V4NTAwX2NoYXJnZXIoZXh0KTsKLQkJZWxzZSBpZiAoIWRpLT51c2JfY2hnICYmCi0JCQlleHQtPmRlc2MtPnR5cGUgPT0gUE9XRVJfU1VQUExZX1RZUEVfVVNCKQotCQkJZGktPnVzYl9jaGcgPSBwc3lfdG9fdXg1MDBfY2hhcmdlcihleHQpOwotCi0JCWlmIChwb3dlcl9zdXBwbHlfZ2V0X3Byb3BlcnR5KGV4dCwgcHJvcCwgJnJldCkpCi0JCQljb250aW51ZTsKLQkJc3dpdGNoIChwcm9wKSB7Ci0JCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDoKLQkJCXN3aXRjaCAoZXh0LT5kZXNjLT50eXBlKSB7Ci0JCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk6Ci0JCQkJLyogQmF0dGVyeSBwcmVzZW50ICovCi0JCQkJaWYgKHJldC5pbnR2YWwpCi0JCQkJCWRpLT5ldmVudHMuYmF0dF9yZW0gPSBmYWxzZTsKLQkJCQkvKiBCYXR0ZXJ5IHJlbW92ZWQgKi8KLQkJCQllbHNlCi0JCQkJCWRpLT5ldmVudHMuYmF0dF9yZW0gPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUzoKLQkJCQkvKiBBQyBkaXNjb25uZWN0ZWQgKi8KLQkJCQlpZiAoIXJldC5pbnR2YWwgJiYKLQkJCQkJKGRpLT5jaGdfaW5mby5jb25uX2NoZyAmIEFDX0NIRykpIHsKLQkJCQkJZGktPmNoZ19pbmZvLnByZXZfY29ubl9jaGcgPQotCQkJCQkJZGktPmNoZ19pbmZvLmNvbm5fY2hnOwotCQkJCQlkaS0+Y2hnX2luZm8uY29ubl9jaGcgJj0gfkFDX0NIRzsKLQkJCQl9Ci0JCQkJLyogQUMgY29ubmVjdGVkICovCi0JCQkJZWxzZSBpZiAocmV0LmludHZhbCAmJgotCQkJCQkhKGRpLT5jaGdfaW5mby5jb25uX2NoZyAmIEFDX0NIRykpIHsKLQkJCQkJZGktPmNoZ19pbmZvLnByZXZfY29ubl9jaGcgPQotCQkJCQkJZGktPmNoZ19pbmZvLmNvbm5fY2hnOwotCQkJCQlkaS0+Y2hnX2luZm8uY29ubl9jaGcgfD0gQUNfQ0hHOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgUE9XRVJfU1VQUExZX1RZUEVfVVNCOgotCQkJCS8qIFVTQiBkaXNjb25uZWN0ZWQgKi8KLQkJCQlpZiAoIXJldC5pbnR2YWwgJiYKLQkJCQkJKGRpLT5jaGdfaW5mby5jb25uX2NoZyAmIFVTQl9DSEcpKSB7Ci0JCQkJCWRpLT5jaGdfaW5mby5wcmV2X2Nvbm5fY2hnID0KLQkJCQkJCWRpLT5jaGdfaW5mby5jb25uX2NoZzsKLQkJCQkJZGktPmNoZ19pbmZvLmNvbm5fY2hnICY9IH5VU0JfQ0hHOwotCQkJCX0KLQkJCQkvKiBVU0IgY29ubmVjdGVkICovCi0JCQkJZWxzZSBpZiAocmV0LmludHZhbCAmJgotCQkJCQkhKGRpLT5jaGdfaW5mby5jb25uX2NoZyAmIFVTQl9DSEcpKSB7Ci0JCQkJCWRpLT5jaGdfaW5mby5wcmV2X2Nvbm5fY2hnID0KLQkJCQkJCWRpLT5jaGdfaW5mby5jb25uX2NoZzsKLQkJCQkJZGktPmNoZ19pbmZvLmNvbm5fY2hnIHw9IFVTQl9DSEc7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FOgotCQkJc3dpdGNoIChleHQtPmRlc2MtPnR5cGUpIHsKLQkJCWNhc2UgUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWToKLQkJCQlicmVhazsKLQkJCWNhc2UgUE9XRVJfU1VQUExZX1RZUEVfTUFJTlM6Ci0JCQkJLyogQUMgb2ZmbGluZSAqLwotCQkJCWlmICghcmV0LmludHZhbCAmJgotCQkJCQkoZGktPmNoZ19pbmZvLm9ubGluZV9jaGcgJiBBQ19DSEcpKSB7Ci0JCQkJCWRpLT5jaGdfaW5mby5wcmV2X29ubGluZV9jaGcgPQotCQkJCQkJZGktPmNoZ19pbmZvLm9ubGluZV9jaGc7Ci0JCQkJCWRpLT5jaGdfaW5mby5vbmxpbmVfY2hnICY9IH5BQ19DSEc7Ci0JCQkJfQotCQkJCS8qIEFDIG9ubGluZSAqLwotCQkJCWVsc2UgaWYgKHJldC5pbnR2YWwgJiYKLQkJCQkJIShkaS0+Y2hnX2luZm8ub25saW5lX2NoZyAmIEFDX0NIRykpIHsKLQkJCQkJZGktPmNoZ19pbmZvLnByZXZfb25saW5lX2NoZyA9Ci0JCQkJCQlkaS0+Y2hnX2luZm8ub25saW5lX2NoZzsKLQkJCQkJZGktPmNoZ19pbmZvLm9ubGluZV9jaGcgfD0gQUNfQ0hHOwotCQkJCQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmNoYXJnYWxnX3dxLAotCQkJCQkJJmRpLT5jaGFyZ2FsZ193ZF93b3JrLCAwKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX1VTQjoKLQkJCQkvKiBVU0Igb2ZmbGluZSAqLwotCQkJCWlmICghcmV0LmludHZhbCAmJgotCQkJCQkoZGktPmNoZ19pbmZvLm9ubGluZV9jaGcgJiBVU0JfQ0hHKSkgewotCQkJCQlkaS0+Y2hnX2luZm8ucHJldl9vbmxpbmVfY2hnID0KLQkJCQkJCWRpLT5jaGdfaW5mby5vbmxpbmVfY2hnOwotCQkJCQlkaS0+Y2hnX2luZm8ub25saW5lX2NoZyAmPSB+VVNCX0NIRzsKLQkJCQl9Ci0JCQkJLyogVVNCIG9ubGluZSAqLwotCQkJCWVsc2UgaWYgKHJldC5pbnR2YWwgJiYKLQkJCQkJIShkaS0+Y2hnX2luZm8ub25saW5lX2NoZyAmIFVTQl9DSEcpKSB7Ci0JCQkJCWRpLT5jaGdfaW5mby5wcmV2X29ubGluZV9jaGcgPQotCQkJCQkJZGktPmNoZ19pbmZvLm9ubGluZV9jaGc7Ci0JCQkJCWRpLT5jaGdfaW5mby5vbmxpbmVfY2hnIHw9IFVTQl9DSEc7Ci0JCQkJCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Y2hhcmdhbGdfd3EsCi0JCQkJCQkmZGktPmNoYXJnYWxnX3dkX3dvcmssIDApOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSDoKLQkJCXN3aXRjaCAoZXh0LT5kZXNjLT50eXBlKSB7Ci0JCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk6Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TOgotCQkJCXN3aXRjaCAocmV0LmludHZhbCkgewotCQkJCWNhc2UgUE9XRVJfU1VQUExZX0hFQUxUSF9VTlNQRUNfRkFJTFVSRToKLQkJCQkJZGktPmV2ZW50cy5tYWluZXh0Y2hub3RvayA9IHRydWU7Ci0JCQkJCWRpLT5ldmVudHMubWFpbl90aGVybWFsX3Byb3QgPSBmYWxzZTsKLQkJCQkJZGktPmV2ZW50cy5tYWluX292diA9IGZhbHNlOwotCQkJCQlkaS0+ZXZlbnRzLmFjX3dkX2V4cGlyZWQgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQT1dFUl9TVVBQTFlfSEVBTFRIX0RFQUQ6Ci0JCQkJCWRpLT5ldmVudHMuYWNfd2RfZXhwaXJlZCA9IHRydWU7Ci0JCQkJCWRpLT5ldmVudHMubWFpbmV4dGNobm90b2sgPSBmYWxzZTsKLQkJCQkJZGktPmV2ZW50cy5tYWluX292diA9IGZhbHNlOwotCQkJCQlkaS0+ZXZlbnRzLm1haW5fdGhlcm1hbF9wcm90ID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUE9XRVJfU1VQUExZX0hFQUxUSF9DT0xEOgotCQkJCWNhc2UgUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSSEVBVDoKLQkJCQkJZGktPmV2ZW50cy5tYWluX3RoZXJtYWxfcHJvdCA9IHRydWU7Ci0JCQkJCWRpLT5ldmVudHMubWFpbmV4dGNobm90b2sgPSBmYWxzZTsKLQkJCQkJZGktPmV2ZW50cy5tYWluX292diA9IGZhbHNlOwotCQkJCQlkaS0+ZXZlbnRzLmFjX3dkX2V4cGlyZWQgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJWT0xUQUdFOgotCQkJCQlkaS0+ZXZlbnRzLm1haW5fb3Z2ID0gdHJ1ZTsKLQkJCQkJZGktPmV2ZW50cy5tYWluZXh0Y2hub3RvayA9IGZhbHNlOwotCQkJCQlkaS0+ZXZlbnRzLm1haW5fdGhlcm1hbF9wcm90ID0gZmFsc2U7Ci0JCQkJCWRpLT5ldmVudHMuYWNfd2RfZXhwaXJlZCA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFBPV0VSX1NVUFBMWV9IRUFMVEhfR09PRDoKLQkJCQkJZGktPmV2ZW50cy5tYWluX3RoZXJtYWxfcHJvdCA9IGZhbHNlOwotCQkJCQlkaS0+ZXZlbnRzLm1haW5leHRjaG5vdG9rID0gZmFsc2U7Ci0JCQkJCWRpLT5ldmVudHMubWFpbl9vdnYgPSBmYWxzZTsKLQkJCQkJZGktPmV2ZW50cy5hY193ZF9leHBpcmVkID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJY2FzZSBQT1dFUl9TVVBQTFlfVFlQRV9VU0I6Ci0JCQkJc3dpdGNoIChyZXQuaW50dmFsKSB7Ci0JCQkJY2FzZSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOU1BFQ19GQUlMVVJFOgotCQkJCQlkaS0+ZXZlbnRzLnVzYmNoYXJnZXJub3RvayA9IHRydWU7Ci0JCQkJCWRpLT5ldmVudHMudXNiX3RoZXJtYWxfcHJvdCA9IGZhbHNlOwotCQkJCQlkaS0+ZXZlbnRzLnZidXNfb3Z2ID0gZmFsc2U7Ci0JCQkJCWRpLT5ldmVudHMudXNiX3dkX2V4cGlyZWQgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQT1dFUl9TVVBQTFlfSEVBTFRIX0RFQUQ6Ci0JCQkJCWRpLT5ldmVudHMudXNiX3dkX2V4cGlyZWQgPSB0cnVlOwotCQkJCQlkaS0+ZXZlbnRzLnVzYmNoYXJnZXJub3RvayA9IGZhbHNlOwotCQkJCQlkaS0+ZXZlbnRzLnVzYl90aGVybWFsX3Byb3QgPSBmYWxzZTsKLQkJCQkJZGktPmV2ZW50cy52YnVzX292diA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFBPV0VSX1NVUFBMWV9IRUFMVEhfQ09MRDoKLQkJCQljYXNlIFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUkhFQVQ6Ci0JCQkJCWRpLT5ldmVudHMudXNiX3RoZXJtYWxfcHJvdCA9IHRydWU7Ci0JCQkJCWRpLT5ldmVudHMudXNiY2hhcmdlcm5vdG9rID0gZmFsc2U7Ci0JCQkJCWRpLT5ldmVudHMudmJ1c19vdnYgPSBmYWxzZTsKLQkJCQkJZGktPmV2ZW50cy51c2Jfd2RfZXhwaXJlZCA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUlZPTFRBR0U6Ci0JCQkJCWRpLT5ldmVudHMudmJ1c19vdnYgPSB0cnVlOwotCQkJCQlkaS0+ZXZlbnRzLnVzYmNoYXJnZXJub3RvayA9IGZhbHNlOwotCQkJCQlkaS0+ZXZlbnRzLnVzYl90aGVybWFsX3Byb3QgPSBmYWxzZTsKLQkJCQkJZGktPmV2ZW50cy51c2Jfd2RfZXhwaXJlZCA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFBPV0VSX1NVUFBMWV9IRUFMVEhfR09PRDoKLQkJCQkJZGktPmV2ZW50cy51c2JjaGFyZ2Vybm90b2sgPSBmYWxzZTsKLQkJCQkJZGktPmV2ZW50cy51c2JfdGhlcm1hbF9wcm90ID0gZmFsc2U7Ci0JCQkJCWRpLT5ldmVudHMudmJ1c19vdnYgPSBmYWxzZTsKLQkJCQkJZGktPmV2ZW50cy51c2Jfd2RfZXhwaXJlZCA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKLQkJCXN3aXRjaCAoZXh0LT5kZXNjLT50eXBlKSB7Ci0JCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk6Ci0JCQkJZGktPmJhdHRfZGF0YS52b2x0ID0gcmV0LmludHZhbCAvIDEwMDA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TOgotCQkJCWRpLT5jaGdfaW5mby5hY192b2x0ID0gcmV0LmludHZhbCAvIDEwMDA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX1VTQjoKLQkJCQlkaS0+Y2hnX2luZm8udXNiX3ZvbHQgPSByZXQuaW50dmFsIC8gMTAwMDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfQVZHOgotCQkJc3dpdGNoIChleHQtPmRlc2MtPnR5cGUpIHsKLQkJCWNhc2UgUE9XRVJfU1VQUExZX1RZUEVfTUFJTlM6Ci0JCQkJLyogQVZHIGlzIHVzZWQgdG8gaW5kaWNhdGUgd2hlbiB3ZSBhcmUKLQkJCQkgKiBpbiBDViBtb2RlICovCi0JCQkJaWYgKHJldC5pbnR2YWwpCi0JCQkJCWRpLT5ldmVudHMuYWNfY3ZfYWN0aXZlID0gdHJ1ZTsKLQkJCQllbHNlCi0JCQkJCWRpLT5ldmVudHMuYWNfY3ZfYWN0aXZlID0gZmFsc2U7Ci0KLQkJCQlicmVhazsKLQkJCWNhc2UgUE9XRVJfU1VQUExZX1RZUEVfVVNCOgotCQkJCS8qIEFWRyBpcyB1c2VkIHRvIGluZGljYXRlIHdoZW4gd2UgYXJlCi0JCQkJICogaW4gQ1YgbW9kZSAqLwotCQkJCWlmIChyZXQuaW50dmFsKQotCQkJCQlkaS0+ZXZlbnRzLnVzYl9jdl9hY3RpdmUgPSB0cnVlOwotCQkJCWVsc2UKLQkJCQkJZGktPmV2ZW50cy51c2JfY3ZfYWN0aXZlID0gZmFsc2U7Ci0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1k6Ci0JCQlzd2l0Y2ggKGV4dC0+ZGVzYy0+dHlwZSkgewotCQkJY2FzZSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOgotCQkJCWlmIChyZXQuaW50dmFsKQotCQkJCQlkaS0+ZXZlbnRzLmJhdHRfdW5rbm93biA9IGZhbHNlOwotCQkJCWVsc2UKLQkJCQkJZGktPmV2ZW50cy5iYXR0X3Vua25vd24gPSB0cnVlOwotCi0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QOgotCQkJZGktPmJhdHRfZGF0YS50ZW1wID0gcmV0LmludHZhbCAvIDEwOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVzoKLQkJCXN3aXRjaCAoZXh0LT5kZXNjLT50eXBlKSB7Ci0JCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TOgotCQkJCQlkaS0+Y2hnX2luZm8uYWNfY3VyciA9Ci0JCQkJCQlyZXQuaW50dmFsIC8gMTAwMDsKLQkJCQkJYnJlYWs7Ci0JCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX1VTQjoKLQkJCQkJZGktPmNoZ19pbmZvLnVzYl9jdXJyID0KLQkJCQkJCXJldC5pbnR2YWwgLyAxMDAwOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOgotCQkJCWRpLT5iYXR0X2RhdGEuaW5zdF9jdXJyID0gcmV0LmludHZhbCAvIDEwMDA7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX0FWRzoKLQkJCXN3aXRjaCAoZXh0LT5kZXNjLT50eXBlKSB7Ci0JCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk6Ci0JCQkJZGktPmJhdHRfZGF0YS5hdmdfY3VyciA9IHJldC5pbnR2YWwgLyAxMDAwOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQT1dFUl9TVVBQTFlfVFlQRV9VU0I6Ci0JCQkJaWYgKHJldC5pbnR2YWwpCi0JCQkJCWRpLT5ldmVudHMudmJ1c19jb2xsYXBzZWQgPSB0cnVlOwotCQkJCWVsc2UKLQkJCQkJZGktPmV2ZW50cy52YnVzX2NvbGxhcHNlZCA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZOgotCQkJaWYgKCFjYXBhY2l0eV91cGRhdGVkKQotCQkJCWRpLT5iYXR0X2RhdGEucGVyY2VudCA9IHJldC5pbnR2YWw7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGFieDUwMF9jaGFyZ2FsZ19leHRlcm5hbF9wb3dlcl9jaGFuZ2VkKCkgLSBjYWxsYmFjayBmb3IgcG93ZXIgc3VwcGx5IGNoYW5nZXMKLSAqIEBwc3k6ICAgICAgIHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSBwb3dlcl9zdXBwbHkKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBlbnRyeSBwb2ludCBvZiB0aGUgcG9pbnRlciBleHRlcm5hbF9wb3dlcl9jaGFuZ2VkCi0gKiBvZiB0aGUgc3RydWN0dXJlIHBvd2VyX3N1cHBseS4KLSAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBleGVjdXRlZCB3aGVuIHRoZXJlIGlzIGEgY2hhbmdlIGluIGFueSBleHRlcm5hbCBwb3dlcgotICogc3VwcGx5IHRoYXQgdGhpcyBkcml2ZXIgbmVlZHMgdG8gYmUgbm90aWZpZWQgb2YuCi0gKi8KLXN0YXRpYyB2b2lkIGFieDUwMF9jaGFyZ2FsZ19leHRlcm5hbF9wb3dlcl9jaGFuZ2VkKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSkKLXsKLQlzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwotCi0JLyoKLQkgKiBUcmlnZ2VyIGV4ZWN1dGlvbiBvZiB0aGUgYWxnb3JpdGhtIGluc3RhbnRseSBhbmQgcmVhZAotCSAqIGFsbCBwb3dlcl9zdXBwbHkgcHJvcGVydGllcyB0aGVyZSBpbnN0ZWFkCi0JICovCi0JcXVldWVfd29yayhkaS0+Y2hhcmdhbGdfd3EsICZkaS0+Y2hhcmdhbGdfd29yayk7Ci19Ci0KLS8qKgotICogYWJ4NTAwX2NoYXJnYWxnX2FsZ29yaXRobSgpIC0gTWFpbiBmdW5jdGlvbiBmb3IgdGhlIGFsZ29yaXRobQotICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWJ4NTAwX2NoYXJnYWxnIHN0cnVjdHVyZQotICoKLSAqIFRoaXMgaXMgdGhlIG1haW4gY29udHJvbCBmdW5jdGlvbiBmb3IgdGhlIGNoYXJnaW5nIGFsZ29yaXRobS4KLSAqIEl0IGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkgb3Igd2hlbiBzb21ldGhpbmcgaGFwcGVucyB0aGF0IHdpbGwKLSAqIHRyaWdnZXIgYSBzdGF0ZSBjaGFuZ2UKLSAqLwotc3RhdGljIHZvaWQgYWJ4NTAwX2NoYXJnYWxnX2FsZ29yaXRobShzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSkKLXsKLQlpbnQgY2hhcmdlcl9zdGF0dXM7Ci0JaW50IHJldDsKLQlpbnQgY3Vycl9zdGVwX2x2bDsKLQotCS8qIENvbGxlY3QgZGF0YSBmcm9tIGFsbCBwb3dlcl9zdXBwbHkgY2xhc3MgZGV2aWNlcyAqLwotCWNsYXNzX2Zvcl9lYWNoX2RldmljZShwb3dlcl9zdXBwbHlfY2xhc3MsIE5VTEwsCi0JCWRpLT5jaGFyZ2FsZ19wc3ksIGFieDUwMF9jaGFyZ2FsZ19nZXRfZXh0X3BzeV9kYXRhKTsKLQotCWFieDUwMF9jaGFyZ2FsZ19lbmRfb2ZfY2hhcmdlKGRpKTsKLQlhYng1MDBfY2hhcmdhbGdfY2hlY2tfdGVtcChkaSk7Ci0JYWJ4NTAwX2NoYXJnYWxnX2NoZWNrX2NoYXJnZXJfdm9sdGFnZShkaSk7Ci0KLQljaGFyZ2VyX3N0YXR1cyA9IGFieDUwMF9jaGFyZ2FsZ19jaGVja19jaGFyZ2VyX2Nvbm5lY3Rpb24oZGkpOwotCWFieDUwMF9jaGFyZ2FsZ19jaGVja19jdXJyZW50X3N0ZXBfc3RhdHVzKGRpKTsKLQotCWlmIChpc19hYjg1MDAoZGktPnBhcmVudCkpIHsKLQkJcmV0ID0gYWJ4NTAwX2NoYXJnYWxnX2NoZWNrX2NoYXJnZXJfZW5hYmxlKGRpKTsKLQkJaWYgKHJldCA8IDApCi0JCQlkZXZfZXJyKGRpLT5kZXYsICJDaGVja2luZyBjaGFyZ2VyIGlzIGVuYWJsZWQgZXJyb3IiCi0JCQkJCSI6IFJldHVybmVkIFZhbHVlICVkXG4iLCByZXQpOwotCX0KLQotCS8qCi0JICogRmlyc3QgY2hlY2sgaWYgd2UgaGF2ZSBhIGNoYXJnZXIgY29ubmVjdGVkLgotCSAqIEFsc28gd2UgZG9uJ3QgYWxsb3cgY2hhcmdpbmcgb2YgdW5rbm93biBiYXR0ZXJpZXMgaWYgY29uZmlndXJlZAotCSAqIHRoaXMgd2F5Ci0JICovCi0JaWYgKCFjaGFyZ2VyX3N0YXR1cyB8fAotCQkoZGktPmV2ZW50cy5iYXR0X3Vua25vd24gJiYgIWRpLT5ibS0+Y2hnX3Vua25vd25fYmF0KSkgewotCQlpZiAoZGktPmNoYXJnZV9zdGF0ZSAhPSBTVEFURV9IQU5ESEVMRCkgewotCQkJZGktPmV2ZW50cy5zYWZldHlfdGltZXJfZXhwaXJlZCA9IGZhbHNlOwotCQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9IQU5ESEVMRF9JTklUKTsKLQkJfQotCX0KLQotCS8qIElmIHN1c3BlbmRlZCwgd2Ugc2hvdWxkIG5vdCBjb250aW51ZSBjaGVja2luZyB0aGUgZmxhZ3MgKi8KLQllbHNlIGlmIChkaS0+Y2hhcmdlX3N0YXRlID09IFNUQVRFX1NVU1BFTkRFRF9JTklUIHx8Ci0JCWRpLT5jaGFyZ2Vfc3RhdGUgPT0gU1RBVEVfU1VTUEVOREVEKSB7Ci0JCS8qIFdlIGRvbid0IGRvIGFueXRoaW5nIGhlcmUsIGp1c3QgZG9uLHQgY29udGludWUgKi8KLQl9Ci0KLQkvKiBTYWZldHkgdGltZXIgZXhwaXJhdGlvbiAqLwotCWVsc2UgaWYgKGRpLT5ldmVudHMuc2FmZXR5X3RpbWVyX2V4cGlyZWQpIHsKLQkJaWYgKGRpLT5jaGFyZ2Vfc3RhdGUgIT0gU1RBVEVfU0FGRVRZX1RJTUVSX0VYUElSRUQpCi0JCQlhYng1MDBfY2hhcmdhbGdfc3RhdGVfdG8oZGksCi0JCQkJU1RBVEVfU0FGRVRZX1RJTUVSX0VYUElSRURfSU5JVCk7Ci0JfQotCS8qCi0JICogQ2hlY2sgaWYgYW55IGludGVycnVwdHMgaGFzIG9jY3VyZWQKLQkgKiB0aGF0IHdpbGwgcHJldmVudCB1cyBmcm9tIGNoYXJnaW5nCi0JICovCi0KLQkvKiBCYXR0ZXJ5IHJlbW92ZWQgKi8KLQllbHNlIGlmIChkaS0+ZXZlbnRzLmJhdHRfcmVtKSB7Ci0JCWlmIChkaS0+Y2hhcmdlX3N0YXRlICE9IFNUQVRFX0JBVFRfUkVNT1ZFRCkKLQkJCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfQkFUVF9SRU1PVkVEX0lOSVQpOwotCX0KLQkvKiBNYWluIG9yIFVTQiBjaGFyZ2VyIG5vdCBvay4gKi8KLQllbHNlIGlmIChkaS0+ZXZlbnRzLm1haW5leHRjaG5vdG9rIHx8IGRpLT5ldmVudHMudXNiY2hhcmdlcm5vdG9rKSB7Ci0JCS8qCi0JCSAqIElmIHZidXNfY29sbGFwc2VkIGlzIHNldCwgd2UgaGF2ZSB0byBsb3dlciB0aGUgY2hhcmdlcgotCQkgKiBjdXJyZW50LCB3aGljaCBpcyBkb25lIGluIHRoZSBub3JtYWwgc3RhdGUgYmVsb3cKLQkJICovCi0JCWlmIChkaS0+Y2hhcmdlX3N0YXRlICE9IFNUQVRFX0NIR19OT1RfT0sgJiYKLQkJCQkhZGktPmV2ZW50cy52YnVzX2NvbGxhcHNlZCkKLQkJCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfQ0hHX05PVF9PS19JTklUKTsKLQl9Ci0JLyogVkJVUywgTWFpbiBvciBWQkFUIE9WVi4gKi8KLQllbHNlIGlmIChkaS0+ZXZlbnRzLnZidXNfb3Z2IHx8Ci0JCQlkaS0+ZXZlbnRzLm1haW5fb3Z2IHx8Ci0JCQlkaS0+ZXZlbnRzLmJhdHRfb3Z2IHx8Ci0JCQkhZGktPmNoZ19pbmZvLnVzYl9jaGdfb2sgfHwKLQkJCSFkaS0+Y2hnX2luZm8uYWNfY2hnX29rKSB7Ci0JCWlmIChkaS0+Y2hhcmdlX3N0YXRlICE9IFNUQVRFX09WVl9QUk9URUNUKQotCQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9PVlZfUFJPVEVDVF9JTklUKTsKLQl9Ci0JLyogVVNCIFRoZXJtYWwsIHN0b3AgY2hhcmdpbmcgKi8KLQllbHNlIGlmIChkaS0+ZXZlbnRzLm1haW5fdGhlcm1hbF9wcm90IHx8Ci0JCWRpLT5ldmVudHMudXNiX3RoZXJtYWxfcHJvdCkgewotCQlpZiAoZGktPmNoYXJnZV9zdGF0ZSAhPSBTVEFURV9IV19URU1QX1BST1RFQ1QpCi0JCQlhYng1MDBfY2hhcmdhbGdfc3RhdGVfdG8oZGksCi0JCQkJU1RBVEVfSFdfVEVNUF9QUk9URUNUX0lOSVQpOwotCX0KLQkvKiBCYXR0ZXJ5IHRlbXAgb3Zlci91bmRlciAqLwotCWVsc2UgaWYgKGRpLT5ldmVudHMuYnRlbXBfdW5kZXJvdmVyKSB7Ci0JCWlmIChkaS0+Y2hhcmdlX3N0YXRlICE9IFNUQVRFX1RFTVBfVU5ERVJPVkVSKQotCQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLAotCQkJCVNUQVRFX1RFTVBfVU5ERVJPVkVSX0lOSVQpOwotCX0KLQkvKiBXYXRjaGRvZyBleHBpcmVkICovCi0JZWxzZSBpZiAoZGktPmV2ZW50cy5hY193ZF9leHBpcmVkIHx8Ci0JCWRpLT5ldmVudHMudXNiX3dkX2V4cGlyZWQpIHsKLQkJaWYgKGRpLT5jaGFyZ2Vfc3RhdGUgIT0gU1RBVEVfV0RfRVhQSVJFRCkKLQkJCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfV0RfRVhQSVJFRF9JTklUKTsKLQl9Ci0JLyogQmF0dGVyeSB0ZW1wIGhpZ2gvbG93ICovCi0JZWxzZSBpZiAoZGktPmV2ZW50cy5idGVtcF9sb3doaWdoKSB7Ci0JCWlmIChkaS0+Y2hhcmdlX3N0YXRlICE9IFNUQVRFX1RFTVBfTE9XSElHSCkKLQkJCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfVEVNUF9MT1dISUdIX0lOSVQpOwotCX0KLQotCWRldl9kYmcoZGktPmRldiwKLQkJIltDSEFSR0FMR10gVmIgJWQgSWJfYXZnICVkIEliX2luc3QgJWQgVGIgJWQgQ2FwICVkIE1haW50ICVkICIKLQkJIlN0YXRlICVzIEFjdGl2ZV9jaGcgJWQgQ2hnX3N0YXR1cyAlZCBBQyAlZCBVU0IgJWQgIgotCQkiQUNfb25saW5lICVkIFVTQl9vbmxpbmUgJWQgQUNfQ1YgJWQgVVNCX0NWICVkIEFDX0kgJWQgIgotCQkiVVNCX0kgJWQgQUNfVnNldCAlZCBBQ19Jc2V0ICVkIFVTQl9Wc2V0ICVkIFVTQl9Jc2V0ICVkXG4iLAotCQlkaS0+YmF0dF9kYXRhLnZvbHQsCi0JCWRpLT5iYXR0X2RhdGEuYXZnX2N1cnIsCi0JCWRpLT5iYXR0X2RhdGEuaW5zdF9jdXJyLAotCQlkaS0+YmF0dF9kYXRhLnRlbXAsCi0JCWRpLT5iYXR0X2RhdGEucGVyY2VudCwKLQkJZGktPm1haW50ZW5hbmNlX2NoZywKLQkJc3RhdGVzW2RpLT5jaGFyZ2Vfc3RhdGVdLAotCQlkaS0+Y2hnX2luZm8uY2hhcmdlcl90eXBlLAotCQlkaS0+Y2hhcmdlX3N0YXR1cywKLQkJZGktPmNoZ19pbmZvLmNvbm5fY2hnICYgQUNfQ0hHLAotCQlkaS0+Y2hnX2luZm8uY29ubl9jaGcgJiBVU0JfQ0hHLAotCQlkaS0+Y2hnX2luZm8ub25saW5lX2NoZyAmIEFDX0NIRywKLQkJZGktPmNoZ19pbmZvLm9ubGluZV9jaGcgJiBVU0JfQ0hHLAotCQlkaS0+ZXZlbnRzLmFjX2N2X2FjdGl2ZSwKLQkJZGktPmV2ZW50cy51c2JfY3ZfYWN0aXZlLAotCQlkaS0+Y2hnX2luZm8uYWNfY3VyciwKLQkJZGktPmNoZ19pbmZvLnVzYl9jdXJyLAotCQlkaS0+Y2hnX2luZm8uYWNfdnNldCwKLQkJZGktPmNoZ19pbmZvLmFjX2lzZXQsCi0JCWRpLT5jaGdfaW5mby51c2JfdnNldCwKLQkJZGktPmNoZ19pbmZvLnVzYl9pc2V0KTsKLQotCXN3aXRjaCAoZGktPmNoYXJnZV9zdGF0ZSkgewotCWNhc2UgU1RBVEVfSEFOREhFTERfSU5JVDoKLQkJYWJ4NTAwX2NoYXJnYWxnX3N0b3BfY2hhcmdpbmcoZGkpOwotCQlkaS0+Y2hhcmdlX3N0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkc7Ci0JCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfSEFOREhFTEQpOwotCQkvKiBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwotCi0JY2FzZSBTVEFURV9IQU5ESEVMRDoKLQkJYnJlYWs7Ci0KLQljYXNlIFNUQVRFX1NVU1BFTkRFRF9JTklUOgotCQlpZiAoZGktPnN1c3Bfc3RhdHVzLmFjX3N1c3BlbmRlZCkKLQkJCWFieDUwMF9jaGFyZ2FsZ19hY19lbihkaSwgZmFsc2UsIDAsIDApOwotCQlpZiAoZGktPnN1c3Bfc3RhdHVzLnVzYl9zdXNwZW5kZWQpCi0JCQlhYng1MDBfY2hhcmdhbGdfdXNiX2VuKGRpLCBmYWxzZSwgMCwgMCk7Ci0JCWFieDUwMF9jaGFyZ2FsZ19zdG9wX3NhZmV0eV90aW1lcihkaSk7Ci0JCWFieDUwMF9jaGFyZ2FsZ19zdG9wX21haW50ZW5hbmNlX3RpbWVyKGRpKTsKLQkJZGktPmNoYXJnZV9zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX05PVF9DSEFSR0lORzsKLQkJZGktPm1haW50ZW5hbmNlX2NoZyA9IGZhbHNlOwotCQlhYng1MDBfY2hhcmdhbGdfc3RhdGVfdG8oZGksIFNUQVRFX1NVU1BFTkRFRCk7Ci0JCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5jaGFyZ2FsZ19wc3kpOwotCQkvKiBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwotCi0JY2FzZSBTVEFURV9TVVNQRU5ERUQ6Ci0JCS8qIENIQVJHSU5HIGlzIHN1c3BlbmRlZCAqLwotCQlicmVhazsKLQotCWNhc2UgU1RBVEVfQkFUVF9SRU1PVkVEX0lOSVQ6Ci0JCWFieDUwMF9jaGFyZ2FsZ19zdG9wX2NoYXJnaW5nKGRpKTsKLQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9CQVRUX1JFTU9WRUQpOwotCQkvKiBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwotCi0JY2FzZSBTVEFURV9CQVRUX1JFTU9WRUQ6Ci0JCWlmICghZGktPmV2ZW50cy5iYXR0X3JlbSkKLQkJCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfTk9STUFMX0lOSVQpOwotCQlicmVhazsKLQotCWNhc2UgU1RBVEVfSFdfVEVNUF9QUk9URUNUX0lOSVQ6Ci0JCWFieDUwMF9jaGFyZ2FsZ19zdG9wX2NoYXJnaW5nKGRpKTsKLQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9IV19URU1QX1BST1RFQ1QpOwotCQkvKiBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwotCi0JY2FzZSBTVEFURV9IV19URU1QX1BST1RFQ1Q6Ci0JCWlmICghZGktPmV2ZW50cy5tYWluX3RoZXJtYWxfcHJvdCAmJgotCQkJCSFkaS0+ZXZlbnRzLnVzYl90aGVybWFsX3Byb3QpCi0JCQlhYng1MDBfY2hhcmdhbGdfc3RhdGVfdG8oZGksIFNUQVRFX05PUk1BTF9JTklUKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNUQVRFX09WVl9QUk9URUNUX0lOSVQ6Ci0JCWFieDUwMF9jaGFyZ2FsZ19zdG9wX2NoYXJnaW5nKGRpKTsKLQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9PVlZfUFJPVEVDVCk7Ci0JCS8qIEludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0KLQljYXNlIFNUQVRFX09WVl9QUk9URUNUOgotCQlpZiAoIWRpLT5ldmVudHMudmJ1c19vdnYgJiYKLQkJCQkhZGktPmV2ZW50cy5tYWluX292diAmJgotCQkJCSFkaS0+ZXZlbnRzLmJhdHRfb3Z2ICYmCi0JCQkJZGktPmNoZ19pbmZvLnVzYl9jaGdfb2sgJiYKLQkJCQlkaS0+Y2hnX2luZm8uYWNfY2hnX29rKQotCQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9OT1JNQUxfSU5JVCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTVEFURV9DSEdfTk9UX09LX0lOSVQ6Ci0JCWFieDUwMF9jaGFyZ2FsZ19zdG9wX2NoYXJnaW5nKGRpKTsKLQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9DSEdfTk9UX09LKTsKLQkJLyogSW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLQotCWNhc2UgU1RBVEVfQ0hHX05PVF9PSzoKLQkJaWYgKCFkaS0+ZXZlbnRzLm1haW5leHRjaG5vdG9rICYmCi0JCQkJIWRpLT5ldmVudHMudXNiY2hhcmdlcm5vdG9rKQotCQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9OT1JNQUxfSU5JVCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTVEFURV9TQUZFVFlfVElNRVJfRVhQSVJFRF9JTklUOgotCQlhYng1MDBfY2hhcmdhbGdfc3RvcF9jaGFyZ2luZyhkaSk7Ci0JCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfU0FGRVRZX1RJTUVSX0VYUElSRUQpOwotCQkvKiBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwotCi0JY2FzZSBTVEFURV9TQUZFVFlfVElNRVJfRVhQSVJFRDoKLQkJLyogV2UgZXhpdCB0aGlzIHN0YXRlIHdoZW4gY2hhcmdlciBpcyByZW1vdmVkICovCi0JCWJyZWFrOwotCi0JY2FzZSBTVEFURV9OT1JNQUxfSU5JVDoKLQkJaWYgKChkaS0+Y2hnX2luZm8uY2hhcmdlcl90eXBlICYgVVNCX0NIRykgJiYKLQkJCQlkaS0+dXNiX2NoZy0+cG93ZXJfcGF0aCkgewotCQkJaWYgKGRpLT5iYXR0X2RhdGEudm9sdCA+Ci0JCQkgICAgKGRpLT5ibS0+ZmdfcGFyYW1zLT5sb3diYXRfdGhyZXNob2xkICsKLQkJCSAgICAgQkFUX1BMVVNfTUFSR0lOKSkgewotCQkJCWFiODU0MF9jaGFyZ2FsZ191c2JfcHJlX2NoZ19lbihkaSwgZmFsc2UpOwotCQkJCWFiODU0MF9jaGFyZ2FsZ191c2JfcHBfZW4oZGksIGZhbHNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWI4NTQwX2NoYXJnYWxnX3VzYl9wcF9lbihkaSwgdHJ1ZSk7Ci0JCQkJYWI4NTQwX2NoYXJnYWxnX3VzYl9wcmVfY2hnX2VuKGRpLCB0cnVlKTsKLQkJCQlhYng1MDBfY2hhcmdhbGdfc3RhdGVfdG8oZGksCi0JCQkJCVNUQVRFX1VTQl9QUF9QUkVfQ0hBUkdFKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChkaS0+Y3Vycl9zdGF0dXMuY3Vycl9zdGVwID09IENIQVJHQUxHX0NVUlJfU1RFUF9MT1cpCi0JCQlhYng1MDBfY2hhcmdhbGdfc3RvcF9jaGFyZ2luZyhkaSk7Ci0JCWVsc2UgewotCQkJY3Vycl9zdGVwX2x2bCA9IGRpLT5ibS0+YmF0X3R5cGVbCi0JCQkJZGktPmJtLT5iYXR0X2lkXS5ub3JtYWxfY3VyX2x2bAotCQkJCSogZGktPmN1cnJfc3RhdHVzLmN1cnJfc3RlcAotCQkJCS8gQ0hBUkdBTEdfQ1VSUl9TVEVQX0hJR0g7Ci0JCQlhYng1MDBfY2hhcmdhbGdfc3RhcnRfY2hhcmdpbmcoZGksCi0JCQkJZGktPmJtLT5iYXRfdHlwZVtkaS0+Ym0tPmJhdHRfaWRdCi0JCQkJLm5vcm1hbF92b2xfbHZsLCBjdXJyX3N0ZXBfbHZsKTsKLQkJfQotCi0JCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfTk9STUFMKTsKLQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXJ0X3NhZmV0eV90aW1lcihkaSk7Ci0JCWFieDUwMF9jaGFyZ2FsZ19zdG9wX21haW50ZW5hbmNlX3RpbWVyKGRpKTsKLQkJaW5pdF9tYXhpbV9jaGdfY3VycihkaSk7Ci0JCWRpLT5jaGFyZ2Vfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKLQkJZGktPmVvY19jbnQgPSAwOwotCQlkaS0+bWFpbnRlbmFuY2VfY2hnID0gZmFsc2U7Ci0JCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5jaGFyZ2FsZ19wc3kpOwotCi0JCWJyZWFrOwotCi0JY2FzZSBTVEFURV9VU0JfUFBfUFJFX0NIQVJHRToKLQkJaWYgKGRpLT5iYXR0X2RhdGEudm9sdCA+Ci0JCQkoZGktPmJtLT5mZ19wYXJhbXMtPmxvd2JhdF90aHJlc2hvbGQgKwotCQkJQkFUX1BMVVNfTUFSR0lOKSkKLQkJCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfTk9STUFMX0lOSVQpOwotCQlicmVhazsKLQotCWNhc2UgU1RBVEVfTk9STUFMOgotCQloYW5kbGVfbWF4aW1fY2hnX2N1cnIoZGkpOwotCQlpZiAoZGktPmNoYXJnZV9zdGF0dXMgPT0gUE9XRVJfU1VQUExZX1NUQVRVU19GVUxMICYmCi0JCQlkaS0+bWFpbnRlbmFuY2VfY2hnKSB7Ci0JCQlpZiAoZGktPmJtLT5ub19tYWludGVuYW5jZSkKLQkJCQlhYng1MDBfY2hhcmdhbGdfc3RhdGVfdG8oZGksCi0JCQkJCVNUQVRFX1dBSVRfRk9SX1JFQ0hBUkdFX0lOSVQpOwotCQkJZWxzZQotCQkJCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwKLQkJCQkJU1RBVEVfTUFJTlRFTkFOQ0VfQV9JTklUKTsKLQkJfQotCQlicmVhazsKLQotCS8qIFRoaXMgc3RhdGUgd2lsbCBiZSB1c2VkIHdoZW4gdGhlIG1haW50ZW5hbmNlIHN0YXRlIGlzIGRpc2FibGVkICovCi0JY2FzZSBTVEFURV9XQUlUX0ZPUl9SRUNIQVJHRV9JTklUOgotCQlhYng1MDBfY2hhcmdhbGdfaG9sZF9jaGFyZ2luZyhkaSk7Ci0JCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfV0FJVF9GT1JfUkVDSEFSR0UpOwotCQkvKiBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwotCi0JY2FzZSBTVEFURV9XQUlUX0ZPUl9SRUNIQVJHRToKLQkJaWYgKGRpLT5iYXR0X2RhdGEucGVyY2VudCA8PQotCQkgICAgZGktPmJtLT5iYXRfdHlwZVtkaS0+Ym0tPmJhdHRfaWRdLgotCQkgICAgcmVjaGFyZ2VfY2FwKQotCQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9OT1JNQUxfSU5JVCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTVEFURV9NQUlOVEVOQU5DRV9BX0lOSVQ6Ci0JCWFieDUwMF9jaGFyZ2FsZ19zdG9wX3NhZmV0eV90aW1lcihkaSk7Ci0JCWFieDUwMF9jaGFyZ2FsZ19zdGFydF9tYWludGVuYW5jZV90aW1lcihkaSwKLQkJCWRpLT5ibS0+YmF0X3R5cGVbCi0JCQkJZGktPmJtLT5iYXR0X2lkXS5tYWludF9hX2NoZ190aW1lcl9oKTsKLQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXJ0X2NoYXJnaW5nKGRpLAotCQkJZGktPmJtLT5iYXRfdHlwZVsKLQkJCQlkaS0+Ym0tPmJhdHRfaWRdLm1haW50X2Ffdm9sX2x2bCwKLQkJCWRpLT5ibS0+YmF0X3R5cGVbCi0JCQkJZGktPmJtLT5iYXR0X2lkXS5tYWludF9hX2N1cl9sdmwpOwotCQlhYng1MDBfY2hhcmdhbGdfc3RhdGVfdG8oZGksIFNUQVRFX01BSU5URU5BTkNFX0EpOwotCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChkaS0+Y2hhcmdhbGdfcHN5KTsKLQkJLyogSW50ZW50aW9uYWwgZmFsbHRocm91Z2gqLwotCi0JY2FzZSBTVEFURV9NQUlOVEVOQU5DRV9BOgotCQlpZiAoZGktPmV2ZW50cy5tYWludGVuYW5jZV90aW1lcl9leHBpcmVkKSB7Ci0JCQlhYng1MDBfY2hhcmdhbGdfc3RvcF9tYWludGVuYW5jZV90aW1lcihkaSk7Ci0JCQlhYng1MDBfY2hhcmdhbGdfc3RhdGVfdG8oZGksIFNUQVRFX01BSU5URU5BTkNFX0JfSU5JVCk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFNUQVRFX01BSU5URU5BTkNFX0JfSU5JVDoKLQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXJ0X21haW50ZW5hbmNlX3RpbWVyKGRpLAotCQkJZGktPmJtLT5iYXRfdHlwZVsKLQkJCQlkaS0+Ym0tPmJhdHRfaWRdLm1haW50X2JfY2hnX3RpbWVyX2gpOwotCQlhYng1MDBfY2hhcmdhbGdfc3RhcnRfY2hhcmdpbmcoZGksCi0JCQlkaS0+Ym0tPmJhdF90eXBlWwotCQkJCWRpLT5ibS0+YmF0dF9pZF0ubWFpbnRfYl92b2xfbHZsLAotCQkJZGktPmJtLT5iYXRfdHlwZVsKLQkJCQlkaS0+Ym0tPmJhdHRfaWRdLm1haW50X2JfY3VyX2x2bCk7Ci0JCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfTUFJTlRFTkFOQ0VfQik7Ci0JCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5jaGFyZ2FsZ19wc3kpOwotCQkvKiBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCovCi0KLQljYXNlIFNUQVRFX01BSU5URU5BTkNFX0I6Ci0JCWlmIChkaS0+ZXZlbnRzLm1haW50ZW5hbmNlX3RpbWVyX2V4cGlyZWQpIHsKLQkJCWFieDUwMF9jaGFyZ2FsZ19zdG9wX21haW50ZW5hbmNlX3RpbWVyKGRpKTsKLQkJCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfTk9STUFMX0lOSVQpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBTVEFURV9URU1QX0xPV0hJR0hfSU5JVDoKLQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXJ0X2NoYXJnaW5nKGRpLAotCQkJZGktPmJtLT5iYXRfdHlwZVsKLQkJCQlkaS0+Ym0tPmJhdHRfaWRdLmxvd19oaWdoX3ZvbF9sdmwsCi0JCQlkaS0+Ym0tPmJhdF90eXBlWwotCQkJCWRpLT5ibS0+YmF0dF9pZF0ubG93X2hpZ2hfY3VyX2x2bCk7Ci0JCWFieDUwMF9jaGFyZ2FsZ19zdG9wX21haW50ZW5hbmNlX3RpbWVyKGRpKTsKLQkJZGktPmNoYXJnZV9zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOwotCQlhYng1MDBfY2hhcmdhbGdfc3RhdGVfdG8oZGksIFNUQVRFX1RFTVBfTE9XSElHSCk7Ci0JCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5jaGFyZ2FsZ19wc3kpOwotCQkvKiBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwotCi0JY2FzZSBTVEFURV9URU1QX0xPV0hJR0g6Ci0JCWlmICghZGktPmV2ZW50cy5idGVtcF9sb3doaWdoKQotCQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9OT1JNQUxfSU5JVCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTVEFURV9XRF9FWFBJUkVEX0lOSVQ6Ci0JCWFieDUwMF9jaGFyZ2FsZ19zdG9wX2NoYXJnaW5nKGRpKTsKLQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9XRF9FWFBJUkVEKTsKLQkJLyogSW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLQotCWNhc2UgU1RBVEVfV0RfRVhQSVJFRDoKLQkJaWYgKCFkaS0+ZXZlbnRzLmFjX3dkX2V4cGlyZWQgJiYKLQkJCQkhZGktPmV2ZW50cy51c2Jfd2RfZXhwaXJlZCkKLQkJCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfTk9STUFMX0lOSVQpOwotCQlicmVhazsKLQotCWNhc2UgU1RBVEVfVEVNUF9VTkRFUk9WRVJfSU5JVDoKLQkJYWJ4NTAwX2NoYXJnYWxnX3N0b3BfY2hhcmdpbmcoZGkpOwotCQlhYng1MDBfY2hhcmdhbGdfc3RhdGVfdG8oZGksIFNUQVRFX1RFTVBfVU5ERVJPVkVSKTsKLQkJLyogSW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLQotCWNhc2UgU1RBVEVfVEVNUF9VTkRFUk9WRVI6Ci0JCWlmICghZGktPmV2ZW50cy5idGVtcF91bmRlcm92ZXIpCi0JCQlhYng1MDBfY2hhcmdhbGdfc3RhdGVfdG8oZGksIFNUQVRFX05PUk1BTF9JTklUKTsKLQkJYnJlYWs7Ci0JfQotCi0JLyogU3RhcnQgY2hhcmdpbmcgZGlyZWN0bHkgaWYgdGhlIG5ldyBzdGF0ZSBpcyBhIGNoYXJnZSBzdGF0ZSAqLwotCWlmIChkaS0+Y2hhcmdlX3N0YXRlID09IFNUQVRFX05PUk1BTF9JTklUIHx8Ci0JCQlkaS0+Y2hhcmdlX3N0YXRlID09IFNUQVRFX01BSU5URU5BTkNFX0FfSU5JVCB8fAotCQkJZGktPmNoYXJnZV9zdGF0ZSA9PSBTVEFURV9NQUlOVEVOQU5DRV9CX0lOSVQpCi0JCXF1ZXVlX3dvcmsoZGktPmNoYXJnYWxnX3dxLCAmZGktPmNoYXJnYWxnX3dvcmspOwotfQotCi0vKioKLSAqIGFieDUwMF9jaGFyZ2FsZ19wZXJpb2RpY193b3JrKCkgLSBQZXJpb2RpYyB3b3JrIGZvciB0aGUgYWxnb3JpdGhtCi0gKiBAd29yazoJcG9pbnRlciB0byB0aGUgd29ya19zdHJ1Y3Qgc3RydWN0dXJlCi0gKgotICogV29yayBxdWV1ZSBmdW5jdGlvbiBmb3IgdGhlIGNoYXJnaW5nIGFsZ29yaXRobQotICovCi1zdGF0aWMgdm9pZCBhYng1MDBfY2hhcmdhbGdfcGVyaW9kaWNfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGkgPSBjb250YWluZXJfb2Yod29yaywKLQkJc3RydWN0IGFieDUwMF9jaGFyZ2FsZywgY2hhcmdhbGdfcGVyaW9kaWNfd29yay53b3JrKTsKLQotCWFieDUwMF9jaGFyZ2FsZ19hbGdvcml0aG0oZGkpOwotCi0JLyoKLQkgKiBJZiBhIGNoYXJnZXIgaXMgY29ubmVjdGVkIHRoZW4gdGhlIGJhdHRlcnkgaGFzIHRvIGJlIG1vbml0b3JlZAotCSAqIGZyZXF1ZW50bHksIGVsc2UgdGhlIHdvcmsgY2FuIGJlIGRlbGF5ZWQuCi0JICovCi0JaWYgKGRpLT5jaGdfaW5mby5jb25uX2NoZykKLQkJcXVldWVfZGVsYXllZF93b3JrKGRpLT5jaGFyZ2FsZ193cSwKLQkJCSZkaS0+Y2hhcmdhbGdfcGVyaW9kaWNfd29yaywKLQkJCWRpLT5ibS0+aW50ZXJ2YWxfY2hhcmdpbmcgKiBIWik7Ci0JZWxzZQotCQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmNoYXJnYWxnX3dxLAotCQkJJmRpLT5jaGFyZ2FsZ19wZXJpb2RpY193b3JrLAotCQkJZGktPmJtLT5pbnRlcnZhbF9ub3RfY2hhcmdpbmcgKiBIWik7Ci19Ci0KLS8qKgotICogYWJ4NTAwX2NoYXJnYWxnX3dkX3dvcmsoKSAtIHBlcmlvZGljIHdvcmsgdG8ga2ljayB0aGUgY2hhcmdlciB3YXRjaGRvZwotICogQHdvcms6CXBvaW50ZXIgdG8gdGhlIHdvcmtfc3RydWN0IHN0cnVjdHVyZQotICoKLSAqIFdvcmsgcXVldWUgZnVuY3Rpb24gZm9yIGtpY2tpbmcgdGhlIGNoYXJnZXIgd2F0Y2hkb2cKLSAqLwotc3RhdGljIHZvaWQgYWJ4NTAwX2NoYXJnYWxnX3dkX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCWludCByZXQ7Ci0Jc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGkgPSBjb250YWluZXJfb2Yod29yaywKLQkJc3RydWN0IGFieDUwMF9jaGFyZ2FsZywgY2hhcmdhbGdfd2Rfd29yay53b3JrKTsKLQotCWRldl9kYmcoZGktPmRldiwgImFieDUwMF9jaGFyZ2FsZ193ZF93b3JrXG4iKTsKLQotCXJldCA9IGFieDUwMF9jaGFyZ2FsZ19raWNrX3dhdGNoZG9nKGRpKTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIGtpY2sgd2F0Y2hkb2dcbiIpOwotCi0JcXVldWVfZGVsYXllZF93b3JrKGRpLT5jaGFyZ2FsZ193cSwKLQkJJmRpLT5jaGFyZ2FsZ193ZF93b3JrLCBDSEdfV0RfSU5URVJWQUwpOwotfQotCi0vKioKLSAqIGFieDUwMF9jaGFyZ2FsZ193b3JrKCkgLSBXb3JrIHRvIHJ1biB0aGUgY2hhcmdpbmcgYWxnb3JpdGhtIGluc3RhbnRseQotICogQHdvcms6CXBvaW50ZXIgdG8gdGhlIHdvcmtfc3RydWN0IHN0cnVjdHVyZQotICoKLSAqIFdvcmsgcXVldWUgZnVuY3Rpb24gZm9yIGNhbGxpbmcgdGhlIGNoYXJnaW5nIGFsZ29yaXRobQotICovCi1zdGF0aWMgdm9pZCBhYng1MDBfY2hhcmdhbGdfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGkgPSBjb250YWluZXJfb2Yod29yaywKLQkJc3RydWN0IGFieDUwMF9jaGFyZ2FsZywgY2hhcmdhbGdfd29yayk7Ci0KLQlhYng1MDBfY2hhcmdhbGdfYWxnb3JpdGhtKGRpKTsKLX0KLQotLyoqCi0gKiBhYng1MDBfY2hhcmdhbGdfZ2V0X3Byb3BlcnR5KCkgLSBnZXQgdGhlIGNoYXJnYWxnIHByb3BlcnRpZXMKLSAqIEBwc3k6CXBvaW50ZXIgdG8gdGhlIHBvd2VyX3N1cHBseSBzdHJ1Y3R1cmUKLSAqIEBwc3A6CXBvaW50ZXIgdG8gdGhlIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBzdHJ1Y3R1cmUKLSAqIEB2YWw6CXBvaW50ZXIgdG8gdGhlIHBvd2VyX3N1cHBseV9wcm9wdmFsIHVuaW9uCi0gKgotICogVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCB3aGVuIGFuIGFwcGxpY2F0aW9uIHRyaWVzIHRvIGdldCB0aGUKLSAqIGNoYXJnYWxnIHByb3BlcnRpZXMgYnkgcmVhZGluZyB0aGUgc3lzZnMgZmlsZXMuCi0gKiBzdGF0dXM6ICAgICBjaGFyZ2luZy9kaXNjaGFyZ2luZy9mdWxsL3Vua25vd24KLSAqIGhlYWx0aDogICAgIGhlYWx0aCBvZiB0aGUgYmF0dGVyeQotICogUmV0dXJucyBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZSBlbHNlIDAgb24gc3VjY2VzcwotICovCi1zdGF0aWMgaW50IGFieDUwMF9jaGFyZ2FsZ19nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAotCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKLQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQotewotCXN0cnVjdCBhYng1MDBfY2hhcmdhbGcgKmRpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7Ci0KLQlzd2l0Y2ggKHBzcCkgewotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgotCQl2YWwtPmludHZhbCA9IGRpLT5jaGFyZ2Vfc3RhdHVzOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSDoKLQkJaWYgKGRpLT5ldmVudHMuYmF0dF9vdnYpIHsKLQkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSVk9MVEFHRTsKLQkJfSBlbHNlIGlmIChkaS0+ZXZlbnRzLmJ0ZW1wX3VuZGVyb3ZlcikgewotCQkJaWYgKGRpLT5iYXR0X2RhdGEudGVtcCA8PSBkaS0+Ym0tPnRlbXBfdW5kZXIpCi0JCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0NPTEQ7Ci0JCQllbHNlCi0JCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJIRUFUOwotCQl9IGVsc2UgaWYgKGRpLT5jaGFyZ2Vfc3RhdGUgPT0gU1RBVEVfU0FGRVRZX1RJTUVSX0VYUElSRUQgfHwKLQkJCSAgIGRpLT5jaGFyZ2Vfc3RhdGUgPT0gU1RBVEVfU0FGRVRZX1RJTUVSX0VYUElSRURfSU5JVCkgewotCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOU1BFQ19GQUlMVVJFOwotCQl9IGVsc2UgewotCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0Q7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKiBFeHBvc3VyZSB0byB0aGUgc3lzZnMgaW50ZXJmYWNlICovCi0KLXN0YXRpYyBzc2l6ZV90IGFieDUwMF9jaGFyZ2FsZ19jdXJyX3N0ZXBfc2hvdyhzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSwKLQkJCQkJICAgICAgY2hhciAqYnVmKQotewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkaS0+Y3Vycl9zdGF0dXMuY3Vycl9zdGVwKTsKLX0KLQotc3RhdGljIHNzaXplX3QgYWJ4NTAwX2NoYXJnYWxnX2N1cnJfc3RlcF9zdG9yZShzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSwKLQkJCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbmd0aCkKLXsKLQlsb25nIGludCBwYXJhbTsKLQlpbnQgcmV0OwotCi0JcmV0ID0ga3N0cnRvbChidWYsIDEwLCAmcGFyYW0pOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JZGktPmN1cnJfc3RhdHVzLmN1cnJfc3RlcCA9IHBhcmFtOwotCWlmIChkaS0+Y3Vycl9zdGF0dXMuY3Vycl9zdGVwID49IENIQVJHQUxHX0NVUlJfU1RFUF9MT1cgJiYKLQkJZGktPmN1cnJfc3RhdHVzLmN1cnJfc3RlcCA8PSBDSEFSR0FMR19DVVJSX1NURVBfSElHSCkgewotCQlkaS0+Y3Vycl9zdGF0dXMuY3Vycl9zdGVwX2NoYW5nZSA9IHRydWU7Ci0JCXF1ZXVlX3dvcmsoZGktPmNoYXJnYWxnX3dxLCAmZGktPmNoYXJnYWxnX3dvcmspOwotCX0gZWxzZQotCQlkZXZfaW5mbyhkaS0+ZGV2LCAiV3JvbmcgY3VycmVudCBzdGVwXG4iCi0JCQkiRW50ZXIgMC4gRGlzYWJsZSBBQy9VU0IgQ2hhcmdpbmdcbiIKLQkJCSIxLS0xMDAuIFNldCBBQy9VU0IgY2hhcmdpbmcgY3VycmVudCBzdGVwXG4iCi0JCQkiMTAwLiBFbmFibGUgQUMvVVNCIENoYXJnaW5nXG4iKTsKLQotCXJldHVybiBzdHJsZW4oYnVmKTsKLX0KLQotCi1zdGF0aWMgc3NpemVfdCBhYng1MDBfY2hhcmdhbGdfZW5fc2hvdyhzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSwKLQkJCQkgICAgICAgY2hhciAqYnVmKQotewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAotCQkgICAgICAgZGktPnN1c3Bfc3RhdHVzLmFjX3N1c3BlbmRlZCAmJgotCQkgICAgICAgZGktPnN1c3Bfc3RhdHVzLnVzYl9zdXNwZW5kZWQpOwotfQotCi1zdGF0aWMgc3NpemVfdCBhYng1MDBfY2hhcmdhbGdfZW5fc3RvcmUoc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGksCi0JY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuZ3RoKQotewotCWxvbmcgaW50IHBhcmFtOwotCWludCBhY191c2I7Ci0JaW50IHJldDsKLQotCXJldCA9IGtzdHJ0b2woYnVmLCAxMCwgJnBhcmFtKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWFjX3VzYiA9IHBhcmFtOwotCXN3aXRjaCAoYWNfdXNiKSB7Ci0JY2FzZSAwOgotCQkvKiBEaXNhYmxlIGNoYXJnaW5nICovCi0JCWRpLT5zdXNwX3N0YXR1cy5hY19zdXNwZW5kZWQgPSB0cnVlOwotCQlkaS0+c3VzcF9zdGF0dXMudXNiX3N1c3BlbmRlZCA9IHRydWU7Ci0JCWRpLT5zdXNwX3N0YXR1cy5zdXNwZW5kZWRfY2hhbmdlID0gdHJ1ZTsKLQkJLyogVHJpZ2dlciBhIHN0YXRlIGNoYW5nZSAqLwotCQlxdWV1ZV93b3JrKGRpLT5jaGFyZ2FsZ193cSwKLQkJCSZkaS0+Y2hhcmdhbGdfd29yayk7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJLyogRW5hYmxlIEFDIENoYXJnaW5nICovCi0JCWRpLT5zdXNwX3N0YXR1cy5hY19zdXNwZW5kZWQgPSBmYWxzZTsKLQkJZGktPnN1c3Bfc3RhdHVzLnN1c3BlbmRlZF9jaGFuZ2UgPSB0cnVlOwotCQkvKiBUcmlnZ2VyIGEgc3RhdGUgY2hhbmdlICovCi0JCXF1ZXVlX3dvcmsoZGktPmNoYXJnYWxnX3dxLAotCQkJJmRpLT5jaGFyZ2FsZ193b3JrKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQkvKiBFbmFibGUgVVNCIGNoYXJnaW5nICovCi0JCWRpLT5zdXNwX3N0YXR1cy51c2Jfc3VzcGVuZGVkID0gZmFsc2U7Ci0JCWRpLT5zdXNwX3N0YXR1cy5zdXNwZW5kZWRfY2hhbmdlID0gdHJ1ZTsKLQkJLyogVHJpZ2dlciBhIHN0YXRlIGNoYW5nZSAqLwotCQlxdWV1ZV93b3JrKGRpLT5jaGFyZ2FsZ193cSwKLQkJCSZkaS0+Y2hhcmdhbGdfd29yayk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9pbmZvKGRpLT5kZXYsICJXcm9uZyBpbnB1dFxuIgotCQkJIkVudGVyIDAuIERpc2FibGUgQUMvVVNCIENoYXJnaW5nXG4iCi0JCQkiMS4gRW5hYmxlIEFDIGNoYXJnaW5nXG4iCi0JCQkiMi4gRW5hYmxlIFVTQiBDaGFyZ2luZ1xuIik7Ci0JfTsKLQlyZXR1cm4gc3RybGVuKGJ1Zik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnX3N5c2ZzX2VudHJ5IGFieDUwMF9jaGFyZ2FsZ19lbl9jaGFyZ2VyID0KLQlfX0FUVFIoY2hhcmdhbGcsIDA2NDQsIGFieDUwMF9jaGFyZ2FsZ19lbl9zaG93LAotCQkJCWFieDUwMF9jaGFyZ2FsZ19lbl9zdG9yZSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnX3N5c2ZzX2VudHJ5IGFieDUwMF9jaGFyZ2FsZ19jdXJyX3N0ZXAgPQotCV9fQVRUUihjaGFyZ2FsZ19jdXJyX3N0ZXAsIDA2NDQsIGFieDUwMF9jaGFyZ2FsZ19jdXJyX3N0ZXBfc2hvdywKLQkJCQkJYWJ4NTAwX2NoYXJnYWxnX2N1cnJfc3RlcF9zdG9yZSk7Ci0KLXN0YXRpYyBzc2l6ZV90IGFieDUwMF9jaGFyZ2FsZ19zeXNmc19zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnX3N5c2ZzX2VudHJ5ICplbnRyeSA9IGNvbnRhaW5lcl9vZihhdHRyLAotCQlzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnX3N5c2ZzX2VudHJ5LCBhdHRyKTsKLQotCXN0cnVjdCBhYng1MDBfY2hhcmdhbGcgKmRpID0gY29udGFpbmVyX29mKGtvYmosCi0JCXN0cnVjdCBhYng1MDBfY2hhcmdhbGcsIGNoYXJnYWxnX2tvYmplY3QpOwotCi0JaWYgKCFlbnRyeS0+c2hvdykKLQkJcmV0dXJuIC1FSU87Ci0KLQlyZXR1cm4gZW50cnktPnNob3coZGksIGJ1Zik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGFieDUwMF9jaGFyZ2FsZ19zeXNmc19jaGFyZ2VyKHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnX3N5c2ZzX2VudHJ5ICplbnRyeSA9IGNvbnRhaW5lcl9vZihhdHRyLAotCQlzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnX3N5c2ZzX2VudHJ5LCBhdHRyKTsKLQotCXN0cnVjdCBhYng1MDBfY2hhcmdhbGcgKmRpID0gY29udGFpbmVyX29mKGtvYmosCi0JCXN0cnVjdCBhYng1MDBfY2hhcmdhbGcsIGNoYXJnYWxnX2tvYmplY3QpOwotCi0JaWYgKCFlbnRyeS0+c3RvcmUpCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuIGVudHJ5LT5zdG9yZShkaSwgYnVmLCBsZW5ndGgpOwotfQotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWJ4NTAwX2NoYXJnYWxnX2NoZ1tdID0gewotCSZhYng1MDBfY2hhcmdhbGdfZW5fY2hhcmdlci5hdHRyLAotCSZhYng1MDBfY2hhcmdhbGdfY3Vycl9zdGVwLmF0dHIsCi0JTlVMTCwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3lzZnNfb3BzIGFieDUwMF9jaGFyZ2FsZ19zeXNmc19vcHMgPSB7Ci0JLnNob3cgPSBhYng1MDBfY2hhcmdhbGdfc3lzZnNfc2hvdywKLQkuc3RvcmUgPSBhYng1MDBfY2hhcmdhbGdfc3lzZnNfY2hhcmdlciwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGFieDUwMF9jaGFyZ2FsZ19rdHlwZSA9IHsKLQkuc3lzZnNfb3BzID0gJmFieDUwMF9jaGFyZ2FsZ19zeXNmc19vcHMsCi0JLmRlZmF1bHRfYXR0cnMgPSBhYng1MDBfY2hhcmdhbGdfY2hnLAotfTsKLQotLyoqCi0gKiBhYng1MDBfY2hhcmdhbGdfc3lzZnNfZXhpdCgpIC0gZGUtaW5pdCBvZiBzeXNmcyBlbnRyeQotICogQGRpOiAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnCi0gKgotICogVGhpcyBmdW5jdGlvbiByZW1vdmVzIHRoZSBlbnRyeSBpbiBzeXNmcy4KLSAqLwotc3RhdGljIHZvaWQgYWJ4NTAwX2NoYXJnYWxnX3N5c2ZzX2V4aXQoc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGkpCi17Ci0Ja29iamVjdF9kZWwoJmRpLT5jaGFyZ2FsZ19rb2JqZWN0KTsKLX0KLQotLyoqCi0gKiBhYng1MDBfY2hhcmdhbGdfc3lzZnNfaW5pdCgpIC0gaW5pdCBvZiBzeXNmcyBlbnRyeQotICogQGRpOiAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnCi0gKgotICogVGhpcyBmdW5jdGlvbiBhZGRzIGFuIGVudHJ5IGluIHN5c2ZzLgotICogUmV0dXJucyBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZSBlbHNlIDAob24gc3VjY2VzcykKLSAqLwotc3RhdGljIGludCBhYng1MDBfY2hhcmdhbGdfc3lzZnNfaW5pdChzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXJldCA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZkaS0+Y2hhcmdhbGdfa29iamVjdCwKLQkJJmFieDUwMF9jaGFyZ2FsZ19rdHlwZSwKLQkJTlVMTCwgImFieDUwMF9jaGFyZ2FsZyIpOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGVudHJ5XG4iKTsKLQotCXJldHVybiByZXQ7Ci19Ci0vKiBFeHBvc3VyZSB0byB0aGUgc3lzZnMgaW50ZXJmYWNlIDw8RU5EPj4gKi8KLQotI2lmIGRlZmluZWQoQ09ORklHX1BNKQotc3RhdGljIGludCBhYng1MDBfY2hhcmdhbGdfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCS8qIEtpY2sgY2hhcmdlciB3YXRjaGRvZyBpZiBjaGFyZ2luZyAoYW55IGNoYXJnZXIgb25saW5lKSAqLwotCWlmIChkaS0+Y2hnX2luZm8ub25saW5lX2NoZykKLQkJcXVldWVfZGVsYXllZF93b3JrKGRpLT5jaGFyZ2FsZ193cSwgJmRpLT5jaGFyZ2FsZ193ZF93b3JrLCAwKTsKLQotCS8qCi0JICogUnVuIHRoZSBjaGFyZ2luZyBhbGdvcml0aG0gZGlyZWN0bHkgdG8gYmUgc3VyZSB3ZSBkb24ndAotCSAqIGRvIGl0IHRvbyBzZWxkb20KLQkgKi8KLQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmNoYXJnYWxnX3dxLCAmZGktPmNoYXJnYWxnX3BlcmlvZGljX3dvcmssIDApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYWJ4NTAwX2NoYXJnYWxnX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQlwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0Jc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWlmIChkaS0+Y2hnX2luZm8ub25saW5lX2NoZykKLQkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZkaS0+Y2hhcmdhbGdfd2Rfd29yayk7Ci0KLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmRpLT5jaGFyZ2FsZ19wZXJpb2RpY193b3JrKTsKLQotCXJldHVybiAwOwotfQotI2Vsc2UKLSNkZWZpbmUgYWJ4NTAwX2NoYXJnYWxnX3N1c3BlbmQgICAgICBOVUxMCi0jZGVmaW5lIGFieDUwMF9jaGFyZ2FsZ19yZXN1bWUgICAgICAgTlVMTAotI2VuZGlmCi0KLXN0YXRpYyBpbnQgYWJ4NTAwX2NoYXJnYWxnX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBhYng1MDBfY2hhcmdhbGcgKmRpID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0KLQkvKiBzeXNmcyBpbnRlcmZhY2UgdG8gZW5hYmxlL2Rpc2JhbGUgY2hhcmdpbmcgZnJvbSB1c2VyIHNwYWNlICovCi0JYWJ4NTAwX2NoYXJnYWxnX3N5c2ZzX2V4aXQoZGkpOwotCi0JaHJ0aW1lcl9jYW5jZWwoJmRpLT5zYWZldHlfdGltZXIpOwotCWhydGltZXJfY2FuY2VsKCZkaS0+bWFpbnRlbmFuY2VfdGltZXIpOwotCi0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZkaS0+Y2hhcmdhbGdfcGVyaW9kaWNfd29yayk7Ci0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZkaS0+Y2hhcmdhbGdfd2Rfd29yayk7Ci0JY2FuY2VsX3dvcmtfc3luYygmZGktPmNoYXJnYWxnX3dvcmspOwotCi0JLyogRGVsZXRlIHRoZSB3b3JrIHF1ZXVlICovCi0JZGVzdHJveV93b3JrcXVldWUoZGktPmNoYXJnYWxnX3dxKTsKLQotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGRpLT5jaGFyZ2FsZ19wc3kpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjaGFyICpzdXBwbHlfaW50ZXJmYWNlW10gPSB7Ci0JImFiODUwMF9mZyIsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGFieDUwMF9jaGFyZ2FsZ19kZXNjID0gewotCS5uYW1lCQkJPSAiYWJ4NTAwX2NoYXJnYWxnIiwKLQkudHlwZQkJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKLQkucHJvcGVydGllcwkJPSBhYng1MDBfY2hhcmdhbGdfcHJvcHMsCi0JLm51bV9wcm9wZXJ0aWVzCQk9IEFSUkFZX1NJWkUoYWJ4NTAwX2NoYXJnYWxnX3Byb3BzKSwKLQkuZ2V0X3Byb3BlcnR5CQk9IGFieDUwMF9jaGFyZ2FsZ19nZXRfcHJvcGVydHksCi0JLmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQJPSBhYng1MDBfY2hhcmdhbGdfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCwKLX07Ci0KLXN0YXRpYyBpbnQgYWJ4NTAwX2NoYXJnYWxnX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOwotCXN0cnVjdCBhYng1MDBfYm1fZGF0YSAqcGxhdCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKLQlzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaTsKLQlpbnQgcmV0ID0gMDsKLQotCWRpID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZGkpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzIG5vIG1lbSBmb3IgYWI4NTAwX2NoYXJnYWxnXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWlmICghcGxhdCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBiYXR0ZXJ5IG1hbmFnZW1lbnQgZGF0YSBzdXBwbGllZFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlkaS0+Ym0gPSBwbGF0OwotCi0JaWYgKG5wKSB7Ci0JCXJldCA9IGFiODUwMF9ibV9vZl9wcm9iZSgmcGRldi0+ZGV2LCBucCwgZGktPmJtKTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBiYXR0ZXJ5IGluZm9ybWF0aW9uXG4iKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0KLQkvKiBnZXQgZGV2aWNlIHN0cnVjdCBhbmQgcGFyZW50ICovCi0JZGktPmRldiA9ICZwZGV2LT5kZXY7Ci0JZGktPnBhcmVudCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKLQotCXBzeV9jZmcuc3VwcGxpZWRfdG8gPSBzdXBwbHlfaW50ZXJmYWNlOwotCXBzeV9jZmcubnVtX3N1cHBsaWNhbnRzID0gQVJSQVlfU0laRShzdXBwbHlfaW50ZXJmYWNlKTsKLQlwc3lfY2ZnLmRydl9kYXRhID0gZGk7Ci0KLQkvKiBJbml0aWxpYWxpemUgc2FmZXR5IHRpbWVyICovCi0JaHJ0aW1lcl9pbml0KCZkaS0+c2FmZXR5X3RpbWVyLCBDTE9DS19SRUFMVElNRSwgSFJUSU1FUl9NT0RFX0FCUyk7Ci0JZGktPnNhZmV0eV90aW1lci5mdW5jdGlvbiA9IGFieDUwMF9jaGFyZ2FsZ19zYWZldHlfdGltZXJfZXhwaXJlZDsKLQotCS8qIEluaXRpbGlhbGl6ZSBtYWludGVuYW5jZSB0aW1lciAqLwotCWhydGltZXJfaW5pdCgmZGktPm1haW50ZW5hbmNlX3RpbWVyLCBDTE9DS19SRUFMVElNRSwgSFJUSU1FUl9NT0RFX0FCUyk7Ci0JZGktPm1haW50ZW5hbmNlX3RpbWVyLmZ1bmN0aW9uID0KLQkJYWJ4NTAwX2NoYXJnYWxnX21haW50ZW5hbmNlX3RpbWVyX2V4cGlyZWQ7Ci0KLQkvKiBDcmVhdGUgYSB3b3JrIHF1ZXVlIGZvciB0aGUgY2hhcmdhbGcgKi8KLQlkaS0+Y2hhcmdhbGdfd3EgPQotCQljcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiYWJ4NTAwX2NoYXJnYWxnX3dxIik7Ci0JaWYgKGRpLT5jaGFyZ2FsZ193cSA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byBjcmVhdGUgd29yayBxdWV1ZVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCS8qIEluaXQgd29yayBmb3IgY2hhcmdhbGcgKi8KLQlJTklUX0RFRkVSUkFCTEVfV09SSygmZGktPmNoYXJnYWxnX3BlcmlvZGljX3dvcmssCi0JCWFieDUwMF9jaGFyZ2FsZ19wZXJpb2RpY193b3JrKTsKLQlJTklUX0RFRkVSUkFCTEVfV09SSygmZGktPmNoYXJnYWxnX3dkX3dvcmssCi0JCWFieDUwMF9jaGFyZ2FsZ193ZF93b3JrKTsKLQotCS8qIEluaXQgd29yayBmb3IgY2hhcmdhbGcgKi8KLQlJTklUX1dPUksoJmRpLT5jaGFyZ2FsZ193b3JrLCBhYng1MDBfY2hhcmdhbGdfd29yayk7Ci0KLQkvKiBUbyBkZXRlY3QgY2hhcmdlciBhdCBzdGFydHVwICovCi0JZGktPmNoZ19pbmZvLnByZXZfY29ubl9jaGcgPSAtMTsKLQotCS8qIFJlZ2lzdGVyIGNoYXJnYWxnIHBvd2VyIHN1cHBseSBjbGFzcyAqLwotCWRpLT5jaGFyZ2FsZ19wc3kgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoZGktPmRldiwgJmFieDUwMF9jaGFyZ2FsZ19kZXNjLAotCQkJCQkJICZwc3lfY2ZnKTsKLQlpZiAoSVNfRVJSKGRpLT5jaGFyZ2FsZ19wc3kpKSB7Ci0JCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBjaGFyZ2FsZyBwc3lcbiIpOwotCQlyZXQgPSBQVFJfRVJSKGRpLT5jaGFyZ2FsZ19wc3kpOwotCQlnb3RvIGZyZWVfY2hhcmdhbGdfd3E7Ci0JfQotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGkpOwotCi0JLyogc3lzZnMgaW50ZXJmYWNlIHRvIGVuYWJsZS9kaXNhYmxlIGNoYXJnaW5nIGZyb20gdXNlciBzcGFjZSAqLwotCXJldCA9IGFieDUwMF9jaGFyZ2FsZ19zeXNmc19pbml0KGRpKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgZW50cnlcbiIpOwotCQlnb3RvIGZyZWVfcHN5OwotCX0KLQlkaS0+Y3Vycl9zdGF0dXMuY3Vycl9zdGVwID0gQ0hBUkdBTEdfQ1VSUl9TVEVQX0hJR0g7Ci0KLQkvKiBSdW4gdGhlIGNoYXJnaW5nIGFsZ29yaXRobSAqLwotCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Y2hhcmdhbGdfd3EsICZkaS0+Y2hhcmdhbGdfcGVyaW9kaWNfd29yaywgMCk7Ci0KLQlkZXZfaW5mbyhkaS0+ZGV2LCAicHJvYmUgc3VjY2Vzc1xuIik7Ci0JcmV0dXJuIHJldDsKLQotZnJlZV9wc3k6Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoZGktPmNoYXJnYWxnX3BzeSk7Ci1mcmVlX2NoYXJnYWxnX3dxOgotCWRlc3Ryb3lfd29ya3F1ZXVlKGRpLT5jaGFyZ2FsZ193cSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYWI4NTAwX2NoYXJnYWxnX21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJzdGVyaWNzc29uLGFiODUwMC1jaGFyZ2FsZyIsIH0sCi0JeyB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYWJ4NTAwX2NoYXJnYWxnX2RyaXZlciA9IHsKLQkucHJvYmUgPSBhYng1MDBfY2hhcmdhbGdfcHJvYmUsCi0JLnJlbW92ZSA9IGFieDUwMF9jaGFyZ2FsZ19yZW1vdmUsCi0JLnN1c3BlbmQgPSBhYng1MDBfY2hhcmdhbGdfc3VzcGVuZCwKLQkucmVzdW1lID0gYWJ4NTAwX2NoYXJnYWxnX3Jlc3VtZSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJhYjg1MDAtY2hhcmdhbGciLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBhYjg1MDBfY2hhcmdhbGdfbWF0Y2gsCi0JfSwKLX07Ci0KLW1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYWJ4NTAwX2NoYXJnYWxnX2RyaXZlcik7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKLU1PRFVMRV9BVVRIT1IoIkpvaGFuIFBhbHNzb24sIEthcmwgS29taWVyb3dza2kiKTsKLU1PRFVMRV9BTElBUygicGxhdGZvcm06YWJ4NTAwLWNoYXJnYWxnIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oImFieDUwMCBiYXR0ZXJ5IGNoYXJnaW5nIGFsZ29yaXRobSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9hY3Q4OTQ1YV9jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL2FjdDg5NDVhX2NoYXJnZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVjMDBlNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3Bvd2VyL2FjdDg5NDVhX2NoYXJnZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKgotICogUG93ZXIgc3VwcGx5IGRyaXZlciBmb3IgdGhlIEFjdGl2ZS1zZW1pIEFDVDg5NDVBIFBNSUMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgQXRtZWwgQ29ycG9yYXRpb24KLSAqCi0gKiBBdXRob3I6IFdlbnlvdSBZYW5nIDx3ZW55b3UueWFuZ0BhdG1lbC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KLQotc3RhdGljIGNvbnN0IGNoYXIgKmFjdDg5NDVhX2NoYXJnZXJfbW9kZWwgPSAiQUNUODk0NUEiOwotc3RhdGljIGNvbnN0IGNoYXIgKmFjdDg5NDVhX2NoYXJnZXJfbWFudWZhY3R1cmVyID0gIkFjdGl2ZS1zZW1pIjsKLQotLyoqCi0gKiBBQ1Q4OTQ1QSBDaGFyZ2VyIFJlZ2lzdGVyIE1hcAotICovCi0KLS8qIDB4NzA6IFJlc2VydmVkICovCi0jZGVmaW5lIEFDVDg5NDVBX0FQQ0hfQ0ZHCQkweDcxCi0jZGVmaW5lIEFDVDg5NDVBX0FQQ0hfU1RBVFVTCQkweDc4Ci0jZGVmaW5lIEFDVDg5NDVBX0FQQ0hfQ1RSTAkJMHg3OQotI2RlZmluZSBBQ1Q4OTQ1QV9BUENIX1NUQVRFCQkweDdBCi0KLS8qIEFDVDg5NDVBX0FQQ0hfQ0ZHICovCi0jZGVmaW5lIEFQQ0hfQ0ZHX09WUFNFVAkJCSgweDMgPDwgMCkKLSNkZWZpbmUgQVBDSF9DRkdfT1ZQU0VUXzZWNgkJKDB4MCA8PCAwKQotI2RlZmluZSBBUENIX0NGR19PVlBTRVRfN1YJCSgweDEgPDwgMCkKLSNkZWZpbmUgQVBDSF9DRkdfT1ZQU0VUXzdWNQkJKDB4MiA8PCAwKQotI2RlZmluZSBBUENIX0NGR19PVlBTRVRfOFYJCSgweDMgPDwgMCkKLSNkZWZpbmUgQVBDSF9DRkdfUFJFVElNTwkJKDB4MyA8PCAyKQotI2RlZmluZSBBUENIX0NGR19QUkVUSU1PXzQwX01JTgkJKDB4MCA8PCAyKQotI2RlZmluZSBBUENIX0NGR19QUkVUSU1PXzYwX01JTgkJKDB4MSA8PCAyKQotI2RlZmluZSBBUENIX0NGR19QUkVUSU1PXzgwX01JTgkJKDB4MiA8PCAyKQotI2RlZmluZSBBUENIX0NGR19QUkVUSU1PX0RJU0FCTEVECSgweDMgPDwgMikKLSNkZWZpbmUgQVBDSF9DRkdfVE9UVElNTwkJKDB4MyA8PCA0KQotI2RlZmluZSBBUENIX0NGR19UT1RUSU1PXzNfSE9VUgkJKDB4MCA8PCA0KQotI2RlZmluZSBBUENIX0NGR19UT1RUSU1PXzRfSE9VUgkJKDB4MSA8PCA0KQotI2RlZmluZSBBUENIX0NGR19UT1RUSU1PXzVfSE9VUgkJKDB4MiA8PCA0KQotI2RlZmluZSBBUENIX0NGR19UT1RUSU1PX0RJU0FCTEVECSgweDMgPDwgNCkKLSNkZWZpbmUgQVBDSF9DRkdfU1VTQ0hHCQkJKDB4MSA8PCA3KQotCi0jZGVmaW5lIEFQQ0hfU1RBVFVTX0NIR0RBVAkJQklUKDApCi0jZGVmaW5lIEFQQ0hfU1RBVFVTX0lOREFUCQlCSVQoMSkKLSNkZWZpbmUgQVBDSF9TVEFUVVNfVEVNUERBVAkJQklUKDIpCi0jZGVmaW5lIEFQQ0hfU1RBVFVTX1RJTVJEQVQJCUJJVCgzKQotI2RlZmluZSBBUENIX1NUQVRVU19DSEdTVEFUCQlCSVQoNCkKLSNkZWZpbmUgQVBDSF9TVEFUVVNfSU5TVEFUCQlCSVQoNSkKLSNkZWZpbmUgQVBDSF9TVEFUVVNfVEVNUFNUQVQJCUJJVCg2KQotI2RlZmluZSBBUENIX1NUQVRVU19USU1SU1RBVAkJQklUKDcpCi0KLSNkZWZpbmUgQVBDSF9DVFJMX0NIR0VPQ09VVAkJQklUKDApCi0jZGVmaW5lIEFQQ0hfQ1RSTF9JTkRJUwkJCUJJVCgxKQotI2RlZmluZSBBUENIX0NUUkxfVEVNUE9VVAkJQklUKDIpCi0jZGVmaW5lIEFQQ0hfQ1RSTF9USU1SUFJFCQlCSVQoMykKLSNkZWZpbmUgQVBDSF9DVFJMX0NIR0VPQ0lOCQlCSVQoNCkKLSNkZWZpbmUgQVBDSF9DVFJMX0lOQ09OCQkJQklUKDUpCi0jZGVmaW5lIEFQQ0hfQ1RSTF9URU1QSU4JCUJJVCg2KQotI2RlZmluZSBBUENIX0NUUkxfVElNUlRPVAkJQklUKDcpCi0KLSNkZWZpbmUgQVBDSF9TVEFURV9BQ0lOU1RBVAkJKDB4MSA8PCAxKQotI2RlZmluZSBBUENIX1NUQVRFX0NTVEFURQkJKDB4MyA8PCA0KQotI2RlZmluZSBBUENIX1NUQVRFX0NTVEFURV9TSElGVAkJNAotI2RlZmluZSBBUENIX1NUQVRFX0NTVEFURV9ESVNBQkxFRAkweDAwCi0jZGVmaW5lIEFQQ0hfU1RBVEVfQ1NUQVRFX0VPQwkJMHgwMQotI2RlZmluZSBBUENIX1NUQVRFX0NTVEFURV9GQVNUCQkweDAyCi0jZGVmaW5lIEFQQ0hfU1RBVEVfQ1NUQVRFX1BSRQkJMHgwMwotCi1zdHJ1Y3QgYWN0ODk0NWFfY2hhcmdlciB7Ci0Jc3RydWN0IHJlZ21hcCAqcmVnbWFwOwotCWJvb2wgYmF0dGVyeV90ZW1wZXJhdHVyZTsKLX07Ci0KLXN0YXRpYyBpbnQgYWN0ODk0NWFfZ2V0X2NoYXJnZXJfc3RhdGUoc3RydWN0IHJlZ21hcCAqcmVnbWFwLCBpbnQgKnZhbCkKLXsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGludCBzdGF0dXMsIHN0YXRlOwotCi0JcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBBQ1Q4OTQ1QV9BUENIX1NUQVRVUywgJnN0YXR1cyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIEFDVDg5NDVBX0FQQ0hfU1RBVEUsICZzdGF0ZSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlzdGF0ZSAmPSBBUENIX1NUQVRFX0NTVEFURTsKLQlzdGF0ZSA+Pj0gQVBDSF9TVEFURV9DU1RBVEVfU0hJRlQ7Ci0KLQlpZiAoc3RhdGUgPT0gQVBDSF9TVEFURV9DU1RBVEVfRU9DKSB7Ci0JCWlmIChzdGF0dXMgJiBBUENIX1NUQVRVU19DSEdEQVQpCi0JCQkqdmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19GVUxMOwotCQllbHNlCi0JCQkqdmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19OT1RfQ0hBUkdJTkc7Ci0JfSBlbHNlIGlmICgoc3RhdGUgPT0gQVBDSF9TVEFURV9DU1RBVEVfRkFTVCkgfHwKLQkJICAgKHN0YXRlID09IEFQQ0hfU1RBVEVfQ1NUQVRFX1BSRSkpIHsKLQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7Ci0JfSBlbHNlIHsKLQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfTk9UX0NIQVJHSU5HOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFjdDg5NDVhX2dldF9jaGFyZ2VfdHlwZShzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGludCAqdmFsKQotewotCWludCByZXQ7Ci0JdW5zaWduZWQgaW50IHN0YXRlOwotCi0JcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBBQ1Q4OTQ1QV9BUENIX1NUQVRFLCAmc3RhdGUpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0Jc3RhdGUgJj0gQVBDSF9TVEFURV9DU1RBVEU7Ci0Jc3RhdGUgPj49IEFQQ0hfU1RBVEVfQ1NUQVRFX1NISUZUOwotCi0Jc3dpdGNoIChzdGF0ZSkgewotCWNhc2UgQVBDSF9TVEFURV9DU1RBVEVfUFJFOgotCQkqdmFsID0gUE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX1RSSUNLTEU7Ci0JCWJyZWFrOwotCWNhc2UgQVBDSF9TVEFURV9DU1RBVEVfRkFTVDoKLQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9GQVNUOwotCQlicmVhazsKLQljYXNlIEFQQ0hfU1RBVEVfQ1NUQVRFX0VPQzoKLQljYXNlIEFQQ0hfU1RBVEVfQ1NUQVRFX0RJU0FCTEVEOgotCWRlZmF1bHQ6Ci0JCSp2YWwgPSBQT1dFUl9TVVBQTFlfQ0hBUkdFX1RZUEVfTk9ORTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhY3Q4OTQ1YV9nZXRfYmF0dGVyeV9oZWFsdGgoc3RydWN0IGFjdDg5NDVhX2NoYXJnZXIgKmNoYXJnZXIsCi0JCQkJICAgICAgIHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgaW50ICp2YWwpCi17Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBpbnQgc3RhdHVzOwotCi0JcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBBQ1Q4OTQ1QV9BUENIX1NUQVRVUywgJnN0YXR1cyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoY2hhcmdlci0+YmF0dGVyeV90ZW1wZXJhdHVyZSAmJiAhKHN0YXR1cyAmIEFQQ0hfU1RBVFVTX1RFTVBEQVQpKQotCQkqdmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSSEVBVDsKLQllbHNlIGlmICghKHN0YXR1cyAmIEFQQ0hfU1RBVFVTX0lOREFUKSkKLQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUlZPTFRBR0U7Ci0JZWxzZSBpZiAoc3RhdHVzICYgQVBDSF9TVEFUVVNfVElNUkRBVCkKLQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfU0FGRVRZX1RJTUVSX0VYUElSRTsKLQllbHNlCi0JCSp2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0Q7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IGFjdDg5NDVhX2NoYXJnZXJfcHJvcHNbXSA9IHsKLQlQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMsCi0JUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX1RZUEUsCi0JUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWSwKLQlQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEgsCi0JUE9XRVJfU1VQUExZX1BST1BfTU9ERUxfTkFNRSwKLQlQT1dFUl9TVVBQTFlfUFJPUF9NQU5VRkFDVFVSRVIKLX07Ci0KLXN0YXRpYyBpbnQgYWN0ODk0NWFfY2hhcmdlcl9nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAotCQkJCQkgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHJvcCwKLQkJCQkJIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCi17Ci0Jc3RydWN0IGFjdDg5NDVhX2NoYXJnZXIgKmNoYXJnZXIgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKLQlzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBjaGFyZ2VyLT5yZWdtYXA7Ci0JaW50IHJldCA9IDA7Ci0KLQlzd2l0Y2ggKHByb3ApIHsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKLQkJcmV0ID0gYWN0ODk0NWFfZ2V0X2NoYXJnZXJfc3RhdGUocmVnbWFwLCAmdmFsLT5pbnR2YWwpOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9UWVBFOgotCQlyZXQgPSBhY3Q4OTQ1YV9nZXRfY2hhcmdlX3R5cGUocmVnbWFwLCAmdmFsLT5pbnR2YWwpOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1k6Ci0JCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1RFQ0hOT0xPR1lfTElPTjsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEg6Ci0JCXJldCA9IGFjdDg5NDVhX2dldF9iYXR0ZXJ5X2hlYWx0aChjaGFyZ2VyLAotCQkJCQkJICByZWdtYXAsICZ2YWwtPmludHZhbCk7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfTU9ERUxfTkFNRToKLQkJdmFsLT5zdHJ2YWwgPSBhY3Q4OTQ1YV9jaGFyZ2VyX21vZGVsOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUjoKLQkJdmFsLT5zdHJ2YWwgPSBhY3Q4OTQ1YV9jaGFyZ2VyX21hbnVmYWN0dXJlcjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBhY3Q4OTQ1YV9jaGFyZ2VyX2Rlc2MgPSB7Ci0JLm5hbWUJCT0gImFjdDg5NDVhLWNoYXJnZXIiLAotCS50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlksCi0JLmdldF9wcm9wZXJ0eQk9IGFjdDg5NDVhX2NoYXJnZXJfZ2V0X3Byb3BlcnR5LAotCS5wcm9wZXJ0aWVzCT0gYWN0ODk0NWFfY2hhcmdlcl9wcm9wcywKLQkubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKGFjdDg5NDVhX2NoYXJnZXJfcHJvcHMpLAotfTsKLQotI2RlZmluZSBERUZBVUxUX1RPVEFMX1RJTUVfT1VUCQkzCi0jZGVmaW5lIERFRkFVTFRfUFJFX1RJTUVfT1VUCQk0MAotI2RlZmluZSBERUZBVUxUX0lOUFVUX09WUF9USFJFU0hPTEQJNjYwMAotCi1zdGF0aWMgaW50IGFjdDg5NDVhX2NoYXJnZXJfY29uZmlnKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICBzdHJ1Y3QgYWN0ODk0NWFfY2hhcmdlciAqY2hhcmdlcikKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOwotCWVudW0gb2ZfZ3Bpb19mbGFncyBmbGFnczsKLQlzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBjaGFyZ2VyLT5yZWdtYXA7Ci0KLQl1MzIgdG90YWxfdGltZV9vdXQ7Ci0JdTMyIHByZV90aW1lX291dDsKLQl1MzIgaW5wdXRfdm9sdGFnZV90aHJlc2hvbGQ7Ci0JaW50IGNoZ2xldl9waW47Ci0KLQl1bnNpZ25lZCBpbnQgdmFsdWUgPSAwOwotCi0JaWYgKCFucCkgewotCQlkZXZfZXJyKGRldiwgIm5vIGNoYXJnZXIgb2Ygbm9kZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWNoYXJnZXItPmJhdHRlcnlfdGVtcGVyYXR1cmUgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsCi0JCQkJImFjdGl2ZS1zZW1pLGNoZWNrLWJhdHRlcnktdGVtcGVyYXR1cmUiKTsKLQotCWNoZ2xldl9waW4gPSBvZl9nZXRfbmFtZWRfZ3Bpb19mbGFncyhucCwKLQkJCQkiYWN0aXZlLXNlbWksY2hnbGV2LWdwaW9zIiwgMCwgJmZsYWdzKTsKLQotCWlmIChncGlvX2lzX3ZhbGlkKGNoZ2xldl9waW4pKSB7Ci0JCWdwaW9fc2V0X3ZhbHVlKGNoZ2xldl9waW4sCi0JCQkgICAgICAgKChmbGFncyA9PSBPRl9HUElPX0FDVElWRV9MT1cpID8gMCA6IDEpKTsKLQl9Ci0KLQlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobnAsCi0JCQkJICJhY3RpdmUtc2VtaSxpbnB1dC12b2x0YWdlLXRocmVzaG9sZC1taWNyb3ZvbHQiLAotCQkJCSAmaW5wdXRfdm9sdGFnZV90aHJlc2hvbGQpKQotCQlpbnB1dF92b2x0YWdlX3RocmVzaG9sZCA9IERFRkFVTFRfSU5QVVRfT1ZQX1RIUkVTSE9MRDsKLQotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwKLQkJCQkgImFjdGl2ZS1zZW1pLHByZWNvbmRpdGlvbi10aW1lb3V0IiwKLQkJCQkgJnByZV90aW1lX291dCkpCi0JCXByZV90aW1lX291dCA9IERFRkFVTFRfUFJFX1RJTUVfT1VUOwotCi0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiYWN0aXZlLXNlbWksdG90YWwtdGltZW91dCIsCi0JCQkJICZ0b3RhbF90aW1lX291dCkpCi0JCXRvdGFsX3RpbWVfb3V0ID0gREVGQVVMVF9UT1RBTF9USU1FX09VVDsKLQotCXN3aXRjaCAoaW5wdXRfdm9sdGFnZV90aHJlc2hvbGQpIHsKLQljYXNlIDgwMDA6Ci0JCXZhbHVlIHw9IEFQQ0hfQ0ZHX09WUFNFVF84VjsKLQkJYnJlYWs7Ci0JY2FzZSA3NTAwOgotCQl2YWx1ZSB8PSBBUENIX0NGR19PVlBTRVRfN1Y1OwotCQlicmVhazsKLQljYXNlIDcwMDA6Ci0JCXZhbHVlIHw9IEFQQ0hfQ0ZHX09WUFNFVF83VjsKLQkJYnJlYWs7Ci0JY2FzZSA2NjAwOgotCWRlZmF1bHQ6Ci0JCXZhbHVlIHw9IEFQQ0hfQ0ZHX09WUFNFVF82VjY7Ci0JCWJyZWFrOwotCX0KLQotCXN3aXRjaCAocHJlX3RpbWVfb3V0KSB7Ci0JY2FzZSA2MDoKLQkJdmFsdWUgfD0gQVBDSF9DRkdfUFJFVElNT182MF9NSU47Ci0JCWJyZWFrOwotCWNhc2UgODA6Ci0JCXZhbHVlIHw9IEFQQ0hfQ0ZHX1BSRVRJTU9fODBfTUlOOwotCQlicmVhazsKLQljYXNlIDA6Ci0JCXZhbHVlIHw9IEFQQ0hfQ0ZHX1BSRVRJTU9fRElTQUJMRUQ7Ci0JCWJyZWFrOwotCWNhc2UgNDA6Ci0JZGVmYXVsdDoKLQkJdmFsdWUgfD0gQVBDSF9DRkdfUFJFVElNT180MF9NSU47Ci0JCWJyZWFrOwotCX0KLQotCXN3aXRjaCAodG90YWxfdGltZV9vdXQpIHsKLQljYXNlIDQ6Ci0JCXZhbHVlIHw9IEFQQ0hfQ0ZHX1RPVFRJTU9fNF9IT1VSOwotCQlicmVhazsKLQljYXNlIDU6Ci0JCXZhbHVlIHw9IEFQQ0hfQ0ZHX1RPVFRJTU9fNV9IT1VSOwotCQlicmVhazsKLQljYXNlIDA6Ci0JCXZhbHVlIHw9IEFQQ0hfQ0ZHX1RPVFRJTU9fRElTQUJMRUQ7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQlkZWZhdWx0OgotCQl2YWx1ZSB8PSBBUENIX0NGR19UT1RUSU1PXzNfSE9VUjsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJlZ21hcF93cml0ZShyZWdtYXAsIEFDVDg5NDVBX0FQQ0hfQ0ZHLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgYWN0ODk0NWFfY2hhcmdlcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBhY3Q4OTQ1YV9jaGFyZ2VyICpjaGFyZ2VyOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeTsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307Ci0JaW50IHJldDsKLQotCWNoYXJnZXIgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpjaGFyZ2VyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjaGFyZ2VyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWNoYXJnZXItPnJlZ21hcCA9IGRldl9nZXRfcmVnbWFwKHBkZXYtPmRldi5wYXJlbnQsIE5VTEwpOwotCWlmICghY2hhcmdlci0+cmVnbWFwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIlBhcmVudCBkaWQgbm90IHByb3ZpZGUgcmVnbWFwXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0gYWN0ODk0NWFfY2hhcmdlcl9jb25maWcocGRldi0+ZGV2LnBhcmVudCwgY2hhcmdlcik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXBzeV9jZmcub2Zfbm9kZQk9IHBkZXYtPmRldi5wYXJlbnQtPm9mX25vZGU7Ci0JcHN5X2NmZy5kcnZfZGF0YSA9IGNoYXJnZXI7Ci0KLQlwc3kgPSBkZXZtX3Bvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LAotCQkJCQkgJmFjdDg5NDVhX2NoYXJnZXJfZGVzYywKLQkJCQkJICZwc3lfY2ZnKTsKLQlpZiAoSVNfRVJSKHBzeSkpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIHBvd2VyIHN1cHBseVxuIik7Ci0JCXJldHVybiBQVFJfRVJSKHBzeSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFjdDg5NDVhX2NoYXJnZXJfZHJpdmVyID0gewotCS5kcml2ZXIJPSB7Ci0JCS5uYW1lID0gImFjdDg5NDVhLWNoYXJnZXIiLAotCX0sCi0JLnByb2JlCT0gYWN0ODk0NWFfY2hhcmdlcl9wcm9iZSwKLX07Ci1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGFjdDg5NDVhX2NoYXJnZXJfZHJpdmVyKTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJBY3RpdmUtc2VtaSBBQ1Q4OTQ1QSBBY3RpdmVQYXRoIGNoYXJnZXIgZHJpdmVyIik7Ci1NT0RVTEVfQVVUSE9SKCJXZW55b3UgWWFuZyA8d2VueW91LnlhbmdAYXRtZWwuY29tPiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9hdnMvc21hcnRyZWZsZXguYyBiL2RyaXZlcnMvcG93ZXIvYXZzL3NtYXJ0cmVmbGV4LmMKaW5kZXggZGI5OTczYi4uZmEwZjE5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9hdnMvc21hcnRyZWZsZXguYworKysgYi9kcml2ZXJzL3Bvd2VyL2F2cy9zbWFydHJlZmxleC5jCkBAIC0xMzYsNyArMTM2LDcgQEAKIAogCWlmIChJU19FUlIoZmNrKSkgewogCQlkZXZfZXJyKCZzci0+cGRldi0+ZGV2LCAiJXM6IHVuYWJsZSB0byBnZXQgZmNrIGZvciBkZXZpY2UgJXNcbiIsCi0JCQkJX19mdW5jX18sIGRldl9uYW1lKCZzci0+cGRldi0+ZGV2KSk7CisJCQlfX2Z1bmNfXywgZGV2X25hbWUoJnNyLT5wZGV2LT5kZXYpKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTcwLDggKzE3MCw4IEBACiB7CiAJaWYgKCFzcl9jbGFzcyB8fCAhKHNyX2NsYXNzLT5lbmFibGUpIHx8ICEoc3JfY2xhc3MtPmNvbmZpZ3VyZSkpIHsKIAkJZGV2X3dhcm4oJnNyLT5wZGV2LT5kZXYsCi0JCQkiJXM6IHNtYXJ0cmVmbGV4IGNsYXNzIGRyaXZlciBub3QgcmVnaXN0ZXJlZFxuIiwKLQkJCV9fZnVuY19fKTsKKwkJCSAiJXM6IHNtYXJ0cmVmbGV4IGNsYXNzIGRyaXZlciBub3QgcmVnaXN0ZXJlZFxuIiwKKwkJCSBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE4Myw4ICsxODMsOCBAQAogewogCWlmICghc3JfY2xhc3MgfHwgIShzcl9jbGFzcy0+ZGlzYWJsZSkpIHsKIAkJZGV2X3dhcm4oJnNyLT5wZGV2LT5kZXYsCi0JCQkiJXM6IHNtYXJ0cmVmbGV4IGNsYXNzIGRyaXZlciBub3QgcmVnaXN0ZXJlZFxuIiwKLQkJCV9fZnVuY19fKTsKKwkJCSAiJXM6IHNtYXJ0cmVmbGV4IGNsYXNzIGRyaXZlciBub3QgcmVnaXN0ZXJlZFxuIiwKKwkJCSBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTIyNSw5ICsyMjUsOCBAQAogCiBlcnJvcjoKIAlsaXN0X2RlbCgmc3JfaW5mby0+bm9kZSk7Ci0JZGV2X2Vycigmc3JfaW5mby0+cGRldi0+ZGV2LCAiJXM6IEVSUk9SIGluIHJlZ2lzdGVyaW5nIgotCQkiaW50ZXJydXB0IGhhbmRsZXIuIFNtYXJ0cmVmbGV4IHdpbGwiCi0JCSJub3QgZnVuY3Rpb24gYXMgZGVzaXJlZFxuIiwgX19mdW5jX18pOworCWRldl9lcnIoJnNyX2luZm8tPnBkZXYtPmRldiwgIiVzOiBFUlJPUiBpbiByZWdpc3RlcmluZyBpbnRlcnJ1cHQgaGFuZGxlci4gU21hcnRyZWZsZXggd2lsbCBub3QgZnVuY3Rpb24gYXMgZGVzaXJlZFxuIiwKKwkJX19mdW5jX18pOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTI2Myw3ICsyNjIsNyBAQAogCiAJaWYgKHRpbWVvdXQgPj0gU1JfRElTQUJMRV9USU1FT1VUKQogCQlkZXZfd2Fybigmc3ItPnBkZXYtPmRldiwgIiVzOiBTbWFydHJlZmxleCBkaXNhYmxlIHRpbWVkb3V0XG4iLAotCQkJX19mdW5jX18pOworCQkJIF9fZnVuY19fKTsKIAogCS8qIERpc2FibGUgTUNVRGlzYWJsZUFja25vd2xlZGdlIGludGVycnVwdCAmIGNsZWFyIHBlbmRpbmcgaW50ZXJydXB0ICovCiAJc3JfbW9kaWZ5X3JlZyhzciwgRVJSQ09ORklHX1YxLCBFUlJDT05GSUdfTUNVRElTQUNLSU5URU4sCkBAIC0zMDgsNyArMzA3LDcgQEAKIAogCWlmICh0aW1lb3V0ID49IFNSX0RJU0FCTEVfVElNRU9VVCkKIAkJZGV2X3dhcm4oJnNyLT5wZGV2LT5kZXYsICIlczogU21hcnRyZWZsZXggZGlzYWJsZSB0aW1lZG91dFxuIiwKLQkJCV9fZnVuY19fKTsKKwkJCSBfX2Z1bmNfXyk7CiAKIAkvKiBEaXNhYmxlIE1DVURpc2FibGVBY2tub3dsZWRnZSBpbnRlcnJ1cHQgJiBjbGVhciBwZW5kaW5nIGludGVycnVwdCAqLwogCXNyX3dyaXRlX3JlZyhzciwgSVJRRU5BQkxFX0NMUiwgSVJRRU5BQkxFX01DVURJU0FCTEVBQ0tJTlQpOwpAQCAtMzIyLDcgKzMyMSw3IEBACiAKIAlpZiAoIXNyLT5udmFsdWVfdGFibGUpIHsKIAkJZGV2X3dhcm4oJnNyLT5wZGV2LT5kZXYsICIlczogTWlzc2luZyBudGFyZ2V0IHZhbHVlIHRhYmxlXG4iLAotCQkJX19mdW5jX18pOworCQkJIF9fZnVuY19fKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0zNTYsOCArMzU1LDggQEAKIAl1OCBzZW5wX3NoaWZ0LCBzZW5uX3NoaWZ0OwogCiAJaWYgKCFzcikgewotCQlwcl93YXJuKCIlczogTlVMTCBvbWFwX3NyIGZyb20gJXBGXG4iLCBfX2Z1bmNfXywKLQkJCSh2b2lkICopX1JFVF9JUF8pOworCQlwcl93YXJuKCIlczogTlVMTCBvbWFwX3NyIGZyb20gJXBGXG4iLAorCQkJX19mdW5jX18sICh2b2lkICopX1JFVF9JUF8pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTM4Nyw4ICszODYsOCBAQAogCQl2cGJvdW5kaW50X3N0ID0gRVJSQ09ORklHX1ZQQk9VTkRJTlRTVF9WMjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2Vycigmc3ItPnBkZXYtPmRldiwgIiVzOiBUcnlpbmcgdG8gQ29uZmlndXJlIHNtYXJ0cmVmbGV4IgotCQkJIm1vZHVsZSB3aXRob3V0IHNwZWNpZnlpbmcgdGhlIGlwXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9lcnIoJnNyLT5wZGV2LT5kZXYsICIlczogVHJ5aW5nIHRvIENvbmZpZ3VyZSBzbWFydHJlZmxleCBtb2R1bGUgd2l0aG91dCBzcGVjaWZ5aW5nIHRoZSBpcFxuIiwKKwkJCV9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC00MjMsOCArNDIyLDggQEAKIAl1MzIgdnBib3VuZGludF9lbiwgdnBib3VuZGludF9zdDsKIAogCWlmICghc3IpIHsKLQkJcHJfd2FybigiJXM6IE5VTEwgb21hcF9zciBmcm9tICVwRlxuIiwgX19mdW5jX18sCi0JCQkodm9pZCAqKV9SRVRfSVBfKTsKKwkJcHJfd2FybigiJXM6IE5VTEwgb21hcF9zciBmcm9tICVwRlxuIiwKKwkJCV9fZnVuY19fLCAodm9pZCAqKV9SRVRfSVBfKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC00NDAsOCArNDM5LDggQEAKIAkJdnBib3VuZGludF9zdCA9IEVSUkNPTkZJR19WUEJPVU5ESU5UU1RfVjI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9lcnIoJnNyLT5wZGV2LT5kZXYsICIlczogVHJ5aW5nIHRvIENvbmZpZ3VyZSBzbWFydHJlZmxleCIKLQkJCSJtb2R1bGUgd2l0aG91dCBzcGVjaWZ5aW5nIHRoZSBpcFxuIiwgX19mdW5jX18pOworCQlkZXZfZXJyKCZzci0+cGRldi0+ZGV2LCAiJXM6IFRyeWluZyB0byBDb25maWd1cmUgc21hcnRyZWZsZXggbW9kdWxlIHdpdGhvdXQgc3BlY2lmeWluZyB0aGUgaXBcbiIsCisJCQlfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNDc4LDggKzQ3Nyw4IEBACiAJdTggc2VucF9zaGlmdCwgc2Vubl9zaGlmdDsKIAogCWlmICghc3IpIHsKLQkJcHJfd2FybigiJXM6IE5VTEwgb21hcF9zciBmcm9tICVwRlxuIiwgX19mdW5jX18sCi0JCQkodm9pZCAqKV9SRVRfSVBfKTsKKwkJcHJfd2FybigiJXM6IE5VTEwgb21hcF9zciBmcm9tICVwRlxuIiwKKwkJCV9fZnVuY19fLCAodm9pZCAqKV9SRVRfSVBfKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC01MDQsOCArNTAzLDggQEAKIAkJc2VucF9zaGlmdCA9IFNSQ09ORklHX1NFTlBFTkFCTEVfVjJfU0hJRlQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9lcnIoJnNyLT5wZGV2LT5kZXYsICIlczogVHJ5aW5nIHRvIENvbmZpZ3VyZSBzbWFydHJlZmxleCIKLQkJCSJtb2R1bGUgd2l0aG91dCBzcGVjaWZ5aW5nIHRoZSBpcFxuIiwgX19mdW5jX18pOworCQlkZXZfZXJyKCZzci0+cGRldi0+ZGV2LCAiJXM6IFRyeWluZyB0byBDb25maWd1cmUgc21hcnRyZWZsZXggbW9kdWxlIHdpdGhvdXQgc3BlY2lmeWluZyB0aGUgaXBcbiIsCisJCQlfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNTM3LDggKzUzNiw4IEBACiAJCQlJUlFFTkFCTEVfTUNVQk9VTkRTSU5UIHwgSVJRRU5BQkxFX01DVURJU0FCTEVBQ0tJTlQpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfZXJyKCZzci0+cGRldi0+ZGV2LCAiJXM6IFRyeWluZyB0byBDb25maWd1cmUgc21hcnRyZWZsZXgiCi0JCQkibW9kdWxlIHdpdGhvdXQgc3BlY2lmeWluZyB0aGUgaXBcbiIsIF9fZnVuY19fKTsKKwkJZGV2X2Vycigmc3ItPnBkZXYtPmRldiwgIiVzOiBUcnlpbmcgdG8gQ29uZmlndXJlIHNtYXJ0cmVmbGV4IG1vZHVsZSB3aXRob3V0IHNwZWNpZnlpbmcgdGhlIGlwXG4iLAorCQkJX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTU2MywxNiArNTYyLDE2IEBACiAJaW50IHJldDsKIAogCWlmICghc3IpIHsKLQkJcHJfd2FybigiJXM6IE5VTEwgb21hcF9zciBmcm9tICVwRlxuIiwgX19mdW5jX18sCi0JCQkodm9pZCAqKV9SRVRfSVBfKTsKKwkJcHJfd2FybigiJXM6IE5VTEwgb21hcF9zciBmcm9tICVwRlxuIiwKKwkJCV9fZnVuY19fLCAodm9pZCAqKV9SRVRfSVBfKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJdm9sdF9kYXRhID0gb21hcF92b2x0YWdlX2dldF92b2x0ZGF0YShzci0+dm9sdGRtLCB2b2x0KTsKIAogCWlmIChJU19FUlIodm9sdF9kYXRhKSkgewotCQlkZXZfd2Fybigmc3ItPnBkZXYtPmRldiwgIiVzOiBVbmFibGUgdG8gZ2V0IHZvbHRhZ2UgdGFibGUiCi0JCQkiZm9yIG5vbWluYWwgdm9sdGFnZSAlbGRcbiIsIF9fZnVuY19fLCB2b2x0KTsKKwkJZGV2X3dhcm4oJnNyLT5wZGV2LT5kZXYsICIlczogVW5hYmxlIHRvIGdldCB2b2x0YWdlIHRhYmxlIGZvciBub21pbmFsIHZvbHRhZ2UgJWxkXG4iLAorCQkJIF9fZnVuY19fLCB2b2x0KTsKIAkJcmV0dXJuIFBUUl9FUlIodm9sdF9kYXRhKTsKIAl9CiAKQEAgLTYxNSw4ICs2MTQsOCBAQAogdm9pZCBzcl9kaXNhYmxlKHN0cnVjdCBvbWFwX3NyICpzcikKIHsKIAlpZiAoIXNyKSB7Ci0JCXByX3dhcm4oIiVzOiBOVUxMIG9tYXBfc3IgZnJvbSAlcEZcbiIsIF9fZnVuY19fLAotCQkJKHZvaWQgKilfUkVUX0lQXyk7CisJCXByX3dhcm4oIiVzOiBOVUxMIG9tYXBfc3IgZnJvbSAlcEZcbiIsCisJCQlfX2Z1bmNfXywgKHZvaWQgKilfUkVUX0lQXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTY1OCwxMyArNjU3LDEzIEBACiAJc3RydWN0IG9tYXBfc3IgKnNyX2luZm87CiAKIAlpZiAoIWNsYXNzX2RhdGEpIHsKLQkJcHJfd2FybmluZygiJXM6LCBTbWFydHJlZmxleCBjbGFzcyBkYXRhIHBhc3NlZCBpcyBOVUxMXG4iLAorCQlwcl93YXJuKCIlczosIFNtYXJ0cmVmbGV4IGNsYXNzIGRhdGEgcGFzc2VkIGlzIE5VTExcbiIsCiAJCQlfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmIChzcl9jbGFzcykgewotCQlwcl93YXJuaW5nKCIlczogU21hcnRyZWZsZXggY2xhc3MgZHJpdmVyIGFscmVhZHkgcmVnaXN0ZXJlZFxuIiwKKwkJcHJfd2FybigiJXM6IFNtYXJ0cmVmbGV4IGNsYXNzIGRyaXZlciBhbHJlYWR5IHJlZ2lzdGVyZWRcbiIsCiAJCQlfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtNjk2LDcgKzY5NSw3IEBACiAJc3RydWN0IG9tYXBfc3IgKnNyID0gX3NyX2xvb2t1cCh2b2x0ZG0pOwogCiAJaWYgKElTX0VSUihzcikpIHsKLQkJcHJfd2FybmluZygiJXM6IG9tYXBfc3Igc3RydWN0IGZvciB2b2x0ZG0gbm90IGZvdW5kXG4iLAlfX2Z1bmNfXyk7CisJCXByX3dhcm4oIiVzOiBvbWFwX3NyIHN0cnVjdCBmb3Igdm9sdGRtIG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC03MDQsOCArNzAzLDggQEAKIAkJcmV0dXJuOwogCiAJaWYgKCFzcl9jbGFzcyB8fCAhKHNyX2NsYXNzLT5lbmFibGUpIHx8ICEoc3JfY2xhc3MtPmNvbmZpZ3VyZSkpIHsKLQkJZGV2X3dhcm4oJnNyLT5wZGV2LT5kZXYsICIlczogc21hcnRyZWZsZXggY2xhc3MgZHJpdmVyIG5vdCIKLQkJCSJyZWdpc3RlcmVkXG4iLCBfX2Z1bmNfXyk7CisJCWRldl93YXJuKCZzci0+cGRldi0+ZGV2LCAiJXM6IHNtYXJ0cmVmbGV4IGNsYXNzIGRyaXZlciBub3QgcmVnaXN0ZXJlZFxuIiwKKwkJCSBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTcyOCw3ICs3MjcsNyBAQAogCXN0cnVjdCBvbWFwX3NyICpzciA9IF9zcl9sb29rdXAodm9sdGRtKTsKIAogCWlmIChJU19FUlIoc3IpKSB7Ci0JCXByX3dhcm5pbmcoIiVzOiBvbWFwX3NyIHN0cnVjdCBmb3Igdm9sdGRtIG5vdCBmb3VuZFxuIiwJX19mdW5jX18pOworCQlwcl93YXJuKCIlczogb21hcF9zciBzdHJ1Y3QgZm9yIHZvbHRkbSBub3QgZm91bmRcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNzM2LDggKzczNSw4IEBACiAJCXJldHVybjsKIAogCWlmICghc3JfY2xhc3MgfHwgIShzcl9jbGFzcy0+ZGlzYWJsZSkpIHsKLQkJZGV2X3dhcm4oJnNyLT5wZGV2LT5kZXYsICIlczogc21hcnRyZWZsZXggY2xhc3MgZHJpdmVyIG5vdCIKLQkJCSJyZWdpc3RlcmVkXG4iLCBfX2Z1bmNfXyk7CisJCWRldl93YXJuKCZzci0+cGRldi0+ZGV2LCAiJXM6IHNtYXJ0cmVmbGV4IGNsYXNzIGRyaXZlciBub3QgcmVnaXN0ZXJlZFxuIiwKKwkJCSBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTc2MCw3ICs3NTksNyBAQAogCXN0cnVjdCBvbWFwX3NyICpzciA9IF9zcl9sb29rdXAodm9sdGRtKTsKIAogCWlmIChJU19FUlIoc3IpKSB7Ci0JCXByX3dhcm5pbmcoIiVzOiBvbWFwX3NyIHN0cnVjdCBmb3Igdm9sdGRtIG5vdCBmb3VuZFxuIiwJX19mdW5jX18pOworCQlwcl93YXJuKCIlczogb21hcF9zciBzdHJ1Y3QgZm9yIHZvbHRkbSBub3QgZm91bmRcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNzY4LDggKzc2Nyw4IEBACiAJCXJldHVybjsKIAogCWlmICghc3JfY2xhc3MgfHwgIShzcl9jbGFzcy0+ZGlzYWJsZSkpIHsKLQkJZGV2X3dhcm4oJnNyLT5wZGV2LT5kZXYsICIlczogc21hcnRyZWZsZXggY2xhc3MgZHJpdmVyIG5vdCIKLQkJCSJyZWdpc3RlcmVkXG4iLCBfX2Z1bmNfXyk7CisJCWRldl93YXJuKCZzci0+cGRldi0+ZGV2LCAiJXM6IHNtYXJ0cmVmbGV4IGNsYXNzIGRyaXZlciBub3QgcmVnaXN0ZXJlZFxuIiwKKwkJCSBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTc4Nyw4ICs3ODYsOCBAQAogdm9pZCBvbWFwX3NyX3JlZ2lzdGVyX3BtaWMoc3RydWN0IG9tYXBfc3JfcG1pY19kYXRhICpwbWljX2RhdGEpCiB7CiAJaWYgKCFwbWljX2RhdGEpIHsKLQkJcHJfd2FybmluZygiJXM6IFRyeWluZyB0byByZWdpc3RlciBOVUxMIFBNSUMgZGF0YSBzdHJ1Y3R1cmUiCi0JCQkid2l0aCBzbWFydHJlZmxleFxuIiwgX19mdW5jX18pOworCQlwcl93YXJuKCIlczogVHJ5aW5nIHRvIHJlZ2lzdGVyIE5VTEwgUE1JQyBkYXRhIHN0cnVjdHVyZSB3aXRoIHNtYXJ0cmVmbGV4XG4iLAorCQkJX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC04MDEsNyArODAwLDcgQEAKIAlzdHJ1Y3Qgb21hcF9zciAqc3JfaW5mbyA9IGRhdGE7CiAKIAlpZiAoIXNyX2luZm8pIHsKLQkJcHJfd2FybmluZygiJXM6IG9tYXBfc3Igc3RydWN0IG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOworCQlwcl93YXJuKCIlczogb21hcF9zciBzdHJ1Y3Qgbm90IGZvdW5kXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtODE1LDEzICs4MTQsMTMgQEAKIAlzdHJ1Y3Qgb21hcF9zciAqc3JfaW5mbyA9IGRhdGE7CiAKIAlpZiAoIXNyX2luZm8pIHsKLQkJcHJfd2FybmluZygiJXM6IG9tYXBfc3Igc3RydWN0IG5vdCBmb3VuZFxuIiwgX19mdW5jX18pOworCQlwcl93YXJuKCIlczogb21hcF9zciBzdHJ1Y3Qgbm90IGZvdW5kXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCS8qIFNhbml0eSBjaGVjayAqLwogCWlmICh2YWwgPiAxKSB7Ci0JCXByX3dhcm5pbmcoIiVzOiBJbnZhbGlkIGFyZ3VtZW50ICVsbGRcbiIsIF9fZnVuY19fLCB2YWwpOworCQlwcl93YXJuKCIlczogSW52YWxpZCBhcmd1bWVudCAlbGxkXG4iLCBfX2Z1bmNfXywgdmFsKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC04NDgsMTkgKzg0NywxMyBAQAogCWludCBpLCByZXQgPSAwOwogCiAJc3JfaW5mbyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IG9tYXBfc3IpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNyX2luZm8pIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSBzcl9pbmZvXG4iLAotCQkJX19mdW5jX18pOworCWlmICghc3JfaW5mbykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJc3JfaW5mby0+bmFtZSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAogCQkJCSAgICAgU01BUlRSRUZMRVhfTkFNRV9MRU4sIEdGUF9LRVJORUwpOwotCWlmICghc3JfaW5mby0+bmFtZSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogdW5hYmxlIHRvIGFsbG9jYXRlIFNSIGluc3RhbmNlIG5hbWVcbiIsCi0JCQlfX2Z1bmNfXyk7CisJaWYgKCFzcl9pbmZvLT5uYW1lKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBzcl9pbmZvKTsKIApAQCAtOTEyLDcgKzkwNSw3IEBACiAJaWYgKHNyX2NsYXNzKSB7CiAJCXJldCA9IHNyX2xhdGVfaW5pdChzcl9pbmZvKTsKIAkJaWYgKHJldCkgewotCQkJcHJfd2FybmluZygiJXM6IEVycm9yIGluIFNSIGxhdGUgaW5pdFxuIiwgX19mdW5jX18pOworCQkJcHJfd2FybigiJXM6IEVycm9yIGluIFNSIGxhdGUgaW5pdFxuIiwgX19mdW5jX18pOwogCQkJZ290byBlcnJfbGlzdF9kZWw7CiAJCX0KIAl9CkBAIC05MjMsNyArOTE2LDcgQEAKIAkJaWYgKElTX0VSUl9PUl9OVUxMKHNyX2RiZ19kaXIpKSB7CiAJCQlyZXQgPSBQVFJfRVJSKHNyX2RiZ19kaXIpOwogCQkJcHJfZXJyKCIlczpzciBkZWJ1Z2ZzIGRpciBjcmVhdGlvbiBmYWlsZWQoJWQpXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOworCQkJICAgICAgIF9fZnVuY19fLCByZXQpOwogCQkJZ290byBlcnJfbGlzdF9kZWw7CiAJCX0KIAl9CkBAIC05NDUsOCArOTM4LDggQEAKIAogCW52YWx1ZV9kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoIm52YWx1ZSIsIHNyX2luZm8tPmRiZ19kaXIpOwogCWlmIChJU19FUlJfT1JfTlVMTChudmFsdWVfZGlyKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogVW5hYmxlIHRvIGNyZWF0ZSBkZWJ1Z2ZzIGRpcmVjdG9yeSIKLQkJCSJmb3Igbi12YWx1ZXNcbiIsIF9fZnVuY19fKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IFVuYWJsZSB0byBjcmVhdGUgZGVidWdmcyBkaXJlY3RvcnkgZm9yIG4tdmFsdWVzXG4iLAorCQkJX19mdW5jX18pOwogCQlyZXQgPSBQVFJfRVJSKG52YWx1ZV9kaXIpOwogCQlnb3RvIGVycl9kZWJ1Z2ZzOwogCX0KQEAgLTEwNTMsMTIgKzEwNDYsMTIgQEAKIAlpZiAoc3JfcG1pY19kYXRhICYmIHNyX3BtaWNfZGF0YS0+c3JfcG1pY19pbml0KQogCQlzcl9wbWljX2RhdGEtPnNyX3BtaWNfaW5pdCgpOwogCWVsc2UKLQkJcHJfd2FybmluZygiJXM6IE5vIFBNSUMgaG9vayB0byBpbml0IHNtYXJ0cmVmbGV4XG4iLCBfX2Z1bmNfXyk7CisJCXByX3dhcm4oIiVzOiBObyBQTUlDIGhvb2sgdG8gaW5pdCBzbWFydHJlZmxleFxuIiwgX19mdW5jX18pOwogCiAJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZzbWFydHJlZmxleF9kcml2ZXIsIG9tYXBfc3JfcHJvYmUpOwogCWlmIChyZXQpIHsKIAkJcHJfZXJyKCIlczogcGxhdGZvcm0gZHJpdmVyIHJlZ2lzdGVyIGZhaWxlZCBmb3IgU1JcbiIsCi0JCQlfX2Z1bmNfXyk7CisJCSAgICAgICBfX2Z1bmNfXyk7CiAJCXJldHVybiByZXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2F4cDI4OF9jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL2F4cDI4OF9jaGFyZ2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMzBlZWIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9wb3dlci9heHAyODhfY2hhcmdlci5jCisrKyAvZGV2L251bGwKQEAgLTEsOTcwICswLDAgQEAKLS8qCi0gKiBheHAyODhfY2hhcmdlci5jIC0gWC1wb3dlciBBWFAyODggUE1JQyBDaGFyZ2VyIGRyaXZlcgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbgotICogQXV0aG9yOiBSYW1ha3Jpc2huYSBQYWxsYWxhIDxyYW1ha3Jpc2huYS5wYWxsYWxhQGludGVsLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiL290Zy5oPgotI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+Ci0jaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9wZXJ0eS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9heHAyMHguaD4KLSNpbmNsdWRlIDxsaW51eC9leHRjb24uaD4KLQotI2RlZmluZSBQU19TVEFUX1ZCVVNfVFJJR0dFUgkJKDEgPDwgMCkKLSNkZWZpbmUgUFNfU1RBVF9CQVRfQ0hSR19ESVIJCSgxIDw8IDIpCi0jZGVmaW5lIFBTX1NUQVRfVkJBVF9BQk9WRV9WSE9MRAkoMSA8PCAzKQotI2RlZmluZSBQU19TVEFUX1ZCVVNfVkFMSUQJCSgxIDw8IDQpCi0jZGVmaW5lIFBTX1NUQVRfVkJVU19QUkVTRU5UCQkoMSA8PCA1KQotCi0jZGVmaW5lIENIUkdfU1RBVF9CQVRfU0FGRV9NT0RFCQkoMSA8PCAzKQotI2RlZmluZSBDSFJHX1NUQVRfQkFUX1ZBTElECQkoMSA8PCA0KQotI2RlZmluZSBDSFJHX1NUQVRfQkFUX1BSRVNFTlQJCSgxIDw8IDUpCi0jZGVmaW5lIENIUkdfU1RBVF9DSEFSR0lORwkJKDEgPDwgNikKLSNkZWZpbmUgQ0hSR19TVEFUX1BNSUNfT1RQCQkoMSA8PCA3KQotCi0jZGVmaW5lIFZCVVNfSVNQT1VUX0NVUl9MSU1fTUFTSwkweDAzCi0jZGVmaW5lIFZCVVNfSVNQT1VUX0NVUl9MSU1fQklUX1BPUwkwCi0jZGVmaW5lIFZCVVNfSVNQT1VUX0NVUl9MSU1fOTAwTUEJMHgwCS8qIDkwMG1BICovCi0jZGVmaW5lIFZCVVNfSVNQT1VUX0NVUl9MSU1fMTUwME1BCTB4MQkvKiAxNTAwbUEgKi8KLSNkZWZpbmUgVkJVU19JU1BPVVRfQ1VSX0xJTV8yMDAwTUEJMHgyCS8qIDIwMDBtQSAqLwotI2RlZmluZSBWQlVTX0lTUE9VVF9DVVJfTk9fTElNCQkweDMJLyogMjUwMG1BICovCi0jZGVmaW5lIFZCVVNfSVNQT1VUX1ZIT0xEX1NFVF9NQVNLCTB4MzEKLSNkZWZpbmUgVkJVU19JU1BPVVRfVkhPTERfU0VUX0JJVF9QT1MJMHgzCi0jZGVmaW5lIFZCVVNfSVNQT1VUX1ZIT0xEX1NFVF9PRkZTRVQJNDAwMAkvKiA0MDAwbVYgKi8KLSNkZWZpbmUgVkJVU19JU1BPVVRfVkhPTERfU0VUX0xTQl9SRVMJMTAwCS8qIDEwMG1WICovCi0jZGVmaW5lIFZCVVNfSVNQT1VUX1ZIT0xEX1NFVF80MzAwTVYJMHgzCS8qIDQzMDBtViAqLwotI2RlZmluZSBWQlVTX0lTUE9VVF9WQlVTX1BBVEhfRElTCSgxIDw8IDcpCi0KLSNkZWZpbmUgQ0hSR19DQ0NWX0NDX01BU0sJCTB4ZgkJLyogNCBiaXRzICovCi0jZGVmaW5lIENIUkdfQ0NDVl9DQ19CSVRfUE9TCQkwCi0jZGVmaW5lIENIUkdfQ0NDVl9DQ19PRkZTRVQJCTIwMAkJLyogMjAwbUEgKi8KLSNkZWZpbmUgQ0hSR19DQ0NWX0NDX0xTQl9SRVMJCTIwMAkJLyogMjAwbUEgKi8KLSNkZWZpbmUgQ0hSR19DQ0NWX0lURVJNXzIwUAkJKDEgPDwgNCkJLyogMjAlIG9mIENDICovCi0jZGVmaW5lIENIUkdfQ0NDVl9DVl9NQVNLCQkweDYwCQkvKiAyIGJpdHMgKi8KLSNkZWZpbmUgQ0hSR19DQ0NWX0NWX0JJVF9QT1MJCTUKLSNkZWZpbmUgQ0hSR19DQ0NWX0NWXzQxMDBNVgkJMHgwCQkvKiA0LjEwViAqLwotI2RlZmluZSBDSFJHX0NDQ1ZfQ1ZfNDE1ME1WCQkweDEJCS8qIDQuMTVWICovCi0jZGVmaW5lIENIUkdfQ0NDVl9DVl80MjAwTVYJCTB4MgkJLyogNC4yMFYgKi8KLSNkZWZpbmUgQ0hSR19DQ0NWX0NWXzQzNTBNVgkJMHgzCQkvKiA0LjM1ViAqLwotI2RlZmluZSBDSFJHX0NDQ1ZfQ0hHX0VOCQkoMSA8PCA3KQotCi0jZGVmaW5lIENOVEwyX0NDX1RJTUVPVVRfTUFTSwkJMHgzCS8qIDIgYml0cyAqLwotI2RlZmluZSBDTlRMMl9DQ19USU1FT1VUX09GRlNFVAkJNgkvKiA2IEhycyAqLwotI2RlZmluZSBDTlRMMl9DQ19USU1FT1VUX0xTQl9SRVMJMgkvKiAyIEhycyAqLwotI2RlZmluZSBDTlRMMl9DQ19USU1FT1VUXzEySFJTCQkweDMJLyogMTIgSHJzICovCi0jZGVmaW5lIENOVEwyX0NIR0xFRF9UWVBFQgkJKDEgPDwgNCkKLSNkZWZpbmUgQ05UTDJfQ0hHX09VVF9UVVJOT04JCSgxIDw8IDUpCi0jZGVmaW5lIENOVEwyX1BDX1RJTUVPVVRfTUFTSwkJMHhDMAotI2RlZmluZSBDTlRMMl9QQ19USU1FT1VUX09GRlNFVAkJNDAJLyogNDAgbWlucyAqLwotI2RlZmluZSBDTlRMMl9QQ19USU1FT1VUX0xTQl9SRVMJMTAJLyogMTAgbWlucyAqLwotI2RlZmluZSBDTlRMMl9QQ19USU1FT1VUXzcwTUlOUwkJMHgzCi0KLSNkZWZpbmUgQ0hSR19JTElNX1RFTVBfTE9PUF9FTgkJKDEgPDwgMykKLSNkZWZpbmUgQ0hSR19WQlVTX0lMSU1fTUFTSwkJMHhmMAotI2RlZmluZSBDSFJHX1ZCVVNfSUxJTV9CSVRfUE9TCQk0Ci0jZGVmaW5lIENIUkdfVkJVU19JTElNXzEwME1BCQkweDAJLyogMTAwbUEgKi8KLSNkZWZpbmUgQ0hSR19WQlVTX0lMSU1fNTAwTUEJCTB4MQkvKiA1MDBtQSAqLwotI2RlZmluZSBDSFJHX1ZCVVNfSUxJTV85MDBNQQkJMHgyCS8qIDkwMG1BICovCi0jZGVmaW5lIENIUkdfVkJVU19JTElNXzE1MDBNQQkJMHgzCS8qIDE1MDBtQSAqLwotI2RlZmluZSBDSFJHX1ZCVVNfSUxJTV8yMDAwTUEJCTB4NAkvKiAyMDAwbUEgKi8KLSNkZWZpbmUgQ0hSR19WQlVTX0lMSU1fMjUwME1BCQkweDUJLyogMjUwMG1BICovCi0jZGVmaW5lIENIUkdfVkJVU19JTElNXzMwMDBNQQkJMHg2CS8qIDMwMDBtQSAqLwotCi0jZGVmaW5lIENIUkdfVkxURkNfMEMJCQkweEE1CS8qIDAgRGVnQyAqLwotI2RlZmluZSBDSFJHX1ZIVEZDXzQ1QwkJCTB4MUYJLyogNDUgRGVnQyAqLwotCi0jZGVmaW5lIEJBVF9JUlFfQ0ZHX0NIUkdfRE9ORQkJKDEgPDwgMikKLSNkZWZpbmUgQkFUX0lSUV9DRkdfQ0hSR19TVEFSVAkJKDEgPDwgMykKLSNkZWZpbmUgQkFUX0lSUV9DRkdfQkFUX1NBRkVfRVhJVAkoMSA8PCA0KQotI2RlZmluZSBCQVRfSVJRX0NGR19CQVRfU0FGRV9FTlRFUgkoMSA8PCA1KQotI2RlZmluZSBCQVRfSVJRX0NGR19CQVRfRElTQ09OCQkoMSA8PCA2KQotI2RlZmluZSBCQVRfSVJRX0NGR19CQVRfQ09OTgkJKDEgPDwgNykKLSNkZWZpbmUgQkFUX0lSUV9DRkdfQkFUX01BU0sJCTB4RkMKLQotI2RlZmluZSBURU1QX0lSUV9DRkdfUUNCVFUJCSgxIDw8IDQpCi0jZGVmaW5lIFRFTVBfSVJRX0NGR19DQlRVCQkoMSA8PCA1KQotI2RlZmluZSBURU1QX0lSUV9DRkdfUUNCVE8JCSgxIDw8IDYpCi0jZGVmaW5lIFRFTVBfSVJRX0NGR19DQlRPCQkoMSA8PCA3KQotI2RlZmluZSBURU1QX0lSUV9DRkdfTUFTSwkJMHhGMAotCi0jZGVmaW5lIEZHX0NOVExfT0NWX0FESl9FTgkJKDEgPDwgMykKLQotI2RlZmluZSBDVl80MTAwTVYJCQk0MTAwCS8qIDQxMDBtViAqLwotI2RlZmluZSBDVl80MTUwTVYJCQk0MTUwCS8qIDQxNTBtViAqLwotI2RlZmluZSBDVl80MjAwTVYJCQk0MjAwCS8qIDQyMDBtViAqLwotI2RlZmluZSBDVl80MzUwTVYJCQk0MzUwCS8qIDQzNTBtViAqLwotCi0jZGVmaW5lIENDXzIwME1BCQkJMjAwCS8qICAyMDBtQSAqLwotI2RlZmluZSBDQ182MDBNQQkJCTYwMAkvKiAgNjAwbUEgKi8KLSNkZWZpbmUgQ0NfODAwTUEJCQk4MDAJLyogIDgwMG1BICovCi0jZGVmaW5lIENDXzEwMDBNQQkJCTEwMDAJLyogMTAwMG1BICovCi0jZGVmaW5lIENDXzE2MDBNQQkJCTE2MDAJLyogMTYwMG1BICovCi0jZGVmaW5lIENDXzIwMDBNQQkJCTIwMDAJLyogMjAwMG1BICovCi0KLSNkZWZpbmUgSUxJTV8xMDBNQQkJCTEwMAkvKiAxMDBtQSAqLwotI2RlZmluZSBJTElNXzUwME1BCQkJNTAwCS8qIDUwMG1BICovCi0jZGVmaW5lIElMSU1fOTAwTUEJCQk5MDAJLyogOTAwbUEgKi8KLSNkZWZpbmUgSUxJTV8xNTAwTUEJCQkxNTAwCS8qIDE1MDBtQSAqLwotI2RlZmluZSBJTElNXzIwMDBNQQkJCTIwMDAJLyogMjAwMG1BICovCi0jZGVmaW5lIElMSU1fMjUwME1BCQkJMjUwMAkvKiAyNTAwbUEgKi8KLSNkZWZpbmUgSUxJTV8zMDAwTUEJCQkzMDAwCS8qIDMwMDBtQSAqLwotCi0jZGVmaW5lIEFYUDI4OF9FWFRDT05fREVWX05BTUUJCSJheHAyODhfZXh0Y29uIgotCi1lbnVtIHsKLQlWQlVTX09WX0lSUSA9IDAsCi0JQ0hBUkdFX0RPTkVfSVJRLAotCUNIQVJHRV9DSEFSR0lOR19JUlEsCi0JQkFUX1NBRkVfUVVJVF9JUlEsCi0JQkFUX1NBRkVfRU5URVJfSVJRLAotCVFDQlRVX0lSUSwKLQlDQlRVX0lSUSwKLQlRQ0JUT19JUlEsCi0JQ0JUT19JUlEsCi0JQ0hSR19JTlRSX0VORCwKLX07Ci0KLXN0cnVjdCBheHAyODhfY2hyZ19pbmZvIHsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwotCXN0cnVjdCBheHAyMHhfY2hyZ19wZGF0YSAqcGRhdGE7Ci0Jc3RydWN0IHJlZ21hcCAqcmVnbWFwOwotCXN0cnVjdCByZWdtYXBfaXJxX2NoaXBfZGF0YSAqcmVnbWFwX2lycWM7Ci0JaW50IGlycVtDSFJHX0lOVFJfRU5EXTsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3lfdXNiOwotCXN0cnVjdCBtdXRleCBsb2NrOwotCi0JLyogT1RHL0hvc3QgbW9kZSAqLwotCXN0cnVjdCB7Ci0JCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwotCQlzdHJ1Y3QgZXh0Y29uX2RldiAqY2FibGU7Ci0JCXN0cnVjdCBub3RpZmllcl9ibG9jayBpZF9uYjsKLQkJYm9vbCBpZF9zaG9ydDsKLQl9IG90ZzsKLQotCS8qIFNEUC9DRFAvRENQIFVTQiBjaGFyZ2luZyBjYWJsZSBub3RpZmljYXRpb25zICovCi0Jc3RydWN0IHsKLQkJc3RydWN0IGV4dGNvbl9kZXYgKmVkZXY7Ci0JCWJvb2wgY29ubmVjdGVkOwotCQllbnVtIHBvd2VyX3N1cHBseV90eXBlIGNoZ190eXBlOwotCQlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbmI7Ci0JCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwotCX0gY2FibGU7Ci0KLQlpbnQgaGVhbHRoOwotCWludCBpbmxtdDsKLQlpbnQgY2M7Ci0JaW50IGN2OwotCWludCBtYXhfY2M7Ci0JaW50IG1heF9jdjsKLQlib29sIG9ubGluZTsKLQlib29sIHByZXNlbnQ7Ci0JYm9vbCBlbmFibGVfY2hhcmdlcjsKLQlib29sIGlzX2NoYXJnZXJfZW5hYmxlZDsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGF4cDI4OF9jaGFyZ2VyX3NldF9jYyhzdHJ1Y3QgYXhwMjg4X2NocmdfaW5mbyAqaW5mbywgaW50IGNjKQotewotCXU4IHJlZ192YWw7Ci0JaW50IHJldDsKLQotCWlmIChjYyA8IENIUkdfQ0NDVl9DQ19PRkZTRVQpCi0JCWNjID0gQ0hSR19DQ0NWX0NDX09GRlNFVDsKLQllbHNlIGlmIChjYyA+IGluZm8tPm1heF9jYykKLQkJY2MgPSBpbmZvLT5tYXhfY2M7Ci0KLQlyZWdfdmFsID0gKGNjIC0gQ0hSR19DQ0NWX0NDX09GRlNFVCkgLyBDSFJHX0NDQ1ZfQ0NfTFNCX1JFUzsKLQljYyA9IChyZWdfdmFsICogQ0hSR19DQ0NWX0NDX0xTQl9SRVMpICsgQ0hSR19DQ0NWX0NDX09GRlNFVDsKLQlyZWdfdmFsID0gcmVnX3ZhbCA8PCBDSFJHX0NDQ1ZfQ0NfQklUX1BPUzsKLQotCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhpbmZvLT5yZWdtYXAsCi0JCQkJQVhQMjBYX0NIUkdfQ1RSTDEsCi0JCQkJQ0hSR19DQ0NWX0NDX01BU0ssIHJlZ192YWwpOwotCWlmIChyZXQgPj0gMCkKLQkJaW5mby0+Y2MgPSBjYzsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGF4cDI4OF9jaGFyZ2VyX3NldF9jdihzdHJ1Y3QgYXhwMjg4X2NocmdfaW5mbyAqaW5mbywgaW50IGN2KQotewotCXU4IHJlZ192YWw7Ci0JaW50IHJldDsKLQotCWlmIChjdiA8PSBDVl80MTAwTVYpIHsKLQkJcmVnX3ZhbCA9IENIUkdfQ0NDVl9DVl80MTAwTVY7Ci0JCWN2ID0gQ1ZfNDEwME1WOwotCX0gZWxzZSBpZiAoY3YgPD0gQ1ZfNDE1ME1WKSB7Ci0JCXJlZ192YWwgPSBDSFJHX0NDQ1ZfQ1ZfNDE1ME1WOwotCQljdiA9IENWXzQxNTBNVjsKLQl9IGVsc2UgaWYgKGN2IDw9IENWXzQyMDBNVikgewotCQlyZWdfdmFsID0gQ0hSR19DQ0NWX0NWXzQyMDBNVjsKLQkJY3YgPSBDVl80MjAwTVY7Ci0JfSBlbHNlIHsKLQkJcmVnX3ZhbCA9IENIUkdfQ0NDVl9DVl80MzUwTVY7Ci0JCWN2ID0gQ1ZfNDM1ME1WOwotCX0KLQotCXJlZ192YWwgPSByZWdfdmFsIDw8IENIUkdfQ0NDVl9DVl9CSVRfUE9TOwotCi0JcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGluZm8tPnJlZ21hcCwKLQkJCQlBWFAyMFhfQ0hSR19DVFJMMSwKLQkJCQlDSFJHX0NDQ1ZfQ1ZfTUFTSywgcmVnX3ZhbCk7Ci0KLQlpZiAocmV0ID49IDApCi0JCWluZm8tPmN2ID0gY3Y7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIGludCBheHAyODhfY2hhcmdlcl9zZXRfdmJ1c19pbmxtdChzdHJ1Y3QgYXhwMjg4X2NocmdfaW5mbyAqaW5mbywKLQkJCQkJICAgaW50IGlubG10KQotewotCWludCByZXQ7Ci0JdW5zaWduZWQgaW50IHZhbDsKLQl1OCByZWdfdmFsOwotCi0JLyogUmVhZCBpbiBsaW1pdCByZWdpc3RlciAqLwotCXJldCA9IHJlZ21hcF9yZWFkKGluZm8tPnJlZ21hcCwgQVhQMjBYX0NIUkdfQkFLX0NUUkwsICZ2YWwpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIHNldF9pbmxtdF9mYWlsOwotCi0JaWYgKGlubG10IDw9IElMSU1fMTAwTUEpIHsKLQkJcmVnX3ZhbCA9IENIUkdfVkJVU19JTElNXzEwME1BOwotCQlpbmxtdCA9IElMSU1fMTAwTUE7Ci0JfSBlbHNlIGlmIChpbmxtdCA8PSBJTElNXzUwME1BKSB7Ci0JCXJlZ192YWwgPSBDSFJHX1ZCVVNfSUxJTV81MDBNQTsKLQkJaW5sbXQgPSBJTElNXzUwME1BOwotCX0gZWxzZSBpZiAoaW5sbXQgPD0gSUxJTV85MDBNQSkgewotCQlyZWdfdmFsID0gQ0hSR19WQlVTX0lMSU1fOTAwTUE7Ci0JCWlubG10ID0gSUxJTV85MDBNQTsKLQl9IGVsc2UgaWYgKGlubG10IDw9IElMSU1fMTUwME1BKSB7Ci0JCXJlZ192YWwgPSBDSFJHX1ZCVVNfSUxJTV8xNTAwTUE7Ci0JCWlubG10ID0gSUxJTV8xNTAwTUE7Ci0JfSBlbHNlIGlmIChpbmxtdCA8PSBJTElNXzIwMDBNQSkgewotCQlyZWdfdmFsID0gQ0hSR19WQlVTX0lMSU1fMjAwME1BOwotCQlpbmxtdCA9IElMSU1fMjAwME1BOwotCX0gZWxzZSBpZiAoaW5sbXQgPD0gSUxJTV8yNTAwTUEpIHsKLQkJcmVnX3ZhbCA9IENIUkdfVkJVU19JTElNXzI1MDBNQTsKLQkJaW5sbXQgPSBJTElNXzI1MDBNQTsKLQl9IGVsc2UgewotCQlyZWdfdmFsID0gQ0hSR19WQlVTX0lMSU1fMzAwME1BOwotCQlpbmxtdCA9IElMSU1fMzAwME1BOwotCX0KLQotCXJlZ192YWwgPSAodmFsICYgfkNIUkdfVkJVU19JTElNX01BU0spCi0JCQl8IChyZWdfdmFsIDw8IENIUkdfVkJVU19JTElNX0JJVF9QT1MpOwotCXJldCA9IHJlZ21hcF93cml0ZShpbmZvLT5yZWdtYXAsIEFYUDIwWF9DSFJHX0JBS19DVFJMLCByZWdfdmFsKTsKLQlpZiAocmV0ID49IDApCi0JCWluZm8tPmlubG10ID0gaW5sbXQ7Ci0JZWxzZQotCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsICJjaGFyZ2VyIEJBSyBjb250cm9sICVkXG4iLCByZXQpOwotCi0KLXNldF9pbmxtdF9mYWlsOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXhwMjg4X2NoYXJnZXJfdmJ1c19wYXRoX3NlbGVjdChzdHJ1Y3QgYXhwMjg4X2NocmdfaW5mbyAqaW5mbywKLQkJCQkJCQkJYm9vbCBlbmFibGUpCi17Ci0JaW50IHJldDsKLQotCWlmIChlbmFibGUpCi0JCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhpbmZvLT5yZWdtYXAsIEFYUDIwWF9WQlVTX0lQU09VVF9NR01ULAotCQkJCQlWQlVTX0lTUE9VVF9WQlVTX1BBVEhfRElTLCAwKTsKLQllbHNlCi0JCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhpbmZvLT5yZWdtYXAsIEFYUDIwWF9WQlVTX0lQU09VVF9NR01ULAotCQkJVkJVU19JU1BPVVRfVkJVU19QQVRIX0RJUywgVkJVU19JU1BPVVRfVkJVU19QQVRIX0RJUyk7Ci0KLQlpZiAocmV0IDwgMCkKLQkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LCAiYXhwMjg4IHZidXMgcGF0aCBzZWxlY3QgJWRcbiIsIHJldCk7Ci0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXhwMjg4X2NoYXJnZXJfZW5hYmxlX2NoYXJnZXIoc3RydWN0IGF4cDI4OF9jaHJnX2luZm8gKmluZm8sCi0JCQkJCQkJCWJvb2wgZW5hYmxlKQotewotCWludCByZXQ7Ci0KLQlpZiAoZW5hYmxlKQotCQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoaW5mby0+cmVnbWFwLCBBWFAyMFhfQ0hSR19DVFJMMSwKLQkJCQlDSFJHX0NDQ1ZfQ0hHX0VOLCBDSFJHX0NDQ1ZfQ0hHX0VOKTsKLQllbHNlCi0JCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhpbmZvLT5yZWdtYXAsIEFYUDIwWF9DSFJHX0NUUkwxLAotCQkJCUNIUkdfQ0NDVl9DSEdfRU4sIDApOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsICJheHAyODggZW5hYmxlIGNoYXJnZXIgJWRcbiIsIHJldCk7Ci0JZWxzZQotCQlpbmZvLT5pc19jaGFyZ2VyX2VuYWJsZWQgPSBlbmFibGU7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF4cDI4OF9jaGFyZ2VyX2lzX3ByZXNlbnQoc3RydWN0IGF4cDI4OF9jaHJnX2luZm8gKmluZm8pCi17Ci0JaW50IHJldCwgcHJlc2VudCA9IDA7Ci0JdW5zaWduZWQgaW50IHZhbDsKLQotCXJldCA9IHJlZ21hcF9yZWFkKGluZm8tPnJlZ21hcCwgQVhQMjBYX1BXUl9JTlBVVF9TVEFUVVMsICZ2YWwpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKHZhbCAmIFBTX1NUQVRfVkJVU19QUkVTRU5UKQotCQlwcmVzZW50ID0gMTsKLQlyZXR1cm4gcHJlc2VudDsKLX0KLQotc3RhdGljIGludCBheHAyODhfY2hhcmdlcl9pc19vbmxpbmUoc3RydWN0IGF4cDI4OF9jaHJnX2luZm8gKmluZm8pCi17Ci0JaW50IHJldCwgb25saW5lID0gMDsKLQl1bnNpZ25lZCBpbnQgdmFsOwotCi0JcmV0ID0gcmVnbWFwX3JlYWQoaW5mby0+cmVnbWFwLCBBWFAyMFhfUFdSX0lOUFVUX1NUQVRVUywgJnZhbCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAodmFsICYgUFNfU1RBVF9WQlVTX1ZBTElEKQotCQlvbmxpbmUgPSAxOwotCXJldHVybiBvbmxpbmU7Ci19Ci0KLXN0YXRpYyBpbnQgYXhwMjg4X2dldF9jaGFyZ2VyX2hlYWx0aChzdHJ1Y3QgYXhwMjg4X2NocmdfaW5mbyAqaW5mbykKLXsKLQlpbnQgcmV0LCBwd3Jfc3RhdCwgY2hyZ19zdGF0OwotCWludCBoZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOS05PV047Ci0JdW5zaWduZWQgaW50IHZhbDsKLQotCXJldCA9IHJlZ21hcF9yZWFkKGluZm8tPnJlZ21hcCwgQVhQMjBYX1BXUl9JTlBVVF9TVEFUVVMsICZ2YWwpOwotCWlmICgocmV0IDwgMCkgfHwgISh2YWwgJiBQU19TVEFUX1ZCVVNfUFJFU0VOVCkpCi0JCWdvdG8gaGVhbHRoX3JlYWRfZmFpbDsKLQllbHNlCi0JCXB3cl9zdGF0ID0gdmFsOwotCi0JcmV0ID0gcmVnbWFwX3JlYWQoaW5mby0+cmVnbWFwLCBBWFAyMFhfUFdSX09QX01PREUsICZ2YWwpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGhlYWx0aF9yZWFkX2ZhaWw7Ci0JZWxzZQotCQljaHJnX3N0YXQgPSB2YWw7Ci0KLQlpZiAoIShwd3Jfc3RhdCAmIFBTX1NUQVRfVkJVU19WQUxJRCkpCi0JCWhlYWx0aCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfREVBRDsKLQllbHNlIGlmIChjaHJnX3N0YXQgJiBDSFJHX1NUQVRfUE1JQ19PVFApCi0JCWhlYWx0aCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUkhFQVQ7Ci0JZWxzZSBpZiAoY2hyZ19zdGF0ICYgQ0hSR19TVEFUX0JBVF9TQUZFX01PREUpCi0JCWhlYWx0aCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfU0FGRVRZX1RJTUVSX0VYUElSRTsKLQllbHNlCi0JCWhlYWx0aCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfR09PRDsKLQotaGVhbHRoX3JlYWRfZmFpbDoKLQlyZXR1cm4gaGVhbHRoOwotfQotCi1zdGF0aWMgaW50IGF4cDI4OF9jaGFyZ2VyX3VzYl9zZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAotCQkJCSAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCi0JCQkJICAgIGNvbnN0IHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCi17Ci0Jc3RydWN0IGF4cDI4OF9jaHJnX2luZm8gKmluZm8gPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgc2NhbGVkX3ZhbDsKLQotCW11dGV4X2xvY2soJmluZm8tPmxvY2spOwotCi0Jc3dpdGNoIChwc3ApIHsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9DVVJSRU5UOgotCQlzY2FsZWRfdmFsID0gbWluKHZhbC0+aW50dmFsLCBpbmZvLT5tYXhfY2MpOwotCQlzY2FsZWRfdmFsID0gRElWX1JPVU5EX0NMT1NFU1Qoc2NhbGVkX3ZhbCwgMTAwMCk7Ci0JCXJldCA9IGF4cDI4OF9jaGFyZ2VyX3NldF9jYyhpbmZvLCBzY2FsZWRfdmFsKTsKLQkJaWYgKHJldCA8IDApCi0JCQlkZXZfd2FybigmaW5mby0+cGRldi0+ZGV2LCAic2V0IGNoYXJnZSBjdXJyZW50IGZhaWxlZFxuIik7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX1ZPTFRBR0U6Ci0JCXNjYWxlZF92YWwgPSBtaW4odmFsLT5pbnR2YWwsIGluZm8tPm1heF9jdik7Ci0JCXNjYWxlZF92YWwgPSBESVZfUk9VTkRfQ0xPU0VTVChzY2FsZWRfdmFsLCAxMDAwKTsKLQkJcmV0ID0gYXhwMjg4X2NoYXJnZXJfc2V0X2N2KGluZm8sIHNjYWxlZF92YWwpOwotCQlpZiAocmV0IDwgMCkKLQkJCWRldl93YXJuKCZpbmZvLT5wZGV2LT5kZXYsICJzZXQgY2hhcmdlIHZvbHRhZ2UgZmFpbGVkXG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0KLQltdXRleF91bmxvY2soJmluZm8tPmxvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXhwMjg4X2NoYXJnZXJfdXNiX2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCi0JCQkJICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKLQkJCQkgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKLXsKLQlzdHJ1Y3QgYXhwMjg4X2NocmdfaW5mbyAqaW5mbyA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwotCWludCByZXQgPSAwOwotCi0JbXV0ZXhfbG9jaygmaW5mby0+bG9jayk7Ci0KLQlzd2l0Y2ggKHBzcCkgewotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDoKLQkJLyogQ2hlY2sgZm9yIE9URyBjYXNlIGZpcnN0ICovCi0JCWlmIChpbmZvLT5vdGcuaWRfc2hvcnQpIHsKLQkJCXZhbC0+aW50dmFsID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JCXJldCA9IGF4cDI4OF9jaGFyZ2VyX2lzX3ByZXNlbnQoaW5mbyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBwc3lfZ2V0X3Byb3BfZmFpbDsKLQkJaW5mby0+cHJlc2VudCA9IHJldDsKLQkJdmFsLT5pbnR2YWwgPSBpbmZvLT5wcmVzZW50OwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORToKLQkJLyogQ2hlY2sgZm9yIE9URyBjYXNlIGZpcnN0ICovCi0JCWlmIChpbmZvLT5vdGcuaWRfc2hvcnQpIHsKLQkJCXZhbC0+aW50dmFsID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JCXJldCA9IGF4cDI4OF9jaGFyZ2VyX2lzX29ubGluZShpbmZvKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIHBzeV9nZXRfcHJvcF9mYWlsOwotCQlpbmZvLT5vbmxpbmUgPSByZXQ7Ci0JCXZhbC0+aW50dmFsID0gaW5mby0+b25saW5lOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSDoKLQkJdmFsLT5pbnR2YWwgPSBheHAyODhfZ2V0X2NoYXJnZXJfaGVhbHRoKGluZm8pOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9DVVJSRU5UOgotCQl2YWwtPmludHZhbCA9IGluZm8tPmNjICogMTAwMDsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfQ1VSUkVOVF9NQVg6Ci0JCXZhbC0+aW50dmFsID0gaW5mby0+bWF4X2NjICogMTAwMDsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfVk9MVEFHRToKLQkJdmFsLT5pbnR2YWwgPSBpbmZvLT5jdiAqIDEwMDA7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX1ZPTFRBR0VfTUFYOgotCQl2YWwtPmludHZhbCA9IGluZm8tPm1heF9jdiAqIDEwMDA7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0NPTlRST0xfTElNSVQ6Ci0JCXZhbC0+aW50dmFsID0gaW5mby0+aW5sbXQgKiAxMDAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIHBzeV9nZXRfcHJvcF9mYWlsOwotCX0KLQotcHN5X2dldF9wcm9wX2ZhaWw6Ci0JbXV0ZXhfdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF4cDI4OF9jaGFyZ2VyX3Byb3BlcnR5X2lzX3dyaXRlYWJsZShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCi0JCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCkKLXsKLQlpbnQgcmV0OwotCi0Jc3dpdGNoIChwc3ApIHsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9DVVJSRU5UOgotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX1ZPTFRBR0U6Ci0JCXJldCA9IDE7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IDA7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IGF4cDI4OF91c2JfcHJvcHNbXSA9IHsKLQlQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5ULAotCVBPV0VSX1NVUFBMWV9QUk9QX09OTElORSwKLQlQT1dFUl9TVVBQTFlfUFJPUF9UWVBFLAotCVBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfQ1VSUkVOVCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfQ1VSUkVOVF9NQVgsCi0JUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX1ZPTFRBR0UsCi0JUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX1ZPTFRBR0VfTUFYLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9DT05UUk9MX0xJTUlULAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBheHAyODhfY2hhcmdlcl9kZXNjID0gewotCS5uYW1lCQkJPSAiYXhwMjg4X2NoYXJnZXIiLAotCS50eXBlCQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9VU0IsCi0JLnByb3BlcnRpZXMJCT0gYXhwMjg4X3VzYl9wcm9wcywKLQkubnVtX3Byb3BlcnRpZXMJCT0gQVJSQVlfU0laRShheHAyODhfdXNiX3Byb3BzKSwKLQkuZ2V0X3Byb3BlcnR5CQk9IGF4cDI4OF9jaGFyZ2VyX3VzYl9nZXRfcHJvcGVydHksCi0JLnNldF9wcm9wZXJ0eQkJPSBheHAyODhfY2hhcmdlcl91c2Jfc2V0X3Byb3BlcnR5LAotCS5wcm9wZXJ0eV9pc193cml0ZWFibGUJPSBheHAyODhfY2hhcmdlcl9wcm9wZXJ0eV9pc193cml0ZWFibGUsCi19OwotCi1zdGF0aWMgaXJxcmV0dXJuX3QgYXhwMjg4X2NoYXJnZXJfaXJxX3RocmVhZF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldikKLXsKLQlzdHJ1Y3QgYXhwMjg4X2NocmdfaW5mbyAqaW5mbyA9IGRldjsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBDSFJHX0lOVFJfRU5EOyBpKyspIHsKLQkJaWYgKGluZm8tPmlycVtpXSA9PSBpcnEpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoaSA+PSBDSFJHX0lOVFJfRU5EKSB7Ci0JCWRldl93YXJuKCZpbmZvLT5wZGV2LT5kZXYsICJzcHVyaW91cyBpbnRlcnJ1cHQhIVxuIik7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9Ci0KLQlzd2l0Y2ggKGkpIHsKLQljYXNlIFZCVVNfT1ZfSVJROgotCQlkZXZfZGJnKCZpbmZvLT5wZGV2LT5kZXYsICJWQlVTIE92ZXIgVm9sdGFnZSBJTlRSXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBDSEFSR0VfRE9ORV9JUlE6Ci0JCWRldl9kYmcoJmluZm8tPnBkZXYtPmRldiwgIkNoYXJnaW5nIERvbmUgSU5UUlxuIik7Ci0JCWJyZWFrOwotCWNhc2UgQ0hBUkdFX0NIQVJHSU5HX0lSUToKLQkJZGV2X2RiZygmaW5mby0+cGRldi0+ZGV2LCAiU3RhcnQgQ2hhcmdpbmcgSVJRXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBCQVRfU0FGRV9RVUlUX0lSUToKLQkJZGV2X2RiZygmaW5mby0+cGRldi0+ZGV2LAotCQkJIlF1aXQgU2FmZSBNb2RlKHJlc3RhcnQgdGltZXIpIENoYXJnaW5nIElSUVxuIik7Ci0JCWJyZWFrOwotCWNhc2UgQkFUX1NBRkVfRU5URVJfSVJROgotCQlkZXZfZGJnKCZpbmZvLT5wZGV2LT5kZXYsCi0JCQkiRW50ZXIgU2FmZSBNb2RlKHRpbWVyIGV4cGlyZSkgQ2hhcmdpbmcgSVJRXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBRQ0JUVV9JUlE6Ci0JCWRldl9kYmcoJmluZm8tPnBkZXYtPmRldiwKLQkJCSJRdWl0IEJhdHRlcnkgVW5kZXIgVGVtcGVyYXR1cmUoQ0hSRykgSU5UUlxuIik7Ci0JCWJyZWFrOwotCWNhc2UgQ0JUVV9JUlE6Ci0JCWRldl9kYmcoJmluZm8tPnBkZXYtPmRldiwKLQkJCSJIaXQgQmF0dGVyeSBVbmRlciBUZW1wZXJhdHVyZShDSFJHKSBJTlRSXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBRQ0JUT19JUlE6Ci0JCWRldl9kYmcoJmluZm8tPnBkZXYtPmRldiwKLQkJCSJRdWl0IEJhdHRlcnkgT3ZlciBUZW1wZXJhdHVyZShDSFJHKSBJTlRSXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBDQlRPX0lSUToKLQkJZGV2X2RiZygmaW5mby0+cGRldi0+ZGV2LAotCQkJIkhpdCBCYXR0ZXJ5IE92ZXIgVGVtcGVyYXR1cmUoQ0hSRykgSU5UUlxuIik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl93YXJuKCZpbmZvLT5wZGV2LT5kZXYsICJTcHVyaW91cyBJbnRlcnJ1cHQhISFcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlwb3dlcl9zdXBwbHlfY2hhbmdlZChpbmZvLT5wc3lfdXNiKTsKLW91dDoKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGF4cDI4OF9jaGFyZ2VyX2V4dGNvbl9ldnRfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgYXhwMjg4X2NocmdfaW5mbyAqaW5mbyA9Ci0JICAgIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXhwMjg4X2NocmdfaW5mbywgY2FibGUud29yayk7Ci0JaW50IHJldCwgY3VycmVudF9saW1pdDsKLQlib29sIGNoYW5nZWQgPSBmYWxzZTsKLQlzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiA9IGluZm8tPmNhYmxlLmVkZXY7Ci0JYm9vbCBvbGRfY29ubmVjdGVkID0gaW5mby0+Y2FibGUuY29ubmVjdGVkOwotCi0JLyogRGV0ZXJtaW5lIGNhYmxlL2NoYXJnZXIgdHlwZSAqLwotCWlmIChleHRjb25fZ2V0X2NhYmxlX3N0YXRlXyhlZGV2LCBFWFRDT05fQ0hHX1VTQl9TRFApID4gMCkgewotCQlkZXZfZGJnKCZpbmZvLT5wZGV2LT5kZXYsICJVU0IgU0RQIGNoYXJnZXIgIGlzIGNvbm5lY3RlZCIpOwotCQlpbmZvLT5jYWJsZS5jb25uZWN0ZWQgPSB0cnVlOwotCQlpbmZvLT5jYWJsZS5jaGdfdHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX1VTQjsKLQl9IGVsc2UgaWYgKGV4dGNvbl9nZXRfY2FibGVfc3RhdGVfKGVkZXYsIEVYVENPTl9DSEdfVVNCX0NEUCkgPiAwKSB7Ci0JCWRldl9kYmcoJmluZm8tPnBkZXYtPmRldiwgIlVTQiBDRFAgY2hhcmdlciBpcyBjb25uZWN0ZWQiKTsKLQkJaW5mby0+Y2FibGUuY29ubmVjdGVkID0gdHJ1ZTsKLQkJaW5mby0+Y2FibGUuY2hnX3R5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9VU0JfQ0RQOwotCX0gZWxzZSBpZiAoZXh0Y29uX2dldF9jYWJsZV9zdGF0ZV8oZWRldiwgRVhUQ09OX0NIR19VU0JfRENQKSA+IDApIHsKLQkJZGV2X2RiZygmaW5mby0+cGRldi0+ZGV2LCAiVVNCIERDUCBjaGFyZ2VyIGlzIGNvbm5lY3RlZCIpOwotCQlpbmZvLT5jYWJsZS5jb25uZWN0ZWQgPSB0cnVlOwotCQlpbmZvLT5jYWJsZS5jaGdfdHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX1VTQl9EQ1A7Ci0JfSBlbHNlIHsKLQkJaWYgKG9sZF9jb25uZWN0ZWQpCi0JCQlkZXZfZGJnKCZpbmZvLT5wZGV2LT5kZXYsICJVU0IgY2hhcmdlciBkaXNjb25uZWN0ZWQiKTsKLQkJaW5mby0+Y2FibGUuY29ubmVjdGVkID0gZmFsc2U7Ci0JCWluZm8tPmNhYmxlLmNoZ190eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfVVNCOwotCX0KLQotCS8qIENhYmxlIHN0YXR1cyBjaGFuZ2VkICovCi0JaWYgKG9sZF9jb25uZWN0ZWQgIT0gaW5mby0+Y2FibGUuY29ubmVjdGVkKQotCQljaGFuZ2VkID0gdHJ1ZTsKLQotCWlmICghY2hhbmdlZCkKLQkJcmV0dXJuOwotCi0JbXV0ZXhfbG9jaygmaW5mby0+bG9jayk7Ci0KLQlpZiAoaW5mby0+aXNfY2hhcmdlcl9lbmFibGVkICYmICFpbmZvLT5jYWJsZS5jb25uZWN0ZWQpIHsKLQkJaW5mby0+ZW5hYmxlX2NoYXJnZXIgPSBmYWxzZTsKLQkJcmV0ID0gYXhwMjg4X2NoYXJnZXJfZW5hYmxlX2NoYXJnZXIoaW5mbywgaW5mby0+ZW5hYmxlX2NoYXJnZXIpOwotCQlpZiAocmV0IDwgMCkKLQkJCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwKLQkJCQkiY2Fubm90IGRpc2FibGUgY2hhcmdlciAoJWQpIiwgcmV0KTsKLQotCX0gZWxzZSBpZiAoIWluZm8tPmlzX2NoYXJnZXJfZW5hYmxlZCAmJiBpbmZvLT5jYWJsZS5jb25uZWN0ZWQpIHsKLQkJc3dpdGNoIChpbmZvLT5jYWJsZS5jaGdfdHlwZSkgewotCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX1VTQjoKLQkJCWN1cnJlbnRfbGltaXQgPSBJTElNXzUwME1BOwotCQkJYnJlYWs7Ci0JCWNhc2UgUE9XRVJfU1VQUExZX1RZUEVfVVNCX0NEUDoKLQkJCWN1cnJlbnRfbGltaXQgPSBJTElNXzE1MDBNQTsKLQkJCWJyZWFrOwotCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX1VTQl9EQ1A6Ci0JCQljdXJyZW50X2xpbWl0ID0gSUxJTV8yMDAwTUE7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCS8qIFVua25vd24gKi8KLQkJCWN1cnJlbnRfbGltaXQgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBTZXQgdmJ1cyBjdXJyZW50IGxpbWl0IGZpcnN0LCB0aGVuIGVuYWJsZSBjaGFyZ2VyICovCi0JCXJldCA9IGF4cDI4OF9jaGFyZ2VyX3NldF92YnVzX2lubG10KGluZm8sIGN1cnJlbnRfbGltaXQpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LAotCQkJCSJlcnJvciBzZXR0aW5nIGN1cnJlbnQgbGltaXQgKCVkKSIsIHJldCk7Ci0JCX0gZWxzZSB7Ci0JCQlpbmZvLT5lbmFibGVfY2hhcmdlciA9IChjdXJyZW50X2xpbWl0ID4gMCk7Ci0JCQlyZXQgPSBheHAyODhfY2hhcmdlcl9lbmFibGVfY2hhcmdlcihpbmZvLAotCQkJCQkJCWluZm8tPmVuYWJsZV9jaGFyZ2VyKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwKLQkJCQkJImNhbm5vdCBlbmFibGUgY2hhcmdlciAoJWQpIiwgcmV0KTsKLQkJfQotCX0KLQotCWlmIChjaGFuZ2VkKQotCQlpbmZvLT5oZWFsdGggPSBheHAyODhfZ2V0X2NoYXJnZXJfaGVhbHRoKGluZm8pOwotCi0JbXV0ZXhfdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQotCWlmIChjaGFuZ2VkKQotCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChpbmZvLT5wc3lfdXNiKTsKLX0KLQotc3RhdGljIGludCBheHAyODhfY2hhcmdlcl9oYW5kbGVfY2FibGVfZXZ0KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCi0JCQkJCSAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcGFyYW0pCi17Ci0Jc3RydWN0IGF4cDI4OF9jaHJnX2luZm8gKmluZm8gPQotCSAgICBjb250YWluZXJfb2YobmIsIHN0cnVjdCBheHAyODhfY2hyZ19pbmZvLCBjYWJsZS5uYik7Ci0KLQlzY2hlZHVsZV93b3JrKCZpbmZvLT5jYWJsZS53b3JrKTsKLQotCXJldHVybiBOT1RJRllfT0s7Ci19Ci0KLXN0YXRpYyB2b2lkIGF4cDI4OF9jaGFyZ2VyX290Z19ldnRfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgYXhwMjg4X2NocmdfaW5mbyAqaW5mbyA9Ci0JICAgIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXhwMjg4X2NocmdfaW5mbywgb3RnLndvcmspOwotCWludCByZXQ7Ci0KLQkvKiBEaXNhYmxlIFZCVVMgcGF0aCBiZWZvcmUgZW5hYmxpbmcgdGhlIDVWIGJvb3N0ICovCi0JcmV0ID0gYXhwMjg4X2NoYXJnZXJfdmJ1c19wYXRoX3NlbGVjdChpbmZvLCAhaW5mby0+b3RnLmlkX3Nob3J0KTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X3dhcm4oJmluZm8tPnBkZXYtPmRldiwgInZidXMgcGF0aCBkaXNhYmxlIGZhaWxlZFxuIik7Ci19Ci0KLXN0YXRpYyBpbnQgYXhwMjg4X2NoYXJnZXJfaGFuZGxlX290Z19ldnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKLQkJCQkgICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwYXJhbSkKLXsKLQlzdHJ1Y3QgYXhwMjg4X2NocmdfaW5mbyAqaW5mbyA9Ci0JICAgIGNvbnRhaW5lcl9vZihuYiwgc3RydWN0IGF4cDI4OF9jaHJnX2luZm8sIG90Zy5pZF9uYik7Ci0Jc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYgPSBpbmZvLT5vdGcuY2FibGU7Ci0JaW50IHVzYl9ob3N0ID0gZXh0Y29uX2dldF9jYWJsZV9zdGF0ZV8oZWRldiwgRVhUQ09OX1VTQl9IT1NUKTsKLQotCWRldl9kYmcoJmluZm8tPnBkZXYtPmRldiwgImV4dGVybmFsIGNvbm5lY3RvciBVU0ItSG9zdCBpcyAlc1xuIiwKLQkJCQl1c2JfaG9zdCA/ICJhdHRhY2hlZCIgOiAiZGV0YWNoZWQiKTsKLQotCS8qCi0JICogU2V0IHVzYl9pZF9zaG9ydCBmbGFnIHRvIGF2b2lkIHJ1bm5pbmcgY2hhcmdlciBkZXRlY3Rpb24gbG9naWMKLQkgKiBpbiBjYXNlIHVzYiBob3N0LgotCSAqLwotCWluZm8tPm90Zy5pZF9zaG9ydCA9IHVzYl9ob3N0OwotCXNjaGVkdWxlX3dvcmsoJmluZm8tPm90Zy53b3JrKTsKLQotCXJldHVybiBOT1RJRllfT0s7Ci19Ci0KLXN0YXRpYyB2b2lkIGNoYXJnZXJfaW5pdF9od19yZWdzKHN0cnVjdCBheHAyODhfY2hyZ19pbmZvICppbmZvKQotewotCWludCByZXQsIGNjLCBjdjsKLQl1bnNpZ25lZCBpbnQgdmFsOwotCi0JLyogUHJvZ3JhbSB0ZW1wZXJhdHVyZSB0aHJlc2hvbGRzICovCi0JcmV0ID0gcmVnbWFwX3dyaXRlKGluZm8tPnJlZ21hcCwgQVhQMjBYX1ZfTFRGX0NIUkcsIENIUkdfVkxURkNfMEMpOwotCWlmIChyZXQgPCAwKQotCQlkZXZfd2FybigmaW5mby0+cGRldi0+ZGV2LCAicmVnaXN0ZXIoJXgpIHdyaXRlIGVycm9yKCVkKVxuIiwKLQkJCQkJCQlBWFAyMFhfVl9MVEZfQ0hSRywgcmV0KTsKLQotCXJldCA9IHJlZ21hcF93cml0ZShpbmZvLT5yZWdtYXAsIEFYUDIwWF9WX0hURl9DSFJHLCBDSFJHX1ZIVEZDXzQ1Qyk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl93YXJuKCZpbmZvLT5wZGV2LT5kZXYsICJyZWdpc3RlcigleCkgd3JpdGUgZXJyb3IoJWQpXG4iLAotCQkJCQkJCUFYUDIwWF9WX0hURl9DSFJHLCByZXQpOwotCi0JLyogRG8gbm90IHR1cm4tb2ZmIGNoYXJnZXIgby9wIGFmdGVyIGNoYXJnZSBjeWNsZSBlbmRzICovCi0JcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGluZm8tPnJlZ21hcCwKLQkJCQlBWFAyMFhfQ0hSR19DVFJMMiwKLQkJCQlDTlRMMl9DSEdfT1VUX1RVUk5PTiwgMSk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl93YXJuKCZpbmZvLT5wZGV2LT5kZXYsICJyZWdpc3RlcigleCkgd3JpdGUgZXJyb3IoJWQpXG4iLAotCQkJCQkJQVhQMjBYX0NIUkdfQ1RSTDIsIHJldCk7Ci0KLQkvKiBFbmFibGUgaW50ZXJydXB0cyAqLwotCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhpbmZvLT5yZWdtYXAsCi0JCQkJQVhQMjBYX0lSUTJfRU4sCi0JCQkJQkFUX0lSUV9DRkdfQkFUX01BU0ssIDEpOwotCWlmIChyZXQgPCAwKQotCQlkZXZfd2FybigmaW5mby0+cGRldi0+ZGV2LCAicmVnaXN0ZXIoJXgpIHdyaXRlIGVycm9yKCVkKVxuIiwKLQkJCQkJCUFYUDIwWF9JUlEyX0VOLCByZXQpOwotCi0JcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGluZm8tPnJlZ21hcCwgQVhQMjBYX0lSUTNfRU4sCi0JCQkJVEVNUF9JUlFfQ0ZHX01BU0ssIDEpOwotCWlmIChyZXQgPCAwKQotCQlkZXZfd2FybigmaW5mby0+cGRldi0+ZGV2LCAicmVnaXN0ZXIoJXgpIHdyaXRlIGVycm9yKCVkKVxuIiwKLQkJCQkJCUFYUDIwWF9JUlEzX0VOLCByZXQpOwotCi0JLyogU2V0dXAgZW5kaW5nIGNvbmRpdGlvbiBmb3IgY2hhcmdpbmcgdG8gYmUgMTAlIG9mIEkoY2hyZykgKi8KLQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoaW5mby0+cmVnbWFwLAotCQkJCUFYUDIwWF9DSFJHX0NUUkwxLAotCQkJCUNIUkdfQ0NDVl9JVEVSTV8yMFAsIDApOwotCWlmIChyZXQgPCAwKQotCQlkZXZfd2FybigmaW5mby0+cGRldi0+ZGV2LCAicmVnaXN0ZXIoJXgpIHdyaXRlIGVycm9yKCVkKVxuIiwKLQkJCQkJCUFYUDIwWF9DSFJHX0NUUkwxLCByZXQpOwotCi0JLyogRGlzYWJsZSBPQ1YtU09DIGN1cnZlIGNhbGlicmF0aW9uICovCi0JcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGluZm8tPnJlZ21hcCwKLQkJCQlBWFAyMFhfQ0NfQ1RSTCwKLQkJCQlGR19DTlRMX09DVl9BREpfRU4sIDApOwotCWlmIChyZXQgPCAwKQotCQlkZXZfd2FybigmaW5mby0+cGRldi0+ZGV2LCAicmVnaXN0ZXIoJXgpIHdyaXRlIGVycm9yKCVkKVxuIiwKLQkJCQkJCUFYUDIwWF9DQ19DVFJMLCByZXQpOwotCi0JLyogSW5pdCBjaGFyZ2luZyBjdXJyZW50IGFuZCB2b2x0YWdlICovCi0JaW5mby0+bWF4X2NjID0gaW5mby0+cGRhdGEtPm1heF9jYzsKLQlpbmZvLT5tYXhfY3YgPSBpbmZvLT5wZGF0YS0+bWF4X2N2OwotCi0JLyogUmVhZCBjdXJyZW50IGNoYXJnZSB2b2x0YWdlIGFuZCBjdXJyZW50IGxpbWl0ICovCi0JcmV0ID0gcmVnbWFwX3JlYWQoaW5mby0+cmVnbWFwLCBBWFAyMFhfQ0hSR19DVFJMMSwgJnZhbCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJLyogQXNzdW1lIGRlZmF1bHQgaWYgY2Fubm90IHJlYWQgKi8KLQkJaW5mby0+Y2MgPSBpbmZvLT5wZGF0YS0+ZGVmX2NjOwotCQlpbmZvLT5jdiA9IGluZm8tPnBkYXRhLT5kZWZfY3Y7Ci0JfSBlbHNlIHsKLQkJLyogRGV0ZXJtaW5lIGNoYXJnZSB2b2x0YWdlICovCi0JCWN2ID0gKHZhbCAmIENIUkdfQ0NDVl9DVl9NQVNLKSA+PiBDSFJHX0NDQ1ZfQ1ZfQklUX1BPUzsKLQkJc3dpdGNoIChjdikgewotCQljYXNlIENIUkdfQ0NDVl9DVl80MTAwTVY6Ci0JCQlpbmZvLT5jdiA9IENWXzQxMDBNVjsKLQkJCWJyZWFrOwotCQljYXNlIENIUkdfQ0NDVl9DVl80MTUwTVY6Ci0JCQlpbmZvLT5jdiA9IENWXzQxNTBNVjsKLQkJCWJyZWFrOwotCQljYXNlIENIUkdfQ0NDVl9DVl80MjAwTVY6Ci0JCQlpbmZvLT5jdiA9IENWXzQyMDBNVjsKLQkJCWJyZWFrOwotCQljYXNlIENIUkdfQ0NDVl9DVl80MzUwTVY6Ci0JCQlpbmZvLT5jdiA9IENWXzQzNTBNVjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJaW5mby0+Y3YgPSBJTlRfTUFYOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBEZXRlcm1pbmUgY2hhcmdlIGN1cnJlbnQgbGltaXQgKi8KLQkJY2MgPSAocmV0ICYgQ0hSR19DQ0NWX0NDX01BU0spID4+IENIUkdfQ0NDVl9DQ19CSVRfUE9TOwotCQljYyA9IChjYyAqIENIUkdfQ0NDVl9DQ19MU0JfUkVTKSArIENIUkdfQ0NDVl9DQ19PRkZTRVQ7Ci0JCWluZm8tPmNjID0gY2M7Ci0KLQkJLyogUHJvZ3JhbSBkZWZhdWx0IGNoYXJnaW5nIHZvbHRhZ2UgYW5kIGN1cnJlbnQgKi8KLQkJY2MgPSBtaW4oaW5mby0+cGRhdGEtPmRlZl9jYywgaW5mby0+bWF4X2NjKTsKLQkJY3YgPSBtaW4oaW5mby0+cGRhdGEtPmRlZl9jdiwgaW5mby0+bWF4X2N2KTsKLQotCQlyZXQgPSBheHAyODhfY2hhcmdlcl9zZXRfY2MoaW5mbywgY2MpOwotCQlpZiAocmV0IDwgMCkKLQkJCWRldl93YXJuKCZpbmZvLT5wZGV2LT5kZXYsCi0JCQkJCSJlcnJvciglZCkgaW4gc2V0dGluZyBDQ1xuIiwgcmV0KTsKLQotCQlyZXQgPSBheHAyODhfY2hhcmdlcl9zZXRfY3YoaW5mbywgY3YpOwotCQlpZiAocmV0IDwgMCkKLQkJCWRldl93YXJuKCZpbmZvLT5wZGV2LT5kZXYsCi0JCQkJCSJlcnJvciglZCkgaW4gc2V0dGluZyBDVlxuIiwgcmV0KTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgYXhwMjg4X2NoYXJnZXJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmV0LCBpLCBwaXJxOwotCXN0cnVjdCBheHAyODhfY2hyZ19pbmZvICppbmZvOwotCXN0cnVjdCBheHAyMHhfZGV2ICpheHAyMHggPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgY2hhcmdlcl9jZmcgPSB7fTsKLQotCWluZm8gPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpbmZvKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWluZm8tPnBkZXYgPSBwZGV2OwotCWluZm8tPnJlZ21hcCA9IGF4cDIweC0+cmVnbWFwOwotCWluZm8tPnJlZ21hcF9pcnFjID0gYXhwMjB4LT5yZWdtYXBfaXJxYzsKLQlpbmZvLT5wZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCi0JaWYgKCFpbmZvLT5wZGF0YSkgewotCQkvKiBUcnkgQUNQSSBwcm92aWRlZCBwZGF0YSB2aWEgZGV2aWNlIHByb3BlcnRpZXMgKi8KLQkJaWYgKCFkZXZpY2VfcHJvcGVydHlfcHJlc2VudCgmcGRldi0+ZGV2LAotCQkJCQkJImF4cDI4OF9jaGFyZ2VyX2RhdGFcbiIpKQotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBwbGF0Zm9ybSBkYXRhXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaW5mby0+Y2FibGUuZWRldiA9IGV4dGNvbl9nZXRfZXh0Y29uX2RldihBWFAyODhfRVhUQ09OX0RFVl9OQU1FKTsKLQlpZiAoaW5mby0+Y2FibGUuZWRldiA9PSBOVUxMKSB7Ci0JCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzIGlzIG5vdCByZWFkeSwgcHJvYmUgZGVmZXJyZWRcbiIsCi0JCQlBWFAyODhfRVhUQ09OX0RFVl9OQU1FKTsKLQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7Ci0JfQotCi0JLyogUmVnaXN0ZXIgZm9yIGV4dGNvbiBub3RpZmljYXRpb24gKi8KLQlJTklUX1dPUksoJmluZm8tPmNhYmxlLndvcmssIGF4cDI4OF9jaGFyZ2VyX2V4dGNvbl9ldnRfd29ya2VyKTsKLQlpbmZvLT5jYWJsZS5uYi5ub3RpZmllcl9jYWxsID0gYXhwMjg4X2NoYXJnZXJfaGFuZGxlX2NhYmxlX2V2dDsKLQlyZXQgPSBleHRjb25fcmVnaXN0ZXJfbm90aWZpZXIoaW5mby0+Y2FibGUuZWRldiwgRVhUQ09OX0NIR19VU0JfU0RQLAotCQkJCQkmaW5mby0+Y2FibGUubmIpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LAotCQkJImZhaWxlZCB0byByZWdpc3RlciBleHRjb24gbm90aWZpZXIgZm9yIFNEUCAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXQgPSBleHRjb25fcmVnaXN0ZXJfbm90aWZpZXIoaW5mby0+Y2FibGUuZWRldiwgRVhUQ09OX0NIR19VU0JfQ0RQLAotCQkJCQkmaW5mby0+Y2FibGUubmIpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LAotCQkJImZhaWxlZCB0byByZWdpc3RlciBleHRjb24gbm90aWZpZXIgZm9yIENEUCAlZFxuIiwgcmV0KTsKLQkJZXh0Y29uX3VucmVnaXN0ZXJfbm90aWZpZXIoaW5mby0+Y2FibGUuZWRldiwKLQkJCQlFWFRDT05fQ0hHX1VTQl9TRFAsICZpbmZvLT5jYWJsZS5uYik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gZXh0Y29uX3JlZ2lzdGVyX25vdGlmaWVyKGluZm8tPmNhYmxlLmVkZXYsIEVYVENPTl9DSEdfVVNCX0RDUCwKLQkJCQkJJmluZm8tPmNhYmxlLm5iKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwKLQkJCSJmYWlsZWQgdG8gcmVnaXN0ZXIgZXh0Y29uIG5vdGlmaWVyIGZvciBEQ1AgJWRcbiIsIHJldCk7Ci0JCWV4dGNvbl91bnJlZ2lzdGVyX25vdGlmaWVyKGluZm8tPmNhYmxlLmVkZXYsCi0JCQkJRVhUQ09OX0NIR19VU0JfU0RQLCAmaW5mby0+Y2FibGUubmIpOwotCQlleHRjb25fdW5yZWdpc3Rlcl9ub3RpZmllcihpbmZvLT5jYWJsZS5lZGV2LAotCQkJCUVYVENPTl9DSEdfVVNCX0NEUCwgJmluZm8tPmNhYmxlLm5iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBpbmZvKTsKLQltdXRleF9pbml0KCZpbmZvLT5sb2NrKTsKLQotCS8qIFJlZ2lzdGVyIHdpdGggcG93ZXIgc3VwcGx5IGNsYXNzICovCi0JY2hhcmdlcl9jZmcuZHJ2X2RhdGEgPSBpbmZvOwotCWluZm8tPnBzeV91c2IgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmF4cDI4OF9jaGFyZ2VyX2Rlc2MsCi0JCQkJCQkmY2hhcmdlcl9jZmcpOwotCWlmIChJU19FUlIoaW5mby0+cHN5X3VzYikpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIHBvd2VyIHN1cHBseSBjaGFyZ2VyXG4iKTsKLQkJcmV0ID0gUFRSX0VSUihpbmZvLT5wc3lfdXNiKTsKLQkJZ290byBwc3lfcmVnX2ZhaWxlZDsKLQl9Ci0KLQkvKiBSZWdpc3RlciBmb3IgT1RHIG5vdGlmaWNhdGlvbiAqLwotCUlOSVRfV09SSygmaW5mby0+b3RnLndvcmssIGF4cDI4OF9jaGFyZ2VyX290Z19ldnRfd29ya2VyKTsKLQlpbmZvLT5vdGcuaWRfbmIubm90aWZpZXJfY2FsbCA9IGF4cDI4OF9jaGFyZ2VyX2hhbmRsZV9vdGdfZXZ0OwotCXJldCA9IGV4dGNvbl9yZWdpc3Rlcl9ub3RpZmllcihpbmZvLT5vdGcuY2FibGUsIEVYVENPTl9VU0JfSE9TVCwKLQkJCQkgICAgICAgJmluZm8tPm90Zy5pZF9uYik7Ci0JaWYgKHJldCkKLQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBvdGcgbm90aWZpZXJcbiIpOwotCi0JaWYgKGluZm8tPm90Zy5jYWJsZSkKLQkJaW5mby0+b3RnLmlkX3Nob3J0ID0gZXh0Y29uX2dldF9jYWJsZV9zdGF0ZV8oCi0JCQkJCWluZm8tPm90Zy5jYWJsZSwgRVhUQ09OX1VTQl9IT1NUKTsKLQotCS8qIFJlZ2lzdGVyIGNoYXJnZXIgaW50ZXJydXB0cyAqLwotCWZvciAoaSA9IDA7IGkgPCBDSFJHX0lOVFJfRU5EOyBpKyspIHsKLQkJcGlycSA9IHBsYXRmb3JtX2dldF9pcnEoaW5mby0+cGRldiwgaSk7Ci0JCWluZm8tPmlycVtpXSA9IHJlZ21hcF9pcnFfZ2V0X3ZpcnEoaW5mby0+cmVnbWFwX2lycWMsIHBpcnEpOwotCQlpZiAoaW5mby0+aXJxW2ldIDwgMCkgewotCQkJZGV2X3dhcm4oJmluZm8tPnBkZXYtPmRldiwKLQkJCQkiZmFpbGVkIHRvIGdldCB2aXJ0dWFsIGludGVycnVwdD0lZFxuIiwgcGlycSk7Ci0JCQlyZXQgPSBpbmZvLT5pcnFbaV07Ci0JCQlnb3RvIGludHJfcmVnX2ZhaWxlZDsKLQkJfQotCQlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKCZpbmZvLT5wZGV2LT5kZXYsIGluZm8tPmlycVtpXSwKLQkJCQkJTlVMTCwgYXhwMjg4X2NoYXJnZXJfaXJxX3RocmVhZF9oYW5kbGVyLAotCQkJCQlJUlFGX09ORVNIT1QsIGluZm8tPnBkZXYtPm5hbWUsIGluZm8pOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBpbnRlcnJ1cHQ9JWRcbiIsCi0JCQkJCQkJCWluZm8tPmlycVtpXSk7Ci0JCQlnb3RvIGludHJfcmVnX2ZhaWxlZDsKLQkJfQotCX0KLQotCWNoYXJnZXJfaW5pdF9od19yZWdzKGluZm8pOwotCi0JcmV0dXJuIDA7Ci0KLWludHJfcmVnX2ZhaWxlZDoKLQlpZiAoaW5mby0+b3RnLmNhYmxlKQotCQlleHRjb25fdW5yZWdpc3Rlcl9ub3RpZmllcihpbmZvLT5vdGcuY2FibGUsIEVYVENPTl9VU0JfSE9TVCwKLQkJCQkJJmluZm8tPm90Zy5pZF9uYik7Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoaW5mby0+cHN5X3VzYik7Ci1wc3lfcmVnX2ZhaWxlZDoKLQlleHRjb25fdW5yZWdpc3Rlcl9ub3RpZmllcihpbmZvLT5jYWJsZS5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TRFAsCi0JCQkJCSZpbmZvLT5jYWJsZS5uYik7Ci0JZXh0Y29uX3VucmVnaXN0ZXJfbm90aWZpZXIoaW5mby0+Y2FibGUuZWRldiwgRVhUQ09OX0NIR19VU0JfQ0RQLAotCQkJCQkmaW5mby0+Y2FibGUubmIpOwotCWV4dGNvbl91bnJlZ2lzdGVyX25vdGlmaWVyKGluZm8tPmNhYmxlLmVkZXYsIEVYVENPTl9DSEdfVVNCX0RDUCwKLQkJCQkJJmluZm8tPmNhYmxlLm5iKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF4cDI4OF9jaGFyZ2VyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBheHAyODhfY2hyZ19pbmZvICppbmZvID0gIGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKLQotCWlmIChpbmZvLT5vdGcuY2FibGUpCi0JCWV4dGNvbl91bnJlZ2lzdGVyX25vdGlmaWVyKGluZm8tPm90Zy5jYWJsZSwgRVhUQ09OX1VTQl9IT1NULAotCQkJCQkmaW5mby0+b3RnLmlkX25iKTsKLQotCWV4dGNvbl91bnJlZ2lzdGVyX25vdGlmaWVyKGluZm8tPmNhYmxlLmVkZXYsIEVYVENPTl9DSEdfVVNCX1NEUCwKLQkJCQkJJmluZm8tPmNhYmxlLm5iKTsKLQlleHRjb25fdW5yZWdpc3Rlcl9ub3RpZmllcihpbmZvLT5jYWJsZS5lZGV2LCBFWFRDT05fQ0hHX1VTQl9DRFAsCi0JCQkJCSZpbmZvLT5jYWJsZS5uYik7Ci0JZXh0Y29uX3VucmVnaXN0ZXJfbm90aWZpZXIoaW5mby0+Y2FibGUuZWRldiwgRVhUQ09OX0NIR19VU0JfRENQLAotCQkJCQkmaW5mby0+Y2FibGUubmIpOwotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGluZm8tPnBzeV91c2IpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGF4cDI4OF9jaGFyZ2VyX2RyaXZlciA9IHsKLQkucHJvYmUgPSBheHAyODhfY2hhcmdlcl9wcm9iZSwKLQkucmVtb3ZlID0gYXhwMjg4X2NoYXJnZXJfcmVtb3ZlLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImF4cDI4OF9jaGFyZ2VyIiwKLQl9LAotfTsKLQotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihheHAyODhfY2hhcmdlcl9kcml2ZXIpOwotCi1NT0RVTEVfQVVUSE9SKCJSYW1ha3Jpc2huYSBQYWxsYWxhIDxyYW1ha3Jpc2huYS5wYWxsYWxhQGludGVsLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiWC1wb3dlciBBWFAyODggQ2hhcmdlciBEcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvYXhwMjg4X2Z1ZWxfZ2F1Z2UuYyBiL2RyaXZlcnMvcG93ZXIvYXhwMjg4X2Z1ZWxfZ2F1Z2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBjMDExMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3Bvd2VyL2F4cDI4OF9mdWVsX2dhdWdlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTU1ICswLDAgQEAKLS8qCi0gKiBheHAyODhfZnVlbF9nYXVnZS5jIC0gWHBvd2VyIEFYUDI4OCBQTUlDIEZ1ZWwgR2F1Z2UgRHJpdmVyCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDE0IEludGVsIENvcnBvcmF0aW9uCi0gKgotICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCVNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL2F4cDIweC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgotI2luY2x1ZGUgPGxpbnV4L2lpby9jb25zdW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotCi0jZGVmaW5lIENIUkdfU1RBVF9CQVRfU0FGRV9NT0RFCQkoMSA8PCAzKQotI2RlZmluZSBDSFJHX1NUQVRfQkFUX1ZBTElECQkJKDEgPDwgNCkKLSNkZWZpbmUgQ0hSR19TVEFUX0JBVF9QUkVTRU5UCQkoMSA8PCA1KQotI2RlZmluZSBDSFJHX1NUQVRfQ0hBUkdJTkcJCQkoMSA8PCA2KQotI2RlZmluZSBDSFJHX1NUQVRfUE1JQ19PVFAJCQkoMSA8PCA3KQotCi0jZGVmaW5lIENIUkdfQ0NDVl9DQ19NQVNLCQkJMHhmICAgICAvKiA0IGJpdHMgKi8KLSNkZWZpbmUgQ0hSR19DQ0NWX0NDX0JJVF9QT1MJCTAKLSNkZWZpbmUgQ0hSR19DQ0NWX0NDX09GRlNFVAkJCTIwMCAgICAgLyogMjAwbUEgKi8KLSNkZWZpbmUgQ0hSR19DQ0NWX0NDX0xTQl9SRVMJCTIwMCAgICAgLyogMjAwbUEgKi8KLSNkZWZpbmUgQ0hSR19DQ0NWX0lURVJNXzIwUAkJCSgxIDw8IDQpICAgIC8qIDIwJSBvZiBDQyAqLwotI2RlZmluZSBDSFJHX0NDQ1ZfQ1ZfTUFTSwkJCTB4NjAgICAgICAgIC8qIDIgYml0cyAqLwotI2RlZmluZSBDSFJHX0NDQ1ZfQ1ZfQklUX1BPUwkJNQotI2RlZmluZSBDSFJHX0NDQ1ZfQ1ZfNDEwME1WCQkJMHgwICAgICAvKiA0LjEwViAqLwotI2RlZmluZSBDSFJHX0NDQ1ZfQ1ZfNDE1ME1WCQkJMHgxICAgICAvKiA0LjE1ViAqLwotI2RlZmluZSBDSFJHX0NDQ1ZfQ1ZfNDIwME1WCQkJMHgyICAgICAvKiA0LjIwViAqLwotI2RlZmluZSBDSFJHX0NDQ1ZfQ1ZfNDM1ME1WCQkJMHgzICAgICAvKiA0LjM1ViAqLwotI2RlZmluZSBDSFJHX0NDQ1ZfQ0hHX0VOCQkJKDEgPDwgNykKLQotI2RlZmluZSBDVl80MTAwCQkJCQkJNDEwMCAgICAvKiA0MTAwbVYgKi8KLSNkZWZpbmUgQ1ZfNDE1MAkJCQkJCTQxNTAgICAgLyogNDE1MG1WICovCi0jZGVmaW5lIENWXzQyMDAJCQkJCQk0MjAwICAgIC8qIDQyMDBtViAqLwotI2RlZmluZSBDVl80MzUwCQkJCQkJNDM1MCAgICAvKiA0MzUwbVYgKi8KLQotI2RlZmluZSBURU1QX0lSUV9DRkdfUVdCVFUJCQkoMSA8PCAwKQotI2RlZmluZSBURU1QX0lSUV9DRkdfV0JUVQkJCSgxIDw8IDEpCi0jZGVmaW5lIFRFTVBfSVJRX0NGR19RV0JUTwkJCSgxIDw8IDIpCi0jZGVmaW5lIFRFTVBfSVJRX0NGR19XQlRPCQkJKDEgPDwgMykKLSNkZWZpbmUgVEVNUF9JUlFfQ0ZHX01BU0sJCQkweGYKLQotI2RlZmluZSBGR19JUlFfQ0ZHX0xPV0JBVFRfV0wyCQkoMSA8PCAwKQotI2RlZmluZSBGR19JUlFfQ0ZHX0xPV0JBVFRfV0wxCQkoMSA8PCAxKQotI2RlZmluZSBGR19JUlFfQ0ZHX0xPV0JBVFRfTUFTSwkJMHgzCi0jZGVmaW5lIExPV0JBVF9JUlFfU1RBVF9MT1dCQVRUX1dMMgkoMSA8PCAwKQotI2RlZmluZSBMT1dCQVRfSVJRX1NUQVRfTE9XQkFUVF9XTDEJKDEgPDwgMSkKLQotI2RlZmluZSBGR19DTlRMX09DVl9BREpfU1RBVAkJKDEgPDwgMikKLSNkZWZpbmUgRkdfQ05UTF9PQ1ZfQURKX0VOCQkJKDEgPDwgMykKLSNkZWZpbmUgRkdfQ05UTF9DQVBfQURKX1NUQVQJCSgxIDw8IDQpCi0jZGVmaW5lIEZHX0NOVExfQ0FQX0FESl9FTgkJCSgxIDw8IDUpCi0jZGVmaW5lIEZHX0NOVExfQ0NfRU4JCQkJKDEgPDwgNikKLSNkZWZpbmUgRkdfQ05UTF9HQVVHRV9FTgkJCSgxIDw8IDcpCi0KLSNkZWZpbmUgRkdfUkVQX0NBUF9WQUxJRAkJCSgxIDw8IDcpCi0jZGVmaW5lIEZHX1JFUF9DQVBfVkFMX01BU0sJCQkweDdGCi0KLSNkZWZpbmUgRkdfREVTX0NBUDFfVkFMSUQJCQkoMSA8PCA3KQotI2RlZmluZSBGR19ERVNfQ0FQMV9WQUxfTUFTSwkJMHg3RgotI2RlZmluZSBGR19ERVNfQ0FQMF9WQUxfTUFTSwkJMHhGRgotI2RlZmluZSBGR19ERVNfQ0FQX1JFU19MU0IJCQkxNDU2ICAgIC8qIDEuNDU2bUFociAqLwotCi0jZGVmaW5lIEZHX0NDX01UUjFfVkFMSUQJCQkoMSA8PCA3KQotI2RlZmluZSBGR19DQ19NVFIxX1ZBTF9NQVNLCQkJMHg3RgotI2RlZmluZSBGR19DQ19NVFIwX1ZBTF9NQVNLCQkJMHhGRgotI2RlZmluZSBGR19ERVNfQ0NfUkVTX0xTQgkJCTE0NTYgICAgLyogMS40NTZtQWhyICovCi0KLSNkZWZpbmUgRkdfT0NWX0NBUF9WQUxJRAkJCSgxIDw8IDcpCi0jZGVmaW5lIEZHX09DVl9DQVBfVkFMX01BU0sJCQkweDdGCi0jZGVmaW5lIEZHX0NDX0NBUF9WQUxJRAkJCQkoMSA8PCA3KQotI2RlZmluZSBGR19DQ19DQVBfVkFMX01BU0sJCQkweDdGCi0KLSNkZWZpbmUgRkdfTE9XX0NBUF9USFIxX01BU0sJCTB4ZjAgICAgLyogNSUgdHAgMjAlICovCi0jZGVmaW5lIEZHX0xPV19DQVBfVEhSMV9WQUwJCQkweGEwICAgIC8qIDE1IHBlcmMgKi8KLSNkZWZpbmUgRkdfTE9XX0NBUF9USFIyX01BU0sJCTB4MGYgICAgLyogMCUgdG8gMTUlICovCi0jZGVmaW5lIEZHX0xPV19DQVBfV0FSTl9USFIJCQkxNCAgLyogMTQgcGVyYyAqLwotI2RlZmluZSBGR19MT1dfQ0FQX0NSSVRfVEhSCQkJNCAgIC8qIDQgcGVyYyAqLwotI2RlZmluZSBGR19MT1dfQ0FQX1NIRE5fVEhSCQkJMCAgIC8qIDAgcGVyYyAqLwotCi0jZGVmaW5lIFNUQVRVU19NT05fREVMQVlfSklGRklFUyAgICAoSFogKiA2MCkgICAvKjYwIHNlYyAqLwotI2RlZmluZSBOUl9SRVRSWV9DTlQgICAgMwotI2RlZmluZSBERVZfTkFNRQkiYXhwMjg4X2Z1ZWxfZ2F1Z2UiCi0KLS8qIDEuMW1WIHBlciBMU0IgZXhwcmVzc2VkIGluIHVWICovCi0jZGVmaW5lIFZPTFRBR0VfRlJPTV9BREMoYSkJCQkoKGEgKiAxMSkgLyAxMCkKLS8qIHByb3BlcnRpZXMgY29udmVydGVkIHRvIHRlbnRocyBvZiBkZWdyZWVzLCB1ViwgdUEsIHVXICovCi0jZGVmaW5lIFBST1BfVEVNUChhKQkJKChhKSAqIDEwKQotI2RlZmluZSBVTlBST1BfVEVNUChhKQkJKChhKSAvIDEwKQotI2RlZmluZSBQUk9QX1ZPTFQoYSkJCSgoYSkgKiAxMDAwKQotI2RlZmluZSBQUk9QX0NVUlIoYSkJCSgoYSkgKiAxMDAwKQotCi0jZGVmaW5lIEFYUDI4OF9GR19JTlRSX05VTQk2Ci1lbnVtIHsKLQlRV0JUVV9JUlEgPSAwLAotCVdCVFVfSVJRLAotCVFXQlRPX0lSUSwKLQlXQlRPX0lSUSwKLQlXTDJfSVJRLAotCVdMMV9JUlEsCi19OwotCi1zdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Ci0Jc3RydWN0IGF4cDIweF9mZ19wZGF0YSAqcGRhdGE7Ci0Jc3RydWN0IHJlZ21hcCAqcmVnbWFwOwotCXN0cnVjdCByZWdtYXBfaXJxX2NoaXBfZGF0YSAqcmVnbWFwX2lycWM7Ci0JaW50IGlycVtBWFAyODhfRkdfSU5UUl9OVU1dOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdDsKLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlpbnQgc3RhdHVzOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgc3RhdHVzX21vbml0b3I7Ci0Jc3RydWN0IGRlbnRyeSAqZGVidWdfZmlsZTsKLX07Ci0KLXN0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBmdWVsX2dhdWdlX3Byb3BzW10gPSB7Ci0JUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAotCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsCi0JUE9XRVJfU1VQUExZX1BST1BfSEVBTFRILAotCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYX0RFU0lHTiwKLQlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTl9ERVNJR04sCi0JUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1csCi0JUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9PQ1YsCi0JUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1csCi0JUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFksCi0JUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFlfQUxFUlRfTUlOLAotCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVAsCi0JUE9XRVJfU1VQUExZX1BST1BfVEVNUF9NQVgsCi0JUE9XRVJfU1VQUExZX1BST1BfVEVNUF9NSU4sCi0JUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTEVSVF9NSU4sCi0JUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTEVSVF9NQVgsCi0JUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWSwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMX0RFU0lHTiwKLQlQT1dFUl9TVVBQTFlfUFJPUF9NT0RFTF9OQU1FLAotfTsKLQotc3RhdGljIGludCBmdWVsX2dhdWdlX3JlZ19yZWFkYihzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8sIGludCByZWcpCi17Ci0JaW50IHJldCwgaTsKLQl1bnNpZ25lZCBpbnQgdmFsOwotCi0JZm9yIChpID0gMDsgaSA8IE5SX1JFVFJZX0NOVDsgaSsrKSB7Ci0JCXJldCA9IHJlZ21hcF9yZWFkKGluZm8tPnJlZ21hcCwgcmVnLCAmdmFsKTsKLQkJaWYgKHJldCA9PSAtRUJVU1kpCi0JCQljb250aW51ZTsKLQkJZWxzZQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwgImF4cDI4OCByZWcgcmVhZCBlcnI6JWRcbiIsIHJldCk7Ci0KLQlyZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgaW50IGZ1ZWxfZ2F1Z2VfcmVnX3dyaXRlYihzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8sIGludCByZWcsIHU4IHZhbCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gcmVnbWFwX3dyaXRlKGluZm8tPnJlZ21hcCwgcmVnLCAodW5zaWduZWQgaW50KXZhbCk7Ci0KLQlpZiAocmV0IDwgMCkKLQkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LCAiYXhwMjg4IHJlZyB3cml0ZSBlcnI6JWRcbiIsIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHBtaWNfcmVhZF9hZGNfdmFsKGNvbnN0IGNoYXIgKm5hbWUsIGludCAqcmF3X3ZhbCwKLQkJc3RydWN0IGF4cDI4OF9mZ19pbmZvICppbmZvKQotewotCWludCByZXQsIHZhbCA9IDA7Ci0Jc3RydWN0IGlpb19jaGFubmVsICppbmRpb19jaGFuOwotCi0JaW5kaW9fY2hhbiA9IGlpb19jaGFubmVsX2dldChOVUxMLCBuYW1lKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoaW5kaW9fY2hhbikpIHsKLQkJcmV0ID0gUFRSX0VSUihpbmRpb19jaGFuKTsKLQkJZ290byBleGl0OwotCX0KLQlyZXQgPSBpaW9fcmVhZF9jaGFubmVsX3JhdyhpbmRpb19jaGFuLCAmdmFsKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsCi0JCQkiSUlPIGNoYW5uZWwgcmVhZCBlcnJvcjogJXgsICV4XG4iLCByZXQsIHZhbCk7Ci0JCWdvdG8gZXJyX2V4aXQ7Ci0JfQotCi0JZGV2X2RiZygmaW5mby0+cGRldi0+ZGV2LCAiYWRjIHJhdyB2YWw9JXhcbiIsIHZhbCk7Ci0JKnJhd192YWwgPSB2YWw7Ci0KLWVycl9leGl0OgotCWlpb19jaGFubmVsX3JlbGVhc2UoaW5kaW9fY2hhbik7Ci1leGl0OgotCXJldHVybiByZXQ7Ci19Ci0KLSNpZmRlZiBDT05GSUdfREVCVUdfRlMKLXN0YXRpYyBpbnQgZnVlbF9nYXVnZV9kZWJ1Z19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8gPSBzLT5wcml2YXRlOwotCWludCByYXdfdmFsLCByZXQ7Ci0KLQlzZXFfcHJpbnRmKHMsICIgUFdSX1NUQVRVU1slMDJ4XSA6ICUwMnhcbiIsCi0JCUFYUDIwWF9QV1JfSU5QVVRfU1RBVFVTLAotCQlmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyMFhfUFdSX0lOUFVUX1NUQVRVUykpOwotCXNlcV9wcmludGYocywgIlBXUl9PUF9NT0RFWyUwMnhdIDogJTAyeFxuIiwKLQkJQVhQMjBYX1BXUl9PUF9NT0RFLAotCQlmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyMFhfUFdSX09QX01PREUpKTsKLQlzZXFfcHJpbnRmKHMsICIgQ0hSR19DVFJMMVslMDJ4XSA6ICUwMnhcbiIsCi0JCUFYUDIwWF9DSFJHX0NUUkwxLAotCQlmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyMFhfQ0hSR19DVFJMMSkpOwotCXNlcV9wcmludGYocywgIiAgICAgICBWTFRGWyUwMnhdIDogJTAyeFxuIiwKLQkJQVhQMjBYX1ZfTFRGX0RJU0NIUkcsCi0JCWZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDIwWF9WX0xURl9ESVNDSFJHKSk7Ci0Jc2VxX3ByaW50ZihzLCAiICAgICAgIFZIVEZbJTAyeF0gOiAlMDJ4XG4iLAotCQlBWFAyMFhfVl9IVEZfRElTQ0hSRywKLQkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjBYX1ZfSFRGX0RJU0NIUkcpKTsKLQlzZXFfcHJpbnRmKHMsICIgICAgQ0NfQ1RSTFslMDJ4XSA6ICUwMnhcbiIsCi0JCUFYUDIwWF9DQ19DVFJMLAotCQlmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyMFhfQ0NfQ1RSTCkpOwotCXNlcV9wcmludGYocywgIkJBVFRFUlkgQ0FQWyUwMnhdIDogJTAyeFxuIiwKLQkJQVhQMjBYX0ZHX1JFUywKLQkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjBYX0ZHX1JFUykpOwotCXNlcV9wcmludGYocywgIiAgICBGR19SREMxWyUwMnhdIDogJTAyeFxuIiwKLQkJQVhQMjg4X0ZHX1JEQzFfUkVHLAotCQlmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyODhfRkdfUkRDMV9SRUcpKTsKLQlzZXFfcHJpbnRmKHMsICIgICAgRkdfUkRDMFslMDJ4XSA6ICUwMnhcbiIsCi0JCUFYUDI4OF9GR19SREMwX1JFRywKLQkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX1JEQzBfUkVHKSk7Ci0Jc2VxX3ByaW50ZihzLCAiICAgIEZHX09DVkhbJTAyeF0gOiAlMDJ4XG4iLAotCQlBWFAyODhfRkdfT0NWSF9SRUcsCi0JCWZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDI4OF9GR19PQ1ZIX1JFRykpOwotCXNlcV9wcmludGYocywgIiAgICBGR19PQ1ZMWyUwMnhdIDogJTAyeFxuIiwKLQkJQVhQMjg4X0ZHX09DVkxfUkVHLAotCQlmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyODhfRkdfT0NWTF9SRUcpKTsKLQlzZXFfcHJpbnRmKHMsICJGR19ERVNfQ0FQMVslMDJ4XSA6ICUwMnhcbiIsCi0JCUFYUDI4OF9GR19ERVNfQ0FQMV9SRUcsCi0JCWZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDI4OF9GR19ERVNfQ0FQMV9SRUcpKTsKLQlzZXFfcHJpbnRmKHMsICJGR19ERVNfQ0FQMFslMDJ4XSA6ICUwMnhcbiIsCi0JCUFYUDI4OF9GR19ERVNfQ0FQMF9SRUcsCi0JCWZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDI4OF9GR19ERVNfQ0FQMF9SRUcpKTsKLQlzZXFfcHJpbnRmKHMsICIgRkdfQ0NfTVRSMVslMDJ4XSA6ICUwMnhcbiIsCi0JCUFYUDI4OF9GR19DQ19NVFIxX1JFRywKLQkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX0NDX01UUjFfUkVHKSk7Ci0Jc2VxX3ByaW50ZihzLCAiIEZHX0NDX01UUjBbJTAyeF0gOiAlMDJ4XG4iLAotCQlBWFAyODhfRkdfQ0NfTVRSMF9SRUcsCi0JCWZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDI4OF9GR19DQ19NVFIwX1JFRykpOwotCXNlcV9wcmludGYocywgIiBGR19PQ1ZfQ0FQWyUwMnhdIDogJTAyeFxuIiwKLQkJQVhQMjg4X0ZHX09DVl9DQVBfUkVHLAotCQlmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyODhfRkdfT0NWX0NBUF9SRUcpKTsKLQlzZXFfcHJpbnRmKHMsICIgIEZHX0NDX0NBUFslMDJ4XSA6ICUwMnhcbiIsCi0JCUFYUDI4OF9GR19DQ19DQVBfUkVHLAotCQlmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyODhfRkdfQ0NfQ0FQX1JFRykpOwotCXNlcV9wcmludGYocywgIiBGR19MT1dfQ0FQWyUwMnhdIDogJTAyeFxuIiwKLQkJQVhQMjg4X0ZHX0xPV19DQVBfUkVHLAotCQlmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyODhfRkdfTE9XX0NBUF9SRUcpKTsKLQlzZXFfcHJpbnRmKHMsICJUVU5JTkdfQ1RMMFslMDJ4XSA6ICUwMnhcbiIsCi0JCUFYUDI4OF9GR19UVU5FMCwKLQkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX1RVTkUwKSk7Ci0Jc2VxX3ByaW50ZihzLCAiVFVOSU5HX0NUTDFbJTAyeF0gOiAlMDJ4XG4iLAotCQlBWFAyODhfRkdfVFVORTEsCi0JCWZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDI4OF9GR19UVU5FMSkpOwotCXNlcV9wcmludGYocywgIlRVTklOR19DVEwyWyUwMnhdIDogJTAyeFxuIiwKLQkJQVhQMjg4X0ZHX1RVTkUyLAotCQlmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyODhfRkdfVFVORTIpKTsKLQlzZXFfcHJpbnRmKHMsICJUVU5JTkdfQ1RMM1slMDJ4XSA6ICUwMnhcbiIsCi0JCUFYUDI4OF9GR19UVU5FMywKLQkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX1RVTkUzKSk7Ci0Jc2VxX3ByaW50ZihzLCAiVFVOSU5HX0NUTDRbJTAyeF0gOiAlMDJ4XG4iLAotCQlBWFAyODhfRkdfVFVORTQsCi0JCWZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDI4OF9GR19UVU5FNCkpOwotCXNlcV9wcmludGYocywgIlRVTklOR19DVEw1WyUwMnhdIDogJTAyeFxuIiwKLQkJQVhQMjg4X0ZHX1RVTkU1LAotCQlmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyODhfRkdfVFVORTUpKTsKLQotCXJldCA9IHBtaWNfcmVhZF9hZGNfdmFsKCJheHAyODgtYmF0dC10ZW1wIiwgJnJhd192YWwsIGluZm8pOwotCWlmIChyZXQgPj0gMCkKLQkJc2VxX3ByaW50ZihzLCAiYXhwMjg4LWJhdHR0ZW1wIDogJWRcbiIsIHJhd192YWwpOwotCXJldCA9IHBtaWNfcmVhZF9hZGNfdmFsKCJheHAyODgtcG1pYy10ZW1wIiwgJnJhd192YWwsIGluZm8pOwotCWlmIChyZXQgPj0gMCkKLQkJc2VxX3ByaW50ZihzLCAiYXhwMjg4LXBtaWN0ZW1wIDogJWRcbiIsIHJhd192YWwpOwotCXJldCA9IHBtaWNfcmVhZF9hZGNfdmFsKCJheHAyODgtc3lzdGVtLXRlbXAiLCAmcmF3X3ZhbCwgaW5mbyk7Ci0JaWYgKHJldCA+PSAwKQotCQlzZXFfcHJpbnRmKHMsICJheHAyODgtc3lzdHRlbXAgOiAlZFxuIiwgcmF3X3ZhbCk7Ci0JcmV0ID0gcG1pY19yZWFkX2FkY192YWwoImF4cDI4OC1jaHJnLWN1cnIiLCAmcmF3X3ZhbCwgaW5mbyk7Ci0JaWYgKHJldCA+PSAwKQotCQlzZXFfcHJpbnRmKHMsICJheHAyODgtY2hyZ2N1cnIgOiAlZFxuIiwgcmF3X3ZhbCk7Ci0JcmV0ID0gcG1pY19yZWFkX2FkY192YWwoImF4cDI4OC1jaHJnLWQtY3VyciIsICZyYXdfdmFsLCBpbmZvKTsKLQlpZiAocmV0ID49IDApCi0JCXNlcV9wcmludGYocywgImF4cDI4OC1kY2hyZ2N1ciA6ICVkXG4iLCByYXdfdmFsKTsKLQlyZXQgPSBwbWljX3JlYWRfYWRjX3ZhbCgiYXhwMjg4LWJhdHQtdm9sdCIsICZyYXdfdmFsLCBpbmZvKTsKLQlpZiAocmV0ID49IDApCi0JCXNlcV9wcmludGYocywgImF4cDI4OC1iYXR0dm9sdCA6ICVkXG4iLCByYXdfdmFsKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGRlYnVnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGZ1ZWxfZ2F1Z2VfZGVidWdfc2hvdywgaW5vZGUtPmlfcHJpdmF0ZSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZnX2RlYnVnX2ZvcHMgPSB7Ci0JLm9wZW4gICAgICAgPSBkZWJ1Z19vcGVuLAotCS5yZWFkICAgICAgID0gc2VxX3JlYWQsCi0JLmxsc2VlayAgICAgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgICAgPSBzaW5nbGVfcmVsZWFzZSwKLX07Ci0KLXN0YXRpYyB2b2lkIGZ1ZWxfZ2F1Z2VfY3JlYXRlX2RlYnVnZnMoc3RydWN0IGF4cDI4OF9mZ19pbmZvICppbmZvKQotewotCWluZm8tPmRlYnVnX2ZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJmdWVsZ2F1Z2UiLCAwNjY2LCBOVUxMLAotCQlpbmZvLCAmZmdfZGVidWdfZm9wcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZ1ZWxfZ2F1Z2VfcmVtb3ZlX2RlYnVnZnMoc3RydWN0IGF4cDI4OF9mZ19pbmZvICppbmZvKQotewotCWRlYnVnZnNfcmVtb3ZlKGluZm8tPmRlYnVnX2ZpbGUpOwotfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBmdWVsX2dhdWdlX2NyZWF0ZV9kZWJ1Z2ZzKHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbykKLXsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBmdWVsX2dhdWdlX3JlbW92ZV9kZWJ1Z2ZzKHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbykKLXsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBmdWVsX2dhdWdlX2dldF9zdGF0dXMoc3RydWN0IGF4cDI4OF9mZ19pbmZvICppbmZvKQotewotCWludCBwd3Jfc3RhdCwgcmV0OwotCWludCBjaGFyZ2UsIGRpc2NoYXJnZTsKLQotCXB3cl9zdGF0ID0gZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjBYX1BXUl9JTlBVVF9TVEFUVVMpOwotCWlmIChwd3Jfc3RhdCA8IDApIHsKLQkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LAotCQkJIlBXUiBTVEFUIHJlYWQgZmFpbGVkOiVkXG4iLCBwd3Jfc3RhdCk7Ci0JCXJldHVybjsKLQl9Ci0JcmV0ID0gcG1pY19yZWFkX2FkY192YWwoImF4cDI4OC1jaHJnLWN1cnIiLCAmY2hhcmdlLCBpbmZvKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsCi0JCQkiQURDIGNoYXJnZSBjdXJyZW50IHJlYWQgZmFpbGVkOiVkXG4iLCByZXQpOwotCQlyZXR1cm47Ci0JfQotCXJldCA9IHBtaWNfcmVhZF9hZGNfdmFsKCJheHAyODgtY2hyZy1kLWN1cnIiLCAmZGlzY2hhcmdlLCBpbmZvKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsCi0JCQkiQURDIGRpc2NoYXJnZSBjdXJyZW50IHJlYWQgZmFpbGVkOiVkXG4iLCByZXQpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGNoYXJnZSA+IDApCi0JCWluZm8tPnN0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7Ci0JZWxzZSBpZiAoZGlzY2hhcmdlID4gMCkKLQkJaW5mby0+c3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORzsKLQllbHNlIHsKLQkJaWYgKHB3cl9zdGF0ICYgQ0hSR19TVEFUX0JBVF9QUkVTRU5UKQotCQkJaW5mby0+c3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19GVUxMOwotCQllbHNlCi0JCQlpbmZvLT5zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX05PVF9DSEFSR0lORzsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgZnVlbF9nYXVnZV9nZXRfdmJhdHQoc3RydWN0IGF4cDI4OF9mZ19pbmZvICppbmZvLCBpbnQgKnZiYXR0KQotewotCWludCByZXQgPSAwLCByYXdfdmFsOwotCi0JcmV0ID0gcG1pY19yZWFkX2FkY192YWwoImF4cDI4OC1iYXR0LXZvbHQiLCAmcmF3X3ZhbCwgaW5mbyk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gdmJhdHRfcmVhZF9mYWlsOwotCi0JKnZiYXR0ID0gVk9MVEFHRV9GUk9NX0FEQyhyYXdfdmFsKTsKLXZiYXR0X3JlYWRfZmFpbDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGZ1ZWxfZ2F1Z2VfZ2V0X2N1cnJlbnQoc3RydWN0IGF4cDI4OF9mZ19pbmZvICppbmZvLCBpbnQgKmN1cikKLXsKLQlpbnQgcmV0LCB2YWx1ZSA9IDA7Ci0JaW50IGNoYXJnZSwgZGlzY2hhcmdlOwotCi0JcmV0ID0gcG1pY19yZWFkX2FkY192YWwoImF4cDI4OC1jaHJnLWN1cnIiLCAmY2hhcmdlLCBpbmZvKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBjdXJyZW50X3JlYWRfZmFpbDsKLQlyZXQgPSBwbWljX3JlYWRfYWRjX3ZhbCgiYXhwMjg4LWNocmctZC1jdXJyIiwgJmRpc2NoYXJnZSwgaW5mbyk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gY3VycmVudF9yZWFkX2ZhaWw7Ci0KLQlpZiAoY2hhcmdlID4gMCkKLQkJdmFsdWUgPSBjaGFyZ2U7Ci0JZWxzZSBpZiAoZGlzY2hhcmdlID4gMCkKLQkJdmFsdWUgPSAtMSAqIGRpc2NoYXJnZTsKLQotCSpjdXIgPSB2YWx1ZTsKLWN1cnJlbnRfcmVhZF9mYWlsOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGVtcF90b19hZGMoc3RydWN0IGF4cDI4OF9mZ19pbmZvICppbmZvLCBpbnQgdHZhbCkKLXsKLQlpbnQgcm50YyA9IDAsIGksIHJldCwgYWRjX3ZhbDsKLQlpbnQgcm1pbiwgcm1heCwgdG1pbiwgdG1heDsKLQlpbnQgdGNzeiA9IGluZm8tPnBkYXRhLT50Y3N6OwotCi0JLyogZ2V0IHRoZSBSbnRjIHJlc2l0YW5jZSB2YWx1ZSBmb3IgdGhpcyB0ZW1wICovCi0JaWYgKHR2YWwgPiBpbmZvLT5wZGF0YS0+dGhlcm1pc3Rvcl9jdXJ2ZVswXVsxXSkgewotCQlybnRjID0gaW5mby0+cGRhdGEtPnRoZXJtaXN0b3JfY3VydmVbMF1bMF07Ci0JfSBlbHNlIGlmICh0dmFsIDw9IGluZm8tPnBkYXRhLT50aGVybWlzdG9yX2N1cnZlW3Rjc3otMV1bMV0pIHsKLQkJcm50YyA9IGluZm8tPnBkYXRhLT50aGVybWlzdG9yX2N1cnZlW3Rjc3otMV1bMF07Ci0JfSBlbHNlIHsKLQkJZm9yIChpID0gMTsgaSA8IHRjc3o7IGkrKykgewotCQkJaWYgKHR2YWwgPiBpbmZvLT5wZGF0YS0+dGhlcm1pc3Rvcl9jdXJ2ZVtpXVsxXSkgewotCQkJCXJtaW4gPSBpbmZvLT5wZGF0YS0+dGhlcm1pc3Rvcl9jdXJ2ZVtpLTFdWzBdOwotCQkJCXJtYXggPSBpbmZvLT5wZGF0YS0+dGhlcm1pc3Rvcl9jdXJ2ZVtpXVswXTsKLQkJCQl0bWluID0gaW5mby0+cGRhdGEtPnRoZXJtaXN0b3JfY3VydmVbaS0xXVsxXTsKLQkJCQl0bWF4ID0gaW5mby0+cGRhdGEtPnRoZXJtaXN0b3JfY3VydmVbaV1bMV07Ci0JCQkJcm50YyA9IHJtaW4gKyAoKHJtYXggLSBybWluKSAqCi0JCQkJCSh0dmFsIC0gdG1pbikgLyAodG1heCAtIHRtaW4pKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qIHdlIG5lZWQgdGhlIGN1cnJlbnQgdG8gY2FsY3VsYXRlIHRoZSBwcm9wZXIgYWRjIHZvbHRhZ2UgKi8KLQlyZXQgPSBmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyMFhfQURDX1JBVEUpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwgIiVzOnJlYWQgZXJyOiVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJcmV0ID0gMHgzMDsKLQl9Ci0KLQkvKgotCSAqIHRlbXBlcmF0dXJlIGlzIHByb3BvcnRpb25hbCB0byBOVFMgdGhlcm1pc3RvciByZXNpc3RhbmNlCi0JICogQURDX1JBVEVbNS00XSBkZXRlcm1pbmVzIGN1cnJlbnQsIDAwPTIwdUEsMDE9NDB1QSwxMD02MHVBLDExPTgwdUEKLQkgKiBbMTItYml0IEFEQyBWQUxdID0gUl9OVEMozqkpICogY3VycmVudCAvIDgwMAotCSAqLwotCWFkY192YWwgPSBybnRjICogKDIwICsgKDIwICogKChyZXQgPj4gNCkgJiAweDMpKSkgLyA4MDA7Ci0KLQlyZXR1cm4gYWRjX3ZhbDsKLX0KLQotc3RhdGljIGludCBhZGNfdG9fdGVtcChzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8sIGludCBhZGNfdmFsKQotewotCWludCByZXQsIHIsIGksIHR2YWwgPSAwOwotCWludCBybWluLCBybWF4LCB0bWluLCB0bWF4OwotCWludCB0Y3N6ID0gaW5mby0+cGRhdGEtPnRjc3o7Ci0KLQlyZXQgPSBmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyMFhfQURDX1JBVEUpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwgIiVzOnJlYWQgZXJyOiVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJcmV0ID0gMHgzMDsKLQl9Ci0KLQkvKgotCSAqIHRlbXBlcmF0dXJlIGlzIHByb3BvcnRpb25hbCB0byBOVFMgdGhlcm1pc3RvciByZXNpc3RhbmNlCi0JICogQURDX1JBVEVbNS00XSBkZXRlcm1pbmVzIGN1cnJlbnQsIDAwPTIwdUEsMDE9NDB1QSwxMD02MHVBLDExPTgwdUEKLQkgKiBSX05UQyjOqSkgPSBbMTItYml0IEFEQyBWQUxdICogODAwIC8gY3VycmVudAotCSAqLwotCXIgPSBhZGNfdmFsICogODAwIC8gKDIwICsgKDIwICogKChyZXQgPj4gNCkgJiAweDMpKSk7Ci0KLQlpZiAociA8IGluZm8tPnBkYXRhLT50aGVybWlzdG9yX2N1cnZlWzBdWzBdKSB7Ci0JCXR2YWwgPSBpbmZvLT5wZGF0YS0+dGhlcm1pc3Rvcl9jdXJ2ZVswXVsxXTsKLQl9IGVsc2UgaWYgKHIgPj0gaW5mby0+cGRhdGEtPnRoZXJtaXN0b3JfY3VydmVbdGNzei0xXVswXSkgewotCQl0dmFsID0gaW5mby0+cGRhdGEtPnRoZXJtaXN0b3JfY3VydmVbdGNzei0xXVsxXTsKLQl9IGVsc2UgewotCQlmb3IgKGkgPSAxOyBpIDwgdGNzejsgaSsrKSB7Ci0JCQlpZiAociA8IGluZm8tPnBkYXRhLT50aGVybWlzdG9yX2N1cnZlW2ldWzBdKSB7Ci0JCQkJcm1pbiA9IGluZm8tPnBkYXRhLT50aGVybWlzdG9yX2N1cnZlW2ktMV1bMF07Ci0JCQkJcm1heCA9IGluZm8tPnBkYXRhLT50aGVybWlzdG9yX2N1cnZlW2ldWzBdOwotCQkJCXRtaW4gPSBpbmZvLT5wZGF0YS0+dGhlcm1pc3Rvcl9jdXJ2ZVtpLTFdWzFdOwotCQkJCXRtYXggPSBpbmZvLT5wZGF0YS0+dGhlcm1pc3Rvcl9jdXJ2ZVtpXVsxXTsKLQkJCQl0dmFsID0gdG1pbiArICgodG1heCAtIHRtaW4pICoKLQkJCQkJKHIgLSBybWluKSAvIChybWF4IC0gcm1pbikpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIHR2YWw7Ci19Ci0KLXN0YXRpYyBpbnQgZnVlbF9nYXVnZV9nZXRfYnRlbXAoc3RydWN0IGF4cDI4OF9mZ19pbmZvICppbmZvLCBpbnQgKmJ0ZW1wKQotewotCWludCByZXQsIHJhd192YWwgPSAwOwotCi0JcmV0ID0gcG1pY19yZWFkX2FkY192YWwoImF4cDI4OC1iYXR0LXRlbXAiLCAmcmF3X3ZhbCwgaW5mbyk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gdGVtcF9yZWFkX2ZhaWw7Ci0KLQkqYnRlbXAgPSBhZGNfdG9fdGVtcChpbmZvLCByYXdfdmFsKTsKLQotdGVtcF9yZWFkX2ZhaWw6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBmdWVsX2dhdWdlX2dldF92b2N2KHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbywgaW50ICp2b2N2KQotewotCWludCByZXQsIHZhbHVlOwotCi0JLyogMTItYml0IGRhdGEgdmFsdWUsIHVwcGVyIDggaW4gT0NWSCwgbG93ZXIgNCBpbiBPQ1ZMICovCi0JcmV0ID0gZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX09DVkhfUkVHKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byB2b2N2X3JlYWRfZmFpbDsKLQl2YWx1ZSA9IHJldCA8PCA0OwotCi0JcmV0ID0gZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX09DVkxfUkVHKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byB2b2N2X3JlYWRfZmFpbDsKLQl2YWx1ZSB8PSAocmV0ICYgMHhmKTsKLQotCSp2b2N2ID0gVk9MVEFHRV9GUk9NX0FEQyh2YWx1ZSk7Ci12b2N2X3JlYWRfZmFpbDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGZ1ZWxfZ2F1Z2VfYmF0dGVyeV9oZWFsdGgoc3RydWN0IGF4cDI4OF9mZ19pbmZvICppbmZvKQotewotCWludCB0ZW1wLCB2b2N2OwotCWludCByZXQsIGhlYWx0aCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfVU5LTk9XTjsKLQotCXJldCA9IGZ1ZWxfZ2F1Z2VfZ2V0X2J0ZW1wKGluZm8sICZ0ZW1wKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBoZWFsdGhfcmVhZF9mYWlsOwotCi0JcmV0ID0gZnVlbF9nYXVnZV9nZXRfdm9jdihpbmZvLCAmdm9jdik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gaGVhbHRoX3JlYWRfZmFpbDsKLQotCWlmICh2b2N2ID4gaW5mby0+cGRhdGEtPm1heF92b2x0KQotCQloZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJWT0xUQUdFOwotCWVsc2UgaWYgKHRlbXAgPiBpbmZvLT5wZGF0YS0+bWF4X3RlbXApCi0JCWhlYWx0aCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUkhFQVQ7Ci0JZWxzZSBpZiAodGVtcCA8IGluZm8tPnBkYXRhLT5taW5fdGVtcCkKLQkJaGVhbHRoID0gUE9XRVJfU1VQUExZX0hFQUxUSF9DT0xEOwotCWVsc2UgaWYgKHZvY3YgPCBpbmZvLT5wZGF0YS0+bWluX3ZvbHQpCi0JCWhlYWx0aCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfREVBRDsKLQllbHNlCi0JCWhlYWx0aCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfR09PRDsKLQotaGVhbHRoX3JlYWRfZmFpbDoKLQlyZXR1cm4gaGVhbHRoOwotfQotCi1zdGF0aWMgaW50IGZ1ZWxfZ2F1Z2Vfc2V0X2hpZ2hfYnRlbXBfYWxlcnQoc3RydWN0IGF4cDI4OF9mZ19pbmZvICppbmZvKQotewotCWludCByZXQsIGFkY192YWw7Ci0KLQkvKiBwcm9ncmFtIHRlbXBlcmF0dXJlIHRocmVzaG9sZCBhcyAxLzE2IEFEQyB2YWx1ZSAqLwotCWFkY192YWwgPSB0ZW1wX3RvX2FkYyhpbmZvLCBpbmZvLT5wZGF0YS0+bWF4X3RlbXApOwotCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3dyaXRlYihpbmZvLCBBWFAyMFhfVl9IVEZfRElTQ0hSRywgYWRjX3ZhbCA+PiA0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgZnVlbF9nYXVnZV9zZXRfbG93X2J0ZW1wX2FsZXJ0KHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbykKLXsKLQlpbnQgcmV0LCBhZGNfdmFsOwotCi0JLyogcHJvZ3JhbSB0ZW1wZXJhdHVyZSB0aHJlc2hvbGQgYXMgMS8xNiBBREMgdmFsdWUgKi8KLQlhZGNfdmFsID0gdGVtcF90b19hZGMoaW5mbywgaW5mby0+cGRhdGEtPm1pbl90ZW1wKTsKLQlyZXQgPSBmdWVsX2dhdWdlX3JlZ193cml0ZWIoaW5mbywgQVhQMjBYX1ZfTFRGX0RJU0NIUkcsIGFkY192YWwgPj4gNCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGZ1ZWxfZ2F1Z2VfZ2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzLAotCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwcm9wLAotCQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQotewotCXN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbyA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwcyk7Ci0JaW50IHJldCA9IDAsIHZhbHVlOwotCi0JbXV0ZXhfbG9jaygmaW5mby0+bG9jayk7Ci0Jc3dpdGNoIChwcm9wKSB7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6Ci0JCWZ1ZWxfZ2F1Z2VfZ2V0X3N0YXR1cyhpbmZvKTsKLQkJdmFsLT5pbnR2YWwgPSBpbmZvLT5zdGF0dXM7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfSEVBTFRIOgotCQl2YWwtPmludHZhbCA9IGZ1ZWxfZ2F1Z2VfYmF0dGVyeV9oZWFsdGgoaW5mbyk7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c6Ci0JCXJldCA9IGZ1ZWxfZ2F1Z2VfZ2V0X3ZiYXR0KGluZm8sICZ2YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBmdWVsX2dhdWdlX3JlYWRfZXJyOwotCQl2YWwtPmludHZhbCA9IFBST1BfVk9MVCh2YWx1ZSk7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9PQ1Y6Ci0JCXJldCA9IGZ1ZWxfZ2F1Z2VfZ2V0X3ZvY3YoaW5mbywgJnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGZ1ZWxfZ2F1Z2VfcmVhZF9lcnI7Ci0JCXZhbC0+aW50dmFsID0gUFJPUF9WT0xUKHZhbHVlKTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVzoKLQkJcmV0ID0gZnVlbF9nYXVnZV9nZXRfY3VycmVudChpbmZvLCAmdmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZnVlbF9nYXVnZV9yZWFkX2VycjsKLQkJdmFsLT5pbnR2YWwgPSBQUk9QX0NVUlIodmFsdWUpOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ6Ci0JCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDIwWF9QV1JfT1BfTU9ERSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBmdWVsX2dhdWdlX3JlYWRfZXJyOwotCi0JCWlmIChyZXQgJiBDSFJHX1NUQVRfQkFUX1BSRVNFTlQpCi0JCQl2YWwtPmludHZhbCA9IDE7Ci0JCWVsc2UKLQkJCXZhbC0+aW50dmFsID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWToKLQkJcmV0ID0gZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjBYX0ZHX1JFUyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBmdWVsX2dhdWdlX3JlYWRfZXJyOwotCi0JCWlmICghKHJldCAmIEZHX1JFUF9DQVBfVkFMSUQpKQotCQkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LAotCQkJCSJjYXBhY2l0eSBtZWFzdXJlbWVudCBub3QgdmFsaWRcbiIpOwotCQl2YWwtPmludHZhbCA9IChyZXQgJiBGR19SRVBfQ0FQX1ZBTF9NQVNLKTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWV9BTEVSVF9NSU46Ci0JCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDI4OF9GR19MT1dfQ0FQX1JFRyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBmdWVsX2dhdWdlX3JlYWRfZXJyOwotCQl2YWwtPmludHZhbCA9IChyZXQgJiAweDBmKTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QOgotCQlyZXQgPSBmdWVsX2dhdWdlX2dldF9idGVtcChpbmZvLCAmdmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZnVlbF9nYXVnZV9yZWFkX2VycjsKLQkJdmFsLT5pbnR2YWwgPSBQUk9QX1RFTVAodmFsdWUpOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfTUFYOgotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTEVSVF9NQVg6Ci0JCXZhbC0+aW50dmFsID0gUFJPUF9URU1QKGluZm8tPnBkYXRhLT5tYXhfdGVtcCk7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUF9NSU46Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QX0FMRVJUX01JTjoKLQkJdmFsLT5pbnR2YWwgPSBQUk9QX1RFTVAoaW5mby0+cGRhdGEtPm1pbl90ZW1wKTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZOgotCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9URUNITk9MT0dZX0xJT047Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVzoKLQkJcmV0ID0gZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX0NDX01UUjFfUkVHKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGZ1ZWxfZ2F1Z2VfcmVhZF9lcnI7Ci0KLQkJdmFsdWUgPSAocmV0ICYgRkdfQ0NfTVRSMV9WQUxfTUFTSykgPDwgODsKLQkJcmV0ID0gZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX0NDX01UUjBfUkVHKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGZ1ZWxfZ2F1Z2VfcmVhZF9lcnI7Ci0JCXZhbHVlIHw9IChyZXQgJiBGR19DQ19NVFIwX1ZBTF9NQVNLKTsKLQkJdmFsLT5pbnR2YWwgPSB2YWx1ZSAqIEZHX0RFU19DQVBfUkVTX0xTQjsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTDoKLQkJcmV0ID0gZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX0RFU19DQVAxX1JFRyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBmdWVsX2dhdWdlX3JlYWRfZXJyOwotCi0JCXZhbHVlID0gKHJldCAmIEZHX0RFU19DQVAxX1ZBTF9NQVNLKSA8PCA4OwotCQlyZXQgPSBmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyODhfRkdfREVTX0NBUDBfUkVHKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGZ1ZWxfZ2F1Z2VfcmVhZF9lcnI7Ci0JCXZhbHVlIHw9IChyZXQgJiBGR19ERVNfQ0FQMF9WQUxfTUFTSyk7Ci0JCXZhbC0+aW50dmFsID0gdmFsdWUgKiBGR19ERVNfQ0FQX1JFU19MU0I7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTExfREVTSUdOOgotCQl2YWwtPmludHZhbCA9IFBST1BfQ1VSUihpbmZvLT5wZGF0YS0+ZGVzaWduX2NhcCk7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NQVhfREVTSUdOOgotCQl2YWwtPmludHZhbCA9IFBST1BfVk9MVChpbmZvLT5wZGF0YS0+bWF4X3ZvbHQpOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOX0RFU0lHTjoKLQkJdmFsLT5pbnR2YWwgPSBQUk9QX1ZPTFQoaW5mby0+cGRhdGEtPm1pbl92b2x0KTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9NT0RFTF9OQU1FOgotCQl2YWwtPnN0cnZhbCA9IGluZm8tPnBkYXRhLT5iYXR0aWQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCW11dGV4X3VubG9jaygmaW5mby0+bG9jayk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW11dGV4X3VubG9jaygmaW5mby0+bG9jayk7Ci0JcmV0dXJuIDA7Ci0KLWZ1ZWxfZ2F1Z2VfcmVhZF9lcnI6Ci0JbXV0ZXhfdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGZ1ZWxfZ2F1Z2Vfc2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzLAotCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwcm9wLAotCQljb25zdCB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQotewotCXN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbyA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwcyk7Ci0JaW50IHJldCA9IDA7Ci0KLQltdXRleF9sb2NrKCZpbmZvLT5sb2NrKTsKLQlzd2l0Y2ggKHByb3ApIHsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKLQkJaW5mby0+c3RhdHVzID0gdmFsLT5pbnR2YWw7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUF9NSU46Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QX0FMRVJUX01JTjoKLQkJaWYgKCh2YWwtPmludHZhbCA8IFBEX0RFRl9NSU5fVEVNUCkgfHwKLQkJCSh2YWwtPmludHZhbCA+IFBEX0RFRl9NQVhfVEVNUCkpIHsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlpbmZvLT5wZGF0YS0+bWluX3RlbXAgPSBVTlBST1BfVEVNUCh2YWwtPmludHZhbCk7Ci0JCXJldCA9IGZ1ZWxfZ2F1Z2Vfc2V0X2xvd19idGVtcF9hbGVydChpbmZvKTsKLQkJaWYgKHJldCA8IDApCi0JCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsCi0JCQkJInRlbXAgYWxlcnQgbWluIHNldCBmYWlsOiVkXG4iLCByZXQpOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfTUFYOgotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTEVSVF9NQVg6Ci0JCWlmICgodmFsLT5pbnR2YWwgPCBQRF9ERUZfTUlOX1RFTVApIHx8Ci0JCQkodmFsLT5pbnR2YWwgPiBQRF9ERUZfTUFYX1RFTVApKSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJaW5mby0+cGRhdGEtPm1heF90ZW1wID0gVU5QUk9QX1RFTVAodmFsLT5pbnR2YWwpOwotCQlyZXQgPSBmdWVsX2dhdWdlX3NldF9oaWdoX2J0ZW1wX2FsZXJ0KGluZm8pOwotCQlpZiAocmV0IDwgMCkKLQkJCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwKLQkJCQkidGVtcCBhbGVydCBtYXggc2V0IGZhaWw6JWRcbiIsIHJldCk7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFlfQUxFUlRfTUlOOgotCQlpZiAoKHZhbC0+aW50dmFsIDwgMCkgfHwgKHZhbC0+aW50dmFsID4gMTUpKSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0ID0gZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX0xPV19DQVBfUkVHKTsKLQkJaWYgKHJldCA8IDApCi0JCQlicmVhazsKLQkJcmV0ICY9IDB4ZjA7Ci0JCXJldCB8PSAodmFsLT5pbnR2YWwgJiAweGYpOwotCQlyZXQgPSBmdWVsX2dhdWdlX3JlZ193cml0ZWIoaW5mbywgQVhQMjg4X0ZHX0xPV19DQVBfUkVHLCByZXQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0KLQltdXRleF91bmxvY2soJmluZm8tPmxvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgZnVlbF9nYXVnZV9wcm9wZXJ0eV9pc193cml0ZWFibGUoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAotCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCkKLXsKLQlpbnQgcmV0OwotCi0Jc3dpdGNoIChwc3ApIHsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfTUlOOgotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTEVSVF9NSU46Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QX01BWDoKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQUxFUlRfTUFYOgotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFlfQUxFUlRfTUlOOgotCQlyZXQgPSAxOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSAwOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGZ1ZWxfZ2F1Z2Vfc3RhdHVzX21vbml0b3Ioc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbyA9IGNvbnRhaW5lcl9vZih3b3JrLAotCQlzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8sIHN0YXR1c19tb25pdG9yLndvcmspOwotCi0JZnVlbF9nYXVnZV9nZXRfc3RhdHVzKGluZm8pOwotCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGluZm8tPmJhdCk7Ci0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZpbmZvLT5zdGF0dXNfbW9uaXRvciwgU1RBVFVTX01PTl9ERUxBWV9KSUZGSUVTKTsKLX0KLQotc3RhdGljIGlycXJldHVybl90IGZ1ZWxfZ2F1Z2VfdGhyZWFkX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2KQotewotCXN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbyA9IGRldjsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBWFAyODhfRkdfSU5UUl9OVU07IGkrKykgewotCQlpZiAoaW5mby0+aXJxW2ldID09IGlycSkKLQkJCWJyZWFrOwotCX0KLQotCWlmIChpID49IEFYUDI4OF9GR19JTlRSX05VTSkgewotCQlkZXZfd2FybigmaW5mby0+cGRldi0+ZGV2LCAic3B1cmlvdXMgaW50ZXJydXB0ISFcbiIpOwotCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQotCi0Jc3dpdGNoIChpKSB7Ci0JY2FzZSBRV0JUVV9JUlE6Ci0JCWRldl9pbmZvKCZpbmZvLT5wZGV2LT5kZXYsCi0JCQkiUXVpdCBCYXR0ZXJ5IHVuZGVyIHRlbXBlcmF0dXJlIGluIHdvcmsgbW9kZSBJUlEgKFFXQlRVKVxuIik7Ci0JCWJyZWFrOwotCWNhc2UgV0JUVV9JUlE6Ci0JCWRldl9pbmZvKCZpbmZvLT5wZGV2LT5kZXYsCi0JCQkiQmF0dGVyeSB1bmRlciB0ZW1wZXJhdHVyZSBpbiB3b3JrIG1vZGUgSVJRIChXQlRVKVxuIik7Ci0JCWJyZWFrOwotCWNhc2UgUVdCVE9fSVJROgotCQlkZXZfaW5mbygmaW5mby0+cGRldi0+ZGV2LAotCQkJIlF1aXQgQmF0dGVyeSBvdmVyIHRlbXBlcmF0dXJlIGluIHdvcmsgbW9kZSBJUlEgKFFXQlRPKVxuIik7Ci0JCWJyZWFrOwotCWNhc2UgV0JUT19JUlE6Ci0JCWRldl9pbmZvKCZpbmZvLT5wZGV2LT5kZXYsCi0JCQkiQmF0dGVyeSBvdmVyIHRlbXBlcmF0dXJlIGluIHdvcmsgbW9kZSBJUlEgKFdCVE8pXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBXTDJfSVJROgotCQlkZXZfaW5mbygmaW5mby0+cGRldi0+ZGV2LCAiTG93IEJhdHQgV2FybmluZygyKSBJTlRSXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBXTDFfSVJROgotCQlkZXZfaW5mbygmaW5mby0+cGRldi0+ZGV2LCAiTG93IEJhdHQgV2FybmluZygxKSBJTlRSXG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X3dhcm4oJmluZm8tPnBkZXYtPmRldiwgIlNwdXJpb3VzIEludGVycnVwdCEhIVxuIik7Ci0JfQotCi0JcG93ZXJfc3VwcGx5X2NoYW5nZWQoaW5mby0+YmF0KTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGZ1ZWxfZ2F1Z2VfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kpCi17Ci0Jc3RydWN0IGF4cDI4OF9mZ19pbmZvICppbmZvID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7Ci0KLQlwb3dlcl9zdXBwbHlfY2hhbmdlZChpbmZvLT5iYXQpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGZ1ZWxfZ2F1Z2VfZGVzYyA9IHsKLQkubmFtZQkJCT0gREVWX05BTUUsCi0JLnR5cGUJCQk9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlksCi0JLnByb3BlcnRpZXMJCT0gZnVlbF9nYXVnZV9wcm9wcywKLQkubnVtX3Byb3BlcnRpZXMJCT0gQVJSQVlfU0laRShmdWVsX2dhdWdlX3Byb3BzKSwKLQkuZ2V0X3Byb3BlcnR5CQk9IGZ1ZWxfZ2F1Z2VfZ2V0X3Byb3BlcnR5LAotCS5zZXRfcHJvcGVydHkJCT0gZnVlbF9nYXVnZV9zZXRfcHJvcGVydHksCi0JLnByb3BlcnR5X2lzX3dyaXRlYWJsZQk9IGZ1ZWxfZ2F1Z2VfcHJvcGVydHlfaXNfd3JpdGVhYmxlLAotCS5leHRlcm5hbF9wb3dlcl9jaGFuZ2VkCT0gZnVlbF9nYXVnZV9leHRlcm5hbF9wb3dlcl9jaGFuZ2VkLAotfTsKLQotc3RhdGljIGludCBmdWVsX2dhdWdlX3NldF9sb3diYXR0X3RocmVzaG9sZHMoc3RydWN0IGF4cDI4OF9mZ19pbmZvICppbmZvKQotewotCWludCByZXQ7Ci0JdTggcmVnX3ZhbDsKLQotCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDIwWF9GR19SRVMpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwgIiVzOnJlYWQgZXJyOiVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JcmV0ID0gKHJldCAmIEZHX1JFUF9DQVBfVkFMX01BU0spOwotCi0JaWYgKHJldCA+IEZHX0xPV19DQVBfV0FSTl9USFIpCi0JCXJlZ192YWwgPSBGR19MT1dfQ0FQX1dBUk5fVEhSOwotCWVsc2UgaWYgKHJldCA+IEZHX0xPV19DQVBfQ1JJVF9USFIpCi0JCXJlZ192YWwgPSBGR19MT1dfQ0FQX0NSSVRfVEhSOwotCWVsc2UKLQkJcmVnX3ZhbCA9IEZHX0xPV19DQVBfU0hETl9USFI7Ci0KLQlyZWdfdmFsIHw9IEZHX0xPV19DQVBfVEhSMV9WQUw7Ci0JcmV0ID0gZnVlbF9nYXVnZV9yZWdfd3JpdGViKGluZm8sIEFYUDI4OF9GR19MT1dfQ0FQX1JFRywgcmVnX3ZhbCk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwgIiVzOndyaXRlIGVycjolZFxuIiwgX19mdW5jX18sIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGZ1ZWxfZ2F1Z2VfcHJvZ3JhbV92YmF0dF9mdWxsKHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbykKLXsKLQlpbnQgcmV0OwotCXU4IHZhbDsKLQotCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDIwWF9DSFJHX0NUUkwxKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBmZ19wcm9nX29jdl9mYWlsOwotCWVsc2UKLQkJdmFsID0gKHJldCAmIH5DSFJHX0NDQ1ZfQ1ZfTUFTSyk7Ci0KLQlzd2l0Y2ggKGluZm8tPnBkYXRhLT5tYXhfdm9sdCkgewotCWNhc2UgQ1ZfNDEwMDoKLQkJdmFsIHw9IChDSFJHX0NDQ1ZfQ1ZfNDEwME1WIDw8IENIUkdfQ0NDVl9DVl9CSVRfUE9TKTsKLQkJYnJlYWs7Ci0JY2FzZSBDVl80MTUwOgotCQl2YWwgfD0gKENIUkdfQ0NDVl9DVl80MTUwTVYgPDwgQ0hSR19DQ0NWX0NWX0JJVF9QT1MpOwotCQlicmVhazsKLQljYXNlIENWXzQyMDA6Ci0JCXZhbCB8PSAoQ0hSR19DQ0NWX0NWXzQyMDBNViA8PCBDSFJHX0NDQ1ZfQ1ZfQklUX1BPUyk7Ci0JCWJyZWFrOwotCWNhc2UgQ1ZfNDM1MDoKLQkJdmFsIHw9IChDSFJHX0NDQ1ZfQ1ZfNDM1ME1WIDw8IENIUkdfQ0NDVl9DVl9CSVRfUE9TKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJdmFsIHw9IChDSFJHX0NDQ1ZfQ1ZfNDIwME1WIDw8IENIUkdfQ0NDVl9DVl9CSVRfUE9TKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0ID0gZnVlbF9nYXVnZV9yZWdfd3JpdGViKGluZm8sIEFYUDIwWF9DSFJHX0NUUkwxLCB2YWwpOwotZmdfcHJvZ19vY3ZfZmFpbDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGZ1ZWxfZ2F1Z2VfcHJvZ3JhbV9kZXNpZ25fY2FwKHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbykKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZnVlbF9nYXVnZV9yZWdfd3JpdGViKGluZm8sCi0JCUFYUDI4OF9GR19ERVNfQ0FQMV9SRUcsIGluZm8tPnBkYXRhLT5jYXAxKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBmZ19wcm9nX2Rlc2NhcF9mYWlsOwotCi0JcmV0ID0gZnVlbF9nYXVnZV9yZWdfd3JpdGViKGluZm8sCi0JCUFYUDI4OF9GR19ERVNfQ0FQMF9SRUcsIGluZm8tPnBkYXRhLT5jYXAwKTsKLQotZmdfcHJvZ19kZXNjYXBfZmFpbDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGZ1ZWxfZ2F1Z2VfcHJvZ3JhbV9vY3ZfY3VydmUoc3RydWN0IGF4cDI4OF9mZ19pbmZvICppbmZvKQotewotCWludCByZXQgPSAwLCBpOwotCi0JZm9yIChpID0gMDsgaSA8IE9DVl9DVVJWRV9TSVpFOyBpKyspIHsKLQkJcmV0ID0gZnVlbF9nYXVnZV9yZWdfd3JpdGViKGluZm8sCi0JCQlBWFAyODhfRkdfT0NWX0NVUlZFX1JFRyArIGksIGluZm8tPnBkYXRhLT5vY3ZfY3VydmVbaV0pOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZmdfcHJvZ19vY3ZfZmFpbDsKLQl9Ci0KLWZnX3Byb2dfb2N2X2ZhaWw6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBmdWVsX2dhdWdlX3Byb2dyYW1fcmRjX3ZhbHMoc3RydWN0IGF4cDI4OF9mZ19pbmZvICppbmZvKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBmdWVsX2dhdWdlX3JlZ193cml0ZWIoaW5mbywKLQkJQVhQMjg4X0ZHX1JEQzFfUkVHLCBpbmZvLT5wZGF0YS0+cmRjMSk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZmdfcHJvZ19vY3ZfZmFpbDsKLQotCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3dyaXRlYihpbmZvLAotCQlBWFAyODhfRkdfUkRDMF9SRUcsIGluZm8tPnBkYXRhLT5yZGMwKTsKLQotZmdfcHJvZ19vY3ZfZmFpbDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBmdWVsX2dhdWdlX2luaXRfY29uZmlnX3JlZ3Moc3RydWN0IGF4cDI4OF9mZ19pbmZvICppbmZvKQotewotCWludCByZXQ7Ci0KLQkvKgotCSAqIGNoZWNrIGlmIHRoZSBjb25maWcgZGF0YSBpcyBhbHJlYWR5Ci0JICogcHJvZ3JhbW1lZCBhbmQgaWYgc28ganVzdCByZXR1cm4uCi0JICovCi0KLQlyZXQgPSBmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyODhfRkdfREVTX0NBUDFfUkVHKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfd2FybigmaW5mby0+cGRldi0+ZGV2LCAiQ0FQMSByZWcgcmVhZCBlcnIhIVxuIik7Ci0JfSBlbHNlIGlmICghKHJldCAmIEZHX0RFU19DQVAxX1ZBTElEKSkgewotCQlkZXZfaW5mbygmaW5mby0+cGRldi0+ZGV2LCAiRkcgZGF0YSBuZWVkcyB0byBiZSBpbml0aWFsaXplZFxuIik7Ci0JfSBlbHNlIHsKLQkJZGV2X2luZm8oJmluZm8tPnBkZXYtPmRldiwgIkZHIGRhdGEgaXMgYWxyZWFkeSBpbml0aWFsaXplZFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlyZXQgPSBmdWVsX2dhdWdlX3Byb2dyYW1fdmJhdHRfZnVsbChpbmZvKTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LCAic2V0IHZiYXR0IGZ1bGwgZmFpbDolZFxuIiwgcmV0KTsKLQotCXJldCA9IGZ1ZWxfZ2F1Z2VfcHJvZ3JhbV9kZXNpZ25fY2FwKGluZm8pOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsICJzZXQgZGVzaWduIGNhcCBmYWlsOiVkXG4iLCByZXQpOwotCi0JcmV0ID0gZnVlbF9nYXVnZV9wcm9ncmFtX3JkY192YWxzKGluZm8pOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsICJzZXQgcmRjIGZhaWw6JWRcbiIsIHJldCk7Ci0KLQlyZXQgPSBmdWVsX2dhdWdlX3Byb2dyYW1fb2N2X2N1cnZlKGluZm8pOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsICJzZXQgb2N2IGN1cnZlIGZhaWw6JWRcbiIsIHJldCk7Ci0KLQlyZXQgPSBmdWVsX2dhdWdlX3NldF9sb3diYXR0X3RocmVzaG9sZHMoaW5mbyk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwgImxvd2JhdHQgdGhyIHNldCBmYWlsOiVkXG4iLCByZXQpOwotCi0JcmV0ID0gZnVlbF9nYXVnZV9yZWdfd3JpdGViKGluZm8sIEFYUDIwWF9DQ19DVFJMLCAweGVmKTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LCAiZ2F1Z2UgY250bCBzZXQgZmFpbDolZFxuIiwgcmV0KTsKLX0KLQotc3RhdGljIHZvaWQgZnVlbF9nYXVnZV9pbml0X2lycShzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8pCi17Ci0JaW50IHJldCwgaSwgcGlycTsKLQotCWZvciAoaSA9IDA7IGkgPCBBWFAyODhfRkdfSU5UUl9OVU07IGkrKykgewotCQlwaXJxID0gcGxhdGZvcm1fZ2V0X2lycShpbmZvLT5wZGV2LCBpKTsKLQkJaW5mby0+aXJxW2ldID0gcmVnbWFwX2lycV9nZXRfdmlycShpbmZvLT5yZWdtYXBfaXJxYywgcGlycSk7Ci0JCWlmIChpbmZvLT5pcnFbaV0gPCAwKSB7Ci0JCQlkZXZfd2FybigmaW5mby0+cGRldi0+ZGV2LAotCQkJCSJyZWdtYXBfaXJxIGdldCB2aXJxIGZhaWxlZCBmb3IgSVJRICVkOiAlZFxuIiwKLQkJCQlwaXJxLCBpbmZvLT5pcnFbaV0pOwotCQkJaW5mby0+aXJxW2ldID0gLTE7Ci0JCQlnb3RvIGludHJfZmFpbGVkOwotCQl9Ci0JCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGluZm8tPmlycVtpXSwKLQkJCQlOVUxMLCBmdWVsX2dhdWdlX3RocmVhZF9oYW5kbGVyLAotCQkJCUlSUUZfT05FU0hPVCwgREVWX05BTUUsIGluZm8pOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfd2FybigmaW5mby0+cGRldi0+ZGV2LAotCQkJCSJyZXF1ZXN0IGlycSBmYWlsZWQgZm9yIElSUSAlZDogJWRcbiIsCi0JCQkJcGlycSwgaW5mby0+aXJxW2ldKTsKLQkJCWluZm8tPmlycVtpXSA9IC0xOwotCQkJZ290byBpbnRyX2ZhaWxlZDsKLQkJfSBlbHNlIHsKLQkJCWRldl9pbmZvKCZpbmZvLT5wZGV2LT5kZXYsICJIVyBJUlEgJWQgLT4gVklSUSAlZFxuIiwKLQkJCQlwaXJxLCBpbmZvLT5pcnFbaV0pOwotCQl9Ci0JfQotCXJldHVybjsKLQotaW50cl9mYWlsZWQ6Ci0JZm9yICg7IGkgPiAwOyBpLS0pIHsKLQkJZnJlZV9pcnEoaW5mby0+aXJxW2kgLSAxXSwgaW5mbyk7Ci0JCWluZm8tPmlycVtpIC0gMV0gPSAtMTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGZ1ZWxfZ2F1Z2VfaW5pdF9od19yZWdzKHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbykKLXsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGludCB2YWw7Ci0KLQlyZXQgPSBmdWVsX2dhdWdlX3NldF9oaWdoX2J0ZW1wX2FsZXJ0KGluZm8pOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsICJoaWdoIGJhdHQgdGVtcCBzZXQgZmFpbDolZFxuIiwgcmV0KTsKLQotCXJldCA9IGZ1ZWxfZ2F1Z2Vfc2V0X2xvd19idGVtcF9hbGVydChpbmZvKTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LCAibG93IGJhdHQgdGVtcCBzZXQgZmFpbDolZFxuIiwgcmV0KTsKLQotCS8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCi0JdmFsID0gZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjBYX0lSUTNfRU4pOwotCXZhbCB8PSBURU1QX0lSUV9DRkdfTUFTSzsKLQlmdWVsX2dhdWdlX3JlZ193cml0ZWIoaW5mbywgQVhQMjBYX0lSUTNfRU4sIHZhbCk7Ci0KLQl2YWwgPSBmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyMFhfSVJRNF9FTik7Ci0JdmFsIHw9IEZHX0lSUV9DRkdfTE9XQkFUVF9NQVNLOwotCXZhbCA9IGZ1ZWxfZ2F1Z2VfcmVnX3dyaXRlYihpbmZvLCBBWFAyMFhfSVJRNF9FTiwgdmFsKTsKLX0KLQotc3RhdGljIGludCBheHAyODhfZnVlbF9nYXVnZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbzsKLQlzdHJ1Y3QgYXhwMjB4X2RldiAqYXhwMjB4ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwotCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKLQotCWluZm8gPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpbmZvKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWluZm8tPnBkZXYgPSBwZGV2OwotCWluZm8tPnJlZ21hcCA9IGF4cDIweC0+cmVnbWFwOwotCWluZm8tPnJlZ21hcF9pcnFjID0gYXhwMjB4LT5yZWdtYXBfaXJxYzsKLQlpbmZvLT5zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047Ci0JaW5mby0+cGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlpZiAoIWluZm8tPnBkYXRhKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGluZm8pOwotCi0JbXV0ZXhfaW5pdCgmaW5mby0+bG9jayk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJmluZm8tPnN0YXR1c19tb25pdG9yLCBmdWVsX2dhdWdlX3N0YXR1c19tb25pdG9yKTsKLQotCXBzeV9jZmcuZHJ2X2RhdGEgPSBpbmZvOwotCWluZm8tPmJhdCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmZnVlbF9nYXVnZV9kZXNjLCAmcHN5X2NmZyk7Ci0JaWYgKElTX0VSUihpbmZvLT5iYXQpKSB7Ci0JCXJldCA9IFBUUl9FUlIoaW5mby0+YmF0KTsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGJhdHRlcnk6ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWZ1ZWxfZ2F1Z2VfY3JlYXRlX2RlYnVnZnMoaW5mbyk7Ci0JZnVlbF9nYXVnZV9pbml0X2NvbmZpZ19yZWdzKGluZm8pOwotCWZ1ZWxfZ2F1Z2VfaW5pdF9pcnEoaW5mbyk7Ci0JZnVlbF9nYXVnZV9pbml0X2h3X3JlZ3MoaW5mbyk7Ci0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZpbmZvLT5zdGF0dXNfbW9uaXRvciwgU1RBVFVTX01PTl9ERUxBWV9KSUZGSUVTKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIGF4cDI4OF9mZ19pZF90YWJsZVtdID0gewotCXsgLm5hbWUgPSBERVZfTkFNRSB9LAotCXt9LAotfTsKLQotc3RhdGljIGludCBheHAyODhfZnVlbF9nYXVnZV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlpbnQgaTsKLQotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmaW5mby0+c3RhdHVzX21vbml0b3IpOwotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGluZm8tPmJhdCk7Ci0JZnVlbF9nYXVnZV9yZW1vdmVfZGVidWdmcyhpbmZvKTsKLQotCWZvciAoaSA9IDA7IGkgPCBBWFAyODhfRkdfSU5UUl9OVU07IGkrKykKLQkJaWYgKGluZm8tPmlycVtpXSA+PSAwKQotCQkJZnJlZV9pcnEoaW5mby0+aXJxW2ldLCBpbmZvKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBheHAyODhfZnVlbF9nYXVnZV9kcml2ZXIgPSB7Ci0JLnByb2JlID0gYXhwMjg4X2Z1ZWxfZ2F1Z2VfcHJvYmUsCi0JLnJlbW92ZSA9IGF4cDI4OF9mdWVsX2dhdWdlX3JlbW92ZSwKLQkuaWRfdGFibGUgPSBheHAyODhfZmdfaWRfdGFibGUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSBERVZfTkFNRSwKLQl9LAotfTsKLQotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihheHAyODhfZnVlbF9nYXVnZV9kcml2ZXIpOwotCi1NT0RVTEVfQVVUSE9SKCJSYW1ha3Jpc2huYSBQYWxsYWxhIDxyYW1ha3Jpc2huYS5wYWxsYWxhQGludGVsLmNvbT4iKTsKLU1PRFVMRV9BVVRIT1IoIlRvZGQgQnJhbmR0IDx0b2RkLmUuYnJhbmR0QGxpbnV4LmludGVsLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiWHBvd2VyIEFYUDI4OCBGdWVsIEdhdWdlIERyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9icTI0MjU3X2NoYXJnZXIuYyBiL2RyaXZlcnMvcG93ZXIvYnEyNDI1N19jaGFyZ2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZWEyYzcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9wb3dlci9icTI0MjU3X2NoYXJnZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDExOTYgKzAsMCBAQAotLyoKLSAqIFRJIEJRMjQyNTcgY2hhcmdlciBkcml2ZXIKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgSW50ZWwgQ29ycG9yYXRpb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogRGF0YXNoZWV0czoKLSAqIGh0dHA6Ly93d3cudGkuY29tL3Byb2R1Y3QvYnEyNDI1MAotICogaHR0cDovL3d3dy50aS5jb20vcHJvZHVjdC9icTI0MjUxCi0gKiBodHRwOi8vd3d3LnRpLmNvbS9wcm9kdWN0L2JxMjQyNTcKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+Ci0jaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotCi0jZGVmaW5lIEJRMjQyNTdfUkVHXzEJCQkweDAwCi0jZGVmaW5lIEJRMjQyNTdfUkVHXzIJCQkweDAxCi0jZGVmaW5lIEJRMjQyNTdfUkVHXzMJCQkweDAyCi0jZGVmaW5lIEJRMjQyNTdfUkVHXzQJCQkweDAzCi0jZGVmaW5lIEJRMjQyNTdfUkVHXzUJCQkweDA0Ci0jZGVmaW5lIEJRMjQyNTdfUkVHXzYJCQkweDA1Ci0jZGVmaW5lIEJRMjQyNTdfUkVHXzcJCQkweDA2Ci0KLSNkZWZpbmUgQlEyNDI1N19NQU5VRkFDVFVSRVIJCSJUZXhhcyBJbnN0cnVtZW50cyIKLSNkZWZpbmUgQlEyNDI1N19QR19HUElPCQkJInBnIgotCi0jZGVmaW5lIEJRMjQyNTdfSUxJTV9TRVRfREVMQVkJCTEwMDAJLyogbXNlYyAqLwotCi0vKgotICogV2hlbiBhZGRpbmcgc3VwcG9ydCBmb3IgbmV3IGRldmljZXMgbWFrZSBzdXJlIHRoYXQgZW51bSBicTI0MjV4X2NoaXAgYW5kCi0gKiBicTI0MjV4X2NoaXBfbmFtZVtdIGFsd2F5cyBzdGF5IGluIHN5bmMhCi0gKi8KLWVudW0gYnEyNDI1eF9jaGlwIHsKLQlCUTI0MjUwLAotCUJRMjQyNTEsCi0JQlEyNDI1NywKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBicTI0MjV4X2NoaXBfbmFtZVtdID0gewotCSJicTI0MjUwIiwKLQkiYnEyNDI1MSIsCi0JImJxMjQyNTciLAotfTsKLQotZW51bSBicTI0MjU3X2ZpZWxkcyB7Ci0JRl9XRF9GQVVMVCwgRl9XRF9FTiwgRl9TVEFULCBGX0ZBVUxULAkJCSAgICAvKiBSRUcgMSAqLwotCUZfUkVTRVQsIEZfSUlMSU1JVCwgRl9FTl9TVEFULCBGX0VOX1RFUk0sIEZfQ0UsIEZfSFpfTU9ERSwgIC8qIFJFRyAyICovCi0JRl9WQkFULCBGX1VTQl9ERVQsCQkJCQkgICAgLyogUkVHIDMgKi8KLQlGX0lDSEcsIEZfSVRFUk0sCQkJCQkgICAgLyogUkVHIDQgKi8KLQlGX0xPT1BfU1RBVFVTLCBGX0xPV19DSEcsIEZfRFBETV9FTiwgRl9DRV9TVEFUVVMsIEZfVklORFBNLCAvKiBSRUcgNSAqLwotCUZfWDJfVE1SX0VOLCBGX1RNUiwgRl9TWVNPRkYsIEZfVFNfRU4sIEZfVFNfU1RBVCwJICAgIC8qIFJFRyA2ICovCi0JRl9WT1ZQLCBGX0NMUl9WRFAsIEZfRk9SQ0VfQkFUREVULCBGX0ZPUkNFX1BUTSwJCSAgICAvKiBSRUcgNyAqLwotCi0JRl9NQVhfRklFTERTCi19OwotCi0vKiBpbml0aWFsIGZpZWxkIHZhbHVlcywgY29udmVydGVkIGZyb20gdVYvdUEgKi8KLXN0cnVjdCBicTI0MjU3X2luaXRfZGF0YSB7Ci0JdTggaWNoZzsJLyogY2hhcmdlIGN1cnJlbnQgICAgICAqLwotCXU4IHZiYXQ7CS8qIHJlZ3VsYXRpb24gdm9sdGFnZSAgKi8KLQl1OCBpdGVybTsJLyogdGVybWluYXRpb24gY3VycmVudCAqLwotCXU4IGlpbGltaXQ7CS8qIGlucHV0IGN1cnJlbnQgbGltaXQgKi8KLQl1OCB2b3ZwOwkvKiBvdmVyIHZvbHRhZ2UgcHJvdGVjdGlvbiB2b2x0YWdlICovCi0JdTggdmluZHBtOwkvKiBWRE1QIGlucHV0IHRocmVzaG9sZCB2b2x0YWdlICovCi19OwotCi1zdHJ1Y3QgYnEyNDI1N19zdGF0ZSB7Ci0JdTggc3RhdHVzOwotCXU4IGZhdWx0OwotCWJvb2wgcG93ZXJfZ29vZDsKLX07Ci0KLXN0cnVjdCBicTI0MjU3X2RldmljZSB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqY2hhcmdlcjsKLQotCWVudW0gYnEyNDI1eF9jaGlwIGNoaXA7Ci0KLQlzdHJ1Y3QgcmVnbWFwICpybWFwOwotCXN0cnVjdCByZWdtYXBfZmllbGQgKnJtYXBfZmllbGRzW0ZfTUFYX0ZJRUxEU107Ci0KLQlzdHJ1Y3QgZ3Bpb19kZXNjICpwZzsKLQotCXN0cnVjdCBkZWxheWVkX3dvcmsgaWlsaW1pdF9zZXR1cF93b3JrOwotCi0Jc3RydWN0IGJxMjQyNTdfaW5pdF9kYXRhIGluaXRfZGF0YTsKLQlzdHJ1Y3QgYnEyNDI1N19zdGF0ZSBzdGF0ZTsKLQotCXN0cnVjdCBtdXRleCBsb2NrOyAvKiBwcm90ZWN0IHN0YXRlIGRhdGEgKi8KLQotCWJvb2wgaWlsaW1pdF9hdXRvc2V0X2VuYWJsZTsKLX07Ci0KLXN0YXRpYyBib29sIGJxMjQyNTdfaXNfdm9sYXRpbGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKLXsKLQlzd2l0Y2ggKHJlZykgewotCWNhc2UgQlEyNDI1N19SRUdfMjoKLQljYXNlIEJRMjQyNTdfUkVHXzQ6Ci0JCXJldHVybiBmYWxzZTsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGJxMjQyNTdfcmVnbWFwX2NvbmZpZyA9IHsKLQkucmVnX2JpdHMgPSA4LAotCS52YWxfYml0cyA9IDgsCi0KLQkubWF4X3JlZ2lzdGVyID0gQlEyNDI1N19SRUdfNywKLQkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKLQotCS52b2xhdGlsZV9yZWcgPSBicTI0MjU3X2lzX3ZvbGF0aWxlX3JlZywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX2ZpZWxkIGJxMjQyNTdfcmVnX2ZpZWxkc1tdID0gewotCS8qIFJFRyAxICovCi0JW0ZfV0RfRkFVTFRdCQk9IFJFR19GSUVMRChCUTI0MjU3X1JFR18xLCA3LCA3KSwKLQlbRl9XRF9FTl0JCT0gUkVHX0ZJRUxEKEJRMjQyNTdfUkVHXzEsIDYsIDYpLAotCVtGX1NUQVRdCQk9IFJFR19GSUVMRChCUTI0MjU3X1JFR18xLCA0LCA1KSwKLQlbRl9GQVVMVF0JCT0gUkVHX0ZJRUxEKEJRMjQyNTdfUkVHXzEsIDAsIDMpLAotCS8qIFJFRyAyICovCi0JW0ZfUkVTRVRdCQk9IFJFR19GSUVMRChCUTI0MjU3X1JFR18yLCA3LCA3KSwKLQlbRl9JSUxJTUlUXQkJPSBSRUdfRklFTEQoQlEyNDI1N19SRUdfMiwgNCwgNiksCi0JW0ZfRU5fU1RBVF0JCT0gUkVHX0ZJRUxEKEJRMjQyNTdfUkVHXzIsIDMsIDMpLAotCVtGX0VOX1RFUk1dCQk9IFJFR19GSUVMRChCUTI0MjU3X1JFR18yLCAyLCAyKSwKLQlbRl9DRV0JCQk9IFJFR19GSUVMRChCUTI0MjU3X1JFR18yLCAxLCAxKSwKLQlbRl9IWl9NT0RFXQkJPSBSRUdfRklFTEQoQlEyNDI1N19SRUdfMiwgMCwgMCksCi0JLyogUkVHIDMgKi8KLQlbRl9WQkFUXQkJPSBSRUdfRklFTEQoQlEyNDI1N19SRUdfMywgMiwgNyksCi0JW0ZfVVNCX0RFVF0JCT0gUkVHX0ZJRUxEKEJRMjQyNTdfUkVHXzMsIDAsIDEpLAotCS8qIFJFRyA0ICovCi0JW0ZfSUNIR10JCT0gUkVHX0ZJRUxEKEJRMjQyNTdfUkVHXzQsIDMsIDcpLAotCVtGX0lURVJNXQkJPSBSRUdfRklFTEQoQlEyNDI1N19SRUdfNCwgMCwgMiksCi0JLyogUkVHIDUgKi8KLQlbRl9MT09QX1NUQVRVU10JCT0gUkVHX0ZJRUxEKEJRMjQyNTdfUkVHXzUsIDYsIDcpLAotCVtGX0xPV19DSEddCQk9IFJFR19GSUVMRChCUTI0MjU3X1JFR181LCA1LCA1KSwKLQlbRl9EUERNX0VOXQkJPSBSRUdfRklFTEQoQlEyNDI1N19SRUdfNSwgNCwgNCksCi0JW0ZfQ0VfU1RBVFVTXQkJPSBSRUdfRklFTEQoQlEyNDI1N19SRUdfNSwgMywgMyksCi0JW0ZfVklORFBNXQkJPSBSRUdfRklFTEQoQlEyNDI1N19SRUdfNSwgMCwgMiksCi0JLyogUkVHIDYgKi8KLQlbRl9YMl9UTVJfRU5dCQk9IFJFR19GSUVMRChCUTI0MjU3X1JFR182LCA3LCA3KSwKLQlbRl9UTVJdCQkJPSBSRUdfRklFTEQoQlEyNDI1N19SRUdfNiwgNSwgNiksCi0JW0ZfU1lTT0ZGXQkJPSBSRUdfRklFTEQoQlEyNDI1N19SRUdfNiwgNCwgNCksCi0JW0ZfVFNfRU5dCQk9IFJFR19GSUVMRChCUTI0MjU3X1JFR182LCAzLCAzKSwKLQlbRl9UU19TVEFUXQkJPSBSRUdfRklFTEQoQlEyNDI1N19SRUdfNiwgMCwgMiksCi0JLyogUkVHIDcgKi8KLQlbRl9WT1ZQXQkJPSBSRUdfRklFTEQoQlEyNDI1N19SRUdfNywgNSwgNyksCi0JW0ZfQ0xSX1ZEUF0JCT0gUkVHX0ZJRUxEKEJRMjQyNTdfUkVHXzcsIDQsIDQpLAotCVtGX0ZPUkNFX0JBVERFVF0JPSBSRUdfRklFTEQoQlEyNDI1N19SRUdfNywgMywgMyksCi0JW0ZfRk9SQ0VfUFRNXQkJPSBSRUdfRklFTEQoQlEyNDI1N19SRUdfNywgMiwgMikKLX07Ci0KLXN0YXRpYyBjb25zdCB1MzIgYnEyNDI1N192YmF0X21hcFtdID0gewotCTM1MDAwMDAsIDM1MjAwMDAsIDM1NDAwMDAsIDM1NjAwMDAsIDM1ODAwMDAsIDM2MDAwMDAsIDM2MjAwMDAsIDM2NDAwMDAsCi0JMzY2MDAwMCwgMzY4MDAwMCwgMzcwMDAwMCwgMzcyMDAwMCwgMzc0MDAwMCwgMzc2MDAwMCwgMzc4MDAwMCwgMzgwMDAwMCwKLQkzODIwMDAwLCAzODQwMDAwLCAzODYwMDAwLCAzODgwMDAwLCAzOTAwMDAwLCAzOTIwMDAwLCAzOTQwMDAwLCAzOTYwMDAwLAotCTM5ODAwMDAsIDQwMDAwMDAsIDQwMjAwMDAsIDQwNDAwMDAsIDQwNjAwMDAsIDQwODAwMDAsIDQxMDAwMDAsIDQxMjAwMDAsCi0JNDE0MDAwMCwgNDE2MDAwMCwgNDE4MDAwMCwgNDIwMDAwMCwgNDIyMDAwMCwgNDI0MDAwMCwgNDI2MDAwMCwgNDI4MDAwMCwKLQk0MzAwMDAwLCA0MzIwMDAwLCA0MzQwMDAwLCA0MzYwMDAwLCA0MzgwMDAwLCA0NDAwMDAwLCA0NDIwMDAwLCA0NDQwMDAwCi19OwotCi0jZGVmaW5lIEJRMjQyNTdfVkJBVF9NQVBfU0laRQkJQVJSQVlfU0laRShicTI0MjU3X3ZiYXRfbWFwKQotCi1zdGF0aWMgY29uc3QgdTMyIGJxMjQyNTdfaWNoZ19tYXBbXSA9IHsKLQk1MDAwMDAsIDU1MDAwMCwgNjAwMDAwLCA2NTAwMDAsIDcwMDAwMCwgNzUwMDAwLCA4MDAwMDAsIDg1MDAwMCwgOTAwMDAwLAotCTk1MDAwMCwgMTAwMDAwMCwgMTA1MDAwMCwgMTEwMDAwMCwgMTE1MDAwMCwgMTIwMDAwMCwgMTI1MDAwMCwgMTMwMDAwMCwKLQkxMzUwMDAwLCAxNDAwMDAwLCAxNDUwMDAwLCAxNTAwMDAwLCAxNTUwMDAwLCAxNjAwMDAwLCAxNjUwMDAwLCAxNzAwMDAwLAotCTE3NTAwMDAsIDE4MDAwMDAsIDE4NTAwMDAsIDE5MDAwMDAsIDE5NTAwMDAsIDIwMDAwMDAKLX07Ci0KLSNkZWZpbmUgQlEyNDI1N19JQ0hHX01BUF9TSVpFCQlBUlJBWV9TSVpFKGJxMjQyNTdfaWNoZ19tYXApCi0KLXN0YXRpYyBjb25zdCB1MzIgYnEyNDI1N19pdGVybV9tYXBbXSA9IHsKLQk1MDAwMCwgNzUwMDAsIDEwMDAwMCwgMTI1MDAwLCAxNTAwMDAsIDE3NTAwMCwgMjAwMDAwLCAyMjUwMDAKLX07Ci0KLSNkZWZpbmUgQlEyNDI1N19JVEVSTV9NQVBfU0laRQkJQVJSQVlfU0laRShicTI0MjU3X2l0ZXJtX21hcCkKLQotc3RhdGljIGNvbnN0IHUzMiBicTI0MjU3X2lpbGltaXRfbWFwW10gPSB7Ci0JMTAwMDAwLCAxNTAwMDAsIDUwMDAwMCwgOTAwMDAwLCAxNTAwMDAwLCAyMDAwMDAwCi19OwotCi0jZGVmaW5lIEJRMjQyNTdfSUlMSU1JVF9NQVBfU0laRQlBUlJBWV9TSVpFKGJxMjQyNTdfaWlsaW1pdF9tYXApCi0KLXN0YXRpYyBjb25zdCB1MzIgYnEyNDI1N192b3ZwX21hcFtdID0gewotCTYwMDAwMDAsIDY1MDAwMDAsIDcwMDAwMDAsIDgwMDAwMDAsIDkwMDAwMDAsIDk1MDAwMDAsIDEwMDAwMDAwLAotCTEwNTAwMDAwCi19OwotCi0jZGVmaW5lIEJRMjQyNTdfVk9WUF9NQVBfU0laRQkJQVJSQVlfU0laRShicTI0MjU3X3ZvdnBfbWFwKQotCi1zdGF0aWMgY29uc3QgdTMyIGJxMjQyNTdfdmluZHBtX21hcFtdID0gewotCTQyMDAwMDAsIDQyODAwMDAsIDQzNjAwMDAsIDQ0NDAwMDAsIDQ1MjAwMDAsIDQ2MDAwMDAsIDQ2ODAwMDAsCi0JNDc2MDAwMAotfTsKLQotI2RlZmluZSBCUTI0MjU3X1ZJTkRQTV9NQVBfU0laRQkJQVJSQVlfU0laRShicTI0MjU3X3ZpbmRwbV9tYXApCi0KLXN0YXRpYyBpbnQgYnEyNDI1N19maWVsZF9yZWFkKHN0cnVjdCBicTI0MjU3X2RldmljZSAqYnEsCi0JCQkgICAgICBlbnVtIGJxMjQyNTdfZmllbGRzIGZpZWxkX2lkKQotewotCWludCByZXQ7Ci0JaW50IHZhbDsKLQotCXJldCA9IHJlZ21hcF9maWVsZF9yZWFkKGJxLT5ybWFwX2ZpZWxkc1tmaWVsZF9pZF0sICZ2YWwpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIHZhbDsKLX0KLQotc3RhdGljIGludCBicTI0MjU3X2ZpZWxkX3dyaXRlKHN0cnVjdCBicTI0MjU3X2RldmljZSAqYnEsCi0JCQkgICAgICAgZW51bSBicTI0MjU3X2ZpZWxkcyBmaWVsZF9pZCwgdTggdmFsKQotewotCXJldHVybiByZWdtYXBfZmllbGRfd3JpdGUoYnEtPnJtYXBfZmllbGRzW2ZpZWxkX2lkXSwgdmFsKTsKLX0KLQotc3RhdGljIHU4IGJxMjQyNTdfZmluZF9pZHgodTMyIHZhbHVlLCBjb25zdCB1MzIgKm1hcCwgdTggbWFwX3NpemUpCi17Ci0JdTggaWR4OwotCi0JZm9yIChpZHggPSAxOyBpZHggPCBtYXBfc2l6ZTsgaWR4KyspCi0JCWlmICh2YWx1ZSA8IG1hcFtpZHhdKQotCQkJYnJlYWs7Ci0KLQlyZXR1cm4gaWR4IC0gMTsKLX0KLQotZW51bSBicTI0MjU3X3N0YXR1cyB7Ci0JU1RBVFVTX1JFQURZLAotCVNUQVRVU19DSEFSR0VfSU5fUFJPR1JFU1MsCi0JU1RBVFVTX0NIQVJHRV9ET05FLAotCVNUQVRVU19GQVVMVCwKLX07Ci0KLWVudW0gYnEyNDI1N19mYXVsdCB7Ci0JRkFVTFRfTk9STUFMLAotCUZBVUxUX0lOUFVUX09WUCwKLQlGQVVMVF9JTlBVVF9VVkxPLAotCUZBVUxUX1NMRUVQLAotCUZBVUxUX0JBVF9UUywKLQlGQVVMVF9CQVRfT1ZQLAotCUZBVUxUX1RTLAotCUZBVUxUX1RJTUVSLAotCUZBVUxUX05PX0JBVCwKLQlGQVVMVF9JU0VULAotCUZBVUxUX0lOUFVUX0xET19MT1csCi19OwotCi1zdGF0aWMgaW50IGJxMjQyNTdfZ2V0X2lucHV0X2N1cnJlbnRfbGltaXQoc3RydWN0IGJxMjQyNTdfZGV2aWNlICpicSwKLQkJCQkJICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gYnEyNDI1N19maWVsZF9yZWFkKGJxLCBGX0lJTElNSVQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JLyoKLQkgKiBUaGUgIkV4dGVybmFsIElMSU0iIGFuZCAiUHJvZHVjdGlvbiAmIFRlc3QiIG1vZGVzIGFyZSBub3QgZXhwb3NlZAotCSAqIHRocm91Z2ggdGhpcyBkcml2ZXIgYW5kIG5vdCBiZWluZyBjb3ZlcmVkIGJ5IHRoZSBsb29rdXAgdGFibGUuCi0JICogU2hvdWxkIHN1Y2ggYSBtb2RlIGhhdmUgYmVjb21lIGFjdGl2ZSBsZXQncyByZXR1cm4gYW4gZXJyb3IgcmF0aGVyCi0JICogdGhhbiBleGNlZWRpbmcgdGhlIGJvdW5kcyBvZiB0aGUgbG9va3VwIHRhYmxlIGFuZCByZXR1cm5pbmcKLQkgKiBnYXJiYWdlLgotCSAqLwotCWlmIChyZXQgPj0gQlEyNDI1N19JSUxJTUlUX01BUF9TSVpFKQotCQlyZXR1cm4gLUVOT0RBVEE7Ci0KLQl2YWwtPmludHZhbCA9IGJxMjQyNTdfaWlsaW1pdF9tYXBbcmV0XTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJxMjQyNTdfc2V0X2lucHV0X2N1cnJlbnRfbGltaXQoc3RydWN0IGJxMjQyNTdfZGV2aWNlICpicSwKLQkJCQkJY29uc3QgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKLXsKLQkvKgotCSAqIEFkZHJlc3MgdGhlIGNhc2Ugd2hlcmUgdGhlIHVzZXIgbWFudWFsbHkgc2V0cyBhbiBpbnB1dCBjdXJyZW50IGxpbWl0Ci0JICogd2hpbGUgdGhlIGNoYXJnZXIgYXV0by1kZXRlY3Rpb24gbWVjaGFuaXNtIGlzIGlzIGFjdGl2ZS4gSW4gdGhpcwotCSAqIGNhc2Ugd2Ugd2FudCB0byBhYm9ydCBhbmQgZ28gc3RyYWlnaHQgdG8gdGhlIHVzZXItc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCWlmIChicS0+aWlsaW1pdF9hdXRvc2V0X2VuYWJsZSkKLQkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZicS0+aWlsaW1pdF9zZXR1cF93b3JrKTsKLQotCXJldHVybiBicTI0MjU3X2ZpZWxkX3dyaXRlKGJxLCBGX0lJTElNSVQsCi0JCQkJICAgYnEyNDI1N19maW5kX2lkeCh2YWwtPmludHZhbCwKLQkJCQkJCSAgICBicTI0MjU3X2lpbGltaXRfbWFwLAotCQkJCQkJICAgIEJRMjQyNTdfSUlMSU1JVF9NQVBfU0laRSkpOwotfQotCi1zdGF0aWMgaW50IGJxMjQyNTdfcG93ZXJfc3VwcGx5X2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCi0JCQkJCSAgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAotCQkJCQkgICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCi17Ci0Jc3RydWN0IGJxMjQyNTdfZGV2aWNlICpicSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwotCXN0cnVjdCBicTI0MjU3X3N0YXRlIHN0YXRlOwotCi0JbXV0ZXhfbG9jaygmYnEtPmxvY2spOwotCXN0YXRlID0gYnEtPnN0YXRlOwotCW11dGV4X3VubG9jaygmYnEtPmxvY2spOwotCi0Jc3dpdGNoIChwc3ApIHsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKLQkJaWYgKCFzdGF0ZS5wb3dlcl9nb29kKQotCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOwotCQllbHNlIGlmIChzdGF0ZS5zdGF0dXMgPT0gU1RBVFVTX1JFQURZKQotCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX05PVF9DSEFSR0lORzsKLQkJZWxzZSBpZiAoc3RhdGUuc3RhdHVzID09IFNUQVRVU19DSEFSR0VfSU5fUFJPR1JFU1MpCi0JCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7Ci0JCWVsc2UgaWYgKHN0YXRlLnN0YXR1cyA9PSBTVEFUVVNfQ0hBUkdFX0RPTkUpCi0JCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTDsKLQkJZWxzZQotCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047Ci0JCWJyZWFrOwotCi0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9NQU5VRkFDVFVSRVI6Ci0JCXZhbC0+c3RydmFsID0gQlEyNDI1N19NQU5VRkFDVFVSRVI7Ci0JCWJyZWFrOwotCi0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9NT0RFTF9OQU1FOgotCQl2YWwtPnN0cnZhbCA9IGJxMjQyNXhfY2hpcF9uYW1lW2JxLT5jaGlwXTsKLQkJYnJlYWs7Ci0KLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORToKLQkJdmFsLT5pbnR2YWwgPSBzdGF0ZS5wb3dlcl9nb29kOwotCQlicmVhazsKLQotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfSEVBTFRIOgotCQlzd2l0Y2ggKHN0YXRlLmZhdWx0KSB7Ci0JCWNhc2UgRkFVTFRfTk9STUFMOgotCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0Q7Ci0JCQlicmVhazsKLQotCQljYXNlIEZBVUxUX0lOUFVUX09WUDoKLQkJY2FzZSBGQVVMVF9CQVRfT1ZQOgotCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJWT0xUQUdFOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBGQVVMVF9UUzoKLQkJY2FzZSBGQVVMVF9CQVRfVFM6Ci0JCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUkhFQVQ7Ci0JCQlicmVhazsKLQotCQljYXNlIEZBVUxUX1RJTUVSOgotCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX1NBRkVUWV9USU1FUl9FWFBJUkU7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOU1BFQ19GQUlMVVJFOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlicmVhazsKLQotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX0NVUlJFTlQ6Ci0JCXZhbC0+aW50dmFsID0gYnEyNDI1N19pY2hnX21hcFticS0+aW5pdF9kYXRhLmljaGddOwotCQlicmVhazsKLQotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX0NVUlJFTlRfTUFYOgotCQl2YWwtPmludHZhbCA9IGJxMjQyNTdfaWNoZ19tYXBbQlEyNDI1N19JQ0hHX01BUF9TSVpFIC0gMV07Ci0JCWJyZWFrOwotCi0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfVk9MVEFHRToKLQkJdmFsLT5pbnR2YWwgPSBicTI0MjU3X3ZiYXRfbWFwW2JxLT5pbml0X2RhdGEudmJhdF07Ci0JCWJyZWFrOwotCi0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfVk9MVEFHRV9NQVg6Ci0JCXZhbC0+aW50dmFsID0gYnEyNDI1N192YmF0X21hcFtCUTI0MjU3X1ZCQVRfTUFQX1NJWkUgLSAxXTsKLQkJYnJlYWs7Ci0KLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9URVJNX0NVUlJFTlQ6Ci0JCXZhbC0+aW50dmFsID0gYnEyNDI1N19pdGVybV9tYXBbYnEtPmluaXRfZGF0YS5pdGVybV07Ci0JCWJyZWFrOwotCi0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9JTlBVVF9DVVJSRU5UX0xJTUlUOgotCQlyZXR1cm4gYnEyNDI1N19nZXRfaW5wdXRfY3VycmVudF9saW1pdChicSwgdmFsKTsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJxMjQyNTdfcG93ZXJfc3VwcGx5X3NldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCi0JCQkJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHByb3AsCi0JCQkJCWNvbnN0IHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCi17Ci0Jc3RydWN0IGJxMjQyNTdfZGV2aWNlICpicSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwotCi0Jc3dpdGNoIChwcm9wKSB7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9JTlBVVF9DVVJSRU5UX0xJTUlUOgotCQlyZXR1cm4gYnEyNDI1N19zZXRfaW5wdXRfY3VycmVudF9saW1pdChicSwgdmFsKTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgYnEyNDI1N19wb3dlcl9zdXBwbHlfcHJvcGVydHlfaXNfd3JpdGVhYmxlKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKLQkJCQkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwKQotewotCXN3aXRjaCAocHNwKSB7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9JTlBVVF9DVVJSRU5UX0xJTUlUOgotCQlyZXR1cm4gdHJ1ZTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQotCi1zdGF0aWMgaW50IGJxMjQyNTdfZ2V0X2NoaXBfc3RhdGUoc3RydWN0IGJxMjQyNTdfZGV2aWNlICpicSwKLQkJCQkgIHN0cnVjdCBicTI0MjU3X3N0YXRlICpzdGF0ZSkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gYnEyNDI1N19maWVsZF9yZWFkKGJxLCBGX1NUQVQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0Jc3RhdGUtPnN0YXR1cyA9IHJldDsKLQotCXJldCA9IGJxMjQyNTdfZmllbGRfcmVhZChicSwgRl9GQVVMVCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlzdGF0ZS0+ZmF1bHQgPSByZXQ7Ci0KLQlpZiAoYnEtPnBnKQotCQlzdGF0ZS0+cG93ZXJfZ29vZCA9ICFncGlvZF9nZXRfdmFsdWVfY2Fuc2xlZXAoYnEtPnBnKTsKLQllbHNlCi0JCS8qCi0JCSAqIElmIHdlIGhhdmUgYSBjaGlwIHdpdGhvdXQgYSBkZWRpY2F0ZWQgcG93ZXItZ29vZCBHUElPIG9yCi0JCSAqIHNvbWUgb3RoZXIgZXhwbGljaXQgYml0IHRoYXQgd291bGQgcHJvdmlkZSB0aGlzIGluZm9ybWF0aW9uCi0JCSAqIGFzc3VtZSB0aGUgcG93ZXIgaXMgZ29vZCBpZiB0aGVyZSBpcyBubyBzdXBwbHkgcmVsYXRlZAotCQkgKiBmYXVsdCAtIGFuZCBub3QgZ29vZCBvdGhlcndpc2UuIFRoZXJlIGlzIGEgcG9zc2liaWxpdHkgZm9yCi0JCSAqIG90aGVyIGVycm9ycyB0byBtYXNrIHRoYXQgcG93ZXIgaW4gZmFjdCBpcyBub3QgZ29vZCBidXQgdGhpcwotCQkgKiBpcyBwcm9iYWJseSB0aGUgYmVzdCB3ZSBjYW4gZG8gaGVyZS4KLQkJICovCi0JCXN3aXRjaCAoc3RhdGUtPmZhdWx0KSB7Ci0JCWNhc2UgRkFVTFRfSU5QVVRfT1ZQOgotCQljYXNlIEZBVUxUX0lOUFVUX1VWTE86Ci0JCWNhc2UgRkFVTFRfSU5QVVRfTERPX0xPVzoKLQkJCXN0YXRlLT5wb3dlcl9nb29kID0gZmFsc2U7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXN0YXRlLT5wb3dlcl9nb29kID0gdHJ1ZTsKLQkJfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBib29sIGJxMjQyNTdfc3RhdGVfY2hhbmdlZChzdHJ1Y3QgYnEyNDI1N19kZXZpY2UgKmJxLAotCQkJCSAgc3RydWN0IGJxMjQyNTdfc3RhdGUgKm5ld19zdGF0ZSkKLXsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmYnEtPmxvY2spOwotCXJldCA9IChicS0+c3RhdGUuc3RhdHVzICE9IG5ld19zdGF0ZS0+c3RhdHVzIHx8Ci0JICAgICAgIGJxLT5zdGF0ZS5mYXVsdCAhPSBuZXdfc3RhdGUtPmZhdWx0IHx8Ci0JICAgICAgIGJxLT5zdGF0ZS5wb3dlcl9nb29kICE9IG5ld19zdGF0ZS0+cG93ZXJfZ29vZCk7Ci0JbXV0ZXhfdW5sb2NrKCZicS0+bG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1lbnVtIGJxMjQyNTdfbG9vcF9zdGF0dXMgewotCUxPT1BfU1RBVFVTX05PTkUsCi0JTE9PUF9TVEFUVVNfSU5fRFBNLAotCUxPT1BfU1RBVFVTX0lOX0NVUlJFTlRfTElNSVQsCi0JTE9PUF9TVEFUVVNfVEhFUk1BTCwKLX07Ci0KLWVudW0gYnEyNDI1N19pbl9pbGltaXQgewotCUlJTElNSVRfMTAwLAotCUlJTElNSVRfMTUwLAotCUlJTElNSVRfNTAwLAotCUlJTElNSVRfOTAwLAotCUlJTElNSVRfMTUwMCwKLQlJSUxJTUlUXzIwMDAsCi0JSUlMSU1JVF9FWFQsCi0JSUlMSU1JVF9OT05FLAotfTsKLQotZW51bSBicTI0MjU3X3ZvdnAgewotCVZPVlBfNjAwMCwKLQlWT1ZQXzY1MDAsCi0JVk9WUF83MDAwLAotCVZPVlBfODAwMCwKLQlWT1ZQXzkwMDAsCi0JVk9WUF85NTAwLAotCVZPVlBfMTAwMDAsCi0JVk9WUF8xMDUwMAotfTsKLQotZW51bSBicTI0MjU3X3ZpbmRwbSB7Ci0JVklORFBNXzQyMDAsCi0JVklORFBNXzQyODAsCi0JVklORFBNXzQzNjAsCi0JVklORFBNXzQ0NDAsCi0JVklORFBNXzQ1MjAsCi0JVklORFBNXzQ2MDAsCi0JVklORFBNXzQ2ODAsCi0JVklORFBNXzQ3NjAKLX07Ci0KLWVudW0gYnEyNDI1N19wb3J0X3R5cGUgewotCVBPUlRfVFlQRV9EQ1AsCQkvKiBEZWRpY2F0ZWQgQ2hhcmdpbmcgUG9ydCAqLwotCVBPUlRfVFlQRV9DRFAsCQkvKiBDaGFyZ2luZyBEb3duc3RyZWFtIFBvcnQgKi8KLQlQT1JUX1RZUEVfU0RQLAkJLyogU3RhbmRhcmQgRG93bnN0cmVhbSBQb3J0ICovCi0JUE9SVF9UWVBFX05PTl9TVEFOREFSRCwKLX07Ci0KLWVudW0gYnEyNDI1N19zYWZldHlfdGltZXIgewotCVNBRkVUWV9USU1FUl80NSwKLQlTQUZFVFlfVElNRVJfMzYwLAotCVNBRkVUWV9USU1FUl81NDAsCi0JU0FGRVRZX1RJTUVSX05PTkUsCi19OwotCi1zdGF0aWMgaW50IGJxMjQyNTdfaWlsaW1pdF9hdXRvc2V0KHN0cnVjdCBicTI0MjU3X2RldmljZSAqYnEpCi17Ci0JaW50IGxvb3Bfc3RhdHVzOwotCWludCBpaWxpbWl0OwotCWludCBwb3J0X3R5cGU7Ci0JaW50IHJldDsKLQljb25zdCB1OCBuZXdfaWlsaW1pdFtdID0gewotCQlbUE9SVF9UWVBFX0RDUF0gPSBJSUxJTUlUXzIwMDAsCi0JCVtQT1JUX1RZUEVfQ0RQXSA9IElJTElNSVRfMjAwMCwKLQkJW1BPUlRfVFlQRV9TRFBdID0gSUlMSU1JVF81MDAsCi0JCVtQT1JUX1RZUEVfTk9OX1NUQU5EQVJEXSA9IElJTElNSVRfNTAwCi0JfTsKLQotCXJldCA9IGJxMjQyNTdfZmllbGRfcmVhZChicSwgRl9MT09QX1NUQVRVUyk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLQlsb29wX3N0YXR1cyA9IHJldDsKLQotCXJldCA9IGJxMjQyNTdfZmllbGRfcmVhZChicSwgRl9JSUxJTUlUKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcjsKLQotCWlpbGltaXQgPSByZXQ7Ci0KLQkvKgotCSAqIEFsbCBVU0IgcG9ydHMgc2hvdWxkIGJlIGFibGUgdG8gaGFuZGxlIDUwMG1BLiBJZiBub3QsIERQTSB3aWxsIGxvd2VyCi0JICogdGhlIGNoYXJnaW5nIGN1cnJlbnQgdG8gYWNjb21tb2RhdGUgdGhlIHBvd2VyIHNvdXJjZS4gTm8gbmVlZCB0byBzZXQKLQkgKiBhIGxvd2VyIElJTElNSVQgdmFsdWUuCi0JICovCi0JaWYgKGxvb3Bfc3RhdHVzID09IExPT1BfU1RBVFVTX0lOX0RQTSAmJiBpaWxpbWl0ID09IElJTElNSVRfNTAwKQotCQlyZXR1cm4gMDsKLQotCXJldCA9IGJxMjQyNTdfZmllbGRfcmVhZChicSwgRl9VU0JfREVUKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcjsKLQotCXBvcnRfdHlwZSA9IHJldDsKLQotCXJldCA9IGJxMjQyNTdfZmllbGRfd3JpdGUoYnEsIEZfSUlMSU1JVCwgbmV3X2lpbGltaXRbcG9ydF90eXBlXSk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLQlyZXQgPSBicTI0MjU3X2ZpZWxkX3dyaXRlKGJxLCBGX1RNUiwgU0FGRVRZX1RJTUVSXzM2MCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLQlyZXQgPSBicTI0MjU3X2ZpZWxkX3dyaXRlKGJxLCBGX0NMUl9WRFAsIDEpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycm9yOwotCi0JZGV2X2RiZyhicS0+ZGV2LCAicG9ydC9sb29wID0gJWQvJWQgLT4gaWlsaW1pdCA9ICVkXG4iLAotCQlwb3J0X3R5cGUsIGxvb3Bfc3RhdHVzLCBuZXdfaWlsaW1pdFtwb3J0X3R5cGVdKTsKLQotCXJldHVybiAwOwotCi1lcnJvcjoKLQlkZXZfZXJyKGJxLT5kZXYsICIlczogRXJyb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBjaGlwLlxuIiwgX19mdW5jX18pOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGJxMjQyNTdfaWlsaW1pdF9zZXR1cF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgYnEyNDI1N19kZXZpY2UgKmJxID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBicTI0MjU3X2RldmljZSwKLQkJCQkJCSBpaWxpbWl0X3NldHVwX3dvcmsud29yayk7Ci0KLQlicTI0MjU3X2lpbGltaXRfYXV0b3NldChicSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJxMjQyNTdfaGFuZGxlX3N0YXRlX2NoYW5nZShzdHJ1Y3QgYnEyNDI1N19kZXZpY2UgKmJxLAotCQkJCQlzdHJ1Y3QgYnEyNDI1N19zdGF0ZSAqbmV3X3N0YXRlKQotewotCWludCByZXQ7Ci0Jc3RydWN0IGJxMjQyNTdfc3RhdGUgb2xkX3N0YXRlOwotCi0JbXV0ZXhfbG9jaygmYnEtPmxvY2spOwotCW9sZF9zdGF0ZSA9IGJxLT5zdGF0ZTsKLQltdXRleF91bmxvY2soJmJxLT5sb2NrKTsKLQotCS8qCi0JICogSGFuZGxlIEJRMjQyNXggc3RhdGUgY2hhbmdlcyBvYnNlcnZpbmcgd2hldGhlciB0aGUgRCsvRC0gYmFzZWQgaW5wdXQKLQkgKiBjdXJyZW50IGxpbWl0IGF1dG9zZXQgZnVuY3Rpb25hbGl0eSBpcyBlbmFibGVkLgotCSAqLwotCWlmICghbmV3X3N0YXRlLT5wb3dlcl9nb29kKSB7Ci0JCWRldl9kYmcoYnEtPmRldiwgIlBvd2VyIHJlbW92ZWRcbiIpOwotCQlpZiAoYnEtPmlpbGltaXRfYXV0b3NldF9lbmFibGUpIHsKLQkJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYnEtPmlpbGltaXRfc2V0dXBfd29yayk7Ci0KLQkJCS8qIGFjdGl2YXRlIEQrL0QtIHBvcnQgZGV0ZWN0aW9uIGFsZ29yaXRobSAqLwotCQkJcmV0ID0gYnEyNDI1N19maWVsZF93cml0ZShicSwgRl9EUERNX0VOLCAxKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJLyoKLQkJICogV2hlbiBwb3dlciBpcyByZW1vdmVkIGFsd2F5cyByZXR1cm4gdG8gdGhlIGRlZmF1bHQgaW5wdXQKLQkJICogY3VycmVudCBsaW1pdCBhcyBjb25maWd1cmVkIGR1cmluZyBwcm9iZS4KLQkJICovCi0JCXJldCA9IGJxMjQyNTdfZmllbGRfd3JpdGUoYnEsIEZfSUlMSU1JVCwgYnEtPmluaXRfZGF0YS5paWxpbWl0KTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGVycm9yOwotCX0gZWxzZSBpZiAoIW9sZF9zdGF0ZS5wb3dlcl9nb29kKSB7Ci0JCWRldl9kYmcoYnEtPmRldiwgIlBvd2VyIGluc2VydGVkXG4iKTsKLQotCQlpZiAoYnEtPmlpbGltaXRfYXV0b3NldF9lbmFibGUpCi0JCQkvKiBjb25maWd1cmUgaW5wdXQgY3VycmVudCBsaW1pdCAqLwotCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZicS0+aWlsaW1pdF9zZXR1cF93b3JrLAotCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoQlEyNDI1N19JTElNX1NFVF9ERUxBWSkpOwotCX0gZWxzZSBpZiAobmV3X3N0YXRlLT5mYXVsdCA9PSBGQVVMVF9OT19CQVQpIHsKLQkJZGV2X3dhcm4oYnEtPmRldiwgIkJhdHRlcnkgcmVtb3ZlZFxuIik7Ci0JfSBlbHNlIGlmIChuZXdfc3RhdGUtPmZhdWx0ID09IEZBVUxUX1RJTUVSKSB7Ci0JCWRldl9lcnIoYnEtPmRldiwgIlNhZmV0eSB0aW1lciBleHBpcmVkISBCYXR0ZXJ5IGRlYWQ/XG4iKTsKLQl9Ci0KLQlyZXR1cm47Ci0KLWVycm9yOgotCWRldl9lcnIoYnEtPmRldiwgIiVzOiBFcnJvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIGNoaXAuXG4iLCBfX2Z1bmNfXyk7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBicTI0MjU3X2lycV9oYW5kbGVyX3RocmVhZChpbnQgaXJxLCB2b2lkICpwcml2YXRlKQotewotCWludCByZXQ7Ci0Jc3RydWN0IGJxMjQyNTdfZGV2aWNlICpicSA9IHByaXZhdGU7Ci0Jc3RydWN0IGJxMjQyNTdfc3RhdGUgc3RhdGU7Ci0KLQlyZXQgPSBicTI0MjU3X2dldF9jaGlwX3N0YXRlKGJxLCAmc3RhdGUpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0KLQlpZiAoIWJxMjQyNTdfc3RhdGVfY2hhbmdlZChicSwgJnN0YXRlKSkKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCi0JZGV2X2RiZyhicS0+ZGV2LCAiaXJxKHN0YXRlIGNoYW5nZWQpOiBzdGF0dXMvZmF1bHQvcGcgPSAlZC8lZC8lZFxuIiwKLQkJc3RhdGUuc3RhdHVzLCBzdGF0ZS5mYXVsdCwgc3RhdGUucG93ZXJfZ29vZCk7Ci0KLQlicTI0MjU3X2hhbmRsZV9zdGF0ZV9jaGFuZ2UoYnEsICZzdGF0ZSk7Ci0KLQltdXRleF9sb2NrKCZicS0+bG9jayk7Ci0JYnEtPnN0YXRlID0gc3RhdGU7Ci0JbXV0ZXhfdW5sb2NrKCZicS0+bG9jayk7Ci0KLQlwb3dlcl9zdXBwbHlfY2hhbmdlZChicS0+Y2hhcmdlcik7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBpbnQgYnEyNDI1N19od19pbml0KHN0cnVjdCBicTI0MjU3X2RldmljZSAqYnEpCi17Ci0JaW50IHJldDsKLQlpbnQgaTsKLQlzdHJ1Y3QgYnEyNDI1N19zdGF0ZSBzdGF0ZTsKLQotCWNvbnN0IHN0cnVjdCB7Ci0JCWludCBmaWVsZDsKLQkJdTMyIHZhbHVlOwotCX0gaW5pdF9kYXRhW10gPSB7Ci0JCXtGX0lDSEcsIGJxLT5pbml0X2RhdGEuaWNoZ30sCi0JCXtGX1ZCQVQsIGJxLT5pbml0X2RhdGEudmJhdH0sCi0JCXtGX0lURVJNLCBicS0+aW5pdF9kYXRhLml0ZXJtfSwKLQkJe0ZfVk9WUCwgYnEtPmluaXRfZGF0YS52b3ZwfSwKLQkJe0ZfVklORFBNLCBicS0+aW5pdF9kYXRhLnZpbmRwbX0sCi0JfTsKLQotCS8qCi0JICogRGlzYWJsZSB0aGUgd2F0Y2hkb2cgdGltZXIgdG8gcHJldmVudCB0aGUgSUMgZnJvbSBnb2luZyBiYWNrIHRvCi0JICogZGVmYXVsdCBzZXR0aW5ncyBhZnRlciA1MCBzZWNvbmRzIG9mIEkyQyBpbmFjdGl2aXR5LgotCSAqLwotCXJldCA9IGJxMjQyNTdfZmllbGRfd3JpdGUoYnEsIEZfV0RfRU4sIDApOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JLyogY29uZmlndXJlIHRoZSBjaGFyZ2UgY3VycmVudHMgYW5kIHZvbHRhZ2VzICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW5pdF9kYXRhKTsgaSsrKSB7Ci0JCXJldCA9IGJxMjQyNTdfZmllbGRfd3JpdGUoYnEsIGluaXRfZGF0YVtpXS5maWVsZCwKLQkJCQkJICBpbml0X2RhdGFbaV0udmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gYnEyNDI1N19nZXRfY2hpcF9zdGF0ZShicSwgJnN0YXRlKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCW11dGV4X2xvY2soJmJxLT5sb2NrKTsKLQlicS0+c3RhdGUgPSBzdGF0ZTsKLQltdXRleF91bmxvY2soJmJxLT5sb2NrKTsKLQotCWlmICghYnEtPmlpbGltaXRfYXV0b3NldF9lbmFibGUpIHsKLQkJZGV2X2RiZyhicS0+ZGV2LCAibWFudWFsbHkgc2V0dGluZyBpaWxpbWl0ID0gJXVcbiIsCi0JCQlicS0+aW5pdF9kYXRhLmlpbGltaXQpOwotCi0JCS8qIHByb2dyYW0gZml4ZWQgaW5wdXQgY3VycmVudCBsaW1pdCAqLwotCQlyZXQgPSBicTI0MjU3X2ZpZWxkX3dyaXRlKGJxLCBGX0lJTElNSVQsCi0JCQkJCSAgYnEtPmluaXRfZGF0YS5paWxpbWl0KTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCX0gZWxzZSBpZiAoIXN0YXRlLnBvd2VyX2dvb2QpCi0JCS8qIGFjdGl2YXRlIEQrL0QtIGRldGVjdGlvbiBhbGdvcml0aG0gKi8KLQkJcmV0ID0gYnEyNDI1N19maWVsZF93cml0ZShicSwgRl9EUERNX0VOLCAxKTsKLQllbHNlIGlmIChzdGF0ZS5mYXVsdCAhPSBGQVVMVF9OT19CQVQpCi0JCXJldCA9IGJxMjQyNTdfaWlsaW1pdF9hdXRvc2V0KGJxKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBicTI0MjU3X3Bvd2VyX3N1cHBseV9wcm9wc1tdID0gewotCVBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUiwKLQlQT1dFUl9TVVBQTFlfUFJPUF9NT0RFTF9OQU1FLAotCVBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywKLQlQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUsCi0JUE9XRVJfU1VQUExZX1BST1BfSEVBTFRILAotCVBPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9DVVJSRU5ULAotCVBPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9DVVJSRU5UX01BWCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfVk9MVEFHRSwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfVk9MVEFHRV9NQVgsCi0JUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX1RFUk1fQ1VSUkVOVCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9JTlBVVF9DVVJSRU5UX0xJTUlULAotfTsKLQotc3RhdGljIGNoYXIgKmJxMjQyNTdfY2hhcmdlcl9zdXBwbGllZF90b1tdID0gewotCSJtYWluLWJhdHRlcnkiLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBicTI0MjU3X3Bvd2VyX3N1cHBseV9kZXNjID0gewotCS5uYW1lID0gImJxMjQyNTctY2hhcmdlciIsCi0JLnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9VU0IsCi0JLnByb3BlcnRpZXMgPSBicTI0MjU3X3Bvd2VyX3N1cHBseV9wcm9wcywKLQkubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKGJxMjQyNTdfcG93ZXJfc3VwcGx5X3Byb3BzKSwKLQkuZ2V0X3Byb3BlcnR5ID0gYnEyNDI1N19wb3dlcl9zdXBwbHlfZ2V0X3Byb3BlcnR5LAotCS5zZXRfcHJvcGVydHkgPSBicTI0MjU3X3Bvd2VyX3N1cHBseV9zZXRfcHJvcGVydHksCi0JLnByb3BlcnR5X2lzX3dyaXRlYWJsZSA9IGJxMjQyNTdfcG93ZXJfc3VwcGx5X3Byb3BlcnR5X2lzX3dyaXRlYWJsZSwKLX07Ci0KLXN0YXRpYyBzc2l6ZV90IGJxMjQyNTdfc2hvd19vdnBfdm9sdGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCQljaGFyICpidWYpCi17Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGJxMjQyNTdfZGV2aWNlICpicSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwotCi0JcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLAotCQkJIGJxMjQyNTdfdm92cF9tYXBbYnEtPmluaXRfZGF0YS52b3ZwXSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGJxMjQyNTdfc2hvd19pbl9kcG1fdm9sdGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCQkgICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGJxMjQyNTdfZGV2aWNlICpicSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwotCi0JcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLAotCQkJIGJxMjQyNTdfdmluZHBtX21hcFticS0+aW5pdF9kYXRhLnZpbmRwbV0pOwotfQotCi1zdGF0aWMgc3NpemVfdCBicTI0MjU3X3N5c2ZzX3Nob3dfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCQkgY2hhciAqYnVmKQotewotCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBicTI0MjU3X2RldmljZSAqYnEgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKLQlpbnQgcmV0OwotCi0JaWYgKHN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJoaWdoX2ltcGVkYW5jZV9lbmFibGUiKSA9PSAwKQotCQlyZXQgPSBicTI0MjU3X2ZpZWxkX3JlYWQoYnEsIEZfSFpfTU9ERSk7Ci0JZWxzZSBpZiAoc3RyY21wKGF0dHItPmF0dHIubmFtZSwgInN5c29mZl9lbmFibGUiKSA9PSAwKQotCQlyZXQgPSBicTI0MjU3X2ZpZWxkX3JlYWQoYnEsIEZfU1lTT0ZGKTsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHJldCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGJxMjQyNTdfc3lzZnNfc2V0X2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCQljb25zdCBjaGFyICpidWYsCi0JCQkJCXNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYnEyNDI1N19kZXZpY2UgKmJxID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7Ci0JbG9uZyB2YWw7Ci0JaW50IHJldDsKLQotCWlmIChrc3RydG9sKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoc3RyY21wKGF0dHItPmF0dHIubmFtZSwgImhpZ2hfaW1wZWRhbmNlX2VuYWJsZSIpID09IDApCi0JCXJldCA9IGJxMjQyNTdfZmllbGRfd3JpdGUoYnEsIEZfSFpfTU9ERSwgKGJvb2wpdmFsKTsKLQllbHNlIGlmIChzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAic3lzb2ZmX2VuYWJsZSIpID09IDApCi0JCXJldCA9IGJxMjQyNTdfZmllbGRfd3JpdGUoYnEsIEZfU1lTT0ZGLCAoYm9vbCl2YWwpOwotCWVsc2UKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKG92cF92b2x0YWdlLCBTX0lSVUdPLCBicTI0MjU3X3Nob3dfb3ZwX3ZvbHRhZ2UsIE5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKGluX2RwbV92b2x0YWdlLCBTX0lSVUdPLCBicTI0MjU3X3Nob3dfaW5fZHBtX3ZvbHRhZ2UsIE5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKGhpZ2hfaW1wZWRhbmNlX2VuYWJsZSwgU19JV1VTUiB8IFNfSVJVR08sCi0JCSAgIGJxMjQyNTdfc3lzZnNfc2hvd19lbmFibGUsIGJxMjQyNTdfc3lzZnNfc2V0X2VuYWJsZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoc3lzb2ZmX2VuYWJsZSwgU19JV1VTUiB8IFNfSVJVR08sCi0JCSAgIGJxMjQyNTdfc3lzZnNfc2hvd19lbmFibGUsIGJxMjQyNTdfc3lzZnNfc2V0X2VuYWJsZSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpicTI0MjU3X2NoYXJnZXJfYXR0cltdID0gewotCSZkZXZfYXR0cl9vdnBfdm9sdGFnZS5hdHRyLAotCSZkZXZfYXR0cl9pbl9kcG1fdm9sdGFnZS5hdHRyLAotCSZkZXZfYXR0cl9oaWdoX2ltcGVkYW5jZV9lbmFibGUuYXR0ciwKLQkmZGV2X2F0dHJfc3lzb2ZmX2VuYWJsZS5hdHRyLAotCU5VTEwsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBicTI0MjU3X2F0dHJfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gYnEyNDI1N19jaGFyZ2VyX2F0dHIsCi19OwotCi1zdGF0aWMgaW50IGJxMjQyNTdfcG93ZXJfc3VwcGx5X2luaXQoc3RydWN0IGJxMjQyNTdfZGV2aWNlICpicSkKLXsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0geyAuZHJ2X2RhdGEgPSBicSwgfTsKLQotCXBzeV9jZmcuc3VwcGxpZWRfdG8gPSBicTI0MjU3X2NoYXJnZXJfc3VwcGxpZWRfdG87Ci0JcHN5X2NmZy5udW1fc3VwcGxpY2FudHMgPSBBUlJBWV9TSVpFKGJxMjQyNTdfY2hhcmdlcl9zdXBwbGllZF90byk7Ci0KLQlicS0+Y2hhcmdlciA9IGRldm1fcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKGJxLT5kZXYsCi0JCQkJCQkgJmJxMjQyNTdfcG93ZXJfc3VwcGx5X2Rlc2MsCi0JCQkJCQkgJnBzeV9jZmcpOwotCi0JcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhicS0+Y2hhcmdlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGJxMjQyNTdfcGdfZ3Bpb19wcm9iZShzdHJ1Y3QgYnEyNDI1N19kZXZpY2UgKmJxKQotewotCWJxLT5wZyA9IGRldm1fZ3Bpb2RfZ2V0X29wdGlvbmFsKGJxLT5kZXYsIEJRMjQyNTdfUEdfR1BJTywgR1BJT0RfSU4pOwotCi0JaWYgKFBUUl9FUlIoYnEtPnBnKSA9PSAtRVBST0JFX0RFRkVSKSB7Ci0JCWRldl9pbmZvKGJxLT5kZXYsICJwcm9iZSByZXRyeSByZXF1ZXN0ZWQgZm9yIFBHIHBpblxuIik7Ci0JCXJldHVybjsKLQl9IGVsc2UgaWYgKElTX0VSUihicS0+cGcpKSB7Ci0JCWRldl9lcnIoYnEtPmRldiwgImVycm9yIHByb2JpbmcgUEcgcGluXG4iKTsKLQkJYnEtPnBnID0gTlVMTDsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChicS0+cGcpCi0JCWRldl9kYmcoYnEtPmRldiwgInByb2JlZCBQRyBwaW4gPSAlZFxuIiwgZGVzY190b19ncGlvKGJxLT5wZykpOwotfQotCi1zdGF0aWMgaW50IGJxMjQyNTdfZndfcHJvYmUoc3RydWN0IGJxMjQyNTdfZGV2aWNlICpicSkKLXsKLQlpbnQgcmV0OwotCXUzMiBwcm9wZXJ0eTsKLQotCS8qIFJlcXVpcmVkIHByb3BlcnRpZXMgKi8KLQlyZXQgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIoYnEtPmRldiwgInRpLGNoYXJnZS1jdXJyZW50IiwgJnByb3BlcnR5KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWJxLT5pbml0X2RhdGEuaWNoZyA9IGJxMjQyNTdfZmluZF9pZHgocHJvcGVydHksIGJxMjQyNTdfaWNoZ19tYXAsCi0JCQkJCSAgICAgIEJRMjQyNTdfSUNIR19NQVBfU0laRSk7Ci0KLQlyZXQgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIoYnEtPmRldiwgInRpLGJhdHRlcnktcmVndWxhdGlvbi12b2x0YWdlIiwKLQkJCQkgICAgICAgJnByb3BlcnR5KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWJxLT5pbml0X2RhdGEudmJhdCA9IGJxMjQyNTdfZmluZF9pZHgocHJvcGVydHksIGJxMjQyNTdfdmJhdF9tYXAsCi0JCQkJCSAgICAgIEJRMjQyNTdfVkJBVF9NQVBfU0laRSk7Ci0KLQlyZXQgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIoYnEtPmRldiwgInRpLHRlcm1pbmF0aW9uLWN1cnJlbnQiLAotCQkJCSAgICAgICAmcHJvcGVydHkpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JYnEtPmluaXRfZGF0YS5pdGVybSA9IGJxMjQyNTdfZmluZF9pZHgocHJvcGVydHksIGJxMjQyNTdfaXRlcm1fbWFwLAotCQkJCQkgICAgICAgQlEyNDI1N19JVEVSTV9NQVBfU0laRSk7Ci0KLQkvKiBPcHRpb25hbCBwcm9wZXJ0aWVzLiBJZiBub3QgcHJvdmlkZWQgdXNlIHJlYXNvbmFibGUgZGVmYXVsdC4gKi8KLQlyZXQgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIoYnEtPmRldiwgInRpLGN1cnJlbnQtbGltaXQiLAotCQkJCSAgICAgICAmcHJvcGVydHkpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWJxLT5paWxpbWl0X2F1dG9zZXRfZW5hYmxlID0gdHJ1ZTsKLQotCQkvKgotCQkgKiBFeHBsaWNpdGx5IHNldCBhIGRlZmF1bHQgdmFsdWUgd2hpY2ggd2lsbCBiZSBuZWVkZWQgZm9yCi0JCSAqIGRldmljZXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZSBhdXRvbWF0aWMgc2V0dGluZyBvZiB0aGUgaW5wdXQKLQkJICogY3VycmVudCBsaW1pdCB0aHJvdWdoIHRoZSBjaGFyZ2VyIHR5cGUgZGV0ZWN0aW9uIG1lY2hhbmlzbS4KLQkJICovCi0JCWJxLT5pbml0X2RhdGEuaWlsaW1pdCA9IElJTElNSVRfNTAwOwotCX0gZWxzZQotCQlicS0+aW5pdF9kYXRhLmlpbGltaXQgPQotCQkJCWJxMjQyNTdfZmluZF9pZHgocHJvcGVydHksCi0JCQkJCQkgYnEyNDI1N19paWxpbWl0X21hcCwKLQkJCQkJCSBCUTI0MjU3X0lJTElNSVRfTUFQX1NJWkUpOwotCi0JcmV0ID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKGJxLT5kZXYsICJ0aSxvdnAtdm9sdGFnZSIsCi0JCQkJICAgICAgICZwcm9wZXJ0eSk7Ci0JaWYgKHJldCA8IDApCi0JCWJxLT5pbml0X2RhdGEudm92cCA9IFZPVlBfNjUwMDsKLQllbHNlCi0JCWJxLT5pbml0X2RhdGEudm92cCA9IGJxMjQyNTdfZmluZF9pZHgocHJvcGVydHksCi0JCQkJCQkgICAgICBicTI0MjU3X3ZvdnBfbWFwLAotCQkJCQkJICAgICAgQlEyNDI1N19WT1ZQX01BUF9TSVpFKTsKLQotCXJldCA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMihicS0+ZGV2LCAidGksaW4tZHBtLXZvbHRhZ2UiLAotCQkJCSAgICAgICAmcHJvcGVydHkpOwotCWlmIChyZXQgPCAwKQotCQlicS0+aW5pdF9kYXRhLnZpbmRwbSA9IFZJTkRQTV80MzYwOwotCWVsc2UKLQkJYnEtPmluaXRfZGF0YS52aW5kcG0gPQotCQkJCWJxMjQyNTdfZmluZF9pZHgocHJvcGVydHksCi0JCQkJCQkgYnEyNDI1N192aW5kcG1fbWFwLAotCQkJCQkJIEJRMjQyNTdfVklORFBNX01BUF9TSVpFKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJxMjQyNTdfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCi17Ci0Jc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gdG9faTJjX2FkYXB0ZXIoY2xpZW50LT5kZXYucGFyZW50KTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7Ci0JY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkICphY3BpX2lkOwotCXN0cnVjdCBicTI0MjU3X2RldmljZSAqYnE7Ci0JaW50IHJldDsKLQlpbnQgaTsKLQotCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkgewotCQlkZXZfZXJyKGRldiwgIk5vIHN1cHBvcnQgZm9yIFNNQlVTX0JZVEVfREFUQVxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWJxID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpicSksIEdGUF9LRVJORUwpOwotCWlmICghYnEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JYnEtPmNsaWVudCA9IGNsaWVudDsKLQlicS0+ZGV2ID0gZGV2OwotCi0JaWYgKEFDUElfSEFORExFKGRldikpIHsKLQkJYWNwaV9pZCA9IGFjcGlfbWF0Y2hfZGV2aWNlKGRldi0+ZHJpdmVyLT5hY3BpX21hdGNoX3RhYmxlLAotCQkJCQkgICAgJmNsaWVudC0+ZGV2KTsKLQkJaWYgKCFhY3BpX2lkKSB7Ci0JCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBtYXRjaCBBQ1BJIGRldmljZVxuIik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCQlicS0+Y2hpcCA9IChlbnVtIGJxMjQyNXhfY2hpcClhY3BpX2lkLT5kcml2ZXJfZGF0YTsKLQl9IGVsc2UgewotCQlicS0+Y2hpcCA9IChlbnVtIGJxMjQyNXhfY2hpcClpZC0+ZHJpdmVyX2RhdGE7Ci0JfQotCi0JbXV0ZXhfaW5pdCgmYnEtPmxvY2spOwotCi0JYnEtPnJtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZicTI0MjU3X3JlZ21hcF9jb25maWcpOwotCWlmIChJU19FUlIoYnEtPnJtYXApKSB7Ci0JCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIHJlZ2lzdGVyIG1hcFxuIik7Ci0JCXJldHVybiBQVFJfRVJSKGJxLT5ybWFwKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShicTI0MjU3X3JlZ19maWVsZHMpOyBpKyspIHsKLQkJY29uc3Qgc3RydWN0IHJlZ19maWVsZCAqcmVnX2ZpZWxkcyA9IGJxMjQyNTdfcmVnX2ZpZWxkczsKLQotCQlicS0+cm1hcF9maWVsZHNbaV0gPSBkZXZtX3JlZ21hcF9maWVsZF9hbGxvYyhkZXYsIGJxLT5ybWFwLAotCQkJCQkJCSAgICAgcmVnX2ZpZWxkc1tpXSk7Ci0JCWlmIChJU19FUlIoYnEtPnJtYXBfZmllbGRzW2ldKSkgewotCQkJZGV2X2VycihkZXYsICJjYW5ub3QgYWxsb2NhdGUgcmVnbWFwIGZpZWxkXG4iKTsKLQkJCXJldHVybiBQVFJfRVJSKGJxLT5ybWFwX2ZpZWxkc1tpXSk7Ci0JCX0KLQl9Ci0KLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBicSk7Ci0KLQlpZiAoIWRldi0+cGxhdGZvcm1fZGF0YSkgewotCQlyZXQgPSBicTI0MjU3X2Z3X3Byb2JlKGJxKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoZGV2LCAiQ2Fubm90IHJlYWQgZGV2aWNlIHByb3BlcnRpZXMuXG4iKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9IGVsc2UgewotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQkvKgotCSAqIFRoZSBCUTI0MjUwIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgRCsvRC0gYmFzZWQgY2hhcmdlciB0eXBlIGRldGVjdGlvbgotCSAqIHVzZWQgZm9yIHRoZSBhdXRvbWF0aWMgc2V0dGluZyBvZiB0aGUgaW5wdXQgY3VycmVudCBsaW1pdCBzZXR0aW5nIHNvCi0JICogZXhwbGljaXRseSBkaXNhYmxlIHRoYXQgZmVhdHVyZS4KLQkgKi8KLQlpZiAoYnEtPmNoaXAgPT0gQlEyNDI1MCkKLQkJYnEtPmlpbGltaXRfYXV0b3NldF9lbmFibGUgPSBmYWxzZTsKLQotCWlmIChicS0+aWlsaW1pdF9hdXRvc2V0X2VuYWJsZSkKLQkJSU5JVF9ERUxBWUVEX1dPUksoJmJxLT5paWxpbWl0X3NldHVwX3dvcmssCi0JCQkJICBicTI0MjU3X2lpbGltaXRfc2V0dXBfd29yayk7Ci0KLQkvKgotCSAqIFRoZSBCUTI0MjUwIGRvZXNuJ3QgaGF2ZSBhIGRlZGljYXRlZCBQb3dlciBHb29kIChQRykgcGluIHNvIGxldCdzCi0JICogbm90IHByb2JlIGZvciBpdCBhbmQgaW5zdGVhZCB1c2UgYSBTVy1iYXNlZCBhcHByb2FjaCB0byBkZXRlcm1pbmUKLQkgKiB0aGUgUEcgc3RhdGUuIFdlIGFsc28gdXNlIGEgU1ctYmFzZWQgYXBwcm9hY2ggZm9yIGFsbCBvdGhlciBkZXZpY2VzCi0JICogaWYgdGhlIFBHIHBpbiBpcyBlaXRoZXIgbm90IGRlZmluZWQgb3IgY2FuJ3QgYmUgcHJvYmVkLgotCSAqLwotCWlmIChicS0+Y2hpcCAhPSBCUTI0MjUwKQotCQlicTI0MjU3X3BnX2dwaW9fcHJvYmUoYnEpOwotCi0JaWYgKFBUUl9FUlIoYnEtPnBnKSA9PSAtRVBST0JFX0RFRkVSKQotCQlyZXR1cm4gUFRSX0VSUihicS0+cGcpOwotCWVsc2UgaWYgKCFicS0+cGcpCi0JCWRldl9pbmZvKGJxLT5kZXYsICJ1c2luZyBTVy1iYXNlZCBwb3dlci1nb29kIGRldGVjdGlvblxuIik7Ci0KLQkvKiByZXNldCBhbGwgcmVnaXN0ZXJzIHRvIGRlZmF1bHRzICovCi0JcmV0ID0gYnEyNDI1N19maWVsZF93cml0ZShicSwgRl9SRVNFVCwgMSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQkvKgotCSAqIFB1dCB0aGUgUkVTRVQgYml0IGJhY2sgdG8gMCwgaW4gY2FjaGUuIEZvciBzb21lIHJlYXNvbiB0aGUgSFcgYWx3YXlzCi0JICogcmV0dXJucyAxIG9uIHRoaXMgYml0LCBzbyB0aGlzIGlzIHRoZSBvbmx5IHdheSB0byBhdm9pZCByZXNldHRpbmcgdGhlCi0JICogY2hpcCBldmVyeSB0aW1lIHdlIHVwZGF0ZSBhbm90aGVyIGZpZWxkIGluIHRoaXMgcmVnaXN0ZXIuCi0JICovCi0JcmV0ID0gYnEyNDI1N19maWVsZF93cml0ZShicSwgRl9SRVNFVCwgMCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBicTI0MjU3X2h3X2luaXQoYnEpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoZGV2LCAiQ2Fubm90IGluaXRpYWxpemUgdGhlIGNoaXAuXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKGRldiwgY2xpZW50LT5pcnEsIE5VTEwsCi0JCQkJCWJxMjQyNTdfaXJxX2hhbmRsZXJfdGhyZWFkLAotCQkJCQlJUlFGX1RSSUdHRVJfRkFMTElORyB8Ci0JCQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX09ORVNIT1QsCi0JCQkJCWJxMjQyNXhfY2hpcF9uYW1lW2JxLT5jaGlwXSwgYnEpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBJUlEgIyVkXG4iLCBjbGllbnQtPmlycSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gYnEyNDI1N19wb3dlcl9zdXBwbHlfaW5pdChicSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgcG93ZXIgc3VwcGx5XG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmJxLT5jaGFyZ2VyLT5kZXYua29iaiwgJmJxMjQyNTdfYXR0cl9ncm91cCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihkZXYsICJDYW4ndCBjcmVhdGUgc3lzZnMgZW50cmllc1xuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYnEyNDI1N19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgYnEyNDI1N19kZXZpY2UgKmJxID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KLQlpZiAoYnEtPmlpbGltaXRfYXV0b3NldF9lbmFibGUpCi0JCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYnEtPmlpbGltaXRfc2V0dXBfd29yayk7Ci0KLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmJxLT5jaGFyZ2VyLT5kZXYua29iaiwgJmJxMjQyNTdfYXR0cl9ncm91cCk7Ci0KLQlicTI0MjU3X2ZpZWxkX3dyaXRlKGJxLCBGX1JFU0VULCAxKTsgLyogcmVzZXQgdG8gZGVmYXVsdHMgKi8KLQotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX1BNX1NMRUVQCi1zdGF0aWMgaW50IGJxMjQyNTdfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGJxMjQyNTdfZGV2aWNlICpicSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCByZXQgPSAwOwotCi0JaWYgKGJxLT5paWxpbWl0X2F1dG9zZXRfZW5hYmxlKQotCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmJxLT5paWxpbWl0X3NldHVwX3dvcmspOwotCi0JLyogcmVzZXQgYWxsIHJlZ2lzdGVycyB0byBkZWZhdWx0IChhbmQgYWN0aXZhdGUgc3RhbmRhbG9uZSBtb2RlKSAqLwotCXJldCA9IGJxMjQyNTdfZmllbGRfd3JpdGUoYnEsIEZfUkVTRVQsIDEpOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKGJxLT5kZXYsICJDYW5ub3QgcmVzZXQgY2hpcCB0byBzdGFuZGFsb25lIG1vZGUuXG4iKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYnEyNDI1N19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQotewotCWludCByZXQ7Ci0Jc3RydWN0IGJxMjQyNTdfZGV2aWNlICpicSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JcmV0ID0gcmVnY2FjaGVfZHJvcF9yZWdpb24oYnEtPnJtYXAsIEJRMjQyNTdfUkVHXzEsIEJRMjQyNTdfUkVHXzcpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gYnEyNDI1N19maWVsZF93cml0ZShicSwgRl9SRVNFVCwgMCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBicTI0MjU3X2h3X2luaXQoYnEpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoYnEtPmRldiwgIkNhbm5vdCBpbml0IGNoaXAgYWZ0ZXIgcmVzdW1lLlxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogc2lnbmFsIHVzZXJzcGFjZSwgbWF5YmUgc3RhdGUgY2hhbmdlZCB3aGlsZSBzdXNwZW5kZWQgKi8KLQlwb3dlcl9zdXBwbHlfY2hhbmdlZChicS0+Y2hhcmdlcik7Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgYnEyNDI1N19wbSA9IHsKLQlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhicTI0MjU3X3N1c3BlbmQsIGJxMjQyNTdfcmVzdW1lKQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGJxMjQyNTdfaTJjX2lkc1tdID0gewotCXsgImJxMjQyNTAiLCBCUTI0MjUwIH0sCi0JeyAiYnEyNDI1MSIsIEJRMjQyNTEgfSwKLQl7ICJicTI0MjU3IiwgQlEyNDI1NyB9LAotCXt9LAotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBicTI0MjU3X2kyY19pZHMpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBicTI0MjU3X29mX21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJ0aSxicTI0MjUwIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gInRpLGJxMjQyNTEiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAidGksYnEyNDI1NyIsIH0sCi0JeyB9LAotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGJxMjQyNTdfb2ZfbWF0Y2gpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIGJxMjQyNTdfYWNwaV9tYXRjaFtdID0gewotCXsgIkJRMjQyNTAwIiwgQlEyNDI1MCB9LAotCXsgIkJRMjQyNTEwIiwgQlEyNDI1MSB9LAotCXsgIkJRMjQyNTcwIiwgQlEyNDI1NyB9LAotCXt9LAotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUoYWNwaSwgYnEyNDI1N19hY3BpX21hdGNoKTsKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGJxMjQyNTdfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImJxMjQyNTctY2hhcmdlciIsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihicTI0MjU3X29mX21hdGNoKSwKLQkJLmFjcGlfbWF0Y2hfdGFibGUgPSBBQ1BJX1BUUihicTI0MjU3X2FjcGlfbWF0Y2gpLAotCQkucG0gPSAmYnEyNDI1N19wbSwKLQl9LAotCS5wcm9iZSA9IGJxMjQyNTdfcHJvYmUsCi0JLnJlbW92ZSA9IGJxMjQyNTdfcmVtb3ZlLAotCS5pZF90YWJsZSA9IGJxMjQyNTdfaTJjX2lkcywKLX07Ci1tb2R1bGVfaTJjX2RyaXZlcihicTI0MjU3X2RyaXZlcik7Ci0KLU1PRFVMRV9BVVRIT1IoIkxhdXJlbnRpdSBQYWxjdSA8bGF1cmVudGl1LnBhbGN1QGludGVsLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiYnEyNDI1NyBjaGFyZ2VyIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9icTI0NzM1LWNoYXJnZXIuYyBiL2RyaXZlcnMvcG93ZXIvYnEyNDczNS1jaGFyZ2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNDU0YzEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9wb3dlci9icTI0NzM1LWNoYXJnZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDUwMCArMCwwIEBACi0vKgotICogQmF0dGVyeSBjaGFyZ2VyIGRyaXZlciBmb3IgVEkgQlEyNDczNQotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMywgTlZJRElBIENPUlBPUkFUSU9OLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9wb3dlci9icTI0NzM1LWNoYXJnZXIuaD4KLQotI2RlZmluZSBCUTI0NzM1X0NIR19PUFQJCQkweDEyCi0jZGVmaW5lIEJRMjQ3MzVfQ0hHX09QVF9DSEFSR0VfRElTQUJMRQkoMSA8PCAwKQotI2RlZmluZSBCUTI0NzM1X0NIR19PUFRfQUNfUFJFU0VOVAkoMSA8PCA0KQotI2RlZmluZSBCUTI0NzM1X0NIQVJHRV9DVVJSRU5UCQkweDE0Ci0jZGVmaW5lIEJRMjQ3MzVfQ0hBUkdFX0NVUlJFTlRfTUFTSwkweDFmYzAKLSNkZWZpbmUgQlEyNDczNV9DSEFSR0VfVk9MVEFHRQkJMHgxNQotI2RlZmluZSBCUTI0NzM1X0NIQVJHRV9WT0xUQUdFX01BU0sJMHg3ZmYwCi0jZGVmaW5lIEJRMjQ3MzVfSU5QVVRfQ1VSUkVOVAkJMHgzZgotI2RlZmluZSBCUTI0NzM1X0lOUFVUX0NVUlJFTlRfTUFTSwkweDFmODAKLSNkZWZpbmUgQlEyNDczNV9NQU5VRkFDVFVSRVJfSUQJCTB4ZmUKLSNkZWZpbmUgQlEyNDczNV9ERVZJQ0VfSUQJCTB4ZmYKLQotc3RydWN0IGJxMjQ3MzUgewotCXN0cnVjdCBwb3dlcl9zdXBwbHkJCSpjaGFyZ2VyOwotCXN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYwljaGFyZ2VyX2Rlc2M7Ci0Jc3RydWN0IGkyY19jbGllbnQJCSpjbGllbnQ7Ci0Jc3RydWN0IGJxMjQ3MzVfcGxhdGZvcm0JCSpwZGF0YTsKLQlzdHJ1Y3QgbXV0ZXgJCQlsb2NrOwotCWJvb2wJCQkJY2hhcmdpbmc7Ci19OwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBicTI0NzM1ICp0b19icTI0NzM1KHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSkKLXsKLQlyZXR1cm4gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7Ci19Ci0KLXN0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBicTI0NzM1X2NoYXJnZXJfcHJvcGVydGllc1tdID0gewotCVBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywKLQlQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUsCi19OwotCi1zdGF0aWMgaW50IGJxMjQ3MzVfY2hhcmdlcl9wcm9wZXJ0eV9pc193cml0ZWFibGUoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAotCQkJCQkJIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCkKLXsKLQlzd2l0Y2ggKHBzcCkgewotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgotCQlyZXR1cm4gMTsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYnEyNDczNV93cml0ZV93b3JkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywKLQkJCQkgICAgIHUxNiB2YWx1ZSkKLXsKLQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHJlZywgbGUxNl90b19jcHUodmFsdWUpKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYnEyNDczNV9yZWFkX3dvcmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQotewotCXMzMiByZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCByZWcpOwotCi0JcmV0dXJuIHJldCA8IDAgPyByZXQgOiBsZTE2X3RvX2NwdShyZXQpOwotfQotCi1zdGF0aWMgaW50IGJxMjQ3MzVfdXBkYXRlX3dvcmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLAotCQkJICAgICAgIHUxNiBtYXNrLCB1MTYgdmFsdWUpCi17Ci0JdW5zaWduZWQgaW50IHRtcDsKLQlpbnQgcmV0OwotCi0JcmV0ID0gYnEyNDczNV9yZWFkX3dvcmQoY2xpZW50LCByZWcpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JdG1wID0gcmV0ICYgfm1hc2s7Ci0JdG1wIHw9IHZhbHVlICYgbWFzazsKLQotCXJldHVybiBicTI0NzM1X3dyaXRlX3dvcmQoY2xpZW50LCByZWcsIHRtcCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGJxMjQ3MzVfZW5hYmxlX2NoYXJnaW5nKHN0cnVjdCBicTI0NzM1ICpjaGFyZ2VyKQotewotCWlmIChjaGFyZ2VyLT5wZGF0YS0+ZXh0X2NvbnRyb2wpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIGJxMjQ3MzVfdXBkYXRlX3dvcmQoY2hhcmdlci0+Y2xpZW50LCBCUTI0NzM1X0NIR19PUFQsCi0JCQkJICAgQlEyNDczNV9DSEdfT1BUX0NIQVJHRV9ESVNBQkxFLAotCQkJCSAgIH5CUTI0NzM1X0NIR19PUFRfQ0hBUkdFX0RJU0FCTEUpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBicTI0NzM1X2Rpc2FibGVfY2hhcmdpbmcoc3RydWN0IGJxMjQ3MzUgKmNoYXJnZXIpCi17Ci0JaWYgKGNoYXJnZXItPnBkYXRhLT5leHRfY29udHJvbCkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gYnEyNDczNV91cGRhdGVfd29yZChjaGFyZ2VyLT5jbGllbnQsIEJRMjQ3MzVfQ0hHX09QVCwKLQkJCQkgICBCUTI0NzM1X0NIR19PUFRfQ0hBUkdFX0RJU0FCTEUsCi0JCQkJICAgQlEyNDczNV9DSEdfT1BUX0NIQVJHRV9ESVNBQkxFKTsKLX0KLQotc3RhdGljIGludCBicTI0NzM1X2NvbmZpZ19jaGFyZ2VyKHN0cnVjdCBicTI0NzM1ICpjaGFyZ2VyKQotewotCXN0cnVjdCBicTI0NzM1X3BsYXRmb3JtICpwZGF0YSA9IGNoYXJnZXItPnBkYXRhOwotCWludCByZXQ7Ci0JdTE2IHZhbHVlOwotCi0JaWYgKHBkYXRhLT5leHRfY29udHJvbCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAocGRhdGEtPmNoYXJnZV9jdXJyZW50KSB7Ci0JCXZhbHVlID0gcGRhdGEtPmNoYXJnZV9jdXJyZW50ICYgQlEyNDczNV9DSEFSR0VfQ1VSUkVOVF9NQVNLOwotCi0JCXJldCA9IGJxMjQ3MzVfd3JpdGVfd29yZChjaGFyZ2VyLT5jbGllbnQsCi0JCQkJCSBCUTI0NzM1X0NIQVJHRV9DVVJSRU5ULCB2YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKCZjaGFyZ2VyLT5jbGllbnQtPmRldiwKLQkJCQkiRmFpbGVkIHRvIHdyaXRlIGNoYXJnZXIgY3VycmVudCA6ICVkXG4iLAotCQkJCXJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCi0JaWYgKHBkYXRhLT5jaGFyZ2Vfdm9sdGFnZSkgewotCQl2YWx1ZSA9IHBkYXRhLT5jaGFyZ2Vfdm9sdGFnZSAmIEJRMjQ3MzVfQ0hBUkdFX1ZPTFRBR0VfTUFTSzsKLQotCQlyZXQgPSBicTI0NzM1X3dyaXRlX3dvcmQoY2hhcmdlci0+Y2xpZW50LAotCQkJCQkgQlEyNDczNV9DSEFSR0VfVk9MVEFHRSwgdmFsdWUpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycigmY2hhcmdlci0+Y2xpZW50LT5kZXYsCi0JCQkJIkZhaWxlZCB0byB3cml0ZSBjaGFyZ2VyIHZvbHRhZ2UgOiAlZFxuIiwKLQkJCQlyZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCWlmIChwZGF0YS0+aW5wdXRfY3VycmVudCkgewotCQl2YWx1ZSA9IHBkYXRhLT5pbnB1dF9jdXJyZW50ICYgQlEyNDczNV9JTlBVVF9DVVJSRU5UX01BU0s7Ci0KLQkJcmV0ID0gYnEyNDczNV93cml0ZV93b3JkKGNoYXJnZXItPmNsaWVudCwKLQkJCQkJIEJRMjQ3MzVfSU5QVVRfQ1VSUkVOVCwgdmFsdWUpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycigmY2hhcmdlci0+Y2xpZW50LT5kZXYsCi0JCQkJIkZhaWxlZCB0byB3cml0ZSBpbnB1dCBjdXJyZW50IDogJWRcbiIsCi0JCQkJcmV0KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGJvb2wgYnEyNDczNV9jaGFyZ2VyX2lzX3ByZXNlbnQoc3RydWN0IGJxMjQ3MzUgKmNoYXJnZXIpCi17Ci0Jc3RydWN0IGJxMjQ3MzVfcGxhdGZvcm0gKnBkYXRhID0gY2hhcmdlci0+cGRhdGE7Ci0JaW50IHJldDsKLQotCWlmIChwZGF0YS0+c3RhdHVzX2dwaW9fdmFsaWQpIHsKLQkJcmV0ID0gZ3Bpb19nZXRfdmFsdWVfY2Fuc2xlZXAocGRhdGEtPnN0YXR1c19ncGlvKTsKLQkJcmV0dXJuIHJldCBePSBwZGF0YS0+c3RhdHVzX2dwaW9fYWN0aXZlX2xvdyA9PSAwOwotCX0gZWxzZSB7Ci0JCWludCBhYyA9IDA7Ci0KLQkJYWMgPSBicTI0NzM1X3JlYWRfd29yZChjaGFyZ2VyLT5jbGllbnQsIEJRMjQ3MzVfQ0hHX09QVCk7Ci0JCWlmIChhYyA8IDApIHsKLQkJCWRldl9lcnIoJmNoYXJnZXItPmNsaWVudC0+ZGV2LAotCQkJCSJGYWlsZWQgdG8gcmVhZCBjaGFyZ2VyIG9wdGlvbnMgOiAlZFxuIiwKLQkJCQlhYyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIChhYyAmIEJRMjQ3MzVfQ0hHX09QVF9BQ19QUkVTRU5UKSA/IHRydWUgOiBmYWxzZTsKLQl9Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbnQgYnEyNDczNV9jaGFyZ2VyX2lzX2NoYXJnaW5nKHN0cnVjdCBicTI0NzM1ICpjaGFyZ2VyKQotewotCWludCByZXQgPSBicTI0NzM1X3JlYWRfd29yZChjaGFyZ2VyLT5jbGllbnQsIEJRMjQ3MzVfQ0hHX09QVCk7Ci0KLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiAhKHJldCAmIEJRMjQ3MzVfQ0hHX09QVF9DSEFSR0VfRElTQUJMRSk7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBicTI0NzM1X2NoYXJnZXJfaXNyKGludCBpcnEsIHZvaWQgKmRldmlkKQotewotCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IGRldmlkOwotCXN0cnVjdCBicTI0NzM1ICpjaGFyZ2VyID0gdG9fYnEyNDczNShwc3kpOwotCi0JbXV0ZXhfbG9jaygmY2hhcmdlci0+bG9jayk7Ci0KLQlpZiAoY2hhcmdlci0+Y2hhcmdpbmcgJiYgYnEyNDczNV9jaGFyZ2VyX2lzX3ByZXNlbnQoY2hhcmdlcikpCi0JCWJxMjQ3MzVfZW5hYmxlX2NoYXJnaW5nKGNoYXJnZXIpOwotCWVsc2UKLQkJYnEyNDczNV9kaXNhYmxlX2NoYXJnaW5nKGNoYXJnZXIpOwotCi0JbXV0ZXhfdW5sb2NrKCZjaGFyZ2VyLT5sb2NrKTsKLQotCXBvd2VyX3N1cHBseV9jaGFuZ2VkKHBzeSk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBpbnQgYnEyNDczNV9jaGFyZ2VyX2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCi0JCQkJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKLQkJCQkJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKLXsKLQlzdHJ1Y3QgYnEyNDczNSAqY2hhcmdlciA9IHRvX2JxMjQ3MzUocHN5KTsKLQotCXN3aXRjaCAocHNwKSB7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkU6Ci0JCXZhbC0+aW50dmFsID0gYnEyNDczNV9jaGFyZ2VyX2lzX3ByZXNlbnQoY2hhcmdlcikgPyAxIDogMDsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6Ci0JCXN3aXRjaCAoYnEyNDczNV9jaGFyZ2VyX2lzX2NoYXJnaW5nKGNoYXJnZXIpKSB7Ci0JCWNhc2UgMToKLQkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKLQkJCWJyZWFrOwotCQljYXNlIDA6Ci0JCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfTk9UX0NIQVJHSU5HOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfVU5LTk9XTjsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJxMjQ3MzVfY2hhcmdlcl9zZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAotCQkJCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCi0JCQkJCWNvbnN0IHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCi17Ci0Jc3RydWN0IGJxMjQ3MzUgKmNoYXJnZXIgPSB0b19icTI0NzM1KHBzeSk7Ci0JaW50IHJldDsKLQotCXN3aXRjaCAocHNwKSB7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6Ci0JCXN3aXRjaCAodmFsLT5pbnR2YWwpIHsKLQkJY2FzZSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOgotCQkJbXV0ZXhfbG9jaygmY2hhcmdlci0+bG9jayk7Ci0JCQljaGFyZ2VyLT5jaGFyZ2luZyA9IHRydWU7Ci0JCQlyZXQgPSBicTI0NzM1X2VuYWJsZV9jaGFyZ2luZyhjaGFyZ2VyKTsKLQkJCW11dGV4X3VubG9jaygmY2hhcmdlci0+bG9jayk7Ci0JCQlpZiAocmV0KQotCQkJCXJldHVybiByZXQ7Ci0JCQlicTI0NzM1X2NvbmZpZ19jaGFyZ2VyKGNoYXJnZXIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORzoKLQkJY2FzZSBQT1dFUl9TVVBQTFlfU1RBVFVTX05PVF9DSEFSR0lORzoKLQkJCW11dGV4X2xvY2soJmNoYXJnZXItPmxvY2spOwotCQkJY2hhcmdlci0+Y2hhcmdpbmcgPSBmYWxzZTsKLQkJCXJldCA9IGJxMjQ3MzVfZGlzYWJsZV9jaGFyZ2luZyhjaGFyZ2VyKTsKLQkJCW11dGV4X3VubG9jaygmY2hhcmdlci0+bG9jayk7Ci0JCQlpZiAocmV0KQotCQkJCXJldHVybiByZXQ7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCXBvd2VyX3N1cHBseV9jaGFuZ2VkKHBzeSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRVBFUk07Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYnEyNDczNV9wbGF0Zm9ybSAqYnEyNDczNV9wYXJzZV9kdF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IGJxMjQ3MzVfcGxhdGZvcm0gKnBkYXRhOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBjbGllbnQtPmRldi5vZl9ub2RlOwotCXUzMiB2YWw7Ci0JaW50IHJldDsKLQllbnVtIG9mX2dwaW9fZmxhZ3MgZmxhZ3M7Ci0KLQlwZGF0YSA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqcGRhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBkYXRhKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LAotCQkJIk1lbW9yeSBhbGxvYyBmb3IgYnEyNDczNSBwZGF0YSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlwZGF0YS0+c3RhdHVzX2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3Bpb19mbGFncyhucCwgInRpLGFjLWRldGVjdC1ncGlvcyIsCi0JCQkJCQkgICAgIDAsICZmbGFncyk7Ci0KLQlpZiAoZmxhZ3MgJiBPRl9HUElPX0FDVElWRV9MT1cpCi0JCXBkYXRhLT5zdGF0dXNfZ3Bpb19hY3RpdmVfbG93ID0gMTsKLQotCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidGksY2hhcmdlLWN1cnJlbnQiLCAmdmFsKTsKLQlpZiAoIXJldCkKLQkJcGRhdGEtPmNoYXJnZV9jdXJyZW50ID0gdmFsOwotCi0JcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJ0aSxjaGFyZ2Utdm9sdGFnZSIsICZ2YWwpOwotCWlmICghcmV0KQotCQlwZGF0YS0+Y2hhcmdlX3ZvbHRhZ2UgPSB2YWw7Ci0KLQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInRpLGlucHV0LWN1cnJlbnQiLCAmdmFsKTsKLQlpZiAoIXJldCkKLQkJcGRhdGEtPmlucHV0X2N1cnJlbnQgPSB2YWw7Ci0KLQlwZGF0YS0+ZXh0X2NvbnRyb2wgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJ0aSxleHRlcm5hbC1jb250cm9sIik7Ci0KLQlyZXR1cm4gcGRhdGE7Ci19Ci0KLXN0YXRpYyBpbnQgYnEyNDczNV9jaGFyZ2VyX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBicTI0NzM1ICpjaGFyZ2VyOwotCXN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyAqc3VwcGx5X2Rlc2M7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgcHN5X2NmZyA9IHt9OwotCWNoYXIgKm5hbWU7Ci0KLQljaGFyZ2VyID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKCpjaGFyZ2VyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjaGFyZ2VyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW11dGV4X2luaXQoJmNoYXJnZXItPmxvY2spOwotCWNoYXJnZXItPmNoYXJnaW5nID0gdHJ1ZTsKLQljaGFyZ2VyLT5wZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0KLQlpZiAoSVNfRU5BQkxFRChDT05GSUdfT0YpICYmICFjaGFyZ2VyLT5wZGF0YSAmJiBjbGllbnQtPmRldi5vZl9ub2RlKQotCQljaGFyZ2VyLT5wZGF0YSA9IGJxMjQ3MzVfcGFyc2VfZHRfZGF0YShjbGllbnQpOwotCi0JaWYgKCFjaGFyZ2VyLT5wZGF0YSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIm5vIHBsYXRmb3JtIGRhdGEgcHJvdmlkZWRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQluYW1lID0gKGNoYXIgKiljaGFyZ2VyLT5wZGF0YS0+bmFtZTsKLQlpZiAoIW5hbWUpIHsKLQkJbmFtZSA9IGRldm1fa2FzcHJpbnRmKCZjbGllbnQtPmRldiwgR0ZQX0tFUk5FTCwKLQkJCQkgICAgICAiYnEyNDczNUAlcyIsCi0JCQkJICAgICAgZGV2X25hbWUoJmNsaWVudC0+ZGV2KSk7Ci0JCWlmICghbmFtZSkgewotCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gYWxsb2MgZGV2aWNlIG5hbWVcbiIpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQl9Ci0KLQljaGFyZ2VyLT5jbGllbnQgPSBjbGllbnQ7Ci0KLQlzdXBwbHlfZGVzYyA9ICZjaGFyZ2VyLT5jaGFyZ2VyX2Rlc2M7Ci0KLQlzdXBwbHlfZGVzYy0+bmFtZSA9IG5hbWU7Ci0Jc3VwcGx5X2Rlc2MtPnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUzsKLQlzdXBwbHlfZGVzYy0+cHJvcGVydGllcyA9IGJxMjQ3MzVfY2hhcmdlcl9wcm9wZXJ0aWVzOwotCXN1cHBseV9kZXNjLT5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUoYnEyNDczNV9jaGFyZ2VyX3Byb3BlcnRpZXMpOwotCXN1cHBseV9kZXNjLT5nZXRfcHJvcGVydHkgPSBicTI0NzM1X2NoYXJnZXJfZ2V0X3Byb3BlcnR5OwotCXN1cHBseV9kZXNjLT5zZXRfcHJvcGVydHkgPSBicTI0NzM1X2NoYXJnZXJfc2V0X3Byb3BlcnR5OwotCXN1cHBseV9kZXNjLT5wcm9wZXJ0eV9pc193cml0ZWFibGUgPQotCQkJCWJxMjQ3MzVfY2hhcmdlcl9wcm9wZXJ0eV9pc193cml0ZWFibGU7Ci0KLQlwc3lfY2ZnLnN1cHBsaWVkX3RvID0gY2hhcmdlci0+cGRhdGEtPnN1cHBsaWVkX3RvOwotCXBzeV9jZmcubnVtX3N1cHBsaWNhbnRzID0gY2hhcmdlci0+cGRhdGEtPm51bV9zdXBwbGljYW50czsKLQlwc3lfY2ZnLm9mX25vZGUgPSBjbGllbnQtPmRldi5vZl9ub2RlOwotCXBzeV9jZmcuZHJ2X2RhdGEgPSBjaGFyZ2VyOwotCi0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgY2hhcmdlcik7Ci0KLQlpZiAoZ3Bpb19pc192YWxpZChjaGFyZ2VyLT5wZGF0YS0+c3RhdHVzX2dwaW8pKSB7Ci0JCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0KCZjbGllbnQtPmRldiwKLQkJCQkJY2hhcmdlci0+cGRhdGEtPnN0YXR1c19ncGlvLAotCQkJCQluYW1lKTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2VycigmY2xpZW50LT5kZXYsCi0JCQkJIkZhaWxlZCBHUElPIHJlcXVlc3QgZm9yIEdQSU8gJWQ6ICVkXG4iLAotCQkJCWNoYXJnZXItPnBkYXRhLT5zdGF0dXNfZ3BpbywgcmV0KTsKLQkJfQotCi0JCWNoYXJnZXItPnBkYXRhLT5zdGF0dXNfZ3Bpb192YWxpZCA9ICFyZXQ7Ci0JfQotCi0JaWYgKCFjaGFyZ2VyLT5wZGF0YS0+c3RhdHVzX2dwaW9fdmFsaWQKLQkgICAgfHwgYnEyNDczNV9jaGFyZ2VyX2lzX3ByZXNlbnQoY2hhcmdlcikpIHsKLQkJcmV0ID0gYnEyNDczNV9yZWFkX3dvcmQoY2xpZW50LCBCUTI0NzM1X01BTlVGQUNUVVJFUl9JRCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byByZWFkIG1hbnVmYWN0dXJlciBpZCA6ICVkXG4iLAotCQkJCXJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9IGVsc2UgaWYgKHJldCAhPSAweDAwNDApIHsKLQkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAotCQkJCSJtYW51ZmFjdHVyZXIgaWQgbWlzbWF0Y2guIDB4MDA0MCAhPSAweCUwNHhcbiIsIHJldCk7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCi0JCXJldCA9IGJxMjQ3MzVfcmVhZF93b3JkKGNsaWVudCwgQlEyNDczNV9ERVZJQ0VfSUQpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gcmVhZCBkZXZpY2UgaWQgOiAlZFxuIiwgcmV0KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0gZWxzZSBpZiAocmV0ICE9IDB4MDAwQikgewotCQkJZGV2X2VycigmY2xpZW50LT5kZXYsCi0JCQkJImRldmljZSBpZCBtaXNtYXRjaC4gMHgwMDBiICE9IDB4JTA0eFxuIiwgcmV0KTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JfQotCi0JcmV0ID0gYnEyNDczNV9jb25maWdfY2hhcmdlcihjaGFyZ2VyKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZCBpbiBjb25maWd1cmluZyBjaGFyZ2VyIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogY2hlY2sgZm9yIEFDIGFkYXB0ZXIgcHJlc2VuY2UgKi8KLQlpZiAoYnEyNDczNV9jaGFyZ2VyX2lzX3ByZXNlbnQoY2hhcmdlcikpIHsKLQkJcmV0ID0gYnEyNDczNV9lbmFibGVfY2hhcmdpbmcoY2hhcmdlcik7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byBlbmFibGUgY2hhcmdpbmdcbiIpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCWNoYXJnZXItPmNoYXJnZXIgPSBkZXZtX3Bvd2VyX3N1cHBseV9yZWdpc3RlcigmY2xpZW50LT5kZXYsIHN1cHBseV9kZXNjLAotCQkJCQkJICAgICAgJnBzeV9jZmcpOwotCWlmIChJU19FUlIoY2hhcmdlci0+Y2hhcmdlcikpIHsKLQkJcmV0ID0gUFRSX0VSUihjaGFyZ2VyLT5jaGFyZ2VyKTsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgcG93ZXIgc3VwcGx5OiAlZFxuIiwKLQkJCXJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JaWYgKGNsaWVudC0+aXJxKSB7Ci0JCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoJmNsaWVudC0+ZGV2LCBjbGllbnQtPmlycSwKLQkJCQkJCU5VTEwsIGJxMjQ3MzVfY2hhcmdlcl9pc3IsCi0JCQkJCQlJUlFGX1RSSUdHRVJfUklTSU5HIHwKLQkJCQkJCUlSUUZfVFJJR0dFUl9GQUxMSU5HIHwKLQkJCQkJCUlSUUZfT05FU0hPVCwKLQkJCQkJCXN1cHBseV9kZXNjLT5uYW1lLAotCQkJCQkJY2hhcmdlci0+Y2hhcmdlcik7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAotCQkJCSJVbmFibGUgdG8gcmVnaXN0ZXIgSVJRICVkIGVyciAlZFxuIiwKLQkJCQljbGllbnQtPmlycSwgcmV0KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGJxMjQ3MzVfY2hhcmdlcl9pZFtdID0gewotCXsgImJxMjQ3MzUtY2hhcmdlciIsIDAgfSwKLQl7fQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBicTI0NzM1X2NoYXJnZXJfaWQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBicTI0NzM1X21hdGNoX2lkc1tdID0gewotCXsgLmNvbXBhdGlibGUgPSAidGksYnEyNDczNSIsIH0sCi0JeyAvKiBlbmQgKi8gfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGJxMjQ3MzVfbWF0Y2hfaWRzKTsKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGJxMjQ3MzVfY2hhcmdlcl9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAiYnEyNDczNS1jaGFyZ2VyIiwKLQkJLm9mX21hdGNoX3RhYmxlID0gYnEyNDczNV9tYXRjaF9pZHMsCi0JfSwKLQkucHJvYmUgPSBicTI0NzM1X2NoYXJnZXJfcHJvYmUsCi0JLmlkX3RhYmxlID0gYnEyNDczNV9jaGFyZ2VyX2lkLAotfTsKLQotbW9kdWxlX2kyY19kcml2ZXIoYnEyNDczNV9jaGFyZ2VyX2RyaXZlcik7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiYnEyNDczNSBiYXR0ZXJ5IGNoYXJnaW5nIGRyaXZlciIpOwotTU9EVUxFX0FVVEhPUigiRGFyYmhhIFNyaWhhcnNoYSA8ZHNyaWhhcnNoYUBudmlkaWEuY29tPiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9icTI3eHh4X2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvYnEyN3h4eF9iYXR0ZXJ5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyM2QwNWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9wb3dlci9icTI3eHh4X2JhdHRlcnkuYworKysgL2Rldi9udWxsCkBAIC0xLDExMDIgKzAsMCBAQAotLyoKLSAqIEJRMjd4eHggYmF0dGVyeSBkcml2ZXIKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggUm9kb2xmbyBHaW9tZXR0aSA8Z2lvbWV0dGlAbGludXguaXQ+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDggRXVyb3RlY2ggUy5wLkEuIDxpbmZvQGV1cm90ZWNoLml0PgotICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgUGFsaSBSb2jDoXIgPHBhbGkucm9oYXJAZ21haWwuY29tPgotICoKLSAqIEJhc2VkIG9uIGEgcHJldmlvdXMgd29yayBieSBDb3B5cmlnaHQgKEMpIDIwMDggVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KLSAqCi0gKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogRGF0YXNoZWV0czoKLSAqIGh0dHA6Ly93d3cudGkuY29tL3Byb2R1Y3QvYnEyNzAwMAotICogaHR0cDovL3d3dy50aS5jb20vcHJvZHVjdC9icTI3MjAwCi0gKiBodHRwOi8vd3d3LnRpLmNvbS9wcm9kdWN0L2JxMjcwMTAKLSAqIGh0dHA6Ly93d3cudGkuY29tL3Byb2R1Y3QvYnEyNzIxMAotICogaHR0cDovL3d3dy50aS5jb20vcHJvZHVjdC9icTI3NTAwCi0gKiBodHRwOi8vd3d3LnRpLmNvbS9wcm9kdWN0L2JxMjc1MTAtZzMKLSAqIGh0dHA6Ly93d3cudGkuY29tL3Byb2R1Y3QvYnEyNzUyMC1nNAotICogaHR0cDovL3d3dy50aS5jb20vcHJvZHVjdC9icTI3NTMwLWcxCi0gKiBodHRwOi8vd3d3LnRpLmNvbS9wcm9kdWN0L2JxMjc1MzEtZzEKLSAqIGh0dHA6Ly93d3cudGkuY29tL3Byb2R1Y3QvYnEyNzU0MS1nMQotICogaHR0cDovL3d3dy50aS5jb20vcHJvZHVjdC9icTI3NTQyLWcxCi0gKiBodHRwOi8vd3d3LnRpLmNvbS9wcm9kdWN0L2JxMjc1NDYtZzEKLSAqIGh0dHA6Ly93d3cudGkuY29tL3Byb2R1Y3QvYnEyNzc0Mi1nMQotICogaHR0cDovL3d3dy50aS5jb20vcHJvZHVjdC9icTI3NTQ1LWcxCi0gKiBodHRwOi8vd3d3LnRpLmNvbS9wcm9kdWN0L2JxMjc0MjEtZzEKLSAqIGh0dHA6Ly93d3cudGkuY29tL3Byb2R1Y3QvYnEyNzQyNS1nMQotICogaHR0cDovL3d3dy50aS5jb20vcHJvZHVjdC9icTI3NDExLWcxCi0gKiBodHRwOi8vd3d3LnRpLmNvbS9wcm9kdWN0L2JxMjc2MjEtZzEKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3Bvd2VyL2JxMjd4eHhfYmF0dGVyeS5oPgotCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OCQkiMS4yLjAiCi0KLSNkZWZpbmUgQlEyN1hYWF9NQU5VRkFDVFVSRVIJIlRleGFzIEluc3RydW1lbnRzIgotCi0vKiBCUTI3WFhYIEZsYWdzICovCi0jZGVmaW5lIEJRMjdYWFhfRkxBR19EU0MJQklUKDApCi0jZGVmaW5lIEJRMjdYWFhfRkxBR19TT0NGCUJJVCgxKSAvKiBTdGF0ZS1vZi1DaGFyZ2UgdGhyZXNob2xkIGZpbmFsICovCi0jZGVmaW5lIEJRMjdYWFhfRkxBR19TT0MxCUJJVCgyKSAvKiBTdGF0ZS1vZi1DaGFyZ2UgdGhyZXNob2xkIDEgKi8KLSNkZWZpbmUgQlEyN1hYWF9GTEFHX0ZDCQlCSVQoOSkKLSNkZWZpbmUgQlEyN1hYWF9GTEFHX09URAlCSVQoMTQpCi0jZGVmaW5lIEJRMjdYWFhfRkxBR19PVEMJQklUKDE1KQotI2RlZmluZSBCUTI3WFhYX0ZMQUdfVVQJCUJJVCgxNCkKLSNkZWZpbmUgQlEyN1hYWF9GTEFHX09UCQlCSVQoMTUpCi0KLS8qIEJRMjcwMDAgaGFzIGRpZmZlcmVudCBsYXlvdXQgZm9yIEZsYWdzIHJlZ2lzdGVyICovCi0jZGVmaW5lIEJRMjcwMDBfRkxBR19FRFZGCUJJVCgwKSAvKiBGaW5hbCBFbmQtb2YtRGlzY2hhcmdlLVZvbHRhZ2UgZmxhZyAqLwotI2RlZmluZSBCUTI3MDAwX0ZMQUdfRURWMQlCSVQoMSkgLyogRmlyc3QgRW5kLW9mLURpc2NoYXJnZS1Wb2x0YWdlIGZsYWcgKi8KLSNkZWZpbmUgQlEyNzAwMF9GTEFHX0NJCQlCSVQoNCkgLyogQ2FwYWNpdHkgSW5hY2N1cmF0ZSBmbGFnICovCi0jZGVmaW5lIEJRMjcwMDBfRkxBR19GQwkJQklUKDUpCi0jZGVmaW5lIEJRMjcwMDBfRkxBR19DSEdTCUJJVCg3KSAvKiBDaGFyZ2Ugc3RhdGUgZmxhZyAqLwotCi0jZGVmaW5lIEJRMjdYWFhfUlMJCQkoMjApIC8qIFJlc2lzdG9yIHNlbnNlIG1PaG0gKi8KLSNkZWZpbmUgQlEyN1hYWF9QT1dFUl9DT05TVEFOVAkJKDI5MjAwKSAvKiAyOS4yIMK1Vl4yICogMTAwMCAqLwotI2RlZmluZSBCUTI3WFhYX0NVUlJFTlRfQ09OU1RBTlQJKDM1NzApIC8qIDMuNTcgwrVWICogMTAwMCAqLwotCi0jZGVmaW5lIElOVkFMSURfUkVHX0FERFIJMHhmZgotCi0vKgotICogYnEyN3h4eF9yZWdfaW5kZXggLSBSZWdpc3RlciBuYW1lcwotICoKLSAqIFRoZXNlIGFyZSBpbmRleGVzIGludG8gYSBkZXZpY2UncyByZWdpc3RlciBtYXBwaW5nIGFycmF5LgotICovCi0KLWVudW0gYnEyN3h4eF9yZWdfaW5kZXggewotCUJRMjdYWFhfUkVHX0NUUkwgPSAwLAkvKiBDb250cm9sICovCi0JQlEyN1hYWF9SRUdfVEVNUCwJLyogVGVtcGVyYXR1cmUgKi8KLQlCUTI3WFhYX1JFR19JTlRfVEVNUCwJLyogSW50ZXJuYWwgVGVtcGVyYXR1cmUgKi8KLQlCUTI3WFhYX1JFR19WT0xULAkvKiBWb2x0YWdlICovCi0JQlEyN1hYWF9SRUdfQUksCQkvKiBBdmVyYWdlIEN1cnJlbnQgKi8KLQlCUTI3WFhYX1JFR19GTEFHUywJLyogRmxhZ3MgKi8KLQlCUTI3WFhYX1JFR19UVEUsCS8qIFRpbWUtdG8tRW1wdHkgKi8KLQlCUTI3WFhYX1JFR19UVEYsCS8qIFRpbWUtdG8tRnVsbCAqLwotCUJRMjdYWFhfUkVHX1RURVMsCS8qIFRpbWUtdG8tRW1wdHkgU3RhbmRieSAqLwotCUJRMjdYWFhfUkVHX1RURUNQLAkvKiBUaW1lLXRvLUVtcHR5IGF0IENvbnN0YW50IFBvd2VyICovCi0JQlEyN1hYWF9SRUdfTkFDLAkvKiBOb21pbmFsIEF2YWlsYWJsZSBDYXBhY2l0eSAqLwotCUJRMjdYWFhfUkVHX0ZDQywJLyogRnVsbCBDaGFyZ2UgQ2FwYWNpdHkgKi8KLQlCUTI3WFhYX1JFR19DWUNULAkvKiBDeWNsZSBDb3VudCAqLwotCUJRMjdYWFhfUkVHX0FFLAkJLyogQXZhaWxhYmxlIEVuZXJneSAqLwotCUJRMjdYWFhfUkVHX1NPQywJLyogU3RhdGUtb2YtQ2hhcmdlICovCi0JQlEyN1hYWF9SRUdfRENBUCwJLyogRGVzaWduIENhcGFjaXR5ICovCi0JQlEyN1hYWF9SRUdfQVAsCQkvKiBBdmVyYWdlIFBvd2VyICovCi0JQlEyN1hYWF9SRUdfTUFYLAkvKiBzZW50aW5lbCAqLwotfTsKLQotLyogUmVnaXN0ZXIgbWFwcGluZ3MgKi8KLXN0YXRpYyB1OCBicTI3eHh4X3JlZ3NbXVtCUTI3WFhYX1JFR19NQVhdID0gewotCVtCUTI3MDAwXSA9IHsKLQkJW0JRMjdYWFhfUkVHX0NUUkxdID0gMHgwMCwKLQkJW0JRMjdYWFhfUkVHX1RFTVBdID0gMHgwNiwKLQkJW0JRMjdYWFhfUkVHX0lOVF9URU1QXSA9IElOVkFMSURfUkVHX0FERFIsCi0JCVtCUTI3WFhYX1JFR19WT0xUXSA9IDB4MDgsCi0JCVtCUTI3WFhYX1JFR19BSV0gPSAweDE0LAotCQlbQlEyN1hYWF9SRUdfRkxBR1NdID0gMHgwYSwKLQkJW0JRMjdYWFhfUkVHX1RURV0gPSAweDE2LAotCQlbQlEyN1hYWF9SRUdfVFRGXSA9IDB4MTgsCi0JCVtCUTI3WFhYX1JFR19UVEVTXSA9IDB4MWMsCi0JCVtCUTI3WFhYX1JFR19UVEVDUF0gPSAweDI2LAotCQlbQlEyN1hYWF9SRUdfTkFDXSA9IDB4MGMsCi0JCVtCUTI3WFhYX1JFR19GQ0NdID0gMHgxMiwKLQkJW0JRMjdYWFhfUkVHX0NZQ1RdID0gMHgyYSwKLQkJW0JRMjdYWFhfUkVHX0FFXSA9IDB4MjIsCi0JCVtCUTI3WFhYX1JFR19TT0NdID0gMHgwYiwKLQkJW0JRMjdYWFhfUkVHX0RDQVBdID0gMHg3NiwKLQkJW0JRMjdYWFhfUkVHX0FQXSA9IDB4MjQsCi0JfSwKLQlbQlEyNzAxMF0gPSB7Ci0JCVtCUTI3WFhYX1JFR19DVFJMXSA9IDB4MDAsCi0JCVtCUTI3WFhYX1JFR19URU1QXSA9IDB4MDYsCi0JCVtCUTI3WFhYX1JFR19JTlRfVEVNUF0gPSBJTlZBTElEX1JFR19BRERSLAotCQlbQlEyN1hYWF9SRUdfVk9MVF0gPSAweDA4LAotCQlbQlEyN1hYWF9SRUdfQUldID0gMHgxNCwKLQkJW0JRMjdYWFhfUkVHX0ZMQUdTXSA9IDB4MGEsCi0JCVtCUTI3WFhYX1JFR19UVEVdID0gMHgxNiwKLQkJW0JRMjdYWFhfUkVHX1RURl0gPSAweDE4LAotCQlbQlEyN1hYWF9SRUdfVFRFU10gPSAweDFjLAotCQlbQlEyN1hYWF9SRUdfVFRFQ1BdID0gMHgyNiwKLQkJW0JRMjdYWFhfUkVHX05BQ10gPSAweDBjLAotCQlbQlEyN1hYWF9SRUdfRkNDXSA9IDB4MTIsCi0JCVtCUTI3WFhYX1JFR19DWUNUXSA9IDB4MmEsCi0JCVtCUTI3WFhYX1JFR19BRV0gPSBJTlZBTElEX1JFR19BRERSLAotCQlbQlEyN1hYWF9SRUdfU09DXSA9IDB4MGIsCi0JCVtCUTI3WFhYX1JFR19EQ0FQXSA9IDB4NzYsCi0JCVtCUTI3WFhYX1JFR19BUF0gPSBJTlZBTElEX1JFR19BRERSLAotCX0sCi0JW0JRMjc1MDBdID0gewotCQlbQlEyN1hYWF9SRUdfQ1RSTF0gPSAweDAwLAotCQlbQlEyN1hYWF9SRUdfVEVNUF0gPSAweDA2LAotCQlbQlEyN1hYWF9SRUdfSU5UX1RFTVBdID0gMHgyOCwKLQkJW0JRMjdYWFhfUkVHX1ZPTFRdID0gMHgwOCwKLQkJW0JRMjdYWFhfUkVHX0FJXSA9IDB4MTQsCi0JCVtCUTI3WFhYX1JFR19GTEFHU10gPSAweDBhLAotCQlbQlEyN1hYWF9SRUdfVFRFXSA9IDB4MTYsCi0JCVtCUTI3WFhYX1JFR19UVEZdID0gSU5WQUxJRF9SRUdfQUREUiwKLQkJW0JRMjdYWFhfUkVHX1RURVNdID0gMHgxYSwKLQkJW0JRMjdYWFhfUkVHX1RURUNQXSA9IElOVkFMSURfUkVHX0FERFIsCi0JCVtCUTI3WFhYX1JFR19OQUNdID0gMHgwYywKLQkJW0JRMjdYWFhfUkVHX0ZDQ10gPSAweDEyLAotCQlbQlEyN1hYWF9SRUdfQ1lDVF0gPSAweDJhLAotCQlbQlEyN1hYWF9SRUdfQUVdID0gSU5WQUxJRF9SRUdfQUREUiwKLQkJW0JRMjdYWFhfUkVHX1NPQ10gPSAweDJjLAotCQlbQlEyN1hYWF9SRUdfRENBUF0gPSAweDNjLAotCQlbQlEyN1hYWF9SRUdfQVBdID0gSU5WQUxJRF9SRUdfQUREUiwKLQl9LAotCVtCUTI3NTMwXSA9IHsKLQkJW0JRMjdYWFhfUkVHX0NUUkxdID0gMHgwMCwKLQkJW0JRMjdYWFhfUkVHX1RFTVBdID0gMHgwNiwKLQkJW0JRMjdYWFhfUkVHX0lOVF9URU1QXSA9IDB4MzIsCi0JCVtCUTI3WFhYX1JFR19WT0xUXSA9IDB4MDgsCi0JCVtCUTI3WFhYX1JFR19BSV0gPSAweDE0LAotCQlbQlEyN1hYWF9SRUdfRkxBR1NdID0gMHgwYSwKLQkJW0JRMjdYWFhfUkVHX1RURV0gPSAweDE2LAotCQlbQlEyN1hYWF9SRUdfVFRGXSA9IElOVkFMSURfUkVHX0FERFIsCi0JCVtCUTI3WFhYX1JFR19UVEVTXSA9IElOVkFMSURfUkVHX0FERFIsCi0JCVtCUTI3WFhYX1JFR19UVEVDUF0gPSBJTlZBTElEX1JFR19BRERSLAotCQlbQlEyN1hYWF9SRUdfTkFDXSA9IDB4MGMsCi0JCVtCUTI3WFhYX1JFR19GQ0NdID0gMHgxMiwKLQkJW0JRMjdYWFhfUkVHX0NZQ1RdID0gMHgyYSwKLQkJW0JRMjdYWFhfUkVHX0FFXSA9IElOVkFMSURfUkVHX0FERFIsCi0JCVtCUTI3WFhYX1JFR19TT0NdID0gMHgyYywKLQkJW0JRMjdYWFhfUkVHX0RDQVBdID0gSU5WQUxJRF9SRUdfQUREUiwKLQkJW0JRMjdYWFhfUkVHX0FQXSA9IDB4MjQsCi0JfSwKLQlbQlEyNzU0MV0gPSB7Ci0JCVtCUTI3WFhYX1JFR19DVFJMXSA9IDB4MDAsCi0JCVtCUTI3WFhYX1JFR19URU1QXSA9IDB4MDYsCi0JCVtCUTI3WFhYX1JFR19JTlRfVEVNUF0gPSAweDI4LAotCQlbQlEyN1hYWF9SRUdfVk9MVF0gPSAweDA4LAotCQlbQlEyN1hYWF9SRUdfQUldID0gMHgxNCwKLQkJW0JRMjdYWFhfUkVHX0ZMQUdTXSA9IDB4MGEsCi0JCVtCUTI3WFhYX1JFR19UVEVdID0gMHgxNiwKLQkJW0JRMjdYWFhfUkVHX1RURl0gPSBJTlZBTElEX1JFR19BRERSLAotCQlbQlEyN1hYWF9SRUdfVFRFU10gPSBJTlZBTElEX1JFR19BRERSLAotCQlbQlEyN1hYWF9SRUdfVFRFQ1BdID0gSU5WQUxJRF9SRUdfQUREUiwKLQkJW0JRMjdYWFhfUkVHX05BQ10gPSAweDBjLAotCQlbQlEyN1hYWF9SRUdfRkNDXSA9IDB4MTIsCi0JCVtCUTI3WFhYX1JFR19DWUNUXSA9IDB4MmEsCi0JCVtCUTI3WFhYX1JFR19BRV0gPSBJTlZBTElEX1JFR19BRERSLAotCQlbQlEyN1hYWF9SRUdfU09DXSA9IDB4MmMsCi0JCVtCUTI3WFhYX1JFR19EQ0FQXSA9IDB4M2MsCi0JCVtCUTI3WFhYX1JFR19BUF0gPSAweDI0LAotCX0sCi0JW0JRMjc1NDVdID0gewotCQlbQlEyN1hYWF9SRUdfQ1RSTF0gPSAweDAwLAotCQlbQlEyN1hYWF9SRUdfVEVNUF0gPSAweDA2LAotCQlbQlEyN1hYWF9SRUdfSU5UX1RFTVBdID0gMHgyOCwKLQkJW0JRMjdYWFhfUkVHX1ZPTFRdID0gMHgwOCwKLQkJW0JRMjdYWFhfUkVHX0FJXSA9IDB4MTQsCi0JCVtCUTI3WFhYX1JFR19GTEFHU10gPSAweDBhLAotCQlbQlEyN1hYWF9SRUdfVFRFXSA9IDB4MTYsCi0JCVtCUTI3WFhYX1JFR19UVEZdID0gSU5WQUxJRF9SRUdfQUREUiwKLQkJW0JRMjdYWFhfUkVHX1RURVNdID0gSU5WQUxJRF9SRUdfQUREUiwKLQkJW0JRMjdYWFhfUkVHX1RURUNQXSA9IElOVkFMSURfUkVHX0FERFIsCi0JCVtCUTI3WFhYX1JFR19OQUNdID0gMHgwYywKLQkJW0JRMjdYWFhfUkVHX0ZDQ10gPSAweDEyLAotCQlbQlEyN1hYWF9SRUdfQ1lDVF0gPSAweDJhLAotCQlbQlEyN1hYWF9SRUdfQUVdID0gSU5WQUxJRF9SRUdfQUREUiwKLQkJW0JRMjdYWFhfUkVHX1NPQ10gPSAweDJjLAotCQlbQlEyN1hYWF9SRUdfRENBUF0gPSBJTlZBTElEX1JFR19BRERSLAotCQlbQlEyN1hYWF9SRUdfQVBdID0gMHgyNCwKLQl9LAotCVtCUTI3NDIxXSA9IHsKLQkJW0JRMjdYWFhfUkVHX0NUUkxdID0gMHgwMCwKLQkJW0JRMjdYWFhfUkVHX1RFTVBdID0gMHgwMiwKLQkJW0JRMjdYWFhfUkVHX0lOVF9URU1QXSA9IDB4MWUsCi0JCVtCUTI3WFhYX1JFR19WT0xUXSA9IDB4MDQsCi0JCVtCUTI3WFhYX1JFR19BSV0gPSAweDEwLAotCQlbQlEyN1hYWF9SRUdfRkxBR1NdID0gMHgwNiwKLQkJW0JRMjdYWFhfUkVHX1RURV0gPSBJTlZBTElEX1JFR19BRERSLAotCQlbQlEyN1hYWF9SRUdfVFRGXSA9IElOVkFMSURfUkVHX0FERFIsCi0JCVtCUTI3WFhYX1JFR19UVEVTXSA9IElOVkFMSURfUkVHX0FERFIsCi0JCVtCUTI3WFhYX1JFR19UVEVDUF0gPSBJTlZBTElEX1JFR19BRERSLAotCQlbQlEyN1hYWF9SRUdfTkFDXSA9IDB4MDgsCi0JCVtCUTI3WFhYX1JFR19GQ0NdID0gMHgwZSwKLQkJW0JRMjdYWFhfUkVHX0NZQ1RdID0gSU5WQUxJRF9SRUdfQUREUiwKLQkJW0JRMjdYWFhfUkVHX0FFXSA9IElOVkFMSURfUkVHX0FERFIsCi0JCVtCUTI3WFhYX1JFR19TT0NdID0gMHgxYywKLQkJW0JRMjdYWFhfUkVHX0RDQVBdID0gMHgzYywKLQkJW0JRMjdYWFhfUkVHX0FQXSA9IDB4MTgsCi0JfSwKLX07Ci0KLXN0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBicTI3MDAwX2JhdHRlcnlfcHJvcHNbXSA9IHsKLQlQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMsCi0JUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVywKLQlQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVywKLQlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWSwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWV9MRVZFTCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9URU1QLAotCVBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRU1QVFlfTk9XLAotCVBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRU1QVFlfQVZHLAotCVBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRlVMTF9OT1csCi0JUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWSwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMX0RFU0lHTiwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DWUNMRV9DT1VOVCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfTk9XLAotCVBPV0VSX1NVUFBMWV9QUk9QX1BPV0VSX0FWRywKLQlQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEgsCi0JUE9XRVJfU1VQUExZX1BST1BfTUFOVUZBQ1RVUkVSLAotfTsKLQotc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IGJxMjcwMTBfYmF0dGVyeV9wcm9wc1tdID0gewotCVBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywKLQlQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5ULAotCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZX0xFVkVMLAotCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVAsCi0JUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19FTVBUWV9OT1csCi0JUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19FTVBUWV9BVkcsCi0JUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19GVUxMX05PVywKLQlQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9OT1csCi0JUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTExfREVTSUdOLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NZQ0xFX0NPVU5ULAotCVBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9NQU5VRkFDVFVSRVIsCi19OwotCi1zdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgYnEyNzUwMF9iYXR0ZXJ5X3Byb3BzW10gPSB7Ci0JUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAotCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsCi0JUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1csCi0JUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1csCi0JUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFksCi0JUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFlfTEVWRUwsCi0JUE9XRVJfU1VQUExZX1BST1BfVEVNUCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0VNUFRZX05PVywKLQlQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9OT1csCi0JUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTExfREVTSUdOLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NZQ0xFX0NPVU5ULAotCVBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9NQU5VRkFDVFVSRVIsCi19OwotCi1zdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgYnEyNzUzMF9iYXR0ZXJ5X3Byb3BzW10gPSB7Ci0JUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAotCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsCi0JUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1csCi0JUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1csCi0JUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFksCi0JUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFlfTEVWRUwsCi0JUE9XRVJfU1VQUExZX1BST1BfVEVNUCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0VNUFRZX05PVywKLQlQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9OT1csCi0JUE9XRVJfU1VQUExZX1BST1BfUE9XRVJfQVZHLAotCVBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DWUNMRV9DT1VOVCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9NQU5VRkFDVFVSRVIsCi19OwotCi1zdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgYnEyNzU0MV9iYXR0ZXJ5X3Byb3BzW10gPSB7Ci0JUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAotCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsCi0JUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1csCi0JUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1csCi0JUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFksCi0JUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFlfTEVWRUwsCi0JUE9XRVJfU1VQUExZX1BST1BfVEVNUCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0VNUFRZX05PVywKLQlQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9OT1csCi0JUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTExfREVTSUdOLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NZQ0xFX0NPVU5ULAotCVBPV0VSX1NVUFBMWV9QUk9QX1BPV0VSX0FWRywKLQlQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEgsCi0JUE9XRVJfU1VQUExZX1BST1BfTUFOVUZBQ1RVUkVSLAotfTsKLQotc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IGJxMjc1NDVfYmF0dGVyeV9wcm9wc1tdID0gewotCVBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywKLQlQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5ULAotCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZX0xFVkVMLAotCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVAsCi0JUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19FTVBUWV9OT1csCi0JUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWSwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XLAotCVBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DWUNMRV9DT1VOVCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9QT1dFUl9BVkcsCi0JUE9XRVJfU1VQUExZX1BST1BfTUFOVUZBQ1RVUkVSLAotfTsKLQotc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IGJxMjc0MjFfYmF0dGVyeV9wcm9wc1tdID0gewotCVBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywKLQlQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5ULAotCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZX0xFVkVMLAotCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVAsCi0JUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWSwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMX0RFU0lHTiwKLQlQT1dFUl9TVVBQTFlfUFJPUF9NQU5VRkFDVFVSRVIsCi19OwotCi0jZGVmaW5lIEJRMjdYWFhfUFJPUChfaWQsIF9wcm9wKQkJXAotCVtfaWRdID0gewkJCQlcCi0JCS5wcm9wcyA9IF9wcm9wLAkJCVwKLQkJLnNpemUgPSBBUlJBWV9TSVpFKF9wcm9wKSwJXAotCX0KLQotc3RhdGljIHN0cnVjdCB7Ci0JZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgKnByb3BzOwotCXNpemVfdCBzaXplOwotfSBicTI3eHh4X2JhdHRlcnlfcHJvcHNbXSA9IHsKLQlCUTI3WFhYX1BST1AoQlEyNzAwMCwgYnEyNzAwMF9iYXR0ZXJ5X3Byb3BzKSwKLQlCUTI3WFhYX1BST1AoQlEyNzAxMCwgYnEyNzAxMF9iYXR0ZXJ5X3Byb3BzKSwKLQlCUTI3WFhYX1BST1AoQlEyNzUwMCwgYnEyNzUwMF9iYXR0ZXJ5X3Byb3BzKSwKLQlCUTI3WFhYX1BST1AoQlEyNzUzMCwgYnEyNzUzMF9iYXR0ZXJ5X3Byb3BzKSwKLQlCUTI3WFhYX1BST1AoQlEyNzU0MSwgYnEyNzU0MV9iYXR0ZXJ5X3Byb3BzKSwKLQlCUTI3WFhYX1BST1AoQlEyNzU0NSwgYnEyNzU0NV9iYXR0ZXJ5X3Byb3BzKSwKLQlCUTI3WFhYX1BST1AoQlEyNzQyMSwgYnEyNzQyMV9iYXR0ZXJ5X3Byb3BzKSwKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgcG9sbF9pbnRlcnZhbCA9IDM2MDsKLW1vZHVsZV9wYXJhbShwb2xsX2ludGVydmFsLCB1aW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MocG9sbF9pbnRlcnZhbCwKLQkJICJiYXR0ZXJ5IHBvbGwgaW50ZXJ2YWwgaW4gc2Vjb25kcyAtIDAgZGlzYWJsZXMgcG9sbGluZyIpOwotCi0vKgotICogQ29tbW9uIGNvZGUgZm9yIEJRMjd4eHggZGV2aWNlcwotICovCi0KLXN0YXRpYyBpbmxpbmUgaW50IGJxMjd4eHhfcmVhZChzdHJ1Y3QgYnEyN3h4eF9kZXZpY2VfaW5mbyAqZGksIGludCByZWdfaW5kZXgsCi0JCQkgICAgICAgYm9vbCBzaW5nbGUpCi17Ci0JLyogUmVwb3J0cyBFSU5WQUwgZm9yIGludmFsaWQvbWlzc2luZyByZWdpc3RlcnMgKi8KLQlpZiAoIWRpIHx8IGRpLT5yZWdzW3JlZ19pbmRleF0gPT0gSU5WQUxJRF9SRUdfQUREUikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gZGktPmJ1cy5yZWFkKGRpLCBkaS0+cmVnc1tyZWdfaW5kZXhdLCBzaW5nbGUpOwotfQotCi0vKgotICogUmV0dXJuIHRoZSBiYXR0ZXJ5IFN0YXRlLW9mLUNoYXJnZQotICogT3IgPCAwIGlmIHNvbWV0aGluZyBmYWlscy4KLSAqLwotc3RhdGljIGludCBicTI3eHh4X2JhdHRlcnlfcmVhZF9zb2Moc3RydWN0IGJxMjd4eHhfZGV2aWNlX2luZm8gKmRpKQotewotCWludCBzb2M7Ci0KLQlpZiAoZGktPmNoaXAgPT0gQlEyNzAwMCB8fCBkaS0+Y2hpcCA9PSBCUTI3MDEwKQotCQlzb2MgPSBicTI3eHh4X3JlYWQoZGksIEJRMjdYWFhfUkVHX1NPQywgdHJ1ZSk7Ci0JZWxzZQotCQlzb2MgPSBicTI3eHh4X3JlYWQoZGksIEJRMjdYWFhfUkVHX1NPQywgZmFsc2UpOwotCi0JaWYgKHNvYyA8IDApCi0JCWRldl9kYmcoZGktPmRldiwgImVycm9yIHJlYWRpbmcgU3RhdGUtb2YtQ2hhcmdlXG4iKTsKLQotCXJldHVybiBzb2M7Ci19Ci0KLS8qCi0gKiBSZXR1cm4gYSBiYXR0ZXJ5IGNoYXJnZSB2YWx1ZSBpbiDCtUFoCi0gKiBPciA8IDAgaWYgc29tZXRoaW5nIGZhaWxzLgotICovCi1zdGF0aWMgaW50IGJxMjd4eHhfYmF0dGVyeV9yZWFkX2NoYXJnZShzdHJ1Y3QgYnEyN3h4eF9kZXZpY2VfaW5mbyAqZGksIHU4IHJlZykKLXsKLQlpbnQgY2hhcmdlOwotCi0JY2hhcmdlID0gYnEyN3h4eF9yZWFkKGRpLCByZWcsIGZhbHNlKTsKLQlpZiAoY2hhcmdlIDwgMCkgewotCQlkZXZfZGJnKGRpLT5kZXYsICJlcnJvciByZWFkaW5nIGNoYXJnZSByZWdpc3RlciAlMDJ4OiAlZFxuIiwKLQkJCXJlZywgY2hhcmdlKTsKLQkJcmV0dXJuIGNoYXJnZTsKLQl9Ci0KLQlpZiAoZGktPmNoaXAgPT0gQlEyNzAwMCB8fCBkaS0+Y2hpcCA9PSBCUTI3MDEwKQotCQljaGFyZ2UgKj0gQlEyN1hYWF9DVVJSRU5UX0NPTlNUQU5UIC8gQlEyN1hYWF9SUzsKLQllbHNlCi0JCWNoYXJnZSAqPSAxMDAwOwotCi0JcmV0dXJuIGNoYXJnZTsKLX0KLQotLyoKLSAqIFJldHVybiB0aGUgYmF0dGVyeSBOb21pbmFsIGF2YWlsYWJsZSBjYXBhY2l0eSBpbiDCtUFoCi0gKiBPciA8IDAgaWYgc29tZXRoaW5nIGZhaWxzLgotICovCi1zdGF0aWMgaW5saW5lIGludCBicTI3eHh4X2JhdHRlcnlfcmVhZF9uYWMoc3RydWN0IGJxMjd4eHhfZGV2aWNlX2luZm8gKmRpKQotewotCWludCBmbGFnczsKLQotCWlmIChkaS0+Y2hpcCA9PSBCUTI3MDAwIHx8IGRpLT5jaGlwID09IEJRMjcwMTApIHsKLQkJZmxhZ3MgPSBicTI3eHh4X3JlYWQoZGksIEJRMjdYWFhfUkVHX0ZMQUdTLCB0cnVlKTsKLQkJaWYgKGZsYWdzID49IDAgJiYgKGZsYWdzICYgQlEyNzAwMF9GTEFHX0NJKSkKLQkJCXJldHVybiAtRU5PREFUQTsKLQl9Ci0KLQlyZXR1cm4gYnEyN3h4eF9iYXR0ZXJ5X3JlYWRfY2hhcmdlKGRpLCBCUTI3WFhYX1JFR19OQUMpOwotfQotCi0vKgotICogUmV0dXJuIHRoZSBiYXR0ZXJ5IEZ1bGwgQ2hhcmdlIENhcGFjaXR5IGluIMK1QWgKLSAqIE9yIDwgMCBpZiBzb21ldGhpbmcgZmFpbHMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGJxMjd4eHhfYmF0dGVyeV9yZWFkX2ZjYyhzdHJ1Y3QgYnEyN3h4eF9kZXZpY2VfaW5mbyAqZGkpCi17Ci0JcmV0dXJuIGJxMjd4eHhfYmF0dGVyeV9yZWFkX2NoYXJnZShkaSwgQlEyN1hYWF9SRUdfRkNDKTsKLX0KLQotLyoKLSAqIFJldHVybiB0aGUgRGVzaWduIENhcGFjaXR5IGluIMK1QWgKLSAqIE9yIDwgMCBpZiBzb21ldGhpbmcgZmFpbHMuCi0gKi8KLXN0YXRpYyBpbnQgYnEyN3h4eF9iYXR0ZXJ5X3JlYWRfZGNhcChzdHJ1Y3QgYnEyN3h4eF9kZXZpY2VfaW5mbyAqZGkpCi17Ci0JaW50IGRjYXA7Ci0KLQlpZiAoZGktPmNoaXAgPT0gQlEyNzAwMCB8fCBkaS0+Y2hpcCA9PSBCUTI3MDEwKQotCQlkY2FwID0gYnEyN3h4eF9yZWFkKGRpLCBCUTI3WFhYX1JFR19EQ0FQLCB0cnVlKTsKLQllbHNlCi0JCWRjYXAgPSBicTI3eHh4X3JlYWQoZGksIEJRMjdYWFhfUkVHX0RDQVAsIGZhbHNlKTsKLQotCWlmIChkY2FwIDwgMCkgewotCQlkZXZfZGJnKGRpLT5kZXYsICJlcnJvciByZWFkaW5nIGluaXRpYWwgbGFzdCBtZWFzdXJlZCBkaXNjaGFyZ2VcbiIpOwotCQlyZXR1cm4gZGNhcDsKLQl9Ci0KLQlpZiAoZGktPmNoaXAgPT0gQlEyNzAwMCB8fCBkaS0+Y2hpcCA9PSBCUTI3MDEwKQotCQlkY2FwID0gKGRjYXAgPDwgOCkgKiBCUTI3WFhYX0NVUlJFTlRfQ09OU1RBTlQgLyBCUTI3WFhYX1JTOwotCWVsc2UKLQkJZGNhcCAqPSAxMDAwOwotCi0JcmV0dXJuIGRjYXA7Ci19Ci0KLS8qCi0gKiBSZXR1cm4gdGhlIGJhdHRlcnkgQXZhaWxhYmxlIGVuZXJneSBpbiDCtVdoCi0gKiBPciA8IDAgaWYgc29tZXRoaW5nIGZhaWxzLgotICovCi1zdGF0aWMgaW50IGJxMjd4eHhfYmF0dGVyeV9yZWFkX2VuZXJneShzdHJ1Y3QgYnEyN3h4eF9kZXZpY2VfaW5mbyAqZGkpCi17Ci0JaW50IGFlOwotCi0JYWUgPSBicTI3eHh4X3JlYWQoZGksIEJRMjdYWFhfUkVHX0FFLCBmYWxzZSk7Ci0JaWYgKGFlIDwgMCkgewotCQlkZXZfZGJnKGRpLT5kZXYsICJlcnJvciByZWFkaW5nIGF2YWlsYWJsZSBlbmVyZ3lcbiIpOwotCQlyZXR1cm4gYWU7Ci0JfQotCi0JaWYgKGRpLT5jaGlwID09IEJRMjcwMDAgfHwgZGktPmNoaXAgPT0gQlEyNzAxMCkKLQkJYWUgKj0gQlEyN1hYWF9QT1dFUl9DT05TVEFOVCAvIEJRMjdYWFhfUlM7Ci0JZWxzZQotCQlhZSAqPSAxMDAwOwotCi0JcmV0dXJuIGFlOwotfQotCi0vKgotICogUmV0dXJuIHRoZSBiYXR0ZXJ5IHRlbXBlcmF0dXJlIGluIHRlbnRocyBvZiBkZWdyZWUgS2VsdmluCi0gKiBPciA8IDAgaWYgc29tZXRoaW5nIGZhaWxzLgotICovCi1zdGF0aWMgaW50IGJxMjd4eHhfYmF0dGVyeV9yZWFkX3RlbXBlcmF0dXJlKHN0cnVjdCBicTI3eHh4X2RldmljZV9pbmZvICpkaSkKLXsKLQlpbnQgdGVtcDsKLQotCXRlbXAgPSBicTI3eHh4X3JlYWQoZGksIEJRMjdYWFhfUkVHX1RFTVAsIGZhbHNlKTsKLQlpZiAodGVtcCA8IDApIHsKLQkJZGV2X2VycihkaS0+ZGV2LCAiZXJyb3IgcmVhZGluZyB0ZW1wZXJhdHVyZVxuIik7Ci0JCXJldHVybiB0ZW1wOwotCX0KLQotCWlmIChkaS0+Y2hpcCA9PSBCUTI3MDAwIHx8IGRpLT5jaGlwID09IEJRMjcwMTApCi0JCXRlbXAgPSA1ICogdGVtcCAvIDI7Ci0KLQlyZXR1cm4gdGVtcDsKLX0KLQotLyoKLSAqIFJldHVybiB0aGUgYmF0dGVyeSBDeWNsZSBjb3VudCB0b3RhbAotICogT3IgPCAwIGlmIHNvbWV0aGluZyBmYWlscy4KLSAqLwotc3RhdGljIGludCBicTI3eHh4X2JhdHRlcnlfcmVhZF9jeWN0KHN0cnVjdCBicTI3eHh4X2RldmljZV9pbmZvICpkaSkKLXsKLQlpbnQgY3ljdDsKLQotCWN5Y3QgPSBicTI3eHh4X3JlYWQoZGksIEJRMjdYWFhfUkVHX0NZQ1QsIGZhbHNlKTsKLQlpZiAoY3ljdCA8IDApCi0JCWRldl9lcnIoZGktPmRldiwgImVycm9yIHJlYWRpbmcgY3ljbGUgY291bnQgdG90YWxcbiIpOwotCi0JcmV0dXJuIGN5Y3Q7Ci19Ci0KLS8qCi0gKiBSZWFkIGEgdGltZSByZWdpc3Rlci4KLSAqIFJldHVybiA8IDAgaWYgc29tZXRoaW5nIGZhaWxzLgotICovCi1zdGF0aWMgaW50IGJxMjd4eHhfYmF0dGVyeV9yZWFkX3RpbWUoc3RydWN0IGJxMjd4eHhfZGV2aWNlX2luZm8gKmRpLCB1OCByZWcpCi17Ci0JaW50IHR2YWw7Ci0KLQl0dmFsID0gYnEyN3h4eF9yZWFkKGRpLCByZWcsIGZhbHNlKTsKLQlpZiAodHZhbCA8IDApIHsKLQkJZGV2X2RiZyhkaS0+ZGV2LCAiZXJyb3IgcmVhZGluZyB0aW1lIHJlZ2lzdGVyICUwMng6ICVkXG4iLAotCQkJcmVnLCB0dmFsKTsKLQkJcmV0dXJuIHR2YWw7Ci0JfQotCi0JaWYgKHR2YWwgPT0gNjU1MzUpCi0JCXJldHVybiAtRU5PREFUQTsKLQotCXJldHVybiB0dmFsICogNjA7Ci19Ci0KLS8qCi0gKiBSZWFkIGFuIGF2ZXJhZ2UgcG93ZXIgcmVnaXN0ZXIuCi0gKiBSZXR1cm4gPCAwIGlmIHNvbWV0aGluZyBmYWlscy4KLSAqLwotc3RhdGljIGludCBicTI3eHh4X2JhdHRlcnlfcmVhZF9wd3JfYXZnKHN0cnVjdCBicTI3eHh4X2RldmljZV9pbmZvICpkaSkKLXsKLQlpbnQgdHZhbDsKLQotCXR2YWwgPSBicTI3eHh4X3JlYWQoZGksIEJRMjdYWFhfUkVHX0FQLCBmYWxzZSk7Ci0JaWYgKHR2YWwgPCAwKSB7Ci0JCWRldl9lcnIoZGktPmRldiwgImVycm9yIHJlYWRpbmcgYXZlcmFnZSBwb3dlciByZWdpc3RlciAgJTAyeDogJWRcbiIsCi0JCQlCUTI3WFhYX1JFR19BUCwgdHZhbCk7Ci0JCXJldHVybiB0dmFsOwotCX0KLQotCWlmIChkaS0+Y2hpcCA9PSBCUTI3MDAwIHx8IGRpLT5jaGlwID09IEJRMjcwMTApCi0JCXJldHVybiAodHZhbCAqIEJRMjdYWFhfUE9XRVJfQ09OU1RBTlQpIC8gQlEyN1hYWF9SUzsKLQllbHNlCi0JCXJldHVybiB0dmFsOwotfQotCi0vKgotICogUmV0dXJucyB0cnVlIGlmIGEgYmF0dGVyeSBvdmVyIHRlbXBlcmF0dXJlIGNvbmRpdGlvbiBpcyBkZXRlY3RlZAotICovCi1zdGF0aWMgYm9vbCBicTI3eHh4X2JhdHRlcnlfb3ZlcnRlbXAoc3RydWN0IGJxMjd4eHhfZGV2aWNlX2luZm8gKmRpLCB1MTYgZmxhZ3MpCi17Ci0JaWYgKGRpLT5jaGlwID09IEJRMjc1MDAgfHwgZGktPmNoaXAgPT0gQlEyNzU0MSB8fCBkaS0+Y2hpcCA9PSBCUTI3NTQ1KQotCQlyZXR1cm4gZmxhZ3MgJiAoQlEyN1hYWF9GTEFHX09UQyB8IEJRMjdYWFhfRkxBR19PVEQpOwotCWlmIChkaS0+Y2hpcCA9PSBCUTI3NTMwIHx8IGRpLT5jaGlwID09IEJRMjc0MjEpCi0JCXJldHVybiBmbGFncyAmIEJRMjdYWFhfRkxBR19PVDsKLQotCXJldHVybiBmYWxzZTsKLX0KLQotLyoKLSAqIFJldHVybnMgdHJ1ZSBpZiBhIGJhdHRlcnkgdW5kZXIgdGVtcGVyYXR1cmUgY29uZGl0aW9uIGlzIGRldGVjdGVkCi0gKi8KLXN0YXRpYyBib29sIGJxMjd4eHhfYmF0dGVyeV91bmRlcnRlbXAoc3RydWN0IGJxMjd4eHhfZGV2aWNlX2luZm8gKmRpLCB1MTYgZmxhZ3MpCi17Ci0JaWYgKGRpLT5jaGlwID09IEJRMjc1MzAgfHwgZGktPmNoaXAgPT0gQlEyNzQyMSkKLQkJcmV0dXJuIGZsYWdzICYgQlEyN1hYWF9GTEFHX1VUOwotCi0JcmV0dXJuIGZhbHNlOwotfQotCi0vKgotICogUmV0dXJucyB0cnVlIGlmIGEgbG93IHN0YXRlIG9mIGNoYXJnZSBjb25kaXRpb24gaXMgZGV0ZWN0ZWQKLSAqLwotc3RhdGljIGJvb2wgYnEyN3h4eF9iYXR0ZXJ5X2RlYWQoc3RydWN0IGJxMjd4eHhfZGV2aWNlX2luZm8gKmRpLCB1MTYgZmxhZ3MpCi17Ci0JaWYgKGRpLT5jaGlwID09IEJRMjcwMDAgfHwgZGktPmNoaXAgPT0gQlEyNzAxMCkKLQkJcmV0dXJuIGZsYWdzICYgKEJRMjcwMDBfRkxBR19FRFYxIHwgQlEyNzAwMF9GTEFHX0VEVkYpOwotCWVsc2UKLQkJcmV0dXJuIGZsYWdzICYgKEJRMjdYWFhfRkxBR19TT0MxIHwgQlEyN1hYWF9GTEFHX1NPQ0YpOwotfQotCi0vKgotICogUmVhZCBmbGFnIHJlZ2lzdGVyLgotICogUmV0dXJuIDwgMCBpZiBzb21ldGhpbmcgZmFpbHMuCi0gKi8KLXN0YXRpYyBpbnQgYnEyN3h4eF9iYXR0ZXJ5X3JlYWRfaGVhbHRoKHN0cnVjdCBicTI3eHh4X2RldmljZV9pbmZvICpkaSkKLXsKLQlpbnQgZmxhZ3M7Ci0KLQlmbGFncyA9IGJxMjd4eHhfcmVhZChkaSwgQlEyN1hYWF9SRUdfRkxBR1MsIGZhbHNlKTsKLQlpZiAoZmxhZ3MgPCAwKSB7Ci0JCWRldl9lcnIoZGktPmRldiwgImVycm9yIHJlYWRpbmcgZmxhZyByZWdpc3RlcjolZFxuIiwgZmxhZ3MpOwotCQlyZXR1cm4gZmxhZ3M7Ci0JfQotCi0JLyogVW5saWtlbHkgYnV0IGltcG9ydGFudCB0byByZXR1cm4gZmlyc3QgKi8KLQlpZiAodW5saWtlbHkoYnEyN3h4eF9iYXR0ZXJ5X292ZXJ0ZW1wKGRpLCBmbGFncykpKQotCQlyZXR1cm4gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSSEVBVDsKLQlpZiAodW5saWtlbHkoYnEyN3h4eF9iYXR0ZXJ5X3VuZGVydGVtcChkaSwgZmxhZ3MpKSkKLQkJcmV0dXJuIFBPV0VSX1NVUFBMWV9IRUFMVEhfQ09MRDsKLQlpZiAodW5saWtlbHkoYnEyN3h4eF9iYXR0ZXJ5X2RlYWQoZGksIGZsYWdzKSkpCi0JCXJldHVybiBQT1dFUl9TVVBQTFlfSEVBTFRIX0RFQUQ7Ci0KLQlyZXR1cm4gUE9XRVJfU1VQUExZX0hFQUxUSF9HT09EOwotfQotCi12b2lkIGJxMjd4eHhfYmF0dGVyeV91cGRhdGUoc3RydWN0IGJxMjd4eHhfZGV2aWNlX2luZm8gKmRpKQotewotCXN0cnVjdCBicTI3eHh4X3JlZ19jYWNoZSBjYWNoZSA9IHswLCB9OwotCWJvb2wgaGFzX2NpX2ZsYWcgPSBkaS0+Y2hpcCA9PSBCUTI3MDAwIHx8IGRpLT5jaGlwID09IEJRMjcwMTA7Ci0JYm9vbCBoYXNfc2luZ2VfZmxhZyA9IGRpLT5jaGlwID09IEJRMjcwMDAgfHwgZGktPmNoaXAgPT0gQlEyNzAxMDsKLQotCWNhY2hlLmZsYWdzID0gYnEyN3h4eF9yZWFkKGRpLCBCUTI3WFhYX1JFR19GTEFHUywgaGFzX3NpbmdlX2ZsYWcpOwotCWlmICgoY2FjaGUuZmxhZ3MgJiAweGZmKSA9PSAweGZmKQotCQljYWNoZS5mbGFncyA9IC0xOyAvKiByZWFkIGVycm9yICovCi0JaWYgKGNhY2hlLmZsYWdzID49IDApIHsKLQkJY2FjaGUudGVtcGVyYXR1cmUgPSBicTI3eHh4X2JhdHRlcnlfcmVhZF90ZW1wZXJhdHVyZShkaSk7Ci0JCWlmIChoYXNfY2lfZmxhZyAmJiAoY2FjaGUuZmxhZ3MgJiBCUTI3MDAwX0ZMQUdfQ0kpKSB7Ci0JCQlkZXZfaW5mb19vbmNlKGRpLT5kZXYsICJiYXR0ZXJ5IGlzIG5vdCBjYWxpYnJhdGVkISBpZ25vcmluZyBjYXBhY2l0eSB2YWx1ZXNcbiIpOwotCQkJY2FjaGUuY2FwYWNpdHkgPSAtRU5PREFUQTsKLQkJCWNhY2hlLmVuZXJneSA9IC1FTk9EQVRBOwotCQkJY2FjaGUudGltZV90b19lbXB0eSA9IC1FTk9EQVRBOwotCQkJY2FjaGUudGltZV90b19lbXB0eV9hdmcgPSAtRU5PREFUQTsKLQkJCWNhY2hlLnRpbWVfdG9fZnVsbCA9IC1FTk9EQVRBOwotCQkJY2FjaGUuY2hhcmdlX2Z1bGwgPSAtRU5PREFUQTsKLQkJCWNhY2hlLmhlYWx0aCA9IC1FTk9EQVRBOwotCQl9IGVsc2UgewotCQkJaWYgKGRpLT5yZWdzW0JRMjdYWFhfUkVHX1RURV0gIT0gSU5WQUxJRF9SRUdfQUREUikKLQkJCQljYWNoZS50aW1lX3RvX2VtcHR5ID0gYnEyN3h4eF9iYXR0ZXJ5X3JlYWRfdGltZShkaSwgQlEyN1hYWF9SRUdfVFRFKTsKLQkJCWlmIChkaS0+cmVnc1tCUTI3WFhYX1JFR19UVEVDUF0gIT0gSU5WQUxJRF9SRUdfQUREUikKLQkJCQljYWNoZS50aW1lX3RvX2VtcHR5X2F2ZyA9IGJxMjd4eHhfYmF0dGVyeV9yZWFkX3RpbWUoZGksIEJRMjdYWFhfUkVHX1RURUNQKTsKLQkJCWlmIChkaS0+cmVnc1tCUTI3WFhYX1JFR19UVEZdICE9IElOVkFMSURfUkVHX0FERFIpCi0JCQkJY2FjaGUudGltZV90b19mdWxsID0gYnEyN3h4eF9iYXR0ZXJ5X3JlYWRfdGltZShkaSwgQlEyN1hYWF9SRUdfVFRGKTsKLQkJCWNhY2hlLmNoYXJnZV9mdWxsID0gYnEyN3h4eF9iYXR0ZXJ5X3JlYWRfZmNjKGRpKTsKLQkJCWNhY2hlLmNhcGFjaXR5ID0gYnEyN3h4eF9iYXR0ZXJ5X3JlYWRfc29jKGRpKTsKLQkJCWlmIChkaS0+cmVnc1tCUTI3WFhYX1JFR19BRV0gIT0gSU5WQUxJRF9SRUdfQUREUikKLQkJCQljYWNoZS5lbmVyZ3kgPSBicTI3eHh4X2JhdHRlcnlfcmVhZF9lbmVyZ3koZGkpOwotCQkJY2FjaGUuaGVhbHRoID0gYnEyN3h4eF9iYXR0ZXJ5X3JlYWRfaGVhbHRoKGRpKTsKLQkJfQotCQlpZiAoZGktPnJlZ3NbQlEyN1hYWF9SRUdfQ1lDVF0gIT0gSU5WQUxJRF9SRUdfQUREUikKLQkJCWNhY2hlLmN5Y2xlX2NvdW50ID0gYnEyN3h4eF9iYXR0ZXJ5X3JlYWRfY3ljdChkaSk7Ci0JCWlmIChkaS0+cmVnc1tCUTI3WFhYX1JFR19BUF0gIT0gSU5WQUxJRF9SRUdfQUREUikKLQkJCWNhY2hlLnBvd2VyX2F2ZyA9IGJxMjd4eHhfYmF0dGVyeV9yZWFkX3B3cl9hdmcoZGkpOwotCi0JCS8qIFdlIG9ubHkgaGF2ZSB0byByZWFkIGNoYXJnZSBkZXNpZ24gZnVsbCBvbmNlICovCi0JCWlmIChkaS0+Y2hhcmdlX2Rlc2lnbl9mdWxsIDw9IDApCi0JCQlkaS0+Y2hhcmdlX2Rlc2lnbl9mdWxsID0gYnEyN3h4eF9iYXR0ZXJ5X3JlYWRfZGNhcChkaSk7Ci0JfQotCi0JaWYgKGRpLT5jYWNoZS5jYXBhY2l0eSAhPSBjYWNoZS5jYXBhY2l0eSkKLQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGktPmJhdCk7Ci0KLQlpZiAobWVtY21wKCZkaS0+Y2FjaGUsICZjYWNoZSwgc2l6ZW9mKGNhY2hlKSkgIT0gMCkKLQkJZGktPmNhY2hlID0gY2FjaGU7Ci0KLQlkaS0+bGFzdF91cGRhdGUgPSBqaWZmaWVzOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoYnEyN3h4eF9iYXR0ZXJ5X3VwZGF0ZSk7Ci0KLXN0YXRpYyB2b2lkIGJxMjd4eHhfYmF0dGVyeV9wb2xsKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgYnEyN3h4eF9kZXZpY2VfaW5mbyAqZGkgPQotCQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBicTI3eHh4X2RldmljZV9pbmZvLAotCQkJCSAgICAgd29yay53b3JrKTsKLQotCWJxMjd4eHhfYmF0dGVyeV91cGRhdGUoZGkpOwotCi0JaWYgKHBvbGxfaW50ZXJ2YWwgPiAwKQotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRpLT53b3JrLCBwb2xsX2ludGVydmFsICogSFopOwotfQotCi0vKgotICogUmV0dXJuIHRoZSBiYXR0ZXJ5IGF2ZXJhZ2UgY3VycmVudCBpbiDCtUEKLSAqIE5vdGUgdGhhdCBjdXJyZW50IGNhbiBiZSBuZWdhdGl2ZSBzaWduZWQgYXMgd2VsbAotICogT3IgMCBpZiBzb21ldGhpbmcgZmFpbHMuCi0gKi8KLXN0YXRpYyBpbnQgYnEyN3h4eF9iYXR0ZXJ5X2N1cnJlbnQoc3RydWN0IGJxMjd4eHhfZGV2aWNlX2luZm8gKmRpLAotCQkJCSAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCi17Ci0JaW50IGN1cnI7Ci0JaW50IGZsYWdzOwotCi0JY3VyciA9IGJxMjd4eHhfcmVhZChkaSwgQlEyN1hYWF9SRUdfQUksIGZhbHNlKTsKLQlpZiAoY3VyciA8IDApIHsKLQkJZGV2X2VycihkaS0+ZGV2LCAiZXJyb3IgcmVhZGluZyBjdXJyZW50XG4iKTsKLQkJcmV0dXJuIGN1cnI7Ci0JfQotCi0JaWYgKGRpLT5jaGlwID09IEJRMjcwMDAgfHwgZGktPmNoaXAgPT0gQlEyNzAxMCkgewotCQlmbGFncyA9IGJxMjd4eHhfcmVhZChkaSwgQlEyN1hYWF9SRUdfRkxBR1MsIGZhbHNlKTsKLQkJaWYgKGZsYWdzICYgQlEyNzAwMF9GTEFHX0NIR1MpIHsKLQkJCWRldl9kYmcoZGktPmRldiwgIm5lZ2F0aXZlIGN1cnJlbnQhXG4iKTsKLQkJCWN1cnIgPSAtY3VycjsKLQkJfQotCi0JCXZhbC0+aW50dmFsID0gY3VyciAqIEJRMjdYWFhfQ1VSUkVOVF9DT05TVEFOVCAvIEJRMjdYWFhfUlM7Ci0JfSBlbHNlIHsKLQkJLyogT3RoZXIgZ2F1Z2VzIHJldHVybiBzaWduZWQgdmFsdWUgKi8KLQkJdmFsLT5pbnR2YWwgPSAoaW50KSgoczE2KWN1cnIpICogMTAwMDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBicTI3eHh4X2JhdHRlcnlfc3RhdHVzKHN0cnVjdCBicTI3eHh4X2RldmljZV9pbmZvICpkaSwKLQkJCQkgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCi17Ci0JaW50IHN0YXR1czsKLQotCWlmIChkaS0+Y2hpcCA9PSBCUTI3MDAwIHx8IGRpLT5jaGlwID09IEJRMjcwMTApIHsKLQkJaWYgKGRpLT5jYWNoZS5mbGFncyAmIEJRMjcwMDBfRkxBR19GQykKLQkJCXN0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTDsKLQkJZWxzZSBpZiAoZGktPmNhY2hlLmZsYWdzICYgQlEyNzAwMF9GTEFHX0NIR1MpCi0JCQlzdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOwotCQllbHNlIGlmIChwb3dlcl9zdXBwbHlfYW1faV9zdXBwbGllZChkaS0+YmF0KSkKLQkJCXN0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfTk9UX0NIQVJHSU5HOwotCQllbHNlCi0JCQlzdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOwotCX0gZWxzZSB7Ci0JCWlmIChkaS0+Y2FjaGUuZmxhZ3MgJiBCUTI3WFhYX0ZMQUdfRkMpCi0JCQlzdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0ZVTEw7Ci0JCWVsc2UgaWYgKGRpLT5jYWNoZS5mbGFncyAmIEJRMjdYWFhfRkxBR19EU0MpCi0JCQlzdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOwotCQllbHNlCi0JCQlzdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOwotCX0KLQotCXZhbC0+aW50dmFsID0gc3RhdHVzOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYnEyN3h4eF9iYXR0ZXJ5X2NhcGFjaXR5X2xldmVsKHN0cnVjdCBicTI3eHh4X2RldmljZV9pbmZvICpkaSwKLQkJCQkJICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQotewotCWludCBsZXZlbDsKLQotCWlmIChkaS0+Y2hpcCA9PSBCUTI3MDAwIHx8IGRpLT5jaGlwID09IEJRMjcwMTApIHsKLQkJaWYgKGRpLT5jYWNoZS5mbGFncyAmIEJRMjcwMDBfRkxBR19GQykKLQkJCWxldmVsID0gUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX0ZVTEw7Ci0JCWVsc2UgaWYgKGRpLT5jYWNoZS5mbGFncyAmIEJRMjcwMDBfRkxBR19FRFYxKQotCQkJbGV2ZWwgPSBQT1dFUl9TVVBQTFlfQ0FQQUNJVFlfTEVWRUxfTE9XOwotCQllbHNlIGlmIChkaS0+Y2FjaGUuZmxhZ3MgJiBCUTI3MDAwX0ZMQUdfRURWRikKLQkJCWxldmVsID0gUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX0NSSVRJQ0FMOwotCQllbHNlCi0JCQlsZXZlbCA9IFBPV0VSX1NVUFBMWV9DQVBBQ0lUWV9MRVZFTF9OT1JNQUw7Ci0JfSBlbHNlIHsKLQkJaWYgKGRpLT5jYWNoZS5mbGFncyAmIEJRMjdYWFhfRkxBR19GQykKLQkJCWxldmVsID0gUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX0ZVTEw7Ci0JCWVsc2UgaWYgKGRpLT5jYWNoZS5mbGFncyAmIEJRMjdYWFhfRkxBR19TT0MxKQotCQkJbGV2ZWwgPSBQT1dFUl9TVVBQTFlfQ0FQQUNJVFlfTEVWRUxfTE9XOwotCQllbHNlIGlmIChkaS0+Y2FjaGUuZmxhZ3MgJiBCUTI3WFhYX0ZMQUdfU09DRikKLQkJCWxldmVsID0gUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX0NSSVRJQ0FMOwotCQllbHNlCi0JCQlsZXZlbCA9IFBPV0VSX1NVUFBMWV9DQVBBQ0lUWV9MRVZFTF9OT1JNQUw7Ci0JfQotCi0JdmFsLT5pbnR2YWwgPSBsZXZlbDsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogUmV0dXJuIHRoZSBiYXR0ZXJ5IFZvbHRhZ2UgaW4gbWlsbGl2b2x0cwotICogT3IgPCAwIGlmIHNvbWV0aGluZyBmYWlscy4KLSAqLwotc3RhdGljIGludCBicTI3eHh4X2JhdHRlcnlfdm9sdGFnZShzdHJ1Y3QgYnEyN3h4eF9kZXZpY2VfaW5mbyAqZGksCi0JCQkJICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKLXsKLQlpbnQgdm9sdDsKLQotCXZvbHQgPSBicTI3eHh4X3JlYWQoZGksIEJRMjdYWFhfUkVHX1ZPTFQsIGZhbHNlKTsKLQlpZiAodm9sdCA8IDApIHsKLQkJZGV2X2VycihkaS0+ZGV2LCAiZXJyb3IgcmVhZGluZyB2b2x0YWdlXG4iKTsKLQkJcmV0dXJuIHZvbHQ7Ci0JfQotCi0JdmFsLT5pbnR2YWwgPSB2b2x0ICogMTAwMDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJxMjd4eHhfc2ltcGxlX3ZhbHVlKGludCB2YWx1ZSwKLQkJCQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQotewotCWlmICh2YWx1ZSA8IDApCi0JCXJldHVybiB2YWx1ZTsKLQotCXZhbC0+aW50dmFsID0gdmFsdWU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBicTI3eHh4X2JhdHRlcnlfZ2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKLQkJCQkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAotCQkJCQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBicTI3eHh4X2RldmljZV9pbmZvICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwotCi0JbXV0ZXhfbG9jaygmZGktPmxvY2spOwotCWlmICh0aW1lX2lzX2JlZm9yZV9qaWZmaWVzKGRpLT5sYXN0X3VwZGF0ZSArIDUgKiBIWikpIHsKLQkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZkaS0+d29yayk7Ci0JCWJxMjd4eHhfYmF0dGVyeV9wb2xsKCZkaS0+d29yay53b3JrKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZkaS0+bG9jayk7Ci0KLQlpZiAocHNwICE9IFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQgJiYgZGktPmNhY2hlLmZsYWdzIDwgMCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlzd2l0Y2ggKHBzcCkgewotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgotCQlyZXQgPSBicTI3eHh4X2JhdHRlcnlfc3RhdHVzKGRpLCB2YWwpOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XOgotCQlyZXQgPSBicTI3eHh4X2JhdHRlcnlfdm9sdGFnZShkaSwgdmFsKTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOgotCQl2YWwtPmludHZhbCA9IGRpLT5jYWNoZS5mbGFncyA8IDAgPyAwIDogMTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVzoKLQkJcmV0ID0gYnEyN3h4eF9iYXR0ZXJ5X2N1cnJlbnQoZGksIHZhbCk7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFk6Ci0JCXJldCA9IGJxMjd4eHhfc2ltcGxlX3ZhbHVlKGRpLT5jYWNoZS5jYXBhY2l0eSwgdmFsKTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWV9MRVZFTDoKLQkJcmV0ID0gYnEyN3h4eF9iYXR0ZXJ5X2NhcGFjaXR5X2xldmVsKGRpLCB2YWwpOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVA6Ci0JCXJldCA9IGJxMjd4eHhfc2ltcGxlX3ZhbHVlKGRpLT5jYWNoZS50ZW1wZXJhdHVyZSwgdmFsKTsKLQkJaWYgKHJldCA9PSAwKQotCQkJdmFsLT5pbnR2YWwgLT0gMjczMTsgLyogY29udmVydCBkZWNpZGVncmVlIGsgdG8gYyAqLwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRU1QVFlfTk9XOgotCQlyZXQgPSBicTI3eHh4X3NpbXBsZV92YWx1ZShkaS0+Y2FjaGUudGltZV90b19lbXB0eSwgdmFsKTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0VNUFRZX0FWRzoKLQkJcmV0ID0gYnEyN3h4eF9zaW1wbGVfdmFsdWUoZGktPmNhY2hlLnRpbWVfdG9fZW1wdHlfYXZnLCB2YWwpOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRlVMTF9OT1c6Ci0JCXJldCA9IGJxMjd4eHhfc2ltcGxlX3ZhbHVlKGRpLT5jYWNoZS50aW1lX3RvX2Z1bGwsIHZhbCk7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWToKLQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfVEVDSE5PTE9HWV9MSU9OOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9OT1c6Ci0JCXJldCA9IGJxMjd4eHhfc2ltcGxlX3ZhbHVlKGJxMjd4eHhfYmF0dGVyeV9yZWFkX25hYyhkaSksIHZhbCk7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTEw6Ci0JCXJldCA9IGJxMjd4eHhfc2ltcGxlX3ZhbHVlKGRpLT5jYWNoZS5jaGFyZ2VfZnVsbCwgdmFsKTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTF9ERVNJR046Ci0JCXJldCA9IGJxMjd4eHhfc2ltcGxlX3ZhbHVlKGRpLT5jaGFyZ2VfZGVzaWduX2Z1bGwsIHZhbCk7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ1lDTEVfQ09VTlQ6Ci0JCXJldCA9IGJxMjd4eHhfc2ltcGxlX3ZhbHVlKGRpLT5jYWNoZS5jeWNsZV9jb3VudCwgdmFsKTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfTk9XOgotCQlyZXQgPSBicTI3eHh4X3NpbXBsZV92YWx1ZShkaS0+Y2FjaGUuZW5lcmd5LCB2YWwpOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BPV0VSX0FWRzoKLQkJcmV0ID0gYnEyN3h4eF9zaW1wbGVfdmFsdWUoZGktPmNhY2hlLnBvd2VyX2F2ZywgdmFsKTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEg6Ci0JCXJldCA9IGJxMjd4eHhfc2ltcGxlX3ZhbHVlKGRpLT5jYWNoZS5oZWFsdGgsIHZhbCk7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfTUFOVUZBQ1RVUkVSOgotCQl2YWwtPnN0cnZhbCA9IEJRMjdYWFhfTUFOVUZBQ1RVUkVSOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBicTI3eHh4X2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KQotewotCXN0cnVjdCBicTI3eHh4X2RldmljZV9pbmZvICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwotCi0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZkaS0+d29yayk7Ci0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkaS0+d29yaywgMCk7Ci19Ci0KLWludCBicTI3eHh4X2JhdHRlcnlfc2V0dXAoc3RydWN0IGJxMjd4eHhfZGV2aWNlX2luZm8gKmRpKQotewotCXN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyAqcHN5X2Rlc2M7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgcHN5X2NmZyA9IHsgLmRydl9kYXRhID0gZGksIH07Ci0KLQlJTklUX0RFTEFZRURfV09SSygmZGktPndvcmssIGJxMjd4eHhfYmF0dGVyeV9wb2xsKTsKLQltdXRleF9pbml0KCZkaS0+bG9jayk7Ci0JZGktPnJlZ3MgPSBicTI3eHh4X3JlZ3NbZGktPmNoaXBdOwotCi0JcHN5X2Rlc2MgPSBkZXZtX2t6YWxsb2MoZGktPmRldiwgc2l6ZW9mKCpwc3lfZGVzYyksIEdGUF9LRVJORUwpOwotCWlmICghcHN5X2Rlc2MpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcHN5X2Rlc2MtPm5hbWUgPSBkaS0+bmFtZTsKLQlwc3lfZGVzYy0+dHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7Ci0JcHN5X2Rlc2MtPnByb3BlcnRpZXMgPSBicTI3eHh4X2JhdHRlcnlfcHJvcHNbZGktPmNoaXBdLnByb3BzOwotCXBzeV9kZXNjLT5udW1fcHJvcGVydGllcyA9IGJxMjd4eHhfYmF0dGVyeV9wcm9wc1tkaS0+Y2hpcF0uc2l6ZTsKLQlwc3lfZGVzYy0+Z2V0X3Byb3BlcnR5ID0gYnEyN3h4eF9iYXR0ZXJ5X2dldF9wcm9wZXJ0eTsKLQlwc3lfZGVzYy0+ZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCA9IGJxMjd4eHhfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZDsKLQotCWRpLT5iYXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXJfbm9fd3MoZGktPmRldiwgcHN5X2Rlc2MsICZwc3lfY2ZnKTsKLQlpZiAoSVNfRVJSKGRpLT5iYXQpKSB7Ci0JCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBiYXR0ZXJ5XG4iKTsKLQkJcmV0dXJuIFBUUl9FUlIoZGktPmJhdCk7Ci0JfQotCi0JZGV2X2luZm8oZGktPmRldiwgInN1cHBvcnQgdmVyLiAlcyBlbmFibGVkXG4iLCBEUklWRVJfVkVSU0lPTik7Ci0KLQlicTI3eHh4X2JhdHRlcnlfdXBkYXRlKGRpKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoYnEyN3h4eF9iYXR0ZXJ5X3NldHVwKTsKLQotdm9pZCBicTI3eHh4X2JhdHRlcnlfdGVhcmRvd24oc3RydWN0IGJxMjd4eHhfZGV2aWNlX2luZm8gKmRpKQotewotCS8qCi0JICogcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIgY2FsbCBicTI3eHh4X2JhdHRlcnlfZ2V0X3Byb3BlcnR5IHdoaWNoCi0JICogY2FsbCBicTI3eHh4X2JhdHRlcnlfcG9sbC4KLQkgKiBNYWtlIHN1cmUgdGhhdCBicTI3eHh4X2JhdHRlcnlfcG9sbCB3aWxsIG5vdCBjYWxsCi0JICogc2NoZWR1bGVfZGVsYXllZF93b3JrIGFnYWluIGFmdGVyIHVucmVnaXN0ZXIgKHdoaWNoIGNhdXNlIE9PUFMpLgotCSAqLwotCXBvbGxfaW50ZXJ2YWwgPSAwOwotCi0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZkaS0+d29yayk7Ci0KLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihkaS0+YmF0KTsKLQotCW11dGV4X2Rlc3Ryb3koJmRpLT5sb2NrKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGJxMjd4eHhfYmF0dGVyeV90ZWFyZG93bik7Ci0KLXN0YXRpYyBpbnQgYnEyN3h4eF9iYXR0ZXJ5X3BsYXRmb3JtX3JlYWQoc3RydWN0IGJxMjd4eHhfZGV2aWNlX2luZm8gKmRpLCB1OCByZWcsCi0JCQkJCSBib29sIHNpbmdsZSkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkaS0+ZGV2OwotCXN0cnVjdCBicTI3eHh4X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2LT5wbGF0Zm9ybV9kYXRhOwotCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gMzsKLQlpbnQgdXBwZXIsIGxvd2VyOwotCWludCB0ZW1wOwotCi0JaWYgKCFzaW5nbGUpIHsKLQkJLyogTWFrZSBzdXJlIHRoZSB2YWx1ZSBoYXMgbm90IGNoYW5nZWQgaW4gYmV0d2VlbiByZWFkaW5nIHRoZQotCQkgKiBsb3dlciBhbmQgdGhlIHVwcGVyIHBhcnQgKi8KLQkJdXBwZXIgPSBwZGF0YS0+cmVhZChkZXYsIHJlZyArIDEpOwotCQlkbyB7Ci0JCQl0ZW1wID0gdXBwZXI7Ci0JCQlpZiAodXBwZXIgPCAwKQotCQkJCXJldHVybiB1cHBlcjsKLQotCQkJbG93ZXIgPSBwZGF0YS0+cmVhZChkZXYsIHJlZyk7Ci0JCQlpZiAobG93ZXIgPCAwKQotCQkJCXJldHVybiBsb3dlcjsKLQotCQkJdXBwZXIgPSBwZGF0YS0+cmVhZChkZXYsIHJlZyArIDEpOwotCQl9IHdoaWxlICh0ZW1wICE9IHVwcGVyICYmIC0tdGltZW91dCk7Ci0KLQkJaWYgKHRpbWVvdXQgPT0gMCkKLQkJCXJldHVybiAtRUlPOwotCi0JCXJldHVybiAodXBwZXIgPDwgOCkgfCBsb3dlcjsKLQl9Ci0KLQlyZXR1cm4gcGRhdGEtPnJlYWQoZGV2LCByZWcpOwotfQotCi1zdGF0aWMgaW50IGJxMjd4eHhfYmF0dGVyeV9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBicTI3eHh4X2RldmljZV9pbmZvICpkaTsKLQlzdHJ1Y3QgYnEyN3h4eF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCi0JaWYgKCFwZGF0YSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBwbGF0Zm9ybV9kYXRhIHN1cHBsaWVkXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFwZGF0YS0+cmVhZCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBoZHEgcmVhZCBjYWxsYmFjayBzdXBwbGllZFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICghcGRhdGEtPmNoaXApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gZGV2aWNlIHN1cHBsaWVkXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGkgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpkaSksIEdGUF9LRVJORUwpOwotCWlmICghZGkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGkpOwotCi0JZGktPmRldiA9ICZwZGV2LT5kZXY7Ci0JZGktPmNoaXAgPSBwZGF0YS0+Y2hpcDsKLQlkaS0+bmFtZSA9IHBkYXRhLT5uYW1lID86IGRldl9uYW1lKCZwZGV2LT5kZXYpOwotCWRpLT5idXMucmVhZCA9IGJxMjd4eHhfYmF0dGVyeV9wbGF0Zm9ybV9yZWFkOwotCi0JcmV0dXJuIGJxMjd4eHhfYmF0dGVyeV9zZXR1cChkaSk7Ci19Ci0KLXN0YXRpYyBpbnQgYnEyN3h4eF9iYXR0ZXJ5X3BsYXRmb3JtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBicTI3eHh4X2RldmljZV9pbmZvICpkaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JYnEyN3h4eF9iYXR0ZXJ5X3RlYXJkb3duKGRpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBicTI3eHh4X2JhdHRlcnlfcGxhdGZvcm1faWRfdGFibGVbXSA9IHsKLQl7ICJicTI3MDAwLWJhdHRlcnkiLCB9LAotCXsgLyogc2VudGluZWwgKi8gfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGxhdGZvcm0sIGJxMjd4eHhfYmF0dGVyeV9wbGF0Zm9ybV9pZF90YWJsZSk7Ci0KLSNpZmRlZiBDT05GSUdfT0YKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJxMjd4eHhfYmF0dGVyeV9wbGF0Zm9ybV9vZl9tYXRjaF90YWJsZVtdID0gewotCXsgLmNvbXBhdGlibGUgPSAidGksYnEyNzAwMCIgfSwKLQl7fSwKLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBicTI3eHh4X2JhdHRlcnlfcGxhdGZvcm1fb2ZfbWF0Y2hfdGFibGUpOwotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJxMjd4eHhfYmF0dGVyeV9wbGF0Zm9ybV9kcml2ZXIgPSB7Ci0JLnByb2JlCT0gYnEyN3h4eF9iYXR0ZXJ5X3BsYXRmb3JtX3Byb2JlLAotCS5yZW1vdmUgPSBicTI3eHh4X2JhdHRlcnlfcGxhdGZvcm1fcmVtb3ZlLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImJxMjcwMDAtYmF0dGVyeSIsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihicTI3eHh4X2JhdHRlcnlfcGxhdGZvcm1fb2ZfbWF0Y2hfdGFibGUpLAotCX0sCi0JLmlkX3RhYmxlID0gYnEyN3h4eF9iYXR0ZXJ5X3BsYXRmb3JtX2lkX3RhYmxlLAotfTsKLW1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYnEyN3h4eF9iYXR0ZXJ5X3BsYXRmb3JtX2RyaXZlcik7Ci0KLU1PRFVMRV9BTElBUygicGxhdGZvcm06YnEyNzAwMC1iYXR0ZXJ5Iik7Ci0KLU1PRFVMRV9BVVRIT1IoIlJvZG9sZm8gR2lvbWV0dGkgPGdpb21ldHRpQGxpbnV4Lml0PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJCUTI3eHh4IGJhdHRlcnkgbW9uaXRvciBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvZHMyNzYwX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvZHMyNzYwX2JhdHRlcnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBmNzNjYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3Bvd2VyL2RzMjc2MF9iYXR0ZXJ5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NDcgKzAsMCBAQAotLyoKLSAqIERyaXZlciBmb3IgYmF0dGVyaWVzIHdpdGggRFMyNzYwIGNoaXBzIGluc2lkZS4KLSAqCi0gKiBDb3B5cmlnaHQgwqkgMjAwNyBBbnRvbiBWb3JvbnRzb3YKLSAqCSAgICAgICAyMDA0LTIwMDcgTWF0dCBSZWltZXIKLSAqCSAgICAgICAyMDA0IFN6YWJvbGNzIEd5dXJrbwotICoKLSAqIFVzZSBjb25zaXN0ZW50IHdpdGggdGhlIEdOVSBHUEwgaXMgcGVybWl0dGVkLAotICogcHJvdmlkZWQgdGhhdCB0aGlzIGNvcHlyaWdodCBub3RpY2UgaXMKLSAqIHByZXNlcnZlZCBpbiBpdHMgZW50aXJldHkgaW4gYWxsIGNvcGllcyBhbmQgZGVyaXZlZCB3b3Jrcy4KLSAqCi0gKiBBdXRob3I6ICBBbnRvbiBWb3JvbnRzb3YgPGNib3VAbWFpbC5ydT4KLSAqCSAgICBGZWJydWFyeSAyMDA3Ci0gKgotICoJICAgIE1hdHQgUmVpbWVyIDxtcmVpbWVyQHZwb3AubmV0PgotICoJICAgIEFwcmlsIDIwMDQsIDIwMDUsIDIwMDcKLSAqCi0gKgkgICAgU3phYm9sY3MgR3l1cmtvIDxzemFib2xjcy5neXVya29AdGx0Lmh1PgotICoJICAgIFNlcHRlbWJlciAyMDA0Ci0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BtLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgotCi0jaW5jbHVkZSAiLi4vdzEvdzEuaCIKLSNpbmNsdWRlICIuLi93MS9zbGF2ZXMvdzFfZHMyNzYwLmgiCi0KLXN0cnVjdCBkczI3NjBfZGV2aWNlX2luZm8gewotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQotCS8qIERTMjc2MCBkYXRhLCB2YWxpZCBhZnRlciBjYWxsaW5nIGRzMjc2MF9iYXR0ZXJ5X3JlYWRfc3RhdHVzKCkgKi8KLQl1bnNpZ25lZCBsb25nIHVwZGF0ZV90aW1lOwkvKiBqaWZmaWVzIHdoZW4gZGF0YSByZWFkICovCi0JY2hhciByYXdbRFMyNzYwX0RBVEFfU0laRV07CS8qIHJhdyBEUzI3NjAgZGF0YSAqLwotCWludCB2b2x0YWdlX3JhdzsJCS8qIHVuaXRzIG9mIDQuODggbVYgKi8KLQlpbnQgdm9sdGFnZV91VjsJCQkvKiB1bml0cyBvZiDCtVYgKi8KLQlpbnQgY3VycmVudF9yYXc7CQkvKiB1bml0cyBvZiAwLjYyNSBtQSAqLwotCWludCBjdXJyZW50X3VBOwkJCS8qIHVuaXRzIG9mIMK1QSAqLwotCWludCBhY2N1bV9jdXJyZW50X3JhdzsJCS8qIHVuaXRzIG9mIDAuMjUgbUFoICovCi0JaW50IGFjY3VtX2N1cnJlbnRfdUFoOwkJLyogdW5pdHMgb2YgwrVBaCAqLwotCWludCB0ZW1wX3JhdzsJCQkvKiB1bml0cyBvZiAwLjEyNSDCsEMgKi8KLQlpbnQgdGVtcF9DOwkJCS8qIHVuaXRzIG9mIDAuMSDCsEMgKi8KLQlpbnQgcmF0ZWRfY2FwYWNpdHk7CQkvKiB1bml0cyBvZiDCtUFoICovCi0JaW50IHJlbV9jYXBhY2l0eTsJCS8qIHBlcmNlbnRhZ2UgKi8KLQlpbnQgZnVsbF9hY3RpdmVfdUFoOwkJLyogdW5pdHMgb2YgwrVBaCAqLwotCWludCBlbXB0eV91QWg7CQkJLyogdW5pdHMgb2YgwrVBaCAqLwotCWludCBsaWZlX3NlYzsJCQkvKiB1bml0cyBvZiBzZWNvbmRzICovCi0JaW50IGNoYXJnZV9zdGF0dXM7CQkvKiBQT1dFUl9TVVBQTFlfU1RBVFVTXyogKi8KLQotCWludCBmdWxsX2NvdW50ZXI7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0OwotCXN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBiYXRfZGVzYzsKLQlzdHJ1Y3QgZGV2aWNlICp3MV9kZXY7Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKm1vbml0b3Jfd3F1ZXVlOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgbW9uaXRvcl93b3JrOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgc2V0X2NoYXJnZWRfd29yazsKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY2FjaGVfdGltZSA9IDEwMDA7Ci1tb2R1bGVfcGFyYW0oY2FjaGVfdGltZSwgdWludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGNhY2hlX3RpbWUsICJjYWNoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyIpOwotCi1zdGF0aWMgYm9vbCBwbW9kX2VuYWJsZWQ7Ci1tb2R1bGVfcGFyYW0ocG1vZF9lbmFibGVkLCBib29sLCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MocG1vZF9lbmFibGVkLCAiUE1PRCBlbmFibGUgYml0Iik7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgcmF0ZWRfY2FwYWNpdHk7Ci1tb2R1bGVfcGFyYW0ocmF0ZWRfY2FwYWNpdHksIHVpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhyYXRlZF9jYXBhY2l0eSwgInJhdGVkIGJhdHRlcnkgY2FwYWNpdHksIDEwKm1BaCBvciBpbmRleCIpOwotCi1zdGF0aWMgdW5zaWduZWQgaW50IGN1cnJlbnRfYWNjdW07Ci1tb2R1bGVfcGFyYW0oY3VycmVudF9hY2N1bSwgdWludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGN1cnJlbnRfYWNjdW0sICJjdXJyZW50IGFjY3VtdWxhdG9yIHZhbHVlIik7Ci0KLS8qIFNvbWUgYmF0dGVyaWVzIGhhdmUgdGhlaXIgcmF0ZWQgY2FwYWNpdHkgc3RvcmVkIGEgTiAqIDEwIG1BaCwgd2hpbGUKLSAqIG90aGVycyB1c2UgYW4gaW5kZXggaW50byB0aGlzIHRhYmxlLiAqLwotc3RhdGljIGludCByYXRlZF9jYXBhY2l0aWVzW10gPSB7Ci0JMCwKLQk5MjAsCS8qIFNhbXN1bmcgKi8KLQk5MjAsCS8qIEJZRCAqLwotCTkyMCwJLyogTGlzaGVuICovCi0JOTIwLAkvKiBORUMgKi8KLQkxNDQwLAkvKiBTYW1zdW5nICovCi0JMTQ0MCwJLyogQllEICovCi0jaWZkZWYgQ09ORklHX01BQ0hfSDQ3MDAKLQkxODAwLAkvKiBIUCBpUEFRIGh4NDcwMCAzLjdWIDE4MDBtQWggKDM1OTExMy0wMDEpICovCi0jZWxzZQotCTE0NDAsCS8qIExpc2hlbiAqLwotI2VuZGlmCi0JMTQ0MCwJLyogTkVDICovCi0JMjg4MCwJLyogU2Ftc3VuZyAqLwotCTI4ODAsCS8qIEJZRCAqLwotCTI4ODAsCS8qIExpc2hlbiAqLwotCTI4ODAsCS8qIE5FQyAqLwotI2lmZGVmIENPTkZJR19NQUNIX0g0NzAwCi0JMCwKLQkzNjAwLAkvKiBIUCBpUEFRIGh4NDcwMCAzLjdWIDM2MDBtQWggKDM1OTExNC0wMDEpICovCi0jZW5kaWYKLX07Ci0KLS8qIGFycmF5IGlzIGxldmVsIGF0IHRlbXBzIDDCsEMsIDEwwrBDLCAyMMKwQywgMzDCsEMsIDQwwrBDCi0gKiB0ZW1wIGlzIGluIENlbHNpdXMgKi8KLXN0YXRpYyBpbnQgYmF0dGVyeV9pbnRlcnBvbGF0ZShpbnQgYXJyYXlbXSwgaW50IHRlbXApCi17Ci0JaW50IGluZGV4LCBkdDsKLQotCWlmICh0ZW1wIDw9IDApCi0JCXJldHVybiBhcnJheVswXTsKLQlpZiAodGVtcCA+PSA0MCkKLQkJcmV0dXJuIGFycmF5WzRdOwotCi0JaW5kZXggPSB0ZW1wIC8gMTA7Ci0JZHQgICAgPSB0ZW1wICUgMTA7Ci0KLQlyZXR1cm4gYXJyYXlbaW5kZXhdICsgKCgoYXJyYXlbaW5kZXggKyAxXSAtIGFycmF5W2luZGV4XSkgKiBkdCkgLyAxMCk7Ci19Ci0KLXN0YXRpYyBpbnQgZHMyNzYwX2JhdHRlcnlfcmVhZF9zdGF0dXMoc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbyAqZGkpCi17Ci0JaW50IHJldCwgaSwgc3RhcnQsIGNvdW50LCBzY2FsZVs1XTsKLQotCWlmIChkaS0+dXBkYXRlX3RpbWUgJiYgdGltZV9iZWZvcmUoamlmZmllcywgZGktPnVwZGF0ZV90aW1lICsKLQkJCQkJICAgbXNlY3NfdG9famlmZmllcyhjYWNoZV90aW1lKSkpCi0JCXJldHVybiAwOwotCi0JLyogVGhlIGZpcnN0IHRpbWUgd2UgcmVhZCB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIFNSQU0vRUVQUk9NLAotCSAqIGJ1dCBhZnRlciB0aGF0IHdlIGp1c3QgcmVhZCB0aGUgaW50ZXJlc3RpbmcgYml0cyB0aGF0IGNoYW5nZS4gKi8KLQlpZiAoZGktPnVwZGF0ZV90aW1lID09IDApIHsKLQkJc3RhcnQgPSAwOwotCQljb3VudCA9IERTMjc2MF9EQVRBX1NJWkU7Ci0JfSBlbHNlIHsKLQkJc3RhcnQgPSBEUzI3NjBfVk9MVEFHRV9NU0I7Ci0JCWNvdW50ID0gRFMyNzYwX1RFTVBfTFNCIC0gc3RhcnQgKyAxOwotCX0KLQotCXJldCA9IHcxX2RzMjc2MF9yZWFkKGRpLT53MV9kZXYsIGRpLT5yYXcgKyBzdGFydCwgc3RhcnQsIGNvdW50KTsKLQlpZiAocmV0ICE9IGNvdW50KSB7Ci0JCWRldl93YXJuKGRpLT5kZXYsICJjYWxsIHRvIHcxX2RzMjc2MF9yZWFkIGZhaWxlZCAoMHglcClcbiIsCi0JCQkgZGktPncxX2Rldik7Ci0JCXJldHVybiAxOwotCX0KLQotCWRpLT51cGRhdGVfdGltZSA9IGppZmZpZXM7Ci0KLQkvKiBEUzI3NjAgcmVwb3J0cyB2b2x0YWdlIGluIHVuaXRzIG9mIDQuODhtViwgYnV0IHRoZSBiYXR0ZXJ5IGNsYXNzCi0JICogcmVwb3J0cyBpbiB1bml0cyBvZiB1Viwgc28gY29udmVydCBieSBtdWx0aXBseWluZyBieSA0ODgwLiAqLwotCWRpLT52b2x0YWdlX3JhdyA9IChkaS0+cmF3W0RTMjc2MF9WT0xUQUdFX01TQl0gPDwgMykgfAotCQkJICAoZGktPnJhd1tEUzI3NjBfVk9MVEFHRV9MU0JdID4+IDUpOwotCWRpLT52b2x0YWdlX3VWID0gZGktPnZvbHRhZ2VfcmF3ICogNDg4MDsKLQotCS8qIERTMjc2MCByZXBvcnRzIGN1cnJlbnQgaW4gc2lnbmVkIHVuaXRzIG9mIDAuNjI1bUEsIGJ1dCB0aGUgYmF0dGVyeQotCSAqIGNsYXNzIHJlcG9ydHMgaW4gdW5pdHMgb2YgwrVBLCBzbyBjb252ZXJ0IGJ5IG11bHRpcGx5aW5nIGJ5IDYyNS4gKi8KLQlkaS0+Y3VycmVudF9yYXcgPQotCSAgICAoKChzaWduZWQgY2hhcilkaS0+cmF3W0RTMjc2MF9DVVJSRU5UX01TQl0pIDw8IDUpIHwKLQkJCSAgKGRpLT5yYXdbRFMyNzYwX0NVUlJFTlRfTFNCXSA+PiAzKTsKLQlkaS0+Y3VycmVudF91QSA9IGRpLT5jdXJyZW50X3JhdyAqIDYyNTsKLQotCS8qIERTMjc2MCByZXBvcnRzIGFjY3VtdWxhdGVkIGN1cnJlbnQgaW4gc2lnbmVkIHVuaXRzIG9mIDAuMjVtQWguICovCi0JZGktPmFjY3VtX2N1cnJlbnRfcmF3ID0KLQkgICAgKCgoc2lnbmVkIGNoYXIpZGktPnJhd1tEUzI3NjBfQ1VSUkVOVF9BQ0NVTV9NU0JdKSA8PCA4KSB8Ci0JCQkgICBkaS0+cmF3W0RTMjc2MF9DVVJSRU5UX0FDQ1VNX0xTQl07Ci0JZGktPmFjY3VtX2N1cnJlbnRfdUFoID0gZGktPmFjY3VtX2N1cnJlbnRfcmF3ICogMjUwOwotCi0JLyogRFMyNzYwIHJlcG9ydHMgdGVtcGVyYXR1cmUgaW4gc2lnbmVkIHVuaXRzIG9mIDAuMTI1wrBDLCBidXQgdGhlCi0JICogYmF0dGVyeSBjbGFzcyByZXBvcnRzIGluIHVuaXRzIG9mIDEvMTAgwrBDLCBzbyB3ZSBjb252ZXJ0IGJ5Ci0JICogbXVsdGlwbHlpbmcgYnkgLjEyNSAqIDEwID0gMS4yNS4gKi8KLQlkaS0+dGVtcF9yYXcgPSAoKChzaWduZWQgY2hhcilkaS0+cmF3W0RTMjc2MF9URU1QX01TQl0pIDw8IDMpIHwKLQkJCQkgICAgIChkaS0+cmF3W0RTMjc2MF9URU1QX0xTQl0gPj4gNSk7Ci0JZGktPnRlbXBfQyA9IGRpLT50ZW1wX3JhdyArIChkaS0+dGVtcF9yYXcgLyA0KTsKLQotCS8qIEF0IGxlYXN0IHNvbWUgYmF0dGVyeSBtb25pdG9ycyAoZS5nLiBIUCBpUEFRKSBzdG9yZSB0aGUgYmF0dGVyeSdzCi0JICogbWF4aW11bSByYXRlZCBjYXBhY2l0eS4gKi8KLQlpZiAoZGktPnJhd1tEUzI3NjBfUkFURURfQ0FQQUNJVFldIDwgQVJSQVlfU0laRShyYXRlZF9jYXBhY2l0aWVzKSkKLQkJZGktPnJhdGVkX2NhcGFjaXR5ID0gcmF0ZWRfY2FwYWNpdGllc1sKLQkJCSh1bnNpZ25lZCBpbnQpZGktPnJhd1tEUzI3NjBfUkFURURfQ0FQQUNJVFldXTsKLQllbHNlCi0JCWRpLT5yYXRlZF9jYXBhY2l0eSA9IGRpLT5yYXdbRFMyNzYwX1JBVEVEX0NBUEFDSVRZXSAqIDEwOwotCi0JZGktPnJhdGVkX2NhcGFjaXR5ICo9IDEwMDA7IC8qIGNvbnZlcnQgdG8gwrVBaCAqLwotCi0JLyogQ2FsY3VsYXRlIHRoZSBmdWxsIGxldmVsIGF0IHRoZSBwcmVzZW50IHRlbXBlcmF0dXJlLiAqLwotCWRpLT5mdWxsX2FjdGl2ZV91QWggPSBkaS0+cmF3W0RTMjc2MF9BQ1RJVkVfRlVMTF0gPDwgOCB8Ci0JCQkgICAgICBkaS0+cmF3W0RTMjc2MF9BQ1RJVkVfRlVMTCArIDFdOwotCi0JLyogSWYgdGhlIGZ1bGxfYWN0aXZlX3VBaCB2YWx1ZSBpcyBub3QgZ2l2ZW4sIGZhbGwgYmFjayB0byB0aGUgcmF0ZWQKLQkgKiBjYXBhY2l0eS4gVGhpcyBpcyBsaWtlbHkgdG8gaGFwcGVuIHdoZW4gY2hpcHMgYXJlIG5vdCBwYXJ0IG9mIHRoZQotCSAqIGJhdHRlcnkgcGFjayBhbmQgaXMgdGhlcmVmb3JlIG5vdCBib290c3RyYXBwZWQuICovCi0JaWYgKGRpLT5mdWxsX2FjdGl2ZV91QWggPT0gMCkKLQkJZGktPmZ1bGxfYWN0aXZlX3VBaCA9IGRpLT5yYXRlZF9jYXBhY2l0eSAvIDEwMDBMOwotCi0Jc2NhbGVbMF0gPSBkaS0+ZnVsbF9hY3RpdmVfdUFoOwotCWZvciAoaSA9IDE7IGkgPCA1OyBpKyspCi0JCXNjYWxlW2ldID0gc2NhbGVbaSAtIDFdICsgZGktPnJhd1tEUzI3NjBfQUNUSVZFX0ZVTEwgKyAxICsgaV07Ci0KLQlkaS0+ZnVsbF9hY3RpdmVfdUFoID0gYmF0dGVyeV9pbnRlcnBvbGF0ZShzY2FsZSwgZGktPnRlbXBfQyAvIDEwKTsKLQlkaS0+ZnVsbF9hY3RpdmVfdUFoICo9IDEwMDA7IC8qIGNvbnZlcnQgdG8gwrVBaCAqLwotCi0JLyogQ2FsY3VsYXRlIHRoZSBlbXB0eSBsZXZlbCBhdCB0aGUgcHJlc2VudCB0ZW1wZXJhdHVyZS4gKi8KLQlzY2FsZVs0XSA9IGRpLT5yYXdbRFMyNzYwX0FDVElWRV9FTVBUWSArIDRdOwotCWZvciAoaSA9IDM7IGkgPj0gMDsgaS0tKQotCQlzY2FsZVtpXSA9IHNjYWxlW2kgKyAxXSArIGRpLT5yYXdbRFMyNzYwX0FDVElWRV9FTVBUWSArIGldOwotCi0JZGktPmVtcHR5X3VBaCA9IGJhdHRlcnlfaW50ZXJwb2xhdGUoc2NhbGUsIGRpLT50ZW1wX0MgLyAxMCk7Ci0JZGktPmVtcHR5X3VBaCAqPSAxMDAwOyAvKiBjb252ZXJ0IHRvIMK1QWggKi8KLQotCWlmIChkaS0+ZnVsbF9hY3RpdmVfdUFoID09IGRpLT5lbXB0eV91QWgpCi0JCWRpLT5yZW1fY2FwYWNpdHkgPSAwOwotCWVsc2UKLQkJLyogRnJvbSBNYXhpbSBBcHBsaWNhdGlvbiBOb3RlIDEzMTogcmVtYWluaW5nIGNhcGFjaXR5ID0KLQkJICogKChJQ0EgLSBFbXB0eSBWYWx1ZSkgLyAoRnVsbCBWYWx1ZSAtIEVtcHR5IFZhbHVlKSkgeCAxMDAlICovCi0JCWRpLT5yZW1fY2FwYWNpdHkgPSAoKGRpLT5hY2N1bV9jdXJyZW50X3VBaCAtIGRpLT5lbXB0eV91QWgpICogMTAwTCkgLwotCQkJCSAgICAoZGktPmZ1bGxfYWN0aXZlX3VBaCAtIGRpLT5lbXB0eV91QWgpOwotCi0JaWYgKGRpLT5yZW1fY2FwYWNpdHkgPCAwKQotCQlkaS0+cmVtX2NhcGFjaXR5ID0gMDsKLQlpZiAoZGktPnJlbV9jYXBhY2l0eSA+IDEwMCkKLQkJZGktPnJlbV9jYXBhY2l0eSA9IDEwMDsKLQotCWlmIChkaS0+Y3VycmVudF91QSA8IC0xMDBMKQotCQlkaS0+bGlmZV9zZWMgPSAtKChkaS0+YWNjdW1fY3VycmVudF91QWggLSBkaS0+ZW1wdHlfdUFoKSAqIDM2TCkKLQkJCQkJLyAoZGktPmN1cnJlbnRfdUEgLyAxMDBMKTsKLQllbHNlCi0JCWRpLT5saWZlX3NlYyA9IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZHMyNzYwX2JhdHRlcnlfc2V0X2N1cnJlbnRfYWNjdW0oc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbyAqZGksCi0JCQkJCSAgICAgdW5zaWduZWQgaW50IGFjcl92YWwpCi17Ci0JdW5zaWduZWQgY2hhciBhY3JbMl07Ci0KLQkvKiBhY3IgaXMgaW4gdW5pdHMgb2YgMC4yNSBtQWggKi8KLQlhY3JfdmFsICo9IDRMOwotCWFjcl92YWwgLz0gMTAwMDsKLQotCWFjclswXSA9IGFjcl92YWwgPj4gODsKLQlhY3JbMV0gPSBhY3JfdmFsICYgMHhmZjsKLQotCWlmICh3MV9kczI3NjBfd3JpdGUoZGktPncxX2RldiwgYWNyLCBEUzI3NjBfQ1VSUkVOVF9BQ0NVTV9NU0IsIDIpIDwgMikKLQkJZGV2X3dhcm4oZGktPmRldiwgIkFDUiB3cml0ZSBmYWlsZWRcbiIpOwotfQotCi1zdGF0aWMgdm9pZCBkczI3NjBfYmF0dGVyeV91cGRhdGVfc3RhdHVzKHN0cnVjdCBkczI3NjBfZGV2aWNlX2luZm8gKmRpKQotewotCWludCBvbGRfY2hhcmdlX3N0YXR1cyA9IGRpLT5jaGFyZ2Vfc3RhdHVzOwotCi0JZHMyNzYwX2JhdHRlcnlfcmVhZF9zdGF0dXMoZGkpOwotCi0JaWYgKGRpLT5jaGFyZ2Vfc3RhdHVzID09IFBPV0VSX1NVUFBMWV9TVEFUVVNfVU5LTk9XTikKLQkJZGktPmZ1bGxfY291bnRlciA9IDA7Ci0KLQlpZiAocG93ZXJfc3VwcGx5X2FtX2lfc3VwcGxpZWQoZGktPmJhdCkpIHsKLQkJaWYgKGRpLT5jdXJyZW50X3VBID4gMTAwMDApIHsKLQkJCWRpLT5jaGFyZ2Vfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKLQkJCWRpLT5mdWxsX2NvdW50ZXIgPSAwOwotCQl9IGVsc2UgaWYgKGRpLT5jdXJyZW50X3VBIDwgLTUwMDApIHsKLQkJCWlmIChkaS0+Y2hhcmdlX3N0YXR1cyAhPSBQT1dFUl9TVVBQTFlfU1RBVFVTX05PVF9DSEFSR0lORykKLQkJCQlkZXZfbm90aWNlKGRpLT5kZXYsICJub3QgZW5vdWdoIHBvd2VyIHRvICIKLQkJCQkJICAgImNoYXJnZVxuIik7Ci0JCQlkaS0+Y2hhcmdlX3N0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfTk9UX0NIQVJHSU5HOwotCQkJZGktPmZ1bGxfY291bnRlciA9IDA7Ci0JCX0gZWxzZSBpZiAoZGktPmN1cnJlbnRfdUEgPCAxMDAwMCAmJgotCQkJICAgIGRpLT5jaGFyZ2Vfc3RhdHVzICE9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTCkgewotCi0JCQkvKiBEb24ndCBjb25zaWRlciB0aGUgYmF0dGVyeSB0byBiZSBmdWxsIHVubGVzcwotCQkJICogd2UndmUgc2VlbiB0aGUgY3VycmVudCA8IDEwIG1BIGF0IGxlYXN0IHR3bwotCQkJICogY29uc2VjdXRpdmUgdGltZXMuICovCi0KLQkJCWRpLT5mdWxsX2NvdW50ZXIrKzsKLQotCQkJaWYgKGRpLT5mdWxsX2NvdW50ZXIgPCAyKSB7Ci0JCQkJZGktPmNoYXJnZV9zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOwotCQkJfSBlbHNlIHsKLQkJCQlkaS0+Y2hhcmdlX3N0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTDsKLQkJCQlkczI3NjBfYmF0dGVyeV9zZXRfY3VycmVudF9hY2N1bShkaSwKLQkJCQkJCWRpLT5mdWxsX2FjdGl2ZV91QWgpOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJZGktPmNoYXJnZV9zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOwotCQlkaS0+ZnVsbF9jb3VudGVyID0gMDsKLQl9Ci0KLQlpZiAoZGktPmNoYXJnZV9zdGF0dXMgIT0gb2xkX2NoYXJnZV9zdGF0dXMpCi0JCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5iYXQpOwotfQotCi1zdGF0aWMgdm9pZCBkczI3NjBfYmF0dGVyeV93cml0ZV9zdGF0dXMoc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbyAqZGksCi0JCQkJCWNoYXIgc3RhdHVzKQotewotCWlmIChzdGF0dXMgPT0gZGktPnJhd1tEUzI3NjBfU1RBVFVTX1JFR10pCi0JCXJldHVybjsKLQotCXcxX2RzMjc2MF93cml0ZShkaS0+dzFfZGV2LCAmc3RhdHVzLCBEUzI3NjBfU1RBVFVTX1dSSVRFX1JFRywgMSk7Ci0JdzFfZHMyNzYwX3N0b3JlX2VlcHJvbShkaS0+dzFfZGV2LCBEUzI3NjBfRUVQUk9NX0JMT0NLMSk7Ci0JdzFfZHMyNzYwX3JlY2FsbF9lZXByb20oZGktPncxX2RldiwgRFMyNzYwX0VFUFJPTV9CTE9DSzEpOwotfQotCi1zdGF0aWMgdm9pZCBkczI3NjBfYmF0dGVyeV93cml0ZV9yYXRlZF9jYXBhY2l0eShzdHJ1Y3QgZHMyNzYwX2RldmljZV9pbmZvICpkaSwKLQkJCQkJCXVuc2lnbmVkIGNoYXIgcmF0ZWRfY2FwYWNpdHkpCi17Ci0JaWYgKHJhdGVkX2NhcGFjaXR5ID09IGRpLT5yYXdbRFMyNzYwX1JBVEVEX0NBUEFDSVRZXSkKLQkJcmV0dXJuOwotCi0JdzFfZHMyNzYwX3dyaXRlKGRpLT53MV9kZXYsICZyYXRlZF9jYXBhY2l0eSwgRFMyNzYwX1JBVEVEX0NBUEFDSVRZLCAxKTsKLQl3MV9kczI3NjBfc3RvcmVfZWVwcm9tKGRpLT53MV9kZXYsIERTMjc2MF9FRVBST01fQkxPQ0sxKTsKLQl3MV9kczI3NjBfcmVjYWxsX2VlcHJvbShkaS0+dzFfZGV2LCBEUzI3NjBfRUVQUk9NX0JMT0NLMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRzMjc2MF9iYXR0ZXJ5X3dyaXRlX2FjdGl2ZV9mdWxsKHN0cnVjdCBkczI3NjBfZGV2aWNlX2luZm8gKmRpLAotCQkJCQkgICAgIGludCBhY3RpdmVfZnVsbCkKLXsKLQl1bnNpZ25lZCBjaGFyIHRtcFsyXSA9IHsKLQkJYWN0aXZlX2Z1bGwgPj4gOCwKLQkJYWN0aXZlX2Z1bGwgJiAweGZmCi0JfTsKLQotCWlmICh0bXBbMF0gPT0gZGktPnJhd1tEUzI3NjBfQUNUSVZFX0ZVTExdICYmCi0JICAgIHRtcFsxXSA9PSBkaS0+cmF3W0RTMjc2MF9BQ1RJVkVfRlVMTCArIDFdKQotCQlyZXR1cm47Ci0KLQl3MV9kczI3NjBfd3JpdGUoZGktPncxX2RldiwgdG1wLCBEUzI3NjBfQUNUSVZFX0ZVTEwsIHNpemVvZih0bXApKTsKLQl3MV9kczI3NjBfc3RvcmVfZWVwcm9tKGRpLT53MV9kZXYsIERTMjc2MF9FRVBST01fQkxPQ0swKTsKLQl3MV9kczI3NjBfcmVjYWxsX2VlcHJvbShkaS0+dzFfZGV2LCBEUzI3NjBfRUVQUk9NX0JMT0NLMCk7Ci0KLQkvKiBXcml0ZSB0byB0aGUgZGktPnJhd1tdIGJ1ZmZlciBkaXJlY3RseSAtIHRoZSBEUzI3NjBfQUNUSVZFX0ZVTEwKLQkgKiB2YWx1ZXMgd29uJ3QgYmUgcmVhZCBiYWNrIGJ5IGRzMjc2MF9iYXR0ZXJ5X3JlYWRfc3RhdHVzKCkgKi8KLQlkaS0+cmF3W0RTMjc2MF9BQ1RJVkVfRlVMTF0gPSB0bXBbMF07Ci0JZGktPnJhd1tEUzI3NjBfQUNUSVZFX0ZVTEwgKyAxXSA9IHRtcFsxXTsKLX0KLQotc3RhdGljIHZvaWQgZHMyNzYwX2JhdHRlcnlfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbyAqZGkgPSBjb250YWluZXJfb2Yod29yaywKLQkJc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbywgbW9uaXRvcl93b3JrLndvcmspOwotCWNvbnN0IGludCBpbnRlcnZhbCA9IEhaICogNjA7Ci0KLQlkZXZfZGJnKGRpLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwotCi0JZHMyNzYwX2JhdHRlcnlfdXBkYXRlX3N0YXR1cyhkaSk7Ci0JcXVldWVfZGVsYXllZF93b3JrKGRpLT5tb25pdG9yX3dxdWV1ZSwgJmRpLT5tb25pdG9yX3dvcmssIGludGVydmFsKTsKLX0KLQotc3RhdGljIHZvaWQgZHMyNzYwX2JhdHRlcnlfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kpCi17Ci0Jc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbyAqZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKLQotCWRldl9kYmcoZGktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQltb2RfZGVsYXllZF93b3JrKGRpLT5tb25pdG9yX3dxdWV1ZSwgJmRpLT5tb25pdG9yX3dvcmssIEhaLzEwKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBkczI3NjBfYmF0dGVyeV9zZXRfY2hhcmdlZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQljaGFyIGJpYXM7Ci0Jc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbyAqZGkgPSBjb250YWluZXJfb2Yod29yaywKLQkJc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbywgc2V0X2NoYXJnZWRfd29yay53b3JrKTsKLQotCWRldl9kYmcoZGktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlkczI3NjBfYmF0dGVyeV9yZWFkX3N0YXR1cyhkaSk7Ci0KLQkvKiBXaGVuIHdlIGdldCBub3RpZmllZCBieSBleHRlcm5hbCBjaXJjdWl0cnkgdGhhdCB0aGUgYmF0dGVyeSBpcwotCSAqIGNvbnNpZGVyZWQgZnVsbHkgY2hhcmdlZCBub3csIHdlIGtub3cgdGhhdCB0aGVyZSBpcyBubyBjdXJyZW50Ci0JICogZmxvdyBhbnkgbW9yZS4gSG93ZXZlciwgdGhlIGRzMjc2MCdzIGludGVybmFsIGN1cnJlbnQgbWV0ZXIgaXMKLQkgKiB0b28gaW5hY2N1cmF0ZSB0byByZWx5IG9uIC0gc3BlYyBzYXkgc29tZXRoaW5nIH4xNSUgZmFpbHVyZS4KLQkgKiBIZW5jZSwgd2UgdXNlIHRoZSBjdXJyZW50IG9mZnNldCBiaWFzIHJlZ2lzdGVyIHRvIGNvbXBlbnNhdGUKLQkgKiB0aGF0IGVycm9yLgotCSAqLwotCi0JaWYgKCFwb3dlcl9zdXBwbHlfYW1faV9zdXBwbGllZChkaS0+YmF0KSkKLQkJcmV0dXJuOwotCi0JYmlhcyA9IChzaWduZWQgY2hhcikgZGktPmN1cnJlbnRfcmF3ICsKLQkJKHNpZ25lZCBjaGFyKSBkaS0+cmF3W0RTMjc2MF9DVVJSRU5UX09GRlNFVF9CSUFTXTsKLQotCWRldl9kYmcoZGktPmRldiwgIiVzOiBiaWFzID0gJWRcbiIsIF9fZnVuY19fLCBiaWFzKTsKLQotCXcxX2RzMjc2MF93cml0ZShkaS0+dzFfZGV2LCAmYmlhcywgRFMyNzYwX0NVUlJFTlRfT0ZGU0VUX0JJQVMsIDEpOwotCXcxX2RzMjc2MF9zdG9yZV9lZXByb20oZGktPncxX2RldiwgRFMyNzYwX0VFUFJPTV9CTE9DSzEpOwotCXcxX2RzMjc2MF9yZWNhbGxfZWVwcm9tKGRpLT53MV9kZXYsIERTMjc2MF9FRVBST01fQkxPQ0sxKTsKLQotCS8qIFdyaXRlIHRvIHRoZSBkaS0+cmF3W10gYnVmZmVyIGRpcmVjdGx5IC0gdGhlIENVUlJFTlRfT0ZGU0VUX0JJQVMKLQkgKiB2YWx1ZSB3b24ndCBiZSByZWFkIGJhY2sgYnkgZHMyNzYwX2JhdHRlcnlfcmVhZF9zdGF0dXMoKSAqLwotCWRpLT5yYXdbRFMyNzYwX0NVUlJFTlRfT0ZGU0VUX0JJQVNdID0gYmlhczsKLX0KLQotc3RhdGljIHZvaWQgZHMyNzYwX2JhdHRlcnlfc2V0X2NoYXJnZWQoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KQotewotCXN0cnVjdCBkczI3NjBfZGV2aWNlX2luZm8gKmRpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7Ci0KLQkvKiBwb3N0cG9uZSB0aGUgYWN0dWFsIHdvcmsgYnkgMjAgc2Vjcy4gVGhpcyBpcyBmb3IgZGVib3VuY2luZyBHUElPCi0JICogc2lnbmFscyBhbmQgdG8gbGV0IHRoZSBjdXJyZW50IHZhbHVlIHNldHRsZS4gU2VlIEFONDE4OC4gKi8KLQltb2RfZGVsYXllZF93b3JrKGRpLT5tb25pdG9yX3dxdWV1ZSwgJmRpLT5zZXRfY2hhcmdlZF93b3JrLCBIWiAqIDIwKTsKLX0KLQotc3RhdGljIGludCBkczI3NjBfYmF0dGVyeV9nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAotCQkJCSAgICAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCi0JCQkJICAgICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCi17Ci0Jc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbyAqZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKLQotCXN3aXRjaCAocHNwKSB7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6Ci0JCXZhbC0+aW50dmFsID0gZGktPmNoYXJnZV9zdGF0dXM7Ci0JCXJldHVybiAwOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCWRzMjc2MF9iYXR0ZXJ5X3JlYWRfc3RhdHVzKGRpKTsKLQotCXN3aXRjaCAocHNwKSB7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKLQkJdmFsLT5pbnR2YWwgPSBkaS0+dm9sdGFnZV91VjsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVzoKLQkJdmFsLT5pbnR2YWwgPSBkaS0+Y3VycmVudF91QTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTF9ERVNJR046Ci0JCXZhbC0+aW50dmFsID0gZGktPnJhdGVkX2NhcGFjaXR5OwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMOgotCQl2YWwtPmludHZhbCA9IGRpLT5mdWxsX2FjdGl2ZV91QWg7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0VNUFRZOgotCQl2YWwtPmludHZhbCA9IGRpLT5lbXB0eV91QWg7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVzoKLQkJdmFsLT5pbnR2YWwgPSBkaS0+YWNjdW1fY3VycmVudF91QWg7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUDoKLQkJdmFsLT5pbnR2YWwgPSBkaS0+dGVtcF9DOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRU1QVFlfTk9XOgotCQl2YWwtPmludHZhbCA9IGRpLT5saWZlX3NlYzsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWToKLQkJdmFsLT5pbnR2YWwgPSBkaS0+cmVtX2NhcGFjaXR5OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkczI3NjBfYmF0dGVyeV9zZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAotCQkJCSAgICAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCi0JCQkJICAgICAgIGNvbnN0IHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCi17Ci0Jc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbyAqZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKLQotCXN3aXRjaCAocHNwKSB7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTDoKLQkJLyogdGhlIGludGVyZmFjZSBjb3VudHMgaW4gdUFoLCBjb252ZXJ0IHRoZSB2YWx1ZSAqLwotCQlkczI3NjBfYmF0dGVyeV93cml0ZV9hY3RpdmVfZnVsbChkaSwgdmFsLT5pbnR2YWwgLyAxMDAwTCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XOgotCQkvKiBkczI3NjBfYmF0dGVyeV9zZXRfY3VycmVudF9hY2N1bSgpIGRvZXMgdGhlIGNvbnZlcnNpb24gKi8KLQkJZHMyNzYwX2JhdHRlcnlfc2V0X2N1cnJlbnRfYWNjdW0oZGksIHZhbC0+aW50dmFsKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVQRVJNOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGRzMjc2MF9iYXR0ZXJ5X3Byb3BlcnR5X2lzX3dyaXRlYWJsZShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCi0JCQkJCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3ApCi17Ci0Jc3dpdGNoIChwc3ApIHsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMOgotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVzoKLQkJcmV0dXJuIDE7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IGRzMjc2MF9iYXR0ZXJ5X3Byb3BzW10gPSB7Ci0JUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAotCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMX0RFU0lHTiwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRU1QVFksCi0JUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVywKLQlQT1dFUl9TVVBQTFlfUFJPUF9URU1QLAotCVBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRU1QVFlfTk9XLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZLAotfTsKLQotc3RhdGljIGludCBkczI3NjBfYmF0dGVyeV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKLQljaGFyIHN0YXR1czsKLQlpbnQgcmV0dmFsID0gMDsKLQlzdHJ1Y3QgZHMyNzYwX2RldmljZV9pbmZvICpkaTsKLQotCWRpID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZGkpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRpKSB7Ci0JCXJldHZhbCA9IC1FTk9NRU07Ci0JCWdvdG8gZGlfYWxsb2NfZmFpbGVkOwotCX0KLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRpKTsKLQotCWRpLT5kZXYJCQkJPSAmcGRldi0+ZGV2OwotCWRpLT53MV9kZXYJCQk9IHBkZXYtPmRldi5wYXJlbnQ7Ci0JZGktPmJhdF9kZXNjLm5hbWUJCT0gZGV2X25hbWUoJnBkZXYtPmRldik7Ci0JZGktPmJhdF9kZXNjLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKLQlkaS0+YmF0X2Rlc2MucHJvcGVydGllcwkJPSBkczI3NjBfYmF0dGVyeV9wcm9wczsKLQlkaS0+YmF0X2Rlc2MubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKGRzMjc2MF9iYXR0ZXJ5X3Byb3BzKTsKLQlkaS0+YmF0X2Rlc2MuZ2V0X3Byb3BlcnR5CT0gZHMyNzYwX2JhdHRlcnlfZ2V0X3Byb3BlcnR5OwotCWRpLT5iYXRfZGVzYy5zZXRfcHJvcGVydHkJPSBkczI3NjBfYmF0dGVyeV9zZXRfcHJvcGVydHk7Ci0JZGktPmJhdF9kZXNjLnByb3BlcnR5X2lzX3dyaXRlYWJsZSA9Ci0JCQkJICBkczI3NjBfYmF0dGVyeV9wcm9wZXJ0eV9pc193cml0ZWFibGU7Ci0JZGktPmJhdF9kZXNjLnNldF9jaGFyZ2VkCT0gZHMyNzYwX2JhdHRlcnlfc2V0X2NoYXJnZWQ7Ci0JZGktPmJhdF9kZXNjLmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQgPQotCQkJCSAgZHMyNzYwX2JhdHRlcnlfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZDsKLQotCXBzeV9jZmcuZHJ2X2RhdGEJCT0gZGk7Ci0KLQlkaS0+Y2hhcmdlX3N0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfVU5LTk9XTjsKLQotCS8qIGVuYWJsZSBzbGVlcCBtb2RlIGZlYXR1cmUgKi8KLQlkczI3NjBfYmF0dGVyeV9yZWFkX3N0YXR1cyhkaSk7Ci0Jc3RhdHVzID0gZGktPnJhd1tEUzI3NjBfU1RBVFVTX1JFR107Ci0JaWYgKHBtb2RfZW5hYmxlZCkKLQkJc3RhdHVzIHw9IERTMjc2MF9TVEFUVVNfUE1PRDsKLQllbHNlCi0JCXN0YXR1cyAmPSB+RFMyNzYwX1NUQVRVU19QTU9EOwotCi0JZHMyNzYwX2JhdHRlcnlfd3JpdGVfc3RhdHVzKGRpLCBzdGF0dXMpOwotCi0JLyogc2V0IHJhdGVkIGNhcGFjaXR5IGZyb20gbW9kdWxlIHBhcmFtICovCi0JaWYgKHJhdGVkX2NhcGFjaXR5KQotCQlkczI3NjBfYmF0dGVyeV93cml0ZV9yYXRlZF9jYXBhY2l0eShkaSwgcmF0ZWRfY2FwYWNpdHkpOwotCi0JLyogc2V0IGN1cnJlbnQgYWNjdW11bGF0b3IgaWYgZ2l2ZW4gYXMgcGFyYW1ldGVyLgotCSAqIHRoaXMgc2hvdWxkIG9ubHkgYmUgZG9uZSBmb3IgYm9vdHN0cmFwcGluZyB0aGUgdmFsdWUgKi8KLQlpZiAoY3VycmVudF9hY2N1bSkKLQkJZHMyNzYwX2JhdHRlcnlfc2V0X2N1cnJlbnRfYWNjdW0oZGksIGN1cnJlbnRfYWNjdW0pOwotCi0JZGktPmJhdCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmZGktPmJhdF9kZXNjLCAmcHN5X2NmZyk7Ci0JaWYgKElTX0VSUihkaS0+YmF0KSkgewotCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgYmF0dGVyeVxuIik7Ci0JCXJldHZhbCA9IFBUUl9FUlIoZGktPmJhdCk7Ci0JCWdvdG8gYmF0dF9mYWlsZWQ7Ci0JfQotCi0JSU5JVF9ERUxBWUVEX1dPUksoJmRpLT5tb25pdG9yX3dvcmssIGRzMjc2MF9iYXR0ZXJ5X3dvcmspOwotCUlOSVRfREVMQVlFRF9XT1JLKCZkaS0+c2V0X2NoYXJnZWRfd29yaywKLQkJCSAgZHMyNzYwX2JhdHRlcnlfc2V0X2NoYXJnZWRfd29yayk7Ci0JZGktPm1vbml0b3Jfd3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoZGV2X25hbWUoJnBkZXYtPmRldikpOwotCWlmICghZGktPm1vbml0b3Jfd3F1ZXVlKSB7Ci0JCXJldHZhbCA9IC1FU1JDSDsKLQkJZ290byB3b3JrcXVldWVfZmFpbGVkOwotCX0KLQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPm1vbml0b3Jfd3F1ZXVlLCAmZGktPm1vbml0b3Jfd29yaywgSFogKiAxKTsKLQotCWdvdG8gc3VjY2VzczsKLQotd29ya3F1ZXVlX2ZhaWxlZDoKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihkaS0+YmF0KTsKLWJhdHRfZmFpbGVkOgotZGlfYWxsb2NfZmFpbGVkOgotc3VjY2VzczoKLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgaW50IGRzMjc2MF9iYXR0ZXJ5X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBkczI3NjBfZGV2aWNlX2luZm8gKmRpID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0KLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmRpLT5tb25pdG9yX3dvcmspOwotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZGktPnNldF9jaGFyZ2VkX3dvcmspOwotCWRlc3Ryb3lfd29ya3F1ZXVlKGRpLT5tb25pdG9yX3dxdWV1ZSk7Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoZGktPmJhdCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19QTQotCi1zdGF0aWMgaW50IGRzMjc2MF9iYXR0ZXJ5X3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJCQkgIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlzdHJ1Y3QgZHMyNzYwX2RldmljZV9pbmZvICpkaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JZGktPmNoYXJnZV9zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkczI3NjBfYmF0dGVyeV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgZHMyNzYwX2RldmljZV9pbmZvICpkaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JZGktPmNoYXJnZV9zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047Ci0JcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGktPmJhdCk7Ci0KLQltb2RfZGVsYXllZF93b3JrKGRpLT5tb25pdG9yX3dxdWV1ZSwgJmRpLT5tb25pdG9yX3dvcmssIEhaKTsKLQotCXJldHVybiAwOwotfQotCi0jZWxzZQotCi0jZGVmaW5lIGRzMjc2MF9iYXR0ZXJ5X3N1c3BlbmQgTlVMTAotI2RlZmluZSBkczI3NjBfYmF0dGVyeV9yZXN1bWUgTlVMTAotCi0jZW5kaWYgLyogQ09ORklHX1BNICovCi0KLU1PRFVMRV9BTElBUygicGxhdGZvcm06ZHMyNzYwLWJhdHRlcnkiKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZHMyNzYwX2JhdHRlcnlfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImRzMjc2MC1iYXR0ZXJ5IiwKLQl9LAotCS5wcm9iZQkgID0gZHMyNzYwX2JhdHRlcnlfcHJvYmUsCi0JLnJlbW92ZSAgID0gZHMyNzYwX2JhdHRlcnlfcmVtb3ZlLAotCS5zdXNwZW5kICA9IGRzMjc2MF9iYXR0ZXJ5X3N1c3BlbmQsCi0JLnJlc3VtZQkgID0gZHMyNzYwX2JhdHRlcnlfcmVzdW1lLAotfTsKLQotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihkczI3NjBfYmF0dGVyeV9kcml2ZXIpOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJTemFib2xjcyBHeXVya28gPHN6YWJvbGNzLmd5dXJrb0B0bHQuaHU+LCAiCi0JICAgICAgIk1hdHQgUmVpbWVyIDxtcmVpbWVyQHZwb3AubmV0PiwgIgotCSAgICAgICJBbnRvbiBWb3JvbnRzb3YgPGNib3VAbWFpbC5ydT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiZHMyNzYwIGJhdHRlcnkgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2RzMjc4MF9iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL2RzMjc4MF9iYXR0ZXJ5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNzQzZDAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9wb3dlci9kczI3ODBfYmF0dGVyeS5jCisrKyAvZGV2L251bGwKQEAgLTEsODM4ICswLDAgQEAKLS8qCi0gKiAxLXdpcmUgY2xpZW50L2RyaXZlciBmb3IgdGhlIE1heGltL0RhbGxhcyBEUzI3ODAgU3RhbmQtQWxvbmUgRnVlbCBHYXVnZSBJQwotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBJbmRlc2lnbiwgTExDCi0gKgotICogQXV0aG9yOiBDbGlmdG9uIEJhcm5lcyA8Y2FiYXJuZXNAaW5kZXNpZ24tbGxjLmNvbT4KLSAqCi0gKiBCYXNlZCBvbiBkczI3NjBfYmF0dGVyeSBhbmQgZHMyNzgyX2JhdHRlcnkgZHJpdmVycwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9wbS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgotI2luY2x1ZGUgPGxpbnV4L2lkci5oPgotCi0jaW5jbHVkZSAiLi4vdzEvdzEuaCIKLSNpbmNsdWRlICIuLi93MS9zbGF2ZXMvdzFfZHMyNzgwLmgiCi0KLS8qIEN1cnJlbnQgdW5pdCBtZWFzdXJlbWVudCBpbiB1QSBmb3IgYSAxIG1pbGxpLW9obSBzZW5zZSByZXNpc3RvciAqLwotI2RlZmluZSBEUzI3ODBfQ1VSUkVOVF9VTklUUwkxNTYzCi0vKiBDaGFyZ2UgdW5pdCBtZWFzdXJlbWVudCBpbiB1QWggZm9yIGEgMSBtaWxsaS1vaG0gc2Vuc2UgcmVzaXN0b3IgKi8KLSNkZWZpbmUgRFMyNzgwX0NIQVJHRV9VTklUUwkJNjI1MAotLyogTnVtYmVyIG9mIGJ5dGVzIGluIHVzZXIgRUVQUk9NIHNwYWNlICovCi0jZGVmaW5lIERTMjc4MF9VU0VSX0VFUFJPTV9TSVpFCQkoRFMyNzgwX0VFUFJPTV9CTE9DSzBfRU5EIC0gXAotCQkJCQlEUzI3ODBfRUVQUk9NX0JMT0NLMF9TVEFSVCArIDEpCi0vKiBOdW1iZXIgb2YgYnl0ZXMgaW4gcGFyYW1ldGVyIEVFUFJPTSBzcGFjZSAqLwotI2RlZmluZSBEUzI3ODBfUEFSQU1fRUVQUk9NX1NJWkUJKERTMjc4MF9FRVBST01fQkxPQ0sxX0VORCAtIFwKLQkJCQkJRFMyNzgwX0VFUFJPTV9CTE9DSzFfU1RBUlQgKyAxKQotCi1zdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0OwotCXN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBiYXRfZGVzYzsKLQlzdHJ1Y3QgZGV2aWNlICp3MV9kZXY7Ci19OwotCi1lbnVtIGN1cnJlbnRfdHlwZXMgewotCUNVUlJFTlRfTk9XLAotCUNVUlJFTlRfQVZHLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgbW9kZWxbXSA9ICJEUzI3ODAiOwotc3RhdGljIGNvbnN0IGNoYXIgbWFudWZhY3R1cmVyW10gPSAiTWF4aW0vRGFsbGFzIjsKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICoKLXRvX2RzMjc4MF9kZXZpY2VfaW5mbyhzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kpCi17Ci0JcmV0dXJuIHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwb3dlcl9zdXBwbHkgKnRvX3Bvd2VyX3N1cHBseShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBkczI3ODBfYmF0dGVyeV9pbyhzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbywKLQljaGFyICpidWYsIGludCBhZGRyLCBzaXplX3QgY291bnQsIGludCBpbykKLXsKLQlyZXR1cm4gdzFfZHMyNzgwX2lvKGRldl9pbmZvLT53MV9kZXYsIGJ1ZiwgYWRkciwgY291bnQsIGlvKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZHMyNzgwX3JlYWQ4KHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLCB1OCAqdmFsLAotCWludCBhZGRyKQotewotCXJldHVybiBkczI3ODBfYmF0dGVyeV9pbyhkZXZfaW5mbywgdmFsLCBhZGRyLCBzaXplb2YodTgpLCAwKTsKLX0KLQotc3RhdGljIGludCBkczI3ODBfcmVhZDE2KHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLCBzMTYgKnZhbCwKLQlpbnQgYWRkcikKLXsKLQlpbnQgcmV0OwotCXU4IHJhd1syXTsKLQotCXJldCA9IGRzMjc4MF9iYXR0ZXJ5X2lvKGRldl9pbmZvLCByYXcsIGFkZHIsIHNpemVvZihyYXcpLCAwKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCSp2YWwgPSAocmF3WzBdIDw8IDgpIHwgcmF3WzFdOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGRzMjc4MF9yZWFkX2Jsb2NrKHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLAotCXU4ICp2YWwsIGludCBhZGRyLCBzaXplX3QgY291bnQpCi17Ci0JcmV0dXJuIGRzMjc4MF9iYXR0ZXJ5X2lvKGRldl9pbmZvLCB2YWwsIGFkZHIsIGNvdW50LCAwKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZHMyNzgwX3dyaXRlKHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLCB1OCAqdmFsLAotCWludCBhZGRyLCBzaXplX3QgY291bnQpCi17Ci0JcmV0dXJuIGRzMjc4MF9iYXR0ZXJ5X2lvKGRldl9pbmZvLCB2YWwsIGFkZHIsIGNvdW50LCAxKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZHMyNzgwX3N0b3JlX2VlcHJvbShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBhZGRyKQotewotCXJldHVybiB3MV9kczI3ODBfZWVwcm9tX2NtZChkZXYsIGFkZHIsIFcxX0RTMjc4MF9DT1BZX0RBVEEpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBkczI3ODBfcmVjYWxsX2VlcHJvbShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBhZGRyKQotewotCXJldHVybiB3MV9kczI3ODBfZWVwcm9tX2NtZChkZXYsIGFkZHIsIFcxX0RTMjc4MF9SRUNBTExfREFUQSk7Ci19Ci0KLXN0YXRpYyBpbnQgZHMyNzgwX3NhdmVfZWVwcm9tKHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLCBpbnQgcmVnKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBkczI3ODBfc3RvcmVfZWVwcm9tKGRldl9pbmZvLT53MV9kZXYsIHJlZyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBkczI3ODBfcmVjYWxsX2VlcHJvbShkZXZfaW5mby0+dzFfZGV2LCByZWcpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFNldCBzZW5zZSByZXNpc3RvciB2YWx1ZSBpbiBtaG9zICovCi1zdGF0aWMgaW50IGRzMjc4MF9zZXRfc2Vuc2VfcmVnaXN0ZXIoc3RydWN0IGRzMjc4MF9kZXZpY2VfaW5mbyAqZGV2X2luZm8sCi0JdTggY29uZHVjdGFuY2UpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IGRzMjc4MF93cml0ZShkZXZfaW5mbywgJmNvbmR1Y3RhbmNlLAotCQkJCURTMjc4MF9SU05TUF9SRUcsIHNpemVvZih1OCkpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIGRzMjc4MF9zYXZlX2VlcHJvbShkZXZfaW5mbywgRFMyNzgwX1JTTlNQX1JFRyk7Ci19Ci0KLS8qIEdldCBSU0dBSU4gdmFsdWUgZnJvbSAwIHRvIDEuOTk5IGluIHN0ZXBzIG9mIDAuMDAxICovCi1zdGF0aWMgaW50IGRzMjc4MF9nZXRfcnNnYWluX3JlZ2lzdGVyKHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLAotCXUxNiAqcnNnYWluKQotewotCXJldHVybiBkczI3ODBfcmVhZDE2KGRldl9pbmZvLCByc2dhaW4sIERTMjc4MF9SU0dBSU5fTVNCX1JFRyk7Ci19Ci0KLS8qIFNldCBSU0dBSU4gdmFsdWUgZnJvbSAwIHRvIDEuOTk5IGluIHN0ZXBzIG9mIDAuMDAxICovCi1zdGF0aWMgaW50IGRzMjc4MF9zZXRfcnNnYWluX3JlZ2lzdGVyKHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLAotCXUxNiByc2dhaW4pCi17Ci0JaW50IHJldDsKLQl1OCByYXdbXSA9IHtyc2dhaW4gPj4gOCwgcnNnYWluICYgMHhGRn07Ci0KLQlyZXQgPSBkczI3ODBfd3JpdGUoZGV2X2luZm8sIHJhdywKLQkJCQlEUzI3ODBfUlNHQUlOX01TQl9SRUcsIHNpemVvZihyYXcpKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiBkczI3ODBfc2F2ZV9lZXByb20oZGV2X2luZm8sIERTMjc4MF9SU0dBSU5fTVNCX1JFRyk7Ci19Ci0KLXN0YXRpYyBpbnQgZHMyNzgwX2dldF92b2x0YWdlKHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLAotCWludCAqdm9sdGFnZV91VikKLXsKLQlpbnQgcmV0OwotCXMxNiB2b2x0YWdlX3JhdzsKLQotCS8qCi0JICogVGhlIHZvbHRhZ2UgdmFsdWUgaXMgbG9jYXRlZCBpbiAxMCBiaXRzIGFjcm9zcyB0aGUgdm9sdGFnZSBNU0IKLQkgKiBhbmQgTFNCIHJlZ2lzdGVycyBpbiB0d28ncyBjb21wbGltZW50IGZvcm0KLQkgKiBTaWduIGJpdCBvZiB0aGUgdm9sdGFnZSB2YWx1ZSBpcyBpbiBiaXQgNyBvZiB0aGUgdm9sdGFnZSBNU0IgcmVnaXN0ZXIKLQkgKiBCaXRzIDkgLSAzIG9mIHRoZSB2b2x0YWdlIHZhbHVlIGFyZSBpbiBiaXRzIDYgLSAwIG9mIHRoZQotCSAqIHZvbHRhZ2UgTVNCIHJlZ2lzdGVyCi0JICogQml0cyAyIC0gMCBvZiB0aGUgdm9sdGFnZSB2YWx1ZSBhcmUgaW4gYml0cyA3IC0gNSBvZiB0aGUKLQkgKiB2b2x0YWdlIExTQiByZWdpc3RlcgotCSAqLwotCXJldCA9IGRzMjc4MF9yZWFkMTYoZGV2X2luZm8sICZ2b2x0YWdlX3JhdywKLQkJCQlEUzI3ODBfVk9MVF9NU0JfUkVHKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCS8qCi0JICogRFMyNzgwIHJlcG9ydHMgdm9sdGFnZSBpbiB1bml0cyBvZiA0Ljg4bVYsIGJ1dCB0aGUgYmF0dGVyeSBjbGFzcwotCSAqIHJlcG9ydHMgaW4gdW5pdHMgb2YgdVYsIHNvIGNvbnZlcnQgYnkgbXVsdGlwbHlpbmcgYnkgNDg4MC4KLQkgKi8KLQkqdm9sdGFnZV91ViA9ICh2b2x0YWdlX3JhdyAvIDMyKSAqIDQ4ODA7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZHMyNzgwX2dldF90ZW1wZXJhdHVyZShzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbywKLQlpbnQgKnRlbXBlcmF0dXJlKQotewotCWludCByZXQ7Ci0JczE2IHRlbXBlcmF0dXJlX3JhdzsKLQotCS8qCi0JICogVGhlIHRlbXBlcmF0dXJlIHZhbHVlIGlzIGxvY2F0ZWQgaW4gMTAgYml0cyBhY3Jvc3MgdGhlIHRlbXBlcmF0dXJlCi0JICogTVNCIGFuZCBMU0IgcmVnaXN0ZXJzIGluIHR3bydzIGNvbXBsaW1lbnQgZm9ybQotCSAqIFNpZ24gYml0IG9mIHRoZSB0ZW1wZXJhdHVyZSB2YWx1ZSBpcyBpbiBiaXQgNyBvZiB0aGUgdGVtcGVyYXR1cmUKLQkgKiBNU0IgcmVnaXN0ZXIKLQkgKiBCaXRzIDkgLSAzIG9mIHRoZSB0ZW1wZXJhdHVyZSB2YWx1ZSBhcmUgaW4gYml0cyA2IC0gMCBvZiB0aGUKLQkgKiB0ZW1wZXJhdHVyZSBNU0IgcmVnaXN0ZXIKLQkgKiBCaXRzIDIgLSAwIG9mIHRoZSB0ZW1wZXJhdHVyZSB2YWx1ZSBhcmUgaW4gYml0cyA3IC0gNSBvZiB0aGUKLQkgKiB0ZW1wZXJhdHVyZSBMU0IgcmVnaXN0ZXIKLQkgKi8KLQlyZXQgPSBkczI3ODBfcmVhZDE2KGRldl9pbmZvLCAmdGVtcGVyYXR1cmVfcmF3LAotCQkJCURTMjc4MF9URU1QX01TQl9SRUcpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JLyoKLQkgKiBUZW1wZXJhdHVyZSBpcyBtZWFzdXJlZCBpbiB1bml0cyBvZiAwLjEyNSBkZWdyZWVzIGNlbGNpdXMsIHRoZQotCSAqIHBvd2VyX3N1cHBseSBjbGFzcyBtZWFzdXJlcyB0ZW1wZXJhdHVyZSBpbiB0ZW50aHMgb2YgZGVncmVlcwotCSAqIGNlbHNpdXMuIFRoZSB0ZW1wZXJhdHVyZSB2YWx1ZSBpcyBzdG9yZWQgYXMgYSAxMCBiaXQgbnVtYmVyLCBwbHVzCi0JICogc2lnbiBpbiB0aGUgdXBwZXIgYml0cyBvZiBhIDE2IGJpdCByZWdpc3Rlci4KLQkgKi8KLQkqdGVtcGVyYXR1cmUgPSAoKHRlbXBlcmF0dXJlX3JhdyAvIDMyKSAqIDEyNSkgLyAxMDA7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZHMyNzgwX2dldF9jdXJyZW50KHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLAotCWVudW0gY3VycmVudF90eXBlcyB0eXBlLCBpbnQgKmN1cnJlbnRfdUEpCi17Ci0JaW50IHJldCwgc2Vuc2VfcmVzOwotCXMxNiBjdXJyZW50X3JhdzsKLQl1OCBzZW5zZV9yZXNfcmF3LCByZWdfbXNiOwotCi0JLyoKLQkgKiBUaGUgdW5pdHMgb2YgbWVhc3VyZW1lbnQgZm9yIGN1cnJlbnQgYXJlIGRlcGVuZGVudCBvbiB0aGUgdmFsdWUgb2YKLQkgKiB0aGUgc2Vuc2UgcmVzaXN0b3IuCi0JICovCi0JcmV0ID0gZHMyNzgwX3JlYWQ4KGRldl9pbmZvLCAmc2Vuc2VfcmVzX3JhdywgRFMyNzgwX1JTTlNQX1JFRyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoc2Vuc2VfcmVzX3JhdyA9PSAwKSB7Ci0JCWRldl9lcnIoZGV2X2luZm8tPmRldiwgInNlbnNlIHJlc2lzdG9yIHZhbHVlIGlzIDBcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0Jc2Vuc2VfcmVzID0gMTAwMCAvIHNlbnNlX3Jlc19yYXc7Ci0KLQlpZiAodHlwZSA9PSBDVVJSRU5UX05PVykKLQkJcmVnX21zYiA9IERTMjc4MF9DVVJSRU5UX01TQl9SRUc7Ci0JZWxzZSBpZiAodHlwZSA9PSBDVVJSRU5UX0FWRykKLQkJcmVnX21zYiA9IERTMjc4MF9JQVZHX01TQl9SRUc7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qCi0JICogVGhlIGN1cnJlbnQgdmFsdWUgaXMgbG9jYXRlZCBpbiAxNiBiaXRzIGFjcm9zcyB0aGUgY3VycmVudCBNU0IKLQkgKiBhbmQgTFNCIHJlZ2lzdGVycyBpbiB0d28ncyBjb21wbGltZW50IGZvcm0KLQkgKiBTaWduIGJpdCBvZiB0aGUgY3VycmVudCB2YWx1ZSBpcyBpbiBiaXQgNyBvZiB0aGUgY3VycmVudCBNU0IgcmVnaXN0ZXIKLQkgKiBCaXRzIDE0IC0gOCBvZiB0aGUgY3VycmVudCB2YWx1ZSBhcmUgaW4gYml0cyA2IC0gMCBvZiB0aGUgY3VycmVudAotCSAqIE1TQiByZWdpc3RlcgotCSAqIEJpdHMgNyAtIDAgb2YgdGhlIGN1cnJlbnQgdmFsdWUgYXJlIGluIGJpdHMgNyAtIDAgb2YgdGhlIGN1cnJlbnQKLQkgKiBMU0IgcmVnaXN0ZXIKLQkgKi8KLQlyZXQgPSBkczI3ODBfcmVhZDE2KGRldl9pbmZvLCAmY3VycmVudF9yYXcsIHJlZ19tc2IpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JKmN1cnJlbnRfdUEgPSBjdXJyZW50X3JhdyAqIChEUzI3ODBfQ1VSUkVOVF9VTklUUyAvIHNlbnNlX3Jlcyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZHMyNzgwX2dldF9hY2N1bXVsYXRlZF9jdXJyZW50KHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLAotCWludCAqYWNjdW11bGF0ZWRfY3VycmVudCkKLXsKLQlpbnQgcmV0LCBzZW5zZV9yZXM7Ci0JczE2IGN1cnJlbnRfcmF3OwotCXU4IHNlbnNlX3Jlc19yYXc7Ci0KLQkvKgotCSAqIFRoZSB1bml0cyBvZiBtZWFzdXJlbWVudCBmb3IgYWNjdW11bGF0ZWQgY3VycmVudCBhcmUgZGVwZW5kZW50IG9uCi0JICogdGhlIHZhbHVlIG9mIHRoZSBzZW5zZSByZXNpc3Rvci4KLQkgKi8KLQlyZXQgPSBkczI3ODBfcmVhZDgoZGV2X2luZm8sICZzZW5zZV9yZXNfcmF3LCBEUzI3ODBfUlNOU1BfUkVHKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWlmIChzZW5zZV9yZXNfcmF3ID09IDApIHsKLQkJZGV2X2VycihkZXZfaW5mby0+ZGV2LCAic2Vuc2UgcmVzaXN0b3IgdmFsdWUgaXMgMFxuIik7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCXNlbnNlX3JlcyA9IDEwMDAgLyBzZW5zZV9yZXNfcmF3OwotCi0JLyoKLQkgKiBUaGUgQUNSIHZhbHVlIGlzIGxvY2F0ZWQgaW4gMTYgYml0cyBhY3Jvc3MgdGhlIEFDUiBNU0IgYW5kCi0JICogTFNCIHJlZ2lzdGVycwotCSAqIEJpdHMgMTUgLSA4IG9mIHRoZSBBQ1IgdmFsdWUgYXJlIGluIGJpdHMgNyAtIDAgb2YgdGhlIEFDUgotCSAqIE1TQiByZWdpc3RlcgotCSAqIEJpdHMgNyAtIDAgb2YgdGhlIEFDUiB2YWx1ZSBhcmUgaW4gYml0cyA3IC0gMCBvZiB0aGUgQUNSCi0JICogTFNCIHJlZ2lzdGVyCi0JICovCi0JcmV0ID0gZHMyNzgwX3JlYWQxNihkZXZfaW5mbywgJmN1cnJlbnRfcmF3LCBEUzI3ODBfQUNSX01TQl9SRUcpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JKmFjY3VtdWxhdGVkX2N1cnJlbnQgPSBjdXJyZW50X3JhdyAqIChEUzI3ODBfQ0hBUkdFX1VOSVRTIC8gc2Vuc2VfcmVzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkczI3ODBfZ2V0X2NhcGFjaXR5KHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLAotCWludCAqY2FwYWNpdHkpCi17Ci0JaW50IHJldDsKLQl1OCByYXc7Ci0KLQlyZXQgPSBkczI3ODBfcmVhZDgoZGV2X2luZm8sICZyYXcsIERTMjc4MF9SQVJDX1JFRyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQkqY2FwYWNpdHkgPSByYXc7Ci0JcmV0dXJuIHJhdzsKLX0KLQotc3RhdGljIGludCBkczI3ODBfZ2V0X3N0YXR1cyhzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbywgaW50ICpzdGF0dXMpCi17Ci0JaW50IHJldCwgY3VycmVudF91QSwgY2FwYWNpdHk7Ci0KLQlyZXQgPSBkczI3ODBfZ2V0X2N1cnJlbnQoZGV2X2luZm8sIENVUlJFTlRfTk9XLCAmY3VycmVudF91QSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBkczI3ODBfZ2V0X2NhcGFjaXR5KGRldl9pbmZvLCAmY2FwYWNpdHkpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKGNhcGFjaXR5ID09IDEwMCkKLQkJKnN0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTDsKLQllbHNlIGlmIChjdXJyZW50X3VBID09IDApCi0JCSpzdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX05PVF9DSEFSR0lORzsKLQllbHNlIGlmIChjdXJyZW50X3VBIDwgMCkKLQkJKnN0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkc7Ci0JZWxzZQotCQkqc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGRzMjc4MF9nZXRfY2hhcmdlX25vdyhzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbywKLQlpbnQgKmNoYXJnZV9ub3cpCi17Ci0JaW50IHJldDsKLQl1MTYgY2hhcmdlX3JhdzsKLQotCS8qCi0JICogVGhlIFJBQUMgdmFsdWUgaXMgbG9jYXRlZCBpbiAxNiBiaXRzIGFjcm9zcyB0aGUgUkFBQyBNU0IgYW5kCi0JICogTFNCIHJlZ2lzdGVycwotCSAqIEJpdHMgMTUgLSA4IG9mIHRoZSBSQUFDIHZhbHVlIGFyZSBpbiBiaXRzIDcgLSAwIG9mIHRoZSBSQUFDCi0JICogTVNCIHJlZ2lzdGVyCi0JICogQml0cyA3IC0gMCBvZiB0aGUgUkFBQyB2YWx1ZSBhcmUgaW4gYml0cyA3IC0gMCBvZiB0aGUgUkFBQwotCSAqIExTQiByZWdpc3RlcgotCSAqLwotCXJldCA9IGRzMjc4MF9yZWFkMTYoZGV2X2luZm8sICZjaGFyZ2VfcmF3LCBEUzI3ODBfUkFBQ19NU0JfUkVHKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCSpjaGFyZ2Vfbm93ID0gY2hhcmdlX3JhdyAqIDE2MDA7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZHMyNzgwX2dldF9jb250cm9sX3JlZ2lzdGVyKHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLAotCXU4ICpjb250cm9sX3JlZykKLXsKLQlyZXR1cm4gZHMyNzgwX3JlYWQ4KGRldl9pbmZvLCBjb250cm9sX3JlZywgRFMyNzgwX0NPTlRST0xfUkVHKTsKLX0KLQotc3RhdGljIGludCBkczI3ODBfc2V0X2NvbnRyb2xfcmVnaXN0ZXIoc3RydWN0IGRzMjc4MF9kZXZpY2VfaW5mbyAqZGV2X2luZm8sCi0JdTggY29udHJvbF9yZWcpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IGRzMjc4MF93cml0ZShkZXZfaW5mbywgJmNvbnRyb2xfcmVnLAotCQkJCURTMjc4MF9DT05UUk9MX1JFRywgc2l6ZW9mKHU4KSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gZHMyNzgwX3NhdmVfZWVwcm9tKGRldl9pbmZvLCBEUzI3ODBfQ09OVFJPTF9SRUcpOwotfQotCi1zdGF0aWMgaW50IGRzMjc4MF9iYXR0ZXJ5X2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCi0JZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAotCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGRzMjc4MF9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSB0b19kczI3ODBfZGV2aWNlX2luZm8ocHN5KTsKLQotCXN3aXRjaCAocHNwKSB7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKLQkJcmV0ID0gZHMyNzgwX2dldF92b2x0YWdlKGRldl9pbmZvLCAmdmFsLT5pbnR2YWwpOwotCQlicmVhazsKLQotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUDoKLQkJcmV0ID0gZHMyNzgwX2dldF90ZW1wZXJhdHVyZShkZXZfaW5mbywgJnZhbC0+aW50dmFsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX01PREVMX05BTUU6Ci0JCXZhbC0+c3RydmFsID0gbW9kZWw7Ci0JCWJyZWFrOwotCi0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9NQU5VRkFDVFVSRVI6Ci0JCXZhbC0+c3RydmFsID0gbWFudWZhY3R1cmVyOwotCQlicmVhazsKLQotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1c6Ci0JCXJldCA9IGRzMjc4MF9nZXRfY3VycmVudChkZXZfaW5mbywgQ1VSUkVOVF9OT1csICZ2YWwtPmludHZhbCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX0FWRzoKLQkJcmV0ID0gZHMyNzgwX2dldF9jdXJyZW50KGRldl9pbmZvLCBDVVJSRU5UX0FWRywgJnZhbC0+aW50dmFsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKLQkJcmV0ID0gZHMyNzgwX2dldF9zdGF0dXMoZGV2X2luZm8sICZ2YWwtPmludHZhbCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWToKLQkJcmV0ID0gZHMyNzgwX2dldF9jYXBhY2l0eShkZXZfaW5mbywgJnZhbC0+aW50dmFsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9DT1VOVEVSOgotCQlyZXQgPSBkczI3ODBfZ2V0X2FjY3VtdWxhdGVkX2N1cnJlbnQoZGV2X2luZm8sICZ2YWwtPmludHZhbCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XOgotCQlyZXQgPSBkczI3ODBfZ2V0X2NoYXJnZV9ub3coZGV2X2luZm8sICZ2YWwtPmludHZhbCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgZHMyNzgwX2JhdHRlcnlfcHJvcHNbXSA9IHsKLQlQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMsCi0JUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1csCi0JUE9XRVJfU1VQUExZX1BST1BfVEVNUCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9NT0RFTF9OQU1FLAotCVBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUiwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVywKLQlQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX0FWRywKLQlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWSwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfQ09VTlRFUiwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XLAotfTsKLQotc3RhdGljIHNzaXplX3QgZHMyNzgwX2dldF9wbW9kX2VuYWJsZWQoc3RydWN0IGRldmljZSAqZGV2LAotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCWNoYXIgKmJ1ZikKLXsKLQlpbnQgcmV0OwotCXU4IGNvbnRyb2xfcmVnOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IHRvX3Bvd2VyX3N1cHBseShkZXYpOwotCXN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvID0gdG9fZHMyNzgwX2RldmljZV9pbmZvKHBzeSk7Ci0KLQkvKiBHZXQgcG93ZXIgbW9kZSAqLwotCXJldCA9IGRzMjc4MF9nZXRfY29udHJvbF9yZWdpc3RlcihkZXZfaW5mbywgJmNvbnRyb2xfcmVnKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAotCQkgISEoY29udHJvbF9yZWcgJiBEUzI3ODBfQ09OVFJPTF9SRUdfUE1PRCkpOwotfQotCi1zdGF0aWMgc3NpemVfdCBkczI3ODBfc2V0X3Btb2RfZW5hYmxlZChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0Jc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JY29uc3QgY2hhciAqYnVmLAotCXNpemVfdCBjb3VudCkKLXsKLQlpbnQgcmV0OwotCXU4IGNvbnRyb2xfcmVnLCBuZXdfc2V0dGluZzsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSB0b19wb3dlcl9zdXBwbHkoZGV2KTsKLQlzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbyA9IHRvX2RzMjc4MF9kZXZpY2VfaW5mbyhwc3kpOwotCi0JLyogU2V0IHBvd2VyIG1vZGUgKi8KLQlyZXQgPSBkczI3ODBfZ2V0X2NvbnRyb2xfcmVnaXN0ZXIoZGV2X2luZm8sICZjb250cm9sX3JlZyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBrc3RydG91OChidWYsIDAsICZuZXdfc2V0dGluZyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoKG5ld19zZXR0aW5nICE9IDApICYmIChuZXdfc2V0dGluZyAhPSAxKSkgewotCQlkZXZfZXJyKGRldl9pbmZvLT5kZXYsICJJbnZhbGlkIHBtb2Qgc2V0dGluZyAoMCBvciAxKVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChuZXdfc2V0dGluZykKLQkJY29udHJvbF9yZWcgfD0gRFMyNzgwX0NPTlRST0xfUkVHX1BNT0Q7Ci0JZWxzZQotCQljb250cm9sX3JlZyAmPSB+RFMyNzgwX0NPTlRST0xfUkVHX1BNT0Q7Ci0KLQlyZXQgPSBkczI3ODBfc2V0X2NvbnRyb2xfcmVnaXN0ZXIoZGV2X2luZm8sIGNvbnRyb2xfcmVnKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3QgZHMyNzgwX2dldF9zZW5zZV9yZXNpc3Rvcl92YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0Jc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JY2hhciAqYnVmKQotewotCWludCByZXQ7Ci0JdTggc2Vuc2VfcmVzaXN0b3I7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gdG9fcG93ZXJfc3VwcGx5KGRldik7Ci0Jc3RydWN0IGRzMjc4MF9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSB0b19kczI3ODBfZGV2aWNlX2luZm8ocHN5KTsKLQotCXJldCA9IGRzMjc4MF9yZWFkOChkZXZfaW5mbywgJnNlbnNlX3Jlc2lzdG9yLCBEUzI3ODBfUlNOU1BfUkVHKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIHNlbnNlX3Jlc2lzdG9yKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCBkczI3ODBfc2V0X3NlbnNlX3Jlc2lzdG9yX3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQljb25zdCBjaGFyICpidWYsCi0Jc2l6ZV90IGNvdW50KQotewotCWludCByZXQ7Ci0JdTggbmV3X3NldHRpbmc7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gdG9fcG93ZXJfc3VwcGx5KGRldik7Ci0Jc3RydWN0IGRzMjc4MF9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSB0b19kczI3ODBfZGV2aWNlX2luZm8ocHN5KTsKLQotCXJldCA9IGtzdHJ0b3U4KGJ1ZiwgMCwgJm5ld19zZXR0aW5nKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGRzMjc4MF9zZXRfc2Vuc2VfcmVnaXN0ZXIoZGV2X2luZm8sIG5ld19zZXR0aW5nKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3QgZHMyNzgwX2dldF9yc2dhaW5fc2V0dGluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0Jc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JY2hhciAqYnVmKQotewotCWludCByZXQ7Ci0JdTE2IHJzZ2FpbjsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSB0b19wb3dlcl9zdXBwbHkoZGV2KTsKLQlzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbyA9IHRvX2RzMjc4MF9kZXZpY2VfaW5mbyhwc3kpOwotCi0JcmV0ID0gZHMyNzgwX2dldF9yc2dhaW5fcmVnaXN0ZXIoZGV2X2luZm8sICZyc2dhaW4pOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJzZ2Fpbik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGRzMjc4MF9zZXRfcnNnYWluX3NldHRpbmcoc3RydWN0IGRldmljZSAqZGV2LAotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCWNvbnN0IGNoYXIgKmJ1ZiwKLQlzaXplX3QgY291bnQpCi17Ci0JaW50IHJldDsKLQl1MTYgbmV3X3NldHRpbmc7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gdG9fcG93ZXJfc3VwcGx5KGRldik7Ci0Jc3RydWN0IGRzMjc4MF9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSB0b19kczI3ODBfZGV2aWNlX2luZm8ocHN5KTsKLQotCXJldCA9IGtzdHJ0b3UxNihidWYsIDAsICZuZXdfc2V0dGluZyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBHYWluIGNhbiBvbmx5IGJlIGZyb20gMCB0byAxLjk5OSBpbiBzdGVwcyBvZiAuMDAxICovCi0JaWYgKG5ld19zZXR0aW5nID4gMTk5OSkgewotCQlkZXZfZXJyKGRldl9pbmZvLT5kZXYsICJJbnZhbGlkIHJzZ2FpbiBzZXR0aW5nICgwIC0gMTk5OSlcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXQgPSBkczI3ODBfc2V0X3JzZ2Fpbl9yZWdpc3RlcihkZXZfaW5mbywgbmV3X3NldHRpbmcpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBkczI3ODBfZ2V0X3Bpb19waW4oc3RydWN0IGRldmljZSAqZGV2LAotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCWNoYXIgKmJ1ZikKLXsKLQlpbnQgcmV0OwotCXU4IHNmcjsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSB0b19wb3dlcl9zdXBwbHkoZGV2KTsKLQlzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbyA9IHRvX2RzMjc4MF9kZXZpY2VfaW5mbyhwc3kpOwotCi0JcmV0ID0gZHMyNzgwX3JlYWQ4KGRldl9pbmZvLCAmc2ZyLCBEUzI3ODBfU0ZSX1JFRyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBzZnIgJiBEUzI3ODBfU0ZSX1JFR19QSU9TQyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgZHMyNzgwX3NldF9waW9fcGluKHN0cnVjdCBkZXZpY2UgKmRldiwKLQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQljb25zdCBjaGFyICpidWYsCi0Jc2l6ZV90IGNvdW50KQotewotCWludCByZXQ7Ci0JdTggbmV3X3NldHRpbmc7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gdG9fcG93ZXJfc3VwcGx5KGRldik7Ci0Jc3RydWN0IGRzMjc4MF9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSB0b19kczI3ODBfZGV2aWNlX2luZm8ocHN5KTsKLQotCXJldCA9IGtzdHJ0b3U4KGJ1ZiwgMCwgJm5ld19zZXR0aW5nKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWlmICgobmV3X3NldHRpbmcgIT0gMCkgJiYgKG5ld19zZXR0aW5nICE9IDEpKSB7Ci0JCWRldl9lcnIoZGV2X2luZm8tPmRldiwgIkludmFsaWQgcGlvX3BpbiBzZXR0aW5nICgwIG9yIDEpXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0gZHMyNzgwX3dyaXRlKGRldl9pbmZvLCAmbmV3X3NldHRpbmcsCi0JCQkJRFMyNzgwX1NGUl9SRUcsIHNpemVvZih1OCkpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBkczI3ODBfcmVhZF9wYXJhbV9lZXByb21fYmluKHN0cnVjdCBmaWxlICpmaWxwLAotCQkJCXN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCXN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKLQkJCQljaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gdG9fcG93ZXJfc3VwcGx5KGRldik7Ci0Jc3RydWN0IGRzMjc4MF9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSB0b19kczI3ODBfZGV2aWNlX2luZm8ocHN5KTsKLQotCXJldHVybiBkczI3ODBfcmVhZF9ibG9jayhkZXZfaW5mbywgYnVmLAotCQkJCURTMjc4MF9FRVBST01fQkxPQ0sxX1NUQVJUICsgb2ZmLCBjb3VudCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGRzMjc4MF93cml0ZV9wYXJhbV9lZXByb21fYmluKHN0cnVjdCBmaWxlICpmaWxwLAotCQkJCXN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCXN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKLQkJCQljaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gdG9fcG93ZXJfc3VwcGx5KGRldik7Ci0Jc3RydWN0IGRzMjc4MF9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSB0b19kczI3ODBfZGV2aWNlX2luZm8ocHN5KTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZHMyNzgwX3dyaXRlKGRldl9pbmZvLCBidWYsCi0JCQkJRFMyNzgwX0VFUFJPTV9CTE9DSzFfU1RBUlQgKyBvZmYsIGNvdW50KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGRzMjc4MF9zYXZlX2VlcHJvbShkZXZfaW5mbywgRFMyNzgwX0VFUFJPTV9CTE9DSzFfU1RBUlQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgZHMyNzgwX3BhcmFtX2VlcHJvbV9iaW5fYXR0ciA9IHsKLQkuYXR0ciA9IHsKLQkJLm5hbWUgPSAicGFyYW1fZWVwcm9tIiwKLQkJLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUiwKLQl9LAotCS5zaXplID0gRFMyNzgwX1BBUkFNX0VFUFJPTV9TSVpFLAotCS5yZWFkID0gZHMyNzgwX3JlYWRfcGFyYW1fZWVwcm9tX2JpbiwKLQkud3JpdGUgPSBkczI3ODBfd3JpdGVfcGFyYW1fZWVwcm9tX2JpbiwKLX07Ci0KLXN0YXRpYyBzc2l6ZV90IGRzMjc4MF9yZWFkX3VzZXJfZWVwcm9tX2JpbihzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCi0JCQkJY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IHRvX3Bvd2VyX3N1cHBseShkZXYpOwotCXN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvID0gdG9fZHMyNzgwX2RldmljZV9pbmZvKHBzeSk7Ci0KLQlyZXR1cm4gZHMyNzgwX3JlYWRfYmxvY2soZGV2X2luZm8sIGJ1ZiwKLQkJCQlEUzI3ODBfRUVQUk9NX0JMT0NLMF9TVEFSVCArIG9mZiwgY291bnQpOwotfQotCi1zdGF0aWMgc3NpemVfdCBkczI3ODBfd3JpdGVfdXNlcl9lZXByb21fYmluKHN0cnVjdCBmaWxlICpmaWxwLAotCQkJCXN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCXN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKLQkJCQljaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gdG9fcG93ZXJfc3VwcGx5KGRldik7Ci0Jc3RydWN0IGRzMjc4MF9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSB0b19kczI3ODBfZGV2aWNlX2luZm8ocHN5KTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZHMyNzgwX3dyaXRlKGRldl9pbmZvLCBidWYsCi0JCQkJRFMyNzgwX0VFUFJPTV9CTE9DSzBfU1RBUlQgKyBvZmYsIGNvdW50KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGRzMjc4MF9zYXZlX2VlcHJvbShkZXZfaW5mbywgRFMyNzgwX0VFUFJPTV9CTE9DSzBfU1RBUlQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgZHMyNzgwX3VzZXJfZWVwcm9tX2Jpbl9hdHRyID0gewotCS5hdHRyID0gewotCQkubmFtZSA9ICJ1c2VyX2VlcHJvbSIsCi0JCS5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IsCi0JfSwKLQkuc2l6ZSA9IERTMjc4MF9VU0VSX0VFUFJPTV9TSVpFLAotCS5yZWFkID0gZHMyNzgwX3JlYWRfdXNlcl9lZXByb21fYmluLAotCS53cml0ZSA9IGRzMjc4MF93cml0ZV91c2VyX2VlcHJvbV9iaW4sCi19OwotCi1zdGF0aWMgREVWSUNFX0FUVFIocG1vZF9lbmFibGVkLCBTX0lSVUdPIHwgU19JV1VTUiwgZHMyNzgwX2dldF9wbW9kX2VuYWJsZWQsCi0JZHMyNzgwX3NldF9wbW9kX2VuYWJsZWQpOwotc3RhdGljIERFVklDRV9BVFRSKHNlbnNlX3Jlc2lzdG9yX3ZhbHVlLCBTX0lSVUdPIHwgU19JV1VTUiwKLQlkczI3ODBfZ2V0X3NlbnNlX3Jlc2lzdG9yX3ZhbHVlLCBkczI3ODBfc2V0X3NlbnNlX3Jlc2lzdG9yX3ZhbHVlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihyc2dhaW5fc2V0dGluZywgU19JUlVHTyB8IFNfSVdVU1IsIGRzMjc4MF9nZXRfcnNnYWluX3NldHRpbmcsCi0JZHMyNzgwX3NldF9yc2dhaW5fc2V0dGluZyk7Ci1zdGF0aWMgREVWSUNFX0FUVFIocGlvX3BpbiwgU19JUlVHTyB8IFNfSVdVU1IsIGRzMjc4MF9nZXRfcGlvX3BpbiwKLQlkczI3ODBfc2V0X3Bpb19waW4pOwotCi0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpkczI3ODBfYXR0cmlidXRlc1tdID0gewotCSZkZXZfYXR0cl9wbW9kX2VuYWJsZWQuYXR0ciwKLQkmZGV2X2F0dHJfc2Vuc2VfcmVzaXN0b3JfdmFsdWUuYXR0ciwKLQkmZGV2X2F0dHJfcnNnYWluX3NldHRpbmcuYXR0ciwKLQkmZGV2X2F0dHJfcGlvX3Bpbi5hdHRyLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGRzMjc4MF9hdHRyX2dyb3VwID0gewotCS5hdHRycyA9IGRzMjc4MF9hdHRyaWJ1dGVzLAotfTsKLQotc3RhdGljIGludCBkczI3ODBfYmF0dGVyeV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbzsKLQotCWRldl9pbmZvID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZGV2X2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldl9pbmZvKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXZfaW5mbyk7Ci0KLQlkZXZfaW5mby0+ZGV2CQkJPSAmcGRldi0+ZGV2OwotCWRldl9pbmZvLT53MV9kZXYJCT0gcGRldi0+ZGV2LnBhcmVudDsKLQlkZXZfaW5mby0+YmF0X2Rlc2MubmFtZQkJPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKLQlkZXZfaW5mby0+YmF0X2Rlc2MudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOwotCWRldl9pbmZvLT5iYXRfZGVzYy5wcm9wZXJ0aWVzCT0gZHMyNzgwX2JhdHRlcnlfcHJvcHM7Ci0JZGV2X2luZm8tPmJhdF9kZXNjLm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShkczI3ODBfYmF0dGVyeV9wcm9wcyk7Ci0JZGV2X2luZm8tPmJhdF9kZXNjLmdldF9wcm9wZXJ0eQk9IGRzMjc4MF9iYXR0ZXJ5X2dldF9wcm9wZXJ0eTsKLQotCXBzeV9jZmcuZHJ2X2RhdGEJCT0gZGV2X2luZm87Ci0KLQlkZXZfaW5mby0+YmF0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZkZXZfaW5mby0+YmF0X2Rlc2MsCi0JCQkJCSAgICAgICZwc3lfY2ZnKTsKLQlpZiAoSVNfRVJSKGRldl9pbmZvLT5iYXQpKSB7Ci0JCWRldl9lcnIoZGV2X2luZm8tPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBiYXR0ZXJ5XG4iKTsKLQkJcmV0ID0gUFRSX0VSUihkZXZfaW5mby0+YmF0KTsKLQkJZ290byBmYWlsOwotCX0KLQotCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2X2luZm8tPmJhdC0+ZGV2LmtvYmosICZkczI3ODBfYXR0cl9ncm91cCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRldl9pbmZvLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGdyb3VwXG4iKTsKLQkJZ290byBmYWlsX3VucmVnaXN0ZXI7Ci0JfQotCi0JcmV0ID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZkZXZfaW5mby0+YmF0LT5kZXYua29iaiwKLQkJCQkJJmRzMjc4MF9wYXJhbV9lZXByb21fYmluX2F0dHIpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihkZXZfaW5mby0+ZGV2LAotCQkJCSJmYWlsZWQgdG8gY3JlYXRlIHBhcmFtIGVlcHJvbSBiaW4gZmlsZSIpOwotCQlnb3RvIGZhaWxfcmVtb3ZlX2dyb3VwOwotCX0KLQotCXJldCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmZGV2X2luZm8tPmJhdC0+ZGV2LmtvYmosCi0JCQkJCSZkczI3ODBfdXNlcl9lZXByb21fYmluX2F0dHIpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihkZXZfaW5mby0+ZGV2LAotCQkJCSJmYWlsZWQgdG8gY3JlYXRlIHVzZXIgZWVwcm9tIGJpbiBmaWxlIik7Ci0JCWdvdG8gZmFpbF9yZW1vdmVfYmluX2ZpbGU7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWZhaWxfcmVtb3ZlX2Jpbl9maWxlOgotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmZGV2X2luZm8tPmJhdC0+ZGV2LmtvYmosCi0JCQkJJmRzMjc4MF9wYXJhbV9lZXByb21fYmluX2F0dHIpOwotZmFpbF9yZW1vdmVfZ3JvdXA6Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXZfaW5mby0+YmF0LT5kZXYua29iaiwgJmRzMjc4MF9hdHRyX2dyb3VwKTsKLWZhaWxfdW5yZWdpc3RlcjoKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihkZXZfaW5mby0+YmF0KTsKLWZhaWw6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBkczI3ODBfYmF0dGVyeV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JLyoKLQkgKiBSZW1vdmUgYXR0cmlidXRlcyBiZWZvcmUgdW5yZWdpc3RlcmluZyBwb3dlciBzdXBwbHkKLQkgKiBiZWNhdXNlICdiYXQnIHdpbGwgYmUgZnJlZWQgb24gcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoKSBjYWxsLgotCSAqLwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2X2luZm8tPmJhdC0+ZGV2LmtvYmosICZkczI3ODBfYXR0cl9ncm91cCk7Ci0KLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihkZXZfaW5mby0+YmF0KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBkczI3ODBfYmF0dGVyeV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAiZHMyNzgwLWJhdHRlcnkiLAotCX0sCi0JLnByb2JlCSAgPSBkczI3ODBfYmF0dGVyeV9wcm9iZSwKLQkucmVtb3ZlICAgPSBkczI3ODBfYmF0dGVyeV9yZW1vdmUsCi19OwotCi1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGRzMjc4MF9iYXR0ZXJ5X2RyaXZlcik7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIkNsaWZ0b24gQmFybmVzIDxjYWJhcm5lc0BpbmRlc2lnbi1sbGMuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXhpbS9EYWxsYXMgRFMyNzgwIFN0YW5kLUFsb25lIEZ1ZWwgR2F1YWdlIElDIGRyaXZlciIpOwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpkczI3ODAtYmF0dGVyeSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9kczI3ODFfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9kczI3ODFfYmF0dGVyeS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzY4MDAyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvcG93ZXIvZHMyNzgxX2JhdHRlcnkuYworKysgL2Rldi9udWxsCkBAIC0xLDgzOSArMCwwIEBACi0vKgotICogMS13aXJlIGNsaWVudC9kcml2ZXIgZm9yIHRoZSBNYXhpbS9EYWxsYXMgRFMyNzgxIFN0YW5kLUFsb25lIEZ1ZWwgR2F1Z2UgSUMKLSAqCi0gKiBBdXRob3I6IFJlbmF0YSBTYXlha2hvdmEgPHJlbmF0YUBva3RldGxhYnMucnU+Ci0gKgotICogQmFzZWQgb24gZHMyNzgwX2JhdHRlcnkgZHJpdmVycwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9wbS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgotI2luY2x1ZGUgPGxpbnV4L2lkci5oPgotCi0jaW5jbHVkZSAiLi4vdzEvdzEuaCIKLSNpbmNsdWRlICIuLi93MS9zbGF2ZXMvdzFfZHMyNzgxLmgiCi0KLS8qIEN1cnJlbnQgdW5pdCBtZWFzdXJlbWVudCBpbiB1QSBmb3IgYSAxIG1pbGxpLW9obSBzZW5zZSByZXNpc3RvciAqLwotI2RlZmluZSBEUzI3ODFfQ1VSUkVOVF9VTklUUwkxNTYzCi0vKiBDaGFyZ2UgdW5pdCBtZWFzdXJlbWVudCBpbiB1QWggZm9yIGEgMSBtaWxsaS1vaG0gc2Vuc2UgcmVzaXN0b3IgKi8KLSNkZWZpbmUgRFMyNzgxX0NIQVJHRV9VTklUUwkJNjI1MAotLyogTnVtYmVyIG9mIGJ5dGVzIGluIHVzZXIgRUVQUk9NIHNwYWNlICovCi0jZGVmaW5lIERTMjc4MV9VU0VSX0VFUFJPTV9TSVpFCQkoRFMyNzgxX0VFUFJPTV9CTE9DSzBfRU5EIC0gXAotCQkJCQlEUzI3ODFfRUVQUk9NX0JMT0NLMF9TVEFSVCArIDEpCi0vKiBOdW1iZXIgb2YgYnl0ZXMgaW4gcGFyYW1ldGVyIEVFUFJPTSBzcGFjZSAqLwotI2RlZmluZSBEUzI3ODFfUEFSQU1fRUVQUk9NX1NJWkUJKERTMjc4MV9FRVBST01fQkxPQ0sxX0VORCAtIFwKLQkJCQkJRFMyNzgxX0VFUFJPTV9CTE9DSzFfU1RBUlQgKyAxKQotCi1zdHJ1Y3QgZHMyNzgxX2RldmljZV9pbmZvIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0OwotCXN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBiYXRfZGVzYzsKLQlzdHJ1Y3QgZGV2aWNlICp3MV9kZXY7Ci19OwotCi1lbnVtIGN1cnJlbnRfdHlwZXMgewotCUNVUlJFTlRfTk9XLAotCUNVUlJFTlRfQVZHLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgbW9kZWxbXSA9ICJEUzI3ODEiOwotc3RhdGljIGNvbnN0IGNoYXIgbWFudWZhY3R1cmVyW10gPSAiTWF4aW0vRGFsbGFzIjsKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgZHMyNzgxX2RldmljZV9pbmZvICoKLXRvX2RzMjc4MV9kZXZpY2VfaW5mbyhzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kpCi17Ci0JcmV0dXJuIHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwb3dlcl9zdXBwbHkgKnRvX3Bvd2VyX3N1cHBseShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBkczI3ODFfYmF0dGVyeV9pbyhzdHJ1Y3QgZHMyNzgxX2RldmljZV9pbmZvICpkZXZfaW5mbywKLQljaGFyICpidWYsIGludCBhZGRyLCBzaXplX3QgY291bnQsIGludCBpbykKLXsKLQlyZXR1cm4gdzFfZHMyNzgxX2lvKGRldl9pbmZvLT53MV9kZXYsIGJ1ZiwgYWRkciwgY291bnQsIGlvKTsKLX0KLQotc3RhdGljIGludCB3MV9kczI3ODFfcmVhZChzdHJ1Y3QgZHMyNzgxX2RldmljZV9pbmZvICpkZXZfaW5mbywgY2hhciAqYnVmLAotCQlpbnQgYWRkciwgc2l6ZV90IGNvdW50KQotewotCXJldHVybiBkczI3ODFfYmF0dGVyeV9pbyhkZXZfaW5mbywgYnVmLCBhZGRyLCBjb3VudCwgMCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGRzMjc4MV9yZWFkOChzdHJ1Y3QgZHMyNzgxX2RldmljZV9pbmZvICpkZXZfaW5mbywgdTggKnZhbCwKLQlpbnQgYWRkcikKLXsKLQlyZXR1cm4gZHMyNzgxX2JhdHRlcnlfaW8oZGV2X2luZm8sIHZhbCwgYWRkciwgc2l6ZW9mKHU4KSwgMCk7Ci19Ci0KLXN0YXRpYyBpbnQgZHMyNzgxX3JlYWQxNihzdHJ1Y3QgZHMyNzgxX2RldmljZV9pbmZvICpkZXZfaW5mbywgczE2ICp2YWwsCi0JaW50IGFkZHIpCi17Ci0JaW50IHJldDsKLQl1OCByYXdbMl07Ci0KLQlyZXQgPSBkczI3ODFfYmF0dGVyeV9pbyhkZXZfaW5mbywgcmF3LCBhZGRyLCBzaXplb2YocmF3KSwgMCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQkqdmFsID0gKHJhd1swXSA8PCA4KSB8IHJhd1sxXTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBkczI3ODFfcmVhZF9ibG9jayhzdHJ1Y3QgZHMyNzgxX2RldmljZV9pbmZvICpkZXZfaW5mbywKLQl1OCAqdmFsLCBpbnQgYWRkciwgc2l6ZV90IGNvdW50KQotewotCXJldHVybiBkczI3ODFfYmF0dGVyeV9pbyhkZXZfaW5mbywgdmFsLCBhZGRyLCBjb3VudCwgMCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGRzMjc4MV93cml0ZShzdHJ1Y3QgZHMyNzgxX2RldmljZV9pbmZvICpkZXZfaW5mbywgdTggKnZhbCwKLQlpbnQgYWRkciwgc2l6ZV90IGNvdW50KQotewotCXJldHVybiBkczI3ODFfYmF0dGVyeV9pbyhkZXZfaW5mbywgdmFsLCBhZGRyLCBjb3VudCwgMSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGRzMjc4MV9zdG9yZV9lZXByb20oc3RydWN0IGRldmljZSAqZGV2LCBpbnQgYWRkcikKLXsKLQlyZXR1cm4gdzFfZHMyNzgxX2VlcHJvbV9jbWQoZGV2LCBhZGRyLCBXMV9EUzI3ODFfQ09QWV9EQVRBKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZHMyNzgxX3JlY2FsbF9lZXByb20oc3RydWN0IGRldmljZSAqZGV2LCBpbnQgYWRkcikKLXsKLQlyZXR1cm4gdzFfZHMyNzgxX2VlcHJvbV9jbWQoZGV2LCBhZGRyLCBXMV9EUzI3ODFfUkVDQUxMX0RBVEEpOwotfQotCi1zdGF0aWMgaW50IGRzMjc4MV9zYXZlX2VlcHJvbShzdHJ1Y3QgZHMyNzgxX2RldmljZV9pbmZvICpkZXZfaW5mbywgaW50IHJlZykKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZHMyNzgxX3N0b3JlX2VlcHJvbShkZXZfaW5mby0+dzFfZGV2LCByZWcpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gZHMyNzgxX3JlY2FsbF9lZXByb20oZGV2X2luZm8tPncxX2RldiwgcmVnKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiAwOwotfQotCi0vKiBTZXQgc2Vuc2UgcmVzaXN0b3IgdmFsdWUgaW4gbWhvcyAqLwotc3RhdGljIGludCBkczI3ODFfc2V0X3NlbnNlX3JlZ2lzdGVyKHN0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8gKmRldl9pbmZvLAotCXU4IGNvbmR1Y3RhbmNlKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBkczI3ODFfd3JpdGUoZGV2X2luZm8sICZjb25kdWN0YW5jZSwKLQkJCQlEUzI3ODFfUlNOU1AsIHNpemVvZih1OCkpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIGRzMjc4MV9zYXZlX2VlcHJvbShkZXZfaW5mbywgRFMyNzgxX1JTTlNQKTsKLX0KLQotLyogR2V0IFJTR0FJTiB2YWx1ZSBmcm9tIDAgdG8gMS45OTkgaW4gc3RlcHMgb2YgMC4wMDEgKi8KLXN0YXRpYyBpbnQgZHMyNzgxX2dldF9yc2dhaW5fcmVnaXN0ZXIoc3RydWN0IGRzMjc4MV9kZXZpY2VfaW5mbyAqZGV2X2luZm8sCi0JdTE2ICpyc2dhaW4pCi17Ci0JcmV0dXJuIGRzMjc4MV9yZWFkMTYoZGV2X2luZm8sIHJzZ2FpbiwgRFMyNzgxX1JTR0FJTl9NU0IpOwotfQotCi0vKiBTZXQgUlNHQUlOIHZhbHVlIGZyb20gMCB0byAxLjk5OSBpbiBzdGVwcyBvZiAwLjAwMSAqLwotc3RhdGljIGludCBkczI3ODFfc2V0X3JzZ2Fpbl9yZWdpc3RlcihzdHJ1Y3QgZHMyNzgxX2RldmljZV9pbmZvICpkZXZfaW5mbywKLQl1MTYgcnNnYWluKQotewotCWludCByZXQ7Ci0JdTggcmF3W10gPSB7cnNnYWluID4+IDgsIHJzZ2FpbiAmIDB4RkZ9OwotCi0JcmV0ID0gZHMyNzgxX3dyaXRlKGRldl9pbmZvLCByYXcsCi0JCQkJRFMyNzgxX1JTR0FJTl9NU0IsIHNpemVvZihyYXcpKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiBkczI3ODFfc2F2ZV9lZXByb20oZGV2X2luZm8sIERTMjc4MV9SU0dBSU5fTVNCKTsKLX0KLQotc3RhdGljIGludCBkczI3ODFfZ2V0X3ZvbHRhZ2Uoc3RydWN0IGRzMjc4MV9kZXZpY2VfaW5mbyAqZGV2X2luZm8sCi0JaW50ICp2b2x0YWdlX3VWKQotewotCWludCByZXQ7Ci0JY2hhciB2YWxbMl07Ci0JaW50IHZvbHRhZ2VfcmF3OwotCi0JcmV0ID0gdzFfZHMyNzgxX3JlYWQoZGV2X2luZm8sIHZhbCwgRFMyNzgxX1ZPTFRfTVNCLCAyICogc2l6ZW9mKHU4KSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JLyoKLQkgKiBUaGUgdm9sdGFnZSB2YWx1ZSBpcyBsb2NhdGVkIGluIDEwIGJpdHMgYWNyb3NzIHRoZSB2b2x0YWdlIE1TQgotCSAqIGFuZCBMU0IgcmVnaXN0ZXJzIGluIHR3bydzIGNvbXBsaW1lbnQgZm9ybQotCSAqIFNpZ24gYml0IG9mIHRoZSB2b2x0YWdlIHZhbHVlIGlzIGluIGJpdCA3IG9mIHRoZSB2b2x0YWdlIE1TQiByZWdpc3RlcgotCSAqIEJpdHMgOSAtIDMgb2YgdGhlIHZvbHRhZ2UgdmFsdWUgYXJlIGluIGJpdHMgNiAtIDAgb2YgdGhlCi0JICogdm9sdGFnZSBNU0IgcmVnaXN0ZXIKLQkgKiBCaXRzIDIgLSAwIG9mIHRoZSB2b2x0YWdlIHZhbHVlIGFyZSBpbiBiaXRzIDcgLSA1IG9mIHRoZQotCSAqIHZvbHRhZ2UgTFNCIHJlZ2lzdGVyCi0JICovCi0Jdm9sdGFnZV9yYXcgPSAodmFsWzBdIDw8IDMpIHwKLQkJKHZhbFsxXSA+PiA1KTsKLQotCS8qIERTMjc4MSByZXBvcnRzIHZvbHRhZ2UgaW4gdW5pdHMgb2YgOS43Nm1WLCBidXQgdGhlIGJhdHRlcnkgY2xhc3MKLQkgKiByZXBvcnRzIGluIHVuaXRzIG9mIHVWLCBzbyBjb252ZXJ0IGJ5IG11bHRpcGx5aW5nIGJ5IDk3NjAuICovCi0JKnZvbHRhZ2VfdVYgPSB2b2x0YWdlX3JhdyAqIDk3NjA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkczI3ODFfZ2V0X3RlbXBlcmF0dXJlKHN0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8gKmRldl9pbmZvLAotCWludCAqdGVtcCkKLXsKLQlpbnQgcmV0OwotCWNoYXIgdmFsWzJdOwotCWludCB0ZW1wX3JhdzsKLQotCXJldCA9IHcxX2RzMjc4MV9yZWFkKGRldl9pbmZvLCB2YWwsIERTMjc4MV9URU1QX01TQiwgMiAqIHNpemVvZih1OCkpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCS8qCi0JICogVGhlIHRlbXBlcmF0dXJlIHZhbHVlIGlzIGxvY2F0ZWQgaW4gMTAgYml0cyBhY3Jvc3MgdGhlIHRlbXBlcmF0dXJlCi0JICogTVNCIGFuZCBMU0IgcmVnaXN0ZXJzIGluIHR3bydzIGNvbXBsaW1lbnQgZm9ybQotCSAqIFNpZ24gYml0IG9mIHRoZSB0ZW1wZXJhdHVyZSB2YWx1ZSBpcyBpbiBiaXQgNyBvZiB0aGUgdGVtcGVyYXR1cmUKLQkgKiBNU0IgcmVnaXN0ZXIKLQkgKiBCaXRzIDkgLSAzIG9mIHRoZSB0ZW1wZXJhdHVyZSB2YWx1ZSBhcmUgaW4gYml0cyA2IC0gMCBvZiB0aGUKLQkgKiB0ZW1wZXJhdHVyZSBNU0IgcmVnaXN0ZXIKLQkgKiBCaXRzIDIgLSAwIG9mIHRoZSB0ZW1wZXJhdHVyZSB2YWx1ZSBhcmUgaW4gYml0cyA3IC0gNSBvZiB0aGUKLQkgKiB0ZW1wZXJhdHVyZSBMU0IgcmVnaXN0ZXIKLQkgKi8KLQl0ZW1wX3JhdyA9ICgodmFsWzBdKSA8PCAzKSB8Ci0JCSh2YWxbMV0gPj4gNSk7Ci0JKnRlbXAgPSB0ZW1wX3JhdyArICh0ZW1wX3JhdyAvIDQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZHMyNzgxX2dldF9jdXJyZW50KHN0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8gKmRldl9pbmZvLAotCWVudW0gY3VycmVudF90eXBlcyB0eXBlLCBpbnQgKmN1cnJlbnRfdUEpCi17Ci0JaW50IHJldCwgc2Vuc2VfcmVzOwotCXMxNiBjdXJyZW50X3JhdzsKLQl1OCBzZW5zZV9yZXNfcmF3LCByZWdfbXNiOwotCi0JLyoKLQkgKiBUaGUgdW5pdHMgb2YgbWVhc3VyZW1lbnQgZm9yIGN1cnJlbnQgYXJlIGRlcGVuZGVudCBvbiB0aGUgdmFsdWUgb2YKLQkgKiB0aGUgc2Vuc2UgcmVzaXN0b3IuCi0JICovCi0JcmV0ID0gZHMyNzgxX3JlYWQ4KGRldl9pbmZvLCAmc2Vuc2VfcmVzX3JhdywgRFMyNzgxX1JTTlNQKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWlmIChzZW5zZV9yZXNfcmF3ID09IDApIHsKLQkJZGV2X2VycihkZXZfaW5mby0+ZGV2LCAic2Vuc2UgcmVzaXN0b3IgdmFsdWUgaXMgMFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlzZW5zZV9yZXMgPSAxMDAwIC8gc2Vuc2VfcmVzX3JhdzsKLQotCWlmICh0eXBlID09IENVUlJFTlRfTk9XKQotCQlyZWdfbXNiID0gRFMyNzgxX0NVUlJFTlRfTVNCOwotCWVsc2UgaWYgKHR5cGUgPT0gQ1VSUkVOVF9BVkcpCi0JCXJlZ19tc2IgPSBEUzI3ODFfSUFWR19NU0I7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qCi0JICogVGhlIGN1cnJlbnQgdmFsdWUgaXMgbG9jYXRlZCBpbiAxNiBiaXRzIGFjcm9zcyB0aGUgY3VycmVudCBNU0IKLQkgKiBhbmQgTFNCIHJlZ2lzdGVycyBpbiB0d28ncyBjb21wbGltZW50IGZvcm0KLQkgKiBTaWduIGJpdCBvZiB0aGUgY3VycmVudCB2YWx1ZSBpcyBpbiBiaXQgNyBvZiB0aGUgY3VycmVudCBNU0IgcmVnaXN0ZXIKLQkgKiBCaXRzIDE0IC0gOCBvZiB0aGUgY3VycmVudCB2YWx1ZSBhcmUgaW4gYml0cyA2IC0gMCBvZiB0aGUgY3VycmVudAotCSAqIE1TQiByZWdpc3RlcgotCSAqIEJpdHMgNyAtIDAgb2YgdGhlIGN1cnJlbnQgdmFsdWUgYXJlIGluIGJpdHMgNyAtIDAgb2YgdGhlIGN1cnJlbnQKLQkgKiBMU0IgcmVnaXN0ZXIKLQkgKi8KLQlyZXQgPSBkczI3ODFfcmVhZDE2KGRldl9pbmZvLCAmY3VycmVudF9yYXcsIHJlZ19tc2IpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JKmN1cnJlbnRfdUEgPSBjdXJyZW50X3JhdyAqIChEUzI3ODFfQ1VSUkVOVF9VTklUUyAvIHNlbnNlX3Jlcyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZHMyNzgxX2dldF9hY2N1bXVsYXRlZF9jdXJyZW50KHN0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8gKmRldl9pbmZvLAotCWludCAqYWNjdW11bGF0ZWRfY3VycmVudCkKLXsKLQlpbnQgcmV0LCBzZW5zZV9yZXM7Ci0JczE2IGN1cnJlbnRfcmF3OwotCXU4IHNlbnNlX3Jlc19yYXc7Ci0KLQkvKgotCSAqIFRoZSB1bml0cyBvZiBtZWFzdXJlbWVudCBmb3IgYWNjdW11bGF0ZWQgY3VycmVudCBhcmUgZGVwZW5kZW50IG9uCi0JICogdGhlIHZhbHVlIG9mIHRoZSBzZW5zZSByZXNpc3Rvci4KLQkgKi8KLQlyZXQgPSBkczI3ODFfcmVhZDgoZGV2X2luZm8sICZzZW5zZV9yZXNfcmF3LCBEUzI3ODFfUlNOU1ApOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKHNlbnNlX3Jlc19yYXcgPT0gMCkgewotCQlkZXZfZXJyKGRldl9pbmZvLT5kZXYsICJzZW5zZSByZXNpc3RvciB2YWx1ZSBpcyAwXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXNlbnNlX3JlcyA9IDEwMDAgLyBzZW5zZV9yZXNfcmF3OwotCi0JLyoKLQkgKiBUaGUgQUNSIHZhbHVlIGlzIGxvY2F0ZWQgaW4gMTYgYml0cyBhY3Jvc3MgdGhlIEFDUiBNU0IgYW5kCi0JICogTFNCIHJlZ2lzdGVycwotCSAqIEJpdHMgMTUgLSA4IG9mIHRoZSBBQ1IgdmFsdWUgYXJlIGluIGJpdHMgNyAtIDAgb2YgdGhlIEFDUgotCSAqIE1TQiByZWdpc3RlcgotCSAqIEJpdHMgNyAtIDAgb2YgdGhlIEFDUiB2YWx1ZSBhcmUgaW4gYml0cyA3IC0gMCBvZiB0aGUgQUNSCi0JICogTFNCIHJlZ2lzdGVyCi0JICovCi0JcmV0ID0gZHMyNzgxX3JlYWQxNihkZXZfaW5mbywgJmN1cnJlbnRfcmF3LCBEUzI3ODFfQUNSX01TQik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQkqYWNjdW11bGF0ZWRfY3VycmVudCA9IGN1cnJlbnRfcmF3ICogKERTMjc4MV9DSEFSR0VfVU5JVFMgLyBzZW5zZV9yZXMpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGRzMjc4MV9nZXRfY2FwYWNpdHkoc3RydWN0IGRzMjc4MV9kZXZpY2VfaW5mbyAqZGV2X2luZm8sCi0JaW50ICpjYXBhY2l0eSkKLXsKLQlpbnQgcmV0OwotCXU4IHJhdzsKLQotCXJldCA9IGRzMjc4MV9yZWFkOChkZXZfaW5mbywgJnJhdywgRFMyNzgxX1JBUkMpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JKmNhcGFjaXR5ID0gcmF3OwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGRzMjc4MV9nZXRfc3RhdHVzKHN0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8gKmRldl9pbmZvLCBpbnQgKnN0YXR1cykKLXsKLQlpbnQgcmV0LCBjdXJyZW50X3VBLCBjYXBhY2l0eTsKLQotCXJldCA9IGRzMjc4MV9nZXRfY3VycmVudChkZXZfaW5mbywgQ1VSUkVOVF9OT1csICZjdXJyZW50X3VBKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGRzMjc4MV9nZXRfY2FwYWNpdHkoZGV2X2luZm8sICZjYXBhY2l0eSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAocG93ZXJfc3VwcGx5X2FtX2lfc3VwcGxpZWQoZGV2X2luZm8tPmJhdCkpIHsKLQkJaWYgKGNhcGFjaXR5ID09IDEwMCkKLQkJCSpzdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0ZVTEw7Ci0JCWVsc2UgaWYgKGN1cnJlbnRfdUEgPiA1MDAwMCkKLQkJCSpzdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOwotCQllbHNlCi0JCQkqc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19OT1RfQ0hBUkdJTkc7Ci0JfSBlbHNlIHsKLQkJKnN0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkc7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGRzMjc4MV9nZXRfY2hhcmdlX25vdyhzdHJ1Y3QgZHMyNzgxX2RldmljZV9pbmZvICpkZXZfaW5mbywKLQlpbnQgKmNoYXJnZV9ub3cpCi17Ci0JaW50IHJldDsKLQl1MTYgY2hhcmdlX3JhdzsKLQotCS8qCi0JICogVGhlIFJBQUMgdmFsdWUgaXMgbG9jYXRlZCBpbiAxNiBiaXRzIGFjcm9zcyB0aGUgUkFBQyBNU0IgYW5kCi0JICogTFNCIHJlZ2lzdGVycwotCSAqIEJpdHMgMTUgLSA4IG9mIHRoZSBSQUFDIHZhbHVlIGFyZSBpbiBiaXRzIDcgLSAwIG9mIHRoZSBSQUFDCi0JICogTVNCIHJlZ2lzdGVyCi0JICogQml0cyA3IC0gMCBvZiB0aGUgUkFBQyB2YWx1ZSBhcmUgaW4gYml0cyA3IC0gMCBvZiB0aGUgUkFBQwotCSAqIExTQiByZWdpc3RlcgotCSAqLwotCXJldCA9IGRzMjc4MV9yZWFkMTYoZGV2X2luZm8sICZjaGFyZ2VfcmF3LCBEUzI3ODFfUkFBQ19NU0IpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JKmNoYXJnZV9ub3cgPSBjaGFyZ2VfcmF3ICogMTYwMDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkczI3ODFfZ2V0X2NvbnRyb2xfcmVnaXN0ZXIoc3RydWN0IGRzMjc4MV9kZXZpY2VfaW5mbyAqZGV2X2luZm8sCi0JdTggKmNvbnRyb2xfcmVnKQotewotCXJldHVybiBkczI3ODFfcmVhZDgoZGV2X2luZm8sIGNvbnRyb2xfcmVnLCBEUzI3ODFfQ09OVFJPTCk7Ci19Ci0KLXN0YXRpYyBpbnQgZHMyNzgxX3NldF9jb250cm9sX3JlZ2lzdGVyKHN0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8gKmRldl9pbmZvLAotCXU4IGNvbnRyb2xfcmVnKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBkczI3ODFfd3JpdGUoZGV2X2luZm8sICZjb250cm9sX3JlZywKLQkJCQlEUzI3ODFfQ09OVFJPTCwgc2l6ZW9mKHU4KSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gZHMyNzgxX3NhdmVfZWVwcm9tKGRldl9pbmZvLCBEUzI3ODFfQ09OVFJPTCk7Ci19Ci0KLXN0YXRpYyBpbnQgZHMyNzgxX2JhdHRlcnlfZ2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKLQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCi0JdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgZHMyNzgxX2RldmljZV9pbmZvICpkZXZfaW5mbyA9IHRvX2RzMjc4MV9kZXZpY2VfaW5mbyhwc3kpOwotCi0Jc3dpdGNoIChwc3ApIHsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XOgotCQlyZXQgPSBkczI3ODFfZ2V0X3ZvbHRhZ2UoZGV2X2luZm8sICZ2YWwtPmludHZhbCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QOgotCQlyZXQgPSBkczI3ODFfZ2V0X3RlbXBlcmF0dXJlKGRldl9pbmZvLCAmdmFsLT5pbnR2YWwpOwotCQlicmVhazsKLQotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfTU9ERUxfTkFNRToKLQkJdmFsLT5zdHJ2YWwgPSBtb2RlbDsKLQkJYnJlYWs7Ci0KLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUjoKLQkJdmFsLT5zdHJ2YWwgPSBtYW51ZmFjdHVyZXI7Ci0JCWJyZWFrOwotCi0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVzoKLQkJcmV0ID0gZHMyNzgxX2dldF9jdXJyZW50KGRldl9pbmZvLCBDVVJSRU5UX05PVywgJnZhbC0+aW50dmFsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfQVZHOgotCQlyZXQgPSBkczI3ODFfZ2V0X2N1cnJlbnQoZGV2X2luZm8sIENVUlJFTlRfQVZHLCAmdmFsLT5pbnR2YWwpOwotCQlicmVhazsKLQotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgotCQlyZXQgPSBkczI3ODFfZ2V0X3N0YXR1cyhkZXZfaW5mbywgJnZhbC0+aW50dmFsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZOgotCQlyZXQgPSBkczI3ODFfZ2V0X2NhcGFjaXR5KGRldl9pbmZvLCAmdmFsLT5pbnR2YWwpOwotCQlicmVhazsKLQotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0NPVU5URVI6Ci0JCXJldCA9IGRzMjc4MV9nZXRfYWNjdW11bGF0ZWRfY3VycmVudChkZXZfaW5mbywgJnZhbC0+aW50dmFsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9OT1c6Ci0JCXJldCA9IGRzMjc4MV9nZXRfY2hhcmdlX25vdyhkZXZfaW5mbywgJnZhbC0+aW50dmFsKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXQgPSAtRUlOVkFMOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBkczI3ODFfYmF0dGVyeV9wcm9wc1tdID0gewotCVBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywKLQlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVywKLQlQT1dFUl9TVVBQTFlfUFJPUF9URU1QLAotCVBPV0VSX1NVUFBMWV9QUk9QX01PREVMX05BTUUsCi0JUE9XRVJfU1VQUExZX1BST1BfTUFOVUZBQ1RVUkVSLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfQVZHLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9DT1VOVEVSLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9OT1csCi19OwotCi1zdGF0aWMgc3NpemVfdCBkczI3ODFfZ2V0X3Btb2RfZW5hYmxlZChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0Jc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JY2hhciAqYnVmKQotewotCWludCByZXQ7Ci0JdTggY29udHJvbF9yZWc7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gdG9fcG93ZXJfc3VwcGx5KGRldik7Ci0Jc3RydWN0IGRzMjc4MV9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSB0b19kczI3ODFfZGV2aWNlX2luZm8ocHN5KTsKLQotCS8qIEdldCBwb3dlciBtb2RlICovCi0JcmV0ID0gZHMyNzgxX2dldF9jb250cm9sX3JlZ2lzdGVyKGRldl9pbmZvLCAmY29udHJvbF9yZWcpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCi0JCSAhIShjb250cm9sX3JlZyAmIERTMjc4MV9DT05UUk9MX1BNT0QpKTsKLX0KLQotc3RhdGljIHNzaXplX3QgZHMyNzgxX3NldF9wbW9kX2VuYWJsZWQoc3RydWN0IGRldmljZSAqZGV2LAotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCWNvbnN0IGNoYXIgKmJ1ZiwKLQlzaXplX3QgY291bnQpCi17Ci0JaW50IHJldDsKLQl1OCBjb250cm9sX3JlZywgbmV3X3NldHRpbmc7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gdG9fcG93ZXJfc3VwcGx5KGRldik7Ci0Jc3RydWN0IGRzMjc4MV9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSB0b19kczI3ODFfZGV2aWNlX2luZm8ocHN5KTsKLQotCS8qIFNldCBwb3dlciBtb2RlICovCi0JcmV0ID0gZHMyNzgxX2dldF9jb250cm9sX3JlZ2lzdGVyKGRldl9pbmZvLCAmY29udHJvbF9yZWcpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0ga3N0cnRvdTgoYnVmLCAwLCAmbmV3X3NldHRpbmcpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKChuZXdfc2V0dGluZyAhPSAwKSAmJiAobmV3X3NldHRpbmcgIT0gMSkpIHsKLQkJZGV2X2VycihkZXZfaW5mby0+ZGV2LCAiSW52YWxpZCBwbW9kIHNldHRpbmcgKDAgb3IgMSlcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAobmV3X3NldHRpbmcpCi0JCWNvbnRyb2xfcmVnIHw9IERTMjc4MV9DT05UUk9MX1BNT0Q7Ci0JZWxzZQotCQljb250cm9sX3JlZyAmPSB+RFMyNzgxX0NPTlRST0xfUE1PRDsKLQotCXJldCA9IGRzMjc4MV9zZXRfY29udHJvbF9yZWdpc3RlcihkZXZfaW5mbywgY29udHJvbF9yZWcpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBkczI3ODFfZ2V0X3NlbnNlX3Jlc2lzdG9yX3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQljaGFyICpidWYpCi17Ci0JaW50IHJldDsKLQl1OCBzZW5zZV9yZXNpc3RvcjsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSB0b19wb3dlcl9zdXBwbHkoZGV2KTsKLQlzdHJ1Y3QgZHMyNzgxX2RldmljZV9pbmZvICpkZXZfaW5mbyA9IHRvX2RzMjc4MV9kZXZpY2VfaW5mbyhwc3kpOwotCi0JcmV0ID0gZHMyNzgxX3JlYWQ4KGRldl9pbmZvLCAmc2Vuc2VfcmVzaXN0b3IsIERTMjc4MV9SU05TUCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBzZW5zZV9yZXNpc3Rvcik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgZHMyNzgxX3NldF9zZW5zZV9yZXNpc3Rvcl92YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0Jc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JY29uc3QgY2hhciAqYnVmLAotCXNpemVfdCBjb3VudCkKLXsKLQlpbnQgcmV0OwotCXU4IG5ld19zZXR0aW5nOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IHRvX3Bvd2VyX3N1cHBseShkZXYpOwotCXN0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8gKmRldl9pbmZvID0gdG9fZHMyNzgxX2RldmljZV9pbmZvKHBzeSk7Ci0KLQlyZXQgPSBrc3RydG91OChidWYsIDAsICZuZXdfc2V0dGluZyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBkczI3ODFfc2V0X3NlbnNlX3JlZ2lzdGVyKGRldl9pbmZvLCBuZXdfc2V0dGluZyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGRzMjc4MV9nZXRfcnNnYWluX3NldHRpbmcoc3RydWN0IGRldmljZSAqZGV2LAotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCWNoYXIgKmJ1ZikKLXsKLQlpbnQgcmV0OwotCXUxNiByc2dhaW47Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gdG9fcG93ZXJfc3VwcGx5KGRldik7Ci0Jc3RydWN0IGRzMjc4MV9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSB0b19kczI3ODFfZGV2aWNlX2luZm8ocHN5KTsKLQotCXJldCA9IGRzMjc4MV9nZXRfcnNnYWluX3JlZ2lzdGVyKGRldl9pbmZvLCAmcnNnYWluKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCByc2dhaW4pOwotfQotCi1zdGF0aWMgc3NpemVfdCBkczI3ODFfc2V0X3JzZ2Fpbl9zZXR0aW5nKHN0cnVjdCBkZXZpY2UgKmRldiwKLQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQljb25zdCBjaGFyICpidWYsCi0Jc2l6ZV90IGNvdW50KQotewotCWludCByZXQ7Ci0JdTE2IG5ld19zZXR0aW5nOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IHRvX3Bvd2VyX3N1cHBseShkZXYpOwotCXN0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8gKmRldl9pbmZvID0gdG9fZHMyNzgxX2RldmljZV9pbmZvKHBzeSk7Ci0KLQlyZXQgPSBrc3RydG91MTYoYnVmLCAwLCAmbmV3X3NldHRpbmcpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JLyogR2FpbiBjYW4gb25seSBiZSBmcm9tIDAgdG8gMS45OTkgaW4gc3RlcHMgb2YgLjAwMSAqLwotCWlmIChuZXdfc2V0dGluZyA+IDE5OTkpIHsKLQkJZGV2X2VycihkZXZfaW5mby0+ZGV2LCAiSW52YWxpZCByc2dhaW4gc2V0dGluZyAoMCAtIDE5OTkpXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0gZHMyNzgxX3NldF9yc2dhaW5fcmVnaXN0ZXIoZGV2X2luZm8sIG5ld19zZXR0aW5nKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3QgZHMyNzgxX2dldF9waW9fcGluKHN0cnVjdCBkZXZpY2UgKmRldiwKLQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQljaGFyICpidWYpCi17Ci0JaW50IHJldDsKLQl1OCBzZnI7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gdG9fcG93ZXJfc3VwcGx5KGRldik7Ci0Jc3RydWN0IGRzMjc4MV9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSB0b19kczI3ODFfZGV2aWNlX2luZm8ocHN5KTsKLQotCXJldCA9IGRzMjc4MV9yZWFkOChkZXZfaW5mbywgJnNmciwgRFMyNzgxX1NGUik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBzZnIgJiBEUzI3ODFfU0ZSX1BJT1NDKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCBkczI3ODFfc2V0X3Bpb19waW4oc3RydWN0IGRldmljZSAqZGV2LAotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCWNvbnN0IGNoYXIgKmJ1ZiwKLQlzaXplX3QgY291bnQpCi17Ci0JaW50IHJldDsKLQl1OCBuZXdfc2V0dGluZzsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSB0b19wb3dlcl9zdXBwbHkoZGV2KTsKLQlzdHJ1Y3QgZHMyNzgxX2RldmljZV9pbmZvICpkZXZfaW5mbyA9IHRvX2RzMjc4MV9kZXZpY2VfaW5mbyhwc3kpOwotCi0JcmV0ID0ga3N0cnRvdTgoYnVmLCAwLCAmbmV3X3NldHRpbmcpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKChuZXdfc2V0dGluZyAhPSAwKSAmJiAobmV3X3NldHRpbmcgIT0gMSkpIHsKLQkJZGV2X2VycihkZXZfaW5mby0+ZGV2LCAiSW52YWxpZCBwaW9fcGluIHNldHRpbmcgKDAgb3IgMSlcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXQgPSBkczI3ODFfd3JpdGUoZGV2X2luZm8sICZuZXdfc2V0dGluZywKLQkJCQlEUzI3ODFfU0ZSLCBzaXplb2YodTgpKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3QgZHMyNzgxX3JlYWRfcGFyYW1fZWVwcm9tX2JpbihzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCi0JCQkJY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IHRvX3Bvd2VyX3N1cHBseShkZXYpOwotCXN0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8gKmRldl9pbmZvID0gdG9fZHMyNzgxX2RldmljZV9pbmZvKHBzeSk7Ci0KLQlyZXR1cm4gZHMyNzgxX3JlYWRfYmxvY2soZGV2X2luZm8sIGJ1ZiwKLQkJCQlEUzI3ODFfRUVQUk9NX0JMT0NLMV9TVEFSVCArIG9mZiwgY291bnQpOwotfQotCi1zdGF0aWMgc3NpemVfdCBkczI3ODFfd3JpdGVfcGFyYW1fZWVwcm9tX2JpbihzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCi0JCQkJY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IHRvX3Bvd2VyX3N1cHBseShkZXYpOwotCXN0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8gKmRldl9pbmZvID0gdG9fZHMyNzgxX2RldmljZV9pbmZvKHBzeSk7Ci0JaW50IHJldDsKLQotCXJldCA9IGRzMjc4MV93cml0ZShkZXZfaW5mbywgYnVmLAotCQkJCURTMjc4MV9FRVBST01fQkxPQ0sxX1NUQVJUICsgb2ZmLCBjb3VudCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBkczI3ODFfc2F2ZV9lZXByb20oZGV2X2luZm8sIERTMjc4MV9FRVBST01fQkxPQ0sxX1NUQVJUKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIGRzMjc4MV9wYXJhbV9lZXByb21fYmluX2F0dHIgPSB7Ci0JLmF0dHIgPSB7Ci0JCS5uYW1lID0gInBhcmFtX2VlcHJvbSIsCi0JCS5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IsCi0JfSwKLQkuc2l6ZSA9IERTMjc4MV9QQVJBTV9FRVBST01fU0laRSwKLQkucmVhZCA9IGRzMjc4MV9yZWFkX3BhcmFtX2VlcHJvbV9iaW4sCi0JLndyaXRlID0gZHMyNzgxX3dyaXRlX3BhcmFtX2VlcHJvbV9iaW4sCi19OwotCi1zdGF0aWMgc3NpemVfdCBkczI3ODFfcmVhZF91c2VyX2VlcHJvbV9iaW4oc3RydWN0IGZpbGUgKmZpbHAsCi0JCQkJc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAotCQkJCWNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSB0b19wb3dlcl9zdXBwbHkoZGV2KTsKLQlzdHJ1Y3QgZHMyNzgxX2RldmljZV9pbmZvICpkZXZfaW5mbyA9IHRvX2RzMjc4MV9kZXZpY2VfaW5mbyhwc3kpOwotCi0JcmV0dXJuIGRzMjc4MV9yZWFkX2Jsb2NrKGRldl9pbmZvLCBidWYsCi0JCQkJRFMyNzgxX0VFUFJPTV9CTE9DSzBfU1RBUlQgKyBvZmYsIGNvdW50KTsKLQotfQotCi1zdGF0aWMgc3NpemVfdCBkczI3ODFfd3JpdGVfdXNlcl9lZXByb21fYmluKHN0cnVjdCBmaWxlICpmaWxwLAotCQkJCXN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCXN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKLQkJCQljaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gdG9fcG93ZXJfc3VwcGx5KGRldik7Ci0Jc3RydWN0IGRzMjc4MV9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSB0b19kczI3ODFfZGV2aWNlX2luZm8ocHN5KTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZHMyNzgxX3dyaXRlKGRldl9pbmZvLCBidWYsCi0JCQkJRFMyNzgxX0VFUFJPTV9CTE9DSzBfU1RBUlQgKyBvZmYsIGNvdW50KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGRzMjc4MV9zYXZlX2VlcHJvbShkZXZfaW5mbywgRFMyNzgxX0VFUFJPTV9CTE9DSzBfU1RBUlQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgZHMyNzgxX3VzZXJfZWVwcm9tX2Jpbl9hdHRyID0gewotCS5hdHRyID0gewotCQkubmFtZSA9ICJ1c2VyX2VlcHJvbSIsCi0JCS5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IsCi0JfSwKLQkuc2l6ZSA9IERTMjc4MV9VU0VSX0VFUFJPTV9TSVpFLAotCS5yZWFkID0gZHMyNzgxX3JlYWRfdXNlcl9lZXByb21fYmluLAotCS53cml0ZSA9IGRzMjc4MV93cml0ZV91c2VyX2VlcHJvbV9iaW4sCi19OwotCi1zdGF0aWMgREVWSUNFX0FUVFIocG1vZF9lbmFibGVkLCBTX0lSVUdPIHwgU19JV1VTUiwgZHMyNzgxX2dldF9wbW9kX2VuYWJsZWQsCi0JZHMyNzgxX3NldF9wbW9kX2VuYWJsZWQpOwotc3RhdGljIERFVklDRV9BVFRSKHNlbnNlX3Jlc2lzdG9yX3ZhbHVlLCBTX0lSVUdPIHwgU19JV1VTUiwKLQlkczI3ODFfZ2V0X3NlbnNlX3Jlc2lzdG9yX3ZhbHVlLCBkczI3ODFfc2V0X3NlbnNlX3Jlc2lzdG9yX3ZhbHVlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihyc2dhaW5fc2V0dGluZywgU19JUlVHTyB8IFNfSVdVU1IsIGRzMjc4MV9nZXRfcnNnYWluX3NldHRpbmcsCi0JZHMyNzgxX3NldF9yc2dhaW5fc2V0dGluZyk7Ci1zdGF0aWMgREVWSUNFX0FUVFIocGlvX3BpbiwgU19JUlVHTyB8IFNfSVdVU1IsIGRzMjc4MV9nZXRfcGlvX3BpbiwKLQlkczI3ODFfc2V0X3Bpb19waW4pOwotCi0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpkczI3ODFfYXR0cmlidXRlc1tdID0gewotCSZkZXZfYXR0cl9wbW9kX2VuYWJsZWQuYXR0ciwKLQkmZGV2X2F0dHJfc2Vuc2VfcmVzaXN0b3JfdmFsdWUuYXR0ciwKLQkmZGV2X2F0dHJfcnNnYWluX3NldHRpbmcuYXR0ciwKLQkmZGV2X2F0dHJfcGlvX3Bpbi5hdHRyLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGRzMjc4MV9hdHRyX2dyb3VwID0gewotCS5hdHRycyA9IGRzMjc4MV9hdHRyaWJ1dGVzLAotfTsKLQotc3RhdGljIGludCBkczI3ODFfYmF0dGVyeV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgZHMyNzgxX2RldmljZV9pbmZvICpkZXZfaW5mbzsKLQotCWRldl9pbmZvID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZGV2X2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldl9pbmZvKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRldl9pbmZvKTsKLQotCWRldl9pbmZvLT5kZXYJCQk9ICZwZGV2LT5kZXY7Ci0JZGV2X2luZm8tPncxX2RldgkJPSBwZGV2LT5kZXYucGFyZW50OwotCWRldl9pbmZvLT5iYXRfZGVzYy5uYW1lCQk9IGRldl9uYW1lKCZwZGV2LT5kZXYpOwotCWRldl9pbmZvLT5iYXRfZGVzYy50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7Ci0JZGV2X2luZm8tPmJhdF9kZXNjLnByb3BlcnRpZXMJPSBkczI3ODFfYmF0dGVyeV9wcm9wczsKLQlkZXZfaW5mby0+YmF0X2Rlc2MubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKGRzMjc4MV9iYXR0ZXJ5X3Byb3BzKTsKLQlkZXZfaW5mby0+YmF0X2Rlc2MuZ2V0X3Byb3BlcnR5CT0gZHMyNzgxX2JhdHRlcnlfZ2V0X3Byb3BlcnR5OwotCi0JcHN5X2NmZy5kcnZfZGF0YQkJPSBkZXZfaW5mbzsKLQotCWRldl9pbmZvLT5iYXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmRldl9pbmZvLT5iYXRfZGVzYywKLQkJCQkJCSZwc3lfY2ZnKTsKLQlpZiAoSVNfRVJSKGRldl9pbmZvLT5iYXQpKSB7Ci0JCWRldl9lcnIoZGV2X2luZm8tPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBiYXR0ZXJ5XG4iKTsKLQkJcmV0ID0gUFRSX0VSUihkZXZfaW5mby0+YmF0KTsKLQkJZ290byBmYWlsOwotCX0KLQotCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2X2luZm8tPmJhdC0+ZGV2LmtvYmosICZkczI3ODFfYXR0cl9ncm91cCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRldl9pbmZvLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGdyb3VwXG4iKTsKLQkJZ290byBmYWlsX3VucmVnaXN0ZXI7Ci0JfQotCi0JcmV0ID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZkZXZfaW5mby0+YmF0LT5kZXYua29iaiwKLQkJCQkJJmRzMjc4MV9wYXJhbV9lZXByb21fYmluX2F0dHIpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihkZXZfaW5mby0+ZGV2LAotCQkJCSJmYWlsZWQgdG8gY3JlYXRlIHBhcmFtIGVlcHJvbSBiaW4gZmlsZSIpOwotCQlnb3RvIGZhaWxfcmVtb3ZlX2dyb3VwOwotCX0KLQotCXJldCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmZGV2X2luZm8tPmJhdC0+ZGV2LmtvYmosCi0JCQkJCSZkczI3ODFfdXNlcl9lZXByb21fYmluX2F0dHIpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihkZXZfaW5mby0+ZGV2LAotCQkJCSJmYWlsZWQgdG8gY3JlYXRlIHVzZXIgZWVwcm9tIGJpbiBmaWxlIik7Ci0JCWdvdG8gZmFpbF9yZW1vdmVfYmluX2ZpbGU7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWZhaWxfcmVtb3ZlX2Jpbl9maWxlOgotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmZGV2X2luZm8tPmJhdC0+ZGV2LmtvYmosCi0JCQkJJmRzMjc4MV9wYXJhbV9lZXByb21fYmluX2F0dHIpOwotZmFpbF9yZW1vdmVfZ3JvdXA6Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXZfaW5mby0+YmF0LT5kZXYua29iaiwgJmRzMjc4MV9hdHRyX2dyb3VwKTsKLWZhaWxfdW5yZWdpc3RlcjoKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihkZXZfaW5mby0+YmF0KTsKLWZhaWw6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBkczI3ODFfYmF0dGVyeV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgZHMyNzgxX2RldmljZV9pbmZvICpkZXZfaW5mbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JLyoKLQkgKiBSZW1vdmUgYXR0cmlidXRlcyBiZWZvcmUgdW5yZWdpc3RlcmluZyBwb3dlciBzdXBwbHkKLQkgKiBiZWNhdXNlICdiYXQnIHdpbGwgYmUgZnJlZWQgb24gcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoKSBjYWxsLgotCSAqLwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2X2luZm8tPmJhdC0+ZGV2LmtvYmosICZkczI3ODFfYXR0cl9ncm91cCk7Ci0KLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihkZXZfaW5mby0+YmF0KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBkczI3ODFfYmF0dGVyeV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAiZHMyNzgxLWJhdHRlcnkiLAotCX0sCi0JLnByb2JlCSAgPSBkczI3ODFfYmF0dGVyeV9wcm9iZSwKLQkucmVtb3ZlICAgPSBkczI3ODFfYmF0dGVyeV9yZW1vdmUsCi19OwotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihkczI3ODFfYmF0dGVyeV9kcml2ZXIpOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJSZW5hdGEgU2F5YWtob3ZhIDxyZW5hdGFAb2t0ZXRsYWJzLnJ1PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXhpbS9EYWxsYXMgRFMyNzgxIFN0YW5kLUFsb25lIEZ1ZWwgR2F1YWdlIElDIGRyaXZlciIpOwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpkczI3ODEtYmF0dGVyeSIpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2ludGVsX21pZF9iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL2ludGVsX21pZF9iYXR0ZXJ5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYTRhY2MuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9wb3dlci9pbnRlbF9taWRfYmF0dGVyeS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzk2ICswLDAgQEAKLS8qCi0gKiBpbnRlbF9taWRfYmF0dGVyeS5jIC0gSW50ZWwgTUlEIFBNSUMgQmF0dGVyeSBEcml2ZXIKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgSW50ZWwgQ29ycG9yYXRpb24KLSAqCi0gKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgotICoKLSAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0gKiBBdXRob3I6IE5pdGhpc2ggTWFoYWxpbmdhbSA8bml0aGlzaC5tYWhhbGluZ2FtQGludGVsLmNvbT4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KLQotI2luY2x1ZGUgPGFzbS9pbnRlbF9zY3VfaXBjLmg+Ci0KLSNkZWZpbmUgRFJJVkVSX05BTUUgInBtaWNfYmF0dGVyeSIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCUdlbmVyaWMgZGVmaW5lcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludCBkZWJ1ZzsKLW1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJGbGFnIHRvIGVuYWJsZSBQTUlDIEJhdHRlcnkgZGVidWcgbWVzc2FnZXMuIik7Ci0KLSNkZWZpbmUgUE1JQ19CQVRUX0RSVl9JTkZPX1VQREFURUQJMQotI2RlZmluZSBQTUlDX0JBVFRfUFJFU0VOVAkJMQotI2RlZmluZSBQTUlDX0JBVFRfTk9UX1BSRVNFTlQJCTAKLSNkZWZpbmUgUE1JQ19VU0JfUFJFU0VOVAkJUE1JQ19CQVRUX1BSRVNFTlQKLSNkZWZpbmUgUE1JQ19VU0JfTk9UX1BSRVNFTlQJCVBNSUNfQkFUVF9OT1RfUFJFU0VOVAotCi0vKiBwbWljIGJhdHRlcnkgcmVnaXN0ZXIgcmVsYXRlZCAqLwotI2RlZmluZSBQTUlDX0JBVFRfQ0hSX1NDSFJHSU5UX0FERFIJMHhEMgotI2RlZmluZSBQTUlDX0JBVFRfQ0hSX1NCQVRPVlBfTUFTSwkoMSA8PCAxKQotI2RlZmluZSBQTUlDX0JBVFRfQ0hSX1NURU1QX01BU0sJKDEgPDwgMikKLSNkZWZpbmUgUE1JQ19CQVRUX0NIUl9TQ09NUF9NQVNLCSgxIDw8IDMpCi0jZGVmaW5lIFBNSUNfQkFUVF9DSFJfU1VTQkRFVF9NQVNLCSgxIDw8IDQpCi0jZGVmaW5lIFBNSUNfQkFUVF9DSFJfU0JBVERFVF9NQVNLCSgxIDw8IDUpCi0jZGVmaW5lIFBNSUNfQkFUVF9DSFJfU0RDTE1UX01BU0sJKDEgPDwgNikKLSNkZWZpbmUgUE1JQ19CQVRUX0NIUl9TVVNCT1ZQX01BU0sJKDEgPDwgNykKLSNkZWZpbmUgUE1JQ19CQVRUX0NIUl9FWENQVF9NQVNLCTB4ODYKLQotI2RlZmluZSBQTUlDX0JBVFRfQURDX0FDQ0NIUkdfTUFTSwkoMSA8PCAzMSkKLSNkZWZpbmUgUE1JQ19CQVRUX0FEQ19BQ0NDSFJHVkFMX01BU0sJMHg3RkZGRkZGRgotCi0vKiBwbWljIGlwYyByZWxhdGVkICovCi0jZGVmaW5lIFBNSUNfQkFUVF9DSFJfSVBDX0ZDSFJHX1NVQklECTB4NAotI2RlZmluZSBQTUlDX0JBVFRfQ0hSX0lQQ19UQ0hSR19TVUJJRAkweDYKLQotLyogdHlwZXMgb2YgYmF0dGVyeSBjaGFyZ2luZyAqLwotZW51bSBiYXR0X2NoYXJnZV90eXBlIHsKLQlCQVRUX1VTQk9UR181MDBNQV9DSEFSR0UsCi0JQkFUVF9VU0JPVEdfVFJJQ0tMRV9DSEFSR0UsCi19OwotCi0vKiB2YWxpZCBiYXR0ZXJ5IGV2ZW50cyAqLwotZW51bSBiYXR0X2V2ZW50IHsKLQlCQVRUX0VWRU5UX0JBVE9WUF9FWENQVCwKLQlCQVRUX0VWRU5UX1VTQk9WUF9FWENQVCwKLQlCQVRUX0VWRU5UX1RFTVBfRVhDUFQsCi0JQkFUVF9FVkVOVF9EQ0xNVF9FWENQVCwKLQlCQVRUX0VWRU5UX0VYQ1BUCi19OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQlCYXR0ZXJ5IHByb3BlcnRpZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBwbWljIGJhdHRlcnkgaW5mbwotICovCi1zdHJ1Y3QgcG1pY19wb3dlcl9tb2R1bGVfaW5mbyB7Ci0JYm9vbCBpc19kZXZfaW5mb191cGRhdGVkOwotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQkvKiBwbWljIGJhdHRlcnkgZGF0YSAqLwotCXVuc2lnbmVkIGxvbmcgdXBkYXRlX3RpbWU7CQkvKiBqaWZmaWVzIHdoZW4gZGF0YSByZWFkICovCi0JdW5zaWduZWQgaW50IHVzYl9pc19wcmVzZW50OwotCXVuc2lnbmVkIGludCBiYXR0X2lzX3ByZXNlbnQ7Ci0JdW5zaWduZWQgaW50IGJhdHRfaGVhbHRoOwotCXVuc2lnbmVkIGludCB1c2JfaGVhbHRoOwotCXVuc2lnbmVkIGludCBiYXR0X3N0YXR1czsKLQl1bnNpZ25lZCBpbnQgYmF0dF9jaGFyZ2Vfbm93OwkJLyogaW4gbUFTICovCi0JdW5zaWduZWQgaW50IGJhdHRfcHJldl9jaGFyZ2VfZnVsbDsJLyogaW4gbUFTICovCi0JdW5zaWduZWQgaW50IGJhdHRfY2hhcmdlX3JhdGU7CQkvKiBpbiB1bml0cyBwZXIgc2Vjb25kICovCi0KLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICp1c2I7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0dDsKLQlpbnQgaXJxOwkJCQkvKiBHUEVfSUQgb3IgSVJRIyAqLwotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICptb25pdG9yX3dxdWV1ZTsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIG1vbml0b3JfYmF0dGVyeTsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaGFuZGxlcjsKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZGVsYXlfdGltZSA9IDIwMDA7CS8qIGluIG1zICovCi0KLS8qCi0gKiBwbWljIGFjIHByb3BlcnRpZXMKLSAqLwotc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBtaWNfdXNiX3Byb3BzW10gPSB7Ci0JUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEgsCi19OwotCi0vKgotICogcG1pYyBiYXR0ZXJ5IHByb3BlcnRpZXMKLSAqLwotc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBtaWNfYmF0dGVyeV9wcm9wc1tdID0gewotCVBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywKLQlQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEgsCi0JUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMLAotfTsKLQotCi0vKgotICogR2x1ZSBmdW5jdGlvbnMgZm9yIHRhbGtpbmcgdG8gdGhlIElQQwotICovCi0KLXN0cnVjdCBiYXR0ZXJ5X3Byb3BlcnR5IHsKLQl1MzIgY2FwYWNpdHk7CS8qIENoYXJnZXIgY2FwYWNpdHkgKi8KLQl1OCAgY3JudDsJLyogUXVpY2sgY2hhcmdlIGN1cnJlbnQgdmFsdWUqLwotCXU4ICB2b2x0OwkvKiBGaW5lIGFkanVzdG1lbnQgb2YgY29uc3RhbnQgY2hhcmdlIHZvbHRhZ2UgKi8KLQl1OCAgcHJvdDsJLyogQ0hSR1BST1QgcmVnaXN0ZXIgdmFsdWUgKi8KLQl1OCAgcHJvdDI7CS8qIENIUkdQUk9UMSByZWdpc3RlciB2YWx1ZSAqLwotCXU4ICB0aW1lcjsJLyogQ2hhcmdpbmcgdGltZXIgKi8KLX07Ci0KLSNkZWZpbmUgSVBDTVNHX0JBVFRFUlkJCTB4RUYKLQotLyogQmF0dGVyeSBjb3Vsb21iIGNvdW50ZXIgYWNjdW11bGF0b3IgY29tbWFuZHMgKi8KLSNkZWZpbmUgSVBDX0NNRF9DQ19XUgkJICAwIC8qIFVwZGF0ZSBjb3Vsb21iIGNvdW50ZXIgdmFsdWUgKi8KLSNkZWZpbmUgSVBDX0NNRF9DQ19SRAkJICAxIC8qIFJlYWQgY291bG9tYiBjb3VudGVyIHZhbHVlICovCi0jZGVmaW5lIElQQ19DTURfQkFUVEVSWV9QUk9QRVJUWSAgMiAvKiBSZWFkIEJhdHRlcnkgcHJvcGVydHkgKi8KLQotLyoqCi0gKglwbWljX3NjdV9pcGNfYmF0dGVyeV9jY19yZWFkCS0JcmVhZCBiYXR0ZXJ5IGNjCi0gKglAdmFsdWU6IGJhdHRlcnkgY291bG9tYiBjb3VudGVyIHJlYWQKLSAqCi0gKglSZWFkcyB0aGUgYmF0dGVyeSBjb3Vsb3VtYiBjb3VudGVyIHZhbHVlLCByZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IKLSAqCWFuIGVycm9yIGNvZGUKLSAqCi0gKglUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcC4gTG9ja2luZyBmb3IgU0NVIGFjY2Vzc2VzIGlzIGhhbmRsZWQgZm9yCi0gKgl0aGUgY2FsbGVyLgotICovCi1zdGF0aWMgaW50IHBtaWNfc2N1X2lwY19iYXR0ZXJ5X2NjX3JlYWQodTMyICp2YWx1ZSkKLXsKLQlyZXR1cm4gaW50ZWxfc2N1X2lwY19jb21tYW5kKElQQ01TR19CQVRURVJZLCBJUENfQ01EX0NDX1JELAotCQkJCQlOVUxMLCAwLCB2YWx1ZSwgMSk7Ci19Ci0KLS8qKgotICoJcG1pY19zY3VfaXBjX2JhdHRlcnlfcHJvcGVydHlfZ2V0CS0JZmV0Y2ggcHJvcGVydGllcwotICoJQHByb3A6IGJhdHRlcnkgcHJvcGVydGllcwotICoKLSAqCVJldHJpZXZlIHRoZSBiYXR0ZXJ5IHByb3BlcnRpZXMgZnJvbSB0aGUgcG93ZXIgbWFuYWdlbWVudAotICoKLSAqCVRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwLiBMb2NraW5nIGZvciBTQ1UgYWNjZXNzZXMgaXMgaGFuZGxlZCBmb3IKLSAqCXRoZSBjYWxsZXIuCi0gKi8KLXN0YXRpYyBpbnQgcG1pY19zY3VfaXBjX2JhdHRlcnlfcHJvcGVydHlfZ2V0KHN0cnVjdCBiYXR0ZXJ5X3Byb3BlcnR5ICpwcm9wKQotewotCXUzMiBkYXRhWzNdOwotCXU4ICpwID0gKHU4ICopJmRhdGFbMV07Ci0JaW50IGVyciA9IGludGVsX3NjdV9pcGNfY29tbWFuZChJUENNU0dfQkFUVEVSWSwKLQkJCQlJUENfQ01EX0JBVFRFUllfUFJPUEVSVFksIE5VTEwsIDAsIGRhdGEsIDMpOwotCi0JcHJvcC0+Y2FwYWNpdHkgPSBkYXRhWzBdOwotCXByb3AtPmNybnQgPSAqcCsrOwotCXByb3AtPnZvbHQgPSAqcCsrOwotCXByb3AtPnByb3QgPSAqcCsrOwotCXByb3AtPnByb3QyID0gKnArKzsKLQlwcm9wLT50aW1lciA9ICpwKys7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi0vKioKLSAqCXBtaWNfc2N1X2lwY19zZXRfY2hhcmdlcgktCXNldCBjaGFyZ2VyCi0gKglAY2hhcmdlcjogY2hhcmdlciB0byBzZWxlY3QKLSAqCi0gKglTd2l0Y2ggdGhlIGNoYXJnaW5nIG1vZGUgZm9yIHRoZSBTQ1UKLSAqLwotCi1zdGF0aWMgaW50IHBtaWNfc2N1X2lwY19zZXRfY2hhcmdlcihpbnQgY2hhcmdlcikKLXsKLQlyZXR1cm4gaW50ZWxfc2N1X2lwY19zaW1wbGVfY29tbWFuZChJUENNU0dfQkFUVEVSWSwgY2hhcmdlcik7Ci19Ci0KLS8qKgotICogcG1pY19iYXR0ZXJ5X2xvZ19ldmVudCAtIGxvZyBiYXR0ZXJ5IGV2ZW50cwotICogQGV2ZW50OiBiYXR0ZXJ5IGV2ZW50IHRvIGJlIGxvZ2dlZAotICogQ29udGV4dDogY2FuIHNsZWVwCi0gKgotICogVGhlcmUgYXJlIG11bHRpcGxlIGJhdHRlcnkgZXZlbnRzIHdoaWNoIG1heSBiZSBvZiBpbnRlcmVzdCB0byB1c2VyczsKLSAqIHRoaXMgYmF0dGVyeSBmdW5jdGlvbiBsb2dzIHRoZSBkaWZmZXJlbnQgYmF0dGVyeSBldmVudHMgb250byB0aGUKLSAqIGtlcm5lbCBsb2cgbWVzc2FnZXMuCi0gKi8KLXN0YXRpYyB2b2lkIHBtaWNfYmF0dGVyeV9sb2dfZXZlbnQoZW51bSBiYXR0X2V2ZW50IGV2ZW50KQotewotCXByaW50ayhLRVJOX1dBUk5JTkcgInBtaWMtYmF0dGVyeTogIik7Ci0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgQkFUVF9FVkVOVF9CQVRPVlBfRVhDUFQ6Ci0JCXByaW50ayhLRVJOX0NPTlQgImJhdHRlcnkgb3ZlcnZvbHRhZ2UgY29uZGl0aW9uXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBCQVRUX0VWRU5UX1VTQk9WUF9FWENQVDoKLQkJcHJpbnRrKEtFUk5fQ09OVCAidXNiIGNoYXJnZXIgb3ZlcnZvbHRhZ2UgY29uZGl0aW9uXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBCQVRUX0VWRU5UX1RFTVBfRVhDUFQ6Ci0JCXByaW50ayhLRVJOX0NPTlQgImhpZ2ggYmF0dGVyeSB0ZW1wZXJhdHVyZSBjb25kaXRpb25cbiIpOwotCQlicmVhazsKLQljYXNlIEJBVFRfRVZFTlRfRENMTVRfRVhDUFQ6Ci0JCXByaW50ayhLRVJOX0NPTlQgIm92ZXIgYmF0dGVyeSBjaGFyZ2UgY3VycmVudCBjb25kaXRpb25cbiIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9DT05UICJjaGFyZ2VyL2JhdHRlcnkgZXhjZXB0aW9uICVkXG4iLCBldmVudCk7Ci0JCWJyZWFrOwotCX0KLX0KLQotLyoqCi0gKiBwbWljX2JhdHRlcnlfcmVhZF9zdGF0dXMgLSByZWFkIGJhdHRlcnkgc3RhdHVzIGluZm9ybWF0aW9uCi0gKiBAcGJpOiBkZXZpY2UgaW5mbyBzdHJ1Y3R1cmUgdG8gdXBkYXRlIHRoZSByZWFkIGluZm9ybWF0aW9uCi0gKiBDb250ZXh0OiBjYW4gc2xlZXAKLSAqCi0gKiBQTUlDIHBvd2VyIHNvdXJjZSBpbmZvcm1hdGlvbiBuZWVkIHRvIGJlIHVwZGF0ZWQgYmFzZWQgb24gdGhlIGRhdGEgcmVhZAotICogZnJvbSB0aGUgUE1JQyBiYXR0ZXJ5IHJlZ2lzdGVycy4KLSAqCi0gKi8KLXN0YXRpYyB2b2lkIHBtaWNfYmF0dGVyeV9yZWFkX3N0YXR1cyhzdHJ1Y3QgcG1pY19wb3dlcl9tb2R1bGVfaW5mbyAqcGJpKQotewotCXVuc2lnbmVkIGludCB1cGRhdGVfdGltZV9pbnRydmw7Ci0JdW5zaWduZWQgaW50IGNocmdfdmFsOwotCXUzMiBjY3ZhbDsKLQl1OCByODsKLQlzdHJ1Y3QgYmF0dGVyeV9wcm9wZXJ0eSBiYXR0X3Byb3A7Ci0JaW50IGJhdHRfcHJlc2VudCA9IDA7Ci0JaW50IHVzYl9wcmVzZW50ID0gMDsKLQlpbnQgYmF0dF9leGNlcHRpb24gPSAwOwotCi0JLyogbWFrZSBzdXJlIHRoZSBsYXN0IGJhdHRfc3RhdHVzIHJlYWQgaGFwcGVuZWQgZGVsYXlfdGltZSBiZWZvcmUgKi8KLQlpZiAocGJpLT51cGRhdGVfdGltZSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCBwYmktPnVwZGF0ZV90aW1lICsKLQkJCQkJCW1zZWNzX3RvX2ppZmZpZXMoZGVsYXlfdGltZSkpKQotCQlyZXR1cm47Ci0KLQl1cGRhdGVfdGltZV9pbnRydmwgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLQlwYmktPnVwZGF0ZV90aW1lKTsKLQlwYmktPnVwZGF0ZV90aW1lID0gamlmZmllczsKLQotCS8qIHJlYWQgY291bG9tYiBjb3VudGVyIHJlZ2lzdGVycyBhbmQgc2NocmdpbnQgcmVnaXN0ZXIgKi8KLQlpZiAocG1pY19zY3VfaXBjX2JhdHRlcnlfY2NfcmVhZCgmY2N2YWwpKSB7Ci0JCWRldl93YXJuKHBiaS0+ZGV2LCAiJXMoKTogaXBjIGNvbmZpZyBjbWQgZmFpbGVkXG4iLAotCQkJCQkJCQlfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoaW50ZWxfc2N1X2lwY19pb3JlYWQ4KFBNSUNfQkFUVF9DSFJfU0NIUkdJTlRfQUREUiwgJnI4KSkgewotCQlkZXZfd2FybihwYmktPmRldiwgIiVzKCk6IGlwYyBwbWljIHJlYWQgZmFpbGVkXG4iLAotCQkJCQkJCQlfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqIHNldCBwbWljX3Bvd2VyX21vZHVsZV9pbmZvIG1lbWJlcnMgYmFzZWQgb24gcG1pYyByZWdpc3RlciB2YWx1ZXMKLQkgKiByZWFkLgotCSAqLwotCi0JLyogc2V0IGJhdHRfaXNfcHJlc2VudCAqLwotCWlmIChyOCAmIFBNSUNfQkFUVF9DSFJfU0JBVERFVF9NQVNLKSB7Ci0JCXBiaS0+YmF0dF9pc19wcmVzZW50ID0gUE1JQ19CQVRUX1BSRVNFTlQ7Ci0JCWJhdHRfcHJlc2VudCA9IDE7Ci0JfSBlbHNlIHsKLQkJcGJpLT5iYXR0X2lzX3ByZXNlbnQgPSBQTUlDX0JBVFRfTk9UX1BSRVNFTlQ7Ci0JCXBiaS0+YmF0dF9oZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOS05PV047Ci0JCXBiaS0+YmF0dF9zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047Ci0JfQotCi0JLyogc2V0IGJhdHRfaGVhbHRoICovCi0JaWYgKGJhdHRfcHJlc2VudCkgewotCQlpZiAocjggJiBQTUlDX0JBVFRfQ0hSX1NCQVRPVlBfTUFTSykgewotCQkJcGJpLT5iYXR0X2hlYWx0aCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUlZPTFRBR0U7Ci0JCQlwYmktPmJhdHRfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19OT1RfQ0hBUkdJTkc7Ci0JCQlwbWljX2JhdHRlcnlfbG9nX2V2ZW50KEJBVFRfRVZFTlRfQkFUT1ZQX0VYQ1BUKTsKLQkJCWJhdHRfZXhjZXB0aW9uID0gMTsKLQkJfSBlbHNlIGlmIChyOCAmIFBNSUNfQkFUVF9DSFJfU1RFTVBfTUFTSykgewotCQkJcGJpLT5iYXR0X2hlYWx0aCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUkhFQVQ7Ci0JCQlwYmktPmJhdHRfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19OT1RfQ0hBUkdJTkc7Ci0JCQlwbWljX2JhdHRlcnlfbG9nX2V2ZW50KEJBVFRfRVZFTlRfVEVNUF9FWENQVCk7Ci0JCQliYXR0X2V4Y2VwdGlvbiA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlwYmktPmJhdHRfaGVhbHRoID0gUE9XRVJfU1VQUExZX0hFQUxUSF9HT09EOwotCQkJaWYgKHI4ICYgUE1JQ19CQVRUX0NIUl9TRENMTVRfTUFTSykgewotCQkJCS8qIFBNSUMgd2lsbCBjaGFuZ2UgY2hhcmdpbmcgY3VycmVudCBhdXRvbWF0aWNhbGx5ICovCi0JCQkJcG1pY19iYXR0ZXJ5X2xvZ19ldmVudChCQVRUX0VWRU5UX0RDTE1UX0VYQ1BUKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIHNldCB1c2JfaXNfcHJlc2VudCAqLwotCWlmIChyOCAmIFBNSUNfQkFUVF9DSFJfU1VTQkRFVF9NQVNLKSB7Ci0JCXBiaS0+dXNiX2lzX3ByZXNlbnQgPSBQTUlDX1VTQl9QUkVTRU5UOwotCQl1c2JfcHJlc2VudCA9IDE7Ci0JfSBlbHNlIHsKLQkJcGJpLT51c2JfaXNfcHJlc2VudCA9IFBNSUNfVVNCX05PVF9QUkVTRU5UOwotCQlwYmktPnVzYl9oZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOS05PV047Ci0JfQotCi0JaWYgKHVzYl9wcmVzZW50KSB7Ci0JCWlmIChyOCAmIFBNSUNfQkFUVF9DSFJfU1VTQk9WUF9NQVNLKSB7Ci0JCQlwYmktPnVzYl9oZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJWT0xUQUdFOwotCQkJcG1pY19iYXR0ZXJ5X2xvZ19ldmVudChCQVRUX0VWRU5UX1VTQk9WUF9FWENQVCk7Ci0JCX0gZWxzZSB7Ci0JCQlwYmktPnVzYl9oZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0Q7Ci0JCX0KLQl9Ci0KLQljaHJnX3ZhbCA9IGNjdmFsICYgUE1JQ19CQVRUX0FEQ19BQ0NDSFJHVkFMX01BU0s7Ci0KLQkvKiBzZXQgYmF0dF9wcmV2X2NoYXJnZV9mdWxsIHRvIGJhdHRlcnkgY2FwYWNpdHkgdGhlIGZpcnN0IHRpbWUgKi8KLQlpZiAoIXBiaS0+aXNfZGV2X2luZm9fdXBkYXRlZCkgewotCQlpZiAocG1pY19zY3VfaXBjX2JhdHRlcnlfcHJvcGVydHlfZ2V0KCZiYXR0X3Byb3ApKSB7Ci0JCQlkZXZfd2FybihwYmktPmRldiwgIiVzKCk6IGlwYyBjb25maWcgY21kIGZhaWxlZFxuIiwKLQkJCQkJCQkJX19mdW5jX18pOwotCQkJcmV0dXJuOwotCQl9Ci0JCXBiaS0+YmF0dF9wcmV2X2NoYXJnZV9mdWxsID0gYmF0dF9wcm9wLmNhcGFjaXR5OwotCX0KLQotCS8qIHNldCBiYXR0X3N0YXR1cyAqLwotCWlmIChiYXR0X3ByZXNlbnQgJiYgIWJhdHRfZXhjZXB0aW9uKSB7Ci0JCWlmIChyOCAmIFBNSUNfQkFUVF9DSFJfU0NPTVBfTUFTSykgewotCQkJcGJpLT5iYXR0X3N0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTDsKLQkJCXBiaS0+YmF0dF9wcmV2X2NoYXJnZV9mdWxsID0gY2hyZ192YWw7Ci0JCX0gZWxzZSBpZiAoY2N2YWwgJiBQTUlDX0JBVFRfQURDX0FDQ0NIUkdfTUFTSykgewotCQkJcGJpLT5iYXR0X3N0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkc7Ci0JCX0gZWxzZSB7Ci0JCQlwYmktPmJhdHRfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKLQkJfQotCX0KLQotCS8qIHNldCBiYXR0X2NoYXJnZV9yYXRlICovCi0JaWYgKHBiaS0+aXNfZGV2X2luZm9fdXBkYXRlZCAmJiBiYXR0X3ByZXNlbnQgJiYgIWJhdHRfZXhjZXB0aW9uKSB7Ci0JCWlmIChwYmktPmJhdHRfc3RhdHVzID09IFBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkcpIHsKLQkJCWlmIChwYmktPmJhdHRfY2hhcmdlX25vdyAtIGNocmdfdmFsKSB7Ci0JCQkJcGJpLT5iYXR0X2NoYXJnZV9yYXRlID0gKChwYmktPmJhdHRfY2hhcmdlX25vdyAtCi0JCQkJCWNocmdfdmFsKSAqIDEwMDAgKiA2MCkgLwotCQkJCQl1cGRhdGVfdGltZV9pbnRydmw7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocGJpLT5iYXR0X3N0YXR1cyA9PSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HKSB7Ci0JCQlpZiAoY2hyZ192YWwgLSBwYmktPmJhdHRfY2hhcmdlX25vdykgewotCQkJCXBiaS0+YmF0dF9jaGFyZ2VfcmF0ZSA9ICgoY2hyZ192YWwgLQotCQkJCQlwYmktPmJhdHRfY2hhcmdlX25vdykgKiAxMDAwICogNjApIC8KLQkJCQkJdXBkYXRlX3RpbWVfaW50cnZsOwotCQkJfQotCQl9IGVsc2UKLQkJCXBiaS0+YmF0dF9jaGFyZ2VfcmF0ZSA9IDA7Ci0JfSBlbHNlIHsKLQkJcGJpLT5iYXR0X2NoYXJnZV9yYXRlID0gLTE7Ci0JfQotCi0JLyogYmF0dF9jaGFyZ2Vfbm93ICovCi0JaWYgKGJhdHRfcHJlc2VudCAmJiAhYmF0dF9leGNlcHRpb24pCi0JCXBiaS0+YmF0dF9jaGFyZ2Vfbm93ID0gY2hyZ192YWw7Ci0JZWxzZQotCQlwYmktPmJhdHRfY2hhcmdlX25vdyA9IC0xOwotCi0JcGJpLT5pc19kZXZfaW5mb191cGRhdGVkID0gUE1JQ19CQVRUX0RSVl9JTkZPX1VQREFURUQ7Ci19Ci0KLS8qKgotICogcG1pY191c2JfZ2V0X3Byb3BlcnR5IC0gdXNiIHBvd2VyIHNvdXJjZSBnZXQgcHJvcGVydHkKLSAqIEBwc3k6IHVzYiBwb3dlciBzdXBwbHkgY29udGV4dAotICogQHBzcDogdXNiIHBvd2VyIHNvdXJjZSBwcm9wZXJ0eQotICogQHZhbDogdXNiIHBvd2VyIHNvdXJjZSBwcm9wZXJ0eSB2YWx1ZQotICogQ29udGV4dDogY2FuIHNsZWVwCi0gKgotICogUE1JQyB1c2IgcG93ZXIgc291cmNlIHByb3BlcnR5IG5lZWRzIHRvIGJlIHByb3ZpZGVkIHRvIHBvd2VyX3N1cHBseQotICogc3Vic3l0ZW0gZm9yIGl0IHRvIHByb3ZpZGUgdGhlIGluZm9ybWF0aW9uIHRvIHVzZXJzLgotICovCi1zdGF0aWMgaW50IHBtaWNfdXNiX2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCi0JCQkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAotCQkJCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCi17Ci0Jc3RydWN0IHBtaWNfcG93ZXJfbW9kdWxlX2luZm8gKnBiaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwotCi0JLyogdXBkYXRlIHBtaWNfcG93ZXJfbW9kdWxlX2luZm8gbWVtYmVycyAqLwotCXBtaWNfYmF0dGVyeV9yZWFkX3N0YXR1cyhwYmkpOwotCi0Jc3dpdGNoIChwc3ApIHsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ6Ci0JCXZhbC0+aW50dmFsID0gcGJpLT51c2JfaXNfcHJlc2VudDsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEg6Ci0JCXZhbC0+aW50dmFsID0gcGJpLT51c2JfaGVhbHRoOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG1BU3RvdUFoKHVuc2lnbmVkIGxvbmcgdikKLXsKLQkvKiBzZWNvbmRzIHRvIGhvdXJzLCBtQSB0byDCtUEgKi8KLQlyZXR1cm4gKHYgKiAxMDAwKSAvIDM2MDA7Ci19Ci0KLS8qKgotICogcG1pY19iYXR0ZXJ5X2dldF9wcm9wZXJ0eSAtIGJhdHRlcnkgcG93ZXIgc291cmNlIGdldCBwcm9wZXJ0eQotICogQHBzeTogYmF0dGVyeSBwb3dlciBzdXBwbHkgY29udGV4dAotICogQHBzcDogYmF0dGVyeSBwb3dlciBzb3VyY2UgcHJvcGVydHkKLSAqIEB2YWw6IGJhdHRlcnkgcG93ZXIgc291cmNlIHByb3BlcnR5IHZhbHVlCi0gKiBDb250ZXh0OiBjYW4gc2xlZXAKLSAqCi0gKiBQTUlDIGJhdHRlcnkgcG93ZXIgc291cmNlIHByb3BlcnR5IG5lZWRzIHRvIGJlIHByb3ZpZGVkIHRvIHBvd2VyX3N1cHBseQotICogc3Vic3l0ZW0gZm9yIGl0IHRvIHByb3ZpZGUgdGhlIGluZm9ybWF0aW9uIHRvIHVzZXJzLgotICovCi1zdGF0aWMgaW50IHBtaWNfYmF0dGVyeV9nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAotCQkJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKLQkJCQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQotewotCXN0cnVjdCBwbWljX3Bvd2VyX21vZHVsZV9pbmZvICpwYmkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKLQotCS8qIHVwZGF0ZSBwbWljX3Bvd2VyX21vZHVsZV9pbmZvIG1lbWJlcnMgKi8KLQlwbWljX2JhdHRlcnlfcmVhZF9zdGF0dXMocGJpKTsKLQotCXN3aXRjaCAocHNwKSB7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6Ci0JCXZhbC0+aW50dmFsID0gcGJpLT5iYXR0X3N0YXR1czsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEg6Ci0JCXZhbC0+aW50dmFsID0gcGJpLT5iYXR0X2hlYWx0aDsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOgotCQl2YWwtPmludHZhbCA9IHBiaS0+YmF0dF9pc19wcmVzZW50OwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9OT1c6Ci0JCXZhbC0+aW50dmFsID0gbUFTdG91QWgocGJpLT5iYXR0X2NoYXJnZV9ub3cpOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMOgotCQl2YWwtPmludHZhbCA9IG1BU3RvdUFoKHBiaS0+YmF0dF9wcmV2X2NoYXJnZV9mdWxsKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogcG1pY19iYXR0ZXJ5X21vbml0b3IgLSBtb25pdG9yIGJhdHRlcnkgc3RhdHVzCi0gKiBAd29yazogd29yayBzdHJ1Y3R1cmUKLSAqIENvbnRleHQ6IGNhbiBzbGVlcAotICoKLSAqIFBNSUMgYmF0dGVyeSBzdGF0dXMgbmVlZHMgdG8gYmUgbW9uaXRvcmVkIGZvciBhbnkgY2hhbmdlCi0gKiBhbmQgaW5mb3JtYXRpb24gbmVlZHMgdG8gYmUgZnJlcXVlbnRseSB1cGRhdGVkLgotICovCi1zdGF0aWMgdm9pZCBwbWljX2JhdHRlcnlfbW9uaXRvcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHBtaWNfcG93ZXJfbW9kdWxlX2luZm8gKnBiaSA9IGNvbnRhaW5lcl9vZih3b3JrLAotCQkJc3RydWN0IHBtaWNfcG93ZXJfbW9kdWxlX2luZm8sIG1vbml0b3JfYmF0dGVyeS53b3JrKTsKLQotCS8qIHVwZGF0ZSBwbWljX3Bvd2VyX21vZHVsZV9pbmZvIG1lbWJlcnMgKi8KLQlwbWljX2JhdHRlcnlfcmVhZF9zdGF0dXMocGJpKTsKLQlxdWV1ZV9kZWxheWVkX3dvcmsocGJpLT5tb25pdG9yX3dxdWV1ZSwgJnBiaS0+bW9uaXRvcl9iYXR0ZXJ5LCBIWiAqIDEwKTsKLX0KLQotLyoqCi0gKiBwbWljX2JhdHRlcnlfc2V0X2NoYXJnZXIgLSBzZXQgYmF0dGVyeSBjaGFyZ2VyCi0gKiBAcGJpOiBkZXZpY2UgaW5mbyBzdHJ1Y3R1cmUKLSAqIEBjaHJnOiBjaGFyZ2UgbW9kZSB0byBzZXQgYmF0dGVyeSBjaGFyZ2VyIGluCi0gKiBDb250ZXh0OiBjYW4gc2xlZXAKLSAqCi0gKiBQTUlDIGJhdHRlcnkgY2hhcmdlciBuZWVkcyB0byBiZSBlbmFibGVkIGJhc2VkIG9uIHRoZSB1c2IgY2hhcmdlCi0gKiBjYXBhYmlsaXRpZXMgY29ubmVjdGVkIHRvIHRoZSBwbGF0Zm9ybS4KLSAqLwotc3RhdGljIGludCBwbWljX2JhdHRlcnlfc2V0X2NoYXJnZXIoc3RydWN0IHBtaWNfcG93ZXJfbW9kdWxlX2luZm8gKnBiaSwKLQkJCQkJCWVudW0gYmF0dF9jaGFyZ2VfdHlwZSBjaHJnKQotewotCWludCByZXR2YWw7Ci0KLQkvKiBzZXQgdXNibG10IGJpdHMgYW5kIGNocmdjbnRsIHJlZ2lzdGVyIGJpdHMgYXBwcm9wcmlhdGVseSAqLwotCXN3aXRjaCAoY2hyZykgewotCWNhc2UgQkFUVF9VU0JPVEdfNTAwTUFfQ0hBUkdFOgotCQlyZXR2YWwgPSBwbWljX3NjdV9pcGNfc2V0X2NoYXJnZXIoUE1JQ19CQVRUX0NIUl9JUENfRkNIUkdfU1VCSUQpOwotCQlicmVhazsKLQljYXNlIEJBVFRfVVNCT1RHX1RSSUNLTEVfQ0hBUkdFOgotCQlyZXR2YWwgPSBwbWljX3NjdV9pcGNfc2V0X2NoYXJnZXIoUE1JQ19CQVRUX0NIUl9JUENfVENIUkdfU1VCSUQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfd2FybihwYmktPmRldiwgIiVzKCk6IG91dCBvZiByYW5nZSB1c2IgY2hhcmdlciAiCi0JCQkJCQkiY2hhcmdlIGRldGVjdGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChyZXR2YWwpIHsKLQkJZGV2X3dhcm4ocGJpLT5kZXYsICIlcygpOiBpcGMgcG1pYyByZWFkIGZhaWxlZFxuIiwKLQkJCQkJCQkJX19mdW5jX18pOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIHBtaWNfYmF0dGVyeV9pbnRlcnJ1cHRfaGFuZGxlciAtIHBtaWMgYmF0dGVyeSBpbnRlcnJ1cHQgaGFuZGxlcgotICogQ29udGV4dDogaW50ZXJydXB0IGNvbnRleHQKLSAqCi0gKiBQTUlDIGJhdHRlcnkgaW50ZXJydXB0IGhhbmRsZXIgd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2l0aCBlaXRoZXIKLSAqIGJhdHRlcnkgZnVsbCBjb25kaXRpb24gb2NjdXJzIG9yIHVzYiBvdGcgJiBiYXR0ZXJ5IGNvbm5lY3QKLSAqIGNvbmRpdGlvbiBvY2N1cnMuCi0gKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBwbWljX2JhdHRlcnlfaW50ZXJydXB0X2hhbmRsZXIoaW50IGlkLCB2b2lkICpkZXYpCi17Ci0Jc3RydWN0IHBtaWNfcG93ZXJfbW9kdWxlX2luZm8gKnBiaSA9IGRldjsKLQotCXNjaGVkdWxlX3dvcmsoJnBiaS0+aGFuZGxlcik7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qKgotICogcG1pY19iYXR0ZXJ5X2hhbmRsZV9pbnRycHQgLSBwbWljIGJhdHRlcnkgc2VydmljZSBpbnRlcnJ1cHQKLSAqIEB3b3JrOiB3b3JrIHN0cnVjdHVyZQotICogQ29udGV4dDogY2FuIHNsZWVwCi0gKgotICogUE1JQyBiYXR0ZXJ5IG5lZWRzIHRvIGVpdGhlciB1cGRhdGUgdGhlIGJhdHRlcnkgc3RhdHVzIGFzIGZ1bGwKLSAqIGlmIGl0IGRldGVjdHMgYmF0dGVyeSBmdWxsIGNvbmRpdGlvbiBjYXVzZWQgdGhlIGludGVycnVwdCBvciBuZWVkcwotICogdG8gZW5hYmxlIGJhdHRlcnkgY2hhcmdlciBpZiBpdCBkZXRlY3RzIHVzYiBhbmQgYmF0dGVyeSBkZXRlY3QKLSAqIGNhdXNlZCB0aGUgc291cmNlIG9mIGludGVycnVwdC4KLSAqLwotc3RhdGljIHZvaWQgcG1pY19iYXR0ZXJ5X2hhbmRsZV9pbnRycHQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBwbWljX3Bvd2VyX21vZHVsZV9pbmZvICpwYmkgPSBjb250YWluZXJfb2Yod29yaywKLQkJCQlzdHJ1Y3QgcG1pY19wb3dlcl9tb2R1bGVfaW5mbywgaGFuZGxlcik7Ci0JZW51bSBiYXR0X2NoYXJnZV90eXBlIGNocmc7Ci0JdTggcjg7Ci0KLQlpZiAoaW50ZWxfc2N1X2lwY19pb3JlYWQ4KFBNSUNfQkFUVF9DSFJfU0NIUkdJTlRfQUREUiwgJnI4KSkgewotCQlkZXZfd2FybihwYmktPmRldiwgIiVzKCk6IGlwYyBwbWljIHJlYWQgZmFpbGVkXG4iLAotCQkJCQkJCQlfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0JLyogZmluZCB0aGUgY2F1c2Ugb2YgdGhlIGludGVycnVwdCAqLwotCWlmIChyOCAmIFBNSUNfQkFUVF9DSFJfU0JBVERFVF9NQVNLKSB7Ci0JCXBiaS0+YmF0dF9pc19wcmVzZW50ID0gUE1JQ19CQVRUX1BSRVNFTlQ7Ci0JfSBlbHNlIHsKLQkJcGJpLT5iYXR0X2lzX3ByZXNlbnQgPSBQTUlDX0JBVFRfTk9UX1BSRVNFTlQ7Ci0JCXBiaS0+YmF0dF9oZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOS05PV047Ci0JCXBiaS0+YmF0dF9zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocjggJiBQTUlDX0JBVFRfQ0hSX0VYQ1BUX01BU0spIHsKLQkJcGJpLT5iYXR0X2hlYWx0aCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfVU5LTk9XTjsKLQkJcGJpLT5iYXR0X3N0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfTk9UX0NIQVJHSU5HOwotCQlwYmktPnVzYl9oZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOS05PV047Ci0JCXBtaWNfYmF0dGVyeV9sb2dfZXZlbnQoQkFUVF9FVkVOVF9FWENQVCk7Ci0JCXJldHVybjsKLQl9IGVsc2UgewotCQlwYmktPmJhdHRfaGVhbHRoID0gUE9XRVJfU1VQUExZX0hFQUxUSF9HT09EOwotCQlwYmktPnVzYl9oZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0Q7Ci0JfQotCi0JaWYgKHI4ICYgUE1JQ19CQVRUX0NIUl9TQ09NUF9NQVNLKSB7Ci0JCXUzMiBjY3ZhbDsKLQkJcGJpLT5iYXR0X3N0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTDsKLQotCQlpZiAocG1pY19zY3VfaXBjX2JhdHRlcnlfY2NfcmVhZCgmY2N2YWwpKSB7Ci0JCQlkZXZfd2FybihwYmktPmRldiwgIiVzKCk6IGlwYyBjb25maWcgY21kICIKLQkJCQkJCQkiZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJcGJpLT5iYXR0X3ByZXZfY2hhcmdlX2Z1bGwgPSBjY3ZhbCAmCi0JCQkJCQlQTUlDX0JBVFRfQURDX0FDQ0NIUkdWQUxfTUFTSzsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChyOCAmIFBNSUNfQkFUVF9DSFJfU1VTQkRFVF9NQVNLKSB7Ci0JCXBiaS0+dXNiX2lzX3ByZXNlbnQgPSBQTUlDX1VTQl9QUkVTRU5UOwotCX0gZWxzZSB7Ci0JCXBiaS0+dXNiX2lzX3ByZXNlbnQgPSBQTUlDX1VTQl9OT1RfUFJFU0VOVDsKLQkJcGJpLT51c2JfaGVhbHRoID0gUE9XRVJfU1VQUExZX0hFQUxUSF9VTktOT1dOOwotCQlyZXR1cm47Ci0JfQotCi0JLyogc2V0dXAgYmF0dGVyeSBjaGFyZ2luZyAqLwotCi0jaWYgMAotCS8qIGNoZWNrIHVzYiBvdGcgcG93ZXIgY2FwYWJpbGl0eSBhbmQgc2V0IGNoYXJnZXIgYWNjb3JkaW5nbHkgKi8KLQlyZXR2YWwgPSBsYW5nd2VsbF91ZGNfbWF4cG93ZXIoJnBvd2VyKTsKLQlpZiAocmV0dmFsKSB7Ci0JCWRldl93YXJuKHBiaS0+ZGV2LAotCQkgICAgIiVzKCk6IHVzYiBvdGcgcG93ZXIgcXVlcnkgZmFpbGVkIHdpdGggZXJyb3IgY29kZSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXR2YWwpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHBvd2VyID49IDUwMCkKLQkJY2hyZyA9IEJBVFRfVVNCT1RHXzUwME1BX0NIQVJHRTsKLQllbHNlCi0jZW5kaWYKLQkJY2hyZyA9IEJBVFRfVVNCT1RHX1RSSUNLTEVfQ0hBUkdFOwotCi0JLyogZW5hYmxlIGJhdHRlcnkgY2hhcmdpbmcgKi8KLQlpZiAocG1pY19iYXR0ZXJ5X3NldF9jaGFyZ2VyKHBiaSwgY2hyZykpIHsKLQkJZGV2X3dhcm4ocGJpLT5kZXYsCi0JCQkiJXMoKTogZmFpbGVkIHRvIHNldCB1cCBiYXR0ZXJ5IGNoYXJnaW5nXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlkZXZfZGJnKHBiaS0+ZGV2LAotCQkicG1pYy1iYXR0ZXJ5OiAlcygpIC0gc2V0dGluZyB1cCBiYXR0ZXJ5IGNoYXJnZXIgc3VjY2Vzc2Z1bFxuIiwKLQkJCV9fZnVuY19fKTsKLX0KLQotLyoKLSAqIERlc2NyaXB0aW9uIG9mIHBvd2VyIHN1cHBsaWVzCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgcG1pY191c2JfZGVzYyA9IHsKLQkubmFtZQkJPSAicG1pYy11c2IiLAotCS50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX1VTQiwKLQkucHJvcGVydGllcwk9IHBtaWNfdXNiX3Byb3BzLAotCS5udW1fcHJvcGVydGllcwk9IEFSUkFZX1NJWkUocG1pY191c2JfcHJvcHMpLAotCS5nZXRfcHJvcGVydHkJPSBwbWljX3VzYl9nZXRfcHJvcGVydHksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIHBtaWNfYmF0dF9kZXNjID0gewotCS5uYW1lCQk9ICJwbWljLWJhdHQiLAotCS50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlksCi0JLnByb3BlcnRpZXMJPSBwbWljX2JhdHRlcnlfcHJvcHMsCi0JLm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRShwbWljX2JhdHRlcnlfcHJvcHMpLAotCS5nZXRfcHJvcGVydHkJPSBwbWljX2JhdHRlcnlfZ2V0X3Byb3BlcnR5LAotfTsKLQotLyoqCi0gKiBwbWljX2JhdHRlcnlfcHJvYmUgLSBwbWljIGJhdHRlcnkgaW5pdGlhbGl6ZQotICogQGlycTogcG1pYyBiYXR0ZXJ5IGRldmljZSBpcnEKLSAqIEBkZXY6IHBtaWMgYmF0dGVyeSBkZXZpY2Ugc3RydWN0dXJlCi0gKiBDb250ZXh0OiBjYW4gc2xlZXAKLSAqCi0gKiBQTUlDIGJhdHRlcnkgaW5pdGlhbGl6ZXMgaXRzIGludGVybmFsIGRhdGEgc3RydWN0dWUgYW5kIG90aGVyCi0gKiBpbmZyYXN0cnVjdHVyZSBjb21wb25lbnRzIGZvciBpdCB0byB3b3JrIGFzIGV4cGVjdGVkLgotICovCi1zdGF0aWMgaW50IHByb2JlKGludCBpcnEsIHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlpbnQgcmV0dmFsID0gMDsKLQlzdHJ1Y3QgcG1pY19wb3dlcl9tb2R1bGVfaW5mbyAqcGJpOwotCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKLQotCWRldl9kYmcoZGV2LCAicG1pYy1iYXR0ZXJ5OiBmb3VuZCBwbWljIGJhdHRlcnkgZGV2aWNlXG4iKTsKLQotCXBiaSA9IGt6YWxsb2Moc2l6ZW9mKCpwYmkpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBiaSkgewotCQlkZXZfZXJyKGRldiwgIiVzKCk6IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZFxuIiwKLQkJCQkJCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlwYmktPmRldiA9IGRldjsKLQlwYmktPmlycSA9IGlycTsKLQlkZXZfc2V0X2RydmRhdGEoZGV2LCBwYmkpOwotCXBzeV9jZmcuZHJ2X2RhdGEgPSBwYmk7Ci0KLQkvKiBpbml0aWFsaXplIGFsbCByZXF1aXJlZCBmcmFtZXdvcmsgYmVmb3JlIGVuYWJsaW5nIGludGVycnVwdHMgKi8KLQlJTklUX1dPUksoJnBiaS0+aGFuZGxlciwgcG1pY19iYXR0ZXJ5X2hhbmRsZV9pbnRycHQpOwotCUlOSVRfREVMQVlFRF9XT1JLKCZwYmktPm1vbml0b3JfYmF0dGVyeSwgcG1pY19iYXR0ZXJ5X21vbml0b3IpOwotCXBiaS0+bW9uaXRvcl93cXVldWUgPQotCQkJY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoZGV2X25hbWUoZGV2KSk7Ci0JaWYgKCFwYmktPm1vbml0b3Jfd3F1ZXVlKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXMoKTogd3F1ZXVlIGluaXQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHZhbCA9IC1FU1JDSDsKLQkJZ290byB3cXVldWVfZmFpbGVkOwotCX0KLQotCS8qIHJlZ2lzdGVyIGludGVycnVwdCAqLwotCXJldHZhbCA9IHJlcXVlc3RfaXJxKHBiaS0+aXJxLCBwbWljX2JhdHRlcnlfaW50ZXJydXB0X2hhbmRsZXIsCi0JCQkJCQkJMCwgRFJJVkVSX05BTUUsIHBiaSk7Ci0JaWYgKHJldHZhbCkgewotCQlkZXZfZXJyKGRldiwgIiVzKCk6IGNhbm5vdCBnZXQgSVJRXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gcmVxdWVzdGlycV9mYWlsZWQ7Ci0JfQotCi0JLyogcmVnaXN0ZXIgcG1pYy1iYXR0IHdpdGggcG93ZXIgc3VwcGx5IHN1YnN5c3RlbSAqLwotCXBiaS0+YmF0dCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcihkZXYsICZwbWljX3VzYl9kZXNjLCAmcHN5X2NmZyk7Ci0JaWYgKElTX0VSUihwYmktPmJhdHQpKSB7Ci0JCWRldl9lcnIoZGV2LAotCQkJIiVzKCk6IGZhaWxlZCB0byByZWdpc3RlciBwbWljIGJhdHRlcnkgZGV2aWNlIHdpdGggcG93ZXIgc3VwcGx5IHN1YnN5c3RlbVxuIiwKLQkJCQlfX2Z1bmNfXyk7Ci0JCXJldHZhbCA9IFBUUl9FUlIocGJpLT5iYXR0KTsKLQkJZ290byBwb3dlcl9yZWdfZmFpbGVkOwotCX0KLQotCWRldl9kYmcoZGV2LCAicG1pYy1iYXR0ZXJ5OiAlcygpIC0gcG1pYyBiYXR0ZXJ5IGRldmljZSAiCi0JCSJyZWdpc3RyYXRpb24gd2l0aCBwb3dlciBzdXBwbHkgc3Vic3lzdGVtIHN1Y2Nlc3NmdWxcbiIsCi0JCV9fZnVuY19fKTsKLQotCXF1ZXVlX2RlbGF5ZWRfd29yayhwYmktPm1vbml0b3Jfd3F1ZXVlLCAmcGJpLT5tb25pdG9yX2JhdHRlcnksIEhaICogMSk7Ci0KLQkvKiByZWdpc3RlciBwbWljLXVzYiB3aXRoIHBvd2VyIHN1cHBseSBzdWJzeXN0ZW0gKi8KLQlwYmktPnVzYiA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcihkZXYsICZwbWljX2JhdHRfZGVzYywgJnBzeV9jZmcpOwotCWlmIChJU19FUlIocGJpLT51c2IpKSB7Ci0JCWRldl9lcnIoZGV2LAotCQkJIiVzKCk6IGZhaWxlZCB0byByZWdpc3RlciBwbWljIHVzYiBkZXZpY2Ugd2l0aCBwb3dlciBzdXBwbHkgc3Vic3lzdGVtXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJcmV0dmFsID0gUFRSX0VSUihwYmktPnVzYik7Ci0JCWdvdG8gcG93ZXJfcmVnX2ZhaWxlZF8xOwotCX0KLQotCWlmIChkZWJ1ZykKLQkJcHJpbnRrKEtFUk5fSU5GTyAicG1pYy1iYXR0ZXJ5OiAlcygpIC0gcG1pYyB1c2IgZGV2aWNlICIKLQkJCSJyZWdpc3RyYXRpb24gd2l0aCBwb3dlciBzdXBwbHkgc3Vic3lzdGVtIHN1Y2Nlc3NmdWxcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0KLQlyZXR1cm4gcmV0dmFsOwotCi1wb3dlcl9yZWdfZmFpbGVkXzE6Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIocGJpLT5iYXR0KTsKLXBvd2VyX3JlZ19mYWlsZWQ6Ci0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwYmktPm1vbml0b3JfYmF0dGVyeSk7Ci1yZXF1ZXN0aXJxX2ZhaWxlZDoKLQlkZXN0cm95X3dvcmtxdWV1ZShwYmktPm1vbml0b3Jfd3F1ZXVlKTsKLXdxdWV1ZV9mYWlsZWQ6Ci0Ja2ZyZWUocGJpKTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBpbnQgcGxhdGZvcm1fcG1pY19iYXR0ZXJ5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIHByb2JlKHBkZXYtPmlkLCAmcGRldi0+ZGV2KTsKLX0KLQotLyoqCi0gKiBwbWljX2JhdHRlcnlfcmVtb3ZlIC0gcG1pYyBiYXR0ZXJ5IGZpbmFsaXplCi0gKiBAZGV2OiBwbWljIGJhdHRlcnkgZGV2aWNlIHN0cnVjdHVyZQotICogQ29udGV4dDogY2FuIHNsZWVwCi0gKgotICogUE1JQyBiYXR0ZXJ5IGZpbmFsaXplcyBpdHMgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1ZSBhbmQgb3RoZXIKLSAqIGluZnJhc3RydWN0dXJlIGNvbXBvbmVudHMgdGhhdCBpdCBpbml0aWFsaXplZCBpbgotICogcG1pY19iYXR0ZXJ5X3Byb2JlLgotICovCi0KLXN0YXRpYyBpbnQgcGxhdGZvcm1fcG1pY19iYXR0ZXJ5X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBwbWljX3Bvd2VyX21vZHVsZV9pbmZvICpwYmkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWZyZWVfaXJxKHBiaS0+aXJxLCBwYmkpOwotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcGJpLT5tb25pdG9yX2JhdHRlcnkpOwotCWRlc3Ryb3lfd29ya3F1ZXVlKHBiaS0+bW9uaXRvcl93cXVldWUpOwotCi0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIocGJpLT51c2IpOwotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKHBiaS0+YmF0dCk7Ci0KLQljYW5jZWxfd29ya19zeW5jKCZwYmktPmhhbmRsZXIpOwotCWtmcmVlKHBiaSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHBsYXRmb3JtX3BtaWNfYmF0dGVyeV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSBEUklWRVJfTkFNRSwKLQl9LAotCS5wcm9iZSA9IHBsYXRmb3JtX3BtaWNfYmF0dGVyeV9wcm9iZSwKLQkucmVtb3ZlID0gcGxhdGZvcm1fcG1pY19iYXR0ZXJ5X3JlbW92ZSwKLX07Ci0KLW1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIocGxhdGZvcm1fcG1pY19iYXR0ZXJ5X2RyaXZlcik7Ci0KLU1PRFVMRV9BVVRIT1IoIk5pdGhpc2ggTWFoYWxpbmdhbSA8bml0aGlzaC5tYWhhbGluZ2FtQGludGVsLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgTW9vcmVzdG93biBQTUlDIEJhdHRlcnkgRHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2lwYXFfbWljcm9fYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9pcGFxX21pY3JvX2JhdHRlcnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViMDFjNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3Bvd2VyL2lwYXFfbWljcm9fYmF0dGVyeS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLS8qCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIGgzeHh4IGF0bWVsIG1pY3JvIGNvbXBhbmlvbiBzdXBwb3J0LCBiYXR0ZXJ5IHN1YmRldmljZQotICogYmFzZWQgb24gcHJldmlvdXMga2VybmVsIDIuNCB2ZXJzaW9uCi0gKiBBdXRob3IgOiBBbGVzc2FuZHJvIEdhcmRpY2ggPGdyZW1saW5AZ3JlbWxpbi5pdD4KLSAqIEF1dGhvciA6IExpbnVzIFdhbGxlaWogPGxpbnVzLndhbGxlaWpAbGluYXJvLm9yZz4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvaXBhcS1taWNyby5oPgotI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotCi0jZGVmaW5lIEJBVFRfUEVSSU9EIDEwMDAwMCAvKiAxMDAgc2Vjb25kcyBpbiBtaWxsaXNlY29uZHMgKi8KLQotI2RlZmluZSBNSUNST19CQVRUX0NIRU1fQUxLQUxJTkUJMHgwMQotI2RlZmluZSBNSUNST19CQVRUX0NIRU1fTklDRAkJMHgwMgotI2RlZmluZSBNSUNST19CQVRUX0NIRU1fTklNSAkJMHgwMwotI2RlZmluZSBNSUNST19CQVRUX0NIRU1fTElPTgkJMHgwNAotI2RlZmluZSBNSUNST19CQVRUX0NIRU1fTElQT0xZCQkweDA1Ci0jZGVmaW5lIE1JQ1JPX0JBVFRfQ0hFTV9OT1RfSU5TVEFMTEVECTB4MDYKLSNkZWZpbmUgTUlDUk9fQkFUVF9DSEVNX1VOS05PV04JCTB4ZmYKLQotI2RlZmluZSBNSUNST19CQVRUX1NUQVRVU19ISUdICQkweDAxCi0jZGVmaW5lIE1JQ1JPX0JBVFRfU1RBVFVTX0xPVwkJMHgwMgotI2RlZmluZSBNSUNST19CQVRUX1NUQVRVU19DUklUSUNBTAkweDA0Ci0jZGVmaW5lIE1JQ1JPX0JBVFRfU1RBVFVTX0NIQVJHSU5HCTB4MDgKLSNkZWZpbmUgTUlDUk9fQkFUVF9TVEFUVVNfQ0hBUkdFTUFJTgkweDEwCi0jZGVmaW5lIE1JQ1JPX0JBVFRfU1RBVFVTX0RFQUQJCTB4MjAgLyogQmF0dGVyeSB3aWxsIG5vdCBjaGFyZ2UgKi8KLSNkZWZpbmUgTUlDUk9fQkFUVF9TVEFUVVNfTk9USU5TVEFMTEVECTB4MjAgLyogRm9yIGV4cGFuc2lvbiBwYWNrIGJhdHRlcmllcyAqLwotI2RlZmluZSBNSUNST19CQVRUX1NUQVRVU19GVUxMCQkweDQwIC8qIEJhdHRlcnkgZnVsbHkgY2hhcmdlZCAqLwotI2RlZmluZSBNSUNST19CQVRUX1NUQVRVU19OT0JBVFRFUlkJMHg4MAotI2RlZmluZSBNSUNST19CQVRUX1NUQVRVU19VTktOT1dOCTB4ZmYKLQotc3RydWN0IG1pY3JvX2JhdHRlcnkgewotCXN0cnVjdCBpcGFxX21pY3JvICptaWNybzsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayB1cGRhdGU7Ci0JdTggYWM7Ci0JdTggY2hlbWlzdHJ5OwotCXVuc2lnbmVkIGludCB2b2x0YWdlOwotCXUxNiB0ZW1wZXJhdHVyZTsKLQl1OCBmbGFnOwotfTsKLQotc3RhdGljIHZvaWQgbWljcm9fYmF0dGVyeV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgbWljcm9fYmF0dGVyeSAqbWIgPSBjb250YWluZXJfb2Yod29yaywKLQkJCQlzdHJ1Y3QgbWljcm9fYmF0dGVyeSwgdXBkYXRlLndvcmspOwotCXN0cnVjdCBpcGFxX21pY3JvX21zZyBtc2dfYmF0dGVyeSA9IHsKLQkJLmlkID0gTVNHX0JBVFRFUlksCi0JfTsKLQlzdHJ1Y3QgaXBhcV9taWNyb19tc2cgbXNnX3NlbnNvciA9IHsKLQkJLmlkID0gTVNHX1RIRVJNQUxfU0VOU09SLAotCX07Ci0KLQkvKiBGaXJzdCBzZW5kIGJhdHRlcnkgbWVzc2FnZSAqLwotCWlwYXFfbWljcm9fdHhfbXNnX3N5bmMobWItPm1pY3JvLCAmbXNnX2JhdHRlcnkpOwotCWlmIChtc2dfYmF0dGVyeS5yeF9sZW4gPCA0KQotCQlwcl9pbmZvKCJFUlJPUiIpOwotCi0JLyoKLQkgKiBSZXR1cm5lZCBtZXNzYWdlIGZvcm1hdDoKLQkgKiBieXRlIDA6ICAgMHgwMCA9IE5vdCBwbHVnZ2VkIGluCi0JICogICAgICAgICAgIDB4MDEgPSBBQyBhZGFwdGVyIHBsdWdnZWQgaW4KLQkgKiBieXRlIDE6ICAgY2hlbWlzdHJ5Ci0JICogYnl0ZSAyOiAgIHZvbHRhZ2UgTFNCCi0JICogYnl0ZSAzOiAgIHZvbHRhZ2UgTVNCCi0JICogYnl0ZSA0OiAgIGZsYWdzCi0JICogYnl0ZSA1LTk6IHNhbWUgZm9yIGJhdHRlcnkgMgotCSAqLwotCW1iLT5hYyA9IG1zZ19iYXR0ZXJ5LnJ4X2RhdGFbMF07Ci0JbWItPmNoZW1pc3RyeSA9IG1zZ19iYXR0ZXJ5LnJ4X2RhdGFbMV07Ci0JbWItPnZvbHRhZ2UgPSAoKCgodW5zaWduZWQgc2hvcnQpbXNnX2JhdHRlcnkucnhfZGF0YVszXSA8PCA4KSArCi0JCQltc2dfYmF0dGVyeS5yeF9kYXRhWzJdKSAqIDUwMDBMKSAqIDEwMDAgLyAxMDI0OwotCW1iLT5mbGFnID0gbXNnX2JhdHRlcnkucnhfZGF0YVs0XTsKLQotCWlmIChtc2dfYmF0dGVyeS5yeF9sZW4gPT0gOSkKLQkJcHJfZGVidWcoInNlY29uZCBiYXR0ZXJ5IGlnbm9yZWRcbiIpOwotCi0JLyogVGhlbiByZWFkIHRoZSBzZW5zb3IgKi8KLQlpcGFxX21pY3JvX3R4X21zZ19zeW5jKG1iLT5taWNybywgJm1zZ19zZW5zb3IpOwotCW1iLT50ZW1wZXJhdHVyZSA9IG1zZ19zZW5zb3IucnhfZGF0YVsxXSA8PCA4IHwgbXNnX3NlbnNvci5yeF9kYXRhWzBdOwotCi0JcXVldWVfZGVsYXllZF93b3JrKG1iLT53cSwgJm1iLT51cGRhdGUsIG1zZWNzX3RvX2ppZmZpZXMoQkFUVF9QRVJJT0QpKTsKLX0KLQotc3RhdGljIGludCBnZXRfY2FwYWNpdHkoc3RydWN0IHBvd2VyX3N1cHBseSAqYikKLXsKLQlzdHJ1Y3QgbWljcm9fYmF0dGVyeSAqbWIgPSBkZXZfZ2V0X2RydmRhdGEoYi0+ZGV2LnBhcmVudCk7Ci0KLQlzd2l0Y2ggKG1iLT5mbGFnICYgMHgwNykgewotCWNhc2UgTUlDUk9fQkFUVF9TVEFUVVNfSElHSDoKLQkJcmV0dXJuIDEwMDsKLQkJYnJlYWs7Ci0JY2FzZSBNSUNST19CQVRUX1NUQVRVU19MT1c6Ci0JCXJldHVybiA1MDsKLQkJYnJlYWs7Ci0JY2FzZSBNSUNST19CQVRUX1NUQVRVU19DUklUSUNBTDoKLQkJcmV0dXJuIDU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBnZXRfc3RhdHVzKHN0cnVjdCBwb3dlcl9zdXBwbHkgKmIpCi17Ci0Jc3RydWN0IG1pY3JvX2JhdHRlcnkgKm1iID0gZGV2X2dldF9kcnZkYXRhKGItPmRldi5wYXJlbnQpOwotCi0JaWYgKG1iLT5mbGFnID09IE1JQ1JPX0JBVFRfU1RBVFVTX1VOS05PV04pCi0JCXJldHVybiBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047Ci0KLQlpZiAobWItPmZsYWcgJiBNSUNST19CQVRUX1NUQVRVU19GVUxMKQotCQlyZXR1cm4gUE9XRVJfU1VQUExZX1NUQVRVU19GVUxMOwotCi0JaWYgKChtYi0+ZmxhZyAmIE1JQ1JPX0JBVFRfU1RBVFVTX0NIQVJHSU5HKSB8fAotCQkobWItPmZsYWcgJiBNSUNST19CQVRUX1NUQVRVU19DSEFSR0VNQUlOKSkKLQkJcmV0dXJuIFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7Ci0KLQlyZXR1cm4gUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORzsKLX0KLQotc3RhdGljIGludCBtaWNyb19iYXR0X2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiLAotCQkJCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCi0JCQkJCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCi17Ci0Jc3RydWN0IG1pY3JvX2JhdHRlcnkgKm1iID0gZGV2X2dldF9kcnZkYXRhKGItPmRldi5wYXJlbnQpOwotCi0Jc3dpdGNoIChwc3ApIHsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1k6Ci0JCXN3aXRjaCAobWItPmNoZW1pc3RyeSkgewotCQljYXNlIE1JQ1JPX0JBVFRfQ0hFTV9OSUNEOgotCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfVEVDSE5PTE9HWV9OaUNkOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUlDUk9fQkFUVF9DSEVNX05JTUg6Ci0JCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9URUNITk9MT0dZX05pTUg7Ci0JCQlicmVhazsKLQkJY2FzZSBNSUNST19CQVRUX0NIRU1fTElPTjoKLQkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1RFQ0hOT0xPR1lfTElPTjsKLQkJCWJyZWFrOwotCQljYXNlIE1JQ1JPX0JBVFRfQ0hFTV9MSVBPTFk6Ci0JCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9URUNITk9MT0dZX0xJUE87Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1RFQ0hOT0xPR1lfVU5LTk9XTjsKLQkJCWJyZWFrOwotCQl9OwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKLQkJdmFsLT5pbnR2YWwgPSBnZXRfc3RhdHVzKGIpOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYX0RFU0lHTjoKLQkJdmFsLT5pbnR2YWwgPSA0NzAwMDAwOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZOgotCQl2YWwtPmludHZhbCA9IGdldF9jYXBhY2l0eShiKTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QOgotCQl2YWwtPmludHZhbCA9IG1iLT50ZW1wZXJhdHVyZTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKLQkJdmFsLT5pbnR2YWwgPSBtYi0+dm9sdGFnZTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1pY3JvX2FjX2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiLAotCQkJCSBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCi0JCQkJIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCi17Ci0Jc3RydWN0IG1pY3JvX2JhdHRlcnkgKm1iID0gZGV2X2dldF9kcnZkYXRhKGItPmRldi5wYXJlbnQpOwotCi0Jc3dpdGNoIChwc3ApIHsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORToKLQkJdmFsLT5pbnR2YWwgPSBtYi0+YWM7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX07Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IG1pY3JvX2JhdHRfcG93ZXJfcHJvcHNbXSA9IHsKLQlQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZLAotCVBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywKLQlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWF9ERVNJR04sCi0JUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFksCi0JUE9XRVJfU1VQUExZX1BST1BfVEVNUCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgbWljcm9fYmF0dF9wb3dlcl9kZXNjID0gewotCS5uYW1lCQkJPSAibWFpbi1iYXR0ZXJ5IiwKLQkudHlwZQkJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKLQkucHJvcGVydGllcwkJPSBtaWNyb19iYXR0X3Bvd2VyX3Byb3BzLAotCS5udW1fcHJvcGVydGllcwkJPSBBUlJBWV9TSVpFKG1pY3JvX2JhdHRfcG93ZXJfcHJvcHMpLAotCS5nZXRfcHJvcGVydHkJCT0gbWljcm9fYmF0dF9nZXRfcHJvcGVydHksCi0JLnVzZV9mb3JfYXBtCQk9IDEsCi19OwotCi1zdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgbWljcm9fYWNfcG93ZXJfcHJvcHNbXSA9IHsKLQlQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIG1pY3JvX2FjX3Bvd2VyX2Rlc2MgPSB7Ci0JLm5hbWUJCQk9ICJhYyIsCi0JLnR5cGUJCQk9IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TLAotCS5wcm9wZXJ0aWVzCQk9IG1pY3JvX2FjX3Bvd2VyX3Byb3BzLAotCS5udW1fcHJvcGVydGllcwkJPSBBUlJBWV9TSVpFKG1pY3JvX2FjX3Bvd2VyX3Byb3BzKSwKLQkuZ2V0X3Byb3BlcnR5CQk9IG1pY3JvX2FjX2dldF9wcm9wZXJ0eSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcG93ZXJfc3VwcGx5ICptaWNyb19iYXR0X3Bvd2VyLCAqbWljcm9fYWNfcG93ZXI7Ci0KLXN0YXRpYyBpbnQgbWljcm9fYmF0dF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBtaWNyb19iYXR0ZXJ5ICptYjsKLQlpbnQgcmV0OwotCi0JbWIgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCptYiksIEdGUF9LRVJORUwpOwotCWlmICghbWIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbWItPm1pY3JvID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwotCW1iLT53cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJpcGFxLWJhdHRlcnktd3EiKTsKLQlpZiAoIW1iLT53cSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlJTklUX0RFTEFZRURfV09SSygmbWItPnVwZGF0ZSwgbWljcm9fYmF0dGVyeV93b3JrKTsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtYik7Ci0JcXVldWVfZGVsYXllZF93b3JrKG1iLT53cSwgJm1iLT51cGRhdGUsIDEpOwotCi0JbWljcm9fYmF0dF9wb3dlciA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LAotCQkJCQkJICZtaWNyb19iYXR0X3Bvd2VyX2Rlc2MsIE5VTEwpOwotCWlmIChJU19FUlIobWljcm9fYmF0dF9wb3dlcikpIHsKLQkJcmV0ID0gUFRSX0VSUihtaWNyb19iYXR0X3Bvd2VyKTsKLQkJZ290byBiYXR0X2VycjsKLQl9Ci0KLQltaWNyb19hY19wb3dlciA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LAotCQkJCQkgICAgICAgJm1pY3JvX2FjX3Bvd2VyX2Rlc2MsIE5VTEwpOwotCWlmIChJU19FUlIobWljcm9fYWNfcG93ZXIpKSB7Ci0JCXJldCA9IFBUUl9FUlIobWljcm9fYWNfcG93ZXIpOwotCQlnb3RvIGFjX2VycjsKLQl9Ci0KLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiaVBBUSBtaWNybyBiYXR0ZXJ5IGRyaXZlclxuIik7Ci0JcmV0dXJuIDA7Ci0KLWFjX2VycjoKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihtaWNyb19iYXR0X3Bvd2VyKTsKLWJhdHRfZXJyOgotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbWItPnVwZGF0ZSk7Ci0JZGVzdHJveV93b3JrcXVldWUobWItPndxKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1pY3JvX2JhdHRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi0KLXsKLQlzdHJ1Y3QgbWljcm9fYmF0dGVyeSAqbWIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKG1pY3JvX2FjX3Bvd2VyKTsKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihtaWNyb19iYXR0X3Bvd2VyKTsKLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJm1iLT51cGRhdGUpOwotCWRlc3Ryb3lfd29ya3F1ZXVlKG1iLT53cSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX21heWJlX3VudXNlZCBtaWNyb19iYXR0X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBtaWNyb19iYXR0ZXJ5ICptYiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZtYi0+dXBkYXRlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX21heWJlX3VudXNlZCBtaWNyb19iYXR0X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG1pY3JvX2JhdHRlcnkgKm1iID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlxdWV1ZV9kZWxheWVkX3dvcmsobWItPndxLCAmbWItPnVwZGF0ZSwgbXNlY3NfdG9famlmZmllcyhCQVRUX1BFUklPRCkpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgbWljcm9fYmF0dF9kZXZfcG1fb3BzID0gewotCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKG1pY3JvX2JhdHRfc3VzcGVuZCwgbWljcm9fYmF0dF9yZXN1bWUpCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtaWNyb19iYXR0X2RldmljZV9kcml2ZXIgPSB7Ci0JLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gImlwYXEtbWljcm8tYmF0dGVyeSIsCi0JCS5wbQk9ICZtaWNyb19iYXR0X2Rldl9wbV9vcHMsCi0JfSwKLQkucHJvYmUJCT0gbWljcm9fYmF0dF9wcm9iZSwKLQkucmVtb3ZlCQk9IG1pY3JvX2JhdHRfcmVtb3ZlLAotfTsKLW1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobWljcm9fYmF0dF9kZXZpY2VfZHJpdmVyKTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJkcml2ZXIgZm9yIGlQQVEgQXRtZWwgbWljcm8gYmF0dGVyeSIpOwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpiYXR0ZXJ5LWlwYXEtbWljcm8iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvbWF4MTQ1NzdfY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9tYXgxNDU3N19jaGFyZ2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNmJjYWYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9wb3dlci9tYXgxNDU3N19jaGFyZ2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NDggKzAsMCBAQAotLyoKLSAqIG1heDE0NTc3X2NoYXJnZXIuYyAtIEJhdHRlcnkgY2hhcmdlciBkcml2ZXIgZm9yIHRoZSBNYXhpbSAxNDU3Ny83NzgzNgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMywyMDE0IFNhbXN1bmcgRWxlY3Ryb25pY3MKLSAqIEtyenlzenRvZiBLb3psb3dza2kgPGsua296bG93c2tpQHNhbXN1bmcuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL21heDE0NTc3LXByaXZhdGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvbWF4MTQ1NzcuaD4KLQotc3RydWN0IG1heDE0NTc3X2NoYXJnZXIgewotCXN0cnVjdCBkZXZpY2UJCSpkZXY7Ci0Jc3RydWN0IG1heDE0NTc3CQkqbWF4MTQ1Nzc7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseQkqY2hhcmdlcjsKLQotCXN0cnVjdCBtYXgxNDU3N19jaGFyZ2VyX3BsYXRmb3JtX2RhdGEJKnBkYXRhOwotfTsKLQotLyoKLSAqIEhlbHBlciBmdW5jdGlvbiBmb3IgbWFwcGluZyB2YWx1ZXMgb2YgU1RBVFVTMi9DSEdUWVAgcmVnaXN0ZXIgb24gbWF4MTQ1NzcKLSAqIGFuZCBtYXg3NzgzNiBjaGlwc2V0cyB0byBlbnVtIG1heGltX211aWNfY2hhcmdlcl90eXBlLgotICovCi1zdGF0aWMgZW51bSBtYXgxNDU3N19tdWljX2NoYXJnZXJfdHlwZSBtYXhpbV9nZXRfY2hhcmdlcl90eXBlKAotCQllbnVtIG1heGltX2RldmljZV90eXBlIGRldl90eXBlLCB1OCB2YWwpIHsKLQlzd2l0Y2ggKHZhbCkgewotCWNhc2UgTUFYMTQ1NzdfQ0hBUkdFUl9UWVBFX05PTkU6Ci0JY2FzZSBNQVgxNDU3N19DSEFSR0VSX1RZUEVfVVNCOgotCWNhc2UgTUFYMTQ1NzdfQ0hBUkdFUl9UWVBFX0RPV05TVFJFQU1fUE9SVDoKLQljYXNlIE1BWDE0NTc3X0NIQVJHRVJfVFlQRV9ERURJQ0FURURfQ0hHOgotCWNhc2UgTUFYMTQ1NzdfQ0hBUkdFUl9UWVBFX1NQRUNJQUxfNTAwTUE6Ci0JY2FzZSBNQVgxNDU3N19DSEFSR0VSX1RZUEVfU1BFQ0lBTF8xQToKLQkJcmV0dXJuIHZhbDsKLQljYXNlIE1BWDE0NTc3X0NIQVJHRVJfVFlQRV9ERUFEX0JBVFRFUlk6Ci0JY2FzZSBNQVgxNDU3N19DSEFSR0VSX1RZUEVfUkVTRVJWRUQ6Ci0JCWlmIChkZXZfdHlwZSA9PSBNQVhJTV9ERVZJQ0VfVFlQRV9NQVg3NzgzNikKLQkJCXZhbCB8PSAweDg7Ci0JCXJldHVybiB2YWw7Ci0JZGVmYXVsdDoKLQkJV0FSTl9PTkNFKDEsICJtYXgxNDU3NzogVW5zdXBwb3J0ZWQgY2hndHlwIHJlZ2lzdGVyIHZhbHVlIDB4JTAyeCIsIHZhbCk7Ci0JCXJldHVybiB2YWw7Ci0JfQotfQotCi1zdGF0aWMgaW50IG1heDE0NTc3X2dldF9jaGFyZ2VyX3N0YXRlKHN0cnVjdCBtYXgxNDU3N19jaGFyZ2VyICpjaGcsIGludCAqdmFsKQotewotCXN0cnVjdCByZWdtYXAgKnJtYXAgPSBjaGctPm1heDE0NTc3LT5yZWdtYXA7Ci0JaW50IHJldDsKLQl1OCByZWdfZGF0YTsKLQotCS8qCi0JICogQ2hhcmdpbmcgb2NjdXJzIG9ubHkgaWY6Ci0JICogIC0gQ0hHQ1RSTDIvTUJDSE9TVEVOID09IDEKLQkgKiAgLSBTVEFUVVMyL0NHTUJDID09IDEKLQkgKgotCSAqIFRPRE86Ci0JICogIC0gaGFuZGxlIEZVTEwgYWZ0ZXIgVG9wLW9mZiB0aW1lciAoRU9DIHJlZ2lzdGVyIG1heSBiZSBvZmYKLQkgKiAgICBhbmQgdGhlIGNoYXJnZXIgd29uJ3QgYmUgY2hhcmdpbmcgYWx0aG91Z2ggTUJDSE9TVEVOIGlzIG9uKQotCSAqICAtIGhhbmRsZSBwcm9wZXJseSBkZWFkLWJhdHRlcnkgY2hhcmdpbmcgKHJlc3BlY3QgdGltZXIpCi0JICogIC0gaGFuZGxlIHRpbWVycyAoZmFzdC1jaGFyZ2UgYW5kIHByZXF1YWwpIC9NQkNDSEdFUlIvCi0JICovCi0JcmV0ID0gbWF4MTQ1NzdfcmVhZF9yZWcocm1hcCwgTUFYMTQ1NzdfQ0hHX1JFR19DSEdfQ1RSTDIsICZyZWdfZGF0YSk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OwotCi0JaWYgKChyZWdfZGF0YSAmIENIR0NUUkwyX01CQ0hPU1RFTl9NQVNLKSA9PSAwKSB7Ci0JCSp2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyZXQgPSBtYXgxNDU3N19yZWFkX3JlZyhybWFwLCBNQVgxNDU3N19DSEdfUkVHX1NUQVRVUzMsICZyZWdfZGF0YSk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OwotCi0JaWYgKHJlZ19kYXRhICYgU1RBVFVTM19DR01CQ19NQVNLKSB7Ci0JCS8qIENoYXJnZXIgb3IgVVNCLWNhYmxlIGlzIGNvbm5lY3RlZCAqLwotCQlpZiAocmVnX2RhdGEgJiBTVEFUVVMzX0VPQ19NQVNLKQotCQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTDsKLQkJZWxzZQotCQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7Ci0JCWdvdG8gb3V0OwotCX0KLQotCSp2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOwotCi1vdXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIFN1cHBvcnRlZCBjaGFyZ2UgdHlwZXM6Ci0gKiAgLSBQT1dFUl9TVVBQTFlfQ0hBUkdFX1RZUEVfTk9ORQotICogIC0gUE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX0ZBU1QKLSAqLwotc3RhdGljIGludCBtYXgxNDU3N19nZXRfY2hhcmdlX3R5cGUoc3RydWN0IG1heDE0NTc3X2NoYXJnZXIgKmNoZywgaW50ICp2YWwpCi17Ci0JaW50IHJldCwgY2hhcmdpbmc7Ci0KLQkvKgotCSAqIFRPRE86IENIQVJHRV9UWVBFX1RSSUNLTEUgKFZDSEdSX1JDIG9yIEVPQyk/Ci0JICogQXMgc3BlYyBzYXlzOgotCSAqIFthZnRlciByZWFjaGluZyBFT0MgaW50ZXJydXB0XQotCSAqICJXaGVuIHRoZSBiYXR0ZXJ5IGlzIGZ1bGx5IGNoYXJnZWQsIHRoZSAzMC1taW51dGUgKHR5cCkKLQkgKiAgdG9wLW9mZiB0aW1lciBzdGFydHMuIFRoZSBkZXZpY2UgY29udGludWVzIHRvIHRyaWNrbGUKLQkgKiAgY2hhcmdlIHRoZSBiYXR0ZXJ5IHVudGlsIHRoZSB0b3Atb2ZmIHRpbWVyIHJ1bnMgb3V0LiIKLQkgKi8KLQlyZXQgPSBtYXgxNDU3N19nZXRfY2hhcmdlcl9zdGF0ZShjaGcsICZjaGFyZ2luZyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoY2hhcmdpbmcgPT0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORykKLQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9GQVNUOwotCWVsc2UKLQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9OT05FOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4MTQ1NzdfZ2V0X29ubGluZShzdHJ1Y3QgbWF4MTQ1NzdfY2hhcmdlciAqY2hnLCBpbnQgKnZhbCkKLXsKLQlzdHJ1Y3QgcmVnbWFwICpybWFwID0gY2hnLT5tYXgxNDU3Ny0+cmVnbWFwOwotCXU4IHJlZ19kYXRhOwotCWludCByZXQ7Ci0JZW51bSBtYXgxNDU3N19tdWljX2NoYXJnZXJfdHlwZSBjaGdfdHlwZTsKLQotCXJldCA9IG1heDE0NTc3X3JlYWRfcmVnKHJtYXAsIE1BWDE0NTc3X01VSUNfUkVHX1NUQVRVUzIsICZyZWdfZGF0YSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZWdfZGF0YSA9ICgocmVnX2RhdGEgJiBTVEFUVVMyX0NIR1RZUF9NQVNLKSA+PiBTVEFUVVMyX0NIR1RZUF9TSElGVCk7Ci0JY2hnX3R5cGUgPSBtYXhpbV9nZXRfY2hhcmdlcl90eXBlKGNoZy0+bWF4MTQ1NzctPmRldl90eXBlLCByZWdfZGF0YSk7Ci0Jc3dpdGNoIChjaGdfdHlwZSkgewotCWNhc2UgTUFYMTQ1NzdfQ0hBUkdFUl9UWVBFX1VTQjoKLQljYXNlIE1BWDE0NTc3X0NIQVJHRVJfVFlQRV9ERURJQ0FURURfQ0hHOgotCWNhc2UgTUFYMTQ1NzdfQ0hBUkdFUl9UWVBFX1NQRUNJQUxfNTAwTUE6Ci0JY2FzZSBNQVgxNDU3N19DSEFSR0VSX1RZUEVfU1BFQ0lBTF8xQToKLQljYXNlIE1BWDE0NTc3X0NIQVJHRVJfVFlQRV9ERUFEX0JBVFRFUlk6Ci0JY2FzZSBNQVg3NzgzNl9DSEFSR0VSX1RZUEVfU1BFQ0lBTF9CSUFTOgotCQkqdmFsID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBNQVgxNDU3N19DSEFSR0VSX1RZUEVfTk9ORToKLQljYXNlIE1BWDE0NTc3X0NIQVJHRVJfVFlQRV9ET1dOU1RSRUFNX1BPUlQ6Ci0JY2FzZSBNQVgxNDU3N19DSEFSR0VSX1RZUEVfUkVTRVJWRUQ6Ci0JY2FzZSBNQVg3NzgzNl9DSEFSR0VSX1RZUEVfUkVTRVJWRUQ6Ci0JZGVmYXVsdDoKLQkJKnZhbCA9IDA7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBTdXBwb3J0ZWQgaGVhbHRoIHN0YXR1c2VzOgotICogIC0gUE9XRVJfU1VQUExZX0hFQUxUSF9ERUFECi0gKiAgLSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJWT0xUQUdFCi0gKiAgLSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0QKLSAqLwotc3RhdGljIGludCBtYXgxNDU3N19nZXRfYmF0dGVyeV9oZWFsdGgoc3RydWN0IG1heDE0NTc3X2NoYXJnZXIgKmNoZywgaW50ICp2YWwpCi17Ci0Jc3RydWN0IHJlZ21hcCAqcm1hcCA9IGNoZy0+bWF4MTQ1NzctPnJlZ21hcDsKLQlpbnQgcmV0OwotCXU4IHJlZ19kYXRhOwotCWVudW0gbWF4MTQ1NzdfbXVpY19jaGFyZ2VyX3R5cGUgY2hnX3R5cGU7Ci0KLQlyZXQgPSBtYXgxNDU3N19yZWFkX3JlZyhybWFwLCBNQVgxNDU3N19NVUlDX1JFR19TVEFUVVMyLCAmcmVnX2RhdGEpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKLQotCXJlZ19kYXRhID0gKChyZWdfZGF0YSAmIFNUQVRVUzJfQ0hHVFlQX01BU0spID4+IFNUQVRVUzJfQ0hHVFlQX1NISUZUKTsKLQljaGdfdHlwZSA9IG1heGltX2dldF9jaGFyZ2VyX3R5cGUoY2hnLT5tYXgxNDU3Ny0+ZGV2X3R5cGUsIHJlZ19kYXRhKTsKLQlpZiAoY2hnX3R5cGUgPT0gTUFYMTQ1NzdfQ0hBUkdFUl9UWVBFX0RFQURfQkFUVEVSWSkgewotCQkqdmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9ERUFEOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyZXQgPSBtYXgxNDU3N19yZWFkX3JlZyhybWFwLCBNQVgxNDU3N19DSEdfUkVHX1NUQVRVUzMsICZyZWdfZGF0YSk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OwotCi0JaWYgKHJlZ19kYXRhICYgU1RBVFVTM19PVlBfTUFTSykgewotCQkqdmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSVk9MVEFHRTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogTm90IGRlYWQsIG5vdCBvdmVydm9sdGFnZSAqLwotCSp2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0Q7Ci0KLW91dDoKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogQWx3YXlzIHJldHVybnMgMS4KLSAqIFRoZSBtYXgxNDU3NyBjaGlwIGRvZXNuJ3QgcmVwb3J0IGFueSBzdGF0dXMgb2YgYmF0dGVyeSBwcmVzZW5jZS4KLSAqIExldHMgYXNzdW1lIHRoYXQgaXQgd2lsbCBhbHdheXMgYmUgdXNlZCB3aXRoIHNvbWUgYmF0dGVyeS4KLSAqLwotc3RhdGljIGludCBtYXgxNDU3N19nZXRfcHJlc2VudChzdHJ1Y3QgbWF4MTQ1NzdfY2hhcmdlciAqY2hnLCBpbnQgKnZhbCkKLXsKLQkqdmFsID0gMTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1heDE0NTc3X3NldF9mYXN0X2NoYXJnZV90aW1lcihzdHJ1Y3QgbWF4MTQ1NzdfY2hhcmdlciAqY2hnLAotCQl1bnNpZ25lZCBsb25nIGhvdXJzKQotewotCXU4IHJlZ19kYXRhOwotCi0Jc3dpdGNoIChob3VycykgewotCWNhc2UgNSAuLi4gNzoKLQkJcmVnX2RhdGEgPSBob3VycyAtIDM7Ci0JCWJyZWFrOwotCWNhc2UgMDoKLQkJLyogRGlzYWJsZSAqLwotCQlyZWdfZGF0YSA9IDB4NzsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X2VycihjaGctPmRldiwgIldyb25nIHZhbHVlIGZvciBGYXN0LUNoYXJnZSBUaW1lcjogJWx1XG4iLAotCQkJCWhvdXJzKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJlZ19kYXRhIDw8PSBDSEdDVFJMMV9UQ0hXX1NISUZUOwotCi0JcmV0dXJuIG1heDE0NTc3X3VwZGF0ZV9yZWcoY2hnLT5tYXgxNDU3Ny0+cmVnbWFwLAotCQkJTUFYMTQ1NzdfUkVHX0NIR0NUUkwxLCBDSEdDVFJMMV9UQ0hXX01BU0ssIHJlZ19kYXRhKTsKLX0KLQotc3RhdGljIGludCBtYXgxNDU3N19pbml0X2NvbnN0YW50X3ZvbHRhZ2Uoc3RydWN0IG1heDE0NTc3X2NoYXJnZXIgKmNoZywKLQkJdW5zaWduZWQgaW50IHV2b2x0KQotewotCXU4IHJlZ19kYXRhOwotCi0JaWYgKHV2b2x0IDwgTUFYSU1fQ0hBUkdFUl9DT05TVEFOVF9WT0xUQUdFX01JTiB8fAotCQkJdXZvbHQgPiBNQVhJTV9DSEFSR0VSX0NPTlNUQU5UX1ZPTFRBR0VfTUFYKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICh1dm9sdCA9PSA0MjAwMDAwKQotCQlyZWdfZGF0YSA9IDB4MDsKLQllbHNlIGlmICh1dm9sdCA9PSBNQVhJTV9DSEFSR0VSX0NPTlNUQU5UX1ZPTFRBR0VfTUFYKQotCQlyZWdfZGF0YSA9IDB4MWY7Ci0JZWxzZSBpZiAodXZvbHQgPD0gNDI4MDAwMCkgewotCQl1bnNpZ25lZCBpbnQgdmFsID0gdXZvbHQ7Ci0KLQkJdmFsIC09IE1BWElNX0NIQVJHRVJfQ09OU1RBTlRfVk9MVEFHRV9NSU47Ci0JCXZhbCAvPSBNQVhJTV9DSEFSR0VSX0NPTlNUQU5UX1ZPTFRBR0VfU1RFUDsKLQkJaWYgKHV2b2x0IDw9IDQxODAwMDApCi0JCQlyZWdfZGF0YSA9IDB4MSArIHZhbDsKLQkJZWxzZQotCQkJcmVnX2RhdGEgPSB2YWw7IC8qIEZpeCBmb3IgZ2FwIGJldHdlZW4gNC4xOFYgYW5kIDQuMjJWICovCi0JfSBlbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmVnX2RhdGEgPDw9IENIR0NUUkwzX01CQ0NWV1JDX1NISUZUOwotCi0JcmV0dXJuIG1heDE0NTc3X3dyaXRlX3JlZyhjaGctPm1heDE0NTc3LT5yZWdtYXAsCi0JCQlNQVgxNDU3N19DSEdfUkVHX0NIR19DVFJMMywgcmVnX2RhdGEpOwotfQotCi1zdGF0aWMgaW50IG1heDE0NTc3X2luaXRfZW9jKHN0cnVjdCBtYXgxNDU3N19jaGFyZ2VyICpjaGcsCi0JCXVuc2lnbmVkIGludCB1YW1wKQotewotCXVuc2lnbmVkIGludCBjdXJyZW50X2JpdHMgPSAweGY7Ci0JdTggcmVnX2RhdGE7Ci0KLQlzd2l0Y2ggKGNoZy0+bWF4MTQ1NzctPmRldl90eXBlKSB7Ci0JY2FzZSBNQVhJTV9ERVZJQ0VfVFlQRV9NQVg3NzgzNjoKLQkJaWYgKHVhbXAgPCA1MDAwKQotCQkJcmV0dXJuIC1FSU5WQUw7IC8qIFJlcXVlc3RlZCBjdXJyZW50IGlzIHRvbyBsb3cgKi8KLQotCQlpZiAodWFtcCA+PSA3NTAwICYmIHVhbXAgPCAxMDAwMCkKLQkJCWN1cnJlbnRfYml0cyA9IDB4MDsKLQkJZWxzZSBpZiAodWFtcCA8PSA1MDAwMCkgewotCQkJLyogPDUwMDAsIDc0OTk+IGFuZCA8MTAwMDAsIDUwMDAwPiAqLwotCQkJY3VycmVudF9iaXRzID0gdWFtcCAvIDUwMDA7Ci0JCX0gZWxzZSB7Ci0JCQl1YW1wID0gbWluKHVhbXAsIDEwMDAwMFUpIC0gNTAwMDBVOwotCQkJY3VycmVudF9iaXRzID0gMHhhICsgdWFtcCAvIDEwMDAwOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBNQVhJTV9ERVZJQ0VfVFlQRV9NQVgxNDU3NzoKLQlkZWZhdWx0OgotCQlpZiAodWFtcCA8IE1BWDE0NTc3X0NIQVJHRVJfRU9DX0NVUlJFTlRfTElNSVRfTUlOKQotCQkJcmV0dXJuIC1FSU5WQUw7IC8qIFJlcXVlc3RlZCBjdXJyZW50IGlzIHRvbyBsb3cgKi8KLQotCQl1YW1wID0gbWluKHVhbXAsIE1BWDE0NTc3X0NIQVJHRVJfRU9DX0NVUlJFTlRfTElNSVRfTUFYKTsKLQkJdWFtcCAtPSBNQVgxNDU3N19DSEFSR0VSX0VPQ19DVVJSRU5UX0xJTUlUX01JTjsKLQkJY3VycmVudF9iaXRzID0gdWFtcCAvIE1BWDE0NTc3X0NIQVJHRVJfRU9DX0NVUlJFTlRfTElNSVRfU1RFUDsKLQkJYnJlYWs7Ci0JfQotCi0JcmVnX2RhdGEgPSBjdXJyZW50X2JpdHMgPDwgQ0hHQ1RSTDVfRU9DU19TSElGVDsKLQotCXJldHVybiBtYXgxNDU3N191cGRhdGVfcmVnKGNoZy0+bWF4MTQ1NzctPnJlZ21hcCwKLQkJCU1BWDE0NTc3X0NIR19SRUdfQ0hHX0NUUkw1LCBDSEdDVFJMNV9FT0NTX01BU0ssCi0JCQlyZWdfZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4MTQ1NzdfaW5pdF9mYXN0X2NoYXJnZShzdHJ1Y3QgbWF4MTQ1NzdfY2hhcmdlciAqY2hnLAotCQl1bnNpZ25lZCBpbnQgdWFtcCkKLXsKLQl1OCByZWdfZGF0YTsKLQlpbnQgcmV0OwotCWNvbnN0IHN0cnVjdCBtYXhpbV9jaGFyZ2VyX2N1cnJlbnQgKmxpbWl0cyA9Ci0JCSZtYXhpbV9jaGFyZ2VyX2N1cnJlbnRzW2NoZy0+bWF4MTQ1NzctPmRldl90eXBlXTsKLQotCXJldCA9IG1heGltX2NoYXJnZXJfY2FsY19yZWdfY3VycmVudChsaW1pdHMsIHVhbXAsIHVhbXAsICZyZWdfZGF0YSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGNoZy0+ZGV2LCAiV3JvbmcgdmFsdWUgZm9yIGZhc3QgY2hhcmdlOiAldVxuIiwgdWFtcCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIG1heDE0NTc3X3VwZGF0ZV9yZWcoY2hnLT5tYXgxNDU3Ny0+cmVnbWFwLAotCQkJTUFYMTQ1NzdfQ0hHX1JFR19DSEdfQ1RSTDQsCi0JCQlDSEdDVFJMNF9NQkNJQ0hXUkNMX01BU0sgfCBDSEdDVFJMNF9NQkNJQ0hXUkNIX01BU0ssCi0JCQlyZWdfZGF0YSk7Ci19Ci0KLS8qCi0gKiBTZXRzIGNoYXJnZXIgcmVnaXN0ZXJzIHRvIHByb3BlciBhbmQgc2FmZSBkZWZhdWx0IHZhbHVlcy4KLSAqIFNvbWUgb2YgdGhlc2UgdmFsdWVzIGFyZSBlcXVhbCB0byBkZWZhdWx0cyBpbiBNQVgxNDU3N0UKLSAqIGRhdGEgc2hlZXQgYnV0IHRoZXJlIGFyZSBtaW5vciBkaWZmZXJlbmNlcy4KLSAqLwotc3RhdGljIGludCBtYXgxNDU3N19jaGFyZ2VyX3JlZ19pbml0KHN0cnVjdCBtYXgxNDU3N19jaGFyZ2VyICpjaGcpCi17Ci0Jc3RydWN0IHJlZ21hcCAqcm1hcCA9IGNoZy0+bWF4MTQ1NzctPnJlZ21hcDsKLQl1OCByZWdfZGF0YTsKLQlpbnQgcmV0OwotCi0JLyoKLQkgKiBDaGFyZ2VyLVR5cGUgTWFudWFsIERldGVjdGlvbiwgZGVmYXVsdCBvZmYgKHNldCBDSEdUWVBNQU4gdG8gMCkKLQkgKiBDaGFyZ2VyLURldGVjdGlvbiBFbmFibGUsIGRlZmF1bHQgb24gKHNldCBDSEdERVRFTiB0byAxKQotCSAqIENvbWJpbmVkIG1hc2sgb2YgQ0hHREVURU4gYW5kIENIR1RZUE1BTiB3aWxsIHplcm8gdGhlIENIR1RZUE1BTiBiaXQKLQkgKi8KLQlyZWdfZGF0YSA9IDB4MSA8PCBDREVUQ1RSTDFfQ0hHREVURU5fU0hJRlQ7Ci0JbWF4MTQ1NzdfdXBkYXRlX3JlZyhybWFwLCBNQVgxNDU3N19SRUdfQ0RFVENUUkwxLAotCQkJQ0RFVENUUkwxX0NIR0RFVEVOX01BU0sgfCBDREVUQ1RSTDFfQ0hHVFlQTUFOX01BU0ssCi0JCQlyZWdfZGF0YSk7Ci0KLQkvKgotCSAqIFdhbGwtQWRhcHRlciBSYXBpZCBDaGFyZ2UsIGRlZmF1bHQgb24KLQkgKiBCYXR0ZXJ5LUNoYXJnZXIsIGRlZmF1bHQgb24KLQkgKi8KLQlyZWdfZGF0YSA9IDB4MSA8PCBDSEdDVFJMMl9WQ0hHUl9SQ19TSElGVDsKLQlyZWdfZGF0YSB8PSAweDEgPDwgQ0hHQ1RSTDJfTUJDSE9TVEVOX1NISUZUOwotCW1heDE0NTc3X3dyaXRlX3JlZyhybWFwLCBNQVgxNDU3N19SRUdfQ0hHQ1RSTDIsIHJlZ19kYXRhKTsKLQotCS8qIEF1dG8gQ2hhcmdpbmcgU3RvcCwgZGVmYXVsdCBvZmYgKi8KLQlyZWdfZGF0YSA9IDB4MCA8PCBDSEdDVFJMNl9BVVRPU1RPUF9TSElGVDsKLQltYXgxNDU3N193cml0ZV9yZWcocm1hcCwgTUFYMTQ1NzdfUkVHX0NIR0NUUkw2LCByZWdfZGF0YSk7Ci0KLQlyZXQgPSBtYXgxNDU3N19pbml0X2NvbnN0YW50X3ZvbHRhZ2UoY2hnLCBjaGctPnBkYXRhLT5jb25zdGFudF91dm9sdCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IG1heDE0NTc3X2luaXRfZW9jKGNoZywgY2hnLT5wZGF0YS0+ZW9jX3VhbXApOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBtYXgxNDU3N19pbml0X2Zhc3RfY2hhcmdlKGNoZywgY2hnLT5wZGF0YS0+ZmFzdF9jaGFyZ2VfdWFtcCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IG1heDE0NTc3X3NldF9mYXN0X2NoYXJnZV90aW1lcihjaGcsCi0JCQlNQVhJTV9DSEFSR0VSX0ZBU1RfQ0hBUkdFX1RJTUVSX0RFRkFVTFQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBJbml0aWFsaXplIE92ZXJ2b2x0YWdlLVByb3RlY3Rpb24gVGhyZXNob2xkICovCi0Jc3dpdGNoIChjaGctPnBkYXRhLT5vdnBfdXZvbHQpIHsKLQljYXNlIDc1MDAwMDA6Ci0JCXJlZ19kYXRhID0gMHgwOwotCQlicmVhazsKLQljYXNlIDYwMDAwMDA6Ci0JY2FzZSA2NTAwMDAwOgotCWNhc2UgNzAwMDAwMDoKLQkJcmVnX2RhdGEgPSAweDEgKyAoY2hnLT5wZGF0YS0+b3ZwX3V2b2x0IC0gNjAwMDAwMCkgLyA1MDAwMDA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoY2hnLT5kZXYsICJXcm9uZyB2YWx1ZSBmb3IgT1ZQOiAldVxuIiwKLQkJCQljaGctPnBkYXRhLT5vdnBfdXZvbHQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmVnX2RhdGEgPDw9IENIR0NUUkw3X09UUENHSENWU19TSElGVDsKLQltYXgxNDU3N193cml0ZV9yZWcocm1hcCwgTUFYMTQ1NzdfUkVHX0NIR0NUUkw3LCByZWdfZGF0YSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogU3VwcG9ydCBwcm9wZXJ0eSBmcm9tIGNoYXJnZXIgKi8KLXN0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBtYXgxNDU3N19jaGFyZ2VyX3Byb3BzW10gPSB7Ci0JUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9UWVBFLAotCVBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5ULAotCVBPV0VSX1NVUFBMWV9QUk9QX09OTElORSwKLQlQT1dFUl9TVVBQTFlfUFJPUF9NT0RFTF9OQU1FLAotCVBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbW9kZWxfbmFtZXNbXSA9IHsKLQlbTUFYSU1fREVWSUNFX1RZUEVfVU5LTk9XTl0JPSAiTUFYMTQ1NzctbGlrZSIsCi0JW01BWElNX0RFVklDRV9UWVBFX01BWDE0NTc3XQk9ICJNQVgxNDU3NyIsCi0JW01BWElNX0RFVklDRV9UWVBFX01BWDc3ODM2XQk9ICJNQVg3NzgzNiIsCi19Owotc3RhdGljIGNvbnN0IGNoYXIgKm1hbnVmYWN0dXJlciA9ICJNYXhpbSBJbnRlZ3JhdGVkIjsKLQotc3RhdGljIGludCBtYXgxNDU3N19jaGFyZ2VyX2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCi0JCQkgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAotCQkJICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCi17Ci0Jc3RydWN0IG1heDE0NTc3X2NoYXJnZXIgKmNoZyA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwotCWludCByZXQgPSAwOwotCi0Jc3dpdGNoIChwc3ApIHsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKLQkJcmV0ID0gbWF4MTQ1NzdfZ2V0X2NoYXJnZXJfc3RhdGUoY2hnLCAmdmFsLT5pbnR2YWwpOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9UWVBFOgotCQlyZXQgPSBtYXgxNDU3N19nZXRfY2hhcmdlX3R5cGUoY2hnLCAmdmFsLT5pbnR2YWwpOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSDoKLQkJcmV0ID0gbWF4MTQ1NzdfZ2V0X2JhdHRlcnlfaGVhbHRoKGNoZywgJnZhbC0+aW50dmFsKTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOgotCQlyZXQgPSBtYXgxNDU3N19nZXRfcHJlc2VudChjaGcsICZ2YWwtPmludHZhbCk7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FOgotCQlyZXQgPSBtYXgxNDU3N19nZXRfb25saW5lKGNoZywgJnZhbC0+aW50dmFsKTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9NT0RFTF9OQU1FOgotCQlCVUlMRF9CVUdfT04oQVJSQVlfU0laRShtb2RlbF9uYW1lcykgIT0gTUFYSU1fREVWSUNFX1RZUEVfTlVNKTsKLQkJdmFsLT5zdHJ2YWwgPSBtb2RlbF9uYW1lc1tjaGctPm1heDE0NTc3LT5kZXZfdHlwZV07Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfTUFOVUZBQ1RVUkVSOgotCQl2YWwtPnN0cnZhbCA9IG1hbnVmYWN0dXJlcjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBtYXgxNDU3N19jaGFyZ2VyX2Rlc2MgPSB7Ci0JLm5hbWUgPSAibWF4MTQ1NzctY2hhcmdlciIsCi0JLnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZLAotCS5wcm9wZXJ0aWVzID0gbWF4MTQ1NzdfY2hhcmdlcl9wcm9wcywKLQkubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKG1heDE0NTc3X2NoYXJnZXJfcHJvcHMpLAotCS5nZXRfcHJvcGVydHkgPSBtYXgxNDU3N19jaGFyZ2VyX2dldF9wcm9wZXJ0eSwKLX07Ci0KLSNpZmRlZiBDT05GSUdfT0YKLXN0YXRpYyBzdHJ1Y3QgbWF4MTQ1NzdfY2hhcmdlcl9wbGF0Zm9ybV9kYXRhICptYXgxNDU3N19jaGFyZ2VyX2R0X2luaXQoCi0JCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IG1heDE0NTc3X2NoYXJnZXJfcGxhdGZvcm1fZGF0YSAqcGRhdGE7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOwotCWludCByZXQ7Ci0KLQlpZiAoIW5wKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIGNoYXJnZXIgT0Ygbm9kZVxuIik7Ci0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCX0KLQotCXBkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcGRhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBkYXRhKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQotCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAibWF4aW0sY29uc3RhbnQtdXZvbHQiLAotCQkJJnBkYXRhLT5jb25zdGFudF91dm9sdCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgcGFyc2UgbWF4aW0sY29uc3RhbnQtdXZvbHQgZmllbGQgZnJvbSBEVFxuIik7Ci0JCXJldHVybiBFUlJfUFRSKHJldCk7Ci0JfQotCi0JcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJtYXhpbSxmYXN0LWNoYXJnZS11YW1wIiwKLQkJCSZwZGF0YS0+ZmFzdF9jaGFyZ2VfdWFtcCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgcGFyc2UgbWF4aW0sZmFzdC1jaGFyZ2UtdWFtcCBmaWVsZCBmcm9tIERUXG4iKTsKLQkJcmV0dXJuIEVSUl9QVFIocmV0KTsKLQl9Ci0KLQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgIm1heGltLGVvYy11YW1wIiwgJnBkYXRhLT5lb2NfdWFtcCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgcGFyc2UgbWF4aW0sZW9jLXVhbXAgZmllbGQgZnJvbSBEVFxuIik7Ci0JCXJldHVybiBFUlJfUFRSKHJldCk7Ci0JfQotCi0JcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJtYXhpbSxvdnAtdXZvbHQiLCAmcGRhdGEtPm92cF91dm9sdCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgcGFyc2UgbWF4aW0sb3ZwLXV2b2x0IGZpZWxkIGZyb20gRFRcbiIpOwotCQlyZXR1cm4gRVJSX1BUUihyZXQpOwotCX0KLQotCXJldHVybiBwZGF0YTsKLX0KLSNlbHNlIC8qIENPTkZJR19PRiAqLwotc3RhdGljIHN0cnVjdCBtYXgxNDU3N19jaGFyZ2VyX3BsYXRmb3JtX2RhdGEgKm1heDE0NTc3X2NoYXJnZXJfZHRfaW5pdCgKLQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gTlVMTDsKLX0KLSNlbmRpZiAvKiBDT05GSUdfT0YgKi8KLQotc3RhdGljIHNzaXplX3Qgc2hvd19mYXN0X2NoYXJnZV90aW1lcihzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IG1heDE0NTc3X2NoYXJnZXIgKmNoZyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXU4IHJlZ19kYXRhOwotCWludCByZXQ7Ci0JdW5zaWduZWQgaW50IHZhbDsKLQotCXJldCA9IG1heDE0NTc3X3JlYWRfcmVnKGNoZy0+bWF4MTQ1NzctPnJlZ21hcCwgTUFYMTQ1NzdfUkVHX0NIR0NUUkwxLAotCQkJJnJlZ19kYXRhKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmVnX2RhdGEgJj0gQ0hHQ1RSTDFfVENIV19NQVNLOwotCXJlZ19kYXRhID4+PSBDSEdDVFJMMV9UQ0hXX1NISUZUOwotCXN3aXRjaCAocmVnX2RhdGEpIHsKLQljYXNlIDB4MiAuLi4gMHg0OgotCQl2YWwgPSByZWdfZGF0YSArIDM7Ci0JCWJyZWFrOwotCWNhc2UgMHg3OgotCQl2YWwgPSAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQl2YWwgPSA1OwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIHZhbCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHN0b3JlX2Zhc3RfY2hhcmdlX3RpbWVyKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBtYXgxNDU3N19jaGFyZ2VyICpjaGcgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgcmV0OwotCi0JcmV0ID0ga3N0cnRvdWwoYnVmLCAxMCwgJnZhbCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IG1heDE0NTc3X3NldF9mYXN0X2NoYXJnZV90aW1lcihjaGcsIHZhbCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKGZhc3RfY2hhcmdlX3RpbWVyLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJc2hvd19mYXN0X2NoYXJnZV90aW1lciwgc3RvcmVfZmFzdF9jaGFyZ2VfdGltZXIpOwotCi1zdGF0aWMgaW50IG1heDE0NTc3X2NoYXJnZXJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgbWF4MTQ1NzdfY2hhcmdlciAqY2hnOwotCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKLQlzdHJ1Y3QgbWF4MTQ1NzcgKm1heDE0NTc3ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwotCWludCByZXQ7Ci0KLQljaGcgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpjaGcpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNoZykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjaGcpOwotCWNoZy0+ZGV2ID0gJnBkZXYtPmRldjsKLQljaGctPm1heDE0NTc3ID0gbWF4MTQ1Nzc7Ci0KLQljaGctPnBkYXRhID0gbWF4MTQ1NzdfY2hhcmdlcl9kdF9pbml0KHBkZXYpOwotCWlmIChJU19FUlJfT1JfTlVMTChjaGctPnBkYXRhKSkKLQkJcmV0dXJuIFBUUl9FUlIoY2hnLT5wZGF0YSk7Ci0KLQlyZXQgPSBtYXgxNDU3N19jaGFyZ2VyX3JlZ19pbml0KGNoZyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZmFzdF9jaGFyZ2VfdGltZXIpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkOiBjcmVhdGUgc3lzZnMgZW50cnlcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXBzeV9jZmcuZHJ2X2RhdGEgPSBjaGc7Ci0JY2hnLT5jaGFyZ2VyID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZtYXgxNDU3N19jaGFyZ2VyX2Rlc2MsCi0JCQkJCQkmcHN5X2NmZyk7Ci0JaWYgKElTX0VSUihjaGctPmNoYXJnZXIpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZDogcG93ZXIgc3VwcGx5IHJlZ2lzdGVyXG4iKTsKLQkJcmV0ID0gUFRSX0VSUihjaGctPmNoYXJnZXIpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQkvKiBDaGVjayBmb3IgdmFsaWQgdmFsdWVzIGZvciBjaGFyZ2VyICovCi0JQlVJTERfQlVHX09OKE1BWDE0NTc3X0NIQVJHRVJfRU9DX0NVUlJFTlRfTElNSVRfTUlOICsKLQkJCU1BWDE0NTc3X0NIQVJHRVJfRU9DX0NVUlJFTlRfTElNSVRfU1RFUCAqIDB4ZiAhPQotCQkJTUFYMTQ1NzdfQ0hBUkdFUl9FT0NfQ1VSUkVOVF9MSU1JVF9NQVgpOwotCXJldHVybiAwOwotCi1lcnI6Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9mYXN0X2NoYXJnZV90aW1lcik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1heDE0NTc3X2NoYXJnZXJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IG1heDE0NTc3X2NoYXJnZXIgKmNoZyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9mYXN0X2NoYXJnZV90aW1lcik7Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoY2hnLT5jaGFyZ2VyKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBtYXgxNDU3N19jaGFyZ2VyX2lkW10gPSB7Ci0JeyAibWF4MTQ1NzctY2hhcmdlciIsIE1BWElNX0RFVklDRV9UWVBFX01BWDE0NTc3LCB9LAotCXsgIm1heDc3ODM2LWNoYXJnZXIiLCBNQVhJTV9ERVZJQ0VfVFlQRV9NQVg3NzgzNiwgfSwKLQl7IH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBtYXgxNDU3N19jaGFyZ2VyX2lkKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbWF4MTQ1NzdfY2hhcmdlcl9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUJPSAibWF4MTQ1NzctY2hhcmdlciIsCi0JfSwKLQkucHJvYmUJCT0gbWF4MTQ1NzdfY2hhcmdlcl9wcm9iZSwKLQkucmVtb3ZlCQk9IG1heDE0NTc3X2NoYXJnZXJfcmVtb3ZlLAotCS5pZF90YWJsZQk9IG1heDE0NTc3X2NoYXJnZXJfaWQsCi19OwotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihtYXgxNDU3N19jaGFyZ2VyX2RyaXZlcik7Ci0KLU1PRFVMRV9BVVRIT1IoIktyenlzenRvZiBLb3psb3dza2kgPGsua296bG93c2tpQHNhbXN1bmcuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXhpbSAxNDU3Ny83NzgzNiBjaGFyZ2VyIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9tYXgxNzA0Ml9iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL21heDE3MDQyX2JhdHRlcnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM2NWYxMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3Bvd2VyL21heDE3MDQyX2JhdHRlcnkuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMTYgKzAsMCBAQAotLyoKLSAqIEZ1ZWwgZ2F1Z2UgZHJpdmVyIGZvciBNYXhpbSAxNzA0MiAvIDg5NjYgLyA4OTk3Ci0gKiAgTm90ZSB0aGF0IE1heGltIDg5NjYgYW5kIDg5OTcgYXJlIG1mZCBhbmQgdGhpcyBpcyBpdHMgc3ViZGV2aWNlLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzCi0gKiBNeXVuZ0pvbyBIYW0gPG15dW5nam9vLmhhbUBzYW1zdW5nLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKgotICogVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gbWF4MTcwNDBfYmF0dGVyeS5jCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgotI2luY2x1ZGUgPGxpbnV4L3Bvd2VyL21heDE3MDQyX2JhdHRlcnkuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgotCi0vKiBTdGF0dXMgcmVnaXN0ZXIgYml0cyAqLwotI2RlZmluZSBTVEFUVVNfUE9SX0JJVCAgICAgICAgICgxIDw8IDEpCi0jZGVmaW5lIFNUQVRVU19CU1RfQklUICAgICAgICAgKDEgPDwgMykKLSNkZWZpbmUgU1RBVFVTX1ZNTl9CSVQgICAgICAgICAoMSA8PCA4KQotI2RlZmluZSBTVEFUVVNfVE1OX0JJVCAgICAgICAgICgxIDw8IDkpCi0jZGVmaW5lIFNUQVRVU19TTU5fQklUICAgICAgICAgKDEgPDwgMTApCi0jZGVmaW5lIFNUQVRVU19CSV9CSVQgICAgICAgICAgKDEgPDwgMTEpCi0jZGVmaW5lIFNUQVRVU19WTVhfQklUICAgICAgICAgKDEgPDwgMTIpCi0jZGVmaW5lIFNUQVRVU19UTVhfQklUICAgICAgICAgKDEgPDwgMTMpCi0jZGVmaW5lIFNUQVRVU19TTVhfQklUICAgICAgICAgKDEgPDwgMTQpCi0jZGVmaW5lIFNUQVRVU19CUl9CSVQgICAgICAgICAgKDEgPDwgMTUpCi0KLS8qIEludGVycnVwdCBtYXNrIGJpdHMgKi8KLSNkZWZpbmUgQ09ORklHX0FMUlRfQklUX0VOQkwJKDEgPDwgMikKLSNkZWZpbmUgU1RBVFVTX0lOVFJfU09DTUlOX0JJVAkoMSA8PCAxMCkKLSNkZWZpbmUgU1RBVFVTX0lOVFJfU09DTUFYX0JJVAkoMSA8PCAxNCkKLQotI2RlZmluZSBWRlNPQzBfTE9DSwkJMHgwMDAwCi0jZGVmaW5lIFZGU09DMF9VTkxPQ0sJCTB4MDA4MAotI2RlZmluZSBNT0RFTF9VTkxPQ0sxCTBYMDA1OQotI2RlZmluZSBNT0RFTF9VTkxPQ0syCTBYMDBDNAotI2RlZmluZSBNT0RFTF9MT0NLMQkJMFgwMDAwCi0jZGVmaW5lIE1PREVMX0xPQ0syCQkwWDAwMDAKLQotI2RlZmluZSBkUV9BQ0NfRElWCTB4NAotI2RlZmluZSBkUF9BQ0NfMTAwCTB4MTkwMAotI2RlZmluZSBkUF9BQ0NfMjAwCTB4MzIwMAotCi0jZGVmaW5lIE1BWDE3MDQyX1ZNQVhfVE9MRVJBTkNFCQk1MCAvKiA1MCBtViAqLwotCi1zdHJ1Y3QgbWF4MTcwNDJfY2hpcCB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKLQlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0dGVyeTsKLQllbnVtIG1heDE3MHh4X2NoaXBfdHlwZSBjaGlwX3R5cGU7Ci0Jc3RydWN0IG1heDE3MDQyX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwotCWludCAgICBpbml0X2NvbXBsZXRlOwotfTsKLQotc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IG1heDE3MDQyX2JhdHRlcnlfcHJvcHNbXSA9IHsKLQlQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5ULAotCVBPV0VSX1NVUFBMWV9QUk9QX0NZQ0xFX0NPVU5ULAotCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYLAotCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOX0RFU0lHTiwKLQlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVywKLQlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX0FWRywKLQlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX09DViwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWSwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfQ09VTlRFUiwKLQlQT1dFUl9TVVBQTFlfUFJPUF9URU1QLAotCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQUxFUlRfTUlOLAotCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQUxFUlRfTUFYLAotCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfTUlOLAotCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfTUFYLAotCVBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVywKLQlQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX0FWRywKLX07Ci0KLXN0YXRpYyBpbnQgbWF4MTcwNDJfZ2V0X3RlbXBlcmF0dXJlKHN0cnVjdCBtYXgxNzA0Ml9jaGlwICpjaGlwLCBpbnQgKnRlbXApCi17Ci0JaW50IHJldDsKLQl1MzIgZGF0YTsKLQlzdHJ1Y3QgcmVnbWFwICptYXAgPSBjaGlwLT5yZWdtYXA7Ci0KLQlyZXQgPSByZWdtYXBfcmVhZChtYXAsIE1BWDE3MDQyX1RFTVAsICZkYXRhKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCSp0ZW1wID0gZGF0YTsKLQkvKiBUaGUgdmFsdWUgaXMgc2lnbmVkLiAqLwotCWlmICgqdGVtcCAmIDB4ODAwMCkgewotCQkqdGVtcCA9ICgweDdmZmYgJiB+KnRlbXApICsgMTsKLQkJKnRlbXAgKj0gLTE7Ci0JfQotCi0JLyogVGhlIHZhbHVlIGlzIGNvbnZlcnRlZCBpbnRvIGRlY2ktY2VudGlncmFkZSBzY2FsZSAqLwotCS8qIFVuaXRzIG9mIExTQiA9IDEgLyAyNTYgZGVncmVlIENlbHNpdXMgKi8KLQkqdGVtcCA9ICp0ZW1wICogMTAgLyAyNTY7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4MTcwNDJfZ2V0X2JhdHRlcnlfaGVhbHRoKHN0cnVjdCBtYXgxNzA0Ml9jaGlwICpjaGlwLCBpbnQgKmhlYWx0aCkKLXsKLQlpbnQgdGVtcCwgdmF2ZywgdmJhdHQsIHJldDsKLQl1MzIgdmFsOwotCi0JcmV0ID0gcmVnbWFwX3JlYWQoY2hpcC0+cmVnbWFwLCBNQVgxNzA0Ml9BdmdWQ0VMTCwgJnZhbCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gaGVhbHRoX2Vycm9yOwotCi0JLyogYml0cyBbMC0zXSB1bnVzZWQgKi8KLQl2YXZnID0gdmFsICogNjI1IC8gODsKLQkvKiBDb252ZXJ0IHRvIG1pbGxpdm9sdHMgKi8KLQl2YXZnIC89IDEwMDA7Ci0KLQlyZXQgPSByZWdtYXBfcmVhZChjaGlwLT5yZWdtYXAsIE1BWDE3MDQyX1ZDRUxMLCAmdmFsKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBoZWFsdGhfZXJyb3I7Ci0KLQkvKiBiaXRzIFswLTNdIHVudXNlZCAqLwotCXZiYXR0ID0gdmFsICogNjI1IC8gODsKLQkvKiBDb252ZXJ0IHRvIG1pbGxpdm9sdHMgKi8KLQl2YmF0dCAvPSAxMDAwOwotCi0JaWYgKHZhdmcgPCBjaGlwLT5wZGF0YS0+dm1pbikgewotCQkqaGVhbHRoID0gUE9XRVJfU1VQUExZX0hFQUxUSF9ERUFEOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAodmJhdHQgPiBjaGlwLT5wZGF0YS0+dm1heCArIE1BWDE3MDQyX1ZNQVhfVE9MRVJBTkNFKSB7Ci0JCSpoZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJWT0xUQUdFOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyZXQgPSBtYXgxNzA0Ml9nZXRfdGVtcGVyYXR1cmUoY2hpcCwgJnRlbXApOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGhlYWx0aF9lcnJvcjsKLQotCWlmICh0ZW1wIDw9IGNoaXAtPnBkYXRhLT50ZW1wX21pbikgewotCQkqaGVhbHRoID0gUE9XRVJfU1VQUExZX0hFQUxUSF9DT0xEOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAodGVtcCA+PSBjaGlwLT5wZGF0YS0+dGVtcF9tYXgpIHsKLQkJKmhlYWx0aCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUkhFQVQ7Ci0JCWdvdG8gb3V0OwotCX0KLQotCSpoZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0Q7Ci0KLW91dDoKLQlyZXR1cm4gMDsKLQotaGVhbHRoX2Vycm9yOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4MTcwNDJfZ2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKLQkJCSAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCi0JCQkgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKLXsKLQlzdHJ1Y3QgbWF4MTcwNDJfY2hpcCAqY2hpcCA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwotCXN0cnVjdCByZWdtYXAgKm1hcCA9IGNoaXAtPnJlZ21hcDsKLQlpbnQgcmV0OwotCXUzMiBkYXRhOwotCi0JaWYgKCFjaGlwLT5pbml0X2NvbXBsZXRlKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCXN3aXRjaCAocHNwKSB7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOgotCQlyZXQgPSByZWdtYXBfcmVhZChtYXAsIE1BWDE3MDQyX1NUQVRVUywgJmRhdGEpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJaWYgKGRhdGEgJiBNQVgxNzA0Ml9TVEFUVVNfQmF0dEFic2VudCkKLQkJCXZhbC0+aW50dmFsID0gMDsKLQkJZWxzZQotCQkJdmFsLT5pbnR2YWwgPSAxOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NZQ0xFX0NPVU5UOgotCQlyZXQgPSByZWdtYXBfcmVhZChtYXAsIE1BWDE3MDQyX0N5Y2xlcywgJmRhdGEpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJdmFsLT5pbnR2YWwgPSBkYXRhOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYOgotCQlyZXQgPSByZWdtYXBfcmVhZChtYXAsIE1BWDE3MDQyX01pbk1heFZvbHQsICZkYXRhKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCi0JCXZhbC0+aW50dmFsID0gZGF0YSA+PiA4OwotCQl2YWwtPmludHZhbCAqPSAyMDAwMDsgLyogVW5pdHMgb2YgTFNCID0gMjBtViAqLwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOX0RFU0lHTjoKLQkJaWYgKGNoaXAtPmNoaXBfdHlwZSA9PSBNQVhJTV9ERVZJQ0VfVFlQRV9NQVgxNzA0MikKLQkJCXJldCA9IHJlZ21hcF9yZWFkKG1hcCwgTUFYMTcwNDJfVl9lbXB0eSwgJmRhdGEpOwotCQllbHNlCi0JCQlyZXQgPSByZWdtYXBfcmVhZChtYXAsIE1BWDE3MDQ3X1ZfZW1wdHksICZkYXRhKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCi0JCXZhbC0+aW50dmFsID0gZGF0YSA+PiA3OwotCQl2YWwtPmludHZhbCAqPSAxMDAwMDsgLyogVW5pdHMgb2YgTFNCID0gMTBtViAqLwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XOgotCQlyZXQgPSByZWdtYXBfcmVhZChtYXAsIE1BWDE3MDQyX1ZDRUxMLCAmZGF0YSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQotCQl2YWwtPmludHZhbCA9IGRhdGEgKiA2MjUgLyA4OwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfQVZHOgotCQlyZXQgPSByZWdtYXBfcmVhZChtYXAsIE1BWDE3MDQyX0F2Z1ZDRUxMLCAmZGF0YSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQotCQl2YWwtPmludHZhbCA9IGRhdGEgKiA2MjUgLyA4OwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfT0NWOgotCQlyZXQgPSByZWdtYXBfcmVhZChtYXAsIE1BWDE3MDQyX09DVkludGVybmFsLCAmZGF0YSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQotCQl2YWwtPmludHZhbCA9IGRhdGEgKiA2MjUgLyA4OwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZOgotCQlyZXQgPSByZWdtYXBfcmVhZChtYXAsIE1BWDE3MDQyX1JlcFNPQywgJmRhdGEpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJdmFsLT5pbnR2YWwgPSBkYXRhID4+IDg7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTEw6Ci0JCXJldCA9IHJlZ21hcF9yZWFkKG1hcCwgTUFYMTcwNDJfRnVsbENBUCwgJmRhdGEpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJdmFsLT5pbnR2YWwgPSBkYXRhICogMTAwMCAvIDI7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0NPVU5URVI6Ci0JCXJldCA9IHJlZ21hcF9yZWFkKG1hcCwgTUFYMTcwNDJfUUgsICZkYXRhKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCi0JCXZhbC0+aW50dmFsID0gZGF0YSAqIDEwMDAgLyAyOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVA6Ci0JCXJldCA9IG1heDE3MDQyX2dldF90ZW1wZXJhdHVyZShjaGlwLCAmdmFsLT5pbnR2YWwpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTEVSVF9NSU46Ci0JCXJldCA9IHJlZ21hcF9yZWFkKG1hcCwgTUFYMTcwNDJfVEFMUlRfVGgsICZkYXRhKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCQkvKiBMU0IgaXMgQWxlcnQgTWluaW11bS4gSW4gZGVjaS1jZW50aWdyYWRlICovCi0JCXZhbC0+aW50dmFsID0gKGRhdGEgJiAweGZmKSAqIDEwOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQUxFUlRfTUFYOgotCQlyZXQgPSByZWdtYXBfcmVhZChtYXAsIE1BWDE3MDQyX1RBTFJUX1RoLCAmZGF0YSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQkJLyogTVNCIGlzIEFsZXJ0IE1heGltdW0uIEluIGRlY2ktY2VudGlncmFkZSAqLwotCQl2YWwtPmludHZhbCA9IChkYXRhID4+IDgpICogMTA7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUF9NSU46Ci0JCXZhbC0+aW50dmFsID0gY2hpcC0+cGRhdGEtPnRlbXBfbWluOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfTUFYOgotCQl2YWwtPmludHZhbCA9IGNoaXAtPnBkYXRhLT50ZW1wX21heDsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEg6Ci0JCXJldCA9IG1heDE3MDQyX2dldF9iYXR0ZXJ5X2hlYWx0aChjaGlwLCAmdmFsLT5pbnR2YWwpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1c6Ci0JCWlmIChjaGlwLT5wZGF0YS0+ZW5hYmxlX2N1cnJlbnRfc2Vuc2UpIHsKLQkJCXJldCA9IHJlZ21hcF9yZWFkKG1hcCwgTUFYMTcwNDJfQ3VycmVudCwgJmRhdGEpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJcmV0dXJuIHJldDsKLQotCQkJdmFsLT5pbnR2YWwgPSBkYXRhOwotCQkJaWYgKHZhbC0+aW50dmFsICYgMHg4MDAwKSB7Ci0JCQkJLyogTmVnYXRpdmUgKi8KLQkJCQl2YWwtPmludHZhbCA9IH52YWwtPmludHZhbCAmIDB4N2ZmZjsKLQkJCQl2YWwtPmludHZhbCsrOwotCQkJCXZhbC0+aW50dmFsICo9IC0xOwotCQkJfQotCQkJdmFsLT5pbnR2YWwgKj0gMTU2MjUwMCAvIGNoaXAtPnBkYXRhLT5yX3NuczsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9BVkc6Ci0JCWlmIChjaGlwLT5wZGF0YS0+ZW5hYmxlX2N1cnJlbnRfc2Vuc2UpIHsKLQkJCXJldCA9IHJlZ21hcF9yZWFkKG1hcCwgTUFYMTcwNDJfQXZnQ3VycmVudCwgJmRhdGEpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJcmV0dXJuIHJldDsKLQotCQkJdmFsLT5pbnR2YWwgPSBkYXRhOwotCQkJaWYgKHZhbC0+aW50dmFsICYgMHg4MDAwKSB7Ci0JCQkJLyogTmVnYXRpdmUgKi8KLQkJCQl2YWwtPmludHZhbCA9IH52YWwtPmludHZhbCAmIDB4N2ZmZjsKLQkJCQl2YWwtPmludHZhbCsrOwotCQkJCXZhbC0+aW50dmFsICo9IC0xOwotCQkJfQotCQkJdmFsLT5pbnR2YWwgKj0gMTU2MjUwMCAvIGNoaXAtPnBkYXRhLT5yX3NuczsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtYXgxNzA0Ml9zZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAotCQkJICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKLQkJCSAgICBjb25zdCB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQotewotCXN0cnVjdCBtYXgxNzA0Ml9jaGlwICpjaGlwID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7Ci0Jc3RydWN0IHJlZ21hcCAqbWFwID0gY2hpcC0+cmVnbWFwOwotCWludCByZXQgPSAwOwotCXUzMiBkYXRhOwotCWludDhfdCB0ZW1wOwotCi0Jc3dpdGNoIChwc3ApIHsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQUxFUlRfTUlOOgotCQlyZXQgPSByZWdtYXBfcmVhZChtYXAsIE1BWDE3MDQyX1RBTFJUX1RoLCAmZGF0YSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQotCQkvKiBJbnB1dCBpbiBkZWNpLWNlbnRpZ3JhZGUsIGNvbnZlcnQgdG8gY2VudGlncmFkZSAqLwotCQl0ZW1wID0gdmFsLT5pbnR2YWwgLyAxMDsKLQkJLyogZm9yY2UgbWluIDwgbWF4ICovCi0JCWlmICh0ZW1wID49IChpbnQ4X3QpKGRhdGEgPj4gOCkpCi0JCQl0ZW1wID0gKGludDhfdCkoZGF0YSA+PiA4KSAtIDE7Ci0JCS8qIFdyaXRlIGJvdGggTUFYIGFuZCBNSU4gQUxFUlQgKi8KLQkJZGF0YSA9IChkYXRhICYgMHhmZjAwKSArIHRlbXA7Ci0JCXJldCA9IHJlZ21hcF93cml0ZShtYXAsIE1BWDE3MDQyX1RBTFJUX1RoLCBkYXRhKTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QX0FMRVJUX01BWDoKLQkJcmV0ID0gcmVnbWFwX3JlYWQobWFwLCBNQVgxNzA0Ml9UQUxSVF9UaCwgJmRhdGEpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJLyogSW5wdXQgaW4gRGVjaS1DZW50aWdyYWRlLCBjb252ZXJ0IHRvIGNlbnRpZ3JhZGUgKi8KLQkJdGVtcCA9IHZhbC0+aW50dmFsIC8gMTA7Ci0JCS8qIGZvcmNlIG1heCA+IG1pbiAqLwotCQlpZiAodGVtcCA8PSAoaW50OF90KShkYXRhICYgMHhmZikpCi0JCQl0ZW1wID0gKGludDhfdCkoZGF0YSAmIDB4ZmYpICsgMTsKLQkJLyogV3JpdGUgYm90aCBNQVggYW5kIE1JTiBBTEVSVCAqLwotCQlkYXRhID0gKGRhdGEgJiAweGZmKSArICh0ZW1wIDw8IDgpOwotCQlyZXQgPSByZWdtYXBfd3JpdGUobWFwLCBNQVgxNzA0Ml9UQUxSVF9UaCwgZGF0YSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtYXgxNzA0Ml9wcm9wZXJ0eV9pc193cml0ZWFibGUoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAotCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3ApCi17Ci0JaW50IHJldDsKLQotCXN3aXRjaCAocHNwKSB7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QX0FMRVJUX01JTjoKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQUxFUlRfTUFYOgotCQlyZXQgPSAxOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSAwOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4MTcwNDJfd3JpdGVfdmVyaWZ5X3JlZyhzdHJ1Y3QgcmVnbWFwICptYXAsIHU4IHJlZywgdTMyIHZhbHVlKQotewotCWludCByZXRyaWVzID0gODsKLQlpbnQgcmV0OwotCXUzMiByZWFkX3ZhbHVlOwotCi0JZG8gewotCQlyZXQgPSByZWdtYXBfd3JpdGUobWFwLCByZWcsIHZhbHVlKTsKLQkJcmVnbWFwX3JlYWQobWFwLCByZWcsICZyZWFkX3ZhbHVlKTsKLQkJaWYgKHJlYWRfdmFsdWUgIT0gdmFsdWUpIHsKLQkJCXJldCA9IC1FSU87Ci0JCQlyZXRyaWVzLS07Ci0JCX0KLQl9IHdoaWxlIChyZXRyaWVzICYmIHJlYWRfdmFsdWUgIT0gdmFsdWUpOwotCi0JaWYgKHJldCA8IDApCi0JCXByX2VycigiJXM6IGVyciAlZFxuIiwgX19mdW5jX18sIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbWF4MTcwNDJfb3ZlcnJpZGVfcG9yKHN0cnVjdCByZWdtYXAgKm1hcCwKLQkJCQkJIHU4IHJlZywgdTE2IHZhbHVlKQotewotCWlmICh2YWx1ZSkKLQkJcmVnbWFwX3dyaXRlKG1hcCwgcmVnLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtYXgxMDc0Ml91bmxvY2tfbW9kZWwoc3RydWN0IG1heDE3MDQyX2NoaXAgKmNoaXApCi17Ci0Jc3RydWN0IHJlZ21hcCAqbWFwID0gY2hpcC0+cmVnbWFwOwotCi0JcmVnbWFwX3dyaXRlKG1hcCwgTUFYMTcwNDJfTUxPQ0tSZWcxLCBNT0RFTF9VTkxPQ0sxKTsKLQlyZWdtYXBfd3JpdGUobWFwLCBNQVgxNzA0Ml9NTE9DS1JlZzIsIE1PREVMX1VOTE9DSzIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbWF4MTA3NDJfbG9ja19tb2RlbChzdHJ1Y3QgbWF4MTcwNDJfY2hpcCAqY2hpcCkKLXsKLQlzdHJ1Y3QgcmVnbWFwICptYXAgPSBjaGlwLT5yZWdtYXA7Ci0KLQlyZWdtYXBfd3JpdGUobWFwLCBNQVgxNzA0Ml9NTE9DS1JlZzEsIE1PREVMX0xPQ0sxKTsKLQlyZWdtYXBfd3JpdGUobWFwLCBNQVgxNzA0Ml9NTE9DS1JlZzIsIE1PREVMX0xPQ0syKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG1heDE3MDQyX3dyaXRlX21vZGVsX2RhdGEoc3RydWN0IG1heDE3MDQyX2NoaXAgKmNoaXAsCi0JCQkJCXU4IGFkZHIsIGludCBzaXplKQotewotCXN0cnVjdCByZWdtYXAgKm1hcCA9IGNoaXAtPnJlZ21hcDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCXJlZ21hcF93cml0ZShtYXAsIGFkZHIgKyBpLAotCQkJY2hpcC0+cGRhdGEtPmNvbmZpZ19kYXRhLT5jZWxsX2NoYXJfdGJsW2ldKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG1heDE3MDQyX3JlYWRfbW9kZWxfZGF0YShzdHJ1Y3QgbWF4MTcwNDJfY2hpcCAqY2hpcCwKLQkJCQkJdTggYWRkciwgdTMyICpkYXRhLCBpbnQgc2l6ZSkKLXsKLQlzdHJ1Y3QgcmVnbWFwICptYXAgPSBjaGlwLT5yZWdtYXA7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQlyZWdtYXBfcmVhZChtYXAsIGFkZHIgKyBpLCAmZGF0YVtpXSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG1heDE3MDQyX21vZGVsX2RhdGFfY29tcGFyZShzdHJ1Y3QgbWF4MTcwNDJfY2hpcCAqY2hpcCwKLQkJCQkJdTE2ICpkYXRhMSwgdTE2ICpkYXRhMiwgaW50IHNpemUpCi17Ci0JaW50IGk7Ci0KLQlpZiAobWVtY21wKGRhdGExLCBkYXRhMiwgc2l6ZSkpIHsKLQkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsICIlcyBjb21wYXJlIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotCQkJZGV2X2luZm8oJmNoaXAtPmNsaWVudC0+ZGV2LCAiMHgleCwgMHgleCIsCi0JCQkJZGF0YTFbaV0sIGRhdGEyW2ldKTsKLQkJZGV2X2luZm8oJmNoaXAtPmNsaWVudC0+ZGV2LCAiXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1heDE3MDQyX2luaXRfbW9kZWwoc3RydWN0IG1heDE3MDQyX2NoaXAgKmNoaXApCi17Ci0JaW50IHJldDsKLQlpbnQgdGFibGVfc2l6ZSA9IEFSUkFZX1NJWkUoY2hpcC0+cGRhdGEtPmNvbmZpZ19kYXRhLT5jZWxsX2NoYXJfdGJsKTsKLQl1MzIgKnRlbXBfZGF0YTsKLQotCXRlbXBfZGF0YSA9IGtjYWxsb2ModGFibGVfc2l6ZSwgc2l6ZW9mKCp0ZW1wX2RhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXRlbXBfZGF0YSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltYXgxMDc0Ml91bmxvY2tfbW9kZWwoY2hpcCk7Ci0JbWF4MTcwNDJfd3JpdGVfbW9kZWxfZGF0YShjaGlwLCBNQVgxNzA0Ml9NT0RFTENoclRibCwKLQkJCQl0YWJsZV9zaXplKTsKLQltYXgxNzA0Ml9yZWFkX21vZGVsX2RhdGEoY2hpcCwgTUFYMTcwNDJfTU9ERUxDaHJUYmwsIHRlbXBfZGF0YSwKLQkJCQl0YWJsZV9zaXplKTsKLQotCXJldCA9IG1heDE3MDQyX21vZGVsX2RhdGFfY29tcGFyZSgKLQkJY2hpcCwKLQkJY2hpcC0+cGRhdGEtPmNvbmZpZ19kYXRhLT5jZWxsX2NoYXJfdGJsLAotCQkodTE2ICopdGVtcF9kYXRhLAotCQl0YWJsZV9zaXplKTsKLQotCW1heDEwNzQyX2xvY2tfbW9kZWwoY2hpcCk7Ci0Ja2ZyZWUodGVtcF9kYXRhKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4MTcwNDJfdmVyaWZ5X21vZGVsX2xvY2soc3RydWN0IG1heDE3MDQyX2NoaXAgKmNoaXApCi17Ci0JaW50IGk7Ci0JaW50IHRhYmxlX3NpemUgPSBBUlJBWV9TSVpFKGNoaXAtPnBkYXRhLT5jb25maWdfZGF0YS0+Y2VsbF9jaGFyX3RibCk7Ci0JdTMyICp0ZW1wX2RhdGE7Ci0JaW50IHJldCA9IDA7Ci0KLQl0ZW1wX2RhdGEgPSBrY2FsbG9jKHRhYmxlX3NpemUsIHNpemVvZigqdGVtcF9kYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0ZW1wX2RhdGEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbWF4MTcwNDJfcmVhZF9tb2RlbF9kYXRhKGNoaXAsIE1BWDE3MDQyX01PREVMQ2hyVGJsLCB0ZW1wX2RhdGEsCi0JCQkJdGFibGVfc2l6ZSk7Ci0JZm9yIChpID0gMDsgaSA8IHRhYmxlX3NpemU7IGkrKykKLQkJaWYgKHRlbXBfZGF0YVtpXSkKLQkJCXJldCA9IC1FSU5WQUw7Ci0KLQlrZnJlZSh0ZW1wX2RhdGEpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG1heDE3MDQyX3dyaXRlX2NvbmZpZ19yZWdzKHN0cnVjdCBtYXgxNzA0Ml9jaGlwICpjaGlwKQotewotCXN0cnVjdCBtYXgxNzA0Ml9jb25maWdfZGF0YSAqY29uZmlnID0gY2hpcC0+cGRhdGEtPmNvbmZpZ19kYXRhOwotCXN0cnVjdCByZWdtYXAgKm1hcCA9IGNoaXAtPnJlZ21hcDsKLQotCXJlZ21hcF93cml0ZShtYXAsIE1BWDE3MDQyX0NPTkZJRywgY29uZmlnLT5jb25maWcpOwotCXJlZ21hcF93cml0ZShtYXAsIE1BWDE3MDQyX0xlYXJuQ0ZHLCBjb25maWctPmxlYXJuX2NmZyk7Ci0JcmVnbWFwX3dyaXRlKG1hcCwgTUFYMTcwNDJfRmlsdGVyQ0ZHLAotCQkJY29uZmlnLT5maWx0ZXJfY2ZnKTsKLQlyZWdtYXBfd3JpdGUobWFwLCBNQVgxNzA0Ml9SZWxheENGRywgY29uZmlnLT5yZWxheF9jZmcpOwotCWlmIChjaGlwLT5jaGlwX3R5cGUgPT0gTUFYSU1fREVWSUNFX1RZUEVfTUFYMTcwNDcgfHwKLQkJCWNoaXAtPmNoaXBfdHlwZSA9PSBNQVhJTV9ERVZJQ0VfVFlQRV9NQVgxNzA1MCkKLQkJcmVnbWFwX3dyaXRlKG1hcCwgTUFYMTcwNDdfRnVsbFNPQ1RociwKLQkJCQkJCWNvbmZpZy0+ZnVsbF9zb2NfdGhyZXNoKTsKLX0KLQotc3RhdGljIHZvaWQgIG1heDE3MDQyX3dyaXRlX2N1c3RvbV9yZWdzKHN0cnVjdCBtYXgxNzA0Ml9jaGlwICpjaGlwKQotewotCXN0cnVjdCBtYXgxNzA0Ml9jb25maWdfZGF0YSAqY29uZmlnID0gY2hpcC0+cGRhdGEtPmNvbmZpZ19kYXRhOwotCXN0cnVjdCByZWdtYXAgKm1hcCA9IGNoaXAtPnJlZ21hcDsKLQotCW1heDE3MDQyX3dyaXRlX3ZlcmlmeV9yZWcobWFwLCBNQVgxNzA0Ml9SQ09NUDAsIGNvbmZpZy0+cmNvbXAwKTsKLQltYXgxNzA0Ml93cml0ZV92ZXJpZnlfcmVnKG1hcCwgTUFYMTcwNDJfVGVtcENvLAljb25maWctPnRjb21wYzApOwotCW1heDE3MDQyX3dyaXRlX3ZlcmlmeV9yZWcobWFwLCBNQVgxNzA0Ml9JQ0hHVGVybSwgY29uZmlnLT5pY2hndF90ZXJtKTsKLQlpZiAoY2hpcC0+Y2hpcF90eXBlID09IE1BWElNX0RFVklDRV9UWVBFX01BWDE3MDQyKSB7Ci0JCXJlZ21hcF93cml0ZShtYXAsIE1BWDE3MDQyX0VtcHR5VGVtcENvLAljb25maWctPmVtcHR5X3RlbXBjbyk7Ci0JCW1heDE3MDQyX3dyaXRlX3ZlcmlmeV9yZWcobWFwLCBNQVgxNzA0Ml9LX2VtcHR5MCwKLQkJCQkJY29uZmlnLT5rZW1wdHkwKTsKLQl9IGVsc2UgewotCQltYXgxNzA0Ml93cml0ZV92ZXJpZnlfcmVnKG1hcCwgTUFYMTcwNDdfUVJUYmwwMCwKLQkJCQkJCWNvbmZpZy0+cXJ0YmwwMCk7Ci0JCW1heDE3MDQyX3dyaXRlX3ZlcmlmeV9yZWcobWFwLCBNQVgxNzA0N19RUlRibDEwLAotCQkJCQkJY29uZmlnLT5xcnRibDEwKTsKLQkJbWF4MTcwNDJfd3JpdGVfdmVyaWZ5X3JlZyhtYXAsIE1BWDE3MDQ3X1FSVGJsMjAsCi0JCQkJCQljb25maWctPnFydGJsMjApOwotCQltYXgxNzA0Ml93cml0ZV92ZXJpZnlfcmVnKG1hcCwgTUFYMTcwNDdfUVJUYmwzMCwKLQkJCQkJCWNvbmZpZy0+cXJ0YmwzMCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBtYXgxNzA0Ml91cGRhdGVfY2FwYWNpdHlfcmVncyhzdHJ1Y3QgbWF4MTcwNDJfY2hpcCAqY2hpcCkKLXsKLQlzdHJ1Y3QgbWF4MTcwNDJfY29uZmlnX2RhdGEgKmNvbmZpZyA9IGNoaXAtPnBkYXRhLT5jb25maWdfZGF0YTsKLQlzdHJ1Y3QgcmVnbWFwICptYXAgPSBjaGlwLT5yZWdtYXA7Ci0KLQltYXgxNzA0Ml93cml0ZV92ZXJpZnlfcmVnKG1hcCwgTUFYMTcwNDJfRnVsbENBUCwKLQkJCQljb25maWctPmZ1bGxjYXApOwotCXJlZ21hcF93cml0ZShtYXAsIE1BWDE3MDQyX0Rlc2lnbkNhcCwgY29uZmlnLT5kZXNpZ25fY2FwKTsKLQltYXgxNzA0Ml93cml0ZV92ZXJpZnlfcmVnKG1hcCwgTUFYMTcwNDJfRnVsbENBUE5vbSwKLQkJCQljb25maWctPmZ1bGxjYXBub20pOwotfQotCi1zdGF0aWMgdm9pZCBtYXgxNzA0Ml9yZXNldF92ZnNvYzBfcmVnKHN0cnVjdCBtYXgxNzA0Ml9jaGlwICpjaGlwKQotewotCXVuc2lnbmVkIGludCB2ZlNvYzsKLQlzdHJ1Y3QgcmVnbWFwICptYXAgPSBjaGlwLT5yZWdtYXA7Ci0KLQlyZWdtYXBfcmVhZChtYXAsIE1BWDE3MDQyX1ZGU09DLCAmdmZTb2MpOwotCXJlZ21hcF93cml0ZShtYXAsIE1BWDE3MDQyX1ZGU09DMEVuYWJsZSwgVkZTT0MwX1VOTE9DSyk7Ci0JbWF4MTcwNDJfd3JpdGVfdmVyaWZ5X3JlZyhtYXAsIE1BWDE3MDQyX1ZGU09DMCwgdmZTb2MpOwotCXJlZ21hcF93cml0ZShtYXAsIE1BWDE3MDQyX1ZGU09DMEVuYWJsZSwgVkZTT0MwX0xPQ0spOwotfQotCi1zdGF0aWMgdm9pZCBtYXgxNzA0Ml9sb2FkX25ld19jYXBhY2l0eV9wYXJhbXMoc3RydWN0IG1heDE3MDQyX2NoaXAgKmNoaXApCi17Ci0JdTMyIGZ1bGxfY2FwMCwgcmVwX2NhcCwgZHFfYWNjLCB2ZlNvYzsKLQl1MzIgcmVtX2NhcDsKLQotCXN0cnVjdCBtYXgxNzA0Ml9jb25maWdfZGF0YSAqY29uZmlnID0gY2hpcC0+cGRhdGEtPmNvbmZpZ19kYXRhOwotCXN0cnVjdCByZWdtYXAgKm1hcCA9IGNoaXAtPnJlZ21hcDsKLQotCXJlZ21hcF9yZWFkKG1hcCwgTUFYMTcwNDJfRnVsbENBUDAsICZmdWxsX2NhcDApOwotCXJlZ21hcF9yZWFkKG1hcCwgTUFYMTcwNDJfVkZTT0MsICZ2ZlNvYyk7Ci0KLQkvKiBmZ192ZlNvYyBuZWVkcyB0byBzaGlmdGVkIGJ5IDggYml0cyB0byBnZXQgdGhlCi0JICogcGVyYyBpbiAxJSBhY2N1cmFjeSwgdG8gZ2V0IHRoZSByaWdodCByZW1fY2FwIG11bHRpcGx5Ci0JICogZnVsbF9jYXAwLCBmZ192ZlNvYyBhbmQgZGV2aWRlIGJ5IDEwMAotCSAqLwotCXJlbV9jYXAgPSAoKHZmU29jID4+IDgpICogZnVsbF9jYXAwKSAvIDEwMDsKLQltYXgxNzA0Ml93cml0ZV92ZXJpZnlfcmVnKG1hcCwgTUFYMTcwNDJfUmVtQ2FwLCByZW1fY2FwKTsKLQotCXJlcF9jYXAgPSByZW1fY2FwOwotCW1heDE3MDQyX3dyaXRlX3ZlcmlmeV9yZWcobWFwLCBNQVgxNzA0Ml9SZXBDYXAsIHJlcF9jYXApOwotCi0JLyogV3JpdGUgZFFfYWNjIHRvIDIwMCUgb2YgQ2FwYWNpdHkgYW5kIGRQX2FjYyB0byAyMDAlICovCi0JZHFfYWNjID0gY29uZmlnLT5mdWxsY2FwIC8gZFFfQUNDX0RJVjsKLQltYXgxNzA0Ml93cml0ZV92ZXJpZnlfcmVnKG1hcCwgTUFYMTcwNDJfZFFhY2MsIGRxX2FjYyk7Ci0JbWF4MTcwNDJfd3JpdGVfdmVyaWZ5X3JlZyhtYXAsIE1BWDE3MDQyX2RQYWNjLCBkUF9BQ0NfMjAwKTsKLQotCW1heDE3MDQyX3dyaXRlX3ZlcmlmeV9yZWcobWFwLCBNQVgxNzA0Ml9GdWxsQ0FQLAotCQkJY29uZmlnLT5mdWxsY2FwKTsKLQlyZWdtYXBfd3JpdGUobWFwLCBNQVgxNzA0Ml9EZXNpZ25DYXAsCi0JCQljb25maWctPmRlc2lnbl9jYXApOwotCW1heDE3MDQyX3dyaXRlX3ZlcmlmeV9yZWcobWFwLCBNQVgxNzA0Ml9GdWxsQ0FQTm9tLAotCQkJY29uZmlnLT5mdWxsY2Fwbm9tKTsKLQkvKiBVcGRhdGUgU09DIHJlZ2lzdGVyIHdpdGggbmV3IFNPQyAqLwotCXJlZ21hcF93cml0ZShtYXAsIE1BWDE3MDQyX1JlcFNPQywgdmZTb2MpOwotfQotCi0vKgotICogQmxvY2sgd3JpdGUgYWxsIHRoZSBvdmVycmlkZSB2YWx1ZXMgY29taW5nIGZyb20gcGxhdGZvcm0gZGF0YS4KLSAqIFRoaXMgZnVuY3Rpb24gTVVTVCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBQT1IgaW5pdGlhbGl6YXRpb24gcHJvY2VlZHVyZQotICogc3BlY2lmaWVkIGJ5IG1heGltLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgbWF4MTcwNDJfb3ZlcnJpZGVfcG9yX3ZhbHVlcyhzdHJ1Y3QgbWF4MTcwNDJfY2hpcCAqY2hpcCkKLXsKLQlzdHJ1Y3QgcmVnbWFwICptYXAgPSBjaGlwLT5yZWdtYXA7Ci0Jc3RydWN0IG1heDE3MDQyX2NvbmZpZ19kYXRhICpjb25maWcgPSBjaGlwLT5wZGF0YS0+Y29uZmlnX2RhdGE7Ci0KLQltYXgxNzA0Ml9vdmVycmlkZV9wb3IobWFwLCBNQVgxNzA0Ml9UR0FJTiwgY29uZmlnLT50Z2Fpbik7Ci0JbWF4MTcwNDJfb3ZlcnJpZGVfcG9yKG1hcCwgTUF4MTcwNDJfVE9GRiwgY29uZmlnLT50b2ZmKTsKLQltYXgxNzA0Ml9vdmVycmlkZV9wb3IobWFwLCBNQVgxNzA0Ml9DR0FJTiwgY29uZmlnLT5jZ2Fpbik7Ci0JbWF4MTcwNDJfb3ZlcnJpZGVfcG9yKG1hcCwgTUFYMTcwNDJfQ09GRiwgY29uZmlnLT5jb2ZmKTsKLQotCW1heDE3MDQyX292ZXJyaWRlX3BvcihtYXAsIE1BWDE3MDQyX1ZBTFJUX1RoLCBjb25maWctPnZhbHJ0X3RocmVzaCk7Ci0JbWF4MTcwNDJfb3ZlcnJpZGVfcG9yKG1hcCwgTUFYMTcwNDJfVEFMUlRfVGgsIGNvbmZpZy0+dGFscnRfdGhyZXNoKTsKLQltYXgxNzA0Ml9vdmVycmlkZV9wb3IobWFwLCBNQVgxNzA0Ml9TQUxSVF9UaCwKLQkJCQkJCWNvbmZpZy0+c29jX2FscnRfdGhyZXNoKTsKLQltYXgxNzA0Ml9vdmVycmlkZV9wb3IobWFwLCBNQVgxNzA0Ml9DT05GSUcsIGNvbmZpZy0+Y29uZmlnKTsKLQltYXgxNzA0Ml9vdmVycmlkZV9wb3IobWFwLCBNQVgxNzA0Ml9TSEROVElNRVIsIGNvbmZpZy0+c2hkbnRpbWVyKTsKLQotCW1heDE3MDQyX292ZXJyaWRlX3BvcihtYXAsIE1BWDE3MDQyX0Rlc2lnbkNhcCwgY29uZmlnLT5kZXNpZ25fY2FwKTsKLQltYXgxNzA0Ml9vdmVycmlkZV9wb3IobWFwLCBNQVgxNzA0Ml9JQ0hHVGVybSwgY29uZmlnLT5pY2hndF90ZXJtKTsKLQotCW1heDE3MDQyX292ZXJyaWRlX3BvcihtYXAsIE1BWDE3MDQyX0F0UmF0ZSwgY29uZmlnLT5hdF9yYXRlKTsKLQltYXgxNzA0Ml9vdmVycmlkZV9wb3IobWFwLCBNQVgxNzA0Ml9MZWFybkNGRywgY29uZmlnLT5sZWFybl9jZmcpOwotCW1heDE3MDQyX292ZXJyaWRlX3BvcihtYXAsIE1BWDE3MDQyX0ZpbHRlckNGRywgY29uZmlnLT5maWx0ZXJfY2ZnKTsKLQltYXgxNzA0Ml9vdmVycmlkZV9wb3IobWFwLCBNQVgxNzA0Ml9SZWxheENGRywgY29uZmlnLT5yZWxheF9jZmcpOwotCW1heDE3MDQyX292ZXJyaWRlX3BvcihtYXAsIE1BWDE3MDQyX01pc2NDRkcsIGNvbmZpZy0+bWlzY19jZmcpOwotCW1heDE3MDQyX292ZXJyaWRlX3BvcihtYXAsIE1BWDE3MDQyX01hc2tTT0MsIGNvbmZpZy0+bWFza3NvYyk7Ci0KLQltYXgxNzA0Ml9vdmVycmlkZV9wb3IobWFwLCBNQVgxNzA0Ml9GdWxsQ0FQLCBjb25maWctPmZ1bGxjYXApOwotCW1heDE3MDQyX292ZXJyaWRlX3BvcihtYXAsIE1BWDE3MDQyX0Z1bGxDQVBOb20sIGNvbmZpZy0+ZnVsbGNhcG5vbSk7Ci0JaWYgKGNoaXAtPmNoaXBfdHlwZSA9PSBNQVhJTV9ERVZJQ0VfVFlQRV9NQVgxNzA0MikKLQkJbWF4MTcwNDJfb3ZlcnJpZGVfcG9yKG1hcCwgTUFYMTcwNDJfU09DX2VtcHR5LAotCQkJCQkJY29uZmlnLT5zb2NlbXB0eSk7Ci0JbWF4MTcwNDJfb3ZlcnJpZGVfcG9yKG1hcCwgTUFYMTcwNDJfTEF2Z19lbXB0eSwgY29uZmlnLT5sYXZnX2VtcHR5KTsKLQltYXgxNzA0Ml9vdmVycmlkZV9wb3IobWFwLCBNQVgxNzA0Ml9kUWFjYywgY29uZmlnLT5kcWFjYyk7Ci0JbWF4MTcwNDJfb3ZlcnJpZGVfcG9yKG1hcCwgTUFYMTcwNDJfZFBhY2MsIGNvbmZpZy0+ZHBhY2MpOwotCi0JaWYgKGNoaXAtPmNoaXBfdHlwZSA9PSBNQVhJTV9ERVZJQ0VfVFlQRV9NQVgxNzA0MikKLQkJbWF4MTcwNDJfb3ZlcnJpZGVfcG9yKG1hcCwgTUFYMTcwNDJfVl9lbXB0eSwgY29uZmlnLT52ZW1wdHkpOwotCWVsc2UKLQkJbWF4MTcwNDJfb3ZlcnJpZGVfcG9yKG1hcCwgTUFYMTcwNDdfVl9lbXB0eSwgY29uZmlnLT52ZW1wdHkpOwotCW1heDE3MDQyX292ZXJyaWRlX3BvcihtYXAsIE1BWDE3MDQyX1RlbXBOb20sIGNvbmZpZy0+dGVtcF9ub20pOwotCW1heDE3MDQyX292ZXJyaWRlX3BvcihtYXAsIE1BWDE3MDQyX1RlbXBMaW0sIGNvbmZpZy0+dGVtcF9saW0pOwotCW1heDE3MDQyX292ZXJyaWRlX3BvcihtYXAsIE1BWDE3MDQyX0ZDVEMsIGNvbmZpZy0+ZmN0Yyk7Ci0JbWF4MTcwNDJfb3ZlcnJpZGVfcG9yKG1hcCwgTUFYMTcwNDJfUkNPTVAwLCBjb25maWctPnJjb21wMCk7Ci0JbWF4MTcwNDJfb3ZlcnJpZGVfcG9yKG1hcCwgTUFYMTcwNDJfVGVtcENvLCBjb25maWctPnRjb21wYzApOwotCWlmIChjaGlwLT5jaGlwX3R5cGUpIHsKLQkJbWF4MTcwNDJfb3ZlcnJpZGVfcG9yKG1hcCwgTUFYMTcwNDJfRW1wdHlUZW1wQ28sCi0JCQkJCQljb25maWctPmVtcHR5X3RlbXBjbyk7Ci0JCW1heDE3MDQyX292ZXJyaWRlX3BvcihtYXAsIE1BWDE3MDQyX0tfZW1wdHkwLAotCQkJCQkJY29uZmlnLT5rZW1wdHkwKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgbWF4MTcwNDJfaW5pdF9jaGlwKHN0cnVjdCBtYXgxNzA0Ml9jaGlwICpjaGlwKQotewotCXN0cnVjdCByZWdtYXAgKm1hcCA9IGNoaXAtPnJlZ21hcDsKLQlpbnQgcmV0OwotCi0JbWF4MTcwNDJfb3ZlcnJpZGVfcG9yX3ZhbHVlcyhjaGlwKTsKLQkvKiBBZnRlciBQb3dlciB1cCwgdGhlIE1BWDE3MDQyIHJlcXVpcmVzIDUwMG1TIGluIG9yZGVyCi0JICogdG8gcGVyZm9ybSBzaWduYWwgZGVib3VuY2luZyBhbmQgaW5pdGlhbCBTT0MgcmVwb3J0aW5nCi0JICovCi0JbXNsZWVwKDUwMCk7Ci0KLQkvKiBJbml0aWFsaXplIGNvbmZpZ2FyYXRpb24gKi8KLQltYXgxNzA0Ml93cml0ZV9jb25maWdfcmVncyhjaGlwKTsKLQotCS8qIHdyaXRlIGNlbGwgY2hhcmFjdGVyaXphdGlvbiBkYXRhICovCi0JcmV0ID0gbWF4MTcwNDJfaW5pdF9tb2RlbChjaGlwKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmNoaXAtPmNsaWVudC0+ZGV2LCAiJXMgaW5pdCBmYWlsZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCXJldCA9IG1heDE3MDQyX3ZlcmlmeV9tb2RlbF9sb2NrKGNoaXApOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsICIlcyBsb2NrIHZlcmlmeSBmYWlsZWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQkvKiB3cml0ZSBjdXN0b20gcGFyYW1ldGVycyAqLwotCW1heDE3MDQyX3dyaXRlX2N1c3RvbV9yZWdzKGNoaXApOwotCi0JLyogdXBkYXRlIGNhcGFjaXR5IHBhcmFtcyAqLwotCW1heDE3MDQyX3VwZGF0ZV9jYXBhY2l0eV9yZWdzKGNoaXApOwotCi0JLyogZGVsYXkgbXVzdCBiZSBhdGxlYXN0IDM1MG1TIHRvIGFsbG93IFZGU09DCi0JICogdG8gYmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBuZXcgY29uZmlndXJhdGlvbgotCSAqLwotCW1zbGVlcCgzNTApOwotCi0JLyogcmVzZXQgdmZzb2MwIHJlZyAqLwotCW1heDE3MDQyX3Jlc2V0X3Zmc29jMF9yZWcoY2hpcCk7Ci0KLQkvKiBsb2FkIG5ldyBjYXBhY2l0eSBwYXJhbXMgKi8KLQltYXgxNzA0Ml9sb2FkX25ld19jYXBhY2l0eV9wYXJhbXMoY2hpcCk7Ci0KLQkvKiBJbml0IGNvbXBsZXRlLCBDbGVhciB0aGUgUE9SIGJpdCAqLwotCXJlZ21hcF91cGRhdGVfYml0cyhtYXAsIE1BWDE3MDQyX1NUQVRVUywgU1RBVFVTX1BPUl9CSVQsIDB4MCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG1heDE3MDQyX3NldF9zb2NfdGhyZXNob2xkKHN0cnVjdCBtYXgxNzA0Ml9jaGlwICpjaGlwLCB1MTYgb2ZmKQotewotCXN0cnVjdCByZWdtYXAgKm1hcCA9IGNoaXAtPnJlZ21hcDsKLQl1MzIgc29jLCBzb2NfdHI7Ci0KLQkvKiBwcm9ncmFtIGludGVycnVwdCB0aGVzaG9sZHMgc3VjaCB0aGF0IHdlIHNob3VsZAotCSAqIGdldCBpbnRlcnJ1cHQgZm9yIGV2ZXJ5ICdvZmYnIHBlcmMgY2hhbmdlIGluIHRoZSBzb2MKLQkgKi8KLQlyZWdtYXBfcmVhZChtYXAsIE1BWDE3MDQyX1JlcFNPQywgJnNvYyk7Ci0Jc29jID4+PSA4OwotCXNvY190ciA9IChzb2MgKyBvZmYpIDw8IDg7Ci0Jc29jX3RyIHw9IChzb2MgLSBvZmYpOwotCXJlZ21hcF93cml0ZShtYXAsIE1BWDE3MDQyX1NBTFJUX1RoLCBzb2NfdHIpOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgbWF4MTcwNDJfdGhyZWFkX2hhbmRsZXIoaW50IGlkLCB2b2lkICpkZXYpCi17Ci0Jc3RydWN0IG1heDE3MDQyX2NoaXAgKmNoaXAgPSBkZXY7Ci0JdTMyIHZhbDsKLQotCXJlZ21hcF9yZWFkKGNoaXAtPnJlZ21hcCwgTUFYMTcwNDJfU1RBVFVTLCAmdmFsKTsKLQlpZiAoKHZhbCAmIFNUQVRVU19JTlRSX1NPQ01JTl9CSVQpIHx8Ci0JCSh2YWwgJiBTVEFUVVNfSU5UUl9TT0NNQVhfQklUKSkgewotCQlkZXZfaW5mbygmY2hpcC0+Y2xpZW50LT5kZXYsICJTT0MgdGhyZXNob2xkIElOVFJcbiIpOwotCQltYXgxNzA0Ml9zZXRfc29jX3RocmVzaG9sZChjaGlwLCAxKTsKLQl9Ci0KLQlwb3dlcl9zdXBwbHlfY2hhbmdlZChjaGlwLT5iYXR0ZXJ5KTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG1heDE3MDQyX2luaXRfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgbWF4MTcwNDJfY2hpcCAqY2hpcCA9IGNvbnRhaW5lcl9vZih3b3JrLAotCQkJCXN0cnVjdCBtYXgxNzA0Ml9jaGlwLCB3b3JrKTsKLQlpbnQgcmV0OwotCi0JLyogSW5pdGlhbGl6ZSByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIHZhbHVlcyBmcm9tIHRoZSBwbGF0Zm9ybSBkYXRhICovCi0JaWYgKGNoaXAtPnBkYXRhLT5lbmFibGVfcG9yX2luaXQgJiYgY2hpcC0+cGRhdGEtPmNvbmZpZ19kYXRhKSB7Ci0JCXJldCA9IG1heDE3MDQyX2luaXRfY2hpcChjaGlwKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybjsKLQl9Ci0KLQljaGlwLT5pbml0X2NvbXBsZXRlID0gMTsKLX0KLQotI2lmZGVmIENPTkZJR19PRgotc3RhdGljIHN0cnVjdCBtYXgxNzA0Ml9wbGF0Zm9ybV9kYXRhICoKLW1heDE3MDQyX2dldF9wZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKLQl1MzIgcHJvcDsKLQlzdHJ1Y3QgbWF4MTcwNDJfcGxhdGZvcm1fZGF0YSAqcGRhdGE7Ci0KLQlpZiAoIW5wKQotCQlyZXR1cm4gZGV2LT5wbGF0Zm9ybV9kYXRhOwotCi0JcGRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwZGF0YSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKgotCSAqIFJlcXVpcmUgY3VycmVudCBzZW5zZSByZXNpc3RvciB2YWx1ZSB0byBiZSBzcGVjaWZpZWQgZm9yCi0JICogY3VycmVudC1zZW5zZSBmdW5jdGlvbmFsaXR5IHRvIGJlIGVuYWJsZWQgYXQgYWxsLgotCSAqLwotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgIm1heGltLHJzbnMtbWljcm9vaG0iLCAmcHJvcCkgPT0gMCkgewotCQlwZGF0YS0+cl9zbnMgPSBwcm9wOwotCQlwZGF0YS0+ZW5hYmxlX2N1cnJlbnRfc2Vuc2UgPSB0cnVlOwotCX0KLQotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3MzMihucCwgIm1heGltLGNvbGQtdGVtcCIsICZwZGF0YS0+dGVtcF9taW4pKQotCQlwZGF0YS0+dGVtcF9taW4gPSBJTlRfTUlOOwotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3MzMihucCwgIm1heGltLG92ZXItaGVhdC10ZW1wIiwgJnBkYXRhLT50ZW1wX21heCkpCi0JCXBkYXRhLT50ZW1wX21heCA9IElOVF9NQVg7Ci0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfczMyKG5wLCAibWF4aW0sZGVhZC12b2x0IiwgJnBkYXRhLT52bWluKSkKLQkJcGRhdGEtPnZtaW4gPSBJTlRfTUlOOwotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3MzMihucCwgIm1heGltLG92ZXItdm9sdCIsICZwZGF0YS0+dm1heCkpCi0JCXBkYXRhLT52bWF4ID0gSU5UX01BWDsKLQotCXJldHVybiBwZGF0YTsKLX0KLSNlbHNlCi1zdGF0aWMgc3RydWN0IG1heDE3MDQyX3BsYXRmb3JtX2RhdGEgKgotbWF4MTcwNDJfZ2V0X3BkYXRhKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gZGV2LT5wbGF0Zm9ybV9kYXRhOwotfQotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBtYXgxNzA0Ml9yZWdtYXBfY29uZmlnID0gewotCS5yZWdfYml0cyA9IDgsCi0JLnZhbF9iaXRzID0gMTYsCi0JLnZhbF9mb3JtYXRfZW5kaWFuID0gUkVHTUFQX0VORElBTl9OQVRJVkUsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIG1heDE3MDQyX3BzeV9kZXNjID0gewotCS5uYW1lCQk9ICJtYXgxNzB4eF9iYXR0ZXJ5IiwKLQkudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZLAotCS5nZXRfcHJvcGVydHkJPSBtYXgxNzA0Ml9nZXRfcHJvcGVydHksCi0JLnNldF9wcm9wZXJ0eQk9IG1heDE3MDQyX3NldF9wcm9wZXJ0eSwKLQkucHJvcGVydHlfaXNfd3JpdGVhYmxlCT0gbWF4MTcwNDJfcHJvcGVydHlfaXNfd3JpdGVhYmxlLAotCS5wcm9wZXJ0aWVzCT0gbWF4MTcwNDJfYmF0dGVyeV9wcm9wcywKLQkubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKG1heDE3MDQyX2JhdHRlcnlfcHJvcHMpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBtYXgxNzA0Ml9ub19jdXJyZW50X3NlbnNlX3BzeV9kZXNjID0gewotCS5uYW1lCQk9ICJtYXgxNzB4eF9iYXR0ZXJ5IiwKLQkudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZLAotCS5nZXRfcHJvcGVydHkJPSBtYXgxNzA0Ml9nZXRfcHJvcGVydHksCi0JLnNldF9wcm9wZXJ0eQk9IG1heDE3MDQyX3NldF9wcm9wZXJ0eSwKLQkucHJvcGVydHlfaXNfd3JpdGVhYmxlCT0gbWF4MTcwNDJfcHJvcGVydHlfaXNfd3JpdGVhYmxlLAotCS5wcm9wZXJ0aWVzCT0gbWF4MTcwNDJfYmF0dGVyeV9wcm9wcywKLQkubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKG1heDE3MDQyX2JhdHRlcnlfcHJvcHMpIC0gMiwKLX07Ci0KLXN0YXRpYyBpbnQgbWF4MTcwNDJfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSB0b19pMmNfYWRhcHRlcihjbGllbnQtPmRldi5wYXJlbnQpOwotCWNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyAqbWF4MTcwNDJfZGVzYyA9ICZtYXgxNzA0Ml9wc3lfZGVzYzsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307Ci0Jc3RydWN0IG1heDE3MDQyX2NoaXAgKmNoaXA7Ci0JaW50IHJldDsKLQlpbnQgaTsKLQl1MzIgdmFsOwotCi0JaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEpKQotCQlyZXR1cm4gLUVJTzsKLQotCWNoaXAgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNoaXApCi0JCXJldHVybiAtRU5PTUVNOwotCi0JY2hpcC0+Y2xpZW50ID0gY2xpZW50OwotCWNoaXAtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGNsaWVudCwgJm1heDE3MDQyX3JlZ21hcF9jb25maWcpOwotCWlmIChJU19FUlIoY2hpcC0+cmVnbWFwKSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byBpbml0aWFsaXplIHJlZ21hcFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWNoaXAtPnBkYXRhID0gbWF4MTcwNDJfZ2V0X3BkYXRhKCZjbGllbnQtPmRldik7Ci0JaWYgKCFjaGlwLT5wZGF0YSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIm5vIHBsYXRmb3JtIGRhdGEgcHJvdmlkZWRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBjaGlwKTsKLQljaGlwLT5jaGlwX3R5cGUgPSBpZC0+ZHJpdmVyX2RhdGE7Ci0JcHN5X2NmZy5kcnZfZGF0YSA9IGNoaXA7Ci0KLQkvKiBXaGVuIGN1cnJlbnQgaXMgbm90IG1lYXN1cmVkLAotCSAqIENVUlJFTlRfTk9XIGFuZCBDVVJSRU5UX0FWRyBwcm9wZXJ0aWVzIHNob3VsZCBiZSBpbnZpc2libGUuICovCi0JaWYgKCFjaGlwLT5wZGF0YS0+ZW5hYmxlX2N1cnJlbnRfc2Vuc2UpCi0JCW1heDE3MDQyX2Rlc2MgPSAmbWF4MTcwNDJfbm9fY3VycmVudF9zZW5zZV9wc3lfZGVzYzsKLQotCWlmIChjaGlwLT5wZGF0YS0+cl9zbnMgPT0gMCkKLQkJY2hpcC0+cGRhdGEtPnJfc25zID0gTUFYMTcwNDJfREVGQVVMVF9TTlNfUkVTSVNUT1I7Ci0KLQlpZiAoY2hpcC0+cGRhdGEtPmluaXRfZGF0YSkKLQkJZm9yIChpID0gMDsgaSA8IGNoaXAtPnBkYXRhLT5udW1faW5pdF9kYXRhOyBpKyspCi0JCQlyZWdtYXBfd3JpdGUoY2hpcC0+cmVnbWFwLAotCQkJCQljaGlwLT5wZGF0YS0+aW5pdF9kYXRhW2ldLmFkZHIsCi0JCQkJCWNoaXAtPnBkYXRhLT5pbml0X2RhdGFbaV0uZGF0YSk7Ci0KLQlpZiAoIWNoaXAtPnBkYXRhLT5lbmFibGVfY3VycmVudF9zZW5zZSkgewotCQlyZWdtYXBfd3JpdGUoY2hpcC0+cmVnbWFwLCBNQVgxNzA0Ml9DR0FJTiwgMHgwMDAwKTsKLQkJcmVnbWFwX3dyaXRlKGNoaXAtPnJlZ21hcCwgTUFYMTcwNDJfTWlzY0NGRywgMHgwMDAzKTsKLQkJcmVnbWFwX3dyaXRlKGNoaXAtPnJlZ21hcCwgTUFYMTcwNDJfTGVhcm5DRkcsIDB4MDAwNyk7Ci0JfQotCi0JY2hpcC0+YmF0dGVyeSA9IGRldm1fcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgbWF4MTcwNDJfZGVzYywKLQkJCQkJCSAgICZwc3lfY2ZnKTsKLQlpZiAoSVNfRVJSKGNoaXAtPmJhdHRlcnkpKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkOiBwb3dlciBzdXBwbHkgcmVnaXN0ZXJcbiIpOwotCQlyZXR1cm4gUFRSX0VSUihjaGlwLT5iYXR0ZXJ5KTsKLQl9Ci0KLQlpZiAoY2xpZW50LT5pcnEpIHsKLQkJcmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycSgmY2xpZW50LT5kZXYsIGNsaWVudC0+aXJxLAotCQkJCQkJTlVMTCwKLQkJCQkJCW1heDE3MDQyX3RocmVhZF9oYW5kbGVyLAotCQkJCQkJSVJRRl9UUklHR0VSX0ZBTExJTkcgfAotCQkJCQkJSVJRRl9PTkVTSE9ULAotCQkJCQkJY2hpcC0+YmF0dGVyeS0+ZGVzYy0+bmFtZSwKLQkJCQkJCWNoaXApOwotCQlpZiAoIXJldCkgewotCQkJcmVnbWFwX3VwZGF0ZV9iaXRzKGNoaXAtPnJlZ21hcCwgTUFYMTcwNDJfQ09ORklHLAotCQkJCQlDT05GSUdfQUxSVF9CSVRfRU5CTCwKLQkJCQkJQ09ORklHX0FMUlRfQklUX0VOQkwpOwotCQkJbWF4MTcwNDJfc2V0X3NvY190aHJlc2hvbGQoY2hpcCwgMSk7Ci0JCX0gZWxzZSB7Ci0JCQljbGllbnQtPmlycSA9IDA7Ci0JCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzKCk6IGNhbm5vdCBnZXQgSVJRXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJfQotCX0KLQotCXJlZ21hcF9yZWFkKGNoaXAtPnJlZ21hcCwgTUFYMTcwNDJfU1RBVFVTLCAmdmFsKTsKLQlpZiAodmFsICYgU1RBVFVTX1BPUl9CSVQpIHsKLQkJSU5JVF9XT1JLKCZjaGlwLT53b3JrLCBtYXgxNzA0Ml9pbml0X3dvcmtlcik7Ci0JCXNjaGVkdWxlX3dvcmsoJmNoaXAtPndvcmspOwotCX0gZWxzZSB7Ci0JCWNoaXAtPmluaXRfY29tcGxldGUgPSAxOwotCX0KLQotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX1BNX1NMRUVQCi1zdGF0aWMgaW50IG1heDE3MDQyX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBtYXgxNzA0Ml9jaGlwICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQkvKgotCSAqIGRpc2FibGUgdGhlIGlycSBhbmQgZW5hYmxlIGlycV93YWtlCi0JICogY2FwYWJpbGl0eSB0byB0aGUgaW50ZXJydXB0IGxpbmUuCi0JICovCi0JaWYgKGNoaXAtPmNsaWVudC0+aXJxKSB7Ci0JCWRpc2FibGVfaXJxKGNoaXAtPmNsaWVudC0+aXJxKTsKLQkJZW5hYmxlX2lycV93YWtlKGNoaXAtPmNsaWVudC0+aXJxKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtYXgxNzA0Ml9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBtYXgxNzA0Ml9jaGlwICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlpZiAoY2hpcC0+Y2xpZW50LT5pcnEpIHsKLQkJZGlzYWJsZV9pcnFfd2FrZShjaGlwLT5jbGllbnQtPmlycSk7Ci0JCWVuYWJsZV9pcnEoY2hpcC0+Y2xpZW50LT5pcnEpOwotCQkvKiByZS1wcm9ncmFtIHRoZSBTT0MgdGhyZXNob2xkcyB0byAxJSBjaGFuZ2UgKi8KLQkJbWF4MTcwNDJfc2V0X3NvY190aHJlc2hvbGQoY2hpcCwgMSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKG1heDE3MDQyX3BtX29wcywgbWF4MTcwNDJfc3VzcGVuZCwKLQkJCW1heDE3MDQyX3Jlc3VtZSk7Ci0KLSNpZmRlZiBDT05GSUdfT0YKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1heDE3MDQyX2R0X21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJtYXhpbSxtYXgxNzA0MiIgfSwKLQl7IC5jb21wYXRpYmxlID0gIm1heGltLG1heDE3MDQ3IiB9LAotCXsgLmNvbXBhdGlibGUgPSAibWF4aW0sbWF4MTcwNTAiIH0sCi0JeyB9LAotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1heDE3MDQyX2R0X21hdGNoKTsKLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbWF4MTcwNDJfaWRbXSA9IHsKLQl7ICJtYXgxNzA0MiIsIE1BWElNX0RFVklDRV9UWVBFX01BWDE3MDQyIH0sCi0JeyAibWF4MTcwNDciLCBNQVhJTV9ERVZJQ0VfVFlQRV9NQVgxNzA0NyB9LAotCXsgIm1heDE3MDUwIiwgTUFYSU1fREVWSUNFX1RZUEVfTUFYMTcwNTAgfSwKLQl7IH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbWF4MTcwNDJfaWQpOwotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbWF4MTcwNDJfaTJjX2RyaXZlciA9IHsKLQkuZHJpdmVyCT0gewotCQkubmFtZQk9ICJtYXgxNzA0MiIsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihtYXgxNzA0Ml9kdF9tYXRjaCksCi0JCS5wbQk9ICZtYXgxNzA0Ml9wbV9vcHMsCi0JfSwKLQkucHJvYmUJCT0gbWF4MTcwNDJfcHJvYmUsCi0JLmlkX3RhYmxlCT0gbWF4MTcwNDJfaWQsCi19OwotbW9kdWxlX2kyY19kcml2ZXIobWF4MTcwNDJfaTJjX2RyaXZlcik7Ci0KLU1PRFVMRV9BVVRIT1IoIk15dW5nSm9vIEhhbSA8bXl1bmdqb28uaGFtQHNhbXN1bmcuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJNQVgxNzA0MiBGdWVsIEdhdWdlIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL21heDc3NjkzX2NoYXJnZXIuYyBiL2RyaXZlcnMvcG93ZXIvbWF4Nzc2OTNfY2hhcmdlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjBjYWI1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvcG93ZXIvbWF4Nzc2OTNfY2hhcmdlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNzcxICswLDAgQEAKLS8qCi0gKiBtYXg3NzY5M19jaGFyZ2VyLmMgLSBCYXR0ZXJ5IGNoYXJnZXIgZHJpdmVyIGZvciB0aGUgTWF4aW0gNzc2OTMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgU2Ftc3VuZyBFbGVjdHJvbmljcwotICogS3J6eXN6dG9mIEtvemxvd3NraSA8ay5rb3psb3dza2lAc2Ftc3VuZy5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvbWF4Nzc2OTMuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvbWF4Nzc2OTMtY29tbW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL21heDc3NjkzLXByaXZhdGUuaD4KLQotI2RlZmluZSBNQVg3NzY5M19DSEFSR0VSX05BTUUJCQkJIm1heDc3NjkzLWNoYXJnZXIiCi1zdGF0aWMgY29uc3QgY2hhciAqbWF4Nzc2OTNfY2hhcmdlcl9tb2RlbAkJPSAiTUFYNzc2OTMiOwotc3RhdGljIGNvbnN0IGNoYXIgKm1heDc3NjkzX2NoYXJnZXJfbWFudWZhY3R1cmVyCT0gIk1heGltIEludGVncmF0ZWQiOwotCi1zdHJ1Y3QgbWF4Nzc2OTNfY2hhcmdlciB7Ci0Jc3RydWN0IGRldmljZQkJKmRldjsKLQlzdHJ1Y3QgbWF4Nzc2OTNfZGV2CSptYXg3NzY5MzsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5CSpjaGFyZ2VyOwotCi0JdTMyIGNvbnN0YW50X3ZvbHQ7Ci0JdTMyIG1pbl9zeXN0ZW1fdm9sdDsKLQl1MzIgdGhlcm1hbF9yZWd1bGF0aW9uX3RlbXA7Ci0JdTMyIGJhdHR0ZXJ5X292ZXJjdXJyZW50OwotCXUzMiBjaGFyZ2VfaW5wdXRfdGhyZXNob2xkX3ZvbHQ7Ci19OwotCi1zdGF0aWMgaW50IG1heDc3NjkzX2dldF9jaGFyZ2VyX3N0YXRlKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgaW50ICp2YWwpCi17Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBpbnQgZGF0YTsKLQotCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTUFYNzc2OTNfQ0hHX1JFR19DSEdfREVUQUlMU18wMSwgJmRhdGEpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JZGF0YSAmPSBDSEdfREVUQUlMU18wMV9DSEdfTUFTSzsKLQlkYXRhID4+PSBDSEdfREVUQUlMU18wMV9DSEdfU0hJRlQ7Ci0KLQlzd2l0Y2ggKGRhdGEpIHsKLQljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX1BSRVFVQUxJRklDQVRJT046Ci0JY2FzZSBNQVg3NzY5M19DSEFSR0lOR19GQVNUX0NPTlNUX0NVUlJFTlQ6Ci0JY2FzZSBNQVg3NzY5M19DSEFSR0lOR19GQVNUX0NPTlNUX1ZPTFRBR0U6Ci0JY2FzZSBNQVg3NzY5M19DSEFSR0lOR19UT1BfT0ZGOgotCS8qIEluIGhpZ2ggdGVtcCB0aGUgY2hhcmdpbmcgY3VycmVudCBpcyByZWR1Y2VkLCBidXQgc3RpbGwgY2hhcmdpbmcgKi8KLQljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX0hJR0hfVEVNUDoKLQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7Ci0JCWJyZWFrOwotCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfRE9ORToKLQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTDsKLQkJYnJlYWs7Ci0JY2FzZSBNQVg3NzY5M19DSEFSR0lOR19USU1FUl9FWFBJUkVEOgotCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfVEhFUk1JU1RPUl9TVVNQRU5EOgotCQkqdmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19OT1RfQ0hBUkdJTkc7Ci0JCWJyZWFrOwotCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfT0ZGOgotCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfT1ZFUl9URU1QOgotCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfV0FUQ0hET0dfRVhQSVJFRDoKLQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkc7Ci0JCWJyZWFrOwotCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfUkVTRVJWRUQ6Ci0JZGVmYXVsdDoKLQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfVU5LTk9XTjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtYXg3NzY5M19nZXRfY2hhcmdlX3R5cGUoc3RydWN0IHJlZ21hcCAqcmVnbWFwLCBpbnQgKnZhbCkKLXsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGludCBkYXRhOwotCi0JcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBNQVg3NzY5M19DSEdfUkVHX0NIR19ERVRBSUxTXzAxLCAmZGF0YSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlkYXRhICY9IENIR19ERVRBSUxTXzAxX0NIR19NQVNLOwotCWRhdGEgPj49IENIR19ERVRBSUxTXzAxX0NIR19TSElGVDsKLQotCXN3aXRjaCAoZGF0YSkgewotCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfUFJFUVVBTElGSUNBVElPTjoKLQkvKgotCSAqIFRvcC1vZmY6IHRyaWNrbGUgb3IgZmFzdD8gSW4gdG9wLW9mZiB0aGUgY3VycmVudCB2YXJpZXMgYmV0d2VlbgotCSAqIDEwMCBhbmQgMjUwIG1BLiBJdCBpcyBoaWdoZXIgdGhhbiBwcmVxdWFsaWZpY2F0aW9uIGN1cnJlbnQuCi0JICovCi0JY2FzZSBNQVg3NzY5M19DSEFSR0lOR19UT1BfT0ZGOgotCQkqdmFsID0gUE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX1RSSUNLTEU7Ci0JCWJyZWFrOwotCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfRkFTVF9DT05TVF9DVVJSRU5UOgotCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfRkFTVF9DT05TVF9WT0xUQUdFOgotCS8qIEluIGhpZ2ggdGVtcCB0aGUgY2hhcmdpbmcgY3VycmVudCBpcyByZWR1Y2VkLCBidXQgc3RpbGwgY2hhcmdpbmcgKi8KLQljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX0hJR0hfVEVNUDoKLQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9GQVNUOwotCQlicmVhazsKLQljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX0RPTkU6Ci0JY2FzZSBNQVg3NzY5M19DSEFSR0lOR19USU1FUl9FWFBJUkVEOgotCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfVEhFUk1JU1RPUl9TVVNQRU5EOgotCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfT0ZGOgotCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfT1ZFUl9URU1QOgotCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfV0FUQ0hET0dfRVhQSVJFRDoKLQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9OT05FOwotCQlicmVhazsKLQljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX1JFU0VSVkVEOgotCWRlZmF1bHQ6Ci0JCSp2YWwgPSBQT1dFUl9TVVBQTFlfQ0hBUkdFX1RZUEVfVU5LTk9XTjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFN1cHBvcnRlZCBoZWFsdGggc3RhdHVzZXM6Ci0gKiAgLSBQT1dFUl9TVVBQTFlfSEVBTFRIX0RFQUQKLSAqICAtIFBPV0VSX1NVUFBMWV9IRUFMVEhfR09PRAotICogIC0gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSVk9MVEFHRQotICogIC0gUE9XRVJfU1VQUExZX0hFQUxUSF9TQUZFVFlfVElNRVJfRVhQSVJFCi0gKiAgLSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOS05PV04KLSAqICAtIFBPV0VSX1NVUFBMWV9IRUFMVEhfVU5TUEVDX0ZBSUxVUkUKLSAqLwotc3RhdGljIGludCBtYXg3NzY5M19nZXRfYmF0dGVyeV9oZWFsdGgoc3RydWN0IHJlZ21hcCAqcmVnbWFwLCBpbnQgKnZhbCkKLXsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGludCBkYXRhOwotCi0JcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBNQVg3NzY5M19DSEdfUkVHX0NIR19ERVRBSUxTXzAxLCAmZGF0YSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlkYXRhICY9IENIR19ERVRBSUxTXzAxX0JBVF9NQVNLOwotCWRhdGEgPj49IENIR19ERVRBSUxTXzAxX0JBVF9TSElGVDsKLQotCXN3aXRjaCAoZGF0YSkgewotCWNhc2UgTUFYNzc2OTNfQkFUVEVSWV9OT0JBVDoKLQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfREVBRDsKLQkJYnJlYWs7Ci0JY2FzZSBNQVg3NzY5M19CQVRURVJZX1BSRVFVQUxJRklDQVRJT046Ci0JY2FzZSBNQVg3NzY5M19CQVRURVJZX0dPT0Q6Ci0JY2FzZSBNQVg3NzY5M19CQVRURVJZX0xPV1ZPTFRBR0U6Ci0JCSp2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0Q7Ci0JCWJyZWFrOwotCWNhc2UgTUFYNzc2OTNfQkFUVEVSWV9USU1FUl9FWFBJUkVEOgotCQkvKgotCQkgKiBUb29rIGxvbmdlciB0byBjaGFyZ2UgdGhhbiBleHBlY3RlZCwgY2hhcmdpbmcgc3VzcGVuZGVkLgotCQkgKiBEYW1hZ2VkIGJhdHRlcnk/Ci0JCSAqLwotCQkqdmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9TQUZFVFlfVElNRVJfRVhQSVJFOwotCQlicmVhazsKLQljYXNlIE1BWDc3NjkzX0JBVFRFUllfT1ZFUlZPTFRBR0U6Ci0JCSp2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJWT0xUQUdFOwotCQlicmVhazsKLQljYXNlIE1BWDc3NjkzX0JBVFRFUllfT1ZFUkNVUlJFTlQ6Ci0JCSp2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOU1BFQ19GQUlMVVJFOwotCQlicmVhazsKLQljYXNlIE1BWDc3NjkzX0JBVFRFUllfUkVTRVJWRUQ6Ci0JZGVmYXVsdDoKLQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfVU5LTk9XTjsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4Nzc2OTNfZ2V0X3ByZXNlbnQoc3RydWN0IHJlZ21hcCAqcmVnbWFwLCBpbnQgKnZhbCkKLXsKLQl1bnNpZ25lZCBpbnQgZGF0YTsKLQlpbnQgcmV0OwotCi0JLyoKLQkgKiBSZWFkIENIR19JTlRfT0sgcmVnaXN0ZXIuIEhpZ2ggREVUQkFUIGJpdCBoZXJlIHNob3VsZCBiZQotCSAqIGVxdWFsIHRvIHZhbHVlIDB4MCBpbiBDSEdfREVUQUlMU18wMS9CQVQgZmllbGQuCi0JICovCi0JcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBNQVg3NzY5M19DSEdfUkVHX0NIR19JTlRfT0ssICZkYXRhKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCSp2YWwgPSAoZGF0YSAmIENIR19JTlRfT0tfREVUQkFUX01BU0spID8gMCA6IDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtYXg3NzY5M19nZXRfb25saW5lKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgaW50ICp2YWwpCi17Ci0JdW5zaWduZWQgaW50IGRhdGE7Ci0JaW50IHJldDsKLQotCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTUFYNzc2OTNfQ0hHX1JFR19DSEdfSU5UX09LLCAmZGF0YSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQkqdmFsID0gKGRhdGEgJiBDSEdfSU5UX09LX0NIR0lOX01BU0spID8gMSA6IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IG1heDc3NjkzX2NoYXJnZXJfcHJvcHNbXSA9IHsKLQlQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMsCi0JUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX1RZUEUsCi0JUE9XRVJfU1VQUExZX1BST1BfSEVBTFRILAotCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsCi0JUE9XRVJfU1VQUExZX1BST1BfT05MSU5FLAotCVBPV0VSX1NVUFBMWV9QUk9QX01PREVMX05BTUUsCi0JUE9XRVJfU1VQUExZX1BST1BfTUFOVUZBQ1RVUkVSLAotfTsKLQotc3RhdGljIGludCBtYXg3NzY5M19jaGFyZ2VyX2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCi0JCQkgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAotCQkJICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCi17Ci0Jc3RydWN0IG1heDc3NjkzX2NoYXJnZXIgKmNoZyA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwotCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGNoZy0+bWF4Nzc2OTMtPnJlZ21hcDsKLQlpbnQgcmV0ID0gMDsKLQotCXN3aXRjaCAocHNwKSB7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6Ci0JCXJldCA9IG1heDc3NjkzX2dldF9jaGFyZ2VyX3N0YXRlKHJlZ21hcCwgJnZhbC0+aW50dmFsKTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfVFlQRToKLQkJcmV0ID0gbWF4Nzc2OTNfZ2V0X2NoYXJnZV90eXBlKHJlZ21hcCwgJnZhbC0+aW50dmFsKTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEg6Ci0JCXJldCA9IG1heDc3NjkzX2dldF9iYXR0ZXJ5X2hlYWx0aChyZWdtYXAsICZ2YWwtPmludHZhbCk7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDoKLQkJcmV0ID0gbWF4Nzc2OTNfZ2V0X3ByZXNlbnQocmVnbWFwLCAmdmFsLT5pbnR2YWwpOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORToKLQkJcmV0ID0gbWF4Nzc2OTNfZ2V0X29ubGluZShyZWdtYXAsICZ2YWwtPmludHZhbCk7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfTU9ERUxfTkFNRToKLQkJdmFsLT5zdHJ2YWwgPSBtYXg3NzY5M19jaGFyZ2VyX21vZGVsOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUjoKLQkJdmFsLT5zdHJ2YWwgPSBtYXg3NzY5M19jaGFyZ2VyX21hbnVmYWN0dXJlcjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBtYXg3NzY5M19jaGFyZ2VyX2Rlc2MgPSB7Ci0JLm5hbWUJCT0gTUFYNzc2OTNfQ0hBUkdFUl9OQU1FLAotCS50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlksCi0JLnByb3BlcnRpZXMJPSBtYXg3NzY5M19jaGFyZ2VyX3Byb3BzLAotCS5udW1fcHJvcGVydGllcwk9IEFSUkFZX1NJWkUobWF4Nzc2OTNfY2hhcmdlcl9wcm9wcyksCi0JLmdldF9wcm9wZXJ0eQk9IG1heDc3NjkzX2NoYXJnZXJfZ2V0X3Byb3BlcnR5LAotfTsKLQotc3RhdGljIHNzaXplX3QgZGV2aWNlX2F0dHJfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsCi0JCWludCAoKmZuKShzdHJ1Y3QgbWF4Nzc2OTNfY2hhcmdlciAqLCB1bnNpZ25lZCBsb25nKSkKLXsKLQlzdHJ1Y3QgbWF4Nzc2OTNfY2hhcmdlciAqY2hnID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JaW50IHJldDsKLQotCXJldCA9IGtzdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBmbihjaGcsIHZhbCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3QgZmFzdF9jaGFyZ2VfdGltZXJfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IG1heDc3NjkzX2NoYXJnZXIgKmNoZyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXVuc2lnbmVkIGludCBkYXRhLCB2YWw7Ci0JaW50IHJldDsKLQotCXJldCA9IHJlZ21hcF9yZWFkKGNoZy0+bWF4Nzc2OTMtPnJlZ21hcCwgTUFYNzc2OTNfQ0hHX1JFR19DSEdfQ05GR18wMSwKLQkJCSZkYXRhKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWRhdGEgJj0gQ0hHX0NORkdfMDFfRkNIR1RJTUVfTUFTSzsKLQlkYXRhID4+PSBDSEdfQ05GR18wMV9GQ0hHVElNRV9TSElGVDsKLQlzd2l0Y2ggKGRhdGEpIHsKLQljYXNlIDB4MSAuLi4gMHg3OgotCQkvKiBTdGFydGluZyBmcm9tIDQgaG91cnMsIHN0ZXAgYnkgMiBob3VycyAqLwotCQl2YWwgPSA0ICsgKGRhdGEgLSAxKSAqIDI7Ci0JCWJyZWFrOwotCWNhc2UgMHgwOgotCWRlZmF1bHQ6Ci0JCXZhbCA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgdmFsKTsKLX0KLQotc3RhdGljIGludCBtYXg3NzY5M19zZXRfZmFzdF9jaGFyZ2VfdGltZXIoc3RydWN0IG1heDc3NjkzX2NoYXJnZXIgKmNoZywKLQkJdW5zaWduZWQgbG9uZyBob3VycykKLXsKLQl1bnNpZ25lZCBpbnQgZGF0YTsKLQotCS8qCi0JICogMHgwMCAtIGRpc2FibGUKLQkgKiAweDAxIC0gNGgKLQkgKiAweDAyIC0gNmgKLQkgKiAuLi4KLQkgKiAweDA3IC0gMTZoCi0JICogUm91bmQgZG93biBvZGQgdmFsdWVzLgotCSAqLwotCXN3aXRjaCAoaG91cnMpIHsKLQljYXNlIDQgLi4uIDE2OgotCQlkYXRhID0gKGhvdXJzIC0gNCkgLyAyICsgMTsKLQkJYnJlYWs7Ci0JY2FzZSAwOgotCQkvKiBEaXNhYmxlICovCi0JCWRhdGEgPSAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JZGF0YSA8PD0gQ0hHX0NORkdfMDFfRkNIR1RJTUVfU0hJRlQ7Ci0KLQlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGNoZy0+bWF4Nzc2OTMtPnJlZ21hcCwKLQkJCU1BWDc3NjkzX0NIR19SRUdfQ0hHX0NORkdfMDEsCi0JCQlDSEdfQ05GR18wMV9GQ0hHVElNRV9NQVNLLCBkYXRhKTsKLX0KLQotc3RhdGljIHNzaXplX3QgZmFzdF9jaGFyZ2VfdGltZXJfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0JcmV0dXJuIGRldmljZV9hdHRyX3N0b3JlKGRldiwgYXR0ciwgYnVmLCBjb3VudCwKLQkJCW1heDc3NjkzX3NldF9mYXN0X2NoYXJnZV90aW1lcik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHRvcF9vZmZfdGhyZXNob2xkX2N1cnJlbnRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IG1heDc3NjkzX2NoYXJnZXIgKmNoZyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXVuc2lnbmVkIGludCBkYXRhLCB2YWw7Ci0JaW50IHJldDsKLQotCXJldCA9IHJlZ21hcF9yZWFkKGNoZy0+bWF4Nzc2OTMtPnJlZ21hcCwgTUFYNzc2OTNfQ0hHX1JFR19DSEdfQ05GR18wMywKLQkJCSZkYXRhKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWRhdGEgJj0gQ0hHX0NORkdfMDNfVE9JVEhfTUFTSzsKLQlkYXRhID4+PSBDSEdfQ05GR18wM19UT0lUSF9TSElGVDsKLQotCWlmIChkYXRhIDw9IDB4MDQpCi0JCXZhbCA9IDEwMDAwMCArIGRhdGEgKiAyNTAwMDsKLQllbHNlCi0JCXZhbCA9IGRhdGEgKiA1MDAwMDsKLQotCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgdmFsKTsKLX0KLQotc3RhdGljIGludCBtYXg3NzY5M19zZXRfdG9wX29mZl90aHJlc2hvbGRfY3VycmVudChzdHJ1Y3QgbWF4Nzc2OTNfY2hhcmdlciAqY2hnLAotCQl1bnNpZ25lZCBsb25nIHVhbXApCi17Ci0JdW5zaWduZWQgaW50IGRhdGE7Ci0KLQlpZiAodWFtcCA8IDEwMDAwMCB8fCB1YW1wID4gMzUwMDAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICh1YW1wIDw9IDIwMDAwMCkKLQkJZGF0YSA9ICh1YW1wIC0gMTAwMDAwKSAvIDI1MDAwOwotCWVsc2UKLQkJLyogKDIwMDAwMCwgMzUwMDAwPiAqLwotCQlkYXRhID0gdWFtcCAvIDUwMDAwOwotCi0JZGF0YSA8PD0gQ0hHX0NORkdfMDNfVE9JVEhfU0hJRlQ7Ci0KLQlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGNoZy0+bWF4Nzc2OTMtPnJlZ21hcCwKLQkJCU1BWDc3NjkzX0NIR19SRUdfQ0hHX0NORkdfMDMsCi0JCQlDSEdfQ05GR18wM19UT0lUSF9NQVNLLCBkYXRhKTsKLX0KLQotc3RhdGljIHNzaXplX3QgdG9wX29mZl90aHJlc2hvbGRfY3VycmVudF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlyZXR1cm4gZGV2aWNlX2F0dHJfc3RvcmUoZGV2LCBhdHRyLCBidWYsIGNvdW50LAotCQkJbWF4Nzc2OTNfc2V0X3RvcF9vZmZfdGhyZXNob2xkX2N1cnJlbnQpOwotfQotCi1zdGF0aWMgc3NpemVfdCB0b3Bfb2ZmX3RpbWVyX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGcgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQl1bnNpZ25lZCBpbnQgZGF0YSwgdmFsOwotCWludCByZXQ7Ci0KLQlyZXQgPSByZWdtYXBfcmVhZChjaGctPm1heDc3NjkzLT5yZWdtYXAsIE1BWDc3NjkzX0NIR19SRUdfQ0hHX0NORkdfMDMsCi0JCQkmZGF0YSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlkYXRhICY9IENIR19DTkZHXzAzX1RPVElNRV9NQVNLOwotCWRhdGEgPj49IENIR19DTkZHXzAzX1RPVElNRV9TSElGVDsKLQotCXZhbCA9IGRhdGEgKiAxMDsKLQotCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgdmFsKTsKLX0KLQotc3RhdGljIGludCBtYXg3NzY5M19zZXRfdG9wX29mZl90aW1lcihzdHJ1Y3QgbWF4Nzc2OTNfY2hhcmdlciAqY2hnLAotCQl1bnNpZ25lZCBsb25nIG1pbnV0ZXMpCi17Ci0JdW5zaWduZWQgaW50IGRhdGE7Ci0KLQlpZiAobWludXRlcyA+IDcwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRhdGEgPSBtaW51dGVzIC8gMTA7Ci0JZGF0YSA8PD0gQ0hHX0NORkdfMDNfVE9USU1FX1NISUZUOwotCi0JcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhjaGctPm1heDc3NjkzLT5yZWdtYXAsCi0JCQlNQVg3NzY5M19DSEdfUkVHX0NIR19DTkZHXzAzLAotCQkJQ0hHX0NORkdfMDNfVE9USU1FX01BU0ssIGRhdGEpOwotfQotCi1zdGF0aWMgc3NpemVfdCB0b3Bfb2ZmX3RpbWVyX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXJldHVybiBkZXZpY2VfYXR0cl9zdG9yZShkZXYsIGF0dHIsIGJ1ZiwgY291bnQsCi0JCQltYXg3NzY5M19zZXRfdG9wX29mZl90aW1lcik7Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUl9SVyhmYXN0X2NoYXJnZV90aW1lcik7Ci1zdGF0aWMgREVWSUNFX0FUVFJfUlcodG9wX29mZl90aHJlc2hvbGRfY3VycmVudCk7Ci1zdGF0aWMgREVWSUNFX0FUVFJfUlcodG9wX29mZl90aW1lcik7Ci0KLXN0YXRpYyBpbnQgbWF4Nzc2OTNfc2V0X2NvbnN0YW50X3ZvbHQoc3RydWN0IG1heDc3NjkzX2NoYXJnZXIgKmNoZywKLQkJdW5zaWduZWQgaW50IHV2b2x0KQotewotCXVuc2lnbmVkIGludCBkYXRhOwotCi0JLyoKLQkgKiAweDAwIC0gMy42NTAgVgotCSAqIDB4MDEgLSAzLjY3NSBWCi0JICogLi4uCi0JICogMHgxYiAtIDQuMzI1IFYKLQkgKiAweDFjIC0gNC4zNDAgVgotCSAqIDB4MWQgLSA0LjM1MCBWCi0JICogMHgxZSAtIDQuMzc1IFYKLQkgKiAweDFmIC0gNC40MDAgVgotCSAqLwotCWlmICh1dm9sdCA+PSAzNjUwMDAwICYmIHV2b2x0IDwgNDM0MDAwMCkKLQkJZGF0YSA9ICh1dm9sdCAtIDM2NTAwMDApIC8gMjUwMDA7Ci0JZWxzZSBpZiAodXZvbHQgPj0gNDM0MDAwMCAmJiB1dm9sdCA8IDQzNTAwMDApCi0JCWRhdGEgPSAweDFjOwotCWVsc2UgaWYgKHV2b2x0ID49IDQzNTAwMDAgJiYgdXZvbHQgPD0gNDQwMDAwMCkKLQkJZGF0YSA9IDB4MWQgKyAodXZvbHQgLSA0MzUwMDAwKSAvIDI1MDAwOwotCWVsc2UgewotCQlkZXZfZXJyKGNoZy0+ZGV2LCAiV3JvbmcgdmFsdWUgZm9yIGNoYXJnaW5nIGNvbnN0YW50IHZvbHRhZ2VcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlkYXRhIDw8PSBDSEdfQ05GR18wNF9DSEdDVlBSTV9TSElGVDsKLQotCWRldl9kYmcoY2hnLT5kZXYsICJDaGFyZ2luZyBjb25zdGFudCB2b2x0YWdlOiAldSAoMHgleClcbiIsIHV2b2x0LAotCQkJZGF0YSk7Ci0KLQlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGNoZy0+bWF4Nzc2OTMtPnJlZ21hcCwKLQkJCU1BWDc3NjkzX0NIR19SRUdfQ0hHX0NORkdfMDQsCi0JCQlDSEdfQ05GR18wNF9DSEdDVlBSTV9NQVNLLCBkYXRhKTsKLX0KLQotc3RhdGljIGludCBtYXg3NzY5M19zZXRfbWluX3N5c3RlbV92b2x0KHN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGcsCi0JCXVuc2lnbmVkIGludCB1dm9sdCkKLXsKLQl1bnNpZ25lZCBpbnQgZGF0YTsKLQotCWlmICh1dm9sdCA8IDMwMDAwMDAgfHwgdXZvbHQgPiAzNzAwMDAwKSB7Ci0JCWRldl9lcnIoY2hnLT5kZXYsICJXcm9uZyB2YWx1ZSBmb3IgbWluaW11bSBzeXN0ZW0gcmVndWxhdGlvbiB2b2x0YWdlXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGF0YSA9ICh1dm9sdCAtIDMwMDAwMDApIC8gMTAwMDAwOwotCi0JZGF0YSA8PD0gQ0hHX0NORkdfMDRfTUlOVlNZU19TSElGVDsKLQotCWRldl9kYmcoY2hnLT5kZXYsICJNaW5pbXVtIHN5c3RlbSByZWd1bGF0aW9uIHZvbHRhZ2U6ICV1ICgweCV4KVxuIiwKLQkJCXV2b2x0LCBkYXRhKTsKLQotCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoY2hnLT5tYXg3NzY5My0+cmVnbWFwLAotCQkJTUFYNzc2OTNfQ0hHX1JFR19DSEdfQ05GR18wNCwKLQkJCUNIR19DTkZHXzA0X01JTlZTWVNfTUFTSywgZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4Nzc2OTNfc2V0X3RoZXJtYWxfcmVndWxhdGlvbl90ZW1wKHN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGcsCi0JCXVuc2lnbmVkIGludCBjZWxzKQotewotCXVuc2lnbmVkIGludCBkYXRhOwotCi0Jc3dpdGNoIChjZWxzKSB7Ci0JY2FzZSA3MDoKLQljYXNlIDg1OgotCWNhc2UgMTAwOgotCWNhc2UgMTE1OgotCQlkYXRhID0gKGNlbHMgLSA3MCkgLyAxNTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X2VycihjaGctPmRldiwgIldyb25nIHZhbHVlIGZvciB0aGVybWFsIHJlZ3VsYXRpb24gbG9vcCB0ZW1wZXJhdHVyZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRhdGEgPDw9IENIR19DTkZHXzA3X1JFR1RFTVBfU0hJRlQ7Ci0KLQlkZXZfZGJnKGNoZy0+ZGV2LCAiVGhlcm1hbCByZWd1bGF0aW9uIGxvb3AgdGVtcGVyYXR1cmU6ICV1ICgweCV4KVxuIiwKLQkJCWNlbHMsIGRhdGEpOwotCi0JcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhjaGctPm1heDc3NjkzLT5yZWdtYXAsCi0JCQlNQVg3NzY5M19DSEdfUkVHX0NIR19DTkZHXzA3LAotCQkJQ0hHX0NORkdfMDdfUkVHVEVNUF9NQVNLLCBkYXRhKTsKLX0KLQotc3RhdGljIGludCBtYXg3NzY5M19zZXRfYmF0dHRlcnlfb3ZlcmN1cnJlbnQoc3RydWN0IG1heDc3NjkzX2NoYXJnZXIgKmNoZywKLQkJdW5zaWduZWQgaW50IHVhbXApCi17Ci0JdW5zaWduZWQgaW50IGRhdGE7Ci0KLQlpZiAodWFtcCAmJiAodWFtcCA8IDIwMDAwMDAgfHwgdWFtcCA+IDM1MDAwMDApKSB7Ci0JCWRldl9lcnIoY2hnLT5kZXYsICJXcm9uZyB2YWx1ZSBmb3IgYmF0dGVyeSBvdmVyY3VycmVudFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICh1YW1wKQotCQlkYXRhID0gKCh1YW1wIC0gMjAwMDAwMCkgLyAyNTAwMDApICsgMTsKLQllbHNlCi0JCWRhdGEgPSAwOyAvKiBkaXNhYmxlICovCi0KLQlkYXRhIDw8PSBDSEdfQ05GR18xMl9CMlNPVlJDX1NISUZUOwotCi0JZGV2X2RiZyhjaGctPmRldiwgIkJhdHRlcnkgb3ZlcmN1cnJlbnQ6ICV1ICgweCV4KVxuIiwgdWFtcCwgZGF0YSk7Ci0KLQlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGNoZy0+bWF4Nzc2OTMtPnJlZ21hcCwKLQkJCU1BWDc3NjkzX0NIR19SRUdfQ0hHX0NORkdfMTIsCi0JCQlDSEdfQ05GR18xMl9CMlNPVlJDX01BU0ssIGRhdGEpOwotfQotCi1zdGF0aWMgaW50IG1heDc3NjkzX3NldF9jaGFyZ2VfaW5wdXRfdGhyZXNob2xkX3ZvbHQoc3RydWN0IG1heDc3NjkzX2NoYXJnZXIgKmNoZywKLQkJdW5zaWduZWQgaW50IHV2b2x0KQotewotCXVuc2lnbmVkIGludCBkYXRhOwotCi0Jc3dpdGNoICh1dm9sdCkgewotCWNhc2UgNDMwMDAwMDoKLQkJZGF0YSA9IDB4MDsKLQkJYnJlYWs7Ci0JY2FzZSA0NzAwMDAwOgotCWNhc2UgNDgwMDAwMDoKLQljYXNlIDQ5MDAwMDA6Ci0JCWRhdGEgPSAodXZvbHQgLSA0NzAwMDAwKSAvIDEwMDAwMDsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKGNoZy0+ZGV2LCAiV3JvbmcgdmFsdWUgZm9yIGNoYXJnZSBpbnB1dCB2b2x0YWdlIHJlZ3VsYXRpb24gdGhyZXNob2xkXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGF0YSA8PD0gQ0hHX0NORkdfMTJfVkNIR0lOUkVHX1NISUZUOwotCi0JZGV2X2RiZyhjaGctPmRldiwgIkNoYXJnZSBpbnB1dCB2b2x0YWdlIHJlZ3VsYXRpb24gdGhyZXNob2xkOiAldSAoMHgleClcbiIsCi0JCQl1dm9sdCwgZGF0YSk7Ci0KLQlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGNoZy0+bWF4Nzc2OTMtPnJlZ21hcCwKLQkJCU1BWDc3NjkzX0NIR19SRUdfQ0hHX0NORkdfMTIsCi0JCQlDSEdfQ05GR18xMl9WQ0hHSU5SRUdfTUFTSywgZGF0YSk7Ci19Ci0KLS8qCi0gKiBTZXRzIGNoYXJnZXIgcmVnaXN0ZXJzIHRvIHByb3BlciBhbmQgc2FmZSBkZWZhdWx0IHZhbHVlcy4KLSAqLwotc3RhdGljIGludCBtYXg3NzY5M19yZWdfaW5pdChzdHJ1Y3QgbWF4Nzc2OTNfY2hhcmdlciAqY2hnKQotewotCWludCByZXQ7Ci0JdW5zaWduZWQgaW50IGRhdGE7Ci0KLQkvKiBVbmxvY2sgY2hhcmdlciByZWdpc3RlciBwcm90ZWN0aW9uICovCi0JZGF0YSA9ICgweDMgPDwgQ0hHX0NORkdfMDZfQ0hHUFJPVF9TSElGVCk7Ci0JcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGNoZy0+bWF4Nzc2OTMtPnJlZ21hcCwKLQkJCQlNQVg3NzY5M19DSEdfUkVHX0NIR19DTkZHXzA2LAotCQkJCUNIR19DTkZHXzA2X0NIR1BST1RfTUFTSywgZGF0YSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGNoZy0+ZGV2LCAiRXJyb3IgdW5sb2NraW5nIHJlZ2lzdGVyczogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gbWF4Nzc2OTNfc2V0X2Zhc3RfY2hhcmdlX3RpbWVyKGNoZywgREVGQVVMVF9GQVNUX0NIQVJHRV9USU1FUik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IG1heDc3NjkzX3NldF90b3Bfb2ZmX3RocmVzaG9sZF9jdXJyZW50KGNoZywKLQkJCURFRkFVTFRfVE9QX09GRl9USFJFU0hPTERfQ1VSUkVOVCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IG1heDc3NjkzX3NldF90b3Bfb2ZmX3RpbWVyKGNoZywgREVGQVVMVF9UT1BfT0ZGX1RJTUVSKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gbWF4Nzc2OTNfc2V0X2NvbnN0YW50X3ZvbHQoY2hnLCBjaGctPmNvbnN0YW50X3ZvbHQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBtYXg3NzY5M19zZXRfbWluX3N5c3RlbV92b2x0KGNoZywgY2hnLT5taW5fc3lzdGVtX3ZvbHQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBtYXg3NzY5M19zZXRfdGhlcm1hbF9yZWd1bGF0aW9uX3RlbXAoY2hnLAotCQkJY2hnLT50aGVybWFsX3JlZ3VsYXRpb25fdGVtcCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IG1heDc3NjkzX3NldF9iYXR0dGVyeV9vdmVyY3VycmVudChjaGcsIGNoZy0+YmF0dHRlcnlfb3ZlcmN1cnJlbnQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gbWF4Nzc2OTNfc2V0X2NoYXJnZV9pbnB1dF90aHJlc2hvbGRfdm9sdChjaGcsCi0JCQljaGctPmNoYXJnZV9pbnB1dF90aHJlc2hvbGRfdm9sdCk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfT0YKLXN0YXRpYyBpbnQgbWF4Nzc2OTNfZHRfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGcpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKLQotCWlmICghbnApIHsKLQkJZGV2X2VycihkZXYsICJubyBjaGFyZ2VyIE9GIG5vZGVcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJtYXhpbSxjb25zdGFudC1taWNyb3ZvbHQiLAotCQkJJmNoZy0+Y29uc3RhbnRfdm9sdCkpCi0JCWNoZy0+Y29uc3RhbnRfdm9sdCA9IERFRkFVTFRfQ09OU1RBTlRfVk9MVDsKLQotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgIm1heGltLG1pbi1zeXN0ZW0tbWljcm92b2x0IiwKLQkJCSZjaGctPm1pbl9zeXN0ZW1fdm9sdCkpCi0JCWNoZy0+bWluX3N5c3RlbV92b2x0ID0gREVGQVVMVF9NSU5fU1lTVEVNX1ZPTFQ7Ci0KLQlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJtYXhpbSx0aGVybWFsLXJlZ3VsYXRpb24tY2Vsc2l1cyIsCi0JCQkmY2hnLT50aGVybWFsX3JlZ3VsYXRpb25fdGVtcCkpCi0JCWNoZy0+dGhlcm1hbF9yZWd1bGF0aW9uX3RlbXAgPSBERUZBVUxUX1RIRVJNQUxfUkVHVUxBVElPTl9URU1QOwotCi0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAibWF4aW0sYmF0dGVyeS1vdmVyY3VycmVudC1taWNyb2FtcCIsCi0JCQkmY2hnLT5iYXR0dGVyeV9vdmVyY3VycmVudCkpCi0JCWNoZy0+YmF0dHRlcnlfb3ZlcmN1cnJlbnQgPSBERUZBVUxUX0JBVFRFUllfT1ZFUkNVUlJFTlQ7Ci0KLQlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJtYXhpbSxjaGFyZ2UtaW5wdXQtdGhyZXNob2xkLW1pY3Jvdm9sdCIsCi0JCQkmY2hnLT5jaGFyZ2VfaW5wdXRfdGhyZXNob2xkX3ZvbHQpKQotCQljaGctPmNoYXJnZV9pbnB1dF90aHJlc2hvbGRfdm9sdCA9Ci0JCQlERUZBVUxUX0NIQVJHRVJfSU5QVVRfVEhSRVNIT0xEX1ZPTFQ7Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbHNlIC8qIENPTkZJR19PRiAqLwotc3RhdGljIGludCBtYXg3NzY5M19kdF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IG1heDc3NjkzX2NoYXJnZXIgKmNoZykKLXsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZiAvKiBDT05GSUdfT0YgKi8KLQotc3RhdGljIGludCBtYXg3NzY5M19jaGFyZ2VyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IG1heDc3NjkzX2NoYXJnZXIgKmNoZzsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307Ci0Jc3RydWN0IG1heDc3NjkzX2RldiAqbWF4Nzc2OTMgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7Ci0JaW50IHJldDsKLQotCWNoZyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmNoZyksIEdGUF9LRVJORUwpOwotCWlmICghY2hnKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNoZyk7Ci0JY2hnLT5kZXYgPSAmcGRldi0+ZGV2OwotCWNoZy0+bWF4Nzc2OTMgPSBtYXg3NzY5MzsKLQotCXJldCA9IG1heDc3NjkzX2R0X2luaXQoJnBkZXYtPmRldiwgY2hnKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gbWF4Nzc2OTNfcmVnX2luaXQoY2hnKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcHN5X2NmZy5kcnZfZGF0YSA9IGNoZzsKLQotCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZmFzdF9jaGFyZ2VfdGltZXIpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkOiBjcmVhdGUgZmFzdCBjaGFyZ2UgdGltZXIgc3lzZnMgZW50cnlcbiIpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwKLQkJCSZkZXZfYXR0cl90b3Bfb2ZmX3RocmVzaG9sZF9jdXJyZW50KTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZDogY3JlYXRlIHRvcCBvZmYgY3VycmVudCBzeXNmcyBlbnRyeVxuIik7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfdG9wX29mZl90aW1lcik7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQ6IGNyZWF0ZSB0b3Agb2ZmIHRpbWVyIHN5c2ZzIGVudHJ5XG4iKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JY2hnLT5jaGFyZ2VyID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsCi0JCQkJCQkmbWF4Nzc2OTNfY2hhcmdlcl9kZXNjLAotCQkJCQkJJnBzeV9jZmcpOwotCWlmIChJU19FUlIoY2hnLT5jaGFyZ2VyKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQ6IHBvd2VyIHN1cHBseSByZWdpc3RlclxuIik7Ci0JCXJldCA9IFBUUl9FUlIoY2hnLT5jaGFyZ2VyKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWVycjoKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX3RvcF9vZmZfdGltZXIpOwotCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfdG9wX29mZl90aHJlc2hvbGRfY3VycmVudCk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9mYXN0X2NoYXJnZV90aW1lcik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1heDc3NjkzX2NoYXJnZXJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IG1heDc3NjkzX2NoYXJnZXIgKmNoZyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl90b3Bfb2ZmX3RpbWVyKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX3RvcF9vZmZfdGhyZXNob2xkX2N1cnJlbnQpOwotCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZmFzdF9jaGFyZ2VfdGltZXIpOwotCi0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoY2hnLT5jaGFyZ2VyKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBtYXg3NzY5M19jaGFyZ2VyX2lkW10gPSB7Ci0JeyAibWF4Nzc2OTMtY2hhcmdlciIsIDAsIH0sCi0JeyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShwbGF0Zm9ybSwgbWF4Nzc2OTNfY2hhcmdlcl9pZCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1heDc3NjkzX2NoYXJnZXJfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lCT0gIm1heDc3NjkzLWNoYXJnZXIiLAotCX0sCi0JLnByb2JlCQk9IG1heDc3NjkzX2NoYXJnZXJfcHJvYmUsCi0JLnJlbW92ZQkJPSBtYXg3NzY5M19jaGFyZ2VyX3JlbW92ZSwKLQkuaWRfdGFibGUJPSBtYXg3NzY5M19jaGFyZ2VyX2lkLAotfTsKLW1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobWF4Nzc2OTNfY2hhcmdlcl9kcml2ZXIpOwotCi1NT0RVTEVfQVVUSE9SKCJLcnp5c3p0b2YgS296bG93c2tpIDxrLmtvemxvd3NraUBzYW1zdW5nLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTWF4aW0gNzc2OTMgY2hhcmdlciBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvcG0yMzAxX2NoYXJnZXIuYyBiL2RyaXZlcnMvcG93ZXIvcG0yMzAxX2NoYXJnZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI2MmVkMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3Bvd2VyL3BtMjMwMV9jaGFyZ2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiBTVCBFcmljc3Nvbi4KLSAqCi0gKiBQb3dlciBzdXBwbHkgZHJpdmVyIGZvciBTVCBFcmljc3NvbiBwbTJ4eHhfY2hhcmdlciBjaGFyZ2VyCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9hYng1MDAvYWI4NTAwLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL2FieDUwMC9hYjg1MDAtYm0uaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvYWJ4NTAwL3V4NTAwX2NoYXJnYWxnLmg+Ci0jaW5jbHVkZSA8bGludXgvcG0yMzAxX2NoYXJnZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BtLmg+Ci0KLSNpbmNsdWRlICJwbTIzMDFfY2hhcmdlci5oIgotCi0jZGVmaW5lIHRvX3BtMnh4eF9jaGFyZ2VyX2FjX2RldmljZV9pbmZvKHgpIGNvbnRhaW5lcl9vZigoeCksIFwKLQkJc3RydWN0IHBtMnh4eF9jaGFyZ2VyLCBhY19jaGcpCi0jZGVmaW5lIFNMRUVQX01JTgkJNTAKLSNkZWZpbmUgU0xFRVBfTUFYCQkxMDAKLSNkZWZpbmUgUE0yWFhYX0FVVE9TVVNQRU5EX0RFTEFZIDUwMAotCi1zdGF0aWMgaW50IHBtMnh4eF9pbnRlcnJ1cHRfcmVnaXN0ZXJzW10gPSB7Ci0JUE0yWFhYX1JFR19JTlQxLAotCVBNMlhYWF9SRUdfSU5UMiwKLQlQTTJYWFhfUkVHX0lOVDMsCi0JUE0yWFhYX1JFR19JTlQ0LAotCVBNMlhYWF9SRUdfSU5UNSwKLQlQTTJYWFhfUkVHX0lOVDYsCi19OwotCi1zdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcG0yeHh4X2NoYXJnZXJfYWNfcHJvcHNbXSA9IHsKLQlQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEgsCi0JUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUsCi0JUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9BVkcsCi19OwotCi1zdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2VyX3ZvbHRhZ2VfbWFwW10gPSB7Ci0JMzUwMCwKLQkzNTI1LAotCTM1NTAsCi0JMzU3NSwKLQkzNjAwLAotCTM2MjUsCi0JMzY1MCwKLQkzNjc1LAotCTM3MDAsCi0JMzcyNSwKLQkzNzUwLAotCTM3NzUsCi0JMzgwMCwKLQkzODI1LAotCTM4NTAsCi0JMzg3NSwKLQkzOTAwLAotCTM5MjUsCi0JMzk1MCwKLQkzOTc1LAotCTQwMDAsCi0JNDAyNSwKLQk0MDUwLAotCTQwNzUsCi0JNDEwMCwKLQk0MTI1LAotCTQxNTAsCi0JNDE3NSwKLQk0MjAwLAotCTQyMjUsCi0JNDI1MCwKLQk0Mjc1LAotCTQzMDAsCi19OwotCi1zdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2VyX2N1cnJlbnRfbWFwW10gPSB7Ci0JMjAwLAotCTIwMCwKLQk0MDAsCi0JNjAwLAotCTgwMCwKLQkxMDAwLAotCTEyMDAsCi0JMTQwMCwKLQkxNjAwLAotCTE4MDAsCi0JMjAwMCwKLQkyMjAwLAotCTI0MDAsCi0JMjYwMCwKLQkyODAwLAotCTMwMDAsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgcG0yeHh4X2lkZW50W10gPSB7Ci0JeyAicG0yMzAxIiwgMCB9LAotCXsgfQotfTsKLQotc3RhdGljIHZvaWQgc2V0X2xwbl9waW4oc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIpCi17Ci0JaWYgKCFwbTItPmFjLmNoYXJnZXJfY29ubmVjdGVkICYmIGdwaW9faXNfdmFsaWQocG0yLT5scG5fcGluKSkgewotCQlncGlvX3NldF92YWx1ZShwbTItPmxwbl9waW4sIDEpOwotCQl1c2xlZXBfcmFuZ2UoU0xFRVBfTUlOLCBTTEVFUF9NQVgpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgY2xlYXJfbHBuX3BpbihzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMikKLXsKLQlpZiAoIXBtMi0+YWMuY2hhcmdlcl9jb25uZWN0ZWQgJiYgZ3Bpb19pc192YWxpZChwbTItPmxwbl9waW4pKQotCQlncGlvX3NldF92YWx1ZShwbTItPmxwbl9waW4sIDApOwotfQotCi1zdGF0aWMgaW50IHBtMnh4eF9yZWdfcmVhZChzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMiwgaW50IHJlZywgdTggKnZhbCkKLXsKLQlpbnQgcmV0OwotCi0JLyogd2FrZSB1cCB0aGUgZGV2aWNlICovCi0JcG1fcnVudGltZV9nZXRfc3luYyhwbTItPmRldik7Ci0KLQlyZXQgPSBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShwbTItPmNvbmZpZy5wbTJ4eHhfaTJjLCByZWcsCi0JCQkJMSwgdmFsKTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X2VycihwbTItPmRldiwgIkVycm9yIHJlYWRpbmcgcmVnaXN0ZXIgYXQgMHgleFxuIiwgcmVnKTsKLQllbHNlCi0JCXJldCA9IDA7Ci0KLQlwbV9ydW50aW1lX3B1dF9zeW5jKHBtMi0+ZGV2KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcG0yeHh4X3JlZ193cml0ZShzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMiwgaW50IHJlZywgdTggdmFsKQotewotCWludCByZXQ7Ci0KLQkvKiB3YWtlIHVwIHRoZSBkZXZpY2UgKi8KLQlwbV9ydW50aW1lX2dldF9zeW5jKHBtMi0+ZGV2KTsKLQotCXJldCA9IGkyY19zbWJ1c193cml0ZV9pMmNfYmxvY2tfZGF0YShwbTItPmNvbmZpZy5wbTJ4eHhfaTJjLCByZWcsCi0JCQkJMSwgJnZhbCk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIocG0yLT5kZXYsICJFcnJvciB3cml0aW5nIHJlZ2lzdGVyIGF0IDB4JXhcbiIsIHJlZyk7Ci0JZWxzZQotCQlyZXQgPSAwOwotCi0JcG1fcnVudGltZV9wdXRfc3luYyhwbTItPmRldik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2luZ19lbmFibGVfbW5ndChzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMikKLXsKLQlpbnQgcmV0OwotCi0JLyogRW5hYmxlIGNoYXJnaW5nICovCi0JcmV0ID0gcG0yeHh4X3JlZ193cml0ZShwbTIsIFBNMlhYWF9CQVRUX0NUUkxfUkVHMiwKLQkJCShQTTJYWFhfQ0hfQVVUT19SRVNVTUVfRU4gfCBQTTJYWFhfQ0hBUkdFUl9FTkEpKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcG0yeHh4X2NoYXJnaW5nX2Rpc2FibGVfbW5ndChzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMikKLXsKLQlpbnQgcmV0OwotCi0JLyogRGlzYWJsZSBTVyBFT0MgY3RybCAqLwotCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfU1dfQ1RSTF9SRUcsIFBNMlhYWF9TV0NUUkxfSFcpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIocG0yLT5kZXYsICIlcyBwbTJ4eHggd3JpdGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogRGlzYWJsZSBjaGFyZ2luZyAqLwotCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfQkFUVF9DVFJMX1JFRzIsCi0JCQkoUE0yWFhYX0NIX0FVVE9fUkVTVU1FX0RJUyB8IFBNMlhYWF9DSEFSR0VSX0RJUykpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIocG0yLT5kZXYsICIlcyBwbTJ4eHggd3JpdGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcG0yeHh4X2NoYXJnZXJfYmF0dF90aGVybV9tbmd0KHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yLCBpbnQgdmFsKQotewotCXF1ZXVlX3dvcmsocG0yLT5jaGFyZ2VyX3dxLCAmcG0yLT5jaGVja19tYWluX3RoZXJtYWxfcHJvdF93b3JrKTsKLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgcG0yeHh4X2NoYXJnZXJfZGllX3RoZXJtX21uZ3Qoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIsIGludCB2YWwpCi17Ci0JcXVldWVfd29yayhwbTItPmNoYXJnZXJfd3EsICZwbTItPmNoZWNrX21haW5fdGhlcm1hbF9wcm90X3dvcmspOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcG0yeHh4X2NoYXJnZXJfb3Z2X21uZ3Qoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIsIGludCB2YWwpCi17Ci0JZGV2X2VycihwbTItPmRldiwgIk92ZXJ2b2x0YWdlIGRldGVjdGVkXG4iKTsKLQlwbTItPmZsYWdzLm92diA9IHRydWU7Ci0JcG93ZXJfc3VwcGx5X2NoYW5nZWQocG0yLT5hY19jaGcucHN5KTsKLQotCS8qIFNjaGVkdWxlIGEgbmV3IEhXIGZhaWx1cmUgY2hlY2sgKi8KLQlxdWV1ZV9kZWxheWVkX3dvcmsocG0yLT5jaGFyZ2VyX3dxLCAmcG0yLT5jaGVja19od19mYWlsdXJlX3dvcmssIDApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcG0yeHh4X2NoYXJnZXJfd2RfZXhwX21uZ3Qoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIsIGludCB2YWwpCi17Ci0JZGV2X2RiZyhwbTItPmRldiAsICIyMCBtaW51dGVzIHdhdGNoZG9nIGV4cGlyZWRcbiIpOwotCi0JcG0yLT5hYy53ZF9leHBpcmVkID0gdHJ1ZTsKLQlwb3dlcl9zdXBwbHlfY2hhbmdlZChwbTItPmFjX2NoZy5wc3kpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcG0yeHh4X2NoYXJnZXJfdmJhdF9sc2lnX21uZ3Qoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIsIGludCB2YWwpCi17Ci0JaW50IHJldDsKLQotCXN3aXRjaCAodmFsKSB7Ci0JY2FzZSBQTTJYWFhfSU5UMV9JVFZCQVRMT1dSOgotCQlkZXZfZGJnKHBtMi0+ZGV2LCAiVkJBVCBncm93cyBhYm92ZSBWQkFUX0xPVyBsZXZlbFxuIik7Ci0JCS8qIEVuYWJsZSBTVyBFT0MgY3RybCAqLwotCQlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX1NXX0NUUkxfUkVHLAotCQkJCQkJCVBNMlhYWF9TV0NUUkxfU1cpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycihwbTItPmRldiwgIiVzIHBtMnh4eCB3cml0ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIFBNMlhYWF9JTlQxX0lUVkJBVExPV0Y6Ci0JCWRldl9kYmcocG0yLT5kZXYsICJWQkFUIGRyb3BzIGJlbG93IFZCQVRfTE9XIGxldmVsXG4iKTsKLQkJLyogRGlzYWJsZSBTVyBFT0MgY3RybCAqLwotCQlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX1NXX0NUUkxfUkVHLAotCQkJCQkJCVBNMlhYWF9TV0NUUkxfSFcpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycihwbTItPmRldiwgIiVzIHBtMnh4eCB3cml0ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlkZXZfZXJyKHBtMi0+ZGV2LCAiVW5rbm93biBWQkFUIGxldmVsXG4iKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwbTJ4eHhfY2hhcmdlcl9iYXRfZGlzY19tbmd0KHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yLCBpbnQgdmFsKQotewotCWRldl9kYmcocG0yLT5kZXYsICJiYXR0ZXJ5IGRpc2Nvbm5lY3RlZFxuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwbTJ4eHhfY2hhcmdlcl9kZXRlY3Rpb24oc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIsIHU4ICp2YWwpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IHBtMnh4eF9yZWdfcmVhZChwbTIsIFBNMlhYWF9TUkNFX1JFR19JTlQyLCB2YWwpOwotCi0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihwbTItPmRldiwgIkNoYXJnZXIgZGV0ZWN0aW9uIGZhaWxlZFxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCSp2YWwgJj0gKFBNMlhYWF9JTlQyX1NfSVRWUFdSMVBMVUcgfCBQTTJYWFhfSU5UMl9TX0lUVlBXUjJQTFVHKTsKLQotb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcG0yeHh4X2NoYXJnZXJfaXR2X3B3cl9wbHVnX21uZ3Qoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIsIGludCB2YWwpCi17Ci0KLQlpbnQgcmV0OwotCXU4IHJlYWRfdmFsOwotCi0JLyoKLQkgKiBTaW5jZSB3ZSBjYW4ndCBiZSBzdXJlIHRoYXQgdGhlIGV2ZW50cyBhcmUgcmVjZWl2ZWQKLQkgKiBzeW5jaHJvbm91c2x5LCB3ZSBoYXZlIHRoZSBjaGVjayBpZiB0aGUgbWFpbiBjaGFyZ2VyIGlzCi0JICogY29ubmVjdGVkIGJ5IHJlYWRpbmcgdGhlIGludGVycnVwdCBzb3VyY2UgcmVnaXN0ZXIuCi0JICovCi0JcmV0ID0gcG0yeHh4X2NoYXJnZXJfZGV0ZWN0aW9uKHBtMiwgJnJlYWRfdmFsKTsKLQotCWlmICgocmV0ID09IDApICYmIHJlYWRfdmFsKSB7Ci0JCXBtMi0+YWMuY2hhcmdlcl9jb25uZWN0ZWQgPSAxOwotCQlwbTItPmFjX2Nvbm4gPSB0cnVlOwotCQlxdWV1ZV93b3JrKHBtMi0+Y2hhcmdlcl93cSwgJnBtMi0+YWNfd29yayk7Ci0JfQotCi0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2VyX2l0dl9wd3JfdW5wbHVnX21uZ3Qoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIsCi0JCQkJCQkJCWludCB2YWwpCi17Ci0JcG0yLT5hYy5jaGFyZ2VyX2Nvbm5lY3RlZCA9IDA7Ci0JcXVldWVfd29yayhwbTItPmNoYXJnZXJfd3EsICZwbTItPmFjX3dvcmspOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcG0yX2ludF9yZWcwKHZvaWQgKnBtMl9kYXRhLCBpbnQgdmFsKQotewotCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yID0gcG0yX2RhdGE7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAodmFsICYgUE0yWFhYX0lOVDFfSVRWQkFUTE9XUikgewotCQlyZXQgPSBwbTJ4eHhfY2hhcmdlcl92YmF0X2xzaWdfbW5ndChwbTIsCi0JCQkJCQlQTTJYWFhfSU5UMV9JVFZCQVRMT1dSKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAodmFsICYgUE0yWFhYX0lOVDFfSVRWQkFUTE9XRikgewotCQlyZXQgPSBwbTJ4eHhfY2hhcmdlcl92YmF0X2xzaWdfbW5ndChwbTIsCi0JCQkJCQlQTTJYWFhfSU5UMV9JVFZCQVRMT1dGKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAodmFsICYgUE0yWFhYX0lOVDFfSVRWQkFURElTQ09OTkVDVCkgewotCQlyZXQgPSBwbTJ4eHhfY2hhcmdlcl9iYXRfZGlzY19tbmd0KHBtMiwKLQkJCQlQTTJYWFhfSU5UMV9JVFZCQVRESVNDT05ORUNUKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIG91dDsKLQl9Ci1vdXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBwbTJfaW50X3JlZzEodm9pZCAqcG0yX2RhdGEsIGludCB2YWwpCi17Ci0Jc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIgPSBwbTJfZGF0YTsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICh2YWwgJiAoUE0yWFhYX0lOVDJfSVRWUFdSMVBMVUcgfCBQTTJYWFhfSU5UMl9JVFZQV1IyUExVRykpIHsKLQkJZGV2X2RiZyhwbTItPmRldiAsICJNYWluIGNoYXJnZXIgcGx1Z2dlZFxuIik7Ci0JCXJldCA9IHBtMnh4eF9jaGFyZ2VyX2l0dl9wd3JfcGx1Z19tbmd0KHBtMiwgdmFsICYKLQkJCShQTTJYWFhfSU5UMl9JVFZQV1IxUExVRyB8IFBNMlhYWF9JTlQyX0lUVlBXUjJQTFVHKSk7Ci0JfQotCi0JaWYgKHZhbCAmCi0JCShQTTJYWFhfSU5UMl9JVFZQV1IxVU5QTFVHIHwgUE0yWFhYX0lOVDJfSVRWUFdSMlVOUExVRykpIHsKLQkJZGV2X2RiZyhwbTItPmRldiAsICJNYWluIGNoYXJnZXIgdW5wbHVnZ2VkXG4iKTsKLQkJcmV0ID0gcG0yeHh4X2NoYXJnZXJfaXR2X3B3cl91bnBsdWdfbW5ndChwbTIsIHZhbCAmCi0JCQkJCQkoUE0yWFhYX0lOVDJfSVRWUFdSMVVOUExVRyB8Ci0JCQkJCQlQTTJYWFhfSU5UMl9JVFZQV1IyVU5QTFVHKSk7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBwbTJfaW50X3JlZzIodm9pZCAqcG0yX2RhdGEsIGludCB2YWwpCi17Ci0Jc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIgPSBwbTJfZGF0YTsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICh2YWwgJiBQTTJYWFhfSU5UM19JVEFVVE9USU1FT1VUV0QpCi0JCXJldCA9IHBtMnh4eF9jaGFyZ2VyX3dkX2V4cF9tbmd0KHBtMiwgdmFsKTsKLQotCWlmICh2YWwgJiAoUE0yWFhYX0lOVDNfSVRDSFBSRUNIQVJHRVdEIHwKLQkJCQlQTTJYWFhfSU5UM19JVENIQ0NXRCB8IFBNMlhYWF9JTlQzX0lUQ0hDVldEKSkgewotCQlkZXZfZGJnKHBtMi0+ZGV2LAotCQkJIldhdGNoZG9nIG9jY3VycmVkIGZvciBwcmVjaGFyZ2UsIENDIGFuZCBDViBjaGFyZ2VcbiIpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcG0yX2ludF9yZWczKHZvaWQgKnBtMl9kYXRhLCBpbnQgdmFsKQotewotCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yID0gcG0yX2RhdGE7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAodmFsICYgKFBNMlhYWF9JTlQ0X0lUQ0hBUkdJTkdPTikpIHsKLQkJZGV2X2RiZyhwbTItPmRldiAsCi0JCQkiY2hhcmdpbmQgb3BlcmF0aW9uIGhhcyBzdGFydGVkXG4iKTsKLQl9Ci0KLQlpZiAodmFsICYgKFBNMlhYWF9JTlQ0X0lUVlJFU1VNRSkpIHsKLQkJZGV2X2RiZyhwbTItPmRldiwKLQkJCSJiYXR0ZXJ5IGRpc2NoYXJnZWQgZG93biB0byBWUmVzdW1lIHRocmVzaG9sZFxuIik7Ci0JfQotCi0JaWYgKHZhbCAmIChQTTJYWFhfSU5UNF9JVEJBVFRGVUxMKSkgewotCQlkZXZfZGJnKHBtMi0+ZGV2ICwgImJhdHRlcnkgZnVsbHkgZGV0ZWN0ZWRcbiIpOwotCX0KLQotCWlmICh2YWwgJiAoUE0yWFhYX0lOVDRfSVRDVlBIQVNFKSkgewotCQlkZXZfZGJnKHBtMi0+ZGV2LCAiQ1YgcGhhc2UgZW50ZXIgd2l0aCAwLjVDIGNoYXJnaW5nXG4iKTsKLQl9Ci0KLQlpZiAodmFsICYgKFBNMlhYWF9JTlQ0X0lUVlBXUjJPVlYgfCBQTTJYWFhfSU5UNF9JVFZQV1IxT1ZWKSkgewotCQlwbTItPmZhaWx1cmVfY2FzZSA9IFZQV1JfT1ZWOwotCQlyZXQgPSBwbTJ4eHhfY2hhcmdlcl9vdnZfbW5ndChwbTIsIHZhbCAmCi0JCQkoUE0yWFhYX0lOVDRfSVRWUFdSMk9WViB8IFBNMlhYWF9JTlQ0X0lUVlBXUjFPVlYpKTsKLQkJZGV2X2RiZyhwbTItPmRldiwgIlZQV1IvVlNZU1RFTSBvdmVydm9sdGFnZSBkZXRlY3RlZFxuIik7Ci0JfQotCi0JaWYgKHZhbCAmIChQTTJYWFhfSU5UNF9TX0lUQkFUVEVNUENPTEQgfAotCQkJCVBNMlhYWF9JTlQ0X1NfSVRCQVRURU1QSE9UKSkgewotCQlyZXQgPSBwbTJ4eHhfY2hhcmdlcl9iYXR0X3RoZXJtX21uZ3QocG0yLCB2YWwgJgotCQkJKFBNMlhYWF9JTlQ0X1NfSVRCQVRURU1QQ09MRCB8Ci0JCQlQTTJYWFhfSU5UNF9TX0lUQkFUVEVNUEhPVCkpOwotCQlkZXZfZGJnKHBtMi0+ZGV2LCAiQlRFTVAgaXMgdG9vIExvdy9IaWdoXG4iKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHBtMl9pbnRfcmVnNCh2b2lkICpwbTJfZGF0YSwgaW50IHZhbCkKLXsKLQlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMiA9IHBtMl9kYXRhOwotCWludCByZXQgPSAwOwotCi0JaWYgKHZhbCAmIFBNMlhYWF9JTlQ1X0lUVlNZU1RFTU9WVikgewotCQlwbTItPmZhaWx1cmVfY2FzZSA9IFZTWVNURU1fT1ZWOwotCQlyZXQgPSBwbTJ4eHhfY2hhcmdlcl9vdnZfbW5ndChwbTIsIHZhbCAmCi0JCQkJCQlQTTJYWFhfSU5UNV9JVFZTWVNURU1PVlYpOwotCQlkZXZfZGJnKHBtMi0+ZGV2LCAiVlNZU1RFTSBvdmVydm9sdGFnZSBkZXRlY3RlZFxuIik7Ci0JfQotCi0JaWYgKHZhbCAmIChQTTJYWFhfSU5UNV9JVFRIRVJNQUxXQVJOSU5HRkFMTCB8Ci0JCQkJUE0yWFhYX0lOVDVfSVRUSEVSTUFMV0FSTklOR1JJU0UgfAotCQkJCVBNMlhYWF9JTlQ1X0lUVEhFUk1BTFNIVVRET1dORkFMTCB8Ci0JCQkJUE0yWFhYX0lOVDVfSVRUSEVSTUFMU0hVVERPV05SSVNFKSkgewotCQlkZXZfZGJnKHBtMi0+ZGV2LCAiQlRFTVAgZGllIHRlbXBlcmF0dXJlIGlzIHRvbyBMb3cvSGlnaFxuIik7Ci0JCXJldCA9IHBtMnh4eF9jaGFyZ2VyX2RpZV90aGVybV9tbmd0KHBtMiwgdmFsICYKLQkJCShQTTJYWFhfSU5UNV9JVFRIRVJNQUxXQVJOSU5HRkFMTCB8Ci0JCQlQTTJYWFhfSU5UNV9JVFRIRVJNQUxXQVJOSU5HUklTRSB8Ci0JCQlQTTJYWFhfSU5UNV9JVFRIRVJNQUxTSFVURE9XTkZBTEwgfAotCQkJUE0yWFhYX0lOVDVfSVRUSEVSTUFMU0hVVERPV05SSVNFKSk7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBwbTJfaW50X3JlZzUodm9pZCAqcG0yX2RhdGEsIGludCB2YWwpCi17Ci0Jc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIgPSBwbTJfZGF0YTsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICh2YWwgJiAoUE0yWFhYX0lOVDZfSVRWUFdSMkRST1AgfCBQTTJYWFhfSU5UNl9JVFZQV1IxRFJPUCkpIHsKLQkJZGV2X2RiZyhwbTItPmRldiwgIlZNUFdSIGRyb3AgdG8gVkJBVCBsZXZlbFxuIik7Ci0JfQotCi0JaWYgKHZhbCAmIChQTTJYWFhfSU5UNl9JVFZQV1IyVkFMSURSSVNFIHwKLQkJCVBNMlhYWF9JTlQ2X0lUVlBXUjFWQUxJRFJJU0UgfAotCQkJUE0yWFhYX0lOVDZfSVRWUFdSMlZBTElERkFMTCB8Ci0JCQlQTTJYWFhfSU5UNl9JVFZQV1IxVkFMSURGQUxMKSkgewotCQlkZXZfZGJnKHBtMi0+ZGV2LCAiRmFsbGluZy9SaXNpbmcgZWRnZSBvbiBXUFdSMS8yXG4iKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgIHBtMnh4eF9pcnFfaW50KGludCBpcnEsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIgPSBkYXRhOwotCXN0cnVjdCBwbTJ4eHhfaW50ZXJydXB0cyAqaW50ZXJydXB0ID0gcG0yLT5wbTJfaW50OwotCWludCBpOwotCi0JLyogd2FrZSB1cCB0aGUgZGV2aWNlICovCi0JcG1fcnVudGltZV9nZXRfc3luYyhwbTItPmRldik7Ci0KLQlkbyB7Ci0JCWZvciAoaSA9IDA7IGkgPCBQTTJYWFhfTlVNX0lOVF9SRUc7IGkrKykgewotCQkJcG0yeHh4X3JlZ19yZWFkKHBtMiwKLQkJCQlwbTJ4eHhfaW50ZXJydXB0X3JlZ2lzdGVyc1tpXSwKLQkJCQkmKGludGVycnVwdC0+cmVnW2ldKSk7Ci0KLQkJCWlmIChpbnRlcnJ1cHQtPnJlZ1tpXSA+IDApCi0JCQkJaW50ZXJydXB0LT5oYW5kbGVyW2ldKHBtMiwgaW50ZXJydXB0LT5yZWdbaV0pOwotCQl9Ci0JfSB3aGlsZSAoZ3Bpb19nZXRfdmFsdWUocG0yLT5wZGF0YS0+Z3Bpb19pcnFfbnVtYmVyKSA9PSAwKTsKLQotCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3kocG0yLT5kZXYpOwotCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKHBtMi0+ZGV2KTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIGludCBwbTJ4eHhfY2hhcmdlcl9nZXRfYWNfY3Yoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIpCi17Ci0JaW50IHJldCA9IDA7Ci0JdTggdmFsOwotCi0JaWYgKHBtMi0+YWMuY2hhcmdlcl9jb25uZWN0ZWQgJiYgcG0yLT5hYy5jaGFyZ2VyX29ubGluZSkgewotCi0JCXJldCA9IHBtMnh4eF9yZWdfcmVhZChwbTIsIFBNMlhYWF9TUkNFX1JFR19JTlQ0LCAmdmFsKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIocG0yLT5kZXYsICIlcyBwbTJ4eHggcmVhZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJaWYgKHZhbCAmIFBNMlhYWF9JTlQ0X1NfSVRDVlBIQVNFKQotCQkJcmV0ID0gUE0yWFhYX0NPTlNUX1ZPTFQ7Ci0JCWVsc2UKLQkJCXJldCA9IFBNMlhYWF9DT05TVF9DVVJSOwotCX0KLW91dDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHBtMnh4eF9jdXJyZW50X3RvX3JlZ3ZhbChpbnQgY3VycikKLXsKLQlpbnQgaTsKLQotCWlmIChjdXJyIDwgcG0yeHh4X2NoYXJnZXJfY3VycmVudF9tYXBbMF0pCi0JCXJldHVybiAwOwotCi0JZm9yIChpID0gMTsgaSA8IEFSUkFZX1NJWkUocG0yeHh4X2NoYXJnZXJfY3VycmVudF9tYXApOyBpKyspIHsKLQkJaWYgKGN1cnIgPCBwbTJ4eHhfY2hhcmdlcl9jdXJyZW50X21hcFtpXSkKLQkJCXJldHVybiAoaSAtIDEpOwotCX0KLQotCWkgPSBBUlJBWV9TSVpFKHBtMnh4eF9jaGFyZ2VyX2N1cnJlbnRfbWFwKSAtIDE7Ci0JaWYgKGN1cnIgPT0gcG0yeHh4X2NoYXJnZXJfY3VycmVudF9tYXBbaV0pCi0JCXJldHVybiBpOwotCWVsc2UKLQkJcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgcG0yeHh4X3ZvbHRhZ2VfdG9fcmVndmFsKGludCBjdXJyKQotewotCWludCBpOwotCi0JaWYgKGN1cnIgPCBwbTJ4eHhfY2hhcmdlcl92b2x0YWdlX21hcFswXSkKLQkJcmV0dXJuIDA7Ci0KLQlmb3IgKGkgPSAxOyBpIDwgQVJSQVlfU0laRShwbTJ4eHhfY2hhcmdlcl92b2x0YWdlX21hcCk7IGkrKykgewotCQlpZiAoY3VyciA8IHBtMnh4eF9jaGFyZ2VyX3ZvbHRhZ2VfbWFwW2ldKQotCQkJcmV0dXJuIGkgLSAxOwotCX0KLQotCWkgPSBBUlJBWV9TSVpFKHBtMnh4eF9jaGFyZ2VyX3ZvbHRhZ2VfbWFwKSAtIDE7Ci0JaWYgKGN1cnIgPT0gcG0yeHh4X2NoYXJnZXJfdm9sdGFnZV9tYXBbaV0pCi0JCXJldHVybiBpOwotCWVsc2UKLQkJcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgcG0yeHh4X2NoYXJnZXJfdXBkYXRlX2NoYXJnZXJfY3VycmVudChzdHJ1Y3QgdXg1MDBfY2hhcmdlciAqY2hhcmdlciwKLQkJaW50IGljaF9vdXQpCi17Ci0JaW50IHJldDsKLQlpbnQgY3Vycl9pbmRleDsKLQlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMjsKLQl1OCB2YWw7Ci0KLQlpZiAoY2hhcmdlci0+cHN5LT5kZXNjLT50eXBlID09IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TKQotCQlwbTIgPSB0b19wbTJ4eHhfY2hhcmdlcl9hY19kZXZpY2VfaW5mbyhjaGFyZ2VyKTsKLQllbHNlCi0JCXJldHVybiAtRU5YSU87Ci0KLQljdXJyX2luZGV4ID0gcG0yeHh4X2N1cnJlbnRfdG9fcmVndmFsKGljaF9vdXQpOwotCWlmIChjdXJyX2luZGV4IDwgMCkgewotCQlkZXZfZXJyKHBtMi0+ZGV2LAotCQkJIkNoYXJnZXIgY3VycmVudCB0b28gaGlnaCwgY2hhcmdpbmcgbm90IHN0YXJ0ZWRcbiIpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQotCXJldCA9IHBtMnh4eF9yZWdfcmVhZChwbTIsIFBNMlhYWF9CQVRUX0NUUkxfUkVHNiwgJnZhbCk7Ci0JaWYgKHJldCA+PSAwKSB7Ci0JCXZhbCAmPSB+UE0yWFhYX0RJUl9DSF9DQ19DVVJSRU5UX01BU0s7Ci0JCXZhbCB8PSBjdXJyX2luZGV4OwotCQlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0JBVFRfQ1RSTF9SRUc2LCB2YWwpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycihwbTItPmRldiwKLQkJCQkiJXMgd3JpdGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCX0KLQl9Ci0JZWxzZQotCQlkZXZfZXJyKHBtMi0+ZGV2LCAiJXMgcmVhZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcG0yeHh4X2NoYXJnZXJfYWNfZ2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKLQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCi0JdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKLXsKLQlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMjsKLQotCXBtMiA9IHRvX3BtMnh4eF9jaGFyZ2VyX2FjX2RldmljZV9pbmZvKHBzeV90b191eDUwMF9jaGFyZ2VyKHBzeSkpOwotCi0Jc3dpdGNoIChwc3ApIHsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSDoKLQkJaWYgKHBtMi0+ZmxhZ3MubWFpbmV4dGNobm90b2spCi0JCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfVU5TUEVDX0ZBSUxVUkU7Ci0JCWVsc2UgaWYgKHBtMi0+YWMud2RfZXhwaXJlZCkKLQkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9ERUFEOwotCQllbHNlIGlmIChwbTItPmZsYWdzLm1haW5fdGhlcm1hbF9wcm90KQotCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJIRUFUOwotCQllbHNlIGlmIChwbTItPmZsYWdzLm92dikKLQkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSVk9MVEFHRTsKLQkJZWxzZQotCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0Q7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FOgotCQl2YWwtPmludHZhbCA9IHBtMi0+YWMuY2hhcmdlcl9vbmxpbmU7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDoKLQkJdmFsLT5pbnR2YWwgPSBwbTItPmFjLmNoYXJnZXJfY29ubmVjdGVkOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfQVZHOgotCQlwbTItPmFjLmN2X2FjdGl2ZSA9IHBtMnh4eF9jaGFyZ2VyX2dldF9hY19jdihwbTIpOwotCQl2YWwtPmludHZhbCA9IHBtMi0+YWMuY3ZfYWN0aXZlOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcG0yeHh4X2NoYXJnaW5nX2luaXQoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQkvKiBlbmFibGUgQ0MgYW5kIENWIHdhdGNoZG9nICovCi0JcmV0ID0gcG0yeHh4X3JlZ193cml0ZShwbTIsIFBNMlhYWF9CQVRUX0NUUkxfUkVHMywKLQkJKFBNMlhYWF9DSF9XRF9DVl9QSEFTRV82ME1JTiB8IFBNMlhYWF9DSF9XRF9DQ19QSEFTRV82ME1JTikpOwotCWlmKCByZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JLyogZW5hYmxlIHByZWNoYXJnZSB3YXRjaGRvZyAqLwotCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfQkFUVF9DVFJMX1JFRzQsCi0JCQkJCVBNMlhYWF9DSF9XRF9QUkVDSF9QSEFTRV82ME1JTik7Ci0KLQkvKiBEaXNhYmxlIGF1dG8gdGltZW91dCAqLwotCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfQkFUVF9DVFJMX1JFRzUsCi0JCQkJCVBNMlhYWF9DSF9XRF9BVVRPX1RJTUVPVVRfMjBNSU4pOwotCi0JLyoKLSAgICAgKiBFT0MgY3VycmVudCBsZXZlbCA9IDEwMG1BCi0JICogUHJlY2hhcmdlIGN1cnJlbnQgbGV2ZWwgPSAxMDBtQQotCSAqIENDIGN1cnJlbnQgbGV2ZWwgPSAxMDAwbUEKLQkgKi8KLQlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0JBVFRfQ1RSTF9SRUc2LAotCQkoUE0yWFhYX0RJUl9DSF9DQ19DVVJSRU5UXzEwMDBNQSB8Ci0JCVBNMlhYWF9DSF9QUkVDSF9DVVJSRU5UXzEwME1BIHwKLQkJUE0yWFhYX0NIX0VPQ19DVVJSRU5UXzEwME1BKSk7Ci0KLQkvKgotICAgICAqIHJlY2hhcmdlIHRocmVzaG9sZCA9IDMuOFYKLQkgKiBQcmVjaGFyZ2UgdG8gQ0MgdGhyZXNob2xkID0gMi45VgotCSAqLwotCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfQkFUVF9DVFJMX1JFRzcsCi0JCShQTTJYWFhfQ0hfUFJFQ0hfVk9MXzJfOSB8IFBNMlhYWF9DSF9WUkVTVU1FX1ZPTF8zXzgpKTsKLQotCS8qIGZsb2F0IHZvbHRhZ2UgY2hhcmdlciBsZXZlbCA9IDQuMlYgKi8KLQlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0JBVFRfQ1RSTF9SRUc4LAotCQlQTTJYWFhfQ0hfVk9MVF80XzIpOwotCi0JLyogVm9sdGFnZSBkcm9wIGJldHdlZW4gVkJBVCBhbmQgVlNZUyBpbiBIVyBjaGFyZ2luZyA9IDMwMG1WICovCi0JcmV0ID0gcG0yeHh4X3JlZ193cml0ZShwbTIsIFBNMlhYWF9CQVRUX0NUUkxfUkVHOSwKLQkJKFBNMlhYWF9DSF8xNTBNVl9EUk9QXzMwME1WIHwgUE0yWFhYX0NIQVJDSElOR19JTkZPX0RJUyB8Ci0JCVBNMlhYWF9DSF9DQ19SRURVQ0VEX0NVUlJFTlRfSURFTlQgfAotCQlQTTJYWFhfQ0hfQ0NfTU9ERURST1BfRElTKSk7Ci0KLQkvKiBJbnB1dCBjaGFyZ2VyIGxldmVsIG9mIG92ZXIgdm9sdGFnZSA9IDEwViAqLwotCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfSU5QX1ZPTFRfVlBXUjIsCi0JCQkJCVBNMlhYWF9WUFdSMl9PVlZfMTApOwotCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfSU5QX1ZPTFRfVlBXUjEsCi0JCQkJCVBNMlhYWF9WUFdSMV9PVlZfMTApOwotCi0JLyogSW5wdXQgY2hhcmdlciBkcm9wICovCi0JcmV0ID0gcG0yeHh4X3JlZ193cml0ZShwbTIsIFBNMlhYWF9JTlBfRFJPUF9WUFdSMiwKLQkJKFBNMlhYWF9WUFdSMl9IV19PUFRfRElTIHwgUE0yWFhYX1ZQV1IyX1ZBTElEX0RJUyB8Ci0JCVBNMlhYWF9WUFdSMl9EUk9QX0RJUykpOwotCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfSU5QX0RST1BfVlBXUjEsCi0JCShQTTJYWFhfVlBXUjFfSFdfT1BUX0RJUyB8IFBNMlhYWF9WUFdSMV9WQUxJRF9ESVMgfAotCQlQTTJYWFhfVlBXUjFfRFJPUF9ESVMpKTsKLQotCS8qIERpc2FibGUgYmF0dGVyeSBsb3cgbW9uaXRvcmluZyAqLwotCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfQkFUVF9MT1dfTEVWX0NPTVBfUkVHLAotCQlQTTJYWFhfVkJBVF9MT1dfTU9OSVRPUklOR19FTkEpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBwbTJ4eHhfY2hhcmdlcl9hY19lbihzdHJ1Y3QgdXg1MDBfY2hhcmdlciAqY2hhcmdlciwKLQlpbnQgZW5hYmxlLCBpbnQgdnNldCwgaW50IGlzZXQpCi17Ci0JaW50IHJldDsKLQlpbnQgdm9sdF9pbmRleDsKLQlpbnQgY3Vycl9pbmRleDsKLQl1OCB2YWw7Ci0KLQlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMiA9IHRvX3BtMnh4eF9jaGFyZ2VyX2FjX2RldmljZV9pbmZvKGNoYXJnZXIpOwotCi0JaWYgKGVuYWJsZSkgewotCQlpZiAoIXBtMi0+YWMuY2hhcmdlcl9jb25uZWN0ZWQpIHsKLQkJCWRldl9kYmcocG0yLT5kZXYsICJBQyBjaGFyZ2VyIG5vdCBjb25uZWN0ZWRcbiIpOwotCQkJcmV0dXJuIC1FTlhJTzsKLQkJfQotCi0JCWRldl9kYmcocG0yLT5kZXYsICJFbmFibGUgQUM6ICVkbVYgJWRtQVxuIiwgdnNldCwgaXNldCk7Ci0JCWlmICghcG0yLT52ZGRhZGNfZW5fYWMpIHsKLQkJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUocG0yLT5yZWd1KTsKLQkJCWlmIChyZXQpCi0JCQkJZGV2X3dhcm4ocG0yLT5kZXYsCi0JCQkJCSJGYWlsZWQgdG8gZW5hYmxlIHZkZGFkYyByZWd1bGF0b3JcbiIpOwotCQkJZWxzZQotCQkJCXBtMi0+dmRkYWRjX2VuX2FjID0gdHJ1ZTsKLQkJfQotCi0JCXJldCA9IHBtMnh4eF9jaGFyZ2luZ19pbml0KHBtMik7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKHBtMi0+ZGV2LCAiJXMgY2hhcmdpbmcgaW5pdCBmYWlsZWRcbiIsCi0JCQkJCV9fZnVuY19fKTsKLQkJCWdvdG8gZXJyb3Jfb2NjdXJlZDsKLQkJfQotCi0JCXZvbHRfaW5kZXggPSBwbTJ4eHhfdm9sdGFnZV90b19yZWd2YWwodnNldCk7Ci0JCWN1cnJfaW5kZXggPSBwbTJ4eHhfY3VycmVudF90b19yZWd2YWwoaXNldCk7Ci0KLQkJaWYgKHZvbHRfaW5kZXggPCAwIHx8IGN1cnJfaW5kZXggPCAwKSB7Ci0JCQlkZXZfZXJyKHBtMi0+ZGV2LAotCQkJCSJDaGFyZ2VyIHZvbHRhZ2Ugb3IgY3VycmVudCB0b28gaGlnaCwgIgotCQkJCSJjaGFyZ2luZyBub3Qgc3RhcnRlZFxuIik7Ci0JCQlyZXR1cm4gLUVOWElPOwotCQl9Ci0KLQkJcmV0ID0gcG0yeHh4X3JlZ19yZWFkKHBtMiwgUE0yWFhYX0JBVFRfQ1RSTF9SRUc4LCAmdmFsKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIocG0yLT5kZXYsICIlcyBwbTJ4eHggcmVhZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCWdvdG8gZXJyb3Jfb2NjdXJlZDsKLQkJfQotCQl2YWwgJj0gflBNMlhYWF9DSF9WT0xUX01BU0s7Ci0JCXZhbCB8PSB2b2x0X2luZGV4OwotCQlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0JBVFRfQ1RSTF9SRUc4LCB2YWwpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycihwbTItPmRldiwgIiVzIHBtMnh4eCB3cml0ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCWdvdG8gZXJyb3Jfb2NjdXJlZDsKLQkJfQotCi0JCXJldCA9IHBtMnh4eF9yZWdfcmVhZChwbTIsIFBNMlhYWF9CQVRUX0NUUkxfUkVHNiwgJnZhbCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKHBtMi0+ZGV2LCAiJXMgcG0yeHh4IHJlYWQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlnb3RvIGVycm9yX29jY3VyZWQ7Ci0JCX0KLQkJdmFsICY9IH5QTTJYWFhfRElSX0NIX0NDX0NVUlJFTlRfTUFTSzsKLQkJdmFsIHw9IGN1cnJfaW5kZXg7Ci0JCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfQkFUVF9DVFJMX1JFRzYsIHZhbCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKHBtMi0+ZGV2LCAiJXMgcG0yeHh4IHdyaXRlIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJZ290byBlcnJvcl9vY2N1cmVkOwotCQl9Ci0KLQkJaWYgKCFwbTItPmJhdC0+ZW5hYmxlX292ZXJzaG9vdCkgewotCQkJcmV0ID0gcG0yeHh4X3JlZ19yZWFkKHBtMiwgUE0yWFhYX0xFRF9DVFJMX1JFRywgJnZhbCk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCWRldl9lcnIocG0yLT5kZXYsICIlcyBwbTJ4eHggcmVhZCBmYWlsZWRcbiIsCi0JCQkJCQkJCV9fZnVuY19fKTsKLQkJCQlnb3RvIGVycm9yX29jY3VyZWQ7Ci0JCQl9Ci0JCQl2YWwgfD0gUE0yWFhYX0FOVElfT1ZFUlNIT09UX0VOOwotCQkJcmV0ID0gcG0yeHh4X3JlZ193cml0ZShwbTIsIFBNMlhYWF9MRURfQ1RSTF9SRUcsIHZhbCk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCWRldl9lcnIocG0yLT5kZXYsICIlcyBwbTJ4eHggd3JpdGUgZmFpbGVkXG4iLAotCQkJCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJZ290byBlcnJvcl9vY2N1cmVkOwotCQkJfQotCQl9Ci0KLQkJcmV0ID0gcG0yeHh4X2NoYXJnaW5nX2VuYWJsZV9tbmd0KHBtMik7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKHBtMi0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSIKLQkJCQkJCSJwbTJ4eHggYWMgY2hhcmdlclxuIik7Ci0JCQlnb3RvIGVycm9yX29jY3VyZWQ7Ci0JCX0KLQotCQlwbTItPmFjLmNoYXJnZXJfb25saW5lID0gMTsKLQl9IGVsc2UgewotCQlwbTItPmFjLmNoYXJnZXJfb25saW5lID0gMDsKLQkJcG0yLT5hYy53ZF9leHBpcmVkID0gZmFsc2U7Ci0KLQkJLyogRGlzYWJsZSByZWd1bGF0b3IgaWYgZW5hYmxlZCAqLwotCQlpZiAocG0yLT52ZGRhZGNfZW5fYWMpIHsKLQkJCXJlZ3VsYXRvcl9kaXNhYmxlKHBtMi0+cmVndSk7Ci0JCQlwbTItPnZkZGFkY19lbl9hYyA9IGZhbHNlOwotCQl9Ci0KLQkJcmV0ID0gcG0yeHh4X2NoYXJnaW5nX2Rpc2FibGVfbW5ndChwbTIpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycihwbTItPmRldiwgImZhaWxlZCB0byBkaXNhYmxlIgotCQkJCQkJInBtMnh4eCBhYyBjaGFyZ2VyXG4iKTsKLQkJCWdvdG8gZXJyb3Jfb2NjdXJlZDsKLQkJfQotCi0JCWRldl9kYmcocG0yLT5kZXYsICJQTTIzMDE6ICIgIkRpc2FibGVkIEFDIGNoYXJnaW5nXG4iKTsKLQl9Ci0JcG93ZXJfc3VwcGx5X2NoYW5nZWQocG0yLT5hY19jaGcucHN5KTsKLQotZXJyb3Jfb2NjdXJlZDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2VyX3dhdGNoZG9nX2tpY2soc3RydWN0IHV4NTAwX2NoYXJnZXIgKmNoYXJnZXIpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMjsKLQotCWlmIChjaGFyZ2VyLT5wc3ktPmRlc2MtPnR5cGUgPT0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlMpCi0JCXBtMiA9IHRvX3BtMnh4eF9jaGFyZ2VyX2FjX2RldmljZV9pbmZvKGNoYXJnZXIpOwotCWVsc2UKLQkJcmV0dXJuIC1FTlhJTzsKLQotCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfQkFUVF9XRF9LSUNLLCBXRF9USU1FUik7Ci0JaWYgKHJldCkKLQkJZGV2X2VycihwbTItPmRldiwgIkZhaWxlZCB0byBraWNrIFdEIVxuIik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBwbTJ4eHhfY2hhcmdlcl9hY193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMiA9IGNvbnRhaW5lcl9vZih3b3JrLAotCQlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIsIGFjX3dvcmspOwotCi0KLQlwb3dlcl9zdXBwbHlfY2hhbmdlZChwbTItPmFjX2NoZy5wc3kpOwotCXN5c2ZzX25vdGlmeSgmcG0yLT5hY19jaGcucHN5LT5kZXYua29iaiwgTlVMTCwgInByZXNlbnQiKTsKLX07Ci0KLXN0YXRpYyB2b2lkIHBtMnh4eF9jaGFyZ2VyX2NoZWNrX2h3X2ZhaWx1cmVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0JdTggcmVnX3ZhbHVlOwotCi0Jc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIgPSBjb250YWluZXJfb2Yod29yaywKLQkJc3RydWN0IHBtMnh4eF9jaGFyZ2VyLCBjaGVja19od19mYWlsdXJlX3dvcmsud29yayk7Ci0KLQlpZiAocG0yLT5mbGFncy5vdnYpIHsKLQkJcG0yeHh4X3JlZ19yZWFkKHBtMiwgUE0yWFhYX1NSQ0VfUkVHX0lOVDQsICZyZWdfdmFsdWUpOwotCi0JCWlmICghKHJlZ192YWx1ZSAmIChQTTJYWFhfSU5UNF9TX0lUVlBXUjFPVlYgfAotCQkJCQlQTTJYWFhfSU5UNF9TX0lUVlBXUjJPVlYpKSkgewotCQkJcG0yLT5mbGFncy5vdnYgPSBmYWxzZTsKLQkJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKHBtMi0+YWNfY2hnLnBzeSk7Ci0JCX0KLQl9Ci0KLQkvKiBJZiB3ZSBzdGlsbCBoYXZlIGEgZmFpbHVyZSwgc2NoZWR1bGUgYSBuZXcgY2hlY2sgKi8KLQlpZiAocG0yLT5mbGFncy5vdnYpIHsKLQkJcXVldWVfZGVsYXllZF93b3JrKHBtMi0+Y2hhcmdlcl93cSwKLQkJCSZwbTItPmNoZWNrX2h3X2ZhaWx1cmVfd29yaywgcm91bmRfamlmZmllcyhIWikpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgcG0yeHh4X2NoYXJnZXJfY2hlY2tfbWFpbl90aGVybWFsX3Byb3Rfd29yaygKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0JaW50IHJldDsKLQl1OCB2YWw7Ci0KLQlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIsCi0JCQkJCWNoZWNrX21haW5fdGhlcm1hbF9wcm90X3dvcmspOwotCi0JLyogQ2hlY2sgaWYgZGllIHRlbXAgd2FybmluZyBpcyBzdGlsbCBhY3RpdmUgKi8KLQlyZXQgPSBwbTJ4eHhfcmVnX3JlYWQocG0yLCBQTTJYWFhfU1JDRV9SRUdfSU5UNSwgJnZhbCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihwbTItPmRldiwgIiVzIHBtMnh4eCByZWFkIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCWlmICh2YWwgJiAoUE0yWFhYX0lOVDVfU19JVFRIRVJNQUxXQVJOSU5HUklTRQotCQkJfCBQTTJYWFhfSU5UNV9TX0lUVEhFUk1BTFNIVVRET1dOUklTRSkpCi0JCXBtMi0+ZmxhZ3MubWFpbl90aGVybWFsX3Byb3QgPSB0cnVlOwotCWVsc2UgaWYgKHZhbCAmIChQTTJYWFhfSU5UNV9TX0lUVEhFUk1BTFdBUk5JTkdGQUxMCi0JCQkJfCBQTTJYWFhfSU5UNV9TX0lUVEhFUk1BTFNIVVRET1dORkFMTCkpCi0JCXBtMi0+ZmxhZ3MubWFpbl90aGVybWFsX3Byb3QgPSBmYWxzZTsKLQotCXBvd2VyX3N1cHBseV9jaGFuZ2VkKHBtMi0+YWNfY2hnLnBzeSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcG0yeHh4X2ludGVycnVwdHMgcG0yeHh4X2ludCA9IHsKLQkuaGFuZGxlclswXSA9IHBtMl9pbnRfcmVnMCwKLQkuaGFuZGxlclsxXSA9IHBtMl9pbnRfcmVnMSwKLQkuaGFuZGxlclsyXSA9IHBtMl9pbnRfcmVnMiwKLQkuaGFuZGxlclszXSA9IHBtMl9pbnRfcmVnMywKLQkuaGFuZGxlcls0XSA9IHBtMl9pbnRfcmVnNCwKLQkuaGFuZGxlcls1XSA9IHBtMl9pbnRfcmVnNSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcG0yeHh4X2lycSBwbTJ4eHhfY2hhcmdlcl9pcnFbXSA9IHsKLQl7IlBNMlhYWF9JUlFfSU5UIiwgcG0yeHh4X2lycV9pbnR9LAotfTsKLQotc3RhdGljIGludCBfX21heWJlX3VudXNlZCBwbTJ4eHhfd2FsbF9jaGFyZ2VyX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGkyY19jbGllbnQgKmkyY19jbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTI7Ci0KLQlwbTIgPSAgKHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqKWkyY19nZXRfY2xpZW50ZGF0YShpMmNfY2xpZW50KTsKLQlzZXRfbHBuX3BpbihwbTIpOwotCi0JLyogSWYgd2Ugc3RpbGwgaGF2ZSBhIEhXIGZhaWx1cmUsIHNjaGVkdWxlIGEgbmV3IGNoZWNrICovCi0JaWYgKHBtMi0+ZmxhZ3Mub3Z2KQotCQlxdWV1ZV9kZWxheWVkX3dvcmsocG0yLT5jaGFyZ2VyX3dxLAotCQkJCSZwbTItPmNoZWNrX2h3X2ZhaWx1cmVfd29yaywgMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX21heWJlX3VudXNlZCBwbTJ4eHhfd2FsbF9jaGFyZ2VyX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBpMmNfY2xpZW50ICppMmNfY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yOwotCi0JcG0yID0gIChzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKilpMmNfZ2V0X2NsaWVudGRhdGEoaTJjX2NsaWVudCk7Ci0JY2xlYXJfbHBuX3BpbihwbTIpOwotCi0JLyogQ2FuY2VsIGFueSBwZW5kaW5nIEhXIGZhaWx1cmUgY2hlY2sgKi8KLQlpZiAoZGVsYXllZF93b3JrX3BlbmRpbmcoJnBtMi0+Y2hlY2tfaHdfZmFpbHVyZV93b3JrKSkKLQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcG0yLT5jaGVja19od19mYWlsdXJlX3dvcmspOwotCi0JZmx1c2hfd29yaygmcG0yLT5hY193b3JrKTsKLQlmbHVzaF93b3JrKCZwbTItPmNoZWNrX21haW5fdGhlcm1hbF9wcm90X3dvcmspOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgcG0yeHh4X3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGkyY19jbGllbnQgKnBtMnh4eF9pMmNfY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yOwotCi0JcG0yID0gKHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqKWkyY19nZXRfY2xpZW50ZGF0YShwbTJ4eHhfaTJjX2NsaWVudCk7Ci0JY2xlYXJfbHBuX3BpbihwbTIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgcG0yeHh4X3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqcG0yeHh4X2kyY19jbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTI7Ci0KLQlwbTIgPSAoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICopaTJjX2dldF9jbGllbnRkYXRhKHBtMnh4eF9pMmNfY2xpZW50KTsKLQotCWlmIChncGlvX2lzX3ZhbGlkKHBtMi0+bHBuX3BpbikgJiYgZ3Bpb19nZXRfdmFsdWUocG0yLT5scG5fcGluKSA9PSAwKQotCQlzZXRfbHBuX3BpbihwbTIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBwbTJ4eHhfcG1fb3BzIF9fbWF5YmVfdW51c2VkID0gewotCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKHBtMnh4eF93YWxsX2NoYXJnZXJfc3VzcGVuZCwKLQkJcG0yeHh4X3dhbGxfY2hhcmdlcl9yZXN1bWUpCi0JU0VUX1JVTlRJTUVfUE1fT1BTKHBtMnh4eF9ydW50aW1lX3N1c3BlbmQsIHBtMnh4eF9ydW50aW1lX3Jlc3VtZSwgTlVMTCkKLX07Ci0KLXN0YXRpYyBpbnQgcG0yeHh4X3dhbGxfY2hhcmdlcl9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjX2NsaWVudCwKLQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCXN0cnVjdCBwbTJ4eHhfcGxhdGZvcm1fZGF0YSAqcGxfZGF0YSA9IGkyY19jbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKLQlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMjsKLQlpbnQgcmV0ID0gMDsKLQl1OCB2YWw7Ci0JaW50IGk7Ci0KLQlpZiAoIXBsX2RhdGEpIHsKLQkJZGV2X2VycigmaTJjX2NsaWVudC0+ZGV2LCAiTm8gcGxhdGZvcm0gZGF0YSBzdXBwbGllZFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXBtMiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbTJ4eHhfY2hhcmdlciksIEdGUF9LRVJORUwpOwotCWlmICghcG0yKSB7Ci0JCWRldl9lcnIoJmkyY19jbGllbnQtPmRldiwgInBtMnh4eF9jaGFyZ2VyIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyogZ2V0IHBhcmVudCBkYXRhICovCi0JcG0yLT5kZXYgPSAmaTJjX2NsaWVudC0+ZGV2OwotCi0JcG0yLT5wbTJfaW50ID0gJnBtMnh4eF9pbnQ7Ci0KLQkvKiBnZXQgY2hhcmdlciBzcGNpZmljIHBsYXRmb3JtIGRhdGEgKi8KLQlpZiAoIXBsX2RhdGEtPndhbGxfY2hhcmdlcikgewotCQlkZXZfZXJyKHBtMi0+ZGV2LCAibm8gY2hhcmdlciBwbGF0Zm9ybSBkYXRhIHN1cHBsaWVkXG4iKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBmcmVlX2RldmljZV9pbmZvOwotCX0KLQotCXBtMi0+cGRhdGEgPSBwbF9kYXRhLT53YWxsX2NoYXJnZXI7Ci0KLQkvKiBnZXQgYmF0dGVyeSBzcGVjaWZpYyBwbGF0Zm9ybSBkYXRhICovCi0JaWYgKCFwbF9kYXRhLT5iYXR0ZXJ5KSB7Ci0JCWRldl9lcnIocG0yLT5kZXYsICJubyBiYXR0ZXJ5IHBsYXRmb3JtIGRhdGEgc3VwcGxpZWRcbiIpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGZyZWVfZGV2aWNlX2luZm87Ci0JfQotCi0JcG0yLT5iYXQgPSBwbF9kYXRhLT5iYXR0ZXJ5OwotCi0JaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShpMmNfY2xpZW50LT5hZGFwdGVyLAotCQkJSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIHwKLQkJCUkyQ19GVU5DX1NNQlVTX1JFQURfV09SRF9EQVRBKSkgewotCQlyZXQgPSAtRU5PREVWOwotCQlkZXZfaW5mbyhwbTItPmRldiwgInBtMjMwMSBpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eSBmYWlsZWRcbiIpOwotCQlnb3RvIGZyZWVfZGV2aWNlX2luZm87Ci0JfQotCi0JcG0yLT5jb25maWcucG0yeHh4X2kyYyA9IGkyY19jbGllbnQ7Ci0JcG0yLT5jb25maWcucG0yeHh4X2lkID0gKHN0cnVjdCBpMmNfZGV2aWNlX2lkICopIGlkOwotCWkyY19zZXRfY2xpZW50ZGF0YShpMmNfY2xpZW50LCBwbTIpOwotCi0JLyogQUMgc3VwcGx5ICovCi0JLyogcG93ZXJfc3VwcGx5IGJhc2UgY2xhc3MgKi8KLQlwbTItPmFjX2NoZ19kZXNjLm5hbWUgPSBwbTItPnBkYXRhLT5sYWJlbDsKLQlwbTItPmFjX2NoZ19kZXNjLnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUzsKLQlwbTItPmFjX2NoZ19kZXNjLnByb3BlcnRpZXMgPSBwbTJ4eHhfY2hhcmdlcl9hY19wcm9wczsKLQlwbTItPmFjX2NoZ19kZXNjLm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShwbTJ4eHhfY2hhcmdlcl9hY19wcm9wcyk7Ci0JcG0yLT5hY19jaGdfZGVzYy5nZXRfcHJvcGVydHkgPSBwbTJ4eHhfY2hhcmdlcl9hY19nZXRfcHJvcGVydHk7Ci0KLQlwc3lfY2ZnLnN1cHBsaWVkX3RvID0gcG0yLT5wZGF0YS0+c3VwcGxpZWRfdG87Ci0JcHN5X2NmZy5udW1fc3VwcGxpY2FudHMgPSBwbTItPnBkYXRhLT5udW1fc3VwcGxpY2FudHM7Ci0JLyogcG0yeHh4X2NoYXJnZXIgc3ViLWNsYXNzICovCi0JcG0yLT5hY19jaGcub3BzLmVuYWJsZSA9ICZwbTJ4eHhfY2hhcmdlcl9hY19lbjsKLQlwbTItPmFjX2NoZy5vcHMua2lja193ZCA9ICZwbTJ4eHhfY2hhcmdlcl93YXRjaGRvZ19raWNrOwotCXBtMi0+YWNfY2hnLm9wcy51cGRhdGVfY3VyciA9ICZwbTJ4eHhfY2hhcmdlcl91cGRhdGVfY2hhcmdlcl9jdXJyZW50OwotCXBtMi0+YWNfY2hnLm1heF9vdXRfdm9sdCA9IHBtMnh4eF9jaGFyZ2VyX3ZvbHRhZ2VfbWFwWwotCQlBUlJBWV9TSVpFKHBtMnh4eF9jaGFyZ2VyX3ZvbHRhZ2VfbWFwKSAtIDFdOwotCXBtMi0+YWNfY2hnLm1heF9vdXRfY3VyciA9IHBtMnh4eF9jaGFyZ2VyX2N1cnJlbnRfbWFwWwotCQlBUlJBWV9TSVpFKHBtMnh4eF9jaGFyZ2VyX2N1cnJlbnRfbWFwKSAtIDFdOwotCXBtMi0+YWNfY2hnLndkdF9yZWZyZXNoID0gV0RfS0lDS19JTlRFUlZBTDsKLQlwbTItPmFjX2NoZy5lbmFibGVkID0gdHJ1ZTsKLQlwbTItPmFjX2NoZy5leHRlcm5hbCA9IHRydWU7Ci0KLQkvKiBDcmVhdGUgYSB3b3JrIHF1ZXVlIGZvciB0aGUgY2hhcmdlciAqLwotCXBtMi0+Y2hhcmdlcl93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJwbTJ4eHhfY2hhcmdlcl93cSIpOwotCWlmIChwbTItPmNoYXJnZXJfd3EgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlkZXZfZXJyKHBtMi0+ZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSB3b3JrIHF1ZXVlXG4iKTsKLQkJZ290byBmcmVlX2RldmljZV9pbmZvOwotCX0KLQotCS8qIEluaXQgd29yayBmb3IgY2hhcmdlciBkZXRlY3Rpb24gKi8KLQlJTklUX1dPUksoJnBtMi0+YWNfd29yaywgcG0yeHh4X2NoYXJnZXJfYWNfd29yayk7Ci0KLQkvKiBJbml0IHdvcmsgZm9yIGNoZWNraW5nIEhXIHN0YXR1cyAqLwotCUlOSVRfV09SSygmcG0yLT5jaGVja19tYWluX3RoZXJtYWxfcHJvdF93b3JrLAotCQlwbTJ4eHhfY2hhcmdlcl9jaGVja19tYWluX3RoZXJtYWxfcHJvdF93b3JrKTsKLQotCS8qIEluaXQgd29yayBmb3IgSFcgZmFpbHVyZSBjaGVjayAqLwotCUlOSVRfREVGRVJSQUJMRV9XT1JLKCZwbTItPmNoZWNrX2h3X2ZhaWx1cmVfd29yaywKLQkJcG0yeHh4X2NoYXJnZXJfY2hlY2tfaHdfZmFpbHVyZV93b3JrKTsKLQotCS8qCi0JICogVkREIEFEQyBzdXBwbHkgbmVlZHMgdG8gYmUgZW5hYmxlZCBmcm9tIHRoaXMgZHJpdmVyIHdoZW4gdGhlcmUKLQkgKiBpcyBhIGNoYXJnZXIgY29ubmVjdGVkIHRvIGF2b2lkIGVycm9uZW91cyBCVEVNUF9ISUdIL0xPVwotCSAqIGludGVycnVwdHMgZHVyaW5nIGNoYXJnaW5nCi0JICovCi0JcG0yLT5yZWd1ID0gcmVndWxhdG9yX2dldChwbTItPmRldiwgInZkZGFkYyIpOwotCWlmIChJU19FUlIocG0yLT5yZWd1KSkgewotCQlyZXQgPSBQVFJfRVJSKHBtMi0+cmVndSk7Ci0JCWRldl9lcnIocG0yLT5kZXYsICJmYWlsZWQgdG8gZ2V0IHZkZGFkYyByZWd1bGF0b3JcbiIpOwotCQlnb3RvIGZyZWVfY2hhcmdlcl93cTsKLQl9Ci0KLQkvKiBSZWdpc3RlciBBQyBjaGFyZ2VyIGNsYXNzICovCi0JcG0yLT5hY19jaGcucHN5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKHBtMi0+ZGV2LCAmcG0yLT5hY19jaGdfZGVzYywKLQkJCQkJCSZwc3lfY2ZnKTsKLQlpZiAoSVNfRVJSKHBtMi0+YWNfY2hnLnBzeSkpIHsKLQkJZGV2X2VycihwbTItPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBBQyBjaGFyZ2VyXG4iKTsKLQkJcmV0ID0gUFRSX0VSUihwbTItPmFjX2NoZy5wc3kpOwotCQlnb3RvIGZyZWVfcmVndWxhdG9yOwotCX0KLQotCS8qIFJlZ2lzdGVyIGludGVycnVwdHMgKi8KLQlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShncGlvX3RvX2lycShwbTItPnBkYXRhLT5ncGlvX2lycV9udW1iZXIpLAotCQkJCU5VTEwsCi0JCQkJcG0yeHh4X2NoYXJnZXJfaXJxWzBdLmlzciwKLQkJCQlwbTItPnBkYXRhLT5pcnFfdHlwZSwKLQkJCQlwbTJ4eHhfY2hhcmdlcl9pcnFbMF0ubmFtZSwgcG0yKTsKLQotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKHBtMi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgJXMgSVJRICVkOiAlZFxuIiwKLQkJcG0yeHh4X2NoYXJnZXJfaXJxWzBdLm5hbWUsCi0JCQlncGlvX3RvX2lycShwbTItPnBkYXRhLT5ncGlvX2lycV9udW1iZXIpLCByZXQpOwotCQlnb3RvIHVucmVnaXN0ZXJfcG0yeHh4X2NoYXJnZXI7Ci0JfQotCi0JcmV0ID0gcG1fcnVudGltZV9zZXRfYWN0aXZlKHBtMi0+ZGV2KTsKLQlpZiAocmV0KQotCQlkZXZfZXJyKHBtMi0+ZGV2LCAic2V0IGFjdGl2ZSBFcnJvclxuIik7Ci0KLQlwbV9ydW50aW1lX2VuYWJsZShwbTItPmRldik7Ci0JcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXkocG0yLT5kZXYsIFBNMlhYWF9BVVRPU1VTUEVORF9ERUxBWSk7Ci0JcG1fcnVudGltZV91c2VfYXV0b3N1c3BlbmQocG0yLT5kZXYpOwotCXBtX3J1bnRpbWVfcmVzdW1lKHBtMi0+ZGV2KTsKLQotCS8qIHBtIGludGVycnVwdCBjYW4gd2FrZSB1cCBzeXN0ZW0gKi8KLQlyZXQgPSBlbmFibGVfaXJxX3dha2UoZ3Bpb190b19pcnEocG0yLT5wZGF0YS0+Z3Bpb19pcnFfbnVtYmVyKSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKHBtMi0+ZGV2LCAiZmFpbGVkIHRvIHNldCBpcnEgd2FrZVxuIik7Ci0JCWdvdG8gdW5yZWdpc3Rlcl9wbTJ4eHhfaW50ZXJydXB0OwotCX0KLQotCW11dGV4X2luaXQoJnBtMi0+bG9jayk7Ci0KLQlpZiAoZ3Bpb19pc192YWxpZChwbTItPnBkYXRhLT5scG5fZ3BpbykpIHsKLQkJLyogZ2V0IGxwbiBHUElPIGZyb20gcGxhdGZvcm0gZGF0YSAqLwotCQlwbTItPmxwbl9waW4gPSBwbTItPnBkYXRhLT5scG5fZ3BpbzsKLQotCQkvKgotCQkgKiBDaGFyZ2VyIGRldGVjdGlvbiBtZWNoYW5pc20gcmVxdWlyZXMgcHVsbGluZyB1cCB0aGUgTFBOIHBpbgotCQkgKiB3aGlsZSBpMmMgY29tbXVuaWNhdGlvbiBpZiBDaGFyZ2VyIGlzIG5vdCBjb25uZWN0ZWQKLQkJICogTFBOIHBpbiBvZiBQTTIzMDEgaXMgR1BJTzYwIG9mIEFCOTU0MAotCQkgKi8KLQkJcmV0ID0gZ3Bpb19yZXF1ZXN0KHBtMi0+bHBuX3BpbiwgInBtMjMwMV9scG1fZ3BpbyIpOwotCi0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKHBtMi0+ZGV2LCAicG0yMzAxX2xwbV9ncGlvIHJlcXVlc3QgZmFpbGVkXG4iKTsKLQkJCWdvdG8gZGlzYWJsZV9wbTJfaXJxX3dha2U7Ci0JCX0KLQkJcmV0ID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHBtMi0+bHBuX3BpbiwgMCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKHBtMi0+ZGV2LCAicG0yMzAxX2xwbV9ncGlvIGRpcmVjdGlvbiBmYWlsZWRcbiIpOwotCQkJZ290byBmcmVlX2dwaW87Ci0JCX0KLQkJc2V0X2xwbl9waW4ocG0yKTsKLQl9Ci0KLQkvKiByZWFkICBpbnRlcnJ1cHQgcmVnaXN0ZXJzICovCi0JZm9yIChpID0gMDsgaSA8IFBNMlhYWF9OVU1fSU5UX1JFRzsgaSsrKQotCQlwbTJ4eHhfcmVnX3JlYWQocG0yLAotCQkJcG0yeHh4X2ludGVycnVwdF9yZWdpc3RlcnNbaV0sCi0JCQkmdmFsKTsKLQotCXJldCA9IHBtMnh4eF9jaGFyZ2VyX2RldGVjdGlvbihwbTIsICZ2YWwpOwotCi0JaWYgKChyZXQgPT0gMCkgJiYgdmFsKSB7Ci0JCXBtMi0+YWMuY2hhcmdlcl9jb25uZWN0ZWQgPSAxOwotCQlhYjg1MDBfb3ZlcnJpZGVfdHVybl9vbl9zdGF0KH5BQjg1MDBfUE9XX0tFWV8xX09OLAotCQkJCQkgICAgIEFCODUwMF9NQUlOX0NIX0RFVCk7Ci0JCXBtMi0+YWNfY29ubiA9IHRydWU7Ci0JCXBvd2VyX3N1cHBseV9jaGFuZ2VkKHBtMi0+YWNfY2hnLnBzeSk7Ci0JCXN5c2ZzX25vdGlmeSgmcG0yLT5hY19jaGcucHN5LT5kZXYua29iaiwgTlVMTCwgInByZXNlbnQiKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotZnJlZV9ncGlvOgotCWlmIChncGlvX2lzX3ZhbGlkKHBtMi0+bHBuX3BpbikpCi0JCWdwaW9fZnJlZShwbTItPmxwbl9waW4pOwotZGlzYWJsZV9wbTJfaXJxX3dha2U6Ci0JZGlzYWJsZV9pcnFfd2FrZShncGlvX3RvX2lycShwbTItPnBkYXRhLT5ncGlvX2lycV9udW1iZXIpKTsKLXVucmVnaXN0ZXJfcG0yeHh4X2ludGVycnVwdDoKLQkvKiBkaXNhYmxlIGludGVycnVwdCAqLwotCWZyZWVfaXJxKGdwaW9fdG9faXJxKHBtMi0+cGRhdGEtPmdwaW9faXJxX251bWJlciksIHBtMik7Ci11bnJlZ2lzdGVyX3BtMnh4eF9jaGFyZ2VyOgotCS8qIHVucmVnaXN0ZXIgcG93ZXIgc3VwcGx5ICovCi0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIocG0yLT5hY19jaGcucHN5KTsKLWZyZWVfcmVndWxhdG9yOgotCS8qIGRpc2FibGUgdGhlIHJlZ3VsYXRvciAqLwotCXJlZ3VsYXRvcl9wdXQocG0yLT5yZWd1KTsKLWZyZWVfY2hhcmdlcl93cToKLQlkZXN0cm95X3dvcmtxdWV1ZShwbTItPmNoYXJnZXJfd3EpOwotZnJlZV9kZXZpY2VfaW5mbzoKLQlrZnJlZShwbTIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBwbTJ4eHhfd2FsbF9jaGFyZ2VyX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjX2NsaWVudCkKLXsKLQlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMiA9IGkyY19nZXRfY2xpZW50ZGF0YShpMmNfY2xpZW50KTsKLQotCS8qIERpc2FibGUgcG1fcnVudGltZSAqLwotCXBtX3J1bnRpbWVfZGlzYWJsZShwbTItPmRldik7Ci0JLyogRGlzYWJsZSBBQyBjaGFyZ2luZyAqLwotCXBtMnh4eF9jaGFyZ2VyX2FjX2VuKCZwbTItPmFjX2NoZywgZmFsc2UsIDAsIDApOwotCi0JLyogRGlzYWJsZSB3YWtlIGJ5IHBtIGludGVycnVwdCAqLwotCWRpc2FibGVfaXJxX3dha2UoZ3Bpb190b19pcnEocG0yLT5wZGF0YS0+Z3Bpb19pcnFfbnVtYmVyKSk7Ci0KLQkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KLQlmcmVlX2lycShncGlvX3RvX2lycShwbTItPnBkYXRhLT5ncGlvX2lycV9udW1iZXIpLCBwbTIpOwotCi0JLyogRGVsZXRlIHRoZSB3b3JrIHF1ZXVlICovCi0JZGVzdHJveV93b3JrcXVldWUocG0yLT5jaGFyZ2VyX3dxKTsKLQotCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7Ci0KLQkvKiBkaXNhYmxlIHRoZSByZWd1bGF0b3IgKi8KLQlyZWd1bGF0b3JfcHV0KHBtMi0+cmVndSk7Ci0KLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihwbTItPmFjX2NoZy5wc3kpOwotCi0JaWYgKGdwaW9faXNfdmFsaWQocG0yLT5scG5fcGluKSkKLQkJZ3Bpb19mcmVlKHBtMi0+bHBuX3Bpbik7Ci0KLQlrZnJlZShwbTIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBwbTJ4eHhfaWRbXSA9IHsKLQl7ICJwbTIzMDEiLCAwIH0sCi0JeyB9Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgcG0yeHh4X2lkKTsKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHBtMnh4eF9jaGFyZ2VyX2RyaXZlciA9IHsKLQkucHJvYmUgPSBwbTJ4eHhfd2FsbF9jaGFyZ2VyX3Byb2JlLAotCS5yZW1vdmUgPSBwbTJ4eHhfd2FsbF9jaGFyZ2VyX3JlbW92ZSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJwbTJ4eHgtd2FsbF9jaGFyZ2VyIiwKLQkJLnBtID0gSVNfRU5BQkxFRChDT05GSUdfUE0pID8gJnBtMnh4eF9wbV9vcHMgOiBOVUxMLAotCX0sCi0JLmlkX3RhYmxlID0gcG0yeHh4X2lkLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgcG0yeHh4X2NoYXJnZXJfaW5pdCh2b2lkKQotewotCXJldHVybiBpMmNfYWRkX2RyaXZlcigmcG0yeHh4X2NoYXJnZXJfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHBtMnh4eF9jaGFyZ2VyX2V4aXQodm9pZCkKLXsKLQlpMmNfZGVsX2RyaXZlcigmcG0yeHh4X2NoYXJnZXJfZHJpdmVyKTsKLX0KLQotZGV2aWNlX2luaXRjYWxsX3N5bmMocG0yeHh4X2NoYXJnZXJfaW5pdCk7Ci1tb2R1bGVfZXhpdChwbTJ4eHhfY2hhcmdlcl9leGl0KTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotTU9EVUxFX0FVVEhPUigiUmFqa3VtYXIga2FzaXJhamFuLCBPbGl2aWVyIExhdW5heSIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJQTTJ4eHggY2hhcmdlciBtYW5hZ2VtZW50IGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9yZXNldC9LY29uZmlnIGIvZHJpdmVycy9wb3dlci9yZXNldC9LY29uZmlnCmluZGV4IDNiZmFjNTMuLmM3NGMzZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvcmVzZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL3Bvd2VyL3Jlc2V0L0tjb25maWcKQEAgLTIwMCw4ICsyMDAsOCBAQAogY29uZmlnIFNZU0NPTl9SRUJPT1RfTU9ERQogCXRyaXN0YXRlICJHZW5lcmljIFNZU0NPTiByZWdtYXAgcmVib290IG1vZGUgZHJpdmVyIgogCWRlcGVuZHMgb24gT0YKKwlkZXBlbmRzIG9uIE1GRF9TWVNDT04KIAlzZWxlY3QgUkVCT09UX01PREUKLQlzZWxlY3QgTUZEX1NZU0NPTgogCWhlbHAKIAkgIFNheSB5IGhlcmUgd2lsbCBlbmFibGUgcmVib290IG1vZGUgZHJpdmVyLiBUaGlzIHdpbGwKIAkgIGdldCByZWJvb3QgbW9kZSBhcmd1bWVudHMgYW5kIHN0b3JlIGl0IGluIFNZU0NPTiBtYXBwZWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvcmVzZXQvaGlzaS1yZWJvb3QuYyBiL2RyaXZlcnMvcG93ZXIvcmVzZXQvaGlzaS1yZWJvb3QuYwppbmRleCA5YWI3ZjU2Li5mNjkzODdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3Jlc2V0L2hpc2ktcmVib290LmMKKysrIGIvZHJpdmVycy9wb3dlci9yZXNldC9oaXNpLXJlYm9vdC5jCkBAIC01MywxMyArNTMsMTYgQEAKIAogCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJlYm9vdC1vZmZzZXQiLCAmcmVib290X29mZnNldCkgPCAwKSB7CiAJCXByX2VycigiZmFpbGVkIHRvIGZpbmQgcmVib290LW9mZnNldCBwcm9wZXJ0eVxuIik7CisJCWlvdW5tYXAoYmFzZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWVyciA9IHJlZ2lzdGVyX3Jlc3RhcnRfaGFuZGxlcigmaGlzaV9yZXN0YXJ0X25iKTsKLQlpZiAoZXJyKQorCWlmIChlcnIpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IHJlZ2lzdGVyIHJlc3RhcnQgaGFuZGxlciAoZXJyPSVkKVxuIiwKIAkJCWVycik7CisJCWlvdW5tYXAoYmFzZSk7CisJfQogCiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvcmVzZXQva2V5c3RvbmUtcmVzZXQuYyBiL2RyaXZlcnMvcG93ZXIvcmVzZXQva2V5c3RvbmUtcmVzZXQuYwppbmRleCBjNzBmMWJmLi4wOTM4MDg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3Jlc2V0L2tleXN0b25lLXJlc2V0LmMKKysrIGIvZHJpdmVycy9wb3dlci9yZXNldC9rZXlzdG9uZS1yZXNldC5jCkBAIC0xMzksNyArMTM5LDcgQEAKIAkJfQogCiAJCWlmICh2YWwgPj0gV0RUX01VWF9OVU1CRVIpIHsKLQkJCWRldl9lcnIoZGV2LCAidGksd2R0LWxpc3QgcHJvcGVydHkgY2FuIGNvbnRhaW4iCisJCQlkZXZfZXJyKGRldiwgInRpLHdkdC1saXN0IHByb3BlcnR5IGNhbiBjb250YWluICIKIAkJCQkib25seSBudW1iZXJzIDwgNFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9yZXNldC9yZWJvb3QtbW9kZS5jIGIvZHJpdmVycy9wb3dlci9yZXNldC9yZWJvb3QtbW9kZS5jCmluZGV4IDJkZmJiY2UuLmZiNTEyMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvcmVzZXQvcmVib290LW1vZGUuYworKysgYi9kcml2ZXJzL3Bvd2VyL3Jlc2V0L3JlYm9vdC1tb2RlLmMKQEAgLTEzNSw2ICsxMzUsNjUgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlYm9vdF9tb2RlX3VucmVnaXN0ZXIpOwogCitzdGF0aWMgdm9pZCBkZXZtX3JlYm9vdF9tb2RlX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpyZXMpCit7CisJcmVib290X21vZGVfdW5yZWdpc3RlcigqKHN0cnVjdCByZWJvb3RfbW9kZV9kcml2ZXIgKiopcmVzKTsKK30KKworLyoqCisgKiBkZXZtX3JlYm9vdF9tb2RlX3JlZ2lzdGVyKCkgLSByZXNvdXJjZSBtYW5hZ2VkIHJlYm9vdF9tb2RlX3JlZ2lzdGVyKCkKKyAqIEBkZXY6IGRldmljZSB0byBhc3NvY2lhdGUgdGhpcyByZXNvdXJjZSB3aXRoCisgKiBAcmVib290OiByZWJvb3QgbW9kZSBkcml2ZXIKKyAqCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBkZXZtX3JlYm9vdF9tb2RlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCByZWJvb3RfbW9kZV9kcml2ZXIgKnJlYm9vdCkKK3sKKwlzdHJ1Y3QgcmVib290X21vZGVfZHJpdmVyICoqZHI7CisJaW50IHJjOworCisJZHIgPSBkZXZyZXNfYWxsb2MoZGV2bV9yZWJvb3RfbW9kZV9yZWxlYXNlLCBzaXplb2YoKmRyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyYyA9IHJlYm9vdF9tb2RlX3JlZ2lzdGVyKHJlYm9vdCk7CisJaWYgKHJjKSB7CisJCWRldnJlc19mcmVlKGRyKTsKKwkJcmV0dXJuIHJjOworCX0KKworCSpkciA9IHJlYm9vdDsKKwlkZXZyZXNfYWRkKGRldiwgZHIpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZXZtX3JlYm9vdF9tb2RlX3JlZ2lzdGVyKTsKKworc3RhdGljIGludCBkZXZtX3JlYm9vdF9tb2RlX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcmVzLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCByZWJvb3RfbW9kZV9kcml2ZXIgKipwID0gcmVzOworCisJaWYgKFdBUk5fT04oIXAgfHwgISpwKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKnAgPT0gZGF0YTsKK30KKworLyoqCisgKiBkZXZtX3JlYm9vdF9tb2RlX3VucmVnaXN0ZXIoKSAtIHJlc291cmNlIG1hbmFnZWQgcmVib290X21vZGVfdW5yZWdpc3RlcigpCisgKiBAZGV2OiBkZXZpY2UgdG8gYXNzb2NpYXRlIHRoaXMgcmVzb3VyY2Ugd2l0aAorICogQHJlYm9vdDogcmVib290IG1vZGUgZHJpdmVyCisgKi8KK3ZvaWQgZGV2bV9yZWJvb3RfbW9kZV91bnJlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IHJlYm9vdF9tb2RlX2RyaXZlciAqcmVib290KQoreworCVdBUk5fT04oZGV2cmVzX3JlbGVhc2UoZGV2LAorCQkJICAgICAgIGRldm1fcmVib290X21vZGVfcmVsZWFzZSwKKwkJCSAgICAgICBkZXZtX3JlYm9vdF9tb2RlX21hdGNoLCByZWJvb3QpKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRldm1fcmVib290X21vZGVfdW5yZWdpc3Rlcik7CisKIE1PRFVMRV9BVVRIT1IoIkFuZHkgWWFuIDxhbmR5LnlhbkByb2NrLWNoaXBzLmNvbSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTeXN0ZW0gcmVib290IG1vZGUgY29yZSBsaWJyYXJ5Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3Jlc2V0L3JlYm9vdC1tb2RlLmggYi9kcml2ZXJzL3Bvd2VyL3Jlc2V0L3JlYm9vdC1tb2RlLmgKaW5kZXggMjQ5MWJiNy4uNzVmN2ZlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9yZXNldC9yZWJvb3QtbW9kZS5oCisrKyBiL2RyaXZlcnMvcG93ZXIvcmVzZXQvcmVib290LW1vZGUuaApAQCAtMTAsNSArMTAsOSBAQAogCiBpbnQgcmVib290X21vZGVfcmVnaXN0ZXIoc3RydWN0IHJlYm9vdF9tb2RlX2RyaXZlciAqcmVib290KTsKIGludCByZWJvb3RfbW9kZV91bnJlZ2lzdGVyKHN0cnVjdCByZWJvb3RfbW9kZV9kcml2ZXIgKnJlYm9vdCk7CitpbnQgZGV2bV9yZWJvb3RfbW9kZV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgcmVib290X21vZGVfZHJpdmVyICpyZWJvb3QpOwordm9pZCBkZXZtX3JlYm9vdF9tb2RlX3VucmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgcmVib290X21vZGVfZHJpdmVyICpyZWJvb3QpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvcmVzZXQvc3QtcG93ZXJvZmYuYyBiL2RyaXZlcnMvcG93ZXIvcmVzZXQvc3QtcG93ZXJvZmYuYwppbmRleCBhNDg4ODc3Li4yMDQ2YjMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3Jlc2V0L3N0LXBvd2Vyb2ZmLmMKKysrIGIvZHJpdmVycy9wb3dlci9yZXNldC9zdC1wb3dlcm9mZi5jCkBAIC0yOCwyOCArMjgsNiBAQAogCXVuc2lnbmVkIGludCBtYXNrX3JzdF9tc2s7CiB9OwogCi0vKiBTVGlINDE1ICovCi0jZGVmaW5lIFNUSUg0MTVfU1lTQ0ZHXzExCTB4MmMKLSNkZWZpbmUgU1RJSDQxNV9TWVNDRkdfMTUJMHgzYwotCi1zdGF0aWMgc3RydWN0IHJlc2V0X3N5c2NmZyBzdGloNDE1X3Jlc2V0ID0gewotCS5vZmZzZXRfcnN0ID0gU1RJSDQxNV9TWVNDRkdfMTEsCi0JLm1hc2tfcnN0ID0gQklUKDApLAotCS5vZmZzZXRfcnN0X21zayA9IFNUSUg0MTVfU1lTQ0ZHXzE1LAotCS5tYXNrX3JzdF9tc2sgPSBCSVQoMCkKLX07Ci0KLS8qIFNUaUg0MTYgKi8KLSNkZWZpbmUgU1RJSDQxNl9TWVNDRkdfNTAwCTB4N2QwCi0jZGVmaW5lIFNUSUg0MTZfU1lTQ0ZHXzUwNAkweDdlMAotCi1zdGF0aWMgc3RydWN0IHJlc2V0X3N5c2NmZyBzdGloNDE2X3Jlc2V0ID0gewotCS5vZmZzZXRfcnN0ID0gU1RJSDQxNl9TWVNDRkdfNTAwLAotCS5tYXNrX3JzdCA9IEJJVCgwKSwKLQkub2Zmc2V0X3JzdF9tc2sgPSBTVElINDE2X1NZU0NGR181MDQsCi0JLm1hc2tfcnN0X21zayA9IEJJVCgwKQotfTsKLQogLyogU1RpSDQwNyAqLwogI2RlZmluZSBTVElINDA3X1NZU0NGR180MDAwCTB4MAogI2RlZmluZSBTVElINDA3X1NZU0NGR180MDA4CTB4MjAKQEAgLTYxLDE2ICszOSw2IEBACiAJLm1hc2tfcnN0X21zayA9IEJJVCgwKQogfTsKIAotLyogU1RpRDEyNyAqLwotI2RlZmluZSBTVElEMTI3X1NZU0NGR183MDAJMHgwCi0jZGVmaW5lIFNUSUQxMjdfU1lTQ0ZHXzc3MwkweDEyNAotCi1zdGF0aWMgc3RydWN0IHJlc2V0X3N5c2NmZyBzdGlkMTI3X3Jlc2V0ID0gewotCS5vZmZzZXRfcnN0ID0gU1RJRDEyN19TWVNDRkdfNzczLAotCS5tYXNrX3JzdCA9IEJJVCgwKSwKLQkub2Zmc2V0X3JzdF9tc2sgPSBTVElEMTI3X1NZU0NGR183MDAsCi0JLm1hc2tfcnN0X21zayA9IEJJVCg4KQotfTsKIAogc3RhdGljIHN0cnVjdCByZXNldF9zeXNjZmcgKnN0X3Jlc3RhcnRfc3lzY2ZnOwogCkBAIC05OSwxNyArNjcsOCBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzdF9yZXNldF9vZl9tYXRjaFtdID0gewogCXsKLQkJLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNS1yZXN0YXJ0IiwKLQkJLmRhdGEgPSAodm9pZCAqKSZzdGloNDE1X3Jlc2V0LAotCX0sIHsKLQkJLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNi1yZXN0YXJ0IiwKLQkJLmRhdGEgPSAodm9pZCAqKSZzdGloNDE2X3Jlc2V0LAotCX0sIHsKIAkJLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQwNy1yZXN0YXJ0IiwKIAkJLmRhdGEgPSAodm9pZCAqKSZzdGloNDA3X3Jlc2V0LAotCX0sIHsKLQkJLmNvbXBhdGlibGUgPSAic3Qsc3RpZDEyNy1yZXN0YXJ0IiwKLQkJLmRhdGEgPSAodm9pZCAqKSZzdGlkMTI3X3Jlc2V0LAogCX0sCiAJe30KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3Jlc2V0L3N5c2Nvbi1yZWJvb3QtbW9kZS5jIGIvZHJpdmVycy9wb3dlci9yZXNldC9zeXNjb24tcmVib290LW1vZGUuYwppbmRleCA5ZTFjYmE1Li4xZWNiNTFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3Jlc2V0L3N5c2Nvbi1yZWJvb3QtbW9kZS5jCisrKyBiL2RyaXZlcnMvcG93ZXIvcmVzZXQvc3lzY29uLXJlYm9vdC1tb2RlLmMKQEAgLTUzLDggKzUzLDYgQEAKIAlzeXNjb25fcmJtLT5yZWJvb3Qud3JpdGUgPSBzeXNjb25fcmVib290X21vZGVfd3JpdGU7CiAJc3lzY29uX3JibS0+bWFzayA9IDB4ZmZmZmZmZmY7CiAKLQlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgc3lzY29uX3JibSk7Ci0KIAlzeXNjb25fcmJtLT5tYXAgPSBzeXNjb25fbm9kZV90b19yZWdtYXAocGRldi0+ZGV2LnBhcmVudC0+b2Zfbm9kZSk7CiAJaWYgKElTX0VSUihzeXNjb25fcmJtLT5tYXApKQogCQlyZXR1cm4gUFRSX0VSUihzeXNjb25fcmJtLT5tYXApOwpAQCAtNjUsMjAgKzYzLDEzIEBACiAKIAlvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwgIm1hc2siLCAmc3lzY29uX3JibS0+bWFzayk7CiAKLQlyZXQgPSByZWJvb3RfbW9kZV9yZWdpc3Rlcigmc3lzY29uX3JibS0+cmVib290KTsKKwlyZXQgPSBkZXZtX3JlYm9vdF9tb2RlX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZzeXNjb25fcmJtLT5yZWJvb3QpOwogCWlmIChyZXQpCiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IHJlZ2lzdGVyIHJlYm9vdCBtb2RlXG4iKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgc3lzY29uX3JlYm9vdF9tb2RlX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBzeXNjb25fcmVib290X21vZGUgKnN5c2Nvbl9yYm0gPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7Ci0KLQlyZXR1cm4gcmVib290X21vZGVfdW5yZWdpc3Rlcigmc3lzY29uX3JibS0+cmVib290KTsKLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3lzY29uX3JlYm9vdF9tb2RlX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJzeXNjb24tcmVib290LW1vZGUiIH0sCiAJe30KQEAgLTg2LDcgKzc3LDYgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3lzY29uX3JlYm9vdF9tb2RlX2RyaXZlciA9IHsKIAkucHJvYmUgPSBzeXNjb25fcmVib290X21vZGVfcHJvYmUsCi0JLnJlbW92ZSA9IHN5c2Nvbl9yZWJvb3RfbW9kZV9yZW1vdmUsCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAic3lzY29uLXJlYm9vdC1tb2RlIiwKIAkJLm9mX21hdGNoX3RhYmxlID0gc3lzY29uX3JlYm9vdF9tb2RlX29mX21hdGNoLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9yZXNldC94Z2VuZS1yZWJvb3QuYyBiL2RyaXZlcnMvcG93ZXIvcmVzZXQveGdlbmUtcmVib290LmMKaW5kZXggZjA3ZTkzYy4uNzNjM2Q5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9yZXNldC94Z2VuZS1yZWJvb3QuYworKysgYi9kcml2ZXJzL3Bvd2VyL3Jlc2V0L3hnZW5lLXJlYm9vdC5jCkBAIC04MSw4ICs4MSwxMCBAQAogCWN0eC0+cmVzdGFydF9oYW5kbGVyLm5vdGlmaWVyX2NhbGwgPSB4Z2VuZV9yZXN0YXJ0X2hhbmRsZXI7CiAJY3R4LT5yZXN0YXJ0X2hhbmRsZXIucHJpb3JpdHkgPSAxMjg7CiAJZXJyID0gcmVnaXN0ZXJfcmVzdGFydF9oYW5kbGVyKCZjdHgtPnJlc3RhcnRfaGFuZGxlcik7Ci0JaWYgKGVycikKKwlpZiAoZXJyKSB7CisJCWlvdW5tYXAoY3R4LT5jc3IpOwogCQlkZXZfZXJyKGRldiwgImNhbm5vdCByZWdpc3RlciByZXN0YXJ0IGhhbmRsZXIgKGVycj0lZClcbiIsIGVycik7CisJfQogCiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvcmVzZXQvengtcmVib290LmMgYi9kcml2ZXJzL3Bvd2VyL3Jlc2V0L3p4LXJlYm9vdC5jCmluZGV4IGE1YjAwOTYuLmIwYjFlYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvcmVzZXQvengtcmVib290LmMKKysrIGIvZHJpdmVycy9wb3dlci9yZXNldC96eC1yZWJvb3QuYwpAQCAtNTgsOSArNTgsMTIgQEAKIAl9CiAKIAllcnIgPSByZWdpc3Rlcl9yZXN0YXJ0X2hhbmRsZXIoJnp4X3Jlc3RhcnRfbmIpOwotCWlmIChlcnIpCisJaWYgKGVycikgeworCQlpb3VubWFwKGJhc2UpOworCQlpb3VubWFwKHBjdV9iYXNlKTsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiUmVnaXN0ZXIgcmVzdGFydCBoYW5kbGVyIGZhaWxlZChlcnI9JWQpXG4iLAogCQkJZXJyKTsKKwl9CiAKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9zYnMtYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9zYnMtYmF0dGVyeS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjhiOWZjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvcG93ZXIvc2JzLWJhdHRlcnkuYworKysgL2Rldi9udWxsCkBAIC0xLDk5OCArMCwwIEBACi0vKgotICogR2FzIEdhdWdlIGRyaXZlciBmb3IgU0JTIENvbXBsaWFudCBCYXR0ZXJpZXMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE5WSURJQSBDb3Jwb3JhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RhdC5oPgotCi0jaW5jbHVkZSA8bGludXgvcG93ZXIvc2JzLWJhdHRlcnkuaD4KLQotZW51bSB7Ci0JUkVHX01BTlVGQUNUVVJFUl9EQVRBLAotCVJFR19URU1QRVJBVFVSRSwKLQlSRUdfVk9MVEFHRSwKLQlSRUdfQ1VSUkVOVCwKLQlSRUdfQ0FQQUNJVFksCi0JUkVHX1RJTUVfVE9fRU1QVFksCi0JUkVHX1RJTUVfVE9fRlVMTCwKLQlSRUdfU1RBVFVTLAotCVJFR19DWUNMRV9DT1VOVCwKLQlSRUdfU0VSSUFMX05VTUJFUiwKLQlSRUdfUkVNQUlOSU5HX0NBUEFDSVRZLAotCVJFR19SRU1BSU5JTkdfQ0FQQUNJVFlfQ0hBUkdFLAotCVJFR19GVUxMX0NIQVJHRV9DQVBBQ0lUWSwKLQlSRUdfRlVMTF9DSEFSR0VfQ0FQQUNJVFlfQ0hBUkdFLAotCVJFR19ERVNJR05fQ0FQQUNJVFksCi0JUkVHX0RFU0lHTl9DQVBBQ0lUWV9DSEFSR0UsCi0JUkVHX0RFU0lHTl9WT0xUQUdFX01JTiwKLQlSRUdfREVTSUdOX1ZPTFRBR0VfTUFYLAotCVJFR19NQU5VRkFDVFVSRVIsCi0JUkVHX01PREVMX05BTUUsCi19OwotCi0vKiBCYXR0ZXJ5IE1vZGUgZGVmaW5lcyAqLwotI2RlZmluZSBCQVRURVJZX01PREVfT0ZGU0VUCQkweDAzCi0jZGVmaW5lIEJBVFRFUllfTU9ERV9NQVNLCQkweDgwMDAKLWVudW0gc2JzX2JhdHRlcnlfbW9kZSB7Ci0JQkFUVEVSWV9NT0RFX0FNUFMsCi0JQkFUVEVSWV9NT0RFX1dBVFRTCi19OwotCi0vKiBtYW51ZmFjdHVyZXIgYWNjZXNzIGRlZmluZXMgKi8KLSNkZWZpbmUgTUFOVUZBQ1RVUkVSX0FDQ0VTU19TVEFUVVMJMHgwMDA2Ci0jZGVmaW5lIE1BTlVGQUNUVVJFUl9BQ0NFU1NfU0xFRVAJMHgwMDExCi0KLS8qIGJhdHRlcnkgc3RhdHVzIHZhbHVlIGJpdHMgKi8KLSNkZWZpbmUgQkFUVEVSWV9ESVNDSEFSR0lORwkJMHg0MAotI2RlZmluZSBCQVRURVJZX0ZVTExfQ0hBUkdFRAkJMHgyMAotI2RlZmluZSBCQVRURVJZX0ZVTExfRElTQ0hBUkdFRAkJMHgxMAotCi0vKiBtaW5fdmFsdWUgYW5kIG1heF92YWx1ZSBhcmUgb25seSB2YWxpZCBmb3IgbnVtZXJpY2FsIGRhdGEgKi8KLSNkZWZpbmUgU0JTX0RBVEEoX3BzcCwgX2FkZHIsIF9taW5fdmFsdWUsIF9tYXhfdmFsdWUpIHsgXAotCS5wc3AgPSBfcHNwLCBcCi0JLmFkZHIgPSBfYWRkciwgXAotCS5taW5fdmFsdWUgPSBfbWluX3ZhbHVlLCBcCi0JLm1heF92YWx1ZSA9IF9tYXhfdmFsdWUsIFwKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjaGlwX2RhdGEgewotCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcDsKLQl1OCBhZGRyOwotCWludCBtaW5fdmFsdWU7Ci0JaW50IG1heF92YWx1ZTsKLX0gc2JzX2RhdGFbXSA9IHsKLQlbUkVHX01BTlVGQUNUVVJFUl9EQVRBXSA9Ci0JCVNCU19EQVRBKFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsIDB4MDAsIDAsIDY1NTM1KSwKLQlbUkVHX1RFTVBFUkFUVVJFXSA9Ci0JCVNCU19EQVRBKFBPV0VSX1NVUFBMWV9QUk9QX1RFTVAsIDB4MDgsIDAsIDY1NTM1KSwKLQlbUkVHX1ZPTFRBR0VdID0KLQkJU0JTX0RBVEEoUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1csIDB4MDksIDAsIDIwMDAwKSwKLQlbUkVHX0NVUlJFTlRdID0KLQkJU0JTX0RBVEEoUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1csIDB4MEEsIC0zMjc2OCwgMzI3NjcpLAotCVtSRUdfQ0FQQUNJVFldID0KLQkJU0JTX0RBVEEoUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFksIDB4MEQsIDAsIDEwMCksCi0JW1JFR19SRU1BSU5JTkdfQ0FQQUNJVFldID0KLQkJU0JTX0RBVEEoUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX05PVywgMHgwRiwgMCwgNjU1MzUpLAotCVtSRUdfUkVNQUlOSU5HX0NBUEFDSVRZX0NIQVJHRV0gPQotCQlTQlNfREFUQShQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XLCAweDBGLCAwLCA2NTUzNSksCi0JW1JFR19GVUxMX0NIQVJHRV9DQVBBQ0lUWV0gPQotCQlTQlNfREFUQShQT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfRlVMTCwgMHgxMCwgMCwgNjU1MzUpLAotCVtSRUdfRlVMTF9DSEFSR0VfQ0FQQUNJVFlfQ0hBUkdFXSA9Ci0JCVNCU19EQVRBKFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMLCAweDEwLCAwLCA2NTUzNSksCi0JW1JFR19USU1FX1RPX0VNUFRZXSA9Ci0JCVNCU19EQVRBKFBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRU1QVFlfQVZHLCAweDEyLCAwLCA2NTUzNSksCi0JW1JFR19USU1FX1RPX0ZVTExdID0KLQkJU0JTX0RBVEEoUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19GVUxMX0FWRywgMHgxMywgMCwgNjU1MzUpLAotCVtSRUdfU1RBVFVTXSA9Ci0JCVNCU19EQVRBKFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywgMHgxNiwgMCwgNjU1MzUpLAotCVtSRUdfQ1lDTEVfQ09VTlRdID0KLQkJU0JTX0RBVEEoUE9XRVJfU1VQUExZX1BST1BfQ1lDTEVfQ09VTlQsIDB4MTcsIDAsIDY1NTM1KSwKLQlbUkVHX0RFU0lHTl9DQVBBQ0lUWV0gPQotCQlTQlNfREFUQShQT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfRlVMTF9ERVNJR04sIDB4MTgsIDAsIDY1NTM1KSwKLQlbUkVHX0RFU0lHTl9DQVBBQ0lUWV9DSEFSR0VdID0KLQkJU0JTX0RBVEEoUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTExfREVTSUdOLCAweDE4LCAwLCA2NTUzNSksCi0JW1JFR19ERVNJR05fVk9MVEFHRV9NSU5dID0KLQkJU0JTX0RBVEEoUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU5fREVTSUdOLCAweDE5LCAwLCA2NTUzNSksCi0JW1JFR19ERVNJR05fVk9MVEFHRV9NQVhdID0KLQkJU0JTX0RBVEEoUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NQVhfREVTSUdOLCAweDE5LCAwLCA2NTUzNSksCi0JW1JFR19TRVJJQUxfTlVNQkVSXSA9Ci0JCVNCU19EQVRBKFBPV0VSX1NVUFBMWV9QUk9QX1NFUklBTF9OVU1CRVIsIDB4MUMsIDAsIDY1NTM1KSwKLQkvKiBQcm9wZXJ0aWVzIG9mIHR5cGUgYGNvbnN0IGNoYXIgKicgKi8KLQlbUkVHX01BTlVGQUNUVVJFUl0gPQotCQlTQlNfREFUQShQT1dFUl9TVVBQTFlfUFJPUF9NQU5VRkFDVFVSRVIsIDB4MjAsIDAsIDY1NTM1KSwKLQlbUkVHX01PREVMX05BTUVdID0KLQkJU0JTX0RBVEEoUE9XRVJfU1VQUExZX1BST1BfTU9ERUxfTkFNRSwgMHgyMSwgMCwgNjU1MzUpCi19OwotCi1zdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgc2JzX3Byb3BlcnRpZXNbXSA9IHsKLQlQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMsCi0JUE9XRVJfU1VQUExZX1BST1BfSEVBTFRILAotCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsCi0JUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWSwKLQlQT1dFUl9TVVBQTFlfUFJPUF9DWUNMRV9DT1VOVCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVywKLQlQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVywKLQlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWSwKLQlQT1dFUl9TVVBQTFlfUFJPUF9URU1QLAotCVBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRU1QVFlfQVZHLAotCVBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRlVMTF9BVkcsCi0JUE9XRVJfU1VQUExZX1BST1BfU0VSSUFMX05VTUJFUiwKLQlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTl9ERVNJR04sCi0JUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NQVhfREVTSUdOLAotCVBPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9OT1csCi0JUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX0ZVTEwsCi0JUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX0ZVTExfREVTSUdOLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9OT1csCi0JUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTEwsCi0JUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTExfREVTSUdOLAotCS8qIFByb3BlcnRpZXMgb2YgdHlwZSBgY29uc3QgY2hhciAqJyAqLwotCVBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUiwKLQlQT1dFUl9TVVBQTFlfUFJPUF9NT0RFTF9OQU1FCi19OwotCi1zdHJ1Y3Qgc2JzX2luZm8gewotCXN0cnVjdCBpMmNfY2xpZW50CQkqY2xpZW50OwotCXN0cnVjdCBwb3dlcl9zdXBwbHkJCSpwb3dlcl9zdXBwbHk7Ci0Jc3RydWN0IHNic19wbGF0Zm9ybV9kYXRhCSpwZGF0YTsKLQlib29sCQkJCWlzX3ByZXNlbnQ7Ci0JYm9vbAkJCQlncGlvX2RldGVjdDsKLQlib29sCQkJCWVuYWJsZV9kZXRlY3Rpb247Ci0JaW50CQkJCWlycTsKLQlpbnQJCQkJbGFzdF9zdGF0ZTsKLQlpbnQJCQkJcG9sbF90aW1lOwotCXN0cnVjdCBkZWxheWVkX3dvcmsJCXdvcms7Ci0JaW50CQkJCWlnbm9yZV9jaGFuZ2VzOwotfTsKLQotc3RhdGljIGNoYXIgbW9kZWxfbmFtZVtJMkNfU01CVVNfQkxPQ0tfTUFYICsgMV07Ci1zdGF0aWMgY2hhciBtYW51ZmFjdHVyZXJbSTJDX1NNQlVTX0JMT0NLX01BWCArIDFdOwotc3RhdGljIGJvb2wgZm9yY2VfbG9hZDsKLQotc3RhdGljIGludCBzYnNfcmVhZF93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggYWRkcmVzcykKLXsKLQlzdHJ1Y3Qgc2JzX2luZm8gKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlzMzIgcmV0ID0gMDsKLQlpbnQgcmV0cmllcyA9IDE7Ci0KLQlpZiAoY2hpcC0+cGRhdGEpCi0JCXJldHJpZXMgPSBtYXgoY2hpcC0+cGRhdGEtPmkyY19yZXRyeV9jb3VudCArIDEsIDEpOwotCi0Jd2hpbGUgKHJldHJpZXMgPiAwKSB7Ci0JCXJldCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIGFkZHJlc3MpOwotCQlpZiAocmV0ID49IDApCi0JCQlicmVhazsKLQkJcmV0cmllcy0tOwotCX0KLQotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9kYmcoJmNsaWVudC0+ZGV2LAotCQkJIiVzOiBpMmMgcmVhZCBhdCBhZGRyZXNzIDB4JXggZmFpbGVkXG4iLAotCQkJX19mdW5jX18sIGFkZHJlc3MpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiBsZTE2X3RvX2NwdShyZXQpOwotfQotCi1zdGF0aWMgaW50IHNic19yZWFkX3N0cmluZ19kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGFkZHJlc3MsCi0JCQkJY2hhciAqdmFsdWVzKQotewotCXN0cnVjdCBzYnNfaW5mbyAqY2hpcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCXMzMiByZXQgPSAwLCBibG9ja19sZW5ndGggPSAwOwotCWludCByZXRyaWVzX2xlbmd0aCA9IDEsIHJldHJpZXNfYmxvY2sgPSAxOwotCXU4IGJsb2NrX2J1ZmZlcltJMkNfU01CVVNfQkxPQ0tfTUFYICsgMV07Ci0KLQlpZiAoY2hpcC0+cGRhdGEpIHsKLQkJcmV0cmllc19sZW5ndGggPSBtYXgoY2hpcC0+cGRhdGEtPmkyY19yZXRyeV9jb3VudCArIDEsIDEpOwotCQlyZXRyaWVzX2Jsb2NrID0gbWF4KGNoaXAtPnBkYXRhLT5pMmNfcmV0cnlfY291bnQgKyAxLCAxKTsKLQl9Ci0KLQkvKiBBZGFwdGVyIG5lZWRzIHRvIHN1cHBvcnQgdGhlc2UgdHdvIGZ1bmN0aW9ucyAqLwotCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLAotCQkJCSAgICAgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIHwKLQkJCQkgICAgIEkyQ19GVU5DX1NNQlVTX0kyQ19CTE9DSykpewotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQkvKiBHZXQgdGhlIGxlbmd0aCBvZiBibG9jayBkYXRhICovCi0Jd2hpbGUgKHJldHJpZXNfbGVuZ3RoID4gMCkgewotCQlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBhZGRyZXNzKTsKLQkJaWYgKHJldCA+PSAwKQotCQkJYnJlYWs7Ci0JCXJldHJpZXNfbGVuZ3RoLS07Ci0JfQotCi0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2RiZygmY2xpZW50LT5kZXYsCi0JCQkiJXM6IGkyYyByZWFkIGF0IGFkZHJlc3MgMHgleCBmYWlsZWRcbiIsCi0JCQlfX2Z1bmNfXywgYWRkcmVzcyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogYmxvY2tfbGVuZ3RoIGRvZXMgbm90IGluY2x1ZGUgTlVMTCB0ZXJtaW5hdG9yICovCi0JYmxvY2tfbGVuZ3RoID0gcmV0OwotCWlmIChibG9ja19sZW5ndGggPiBJMkNfU01CVVNfQkxPQ0tfTUFYKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LAotCQkJIiVzOiBSZXR1cm5lZCBibG9ja19sZW5ndGggaXMgbG9uZ2VyIHRoYW4gMHgleFxuIiwKLQkJCV9fZnVuY19fLCBJMkNfU01CVVNfQkxPQ0tfTUFYKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogR2V0IHRoZSBibG9jayBkYXRhICovCi0Jd2hpbGUgKHJldHJpZXNfYmxvY2sgPiAwKSB7Ci0JCXJldCA9IGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKAotCQkJCWNsaWVudCwgYWRkcmVzcywKLQkJCQlibG9ja19sZW5ndGggKyAxLCBibG9ja19idWZmZXIpOwotCQlpZiAocmV0ID49IDApCi0JCQlicmVhazsKLQkJcmV0cmllc19ibG9jay0tOwotCX0KLQotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9kYmcoJmNsaWVudC0+ZGV2LAotCQkJIiVzOiBpMmMgcmVhZCBhdCBhZGRyZXNzIDB4JXggZmFpbGVkXG4iLAotCQkJX19mdW5jX18sIGFkZHJlc3MpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qIGJsb2NrX2J1ZmZlclswXSA9PSBibG9ja19sZW5ndGggKi8KLQltZW1jcHkodmFsdWVzLCBibG9ja19idWZmZXIgKyAxLCBibG9ja19sZW5ndGgpOwotCXZhbHVlc1tibG9ja19sZW5ndGhdID0gJ1wwJzsKLQotCXJldHVybiBsZTE2X3RvX2NwdShyZXQpOwotfQotCi1zdGF0aWMgaW50IHNic193cml0ZV93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggYWRkcmVzcywKLQl1MTYgdmFsdWUpCi17Ci0Jc3RydWN0IHNic19pbmZvICpjaGlwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JczMyIHJldCA9IDA7Ci0JaW50IHJldHJpZXMgPSAxOwotCi0JaWYgKGNoaXAtPnBkYXRhKQotCQlyZXRyaWVzID0gbWF4KGNoaXAtPnBkYXRhLT5pMmNfcmV0cnlfY291bnQgKyAxLCAxKTsKLQotCXdoaWxlIChyZXRyaWVzID4gMCkgewotCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgYWRkcmVzcywKLQkJCWxlMTZfdG9fY3B1KHZhbHVlKSk7Ci0JCWlmIChyZXQgPj0gMCkKLQkJCWJyZWFrOwotCQlyZXRyaWVzLS07Ci0JfQotCi0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2RiZygmY2xpZW50LT5kZXYsCi0JCQkiJXM6IGkyYyB3cml0ZSB0byBhZGRyZXNzIDB4JXggZmFpbGVkXG4iLAotCQkJX19mdW5jX18sIGFkZHJlc3MpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNic19nZXRfYmF0dGVyeV9wcmVzZW5jZV9hbmRfaGVhbHRoKAotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKLQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQotewotCXMzMiByZXQ7Ci0Jc3RydWN0IHNic19pbmZvICpjaGlwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KLQlpZiAocHNwID09IFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQgJiYKLQkJY2hpcC0+Z3Bpb19kZXRlY3QpIHsKLQkJcmV0ID0gZ3Bpb19nZXRfdmFsdWUoY2hpcC0+cGRhdGEtPmJhdHRlcnlfZGV0ZWN0KTsKLQkJaWYgKHJldCA9PSBjaGlwLT5wZGF0YS0+YmF0dGVyeV9kZXRlY3RfcHJlc2VudCkKLQkJCXZhbC0+aW50dmFsID0gMTsKLQkJZWxzZQotCQkJdmFsLT5pbnR2YWwgPSAwOwotCQljaGlwLT5pc19wcmVzZW50ID0gdmFsLT5pbnR2YWw7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogV3JpdGUgdG8gTWFudWZhY3R1cmVyQWNjZXNzIHdpdGgKLQkgKiBNYW51ZmFjdHVyZXJBY2Nlc3MgY29tbWFuZCBhbmQgdGhlbgotCSAqIHJlYWQgdGhlIHN0YXR1cyAqLwotCXJldCA9IHNic193cml0ZV93b3JkX2RhdGEoY2xpZW50LCBzYnNfZGF0YVtSRUdfTUFOVUZBQ1RVUkVSX0RBVEFdLmFkZHIsCi0JCQkJCU1BTlVGQUNUVVJFUl9BQ0NFU1NfU1RBVFVTKTsKLQlpZiAocmV0IDwgMCkgewotCQlpZiAocHNwID09IFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQpCi0JCQl2YWwtPmludHZhbCA9IDA7IC8qIGJhdHRlcnkgcmVtb3ZlZCAqLwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IHNic19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHNic19kYXRhW1JFR19NQU5VRkFDVFVSRVJfREFUQV0uYWRkcik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAocmV0IDwgc2JzX2RhdGFbUkVHX01BTlVGQUNUVVJFUl9EQVRBXS5taW5fdmFsdWUgfHwKLQkgICAgcmV0ID4gc2JzX2RhdGFbUkVHX01BTlVGQUNUVVJFUl9EQVRBXS5tYXhfdmFsdWUpIHsKLQkJdmFsLT5pbnR2YWwgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBNYXNrIHRoZSB1cHBlciBuaWJibGUgb2YgMm5kIGJ5dGUgYW5kCi0JICogbG93ZXIgYnl0ZSBvZiByZXNwb25zZSB0aGVuCi0JICogc2hpZnQgdGhlIHJlc3VsdCBieSA4IHRvIGdldCBzdGF0dXMqLwotCXJldCAmPSAweDBGMDA7Ci0JcmV0ID4+PSA4OwotCWlmIChwc3AgPT0gUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCkgewotCQlpZiAocmV0ID09IDB4MEYpCi0JCQkvKiBiYXR0ZXJ5IHJlbW92ZWQgKi8KLQkJCXZhbC0+aW50dmFsID0gMDsKLQkJZWxzZQotCQkJdmFsLT5pbnR2YWwgPSAxOwotCX0gZWxzZSBpZiAocHNwID09IFBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCkgewotCQlpZiAocmV0ID09IDB4MDkpCi0JCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfVU5TUEVDX0ZBSUxVUkU7Ci0JCWVsc2UgaWYgKHJldCA9PSAweDBCKQotCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJIRUFUOwotCQllbHNlIGlmIChyZXQgPT0gMHgwQykKLQkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9ERUFEOwotCQllbHNlCi0JCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfR09PRDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzYnNfZ2V0X2JhdHRlcnlfcHJvcGVydHkoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQlpbnQgcmVnX29mZnNldCwgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAotCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCi17Ci0Jc3RydWN0IHNic19pbmZvICpjaGlwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JczMyIHJldDsKLQotCXJldCA9IHNic19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHNic19kYXRhW3JlZ19vZmZzZXRdLmFkZHIpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JLyogcmV0dXJuZWQgdmFsdWVzIGFyZSAxNiBiaXQgKi8KLQlpZiAoc2JzX2RhdGFbcmVnX29mZnNldF0ubWluX3ZhbHVlIDwgMCkKLQkJcmV0ID0gKHMxNilyZXQ7Ci0KLQlpZiAocmV0ID49IHNic19kYXRhW3JlZ19vZmZzZXRdLm1pbl92YWx1ZSAmJgotCSAgICByZXQgPD0gc2JzX2RhdGFbcmVnX29mZnNldF0ubWF4X3ZhbHVlKSB7Ci0JCXZhbC0+aW50dmFsID0gcmV0OwotCQlpZiAocHNwICE9IFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUykKLQkJCXJldHVybiAwOwotCi0JCWlmIChyZXQgJiBCQVRURVJZX0ZVTExfQ0hBUkdFRCkKLQkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19GVUxMOwotCQllbHNlIGlmIChyZXQgJiBCQVRURVJZX0RJU0NIQVJHSU5HKQotCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOwotCQllbHNlCi0JCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7Ci0KLQkJaWYgKGNoaXAtPnBvbGxfdGltZSA9PSAwKQotCQkJY2hpcC0+bGFzdF9zdGF0ZSA9IHZhbC0+aW50dmFsOwotCQllbHNlIGlmIChjaGlwLT5sYXN0X3N0YXRlICE9IHZhbC0+aW50dmFsKSB7Ci0JCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmNoaXAtPndvcmspOwotCQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoY2hpcC0+cG93ZXJfc3VwcGx5KTsKLQkJCWNoaXAtPnBvbGxfdGltZSA9IDA7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAocHNwID09IFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUykKLQkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOwotCQllbHNlCi0JCQl2YWwtPmludHZhbCA9IDA7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2JzX2dldF9iYXR0ZXJ5X3N0cmluZ19wcm9wZXJ0eShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCWludCByZWdfb2Zmc2V0LCBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsIGNoYXIgKnZhbCkKLXsKLQlzMzIgcmV0OwotCi0JcmV0ID0gc2JzX3JlYWRfc3RyaW5nX2RhdGEoY2xpZW50LCBzYnNfZGF0YVtyZWdfb2Zmc2V0XS5hZGRyLCB2YWwpOwotCi0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgIHNic191bml0X2FkanVzdG1lbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCi17Ci0jZGVmaW5lIEJBU0VfVU5JVF9DT05WRVJTSU9OCQkxMDAwCi0jZGVmaW5lIEJBVFRFUllfTU9ERV9DQVBfTVVMVF9XQVRUCSgxMCAqIEJBU0VfVU5JVF9DT05WRVJTSU9OKQotI2RlZmluZSBUSU1FX1VOSVRfQ09OVkVSU0lPTgkJNjAKLSNkZWZpbmUgVEVNUF9LRUxWSU5fVE9fQ0VMU0lVUwkJMjczMQotCXN3aXRjaCAocHNwKSB7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfTk9XOgotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX0ZVTEw6Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfRlVMTF9ERVNJR046Ci0JCS8qIHNicyBwcm92aWRlcyBlbmVyZ3kgaW4gdW5pdHMgb2YgMTBtV2guCi0JCSAqIENvbnZlcnQgdG8gwrVXaAotCQkgKi8KLQkJdmFsLT5pbnR2YWwgKj0gQkFUVEVSWV9NT0RFX0NBUF9NVUxUX1dBVFQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOX0RFU0lHTjoKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYX0RFU0lHTjoKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XOgotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVzoKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMOgotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTExfREVTSUdOOgotCQl2YWwtPmludHZhbCAqPSBCQVNFX1VOSVRfQ09OVkVSU0lPTjsKLQkJYnJlYWs7Ci0KLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVA6Ci0JCS8qIHNicyBwcm92aWRlcyBiYXR0ZXJ5IHRlbXBlcmF0dXJlIGluIDAuMUsKLQkJICogc28gY29udmVydCBpdCB0byAwLjHCsEMKLQkJICovCi0JCXZhbC0+aW50dmFsIC09IFRFTVBfS0VMVklOX1RPX0NFTFNJVVM7Ci0JCWJyZWFrOwotCi0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0VNUFRZX0FWRzoKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRlVMTF9BVkc6Ci0JCS8qIHNicyBwcm92aWRlcyB0aW1lIHRvIGVtcHR5IGFuZCB0aW1lIHRvIGZ1bGwgaW4gbWludXRlcy4KLQkJICogQ29udmVydCB0byBzZWNvbmRzCi0JCSAqLwotCQl2YWwtPmludHZhbCAqPSBUSU1FX1VOSVRfQ09OVkVSU0lPTjsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlkZXZfZGJnKCZjbGllbnQtPmRldiwKLQkJCSIlczogbm8gbmVlZCBmb3IgdW5pdCBjb252ZXJzaW9uICVkXG4iLCBfX2Z1bmNfXywgcHNwKTsKLQl9Ci19Ci0KLXN0YXRpYyBlbnVtIHNic19iYXR0ZXJ5X21vZGUgc2JzX3NldF9iYXR0ZXJ5X21vZGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQllbnVtIHNic19iYXR0ZXJ5X21vZGUgbW9kZSkKLXsKLQlpbnQgcmV0LCBvcmlnaW5hbF92YWw7Ci0KLQlvcmlnaW5hbF92YWwgPSBzYnNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCBCQVRURVJZX01PREVfT0ZGU0VUKTsKLQlpZiAob3JpZ2luYWxfdmFsIDwgMCkKLQkJcmV0dXJuIG9yaWdpbmFsX3ZhbDsKLQotCWlmICgob3JpZ2luYWxfdmFsICYgQkFUVEVSWV9NT0RFX01BU0spID09IG1vZGUpCi0JCXJldHVybiBtb2RlOwotCi0JaWYgKG1vZGUgPT0gQkFUVEVSWV9NT0RFX0FNUFMpCi0JCXJldCA9IG9yaWdpbmFsX3ZhbCAmIH5CQVRURVJZX01PREVfTUFTSzsKLQllbHNlCi0JCXJldCA9IG9yaWdpbmFsX3ZhbCB8IEJBVFRFUllfTU9ERV9NQVNLOwotCi0JcmV0ID0gc2JzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIEJBVFRFUllfTU9ERV9PRkZTRVQsIHJldCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gb3JpZ2luYWxfdmFsICYgQkFUVEVSWV9NT0RFX01BU0s7Ci19Ci0KLXN0YXRpYyBpbnQgc2JzX2dldF9iYXR0ZXJ5X2NhcGFjaXR5KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JaW50IHJlZ19vZmZzZXQsIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKLQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQotewotCXMzMiByZXQ7Ci0JZW51bSBzYnNfYmF0dGVyeV9tb2RlIG1vZGUgPSBCQVRURVJZX01PREVfV0FUVFM7Ci0KLQlpZiAocG93ZXJfc3VwcGx5X2lzX2FtcF9wcm9wZXJ0eShwc3ApKQotCQltb2RlID0gQkFUVEVSWV9NT0RFX0FNUFM7Ci0KLQltb2RlID0gc2JzX3NldF9iYXR0ZXJ5X21vZGUoY2xpZW50LCBtb2RlKTsKLQlpZiAobW9kZSA8IDApCi0JCXJldHVybiBtb2RlOwotCi0JcmV0ID0gc2JzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgc2JzX2RhdGFbcmVnX29mZnNldF0uYWRkcik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAocHNwID09IFBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZKSB7Ci0JCS8qIHNicyBzcGVjIHNheXMgdGhhdCB0aGlzIGNhbiBiZSA+MTAwICUKLQkJKiBldmVuIGlmIG1heCB2YWx1ZSBpcyAxMDAgJSAqLwotCQl2YWwtPmludHZhbCA9IG1pbihyZXQsIDEwMCk7Ci0JfSBlbHNlCi0JCXZhbC0+aW50dmFsID0gcmV0OwotCi0JcmV0ID0gc2JzX3NldF9iYXR0ZXJ5X21vZGUoY2xpZW50LCBtb2RlKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY2hhciBzYnNfc2VyaWFsWzVdOwotc3RhdGljIGludCBzYnNfZ2V0X2JhdHRlcnlfc2VyaWFsX251bWJlcihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IHNic19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHNic19kYXRhW1JFR19TRVJJQUxfTlVNQkVSXS5hZGRyKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHNwcmludGYoc2JzX3NlcmlhbCwgIiUwNHgiLCByZXQpOwotCXZhbC0+c3RydmFsID0gc2JzX3NlcmlhbDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNic19nZXRfcHJvcGVydHlfaW5kZXgoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3ApCi17Ci0JaW50IGNvdW50OwotCWZvciAoY291bnQgPSAwOyBjb3VudCA8IEFSUkFZX1NJWkUoc2JzX2RhdGEpOyBjb3VudCsrKQotCQlpZiAocHNwID09IHNic19kYXRhW2NvdW50XS5wc3ApCi0JCQlyZXR1cm4gY291bnQ7Ci0KLQlkZXZfd2FybigmY2xpZW50LT5kZXYsCi0JCSIlczogSW52YWxpZCBQcm9wZXJ0eSAtICVkXG4iLCBfX2Z1bmNfXywgcHNwKTsKLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IHNic19nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAotCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKLQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBzYnNfaW5mbyAqY2hpcCA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjaGlwLT5jbGllbnQ7Ci0KLQlzd2l0Y2ggKHBzcCkgewotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDoKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSDoKLQkJcmV0ID0gc2JzX2dldF9iYXR0ZXJ5X3ByZXNlbmNlX2FuZF9oZWFsdGgoY2xpZW50LCBwc3AsIHZhbCk7Ci0JCWlmIChwc3AgPT0gUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCkKLQkJCXJldHVybiAwOwotCQlicmVhazsKLQotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWToKLQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfVEVDSE5PTE9HWV9MSU9OOwotCQlnb3RvIGRvbmU7IC8qIGRvbid0IHRyaWdnZXIgcG93ZXJfc3VwcGx5X2NoYW5nZWQoKSEgKi8KLQotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX05PVzoKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9GVUxMOgotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX0ZVTExfREVTSUdOOgotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVzoKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMOgotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTExfREVTSUdOOgotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFk6Ci0JCXJldCA9IHNic19nZXRfcHJvcGVydHlfaW5kZXgoY2xpZW50LCBwc3ApOwotCQlpZiAocmV0IDwgMCkKLQkJCWJyZWFrOwotCi0JCXJldCA9IHNic19nZXRfYmF0dGVyeV9jYXBhY2l0eShjbGllbnQsIHJldCwgcHNwLCB2YWwpOwotCQlicmVhazsKLQotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU0VSSUFMX05VTUJFUjoKLQkJcmV0ID0gc2JzX2dldF9iYXR0ZXJ5X3NlcmlhbF9udW1iZXIoY2xpZW50LCB2YWwpOwotCQlicmVhazsKLQotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ1lDTEVfQ09VTlQ6Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XOgotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUDoKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRU1QVFlfQVZHOgotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19GVUxMX0FWRzoKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOX0RFU0lHTjoKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYX0RFU0lHTjoKLQkJcmV0ID0gc2JzX2dldF9wcm9wZXJ0eV9pbmRleChjbGllbnQsIHBzcCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJYnJlYWs7Ci0KLQkJcmV0ID0gc2JzX2dldF9iYXR0ZXJ5X3Byb3BlcnR5KGNsaWVudCwgcmV0LCBwc3AsIHZhbCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9NT0RFTF9OQU1FOgotCQlyZXQgPSBzYnNfZ2V0X3Byb3BlcnR5X2luZGV4KGNsaWVudCwgcHNwKTsKLQkJaWYgKHJldCA8IDApCi0JCQlicmVhazsKLQotCQlyZXQgPSBzYnNfZ2V0X2JhdHRlcnlfc3RyaW5nX3Byb3BlcnR5KGNsaWVudCwgcmV0LCBwc3AsCi0JCQkJCQkgICAgICBtb2RlbF9uYW1lKTsKLQkJdmFsLT5zdHJ2YWwgPSBtb2RlbF9uYW1lOwotCQlicmVhazsKLQotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfTUFOVUZBQ1RVUkVSOgotCQlyZXQgPSBzYnNfZ2V0X3Byb3BlcnR5X2luZGV4KGNsaWVudCwgcHNwKTsKLQkJaWYgKHJldCA8IDApCi0JCQlicmVhazsKLQotCQlyZXQgPSBzYnNfZ2V0X2JhdHRlcnlfc3RyaW5nX3Byb3BlcnR5KGNsaWVudCwgcmV0LCBwc3AsCi0JCQkJCQkgICAgICBtYW51ZmFjdHVyZXIpOwotCQl2YWwtPnN0cnZhbCA9IG1hbnVmYWN0dXJlcjsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKLQkJCSIlczogSU5WQUxJRCBwcm9wZXJ0eVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoIWNoaXAtPmVuYWJsZV9kZXRlY3Rpb24pCi0JCWdvdG8gZG9uZTsKLQotCWlmICghY2hpcC0+Z3Bpb19kZXRlY3QgJiYKLQkJY2hpcC0+aXNfcHJlc2VudCAhPSAocmV0ID49IDApKSB7Ci0JCWNoaXAtPmlzX3ByZXNlbnQgPSAocmV0ID49IDApOwotCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChjaGlwLT5wb3dlcl9zdXBwbHkpOwotCX0KLQotZG9uZToKLQlpZiAoIXJldCkgewotCQkvKiBDb252ZXJ0IHVuaXRzIHRvIG1hdGNoIHJlcXVpcmVtZW50cyBmb3IgcG93ZXIgc3VwcGx5IGNsYXNzICovCi0JCXNic191bml0X2FkanVzdG1lbnQoY2xpZW50LCBwc3AsIHZhbCk7Ci0JfQotCi0JZGV2X2RiZygmY2xpZW50LT5kZXYsCi0JCSIlczogcHJvcGVydHkgPSAlZCwgdmFsdWUgPSAleFxuIiwgX19mdW5jX18sIHBzcCwgdmFsLT5pbnR2YWwpOwotCi0JaWYgKHJldCAmJiBjaGlwLT5pc19wcmVzZW50KQotCQlyZXR1cm4gcmV0OwotCi0JLyogYmF0dGVyeSBub3QgcHJlc2VudCwgc28gcmV0dXJuIE5PREFUQSBmb3IgcHJvcGVydGllcyAqLwotCWlmIChyZXQpCi0JCXJldHVybiAtRU5PREFUQTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3Qgc2JzX2lycShpbnQgaXJxLCB2b2lkICpkZXZpZCkKLXsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXR0ZXJ5ID0gZGV2aWQ7Ci0KLQlwb3dlcl9zdXBwbHlfY2hhbmdlZChiYXR0ZXJ5KTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIHZvaWQgc2JzX2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KQotewotCXN0cnVjdCBzYnNfaW5mbyAqY2hpcCA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwotCi0JaWYgKGNoaXAtPmlnbm9yZV9jaGFuZ2VzID4gMCkgewotCQljaGlwLT5pZ25vcmVfY2hhbmdlcy0tOwotCQlyZXR1cm47Ci0JfQotCi0JLyogY2FuY2VsIG91dHN0YW5kaW5nIHdvcmsgKi8KLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmNoaXAtPndvcmspOwotCi0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaGlwLT53b3JrLCBIWik7Ci0JY2hpcC0+cG9sbF90aW1lID0gY2hpcC0+cGRhdGEtPnBvbGxfcmV0cnlfY291bnQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHNic19kZWxheWVkX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBzYnNfaW5mbyAqY2hpcDsKLQlzMzIgcmV0OwotCi0JY2hpcCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc2JzX2luZm8sIHdvcmsud29yayk7Ci0KLQlyZXQgPSBzYnNfcmVhZF93b3JkX2RhdGEoY2hpcC0+Y2xpZW50LCBzYnNfZGF0YVtSRUdfU1RBVFVTXS5hZGRyKTsKLQkvKiBpZiB0aGUgcmVhZCBmYWlsZWQsIGdpdmUgdXAgb24gdGhpcyB3b3JrICovCi0JaWYgKHJldCA8IDApIHsKLQkJY2hpcC0+cG9sbF90aW1lID0gMDsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChyZXQgJiBCQVRURVJZX0ZVTExfQ0hBUkdFRCkKLQkJcmV0ID0gUE9XRVJfU1VQUExZX1NUQVRVU19GVUxMOwotCWVsc2UgaWYgKHJldCAmIEJBVFRFUllfRElTQ0hBUkdJTkcpCi0JCXJldCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkc7Ci0JZWxzZQotCQlyZXQgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOwotCi0JaWYgKGNoaXAtPmxhc3Rfc3RhdGUgIT0gcmV0KSB7Ci0JCWNoaXAtPnBvbGxfdGltZSA9IDA7Ci0JCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGNoaXAtPnBvd2VyX3N1cHBseSk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGNoaXAtPnBvbGxfdGltZSA+IDApIHsKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaGlwLT53b3JrLCBIWik7Ci0JCWNoaXAtPnBvbGxfdGltZS0tOwotCQlyZXR1cm47Ci0JfQotfQotCi0jaWYgZGVmaW5lZChDT05GSUdfT0YpCi0KLSNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNic19kdF9pZHNbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInNicyxzYnMtYmF0dGVyeSIgfSwKLQl7IC5jb21wYXRpYmxlID0gInRpLGJxMjB6NzUiIH0sCi0JeyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc2JzX2R0X2lkcyk7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2JzX3BsYXRmb3JtX2RhdGEgKnNic19vZl9wb3B1bGF0ZV9wZGF0YSgKLQkJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGUgPSBjbGllbnQtPmRldi5vZl9ub2RlOwotCXN0cnVjdCBzYnNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWVudW0gb2ZfZ3Bpb19mbGFncyBncGlvX2ZsYWdzOwotCWludCByYzsKLQl1MzIgcHJvcDsKLQotCS8qIHZlcmlmeSB0aGlzIGRyaXZlciBtYXRjaGVzIHRoaXMgZGV2aWNlICovCi0JaWYgKCFvZl9ub2RlKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIGlmIHBsYXRmb3JtIGRhdGEgaXMgc2V0LCBob25vciBpdCAqLwotCWlmIChwZGF0YSkKLQkJcmV0dXJuIHBkYXRhOwotCi0JLyogZmlyc3QgbWFrZSBzdXJlIGF0IGxlYXN0IG9uZSBwcm9wZXJ0eSBpcyBzZXQsIG90aGVyd2lzZQotCSAqIGl0IHdvbid0IGNoYW5nZSBiZWhhdmlvciBmcm9tIHJ1bm5pbmcgd2l0aG91dCBwZGF0YS4KLQkgKi8KLQlpZiAoIW9mX2dldF9wcm9wZXJ0eShvZl9ub2RlLCAic2JzLGkyYy1yZXRyeS1jb3VudCIsIE5VTEwpICYmCi0JCSFvZl9nZXRfcHJvcGVydHkob2Zfbm9kZSwgInNicyxwb2xsLXJldHJ5LWNvdW50IiwgTlVMTCkgJiYKLQkJIW9mX2dldF9wcm9wZXJ0eShvZl9ub2RlLCAic2JzLGJhdHRlcnktZGV0ZWN0LWdwaW9zIiwgTlVMTCkpCi0JCWdvdG8gb2Zfb3V0OwotCi0JcGRhdGEgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2Yoc3RydWN0IHNic19wbGF0Zm9ybV9kYXRhKSwKLQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXBkYXRhKQotCQlnb3RvIG9mX291dDsKLQotCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIob2Zfbm9kZSwgInNicyxpMmMtcmV0cnktY291bnQiLCAmcHJvcCk7Ci0JaWYgKCFyYykKLQkJcGRhdGEtPmkyY19yZXRyeV9jb3VudCA9IHByb3A7Ci0KLQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG9mX25vZGUsICJzYnMscG9sbC1yZXRyeS1jb3VudCIsICZwcm9wKTsKLQlpZiAoIXJjKQotCQlwZGF0YS0+cG9sbF9yZXRyeV9jb3VudCA9IHByb3A7Ci0KLQlpZiAoIW9mX2dldF9wcm9wZXJ0eShvZl9ub2RlLCAic2JzLGJhdHRlcnktZGV0ZWN0LWdwaW9zIiwgTlVMTCkpIHsKLQkJcGRhdGEtPmJhdHRlcnlfZGV0ZWN0ID0gLTE7Ci0JCWdvdG8gb2Zfb3V0OwotCX0KLQotCXBkYXRhLT5iYXR0ZXJ5X2RldGVjdCA9IG9mX2dldF9uYW1lZF9ncGlvX2ZsYWdzKG9mX25vZGUsCi0JCQkic2JzLGJhdHRlcnktZGV0ZWN0LWdwaW9zIiwgMCwgJmdwaW9fZmxhZ3MpOwotCi0JaWYgKGdwaW9fZmxhZ3MgJiBPRl9HUElPX0FDVElWRV9MT1cpCi0JCXBkYXRhLT5iYXR0ZXJ5X2RldGVjdF9wcmVzZW50ID0gMDsKLQllbHNlCi0JCXBkYXRhLT5iYXR0ZXJ5X2RldGVjdF9wcmVzZW50ID0gMTsKLQotb2Zfb3V0OgotCXJldHVybiBwZGF0YTsKLX0KLSNlbHNlCi1zdGF0aWMgc3RydWN0IHNic19wbGF0Zm9ybV9kYXRhICpzYnNfb2ZfcG9wdWxhdGVfcGRhdGEoCi0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlyZXR1cm4gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIHNic19kZWZhdWx0X2Rlc2MgPSB7Ci0JLnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZLAotCS5wcm9wZXJ0aWVzID0gc2JzX3Byb3BlcnRpZXMsCi0JLm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShzYnNfcHJvcGVydGllcyksCi0JLmdldF9wcm9wZXJ0eSA9IHNic19nZXRfcHJvcGVydHksCi0JLmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQgPSBzYnNfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCwKLX07Ci0KLXN0YXRpYyBpbnQgc2JzX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCXN0cnVjdCBzYnNfaW5mbyAqY2hpcDsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgKnNic19kZXNjOwotCXN0cnVjdCBzYnNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKLQlpbnQgcmM7Ci0JaW50IGlycTsKLQotCXNic19kZXNjID0gZGV2bV9rbWVtZHVwKCZjbGllbnQtPmRldiwgJnNic19kZWZhdWx0X2Rlc2MsCi0JCQlzaXplb2YoKnNic19kZXNjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzYnNfZGVzYykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzYnNfZGVzYy0+bmFtZSA9IGRldm1fa2FzcHJpbnRmKCZjbGllbnQtPmRldiwgR0ZQX0tFUk5FTCwgInNicy0lcyIsCi0JCQlkZXZfbmFtZSgmY2xpZW50LT5kZXYpKTsKLQlpZiAoIXNic19kZXNjLT5uYW1lKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWNoaXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2JzX2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNoaXApCi0JCXJldHVybiAtRU5PTUVNOwotCi0JY2hpcC0+Y2xpZW50ID0gY2xpZW50OwotCWNoaXAtPmVuYWJsZV9kZXRlY3Rpb24gPSBmYWxzZTsKLQljaGlwLT5ncGlvX2RldGVjdCA9IGZhbHNlOwotCXBzeV9jZmcub2Zfbm9kZSA9IGNsaWVudC0+ZGV2Lm9mX25vZGU7Ci0JcHN5X2NmZy5kcnZfZGF0YSA9IGNoaXA7Ci0JLyogaWdub3JlIGZpcnN0IG5vdGlmaWNhdGlvbiBvZiBleHRlcm5hbCBjaGFuZ2UsIGl0IGlzIGdlbmVyYXRlZAotCSAqIGZyb20gdGhlIHBvd2VyX3N1cHBseV9yZWdpc3RlciBjYWxsIGJhY2sKLQkgKi8KLQljaGlwLT5pZ25vcmVfY2hhbmdlcyA9IDE7Ci0JY2hpcC0+bGFzdF9zdGF0ZSA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfVU5LTk9XTjsKLQotCXBkYXRhID0gc2JzX29mX3BvcHVsYXRlX3BkYXRhKGNsaWVudCk7Ci0KLQlpZiAocGRhdGEpIHsKLQkJY2hpcC0+Z3Bpb19kZXRlY3QgPSBncGlvX2lzX3ZhbGlkKHBkYXRhLT5iYXR0ZXJ5X2RldGVjdCk7Ci0JCWNoaXAtPnBkYXRhID0gcGRhdGE7Ci0JfQotCi0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgY2hpcCk7Ci0KLQlpZiAoIWNoaXAtPmdwaW9fZGV0ZWN0KQotCQlnb3RvIHNraXBfZ3BpbzsKLQotCXJjID0gZ3Bpb19yZXF1ZXN0KHBkYXRhLT5iYXR0ZXJ5X2RldGVjdCwgZGV2X25hbWUoJmNsaWVudC0+ZGV2KSk7Ci0JaWYgKHJjKSB7Ci0JCWRldl93YXJuKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IGdwaW86ICVkXG4iLCByYyk7Ci0JCWNoaXAtPmdwaW9fZGV0ZWN0ID0gZmFsc2U7Ci0JCWdvdG8gc2tpcF9ncGlvOwotCX0KLQotCXJjID0gZ3Bpb19kaXJlY3Rpb25faW5wdXQocGRhdGEtPmJhdHRlcnlfZGV0ZWN0KTsKLQlpZiAocmMpIHsKLQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGdldCBncGlvIGFzIGlucHV0OiAlZFxuIiwgcmMpOwotCQlncGlvX2ZyZWUocGRhdGEtPmJhdHRlcnlfZGV0ZWN0KTsKLQkJY2hpcC0+Z3Bpb19kZXRlY3QgPSBmYWxzZTsKLQkJZ290byBza2lwX2dwaW87Ci0JfQotCi0JaXJxID0gZ3Bpb190b19pcnEocGRhdGEtPmJhdHRlcnlfZGV0ZWN0KTsKLQlpZiAoaXJxIDw9IDApIHsKLQkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGdldCBncGlvIGFzIGlycTogJWRcbiIsIGlycSk7Ci0JCWdwaW9fZnJlZShwZGF0YS0+YmF0dGVyeV9kZXRlY3QpOwotCQljaGlwLT5ncGlvX2RldGVjdCA9IGZhbHNlOwotCQlnb3RvIHNraXBfZ3BpbzsKLQl9Ci0KLQlyYyA9IHJlcXVlc3RfaXJxKGlycSwgc2JzX2lycSwKLQkJSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfVFJJR0dFUl9GQUxMSU5HLAotCQlkZXZfbmFtZSgmY2xpZW50LT5kZXYpLCBjaGlwLT5wb3dlcl9zdXBwbHkpOwotCWlmIChyYykgewotCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBpcnE6ICVkXG4iLCByYyk7Ci0JCWdwaW9fZnJlZShwZGF0YS0+YmF0dGVyeV9kZXRlY3QpOwotCQljaGlwLT5ncGlvX2RldGVjdCA9IGZhbHNlOwotCQlnb3RvIHNraXBfZ3BpbzsKLQl9Ci0KLQljaGlwLT5pcnEgPSBpcnE7Ci0KLXNraXBfZ3BpbzoKLQkvKgotCSAqIEJlZm9yZSB3ZSByZWdpc3Rlciwgd2UgbWlnaHQgbmVlZCB0byBtYWtlIHN1cmUgd2UgY2FuIGFjdHVhbGx5IHRhbGsKLQkgKiB0byB0aGUgYmF0dGVyeS4KLQkgKi8KLQlpZiAoIWZvcmNlX2xvYWQpIHsKLQkJcmMgPSBzYnNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCBzYnNfZGF0YVtSRUdfU1RBVFVTXS5hZGRyKTsKLQotCQlpZiAocmMgPCAwKSB7Ci0JCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiBGYWlsZWQgdG8gZ2V0IGRldmljZSBzdGF0dXNcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJZ290byBleGl0X3BzdXBwbHk7Ci0JCX0KLQl9Ci0KLQljaGlwLT5wb3dlcl9zdXBwbHkgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCBzYnNfZGVzYywKLQkJCQkJCSAgICZwc3lfY2ZnKTsKLQlpZiAoSVNfRVJSKGNoaXAtPnBvd2VyX3N1cHBseSkpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsCi0JCQkiJXM6IEZhaWxlZCB0byByZWdpc3RlciBwb3dlciBzdXBwbHlcbiIsIF9fZnVuY19fKTsKLQkJcmMgPSBQVFJfRVJSKGNoaXAtPnBvd2VyX3N1cHBseSk7Ci0JCWdvdG8gZXhpdF9wc3VwcGx5OwotCX0KLQotCWRldl9pbmZvKCZjbGllbnQtPmRldiwKLQkJIiVzOiBiYXR0ZXJ5IGdhcyBnYXVnZSBkZXZpY2UgcmVnaXN0ZXJlZFxuIiwgY2xpZW50LT5uYW1lKTsKLQotCUlOSVRfREVMQVlFRF9XT1JLKCZjaGlwLT53b3JrLCBzYnNfZGVsYXllZF93b3JrKTsKLQotCWNoaXAtPmVuYWJsZV9kZXRlY3Rpb24gPSB0cnVlOwotCi0JcmV0dXJuIDA7Ci0KLWV4aXRfcHN1cHBseToKLQlpZiAoY2hpcC0+aXJxKQotCQlmcmVlX2lycShjaGlwLT5pcnEsIGNoaXAtPnBvd2VyX3N1cHBseSk7Ci0JaWYgKGNoaXAtPmdwaW9fZGV0ZWN0KQotCQlncGlvX2ZyZWUocGRhdGEtPmJhdHRlcnlfZGV0ZWN0KTsKLQotCWtmcmVlKGNoaXApOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHNic19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3Qgc2JzX2luZm8gKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQotCWlmIChjaGlwLT5pcnEpCi0JCWZyZWVfaXJxKGNoaXAtPmlycSwgY2hpcC0+cG93ZXJfc3VwcGx5KTsKLQlpZiAoY2hpcC0+Z3Bpb19kZXRlY3QpCi0JCWdwaW9fZnJlZShjaGlwLT5wZGF0YS0+YmF0dGVyeV9kZXRlY3QpOwotCi0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoY2hpcC0+cG93ZXJfc3VwcGx5KTsKLQotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmY2hpcC0+d29yayk7Ci0KLQlrZnJlZShjaGlwKTsKLQljaGlwID0gTlVMTDsKLQotCXJldHVybiAwOwotfQotCi0jaWYgZGVmaW5lZCBDT05GSUdfUE1fU0xFRVAKLQotc3RhdGljIGludCBzYnNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3Qgc2JzX2luZm8gKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlzMzIgcmV0OwotCi0JaWYgKGNoaXAtPnBvbGxfdGltZSA+IDApCi0JCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmY2hpcC0+d29yayk7Ci0KLQkvKiB3cml0ZSB0byBtYW51ZmFjdHVyZXIgYWNjZXNzIHdpdGggc2xlZXAgY29tbWFuZCAqLwotCXJldCA9IHNic193cml0ZV93b3JkX2RhdGEoY2xpZW50LCBzYnNfZGF0YVtSRUdfTUFOVUZBQ1RVUkVSX0RBVEFdLmFkZHIsCi0JCU1BTlVGQUNUVVJFUl9BQ0NFU1NfU0xFRVApOwotCWlmIChjaGlwLT5pc19wcmVzZW50ICYmIHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKHNic19wbV9vcHMsIHNic19zdXNwZW5kLCBOVUxMKTsKLSNkZWZpbmUgU0JTX1BNX09QUyAoJnNic19wbV9vcHMpCi0KLSNlbHNlCi0jZGVmaW5lIFNCU19QTV9PUFMgTlVMTAotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBzYnNfaWRbXSA9IHsKLQl7ICJicTIwejc1IiwgMCB9LAotCXsgInNicy1iYXR0ZXJ5IiwgMSB9LAotCXt9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHNic19pZCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBzYnNfYmF0dGVyeV9kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IHNic19wcm9iZSwKLQkucmVtb3ZlCQk9IHNic19yZW1vdmUsCi0JLmlkX3RhYmxlCT0gc2JzX2lkLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lCT0gInNicy1iYXR0ZXJ5IiwKLQkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHNic19kdF9pZHMpLAotCQkucG0JPSBTQlNfUE1fT1BTLAotCX0sCi19OwotbW9kdWxlX2kyY19kcml2ZXIoc2JzX2JhdHRlcnlfZHJpdmVyKTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJTQlMgYmF0dGVyeSBtb25pdG9yIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1tb2R1bGVfcGFyYW0oZm9yY2VfbG9hZCwgYm9vbCwgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RIKTsKLU1PRFVMRV9QQVJNX0RFU0MoZm9yY2VfbG9hZCwKLQkJICJBdHRlbXB0IHRvIGxvYWQgdGhlIGRyaXZlciBldmVuIGlmIG5vIGJhdHRlcnkgaXMgY29ubmVjdGVkIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyLzg4cG04NjB4X2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5Lzg4cG04NjB4X2JhdHRlcnkuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci84OHBtODYweF9iYXR0ZXJ5LmMKcmVuYW1lIHRvIGRyaXZlcnMvcG93ZXIvc3VwcGx5Lzg4cG04NjB4X2JhdHRlcnkuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci84OHBtODYweF9jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS84OHBtODYweF9jaGFyZ2VyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvODhwbTg2MHhfY2hhcmdlci5jCnJlbmFtZSB0byBkcml2ZXJzL3Bvd2VyL3N1cHBseS84OHBtODYweF9jaGFyZ2VyLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvc3VwcGx5L0tjb25maWcgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ODA2YTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9LY29uZmlnCkBAIC0wLDAgKzEsNTE0IEBACittZW51Y29uZmlnIFBPV0VSX1NVUFBMWQorCWJvb2wgIlBvd2VyIHN1cHBseSBjbGFzcyBzdXBwb3J0IgorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHBvd2VyIHN1cHBseSBjbGFzcyBzdXBwb3J0LiBUaGlzIGFsbG93cworCSAgcG93ZXIgc3VwcGx5IChiYXR0ZXJpZXMsIEFDLCBVU0IpIG1vbml0b3JpbmcgYnkgdXNlcnNwYWNlCisJICB2aWEgc3lzZnMgYW5kIHVldmVudCAoaWYgYXZhaWxhYmxlKSBhbmQvb3IgQVBNIGtlcm5lbCBpbnRlcmZhY2UKKwkgIChpZiBzZWxlY3RlZCBiZWxvdykuCisKK2lmIFBPV0VSX1NVUFBMWQorCitjb25maWcgUE9XRVJfU1VQUExZX0RFQlVHCisJYm9vbCAiUG93ZXIgc3VwcGx5IGRlYnVnIgorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIGRlYnVnZ2luZyBtZXNzYWdlcyBmb3IgcG93ZXIgc3VwcGx5IGNsYXNzCisJICBhbmQgZHJpdmVycy4KKworY29uZmlnIFBEQV9QT1dFUgorCXRyaXN0YXRlICJHZW5lcmljIFBEQS9waG9uZSBwb3dlciBkcml2ZXIiCisJZGVwZW5kcyBvbiAhUzM5MAorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIGdlbmVyaWMgcG93ZXIgZHJpdmVyIGZvciBQREFzIGFuZCBwaG9uZXMgd2l0aAorCSAgb25lIG9yIHR3byBleHRlcm5hbCBwb3dlciBzdXBwbGllcyAoQUMvVVNCKSBjb25uZWN0ZWQgdG8gbWFpbiBhbmQKKwkgIGJhY2t1cCBiYXR0ZXJpZXMsIGFuZCBvcHRpb25hbCBidWlsdGluIGNoYXJnZXIuCisKK2NvbmZpZyBBUE1fUE9XRVIKKwl0cmlzdGF0ZSAiQVBNIGVtdWxhdGlvbiBmb3IgY2xhc3MgYmF0dGVyaWVzIgorCWRlcGVuZHMgb24gQVBNX0VNVUxBVElPTgorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHN1cHBvcnQgQVBNIHN0YXR1cyBlbXVsYXRpb24gdXNpbmcKKwkgIGJhdHRlcnkgY2xhc3MgZGV2aWNlcy4KKworY29uZmlnIEdFTkVSSUNfQURDX0JBVFRFUlkKKwl0cmlzdGF0ZSAiR2VuZXJpYyBiYXR0ZXJ5IHN1cHBvcnQgdXNpbmcgSUlPIgorCWRlcGVuZHMgb24gSUlPCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIGdlbmVyaWMgYmF0dGVyeSBkcml2ZXIKKwkgIHdoaWNoIHVzZXMgSUlPIGZyYW1ld29yayB0byByZWFkIGFkYy4KKworY29uZmlnIE1BWDg5MjVfUE9XRVIKKwl0cmlzdGF0ZSAiTUFYODkyNSBiYXR0ZXJ5IGNoYXJnZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE1GRF9NQVg4OTI1CisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIGJhdHRlcnkgY2hhcmdlciBpbiB0aGUgTWF4aW0KKwkgIE1BWDg5MjUgUE1JQy4KKworY29uZmlnIFdNODMxWF9CQUNLVVAKKwl0cmlzdGF0ZSAiV004MzFYIGJhY2t1cCBiYXR0ZXJ5IGNoYXJnZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE1GRF9XTTgzMVgKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgYmFja3VwIGJhdHRlcnkgY2hhcmdlcgorCSAgaW4gdGhlIFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTgzMXggUE1JQ3MuCisKK2NvbmZpZyBXTTgzMVhfUE9XRVIKKwl0cmlzdGF0ZSAiV004MzFYIFBNVSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTUZEX1dNODMxWAorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBwb3dlciBtYW5hZ2VtZW50IHVuaXQKKwkgIHByb3ZpZGVkIGJ5IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTgzMXggUE1JQ3MuCisKK2NvbmZpZyBXTTgzNTBfUE9XRVIKKyAgICAgICAgdHJpc3RhdGUgIldNODM1MCBQTVUgc3VwcG9ydCIKKyAgICAgICAgZGVwZW5kcyBvbiBNRkRfV004MzUwCisgICAgICAgIGhlbHAKKyAgICAgICAgICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgcG93ZXIgbWFuYWdlbWVudCB1bml0CisJICBwcm92aWRlZCBieSB0aGUgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODM1MCBQTUlDLgorCitjb25maWcgVEVTVF9QT1dFUgorCXRyaXN0YXRlICJUZXN0IHBvd2VyIGRyaXZlciIKKwloZWxwCisJICBUaGlzIGRyaXZlciBpcyB1c2VkIGZvciB0ZXN0aW5nLiBJdCdzIHNhZmUgdG8gc2F5IE0gaGVyZS4KKworY29uZmlnIEJBVFRFUllfODhQTTg2MFgKKwl0cmlzdGF0ZSAiTWFydmVsbCA4OFBNODYweCBiYXR0ZXJ5IGRyaXZlciIKKwlkZXBlbmRzIG9uIE1GRF84OFBNODYwWAorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIGJhdHRlcnkgbW9uaXRvciBmb3IgTWFydmVsbCA4OFBNODYweCBjaGlwLgorCitjb25maWcgQkFUVEVSWV9BQ1Q4OTQ1QQorCXRyaXN0YXRlICJBY3RpdmUtc2VtaSBBQ1Q4OTQ1QSBjaGFyZ2VyIGRyaXZlciIKKwlkZXBlbmRzIG9uIE1GRF9BQ1Q4OTQ1QSB8fCBDT01QSUxFX1RFU1QKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBwb3dlciBzdXBwbHkgcHJvdmlkZWQgYnkKKwkgIEFjdGl2ZS1zZW1pIEFjdGl2ZVBhdGggQUNUODk0NUEgY2hhcmdlci4KKworY29uZmlnIEJBVFRFUllfRFMyNzYwCisJdHJpc3RhdGUgIkRTMjc2MCBiYXR0ZXJ5IGRyaXZlciAoSFAgaVBBUSAmIG90aGVycykiCisJZGVwZW5kcyBvbiBXMSAmJiBXMV9TTEFWRV9EUzI3NjAKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBiYXR0ZXJpZXMgd2l0aCBkczI3NjAgY2hpcC4KKworY29uZmlnIEJBVFRFUllfRFMyNzgwCisJdHJpc3RhdGUgIkRTMjc4MCBiYXR0ZXJ5IGRyaXZlciIKKwlkZXBlbmRzIG9uIEhBU19JT01FTQorCXNlbGVjdCBXMQorCXNlbGVjdCBXMV9TTEFWRV9EUzI3ODAKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBiYXR0ZXJpZXMgd2l0aCBkczI3ODAgY2hpcC4KKworY29uZmlnIEJBVFRFUllfRFMyNzgxCisJdHJpc3RhdGUgIkRTMjc4MSBiYXR0ZXJ5IGRyaXZlciIKKwlkZXBlbmRzIG9uIEhBU19JT01FTQorCXNlbGVjdCBXMQorCXNlbGVjdCBXMV9TTEFWRV9EUzI3ODEKKwloZWxwCisJICBJZiB5b3UgZW5hYmxlIHRoaXMgeW91IHdpbGwgaGF2ZSB0aGUgRFMyNzgxIGJhdHRlcnkgZHJpdmVyIHN1cHBvcnQuCisKKwkgIFRoZSBiYXR0ZXJ5IG1vbml0b3IgY2hpcCBpcyB1c2VkIGluIG1hbnkgYmF0dGVyaWVzL2RldmljZXMKKwkgIGFzIHRoZSBvbmUgd2hvIGlzIHJlc3BvbnNpYmxlIGZvciBjaGFyZ2luZy9kaXNjaGFyZ2luZy9tb25pdG9yaW5nCisJICBMaSsgYmF0dGVyaWVzLgorCisJICBJZiB5b3UgYXJlIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBCQVRURVJZX0RTMjc4MgorCXRyaXN0YXRlICJEUzI3ODIvRFMyNzg2IHN0YW5kYWxvbmUgZ2FzLWdhdWdlIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIERTMjc4Mi9EUzI3ODYgc3RhbmRhbG9uZSBiYXR0ZXJ5CisJICBnYXMtZ2F1Z2UuCisKK2NvbmZpZyBCQVRURVJZX1BNVQorCXRyaXN0YXRlICJBcHBsZSBQTVUgYmF0dGVyeSIKKwlkZXBlbmRzIG9uIFBQQzMyICYmIEFEQl9QTVUKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGV4cG9zZSBiYXR0ZXJ5IGluZm9ybWF0aW9uIG9uIEFwcGxlIG1hY2hpbmVzCisJICB0aHJvdWdoIHRoZSBnZW5lcmljIGJhdHRlcnkgY2xhc3MuCisKK2NvbmZpZyBCQVRURVJZX09MUEMKKwl0cmlzdGF0ZSAiT25lIExhcHRvcCBQZXIgQ2hpbGQgYmF0dGVyeSIKKwlkZXBlbmRzIG9uIFg4Nl8zMiAmJiBPTFBDCisJaGVscAorCSAgU2F5IFkgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBiYXR0ZXJ5IG9uIHRoZSBPTFBDIGxhcHRvcC4KKworY29uZmlnIEJBVFRFUllfVE9TQQorCXRyaXN0YXRlICJTaGFycCBTTC02MDAwICh0b3NhKSBiYXR0ZXJ5IgorCWRlcGVuZHMgb24gTUFDSF9UT1NBICYmIE1GRF9UQzYzOTNYQiAmJiBUT1VDSFNDUkVFTl9XTTk3WFgKKwloZWxwCisJICBTYXkgWSB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIGJhdHRlcnkgb24gdGhlIFNoYXJwIFphdXJ1cworCSAgU0wtNjAwMCAodG9zYSkgbW9kZWxzLgorCitjb25maWcgQkFUVEVSWV9DT0xMSUUKKwl0cmlzdGF0ZSAiU2hhcnAgU0wtNTUwMCAoY29sbGllKSBiYXR0ZXJ5IgorCWRlcGVuZHMgb24gU0ExMTAwX0NPTExJRSAmJiBNQ1BfVUNCMTIwMAorCWhlbHAKKwkgIFNheSBZIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgYmF0dGVyeSBvbiB0aGUgU2hhcnAgWmF1cnVzCisJICBTTC01NTAwIChjb2xsaWUpIG1vZGVscy4KKworY29uZmlnIEJBVFRFUllfSVBBUV9NSUNSTworCXRyaXN0YXRlICJpUEFRIEF0bWVsIE1pY3JvIEFTSUMgYmF0dGVyeSBkcml2ZXIiCisJZGVwZW5kcyBvbiBNRkRfSVBBUV9NSUNSTworCWhlbHAKKwkgIENob29zZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byBtb25pdG9yIGJhdHRlcnkgc3RhdHVzIG9uCisJICBDb21wYXEvSFAgaVBBUSBoMzEwMCBhbmQgaDM2MDAuCisKK2NvbmZpZyBCQVRURVJZX1dNOTdYWAorCWJvb2wgIldNOTd4eCBnZW5lcmljIGJhdHRlcnkgZHJpdmVyIgorCWRlcGVuZHMgb24gVE9VQ0hTQ1JFRU5fV005N1hYPXkKKwloZWxwCisJICBTYXkgWSB0byBlbmFibGUgc3VwcG9ydCBmb3IgYmF0dGVyeSBtZWFzdXJlZCBieSBXTTk3eHggYXV4IHBvcnQuCisKK2NvbmZpZyBCQVRURVJZX1NCUworICAgICAgICB0cmlzdGF0ZSAiU0JTIENvbXBsaWFudCBnYXMgZ2F1Z2UiCisgICAgICAgIGRlcGVuZHMgb24gSTJDCisgICAgICAgIGhlbHAKKwkgIFNheSBZIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgU0JTIGJhdHRlcnkgZHJpdmVyIGZvciBTQlMtY29tcGxpYW50CisJICBnYXMgZ2F1Z2VzLgorCitjb25maWcgQkFUVEVSWV9CUTI3WFhYCisJdHJpc3RhdGUgIkJRMjd4eHggYmF0dGVyeSBkcml2ZXIiCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgc3VwcG9ydCBmb3IgYmF0dGVyaWVzIHdpdGggQlEyN3h4eCBjaGlwcy4KKworY29uZmlnIEJBVFRFUllfQlEyN1hYWF9JMkMKKwl0cmlzdGF0ZSAiQlEyN3h4eCBJMkMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJBVFRFUllfQlEyN1hYWAorCWRlcGVuZHMgb24gSTJDCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgc3VwcG9ydCBmb3IgYmF0dGVyaWVzIHdpdGggQlEyN3h4eCBjaGlwcworCSAgY29ubmVjdGVkIG92ZXIgYW4gSTJDIGJ1cy4KKworY29uZmlnIEJBVFRFUllfREE5MDMwCisJdHJpc3RhdGUgIkRBOTAzMCBiYXR0ZXJ5IGRyaXZlciIKKwlkZXBlbmRzIG9uIFBNSUNfREE5MDNYCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgc3VwcG9ydCBmb3IgYmF0dGVyaWVzIGNoYXJnZXIgaW50ZWdyYXRlZCBpbnRvCisJICBEQTkwMzAgUE1JQy4KKworY29uZmlnIEJBVFRFUllfREE5MDUyCisJdHJpc3RhdGUgIkRpYWxvZyBEQTkwNTIgQmF0dGVyeSIKKwlkZXBlbmRzIG9uIFBNSUNfREE5MDUyCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgc3VwcG9ydCBmb3IgYmF0dGVyaWVzIGNoYXJnZXIgaW50ZWdyYXRlZCBpbnRvCisJICBEQTkwNTIgUE1JQy4KKworY29uZmlnIENIQVJHRVJfREE5MTUwCisJdHJpc3RhdGUgIkRpYWxvZyBTZW1pY29uZHVjdG9yIERBOTE1MCBDaGFyZ2VyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBNRkRfREE5MTUwCisJZGVwZW5kcyBvbiBEQTkxNTBfR1BBREMKKwlkZXBlbmRzIG9uIElJTworCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIGNoYXJnZXIgdW5pdCBvZiB0aGUgREE5MTUwCisJICBJbnRlZ3JhdGVkIENoYXJnZXIgJiBGdWVsLUdhdWdlIElDLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIGRhOTE1MC1jaGFyZ2VyLgorCitjb25maWcgQkFUVEVSWV9EQTkxNTAKKwl0cmlzdGF0ZSAiRGlhbG9nIFNlbWljb25kdWN0b3IgREE5MTUwIEZ1ZWwgR2F1Z2Ugc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE1GRF9EQTkxNTAKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgRnVlbC1HYXVnZSB1bml0IG9mIHRoZSBEQTkxNTAKKwkgIEludGVncmF0ZWQgQ2hhcmdlciAmIEZ1ZWwtR2F1Z2UgSUMKKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBkYTkxNTAtZmcuCisKK2NvbmZpZyBBWFAyODhfQ0hBUkdFUgorCXRyaXN0YXRlICJYLVBvd2VycyBBWFAyODggQ2hhcmdlciIKKwlkZXBlbmRzIG9uIE1GRF9BWFAyMFggJiYgRVhUQ09OX0FYUDI4OAorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBoYXZlIHN1cHBvcnQgWC1Qb3dlciBBWFAyODggcG93ZXIgbWFuYWdlbWVudCBJQyAoUE1JQykKKwkgIGludGVncmF0ZWQgY2hhcmdlci4KKworY29uZmlnIEFYUDI4OF9GVUVMX0dBVUdFCisJdHJpc3RhdGUgIlgtUG93ZXJzIEFYUDI4OCBGdWVsIEdhdWdlIgorCWRlcGVuZHMgb24gTUZEX0FYUDIwWCAmJiBJSU8KKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gaGF2ZSBzdXBwb3J0IGZvciBYLVBvd2VyIHBvd2VyIG1hbmFnZW1lbnQgSUMgKFBNSUMpCisJICBGdWVsIEdhdWdlLiBUaGUgZGV2aWNlIHByb3ZpZGVzIGJhdHRlcnkgc3RhdGlzdGljcyBhbmQgc3RhdHVzCisJICBtb25pdG9yaW5nIGFzIHdlbGwgYXMgYWxlcnRzIGZvciBiYXR0ZXJ5IG92ZXIvdW5kZXIgdm9sdGFnZSBhbmQKKwkgIG92ZXIvdW5kZXIgdGVtcGVyYXR1cmUuCisKK2NvbmZpZyBCQVRURVJZX01BWDE3MDQwCisJdHJpc3RhdGUgIk1heGltIE1BWDE3MDQwIEZ1ZWwgR2F1Z2UiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBNQVgxNzA0MCBpcyBmdWVsLWdhdWdlIHN5c3RlbXMgZm9yIGxpdGhpdW0taW9uIChMaSspIGJhdHRlcmllcworCSAgaW4gaGFuZGhlbGQgYW5kIHBvcnRhYmxlIGVxdWlwbWVudC4gVGhlIE1BWDE3MDQwIGlzIGNvbmZpZ3VyZWQKKwkgIHRvIG9wZXJhdGUgd2l0aCBhIHNpbmdsZSBsaXRoaXVtIGNlbGwKKworY29uZmlnIEJBVFRFUllfTUFYMTcwNDIKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYMTcwNDIvMTcwNDcvMTcwNTAvODk5Ny84OTY2IEZ1ZWwgR2F1Z2UiCisJZGVwZW5kcyBvbiBJMkMKKwlzZWxlY3QgUkVHTUFQX0kyQworCWhlbHAKKwkgIE1BWDE3MDQyIGlzIGZ1ZWwtZ2F1Z2Ugc3lzdGVtcyBmb3IgbGl0aGl1bS1pb24gKExpKykgYmF0dGVyaWVzCisJICBpbiBoYW5kaGVsZCBhbmQgcG9ydGFibGUgZXF1aXBtZW50LiBUaGUgTUFYMTcwNDIgaXMgY29uZmlndXJlZAorCSAgdG8gb3BlcmF0ZSB3aXRoIGEgc2luZ2xlIGxpdGhpdW0gY2VsbC4gTUFYODk5NyBhbmQgTUFYODk2NiBhcmUKKwkgIG11bHRpLWZ1bmN0aW9uIGRldmljZXMgdGhhdCBpbmNsdWRlIGZ1ZWwgZ2F1YWdlcyB0aGF0IGFyZSBjb21wYXRpYmxlCisJICB3aXRoIE1BWDE3MDQyLiBUaGlzIGRyaXZlciBhbHNvIHN1cHBvcnRzIG1heDE3MDQ3LzUwIGNoaXBzIHdoaWNoIGFyZQorCSAgaW1wcm92ZWQgdmVyc2lvbiBvZiBtYXgxNzA0Mi4KKworY29uZmlnIEJBVFRFUllfWjIKKwl0cmlzdGF0ZSAiWjIgYmF0dGVyeSBkcml2ZXIiCisJZGVwZW5kcyBvbiBJMkMgJiYgTUFDSF9aSVBJVDIKKwloZWxwCisJICBTYXkgWSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBiYXR0ZXJ5IG9uIHRoZSBaaXBpdCBaMi4KKworY29uZmlnIEJBVFRFUllfUzNDX0FEQworCXRyaXN0YXRlICJCYXR0ZXJ5IGRyaXZlciBmb3IgU2Ftc3VuZyBBREMgYmFzZWQgbW9uaXRvcmluZyIKKwlkZXBlbmRzIG9uIFMzQ19BREMKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBpUEFRIGgxOTMwL2gxOTQwL3J4MTk1MCBiYXR0ZXJ5CisKK2NvbmZpZyBCQVRURVJZX1RXTDQwMzBfTUFEQworCXRyaXN0YXRlICJUV0w0MDMwIE1BREMgYmF0dGVyeSBkcml2ZXIiCisJZGVwZW5kcyBvbiBUV0w0MDMwX01BREMKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSB0aGlzIGR1bWIgZHJpdmVyIGZvciBiYXR0ZXJpZXMgbWFuYWdlZAorCSAgdGhyb3VnaCB0aGUgVFdMNDAzMCBNQURDLgorCitjb25maWcgQ0hBUkdFUl84OFBNODYwWAorCXRyaXN0YXRlICJNYXJ2ZWxsIDg4UE04NjB4IENoYXJnZXIgZHJpdmVyIgorCWRlcGVuZHMgb24gTUZEXzg4UE04NjBYICYmIEJBVFRFUllfODhQTTg2MFgKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBjaGFyZ2VyIGZvciBNYXJ2ZWxsIDg4UE04NjB4IGNoaXAuCisKK2NvbmZpZyBDSEFSR0VSX1BDRjUwNjMzCisJdHJpc3RhdGUgIk5YUCBQQ0Y1MDYzMyBNQkMiCisJZGVwZW5kcyBvbiBNRkRfUENGNTA2MzMKKwloZWxwCisJIFNheSBZIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgTlhQIFBDRjUwNjMzIE1haW4gQmF0dGVyeSBDaGFyZ2VyLgorCitjb25maWcgQkFUVEVSWV9KWjQ3NDAKKwl0cmlzdGF0ZSAiSW5nZW5pYyBKWjQ3NDAgYmF0dGVyeSIKKwlkZXBlbmRzIG9uIE1BQ0hfSlo0NzQwCisJZGVwZW5kcyBvbiBNRkRfSlo0NzQwX0FEQworCWhlbHAKKwkgIFNheSBZIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgYmF0dGVyeSBvbiBJbmdlbmljIEpaNDc0MCBiYXNlZAorCSAgYm9hcmRzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYmUgYnVpbGQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBqejQ3NDAtYmF0dGVyeS4KKworY29uZmlnIEJBVFRFUllfSU5URUxfTUlECisJdHJpc3RhdGUgIkJhdHRlcnkgZHJpdmVyIGZvciBJbnRlbCBNSUQgcGxhdGZvcm1zIgorCWRlcGVuZHMgb24gSU5URUxfU0NVX0lQQyAmJiBTUEkKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSB0aGUgYmF0dGVyeSBkcml2ZXIgb24gSW50ZWwgTUlECisJICBwbGF0Zm9ybXMuCisKK2NvbmZpZyBCQVRURVJZX1JYNTEKKwl0cmlzdGF0ZSAiTm9raWEgUlgtNTEgKE45MDApIGJhdHRlcnkgZHJpdmVyIgorCWRlcGVuZHMgb24gVFdMNDAzMF9NQURDCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgc3VwcG9ydCBmb3IgYmF0dGVyeSBpbmZvcm1hdGlvbiBvbiBOb2tpYQorCSAgUlgtNTEsIGFsc28ga25vd24gYXMgTjkwMCB0YWJsZXQuCisKK2NvbmZpZyBDSEFSR0VSX0lTUDE3MDQKKwl0cmlzdGF0ZSAiSVNQMTcwNCBVU0IgQ2hhcmdlciBEZXRlY3Rpb24iCisJZGVwZW5kcyBvbiBVU0JfUEhZCisJZGVwZW5kcyBvbiBVU0JfR0FER0VUIHx8ICFVU0JfR0FER0VUICMgaWYgVVNCX0dBREdFVD1tLCB0aGlzIGNhbid0IGJlICd5JworCWhlbHAKKwkgIFNheSBZIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBVU0IgQ2hhcmdlciBEZXRlY3Rpb24gd2l0aAorCSAgSVNQMTcwNy9JU1AxNzA0IFVTQiB0cmFuc2NlaXZlcnMuCisKK2NvbmZpZyBDSEFSR0VSX01BWDg5MDMKKwl0cmlzdGF0ZSAiTUFYODkwMyBCYXR0ZXJ5IERDLURDIENoYXJnZXIgZm9yIFVTQiBhbmQgQWRhcHRlciBQb3dlciIKKwloZWxwCisJICBTYXkgWSB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIE1BWDg5MDMgREMtREMgY2hhcmdlciBhbmQgc3lzZnMuCisJICBUaGUgZHJpdmVyIHN1cHBvcnRzIGNvbnRyb2xsaW5nIGNoYXJnZXItZW5hYmxlIGFuZCBjdXJyZW50LWxpbWl0CisJICBwaW5zIGJhc2VkIG9uIHRoZSBzdGF0dXMgb2YgY2hhcmdlciBjb25uZWN0aW9ucyB3aXRoIGludGVycnVwdAorCSAgaGFuZGxlcnMuCisKK2NvbmZpZyBDSEFSR0VSX1RXTDQwMzAKKwl0cmlzdGF0ZSAiT01BUCBUV0w0MDMwIEJDSSBjaGFyZ2VyIGRyaXZlciIKKwlkZXBlbmRzIG9uIElJTyAmJiBUV0w0MDMwX0NPUkUKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBUV0w0MDMwIEJhdHRlcnkgQ2hhcmdlIEludGVyZmFjZS4KKworY29uZmlnIENIQVJHRVJfTFA4NzI3CisJdHJpc3RhdGUgIlRJL05hdGlvbmFsIFNlbWljb25kdWN0b3IgTFA4NzI3IGNoYXJnZXIgZHJpdmVyIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgc3VwcG9ydCBmb3IgTFA4NzI3IENoYXJnZXIgRHJpdmVyLgorCitjb25maWcgQ0hBUkdFUl9MUDg3ODgKKwl0cmlzdGF0ZSAiVEkgTFA4Nzg4IGNoYXJnZXIgZHJpdmVyIgorCWRlcGVuZHMgb24gTUZEX0xQODc4OAorCWRlcGVuZHMgb24gTFA4Nzg4X0FEQworCWRlcGVuZHMgb24gSUlPCisJaGVscAorCSAgU2F5IFkgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBMUDg3ODggbGluZWFyIGNoYXJnZXIuCisKK2NvbmZpZyBDSEFSR0VSX0dQSU8KKwl0cmlzdGF0ZSAiR1BJTyBjaGFyZ2VyIgorCWRlcGVuZHMgb24gR1BJT0xJQiB8fCBDT01QSUxFX1RFU1QKKwloZWxwCisJICBTYXkgWSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIGNoYXJnZXJzIHdoaWNoIHJlcG9ydCB0aGVpciBvbmxpbmUgc3RhdHVzCisJICB0aHJvdWdoIGEgR1BJTyBwaW4uCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBiZSBidWlsZCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIGdwaW8tY2hhcmdlci4KKworY29uZmlnIENIQVJHRVJfTUFOQUdFUgorCWJvb2wgIkJhdHRlcnkgY2hhcmdlciBtYW5hZ2VyIGZvciBtdWx0aXBsZSBjaGFyZ2VycyIKKwlkZXBlbmRzIG9uIFJFR1VMQVRPUgorCXNlbGVjdCBFWFRDT04KKwloZWxwCisgICAgICAgICAgU2F5IFkgdG8gZW5hYmxlIGNoYXJnZXItbWFuYWdlciBzdXBwb3J0LCB3aGljaCBhbGxvd3MgbXVsdGlwbGUKKyAgICAgICAgICBjaGFyZ2VycyBhdHRhY2hlZCB0byBhIGJhdHRlcnkgYW5kIG11bHRpcGxlIGJhdHRlcmllcyBhdHRhY2hlZCB0byBhCisgICAgICAgICAgc3lzdGVtLiBUaGUgY2hhcmdlci1tYW5hZ2VyIGFsc28gY2FuIG1vbml0b3IgY2hhcmdpbmcgc3RhdHVzIGluCisgICAgICAgICAgcnVudGltZSBhbmQgaW4gc3VzcGVuZC10by1SQU0gYnkgd2FraW5nIHVwIHRoZSBzeXN0ZW0gcGVyaW9kaWNhbGx5CisgICAgICAgICAgd2l0aCBoZWxwIG9mIHN1c3BlbmRfYWdhaW4gc3VwcG9ydC4KKworY29uZmlnIENIQVJHRVJfTUFYMTQ1NzcKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYMTQ1NzcvNzc4MzYgYmF0dGVyeSBjaGFyZ2VyIGRyaXZlciIKKwlkZXBlbmRzIG9uIE1GRF9NQVgxNDU3NworCWhlbHAKKwkgIFNheSBZIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgYmF0dGVyeSBjaGFyZ2VyIGNvbnRyb2wgc3lzZnMgYW5kCisJICBwbGF0Zm9ybSBkYXRhIG9mIE1BWDE0NTc3Lzc3ODM2IE1VSUNzLgorCitjb25maWcgQ0hBUkdFUl9NQVg3NzY5MworCXRyaXN0YXRlICJNYXhpbSBNQVg3NzY5MyBiYXR0ZXJ5IGNoYXJnZXIgZHJpdmVyIgorCWRlcGVuZHMgb24gTUZEX01BWDc3NjkzCisJaGVscAorCSAgU2F5IFkgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBNYXhpbSBNQVg3NzY5MyBiYXR0ZXJ5IGNoYXJnZXIuCisKK2NvbmZpZyBDSEFSR0VSX01BWDg5OTcKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYODk5Ny9NQVg4OTY2IFBNSUMgYmF0dGVyeSBjaGFyZ2VyIGRyaXZlciIKKwlkZXBlbmRzIG9uIE1GRF9NQVg4OTk3ICYmIFJFR1VMQVRPUl9NQVg4OTk3CisJaGVscAorCSAgU2F5IFkgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBiYXR0ZXJ5IGNoYXJnZXIgY29udHJvbCBzeXNmcyBhbmQKKwkgIHBsYXRmb3JtIGRhdGEgb2YgTUFYODk5Ny9MUDM5NzQgUE1JQ3MuCisKK2NvbmZpZyBDSEFSR0VSX01BWDg5OTgKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYODk5OC9MUDM5NzQgUE1JQyBiYXR0ZXJ5IGNoYXJnZXIgZHJpdmVyIgorCWRlcGVuZHMgb24gTUZEX01BWDg5OTggJiYgUkVHVUxBVE9SX01BWDg5OTgKKwloZWxwCisJICBTYXkgWSB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIGJhdHRlcnkgY2hhcmdlciBjb250cm9sIHN5c2ZzIGFuZAorCSAgcGxhdGZvcm0gZGF0YSBvZiBNQVg4OTk4L0xQMzk3NCBQTUlDcy4KKworY29uZmlnIENIQVJHRVJfUUNPTV9TTUJCCisJdHJpc3RhdGUgIlF1YWxjb21tIFN3aXRjaC1Nb2RlIEJhdHRlcnkgQ2hhcmdlciBhbmQgQm9vc3QiCisJZGVwZW5kcyBvbiBNRkRfU1BNSV9QTUlDIHx8IENPTVBJTEVfVEVTVAorCWRlcGVuZHMgb24gT0YKKwlkZXBlbmRzIG9uIEVYVENPTgorCWhlbHAKKwkgIFNheSBZIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIFN3aXRjaC1Nb2RlIEJhdHRlcnkgQ2hhcmdlciBhbmQKKwkgIEJvb3N0IChTTUJCKSBoYXJkd2FyZSBmb3VuZCBpbiBRdWFsY29tbSBQTTg5NDEgUE1JQ3MuICBUaGUgY2hhcmdlcgorCSAgaXMgYW4gaW50ZWdyYXRlZCwgc2luZ2xlLWNlbGwgbGl0aGl1bS1pb24gYmF0dGVyeSBjaGFyZ2VyLiAgRFQKKwkgIGNvbmZpZ3VyYXRpb24gaXMgcmVxdWlyZWQgZm9yIGxvYWRpbmcsIHNlZSB0aGUgZGV2aWNldHJlZQorCSAgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWwuICBUaGUgYmFzZSBuYW1lIGZvciB0aGlzIGRyaXZlciBpcworCSAgJ3BtODk0MV9jaGFyZ2VyJy4KKworY29uZmlnIENIQVJHRVJfQlEyNDE1WAorCXRyaXN0YXRlICJUSSBCUTI0MTV4IGJhdHRlcnkgY2hhcmdlciBkcml2ZXIiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBTYXkgWSB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIFRJIEJRMjQxNXggYmF0dGVyeSBjaGFyZ2VyCisJICBQTUlDcy4KKworCSAgWW91J2xsIG5lZWQgdGhpcyBkcml2ZXIgdG8gY2hhcmdlIGJhdHRlcmllcyBvbiBlLmcuIE5va2lhCisJICBSWC01MS9OOTAwLgorCitjb25maWcgQ0hBUkdFUl9CUTI0MTkwCisJdHJpc3RhdGUgIlRJIEJRMjQxOTAgYmF0dGVyeSBjaGFyZ2VyIGRyaXZlciIKKwlkZXBlbmRzIG9uIEkyQworCWRlcGVuZHMgb24gR1BJT0xJQiB8fCBDT01QSUxFX1RFU1QKKwloZWxwCisJICBTYXkgWSB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIFRJIEJRMjQxOTAgYmF0dGVyeSBjaGFyZ2VyLgorCitjb25maWcgQ0hBUkdFUl9CUTI0MjU3CisJdHJpc3RhdGUgIlRJIEJRMjQyNTAvMjQyNTEvMjQyNTcgYmF0dGVyeSBjaGFyZ2VyIGRyaXZlciIKKwlkZXBlbmRzIG9uIEkyQworCWRlcGVuZHMgb24gR1BJT0xJQiB8fCBDT01QSUxFX1RFU1QKKwlkZXBlbmRzIG9uIFJFR01BUF9JMkMKKwloZWxwCisJICBTYXkgWSB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIFRJIEJRMjQyNTAsIEJRMjQyNTEsIGFuZCBCUTI0MjU3IGJhdHRlcnkKKwkgIGNoYXJnZXJzLgorCitjb25maWcgQ0hBUkdFUl9CUTI0NzM1CisJdHJpc3RhdGUgIlRJIEJRMjQ3MzUgYmF0dGVyeSBjaGFyZ2VyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJMkMKKwlkZXBlbmRzIG9uIEdQSU9MSUIgfHwgQ09NUElMRV9URVNUCisJaGVscAorCSAgU2F5IFkgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBUSSBCUTI0NzM1IGJhdHRlcnkgY2hhcmdlci4KKworY29uZmlnIENIQVJHRVJfQlEyNTg5MAorCXRyaXN0YXRlICJUSSBCUTI1ODkwIGJhdHRlcnkgY2hhcmdlciBkcml2ZXIiCisJZGVwZW5kcyBvbiBJMkMKKwlkZXBlbmRzIG9uIEdQSU9MSUIgfHwgQ09NUElMRV9URVNUCisJc2VsZWN0IFJFR01BUF9JMkMKKwloZWxwCisJICBTYXkgWSB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIFRJIEJRMjU4OTAgYmF0dGVyeSBjaGFyZ2VyLgorCitjb25maWcgQ0hBUkdFUl9TTUIzNDcKKwl0cmlzdGF0ZSAiU3VtbWl0IE1pY3JvZWxlY3Ryb25pY3MgU01CMzQ3IEJhdHRlcnkgQ2hhcmdlciIKKwlkZXBlbmRzIG9uIEkyQworCXNlbGVjdCBSRUdNQVBfSTJDCisJaGVscAorCSAgU2F5IFkgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBTdW1taXQgTWljcm9lbGVjdHJvbmljcyBTTUIzNDcKKwkgIEJhdHRlcnkgQ2hhcmdlci4KKworY29uZmlnIENIQVJHRVJfVFBTNjUwOTAKKwl0cmlzdGF0ZSAiVFBTNjUwOTAgYmF0dGVyeSBjaGFyZ2VyIGRyaXZlciIKKwlkZXBlbmRzIG9uIE1GRF9UUFM2NTA5MAorCWhlbHAKKwkgU2F5IFkgaGVyZSB0byBlbmFibGUgc3VwcG9ydCBmb3IgYmF0dGVyeSBjaGFyZ2luZyB3aXRoIFRQUzY1MDkwCisJIFBNSUMgY2hpcHMuCisKK2NvbmZpZyBDSEFSR0VSX1RQUzY1MjE3CisJdHJpc3RhdGUgIlRQUzY1MjE3IGJhdHRlcnkgY2hhcmdlciBkcml2ZXIiCisJZGVwZW5kcyBvbiBNRkRfVFBTNjUyMTcKKwloZWxwCisJIFNheSBZIGhlcmUgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIGJhdHRlcnkgY2hhcmdpbmcgd2l0aCBUUFM2NTIxNworCSBQTUlDIGNoaXBzLgorCitjb25maWcgQkFUVEVSWV9HQVVHRV9MVEMyOTQxCisJdHJpc3RhdGUgIkxUQzI5NDEvTFRDMjk0MyBCYXR0ZXJ5IEdhdWdlIERyaXZlciIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBMVEMyOTQxIGFuZCBMVEMyOTQzIEJhdHRlcnkKKwkgIEdhdWdlIElDLiBUaGUgZHJpdmVyIHJlcG9ydHMgdGhlIGNoYXJnZSBjb3VudCBjb250aW51b3VzbHksIGFuZAorCSAgbWVhc3VyZXMgdGhlIHZvbHRhZ2UgYW5kIHRlbXBlcmF0dXJlIGV2ZXJ5IDEwIHNlY29uZHMuCisKK2NvbmZpZyBBQjg1MDBfQk0KKwlib29sICJBQjg1MDAgQmF0dGVyeSBNYW5hZ2VtZW50IERyaXZlciIKKwlkZXBlbmRzIG9uIEFCODUwMF9DT1JFICYmIEFCODUwMF9HUEFEQworCWhlbHAKKwkgIFNheSBZIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgQUI4NTAwIGJhdHRlcnkgbWFuYWdlbWVudC4KKworY29uZmlnIEJBVFRFUllfR09MREZJU0gKKwl0cmlzdGF0ZSAiR29sZGZpc2ggYmF0dGVyeSBkcml2ZXIiCisJZGVwZW5kcyBvbiBHT0xERklTSCB8fCBDT01QSUxFX1RFU1QKKwlkZXBlbmRzIG9uIEhBU19JT01FTQorCWhlbHAKKwkgIFNheSBZIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgYmF0dGVyeSBhbmQgQUMgcG93ZXIgaW4gdGhlCisJICBHb2xkZmlzaCBlbXVsYXRvci4KKworY29uZmlnIEJBVFRFUllfUlQ1MDMzCisJdHJpc3RhdGUgIlJUNTAzMyBmdWVsIGdhdWdlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBNRkRfUlQ1MDMzCisJaGVscAorCSAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIGJhdHRlcnkgZnVlbCBnYXVnZSBpbiBSaWNodGVrIFJUNTAzMyBQTUlDLgorCSAgVGhlIGZ1ZWxnYXVnZSBjYWxjdWxhdGVzIGFuZCBkZXRlcm1pbmVzIHRoZSBiYXR0ZXJ5IHN0YXRlIG9mIGNoYXJnZQorCSAgYWNjb3JkaW5nIHRvIGJhdHRlcnkgb3BlbiBjaXJjdWl0IHZvbHRhZ2UuCisKK2NvbmZpZyBDSEFSR0VSX1JUOTQ1NQorCXRyaXN0YXRlICJSaWNodGVrIFJUOTQ1NSBiYXR0ZXJ5IGNoYXJnZXIgZHJpdmVyIgorCWRlcGVuZHMgb24gSTJDCisJZGVwZW5kcyBvbiBHUElPTElCIHx8IENPTVBJTEVfVEVTVAorCXNlbGVjdCBSRUdNQVBfSTJDCisJaGVscAorCSAgU2F5IFkgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIFJpY2h0ZWsgUlQ5NDU1IGJhdHRlcnkgY2hhcmdlci4KKworY29uZmlnIEFYUDIwWF9QT1dFUgorCXRyaXN0YXRlICJBWFAyMHggcG93ZXIgc3VwcGx5IGRyaXZlciIKKwlkZXBlbmRzIG9uIE1GRF9BWFAyMFgKKwloZWxwCisJICBUaGlzIGRyaXZlciBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgcG93ZXIgc3VwcGx5IGZlYXR1cmVzIG9mCisJICBBWFAyMHggUE1JQy4KKworZW5kaWYgIyBQT1dFUl9TVVBQTFkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvc3VwcGx5L01ha2VmaWxlIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjNTk5ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L01ha2VmaWxlCkBAIC0wLDAgKzEsNzQgQEAKK3N1YmRpci1jY2ZsYWdzLSQoQ09ORklHX1BPV0VSX1NVUFBMWV9ERUJVRykgOj0gLURERUJVRworCitwb3dlcl9zdXBwbHkteQkJCQk6PSBwb3dlcl9zdXBwbHlfY29yZS5vCitwb3dlcl9zdXBwbHktJChDT05GSUdfU1lTRlMpCQkrPSBwb3dlcl9zdXBwbHlfc3lzZnMubworcG93ZXJfc3VwcGx5LSQoQ09ORklHX0xFRFNfVFJJR0dFUlMpCSs9IHBvd2VyX3N1cHBseV9sZWRzLm8KKworb2JqLSQoQ09ORklHX1BPV0VSX1NVUFBMWSkJKz0gcG93ZXJfc3VwcGx5Lm8KK29iai0kKENPTkZJR19HRU5FUklDX0FEQ19CQVRURVJZKQkrPSBnZW5lcmljLWFkYy1iYXR0ZXJ5Lm8KKworb2JqLSQoQ09ORklHX1BEQV9QT1dFUikJCSs9IHBkYV9wb3dlci5vCitvYmotJChDT05GSUdfQVBNX1BPV0VSKQkJKz0gYXBtX3Bvd2VyLm8KK29iai0kKENPTkZJR19BWFAyMFhfUE9XRVIpCSs9IGF4cDIweF91c2JfcG93ZXIubworb2JqLSQoQ09ORklHX01BWDg5MjVfUE9XRVIpCSs9IG1heDg5MjVfcG93ZXIubworb2JqLSQoQ09ORklHX1dNODMxWF9CQUNLVVApCSs9IHdtODMxeF9iYWNrdXAubworb2JqLSQoQ09ORklHX1dNODMxWF9QT1dFUikJKz0gd204MzF4X3Bvd2VyLm8KK29iai0kKENPTkZJR19XTTgzNTBfUE9XRVIpCSs9IHdtODM1MF9wb3dlci5vCitvYmotJChDT05GSUdfVEVTVF9QT1dFUikJKz0gdGVzdF9wb3dlci5vCisKK29iai0kKENPTkZJR19CQVRURVJZXzg4UE04NjBYKQkrPSA4OHBtODYweF9iYXR0ZXJ5Lm8KK29iai0kKENPTkZJR19CQVRURVJZX0FDVDg5NDVBKQkrPSBhY3Q4OTQ1YV9jaGFyZ2VyLm8KK29iai0kKENPTkZJR19CQVRURVJZX0RTMjc2MCkJKz0gZHMyNzYwX2JhdHRlcnkubworb2JqLSQoQ09ORklHX0JBVFRFUllfRFMyNzgwKQkrPSBkczI3ODBfYmF0dGVyeS5vCitvYmotJChDT05GSUdfQkFUVEVSWV9EUzI3ODEpCSs9IGRzMjc4MV9iYXR0ZXJ5Lm8KK29iai0kKENPTkZJR19CQVRURVJZX0RTMjc4MikJKz0gZHMyNzgyX2JhdHRlcnkubworb2JqLSQoQ09ORklHX0JBVFRFUllfR0FVR0VfTFRDMjk0MSkJKz0gbHRjMjk0MS1iYXR0ZXJ5LWdhdWdlLm8KK29iai0kKENPTkZJR19CQVRURVJZX0dPTERGSVNIKQkrPSBnb2xkZmlzaF9iYXR0ZXJ5Lm8KK29iai0kKENPTkZJR19CQVRURVJZX1BNVSkJKz0gcG11X2JhdHRlcnkubworb2JqLSQoQ09ORklHX0JBVFRFUllfT0xQQykJKz0gb2xwY19iYXR0ZXJ5Lm8KK29iai0kKENPTkZJR19CQVRURVJZX1RPU0EpCSs9IHRvc2FfYmF0dGVyeS5vCitvYmotJChDT05GSUdfQkFUVEVSWV9DT0xMSUUpCSs9IGNvbGxpZV9iYXR0ZXJ5Lm8KK29iai0kKENPTkZJR19CQVRURVJZX0lQQVFfTUlDUk8pICs9IGlwYXFfbWljcm9fYmF0dGVyeS5vCitvYmotJChDT05GSUdfQkFUVEVSWV9XTTk3WFgpCSs9IHdtOTd4eF9iYXR0ZXJ5Lm8KK29iai0kKENPTkZJR19CQVRURVJZX1NCUykJKz0gc2JzLWJhdHRlcnkubworb2JqLSQoQ09ORklHX0JBVFRFUllfQlEyN1hYWCkJKz0gYnEyN3h4eF9iYXR0ZXJ5Lm8KK29iai0kKENPTkZJR19CQVRURVJZX0JRMjdYWFhfSTJDKSArPSBicTI3eHh4X2JhdHRlcnlfaTJjLm8KK29iai0kKENPTkZJR19CQVRURVJZX0RBOTAzMCkJKz0gZGE5MDMwX2JhdHRlcnkubworb2JqLSQoQ09ORklHX0JBVFRFUllfREE5MDUyKQkrPSBkYTkwNTItYmF0dGVyeS5vCitvYmotJChDT05GSUdfQ0hBUkdFUl9EQTkxNTApCSs9IGRhOTE1MC1jaGFyZ2VyLm8KK29iai0kKENPTkZJR19CQVRURVJZX0RBOTE1MCkJKz0gZGE5MTUwLWZnLm8KK29iai0kKENPTkZJR19CQVRURVJZX01BWDE3MDQwKQkrPSBtYXgxNzA0MF9iYXR0ZXJ5Lm8KK29iai0kKENPTkZJR19CQVRURVJZX01BWDE3MDQyKQkrPSBtYXgxNzA0Ml9iYXR0ZXJ5Lm8KK29iai0kKENPTkZJR19CQVRURVJZX1oyKQkrPSB6Ml9iYXR0ZXJ5Lm8KK29iai0kKENPTkZJR19CQVRURVJZX1JUNTAzMykJKz0gcnQ1MDMzX2JhdHRlcnkubworb2JqLSQoQ09ORklHX0NIQVJHRVJfUlQ5NDU1KQkrPSBydDk0NTVfY2hhcmdlci5vCitvYmotJChDT05GSUdfQkFUVEVSWV9TM0NfQURDKQkrPSBzM2NfYWRjX2JhdHRlcnkubworb2JqLSQoQ09ORklHX0JBVFRFUllfVFdMNDAzMF9NQURDKQkrPSB0d2w0MDMwX21hZGNfYmF0dGVyeS5vCitvYmotJChDT05GSUdfQ0hBUkdFUl84OFBNODYwWCkJKz0gODhwbTg2MHhfY2hhcmdlci5vCitvYmotJChDT05GSUdfQ0hBUkdFUl9QQ0Y1MDYzMykJKz0gcGNmNTA2MzMtY2hhcmdlci5vCitvYmotJChDT05GSUdfQkFUVEVSWV9KWjQ3NDApCSs9IGp6NDc0MC1iYXR0ZXJ5Lm8KK29iai0kKENPTkZJR19CQVRURVJZX0lOVEVMX01JRCkJKz0gaW50ZWxfbWlkX2JhdHRlcnkubworb2JqLSQoQ09ORklHX0JBVFRFUllfUlg1MSkJKz0gcng1MV9iYXR0ZXJ5Lm8KK29iai0kKENPTkZJR19BQjg1MDBfQk0pCQkrPSBhYjg1MDBfYm1kYXRhLm8gYWI4NTAwX2NoYXJnZXIubyBhYjg1MDBfZmcubyBhYjg1MDBfYnRlbXAubyBhYng1MDBfY2hhcmdhbGcubyBwbTIzMDFfY2hhcmdlci5vCitvYmotJChDT05GSUdfQ0hBUkdFUl9JU1AxNzA0KQkrPSBpc3AxNzA0X2NoYXJnZXIubworb2JqLSQoQ09ORklHX0NIQVJHRVJfTUFYODkwMykJKz0gbWF4ODkwM19jaGFyZ2VyLm8KK29iai0kKENPTkZJR19DSEFSR0VSX1RXTDQwMzApCSs9IHR3bDQwMzBfY2hhcmdlci5vCitvYmotJChDT05GSUdfQ0hBUkdFUl9MUDg3MjcpCSs9IGxwODcyN19jaGFyZ2VyLm8KK29iai0kKENPTkZJR19DSEFSR0VSX0xQODc4OCkJKz0gbHA4Nzg4LWNoYXJnZXIubworb2JqLSQoQ09ORklHX0NIQVJHRVJfR1BJTykJKz0gZ3Bpby1jaGFyZ2VyLm8KK29iai0kKENPTkZJR19DSEFSR0VSX01BTkFHRVIpCSs9IGNoYXJnZXItbWFuYWdlci5vCitvYmotJChDT05GSUdfQ0hBUkdFUl9NQVgxNDU3NykJKz0gbWF4MTQ1NzdfY2hhcmdlci5vCitvYmotJChDT05GSUdfQ0hBUkdFUl9NQVg3NzY5MykJKz0gbWF4Nzc2OTNfY2hhcmdlci5vCitvYmotJChDT05GSUdfQ0hBUkdFUl9NQVg4OTk3KQkrPSBtYXg4OTk3X2NoYXJnZXIubworb2JqLSQoQ09ORklHX0NIQVJHRVJfTUFYODk5OCkJKz0gbWF4ODk5OF9jaGFyZ2VyLm8KK29iai0kKENPTkZJR19DSEFSR0VSX1FDT01fU01CQikJKz0gcWNvbV9zbWJiLm8KK29iai0kKENPTkZJR19DSEFSR0VSX0JRMjQxNVgpCSs9IGJxMjQxNXhfY2hhcmdlci5vCitvYmotJChDT05GSUdfQ0hBUkdFUl9CUTI0MTkwKQkrPSBicTI0MTkwX2NoYXJnZXIubworb2JqLSQoQ09ORklHX0NIQVJHRVJfQlEyNDI1NykJKz0gYnEyNDI1N19jaGFyZ2VyLm8KK29iai0kKENPTkZJR19DSEFSR0VSX0JRMjQ3MzUpCSs9IGJxMjQ3MzUtY2hhcmdlci5vCitvYmotJChDT05GSUdfQ0hBUkdFUl9CUTI1ODkwKQkrPSBicTI1ODkwX2NoYXJnZXIubworb2JqLSQoQ09ORklHX0NIQVJHRVJfU01CMzQ3KQkrPSBzbWIzNDctY2hhcmdlci5vCitvYmotJChDT05GSUdfQ0hBUkdFUl9UUFM2NTA5MCkJKz0gdHBzNjUwOTAtY2hhcmdlci5vCitvYmotJChDT05GSUdfQ0hBUkdFUl9UUFM2NTIxNykJKz0gdHBzNjUyMTdfY2hhcmdlci5vCitvYmotJChDT05GSUdfQVhQMjg4X0ZVRUxfR0FVR0UpICs9IGF4cDI4OF9mdWVsX2dhdWdlLm8KK29iai0kKENPTkZJR19BWFAyODhfQ0hBUkdFUikJKz0gYXhwMjg4X2NoYXJnZXIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9hYjg1MDBfYm1kYXRhLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9hYjg1MDBfYm1kYXRhLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvYWI4NTAwX2JtZGF0YS5jCnJlbmFtZSB0byBkcml2ZXJzL3Bvd2VyL3N1cHBseS9hYjg1MDBfYm1kYXRhLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvc3VwcGx5L2FiODUwMF9idGVtcC5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvYWI4NTAwX2J0ZW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZmZGMxOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L2FiODUwMF9idGVtcC5jCkBAIC0wLDAgKzEsMTIxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgU1QtRXJpY3Nzb24gU0EgMjAxMgorICoKKyAqIEJhdHRlcnkgdGVtcGVyYXR1cmUgZHJpdmVyIGZvciBBQjg1MDAKKyAqCisgKiBMaWNlbnNlIFRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2MgorICogQXV0aG9yOgorICoJSm9oYW4gUGFsc3NvbiA8am9oYW4ucGFsc3NvbkBzdGVyaWNzc29uLmNvbT4KKyAqCUthcmwgS29taWVyb3dza2kgPGthcmwua29taWVyb3dza2lAc3Rlcmljc3Nvbi5jb20+CisgKglBcnVuIFIgTXVydGh5IDxhcnVuLm11cnRoeUBzdGVyaWNzc29uLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9hYng1MDAuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvYWJ4NTAwL2FiODUwMC5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9hYng1MDAvYWI4NTAwLWJtLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2FieDUwMC9hYjg1MDAtZ3BhZGMuaD4KKworI2RlZmluZSBWVFZPVVRfVgkJCTE4MDAKKworI2RlZmluZSBCVEVNUF9USEVSTUFMX0xPV19MSU1JVAkJLTEwCisjZGVmaW5lIEJURU1QX1RIRVJNQUxfTUVEX0xJTUlUCQkwCisjZGVmaW5lIEJURU1QX1RIRVJNQUxfSElHSF9MSU1JVF81Mgk1MgorI2RlZmluZSBCVEVNUF9USEVSTUFMX0hJR0hfTElNSVRfNTcJNTcKKyNkZWZpbmUgQlRFTVBfVEhFUk1BTF9ISUdIX0xJTUlUXzYyCTYyCisKKyNkZWZpbmUgQlRFTVBfQkFUQ1RSTF9DVVJSX1NSQ183VUEJNworI2RlZmluZSBCVEVNUF9CQVRDVFJMX0NVUlJfU1JDXzIwVUEJMjAKKworI2RlZmluZSBCVEVNUF9CQVRDVFJMX0NVUlJfU1JDXzE2VUEJMTYKKyNkZWZpbmUgQlRFTVBfQkFUQ1RSTF9DVVJSX1NSQ18xOFVBCTE4CisKKyNkZWZpbmUgQlRFTVBfQkFUQ1RSTF9DVVJSX1NSQ182MFVBCTYwCisjZGVmaW5lIEJURU1QX0JBVENUUkxfQ1VSUl9TUkNfMTIwVUEJMTIwCisKKy8qKgorICogc3RydWN0IGFiODUwMF9idGVtcF9pbnRlcnJ1cHRzIC0gYWI4NTAwIGludGVycnVwdHMKKyAqIEBuYW1lOgluYW1lIG9mIHRoZSBpbnRlcnJ1cHQKKyAqIEBpc3IJCWZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIGlzcgorICovCitzdHJ1Y3QgYWI4NTAwX2J0ZW1wX2ludGVycnVwdHMgeworCWNoYXIgKm5hbWU7CisJaXJxcmV0dXJuX3QgKCppc3IpKGludCBpcnEsIHZvaWQgKmRhdGEpOworfTsKKworc3RydWN0IGFiODUwMF9idGVtcF9ldmVudHMgeworCWJvb2wgYmF0dF9yZW07CisJYm9vbCBidGVtcF9oaWdoOworCWJvb2wgYnRlbXBfbWVkaGlnaDsKKwlib29sIGJ0ZW1wX2xvd21lZDsKKwlib29sIGJ0ZW1wX2xvdzsKKwlib29sIGFjX2Nvbm47CisJYm9vbCB1c2JfY29ubjsKK307CisKK3N0cnVjdCBhYjg1MDBfYnRlbXBfcmFuZ2VzIHsKKwlpbnQgYnRlbXBfaGlnaF9saW1pdDsKKwlpbnQgYnRlbXBfbWVkX2xpbWl0OworCWludCBidGVtcF9sb3dfbGltaXQ7Cit9OworCisvKioKKyAqIHN0cnVjdCBhYjg1MDBfYnRlbXAgLSBhYjg1MDAgQlRFTVAgZGV2aWNlIGluZm9ybWF0aW9uCisgKiBAZGV2OgkJUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIGRldmljZQorICogQG5vZGU6CQlMaXN0IG9mIEFCODUwMCBCVEVNUHMsIGhlbmNlIHByZXBhcmVkIGZvciByZWVudHJhbmNlCisgKiBAY3Vycl9zb3VyY2U6CVdoYXQgY3VycmVudCBzb3VyY2Ugd2UgdXNlLCBpbiB1QQorICogQGJhdF90ZW1wOgkJRGlzcGF0Y2hlZCBiYXR0ZXJ5IHRlbXBlcmF0dXJlIGluIGRlZ3JlZSBDZWxjaXVzCisgKiBAcHJldl9iYXRfdGVtcAlMYXN0IG1lYXN1cmVkIGJhdHRlcnkgdGVtcGVyYXR1cmUgaW4gZGVncmVlIENlbGNpdXMKKyAqIEBwYXJlbnQ6CQlQb2ludGVyIHRvIHRoZSBzdHJ1Y3QgYWI4NTAwCisgKiBAZ3BhZGM6CQlQb2ludGVyIHRvIHRoZSBzdHJ1Y3QgZ3BhZGMKKyAqIEBmZzoJCQlQb2ludGVyIHRvIHRoZSBzdHJ1Y3QgZmcKKyAqIEBibTogICAgICAgICAgIAlQbGF0Zm9ybSBzcGVjaWZpYyBiYXR0ZXJ5IG1hbmFnZW1lbnQgaW5mb3JtYXRpb24KKyAqIEBidGVtcF9wc3k6CQlTdHJ1Y3R1cmUgZm9yIEJURU1QIHNwZWNpZmljIGJhdHRlcnkgcHJvcGVydGllcworICogQGV2ZW50czoJCVN0cnVjdHVyZSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgZXZlbnRzIHRyaWdnZXJlZAorICogQGJ0ZW1wX3JhbmdlczoJQmF0dGVyeSB0ZW1wZXJhdHVyZSByYW5nZSBzdHJ1Y3R1cmUKKyAqIEBidGVtcF93cToJCVdvcmsgcXVldWUgZm9yIG1lYXN1cmluZyB0aGUgdGVtcGVyYXR1cmUgcGVyaW9kaWNhbGx5CisgKiBAYnRlbXBfcGVyaW9kaWNfd29yazoJV29yayBmb3IgbWVhc3VyaW5nIHRoZSB0ZW1wZXJhdHVyZSBwZXJpb2RpY2FsbHkKKyAqIEBpbml0aWFsaXplZDoJVHJ1ZSBpZiBiYXR0ZXJ5IGlkIHJlYWQuCisgKi8KK3N0cnVjdCBhYjg1MDBfYnRlbXAgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisJaW50IGN1cnJfc291cmNlOworCWludCBiYXRfdGVtcDsKKwlpbnQgcHJldl9iYXRfdGVtcDsKKwlzdHJ1Y3QgYWI4NTAwICpwYXJlbnQ7CisJc3RydWN0IGFiODUwMF9ncGFkYyAqZ3BhZGM7CisJc3RydWN0IGFiODUwMF9mZyAqZmc7CisJc3RydWN0IGFieDUwMF9ibV9kYXRhICpibTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpidGVtcF9wc3k7CisJc3RydWN0IGFiODUwMF9idGVtcF9ldmVudHMgZXZlbnRzOworCXN0cnVjdCBhYjg1MDBfYnRlbXBfcmFuZ2VzIGJ0ZW1wX3JhbmdlczsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYnRlbXBfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBidGVtcF9wZXJpb2RpY193b3JrOworCWJvb2wgaW5pdGlhbGl6ZWQ7Cit9OworCisvKiBCVEVNUCBwb3dlciBzdXBwbHkgcHJvcGVydGllcyAqLworc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IGFiODUwMF9idGVtcF9wcm9wc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsCisJUE9XRVJfU1VQUExZX1BST1BfT05MSU5FLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1ksCisJUE9XRVJfU1VQUExZX1BST1BfVEVNUCwKK307CisKK3N0YXRpYyBMSVNUX0hFQUQoYWI4NTAwX2J0ZW1wX2xpc3QpOworCisvKioKKyAqIGFiODUwMF9idGVtcF9nZXQoKSAtIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHByaW1hcnkgQUI4NTAwIEJURU1QCisgKiAoaS5lLiB0aGUgZmlyc3QgQlRFTVAgaW4gdGhlIGluc3RhbmNlIGxpc3QpCisgKi8KK3N0cnVjdCBhYjg1MDBfYnRlbXAgKmFiODUwMF9idGVtcF9nZXQodm9pZCkKK3sKKwlzdHJ1Y3QgYWI4NTAwX2J0ZW1wICpidGVtcDsKKwlidGVtcCA9IGxpc3RfZmlyc3RfZW50cnkoJmFiODUwMF9idGVtcF9saXN0LCBzdHJ1Y3QgYWI4NTAwX2J0ZW1wLCBub2RlKTsKKworCXJldHVybiBidGVtcDsKK30KK0VYUE9SVF9TWU1CT0woYWI4NTAwX2J0ZW1wX2dldCk7CisKKy8qKgorICogYWI4NTAwX2J0ZW1wX2JhdGN0cmxfdm9sdF90b19yZXMoKSAtIGNvbnZlcnQgYmF0Y3RybCB2b2x0YWdlIHRvIHJlc2lzdGFuY2UKKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9idGVtcCBzdHJ1Y3R1cmUKKyAqIEB2X2JhdGN0cmw6CW1lYXN1cmVkIGJhdGN0cmwgdm9sdGFnZQorICogQGluc3RfY3VycjoJbWVhc3VyZWQgaW5zdGFudCBjdXJyZW50CisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBiYXR0ZXJ5IHJlc2lzdGFuY2UgdGhhdCBpcworICogZGVyaXZlZCBmcm9tIHRoZSBCQVRDVFJMIHZvbHRhZ2UuCisgKiBSZXR1cm5zIHZhbHVlIGluIE9obXMuCisgKi8KK3N0YXRpYyBpbnQgYWI4NTAwX2J0ZW1wX2JhdGN0cmxfdm9sdF90b19yZXMoc3RydWN0IGFiODUwMF9idGVtcCAqZGksCisJaW50IHZfYmF0Y3RybCwgaW50IGluc3RfY3VycikKK3sKKwlpbnQgcmJzOworCisJaWYgKGlzX2FiODUwMF8xcDFfb3JfZWFybGllcihkaS0+cGFyZW50KSkgeworCQkvKgorCQkgKiBGb3IgQUJCIGN1dDEuMCBhbmQgMS4xIEJBVF9DVFJMIGlzIGludGVybmFsbHkKKwkJICogY29ubmVjdGVkIHRvIDEuOFYgdGhyb3VnaCBhIDQ1MGsgcmVzaXN0b3IKKwkJICovCisJCXJldHVybiAoNDUwMDAwICogKHZfYmF0Y3RybCkpIC8gKDE4MDAgLSB2X2JhdGN0cmwpOworCX0KKworCWlmIChkaS0+Ym0tPmFkY190aGVybSA9PSBBQng1MDBfQURDX1RIRVJNX0JBVENUUkwpIHsKKwkJLyoKKwkJICogSWYgdGhlIGJhdHRlcnkgaGFzIGludGVybmFsIE5UQywgd2UgdXNlIHRoZSBjdXJyZW50CisJCSAqIHNvdXJjZSB0byBjYWxjdWxhdGUgdGhlIHJlc2lzdGFuY2UuCisJCSAqLworCQlyYnMgPSAodl9iYXRjdHJsICogMTAwMAorCQkgICAgICAgLSBkaS0+Ym0tPmduZF9saWZ0X3Jlc2lzdGFuY2UgKiBpbnN0X2N1cnIpCisJCSAgICAgIC8gZGktPmN1cnJfc291cmNlOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEJBVF9DVFJMIGlzIGludGVybmFsbHkKKwkJICogY29ubmVjdGVkIHRvIDEuOFYgdGhyb3VnaCBhIDgwayByZXNpc3RvcgorCQkgKi8KKwkJcmJzID0gKDgwMDAwICogKHZfYmF0Y3RybCkpIC8gKDE4MDAgLSB2X2JhdGN0cmwpOworCX0KKworCXJldHVybiByYnM7Cit9CisKKy8qKgorICogYWI4NTAwX2J0ZW1wX3JlYWRfYmF0Y3RybF92b2x0YWdlKCkgLSBtZWFzdXJlIGJhdGN0cmwgdm9sdGFnZQorICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2J0ZW1wIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdm9sdGFnZSBvbiBCQVRDVFJMLiBSZXR1cm5zIHZhbHVlIGluIG1WLgorICovCitzdGF0aWMgaW50IGFiODUwMF9idGVtcF9yZWFkX2JhdGN0cmxfdm9sdGFnZShzdHJ1Y3QgYWI4NTAwX2J0ZW1wICpkaSkKK3sKKwlpbnQgdmJ0ZW1wOworCXN0YXRpYyBpbnQgcHJldjsKKworCXZidGVtcCA9IGFiODUwMF9ncGFkY19jb252ZXJ0KGRpLT5ncGFkYywgQkFUX0NUUkwpOworCWlmICh2YnRlbXAgPCAwKSB7CisJCWRldl9lcnIoZGktPmRldiwKKwkJCSIlcyBncGFkYyBjb252ZXJzaW9uIGZhaWxlZCwgdXNpbmcgcHJldmlvdXMgdmFsdWUiLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gcHJldjsKKwl9CisJcHJldiA9IHZidGVtcDsKKwlyZXR1cm4gdmJ0ZW1wOworfQorCisvKioKKyAqIGFiODUwMF9idGVtcF9jdXJyX3NvdXJjZV9lbmFibGUoKSAtIGVuYWJsZS9kaXNhYmxlIGJhdGN0cmwgY3VycmVudCBzb3VyY2UKKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9idGVtcCBzdHJ1Y3R1cmUKKyAqIEBlbmFibGU6CWVuYWJsZSBvciBkaXNhYmxlIHRoZSBjdXJyZW50IHNvdXJjZQorICoKKyAqIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBjdXJyZW50IHNvdXJjZXMgZm9yIHRoZSBCYXRDdHJsIEFEIGNoYW5uZWwKKyAqLworc3RhdGljIGludCBhYjg1MDBfYnRlbXBfY3Vycl9zb3VyY2VfZW5hYmxlKHN0cnVjdCBhYjg1MDBfYnRlbXAgKmRpLAorCWJvb2wgZW5hYmxlKQoreworCWludCBjdXJyOworCWludCByZXQgPSAwOworCisJLyoKKwkgKiBCQVRDVFJMIGN1cnJlbnQgc291cmNlcyBhcmUgaW5jbHVkZWQgb24gQUI4NTAwIGN1dDIuMAorCSAqIGFuZCBmdXR1cmUgdmVyc2lvbnMKKwkgKi8KKwlpZiAoaXNfYWI4NTAwXzFwMV9vcl9lYXJsaWVyKGRpLT5wYXJlbnQpKQorCQlyZXR1cm4gMDsKKworCS8qIE9ubHkgZG8gdGhpcyBmb3IgYmF0dGVyaWVzIHdpdGggaW50ZXJuYWwgTlRDICovCisJaWYgKGRpLT5ibS0+YWRjX3RoZXJtID09IEFCeDUwMF9BRENfVEhFUk1fQkFUQ1RSTCAmJiBlbmFibGUpIHsKKworCQlpZiAoaXNfYWI4NTQwKGRpLT5wYXJlbnQpKSB7CisJCQlpZiAoZGktPmN1cnJfc291cmNlID09IEJURU1QX0JBVENUUkxfQ1VSUl9TUkNfNjBVQSkKKwkJCQljdXJyID0gQkFUX0NUUkxfNjBVX0VOQTsKKwkJCWVsc2UKKwkJCQljdXJyID0gQkFUX0NUUkxfMTIwVV9FTkE7CisJCX0gZWxzZSBpZiAoaXNfYWI5NTQwKGRpLT5wYXJlbnQpIHx8IGlzX2FiODUwNShkaS0+cGFyZW50KSkgeworCQkJaWYgKGRpLT5jdXJyX3NvdXJjZSA9PSBCVEVNUF9CQVRDVFJMX0NVUlJfU1JDXzE2VUEpCisJCQkJY3VyciA9IEJBVF9DVFJMXzE2VV9FTkE7CisJCQllbHNlCisJCQkJY3VyciA9IEJBVF9DVFJMXzE4VV9FTkE7CisJCX0gZWxzZSB7CisJCQlpZiAoZGktPmN1cnJfc291cmNlID09IEJURU1QX0JBVENUUkxfQ1VSUl9TUkNfN1VBKQorCQkJCWN1cnIgPSBCQVRfQ1RSTF83VV9FTkE7CisJCQllbHNlCisJCQkJY3VyciA9IEJBVF9DVFJMXzIwVV9FTkE7CisJCX0KKworCQlkZXZfZGJnKGRpLT5kZXYsICJTZXQgQkFUQ1RSTCAlZHVBXG4iLCBkaS0+Y3Vycl9zb3VyY2UpOworCisJCXJldCA9IGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAorCQkJQUI4NTAwX0NIQVJHRVIsIEFCODUwMF9CQVRfQ1RSTF9DVVJSRU5UX1NPVVJDRSwKKwkJCUZPUkNFX0JBVF9DVFJMX0NNUF9ISUdILCBGT1JDRV9CQVRfQ1RSTF9DTVBfSElHSCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGktPmRldiwgIiVzIGZhaWxlZCBzZXR0aW5nIGNtcF9mb3JjZVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJLyoKKwkJICogV2UgaGF2ZSB0byB3YWl0IG9uZSAzMmtIeiBjeWNsZSBiZWZvcmUgZW5hYmxpbmcKKwkJICogdGhlIGN1cnJlbnQgc291cmNlLCBzaW5jZSBGb3JjZUJhdEN0cmxDbXBIaWdoIG5lZWRzCisJCSAqIHRvIGJlIHdyaXR0ZW4gaW4gYSBzZXBhcmF0ZSBjeWNsZQorCQkgKi8KKwkJdWRlbGF5KDMyKTsKKworCQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKKwkJCUFCODUwMF9DSEFSR0VSLCBBQjg1MDBfQkFUX0NUUkxfQ1VSUkVOVF9TT1VSQ0UsCisJCQlGT1JDRV9CQVRfQ1RSTF9DTVBfSElHSCB8IGN1cnIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRpLT5kZXYsICIlcyBmYWlsZWQgZW5hYmxpbmcgY3VycmVudCBzb3VyY2VcbiIsCisJCQkJX19mdW5jX18pOworCQkJZ290byBkaXNhYmxlX2N1cnJfc291cmNlOworCQl9CisJfSBlbHNlIGlmIChkaS0+Ym0tPmFkY190aGVybSA9PSBBQng1MDBfQURDX1RIRVJNX0JBVENUUkwgJiYgIWVuYWJsZSkgeworCQlkZXZfZGJnKGRpLT5kZXYsICJEaXNhYmxlIEJBVENUUkwgY3VyciBzb3VyY2VcbiIpOworCisJCWlmIChpc19hYjg1NDAoZGktPnBhcmVudCkpIHsKKwkJCS8qIFdyaXRlIDAgdG8gdGhlIGN1cnIgYml0cyAqLworCQkJcmV0ID0gYWJ4NTAwX21hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKAorCQkJCWRpLT5kZXYsCisJCQkJQUI4NTAwX0NIQVJHRVIsIEFCODUwMF9CQVRfQ1RSTF9DVVJSRU5UX1NPVVJDRSwKKwkJCQlCQVRfQ1RSTF82MFVfRU5BIHwgQkFUX0NUUkxfMTIwVV9FTkEsCisJCQkJfihCQVRfQ1RSTF82MFVfRU5BIHwgQkFUX0NUUkxfMTIwVV9FTkEpKTsKKwkJfSBlbHNlIGlmIChpc19hYjk1NDAoZGktPnBhcmVudCkgfHwgaXNfYWI4NTA1KGRpLT5wYXJlbnQpKSB7CisJCQkvKiBXcml0ZSAwIHRvIHRoZSBjdXJyIGJpdHMgKi8KKwkJCXJldCA9IGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZSgKKwkJCQlkaS0+ZGV2LAorCQkJCUFCODUwMF9DSEFSR0VSLCBBQjg1MDBfQkFUX0NUUkxfQ1VSUkVOVF9TT1VSQ0UsCisJCQkJQkFUX0NUUkxfMTZVX0VOQSB8IEJBVF9DVFJMXzE4VV9FTkEsCisJCQkJfihCQVRfQ1RSTF8xNlVfRU5BIHwgQkFUX0NUUkxfMThVX0VOQSkpOworCQl9IGVsc2UgeworCQkJLyogV3JpdGUgMCB0byB0aGUgY3VyciBiaXRzICovCisJCQlyZXQgPSBhYng1MDBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoCisJCQkJZGktPmRldiwKKwkJCQlBQjg1MDBfQ0hBUkdFUiwgQUI4NTAwX0JBVF9DVFJMX0NVUlJFTlRfU09VUkNFLAorCQkJCUJBVF9DVFJMXzdVX0VOQSB8IEJBVF9DVFJMXzIwVV9FTkEsCisJCQkJfihCQVRfQ1RSTF83VV9FTkEgfCBCQVRfQ1RSTF8yMFVfRU5BKSk7CisJCX0KKworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRpLT5kZXYsICIlcyBmYWlsZWQgZGlzYWJsaW5nIGN1cnJlbnQgc291cmNlXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCWdvdG8gZGlzYWJsZV9jdXJyX3NvdXJjZTsKKwkJfQorCisJCS8qIEVuYWJsZSBQdWxsLVVwIGFuZCBjb21wYXJhdG9yICovCisJCXJldCA9IGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAorCQkJQUI4NTAwX0NIQVJHRVIsCUFCODUwMF9CQVRfQ1RSTF9DVVJSRU5UX1NPVVJDRSwKKwkJCUJBVF9DVFJMX1BVTExfVVBfRU5BIHwgQkFUX0NUUkxfQ01QX0VOQSwKKwkJCUJBVF9DVFJMX1BVTExfVVBfRU5BIHwgQkFUX0NUUkxfQ01QX0VOQSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGktPmRldiwgIiVzIGZhaWxlZCBlbmFibGluZyBQVSBhbmQgY29tcFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlnb3RvIGVuYWJsZV9wdV9jb21wOworCQl9CisKKwkJLyoKKwkJICogV2UgaGF2ZSB0byB3YWl0IG9uZSAzMmtIeiBjeWNsZSBiZWZvcmUgZGlzYWJsaW5nCisJCSAqIEZvcmNlQmF0Q3RybENtcEhpZ2ggc2luY2UgdGhpcyBuZWVkcyB0byBiZSB3cml0dGVuCisJCSAqIGluIGEgc2VwYXJhdGUgY3ljbGUKKwkJICovCisJCXVkZWxheSgzMik7CisKKwkJLyogRGlzYWJsZSAnZm9yY2UgY29tcGFyYXRvcicgKi8KKwkJcmV0ID0gYWJ4NTAwX21hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCisJCQlBQjg1MDBfQ0hBUkdFUiwgQUI4NTAwX0JBVF9DVFJMX0NVUlJFTlRfU09VUkNFLAorCQkJRk9SQ0VfQkFUX0NUUkxfQ01QX0hJR0gsIH5GT1JDRV9CQVRfQ1RSTF9DTVBfSElHSCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGktPmRldiwgIiVzIGZhaWxlZCBkaXNhYmxpbmcgZm9yY2UgY29tcFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlnb3RvIGRpc2FibGVfZm9yY2VfY29tcDsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBXZSBoYXZlIHRvIHRyeSB1bnNldHRpbmcgRk9SQ0VfQkFUX0NUUkxfQ01QX0hJR0ggb25lIG1vcmUgdGltZQorCSAqIGlmIHdlIGdvdCBhbiBlcnJvciBhYm92ZQorCSAqLworZGlzYWJsZV9jdXJyX3NvdXJjZToKKwlpZiAoaXNfYWI4NTQwKGRpLT5wYXJlbnQpKSB7CisJCS8qIFdyaXRlIDAgdG8gdGhlIGN1cnIgYml0cyAqLworCQlyZXQgPSBhYng1MDBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKKwkJCUFCODUwMF9DSEFSR0VSLCBBQjg1MDBfQkFUX0NUUkxfQ1VSUkVOVF9TT1VSQ0UsCisJCQlCQVRfQ1RSTF82MFVfRU5BIHwgQkFUX0NUUkxfMTIwVV9FTkEsCisJCQl+KEJBVF9DVFJMXzYwVV9FTkEgfCBCQVRfQ1RSTF8xMjBVX0VOQSkpOworCX0gZWxzZSBpZiAoaXNfYWI5NTQwKGRpLT5wYXJlbnQpIHx8IGlzX2FiODUwNShkaS0+cGFyZW50KSkgeworCQkvKiBXcml0ZSAwIHRvIHRoZSBjdXJyIGJpdHMgKi8KKwkJcmV0ID0gYWJ4NTAwX21hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCisJCQlBQjg1MDBfQ0hBUkdFUiwgQUI4NTAwX0JBVF9DVFJMX0NVUlJFTlRfU09VUkNFLAorCQkJQkFUX0NUUkxfMTZVX0VOQSB8IEJBVF9DVFJMXzE4VV9FTkEsCisJCQl+KEJBVF9DVFJMXzE2VV9FTkEgfCBCQVRfQ1RSTF8xOFVfRU5BKSk7CisJfSBlbHNlIHsKKwkJLyogV3JpdGUgMCB0byB0aGUgY3VyciBiaXRzICovCisJCXJldCA9IGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAorCQkJQUI4NTAwX0NIQVJHRVIsIEFCODUwMF9CQVRfQ1RSTF9DVVJSRU5UX1NPVVJDRSwKKwkJCUJBVF9DVFJMXzdVX0VOQSB8IEJBVF9DVFJMXzIwVV9FTkEsCisJCQl+KEJBVF9DVFJMXzdVX0VOQSB8IEJBVF9DVFJMXzIwVV9FTkEpKTsKKwl9CisKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGktPmRldiwgIiVzIGZhaWxlZCBkaXNhYmxpbmcgY3VycmVudCBzb3VyY2VcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiByZXQ7CisJfQorZW5hYmxlX3B1X2NvbXA6CisJLyogRW5hYmxlIFB1bGwtVXAgYW5kIGNvbXBhcmF0b3IgKi8KKwlyZXQgPSBhYng1MDBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKKwkJQUI4NTAwX0NIQVJHRVIsCUFCODUwMF9CQVRfQ1RSTF9DVVJSRU5UX1NPVVJDRSwKKwkJQkFUX0NUUkxfUFVMTF9VUF9FTkEgfCBCQVRfQ1RSTF9DTVBfRU5BLAorCQlCQVRfQ1RSTF9QVUxMX1VQX0VOQSB8IEJBVF9DVFJMX0NNUF9FTkEpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkaS0+ZGV2LCAiJXMgZmFpbGVkIGVuYWJsaW5nIFBVIGFuZCBjb21wXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gcmV0OworCX0KKworZGlzYWJsZV9mb3JjZV9jb21wOgorCS8qCisJICogV2UgaGF2ZSB0byB3YWl0IG9uZSAzMmtIeiBjeWNsZSBiZWZvcmUgZGlzYWJsaW5nCisJICogRm9yY2VCYXRDdHJsQ21wSGlnaCBzaW5jZSB0aGlzIG5lZWRzIHRvIGJlIHdyaXR0ZW4KKwkgKiBpbiBhIHNlcGFyYXRlIGN5Y2xlCisJICovCisJdWRlbGF5KDMyKTsKKworCS8qIERpc2FibGUgJ2ZvcmNlIGNvbXBhcmF0b3InICovCisJcmV0ID0gYWJ4NTAwX21hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCisJCUFCODUwMF9DSEFSR0VSLCBBQjg1MDBfQkFUX0NUUkxfQ1VSUkVOVF9TT1VSQ0UsCisJCUZPUkNFX0JBVF9DVFJMX0NNUF9ISUdILCB+Rk9SQ0VfQkFUX0NUUkxfQ01QX0hJR0gpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkaS0+ZGV2LCAiJXMgZmFpbGVkIGRpc2FibGluZyBmb3JjZSBjb21wXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYWI4NTAwX2J0ZW1wX2dldF9iYXRjdHJsX3JlcygpIC0gZ2V0IGJhdHRlcnkgcmVzaXN0YW5jZQorICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2J0ZW1wIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYmF0dGVyeSBwYWNrIGlkZW50aWZpY2F0aW9uIHJlc2lzdGFuY2UuCisgKiBSZXR1cm5zIHZhbHVlIGluIE9obXMuCisgKi8KK3N0YXRpYyBpbnQgYWI4NTAwX2J0ZW1wX2dldF9iYXRjdHJsX3JlcyhzdHJ1Y3QgYWI4NTAwX2J0ZW1wICpkaSkKK3sKKwlpbnQgcmV0OworCWludCBiYXRjdHJsID0gMDsKKwlpbnQgcmVzOworCWludCBpbnN0X2N1cnI7CisJaW50IGk7CisKKwkvKgorCSAqIEJBVENUUkwgY3VycmVudCBzb3VyY2VzIGFyZSBpbmNsdWRlZCBvbiBBQjg1MDAgY3V0Mi4wCisJICogYW5kIGZ1dHVyZSB2ZXJzaW9ucworCSAqLworCXJldCA9IGFiODUwMF9idGVtcF9jdXJyX3NvdXJjZV9lbmFibGUoZGksIHRydWUpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkaS0+ZGV2LCAiJXMgY3VyciBzb3VyY2UgZW5hYmxlZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoIWRpLT5mZykKKwkJZGktPmZnID0gYWI4NTAwX2ZnX2dldCgpOworCWlmICghZGktPmZnKSB7CisJCWRldl9lcnIoZGktPmRldiwgIk5vIGZnIGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gYWI4NTAwX2ZnX2luc3RfY3Vycl9zdGFydChkaS0+ZmcpOworCisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRpLT5kZXYsICJGYWlsZWQgdG8gc3RhcnQgY3VycmVudCBtZWFzdXJlbWVudFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJZG8geworCQltc2xlZXAoMjApOworCX0gd2hpbGUgKCFhYjg1MDBfZmdfaW5zdF9jdXJyX3N0YXJ0ZWQoZGktPmZnKSk7CisKKwlpID0gMDsKKworCWRvIHsKKwkJYmF0Y3RybCArPSBhYjg1MDBfYnRlbXBfcmVhZF9iYXRjdHJsX3ZvbHRhZ2UoZGkpOworCQlpKys7CisJCW1zbGVlcCgyMCk7CisJfSB3aGlsZSAoIWFiODUwMF9mZ19pbnN0X2N1cnJfZG9uZShkaS0+ZmcpKTsKKwliYXRjdHJsIC89IGk7CisKKwlyZXQgPSBhYjg1MDBfZmdfaW5zdF9jdXJyX2ZpbmFsaXplKGRpLT5mZywgJmluc3RfY3Vycik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRpLT5kZXYsICJGYWlsZWQgdG8gZmluYWxpemUgY3VycmVudCBtZWFzdXJlbWVudFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmVzID0gYWI4NTAwX2J0ZW1wX2JhdGN0cmxfdm9sdF90b19yZXMoZGksIGJhdGN0cmwsIGluc3RfY3Vycik7CisKKwlyZXQgPSBhYjg1MDBfYnRlbXBfY3Vycl9zb3VyY2VfZW5hYmxlKGRpLCBmYWxzZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRpLT5kZXYsICIlcyBjdXJyIHNvdXJjZSBkaXNhYmxlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gcmV0OworCX0KKworCWRldl9kYmcoZGktPmRldiwgIiVzIGJhdGN0cmw6ICVkIHJlczogJWQgaW5zdF9jdXJyOiAlZCBzYW1wbGVzOiAlZFxuIiwKKwkJX19mdW5jX18sIGJhdGN0cmwsIHJlcywgaW5zdF9jdXJyLCBpKTsKKworCXJldHVybiByZXM7Cit9CisKKy8qKgorICogYWI4NTAwX2J0ZW1wX3Jlc190b190ZW1wKCkgLSByZXNpc3RhbmNlIHRvIHRlbXBlcmF0dXJlCisgKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfYnRlbXAgc3RydWN0dXJlCisgKiBAdGJsOglwb2ludGVyIHRvIHRoZSByZXNpYXRhbmNlIHRvIHRlbXBlcmF0dXJlIHRhYmxlCisgKiBAdGJsX3NpemU6CXNpemUgb2YgdGhlIHJlc2lzdGFuY2UgdG8gdGVtcGVyYXR1cmUgdGFibGUKKyAqIEByZXM6CXJlc2lzdGFuY2UgdG8gY2FsY3VsYXRlIHRoZSB0ZW1wZXJhdHVyZSBmcm9tCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBiYXR0ZXJ5IHRlbXBlcmF0dXJlIGluIGRlZ3JlZXMgQ2VsY2l1cworICogYmFzZWQgb24gdGhlIE5UQyByZXNpc3RhbmNlLgorICovCitzdGF0aWMgaW50IGFiODUwMF9idGVtcF9yZXNfdG9fdGVtcChzdHJ1Y3QgYWI4NTAwX2J0ZW1wICpkaSwKKwljb25zdCBzdHJ1Y3QgYWJ4NTAwX3Jlc190b190ZW1wICp0YmwsIGludCB0Ymxfc2l6ZSwgaW50IHJlcykKK3sKKwlpbnQgaSwgdGVtcDsKKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgZm9ybXVsYSBmb3IgdGhlIHN0cmFpZ2h0IGxpbmUKKwkgKiBTaW1wbGUgaW50ZXJwb2xhdGlvbiBpZiB3ZSBhcmUgd2l0aGluCisJICogdGhlIHJlc2lzdGFuY2UgdGFibGUgbGltaXRzLCBleHRyYXBvbGF0ZQorCSAqIGlmIHJlc2lzdGFuY2UgaXMgb3V0c2lkZSB0aGUgbGltaXRzLgorCSAqLworCWlmIChyZXMgPiB0YmxbMF0ucmVzaXN0KQorCQlpID0gMDsKKwllbHNlIGlmIChyZXMgPD0gdGJsW3RibF9zaXplIC0gMV0ucmVzaXN0KQorCQlpID0gdGJsX3NpemUgLSAyOworCWVsc2UgeworCQlpID0gMDsKKwkJd2hpbGUgKCEocmVzIDw9IHRibFtpXS5yZXNpc3QgJiYKKwkJCXJlcyA+IHRibFtpICsgMV0ucmVzaXN0KSkKKwkJCWkrKzsKKwl9CisKKwl0ZW1wID0gdGJsW2ldLnRlbXAgKyAoKHRibFtpICsgMV0udGVtcCAtIHRibFtpXS50ZW1wKSAqCisJCShyZXMgLSB0YmxbaV0ucmVzaXN0KSkgLyAodGJsW2kgKyAxXS5yZXNpc3QgLSB0YmxbaV0ucmVzaXN0KTsKKwlyZXR1cm4gdGVtcDsKK30KKworLyoqCisgKiBhYjg1MDBfYnRlbXBfbWVhc3VyZV90ZW1wKCkgLSBtZWFzdXJlIGJhdHRlcnkgdGVtcGVyYXR1cmUKKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9idGVtcCBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIGJhdHRlcnkgdGVtcGVyYXR1cmUgKG9uIHN1Y2Nlc3MpIGVsc2UgdGhlIHByZXZpb3VzIHRlbXBlcmF0dXJlCisgKi8KK3N0YXRpYyBpbnQgYWI4NTAwX2J0ZW1wX21lYXN1cmVfdGVtcChzdHJ1Y3QgYWI4NTAwX2J0ZW1wICpkaSkKK3sKKwlpbnQgdGVtcDsKKwlzdGF0aWMgaW50IHByZXY7CisJaW50IHJiYXQsIHJudGMsIHZudGM7CisJdTggaWQ7CisKKwlpZCA9IGRpLT5ibS0+YmF0dF9pZDsKKworCWlmIChkaS0+Ym0tPmFkY190aGVybSA9PSBBQng1MDBfQURDX1RIRVJNX0JBVENUUkwgJiYKKwkJCWlkICE9IEJBVFRFUllfVU5LTk9XTikgeworCisJCXJiYXQgPSBhYjg1MDBfYnRlbXBfZ2V0X2JhdGN0cmxfcmVzKGRpKTsKKwkJaWYgKHJiYXQgPCAwKSB7CisJCQlkZXZfZXJyKGRpLT5kZXYsICIlcyBnZXQgYmF0Y3RybCByZXMgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCS8qCisJCQkgKiBSZXR1cm4gb3V0LW9mLXJhbmdlIHRlbXBlcmF0dXJlIHNvIHRoYXQKKwkJCSAqIGNoYXJnaW5nIGlzIHN0b3BwZWQKKwkJCSAqLworCQkJcmV0dXJuIEJURU1QX1RIRVJNQUxfTE9XX0xJTUlUOworCQl9CisKKwkJdGVtcCA9IGFiODUwMF9idGVtcF9yZXNfdG9fdGVtcChkaSwKKwkJCWRpLT5ibS0+YmF0X3R5cGVbaWRdLnJfdG9fdF90YmwsCisJCQlkaS0+Ym0tPmJhdF90eXBlW2lkXS5uX3RlbXBfdGJsX2VsZW1lbnRzLCByYmF0KTsKKwl9IGVsc2UgeworCQl2bnRjID0gYWI4NTAwX2dwYWRjX2NvbnZlcnQoZGktPmdwYWRjLCBCVEVNUF9CQUxMKTsKKwkJaWYgKHZudGMgPCAwKSB7CisJCQlkZXZfZXJyKGRpLT5kZXYsCisJCQkJIiVzIGdwYWRjIGNvbnZlcnNpb24gZmFpbGVkLCIKKwkJCQkiIHVzaW5nIHByZXZpb3VzIHZhbHVlXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gcHJldjsKKwkJfQorCQkvKgorCQkgKiBUaGUgUENCIE5UQyBpcyBzb3VyY2VkIGZyb20gVlRWT1VUIHZpYSBhIDIzMGtPaG0KKwkJICogcmVzaXN0b3IuCisJCSAqLworCQlybnRjID0gMjMwMDAwICogdm50YyAvIChWVFZPVVRfViAtIHZudGMpOworCisJCXRlbXAgPSBhYjg1MDBfYnRlbXBfcmVzX3RvX3RlbXAoZGksCisJCQlkaS0+Ym0tPmJhdF90eXBlW2lkXS5yX3RvX3RfdGJsLAorCQkJZGktPmJtLT5iYXRfdHlwZVtpZF0ubl90ZW1wX3RibF9lbGVtZW50cywgcm50Yyk7CisJCXByZXYgPSB0ZW1wOworCX0KKwlkZXZfZGJnKGRpLT5kZXYsICJCYXR0ZXJ5IHRlbXBlcmF0dXJlIGlzICVkXG4iLCB0ZW1wKTsKKwlyZXR1cm4gdGVtcDsKK30KKworLyoqCisgKiBhYjg1MDBfYnRlbXBfaWQoKSAtIElkZW50aWZ5IHRoZSBjb25uZWN0ZWQgYmF0dGVyeQorICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2J0ZW1wIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCB0cnkgdG8gaWRlbnRpZnkgdGhlIGJhdHRlcnkgYnkgcmVhZGluZyB0aGUgSUQKKyAqIHJlc2lzdG9yLiBTb21lIGJyYW5kcyB1c2UgYSBjb21iaW5lZCBJRCByZXNpc3RvciB3aXRoIGEgTlRDIHJlc2lzdG9yIHRvCisgKiBib3RoIGJlIGFibGUgdG8gaWRlbnRpZnkgYW5kIHRvIHJlYWQgdGhlIHRlbXBlcmF0dXJlIG9mIGl0LgorICovCitzdGF0aWMgaW50IGFiODUwMF9idGVtcF9pZChzdHJ1Y3QgYWI4NTAwX2J0ZW1wICpkaSkKK3sKKwlpbnQgcmVzOworCXU4IGk7CisJaWYgKGlzX2FiODU0MChkaS0+cGFyZW50KSkKKwkJZGktPmN1cnJfc291cmNlID0gQlRFTVBfQkFUQ1RSTF9DVVJSX1NSQ182MFVBOworCWVsc2UgaWYgKGlzX2FiOTU0MChkaS0+cGFyZW50KSB8fCBpc19hYjg1MDUoZGktPnBhcmVudCkpCisJCWRpLT5jdXJyX3NvdXJjZSA9IEJURU1QX0JBVENUUkxfQ1VSUl9TUkNfMTZVQTsKKwllbHNlCisJCWRpLT5jdXJyX3NvdXJjZSA9IEJURU1QX0JBVENUUkxfQ1VSUl9TUkNfN1VBOworCisJZGktPmJtLT5iYXR0X2lkID0gQkFUVEVSWV9VTktOT1dOOworCisJcmVzID0gIGFiODUwMF9idGVtcF9nZXRfYmF0Y3RybF9yZXMoZGkpOworCWlmIChyZXMgPCAwKSB7CisJCWRldl9lcnIoZGktPmRldiwgIiVzIGdldCBiYXRjdHJsIHJlcyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwkvKiBCQVRURVJZX1VOS05PV04gaXMgZGVmaW5lZCBvbiBwb3NpdGlvbiAwLCBza2lwIGl0ISAqLworCWZvciAoaSA9IEJBVFRFUllfVU5LTk9XTiArIDE7IGkgPCBkaS0+Ym0tPm5fYnR5cGVzOyBpKyspIHsKKwkJaWYgKChyZXMgPD0gZGktPmJtLT5iYXRfdHlwZVtpXS5yZXNpc19oaWdoKSAmJgorCQkJKHJlcyA+PSBkaS0+Ym0tPmJhdF90eXBlW2ldLnJlc2lzX2xvdykpIHsKKwkJCWRldl9kYmcoZGktPmRldiwgIkJhdHRlcnkgZGV0ZWN0ZWQgb24gJXMiCisJCQkJIiBsb3cgJWQgPCByZXMgJWQgPCBoaWdoOiAlZCIKKwkJCQkiIGluZGV4OiAlZFxuIiwKKwkJCQlkaS0+Ym0tPmFkY190aGVybSA9PSBBQng1MDBfQURDX1RIRVJNX0JBVENUUkwgPworCQkJCSJCQVRDVFJMIiA6ICJCQVRURU1QIiwKKwkJCQlkaS0+Ym0tPmJhdF90eXBlW2ldLnJlc2lzX2xvdywgcmVzLAorCQkJCWRpLT5ibS0+YmF0X3R5cGVbaV0ucmVzaXNfaGlnaCwgaSk7CisKKwkJCWRpLT5ibS0+YmF0dF9pZCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChkaS0+Ym0tPmJhdHRfaWQgPT0gQkFUVEVSWV9VTktOT1dOKSB7CisJCWRldl93YXJuKGRpLT5kZXYsICJCYXR0ZXJ5IGlkZW50aWZpZWQgYXMgdW5rbm93biIKKwkJCSIsIHJlc2lzdGFuY2UgJWQgT2htXG4iLCByZXMpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCS8qCisJICogV2Ugb25seSBoYXZlIHRvIGNoYW5nZSBjdXJyZW50IHNvdXJjZSBpZiB0aGUKKwkgKiBkZXRlY3RlZCB0eXBlIGlzIFR5cGUgMS4KKwkgKi8KKwlpZiAoZGktPmJtLT5hZGNfdGhlcm0gPT0gQUJ4NTAwX0FEQ19USEVSTV9CQVRDVFJMICYmCisJICAgIGRpLT5ibS0+YmF0dF9pZCA9PSAxKSB7CisJCWlmIChpc19hYjg1NDAoZGktPnBhcmVudCkpIHsKKwkJCWRldl9kYmcoZGktPmRldiwKKwkJCQkiU2V0IEJBVENUUkwgY3VycmVudCBzb3VyY2UgdG8gNjB1QVxuIik7CisJCQlkaS0+Y3Vycl9zb3VyY2UgPSBCVEVNUF9CQVRDVFJMX0NVUlJfU1JDXzYwVUE7CisJCX0gZWxzZSBpZiAoaXNfYWI5NTQwKGRpLT5wYXJlbnQpIHx8IGlzX2FiODUwNShkaS0+cGFyZW50KSkgeworCQkJZGV2X2RiZyhkaS0+ZGV2LAorCQkJCSJTZXQgQkFUQ1RSTCBjdXJyZW50IHNvdXJjZSB0byAxNnVBXG4iKTsKKwkJCWRpLT5jdXJyX3NvdXJjZSA9IEJURU1QX0JBVENUUkxfQ1VSUl9TUkNfMTZVQTsKKwkJfSBlbHNlIHsKKwkJCWRldl9kYmcoZGktPmRldiwgIlNldCBCQVRDVFJMIGN1cnJlbnQgc291cmNlIHRvIDIwdUFcbiIpOworCQkJZGktPmN1cnJfc291cmNlID0gQlRFTVBfQkFUQ1RSTF9DVVJSX1NSQ18yMFVBOworCQl9CisJfQorCisJcmV0dXJuIGRpLT5ibS0+YmF0dF9pZDsKK30KKworLyoqCisgKiBhYjg1MDBfYnRlbXBfcGVyaW9kaWNfd29yaygpIC0gTWVhc3VyaW5nIHRoZSB0ZW1wZXJhdHVyZSBwZXJpb2RpY2FsbHkKKyAqIEB3b3JrOglwb2ludGVyIHRvIHRoZSB3b3JrX3N0cnVjdCBzdHJ1Y3R1cmUKKyAqCisgKiBXb3JrIGZ1bmN0aW9uIGZvciBtZWFzdXJpbmcgdGhlIHRlbXBlcmF0dXJlIHBlcmlvZGljYWxseQorICovCitzdGF0aWMgdm9pZCBhYjg1MDBfYnRlbXBfcGVyaW9kaWNfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJaW50IGludGVydmFsOworCWludCBiYXRfdGVtcDsKKwlzdHJ1Y3QgYWI4NTAwX2J0ZW1wICpkaSA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQlzdHJ1Y3QgYWI4NTAwX2J0ZW1wLCBidGVtcF9wZXJpb2RpY193b3JrLndvcmspOworCisJaWYgKCFkaS0+aW5pdGlhbGl6ZWQpIHsKKwkJLyogSWRlbnRpZnkgdGhlIGJhdHRlcnkgKi8KKwkJaWYgKGFiODUwMF9idGVtcF9pZChkaSkgPCAwKQorCQkJZGV2X3dhcm4oZGktPmRldiwgImZhaWxlZCB0byBpZGVudGlmeSB0aGUgYmF0dGVyeVxuIik7CisJfQorCisJYmF0X3RlbXAgPSBhYjg1MDBfYnRlbXBfbWVhc3VyZV90ZW1wKGRpKTsKKwkvKgorCSAqIEZpbHRlciBiYXR0ZXJ5IHRlbXBlcmF0dXJlLgorCSAqIEFsbG93IGRpcmVjdCB1cGRhdGVzIG9uIHRlbXBlcmF0dXJlIG9ubHkgaWYgdHdvIHNhbXBsZXMgcmVzdWx0IGluCisJICogc2FtZSB0ZW1wZXJhdHVyZS4gRWxzZSBvbmx5IGFsbG93IDEgZGVncmVlIGNoYW5nZSBmcm9tIHByZXZpb3VzCisJICogcmVwb3J0ZWQgdmFsdWUgaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUgbmV3IG1lYXN1cmVtZW50LgorCSAqLworCWlmICgoYmF0X3RlbXAgPT0gZGktPnByZXZfYmF0X3RlbXApIHx8ICFkaS0+aW5pdGlhbGl6ZWQpIHsKKwkJaWYgKChkaS0+YmF0X3RlbXAgIT0gZGktPnByZXZfYmF0X3RlbXApIHx8ICFkaS0+aW5pdGlhbGl6ZWQpIHsKKwkJCWRpLT5pbml0aWFsaXplZCA9IHRydWU7CisJCQlkaS0+YmF0X3RlbXAgPSBiYXRfdGVtcDsKKwkJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5idGVtcF9wc3kpOworCQl9CisJfSBlbHNlIGlmIChiYXRfdGVtcCA8IGRpLT5wcmV2X2JhdF90ZW1wKSB7CisJCWRpLT5iYXRfdGVtcC0tOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChkaS0+YnRlbXBfcHN5KTsKKwl9IGVsc2UgaWYgKGJhdF90ZW1wID4gZGktPnByZXZfYmF0X3RlbXApIHsKKwkJZGktPmJhdF90ZW1wKys7CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5idGVtcF9wc3kpOworCX0KKwlkaS0+cHJldl9iYXRfdGVtcCA9IGJhdF90ZW1wOworCisJaWYgKGRpLT5ldmVudHMuYWNfY29ubiB8fCBkaS0+ZXZlbnRzLnVzYl9jb25uKQorCQlpbnRlcnZhbCA9IGRpLT5ibS0+dGVtcF9pbnRlcnZhbF9jaGc7CisJZWxzZQorCQlpbnRlcnZhbCA9IGRpLT5ibS0+dGVtcF9pbnRlcnZhbF9ub2NoZzsKKworCS8qIFNjaGVkdWxlIGEgbmV3IG1lYXN1cmVtZW50ICovCisJcXVldWVfZGVsYXllZF93b3JrKGRpLT5idGVtcF93cSwKKwkJJmRpLT5idGVtcF9wZXJpb2RpY193b3JrLAorCQlyb3VuZF9qaWZmaWVzKGludGVydmFsICogSFopKTsKK30KKworLyoqCisgKiBhYjg1MDBfYnRlbXBfYmF0Y3RybGluZGJfaGFuZGxlcigpIC0gYmF0dGVyeSByZW1vdmFsIGRldGVjdGVkCisgKiBAaXJxOiAgICAgICBpbnRlcnJ1cHQgbnVtYmVyCisgKiBAX2RpOiAgICAgICB2b2lkIHBvaW50ZXIgdGhhdCBoYXMgdG8gYWRkcmVzcyBvZiBhYjg1MDBfYnRlbXAKKyAqCisgKiBSZXR1cm5zIElSUSBzdGF0dXMoSVJRX0hBTkRMRUQpCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBhYjg1MDBfYnRlbXBfYmF0Y3RybGluZGJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpfZGkpCit7CisJc3RydWN0IGFiODUwMF9idGVtcCAqZGkgPSBfZGk7CisJZGV2X2VycihkaS0+ZGV2LCAiQmF0dGVyeSByZW1vdmFsIGRldGVjdGVkIVxuIik7CisKKwlkaS0+ZXZlbnRzLmJhdHRfcmVtID0gdHJ1ZTsKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZChkaS0+YnRlbXBfcHN5KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBhYjg1MDBfYnRlbXBfdGVtcGxvd19oYW5kbGVyKCkgLSBiYXR0ZXJ5IHRlbXAgbG93ZXIgdGhhbiAxMCBkZWdyZWVzCisgKiBAaXJxOiAgICAgICBpbnRlcnJ1cHQgbnVtYmVyCisgKiBAX2RpOiAgICAgICB2b2lkIHBvaW50ZXIgdGhhdCBoYXMgdG8gYWRkcmVzcyBvZiBhYjg1MDBfYnRlbXAKKyAqCisgKiBSZXR1cm5zIElSUSBzdGF0dXMoSVJRX0hBTkRMRUQpCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBhYjg1MDBfYnRlbXBfdGVtcGxvd19oYW5kbGVyKGludCBpcnEsIHZvaWQgKl9kaSkKK3sKKwlzdHJ1Y3QgYWI4NTAwX2J0ZW1wICpkaSA9IF9kaTsKKworCWlmIChpc19hYjg1MDBfM3AzX29yX2VhcmxpZXIoZGktPnBhcmVudCkpIHsKKwkJZGV2X2RiZyhkaS0+ZGV2LCAiSWdub3JlIGZhbHNlIGJ0ZW1wIGxvdyBpcnEiCisJCQkiIGZvciBBQkIgY3V0IDEuMCwgMS4xLCAyLjAgYW5kIDMuM1xuIik7CisJfSBlbHNlIHsKKwkJZGV2X2NyaXQoZGktPmRldiwgIkJhdHRlcnkgdGVtcGVyYXR1cmUgbG93ZXIgdGhhbiAtMTBkZWcgY1xuIik7CisKKwkJZGktPmV2ZW50cy5idGVtcF9sb3cgPSB0cnVlOworCQlkaS0+ZXZlbnRzLmJ0ZW1wX2hpZ2ggPSBmYWxzZTsKKwkJZGktPmV2ZW50cy5idGVtcF9tZWRoaWdoID0gZmFsc2U7CisJCWRpLT5ldmVudHMuYnRlbXBfbG93bWVkID0gZmFsc2U7CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5idGVtcF9wc3kpOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBhYjg1MDBfYnRlbXBfdGVtcGhpZ2hfaGFuZGxlcigpIC0gYmF0dGVyeSB0ZW1wIGhpZ2hlciB0aGFuIG1heCB0ZW1wCisgKiBAaXJxOiAgICAgICBpbnRlcnJ1cHQgbnVtYmVyCisgKiBAX2RpOiAgICAgICB2b2lkIHBvaW50ZXIgdGhhdCBoYXMgdG8gYWRkcmVzcyBvZiBhYjg1MDBfYnRlbXAKKyAqCisgKiBSZXR1cm5zIElSUSBzdGF0dXMoSVJRX0hBTkRMRUQpCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBhYjg1MDBfYnRlbXBfdGVtcGhpZ2hfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpfZGkpCit7CisJc3RydWN0IGFiODUwMF9idGVtcCAqZGkgPSBfZGk7CisKKwlkZXZfY3JpdChkaS0+ZGV2LCAiQmF0dGVyeSB0ZW1wZXJhdHVyZSBpcyBoaWdoZXIgdGhhbiBNQVggdGVtcFxuIik7CisKKwlkaS0+ZXZlbnRzLmJ0ZW1wX2hpZ2ggPSB0cnVlOworCWRpLT5ldmVudHMuYnRlbXBfbWVkaGlnaCA9IGZhbHNlOworCWRpLT5ldmVudHMuYnRlbXBfbG93bWVkID0gZmFsc2U7CisJZGktPmV2ZW50cy5idGVtcF9sb3cgPSBmYWxzZTsKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZChkaS0+YnRlbXBfcHN5KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBhYjg1MDBfYnRlbXBfbG93bWVkX2hhbmRsZXIoKSAtIGJhdHRlcnkgdGVtcCBiZXR3ZWVuIGxvdyBhbmQgbWVkaXVtCisgKiBAaXJxOiAgICAgICBpbnRlcnJ1cHQgbnVtYmVyCisgKiBAX2RpOiAgICAgICB2b2lkIHBvaW50ZXIgdGhhdCBoYXMgdG8gYWRkcmVzcyBvZiBhYjg1MDBfYnRlbXAKKyAqCisgKiBSZXR1cm5zIElSUSBzdGF0dXMoSVJRX0hBTkRMRUQpCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBhYjg1MDBfYnRlbXBfbG93bWVkX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqX2RpKQoreworCXN0cnVjdCBhYjg1MDBfYnRlbXAgKmRpID0gX2RpOworCisJZGV2X2RiZyhkaS0+ZGV2LCAiQmF0dGVyeSB0ZW1wZXJhdHVyZSBpcyBiZXR3ZWVuIGxvdyBhbmQgbWVkaXVtXG4iKTsKKworCWRpLT5ldmVudHMuYnRlbXBfbG93bWVkID0gdHJ1ZTsKKwlkaS0+ZXZlbnRzLmJ0ZW1wX21lZGhpZ2ggPSBmYWxzZTsKKwlkaS0+ZXZlbnRzLmJ0ZW1wX2hpZ2ggPSBmYWxzZTsKKwlkaS0+ZXZlbnRzLmJ0ZW1wX2xvdyA9IGZhbHNlOworCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5idGVtcF9wc3kpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioKKyAqIGFiODUwMF9idGVtcF9tZWRoaWdoX2hhbmRsZXIoKSAtIGJhdHRlcnkgdGVtcCBiZXR3ZWVuIG1lZGl1bSBhbmQgaGlnaAorICogQGlycTogICAgICAgaW50ZXJydXB0IG51bWJlcgorICogQF9kaTogICAgICAgdm9pZCBwb2ludGVyIHRoYXQgaGFzIHRvIGFkZHJlc3Mgb2YgYWI4NTAwX2J0ZW1wCisgKgorICogUmV0dXJucyBJUlEgc3RhdHVzKElSUV9IQU5ETEVEKQorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYWI4NTAwX2J0ZW1wX21lZGhpZ2hfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpfZGkpCit7CisJc3RydWN0IGFiODUwMF9idGVtcCAqZGkgPSBfZGk7CisKKwlkZXZfZGJnKGRpLT5kZXYsICJCYXR0ZXJ5IHRlbXBlcmF0dXJlIGlzIGJldHdlZW4gbWVkaXVtIGFuZCBoaWdoXG4iKTsKKworCWRpLT5ldmVudHMuYnRlbXBfbWVkaGlnaCA9IHRydWU7CisJZGktPmV2ZW50cy5idGVtcF9sb3dtZWQgPSBmYWxzZTsKKwlkaS0+ZXZlbnRzLmJ0ZW1wX2hpZ2ggPSBmYWxzZTsKKwlkaS0+ZXZlbnRzLmJ0ZW1wX2xvdyA9IGZhbHNlOworCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5idGVtcF9wc3kpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioKKyAqIGFiODUwMF9idGVtcF9wZXJpb2RpYygpIC0gUGVyaW9kaWMgdGVtcGVyYXR1cmUgbWVhc3VyZW1lbnRzCisgKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfYnRlbXAgc3RydWN0dXJlCisgKiBAZW5hYmxlOgllbmFibGUgb3IgZGlzYWJsZSBwZXJpb2RpYyB0ZW1wZXJhdHVyZSBtZWFzdXJlbWVudHMKKyAqCisgKiBTdGFydHMgb2Ygc3RvcHMgcGVyaW9kaWMgdGVtcGVyYXR1cmUgbWVhc3VyZW1lbnRzLiBQZXJpb2RpYyBtZWFzdXJlbWVudHMKKyAqIHNob3VsZCBvbmx5IGJlIGRvbmUgd2hlbiBhIGNoYXJnZXIgaXMgY29ubmVjdGVkLgorICovCitzdGF0aWMgdm9pZCBhYjg1MDBfYnRlbXBfcGVyaW9kaWMoc3RydWN0IGFiODUwMF9idGVtcCAqZGksCisJYm9vbCBlbmFibGUpCit7CisJZGV2X2RiZyhkaS0+ZGV2LCAiRW5hYmxlIHBlcmlvZGljIHRlbXBlcmF0dXJlIG1lYXN1cmVtZW50czogJWRcbiIsCisJCWVuYWJsZSk7CisJLyoKKwkgKiBNYWtlIHN1cmUgYSBuZXcgbWVhc3VyZW1lbnQgaXMgZG9uZSBkaXJlY3RseSBieSBjYW5jZWxsaW5nCisJICogYW55IHBlbmRpbmcgd29yaworCSAqLworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZGktPmJ0ZW1wX3BlcmlvZGljX3dvcmspOworCisJaWYgKGVuYWJsZSkKKwkJcXVldWVfZGVsYXllZF93b3JrKGRpLT5idGVtcF93cSwgJmRpLT5idGVtcF9wZXJpb2RpY193b3JrLCAwKTsKK30KKworLyoqCisgKiBhYjg1MDBfYnRlbXBfZ2V0X3RlbXAoKSAtIGdldCBiYXR0ZXJ5IHRlbXBlcmF0dXJlCisgKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfYnRlbXAgc3RydWN0dXJlCisgKgorICogUmV0dXJucyBiYXR0ZXJ5IHRlbXBlcmF0dXJlCisgKi8KK2ludCBhYjg1MDBfYnRlbXBfZ2V0X3RlbXAoc3RydWN0IGFiODUwMF9idGVtcCAqZGkpCit7CisJaW50IHRlbXAgPSAwOworCisJLyoKKwkgKiBUaGUgQlRFTVAgZXZlbnRzIGFyZSBub3QgcmVsaWFiZSBvbiBBQjg1MDAgY3V0My4zCisJICogYW5kIHByaW9yIHZlcnNpb25zCisJICovCisJaWYgKGlzX2FiODUwMF8zcDNfb3JfZWFybGllcihkaS0+cGFyZW50KSkgeworCQl0ZW1wID0gZGktPmJhdF90ZW1wICogMTA7CisJfSBlbHNlIHsKKwkJaWYgKGRpLT5ldmVudHMuYnRlbXBfbG93KSB7CisJCQlpZiAodGVtcCA+IGRpLT5idGVtcF9yYW5nZXMuYnRlbXBfbG93X2xpbWl0KQorCQkJCXRlbXAgPSBkaS0+YnRlbXBfcmFuZ2VzLmJ0ZW1wX2xvd19saW1pdCAqIDEwOworCQkJZWxzZQorCQkJCXRlbXAgPSBkaS0+YmF0X3RlbXAgKiAxMDsKKwkJfSBlbHNlIGlmIChkaS0+ZXZlbnRzLmJ0ZW1wX2hpZ2gpIHsKKwkJCWlmICh0ZW1wIDwgZGktPmJ0ZW1wX3Jhbmdlcy5idGVtcF9oaWdoX2xpbWl0KQorCQkJCXRlbXAgPSBkaS0+YnRlbXBfcmFuZ2VzLmJ0ZW1wX2hpZ2hfbGltaXQgKiAxMDsKKwkJCWVsc2UKKwkJCQl0ZW1wID0gZGktPmJhdF90ZW1wICogMTA7CisJCX0gZWxzZSBpZiAoZGktPmV2ZW50cy5idGVtcF9sb3dtZWQpIHsKKwkJCWlmICh0ZW1wID4gZGktPmJ0ZW1wX3Jhbmdlcy5idGVtcF9tZWRfbGltaXQpCisJCQkJdGVtcCA9IGRpLT5idGVtcF9yYW5nZXMuYnRlbXBfbWVkX2xpbWl0ICogMTA7CisJCQllbHNlCisJCQkJdGVtcCA9IGRpLT5iYXRfdGVtcCAqIDEwOworCQl9IGVsc2UgaWYgKGRpLT5ldmVudHMuYnRlbXBfbWVkaGlnaCkgeworCQkJaWYgKHRlbXAgPCBkaS0+YnRlbXBfcmFuZ2VzLmJ0ZW1wX21lZF9saW1pdCkKKwkJCQl0ZW1wID0gZGktPmJ0ZW1wX3Jhbmdlcy5idGVtcF9tZWRfbGltaXQgKiAxMDsKKwkJCWVsc2UKKwkJCQl0ZW1wID0gZGktPmJhdF90ZW1wICogMTA7CisJCX0gZWxzZQorCQkJdGVtcCA9IGRpLT5iYXRfdGVtcCAqIDEwOworCX0KKwlyZXR1cm4gdGVtcDsKK30KK0VYUE9SVF9TWU1CT0woYWI4NTAwX2J0ZW1wX2dldF90ZW1wKTsKKworLyoqCisgKiBhYjg1MDBfYnRlbXBfZ2V0X2JhdGN0cmxfdGVtcCgpIC0gZ2V0IHRoZSB0ZW1wZXJhdHVyZQorICogQGJ0ZW1wOiAgICAgIHBvaW50ZXIgdG8gdGhlIGJ0ZW1wIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgdGhlIGJhdGN0cmwgdGVtcGVyYXR1cmUgaW4gbWlsbGlkZWdyZWVzCisgKi8KK2ludCBhYjg1MDBfYnRlbXBfZ2V0X2JhdGN0cmxfdGVtcChzdHJ1Y3QgYWI4NTAwX2J0ZW1wICpidGVtcCkKK3sKKwlyZXR1cm4gYnRlbXAtPmJhdF90ZW1wICogMTAwMDsKK30KK0VYUE9SVF9TWU1CT0woYWI4NTAwX2J0ZW1wX2dldF9iYXRjdHJsX3RlbXApOworCisvKioKKyAqIGFiODUwMF9idGVtcF9nZXRfcHJvcGVydHkoKSAtIGdldCB0aGUgYnRlbXAgcHJvcGVydGllcworICogQHBzeTogICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvd2VyX3N1cHBseSBzdHJ1Y3R1cmUKKyAqIEBwc3A6ICAgICAgICBwb2ludGVyIHRvIHRoZSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgc3RydWN0dXJlCisgKiBAdmFsOiAgICAgICAgcG9pbnRlciB0byB0aGUgcG93ZXJfc3VwcGx5X3Byb3B2YWwgdW5pb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIHdoZW4gYW4gYXBwbGljYXRpb24gdHJpZXMgdG8gZ2V0IHRoZSBidGVtcAorICogcHJvcGVydGllcyBieSByZWFkaW5nIHRoZSBzeXNmcyBmaWxlcy4KKyAqIG9ubGluZToJcHJlc2VuY2Ugb2YgdGhlIGJhdHRlcnkKKyAqIHByZXNlbnQ6CXByZXNlbmNlIG9mIHRoZSBiYXR0ZXJ5CisgKiB0ZWNobm9sb2d5OgliYXR0ZXJ5IHRlY2hub2xvZ3kKKyAqIHRlbXA6CWJhdHRlcnkgdGVtcGVyYXR1cmUKKyAqIFJldHVybnMgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUgZWxzZSAwKG9uIHN1Y2Nlc3MpCisgKi8KK3N0YXRpYyBpbnQgYWI4NTAwX2J0ZW1wX2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJc3RydWN0IGFiODUwMF9idGVtcCAqZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKKworCXN3aXRjaCAocHNwKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FOgorCQlpZiAoZGktPmV2ZW50cy5iYXR0X3JlbSkKKwkJCXZhbC0+aW50dmFsID0gMDsKKwkJZWxzZQorCQkJdmFsLT5pbnR2YWwgPSAxOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1k6CisJCXZhbC0+aW50dmFsID0gZGktPmJtLT5iYXRfdHlwZVtkaS0+Ym0tPmJhdHRfaWRdLm5hbWU7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUDoKKwkJdmFsLT5pbnR2YWwgPSBhYjg1MDBfYnRlbXBfZ2V0X3RlbXAoZGkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWI4NTAwX2J0ZW1wX2dldF9leHRfcHN5X2RhdGEoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpleHQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwljb25zdCBjaGFyICoqc3VwcGxpY2FudHMgPSAoY29uc3QgY2hhciAqKilleHQtPnN1cHBsaWVkX3RvOworCXN0cnVjdCBhYjg1MDBfYnRlbXAgKmRpOworCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsIHJldDsKKwlpbnQgajsKKworCXBzeSA9IChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICopZGF0YTsKKwlkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOworCisJLyoKKwkgKiBGb3IgYWxsIHBzeSB3aGVyZSB0aGUgbmFtZSBvZiB5b3VyIGRyaXZlcgorCSAqIGFwcGVhcnMgaW4gYW55IHN1cHBsaWVkX3RvCisJICovCisJaiA9IG1hdGNoX3N0cmluZyhzdXBwbGljYW50cywgZXh0LT5udW1fc3VwcGxpY2FudHMsIHBzeS0+ZGVzYy0+bmFtZSk7CisJaWYgKGogPCAwKQorCQlyZXR1cm4gMDsKKworCS8qIEdvIHRocm91Z2ggYWxsIHByb3BlcnRpZXMgZm9yIHRoZSBwc3kgKi8KKwlmb3IgKGogPSAwOyBqIDwgZXh0LT5kZXNjLT5udW1fcHJvcGVydGllczsgaisrKSB7CisJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHByb3A7CisJCXByb3AgPSBleHQtPmRlc2MtPnByb3BlcnRpZXNbal07CisKKwkJaWYgKHBvd2VyX3N1cHBseV9nZXRfcHJvcGVydHkoZXh0LCBwcm9wLCAmcmV0KSkKKwkJCWNvbnRpbnVlOworCisJCXN3aXRjaCAocHJvcCkgeworCQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ6CisJCQlzd2l0Y2ggKGV4dC0+ZGVzYy0+dHlwZSkgeworCQkJY2FzZSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUzoKKwkJCQkvKiBBQyBkaXNjb25uZWN0ZWQgKi8KKwkJCQlpZiAoIXJldC5pbnR2YWwgJiYgZGktPmV2ZW50cy5hY19jb25uKSB7CisJCQkJCWRpLT5ldmVudHMuYWNfY29ubiA9IGZhbHNlOworCQkJCX0KKwkJCQkvKiBBQyBjb25uZWN0ZWQgKi8KKwkJCQllbHNlIGlmIChyZXQuaW50dmFsICYmICFkaS0+ZXZlbnRzLmFjX2Nvbm4pIHsKKwkJCQkJZGktPmV2ZW50cy5hY19jb25uID0gdHJ1ZTsKKwkJCQkJaWYgKCFkaS0+ZXZlbnRzLnVzYl9jb25uKQorCQkJCQkJYWI4NTAwX2J0ZW1wX3BlcmlvZGljKGRpLCB0cnVlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX1VTQjoKKwkJCQkvKiBVU0IgZGlzY29ubmVjdGVkICovCisJCQkJaWYgKCFyZXQuaW50dmFsICYmIGRpLT5ldmVudHMudXNiX2Nvbm4pIHsKKwkJCQkJZGktPmV2ZW50cy51c2JfY29ubiA9IGZhbHNlOworCQkJCX0KKwkJCQkvKiBVU0IgY29ubmVjdGVkICovCisJCQkJZWxzZSBpZiAocmV0LmludHZhbCAmJiAhZGktPmV2ZW50cy51c2JfY29ubikgeworCQkJCQlkaS0+ZXZlbnRzLnVzYl9jb25uID0gdHJ1ZTsKKwkJCQkJaWYgKCFkaS0+ZXZlbnRzLmFjX2Nvbm4pCisJCQkJCQlhYjg1MDBfYnRlbXBfcGVyaW9kaWMoZGksIHRydWUpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIGFiODUwMF9idGVtcF9leHRlcm5hbF9wb3dlcl9jaGFuZ2VkKCkgLSBjYWxsYmFjayBmb3IgcG93ZXIgc3VwcGx5IGNoYW5nZXMKKyAqIEBwc3k6ICAgICAgIHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSBwb3dlcl9zdXBwbHkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHBvaW50aW5nIHRvIHRoZSBmdW5jdGlvbiBwb2ludGVyIGV4dGVybmFsX3Bvd2VyX2NoYW5nZWQKKyAqIG9mIHRoZSBzdHJ1Y3R1cmUgcG93ZXJfc3VwcGx5LgorICogVGhpcyBmdW5jdGlvbiBnZXRzIGV4ZWN1dGVkIHdoZW4gdGhlcmUgaXMgYSBjaGFuZ2UgaW4gdGhlIGV4dGVybmFsIHBvd2VyCisgKiBzdXBwbHkgdG8gdGhlIGJ0ZW1wLgorICovCitzdGF0aWMgdm9pZCBhYjg1MDBfYnRlbXBfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kpCit7CisJc3RydWN0IGFiODUwMF9idGVtcCAqZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKKworCWNsYXNzX2Zvcl9lYWNoX2RldmljZShwb3dlcl9zdXBwbHlfY2xhc3MsIE5VTEwsCisJCWRpLT5idGVtcF9wc3ksIGFiODUwMF9idGVtcF9nZXRfZXh0X3BzeV9kYXRhKTsKK30KKworLyogYWI4NTAwIGJ0ZW1wIGRyaXZlciBpbnRlcnJ1cHRzIGFuZCB0aGVpciByZXNwZWN0aXZlIGlzciAqLworc3RhdGljIHN0cnVjdCBhYjg1MDBfYnRlbXBfaW50ZXJydXB0cyBhYjg1MDBfYnRlbXBfaXJxW10gPSB7CisJeyJCQVRfQ1RSTF9JTkRCIiwgYWI4NTAwX2J0ZW1wX2JhdGN0cmxpbmRiX2hhbmRsZXJ9LAorCXsiQlRFTVBfTE9XIiwgYWI4NTAwX2J0ZW1wX3RlbXBsb3dfaGFuZGxlcn0sCisJeyJCVEVNUF9ISUdIIiwgYWI4NTAwX2J0ZW1wX3RlbXBoaWdoX2hhbmRsZXJ9LAorCXsiQlRFTVBfTE9XX01FRElVTSIsIGFiODUwMF9idGVtcF9sb3dtZWRfaGFuZGxlcn0sCisJeyJCVEVNUF9NRURJVU1fSElHSCIsIGFiODUwMF9idGVtcF9tZWRoaWdoX2hhbmRsZXJ9LAorfTsKKworI2lmIGRlZmluZWQoQ09ORklHX1BNKQorc3RhdGljIGludCBhYjg1MDBfYnRlbXBfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFiODUwMF9idGVtcCAqZGkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWFiODUwMF9idGVtcF9wZXJpb2RpYyhkaSwgdHJ1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYjg1MDBfYnRlbXBfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCXBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgYWI4NTAwX2J0ZW1wICpkaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJYWI4NTAwX2J0ZW1wX3BlcmlvZGljKGRpLCBmYWxzZSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIGFiODUwMF9idGVtcF9zdXNwZW5kICAgICAgTlVMTAorI2RlZmluZSBhYjg1MDBfYnRlbXBfcmVzdW1lICAgICAgIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgaW50IGFiODUwMF9idGVtcF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYWI4NTAwX2J0ZW1wICpkaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCBpLCBpcnE7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhYjg1MDBfYnRlbXBfaXJxKTsgaSsrKSB7CisJCWlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsIGFiODUwMF9idGVtcF9pcnFbaV0ubmFtZSk7CisJCWZyZWVfaXJxKGlycSwgZGkpOworCX0KKworCS8qIERlbGV0ZSB0aGUgd29yayBxdWV1ZSAqLworCWRlc3Ryb3lfd29ya3F1ZXVlKGRpLT5idGVtcF93cSk7CisKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGRpLT5idGVtcF9wc3kpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyICpzdXBwbHlfaW50ZXJmYWNlW10gPSB7CisJImFiODUwMF9jaGFyZ2FsZyIsCisJImFiODUwMF9mZyIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGFiODUwMF9idGVtcF9kZXNjID0geworCS5uYW1lCQkJPSAiYWI4NTAwX2J0ZW1wIiwKKwkudHlwZQkJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKKwkucHJvcGVydGllcwkJPSBhYjg1MDBfYnRlbXBfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCQk9IEFSUkFZX1NJWkUoYWI4NTAwX2J0ZW1wX3Byb3BzKSwKKwkuZ2V0X3Byb3BlcnR5CQk9IGFiODUwMF9idGVtcF9nZXRfcHJvcGVydHksCisJLmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQJPSBhYjg1MDBfYnRlbXBfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCwKK307CisKK3N0YXRpYyBpbnQgYWI4NTAwX2J0ZW1wX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBhYng1MDBfYm1fZGF0YSAqcGxhdCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKKwlzdHJ1Y3QgYWI4NTAwX2J0ZW1wICpkaTsKKwlpbnQgaXJxLCBpLCByZXQgPSAwOworCXU4IHZhbDsKKworCWRpID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZGkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzIG5vIG1lbSBmb3IgYWI4NTAwX2J0ZW1wXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmICghcGxhdCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBiYXR0ZXJ5IG1hbmFnZW1lbnQgZGF0YSBzdXBwbGllZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkaS0+Ym0gPSBwbGF0OworCisJaWYgKG5wKSB7CisJCXJldCA9IGFiODUwMF9ibV9vZl9wcm9iZSgmcGRldi0+ZGV2LCBucCwgZGktPmJtKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBiYXR0ZXJ5IGluZm9ybWF0aW9uXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwkvKiBnZXQgcGFyZW50IGRhdGEgKi8KKwlkaS0+ZGV2ID0gJnBkZXYtPmRldjsKKwlkaS0+cGFyZW50ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCWRpLT5ncGFkYyA9IGFiODUwMF9ncGFkY19nZXQoImFiODUwMC1ncGFkYy4wIik7CisKKwlkaS0+aW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworCXBzeV9jZmcuc3VwcGxpZWRfdG8gPSBzdXBwbHlfaW50ZXJmYWNlOworCXBzeV9jZmcubnVtX3N1cHBsaWNhbnRzID0gQVJSQVlfU0laRShzdXBwbHlfaW50ZXJmYWNlKTsKKwlwc3lfY2ZnLmRydl9kYXRhID0gZGk7CisKKwkvKiBDcmVhdGUgYSB3b3JrIHF1ZXVlIGZvciB0aGUgYnRlbXAgKi8KKwlkaS0+YnRlbXBfd3EgPQorCQlhbGxvY193b3JrcXVldWUoImFiODUwMF9idGVtcF93cSIsIFdRX01FTV9SRUNMQUlNLCAwKTsKKwlpZiAoZGktPmJ0ZW1wX3dxID09IE5VTEwpIHsKKwkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSB3b3JrIHF1ZXVlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogSW5pdCB3b3JrIGZvciBtZWFzdXJpbmcgdGVtcGVyYXR1cmUgcGVyaW9kaWNhbGx5ICovCisJSU5JVF9ERUZFUlJBQkxFX1dPUksoJmRpLT5idGVtcF9wZXJpb2RpY193b3JrLAorCQlhYjg1MDBfYnRlbXBfcGVyaW9kaWNfd29yayk7CisKKwkvKiBTZXQgQlRFTVAgdGhlcm1hbCBsaW1pdHMuIExvdyBhbmQgTWVkIGFyZSBmaXhlZCAqLworCWRpLT5idGVtcF9yYW5nZXMuYnRlbXBfbG93X2xpbWl0ID0gQlRFTVBfVEhFUk1BTF9MT1dfTElNSVQ7CisJZGktPmJ0ZW1wX3Jhbmdlcy5idGVtcF9tZWRfbGltaXQgPSBCVEVNUF9USEVSTUFMX01FRF9MSU1JVDsKKworCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfQ0hBUkdFUiwKKwkJQUI4NTAwX0JURU1QX0hJR0hfVEgsICZ2YWwpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGktPmRldiwgIiVzIGFiODUwMCByZWFkIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlnb3RvIGZyZWVfYnRlbXBfd3E7CisJfQorCXN3aXRjaCAodmFsKSB7CisJY2FzZSBCVEVNUF9ISUdIX1RIXzU3XzA6CisJY2FzZSBCVEVNUF9ISUdIX1RIXzU3XzE6CisJCWRpLT5idGVtcF9yYW5nZXMuYnRlbXBfaGlnaF9saW1pdCA9CisJCQlCVEVNUF9USEVSTUFMX0hJR0hfTElNSVRfNTc7CisJCWJyZWFrOworCWNhc2UgQlRFTVBfSElHSF9USF81MjoKKwkJZGktPmJ0ZW1wX3Jhbmdlcy5idGVtcF9oaWdoX2xpbWl0ID0KKwkJCUJURU1QX1RIRVJNQUxfSElHSF9MSU1JVF81MjsKKwkJYnJlYWs7CisJY2FzZSBCVEVNUF9ISUdIX1RIXzYyOgorCQlkaS0+YnRlbXBfcmFuZ2VzLmJ0ZW1wX2hpZ2hfbGltaXQgPQorCQkJQlRFTVBfVEhFUk1BTF9ISUdIX0xJTUlUXzYyOworCQlicmVhazsKKwl9CisKKwkvKiBSZWdpc3RlciBCVEVNUCBwb3dlciBzdXBwbHkgY2xhc3MgKi8KKwlkaS0+YnRlbXBfcHN5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKGRpLT5kZXYsICZhYjg1MDBfYnRlbXBfZGVzYywKKwkJCQkJICAgICAgJnBzeV9jZmcpOworCWlmIChJU19FUlIoZGktPmJ0ZW1wX3BzeSkpIHsKKwkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIEJURU1QIHBzeVxuIik7CisJCXJldCA9IFBUUl9FUlIoZGktPmJ0ZW1wX3BzeSk7CisJCWdvdG8gZnJlZV9idGVtcF93cTsKKwl9CisKKwkvKiBSZWdpc3RlciBpbnRlcnJ1cHRzICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWI4NTAwX2J0ZW1wX2lycSk7IGkrKykgeworCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCBhYjg1MDBfYnRlbXBfaXJxW2ldLm5hbWUpOworCQlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShpcnEsIE5VTEwsIGFiODUwMF9idGVtcF9pcnFbaV0uaXNyLAorCQkJSVJRRl9TSEFSRUQgfCBJUlFGX05PX1NVU1BFTkQsCisJCQlhYjg1MDBfYnRlbXBfaXJxW2ldLm5hbWUsIGRpKTsKKworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCAlcyBJUlEgJWQ6ICVkXG4iCisJCQkJLCBhYjg1MDBfYnRlbXBfaXJxW2ldLm5hbWUsIGlycSwgcmV0KTsKKwkJCWdvdG8gZnJlZV9pcnE7CisJCX0KKwkJZGV2X2RiZyhkaS0+ZGV2LCAiUmVxdWVzdGVkICVzIElSUSAlZDogJWRcbiIsCisJCQlhYjg1MDBfYnRlbXBfaXJxW2ldLm5hbWUsIGlycSwgcmV0KTsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkaSk7CisKKwkvKiBLaWNrIG9mZiBwZXJpb2RpYyB0ZW1wZXJhdHVyZSBtZWFzdXJlbWVudHMgKi8KKwlhYjg1MDBfYnRlbXBfcGVyaW9kaWMoZGksIHRydWUpOworCWxpc3RfYWRkX3RhaWwoJmRpLT5ub2RlLCAmYWI4NTAwX2J0ZW1wX2xpc3QpOworCisJcmV0dXJuIHJldDsKKworZnJlZV9pcnE6CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoZGktPmJ0ZW1wX3BzeSk7CisKKwkvKiBXZSBhbHNvIGhhdmUgdG8gZnJlZSBhbGwgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQgaXJxcyAqLworCWZvciAoaSA9IGkgLSAxOyBpID49IDA7IGktLSkgeworCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCBhYjg1MDBfYnRlbXBfaXJxW2ldLm5hbWUpOworCQlmcmVlX2lycShpcnEsIGRpKTsKKwl9CitmcmVlX2J0ZW1wX3dxOgorCWRlc3Ryb3lfd29ya3F1ZXVlKGRpLT5idGVtcF93cSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYWI4NTAwX2J0ZW1wX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJzdGVyaWNzc29uLGFiODUwMC1idGVtcCIsIH0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYWI4NTAwX2J0ZW1wX2RyaXZlciA9IHsKKwkucHJvYmUgPSBhYjg1MDBfYnRlbXBfcHJvYmUsCisJLnJlbW92ZSA9IGFiODUwMF9idGVtcF9yZW1vdmUsCisJLnN1c3BlbmQgPSBhYjg1MDBfYnRlbXBfc3VzcGVuZCwKKwkucmVzdW1lID0gYWI4NTAwX2J0ZW1wX3Jlc3VtZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhYjg1MDAtYnRlbXAiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBhYjg1MDBfYnRlbXBfbWF0Y2gsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFiODUwMF9idGVtcF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYWI4NTAwX2J0ZW1wX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhYjg1MDBfYnRlbXBfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhYjg1MDBfYnRlbXBfZHJpdmVyKTsKK30KKworZGV2aWNlX2luaXRjYWxsKGFiODUwMF9idGVtcF9pbml0KTsKK21vZHVsZV9leGl0KGFiODUwMF9idGVtcF9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FVVEhPUigiSm9oYW4gUGFsc3NvbiwgS2FybCBLb21pZXJvd3NraSwgQXJ1biBSIE11cnRoeSIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTphYjg1MDAtYnRlbXAiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUI4NTAwIGJhdHRlcnkgdGVtcGVyYXR1cmUgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9hYjg1MDBfY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvYWI4NTAwX2NoYXJnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2VlOWFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvYWI4NTAwX2NoYXJnZXIuYwpAQCAtMCwwICsxLDM3NjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFNULUVyaWNzc29uIFNBIDIwMTIKKyAqCisgKiBDaGFyZ2VyIGRyaXZlciBmb3IgQUI4NTAwCisgKgorICogTGljZW5zZSBUZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIKKyAqIEF1dGhvcjoKKyAqCUpvaGFuIFBhbHNzb24gPGpvaGFuLnBhbHNzb25Ac3Rlcmljc3Nvbi5jb20+CisgKglLYXJsIEtvbWllcm93c2tpIDxrYXJsLmtvbWllcm93c2tpQHN0ZXJpY3Nzb24uY29tPgorICoJQXJ1biBSIE11cnRoeSA8YXJ1bi5tdXJ0aHlAc3Rlcmljc3Nvbi5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9hYng1MDAvYWI4NTAwLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2FieDUwMC5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9hYng1MDAvYWI4NTAwLWJtLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2FieDUwMC9hYjg1MDAtZ3BhZGMuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvYWJ4NTAwL3V4NTAwX2NoYXJnYWxnLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL290Zy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisKKy8qIENoYXJnZXIgY29uc3RhbnRzICovCisjZGVmaW5lIE5PX1BXX0NPTk4JCQkwCisjZGVmaW5lIEFDX1BXX0NPTk4JCQkxCisjZGVmaW5lIFVTQl9QV19DT05OCQkJMgorCisjZGVmaW5lIE1BSU5fV0RPR19FTkEJCQkweDAxCisjZGVmaW5lIE1BSU5fV0RPR19LSUNLCQkJMHgwMgorI2RlZmluZSBNQUlOX1dET0dfRElTCQkJMHgwMAorI2RlZmluZSBDSEFSR19XRF9LSUNLCQkJMHgwMQorI2RlZmluZSBNQUlOX0NIX0VOQQkJCTB4MDEKKyNkZWZpbmUgTUFJTl9DSF9OT19PVkVSU0hPT1RfRU5BX04JMHgwMgorI2RlZmluZSBVU0JfQ0hfRU5BCQkJMHgwMQorI2RlZmluZSBVU0JfQ0hHX05PX09WRVJTSE9PVF9FTkFfTgkweDAyCisjZGVmaW5lIE1BSU5fQ0hfREVUCQkJMHgwMQorI2RlZmluZSBNQUlOX0NIX0NWX09OCQkJMHgwNAorI2RlZmluZSBVU0JfQ0hfQ1ZfT04JCQkweDA4CisjZGVmaW5lIFZCVVNfREVUX0RCTkMxMDAJCTB4MDIKKyNkZWZpbmUgVkJVU19ERVRfREJOQzEJCQkweDAxCisjZGVmaW5lIE9UUF9FTkFCTEVfV0QJCQkweDAxCisjZGVmaW5lIERST1BfQ09VTlRfUkVTRVQJCTB4MDEKKyNkZWZpbmUgVVNCX0NIX0RFVAkJCTB4MDEKKworI2RlZmluZSBNQUlOX0NIX0lOUFVUX0NVUlJfU0hJRlQJNAorI2RlZmluZSBWQlVTX0lOX0NVUlJfTElNX1NISUZUCQk0CisjZGVmaW5lIEFCODU0MF9WQlVTX0lOX0NVUlJfTElNX1NISUZUCTIKKyNkZWZpbmUgQVVUT19WQlVTX0lOX0NVUlJfTElNX1NISUZUCTQKKyNkZWZpbmUgQUI4NTQwX0FVVE9fVkJVU19JTl9DVVJSX01BU0sJMHgzRgorI2RlZmluZSBWQlVTX0lOX0NVUlJfTElNX1JFVFJZX1NFVF9USU1FCTMwIC8qIHNlY29uZHMgKi8KKworI2RlZmluZSBMRURfSU5ESUNBVE9SX1BXTV9FTkEJCTB4MDEKKyNkZWZpbmUgTEVEX0lORElDQVRPUl9QV01fRElTCQkweDAwCisjZGVmaW5lIExFRF9JTkRfQ1VSXzVNQQkJCTB4MDQKKyNkZWZpbmUgTEVEX0lORElDQVRPUl9QV01fRFVUWV8yNTJfMjU2CTB4QkYKKworLyogSFcgZmFpbHVyZSBjb25zdGFudHMgKi8KKyNkZWZpbmUgTUFJTl9DSF9USF9QUk9UCQkJMHgwMgorI2RlZmluZSBWQlVTX0NIX05PSwkJCTB4MDgKKyNkZWZpbmUgVVNCX0NIX1RIX1BST1QJCQkweDAyCisjZGVmaW5lIFZCVVNfT1ZWX1RICQkJMHgwMQorI2RlZmluZSBNQUlOX0NIX05PSwkJCTB4MDEKKyNkZWZpbmUgVkJVU19ERVQJCQkweDgwCisKKyNkZWZpbmUgTUFJTl9DSF9TVEFUVVMyX01BSU5DSEdEUk9QCQkweDgwCisjZGVmaW5lIE1BSU5fQ0hfU1RBVFVTMl9NQUlOQ0hBUkdFUkRFVERCTkMJMHg0MAorI2RlZmluZSBVU0JfQ0hfVkJVU0RST1AJCQkJMHg0MAorI2RlZmluZSBVU0JfQ0hfVkJVU0RFVERCTkMJCQkweDAxCisKKy8qIFVzYkxpbmVTdGF0dXMgcmVnaXN0ZXIgYml0IG1hc2tzICovCisjZGVmaW5lIEFCODUwMF9VU0JfTElOS19TVEFUVVMJCTB4NzgKKyNkZWZpbmUgQUI4NTA1X1VTQl9MSU5LX1NUQVRVUwkJMHhGOAorI2RlZmluZSBBQjg1MDBfU1REX0hPU1RfU1VTUAkJMHgxOAorI2RlZmluZSBVU0JfTElOS19TVEFUVVNfU0hJRlQJCTMKKworLyogV2F0Y2hkb2cgdGltZW91dCBjb25zdGFudCAqLworI2RlZmluZSBXRF9USU1FUgkJCTB4MzAgLyogNG1pbiAqLworI2RlZmluZSBXRF9LSUNLX0lOVEVSVkFMCQkoNjAgKiBIWikKKworLyogTG93ZXN0IGNoYXJnZXIgdm9sdGFnZSBpcyAzLjM5ViAtPiAweDRFICovCisjZGVmaW5lIExPV19WT0xUX1JFRwkJCTB4NEUKKworLyogU3RlcCB1cC9kb3duIGRlbGF5IGluIHVzICovCisjZGVmaW5lIFNURVBfVURFTEFZCQkJMTAwMAorCisjZGVmaW5lIENIQVJHRVJfU1RBVFVTX1BPTEwgMTAgLyogaW4gbXMgKi8KKworI2RlZmluZSBDSEdfV0RfSU5URVJWQUwJCQkoNjAgKiBIWikKKworI2RlZmluZSBBQjg1MDBfU1dfQ09OVFJPTF9GQUxMQkFDSwkweDAzCisvKiBXYWl0IGZvciBlbnVtZXJhdGlvbiBiZWZvcmUgY2hhcmluZyBpbiB1cyAqLworI2RlZmluZSBXQUlUX0FDQV9SSURfRU5VTUVSQVRJT04JKDUgKiAxMDAwKQorLypFeHRlcm5hbCBjaGFyZ2VyIGNvbnRyb2wqLworI2RlZmluZSBBQjg1MDBfU1lTX0NIQVJHRVJfQ09OVFJPTF9SRUcJCTB4NTIKKyNkZWZpbmUgRVhURVJOQUxfQ0hBUkdFUl9ESVNBQkxFX1JFR19WQUwJMHgwMworI2RlZmluZSBFWFRFUk5BTF9DSEFSR0VSX0VOQUJMRV9SRUdfVkFMCQkweDA3CisKKy8qIFVzYkxpbmVTdGF0dXMgcmVnaXN0ZXIgLSB1c2IgdHlwZXMgKi8KK2VudW0gYWI4NTAwX2NoYXJnZXJfbGlua19zdGF0dXMgeworCVVTQl9TVEFUX05PVF9DT05GSUdVUkVELAorCVVTQl9TVEFUX1NURF9IT1NUX05DLAorCVVTQl9TVEFUX1NURF9IT1NUX0NfTlMsCisJVVNCX1NUQVRfU1REX0hPU1RfQ19TLAorCVVTQl9TVEFUX0hPU1RfQ0hHX05NLAorCVVTQl9TVEFUX0hPU1RfQ0hHX0hTLAorCVVTQl9TVEFUX0hPU1RfQ0hHX0hTX0NISVJQLAorCVVTQl9TVEFUX0RFRElDQVRFRF9DSEcsCisJVVNCX1NUQVRfQUNBX1JJRF9BLAorCVVTQl9TVEFUX0FDQV9SSURfQiwKKwlVU0JfU1RBVF9BQ0FfUklEX0NfTk0sCisJVVNCX1NUQVRfQUNBX1JJRF9DX0hTLAorCVVTQl9TVEFUX0FDQV9SSURfQ19IU19DSElSUCwKKwlVU0JfU1RBVF9ITV9JREdORCwKKwlVU0JfU1RBVF9SRVNFUlZFRCwKKwlVU0JfU1RBVF9OT1RfVkFMSURfTElOSywKKwlVU0JfU1RBVF9QSFlfRU4sCisJVVNCX1NUQVRfU1VQX05PX0lER05EX1ZCVVMsCisJVVNCX1NUQVRfU1VQX0lER05EX1ZCVVMsCisJVVNCX1NUQVRfQ0hBUkdFUl9MSU5FXzEsCisJVVNCX1NUQVRfQ0FSS0lUXzEsCisJVVNCX1NUQVRfQ0FSS0lUXzIsCisJVVNCX1NUQVRfQUNBX0RPQ0tfQ0hBUkdFUiwKK307CisKK2VudW0gYWI4NTAwX3VzYl9zdGF0ZSB7CisJQUI4NTAwX0JNX1VTQl9TVEFURV9SRVNFVF9IUywJLyogSGlnaFNwZWVkIFJlc2V0ICovCisJQUI4NTAwX0JNX1VTQl9TVEFURV9SRVNFVF9GUywJLyogRnVsbFNwZWVkL0xvd1NwZWVkIFJlc2V0ICovCisJQUI4NTAwX0JNX1VTQl9TVEFURV9DT05GSUdVUkVELAorCUFCODUwMF9CTV9VU0JfU1RBVEVfU1VTUEVORCwKKwlBQjg1MDBfQk1fVVNCX1NUQVRFX1JFU1VNRSwKKwlBQjg1MDBfQk1fVVNCX1NUQVRFX01BWCwKK307CisKKy8qIFZCVVMgaW5wdXQgY3VycmVudCBsaW1pdHMgc3VwcG9ydGVkIGluIEFCODUwMCBpbiBtQSAqLworI2RlZmluZSBVU0JfQ0hfSVBfQ1VSX0xWTF8wUDA1CQk1MAorI2RlZmluZSBVU0JfQ0hfSVBfQ1VSX0xWTF8wUDA5CQk5OAorI2RlZmluZSBVU0JfQ0hfSVBfQ1VSX0xWTF8wUDE5CQkxOTMKKyNkZWZpbmUgVVNCX0NIX0lQX0NVUl9MVkxfMFAyOQkJMjkwCisjZGVmaW5lIFVTQl9DSF9JUF9DVVJfTFZMXzBQMzgJCTM4MAorI2RlZmluZSBVU0JfQ0hfSVBfQ1VSX0xWTF8wUDQ1CQk0NTAKKyNkZWZpbmUgVVNCX0NIX0lQX0NVUl9MVkxfMFA1CQk1MDAKKyNkZWZpbmUgVVNCX0NIX0lQX0NVUl9MVkxfMFA2CQk2MDAKKyNkZWZpbmUgVVNCX0NIX0lQX0NVUl9MVkxfMFA3CQk3MDAKKyNkZWZpbmUgVVNCX0NIX0lQX0NVUl9MVkxfMFA4CQk4MDAKKyNkZWZpbmUgVVNCX0NIX0lQX0NVUl9MVkxfMFA5CQk5MDAKKyNkZWZpbmUgVVNCX0NIX0lQX0NVUl9MVkxfMVAwCQkxMDAwCisjZGVmaW5lIFVTQl9DSF9JUF9DVVJfTFZMXzFQMQkJMTEwMAorI2RlZmluZSBVU0JfQ0hfSVBfQ1VSX0xWTF8xUDMJCTEzMDAKKyNkZWZpbmUgVVNCX0NIX0lQX0NVUl9MVkxfMVA0CQkxNDAwCisjZGVmaW5lIFVTQl9DSF9JUF9DVVJfTFZMXzFQNQkJMTUwMAorCisjZGVmaW5lIFZCQVRfVFJFU0hfSVBfQ1VSX1JFRAkJMzgwMAorCisjZGVmaW5lIHRvX2FiODUwMF9jaGFyZ2VyX3VzYl9kZXZpY2VfaW5mbyh4KSBjb250YWluZXJfb2YoKHgpLCBcCisJc3RydWN0IGFiODUwMF9jaGFyZ2VyLCB1c2JfY2hnKQorI2RlZmluZSB0b19hYjg1MDBfY2hhcmdlcl9hY19kZXZpY2VfaW5mbyh4KSBjb250YWluZXJfb2YoKHgpLCBcCisJc3RydWN0IGFiODUwMF9jaGFyZ2VyLCBhY19jaGcpCisKKy8qKgorICogc3RydWN0IGFiODUwMF9jaGFyZ2VyX2ludGVycnVwdHMgLSBhYjg1MDAgaW50ZXJ1cHRzCisgKiBAbmFtZToJbmFtZSBvZiB0aGUgaW50ZXJydXB0CisgKiBAaXNyCQlmdW5jdGlvbiBwb2ludGVyIHRvIHRoZSBpc3IKKyAqLworc3RydWN0IGFiODUwMF9jaGFyZ2VyX2ludGVycnVwdHMgeworCWNoYXIgKm5hbWU7CisJaXJxcmV0dXJuX3QgKCppc3IpKGludCBpcnEsIHZvaWQgKmRhdGEpOworfTsKKworc3RydWN0IGFiODUwMF9jaGFyZ2VyX2luZm8geworCWludCBjaGFyZ2VyX2Nvbm5lY3RlZDsKKwlpbnQgY2hhcmdlcl9vbmxpbmU7CisJaW50IGNoYXJnZXJfdm9sdGFnZTsKKwlpbnQgY3ZfYWN0aXZlOworCWJvb2wgd2RfZXhwaXJlZDsKKwlpbnQgY2hhcmdlcl9jdXJyZW50OworfTsKKworc3RydWN0IGFiODUwMF9jaGFyZ2VyX2V2ZW50X2ZsYWdzIHsKKwlib29sIG1haW5leHRjaG5vdG9rOworCWJvb2wgbWFpbl90aGVybWFsX3Byb3Q7CisJYm9vbCB1c2JfdGhlcm1hbF9wcm90OworCWJvb2wgdmJ1c19vdnY7CisJYm9vbCB1c2JjaGFyZ2Vybm90b2s7CisJYm9vbCBjaGd3ZGV4cDsKKwlib29sIHZidXNfY29sbGFwc2U7CisJYm9vbCB2YnVzX2Ryb3BfZW5kOworfTsKKworc3RydWN0IGFiODUwMF9jaGFyZ2VyX3VzYl9zdGF0ZSB7CisJaW50IHVzYl9jdXJyZW50OworCWludCB1c2JfY3VycmVudF90bXA7CisJZW51bSBhYjg1MDBfdXNiX3N0YXRlIHN0YXRlOworCWVudW0gYWI4NTAwX3VzYl9zdGF0ZSBzdGF0ZV90bXA7CisJc3BpbmxvY2tfdCB1c2JfbG9jazsKK307CisKK3N0cnVjdCBhYjg1MDBfY2hhcmdlcl9tYXhfdXNiX2luX2N1cnIgeworCWludCB1c2JfdHlwZV9tYXg7CisJaW50IHNldF9tYXg7CisJaW50IGNhbGN1bGF0ZWRfbWF4OworfTsKKworLyoqCisgKiBzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgLSBhYjg1MDAgQ2hhcmdlciBkZXZpY2UgaW5mb3JtYXRpb24KKyAqIEBkZXY6CQlQb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgZGV2aWNlCisgKiBAdmJ1c19kZXRlY3RlZDoJVkJVUyBkZXRlY3RlZAorICogQHZidXNfZGV0ZWN0ZWRfc3RhcnQ6CisgKgkJCVZCVVMgZGV0ZWN0ZWQgZHVyaW5nIHN0YXJ0dXAKKyAqIEBhY19jb25uOgkJVGhpcyB3aWxsIGJlIHRydWUgd2hlbiB0aGUgQUMgY2hhcmdlciBoYXMgYmVlbiBwbHVnZ2VkCisgKiBAdmRkYWRjX2VuX2FjOglJbmRpY2F0ZSBpZiBWREQgQURDIHN1cHBseSBpcyBlbmFibGVkIGJlY2F1c2UgQUMKKyAqCQkJY2hhcmdlciBpcyBlbmFibGVkCisgKiBAdmRkYWRjX2VuX3VzYjoJSW5kaWNhdGUgaWYgVkREIEFEQyBzdXBwbHkgaXMgZW5hYmxlZCBiZWNhdXNlIFVTQgorICoJCQljaGFyZ2VyIGlzIGVuYWJsZWQKKyAqIEB2YmF0CQlCYXR0ZXJ5IHZvbHRhZ2UKKyAqIEBvbGRfdmJhdAkJUHJldmlvdXNseSBtZWFzdXJlZCBiYXR0ZXJ5IHZvbHRhZ2UKKyAqIEB1c2JfZGV2aWNlX2lzX3VucmVjb2duaXNlZAlVU0IgZGV2aWNlIGlzIHVucmVjb2duaXNlZCBieSB0aGUgaGFyZHdhcmUKKyAqIEBhdXRvcG93ZXIJCUluZGljYXRlIGlmIHdlIHNob3VsZCBoYXZlIGF1dG9tYXRpYyBwd3JvbiBhZnRlciBwd3Jsb3NzCisgKiBAYXV0b3Bvd2VyX2NmZwlwbGF0Zm9ybSBzcGVjaWZpYyBwb3dlciBjb25maWcgc3VwcG9ydCBmb3IgInB3cm9uIGFmdGVyIHB3cmxvc3MiCisgKiBAaW52YWxpZF9jaGFyZ2VyX2RldGVjdF9zdGF0ZSBTdGF0ZSB3aGVuIGZvcmNpbmcgQUIgdG8gdXNlIGludmFsaWQgY2hhcmdlcgorICogQGlzX2FjYV9yaWQ6CQlJbmNpY2F0ZSBpZiBhY2Nlc3NvcnkgaXMgQUNBIHR5cGUKKyAqIEBjdXJyZW50X3N0ZXBwaW5nX3Nlc3Npb25zOgorICoJCQlDb3VudGVyIGZvciBjdXJyZW50IHN0ZXBwaW5nIHNlc3Npb25zCisgKiBAcGFyZW50OgkJUG9pbnRlciB0byB0aGUgc3RydWN0IGFiODUwMAorICogQGdwYWRjOgkJUG9pbnRlciB0byB0aGUgc3RydWN0IGdwYWRjCisgKiBAYm06ICAgICAgICAgICAJUGxhdGZvcm0gc3BlY2lmaWMgYmF0dGVyeSBtYW5hZ2VtZW50IGluZm9ybWF0aW9uCisgKiBAZmxhZ3M6CQlTdHJ1Y3R1cmUgZm9yIGluZm9ybWF0aW9uIGFib3V0IGV2ZW50cyB0cmlnZ2VyZWQKKyAqIEB1c2Jfc3RhdGU6CQlTdHJ1Y3R1cmUgZm9yIHVzYiBzdGFjayBpbmZvcm1hdGlvbgorICogQG1heF91c2JfaW5fY3VycjoJTWF4IFVTQiBjaGFyZ2VyIGlucHV0IGN1cnJlbnQKKyAqIEBhY19jaGc6CQlBQyBjaGFyZ2VyIHBvd2VyIHN1cHBseQorICogQHVzYl9jaGc6CQlVU0IgY2hhcmdlciBwb3dlciBzdXBwbHkKKyAqIEBhYzoJCQlTdHJ1Y3R1cmUgdGhhdCBob2xkcyB0aGUgQUMgY2hhcmdlciBwcm9wZXJ0aWVzCisgKiBAdXNiOgkJU3RydWN0dXJlIHRoYXQgaG9sZHMgdGhlIFVTQiBjaGFyZ2VyIHByb3BlcnRpZXMKKyAqIEByZWd1OgkJUG9pbnRlciB0byB0aGUgc3RydWN0IHJlZ3VsYXRvcgorICogQGNoYXJnZXJfd3E6CQlXb3JrIHF1ZXVlIGZvciB0aGUgSVJRcyBhbmQgY2hlY2tpbmcgSFcgc3RhdGUKKyAqIEB1c2JfaXB0X2NybnRfbG9jazoJTG9jayB0byBwcm90ZWN0IFZCVVMgaW5wdXQgY3VycmVudCBzZXR0aW5nIGZyb20gbXV0dWFscworICogQHBtX2xvY2s6CQlMb2NrIHRvIHByZXZlbnQgc3lzdGVtIHRvIHN1c3BlbmQKKyAqIEBjaGVja192YmF0X3dvcmsJV29yayBmb3IgY2hlY2tpbmcgdmJhdCB0aHJlc2hvbGQgdG8gYWRqdXN0IHZidXMgY3VycmVudAorICogQGNoZWNrX2h3X2ZhaWx1cmVfd29yazoJV29yayBmb3IgY2hlY2tpbmcgSFcgc3RhdGUKKyAqIEBjaGVja191c2JjaGdub3Rva193b3JrOglXb3JrIGZvciBjaGVja2luZyBVU0IgY2hhcmdlciBub3Qgb2sgc3RhdHVzCisgKiBAa2lja193ZF93b3JrOgkJV29yayBmb3Iga2lja2luZyB0aGUgY2hhcmdlciB3YXRjaGRvZyBpbiBjYXNlCisgKgkJCQlvZiBBQkIgcmV2IDEuKiBkdWUgdG8gdGhlIHdhdGNob2cgbG9naWMgYnVnCisgKiBAYWNfY2hhcmdlcl9hdHRhY2hlZF93b3JrOglXb3JrIGZvciBjaGVja2luZyBpZiBBQyBjaGFyZ2VyIGlzIHN0aWxsCisgKgkJCQljb25uZWN0ZWQKKyAqIEB1c2JfY2hhcmdlcl9hdHRhY2hlZF93b3JrOglXb3JrIGZvciBjaGVja2luZyBpZiBVU0IgY2hhcmdlciBpcyBzdGlsbAorICoJCQkJY29ubmVjdGVkCisgKiBAYWNfd29yazoJCQlXb3JrIGZvciBjaGVja2luZyBBQyBjaGFyZ2VyIGNvbm5lY3Rpb24KKyAqIEBkZXRlY3RfdXNiX3R5cGVfd29yazoJV29yayBmb3IgZGV0ZWN0aW5nIHRoZSBVU0IgdHlwZSBjb25uZWN0ZWQKKyAqIEB1c2JfbGlua19zdGF0dXNfd29yazoJV29yayBmb3IgY2hlY2tpbmcgdGhlIG5ldyBVU0IgbGluayBzdGF0dXMKKyAqIEB1c2Jfc3RhdGVfY2hhbmdlZF93b3JrOglXb3JrIGZvciBjaGVja2luZyBVU0Igc3RhdGUKKyAqIEBhdHRhY2hfd29yazoJCVdvcmsgZm9yIGRldGVjdGluZyBVU0IgdHlwZQorICogQHZidXNfZHJvcF9lbmRfd29yazoJCVdvcmsgZm9yIGRldGVjdGluZyBWQlVTIGRyb3AgZW5kCisgKiBAY2hlY2tfbWFpbl90aGVybWFsX3Byb3Rfd29yazoKKyAqCQkJCVdvcmsgZm9yIGNoZWNraW5nIE1haW4gdGhlcm1hbCBzdGF0dXMKKyAqIEBjaGVja191c2JfdGhlcm1hbF9wcm90X3dvcms6CisgKgkJCQlXb3JrIGZvciBjaGVja2luZyBVU0IgdGhlcm1hbCBzdGF0dXMKKyAqIEBjaGFyZ2VyX2F0dGFjaGVkX211dGV4OglGb3IgY29udHJvbGxpbmcgdGhlIHdha2Vsb2NrCisgKi8KK3N0cnVjdCBhYjg1MDBfY2hhcmdlciB7CisJc3RydWN0IGRldmljZSAqZGV2OworCWJvb2wgdmJ1c19kZXRlY3RlZDsKKwlib29sIHZidXNfZGV0ZWN0ZWRfc3RhcnQ7CisJYm9vbCBhY19jb25uOworCWJvb2wgdmRkYWRjX2VuX2FjOworCWJvb2wgdmRkYWRjX2VuX3VzYjsKKwlpbnQgdmJhdDsKKwlpbnQgb2xkX3ZiYXQ7CisJYm9vbCB1c2JfZGV2aWNlX2lzX3VucmVjb2duaXNlZDsKKwlib29sIGF1dG9wb3dlcjsKKwlib29sIGF1dG9wb3dlcl9jZmc7CisJaW50IGludmFsaWRfY2hhcmdlcl9kZXRlY3Rfc3RhdGU7CisJaW50IGlzX2FjYV9yaWQ7CisJYXRvbWljX3QgY3VycmVudF9zdGVwcGluZ19zZXNzaW9uczsKKwlzdHJ1Y3QgYWI4NTAwICpwYXJlbnQ7CisJc3RydWN0IGFiODUwMF9ncGFkYyAqZ3BhZGM7CisJc3RydWN0IGFieDUwMF9ibV9kYXRhICpibTsKKwlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXJfZXZlbnRfZmxhZ3MgZmxhZ3M7CisJc3RydWN0IGFiODUwMF9jaGFyZ2VyX3VzYl9zdGF0ZSB1c2Jfc3RhdGU7CisJc3RydWN0IGFiODUwMF9jaGFyZ2VyX21heF91c2JfaW5fY3VyciBtYXhfdXNiX2luX2N1cnI7CisJc3RydWN0IHV4NTAwX2NoYXJnZXIgYWNfY2hnOworCXN0cnVjdCB1eDUwMF9jaGFyZ2VyIHVzYl9jaGc7CisJc3RydWN0IGFiODUwMF9jaGFyZ2VyX2luZm8gYWM7CisJc3RydWN0IGFiODUwMF9jaGFyZ2VyX2luZm8gdXNiOworCXN0cnVjdCByZWd1bGF0b3IgKnJlZ3U7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmNoYXJnZXJfd3E7CisJc3RydWN0IG11dGV4IHVzYl9pcHRfY3JudF9sb2NrOworCXN0cnVjdCBkZWxheWVkX3dvcmsgY2hlY2tfdmJhdF93b3JrOworCXN0cnVjdCBkZWxheWVkX3dvcmsgY2hlY2tfaHdfZmFpbHVyZV93b3JrOworCXN0cnVjdCBkZWxheWVkX3dvcmsgY2hlY2tfdXNiY2hnbm90b2tfd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGtpY2tfd2Rfd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHVzYl9zdGF0ZV9jaGFuZ2VkX3dvcms7CisJc3RydWN0IGRlbGF5ZWRfd29yayBhdHRhY2hfd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGFjX2NoYXJnZXJfYXR0YWNoZWRfd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHVzYl9jaGFyZ2VyX2F0dGFjaGVkX3dvcms7CisJc3RydWN0IGRlbGF5ZWRfd29yayB2YnVzX2Ryb3BfZW5kX3dvcms7CisJc3RydWN0IHdvcmtfc3RydWN0IGFjX3dvcms7CisJc3RydWN0IHdvcmtfc3RydWN0IGRldGVjdF91c2JfdHlwZV93b3JrOworCXN0cnVjdCB3b3JrX3N0cnVjdCB1c2JfbGlua19zdGF0dXNfd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY2hlY2tfbWFpbl90aGVybWFsX3Byb3Rfd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY2hlY2tfdXNiX3RoZXJtYWxfcHJvdF93b3JrOworCXN0cnVjdCB1c2JfcGh5ICp1c2JfcGh5OworCXN0cnVjdCBub3RpZmllcl9ibG9jayBuYjsKKwlzdHJ1Y3QgbXV0ZXggY2hhcmdlcl9hdHRhY2hlZF9tdXRleDsKK307CisKKy8qIEFDIHByb3BlcnRpZXMgKi8KK3N0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBhYjg1MDBfY2hhcmdlcl9hY19wcm9wc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5ULAorCVBPV0VSX1NVUFBMWV9QUk9QX09OTElORSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX0FWRywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVywKK307CisKKy8qIFVTQiBwcm9wZXJ0aWVzICovCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgYWI4NTAwX2NoYXJnZXJfdXNiX3Byb3BzW10gPSB7CisJUE9XRVJfU1VQUExZX1BST1BfSEVBTFRILAorCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfQVZHLAorCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsCisJUE9XRVJfU1VQUExZX1BST1BfT05MSU5FLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfQVZHLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XLAorfTsKKworLyoKKyAqIEZ1bmN0aW9uIGZvciBlbmFibGluZyBhbmQgZGlzYWJsaW5nIHN3IGZhbGxiYWNrIG1vZGUKKyAqIHNob3VsZCBhbHdheXMgYmUgZGlzYWJsZWQgd2hlbiBubyBjaGFyZ2VyIGlzIGNvbm5lY3RlZC4KKyAqLworc3RhdGljIHZvaWQgYWI4NTAwX2VuYWJsZV9kaXNhYmxlX3N3X2ZhbGxiYWNrKHN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGksCisJCWJvb2wgZmFsbGJhY2spCit7CisJdTggdmFsOworCXU4IHJlZzsKKwl1OCBiYW5rOworCXU4IGJpdDsKKwlpbnQgcmV0OworCisJZGV2X2RiZyhkaS0+ZGV2LCAiU1cgRmFsbGJhY2s6ICVkXG4iLCBmYWxsYmFjayk7CisKKwlpZiAoaXNfYWI4NTAwKGRpLT5wYXJlbnQpKSB7CisJCWJhbmsgPSAweDE1OworCQlyZWcgPSAweDA7CisJCWJpdCA9IDM7CisJfSBlbHNlIHsKKwkJYmFuayA9IEFCODUwMF9TWVNfQ1RSTDFfQkxPQ0s7CisJCXJlZyA9IEFCODUwMF9TV19DT05UUk9MX0ZBTExCQUNLOworCQliaXQgPSAwOworCX0KKworCS8qIHJlYWQgdGhlIHJlZ2lzdGVyIGNvbnRhaW5pbmcgZmFsbGJhY2sgYml0ICovCisJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIGJhbmssIHJlZywgJnZhbCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkaS0+ZGV2LCAiJWQgcmVhZCBmYWlsZWRcbiIsIF9fTElORV9fKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpc19hYjg1MDAoZGktPnBhcmVudCkpIHsKKwkJLyogZW5hYmxlIHRoZSBPUFQgZW11bGF0aW9uIHJlZ2lzdGVycyAqLworCQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgMHgxMSwgMHgwMCwgMHgyKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkaS0+ZGV2LCAiJWQgd3JpdGUgZmFpbGVkXG4iLCBfX0xJTkVfXyk7CisJCQlnb3RvIGRpc2FibGVfb3RwOworCQl9CisJfQorCisJaWYgKGZhbGxiYWNrKQorCQl2YWwgfD0gKDEgPDwgYml0KTsKKwllbHNlCisJCXZhbCAmPSB+KDEgPDwgYml0KTsKKworCS8qIHdyaXRlIGJhY2sgdGhlIGNoYW5nZWQgZmFsbGJhY2sgYml0IHZhbHVlIHRvIHJlZ2lzdGVyICovCisJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIGJhbmssIHJlZywgdmFsKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGktPmRldiwgIiVkIHdyaXRlIGZhaWxlZFxuIiwgX19MSU5FX18pOworCX0KKworZGlzYWJsZV9vdHA6CisJaWYgKGlzX2FiODUwMChkaS0+cGFyZW50KSkgeworCQkvKiBkaXNhYmxlIHRoZSBzZXQgT1RQIHJlZ2lzdGVycyBhZ2FpbiAqLworCQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgMHgxMSwgMHgwMCwgMHgwKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkaS0+ZGV2LCAiJWQgd3JpdGUgZmFpbGVkXG4iLCBfX0xJTkVfXyk7CisJCX0KKwl9Cit9CisKKy8qKgorICogYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkIC0gYSB3cmFwcGVyIHdpdGggbG9jYWwgZXh0ZW50aW9ucyBmb3IKKyAqIHBvd2VyX3N1cHBseV9jaGFuZ2VkCisgKiBAZGk6CSAgcG9pbnRlciB0byB0aGUgYWI4NTAwX2NoYXJnZXIgc3RydWN0dXJlCisgKiBAcHN5OiAgcG9pbnRlciB0byBwb3dlcl9zdXBwbHlfdGhhdCBoYXZlIGNoYW5nZWQuCisgKgorICovCitzdGF0aWMgdm9pZCBhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSwKKwkJCQkJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KQoreworCWlmIChkaS0+YXV0b3Bvd2VyX2NmZykgeworCQlpZiAoIWRpLT51c2IuY2hhcmdlcl9jb25uZWN0ZWQgJiYKKwkJICAgICFkaS0+YWMuY2hhcmdlcl9jb25uZWN0ZWQgJiYKKwkJICAgIGRpLT5hdXRvcG93ZXIpIHsKKwkJCWRpLT5hdXRvcG93ZXIgPSBmYWxzZTsKKwkJCWFiODUwMF9lbmFibGVfZGlzYWJsZV9zd19mYWxsYmFjayhkaSwgZmFsc2UpOworCQl9IGVsc2UgaWYgKCFkaS0+YXV0b3Bvd2VyICYmCisJCQkgICAoZGktPmFjLmNoYXJnZXJfY29ubmVjdGVkIHx8CisJCQkgICAgZGktPnVzYi5jaGFyZ2VyX2Nvbm5lY3RlZCkpIHsKKwkJCWRpLT5hdXRvcG93ZXIgPSB0cnVlOworCQkJYWI4NTAwX2VuYWJsZV9kaXNhYmxlX3N3X2ZhbGxiYWNrKGRpLCB0cnVlKTsKKwkJfQorCX0KKwlwb3dlcl9zdXBwbHlfY2hhbmdlZChwc3kpOworfQorCitzdGF0aWMgdm9pZCBhYjg1MDBfY2hhcmdlcl9zZXRfdXNiX2Nvbm5lY3RlZChzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpLAorCWJvb2wgY29ubmVjdGVkKQoreworCWlmIChjb25uZWN0ZWQgIT0gZGktPnVzYi5jaGFyZ2VyX2Nvbm5lY3RlZCkgeworCQlkZXZfZGJnKGRpLT5kZXYsICJVU0IgY29ubmVjdGVkOiVpXG4iLCBjb25uZWN0ZWQpOworCQlkaS0+dXNiLmNoYXJnZXJfY29ubmVjdGVkID0gY29ubmVjdGVkOworCisJCWlmICghY29ubmVjdGVkKQorCQkJZGktPmZsYWdzLnZidXNfZHJvcF9lbmQgPSBmYWxzZTsKKworCQlzeXNmc19ub3RpZnkoJmRpLT51c2JfY2hnLnBzeS0+ZGV2LmtvYmosIE5VTEwsICJwcmVzZW50Iik7CisKKwkJaWYgKGNvbm5lY3RlZCkgeworCQkJbXV0ZXhfbG9jaygmZGktPmNoYXJnZXJfYXR0YWNoZWRfbXV0ZXgpOworCQkJbXV0ZXhfdW5sb2NrKCZkaS0+Y2hhcmdlcl9hdHRhY2hlZF9tdXRleCk7CisKKwkJCWlmIChpc19hYjg1MDAoZGktPnBhcmVudCkpCisJCQkJcXVldWVfZGVsYXllZF93b3JrKGRpLT5jaGFyZ2VyX3dxLAorCQkJCQkgICAmZGktPnVzYl9jaGFyZ2VyX2F0dGFjaGVkX3dvcmssCisJCQkJCSAgIEhaKTsKKwkJfSBlbHNlIHsKKwkJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZGktPnVzYl9jaGFyZ2VyX2F0dGFjaGVkX3dvcmspOworCQkJbXV0ZXhfbG9jaygmZGktPmNoYXJnZXJfYXR0YWNoZWRfbXV0ZXgpOworCQkJbXV0ZXhfdW5sb2NrKCZkaS0+Y2hhcmdlcl9hdHRhY2hlZF9tdXRleCk7CisJCX0KKwl9Cit9CisKKy8qKgorICogYWI4NTAwX2NoYXJnZXJfZ2V0X2FjX3ZvbHRhZ2UoKSAtIGdldCBhYyBjaGFyZ2VyIHZvbHRhZ2UKKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9jaGFyZ2VyIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgYWMgY2hhcmdlciB2b2x0YWdlIChvbiBzdWNjZXNzKQorICovCitzdGF0aWMgaW50IGFiODUwMF9jaGFyZ2VyX2dldF9hY192b2x0YWdlKHN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGkpCit7CisJaW50IHZjaDsKKworCS8qIE9ubHkgbWVhc3VyZSB2b2x0YWdlIGlmIHRoZSBjaGFyZ2VyIGlzIGNvbm5lY3RlZCAqLworCWlmIChkaS0+YWMuY2hhcmdlcl9jb25uZWN0ZWQpIHsKKwkJdmNoID0gYWI4NTAwX2dwYWRjX2NvbnZlcnQoZGktPmdwYWRjLCBNQUlOX0NIQVJHRVJfVik7CisJCWlmICh2Y2ggPCAwKQorCQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgZ3BhZGMgY29udiBmYWlsZWQsXG4iLCBfX2Z1bmNfXyk7CisJfSBlbHNlIHsKKwkJdmNoID0gMDsKKwl9CisJcmV0dXJuIHZjaDsKK30KKworLyoqCisgKiBhYjg1MDBfY2hhcmdlcl9hY19jdigpIC0gY2hlY2sgaWYgdGhlIG1haW4gY2hhcmdlciBpcyBpbiBDViBtb2RlCisgKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfY2hhcmdlciBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIGFjIGNoYXJnZXIgQ1YgbW9kZSAob24gc3VjY2VzcykgZWxzZSBlcnJvciBjb2RlCisgKi8KK3N0YXRpYyBpbnQgYWI4NTAwX2NoYXJnZXJfYWNfY3Yoc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSkKK3sKKwl1OCB2YWw7CisJaW50IHJldCA9IDA7CisKKwkvKiBPbmx5IGNoZWNrIENWIG1vZGUgaWYgdGhlIGNoYXJnZXIgaXMgb25saW5lICovCisJaWYgKGRpLT5hYy5jaGFyZ2VyX29ubGluZSkgeworCQlyZXQgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX0NIQVJHRVIsCisJCQlBQjg1MDBfQ0hfU1RBVFVTMV9SRUcsICZ2YWwpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgYWI4NTAwIHJlYWQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICh2YWwgJiBNQUlOX0NIX0NWX09OKQorCQkJcmV0ID0gMTsKKwkJZWxzZQorCQkJcmV0ID0gMDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGFiODUwMF9jaGFyZ2VyX2dldF92YnVzX3ZvbHRhZ2UoKSAtIGdldCB2YnVzIHZvbHRhZ2UKKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9jaGFyZ2VyIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmJ1cyB2b2x0YWdlLgorICogUmV0dXJucyB2YnVzIHZvbHRhZ2UgKG9uIHN1Y2Nlc3MpCisgKi8KK3N0YXRpYyBpbnQgYWI4NTAwX2NoYXJnZXJfZ2V0X3ZidXNfdm9sdGFnZShzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpKQoreworCWludCB2Y2g7CisKKwkvKiBPbmx5IG1lYXN1cmUgdm9sdGFnZSBpZiB0aGUgY2hhcmdlciBpcyBjb25uZWN0ZWQgKi8KKwlpZiAoZGktPnVzYi5jaGFyZ2VyX2Nvbm5lY3RlZCkgeworCQl2Y2ggPSBhYjg1MDBfZ3BhZGNfY29udmVydChkaS0+Z3BhZGMsIFZCVVNfVik7CisJCWlmICh2Y2ggPCAwKQorCQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgZ3BhZGMgY29udiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwl9IGVsc2UgeworCQl2Y2ggPSAwOworCX0KKwlyZXR1cm4gdmNoOworfQorCisvKioKKyAqIGFiODUwMF9jaGFyZ2VyX2dldF91c2JfY3VycmVudCgpIC0gZ2V0IHVzYiBjaGFyZ2VyIGN1cnJlbnQKKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9jaGFyZ2VyIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdXNiIGNoYXJnZXIgY3VycmVudC4KKyAqIFJldHVybnMgdXNiIGN1cnJlbnQgKG9uIHN1Y2Nlc3MpIGFuZCBlcnJvciBjb2RlIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBhYjg1MDBfY2hhcmdlcl9nZXRfdXNiX2N1cnJlbnQoc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSkKK3sKKwlpbnQgaWNoOworCisJLyogT25seSBtZWFzdXJlIGN1cnJlbnQgaWYgdGhlIGNoYXJnZXIgaXMgb25saW5lICovCisJaWYgKGRpLT51c2IuY2hhcmdlcl9vbmxpbmUpIHsKKwkJaWNoID0gYWI4NTAwX2dwYWRjX2NvbnZlcnQoZGktPmdwYWRjLCBVU0JfQ0hBUkdFUl9DKTsKKwkJaWYgKGljaCA8IDApCisJCQlkZXZfZXJyKGRpLT5kZXYsICIlcyBncGFkYyBjb252IGZhaWxlZFxuIiwgX19mdW5jX18pOworCX0gZWxzZSB7CisJCWljaCA9IDA7CisJfQorCXJldHVybiBpY2g7Cit9CisKKy8qKgorICogYWI4NTAwX2NoYXJnZXJfZ2V0X2FjX2N1cnJlbnQoKSAtIGdldCBhYyBjaGFyZ2VyIGN1cnJlbnQKKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9jaGFyZ2VyIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYWMgY2hhcmdlciBjdXJyZW50LgorICogUmV0dXJucyBhYyBjdXJyZW50IChvbiBzdWNjZXNzKSBhbmQgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGFiODUwMF9jaGFyZ2VyX2dldF9hY19jdXJyZW50KHN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGkpCit7CisJaW50IGljaDsKKworCS8qIE9ubHkgbWVhc3VyZSBjdXJyZW50IGlmIHRoZSBjaGFyZ2VyIGlzIG9ubGluZSAqLworCWlmIChkaS0+YWMuY2hhcmdlcl9vbmxpbmUpIHsKKwkJaWNoID0gYWI4NTAwX2dwYWRjX2NvbnZlcnQoZGktPmdwYWRjLCBNQUlOX0NIQVJHRVJfQyk7CisJCWlmIChpY2ggPCAwKQorCQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgZ3BhZGMgY29udiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwl9IGVsc2UgeworCQlpY2ggPSAwOworCX0KKwlyZXR1cm4gaWNoOworfQorCisvKioKKyAqIGFiODUwMF9jaGFyZ2VyX3VzYl9jdigpIC0gY2hlY2sgaWYgdGhlIHVzYiBjaGFyZ2VyIGlzIGluIENWIG1vZGUKKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9jaGFyZ2VyIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgYWMgY2hhcmdlciBDViBtb2RlIChvbiBzdWNjZXNzKSBlbHNlIGVycm9yIGNvZGUKKyAqLworc3RhdGljIGludCBhYjg1MDBfY2hhcmdlcl91c2JfY3Yoc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSkKK3sKKwlpbnQgcmV0OworCXU4IHZhbDsKKworCS8qIE9ubHkgY2hlY2sgQ1YgbW9kZSBpZiB0aGUgY2hhcmdlciBpcyBvbmxpbmUgKi8KKwlpZiAoZGktPnVzYi5jaGFyZ2VyX29ubGluZSkgeworCQlyZXQgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX0NIQVJHRVIsCisJCQlBQjg1MDBfQ0hfVVNCQ0hfU1RBVDFfUkVHLCAmdmFsKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoZGktPmRldiwgIiVzIGFiODUwMCByZWFkIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAodmFsICYgVVNCX0NIX0NWX09OKQorCQkJcmV0ID0gMTsKKwkJZWxzZQorCQkJcmV0ID0gMDsKKwl9IGVsc2UgeworCQlyZXQgPSAwOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYWI4NTAwX2NoYXJnZXJfZGV0ZWN0X2NoYXJnZXJzKCkgLSBEZXRlY3QgdGhlIGNvbm5lY3RlZCBjaGFyZ2VycworICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2NoYXJnZXIgc3RydWN0dXJlCisgKiBAcHJvYmU6CWlmIHByb2JlLCBkb24ndCBkZWxheSBhbmQgd2FpdCBmb3IgSFcKKyAqCisgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIGNoYXJnZXIgY29ubmVjdGVkLgorICogRm9yIFVTQiBpdCB3aWxsIG5vdCBtZWFuIHdlIGNhbiBhY3R1YWxseSBjaGFyZ2UgZnJvbSBpdAorICogYnV0IHRoYXQgdGhlcmUgaXMgYSBVU0IgY2FibGUgY29ubmVjdGVkIHRoYXQgd2UgaGF2ZSB0bworICogaWRlbnRpZnkuIFRoaXMgaXMgdXNlZCBkdXJpbmcgc3RhcnR1cCB3aGVuIHdlIGRvbid0IGdldAorICogaW50ZXJydXB0cyBvZiB0aGUgY2hhcmdlciBkZXRlY3Rpb24KKyAqCisgKiBSZXR1cm5zIGFuIGludGVnZXIgdmFsdWUsIHRoYXQgbWVhbnMsCisgKiBOT19QV19DT05OICBubyBwb3dlciBzdXBwbHkgaXMgY29ubmVjdGVkCisgKiBBQ19QV19DT05OICBpZiB0aGUgQUMgcG93ZXIgc3VwcGx5IGlzIGNvbm5lY3RlZAorICogVVNCX1BXX0NPTk4gIGlmIHRoZSBVU0IgcG93ZXIgc3VwcGx5IGlzIGNvbm5lY3RlZAorICogQUNfUFdfQ09OTiArIFVTQl9QV19DT05OIGlmIFVTQiBhbmQgQUMgcG93ZXIgc3VwcGxpZXMgYXJlIGJvdGggY29ubmVjdGVkCisgKi8KK3N0YXRpYyBpbnQgYWI4NTAwX2NoYXJnZXJfZGV0ZWN0X2NoYXJnZXJzKHN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGksIGJvb2wgcHJvYmUpCit7CisJaW50IHJlc3VsdCA9IE5PX1BXX0NPTk47CisJaW50IHJldDsKKwl1OCB2YWw7CisKKwkvKiBDaGVjayBmb3IgQUMgY2hhcmdlciAqLworCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfQ0hBUkdFUiwKKwkJQUI4NTAwX0NIX1NUQVRVUzFfUkVHLCAmdmFsKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRpLT5kZXYsICIlcyBhYjg1MDAgcmVhZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAodmFsICYgTUFJTl9DSF9ERVQpCisJCXJlc3VsdCA9IEFDX1BXX0NPTk47CisKKwkvKiBDaGVjayBmb3IgVVNCIGNoYXJnZXIgKi8KKworCWlmICghcHJvYmUpIHsKKwkJLyoKKwkJICogQUI4NTAwIHNheXMgVkJVU19ERVRfREJOQzEgJiBWQlVTX0RFVF9EQk5DMTAwCisJCSAqIHdoZW4gZGlzY29ubmVjdGluZyBBQ0EgZXZlbiB0aG91Z2ggbm8KKwkJICogY2hhcmdlciB3YXMgY29ubmVjdGVkLiBUcnkgd2FpdGluZyBhIGxpdHRsZQorCQkgKiBsb25nZXIgdGhhbiB0aGUgMTAwIG1zIG9mIFZCVVNfREVUX0RCTkMxMDAuLi4KKwkJICovCisJCW1zbGVlcCgxMTApOworCX0KKwlyZXQgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX0NIQVJHRVIsCisJCUFCODUwMF9DSF9VU0JDSF9TVEFUMV9SRUcsICZ2YWwpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGktPmRldiwgIiVzIGFiODUwMCByZWFkIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gcmV0OworCX0KKwlkZXZfZGJnKGRpLT5kZXYsCisJCSIlcyBBQjg1MDBfQ0hfVVNCQ0hfU1RBVDFfUkVHICV4XG4iLCBfX2Z1bmNfXywKKwkJdmFsKTsKKwlpZiAoKHZhbCAmIFZCVVNfREVUX0RCTkMxKSAmJiAodmFsICYgVkJVU19ERVRfREJOQzEwMCkpCisJCXJlc3VsdCB8PSBVU0JfUFdfQ09OTjsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogYWI4NTAwX2NoYXJnZXJfbWF4X3VzYl9jdXJyKCkgLSBnZXQgdGhlIG1heCBjdXJyIGZvciB0aGUgVVNCIHR5cGUKKyAqIEBkaToJCQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfY2hhcmdlciBzdHJ1Y3R1cmUKKyAqIEBsaW5rX3N0YXR1czoJdGhlIGlkZW50aWZpZWQgVVNCIHR5cGUKKyAqCisgKiBHZXQgdGhlIG1heGltdW0gY3VycmVudCB0aGF0IGlzIGFsbG93ZWQgdG8gYmUgZHJhd24gZnJvbSB0aGUgaG9zdAorICogYmFzZWQgb24gdGhlIFVTQiB0eXBlLgorICogUmV0dXJucyBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZSBlbHNlIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50IGFiODUwMF9jaGFyZ2VyX21heF91c2JfY3VycihzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpLAorCQllbnVtIGFiODUwMF9jaGFyZ2VyX2xpbmtfc3RhdHVzIGxpbmtfc3RhdHVzKQoreworCWludCByZXQgPSAwOworCisJZGktPnVzYl9kZXZpY2VfaXNfdW5yZWNvZ25pc2VkID0gZmFsc2U7CisKKwkvKgorCSAqIFBsYXRmb3JtIG9ubHkgc3VwcG9ydHMgVVNCIDIuMC4KKwkgKiBUaGlzIG1lYW5zIHRoYXQgY2hhcmdpbmcgY3VycmVudCBmcm9tIFVTQiBzb3VyY2UKKwkgKiBpcyBtYXhpbXVtIDUwMCBtQS4gRXZlcnkgb2NjdXJlbmNlIG9mIFVTQl9TVEFUXypfSE9TVF8qCisJICogc2hvdWxkIHNldCBVU0JfQ0hfSVBfQ1VSX0xWTF8wUDUuCisJICovCisKKwlzd2l0Y2ggKGxpbmtfc3RhdHVzKSB7CisJY2FzZSBVU0JfU1RBVF9TVERfSE9TVF9OQzoKKwljYXNlIFVTQl9TVEFUX1NURF9IT1NUX0NfTlM6CisJY2FzZSBVU0JfU1RBVF9TVERfSE9TVF9DX1M6CisJCWRldl9kYmcoZGktPmRldiwgIlVTQiBUeXBlIC0gU3RhbmRhcmQgaG9zdCBpcyAiCisJCQkiZGV0ZWN0ZWQgdGhyb3VnaCBVU0IgZHJpdmVyXG4iKTsKKwkJZGktPm1heF91c2JfaW5fY3Vyci51c2JfdHlwZV9tYXggPSBVU0JfQ0hfSVBfQ1VSX0xWTF8wUDU7CisJCWRpLT5pc19hY2FfcmlkID0gMDsKKwkJYnJlYWs7CisJY2FzZSBVU0JfU1RBVF9IT1NUX0NIR19IU19DSElSUDoKKwkJZGktPm1heF91c2JfaW5fY3Vyci51c2JfdHlwZV9tYXggPSBVU0JfQ0hfSVBfQ1VSX0xWTF8wUDU7CisJCWRpLT5pc19hY2FfcmlkID0gMDsKKwkJYnJlYWs7CisJY2FzZSBVU0JfU1RBVF9IT1NUX0NIR19IUzoKKwkJZGktPm1heF91c2JfaW5fY3Vyci51c2JfdHlwZV9tYXggPSBVU0JfQ0hfSVBfQ1VSX0xWTF8wUDU7CisJCWRpLT5pc19hY2FfcmlkID0gMDsKKwkJYnJlYWs7CisJY2FzZSBVU0JfU1RBVF9BQ0FfUklEX0NfSFM6CisJCWRpLT5tYXhfdXNiX2luX2N1cnIudXNiX3R5cGVfbWF4ID0gVVNCX0NIX0lQX0NVUl9MVkxfMFA5OworCQlkaS0+aXNfYWNhX3JpZCA9IDA7CisJCWJyZWFrOworCWNhc2UgVVNCX1NUQVRfQUNBX1JJRF9BOgorCQkvKgorCQkgKiBEZWRpY2F0ZWQgY2hhcmdlciBsZXZlbCBtaW51cyBtYXhpbXVtIGN1cnJlbnQgYWNjZXNzb3J5CisJCSAqIGNhbiBjb25zdW1lICg5MDBtQSkuIENsb3Nlc3QgbGV2ZWwgaXMgNTAwbUEKKwkJICovCisJCWRldl9kYmcoZGktPmRldiwgIlVTQl9TVEFUX0FDQV9SSURfQSBkZXRlY3RlZFxuIik7CisJCWRpLT5tYXhfdXNiX2luX2N1cnIudXNiX3R5cGVfbWF4ID0gVVNCX0NIX0lQX0NVUl9MVkxfMFA1OworCQlkaS0+aXNfYWNhX3JpZCA9IDE7CisJCWJyZWFrOworCWNhc2UgVVNCX1NUQVRfQUNBX1JJRF9COgorCQkvKgorCQkgKiBEZWRpY2F0ZWQgY2hhcmdlciBsZXZlbCBtaW51cyAxMjBtQSAoMjBtQSBmb3IgQUNBIGFuZAorCQkgKiAxMDBtQSBmb3IgcG90ZW50aWFsIGFjY2Vzc29yeSkuIENsb3Nlc3QgbGV2ZWwgaXMgMTMwMG1BCisJCSAqLworCQlkaS0+bWF4X3VzYl9pbl9jdXJyLnVzYl90eXBlX21heCA9IFVTQl9DSF9JUF9DVVJfTFZMXzFQMzsKKwkJZGV2X2RiZyhkaS0+ZGV2LCAiVVNCIFR5cGUgLSAweCUwMnggTWF4Q3VycjogJWQiLCBsaW5rX3N0YXR1cywKKwkJCQlkaS0+bWF4X3VzYl9pbl9jdXJyLnVzYl90eXBlX21heCk7CisJCWRpLT5pc19hY2FfcmlkID0gMTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfU1RBVF9IT1NUX0NIR19OTToKKwkJZGktPm1heF91c2JfaW5fY3Vyci51c2JfdHlwZV9tYXggPSBVU0JfQ0hfSVBfQ1VSX0xWTF8wUDU7CisJCWRpLT5pc19hY2FfcmlkID0gMDsKKwkJYnJlYWs7CisJY2FzZSBVU0JfU1RBVF9ERURJQ0FURURfQ0hHOgorCQlkaS0+bWF4X3VzYl9pbl9jdXJyLnVzYl90eXBlX21heCA9IFVTQl9DSF9JUF9DVVJfTFZMXzFQNTsKKwkJZGktPmlzX2FjYV9yaWQgPSAwOworCQlicmVhazsKKwljYXNlIFVTQl9TVEFUX0FDQV9SSURfQ19IU19DSElSUDoKKwljYXNlIFVTQl9TVEFUX0FDQV9SSURfQ19OTToKKwkJZGktPm1heF91c2JfaW5fY3Vyci51c2JfdHlwZV9tYXggPSBVU0JfQ0hfSVBfQ1VSX0xWTF8xUDU7CisJCWRpLT5pc19hY2FfcmlkID0gMTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfU1RBVF9OT1RfQ09ORklHVVJFRDoKKwkJaWYgKGRpLT52YnVzX2RldGVjdGVkKSB7CisJCQlkaS0+dXNiX2RldmljZV9pc191bnJlY29nbmlzZWQgPSB0cnVlOworCQkJZGV2X2RiZyhkaS0+ZGV2LCAiVVNCIFR5cGUgLSBMZWdhY3kgY2hhcmdlci5cbiIpOworCQkJZGktPm1heF91c2JfaW5fY3Vyci51c2JfdHlwZV9tYXggPQorCQkJCQkJVVNCX0NIX0lQX0NVUl9MVkxfMVA1OworCQkJYnJlYWs7CisJCX0KKwljYXNlIFVTQl9TVEFUX0hNX0lER05EOgorCQlkZXZfZXJyKGRpLT5kZXYsICJVU0IgVHlwZSAtIENoYXJnaW5nIG5vdCBhbGxvd2VkXG4iKTsKKwkJZGktPm1heF91c2JfaW5fY3Vyci51c2JfdHlwZV9tYXggPSBVU0JfQ0hfSVBfQ1VSX0xWTF8wUDA1OworCQlyZXQgPSAtRU5YSU87CisJCWJyZWFrOworCWNhc2UgVVNCX1NUQVRfUkVTRVJWRUQ6CisJCWlmIChpc19hYjg1MDAoZGktPnBhcmVudCkpIHsKKwkJCWRpLT5mbGFncy52YnVzX2NvbGxhcHNlID0gdHJ1ZTsKKwkJCWRldl9lcnIoZGktPmRldiwgIlVTQiBUeXBlIC0gVVNCX1NUQVRfUkVTRVJWRUQgIgorCQkJCQkJIlZCVVMgaGFzIGNvbGxhcHNlZFxuIik7CisJCQlyZXQgPSAtRU5YSU87CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWRldl9kYmcoZGktPmRldiwgIlVTQiBUeXBlIC0gQ2hhcmdpbmcgbm90IGFsbG93ZWRcbiIpOworCQkJZGktPm1heF91c2JfaW5fY3Vyci51c2JfdHlwZV9tYXggPQorCQkJCQkJVVNCX0NIX0lQX0NVUl9MVkxfMFAwNTsKKwkJCWRldl9kYmcoZGktPmRldiwgIlVTQiBUeXBlIC0gMHglMDJ4IE1heEN1cnI6ICVkIiwKKwkJCQlsaW5rX3N0YXR1cywKKwkJCQlkaS0+bWF4X3VzYl9pbl9jdXJyLnVzYl90eXBlX21heCk7CisJCQlyZXQgPSAtRU5YSU87CisJCQlicmVhazsKKwkJfQorCWNhc2UgVVNCX1NUQVRfQ0FSS0lUXzE6CisJY2FzZSBVU0JfU1RBVF9DQVJLSVRfMjoKKwljYXNlIFVTQl9TVEFUX0FDQV9ET0NLX0NIQVJHRVI6CisJY2FzZSBVU0JfU1RBVF9DSEFSR0VSX0xJTkVfMToKKwkJZGktPm1heF91c2JfaW5fY3Vyci51c2JfdHlwZV9tYXggPSBVU0JfQ0hfSVBfQ1VSX0xWTF8wUDU7CisJCWRldl9kYmcoZGktPmRldiwgIlVTQiBUeXBlIC0gMHglMDJ4IE1heEN1cnI6ICVkIiwgbGlua19zdGF0dXMsCisJCQkJZGktPm1heF91c2JfaW5fY3Vyci51c2JfdHlwZV9tYXgpOworCQlicmVhazsKKwljYXNlIFVTQl9TVEFUX05PVF9WQUxJRF9MSU5LOgorCQlkZXZfZXJyKGRpLT5kZXYsICJVU0IgVHlwZSBpbnZhbGlkIC0gdHJ5IGNoYXJnaW5nIGFueXdheVxuIik7CisJCWRpLT5tYXhfdXNiX2luX2N1cnIudXNiX3R5cGVfbWF4ID0gVVNCX0NIX0lQX0NVUl9MVkxfMFA1OworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGktPmRldiwgIlVTQiBUeXBlIC0gVW5rbm93blxuIik7CisJCWRpLT5tYXhfdXNiX2luX2N1cnIudXNiX3R5cGVfbWF4ID0gVVNCX0NIX0lQX0NVUl9MVkxfMFAwNTsKKwkJcmV0ID0gLUVOWElPOworCQlicmVhazsKKwl9OworCisJZGktPm1heF91c2JfaW5fY3Vyci5zZXRfbWF4ID0gZGktPm1heF91c2JfaW5fY3Vyci51c2JfdHlwZV9tYXg7CisJZGV2X2RiZyhkaS0+ZGV2LCAiVVNCIFR5cGUgLSAweCUwMnggTWF4Q3VycjogJWQiLAorCQlsaW5rX3N0YXR1cywgZGktPm1heF91c2JfaW5fY3Vyci5zZXRfbWF4KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYWI4NTAwX2NoYXJnZXJfcmVhZF91c2JfdHlwZSgpIC0gcmVhZCB0aGUgdHlwZSBvZiB1c2IgY29ubmVjdGVkCisgKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfY2hhcmdlciBzdHJ1Y3R1cmUKKyAqCisgKiBEZXRlY3QgdGhlIHR5cGUgb2YgdGhlIHBsdWdnZWQgVVNCCisgKiBSZXR1cm5zIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlIGVsc2UgMCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQgYWI4NTAwX2NoYXJnZXJfcmVhZF91c2JfdHlwZShzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpKQoreworCWludCByZXQ7CisJdTggdmFsOworCisJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCisJCUFCODUwMF9JTlRFUlJVUFQsIEFCODUwMF9JVF9TT1VSQ0UyMV9SRUcsICZ2YWwpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGktPmRldiwgIiVzIGFiODUwMCByZWFkIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gcmV0OworCX0KKwlpZiAoaXNfYWI4NTAwKGRpLT5wYXJlbnQpKQorCQlyZXQgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX1VTQiwKKwkJCUFCODUwMF9VU0JfTElORV9TVEFUX1JFRywgJnZhbCk7CisJZWxzZQorCQlyZXQgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKKwkJCUFCODUwMF9VU0IsIEFCODUwMF9VU0JfTElOSzFfU1RBVF9SRUcsICZ2YWwpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGktPmRldiwgIiVzIGFiODUwMCByZWFkIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIGdldCB0aGUgVVNCIHR5cGUgKi8KKwlpZiAoaXNfYWI4NTAwKGRpLT5wYXJlbnQpKQorCQl2YWwgPSAodmFsICYgQUI4NTAwX1VTQl9MSU5LX1NUQVRVUykgPj4gVVNCX0xJTktfU1RBVFVTX1NISUZUOworCWVsc2UKKwkJdmFsID0gKHZhbCAmIEFCODUwNV9VU0JfTElOS19TVEFUVVMpID4+IFVTQl9MSU5LX1NUQVRVU19TSElGVDsKKwlyZXQgPSBhYjg1MDBfY2hhcmdlcl9tYXhfdXNiX2N1cnIoZGksCisJCShlbnVtIGFiODUwMF9jaGFyZ2VyX2xpbmtfc3RhdHVzKSB2YWwpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBhYjg1MDBfY2hhcmdlcl9kZXRlY3RfdXNiX3R5cGUoKSAtIGdldCB0aGUgdHlwZSBvZiB1c2IgY29ubmVjdGVkCisgKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfY2hhcmdlciBzdHJ1Y3R1cmUKKyAqCisgKiBEZXRlY3QgdGhlIHR5cGUgb2YgdGhlIHBsdWdnZWQgVVNCCisgKiBSZXR1cm5zIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlIGVsc2UgMCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQgYWI4NTAwX2NoYXJnZXJfZGV0ZWN0X3VzYl90eXBlKHN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGkpCit7CisJaW50IGksIHJldDsKKwl1OCB2YWw7CisKKwkvKgorCSAqIE9uIGdldHRpbmcgdGhlIFZCVVMgcmlzaW5nIGVkZ2UgZGV0ZWN0IGludGVycnVwdCB0aGVyZQorCSAqIGlzIGEgMjUwbXMgZGVsYXkgYWZ0ZXIgd2hpY2ggdGhlIHJlZ2lzdGVyIFVzYkxpbmVTdGF0dXMKKwkgKiBpcyBmaWxsZWQgd2l0aCB2YWxpZCBkYXRhLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCW1zbGVlcCgyNTApOworCQlyZXQgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKKwkJCUFCODUwMF9JTlRFUlJVUFQsIEFCODUwMF9JVF9TT1VSQ0UyMV9SRUcsCisJCQkmdmFsKTsKKwkJZGV2X2RiZyhkaS0+ZGV2LCAiJXMgQUI4NTAwX0lUX1NPVVJDRTIxX1JFRyAleFxuIiwKKwkJCV9fZnVuY19fLCB2YWwpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgYWI4NTAwIHJlYWQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJaWYgKGlzX2FiODUwMChkaS0+cGFyZW50KSkKKwkJCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAorCQkJCUFCODUwMF9VU0IsIEFCODUwMF9VU0JfTElORV9TVEFUX1JFRywgJnZhbCk7CisJCWVsc2UKKwkJCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAorCQkJCUFCODUwMF9VU0IsIEFCODUwMF9VU0JfTElOSzFfU1RBVF9SRUcsICZ2YWwpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgYWI4NTAwIHJlYWQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWRldl9kYmcoZGktPmRldiwgIiVzIEFCODUwMF9VU0JfTElORV9TVEFUX1JFRyAleFxuIiwgX19mdW5jX18sCisJCQl2YWwpOworCQkvKgorCQkgKiBVbnRpbCB0aGUgSVQgc291cmNlIHJlZ2lzdGVyIGlzIHJlYWQgdGhlIFVzYkxpbmVTdGF0dXMKKwkJICogcmVnaXN0ZXIgaXMgbm90IHVwZGF0ZWQsIGhlbmNlIGRvaW5nIHRoZSBzYW1lCisJCSAqIFJldmlzaXQgdGhpczoKKwkJICovCisKKwkJLyogZ2V0IHRoZSBVU0IgdHlwZSAqLworCQlpZiAoaXNfYWI4NTAwKGRpLT5wYXJlbnQpKQorCQkJdmFsID0gKHZhbCAmIEFCODUwMF9VU0JfTElOS19TVEFUVVMpID4+CisJCQkJCQkJVVNCX0xJTktfU1RBVFVTX1NISUZUOworCQllbHNlCisJCQl2YWwgPSAodmFsICYgQUI4NTA1X1VTQl9MSU5LX1NUQVRVUykgPj4KKwkJCQkJCQlVU0JfTElOS19TVEFUVVNfU0hJRlQ7CisJCWlmICh2YWwpCisJCQlicmVhazsKKwl9CisJcmV0ID0gYWI4NTAwX2NoYXJnZXJfbWF4X3VzYl9jdXJyKGRpLAorCQkoZW51bSBhYjg1MDBfY2hhcmdlcl9saW5rX3N0YXR1cykgdmFsKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUaGlzIGFycmF5IG1hcHMgdGhlIHJhdyBoZXggdmFsdWUgdG8gY2hhcmdlciB2b2x0YWdlIHVzZWQgYnkgdGhlIEFCODUwMAorICogVmFsdWVzIHRha2VuIGZyb20gdGhlIFVNMDgzNgorICovCitzdGF0aWMgaW50IGFiODUwMF9jaGFyZ2VyX3ZvbHRhZ2VfbWFwW10gPSB7CisJMzUwMCAsCisJMzUyNSAsCisJMzU1MCAsCisJMzU3NSAsCisJMzYwMCAsCisJMzYyNSAsCisJMzY1MCAsCisJMzY3NSAsCisJMzcwMCAsCisJMzcyNSAsCisJMzc1MCAsCisJMzc3NSAsCisJMzgwMCAsCisJMzgyNSAsCisJMzg1MCAsCisJMzg3NSAsCisJMzkwMCAsCisJMzkyNSAsCisJMzk1MCAsCisJMzk3NSAsCisJNDAwMCAsCisJNDAyNSAsCisJNDA1MCAsCisJNDA2MCAsCisJNDA3MCAsCisJNDA4MCAsCisJNDA5MCAsCisJNDEwMCAsCisJNDExMCAsCisJNDEyMCAsCisJNDEzMCAsCisJNDE0MCAsCisJNDE1MCAsCisJNDE2MCAsCisJNDE3MCAsCisJNDE4MCAsCisJNDE5MCAsCisJNDIwMCAsCisJNDIxMCAsCisJNDIyMCAsCisJNDIzMCAsCisJNDI0MCAsCisJNDI1MCAsCisJNDI2MCAsCisJNDI3MCAsCisJNDI4MCAsCisJNDI5MCAsCisJNDMwMCAsCisJNDMxMCAsCisJNDMyMCAsCisJNDMzMCAsCisJNDM0MCAsCisJNDM1MCAsCisJNDM2MCAsCisJNDM3MCAsCisJNDM4MCAsCisJNDM5MCAsCisJNDQwMCAsCisJNDQxMCAsCisJNDQyMCAsCisJNDQzMCAsCisJNDQ0MCAsCisJNDQ1MCAsCisJNDQ2MCAsCisJNDQ3MCAsCisJNDQ4MCAsCisJNDQ5MCAsCisJNDUwMCAsCisJNDUxMCAsCisJNDUyMCAsCisJNDUzMCAsCisJNDU0MCAsCisJNDU1MCAsCisJNDU2MCAsCisJNDU3MCAsCisJNDU4MCAsCisJNDU5MCAsCisJNDYwMCAsCit9OworCitzdGF0aWMgaW50IGFiODUwMF92b2x0YWdlX3RvX3JlZ3ZhbChpbnQgdm9sdGFnZSkKK3sKKwlpbnQgaTsKKworCS8qIFNwZWNpYWwgY2FzZSBmb3Igdm9sdGFnZSBiZWxvdyAzLjVWICovCisJaWYgKHZvbHRhZ2UgPCBhYjg1MDBfY2hhcmdlcl92b2x0YWdlX21hcFswXSkKKwkJcmV0dXJuIExPV19WT0xUX1JFRzsKKworCWZvciAoaSA9IDE7IGkgPCBBUlJBWV9TSVpFKGFiODUwMF9jaGFyZ2VyX3ZvbHRhZ2VfbWFwKTsgaSsrKSB7CisJCWlmICh2b2x0YWdlIDwgYWI4NTAwX2NoYXJnZXJfdm9sdGFnZV9tYXBbaV0pCisJCQlyZXR1cm4gaSAtIDE7CisJfQorCisJLyogSWYgbm90IGxhc3QgZWxlbWVudCwgcmV0dXJuIGVycm9yICovCisJaSA9IEFSUkFZX1NJWkUoYWI4NTAwX2NoYXJnZXJfdm9sdGFnZV9tYXApIC0gMTsKKwlpZiAodm9sdGFnZSA9PSBhYjg1MDBfY2hhcmdlcl92b2x0YWdlX21hcFtpXSkKKwkJcmV0dXJuIGk7CisJZWxzZQorCQlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgYWI4NTAwX2N1cnJlbnRfdG9fcmVndmFsKHN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGksIGludCBjdXJyKQoreworCWludCBpOworCisJaWYgKGN1cnIgPCBkaS0+Ym0tPmNoZ19vdXRwdXRfY3VyclswXSkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGktPmJtLT5uX2NoZ19vdXRfY3VycjsgaSsrKSB7CisJCWlmIChjdXJyIDwgZGktPmJtLT5jaGdfb3V0cHV0X2N1cnJbaV0pCisJCQlyZXR1cm4gaSAtIDE7CisJfQorCisJLyogSWYgbm90IGxhc3QgZWxlbWVudCwgcmV0dXJuIGVycm9yICovCisJaSA9IGRpLT5ibS0+bl9jaGdfb3V0X2N1cnIgLSAxOworCWlmIChjdXJyID09IGRpLT5ibS0+Y2hnX291dHB1dF9jdXJyW2ldKQorCQlyZXR1cm4gaTsKKwllbHNlCisJCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBhYjg1MDBfdmJ1c19pbl9jdXJyX3RvX3JlZ3ZhbChzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpLCBpbnQgY3VycikKK3sKKwlpbnQgaTsKKworCWlmIChjdXJyIDwgZGktPmJtLT5jaGdfaW5wdXRfY3VyclswXSkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGktPmJtLT5uX2NoZ19pbl9jdXJyOyBpKyspIHsKKwkJaWYgKGN1cnIgPCBkaS0+Ym0tPmNoZ19pbnB1dF9jdXJyW2ldKQorCQkJcmV0dXJuIGkgLSAxOworCX0KKworCS8qIElmIG5vdCBsYXN0IGVsZW1lbnQsIHJldHVybiBlcnJvciAqLworCWkgPSBkaS0+Ym0tPm5fY2hnX2luX2N1cnIgLSAxOworCWlmIChjdXJyID09IGRpLT5ibS0+Y2hnX2lucHV0X2N1cnJbaV0pCisJCXJldHVybiBpOworCWVsc2UKKwkJcmV0dXJuIC0xOworfQorCisvKioKKyAqIGFiODUwMF9jaGFyZ2VyX2dldF91c2JfY3VyKCkgLSBnZXQgdXNiIGN1cnJlbnQKKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9jaGFyZ2VyIHN0cnVjdHJlCisgKgorICogVGhlIHVzYiBzdGFjayBwcm92aWRlcyB0aGUgbWF4aW11bSBjdXJyZW50IHRoYXQgY2FuIGJlIGRyYXduIGZyb20KKyAqIHRoZSBzdGFuZGFyZCB1c2IgaG9zdC4gVGhpcyB3aWxsIGJlIGluIG1BLgorICogVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBjdXJyZW50IGluIG1BIHRvIGEgdmFsdWUgdGhhdCBjYW4gYmUgd3JpdHRlbgorICogdG8gdGhlIHJlZ2lzdGVyLiBSZXR1cm5zIC0xIGlmIGNoYXJnaW5nIGlzIG5vdCBhbGxvd2VkCisgKi8KK3N0YXRpYyBpbnQgYWI4NTAwX2NoYXJnZXJfZ2V0X3VzYl9jdXIoc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzd2l0Y2ggKGRpLT51c2Jfc3RhdGUudXNiX2N1cnJlbnQpIHsKKwljYXNlIDEwMDoKKwkJZGktPm1heF91c2JfaW5fY3Vyci51c2JfdHlwZV9tYXggPSBVU0JfQ0hfSVBfQ1VSX0xWTF8wUDA5OworCQlicmVhazsKKwljYXNlIDIwMDoKKwkJZGktPm1heF91c2JfaW5fY3Vyci51c2JfdHlwZV9tYXggPSBVU0JfQ0hfSVBfQ1VSX0xWTF8wUDE5OworCQlicmVhazsKKwljYXNlIDMwMDoKKwkJZGktPm1heF91c2JfaW5fY3Vyci51c2JfdHlwZV9tYXggPSBVU0JfQ0hfSVBfQ1VSX0xWTF8wUDI5OworCQlicmVhazsKKwljYXNlIDQwMDoKKwkJZGktPm1heF91c2JfaW5fY3Vyci51c2JfdHlwZV9tYXggPSBVU0JfQ0hfSVBfQ1VSX0xWTF8wUDM4OworCQlicmVhazsKKwljYXNlIDUwMDoKKwkJZGktPm1heF91c2JfaW5fY3Vyci51c2JfdHlwZV9tYXggPSBVU0JfQ0hfSVBfQ1VSX0xWTF8wUDU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRpLT5tYXhfdXNiX2luX2N1cnIudXNiX3R5cGVfbWF4ID0gVVNCX0NIX0lQX0NVUl9MVkxfMFAwNTsKKwkJcmV0ID0gLUVQRVJNOworCQlicmVhazsKKwl9OworCWRpLT5tYXhfdXNiX2luX2N1cnIuc2V0X21heCA9IGRpLT5tYXhfdXNiX2luX2N1cnIudXNiX3R5cGVfbWF4OworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYWI4NTAwX2NoYXJnZXJfY2hlY2tfY29udGludWVfc3RlcHBpbmcoKSAtIENoZWNrIHRvIGFsbG93IHN0ZXBwaW5nCisgKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfY2hhcmdlciBzdHJ1Y3R1cmUKKyAqIEByZWc6CXNlbGVjdCB3aGF0IGNoYXJnZXIgcmVnaXN0ZXIgdG8gY2hlY2sKKyAqCisgKiBDaGVjayBpZiBjdXJyZW50IHN0ZXBwaW5nIHNob3VsZCBiZSBhbGxvd2VkIHRvIGNvbnRpbnVlLgorICogQ2hlY2tzIGlmIGNoYXJnZXIgc291cmNlIGhhcyBub3QgY29sbGFwc2VkLiBJZiBpdCBoYXMsIGZ1cnRoZXIgc3RlcHBpbmcKKyAqIGlzIG5vdCBhbGxvd2VkLgorICovCitzdGF0aWMgYm9vbCBhYjg1MDBfY2hhcmdlcl9jaGVja19jb250aW51ZV9zdGVwcGluZyhzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpLAorCQkJCQkJICAgaW50IHJlZykKK3sKKwlpZiAocmVnID09IEFCODUwMF9VU0JDSF9JUFRfQ1JOVExWTF9SRUcpCisJCXJldHVybiAhZGktPmZsYWdzLnZidXNfZHJvcF9lbmQ7CisJZWxzZQorCQlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBhYjg1MDBfY2hhcmdlcl9zZXRfY3VycmVudCgpIC0gc2V0IGNoYXJnZXIgY3VycmVudAorICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2NoYXJnZXIgc3RydWN0dXJlCisgKiBAaWNoOgljaGFyZ2VyIGN1cnJlbnQsIGluIG1BCisgKiBAcmVnOglzZWxlY3Qgd2hhdCBjaGFyZ2VyIHJlZ2lzdGVyIHRvIHNldAorICoKKyAqIFNldCBjaGFyZ2VyIGN1cnJlbnQuCisgKiBUaGVyZSBpcyBubyBzdGF0ZSBtYWNoaW5lIGluIHRoZSBBQiB0byBzdGVwIHVwL2Rvd24gdGhlIGNoYXJnZXIKKyAqIGN1cnJlbnQgdG8gYXZvaWQgZGlwcyBhbmQgc3Bpa2VzIG9uIE1BSU4sIFZCVVMgYW5kIFZCQVQgd2hlbgorICogY2hhcmdpbmcgaXMgc3RhcnRlZC4gSW5zdGVhZCB3ZSBuZWVkIHRvIGltcGxlbWVudAorICogdGhpcyBjaGFyZ2VyIGN1cnJlbnQgc3RlcC11cC9kb3duIGhlcmUuCisgKiBSZXR1cm5zIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlIGVsc2UgMChvbiBzdWNjZXNzKQorICovCitzdGF0aWMgaW50IGFiODUwMF9jaGFyZ2VyX3NldF9jdXJyZW50KHN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGksCisJaW50IGljaCwgaW50IHJlZykKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgY3Vycl9pbmRleCwgcHJldl9jdXJyX2luZGV4LCBzaGlmdF92YWx1ZSwgaTsKKwl1OCByZWdfdmFsdWU7CisJdTMyIHN0ZXBfdWRlbGF5OworCWJvb2wgbm9fc3RlcHBpbmcgPSBmYWxzZTsKKworCWF0b21pY19pbmMoJmRpLT5jdXJyZW50X3N0ZXBwaW5nX3Nlc3Npb25zKTsKKworCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfQ0hBUkdFUiwKKwkJcmVnLCAmcmVnX3ZhbHVlKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRpLT5kZXYsICIlcyByZWFkIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlnb3RvIGV4aXRfc2V0X2N1cnJlbnQ7CisJfQorCisJc3dpdGNoIChyZWcpIHsKKwljYXNlIEFCODUwMF9NQ0hfSVBUX0NVUkxWTF9SRUc6CisJCXNoaWZ0X3ZhbHVlID0gTUFJTl9DSF9JTlBVVF9DVVJSX1NISUZUOworCQlwcmV2X2N1cnJfaW5kZXggPSAocmVnX3ZhbHVlID4+IHNoaWZ0X3ZhbHVlKTsKKwkJY3Vycl9pbmRleCA9IGFiODUwMF9jdXJyZW50X3RvX3JlZ3ZhbChkaSwgaWNoKTsKKwkJc3RlcF91ZGVsYXkgPSBTVEVQX1VERUxBWTsKKwkJaWYgKCFkaS0+YWMuY2hhcmdlcl9jb25uZWN0ZWQpCisJCQlub19zdGVwcGluZyA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgQUI4NTAwX1VTQkNIX0lQVF9DUk5UTFZMX1JFRzoKKwkJaWYgKGlzX2FiODU0MChkaS0+cGFyZW50KSkKKwkJCXNoaWZ0X3ZhbHVlID0gQUI4NTQwX1ZCVVNfSU5fQ1VSUl9MSU1fU0hJRlQ7CisJCWVsc2UKKwkJCXNoaWZ0X3ZhbHVlID0gVkJVU19JTl9DVVJSX0xJTV9TSElGVDsKKwkJcHJldl9jdXJyX2luZGV4ID0gKHJlZ192YWx1ZSA+PiBzaGlmdF92YWx1ZSk7CisJCWN1cnJfaW5kZXggPSBhYjg1MDBfdmJ1c19pbl9jdXJyX3RvX3JlZ3ZhbChkaSwgaWNoKTsKKwkJc3RlcF91ZGVsYXkgPSBTVEVQX1VERUxBWSAqIDEwMDsKKworCQlpZiAoIWRpLT51c2IuY2hhcmdlcl9jb25uZWN0ZWQpCisJCQlub19zdGVwcGluZyA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgQUI4NTAwX0NIX09QVF9DUk5UTFZMX1JFRzoKKwkJc2hpZnRfdmFsdWUgPSAwOworCQlwcmV2X2N1cnJfaW5kZXggPSAocmVnX3ZhbHVlID4+IHNoaWZ0X3ZhbHVlKTsKKwkJY3Vycl9pbmRleCA9IGFiODUwMF9jdXJyZW50X3RvX3JlZ3ZhbChkaSwgaWNoKTsKKwkJc3RlcF91ZGVsYXkgPSBTVEVQX1VERUxBWTsKKwkJaWYgKGN1cnJfaW5kZXggJiYgKGN1cnJfaW5kZXggLSBwcmV2X2N1cnJfaW5kZXgpID4gMSkKKwkJCXN0ZXBfdWRlbGF5ICo9IDEwMDsKKworCQlpZiAoIWRpLT51c2IuY2hhcmdlcl9jb25uZWN0ZWQgJiYgIWRpLT5hYy5jaGFyZ2VyX2Nvbm5lY3RlZCkKKwkJCW5vX3N0ZXBwaW5nID0gdHJ1ZTsKKworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRpLT5kZXYsICIlcyBjdXJyZW50IHJlZ2lzdGVyIG5vdCB2YWxpZFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZXhpdF9zZXRfY3VycmVudDsKKwl9CisKKwlpZiAoY3Vycl9pbmRleCA8IDApIHsKKwkJZGV2X2VycihkaS0+ZGV2LCAicmVxdWVzdGVkIGN1cnJlbnQgbGltaXQgb3V0LW9mLXJhbmdlXG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGV4aXRfc2V0X2N1cnJlbnQ7CisJfQorCisJLyogb25seSB1cGRhdGUgY3VycmVudCBpZiBpdCdzIGJlZW4gY2hhbmdlZCAqLworCWlmIChwcmV2X2N1cnJfaW5kZXggPT0gY3Vycl9pbmRleCkgeworCQlkZXZfZGJnKGRpLT5kZXYsICIlcyBjdXJyZW50IG5vdCBjaGFuZ2VkIGZvciByZWc6IDB4JTAyeFxuIiwKKwkJCV9fZnVuY19fLCByZWcpOworCQlyZXQgPSAwOworCQlnb3RvIGV4aXRfc2V0X2N1cnJlbnQ7CisJfQorCisJZGV2X2RiZyhkaS0+ZGV2LCAiJXMgc2V0IGNoYXJnZXIgY3VycmVudDogJWQgbUEgZm9yIHJlZzogMHglMDJ4XG4iLAorCQlfX2Z1bmNfXywgaWNoLCByZWcpOworCisJaWYgKG5vX3N0ZXBwaW5nKSB7CisJCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfQ0hBUkdFUiwKKwkJCQkJcmVnLCAodTgpY3Vycl9pbmRleCA8PCBzaGlmdF92YWx1ZSk7CisJCWlmIChyZXQpCisJCQlkZXZfZXJyKGRpLT5kZXYsICIlcyB3cml0ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwl9IGVsc2UgaWYgKHByZXZfY3Vycl9pbmRleCA+IGN1cnJfaW5kZXgpIHsKKwkJZm9yIChpID0gcHJldl9jdXJyX2luZGV4IC0gMTsgaSA+PSBjdXJyX2luZGV4OyBpLS0pIHsKKwkJCWRldl9kYmcoZGktPmRldiwgImN1cnIgY2hhbmdlXzEgdG86ICV4IGZvciAweCUwMnhcbiIsCisJCQkJKHU4KSBpIDw8IHNoaWZ0X3ZhbHVlLCByZWcpOworCQkJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCisJCQkJQUI4NTAwX0NIQVJHRVIsIHJlZywgKHU4KWkgPDwgc2hpZnRfdmFsdWUpOworCQkJaWYgKHJldCkgeworCQkJCWRldl9lcnIoZGktPmRldiwgIiVzIHdyaXRlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJCWdvdG8gZXhpdF9zZXRfY3VycmVudDsKKwkJCX0KKwkJCWlmIChpICE9IGN1cnJfaW5kZXgpCisJCQkJdXNsZWVwX3JhbmdlKHN0ZXBfdWRlbGF5LCBzdGVwX3VkZWxheSAqIDIpOworCQl9CisJfSBlbHNlIHsKKwkJYm9vbCBhbGxvdyA9IHRydWU7CisJCWZvciAoaSA9IHByZXZfY3Vycl9pbmRleCArIDE7IGkgPD0gY3Vycl9pbmRleCAmJiBhbGxvdzsgaSsrKSB7CisJCQlkZXZfZGJnKGRpLT5kZXYsICJjdXJyIGNoYW5nZV8yIHRvOiAleCBmb3IgMHglMDJ4XG4iLAorCQkJCSh1OClpIDw8IHNoaWZ0X3ZhbHVlLCByZWcpOworCQkJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCisJCQkJQUI4NTAwX0NIQVJHRVIsIHJlZywgKHU4KWkgPDwgc2hpZnRfdmFsdWUpOworCQkJaWYgKHJldCkgeworCQkJCWRldl9lcnIoZGktPmRldiwgIiVzIHdyaXRlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJCWdvdG8gZXhpdF9zZXRfY3VycmVudDsKKwkJCX0KKwkJCWlmIChpICE9IGN1cnJfaW5kZXgpCisJCQkJdXNsZWVwX3JhbmdlKHN0ZXBfdWRlbGF5LCBzdGVwX3VkZWxheSAqIDIpOworCisJCQlhbGxvdyA9IGFiODUwMF9jaGFyZ2VyX2NoZWNrX2NvbnRpbnVlX3N0ZXBwaW5nKGRpLCByZWcpOworCQl9CisJfQorCitleGl0X3NldF9jdXJyZW50OgorCWF0b21pY19kZWMoJmRpLT5jdXJyZW50X3N0ZXBwaW5nX3Nlc3Npb25zKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYWI4NTAwX2NoYXJnZXJfc2V0X3ZidXNfaW5fY3VycigpIC0gc2V0IFZCVVMgaW5wdXQgY3VycmVudCBsaW1pdAorICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2NoYXJnZXIgc3RydWN0dXJlCisgKiBAaWNoX2luOgljaGFyZ2VyIGlucHV0IGN1cnJlbnQgbGltaXQKKyAqCisgKiBTZXRzIHRoZSBjdXJyZW50IHRoYXQgY2FuIGJlIGRyYXduIGZyb20gdGhlIFVTQiBob3N0CisgKiBSZXR1cm5zIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlIGVsc2UgMChvbiBzdWNjZXNzKQorICovCitzdGF0aWMgaW50IGFiODUwMF9jaGFyZ2VyX3NldF92YnVzX2luX2N1cnIoc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSwKKwkJaW50IGljaF9pbikKK3sKKwlpbnQgbWluX3ZhbHVlOworCWludCByZXQ7CisKKwkvKiBXZSBzaG91bGQgYWx3YXlzIHVzZSB0byBsb3dlc3QgY3VycmVudCBsaW1pdCAqLworCW1pbl92YWx1ZSA9IG1pbihkaS0+Ym0tPmNoZ19wYXJhbXMtPnVzYl9jdXJyX21heCwgaWNoX2luKTsKKwlpZiAoZGktPm1heF91c2JfaW5fY3Vyci5zZXRfbWF4ID4gMCkKKwkJbWluX3ZhbHVlID0gbWluKGRpLT5tYXhfdXNiX2luX2N1cnIuc2V0X21heCwgbWluX3ZhbHVlKTsKKworCWlmIChkaS0+dXNiX3N0YXRlLnVzYl9jdXJyZW50ID49IDApCisJCW1pbl92YWx1ZSA9IG1pbihkaS0+dXNiX3N0YXRlLnVzYl9jdXJyZW50LCBtaW5fdmFsdWUpOworCisJc3dpdGNoIChtaW5fdmFsdWUpIHsKKwljYXNlIDEwMDoKKwkJaWYgKGRpLT52YmF0IDwgVkJBVF9UUkVTSF9JUF9DVVJfUkVEKQorCQkJbWluX3ZhbHVlID0gVVNCX0NIX0lQX0NVUl9MVkxfMFAwNTsKKwkJYnJlYWs7CisJY2FzZSA1MDA6CisJCWlmIChkaS0+dmJhdCA8IFZCQVRfVFJFU0hfSVBfQ1VSX1JFRCkKKwkJCW1pbl92YWx1ZSA9IFVTQl9DSF9JUF9DVVJfTFZMXzBQNDU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWRldl9pbmZvKGRpLT5kZXYsICJWQlVTIGlucHV0IGN1cnJlbnQgbGltaXQgc2V0IHRvICVkIG1BXG4iLCBtaW5fdmFsdWUpOworCisJbXV0ZXhfbG9jaygmZGktPnVzYl9pcHRfY3JudF9sb2NrKTsKKwlyZXQgPSBhYjg1MDBfY2hhcmdlcl9zZXRfY3VycmVudChkaSwgbWluX3ZhbHVlLAorCQlBQjg1MDBfVVNCQ0hfSVBUX0NSTlRMVkxfUkVHKTsKKwltdXRleF91bmxvY2soJmRpLT51c2JfaXB0X2NybnRfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGFiODUwMF9jaGFyZ2VyX3NldF9tYWluX2luX2N1cnIoKSAtIHNldCBtYWluIGNoYXJnZXIgaW5wdXQgY3VycmVudAorICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2NoYXJnZXIgc3RydWN0dXJlCisgKiBAaWNoX2luOglpbnB1dCBjaGFyZ2VyIGN1cnJlbnQsIGluIG1BCisgKgorICogU2V0IG1haW4gY2hhcmdlciBpbnB1dCBjdXJyZW50LgorICogUmV0dXJucyBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZSBlbHNlIDAob24gc3VjY2VzcykKKyAqLworc3RhdGljIGludCBhYjg1MDBfY2hhcmdlcl9zZXRfbWFpbl9pbl9jdXJyKHN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGksCisJaW50IGljaF9pbikKK3sKKwlyZXR1cm4gYWI4NTAwX2NoYXJnZXJfc2V0X2N1cnJlbnQoZGksIGljaF9pbiwKKwkJQUI4NTAwX01DSF9JUFRfQ1VSTFZMX1JFRyk7Cit9CisKKy8qKgorICogYWI4NTAwX2NoYXJnZXJfc2V0X291dHB1dF9jdXJyKCkgLSBzZXQgY2hhcmdlciBvdXRwdXQgY3VycmVudAorICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2NoYXJnZXIgc3RydWN0dXJlCisgKiBAaWNoX291dDoJb3V0cHV0IGNoYXJnZXIgY3VycmVudCwgaW4gbUEKKyAqCisgKiBTZXQgY2hhcmdlciBvdXRwdXQgY3VycmVudC4KKyAqIFJldHVybnMgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUgZWxzZSAwKG9uIHN1Y2Nlc3MpCisgKi8KK3N0YXRpYyBpbnQgYWI4NTAwX2NoYXJnZXJfc2V0X291dHB1dF9jdXJyKHN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGksCisJaW50IGljaF9vdXQpCit7CisJcmV0dXJuIGFiODUwMF9jaGFyZ2VyX3NldF9jdXJyZW50KGRpLCBpY2hfb3V0LAorCQlBQjg1MDBfQ0hfT1BUX0NSTlRMVkxfUkVHKTsKK30KKworLyoqCisgKiBhYjg1MDBfY2hhcmdlcl9sZWRfZW4oKSAtIHR1cm4gb24vb2ZmIGNoYXJnaWduIGxlZAorICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2NoYXJnZXIgc3RydWN0dXJlCisgKiBAb246CQlmbGFnIHRvIHR1cm4gb24vb2ZmIHRoZSBjaGFyZ2lnbiBsZWQKKyAqCisgKiBQb3dlciBPTi9PRkYgY2hhcmdpbmcgTEVEIGluZGljYXRpb24KKyAqIFJldHVybnMgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUgZWxzZSAwKG9uIHN1Y2Nlc3MpCisgKi8KK3N0YXRpYyBpbnQgYWI4NTAwX2NoYXJnZXJfbGVkX2VuKHN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGksIGludCBvbikKK3sKKwlpbnQgcmV0OworCisJaWYgKG9uKSB7CisJCS8qIFBvd2VyIE9OIGNoYXJnaW5nIExFRCBpbmRpY2F0b3IsIHNldCBMRUQgY3VycmVudCB0byA1bUEgKi8KKwkJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9DSEFSR0VSLAorCQkJQUI4NTAwX0xFRF9JTkRJQ0FUT1JfUFdNX0NUUkwsCisJCQkoTEVEX0lORF9DVVJfNU1BIHwgTEVEX0lORElDQVRPUl9QV01fRU5BKSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGktPmRldiwgIlBvd2VyIE9OIExFRCBmYWlsZWRcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQkvKiBMRUQgaW5kaWNhdG9yIFBXTSBkdXR5IGN5Y2xlIDI1Mi8yNTYgKi8KKwkJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9DSEFSR0VSLAorCQkJQUI4NTAwX0xFRF9JTkRJQ0FUT1JfUFdNX0RVVFksCisJCQlMRURfSU5ESUNBVE9SX1BXTV9EVVRZXzI1Ml8yNTYpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRpLT5kZXYsICJTZXQgTEVEIFBXTSBkdXR5IGN5Y2xlIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfSBlbHNlIHsKKwkJLyogUG93ZXIgb2ZmIGNoYXJnaW5nIExFRCBpbmRpY2F0b3IgKi8KKwkJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9DSEFSR0VSLAorCQkJQUI4NTAwX0xFRF9JTkRJQ0FUT1JfUFdNX0NUUkwsCisJCQlMRURfSU5ESUNBVE9SX1BXTV9ESVMpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRpLT5kZXYsICJQb3dlci1vZmYgTEVEIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBhYjg1MDBfY2hhcmdlcl9hY19lbigpIC0gZW5hYmxlIG9yIGRpc2FibGUgYWMgY2hhcmdpbmcKKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9jaGFyZ2VyIHN0cnVjdHVyZQorICogQGVuYWJsZToJZW5hYmxlL2Rpc2FibGUgZmxhZworICogQHZzZXQ6CWNoYXJnaW5nIHZvbHRhZ2UKKyAqIEBpc2V0OgljaGFyZ2luZyBjdXJyZW50CisgKgorICogRW5hYmxlL0Rpc2FibGUgQUMvTWFpbnMgY2hhcmdpbmcgYW5kIHR1cm5zIG9uL29mZiB0aGUgY2hhcmdpbmcgbGVkCisgKiByZXNwZWN0aXZlbHkuCisgKiovCitzdGF0aWMgaW50IGFiODUwMF9jaGFyZ2VyX2FjX2VuKHN0cnVjdCB1eDUwMF9jaGFyZ2VyICpjaGFyZ2VyLAorCWludCBlbmFibGUsIGludCB2c2V0LCBpbnQgaXNldCkKK3sKKwlpbnQgcmV0OworCWludCB2b2x0X2luZGV4OworCWludCBjdXJyX2luZGV4OworCWludCBpbnB1dF9jdXJyX2luZGV4OworCXU4IG92ZXJzaG9vdCA9IDA7CisKKwlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpID0gdG9fYWI4NTAwX2NoYXJnZXJfYWNfZGV2aWNlX2luZm8oY2hhcmdlcik7CisKKwlpZiAoZW5hYmxlKSB7CisJCS8qIENoZWNrIGlmIEFDIGlzIGNvbm5lY3RlZCAqLworCQlpZiAoIWRpLT5hYy5jaGFyZ2VyX2Nvbm5lY3RlZCkgeworCQkJZGV2X2VycihkaS0+ZGV2LCAiQUMgY2hhcmdlciBub3QgY29ubmVjdGVkXG4iKTsKKwkJCXJldHVybiAtRU5YSU87CisJCX0KKworCQkvKiBFbmFibGUgQUMgY2hhcmdpbmcgKi8KKwkJZGV2X2RiZyhkaS0+ZGV2LCAiRW5hYmxlIEFDOiAlZG1WICVkbUFcbiIsIHZzZXQsIGlzZXQpOworCisJCS8qCisJCSAqIER1ZSB0byBhIGJ1ZyBpbiBBQjg1MDAsIEJURU1QX0hJR0gvTE9XIGludGVycnVwdHMKKwkJICogd2lsbCBiZSB0cmlnZ2VyZWQgZXZlcnl0aW1lIHdlIGVuYWJsZSB0aGUgVkREIEFEQyBzdXBwbHkuCisJCSAqIFRoaXMgd2lsbCB0dXJuIG9mZiBjaGFyZ2luZyBmb3IgYSBzaG9ydCB3aGlsZS4KKwkJICogSXQgY2FuIGJlIGF2b2lkZWQgYnkgaGF2aW5nIHRoZSBzdXBwbHkgb24gd2hlbgorCQkgKiB0aGVyZSBpcyBhIGNoYXJnZXIgZW5hYmxlZC4gTm9ybWFsbHkgdGhlIFZERCBBREMgc3VwcGx5CisJCSAqIGlzIGVuYWJsZWQgZXZlcnl0aW1lIGEgR1BBREMgY29udmVyc2lvbiBpcyB0cmlnZ2VyZWQuIFdlIHdpbGwKKwkJICogZm9yY2UgaXQgdG8gYmUgZW5hYmxlZCBmcm9tIHRoaXMgZHJpdmVyIHRvIGhhdmUKKwkJICogdGhlIEdQQURDIG1vZHVsZSBpbmRlcGVuZGFudCBvZiB0aGUgQUI4NTAwIGNoYXJnZXJzCisJCSAqLworCQlpZiAoIWRpLT52ZGRhZGNfZW5fYWMpIHsKKwkJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoZGktPnJlZ3UpOworCQkJaWYgKHJldCkKKwkJCQlkZXZfd2FybihkaS0+ZGV2LAorCQkJCQkiRmFpbGVkIHRvIGVuYWJsZSByZWd1bGF0b3JcbiIpOworCQkJZWxzZQorCQkJCWRpLT52ZGRhZGNfZW5fYWMgPSB0cnVlOworCQl9CisKKwkJLyogQ2hlY2sgaWYgdGhlIHJlcXVlc3RlZCB2b2x0YWdlIG9yIGN1cnJlbnQgaXMgdmFsaWQgKi8KKwkJdm9sdF9pbmRleCA9IGFiODUwMF92b2x0YWdlX3RvX3JlZ3ZhbCh2c2V0KTsKKwkJY3Vycl9pbmRleCA9IGFiODUwMF9jdXJyZW50X3RvX3JlZ3ZhbChkaSwgaXNldCk7CisJCWlucHV0X2N1cnJfaW5kZXggPSBhYjg1MDBfY3VycmVudF90b19yZWd2YWwoZGksCisJCQlkaS0+Ym0tPmNoZ19wYXJhbXMtPmFjX2N1cnJfbWF4KTsKKwkJaWYgKHZvbHRfaW5kZXggPCAwIHx8IGN1cnJfaW5kZXggPCAwIHx8IGlucHV0X2N1cnJfaW5kZXggPCAwKSB7CisJCQlkZXZfZXJyKGRpLT5kZXYsCisJCQkJIkNoYXJnZXIgdm9sdGFnZSBvciBjdXJyZW50IHRvbyBoaWdoLCAiCisJCQkJImNoYXJnaW5nIG5vdCBzdGFydGVkXG4iKTsKKwkJCXJldHVybiAtRU5YSU87CisJCX0KKworCQkvKiBDaFZvbHRMZXZlbDogbWF4aW11bSBiYXR0ZXJ5IGNoYXJnaW5nIHZvbHRhZ2UgKi8KKwkJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9DSEFSR0VSLAorCQkJQUI4NTAwX0NIX1ZPTFRfTFZMX1JFRywgKHU4KSB2b2x0X2luZGV4KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgd3JpdGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCS8qIE1haW5DaElucHV0Q3VycjogY3VycmVudCB0aGF0IGNhbiBiZSBkcmF3biBmcm9tIHRoZSBjaGFyZ2VyKi8KKwkJcmV0ID0gYWI4NTAwX2NoYXJnZXJfc2V0X21haW5faW5fY3VycihkaSwKKwkJCWRpLT5ibS0+Y2hnX3BhcmFtcy0+YWNfY3Vycl9tYXgpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRpLT5kZXYsICIlcyBGYWlsZWQgdG8gc2V0IE1haW5DaElucHV0Q3VyclxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCS8qIENoT3V0cHV0Q3VyZW50TGV2ZWw6IHByb3RlY3RlZCBvdXRwdXQgY3VycmVudCAqLworCQlyZXQgPSBhYjg1MDBfY2hhcmdlcl9zZXRfb3V0cHV0X2N1cnIoZGksIGlzZXQpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRpLT5kZXYsICIlcyAiCisJCQkJIkZhaWxlZCB0byBzZXQgQ2hPdXRwdXRDdXJlbnRMZXZlbFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJLyogQ2hlY2sgaWYgVkJBVCBvdmVyc2hvb3QgY29udHJvbCBzaG91bGQgYmUgZW5hYmxlZCAqLworCQlpZiAoIWRpLT5ibS0+ZW5hYmxlX292ZXJzaG9vdCkKKwkJCW92ZXJzaG9vdCA9IE1BSU5fQ0hfTk9fT1ZFUlNIT09UX0VOQV9OOworCisJCS8qIEVuYWJsZSBNYWluIENoYXJnZXIgKi8KKwkJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9DSEFSR0VSLAorCQkJQUI4NTAwX01DSF9DVFJMMSwgTUFJTl9DSF9FTkEgfCBvdmVyc2hvb3QpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRpLT5kZXYsICIlcyB3cml0ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQkvKiBQb3dlciBvbiBjaGFyZ2luZyBMRUQgaW5kaWNhdGlvbiAqLworCQlyZXQgPSBhYjg1MDBfY2hhcmdlcl9sZWRfZW4oZGksIHRydWUpOworCQlpZiAocmV0IDwgMCkKKwkJCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byBlbmFibGUgTEVEXG4iKTsKKworCQlkaS0+YWMuY2hhcmdlcl9vbmxpbmUgPSAxOworCX0gZWxzZSB7CisJCS8qIERpc2FibGUgQUMgY2hhcmdpbmcgKi8KKwkJaWYgKGlzX2FiODUwMF8xcDFfb3JfZWFybGllcihkaS0+cGFyZW50KSkgeworCQkJLyoKKwkJCSAqIEZvciBBQkIgcmV2aXNpb24gMS4wIGFuZCAxLjEgdGhlcmUgaXMgYSBidWcgaW4gdGhlCisJCQkgKiB3YXRjaGRvZyBsb2dpYy4gVGhhdCBtZWFucyB3ZSBoYXZlIHRvIGNvbnRpbm91c2x5CisJCQkgKiBraWNrIHRoZSBjaGFyZ2VyIHdhdGNoZG9nIGV2ZW4gd2hlbiBubyBjaGFyZ2VyIGlzCisJCQkgKiBjb25uZWN0ZWQuIFRoaXMgaXMgb25seSB2YWxpZCBvbmNlIHRoZSBBQyBjaGFyZ2VyCisJCQkgKiBoYXMgYmVlbiBlbmFibGVkLiBUaGlzIGlzIGEgYnVnIHRoYXQgaXMgbm90IGhhbmRsZWQKKwkJCSAqIGJ5IHRoZSBhbGdvcml0aG0gYW5kIHRoZSB3YXRjaGRvZyBoYXZlIHRvIGJlIGtpY2tlZAorCQkJICogYnkgdGhlIGNoYXJnZXIgZHJpdmVyIHdoZW4gdGhlIEFDIGNoYXJnZXIKKwkJCSAqIGlzIGRpc2FibGVkCisJCQkgKi8KKwkJCWlmIChkaS0+YWNfY29ubikgeworCQkJCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Y2hhcmdlcl93cSwKKwkJCQkJJmRpLT5raWNrX3dkX3dvcmssCisJCQkJCXJvdW5kX2ppZmZpZXMoV0RfS0lDS19JTlRFUlZBTCkpOworCQkJfQorCisJCQkvKgorCQkJICogV2UgY2FuJ3QgdHVybiBvZmYgY2hhcmdpbmcgY29tcGxldGVseQorCQkJICogZHVlIHRvIGEgYnVnIGluIEFCODUwMCBjdXQxLgorCQkJICogSWYgd2UgZG8sIGNoYXJnaW5nIHdpbGwgbm90IHN0YXJ0IGFnYWluLgorCQkJICogVGhhdCBpcyB3aHkgd2Ugc2V0IHRoZSBsb3dlc3Qgdm9sdGFnZQorCQkJICogYW5kIGN1cnJlbnQgcG9zc2libGUKKwkJCSAqLworCQkJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCisJCQkJQUI4NTAwX0NIQVJHRVIsCisJCQkJQUI4NTAwX0NIX1ZPTFRfTFZMX1JFRywgQ0hfVk9MX0xWTF8zUDUpOworCQkJaWYgKHJldCkgeworCQkJCWRldl9lcnIoZGktPmRldiwKKwkJCQkJIiVzIHdyaXRlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJCXJldHVybiByZXQ7CisJCQl9CisKKwkJCXJldCA9IGFiODUwMF9jaGFyZ2VyX3NldF9vdXRwdXRfY3VycihkaSwgMCk7CisJCQlpZiAocmV0KSB7CisJCQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgIgorCQkJCQkiRmFpbGVkIHRvIHNldCBDaE91dHB1dEN1cmVudExldmVsXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAorCQkJCUFCODUwMF9DSEFSR0VSLAorCQkJCUFCODUwMF9NQ0hfQ1RSTDEsIDApOworCQkJaWYgKHJldCkgeworCQkJCWRldl9lcnIoZGktPmRldiwKKwkJCQkJIiVzIHdyaXRlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKworCQlyZXQgPSBhYjg1MDBfY2hhcmdlcl9sZWRfZW4oZGksIGZhbHNlKTsKKwkJaWYgKHJldCA8IDApCisJCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gZGlzYWJsZSBMRURcbiIpOworCisJCWRpLT5hYy5jaGFyZ2VyX29ubGluZSA9IDA7CisJCWRpLT5hYy53ZF9leHBpcmVkID0gZmFsc2U7CisKKwkJLyogRGlzYWJsZSByZWd1bGF0b3IgaWYgZW5hYmxlZCAqLworCQlpZiAoZGktPnZkZGFkY19lbl9hYykgeworCQkJcmVndWxhdG9yX2Rpc2FibGUoZGktPnJlZ3UpOworCQkJZGktPnZkZGFkY19lbl9hYyA9IGZhbHNlOworCQl9CisKKwkJZGV2X2RiZyhkaS0+ZGV2LCAiJXMgRGlzYWJsZWQgQUMgY2hhcmdpbmdcbiIsIF9fZnVuY19fKTsKKwl9CisJYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLCBkaS0+YWNfY2hnLnBzeSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGFiODUwMF9jaGFyZ2VyX3VzYl9lbigpIC0gZW5hYmxlIHVzYiBjaGFyZ2luZworICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2NoYXJnZXIgc3RydWN0dXJlCisgKiBAZW5hYmxlOgllbmFibGUvZGlzYWJsZSBmbGFnCisgKiBAdnNldDoJY2hhcmdpbmcgdm9sdGFnZQorICogQGljaF9vdXQ6CWNoYXJnZXIgb3V0cHV0IGN1cnJlbnQKKyAqCisgKiBFbmFibGUvRGlzYWJsZSBVU0IgY2hhcmdpbmcgYW5kIHR1cm5zIG9uL29mZiB0aGUgY2hhcmdpbmcgbGVkIHJlc3BlY3RpdmVseS4KKyAqIFJldHVybnMgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUgZWxzZSAwKG9uIHN1Y2Nlc3MpCisgKi8KK3N0YXRpYyBpbnQgYWI4NTAwX2NoYXJnZXJfdXNiX2VuKHN0cnVjdCB1eDUwMF9jaGFyZ2VyICpjaGFyZ2VyLAorCWludCBlbmFibGUsIGludCB2c2V0LCBpbnQgaWNoX291dCkKK3sKKwlpbnQgcmV0OworCWludCB2b2x0X2luZGV4OworCWludCBjdXJyX2luZGV4OworCXU4IG92ZXJzaG9vdCA9IDA7CisKKwlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpID0gdG9fYWI4NTAwX2NoYXJnZXJfdXNiX2RldmljZV9pbmZvKGNoYXJnZXIpOworCisJaWYgKGVuYWJsZSkgeworCQkvKiBDaGVjayBpZiBVU0IgaXMgY29ubmVjdGVkICovCisJCWlmICghZGktPnVzYi5jaGFyZ2VyX2Nvbm5lY3RlZCkgeworCQkJZGV2X2VycihkaS0+ZGV2LCAiVVNCIGNoYXJnZXIgbm90IGNvbm5lY3RlZFxuIik7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisKKwkJLyoKKwkJICogRHVlIHRvIGEgYnVnIGluIEFCODUwMCwgQlRFTVBfSElHSC9MT1cgaW50ZXJydXB0cworCQkgKiB3aWxsIGJlIHRyaWdnZXJlZCBldmVyeXRpbWUgd2UgZW5hYmxlIHRoZSBWREQgQURDIHN1cHBseS4KKwkJICogVGhpcyB3aWxsIHR1cm4gb2ZmIGNoYXJnaW5nIGZvciBhIHNob3J0IHdoaWxlLgorCQkgKiBJdCBjYW4gYmUgYXZvaWRlZCBieSBoYXZpbmcgdGhlIHN1cHBseSBvbiB3aGVuCisJCSAqIHRoZXJlIGlzIGEgY2hhcmdlciBlbmFibGVkLiBOb3JtYWxseSB0aGUgVkREIEFEQyBzdXBwbHkKKwkJICogaXMgZW5hYmxlZCBldmVyeXRpbWUgYSBHUEFEQyBjb252ZXJzaW9uIGlzIHRyaWdnZXJlZC4gV2Ugd2lsbAorCQkgKiBmb3JjZSBpdCB0byBiZSBlbmFibGVkIGZyb20gdGhpcyBkcml2ZXIgdG8gaGF2ZQorCQkgKiB0aGUgR1BBREMgbW9kdWxlIGluZGVwZW5kYW50IG9mIHRoZSBBQjg1MDAgY2hhcmdlcnMKKwkJICovCisJCWlmICghZGktPnZkZGFkY19lbl91c2IpIHsKKwkJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoZGktPnJlZ3UpOworCQkJaWYgKHJldCkKKwkJCQlkZXZfd2FybihkaS0+ZGV2LAorCQkJCQkiRmFpbGVkIHRvIGVuYWJsZSByZWd1bGF0b3JcbiIpOworCQkJZWxzZQorCQkJCWRpLT52ZGRhZGNfZW5fdXNiID0gdHJ1ZTsKKwkJfQorCisJCS8qIEVuYWJsZSBVU0IgY2hhcmdpbmcgKi8KKwkJZGV2X2RiZyhkaS0+ZGV2LCAiRW5hYmxlIFVTQjogJWRtViAlZG1BXG4iLCB2c2V0LCBpY2hfb3V0KTsKKworCQkvKiBDaGVjayBpZiB0aGUgcmVxdWVzdGVkIHZvbHRhZ2Ugb3IgY3VycmVudCBpcyB2YWxpZCAqLworCQl2b2x0X2luZGV4ID0gYWI4NTAwX3ZvbHRhZ2VfdG9fcmVndmFsKHZzZXQpOworCQljdXJyX2luZGV4ID0gYWI4NTAwX2N1cnJlbnRfdG9fcmVndmFsKGRpLCBpY2hfb3V0KTsKKwkJaWYgKHZvbHRfaW5kZXggPCAwIHx8IGN1cnJfaW5kZXggPCAwKSB7CisJCQlkZXZfZXJyKGRpLT5kZXYsCisJCQkJIkNoYXJnZXIgdm9sdGFnZSBvciBjdXJyZW50IHRvbyBoaWdoLCAiCisJCQkJImNoYXJnaW5nIG5vdCBzdGFydGVkXG4iKTsKKwkJCXJldHVybiAtRU5YSU87CisJCX0KKworCQkvKiBDaFZvbHRMZXZlbDogbWF4IHZvbHRhZ2UgdXB0byB3aGljaCBiYXR0ZXJ5IGNhbiBiZSBjaGFyZ2VkICovCisJCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfQ0hBUkdFUiwKKwkJCUFCODUwMF9DSF9WT0xUX0xWTF9SRUcsICh1OCkgdm9sdF9pbmRleCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGktPmRldiwgIiVzIHdyaXRlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQkvKiBDaGVjayBpZiBWQkFUIG92ZXJzaG9vdCBjb250cm9sIHNob3VsZCBiZSBlbmFibGVkICovCisJCWlmICghZGktPmJtLT5lbmFibGVfb3ZlcnNob290KQorCQkJb3ZlcnNob290ID0gVVNCX0NIR19OT19PVkVSU0hPT1RfRU5BX047CisKKwkJLyogRW5hYmxlIFVTQiBDaGFyZ2VyICovCisJCWRldl9kYmcoZGktPmRldiwKKwkJCSJFbmFibGluZyBVU0Igd2l0aCB3cml0ZSB0byBBQjg1MDBfVVNCQ0hfQ1RSTDFfUkVHXG4iKTsKKwkJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9DSEFSR0VSLAorCQkJQUI4NTAwX1VTQkNIX0NUUkwxX1JFRywgVVNCX0NIX0VOQSB8IG92ZXJzaG9vdCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGktPmRldiwgIiVzIHdyaXRlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCS8qIElmIHN1Y2Nlc3MgcG93ZXIgb24gY2hhcmdpbmcgTEVEIGluZGljYXRpb24gKi8KKwkJcmV0ID0gYWI4NTAwX2NoYXJnZXJfbGVkX2VuKGRpLCB0cnVlKTsKKwkJaWYgKHJldCA8IDApCisJCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIExFRFxuIik7CisKKwkJZGktPnVzYi5jaGFyZ2VyX29ubGluZSA9IDE7CisKKwkJLyogVVNCQ2hJbnB1dEN1cnI6IGN1cnJlbnQgdGhhdCBjYW4gYmUgZHJhd24gZnJvbSB0aGUgdXNiICovCisJCXJldCA9IGFiODUwMF9jaGFyZ2VyX3NldF92YnVzX2luX2N1cnIoZGksCisJCQkJCWRpLT5tYXhfdXNiX2luX2N1cnIudXNiX3R5cGVfbWF4KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkaS0+ZGV2LCAic2V0dGluZyBVU0JDaElucHV0Q3VyciBmYWlsZWRcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCS8qIENoT3V0cHV0Q3VyZW50TGV2ZWw6IHByb3RlY3RlZCBvdXRwdXQgY3VycmVudCAqLworCQlyZXQgPSBhYjg1MDBfY2hhcmdlcl9zZXRfb3V0cHV0X2N1cnIoZGksIGljaF9vdXQpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRpLT5kZXYsICIlcyAiCisJCQkJIkZhaWxlZCB0byBzZXQgQ2hPdXRwdXRDdXJlbnRMZXZlbFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcXVldWVfZGVsYXllZF93b3JrKGRpLT5jaGFyZ2VyX3dxLCAmZGktPmNoZWNrX3ZiYXRfd29yaywgSFopOworCisJfSBlbHNlIHsKKwkJLyogRGlzYWJsZSBVU0IgY2hhcmdpbmcgKi8KKwkJZGV2X2RiZyhkaS0+ZGV2LCAiJXMgRGlzYWJsZWQgVVNCIGNoYXJnaW5nXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAorCQkJQUI4NTAwX0NIQVJHRVIsCisJCQlBQjg1MDBfVVNCQ0hfQ1RSTDFfUkVHLCAwKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkaS0+ZGV2LAorCQkJCSIlcyB3cml0ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlyZXQgPSBhYjg1MDBfY2hhcmdlcl9sZWRfZW4oZGksIGZhbHNlKTsKKwkJaWYgKHJldCA8IDApCisJCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gZGlzYWJsZSBMRURcbiIpOworCQkvKiBVU0JDaElucHV0Q3VycjogY3VycmVudCB0aGF0IGNhbiBiZSBkcmF3biBmcm9tIHRoZSB1c2IgKi8KKwkJcmV0ID0gYWI4NTAwX2NoYXJnZXJfc2V0X3ZidXNfaW5fY3VycihkaSwgMCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGktPmRldiwgInNldHRpbmcgVVNCQ2hJbnB1dEN1cnIgZmFpbGVkXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQkvKiBDaE91dHB1dEN1cmVudExldmVsOiBwcm90ZWN0ZWQgb3V0cHV0IGN1cnJlbnQgKi8KKwkJcmV0ID0gYWI4NTAwX2NoYXJnZXJfc2V0X291dHB1dF9jdXJyKGRpLCAwKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgIgorCQkJCSJGYWlsZWQgdG8gcmVzZXQgQ2hPdXRwdXRDdXJlbnRMZXZlbFxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWRpLT51c2IuY2hhcmdlcl9vbmxpbmUgPSAwOworCQlkaS0+dXNiLndkX2V4cGlyZWQgPSBmYWxzZTsKKworCQkvKiBEaXNhYmxlIHJlZ3VsYXRvciBpZiBlbmFibGVkICovCisJCWlmIChkaS0+dmRkYWRjX2VuX3VzYikgeworCQkJcmVndWxhdG9yX2Rpc2FibGUoZGktPnJlZ3UpOworCQkJZGktPnZkZGFkY19lbl91c2IgPSBmYWxzZTsKKwkJfQorCisJCWRldl9kYmcoZGktPmRldiwgIiVzIERpc2FibGVkIFVTQiBjaGFyZ2luZ1xuIiwgX19mdW5jX18pOworCisJCS8qIENhbmNlbCBhbnkgcGVuZGluZyBWYmF0IGNoZWNrIHdvcmsgKi8KKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmZGktPmNoZWNrX3ZiYXRfd29yayk7CisKKwl9CisJYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLCBkaS0+dXNiX2NoZy5wc3kpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhYjg1MDBfZXh0ZXJuYWxfY2hhcmdlcl9wcmVwYXJlKHN0cnVjdCBub3RpZmllcl9ibG9jayAqY2hhcmdlcl9uYiwKKwkJCQl1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpkYXRhKQoreworCWludCByZXQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gZGF0YTsKKwkvKlRvZ2dsZSBFeHRlcm5hbCBjaGFyZ2VyIGNvbnRyb2wgcGluKi8KKwlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGV2LCBBQjg1MDBfU1lTX0NUUkwxX0JMT0NLLAorCQkJCSAgQUI4NTAwX1NZU19DSEFSR0VSX0NPTlRST0xfUkVHLAorCQkJCSAgRVhURVJOQUxfQ0hBUkdFUl9ESVNBQkxFX1JFR19WQUwpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAid3JpdGUgcmVnIGZhaWxlZCAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkZXYsIEFCODUwMF9TWVNfQ1RSTDFfQkxPQ0ssCisJCQkJICBBQjg1MDBfU1lTX0NIQVJHRVJfQ09OVFJPTF9SRUcsCisJCQkJICBFWFRFUk5BTF9DSEFSR0VSX0VOQUJMRV9SRUdfVkFMKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycihkZXYsICJXcml0ZSByZWcgZmFpbGVkICVkXG4iLCByZXQpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBhYjg1MDBfY2hhcmdlcl91c2JfY2hlY2tfZW5hYmxlKCkgLSBlbmFibGUgdXNiIGNoYXJnaW5nCisgKiBAY2hhcmdlcjoJcG9pbnRlciB0byB0aGUgdXg1MDBfY2hhcmdlciBzdHJ1Y3R1cmUKKyAqIEB2c2V0OgljaGFyZ2luZyB2b2x0YWdlCisgKiBAaXNldDoJY2hhcmdlciBvdXRwdXQgY3VycmVudAorICoKKyAqIENoZWNrIGlmIHRoZSBWQlVTIGNoYXJnZXIgaGFzIGJlZW4gZGlzY29ubmVjdGVkIGFuZCByZWNvbm5lY3RlZCB3aXRob3V0CisgKiBBQjg1MDAgcmlzaW5nIGFuIGludGVycnVwdC4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgYWI4NTAwX2NoYXJnZXJfdXNiX2NoZWNrX2VuYWJsZShzdHJ1Y3QgdXg1MDBfY2hhcmdlciAqY2hhcmdlciwKKwlpbnQgdnNldCwgaW50IGlzZXQpCit7CisJdTggdXNiY2hfY3RybDEgPSAwOworCWludCByZXQgPSAwOworCisJc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IHRvX2FiODUwMF9jaGFyZ2VyX3VzYl9kZXZpY2VfaW5mbyhjaGFyZ2VyKTsKKworCWlmICghZGktPnVzYi5jaGFyZ2VyX2Nvbm5lY3RlZCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfQ0hBUkdFUiwKKwkJCQlBQjg1MDBfVVNCQ0hfQ1RSTDFfUkVHLCAmdXNiY2hfY3RybDEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGktPmRldiwgImFiODUwMCByZWFkIGZhaWxlZCAlZFxuIiwgX19MSU5FX18pOworCQlyZXR1cm4gcmV0OworCX0KKwlkZXZfZGJnKGRpLT5kZXYsICJVU0IgY2hhcmdlciBjdHJsOiAweCUwMnhcbiIsIHVzYmNoX2N0cmwxKTsKKworCWlmICghKHVzYmNoX2N0cmwxICYgVVNCX0NIX0VOQSkpIHsKKwkJZGV2X2luZm8oZGktPmRldiwgIkNoYXJnaW5nIGhhcyBiZWVuIGRpc2FibGVkIGFibm9ybWFsbHkgYW5kIHdpbGwgYmUgcmUtZW5hYmxlZFxuIik7CisKKwkJcmV0ID0gYWJ4NTAwX21hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCisJCQkJCUFCODUwMF9DSEFSR0VSLCBBQjg1MDBfQ0hBUkdFUl9DVFJMLAorCQkJCQlEUk9QX0NPVU5UX1JFU0VULCBEUk9QX0NPVU5UX1JFU0VUKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoZGktPmRldiwgImFiODUwMCB3cml0ZSBmYWlsZWQgJWRcbiIsIF9fTElORV9fKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlyZXQgPSBhYjg1MDBfY2hhcmdlcl91c2JfZW4oJmRpLT51c2JfY2hnLCB0cnVlLCB2c2V0LCBpc2V0KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoZGktPmRldiwgIkZhaWxlZCB0byBlbmFibGUgVkJVUyBjaGFyZ2VyICVkXG4iLAorCQkJCQlfX0xJTkVfXyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYWI4NTAwX2NoYXJnZXJfYWNfY2hlY2tfZW5hYmxlKCkgLSBlbmFibGUgdXNiIGNoYXJnaW5nCisgKiBAY2hhcmdlcjoJcG9pbnRlciB0byB0aGUgdXg1MDBfY2hhcmdlciBzdHJ1Y3R1cmUKKyAqIEB2c2V0OgljaGFyZ2luZyB2b2x0YWdlCisgKiBAaXNldDoJY2hhcmdlciBvdXRwdXQgY3VycmVudAorICoKKyAqIENoZWNrIGlmIHRoZSBBQyBjaGFyZ2VyIGhhcyBiZWVuIGRpc2Nvbm5lY3RlZCBhbmQgcmVjb25uZWN0ZWQgd2l0aG91dAorICogQUI4NTAwIHJpc2luZyBhbiBpbnRlcnJ1cHQuIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IGFiODUwMF9jaGFyZ2VyX2FjX2NoZWNrX2VuYWJsZShzdHJ1Y3QgdXg1MDBfY2hhcmdlciAqY2hhcmdlciwKKwlpbnQgdnNldCwgaW50IGlzZXQpCit7CisJdTggbWFpbmNoX2N0cmwxID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCXN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGkgPSB0b19hYjg1MDBfY2hhcmdlcl9hY19kZXZpY2VfaW5mbyhjaGFyZ2VyKTsKKworCWlmICghZGktPmFjLmNoYXJnZXJfY29ubmVjdGVkKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9DSEFSR0VSLAorCQkJCUFCODUwMF9NQ0hfQ1RSTDEsICZtYWluY2hfY3RybDEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGktPmRldiwgImFiODUwMCByZWFkIGZhaWxlZCAlZFxuIiwgX19MSU5FX18pOworCQlyZXR1cm4gcmV0OworCX0KKwlkZXZfZGJnKGRpLT5kZXYsICJBQyBjaGFyZ2VyIGN0cmw6IDB4JTAyeFxuIiwgbWFpbmNoX2N0cmwxKTsKKworCWlmICghKG1haW5jaF9jdHJsMSAmIE1BSU5fQ0hfRU5BKSkgeworCQlkZXZfaW5mbyhkaS0+ZGV2LCAiQ2hhcmdpbmcgaGFzIGJlZW4gZGlzYWJsZWQgYWJub3JtYWxseSBhbmQgd2lsbCBiZSByZS1lbmFibGVkXG4iKTsKKworCQlyZXQgPSBhYng1MDBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKKwkJCQkJQUI4NTAwX0NIQVJHRVIsIEFCODUwMF9DSEFSR0VSX0NUUkwsCisJCQkJCURST1BfQ09VTlRfUkVTRVQsIERST1BfQ09VTlRfUkVTRVQpOworCisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGRpLT5kZXYsICJhYjg1MDAgd3JpdGUgZmFpbGVkICVkXG4iLCBfX0xJTkVfXyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcmV0ID0gYWI4NTAwX2NoYXJnZXJfYWNfZW4oJmRpLT51c2JfY2hnLCB0cnVlLCB2c2V0LCBpc2V0KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byBlbmFibGUgQUMgY2hhcmdlciAlZFxuIiwKKwkJCQlfX0xJTkVfXyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYWI4NTAwX2NoYXJnZXJfd2F0Y2hkb2dfa2ljaygpIC0ga2ljayBjaGFyZ2VyIHdhdGNoZG9nCisgKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfY2hhcmdlciBzdHJ1Y3R1cmUKKyAqCisgKiBLaWNrIGNoYXJnZXIgd2F0Y2hkb2cKKyAqIFJldHVybnMgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUgZWxzZSAwKG9uIHN1Y2Nlc3MpCisgKi8KK3N0YXRpYyBpbnQgYWI4NTAwX2NoYXJnZXJfd2F0Y2hkb2dfa2ljayhzdHJ1Y3QgdXg1MDBfY2hhcmdlciAqY2hhcmdlcikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGk7CisKKwlpZiAoY2hhcmdlci0+cHN5LT5kZXNjLT50eXBlID09IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TKQorCQlkaSA9IHRvX2FiODUwMF9jaGFyZ2VyX2FjX2RldmljZV9pbmZvKGNoYXJnZXIpOworCWVsc2UgaWYgKGNoYXJnZXItPnBzeS0+ZGVzYy0+dHlwZSA9PSBQT1dFUl9TVVBQTFlfVFlQRV9VU0IpCisJCWRpID0gdG9fYWI4NTAwX2NoYXJnZXJfdXNiX2RldmljZV9pbmZvKGNoYXJnZXIpOworCWVsc2UKKwkJcmV0dXJuIC1FTlhJTzsKKworCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfQ0hBUkdFUiwKKwkJQUI4NTAwX0NIQVJHX1dEX0NUUkwsIENIQVJHX1dEX0tJQ0spOworCWlmIChyZXQpCisJCWRldl9lcnIoZGktPmRldiwgIkZhaWxlZCB0byBraWNrIFdEIVxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGFiODUwMF9jaGFyZ2VyX3VwZGF0ZV9jaGFyZ2VyX2N1cnJlbnQoKSAtIHVwZGF0ZSBjaGFyZ2VyIGN1cnJlbnQKKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9jaGFyZ2VyIHN0cnVjdHVyZQorICoKKyAqIFVwZGF0ZSB0aGUgY2hhcmdlciBvdXRwdXQgY3VycmVudCBmb3IgdGhlIHNwZWNpZmllZCBjaGFyZ2VyCisgKiBSZXR1cm5zIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlIGVsc2UgMChvbiBzdWNjZXNzKQorICovCitzdGF0aWMgaW50IGFiODUwMF9jaGFyZ2VyX3VwZGF0ZV9jaGFyZ2VyX2N1cnJlbnQoc3RydWN0IHV4NTAwX2NoYXJnZXIgKmNoYXJnZXIsCisJCWludCBpY2hfb3V0KQoreworCWludCByZXQ7CisJc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaTsKKworCWlmIChjaGFyZ2VyLT5wc3ktPmRlc2MtPnR5cGUgPT0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlMpCisJCWRpID0gdG9fYWI4NTAwX2NoYXJnZXJfYWNfZGV2aWNlX2luZm8oY2hhcmdlcik7CisJZWxzZSBpZiAoY2hhcmdlci0+cHN5LT5kZXNjLT50eXBlID09IFBPV0VSX1NVUFBMWV9UWVBFX1VTQikKKwkJZGkgPSB0b19hYjg1MDBfY2hhcmdlcl91c2JfZGV2aWNlX2luZm8oY2hhcmdlcik7CisJZWxzZQorCQlyZXR1cm4gLUVOWElPOworCisJcmV0ID0gYWI4NTAwX2NoYXJnZXJfc2V0X291dHB1dF9jdXJyKGRpLCBpY2hfb3V0KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGktPmRldiwgIiVzICIKKwkJCSJGYWlsZWQgdG8gc2V0IENoT3V0cHV0Q3VyZW50TGV2ZWxcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogUmVzZXQgdGhlIG1haW4gYW5kIHVzYiBkcm9wIGlucHV0IGN1cnJlbnQgbWVhc3VyZW1lbnQgY291bnRlciAqLworCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfQ0hBUkdFUiwKKwkJCQlBQjg1MDBfQ0hBUkdFUl9DVFJMLCBEUk9QX0NPVU5UX1JFU0VUKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGktPmRldiwgIiVzIHdyaXRlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYWI4NTQwX2NoYXJnZXJfcG93ZXJfcGF0aF9lbmFibGUoKSAtIGVuYWJsZSB1c2IgcG93ZXIgcGF0aCBtb2RlCisgKiBAY2hhcmdlcjoJcG9pbnRlciB0byB0aGUgdXg1MDBfY2hhcmdlciBzdHJ1Y3R1cmUKKyAqIEBlbmFibGU6CWVuYWJsZS9kaXNhYmxlIGZsYWcKKyAqCisgKiBFbmFibGUgb3IgZGlzYWJsZSB0aGUgcG93ZXIgcGF0aCBmb3IgdXNiIG1vZGUKKyAqIFJldHVybnMgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUgZWxzZSAwKG9uIHN1Y2Nlc3MpCisgKi8KK3N0YXRpYyBpbnQgYWI4NTQwX2NoYXJnZXJfcG93ZXJfcGF0aF9lbmFibGUoc3RydWN0IHV4NTAwX2NoYXJnZXIgKmNoYXJnZXIsCisJCWJvb2wgZW5hYmxlKQoreworCWludCByZXQ7CisJc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaTsKKworCWlmIChjaGFyZ2VyLT5wc3ktPmRlc2MtPnR5cGUgPT0gUE9XRVJfU1VQUExZX1RZUEVfVVNCKQorCQlkaSA9IHRvX2FiODUwMF9jaGFyZ2VyX3VzYl9kZXZpY2VfaW5mbyhjaGFyZ2VyKTsKKwllbHNlCisJCXJldHVybiAtRU5YSU87CisKKwlyZXQgPSBhYng1MDBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKKwkJCQlBQjg1MDBfQ0hBUkdFUiwgQUI4NTQwX1VTQl9QUF9NT0RFX1JFRywKKwkJCQlCVVNfUE9XRVJfUEFUSF9NT0RFX0VOQSwgZW5hYmxlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGktPmRldiwgIiVzIHdyaXRlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiByZXQ7Cit9CisKKworLyoqCisgKiBhYjg1NDBfY2hhcmdlcl91c2JfcHJlX2NoZ19lbmFibGUoKSAtIGVuYWJsZSB1c2IgcHJlIGNoYW5nZQorICogQGNoYXJnZXI6CXBvaW50ZXIgdG8gdGhlIHV4NTAwX2NoYXJnZXIgc3RydWN0dXJlCisgKiBAZW5hYmxlOgllbmFibGUvZGlzYWJsZSBmbGFnCisgKgorICogRW5hYmxlIG9yIGRpc2FibGUgdGhlIHByZS1jaGFnZSBmb3IgdXNiIG1vZGUKKyAqIFJldHVybnMgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUgZWxzZSAwKG9uIHN1Y2Nlc3MpCisgKi8KK3N0YXRpYyBpbnQgYWI4NTQwX2NoYXJnZXJfdXNiX3ByZV9jaGdfZW5hYmxlKHN0cnVjdCB1eDUwMF9jaGFyZ2VyICpjaGFyZ2VyLAorCQlib29sIGVuYWJsZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGk7CisKKwlpZiAoY2hhcmdlci0+cHN5LT5kZXNjLT50eXBlID09IFBPV0VSX1NVUFBMWV9UWVBFX1VTQikKKwkJZGkgPSB0b19hYjg1MDBfY2hhcmdlcl91c2JfZGV2aWNlX2luZm8oY2hhcmdlcik7CisJZWxzZQorCQlyZXR1cm4gLUVOWElPOworCisJcmV0ID0gYWJ4NTAwX21hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCisJCQkJQUI4NTAwX0NIQVJHRVIsIEFCODU0MF9VU0JfUFBfQ0hSX1JFRywKKwkJCQlCVVNfUE9XRVJfUEFUSF9QUkVDSEdfRU5BLCBlbmFibGUpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkaS0+ZGV2LCAiJXMgd3JpdGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhYjg1MDBfY2hhcmdlcl9nZXRfZXh0X3BzeV9kYXRhKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3k7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqZXh0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJY29uc3QgY2hhciAqKnN1cHBsaWNhbnRzID0gKGNvbnN0IGNoYXIgKiopZXh0LT5zdXBwbGllZF90bzsKKwlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpOworCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsIHJldDsKKwlpbnQgajsKKwlzdHJ1Y3QgdXg1MDBfY2hhcmdlciAqdXNiX2NoZzsKKworCXVzYl9jaGcgPSAoc3RydWN0IHV4NTAwX2NoYXJnZXIgKilkYXRhOworCXBzeSA9IHVzYl9jaGctPnBzeTsKKworCWRpID0gdG9fYWI4NTAwX2NoYXJnZXJfdXNiX2RldmljZV9pbmZvKHVzYl9jaGcpOworCisJLyogRm9yIGFsbCBwc3kgd2hlcmUgdGhlIGRyaXZlciBuYW1lIGFwcGVhcnMgaW4gYW55IHN1cHBsaWVkX3RvICovCisJaiA9IG1hdGNoX3N0cmluZyhzdXBwbGljYW50cywgZXh0LT5udW1fc3VwcGxpY2FudHMsIHBzeS0+ZGVzYy0+bmFtZSk7CisJaWYgKGogPCAwKQorCQlyZXR1cm4gMDsKKworCS8qIEdvIHRocm91Z2ggYWxsIHByb3BlcnRpZXMgZm9yIHRoZSBwc3kgKi8KKwlmb3IgKGogPSAwOyBqIDwgZXh0LT5kZXNjLT5udW1fcHJvcGVydGllczsgaisrKSB7CisJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHByb3A7CisJCXByb3AgPSBleHQtPmRlc2MtPnByb3BlcnRpZXNbal07CisKKwkJaWYgKHBvd2VyX3N1cHBseV9nZXRfcHJvcGVydHkoZXh0LCBwcm9wLCAmcmV0KSkKKwkJCWNvbnRpbnVlOworCisJCXN3aXRjaCAocHJvcCkgeworCQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XOgorCQkJc3dpdGNoIChleHQtPmRlc2MtPnR5cGUpIHsKKwkJCWNhc2UgUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWToKKwkJCQlkaS0+dmJhdCA9IHJldC5pbnR2YWwgLyAxMDAwOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYWI4NTAwX2NoYXJnZXJfY2hlY2tfdmJhdF93b3JrKCkgLSBrZWVwIHZidXMgY3VycmVudCB3aXRoaW4gc3BlYworICogQHdvcmsJcG9pbnRlciB0byB0aGUgd29ya19zdHJ1Y3Qgc3RydWN0dXJlCisgKgorICogRHVlIHRvIGEgYXNpYyBidWcgaXQgaXMgbmVjZXNzYXJ5IHRvIGxvd2VyIHRoZSBpbnB1dCBjdXJyZW50IHRvIHRoZSB2YnVzCisgKiBjaGFyZ2VyIHdoZW4gY2hhcmdpbmcgd2l0aCBhdCBzb21lIHNwZWNpZmljIGxldmVscy4gVGhpcyBpc3N1ZSBpcyBvbmx5IHZhbGlkCisgKiBmb3IgYmVsb3cgYSBjZXJ0YWluIGJhdHRlcnkgdm9sdGFnZS4gVGhpcyBmdW5jdGlvbiBtYWtlcyBzdXJlIHRoYXQgdGhlCisgKiB0aGUgYWxsb3dlZCBjdXJyZW50IGxpbWl0IGlzbid0IGV4Y2VlZGVkLgorICovCitzdGF0aWMgdm9pZCBhYjg1MDBfY2hhcmdlcl9jaGVja192YmF0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWludCB0ID0gMTA7CisJc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIsIGNoZWNrX3ZiYXRfd29yay53b3JrKTsKKworCWNsYXNzX2Zvcl9lYWNoX2RldmljZShwb3dlcl9zdXBwbHlfY2xhc3MsIE5VTEwsCisJCWRpLT51c2JfY2hnLnBzeSwgYWI4NTAwX2NoYXJnZXJfZ2V0X2V4dF9wc3lfZGF0YSk7CisKKwkvKiBGaXJzdCBydW4gb2xkX3ZiYXQgaXMgMC4gKi8KKwlpZiAoZGktPm9sZF92YmF0ID09IDApCisJCWRpLT5vbGRfdmJhdCA9IGRpLT52YmF0OworCisJaWYgKCEoKGRpLT5vbGRfdmJhdCA8PSBWQkFUX1RSRVNIX0lQX0NVUl9SRUQgJiYKKwkJZGktPnZiYXQgPD0gVkJBVF9UUkVTSF9JUF9DVVJfUkVEKSB8fAorCQkoZGktPm9sZF92YmF0ID4gVkJBVF9UUkVTSF9JUF9DVVJfUkVEICYmCisJCWRpLT52YmF0ID4gVkJBVF9UUkVTSF9JUF9DVVJfUkVEKSkpIHsKKworCQlkZXZfZGJnKGRpLT5kZXYsICJWYmF0IGRpZCBjcm9zcyB0aHJlc2hvbGQsIGN1cnI6ICVkLCBuZXc6ICVkLCIKKwkJCSIgb2xkOiAlZFxuIiwgZGktPm1heF91c2JfaW5fY3Vyci51c2JfdHlwZV9tYXgsCisJCQlkaS0+dmJhdCwgZGktPm9sZF92YmF0KTsKKwkJYWI4NTAwX2NoYXJnZXJfc2V0X3ZidXNfaW5fY3VycihkaSwKKwkJCQkJZGktPm1heF91c2JfaW5fY3Vyci51c2JfdHlwZV9tYXgpOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChkaS0+dXNiX2NoZy5wc3kpOworCX0KKworCWRpLT5vbGRfdmJhdCA9IGRpLT52YmF0OworCisJLyoKKwkgKiBObyBuZWVkIHRvIGNoZWNrIHRoZSBiYXR0ZXJ5IHZvbHRhZ2UgZXZlcnkgc2Vjb25kIHdoZW4gbm90IGNsb3NlIHRvCisJICogdGhlIHRocmVzaG9sZC4KKwkgKi8KKwlpZiAoZGktPnZiYXQgPCAoVkJBVF9UUkVTSF9JUF9DVVJfUkVEICsgMTAwKSAmJgorCQkoZGktPnZiYXQgPiAoVkJBVF9UUkVTSF9JUF9DVVJfUkVEIC0gMTAwKSkpCisJCQl0ID0gMTsKKworCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Y2hhcmdlcl93cSwgJmRpLT5jaGVja192YmF0X3dvcmssIHQgKiBIWik7Cit9CisKKy8qKgorICogYWI4NTAwX2NoYXJnZXJfY2hlY2tfaHdfZmFpbHVyZV93b3JrKCkgLSBjaGVjayBtYWluIGNoYXJnZXIgZmFpbHVyZQorICogQHdvcms6CXBvaW50ZXIgdG8gdGhlIHdvcmtfc3RydWN0IHN0cnVjdHVyZQorICoKKyAqIFdvcmsgcXVldWUgZnVuY3Rpb24gZm9yIGNoZWNraW5nIHRoZSBtYWluIGNoYXJnZXIgc3RhdHVzCisgKi8KK3N0YXRpYyB2b2lkIGFiODUwMF9jaGFyZ2VyX2NoZWNrX2h3X2ZhaWx1cmVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJaW50IHJldDsKKwl1OCByZWdfdmFsdWU7CisKKwlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpID0gY29udGFpbmVyX29mKHdvcmssCisJCXN0cnVjdCBhYjg1MDBfY2hhcmdlciwgY2hlY2tfaHdfZmFpbHVyZV93b3JrLndvcmspOworCisJLyogQ2hlY2sgaWYgdGhlIHN0YXR1cyBiaXRzIGZvciBIVyBmYWlsdXJlIGlzIHN0aWxsIGFjdGl2ZSAqLworCWlmIChkaS0+ZmxhZ3MubWFpbmV4dGNobm90b2spIHsKKwkJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCisJCQlBQjg1MDBfQ0hBUkdFUiwgQUI4NTAwX0NIX1NUQVRVUzJfUkVHLCAmcmVnX3ZhbHVlKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoZGktPmRldiwgIiVzIGFiODUwMCByZWFkIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuOworCQl9CisJCWlmICghKHJlZ192YWx1ZSAmIE1BSU5fQ0hfTk9LKSkgeworCQkJZGktPmZsYWdzLm1haW5leHRjaG5vdG9rID0gZmFsc2U7CisJCQlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksIGRpLT5hY19jaGcucHN5KTsKKwkJfQorCX0KKwlpZiAoZGktPmZsYWdzLnZidXNfb3Z2KSB7CisJCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAorCQkJQUI4NTAwX0NIQVJHRVIsIEFCODUwMF9DSF9VU0JDSF9TVEFUMl9SRUcsCisJCQkmcmVnX3ZhbHVlKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoZGktPmRldiwgIiVzIGFiODUwMCByZWFkIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuOworCQl9CisJCWlmICghKHJlZ192YWx1ZSAmIFZCVVNfT1ZWX1RIKSkgeworCQkJZGktPmZsYWdzLnZidXNfb3Z2ID0gZmFsc2U7CisJCQlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksIGRpLT51c2JfY2hnLnBzeSk7CisJCX0KKwl9CisJLyogSWYgd2Ugc3RpbGwgaGF2ZSBhIGZhaWx1cmUsIHNjaGVkdWxlIGEgbmV3IGNoZWNrICovCisJaWYgKGRpLT5mbGFncy5tYWluZXh0Y2hub3RvayB8fCBkaS0+ZmxhZ3MudmJ1c19vdnYpIHsKKwkJcXVldWVfZGVsYXllZF93b3JrKGRpLT5jaGFyZ2VyX3dxLAorCQkJJmRpLT5jaGVja19od19mYWlsdXJlX3dvcmssIHJvdW5kX2ppZmZpZXMoSFopKTsKKwl9Cit9CisKKy8qKgorICogYWI4NTAwX2NoYXJnZXJfa2lja193YXRjaGRvZ193b3JrKCkgLSBraWNrIHRoZSB3YXRjaGRvZworICogQHdvcms6CXBvaW50ZXIgdG8gdGhlIHdvcmtfc3RydWN0IHN0cnVjdHVyZQorICoKKyAqIFdvcmsgcXVldWUgZnVuY3Rpb24gZm9yIGtpY2tpbmcgdGhlIGNoYXJnZXIgd2F0Y2hkb2cuCisgKgorICogRm9yIEFCQiByZXZpc2lvbiAxLjAgYW5kIDEuMSB0aGVyZSBpcyBhIGJ1ZyBpbiB0aGUgd2F0Y2hkb2cKKyAqIGxvZ2ljLiBUaGF0IG1lYW5zIHdlIGhhdmUgdG8gY29udGlub3VzbHkga2ljayB0aGUgY2hhcmdlcgorICogd2F0Y2hkb2cgZXZlbiB3aGVuIG5vIGNoYXJnZXIgaXMgY29ubmVjdGVkLiBUaGlzIGlzIG9ubHkKKyAqIHZhbGlkIG9uY2UgdGhlIEFDIGNoYXJnZXIgaGFzIGJlZW4gZW5hYmxlZC4gVGhpcyBpcworICogYSBidWcgdGhhdCBpcyBub3QgaGFuZGxlZCBieSB0aGUgYWxnb3JpdGhtIGFuZCB0aGUKKyAqIHdhdGNoZG9nIGhhdmUgdG8gYmUga2lja2VkIGJ5IHRoZSBjaGFyZ2VyIGRyaXZlcgorICogd2hlbiB0aGUgQUMgY2hhcmdlciBpcyBkaXNhYmxlZAorICovCitzdGF0aWMgdm9pZCBhYjg1MDBfY2hhcmdlcl9raWNrX3dhdGNoZG9nX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWludCByZXQ7CisKKwlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpID0gY29udGFpbmVyX29mKHdvcmssCisJCXN0cnVjdCBhYjg1MDBfY2hhcmdlciwga2lja193ZF93b3JrLndvcmspOworCisJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9DSEFSR0VSLAorCQlBQjg1MDBfQ0hBUkdfV0RfQ1RSTCwgQ0hBUkdfV0RfS0lDSyk7CisJaWYgKHJldCkKKwkJZGV2X2VycihkaS0+ZGV2LCAiRmFpbGVkIHRvIGtpY2sgV0QhXG4iKTsKKworCS8qIFNjaGVkdWxlIGEgbmV3IHdhdGNoZG9nIGtpY2sgKi8KKwlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmNoYXJnZXJfd3EsCisJCSZkaS0+a2lja193ZF93b3JrLCByb3VuZF9qaWZmaWVzKFdEX0tJQ0tfSU5URVJWQUwpKTsKK30KKworLyoqCisgKiBhYjg1MDBfY2hhcmdlcl9hY193b3JrKCkgLSB3b3JrIHRvIGdldCBhbmQgc2V0IG1haW4gY2hhcmdlciBzdGF0dXMKKyAqIEB3b3JrOglwb2ludGVyIHRvIHRoZSB3b3JrX3N0cnVjdCBzdHJ1Y3R1cmUKKyAqCisgKiBXb3JrIHF1ZXVlIGZ1bmN0aW9uIGZvciBjaGVja2luZyB0aGUgbWFpbiBjaGFyZ2VyIHN0YXR1cworICovCitzdGF0aWMgdm9pZCBhYjg1MDBfY2hhcmdlcl9hY193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlpbnQgcmV0OworCisJc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIsIGFjX3dvcmspOworCisJLyoKKwkgKiBTaW5jZSB3ZSBjYW4ndCBiZSBzdXJlIHRoYXQgdGhlIGV2ZW50cyBhcmUgcmVjZWl2ZWQKKwkgKiBzeW5jaHJvbm91c2x5LCB3ZSBoYXZlIHRoZSBjaGVjayBpZiB0aGUgbWFpbiBjaGFyZ2VyIGlzCisJICogY29ubmVjdGVkIGJ5IHJlYWRpbmcgdGhlIHN0YXR1cyByZWdpc3RlcgorCSAqLworCXJldCA9IGFiODUwMF9jaGFyZ2VyX2RldGVjdF9jaGFyZ2VycyhkaSwgZmFsc2UpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm47CisKKwlpZiAocmV0ICYgQUNfUFdfQ09OTikgeworCQlkaS0+YWMuY2hhcmdlcl9jb25uZWN0ZWQgPSAxOworCQlkaS0+YWNfY29ubiA9IHRydWU7CisJfSBlbHNlIHsKKwkJZGktPmFjLmNoYXJnZXJfY29ubmVjdGVkID0gMDsKKwl9CisKKwlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksIGRpLT5hY19jaGcucHN5KTsKKwlzeXNmc19ub3RpZnkoJmRpLT5hY19jaGcucHN5LT5kZXYua29iaiwgTlVMTCwgInByZXNlbnQiKTsKK30KKworc3RhdGljIHZvaWQgYWI4NTAwX2NoYXJnZXJfdXNiX2F0dGFjaGVkX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGkgPSBjb250YWluZXJfb2Yod29yaywKKwkJCQkJCSBzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIsCisJCQkJCQkgdXNiX2NoYXJnZXJfYXR0YWNoZWRfd29yay53b3JrKTsKKwlpbnQgdXNiY2ggPSAoVVNCX0NIX1ZCVVNEUk9QIHwgVVNCX0NIX1ZCVVNERVREQk5DKTsKKwlpbnQgcmV0LCBpOworCXU4IHN0YXR2YWw7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQlyZXQgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKKwkJCQkJCQlBQjg1MDBfQ0hBUkdFUiwKKwkJCQkJCQlBQjg1MDBfQ0hfVVNCQ0hfU1RBVDFfUkVHLAorCQkJCQkJCSZzdGF0dmFsKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoZGktPmRldiwgImFiODUwMCByZWFkIGZhaWxlZCAlZFxuIiwgX19MSU5FX18pOworCQkJZ290byByZXNjaGVkdWxlOworCQl9CisJCWlmICgoc3RhdHZhbCAmIHVzYmNoKSAhPSB1c2JjaCkKKwkJCWdvdG8gcmVzY2hlZHVsZTsKKworCQltc2xlZXAoQ0hBUkdFUl9TVEFUVVNfUE9MTCk7CisJfQorCisJYWI4NTAwX2NoYXJnZXJfdXNiX2VuKCZkaS0+dXNiX2NoZywgMCwgMCwgMCk7CisKKwltdXRleF9sb2NrKCZkaS0+Y2hhcmdlcl9hdHRhY2hlZF9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZkaS0+Y2hhcmdlcl9hdHRhY2hlZF9tdXRleCk7CisKKwlyZXR1cm47CisKK3Jlc2NoZWR1bGU6CisJcXVldWVfZGVsYXllZF93b3JrKGRpLT5jaGFyZ2VyX3dxLAorCQkJICAgJmRpLT51c2JfY2hhcmdlcl9hdHRhY2hlZF93b3JrLAorCQkJICAgSFopOworfQorCitzdGF0aWMgdm9pZCBhYjg1MDBfY2hhcmdlcl9hY19hdHRhY2hlZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKworCXN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGkgPSBjb250YWluZXJfb2Yod29yaywKKwkJCQkJCSBzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIsCisJCQkJCQkgYWNfY2hhcmdlcl9hdHRhY2hlZF93b3JrLndvcmspOworCWludCBtYWluY2ggPSAoTUFJTl9DSF9TVEFUVVMyX01BSU5DSEdEUk9QIHwKKwkJICAgICAgTUFJTl9DSF9TVEFUVVMyX01BSU5DSEFSR0VSREVUREJOQyk7CisJaW50IHJldCwgaTsKKwl1OCBzdGF0dmFsOworCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCisJCQkJCQkJQUI4NTAwX0NIQVJHRVIsCisJCQkJCQkJQUI4NTAwX0NIX1NUQVRVUzJfUkVHLAorCQkJCQkJCSZzdGF0dmFsKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoZGktPmRldiwgImFiODUwMCByZWFkIGZhaWxlZCAlZFxuIiwgX19MSU5FX18pOworCQkJZ290byByZXNjaGVkdWxlOworCQl9CisKKwkJaWYgKChzdGF0dmFsICYgbWFpbmNoKSAhPSBtYWluY2gpCisJCQlnb3RvIHJlc2NoZWR1bGU7CisKKwkJbXNsZWVwKENIQVJHRVJfU1RBVFVTX1BPTEwpOworCX0KKworCWFiODUwMF9jaGFyZ2VyX2FjX2VuKCZkaS0+YWNfY2hnLCAwLCAwLCAwKTsKKwlxdWV1ZV93b3JrKGRpLT5jaGFyZ2VyX3dxLCAmZGktPmFjX3dvcmspOworCisJbXV0ZXhfbG9jaygmZGktPmNoYXJnZXJfYXR0YWNoZWRfbXV0ZXgpOworCW11dGV4X3VubG9jaygmZGktPmNoYXJnZXJfYXR0YWNoZWRfbXV0ZXgpOworCisJcmV0dXJuOworCityZXNjaGVkdWxlOgorCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Y2hhcmdlcl93cSwKKwkJCSAgICZkaS0+YWNfY2hhcmdlcl9hdHRhY2hlZF93b3JrLAorCQkJICAgSFopOworfQorCisvKioKKyAqIGFiODUwMF9jaGFyZ2VyX2RldGVjdF91c2JfdHlwZV93b3JrKCkgLSB3b3JrIHRvIGRldGVjdCBVU0IgdHlwZQorICogQHdvcms6CVBvaW50ZXIgdG8gdGhlIHdvcmtfc3RydWN0IHN0cnVjdHVyZQorICoKKyAqIERldGVjdCB0aGUgdHlwZSBvZiBVU0IgcGx1Z2dlZAorICovCitzdGF0aWMgdm9pZCBhYjg1MDBfY2hhcmdlcl9kZXRlY3RfdXNiX3R5cGVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJaW50IHJldDsKKworCXN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGkgPSBjb250YWluZXJfb2Yod29yaywKKwkJc3RydWN0IGFiODUwMF9jaGFyZ2VyLCBkZXRlY3RfdXNiX3R5cGVfd29yayk7CisKKwkvKgorCSAqIFNpbmNlIHdlIGNhbid0IGJlIHN1cmUgdGhhdCB0aGUgZXZlbnRzIGFyZSByZWNlaXZlZAorCSAqIHN5bmNocm9ub3VzbHksIHdlIGhhdmUgdGhlIGNoZWNrIGlmIGlzCisJICogY29ubmVjdGVkIGJ5IHJlYWRpbmcgdGhlIHN0YXR1cyByZWdpc3RlcgorCSAqLworCXJldCA9IGFiODUwMF9jaGFyZ2VyX2RldGVjdF9jaGFyZ2VycyhkaSwgZmFsc2UpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm47CisKKwlpZiAoIShyZXQgJiBVU0JfUFdfQ09OTikpIHsKKwkJZGV2X2RiZyhkaS0+ZGV2LCAiJXMgZGktPnZidXNfZGV0ZWN0ZWQgPSBmYWxzZVxuIiwgX19mdW5jX18pOworCQlkaS0+dmJ1c19kZXRlY3RlZCA9IGZhbHNlOworCQlhYjg1MDBfY2hhcmdlcl9zZXRfdXNiX2Nvbm5lY3RlZChkaSwgZmFsc2UpOworCQlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksIGRpLT51c2JfY2hnLnBzeSk7CisJfSBlbHNlIHsKKwkJZGV2X2RiZyhkaS0+ZGV2LCAiJXMgZGktPnZidXNfZGV0ZWN0ZWQgPSB0cnVlXG4iLCBfX2Z1bmNfXyk7CisJCWRpLT52YnVzX2RldGVjdGVkID0gdHJ1ZTsKKworCQlpZiAoaXNfYWI4NTAwXzFwMV9vcl9lYXJsaWVyKGRpLT5wYXJlbnQpKSB7CisJCQlyZXQgPSBhYjg1MDBfY2hhcmdlcl9kZXRlY3RfdXNiX3R5cGUoZGkpOworCQkJaWYgKCFyZXQpIHsKKwkJCQlhYjg1MDBfY2hhcmdlcl9zZXRfdXNiX2Nvbm5lY3RlZChkaSwgdHJ1ZSk7CisJCQkJYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLAorCQkJCQkJCSAgICBkaS0+dXNiX2NoZy5wc3kpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIEZvciBBQkIgY3V0Mi4wIGFuZCBvbndhcmRzIHdlIGhhdmUgYW4gSVJRLAorCQkJICogVVNCX0xJTktfU1RBVFVTIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgVVNCCisJCQkgKiBsaW5rIHN0YXR1cyBjaGFuZ2VzLiBUaGUgZXhjZXB0aW9uIGlzIFVTQiBjb25uZWN0ZWQKKwkJCSAqIGR1cmluZyBzdGFydHVwLiBUaGVuIHdlIGRvbid0IGdldCBhCisJCQkgKiBVU0JfTElOS19TVEFUVVMgSVJRCisJCQkgKi8KKwkJCWlmIChkaS0+dmJ1c19kZXRlY3RlZF9zdGFydCkgeworCQkJCWRpLT52YnVzX2RldGVjdGVkX3N0YXJ0ID0gZmFsc2U7CisJCQkJcmV0ID0gYWI4NTAwX2NoYXJnZXJfZGV0ZWN0X3VzYl90eXBlKGRpKTsKKwkJCQlpZiAoIXJldCkgeworCQkJCQlhYjg1MDBfY2hhcmdlcl9zZXRfdXNiX2Nvbm5lY3RlZChkaSwKKwkJCQkJCXRydWUpOworCQkJCQlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksCisJCQkJCQlkaS0+dXNiX2NoZy5wc3kpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworLyoqCisgKiBhYjg1MDBfY2hhcmdlcl91c2JfbGlua19hdHRhY2hfd29yaygpIC0gd29yayB0byBkZXRlY3QgVVNCIHR5cGUKKyAqIEB3b3JrOglwb2ludGVyIHRvIHRoZSB3b3JrX3N0cnVjdCBzdHJ1Y3R1cmUKKyAqCisgKiBEZXRlY3QgdGhlIHR5cGUgb2YgVVNCIHBsdWdnZWQKKyAqLworc3RhdGljIHZvaWQgYWI4NTAwX2NoYXJnZXJfdXNiX2xpbmtfYXR0YWNoX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGkgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGFiODUwMF9jaGFyZ2VyLCBhdHRhY2hfd29yay53b3JrKTsKKwlpbnQgcmV0OworCisJLyogVXBkYXRlIG1heGltdW0gaW5wdXQgY3VycmVudCBpZiBVU0IgZW51bWVyYXRpb24gaXMgbm90IGRldGVjdGVkICovCisJaWYgKCFkaS0+dXNiLmNoYXJnZXJfb25saW5lKSB7CisJCXJldCA9IGFiODUwMF9jaGFyZ2VyX3NldF92YnVzX2luX2N1cnIoZGksCisJCQkJCWRpLT5tYXhfdXNiX2luX2N1cnIudXNiX3R5cGVfbWF4KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybjsKKwl9CisKKwlhYjg1MDBfY2hhcmdlcl9zZXRfdXNiX2Nvbm5lY3RlZChkaSwgdHJ1ZSk7CisJYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLCBkaS0+dXNiX2NoZy5wc3kpOworfQorCisvKioKKyAqIGFiODUwMF9jaGFyZ2VyX3VzYl9saW5rX3N0YXR1c193b3JrKCkgLSB3b3JrIHRvIGRldGVjdCBVU0IgdHlwZQorICogQHdvcms6CXBvaW50ZXIgdG8gdGhlIHdvcmtfc3RydWN0IHN0cnVjdHVyZQorICoKKyAqIERldGVjdCB0aGUgdHlwZSBvZiBVU0IgcGx1Z2dlZAorICovCitzdGF0aWMgdm9pZCBhYjg1MDBfY2hhcmdlcl91c2JfbGlua19zdGF0dXNfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJaW50IGRldGVjdGVkX2NoYXJnZXJzOworCWludCByZXQ7CisJdTggdmFsOworCXU4IGxpbmtfc3RhdHVzOworCisJc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIsIHVzYl9saW5rX3N0YXR1c193b3JrKTsKKworCS8qCisJICogU2luY2Ugd2UgY2FuJ3QgYmUgc3VyZSB0aGF0IHRoZSBldmVudHMgYXJlIHJlY2VpdmVkCisJICogc3luY2hyb25vdXNseSwgd2UgaGF2ZSB0aGUgY2hlY2sgaWYgIGlzCisJICogY29ubmVjdGVkIGJ5IHJlYWRpbmcgdGhlIHN0YXR1cyByZWdpc3RlcgorCSAqLworCWRldGVjdGVkX2NoYXJnZXJzID0gYWI4NTAwX2NoYXJnZXJfZGV0ZWN0X2NoYXJnZXJzKGRpLCBmYWxzZSk7CisJaWYgKGRldGVjdGVkX2NoYXJnZXJzIDwgMCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBTb21lIGNoYXJnZXJzIHRoYXQgYnJlYWtzIHRoZSBVU0Igc3BlYyBpcworCSAqIGlkZW50aWZpZWQgYXMgaW52YWxpZCBieSBBQjg1MDAgYW5kIGl0IHJlZnVzZQorCSAqIHRvIHN0YXJ0IHRoZSBjaGFyZ2luZyBwcm9jZXNzLiBidXQgYnkganVtcGluZworCSAqIHRocnUgYSBmZXcgaG9vcHMgaXQgY2FuIGJlIGZvcmNlZCB0byBzdGFydC4KKwkgKi8KKwlpZiAoaXNfYWI4NTAwKGRpLT5wYXJlbnQpKQorCQlyZXQgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX1VTQiwKKwkJCQkJQUI4NTAwX1VTQl9MSU5FX1NUQVRfUkVHLCAmdmFsKTsKKwllbHNlCisJCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfVVNCLAorCQkJCQlBQjg1MDBfVVNCX0xJTksxX1NUQVRfUkVHLCAmdmFsKTsKKworCWlmIChyZXQgPj0gMCkKKwkJZGV2X2RiZyhkaS0+ZGV2LCAiVXNiTGluZVN0YXR1cyByZWdpc3RlciA9IDB4JTAyeFxuIiwgdmFsKTsKKwllbHNlCisJCWRldl9kYmcoZGktPmRldiwgIkVycm9yIHJlYWRpbmcgVVNCIGxpbmsgc3RhdHVzXG4iKTsKKworCWlmIChpc19hYjg1MDAoZGktPnBhcmVudCkpCisJCWxpbmtfc3RhdHVzID0gQUI4NTAwX1VTQl9MSU5LX1NUQVRVUzsKKwllbHNlCisJCWxpbmtfc3RhdHVzID0gQUI4NTA1X1VTQl9MSU5LX1NUQVRVUzsKKworCWlmIChkZXRlY3RlZF9jaGFyZ2VycyAmIFVTQl9QV19DT05OKSB7CisJCWlmICgoKHZhbCAmIGxpbmtfc3RhdHVzKSA+PiBVU0JfTElOS19TVEFUVVNfU0hJRlQpID09CisJCQkJVVNCX1NUQVRfTk9UX1ZBTElEX0xJTksgJiYKKwkJCQlkaS0+aW52YWxpZF9jaGFyZ2VyX2RldGVjdF9zdGF0ZSA9PSAwKSB7CisJCQlkZXZfZGJnKGRpLT5kZXYsCisJCQkJCSJJbnZhbGlkIGNoYXJnZXIgZGV0ZWN0ZWQsIHN0YXRlPSAwXG4iKTsKKwkJCS8qRW5hYmxlIGNoYXJnZXIqLworCQkJYWJ4NTAwX21hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCisJCQkJCUFCODUwMF9DSEFSR0VSLCBBQjg1MDBfVVNCQ0hfQ1RSTDFfUkVHLAorCQkJCQlVU0JfQ0hfRU5BLCBVU0JfQ0hfRU5BKTsKKwkJCS8qRW5hYmxlIGNoYXJnZXIgZGV0ZWN0aW9uKi8KKwkJCWFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAorCQkJCQlBQjg1MDBfVVNCLCBBQjg1MDBfVVNCX0xJTkVfQ1RSTDJfUkVHLAorCQkJCQlVU0JfQ0hfREVULCBVU0JfQ0hfREVUKTsKKwkJCWRpLT5pbnZhbGlkX2NoYXJnZXJfZGV0ZWN0X3N0YXRlID0gMTsKKwkJCS8qZXhpdCBhbmQgd2FpdCBmb3IgbmV3IGxpbmsgc3RhdHVzIGludGVycnVwdC4qLworCQkJcmV0dXJuOworCisJCX0KKwkJaWYgKGRpLT5pbnZhbGlkX2NoYXJnZXJfZGV0ZWN0X3N0YXRlID09IDEpIHsKKwkJCWRldl9kYmcoZGktPmRldiwKKwkJCQkJIkludmFsaWQgY2hhcmdlciBkZXRlY3RlZCwgc3RhdGU9IDFcbiIpOworCQkJLypTdG9wIGNoYXJnZXIgZGV0ZWN0aW9uKi8KKwkJCWFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAorCQkJCQlBQjg1MDBfVVNCLCBBQjg1MDBfVVNCX0xJTkVfQ1RSTDJfUkVHLAorCQkJCQlVU0JfQ0hfREVULCAweDAwKTsKKwkJCS8qQ2hlY2sgbGluayBzdGF0dXMqLworCQkJaWYgKGlzX2FiODUwMChkaS0+cGFyZW50KSkKKwkJCQlyZXQgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKKwkJCQkJQUI4NTAwX1VTQiwgQUI4NTAwX1VTQl9MSU5FX1NUQVRfUkVHLAorCQkJCQkmdmFsKTsKKwkJCWVsc2UKKwkJCQlyZXQgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKKwkJCQkJQUI4NTAwX1VTQiwgQUI4NTAwX1VTQl9MSU5LMV9TVEFUX1JFRywKKwkJCQkJJnZhbCk7CisKKwkJCWRldl9kYmcoZGktPmRldiwgIlVTQiBsaW5rIHN0YXR1cz0gMHglMDJ4XG4iLAorCQkJCSh2YWwgJiBsaW5rX3N0YXR1cykgPj4gVVNCX0xJTktfU1RBVFVTX1NISUZUKTsKKwkJCWRpLT5pbnZhbGlkX2NoYXJnZXJfZGV0ZWN0X3N0YXRlID0gMjsKKwkJfQorCX0gZWxzZSB7CisJCWRpLT5pbnZhbGlkX2NoYXJnZXJfZGV0ZWN0X3N0YXRlID0gMDsKKwl9CisKKwlpZiAoIShkZXRlY3RlZF9jaGFyZ2VycyAmIFVTQl9QV19DT05OKSkgeworCQlkaS0+dmJ1c19kZXRlY3RlZCA9IGZhbHNlOworCQlhYjg1MDBfY2hhcmdlcl9zZXRfdXNiX2Nvbm5lY3RlZChkaSwgZmFsc2UpOworCQlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksIGRpLT51c2JfY2hnLnBzeSk7CisJCXJldHVybjsKKwl9CisKKwlkZXZfZGJnKGRpLT5kZXYsIiVzIGRpLT52YnVzX2RldGVjdGVkID0gdHJ1ZVxuIixfX2Z1bmNfXyk7CisJZGktPnZidXNfZGV0ZWN0ZWQgPSB0cnVlOworCXJldCA9IGFiODUwMF9jaGFyZ2VyX3JlYWRfdXNiX3R5cGUoZGkpOworCWlmIChyZXQpIHsKKwkJaWYgKHJldCA9PSAtRU5YSU8pIHsKKwkJCS8qIE5vIHZhbGlkIGNoYXJnZXIgdHlwZSBkZXRlY3RlZCAqLworCQkJYWI4NTAwX2NoYXJnZXJfc2V0X3VzYl9jb25uZWN0ZWQoZGksIGZhbHNlKTsKKwkJCWFiODUwMF9wb3dlcl9zdXBwbHlfY2hhbmdlZChkaSwgZGktPnVzYl9jaGcucHN5KTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJaWYgKGRpLT51c2JfZGV2aWNlX2lzX3VucmVjb2duaXNlZCkgeworCQlkZXZfZGJnKGRpLT5kZXYsCisJCQkiUG90ZW50aWFsIExlZ2FjeSBDaGFyZ2VyIGRldmljZS4gIgorCQkJIkRlbGF5IHdvcmsgZm9yICVkIG1zZWMgZm9yIFVTQiBlbnVtICIKKwkJCSJ0byBmaW5pc2giLAorCQkJV0FJVF9BQ0FfUklEX0VOVU1FUkFUSU9OKTsKKwkJcXVldWVfZGVsYXllZF93b3JrKGRpLT5jaGFyZ2VyX3dxLAorCQkJCSAgICZkaS0+YXR0YWNoX3dvcmssCisJCQkJICAgbXNlY3NfdG9famlmZmllcyhXQUlUX0FDQV9SSURfRU5VTUVSQVRJT04pKTsKKwl9IGVsc2UgaWYgKGRpLT5pc19hY2FfcmlkID09IDEpIHsKKwkJLyogT25seSB3YWl0IG9uY2UgKi8KKwkJZGktPmlzX2FjYV9yaWQrKzsKKwkJZGV2X2RiZyhkaS0+ZGV2LAorCQkJIiVzIFdhaXQgJWQgbXNlYyBmb3IgVVNCIGVudW0gdG8gZmluaXNoIiwKKwkJCV9fZnVuY19fLCBXQUlUX0FDQV9SSURfRU5VTUVSQVRJT04pOworCQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmNoYXJnZXJfd3EsCisJCQkJICAgJmRpLT5hdHRhY2hfd29yaywKKwkJCQkgICBtc2Vjc190b19qaWZmaWVzKFdBSVRfQUNBX1JJRF9FTlVNRVJBVElPTikpOworCX0gZWxzZSB7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Y2hhcmdlcl93cSwKKwkJCQkgICAmZGktPmF0dGFjaF93b3JrLAorCQkJCSAgIDApOworCX0KK30KKworc3RhdGljIHZvaWQgYWI4NTAwX2NoYXJnZXJfdXNiX3N0YXRlX2NoYW5nZWRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIsIHVzYl9zdGF0ZV9jaGFuZ2VkX3dvcmsud29yayk7CisKKwlpZiAoIWRpLT52YnVzX2RldGVjdGVkKQl7CisJCWRldl9kYmcoZGktPmRldiwKKwkJCSIlcyAhZGktPnZidXNfZGV0ZWN0ZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGktPnVzYl9zdGF0ZS51c2JfbG9jaywgZmxhZ3MpOworCWRpLT51c2Jfc3RhdGUuc3RhdGUgPSBkaS0+dXNiX3N0YXRlLnN0YXRlX3RtcDsKKwlkaS0+dXNiX3N0YXRlLnVzYl9jdXJyZW50ID0gZGktPnVzYl9zdGF0ZS51c2JfY3VycmVudF90bXA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGktPnVzYl9zdGF0ZS51c2JfbG9jaywgZmxhZ3MpOworCisJZGV2X2RiZyhkaS0+ZGV2LCAiJXMgVVNCIHN0YXRlOiAweCUwMnggbUE6ICVkXG4iLAorCQlfX2Z1bmNfXywgZGktPnVzYl9zdGF0ZS5zdGF0ZSwgZGktPnVzYl9zdGF0ZS51c2JfY3VycmVudCk7CisKKwlzd2l0Y2ggKGRpLT51c2Jfc3RhdGUuc3RhdGUpIHsKKwljYXNlIEFCODUwMF9CTV9VU0JfU1RBVEVfUkVTRVRfSFM6CisJY2FzZSBBQjg1MDBfQk1fVVNCX1NUQVRFX1JFU0VUX0ZTOgorCWNhc2UgQUI4NTAwX0JNX1VTQl9TVEFURV9TVVNQRU5EOgorCWNhc2UgQUI4NTAwX0JNX1VTQl9TVEFURV9NQVg6CisJCWFiODUwMF9jaGFyZ2VyX3NldF91c2JfY29ubmVjdGVkKGRpLCBmYWxzZSk7CisJCWFiODUwMF9wb3dlcl9zdXBwbHlfY2hhbmdlZChkaSwgZGktPnVzYl9jaGcucHN5KTsKKwkJYnJlYWs7CisKKwljYXNlIEFCODUwMF9CTV9VU0JfU1RBVEVfUkVTVU1FOgorCQkvKgorCQkgKiB3aGVuIHN1c3BlbmQtPnJlc3VtZSB0aGVyZSBzaG91bGQgYmUgZGVsYXkKKwkJICogb2YgMXNlYyBmb3IgZW5hYmxpbmcgY2hhcmdpbmcKKwkJICovCisJCW1zbGVlcCgxMDAwKTsKKwkJLyogSW50ZW50aW9uYWwgZmFsbCB0aHJvdWdoICovCisJY2FzZSBBQjg1MDBfQk1fVVNCX1NUQVRFX0NPTkZJR1VSRUQ6CisJCS8qCisJCSAqIFVTQiBpcyBjb25maWd1cmVkLCBlbmFibGUgY2hhcmdpbmcgd2l0aCB0aGUgY2hhcmdpbmcKKwkJICogaW5wdXQgY3VycmVudCBvYnRhaW5lZCBmcm9tIFVTQiBkcml2ZXIKKwkJICovCisJCWlmICghYWI4NTAwX2NoYXJnZXJfZ2V0X3VzYl9jdXIoZGkpKSB7CisJCQkvKiBVcGRhdGUgbWF4aW11bSBpbnB1dCBjdXJyZW50ICovCisJCQlyZXQgPSBhYjg1MDBfY2hhcmdlcl9zZXRfdmJ1c19pbl9jdXJyKGRpLAorCQkJCQlkaS0+bWF4X3VzYl9pbl9jdXJyLnVzYl90eXBlX21heCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybjsKKworCQkJYWI4NTAwX2NoYXJnZXJfc2V0X3VzYl9jb25uZWN0ZWQoZGksIHRydWUpOworCQkJYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLCBkaS0+dXNiX2NoZy5wc3kpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfTsKK30KKworLyoqCisgKiBhYjg1MDBfY2hhcmdlcl9jaGVja191c2JjaGFyZ2Vybm90b2tfd29yaygpIC0gY2hlY2sgVVNCIGNoZyBub3Qgb2sgc3RhdHVzCisgKiBAd29yazoJcG9pbnRlciB0byB0aGUgd29ya19zdHJ1Y3Qgc3RydWN0dXJlCisgKgorICogV29yayBxdWV1ZSBmdW5jdGlvbiBmb3IgY2hlY2tpbmcgdGhlIFVTQiBjaGFyZ2VyIE5vdCBPSyBzdGF0dXMKKyAqLworc3RhdGljIHZvaWQgYWI4NTAwX2NoYXJnZXJfY2hlY2tfdXNiY2hhcmdlcm5vdG9rX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWludCByZXQ7CisJdTggcmVnX3ZhbHVlOworCWJvb2wgcHJldl9zdGF0dXM7CisKKwlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpID0gY29udGFpbmVyX29mKHdvcmssCisJCXN0cnVjdCBhYjg1MDBfY2hhcmdlciwgY2hlY2tfdXNiY2hnbm90b2tfd29yay53b3JrKTsKKworCS8qIENoZWNrIGlmIHRoZSBzdGF0dXMgYml0IGZvciB1c2JjaGFyZ2Vybm90b2sgaXMgc3RpbGwgYWN0aXZlICovCisJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCisJCUFCODUwMF9DSEFSR0VSLCBBQjg1MDBfQ0hfVVNCQ0hfU1RBVDJfUkVHLCAmcmVnX3ZhbHVlKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRpLT5kZXYsICIlcyBhYjg1MDAgcmVhZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlwcmV2X3N0YXR1cyA9IGRpLT5mbGFncy51c2JjaGFyZ2Vybm90b2s7CisKKwlpZiAocmVnX3ZhbHVlICYgVkJVU19DSF9OT0spIHsKKwkJZGktPmZsYWdzLnVzYmNoYXJnZXJub3RvayA9IHRydWU7CisJCS8qIENoZWNrIGFnYWluIGluIDFzZWMgKi8KKwkJcXVldWVfZGVsYXllZF93b3JrKGRpLT5jaGFyZ2VyX3dxLAorCQkJJmRpLT5jaGVja191c2JjaGdub3Rva193b3JrLCBIWik7CisJfSBlbHNlIHsKKwkJZGktPmZsYWdzLnVzYmNoYXJnZXJub3RvayA9IGZhbHNlOworCQlkaS0+ZmxhZ3MudmJ1c19jb2xsYXBzZSA9IGZhbHNlOworCX0KKworCWlmIChwcmV2X3N0YXR1cyAhPSBkaS0+ZmxhZ3MudXNiY2hhcmdlcm5vdG9rKQorCQlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksIGRpLT51c2JfY2hnLnBzeSk7Cit9CisKKy8qKgorICogYWI4NTAwX2NoYXJnZXJfY2hlY2tfbWFpbl90aGVybWFsX3Byb3Rfd29yaygpIC0gY2hlY2sgbWFpbiB0aGVybWFsIHN0YXR1cworICogQHdvcms6CXBvaW50ZXIgdG8gdGhlIHdvcmtfc3RydWN0IHN0cnVjdHVyZQorICoKKyAqIFdvcmsgcXVldWUgZnVuY3Rpb24gZm9yIGNoZWNraW5nIHRoZSBNYWluIHRoZXJtYWwgcHJvdCBzdGF0dXMKKyAqLworc3RhdGljIHZvaWQgYWI4NTAwX2NoYXJnZXJfY2hlY2tfbWFpbl90aGVybWFsX3Byb3Rfd29yaygKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJaW50IHJldDsKKwl1OCByZWdfdmFsdWU7CisKKwlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpID0gY29udGFpbmVyX29mKHdvcmssCisJCXN0cnVjdCBhYjg1MDBfY2hhcmdlciwgY2hlY2tfbWFpbl90aGVybWFsX3Byb3Rfd29yayk7CisKKwkvKiBDaGVjayBpZiB0aGUgc3RhdHVzIGJpdCBmb3IgbWFpbl90aGVybWFsX3Byb3QgaXMgc3RpbGwgYWN0aXZlICovCisJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCisJCUFCODUwMF9DSEFSR0VSLCBBQjg1MDBfQ0hfU1RBVFVTMl9SRUcsICZyZWdfdmFsdWUpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGktPmRldiwgIiVzIGFiODUwMCByZWFkIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCWlmIChyZWdfdmFsdWUgJiBNQUlOX0NIX1RIX1BST1QpCisJCWRpLT5mbGFncy5tYWluX3RoZXJtYWxfcHJvdCA9IHRydWU7CisJZWxzZQorCQlkaS0+ZmxhZ3MubWFpbl90aGVybWFsX3Byb3QgPSBmYWxzZTsKKworCWFiODUwMF9wb3dlcl9zdXBwbHlfY2hhbmdlZChkaSwgZGktPmFjX2NoZy5wc3kpOworfQorCisvKioKKyAqIGFiODUwMF9jaGFyZ2VyX2NoZWNrX3VzYl90aGVybWFsX3Byb3Rfd29yaygpIC0gY2hlY2sgdXNiIHRoZXJtYWwgc3RhdHVzCisgKiBAd29yazoJcG9pbnRlciB0byB0aGUgd29ya19zdHJ1Y3Qgc3RydWN0dXJlCisgKgorICogV29yayBxdWV1ZSBmdW5jdGlvbiBmb3IgY2hlY2tpbmcgdGhlIFVTQiB0aGVybWFsIHByb3Qgc3RhdHVzCisgKi8KK3N0YXRpYyB2b2lkIGFiODUwMF9jaGFyZ2VyX2NoZWNrX3VzYl90aGVybWFsX3Byb3Rfd29yaygKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJaW50IHJldDsKKwl1OCByZWdfdmFsdWU7CisKKwlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpID0gY29udGFpbmVyX29mKHdvcmssCisJCXN0cnVjdCBhYjg1MDBfY2hhcmdlciwgY2hlY2tfdXNiX3RoZXJtYWxfcHJvdF93b3JrKTsKKworCS8qIENoZWNrIGlmIHRoZSBzdGF0dXMgYml0IGZvciB1c2JfdGhlcm1hbF9wcm90IGlzIHN0aWxsIGFjdGl2ZSAqLworCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAorCQlBQjg1MDBfQ0hBUkdFUiwgQUI4NTAwX0NIX1VTQkNIX1NUQVQyX1JFRywgJnJlZ192YWx1ZSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkaS0+ZGV2LCAiJXMgYWI4NTAwIHJlYWQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisJaWYgKHJlZ192YWx1ZSAmIFVTQl9DSF9USF9QUk9UKQorCQlkaS0+ZmxhZ3MudXNiX3RoZXJtYWxfcHJvdCA9IHRydWU7CisJZWxzZQorCQlkaS0+ZmxhZ3MudXNiX3RoZXJtYWxfcHJvdCA9IGZhbHNlOworCisJYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLCBkaS0+dXNiX2NoZy5wc3kpOworfQorCisvKioKKyAqIGFiODUwMF9jaGFyZ2VyX21haW5jaHVucGx1Z2RldF9oYW5kbGVyKCkgLSBtYWluIGNoYXJnZXIgdW5wbHVnZ2VkCisgKiBAaXJxOiAgICAgICBpbnRlcnJ1cHQgbnVtYmVyCisgKiBAX2RpOiAgICAgICBwb2ludGVyIHRvIHRoZSBhYjg1MDBfY2hhcmdlciBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIElSUSBzdGF0dXMoSVJRX0hBTkRMRUQpCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBhYjg1MDBfY2hhcmdlcl9tYWluY2h1bnBsdWdkZXRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpfZGkpCit7CisJc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IF9kaTsKKworCWRldl9kYmcoZGktPmRldiwgIk1haW4gY2hhcmdlciB1bnBsdWdnZWRcbiIpOworCXF1ZXVlX3dvcmsoZGktPmNoYXJnZXJfd3EsICZkaS0+YWNfd29yayk7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmRpLT5hY19jaGFyZ2VyX2F0dGFjaGVkX3dvcmspOworCW11dGV4X2xvY2soJmRpLT5jaGFyZ2VyX2F0dGFjaGVkX211dGV4KTsKKwltdXRleF91bmxvY2soJmRpLT5jaGFyZ2VyX2F0dGFjaGVkX211dGV4KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBhYjg1MDBfY2hhcmdlcl9tYWluY2hwbHVnZGV0X2hhbmRsZXIoKSAtIG1haW4gY2hhcmdlciBwbHVnZ2VkCisgKiBAaXJxOiAgICAgICBpbnRlcnJ1cHQgbnVtYmVyCisgKiBAX2RpOiAgICAgICBwb2ludGVyIHRvIHRoZSBhYjg1MDBfY2hhcmdlciBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIElSUSBzdGF0dXMoSVJRX0hBTkRMRUQpCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBhYjg1MDBfY2hhcmdlcl9tYWluY2hwbHVnZGV0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqX2RpKQoreworCXN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGkgPSBfZGk7CisKKwlkZXZfZGJnKGRpLT5kZXYsICJNYWluIGNoYXJnZXIgcGx1Z2dlZFxuIik7CisJcXVldWVfd29yayhkaS0+Y2hhcmdlcl93cSwgJmRpLT5hY193b3JrKTsKKworCW11dGV4X2xvY2soJmRpLT5jaGFyZ2VyX2F0dGFjaGVkX211dGV4KTsKKwltdXRleF91bmxvY2soJmRpLT5jaGFyZ2VyX2F0dGFjaGVkX211dGV4KTsKKworCWlmIChpc19hYjg1MDAoZGktPnBhcmVudCkpCisJCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Y2hhcmdlcl93cSwKKwkJCSAgICZkaS0+YWNfY2hhcmdlcl9hdHRhY2hlZF93b3JrLAorCQkJICAgSFopOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBhYjg1MDBfY2hhcmdlcl9tYWluZXh0Y2hub3Rva19oYW5kbGVyKCkgLSBtYWluIGNoYXJnZXIgbm90IG9rCisgKiBAaXJxOiAgICAgICBpbnRlcnJ1cHQgbnVtYmVyCisgKiBAX2RpOiAgICAgICBwb2ludGVyIHRvIHRoZSBhYjg1MDBfY2hhcmdlciBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIElSUSBzdGF0dXMoSVJRX0hBTkRMRUQpCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBhYjg1MDBfY2hhcmdlcl9tYWluZXh0Y2hub3Rva19oYW5kbGVyKGludCBpcnEsIHZvaWQgKl9kaSkKK3sKKwlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpID0gX2RpOworCisJZGV2X2RiZyhkaS0+ZGV2LCAiTWFpbiBjaGFyZ2VyIG5vdCBva1xuIik7CisJZGktPmZsYWdzLm1haW5leHRjaG5vdG9rID0gdHJ1ZTsKKwlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksIGRpLT5hY19jaGcucHN5KTsKKworCS8qIFNjaGVkdWxlIGEgbmV3IEhXIGZhaWx1cmUgY2hlY2sgKi8KKwlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmNoYXJnZXJfd3EsICZkaS0+Y2hlY2tfaHdfZmFpbHVyZV93b3JrLCAwKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBhYjg1MDBfY2hhcmdlcl9tYWluY2h0aHByb3RyX2hhbmRsZXIoKSAtIERpZSB0ZW1wIGlzIGFib3ZlIG1haW4gY2hhcmdlcgorICogdGhlcm1hbCBwcm90ZWN0aW9uIHRocmVzaG9sZAorICogQGlycTogICAgICAgaW50ZXJydXB0IG51bWJlcgorICogQF9kaTogICAgICAgcG9pbnRlciB0byB0aGUgYWI4NTAwX2NoYXJnZXIgc3RydWN0dXJlCisgKgorICogUmV0dXJucyBJUlEgc3RhdHVzKElSUV9IQU5ETEVEKQorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYWI4NTAwX2NoYXJnZXJfbWFpbmNodGhwcm90cl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKl9kaSkKK3sKKwlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpID0gX2RpOworCisJZGV2X2RiZyhkaS0+ZGV2LAorCQkiRGllIHRlbXAgYWJvdmUgTWFpbiBjaGFyZ2VyIHRoZXJtYWwgcHJvdGVjdGlvbiB0aHJlc2hvbGRcbiIpOworCXF1ZXVlX3dvcmsoZGktPmNoYXJnZXJfd3EsICZkaS0+Y2hlY2tfbWFpbl90aGVybWFsX3Byb3Rfd29yayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKgorICogYWI4NTAwX2NoYXJnZXJfbWFpbmNodGhwcm90Zl9oYW5kbGVyKCkgLSBEaWUgdGVtcCBpcyBiZWxvdyBtYWluIGNoYXJnZXIKKyAqIHRoZXJtYWwgcHJvdGVjdGlvbiB0aHJlc2hvbGQKKyAqIEBpcnE6ICAgICAgIGludGVycnVwdCBudW1iZXIKKyAqIEBfZGk6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGFiODUwMF9jaGFyZ2VyIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgSVJRIHN0YXR1cyhJUlFfSEFORExFRCkKKyAqLworc3RhdGljIGlycXJldHVybl90IGFiODUwMF9jaGFyZ2VyX21haW5jaHRocHJvdGZfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpfZGkpCit7CisJc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IF9kaTsKKworCWRldl9kYmcoZGktPmRldiwKKwkJIkRpZSB0ZW1wIG9rIGZvciBNYWluIGNoYXJnZXIgdGhlcm1hbCBwcm90ZWN0aW9uIHRocmVzaG9sZFxuIik7CisJcXVldWVfd29yayhkaS0+Y2hhcmdlcl93cSwgJmRpLT5jaGVja19tYWluX3RoZXJtYWxfcHJvdF93b3JrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgYWI4NTAwX2NoYXJnZXJfdmJ1c19kcm9wX2VuZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpID0gY29udGFpbmVyX29mKHdvcmssCisJCXN0cnVjdCBhYjg1MDBfY2hhcmdlciwgdmJ1c19kcm9wX2VuZF93b3JrLndvcmspOworCWludCByZXQsIGN1cnI7CisJdTggcmVnX3ZhbHVlOworCisJZGktPmZsYWdzLnZidXNfZHJvcF9lbmQgPSBmYWxzZTsKKworCS8qIFJlc2V0IHRoZSBkcm9wIGNvdW50ZXIgKi8KKwlhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKKwkJCQkgIEFCODUwMF9DSEFSR0VSLCBBQjg1MDBfQ0hBUkdFUl9DVFJMLCAweDAxKTsKKworCWlmIChpc19hYjg1NDAoZGktPnBhcmVudCkpCisJCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfQ0hBUkdFUiwKKwkJCQlBQjg1NDBfQ0hfVVNCQ0hfU1RBVDNfUkVHLCAmcmVnX3ZhbHVlKTsKKwllbHNlCisJCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfQ0hBUkdFUiwKKwkJCQlBQjg1MDBfQ0hfVVNCQ0hfU1RBVDJfUkVHLCAmcmVnX3ZhbHVlKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRpLT5kZXYsICIlcyByZWFkIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJaWYgKGlzX2FiODU0MChkaS0+cGFyZW50KSkKKwkJY3VyciA9IGRpLT5ibS0+Y2hnX2lucHV0X2N1cnJbCisJCQlyZWdfdmFsdWUgJiBBQjg1NDBfQVVUT19WQlVTX0lOX0NVUlJfTUFTS107CisJZWxzZQorCQljdXJyID0gZGktPmJtLT5jaGdfaW5wdXRfY3VyclsKKwkJCXJlZ192YWx1ZSA+PiBBVVRPX1ZCVVNfSU5fQ1VSUl9MSU1fU0hJRlRdOworCisJaWYgKGRpLT5tYXhfdXNiX2luX2N1cnIuY2FsY3VsYXRlZF9tYXggIT0gY3VycikgeworCQkvKiBVU0Igc291cmNlIGlzIGNvbGxhcHNpbmcgKi8KKwkJZGktPm1heF91c2JfaW5fY3Vyci5jYWxjdWxhdGVkX21heCA9IGN1cnI7CisJCWRldl9kYmcoZGktPmRldiwKKwkJCSAiVkJVUyBpbnB1dCBjdXJyZW50IGxpbWl0aW5nIHRvICVkIG1BXG4iLAorCQkJIGRpLT5tYXhfdXNiX2luX2N1cnIuY2FsY3VsYXRlZF9tYXgpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFVTQiBzb3VyY2UgY2FuIG5vdCBnaXZlIG1vcmUgdGhhbiB0aGlzIGFtb3VudC4KKwkJICogVGFraW5nIG1vcmUgd2lsbCBjb2xsYXBzZSB0aGUgc291cmNlLgorCQkgKi8KKwkJZGktPm1heF91c2JfaW5fY3Vyci5zZXRfbWF4ID0KKwkJCWRpLT5tYXhfdXNiX2luX2N1cnIuY2FsY3VsYXRlZF9tYXg7CisJCWRldl9kYmcoZGktPmRldiwKKwkJCSAiVkJVUyBpbnB1dCBjdXJyZW50IGxpbWl0ZWQgdG8gJWQgbUFcbiIsCisJCQkgZGktPm1heF91c2JfaW5fY3Vyci5zZXRfbWF4KTsKKwl9CisKKwlpZiAoZGktPnVzYi5jaGFyZ2VyX2Nvbm5lY3RlZCkKKwkJYWI4NTAwX2NoYXJnZXJfc2V0X3ZidXNfaW5fY3VycihkaSwKKwkJCQkJZGktPm1heF91c2JfaW5fY3Vyci51c2JfdHlwZV9tYXgpOworfQorCisvKioKKyAqIGFiODUwMF9jaGFyZ2VyX3ZidXNkZXRmX2hhbmRsZXIoKSAtIFZCVVMgZmFsbGluZyBkZXRlY3RlZAorICogQGlycTogICAgICAgaW50ZXJydXB0IG51bWJlcgorICogQF9kaTogICAgICAgcG9pbnRlciB0byB0aGUgYWI4NTAwX2NoYXJnZXIgc3RydWN0dXJlCisgKgorICogUmV0dXJucyBJUlEgc3RhdHVzKElSUV9IQU5ETEVEKQorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYWI4NTAwX2NoYXJnZXJfdmJ1c2RldGZfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpfZGkpCit7CisJc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IF9kaTsKKworCWRpLT52YnVzX2RldGVjdGVkID0gZmFsc2U7CisJZGV2X2RiZyhkaS0+ZGV2LCAiVkJVUyBmYWxsaW5nIGRldGVjdGVkXG4iKTsKKwlxdWV1ZV93b3JrKGRpLT5jaGFyZ2VyX3dxLCAmZGktPmRldGVjdF91c2JfdHlwZV93b3JrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBhYjg1MDBfY2hhcmdlcl92YnVzZGV0cl9oYW5kbGVyKCkgLSBWQlVTIHJpc2luZyBkZXRlY3RlZAorICogQGlycTogICAgICAgaW50ZXJydXB0IG51bWJlcgorICogQF9kaTogICAgICAgcG9pbnRlciB0byB0aGUgYWI4NTAwX2NoYXJnZXIgc3RydWN0dXJlCisgKgorICogUmV0dXJucyBJUlEgc3RhdHVzKElSUV9IQU5ETEVEKQorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYWI4NTAwX2NoYXJnZXJfdmJ1c2RldHJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpfZGkpCit7CisJc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IF9kaTsKKworCWRpLT52YnVzX2RldGVjdGVkID0gdHJ1ZTsKKwlkZXZfZGJnKGRpLT5kZXYsICJWQlVTIHJpc2luZyBkZXRlY3RlZFxuIik7CisKKwlxdWV1ZV93b3JrKGRpLT5jaGFyZ2VyX3dxLCAmZGktPmRldGVjdF91c2JfdHlwZV93b3JrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBhYjg1MDBfY2hhcmdlcl91c2JsaW5rc3RhdHVzX2hhbmRsZXIoKSAtIFVTQiBsaW5rIHN0YXR1cyBoYXMgY2hhbmdlZAorICogQGlycTogICAgICAgaW50ZXJydXB0IG51bWJlcgorICogQF9kaTogICAgICAgcG9pbnRlciB0byB0aGUgYWI4NTAwX2NoYXJnZXIgc3RydWN0dXJlCisgKgorICogUmV0dXJucyBJUlEgc3RhdHVzKElSUV9IQU5ETEVEKQorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYWI4NTAwX2NoYXJnZXJfdXNibGlua3N0YXR1c19oYW5kbGVyKGludCBpcnEsIHZvaWQgKl9kaSkKK3sKKwlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpID0gX2RpOworCisJZGV2X2RiZyhkaS0+ZGV2LCAiVVNCIGxpbmsgc3RhdHVzIGNoYW5nZWRcbiIpOworCisJcXVldWVfd29yayhkaS0+Y2hhcmdlcl93cSwgJmRpLT51c2JfbGlua19zdGF0dXNfd29yayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKgorICogYWI4NTAwX2NoYXJnZXJfdXNiY2h0aHByb3RyX2hhbmRsZXIoKSAtIERpZSB0ZW1wIGlzIGFib3ZlIHVzYiBjaGFyZ2VyCisgKiB0aGVybWFsIHByb3RlY3Rpb24gdGhyZXNob2xkCisgKiBAaXJxOiAgICAgICBpbnRlcnJ1cHQgbnVtYmVyCisgKiBAX2RpOiAgICAgICBwb2ludGVyIHRvIHRoZSBhYjg1MDBfY2hhcmdlciBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIElSUSBzdGF0dXMoSVJRX0hBTkRMRUQpCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBhYjg1MDBfY2hhcmdlcl91c2JjaHRocHJvdHJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpfZGkpCit7CisJc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IF9kaTsKKworCWRldl9kYmcoZGktPmRldiwKKwkJIkRpZSB0ZW1wIGFib3ZlIFVTQiBjaGFyZ2VyIHRoZXJtYWwgcHJvdGVjdGlvbiB0aHJlc2hvbGRcbiIpOworCXF1ZXVlX3dvcmsoZGktPmNoYXJnZXJfd3EsICZkaS0+Y2hlY2tfdXNiX3RoZXJtYWxfcHJvdF93b3JrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBhYjg1MDBfY2hhcmdlcl91c2JjaHRocHJvdGZfaGFuZGxlcigpIC0gRGllIHRlbXAgaXMgYmVsb3cgdXNiIGNoYXJnZXIKKyAqIHRoZXJtYWwgcHJvdGVjdGlvbiB0aHJlc2hvbGQKKyAqIEBpcnE6ICAgICAgIGludGVycnVwdCBudW1iZXIKKyAqIEBfZGk6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGFiODUwMF9jaGFyZ2VyIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgSVJRIHN0YXR1cyhJUlFfSEFORExFRCkKKyAqLworc3RhdGljIGlycXJldHVybl90IGFiODUwMF9jaGFyZ2VyX3VzYmNodGhwcm90Zl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKl9kaSkKK3sKKwlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpID0gX2RpOworCisJZGV2X2RiZyhkaS0+ZGV2LAorCQkiRGllIHRlbXAgb2sgZm9yIFVTQiBjaGFyZ2VyIHRoZXJtYWwgcHJvdGVjdGlvbiB0aHJlc2hvbGRcbiIpOworCXF1ZXVlX3dvcmsoZGktPmNoYXJnZXJfd3EsICZkaS0+Y2hlY2tfdXNiX3RoZXJtYWxfcHJvdF93b3JrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBhYjg1MDBfY2hhcmdlcl91c2JjaGFyZ2Vybm90b2tyX2hhbmRsZXIoKSAtIFVTQiBjaGFyZ2VyIG5vdCBvayBkZXRlY3RlZAorICogQGlycTogICAgICAgaW50ZXJydXB0IG51bWJlcgorICogQF9kaTogICAgICAgcG9pbnRlciB0byB0aGUgYWI4NTAwX2NoYXJnZXIgc3RydWN0dXJlCisgKgorICogUmV0dXJucyBJUlEgc3RhdHVzKElSUV9IQU5ETEVEKQorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYWI4NTAwX2NoYXJnZXJfdXNiY2hhcmdlcm5vdG9rcl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKl9kaSkKK3sKKwlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpID0gX2RpOworCisJZGV2X2RiZyhkaS0+ZGV2LCAiTm90IGFsbG93ZWQgVVNCIGNoYXJnZXIgZGV0ZWN0ZWRcbiIpOworCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Y2hhcmdlcl93cSwgJmRpLT5jaGVja191c2JjaGdub3Rva193b3JrLCAwKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBhYjg1MDBfY2hhcmdlcl9jaHdkZXhwX2hhbmRsZXIoKSAtIENoYXJnZXIgd2F0Y2hkb2cgZXhwaXJlZAorICogQGlycTogICAgICAgaW50ZXJydXB0IG51bWJlcgorICogQF9kaTogICAgICAgcG9pbnRlciB0byB0aGUgYWI4NTAwX2NoYXJnZXIgc3RydWN0dXJlCisgKgorICogUmV0dXJucyBJUlEgc3RhdHVzKElSUV9IQU5ETEVEKQorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYWI4NTAwX2NoYXJnZXJfY2h3ZGV4cF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKl9kaSkKK3sKKwlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpID0gX2RpOworCisJZGV2X2RiZyhkaS0+ZGV2LCAiQ2hhcmdlciB3YXRjaGRvZyBleHBpcmVkXG4iKTsKKworCS8qCisJICogVGhlIGNoYXJnZXIgdGhhdCB3YXMgb25saW5lIHdoZW4gdGhlIHdhdGNoZG9nIGV4cGlyZWQKKwkgKiBuZWVkcyB0byBiZSByZXN0YXJ0ZWQgZm9yIGNoYXJnaW5nIHRvIHN0YXJ0IGFnYWluCisJICovCisJaWYgKGRpLT5hYy5jaGFyZ2VyX29ubGluZSkgeworCQlkaS0+YWMud2RfZXhwaXJlZCA9IHRydWU7CisJCWFiODUwMF9wb3dlcl9zdXBwbHlfY2hhbmdlZChkaSwgZGktPmFjX2NoZy5wc3kpOworCX0KKwlpZiAoZGktPnVzYi5jaGFyZ2VyX29ubGluZSkgeworCQlkaS0+dXNiLndkX2V4cGlyZWQgPSB0cnVlOworCQlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksIGRpLT51c2JfY2hnLnBzeSk7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioKKyAqIGFiODUwMF9jaGFyZ2VyX3ZidXNjaGRyb3BlbmRfaGFuZGxlcigpIC0gVkJVUyBkcm9wIHJlbW92ZWQKKyAqIEBpcnE6ICAgICAgIGludGVycnVwdCBudW1iZXIKKyAqIEBfZGk6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGFiODUwMF9jaGFyZ2VyIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgSVJRIHN0YXR1cyhJUlFfSEFORExFRCkKKyAqLworc3RhdGljIGlycXJldHVybl90IGFiODUwMF9jaGFyZ2VyX3ZidXNjaGRyb3BlbmRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpfZGkpCit7CisJc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9IF9kaTsKKworCWRldl9kYmcoZGktPmRldiwgIlZCVVMgY2hhcmdlciBkcm9wIGVuZGVkXG4iKTsKKwlkaS0+ZmxhZ3MudmJ1c19kcm9wX2VuZCA9IHRydWU7CisKKwkvKgorCSAqIFZCVVMgbWlnaHQgaGF2ZSBkcm9wcGVkIGR1ZSB0byBiYWQgY29ubmVjdGlvbi4KKwkgKiBTY2hlZHVsZSBhIG5ldyBpbnB1dCBsaW1pdCBzZXQgdG8gdGhlIHZhbHVlIFNXIHJlcXVlc3RzLgorCSAqLworCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Y2hhcmdlcl93cSwgJmRpLT52YnVzX2Ryb3BfZW5kX3dvcmssCisJCQkgICByb3VuZF9qaWZmaWVzKFZCVVNfSU5fQ1VSUl9MSU1fUkVUUllfU0VUX1RJTUUgKiBIWikpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioKKyAqIGFiODUwMF9jaGFyZ2VyX3ZidXNvdnZfaGFuZGxlcigpIC0gVkJVUyBvdmVydm9sdGFnZSBkZXRlY3RlZAorICogQGlycTogICAgICAgaW50ZXJydXB0IG51bWJlcgorICogQF9kaTogICAgICAgcG9pbnRlciB0byB0aGUgYWI4NTAwX2NoYXJnZXIgc3RydWN0dXJlCisgKgorICogUmV0dXJucyBJUlEgc3RhdHVzKElSUV9IQU5ETEVEKQorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYWI4NTAwX2NoYXJnZXJfdmJ1c292dl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKl9kaSkKK3sKKwlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpID0gX2RpOworCisJZGV2X2RiZyhkaS0+ZGV2LCAiVkJVUyBvdmVydm9sdGFnZSBkZXRlY3RlZFxuIik7CisJZGktPmZsYWdzLnZidXNfb3Z2ID0gdHJ1ZTsKKwlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksIGRpLT51c2JfY2hnLnBzeSk7CisKKwkvKiBTY2hlZHVsZSBhIG5ldyBIVyBmYWlsdXJlIGNoZWNrICovCisJcXVldWVfZGVsYXllZF93b3JrKGRpLT5jaGFyZ2VyX3dxLCAmZGktPmNoZWNrX2h3X2ZhaWx1cmVfd29yaywgMCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKgorICogYWI4NTAwX2NoYXJnZXJfYWNfZ2V0X3Byb3BlcnR5KCkgLSBnZXQgdGhlIGFjL21haW5zIHByb3BlcnRpZXMKKyAqIEBwc3k6ICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvd2VyX3N1cHBseSBzdHJ1Y3R1cmUKKyAqIEBwc3A6ICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBzdHJ1Y3R1cmUKKyAqIEB2YWw6ICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvd2VyX3N1cHBseV9wcm9wdmFsIHVuaW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCB3aGVuIGFuIGFwcGxpY2F0aW9uIHRyaWVzIHRvIGdldCB0aGUgYWMvbWFpbnMKKyAqIHByb3BlcnRpZXMgYnkgcmVhZGluZyB0aGUgc3lzZnMgZmlsZXMuCisgKiBBQy9NYWlucyBwcm9wZXJ0aWVzIGFyZSBvbmxpbmUsIHByZXNlbnQgYW5kIHZvbHRhZ2UuCisgKiBvbmxpbmU6ICAgICBhYy9tYWlucyBjaGFyZ2luZyBpcyBpbiBwcm9ncmVzcyBvciBub3QKKyAqIHByZXNlbnQ6ICAgIHByZXNlbmNlIG9mIHRoZSBhYy9tYWlucworICogdm9sdGFnZTogICAgQUMvTWFpbnMgdm9sdGFnZQorICogUmV0dXJucyBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZSBlbHNlIDAob24gc3VjY2VzcykKKyAqLworc3RhdGljIGludCBhYjg1MDBfY2hhcmdlcl9hY19nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAorCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGk7CisJaW50IHJldDsKKworCWRpID0gdG9fYWI4NTAwX2NoYXJnZXJfYWNfZGV2aWNlX2luZm8ocHN5X3RvX3V4NTAwX2NoYXJnZXIocHN5KSk7CisKKwlzd2l0Y2ggKHBzcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfSEVBTFRIOgorCQlpZiAoZGktPmZsYWdzLm1haW5leHRjaG5vdG9rKQorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOU1BFQ19GQUlMVVJFOworCQllbHNlIGlmIChkaS0+YWMud2RfZXhwaXJlZCB8fCBkaS0+dXNiLndkX2V4cGlyZWQpCisJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfREVBRDsKKwkJZWxzZSBpZiAoZGktPmZsYWdzLm1haW5fdGhlcm1hbF9wcm90KQorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJIRUFUOworCQllbHNlCisJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfR09PRDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkU6CisJCXZhbC0+aW50dmFsID0gZGktPmFjLmNoYXJnZXJfb25saW5lOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ6CisJCXZhbC0+aW50dmFsID0gZGktPmFjLmNoYXJnZXJfY29ubmVjdGVkOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XOgorCQlyZXQgPSBhYjg1MDBfY2hhcmdlcl9nZXRfYWNfdm9sdGFnZShkaSk7CisJCWlmIChyZXQgPj0gMCkKKwkJCWRpLT5hYy5jaGFyZ2VyX3ZvbHRhZ2UgPSByZXQ7CisJCS8qIE9uIGVycm9yLCB1c2UgcHJldmlvdXMgdmFsdWUgKi8KKwkJdmFsLT5pbnR2YWwgPSBkaS0+YWMuY2hhcmdlcl92b2x0YWdlICogMTAwMDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX0FWRzoKKwkJLyoKKwkJICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGluZGljYXRlIHdoZW4gQ1YgbW9kZSBpcyBlbnRlcmVkCisJCSAqIGZvciB0aGUgQUMgY2hhcmdlcgorCQkgKi8KKwkJZGktPmFjLmN2X2FjdGl2ZSA9IGFiODUwMF9jaGFyZ2VyX2FjX2N2KGRpKTsKKwkJdmFsLT5pbnR2YWwgPSBkaS0+YWMuY3ZfYWN0aXZlOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XOgorCQlyZXQgPSBhYjg1MDBfY2hhcmdlcl9nZXRfYWNfY3VycmVudChkaSk7CisJCWlmIChyZXQgPj0gMCkKKwkJCWRpLT5hYy5jaGFyZ2VyX2N1cnJlbnQgPSByZXQ7CisJCXZhbC0+aW50dmFsID0gZGktPmFjLmNoYXJnZXJfY3VycmVudCAqIDEwMDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBhYjg1MDBfY2hhcmdlcl91c2JfZ2V0X3Byb3BlcnR5KCkgLSBnZXQgdGhlIHVzYiBwcm9wZXJ0aWVzCisgKiBAcHN5OiAgICAgICAgcG9pbnRlciB0byB0aGUgcG93ZXJfc3VwcGx5IHN0cnVjdHVyZQorICogQHBzcDogICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBzdHJ1Y3R1cmUKKyAqIEB2YWw6ICAgICAgICBwb2ludGVyIHRvIHRoZSBwb3dlcl9zdXBwbHlfcHJvcHZhbCB1bmlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgd2hlbiBhbiBhcHBsaWNhdGlvbiB0cmllcyB0byBnZXQgdGhlIHVzYgorICogcHJvcGVydGllcyBieSByZWFkaW5nIHRoZSBzeXNmcyBmaWxlcy4KKyAqIFVTQiBwcm9wZXJ0aWVzIGFyZSBvbmxpbmUsIHByZXNlbnQgYW5kIHZvbHRhZ2UuCisgKiBvbmxpbmU6ICAgICB1c2IgY2hhcmdpbmcgaXMgaW4gcHJvZ3Jlc3Mgb3Igbm90CisgKiBwcmVzZW50OiAgICBwcmVzZW5jZSBvZiB0aGUgdXNiCisgKiB2b2x0YWdlOiAgICB2YnVzIHZvbHRhZ2UKKyAqIFJldHVybnMgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUgZWxzZSAwKG9uIHN1Y2Nlc3MpCisgKi8KK3N0YXRpYyBpbnQgYWI4NTAwX2NoYXJnZXJfdXNiX2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaTsKKwlpbnQgcmV0OworCisJZGkgPSB0b19hYjg1MDBfY2hhcmdlcl91c2JfZGV2aWNlX2luZm8ocHN5X3RvX3V4NTAwX2NoYXJnZXIocHN5KSk7CisKKwlzd2l0Y2ggKHBzcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfSEVBTFRIOgorCQlpZiAoZGktPmZsYWdzLnVzYmNoYXJnZXJub3RvaykKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9VTlNQRUNfRkFJTFVSRTsKKwkJZWxzZSBpZiAoZGktPmFjLndkX2V4cGlyZWQgfHwgZGktPnVzYi53ZF9leHBpcmVkKQorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0RFQUQ7CisJCWVsc2UgaWYgKGRpLT5mbGFncy51c2JfdGhlcm1hbF9wcm90KQorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJIRUFUOworCQllbHNlIGlmIChkaS0+ZmxhZ3MudmJ1c19vdnYpCisJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUlZPTFRBR0U7CisJCWVsc2UKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9HT09EOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORToKKwkJdmFsLT5pbnR2YWwgPSBkaS0+dXNiLmNoYXJnZXJfb25saW5lOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ6CisJCXZhbC0+aW50dmFsID0gZGktPnVzYi5jaGFyZ2VyX2Nvbm5lY3RlZDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKKwkJcmV0ID0gYWI4NTAwX2NoYXJnZXJfZ2V0X3ZidXNfdm9sdGFnZShkaSk7CisJCWlmIChyZXQgPj0gMCkKKwkJCWRpLT51c2IuY2hhcmdlcl92b2x0YWdlID0gcmV0OworCQl2YWwtPmludHZhbCA9IGRpLT51c2IuY2hhcmdlcl92b2x0YWdlICogMTAwMDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX0FWRzoKKwkJLyoKKwkJICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGluZGljYXRlIHdoZW4gQ1YgbW9kZSBpcyBlbnRlcmVkCisJCSAqIGZvciB0aGUgVVNCIGNoYXJnZXIKKwkJICovCisJCWRpLT51c2IuY3ZfYWN0aXZlID0gYWI4NTAwX2NoYXJnZXJfdXNiX2N2KGRpKTsKKwkJdmFsLT5pbnR2YWwgPSBkaS0+dXNiLmN2X2FjdGl2ZTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVzoKKwkJcmV0ID0gYWI4NTAwX2NoYXJnZXJfZ2V0X3VzYl9jdXJyZW50KGRpKTsKKwkJaWYgKHJldCA+PSAwKQorCQkJZGktPnVzYi5jaGFyZ2VyX2N1cnJlbnQgPSByZXQ7CisJCXZhbC0+aW50dmFsID0gZGktPnVzYi5jaGFyZ2VyX2N1cnJlbnQgKiAxMDAwOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfQVZHOgorCQkvKgorCQkgKiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgdG8gaW5kaWNhdGUgd2hlbiBWQlVTIGhhcyBjb2xsYXBzZWQKKwkJICogZHVlIHRvIHRvbyBoaWdoIG91dHB1dCBjdXJyZW50IGZyb20gdGhlIFVTQiBjaGFyZ2VyCisJCSAqLworCQlpZiAoZGktPmZsYWdzLnZidXNfY29sbGFwc2UpCisJCQl2YWwtPmludHZhbCA9IDE7CisJCWVsc2UKKwkJCXZhbC0+aW50dmFsID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIGFiODUwMF9jaGFyZ2VyX2luaXRfaHdfcmVnaXN0ZXJzKCkgLSBTZXQgdXAgY2hhcmdlciByZWxhdGVkIHJlZ2lzdGVycworICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2NoYXJnZXIgc3RydWN0dXJlCisgKgorICogU2V0IHVwIGNoYXJnZXIgT1ZWLCB3YXRjaGRvZyBhbmQgbWF4aW11bSB2b2x0YWdlIHJlZ2lzdGVycyBhcyB3ZWxsIGFzCisgKiBjaGFyZ2luZyBvZiB0aGUgYmFja3VwIGJhdHRlcnkKKyAqLworc3RhdGljIGludCBhYjg1MDBfY2hhcmdlcl9pbml0X2h3X3JlZ2lzdGVycyhzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpKQoreworCWludCByZXQgPSAwOworCXU4IGJ1cF92Y2hfcmFuZ2UgPSAwLCB2YnVwMzNfdnJ0Y24gPSAwOworCisJLyogU2V0dXAgbWF4aW11bSBjaGFyZ2VyIGN1cnJlbnQgYW5kIHZvbHRhZ2UgZm9yIEFCQiBjdXQyLjAgKi8KKwlpZiAoIWlzX2FiODUwMF8xcDFfb3JfZWFybGllcihkaS0+cGFyZW50KSkgeworCQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKKwkJCUFCODUwMF9DSEFSR0VSLAorCQkJQUI4NTAwX0NIX1ZPTFRfTFZMX01BWF9SRUcsIENIX1ZPTF9MVkxfNFA2KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkaS0+ZGV2LAorCQkJCSJmYWlsZWQgdG8gc2V0IENIX1ZPTFRfTFZMX01BWF9SRUdcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoaXNfYWI4NTQwKGRpLT5wYXJlbnQpKQorCQkJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCisJCQkJQUI4NTAwX0NIQVJHRVIsIEFCODUwMF9DSF9PUFRfQ1JOVExWTF9NQVhfUkVHLAorCQkJCUNIX09QX0NVUl9MVkxfMlApOworCQllbHNlCisJCQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKKwkJCQlBQjg1MDBfQ0hBUkdFUiwgQUI4NTAwX0NIX09QVF9DUk5UTFZMX01BWF9SRUcsCisJCQkJQ0hfT1BfQ1VSX0xWTF8xUDYpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRpLT5kZXYsCisJCQkJImZhaWxlZCB0byBzZXQgQ0hfT1BUX0NSTlRMVkxfTUFYX1JFR1xuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmIChpc19hYjk1NDBfMnAwKGRpLT5wYXJlbnQpIHx8IGlzX2FiOTU0MF8zcDAoZGktPnBhcmVudCkKKwkgfHwgaXNfYWI4NTA1XzJwMChkaS0+cGFyZW50KSB8fCBpc19hYjg1NDAoZGktPnBhcmVudCkpCisJCXJldCA9IGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAorCQkJQUI4NTAwX0NIQVJHRVIsCisJCQlBQjg1MDBfVVNCQ0hfQ1RSTDJfUkVHLAorCQkJVkJVU19BVVRPX0lOX0NVUlJfTElNX0VOQSwKKwkJCVZCVVNfQVVUT19JTl9DVVJSX0xJTV9FTkEpOworCWVsc2UKKwkJLyoKKwkJICogVkJVUyBPVlYgc2V0IHRvIDYuM1YgYW5kIGVuYWJsZSBhdXRvbWF0aWMgY3VycmVudCBsaW1pdGF0aW9uCisJCSAqLworCQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKKwkJCUFCODUwMF9DSEFSR0VSLAorCQkJQUI4NTAwX1VTQkNIX0NUUkwyX1JFRywKKwkJCVZCVVNfT1ZWX1NFTEVDVF82UDNWIHwgVkJVU19BVVRPX0lOX0NVUlJfTElNX0VOQSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRpLT5kZXYsCisJCQkiZmFpbGVkIHRvIHNldCBhdXRvbWF0aWMgY3VycmVudCBsaW1pdGF0aW9uXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogRW5hYmxlIG1haW4gd2F0Y2hkb2cgaW4gT1RQICovCisJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCisJCUFCODUwMF9PVFBfRU1VTCwgQUI4NTAwX09UUF9DT05GXzE1LCBPVFBfRU5BQkxFX1dEKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byBlbmFibGUgbWFpbiBXRCBpbiBPVFBcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBFbmFibGUgbWFpbiB3YXRjaGRvZyAqLworCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAorCQlBQjg1MDBfU1lTX0NUUkwyX0JMT0NLLAorCQlBQjg1MDBfTUFJTl9XRE9HX0NUUkxfUkVHLCBNQUlOX1dET0dfRU5BKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGktPmRldiwgImZhaWxlIHRvIGVuYWJsZSBtYWluIHdhdGNoZG9nXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBEdWUgdG8gaW50ZXJuYWwgc3luY2hyb25pc2F0aW9uLCBFbmFibGUgYW5kIEtpY2sgd2F0Y2hkb2cgYml0cworCSAqIGNhbm5vdCBiZSBlbmFibGVkIGluIGEgc2luZ2xlIHdyaXRlLgorCSAqIEEgbWluaW11bSBkZWxheSBvZiAyKjMyIGtIeiBwZXJpb2QgKDYyLjXCtXMpIG11c3QgYmUgaW5zZXJ0ZWQKKwkgKiBiZXR3ZWVuIHdyaXRpbmcgRW5hYmxlIHRoZW4gS2ljayBiaXRzLgorCSAqLworCXVkZWxheSg2Myk7CisKKwkvKiBLaWNrIG1haW4gd2F0Y2hkb2cgKi8KKwlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKKwkJQUI4NTAwX1NZU19DVFJMMl9CTE9DSywKKwkJQUI4NTAwX01BSU5fV0RPR19DVFJMX1JFRywKKwkJKE1BSU5fV0RPR19FTkEgfCBNQUlOX1dET0dfS0lDSykpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIGtpY2sgbWFpbiB3YXRjaGRvZ1xuIik7CisJCWdvdG8gb3V0OworCX0KKworCS8qIERpc2FibGUgbWFpbiB3YXRjaGRvZyAqLworCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAorCQlBQjg1MDBfU1lTX0NUUkwyX0JMT0NLLAorCQlBQjg1MDBfTUFJTl9XRE9HX0NUUkxfUkVHLCBNQUlOX1dET0dfRElTKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byBkaXNhYmxlIG1haW4gd2F0Y2hkb2dcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBTZXQgd2F0Y2hkb2cgdGltZW91dCAqLworCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfQ0hBUkdFUiwKKwkJQUI4NTAwX0NIX1dEX1RJTUVSX1JFRywgV0RfVElNRVIpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIHNldCBjaGFyZ2VyIHdhdGNoZG9nIHRpbWVvdXRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBhYjg1MDBfY2hhcmdlcl9sZWRfZW4oZGksIGZhbHNlKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gZGlzYWJsZSBMRURcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBCYWNrdXAgYmF0dGVyeSB2b2x0YWdlIGFuZCBjdXJyZW50ICovCisJaWYgKGRpLT5ibS0+Ymt1cF9iYXRfdiA+IEJVUF9WQ0hfU0VMXzNQMVYpCisJCWJ1cF92Y2hfcmFuZ2UgPSBCVVBfVkNIX1JBTkdFOworCWlmIChkaS0+Ym0tPmJrdXBfYmF0X3YgPT0gQlVQX1ZDSF9TRUxfM1AzVikKKwkJdmJ1cDMzX3ZydGNuID0gVkJVUDMzX1ZSVENOOworCisJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCisJCUFCODUwMF9SVEMsCisJCUFCODUwMF9SVENfQkFDS1VQX0NIR19SRUcsCisJCShkaS0+Ym0tPmJrdXBfYmF0X3YgJiAweDMpIHwgZGktPmJtLT5ia3VwX2JhdF9pKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byBzZXR1cCBiYWNrdXAgYmF0dGVyeSBjaGFyZ2luZ1xuIik7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoaXNfYWI4NTQwKGRpLT5wYXJlbnQpKSB7CisJCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAorCQkJQUI4NTAwX1JUQywKKwkJCUFCODUwMF9SVENfQ1RSTDFfUkVHLAorCQkJYnVwX3ZjaF9yYW5nZSB8IHZidXAzM192cnRjbik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGktPmRldiwKKwkJCQkiZmFpbGVkIHRvIHNldHVwIGJhY2t1cCBiYXR0ZXJ5IGNoYXJnaW5nXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJLyogRW5hYmxlIGJhY2t1cCBiYXR0ZXJ5IGNoYXJnaW5nICovCisJYWJ4NTAwX21hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCisJCUFCODUwMF9SVEMsIEFCODUwMF9SVENfQ1RSTF9SRUcsCisJCVJUQ19CVVBfQ0hfRU5BLCBSVENfQlVQX0NIX0VOQSk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoZGktPmRldiwgIiVzIG1hc2sgYW5kIHNldCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKworCWlmIChpc19hYjg1NDAoZGktPnBhcmVudCkpIHsKKwkJcmV0ID0gYWJ4NTAwX21hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCisJCQlBQjg1MDBfQ0hBUkdFUiwgQUI4NTQwX1VTQl9QUF9NT0RFX1JFRywKKwkJCUJVU19WU1lTX1ZPTF9TRUxFQ1RfTUFTSywgQlVTX1ZTWVNfVk9MX1NFTEVDVF8zUDZWKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkaS0+ZGV2LAorCQkJCSJmYWlsZWQgdG8gc2V0dXAgdXNiIHBvd2VyIHBhdGggdnN5cyB2b2x0YWdlXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXJldCA9IGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAorCQkJQUI4NTAwX0NIQVJHRVIsIEFCODU0MF9VU0JfUFBfQ0hSX1JFRywKKwkJCUJVU19QUF9QUkVDSEdfQ1VSUkVOVF9NQVNLLCAwKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkaS0+ZGV2LAorCQkJCSJmYWlsZWQgdG8gc2V0dXAgdXNiIHBvd2VyIHBhdGggcHJlY2hhZ2UgY3VycmVudFxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBhYjg1MDAgY2hhcmdlciBkcml2ZXIgaW50ZXJydXB0cyBhbmQgdGhlaXIgcmVzcGVjdGl2ZSBpc3IKKyAqLworc3RhdGljIHN0cnVjdCBhYjg1MDBfY2hhcmdlcl9pbnRlcnJ1cHRzIGFiODUwMF9jaGFyZ2VyX2lycVtdID0geworCXsiTUFJTl9DSF9VTlBMVUdfREVUIiwgYWI4NTAwX2NoYXJnZXJfbWFpbmNodW5wbHVnZGV0X2hhbmRsZXJ9LAorCXsiTUFJTl9DSEFSR0VfUExVR19ERVQiLCBhYjg1MDBfY2hhcmdlcl9tYWluY2hwbHVnZGV0X2hhbmRsZXJ9LAorCXsiTUFJTl9FWFRfQ0hfTk9UX09LIiwgYWI4NTAwX2NoYXJnZXJfbWFpbmV4dGNobm90b2tfaGFuZGxlcn0sCisJeyJNQUlOX0NIX1RIX1BST1RfUiIsIGFiODUwMF9jaGFyZ2VyX21haW5jaHRocHJvdHJfaGFuZGxlcn0sCisJeyJNQUlOX0NIX1RIX1BST1RfRiIsIGFiODUwMF9jaGFyZ2VyX21haW5jaHRocHJvdGZfaGFuZGxlcn0sCisJeyJWQlVTX0RFVF9GIiwgYWI4NTAwX2NoYXJnZXJfdmJ1c2RldGZfaGFuZGxlcn0sCisJeyJWQlVTX0RFVF9SIiwgYWI4NTAwX2NoYXJnZXJfdmJ1c2RldHJfaGFuZGxlcn0sCisJeyJVU0JfTElOS19TVEFUVVMiLCBhYjg1MDBfY2hhcmdlcl91c2JsaW5rc3RhdHVzX2hhbmRsZXJ9LAorCXsiVVNCX0NIX1RIX1BST1RfUiIsIGFiODUwMF9jaGFyZ2VyX3VzYmNodGhwcm90cl9oYW5kbGVyfSwKKwl7IlVTQl9DSF9USF9QUk9UX0YiLCBhYjg1MDBfY2hhcmdlcl91c2JjaHRocHJvdGZfaGFuZGxlcn0sCisJeyJVU0JfQ0hBUkdFUl9OT1RfT0tSIiwgYWI4NTAwX2NoYXJnZXJfdXNiY2hhcmdlcm5vdG9rcl9oYW5kbGVyfSwKKwl7IlZCVVNfT1ZWIiwgYWI4NTAwX2NoYXJnZXJfdmJ1c292dl9oYW5kbGVyfSwKKwl7IkNIX1dEX0VYUCIsIGFiODUwMF9jaGFyZ2VyX2Nod2RleHBfaGFuZGxlcn0sCisJeyJWQlVTX0NIX0RST1BfRU5EIiwgYWI4NTAwX2NoYXJnZXJfdmJ1c2NoZHJvcGVuZF9oYW5kbGVyfSwKK307CisKK3N0YXRpYyBpbnQgYWI4NTAwX2NoYXJnZXJfdXNiX25vdGlmaWVyX2NhbGwoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcG93ZXIpCit7CisJc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaSA9CisJCWNvbnRhaW5lcl9vZihuYiwgc3RydWN0IGFiODUwMF9jaGFyZ2VyLCBuYik7CisJZW51bSBhYjg1MDBfdXNiX3N0YXRlIGJtX3VzYl9zdGF0ZTsKKwl1bnNpZ25lZCBtQSA9ICooKHVuc2lnbmVkICopcG93ZXIpOworCisJaWYgKCFkaSkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCisJaWYgKGV2ZW50ICE9IFVTQl9FVkVOVF9WQlVTKSB7CisJCWRldl9kYmcoZGktPmRldiwgIm5vdCBhIHN0YW5kYXJkIGhvc3QsIHJldHVybmluZ1xuIik7CisJCXJldHVybiBOT1RJRllfRE9ORTsKKwl9CisKKwkvKiBUT0RPOiBTdGF0ZSBpcyBmYWJyaWNhdGUgIGhlcmUuIFNlZSBpZiBjaGFyZ2VyIHJlYWxseSBuZWVkcyBVU0IKKwkgKiBzdGF0ZSBvciBpZiBtQSBpcyBlbm91Z2gKKwkgKi8KKwlpZiAoKGRpLT51c2Jfc3RhdGUudXNiX2N1cnJlbnQgPT0gMikgJiYgKG1BID4gMikpCisJCWJtX3VzYl9zdGF0ZSA9IEFCODUwMF9CTV9VU0JfU1RBVEVfUkVTVU1FOworCWVsc2UgaWYgKG1BID09IDApCisJCWJtX3VzYl9zdGF0ZSA9IEFCODUwMF9CTV9VU0JfU1RBVEVfUkVTRVRfSFM7CisJZWxzZSBpZiAobUEgPT0gMikKKwkJYm1fdXNiX3N0YXRlID0gQUI4NTAwX0JNX1VTQl9TVEFURV9TVVNQRU5EOworCWVsc2UgaWYgKG1BID49IDgpIC8qIDgsIDEwMCwgNTAwICovCisJCWJtX3VzYl9zdGF0ZSA9IEFCODUwMF9CTV9VU0JfU1RBVEVfQ09ORklHVVJFRDsKKwllbHNlIC8qIFNob3VsZCBuZXZlciBvY2N1ciAqLworCQlibV91c2Jfc3RhdGUgPSBBQjg1MDBfQk1fVVNCX1NUQVRFX1JFU0VUX0ZTOworCisJZGV2X2RiZyhkaS0+ZGV2LCAiJXMgdXNiX3N0YXRlOiAweCUwMnggbUE6ICVkXG4iLAorCQlfX2Z1bmNfXywgYm1fdXNiX3N0YXRlLCBtQSk7CisKKwlzcGluX2xvY2soJmRpLT51c2Jfc3RhdGUudXNiX2xvY2spOworCWRpLT51c2Jfc3RhdGUuc3RhdGVfdG1wID0gYm1fdXNiX3N0YXRlOworCWRpLT51c2Jfc3RhdGUudXNiX2N1cnJlbnRfdG1wID0gbUE7CisJc3Bpbl91bmxvY2soJmRpLT51c2Jfc3RhdGUudXNiX2xvY2spOworCisJLyoKKwkgKiB3YWl0IGZvciBzb21lIHRpbWUgdW50aWwgeW91IGdldCB1cGRhdGVzIGZyb20gdGhlIHVzYiBzdGFjaworCSAqIGFuZCBuZWdvdGlhdGlvbnMgYXJlIGNvbXBsZXRlZAorCSAqLworCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Y2hhcmdlcl93cSwgJmRpLT51c2Jfc3RhdGVfY2hhbmdlZF93b3JrLCBIWi8yKTsKKworCXJldHVybiBOT1RJRllfT0s7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19QTSkKK3N0YXRpYyBpbnQgYWI4NTAwX2NoYXJnZXJfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwkvKgorCSAqIEZvciBBQkIgcmV2aXNpb24gMS4wIGFuZCAxLjEgdGhlcmUgaXMgYSBidWcgaW4gdGhlIHdhdGNoZG9nCisJICogbG9naWMuIFRoYXQgbWVhbnMgd2UgaGF2ZSB0byBjb250aW5vdXNseSBraWNrIHRoZSBjaGFyZ2VyCisJICogd2F0Y2hkb2cgZXZlbiB3aGVuIG5vIGNoYXJnZXIgaXMgY29ubmVjdGVkLiBUaGlzIGlzIG9ubHkKKwkgKiB2YWxpZCBvbmNlIHRoZSBBQyBjaGFyZ2VyIGhhcyBiZWVuIGVuYWJsZWQuIFRoaXMgaXMKKwkgKiBhIGJ1ZyB0aGF0IGlzIG5vdCBoYW5kbGVkIGJ5IHRoZSBhbGdvcml0aG0gYW5kIHRoZQorCSAqIHdhdGNoZG9nIGhhdmUgdG8gYmUga2lja2VkIGJ5IHRoZSBjaGFyZ2VyIGRyaXZlcgorCSAqIHdoZW4gdGhlIEFDIGNoYXJnZXIgaXMgZGlzYWJsZWQKKwkgKi8KKwlpZiAoZGktPmFjX2Nvbm4gJiYgaXNfYWI4NTAwXzFwMV9vcl9lYXJsaWVyKGRpLT5wYXJlbnQpKSB7CisJCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfQ0hBUkdFUiwKKwkJCUFCODUwMF9DSEFSR19XRF9DVFJMLCBDSEFSR19XRF9LSUNLKTsKKwkJaWYgKHJldCkKKwkJCWRldl9lcnIoZGktPmRldiwgIkZhaWxlZCB0byBraWNrIFdEIVxuIik7CisKKwkJLyogSWYgbm90IGFscmVhZHkgcGVuZGluZyBzdGFydCBhIG5ldyB0aW1lciAqLworCQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmNoYXJnZXJfd3EsICZkaS0+a2lja193ZF93b3JrLAorCQkJCSAgIHJvdW5kX2ppZmZpZXMoV0RfS0lDS19JTlRFUlZBTCkpOworCX0KKworCS8qIElmIHdlIHN0aWxsIGhhdmUgYSBIVyBmYWlsdXJlLCBzY2hlZHVsZSBhIG5ldyBjaGVjayAqLworCWlmIChkaS0+ZmxhZ3MubWFpbmV4dGNobm90b2sgfHwgZGktPmZsYWdzLnZidXNfb3Z2KSB7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Y2hhcmdlcl93cSwKKwkJCSZkaS0+Y2hlY2tfaHdfZmFpbHVyZV93b3JrLCAwKTsKKwl9CisKKwlpZiAoZGktPmZsYWdzLnZidXNfZHJvcF9lbmQpCisJCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Y2hhcmdlcl93cSwgJmRpLT52YnVzX2Ryb3BfZW5kX3dvcmssIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWI4NTAwX2NoYXJnZXJfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCXBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwkvKiBDYW5jZWwgYW55IHBlbmRpbmcgam9icyAqLworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmRpLT5jaGVja19od19mYWlsdXJlX3dvcmspOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmRpLT52YnVzX2Ryb3BfZW5kX3dvcmspOworCisJZmx1c2hfZGVsYXllZF93b3JrKCZkaS0+YXR0YWNoX3dvcmspOworCWZsdXNoX2RlbGF5ZWRfd29yaygmZGktPnVzYl9jaGFyZ2VyX2F0dGFjaGVkX3dvcmspOworCWZsdXNoX2RlbGF5ZWRfd29yaygmZGktPmFjX2NoYXJnZXJfYXR0YWNoZWRfd29yayk7CisJZmx1c2hfZGVsYXllZF93b3JrKCZkaS0+Y2hlY2tfdXNiY2hnbm90b2tfd29yayk7CisJZmx1c2hfZGVsYXllZF93b3JrKCZkaS0+Y2hlY2tfdmJhdF93b3JrKTsKKwlmbHVzaF9kZWxheWVkX3dvcmsoJmRpLT5raWNrX3dkX3dvcmspOworCisJZmx1c2hfd29yaygmZGktPnVzYl9saW5rX3N0YXR1c193b3JrKTsKKwlmbHVzaF93b3JrKCZkaS0+YWNfd29yayk7CisJZmx1c2hfd29yaygmZGktPmRldGVjdF91c2JfdHlwZV93b3JrKTsKKworCWlmIChhdG9taWNfcmVhZCgmZGktPmN1cnJlbnRfc3RlcHBpbmdfc2Vzc2lvbnMpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgYWI4NTAwX2NoYXJnZXJfc3VzcGVuZCAgICAgIE5VTEwKKyNkZWZpbmUgYWI4NTAwX2NoYXJnZXJfcmVzdW1lICAgICAgIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGNoYXJnZXJfbmIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBhYjg1MDBfZXh0ZXJuYWxfY2hhcmdlcl9wcmVwYXJlLAorfTsKKworc3RhdGljIGludCBhYjg1MDBfY2hhcmdlcl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IGksIGlycSwgcmV0OworCisJLyogRGlzYWJsZSBBQyBjaGFyZ2luZyAqLworCWFiODUwMF9jaGFyZ2VyX2FjX2VuKCZkaS0+YWNfY2hnLCBmYWxzZSwgMCwgMCk7CisKKwkvKiBEaXNhYmxlIFVTQiBjaGFyZ2luZyAqLworCWFiODUwMF9jaGFyZ2VyX3VzYl9lbigmZGktPnVzYl9jaGcsIGZhbHNlLCAwLCAwKTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFiODUwMF9jaGFyZ2VyX2lycSk7IGkrKykgeworCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCBhYjg1MDBfY2hhcmdlcl9pcnFbaV0ubmFtZSk7CisJCWZyZWVfaXJxKGlycSwgZGkpOworCX0KKworCS8qIEJhY2t1cCBiYXR0ZXJ5IHZvbHRhZ2UgYW5kIGN1cnJlbnQgZGlzYWJsZSAqLworCXJldCA9IGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAorCQlBQjg1MDBfUlRDLCBBQjg1MDBfUlRDX0NUUkxfUkVHLCBSVENfQlVQX0NIX0VOQSwgMCk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoZGktPmRldiwgIiVzIG1hc2sgYW5kIHNldCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKworCXVzYl91bnJlZ2lzdGVyX25vdGlmaWVyKGRpLT51c2JfcGh5LCAmZGktPm5iKTsKKwl1c2JfcHV0X3BoeShkaS0+dXNiX3BoeSk7CisKKwkvKiBEZWxldGUgdGhlIHdvcmsgcXVldWUgKi8KKwlkZXN0cm95X3dvcmtxdWV1ZShkaS0+Y2hhcmdlcl93cSk7CisKKwkvKiBVbnJlZ2lzdGVyIGV4dGVybmFsIGNoYXJnZXIgZW5hYmxlIG5vdGlmaWVyICovCisJaWYgKCFkaS0+YWNfY2hnLmVuYWJsZWQpCisJCWJsb2NraW5nX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoCisJCQkmY2hhcmdlcl9ub3RpZmllcl9saXN0LCAmY2hhcmdlcl9uYik7CisKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCWlmIChkaS0+dXNiX2NoZy5lbmFibGVkKQorCQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihkaS0+dXNiX2NoZy5wc3kpOworCisJaWYgKGRpLT5hY19jaGcuZW5hYmxlZCAmJiAhZGktPmFjX2NoZy5leHRlcm5hbCkKKwkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoZGktPmFjX2NoZy5wc3kpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyICpzdXBwbHlfaW50ZXJmYWNlW10gPSB7CisJImFiODUwMF9jaGFyZ2FsZyIsCisJImFiODUwMF9mZyIsCisJImFiODUwMF9idGVtcCIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGFiODUwMF9hY19jaGdfZGVzYyA9IHsKKwkubmFtZQkJPSAiYWI4NTAwX2FjIiwKKwkudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUywKKwkucHJvcGVydGllcwk9IGFiODUwMF9jaGFyZ2VyX2FjX3Byb3BzLAorCS5udW1fcHJvcGVydGllcwk9IEFSUkFZX1NJWkUoYWI4NTAwX2NoYXJnZXJfYWNfcHJvcHMpLAorCS5nZXRfcHJvcGVydHkJPSBhYjg1MDBfY2hhcmdlcl9hY19nZXRfcHJvcGVydHksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGFiODUwMF91c2JfY2hnX2Rlc2MgPSB7CisJLm5hbWUJCT0gImFiODUwMF91c2IiLAorCS50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX1VTQiwKKwkucHJvcGVydGllcwk9IGFiODUwMF9jaGFyZ2VyX3VzYl9wcm9wcywKKwkubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKGFiODUwMF9jaGFyZ2VyX3VzYl9wcm9wcyksCisJLmdldF9wcm9wZXJ0eQk9IGFiODUwMF9jaGFyZ2VyX3VzYl9nZXRfcHJvcGVydHksCit9OworCitzdGF0aWMgaW50IGFiODUwMF9jaGFyZ2VyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBhYng1MDBfYm1fZGF0YSAqcGxhdCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIGFjX3BzeV9jZmcgPSB7fSwgdXNiX3BzeV9jZmcgPSB7fTsKKwlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpOworCWludCBpcnEsIGksIGNoYXJnZXJfc3RhdHVzLCByZXQgPSAwLCBjaF9zdGF0OworCisJZGkgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpkaSksIEdGUF9LRVJORUwpOworCWlmICghZGkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXMgbm8gbWVtIGZvciBhYjg1MDBfY2hhcmdlclxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoIXBsYXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gYmF0dGVyeSBtYW5hZ2VtZW50IGRhdGEgc3VwcGxpZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGktPmJtID0gcGxhdDsKKworCWlmIChucCkgeworCQlyZXQgPSBhYjg1MDBfYm1fb2ZfcHJvYmUoJnBkZXYtPmRldiwgbnAsIGRpLT5ibSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgYmF0dGVyeSBpbmZvcm1hdGlvblxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWRpLT5hdXRvcG93ZXJfY2ZnID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiYXV0b3Bvd2VyX2NmZyIpOworCX0gZWxzZQorCQlkaS0+YXV0b3Bvd2VyX2NmZyA9IGZhbHNlOworCisJLyogZ2V0IHBhcmVudCBkYXRhICovCisJZGktPmRldiA9ICZwZGV2LT5kZXY7CisJZGktPnBhcmVudCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKwlkaS0+Z3BhZGMgPSBhYjg1MDBfZ3BhZGNfZ2V0KCJhYjg1MDAtZ3BhZGMuMCIpOworCisJLyogaW5pdGlhbGl6ZSBsb2NrICovCisJc3Bpbl9sb2NrX2luaXQoJmRpLT51c2Jfc3RhdGUudXNiX2xvY2spOworCW11dGV4X2luaXQoJmRpLT51c2JfaXB0X2NybnRfbG9jayk7CisKKwlkaS0+YXV0b3Bvd2VyID0gZmFsc2U7CisJZGktPmludmFsaWRfY2hhcmdlcl9kZXRlY3Rfc3RhdGUgPSAwOworCisJLyogQUMgYW5kIFVTQiBzdXBwbHkgY29uZmlnICovCisJYWNfcHN5X2NmZy5zdXBwbGllZF90byA9IHN1cHBseV9pbnRlcmZhY2U7CisJYWNfcHN5X2NmZy5udW1fc3VwcGxpY2FudHMgPSBBUlJBWV9TSVpFKHN1cHBseV9pbnRlcmZhY2UpOworCWFjX3BzeV9jZmcuZHJ2X2RhdGEgPSAmZGktPmFjX2NoZzsKKwl1c2JfcHN5X2NmZy5zdXBwbGllZF90byA9IHN1cHBseV9pbnRlcmZhY2U7CisJdXNiX3BzeV9jZmcubnVtX3N1cHBsaWNhbnRzID0gQVJSQVlfU0laRShzdXBwbHlfaW50ZXJmYWNlKTsKKwl1c2JfcHN5X2NmZy5kcnZfZGF0YSA9ICZkaS0+dXNiX2NoZzsKKworCS8qIEFDIHN1cHBseSAqLworCS8qIHV4NTAwX2NoYXJnZXIgc3ViLWNsYXNzICovCisJZGktPmFjX2NoZy5vcHMuZW5hYmxlID0gJmFiODUwMF9jaGFyZ2VyX2FjX2VuOworCWRpLT5hY19jaGcub3BzLmNoZWNrX2VuYWJsZSA9ICZhYjg1MDBfY2hhcmdlcl9hY19jaGVja19lbmFibGU7CisJZGktPmFjX2NoZy5vcHMua2lja193ZCA9ICZhYjg1MDBfY2hhcmdlcl93YXRjaGRvZ19raWNrOworCWRpLT5hY19jaGcub3BzLnVwZGF0ZV9jdXJyID0gJmFiODUwMF9jaGFyZ2VyX3VwZGF0ZV9jaGFyZ2VyX2N1cnJlbnQ7CisJZGktPmFjX2NoZy5tYXhfb3V0X3ZvbHQgPSBhYjg1MDBfY2hhcmdlcl92b2x0YWdlX21hcFsKKwkJQVJSQVlfU0laRShhYjg1MDBfY2hhcmdlcl92b2x0YWdlX21hcCkgLSAxXTsKKwlkaS0+YWNfY2hnLm1heF9vdXRfY3VyciA9CisJCWRpLT5ibS0+Y2hnX291dHB1dF9jdXJyW2RpLT5ibS0+bl9jaGdfb3V0X2N1cnIgLSAxXTsKKwlkaS0+YWNfY2hnLndkdF9yZWZyZXNoID0gQ0hHX1dEX0lOVEVSVkFMOworCWRpLT5hY19jaGcuZW5hYmxlZCA9IGRpLT5ibS0+YWNfZW5hYmxlZDsKKwlkaS0+YWNfY2hnLmV4dGVybmFsID0gZmFsc2U7CisKKwkvKm5vdGlmaWVyIGZvciBleHRlcm5hbCBjaGFyZ2VyIGVuYWJsaW5nKi8KKwlpZiAoIWRpLT5hY19jaGcuZW5hYmxlZCkKKwkJYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoCisJCQkmY2hhcmdlcl9ub3RpZmllcl9saXN0LCAmY2hhcmdlcl9uYik7CisKKwkvKiBVU0Igc3VwcGx5ICovCisJLyogdXg1MDBfY2hhcmdlciBzdWItY2xhc3MgKi8KKwlkaS0+dXNiX2NoZy5vcHMuZW5hYmxlID0gJmFiODUwMF9jaGFyZ2VyX3VzYl9lbjsKKwlkaS0+dXNiX2NoZy5vcHMuY2hlY2tfZW5hYmxlID0gJmFiODUwMF9jaGFyZ2VyX3VzYl9jaGVja19lbmFibGU7CisJZGktPnVzYl9jaGcub3BzLmtpY2tfd2QgPSAmYWI4NTAwX2NoYXJnZXJfd2F0Y2hkb2dfa2ljazsKKwlkaS0+dXNiX2NoZy5vcHMudXBkYXRlX2N1cnIgPSAmYWI4NTAwX2NoYXJnZXJfdXBkYXRlX2NoYXJnZXJfY3VycmVudDsKKwlkaS0+dXNiX2NoZy5vcHMucHBfZW5hYmxlID0gJmFiODU0MF9jaGFyZ2VyX3Bvd2VyX3BhdGhfZW5hYmxlOworCWRpLT51c2JfY2hnLm9wcy5wcmVfY2hnX2VuYWJsZSA9ICZhYjg1NDBfY2hhcmdlcl91c2JfcHJlX2NoZ19lbmFibGU7CisJZGktPnVzYl9jaGcubWF4X291dF92b2x0ID0gYWI4NTAwX2NoYXJnZXJfdm9sdGFnZV9tYXBbCisJCUFSUkFZX1NJWkUoYWI4NTAwX2NoYXJnZXJfdm9sdGFnZV9tYXApIC0gMV07CisJZGktPnVzYl9jaGcubWF4X291dF9jdXJyID0KKwkJZGktPmJtLT5jaGdfb3V0cHV0X2N1cnJbZGktPmJtLT5uX2NoZ19vdXRfY3VyciAtIDFdOworCWRpLT51c2JfY2hnLndkdF9yZWZyZXNoID0gQ0hHX1dEX0lOVEVSVkFMOworCWRpLT51c2JfY2hnLmVuYWJsZWQgPSBkaS0+Ym0tPnVzYl9lbmFibGVkOworCWRpLT51c2JfY2hnLmV4dGVybmFsID0gZmFsc2U7CisJZGktPnVzYl9jaGcucG93ZXJfcGF0aCA9IGRpLT5ibS0+dXNiX3Bvd2VyX3BhdGg7CisJZGktPnVzYl9zdGF0ZS51c2JfY3VycmVudCA9IC0xOworCisJLyogQ3JlYXRlIGEgd29yayBxdWV1ZSBmb3IgdGhlIGNoYXJnZXIgKi8KKwlkaS0+Y2hhcmdlcl93cSA9IGFsbG9jX29yZGVyZWRfd29ya3F1ZXVlKCJhYjg1MDBfY2hhcmdlcl93cSIsCisJCQkJCQkgV1FfTUVNX1JFQ0xBSU0pOworCWlmIChkaS0+Y2hhcmdlcl93cSA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byBjcmVhdGUgd29yayBxdWV1ZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW11dGV4X2luaXQoJmRpLT5jaGFyZ2VyX2F0dGFjaGVkX211dGV4KTsKKworCS8qIEluaXQgd29yayBmb3IgSFcgZmFpbHVyZSBjaGVjayAqLworCUlOSVRfREVGRVJSQUJMRV9XT1JLKCZkaS0+Y2hlY2tfaHdfZmFpbHVyZV93b3JrLAorCQlhYjg1MDBfY2hhcmdlcl9jaGVja19od19mYWlsdXJlX3dvcmspOworCUlOSVRfREVGRVJSQUJMRV9XT1JLKCZkaS0+Y2hlY2tfdXNiY2hnbm90b2tfd29yaywKKwkJYWI4NTAwX2NoYXJnZXJfY2hlY2tfdXNiY2hhcmdlcm5vdG9rX3dvcmspOworCisJSU5JVF9ERUxBWUVEX1dPUksoJmRpLT5hY19jaGFyZ2VyX2F0dGFjaGVkX3dvcmssCisJCQkgIGFiODUwMF9jaGFyZ2VyX2FjX2F0dGFjaGVkX3dvcmspOworCUlOSVRfREVMQVlFRF9XT1JLKCZkaS0+dXNiX2NoYXJnZXJfYXR0YWNoZWRfd29yaywKKwkJCSAgYWI4NTAwX2NoYXJnZXJfdXNiX2F0dGFjaGVkX3dvcmspOworCisJLyoKKwkgKiBGb3IgQUJCIHJldmlzaW9uIDEuMCBhbmQgMS4xIHRoZXJlIGlzIGEgYnVnIGluIHRoZSB3YXRjaGRvZworCSAqIGxvZ2ljLiBUaGF0IG1lYW5zIHdlIGhhdmUgdG8gY29udGlub3VzbHkga2ljayB0aGUgY2hhcmdlcgorCSAqIHdhdGNoZG9nIGV2ZW4gd2hlbiBubyBjaGFyZ2VyIGlzIGNvbm5lY3RlZC4gVGhpcyBpcyBvbmx5CisJICogdmFsaWQgb25jZSB0aGUgQUMgY2hhcmdlciBoYXMgYmVlbiBlbmFibGVkLiBUaGlzIGlzCisJICogYSBidWcgdGhhdCBpcyBub3QgaGFuZGxlZCBieSB0aGUgYWxnb3JpdGhtIGFuZCB0aGUKKwkgKiB3YXRjaGRvZyBoYXZlIHRvIGJlIGtpY2tlZCBieSB0aGUgY2hhcmdlciBkcml2ZXIKKwkgKiB3aGVuIHRoZSBBQyBjaGFyZ2VyIGlzIGRpc2FibGVkCisJICovCisJSU5JVF9ERUZFUlJBQkxFX1dPUksoJmRpLT5raWNrX3dkX3dvcmssCisJCWFiODUwMF9jaGFyZ2VyX2tpY2tfd2F0Y2hkb2dfd29yayk7CisKKwlJTklUX0RFRkVSUkFCTEVfV09SSygmZGktPmNoZWNrX3ZiYXRfd29yaywKKwkJYWI4NTAwX2NoYXJnZXJfY2hlY2tfdmJhdF93b3JrKTsKKworCUlOSVRfREVMQVlFRF9XT1JLKCZkaS0+YXR0YWNoX3dvcmssCisJCWFiODUwMF9jaGFyZ2VyX3VzYl9saW5rX2F0dGFjaF93b3JrKTsKKworCUlOSVRfREVMQVlFRF9XT1JLKCZkaS0+dXNiX3N0YXRlX2NoYW5nZWRfd29yaywKKwkJYWI4NTAwX2NoYXJnZXJfdXNiX3N0YXRlX2NoYW5nZWRfd29yayk7CisKKwlJTklUX0RFTEFZRURfV09SSygmZGktPnZidXNfZHJvcF9lbmRfd29yaywKKwkJYWI4NTAwX2NoYXJnZXJfdmJ1c19kcm9wX2VuZF93b3JrKTsKKworCS8qIEluaXQgd29yayBmb3IgY2hhcmdlciBkZXRlY3Rpb24gKi8KKwlJTklUX1dPUksoJmRpLT51c2JfbGlua19zdGF0dXNfd29yaywKKwkJYWI4NTAwX2NoYXJnZXJfdXNiX2xpbmtfc3RhdHVzX3dvcmspOworCUlOSVRfV09SSygmZGktPmFjX3dvcmssIGFiODUwMF9jaGFyZ2VyX2FjX3dvcmspOworCUlOSVRfV09SSygmZGktPmRldGVjdF91c2JfdHlwZV93b3JrLAorCQlhYjg1MDBfY2hhcmdlcl9kZXRlY3RfdXNiX3R5cGVfd29yayk7CisKKwkvKiBJbml0IHdvcmsgZm9yIGNoZWNraW5nIEhXIHN0YXR1cyAqLworCUlOSVRfV09SSygmZGktPmNoZWNrX21haW5fdGhlcm1hbF9wcm90X3dvcmssCisJCWFiODUwMF9jaGFyZ2VyX2NoZWNrX21haW5fdGhlcm1hbF9wcm90X3dvcmspOworCUlOSVRfV09SSygmZGktPmNoZWNrX3VzYl90aGVybWFsX3Byb3Rfd29yaywKKwkJYWI4NTAwX2NoYXJnZXJfY2hlY2tfdXNiX3RoZXJtYWxfcHJvdF93b3JrKTsKKworCS8qCisJICogVkREIEFEQyBzdXBwbHkgbmVlZHMgdG8gYmUgZW5hYmxlZCBmcm9tIHRoaXMgZHJpdmVyIHdoZW4gdGhlcmUKKwkgKiBpcyBhIGNoYXJnZXIgY29ubmVjdGVkIHRvIGF2b2lkIGVycm9uZW91cyBCVEVNUF9ISUdIL0xPVworCSAqIGludGVycnVwdHMgZHVyaW5nIGNoYXJnaW5nCisJICovCisJZGktPnJlZ3UgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoZGktPmRldiwgInZkZGFkYyIpOworCWlmIChJU19FUlIoZGktPnJlZ3UpKSB7CisJCXJldCA9IFBUUl9FUlIoZGktPnJlZ3UpOworCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gZ2V0IHZkZGFkYyByZWd1bGF0b3JcbiIpOworCQlnb3RvIGZyZWVfY2hhcmdlcl93cTsKKwl9CisKKworCS8qIEluaXRpYWxpemUgT1ZWLCBhbmQgb3RoZXIgcmVnaXN0ZXJzICovCisJcmV0ID0gYWI4NTAwX2NoYXJnZXJfaW5pdF9od19yZWdpc3RlcnMoZGkpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgQUJCIHJlZ2lzdGVyc1xuIik7CisJCWdvdG8gZnJlZV9jaGFyZ2VyX3dxOworCX0KKworCS8qIFJlZ2lzdGVyIEFDIGNoYXJnZXIgY2xhc3MgKi8KKwlpZiAoZGktPmFjX2NoZy5lbmFibGVkKSB7CisJCWRpLT5hY19jaGcucHN5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKGRpLT5kZXYsCisJCQkJCQkgICAgICAgJmFiODUwMF9hY19jaGdfZGVzYywKKwkJCQkJCSAgICAgICAmYWNfcHN5X2NmZyk7CisJCWlmIChJU19FUlIoZGktPmFjX2NoZy5wc3kpKSB7CisJCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgQUMgY2hhcmdlclxuIik7CisJCQlyZXQgPSBQVFJfRVJSKGRpLT5hY19jaGcucHN5KTsKKwkJCWdvdG8gZnJlZV9jaGFyZ2VyX3dxOworCQl9CisJfQorCisJLyogUmVnaXN0ZXIgVVNCIGNoYXJnZXIgY2xhc3MgKi8KKwlpZiAoZGktPnVzYl9jaGcuZW5hYmxlZCkgeworCQlkaS0+dXNiX2NoZy5wc3kgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoZGktPmRldiwKKwkJCQkJCQkmYWI4NTAwX3VzYl9jaGdfZGVzYywKKwkJCQkJCQkmdXNiX3BzeV9jZmcpOworCQlpZiAoSVNfRVJSKGRpLT51c2JfY2hnLnBzeSkpIHsKKwkJCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBVU0IgY2hhcmdlclxuIik7CisJCQlyZXQgPSBQVFJfRVJSKGRpLT51c2JfY2hnLnBzeSk7CisJCQlnb3RvIGZyZWVfYWM7CisJCX0KKwl9CisKKwlkaS0+dXNiX3BoeSA9IHVzYl9nZXRfcGh5KFVTQl9QSFlfVFlQRV9VU0IyKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZGktPnVzYl9waHkpKSB7CisJCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byBnZXQgdXNiIHRyYW5zY2VpdmVyXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmcmVlX3VzYjsKKwl9CisJZGktPm5iLm5vdGlmaWVyX2NhbGwgPSBhYjg1MDBfY2hhcmdlcl91c2Jfbm90aWZpZXJfY2FsbDsKKwlyZXQgPSB1c2JfcmVnaXN0ZXJfbm90aWZpZXIoZGktPnVzYl9waHksICZkaS0+bmIpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIHVzYiBub3RpZmllclxuIik7CisJCWdvdG8gcHV0X3VzYl9waHk7CisJfQorCisJLyogSWRlbnRpZnkgdGhlIGNvbm5lY3RlZCBjaGFyZ2VyIHR5cGVzIGR1cmluZyBzdGFydHVwICovCisJY2hhcmdlcl9zdGF0dXMgPSBhYjg1MDBfY2hhcmdlcl9kZXRlY3RfY2hhcmdlcnMoZGksIHRydWUpOworCWlmIChjaGFyZ2VyX3N0YXR1cyAmIEFDX1BXX0NPTk4pIHsKKwkJZGktPmFjLmNoYXJnZXJfY29ubmVjdGVkID0gMTsKKwkJZGktPmFjX2Nvbm4gPSB0cnVlOworCQlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksIGRpLT5hY19jaGcucHN5KTsKKwkJc3lzZnNfbm90aWZ5KCZkaS0+YWNfY2hnLnBzeS0+ZGV2LmtvYmosIE5VTEwsICJwcmVzZW50Iik7CisJfQorCisJaWYgKGNoYXJnZXJfc3RhdHVzICYgVVNCX1BXX0NPTk4pIHsKKwkJZGktPnZidXNfZGV0ZWN0ZWQgPSB0cnVlOworCQlkaS0+dmJ1c19kZXRlY3RlZF9zdGFydCA9IHRydWU7CisJCXF1ZXVlX3dvcmsoZGktPmNoYXJnZXJfd3EsCisJCQkmZGktPmRldGVjdF91c2JfdHlwZV93b3JrKTsKKwl9CisKKwkvKiBSZWdpc3RlciBpbnRlcnJ1cHRzICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWI4NTAwX2NoYXJnZXJfaXJxKTsgaSsrKSB7CisJCWlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsIGFiODUwMF9jaGFyZ2VyX2lycVtpXS5uYW1lKTsKKwkJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoaXJxLCBOVUxMLCBhYjg1MDBfY2hhcmdlcl9pcnFbaV0uaXNyLAorCQkJSVJRRl9TSEFSRUQgfCBJUlFGX05PX1NVU1BFTkQsCisJCQlhYjg1MDBfY2hhcmdlcl9pcnFbaV0ubmFtZSwgZGkpOworCisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgJXMgSVJRICVkOiAlZFxuIgorCQkJCSwgYWI4NTAwX2NoYXJnZXJfaXJxW2ldLm5hbWUsIGlycSwgcmV0KTsKKwkJCWdvdG8gZnJlZV9pcnE7CisJCX0KKwkJZGV2X2RiZyhkaS0+ZGV2LCAiUmVxdWVzdGVkICVzIElSUSAlZDogJWRcbiIsCisJCQlhYjg1MDBfY2hhcmdlcl9pcnFbaV0ubmFtZSwgaXJxLCByZXQpOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRpKTsKKworCW11dGV4X2xvY2soJmRpLT5jaGFyZ2VyX2F0dGFjaGVkX211dGV4KTsKKworCWNoX3N0YXQgPSBhYjg1MDBfY2hhcmdlcl9kZXRlY3RfY2hhcmdlcnMoZGksIGZhbHNlKTsKKworCWlmICgoY2hfc3RhdCAmIEFDX1BXX0NPTk4pID09IEFDX1BXX0NPTk4pIHsKKwkJaWYgKGlzX2FiODUwMChkaS0+cGFyZW50KSkKKwkJCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Y2hhcmdlcl93cSwKKwkJCQkJICAgJmRpLT5hY19jaGFyZ2VyX2F0dGFjaGVkX3dvcmssCisJCQkJCSAgIEhaKTsKKwl9CisJaWYgKChjaF9zdGF0ICYgVVNCX1BXX0NPTk4pID09IFVTQl9QV19DT05OKSB7CisJCWlmIChpc19hYjg1MDAoZGktPnBhcmVudCkpCisJCQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmNoYXJnZXJfd3EsCisJCQkJCSAgICZkaS0+dXNiX2NoYXJnZXJfYXR0YWNoZWRfd29yaywKKwkJCQkJICAgSFopOworCX0KKworCW11dGV4X3VubG9jaygmZGktPmNoYXJnZXJfYXR0YWNoZWRfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKKworZnJlZV9pcnE6CisJdXNiX3VucmVnaXN0ZXJfbm90aWZpZXIoZGktPnVzYl9waHksICZkaS0+bmIpOworCisJLyogV2UgYWxzbyBoYXZlIHRvIGZyZWUgYWxsIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkIGlycXMgKi8KKwlmb3IgKGkgPSBpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJaXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgYWI4NTAwX2NoYXJnZXJfaXJxW2ldLm5hbWUpOworCQlmcmVlX2lycShpcnEsIGRpKTsKKwl9CitwdXRfdXNiX3BoeToKKwl1c2JfcHV0X3BoeShkaS0+dXNiX3BoeSk7CitmcmVlX3VzYjoKKwlpZiAoZGktPnVzYl9jaGcuZW5hYmxlZCkKKwkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoZGktPnVzYl9jaGcucHN5KTsKK2ZyZWVfYWM6CisJaWYgKGRpLT5hY19jaGcuZW5hYmxlZCkKKwkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoZGktPmFjX2NoZy5wc3kpOworZnJlZV9jaGFyZ2VyX3dxOgorCWRlc3Ryb3lfd29ya3F1ZXVlKGRpLT5jaGFyZ2VyX3dxKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhYjg1MDBfY2hhcmdlcl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAic3Rlcmljc3NvbixhYjg1MDAtY2hhcmdlciIsIH0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYWI4NTAwX2NoYXJnZXJfZHJpdmVyID0geworCS5wcm9iZSA9IGFiODUwMF9jaGFyZ2VyX3Byb2JlLAorCS5yZW1vdmUgPSBhYjg1MDBfY2hhcmdlcl9yZW1vdmUsCisJLnN1c3BlbmQgPSBhYjg1MDBfY2hhcmdlcl9zdXNwZW5kLAorCS5yZXN1bWUgPSBhYjg1MDBfY2hhcmdlcl9yZXN1bWUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYWI4NTAwLWNoYXJnZXIiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBhYjg1MDBfY2hhcmdlcl9tYXRjaCwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWI4NTAwX2NoYXJnZXJfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFiODUwMF9jaGFyZ2VyX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhYjg1MDBfY2hhcmdlcl9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFiODUwMF9jaGFyZ2VyX2RyaXZlcik7Cit9CisKK3N1YnN5c19pbml0Y2FsbF9zeW5jKGFiODUwMF9jaGFyZ2VyX2luaXQpOworbW9kdWxlX2V4aXQoYWI4NTAwX2NoYXJnZXJfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BVVRIT1IoIkpvaGFuIFBhbHNzb24sIEthcmwgS29taWVyb3dza2ksIEFydW4gUiBNdXJ0aHkiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06YWI4NTAwLWNoYXJnZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUI4NTAwIGNoYXJnZXIgbWFuYWdlbWVudCBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvc3VwcGx5L2FiODUwMF9mZy5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvYWI4NTAwX2ZnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE5OWY2NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L2FiODUwMF9mZy5jCkBAIC0wLDAgKzEsMzI2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgU1QtRXJpY3Nzb24gQUIgMjAxMgorICoKKyAqIE1haW4gYW5kIEJhY2stdXAgYmF0dGVyeSBtYW5hZ2VtZW50IGRyaXZlci4KKyAqCisgKiBOb3RlOiBCYWNrdXAgYmF0dGVyeSBtYW5hZ2VtZW50IGlzIHJlcXVpcmVkIGluIGNhc2Ugb2YgTGktSW9uIGJhdHRlcnkgYW5kIG5vdAorICogZm9yIGNhcGFjaXRpdmUgYmF0dGVyeS4gSFJFRiBib2FyZHMgaGF2ZSBjYXBhY2l0aXZlIGJhdHRlcnkgYW5kIGhlbmNlIGJhY2t1cAorICogYmF0dGVyeSBtYW5hZ2VtZW50IGlzIG5vdCB1c2VkIGFuZCB0aGUgc3VwcG9ydGVkIGNvZGUgaXMgYXZhaWxhYmxlIGluIHRoaXMKKyAqIGRyaXZlci4KKyAqCisgKiBMaWNlbnNlIFRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2MgorICogQXV0aG9yOgorICoJSm9oYW4gUGFsc3NvbiA8am9oYW4ucGFsc3NvbkBzdGVyaWNzc29uLmNvbT4KKyAqCUthcmwgS29taWVyb3dza2kgPGthcmwua29taWVyb3dza2lAc3Rlcmljc3Nvbi5jb20+CisgKglBcnVuIFIgTXVydGh5IDxhcnVuLm11cnRoeUBzdGVyaWNzc29uLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgorI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvdGltZTY0Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvYWJ4NTAwLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2FieDUwMC9hYjg1MDAuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvYWJ4NTAwL2FiODUwMC1ibS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9hYng1MDAvYWI4NTAwLWdwYWRjLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNkZWZpbmUgTUlMTElfVE9fTUlDUk8JCQkxMDAwCisjZGVmaW5lIEZHX0xTQl9JTl9NQQkJCTE2MjcKKyNkZWZpbmUgUUxTQl9OQU5PX0FNUF9IT1VSU19YMTAJCTEwNzEKKyNkZWZpbmUgSU5TX0NVUlJfVElNRU9VVAkJKDMgKiBIWikKKworI2RlZmluZSBTRUNfVE9fU0FNUExFKFMpCQkoUyAqIDQpCisKKyNkZWZpbmUgTkJSX0FWR19TQU1QTEVTCQkJMjAKKworI2RlZmluZSBMT1dfQkFUX0NIRUNLX0lOVEVSVkFMCQkoSFogLyAxNikgLyogNjIuNSBtcyAqLworCisjZGVmaW5lIFZBTElEX0NBUEFDSVRZX1NFQwkJKDQ1ICogNjApIC8qIDQ1IG1pbnV0ZXMgKi8KKyNkZWZpbmUgQkFUVF9PS19NSU4JCQkyMzYwIC8qIG1WICovCisjZGVmaW5lIEJBVFRfT0tfSU5DUkVNRU5UCQk1MCAvKiBtViAqLworI2RlZmluZSBCQVRUX09LX01BWF9OUl9JTkNSRU1FTlRTCTB4RQorCisvKiBGRyBjb25zdGFudHMgKi8KKyNkZWZpbmUgQkFUVF9PVlYJCQkweDAxCisKKyNkZWZpbmUgaW50ZXJwb2xhdGUoeCwgeDEsIHkxLCB4MiwgeTIpIFwKKwkoKHkxKSArICgoKCh5MikgLSAoeTEpKSAqICgoeCkgLSAoeDEpKSkgLyAoKHgyKSAtICh4MSkpKSk7CisKKy8qKgorICogc3RydWN0IGFiODUwMF9mZ19pbnRlcnJ1cHRzIC0gYWI4NTAwIGZnIGludGVydXB0cworICogQG5hbWU6CW5hbWUgb2YgdGhlIGludGVycnVwdAorICogQGlzcgkJZnVuY3Rpb24gcG9pbnRlciB0byB0aGUgaXNyCisgKi8KK3N0cnVjdCBhYjg1MDBfZmdfaW50ZXJydXB0cyB7CisJY2hhciAqbmFtZTsKKwlpcnFyZXR1cm5fdCAoKmlzcikoaW50IGlycSwgdm9pZCAqZGF0YSk7Cit9OworCitlbnVtIGFiODUwMF9mZ19kaXNjaGFyZ2Vfc3RhdGUgeworCUFCODUwMF9GR19ESVNDSEFSR0VfSU5JVCwKKwlBQjg1MDBfRkdfRElTQ0hBUkdFX0lOSVRNRUFTVVJJTkcsCisJQUI4NTAwX0ZHX0RJU0NIQVJHRV9JTklUX1JFQ09WRVJZLAorCUFCODUwMF9GR19ESVNDSEFSR0VfUkVDT1ZFUlksCisJQUI4NTAwX0ZHX0RJU0NIQVJHRV9SRUFET1VUX0lOSVQsCisJQUI4NTAwX0ZHX0RJU0NIQVJHRV9SRUFET1VULAorCUFCODUwMF9GR19ESVNDSEFSR0VfV0FLRVVQLAorfTsKKworc3RhdGljIGNoYXIgKmRpc2NoYXJnZV9zdGF0ZVtdID0geworCSJESVNDSEFSR0VfSU5JVCIsCisJIkRJU0NIQVJHRV9JTklUTUVBU1VSSU5HIiwKKwkiRElTQ0hBUkdFX0lOSVRfUkVDT1ZFUlkiLAorCSJESVNDSEFSR0VfUkVDT1ZFUlkiLAorCSJESVNDSEFSR0VfUkVBRE9VVF9JTklUIiwKKwkiRElTQ0hBUkdFX1JFQURPVVQiLAorCSJESVNDSEFSR0VfV0FLRVVQIiwKK307CisKK2VudW0gYWI4NTAwX2ZnX2NoYXJnZV9zdGF0ZSB7CisJQUI4NTAwX0ZHX0NIQVJHRV9JTklULAorCUFCODUwMF9GR19DSEFSR0VfUkVBRE9VVCwKK307CisKK3N0YXRpYyBjaGFyICpjaGFyZ2Vfc3RhdGVbXSA9IHsKKwkiQ0hBUkdFX0lOSVQiLAorCSJDSEFSR0VfUkVBRE9VVCIsCit9OworCitlbnVtIGFiODUwMF9mZ19jYWxpYnJhdGlvbl9zdGF0ZSB7CisJQUI4NTAwX0ZHX0NBTElCX0lOSVQsCisJQUI4NTAwX0ZHX0NBTElCX1dBSVQsCisJQUI4NTAwX0ZHX0NBTElCX0VORCwKK307CisKK3N0cnVjdCBhYjg1MDBfZmdfYXZnX2NhcCB7CisJaW50IGF2ZzsKKwlpbnQgc2FtcGxlc1tOQlJfQVZHX1NBTVBMRVNdOworCXRpbWU2NF90IHRpbWVfc3RhbXBzW05CUl9BVkdfU0FNUExFU107CisJaW50IHBvczsKKwlpbnQgbmJyX3NhbXBsZXM7CisJaW50IHN1bTsKK307CisKK3N0cnVjdCBhYjg1MDBfZmdfY2FwX3NjYWxpbmcgeworCWJvb2wgZW5hYmxlOworCWludCBjYXBfdG9fc2NhbGVbMl07CisJaW50IGRpc2FibGVfY2FwX2xldmVsOworCWludCBzY2FsZWRfY2FwOworfTsKKworc3RydWN0IGFiODUwMF9mZ19iYXR0ZXJ5X2NhcGFjaXR5IHsKKwlpbnQgbWF4X21haF9kZXNpZ247CisJaW50IG1heF9tYWg7CisJaW50IG1haDsKKwlpbnQgcGVybWlsbGU7CisJaW50IGxldmVsOworCWludCBwcmV2X21haDsKKwlpbnQgcHJldl9wZXJjZW50OworCWludCBwcmV2X2xldmVsOworCWludCB1c2VyX21haDsKKwlzdHJ1Y3QgYWI4NTAwX2ZnX2NhcF9zY2FsaW5nIGNhcF9zY2FsZTsKK307CisKK3N0cnVjdCBhYjg1MDBfZmdfZmxhZ3MgeworCWJvb2wgZmdfZW5hYmxlZDsKKwlib29sIGNvbnZfZG9uZTsKKwlib29sIGNoYXJnaW5nOworCWJvb2wgZnVsbHlfY2hhcmdlZDsKKwlib29sIGZvcmNlX2Z1bGw7CisJYm9vbCBsb3dfYmF0X2RlbGF5OworCWJvb2wgbG93X2JhdDsKKwlib29sIGJhdF9vdnY7CisJYm9vbCBiYXR0X3Vua25vd247CisJYm9vbCBjYWxpYnJhdGU7CisJYm9vbCB1c2VyX2NhcDsKKwlib29sIGJhdHRfaWRfcmVjZWl2ZWQ7Cit9OworCitzdHJ1Y3QgaW5zdF9jdXJyX3Jlc3VsdF9saXN0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJaW50ICpyZXN1bHQ7Cit9OworCisvKioKKyAqIHN0cnVjdCBhYjg1MDBfZmcgLSBhYjg1MDAgRkcgZGV2aWNlIGluZm9ybWF0aW9uCisgKiBAZGV2OgkJUG9pbnRlciB0byB0aGUgc3RydWN0dXJlIGRldmljZQorICogQG5vZGU6CQlhIGxpc3Qgb2YgQUI4NTAwIEZHcywgaGVuY2UgcHJlcGFyZWQgZm9yIHJlZW50cmFuY2UKKyAqIEBpcnEJCQlob2xkcyB0aGUgQ0NFT0MgaW50ZXJydXB0IG51bWJlcgorICogQHZiYXQ6CQlCYXR0ZXJ5IHZvbHRhZ2UgaW4gbVYKKyAqIEB2YmF0X25vbToJCU5vbWluYWwgYmF0dGVyeSB2b2x0YWdlIGluIG1WCisgKiBAaW5zdF9jdXJyOgkJSW5zdGFudGVub3VzIGJhdHRlcnkgY3VycmVudCBpbiBtQQorICogQGF2Z19jdXJyOgkJQXZlcmFnZSBiYXR0ZXJ5IGN1cnJlbnQgaW4gbUEKKyAqIEBiYXRfdGVtcAkJYmF0dGVyeSB0ZW1wZXJhdHVyZQorICogQGZnX3NhbXBsZXM6CQlOdW1iZXIgb2Ygc2FtcGxlcyB1c2VkIGluIHRoZSBGRyBhY2N1bXVsYXRpb24KKyAqIEBhY2N1X2NoYXJnZToJQWNjdW11bGF0ZWQgY2hhcmdlIGZyb20gdGhlIGxhc3QgY29udmVyc2lvbgorICogQHJlY292ZXJ5X2NudDoJQ291bnRlciBmb3IgcmVjb3ZlcnkgbW9kZQorICogQGhpZ2hfY3Vycl9jbnQ6CUNvdW50ZXIgZm9yIGhpZ2ggY3VycmVudCBtb2RlCisgKiBAaW5pdF9jbnQ6CQlDb3VudGVyIGZvciBpbml0IG1vZGUKKyAqIEBsb3dfYmF0X2NudAkJQ291bnRlciBmb3IgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGxvdyBiYXR0ZXJ5IG1lYXN1cmVzCisgKiBAbmJyX2NjZW9jX2lycV9jbnQJQ291bnRlciBmb3IgbnVtYmVyIG9mIENDRU9DIGlycXMgcmVjZWl2ZWQgc2luY2UgZW5hYmxlZAorICogQHJlY292ZXJ5X25lZWRlZDoJSW5kaWNhdGUgaWYgcmVjb3ZlcnkgaXMgbmVlZGVkCisgKiBAaGlnaF9jdXJyX21vZGU6CUluZGljYXRlIGlmIHdlJ3JlIGluIGhpZ2ggY3VycmVudCBtb2RlCisgKiBAaW5pdF9jYXBhY2l0eToJSW5kaWNhdGUgaWYgaW5pdGlhbCBjYXBhY2l0eSBtZWFzdXJpbmcgc2hvdWxkIGJlIGRvbmUKKyAqIEB0dXJuX29mZl9mZzoJVHJ1ZSBpZiBmZyB3YXMgb2ZmIGJlZm9yZSBjdXJyZW50IG1lYXN1cmVtZW50CisgKiBAY2FsaWJfc3RhdGUJCVN0YXRlIGR1cmluZyBvZmZzZXQgY2FsaWJyYXRpb24KKyAqIEBkaXNjaGFyZ2Vfc3RhdGU6CUN1cnJlbnQgZGlzY2hhcmdlIHN0YXRlCisgKiBAY2hhcmdlX3N0YXRlOglDdXJyZW50IGNoYXJnZSBzdGF0ZQorICogQGFiODUwMF9mZ19zdGFydGVkCUNvbXBsZXRpb24gc3RydWN0IHVzZWQgZm9yIHRoZSBpbnN0YW50IGN1cnJlbnQgc3RhcnQKKyAqIEBhYjg1MDBfZmdfY29tcGxldGUJQ29tcGxldGlvbiBzdHJ1Y3QgdXNlZCBmb3IgdGhlIGluc3RhbnQgY3VycmVudCByZWFkaW5nCisgKiBAZmxhZ3M6CQlTdHJ1Y3R1cmUgZm9yIGluZm9ybWF0aW9uIGFib3V0IGV2ZW50cyB0cmlnZ2VyZWQKKyAqIEBiYXRfY2FwOgkJU3RydWN0dXJlIGZvciBiYXR0ZXJ5IGNhcGFjaXR5IHNwZWNpZmljIHBhcmFtZXRlcnMKKyAqIEBhdmdfY2FwOgkJQXZlcmFnZSBjYXBhY2l0eSBmaWx0ZXIKKyAqIEBwYXJlbnQ6CQlQb2ludGVyIHRvIHRoZSBzdHJ1Y3QgYWI4NTAwCisgKiBAZ3BhZGM6CQlQb2ludGVyIHRvIHRoZSBzdHJ1Y3QgZ3BhZGMKKyAqIEBibTogICAgICAgICAgIAlQbGF0Zm9ybSBzcGVjaWZpYyBiYXR0ZXJ5IG1hbmFnZW1lbnQgaW5mb3JtYXRpb24KKyAqIEBmZ19wc3k6CQlTdHJ1Y3R1cmUgdGhhdCBob2xkcyB0aGUgRkcgc3BlY2lmaWMgYmF0dGVyeSBwcm9wZXJ0aWVzCisgKiBAZmdfd3E6CQlXb3JrIHF1ZXVlIGZvciBydW5uaW5nIHRoZSBGRyBhbGdvcml0aG0KKyAqIEBmZ19wZXJpb2RpY193b3JrOglXb3JrIHRvIHJ1biB0aGUgRkcgYWxnb3JpdGhtIHBlcmlvZGljYWxseQorICogQGZnX2xvd19iYXRfd29yazoJV29yayB0byBjaGVjayBsb3cgYmF0IGNvbmRpdGlvbgorICogQGZnX3JlaW5pdF93b3JrCVdvcmsgdXNlZCB0byByZXNldCBhbmQgcmVpbml0aWFsaXNlIHRoZSBGRyBhbGdvcml0aG0KKyAqIEBmZ193b3JrOgkJV29yayB0byBydW4gdGhlIEZHIGFsZ29yaXRobSBpbnN0YW50bHkKKyAqIEBmZ19hY2NfY3VyX3dvcms6CVdvcmsgdG8gcmVhZCB0aGUgRkcgYWNjdW11bGF0b3IKKyAqIEBmZ19jaGVja19od19mYWlsdXJlX3dvcms6CVdvcmsgZm9yIGNoZWNraW5nIEhXIHN0YXRlCisgKiBAY2NfbG9jazoJCU11dGV4IGZvciBsb2NraW5nIHRoZSBDQworICogQGZnX2tvYmplY3Q6CQlTdHJ1Y3R1cmUgb2YgdHlwZSBrb2JqZWN0CisgKi8KK3N0cnVjdCBhYjg1MDBfZmcgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisJaW50IGlycTsKKwlpbnQgdmJhdDsKKwlpbnQgdmJhdF9ub207CisJaW50IGluc3RfY3VycjsKKwlpbnQgYXZnX2N1cnI7CisJaW50IGJhdF90ZW1wOworCWludCBmZ19zYW1wbGVzOworCWludCBhY2N1X2NoYXJnZTsKKwlpbnQgcmVjb3ZlcnlfY250OworCWludCBoaWdoX2N1cnJfY250OworCWludCBpbml0X2NudDsKKwlpbnQgbG93X2JhdF9jbnQ7CisJaW50IG5icl9jY2VvY19pcnFfY250OworCWJvb2wgcmVjb3ZlcnlfbmVlZGVkOworCWJvb2wgaGlnaF9jdXJyX21vZGU7CisJYm9vbCBpbml0X2NhcGFjaXR5OworCWJvb2wgdHVybl9vZmZfZmc7CisJZW51bSBhYjg1MDBfZmdfY2FsaWJyYXRpb25fc3RhdGUgY2FsaWJfc3RhdGU7CisJZW51bSBhYjg1MDBfZmdfZGlzY2hhcmdlX3N0YXRlIGRpc2NoYXJnZV9zdGF0ZTsKKwllbnVtIGFiODUwMF9mZ19jaGFyZ2Vfc3RhdGUgY2hhcmdlX3N0YXRlOworCXN0cnVjdCBjb21wbGV0aW9uIGFiODUwMF9mZ19zdGFydGVkOworCXN0cnVjdCBjb21wbGV0aW9uIGFiODUwMF9mZ19jb21wbGV0ZTsKKwlzdHJ1Y3QgYWI4NTAwX2ZnX2ZsYWdzIGZsYWdzOworCXN0cnVjdCBhYjg1MDBfZmdfYmF0dGVyeV9jYXBhY2l0eSBiYXRfY2FwOworCXN0cnVjdCBhYjg1MDBfZmdfYXZnX2NhcCBhdmdfY2FwOworCXN0cnVjdCBhYjg1MDAgKnBhcmVudDsKKwlzdHJ1Y3QgYWI4NTAwX2dwYWRjICpncGFkYzsKKwlzdHJ1Y3QgYWJ4NTAwX2JtX2RhdGEgKmJtOworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmZnX3BzeTsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqZmdfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBmZ19wZXJpb2RpY193b3JrOworCXN0cnVjdCBkZWxheWVkX3dvcmsgZmdfbG93X2JhdF93b3JrOworCXN0cnVjdCBkZWxheWVkX3dvcmsgZmdfcmVpbml0X3dvcms7CisJc3RydWN0IHdvcmtfc3RydWN0IGZnX3dvcms7CisJc3RydWN0IHdvcmtfc3RydWN0IGZnX2FjY19jdXJfd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGZnX2NoZWNrX2h3X2ZhaWx1cmVfd29yazsKKwlzdHJ1Y3QgbXV0ZXggY2NfbG9jazsKKwlzdHJ1Y3Qga29iamVjdCBmZ19rb2JqZWN0OworfTsKK3N0YXRpYyBMSVNUX0hFQUQoYWI4NTAwX2ZnX2xpc3QpOworCisvKioKKyAqIGFiODUwMF9mZ19nZXQoKSAtIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHByaW1hcnkgQUI4NTAwIGZ1ZWwgZ2F1Z2UKKyAqIChpLmUuIHRoZSBmaXJzdCBmdWVsIGdhdWdlIGluIHRoZSBpbnN0YW5jZSBsaXN0KQorICovCitzdHJ1Y3QgYWI4NTAwX2ZnICphYjg1MDBfZmdfZ2V0KHZvaWQpCit7CisJcmV0dXJuIGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmYWI4NTAwX2ZnX2xpc3QsIHN0cnVjdCBhYjg1MDBfZmcsCisJCQkJCW5vZGUpOworfQorCisvKiBNYWluIGJhdHRlcnkgcHJvcGVydGllcyAqLworc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IGFiODUwMF9mZ19wcm9wc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfQVZHLAorCVBPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9GVUxMX0RFU0lHTiwKKwlQT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfRlVMTCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMX0RFU0lHTiwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZX0xFVkVMLAorfTsKKworLyoKKyAqIFRoaXMgYXJyYXkgbWFwcyB0aGUgcmF3IGhleCB2YWx1ZSB0byBsb3diYXQgdm9sdGFnZSB1c2VkIGJ5IHRoZSBBQjg1MDAKKyAqIFZhbHVlcyB0YWtlbiBmcm9tIHRoZSBVTTA4MzYKKyAqLworc3RhdGljIGludCBhYjg1MDBfZmdfbG93YmF0X3ZvbHRhZ2VfbWFwW10gPSB7CisJMjMwMCAsCisJMjMyNSAsCisJMjM1MCAsCisJMjM3NSAsCisJMjQwMCAsCisJMjQyNSAsCisJMjQ1MCAsCisJMjQ3NSAsCisJMjUwMCAsCisJMjUyNSAsCisJMjU1MCAsCisJMjU3NSAsCisJMjYwMCAsCisJMjYyNSAsCisJMjY1MCAsCisJMjY3NSAsCisJMjcwMCAsCisJMjcyNSAsCisJMjc1MCAsCisJMjc3NSAsCisJMjgwMCAsCisJMjgyNSAsCisJMjg1MCAsCisJMjg3NSAsCisJMjkwMCAsCisJMjkyNSAsCisJMjk1MCAsCisJMjk3NSAsCisJMzAwMCAsCisJMzAyNSAsCisJMzA1MCAsCisJMzA3NSAsCisJMzEwMCAsCisJMzEyNSAsCisJMzE1MCAsCisJMzE3NSAsCisJMzIwMCAsCisJMzIyNSAsCisJMzI1MCAsCisJMzI3NSAsCisJMzMwMCAsCisJMzMyNSAsCisJMzM1MCAsCisJMzM3NSAsCisJMzQwMCAsCisJMzQyNSAsCisJMzQ1MCAsCisJMzQ3NSAsCisJMzUwMCAsCisJMzUyNSAsCisJMzU1MCAsCisJMzU3NSAsCisJMzYwMCAsCisJMzYyNSAsCisJMzY1MCAsCisJMzY3NSAsCisJMzcwMCAsCisJMzcyNSAsCisJMzc1MCAsCisJMzc3NSAsCisJMzgwMCAsCisJMzgyNSAsCisJMzg1MCAsCisJMzg1MCAsCit9OworCitzdGF0aWMgdTggYWI4NTAwX3ZvbHRfdG9fcmVndmFsKGludCB2b2x0YWdlKQoreworCWludCBpOworCisJaWYgKHZvbHRhZ2UgPCBhYjg1MDBfZmdfbG93YmF0X3ZvbHRhZ2VfbWFwWzBdKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFiODUwMF9mZ19sb3diYXRfdm9sdGFnZV9tYXApOyBpKyspIHsKKwkJaWYgKHZvbHRhZ2UgPCBhYjg1MDBfZmdfbG93YmF0X3ZvbHRhZ2VfbWFwW2ldKQorCQkJcmV0dXJuICh1OCkgaSAtIDE7CisJfQorCisJLyogSWYgbm90IGNhcHR1cmVkIGFib3ZlLCByZXR1cm4gaW5kZXggb2YgbGFzdCBlbGVtZW50ICovCisJcmV0dXJuICh1OCkgQVJSQVlfU0laRShhYjg1MDBfZmdfbG93YmF0X3ZvbHRhZ2VfbWFwKSAtIDE7Cit9CisKKy8qKgorICogYWI4NTAwX2ZnX2lzX2xvd19jdXJyKCkgLSBMb3cgb3IgaGlnaCBjdXJyZW50IG1vZGUKKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKKyAqIEBjdXJyOgl0aGUgY3VycmVudCB0byBiYXNlIG9yIG91ciBkZWNpc2lvbiBvbgorICoKKyAqIExvdyBjdXJyZW50IG1vZGUgaWYgdGhlIGN1cnJlbnQgY29uc3VtcHRpb24gaXMgYmVsb3cgYSBjZXJ0YWluIHRocmVzaG9sZAorICovCitzdGF0aWMgaW50IGFiODUwMF9mZ19pc19sb3dfY3VycihzdHJ1Y3QgYWI4NTAwX2ZnICpkaSwgaW50IGN1cnIpCit7CisJLyoKKwkgKiBXZSB3YW50IHRvIGtub3cgaWYgd2UncmUgaW4gbG93IGN1cnJlbnQgbW9kZQorCSAqLworCWlmIChjdXJyID4gLWRpLT5ibS0+ZmdfcGFyYW1zLT5oaWdoX2N1cnJfdGhyZXNob2xkKQorCQlyZXR1cm4gdHJ1ZTsKKwllbHNlCisJCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBhYjg1MDBfZmdfYWRkX2NhcF9zYW1wbGUoKSAtIEFkZCBjYXBhY2l0eSB0byBhdmVyYWdlIGZpbHRlcgorICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2ZnIHN0cnVjdHVyZQorICogQHNhbXBsZToJdGhlIGNhcGFjaXR5IGluIG1BaCB0byBhZGQgdG8gdGhlIGZpbHRlcgorICoKKyAqIEEgY2FwYWNpdHkgaXMgYWRkZWQgdG8gdGhlIGZpbHRlciBhbmQgYSBuZXcgbWVhbiBjYXBhY2l0eSBpcyBjYWxjdWxhdGVkIGFuZAorICogcmV0dXJuZWQKKyAqLworc3RhdGljIGludCBhYjg1MDBfZmdfYWRkX2NhcF9zYW1wbGUoc3RydWN0IGFiODUwMF9mZyAqZGksIGludCBzYW1wbGUpCit7CisJc3RydWN0IHRpbWVzcGVjNjQgdHM2NDsKKwlzdHJ1Y3QgYWI4NTAwX2ZnX2F2Z19jYXAgKmF2ZyA9ICZkaS0+YXZnX2NhcDsKKworCWdldG5zdGltZW9mZGF5NjQoJnRzNjQpOworCisJZG8geworCQlhdmctPnN1bSArPSBzYW1wbGUgLSBhdmctPnNhbXBsZXNbYXZnLT5wb3NdOworCQlhdmctPnNhbXBsZXNbYXZnLT5wb3NdID0gc2FtcGxlOworCQlhdmctPnRpbWVfc3RhbXBzW2F2Zy0+cG9zXSA9IHRzNjQudHZfc2VjOworCQlhdmctPnBvcysrOworCisJCWlmIChhdmctPnBvcyA9PSBOQlJfQVZHX1NBTVBMRVMpCisJCQlhdmctPnBvcyA9IDA7CisKKwkJaWYgKGF2Zy0+bmJyX3NhbXBsZXMgPCBOQlJfQVZHX1NBTVBMRVMpCisJCQlhdmctPm5icl9zYW1wbGVzKys7CisKKwkJLyoKKwkJICogQ2hlY2sgdGhlIHRpbWUgc3RhbXAgZm9yIGVhY2ggc2FtcGxlLiBJZiB0b28gb2xkLAorCQkgKiByZXBsYWNlIHdpdGggbGF0ZXN0IHNhbXBsZQorCQkgKi8KKwl9IHdoaWxlICh0czY0LnR2X3NlYyAtIFZBTElEX0NBUEFDSVRZX1NFQyA+IGF2Zy0+dGltZV9zdGFtcHNbYXZnLT5wb3NdKTsKKworCWF2Zy0+YXZnID0gYXZnLT5zdW0gLyBhdmctPm5icl9zYW1wbGVzOworCisJcmV0dXJuIGF2Zy0+YXZnOworfQorCisvKioKKyAqIGFiODUwMF9mZ19jbGVhcl9jYXBfc2FtcGxlcygpIC0gQ2xlYXIgYXZlcmFnZSBmaWx0ZXIKKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKKyAqCisgKiBUaGUgY2FwYWNpdHkgZmlsdGVyIGlzIGlzIHJlc2V0IHRvIHplcm8uCisgKi8KK3N0YXRpYyB2b2lkIGFiODUwMF9mZ19jbGVhcl9jYXBfc2FtcGxlcyhzdHJ1Y3QgYWI4NTAwX2ZnICpkaSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYWI4NTAwX2ZnX2F2Z19jYXAgKmF2ZyA9ICZkaS0+YXZnX2NhcDsKKworCWF2Zy0+cG9zID0gMDsKKwlhdmctPm5icl9zYW1wbGVzID0gMDsKKwlhdmctPnN1bSA9IDA7CisJYXZnLT5hdmcgPSAwOworCisJZm9yIChpID0gMDsgaSA8IE5CUl9BVkdfU0FNUExFUzsgaSsrKSB7CisJCWF2Zy0+c2FtcGxlc1tpXSA9IDA7CisJCWF2Zy0+dGltZV9zdGFtcHNbaV0gPSAwOworCX0KK30KKworLyoqCisgKiBhYjg1MDBfZmdfZmlsbF9jYXBfc2FtcGxlKCkgLSBGaWxsIGF2ZXJhZ2UgZmlsdGVyCisgKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfZmcgc3RydWN0dXJlCisgKiBAc2FtcGxlOgl0aGUgY2FwYWNpdHkgaW4gbUFoIHRvIGZpbGwgdGhlIGZpbHRlciB3aXRoCisgKgorICogVGhlIGNhcGFjaXR5IGZpbHRlciBpcyBmaWxsZWQgd2l0aCBhIGNhcGFjaXR5IGluIG1BaAorICovCitzdGF0aWMgdm9pZCBhYjg1MDBfZmdfZmlsbF9jYXBfc2FtcGxlKHN0cnVjdCBhYjg1MDBfZmcgKmRpLCBpbnQgc2FtcGxlKQoreworCWludCBpOworCXN0cnVjdCB0aW1lc3BlYzY0IHRzNjQ7CisJc3RydWN0IGFiODUwMF9mZ19hdmdfY2FwICphdmcgPSAmZGktPmF2Z19jYXA7CisKKwlnZXRuc3RpbWVvZmRheTY0KCZ0czY0KTsKKworCWZvciAoaSA9IDA7IGkgPCBOQlJfQVZHX1NBTVBMRVM7IGkrKykgeworCQlhdmctPnNhbXBsZXNbaV0gPSBzYW1wbGU7CisJCWF2Zy0+dGltZV9zdGFtcHNbaV0gPSB0czY0LnR2X3NlYzsKKwl9CisKKwlhdmctPnBvcyA9IDA7CisJYXZnLT5uYnJfc2FtcGxlcyA9IE5CUl9BVkdfU0FNUExFUzsKKwlhdmctPnN1bSA9IHNhbXBsZSAqIE5CUl9BVkdfU0FNUExFUzsKKwlhdmctPmF2ZyA9IHNhbXBsZTsKK30KKworLyoqCisgKiBhYjg1MDBfZmdfY291bG9tYl9jb3VudGVyKCkgLSBlbmFibGUgY291bG9tYiBjb3VudGVyCisgKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfZmcgc3RydWN0dXJlCisgKiBAZW5hYmxlOgllbmFibGUvZGlzYWJsZQorICoKKyAqIEVuYWJsZS9EaXNhYmxlIGNvdWxvbWIgY291bnRlci4KKyAqIE9uIGZhaWx1cmUgcmV0dXJucyBuZWdhdGl2ZSB2YWx1ZS4KKyAqLworc3RhdGljIGludCBhYjg1MDBfZmdfY291bG9tYl9jb3VudGVyKHN0cnVjdCBhYjg1MDBfZmcgKmRpLCBib29sIGVuYWJsZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwltdXRleF9sb2NrKCZkaS0+Y2NfbG9jayk7CisJaWYgKGVuYWJsZSkgeworCQkvKiBUbyBiZSBhYmxlIHRvIHJlcHJvZ3JhbSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMsIHdlIGhhdmUgdG8KKwkJICogZmlyc3Qgc3RvcCB0aGUgQ0MgYW5kIHRoZW4gZW5hYmxlIGl0IGFnYWluICovCisJCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfUlRDLAorCQkJQUI4NTAwX1JUQ19DQ19DT05GX1JFRywgMHgwMCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGNjX2VycjsKKworCQkvKiBQcm9ncmFtIHRoZSBzYW1wbGVzICovCisJCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAorCQkJQUI4NTAwX0dBU19HQVVHRSwgQUI4NTAwX0dBU0dfQ0NfTkNPVl9BQ0NVLAorCQkJZGktPmZnX3NhbXBsZXMpOworCQlpZiAocmV0KQorCQkJZ290byBjY19lcnI7CisKKwkJLyogU3RhcnQgdGhlIENDICovCisJCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfUlRDLAorCQkJQUI4NTAwX1JUQ19DQ19DT05GX1JFRywKKwkJCShDQ19ERUVQX1NMRUVQX0VOQSB8IENDX1BXUl9VUF9FTkEpKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gY2NfZXJyOworCisJCWRpLT5mbGFncy5mZ19lbmFibGVkID0gdHJ1ZTsKKwl9IGVsc2UgeworCQkvKiBDbGVhciBhbnkgcGVuZGluZyByZWFkIHJlcXVlc3RzICovCisJCXJldCA9IGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAorCQkJQUI4NTAwX0dBU19HQVVHRSwgQUI4NTAwX0dBU0dfQ0NfQ1RSTF9SRUcsCisJCQkoUkVTRVRfQUNDVSB8IFJFQURfUkVRKSwgMCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGNjX2VycjsKKworCQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKKwkJCUFCODUwMF9HQVNfR0FVR0UsIEFCODUwMF9HQVNHX0NDX05DT1ZfQUNDVV9DVFJMLCAwKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gY2NfZXJyOworCisJCS8qIFN0b3AgdGhlIENDICovCisJCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfUlRDLAorCQkJQUI4NTAwX1JUQ19DQ19DT05GX1JFRywgMCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGNjX2VycjsKKworCQlkaS0+ZmxhZ3MuZmdfZW5hYmxlZCA9IGZhbHNlOworCisJfQorCWRldl9kYmcoZGktPmRldiwgIiBDQyBlbmFibGVkOiAlZCBTYW1wbGVzOiAlZFxuIiwKKwkJZW5hYmxlLCBkaS0+Zmdfc2FtcGxlcyk7CisKKwltdXRleF91bmxvY2soJmRpLT5jY19sb2NrKTsKKworCXJldHVybiByZXQ7CitjY19lcnI6CisJZGV2X2VycihkaS0+ZGV2LCAiJXMgRW5hYmxpbmcgY291bG9tYiBjb3VudGVyIGZhaWxlZFxuIiwgX19mdW5jX18pOworCW11dGV4X3VubG9jaygmZGktPmNjX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYWI4NTAwX2ZnX2luc3RfY3Vycl9zdGFydCgpIC0gc3RhcnQgYmF0dGVyeSBpbnN0YW50YW5lb3VzIGN1cnJlbnQKKyAqIEBkaTogICAgICAgICBwb2ludGVyIHRvIHRoZSBhYjg1MDBfZmcgc3RydWN0dXJlCisgKgorICogUmV0dXJucyAwIG9yIGVycm9yIGNvZGUKKyAqIE5vdGU6IFRoaXMgaXMgcGFydCAib25lIiBhbmQgaGFzIHRvIGJlIGNhbGxlZCBiZWZvcmUKKyAqIGFiODUwMF9mZ19pbnN0X2N1cnJfZmluYWxpemUoKQorICovCitpbnQgYWI4NTAwX2ZnX2luc3RfY3Vycl9zdGFydChzdHJ1Y3QgYWI4NTAwX2ZnICpkaSkKK3sKKwl1OCByZWdfdmFsOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZkaS0+Y2NfbG9jayk7CisKKwlkaS0+bmJyX2NjZW9jX2lycV9jbnQgPSAwOworCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfUlRDLAorCQlBQjg1MDBfUlRDX0NDX0NPTkZfUkVHLCAmcmVnX3ZhbCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZmFpbDsKKworCWlmICghKHJlZ192YWwgJiBDQ19QV1JfVVBfRU5BKSkgeworCQlkZXZfZGJnKGRpLT5kZXYsICIlcyBFbmFibGUgRkdcbiIsIF9fZnVuY19fKTsKKwkJZGktPnR1cm5fb2ZmX2ZnID0gdHJ1ZTsKKworCQkvKiBQcm9ncmFtIHRoZSBzYW1wbGVzICovCisJCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAorCQkJQUI4NTAwX0dBU19HQVVHRSwgQUI4NTAwX0dBU0dfQ0NfTkNPVl9BQ0NVLAorCQkJU0VDX1RPX1NBTVBMRSgxMCkpOworCQlpZiAocmV0KQorCQkJZ290byBmYWlsOworCisJCS8qIFN0YXJ0IHRoZSBDQyAqLworCQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX1JUQywKKwkJCUFCODUwMF9SVENfQ0NfQ09ORl9SRUcsCisJCQkoQ0NfREVFUF9TTEVFUF9FTkEgfCBDQ19QV1JfVVBfRU5BKSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGZhaWw7CisJfSBlbHNlIHsKKwkJZGktPnR1cm5fb2ZmX2ZnID0gZmFsc2U7CisJfQorCisJLyogUmV0dXJuIGFuZCBXRkkgKi8KKwlyZWluaXRfY29tcGxldGlvbigmZGktPmFiODUwMF9mZ19zdGFydGVkKTsKKwlyZWluaXRfY29tcGxldGlvbigmZGktPmFiODUwMF9mZ19jb21wbGV0ZSk7CisJZW5hYmxlX2lycShkaS0+aXJxKTsKKworCS8qIE5vdGU6IGNjX2xvY2sgaXMgc3RpbGwgbG9ja2VkICovCisJcmV0dXJuIDA7CitmYWlsOgorCW11dGV4X3VubG9jaygmZGktPmNjX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYWI4NTAwX2ZnX2luc3RfY3Vycl9zdGFydGVkKCkgLSBjaGVjayBpZiBmZyBjb252ZXJzaW9uIGhhcyBzdGFydGVkCisgKiBAZGk6ICAgICAgICAgcG9pbnRlciB0byB0aGUgYWI4NTAwX2ZnIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgMSBpZiBjb252ZXJzaW9uIHN0YXJ0ZWQsIDAgaWYgc3RpbGwgd2FpdGluZworICovCitpbnQgYWI4NTAwX2ZnX2luc3RfY3Vycl9zdGFydGVkKHN0cnVjdCBhYjg1MDBfZmcgKmRpKQoreworCXJldHVybiBjb21wbGV0aW9uX2RvbmUoJmRpLT5hYjg1MDBfZmdfc3RhcnRlZCk7Cit9CisKKy8qKgorICogYWI4NTAwX2ZnX2luc3RfY3Vycl9kb25lKCkgLSBjaGVjayBpZiBmZyBjb252ZXJzaW9uIGlzIGRvbmUKKyAqIEBkaTogICAgICAgICBwb2ludGVyIHRvIHRoZSBhYjg1MDBfZmcgc3RydWN0dXJlCisgKgorICogUmV0dXJucyAxIGlmIGNvbnZlcnNpb24gZG9uZSwgMCBpZiBzdGlsbCB3YWl0aW5nCisgKi8KK2ludCBhYjg1MDBfZmdfaW5zdF9jdXJyX2RvbmUoc3RydWN0IGFiODUwMF9mZyAqZGkpCit7CisJcmV0dXJuIGNvbXBsZXRpb25fZG9uZSgmZGktPmFiODUwMF9mZ19jb21wbGV0ZSk7Cit9CisKKy8qKgorICogYWI4NTAwX2ZnX2luc3RfY3Vycl9maW5hbGl6ZSgpIC0gYmF0dGVyeSBpbnN0YW50YW5lb3VzIGN1cnJlbnQKKyAqIEBkaTogICAgICAgICBwb2ludGVyIHRvIHRoZSBhYjg1MDBfZmcgc3RydWN0dXJlCisgKiBAcmVzOgliYXR0ZXJ5IGluc3RhbnRlbm91cyBjdXJyZW50KG9uIHN1Y2Nlc3MpCisgKgorICogUmV0dXJucyAwIG9yIGFuIGVycm9yIGNvZGUKKyAqIE5vdGU6IFRoaXMgaXMgcGFydCAidHdvIiBhbmQgaGFzIHRvIGJlIGNhbGxlZCBhdCBlYXJsaWVzdCAyNTAgbXMKKyAqIGFmdGVyIGFiODUwMF9mZ19pbnN0X2N1cnJfc3RhcnQoKQorICovCitpbnQgYWI4NTAwX2ZnX2luc3RfY3Vycl9maW5hbGl6ZShzdHJ1Y3QgYWI4NTAwX2ZnICpkaSwgaW50ICpyZXMpCit7CisJdTggbG93LCBoaWdoOworCWludCB2YWw7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwlpZiAoIWNvbXBsZXRpb25fZG9uZSgmZGktPmFiODUwMF9mZ19jb21wbGV0ZSkpIHsKKwkJdGltZW91dCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgKKwkJCSZkaS0+YWI4NTAwX2ZnX2NvbXBsZXRlLAorCQkJSU5TX0NVUlJfVElNRU9VVCk7CisJCWRldl9kYmcoZGktPmRldiwgIkZpbmFsaXplIHRpbWU6ICVkIG1zXG4iLAorCQkJamlmZmllc190b19tc2VjcyhJTlNfQ1VSUl9USU1FT1VUIC0gdGltZW91dCkpOworCQlpZiAoIXRpbWVvdXQpIHsKKwkJCXJldCA9IC1FVElNRTsKKwkJCWRpc2FibGVfaXJxKGRpLT5pcnEpOworCQkJZGktPm5icl9jY2VvY19pcnFfY250ID0gMDsKKwkJCWRldl9lcnIoZGktPmRldiwgImNvbXBsZXRpb24gdGltZWQgb3V0IFslZF1cbiIsCisJCQkJX19MSU5FX18pOworCQkJZ290byBmYWlsOworCQl9CisJfQorCisJZGlzYWJsZV9pcnEoZGktPmlycSk7CisJZGktPm5icl9jY2VvY19pcnFfY250ID0gMDsKKworCXJldCA9IGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAorCQkJQUI4NTAwX0dBU19HQVVHRSwgQUI4NTAwX0dBU0dfQ0NfQ1RSTF9SRUcsCisJCQlSRUFEX1JFUSwgUkVBRF9SRVEpOworCisJLyogMTAwdVMgYmV0d2VlbiByZWFkIHJlcXVlc3QgYW5kIHJlYWQgaXMgbmVlZGVkICovCisJdXNsZWVwX3JhbmdlKDEwMCwgMTAwKTsKKworCS8qIFJlYWQgQ0MgU2FtcGxlIGNvbnZlcnNpb24gdmFsdWUgTG93IGFuZCBoaWdoICovCisJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9HQVNfR0FVR0UsCisJCUFCODUwMF9HQVNHX0NDX1NNUExfQ05WTF9SRUcsICAmbG93KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBmYWlsOworCisJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9HQVNfR0FVR0UsCisJCUFCODUwMF9HQVNHX0NDX1NNUExfQ05WSF9SRUcsICAmaGlnaCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZmFpbDsKKworCS8qCisJICogbmVnYXRpdmUgdmFsdWUgZm9yIERpc2NoYXJnaW5nCisJICogY29udmVydCAyJ3MgY29tcGxpbWVudCBpbnRvIGRlY2ltYWwKKwkgKi8KKwlpZiAoaGlnaCAmIDB4MTApCisJCXZhbCA9IChsb3cgfCAoaGlnaCA8PCA4KSB8IDB4RkZGRkUwMDApOworCWVsc2UKKwkJdmFsID0gKGxvdyB8IChoaWdoIDw8IDgpKTsKKworCS8qCisJICogQ29udmVydCB0byB1bml0IHZhbHVlIGluIG1BCisJICogRnVsbCBzY2FsZSBpbnB1dCB2b2x0YWdlIGlzCisJICogNjMuMTYwbVYgPT4gTFNCID0gNjMuMTYwbVYvKDQwOTYqcmVzKSA9IDEuNTQybUEKKwkgKiBHaXZlbiBhIDI1MG1zIGNvbnZlcnNpb24gY3ljbGUgdGltZSB0aGUgTFNCIGNvcnJlc3BvbmRzCisJICogdG8gMTA3LjEgbkFoLiBDb252ZXJ0IHRvIGN1cnJlbnQgYnkgZGl2aWRpbmcgYnkgdGhlIGNvbnZlcnNpb24KKwkgKiB0aW1lIGluIGhvdXJzICgyNTBtcyA9IDEgLyAoMzYwMCAqIDQpaCkKKwkgKiAxMDcuMW5BaCBhc3N1bWVzIDEwbU9obSwgYnV0IGZnX3JlcyBpcyBpbiAwLjFtT2htCisJICovCisJdmFsID0gKHZhbCAqIFFMU0JfTkFOT19BTVBfSE9VUlNfWDEwICogMzYgKiA0KSAvCisJCSgxMDAwICogZGktPmJtLT5mZ19yZXMpOworCisJaWYgKGRpLT50dXJuX29mZl9mZykgeworCQlkZXZfZGJnKGRpLT5kZXYsICIlcyBEaXNhYmxlIEZHXG4iLCBfX2Z1bmNfXyk7CisKKwkJLyogQ2xlYXIgYW55IHBlbmRpbmcgcmVhZCByZXF1ZXN0cyAqLworCQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKKwkJCUFCODUwMF9HQVNfR0FVR0UsIEFCODUwMF9HQVNHX0NDX0NUUkxfUkVHLCAwKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZmFpbDsKKworCQkvKiBTdG9wIHRoZSBDQyAqLworCQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX1JUQywKKwkJCUFCODUwMF9SVENfQ0NfQ09ORl9SRUcsIDApOworCQlpZiAocmV0KQorCQkJZ290byBmYWlsOworCX0KKwltdXRleF91bmxvY2soJmRpLT5jY19sb2NrKTsKKwkoKnJlcykgPSB2YWw7CisKKwlyZXR1cm4gMDsKK2ZhaWw6CisJbXV0ZXhfdW5sb2NrKCZkaS0+Y2NfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBhYjg1MDBfZmdfaW5zdF9jdXJyX2Jsb2NraW5nKCkgLSBiYXR0ZXJ5IGluc3RhbnRhbmVvdXMgY3VycmVudAorICogQGRpOiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKKyAqIEByZXM6CWJhdHRlcnkgaW5zdGFudGVub3VzIGN1cnJlbnQob24gc3VjY2VzcykKKyAqCisgKiBSZXR1cm5zIDAgZWxzZSBlcnJvciBjb2RlCisgKi8KK2ludCBhYjg1MDBfZmdfaW5zdF9jdXJyX2Jsb2NraW5nKHN0cnVjdCBhYjg1MDBfZmcgKmRpKQoreworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCByZXMgPSAwOworCisJcmV0ID0gYWI4NTAwX2ZnX2luc3RfY3Vycl9zdGFydChkaSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRpLT5kZXYsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBmZ19pbnN0XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogV2FpdCBmb3IgQ0MgdG8gYWN0dWFsbHkgc3RhcnQgKi8KKwlpZiAoIWNvbXBsZXRpb25fZG9uZSgmZGktPmFiODUwMF9mZ19zdGFydGVkKSkgeworCQl0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KAorCQkJJmRpLT5hYjg1MDBfZmdfc3RhcnRlZCwKKwkJCUlOU19DVVJSX1RJTUVPVVQpOworCQlkZXZfZGJnKGRpLT5kZXYsICJTdGFydCB0aW1lOiAlZCBtc1xuIiwKKwkJCWppZmZpZXNfdG9fbXNlY3MoSU5TX0NVUlJfVElNRU9VVCAtIHRpbWVvdXQpKTsKKwkJaWYgKCF0aW1lb3V0KSB7CisJCQlyZXQgPSAtRVRJTUU7CisJCQlkZXZfZXJyKGRpLT5kZXYsICJjb21wbGV0aW9uIHRpbWVkIG91dCBbJWRdXG4iLAorCQkJCV9fTElORV9fKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCXJldCA9IGFiODUwMF9mZ19pbnN0X2N1cnJfZmluYWxpemUoZGksICZyZXMpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkaS0+ZGV2LCAiRmFpbGVkIHRvIGZpbmFsaXplIGZnX2luc3RcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkZXZfZGJnKGRpLT5kZXYsICIlcyBpbnN0YW50IGN1cnJlbnQ6ICVkIiwgX19mdW5jX18sIHJlcyk7CisJcmV0dXJuIHJlczsKK2ZhaWw6CisJZGlzYWJsZV9pcnEoZGktPmlycSk7CisJbXV0ZXhfdW5sb2NrKCZkaS0+Y2NfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBhYjg1MDBfZmdfYWNjX2N1cl93b3JrKCkgLSBhdmVyYWdlIGJhdHRlcnkgY3VycmVudAorICogQHdvcms6CXBvaW50ZXIgdG8gdGhlIHdvcmtfc3RydWN0IHN0cnVjdHVyZQorICoKKyAqIFVwZGF0ZWQgdGhlIGF2ZXJhZ2UgYmF0dGVyeSBjdXJyZW50IG9idGFpbmVkIGZyb20gdGhlCisgKiBjb3Vsb21iIGNvdW50ZXIuCisgKi8KK3N0YXRpYyB2b2lkIGFiODUwMF9mZ19hY2NfY3VyX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWludCB2YWw7CisJaW50IHJldDsKKwl1OCBsb3csIG1lZCwgaGlnaDsKKworCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gY29udGFpbmVyX29mKHdvcmssCisJCXN0cnVjdCBhYjg1MDBfZmcsIGZnX2FjY19jdXJfd29yayk7CisKKwltdXRleF9sb2NrKCZkaS0+Y2NfbG9jayk7CisJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9HQVNfR0FVR0UsCisJCUFCODUwMF9HQVNHX0NDX05DT1ZfQUNDVV9DVFJMLCBSRF9OQ09OVl9BQ0NVX1JFUSk7CisJaWYgKHJldCkKKwkJZ290byBleGl0OworCisJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9HQVNfR0FVR0UsCisJCUFCODUwMF9HQVNHX0NDX05DT1ZfQUNDVV9MT1csICAmbG93KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBleGl0OworCisJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9HQVNfR0FVR0UsCisJCUFCODUwMF9HQVNHX0NDX05DT1ZfQUNDVV9NRUQsICAmbWVkKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBleGl0OworCisJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9HQVNfR0FVR0UsCisJCUFCODUwMF9HQVNHX0NDX05DT1ZfQUNDVV9ISUdILCAmaGlnaCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXhpdDsKKworCS8qIENoZWNrIGZvciBzaWduIGJpdCBpbiBjYXNlIG9mIG5lZ2F0aXZlIHZhbHVlLCAyJ3MgY29tcGxpbWVudCAqLworCWlmIChoaWdoICYgMHgxMCkKKwkJdmFsID0gKGxvdyB8IChtZWQgPDwgOCkgfCAoaGlnaCA8PCAxNikgfCAweEZGRTAwMDAwKTsKKwllbHNlCisJCXZhbCA9IChsb3cgfCAobWVkIDw8IDgpIHwgKGhpZ2ggPDwgMTYpKTsKKworCS8qCisJICogQ29udmVydCB0byB1QWgKKwkgKiBHaXZlbiBhIDI1MG1zIGNvbnZlcnNpb24gY3ljbGUgdGltZSB0aGUgTFNCIGNvcnJlc3BvbmRzCisJICogdG8gMTEyLjkgbkFoLgorCSAqIDExMi45bkFoIGFzc3VtZXMgMTBtT2htLCBidXQgZmdfcmVzIGlzIGluIDAuMW1PaG0KKwkgKi8KKwlkaS0+YWNjdV9jaGFyZ2UgPSAodmFsICogUUxTQl9OQU5PX0FNUF9IT1VSU19YMTApIC8KKwkJKDEwMCAqIGRpLT5ibS0+ZmdfcmVzKTsKKworCS8qCisJICogQ29udmVydCB0byB1bml0IHZhbHVlIGluIG1BCisJICogYnkgZGl2aWRpbmcgYnkgdGhlIGNvbnZlcnNpb24KKwkgKiB0aW1lIGluIGhvdXJzICg9IHNhbXBsZXMgLyAoMzYwMCAqIDQpaCkKKwkgKiBhbmQgbXVsdGlwbHkgd2l0aCAxMDAwCisJICovCisJZGktPmF2Z19jdXJyID0gKHZhbCAqIFFMU0JfTkFOT19BTVBfSE9VUlNfWDEwICogMzYpIC8KKwkJKDEwMDAgKiBkaS0+Ym0tPmZnX3JlcyAqIChkaS0+Zmdfc2FtcGxlcyAvIDQpKTsKKworCWRpLT5mbGFncy5jb252X2RvbmUgPSB0cnVlOworCisJbXV0ZXhfdW5sb2NrKCZkaS0+Y2NfbG9jayk7CisKKwlxdWV1ZV93b3JrKGRpLT5mZ193cSwgJmRpLT5mZ193b3JrKTsKKworCWRldl9kYmcoZGktPmRldiwgImZnX3JlczogJWQsIGZnX3NhbXBsZXM6ICVkLCBnYXNnOiAlZCwgYWNjdV9jaGFyZ2U6ICVkIFxuIiwKKwkJCQlkaS0+Ym0tPmZnX3JlcywgZGktPmZnX3NhbXBsZXMsIHZhbCwgZGktPmFjY3VfY2hhcmdlKTsKKwlyZXR1cm47CitleGl0OgorCWRldl9lcnIoZGktPmRldiwKKwkJIkZhaWxlZCB0byByZWFkIG9yIHdyaXRlIGdhcyBnYXVnZSByZWdpc3RlcnNcbiIpOworCW11dGV4X3VubG9jaygmZGktPmNjX2xvY2spOworCXF1ZXVlX3dvcmsoZGktPmZnX3dxLCAmZGktPmZnX3dvcmspOworfQorCisvKioKKyAqIGFiODUwMF9mZ19iYXRfdm9sdGFnZSgpIC0gZ2V0IGJhdHRlcnkgdm9sdGFnZQorICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2ZnIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgYmF0dGVyeSB2b2x0YWdlKG9uIHN1Y2Nlc3MpIGVsc2UgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGFiODUwMF9mZ19iYXRfdm9sdGFnZShzdHJ1Y3QgYWI4NTAwX2ZnICpkaSkKK3sKKwlpbnQgdmJhdDsKKwlzdGF0aWMgaW50IHByZXY7CisKKwl2YmF0ID0gYWI4NTAwX2dwYWRjX2NvbnZlcnQoZGktPmdwYWRjLCBNQUlOX0JBVF9WKTsKKwlpZiAodmJhdCA8IDApIHsKKwkJZGV2X2VycihkaS0+ZGV2LAorCQkJIiVzIGdwYWRjIGNvbnZlcnNpb24gZmFpbGVkLCB1c2luZyBwcmV2aW91cyB2YWx1ZVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIHByZXY7CisJfQorCisJcHJldiA9IHZiYXQ7CisJcmV0dXJuIHZiYXQ7Cit9CisKKy8qKgorICogYWI4NTAwX2ZnX3ZvbHRfdG9fY2FwYWNpdHkoKSAtIFZvbHRhZ2UgYmFzZWQgY2FwYWNpdHkKKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKKyAqIEB2b2x0YWdlOglUaGUgdm9sdGFnZSB0byBjb252ZXJ0IHRvIGEgY2FwYWNpdHkKKyAqCisgKiBSZXR1cm5zIGJhdHRlcnkgY2FwYWNpdHkgaW4gcGVyIG1pbGxlIGJhc2VkIG9uIHZvbHRhZ2UKKyAqLworc3RhdGljIGludCBhYjg1MDBfZmdfdm9sdF90b19jYXBhY2l0eShzdHJ1Y3QgYWI4NTAwX2ZnICpkaSwgaW50IHZvbHRhZ2UpCit7CisJaW50IGksIHRibF9zaXplOworCWNvbnN0IHN0cnVjdCBhYng1MDBfdl90b19jYXAgKnRibDsKKwlpbnQgY2FwID0gMDsKKworCXRibCA9IGRpLT5ibS0+YmF0X3R5cGVbZGktPmJtLT5iYXR0X2lkXS52X3RvX2NhcF90YmwsCisJdGJsX3NpemUgPSBkaS0+Ym0tPmJhdF90eXBlW2RpLT5ibS0+YmF0dF9pZF0ubl92X2NhcF90YmxfZWxlbWVudHM7CisKKwlmb3IgKGkgPSAwOyBpIDwgdGJsX3NpemU7ICsraSkgeworCQlpZiAodm9sdGFnZSA+IHRibFtpXS52b2x0YWdlKQorCQkJYnJlYWs7CisJfQorCisJaWYgKChpID4gMCkgJiYgKGkgPCB0Ymxfc2l6ZSkpIHsKKwkJY2FwID0gaW50ZXJwb2xhdGUodm9sdGFnZSwKKwkJCXRibFtpXS52b2x0YWdlLAorCQkJdGJsW2ldLmNhcGFjaXR5ICogMTAsCisJCQl0YmxbaS0xXS52b2x0YWdlLAorCQkJdGJsW2ktMV0uY2FwYWNpdHkgKiAxMCk7CisJfSBlbHNlIGlmIChpID09IDApIHsKKwkJY2FwID0gMTAwMDsKKwl9IGVsc2UgeworCQljYXAgPSAwOworCX0KKworCWRldl9kYmcoZGktPmRldiwgIiVzIFZiYXQ6ICVkLCBDYXA6ICVkIHBlciBtaWxsZSIsCisJCV9fZnVuY19fLCB2b2x0YWdlLCBjYXApOworCisJcmV0dXJuIGNhcDsKK30KKworLyoqCisgKiBhYjg1MDBfZmdfdW5jb21wX3ZvbHRfdG9fY2FwYWNpdHkoKSAtIFVuY29tcGVuc2F0ZWQgdm9sdGFnZSBiYXNlZCBjYXBhY2l0eQorICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2ZnIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgYmF0dGVyeSBjYXBhY2l0eSBiYXNlZCBvbiBiYXR0ZXJ5IHZvbHRhZ2UgdGhhdCBpcyBub3QgY29tcGVuc2F0ZWQKKyAqIGZvciB0aGUgdm9sdGFnZSBkcm9wIGR1ZSB0byB0aGUgbG9hZAorICovCitzdGF0aWMgaW50IGFiODUwMF9mZ191bmNvbXBfdm9sdF90b19jYXBhY2l0eShzdHJ1Y3QgYWI4NTAwX2ZnICpkaSkKK3sKKwlkaS0+dmJhdCA9IGFiODUwMF9mZ19iYXRfdm9sdGFnZShkaSk7CisJcmV0dXJuIGFiODUwMF9mZ192b2x0X3RvX2NhcGFjaXR5KGRpLCBkaS0+dmJhdCk7Cit9CisKKy8qKgorICogYWI4NTAwX2ZnX2JhdHRlcnlfcmVzaXN0YW5jZSgpIC0gUmV0dXJucyB0aGUgYmF0dGVyeSBpbm5lciByZXNpc3RhbmNlCisgKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfZmcgc3RydWN0dXJlCisgKgorICogUmV0dXJucyBiYXR0ZXJ5IGlubmVyIHJlc2lzdGFuY2UgYWRkZWQgd2l0aCB0aGUgZnVlbCBnYXVnZSByZXNpc3RvciB2YWx1ZQorICogdG8gZ2V0IHRoZSB0b3RhbCByZXNpc3RhbmNlIGluIHRoZSB3aG9sZSBsaW5rIGZyb20gZ25kIHRvIGJhdCsgbm9kZS4KKyAqLworc3RhdGljIGludCBhYjg1MDBfZmdfYmF0dGVyeV9yZXNpc3RhbmNlKHN0cnVjdCBhYjg1MDBfZmcgKmRpKQoreworCWludCBpLCB0Ymxfc2l6ZTsKKwljb25zdCBzdHJ1Y3QgYmF0cmVzX3ZzX3RlbXAgKnRibDsKKwlpbnQgcmVzaXN0ID0gMDsKKworCXRibCA9IGRpLT5ibS0+YmF0X3R5cGVbZGktPmJtLT5iYXR0X2lkXS5iYXRyZXNfdGJsOworCXRibF9zaXplID0gZGktPmJtLT5iYXRfdHlwZVtkaS0+Ym0tPmJhdHRfaWRdLm5fYmF0cmVzX3RibF9lbGVtZW50czsKKworCWZvciAoaSA9IDA7IGkgPCB0Ymxfc2l6ZTsgKytpKSB7CisJCWlmIChkaS0+YmF0X3RlbXAgLyAxMCA+IHRibFtpXS50ZW1wKQorCQkJYnJlYWs7CisJfQorCisJaWYgKChpID4gMCkgJiYgKGkgPCB0Ymxfc2l6ZSkpIHsKKwkJcmVzaXN0ID0gaW50ZXJwb2xhdGUoZGktPmJhdF90ZW1wIC8gMTAsCisJCQl0YmxbaV0udGVtcCwKKwkJCXRibFtpXS5yZXNpc3QsCisJCQl0YmxbaS0xXS50ZW1wLAorCQkJdGJsW2ktMV0ucmVzaXN0KTsKKwl9IGVsc2UgaWYgKGkgPT0gMCkgeworCQlyZXNpc3QgPSB0YmxbMF0ucmVzaXN0OworCX0gZWxzZSB7CisJCXJlc2lzdCA9IHRibFt0Ymxfc2l6ZSAtIDFdLnJlc2lzdDsKKwl9CisKKwlkZXZfZGJnKGRpLT5kZXYsICIlcyBUZW1wOiAlZCBiYXR0ZXJ5IGludGVybmFsIHJlc2lzdGFuY2U6ICVkIgorCSAgICAiIGZnIHJlc2lzdGFuY2UgJWQsIHRvdGFsOiAlZCAobU9obSlcbiIsCisJCV9fZnVuY19fLCBkaS0+YmF0X3RlbXAsIHJlc2lzdCwgZGktPmJtLT5mZ19yZXMgLyAxMCwKKwkJKGRpLT5ibS0+ZmdfcmVzIC8gMTApICsgcmVzaXN0KTsKKworCS8qIGZnX3JlcyB2YXJpYWJsZSBpcyBpbiAwLjFtT2htICovCisJcmVzaXN0ICs9IGRpLT5ibS0+ZmdfcmVzIC8gMTA7CisKKwlyZXR1cm4gcmVzaXN0OworfQorCisvKioKKyAqIGFiODUwMF9mZ19sb2FkX2NvbXBfdm9sdF90b19jYXBhY2l0eSgpIC0gTG9hZCBjb21wZW5zYXRlZCB2b2x0YWdlIGJhc2VkIGNhcGFjaXR5CisgKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfZmcgc3RydWN0dXJlCisgKgorICogUmV0dXJucyBiYXR0ZXJ5IGNhcGFjaXR5IGJhc2VkIG9uIGJhdHRlcnkgdm9sdGFnZSB0aGF0IGlzIGxvYWQgY29tcGVuc2F0ZWQKKyAqIGZvciB0aGUgdm9sdGFnZSBkcm9wCisgKi8KK3N0YXRpYyBpbnQgYWI4NTAwX2ZnX2xvYWRfY29tcF92b2x0X3RvX2NhcGFjaXR5KHN0cnVjdCBhYjg1MDBfZmcgKmRpKQoreworCWludCB2YmF0X2NvbXAsIHJlczsKKwlpbnQgaSA9IDA7CisJaW50IHZiYXQgPSAwOworCisJYWI4NTAwX2ZnX2luc3RfY3Vycl9zdGFydChkaSk7CisKKwlkbyB7CisJCXZiYXQgKz0gYWI4NTAwX2ZnX2JhdF92b2x0YWdlKGRpKTsKKwkJaSsrOworCQl1c2xlZXBfcmFuZ2UoNTAwMCwgNjAwMCk7CisJfSB3aGlsZSAoIWFiODUwMF9mZ19pbnN0X2N1cnJfZG9uZShkaSkpOworCisJYWI4NTAwX2ZnX2luc3RfY3Vycl9maW5hbGl6ZShkaSwgJmRpLT5pbnN0X2N1cnIpOworCisJZGktPnZiYXQgPSB2YmF0IC8gaTsKKwlyZXMgPSBhYjg1MDBfZmdfYmF0dGVyeV9yZXNpc3RhbmNlKGRpKTsKKworCS8qIFVzZSBPaG1zIGxhdyB0byBnZXQgdGhlIGxvYWQgY29tcGVuc2F0ZWQgdm9sdGFnZSAqLworCXZiYXRfY29tcCA9IGRpLT52YmF0IC0gKGRpLT5pbnN0X2N1cnIgKiByZXMpIC8gMTAwMDsKKworCWRldl9kYmcoZGktPmRldiwgIiVzIE1lYXN1cmVkIFZiYXQ6ICVkbVYsQ29tcGVuc2F0ZWQgVmJhdCAlZG1WLCAiCisJCSJSOiAlZG1PaG0sIEN1cnJlbnQ6ICVkbUEgVmJhdCBTYW1wbGVzOiAlZFxuIiwKKwkJX19mdW5jX18sIGRpLT52YmF0LCB2YmF0X2NvbXAsIHJlcywgZGktPmluc3RfY3VyciwgaSk7CisKKwlyZXR1cm4gYWI4NTAwX2ZnX3ZvbHRfdG9fY2FwYWNpdHkoZGksIHZiYXRfY29tcCk7Cit9CisKKy8qKgorICogYWI4NTAwX2ZnX2NvbnZlcnRfbWFoX3RvX3Blcm1pbGxlKCkgLSBDYXBhY2l0eSBpbiBtQWggdG8gcGVybWlsbGUKKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKKyAqIEBjYXBfbWFoOgljYXBhY2l0eSBpbiBtQWgKKyAqCisgKiBDb252ZXJ0cyBjYXBhY2l0eSBpbiBtQWggdG8gY2FwYWNpdHkgaW4gcGVybWlsbGUKKyAqLworc3RhdGljIGludCBhYjg1MDBfZmdfY29udmVydF9tYWhfdG9fcGVybWlsbGUoc3RydWN0IGFiODUwMF9mZyAqZGksIGludCBjYXBfbWFoKQoreworCXJldHVybiAoY2FwX21haCAqIDEwMDApIC8gZGktPmJhdF9jYXAubWF4X21haF9kZXNpZ247Cit9CisKKy8qKgorICogYWI4NTAwX2ZnX2NvbnZlcnRfcGVybWlsbGVfdG9fbWFoKCkgLSBDYXBhY2l0eSBpbiBwZXJtaWxsZSB0byBtQWgKKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKKyAqIEBjYXBfcG06CWNhcGFjaXR5IGluIHBlcm1pbGxlCisgKgorICogQ29udmVydHMgY2FwYWNpdHkgaW4gcGVybWlsbGUgdG8gY2FwYWNpdHkgaW4gbUFoCisgKi8KK3N0YXRpYyBpbnQgYWI4NTAwX2ZnX2NvbnZlcnRfcGVybWlsbGVfdG9fbWFoKHN0cnVjdCBhYjg1MDBfZmcgKmRpLCBpbnQgY2FwX3BtKQoreworCXJldHVybiBjYXBfcG0gKiBkaS0+YmF0X2NhcC5tYXhfbWFoX2Rlc2lnbiAvIDEwMDA7Cit9CisKKy8qKgorICogYWI4NTAwX2ZnX2NvbnZlcnRfbWFoX3RvX3V3aCgpIC0gQ2FwYWNpdHkgaW4gbUFoIHRvIHVXaAorICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2ZnIHN0cnVjdHVyZQorICogQGNhcF9tYWg6CWNhcGFjaXR5IGluIG1BaAorICoKKyAqIENvbnZlcnRzIGNhcGFjaXR5IGluIG1BaCB0byBjYXBhY2l0eSBpbiB1V2gKKyAqLworc3RhdGljIGludCBhYjg1MDBfZmdfY29udmVydF9tYWhfdG9fdXdoKHN0cnVjdCBhYjg1MDBfZmcgKmRpLCBpbnQgY2FwX21haCkKK3sKKwl1NjQgZGl2X3JlczsKKwl1MzIgZGl2X3JlbTsKKworCWRpdl9yZXMgPSAoKHU2NCkgY2FwX21haCkgKiAoKHU2NCkgZGktPnZiYXRfbm9tKTsKKwlkaXZfcmVtID0gZG9fZGl2KGRpdl9yZXMsIDEwMDApOworCisJLyogTWFrZSBzdXJlIHRvIHJvdW5kIHVwd2FyZHMgaWYgbmVjZXNzYXJ5ICovCisJaWYgKGRpdl9yZW0gPj0gMTAwMCAvIDIpCisJCWRpdl9yZXMrKzsKKworCXJldHVybiAoaW50KSBkaXZfcmVzOworfQorCisvKioKKyAqIGFiODUwMF9mZ19jYWxjX2NhcF9jaGFyZ2luZygpIC0gQ2FsY3VsYXRlIHJlbWFpbmluZyBjYXBhY2l0eSB3aGlsZSBjaGFyZ2luZworICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2ZnIHN0cnVjdHVyZQorICoKKyAqIFJldHVybiB0aGUgY2FwYWNpdHkgaW4gbUFoIGJhc2VkIG9uIHByZXZpb3VzIGNhbGN1bGF0ZWQgY2FwY2l0eSBhbmQgdGhlIEZHCisgKiBhY2N1bXVsYXRvciByZWdpc3RlciB2YWx1ZS4gVGhlIGZpbHRlciBpcyBmaWxsZWQgd2l0aCB0aGlzIGNhcGFjaXR5CisgKi8KK3N0YXRpYyBpbnQgYWI4NTAwX2ZnX2NhbGNfY2FwX2NoYXJnaW5nKHN0cnVjdCBhYjg1MDBfZmcgKmRpKQoreworCWRldl9kYmcoZGktPmRldiwgIiVzIGNhcF9tYWggJWQgYWNjdV9jaGFyZ2UgJWRcbiIsCisJCV9fZnVuY19fLAorCQlkaS0+YmF0X2NhcC5tYWgsCisJCWRpLT5hY2N1X2NoYXJnZSk7CisKKwkvKiBDYXBhY2l0eSBzaG91bGQgbm90IGJlIGxlc3MgdGhhbiAwICovCisJaWYgKGRpLT5iYXRfY2FwLm1haCArIGRpLT5hY2N1X2NoYXJnZSA+IDApCisJCWRpLT5iYXRfY2FwLm1haCArPSBkaS0+YWNjdV9jaGFyZ2U7CisJZWxzZQorCQlkaS0+YmF0X2NhcC5tYWggPSAwOworCS8qCisJICogV2UgZm9yY2UgY2FwYWNpdHkgdG8gMTAwJSBvbmNlIHdoZW4gdGhlIGFsZ29yaXRobQorCSAqIHJlcG9ydHMgdGhhdCBpdCdzIGZ1bGwuCisJICovCisJaWYgKGRpLT5iYXRfY2FwLm1haCA+PSBkaS0+YmF0X2NhcC5tYXhfbWFoX2Rlc2lnbiB8fAorCQlkaS0+ZmxhZ3MuZm9yY2VfZnVsbCkgeworCQlkaS0+YmF0X2NhcC5tYWggPSBkaS0+YmF0X2NhcC5tYXhfbWFoX2Rlc2lnbjsKKwl9CisKKwlhYjg1MDBfZmdfZmlsbF9jYXBfc2FtcGxlKGRpLCBkaS0+YmF0X2NhcC5tYWgpOworCWRpLT5iYXRfY2FwLnBlcm1pbGxlID0KKwkJYWI4NTAwX2ZnX2NvbnZlcnRfbWFoX3RvX3Blcm1pbGxlKGRpLCBkaS0+YmF0X2NhcC5tYWgpOworCisJLyogV2UgbmVlZCB0byB1cGRhdGUgYmF0dGVyeSB2b2x0YWdlIGFuZCBpbnN0IGN1cnJlbnQgd2hlbiBjaGFyZ2luZyAqLworCWRpLT52YmF0ID0gYWI4NTAwX2ZnX2JhdF92b2x0YWdlKGRpKTsKKwlkaS0+aW5zdF9jdXJyID0gYWI4NTAwX2ZnX2luc3RfY3Vycl9ibG9ja2luZyhkaSk7CisKKwlyZXR1cm4gZGktPmJhdF9jYXAubWFoOworfQorCisvKioKKyAqIGFiODUwMF9mZ19jYWxjX2NhcF9kaXNjaGFyZ2Vfdm9sdGFnZSgpIC0gQ2FwYWNpdHkgaW4gZGlzY2hhcmdlIHdpdGggdm9sdGFnZQorICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2ZnIHN0cnVjdHVyZQorICogQGNvbXA6CWlmIHZvbHRhZ2Ugc2hvdWxkIGJlIGxvYWQgY29tcGVuc2F0ZWQgYmVmb3JlIGNhcGFjaXR5IGNhbGMKKyAqCisgKiBSZXR1cm4gdGhlIGNhcGFjaXR5IGluIG1BaCBiYXNlZCBvbiB0aGUgYmF0dGVyeSB2b2x0YWdlLiBUaGUgdm9sdGFnZSBjYW4KKyAqIGVpdGhlciBiZSBsb2FkIGNvbXBlbnNhdGVkIG9yIG5vdC4gVGhpcyB2YWx1ZSBpcyBhZGRlZCB0byB0aGUgZmlsdGVyIGFuZCBhCisgKiBuZXcgbWVhbiB2YWx1ZSBpcyBjYWxjdWxhdGVkIGFuZCByZXR1cm5lZC4KKyAqLworc3RhdGljIGludCBhYjg1MDBfZmdfY2FsY19jYXBfZGlzY2hhcmdlX3ZvbHRhZ2Uoc3RydWN0IGFiODUwMF9mZyAqZGksIGJvb2wgY29tcCkKK3sKKwlpbnQgcGVybWlsbGUsIG1haDsKKworCWlmIChjb21wKQorCQlwZXJtaWxsZSA9IGFiODUwMF9mZ19sb2FkX2NvbXBfdm9sdF90b19jYXBhY2l0eShkaSk7CisJZWxzZQorCQlwZXJtaWxsZSA9IGFiODUwMF9mZ191bmNvbXBfdm9sdF90b19jYXBhY2l0eShkaSk7CisKKwltYWggPSBhYjg1MDBfZmdfY29udmVydF9wZXJtaWxsZV90b19tYWgoZGksIHBlcm1pbGxlKTsKKworCWRpLT5iYXRfY2FwLm1haCA9IGFiODUwMF9mZ19hZGRfY2FwX3NhbXBsZShkaSwgbWFoKTsKKwlkaS0+YmF0X2NhcC5wZXJtaWxsZSA9CisJCWFiODUwMF9mZ19jb252ZXJ0X21haF90b19wZXJtaWxsZShkaSwgZGktPmJhdF9jYXAubWFoKTsKKworCXJldHVybiBkaS0+YmF0X2NhcC5tYWg7Cit9CisKKy8qKgorICogYWI4NTAwX2ZnX2NhbGNfY2FwX2Rpc2NoYXJnZV9mZygpIC0gQ2FwYWNpdHkgaW4gZGlzY2hhcmdlIHdpdGggRkcKKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm4gdGhlIGNhcGFjaXR5IGluIG1BaCBiYXNlZCBvbiBwcmV2aW91cyBjYWxjdWxhdGVkIGNhcGNpdHkgYW5kIHRoZSBGRworICogYWNjdW11bGF0b3IgcmVnaXN0ZXIgdmFsdWUuIFRoaXMgdmFsdWUgaXMgYWRkZWQgdG8gdGhlIGZpbHRlciBhbmQgYQorICogbmV3IG1lYW4gdmFsdWUgaXMgY2FsY3VsYXRlZCBhbmQgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBpbnQgYWI4NTAwX2ZnX2NhbGNfY2FwX2Rpc2NoYXJnZV9mZyhzdHJ1Y3QgYWI4NTAwX2ZnICpkaSkKK3sKKwlpbnQgcGVybWlsbGVfdm9sdCwgcGVybWlsbGU7CisKKwlkZXZfZGJnKGRpLT5kZXYsICIlcyBjYXBfbWFoICVkIGFjY3VfY2hhcmdlICVkXG4iLAorCQlfX2Z1bmNfXywKKwkJZGktPmJhdF9jYXAubWFoLAorCQlkaS0+YWNjdV9jaGFyZ2UpOworCisJLyogQ2FwYWNpdHkgc2hvdWxkIG5vdCBiZSBsZXNzIHRoYW4gMCAqLworCWlmIChkaS0+YmF0X2NhcC5tYWggKyBkaS0+YWNjdV9jaGFyZ2UgPiAwKQorCQlkaS0+YmF0X2NhcC5tYWggKz0gZGktPmFjY3VfY2hhcmdlOworCWVsc2UKKwkJZGktPmJhdF9jYXAubWFoID0gMDsKKworCWlmIChkaS0+YmF0X2NhcC5tYWggPj0gZGktPmJhdF9jYXAubWF4X21haF9kZXNpZ24pCisJCWRpLT5iYXRfY2FwLm1haCA9IGRpLT5iYXRfY2FwLm1heF9tYWhfZGVzaWduOworCisJLyoKKwkgKiBDaGVjayBhZ2FpbnN0IHZvbHRhZ2UgYmFzZWQgY2FwYWNpdHkuIEl0IGNhbiBub3QgYmUgbG93ZXIKKwkgKiB0aGFuIHdoYXQgdGhlIHVuY29tcGVuc2F0ZWQgdm9sdGFnZSBzYXlzCisJICovCisJcGVybWlsbGUgPSBhYjg1MDBfZmdfY29udmVydF9tYWhfdG9fcGVybWlsbGUoZGksIGRpLT5iYXRfY2FwLm1haCk7CisJcGVybWlsbGVfdm9sdCA9IGFiODUwMF9mZ191bmNvbXBfdm9sdF90b19jYXBhY2l0eShkaSk7CisKKwlpZiAocGVybWlsbGUgPCBwZXJtaWxsZV92b2x0KSB7CisJCWRpLT5iYXRfY2FwLnBlcm1pbGxlID0gcGVybWlsbGVfdm9sdDsKKwkJZGktPmJhdF9jYXAubWFoID0gYWI4NTAwX2ZnX2NvbnZlcnRfcGVybWlsbGVfdG9fbWFoKGRpLAorCQkJZGktPmJhdF9jYXAucGVybWlsbGUpOworCisJCWRldl9kYmcoZGktPmRldiwgIiVzIHZvbHRhZ2UgYmFzZWQ6IHBlcm0gJWQgcGVybV92b2x0ICVkXG4iLAorCQkJX19mdW5jX18sCisJCQlwZXJtaWxsZSwKKwkJCXBlcm1pbGxlX3ZvbHQpOworCisJCWFiODUwMF9mZ19maWxsX2NhcF9zYW1wbGUoZGksIGRpLT5iYXRfY2FwLm1haCk7CisJfSBlbHNlIHsKKwkJYWI4NTAwX2ZnX2ZpbGxfY2FwX3NhbXBsZShkaSwgZGktPmJhdF9jYXAubWFoKTsKKwkJZGktPmJhdF9jYXAucGVybWlsbGUgPQorCQkJYWI4NTAwX2ZnX2NvbnZlcnRfbWFoX3RvX3Blcm1pbGxlKGRpLCBkaS0+YmF0X2NhcC5tYWgpOworCX0KKworCXJldHVybiBkaS0+YmF0X2NhcC5tYWg7Cit9CisKKy8qKgorICogYWI4NTAwX2ZnX2NhcGFjaXR5X2xldmVsKCkgLSBHZXQgdGhlIGJhdHRlcnkgY2FwYWNpdHkgbGV2ZWwKKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKKyAqCisgKiBHZXQgdGhlIGJhdHRlcnkgY2FwYWNpdHkgbGV2ZWwgYmFzZWQgb24gdGhlIGNhcGFjaXR5IGluIHBlcmNlbnQKKyAqLworc3RhdGljIGludCBhYjg1MDBfZmdfY2FwYWNpdHlfbGV2ZWwoc3RydWN0IGFiODUwMF9mZyAqZGkpCit7CisJaW50IHJldCwgcGVyY2VudDsKKworCXBlcmNlbnQgPSBESVZfUk9VTkRfQ0xPU0VTVChkaS0+YmF0X2NhcC5wZXJtaWxsZSwgMTApOworCisJaWYgKHBlcmNlbnQgPD0gZGktPmJtLT5jYXBfbGV2ZWxzLT5jcml0aWNhbCB8fAorCQlkaS0+ZmxhZ3MubG93X2JhdCkKKwkJcmV0ID0gUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX0NSSVRJQ0FMOworCWVsc2UgaWYgKHBlcmNlbnQgPD0gZGktPmJtLT5jYXBfbGV2ZWxzLT5sb3cpCisJCXJldCA9IFBPV0VSX1NVUFBMWV9DQVBBQ0lUWV9MRVZFTF9MT1c7CisJZWxzZSBpZiAocGVyY2VudCA8PSBkaS0+Ym0tPmNhcF9sZXZlbHMtPm5vcm1hbCkKKwkJcmV0ID0gUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX05PUk1BTDsKKwllbHNlIGlmIChwZXJjZW50IDw9IGRpLT5ibS0+Y2FwX2xldmVscy0+aGlnaCkKKwkJcmV0ID0gUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX0hJR0g7CisJZWxzZQorCQlyZXQgPSBQT1dFUl9TVVBQTFlfQ0FQQUNJVFlfTEVWRUxfRlVMTDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYWI4NTAwX2ZnX2NhbGN1bGF0ZV9zY2FsZWRfY2FwYWNpdHkoKSAtIENhcGFjaXR5IHNjYWxpbmcKKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKKyAqCisgKiBDYWxjdWxhdGVzIHRoZSBjYXBhY2l0eSB0byBiZSBzaG93biB0byB1cHBlciBsYXllcnMuIFNjYWxlcyB0aGUgY2FwYWNpdHkKKyAqIHRvIGhhdmUgMTAwJSBhcyBhIHJlZmVyZW5jZSBmcm9tIHRoZSBhY3R1YWwgY2FwYWNpdHkgdXBvbiByZW1vdmFsIG9mIGNoYXJnZXIKKyAqIHdoZW4gY2hhcmdpbmcgaXMgaW4gbWFpbnRlbmFuY2UgbW9kZS4KKyAqLworc3RhdGljIGludCBhYjg1MDBfZmdfY2FsY3VsYXRlX3NjYWxlZF9jYXBhY2l0eShzdHJ1Y3QgYWI4NTAwX2ZnICpkaSkKK3sKKwlzdHJ1Y3QgYWI4NTAwX2ZnX2NhcF9zY2FsaW5nICpjcyA9ICZkaS0+YmF0X2NhcC5jYXBfc2NhbGU7CisJaW50IGNhcGFjaXR5ID0gZGktPmJhdF9jYXAucHJldl9wZXJjZW50OworCisJaWYgKCFjcy0+ZW5hYmxlKQorCQlyZXR1cm4gY2FwYWNpdHk7CisKKwkvKgorCSAqIEFzIGxvbmcgYXMgd2UgYXJlIGluIGZ1bGx5IGNoYXJnZSBtb2RlIHNjYWxlIHRoZSBjYXBhY2l0eQorCSAqIHRvIHNob3cgMTAwJS4KKwkgKi8KKwlpZiAoZGktPmZsYWdzLmZ1bGx5X2NoYXJnZWQpIHsKKwkJY3MtPmNhcF90b19zY2FsZVswXSA9IDEwMDsKKwkJY3MtPmNhcF90b19zY2FsZVsxXSA9CisJCQltYXgoY2FwYWNpdHksIGRpLT5ibS0+ZmdfcGFyYW1zLT5tYWludF90aHJlcyk7CisJCWRldl9kYmcoZGktPmRldiwgIlNjYWxlIGNhcCB3aXRoICVkLyVkXG4iLAorCQkJIGNzLT5jYXBfdG9fc2NhbGVbMF0sIGNzLT5jYXBfdG9fc2NhbGVbMV0pOworCX0KKworCS8qIENhbGN1bGF0ZXMgdGhlIHNjYWxlZCBjYXBhY2l0eS4gKi8KKwlpZiAoKGNzLT5jYXBfdG9fc2NhbGVbMF0gIT0gY3MtPmNhcF90b19zY2FsZVsxXSkKKwkJCQkJJiYgKGNzLT5jYXBfdG9fc2NhbGVbMV0gPiAwKSkKKwkJY2FwYWNpdHkgPSBtaW4oMTAwLAorCQkJCSBESVZfUk9VTkRfQ0xPU0VTVChkaS0+YmF0X2NhcC5wcmV2X3BlcmNlbnQgKgorCQkJCQkJIGNzLT5jYXBfdG9fc2NhbGVbMF0sCisJCQkJCQkgY3MtPmNhcF90b19zY2FsZVsxXSkpOworCisJaWYgKGRpLT5mbGFncy5jaGFyZ2luZykgeworCQlpZiAoY2FwYWNpdHkgPCBjcy0+ZGlzYWJsZV9jYXBfbGV2ZWwpIHsKKwkJCWNzLT5kaXNhYmxlX2NhcF9sZXZlbCA9IGNhcGFjaXR5OworCQkJZGV2X2RiZyhkaS0+ZGV2LCAiQ2FwIHRvIHN0b3Agc2NhbGUgbG93ZXJlZCAlZCUlXG4iLAorCQkJCWNzLT5kaXNhYmxlX2NhcF9sZXZlbCk7CisJCX0gZWxzZSBpZiAoIWRpLT5mbGFncy5mdWxseV9jaGFyZ2VkKSB7CisJCQlpZiAoZGktPmJhdF9jYXAucHJldl9wZXJjZW50ID49CisJCQkgICAgY3MtPmRpc2FibGVfY2FwX2xldmVsKSB7CisJCQkJZGV2X2RiZyhkaS0+ZGV2LCAiRGlzYWJsaW5nIHNjYWxlZCBjYXBhY2l0eVxuIik7CisJCQkJY3MtPmVuYWJsZSA9IGZhbHNlOworCQkJCWNhcGFjaXR5ID0gZGktPmJhdF9jYXAucHJldl9wZXJjZW50OworCQkJfSBlbHNlIHsKKwkJCQlkZXZfZGJnKGRpLT5kZXYsCisJCQkJCSJXYWl0aW5nIGluIGNhcCB0byBsZXZlbCAlZCUlXG4iLAorCQkJCQljcy0+ZGlzYWJsZV9jYXBfbGV2ZWwpOworCQkJCWNhcGFjaXR5ID0gY3MtPmRpc2FibGVfY2FwX2xldmVsOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGNhcGFjaXR5OworfQorCisvKioKKyAqIGFiODUwMF9mZ191cGRhdGVfY2FwX3NjYWxlcnMoKSAtIENhcGFjaXR5IHNjYWxpbmcKKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKKyAqCisgKiBUbyBiZSBjYWxsZWQgd2hlbiBzdGF0ZSBjaGFuZ2UgZnJvbSBjaGFyZ2U8LT5kaXNjaGFyZ2UgdG8gdXBkYXRlCisgKiB0aGUgY2FwYWNpdHkgc2NhbGVycy4KKyAqLworc3RhdGljIHZvaWQgYWI4NTAwX2ZnX3VwZGF0ZV9jYXBfc2NhbGVycyhzdHJ1Y3QgYWI4NTAwX2ZnICpkaSkKK3sKKwlzdHJ1Y3QgYWI4NTAwX2ZnX2NhcF9zY2FsaW5nICpjcyA9ICZkaS0+YmF0X2NhcC5jYXBfc2NhbGU7CisKKwlpZiAoIWNzLT5lbmFibGUpCisJCXJldHVybjsKKwlpZiAoZGktPmZsYWdzLmNoYXJnaW5nKSB7CisJCWRpLT5iYXRfY2FwLmNhcF9zY2FsZS5kaXNhYmxlX2NhcF9sZXZlbCA9CisJCQlkaS0+YmF0X2NhcC5jYXBfc2NhbGUuc2NhbGVkX2NhcDsKKwkJZGV2X2RiZyhkaS0+ZGV2LCAiQ2FwIHRvIHN0b3Agc2NhbGUgYXQgY2hhcmdlICVkJSVcbiIsCisJCQkJZGktPmJhdF9jYXAuY2FwX3NjYWxlLmRpc2FibGVfY2FwX2xldmVsKTsKKwl9IGVsc2UgeworCQlpZiAoY3MtPnNjYWxlZF9jYXAgIT0gMTAwKSB7CisJCQljcy0+Y2FwX3RvX3NjYWxlWzBdID0gY3MtPnNjYWxlZF9jYXA7CisJCQljcy0+Y2FwX3RvX3NjYWxlWzFdID0gZGktPmJhdF9jYXAucHJldl9wZXJjZW50OworCQl9IGVsc2UgeworCQkJY3MtPmNhcF90b19zY2FsZVswXSA9IDEwMDsKKwkJCWNzLT5jYXBfdG9fc2NhbGVbMV0gPQorCQkJCW1heChkaS0+YmF0X2NhcC5wcmV2X3BlcmNlbnQsCisJCQkJICAgIGRpLT5ibS0+ZmdfcGFyYW1zLT5tYWludF90aHJlcyk7CisJCX0KKworCQlkZXZfZGJnKGRpLT5kZXYsICJDYXAgdG8gc2NhbGUgYXQgZGlzY2hhcmdlICVkLyVkXG4iLAorCQkJCWNzLT5jYXBfdG9fc2NhbGVbMF0sIGNzLT5jYXBfdG9fc2NhbGVbMV0pOworCX0KK30KKworLyoqCisgKiBhYjg1MDBfZmdfY2hlY2tfY2FwYWNpdHlfbGltaXRzKCkgLSBDaGVjayBpZiBjYXBhY2l0eSBoYXMgY2hhbmdlZAorICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2ZnIHN0cnVjdHVyZQorICogQGluaXQ6CWNhcGFjaXR5IGlzIGFsbG93ZWQgdG8gZ28gdXAgaW4gaW5pdCBtb2RlCisgKgorICogQ2hlY2sgaWYgY2FwYWNpdHkgb3IgY2FwYWNpdHkgbGltaXQgaGFzIGNoYW5nZWQgYW5kIG5vdGlmeSB0aGUgc3lzdGVtCisgKiBhYm91dCBpdCB1c2luZyB0aGUgcG93ZXJfc3VwcGx5IGZyYW1ld29yaworICovCitzdGF0aWMgdm9pZCBhYjg1MDBfZmdfY2hlY2tfY2FwYWNpdHlfbGltaXRzKHN0cnVjdCBhYjg1MDBfZmcgKmRpLCBib29sIGluaXQpCit7CisJYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisJaW50IHBlcmNlbnQgPSBESVZfUk9VTkRfQ0xPU0VTVChkaS0+YmF0X2NhcC5wZXJtaWxsZSwgMTApOworCisJZGktPmJhdF9jYXAubGV2ZWwgPSBhYjg1MDBfZmdfY2FwYWNpdHlfbGV2ZWwoZGkpOworCisJaWYgKGRpLT5iYXRfY2FwLmxldmVsICE9IGRpLT5iYXRfY2FwLnByZXZfbGV2ZWwpIHsKKwkJLyoKKwkJICogV2UgZG8gbm90IGFsbG93IHJlcG9ydGVkIGNhcGFjaXR5IGxldmVsIHRvIGdvIHVwCisJCSAqIHVubGVzcyB3ZSdyZSBjaGFyZ2luZyBvciBpZiB3ZSdyZSBpbiBpbml0CisJCSAqLworCQlpZiAoISghZGktPmZsYWdzLmNoYXJnaW5nICYmIGRpLT5iYXRfY2FwLmxldmVsID4KKwkJCWRpLT5iYXRfY2FwLnByZXZfbGV2ZWwpIHx8IGluaXQpIHsKKwkJCWRldl9kYmcoZGktPmRldiwgImxldmVsIGNoYW5nZWQgZnJvbSAlZCB0byAlZFxuIiwKKwkJCQlkaS0+YmF0X2NhcC5wcmV2X2xldmVsLAorCQkJCWRpLT5iYXRfY2FwLmxldmVsKTsKKwkJCWRpLT5iYXRfY2FwLnByZXZfbGV2ZWwgPSBkaS0+YmF0X2NhcC5sZXZlbDsKKwkJCWNoYW5nZWQgPSB0cnVlOworCQl9IGVsc2UgeworCQkJZGV2X2RiZyhkaS0+ZGV2LCAibGV2ZWwgbm90IGFsbG93ZWQgdG8gZ28gdXAgIgorCQkJCSJzaW5jZSBubyBjaGFyZ2VyIGlzIGNvbm5lY3RlZDogJWQgdG8gJWRcbiIsCisJCQkJZGktPmJhdF9jYXAucHJldl9sZXZlbCwKKwkJCQlkaS0+YmF0X2NhcC5sZXZlbCk7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIHdlIGhhdmUgcmVjZWl2ZWQgdGhlIExPV19CQVQgSVJRLCBzZXQgY2FwYWNpdHkgdG8gMCB0byBpbml0aWF0ZQorCSAqIHNodXRkb3duCisJICovCisJaWYgKGRpLT5mbGFncy5sb3dfYmF0KSB7CisJCWRldl9kYmcoZGktPmRldiwgIkJhdHRlcnkgbG93LCBzZXQgY2FwYWNpdHkgdG8gMFxuIik7CisJCWRpLT5iYXRfY2FwLnByZXZfcGVyY2VudCA9IDA7CisJCWRpLT5iYXRfY2FwLnBlcm1pbGxlID0gMDsKKwkJcGVyY2VudCA9IDA7CisJCWRpLT5iYXRfY2FwLnByZXZfbWFoID0gMDsKKwkJZGktPmJhdF9jYXAubWFoID0gMDsKKwkJY2hhbmdlZCA9IHRydWU7CisJfSBlbHNlIGlmIChkaS0+ZmxhZ3MuZnVsbHlfY2hhcmdlZCkgeworCQkvKgorCQkgKiBXZSByZXBvcnQgMTAwJSBpZiBhbGdvcml0aG0gcmVwb3J0ZWQgZnVsbHkgY2hhcmdlZAorCQkgKiBhbmQgc2hvdyAxMDAlIGR1cmluZyBtYWludGVuYW5jZSBjaGFyZ2luZyAoc2NhbGluZykuCisJCSAqLworCQlpZiAoZGktPmZsYWdzLmZvcmNlX2Z1bGwpIHsKKwkJCWRpLT5iYXRfY2FwLnByZXZfcGVyY2VudCA9IHBlcmNlbnQ7CisJCQlkaS0+YmF0X2NhcC5wcmV2X21haCA9IGRpLT5iYXRfY2FwLm1haDsKKworCQkJY2hhbmdlZCA9IHRydWU7CisKKwkJCWlmICghZGktPmJhdF9jYXAuY2FwX3NjYWxlLmVuYWJsZSAmJgorCQkJCQkJZGktPmJtLT5jYXBhY2l0eV9zY2FsaW5nKSB7CisJCQkJZGktPmJhdF9jYXAuY2FwX3NjYWxlLmVuYWJsZSA9IHRydWU7CisJCQkJZGktPmJhdF9jYXAuY2FwX3NjYWxlLmNhcF90b19zY2FsZVswXSA9IDEwMDsKKwkJCQlkaS0+YmF0X2NhcC5jYXBfc2NhbGUuY2FwX3RvX3NjYWxlWzFdID0KKwkJCQkJCWRpLT5iYXRfY2FwLnByZXZfcGVyY2VudDsKKwkJCQlkaS0+YmF0X2NhcC5jYXBfc2NhbGUuZGlzYWJsZV9jYXBfbGV2ZWwgPSAxMDA7CisJCQl9CisJCX0gZWxzZSBpZiAoZGktPmJhdF9jYXAucHJldl9wZXJjZW50ICE9IHBlcmNlbnQpIHsKKwkJCWRldl9kYmcoZGktPmRldiwKKwkJCQkiYmF0dGVyeSByZXBvcnRlZCBmdWxsICIKKwkJCQkiYnV0IGNhcGFjaXR5IGRyb3BwaW5nOiAlZFxuIiwKKwkJCQlwZXJjZW50KTsKKwkJCWRpLT5iYXRfY2FwLnByZXZfcGVyY2VudCA9IHBlcmNlbnQ7CisJCQlkaS0+YmF0X2NhcC5wcmV2X21haCA9IGRpLT5iYXRfY2FwLm1haDsKKworCQkJY2hhbmdlZCA9IHRydWU7CisJCX0KKwl9IGVsc2UgaWYgKGRpLT5iYXRfY2FwLnByZXZfcGVyY2VudCAhPSBwZXJjZW50KSB7CisJCWlmIChwZXJjZW50ID09IDApIHsKKwkJCS8qCisJCQkgKiBXZSB3aWxsIG5vdCByZXBvcnQgMCUgdW5sZXNzIHdlJ3ZlIGdvdAorCQkJICogdGhlIExPV19CQVQgSVJRLCBubyBtYXR0ZXIgd2hhdCB0aGUgRkcKKwkJCSAqIGFsZ29yaXRobSBzYXlzLgorCQkJICovCisJCQlkaS0+YmF0X2NhcC5wcmV2X3BlcmNlbnQgPSAxOworCQkJcGVyY2VudCA9IDE7CisKKwkJCWNoYW5nZWQgPSB0cnVlOworCQl9IGVsc2UgaWYgKCEoIWRpLT5mbGFncy5jaGFyZ2luZyAmJgorCQkJcGVyY2VudCA+IGRpLT5iYXRfY2FwLnByZXZfcGVyY2VudCkgfHwgaW5pdCkgeworCQkJLyoKKwkJCSAqIFdlIGRvIG5vdCBhbGxvdyByZXBvcnRlZCBjYXBhY2l0eSB0byBnbyB1cAorCQkJICogdW5sZXNzIHdlJ3JlIGNoYXJnaW5nIG9yIGlmIHdlJ3JlIGluIGluaXQKKwkJCSAqLworCQkJZGV2X2RiZyhkaS0+ZGV2LAorCQkJCSJjYXBhY2l0eSBjaGFuZ2VkIGZyb20gJWQgdG8gJWQgKCVkKVxuIiwKKwkJCQlkaS0+YmF0X2NhcC5wcmV2X3BlcmNlbnQsCisJCQkJcGVyY2VudCwKKwkJCQlkaS0+YmF0X2NhcC5wZXJtaWxsZSk7CisJCQlkaS0+YmF0X2NhcC5wcmV2X3BlcmNlbnQgPSBwZXJjZW50OworCQkJZGktPmJhdF9jYXAucHJldl9tYWggPSBkaS0+YmF0X2NhcC5tYWg7CisKKwkJCWNoYW5nZWQgPSB0cnVlOworCQl9IGVsc2UgeworCQkJZGV2X2RiZyhkaS0+ZGV2LCAiY2FwYWNpdHkgbm90IGFsbG93ZWQgdG8gZ28gdXAgc2luY2UgIgorCQkJCSJubyBjaGFyZ2VyIGlzIGNvbm5lY3RlZDogJWQgdG8gJWQgKCVkKVxuIiwKKwkJCQlkaS0+YmF0X2NhcC5wcmV2X3BlcmNlbnQsCisJCQkJcGVyY2VudCwKKwkJCQlkaS0+YmF0X2NhcC5wZXJtaWxsZSk7CisJCX0KKwl9CisKKwlpZiAoY2hhbmdlZCkgeworCQlpZiAoZGktPmJtLT5jYXBhY2l0eV9zY2FsaW5nKSB7CisJCQlkaS0+YmF0X2NhcC5jYXBfc2NhbGUuc2NhbGVkX2NhcCA9CisJCQkJYWI4NTAwX2ZnX2NhbGN1bGF0ZV9zY2FsZWRfY2FwYWNpdHkoZGkpOworCisJCQlkZXZfaW5mbyhkaS0+ZGV2LCAiY2FwYWNpdHk9JWQgKCVkKVxuIiwKKwkJCQlkaS0+YmF0X2NhcC5wcmV2X3BlcmNlbnQsCisJCQkJZGktPmJhdF9jYXAuY2FwX3NjYWxlLnNjYWxlZF9jYXApOworCQl9CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5mZ19wc3kpOworCQlpZiAoZGktPmZsYWdzLmZ1bGx5X2NoYXJnZWQgJiYgZGktPmZsYWdzLmZvcmNlX2Z1bGwpIHsKKwkJCWRldl9kYmcoZGktPmRldiwgIkJhdHRlcnkgZnVsbCwgbm90aWZ5aW5nLlxuIik7CisJCQlkaS0+ZmxhZ3MuZm9yY2VfZnVsbCA9IGZhbHNlOworCQkJc3lzZnNfbm90aWZ5KCZkaS0+Zmdfa29iamVjdCwgTlVMTCwgImNoYXJnZV9mdWxsIik7CisJCX0KKwkJc3lzZnNfbm90aWZ5KCZkaS0+Zmdfa29iamVjdCwgTlVMTCwgImNoYXJnZV9ub3ciKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFiODUwMF9mZ19jaGFyZ2Vfc3RhdGVfdG8oc3RydWN0IGFiODUwMF9mZyAqZGksCisJZW51bSBhYjg1MDBfZmdfY2hhcmdlX3N0YXRlIG5ld19zdGF0ZSkKK3sKKwlkZXZfZGJnKGRpLT5kZXYsICJDaGFyZ2Ugc3RhdGUgZnJvbSAlZCBbJXNdIHRvICVkIFslc11cbiIsCisJCWRpLT5jaGFyZ2Vfc3RhdGUsCisJCWNoYXJnZV9zdGF0ZVtkaS0+Y2hhcmdlX3N0YXRlXSwKKwkJbmV3X3N0YXRlLAorCQljaGFyZ2Vfc3RhdGVbbmV3X3N0YXRlXSk7CisKKwlkaS0+Y2hhcmdlX3N0YXRlID0gbmV3X3N0YXRlOworfQorCitzdGF0aWMgdm9pZCBhYjg1MDBfZmdfZGlzY2hhcmdlX3N0YXRlX3RvKHN0cnVjdCBhYjg1MDBfZmcgKmRpLAorCWVudW0gYWI4NTAwX2ZnX2Rpc2NoYXJnZV9zdGF0ZSBuZXdfc3RhdGUpCit7CisJZGV2X2RiZyhkaS0+ZGV2LCAiRGlzaGFyZ2Ugc3RhdGUgZnJvbSAlZCBbJXNdIHRvICVkIFslc11cbiIsCisJCWRpLT5kaXNjaGFyZ2Vfc3RhdGUsCisJCWRpc2NoYXJnZV9zdGF0ZVtkaS0+ZGlzY2hhcmdlX3N0YXRlXSwKKwkJbmV3X3N0YXRlLAorCQlkaXNjaGFyZ2Vfc3RhdGVbbmV3X3N0YXRlXSk7CisKKwlkaS0+ZGlzY2hhcmdlX3N0YXRlID0gbmV3X3N0YXRlOworfQorCisvKioKKyAqIGFiODUwMF9mZ19hbGdvcml0aG1fY2hhcmdpbmcoKSAtIEZHIGFsZ29yaXRobSBmb3Igd2hlbiBjaGFyZ2luZworICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWI4NTAwX2ZnIHN0cnVjdHVyZQorICoKKyAqIEJhdHRlcnkgY2FwYWNpdHkgY2FsY3VsYXRpb24gc3RhdGUgbWFjaGluZSBmb3Igd2hlbiB3ZSdyZSBjaGFyZ2luZworICovCitzdGF0aWMgdm9pZCBhYjg1MDBfZmdfYWxnb3JpdGhtX2NoYXJnaW5nKHN0cnVjdCBhYjg1MDBfZmcgKmRpKQoreworCS8qCisJICogSWYgd2UgY2hhbmdlIHRvIGRpc2NoYXJnZSBtb2RlCisJICogd2Ugc2hvdWxkIHN0YXJ0IHdpdGggcmVjb3ZlcnkKKwkgKi8KKwlpZiAoZGktPmRpc2NoYXJnZV9zdGF0ZSAhPSBBQjg1MDBfRkdfRElTQ0hBUkdFX0lOSVRfUkVDT1ZFUlkpCisJCWFiODUwMF9mZ19kaXNjaGFyZ2Vfc3RhdGVfdG8oZGksCisJCQlBQjg1MDBfRkdfRElTQ0hBUkdFX0lOSVRfUkVDT1ZFUlkpOworCisJc3dpdGNoIChkaS0+Y2hhcmdlX3N0YXRlKSB7CisJY2FzZSBBQjg1MDBfRkdfQ0hBUkdFX0lOSVQ6CisJCWRpLT5mZ19zYW1wbGVzID0gU0VDX1RPX1NBTVBMRSgKKwkJCWRpLT5ibS0+ZmdfcGFyYW1zLT5hY2N1X2NoYXJnaW5nKTsKKworCQlhYjg1MDBfZmdfY291bG9tYl9jb3VudGVyKGRpLCB0cnVlKTsKKwkJYWI4NTAwX2ZnX2NoYXJnZV9zdGF0ZV90byhkaSwgQUI4NTAwX0ZHX0NIQVJHRV9SRUFET1VUKTsKKworCQlicmVhazsKKworCWNhc2UgQUI4NTAwX0ZHX0NIQVJHRV9SRUFET1VUOgorCQkvKgorCQkgKiBSZWFkIHRoZSBGRyBhbmQgY2FsY3VsYXRlIHRoZSBuZXcgY2FwYWNpdHkKKwkJICovCisJCW11dGV4X2xvY2soJmRpLT5jY19sb2NrKTsKKwkJaWYgKCFkaS0+ZmxhZ3MuY29udl9kb25lICYmICFkaS0+ZmxhZ3MuZm9yY2VfZnVsbCkgeworCQkJLyogV2Fzbid0IHRoZSBDQyBJUlEgdGhhdCBnb3QgdXMgaGVyZSAqLworCQkJbXV0ZXhfdW5sb2NrKCZkaS0+Y2NfbG9jayk7CisJCQlkZXZfZGJnKGRpLT5kZXYsICIlcyBDQyBjb252IG5vdCBkb25lXG4iLAorCQkJCV9fZnVuY19fKTsKKworCQkJYnJlYWs7CisJCX0KKwkJZGktPmZsYWdzLmNvbnZfZG9uZSA9IGZhbHNlOworCQltdXRleF91bmxvY2soJmRpLT5jY19sb2NrKTsKKworCQlhYjg1MDBfZmdfY2FsY19jYXBfY2hhcmdpbmcoZGkpOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyogQ2hlY2sgY2FwYWNpdHkgbGltaXRzICovCisJYWI4NTAwX2ZnX2NoZWNrX2NhcGFjaXR5X2xpbWl0cyhkaSwgZmFsc2UpOworfQorCitzdGF0aWMgdm9pZCBmb3JjZV9jYXBhY2l0eShzdHJ1Y3QgYWI4NTAwX2ZnICpkaSkKK3sKKwlpbnQgY2FwOworCisJYWI4NTAwX2ZnX2NsZWFyX2NhcF9zYW1wbGVzKGRpKTsKKwljYXAgPSBkaS0+YmF0X2NhcC51c2VyX21haDsKKwlpZiAoY2FwID4gZGktPmJhdF9jYXAubWF4X21haF9kZXNpZ24pIHsKKwkJZGV2X2RiZyhkaS0+ZGV2LCAiUmVtYWluaW5nIGNhcCAlZCBjYW4ndCBiZSBiaWdnZXIgdGhhbiB0b3RhbCIKKwkJCSIgJWRcbiIsIGNhcCwgZGktPmJhdF9jYXAubWF4X21haF9kZXNpZ24pOworCQljYXAgPSBkaS0+YmF0X2NhcC5tYXhfbWFoX2Rlc2lnbjsKKwl9CisJYWI4NTAwX2ZnX2ZpbGxfY2FwX3NhbXBsZShkaSwgZGktPmJhdF9jYXAudXNlcl9tYWgpOworCWRpLT5iYXRfY2FwLnBlcm1pbGxlID0gYWI4NTAwX2ZnX2NvbnZlcnRfbWFoX3RvX3Blcm1pbGxlKGRpLCBjYXApOworCWRpLT5iYXRfY2FwLm1haCA9IGNhcDsKKwlhYjg1MDBfZmdfY2hlY2tfY2FwYWNpdHlfbGltaXRzKGRpLCB0cnVlKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tfc3lzZnNfY2FwYWNpdHkoc3RydWN0IGFiODUwMF9mZyAqZGkpCit7CisJaW50IGNhcCwgbG93ZXIsIHVwcGVyOworCWludCBjYXBfcGVybWlsbGU7CisKKwljYXAgPSBkaS0+YmF0X2NhcC51c2VyX21haDsKKworCWNhcF9wZXJtaWxsZSA9IGFiODUwMF9mZ19jb252ZXJ0X21haF90b19wZXJtaWxsZShkaSwKKwkJZGktPmJhdF9jYXAudXNlcl9tYWgpOworCisJbG93ZXIgPSBkaS0+YmF0X2NhcC5wZXJtaWxsZSAtIGRpLT5ibS0+ZmdfcGFyYW1zLT51c2VyX2NhcF9saW1pdCAqIDEwOworCXVwcGVyID0gZGktPmJhdF9jYXAucGVybWlsbGUgKyBkaS0+Ym0tPmZnX3BhcmFtcy0+dXNlcl9jYXBfbGltaXQgKiAxMDsKKworCWlmIChsb3dlciA8IDApCisJCWxvd2VyID0gMDsKKwkvKiAxMDAwIGlzIHBlcm1pbGxlLCAtPiAxMDAgcGVyY2VudCAqLworCWlmICh1cHBlciA+IDEwMDApCisJCXVwcGVyID0gMTAwMDsKKworCWRldl9kYmcoZGktPmRldiwgIkNhcGFjaXR5IGxpbWl0czoiCisJCSIgKExvd2VyOiAlZCBVc2VyOiAlZCBVcHBlcjogJWQpIFt1c2VyOiAlZCwgd2FzOiAlZF1cbiIsCisJCWxvd2VyLCBjYXBfcGVybWlsbGUsIHVwcGVyLCBjYXAsIGRpLT5iYXRfY2FwLm1haCk7CisKKwkvKiBJZiB3aXRoaW4gbGltaXRzLCB1c2UgdGhlIHNhdmVkIGNhcGFjaXR5IGFuZCBleGl0IGVzdGltYXRpb24uLi4qLworCWlmIChjYXBfcGVybWlsbGUgPiBsb3dlciAmJiBjYXBfcGVybWlsbGUgPCB1cHBlcikgeworCQlkZXZfZGJnKGRpLT5kZXYsICJPSyEgVXNpbmcgdXNlcnMgY2FwICVkIHVBaCBub3dcbiIsIGNhcCk7CisJCWZvcmNlX2NhcGFjaXR5KGRpKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCWRldl9kYmcoZGktPmRldiwgIkNhcGFjaXR5IGZyb20gdXNlciBvdXQgb2YgbGltaXRzLCBpZ25vcmluZyIpOworCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBhYjg1MDBfZmdfYWxnb3JpdGhtX2Rpc2NoYXJnaW5nKCkgLSBGRyBhbGdvcml0aG0gZm9yIHdoZW4gZGlzY2hhcmdpbmcKKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKKyAqCisgKiBCYXR0ZXJ5IGNhcGFjaXR5IGNhbGN1bGF0aW9uIHN0YXRlIG1hY2hpbmUgZm9yIHdoZW4gd2UncmUgZGlzY2hhcmdpbmcKKyAqLworc3RhdGljIHZvaWQgYWI4NTAwX2ZnX2FsZ29yaXRobV9kaXNjaGFyZ2luZyhzdHJ1Y3QgYWI4NTAwX2ZnICpkaSkKK3sKKwlpbnQgc2xlZXBfdGltZTsKKworCS8qIElmIHdlIGNoYW5nZSB0byBjaGFyZ2UgbW9kZSB3ZSBzaG91bGQgc3RhcnQgd2l0aCBpbml0ICovCisJaWYgKGRpLT5jaGFyZ2Vfc3RhdGUgIT0gQUI4NTAwX0ZHX0NIQVJHRV9JTklUKQorCQlhYjg1MDBfZmdfY2hhcmdlX3N0YXRlX3RvKGRpLCBBQjg1MDBfRkdfQ0hBUkdFX0lOSVQpOworCisJc3dpdGNoIChkaS0+ZGlzY2hhcmdlX3N0YXRlKSB7CisJY2FzZSBBQjg1MDBfRkdfRElTQ0hBUkdFX0lOSVQ6CisJCS8qIFdlIHVzZSB0aGUgRkcgSVJRIHRvIHdvcmsgb24gKi8KKwkJZGktPmluaXRfY250ID0gMDsKKwkJZGktPmZnX3NhbXBsZXMgPSBTRUNfVE9fU0FNUExFKGRpLT5ibS0+ZmdfcGFyYW1zLT5pbml0X3RpbWVyKTsKKwkJYWI4NTAwX2ZnX2NvdWxvbWJfY291bnRlcihkaSwgdHJ1ZSk7CisJCWFiODUwMF9mZ19kaXNjaGFyZ2Vfc3RhdGVfdG8oZGksCisJCQlBQjg1MDBfRkdfRElTQ0hBUkdFX0lOSVRNRUFTVVJJTkcpOworCisJCS8qIEludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCisJY2FzZSBBQjg1MDBfRkdfRElTQ0hBUkdFX0lOSVRNRUFTVVJJTkc6CisJCS8qCisJCSAqIERpc2NhcmQgYSBudW1iZXIgb2Ygc2FtcGxlcyBkdXJpbmcgc3RhcnR1cC4KKwkJICogQWZ0ZXIgdGhhdCwgdXNlIGNvbXBlbnNhdGVkIHZvbHRhZ2UgZm9yIGEgZmV3CisJCSAqIHNhbXBsZXMgdG8gZ2V0IGFuIGluaXRpYWwgY2FwYWNpdHkuCisJCSAqIFRoZW4gZ28gdG8gUkVBRE9VVAorCQkgKi8KKwkJc2xlZXBfdGltZSA9IGRpLT5ibS0+ZmdfcGFyYW1zLT5pbml0X3RpbWVyOworCisJCS8qIERpc2NhcmQgdGhlIGZpcnN0IFt4XSBzZWNvbmRzICovCisJCWlmIChkaS0+aW5pdF9jbnQgPiBkaS0+Ym0tPmZnX3BhcmFtcy0+aW5pdF9kaXNjYXJkX3RpbWUpIHsKKwkJCWFiODUwMF9mZ19jYWxjX2NhcF9kaXNjaGFyZ2Vfdm9sdGFnZShkaSwgdHJ1ZSk7CisKKwkJCWFiODUwMF9mZ19jaGVja19jYXBhY2l0eV9saW1pdHMoZGksIHRydWUpOworCQl9CisKKwkJZGktPmluaXRfY250ICs9IHNsZWVwX3RpbWU7CisJCWlmIChkaS0+aW5pdF9jbnQgPiBkaS0+Ym0tPmZnX3BhcmFtcy0+aW5pdF90b3RhbF90aW1lKQorCQkJYWI4NTAwX2ZnX2Rpc2NoYXJnZV9zdGF0ZV90byhkaSwKKwkJCQlBQjg1MDBfRkdfRElTQ0hBUkdFX1JFQURPVVRfSU5JVCk7CisKKwkJYnJlYWs7CisKKwljYXNlIEFCODUwMF9GR19ESVNDSEFSR0VfSU5JVF9SRUNPVkVSWToKKwkJZGktPnJlY292ZXJ5X2NudCA9IDA7CisJCWRpLT5yZWNvdmVyeV9uZWVkZWQgPSB0cnVlOworCQlhYjg1MDBfZmdfZGlzY2hhcmdlX3N0YXRlX3RvKGRpLAorCQkJQUI4NTAwX0ZHX0RJU0NIQVJHRV9SRUNPVkVSWSk7CisKKwkJLyogSW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KKworCWNhc2UgQUI4NTAwX0ZHX0RJU0NIQVJHRV9SRUNPVkVSWToKKwkJc2xlZXBfdGltZSA9IGRpLT5ibS0+ZmdfcGFyYW1zLT5yZWNvdmVyeV9zbGVlcF90aW1lcjsKKworCQkvKgorCQkgKiBXZSBzaG91bGQgY2hlY2sgdGhlIHBvd2VyIGNvbnN1bXB0aW9uCisJCSAqIElmIGxvdywgZ28gdG8gUkVBRE9VVCAoYWZ0ZXIgeCBtaW4pIG9yCisJCSAqIFJFQ09WRVJZX1NMRUVQIGlmIHRpbWUgbGVmdC4KKwkJICogSWYgaGlnaCwgZ28gdG8gUkVBRE9VVAorCQkgKi8KKwkJZGktPmluc3RfY3VyciA9IGFiODUwMF9mZ19pbnN0X2N1cnJfYmxvY2tpbmcoZGkpOworCisJCWlmIChhYjg1MDBfZmdfaXNfbG93X2N1cnIoZGksIGRpLT5pbnN0X2N1cnIpKSB7CisJCQlpZiAoZGktPnJlY292ZXJ5X2NudCA+CisJCQkJZGktPmJtLT5mZ19wYXJhbXMtPnJlY292ZXJ5X3RvdGFsX3RpbWUpIHsKKwkJCQlkaS0+Zmdfc2FtcGxlcyA9IFNFQ19UT19TQU1QTEUoCisJCQkJCWRpLT5ibS0+ZmdfcGFyYW1zLT5hY2N1X2hpZ2hfY3Vycik7CisJCQkJYWI4NTAwX2ZnX2NvdWxvbWJfY291bnRlcihkaSwgdHJ1ZSk7CisJCQkJYWI4NTAwX2ZnX2Rpc2NoYXJnZV9zdGF0ZV90byhkaSwKKwkJCQkJQUI4NTAwX0ZHX0RJU0NIQVJHRV9SRUFET1VUKTsKKwkJCQlkaS0+cmVjb3ZlcnlfbmVlZGVkID0gZmFsc2U7CisJCQl9IGVsc2UgeworCQkJCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Zmdfd3EsCisJCQkJCSZkaS0+ZmdfcGVyaW9kaWNfd29yaywKKwkJCQkJc2xlZXBfdGltZSAqIEhaKTsKKwkJCX0KKwkJCWRpLT5yZWNvdmVyeV9jbnQgKz0gc2xlZXBfdGltZTsKKwkJfSBlbHNlIHsKKwkJCWRpLT5mZ19zYW1wbGVzID0gU0VDX1RPX1NBTVBMRSgKKwkJCQlkaS0+Ym0tPmZnX3BhcmFtcy0+YWNjdV9oaWdoX2N1cnIpOworCQkJYWI4NTAwX2ZnX2NvdWxvbWJfY291bnRlcihkaSwgdHJ1ZSk7CisJCQlhYjg1MDBfZmdfZGlzY2hhcmdlX3N0YXRlX3RvKGRpLAorCQkJCUFCODUwMF9GR19ESVNDSEFSR0VfUkVBRE9VVCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFCODUwMF9GR19ESVNDSEFSR0VfUkVBRE9VVF9JTklUOgorCQlkaS0+Zmdfc2FtcGxlcyA9IFNFQ19UT19TQU1QTEUoCisJCQlkaS0+Ym0tPmZnX3BhcmFtcy0+YWNjdV9oaWdoX2N1cnIpOworCQlhYjg1MDBfZmdfY291bG9tYl9jb3VudGVyKGRpLCB0cnVlKTsKKwkJYWI4NTAwX2ZnX2Rpc2NoYXJnZV9zdGF0ZV90byhkaSwKKwkJCQlBQjg1MDBfRkdfRElTQ0hBUkdFX1JFQURPVVQpOworCQlicmVhazsKKworCWNhc2UgQUI4NTAwX0ZHX0RJU0NIQVJHRV9SRUFET1VUOgorCQlkaS0+aW5zdF9jdXJyID0gYWI4NTAwX2ZnX2luc3RfY3Vycl9ibG9ja2luZyhkaSk7CisKKwkJaWYgKGFiODUwMF9mZ19pc19sb3dfY3VycihkaSwgZGktPmluc3RfY3VycikpIHsKKwkJCS8qIERldGVjdCBtb2RlIGNoYW5nZSAqLworCQkJaWYgKGRpLT5oaWdoX2N1cnJfbW9kZSkgeworCQkJCWRpLT5oaWdoX2N1cnJfbW9kZSA9IGZhbHNlOworCQkJCWRpLT5oaWdoX2N1cnJfY250ID0gMDsKKwkJCX0KKworCQkJaWYgKGRpLT5yZWNvdmVyeV9uZWVkZWQpIHsKKwkJCQlhYjg1MDBfZmdfZGlzY2hhcmdlX3N0YXRlX3RvKGRpLAorCQkJCQlBQjg1MDBfRkdfRElTQ0hBUkdFX0lOSVRfUkVDT1ZFUlkpOworCisJCQkJcXVldWVfZGVsYXllZF93b3JrKGRpLT5mZ193cSwKKwkJCQkJJmRpLT5mZ19wZXJpb2RpY193b3JrLCAwKTsKKworCQkJCWJyZWFrOworCQkJfQorCisJCQlhYjg1MDBfZmdfY2FsY19jYXBfZGlzY2hhcmdlX3ZvbHRhZ2UoZGksIHRydWUpOworCQl9IGVsc2UgeworCQkJbXV0ZXhfbG9jaygmZGktPmNjX2xvY2spOworCQkJaWYgKCFkaS0+ZmxhZ3MuY29udl9kb25lKSB7CisJCQkJLyogV2Fzbid0IHRoZSBDQyBJUlEgdGhhdCBnb3QgdXMgaGVyZSAqLworCQkJCW11dGV4X3VubG9jaygmZGktPmNjX2xvY2spOworCQkJCWRldl9kYmcoZGktPmRldiwgIiVzIENDIGNvbnYgbm90IGRvbmVcbiIsCisJCQkJCV9fZnVuY19fKTsKKworCQkJCWJyZWFrOworCQkJfQorCQkJZGktPmZsYWdzLmNvbnZfZG9uZSA9IGZhbHNlOworCQkJbXV0ZXhfdW5sb2NrKCZkaS0+Y2NfbG9jayk7CisKKwkJCS8qIERldGVjdCBtb2RlIGNoYW5nZSAqLworCQkJaWYgKCFkaS0+aGlnaF9jdXJyX21vZGUpIHsKKwkJCQlkaS0+aGlnaF9jdXJyX21vZGUgPSB0cnVlOworCQkJCWRpLT5oaWdoX2N1cnJfY250ID0gMDsKKwkJCX0KKworCQkJZGktPmhpZ2hfY3Vycl9jbnQgKz0KKwkJCQlkaS0+Ym0tPmZnX3BhcmFtcy0+YWNjdV9oaWdoX2N1cnI7CisJCQlpZiAoZGktPmhpZ2hfY3Vycl9jbnQgPgorCQkJCWRpLT5ibS0+ZmdfcGFyYW1zLT5oaWdoX2N1cnJfdGltZSkKKwkJCQlkaS0+cmVjb3ZlcnlfbmVlZGVkID0gdHJ1ZTsKKworCQkJYWI4NTAwX2ZnX2NhbGNfY2FwX2Rpc2NoYXJnZV9mZyhkaSk7CisJCX0KKworCQlhYjg1MDBfZmdfY2hlY2tfY2FwYWNpdHlfbGltaXRzKGRpLCBmYWxzZSk7CisKKwkJYnJlYWs7CisKKwljYXNlIEFCODUwMF9GR19ESVNDSEFSR0VfV0FLRVVQOgorCQlhYjg1MDBfZmdfY2FsY19jYXBfZGlzY2hhcmdlX3ZvbHRhZ2UoZGksIHRydWUpOworCisJCWRpLT5mZ19zYW1wbGVzID0gU0VDX1RPX1NBTVBMRSgKKwkJCWRpLT5ibS0+ZmdfcGFyYW1zLT5hY2N1X2hpZ2hfY3Vycik7CisJCWFiODUwMF9mZ19jb3Vsb21iX2NvdW50ZXIoZGksIHRydWUpOworCQlhYjg1MDBfZmdfZGlzY2hhcmdlX3N0YXRlX3RvKGRpLAorCQkJCUFCODUwMF9GR19ESVNDSEFSR0VfUkVBRE9VVCk7CisKKwkJYWI4NTAwX2ZnX2NoZWNrX2NhcGFjaXR5X2xpbWl0cyhkaSwgZmFsc2UpOworCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIGFiODUwMF9mZ19hbGdvcml0aG1fY2FsaWJyYXRlKCkgLSBJbnRlcm5hbCBjb2x1bWIgY291bnRlciBvZmZzZXQgY2FsaWJyYXRpb24KKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGFiODUwMF9mZ19hbGdvcml0aG1fY2FsaWJyYXRlKHN0cnVjdCBhYjg1MDBfZmcgKmRpKQoreworCWludCByZXQ7CisKKwlzd2l0Y2ggKGRpLT5jYWxpYl9zdGF0ZSkgeworCWNhc2UgQUI4NTAwX0ZHX0NBTElCX0lOSVQ6CisJCWRldl9kYmcoZGktPmRldiwgIkNhbGlicmF0aW9uIG9uZ29pbmcuLi5cbiIpOworCisJCXJldCA9IGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAorCQkJQUI4NTAwX0dBU19HQVVHRSwgQUI4NTAwX0dBU0dfQ0NfQ1RSTF9SRUcsCisJCQlDQ19JTlRfQ0FMX05fQVZHX01BU0ssIENDX0lOVF9DQUxfU0FNUExFU184KTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycjsKKworCQlyZXQgPSBhYng1MDBfbWFza19hbmRfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwKKwkJCUFCODUwMF9HQVNfR0FVR0UsIEFCODUwMF9HQVNHX0NDX0NUUkxfUkVHLAorCQkJQ0NfSU5UQVZHT0ZGU0VUX0VOQSwgQ0NfSU5UQVZHT0ZGU0VUX0VOQSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnI7CisJCWRpLT5jYWxpYl9zdGF0ZSA9IEFCODUwMF9GR19DQUxJQl9XQUlUOworCQlicmVhazsKKwljYXNlIEFCODUwMF9GR19DQUxJQl9FTkQ6CisJCXJldCA9IGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAorCQkJQUI4NTAwX0dBU19HQVVHRSwgQUI4NTAwX0dBU0dfQ0NfQ1RSTF9SRUcsCisJCQlDQ19NVVhPRkZTRVQsIENDX01VWE9GRlNFVCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnI7CisJCWRpLT5mbGFncy5jYWxpYnJhdGUgPSBmYWxzZTsKKwkJZGV2X2RiZyhkaS0+ZGV2LCAiQ2FsaWJyYXRpb24gZG9uZS4uLlxuIik7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Zmdfd3EsICZkaS0+ZmdfcGVyaW9kaWNfd29yaywgMCk7CisJCWJyZWFrOworCWNhc2UgQUI4NTAwX0ZHX0NBTElCX1dBSVQ6CisJCWRldl9kYmcoZGktPmRldiwgIkNhbGlicmF0aW9uIFdGSVxuIik7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybjsKK2VycjoKKwkvKiBTb21ldGhpbmcgd2VudCB3cm9uZywgZG9uJ3QgY2FsaWJyYXRlIHRoZW4gKi8KKwlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gY2FsaWJyYXRlIHRoZSBDQ1xuIik7CisJZGktPmZsYWdzLmNhbGlicmF0ZSA9IGZhbHNlOworCWRpLT5jYWxpYl9zdGF0ZSA9IEFCODUwMF9GR19DQUxJQl9JTklUOworCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Zmdfd3EsICZkaS0+ZmdfcGVyaW9kaWNfd29yaywgMCk7Cit9CisKKy8qKgorICogYWI4NTAwX2ZnX2FsZ29yaXRobSgpIC0gRW50cnkgcG9pbnQgZm9yIHRoZSBGRyBhbGdvcml0aG0KKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKKyAqCisgKiBFbnRyeSBwb2ludCBmb3IgdGhlIGJhdHRlcnkgY2FwYWNpdHkgY2FsY3VsYXRpb24gc3RhdGUgbWFjaGluZQorICovCitzdGF0aWMgdm9pZCBhYjg1MDBfZmdfYWxnb3JpdGhtKHN0cnVjdCBhYjg1MDBfZmcgKmRpKQoreworCWlmIChkaS0+ZmxhZ3MuY2FsaWJyYXRlKQorCQlhYjg1MDBfZmdfYWxnb3JpdGhtX2NhbGlicmF0ZShkaSk7CisJZWxzZSB7CisJCWlmIChkaS0+ZmxhZ3MuY2hhcmdpbmcpCisJCQlhYjg1MDBfZmdfYWxnb3JpdGhtX2NoYXJnaW5nKGRpKTsKKwkJZWxzZQorCQkJYWI4NTAwX2ZnX2FsZ29yaXRobV9kaXNjaGFyZ2luZyhkaSk7CisJfQorCisJZGV2X2RiZyhkaS0+ZGV2LCAiW0ZHX0RBVEFdICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkICIKKwkJIiVkICVkICVkICVkICVkICVkICVkXG4iLAorCQlkaS0+YmF0X2NhcC5tYXhfbWFoX2Rlc2lnbiwKKwkJZGktPmJhdF9jYXAubWF4X21haCwKKwkJZGktPmJhdF9jYXAubWFoLAorCQlkaS0+YmF0X2NhcC5wZXJtaWxsZSwKKwkJZGktPmJhdF9jYXAubGV2ZWwsCisJCWRpLT5iYXRfY2FwLnByZXZfbWFoLAorCQlkaS0+YmF0X2NhcC5wcmV2X3BlcmNlbnQsCisJCWRpLT5iYXRfY2FwLnByZXZfbGV2ZWwsCisJCWRpLT52YmF0LAorCQlkaS0+aW5zdF9jdXJyLAorCQlkaS0+YXZnX2N1cnIsCisJCWRpLT5hY2N1X2NoYXJnZSwKKwkJZGktPmZsYWdzLmNoYXJnaW5nLAorCQlkaS0+Y2hhcmdlX3N0YXRlLAorCQlkaS0+ZGlzY2hhcmdlX3N0YXRlLAorCQlkaS0+aGlnaF9jdXJyX21vZGUsCisJCWRpLT5yZWNvdmVyeV9uZWVkZWQpOworfQorCisvKioKKyAqIGFiODUwMF9mZ19wZXJpb2RpY193b3JrKCkgLSBSdW4gdGhlIEZHIHN0YXRlIG1hY2hpbmUgcGVyaW9kaWNhbGx5CisgKiBAd29yazoJcG9pbnRlciB0byB0aGUgd29ya19zdHJ1Y3Qgc3RydWN0dXJlCisgKgorICogV29yayBxdWV1ZSBmdW5jdGlvbiBmb3IgcGVyaW9kaWMgd29yaworICovCitzdGF0aWMgdm9pZCBhYjg1MDBfZmdfcGVyaW9kaWNfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGFiODUwMF9mZyAqZGkgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFiODUwMF9mZywKKwkJZmdfcGVyaW9kaWNfd29yay53b3JrKTsKKworCWlmIChkaS0+aW5pdF9jYXBhY2l0eSkgeworCQkvKiBHZXQgYW4gaW5pdGlhbCBjYXBhY2l0eSBjYWxjdWxhdGlvbiAqLworCQlhYjg1MDBfZmdfY2FsY19jYXBfZGlzY2hhcmdlX3ZvbHRhZ2UoZGksIHRydWUpOworCQlhYjg1MDBfZmdfY2hlY2tfY2FwYWNpdHlfbGltaXRzKGRpLCB0cnVlKTsKKwkJZGktPmluaXRfY2FwYWNpdHkgPSBmYWxzZTsKKworCQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmZnX3dxLCAmZGktPmZnX3BlcmlvZGljX3dvcmssIDApOworCX0gZWxzZSBpZiAoZGktPmZsYWdzLnVzZXJfY2FwKSB7CisJCWlmIChjaGVja19zeXNmc19jYXBhY2l0eShkaSkpIHsKKwkJCWFiODUwMF9mZ19jaGVja19jYXBhY2l0eV9saW1pdHMoZGksIHRydWUpOworCQkJaWYgKGRpLT5mbGFncy5jaGFyZ2luZykKKwkJCQlhYjg1MDBfZmdfY2hhcmdlX3N0YXRlX3RvKGRpLAorCQkJCQlBQjg1MDBfRkdfQ0hBUkdFX0lOSVQpOworCQkJZWxzZQorCQkJCWFiODUwMF9mZ19kaXNjaGFyZ2Vfc3RhdGVfdG8oZGksCisJCQkJCUFCODUwMF9GR19ESVNDSEFSR0VfUkVBRE9VVF9JTklUKTsKKwkJfQorCQlkaS0+ZmxhZ3MudXNlcl9jYXAgPSBmYWxzZTsKKwkJcXVldWVfZGVsYXllZF93b3JrKGRpLT5mZ193cSwgJmRpLT5mZ19wZXJpb2RpY193b3JrLCAwKTsKKwl9IGVsc2UKKwkJYWI4NTAwX2ZnX2FsZ29yaXRobShkaSk7CisKK30KKworLyoqCisgKiBhYjg1MDBfZmdfY2hlY2tfaHdfZmFpbHVyZV93b3JrKCkgLSBDaGVjayBPVlZfQkFUIGNvbmRpdGlvbgorICogQHdvcms6CXBvaW50ZXIgdG8gdGhlIHdvcmtfc3RydWN0IHN0cnVjdHVyZQorICoKKyAqIFdvcmsgcXVldWUgZnVuY3Rpb24gZm9yIGNoZWNraW5nIHRoZSBPVlZfQkFUIGNvbmRpdGlvbgorICovCitzdGF0aWMgdm9pZCBhYjg1MDBfZmdfY2hlY2tfaHdfZmFpbHVyZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlpbnQgcmV0OworCXU4IHJlZ192YWx1ZTsKKworCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhYjg1MDBfZmcsCisJCWZnX2NoZWNrX2h3X2ZhaWx1cmVfd29yay53b3JrKTsKKworCS8qCisJICogSWYgd2UgaGF2ZSBoYWQgYSBiYXR0ZXJ5IG92ZXItdm9sdGFnZSBzaXR1YXRpb24sCisJICogY2hlY2sgb3Z2LWJpdCB0byBzZWUgaWYgaXQgc2hvdWxkIGJlIHJlc2V0LgorCSAqLworCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAorCQlBQjg1MDBfQ0hBUkdFUiwgQUI4NTAwX0NIX1NUQVRfUkVHLAorCQkmcmVnX3ZhbHVlKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRpLT5kZXYsICIlcyBhYjg1MDAgcmVhZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoKHJlZ192YWx1ZSAmIEJBVFRfT1ZWKSA9PSBCQVRUX09WVikgeworCQlpZiAoIWRpLT5mbGFncy5iYXRfb3Z2KSB7CisJCQlkZXZfZGJnKGRpLT5kZXYsICJCYXR0ZXJ5IE9WVlxuIik7CisJCQlkaS0+ZmxhZ3MuYmF0X292diA9IHRydWU7CisJCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChkaS0+ZmdfcHN5KTsKKwkJfQorCQkvKiBOb3QgeWV0IHJlY292ZXJlZCBmcm9tIG92diwgcmVzY2hlZHVsZSB0aGlzIHRlc3QgKi8KKwkJcXVldWVfZGVsYXllZF93b3JrKGRpLT5mZ193cSwgJmRpLT5mZ19jaGVja19od19mYWlsdXJlX3dvcmssCisJCQkJICAgSFopOworCQl9IGVsc2UgeworCQkJZGV2X2RiZyhkaS0+ZGV2LCAiQmF0dGVyeSByZWNvdmVyZWQgZnJvbSBPVlZcbiIpOworCQkJZGktPmZsYWdzLmJhdF9vdnYgPSBmYWxzZTsKKwkJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5mZ19wc3kpOworCX0KK30KKworLyoqCisgKiBhYjg1MDBfZmdfbG93X2JhdF93b3JrKCkgLSBDaGVjayBMT1dfQkFUIGNvbmRpdGlvbgorICogQHdvcms6CXBvaW50ZXIgdG8gdGhlIHdvcmtfc3RydWN0IHN0cnVjdHVyZQorICoKKyAqIFdvcmsgcXVldWUgZnVuY3Rpb24gZm9yIGNoZWNraW5nIHRoZSBMT1dfQkFUIGNvbmRpdGlvbgorICovCitzdGF0aWMgdm9pZCBhYjg1MDBfZmdfbG93X2JhdF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlpbnQgdmJhdDsKKworCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhYjg1MDBfZmcsCisJCWZnX2xvd19iYXRfd29yay53b3JrKTsKKworCXZiYXQgPSBhYjg1MDBfZmdfYmF0X3ZvbHRhZ2UoZGkpOworCisJLyogQ2hlY2sgaWYgTE9XX0JBVCBzdGlsbCBmdWxmaWxsZWQgKi8KKwlpZiAodmJhdCA8IGRpLT5ibS0+ZmdfcGFyYW1zLT5sb3diYXRfdGhyZXNob2xkKSB7CisJCS8qIElzIGl0IHRpbWUgdG8gc2h1dCBkb3duPyAqLworCQlpZiAoZGktPmxvd19iYXRfY250IDwgMSkgeworCQkJZGktPmZsYWdzLmxvd19iYXQgPSB0cnVlOworCQkJZGV2X3dhcm4oZGktPmRldiwgIlNodXQgZG93biBwZW5kaW5nLi4uXG4iKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkqIEVsc2Ugd2UgbmVlZCB0byByZS1zY2hlZHVsZSB0aGlzIGNoZWNrIHRvIGJlIGFibGUgdG8gZGV0ZWN0CisJCQkqIGlmIHRoZSB2b2x0YWdlIGluY3JlYXNlcyBhZ2FpbiBkdXJpbmcgY2hhcmdpbmcgb3IKKwkJCSogZHVlIHRvIGRlY3JlYXNpbmcgbG9hZC4KKwkJCSovCisJCQlkaS0+bG93X2JhdF9jbnQtLTsKKwkJCWRldl93YXJuKGRpLT5kZXYsICJCYXR0ZXJ5IHZvbHRhZ2Ugc3RpbGwgTE9XXG4iKTsKKwkJCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Zmdfd3EsICZkaS0+ZmdfbG93X2JhdF93b3JrLAorCQkJCXJvdW5kX2ppZmZpZXMoTE9XX0JBVF9DSEVDS19JTlRFUlZBTCkpOworCQl9CisJfSBlbHNlIHsKKwkJZGktPmZsYWdzLmxvd19iYXRfZGVsYXkgPSBmYWxzZTsKKwkJZGktPmxvd19iYXRfY250ID0gMTA7CisJCWRldl93YXJuKGRpLT5kZXYsICJCYXR0ZXJ5IHZvbHRhZ2UgT0sgYWdhaW5cbiIpOworCX0KKworCS8qIFRoaXMgaXMgbmVlZGVkIHRvIGRpc3BhdGNoIExPV19CQVQgKi8KKwlhYjg1MDBfZmdfY2hlY2tfY2FwYWNpdHlfbGltaXRzKGRpLCBmYWxzZSk7Cit9CisKKy8qKgorICogYWI4NTAwX2ZnX2JhdHRva19jYWxjIC0gY2FsY3VsYXRlIHRoZSBiaXQgcGF0dGVybiBjb3JyZXNwb25kaW5nCisgKiB0byB0aGUgdGFyZ2V0IHZvbHRhZ2UuCisgKiBAZGk6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKKyAqIEB0YXJnZXQgICAgdGFyZ2V0IHZvbHRhZ2UKKyAqCisgKiBSZXR1cm5zIGJpdCBwYXR0ZXJuIGNsb3Nlc3QgdG8gdGhlIHRhcmdldCB2b2x0YWdlCisgKiB2YWxpZCByZXR1cm4gdmFsdWVzIGFyZSAwLTE0LiAoMC1CQVRUX09LX01BWF9OUl9JTkNSRU1FTlRTKQorICovCisKK3N0YXRpYyBpbnQgYWI4NTAwX2ZnX2JhdHRva19jYWxjKHN0cnVjdCBhYjg1MDBfZmcgKmRpLCBpbnQgdGFyZ2V0KQoreworCWlmICh0YXJnZXQgPiBCQVRUX09LX01JTiArCisJCShCQVRUX09LX0lOQ1JFTUVOVCAqIEJBVFRfT0tfTUFYX05SX0lOQ1JFTUVOVFMpKQorCQlyZXR1cm4gQkFUVF9PS19NQVhfTlJfSU5DUkVNRU5UUzsKKwlpZiAodGFyZ2V0IDwgQkFUVF9PS19NSU4pCisJCXJldHVybiAwOworCXJldHVybiAodGFyZ2V0IC0gQkFUVF9PS19NSU4pIC8gQkFUVF9PS19JTkNSRU1FTlQ7Cit9CisKKy8qKgorICogYWI4NTAwX2ZnX2JhdHRva19pbml0X2h3X3JlZ2lzdGVyIC0gaW5pdCBiYXR0b2sgbGV2ZWxzCisgKiBAZGk6ICAgICAgIHBvaW50ZXIgdG8gdGhlIGFiODUwMF9mZyBzdHJ1Y3R1cmUKKyAqCisgKi8KKworc3RhdGljIGludCBhYjg1MDBfZmdfYmF0dG9rX2luaXRfaHdfcmVnaXN0ZXIoc3RydWN0IGFiODUwMF9mZyAqZGkpCit7CisJaW50IHNlbGVjdGVkOworCWludCBzZWwwOworCWludCBzZWwxOworCWludCBjYnBfc2VsMDsKKwlpbnQgY2JwX3NlbDE7CisJaW50IHJldDsKKwlpbnQgbmV3X3ZhbDsKKworCXNlbDAgPSBkaS0+Ym0tPmZnX3BhcmFtcy0+YmF0dG9rX2ZhbGxpbmdfdGhfc2VsMDsKKwlzZWwxID0gZGktPmJtLT5mZ19wYXJhbXMtPmJhdHRva19yYWlzaW5nX3RoX3NlbDE7CisKKwljYnBfc2VsMCA9IGFiODUwMF9mZ19iYXR0b2tfY2FsYyhkaSwgc2VsMCk7CisJY2JwX3NlbDEgPSBhYjg1MDBfZmdfYmF0dG9rX2NhbGMoZGksIHNlbDEpOworCisJc2VsZWN0ZWQgPSBCQVRUX09LX01JTiArIGNicF9zZWwwICogQkFUVF9PS19JTkNSRU1FTlQ7CisKKwlpZiAoc2VsZWN0ZWQgIT0gc2VsMCkKKwkJZGV2X3dhcm4oZGktPmRldiwgIkludmFsaWQgdm9sdGFnZSBzdGVwOiVkLCB1c2luZyAlZCAlZFxuIiwKKwkJCXNlbDAsIHNlbGVjdGVkLCBjYnBfc2VsMCk7CisKKwlzZWxlY3RlZCA9IEJBVFRfT0tfTUlOICsgY2JwX3NlbDEgKiBCQVRUX09LX0lOQ1JFTUVOVDsKKworCWlmIChzZWxlY3RlZCAhPSBzZWwxKQorCQlkZXZfd2FybihkaS0+ZGV2LCAiSW52YWxpZCB2b2x0YWdlIHN0ZXA6JWQsIHVzaW5nICVkICVkXG4iLAorCQkJc2VsMSwgc2VsZWN0ZWQsIGNicF9zZWwxKTsKKworCW5ld192YWwgPSBjYnBfc2VsMCB8IChjYnBfc2VsMSA8PCA0KTsKKworCWRldl9kYmcoZGktPmRldiwgInVzaW5nOiAleCAlZCAlZFxuIiwgbmV3X3ZhbCwgY2JwX3NlbDAsIGNicF9zZWwxKTsKKwlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX1NZU19DVFJMMl9CTE9DSywKKwkJQUI4NTAwX0JBVFRfT0tfUkVHLCBuZXdfdmFsKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGFiODUwMF9mZ19pbnN0YW50X3dvcmsoKSAtIFJ1biB0aGUgRkcgc3RhdGUgbWFjaGluZSBpbnN0YW50bHkKKyAqIEB3b3JrOglwb2ludGVyIHRvIHRoZSB3b3JrX3N0cnVjdCBzdHJ1Y3R1cmUKKyAqCisgKiBXb3JrIHF1ZXVlIGZ1bmN0aW9uIGZvciBpbnN0YW50IHdvcmsKKyAqLworc3RhdGljIHZvaWQgYWI4NTAwX2ZnX2luc3RhbnRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGFiODUwMF9mZyAqZGkgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFiODUwMF9mZywgZmdfd29yayk7CisKKwlhYjg1MDBfZmdfYWxnb3JpdGhtKGRpKTsKK30KKworLyoqCisgKiBhYjg1MDBfZmdfY2NfZGF0YV9lbmRfaGFuZGxlcigpIC0gZW5kIG9mIGRhdGEgY29udmVyc2lvbiBpc3IuCisgKiBAaXJxOiAgICAgICBpbnRlcnJ1cHQgbnVtYmVyCisgKiBAX2RpOiAgICAgICBwb2ludGVyIHRvIHRoZSBhYjg1MDBfZmcgc3RydWN0dXJlCisgKgorICogUmV0dXJucyBJUlEgc3RhdHVzKElSUV9IQU5ETEVEKQorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYWI4NTAwX2ZnX2NjX2RhdGFfZW5kX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqX2RpKQoreworCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gX2RpOworCWlmICghZGktPm5icl9jY2VvY19pcnFfY250KSB7CisJCWRpLT5uYnJfY2Nlb2NfaXJxX2NudCsrOworCQljb21wbGV0ZSgmZGktPmFiODUwMF9mZ19zdGFydGVkKTsKKwl9IGVsc2UgeworCQlkaS0+bmJyX2NjZW9jX2lycV9jbnQgPSAwOworCQljb21wbGV0ZSgmZGktPmFiODUwMF9mZ19jb21wbGV0ZSk7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBhYjg1MDBfZmdfY2NfaW50X2NhbGliX2hhbmRsZXIgKCkgLSBlbmQgb2YgY2FsaWJyYXRpb24gaXNyLgorICogQGlycTogICAgICAgaW50ZXJydXB0IG51bWJlcgorICogQF9kaTogICAgICAgcG9pbnRlciB0byB0aGUgYWI4NTAwX2ZnIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgSVJRIHN0YXR1cyhJUlFfSEFORExFRCkKKyAqLworc3RhdGljIGlycXJldHVybl90IGFiODUwMF9mZ19jY19pbnRfY2FsaWJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpfZGkpCit7CisJc3RydWN0IGFiODUwMF9mZyAqZGkgPSBfZGk7CisJZGktPmNhbGliX3N0YXRlID0gQUI4NTAwX0ZHX0NBTElCX0VORDsKKwlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmZnX3dxLCAmZGktPmZnX3BlcmlvZGljX3dvcmssIDApOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBhYjg1MDBfZmdfY2NfY29udmVuZF9oYW5kbGVyKCkgLSBpc3IgdG8gZ2V0IGJhdHRlcnkgYXZnIGN1cnJlbnQuCisgKiBAaXJxOiAgICAgICBpbnRlcnJ1cHQgbnVtYmVyCisgKiBAX2RpOiAgICAgICBwb2ludGVyIHRvIHRoZSBhYjg1MDBfZmcgc3RydWN0dXJlCisgKgorICogUmV0dXJucyBJUlEgc3RhdHVzKElSUV9IQU5ETEVEKQorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYWI4NTAwX2ZnX2NjX2NvbnZlbmRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpfZGkpCit7CisJc3RydWN0IGFiODUwMF9mZyAqZGkgPSBfZGk7CisKKwlxdWV1ZV93b3JrKGRpLT5mZ193cSwgJmRpLT5mZ19hY2NfY3VyX3dvcmspOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioKKyAqIGFiODUwMF9mZ19iYXR0X292dl9oYW5kbGVyKCkgLSBCYXR0ZXJ5IE9WViBvY2N1cmVkCisgKiBAaXJxOiAgICAgICBpbnRlcnJ1cHQgbnVtYmVyCisgKiBAX2RpOiAgICAgICBwb2ludGVyIHRvIHRoZSBhYjg1MDBfZmcgc3RydWN0dXJlCisgKgorICogUmV0dXJucyBJUlEgc3RhdHVzKElSUV9IQU5ETEVEKQorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYWI4NTAwX2ZnX2JhdHRfb3Z2X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqX2RpKQoreworCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gX2RpOworCisJZGV2X2RiZyhkaS0+ZGV2LCAiQmF0dGVyeSBPVlZcbiIpOworCisJLyogU2NoZWR1bGUgYSBuZXcgSFcgZmFpbHVyZSBjaGVjayAqLworCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Zmdfd3EsICZkaS0+ZmdfY2hlY2tfaHdfZmFpbHVyZV93b3JrLCAwKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBhYjg1MDBfZmdfbG93YmF0Zl9oYW5kbGVyKCkgLSBCYXR0ZXJ5IHZvbHRhZ2UgaXMgYmVsb3cgTE9XIHRocmVzaG9sZAorICogQGlycTogICAgICAgaW50ZXJydXB0IG51bWJlcgorICogQF9kaTogICAgICAgcG9pbnRlciB0byB0aGUgYWI4NTAwX2ZnIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgSVJRIHN0YXR1cyhJUlFfSEFORExFRCkKKyAqLworc3RhdGljIGlycXJldHVybl90IGFiODUwMF9mZ19sb3diYXRmX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqX2RpKQoreworCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gX2RpOworCisJLyogSW5pdGlhdGUgaGFuZGxpbmcgaW4gYWI4NTAwX2ZnX2xvd19iYXRfd29yaygpIGlmIG5vdCBhbHJlYWR5IGluaXRpYXRlZC4gKi8KKwlpZiAoIWRpLT5mbGFncy5sb3dfYmF0X2RlbGF5KSB7CisJCWRldl93YXJuKGRpLT5kZXYsICJCYXR0ZXJ5IHZvbHRhZ2UgaXMgYmVsb3cgTE9XIHRocmVzaG9sZFxuIik7CisJCWRpLT5mbGFncy5sb3dfYmF0X2RlbGF5ID0gdHJ1ZTsKKwkJLyoKKwkJICogU3RhcnQgYSB0aW1lciB0byBjaGVjayBMT1dfQkFUIGFnYWluIGFmdGVyIHNvbWUgdGltZQorCQkgKiBUaGlzIGlzIGRvbmUgdG8gYXZvaWQgc2h1dGRvd24gb24gc2luZ2xlIHZvbHRhZ2UgZGlwcworCQkgKi8KKwkJcXVldWVfZGVsYXllZF93b3JrKGRpLT5mZ193cSwgJmRpLT5mZ19sb3dfYmF0X3dvcmssCisJCQlyb3VuZF9qaWZmaWVzKExPV19CQVRfQ0hFQ0tfSU5URVJWQUwpKTsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioKKyAqIGFiODUwMF9mZ19nZXRfcHJvcGVydHkoKSAtIGdldCB0aGUgZmcgcHJvcGVydGllcworICogQHBzeToJcG9pbnRlciB0byB0aGUgcG93ZXJfc3VwcGx5IHN0cnVjdHVyZQorICogQHBzcDoJcG9pbnRlciB0byB0aGUgcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHN0cnVjdHVyZQorICogQHZhbDoJcG9pbnRlciB0byB0aGUgcG93ZXJfc3VwcGx5X3Byb3B2YWwgdW5pb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIHdoZW4gYW4gYXBwbGljYXRpb24gdHJpZXMgdG8gZ2V0IHRoZQorICogZmcgcHJvcGVydGllcyBieSByZWFkaW5nIHRoZSBzeXNmcyBmaWxlcy4KKyAqIHZvbHRhZ2Vfbm93OgkJYmF0dGVyeSB2b2x0YWdlCisgKiBjdXJyZW50X25vdzoJCWJhdHRlcnkgaW5zdGFudCBjdXJyZW50CisgKiBjdXJyZW50X2F2ZzoJCWJhdHRlcnkgYXZlcmFnZSBjdXJyZW50CisgKiBjaGFyZ2VfZnVsbF9kZXNpZ246CWNhcGFjaXR5IHdoZXJlIGJhdHRlcnkgaXMgY29uc2lkZXJlZCBmdWxsCisgKiBjaGFyZ2Vfbm93OgkJYmF0dGVyeSBjYXBhY2l0eSBpbiBuQWgKKyAqIGNhcGFjaXR5OgkJY2FwYWNpdHkgaW4gcGVyY2VudAorICogY2FwYWNpdHlfbGV2ZWw6CWNhcGFjaXR5IGxldmVsCisgKgorICogUmV0dXJucyBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZSBlbHNlIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50IGFiODUwMF9mZ19nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAorCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CisKKwkvKgorCSAqIElmIGJhdHRlcnkgaXMgaWRlbnRpZmllZCBhcyB1bmtub3duIGFuZCBjaGFyZ2luZyBvZiB1bmtub3duCisJICogYmF0dGVyaWVzIGlzIGRpc2FibGVkLCB3ZSBhbHdheXMgcmVwb3J0IDEwMCUgY2FwYWNpdHkgYW5kCisJICogY2FwYWNpdHkgbGV2ZWwgVU5LTk9XTiwgc2luY2Ugd2UgY2FuJ3QgY2FsY3VsYXRlCisJICogcmVtYWluaW5nIGNhcGFjaXR5CisJICovCisKKwlzd2l0Y2ggKHBzcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c6CisJCWlmIChkaS0+ZmxhZ3MuYmF0X292dikKKwkJCXZhbC0+aW50dmFsID0gQkFUVF9PVlZfVkFMVUUgKiAxMDAwOworCQllbHNlCisJCQl2YWwtPmludHZhbCA9IGRpLT52YmF0ICogMTAwMDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVzoKKwkJdmFsLT5pbnR2YWwgPSBkaS0+aW5zdF9jdXJyICogMTAwMDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX0FWRzoKKwkJdmFsLT5pbnR2YWwgPSBkaS0+YXZnX2N1cnIgKiAxMDAwOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9GVUxMX0RFU0lHTjoKKwkJdmFsLT5pbnR2YWwgPSBhYjg1MDBfZmdfY29udmVydF9tYWhfdG9fdXdoKGRpLAorCQkJCWRpLT5iYXRfY2FwLm1heF9tYWhfZGVzaWduKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfRlVMTDoKKwkJdmFsLT5pbnR2YWwgPSBhYjg1MDBfZmdfY29udmVydF9tYWhfdG9fdXdoKGRpLAorCQkJCWRpLT5iYXRfY2FwLm1heF9tYWgpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9OT1c6CisJCWlmIChkaS0+ZmxhZ3MuYmF0dF91bmtub3duICYmICFkaS0+Ym0tPmNoZ191bmtub3duX2JhdCAmJgorCQkJCWRpLT5mbGFncy5iYXR0X2lkX3JlY2VpdmVkKQorCQkJdmFsLT5pbnR2YWwgPSBhYjg1MDBfZmdfY29udmVydF9tYWhfdG9fdXdoKGRpLAorCQkJCQlkaS0+YmF0X2NhcC5tYXhfbWFoKTsKKwkJZWxzZQorCQkJdmFsLT5pbnR2YWwgPSBhYjg1MDBfZmdfY29udmVydF9tYWhfdG9fdXdoKGRpLAorCQkJCQlkaS0+YmF0X2NhcC5wcmV2X21haCk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTExfREVTSUdOOgorCQl2YWwtPmludHZhbCA9IGRpLT5iYXRfY2FwLm1heF9tYWhfZGVzaWduOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMOgorCQl2YWwtPmludHZhbCA9IGRpLT5iYXRfY2FwLm1heF9tYWg7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVzoKKwkJaWYgKGRpLT5mbGFncy5iYXR0X3Vua25vd24gJiYgIWRpLT5ibS0+Y2hnX3Vua25vd25fYmF0ICYmCisJCQkJZGktPmZsYWdzLmJhdHRfaWRfcmVjZWl2ZWQpCisJCQl2YWwtPmludHZhbCA9IGRpLT5iYXRfY2FwLm1heF9tYWg7CisJCWVsc2UKKwkJCXZhbC0+aW50dmFsID0gZGktPmJhdF9jYXAucHJldl9tYWg7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFk6CisJCWlmIChkaS0+ZmxhZ3MuYmF0dF91bmtub3duICYmICFkaS0+Ym0tPmNoZ191bmtub3duX2JhdCAmJgorCQkJCWRpLT5mbGFncy5iYXR0X2lkX3JlY2VpdmVkKQorCQkJdmFsLT5pbnR2YWwgPSAxMDA7CisJCWVsc2UKKwkJCXZhbC0+aW50dmFsID0gZGktPmJhdF9jYXAucHJldl9wZXJjZW50OworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZX0xFVkVMOgorCQlpZiAoZGktPmZsYWdzLmJhdHRfdW5rbm93biAmJiAhZGktPmJtLT5jaGdfdW5rbm93bl9iYXQgJiYKKwkJCQlkaS0+ZmxhZ3MuYmF0dF9pZF9yZWNlaXZlZCkKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX1VOS05PV047CisJCWVsc2UKKwkJCXZhbC0+aW50dmFsID0gZGktPmJhdF9jYXAucHJldl9sZXZlbDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFiODUwMF9mZ19nZXRfZXh0X3BzeV9kYXRhKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3k7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqZXh0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJY29uc3QgY2hhciAqKnN1cHBsaWNhbnRzID0gKGNvbnN0IGNoYXIgKiopZXh0LT5zdXBwbGllZF90bzsKKwlzdHJ1Y3QgYWI4NTAwX2ZnICpkaTsKKwl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCByZXQ7CisJaW50IGo7CisKKwlwc3kgPSAoc3RydWN0IHBvd2VyX3N1cHBseSAqKWRhdGE7CisJZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKKworCS8qCisJICogRm9yIGFsbCBwc3kgd2hlcmUgdGhlIG5hbWUgb2YgeW91ciBkcml2ZXIKKwkgKiBhcHBlYXJzIGluIGFueSBzdXBwbGllZF90bworCSAqLworCWogPSBtYXRjaF9zdHJpbmcoc3VwcGxpY2FudHMsIGV4dC0+bnVtX3N1cHBsaWNhbnRzLCBwc3ktPmRlc2MtPm5hbWUpOworCWlmIChqIDwgMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBHbyB0aHJvdWdoIGFsbCBwcm9wZXJ0aWVzIGZvciB0aGUgcHN5ICovCisJZm9yIChqID0gMDsgaiA8IGV4dC0+ZGVzYy0+bnVtX3Byb3BlcnRpZXM7IGorKykgeworCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwcm9wOworCQlwcm9wID0gZXh0LT5kZXNjLT5wcm9wZXJ0aWVzW2pdOworCisJCWlmIChwb3dlcl9zdXBwbHlfZ2V0X3Byb3BlcnR5KGV4dCwgcHJvcCwgJnJldCkpCisJCQljb250aW51ZTsKKworCQlzd2l0Y2ggKHByb3ApIHsKKwkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6CisJCQlzd2l0Y2ggKGV4dC0+ZGVzYy0+dHlwZSkgeworCQkJY2FzZSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOgorCQkJCXN3aXRjaCAocmV0LmludHZhbCkgeworCQkJCWNhc2UgUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOgorCQkJCWNhc2UgUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORzoKKwkJCQljYXNlIFBPV0VSX1NVUFBMWV9TVEFUVVNfTk9UX0NIQVJHSU5HOgorCQkJCQlpZiAoIWRpLT5mbGFncy5jaGFyZ2luZykKKwkJCQkJCWJyZWFrOworCQkJCQlkaS0+ZmxhZ3MuY2hhcmdpbmcgPSBmYWxzZTsKKwkJCQkJZGktPmZsYWdzLmZ1bGx5X2NoYXJnZWQgPSBmYWxzZTsKKwkJCQkJaWYgKGRpLT5ibS0+Y2FwYWNpdHlfc2NhbGluZykKKwkJCQkJCWFiODUwMF9mZ191cGRhdGVfY2FwX3NjYWxlcnMoZGkpOworCQkJCQlxdWV1ZV93b3JrKGRpLT5mZ193cSwgJmRpLT5mZ193b3JrKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBQT1dFUl9TVVBQTFlfU1RBVFVTX0ZVTEw6CisJCQkJCWlmIChkaS0+ZmxhZ3MuZnVsbHlfY2hhcmdlZCkKKwkJCQkJCWJyZWFrOworCQkJCQlkaS0+ZmxhZ3MuZnVsbHlfY2hhcmdlZCA9IHRydWU7CisJCQkJCWRpLT5mbGFncy5mb3JjZV9mdWxsID0gdHJ1ZTsKKwkJCQkJLyogU2F2ZSBjdXJyZW50IGNhcGFjaXR5IGFzIG1heGltdW0gKi8KKwkJCQkJZGktPmJhdF9jYXAubWF4X21haCA9IGRpLT5iYXRfY2FwLm1haDsKKwkJCQkJcXVldWVfd29yayhkaS0+Zmdfd3EsICZkaS0+Zmdfd29yayk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzoKKwkJCQkJaWYgKGRpLT5mbGFncy5jaGFyZ2luZyAmJgorCQkJCQkJIWRpLT5mbGFncy5mdWxseV9jaGFyZ2VkKQorCQkJCQkJYnJlYWs7CisJCQkJCWRpLT5mbGFncy5jaGFyZ2luZyA9IHRydWU7CisJCQkJCWRpLT5mbGFncy5mdWxseV9jaGFyZ2VkID0gZmFsc2U7CisJCQkJCWlmIChkaS0+Ym0tPmNhcGFjaXR5X3NjYWxpbmcpCisJCQkJCQlhYjg1MDBfZmdfdXBkYXRlX2NhcF9zY2FsZXJzKGRpKTsKKwkJCQkJcXVldWVfd29yayhkaS0+Zmdfd3EsICZkaS0+Zmdfd29yayk7CisJCQkJCWJyZWFrOworCQkJCX07CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfTsKKwkJCWJyZWFrOworCQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1k6CisJCQlzd2l0Y2ggKGV4dC0+ZGVzYy0+dHlwZSkgeworCQkJY2FzZSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOgorCQkJCWlmICghZGktPmZsYWdzLmJhdHRfaWRfcmVjZWl2ZWQgJiYKKwkJCQkgICAgZGktPmJtLT5iYXR0X2lkICE9IEJBVFRFUllfVU5LTk9XTikgeworCQkJCQljb25zdCBzdHJ1Y3QgYWJ4NTAwX2JhdHRlcnlfdHlwZSAqYjsKKworCQkJCQliID0gJihkaS0+Ym0tPmJhdF90eXBlW2RpLT5ibS0+YmF0dF9pZF0pOworCisJCQkJCWRpLT5mbGFncy5iYXR0X2lkX3JlY2VpdmVkID0gdHJ1ZTsKKworCQkJCQlkaS0+YmF0X2NhcC5tYXhfbWFoX2Rlc2lnbiA9CisJCQkJCQlNSUxMSV9UT19NSUNSTyAqCisJCQkJCQliLT5jaGFyZ2VfZnVsbF9kZXNpZ247CisKKwkJCQkJZGktPmJhdF9jYXAubWF4X21haCA9CisJCQkJCQlkaS0+YmF0X2NhcC5tYXhfbWFoX2Rlc2lnbjsKKworCQkJCQlkaS0+dmJhdF9ub20gPSBiLT5ub21pbmFsX3ZvbHRhZ2U7CisJCQkJfQorCisJCQkJaWYgKHJldC5pbnR2YWwpCisJCQkJCWRpLT5mbGFncy5iYXR0X3Vua25vd24gPSBmYWxzZTsKKwkJCQllbHNlCisJCQkJCWRpLT5mbGFncy5iYXR0X3Vua25vd24gPSB0cnVlOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVA6CisJCQlzd2l0Y2ggKGV4dC0+ZGVzYy0+dHlwZSkgeworCQkJY2FzZSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOgorCQkJCWlmIChkaS0+ZmxhZ3MuYmF0dF9pZF9yZWNlaXZlZCkKKwkJCQkJZGktPmJhdF90ZW1wID0gcmV0LmludHZhbDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIGFiODUwMF9mZ19pbml0X2h3X3JlZ2lzdGVycygpIC0gU2V0IHVwIEZHIHJlbGF0ZWQgcmVnaXN0ZXJzCisgKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYjg1MDBfZmcgc3RydWN0dXJlCisgKgorICogU2V0IHVwIGJhdHRlcnkgT1ZWLCBsb3cgYmF0dGVyeSB2b2x0YWdlIHJlZ2lzdGVycworICovCitzdGF0aWMgaW50IGFiODUwMF9mZ19pbml0X2h3X3JlZ2lzdGVycyhzdHJ1Y3QgYWI4NTAwX2ZnICpkaSkKK3sKKwlpbnQgcmV0OworCisJLyogU2V0IFZCQVQgT1ZWIHRocmVzaG9sZCAqLworCXJldCA9IGFieDUwMF9tYXNrX2FuZF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LAorCQlBQjg1MDBfQ0hBUkdFUiwKKwkJQUI4NTAwX0JBVFRfT1ZWLAorCQlCQVRUX09WVl9USF80UDc1LAorCQlCQVRUX09WVl9USF80UDc1KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byBzZXQgQkFUVF9PVlZcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBFbmFibGUgVkJBVCBPVlYgZGV0ZWN0aW9uICovCisJcmV0ID0gYWJ4NTAwX21hc2tfYW5kX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCisJCUFCODUwMF9DSEFSR0VSLAorCQlBQjg1MDBfQkFUVF9PVlYsCisJCUJBVFRfT1ZWX0VOQSwKKwkJQkFUVF9PVlZfRU5BKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byBlbmFibGUgQkFUVF9PVlZcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBMb3cgQmF0dGVyeSBWb2x0YWdlICovCisJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsCisJCUFCODUwMF9TWVNfQ1RSTDJfQkxPQ0ssCisJCUFCODUwMF9MT1dfQkFUX1JFRywKKwkJYWI4NTAwX3ZvbHRfdG9fcmVndmFsKAorCQkJZGktPmJtLT5mZ19wYXJhbXMtPmxvd2JhdF90aHJlc2hvbGQpIDw8IDEgfAorCQlMT1dfQkFUX0VOQUJMRSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRpLT5kZXYsICIlcyB3cml0ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQmF0dGVyeSBPSyB0aHJlc2hvbGQgKi8KKwlyZXQgPSBhYjg1MDBfZmdfYmF0dG9rX2luaXRfaHdfcmVnaXN0ZXIoZGkpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkaS0+ZGV2LCAiQmF0dE9rIGluaXQgd3JpdGUgZmFpbGVkLlxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmICgoKGlzX2FiODUwNShkaS0+cGFyZW50KSB8fCBpc19hYjk1NDAoZGktPnBhcmVudCkpICYmCisJCQlhYng1MDBfZ2V0X2NoaXBfaWQoZGktPmRldikgPj0gQUI4NTAwX0NVVDJQMCkKKwkJCXx8IGlzX2FiODU0MChkaS0+cGFyZW50KSkgeworCQlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX1JUQywKKwkJCUFCODUwNV9SVENfUENVVF9NQVhfVElNRV9SRUcsIGRpLT5ibS0+ZmdfcGFyYW1zLT5wY3V0X21heF90aW1lKTsKKworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRpLT5kZXYsICIlcyB3cml0ZSBmYWlsZWQgQUI4NTA1X1JUQ19QQ1VUX01BWF9USU1FX1JFR1xuIiwgX19mdW5jX18pOworCQkJZ290byBvdXQ7CisJCX07CisKKwkJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9SVEMsCisJCQlBQjg1MDVfUlRDX1BDVVRfRkxBR19USU1FX1JFRywgZGktPmJtLT5mZ19wYXJhbXMtPnBjdXRfZmxhZ190aW1lKTsKKworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRpLT5kZXYsICIlcyB3cml0ZSBmYWlsZWQgQUI4NTA1X1JUQ19QQ1VUX0ZMQUdfVElNRV9SRUdcbiIsIF9fZnVuY19fKTsKKwkJCWdvdG8gb3V0OworCQl9OworCisJCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfUlRDLAorCQkJQUI4NTA1X1JUQ19QQ1VUX1JFU1RBUlRfUkVHLCBkaS0+Ym0tPmZnX3BhcmFtcy0+cGN1dF9tYXhfcmVzdGFydCk7CisKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgd3JpdGUgZmFpbGVkIEFCODUwNV9SVENfUENVVF9SRVNUQVJUX1JFR1xuIiwgX19mdW5jX18pOworCQkJZ290byBvdXQ7CisJCX07CisKKwkJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9SVEMsCisJCQlBQjg1MDVfUlRDX1BDVVRfREVCT1VOQ0VfUkVHLCBkaS0+Ym0tPmZnX3BhcmFtcy0+cGN1dF9kZWJvdW5jZV90aW1lKTsKKworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRpLT5kZXYsICIlcyB3cml0ZSBmYWlsZWQgQUI4NTA1X1JUQ19QQ1VUX0RFQk9VTkNFX1JFR1xuIiwgX19mdW5jX18pOworCQkJZ290byBvdXQ7CisJCX07CisKKwkJcmV0ID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9SVEMsCisJCQlBQjg1MDVfUlRDX1BDVVRfQ1RMX1NUQVRVU19SRUcsIGRpLT5ibS0+ZmdfcGFyYW1zLT5wY3V0X2VuYWJsZSk7CisKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkaS0+ZGV2LCAiJXMgd3JpdGUgZmFpbGVkIEFCODUwNV9SVENfUENVVF9DVExfU1RBVFVTX1JFR1xuIiwgX19mdW5jX18pOworCQkJZ290byBvdXQ7CisJCX07CisJfQorb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYWI4NTAwX2ZnX2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQoKSAtIGNhbGxiYWNrIGZvciBwb3dlciBzdXBwbHkgY2hhbmdlcworICogQHBzeTogICAgICAgcG9pbnRlciB0byB0aGUgc3RydWN0dXJlIHBvd2VyX3N1cHBseQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGVudHJ5IHBvaW50IG9mIHRoZSBwb2ludGVyIGV4dGVybmFsX3Bvd2VyX2NoYW5nZWQKKyAqIG9mIHRoZSBzdHJ1Y3R1cmUgcG93ZXJfc3VwcGx5LgorICogVGhpcyBmdW5jdGlvbiBnZXRzIGV4ZWN1dGVkIHdoZW4gdGhlcmUgaXMgYSBjaGFuZ2UgaW4gYW55IGV4dGVybmFsIHBvd2VyCisgKiBzdXBwbHkgdGhhdCB0aGlzIGRyaXZlciBuZWVkcyB0byBiZSBub3RpZmllZCBvZi4KKyAqLworc3RhdGljIHZvaWQgYWI4NTAwX2ZnX2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KQoreworCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CisKKwljbGFzc19mb3JfZWFjaF9kZXZpY2UocG93ZXJfc3VwcGx5X2NsYXNzLCBOVUxMLAorCQlkaS0+ZmdfcHN5LCBhYjg1MDBfZmdfZ2V0X2V4dF9wc3lfZGF0YSk7Cit9CisKKy8qKgorICogYWJhYjg1MDBfZmdfcmVpbml0X3dvcmsoKSAtIHdvcmsgdG8gcmVzZXQgdGhlIEZHIGFsZ29yaXRobQorICogQHdvcms6CXBvaW50ZXIgdG8gdGhlIHdvcmtfc3RydWN0IHN0cnVjdHVyZQorICoKKyAqIFVzZWQgdG8gcmVzZXQgdGhlIGN1cnJlbnQgYmF0dGVyeSBjYXBhY2l0eSB0byBiZSBhYmxlIHRvCisgKiByZXRyaWdnZXIgYSBuZXcgdm9sdGFnZSBiYXNlIGNhcGFjaXR5IGNhbGN1bGF0aW9uLiBGb3IKKyAqIHRlc3QgYW5kIHZlcmlmaWNhdGlvbiBwdXJwb3NlLgorICovCitzdGF0aWMgdm9pZCBhYjg1MDBfZmdfcmVpbml0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhYjg1MDBfZmcsCisJCWZnX3JlaW5pdF93b3JrLndvcmspOworCisJaWYgKGRpLT5mbGFncy5jYWxpYnJhdGUgPT0gZmFsc2UpIHsKKwkJZGV2X2RiZyhkaS0+ZGV2LCAiUmVzZXR0aW5nIEZHIHN0YXRlIG1hY2hpbmUgdG8gaW5pdC5cbiIpOworCQlhYjg1MDBfZmdfY2xlYXJfY2FwX3NhbXBsZXMoZGkpOworCQlhYjg1MDBfZmdfY2FsY19jYXBfZGlzY2hhcmdlX3ZvbHRhZ2UoZGksIHRydWUpOworCQlhYjg1MDBfZmdfY2hhcmdlX3N0YXRlX3RvKGRpLCBBQjg1MDBfRkdfQ0hBUkdFX0lOSVQpOworCQlhYjg1MDBfZmdfZGlzY2hhcmdlX3N0YXRlX3RvKGRpLCBBQjg1MDBfRkdfRElTQ0hBUkdFX0lOSVQpOworCQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmZnX3dxLCAmZGktPmZnX3BlcmlvZGljX3dvcmssIDApOworCisJfSBlbHNlIHsKKwkJZGV2X2VycihkaS0+ZGV2LCAiUmVzaWR1YWwgb2Zmc2V0IGNhbGlicmF0aW9uIG9uZ29pbmcgIgorCQkJInJldHJ5aW5nLi5cbiIpOworCQkvKiBXYWl0IG9uZSBzZWNvbmQgdW50aWwgbmV4dCB0cnkqLworCQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmZnX3dxLCAmZGktPmZnX3JlaW5pdF93b3JrLAorCQkJcm91bmRfamlmZmllcygxKSk7CisJfQorfQorCisvKiBFeHBvc3VyZSB0byB0aGUgc3lzZnMgaW50ZXJmYWNlICovCisKK3N0cnVjdCBhYjg1MDBfZmdfc3lzZnNfZW50cnkgeworCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKKwlzc2l6ZV90ICgqc2hvdykoc3RydWN0IGFiODUwMF9mZyAqLCBjaGFyICopOworCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IGFiODUwMF9mZyAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7Cit9OworCitzdGF0aWMgc3NpemVfdCBjaGFyZ2VfZnVsbF9zaG93KHN0cnVjdCBhYjg1MDBfZmcgKmRpLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRpLT5iYXRfY2FwLm1heF9tYWgpOworfQorCitzdGF0aWMgc3NpemVfdCBjaGFyZ2VfZnVsbF9zdG9yZShzdHJ1Y3QgYWI4NTAwX2ZnICpkaSwgY29uc3QgY2hhciAqYnVmLAorCQkJCSBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyBjaGFyZ2VfZnVsbDsKKwlzc2l6ZV90IHJldDsKKworCXJldCA9IGtzdHJ0b3VsKGJ1ZiwgMTAsICZjaGFyZ2VfZnVsbCk7CisKKwlkZXZfZGJnKGRpLT5kZXYsICJSZXQgJXpkIGNoYXJnZV9mdWxsICVsdSIsIHJldCwgY2hhcmdlX2Z1bGwpOworCisJaWYgKCFyZXQpIHsKKwkJZGktPmJhdF9jYXAubWF4X21haCA9IChpbnQpIGNoYXJnZV9mdWxsOworCQlyZXQgPSBjb3VudDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgY2hhcmdlX25vd19zaG93KHN0cnVjdCBhYjg1MDBfZmcgKmRpLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRpLT5iYXRfY2FwLnByZXZfbWFoKTsKK30KKworc3RhdGljIHNzaXplX3QgY2hhcmdlX25vd19zdG9yZShzdHJ1Y3QgYWI4NTAwX2ZnICpkaSwgY29uc3QgY2hhciAqYnVmLAorCQkJCSBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyBjaGFyZ2Vfbm93OworCXNzaXplX3QgcmV0OworCisJcmV0ID0ga3N0cnRvdWwoYnVmLCAxMCwgJmNoYXJnZV9ub3cpOworCisJZGV2X2RiZyhkaS0+ZGV2LCAiUmV0ICV6ZCBjaGFyZ2Vfbm93ICVsdSB3YXMgJWQiLAorCQlyZXQsIGNoYXJnZV9ub3csIGRpLT5iYXRfY2FwLnByZXZfbWFoKTsKKworCWlmICghcmV0KSB7CisJCWRpLT5iYXRfY2FwLnVzZXJfbWFoID0gKGludCkgY2hhcmdlX25vdzsKKwkJZGktPmZsYWdzLnVzZXJfY2FwID0gdHJ1ZTsKKwkJcmV0ID0gY291bnQ7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Zmdfd3EsICZkaS0+ZmdfcGVyaW9kaWNfd29yaywgMCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWI4NTAwX2ZnX3N5c2ZzX2VudHJ5IGNoYXJnZV9mdWxsX2F0dHIgPQorCV9fQVRUUihjaGFyZ2VfZnVsbCwgMDY0NCwgY2hhcmdlX2Z1bGxfc2hvdywgY2hhcmdlX2Z1bGxfc3RvcmUpOworCitzdGF0aWMgc3RydWN0IGFiODUwMF9mZ19zeXNmc19lbnRyeSBjaGFyZ2Vfbm93X2F0dHIgPQorCV9fQVRUUihjaGFyZ2Vfbm93LCAwNjQ0LCBjaGFyZ2Vfbm93X3Nob3csIGNoYXJnZV9ub3dfc3RvcmUpOworCitzdGF0aWMgc3NpemVfdAorYWI4NTAwX2ZnX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWI4NTAwX2ZnX3N5c2ZzX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgYWI4NTAwX2ZnICpkaTsKKworCWVudHJ5ID0gY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBhYjg1MDBfZmdfc3lzZnNfZW50cnksIGF0dHIpOworCWRpID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBhYjg1MDBfZmcsIGZnX2tvYmplY3QpOworCisJaWYgKCFlbnRyeS0+c2hvdykKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gZW50cnktPnNob3coZGksIGJ1Zik7Cit9CitzdGF0aWMgc3NpemVfdAorYWI4NTAwX2ZnX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgYWI4NTAwX2ZnX3N5c2ZzX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgYWI4NTAwX2ZnICpkaTsKKworCWVudHJ5ID0gY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBhYjg1MDBfZmdfc3lzZnNfZW50cnksIGF0dHIpOworCWRpID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBhYjg1MDBfZmcsIGZnX2tvYmplY3QpOworCisJaWYgKCFlbnRyeS0+c3RvcmUpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGVudHJ5LT5zdG9yZShkaSwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3lzZnNfb3BzIGFiODUwMF9mZ19zeXNmc19vcHMgPSB7CisJLnNob3cgPSBhYjg1MDBfZmdfc2hvdywKKwkuc3RvcmUgPSBhYjg1MDBfZmdfc3RvcmUsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWI4NTAwX2ZnX2F0dHJzW10gPSB7CisJJmNoYXJnZV9mdWxsX2F0dHIuYXR0ciwKKwkmY2hhcmdlX25vd19hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGFiODUwMF9mZ19rdHlwZSA9IHsKKwkuc3lzZnNfb3BzID0gJmFiODUwMF9mZ19zeXNmc19vcHMsCisJLmRlZmF1bHRfYXR0cnMgPSBhYjg1MDBfZmdfYXR0cnMsCit9OworCisvKioKKyAqIGFiODUwMF9jaGFyZ2FsZ19zeXNmc19leGl0KCkgLSBkZS1pbml0IG9mIHN5c2ZzIGVudHJ5CisgKiBAZGk6ICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBhYjg1MDBfY2hhcmdhbGcKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIGVudHJ5IGluIHN5c2ZzLgorICovCitzdGF0aWMgdm9pZCBhYjg1MDBfZmdfc3lzZnNfZXhpdChzdHJ1Y3QgYWI4NTAwX2ZnICpkaSkKK3sKKwlrb2JqZWN0X2RlbCgmZGktPmZnX2tvYmplY3QpOworfQorCisvKioKKyAqIGFiODUwMF9jaGFyZ2FsZ19zeXNmc19pbml0KCkgLSBpbml0IG9mIHN5c2ZzIGVudHJ5CisgKiBAZGk6ICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBhYjg1MDBfY2hhcmdhbGcKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFkZHMgYW4gZW50cnkgaW4gc3lzZnMuCisgKiBSZXR1cm5zIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlIGVsc2UgMChvbiBzdWNjZXNzKQorICovCitzdGF0aWMgaW50IGFiODUwMF9mZ19zeXNmc19pbml0KHN0cnVjdCBhYjg1MDBfZmcgKmRpKQoreworCWludCByZXQgPSAwOworCisJcmV0ID0ga29iamVjdF9pbml0X2FuZF9hZGQoJmRpLT5mZ19rb2JqZWN0LAorCQkmYWI4NTAwX2ZnX2t0eXBlLAorCQlOVUxMLCAiYmF0dGVyeSIpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGVudHJ5XG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFiODUwNV9wb3dlcmN1dF9mbGFndGltZV9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXU4IHJlZ192YWx1ZTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWI4NTAwX2ZnICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOworCisJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9SVEMsCisJCUFCODUwNV9SVENfUENVVF9GTEFHX1RJTUVfUkVHLCAmcmVnX3ZhbHVlKTsKKworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlYWQgQUI4NTA1X1JUQ19QQ1VUX0ZMQUdfVElNRV9SRUdcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCAocmVnX3ZhbHVlICYgMHg3RikpOworCitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFiODUwNV9wb3dlcmN1dF9mbGFndGltZV93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCByZXQ7CisJbG9uZyB1bnNpZ25lZCByZWdfdmFsdWU7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFiODUwMF9mZyAqZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKKworCXJlZ192YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJaWYgKHJlZ192YWx1ZSA+IDB4N0YpIHsKKwkJZGV2X2VycihkZXYsICJJbmNvcnJlY3QgcGFyYW1ldGVyLCBlY2hvIDAgKDEuOThzKSAtIDEyNyAoMTUuNjI1bXMpIGZvciBmbGFndGltZVxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX1JUQywKKwkJQUI4NTA1X1JUQ19QQ1VUX0ZMQUdfVElNRV9SRUcsICh1OClyZWdfdmFsdWUpOworCisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHNldCBBQjg1MDVfUlRDX1BDVVRfRkxBR19USU1FX1JFR1xuIik7CisKK2ZhaWw6CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBhYjg1MDVfcG93ZXJjdXRfbWF4dGltZV9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXU4IHJlZ192YWx1ZTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWI4NTAwX2ZnICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOworCisJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9SVEMsCisJCUFCODUwNV9SVENfUENVVF9NQVhfVElNRV9SRUcsICZyZWdfdmFsdWUpOworCisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVhZCBBQjg1MDVfUlRDX1BDVVRfTUFYX1RJTUVfUkVHXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgKHJlZ192YWx1ZSAmIDB4N0YpKTsKKworZmFpbDoKKwlyZXR1cm4gcmV0OworCit9CisKK3N0YXRpYyBzc2l6ZV90IGFiODUwNV9wb3dlcmN1dF9tYXh0aW1lX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IHJldDsKKwlpbnQgcmVnX3ZhbHVlOworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CisKKwlyZWdfdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwlpZiAocmVnX3ZhbHVlID4gMHg3RikgeworCQlkZXZfZXJyKGRldiwgIkluY29ycmVjdCBwYXJhbWV0ZXIsIGVjaG8gMCAoMC4wcykgLSAxMjcgKDEuOThzKSBmb3IgbWF4dGltZVxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX1JUQywKKwkJQUI4NTA1X1JUQ19QQ1VUX01BWF9USU1FX1JFRywgKHU4KXJlZ192YWx1ZSk7CisKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gc2V0IEFCODUwNV9SVENfUENVVF9NQVhfVElNRV9SRUdcbiIpOworCitmYWlsOgorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgYWI4NTA1X3Bvd2VyY3V0X3Jlc3RhcnRfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICBjaGFyICpidWYpCit7CisJaW50IHJldDsKKwl1OCByZWdfdmFsdWU7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFiODUwMF9mZyAqZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKKworCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfUlRDLAorCQlBQjg1MDVfUlRDX1BDVVRfUkVTVEFSVF9SRUcsICZyZWdfdmFsdWUpOworCisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVhZCBBQjg1MDVfUlRDX1BDVVRfUkVTVEFSVF9SRUdcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCAocmVnX3ZhbHVlICYgMHhGKSk7CisKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWI4NTA1X3Bvd2VyY3V0X3Jlc3RhcnRfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCByZXQ7CisJaW50IHJlZ192YWx1ZTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWI4NTAwX2ZnICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOworCisJcmVnX3ZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJaWYgKHJlZ192YWx1ZSA+IDB4RikgeworCQlkZXZfZXJyKGRldiwgIkluY29ycmVjdCBwYXJhbWV0ZXIsIGVjaG8gMCAtIDE1IGZvciBudW1iZXIgb2YgcmVzdGFydFxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXQgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX1JUQywKKwkJCQkJCUFCODUwNV9SVENfUENVVF9SRVNUQVJUX1JFRywgKHU4KXJlZ192YWx1ZSk7CisKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gc2V0IEFCODUwNV9SVENfUENVVF9SRVNUQVJUX1JFR1xuIik7CisKK2ZhaWw6CisJcmV0dXJuIGNvdW50OworCit9CisKK3N0YXRpYyBzc2l6ZV90IGFiODUwNV9wb3dlcmN1dF90aW1lcl9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICBjaGFyICpidWYpCit7CisJaW50IHJldDsKKwl1OCByZWdfdmFsdWU7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFiODUwMF9mZyAqZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKKworCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfUlRDLAorCQkJCQkJQUI4NTA1X1JUQ19QQ1VUX1RJTUVfUkVHLCAmcmVnX3ZhbHVlKTsKKworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlYWQgQUI4NTA1X1JUQ19QQ1VUX1RJTUVfUkVHXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgKHJlZ192YWx1ZSAmIDB4N0YpKTsKKworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhYjg1MDVfcG93ZXJjdXRfcmVzdGFydF9jb3VudGVyX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkJICAgIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXU4IHJlZ192YWx1ZTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWI4NTAwX2ZnICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOworCisJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9SVEMsCisJCQkJCQlBQjg1MDVfUlRDX1BDVVRfUkVTVEFSVF9SRUcsICZyZWdfdmFsdWUpOworCisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVhZCBBQjg1MDVfUlRDX1BDVVRfUkVTVEFSVF9SRUdcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCAocmVnX3ZhbHVlICYgMHhGMCkgPj4gNCk7CisKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWI4NTA1X3Bvd2VyY3V0X3JlYWQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgY2hhciAqYnVmKQoreworCWludCByZXQ7CisJdTggcmVnX3ZhbHVlOworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CisKKwlyZXQgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX1JUQywKKwkJCQkJCUFCODUwNV9SVENfUENVVF9DVExfU1RBVFVTX1JFRywgJnJlZ192YWx1ZSk7CisKKwlpZiAocmV0IDwgMCkKKwkJZ290byBmYWlsOworCisJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCAocmVnX3ZhbHVlICYgMHgxKSk7CisKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWI4NTA1X3Bvd2VyY3V0X3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IHJldDsKKwlpbnQgcmVnX3ZhbHVlOworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CisKKwlyZWdfdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwlpZiAocmVnX3ZhbHVlID4gMHgxKSB7CisJCWRldl9lcnIoZGV2LCAiSW5jb3JyZWN0IHBhcmFtZXRlciwgZWNobyAwLzEgdG8gZGlzYWJsZS9lbmFibGUgUGN1dCBmZWF0dXJlXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfUlRDLAorCQkJCQkJQUI4NTA1X1JUQ19QQ1VUX0NUTF9TVEFUVVNfUkVHLCAodTgpcmVnX3ZhbHVlKTsKKworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBzZXQgQUI4NTA1X1JUQ19QQ1VUX0NUTF9TVEFUVVNfUkVHXG4iKTsKKworZmFpbDoKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFiODUwNV9wb3dlcmN1dF9mbGFnX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjaGFyICpidWYpCit7CisKKwlpbnQgcmV0OworCXU4IHJlZ192YWx1ZTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWI4NTAwX2ZnICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOworCisJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9SVEMsCisJCQkJCQlBQjg1MDVfUlRDX1BDVVRfQ1RMX1NUQVRVU19SRUcsICAmcmVnX3ZhbHVlKTsKKworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlYWQgQUI4NTA1X1JUQ19QQ1VUX0NUTF9TVEFUVVNfUkVHXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgKChyZWdfdmFsdWUgJiAweDEwKSA+PiA0KSk7CisKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWI4NTA1X3Bvd2VyY3V0X2RlYm91bmNlX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXU4IHJlZ192YWx1ZTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWI4NTAwX2ZnICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOworCisJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9SVEMsCisJCQkJCQlBQjg1MDVfUlRDX1BDVVRfREVCT1VOQ0VfUkVHLCAgJnJlZ192YWx1ZSk7CisKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWFkIEFCODUwNV9SVENfUENVVF9ERUJPVU5DRV9SRUdcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCAocmVnX3ZhbHVlICYgMHg3KSk7CisKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWI4NTA1X3Bvd2VyY3V0X2RlYm91bmNlX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCByZXQ7CisJaW50IHJlZ192YWx1ZTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWI4NTAwX2ZnICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOworCisJcmVnX3ZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJaWYgKHJlZ192YWx1ZSA+IDB4NykgeworCQlkZXZfZXJyKGRldiwgIkluY29ycmVjdCBwYXJhbWV0ZXIsIGVjaG8gMCB0byA3IGZvciBkZWJvdW5jZSBzZXR0aW5nXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCXJldCA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfUlRDLAorCQkJCQkJQUI4NTA1X1JUQ19QQ1VUX0RFQk9VTkNFX1JFRywgKHU4KXJlZ192YWx1ZSk7CisKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gc2V0IEFCODUwNV9SVENfUENVVF9ERUJPVU5DRV9SRUdcbiIpOworCitmYWlsOgorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgYWI4NTA1X3Bvd2VyY3V0X2VuYWJsZV9zdGF0dXNfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkJICBjaGFyICpidWYpCit7CisJaW50IHJldDsKKwl1OCByZWdfdmFsdWU7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFiODUwMF9mZyAqZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKKworCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfUlRDLAorCQkJCQkJQUI4NTA1X1JUQ19QQ1VUX0NUTF9TVEFUVVNfUkVHLCAmcmVnX3ZhbHVlKTsKKworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlYWQgQUI4NTA1X1JUQ19QQ1VUX0NUTF9TVEFUVVNfUkVHXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgKChyZWdfdmFsdWUgJiAweDIwKSA+PiA1KSk7CisKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGFiODUwNV9mZ19zeXNmc19wc3lfYXR0cnNbXSA9IHsKKwlfX0FUVFIocG93ZXJjdXRfZmxhZ3RpbWUsIChTX0lSVUdPIHwgU19JV1VTUiB8IFNfSVdHUlApLAorCQlhYjg1MDVfcG93ZXJjdXRfZmxhZ3RpbWVfcmVhZCwgYWI4NTA1X3Bvd2VyY3V0X2ZsYWd0aW1lX3dyaXRlKSwKKwlfX0FUVFIocG93ZXJjdXRfbWF4dGltZSwgKFNfSVJVR08gfCBTX0lXVVNSIHwgU19JV0dSUCksCisJCWFiODUwNV9wb3dlcmN1dF9tYXh0aW1lX3JlYWQsIGFiODUwNV9wb3dlcmN1dF9tYXh0aW1lX3dyaXRlKSwKKwlfX0FUVFIocG93ZXJjdXRfcmVzdGFydF9tYXgsIChTX0lSVUdPIHwgU19JV1VTUiB8IFNfSVdHUlApLAorCQlhYjg1MDVfcG93ZXJjdXRfcmVzdGFydF9yZWFkLCBhYjg1MDVfcG93ZXJjdXRfcmVzdGFydF93cml0ZSksCisJX19BVFRSKHBvd2VyY3V0X3RpbWVyLCBTX0lSVUdPLCBhYjg1MDVfcG93ZXJjdXRfdGltZXJfcmVhZCwgTlVMTCksCisJX19BVFRSKHBvd2VyY3V0X3Jlc3RhcnRfY291bnRlciwgU19JUlVHTywKKwkJYWI4NTA1X3Bvd2VyY3V0X3Jlc3RhcnRfY291bnRlcl9yZWFkLCBOVUxMKSwKKwlfX0FUVFIocG93ZXJjdXRfZW5hYmxlLCAoU19JUlVHTyB8IFNfSVdVU1IgfCBTX0lXR1JQKSwKKwkJYWI4NTA1X3Bvd2VyY3V0X3JlYWQsIGFiODUwNV9wb3dlcmN1dF93cml0ZSksCisJX19BVFRSKHBvd2VyY3V0X2ZsYWcsIFNfSVJVR08sIGFiODUwNV9wb3dlcmN1dF9mbGFnX3JlYWQsIE5VTEwpLAorCV9fQVRUUihwb3dlcmN1dF9kZWJvdW5jZV90aW1lLCAoU19JUlVHTyB8IFNfSVdVU1IgfCBTX0lXR1JQKSwKKwkJYWI4NTA1X3Bvd2VyY3V0X2RlYm91bmNlX3JlYWQsIGFiODUwNV9wb3dlcmN1dF9kZWJvdW5jZV93cml0ZSksCisJX19BVFRSKHBvd2VyY3V0X2VuYWJsZV9zdGF0dXMsIFNfSVJVR08sCisJCWFiODUwNV9wb3dlcmN1dF9lbmFibGVfc3RhdHVzX3JlYWQsIE5VTEwpLAorfTsKKworc3RhdGljIGludCBhYjg1MDBfZmdfc3lzZnNfcHN5X2NyZWF0ZV9hdHRycyhzdHJ1Y3QgYWI4NTAwX2ZnICpkaSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICgoKGlzX2FiODUwNShkaS0+cGFyZW50KSB8fCBpc19hYjk1NDAoZGktPnBhcmVudCkpICYmCisJICAgICBhYng1MDBfZ2V0X2NoaXBfaWQoZGktPmRldikgPj0gQUI4NTAwX0NVVDJQMCkKKwkgICAgfHwgaXNfYWI4NTQwKGRpLT5wYXJlbnQpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFiODUwNV9mZ19zeXNmc19wc3lfYXR0cnMpOyBpKyspCisJCQlpZiAoZGV2aWNlX2NyZWF0ZV9maWxlKCZkaS0+ZmdfcHN5LT5kZXYsCisJCQkJCSAgICAgICAmYWI4NTA1X2ZnX3N5c2ZzX3BzeV9hdHRyc1tpXSkpCisJCQkJZ290byBzeXNmc19wc3lfY3JlYXRlX2F0dHJzX2ZhaWxlZF9hYjg1MDU7CisJfQorCXJldHVybiAwOworc3lzZnNfcHN5X2NyZWF0ZV9hdHRyc19mYWlsZWRfYWI4NTA1OgorCWRldl9lcnIoJmRpLT5mZ19wc3ktPmRldiwgIkZhaWxlZCBjcmVhdGluZyBzeXNmcyBwc3kgYXR0cnMgZm9yIGFiODUwNS5cbiIpOworCXdoaWxlIChpLS0pCisJCWRldmljZV9yZW1vdmVfZmlsZSgmZGktPmZnX3BzeS0+ZGV2LAorCQkJCSAgICZhYjg1MDVfZmdfc3lzZnNfcHN5X2F0dHJzW2ldKTsKKworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgdm9pZCBhYjg1MDBfZmdfc3lzZnNfcHN5X3JlbW92ZV9hdHRycyhzdHJ1Y3QgYWI4NTAwX2ZnICpkaSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICgoKGlzX2FiODUwNShkaS0+cGFyZW50KSB8fCBpc19hYjk1NDAoZGktPnBhcmVudCkpICYmCisJICAgICBhYng1MDBfZ2V0X2NoaXBfaWQoZGktPmRldikgPj0gQUI4NTAwX0NVVDJQMCkKKwkgICAgfHwgaXNfYWI4NTQwKGRpLT5wYXJlbnQpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFiODUwNV9mZ19zeXNmc19wc3lfYXR0cnMpOyBpKyspCisJCQkodm9pZClkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRpLT5mZ19wc3ktPmRldiwKKwkJCQkJCSAmYWI4NTA1X2ZnX3N5c2ZzX3BzeV9hdHRyc1tpXSk7CisJfQorfQorCisvKiBFeHBvc3VyZSB0byB0aGUgc3lzZnMgaW50ZXJmYWNlIDw8RU5EPj4gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1BNKQorc3RhdGljIGludCBhYjg1MDBfZmdfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFiODUwMF9mZyAqZGkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCS8qCisJICogQ2hhbmdlIHN0YXRlIGlmIHdlJ3JlIG5vdCBjaGFyZ2luZy4gSWYgd2UncmUgY2hhcmdpbmcgd2Ugd2lsbCB3YWtlCisJICogdXAgb24gdGhlIEZHIElSUQorCSAqLworCWlmICghZGktPmZsYWdzLmNoYXJnaW5nKSB7CisJCWFiODUwMF9mZ19kaXNjaGFyZ2Vfc3RhdGVfdG8oZGksIEFCODUwMF9GR19ESVNDSEFSR0VfV0FLRVVQKTsKKwkJcXVldWVfd29yayhkaS0+Zmdfd3EsICZkaS0+Zmdfd29yayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWI4NTAwX2ZnX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwlwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IGFiODUwMF9mZyAqZGkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWZsdXNoX2RlbGF5ZWRfd29yaygmZGktPmZnX3BlcmlvZGljX3dvcmspOworCWZsdXNoX3dvcmsoJmRpLT5mZ193b3JrKTsKKwlmbHVzaF93b3JrKCZkaS0+ZmdfYWNjX2N1cl93b3JrKTsKKwlmbHVzaF9kZWxheWVkX3dvcmsoJmRpLT5mZ19yZWluaXRfd29yayk7CisJZmx1c2hfZGVsYXllZF93b3JrKCZkaS0+ZmdfbG93X2JhdF93b3JrKTsKKwlmbHVzaF9kZWxheWVkX3dvcmsoJmRpLT5mZ19jaGVja19od19mYWlsdXJlX3dvcmspOworCisJLyoKKwkgKiBJZiB0aGUgRkcgaXMgZW5hYmxlZCB3ZSB3aWxsIGRpc2FibGUgaXQgYmVmb3JlIGdvaW5nIHRvIHN1c3BlbmQKKwkgKiBvbmx5IGlmIHdlJ3JlIG5vdCBjaGFyZ2luZworCSAqLworCWlmIChkaS0+ZmxhZ3MuZmdfZW5hYmxlZCAmJiAhZGktPmZsYWdzLmNoYXJnaW5nKQorCQlhYjg1MDBfZmdfY291bG9tYl9jb3VudGVyKGRpLCBmYWxzZSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIGFiODUwMF9mZ19zdXNwZW5kICAgICAgTlVMTAorI2RlZmluZSBhYjg1MDBfZmdfcmVzdW1lICAgICAgIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgaW50IGFiODUwMF9mZ19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYWI4NTAwX2ZnICpkaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJbGlzdF9kZWwoJmRpLT5ub2RlKTsKKworCS8qIERpc2FibGUgY291bG9tYiBjb3VudGVyICovCisJcmV0ID0gYWI4NTAwX2ZnX2NvdWxvbWJfY291bnRlcihkaSwgZmFsc2UpOworCWlmIChyZXQpCisJCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byBkaXNhYmxlIGNvdWxvbWIgY291bnRlclxuIik7CisKKwlkZXN0cm95X3dvcmtxdWV1ZShkaS0+Zmdfd3EpOworCWFiODUwMF9mZ19zeXNmc19leGl0KGRpKTsKKworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJYWI4NTAwX2ZnX3N5c2ZzX3BzeV9yZW1vdmVfYXR0cnMoZGkpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGRpLT5mZ19wc3kpOworCXJldHVybiByZXQ7Cit9CisKKy8qIGFiODUwMCBmZyBkcml2ZXIgaW50ZXJydXB0cyBhbmQgdGhlaXIgcmVzcGVjdGl2ZSBpc3IgKi8KK3N0YXRpYyBzdHJ1Y3QgYWI4NTAwX2ZnX2ludGVycnVwdHMgYWI4NTAwX2ZnX2lycV90aFtdID0geworCXsiTkNPTlZfQUNDVSIsIGFiODUwMF9mZ19jY19jb252ZW5kX2hhbmRsZXJ9LAorCXsiQkFUVF9PVlYiLCBhYjg1MDBfZmdfYmF0dF9vdnZfaGFuZGxlcn0sCisJeyJMT1dfQkFUX0YiLCBhYjg1MDBfZmdfbG93YmF0Zl9oYW5kbGVyfSwKKwl7IkNDX0lOVF9DQUxJQiIsIGFiODUwMF9mZ19jY19pbnRfY2FsaWJfaGFuZGxlcn0sCit9OworCitzdGF0aWMgc3RydWN0IGFiODUwMF9mZ19pbnRlcnJ1cHRzIGFiODUwMF9mZ19pcnFfYmhbXSA9IHsKKwl7IkNDRU9DIiwgYWI4NTAwX2ZnX2NjX2RhdGFfZW5kX2hhbmRsZXJ9LAorfTsKKworc3RhdGljIGNoYXIgKnN1cHBseV9pbnRlcmZhY2VbXSA9IHsKKwkiYWI4NTAwX2NoYXJnYWxnIiwKKwkiYWI4NTAwX3VzYiIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGFiODUwMF9mZ19kZXNjID0geworCS5uYW1lCQkJPSAiYWI4NTAwX2ZnIiwKKwkudHlwZQkJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKKwkucHJvcGVydGllcwkJPSBhYjg1MDBfZmdfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCQk9IEFSUkFZX1NJWkUoYWI4NTAwX2ZnX3Byb3BzKSwKKwkuZ2V0X3Byb3BlcnR5CQk9IGFiODUwMF9mZ19nZXRfcHJvcGVydHksCisJLmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQJPSBhYjg1MDBfZmdfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCwKK307CisKK3N0YXRpYyBpbnQgYWI4NTAwX2ZnX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBhYng1MDBfYm1fZGF0YSAqcGxhdCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKKwlzdHJ1Y3QgYWI4NTAwX2ZnICpkaTsKKwlpbnQgaSwgaXJxOworCWludCByZXQgPSAwOworCisJZGkgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpkaSksIEdGUF9LRVJORUwpOworCWlmICghZGkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXMgbm8gbWVtIGZvciBhYjg1MDBfZmdcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKCFwbGF0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIGJhdHRlcnkgbWFuYWdlbWVudCBkYXRhIHN1cHBsaWVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRpLT5ibSA9IHBsYXQ7CisKKwlpZiAobnApIHsKKwkJcmV0ID0gYWI4NTAwX2JtX29mX3Byb2JlKCZwZGV2LT5kZXYsIG5wLCBkaS0+Ym0pOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGJhdHRlcnkgaW5mb3JtYXRpb25cbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCW11dGV4X2luaXQoJmRpLT5jY19sb2NrKTsKKworCS8qIGdldCBwYXJlbnQgZGF0YSAqLworCWRpLT5kZXYgPSAmcGRldi0+ZGV2OworCWRpLT5wYXJlbnQgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJZGktPmdwYWRjID0gYWI4NTAwX2dwYWRjX2dldCgiYWI4NTAwLWdwYWRjLjAiKTsKKworCXBzeV9jZmcuc3VwcGxpZWRfdG8gPSBzdXBwbHlfaW50ZXJmYWNlOworCXBzeV9jZmcubnVtX3N1cHBsaWNhbnRzID0gQVJSQVlfU0laRShzdXBwbHlfaW50ZXJmYWNlKTsKKwlwc3lfY2ZnLmRydl9kYXRhID0gZGk7CisKKwlkaS0+YmF0X2NhcC5tYXhfbWFoX2Rlc2lnbiA9IE1JTExJX1RPX01JQ1JPICoKKwkJZGktPmJtLT5iYXRfdHlwZVtkaS0+Ym0tPmJhdHRfaWRdLmNoYXJnZV9mdWxsX2Rlc2lnbjsKKworCWRpLT5iYXRfY2FwLm1heF9tYWggPSBkaS0+YmF0X2NhcC5tYXhfbWFoX2Rlc2lnbjsKKworCWRpLT52YmF0X25vbSA9IGRpLT5ibS0+YmF0X3R5cGVbZGktPmJtLT5iYXR0X2lkXS5ub21pbmFsX3ZvbHRhZ2U7CisKKwlkaS0+aW5pdF9jYXBhY2l0eSA9IHRydWU7CisKKwlhYjg1MDBfZmdfY2hhcmdlX3N0YXRlX3RvKGRpLCBBQjg1MDBfRkdfQ0hBUkdFX0lOSVQpOworCWFiODUwMF9mZ19kaXNjaGFyZ2Vfc3RhdGVfdG8oZGksIEFCODUwMF9GR19ESVNDSEFSR0VfSU5JVCk7CisKKwkvKiBDcmVhdGUgYSB3b3JrIHF1ZXVlIGZvciBydW5uaW5nIHRoZSBGRyBhbGdvcml0aG0gKi8KKwlkaS0+Zmdfd3EgPSBhbGxvY19vcmRlcmVkX3dvcmtxdWV1ZSgiYWI4NTAwX2ZnX3dxIiwgV1FfTUVNX1JFQ0xBSU0pOworCWlmIChkaS0+Zmdfd3EgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIHdvcmsgcXVldWVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBJbml0IHdvcmsgZm9yIHJ1bm5pbmcgdGhlIGZnIGFsZ29yaXRobSBpbnN0YW50bHkgKi8KKwlJTklUX1dPUksoJmRpLT5mZ193b3JrLCBhYjg1MDBfZmdfaW5zdGFudF93b3JrKTsKKworCS8qIEluaXQgd29yayBmb3IgZ2V0dGluZyB0aGUgYmF0dGVyeSBhY2N1bXVsYXRlZCBjdXJyZW50ICovCisJSU5JVF9XT1JLKCZkaS0+ZmdfYWNjX2N1cl93b3JrLCBhYjg1MDBfZmdfYWNjX2N1cl93b3JrKTsKKworCS8qIEluaXQgd29yayBmb3IgcmVpbml0aWFsaXNpbmcgdGhlIGZnIGFsZ29yaXRobSAqLworCUlOSVRfREVGRVJSQUJMRV9XT1JLKCZkaS0+ZmdfcmVpbml0X3dvcmssCisJCWFiODUwMF9mZ19yZWluaXRfd29yayk7CisKKwkvKiBXb3JrIGRlbGF5ZWQgUXVldWUgdG8gcnVuIHRoZSBzdGF0ZSBtYWNoaW5lICovCisJSU5JVF9ERUZFUlJBQkxFX1dPUksoJmRpLT5mZ19wZXJpb2RpY193b3JrLAorCQlhYjg1MDBfZmdfcGVyaW9kaWNfd29yayk7CisKKwkvKiBXb3JrIHRvIGNoZWNrIGxvdyBiYXR0ZXJ5IGNvbmRpdGlvbiAqLworCUlOSVRfREVGRVJSQUJMRV9XT1JLKCZkaS0+ZmdfbG93X2JhdF93b3JrLAorCQlhYjg1MDBfZmdfbG93X2JhdF93b3JrKTsKKworCS8qIEluaXQgd29yayBmb3IgSFcgZmFpbHVyZSBjaGVjayAqLworCUlOSVRfREVGRVJSQUJMRV9XT1JLKCZkaS0+ZmdfY2hlY2tfaHdfZmFpbHVyZV93b3JrLAorCQlhYjg1MDBfZmdfY2hlY2tfaHdfZmFpbHVyZV93b3JrKTsKKworCS8qIFJlc2V0IGJhdHRlcnkgbG93IHZvbHRhZ2UgZmxhZyAqLworCWRpLT5mbGFncy5sb3dfYmF0ID0gZmFsc2U7CisKKwkvKiBJbml0aWFsaXplIGxvdyBiYXR0ZXJ5IGNvdW50ZXIgKi8KKwlkaS0+bG93X2JhdF9jbnQgPSAxMDsKKworCS8qIEluaXRpYWxpemUgT1ZWLCBhbmQgb3RoZXIgcmVnaXN0ZXJzICovCisJcmV0ID0gYWI4NTAwX2ZnX2luaXRfaHdfcmVnaXN0ZXJzKGRpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIHJlZ2lzdGVyc1xuIik7CisJCWdvdG8gZnJlZV9pbnN0X2N1cnJfd3E7CisJfQorCisJLyogQ29uc2lkZXIgYmF0dGVyeSB1bmtub3duIHVudGlsIHdlJ3JlIGluZm9ybWVkIG90aGVyd2lzZSAqLworCWRpLT5mbGFncy5iYXR0X3Vua25vd24gPSB0cnVlOworCWRpLT5mbGFncy5iYXR0X2lkX3JlY2VpdmVkID0gZmFsc2U7CisKKwkvKiBSZWdpc3RlciBGRyBwb3dlciBzdXBwbHkgY2xhc3MgKi8KKwlkaS0+ZmdfcHN5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKGRpLT5kZXYsICZhYjg1MDBfZmdfZGVzYywgJnBzeV9jZmcpOworCWlmIChJU19FUlIoZGktPmZnX3BzeSkpIHsKKwkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIEZHIHBzeVxuIik7CisJCXJldCA9IFBUUl9FUlIoZGktPmZnX3BzeSk7CisJCWdvdG8gZnJlZV9pbnN0X2N1cnJfd3E7CisJfQorCisJZGktPmZnX3NhbXBsZXMgPSBTRUNfVE9fU0FNUExFKGRpLT5ibS0+ZmdfcGFyYW1zLT5pbml0X3RpbWVyKTsKKwlhYjg1MDBfZmdfY291bG9tYl9jb3VudGVyKGRpLCB0cnVlKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSBjb21wbGV0aW9uIHVzZWQgdG8gbm90aWZ5IGNvbXBsZXRpb24gYW5kIHN0YXJ0CisJICogb2YgaW5zdCBjdXJyZW50CisJICovCisJaW5pdF9jb21wbGV0aW9uKCZkaS0+YWI4NTAwX2ZnX3N0YXJ0ZWQpOworCWluaXRfY29tcGxldGlvbigmZGktPmFiODUwMF9mZ19jb21wbGV0ZSk7CisKKwkvKiBSZWdpc3RlciBwcmltYXJ5IGludGVycnVwdCBoYW5kbGVycyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFiODUwMF9mZ19pcnFfdGgpOyBpKyspIHsKKwkJaXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgYWI4NTAwX2ZnX2lycV90aFtpXS5uYW1lKTsKKwkJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBhYjg1MDBfZmdfaXJxX3RoW2ldLmlzciwKKwkJCQkgIElSUUZfU0hBUkVEIHwgSVJRRl9OT19TVVNQRU5ELAorCQkJCSAgYWI4NTAwX2ZnX2lycV90aFtpXS5uYW1lLCBkaSk7CisKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCAlcyBJUlEgJWQ6ICVkXG4iLAorCQkJCWFiODUwMF9mZ19pcnFfdGhbaV0ubmFtZSwgaXJxLCByZXQpOworCQkJZ290byBmcmVlX2lycTsKKwkJfQorCQlkZXZfZGJnKGRpLT5kZXYsICJSZXF1ZXN0ZWQgJXMgSVJRICVkOiAlZFxuIiwKKwkJCWFiODUwMF9mZ19pcnFfdGhbaV0ubmFtZSwgaXJxLCByZXQpOworCX0KKworCS8qIFJlZ2lzdGVyIHRocmVhZGVkIGludGVycnVwdCBoYW5kbGVyICovCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgYWI4NTAwX2ZnX2lycV9iaFswXS5uYW1lKTsKKwlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShpcnEsIE5VTEwsIGFiODUwMF9mZ19pcnFfYmhbMF0uaXNyLAorCQkJCUlSUUZfU0hBUkVEIHwgSVJRRl9OT19TVVNQRU5EIHwgSVJRRl9PTkVTSE9ULAorCQkJYWI4NTAwX2ZnX2lycV9iaFswXS5uYW1lLCBkaSk7CisKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgJXMgSVJRICVkOiAlZFxuIiwKKwkJCWFiODUwMF9mZ19pcnFfYmhbMF0ubmFtZSwgaXJxLCByZXQpOworCQlnb3RvIGZyZWVfaXJxOworCX0KKwlkZXZfZGJnKGRpLT5kZXYsICJSZXF1ZXN0ZWQgJXMgSVJRICVkOiAlZFxuIiwKKwkJYWI4NTAwX2ZnX2lycV9iaFswXS5uYW1lLCBpcnEsIHJldCk7CisKKwlkaS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgIkNDRU9DIik7CisJZGlzYWJsZV9pcnEoZGktPmlycSk7CisJZGktPm5icl9jY2VvY19pcnFfY250ID0gMDsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRpKTsKKworCXJldCA9IGFiODUwMF9mZ19zeXNmc19pbml0KGRpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgZW50cnlcbiIpOworCQlnb3RvIGZyZWVfaXJxOworCX0KKworCXJldCA9IGFiODUwMF9mZ19zeXNmc19wc3lfY3JlYXRlX2F0dHJzKGRpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byBjcmVhdGUgRkcgcHN5XG4iKTsKKwkJYWI4NTAwX2ZnX3N5c2ZzX2V4aXQoZGkpOworCQlnb3RvIGZyZWVfaXJxOworCX0KKworCS8qIENhbGlicmF0ZSB0aGUgZmcgZmlyc3QgdGltZSAqLworCWRpLT5mbGFncy5jYWxpYnJhdGUgPSB0cnVlOworCWRpLT5jYWxpYl9zdGF0ZSA9IEFCODUwMF9GR19DQUxJQl9JTklUOworCisJLyogVXNlIHJvb20gdGVtcCBhcyBkZWZhdWx0IHZhbHVlIHVudGlsIHdlIGdldCBhbiB1cGRhdGUgZnJvbSBkcml2ZXIuICovCisJZGktPmJhdF90ZW1wID0gMjEwOworCisJLyogUnVuIHRoZSBGRyBhbGdvcml0aG0gKi8KKwlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmZnX3dxLCAmZGktPmZnX3BlcmlvZGljX3dvcmssIDApOworCisJbGlzdF9hZGRfdGFpbCgmZGktPm5vZGUsICZhYjg1MDBfZmdfbGlzdCk7CisKKwlyZXR1cm4gcmV0OworCitmcmVlX2lycToKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihkaS0+ZmdfcHN5KTsKKworCS8qIFdlIGFsc28gaGF2ZSB0byBmcmVlIGFsbCByZWdpc3RlcmVkIGlycXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhYjg1MDBfZmdfaXJxX3RoKTsgaSsrKSB7CisJCWlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsIGFiODUwMF9mZ19pcnFfdGhbaV0ubmFtZSk7CisJCWZyZWVfaXJxKGlycSwgZGkpOworCX0KKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCBhYjg1MDBfZmdfaXJxX2JoWzBdLm5hbWUpOworCWZyZWVfaXJxKGlycSwgZGkpOworZnJlZV9pbnN0X2N1cnJfd3E6CisJZGVzdHJveV93b3JrcXVldWUoZGktPmZnX3dxKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhYjg1MDBfZmdfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInN0ZXJpY3Nzb24sYWI4NTAwLWZnIiwgfSwKKwl7IH0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhYjg1MDBfZmdfZHJpdmVyID0geworCS5wcm9iZSA9IGFiODUwMF9mZ19wcm9iZSwKKwkucmVtb3ZlID0gYWI4NTAwX2ZnX3JlbW92ZSwKKwkuc3VzcGVuZCA9IGFiODUwMF9mZ19zdXNwZW5kLAorCS5yZXN1bWUgPSBhYjg1MDBfZmdfcmVzdW1lLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFiODUwMC1mZyIsCisJCS5vZl9tYXRjaF90YWJsZSA9IGFiODUwMF9mZ19tYXRjaCwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWI4NTAwX2ZnX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhYjg1MDBfZmdfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFiODUwMF9mZ19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFiODUwMF9mZ19kcml2ZXIpOworfQorCitzdWJzeXNfaW5pdGNhbGxfc3luYyhhYjg1MDBfZmdfaW5pdCk7Cittb2R1bGVfZXhpdChhYjg1MDBfZmdfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BVVRIT1IoIkpvaGFuIFBhbHNzb24sIEthcmwgS29taWVyb3dza2kiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06YWI4NTAwLWZnIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFCODUwMCBGdWVsIEdhdWdlIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9zdXBwbHkvYWJ4NTAwX2NoYXJnYWxnLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9hYng1MDBfY2hhcmdhbGcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDQxMWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvYWJ4NTAwX2NoYXJnYWxnLmMKQEAgLTAsMCArMSwyMTY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSBTVC1Fcmljc3NvbiBTQSAyMDEyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgU29ueSBNb2JpbGUgQ29tbXVuaWNhdGlvbnMgQUIKKyAqCisgKiBDaGFyZ2luZyBhbGdvcml0aG0gZHJpdmVyIGZvciBhYng1MDAgdmFyaWFudHMKKyAqCisgKiBMaWNlbnNlIFRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2MgorICogQXV0aG9yczoKKyAqCUpvaGFuIFBhbHNzb24gPGpvaGFuLnBhbHNzb25Ac3Rlcmljc3Nvbi5jb20+CisgKglLYXJsIEtvbWllcm93c2tpIDxrYXJsLmtvbWllcm93c2tpQHN0ZXJpY3Nzb24uY29tPgorICoJQXJ1biBSIE11cnRoeSA8YXJ1bi5tdXJ0aHlAc3Rlcmljc3Nvbi5jb20+CisgKglBdXRob3I6IEltcmUgU3VueWkgPGltcmUuc3VueWlAc29ueW1vYmlsZS5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2FieDUwMC5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9hYng1MDAvYWI4NTAwLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2FieDUwMC91eDUwMF9jaGFyZ2FsZy5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9hYng1MDAvYWI4NTAwLWJtLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKworLyogV2F0Y2hkb2cga2ljayBpbnRlcnZhbCAqLworI2RlZmluZSBDSEdfV0RfSU5URVJWQUwJCQkoNiAqIEhaKQorCisvKiBFbmQtb2YtY2hhcmdlIGNyaXRlcmlhIGNvdW50ZXIgKi8KKyNkZWZpbmUgRU9DX0NPTkRfQ05UCQkJMTAKKworLyogT25lIGhvdXIgZXhwcmVzc2VkIGluIHNlY29uZHMgKi8KKyNkZWZpbmUgT05FX0hPVVJfSU5fU0VDT05EUyAgICAgICAgICAgIDM2MDAKKworLyogRml2ZSBtaW51dGVzIGV4cHJlc3NlZCBpbiBzZWNvbmRzICovCisjZGVmaW5lIEZJVkVfTUlOVVRFU19JTl9TRUNPTkRTICAgICAgICAzMDAKKworLyogUGx1cyBtYXJnaW4gZm9yIHRoZSBsb3cgYmF0dGVyeSB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgQkFUX1BMVVNfTUFSR0lOICAgICAgICAgICAgICAgICgxMDApCisKKyNkZWZpbmUgQ0hBUkdBTEdfQ1VSUl9TVEVQX0xPVwkJMAorI2RlZmluZSBDSEFSR0FMR19DVVJSX1NURVBfSElHSAkxMDAKKworZW51bSBhYng1MDBfY2hhcmdlcnMgeworCU5PX0NIRywKKwlBQ19DSEcsCisJVVNCX0NIRywKK307CisKK3N0cnVjdCBhYng1MDBfY2hhcmdhbGdfY2hhcmdlcl9pbmZvIHsKKwllbnVtIGFieDUwMF9jaGFyZ2VycyBjb25uX2NoZzsKKwllbnVtIGFieDUwMF9jaGFyZ2VycyBwcmV2X2Nvbm5fY2hnOworCWVudW0gYWJ4NTAwX2NoYXJnZXJzIG9ubGluZV9jaGc7CisJZW51bSBhYng1MDBfY2hhcmdlcnMgcHJldl9vbmxpbmVfY2hnOworCWVudW0gYWJ4NTAwX2NoYXJnZXJzIGNoYXJnZXJfdHlwZTsKKwlib29sIHVzYl9jaGdfb2s7CisJYm9vbCBhY19jaGdfb2s7CisJaW50IHVzYl92b2x0OworCWludCB1c2JfY3VycjsKKwlpbnQgYWNfdm9sdDsKKwlpbnQgYWNfY3VycjsKKwlpbnQgdXNiX3ZzZXQ7CisJaW50IHVzYl9pc2V0OworCWludCBhY192c2V0OworCWludCBhY19pc2V0OworfTsKKworc3RydWN0IGFieDUwMF9jaGFyZ2FsZ19zdXNwZW5zaW9uX3N0YXR1cyB7CisJYm9vbCBzdXNwZW5kZWRfY2hhbmdlOworCWJvb2wgYWNfc3VzcGVuZGVkOworCWJvb2wgdXNiX3N1c3BlbmRlZDsKK307CisKK3N0cnVjdCBhYng1MDBfY2hhcmdhbGdfY3VycmVudF9zdGVwX3N0YXR1cyB7CisJYm9vbCBjdXJyX3N0ZXBfY2hhbmdlOworCWludCBjdXJyX3N0ZXA7Cit9OworCitzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnX2JhdHRlcnlfZGF0YSB7CisJaW50IHRlbXA7CisJaW50IHZvbHQ7CisJaW50IGF2Z19jdXJyOworCWludCBpbnN0X2N1cnI7CisJaW50IHBlcmNlbnQ7Cit9OworCitlbnVtIGFieDUwMF9jaGFyZ2FsZ19zdGF0ZXMgeworCVNUQVRFX0hBTkRIRUxEX0lOSVQsCisJU1RBVEVfSEFOREhFTEQsCisJU1RBVEVfQ0hHX05PVF9PS19JTklULAorCVNUQVRFX0NIR19OT1RfT0ssCisJU1RBVEVfSFdfVEVNUF9QUk9URUNUX0lOSVQsCisJU1RBVEVfSFdfVEVNUF9QUk9URUNULAorCVNUQVRFX05PUk1BTF9JTklULAorCVNUQVRFX1VTQl9QUF9QUkVfQ0hBUkdFLAorCVNUQVRFX05PUk1BTCwKKwlTVEFURV9XQUlUX0ZPUl9SRUNIQVJHRV9JTklULAorCVNUQVRFX1dBSVRfRk9SX1JFQ0hBUkdFLAorCVNUQVRFX01BSU5URU5BTkNFX0FfSU5JVCwKKwlTVEFURV9NQUlOVEVOQU5DRV9BLAorCVNUQVRFX01BSU5URU5BTkNFX0JfSU5JVCwKKwlTVEFURV9NQUlOVEVOQU5DRV9CLAorCVNUQVRFX1RFTVBfVU5ERVJPVkVSX0lOSVQsCisJU1RBVEVfVEVNUF9VTkRFUk9WRVIsCisJU1RBVEVfVEVNUF9MT1dISUdIX0lOSVQsCisJU1RBVEVfVEVNUF9MT1dISUdILAorCVNUQVRFX1NVU1BFTkRFRF9JTklULAorCVNUQVRFX1NVU1BFTkRFRCwKKwlTVEFURV9PVlZfUFJPVEVDVF9JTklULAorCVNUQVRFX09WVl9QUk9URUNULAorCVNUQVRFX1NBRkVUWV9USU1FUl9FWFBJUkVEX0lOSVQsCisJU1RBVEVfU0FGRVRZX1RJTUVSX0VYUElSRUQsCisJU1RBVEVfQkFUVF9SRU1PVkVEX0lOSVQsCisJU1RBVEVfQkFUVF9SRU1PVkVELAorCVNUQVRFX1dEX0VYUElSRURfSU5JVCwKKwlTVEFURV9XRF9FWFBJUkVELAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnN0YXRlc1tdID0geworCSJIQU5ESEVMRF9JTklUIiwKKwkiSEFOREhFTEQiLAorCSJDSEdfTk9UX09LX0lOSVQiLAorCSJDSEdfTk9UX09LIiwKKwkiSFdfVEVNUF9QUk9URUNUX0lOSVQiLAorCSJIV19URU1QX1BST1RFQ1QiLAorCSJOT1JNQUxfSU5JVCIsCisJIlVTQl9QUF9QUkVfQ0hBUkdFIiwKKwkiTk9STUFMIiwKKwkiV0FJVF9GT1JfUkVDSEFSR0VfSU5JVCIsCisJIldBSVRfRk9SX1JFQ0hBUkdFIiwKKwkiTUFJTlRFTkFOQ0VfQV9JTklUIiwKKwkiTUFJTlRFTkFOQ0VfQSIsCisJIk1BSU5URU5BTkNFX0JfSU5JVCIsCisJIk1BSU5URU5BTkNFX0IiLAorCSJURU1QX1VOREVST1ZFUl9JTklUIiwKKwkiVEVNUF9VTkRFUk9WRVIiLAorCSJURU1QX0xPV0hJR0hfSU5JVCIsCisJIlRFTVBfTE9XSElHSCIsCisJIlNVU1BFTkRFRF9JTklUIiwKKwkiU1VTUEVOREVEIiwKKwkiT1ZWX1BST1RFQ1RfSU5JVCIsCisJIk9WVl9QUk9URUNUIiwKKwkiU0FGRVRZX1RJTUVSX0VYUElSRURfSU5JVCIsCisJIlNBRkVUWV9USU1FUl9FWFBJUkVEIiwKKwkiQkFUVF9SRU1PVkVEX0lOSVQiLAorCSJCQVRUX1JFTU9WRUQiLAorCSJXRF9FWFBJUkVEX0lOSVQiLAorCSJXRF9FWFBJUkVEIiwKK307CisKK3N0cnVjdCBhYng1MDBfY2hhcmdhbGdfZXZlbnRzIHsKKwlib29sIGJhdHRfdW5rbm93bjsKKwlib29sIG1haW5leHRjaG5vdG9rOworCWJvb2wgYmF0dF9vdnY7CisJYm9vbCBiYXR0X3JlbTsKKwlib29sIGJ0ZW1wX3VuZGVyb3ZlcjsKKwlib29sIGJ0ZW1wX2xvd2hpZ2g7CisJYm9vbCBtYWluX3RoZXJtYWxfcHJvdDsKKwlib29sIHVzYl90aGVybWFsX3Byb3Q7CisJYm9vbCBtYWluX292djsKKwlib29sIHZidXNfb3Z2OworCWJvb2wgdXNiY2hhcmdlcm5vdG9rOworCWJvb2wgc2FmZXR5X3RpbWVyX2V4cGlyZWQ7CisJYm9vbCBtYWludGVuYW5jZV90aW1lcl9leHBpcmVkOworCWJvb2wgYWNfd2RfZXhwaXJlZDsKKwlib29sIHVzYl93ZF9leHBpcmVkOworCWJvb2wgYWNfY3ZfYWN0aXZlOworCWJvb2wgdXNiX2N2X2FjdGl2ZTsKKwlib29sIHZidXNfY29sbGFwc2VkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgYWJ4NTAwX2NoYXJnZV9jdXJyX21heGltaXphdGlvbiAtIENoYXJnZXIgbWF4aW1pemF0aW9uIHBhcmFtZXRlcnMKKyAqIEBvcmlnaW5hbF9pc2V0Ogl0aGUgbm9uIG9wdGltaXplZC9tYXhpbWlzZWQgY2hhcmdlciBjdXJyZW50CisgKiBAY3VycmVudF9pc2V0Ogl0aGUgY2hhcmdpbmcgY3VycmVudCB1c2VkIGF0IHRoaXMgbW9tZW50CisgKiBAdGVzdF9kZWx0YV9pOgl0aGUgZGVsdGEgYmV0d2VlbiB0aGUgY3VycmVudCB3ZSB3YW50IHRvIGNoYXJnZSBhbmQgdGhlCisJCQljdXJyZW50IHRoYXQgaXMgcmVhbGx5IGdvaW5nIGludG8gdGhlIGJhdHRlcnkKKyAqIEBjb25kaXRpb25fY250OgludW1iZXIgb2YgaXRlcmF0aW9ucyBuZWVkZWQgYmVmb3JlIGEgbmV3IGNoYXJnZXIgY3VycmVudAorCQkJaXMgc2V0CisgKiBAbWF4X2N1cnJlbnQ6CW1heGltdW0gY2hhcmdlciBjdXJyZW50CisgKiBAd2FpdF9jbnQ6CQl0byBhdm9pZCB0b28gZmFzdCBjdXJyZW50IHN0ZXAgZG93biBpbiBjYXNlIG9mIGNoYXJnZXIKKyAqCQkJdm9sdGFnZSBjb2xsYXBzZSwgd2UgaW5zZXJ0IHRoaXMgZGVsYXkgYmV0d2VlbiBzdGVwCisgKgkJCWRvd24KKyAqIEBsZXZlbDoJCXRlbGxzIGluIGhvdyBtYW55IHN0ZXBzIHRoZSBjaGFyZ2luZyBjdXJyZW50IGhhcyBiZWVuCisJCQlpbmNyZWFzZWQKKyAqLworc3RydWN0IGFieDUwMF9jaGFyZ2VfY3Vycl9tYXhpbWl6YXRpb24geworCWludCBvcmlnaW5hbF9pc2V0OworCWludCBjdXJyZW50X2lzZXQ7CisJaW50IHRlc3RfZGVsdGFfaTsKKwlpbnQgY29uZGl0aW9uX2NudDsKKwlpbnQgbWF4X2N1cnJlbnQ7CisJaW50IHdhaXRfY250OworCXU4IGxldmVsOworfTsKKworZW51bSBtYXhpbV9yZXQgeworCU1BWElNX1JFVF9OT0FDVElPTiwKKwlNQVhJTV9SRVRfQ0hBTkdFLAorCU1BWElNX1JFVF9JQkFUX1RPT19ISUdILAorfTsKKworLyoqCisgKiBzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnIC0gYWJ4NTAwIENoYXJnaW5nIGFsZ29yaXRobSBkZXZpY2UgaW5mb3JtYXRpb24KKyAqIEBkZXY6CQlwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgZGV2aWNlCisgKiBAY2hhcmdlX3N0YXR1czoJYmF0dGVyeSBvcGVyYXRpbmcgc3RhdHVzCisgKiBAZW9jX2NudDoJCWNvdW50ZXIgdXNlZCB0byBkZXRlcm1pbmUgZW5kLW9mX2NoYXJnZQorICogQG1haW50ZW5hbmNlX2NoZzoJaW5kaWNhdGUgaWYgbWFpbnRlbmFuY2UgY2hhcmdlIGlzIGFjdGl2ZQorICogQHRfaHlzdF9ub3JtCQl0ZW1wZXJhdHVyZSBoeXN0ZXJlc2lzIHdoZW4gdGhlIHRlbXBlcmF0dXJlIGhhcyBiZWVuCisgKgkJCW92ZXIgb3IgdW5kZXIgbm9ybWFsIGxpbWl0cworICogQHRfaHlzdF9sb3doaWdoCXRlbXBlcmF0dXJlIGh5c3RlcmVzaXMgd2hlbiB0aGUgdGVtcGVyYXR1cmUgaGFzIGJlZW4KKyAqCQkJb3ZlciBvciB1bmRlciB0aGUgaGlnaCBvciBsb3cgbGltaXRzCisgKiBAY2hhcmdlX3N0YXRlOgljdXJyZW50IHN0YXRlIG9mIHRoZSBjaGFyZ2luZyBhbGdvcml0aG0KKyAqIEBjY20JCQljaGFyZ2luZyBjdXJyZW50IG1heGltaXphdGlvbiBwYXJhbWV0ZXJzCisgKiBAY2hnX2luZm86CQlpbmZvcm1hdGlvbiBhYm91dCBjb25uZWN0ZWQgY2hhcmdlciB0eXBlcworICogQGJhdHRfZGF0YToJCWRhdGEgb2YgdGhlIGJhdHRlcnkKKyAqIEBzdXNwX3N0YXR1czoJY3VycmVudCBjaGFyZ2VyIHN1c3BlbnNpb24gc3RhdHVzCisgKiBAYm06ICAgICAgICAgICAJUGxhdGZvcm0gc3BlY2lmaWMgYmF0dGVyeSBtYW5hZ2VtZW50IGluZm9ybWF0aW9uCisgKiBAY3Vycl9zdGF0dXM6CUN1cnJlbnQgc3RlcCBzdGF0dXMgZm9yIG92ZXItY3VycmVudCBwcm90ZWN0aW9uCisgKiBAcGFyZW50OgkJcG9pbnRlciB0byB0aGUgc3RydWN0IGFieDUwMAorICogQGNoYXJnYWxnX3BzeToJc3RydWN0dXJlIHRoYXQgaG9sZHMgdGhlIGJhdHRlcnkgcHJvcGVydGllcyBleHBvc2VkIGJ5CisgKgkJCXRoZSBjaGFyZ2luZyBhbGdvcml0aG0KKyAqIEBldmVudHM6CQlzdHJ1Y3R1cmUgZm9yIGluZm9ybWF0aW9uIGFib3V0IGV2ZW50cyB0cmlnZ2VyZWQKKyAqIEBjaGFyZ2FsZ193cToJCXdvcmsgcXVldWUgZm9yIHJ1bm5pbmcgdGhlIGNoYXJnaW5nIGFsZ29yaXRobQorICogQGNoYXJnYWxnX3BlcmlvZGljX3dvcms6CXdvcmsgdG8gcnVuIHRoZSBjaGFyZ2luZyBhbGdvcml0aG0gcGVyaW9kaWNhbGx5CisgKiBAY2hhcmdhbGdfd2Rfd29yazoJCXdvcmsgdG8ga2ljayB0aGUgY2hhcmdlciB3YXRjaGRvZyBwZXJpb2RpY2FsbHkKKyAqIEBjaGFyZ2FsZ193b3JrOgkJd29yayB0byBydW4gdGhlIGNoYXJnaW5nIGFsZ29yaXRobSBpbnN0YW50bHkKKyAqIEBzYWZldHlfdGltZXI6CQljaGFyZ2luZyBzYWZldHkgdGltZXIKKyAqIEBtYWludGVuYW5jZV90aW1lcjoJCW1haW50ZW5hbmNlIGNoYXJnaW5nIHRpbWVyCisgKiBAY2hhcmdhbGdfa29iamVjdDoJCXN0cnVjdHVyZSBvZiB0eXBlIGtvYmplY3QKKyAqLworc3RydWN0IGFieDUwMF9jaGFyZ2FsZyB7CisJc3RydWN0IGRldmljZSAqZGV2OworCWludCBjaGFyZ2Vfc3RhdHVzOworCWludCBlb2NfY250OworCWJvb2wgbWFpbnRlbmFuY2VfY2hnOworCWludCB0X2h5c3Rfbm9ybTsKKwlpbnQgdF9oeXN0X2xvd2hpZ2g7CisJZW51bSBhYng1MDBfY2hhcmdhbGdfc3RhdGVzIGNoYXJnZV9zdGF0ZTsKKwlzdHJ1Y3QgYWJ4NTAwX2NoYXJnZV9jdXJyX21heGltaXphdGlvbiBjY207CisJc3RydWN0IGFieDUwMF9jaGFyZ2FsZ19jaGFyZ2VyX2luZm8gY2hnX2luZm87CisJc3RydWN0IGFieDUwMF9jaGFyZ2FsZ19iYXR0ZXJ5X2RhdGEgYmF0dF9kYXRhOworCXN0cnVjdCBhYng1MDBfY2hhcmdhbGdfc3VzcGVuc2lvbl9zdGF0dXMgc3VzcF9zdGF0dXM7CisJc3RydWN0IGFiODUwMCAqcGFyZW50OworCXN0cnVjdCBhYng1MDBfY2hhcmdhbGdfY3VycmVudF9zdGVwX3N0YXR1cyBjdXJyX3N0YXR1czsKKwlzdHJ1Y3QgYWJ4NTAwX2JtX2RhdGEgKmJtOworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmNoYXJnYWxnX3BzeTsKKwlzdHJ1Y3QgdXg1MDBfY2hhcmdlciAqYWNfY2hnOworCXN0cnVjdCB1eDUwMF9jaGFyZ2VyICp1c2JfY2hnOworCXN0cnVjdCBhYng1MDBfY2hhcmdhbGdfZXZlbnRzIGV2ZW50czsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqY2hhcmdhbGdfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBjaGFyZ2FsZ19wZXJpb2RpY193b3JrOworCXN0cnVjdCBkZWxheWVkX3dvcmsgY2hhcmdhbGdfd2Rfd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY2hhcmdhbGdfd29yazsKKwlzdHJ1Y3QgaHJ0aW1lciBzYWZldHlfdGltZXI7CisJc3RydWN0IGhydGltZXIgbWFpbnRlbmFuY2VfdGltZXI7CisJc3RydWN0IGtvYmplY3QgY2hhcmdhbGdfa29iamVjdDsKK307CisKKy8qRXh0ZXJuYWwgY2hhcmdlciBwcmVwYXJlIG5vdGlmaWVyKi8KK0JMT0NLSU5HX05PVElGSUVSX0hFQUQoY2hhcmdlcl9ub3RpZmllcl9saXN0KTsKKworLyogTWFpbiBiYXR0ZXJ5IHByb3BlcnRpZXMgKi8KK3N0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBhYng1MDBfY2hhcmdhbGdfcHJvcHNbXSA9IHsKKwlQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMsCisJUE9XRVJfU1VQUExZX1BST1BfSEVBTFRILAorfTsKKworc3RydWN0IGFieDUwMF9jaGFyZ2FsZ19zeXNmc19lbnRyeSB7CisJc3RydWN0IGF0dHJpYnV0ZSBhdHRyOworCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICosIGNoYXIgKik7CisJc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKK307CisKKy8qKgorICogYWJ4NTAwX2NoYXJnYWxnX3NhZmV0eV90aW1lcl9leHBpcmVkKCkgLSBFeHBpcmF0aW9uIG9mIHRoZSBzYWZldHkgdGltZXIKKyAqIEB0aW1lcjogICAgIHBvaW50ZXIgdG8gdGhlIGhydGltZXIgc3RydWN0dXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCB3aGVuIHRoZSBzYWZldHkgdGltZXIgZm9yIHRoZSBjaGFyZ2VyCisgKiBleHBpcmVzCisgKi8KK3N0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydAorYWJ4NTAwX2NoYXJnYWxnX3NhZmV0eV90aW1lcl9leHBpcmVkKHN0cnVjdCBocnRpbWVyICp0aW1lcikKK3sKKwlzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSA9IGNvbnRhaW5lcl9vZih0aW1lciwgc3RydWN0IGFieDUwMF9jaGFyZ2FsZywKKwkJCQkJCSAgc2FmZXR5X3RpbWVyKTsKKwlkZXZfZXJyKGRpLT5kZXYsICJTYWZldHkgdGltZXIgZXhwaXJlZFxuIik7CisJZGktPmV2ZW50cy5zYWZldHlfdGltZXJfZXhwaXJlZCA9IHRydWU7CisKKwkvKiBUcmlnZ2VyIGV4ZWN1dGlvbiBvZiB0aGUgYWxnb3JpdGhtIGluc3RhbnRseSAqLworCXF1ZXVlX3dvcmsoZGktPmNoYXJnYWxnX3dxLCAmZGktPmNoYXJnYWxnX3dvcmspOworCisJcmV0dXJuIEhSVElNRVJfTk9SRVNUQVJUOworfQorCisvKioKKyAqIGFieDUwMF9jaGFyZ2FsZ19tYWludGVuYW5jZV90aW1lcl9leHBpcmVkKCkgLSBFeHBpcmF0aW9uIG9mCisgKiB0aGUgbWFpbnRlbmFuY2UgdGltZXIKKyAqIEB0aW1lcjogICAgIHBvaW50ZXIgdG8gdGhlIHRpbWVyIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgd2hlbiB0aGUgbWFpbnRlbmVuY2UgdGltZXIKKyAqIGV4cGlyZXMKKyAqLworc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0CithYng1MDBfY2hhcmdhbGdfbWFpbnRlbmFuY2VfdGltZXJfZXhwaXJlZChzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCit7CisKKwlzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSA9IGNvbnRhaW5lcl9vZih0aW1lciwgc3RydWN0IGFieDUwMF9jaGFyZ2FsZywKKwkJCQkJCSAgbWFpbnRlbmFuY2VfdGltZXIpOworCisJZGV2X2RiZyhkaS0+ZGV2LCAiTWFpbnRlbmFuY2UgdGltZXIgZXhwaXJlZFxuIik7CisJZGktPmV2ZW50cy5tYWludGVuYW5jZV90aW1lcl9leHBpcmVkID0gdHJ1ZTsKKworCS8qIFRyaWdnZXIgZXhlY3V0aW9uIG9mIHRoZSBhbGdvcml0aG0gaW5zdGFudGx5ICovCisJcXVldWVfd29yayhkaS0+Y2hhcmdhbGdfd3EsICZkaS0+Y2hhcmdhbGdfd29yayk7CisKKwlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7Cit9CisKKy8qKgorICogYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKCkgLSBDaGFuZ2UgY2hhcmdlIHN0YXRlCisgKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYng1MDBfY2hhcmdhbGcgc3RydWN0dXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCB3aGVuIGEgY2hhcmdlIHN0YXRlIGNoYW5nZSBzaG91bGQgb2NjdXIKKyAqLworc3RhdGljIHZvaWQgYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKHN0cnVjdCBhYng1MDBfY2hhcmdhbGcgKmRpLAorCWVudW0gYWJ4NTAwX2NoYXJnYWxnX3N0YXRlcyBzdGF0ZSkKK3sKKwlkZXZfZGJnKGRpLT5kZXYsCisJCSJTdGF0ZSBjaGFuZ2VkOiAlcyAoRnJvbSBzdGF0ZTogWyVkXSAlcyA9dG89PiBbJWRdICVzIClcbiIsCisJCWRpLT5jaGFyZ2Vfc3RhdGUgPT0gc3RhdGUgPyAiTk8iIDogIllFUyIsCisJCWRpLT5jaGFyZ2Vfc3RhdGUsCisJCXN0YXRlc1tkaS0+Y2hhcmdlX3N0YXRlXSwKKwkJc3RhdGUsCisJCXN0YXRlc1tzdGF0ZV0pOworCisJZGktPmNoYXJnZV9zdGF0ZSA9IHN0YXRlOworfQorCitzdGF0aWMgaW50IGFieDUwMF9jaGFyZ2FsZ19jaGVja19jaGFyZ2VyX2VuYWJsZShzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSkKK3sKKwlzd2l0Y2ggKGRpLT5jaGFyZ2Vfc3RhdGUpIHsKKwljYXNlIFNUQVRFX05PUk1BTDoKKwljYXNlIFNUQVRFX01BSU5URU5BTkNFX0E6CisJY2FzZSBTVEFURV9NQUlOVEVOQU5DRV9COgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZGktPmNoZ19pbmZvLmNoYXJnZXJfdHlwZSAmIFVTQl9DSEcpIHsKKwkJcmV0dXJuIGRpLT51c2JfY2hnLT5vcHMuY2hlY2tfZW5hYmxlKGRpLT51c2JfY2hnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRpLT5ibS0+YmF0X3R5cGVbZGktPmJtLT5iYXR0X2lkXS5ub3JtYWxfdm9sX2x2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkaS0+Ym0tPmJhdF90eXBlW2RpLT5ibS0+YmF0dF9pZF0ubm9ybWFsX2N1cl9sdmwpOworCX0gZWxzZSBpZiAoKGRpLT5jaGdfaW5mby5jaGFyZ2VyX3R5cGUgJiBBQ19DSEcpICYmCisJCSAgICEoZGktPmFjX2NoZy0+ZXh0ZXJuYWwpKSB7CisJCXJldHVybiBkaS0+YWNfY2hnLT5vcHMuY2hlY2tfZW5hYmxlKGRpLT5hY19jaGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGktPmJtLT5iYXRfdHlwZVtkaS0+Ym0tPmJhdHRfaWRdLm5vcm1hbF92b2xfbHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRpLT5ibS0+YmF0X3R5cGVbZGktPmJtLT5iYXR0X2lkXS5ub3JtYWxfY3VyX2x2bCk7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIGFieDUwMF9jaGFyZ2FsZ19jaGVja19jaGFyZ2VyX2Nvbm5lY3Rpb24oKSAtIENoZWNrIGNoYXJnZXIgY29ubmVjdGlvbiBjaGFuZ2UKKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFieDUwMF9jaGFyZ2FsZyBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hlY2sgaWYgdGhlcmUgaXMgYSBjaGFuZ2UgaW4gdGhlIGNoYXJnZXIgY29ubmVjdGlvbgorICogYW5kIGNoYW5nZSBjaGFyZ2Ugc3RhdGUgYWNjb3JkaW5nbHkuIEFDIGhhcyBwcmVjZWRlbmNlIG92ZXIgVVNCLgorICovCitzdGF0aWMgaW50IGFieDUwMF9jaGFyZ2FsZ19jaGVja19jaGFyZ2VyX2Nvbm5lY3Rpb24oc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGkpCit7CisJaWYgKGRpLT5jaGdfaW5mby5jb25uX2NoZyAhPSBkaS0+Y2hnX2luZm8ucHJldl9jb25uX2NoZyB8fAorCQlkaS0+c3VzcF9zdGF0dXMuc3VzcGVuZGVkX2NoYW5nZSkgeworCQkvKgorCQkgKiBDaGFyZ2VyIHN0YXRlIGNoYW5nZWQgb3Igc3VzcGVuc2lvbgorCQkgKiBoYXMgY2hhbmdlZCBzaW5jZSBsYXN0IHVwZGF0ZQorCQkgKi8KKwkJaWYgKChkaS0+Y2hnX2luZm8uY29ubl9jaGcgJiBBQ19DSEcpICYmCisJCQkhZGktPnN1c3Bfc3RhdHVzLmFjX3N1c3BlbmRlZCkgeworCQkJZGV2X2RiZyhkaS0+ZGV2LCAiQ2hhcmdpbmcgc291cmNlIGlzIEFDXG4iKTsKKwkJCWlmIChkaS0+Y2hnX2luZm8uY2hhcmdlcl90eXBlICE9IEFDX0NIRykgeworCQkJCWRpLT5jaGdfaW5mby5jaGFyZ2VyX3R5cGUgPSBBQ19DSEc7CisJCQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9OT1JNQUxfSU5JVCk7CisJCQl9CisJCX0gZWxzZSBpZiAoKGRpLT5jaGdfaW5mby5jb25uX2NoZyAmIFVTQl9DSEcpICYmCisJCQkhZGktPnN1c3Bfc3RhdHVzLnVzYl9zdXNwZW5kZWQpIHsKKwkJCWRldl9kYmcoZGktPmRldiwgIkNoYXJnaW5nIHNvdXJjZSBpcyBVU0JcbiIpOworCQkJZGktPmNoZ19pbmZvLmNoYXJnZXJfdHlwZSA9IFVTQl9DSEc7CisJCQlhYng1MDBfY2hhcmdhbGdfc3RhdGVfdG8oZGksIFNUQVRFX05PUk1BTF9JTklUKTsKKwkJfSBlbHNlIGlmIChkaS0+Y2hnX2luZm8uY29ubl9jaGcgJiYKKwkJCShkaS0+c3VzcF9zdGF0dXMuYWNfc3VzcGVuZGVkIHx8CisJCQlkaS0+c3VzcF9zdGF0dXMudXNiX3N1c3BlbmRlZCkpIHsKKwkJCWRldl9kYmcoZGktPmRldiwgIkNoYXJnaW5nIGlzIHN1c3BlbmRlZFxuIik7CisJCQlkaS0+Y2hnX2luZm8uY2hhcmdlcl90eXBlID0gTk9fQ0hHOworCQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9TVVNQRU5ERURfSU5JVCk7CisJCX0gZWxzZSB7CisJCQlkZXZfZGJnKGRpLT5kZXYsICJDaGFyZ2luZyBzb3VyY2UgaXMgT0ZGXG4iKTsKKwkJCWRpLT5jaGdfaW5mby5jaGFyZ2VyX3R5cGUgPSBOT19DSEc7CisJCQlhYng1MDBfY2hhcmdhbGdfc3RhdGVfdG8oZGksIFNUQVRFX0hBTkRIRUxEX0lOSVQpOworCQl9CisJCWRpLT5jaGdfaW5mby5wcmV2X2Nvbm5fY2hnID0gZGktPmNoZ19pbmZvLmNvbm5fY2hnOworCQlkaS0+c3VzcF9zdGF0dXMuc3VzcGVuZGVkX2NoYW5nZSA9IGZhbHNlOworCX0KKwlyZXR1cm4gZGktPmNoZ19pbmZvLmNvbm5fY2hnOworfQorCisvKioKKyAqIGFieDUwMF9jaGFyZ2FsZ19jaGVja19jdXJyZW50X3N0ZXBfc3RhdHVzKCkgLSBDaGVjayBjaGFyZ2luZyBjdXJyZW50CisgKiBzdGVwIHN0YXR1cy4KKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFieDUwMF9jaGFyZ2FsZyBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2hlY2sgaWYgdGhlcmUgaXMgYSBjaGFuZ2UgaW4gdGhlIGNoYXJnaW5nIGN1cnJlbnQgc3RlcAorICogYW5kIGNoYW5nZSBjaGFyZ2Ugc3RhdGUgYWNjb3JkaW5nbHkuCisgKi8KK3N0YXRpYyB2b2lkIGFieDUwMF9jaGFyZ2FsZ19jaGVja19jdXJyZW50X3N0ZXBfc3RhdHVzCisJKHN0cnVjdCBhYng1MDBfY2hhcmdhbGcgKmRpKQoreworCWlmIChkaS0+Y3Vycl9zdGF0dXMuY3Vycl9zdGVwX2NoYW5nZSkKKwkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9OT1JNQUxfSU5JVCk7CisJZGktPmN1cnJfc3RhdHVzLmN1cnJfc3RlcF9jaGFuZ2UgPSBmYWxzZTsKK30KKworLyoqCisgKiBhYng1MDBfY2hhcmdhbGdfc3RhcnRfc2FmZXR5X3RpbWVyKCkgLSBTdGFydCBjaGFyZ2luZyBzYWZldHkgdGltZXIKKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFieDUwMF9jaGFyZ2FsZyBzdHJ1Y3R1cmUKKyAqCisgKiBUaGUgc2FmZXR5IHRpbWVyIGlzIHVzZWQgdG8gYXZvaWQgb3ZlcmNoYXJnaW5nIG9mIG9sZCBvciBiYWQgYmF0dGVyaWVzLgorICogVGhlcmUgYXJlIGRpZmZlcmVudCB0aW1lcnMgZm9yIEFDIGFuZCBVU0IKKyAqLworc3RhdGljIHZvaWQgYWJ4NTAwX2NoYXJnYWxnX3N0YXJ0X3NhZmV0eV90aW1lcihzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSkKK3sKKwkvKiBDaGFyZ2VyLWRlcGVuZGVudCBleHBpcmF0aW9uIHRpbWUgaW4gaG91cnMqLworCWludCB0aW1lcl9leHBpcmF0aW9uID0gMDsKKworCXN3aXRjaCAoZGktPmNoZ19pbmZvLmNoYXJnZXJfdHlwZSkgeworCWNhc2UgQUNfQ0hHOgorCQl0aW1lcl9leHBpcmF0aW9uID0gZGktPmJtLT5tYWluX3NhZmV0eV90bXJfaDsKKwkJYnJlYWs7CisKKwljYXNlIFVTQl9DSEc6CisJCXRpbWVyX2V4cGlyYXRpb24gPSBkaS0+Ym0tPnVzYl9zYWZldHlfdG1yX2g7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2VycihkaS0+ZGV2LCAiVW5rbm93biBjaGFyZ2VyIHRvIGNoYXJnZSBmcm9tXG4iKTsKKwkJYnJlYWs7CisJfQorCisJZGktPmV2ZW50cy5zYWZldHlfdGltZXJfZXhwaXJlZCA9IGZhbHNlOworCWhydGltZXJfc2V0X2V4cGlyZXNfcmFuZ2UoJmRpLT5zYWZldHlfdGltZXIsCisJCWt0aW1lX3NldCh0aW1lcl9leHBpcmF0aW9uICogT05FX0hPVVJfSU5fU0VDT05EUywgMCksCisJCWt0aW1lX3NldChGSVZFX01JTlVURVNfSU5fU0VDT05EUywgMCkpOworCWhydGltZXJfc3RhcnRfZXhwaXJlcygmZGktPnNhZmV0eV90aW1lciwgSFJUSU1FUl9NT0RFX1JFTCk7Cit9CisKKy8qKgorICogYWJ4NTAwX2NoYXJnYWxnX3N0b3Bfc2FmZXR5X3RpbWVyKCkgLSBTdG9wIGNoYXJnaW5nIHNhZmV0eSB0aW1lcgorICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWJ4NTAwX2NoYXJnYWxnIHN0cnVjdHVyZQorICoKKyAqIFRoZSBzYWZldHkgdGltZXIgaXMgc3RvcHBlZCB3aGVuZXZlciB0aGUgTk9STUFMIHN0YXRlIGlzIGV4aXRlZAorICovCitzdGF0aWMgdm9pZCBhYng1MDBfY2hhcmdhbGdfc3RvcF9zYWZldHlfdGltZXIoc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGkpCit7CisJaWYgKGhydGltZXJfdHJ5X3RvX2NhbmNlbCgmZGktPnNhZmV0eV90aW1lcikgPj0gMCkKKwkJZGktPmV2ZW50cy5zYWZldHlfdGltZXJfZXhwaXJlZCA9IGZhbHNlOworfQorCisvKioKKyAqIGFieDUwMF9jaGFyZ2FsZ19zdGFydF9tYWludGVuYW5jZV90aW1lcigpIC0gU3RhcnQgY2hhcmdpbmcgbWFpbnRlbmFuY2UgdGltZXIKKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFieDUwMF9jaGFyZ2FsZyBzdHJ1Y3R1cmUKKyAqIEBkdXJhdGlvbjoJZHVyYXRpb24gb2YgdGhlciBtYWludGVuYW5jZSB0aW1lciBpbiBob3VycworICoKKyAqIFRoZSBtYWludGVuYW5jZSB0aW1lciBpcyB1c2VkIHRvIG1haW50YWluIHRoZSBjaGFyZ2UgaW4gdGhlIGJhdHRlcnkgb25jZQorICogdGhlIGJhdHRlcnkgaXMgY29uc2lkZXJlZCBmdWxsLiBUaGVzZSB0aW1lcnMgYXJlIGNob3NlbiB0byBtYXRjaCB0aGUKKyAqIGRpc2NoYXJnZSBjdXJ2ZSBvZiB0aGUgYmF0dGVyeQorICovCitzdGF0aWMgdm9pZCBhYng1MDBfY2hhcmdhbGdfc3RhcnRfbWFpbnRlbmFuY2VfdGltZXIoc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGksCisJaW50IGR1cmF0aW9uKQoreworCWhydGltZXJfc2V0X2V4cGlyZXNfcmFuZ2UoJmRpLT5tYWludGVuYW5jZV90aW1lciwKKwkJa3RpbWVfc2V0KGR1cmF0aW9uICogT05FX0hPVVJfSU5fU0VDT05EUywgMCksCisJCWt0aW1lX3NldChGSVZFX01JTlVURVNfSU5fU0VDT05EUywgMCkpOworCWRpLT5ldmVudHMubWFpbnRlbmFuY2VfdGltZXJfZXhwaXJlZCA9IGZhbHNlOworCWhydGltZXJfc3RhcnRfZXhwaXJlcygmZGktPm1haW50ZW5hbmNlX3RpbWVyLCBIUlRJTUVSX01PREVfUkVMKTsKK30KKworLyoqCisgKiBhYng1MDBfY2hhcmdhbGdfc3RvcF9tYWludGVuYW5jZV90aW1lcigpIC0gU3RvcCBtYWludGVuYW5jZSB0aW1lcgorICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWJ4NTAwX2NoYXJnYWxnIHN0cnVjdHVyZQorICoKKyAqIFRoZSBtYWludGVuYW5jZSB0aW1lciBpcyBzdG9wcGVkIHdoZW5ldmVyIG1haW50ZW5hbmNlIGVuZHMgb3Igd2hlbiBhbm90aGVyCisgKiBzdGF0ZSBpcyBlbnRlcmVkCisgKi8KK3N0YXRpYyB2b2lkIGFieDUwMF9jaGFyZ2FsZ19zdG9wX21haW50ZW5hbmNlX3RpbWVyKHN0cnVjdCBhYng1MDBfY2hhcmdhbGcgKmRpKQoreworCWlmIChocnRpbWVyX3RyeV90b19jYW5jZWwoJmRpLT5tYWludGVuYW5jZV90aW1lcikgPj0gMCkKKwkJZGktPmV2ZW50cy5tYWludGVuYW5jZV90aW1lcl9leHBpcmVkID0gZmFsc2U7Cit9CisKKy8qKgorICogYWJ4NTAwX2NoYXJnYWxnX2tpY2tfd2F0Y2hkb2coKSAtIEtpY2sgY2hhcmdlciB3YXRjaGRvZworICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWJ4NTAwX2NoYXJnYWxnIHN0cnVjdHVyZQorICoKKyAqIFRoZSBjaGFyZ2VyIHdhdGNoZG9nIGhhdmUgdG8gYmUga2lja2VkIHBlcmlvZGljYWxseSB3aGVuZXZlciB0aGUgY2hhcmdlciBpcworICogb24sIGVsc2UgdGhlIEFCQiB3aWxsIHJlc2V0IHRoZSBzeXN0ZW0KKyAqLworc3RhdGljIGludCBhYng1MDBfY2hhcmdhbGdfa2lja193YXRjaGRvZyhzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSkKK3sKKwkvKiBDaGVjayBpZiBjaGFyZ2VyIGV4aXN0cyBhbmQga2ljayB3YXRjaGRvZyBpZiBjaGFyZ2luZyAqLworCWlmIChkaS0+YWNfY2hnICYmIGRpLT5hY19jaGctPm9wcy5raWNrX3dkICYmCisJICAgIGRpLT5jaGdfaW5mby5vbmxpbmVfY2hnICYgQUNfQ0hHKSB7CisJCS8qCisJCSAqIElmIEFCIGNoYXJnZXIgd2F0Y2hkb2cgZXhwaXJlZCwgcG0yeHh4IGNoYXJnaW5nCisJCSAqIGdldHMgZGlzYWJsZWQuIFRvIGJlIHNhZmUsIGtpY2sgYm90aCBBQiBjaGFyZ2VyIHdhdGNoZG9nCisJCSAqIGFuZCBwbTJ4eHggd2F0Y2hkb2cuCisJCSAqLworCQlpZiAoZGktPmFjX2NoZy0+ZXh0ZXJuYWwgJiYKKwkJICAgIGRpLT51c2JfY2hnICYmIGRpLT51c2JfY2hnLT5vcHMua2lja193ZCkKKwkJCWRpLT51c2JfY2hnLT5vcHMua2lja193ZChkaS0+dXNiX2NoZyk7CisKKwkJcmV0dXJuIGRpLT5hY19jaGctPm9wcy5raWNrX3dkKGRpLT5hY19jaGcpOworCX0KKwllbHNlIGlmIChkaS0+dXNiX2NoZyAmJiBkaS0+dXNiX2NoZy0+b3BzLmtpY2tfd2QgJiYKKwkJCWRpLT5jaGdfaW5mby5vbmxpbmVfY2hnICYgVVNCX0NIRykKKwkJcmV0dXJuIGRpLT51c2JfY2hnLT5vcHMua2lja193ZChkaS0+dXNiX2NoZyk7CisKKwlyZXR1cm4gLUVOWElPOworfQorCisvKioKKyAqIGFieDUwMF9jaGFyZ2FsZ19hY19lbigpIC0gVHVybiBvbi9vZmYgdGhlIEFDIGNoYXJnZXIKKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFieDUwMF9jaGFyZ2FsZyBzdHJ1Y3R1cmUKKyAqIEBlbmFibGU6CWNoYXJnZXIgb24vb2ZmCisgKiBAdnNldDoJcmVxdWVzdGVkIGNoYXJnZXIgb3V0cHV0IHZvbHRhZ2UKKyAqIEBpc2V0OglyZXF1ZXN0ZWQgY2hhcmdlciBvdXRwdXQgY3VycmVudAorICoKKyAqIFRoZSBBQyBjaGFyZ2VyIHdpbGwgYmUgdHVybmVkIG9uL29mZiB3aXRoIHRoZSByZXF1ZXN0ZWQgY2hhcmdlIHZvbHRhZ2UgYW5kCisgKiBjdXJyZW50CisgKi8KK3N0YXRpYyBpbnQgYWJ4NTAwX2NoYXJnYWxnX2FjX2VuKHN0cnVjdCBhYng1MDBfY2hhcmdhbGcgKmRpLCBpbnQgZW5hYmxlLAorCWludCB2c2V0LCBpbnQgaXNldCkKK3sKKwlzdGF0aWMgaW50IGFieDUwMF9jaGFyZ2FsZ19leF9hY19lbmFibGVfdG9nZ2xlOworCisJaWYgKCFkaS0+YWNfY2hnIHx8ICFkaS0+YWNfY2hnLT5vcHMuZW5hYmxlKQorCQlyZXR1cm4gLUVOWElPOworCisJLyogU2VsZWN0IG1heGltdW0gb2Ygd2hhdCBib3RoIHRoZSBjaGFyZ2VyIGFuZCB0aGUgYmF0dGVyeSBzdXBwb3J0cyAqLworCWlmIChkaS0+YWNfY2hnLT5tYXhfb3V0X3ZvbHQpCisJCXZzZXQgPSBtaW4odnNldCwgZGktPmFjX2NoZy0+bWF4X291dF92b2x0KTsKKwlpZiAoZGktPmFjX2NoZy0+bWF4X291dF9jdXJyKQorCQlpc2V0ID0gbWluKGlzZXQsIGRpLT5hY19jaGctPm1heF9vdXRfY3Vycik7CisKKwlkaS0+Y2hnX2luZm8uYWNfaXNldCA9IGlzZXQ7CisJZGktPmNoZ19pbmZvLmFjX3ZzZXQgPSB2c2V0OworCisJLyogRW5hYmxlIGV4dGVybmFsIGNoYXJnZXIgKi8KKwlpZiAoZW5hYmxlICYmIGRpLT5hY19jaGctPmV4dGVybmFsICYmCisJICAgICFhYng1MDBfY2hhcmdhbGdfZXhfYWNfZW5hYmxlX3RvZ2dsZSkgeworCQlibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZjaGFyZ2VyX25vdGlmaWVyX2xpc3QsCisJCQkJCSAgICAgMCwgZGktPmRldik7CisJCWFieDUwMF9jaGFyZ2FsZ19leF9hY19lbmFibGVfdG9nZ2xlKys7CisJfQorCisJcmV0dXJuIGRpLT5hY19jaGctPm9wcy5lbmFibGUoZGktPmFjX2NoZywgZW5hYmxlLCB2c2V0LCBpc2V0KTsKK30KKworLyoqCisgKiBhYng1MDBfY2hhcmdhbGdfdXNiX2VuKCkgLSBUdXJuIG9uL29mZiB0aGUgVVNCIGNoYXJnZXIKKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFieDUwMF9jaGFyZ2FsZyBzdHJ1Y3R1cmUKKyAqIEBlbmFibGU6CWNoYXJnZXIgb24vb2ZmCisgKiBAdnNldDoJcmVxdWVzdGVkIGNoYXJnZXIgb3V0cHV0IHZvbHRhZ2UKKyAqIEBpc2V0OglyZXF1ZXN0ZWQgY2hhcmdlciBvdXRwdXQgY3VycmVudAorICoKKyAqIFRoZSBVU0IgY2hhcmdlciB3aWxsIGJlIHR1cm5lZCBvbi9vZmYgd2l0aCB0aGUgcmVxdWVzdGVkIGNoYXJnZSB2b2x0YWdlIGFuZAorICogY3VycmVudAorICovCitzdGF0aWMgaW50IGFieDUwMF9jaGFyZ2FsZ191c2JfZW4oc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGksIGludCBlbmFibGUsCisJaW50IHZzZXQsIGludCBpc2V0KQoreworCWlmICghZGktPnVzYl9jaGcgfHwgIWRpLT51c2JfY2hnLT5vcHMuZW5hYmxlKQorCQlyZXR1cm4gLUVOWElPOworCisJLyogU2VsZWN0IG1heGltdW0gb2Ygd2hhdCBib3RoIHRoZSBjaGFyZ2VyIGFuZCB0aGUgYmF0dGVyeSBzdXBwb3J0cyAqLworCWlmIChkaS0+dXNiX2NoZy0+bWF4X291dF92b2x0KQorCQl2c2V0ID0gbWluKHZzZXQsIGRpLT51c2JfY2hnLT5tYXhfb3V0X3ZvbHQpOworCWlmIChkaS0+dXNiX2NoZy0+bWF4X291dF9jdXJyKQorCQlpc2V0ID0gbWluKGlzZXQsIGRpLT51c2JfY2hnLT5tYXhfb3V0X2N1cnIpOworCisJZGktPmNoZ19pbmZvLnVzYl9pc2V0ID0gaXNldDsKKwlkaS0+Y2hnX2luZm8udXNiX3ZzZXQgPSB2c2V0OworCisJcmV0dXJuIGRpLT51c2JfY2hnLT5vcHMuZW5hYmxlKGRpLT51c2JfY2hnLCBlbmFibGUsIHZzZXQsIGlzZXQpOworfQorCisgLyoqCisgKiBhYjg1NDBfY2hhcmdhbGdfdXNiX3BwX2VuKCkgLSBFbmFibGUvIGRpc2FibGUgVVNCIHBvd2VyIHBhdGgKKyAqIEBkaTogICAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgYWJ4NTAwX2NoYXJnYWxnIHN0cnVjdHVyZQorICogQGVuYWJsZTogICAgcG93ZXIgcGF0aCBlbmFibGUvZGlzYWJsZQorICoKKyAqIFRoZSBVU0IgcG93ZXIgcGF0aCB3aWxsIGJlIGVuYWJsZS8gZGlzYWJsZQorICovCitzdGF0aWMgaW50IGFiODU0MF9jaGFyZ2FsZ191c2JfcHBfZW4oc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGksIGJvb2wgZW5hYmxlKQoreworCWlmICghZGktPnVzYl9jaGcgfHwgIWRpLT51c2JfY2hnLT5vcHMucHBfZW5hYmxlKQorCQlyZXR1cm4gLUVOWElPOworCisJcmV0dXJuIGRpLT51c2JfY2hnLT5vcHMucHBfZW5hYmxlKGRpLT51c2JfY2hnLCBlbmFibGUpOworfQorCisvKioKKyAqIGFiODU0MF9jaGFyZ2FsZ191c2JfcHJlX2NoZ19lbigpIC0gRW5hYmxlLyBkaXNhYmxlIFVTQiBwcmUtY2hhcmdlCisgKiBAZGk6ICAgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGFieDUwMF9jaGFyZ2FsZyBzdHJ1Y3R1cmUKKyAqIEBlbmFibGU6ICAgIFVTQiBwcmUtY2hhcmdlIGVuYWJsZS9kaXNhYmxlCisgKgorICogVGhlIFVTQiBVU0IgcHJlLWNoYXJnZSB3aWxsIGJlIGVuYWJsZS8gZGlzYWJsZQorICovCitzdGF0aWMgaW50IGFiODU0MF9jaGFyZ2FsZ191c2JfcHJlX2NoZ19lbihzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSwKKwkJCQkJICBib29sIGVuYWJsZSkKK3sKKwlpZiAoIWRpLT51c2JfY2hnIHx8ICFkaS0+dXNiX2NoZy0+b3BzLnByZV9jaGdfZW5hYmxlKQorCQlyZXR1cm4gLUVOWElPOworCisJcmV0dXJuIGRpLT51c2JfY2hnLT5vcHMucHJlX2NoZ19lbmFibGUoZGktPnVzYl9jaGcsIGVuYWJsZSk7Cit9CisKKy8qKgorICogYWJ4NTAwX2NoYXJnYWxnX3VwZGF0ZV9jaGdfY3VycigpIC0gVXBkYXRlIGNoYXJnZXIgY3VycmVudAorICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWJ4NTAwX2NoYXJnYWxnIHN0cnVjdHVyZQorICogQGlzZXQ6CXJlcXVlc3RlZCBjaGFyZ2VyIG91dHB1dCBjdXJyZW50CisgKgorICogVGhlIGNoYXJnZXIgb3V0cHV0IGN1cnJlbnQgd2lsbCBiZSB1cGRhdGVkIGZvciB0aGUgY2hhcmdlcgorICogdGhhdCBpcyBjdXJyZW50bHkgaW4gdXNlCisgKi8KK3N0YXRpYyBpbnQgYWJ4NTAwX2NoYXJnYWxnX3VwZGF0ZV9jaGdfY3VycihzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSwKKwkJaW50IGlzZXQpCit7CisJLyogQ2hlY2sgaWYgY2hhcmdlciBleGlzdHMgYW5kIHVwZGF0ZSBjdXJyZW50IGlmIGNoYXJnaW5nICovCisJaWYgKGRpLT5hY19jaGcgJiYgZGktPmFjX2NoZy0+b3BzLnVwZGF0ZV9jdXJyICYmCisJCQlkaS0+Y2hnX2luZm8uY2hhcmdlcl90eXBlICYgQUNfQ0hHKSB7CisJCS8qCisJCSAqIFNlbGVjdCBtYXhpbXVtIG9mIHdoYXQgYm90aCB0aGUgY2hhcmdlcgorCQkgKiBhbmQgdGhlIGJhdHRlcnkgc3VwcG9ydHMKKwkJICovCisJCWlmIChkaS0+YWNfY2hnLT5tYXhfb3V0X2N1cnIpCisJCQlpc2V0ID0gbWluKGlzZXQsIGRpLT5hY19jaGctPm1heF9vdXRfY3Vycik7CisKKwkJZGktPmNoZ19pbmZvLmFjX2lzZXQgPSBpc2V0OworCisJCXJldHVybiBkaS0+YWNfY2hnLT5vcHMudXBkYXRlX2N1cnIoZGktPmFjX2NoZywgaXNldCk7CisJfSBlbHNlIGlmIChkaS0+dXNiX2NoZyAmJiBkaS0+dXNiX2NoZy0+b3BzLnVwZGF0ZV9jdXJyICYmCisJCQlkaS0+Y2hnX2luZm8uY2hhcmdlcl90eXBlICYgVVNCX0NIRykgeworCQkvKgorCQkgKiBTZWxlY3QgbWF4aW11bSBvZiB3aGF0IGJvdGggdGhlIGNoYXJnZXIKKwkJICogYW5kIHRoZSBiYXR0ZXJ5IHN1cHBvcnRzCisJCSAqLworCQlpZiAoZGktPnVzYl9jaGctPm1heF9vdXRfY3VycikKKwkJCWlzZXQgPSBtaW4oaXNldCwgZGktPnVzYl9jaGctPm1heF9vdXRfY3Vycik7CisKKwkJZGktPmNoZ19pbmZvLnVzYl9pc2V0ID0gaXNldDsKKworCQlyZXR1cm4gZGktPnVzYl9jaGctPm9wcy51cGRhdGVfY3VycihkaS0+dXNiX2NoZywgaXNldCk7CisJfQorCisJcmV0dXJuIC1FTlhJTzsKK30KKworLyoqCisgKiBhYng1MDBfY2hhcmdhbGdfc3RvcF9jaGFyZ2luZygpIC0gU3RvcCBjaGFyZ2luZworICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWJ4NTAwX2NoYXJnYWxnIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gYW55IHN0YXRlIHdoZXJlIGNoYXJnaW5nIHNob3VsZCBiZSBzdG9wcGVkLgorICogQWxsIGNoYXJnaW5nIGlzIGRpc2FibGVkIGFuZCBhbGwgc3RhdHVzIHBhcmFtZXRlcnMgYW5kIHRpbWVycyBhcmUgY2hhbmdlZAorICogYWNjb3JkaW5nbHkKKyAqLworc3RhdGljIHZvaWQgYWJ4NTAwX2NoYXJnYWxnX3N0b3BfY2hhcmdpbmcoc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGkpCit7CisJYWJ4NTAwX2NoYXJnYWxnX2FjX2VuKGRpLCBmYWxzZSwgMCwgMCk7CisJYWJ4NTAwX2NoYXJnYWxnX3VzYl9lbihkaSwgZmFsc2UsIDAsIDApOworCWFieDUwMF9jaGFyZ2FsZ19zdG9wX3NhZmV0eV90aW1lcihkaSk7CisJYWJ4NTAwX2NoYXJnYWxnX3N0b3BfbWFpbnRlbmFuY2VfdGltZXIoZGkpOworCWRpLT5jaGFyZ2Vfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19OT1RfQ0hBUkdJTkc7CisJZGktPm1haW50ZW5hbmNlX2NoZyA9IGZhbHNlOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmRpLT5jaGFyZ2FsZ193ZF93b3JrKTsKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZChkaS0+Y2hhcmdhbGdfcHN5KTsKK30KKworLyoqCisgKiBhYng1MDBfY2hhcmdhbGdfaG9sZF9jaGFyZ2luZygpIC0gUGF1c2VzIGNoYXJnaW5nCisgKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYng1MDBfY2hhcmdhbGcgc3RydWN0dXJlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdGhlIGNhc2Ugd2hlcmUgbWFpbnRlbmFuY2UgY2hhcmdpbmcgaGFzIGJlZW4KKyAqIGRpc2FibGVkIGFuZCBpbnN0ZWFkIGEgYmF0dGVyeSB2b2x0YWdlIG1vZGUgaXMgZW50ZXJlZCB0byBjaGVjayB3aGVuIHRoZQorICogYmF0dGVyeSB2b2x0YWdlIGhhcyByZWFjaGVkIGEgY2VydGFpbiByZWNoYXJnZSB2b2x0YWdlCisgKi8KK3N0YXRpYyB2b2lkIGFieDUwMF9jaGFyZ2FsZ19ob2xkX2NoYXJnaW5nKHN0cnVjdCBhYng1MDBfY2hhcmdhbGcgKmRpKQoreworCWFieDUwMF9jaGFyZ2FsZ19hY19lbihkaSwgZmFsc2UsIDAsIDApOworCWFieDUwMF9jaGFyZ2FsZ191c2JfZW4oZGksIGZhbHNlLCAwLCAwKTsKKwlhYng1MDBfY2hhcmdhbGdfc3RvcF9zYWZldHlfdGltZXIoZGkpOworCWFieDUwMF9jaGFyZ2FsZ19zdG9wX21haW50ZW5hbmNlX3RpbWVyKGRpKTsKKwlkaS0+Y2hhcmdlX3N0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7CisJZGktPm1haW50ZW5hbmNlX2NoZyA9IGZhbHNlOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmRpLT5jaGFyZ2FsZ193ZF93b3JrKTsKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZChkaS0+Y2hhcmdhbGdfcHN5KTsKK30KKworLyoqCisgKiBhYng1MDBfY2hhcmdhbGdfc3RhcnRfY2hhcmdpbmcoKSAtIFN0YXJ0IHRoZSBjaGFyZ2VyCisgKiBAZGk6CQlwb2ludGVyIHRvIHRoZSBhYng1MDBfY2hhcmdhbGcgc3RydWN0dXJlCisgKiBAdnNldDoJcmVxdWVzdGVkIGNoYXJnZXIgb3V0cHV0IHZvbHRhZ2UKKyAqIEBpc2V0OglyZXF1ZXN0ZWQgY2hhcmdlciBvdXRwdXQgY3VycmVudAorICoKKyAqIEEgY2hhcmdlciB3aWxsIGJlIGVuYWJsZWQgZGVwZW5kaW5nIG9uIHRoZSByZXF1ZXN0ZWQgY2hhcmdlciB0eXBlIHRoYXQgd2FzCisgKiBkZXRlY3RlZCBwcmV2aW91c2x5LgorICovCitzdGF0aWMgdm9pZCBhYng1MDBfY2hhcmdhbGdfc3RhcnRfY2hhcmdpbmcoc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGksCisJaW50IHZzZXQsIGludCBpc2V0KQoreworCXN3aXRjaCAoZGktPmNoZ19pbmZvLmNoYXJnZXJfdHlwZSkgeworCWNhc2UgQUNfQ0hHOgorCQlkZXZfZGJnKGRpLT5kZXYsCisJCQkiQUMgcGFyYW1ldGVyczogVnNldCAlZCwgSWNoICVkXG4iLCB2c2V0LCBpc2V0KTsKKwkJYWJ4NTAwX2NoYXJnYWxnX3VzYl9lbihkaSwgZmFsc2UsIDAsIDApOworCQlhYng1MDBfY2hhcmdhbGdfYWNfZW4oZGksIHRydWUsIHZzZXQsIGlzZXQpOworCQlicmVhazsKKworCWNhc2UgVVNCX0NIRzoKKwkJZGV2X2RiZyhkaS0+ZGV2LAorCQkJIlVTQiBwYXJhbWV0ZXJzOiBWc2V0ICVkLCBJY2ggJWRcbiIsIHZzZXQsIGlzZXQpOworCQlhYng1MDBfY2hhcmdhbGdfYWNfZW4oZGksIGZhbHNlLCAwLCAwKTsKKwkJYWJ4NTAwX2NoYXJnYWxnX3VzYl9lbihkaSwgdHJ1ZSwgdnNldCwgaXNldCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2VycihkaS0+ZGV2LCAiVW5rbm93biBjaGFyZ2VyIHRvIGNoYXJnZSBmcm9tXG4iKTsKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIGFieDUwMF9jaGFyZ2FsZ19jaGVja190ZW1wKCkgLSBDaGVjayBiYXR0ZXJ5IHRlbXBlcmF0dXJlIHJhbmdlcworICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWJ4NTAwX2NoYXJnYWxnIHN0cnVjdHVyZQorICoKKyAqIFRoZSBiYXR0ZXJ5IHRlbXBlcmF0dXJlIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgcHJlZGVmaW5lZCBsaW1pdHMgYW5kIHRoZQorICogY2hhcmdlIHN0YXRlIGlzIGNoYW5nZWQgYWNjb3JkaW5nbHkKKyAqLworc3RhdGljIHZvaWQgYWJ4NTAwX2NoYXJnYWxnX2NoZWNrX3RlbXAoc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGkpCit7CisJaWYgKGRpLT5iYXR0X2RhdGEudGVtcCA+IChkaS0+Ym0tPnRlbXBfbG93ICsgZGktPnRfaHlzdF9ub3JtKSAmJgorCQlkaS0+YmF0dF9kYXRhLnRlbXAgPCAoZGktPmJtLT50ZW1wX2hpZ2ggLSBkaS0+dF9oeXN0X25vcm0pKSB7CisJCS8qIFRlbXAgT0shICovCisJCWRpLT5ldmVudHMuYnRlbXBfdW5kZXJvdmVyID0gZmFsc2U7CisJCWRpLT5ldmVudHMuYnRlbXBfbG93aGlnaCA9IGZhbHNlOworCQlkaS0+dF9oeXN0X25vcm0gPSAwOworCQlkaS0+dF9oeXN0X2xvd2hpZ2ggPSAwOworCX0gZWxzZSB7CisJCWlmICgoKGRpLT5iYXR0X2RhdGEudGVtcCA+PSBkaS0+Ym0tPnRlbXBfaGlnaCkgJiYKKwkJCShkaS0+YmF0dF9kYXRhLnRlbXAgPAorCQkJCShkaS0+Ym0tPnRlbXBfb3ZlciAtIGRpLT50X2h5c3RfbG93aGlnaCkpKSB8fAorCQkJKChkaS0+YmF0dF9kYXRhLnRlbXAgPgorCQkJCShkaS0+Ym0tPnRlbXBfdW5kZXIgKyBkaS0+dF9oeXN0X2xvd2hpZ2gpKSAmJgorCQkJKGRpLT5iYXR0X2RhdGEudGVtcCA8PSBkaS0+Ym0tPnRlbXBfbG93KSkpIHsKKwkJCS8qIFRFTVAgbWlub3IhISEhISAqLworCQkJZGktPmV2ZW50cy5idGVtcF91bmRlcm92ZXIgPSBmYWxzZTsKKwkJCWRpLT5ldmVudHMuYnRlbXBfbG93aGlnaCA9IHRydWU7CisJCQlkaS0+dF9oeXN0X25vcm0gPSBkaS0+Ym0tPnRlbXBfaHlzdGVyZXNpczsKKwkJCWRpLT50X2h5c3RfbG93aGlnaCA9IDA7CisJCX0gZWxzZSBpZiAoZGktPmJhdHRfZGF0YS50ZW1wIDw9IGRpLT5ibS0+dGVtcF91bmRlciB8fAorCQkJZGktPmJhdHRfZGF0YS50ZW1wID49IGRpLT5ibS0+dGVtcF9vdmVyKSB7CisJCQkvKiBURU1QIG1ham9yISEhISEgKi8KKwkJCWRpLT5ldmVudHMuYnRlbXBfdW5kZXJvdmVyID0gdHJ1ZTsKKwkJCWRpLT5ldmVudHMuYnRlbXBfbG93aGlnaCA9IGZhbHNlOworCQkJZGktPnRfaHlzdF9ub3JtID0gMDsKKwkJCWRpLT50X2h5c3RfbG93aGlnaCA9IGRpLT5ibS0+dGVtcF9oeXN0ZXJlc2lzOworCQl9IGVsc2UgeworCQkvKiBXaXRoaW4gaHlzdGVyZXNpcyAqLworCQlkZXZfZGJnKGRpLT5kZXYsICJXaXRoaW4gaHlzdGVyZXNpcyBsaW1pdCB0ZW1wOiAlZCAiCisJCQkJImh5c3RfbG93aGlnaCAlZCwgaHlzdCBub3JtYWwgJWRcbiIsCisJCQkJZGktPmJhdHRfZGF0YS50ZW1wLCBkaS0+dF9oeXN0X2xvd2hpZ2gsCisJCQkJZGktPnRfaHlzdF9ub3JtKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBhYng1MDBfY2hhcmdhbGdfY2hlY2tfY2hhcmdlcl92b2x0YWdlKCkgLSBDaGVjayBjaGFyZ2VyIHZvbHRhZ2UKKyAqIEBkaToJCXBvaW50ZXIgdG8gdGhlIGFieDUwMF9jaGFyZ2FsZyBzdHJ1Y3R1cmUKKyAqCisgKiBDaGFyZ2VyIHZvbHRhZ2UgaXMgY2hlY2tlZCBhZ2FpbnN0IG1heGltdW0gbGltaXQKKyAqLworc3RhdGljIHZvaWQgYWJ4NTAwX2NoYXJnYWxnX2NoZWNrX2NoYXJnZXJfdm9sdGFnZShzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSkKK3sKKwlpZiAoZGktPmNoZ19pbmZvLnVzYl92b2x0ID4gZGktPmJtLT5jaGdfcGFyYW1zLT51c2Jfdm9sdF9tYXgpCisJCWRpLT5jaGdfaW5mby51c2JfY2hnX29rID0gZmFsc2U7CisJZWxzZQorCQlkaS0+Y2hnX2luZm8udXNiX2NoZ19vayA9IHRydWU7CisKKwlpZiAoZGktPmNoZ19pbmZvLmFjX3ZvbHQgPiBkaS0+Ym0tPmNoZ19wYXJhbXMtPmFjX3ZvbHRfbWF4KQorCQlkaS0+Y2hnX2luZm8uYWNfY2hnX29rID0gZmFsc2U7CisJZWxzZQorCQlkaS0+Y2hnX2luZm8uYWNfY2hnX29rID0gdHJ1ZTsKKworfQorCisvKioKKyAqIGFieDUwMF9jaGFyZ2FsZ19lbmRfb2ZfY2hhcmdlKCkgLSBDaGVjayBpZiBlbmQtb2YtY2hhcmdlIGNyaXRlcmlhIGlzIGZ1bGZpbGxlZAorICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWJ4NTAwX2NoYXJnYWxnIHN0cnVjdHVyZQorICoKKyAqIEVuZC1vZi1jaGFyZ2UgY3JpdGVyaWEgaXMgZnVsZmlsbGVkIHdoZW4gdGhlIGJhdHRlcnkgdm9sdGFnZSBpcyBhYm92ZSBhCisgKiBjZXJ0YWluIGxpbWl0IGFuZCB0aGUgYmF0dGVyeSBjdXJyZW50IGlzIGJlbG93IGEgY2VydGFpbiBsaW1pdCBmb3IgYQorICogcHJlZGVmaW5lZCBudW1iZXIgb2YgY29uc2VjdXRpdmUgc2Vjb25kcy4gSWYgdHJ1ZSwgdGhlIGJhdHRlcnkgaXMgZnVsbAorICovCitzdGF0aWMgdm9pZCBhYng1MDBfY2hhcmdhbGdfZW5kX29mX2NoYXJnZShzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSkKK3sKKwlpZiAoZGktPmNoYXJnZV9zdGF0dXMgPT0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORyAmJgorCQlkaS0+Y2hhcmdlX3N0YXRlID09IFNUQVRFX05PUk1BTCAmJgorCQkhZGktPm1haW50ZW5hbmNlX2NoZyAmJiAoZGktPmJhdHRfZGF0YS52b2x0ID49CisJCWRpLT5ibS0+YmF0X3R5cGVbZGktPmJtLT5iYXR0X2lkXS50ZXJtaW5hdGlvbl92b2wgfHwKKwkJZGktPmV2ZW50cy51c2JfY3ZfYWN0aXZlIHx8IGRpLT5ldmVudHMuYWNfY3ZfYWN0aXZlKSAmJgorCQlkaS0+YmF0dF9kYXRhLmF2Z19jdXJyIDwKKwkJZGktPmJtLT5iYXRfdHlwZVtkaS0+Ym0tPmJhdHRfaWRdLnRlcm1pbmF0aW9uX2N1cnIgJiYKKwkJZGktPmJhdHRfZGF0YS5hdmdfY3VyciA+IDApIHsKKwkJaWYgKCsrZGktPmVvY19jbnQgPj0gRU9DX0NPTkRfQ05UKSB7CisJCQlkaS0+ZW9jX2NudCA9IDA7CisJCQlpZiAoKGRpLT5jaGdfaW5mby5jaGFyZ2VyX3R5cGUgJiBVU0JfQ0hHKSAmJgorCQkJICAgKGRpLT51c2JfY2hnLT5wb3dlcl9wYXRoKSkKKwkJCQlhYjg1NDBfY2hhcmdhbGdfdXNiX3BwX2VuKGRpLCB0cnVlKTsKKwkJCWRpLT5jaGFyZ2Vfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19GVUxMOworCQkJZGktPm1haW50ZW5hbmNlX2NoZyA9IHRydWU7CisJCQlkZXZfZGJnKGRpLT5kZXYsICJFT0MgcmVhY2hlZCFcbiIpOworCQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGktPmNoYXJnYWxnX3BzeSk7CisJCX0gZWxzZSB7CisJCQlkZXZfZGJnKGRpLT5kZXYsCisJCQkJIiBFT0MgbGltaXQgcmVhY2hlZCBmb3IgdGhlICVkIgorCQkJCSIgdGltZSwgb3V0IG9mICVkIGJlZm9yZSBFT0NcbiIsCisJCQkJZGktPmVvY19jbnQsCisJCQkJRU9DX0NPTkRfQ05UKTsKKwkJfQorCX0gZWxzZSB7CisJCWRpLT5lb2NfY250ID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfbWF4aW1fY2hnX2N1cnIoc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGkpCit7CisJZGktPmNjbS5vcmlnaW5hbF9pc2V0ID0KKwkJZGktPmJtLT5iYXRfdHlwZVtkaS0+Ym0tPmJhdHRfaWRdLm5vcm1hbF9jdXJfbHZsOworCWRpLT5jY20uY3VycmVudF9pc2V0ID0KKwkJZGktPmJtLT5iYXRfdHlwZVtkaS0+Ym0tPmJhdHRfaWRdLm5vcm1hbF9jdXJfbHZsOworCWRpLT5jY20udGVzdF9kZWx0YV9pID0gZGktPmJtLT5tYXhpLT5jaGFyZ2VyX2N1cnJfc3RlcDsKKwlkaS0+Y2NtLm1heF9jdXJyZW50ID0gZGktPmJtLT5tYXhpLT5jaGdfY3VycjsKKwlkaS0+Y2NtLmNvbmRpdGlvbl9jbnQgPSBkaS0+Ym0tPm1heGktPndhaXRfY3ljbGVzOworCWRpLT5jY20ubGV2ZWwgPSAwOworfQorCisvKioKKyAqIGFieDUwMF9jaGFyZ2FsZ19jaGdfY3Vycl9tYXhpbSAtIGluY3JlYXNlcyB0aGUgY2hhcmdlciBjdXJyZW50IHRvCisgKgkJCWNvbXBlbnNhdGUgZm9yIHRoZSBzeXN0ZW0gbG9hZAorICogQGRpCQlwb2ludGVyIHRvIHRoZSBhYng1MDBfY2hhcmdhbGcgc3RydWN0dXJlCisgKgorICogVGhpcyBtYXhpbWl6YXRpb24gZnVuY3Rpb24gaXMgdXNlZCB0byByYWlzZSB0aGUgY2hhcmdlciBjdXJyZW50IHRvIGdldCB0aGUKKyAqIGJhdHRlcnkgY3VycmVudCBhcyBjbG9zZSB0byB0aGUgb3B0aW1hbCB2YWx1ZSBhcyBwb3NzaWJsZS4gVGhlIGJhdHRlcnkKKyAqIGN1cnJlbnQgZHVyaW5nIGNoYXJnaW5nIGlzIGFmZmVjdGVkIGJ5IHRoZSBzeXN0ZW0gbG9hZAorICovCitzdGF0aWMgZW51bSBtYXhpbV9yZXQgYWJ4NTAwX2NoYXJnYWxnX2NoZ19jdXJyX21heGltKHN0cnVjdCBhYng1MDBfY2hhcmdhbGcgKmRpKQoreworCWludCBkZWx0YV9pOworCisJaWYgKCFkaS0+Ym0tPm1heGktPmVuYV9tYXhpKQorCQlyZXR1cm4gTUFYSU1fUkVUX05PQUNUSU9OOworCisJZGVsdGFfaSA9IGRpLT5jY20ub3JpZ2luYWxfaXNldCAtIGRpLT5iYXR0X2RhdGEuaW5zdF9jdXJyOworCisJaWYgKGRpLT5ldmVudHMudmJ1c19jb2xsYXBzZWQpIHsKKwkJZGV2X2RiZyhkaS0+ZGV2LCAiQ2hhcmdlciB2b2x0YWdlIGhhcyBjb2xsYXBzZWQgJWRcbiIsCisJCQkJZGktPmNjbS53YWl0X2NudCk7CisJCWlmIChkaS0+Y2NtLndhaXRfY250ID09IDApIHsKKwkJCWRldl9kYmcoZGktPmRldiwgImxvd2VyaW5nIGN1cnJlbnRcbiIpOworCQkJZGktPmNjbS53YWl0X2NudCsrOworCQkJZGktPmNjbS5jb25kaXRpb25fY250ID0gZGktPmJtLT5tYXhpLT53YWl0X2N5Y2xlczsKKwkJCWRpLT5jY20ubWF4X2N1cnJlbnQgPQorCQkJCWRpLT5jY20uY3VycmVudF9pc2V0IC0gZGktPmNjbS50ZXN0X2RlbHRhX2k7CisJCQlkaS0+Y2NtLmN1cnJlbnRfaXNldCA9IGRpLT5jY20ubWF4X2N1cnJlbnQ7CisJCQlkaS0+Y2NtLmxldmVsLS07CisJCQlyZXR1cm4gTUFYSU1fUkVUX0NIQU5HRTsKKwkJfSBlbHNlIHsKKwkJCWRldl9kYmcoZGktPmRldiwgIndhaXRpbmdcbiIpOworCQkJLyogTGV0J3MgZ28gaW4gaGVyZSB0d2ljZSBiZWZvcmUgbG93ZXJpbmcgY3VyciBhZ2FpbiAqLworCQkJZGktPmNjbS53YWl0X2NudCA9IChkaS0+Y2NtLndhaXRfY250ICsgMSkgJSAzOworCQkJcmV0dXJuIE1BWElNX1JFVF9OT0FDVElPTjsKKwkJfQorCX0KKworCWRpLT5jY20ud2FpdF9jbnQgPSAwOworCisJaWYgKChkaS0+YmF0dF9kYXRhLmluc3RfY3VyciA+IGRpLT5jY20ub3JpZ2luYWxfaXNldCkpIHsKKwkJZGV2X2RiZyhkaS0+ZGV2LCAiIE1heGltaXphdGlvbiBJYmF0ICglZG1BKSB0b28gaGlnaCIKKwkJCSIgKGxpbWl0ICVkbUEpIChjdXJyZW50IGlzZXQ6ICVkbUEpIVxuIiwKKwkJCWRpLT5iYXR0X2RhdGEuaW5zdF9jdXJyLCBkaS0+Y2NtLm9yaWdpbmFsX2lzZXQsCisJCQlkaS0+Y2NtLmN1cnJlbnRfaXNldCk7CisKKwkJaWYgKGRpLT5jY20uY3VycmVudF9pc2V0ID09IGRpLT5jY20ub3JpZ2luYWxfaXNldCkKKwkJCXJldHVybiBNQVhJTV9SRVRfTk9BQ1RJT047CisKKwkJZGktPmNjbS5jb25kaXRpb25fY250ID0gZGktPmJtLT5tYXhpLT53YWl0X2N5Y2xlczsKKwkJZGktPmNjbS5jdXJyZW50X2lzZXQgPSBkaS0+Y2NtLm9yaWdpbmFsX2lzZXQ7CisJCWRpLT5jY20ubGV2ZWwgPSAwOworCisJCXJldHVybiBNQVhJTV9SRVRfSUJBVF9UT09fSElHSDsKKwl9CisKKwlpZiAoZGVsdGFfaSA+IGRpLT5jY20udGVzdF9kZWx0YV9pICYmCisJCShkaS0+Y2NtLmN1cnJlbnRfaXNldCArIGRpLT5jY20udGVzdF9kZWx0YV9pKSA8CisJCWRpLT5jY20ubWF4X2N1cnJlbnQpIHsKKwkJaWYgKGRpLT5jY20uY29uZGl0aW9uX2NudC0tID09IDApIHsKKwkJCS8qIEluY3Jlc2UgdGhlIGlzZXQgd2l0aCBjY28udGVzdF9kZWx0YV9pICovCisJCQlkaS0+Y2NtLmNvbmRpdGlvbl9jbnQgPSBkaS0+Ym0tPm1heGktPndhaXRfY3ljbGVzOworCQkJZGktPmNjbS5jdXJyZW50X2lzZXQgKz0gZGktPmNjbS50ZXN0X2RlbHRhX2k7CisJCQlkaS0+Y2NtLmxldmVsKys7CisJCQlkZXZfZGJnKGRpLT5kZXYsICIgTWF4aW1pemF0aW9uIG5lZWRlZCwgaW5jcmVhc2UiCisJCQkJIiB3aXRoICVkIG1BIHRvICVkbUEgKE9wdGltYWwgaWJhdDogJWQpIgorCQkJCSIgTGV2ZWwgJWRcbiIsCisJCQkJZGktPmNjbS50ZXN0X2RlbHRhX2ksCisJCQkJZGktPmNjbS5jdXJyZW50X2lzZXQsCisJCQkJZGktPmNjbS5vcmlnaW5hbF9pc2V0LAorCQkJCWRpLT5jY20ubGV2ZWwpOworCQkJcmV0dXJuIE1BWElNX1JFVF9DSEFOR0U7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gTUFYSU1fUkVUX05PQUNUSU9OOworCQl9CisJfSAgZWxzZSB7CisJCWRpLT5jY20uY29uZGl0aW9uX2NudCA9IGRpLT5ibS0+bWF4aS0+d2FpdF9jeWNsZXM7CisJCXJldHVybiBNQVhJTV9SRVRfTk9BQ1RJT047CisJfQorfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfbWF4aW1fY2hnX2N1cnIoc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGkpCit7CisJZW51bSBtYXhpbV9yZXQgcmV0OworCWludCByZXN1bHQ7CisKKwlyZXQgPSBhYng1MDBfY2hhcmdhbGdfY2hnX2N1cnJfbWF4aW0oZGkpOworCXN3aXRjaCAocmV0KSB7CisJY2FzZSBNQVhJTV9SRVRfQ0hBTkdFOgorCQlyZXN1bHQgPSBhYng1MDBfY2hhcmdhbGdfdXBkYXRlX2NoZ19jdXJyKGRpLAorCQkJZGktPmNjbS5jdXJyZW50X2lzZXQpOworCQlpZiAocmVzdWx0KQorCQkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIHNldCBjaGcgY3VyclxuIik7CisJCWJyZWFrOworCWNhc2UgTUFYSU1fUkVUX0lCQVRfVE9PX0hJR0g6CisJCXJlc3VsdCA9IGFieDUwMF9jaGFyZ2FsZ191cGRhdGVfY2hnX2N1cnIoZGksCisJCQlkaS0+Ym0tPmJhdF90eXBlW2RpLT5ibS0+YmF0dF9pZF0ubm9ybWFsX2N1cl9sdmwpOworCQlpZiAocmVzdWx0KQorCQkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIHNldCBjaGcgY3VyclxuIik7CisJCWJyZWFrOworCisJY2FzZSBNQVhJTV9SRVRfTk9BQ1RJT046CisJZGVmYXVsdDoKKwkJLyogRG8gbm90aGluZy4uKi8KKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IGFieDUwMF9jaGFyZ2FsZ19nZXRfZXh0X3BzeV9kYXRhKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3k7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqZXh0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJY29uc3QgY2hhciAqKnN1cHBsaWNhbnRzID0gKGNvbnN0IGNoYXIgKiopZXh0LT5zdXBwbGllZF90bzsKKwlzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaTsKKwl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCByZXQ7CisJaW50IGo7CisJYm9vbCBjYXBhY2l0eV91cGRhdGVkID0gZmFsc2U7CisKKwlwc3kgPSAoc3RydWN0IHBvd2VyX3N1cHBseSAqKWRhdGE7CisJZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKKwkvKiBGb3IgYWxsIHBzeSB3aGVyZSB0aGUgZHJpdmVyIG5hbWUgYXBwZWFycyBpbiBhbnkgc3VwcGxpZWRfdG8gKi8KKwlqID0gbWF0Y2hfc3RyaW5nKHN1cHBsaWNhbnRzLCBleHQtPm51bV9zdXBwbGljYW50cywgcHN5LT5kZXNjLT5uYW1lKTsKKwlpZiAoaiA8IDApCisJCXJldHVybiAwOworCisJLyoKKwkgKiAgSWYgZXh0ZXJuYWwgaXMgbm90IHJlZ2lzdGVyaW5nICdQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWScgdG8gaXRzCisJICogcHJvcGVydHkgYmVjYXVzZSBvZiBoYW5kbGluZyB0aGF0IHN5c2ZzIGVudHJ5IG9uIGl0cyBvd24sIHRoaXMgaXMKKwkgKiB0aGUgcGxhY2UgdG8gZ2V0IHRoZSBiYXR0ZXJ5IGNhcGFjaXR5LgorCSAqLworCWlmICghcG93ZXJfc3VwcGx5X2dldF9wcm9wZXJ0eShleHQsIFBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZLCAmcmV0KSkgeworCQlkaS0+YmF0dF9kYXRhLnBlcmNlbnQgPSByZXQuaW50dmFsOworCQljYXBhY2l0eV91cGRhdGVkID0gdHJ1ZTsKKwl9CisKKwkvKiBHbyB0aHJvdWdoIGFsbCBwcm9wZXJ0aWVzIGZvciB0aGUgcHN5ICovCisJZm9yIChqID0gMDsgaiA8IGV4dC0+ZGVzYy0+bnVtX3Byb3BlcnRpZXM7IGorKykgeworCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwcm9wOworCQlwcm9wID0gZXh0LT5kZXNjLT5wcm9wZXJ0aWVzW2pdOworCisJCS8qCisJCSAqIEluaXRpYWxpemUgY2hhcmdlcnMgaWYgbm90IGFscmVhZHkgZG9uZS4KKwkJICogVGhlIGFiODUwMF9jaGFyZ2VyKi8KKwkJaWYgKCFkaS0+YWNfY2hnICYmCisJCQlleHQtPmRlc2MtPnR5cGUgPT0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlMpCisJCQlkaS0+YWNfY2hnID0gcHN5X3RvX3V4NTAwX2NoYXJnZXIoZXh0KTsKKwkJZWxzZSBpZiAoIWRpLT51c2JfY2hnICYmCisJCQlleHQtPmRlc2MtPnR5cGUgPT0gUE9XRVJfU1VQUExZX1RZUEVfVVNCKQorCQkJZGktPnVzYl9jaGcgPSBwc3lfdG9fdXg1MDBfY2hhcmdlcihleHQpOworCisJCWlmIChwb3dlcl9zdXBwbHlfZ2V0X3Byb3BlcnR5KGV4dCwgcHJvcCwgJnJldCkpCisJCQljb250aW51ZTsKKwkJc3dpdGNoIChwcm9wKSB7CisJCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDoKKwkJCXN3aXRjaCAoZXh0LT5kZXNjLT50eXBlKSB7CisJCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk6CisJCQkJLyogQmF0dGVyeSBwcmVzZW50ICovCisJCQkJaWYgKHJldC5pbnR2YWwpCisJCQkJCWRpLT5ldmVudHMuYmF0dF9yZW0gPSBmYWxzZTsKKwkJCQkvKiBCYXR0ZXJ5IHJlbW92ZWQgKi8KKwkJCQllbHNlCisJCQkJCWRpLT5ldmVudHMuYmF0dF9yZW0gPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUzoKKwkJCQkvKiBBQyBkaXNjb25uZWN0ZWQgKi8KKwkJCQlpZiAoIXJldC5pbnR2YWwgJiYKKwkJCQkJKGRpLT5jaGdfaW5mby5jb25uX2NoZyAmIEFDX0NIRykpIHsKKwkJCQkJZGktPmNoZ19pbmZvLnByZXZfY29ubl9jaGcgPQorCQkJCQkJZGktPmNoZ19pbmZvLmNvbm5fY2hnOworCQkJCQlkaS0+Y2hnX2luZm8uY29ubl9jaGcgJj0gfkFDX0NIRzsKKwkJCQl9CisJCQkJLyogQUMgY29ubmVjdGVkICovCisJCQkJZWxzZSBpZiAocmV0LmludHZhbCAmJgorCQkJCQkhKGRpLT5jaGdfaW5mby5jb25uX2NoZyAmIEFDX0NIRykpIHsKKwkJCQkJZGktPmNoZ19pbmZvLnByZXZfY29ubl9jaGcgPQorCQkJCQkJZGktPmNoZ19pbmZvLmNvbm5fY2hnOworCQkJCQlkaS0+Y2hnX2luZm8uY29ubl9jaGcgfD0gQUNfQ0hHOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgUE9XRVJfU1VQUExZX1RZUEVfVVNCOgorCQkJCS8qIFVTQiBkaXNjb25uZWN0ZWQgKi8KKwkJCQlpZiAoIXJldC5pbnR2YWwgJiYKKwkJCQkJKGRpLT5jaGdfaW5mby5jb25uX2NoZyAmIFVTQl9DSEcpKSB7CisJCQkJCWRpLT5jaGdfaW5mby5wcmV2X2Nvbm5fY2hnID0KKwkJCQkJCWRpLT5jaGdfaW5mby5jb25uX2NoZzsKKwkJCQkJZGktPmNoZ19pbmZvLmNvbm5fY2hnICY9IH5VU0JfQ0hHOworCQkJCX0KKwkJCQkvKiBVU0IgY29ubmVjdGVkICovCisJCQkJZWxzZSBpZiAocmV0LmludHZhbCAmJgorCQkJCQkhKGRpLT5jaGdfaW5mby5jb25uX2NoZyAmIFVTQl9DSEcpKSB7CisJCQkJCWRpLT5jaGdfaW5mby5wcmV2X2Nvbm5fY2hnID0KKwkJCQkJCWRpLT5jaGdfaW5mby5jb25uX2NoZzsKKwkJCQkJZGktPmNoZ19pbmZvLmNvbm5fY2hnIHw9IFVTQl9DSEc7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FOgorCQkJc3dpdGNoIChleHQtPmRlc2MtPnR5cGUpIHsKKwkJCWNhc2UgUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWToKKwkJCQlicmVhazsKKwkJCWNhc2UgUE9XRVJfU1VQUExZX1RZUEVfTUFJTlM6CisJCQkJLyogQUMgb2ZmbGluZSAqLworCQkJCWlmICghcmV0LmludHZhbCAmJgorCQkJCQkoZGktPmNoZ19pbmZvLm9ubGluZV9jaGcgJiBBQ19DSEcpKSB7CisJCQkJCWRpLT5jaGdfaW5mby5wcmV2X29ubGluZV9jaGcgPQorCQkJCQkJZGktPmNoZ19pbmZvLm9ubGluZV9jaGc7CisJCQkJCWRpLT5jaGdfaW5mby5vbmxpbmVfY2hnICY9IH5BQ19DSEc7CisJCQkJfQorCQkJCS8qIEFDIG9ubGluZSAqLworCQkJCWVsc2UgaWYgKHJldC5pbnR2YWwgJiYKKwkJCQkJIShkaS0+Y2hnX2luZm8ub25saW5lX2NoZyAmIEFDX0NIRykpIHsKKwkJCQkJZGktPmNoZ19pbmZvLnByZXZfb25saW5lX2NoZyA9CisJCQkJCQlkaS0+Y2hnX2luZm8ub25saW5lX2NoZzsKKwkJCQkJZGktPmNoZ19pbmZvLm9ubGluZV9jaGcgfD0gQUNfQ0hHOworCQkJCQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmNoYXJnYWxnX3dxLAorCQkJCQkJJmRpLT5jaGFyZ2FsZ193ZF93b3JrLCAwKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX1VTQjoKKwkJCQkvKiBVU0Igb2ZmbGluZSAqLworCQkJCWlmICghcmV0LmludHZhbCAmJgorCQkJCQkoZGktPmNoZ19pbmZvLm9ubGluZV9jaGcgJiBVU0JfQ0hHKSkgeworCQkJCQlkaS0+Y2hnX2luZm8ucHJldl9vbmxpbmVfY2hnID0KKwkJCQkJCWRpLT5jaGdfaW5mby5vbmxpbmVfY2hnOworCQkJCQlkaS0+Y2hnX2luZm8ub25saW5lX2NoZyAmPSB+VVNCX0NIRzsKKwkJCQl9CisJCQkJLyogVVNCIG9ubGluZSAqLworCQkJCWVsc2UgaWYgKHJldC5pbnR2YWwgJiYKKwkJCQkJIShkaS0+Y2hnX2luZm8ub25saW5lX2NoZyAmIFVTQl9DSEcpKSB7CisJCQkJCWRpLT5jaGdfaW5mby5wcmV2X29ubGluZV9jaGcgPQorCQkJCQkJZGktPmNoZ19pbmZvLm9ubGluZV9jaGc7CisJCQkJCWRpLT5jaGdfaW5mby5vbmxpbmVfY2hnIHw9IFVTQl9DSEc7CisJCQkJCXF1ZXVlX2RlbGF5ZWRfd29yayhkaS0+Y2hhcmdhbGdfd3EsCisJCQkJCQkmZGktPmNoYXJnYWxnX3dkX3dvcmssIDApOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSDoKKwkJCXN3aXRjaCAoZXh0LT5kZXNjLT50eXBlKSB7CisJCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk6CisJCQkJYnJlYWs7CisJCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TOgorCQkJCXN3aXRjaCAocmV0LmludHZhbCkgeworCQkJCWNhc2UgUE9XRVJfU1VQUExZX0hFQUxUSF9VTlNQRUNfRkFJTFVSRToKKwkJCQkJZGktPmV2ZW50cy5tYWluZXh0Y2hub3RvayA9IHRydWU7CisJCQkJCWRpLT5ldmVudHMubWFpbl90aGVybWFsX3Byb3QgPSBmYWxzZTsKKwkJCQkJZGktPmV2ZW50cy5tYWluX292diA9IGZhbHNlOworCQkJCQlkaS0+ZXZlbnRzLmFjX3dkX2V4cGlyZWQgPSBmYWxzZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBQT1dFUl9TVVBQTFlfSEVBTFRIX0RFQUQ6CisJCQkJCWRpLT5ldmVudHMuYWNfd2RfZXhwaXJlZCA9IHRydWU7CisJCQkJCWRpLT5ldmVudHMubWFpbmV4dGNobm90b2sgPSBmYWxzZTsKKwkJCQkJZGktPmV2ZW50cy5tYWluX292diA9IGZhbHNlOworCQkJCQlkaS0+ZXZlbnRzLm1haW5fdGhlcm1hbF9wcm90ID0gZmFsc2U7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUE9XRVJfU1VQUExZX0hFQUxUSF9DT0xEOgorCQkJCWNhc2UgUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSSEVBVDoKKwkJCQkJZGktPmV2ZW50cy5tYWluX3RoZXJtYWxfcHJvdCA9IHRydWU7CisJCQkJCWRpLT5ldmVudHMubWFpbmV4dGNobm90b2sgPSBmYWxzZTsKKwkJCQkJZGktPmV2ZW50cy5tYWluX292diA9IGZhbHNlOworCQkJCQlkaS0+ZXZlbnRzLmFjX3dkX2V4cGlyZWQgPSBmYWxzZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJWT0xUQUdFOgorCQkJCQlkaS0+ZXZlbnRzLm1haW5fb3Z2ID0gdHJ1ZTsKKwkJCQkJZGktPmV2ZW50cy5tYWluZXh0Y2hub3RvayA9IGZhbHNlOworCQkJCQlkaS0+ZXZlbnRzLm1haW5fdGhlcm1hbF9wcm90ID0gZmFsc2U7CisJCQkJCWRpLT5ldmVudHMuYWNfd2RfZXhwaXJlZCA9IGZhbHNlOworCQkJCQlicmVhazsKKwkJCQljYXNlIFBPV0VSX1NVUFBMWV9IRUFMVEhfR09PRDoKKwkJCQkJZGktPmV2ZW50cy5tYWluX3RoZXJtYWxfcHJvdCA9IGZhbHNlOworCQkJCQlkaS0+ZXZlbnRzLm1haW5leHRjaG5vdG9rID0gZmFsc2U7CisJCQkJCWRpLT5ldmVudHMubWFpbl9vdnYgPSBmYWxzZTsKKwkJCQkJZGktPmV2ZW50cy5hY193ZF9leHBpcmVkID0gZmFsc2U7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBQT1dFUl9TVVBQTFlfVFlQRV9VU0I6CisJCQkJc3dpdGNoIChyZXQuaW50dmFsKSB7CisJCQkJY2FzZSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOU1BFQ19GQUlMVVJFOgorCQkJCQlkaS0+ZXZlbnRzLnVzYmNoYXJnZXJub3RvayA9IHRydWU7CisJCQkJCWRpLT5ldmVudHMudXNiX3RoZXJtYWxfcHJvdCA9IGZhbHNlOworCQkJCQlkaS0+ZXZlbnRzLnZidXNfb3Z2ID0gZmFsc2U7CisJCQkJCWRpLT5ldmVudHMudXNiX3dkX2V4cGlyZWQgPSBmYWxzZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBQT1dFUl9TVVBQTFlfSEVBTFRIX0RFQUQ6CisJCQkJCWRpLT5ldmVudHMudXNiX3dkX2V4cGlyZWQgPSB0cnVlOworCQkJCQlkaS0+ZXZlbnRzLnVzYmNoYXJnZXJub3RvayA9IGZhbHNlOworCQkJCQlkaS0+ZXZlbnRzLnVzYl90aGVybWFsX3Byb3QgPSBmYWxzZTsKKwkJCQkJZGktPmV2ZW50cy52YnVzX292diA9IGZhbHNlOworCQkJCQlicmVhazsKKwkJCQljYXNlIFBPV0VSX1NVUFBMWV9IRUFMVEhfQ09MRDoKKwkJCQljYXNlIFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUkhFQVQ6CisJCQkJCWRpLT5ldmVudHMudXNiX3RoZXJtYWxfcHJvdCA9IHRydWU7CisJCQkJCWRpLT5ldmVudHMudXNiY2hhcmdlcm5vdG9rID0gZmFsc2U7CisJCQkJCWRpLT5ldmVudHMudmJ1c19vdnYgPSBmYWxzZTsKKwkJCQkJZGktPmV2ZW50cy51c2Jfd2RfZXhwaXJlZCA9IGZhbHNlOworCQkJCQlicmVhazsKKwkJCQljYXNlIFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUlZPTFRBR0U6CisJCQkJCWRpLT5ldmVudHMudmJ1c19vdnYgPSB0cnVlOworCQkJCQlkaS0+ZXZlbnRzLnVzYmNoYXJnZXJub3RvayA9IGZhbHNlOworCQkJCQlkaS0+ZXZlbnRzLnVzYl90aGVybWFsX3Byb3QgPSBmYWxzZTsKKwkJCQkJZGktPmV2ZW50cy51c2Jfd2RfZXhwaXJlZCA9IGZhbHNlOworCQkJCQlicmVhazsKKwkJCQljYXNlIFBPV0VSX1NVUFBMWV9IRUFMVEhfR09PRDoKKwkJCQkJZGktPmV2ZW50cy51c2JjaGFyZ2Vybm90b2sgPSBmYWxzZTsKKwkJCQkJZGktPmV2ZW50cy51c2JfdGhlcm1hbF9wcm90ID0gZmFsc2U7CisJCQkJCWRpLT5ldmVudHMudmJ1c19vdnYgPSBmYWxzZTsKKwkJCQkJZGktPmV2ZW50cy51c2Jfd2RfZXhwaXJlZCA9IGZhbHNlOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCQl9CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKKwkJCXN3aXRjaCAoZXh0LT5kZXNjLT50eXBlKSB7CisJCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk6CisJCQkJZGktPmJhdHRfZGF0YS52b2x0ID0gcmV0LmludHZhbCAvIDEwMDA7CisJCQkJYnJlYWs7CisJCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TOgorCQkJCWRpLT5jaGdfaW5mby5hY192b2x0ID0gcmV0LmludHZhbCAvIDEwMDA7CisJCQkJYnJlYWs7CisJCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX1VTQjoKKwkJCQlkaS0+Y2hnX2luZm8udXNiX3ZvbHQgPSByZXQuaW50dmFsIC8gMTAwMDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfQVZHOgorCQkJc3dpdGNoIChleHQtPmRlc2MtPnR5cGUpIHsKKwkJCWNhc2UgUE9XRVJfU1VQUExZX1RZUEVfTUFJTlM6CisJCQkJLyogQVZHIGlzIHVzZWQgdG8gaW5kaWNhdGUgd2hlbiB3ZSBhcmUKKwkJCQkgKiBpbiBDViBtb2RlICovCisJCQkJaWYgKHJldC5pbnR2YWwpCisJCQkJCWRpLT5ldmVudHMuYWNfY3ZfYWN0aXZlID0gdHJ1ZTsKKwkJCQllbHNlCisJCQkJCWRpLT5ldmVudHMuYWNfY3ZfYWN0aXZlID0gZmFsc2U7CisKKwkJCQlicmVhazsKKwkJCWNhc2UgUE9XRVJfU1VQUExZX1RZUEVfVVNCOgorCQkJCS8qIEFWRyBpcyB1c2VkIHRvIGluZGljYXRlIHdoZW4gd2UgYXJlCisJCQkJICogaW4gQ1YgbW9kZSAqLworCQkJCWlmIChyZXQuaW50dmFsKQorCQkJCQlkaS0+ZXZlbnRzLnVzYl9jdl9hY3RpdmUgPSB0cnVlOworCQkJCWVsc2UKKwkJCQkJZGktPmV2ZW50cy51c2JfY3ZfYWN0aXZlID0gZmFsc2U7CisKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1k6CisJCQlzd2l0Y2ggKGV4dC0+ZGVzYy0+dHlwZSkgeworCQkJY2FzZSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOgorCQkJCWlmIChyZXQuaW50dmFsKQorCQkJCQlkaS0+ZXZlbnRzLmJhdHRfdW5rbm93biA9IGZhbHNlOworCQkJCWVsc2UKKwkJCQkJZGktPmV2ZW50cy5iYXR0X3Vua25vd24gPSB0cnVlOworCisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QOgorCQkJZGktPmJhdHRfZGF0YS50ZW1wID0gcmV0LmludHZhbCAvIDEwOworCQkJYnJlYWs7CisKKwkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVzoKKwkJCXN3aXRjaCAoZXh0LT5kZXNjLT50eXBlKSB7CisJCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TOgorCQkJCQlkaS0+Y2hnX2luZm8uYWNfY3VyciA9CisJCQkJCQlyZXQuaW50dmFsIC8gMTAwMDsKKwkJCQkJYnJlYWs7CisJCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX1VTQjoKKwkJCQkJZGktPmNoZ19pbmZvLnVzYl9jdXJyID0KKwkJCQkJCXJldC5pbnR2YWwgLyAxMDAwOworCQkJCWJyZWFrOworCQkJY2FzZSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOgorCQkJCWRpLT5iYXR0X2RhdGEuaW5zdF9jdXJyID0gcmV0LmludHZhbCAvIDEwMDA7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX0FWRzoKKwkJCXN3aXRjaCAoZXh0LT5kZXNjLT50eXBlKSB7CisJCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk6CisJCQkJZGktPmJhdHRfZGF0YS5hdmdfY3VyciA9IHJldC5pbnR2YWwgLyAxMDAwOworCQkJCWJyZWFrOworCQkJY2FzZSBQT1dFUl9TVVBQTFlfVFlQRV9VU0I6CisJCQkJaWYgKHJldC5pbnR2YWwpCisJCQkJCWRpLT5ldmVudHMudmJ1c19jb2xsYXBzZWQgPSB0cnVlOworCQkJCWVsc2UKKwkJCQkJZGktPmV2ZW50cy52YnVzX2NvbGxhcHNlZCA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZOgorCQkJaWYgKCFjYXBhY2l0eV91cGRhdGVkKQorCQkJCWRpLT5iYXR0X2RhdGEucGVyY2VudCA9IHJldC5pbnR2YWw7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIGFieDUwMF9jaGFyZ2FsZ19leHRlcm5hbF9wb3dlcl9jaGFuZ2VkKCkgLSBjYWxsYmFjayBmb3IgcG93ZXIgc3VwcGx5IGNoYW5nZXMKKyAqIEBwc3k6ICAgICAgIHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSBwb3dlcl9zdXBwbHkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBlbnRyeSBwb2ludCBvZiB0aGUgcG9pbnRlciBleHRlcm5hbF9wb3dlcl9jaGFuZ2VkCisgKiBvZiB0aGUgc3RydWN0dXJlIHBvd2VyX3N1cHBseS4KKyAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBleGVjdXRlZCB3aGVuIHRoZXJlIGlzIGEgY2hhbmdlIGluIGFueSBleHRlcm5hbCBwb3dlcgorICogc3VwcGx5IHRoYXQgdGhpcyBkcml2ZXIgbmVlZHMgdG8gYmUgbm90aWZpZWQgb2YuCisgKi8KK3N0YXRpYyB2b2lkIGFieDUwMF9jaGFyZ2FsZ19leHRlcm5hbF9wb3dlcl9jaGFuZ2VkKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSkKK3sKKwlzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOworCisJLyoKKwkgKiBUcmlnZ2VyIGV4ZWN1dGlvbiBvZiB0aGUgYWxnb3JpdGhtIGluc3RhbnRseSBhbmQgcmVhZAorCSAqIGFsbCBwb3dlcl9zdXBwbHkgcHJvcGVydGllcyB0aGVyZSBpbnN0ZWFkCisJICovCisJcXVldWVfd29yayhkaS0+Y2hhcmdhbGdfd3EsICZkaS0+Y2hhcmdhbGdfd29yayk7Cit9CisKKy8qKgorICogYWJ4NTAwX2NoYXJnYWxnX2FsZ29yaXRobSgpIC0gTWFpbiBmdW5jdGlvbiBmb3IgdGhlIGFsZ29yaXRobQorICogQGRpOgkJcG9pbnRlciB0byB0aGUgYWJ4NTAwX2NoYXJnYWxnIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgaXMgdGhlIG1haW4gY29udHJvbCBmdW5jdGlvbiBmb3IgdGhlIGNoYXJnaW5nIGFsZ29yaXRobS4KKyAqIEl0IGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkgb3Igd2hlbiBzb21ldGhpbmcgaGFwcGVucyB0aGF0IHdpbGwKKyAqIHRyaWdnZXIgYSBzdGF0ZSBjaGFuZ2UKKyAqLworc3RhdGljIHZvaWQgYWJ4NTAwX2NoYXJnYWxnX2FsZ29yaXRobShzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSkKK3sKKwlpbnQgY2hhcmdlcl9zdGF0dXM7CisJaW50IHJldDsKKwlpbnQgY3Vycl9zdGVwX2x2bDsKKworCS8qIENvbGxlY3QgZGF0YSBmcm9tIGFsbCBwb3dlcl9zdXBwbHkgY2xhc3MgZGV2aWNlcyAqLworCWNsYXNzX2Zvcl9lYWNoX2RldmljZShwb3dlcl9zdXBwbHlfY2xhc3MsIE5VTEwsCisJCWRpLT5jaGFyZ2FsZ19wc3ksIGFieDUwMF9jaGFyZ2FsZ19nZXRfZXh0X3BzeV9kYXRhKTsKKworCWFieDUwMF9jaGFyZ2FsZ19lbmRfb2ZfY2hhcmdlKGRpKTsKKwlhYng1MDBfY2hhcmdhbGdfY2hlY2tfdGVtcChkaSk7CisJYWJ4NTAwX2NoYXJnYWxnX2NoZWNrX2NoYXJnZXJfdm9sdGFnZShkaSk7CisKKwljaGFyZ2VyX3N0YXR1cyA9IGFieDUwMF9jaGFyZ2FsZ19jaGVja19jaGFyZ2VyX2Nvbm5lY3Rpb24oZGkpOworCWFieDUwMF9jaGFyZ2FsZ19jaGVja19jdXJyZW50X3N0ZXBfc3RhdHVzKGRpKTsKKworCWlmIChpc19hYjg1MDAoZGktPnBhcmVudCkpIHsKKwkJcmV0ID0gYWJ4NTAwX2NoYXJnYWxnX2NoZWNrX2NoYXJnZXJfZW5hYmxlKGRpKTsKKwkJaWYgKHJldCA8IDApCisJCQlkZXZfZXJyKGRpLT5kZXYsICJDaGVja2luZyBjaGFyZ2VyIGlzIGVuYWJsZWQgZXJyb3IiCisJCQkJCSI6IFJldHVybmVkIFZhbHVlICVkXG4iLCByZXQpOworCX0KKworCS8qCisJICogRmlyc3QgY2hlY2sgaWYgd2UgaGF2ZSBhIGNoYXJnZXIgY29ubmVjdGVkLgorCSAqIEFsc28gd2UgZG9uJ3QgYWxsb3cgY2hhcmdpbmcgb2YgdW5rbm93biBiYXR0ZXJpZXMgaWYgY29uZmlndXJlZAorCSAqIHRoaXMgd2F5CisJICovCisJaWYgKCFjaGFyZ2VyX3N0YXR1cyB8fAorCQkoZGktPmV2ZW50cy5iYXR0X3Vua25vd24gJiYgIWRpLT5ibS0+Y2hnX3Vua25vd25fYmF0KSkgeworCQlpZiAoZGktPmNoYXJnZV9zdGF0ZSAhPSBTVEFURV9IQU5ESEVMRCkgeworCQkJZGktPmV2ZW50cy5zYWZldHlfdGltZXJfZXhwaXJlZCA9IGZhbHNlOworCQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9IQU5ESEVMRF9JTklUKTsKKwkJfQorCX0KKworCS8qIElmIHN1c3BlbmRlZCwgd2Ugc2hvdWxkIG5vdCBjb250aW51ZSBjaGVja2luZyB0aGUgZmxhZ3MgKi8KKwllbHNlIGlmIChkaS0+Y2hhcmdlX3N0YXRlID09IFNUQVRFX1NVU1BFTkRFRF9JTklUIHx8CisJCWRpLT5jaGFyZ2Vfc3RhdGUgPT0gU1RBVEVfU1VTUEVOREVEKSB7CisJCS8qIFdlIGRvbid0IGRvIGFueXRoaW5nIGhlcmUsIGp1c3QgZG9uLHQgY29udGludWUgKi8KKwl9CisKKwkvKiBTYWZldHkgdGltZXIgZXhwaXJhdGlvbiAqLworCWVsc2UgaWYgKGRpLT5ldmVudHMuc2FmZXR5X3RpbWVyX2V4cGlyZWQpIHsKKwkJaWYgKGRpLT5jaGFyZ2Vfc3RhdGUgIT0gU1RBVEVfU0FGRVRZX1RJTUVSX0VYUElSRUQpCisJCQlhYng1MDBfY2hhcmdhbGdfc3RhdGVfdG8oZGksCisJCQkJU1RBVEVfU0FGRVRZX1RJTUVSX0VYUElSRURfSU5JVCk7CisJfQorCS8qCisJICogQ2hlY2sgaWYgYW55IGludGVycnVwdHMgaGFzIG9jY3VyZWQKKwkgKiB0aGF0IHdpbGwgcHJldmVudCB1cyBmcm9tIGNoYXJnaW5nCisJICovCisKKwkvKiBCYXR0ZXJ5IHJlbW92ZWQgKi8KKwllbHNlIGlmIChkaS0+ZXZlbnRzLmJhdHRfcmVtKSB7CisJCWlmIChkaS0+Y2hhcmdlX3N0YXRlICE9IFNUQVRFX0JBVFRfUkVNT1ZFRCkKKwkJCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfQkFUVF9SRU1PVkVEX0lOSVQpOworCX0KKwkvKiBNYWluIG9yIFVTQiBjaGFyZ2VyIG5vdCBvay4gKi8KKwllbHNlIGlmIChkaS0+ZXZlbnRzLm1haW5leHRjaG5vdG9rIHx8IGRpLT5ldmVudHMudXNiY2hhcmdlcm5vdG9rKSB7CisJCS8qCisJCSAqIElmIHZidXNfY29sbGFwc2VkIGlzIHNldCwgd2UgaGF2ZSB0byBsb3dlciB0aGUgY2hhcmdlcgorCQkgKiBjdXJyZW50LCB3aGljaCBpcyBkb25lIGluIHRoZSBub3JtYWwgc3RhdGUgYmVsb3cKKwkJICovCisJCWlmIChkaS0+Y2hhcmdlX3N0YXRlICE9IFNUQVRFX0NIR19OT1RfT0sgJiYKKwkJCQkhZGktPmV2ZW50cy52YnVzX2NvbGxhcHNlZCkKKwkJCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfQ0hHX05PVF9PS19JTklUKTsKKwl9CisJLyogVkJVUywgTWFpbiBvciBWQkFUIE9WVi4gKi8KKwllbHNlIGlmIChkaS0+ZXZlbnRzLnZidXNfb3Z2IHx8CisJCQlkaS0+ZXZlbnRzLm1haW5fb3Z2IHx8CisJCQlkaS0+ZXZlbnRzLmJhdHRfb3Z2IHx8CisJCQkhZGktPmNoZ19pbmZvLnVzYl9jaGdfb2sgfHwKKwkJCSFkaS0+Y2hnX2luZm8uYWNfY2hnX29rKSB7CisJCWlmIChkaS0+Y2hhcmdlX3N0YXRlICE9IFNUQVRFX09WVl9QUk9URUNUKQorCQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9PVlZfUFJPVEVDVF9JTklUKTsKKwl9CisJLyogVVNCIFRoZXJtYWwsIHN0b3AgY2hhcmdpbmcgKi8KKwllbHNlIGlmIChkaS0+ZXZlbnRzLm1haW5fdGhlcm1hbF9wcm90IHx8CisJCWRpLT5ldmVudHMudXNiX3RoZXJtYWxfcHJvdCkgeworCQlpZiAoZGktPmNoYXJnZV9zdGF0ZSAhPSBTVEFURV9IV19URU1QX1BST1RFQ1QpCisJCQlhYng1MDBfY2hhcmdhbGdfc3RhdGVfdG8oZGksCisJCQkJU1RBVEVfSFdfVEVNUF9QUk9URUNUX0lOSVQpOworCX0KKwkvKiBCYXR0ZXJ5IHRlbXAgb3Zlci91bmRlciAqLworCWVsc2UgaWYgKGRpLT5ldmVudHMuYnRlbXBfdW5kZXJvdmVyKSB7CisJCWlmIChkaS0+Y2hhcmdlX3N0YXRlICE9IFNUQVRFX1RFTVBfVU5ERVJPVkVSKQorCQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLAorCQkJCVNUQVRFX1RFTVBfVU5ERVJPVkVSX0lOSVQpOworCX0KKwkvKiBXYXRjaGRvZyBleHBpcmVkICovCisJZWxzZSBpZiAoZGktPmV2ZW50cy5hY193ZF9leHBpcmVkIHx8CisJCWRpLT5ldmVudHMudXNiX3dkX2V4cGlyZWQpIHsKKwkJaWYgKGRpLT5jaGFyZ2Vfc3RhdGUgIT0gU1RBVEVfV0RfRVhQSVJFRCkKKwkJCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfV0RfRVhQSVJFRF9JTklUKTsKKwl9CisJLyogQmF0dGVyeSB0ZW1wIGhpZ2gvbG93ICovCisJZWxzZSBpZiAoZGktPmV2ZW50cy5idGVtcF9sb3doaWdoKSB7CisJCWlmIChkaS0+Y2hhcmdlX3N0YXRlICE9IFNUQVRFX1RFTVBfTE9XSElHSCkKKwkJCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfVEVNUF9MT1dISUdIX0lOSVQpOworCX0KKworCWRldl9kYmcoZGktPmRldiwKKwkJIltDSEFSR0FMR10gVmIgJWQgSWJfYXZnICVkIEliX2luc3QgJWQgVGIgJWQgQ2FwICVkIE1haW50ICVkICIKKwkJIlN0YXRlICVzIEFjdGl2ZV9jaGcgJWQgQ2hnX3N0YXR1cyAlZCBBQyAlZCBVU0IgJWQgIgorCQkiQUNfb25saW5lICVkIFVTQl9vbmxpbmUgJWQgQUNfQ1YgJWQgVVNCX0NWICVkIEFDX0kgJWQgIgorCQkiVVNCX0kgJWQgQUNfVnNldCAlZCBBQ19Jc2V0ICVkIFVTQl9Wc2V0ICVkIFVTQl9Jc2V0ICVkXG4iLAorCQlkaS0+YmF0dF9kYXRhLnZvbHQsCisJCWRpLT5iYXR0X2RhdGEuYXZnX2N1cnIsCisJCWRpLT5iYXR0X2RhdGEuaW5zdF9jdXJyLAorCQlkaS0+YmF0dF9kYXRhLnRlbXAsCisJCWRpLT5iYXR0X2RhdGEucGVyY2VudCwKKwkJZGktPm1haW50ZW5hbmNlX2NoZywKKwkJc3RhdGVzW2RpLT5jaGFyZ2Vfc3RhdGVdLAorCQlkaS0+Y2hnX2luZm8uY2hhcmdlcl90eXBlLAorCQlkaS0+Y2hhcmdlX3N0YXR1cywKKwkJZGktPmNoZ19pbmZvLmNvbm5fY2hnICYgQUNfQ0hHLAorCQlkaS0+Y2hnX2luZm8uY29ubl9jaGcgJiBVU0JfQ0hHLAorCQlkaS0+Y2hnX2luZm8ub25saW5lX2NoZyAmIEFDX0NIRywKKwkJZGktPmNoZ19pbmZvLm9ubGluZV9jaGcgJiBVU0JfQ0hHLAorCQlkaS0+ZXZlbnRzLmFjX2N2X2FjdGl2ZSwKKwkJZGktPmV2ZW50cy51c2JfY3ZfYWN0aXZlLAorCQlkaS0+Y2hnX2luZm8uYWNfY3VyciwKKwkJZGktPmNoZ19pbmZvLnVzYl9jdXJyLAorCQlkaS0+Y2hnX2luZm8uYWNfdnNldCwKKwkJZGktPmNoZ19pbmZvLmFjX2lzZXQsCisJCWRpLT5jaGdfaW5mby51c2JfdnNldCwKKwkJZGktPmNoZ19pbmZvLnVzYl9pc2V0KTsKKworCXN3aXRjaCAoZGktPmNoYXJnZV9zdGF0ZSkgeworCWNhc2UgU1RBVEVfSEFOREhFTERfSU5JVDoKKwkJYWJ4NTAwX2NoYXJnYWxnX3N0b3BfY2hhcmdpbmcoZGkpOworCQlkaS0+Y2hhcmdlX3N0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkc7CisJCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfSEFOREhFTEQpOworCQkvKiBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLworCisJY2FzZSBTVEFURV9IQU5ESEVMRDoKKwkJYnJlYWs7CisKKwljYXNlIFNUQVRFX1NVU1BFTkRFRF9JTklUOgorCQlpZiAoZGktPnN1c3Bfc3RhdHVzLmFjX3N1c3BlbmRlZCkKKwkJCWFieDUwMF9jaGFyZ2FsZ19hY19lbihkaSwgZmFsc2UsIDAsIDApOworCQlpZiAoZGktPnN1c3Bfc3RhdHVzLnVzYl9zdXNwZW5kZWQpCisJCQlhYng1MDBfY2hhcmdhbGdfdXNiX2VuKGRpLCBmYWxzZSwgMCwgMCk7CisJCWFieDUwMF9jaGFyZ2FsZ19zdG9wX3NhZmV0eV90aW1lcihkaSk7CisJCWFieDUwMF9jaGFyZ2FsZ19zdG9wX21haW50ZW5hbmNlX3RpbWVyKGRpKTsKKwkJZGktPmNoYXJnZV9zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX05PVF9DSEFSR0lORzsKKwkJZGktPm1haW50ZW5hbmNlX2NoZyA9IGZhbHNlOworCQlhYng1MDBfY2hhcmdhbGdfc3RhdGVfdG8oZGksIFNUQVRFX1NVU1BFTkRFRCk7CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5jaGFyZ2FsZ19wc3kpOworCQkvKiBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLworCisJY2FzZSBTVEFURV9TVVNQRU5ERUQ6CisJCS8qIENIQVJHSU5HIGlzIHN1c3BlbmRlZCAqLworCQlicmVhazsKKworCWNhc2UgU1RBVEVfQkFUVF9SRU1PVkVEX0lOSVQ6CisJCWFieDUwMF9jaGFyZ2FsZ19zdG9wX2NoYXJnaW5nKGRpKTsKKwkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9CQVRUX1JFTU9WRUQpOworCQkvKiBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLworCisJY2FzZSBTVEFURV9CQVRUX1JFTU9WRUQ6CisJCWlmICghZGktPmV2ZW50cy5iYXR0X3JlbSkKKwkJCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfTk9STUFMX0lOSVQpOworCQlicmVhazsKKworCWNhc2UgU1RBVEVfSFdfVEVNUF9QUk9URUNUX0lOSVQ6CisJCWFieDUwMF9jaGFyZ2FsZ19zdG9wX2NoYXJnaW5nKGRpKTsKKwkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9IV19URU1QX1BST1RFQ1QpOworCQkvKiBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLworCisJY2FzZSBTVEFURV9IV19URU1QX1BST1RFQ1Q6CisJCWlmICghZGktPmV2ZW50cy5tYWluX3RoZXJtYWxfcHJvdCAmJgorCQkJCSFkaS0+ZXZlbnRzLnVzYl90aGVybWFsX3Byb3QpCisJCQlhYng1MDBfY2hhcmdhbGdfc3RhdGVfdG8oZGksIFNUQVRFX05PUk1BTF9JTklUKTsKKwkJYnJlYWs7CisKKwljYXNlIFNUQVRFX09WVl9QUk9URUNUX0lOSVQ6CisJCWFieDUwMF9jaGFyZ2FsZ19zdG9wX2NoYXJnaW5nKGRpKTsKKwkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9PVlZfUFJPVEVDVCk7CisJCS8qIEludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCisKKwljYXNlIFNUQVRFX09WVl9QUk9URUNUOgorCQlpZiAoIWRpLT5ldmVudHMudmJ1c19vdnYgJiYKKwkJCQkhZGktPmV2ZW50cy5tYWluX292diAmJgorCQkJCSFkaS0+ZXZlbnRzLmJhdHRfb3Z2ICYmCisJCQkJZGktPmNoZ19pbmZvLnVzYl9jaGdfb2sgJiYKKwkJCQlkaS0+Y2hnX2luZm8uYWNfY2hnX29rKQorCQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9OT1JNQUxfSU5JVCk7CisJCWJyZWFrOworCisJY2FzZSBTVEFURV9DSEdfTk9UX09LX0lOSVQ6CisJCWFieDUwMF9jaGFyZ2FsZ19zdG9wX2NoYXJnaW5nKGRpKTsKKwkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9DSEdfTk9UX09LKTsKKwkJLyogSW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KKworCWNhc2UgU1RBVEVfQ0hHX05PVF9PSzoKKwkJaWYgKCFkaS0+ZXZlbnRzLm1haW5leHRjaG5vdG9rICYmCisJCQkJIWRpLT5ldmVudHMudXNiY2hhcmdlcm5vdG9rKQorCQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9OT1JNQUxfSU5JVCk7CisJCWJyZWFrOworCisJY2FzZSBTVEFURV9TQUZFVFlfVElNRVJfRVhQSVJFRF9JTklUOgorCQlhYng1MDBfY2hhcmdhbGdfc3RvcF9jaGFyZ2luZyhkaSk7CisJCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfU0FGRVRZX1RJTUVSX0VYUElSRUQpOworCQkvKiBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLworCisJY2FzZSBTVEFURV9TQUZFVFlfVElNRVJfRVhQSVJFRDoKKwkJLyogV2UgZXhpdCB0aGlzIHN0YXRlIHdoZW4gY2hhcmdlciBpcyByZW1vdmVkICovCisJCWJyZWFrOworCisJY2FzZSBTVEFURV9OT1JNQUxfSU5JVDoKKwkJaWYgKChkaS0+Y2hnX2luZm8uY2hhcmdlcl90eXBlICYgVVNCX0NIRykgJiYKKwkJCQlkaS0+dXNiX2NoZy0+cG93ZXJfcGF0aCkgeworCQkJaWYgKGRpLT5iYXR0X2RhdGEudm9sdCA+CisJCQkgICAgKGRpLT5ibS0+ZmdfcGFyYW1zLT5sb3diYXRfdGhyZXNob2xkICsKKwkJCSAgICAgQkFUX1BMVVNfTUFSR0lOKSkgeworCQkJCWFiODU0MF9jaGFyZ2FsZ191c2JfcHJlX2NoZ19lbihkaSwgZmFsc2UpOworCQkJCWFiODU0MF9jaGFyZ2FsZ191c2JfcHBfZW4oZGksIGZhbHNlKTsKKwkJCX0gZWxzZSB7CisJCQkJYWI4NTQwX2NoYXJnYWxnX3VzYl9wcF9lbihkaSwgdHJ1ZSk7CisJCQkJYWI4NTQwX2NoYXJnYWxnX3VzYl9wcmVfY2hnX2VuKGRpLCB0cnVlKTsKKwkJCQlhYng1MDBfY2hhcmdhbGdfc3RhdGVfdG8oZGksCisJCQkJCVNUQVRFX1VTQl9QUF9QUkVfQ0hBUkdFKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChkaS0+Y3Vycl9zdGF0dXMuY3Vycl9zdGVwID09IENIQVJHQUxHX0NVUlJfU1RFUF9MT1cpCisJCQlhYng1MDBfY2hhcmdhbGdfc3RvcF9jaGFyZ2luZyhkaSk7CisJCWVsc2UgeworCQkJY3Vycl9zdGVwX2x2bCA9IGRpLT5ibS0+YmF0X3R5cGVbCisJCQkJZGktPmJtLT5iYXR0X2lkXS5ub3JtYWxfY3VyX2x2bAorCQkJCSogZGktPmN1cnJfc3RhdHVzLmN1cnJfc3RlcAorCQkJCS8gQ0hBUkdBTEdfQ1VSUl9TVEVQX0hJR0g7CisJCQlhYng1MDBfY2hhcmdhbGdfc3RhcnRfY2hhcmdpbmcoZGksCisJCQkJZGktPmJtLT5iYXRfdHlwZVtkaS0+Ym0tPmJhdHRfaWRdCisJCQkJLm5vcm1hbF92b2xfbHZsLCBjdXJyX3N0ZXBfbHZsKTsKKwkJfQorCisJCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfTk9STUFMKTsKKwkJYWJ4NTAwX2NoYXJnYWxnX3N0YXJ0X3NhZmV0eV90aW1lcihkaSk7CisJCWFieDUwMF9jaGFyZ2FsZ19zdG9wX21haW50ZW5hbmNlX3RpbWVyKGRpKTsKKwkJaW5pdF9tYXhpbV9jaGdfY3VycihkaSk7CisJCWRpLT5jaGFyZ2Vfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKKwkJZGktPmVvY19jbnQgPSAwOworCQlkaS0+bWFpbnRlbmFuY2VfY2hnID0gZmFsc2U7CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5jaGFyZ2FsZ19wc3kpOworCisJCWJyZWFrOworCisJY2FzZSBTVEFURV9VU0JfUFBfUFJFX0NIQVJHRToKKwkJaWYgKGRpLT5iYXR0X2RhdGEudm9sdCA+CisJCQkoZGktPmJtLT5mZ19wYXJhbXMtPmxvd2JhdF90aHJlc2hvbGQgKworCQkJQkFUX1BMVVNfTUFSR0lOKSkKKwkJCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfTk9STUFMX0lOSVQpOworCQlicmVhazsKKworCWNhc2UgU1RBVEVfTk9STUFMOgorCQloYW5kbGVfbWF4aW1fY2hnX2N1cnIoZGkpOworCQlpZiAoZGktPmNoYXJnZV9zdGF0dXMgPT0gUE9XRVJfU1VQUExZX1NUQVRVU19GVUxMICYmCisJCQlkaS0+bWFpbnRlbmFuY2VfY2hnKSB7CisJCQlpZiAoZGktPmJtLT5ub19tYWludGVuYW5jZSkKKwkJCQlhYng1MDBfY2hhcmdhbGdfc3RhdGVfdG8oZGksCisJCQkJCVNUQVRFX1dBSVRfRk9SX1JFQ0hBUkdFX0lOSVQpOworCQkJZWxzZQorCQkJCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwKKwkJCQkJU1RBVEVfTUFJTlRFTkFOQ0VfQV9JTklUKTsKKwkJfQorCQlicmVhazsKKworCS8qIFRoaXMgc3RhdGUgd2lsbCBiZSB1c2VkIHdoZW4gdGhlIG1haW50ZW5hbmNlIHN0YXRlIGlzIGRpc2FibGVkICovCisJY2FzZSBTVEFURV9XQUlUX0ZPUl9SRUNIQVJHRV9JTklUOgorCQlhYng1MDBfY2hhcmdhbGdfaG9sZF9jaGFyZ2luZyhkaSk7CisJCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfV0FJVF9GT1JfUkVDSEFSR0UpOworCQkvKiBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLworCisJY2FzZSBTVEFURV9XQUlUX0ZPUl9SRUNIQVJHRToKKwkJaWYgKGRpLT5iYXR0X2RhdGEucGVyY2VudCA8PQorCQkgICAgZGktPmJtLT5iYXRfdHlwZVtkaS0+Ym0tPmJhdHRfaWRdLgorCQkgICAgcmVjaGFyZ2VfY2FwKQorCQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9OT1JNQUxfSU5JVCk7CisJCWJyZWFrOworCisJY2FzZSBTVEFURV9NQUlOVEVOQU5DRV9BX0lOSVQ6CisJCWFieDUwMF9jaGFyZ2FsZ19zdG9wX3NhZmV0eV90aW1lcihkaSk7CisJCWFieDUwMF9jaGFyZ2FsZ19zdGFydF9tYWludGVuYW5jZV90aW1lcihkaSwKKwkJCWRpLT5ibS0+YmF0X3R5cGVbCisJCQkJZGktPmJtLT5iYXR0X2lkXS5tYWludF9hX2NoZ190aW1lcl9oKTsKKwkJYWJ4NTAwX2NoYXJnYWxnX3N0YXJ0X2NoYXJnaW5nKGRpLAorCQkJZGktPmJtLT5iYXRfdHlwZVsKKwkJCQlkaS0+Ym0tPmJhdHRfaWRdLm1haW50X2Ffdm9sX2x2bCwKKwkJCWRpLT5ibS0+YmF0X3R5cGVbCisJCQkJZGktPmJtLT5iYXR0X2lkXS5tYWludF9hX2N1cl9sdmwpOworCQlhYng1MDBfY2hhcmdhbGdfc3RhdGVfdG8oZGksIFNUQVRFX01BSU5URU5BTkNFX0EpOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChkaS0+Y2hhcmdhbGdfcHN5KTsKKwkJLyogSW50ZW50aW9uYWwgZmFsbHRocm91Z2gqLworCisJY2FzZSBTVEFURV9NQUlOVEVOQU5DRV9BOgorCQlpZiAoZGktPmV2ZW50cy5tYWludGVuYW5jZV90aW1lcl9leHBpcmVkKSB7CisJCQlhYng1MDBfY2hhcmdhbGdfc3RvcF9tYWludGVuYW5jZV90aW1lcihkaSk7CisJCQlhYng1MDBfY2hhcmdhbGdfc3RhdGVfdG8oZGksIFNUQVRFX01BSU5URU5BTkNFX0JfSU5JVCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNUQVRFX01BSU5URU5BTkNFX0JfSU5JVDoKKwkJYWJ4NTAwX2NoYXJnYWxnX3N0YXJ0X21haW50ZW5hbmNlX3RpbWVyKGRpLAorCQkJZGktPmJtLT5iYXRfdHlwZVsKKwkJCQlkaS0+Ym0tPmJhdHRfaWRdLm1haW50X2JfY2hnX3RpbWVyX2gpOworCQlhYng1MDBfY2hhcmdhbGdfc3RhcnRfY2hhcmdpbmcoZGksCisJCQlkaS0+Ym0tPmJhdF90eXBlWworCQkJCWRpLT5ibS0+YmF0dF9pZF0ubWFpbnRfYl92b2xfbHZsLAorCQkJZGktPmJtLT5iYXRfdHlwZVsKKwkJCQlkaS0+Ym0tPmJhdHRfaWRdLm1haW50X2JfY3VyX2x2bCk7CisJCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfTUFJTlRFTkFOQ0VfQik7CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5jaGFyZ2FsZ19wc3kpOworCQkvKiBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCovCisKKwljYXNlIFNUQVRFX01BSU5URU5BTkNFX0I6CisJCWlmIChkaS0+ZXZlbnRzLm1haW50ZW5hbmNlX3RpbWVyX2V4cGlyZWQpIHsKKwkJCWFieDUwMF9jaGFyZ2FsZ19zdG9wX21haW50ZW5hbmNlX3RpbWVyKGRpKTsKKwkJCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfTk9STUFMX0lOSVQpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTVEFURV9URU1QX0xPV0hJR0hfSU5JVDoKKwkJYWJ4NTAwX2NoYXJnYWxnX3N0YXJ0X2NoYXJnaW5nKGRpLAorCQkJZGktPmJtLT5iYXRfdHlwZVsKKwkJCQlkaS0+Ym0tPmJhdHRfaWRdLmxvd19oaWdoX3ZvbF9sdmwsCisJCQlkaS0+Ym0tPmJhdF90eXBlWworCQkJCWRpLT5ibS0+YmF0dF9pZF0ubG93X2hpZ2hfY3VyX2x2bCk7CisJCWFieDUwMF9jaGFyZ2FsZ19zdG9wX21haW50ZW5hbmNlX3RpbWVyKGRpKTsKKwkJZGktPmNoYXJnZV9zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOworCQlhYng1MDBfY2hhcmdhbGdfc3RhdGVfdG8oZGksIFNUQVRFX1RFTVBfTE9XSElHSCk7CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5jaGFyZ2FsZ19wc3kpOworCQkvKiBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLworCisJY2FzZSBTVEFURV9URU1QX0xPV0hJR0g6CisJCWlmICghZGktPmV2ZW50cy5idGVtcF9sb3doaWdoKQorCQkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9OT1JNQUxfSU5JVCk7CisJCWJyZWFrOworCisJY2FzZSBTVEFURV9XRF9FWFBJUkVEX0lOSVQ6CisJCWFieDUwMF9jaGFyZ2FsZ19zdG9wX2NoYXJnaW5nKGRpKTsKKwkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9XRF9FWFBJUkVEKTsKKwkJLyogSW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KKworCWNhc2UgU1RBVEVfV0RfRVhQSVJFRDoKKwkJaWYgKCFkaS0+ZXZlbnRzLmFjX3dkX2V4cGlyZWQgJiYKKwkJCQkhZGktPmV2ZW50cy51c2Jfd2RfZXhwaXJlZCkKKwkJCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfTk9STUFMX0lOSVQpOworCQlicmVhazsKKworCWNhc2UgU1RBVEVfVEVNUF9VTkRFUk9WRVJfSU5JVDoKKwkJYWJ4NTAwX2NoYXJnYWxnX3N0b3BfY2hhcmdpbmcoZGkpOworCQlhYng1MDBfY2hhcmdhbGdfc3RhdGVfdG8oZGksIFNUQVRFX1RFTVBfVU5ERVJPVkVSKTsKKwkJLyogSW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KKworCWNhc2UgU1RBVEVfVEVNUF9VTkRFUk9WRVI6CisJCWlmICghZGktPmV2ZW50cy5idGVtcF91bmRlcm92ZXIpCisJCQlhYng1MDBfY2hhcmdhbGdfc3RhdGVfdG8oZGksIFNUQVRFX05PUk1BTF9JTklUKTsKKwkJYnJlYWs7CisJfQorCisJLyogU3RhcnQgY2hhcmdpbmcgZGlyZWN0bHkgaWYgdGhlIG5ldyBzdGF0ZSBpcyBhIGNoYXJnZSBzdGF0ZSAqLworCWlmIChkaS0+Y2hhcmdlX3N0YXRlID09IFNUQVRFX05PUk1BTF9JTklUIHx8CisJCQlkaS0+Y2hhcmdlX3N0YXRlID09IFNUQVRFX01BSU5URU5BTkNFX0FfSU5JVCB8fAorCQkJZGktPmNoYXJnZV9zdGF0ZSA9PSBTVEFURV9NQUlOVEVOQU5DRV9CX0lOSVQpCisJCXF1ZXVlX3dvcmsoZGktPmNoYXJnYWxnX3dxLCAmZGktPmNoYXJnYWxnX3dvcmspOworfQorCisvKioKKyAqIGFieDUwMF9jaGFyZ2FsZ19wZXJpb2RpY193b3JrKCkgLSBQZXJpb2RpYyB3b3JrIGZvciB0aGUgYWxnb3JpdGhtCisgKiBAd29yazoJcG9pbnRlciB0byB0aGUgd29ya19zdHJ1Y3Qgc3RydWN0dXJlCisgKgorICogV29yayBxdWV1ZSBmdW5jdGlvbiBmb3IgdGhlIGNoYXJnaW5nIGFsZ29yaXRobQorICovCitzdGF0aWMgdm9pZCBhYng1MDBfY2hhcmdhbGdfcGVyaW9kaWNfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGkgPSBjb250YWluZXJfb2Yod29yaywKKwkJc3RydWN0IGFieDUwMF9jaGFyZ2FsZywgY2hhcmdhbGdfcGVyaW9kaWNfd29yay53b3JrKTsKKworCWFieDUwMF9jaGFyZ2FsZ19hbGdvcml0aG0oZGkpOworCisJLyoKKwkgKiBJZiBhIGNoYXJnZXIgaXMgY29ubmVjdGVkIHRoZW4gdGhlIGJhdHRlcnkgaGFzIHRvIGJlIG1vbml0b3JlZAorCSAqIGZyZXF1ZW50bHksIGVsc2UgdGhlIHdvcmsgY2FuIGJlIGRlbGF5ZWQuCisJICovCisJaWYgKGRpLT5jaGdfaW5mby5jb25uX2NoZykKKwkJcXVldWVfZGVsYXllZF93b3JrKGRpLT5jaGFyZ2FsZ193cSwKKwkJCSZkaS0+Y2hhcmdhbGdfcGVyaW9kaWNfd29yaywKKwkJCWRpLT5ibS0+aW50ZXJ2YWxfY2hhcmdpbmcgKiBIWik7CisJZWxzZQorCQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmNoYXJnYWxnX3dxLAorCQkJJmRpLT5jaGFyZ2FsZ19wZXJpb2RpY193b3JrLAorCQkJZGktPmJtLT5pbnRlcnZhbF9ub3RfY2hhcmdpbmcgKiBIWik7Cit9CisKKy8qKgorICogYWJ4NTAwX2NoYXJnYWxnX3dkX3dvcmsoKSAtIHBlcmlvZGljIHdvcmsgdG8ga2ljayB0aGUgY2hhcmdlciB3YXRjaGRvZworICogQHdvcms6CXBvaW50ZXIgdG8gdGhlIHdvcmtfc3RydWN0IHN0cnVjdHVyZQorICoKKyAqIFdvcmsgcXVldWUgZnVuY3Rpb24gZm9yIGtpY2tpbmcgdGhlIGNoYXJnZXIgd2F0Y2hkb2cKKyAqLworc3RhdGljIHZvaWQgYWJ4NTAwX2NoYXJnYWxnX3dkX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWludCByZXQ7CisJc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGkgPSBjb250YWluZXJfb2Yod29yaywKKwkJc3RydWN0IGFieDUwMF9jaGFyZ2FsZywgY2hhcmdhbGdfd2Rfd29yay53b3JrKTsKKworCWRldl9kYmcoZGktPmRldiwgImFieDUwMF9jaGFyZ2FsZ193ZF93b3JrXG4iKTsKKworCXJldCA9IGFieDUwMF9jaGFyZ2FsZ19raWNrX3dhdGNoZG9nKGRpKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIGtpY2sgd2F0Y2hkb2dcbiIpOworCisJcXVldWVfZGVsYXllZF93b3JrKGRpLT5jaGFyZ2FsZ193cSwKKwkJJmRpLT5jaGFyZ2FsZ193ZF93b3JrLCBDSEdfV0RfSU5URVJWQUwpOworfQorCisvKioKKyAqIGFieDUwMF9jaGFyZ2FsZ193b3JrKCkgLSBXb3JrIHRvIHJ1biB0aGUgY2hhcmdpbmcgYWxnb3JpdGhtIGluc3RhbnRseQorICogQHdvcms6CXBvaW50ZXIgdG8gdGhlIHdvcmtfc3RydWN0IHN0cnVjdHVyZQorICoKKyAqIFdvcmsgcXVldWUgZnVuY3Rpb24gZm9yIGNhbGxpbmcgdGhlIGNoYXJnaW5nIGFsZ29yaXRobQorICovCitzdGF0aWMgdm9pZCBhYng1MDBfY2hhcmdhbGdfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGkgPSBjb250YWluZXJfb2Yod29yaywKKwkJc3RydWN0IGFieDUwMF9jaGFyZ2FsZywgY2hhcmdhbGdfd29yayk7CisKKwlhYng1MDBfY2hhcmdhbGdfYWxnb3JpdGhtKGRpKTsKK30KKworLyoqCisgKiBhYng1MDBfY2hhcmdhbGdfZ2V0X3Byb3BlcnR5KCkgLSBnZXQgdGhlIGNoYXJnYWxnIHByb3BlcnRpZXMKKyAqIEBwc3k6CXBvaW50ZXIgdG8gdGhlIHBvd2VyX3N1cHBseSBzdHJ1Y3R1cmUKKyAqIEBwc3A6CXBvaW50ZXIgdG8gdGhlIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBzdHJ1Y3R1cmUKKyAqIEB2YWw6CXBvaW50ZXIgdG8gdGhlIHBvd2VyX3N1cHBseV9wcm9wdmFsIHVuaW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCB3aGVuIGFuIGFwcGxpY2F0aW9uIHRyaWVzIHRvIGdldCB0aGUKKyAqIGNoYXJnYWxnIHByb3BlcnRpZXMgYnkgcmVhZGluZyB0aGUgc3lzZnMgZmlsZXMuCisgKiBzdGF0dXM6ICAgICBjaGFyZ2luZy9kaXNjaGFyZ2luZy9mdWxsL3Vua25vd24KKyAqIGhlYWx0aDogICAgIGhlYWx0aCBvZiB0aGUgYmF0dGVyeQorICogUmV0dXJucyBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZSBlbHNlIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50IGFieDUwMF9jaGFyZ2FsZ19nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAorCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXN0cnVjdCBhYng1MDBfY2hhcmdhbGcgKmRpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CisKKwlzd2l0Y2ggKHBzcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgorCQl2YWwtPmludHZhbCA9IGRpLT5jaGFyZ2Vfc3RhdHVzOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSDoKKwkJaWYgKGRpLT5ldmVudHMuYmF0dF9vdnYpIHsKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSVk9MVEFHRTsKKwkJfSBlbHNlIGlmIChkaS0+ZXZlbnRzLmJ0ZW1wX3VuZGVyb3ZlcikgeworCQkJaWYgKGRpLT5iYXR0X2RhdGEudGVtcCA8PSBkaS0+Ym0tPnRlbXBfdW5kZXIpCisJCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0NPTEQ7CisJCQllbHNlCisJCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJIRUFUOworCQl9IGVsc2UgaWYgKGRpLT5jaGFyZ2Vfc3RhdGUgPT0gU1RBVEVfU0FGRVRZX1RJTUVSX0VYUElSRUQgfHwKKwkJCSAgIGRpLT5jaGFyZ2Vfc3RhdGUgPT0gU1RBVEVfU0FGRVRZX1RJTUVSX0VYUElSRURfSU5JVCkgeworCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOU1BFQ19GQUlMVVJFOworCQl9IGVsc2UgeworCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0Q7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisvKiBFeHBvc3VyZSB0byB0aGUgc3lzZnMgaW50ZXJmYWNlICovCisKK3N0YXRpYyBzc2l6ZV90IGFieDUwMF9jaGFyZ2FsZ19jdXJyX3N0ZXBfc2hvdyhzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSwKKwkJCQkJICAgICAgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkaS0+Y3Vycl9zdGF0dXMuY3Vycl9zdGVwKTsKK30KKworc3RhdGljIHNzaXplX3QgYWJ4NTAwX2NoYXJnYWxnX2N1cnJfc3RlcF9zdG9yZShzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSwKKwkJCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbmd0aCkKK3sKKwlsb25nIGludCBwYXJhbTsKKwlpbnQgcmV0OworCisJcmV0ID0ga3N0cnRvbChidWYsIDEwLCAmcGFyYW0pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZGktPmN1cnJfc3RhdHVzLmN1cnJfc3RlcCA9IHBhcmFtOworCWlmIChkaS0+Y3Vycl9zdGF0dXMuY3Vycl9zdGVwID49IENIQVJHQUxHX0NVUlJfU1RFUF9MT1cgJiYKKwkJZGktPmN1cnJfc3RhdHVzLmN1cnJfc3RlcCA8PSBDSEFSR0FMR19DVVJSX1NURVBfSElHSCkgeworCQlkaS0+Y3Vycl9zdGF0dXMuY3Vycl9zdGVwX2NoYW5nZSA9IHRydWU7CisJCXF1ZXVlX3dvcmsoZGktPmNoYXJnYWxnX3dxLCAmZGktPmNoYXJnYWxnX3dvcmspOworCX0gZWxzZQorCQlkZXZfaW5mbyhkaS0+ZGV2LCAiV3JvbmcgY3VycmVudCBzdGVwXG4iCisJCQkiRW50ZXIgMC4gRGlzYWJsZSBBQy9VU0IgQ2hhcmdpbmdcbiIKKwkJCSIxLS0xMDAuIFNldCBBQy9VU0IgY2hhcmdpbmcgY3VycmVudCBzdGVwXG4iCisJCQkiMTAwLiBFbmFibGUgQUMvVVNCIENoYXJnaW5nXG4iKTsKKworCXJldHVybiBzdHJsZW4oYnVmKTsKK30KKworCitzdGF0aWMgc3NpemVfdCBhYng1MDBfY2hhcmdhbGdfZW5fc2hvdyhzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSwKKwkJCQkgICAgICAgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAorCQkgICAgICAgZGktPnN1c3Bfc3RhdHVzLmFjX3N1c3BlbmRlZCAmJgorCQkgICAgICAgZGktPnN1c3Bfc3RhdHVzLnVzYl9zdXNwZW5kZWQpOworfQorCitzdGF0aWMgc3NpemVfdCBhYng1MDBfY2hhcmdhbGdfZW5fc3RvcmUoc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGksCisJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuZ3RoKQoreworCWxvbmcgaW50IHBhcmFtOworCWludCBhY191c2I7CisJaW50IHJldDsKKworCXJldCA9IGtzdHJ0b2woYnVmLCAxMCwgJnBhcmFtKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWFjX3VzYiA9IHBhcmFtOworCXN3aXRjaCAoYWNfdXNiKSB7CisJY2FzZSAwOgorCQkvKiBEaXNhYmxlIGNoYXJnaW5nICovCisJCWRpLT5zdXNwX3N0YXR1cy5hY19zdXNwZW5kZWQgPSB0cnVlOworCQlkaS0+c3VzcF9zdGF0dXMudXNiX3N1c3BlbmRlZCA9IHRydWU7CisJCWRpLT5zdXNwX3N0YXR1cy5zdXNwZW5kZWRfY2hhbmdlID0gdHJ1ZTsKKwkJLyogVHJpZ2dlciBhIHN0YXRlIGNoYW5nZSAqLworCQlxdWV1ZV93b3JrKGRpLT5jaGFyZ2FsZ193cSwKKwkJCSZkaS0+Y2hhcmdhbGdfd29yayk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJLyogRW5hYmxlIEFDIENoYXJnaW5nICovCisJCWRpLT5zdXNwX3N0YXR1cy5hY19zdXNwZW5kZWQgPSBmYWxzZTsKKwkJZGktPnN1c3Bfc3RhdHVzLnN1c3BlbmRlZF9jaGFuZ2UgPSB0cnVlOworCQkvKiBUcmlnZ2VyIGEgc3RhdGUgY2hhbmdlICovCisJCXF1ZXVlX3dvcmsoZGktPmNoYXJnYWxnX3dxLAorCQkJJmRpLT5jaGFyZ2FsZ193b3JrKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkvKiBFbmFibGUgVVNCIGNoYXJnaW5nICovCisJCWRpLT5zdXNwX3N0YXR1cy51c2Jfc3VzcGVuZGVkID0gZmFsc2U7CisJCWRpLT5zdXNwX3N0YXR1cy5zdXNwZW5kZWRfY2hhbmdlID0gdHJ1ZTsKKwkJLyogVHJpZ2dlciBhIHN0YXRlIGNoYW5nZSAqLworCQlxdWV1ZV93b3JrKGRpLT5jaGFyZ2FsZ193cSwKKwkJCSZkaS0+Y2hhcmdhbGdfd29yayk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9pbmZvKGRpLT5kZXYsICJXcm9uZyBpbnB1dFxuIgorCQkJIkVudGVyIDAuIERpc2FibGUgQUMvVVNCIENoYXJnaW5nXG4iCisJCQkiMS4gRW5hYmxlIEFDIGNoYXJnaW5nXG4iCisJCQkiMi4gRW5hYmxlIFVTQiBDaGFyZ2luZ1xuIik7CisJfTsKKwlyZXR1cm4gc3RybGVuKGJ1Zik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnX3N5c2ZzX2VudHJ5IGFieDUwMF9jaGFyZ2FsZ19lbl9jaGFyZ2VyID0KKwlfX0FUVFIoY2hhcmdhbGcsIDA2NDQsIGFieDUwMF9jaGFyZ2FsZ19lbl9zaG93LAorCQkJCWFieDUwMF9jaGFyZ2FsZ19lbl9zdG9yZSk7CisKK3N0YXRpYyBzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnX3N5c2ZzX2VudHJ5IGFieDUwMF9jaGFyZ2FsZ19jdXJyX3N0ZXAgPQorCV9fQVRUUihjaGFyZ2FsZ19jdXJyX3N0ZXAsIDA2NDQsIGFieDUwMF9jaGFyZ2FsZ19jdXJyX3N0ZXBfc2hvdywKKwkJCQkJYWJ4NTAwX2NoYXJnYWxnX2N1cnJfc3RlcF9zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IGFieDUwMF9jaGFyZ2FsZ19zeXNmc19zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnX3N5c2ZzX2VudHJ5ICplbnRyeSA9IGNvbnRhaW5lcl9vZihhdHRyLAorCQlzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnX3N5c2ZzX2VudHJ5LCBhdHRyKTsKKworCXN0cnVjdCBhYng1MDBfY2hhcmdhbGcgKmRpID0gY29udGFpbmVyX29mKGtvYmosCisJCXN0cnVjdCBhYng1MDBfY2hhcmdhbGcsIGNoYXJnYWxnX2tvYmplY3QpOworCisJaWYgKCFlbnRyeS0+c2hvdykKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gZW50cnktPnNob3coZGksIGJ1Zik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFieDUwMF9jaGFyZ2FsZ19zeXNmc19jaGFyZ2VyKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnX3N5c2ZzX2VudHJ5ICplbnRyeSA9IGNvbnRhaW5lcl9vZihhdHRyLAorCQlzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnX3N5c2ZzX2VudHJ5LCBhdHRyKTsKKworCXN0cnVjdCBhYng1MDBfY2hhcmdhbGcgKmRpID0gY29udGFpbmVyX29mKGtvYmosCisJCXN0cnVjdCBhYng1MDBfY2hhcmdhbGcsIGNoYXJnYWxnX2tvYmplY3QpOworCisJaWYgKCFlbnRyeS0+c3RvcmUpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGVudHJ5LT5zdG9yZShkaSwgYnVmLCBsZW5ndGgpOworfQorCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWJ4NTAwX2NoYXJnYWxnX2NoZ1tdID0geworCSZhYng1MDBfY2hhcmdhbGdfZW5fY2hhcmdlci5hdHRyLAorCSZhYng1MDBfY2hhcmdhbGdfY3Vycl9zdGVwLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3lzZnNfb3BzIGFieDUwMF9jaGFyZ2FsZ19zeXNmc19vcHMgPSB7CisJLnNob3cgPSBhYng1MDBfY2hhcmdhbGdfc3lzZnNfc2hvdywKKwkuc3RvcmUgPSBhYng1MDBfY2hhcmdhbGdfc3lzZnNfY2hhcmdlciwKK307CisKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGFieDUwMF9jaGFyZ2FsZ19rdHlwZSA9IHsKKwkuc3lzZnNfb3BzID0gJmFieDUwMF9jaGFyZ2FsZ19zeXNmc19vcHMsCisJLmRlZmF1bHRfYXR0cnMgPSBhYng1MDBfY2hhcmdhbGdfY2hnLAorfTsKKworLyoqCisgKiBhYng1MDBfY2hhcmdhbGdfc3lzZnNfZXhpdCgpIC0gZGUtaW5pdCBvZiBzeXNmcyBlbnRyeQorICogQGRpOiAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnCisgKgorICogVGhpcyBmdW5jdGlvbiByZW1vdmVzIHRoZSBlbnRyeSBpbiBzeXNmcy4KKyAqLworc3RhdGljIHZvaWQgYWJ4NTAwX2NoYXJnYWxnX3N5c2ZzX2V4aXQoc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGkpCit7CisJa29iamVjdF9kZWwoJmRpLT5jaGFyZ2FsZ19rb2JqZWN0KTsKK30KKworLyoqCisgKiBhYng1MDBfY2hhcmdhbGdfc3lzZnNfaW5pdCgpIC0gaW5pdCBvZiBzeXNmcyBlbnRyeQorICogQGRpOiAgICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnCisgKgorICogVGhpcyBmdW5jdGlvbiBhZGRzIGFuIGVudHJ5IGluIHN5c2ZzLgorICogUmV0dXJucyBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZSBlbHNlIDAob24gc3VjY2VzcykKKyAqLworc3RhdGljIGludCBhYng1MDBfY2hhcmdhbGdfc3lzZnNfaW5pdChzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZkaS0+Y2hhcmdhbGdfa29iamVjdCwKKwkJJmFieDUwMF9jaGFyZ2FsZ19rdHlwZSwKKwkJTlVMTCwgImFieDUwMF9jaGFyZ2FsZyIpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGVudHJ5XG4iKTsKKworCXJldHVybiByZXQ7Cit9CisvKiBFeHBvc3VyZSB0byB0aGUgc3lzZnMgaW50ZXJmYWNlIDw8RU5EPj4gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1BNKQorc3RhdGljIGludCBhYng1MDBfY2hhcmdhbGdfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCS8qIEtpY2sgY2hhcmdlciB3YXRjaGRvZyBpZiBjaGFyZ2luZyAoYW55IGNoYXJnZXIgb25saW5lKSAqLworCWlmIChkaS0+Y2hnX2luZm8ub25saW5lX2NoZykKKwkJcXVldWVfZGVsYXllZF93b3JrKGRpLT5jaGFyZ2FsZ193cSwgJmRpLT5jaGFyZ2FsZ193ZF93b3JrLCAwKTsKKworCS8qCisJICogUnVuIHRoZSBjaGFyZ2luZyBhbGdvcml0aG0gZGlyZWN0bHkgdG8gYmUgc3VyZSB3ZSBkb24ndAorCSAqIGRvIGl0IHRvbyBzZWxkb20KKwkgKi8KKwlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmNoYXJnYWxnX3dxLCAmZGktPmNoYXJnYWxnX3BlcmlvZGljX3dvcmssIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWJ4NTAwX2NoYXJnYWxnX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwlwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChkaS0+Y2hnX2luZm8ub25saW5lX2NoZykKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZkaS0+Y2hhcmdhbGdfd2Rfd29yayk7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmRpLT5jaGFyZ2FsZ19wZXJpb2RpY193b3JrKTsKKworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgYWJ4NTAwX2NoYXJnYWxnX3N1c3BlbmQgICAgICBOVUxMCisjZGVmaW5lIGFieDUwMF9jaGFyZ2FsZ19yZXN1bWUgICAgICAgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBpbnQgYWJ4NTAwX2NoYXJnYWxnX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhYng1MDBfY2hhcmdhbGcgKmRpID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwkvKiBzeXNmcyBpbnRlcmZhY2UgdG8gZW5hYmxlL2Rpc2JhbGUgY2hhcmdpbmcgZnJvbSB1c2VyIHNwYWNlICovCisJYWJ4NTAwX2NoYXJnYWxnX3N5c2ZzX2V4aXQoZGkpOworCisJaHJ0aW1lcl9jYW5jZWwoJmRpLT5zYWZldHlfdGltZXIpOworCWhydGltZXJfY2FuY2VsKCZkaS0+bWFpbnRlbmFuY2VfdGltZXIpOworCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZkaS0+Y2hhcmdhbGdfcGVyaW9kaWNfd29yayk7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZkaS0+Y2hhcmdhbGdfd2Rfd29yayk7CisJY2FuY2VsX3dvcmtfc3luYygmZGktPmNoYXJnYWxnX3dvcmspOworCisJLyogRGVsZXRlIHRoZSB3b3JrIHF1ZXVlICovCisJZGVzdHJveV93b3JrcXVldWUoZGktPmNoYXJnYWxnX3dxKTsKKworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGRpLT5jaGFyZ2FsZ19wc3kpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyICpzdXBwbHlfaW50ZXJmYWNlW10gPSB7CisJImFiODUwMF9mZyIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGFieDUwMF9jaGFyZ2FsZ19kZXNjID0geworCS5uYW1lCQkJPSAiYWJ4NTAwX2NoYXJnYWxnIiwKKwkudHlwZQkJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKKwkucHJvcGVydGllcwkJPSBhYng1MDBfY2hhcmdhbGdfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCQk9IEFSUkFZX1NJWkUoYWJ4NTAwX2NoYXJnYWxnX3Byb3BzKSwKKwkuZ2V0X3Byb3BlcnR5CQk9IGFieDUwMF9jaGFyZ2FsZ19nZXRfcHJvcGVydHksCisJLmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQJPSBhYng1MDBfY2hhcmdhbGdfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCwKK307CisKK3N0YXRpYyBpbnQgYWJ4NTAwX2NoYXJnYWxnX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBhYng1MDBfYm1fZGF0YSAqcGxhdCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKKwlzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaTsKKwlpbnQgcmV0ID0gMDsKKworCWRpID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZGkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzIG5vIG1lbSBmb3IgYWI4NTAwX2NoYXJnYWxnXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmICghcGxhdCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBiYXR0ZXJ5IG1hbmFnZW1lbnQgZGF0YSBzdXBwbGllZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkaS0+Ym0gPSBwbGF0OworCisJaWYgKG5wKSB7CisJCXJldCA9IGFiODUwMF9ibV9vZl9wcm9iZSgmcGRldi0+ZGV2LCBucCwgZGktPmJtKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBiYXR0ZXJ5IGluZm9ybWF0aW9uXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwkvKiBnZXQgZGV2aWNlIHN0cnVjdCBhbmQgcGFyZW50ICovCisJZGktPmRldiA9ICZwZGV2LT5kZXY7CisJZGktPnBhcmVudCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKworCXBzeV9jZmcuc3VwcGxpZWRfdG8gPSBzdXBwbHlfaW50ZXJmYWNlOworCXBzeV9jZmcubnVtX3N1cHBsaWNhbnRzID0gQVJSQVlfU0laRShzdXBwbHlfaW50ZXJmYWNlKTsKKwlwc3lfY2ZnLmRydl9kYXRhID0gZGk7CisKKwkvKiBJbml0aWxpYWxpemUgc2FmZXR5IHRpbWVyICovCisJaHJ0aW1lcl9pbml0KCZkaS0+c2FmZXR5X3RpbWVyLCBDTE9DS19SRUFMVElNRSwgSFJUSU1FUl9NT0RFX0FCUyk7CisJZGktPnNhZmV0eV90aW1lci5mdW5jdGlvbiA9IGFieDUwMF9jaGFyZ2FsZ19zYWZldHlfdGltZXJfZXhwaXJlZDsKKworCS8qIEluaXRpbGlhbGl6ZSBtYWludGVuYW5jZSB0aW1lciAqLworCWhydGltZXJfaW5pdCgmZGktPm1haW50ZW5hbmNlX3RpbWVyLCBDTE9DS19SRUFMVElNRSwgSFJUSU1FUl9NT0RFX0FCUyk7CisJZGktPm1haW50ZW5hbmNlX3RpbWVyLmZ1bmN0aW9uID0KKwkJYWJ4NTAwX2NoYXJnYWxnX21haW50ZW5hbmNlX3RpbWVyX2V4cGlyZWQ7CisKKwkvKiBDcmVhdGUgYSB3b3JrIHF1ZXVlIGZvciB0aGUgY2hhcmdhbGcgKi8KKwlkaS0+Y2hhcmdhbGdfd3EgPSBhbGxvY19vcmRlcmVkX3dvcmtxdWV1ZSgiYWJ4NTAwX2NoYXJnYWxnX3dxIiwKKwkJCQkJCSAgIFdRX01FTV9SRUNMQUlNKTsKKwlpZiAoZGktPmNoYXJnYWxnX3dxID09IE5VTEwpIHsKKwkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSB3b3JrIHF1ZXVlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogSW5pdCB3b3JrIGZvciBjaGFyZ2FsZyAqLworCUlOSVRfREVGRVJSQUJMRV9XT1JLKCZkaS0+Y2hhcmdhbGdfcGVyaW9kaWNfd29yaywKKwkJYWJ4NTAwX2NoYXJnYWxnX3BlcmlvZGljX3dvcmspOworCUlOSVRfREVGRVJSQUJMRV9XT1JLKCZkaS0+Y2hhcmdhbGdfd2Rfd29yaywKKwkJYWJ4NTAwX2NoYXJnYWxnX3dkX3dvcmspOworCisJLyogSW5pdCB3b3JrIGZvciBjaGFyZ2FsZyAqLworCUlOSVRfV09SSygmZGktPmNoYXJnYWxnX3dvcmssIGFieDUwMF9jaGFyZ2FsZ193b3JrKTsKKworCS8qIFRvIGRldGVjdCBjaGFyZ2VyIGF0IHN0YXJ0dXAgKi8KKwlkaS0+Y2hnX2luZm8ucHJldl9jb25uX2NoZyA9IC0xOworCisJLyogUmVnaXN0ZXIgY2hhcmdhbGcgcG93ZXIgc3VwcGx5IGNsYXNzICovCisJZGktPmNoYXJnYWxnX3BzeSA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcihkaS0+ZGV2LCAmYWJ4NTAwX2NoYXJnYWxnX2Rlc2MsCisJCQkJCQkgJnBzeV9jZmcpOworCWlmIChJU19FUlIoZGktPmNoYXJnYWxnX3BzeSkpIHsKKwkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGNoYXJnYWxnIHBzeVxuIik7CisJCXJldCA9IFBUUl9FUlIoZGktPmNoYXJnYWxnX3BzeSk7CisJCWdvdG8gZnJlZV9jaGFyZ2FsZ193cTsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkaSk7CisKKwkvKiBzeXNmcyBpbnRlcmZhY2UgdG8gZW5hYmxlL2Rpc2FibGUgY2hhcmdpbmcgZnJvbSB1c2VyIHNwYWNlICovCisJcmV0ID0gYWJ4NTAwX2NoYXJnYWxnX3N5c2ZzX2luaXQoZGkpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBlbnRyeVxuIik7CisJCWdvdG8gZnJlZV9wc3k7CisJfQorCWRpLT5jdXJyX3N0YXR1cy5jdXJyX3N0ZXAgPSBDSEFSR0FMR19DVVJSX1NURVBfSElHSDsKKworCS8qIFJ1biB0aGUgY2hhcmdpbmcgYWxnb3JpdGhtICovCisJcXVldWVfZGVsYXllZF93b3JrKGRpLT5jaGFyZ2FsZ193cSwgJmRpLT5jaGFyZ2FsZ19wZXJpb2RpY193b3JrLCAwKTsKKworCWRldl9pbmZvKGRpLT5kZXYsICJwcm9iZSBzdWNjZXNzXG4iKTsKKwlyZXR1cm4gcmV0OworCitmcmVlX3BzeToKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihkaS0+Y2hhcmdhbGdfcHN5KTsKK2ZyZWVfY2hhcmdhbGdfd3E6CisJZGVzdHJveV93b3JrcXVldWUoZGktPmNoYXJnYWxnX3dxKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhYjg1MDBfY2hhcmdhbGdfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInN0ZXJpY3Nzb24sYWI4NTAwLWNoYXJnYWxnIiwgfSwKKwl7IH0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhYng1MDBfY2hhcmdhbGdfZHJpdmVyID0geworCS5wcm9iZSA9IGFieDUwMF9jaGFyZ2FsZ19wcm9iZSwKKwkucmVtb3ZlID0gYWJ4NTAwX2NoYXJnYWxnX3JlbW92ZSwKKwkuc3VzcGVuZCA9IGFieDUwMF9jaGFyZ2FsZ19zdXNwZW5kLAorCS5yZXN1bWUgPSBhYng1MDBfY2hhcmdhbGdfcmVzdW1lLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFiODUwMC1jaGFyZ2FsZyIsCisJCS5vZl9tYXRjaF90YWJsZSA9IGFiODUwMF9jaGFyZ2FsZ19tYXRjaCwKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihhYng1MDBfY2hhcmdhbGdfZHJpdmVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FVVEhPUigiSm9oYW4gUGFsc3NvbiwgS2FybCBLb21pZXJvd3NraSIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTphYng1MDAtY2hhcmdhbGciKTsKK01PRFVMRV9ERVNDUklQVElPTigiYWJ4NTAwIGJhdHRlcnkgY2hhcmdpbmcgYWxnb3JpdGhtIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9hY3Q4OTQ1YV9jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9hY3Q4OTQ1YV9jaGFyZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFlYjJlMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L2FjdDg5NDVhX2NoYXJnZXIuYwpAQCAtMCwwICsxLDY2NiBAQAorLyoKKyAqIFBvd2VyIHN1cHBseSBkcml2ZXIgZm9yIHRoZSBBY3RpdmUtc2VtaSBBQ1Q4OTQ1QSBQTUlDCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEF0bWVsIENvcnBvcmF0aW9uCisgKgorICogQXV0aG9yOiBXZW55b3UgWWFuZyA8d2VueW91LnlhbmdAYXRtZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+CisKK3N0YXRpYyBjb25zdCBjaGFyICphY3Q4OTQ1YV9jaGFyZ2VyX21vZGVsID0gIkFDVDg5NDVBIjsKK3N0YXRpYyBjb25zdCBjaGFyICphY3Q4OTQ1YV9jaGFyZ2VyX21hbnVmYWN0dXJlciA9ICJBY3RpdmUtc2VtaSI7CisKKy8qKgorICogQUNUODk0NUEgQ2hhcmdlciBSZWdpc3RlciBNYXAKKyAqLworCisvKiAweDcwOiBSZXNlcnZlZCAqLworI2RlZmluZSBBQ1Q4OTQ1QV9BUENIX0NGRwkJMHg3MQorI2RlZmluZSBBQ1Q4OTQ1QV9BUENIX1NUQVRVUwkJMHg3OAorI2RlZmluZSBBQ1Q4OTQ1QV9BUENIX0NUUkwJCTB4NzkKKyNkZWZpbmUgQUNUODk0NUFfQVBDSF9TVEFURQkJMHg3QQorCisvKiBBQ1Q4OTQ1QV9BUENIX0NGRyAqLworI2RlZmluZSBBUENIX0NGR19PVlBTRVQJCQkoMHgzIDw8IDApCisjZGVmaW5lIEFQQ0hfQ0ZHX09WUFNFVF82VjYJCSgweDAgPDwgMCkKKyNkZWZpbmUgQVBDSF9DRkdfT1ZQU0VUXzdWCQkoMHgxIDw8IDApCisjZGVmaW5lIEFQQ0hfQ0ZHX09WUFNFVF83VjUJCSgweDIgPDwgMCkKKyNkZWZpbmUgQVBDSF9DRkdfT1ZQU0VUXzhWCQkoMHgzIDw8IDApCisjZGVmaW5lIEFQQ0hfQ0ZHX1BSRVRJTU8JCSgweDMgPDwgMikKKyNkZWZpbmUgQVBDSF9DRkdfUFJFVElNT180MF9NSU4JCSgweDAgPDwgMikKKyNkZWZpbmUgQVBDSF9DRkdfUFJFVElNT182MF9NSU4JCSgweDEgPDwgMikKKyNkZWZpbmUgQVBDSF9DRkdfUFJFVElNT184MF9NSU4JCSgweDIgPDwgMikKKyNkZWZpbmUgQVBDSF9DRkdfUFJFVElNT19ESVNBQkxFRAkoMHgzIDw8IDIpCisjZGVmaW5lIEFQQ0hfQ0ZHX1RPVFRJTU8JCSgweDMgPDwgNCkKKyNkZWZpbmUgQVBDSF9DRkdfVE9UVElNT18zX0hPVVIJCSgweDAgPDwgNCkKKyNkZWZpbmUgQVBDSF9DRkdfVE9UVElNT180X0hPVVIJCSgweDEgPDwgNCkKKyNkZWZpbmUgQVBDSF9DRkdfVE9UVElNT181X0hPVVIJCSgweDIgPDwgNCkKKyNkZWZpbmUgQVBDSF9DRkdfVE9UVElNT19ESVNBQkxFRAkoMHgzIDw8IDQpCisjZGVmaW5lIEFQQ0hfQ0ZHX1NVU0NIRwkJCSgweDEgPDwgNykKKworI2RlZmluZSBBUENIX1NUQVRVU19DSEdEQVQJCUJJVCgwKQorI2RlZmluZSBBUENIX1NUQVRVU19JTkRBVAkJQklUKDEpCisjZGVmaW5lIEFQQ0hfU1RBVFVTX1RFTVBEQVQJCUJJVCgyKQorI2RlZmluZSBBUENIX1NUQVRVU19USU1SREFUCQlCSVQoMykKKyNkZWZpbmUgQVBDSF9TVEFUVVNfQ0hHU1RBVAkJQklUKDQpCisjZGVmaW5lIEFQQ0hfU1RBVFVTX0lOU1RBVAkJQklUKDUpCisjZGVmaW5lIEFQQ0hfU1RBVFVTX1RFTVBTVEFUCQlCSVQoNikKKyNkZWZpbmUgQVBDSF9TVEFUVVNfVElNUlNUQVQJCUJJVCg3KQorCisjZGVmaW5lIEFQQ0hfQ1RSTF9DSEdFT0NPVVQJCUJJVCgwKQorI2RlZmluZSBBUENIX0NUUkxfSU5ESVMJCQlCSVQoMSkKKyNkZWZpbmUgQVBDSF9DVFJMX1RFTVBPVVQJCUJJVCgyKQorI2RlZmluZSBBUENIX0NUUkxfVElNUlBSRQkJQklUKDMpCisjZGVmaW5lIEFQQ0hfQ1RSTF9DSEdFT0NJTgkJQklUKDQpCisjZGVmaW5lIEFQQ0hfQ1RSTF9JTkNPTgkJCUJJVCg1KQorI2RlZmluZSBBUENIX0NUUkxfVEVNUElOCQlCSVQoNikKKyNkZWZpbmUgQVBDSF9DVFJMX1RJTVJUT1QJCUJJVCg3KQorCisjZGVmaW5lIEFQQ0hfU1RBVEVfQUNJTlNUQVQJCSgweDEgPDwgMSkKKyNkZWZpbmUgQVBDSF9TVEFURV9DU1RBVEUJCSgweDMgPDwgNCkKKyNkZWZpbmUgQVBDSF9TVEFURV9DU1RBVEVfU0hJRlQJCTQKKyNkZWZpbmUgQVBDSF9TVEFURV9DU1RBVEVfRElTQUJMRUQJMHgwMAorI2RlZmluZSBBUENIX1NUQVRFX0NTVEFURV9FT0MJCTB4MDEKKyNkZWZpbmUgQVBDSF9TVEFURV9DU1RBVEVfRkFTVAkJMHgwMgorI2RlZmluZSBBUENIX1NUQVRFX0NTVEFURV9QUkUJCTB4MDMKKworc3RydWN0IGFjdDg5NDVhX2NoYXJnZXIgeworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgZGVzYzsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisKKwlib29sIGluaXRfZG9uZTsKKwlzdHJ1Y3QgZ3Bpb19kZXNjICpsYm9fZ3BpbzsKKwlzdHJ1Y3QgZ3Bpb19kZXNjICpjaGdsZXZfZ3BpbzsKK307CisKK3N0YXRpYyBpbnQgYWN0ODk0NWFfZ2V0X2NoYXJnZXJfc3RhdGUoc3RydWN0IHJlZ21hcCAqcmVnbWFwLCBpbnQgKnZhbCkKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBzdGF0dXMsIHN0YXRlOworCisJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBBQ1Q4OTQ1QV9BUENIX1NUQVRVUywgJnN0YXR1cyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIEFDVDg5NDVBX0FQQ0hfU1RBVEUsICZzdGF0ZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzdGF0ZSAmPSBBUENIX1NUQVRFX0NTVEFURTsKKwlzdGF0ZSA+Pj0gQVBDSF9TVEFURV9DU1RBVEVfU0hJRlQ7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBBUENIX1NUQVRFX0NTVEFURV9QUkU6CisJY2FzZSBBUENIX1NUQVRFX0NTVEFURV9GQVNUOgorCQkqdmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKKwkJYnJlYWs7CisJY2FzZSBBUENIX1NUQVRFX0NTVEFURV9FT0M6CisJCWlmIChzdGF0dXMgJiBBUENIX1NUQVRVU19DSEdEQVQpCisJCQkqdmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19GVUxMOworCQllbHNlCisJCQkqdmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKKwkJYnJlYWs7CisJY2FzZSBBUENIX1NUQVRFX0NTVEFURV9ESVNBQkxFRDoKKwlkZWZhdWx0OgorCQlpZiAoIShzdGF0dXMgJiBBUENIX1NUQVRVU19JTkRBVCkpCisJCQkqdmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORzsKKwkJZWxzZQorCQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfTk9UX0NIQVJHSU5HOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhY3Q4OTQ1YV9nZXRfY2hhcmdlX3R5cGUoc3RydWN0IHJlZ21hcCAqcmVnbWFwLCBpbnQgKnZhbCkKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBzdGF0dXMsIHN0YXRlOworCisJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBBQ1Q4OTQ1QV9BUENIX1NUQVRVUywgJnN0YXR1cyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIEFDVDg5NDVBX0FQQ0hfU1RBVEUsICZzdGF0ZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzdGF0ZSAmPSBBUENIX1NUQVRFX0NTVEFURTsKKwlzdGF0ZSA+Pj0gQVBDSF9TVEFURV9DU1RBVEVfU0hJRlQ7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBBUENIX1NUQVRFX0NTVEFURV9QUkU6CisJCSp2YWwgPSBQT1dFUl9TVVBQTFlfQ0hBUkdFX1RZUEVfVFJJQ0tMRTsKKwkJYnJlYWs7CisJY2FzZSBBUENIX1NUQVRFX0NTVEFURV9GQVNUOgorCQkqdmFsID0gUE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX0ZBU1Q7CisJCWJyZWFrOworCWNhc2UgQVBDSF9TVEFURV9DU1RBVEVfRU9DOgorCQkqdmFsID0gUE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX05PTkU7CisJCWJyZWFrOworCWNhc2UgQVBDSF9TVEFURV9DU1RBVEVfRElTQUJMRUQ6CisJZGVmYXVsdDoKKwkJaWYgKCEoc3RhdHVzICYgQVBDSF9TVEFUVVNfSU5EQVQpKQorCQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9OT05FOworCQllbHNlCisJCQkqdmFsID0gUE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX1VOS05PV047CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjdDg5NDVhX2dldF9iYXR0ZXJ5X2hlYWx0aChzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGludCAqdmFsKQoreworCWludCByZXQ7CisJdW5zaWduZWQgaW50IHN0YXR1cywgc3RhdGUsIGNvbmZpZzsKKworCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgQUNUODk0NUFfQVBDSF9TVEFUVVMsICZzdGF0dXMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBBQ1Q4OTQ1QV9BUENIX0NGRywgJmNvbmZpZyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIEFDVDg5NDVBX0FQQ0hfU1RBVEUsICZzdGF0ZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzdGF0ZSAmPSBBUENIX1NUQVRFX0NTVEFURTsKKwlzdGF0ZSA+Pj0gQVBDSF9TVEFURV9DU1RBVEVfU0hJRlQ7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBBUENIX1NUQVRFX0NTVEFURV9ESVNBQkxFRDoKKwkJaWYgKGNvbmZpZyAmIEFQQ0hfQ0ZHX1NVU0NIRykgeworCQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfVU5LTk9XTjsKKwkJfSBlbHNlIGlmIChzdGF0dXMgJiBBUENIX1NUQVRVU19JTkRBVCkgeworCQkJaWYgKCEoc3RhdHVzICYgQVBDSF9TVEFUVVNfVEVNUERBVCkpCisJCQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUkhFQVQ7CisJCQllbHNlIGlmIChzdGF0dXMgJiBBUENIX1NUQVRVU19USU1SREFUKQorCQkJCSp2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX1NBRkVUWV9USU1FUl9FWFBJUkU7CisJCQllbHNlCisJCQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUlZPTFRBR0U7CisJCX0gZWxzZSB7CisJCQkqdmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9HT09EOworCQl9CisJCWJyZWFrOworCWNhc2UgQVBDSF9TVEFURV9DU1RBVEVfUFJFOgorCWNhc2UgQVBDSF9TVEFURV9DU1RBVEVfRkFTVDoKKwljYXNlIEFQQ0hfU1RBVEVfQ1NUQVRFX0VPQzoKKwlkZWZhdWx0OgorCQkqdmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9HT09EOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhY3Q4OTQ1YV9nZXRfY2FwYWNpdHlfbGV2ZWwoc3RydWN0IGFjdDg5NDVhX2NoYXJnZXIgKmNoYXJnZXIsCisJCQkJICAgICAgIHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgaW50ICp2YWwpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzLCBzdGF0ZSwgY29uZmlnOworCWludCBsYm9fbGV2ZWwgPSBncGlvZF9nZXRfdmFsdWUoY2hhcmdlci0+bGJvX2dwaW8pOworCisJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBBQ1Q4OTQ1QV9BUENIX1NUQVRVUywgJnN0YXR1cyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIEFDVDg5NDVBX0FQQ0hfQ0ZHLCAmY29uZmlnKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgQUNUODk0NUFfQVBDSF9TVEFURSwgJnN0YXRlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXN0YXRlICY9IEFQQ0hfU1RBVEVfQ1NUQVRFOworCXN0YXRlID4+PSBBUENIX1NUQVRFX0NTVEFURV9TSElGVDsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIEFQQ0hfU1RBVEVfQ1NUQVRFX1BSRToKKwkJKnZhbCA9IFBPV0VSX1NVUFBMWV9DQVBBQ0lUWV9MRVZFTF9MT1c7CisJCWJyZWFrOworCWNhc2UgQVBDSF9TVEFURV9DU1RBVEVfRkFTVDoKKwkJaWYgKGxib19sZXZlbCkKKwkJCSp2YWwgPSBQT1dFUl9TVVBQTFlfQ0FQQUNJVFlfTEVWRUxfSElHSDsKKwkJZWxzZQorCQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9DQVBBQ0lUWV9MRVZFTF9MT1c7CisJCWJyZWFrOworCWNhc2UgQVBDSF9TVEFURV9DU1RBVEVfRU9DOgorCQlpZiAoc3RhdHVzICYgQVBDSF9TVEFUVVNfQ0hHREFUKQorCQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9DQVBBQ0lUWV9MRVZFTF9GVUxMOworCQllbHNlCisJCQkqdmFsID0gUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX05PUk1BTDsKKwkJYnJlYWs7CisJY2FzZSBBUENIX1NUQVRFX0NTVEFURV9ESVNBQkxFRDoKKwlkZWZhdWx0OgorCQlpZiAoY29uZmlnICYgQVBDSF9DRkdfU1VTQ0hHKSB7CisJCQkqdmFsID0gUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX1VOS05PV047CisJCX0gZWxzZSB7CisJCQkqdmFsID0gUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX05PUk1BTDsKKwkJCWlmICghKHN0YXR1cyAmIEFQQ0hfU1RBVFVTX0lOREFUKSkgeworCQkJCWlmICghbGJvX2xldmVsKQorCQkJCQkqdmFsID0gUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX0NSSVRJQ0FMOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisjZGVmaW5lIE1BWF9DVVJSRU5UX1VTQl9ISUdICTQ1MDAwMAorI2RlZmluZSBNQVhfQ1VSUkVOVF9VU0JfTE9XCTkwMDAwCisjZGVmaW5lIE1BWF9DVVJSRU5UX1VTQl9QUkUJNDUwMDAKKy8qCisgKiBSaXNldChLKSA9IDIzMzYgKiAoMVYvSWNoZyhtQSkpIC0gMC4yMDUKKyAqIFJpc2V0ID0gMi40M0sKKyAqLworI2RlZmluZSBNQVhfQ1VSUkVOVF9BQ19ISUdICQk4ODY1MjcKKyNkZWZpbmUgTUFYX0NVUlJFTlRfQUNfTE9XCQkxMTczMDUKKyNkZWZpbmUgTUFYX0NVUlJFTlRfQUNfSElHSF9QUkUJCTg4NjUzCisjZGVmaW5lIE1BWF9DVVJSRU5UX0FDX0xPV19QUkUJCTExNzMxCisKK3N0YXRpYyBpbnQgYWN0ODk0NWFfZ2V0X2N1cnJlbnRfbWF4KHN0cnVjdCBhY3Q4OTQ1YV9jaGFyZ2VyICpjaGFyZ2VyLAorCQkJCSAgICBzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGludCAqdmFsKQoreworCWludCByZXQ7CisJdW5zaWduZWQgaW50IHN0YXR1cywgc3RhdGU7CisJdW5zaWduZWQgaW50IGFjaW5fc3RhdGU7CisJaW50IGNoZ2luX2xldmVsID0gZ3Bpb2RfZ2V0X3ZhbHVlKGNoYXJnZXItPmNoZ2xldl9ncGlvKTsKKworCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgQUNUODk0NUFfQVBDSF9TVEFUVVMsICZzdGF0dXMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBBQ1Q4OTQ1QV9BUENIX1NUQVRFLCAmc3RhdGUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJYWNpbl9zdGF0ZSA9IChzdGF0ZSAmIEFQQ0hfU1RBVEVfQUNJTlNUQVQpID4+IDE7CisKKwlzdGF0ZSAmPSBBUENIX1NUQVRFX0NTVEFURTsKKwlzdGF0ZSA+Pj0gQVBDSF9TVEFURV9DU1RBVEVfU0hJRlQ7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBBUENIX1NUQVRFX0NTVEFURV9QUkU6CisJCWlmIChhY2luX3N0YXRlKSB7CisJCQlpZiAoY2hnaW5fbGV2ZWwpCisJCQkJKnZhbCA9IE1BWF9DVVJSRU5UX0FDX0hJR0hfUFJFOworCQkJZWxzZQorCQkJCSp2YWwgPSBNQVhfQ1VSUkVOVF9BQ19MT1dfUFJFOworCQl9IGVsc2UgeworCQkJKnZhbCA9IE1BWF9DVVJSRU5UX1VTQl9QUkU7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBUENIX1NUQVRFX0NTVEFURV9GQVNUOgorCQlpZiAoYWNpbl9zdGF0ZSkgeworCQkJaWYgKGNoZ2luX2xldmVsKQorCQkJCSp2YWwgPSBNQVhfQ1VSUkVOVF9BQ19ISUdIOworCQkJZWxzZQorCQkJCSp2YWwgPSBNQVhfQ1VSUkVOVF9BQ19MT1c7CisJCX0gZWxzZSB7CisJCQlpZiAoY2hnaW5fbGV2ZWwpCisJCQkJKnZhbCA9IE1BWF9DVVJSRU5UX1VTQl9ISUdIOworCQkJZWxzZQorCQkJCSp2YWwgPSBNQVhfQ1VSUkVOVF9VU0JfTE9XOworCQl9CisJCWJyZWFrOworCWNhc2UgQVBDSF9TVEFURV9DU1RBVEVfRU9DOgorCWNhc2UgQVBDSF9TVEFURV9DU1RBVEVfRElTQUJMRUQ6CisJZGVmYXVsdDoKKwkJKnZhbCA9IDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgYWN0ODk0NWFfY2hhcmdlcl9wcm9wc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfVFlQRSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZLAorCVBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWV9MRVZFTCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX01BWCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9NT0RFTF9OQU1FLAorCVBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUgorfTsKKworc3RhdGljIGludCBhY3Q4OTQ1YV9jaGFyZ2VyX2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJCQkJCSBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwcm9wLAorCQkJCQkgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzdHJ1Y3QgYWN0ODk0NWFfY2hhcmdlciAqY2hhcmdlciA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOworCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGNoYXJnZXItPnJlZ21hcDsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAocHJvcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgorCQlyZXQgPSBhY3Q4OTQ1YV9nZXRfY2hhcmdlcl9zdGF0ZShyZWdtYXAsICZ2YWwtPmludHZhbCk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX1RZUEU6CisJCXJldCA9IGFjdDg5NDVhX2dldF9jaGFyZ2VfdHlwZShyZWdtYXAsICZ2YWwtPmludHZhbCk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWToKKwkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfVEVDSE5PTE9HWV9MSU9OOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSDoKKwkJcmV0ID0gYWN0ODk0NWFfZ2V0X2JhdHRlcnlfaGVhbHRoKHJlZ21hcCwgJnZhbC0+aW50dmFsKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWV9MRVZFTDoKKwkJcmV0ID0gYWN0ODk0NWFfZ2V0X2NhcGFjaXR5X2xldmVsKGNoYXJnZXIsCisJCQkJCQkgIHJlZ21hcCwgJnZhbC0+aW50dmFsKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX01BWDoKKwkJcmV0ID0gYWN0ODk0NWFfZ2V0X2N1cnJlbnRfbWF4KGNoYXJnZXIsCisJCQkJCSAgICAgICByZWdtYXAsICZ2YWwtPmludHZhbCk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfTU9ERUxfTkFNRToKKwkJdmFsLT5zdHJ2YWwgPSBhY3Q4OTQ1YV9jaGFyZ2VyX21vZGVsOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUjoKKwkJdmFsLT5zdHJ2YWwgPSBhY3Q4OTQ1YV9jaGFyZ2VyX21hbnVmYWN0dXJlcjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhY3Q4OTQ1YV9lbmFibGVfaW50ZXJydXB0KHN0cnVjdCBhY3Q4OTQ1YV9jaGFyZ2VyICpjaGFyZ2VyKQoreworCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGNoYXJnZXItPnJlZ21hcDsKKwl1bnNpZ25lZCBjaGFyIGN0cmw7CisJaW50IHJldDsKKworCWN0cmwgPSBBUENIX0NUUkxfQ0hHRU9DT1VUIHwgQVBDSF9DVFJMX0NIR0VPQ0lOIHwKKwkgICAgICAgQVBDSF9DVFJMX0lORElTIHwgQVBDSF9DVFJMX0lOQ09OIHwKKwkgICAgICAgQVBDSF9DVFJMX1RFTVBPVVQgfCBBUENIX0NUUkxfVEVNUElOIHwKKwkgICAgICAgQVBDSF9DVFJMX1RJTVJQUkUgfCBBUENIX0NUUkxfVElNUlRPVDsKKwlyZXQgPSByZWdtYXBfd3JpdGUocmVnbWFwLCBBQ1Q4OTQ1QV9BUENIX0NUUkwsIGN0cmwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwljdHJsID0gQVBDSF9TVEFUVVNfQ0hHU1RBVCB8IEFQQ0hfU1RBVFVTX0lOU1RBVCB8CisJICAgICAgIEFQQ0hfU1RBVFVTX1RFTVBTVEFUIHwgQVBDSF9TVEFUVVNfVElNUlNUQVQ7CisJcmV0ID0gcmVnbWFwX3dyaXRlKHJlZ21hcCwgQUNUODk0NUFfQVBDSF9TVEFUVVMsIGN0cmwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBhY3Q4OTQ1YV9zZXRfc3VwcGx5X3R5cGUoc3RydWN0IGFjdDg5NDVhX2NoYXJnZXIgKmNoYXJnZXIsCisJCQkJCSAgICAgdW5zaWduZWQgaW50ICp0eXBlKQoreworCXVuc2lnbmVkIGludCBzdGF0dXMsIHN0YXRlOworCWludCByZXQ7CisKKwlyZXQgPSByZWdtYXBfcmVhZChjaGFyZ2VyLT5yZWdtYXAsIEFDVDg5NDVBX0FQQ0hfU1RBVFVTLCAmc3RhdHVzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHJlZ21hcF9yZWFkKGNoYXJnZXItPnJlZ21hcCwgQUNUODk0NUFfQVBDSF9TVEFURSwgJnN0YXRlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChzdGF0dXMgJiBBUENIX1NUQVRVU19JTkRBVCkgeworCQlpZiAoc3RhdGUgJiBBUENIX1NUQVRFX0FDSU5TVEFUKQorCQkJKnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUzsKKwkJZWxzZQorCQkJKnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9VU0I7CisJfSBlbHNlIHsKKwkJKnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhY3Q4OTQ1YV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYWN0ODk0NWFfY2hhcmdlciAqY2hhcmdlciA9CisJCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGFjdDg5NDVhX2NoYXJnZXIsIHdvcmspOworCisJYWN0ODk0NWFfc2V0X3N1cHBseV90eXBlKGNoYXJnZXIsICZjaGFyZ2VyLT5kZXNjLnR5cGUpOworCisJcG93ZXJfc3VwcGx5X2NoYW5nZWQoY2hhcmdlci0+cHN5KTsKK30KKworc3RhdGljIGlycXJldHVybl90IGFjdDg5NDVhX3N0YXR1c19jaGFuZ2VkKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgYWN0ODk0NWFfY2hhcmdlciAqY2hhcmdlciA9IGRldl9pZDsKKworCWlmIChjaGFyZ2VyLT5pbml0X2RvbmUpCisJCXNjaGVkdWxlX3dvcmsoJmNoYXJnZXItPndvcmspOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisjZGVmaW5lIERFRkFVTFRfVE9UQUxfVElNRV9PVVQJCTMKKyNkZWZpbmUgREVGQVVMVF9QUkVfVElNRV9PVVQJCTQwCisjZGVmaW5lIERFRkFVTFRfSU5QVVRfT1ZQX1RIUkVTSE9MRAk2NjAwCisKK3N0YXRpYyBpbnQgYWN0ODk0NWFfY2hhcmdlcl9jb25maWcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBhY3Q4OTQ1YV9jaGFyZ2VyICpjaGFyZ2VyKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gY2hhcmdlci0+cmVnbWFwOworCisJdTMyIHRvdGFsX3RpbWVfb3V0OworCXUzMiBwcmVfdGltZV9vdXQ7CisJdTMyIGlucHV0X3ZvbHRhZ2VfdGhyZXNob2xkOworCWludCBlcnIsIHJldDsKKworCXVuc2lnbmVkIGludCB0bXA7CisJdW5zaWduZWQgaW50IHZhbHVlID0gMDsKKworCWlmICghbnApIHsKKwkJZGV2X2VycihkZXYsICJubyBjaGFyZ2VyIG9mIG5vZGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIEFDVDg5NDVBX0FQQ0hfQ0ZHLCAmdG1wKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKHRtcCAmIEFQQ0hfQ0ZHX1NVU0NIRykgeworCQl2YWx1ZSB8PSBBUENIX0NGR19TVVNDSEc7CisJCWRldl9pbmZvKGRldiwgImhhdmUgYmVlbiBzdXNwZW5kZWRcbiIpOworCX0KKworCWNoYXJnZXItPmxib19ncGlvID0gZGV2bV9ncGlvZF9nZXRfb3B0aW9uYWwoZGV2LCAiYWN0aXZlLXNlbWksbGJvIiwKKwkJCQkJCSAgICBHUElPRF9JTik7CisJaWYgKElTX0VSUihjaGFyZ2VyLT5sYm9fZ3BpbykpIHsKKwkJZXJyID0gUFRSX0VSUihjaGFyZ2VyLT5sYm9fZ3Bpbyk7CisJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIGNsYWltIGdwaW8gXCJsYm9cIjogJWRcbiIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycShkZXYsIGdwaW9kX3RvX2lycShjaGFyZ2VyLT5sYm9fZ3BpbyksCisJCQkgICAgICAgYWN0ODk0NWFfc3RhdHVzX2NoYW5nZWQsCisJCQkgICAgICAgKElSUUZfVFJJR0dFUl9GQUxMSU5HIHwgSVJRRl9UUklHR0VSX1JJU0lORyksCisJCQkgICAgICAgImFjdDg5NDVhX2xib19kZXRlY3QiLCBjaGFyZ2VyKTsKKwlpZiAocmV0KQorCQlkZXZfaW5mbyhkZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBncGlvIFwibGJvXCIgSVJRXG4iKTsKKworCWNoYXJnZXItPmNoZ2xldl9ncGlvID0gZGV2bV9ncGlvZF9nZXRfb3B0aW9uYWwoZGV2LAorCQkJCQkJICAgICAgICJhY3RpdmUtc2VtaSxjaGdsZXYiLAorCQkJCQkJICAgICAgIEdQSU9EX0lOKTsKKwlpZiAoSVNfRVJSKGNoYXJnZXItPmNoZ2xldl9ncGlvKSkgeworCQllcnIgPSBQVFJfRVJSKGNoYXJnZXItPmNoZ2xldl9ncGlvKTsKKwkJZGV2X2VycihkZXYsICJ1bmFibGUgdG8gY2xhaW0gZ3BpbyBcImNoZ2xldlwiOiAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobnAsCisJCQkJICJhY3RpdmUtc2VtaSxpbnB1dC12b2x0YWdlLXRocmVzaG9sZC1taWNyb3ZvbHQiLAorCQkJCSAmaW5wdXRfdm9sdGFnZV90aHJlc2hvbGQpKQorCQlpbnB1dF92b2x0YWdlX3RocmVzaG9sZCA9IERFRkFVTFRfSU5QVVRfT1ZQX1RIUkVTSE9MRDsKKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwKKwkJCQkgImFjdGl2ZS1zZW1pLHByZWNvbmRpdGlvbi10aW1lb3V0IiwKKwkJCQkgJnByZV90aW1lX291dCkpCisJCXByZV90aW1lX291dCA9IERFRkFVTFRfUFJFX1RJTUVfT1VUOworCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiYWN0aXZlLXNlbWksdG90YWwtdGltZW91dCIsCisJCQkJICZ0b3RhbF90aW1lX291dCkpCisJCXRvdGFsX3RpbWVfb3V0ID0gREVGQVVMVF9UT1RBTF9USU1FX09VVDsKKworCXN3aXRjaCAoaW5wdXRfdm9sdGFnZV90aHJlc2hvbGQpIHsKKwljYXNlIDgwMDA6CisJCXZhbHVlIHw9IEFQQ0hfQ0ZHX09WUFNFVF84VjsKKwkJYnJlYWs7CisJY2FzZSA3NTAwOgorCQl2YWx1ZSB8PSBBUENIX0NGR19PVlBTRVRfN1Y1OworCQlicmVhazsKKwljYXNlIDcwMDA6CisJCXZhbHVlIHw9IEFQQ0hfQ0ZHX09WUFNFVF83VjsKKwkJYnJlYWs7CisJY2FzZSA2NjAwOgorCWRlZmF1bHQ6CisJCXZhbHVlIHw9IEFQQ0hfQ0ZHX09WUFNFVF82VjY7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAocHJlX3RpbWVfb3V0KSB7CisJY2FzZSA2MDoKKwkJdmFsdWUgfD0gQVBDSF9DRkdfUFJFVElNT182MF9NSU47CisJCWJyZWFrOworCWNhc2UgODA6CisJCXZhbHVlIHw9IEFQQ0hfQ0ZHX1BSRVRJTU9fODBfTUlOOworCQlicmVhazsKKwljYXNlIDA6CisJCXZhbHVlIHw9IEFQQ0hfQ0ZHX1BSRVRJTU9fRElTQUJMRUQ7CisJCWJyZWFrOworCWNhc2UgNDA6CisJZGVmYXVsdDoKKwkJdmFsdWUgfD0gQVBDSF9DRkdfUFJFVElNT180MF9NSU47CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAodG90YWxfdGltZV9vdXQpIHsKKwljYXNlIDQ6CisJCXZhbHVlIHw9IEFQQ0hfQ0ZHX1RPVFRJTU9fNF9IT1VSOworCQlicmVhazsKKwljYXNlIDU6CisJCXZhbHVlIHw9IEFQQ0hfQ0ZHX1RPVFRJTU9fNV9IT1VSOworCQlicmVhazsKKwljYXNlIDA6CisJCXZhbHVlIHw9IEFQQ0hfQ0ZHX1RPVFRJTU9fRElTQUJMRUQ7CisJCWJyZWFrOworCWNhc2UgMzoKKwlkZWZhdWx0OgorCQl2YWx1ZSB8PSBBUENIX0NGR19UT1RUSU1PXzNfSE9VUjsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJlZ21hcF93cml0ZShyZWdtYXAsIEFDVDg5NDVBX0FQQ0hfQ0ZHLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgYWN0ODk0NWFfY2hhcmdlcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhY3Q4OTQ1YV9jaGFyZ2VyICpjaGFyZ2VyOworCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKKwlpbnQgaXJxLCByZXQ7CisKKwljaGFyZ2VyID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqY2hhcmdlciksIEdGUF9LRVJORUwpOworCWlmICghY2hhcmdlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljaGFyZ2VyLT5yZWdtYXAgPSBkZXZfZ2V0X3JlZ21hcChwZGV2LT5kZXYucGFyZW50LCBOVUxMKTsKKwlpZiAoIWNoYXJnZXItPnJlZ21hcCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJQYXJlbnQgZGlkIG5vdCBwcm92aWRlIHJlZ21hcFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IGFjdDg5NDVhX2NoYXJnZXJfY29uZmlnKCZwZGV2LT5kZXYsIGNoYXJnZXIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpcnEgPSBvZl9pcnFfZ2V0KHBkZXYtPmRldi5vZl9ub2RlLCAwKTsKKwlpZiAoaXJxID09IC1FUFJPQkVfREVGRVIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGZpbmQgSVJRIG51bWJlclxuIik7CisJCXJldHVybiAtRVBST0JFX0RFRkVSOworCX0KKworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgaXJxLCBhY3Q4OTQ1YV9zdGF0dXNfY2hhbmdlZCwKKwkJCSAgICAgICBJUlFGX1RSSUdHRVJfRkFMTElORywgImFjdDg5NDVhX2ludGVycnVwdCIsCisJCQkgICAgICAgY2hhcmdlcik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBuSVJRIHBpbiBJUlFcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWNoYXJnZXItPmRlc2MubmFtZSA9ICJhY3Q4OTQ1YS1jaGFyZ2VyIjsKKwljaGFyZ2VyLT5kZXNjLmdldF9wcm9wZXJ0eSA9IGFjdDg5NDVhX2NoYXJnZXJfZ2V0X3Byb3BlcnR5OworCWNoYXJnZXItPmRlc2MucHJvcGVydGllcyA9IGFjdDg5NDVhX2NoYXJnZXJfcHJvcHM7CisJY2hhcmdlci0+ZGVzYy5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUoYWN0ODk0NWFfY2hhcmdlcl9wcm9wcyk7CisKKwlyZXQgPSBhY3Q4OTQ1YV9zZXRfc3VwcGx5X3R5cGUoY2hhcmdlciwgJmNoYXJnZXItPmRlc2MudHlwZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwc3lfY2ZnLm9mX25vZGUJPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlwc3lfY2ZnLmRydl9kYXRhID0gY2hhcmdlcjsKKworCWNoYXJnZXItPnBzeSA9IGRldm1fcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsCisJCQkJCQkgICZjaGFyZ2VyLT5kZXNjLAorCQkJCQkJICAmcHN5X2NmZyk7CisJaWYgKElTX0VSUihjaGFyZ2VyLT5wc3kpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBwb3dlciBzdXBwbHlcbiIpOworCQlyZXR1cm4gUFRSX0VSUihjaGFyZ2VyLT5wc3kpOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNoYXJnZXIpOworCisJSU5JVF9XT1JLKCZjaGFyZ2VyLT53b3JrLCBhY3Q4OTQ1YV93b3JrKTsKKworCXJldCA9IGFjdDg5NDVhX2VuYWJsZV9pbnRlcnJ1cHQoY2hhcmdlcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIC1FSU87CisKKwljaGFyZ2VyLT5pbml0X2RvbmUgPSB0cnVlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWN0ODk0NWFfY2hhcmdlcl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYWN0ODk0NWFfY2hhcmdlciAqY2hhcmdlciA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJY2hhcmdlci0+aW5pdF9kb25lID0gZmFsc2U7CisJY2FuY2VsX3dvcmtfc3luYygmY2hhcmdlci0+d29yayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYWN0ODk0NWFfY2hhcmdlcl9kcml2ZXIgPSB7CisJLmRyaXZlcgk9IHsKKwkJLm5hbWUgPSAiYWN0ODk0NWEtY2hhcmdlciIsCisJfSwKKwkucHJvYmUJPSBhY3Q4OTQ1YV9jaGFyZ2VyX3Byb2JlLAorCS5yZW1vdmUgPSBhY3Q4OTQ1YV9jaGFyZ2VyX3JlbW92ZSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGFjdDg5NDVhX2NoYXJnZXJfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBY3RpdmUtc2VtaSBBQ1Q4OTQ1QSBBY3RpdmVQYXRoIGNoYXJnZXIgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJXZW55b3UgWWFuZyA8d2VueW91LnlhbmdAYXRtZWwuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9hcG1fcG93ZXIuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L2FwbV9wb3dlci5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3Bvd2VyL2FwbV9wb3dlci5jCnJlbmFtZSB0byBkcml2ZXJzL3Bvd2VyL3N1cHBseS9hcG1fcG93ZXIuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9heHAyMHhfdXNiX3Bvd2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9heHAyMHhfdXNiX3Bvd2VyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvYXhwMjB4X3VzYl9wb3dlci5jCnJlbmFtZSB0byBkcml2ZXJzL3Bvd2VyL3N1cHBseS9heHAyMHhfdXNiX3Bvd2VyLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvc3VwcGx5L2F4cDI4OF9jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9heHAyODhfY2hhcmdlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YjhlMGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9heHAyODhfY2hhcmdlci5jCkBAIC0wLDAgKzEsOTY5IEBACisvKgorICogYXhwMjg4X2NoYXJnZXIuYyAtIFgtcG93ZXIgQVhQMjg4IFBNSUMgQ2hhcmdlciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogUmFtYWtyaXNobmEgUGFsbGFsYSA8cmFtYWtyaXNobmEucGFsbGFsYUBpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9vdGcuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb3BlcnR5Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2F4cDIweC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGNvbi5oPgorCisjZGVmaW5lIFBTX1NUQVRfVkJVU19UUklHR0VSCQkoMSA8PCAwKQorI2RlZmluZSBQU19TVEFUX0JBVF9DSFJHX0RJUgkJKDEgPDwgMikKKyNkZWZpbmUgUFNfU1RBVF9WQkFUX0FCT1ZFX1ZIT0xECSgxIDw8IDMpCisjZGVmaW5lIFBTX1NUQVRfVkJVU19WQUxJRAkJKDEgPDwgNCkKKyNkZWZpbmUgUFNfU1RBVF9WQlVTX1BSRVNFTlQJCSgxIDw8IDUpCisKKyNkZWZpbmUgQ0hSR19TVEFUX0JBVF9TQUZFX01PREUJCSgxIDw8IDMpCisjZGVmaW5lIENIUkdfU1RBVF9CQVRfVkFMSUQJCSgxIDw8IDQpCisjZGVmaW5lIENIUkdfU1RBVF9CQVRfUFJFU0VOVAkJKDEgPDwgNSkKKyNkZWZpbmUgQ0hSR19TVEFUX0NIQVJHSU5HCQkoMSA8PCA2KQorI2RlZmluZSBDSFJHX1NUQVRfUE1JQ19PVFAJCSgxIDw8IDcpCisKKyNkZWZpbmUgVkJVU19JU1BPVVRfQ1VSX0xJTV9NQVNLCTB4MDMKKyNkZWZpbmUgVkJVU19JU1BPVVRfQ1VSX0xJTV9CSVRfUE9TCTAKKyNkZWZpbmUgVkJVU19JU1BPVVRfQ1VSX0xJTV85MDBNQQkweDAJLyogOTAwbUEgKi8KKyNkZWZpbmUgVkJVU19JU1BPVVRfQ1VSX0xJTV8xNTAwTUEJMHgxCS8qIDE1MDBtQSAqLworI2RlZmluZSBWQlVTX0lTUE9VVF9DVVJfTElNXzIwMDBNQQkweDIJLyogMjAwMG1BICovCisjZGVmaW5lIFZCVVNfSVNQT1VUX0NVUl9OT19MSU0JCTB4MwkvKiAyNTAwbUEgKi8KKyNkZWZpbmUgVkJVU19JU1BPVVRfVkhPTERfU0VUX01BU0sJMHgzMQorI2RlZmluZSBWQlVTX0lTUE9VVF9WSE9MRF9TRVRfQklUX1BPUwkweDMKKyNkZWZpbmUgVkJVU19JU1BPVVRfVkhPTERfU0VUX09GRlNFVAk0MDAwCS8qIDQwMDBtViAqLworI2RlZmluZSBWQlVTX0lTUE9VVF9WSE9MRF9TRVRfTFNCX1JFUwkxMDAJLyogMTAwbVYgKi8KKyNkZWZpbmUgVkJVU19JU1BPVVRfVkhPTERfU0VUXzQzMDBNVgkweDMJLyogNDMwMG1WICovCisjZGVmaW5lIFZCVVNfSVNQT1VUX1ZCVVNfUEFUSF9ESVMJKDEgPDwgNykKKworI2RlZmluZSBDSFJHX0NDQ1ZfQ0NfTUFTSwkJMHhmCQkvKiA0IGJpdHMgKi8KKyNkZWZpbmUgQ0hSR19DQ0NWX0NDX0JJVF9QT1MJCTAKKyNkZWZpbmUgQ0hSR19DQ0NWX0NDX09GRlNFVAkJMjAwCQkvKiAyMDBtQSAqLworI2RlZmluZSBDSFJHX0NDQ1ZfQ0NfTFNCX1JFUwkJMjAwCQkvKiAyMDBtQSAqLworI2RlZmluZSBDSFJHX0NDQ1ZfSVRFUk1fMjBQCQkoMSA8PCA0KQkvKiAyMCUgb2YgQ0MgKi8KKyNkZWZpbmUgQ0hSR19DQ0NWX0NWX01BU0sJCTB4NjAJCS8qIDIgYml0cyAqLworI2RlZmluZSBDSFJHX0NDQ1ZfQ1ZfQklUX1BPUwkJNQorI2RlZmluZSBDSFJHX0NDQ1ZfQ1ZfNDEwME1WCQkweDAJCS8qIDQuMTBWICovCisjZGVmaW5lIENIUkdfQ0NDVl9DVl80MTUwTVYJCTB4MQkJLyogNC4xNVYgKi8KKyNkZWZpbmUgQ0hSR19DQ0NWX0NWXzQyMDBNVgkJMHgyCQkvKiA0LjIwViAqLworI2RlZmluZSBDSFJHX0NDQ1ZfQ1ZfNDM1ME1WCQkweDMJCS8qIDQuMzVWICovCisjZGVmaW5lIENIUkdfQ0NDVl9DSEdfRU4JCSgxIDw8IDcpCisKKyNkZWZpbmUgQ05UTDJfQ0NfVElNRU9VVF9NQVNLCQkweDMJLyogMiBiaXRzICovCisjZGVmaW5lIENOVEwyX0NDX1RJTUVPVVRfT0ZGU0VUCQk2CS8qIDYgSHJzICovCisjZGVmaW5lIENOVEwyX0NDX1RJTUVPVVRfTFNCX1JFUwkyCS8qIDIgSHJzICovCisjZGVmaW5lIENOVEwyX0NDX1RJTUVPVVRfMTJIUlMJCTB4MwkvKiAxMiBIcnMgKi8KKyNkZWZpbmUgQ05UTDJfQ0hHTEVEX1RZUEVCCQkoMSA8PCA0KQorI2RlZmluZSBDTlRMMl9DSEdfT1VUX1RVUk5PTgkJKDEgPDwgNSkKKyNkZWZpbmUgQ05UTDJfUENfVElNRU9VVF9NQVNLCQkweEMwCisjZGVmaW5lIENOVEwyX1BDX1RJTUVPVVRfT0ZGU0VUCQk0MAkvKiA0MCBtaW5zICovCisjZGVmaW5lIENOVEwyX1BDX1RJTUVPVVRfTFNCX1JFUwkxMAkvKiAxMCBtaW5zICovCisjZGVmaW5lIENOVEwyX1BDX1RJTUVPVVRfNzBNSU5TCQkweDMKKworI2RlZmluZSBDSFJHX0lMSU1fVEVNUF9MT09QX0VOCQkoMSA8PCAzKQorI2RlZmluZSBDSFJHX1ZCVVNfSUxJTV9NQVNLCQkweGYwCisjZGVmaW5lIENIUkdfVkJVU19JTElNX0JJVF9QT1MJCTQKKyNkZWZpbmUgQ0hSR19WQlVTX0lMSU1fMTAwTUEJCTB4MAkvKiAxMDBtQSAqLworI2RlZmluZSBDSFJHX1ZCVVNfSUxJTV81MDBNQQkJMHgxCS8qIDUwMG1BICovCisjZGVmaW5lIENIUkdfVkJVU19JTElNXzkwME1BCQkweDIJLyogOTAwbUEgKi8KKyNkZWZpbmUgQ0hSR19WQlVTX0lMSU1fMTUwME1BCQkweDMJLyogMTUwMG1BICovCisjZGVmaW5lIENIUkdfVkJVU19JTElNXzIwMDBNQQkJMHg0CS8qIDIwMDBtQSAqLworI2RlZmluZSBDSFJHX1ZCVVNfSUxJTV8yNTAwTUEJCTB4NQkvKiAyNTAwbUEgKi8KKyNkZWZpbmUgQ0hSR19WQlVTX0lMSU1fMzAwME1BCQkweDYJLyogMzAwMG1BICovCisKKyNkZWZpbmUgQ0hSR19WTFRGQ18wQwkJCTB4QTUJLyogMCBEZWdDICovCisjZGVmaW5lIENIUkdfVkhURkNfNDVDCQkJMHgxRgkvKiA0NSBEZWdDICovCisKKyNkZWZpbmUgQkFUX0lSUV9DRkdfQ0hSR19ET05FCQkoMSA8PCAyKQorI2RlZmluZSBCQVRfSVJRX0NGR19DSFJHX1NUQVJUCQkoMSA8PCAzKQorI2RlZmluZSBCQVRfSVJRX0NGR19CQVRfU0FGRV9FWElUCSgxIDw8IDQpCisjZGVmaW5lIEJBVF9JUlFfQ0ZHX0JBVF9TQUZFX0VOVEVSCSgxIDw8IDUpCisjZGVmaW5lIEJBVF9JUlFfQ0ZHX0JBVF9ESVNDT04JCSgxIDw8IDYpCisjZGVmaW5lIEJBVF9JUlFfQ0ZHX0JBVF9DT05OCQkoMSA8PCA3KQorI2RlZmluZSBCQVRfSVJRX0NGR19CQVRfTUFTSwkJMHhGQworCisjZGVmaW5lIFRFTVBfSVJRX0NGR19RQ0JUVQkJKDEgPDwgNCkKKyNkZWZpbmUgVEVNUF9JUlFfQ0ZHX0NCVFUJCSgxIDw8IDUpCisjZGVmaW5lIFRFTVBfSVJRX0NGR19RQ0JUTwkJKDEgPDwgNikKKyNkZWZpbmUgVEVNUF9JUlFfQ0ZHX0NCVE8JCSgxIDw8IDcpCisjZGVmaW5lIFRFTVBfSVJRX0NGR19NQVNLCQkweEYwCisKKyNkZWZpbmUgRkdfQ05UTF9PQ1ZfQURKX0VOCQkoMSA8PCAzKQorCisjZGVmaW5lIENWXzQxMDBNVgkJCTQxMDAJLyogNDEwMG1WICovCisjZGVmaW5lIENWXzQxNTBNVgkJCTQxNTAJLyogNDE1MG1WICovCisjZGVmaW5lIENWXzQyMDBNVgkJCTQyMDAJLyogNDIwMG1WICovCisjZGVmaW5lIENWXzQzNTBNVgkJCTQzNTAJLyogNDM1MG1WICovCisKKyNkZWZpbmUgQ0NfMjAwTUEJCQkyMDAJLyogIDIwMG1BICovCisjZGVmaW5lIENDXzYwME1BCQkJNjAwCS8qICA2MDBtQSAqLworI2RlZmluZSBDQ184MDBNQQkJCTgwMAkvKiAgODAwbUEgKi8KKyNkZWZpbmUgQ0NfMTAwME1BCQkJMTAwMAkvKiAxMDAwbUEgKi8KKyNkZWZpbmUgQ0NfMTYwME1BCQkJMTYwMAkvKiAxNjAwbUEgKi8KKyNkZWZpbmUgQ0NfMjAwME1BCQkJMjAwMAkvKiAyMDAwbUEgKi8KKworI2RlZmluZSBJTElNXzEwME1BCQkJMTAwCS8qIDEwMG1BICovCisjZGVmaW5lIElMSU1fNTAwTUEJCQk1MDAJLyogNTAwbUEgKi8KKyNkZWZpbmUgSUxJTV85MDBNQQkJCTkwMAkvKiA5MDBtQSAqLworI2RlZmluZSBJTElNXzE1MDBNQQkJCTE1MDAJLyogMTUwMG1BICovCisjZGVmaW5lIElMSU1fMjAwME1BCQkJMjAwMAkvKiAyMDAwbUEgKi8KKyNkZWZpbmUgSUxJTV8yNTAwTUEJCQkyNTAwCS8qIDI1MDBtQSAqLworI2RlZmluZSBJTElNXzMwMDBNQQkJCTMwMDAJLyogMzAwMG1BICovCisKKyNkZWZpbmUgQVhQMjg4X0VYVENPTl9ERVZfTkFNRQkJImF4cDI4OF9leHRjb24iCisKK2VudW0geworCVZCVVNfT1ZfSVJRID0gMCwKKwlDSEFSR0VfRE9ORV9JUlEsCisJQ0hBUkdFX0NIQVJHSU5HX0lSUSwKKwlCQVRfU0FGRV9RVUlUX0lSUSwKKwlCQVRfU0FGRV9FTlRFUl9JUlEsCisJUUNCVFVfSVJRLAorCUNCVFVfSVJRLAorCVFDQlRPX0lSUSwKKwlDQlRPX0lSUSwKKwlDSFJHX0lOVFJfRU5ELAorfTsKKworc3RydWN0IGF4cDI4OF9jaHJnX2luZm8geworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IGF4cDIweF9jaHJnX3BkYXRhICpwZGF0YTsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJc3RydWN0IHJlZ21hcF9pcnFfY2hpcF9kYXRhICpyZWdtYXBfaXJxYzsKKwlpbnQgaXJxW0NIUkdfSU5UUl9FTkRdOworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeV91c2I7CisJc3RydWN0IG11dGV4IGxvY2s7CisKKwkvKiBPVEcvSG9zdCBtb2RlICovCisJc3RydWN0IHsKKwkJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJCXN0cnVjdCBleHRjb25fZGV2ICpjYWJsZTsKKwkJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGlkX25iOworCQlib29sIGlkX3Nob3J0OworCX0gb3RnOworCisJLyogU0RQL0NEUC9EQ1AgVVNCIGNoYXJnaW5nIGNhYmxlIG5vdGlmaWNhdGlvbnMgKi8KKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldjsKKwkJYm9vbCBjb25uZWN0ZWQ7CisJCWVudW0gcG93ZXJfc3VwcGx5X3R5cGUgY2hnX3R5cGU7CisJCXN0cnVjdCBub3RpZmllcl9ibG9jayBuYjsKKwkJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJfSBjYWJsZTsKKworCWludCBoZWFsdGg7CisJaW50IGlubG10OworCWludCBjYzsKKwlpbnQgY3Y7CisJaW50IG1heF9jYzsKKwlpbnQgbWF4X2N2OworCWJvb2wgb25saW5lOworCWJvb2wgcHJlc2VudDsKKwlib29sIGVuYWJsZV9jaGFyZ2VyOworCWJvb2wgaXNfY2hhcmdlcl9lbmFibGVkOworfTsKKworc3RhdGljIGlubGluZSBpbnQgYXhwMjg4X2NoYXJnZXJfc2V0X2NjKHN0cnVjdCBheHAyODhfY2hyZ19pbmZvICppbmZvLCBpbnQgY2MpCit7CisJdTggcmVnX3ZhbDsKKwlpbnQgcmV0OworCisJaWYgKGNjIDwgQ0hSR19DQ0NWX0NDX09GRlNFVCkKKwkJY2MgPSBDSFJHX0NDQ1ZfQ0NfT0ZGU0VUOworCWVsc2UgaWYgKGNjID4gaW5mby0+bWF4X2NjKQorCQljYyA9IGluZm8tPm1heF9jYzsKKworCXJlZ192YWwgPSAoY2MgLSBDSFJHX0NDQ1ZfQ0NfT0ZGU0VUKSAvIENIUkdfQ0NDVl9DQ19MU0JfUkVTOworCWNjID0gKHJlZ192YWwgKiBDSFJHX0NDQ1ZfQ0NfTFNCX1JFUykgKyBDSFJHX0NDQ1ZfQ0NfT0ZGU0VUOworCXJlZ192YWwgPSByZWdfdmFsIDw8IENIUkdfQ0NDVl9DQ19CSVRfUE9TOworCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGluZm8tPnJlZ21hcCwKKwkJCQlBWFAyMFhfQ0hSR19DVFJMMSwKKwkJCQlDSFJHX0NDQ1ZfQ0NfTUFTSywgcmVnX3ZhbCk7CisJaWYgKHJldCA+PSAwKQorCQlpbmZvLT5jYyA9IGNjOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXhwMjg4X2NoYXJnZXJfc2V0X2N2KHN0cnVjdCBheHAyODhfY2hyZ19pbmZvICppbmZvLCBpbnQgY3YpCit7CisJdTggcmVnX3ZhbDsKKwlpbnQgcmV0OworCisJaWYgKGN2IDw9IENWXzQxMDBNVikgeworCQlyZWdfdmFsID0gQ0hSR19DQ0NWX0NWXzQxMDBNVjsKKwkJY3YgPSBDVl80MTAwTVY7CisJfSBlbHNlIGlmIChjdiA8PSBDVl80MTUwTVYpIHsKKwkJcmVnX3ZhbCA9IENIUkdfQ0NDVl9DVl80MTUwTVY7CisJCWN2ID0gQ1ZfNDE1ME1WOworCX0gZWxzZSBpZiAoY3YgPD0gQ1ZfNDIwME1WKSB7CisJCXJlZ192YWwgPSBDSFJHX0NDQ1ZfQ1ZfNDIwME1WOworCQljdiA9IENWXzQyMDBNVjsKKwl9IGVsc2UgeworCQlyZWdfdmFsID0gQ0hSR19DQ0NWX0NWXzQzNTBNVjsKKwkJY3YgPSBDVl80MzUwTVY7CisJfQorCisJcmVnX3ZhbCA9IHJlZ192YWwgPDwgQ0hSR19DQ0NWX0NWX0JJVF9QT1M7CisKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoaW5mby0+cmVnbWFwLAorCQkJCUFYUDIwWF9DSFJHX0NUUkwxLAorCQkJCUNIUkdfQ0NDVl9DVl9NQVNLLCByZWdfdmFsKTsKKworCWlmIChyZXQgPj0gMCkKKwkJaW5mby0+Y3YgPSBjdjsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF4cDI4OF9jaGFyZ2VyX3NldF92YnVzX2lubG10KHN0cnVjdCBheHAyODhfY2hyZ19pbmZvICppbmZvLAorCQkJCQkgICBpbnQgaW5sbXQpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgdmFsOworCXU4IHJlZ192YWw7CisKKwkvKiBSZWFkIGluIGxpbWl0IHJlZ2lzdGVyICovCisJcmV0ID0gcmVnbWFwX3JlYWQoaW5mby0+cmVnbWFwLCBBWFAyMFhfQ0hSR19CQUtfQ1RSTCwgJnZhbCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gc2V0X2lubG10X2ZhaWw7CisKKwlpZiAoaW5sbXQgPD0gSUxJTV8xMDBNQSkgeworCQlyZWdfdmFsID0gQ0hSR19WQlVTX0lMSU1fMTAwTUE7CisJCWlubG10ID0gSUxJTV8xMDBNQTsKKwl9IGVsc2UgaWYgKGlubG10IDw9IElMSU1fNTAwTUEpIHsKKwkJcmVnX3ZhbCA9IENIUkdfVkJVU19JTElNXzUwME1BOworCQlpbmxtdCA9IElMSU1fNTAwTUE7CisJfSBlbHNlIGlmIChpbmxtdCA8PSBJTElNXzkwME1BKSB7CisJCXJlZ192YWwgPSBDSFJHX1ZCVVNfSUxJTV85MDBNQTsKKwkJaW5sbXQgPSBJTElNXzkwME1BOworCX0gZWxzZSBpZiAoaW5sbXQgPD0gSUxJTV8xNTAwTUEpIHsKKwkJcmVnX3ZhbCA9IENIUkdfVkJVU19JTElNXzE1MDBNQTsKKwkJaW5sbXQgPSBJTElNXzE1MDBNQTsKKwl9IGVsc2UgaWYgKGlubG10IDw9IElMSU1fMjAwME1BKSB7CisJCXJlZ192YWwgPSBDSFJHX1ZCVVNfSUxJTV8yMDAwTUE7CisJCWlubG10ID0gSUxJTV8yMDAwTUE7CisJfSBlbHNlIGlmIChpbmxtdCA8PSBJTElNXzI1MDBNQSkgeworCQlyZWdfdmFsID0gQ0hSR19WQlVTX0lMSU1fMjUwME1BOworCQlpbmxtdCA9IElMSU1fMjUwME1BOworCX0gZWxzZSB7CisJCXJlZ192YWwgPSBDSFJHX1ZCVVNfSUxJTV8zMDAwTUE7CisJCWlubG10ID0gSUxJTV8zMDAwTUE7CisJfQorCisJcmVnX3ZhbCA9ICh2YWwgJiB+Q0hSR19WQlVTX0lMSU1fTUFTSykKKwkJCXwgKHJlZ192YWwgPDwgQ0hSR19WQlVTX0lMSU1fQklUX1BPUyk7CisJcmV0ID0gcmVnbWFwX3dyaXRlKGluZm8tPnJlZ21hcCwgQVhQMjBYX0NIUkdfQkFLX0NUUkwsIHJlZ192YWwpOworCWlmIChyZXQgPj0gMCkKKwkJaW5mby0+aW5sbXQgPSBpbmxtdDsKKwllbHNlCisJCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwgImNoYXJnZXIgQkFLIGNvbnRyb2wgJWRcbiIsIHJldCk7CisKKworc2V0X2lubG10X2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBheHAyODhfY2hhcmdlcl92YnVzX3BhdGhfc2VsZWN0KHN0cnVjdCBheHAyODhfY2hyZ19pbmZvICppbmZvLAorCQkJCQkJCQlib29sIGVuYWJsZSkKK3sKKwlpbnQgcmV0OworCisJaWYgKGVuYWJsZSkKKwkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGluZm8tPnJlZ21hcCwgQVhQMjBYX1ZCVVNfSVBTT1VUX01HTVQsCisJCQkJCVZCVVNfSVNQT1VUX1ZCVVNfUEFUSF9ESVMsIDApOworCWVsc2UKKwkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGluZm8tPnJlZ21hcCwgQVhQMjBYX1ZCVVNfSVBTT1VUX01HTVQsCisJCQlWQlVTX0lTUE9VVF9WQlVTX1BBVEhfRElTLCBWQlVTX0lTUE9VVF9WQlVTX1BBVEhfRElTKTsKKworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsICJheHAyODggdmJ1cyBwYXRoIHNlbGVjdCAlZFxuIiwgcmV0KTsKKworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBheHAyODhfY2hhcmdlcl9lbmFibGVfY2hhcmdlcihzdHJ1Y3QgYXhwMjg4X2NocmdfaW5mbyAqaW5mbywKKwkJCQkJCQkJYm9vbCBlbmFibGUpCit7CisJaW50IHJldDsKKworCWlmIChlbmFibGUpCisJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhpbmZvLT5yZWdtYXAsIEFYUDIwWF9DSFJHX0NUUkwxLAorCQkJCUNIUkdfQ0NDVl9DSEdfRU4sIENIUkdfQ0NDVl9DSEdfRU4pOworCWVsc2UKKwkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGluZm8tPnJlZ21hcCwgQVhQMjBYX0NIUkdfQ1RSTDEsCisJCQkJQ0hSR19DQ0NWX0NIR19FTiwgMCk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwgImF4cDI4OCBlbmFibGUgY2hhcmdlciAlZFxuIiwgcmV0KTsKKwllbHNlCisJCWluZm8tPmlzX2NoYXJnZXJfZW5hYmxlZCA9IGVuYWJsZTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXhwMjg4X2NoYXJnZXJfaXNfcHJlc2VudChzdHJ1Y3QgYXhwMjg4X2NocmdfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0LCBwcmVzZW50ID0gMDsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJcmV0ID0gcmVnbWFwX3JlYWQoaW5mby0+cmVnbWFwLCBBWFAyMFhfUFdSX0lOUFVUX1NUQVRVUywgJnZhbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAodmFsICYgUFNfU1RBVF9WQlVTX1BSRVNFTlQpCisJCXByZXNlbnQgPSAxOworCXJldHVybiBwcmVzZW50OworfQorCitzdGF0aWMgaW50IGF4cDI4OF9jaGFyZ2VyX2lzX29ubGluZShzdHJ1Y3QgYXhwMjg4X2NocmdfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0LCBvbmxpbmUgPSAwOworCXVuc2lnbmVkIGludCB2YWw7CisKKwlyZXQgPSByZWdtYXBfcmVhZChpbmZvLT5yZWdtYXAsIEFYUDIwWF9QV1JfSU5QVVRfU1RBVFVTLCAmdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmICh2YWwgJiBQU19TVEFUX1ZCVVNfVkFMSUQpCisJCW9ubGluZSA9IDE7CisJcmV0dXJuIG9ubGluZTsKK30KKworc3RhdGljIGludCBheHAyODhfZ2V0X2NoYXJnZXJfaGVhbHRoKHN0cnVjdCBheHAyODhfY2hyZ19pbmZvICppbmZvKQoreworCWludCByZXQsIHB3cl9zdGF0LCBjaHJnX3N0YXQ7CisJaW50IGhlYWx0aCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfVU5LTk9XTjsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJcmV0ID0gcmVnbWFwX3JlYWQoaW5mby0+cmVnbWFwLCBBWFAyMFhfUFdSX0lOUFVUX1NUQVRVUywgJnZhbCk7CisJaWYgKChyZXQgPCAwKSB8fCAhKHZhbCAmIFBTX1NUQVRfVkJVU19QUkVTRU5UKSkKKwkJZ290byBoZWFsdGhfcmVhZF9mYWlsOworCWVsc2UKKwkJcHdyX3N0YXQgPSB2YWw7CisKKwlyZXQgPSByZWdtYXBfcmVhZChpbmZvLT5yZWdtYXAsIEFYUDIwWF9QV1JfT1BfTU9ERSwgJnZhbCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gaGVhbHRoX3JlYWRfZmFpbDsKKwllbHNlCisJCWNocmdfc3RhdCA9IHZhbDsKKworCWlmICghKHB3cl9zdGF0ICYgUFNfU1RBVF9WQlVTX1ZBTElEKSkKKwkJaGVhbHRoID0gUE9XRVJfU1VQUExZX0hFQUxUSF9ERUFEOworCWVsc2UgaWYgKGNocmdfc3RhdCAmIENIUkdfU1RBVF9QTUlDX09UUCkKKwkJaGVhbHRoID0gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSSEVBVDsKKwllbHNlIGlmIChjaHJnX3N0YXQgJiBDSFJHX1NUQVRfQkFUX1NBRkVfTU9ERSkKKwkJaGVhbHRoID0gUE9XRVJfU1VQUExZX0hFQUxUSF9TQUZFVFlfVElNRVJfRVhQSVJFOworCWVsc2UKKwkJaGVhbHRoID0gUE9XRVJfU1VQUExZX0hFQUxUSF9HT09EOworCitoZWFsdGhfcmVhZF9mYWlsOgorCXJldHVybiBoZWFsdGg7Cit9CisKK3N0YXRpYyBpbnQgYXhwMjg4X2NoYXJnZXJfdXNiX3NldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJCQkJICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwkJCQkgICAgY29uc3QgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzdHJ1Y3QgYXhwMjg4X2NocmdfaW5mbyAqaW5mbyA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOworCWludCByZXQgPSAwOworCWludCBzY2FsZWRfdmFsOworCisJbXV0ZXhfbG9jaygmaW5mby0+bG9jayk7CisKKwlzd2l0Y2ggKHBzcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX0NVUlJFTlQ6CisJCXNjYWxlZF92YWwgPSBtaW4odmFsLT5pbnR2YWwsIGluZm8tPm1heF9jYyk7CisJCXNjYWxlZF92YWwgPSBESVZfUk9VTkRfQ0xPU0VTVChzY2FsZWRfdmFsLCAxMDAwKTsKKwkJcmV0ID0gYXhwMjg4X2NoYXJnZXJfc2V0X2NjKGluZm8sIHNjYWxlZF92YWwpOworCQlpZiAocmV0IDwgMCkKKwkJCWRldl93YXJuKCZpbmZvLT5wZGV2LT5kZXYsICJzZXQgY2hhcmdlIGN1cnJlbnQgZmFpbGVkXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfVk9MVEFHRToKKwkJc2NhbGVkX3ZhbCA9IG1pbih2YWwtPmludHZhbCwgaW5mby0+bWF4X2N2KTsKKwkJc2NhbGVkX3ZhbCA9IERJVl9ST1VORF9DTE9TRVNUKHNjYWxlZF92YWwsIDEwMDApOworCQlyZXQgPSBheHAyODhfY2hhcmdlcl9zZXRfY3YoaW5mbywgc2NhbGVkX3ZhbCk7CisJCWlmIChyZXQgPCAwKQorCQkJZGV2X3dhcm4oJmluZm8tPnBkZXYtPmRldiwgInNldCBjaGFyZ2Ugdm9sdGFnZSBmYWlsZWRcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKworCW11dGV4X3VubG9jaygmaW5mby0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBheHAyODhfY2hhcmdlcl91c2JfZ2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKKwkJCQkgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCQkJCSAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXN0cnVjdCBheHAyODhfY2hyZ19pbmZvICppbmZvID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZpbmZvLT5sb2NrKTsKKworCXN3aXRjaCAocHNwKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOgorCQkvKiBDaGVjayBmb3IgT1RHIGNhc2UgZmlyc3QgKi8KKwkJaWYgKGluZm8tPm90Zy5pZF9zaG9ydCkgeworCQkJdmFsLT5pbnR2YWwgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ID0gYXhwMjg4X2NoYXJnZXJfaXNfcHJlc2VudChpbmZvKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIHBzeV9nZXRfcHJvcF9mYWlsOworCQlpbmZvLT5wcmVzZW50ID0gcmV0OworCQl2YWwtPmludHZhbCA9IGluZm8tPnByZXNlbnQ7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FOgorCQkvKiBDaGVjayBmb3IgT1RHIGNhc2UgZmlyc3QgKi8KKwkJaWYgKGluZm8tPm90Zy5pZF9zaG9ydCkgeworCQkJdmFsLT5pbnR2YWwgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ID0gYXhwMjg4X2NoYXJnZXJfaXNfb25saW5lKGluZm8pOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gcHN5X2dldF9wcm9wX2ZhaWw7CisJCWluZm8tPm9ubGluZSA9IHJldDsKKwkJdmFsLT5pbnR2YWwgPSBpbmZvLT5vbmxpbmU7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfSEVBTFRIOgorCQl2YWwtPmludHZhbCA9IGF4cDI4OF9nZXRfY2hhcmdlcl9oZWFsdGgoaW5mbyk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX0NVUlJFTlQ6CisJCXZhbC0+aW50dmFsID0gaW5mby0+Y2MgKiAxMDAwOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9DVVJSRU5UX01BWDoKKwkJdmFsLT5pbnR2YWwgPSBpbmZvLT5tYXhfY2MgKiAxMDAwOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9WT0xUQUdFOgorCQl2YWwtPmludHZhbCA9IGluZm8tPmN2ICogMTAwMDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfVk9MVEFHRV9NQVg6CisJCXZhbC0+aW50dmFsID0gaW5mby0+bWF4X2N2ICogMTAwMDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfQ09OVFJPTF9MSU1JVDoKKwkJdmFsLT5pbnR2YWwgPSBpbmZvLT5pbmxtdCAqIDEwMDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gcHN5X2dldF9wcm9wX2ZhaWw7CisJfQorCitwc3lfZ2V0X3Byb3BfZmFpbDoKKwltdXRleF91bmxvY2soJmluZm8tPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXhwMjg4X2NoYXJnZXJfcHJvcGVydHlfaXNfd3JpdGVhYmxlKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKKwkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwKQoreworCWludCByZXQ7CisKKwlzd2l0Y2ggKHBzcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX0NVUlJFTlQ6CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfVk9MVEFHRToKKwkJcmV0ID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gMDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgYXhwMjg4X3VzYl9wcm9wc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsCisJUE9XRVJfU1VQUExZX1BST1BfT05MSU5FLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RZUEUsCisJUE9XRVJfU1VQUExZX1BST1BfSEVBTFRILAorCVBPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9DVVJSRU5ULAorCVBPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9DVVJSRU5UX01BWCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfVk9MVEFHRSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfVk9MVEFHRV9NQVgsCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0NPTlRST0xfTElNSVQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGF4cDI4OF9jaGFyZ2VyX2Rlc2MgPSB7CisJLm5hbWUJCQk9ICJheHAyODhfY2hhcmdlciIsCisJLnR5cGUJCQk9IFBPV0VSX1NVUFBMWV9UWVBFX1VTQiwKKwkucHJvcGVydGllcwkJPSBheHAyODhfdXNiX3Byb3BzLAorCS5udW1fcHJvcGVydGllcwkJPSBBUlJBWV9TSVpFKGF4cDI4OF91c2JfcHJvcHMpLAorCS5nZXRfcHJvcGVydHkJCT0gYXhwMjg4X2NoYXJnZXJfdXNiX2dldF9wcm9wZXJ0eSwKKwkuc2V0X3Byb3BlcnR5CQk9IGF4cDI4OF9jaGFyZ2VyX3VzYl9zZXRfcHJvcGVydHksCisJLnByb3BlcnR5X2lzX3dyaXRlYWJsZQk9IGF4cDI4OF9jaGFyZ2VyX3Byb3BlcnR5X2lzX3dyaXRlYWJsZSwKK307CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBheHAyODhfY2hhcmdlcl9pcnFfdGhyZWFkX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2KQoreworCXN0cnVjdCBheHAyODhfY2hyZ19pbmZvICppbmZvID0gZGV2OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IENIUkdfSU5UUl9FTkQ7IGkrKykgeworCQlpZiAoaW5mby0+aXJxW2ldID09IGlycSkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID49IENIUkdfSU5UUl9FTkQpIHsKKwkJZGV2X3dhcm4oJmluZm8tPnBkZXYtPmRldiwgInNwdXJpb3VzIGludGVycnVwdCEhXG4iKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCXN3aXRjaCAoaSkgeworCWNhc2UgVkJVU19PVl9JUlE6CisJCWRldl9kYmcoJmluZm8tPnBkZXYtPmRldiwgIlZCVVMgT3ZlciBWb2x0YWdlIElOVFJcbiIpOworCQlicmVhazsKKwljYXNlIENIQVJHRV9ET05FX0lSUToKKwkJZGV2X2RiZygmaW5mby0+cGRldi0+ZGV2LCAiQ2hhcmdpbmcgRG9uZSBJTlRSXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBDSEFSR0VfQ0hBUkdJTkdfSVJROgorCQlkZXZfZGJnKCZpbmZvLT5wZGV2LT5kZXYsICJTdGFydCBDaGFyZ2luZyBJUlFcbiIpOworCQlicmVhazsKKwljYXNlIEJBVF9TQUZFX1FVSVRfSVJROgorCQlkZXZfZGJnKCZpbmZvLT5wZGV2LT5kZXYsCisJCQkiUXVpdCBTYWZlIE1vZGUocmVzdGFydCB0aW1lcikgQ2hhcmdpbmcgSVJRXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBCQVRfU0FGRV9FTlRFUl9JUlE6CisJCWRldl9kYmcoJmluZm8tPnBkZXYtPmRldiwKKwkJCSJFbnRlciBTYWZlIE1vZGUodGltZXIgZXhwaXJlKSBDaGFyZ2luZyBJUlFcbiIpOworCQlicmVhazsKKwljYXNlIFFDQlRVX0lSUToKKwkJZGV2X2RiZygmaW5mby0+cGRldi0+ZGV2LAorCQkJIlF1aXQgQmF0dGVyeSBVbmRlciBUZW1wZXJhdHVyZShDSFJHKSBJTlRSXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBDQlRVX0lSUToKKwkJZGV2X2RiZygmaW5mby0+cGRldi0+ZGV2LAorCQkJIkhpdCBCYXR0ZXJ5IFVuZGVyIFRlbXBlcmF0dXJlKENIUkcpIElOVFJcbiIpOworCQlicmVhazsKKwljYXNlIFFDQlRPX0lSUToKKwkJZGV2X2RiZygmaW5mby0+cGRldi0+ZGV2LAorCQkJIlF1aXQgQmF0dGVyeSBPdmVyIFRlbXBlcmF0dXJlKENIUkcpIElOVFJcbiIpOworCQlicmVhazsKKwljYXNlIENCVE9fSVJROgorCQlkZXZfZGJnKCZpbmZvLT5wZGV2LT5kZXYsCisJCQkiSGl0IEJhdHRlcnkgT3ZlciBUZW1wZXJhdHVyZShDSFJHKSBJTlRSXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oJmluZm8tPnBkZXYtPmRldiwgIlNwdXJpb3VzIEludGVycnVwdCEhIVxuIik7CisJCWdvdG8gb3V0OworCX0KKworCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGluZm8tPnBzeV91c2IpOworb3V0OgorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgYXhwMjg4X2NoYXJnZXJfZXh0Y29uX2V2dF93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBheHAyODhfY2hyZ19pbmZvICppbmZvID0KKwkgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBheHAyODhfY2hyZ19pbmZvLCBjYWJsZS53b3JrKTsKKwlpbnQgcmV0LCBjdXJyZW50X2xpbWl0OworCWJvb2wgY2hhbmdlZCA9IGZhbHNlOworCXN0cnVjdCBleHRjb25fZGV2ICplZGV2ID0gaW5mby0+Y2FibGUuZWRldjsKKwlib29sIG9sZF9jb25uZWN0ZWQgPSBpbmZvLT5jYWJsZS5jb25uZWN0ZWQ7CisKKwkvKiBEZXRlcm1pbmUgY2FibGUvY2hhcmdlciB0eXBlICovCisJaWYgKGV4dGNvbl9nZXRfY2FibGVfc3RhdGVfKGVkZXYsIEVYVENPTl9DSEdfVVNCX1NEUCkgPiAwKSB7CisJCWRldl9kYmcoJmluZm8tPnBkZXYtPmRldiwgIlVTQiBTRFAgY2hhcmdlciAgaXMgY29ubmVjdGVkIik7CisJCWluZm8tPmNhYmxlLmNvbm5lY3RlZCA9IHRydWU7CisJCWluZm8tPmNhYmxlLmNoZ190eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfVVNCOworCX0gZWxzZSBpZiAoZXh0Y29uX2dldF9jYWJsZV9zdGF0ZV8oZWRldiwgRVhUQ09OX0NIR19VU0JfQ0RQKSA+IDApIHsKKwkJZGV2X2RiZygmaW5mby0+cGRldi0+ZGV2LCAiVVNCIENEUCBjaGFyZ2VyIGlzIGNvbm5lY3RlZCIpOworCQlpbmZvLT5jYWJsZS5jb25uZWN0ZWQgPSB0cnVlOworCQlpbmZvLT5jYWJsZS5jaGdfdHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX1VTQl9DRFA7CisJfSBlbHNlIGlmIChleHRjb25fZ2V0X2NhYmxlX3N0YXRlXyhlZGV2LCBFWFRDT05fQ0hHX1VTQl9EQ1ApID4gMCkgeworCQlkZXZfZGJnKCZpbmZvLT5wZGV2LT5kZXYsICJVU0IgRENQIGNoYXJnZXIgaXMgY29ubmVjdGVkIik7CisJCWluZm8tPmNhYmxlLmNvbm5lY3RlZCA9IHRydWU7CisJCWluZm8tPmNhYmxlLmNoZ190eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfVVNCX0RDUDsKKwl9IGVsc2UgeworCQlpZiAob2xkX2Nvbm5lY3RlZCkKKwkJCWRldl9kYmcoJmluZm8tPnBkZXYtPmRldiwgIlVTQiBjaGFyZ2VyIGRpc2Nvbm5lY3RlZCIpOworCQlpbmZvLT5jYWJsZS5jb25uZWN0ZWQgPSBmYWxzZTsKKwkJaW5mby0+Y2FibGUuY2hnX3R5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9VU0I7CisJfQorCisJLyogQ2FibGUgc3RhdHVzIGNoYW5nZWQgKi8KKwlpZiAob2xkX2Nvbm5lY3RlZCAhPSBpbmZvLT5jYWJsZS5jb25uZWN0ZWQpCisJCWNoYW5nZWQgPSB0cnVlOworCisJaWYgKCFjaGFuZ2VkKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZpbmZvLT5sb2NrKTsKKworCWlmIChpbmZvLT5pc19jaGFyZ2VyX2VuYWJsZWQgJiYgIWluZm8tPmNhYmxlLmNvbm5lY3RlZCkgeworCQlpbmZvLT5lbmFibGVfY2hhcmdlciA9IGZhbHNlOworCQlyZXQgPSBheHAyODhfY2hhcmdlcl9lbmFibGVfY2hhcmdlcihpbmZvLCBpbmZvLT5lbmFibGVfY2hhcmdlcik7CisJCWlmIChyZXQgPCAwKQorCQkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LAorCQkJCSJjYW5ub3QgZGlzYWJsZSBjaGFyZ2VyICglZCkiLCByZXQpOworCisJfSBlbHNlIGlmICghaW5mby0+aXNfY2hhcmdlcl9lbmFibGVkICYmIGluZm8tPmNhYmxlLmNvbm5lY3RlZCkgeworCQlzd2l0Y2ggKGluZm8tPmNhYmxlLmNoZ190eXBlKSB7CisJCWNhc2UgUE9XRVJfU1VQUExZX1RZUEVfVVNCOgorCQkJY3VycmVudF9saW1pdCA9IElMSU1fNTAwTUE7CisJCQlicmVhazsKKwkJY2FzZSBQT1dFUl9TVVBQTFlfVFlQRV9VU0JfQ0RQOgorCQkJY3VycmVudF9saW1pdCA9IElMSU1fMTUwME1BOworCQkJYnJlYWs7CisJCWNhc2UgUE9XRVJfU1VQUExZX1RZUEVfVVNCX0RDUDoKKwkJCWN1cnJlbnRfbGltaXQgPSBJTElNXzIwMDBNQTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogVW5rbm93biAqLworCQkJY3VycmVudF9saW1pdCA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFNldCB2YnVzIGN1cnJlbnQgbGltaXQgZmlyc3QsIHRoZW4gZW5hYmxlIGNoYXJnZXIgKi8KKwkJcmV0ID0gYXhwMjg4X2NoYXJnZXJfc2V0X3ZidXNfaW5sbXQoaW5mbywgY3VycmVudF9saW1pdCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsCisJCQkJImVycm9yIHNldHRpbmcgY3VycmVudCBsaW1pdCAoJWQpIiwgcmV0KTsKKwkJfSBlbHNlIHsKKwkJCWluZm8tPmVuYWJsZV9jaGFyZ2VyID0gKGN1cnJlbnRfbGltaXQgPiAwKTsKKwkJCXJldCA9IGF4cDI4OF9jaGFyZ2VyX2VuYWJsZV9jaGFyZ2VyKGluZm8sCisJCQkJCQkJaW5mby0+ZW5hYmxlX2NoYXJnZXIpOworCQkJaWYgKHJldCA8IDApCisJCQkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LAorCQkJCQkiY2Fubm90IGVuYWJsZSBjaGFyZ2VyICglZCkiLCByZXQpOworCQl9CisJfQorCisJaWYgKGNoYW5nZWQpCisJCWluZm8tPmhlYWx0aCA9IGF4cDI4OF9nZXRfY2hhcmdlcl9oZWFsdGgoaW5mbyk7CisKKwltdXRleF91bmxvY2soJmluZm8tPmxvY2spOworCisJaWYgKGNoYW5nZWQpCisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGluZm8tPnBzeV91c2IpOworfQorCitzdGF0aWMgaW50IGF4cDI4OF9jaGFyZ2VyX2hhbmRsZV9jYWJsZV9ldnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkJICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwYXJhbSkKK3sKKwlzdHJ1Y3QgYXhwMjg4X2NocmdfaW5mbyAqaW5mbyA9CisJICAgIGNvbnRhaW5lcl9vZihuYiwgc3RydWN0IGF4cDI4OF9jaHJnX2luZm8sIGNhYmxlLm5iKTsKKworCXNjaGVkdWxlX3dvcmsoJmluZm8tPmNhYmxlLndvcmspOworCisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHZvaWQgYXhwMjg4X2NoYXJnZXJfb3RnX2V2dF93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBheHAyODhfY2hyZ19pbmZvICppbmZvID0KKwkgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBheHAyODhfY2hyZ19pbmZvLCBvdGcud29yayk7CisJaW50IHJldDsKKworCS8qIERpc2FibGUgVkJVUyBwYXRoIGJlZm9yZSBlbmFibGluZyB0aGUgNVYgYm9vc3QgKi8KKwlyZXQgPSBheHAyODhfY2hhcmdlcl92YnVzX3BhdGhfc2VsZWN0KGluZm8sICFpbmZvLT5vdGcuaWRfc2hvcnQpOworCWlmIChyZXQgPCAwKQorCQlkZXZfd2FybigmaW5mby0+cGRldi0+ZGV2LCAidmJ1cyBwYXRoIGRpc2FibGUgZmFpbGVkXG4iKTsKK30KKworc3RhdGljIGludCBheHAyODhfY2hhcmdlcl9oYW5kbGVfb3RnX2V2dChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnBhcmFtKQoreworCXN0cnVjdCBheHAyODhfY2hyZ19pbmZvICppbmZvID0KKwkgICAgY29udGFpbmVyX29mKG5iLCBzdHJ1Y3QgYXhwMjg4X2NocmdfaW5mbywgb3RnLmlkX25iKTsKKwlzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiA9IGluZm8tPm90Zy5jYWJsZTsKKwlpbnQgdXNiX2hvc3QgPSBleHRjb25fZ2V0X2NhYmxlX3N0YXRlXyhlZGV2LCBFWFRDT05fVVNCX0hPU1QpOworCisJZGV2X2RiZygmaW5mby0+cGRldi0+ZGV2LCAiZXh0ZXJuYWwgY29ubmVjdG9yIFVTQi1Ib3N0IGlzICVzXG4iLAorCQkJCXVzYl9ob3N0ID8gImF0dGFjaGVkIiA6ICJkZXRhY2hlZCIpOworCisJLyoKKwkgKiBTZXQgdXNiX2lkX3Nob3J0IGZsYWcgdG8gYXZvaWQgcnVubmluZyBjaGFyZ2VyIGRldGVjdGlvbiBsb2dpYworCSAqIGluIGNhc2UgdXNiIGhvc3QuCisJICovCisJaW5mby0+b3RnLmlkX3Nob3J0ID0gdXNiX2hvc3Q7CisJc2NoZWR1bGVfd29yaygmaW5mby0+b3RnLndvcmspOworCisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHZvaWQgY2hhcmdlcl9pbml0X2h3X3JlZ3Moc3RydWN0IGF4cDI4OF9jaHJnX2luZm8gKmluZm8pCit7CisJaW50IHJldCwgY2MsIGN2OworCXVuc2lnbmVkIGludCB2YWw7CisKKwkvKiBQcm9ncmFtIHRlbXBlcmF0dXJlIHRocmVzaG9sZHMgKi8KKwlyZXQgPSByZWdtYXBfd3JpdGUoaW5mby0+cmVnbWFwLCBBWFAyMFhfVl9MVEZfQ0hSRywgQ0hSR19WTFRGQ18wQyk7CisJaWYgKHJldCA8IDApCisJCWRldl93YXJuKCZpbmZvLT5wZGV2LT5kZXYsICJyZWdpc3RlcigleCkgd3JpdGUgZXJyb3IoJWQpXG4iLAorCQkJCQkJCUFYUDIwWF9WX0xURl9DSFJHLCByZXQpOworCisJcmV0ID0gcmVnbWFwX3dyaXRlKGluZm8tPnJlZ21hcCwgQVhQMjBYX1ZfSFRGX0NIUkcsIENIUkdfVkhURkNfNDVDKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X3dhcm4oJmluZm8tPnBkZXYtPmRldiwgInJlZ2lzdGVyKCV4KSB3cml0ZSBlcnJvciglZClcbiIsCisJCQkJCQkJQVhQMjBYX1ZfSFRGX0NIUkcsIHJldCk7CisKKwkvKiBEbyBub3QgdHVybi1vZmYgY2hhcmdlciBvL3AgYWZ0ZXIgY2hhcmdlIGN5Y2xlIGVuZHMgKi8KKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoaW5mby0+cmVnbWFwLAorCQkJCUFYUDIwWF9DSFJHX0NUUkwyLAorCQkJCUNOVEwyX0NIR19PVVRfVFVSTk9OLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X3dhcm4oJmluZm8tPnBkZXYtPmRldiwgInJlZ2lzdGVyKCV4KSB3cml0ZSBlcnJvciglZClcbiIsCisJCQkJCQlBWFAyMFhfQ0hSR19DVFJMMiwgcmV0KTsKKworCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGluZm8tPnJlZ21hcCwKKwkJCQlBWFAyMFhfSVJRMl9FTiwKKwkJCQlCQVRfSVJRX0NGR19CQVRfTUFTSywgMSk7CisJaWYgKHJldCA8IDApCisJCWRldl93YXJuKCZpbmZvLT5wZGV2LT5kZXYsICJyZWdpc3RlcigleCkgd3JpdGUgZXJyb3IoJWQpXG4iLAorCQkJCQkJQVhQMjBYX0lSUTJfRU4sIHJldCk7CisKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoaW5mby0+cmVnbWFwLCBBWFAyMFhfSVJRM19FTiwKKwkJCQlURU1QX0lSUV9DRkdfTUFTSywgMSk7CisJaWYgKHJldCA8IDApCisJCWRldl93YXJuKCZpbmZvLT5wZGV2LT5kZXYsICJyZWdpc3RlcigleCkgd3JpdGUgZXJyb3IoJWQpXG4iLAorCQkJCQkJQVhQMjBYX0lSUTNfRU4sIHJldCk7CisKKwkvKiBTZXR1cCBlbmRpbmcgY29uZGl0aW9uIGZvciBjaGFyZ2luZyB0byBiZSAxMCUgb2YgSShjaHJnKSAqLworCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhpbmZvLT5yZWdtYXAsCisJCQkJQVhQMjBYX0NIUkdfQ1RSTDEsCisJCQkJQ0hSR19DQ0NWX0lURVJNXzIwUCwgMCk7CisJaWYgKHJldCA8IDApCisJCWRldl93YXJuKCZpbmZvLT5wZGV2LT5kZXYsICJyZWdpc3RlcigleCkgd3JpdGUgZXJyb3IoJWQpXG4iLAorCQkJCQkJQVhQMjBYX0NIUkdfQ1RSTDEsIHJldCk7CisKKwkvKiBEaXNhYmxlIE9DVi1TT0MgY3VydmUgY2FsaWJyYXRpb24gKi8KKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoaW5mby0+cmVnbWFwLAorCQkJCUFYUDIwWF9DQ19DVFJMLAorCQkJCUZHX0NOVExfT0NWX0FESl9FTiwgMCk7CisJaWYgKHJldCA8IDApCisJCWRldl93YXJuKCZpbmZvLT5wZGV2LT5kZXYsICJyZWdpc3RlcigleCkgd3JpdGUgZXJyb3IoJWQpXG4iLAorCQkJCQkJQVhQMjBYX0NDX0NUUkwsIHJldCk7CisKKwkvKiBJbml0IGNoYXJnaW5nIGN1cnJlbnQgYW5kIHZvbHRhZ2UgKi8KKwlpbmZvLT5tYXhfY2MgPSBpbmZvLT5wZGF0YS0+bWF4X2NjOworCWluZm8tPm1heF9jdiA9IGluZm8tPnBkYXRhLT5tYXhfY3Y7CisKKwkvKiBSZWFkIGN1cnJlbnQgY2hhcmdlIHZvbHRhZ2UgYW5kIGN1cnJlbnQgbGltaXQgKi8KKwlyZXQgPSByZWdtYXBfcmVhZChpbmZvLT5yZWdtYXAsIEFYUDIwWF9DSFJHX0NUUkwxLCAmdmFsKTsKKwlpZiAocmV0IDwgMCkgeworCQkvKiBBc3N1bWUgZGVmYXVsdCBpZiBjYW5ub3QgcmVhZCAqLworCQlpbmZvLT5jYyA9IGluZm8tPnBkYXRhLT5kZWZfY2M7CisJCWluZm8tPmN2ID0gaW5mby0+cGRhdGEtPmRlZl9jdjsKKwl9IGVsc2UgeworCQkvKiBEZXRlcm1pbmUgY2hhcmdlIHZvbHRhZ2UgKi8KKwkJY3YgPSAodmFsICYgQ0hSR19DQ0NWX0NWX01BU0spID4+IENIUkdfQ0NDVl9DVl9CSVRfUE9TOworCQlzd2l0Y2ggKGN2KSB7CisJCWNhc2UgQ0hSR19DQ0NWX0NWXzQxMDBNVjoKKwkJCWluZm8tPmN2ID0gQ1ZfNDEwME1WOworCQkJYnJlYWs7CisJCWNhc2UgQ0hSR19DQ0NWX0NWXzQxNTBNVjoKKwkJCWluZm8tPmN2ID0gQ1ZfNDE1ME1WOworCQkJYnJlYWs7CisJCWNhc2UgQ0hSR19DQ0NWX0NWXzQyMDBNVjoKKwkJCWluZm8tPmN2ID0gQ1ZfNDIwME1WOworCQkJYnJlYWs7CisJCWNhc2UgQ0hSR19DQ0NWX0NWXzQzNTBNVjoKKwkJCWluZm8tPmN2ID0gQ1ZfNDM1ME1WOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpbmZvLT5jdiA9IElOVF9NQVg7CisJCQlicmVhazsKKwkJfQorCisJCS8qIERldGVybWluZSBjaGFyZ2UgY3VycmVudCBsaW1pdCAqLworCQljYyA9IChyZXQgJiBDSFJHX0NDQ1ZfQ0NfTUFTSykgPj4gQ0hSR19DQ0NWX0NDX0JJVF9QT1M7CisJCWNjID0gKGNjICogQ0hSR19DQ0NWX0NDX0xTQl9SRVMpICsgQ0hSR19DQ0NWX0NDX09GRlNFVDsKKwkJaW5mby0+Y2MgPSBjYzsKKworCQkvKiBQcm9ncmFtIGRlZmF1bHQgY2hhcmdpbmcgdm9sdGFnZSBhbmQgY3VycmVudCAqLworCQljYyA9IG1pbihpbmZvLT5wZGF0YS0+ZGVmX2NjLCBpbmZvLT5tYXhfY2MpOworCQljdiA9IG1pbihpbmZvLT5wZGF0YS0+ZGVmX2N2LCBpbmZvLT5tYXhfY3YpOworCisJCXJldCA9IGF4cDI4OF9jaGFyZ2VyX3NldF9jYyhpbmZvLCBjYyk7CisJCWlmIChyZXQgPCAwKQorCQkJZGV2X3dhcm4oJmluZm8tPnBkZXYtPmRldiwKKwkJCQkJImVycm9yKCVkKSBpbiBzZXR0aW5nIENDXG4iLCByZXQpOworCisJCXJldCA9IGF4cDI4OF9jaGFyZ2VyX3NldF9jdihpbmZvLCBjdik7CisJCWlmIChyZXQgPCAwKQorCQkJZGV2X3dhcm4oJmluZm8tPnBkZXYtPmRldiwKKwkJCQkJImVycm9yKCVkKSBpbiBzZXR0aW5nIENWXG4iLCByZXQpOworCX0KK30KKworc3RhdGljIGludCBheHAyODhfY2hhcmdlcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXQsIGksIHBpcnE7CisJc3RydWN0IGF4cDI4OF9jaHJnX2luZm8gKmluZm87CisJc3RydWN0IGF4cDIweF9kZXYgKmF4cDIweCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBjaGFyZ2VyX2NmZyA9IHt9OworCisJaW5mbyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8pCisJCXJldHVybiAtRU5PTUVNOworCisJaW5mby0+cGRldiA9IHBkZXY7CisJaW5mby0+cmVnbWFwID0gYXhwMjB4LT5yZWdtYXA7CisJaW5mby0+cmVnbWFwX2lycWMgPSBheHAyMHgtPnJlZ21hcF9pcnFjOworCWluZm8tPnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAoIWluZm8tPnBkYXRhKSB7CisJCS8qIFRyeSBBQ1BJIHByb3ZpZGVkIHBkYXRhIHZpYSBkZXZpY2UgcHJvcGVydGllcyAqLworCQlpZiAoIWRldmljZV9wcm9wZXJ0eV9wcmVzZW50KCZwZGV2LT5kZXYsCisJCQkJCQkiYXhwMjg4X2NoYXJnZXJfZGF0YVxuIikpCisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IHBsYXRmb3JtIGRhdGFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpbmZvLT5jYWJsZS5lZGV2ID0gZXh0Y29uX2dldF9leHRjb25fZGV2KEFYUDI4OF9FWFRDT05fREVWX05BTUUpOworCWlmIChpbmZvLT5jYWJsZS5lZGV2ID09IE5VTEwpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXMgaXMgbm90IHJlYWR5LCBwcm9iZSBkZWZlcnJlZFxuIiwKKwkJCUFYUDI4OF9FWFRDT05fREVWX05BTUUpOworCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKwl9CisKKwkvKiBSZWdpc3RlciBmb3IgZXh0Y29uIG5vdGlmaWNhdGlvbiAqLworCUlOSVRfV09SSygmaW5mby0+Y2FibGUud29yaywgYXhwMjg4X2NoYXJnZXJfZXh0Y29uX2V2dF93b3JrZXIpOworCWluZm8tPmNhYmxlLm5iLm5vdGlmaWVyX2NhbGwgPSBheHAyODhfY2hhcmdlcl9oYW5kbGVfY2FibGVfZXZ0OworCXJldCA9IGV4dGNvbl9yZWdpc3Rlcl9ub3RpZmllcihpbmZvLT5jYWJsZS5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TRFAsCisJCQkJCSZpbmZvLT5jYWJsZS5uYik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsCisJCQkiZmFpbGVkIHRvIHJlZ2lzdGVyIGV4dGNvbiBub3RpZmllciBmb3IgU0RQICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGV4dGNvbl9yZWdpc3Rlcl9ub3RpZmllcihpbmZvLT5jYWJsZS5lZGV2LCBFWFRDT05fQ0hHX1VTQl9DRFAsCisJCQkJCSZpbmZvLT5jYWJsZS5uYik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsCisJCQkiZmFpbGVkIHRvIHJlZ2lzdGVyIGV4dGNvbiBub3RpZmllciBmb3IgQ0RQICVkXG4iLCByZXQpOworCQlleHRjb25fdW5yZWdpc3Rlcl9ub3RpZmllcihpbmZvLT5jYWJsZS5lZGV2LAorCQkJCUVYVENPTl9DSEdfVVNCX1NEUCwgJmluZm8tPmNhYmxlLm5iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBleHRjb25fcmVnaXN0ZXJfbm90aWZpZXIoaW5mby0+Y2FibGUuZWRldiwgRVhUQ09OX0NIR19VU0JfRENQLAorCQkJCQkmaW5mby0+Y2FibGUubmIpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LAorCQkJImZhaWxlZCB0byByZWdpc3RlciBleHRjb24gbm90aWZpZXIgZm9yIERDUCAlZFxuIiwgcmV0KTsKKwkJZXh0Y29uX3VucmVnaXN0ZXJfbm90aWZpZXIoaW5mby0+Y2FibGUuZWRldiwKKwkJCQlFWFRDT05fQ0hHX1VTQl9TRFAsICZpbmZvLT5jYWJsZS5uYik7CisJCWV4dGNvbl91bnJlZ2lzdGVyX25vdGlmaWVyKGluZm8tPmNhYmxlLmVkZXYsCisJCQkJRVhUQ09OX0NIR19VU0JfQ0RQLCAmaW5mby0+Y2FibGUubmIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGluZm8pOworCW11dGV4X2luaXQoJmluZm8tPmxvY2spOworCisJLyogUmVnaXN0ZXIgd2l0aCBwb3dlciBzdXBwbHkgY2xhc3MgKi8KKwljaGFyZ2VyX2NmZy5kcnZfZGF0YSA9IGluZm87CisJaW5mby0+cHN5X3VzYiA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmYXhwMjg4X2NoYXJnZXJfZGVzYywKKwkJCQkJCSZjaGFyZ2VyX2NmZyk7CisJaWYgKElTX0VSUihpbmZvLT5wc3lfdXNiKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgcG93ZXIgc3VwcGx5IGNoYXJnZXJcbiIpOworCQlyZXQgPSBQVFJfRVJSKGluZm8tPnBzeV91c2IpOworCQlnb3RvIHBzeV9yZWdfZmFpbGVkOworCX0KKworCS8qIFJlZ2lzdGVyIGZvciBPVEcgbm90aWZpY2F0aW9uICovCisJSU5JVF9XT1JLKCZpbmZvLT5vdGcud29yaywgYXhwMjg4X2NoYXJnZXJfb3RnX2V2dF93b3JrZXIpOworCWluZm8tPm90Zy5pZF9uYi5ub3RpZmllcl9jYWxsID0gYXhwMjg4X2NoYXJnZXJfaGFuZGxlX290Z19ldnQ7CisJcmV0ID0gZXh0Y29uX3JlZ2lzdGVyX25vdGlmaWVyKGluZm8tPm90Zy5jYWJsZSwgRVhUQ09OX1VTQl9IT1NULAorCQkJCSAgICAgICAmaW5mby0+b3RnLmlkX25iKTsKKwlpZiAocmV0KQorCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIG90ZyBub3RpZmllclxuIik7CisKKwlpZiAoaW5mby0+b3RnLmNhYmxlKQorCQlpbmZvLT5vdGcuaWRfc2hvcnQgPSBleHRjb25fZ2V0X2NhYmxlX3N0YXRlXygKKwkJCQkJaW5mby0+b3RnLmNhYmxlLCBFWFRDT05fVVNCX0hPU1QpOworCisJLyogUmVnaXN0ZXIgY2hhcmdlciBpbnRlcnJ1cHRzICovCisJZm9yIChpID0gMDsgaSA8IENIUkdfSU5UUl9FTkQ7IGkrKykgeworCQlwaXJxID0gcGxhdGZvcm1fZ2V0X2lycShpbmZvLT5wZGV2LCBpKTsKKwkJaW5mby0+aXJxW2ldID0gcmVnbWFwX2lycV9nZXRfdmlycShpbmZvLT5yZWdtYXBfaXJxYywgcGlycSk7CisJCWlmIChpbmZvLT5pcnFbaV0gPCAwKSB7CisJCQlkZXZfd2FybigmaW5mby0+cGRldi0+ZGV2LAorCQkJCSJmYWlsZWQgdG8gZ2V0IHZpcnR1YWwgaW50ZXJydXB0PSVkXG4iLCBwaXJxKTsKKwkJCXJldCA9IGluZm8tPmlycVtpXTsKKwkJCWdvdG8gaW50cl9yZWdfZmFpbGVkOworCQl9CisJCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoJmluZm8tPnBkZXYtPmRldiwgaW5mby0+aXJxW2ldLAorCQkJCQlOVUxMLCBheHAyODhfY2hhcmdlcl9pcnFfdGhyZWFkX2hhbmRsZXIsCisJCQkJCUlSUUZfT05FU0hPVCwgaW5mby0+cGRldi0+bmFtZSwgaW5mbyk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IGludGVycnVwdD0lZFxuIiwKKwkJCQkJCQkJaW5mby0+aXJxW2ldKTsKKwkJCWdvdG8gaW50cl9yZWdfZmFpbGVkOworCQl9CisJfQorCisJY2hhcmdlcl9pbml0X2h3X3JlZ3MoaW5mbyk7CisKKwlyZXR1cm4gMDsKKworaW50cl9yZWdfZmFpbGVkOgorCWlmIChpbmZvLT5vdGcuY2FibGUpCisJCWV4dGNvbl91bnJlZ2lzdGVyX25vdGlmaWVyKGluZm8tPm90Zy5jYWJsZSwgRVhUQ09OX1VTQl9IT1NULAorCQkJCQkmaW5mby0+b3RnLmlkX25iKTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihpbmZvLT5wc3lfdXNiKTsKK3BzeV9yZWdfZmFpbGVkOgorCWV4dGNvbl91bnJlZ2lzdGVyX25vdGlmaWVyKGluZm8tPmNhYmxlLmVkZXYsIEVYVENPTl9DSEdfVVNCX1NEUCwKKwkJCQkJJmluZm8tPmNhYmxlLm5iKTsKKwlleHRjb25fdW5yZWdpc3Rlcl9ub3RpZmllcihpbmZvLT5jYWJsZS5lZGV2LCBFWFRDT05fQ0hHX1VTQl9DRFAsCisJCQkJCSZpbmZvLT5jYWJsZS5uYik7CisJZXh0Y29uX3VucmVnaXN0ZXJfbm90aWZpZXIoaW5mby0+Y2FibGUuZWRldiwgRVhUQ09OX0NIR19VU0JfRENQLAorCQkJCQkmaW5mby0+Y2FibGUubmIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXhwMjg4X2NoYXJnZXJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGF4cDI4OF9jaHJnX2luZm8gKmluZm8gPSAgZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCisJaWYgKGluZm8tPm90Zy5jYWJsZSkKKwkJZXh0Y29uX3VucmVnaXN0ZXJfbm90aWZpZXIoaW5mby0+b3RnLmNhYmxlLCBFWFRDT05fVVNCX0hPU1QsCisJCQkJCSZpbmZvLT5vdGcuaWRfbmIpOworCisJZXh0Y29uX3VucmVnaXN0ZXJfbm90aWZpZXIoaW5mby0+Y2FibGUuZWRldiwgRVhUQ09OX0NIR19VU0JfU0RQLAorCQkJCQkmaW5mby0+Y2FibGUubmIpOworCWV4dGNvbl91bnJlZ2lzdGVyX25vdGlmaWVyKGluZm8tPmNhYmxlLmVkZXYsIEVYVENPTl9DSEdfVVNCX0NEUCwKKwkJCQkJJmluZm8tPmNhYmxlLm5iKTsKKwlleHRjb25fdW5yZWdpc3Rlcl9ub3RpZmllcihpbmZvLT5jYWJsZS5lZGV2LCBFWFRDT05fQ0hHX1VTQl9EQ1AsCisJCQkJCSZpbmZvLT5jYWJsZS5uYik7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoaW5mby0+cHN5X3VzYik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXhwMjg4X2NoYXJnZXJfZHJpdmVyID0geworCS5wcm9iZSA9IGF4cDI4OF9jaGFyZ2VyX3Byb2JlLAorCS5yZW1vdmUgPSBheHAyODhfY2hhcmdlcl9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYXhwMjg4X2NoYXJnZXIiLAorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGF4cDI4OF9jaGFyZ2VyX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIlJhbWFrcmlzaG5hIFBhbGxhbGEgPHJhbWFrcmlzaG5hLnBhbGxhbGFAaW50ZWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJYLXBvd2VyIEFYUDI4OCBDaGFyZ2VyIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9zdXBwbHkvYXhwMjg4X2Z1ZWxfZ2F1Z2UuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L2F4cDI4OF9mdWVsX2dhdWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJkZGU2OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L2F4cDI4OF9mdWVsX2dhdWdlLmMKQEAgLTAsMCArMSwxMTU0IEBACisvKgorICogYXhwMjg4X2Z1ZWxfZ2F1Z2UuYyAtIFhwb3dlciBBWFAyODggUE1JQyBGdWVsIEdhdWdlIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLglTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9heHAyMHguaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworI2RlZmluZSBDSFJHX1NUQVRfQkFUX1NBRkVfTU9ERQkJKDEgPDwgMykKKyNkZWZpbmUgQ0hSR19TVEFUX0JBVF9WQUxJRAkJCSgxIDw8IDQpCisjZGVmaW5lIENIUkdfU1RBVF9CQVRfUFJFU0VOVAkJKDEgPDwgNSkKKyNkZWZpbmUgQ0hSR19TVEFUX0NIQVJHSU5HCQkJKDEgPDwgNikKKyNkZWZpbmUgQ0hSR19TVEFUX1BNSUNfT1RQCQkJKDEgPDwgNykKKworI2RlZmluZSBDSFJHX0NDQ1ZfQ0NfTUFTSwkJCTB4ZiAgICAgLyogNCBiaXRzICovCisjZGVmaW5lIENIUkdfQ0NDVl9DQ19CSVRfUE9TCQkwCisjZGVmaW5lIENIUkdfQ0NDVl9DQ19PRkZTRVQJCQkyMDAgICAgIC8qIDIwMG1BICovCisjZGVmaW5lIENIUkdfQ0NDVl9DQ19MU0JfUkVTCQkyMDAgICAgIC8qIDIwMG1BICovCisjZGVmaW5lIENIUkdfQ0NDVl9JVEVSTV8yMFAJCQkoMSA8PCA0KSAgICAvKiAyMCUgb2YgQ0MgKi8KKyNkZWZpbmUgQ0hSR19DQ0NWX0NWX01BU0sJCQkweDYwICAgICAgICAvKiAyIGJpdHMgKi8KKyNkZWZpbmUgQ0hSR19DQ0NWX0NWX0JJVF9QT1MJCTUKKyNkZWZpbmUgQ0hSR19DQ0NWX0NWXzQxMDBNVgkJCTB4MCAgICAgLyogNC4xMFYgKi8KKyNkZWZpbmUgQ0hSR19DQ0NWX0NWXzQxNTBNVgkJCTB4MSAgICAgLyogNC4xNVYgKi8KKyNkZWZpbmUgQ0hSR19DQ0NWX0NWXzQyMDBNVgkJCTB4MiAgICAgLyogNC4yMFYgKi8KKyNkZWZpbmUgQ0hSR19DQ0NWX0NWXzQzNTBNVgkJCTB4MyAgICAgLyogNC4zNVYgKi8KKyNkZWZpbmUgQ0hSR19DQ0NWX0NIR19FTgkJCSgxIDw8IDcpCisKKyNkZWZpbmUgQ1ZfNDEwMAkJCQkJCTQxMDAgICAgLyogNDEwMG1WICovCisjZGVmaW5lIENWXzQxNTAJCQkJCQk0MTUwICAgIC8qIDQxNTBtViAqLworI2RlZmluZSBDVl80MjAwCQkJCQkJNDIwMCAgICAvKiA0MjAwbVYgKi8KKyNkZWZpbmUgQ1ZfNDM1MAkJCQkJCTQzNTAgICAgLyogNDM1MG1WICovCisKKyNkZWZpbmUgVEVNUF9JUlFfQ0ZHX1FXQlRVCQkJKDEgPDwgMCkKKyNkZWZpbmUgVEVNUF9JUlFfQ0ZHX1dCVFUJCQkoMSA8PCAxKQorI2RlZmluZSBURU1QX0lSUV9DRkdfUVdCVE8JCQkoMSA8PCAyKQorI2RlZmluZSBURU1QX0lSUV9DRkdfV0JUTwkJCSgxIDw8IDMpCisjZGVmaW5lIFRFTVBfSVJRX0NGR19NQVNLCQkJMHhmCisKKyNkZWZpbmUgRkdfSVJRX0NGR19MT1dCQVRUX1dMMgkJKDEgPDwgMCkKKyNkZWZpbmUgRkdfSVJRX0NGR19MT1dCQVRUX1dMMQkJKDEgPDwgMSkKKyNkZWZpbmUgRkdfSVJRX0NGR19MT1dCQVRUX01BU0sJCTB4MworI2RlZmluZSBMT1dCQVRfSVJRX1NUQVRfTE9XQkFUVF9XTDIJKDEgPDwgMCkKKyNkZWZpbmUgTE9XQkFUX0lSUV9TVEFUX0xPV0JBVFRfV0wxCSgxIDw8IDEpCisKKyNkZWZpbmUgRkdfQ05UTF9PQ1ZfQURKX1NUQVQJCSgxIDw8IDIpCisjZGVmaW5lIEZHX0NOVExfT0NWX0FESl9FTgkJCSgxIDw8IDMpCisjZGVmaW5lIEZHX0NOVExfQ0FQX0FESl9TVEFUCQkoMSA8PCA0KQorI2RlZmluZSBGR19DTlRMX0NBUF9BREpfRU4JCQkoMSA8PCA1KQorI2RlZmluZSBGR19DTlRMX0NDX0VOCQkJCSgxIDw8IDYpCisjZGVmaW5lIEZHX0NOVExfR0FVR0VfRU4JCQkoMSA8PCA3KQorCisjZGVmaW5lIEZHX1JFUF9DQVBfVkFMSUQJCQkoMSA8PCA3KQorI2RlZmluZSBGR19SRVBfQ0FQX1ZBTF9NQVNLCQkJMHg3RgorCisjZGVmaW5lIEZHX0RFU19DQVAxX1ZBTElECQkJKDEgPDwgNykKKyNkZWZpbmUgRkdfREVTX0NBUDFfVkFMX01BU0sJCTB4N0YKKyNkZWZpbmUgRkdfREVTX0NBUDBfVkFMX01BU0sJCTB4RkYKKyNkZWZpbmUgRkdfREVTX0NBUF9SRVNfTFNCCQkJMTQ1NiAgICAvKiAxLjQ1Nm1BaHIgKi8KKworI2RlZmluZSBGR19DQ19NVFIxX1ZBTElECQkJKDEgPDwgNykKKyNkZWZpbmUgRkdfQ0NfTVRSMV9WQUxfTUFTSwkJCTB4N0YKKyNkZWZpbmUgRkdfQ0NfTVRSMF9WQUxfTUFTSwkJCTB4RkYKKyNkZWZpbmUgRkdfREVTX0NDX1JFU19MU0IJCQkxNDU2ICAgIC8qIDEuNDU2bUFociAqLworCisjZGVmaW5lIEZHX09DVl9DQVBfVkFMSUQJCQkoMSA8PCA3KQorI2RlZmluZSBGR19PQ1ZfQ0FQX1ZBTF9NQVNLCQkJMHg3RgorI2RlZmluZSBGR19DQ19DQVBfVkFMSUQJCQkJKDEgPDwgNykKKyNkZWZpbmUgRkdfQ0NfQ0FQX1ZBTF9NQVNLCQkJMHg3RgorCisjZGVmaW5lIEZHX0xPV19DQVBfVEhSMV9NQVNLCQkweGYwICAgIC8qIDUlIHRwIDIwJSAqLworI2RlZmluZSBGR19MT1dfQ0FQX1RIUjFfVkFMCQkJMHhhMCAgICAvKiAxNSBwZXJjICovCisjZGVmaW5lIEZHX0xPV19DQVBfVEhSMl9NQVNLCQkweDBmICAgIC8qIDAlIHRvIDE1JSAqLworI2RlZmluZSBGR19MT1dfQ0FQX1dBUk5fVEhSCQkJMTQgIC8qIDE0IHBlcmMgKi8KKyNkZWZpbmUgRkdfTE9XX0NBUF9DUklUX1RIUgkJCTQgICAvKiA0IHBlcmMgKi8KKyNkZWZpbmUgRkdfTE9XX0NBUF9TSEROX1RIUgkJCTAgICAvKiAwIHBlcmMgKi8KKworI2RlZmluZSBTVEFUVVNfTU9OX0RFTEFZX0pJRkZJRVMgICAgKEhaICogNjApICAgLyo2MCBzZWMgKi8KKyNkZWZpbmUgTlJfUkVUUllfQ05UICAgIDMKKyNkZWZpbmUgREVWX05BTUUJImF4cDI4OF9mdWVsX2dhdWdlIgorCisvKiAxLjFtViBwZXIgTFNCIGV4cHJlc3NlZCBpbiB1ViAqLworI2RlZmluZSBWT0xUQUdFX0ZST01fQURDKGEpCQkJKChhICogMTEpIC8gMTApCisvKiBwcm9wZXJ0aWVzIGNvbnZlcnRlZCB0byB0ZW50aHMgb2YgZGVncmVlcywgdVYsIHVBLCB1VyAqLworI2RlZmluZSBQUk9QX1RFTVAoYSkJCSgoYSkgKiAxMCkKKyNkZWZpbmUgVU5QUk9QX1RFTVAoYSkJCSgoYSkgLyAxMCkKKyNkZWZpbmUgUFJPUF9WT0xUKGEpCQkoKGEpICogMTAwMCkKKyNkZWZpbmUgUFJPUF9DVVJSKGEpCQkoKGEpICogMTAwMCkKKworI2RlZmluZSBBWFAyODhfRkdfSU5UUl9OVU0JNgorZW51bSB7CisJUVdCVFVfSVJRID0gMCwKKwlXQlRVX0lSUSwKKwlRV0JUT19JUlEsCisJV0JUT19JUlEsCisJV0wyX0lSUSwKKwlXTDFfSVJRLAorfTsKKworc3RydWN0IGF4cDI4OF9mZ19pbmZvIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXN0cnVjdCBheHAyMHhfZmdfcGRhdGEgKnBkYXRhOworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKwlzdHJ1Y3QgcmVnbWFwX2lycV9jaGlwX2RhdGEgKnJlZ21hcF9pcnFjOworCWludCBpcnFbQVhQMjg4X0ZHX0lOVFJfTlVNXTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXQ7CisJc3RydWN0IG11dGV4IGxvY2s7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHN0YXR1c19tb25pdG9yOworCXN0cnVjdCBkZW50cnkgKmRlYnVnX2ZpbGU7Cit9OworCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgZnVlbF9nYXVnZV9wcm9wc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywKKwlQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5ULAorCVBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWF9ERVNJR04sCisJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU5fREVTSUdOLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfT0NWLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZX0FMRVJUX01JTiwKKwlQT1dFUl9TVVBQTFlfUFJPUF9URU1QLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfTUFYLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfTUlOLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQUxFUlRfTUlOLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQUxFUlRfTUFYLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1ksCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTEwsCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTF9ERVNJR04sCisJUE9XRVJfU1VQUExZX1BST1BfTU9ERUxfTkFNRSwKK307CisKK3N0YXRpYyBpbnQgZnVlbF9nYXVnZV9yZWdfcmVhZGIoc3RydWN0IGF4cDI4OF9mZ19pbmZvICppbmZvLCBpbnQgcmVnKQoreworCWludCByZXQsIGk7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWZvciAoaSA9IDA7IGkgPCBOUl9SRVRSWV9DTlQ7IGkrKykgeworCQlyZXQgPSByZWdtYXBfcmVhZChpbmZvLT5yZWdtYXAsIHJlZywgJnZhbCk7CisJCWlmIChyZXQgPT0gLUVCVVNZKQorCQkJY29udGludWU7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsICJheHAyODggcmVnIHJlYWQgZXJyOiVkXG4iLCByZXQpOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludCBmdWVsX2dhdWdlX3JlZ193cml0ZWIoc3RydWN0IGF4cDI4OF9mZ19pbmZvICppbmZvLCBpbnQgcmVnLCB1OCB2YWwpCit7CisJaW50IHJldDsKKworCXJldCA9IHJlZ21hcF93cml0ZShpbmZvLT5yZWdtYXAsIHJlZywgKHVuc2lnbmVkIGludCl2YWwpOworCisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwgImF4cDI4OCByZWcgd3JpdGUgZXJyOiVkXG4iLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwbWljX3JlYWRfYWRjX3ZhbChjb25zdCBjaGFyICpuYW1lLCBpbnQgKnJhd192YWwsCisJCXN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0LCB2YWwgPSAwOworCXN0cnVjdCBpaW9fY2hhbm5lbCAqaW5kaW9fY2hhbjsKKworCWluZGlvX2NoYW4gPSBpaW9fY2hhbm5lbF9nZXQoTlVMTCwgbmFtZSk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGluZGlvX2NoYW4pKSB7CisJCXJldCA9IFBUUl9FUlIoaW5kaW9fY2hhbik7CisJCWdvdG8gZXhpdDsKKwl9CisJcmV0ID0gaWlvX3JlYWRfY2hhbm5lbF9yYXcoaW5kaW9fY2hhbiwgJnZhbCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LAorCQkJIklJTyBjaGFubmVsIHJlYWQgZXJyb3I6ICV4LCAleFxuIiwgcmV0LCB2YWwpOworCQlnb3RvIGVycl9leGl0OworCX0KKworCWRldl9kYmcoJmluZm8tPnBkZXYtPmRldiwgImFkYyByYXcgdmFsPSV4XG4iLCB2YWwpOworCSpyYXdfdmFsID0gdmFsOworCitlcnJfZXhpdDoKKwlpaW9fY2hhbm5lbF9yZWxlYXNlKGluZGlvX2NoYW4pOworZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCitzdGF0aWMgaW50IGZ1ZWxfZ2F1Z2VfZGVidWdfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGF4cDI4OF9mZ19pbmZvICppbmZvID0gcy0+cHJpdmF0ZTsKKwlpbnQgcmF3X3ZhbCwgcmV0OworCisJc2VxX3ByaW50ZihzLCAiIFBXUl9TVEFUVVNbJTAyeF0gOiAlMDJ4XG4iLAorCQlBWFAyMFhfUFdSX0lOUFVUX1NUQVRVUywKKwkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjBYX1BXUl9JTlBVVF9TVEFUVVMpKTsKKwlzZXFfcHJpbnRmKHMsICJQV1JfT1BfTU9ERVslMDJ4XSA6ICUwMnhcbiIsCisJCUFYUDIwWF9QV1JfT1BfTU9ERSwKKwkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjBYX1BXUl9PUF9NT0RFKSk7CisJc2VxX3ByaW50ZihzLCAiIENIUkdfQ1RSTDFbJTAyeF0gOiAlMDJ4XG4iLAorCQlBWFAyMFhfQ0hSR19DVFJMMSwKKwkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjBYX0NIUkdfQ1RSTDEpKTsKKwlzZXFfcHJpbnRmKHMsICIgICAgICAgVkxURlslMDJ4XSA6ICUwMnhcbiIsCisJCUFYUDIwWF9WX0xURl9ESVNDSFJHLAorCQlmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyMFhfVl9MVEZfRElTQ0hSRykpOworCXNlcV9wcmludGYocywgIiAgICAgICBWSFRGWyUwMnhdIDogJTAyeFxuIiwKKwkJQVhQMjBYX1ZfSFRGX0RJU0NIUkcsCisJCWZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDIwWF9WX0hURl9ESVNDSFJHKSk7CisJc2VxX3ByaW50ZihzLCAiICAgIENDX0NUUkxbJTAyeF0gOiAlMDJ4XG4iLAorCQlBWFAyMFhfQ0NfQ1RSTCwKKwkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjBYX0NDX0NUUkwpKTsKKwlzZXFfcHJpbnRmKHMsICJCQVRURVJZIENBUFslMDJ4XSA6ICUwMnhcbiIsCisJCUFYUDIwWF9GR19SRVMsCisJCWZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDIwWF9GR19SRVMpKTsKKwlzZXFfcHJpbnRmKHMsICIgICAgRkdfUkRDMVslMDJ4XSA6ICUwMnhcbiIsCisJCUFYUDI4OF9GR19SREMxX1JFRywKKwkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX1JEQzFfUkVHKSk7CisJc2VxX3ByaW50ZihzLCAiICAgIEZHX1JEQzBbJTAyeF0gOiAlMDJ4XG4iLAorCQlBWFAyODhfRkdfUkRDMF9SRUcsCisJCWZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDI4OF9GR19SREMwX1JFRykpOworCXNlcV9wcmludGYocywgIiAgICBGR19PQ1ZIWyUwMnhdIDogJTAyeFxuIiwKKwkJQVhQMjg4X0ZHX09DVkhfUkVHLAorCQlmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyODhfRkdfT0NWSF9SRUcpKTsKKwlzZXFfcHJpbnRmKHMsICIgICAgRkdfT0NWTFslMDJ4XSA6ICUwMnhcbiIsCisJCUFYUDI4OF9GR19PQ1ZMX1JFRywKKwkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX09DVkxfUkVHKSk7CisJc2VxX3ByaW50ZihzLCAiRkdfREVTX0NBUDFbJTAyeF0gOiAlMDJ4XG4iLAorCQlBWFAyODhfRkdfREVTX0NBUDFfUkVHLAorCQlmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyODhfRkdfREVTX0NBUDFfUkVHKSk7CisJc2VxX3ByaW50ZihzLCAiRkdfREVTX0NBUDBbJTAyeF0gOiAlMDJ4XG4iLAorCQlBWFAyODhfRkdfREVTX0NBUDBfUkVHLAorCQlmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyODhfRkdfREVTX0NBUDBfUkVHKSk7CisJc2VxX3ByaW50ZihzLCAiIEZHX0NDX01UUjFbJTAyeF0gOiAlMDJ4XG4iLAorCQlBWFAyODhfRkdfQ0NfTVRSMV9SRUcsCisJCWZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDI4OF9GR19DQ19NVFIxX1JFRykpOworCXNlcV9wcmludGYocywgIiBGR19DQ19NVFIwWyUwMnhdIDogJTAyeFxuIiwKKwkJQVhQMjg4X0ZHX0NDX01UUjBfUkVHLAorCQlmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyODhfRkdfQ0NfTVRSMF9SRUcpKTsKKwlzZXFfcHJpbnRmKHMsICIgRkdfT0NWX0NBUFslMDJ4XSA6ICUwMnhcbiIsCisJCUFYUDI4OF9GR19PQ1ZfQ0FQX1JFRywKKwkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX09DVl9DQVBfUkVHKSk7CisJc2VxX3ByaW50ZihzLCAiICBGR19DQ19DQVBbJTAyeF0gOiAlMDJ4XG4iLAorCQlBWFAyODhfRkdfQ0NfQ0FQX1JFRywKKwkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX0NDX0NBUF9SRUcpKTsKKwlzZXFfcHJpbnRmKHMsICIgRkdfTE9XX0NBUFslMDJ4XSA6ICUwMnhcbiIsCisJCUFYUDI4OF9GR19MT1dfQ0FQX1JFRywKKwkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX0xPV19DQVBfUkVHKSk7CisJc2VxX3ByaW50ZihzLCAiVFVOSU5HX0NUTDBbJTAyeF0gOiAlMDJ4XG4iLAorCQlBWFAyODhfRkdfVFVORTAsCisJCWZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDI4OF9GR19UVU5FMCkpOworCXNlcV9wcmludGYocywgIlRVTklOR19DVEwxWyUwMnhdIDogJTAyeFxuIiwKKwkJQVhQMjg4X0ZHX1RVTkUxLAorCQlmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyODhfRkdfVFVORTEpKTsKKwlzZXFfcHJpbnRmKHMsICJUVU5JTkdfQ1RMMlslMDJ4XSA6ICUwMnhcbiIsCisJCUFYUDI4OF9GR19UVU5FMiwKKwkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX1RVTkUyKSk7CisJc2VxX3ByaW50ZihzLCAiVFVOSU5HX0NUTDNbJTAyeF0gOiAlMDJ4XG4iLAorCQlBWFAyODhfRkdfVFVORTMsCisJCWZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDI4OF9GR19UVU5FMykpOworCXNlcV9wcmludGYocywgIlRVTklOR19DVEw0WyUwMnhdIDogJTAyeFxuIiwKKwkJQVhQMjg4X0ZHX1RVTkU0LAorCQlmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyODhfRkdfVFVORTQpKTsKKwlzZXFfcHJpbnRmKHMsICJUVU5JTkdfQ1RMNVslMDJ4XSA6ICUwMnhcbiIsCisJCUFYUDI4OF9GR19UVU5FNSwKKwkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX1RVTkU1KSk7CisKKwlyZXQgPSBwbWljX3JlYWRfYWRjX3ZhbCgiYXhwMjg4LWJhdHQtdGVtcCIsICZyYXdfdmFsLCBpbmZvKTsKKwlpZiAocmV0ID49IDApCisJCXNlcV9wcmludGYocywgImF4cDI4OC1iYXR0dGVtcCA6ICVkXG4iLCByYXdfdmFsKTsKKwlyZXQgPSBwbWljX3JlYWRfYWRjX3ZhbCgiYXhwMjg4LXBtaWMtdGVtcCIsICZyYXdfdmFsLCBpbmZvKTsKKwlpZiAocmV0ID49IDApCisJCXNlcV9wcmludGYocywgImF4cDI4OC1wbWljdGVtcCA6ICVkXG4iLCByYXdfdmFsKTsKKwlyZXQgPSBwbWljX3JlYWRfYWRjX3ZhbCgiYXhwMjg4LXN5c3RlbS10ZW1wIiwgJnJhd192YWwsIGluZm8pOworCWlmIChyZXQgPj0gMCkKKwkJc2VxX3ByaW50ZihzLCAiYXhwMjg4LXN5c3R0ZW1wIDogJWRcbiIsIHJhd192YWwpOworCXJldCA9IHBtaWNfcmVhZF9hZGNfdmFsKCJheHAyODgtY2hyZy1jdXJyIiwgJnJhd192YWwsIGluZm8pOworCWlmIChyZXQgPj0gMCkKKwkJc2VxX3ByaW50ZihzLCAiYXhwMjg4LWNocmdjdXJyIDogJWRcbiIsIHJhd192YWwpOworCXJldCA9IHBtaWNfcmVhZF9hZGNfdmFsKCJheHAyODgtY2hyZy1kLWN1cnIiLCAmcmF3X3ZhbCwgaW5mbyk7CisJaWYgKHJldCA+PSAwKQorCQlzZXFfcHJpbnRmKHMsICJheHAyODgtZGNocmdjdXIgOiAlZFxuIiwgcmF3X3ZhbCk7CisJcmV0ID0gcG1pY19yZWFkX2FkY192YWwoImF4cDI4OC1iYXR0LXZvbHQiLCAmcmF3X3ZhbCwgaW5mbyk7CisJaWYgKHJldCA+PSAwKQorCQlzZXFfcHJpbnRmKHMsICJheHAyODgtYmF0dHZvbHQgOiAlZFxuIiwgcmF3X3ZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBmdWVsX2dhdWdlX2RlYnVnX3Nob3csIGlub2RlLT5pX3ByaXZhdGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmZ19kZWJ1Z19mb3BzID0geworCS5vcGVuICAgICAgID0gZGVidWdfb3BlbiwKKwkucmVhZCAgICAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgICAgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlICAgID0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgdm9pZCBmdWVsX2dhdWdlX2NyZWF0ZV9kZWJ1Z2ZzKHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbykKK3sKKwlpbmZvLT5kZWJ1Z19maWxlID0gZGVidWdmc19jcmVhdGVfZmlsZSgiZnVlbGdhdWdlIiwgMDY2NiwgTlVMTCwKKwkJaW5mbywgJmZnX2RlYnVnX2ZvcHMpOworfQorCitzdGF0aWMgdm9pZCBmdWVsX2dhdWdlX3JlbW92ZV9kZWJ1Z2ZzKHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbykKK3sKKwlkZWJ1Z2ZzX3JlbW92ZShpbmZvLT5kZWJ1Z19maWxlKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgZnVlbF9nYXVnZV9jcmVhdGVfZGVidWdmcyhzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8pCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgZnVlbF9nYXVnZV9yZW1vdmVfZGVidWdmcyhzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8pCit7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgZnVlbF9nYXVnZV9nZXRfc3RhdHVzKHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbykKK3sKKwlpbnQgcHdyX3N0YXQsIHJldDsKKwlpbnQgY2hhcmdlLCBkaXNjaGFyZ2U7CisKKwlwd3Jfc3RhdCA9IGZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDIwWF9QV1JfSU5QVVRfU1RBVFVTKTsKKwlpZiAocHdyX3N0YXQgPCAwKSB7CisJCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwKKwkJCSJQV1IgU1RBVCByZWFkIGZhaWxlZDolZFxuIiwgcHdyX3N0YXQpOworCQlyZXR1cm47CisJfQorCXJldCA9IHBtaWNfcmVhZF9hZGNfdmFsKCJheHAyODgtY2hyZy1jdXJyIiwgJmNoYXJnZSwgaW5mbyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LAorCQkJIkFEQyBjaGFyZ2UgY3VycmVudCByZWFkIGZhaWxlZDolZFxuIiwgcmV0KTsKKwkJcmV0dXJuOworCX0KKwlyZXQgPSBwbWljX3JlYWRfYWRjX3ZhbCgiYXhwMjg4LWNocmctZC1jdXJyIiwgJmRpc2NoYXJnZSwgaW5mbyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LAorCQkJIkFEQyBkaXNjaGFyZ2UgY3VycmVudCByZWFkIGZhaWxlZDolZFxuIiwgcmV0KTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjaGFyZ2UgPiAwKQorCQlpbmZvLT5zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOworCWVsc2UgaWYgKGRpc2NoYXJnZSA+IDApCisJCWluZm8tPnN0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkc7CisJZWxzZSB7CisJCWlmIChwd3Jfc3RhdCAmIENIUkdfU1RBVF9CQVRfUFJFU0VOVCkKKwkJCWluZm8tPnN0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTDsKKwkJZWxzZQorCQkJaW5mby0+c3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19OT1RfQ0hBUkdJTkc7CisJfQorfQorCitzdGF0aWMgaW50IGZ1ZWxfZ2F1Z2VfZ2V0X3ZiYXR0KHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbywgaW50ICp2YmF0dCkKK3sKKwlpbnQgcmV0ID0gMCwgcmF3X3ZhbDsKKworCXJldCA9IHBtaWNfcmVhZF9hZGNfdmFsKCJheHAyODgtYmF0dC12b2x0IiwgJnJhd192YWwsIGluZm8pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIHZiYXR0X3JlYWRfZmFpbDsKKworCSp2YmF0dCA9IFZPTFRBR0VfRlJPTV9BREMocmF3X3ZhbCk7Cit2YmF0dF9yZWFkX2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmdWVsX2dhdWdlX2dldF9jdXJyZW50KHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbywgaW50ICpjdXIpCit7CisJaW50IHJldCwgdmFsdWUgPSAwOworCWludCBjaGFyZ2UsIGRpc2NoYXJnZTsKKworCXJldCA9IHBtaWNfcmVhZF9hZGNfdmFsKCJheHAyODgtY2hyZy1jdXJyIiwgJmNoYXJnZSwgaW5mbyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gY3VycmVudF9yZWFkX2ZhaWw7CisJcmV0ID0gcG1pY19yZWFkX2FkY192YWwoImF4cDI4OC1jaHJnLWQtY3VyciIsICZkaXNjaGFyZ2UsIGluZm8pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGN1cnJlbnRfcmVhZF9mYWlsOworCisJaWYgKGNoYXJnZSA+IDApCisJCXZhbHVlID0gY2hhcmdlOworCWVsc2UgaWYgKGRpc2NoYXJnZSA+IDApCisJCXZhbHVlID0gLTEgKiBkaXNjaGFyZ2U7CisKKwkqY3VyID0gdmFsdWU7CitjdXJyZW50X3JlYWRfZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRlbXBfdG9fYWRjKHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbywgaW50IHR2YWwpCit7CisJaW50IHJudGMgPSAwLCBpLCByZXQsIGFkY192YWw7CisJaW50IHJtaW4sIHJtYXgsIHRtaW4sIHRtYXg7CisJaW50IHRjc3ogPSBpbmZvLT5wZGF0YS0+dGNzejsKKworCS8qIGdldCB0aGUgUm50YyByZXNpdGFuY2UgdmFsdWUgZm9yIHRoaXMgdGVtcCAqLworCWlmICh0dmFsID4gaW5mby0+cGRhdGEtPnRoZXJtaXN0b3JfY3VydmVbMF1bMV0pIHsKKwkJcm50YyA9IGluZm8tPnBkYXRhLT50aGVybWlzdG9yX2N1cnZlWzBdWzBdOworCX0gZWxzZSBpZiAodHZhbCA8PSBpbmZvLT5wZGF0YS0+dGhlcm1pc3Rvcl9jdXJ2ZVt0Y3N6LTFdWzFdKSB7CisJCXJudGMgPSBpbmZvLT5wZGF0YS0+dGhlcm1pc3Rvcl9jdXJ2ZVt0Y3N6LTFdWzBdOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDE7IGkgPCB0Y3N6OyBpKyspIHsKKwkJCWlmICh0dmFsID4gaW5mby0+cGRhdGEtPnRoZXJtaXN0b3JfY3VydmVbaV1bMV0pIHsKKwkJCQlybWluID0gaW5mby0+cGRhdGEtPnRoZXJtaXN0b3JfY3VydmVbaS0xXVswXTsKKwkJCQlybWF4ID0gaW5mby0+cGRhdGEtPnRoZXJtaXN0b3JfY3VydmVbaV1bMF07CisJCQkJdG1pbiA9IGluZm8tPnBkYXRhLT50aGVybWlzdG9yX2N1cnZlW2ktMV1bMV07CisJCQkJdG1heCA9IGluZm8tPnBkYXRhLT50aGVybWlzdG9yX2N1cnZlW2ldWzFdOworCQkJCXJudGMgPSBybWluICsgKChybWF4IC0gcm1pbikgKgorCQkJCQkodHZhbCAtIHRtaW4pIC8gKHRtYXggLSB0bWluKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKiB3ZSBuZWVkIHRoZSBjdXJyZW50IHRvIGNhbGN1bGF0ZSB0aGUgcHJvcGVyIGFkYyB2b2x0YWdlICovCisJcmV0ID0gZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjBYX0FEQ19SQVRFKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsICIlczpyZWFkIGVycjolZFxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldCA9IDB4MzA7CisJfQorCisJLyoKKwkgKiB0ZW1wZXJhdHVyZSBpcyBwcm9wb3J0aW9uYWwgdG8gTlRTIHRoZXJtaXN0b3IgcmVzaXN0YW5jZQorCSAqIEFEQ19SQVRFWzUtNF0gZGV0ZXJtaW5lcyBjdXJyZW50LCAwMD0yMHVBLDAxPTQwdUEsMTA9NjB1QSwxMT04MHVBCisJICogWzEyLWJpdCBBREMgVkFMXSA9IFJfTlRDKM6pKSAqIGN1cnJlbnQgLyA4MDAKKwkgKi8KKwlhZGNfdmFsID0gcm50YyAqICgyMCArICgyMCAqICgocmV0ID4+IDQpICYgMHgzKSkpIC8gODAwOworCisJcmV0dXJuIGFkY192YWw7Cit9CisKK3N0YXRpYyBpbnQgYWRjX3RvX3RlbXAoc3RydWN0IGF4cDI4OF9mZ19pbmZvICppbmZvLCBpbnQgYWRjX3ZhbCkKK3sKKwlpbnQgcmV0LCByLCBpLCB0dmFsID0gMDsKKwlpbnQgcm1pbiwgcm1heCwgdG1pbiwgdG1heDsKKwlpbnQgdGNzeiA9IGluZm8tPnBkYXRhLT50Y3N6OworCisJcmV0ID0gZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjBYX0FEQ19SQVRFKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsICIlczpyZWFkIGVycjolZFxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldCA9IDB4MzA7CisJfQorCisJLyoKKwkgKiB0ZW1wZXJhdHVyZSBpcyBwcm9wb3J0aW9uYWwgdG8gTlRTIHRoZXJtaXN0b3IgcmVzaXN0YW5jZQorCSAqIEFEQ19SQVRFWzUtNF0gZGV0ZXJtaW5lcyBjdXJyZW50LCAwMD0yMHVBLDAxPTQwdUEsMTA9NjB1QSwxMT04MHVBCisJICogUl9OVEMozqkpID0gWzEyLWJpdCBBREMgVkFMXSAqIDgwMCAvIGN1cnJlbnQKKwkgKi8KKwlyID0gYWRjX3ZhbCAqIDgwMCAvICgyMCArICgyMCAqICgocmV0ID4+IDQpICYgMHgzKSkpOworCisJaWYgKHIgPCBpbmZvLT5wZGF0YS0+dGhlcm1pc3Rvcl9jdXJ2ZVswXVswXSkgeworCQl0dmFsID0gaW5mby0+cGRhdGEtPnRoZXJtaXN0b3JfY3VydmVbMF1bMV07CisJfSBlbHNlIGlmIChyID49IGluZm8tPnBkYXRhLT50aGVybWlzdG9yX2N1cnZlW3Rjc3otMV1bMF0pIHsKKwkJdHZhbCA9IGluZm8tPnBkYXRhLT50aGVybWlzdG9yX2N1cnZlW3Rjc3otMV1bMV07CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMTsgaSA8IHRjc3o7IGkrKykgeworCQkJaWYgKHIgPCBpbmZvLT5wZGF0YS0+dGhlcm1pc3Rvcl9jdXJ2ZVtpXVswXSkgeworCQkJCXJtaW4gPSBpbmZvLT5wZGF0YS0+dGhlcm1pc3Rvcl9jdXJ2ZVtpLTFdWzBdOworCQkJCXJtYXggPSBpbmZvLT5wZGF0YS0+dGhlcm1pc3Rvcl9jdXJ2ZVtpXVswXTsKKwkJCQl0bWluID0gaW5mby0+cGRhdGEtPnRoZXJtaXN0b3JfY3VydmVbaS0xXVsxXTsKKwkJCQl0bWF4ID0gaW5mby0+cGRhdGEtPnRoZXJtaXN0b3JfY3VydmVbaV1bMV07CisJCQkJdHZhbCA9IHRtaW4gKyAoKHRtYXggLSB0bWluKSAqCisJCQkJCShyIC0gcm1pbikgLyAocm1heCAtIHJtaW4pKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiB0dmFsOworfQorCitzdGF0aWMgaW50IGZ1ZWxfZ2F1Z2VfZ2V0X2J0ZW1wKHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbywgaW50ICpidGVtcCkKK3sKKwlpbnQgcmV0LCByYXdfdmFsID0gMDsKKworCXJldCA9IHBtaWNfcmVhZF9hZGNfdmFsKCJheHAyODgtYmF0dC10ZW1wIiwgJnJhd192YWwsIGluZm8pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIHRlbXBfcmVhZF9mYWlsOworCisJKmJ0ZW1wID0gYWRjX3RvX3RlbXAoaW5mbywgcmF3X3ZhbCk7CisKK3RlbXBfcmVhZF9mYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZnVlbF9nYXVnZV9nZXRfdm9jdihzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8sIGludCAqdm9jdikKK3sKKwlpbnQgcmV0LCB2YWx1ZTsKKworCS8qIDEyLWJpdCBkYXRhIHZhbHVlLCB1cHBlciA4IGluIE9DVkgsIGxvd2VyIDQgaW4gT0NWTCAqLworCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDI4OF9GR19PQ1ZIX1JFRyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gdm9jdl9yZWFkX2ZhaWw7CisJdmFsdWUgPSByZXQgPDwgNDsKKworCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDI4OF9GR19PQ1ZMX1JFRyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gdm9jdl9yZWFkX2ZhaWw7CisJdmFsdWUgfD0gKHJldCAmIDB4Zik7CisKKwkqdm9jdiA9IFZPTFRBR0VfRlJPTV9BREModmFsdWUpOwordm9jdl9yZWFkX2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmdWVsX2dhdWdlX2JhdHRlcnlfaGVhbHRoKHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbykKK3sKKwlpbnQgdGVtcCwgdm9jdjsKKwlpbnQgcmV0LCBoZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOS05PV047CisKKwlyZXQgPSBmdWVsX2dhdWdlX2dldF9idGVtcChpbmZvLCAmdGVtcCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gaGVhbHRoX3JlYWRfZmFpbDsKKworCXJldCA9IGZ1ZWxfZ2F1Z2VfZ2V0X3ZvY3YoaW5mbywgJnZvY3YpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGhlYWx0aF9yZWFkX2ZhaWw7CisKKwlpZiAodm9jdiA+IGluZm8tPnBkYXRhLT5tYXhfdm9sdCkKKwkJaGVhbHRoID0gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSVk9MVEFHRTsKKwllbHNlIGlmICh0ZW1wID4gaW5mby0+cGRhdGEtPm1heF90ZW1wKQorCQloZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJIRUFUOworCWVsc2UgaWYgKHRlbXAgPCBpbmZvLT5wZGF0YS0+bWluX3RlbXApCisJCWhlYWx0aCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfQ09MRDsKKwllbHNlIGlmICh2b2N2IDwgaW5mby0+cGRhdGEtPm1pbl92b2x0KQorCQloZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0RFQUQ7CisJZWxzZQorCQloZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0Q7CisKK2hlYWx0aF9yZWFkX2ZhaWw6CisJcmV0dXJuIGhlYWx0aDsKK30KKworc3RhdGljIGludCBmdWVsX2dhdWdlX3NldF9oaWdoX2J0ZW1wX2FsZXJ0KHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0LCBhZGNfdmFsOworCisJLyogcHJvZ3JhbSB0ZW1wZXJhdHVyZSB0aHJlc2hvbGQgYXMgMS8xNiBBREMgdmFsdWUgKi8KKwlhZGNfdmFsID0gdGVtcF90b19hZGMoaW5mbywgaW5mby0+cGRhdGEtPm1heF90ZW1wKTsKKwlyZXQgPSBmdWVsX2dhdWdlX3JlZ193cml0ZWIoaW5mbywgQVhQMjBYX1ZfSFRGX0RJU0NIUkcsIGFkY192YWwgPj4gNCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZ1ZWxfZ2F1Z2Vfc2V0X2xvd19idGVtcF9hbGVydChzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8pCit7CisJaW50IHJldCwgYWRjX3ZhbDsKKworCS8qIHByb2dyYW0gdGVtcGVyYXR1cmUgdGhyZXNob2xkIGFzIDEvMTYgQURDIHZhbHVlICovCisJYWRjX3ZhbCA9IHRlbXBfdG9fYWRjKGluZm8sIGluZm8tPnBkYXRhLT5taW5fdGVtcCk7CisJcmV0ID0gZnVlbF9nYXVnZV9yZWdfd3JpdGViKGluZm8sIEFYUDIwWF9WX0xURl9ESVNDSFJHLCBhZGNfdmFsID4+IDQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmdWVsX2dhdWdlX2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwcywKKwkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHJvcCwKKwkJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8gPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHMpOworCWludCByZXQgPSAwLCB2YWx1ZTsKKworCW11dGV4X2xvY2soJmluZm8tPmxvY2spOworCXN3aXRjaCAocHJvcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgorCQlmdWVsX2dhdWdlX2dldF9zdGF0dXMoaW5mbyk7CisJCXZhbC0+aW50dmFsID0gaW5mby0+c3RhdHVzOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSDoKKwkJdmFsLT5pbnR2YWwgPSBmdWVsX2dhdWdlX2JhdHRlcnlfaGVhbHRoKGluZm8pOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XOgorCQlyZXQgPSBmdWVsX2dhdWdlX2dldF92YmF0dChpbmZvLCAmdmFsdWUpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZnVlbF9nYXVnZV9yZWFkX2VycjsKKwkJdmFsLT5pbnR2YWwgPSBQUk9QX1ZPTFQodmFsdWUpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfT0NWOgorCQlyZXQgPSBmdWVsX2dhdWdlX2dldF92b2N2KGluZm8sICZ2YWx1ZSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBmdWVsX2dhdWdlX3JlYWRfZXJyOworCQl2YWwtPmludHZhbCA9IFBST1BfVk9MVCh2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1c6CisJCXJldCA9IGZ1ZWxfZ2F1Z2VfZ2V0X2N1cnJlbnQoaW5mbywgJnZhbHVlKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGZ1ZWxfZ2F1Z2VfcmVhZF9lcnI7CisJCXZhbC0+aW50dmFsID0gUFJPUF9DVVJSKHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOgorCQlyZXQgPSBmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyMFhfUFdSX09QX01PREUpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZnVlbF9nYXVnZV9yZWFkX2VycjsKKworCQlpZiAocmV0ICYgQ0hSR19TVEFUX0JBVF9QUkVTRU5UKQorCQkJdmFsLT5pbnR2YWwgPSAxOworCQllbHNlCisJCQl2YWwtPmludHZhbCA9IDA7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFk6CisJCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDIwWF9GR19SRVMpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZnVlbF9nYXVnZV9yZWFkX2VycjsKKworCQlpZiAoIShyZXQgJiBGR19SRVBfQ0FQX1ZBTElEKSkKKwkJCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwKKwkJCQkiY2FwYWNpdHkgbWVhc3VyZW1lbnQgbm90IHZhbGlkXG4iKTsKKwkJdmFsLT5pbnR2YWwgPSAocmV0ICYgRkdfUkVQX0NBUF9WQUxfTUFTSyk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFlfQUxFUlRfTUlOOgorCQlyZXQgPSBmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyODhfRkdfTE9XX0NBUF9SRUcpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZnVlbF9nYXVnZV9yZWFkX2VycjsKKwkJdmFsLT5pbnR2YWwgPSAocmV0ICYgMHgwZik7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUDoKKwkJcmV0ID0gZnVlbF9nYXVnZV9nZXRfYnRlbXAoaW5mbywgJnZhbHVlKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGZ1ZWxfZ2F1Z2VfcmVhZF9lcnI7CisJCXZhbC0+aW50dmFsID0gUFJPUF9URU1QKHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QX01BWDoKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQUxFUlRfTUFYOgorCQl2YWwtPmludHZhbCA9IFBST1BfVEVNUChpbmZvLT5wZGF0YS0+bWF4X3RlbXApOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfTUlOOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTEVSVF9NSU46CisJCXZhbC0+aW50dmFsID0gUFJPUF9URU1QKGluZm8tPnBkYXRhLT5taW5fdGVtcCk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWToKKwkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfVEVDSE5PTE9HWV9MSU9OOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9OT1c6CisJCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDI4OF9GR19DQ19NVFIxX1JFRyk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBmdWVsX2dhdWdlX3JlYWRfZXJyOworCisJCXZhbHVlID0gKHJldCAmIEZHX0NDX01UUjFfVkFMX01BU0spIDw8IDg7CisJCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDI4OF9GR19DQ19NVFIwX1JFRyk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBmdWVsX2dhdWdlX3JlYWRfZXJyOworCQl2YWx1ZSB8PSAocmV0ICYgRkdfQ0NfTVRSMF9WQUxfTUFTSyk7CisJCXZhbC0+aW50dmFsID0gdmFsdWUgKiBGR19ERVNfQ0FQX1JFU19MU0I7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTEw6CisJCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDI4OF9GR19ERVNfQ0FQMV9SRUcpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZnVlbF9nYXVnZV9yZWFkX2VycjsKKworCQl2YWx1ZSA9IChyZXQgJiBGR19ERVNfQ0FQMV9WQUxfTUFTSykgPDwgODsKKwkJcmV0ID0gZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX0RFU19DQVAwX1JFRyk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBmdWVsX2dhdWdlX3JlYWRfZXJyOworCQl2YWx1ZSB8PSAocmV0ICYgRkdfREVTX0NBUDBfVkFMX01BU0spOworCQl2YWwtPmludHZhbCA9IHZhbHVlICogRkdfREVTX0NBUF9SRVNfTFNCOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMX0RFU0lHTjoKKwkJdmFsLT5pbnR2YWwgPSBQUk9QX0NVUlIoaW5mby0+cGRhdGEtPmRlc2lnbl9jYXApOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYX0RFU0lHTjoKKwkJdmFsLT5pbnR2YWwgPSBQUk9QX1ZPTFQoaW5mby0+cGRhdGEtPm1heF92b2x0KTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTl9ERVNJR046CisJCXZhbC0+aW50dmFsID0gUFJPUF9WT0xUKGluZm8tPnBkYXRhLT5taW5fdm9sdCk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfTU9ERUxfTkFNRToKKwkJdmFsLT5zdHJ2YWwgPSBpbmZvLT5wZGF0YS0+YmF0dGlkOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltdXRleF91bmxvY2soJmluZm8tPmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltdXRleF91bmxvY2soJmluZm8tPmxvY2spOworCXJldHVybiAwOworCitmdWVsX2dhdWdlX3JlYWRfZXJyOgorCW11dGV4X3VubG9jaygmaW5mby0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmdWVsX2dhdWdlX3NldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwcywKKwkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHJvcCwKKwkJY29uc3QgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8gPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHMpOworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmaW5mby0+bG9jayk7CisJc3dpdGNoIChwcm9wKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6CisJCWluZm8tPnN0YXR1cyA9IHZhbC0+aW50dmFsOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfTUlOOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTEVSVF9NSU46CisJCWlmICgodmFsLT5pbnR2YWwgPCBQRF9ERUZfTUlOX1RFTVApIHx8CisJCQkodmFsLT5pbnR2YWwgPiBQRF9ERUZfTUFYX1RFTVApKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJaW5mby0+cGRhdGEtPm1pbl90ZW1wID0gVU5QUk9QX1RFTVAodmFsLT5pbnR2YWwpOworCQlyZXQgPSBmdWVsX2dhdWdlX3NldF9sb3dfYnRlbXBfYWxlcnQoaW5mbyk7CisJCWlmIChyZXQgPCAwKQorCQkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LAorCQkJCSJ0ZW1wIGFsZXJ0IG1pbiBzZXQgZmFpbDolZFxuIiwgcmV0KTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QX01BWDoKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQUxFUlRfTUFYOgorCQlpZiAoKHZhbC0+aW50dmFsIDwgUERfREVGX01JTl9URU1QKSB8fAorCQkJKHZhbC0+aW50dmFsID4gUERfREVGX01BWF9URU1QKSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWluZm8tPnBkYXRhLT5tYXhfdGVtcCA9IFVOUFJPUF9URU1QKHZhbC0+aW50dmFsKTsKKwkJcmV0ID0gZnVlbF9nYXVnZV9zZXRfaGlnaF9idGVtcF9hbGVydChpbmZvKTsKKwkJaWYgKHJldCA8IDApCisJCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsCisJCQkJInRlbXAgYWxlcnQgbWF4IHNldCBmYWlsOiVkXG4iLCByZXQpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZX0FMRVJUX01JTjoKKwkJaWYgKCh2YWwtPmludHZhbCA8IDApIHx8ICh2YWwtPmludHZhbCA+IDE1KSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDI4OF9GR19MT1dfQ0FQX1JFRyk7CisJCWlmIChyZXQgPCAwKQorCQkJYnJlYWs7CisJCXJldCAmPSAweGYwOworCQlyZXQgfD0gKHZhbC0+aW50dmFsICYgMHhmKTsKKwkJcmV0ID0gZnVlbF9nYXVnZV9yZWdfd3JpdGViKGluZm8sIEFYUDI4OF9GR19MT1dfQ0FQX1JFRywgcmV0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZ1ZWxfZ2F1Z2VfcHJvcGVydHlfaXNfd3JpdGVhYmxlKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKKwllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3ApCit7CisJaW50IHJldDsKKworCXN3aXRjaCAocHNwKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QX01JTjoKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQUxFUlRfTUlOOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUF9NQVg6CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QX0FMRVJUX01BWDoKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZX0FMRVJUX01JTjoKKwkJcmV0ID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gMDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBmdWVsX2dhdWdlX3N0YXR1c19tb25pdG9yKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8gPSBjb250YWluZXJfb2Yod29yaywKKwkJc3RydWN0IGF4cDI4OF9mZ19pbmZvLCBzdGF0dXNfbW9uaXRvci53b3JrKTsKKworCWZ1ZWxfZ2F1Z2VfZ2V0X3N0YXR1cyhpbmZvKTsKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZChpbmZvLT5iYXQpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmaW5mby0+c3RhdHVzX21vbml0b3IsIFNUQVRVU19NT05fREVMQVlfSklGRklFUyk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBmdWVsX2dhdWdlX3RocmVhZF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldikKK3sKKwlzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8gPSBkZXY7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVhQMjg4X0ZHX0lOVFJfTlVNOyBpKyspIHsKKwkJaWYgKGluZm8tPmlycVtpXSA9PSBpcnEpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA+PSBBWFAyODhfRkdfSU5UUl9OVU0pIHsKKwkJZGV2X3dhcm4oJmluZm8tPnBkZXYtPmRldiwgInNwdXJpb3VzIGludGVycnVwdCEhXG4iKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCXN3aXRjaCAoaSkgeworCWNhc2UgUVdCVFVfSVJROgorCQlkZXZfaW5mbygmaW5mby0+cGRldi0+ZGV2LAorCQkJIlF1aXQgQmF0dGVyeSB1bmRlciB0ZW1wZXJhdHVyZSBpbiB3b3JrIG1vZGUgSVJRIChRV0JUVSlcbiIpOworCQlicmVhazsKKwljYXNlIFdCVFVfSVJROgorCQlkZXZfaW5mbygmaW5mby0+cGRldi0+ZGV2LAorCQkJIkJhdHRlcnkgdW5kZXIgdGVtcGVyYXR1cmUgaW4gd29yayBtb2RlIElSUSAoV0JUVSlcbiIpOworCQlicmVhazsKKwljYXNlIFFXQlRPX0lSUToKKwkJZGV2X2luZm8oJmluZm8tPnBkZXYtPmRldiwKKwkJCSJRdWl0IEJhdHRlcnkgb3ZlciB0ZW1wZXJhdHVyZSBpbiB3b3JrIG1vZGUgSVJRIChRV0JUTylcbiIpOworCQlicmVhazsKKwljYXNlIFdCVE9fSVJROgorCQlkZXZfaW5mbygmaW5mby0+cGRldi0+ZGV2LAorCQkJIkJhdHRlcnkgb3ZlciB0ZW1wZXJhdHVyZSBpbiB3b3JrIG1vZGUgSVJRIChXQlRPKVxuIik7CisJCWJyZWFrOworCWNhc2UgV0wyX0lSUToKKwkJZGV2X2luZm8oJmluZm8tPnBkZXYtPmRldiwgIkxvdyBCYXR0IFdhcm5pbmcoMikgSU5UUlxuIik7CisJCWJyZWFrOworCWNhc2UgV0wxX0lSUToKKwkJZGV2X2luZm8oJmluZm8tPnBkZXYtPmRldiwgIkxvdyBCYXR0IFdhcm5pbmcoMSkgSU5UUlxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl93YXJuKCZpbmZvLT5wZGV2LT5kZXYsICJTcHVyaW91cyBJbnRlcnJ1cHQhISFcbiIpOworCX0KKworCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGluZm8tPmJhdCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBmdWVsX2dhdWdlX2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KQoreworCXN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbyA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOworCisJcG93ZXJfc3VwcGx5X2NoYW5nZWQoaW5mby0+YmF0KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBmdWVsX2dhdWdlX2Rlc2MgPSB7CisJLm5hbWUJCQk9IERFVl9OQU1FLAorCS50eXBlCQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZLAorCS5wcm9wZXJ0aWVzCQk9IGZ1ZWxfZ2F1Z2VfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCQk9IEFSUkFZX1NJWkUoZnVlbF9nYXVnZV9wcm9wcyksCisJLmdldF9wcm9wZXJ0eQkJPSBmdWVsX2dhdWdlX2dldF9wcm9wZXJ0eSwKKwkuc2V0X3Byb3BlcnR5CQk9IGZ1ZWxfZ2F1Z2Vfc2V0X3Byb3BlcnR5LAorCS5wcm9wZXJ0eV9pc193cml0ZWFibGUJPSBmdWVsX2dhdWdlX3Byb3BlcnR5X2lzX3dyaXRlYWJsZSwKKwkuZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZAk9IGZ1ZWxfZ2F1Z2VfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCwKK307CisKK3N0YXRpYyBpbnQgZnVlbF9nYXVnZV9zZXRfbG93YmF0dF90aHJlc2hvbGRzKHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0OworCXU4IHJlZ192YWw7CisKKwlyZXQgPSBmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyMFhfRkdfUkVTKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsICIlczpyZWFkIGVycjolZFxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IChyZXQgJiBGR19SRVBfQ0FQX1ZBTF9NQVNLKTsKKworCWlmIChyZXQgPiBGR19MT1dfQ0FQX1dBUk5fVEhSKQorCQlyZWdfdmFsID0gRkdfTE9XX0NBUF9XQVJOX1RIUjsKKwllbHNlIGlmIChyZXQgPiBGR19MT1dfQ0FQX0NSSVRfVEhSKQorCQlyZWdfdmFsID0gRkdfTE9XX0NBUF9DUklUX1RIUjsKKwllbHNlCisJCXJlZ192YWwgPSBGR19MT1dfQ0FQX1NIRE5fVEhSOworCisJcmVnX3ZhbCB8PSBGR19MT1dfQ0FQX1RIUjFfVkFMOworCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3dyaXRlYihpbmZvLCBBWFAyODhfRkdfTE9XX0NBUF9SRUcsIHJlZ192YWwpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsICIlczp3cml0ZSBlcnI6JWRcbiIsIF9fZnVuY19fLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmdWVsX2dhdWdlX3Byb2dyYW1fdmJhdHRfZnVsbChzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8pCit7CisJaW50IHJldDsKKwl1OCB2YWw7CisKKwlyZXQgPSBmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyMFhfQ0hSR19DVFJMMSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZmdfcHJvZ19vY3ZfZmFpbDsKKwllbHNlCisJCXZhbCA9IChyZXQgJiB+Q0hSR19DQ0NWX0NWX01BU0spOworCisJc3dpdGNoIChpbmZvLT5wZGF0YS0+bWF4X3ZvbHQpIHsKKwljYXNlIENWXzQxMDA6CisJCXZhbCB8PSAoQ0hSR19DQ0NWX0NWXzQxMDBNViA8PCBDSFJHX0NDQ1ZfQ1ZfQklUX1BPUyk7CisJCWJyZWFrOworCWNhc2UgQ1ZfNDE1MDoKKwkJdmFsIHw9IChDSFJHX0NDQ1ZfQ1ZfNDE1ME1WIDw8IENIUkdfQ0NDVl9DVl9CSVRfUE9TKTsKKwkJYnJlYWs7CisJY2FzZSBDVl80MjAwOgorCQl2YWwgfD0gKENIUkdfQ0NDVl9DVl80MjAwTVYgPDwgQ0hSR19DQ0NWX0NWX0JJVF9QT1MpOworCQlicmVhazsKKwljYXNlIENWXzQzNTA6CisJCXZhbCB8PSAoQ0hSR19DQ0NWX0NWXzQzNTBNViA8PCBDSFJHX0NDQ1ZfQ1ZfQklUX1BPUyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZhbCB8PSAoQ0hSR19DQ0NWX0NWXzQyMDBNViA8PCBDSFJHX0NDQ1ZfQ1ZfQklUX1BPUyk7CisJCWJyZWFrOworCX0KKworCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3dyaXRlYihpbmZvLCBBWFAyMFhfQ0hSR19DVFJMMSwgdmFsKTsKK2ZnX3Byb2dfb2N2X2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmdWVsX2dhdWdlX3Byb2dyYW1fZGVzaWduX2NhcChzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8pCit7CisJaW50IHJldDsKKworCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3dyaXRlYihpbmZvLAorCQlBWFAyODhfRkdfREVTX0NBUDFfUkVHLCBpbmZvLT5wZGF0YS0+Y2FwMSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZmdfcHJvZ19kZXNjYXBfZmFpbDsKKworCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3dyaXRlYihpbmZvLAorCQlBWFAyODhfRkdfREVTX0NBUDBfUkVHLCBpbmZvLT5wZGF0YS0+Y2FwMCk7CisKK2ZnX3Byb2dfZGVzY2FwX2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmdWVsX2dhdWdlX3Byb2dyYW1fb2N2X2N1cnZlKHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0ID0gMCwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBPQ1ZfQ1VSVkVfU0laRTsgaSsrKSB7CisJCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3dyaXRlYihpbmZvLAorCQkJQVhQMjg4X0ZHX09DVl9DVVJWRV9SRUcgKyBpLCBpbmZvLT5wZGF0YS0+b2N2X2N1cnZlW2ldKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGZnX3Byb2dfb2N2X2ZhaWw7CisJfQorCitmZ19wcm9nX29jdl9mYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZnVlbF9nYXVnZV9wcm9ncmFtX3JkY192YWxzKHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZnVlbF9nYXVnZV9yZWdfd3JpdGViKGluZm8sCisJCUFYUDI4OF9GR19SREMxX1JFRywgaW5mby0+cGRhdGEtPnJkYzEpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGZnX3Byb2dfb2N2X2ZhaWw7CisKKwlyZXQgPSBmdWVsX2dhdWdlX3JlZ193cml0ZWIoaW5mbywKKwkJQVhQMjg4X0ZHX1JEQzBfUkVHLCBpbmZvLT5wZGF0YS0+cmRjMCk7CisKK2ZnX3Byb2dfb2N2X2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZnVlbF9nYXVnZV9pbml0X2NvbmZpZ19yZWdzKHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0OworCisJLyoKKwkgKiBjaGVjayBpZiB0aGUgY29uZmlnIGRhdGEgaXMgYWxyZWFkeQorCSAqIHByb2dyYW1tZWQgYW5kIGlmIHNvIGp1c3QgcmV0dXJuLgorCSAqLworCisJcmV0ID0gZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX0RFU19DQVAxX1JFRyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X3dhcm4oJmluZm8tPnBkZXYtPmRldiwgIkNBUDEgcmVnIHJlYWQgZXJyISFcbiIpOworCX0gZWxzZSBpZiAoIShyZXQgJiBGR19ERVNfQ0FQMV9WQUxJRCkpIHsKKwkJZGV2X2luZm8oJmluZm8tPnBkZXYtPmRldiwgIkZHIGRhdGEgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWRcbiIpOworCX0gZWxzZSB7CisJCWRldl9pbmZvKCZpbmZvLT5wZGV2LT5kZXYsICJGRyBkYXRhIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiIpOworCQlyZXR1cm47CisJfQorCisJcmV0ID0gZnVlbF9nYXVnZV9wcm9ncmFtX3ZiYXR0X2Z1bGwoaW5mbyk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwgInNldCB2YmF0dCBmdWxsIGZhaWw6JWRcbiIsIHJldCk7CisKKwlyZXQgPSBmdWVsX2dhdWdlX3Byb2dyYW1fZGVzaWduX2NhcChpbmZvKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LCAic2V0IGRlc2lnbiBjYXAgZmFpbDolZFxuIiwgcmV0KTsKKworCXJldCA9IGZ1ZWxfZ2F1Z2VfcHJvZ3JhbV9yZGNfdmFscyhpbmZvKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LCAic2V0IHJkYyBmYWlsOiVkXG4iLCByZXQpOworCisJcmV0ID0gZnVlbF9nYXVnZV9wcm9ncmFtX29jdl9jdXJ2ZShpbmZvKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LCAic2V0IG9jdiBjdXJ2ZSBmYWlsOiVkXG4iLCByZXQpOworCisJcmV0ID0gZnVlbF9nYXVnZV9zZXRfbG93YmF0dF90aHJlc2hvbGRzKGluZm8pOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsICJsb3diYXR0IHRociBzZXQgZmFpbDolZFxuIiwgcmV0KTsKKworCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3dyaXRlYihpbmZvLCBBWFAyMFhfQ0NfQ1RSTCwgMHhlZik7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwgImdhdWdlIGNudGwgc2V0IGZhaWw6JWRcbiIsIHJldCk7Cit9CisKK3N0YXRpYyB2b2lkIGZ1ZWxfZ2F1Z2VfaW5pdF9pcnEoc3RydWN0IGF4cDI4OF9mZ19pbmZvICppbmZvKQoreworCWludCByZXQsIGksIHBpcnE7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVhQMjg4X0ZHX0lOVFJfTlVNOyBpKyspIHsKKwkJcGlycSA9IHBsYXRmb3JtX2dldF9pcnEoaW5mby0+cGRldiwgaSk7CisJCWluZm8tPmlycVtpXSA9IHJlZ21hcF9pcnFfZ2V0X3ZpcnEoaW5mby0+cmVnbWFwX2lycWMsIHBpcnEpOworCQlpZiAoaW5mby0+aXJxW2ldIDwgMCkgeworCQkJZGV2X3dhcm4oJmluZm8tPnBkZXYtPmRldiwKKwkJCQkicmVnbWFwX2lycSBnZXQgdmlycSBmYWlsZWQgZm9yIElSUSAlZDogJWRcbiIsCisJCQkJcGlycSwgaW5mby0+aXJxW2ldKTsKKwkJCWluZm8tPmlycVtpXSA9IC0xOworCQkJZ290byBpbnRyX2ZhaWxlZDsKKwkJfQorCQlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShpbmZvLT5pcnFbaV0sCisJCQkJTlVMTCwgZnVlbF9nYXVnZV90aHJlYWRfaGFuZGxlciwKKwkJCQlJUlFGX09ORVNIT1QsIERFVl9OQU1FLCBpbmZvKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X3dhcm4oJmluZm8tPnBkZXYtPmRldiwKKwkJCQkicmVxdWVzdCBpcnEgZmFpbGVkIGZvciBJUlEgJWQ6ICVkXG4iLAorCQkJCXBpcnEsIGluZm8tPmlycVtpXSk7CisJCQlpbmZvLT5pcnFbaV0gPSAtMTsKKwkJCWdvdG8gaW50cl9mYWlsZWQ7CisJCX0gZWxzZSB7CisJCQlkZXZfaW5mbygmaW5mby0+cGRldi0+ZGV2LCAiSFcgSVJRICVkIC0+IFZJUlEgJWRcbiIsCisJCQkJcGlycSwgaW5mby0+aXJxW2ldKTsKKwkJfQorCX0KKwlyZXR1cm47CisKK2ludHJfZmFpbGVkOgorCWZvciAoOyBpID4gMDsgaS0tKSB7CisJCWZyZWVfaXJxKGluZm8tPmlycVtpIC0gMV0sIGluZm8pOworCQlpbmZvLT5pcnFbaSAtIDFdID0gLTE7CisJfQorfQorCitzdGF0aWMgdm9pZCBmdWVsX2dhdWdlX2luaXRfaHdfcmVncyhzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8pCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJcmV0ID0gZnVlbF9nYXVnZV9zZXRfaGlnaF9idGVtcF9hbGVydChpbmZvKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LCAiaGlnaCBiYXR0IHRlbXAgc2V0IGZhaWw6JWRcbiIsIHJldCk7CisKKwlyZXQgPSBmdWVsX2dhdWdlX3NldF9sb3dfYnRlbXBfYWxlcnQoaW5mbyk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwgImxvdyBiYXR0IHRlbXAgc2V0IGZhaWw6JWRcbiIsIHJldCk7CisKKwkvKiBlbmFibGUgaW50ZXJydXB0cyAqLworCXZhbCA9IGZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDIwWF9JUlEzX0VOKTsKKwl2YWwgfD0gVEVNUF9JUlFfQ0ZHX01BU0s7CisJZnVlbF9nYXVnZV9yZWdfd3JpdGViKGluZm8sIEFYUDIwWF9JUlEzX0VOLCB2YWwpOworCisJdmFsID0gZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjBYX0lSUTRfRU4pOworCXZhbCB8PSBGR19JUlFfQ0ZHX0xPV0JBVFRfTUFTSzsKKwl2YWwgPSBmdWVsX2dhdWdlX3JlZ193cml0ZWIoaW5mbywgQVhQMjBYX0lSUTRfRU4sIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgYXhwMjg4X2Z1ZWxfZ2F1Z2VfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm87CisJc3RydWN0IGF4cDIweF9kZXYgKmF4cDIweCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307CisKKwlpbmZvID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbmZvLT5wZGV2ID0gcGRldjsKKwlpbmZvLT5yZWdtYXAgPSBheHAyMHgtPnJlZ21hcDsKKwlpbmZvLT5yZWdtYXBfaXJxYyA9IGF4cDIweC0+cmVnbWFwX2lycWM7CisJaW5mby0+c3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOworCWluZm8tPnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaWYgKCFpbmZvLT5wZGF0YSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBpbmZvKTsKKworCW11dGV4X2luaXQoJmluZm8tPmxvY2spOworCUlOSVRfREVMQVlFRF9XT1JLKCZpbmZvLT5zdGF0dXNfbW9uaXRvciwgZnVlbF9nYXVnZV9zdGF0dXNfbW9uaXRvcik7CisKKwlwc3lfY2ZnLmRydl9kYXRhID0gaW5mbzsKKwlpbmZvLT5iYXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmZ1ZWxfZ2F1Z2VfZGVzYywgJnBzeV9jZmcpOworCWlmIChJU19FUlIoaW5mby0+YmF0KSkgeworCQlyZXQgPSBQVFJfRVJSKGluZm8tPmJhdCk7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBiYXR0ZXJ5OiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlmdWVsX2dhdWdlX2NyZWF0ZV9kZWJ1Z2ZzKGluZm8pOworCWZ1ZWxfZ2F1Z2VfaW5pdF9jb25maWdfcmVncyhpbmZvKTsKKwlmdWVsX2dhdWdlX2luaXRfaXJxKGluZm8pOworCWZ1ZWxfZ2F1Z2VfaW5pdF9od19yZWdzKGluZm8pOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmaW5mby0+c3RhdHVzX21vbml0b3IsIFNUQVRVU19NT05fREVMQVlfSklGRklFUyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBheHAyODhfZmdfaWRfdGFibGVbXSA9IHsKKwl7IC5uYW1lID0gREVWX05BTUUgfSwKKwl7fSwKK307CisKK3N0YXRpYyBpbnQgYXhwMjg4X2Z1ZWxfZ2F1Z2VfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGF4cDI4OF9mZ19pbmZvICppbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IGk7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmluZm8tPnN0YXR1c19tb25pdG9yKTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihpbmZvLT5iYXQpOworCWZ1ZWxfZ2F1Z2VfcmVtb3ZlX2RlYnVnZnMoaW5mbyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVhQMjg4X0ZHX0lOVFJfTlVNOyBpKyspCisJCWlmIChpbmZvLT5pcnFbaV0gPj0gMCkKKwkJCWZyZWVfaXJxKGluZm8tPmlycVtpXSwgaW5mbyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXhwMjg4X2Z1ZWxfZ2F1Z2VfZHJpdmVyID0geworCS5wcm9iZSA9IGF4cDI4OF9mdWVsX2dhdWdlX3Byb2JlLAorCS5yZW1vdmUgPSBheHAyODhfZnVlbF9nYXVnZV9yZW1vdmUsCisJLmlkX3RhYmxlID0gYXhwMjg4X2ZnX2lkX3RhYmxlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gREVWX05BTUUsCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYXhwMjg4X2Z1ZWxfZ2F1Z2VfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiUmFtYWtyaXNobmEgUGFsbGFsYSA8cmFtYWtyaXNobmEucGFsbGFsYUBpbnRlbC5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJUb2RkIEJyYW5kdCA8dG9kZC5lLmJyYW5kdEBsaW51eC5pbnRlbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlhwb3dlciBBWFAyODggRnVlbCBHYXVnZSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvYnEyNDE1eF9jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9icTI0MTV4X2NoYXJnZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci9icTI0MTV4X2NoYXJnZXIuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvYnEyNDE1eF9jaGFyZ2VyLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvYnEyNDE5MF9jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9icTI0MTkwX2NoYXJnZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci9icTI0MTkwX2NoYXJnZXIuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvYnEyNDE5MF9jaGFyZ2VyLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvc3VwcGx5L2JxMjQyNTdfY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvYnEyNDI1N19jaGFyZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjMzFiZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L2JxMjQyNTdfY2hhcmdlci5jCkBAIC0wLDAgKzEsMTE5NiBAQAorLyoKKyAqIFRJIEJRMjQyNTcgY2hhcmdlciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogRGF0YXNoZWV0czoKKyAqIGh0dHA6Ly93d3cudGkuY29tL3Byb2R1Y3QvYnEyNDI1MAorICogaHR0cDovL3d3dy50aS5jb20vcHJvZHVjdC9icTI0MjUxCisgKiBodHRwOi8vd3d3LnRpLmNvbS9wcm9kdWN0L2JxMjQyNTcKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorCisjZGVmaW5lIEJRMjQyNTdfUkVHXzEJCQkweDAwCisjZGVmaW5lIEJRMjQyNTdfUkVHXzIJCQkweDAxCisjZGVmaW5lIEJRMjQyNTdfUkVHXzMJCQkweDAyCisjZGVmaW5lIEJRMjQyNTdfUkVHXzQJCQkweDAzCisjZGVmaW5lIEJRMjQyNTdfUkVHXzUJCQkweDA0CisjZGVmaW5lIEJRMjQyNTdfUkVHXzYJCQkweDA1CisjZGVmaW5lIEJRMjQyNTdfUkVHXzcJCQkweDA2CisKKyNkZWZpbmUgQlEyNDI1N19NQU5VRkFDVFVSRVIJCSJUZXhhcyBJbnN0cnVtZW50cyIKKyNkZWZpbmUgQlEyNDI1N19QR19HUElPCQkJInBnIgorCisjZGVmaW5lIEJRMjQyNTdfSUxJTV9TRVRfREVMQVkJCTEwMDAJLyogbXNlYyAqLworCisvKgorICogV2hlbiBhZGRpbmcgc3VwcG9ydCBmb3IgbmV3IGRldmljZXMgbWFrZSBzdXJlIHRoYXQgZW51bSBicTI0MjV4X2NoaXAgYW5kCisgKiBicTI0MjV4X2NoaXBfbmFtZVtdIGFsd2F5cyBzdGF5IGluIHN5bmMhCisgKi8KK2VudW0gYnEyNDI1eF9jaGlwIHsKKwlCUTI0MjUwLAorCUJRMjQyNTEsCisJQlEyNDI1NywKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBicTI0MjV4X2NoaXBfbmFtZVtdID0geworCSJicTI0MjUwIiwKKwkiYnEyNDI1MSIsCisJImJxMjQyNTciLAorfTsKKworZW51bSBicTI0MjU3X2ZpZWxkcyB7CisJRl9XRF9GQVVMVCwgRl9XRF9FTiwgRl9TVEFULCBGX0ZBVUxULAkJCSAgICAvKiBSRUcgMSAqLworCUZfUkVTRVQsIEZfSUlMSU1JVCwgRl9FTl9TVEFULCBGX0VOX1RFUk0sIEZfQ0UsIEZfSFpfTU9ERSwgIC8qIFJFRyAyICovCisJRl9WQkFULCBGX1VTQl9ERVQsCQkJCQkgICAgLyogUkVHIDMgKi8KKwlGX0lDSEcsIEZfSVRFUk0sCQkJCQkgICAgLyogUkVHIDQgKi8KKwlGX0xPT1BfU1RBVFVTLCBGX0xPV19DSEcsIEZfRFBETV9FTiwgRl9DRV9TVEFUVVMsIEZfVklORFBNLCAvKiBSRUcgNSAqLworCUZfWDJfVE1SX0VOLCBGX1RNUiwgRl9TWVNPRkYsIEZfVFNfRU4sIEZfVFNfU1RBVCwJICAgIC8qIFJFRyA2ICovCisJRl9WT1ZQLCBGX0NMUl9WRFAsIEZfRk9SQ0VfQkFUREVULCBGX0ZPUkNFX1BUTSwJCSAgICAvKiBSRUcgNyAqLworCisJRl9NQVhfRklFTERTCit9OworCisvKiBpbml0aWFsIGZpZWxkIHZhbHVlcywgY29udmVydGVkIGZyb20gdVYvdUEgKi8KK3N0cnVjdCBicTI0MjU3X2luaXRfZGF0YSB7CisJdTggaWNoZzsJLyogY2hhcmdlIGN1cnJlbnQgICAgICAqLworCXU4IHZiYXQ7CS8qIHJlZ3VsYXRpb24gdm9sdGFnZSAgKi8KKwl1OCBpdGVybTsJLyogdGVybWluYXRpb24gY3VycmVudCAqLworCXU4IGlpbGltaXQ7CS8qIGlucHV0IGN1cnJlbnQgbGltaXQgKi8KKwl1OCB2b3ZwOwkvKiBvdmVyIHZvbHRhZ2UgcHJvdGVjdGlvbiB2b2x0YWdlICovCisJdTggdmluZHBtOwkvKiBWRE1QIGlucHV0IHRocmVzaG9sZCB2b2x0YWdlICovCit9OworCitzdHJ1Y3QgYnEyNDI1N19zdGF0ZSB7CisJdTggc3RhdHVzOworCXU4IGZhdWx0OworCWJvb2wgcG93ZXJfZ29vZDsKK307CisKK3N0cnVjdCBicTI0MjU3X2RldmljZSB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqY2hhcmdlcjsKKworCWVudW0gYnEyNDI1eF9jaGlwIGNoaXA7CisKKwlzdHJ1Y3QgcmVnbWFwICpybWFwOworCXN0cnVjdCByZWdtYXBfZmllbGQgKnJtYXBfZmllbGRzW0ZfTUFYX0ZJRUxEU107CisKKwlzdHJ1Y3QgZ3Bpb19kZXNjICpwZzsKKworCXN0cnVjdCBkZWxheWVkX3dvcmsgaWlsaW1pdF9zZXR1cF93b3JrOworCisJc3RydWN0IGJxMjQyNTdfaW5pdF9kYXRhIGluaXRfZGF0YTsKKwlzdHJ1Y3QgYnEyNDI1N19zdGF0ZSBzdGF0ZTsKKworCXN0cnVjdCBtdXRleCBsb2NrOyAvKiBwcm90ZWN0IHN0YXRlIGRhdGEgKi8KKworCWJvb2wgaWlsaW1pdF9hdXRvc2V0X2VuYWJsZTsKK307CisKK3N0YXRpYyBib29sIGJxMjQyNTdfaXNfdm9sYXRpbGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgQlEyNDI1N19SRUdfMjoKKwljYXNlIEJRMjQyNTdfUkVHXzQ6CisJCXJldHVybiBmYWxzZTsKKworCWRlZmF1bHQ6CisJCXJldHVybiB0cnVlOworCX0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGJxMjQyNTdfcmVnbWFwX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDgsCisKKwkubWF4X3JlZ2lzdGVyID0gQlEyNDI1N19SRUdfNywKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKKworCS52b2xhdGlsZV9yZWcgPSBicTI0MjU3X2lzX3ZvbGF0aWxlX3JlZywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX2ZpZWxkIGJxMjQyNTdfcmVnX2ZpZWxkc1tdID0geworCS8qIFJFRyAxICovCisJW0ZfV0RfRkFVTFRdCQk9IFJFR19GSUVMRChCUTI0MjU3X1JFR18xLCA3LCA3KSwKKwlbRl9XRF9FTl0JCT0gUkVHX0ZJRUxEKEJRMjQyNTdfUkVHXzEsIDYsIDYpLAorCVtGX1NUQVRdCQk9IFJFR19GSUVMRChCUTI0MjU3X1JFR18xLCA0LCA1KSwKKwlbRl9GQVVMVF0JCT0gUkVHX0ZJRUxEKEJRMjQyNTdfUkVHXzEsIDAsIDMpLAorCS8qIFJFRyAyICovCisJW0ZfUkVTRVRdCQk9IFJFR19GSUVMRChCUTI0MjU3X1JFR18yLCA3LCA3KSwKKwlbRl9JSUxJTUlUXQkJPSBSRUdfRklFTEQoQlEyNDI1N19SRUdfMiwgNCwgNiksCisJW0ZfRU5fU1RBVF0JCT0gUkVHX0ZJRUxEKEJRMjQyNTdfUkVHXzIsIDMsIDMpLAorCVtGX0VOX1RFUk1dCQk9IFJFR19GSUVMRChCUTI0MjU3X1JFR18yLCAyLCAyKSwKKwlbRl9DRV0JCQk9IFJFR19GSUVMRChCUTI0MjU3X1JFR18yLCAxLCAxKSwKKwlbRl9IWl9NT0RFXQkJPSBSRUdfRklFTEQoQlEyNDI1N19SRUdfMiwgMCwgMCksCisJLyogUkVHIDMgKi8KKwlbRl9WQkFUXQkJPSBSRUdfRklFTEQoQlEyNDI1N19SRUdfMywgMiwgNyksCisJW0ZfVVNCX0RFVF0JCT0gUkVHX0ZJRUxEKEJRMjQyNTdfUkVHXzMsIDAsIDEpLAorCS8qIFJFRyA0ICovCisJW0ZfSUNIR10JCT0gUkVHX0ZJRUxEKEJRMjQyNTdfUkVHXzQsIDMsIDcpLAorCVtGX0lURVJNXQkJPSBSRUdfRklFTEQoQlEyNDI1N19SRUdfNCwgMCwgMiksCisJLyogUkVHIDUgKi8KKwlbRl9MT09QX1NUQVRVU10JCT0gUkVHX0ZJRUxEKEJRMjQyNTdfUkVHXzUsIDYsIDcpLAorCVtGX0xPV19DSEddCQk9IFJFR19GSUVMRChCUTI0MjU3X1JFR181LCA1LCA1KSwKKwlbRl9EUERNX0VOXQkJPSBSRUdfRklFTEQoQlEyNDI1N19SRUdfNSwgNCwgNCksCisJW0ZfQ0VfU1RBVFVTXQkJPSBSRUdfRklFTEQoQlEyNDI1N19SRUdfNSwgMywgMyksCisJW0ZfVklORFBNXQkJPSBSRUdfRklFTEQoQlEyNDI1N19SRUdfNSwgMCwgMiksCisJLyogUkVHIDYgKi8KKwlbRl9YMl9UTVJfRU5dCQk9IFJFR19GSUVMRChCUTI0MjU3X1JFR182LCA3LCA3KSwKKwlbRl9UTVJdCQkJPSBSRUdfRklFTEQoQlEyNDI1N19SRUdfNiwgNSwgNiksCisJW0ZfU1lTT0ZGXQkJPSBSRUdfRklFTEQoQlEyNDI1N19SRUdfNiwgNCwgNCksCisJW0ZfVFNfRU5dCQk9IFJFR19GSUVMRChCUTI0MjU3X1JFR182LCAzLCAzKSwKKwlbRl9UU19TVEFUXQkJPSBSRUdfRklFTEQoQlEyNDI1N19SRUdfNiwgMCwgMiksCisJLyogUkVHIDcgKi8KKwlbRl9WT1ZQXQkJPSBSRUdfRklFTEQoQlEyNDI1N19SRUdfNywgNSwgNyksCisJW0ZfQ0xSX1ZEUF0JCT0gUkVHX0ZJRUxEKEJRMjQyNTdfUkVHXzcsIDQsIDQpLAorCVtGX0ZPUkNFX0JBVERFVF0JPSBSRUdfRklFTEQoQlEyNDI1N19SRUdfNywgMywgMyksCisJW0ZfRk9SQ0VfUFRNXQkJPSBSRUdfRklFTEQoQlEyNDI1N19SRUdfNywgMiwgMikKK307CisKK3N0YXRpYyBjb25zdCB1MzIgYnEyNDI1N192YmF0X21hcFtdID0geworCTM1MDAwMDAsIDM1MjAwMDAsIDM1NDAwMDAsIDM1NjAwMDAsIDM1ODAwMDAsIDM2MDAwMDAsIDM2MjAwMDAsIDM2NDAwMDAsCisJMzY2MDAwMCwgMzY4MDAwMCwgMzcwMDAwMCwgMzcyMDAwMCwgMzc0MDAwMCwgMzc2MDAwMCwgMzc4MDAwMCwgMzgwMDAwMCwKKwkzODIwMDAwLCAzODQwMDAwLCAzODYwMDAwLCAzODgwMDAwLCAzOTAwMDAwLCAzOTIwMDAwLCAzOTQwMDAwLCAzOTYwMDAwLAorCTM5ODAwMDAsIDQwMDAwMDAsIDQwMjAwMDAsIDQwNDAwMDAsIDQwNjAwMDAsIDQwODAwMDAsIDQxMDAwMDAsIDQxMjAwMDAsCisJNDE0MDAwMCwgNDE2MDAwMCwgNDE4MDAwMCwgNDIwMDAwMCwgNDIyMDAwMCwgNDI0MDAwMCwgNDI2MDAwMCwgNDI4MDAwMCwKKwk0MzAwMDAwLCA0MzIwMDAwLCA0MzQwMDAwLCA0MzYwMDAwLCA0MzgwMDAwLCA0NDAwMDAwLCA0NDIwMDAwLCA0NDQwMDAwCit9OworCisjZGVmaW5lIEJRMjQyNTdfVkJBVF9NQVBfU0laRQkJQVJSQVlfU0laRShicTI0MjU3X3ZiYXRfbWFwKQorCitzdGF0aWMgY29uc3QgdTMyIGJxMjQyNTdfaWNoZ19tYXBbXSA9IHsKKwk1MDAwMDAsIDU1MDAwMCwgNjAwMDAwLCA2NTAwMDAsIDcwMDAwMCwgNzUwMDAwLCA4MDAwMDAsIDg1MDAwMCwgOTAwMDAwLAorCTk1MDAwMCwgMTAwMDAwMCwgMTA1MDAwMCwgMTEwMDAwMCwgMTE1MDAwMCwgMTIwMDAwMCwgMTI1MDAwMCwgMTMwMDAwMCwKKwkxMzUwMDAwLCAxNDAwMDAwLCAxNDUwMDAwLCAxNTAwMDAwLCAxNTUwMDAwLCAxNjAwMDAwLCAxNjUwMDAwLCAxNzAwMDAwLAorCTE3NTAwMDAsIDE4MDAwMDAsIDE4NTAwMDAsIDE5MDAwMDAsIDE5NTAwMDAsIDIwMDAwMDAKK307CisKKyNkZWZpbmUgQlEyNDI1N19JQ0hHX01BUF9TSVpFCQlBUlJBWV9TSVpFKGJxMjQyNTdfaWNoZ19tYXApCisKK3N0YXRpYyBjb25zdCB1MzIgYnEyNDI1N19pdGVybV9tYXBbXSA9IHsKKwk1MDAwMCwgNzUwMDAsIDEwMDAwMCwgMTI1MDAwLCAxNTAwMDAsIDE3NTAwMCwgMjAwMDAwLCAyMjUwMDAKK307CisKKyNkZWZpbmUgQlEyNDI1N19JVEVSTV9NQVBfU0laRQkJQVJSQVlfU0laRShicTI0MjU3X2l0ZXJtX21hcCkKKworc3RhdGljIGNvbnN0IHUzMiBicTI0MjU3X2lpbGltaXRfbWFwW10gPSB7CisJMTAwMDAwLCAxNTAwMDAsIDUwMDAwMCwgOTAwMDAwLCAxNTAwMDAwLCAyMDAwMDAwCit9OworCisjZGVmaW5lIEJRMjQyNTdfSUlMSU1JVF9NQVBfU0laRQlBUlJBWV9TSVpFKGJxMjQyNTdfaWlsaW1pdF9tYXApCisKK3N0YXRpYyBjb25zdCB1MzIgYnEyNDI1N192b3ZwX21hcFtdID0geworCTYwMDAwMDAsIDY1MDAwMDAsIDcwMDAwMDAsIDgwMDAwMDAsIDkwMDAwMDAsIDk1MDAwMDAsIDEwMDAwMDAwLAorCTEwNTAwMDAwCit9OworCisjZGVmaW5lIEJRMjQyNTdfVk9WUF9NQVBfU0laRQkJQVJSQVlfU0laRShicTI0MjU3X3ZvdnBfbWFwKQorCitzdGF0aWMgY29uc3QgdTMyIGJxMjQyNTdfdmluZHBtX21hcFtdID0geworCTQyMDAwMDAsIDQyODAwMDAsIDQzNjAwMDAsIDQ0NDAwMDAsIDQ1MjAwMDAsIDQ2MDAwMDAsIDQ2ODAwMDAsCisJNDc2MDAwMAorfTsKKworI2RlZmluZSBCUTI0MjU3X1ZJTkRQTV9NQVBfU0laRQkJQVJSQVlfU0laRShicTI0MjU3X3ZpbmRwbV9tYXApCisKK3N0YXRpYyBpbnQgYnEyNDI1N19maWVsZF9yZWFkKHN0cnVjdCBicTI0MjU3X2RldmljZSAqYnEsCisJCQkgICAgICBlbnVtIGJxMjQyNTdfZmllbGRzIGZpZWxkX2lkKQoreworCWludCByZXQ7CisJaW50IHZhbDsKKworCXJldCA9IHJlZ21hcF9maWVsZF9yZWFkKGJxLT5ybWFwX2ZpZWxkc1tmaWVsZF9pZF0sICZ2YWwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludCBicTI0MjU3X2ZpZWxkX3dyaXRlKHN0cnVjdCBicTI0MjU3X2RldmljZSAqYnEsCisJCQkgICAgICAgZW51bSBicTI0MjU3X2ZpZWxkcyBmaWVsZF9pZCwgdTggdmFsKQoreworCXJldHVybiByZWdtYXBfZmllbGRfd3JpdGUoYnEtPnJtYXBfZmllbGRzW2ZpZWxkX2lkXSwgdmFsKTsKK30KKworc3RhdGljIHU4IGJxMjQyNTdfZmluZF9pZHgodTMyIHZhbHVlLCBjb25zdCB1MzIgKm1hcCwgdTggbWFwX3NpemUpCit7CisJdTggaWR4OworCisJZm9yIChpZHggPSAxOyBpZHggPCBtYXBfc2l6ZTsgaWR4KyspCisJCWlmICh2YWx1ZSA8IG1hcFtpZHhdKQorCQkJYnJlYWs7CisKKwlyZXR1cm4gaWR4IC0gMTsKK30KKworZW51bSBicTI0MjU3X3N0YXR1cyB7CisJU1RBVFVTX1JFQURZLAorCVNUQVRVU19DSEFSR0VfSU5fUFJPR1JFU1MsCisJU1RBVFVTX0NIQVJHRV9ET05FLAorCVNUQVRVU19GQVVMVCwKK307CisKK2VudW0gYnEyNDI1N19mYXVsdCB7CisJRkFVTFRfTk9STUFMLAorCUZBVUxUX0lOUFVUX09WUCwKKwlGQVVMVF9JTlBVVF9VVkxPLAorCUZBVUxUX1NMRUVQLAorCUZBVUxUX0JBVF9UUywKKwlGQVVMVF9CQVRfT1ZQLAorCUZBVUxUX1RTLAorCUZBVUxUX1RJTUVSLAorCUZBVUxUX05PX0JBVCwKKwlGQVVMVF9JU0VULAorCUZBVUxUX0lOUFVUX0xET19MT1csCit9OworCitzdGF0aWMgaW50IGJxMjQyNTdfZ2V0X2lucHV0X2N1cnJlbnRfbGltaXQoc3RydWN0IGJxMjQyNTdfZGV2aWNlICpicSwKKwkJCQkJICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gYnEyNDI1N19maWVsZF9yZWFkKGJxLCBGX0lJTElNSVQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBUaGUgIkV4dGVybmFsIElMSU0iIGFuZCAiUHJvZHVjdGlvbiAmIFRlc3QiIG1vZGVzIGFyZSBub3QgZXhwb3NlZAorCSAqIHRocm91Z2ggdGhpcyBkcml2ZXIgYW5kIG5vdCBiZWluZyBjb3ZlcmVkIGJ5IHRoZSBsb29rdXAgdGFibGUuCisJICogU2hvdWxkIHN1Y2ggYSBtb2RlIGhhdmUgYmVjb21lIGFjdGl2ZSBsZXQncyByZXR1cm4gYW4gZXJyb3IgcmF0aGVyCisJICogdGhhbiBleGNlZWRpbmcgdGhlIGJvdW5kcyBvZiB0aGUgbG9va3VwIHRhYmxlIGFuZCByZXR1cm5pbmcKKwkgKiBnYXJiYWdlLgorCSAqLworCWlmIChyZXQgPj0gQlEyNDI1N19JSUxJTUlUX01BUF9TSVpFKQorCQlyZXR1cm4gLUVOT0RBVEE7CisKKwl2YWwtPmludHZhbCA9IGJxMjQyNTdfaWlsaW1pdF9tYXBbcmV0XTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJxMjQyNTdfc2V0X2lucHV0X2N1cnJlbnRfbGltaXQoc3RydWN0IGJxMjQyNTdfZGV2aWNlICpicSwKKwkJCQkJY29uc3QgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwkvKgorCSAqIEFkZHJlc3MgdGhlIGNhc2Ugd2hlcmUgdGhlIHVzZXIgbWFudWFsbHkgc2V0cyBhbiBpbnB1dCBjdXJyZW50IGxpbWl0CisJICogd2hpbGUgdGhlIGNoYXJnZXIgYXV0by1kZXRlY3Rpb24gbWVjaGFuaXNtIGlzIGlzIGFjdGl2ZS4gSW4gdGhpcworCSAqIGNhc2Ugd2Ugd2FudCB0byBhYm9ydCBhbmQgZ28gc3RyYWlnaHQgdG8gdGhlIHVzZXItc3BlY2lmaWVkIHZhbHVlLgorCSAqLworCWlmIChicS0+aWlsaW1pdF9hdXRvc2V0X2VuYWJsZSkKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZicS0+aWlsaW1pdF9zZXR1cF93b3JrKTsKKworCXJldHVybiBicTI0MjU3X2ZpZWxkX3dyaXRlKGJxLCBGX0lJTElNSVQsCisJCQkJICAgYnEyNDI1N19maW5kX2lkeCh2YWwtPmludHZhbCwKKwkJCQkJCSAgICBicTI0MjU3X2lpbGltaXRfbWFwLAorCQkJCQkJICAgIEJRMjQyNTdfSUlMSU1JVF9NQVBfU0laRSkpOworfQorCitzdGF0aWMgaW50IGJxMjQyNTdfcG93ZXJfc3VwcGx5X2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJCQkJCSAgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCQkJCQkgICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJc3RydWN0IGJxMjQyNTdfZGV2aWNlICpicSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOworCXN0cnVjdCBicTI0MjU3X3N0YXRlIHN0YXRlOworCisJbXV0ZXhfbG9jaygmYnEtPmxvY2spOworCXN0YXRlID0gYnEtPnN0YXRlOworCW11dGV4X3VubG9jaygmYnEtPmxvY2spOworCisJc3dpdGNoIChwc3ApIHsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKKwkJaWYgKCFzdGF0ZS5wb3dlcl9nb29kKQorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOworCQllbHNlIGlmIChzdGF0ZS5zdGF0dXMgPT0gU1RBVFVTX1JFQURZKQorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX05PVF9DSEFSR0lORzsKKwkJZWxzZSBpZiAoc3RhdGUuc3RhdHVzID09IFNUQVRVU19DSEFSR0VfSU5fUFJPR1JFU1MpCisJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7CisJCWVsc2UgaWYgKHN0YXRlLnN0YXR1cyA9PSBTVEFUVVNfQ0hBUkdFX0RPTkUpCisJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTDsKKwkJZWxzZQorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047CisJCWJyZWFrOworCisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9NQU5VRkFDVFVSRVI6CisJCXZhbC0+c3RydmFsID0gQlEyNDI1N19NQU5VRkFDVFVSRVI7CisJCWJyZWFrOworCisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9NT0RFTF9OQU1FOgorCQl2YWwtPnN0cnZhbCA9IGJxMjQyNXhfY2hpcF9uYW1lW2JxLT5jaGlwXTsKKwkJYnJlYWs7CisKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORToKKwkJdmFsLT5pbnR2YWwgPSBzdGF0ZS5wb3dlcl9nb29kOworCQlicmVhazsKKworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfSEVBTFRIOgorCQlzd2l0Y2ggKHN0YXRlLmZhdWx0KSB7CisJCWNhc2UgRkFVTFRfTk9STUFMOgorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0Q7CisJCQlicmVhazsKKworCQljYXNlIEZBVUxUX0lOUFVUX09WUDoKKwkJY2FzZSBGQVVMVF9CQVRfT1ZQOgorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJWT0xUQUdFOworCQkJYnJlYWs7CisKKwkJY2FzZSBGQVVMVF9UUzoKKwkJY2FzZSBGQVVMVF9CQVRfVFM6CisJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUkhFQVQ7CisJCQlicmVhazsKKworCQljYXNlIEZBVUxUX1RJTUVSOgorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX1NBRkVUWV9USU1FUl9FWFBJUkU7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOU1BFQ19GQUlMVVJFOworCQkJYnJlYWs7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX0NVUlJFTlQ6CisJCXZhbC0+aW50dmFsID0gYnEyNDI1N19pY2hnX21hcFticS0+aW5pdF9kYXRhLmljaGddOworCQlicmVhazsKKworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX0NVUlJFTlRfTUFYOgorCQl2YWwtPmludHZhbCA9IGJxMjQyNTdfaWNoZ19tYXBbQlEyNDI1N19JQ0hHX01BUF9TSVpFIC0gMV07CisJCWJyZWFrOworCisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfVk9MVEFHRToKKwkJdmFsLT5pbnR2YWwgPSBicTI0MjU3X3ZiYXRfbWFwW2JxLT5pbml0X2RhdGEudmJhdF07CisJCWJyZWFrOworCisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfVk9MVEFHRV9NQVg6CisJCXZhbC0+aW50dmFsID0gYnEyNDI1N192YmF0X21hcFtCUTI0MjU3X1ZCQVRfTUFQX1NJWkUgLSAxXTsKKwkJYnJlYWs7CisKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9URVJNX0NVUlJFTlQ6CisJCXZhbC0+aW50dmFsID0gYnEyNDI1N19pdGVybV9tYXBbYnEtPmluaXRfZGF0YS5pdGVybV07CisJCWJyZWFrOworCisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9JTlBVVF9DVVJSRU5UX0xJTUlUOgorCQlyZXR1cm4gYnEyNDI1N19nZXRfaW5wdXRfY3VycmVudF9saW1pdChicSwgdmFsKTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJxMjQyNTdfcG93ZXJfc3VwcGx5X3NldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJCQkJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHByb3AsCisJCQkJCWNvbnN0IHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJc3RydWN0IGJxMjQyNTdfZGV2aWNlICpicSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOworCisJc3dpdGNoIChwcm9wKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9JTlBVVF9DVVJSRU5UX0xJTUlUOgorCQlyZXR1cm4gYnEyNDI1N19zZXRfaW5wdXRfY3VycmVudF9saW1pdChicSwgdmFsKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYnEyNDI1N19wb3dlcl9zdXBwbHlfcHJvcGVydHlfaXNfd3JpdGVhYmxlKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKKwkJCQkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwKQoreworCXN3aXRjaCAocHNwKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9JTlBVVF9DVVJSRU5UX0xJTUlUOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitzdGF0aWMgaW50IGJxMjQyNTdfZ2V0X2NoaXBfc3RhdGUoc3RydWN0IGJxMjQyNTdfZGV2aWNlICpicSwKKwkJCQkgIHN0cnVjdCBicTI0MjU3X3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gYnEyNDI1N19maWVsZF9yZWFkKGJxLCBGX1NUQVQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJc3RhdGUtPnN0YXR1cyA9IHJldDsKKworCXJldCA9IGJxMjQyNTdfZmllbGRfcmVhZChicSwgRl9GQVVMVCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzdGF0ZS0+ZmF1bHQgPSByZXQ7CisKKwlpZiAoYnEtPnBnKQorCQlzdGF0ZS0+cG93ZXJfZ29vZCA9ICFncGlvZF9nZXRfdmFsdWVfY2Fuc2xlZXAoYnEtPnBnKTsKKwllbHNlCisJCS8qCisJCSAqIElmIHdlIGhhdmUgYSBjaGlwIHdpdGhvdXQgYSBkZWRpY2F0ZWQgcG93ZXItZ29vZCBHUElPIG9yCisJCSAqIHNvbWUgb3RoZXIgZXhwbGljaXQgYml0IHRoYXQgd291bGQgcHJvdmlkZSB0aGlzIGluZm9ybWF0aW9uCisJCSAqIGFzc3VtZSB0aGUgcG93ZXIgaXMgZ29vZCBpZiB0aGVyZSBpcyBubyBzdXBwbHkgcmVsYXRlZAorCQkgKiBmYXVsdCAtIGFuZCBub3QgZ29vZCBvdGhlcndpc2UuIFRoZXJlIGlzIGEgcG9zc2liaWxpdHkgZm9yCisJCSAqIG90aGVyIGVycm9ycyB0byBtYXNrIHRoYXQgcG93ZXIgaW4gZmFjdCBpcyBub3QgZ29vZCBidXQgdGhpcworCQkgKiBpcyBwcm9iYWJseSB0aGUgYmVzdCB3ZSBjYW4gZG8gaGVyZS4KKwkJICovCisJCXN3aXRjaCAoc3RhdGUtPmZhdWx0KSB7CisJCWNhc2UgRkFVTFRfSU5QVVRfT1ZQOgorCQljYXNlIEZBVUxUX0lOUFVUX1VWTE86CisJCWNhc2UgRkFVTFRfSU5QVVRfTERPX0xPVzoKKwkJCXN0YXRlLT5wb3dlcl9nb29kID0gZmFsc2U7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXN0YXRlLT5wb3dlcl9nb29kID0gdHJ1ZTsKKwkJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sIGJxMjQyNTdfc3RhdGVfY2hhbmdlZChzdHJ1Y3QgYnEyNDI1N19kZXZpY2UgKmJxLAorCQkJCSAgc3RydWN0IGJxMjQyNTdfc3RhdGUgKm5ld19zdGF0ZSkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmYnEtPmxvY2spOworCXJldCA9IChicS0+c3RhdGUuc3RhdHVzICE9IG5ld19zdGF0ZS0+c3RhdHVzIHx8CisJICAgICAgIGJxLT5zdGF0ZS5mYXVsdCAhPSBuZXdfc3RhdGUtPmZhdWx0IHx8CisJICAgICAgIGJxLT5zdGF0ZS5wb3dlcl9nb29kICE9IG5ld19zdGF0ZS0+cG93ZXJfZ29vZCk7CisJbXV0ZXhfdW5sb2NrKCZicS0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitlbnVtIGJxMjQyNTdfbG9vcF9zdGF0dXMgeworCUxPT1BfU1RBVFVTX05PTkUsCisJTE9PUF9TVEFUVVNfSU5fRFBNLAorCUxPT1BfU1RBVFVTX0lOX0NVUlJFTlRfTElNSVQsCisJTE9PUF9TVEFUVVNfVEhFUk1BTCwKK307CisKK2VudW0gYnEyNDI1N19pbl9pbGltaXQgeworCUlJTElNSVRfMTAwLAorCUlJTElNSVRfMTUwLAorCUlJTElNSVRfNTAwLAorCUlJTElNSVRfOTAwLAorCUlJTElNSVRfMTUwMCwKKwlJSUxJTUlUXzIwMDAsCisJSUlMSU1JVF9FWFQsCisJSUlMSU1JVF9OT05FLAorfTsKKworZW51bSBicTI0MjU3X3ZvdnAgeworCVZPVlBfNjAwMCwKKwlWT1ZQXzY1MDAsCisJVk9WUF83MDAwLAorCVZPVlBfODAwMCwKKwlWT1ZQXzkwMDAsCisJVk9WUF85NTAwLAorCVZPVlBfMTAwMDAsCisJVk9WUF8xMDUwMAorfTsKKworZW51bSBicTI0MjU3X3ZpbmRwbSB7CisJVklORFBNXzQyMDAsCisJVklORFBNXzQyODAsCisJVklORFBNXzQzNjAsCisJVklORFBNXzQ0NDAsCisJVklORFBNXzQ1MjAsCisJVklORFBNXzQ2MDAsCisJVklORFBNXzQ2ODAsCisJVklORFBNXzQ3NjAKK307CisKK2VudW0gYnEyNDI1N19wb3J0X3R5cGUgeworCVBPUlRfVFlQRV9EQ1AsCQkvKiBEZWRpY2F0ZWQgQ2hhcmdpbmcgUG9ydCAqLworCVBPUlRfVFlQRV9DRFAsCQkvKiBDaGFyZ2luZyBEb3duc3RyZWFtIFBvcnQgKi8KKwlQT1JUX1RZUEVfU0RQLAkJLyogU3RhbmRhcmQgRG93bnN0cmVhbSBQb3J0ICovCisJUE9SVF9UWVBFX05PTl9TVEFOREFSRCwKK307CisKK2VudW0gYnEyNDI1N19zYWZldHlfdGltZXIgeworCVNBRkVUWV9USU1FUl80NSwKKwlTQUZFVFlfVElNRVJfMzYwLAorCVNBRkVUWV9USU1FUl81NDAsCisJU0FGRVRZX1RJTUVSX05PTkUsCit9OworCitzdGF0aWMgaW50IGJxMjQyNTdfaWlsaW1pdF9hdXRvc2V0KHN0cnVjdCBicTI0MjU3X2RldmljZSAqYnEpCit7CisJaW50IGxvb3Bfc3RhdHVzOworCWludCBpaWxpbWl0OworCWludCBwb3J0X3R5cGU7CisJaW50IHJldDsKKwljb25zdCB1OCBuZXdfaWlsaW1pdFtdID0geworCQlbUE9SVF9UWVBFX0RDUF0gPSBJSUxJTUlUXzIwMDAsCisJCVtQT1JUX1RZUEVfQ0RQXSA9IElJTElNSVRfMjAwMCwKKwkJW1BPUlRfVFlQRV9TRFBdID0gSUlMSU1JVF81MDAsCisJCVtQT1JUX1RZUEVfTk9OX1NUQU5EQVJEXSA9IElJTElNSVRfNTAwCisJfTsKKworCXJldCA9IGJxMjQyNTdfZmllbGRfcmVhZChicSwgRl9MT09QX1NUQVRVUyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlsb29wX3N0YXR1cyA9IHJldDsKKworCXJldCA9IGJxMjQyNTdfZmllbGRfcmVhZChicSwgRl9JSUxJTUlUKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCWlpbGltaXQgPSByZXQ7CisKKwkvKgorCSAqIEFsbCBVU0IgcG9ydHMgc2hvdWxkIGJlIGFibGUgdG8gaGFuZGxlIDUwMG1BLiBJZiBub3QsIERQTSB3aWxsIGxvd2VyCisJICogdGhlIGNoYXJnaW5nIGN1cnJlbnQgdG8gYWNjb21tb2RhdGUgdGhlIHBvd2VyIHNvdXJjZS4gTm8gbmVlZCB0byBzZXQKKwkgKiBhIGxvd2VyIElJTElNSVQgdmFsdWUuCisJICovCisJaWYgKGxvb3Bfc3RhdHVzID09IExPT1BfU1RBVFVTX0lOX0RQTSAmJiBpaWxpbWl0ID09IElJTElNSVRfNTAwKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGJxMjQyNTdfZmllbGRfcmVhZChicSwgRl9VU0JfREVUKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCXBvcnRfdHlwZSA9IHJldDsKKworCXJldCA9IGJxMjQyNTdfZmllbGRfd3JpdGUoYnEsIEZfSUlMSU1JVCwgbmV3X2lpbGltaXRbcG9ydF90eXBlXSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBicTI0MjU3X2ZpZWxkX3dyaXRlKGJxLCBGX1RNUiwgU0FGRVRZX1RJTUVSXzM2MCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBicTI0MjU3X2ZpZWxkX3dyaXRlKGJxLCBGX0NMUl9WRFAsIDEpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJZGV2X2RiZyhicS0+ZGV2LCAicG9ydC9sb29wID0gJWQvJWQgLT4gaWlsaW1pdCA9ICVkXG4iLAorCQlwb3J0X3R5cGUsIGxvb3Bfc3RhdHVzLCBuZXdfaWlsaW1pdFtwb3J0X3R5cGVdKTsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlkZXZfZXJyKGJxLT5kZXYsICIlczogRXJyb3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBjaGlwLlxuIiwgX19mdW5jX18pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGJxMjQyNTdfaWlsaW1pdF9zZXR1cF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYnEyNDI1N19kZXZpY2UgKmJxID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBicTI0MjU3X2RldmljZSwKKwkJCQkJCSBpaWxpbWl0X3NldHVwX3dvcmsud29yayk7CisKKwlicTI0MjU3X2lpbGltaXRfYXV0b3NldChicSk7Cit9CisKK3N0YXRpYyB2b2lkIGJxMjQyNTdfaGFuZGxlX3N0YXRlX2NoYW5nZShzdHJ1Y3QgYnEyNDI1N19kZXZpY2UgKmJxLAorCQkJCQlzdHJ1Y3QgYnEyNDI1N19zdGF0ZSAqbmV3X3N0YXRlKQoreworCWludCByZXQ7CisJc3RydWN0IGJxMjQyNTdfc3RhdGUgb2xkX3N0YXRlOworCisJbXV0ZXhfbG9jaygmYnEtPmxvY2spOworCW9sZF9zdGF0ZSA9IGJxLT5zdGF0ZTsKKwltdXRleF91bmxvY2soJmJxLT5sb2NrKTsKKworCS8qCisJICogSGFuZGxlIEJRMjQyNXggc3RhdGUgY2hhbmdlcyBvYnNlcnZpbmcgd2hldGhlciB0aGUgRCsvRC0gYmFzZWQgaW5wdXQKKwkgKiBjdXJyZW50IGxpbWl0IGF1dG9zZXQgZnVuY3Rpb25hbGl0eSBpcyBlbmFibGVkLgorCSAqLworCWlmICghbmV3X3N0YXRlLT5wb3dlcl9nb29kKSB7CisJCWRldl9kYmcoYnEtPmRldiwgIlBvd2VyIHJlbW92ZWRcbiIpOworCQlpZiAoYnEtPmlpbGltaXRfYXV0b3NldF9lbmFibGUpIHsKKwkJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYnEtPmlpbGltaXRfc2V0dXBfd29yayk7CisKKwkJCS8qIGFjdGl2YXRlIEQrL0QtIHBvcnQgZGV0ZWN0aW9uIGFsZ29yaXRobSAqLworCQkJcmV0ID0gYnEyNDI1N19maWVsZF93cml0ZShicSwgRl9EUERNX0VOLCAxKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCX0KKwkJLyoKKwkJICogV2hlbiBwb3dlciBpcyByZW1vdmVkIGFsd2F5cyByZXR1cm4gdG8gdGhlIGRlZmF1bHQgaW5wdXQKKwkJICogY3VycmVudCBsaW1pdCBhcyBjb25maWd1cmVkIGR1cmluZyBwcm9iZS4KKwkJICovCisJCXJldCA9IGJxMjQyNTdfZmllbGRfd3JpdGUoYnEsIEZfSUlMSU1JVCwgYnEtPmluaXRfZGF0YS5paWxpbWl0KTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycm9yOworCX0gZWxzZSBpZiAoIW9sZF9zdGF0ZS5wb3dlcl9nb29kKSB7CisJCWRldl9kYmcoYnEtPmRldiwgIlBvd2VyIGluc2VydGVkXG4iKTsKKworCQlpZiAoYnEtPmlpbGltaXRfYXV0b3NldF9lbmFibGUpCisJCQkvKiBjb25maWd1cmUgaW5wdXQgY3VycmVudCBsaW1pdCAqLworCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZicS0+aWlsaW1pdF9zZXR1cF93b3JrLAorCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoQlEyNDI1N19JTElNX1NFVF9ERUxBWSkpOworCX0gZWxzZSBpZiAobmV3X3N0YXRlLT5mYXVsdCA9PSBGQVVMVF9OT19CQVQpIHsKKwkJZGV2X3dhcm4oYnEtPmRldiwgIkJhdHRlcnkgcmVtb3ZlZFxuIik7CisJfSBlbHNlIGlmIChuZXdfc3RhdGUtPmZhdWx0ID09IEZBVUxUX1RJTUVSKSB7CisJCWRldl9lcnIoYnEtPmRldiwgIlNhZmV0eSB0aW1lciBleHBpcmVkISBCYXR0ZXJ5IGRlYWQ/XG4iKTsKKwl9CisKKwlyZXR1cm47CisKK2Vycm9yOgorCWRldl9lcnIoYnEtPmRldiwgIiVzOiBFcnJvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIGNoaXAuXG4iLCBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBicTI0MjU3X2lycV9oYW5kbGVyX3RocmVhZChpbnQgaXJxLCB2b2lkICpwcml2YXRlKQoreworCWludCByZXQ7CisJc3RydWN0IGJxMjQyNTdfZGV2aWNlICpicSA9IHByaXZhdGU7CisJc3RydWN0IGJxMjQyNTdfc3RhdGUgc3RhdGU7CisKKwlyZXQgPSBicTI0MjU3X2dldF9jaGlwX3N0YXRlKGJxLCAmc3RhdGUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwlpZiAoIWJxMjQyNTdfc3RhdGVfY2hhbmdlZChicSwgJnN0YXRlKSkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJZGV2X2RiZyhicS0+ZGV2LCAiaXJxKHN0YXRlIGNoYW5nZWQpOiBzdGF0dXMvZmF1bHQvcGcgPSAlZC8lZC8lZFxuIiwKKwkJc3RhdGUuc3RhdHVzLCBzdGF0ZS5mYXVsdCwgc3RhdGUucG93ZXJfZ29vZCk7CisKKwlicTI0MjU3X2hhbmRsZV9zdGF0ZV9jaGFuZ2UoYnEsICZzdGF0ZSk7CisKKwltdXRleF9sb2NrKCZicS0+bG9jayk7CisJYnEtPnN0YXRlID0gc3RhdGU7CisJbXV0ZXhfdW5sb2NrKCZicS0+bG9jayk7CisKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZChicS0+Y2hhcmdlcik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgYnEyNDI1N19od19pbml0KHN0cnVjdCBicTI0MjU3X2RldmljZSAqYnEpCit7CisJaW50IHJldDsKKwlpbnQgaTsKKwlzdHJ1Y3QgYnEyNDI1N19zdGF0ZSBzdGF0ZTsKKworCWNvbnN0IHN0cnVjdCB7CisJCWludCBmaWVsZDsKKwkJdTMyIHZhbHVlOworCX0gaW5pdF9kYXRhW10gPSB7CisJCXtGX0lDSEcsIGJxLT5pbml0X2RhdGEuaWNoZ30sCisJCXtGX1ZCQVQsIGJxLT5pbml0X2RhdGEudmJhdH0sCisJCXtGX0lURVJNLCBicS0+aW5pdF9kYXRhLml0ZXJtfSwKKwkJe0ZfVk9WUCwgYnEtPmluaXRfZGF0YS52b3ZwfSwKKwkJe0ZfVklORFBNLCBicS0+aW5pdF9kYXRhLnZpbmRwbX0sCisJfTsKKworCS8qCisJICogRGlzYWJsZSB0aGUgd2F0Y2hkb2cgdGltZXIgdG8gcHJldmVudCB0aGUgSUMgZnJvbSBnb2luZyBiYWNrIHRvCisJICogZGVmYXVsdCBzZXR0aW5ncyBhZnRlciA1MCBzZWNvbmRzIG9mIEkyQyBpbmFjdGl2aXR5LgorCSAqLworCXJldCA9IGJxMjQyNTdfZmllbGRfd3JpdGUoYnEsIEZfV0RfRU4sIDApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogY29uZmlndXJlIHRoZSBjaGFyZ2UgY3VycmVudHMgYW5kIHZvbHRhZ2VzICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW5pdF9kYXRhKTsgaSsrKSB7CisJCXJldCA9IGJxMjQyNTdfZmllbGRfd3JpdGUoYnEsIGluaXRfZGF0YVtpXS5maWVsZCwKKwkJCQkJICBpbml0X2RhdGFbaV0udmFsdWUpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gYnEyNDI1N19nZXRfY2hpcF9zdGF0ZShicSwgJnN0YXRlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW11dGV4X2xvY2soJmJxLT5sb2NrKTsKKwlicS0+c3RhdGUgPSBzdGF0ZTsKKwltdXRleF91bmxvY2soJmJxLT5sb2NrKTsKKworCWlmICghYnEtPmlpbGltaXRfYXV0b3NldF9lbmFibGUpIHsKKwkJZGV2X2RiZyhicS0+ZGV2LCAibWFudWFsbHkgc2V0dGluZyBpaWxpbWl0ID0gJXVcbiIsCisJCQlicS0+aW5pdF9kYXRhLmlpbGltaXQpOworCisJCS8qIHByb2dyYW0gZml4ZWQgaW5wdXQgY3VycmVudCBsaW1pdCAqLworCQlyZXQgPSBicTI0MjU3X2ZpZWxkX3dyaXRlKGJxLCBGX0lJTElNSVQsCisJCQkJCSAgYnEtPmluaXRfZGF0YS5paWxpbWl0KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0gZWxzZSBpZiAoIXN0YXRlLnBvd2VyX2dvb2QpCisJCS8qIGFjdGl2YXRlIEQrL0QtIGRldGVjdGlvbiBhbGdvcml0aG0gKi8KKwkJcmV0ID0gYnEyNDI1N19maWVsZF93cml0ZShicSwgRl9EUERNX0VOLCAxKTsKKwllbHNlIGlmIChzdGF0ZS5mYXVsdCAhPSBGQVVMVF9OT19CQVQpCisJCXJldCA9IGJxMjQyNTdfaWlsaW1pdF9hdXRvc2V0KGJxKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBicTI0MjU3X3Bvd2VyX3N1cHBseV9wcm9wc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUiwKKwlQT1dFUl9TVVBQTFlfUFJPUF9NT0RFTF9OQU1FLAorCVBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywKKwlQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUsCisJUE9XRVJfU1VQUExZX1BST1BfSEVBTFRILAorCVBPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9DVVJSRU5ULAorCVBPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9DVVJSRU5UX01BWCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfVk9MVEFHRSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfVk9MVEFHRV9NQVgsCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX1RFUk1fQ1VSUkVOVCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9JTlBVVF9DVVJSRU5UX0xJTUlULAorfTsKKworc3RhdGljIGNoYXIgKmJxMjQyNTdfY2hhcmdlcl9zdXBwbGllZF90b1tdID0geworCSJtYWluLWJhdHRlcnkiLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBicTI0MjU3X3Bvd2VyX3N1cHBseV9kZXNjID0geworCS5uYW1lID0gImJxMjQyNTctY2hhcmdlciIsCisJLnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9VU0IsCisJLnByb3BlcnRpZXMgPSBicTI0MjU3X3Bvd2VyX3N1cHBseV9wcm9wcywKKwkubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKGJxMjQyNTdfcG93ZXJfc3VwcGx5X3Byb3BzKSwKKwkuZ2V0X3Byb3BlcnR5ID0gYnEyNDI1N19wb3dlcl9zdXBwbHlfZ2V0X3Byb3BlcnR5LAorCS5zZXRfcHJvcGVydHkgPSBicTI0MjU3X3Bvd2VyX3N1cHBseV9zZXRfcHJvcGVydHksCisJLnByb3BlcnR5X2lzX3dyaXRlYWJsZSA9IGJxMjQyNTdfcG93ZXJfc3VwcGx5X3Byb3BlcnR5X2lzX3dyaXRlYWJsZSwKK307CisKK3N0YXRpYyBzc2l6ZV90IGJxMjQyNTdfc2hvd19vdnBfdm9sdGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQljaGFyICpidWYpCit7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGJxMjQyNTdfZGV2aWNlICpicSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOworCisJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLAorCQkJIGJxMjQyNTdfdm92cF9tYXBbYnEtPmluaXRfZGF0YS52b3ZwXSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGJxMjQyNTdfc2hvd19pbl9kcG1fdm9sdGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgICBjaGFyICpidWYpCit7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGJxMjQyNTdfZGV2aWNlICpicSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOworCisJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLAorCQkJIGJxMjQyNTdfdmluZHBtX21hcFticS0+aW5pdF9kYXRhLnZpbmRwbV0pOworfQorCitzdGF0aWMgc3NpemVfdCBicTI0MjU3X3N5c2ZzX3Nob3dfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgY2hhciAqYnVmKQoreworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBicTI0MjU3X2RldmljZSAqYnEgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKKwlpbnQgcmV0OworCisJaWYgKHN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJoaWdoX2ltcGVkYW5jZV9lbmFibGUiKSA9PSAwKQorCQlyZXQgPSBicTI0MjU3X2ZpZWxkX3JlYWQoYnEsIEZfSFpfTU9ERSk7CisJZWxzZSBpZiAoc3RyY21wKGF0dHItPmF0dHIubmFtZSwgInN5c29mZl9lbmFibGUiKSA9PSAwKQorCQlyZXQgPSBicTI0MjU3X2ZpZWxkX3JlYWQoYnEsIEZfU1lTT0ZGKTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHJldCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGJxMjQyNTdfc3lzZnNfc2V0X2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQljb25zdCBjaGFyICpidWYsCisJCQkJCXNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYnEyNDI1N19kZXZpY2UgKmJxID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CisJbG9uZyB2YWw7CisJaW50IHJldDsKKworCWlmIChrc3RydG9sKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc3RyY21wKGF0dHItPmF0dHIubmFtZSwgImhpZ2hfaW1wZWRhbmNlX2VuYWJsZSIpID09IDApCisJCXJldCA9IGJxMjQyNTdfZmllbGRfd3JpdGUoYnEsIEZfSFpfTU9ERSwgKGJvb2wpdmFsKTsKKwllbHNlIGlmIChzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAic3lzb2ZmX2VuYWJsZSIpID09IDApCisJCXJldCA9IGJxMjQyNTdfZmllbGRfd3JpdGUoYnEsIEZfU1lTT0ZGLCAoYm9vbCl2YWwpOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKG92cF92b2x0YWdlLCBTX0lSVUdPLCBicTI0MjU3X3Nob3dfb3ZwX3ZvbHRhZ2UsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGluX2RwbV92b2x0YWdlLCBTX0lSVUdPLCBicTI0MjU3X3Nob3dfaW5fZHBtX3ZvbHRhZ2UsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGhpZ2hfaW1wZWRhbmNlX2VuYWJsZSwgU19JV1VTUiB8IFNfSVJVR08sCisJCSAgIGJxMjQyNTdfc3lzZnNfc2hvd19lbmFibGUsIGJxMjQyNTdfc3lzZnNfc2V0X2VuYWJsZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoc3lzb2ZmX2VuYWJsZSwgU19JV1VTUiB8IFNfSVJVR08sCisJCSAgIGJxMjQyNTdfc3lzZnNfc2hvd19lbmFibGUsIGJxMjQyNTdfc3lzZnNfc2V0X2VuYWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpicTI0MjU3X2NoYXJnZXJfYXR0cltdID0geworCSZkZXZfYXR0cl9vdnBfdm9sdGFnZS5hdHRyLAorCSZkZXZfYXR0cl9pbl9kcG1fdm9sdGFnZS5hdHRyLAorCSZkZXZfYXR0cl9oaWdoX2ltcGVkYW5jZV9lbmFibGUuYXR0ciwKKwkmZGV2X2F0dHJfc3lzb2ZmX2VuYWJsZS5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBicTI0MjU3X2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gYnEyNDI1N19jaGFyZ2VyX2F0dHIsCit9OworCitzdGF0aWMgaW50IGJxMjQyNTdfcG93ZXJfc3VwcGx5X2luaXQoc3RydWN0IGJxMjQyNTdfZGV2aWNlICpicSkKK3sKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0geyAuZHJ2X2RhdGEgPSBicSwgfTsKKworCXBzeV9jZmcuc3VwcGxpZWRfdG8gPSBicTI0MjU3X2NoYXJnZXJfc3VwcGxpZWRfdG87CisJcHN5X2NmZy5udW1fc3VwcGxpY2FudHMgPSBBUlJBWV9TSVpFKGJxMjQyNTdfY2hhcmdlcl9zdXBwbGllZF90byk7CisKKwlicS0+Y2hhcmdlciA9IGRldm1fcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKGJxLT5kZXYsCisJCQkJCQkgJmJxMjQyNTdfcG93ZXJfc3VwcGx5X2Rlc2MsCisJCQkJCQkgJnBzeV9jZmcpOworCisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhicS0+Y2hhcmdlcik7Cit9CisKK3N0YXRpYyB2b2lkIGJxMjQyNTdfcGdfZ3Bpb19wcm9iZShzdHJ1Y3QgYnEyNDI1N19kZXZpY2UgKmJxKQoreworCWJxLT5wZyA9IGRldm1fZ3Bpb2RfZ2V0X29wdGlvbmFsKGJxLT5kZXYsIEJRMjQyNTdfUEdfR1BJTywgR1BJT0RfSU4pOworCisJaWYgKFBUUl9FUlIoYnEtPnBnKSA9PSAtRVBST0JFX0RFRkVSKSB7CisJCWRldl9pbmZvKGJxLT5kZXYsICJwcm9iZSByZXRyeSByZXF1ZXN0ZWQgZm9yIFBHIHBpblxuIik7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKElTX0VSUihicS0+cGcpKSB7CisJCWRldl9lcnIoYnEtPmRldiwgImVycm9yIHByb2JpbmcgUEcgcGluXG4iKTsKKwkJYnEtPnBnID0gTlVMTDsKKwkJcmV0dXJuOworCX0KKworCWlmIChicS0+cGcpCisJCWRldl9kYmcoYnEtPmRldiwgInByb2JlZCBQRyBwaW4gPSAlZFxuIiwgZGVzY190b19ncGlvKGJxLT5wZykpOworfQorCitzdGF0aWMgaW50IGJxMjQyNTdfZndfcHJvYmUoc3RydWN0IGJxMjQyNTdfZGV2aWNlICpicSkKK3sKKwlpbnQgcmV0OworCXUzMiBwcm9wZXJ0eTsKKworCS8qIFJlcXVpcmVkIHByb3BlcnRpZXMgKi8KKwlyZXQgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIoYnEtPmRldiwgInRpLGNoYXJnZS1jdXJyZW50IiwgJnByb3BlcnR5KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWJxLT5pbml0X2RhdGEuaWNoZyA9IGJxMjQyNTdfZmluZF9pZHgocHJvcGVydHksIGJxMjQyNTdfaWNoZ19tYXAsCisJCQkJCSAgICAgIEJRMjQyNTdfSUNIR19NQVBfU0laRSk7CisKKwlyZXQgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIoYnEtPmRldiwgInRpLGJhdHRlcnktcmVndWxhdGlvbi12b2x0YWdlIiwKKwkJCQkgICAgICAgJnByb3BlcnR5KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWJxLT5pbml0X2RhdGEudmJhdCA9IGJxMjQyNTdfZmluZF9pZHgocHJvcGVydHksIGJxMjQyNTdfdmJhdF9tYXAsCisJCQkJCSAgICAgIEJRMjQyNTdfVkJBVF9NQVBfU0laRSk7CisKKwlyZXQgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIoYnEtPmRldiwgInRpLHRlcm1pbmF0aW9uLWN1cnJlbnQiLAorCQkJCSAgICAgICAmcHJvcGVydHkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJYnEtPmluaXRfZGF0YS5pdGVybSA9IGJxMjQyNTdfZmluZF9pZHgocHJvcGVydHksIGJxMjQyNTdfaXRlcm1fbWFwLAorCQkJCQkgICAgICAgQlEyNDI1N19JVEVSTV9NQVBfU0laRSk7CisKKwkvKiBPcHRpb25hbCBwcm9wZXJ0aWVzLiBJZiBub3QgcHJvdmlkZWQgdXNlIHJlYXNvbmFibGUgZGVmYXVsdC4gKi8KKwlyZXQgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIoYnEtPmRldiwgInRpLGN1cnJlbnQtbGltaXQiLAorCQkJCSAgICAgICAmcHJvcGVydHkpOworCWlmIChyZXQgPCAwKSB7CisJCWJxLT5paWxpbWl0X2F1dG9zZXRfZW5hYmxlID0gdHJ1ZTsKKworCQkvKgorCQkgKiBFeHBsaWNpdGx5IHNldCBhIGRlZmF1bHQgdmFsdWUgd2hpY2ggd2lsbCBiZSBuZWVkZWQgZm9yCisJCSAqIGRldmljZXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZSBhdXRvbWF0aWMgc2V0dGluZyBvZiB0aGUgaW5wdXQKKwkJICogY3VycmVudCBsaW1pdCB0aHJvdWdoIHRoZSBjaGFyZ2VyIHR5cGUgZGV0ZWN0aW9uIG1lY2hhbmlzbS4KKwkJICovCisJCWJxLT5pbml0X2RhdGEuaWlsaW1pdCA9IElJTElNSVRfNTAwOworCX0gZWxzZQorCQlicS0+aW5pdF9kYXRhLmlpbGltaXQgPQorCQkJCWJxMjQyNTdfZmluZF9pZHgocHJvcGVydHksCisJCQkJCQkgYnEyNDI1N19paWxpbWl0X21hcCwKKwkJCQkJCSBCUTI0MjU3X0lJTElNSVRfTUFQX1NJWkUpOworCisJcmV0ID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKGJxLT5kZXYsICJ0aSxvdnAtdm9sdGFnZSIsCisJCQkJICAgICAgICZwcm9wZXJ0eSk7CisJaWYgKHJldCA8IDApCisJCWJxLT5pbml0X2RhdGEudm92cCA9IFZPVlBfNjUwMDsKKwllbHNlCisJCWJxLT5pbml0X2RhdGEudm92cCA9IGJxMjQyNTdfZmluZF9pZHgocHJvcGVydHksCisJCQkJCQkgICAgICBicTI0MjU3X3ZvdnBfbWFwLAorCQkJCQkJICAgICAgQlEyNDI1N19WT1ZQX01BUF9TSVpFKTsKKworCXJldCA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMihicS0+ZGV2LCAidGksaW4tZHBtLXZvbHRhZ2UiLAorCQkJCSAgICAgICAmcHJvcGVydHkpOworCWlmIChyZXQgPCAwKQorCQlicS0+aW5pdF9kYXRhLnZpbmRwbSA9IFZJTkRQTV80MzYwOworCWVsc2UKKwkJYnEtPmluaXRfZGF0YS52aW5kcG0gPQorCQkJCWJxMjQyNTdfZmluZF9pZHgocHJvcGVydHksCisJCQkJCQkgYnEyNDI1N192aW5kcG1fbWFwLAorCQkJCQkJIEJRMjQyNTdfVklORFBNX01BUF9TSVpFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJxMjQyNTdfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gdG9faTJjX2FkYXB0ZXIoY2xpZW50LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CisJY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkICphY3BpX2lkOworCXN0cnVjdCBicTI0MjU3X2RldmljZSAqYnE7CisJaW50IHJldDsKKwlpbnQgaTsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkgeworCQlkZXZfZXJyKGRldiwgIk5vIHN1cHBvcnQgZm9yIFNNQlVTX0JZVEVfREFUQVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWJxID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpicSksIEdGUF9LRVJORUwpOworCWlmICghYnEpCisJCXJldHVybiAtRU5PTUVNOworCisJYnEtPmNsaWVudCA9IGNsaWVudDsKKwlicS0+ZGV2ID0gZGV2OworCisJaWYgKEFDUElfSEFORExFKGRldikpIHsKKwkJYWNwaV9pZCA9IGFjcGlfbWF0Y2hfZGV2aWNlKGRldi0+ZHJpdmVyLT5hY3BpX21hdGNoX3RhYmxlLAorCQkJCQkgICAgJmNsaWVudC0+ZGV2KTsKKwkJaWYgKCFhY3BpX2lkKSB7CisJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBtYXRjaCBBQ1BJIGRldmljZVxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlicS0+Y2hpcCA9IChlbnVtIGJxMjQyNXhfY2hpcClhY3BpX2lkLT5kcml2ZXJfZGF0YTsKKwl9IGVsc2UgeworCQlicS0+Y2hpcCA9IChlbnVtIGJxMjQyNXhfY2hpcClpZC0+ZHJpdmVyX2RhdGE7CisJfQorCisJbXV0ZXhfaW5pdCgmYnEtPmxvY2spOworCisJYnEtPnJtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZicTI0MjU3X3JlZ21hcF9jb25maWcpOworCWlmIChJU19FUlIoYnEtPnJtYXApKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIHJlZ2lzdGVyIG1hcFxuIik7CisJCXJldHVybiBQVFJfRVJSKGJxLT5ybWFwKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShicTI0MjU3X3JlZ19maWVsZHMpOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IHJlZ19maWVsZCAqcmVnX2ZpZWxkcyA9IGJxMjQyNTdfcmVnX2ZpZWxkczsKKworCQlicS0+cm1hcF9maWVsZHNbaV0gPSBkZXZtX3JlZ21hcF9maWVsZF9hbGxvYyhkZXYsIGJxLT5ybWFwLAorCQkJCQkJCSAgICAgcmVnX2ZpZWxkc1tpXSk7CisJCWlmIChJU19FUlIoYnEtPnJtYXBfZmllbGRzW2ldKSkgeworCQkJZGV2X2VycihkZXYsICJjYW5ub3QgYWxsb2NhdGUgcmVnbWFwIGZpZWxkXG4iKTsKKwkJCXJldHVybiBQVFJfRVJSKGJxLT5ybWFwX2ZpZWxkc1tpXSk7CisJCX0KKwl9CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBicSk7CisKKwlpZiAoIWRldi0+cGxhdGZvcm1fZGF0YSkgeworCQlyZXQgPSBicTI0MjU3X2Z3X3Byb2JlKGJxKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiQ2Fubm90IHJlYWQgZGV2aWNlIHByb3BlcnRpZXMuXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9IGVsc2UgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKgorCSAqIFRoZSBCUTI0MjUwIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgRCsvRC0gYmFzZWQgY2hhcmdlciB0eXBlIGRldGVjdGlvbgorCSAqIHVzZWQgZm9yIHRoZSBhdXRvbWF0aWMgc2V0dGluZyBvZiB0aGUgaW5wdXQgY3VycmVudCBsaW1pdCBzZXR0aW5nIHNvCisJICogZXhwbGljaXRseSBkaXNhYmxlIHRoYXQgZmVhdHVyZS4KKwkgKi8KKwlpZiAoYnEtPmNoaXAgPT0gQlEyNDI1MCkKKwkJYnEtPmlpbGltaXRfYXV0b3NldF9lbmFibGUgPSBmYWxzZTsKKworCWlmIChicS0+aWlsaW1pdF9hdXRvc2V0X2VuYWJsZSkKKwkJSU5JVF9ERUxBWUVEX1dPUksoJmJxLT5paWxpbWl0X3NldHVwX3dvcmssCisJCQkJICBicTI0MjU3X2lpbGltaXRfc2V0dXBfd29yayk7CisKKwkvKgorCSAqIFRoZSBCUTI0MjUwIGRvZXNuJ3QgaGF2ZSBhIGRlZGljYXRlZCBQb3dlciBHb29kIChQRykgcGluIHNvIGxldCdzCisJICogbm90IHByb2JlIGZvciBpdCBhbmQgaW5zdGVhZCB1c2UgYSBTVy1iYXNlZCBhcHByb2FjaCB0byBkZXRlcm1pbmUKKwkgKiB0aGUgUEcgc3RhdGUuIFdlIGFsc28gdXNlIGEgU1ctYmFzZWQgYXBwcm9hY2ggZm9yIGFsbCBvdGhlciBkZXZpY2VzCisJICogaWYgdGhlIFBHIHBpbiBpcyBlaXRoZXIgbm90IGRlZmluZWQgb3IgY2FuJ3QgYmUgcHJvYmVkLgorCSAqLworCWlmIChicS0+Y2hpcCAhPSBCUTI0MjUwKQorCQlicTI0MjU3X3BnX2dwaW9fcHJvYmUoYnEpOworCisJaWYgKFBUUl9FUlIoYnEtPnBnKSA9PSAtRVBST0JFX0RFRkVSKQorCQlyZXR1cm4gUFRSX0VSUihicS0+cGcpOworCWVsc2UgaWYgKCFicS0+cGcpCisJCWRldl9pbmZvKGJxLT5kZXYsICJ1c2luZyBTVy1iYXNlZCBwb3dlci1nb29kIGRldGVjdGlvblxuIik7CisKKwkvKiByZXNldCBhbGwgcmVnaXN0ZXJzIHRvIGRlZmF1bHRzICovCisJcmV0ID0gYnEyNDI1N19maWVsZF93cml0ZShicSwgRl9SRVNFVCwgMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIFB1dCB0aGUgUkVTRVQgYml0IGJhY2sgdG8gMCwgaW4gY2FjaGUuIEZvciBzb21lIHJlYXNvbiB0aGUgSFcgYWx3YXlzCisJICogcmV0dXJucyAxIG9uIHRoaXMgYml0LCBzbyB0aGlzIGlzIHRoZSBvbmx5IHdheSB0byBhdm9pZCByZXNldHRpbmcgdGhlCisJICogY2hpcCBldmVyeSB0aW1lIHdlIHVwZGF0ZSBhbm90aGVyIGZpZWxkIGluIHRoaXMgcmVnaXN0ZXIuCisJICovCisJcmV0ID0gYnEyNDI1N19maWVsZF93cml0ZShicSwgRl9SRVNFVCwgMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBicTI0MjU3X2h3X2luaXQoYnEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IGluaXRpYWxpemUgdGhlIGNoaXAuXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBicTI0MjU3X3Bvd2VyX3N1cHBseV9pbml0KGJxKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWdpc3RlciBwb3dlciBzdXBwbHlcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoZGV2LCBjbGllbnQtPmlycSwgTlVMTCwKKwkJCQkJYnEyNDI1N19pcnFfaGFuZGxlcl90aHJlYWQsCisJCQkJCUlSUUZfVFJJR0dFUl9GQUxMSU5HIHwKKwkJCQkJSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfT05FU0hPVCwKKwkJCQkJYnEyNDI1eF9jaGlwX25hbWVbYnEtPmNoaXBdLCBicSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZXF1ZXN0IElSUSAjJWRcbiIsIGNsaWVudC0+aXJxKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmJxLT5jaGFyZ2VyLT5kZXYua29iaiwgJmJxMjQyNTdfYXR0cl9ncm91cCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJDYW4ndCBjcmVhdGUgc3lzZnMgZW50cmllc1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnEyNDI1N19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYnEyNDI1N19kZXZpY2UgKmJxID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlpZiAoYnEtPmlpbGltaXRfYXV0b3NldF9lbmFibGUpCisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYnEtPmlpbGltaXRfc2V0dXBfd29yayk7CisKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmJxLT5jaGFyZ2VyLT5kZXYua29iaiwgJmJxMjQyNTdfYXR0cl9ncm91cCk7CisKKwlicTI0MjU3X2ZpZWxkX3dyaXRlKGJxLCBGX1JFU0VULCAxKTsgLyogcmVzZXQgdG8gZGVmYXVsdHMgKi8KKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IGJxMjQyNTdfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJxMjQyNTdfZGV2aWNlICpicSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZXQgPSAwOworCisJaWYgKGJxLT5paWxpbWl0X2F1dG9zZXRfZW5hYmxlKQorCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmJxLT5paWxpbWl0X3NldHVwX3dvcmspOworCisJLyogcmVzZXQgYWxsIHJlZ2lzdGVycyB0byBkZWZhdWx0IChhbmQgYWN0aXZhdGUgc3RhbmRhbG9uZSBtb2RlKSAqLworCXJldCA9IGJxMjQyNTdfZmllbGRfd3JpdGUoYnEsIEZfUkVTRVQsIDEpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGJxLT5kZXYsICJDYW5ub3QgcmVzZXQgY2hpcCB0byBzdGFuZGFsb25lIG1vZGUuXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYnEyNDI1N19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXQ7CisJc3RydWN0IGJxMjQyNTdfZGV2aWNlICpicSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0ID0gcmVnY2FjaGVfZHJvcF9yZWdpb24oYnEtPnJtYXAsIEJRMjQyNTdfUkVHXzEsIEJRMjQyNTdfUkVHXzcpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gYnEyNDI1N19maWVsZF93cml0ZShicSwgRl9SRVNFVCwgMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBicTI0MjU3X2h3X2luaXQoYnEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoYnEtPmRldiwgIkNhbm5vdCBpbml0IGNoaXAgYWZ0ZXIgcmVzdW1lLlxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogc2lnbmFsIHVzZXJzcGFjZSwgbWF5YmUgc3RhdGUgY2hhbmdlZCB3aGlsZSBzdXNwZW5kZWQgKi8KKwlwb3dlcl9zdXBwbHlfY2hhbmdlZChicS0+Y2hhcmdlcik7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgYnEyNDI1N19wbSA9IHsKKwlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhicTI0MjU3X3N1c3BlbmQsIGJxMjQyNTdfcmVzdW1lKQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGJxMjQyNTdfaTJjX2lkc1tdID0geworCXsgImJxMjQyNTAiLCBCUTI0MjUwIH0sCisJeyAiYnEyNDI1MSIsIEJRMjQyNTEgfSwKKwl7ICJicTI0MjU3IiwgQlEyNDI1NyB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBicTI0MjU3X2kyY19pZHMpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBicTI0MjU3X29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJ0aSxicTI0MjUwIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLGJxMjQyNTEiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAidGksYnEyNDI1NyIsIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGJxMjQyNTdfb2ZfbWF0Y2gpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIGJxMjQyNTdfYWNwaV9tYXRjaFtdID0geworCXsgIkJRMjQyNTAwIiwgQlEyNDI1MCB9LAorCXsgIkJRMjQyNTEwIiwgQlEyNDI1MSB9LAorCXsgIkJRMjQyNTcwIiwgQlEyNDI1NyB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoYWNwaSwgYnEyNDI1N19hY3BpX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGJxMjQyNTdfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImJxMjQyNTctY2hhcmdlciIsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihicTI0MjU3X29mX21hdGNoKSwKKwkJLmFjcGlfbWF0Y2hfdGFibGUgPSBBQ1BJX1BUUihicTI0MjU3X2FjcGlfbWF0Y2gpLAorCQkucG0gPSAmYnEyNDI1N19wbSwKKwl9LAorCS5wcm9iZSA9IGJxMjQyNTdfcHJvYmUsCisJLnJlbW92ZSA9IGJxMjQyNTdfcmVtb3ZlLAorCS5pZF90YWJsZSA9IGJxMjQyNTdfaTJjX2lkcywKK307Cittb2R1bGVfaTJjX2RyaXZlcihicTI0MjU3X2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkxhdXJlbnRpdSBQYWxjdSA8bGF1cmVudGl1LnBhbGN1QGludGVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiYnEyNDI1NyBjaGFyZ2VyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9zdXBwbHkvYnEyNDczNS1jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9icTI0NzM1LWNoYXJnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjc3ODNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvYnEyNDczNS1jaGFyZ2VyLmMKQEAgLTAsMCArMSw0ODkgQEAKKy8qCisgKiBCYXR0ZXJ5IGNoYXJnZXIgZHJpdmVyIGZvciBUSSBCUTI0NzM1CisgKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCBOVklESUEgQ09SUE9SQVRJT04uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgPGxpbnV4L3Bvd2VyL2JxMjQ3MzUtY2hhcmdlci5oPgorCisjZGVmaW5lIEJRMjQ3MzVfQ0hHX09QVAkJCTB4MTIKKyNkZWZpbmUgQlEyNDczNV9DSEdfT1BUX0NIQVJHRV9ESVNBQkxFCSgxIDw8IDApCisjZGVmaW5lIEJRMjQ3MzVfQ0hHX09QVF9BQ19QUkVTRU5UCSgxIDw8IDQpCisjZGVmaW5lIEJRMjQ3MzVfQ0hBUkdFX0NVUlJFTlQJCTB4MTQKKyNkZWZpbmUgQlEyNDczNV9DSEFSR0VfQ1VSUkVOVF9NQVNLCTB4MWZjMAorI2RlZmluZSBCUTI0NzM1X0NIQVJHRV9WT0xUQUdFCQkweDE1CisjZGVmaW5lIEJRMjQ3MzVfQ0hBUkdFX1ZPTFRBR0VfTUFTSwkweDdmZjAKKyNkZWZpbmUgQlEyNDczNV9JTlBVVF9DVVJSRU5UCQkweDNmCisjZGVmaW5lIEJRMjQ3MzVfSU5QVVRfQ1VSUkVOVF9NQVNLCTB4MWY4MAorI2RlZmluZSBCUTI0NzM1X01BTlVGQUNUVVJFUl9JRAkJMHhmZQorI2RlZmluZSBCUTI0NzM1X0RFVklDRV9JRAkJMHhmZgorCitzdHJ1Y3QgYnEyNDczNSB7CisJc3RydWN0IHBvd2VyX3N1cHBseQkJKmNoYXJnZXI7CisJc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjCWNoYXJnZXJfZGVzYzsKKwlzdHJ1Y3QgaTJjX2NsaWVudAkJKmNsaWVudDsKKwlzdHJ1Y3QgYnEyNDczNV9wbGF0Zm9ybQkJKnBkYXRhOworCXN0cnVjdCBtdXRleAkJCWxvY2s7CisJc3RydWN0IGdwaW9fZGVzYwkJKnN0YXR1c19ncGlvOworCWJvb2wJCQkJY2hhcmdpbmc7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBicTI0NzM1ICp0b19icTI0NzM1KHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSkKK3sKKwlyZXR1cm4gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7Cit9CisKK3N0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBicTI0NzM1X2NoYXJnZXJfcHJvcGVydGllc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywKKwlQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUsCit9OworCitzdGF0aWMgaW50IGJxMjQ3MzVfY2hhcmdlcl9wcm9wZXJ0eV9pc193cml0ZWFibGUoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAorCQkJCQkJIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCkKK3sKKwlzd2l0Y2ggKHBzcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYnEyNDczNV93cml0ZV93b3JkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywKKwkJCQkgICAgIHUxNiB2YWx1ZSkKK3sKKwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHJlZywgbGUxNl90b19jcHUodmFsdWUpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYnEyNDczNV9yZWFkX3dvcmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQoreworCXMzMiByZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCByZWcpOworCisJcmV0dXJuIHJldCA8IDAgPyByZXQgOiBsZTE2X3RvX2NwdShyZXQpOworfQorCitzdGF0aWMgaW50IGJxMjQ3MzVfdXBkYXRlX3dvcmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLAorCQkJICAgICAgIHUxNiBtYXNrLCB1MTYgdmFsdWUpCit7CisJdW5zaWduZWQgaW50IHRtcDsKKwlpbnQgcmV0OworCisJcmV0ID0gYnEyNDczNV9yZWFkX3dvcmQoY2xpZW50LCByZWcpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJdG1wID0gcmV0ICYgfm1hc2s7CisJdG1wIHw9IHZhbHVlICYgbWFzazsKKworCXJldHVybiBicTI0NzM1X3dyaXRlX3dvcmQoY2xpZW50LCByZWcsIHRtcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGJxMjQ3MzVfZW5hYmxlX2NoYXJnaW5nKHN0cnVjdCBicTI0NzM1ICpjaGFyZ2VyKQoreworCWlmIChjaGFyZ2VyLT5wZGF0YS0+ZXh0X2NvbnRyb2wpCisJCXJldHVybiAwOworCisJcmV0dXJuIGJxMjQ3MzVfdXBkYXRlX3dvcmQoY2hhcmdlci0+Y2xpZW50LCBCUTI0NzM1X0NIR19PUFQsCisJCQkJICAgQlEyNDczNV9DSEdfT1BUX0NIQVJHRV9ESVNBQkxFLAorCQkJCSAgIH5CUTI0NzM1X0NIR19PUFRfQ0hBUkdFX0RJU0FCTEUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBicTI0NzM1X2Rpc2FibGVfY2hhcmdpbmcoc3RydWN0IGJxMjQ3MzUgKmNoYXJnZXIpCit7CisJaWYgKGNoYXJnZXItPnBkYXRhLT5leHRfY29udHJvbCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gYnEyNDczNV91cGRhdGVfd29yZChjaGFyZ2VyLT5jbGllbnQsIEJRMjQ3MzVfQ0hHX09QVCwKKwkJCQkgICBCUTI0NzM1X0NIR19PUFRfQ0hBUkdFX0RJU0FCTEUsCisJCQkJICAgQlEyNDczNV9DSEdfT1BUX0NIQVJHRV9ESVNBQkxFKTsKK30KKworc3RhdGljIGludCBicTI0NzM1X2NvbmZpZ19jaGFyZ2VyKHN0cnVjdCBicTI0NzM1ICpjaGFyZ2VyKQoreworCXN0cnVjdCBicTI0NzM1X3BsYXRmb3JtICpwZGF0YSA9IGNoYXJnZXItPnBkYXRhOworCWludCByZXQ7CisJdTE2IHZhbHVlOworCisJaWYgKHBkYXRhLT5leHRfY29udHJvbCkKKwkJcmV0dXJuIDA7CisKKwlpZiAocGRhdGEtPmNoYXJnZV9jdXJyZW50KSB7CisJCXZhbHVlID0gcGRhdGEtPmNoYXJnZV9jdXJyZW50ICYgQlEyNDczNV9DSEFSR0VfQ1VSUkVOVF9NQVNLOworCisJCXJldCA9IGJxMjQ3MzVfd3JpdGVfd29yZChjaGFyZ2VyLT5jbGllbnQsCisJCQkJCSBCUTI0NzM1X0NIQVJHRV9DVVJSRU5ULCB2YWx1ZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZjaGFyZ2VyLT5jbGllbnQtPmRldiwKKwkJCQkiRmFpbGVkIHRvIHdyaXRlIGNoYXJnZXIgY3VycmVudCA6ICVkXG4iLAorCQkJCXJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJaWYgKHBkYXRhLT5jaGFyZ2Vfdm9sdGFnZSkgeworCQl2YWx1ZSA9IHBkYXRhLT5jaGFyZ2Vfdm9sdGFnZSAmIEJRMjQ3MzVfQ0hBUkdFX1ZPTFRBR0VfTUFTSzsKKworCQlyZXQgPSBicTI0NzM1X3dyaXRlX3dvcmQoY2hhcmdlci0+Y2xpZW50LAorCQkJCQkgQlEyNDczNV9DSEFSR0VfVk9MVEFHRSwgdmFsdWUpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycigmY2hhcmdlci0+Y2xpZW50LT5kZXYsCisJCQkJIkZhaWxlZCB0byB3cml0ZSBjaGFyZ2VyIHZvbHRhZ2UgOiAlZFxuIiwKKwkJCQlyZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCWlmIChwZGF0YS0+aW5wdXRfY3VycmVudCkgeworCQl2YWx1ZSA9IHBkYXRhLT5pbnB1dF9jdXJyZW50ICYgQlEyNDczNV9JTlBVVF9DVVJSRU5UX01BU0s7CisKKwkJcmV0ID0gYnEyNDczNV93cml0ZV93b3JkKGNoYXJnZXItPmNsaWVudCwKKwkJCQkJIEJRMjQ3MzVfSU5QVVRfQ1VSUkVOVCwgdmFsdWUpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycigmY2hhcmdlci0+Y2xpZW50LT5kZXYsCisJCQkJIkZhaWxlZCB0byB3cml0ZSBpbnB1dCBjdXJyZW50IDogJWRcbiIsCisJCQkJcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2wgYnEyNDczNV9jaGFyZ2VyX2lzX3ByZXNlbnQoc3RydWN0IGJxMjQ3MzUgKmNoYXJnZXIpCit7CisJaWYgKGNoYXJnZXItPnN0YXR1c19ncGlvKSB7CisJCXJldHVybiAhZ3Bpb2RfZ2V0X3ZhbHVlX2NhbnNsZWVwKGNoYXJnZXItPnN0YXR1c19ncGlvKTsKKwl9IGVsc2UgeworCQlpbnQgYWMgPSAwOworCisJCWFjID0gYnEyNDczNV9yZWFkX3dvcmQoY2hhcmdlci0+Y2xpZW50LCBCUTI0NzM1X0NIR19PUFQpOworCQlpZiAoYWMgPCAwKSB7CisJCQlkZXZfZXJyKCZjaGFyZ2VyLT5jbGllbnQtPmRldiwKKwkJCQkiRmFpbGVkIHRvIHJlYWQgY2hhcmdlciBvcHRpb25zIDogJWRcbiIsCisJCQkJYWMpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiAoYWMgJiBCUTI0NzM1X0NIR19PUFRfQUNfUFJFU0VOVCkgPyB0cnVlIDogZmFsc2U7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50IGJxMjQ3MzVfY2hhcmdlcl9pc19jaGFyZ2luZyhzdHJ1Y3QgYnEyNDczNSAqY2hhcmdlcikKK3sKKwlpbnQgcmV0OworCisJaWYgKCFicTI0NzM1X2NoYXJnZXJfaXNfcHJlc2VudChjaGFyZ2VyKSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgID0gYnEyNDczNV9yZWFkX3dvcmQoY2hhcmdlci0+Y2xpZW50LCBCUTI0NzM1X0NIR19PUFQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuICEocmV0ICYgQlEyNDczNV9DSEdfT1BUX0NIQVJHRV9ESVNBQkxFKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGJxMjQ3MzVfY2hhcmdlcl9pc3IoaW50IGlycSwgdm9pZCAqZGV2aWQpCit7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gZGV2aWQ7CisJc3RydWN0IGJxMjQ3MzUgKmNoYXJnZXIgPSB0b19icTI0NzM1KHBzeSk7CisKKwltdXRleF9sb2NrKCZjaGFyZ2VyLT5sb2NrKTsKKworCWlmIChjaGFyZ2VyLT5jaGFyZ2luZyAmJiBicTI0NzM1X2NoYXJnZXJfaXNfcHJlc2VudChjaGFyZ2VyKSkKKwkJYnEyNDczNV9lbmFibGVfY2hhcmdpbmcoY2hhcmdlcik7CisJZWxzZQorCQlicTI0NzM1X2Rpc2FibGVfY2hhcmdpbmcoY2hhcmdlcik7CisKKwltdXRleF91bmxvY2soJmNoYXJnZXItPmxvY2spOworCisJcG93ZXJfc3VwcGx5X2NoYW5nZWQocHN5KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBicTI0NzM1X2NoYXJnZXJfZ2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKKwkJCQkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCQkJCQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXN0cnVjdCBicTI0NzM1ICpjaGFyZ2VyID0gdG9fYnEyNDczNShwc3kpOworCisJc3dpdGNoIChwc3ApIHsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORToKKwkJdmFsLT5pbnR2YWwgPSBicTI0NzM1X2NoYXJnZXJfaXNfcHJlc2VudChjaGFyZ2VyKSA/IDEgOiAwOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKKwkJc3dpdGNoIChicTI0NzM1X2NoYXJnZXJfaXNfY2hhcmdpbmcoY2hhcmdlcikpIHsKKwkJY2FzZSAxOgorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOworCQkJYnJlYWs7CisJCWNhc2UgMDoKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19OT1RfQ0hBUkdJTkc7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnEyNDczNV9jaGFyZ2VyX3NldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJCQkJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwkJCQkJY29uc3QgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzdHJ1Y3QgYnEyNDczNSAqY2hhcmdlciA9IHRvX2JxMjQ3MzUocHN5KTsKKwlpbnQgcmV0OworCisJc3dpdGNoIChwc3ApIHsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKKwkJc3dpdGNoICh2YWwtPmludHZhbCkgeworCQljYXNlIFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc6CisJCQltdXRleF9sb2NrKCZjaGFyZ2VyLT5sb2NrKTsKKwkJCWNoYXJnZXItPmNoYXJnaW5nID0gdHJ1ZTsKKwkJCXJldCA9IGJxMjQ3MzVfZW5hYmxlX2NoYXJnaW5nKGNoYXJnZXIpOworCQkJbXV0ZXhfdW5sb2NrKCZjaGFyZ2VyLT5sb2NrKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJCWJxMjQ3MzVfY29uZmlnX2NoYXJnZXIoY2hhcmdlcik7CisJCQlicmVhazsKKwkJY2FzZSBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOgorCQljYXNlIFBPV0VSX1NVUFBMWV9TVEFUVVNfTk9UX0NIQVJHSU5HOgorCQkJbXV0ZXhfbG9jaygmY2hhcmdlci0+bG9jayk7CisJCQljaGFyZ2VyLT5jaGFyZ2luZyA9IGZhbHNlOworCQkJcmV0ID0gYnEyNDczNV9kaXNhYmxlX2NoYXJnaW5nKGNoYXJnZXIpOworCQkJbXV0ZXhfdW5sb2NrKCZjaGFyZ2VyLT5sb2NrKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcG93ZXJfc3VwcGx5X2NoYW5nZWQocHN5KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBicTI0NzM1X3BsYXRmb3JtICpicTI0NzM1X3BhcnNlX2R0X2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYnEyNDczNV9wbGF0Zm9ybSAqcGRhdGE7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGNsaWVudC0+ZGV2Lm9mX25vZGU7CisJdTMyIHZhbDsKKwlpbnQgcmV0OworCisJcGRhdGEgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwZGF0YSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCSJNZW1vcnkgYWxsb2MgZm9yIGJxMjQ3MzUgcGRhdGEgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJ0aSxjaGFyZ2UtY3VycmVudCIsICZ2YWwpOworCWlmICghcmV0KQorCQlwZGF0YS0+Y2hhcmdlX2N1cnJlbnQgPSB2YWw7CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInRpLGNoYXJnZS12b2x0YWdlIiwgJnZhbCk7CisJaWYgKCFyZXQpCisJCXBkYXRhLT5jaGFyZ2Vfdm9sdGFnZSA9IHZhbDsKKworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidGksaW5wdXQtY3VycmVudCIsICZ2YWwpOworCWlmICghcmV0KQorCQlwZGF0YS0+aW5wdXRfY3VycmVudCA9IHZhbDsKKworCXBkYXRhLT5leHRfY29udHJvbCA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgInRpLGV4dGVybmFsLWNvbnRyb2wiKTsKKworCXJldHVybiBwZGF0YTsKK30KKworc3RhdGljIGludCBicTI0NzM1X2NoYXJnZXJfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCWludCByZXQ7CisJc3RydWN0IGJxMjQ3MzUgKmNoYXJnZXI7CisJc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjICpzdXBwbHlfZGVzYzsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307CisJY2hhciAqbmFtZTsKKworCWNoYXJnZXIgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKmNoYXJnZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoYXJnZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJbXV0ZXhfaW5pdCgmY2hhcmdlci0+bG9jayk7CisJY2hhcmdlci0+Y2hhcmdpbmcgPSB0cnVlOworCWNoYXJnZXItPnBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWlmIChJU19FTkFCTEVEKENPTkZJR19PRikgJiYgIWNoYXJnZXItPnBkYXRhICYmIGNsaWVudC0+ZGV2Lm9mX25vZGUpCisJCWNoYXJnZXItPnBkYXRhID0gYnEyNDczNV9wYXJzZV9kdF9kYXRhKGNsaWVudCk7CisKKwlpZiAoIWNoYXJnZXItPnBkYXRhKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAibm8gcGxhdGZvcm0gZGF0YSBwcm92aWRlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW5hbWUgPSAoY2hhciAqKWNoYXJnZXItPnBkYXRhLT5uYW1lOworCWlmICghbmFtZSkgeworCQluYW1lID0gZGV2bV9rYXNwcmludGYoJmNsaWVudC0+ZGV2LCBHRlBfS0VSTkVMLAorCQkJCSAgICAgICJicTI0NzM1QCVzIiwKKwkJCQkgICAgICBkZXZfbmFtZSgmY2xpZW50LT5kZXYpKTsKKwkJaWYgKCFuYW1lKSB7CisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byBhbGxvYyBkZXZpY2UgbmFtZVxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCWNoYXJnZXItPmNsaWVudCA9IGNsaWVudDsKKworCXN1cHBseV9kZXNjID0gJmNoYXJnZXItPmNoYXJnZXJfZGVzYzsKKworCXN1cHBseV9kZXNjLT5uYW1lID0gbmFtZTsKKwlzdXBwbHlfZGVzYy0+dHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TOworCXN1cHBseV9kZXNjLT5wcm9wZXJ0aWVzID0gYnEyNDczNV9jaGFyZ2VyX3Byb3BlcnRpZXM7CisJc3VwcGx5X2Rlc2MtPm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShicTI0NzM1X2NoYXJnZXJfcHJvcGVydGllcyk7CisJc3VwcGx5X2Rlc2MtPmdldF9wcm9wZXJ0eSA9IGJxMjQ3MzVfY2hhcmdlcl9nZXRfcHJvcGVydHk7CisJc3VwcGx5X2Rlc2MtPnNldF9wcm9wZXJ0eSA9IGJxMjQ3MzVfY2hhcmdlcl9zZXRfcHJvcGVydHk7CisJc3VwcGx5X2Rlc2MtPnByb3BlcnR5X2lzX3dyaXRlYWJsZSA9CisJCQkJYnEyNDczNV9jaGFyZ2VyX3Byb3BlcnR5X2lzX3dyaXRlYWJsZTsKKworCXBzeV9jZmcuc3VwcGxpZWRfdG8gPSBjaGFyZ2VyLT5wZGF0YS0+c3VwcGxpZWRfdG87CisJcHN5X2NmZy5udW1fc3VwcGxpY2FudHMgPSBjaGFyZ2VyLT5wZGF0YS0+bnVtX3N1cHBsaWNhbnRzOworCXBzeV9jZmcub2Zfbm9kZSA9IGNsaWVudC0+ZGV2Lm9mX25vZGU7CisJcHN5X2NmZy5kcnZfZGF0YSA9IGNoYXJnZXI7CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBjaGFyZ2VyKTsKKworCWNoYXJnZXItPnN0YXR1c19ncGlvID0gZGV2bV9ncGlvZF9nZXRfb3B0aW9uYWwoJmNsaWVudC0+ZGV2LAorCQkJCQkJICAgICAgICJ0aSxhYy1kZXRlY3QiLAorCQkJCQkJICAgICAgIEdQSU9EX0lOKTsKKwlpZiAoSVNfRVJSKGNoYXJnZXItPnN0YXR1c19ncGlvKSkgeworCQlyZXQgPSBQVFJfRVJSKGNoYXJnZXItPnN0YXR1c19ncGlvKTsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJHZXR0aW5nIGdwaW8gZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoIWNoYXJnZXItPnN0YXR1c19ncGlvIHx8IGJxMjQ3MzVfY2hhcmdlcl9pc19wcmVzZW50KGNoYXJnZXIpKSB7CisJCXJldCA9IGJxMjQ3MzVfcmVhZF93b3JkKGNsaWVudCwgQlEyNDczNV9NQU5VRkFDVFVSRVJfSUQpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gcmVhZCBtYW51ZmFjdHVyZXIgaWQgOiAlZFxuIiwKKwkJCQlyZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfSBlbHNlIGlmIChyZXQgIT0gMHgwMDQwKSB7CisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCQkibWFudWZhY3R1cmVyIGlkIG1pc21hdGNoLiAweDAwNDAgIT0gMHglMDR4XG4iLCByZXQpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQlyZXQgPSBicTI0NzM1X3JlYWRfd29yZChjbGllbnQsIEJRMjQ3MzVfREVWSUNFX0lEKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIHJlYWQgZGV2aWNlIGlkIDogJWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9IGVsc2UgaWYgKHJldCAhPSAweDAwMEIpIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCSJkZXZpY2UgaWQgbWlzbWF0Y2guIDB4MDAwYiAhPSAweCUwNHhcbiIsIHJldCk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKworCXJldCA9IGJxMjQ3MzVfY29uZmlnX2NoYXJnZXIoY2hhcmdlcik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgaW4gY29uZmlndXJpbmcgY2hhcmdlciIpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIGNoZWNrIGZvciBBQyBhZGFwdGVyIHByZXNlbmNlICovCisJaWYgKGJxMjQ3MzVfY2hhcmdlcl9pc19wcmVzZW50KGNoYXJnZXIpKSB7CisJCXJldCA9IGJxMjQ3MzVfZW5hYmxlX2NoYXJnaW5nKGNoYXJnZXIpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIGNoYXJnaW5nXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwljaGFyZ2VyLT5jaGFyZ2VyID0gZGV2bV9wb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCBzdXBwbHlfZGVzYywKKwkJCQkJCSAgICAgICZwc3lfY2ZnKTsKKwlpZiAoSVNfRVJSKGNoYXJnZXItPmNoYXJnZXIpKSB7CisJCXJldCA9IFBUUl9FUlIoY2hhcmdlci0+Y2hhcmdlcik7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHBvd2VyIHN1cHBseTogJWRcbiIsCisJCQlyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChjbGllbnQtPmlycSkgeworCQlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKCZjbGllbnQtPmRldiwgY2xpZW50LT5pcnEsCisJCQkJCQlOVUxMLCBicTI0NzM1X2NoYXJnZXJfaXNyLAorCQkJCQkJSVJRRl9UUklHR0VSX1JJU0lORyB8CisJCQkJCQlJUlFGX1RSSUdHRVJfRkFMTElORyB8CisJCQkJCQlJUlFGX09ORVNIT1QsCisJCQkJCQlzdXBwbHlfZGVzYy0+bmFtZSwKKwkJCQkJCWNoYXJnZXItPmNoYXJnZXIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCQkiVW5hYmxlIHRvIHJlZ2lzdGVyIElSUSAlZCBlcnIgJWRcbiIsCisJCQkJY2xpZW50LT5pcnEsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBicTI0NzM1X2NoYXJnZXJfaWRbXSA9IHsKKwl7ICJicTI0NzM1LWNoYXJnZXIiLCAwIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYnEyNDczNV9jaGFyZ2VyX2lkKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYnEyNDczNV9tYXRjaF9pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInRpLGJxMjQ3MzUiLCB9LAorCXsgLyogZW5kICovIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBicTI0NzM1X21hdGNoX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBicTI0NzM1X2NoYXJnZXJfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImJxMjQ3MzUtY2hhcmdlciIsCisJCS5vZl9tYXRjaF90YWJsZSA9IGJxMjQ3MzVfbWF0Y2hfaWRzLAorCX0sCisJLnByb2JlID0gYnEyNDczNV9jaGFyZ2VyX3Byb2JlLAorCS5pZF90YWJsZSA9IGJxMjQ3MzVfY2hhcmdlcl9pZCwKK307CisKK21vZHVsZV9pMmNfZHJpdmVyKGJxMjQ3MzVfY2hhcmdlcl9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oImJxMjQ3MzUgYmF0dGVyeSBjaGFyZ2luZyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkRhcmJoYSBTcmloYXJzaGEgPGRzcmloYXJzaGFAbnZpZGlhLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvYnEyNTg5MF9jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9icTI1ODkwX2NoYXJnZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci9icTI1ODkwX2NoYXJnZXIuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvYnEyNTg5MF9jaGFyZ2VyLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvc3VwcGx5L2JxMjd4eHhfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvYnEyN3h4eF9iYXR0ZXJ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IwZGJjNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L2JxMjd4eHhfYmF0dGVyeS5jCkBAIC0wLDAgKzEsMTEzOSBAQAorLyoKKyAqIEJRMjd4eHggYmF0dGVyeSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggUm9kb2xmbyBHaW9tZXR0aSA8Z2lvbWV0dGlAbGludXguaXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRXVyb3RlY2ggUy5wLkEuIDxpbmZvQGV1cm90ZWNoLml0PgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUGFsaSBSb2jDoXIgPHBhbGkucm9oYXJAZ21haWwuY29tPgorICoKKyAqIEJhc2VkIG9uIGEgcHJldmlvdXMgd29yayBieSBDb3B5cmlnaHQgKEMpIDIwMDggVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgUEFDS0FHRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRGF0YXNoZWV0czoKKyAqIGh0dHA6Ly93d3cudGkuY29tL3Byb2R1Y3QvYnEyNzAwMAorICogaHR0cDovL3d3dy50aS5jb20vcHJvZHVjdC9icTI3MjAwCisgKiBodHRwOi8vd3d3LnRpLmNvbS9wcm9kdWN0L2JxMjcwMTAKKyAqIGh0dHA6Ly93d3cudGkuY29tL3Byb2R1Y3QvYnEyNzIxMAorICogaHR0cDovL3d3dy50aS5jb20vcHJvZHVjdC9icTI3NTAwCisgKiBodHRwOi8vd3d3LnRpLmNvbS9wcm9kdWN0L2JxMjc1MTAtZzMKKyAqIGh0dHA6Ly93d3cudGkuY29tL3Byb2R1Y3QvYnEyNzUyMC1nNAorICogaHR0cDovL3d3dy50aS5jb20vcHJvZHVjdC9icTI3NTMwLWcxCisgKiBodHRwOi8vd3d3LnRpLmNvbS9wcm9kdWN0L2JxMjc1MzEtZzEKKyAqIGh0dHA6Ly93d3cudGkuY29tL3Byb2R1Y3QvYnEyNzU0MS1nMQorICogaHR0cDovL3d3dy50aS5jb20vcHJvZHVjdC9icTI3NTQyLWcxCisgKiBodHRwOi8vd3d3LnRpLmNvbS9wcm9kdWN0L2JxMjc1NDYtZzEKKyAqIGh0dHA6Ly93d3cudGkuY29tL3Byb2R1Y3QvYnEyNzc0Mi1nMQorICogaHR0cDovL3d3dy50aS5jb20vcHJvZHVjdC9icTI3NTQ1LWcxCisgKiBodHRwOi8vd3d3LnRpLmNvbS9wcm9kdWN0L2JxMjc0MjEtZzEKKyAqIGh0dHA6Ly93d3cudGkuY29tL3Byb2R1Y3QvYnEyNzQyNS1nMQorICogaHR0cDovL3d3dy50aS5jb20vcHJvZHVjdC9icTI3NDExLWcxCisgKiBodHRwOi8vd3d3LnRpLmNvbS9wcm9kdWN0L2JxMjc2MjEtZzEKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorCisjaW5jbHVkZSA8bGludXgvcG93ZXIvYnEyN3h4eF9iYXR0ZXJ5Lmg+CisKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JCSIxLjIuMCIKKworI2RlZmluZSBCUTI3WFhYX01BTlVGQUNUVVJFUgkiVGV4YXMgSW5zdHJ1bWVudHMiCisKKy8qIEJRMjdYWFggRmxhZ3MgKi8KKyNkZWZpbmUgQlEyN1hYWF9GTEFHX0RTQwlCSVQoMCkKKyNkZWZpbmUgQlEyN1hYWF9GTEFHX1NPQ0YJQklUKDEpIC8qIFN0YXRlLW9mLUNoYXJnZSB0aHJlc2hvbGQgZmluYWwgKi8KKyNkZWZpbmUgQlEyN1hYWF9GTEFHX1NPQzEJQklUKDIpIC8qIFN0YXRlLW9mLUNoYXJnZSB0aHJlc2hvbGQgMSAqLworI2RlZmluZSBCUTI3WFhYX0ZMQUdfRkMJCUJJVCg5KQorI2RlZmluZSBCUTI3WFhYX0ZMQUdfT1RECUJJVCgxNCkKKyNkZWZpbmUgQlEyN1hYWF9GTEFHX09UQwlCSVQoMTUpCisjZGVmaW5lIEJRMjdYWFhfRkxBR19VVAkJQklUKDE0KQorI2RlZmluZSBCUTI3WFhYX0ZMQUdfT1QJCUJJVCgxNSkKKworLyogQlEyNzAwMCBoYXMgZGlmZmVyZW50IGxheW91dCBmb3IgRmxhZ3MgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQlEyNzAwMF9GTEFHX0VEVkYJQklUKDApIC8qIEZpbmFsIEVuZC1vZi1EaXNjaGFyZ2UtVm9sdGFnZSBmbGFnICovCisjZGVmaW5lIEJRMjcwMDBfRkxBR19FRFYxCUJJVCgxKSAvKiBGaXJzdCBFbmQtb2YtRGlzY2hhcmdlLVZvbHRhZ2UgZmxhZyAqLworI2RlZmluZSBCUTI3MDAwX0ZMQUdfQ0kJCUJJVCg0KSAvKiBDYXBhY2l0eSBJbmFjY3VyYXRlIGZsYWcgKi8KKyNkZWZpbmUgQlEyNzAwMF9GTEFHX0ZDCQlCSVQoNSkKKyNkZWZpbmUgQlEyNzAwMF9GTEFHX0NIR1MJQklUKDcpIC8qIENoYXJnZSBzdGF0ZSBmbGFnICovCisKKyNkZWZpbmUgQlEyN1hYWF9SUwkJCSgyMCkgLyogUmVzaXN0b3Igc2Vuc2UgbU9obSAqLworI2RlZmluZSBCUTI3WFhYX1BPV0VSX0NPTlNUQU5UCQkoMjkyMDApIC8qIDI5LjIgwrVWXjIgKiAxMDAwICovCisjZGVmaW5lIEJRMjdYWFhfQ1VSUkVOVF9DT05TVEFOVAkoMzU3MCkgLyogMy41NyDCtVYgKiAxMDAwICovCisKKyNkZWZpbmUgSU5WQUxJRF9SRUdfQUREUgkweGZmCisKKy8qCisgKiBicTI3eHh4X3JlZ19pbmRleCAtIFJlZ2lzdGVyIG5hbWVzCisgKgorICogVGhlc2UgYXJlIGluZGV4ZXMgaW50byBhIGRldmljZSdzIHJlZ2lzdGVyIG1hcHBpbmcgYXJyYXkuCisgKi8KKworZW51bSBicTI3eHh4X3JlZ19pbmRleCB7CisJQlEyN1hYWF9SRUdfQ1RSTCA9IDAsCS8qIENvbnRyb2wgKi8KKwlCUTI3WFhYX1JFR19URU1QLAkvKiBUZW1wZXJhdHVyZSAqLworCUJRMjdYWFhfUkVHX0lOVF9URU1QLAkvKiBJbnRlcm5hbCBUZW1wZXJhdHVyZSAqLworCUJRMjdYWFhfUkVHX1ZPTFQsCS8qIFZvbHRhZ2UgKi8KKwlCUTI3WFhYX1JFR19BSSwJCS8qIEF2ZXJhZ2UgQ3VycmVudCAqLworCUJRMjdYWFhfUkVHX0ZMQUdTLAkvKiBGbGFncyAqLworCUJRMjdYWFhfUkVHX1RURSwJLyogVGltZS10by1FbXB0eSAqLworCUJRMjdYWFhfUkVHX1RURiwJLyogVGltZS10by1GdWxsICovCisJQlEyN1hYWF9SRUdfVFRFUywJLyogVGltZS10by1FbXB0eSBTdGFuZGJ5ICovCisJQlEyN1hYWF9SRUdfVFRFQ1AsCS8qIFRpbWUtdG8tRW1wdHkgYXQgQ29uc3RhbnQgUG93ZXIgKi8KKwlCUTI3WFhYX1JFR19OQUMsCS8qIE5vbWluYWwgQXZhaWxhYmxlIENhcGFjaXR5ICovCisJQlEyN1hYWF9SRUdfRkNDLAkvKiBGdWxsIENoYXJnZSBDYXBhY2l0eSAqLworCUJRMjdYWFhfUkVHX0NZQ1QsCS8qIEN5Y2xlIENvdW50ICovCisJQlEyN1hYWF9SRUdfQUUsCQkvKiBBdmFpbGFibGUgRW5lcmd5ICovCisJQlEyN1hYWF9SRUdfU09DLAkvKiBTdGF0ZS1vZi1DaGFyZ2UgKi8KKwlCUTI3WFhYX1JFR19EQ0FQLAkvKiBEZXNpZ24gQ2FwYWNpdHkgKi8KKwlCUTI3WFhYX1JFR19BUCwJCS8qIEF2ZXJhZ2UgUG93ZXIgKi8KKwlCUTI3WFhYX1JFR19NQVgsCS8qIHNlbnRpbmVsICovCit9OworCisvKiBSZWdpc3RlciBtYXBwaW5ncyAqLworc3RhdGljIHU4IGJxMjd4eHhfcmVnc1tdW0JRMjdYWFhfUkVHX01BWF0gPSB7CisJW0JRMjcwMDBdID0geworCQlbQlEyN1hYWF9SRUdfQ1RSTF0gPSAweDAwLAorCQlbQlEyN1hYWF9SRUdfVEVNUF0gPSAweDA2LAorCQlbQlEyN1hYWF9SRUdfSU5UX1RFTVBdID0gSU5WQUxJRF9SRUdfQUREUiwKKwkJW0JRMjdYWFhfUkVHX1ZPTFRdID0gMHgwOCwKKwkJW0JRMjdYWFhfUkVHX0FJXSA9IDB4MTQsCisJCVtCUTI3WFhYX1JFR19GTEFHU10gPSAweDBhLAorCQlbQlEyN1hYWF9SRUdfVFRFXSA9IDB4MTYsCisJCVtCUTI3WFhYX1JFR19UVEZdID0gMHgxOCwKKwkJW0JRMjdYWFhfUkVHX1RURVNdID0gMHgxYywKKwkJW0JRMjdYWFhfUkVHX1RURUNQXSA9IDB4MjYsCisJCVtCUTI3WFhYX1JFR19OQUNdID0gMHgwYywKKwkJW0JRMjdYWFhfUkVHX0ZDQ10gPSAweDEyLAorCQlbQlEyN1hYWF9SRUdfQ1lDVF0gPSAweDJhLAorCQlbQlEyN1hYWF9SRUdfQUVdID0gMHgyMiwKKwkJW0JRMjdYWFhfUkVHX1NPQ10gPSAweDBiLAorCQlbQlEyN1hYWF9SRUdfRENBUF0gPSAweDc2LAorCQlbQlEyN1hYWF9SRUdfQVBdID0gMHgyNCwKKwl9LAorCVtCUTI3MDEwXSA9IHsKKwkJW0JRMjdYWFhfUkVHX0NUUkxdID0gMHgwMCwKKwkJW0JRMjdYWFhfUkVHX1RFTVBdID0gMHgwNiwKKwkJW0JRMjdYWFhfUkVHX0lOVF9URU1QXSA9IElOVkFMSURfUkVHX0FERFIsCisJCVtCUTI3WFhYX1JFR19WT0xUXSA9IDB4MDgsCisJCVtCUTI3WFhYX1JFR19BSV0gPSAweDE0LAorCQlbQlEyN1hYWF9SRUdfRkxBR1NdID0gMHgwYSwKKwkJW0JRMjdYWFhfUkVHX1RURV0gPSAweDE2LAorCQlbQlEyN1hYWF9SRUdfVFRGXSA9IDB4MTgsCisJCVtCUTI3WFhYX1JFR19UVEVTXSA9IDB4MWMsCisJCVtCUTI3WFhYX1JFR19UVEVDUF0gPSAweDI2LAorCQlbQlEyN1hYWF9SRUdfTkFDXSA9IDB4MGMsCisJCVtCUTI3WFhYX1JFR19GQ0NdID0gMHgxMiwKKwkJW0JRMjdYWFhfUkVHX0NZQ1RdID0gMHgyYSwKKwkJW0JRMjdYWFhfUkVHX0FFXSA9IElOVkFMSURfUkVHX0FERFIsCisJCVtCUTI3WFhYX1JFR19TT0NdID0gMHgwYiwKKwkJW0JRMjdYWFhfUkVHX0RDQVBdID0gMHg3NiwKKwkJW0JRMjdYWFhfUkVHX0FQXSA9IElOVkFMSURfUkVHX0FERFIsCisJfSwKKwlbQlEyNzUwMF0gPSB7CisJCVtCUTI3WFhYX1JFR19DVFJMXSA9IDB4MDAsCisJCVtCUTI3WFhYX1JFR19URU1QXSA9IDB4MDYsCisJCVtCUTI3WFhYX1JFR19JTlRfVEVNUF0gPSAweDI4LAorCQlbQlEyN1hYWF9SRUdfVk9MVF0gPSAweDA4LAorCQlbQlEyN1hYWF9SRUdfQUldID0gMHgxNCwKKwkJW0JRMjdYWFhfUkVHX0ZMQUdTXSA9IDB4MGEsCisJCVtCUTI3WFhYX1JFR19UVEVdID0gMHgxNiwKKwkJW0JRMjdYWFhfUkVHX1RURl0gPSBJTlZBTElEX1JFR19BRERSLAorCQlbQlEyN1hYWF9SRUdfVFRFU10gPSAweDFhLAorCQlbQlEyN1hYWF9SRUdfVFRFQ1BdID0gSU5WQUxJRF9SRUdfQUREUiwKKwkJW0JRMjdYWFhfUkVHX05BQ10gPSAweDBjLAorCQlbQlEyN1hYWF9SRUdfRkNDXSA9IDB4MTIsCisJCVtCUTI3WFhYX1JFR19DWUNUXSA9IDB4MmEsCisJCVtCUTI3WFhYX1JFR19BRV0gPSBJTlZBTElEX1JFR19BRERSLAorCQlbQlEyN1hYWF9SRUdfU09DXSA9IDB4MmMsCisJCVtCUTI3WFhYX1JFR19EQ0FQXSA9IDB4M2MsCisJCVtCUTI3WFhYX1JFR19BUF0gPSBJTlZBTElEX1JFR19BRERSLAorCX0sCisJW0JRMjc1MzBdID0geworCQlbQlEyN1hYWF9SRUdfQ1RSTF0gPSAweDAwLAorCQlbQlEyN1hYWF9SRUdfVEVNUF0gPSAweDA2LAorCQlbQlEyN1hYWF9SRUdfSU5UX1RFTVBdID0gMHgzMiwKKwkJW0JRMjdYWFhfUkVHX1ZPTFRdID0gMHgwOCwKKwkJW0JRMjdYWFhfUkVHX0FJXSA9IDB4MTQsCisJCVtCUTI3WFhYX1JFR19GTEFHU10gPSAweDBhLAorCQlbQlEyN1hYWF9SRUdfVFRFXSA9IDB4MTYsCisJCVtCUTI3WFhYX1JFR19UVEZdID0gSU5WQUxJRF9SRUdfQUREUiwKKwkJW0JRMjdYWFhfUkVHX1RURVNdID0gSU5WQUxJRF9SRUdfQUREUiwKKwkJW0JRMjdYWFhfUkVHX1RURUNQXSA9IElOVkFMSURfUkVHX0FERFIsCisJCVtCUTI3WFhYX1JFR19OQUNdID0gMHgwYywKKwkJW0JRMjdYWFhfUkVHX0ZDQ10gPSAweDEyLAorCQlbQlEyN1hYWF9SRUdfQ1lDVF0gPSAweDJhLAorCQlbQlEyN1hYWF9SRUdfQUVdID0gSU5WQUxJRF9SRUdfQUREUiwKKwkJW0JRMjdYWFhfUkVHX1NPQ10gPSAweDJjLAorCQlbQlEyN1hYWF9SRUdfRENBUF0gPSBJTlZBTElEX1JFR19BRERSLAorCQlbQlEyN1hYWF9SRUdfQVBdID0gMHgyNCwKKwl9LAorCVtCUTI3NTQxXSA9IHsKKwkJW0JRMjdYWFhfUkVHX0NUUkxdID0gMHgwMCwKKwkJW0JRMjdYWFhfUkVHX1RFTVBdID0gMHgwNiwKKwkJW0JRMjdYWFhfUkVHX0lOVF9URU1QXSA9IDB4MjgsCisJCVtCUTI3WFhYX1JFR19WT0xUXSA9IDB4MDgsCisJCVtCUTI3WFhYX1JFR19BSV0gPSAweDE0LAorCQlbQlEyN1hYWF9SRUdfRkxBR1NdID0gMHgwYSwKKwkJW0JRMjdYWFhfUkVHX1RURV0gPSAweDE2LAorCQlbQlEyN1hYWF9SRUdfVFRGXSA9IElOVkFMSURfUkVHX0FERFIsCisJCVtCUTI3WFhYX1JFR19UVEVTXSA9IElOVkFMSURfUkVHX0FERFIsCisJCVtCUTI3WFhYX1JFR19UVEVDUF0gPSBJTlZBTElEX1JFR19BRERSLAorCQlbQlEyN1hYWF9SRUdfTkFDXSA9IDB4MGMsCisJCVtCUTI3WFhYX1JFR19GQ0NdID0gMHgxMiwKKwkJW0JRMjdYWFhfUkVHX0NZQ1RdID0gMHgyYSwKKwkJW0JRMjdYWFhfUkVHX0FFXSA9IElOVkFMSURfUkVHX0FERFIsCisJCVtCUTI3WFhYX1JFR19TT0NdID0gMHgyYywKKwkJW0JRMjdYWFhfUkVHX0RDQVBdID0gMHgzYywKKwkJW0JRMjdYWFhfUkVHX0FQXSA9IDB4MjQsCisJfSwKKwlbQlEyNzU0NV0gPSB7CisJCVtCUTI3WFhYX1JFR19DVFJMXSA9IDB4MDAsCisJCVtCUTI3WFhYX1JFR19URU1QXSA9IDB4MDYsCisJCVtCUTI3WFhYX1JFR19JTlRfVEVNUF0gPSAweDI4LAorCQlbQlEyN1hYWF9SRUdfVk9MVF0gPSAweDA4LAorCQlbQlEyN1hYWF9SRUdfQUldID0gMHgxNCwKKwkJW0JRMjdYWFhfUkVHX0ZMQUdTXSA9IDB4MGEsCisJCVtCUTI3WFhYX1JFR19UVEVdID0gMHgxNiwKKwkJW0JRMjdYWFhfUkVHX1RURl0gPSBJTlZBTElEX1JFR19BRERSLAorCQlbQlEyN1hYWF9SRUdfVFRFU10gPSBJTlZBTElEX1JFR19BRERSLAorCQlbQlEyN1hYWF9SRUdfVFRFQ1BdID0gSU5WQUxJRF9SRUdfQUREUiwKKwkJW0JRMjdYWFhfUkVHX05BQ10gPSAweDBjLAorCQlbQlEyN1hYWF9SRUdfRkNDXSA9IDB4MTIsCisJCVtCUTI3WFhYX1JFR19DWUNUXSA9IDB4MmEsCisJCVtCUTI3WFhYX1JFR19BRV0gPSBJTlZBTElEX1JFR19BRERSLAorCQlbQlEyN1hYWF9SRUdfU09DXSA9IDB4MmMsCisJCVtCUTI3WFhYX1JFR19EQ0FQXSA9IElOVkFMSURfUkVHX0FERFIsCisJCVtCUTI3WFhYX1JFR19BUF0gPSAweDI0LAorCX0sCisJW0JRMjc0MjFdID0geworCQlbQlEyN1hYWF9SRUdfQ1RSTF0gPSAweDAwLAorCQlbQlEyN1hYWF9SRUdfVEVNUF0gPSAweDAyLAorCQlbQlEyN1hYWF9SRUdfSU5UX1RFTVBdID0gMHgxZSwKKwkJW0JRMjdYWFhfUkVHX1ZPTFRdID0gMHgwNCwKKwkJW0JRMjdYWFhfUkVHX0FJXSA9IDB4MTAsCisJCVtCUTI3WFhYX1JFR19GTEFHU10gPSAweDA2LAorCQlbQlEyN1hYWF9SRUdfVFRFXSA9IElOVkFMSURfUkVHX0FERFIsCisJCVtCUTI3WFhYX1JFR19UVEZdID0gSU5WQUxJRF9SRUdfQUREUiwKKwkJW0JRMjdYWFhfUkVHX1RURVNdID0gSU5WQUxJRF9SRUdfQUREUiwKKwkJW0JRMjdYWFhfUkVHX1RURUNQXSA9IElOVkFMSURfUkVHX0FERFIsCisJCVtCUTI3WFhYX1JFR19OQUNdID0gMHgwOCwKKwkJW0JRMjdYWFhfUkVHX0ZDQ10gPSAweDBlLAorCQlbQlEyN1hYWF9SRUdfQ1lDVF0gPSBJTlZBTElEX1JFR19BRERSLAorCQlbQlEyN1hYWF9SRUdfQUVdID0gSU5WQUxJRF9SRUdfQUREUiwKKwkJW0JRMjdYWFhfUkVHX1NPQ10gPSAweDFjLAorCQlbQlEyN1hYWF9SRUdfRENBUF0gPSAweDNjLAorCQlbQlEyN1hYWF9SRUdfQVBdID0gMHgxOCwKKwl9LAorfTsKKworc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IGJxMjcwMDBfYmF0dGVyeV9wcm9wc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywKKwlQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5ULAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZX0xFVkVMLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVAsCisJUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19FTVBUWV9OT1csCisJUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19FTVBUWV9BVkcsCisJUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19GVUxMX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9OT1csCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTExfREVTSUdOLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NZQ0xFX0NPVU5ULAorCVBPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9OT1csCisJUE9XRVJfU1VQUExZX1BST1BfUE9XRVJfQVZHLAorCVBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9NQU5VRkFDVFVSRVIsCit9OworCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgYnEyNzAxMF9iYXR0ZXJ5X3Byb3BzW10gPSB7CisJUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAorCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsCisJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1csCisJUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1csCisJUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFksCisJUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFlfTEVWRUwsCisJUE9XRVJfU1VQUExZX1BST1BfVEVNUCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0VNUFRZX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0VNUFRZX0FWRywKKwlQT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0ZVTExfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1ksCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTEwsCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTF9ERVNJR04sCisJUE9XRVJfU1VQUExZX1BST1BfQ1lDTEVfQ09VTlQsCisJUE9XRVJfU1VQUExZX1BST1BfSEVBTFRILAorCVBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUiwKK307CisKK3N0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBicTI3NTAwX2JhdHRlcnlfcHJvcHNbXSA9IHsKKwlQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMsCisJUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWV9MRVZFTCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9URU1QLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRU1QVFlfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1ksCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTEwsCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTF9ERVNJR04sCisJUE9XRVJfU1VQUExZX1BST1BfQ1lDTEVfQ09VTlQsCisJUE9XRVJfU1VQUExZX1BST1BfSEVBTFRILAorCVBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUiwKK307CisKK3N0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBicTI3NTMwX2JhdHRlcnlfcHJvcHNbXSA9IHsKKwlQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMsCisJUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWV9MRVZFTCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9URU1QLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRU1QVFlfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1ksCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTEwsCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9QT1dFUl9BVkcsCisJUE9XRVJfU1VQUExZX1BST1BfSEVBTFRILAorCVBPV0VSX1NVUFBMWV9QUk9QX0NZQ0xFX0NPVU5ULAorCVBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUiwKK307CisKK3N0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBicTI3NTQxX2JhdHRlcnlfcHJvcHNbXSA9IHsKKwlQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMsCisJUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWV9MRVZFTCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9URU1QLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRU1QVFlfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1ksCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTEwsCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTF9ERVNJR04sCisJUE9XRVJfU1VQUExZX1BST1BfQ1lDTEVfQ09VTlQsCisJUE9XRVJfU1VQUExZX1BST1BfUE9XRVJfQVZHLAorCVBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9NQU5VRkFDVFVSRVIsCit9OworCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgYnEyNzU0NV9iYXR0ZXJ5X3Byb3BzW10gPSB7CisJUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAorCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsCisJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1csCisJUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1csCisJUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFksCisJUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFlfTEVWRUwsCisJUE9XRVJfU1VQUExZX1BST1BfVEVNUCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0VNUFRZX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9OT1csCisJUE9XRVJfU1VQUExZX1BST1BfSEVBTFRILAorCVBPV0VSX1NVUFBMWV9QUk9QX0NZQ0xFX0NPVU5ULAorCVBPV0VSX1NVUFBMWV9QUk9QX1BPV0VSX0FWRywKKwlQT1dFUl9TVVBQTFlfUFJPUF9NQU5VRkFDVFVSRVIsCit9OworCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgYnEyNzQyMV9iYXR0ZXJ5X3Byb3BzW10gPSB7CisJUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAorCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsCisJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1csCisJUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1csCisJUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFksCisJUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFlfTEVWRUwsCisJUE9XRVJfU1VQUExZX1BST1BfVEVNUCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9OT1csCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTExfREVTSUdOLAorCVBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUiwKK307CisKKyNkZWZpbmUgQlEyN1hYWF9QUk9QKF9pZCwgX3Byb3ApCQlcCisJW19pZF0gPSB7CQkJCVwKKwkJLnByb3BzID0gX3Byb3AsCQkJXAorCQkuc2l6ZSA9IEFSUkFZX1NJWkUoX3Byb3ApLAlcCisJfQorCitzdGF0aWMgc3RydWN0IHsKKwllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSAqcHJvcHM7CisJc2l6ZV90IHNpemU7Cit9IGJxMjd4eHhfYmF0dGVyeV9wcm9wc1tdID0geworCUJRMjdYWFhfUFJPUChCUTI3MDAwLCBicTI3MDAwX2JhdHRlcnlfcHJvcHMpLAorCUJRMjdYWFhfUFJPUChCUTI3MDEwLCBicTI3MDEwX2JhdHRlcnlfcHJvcHMpLAorCUJRMjdYWFhfUFJPUChCUTI3NTAwLCBicTI3NTAwX2JhdHRlcnlfcHJvcHMpLAorCUJRMjdYWFhfUFJPUChCUTI3NTMwLCBicTI3NTMwX2JhdHRlcnlfcHJvcHMpLAorCUJRMjdYWFhfUFJPUChCUTI3NTQxLCBicTI3NTQxX2JhdHRlcnlfcHJvcHMpLAorCUJRMjdYWFhfUFJPUChCUTI3NTQ1LCBicTI3NTQ1X2JhdHRlcnlfcHJvcHMpLAorCUJRMjdYWFhfUFJPUChCUTI3NDIxLCBicTI3NDIxX2JhdHRlcnlfcHJvcHMpLAorfTsKKworc3RhdGljIERFRklORV9NVVRFWChicTI3eHh4X2xpc3RfbG9jayk7CitzdGF0aWMgTElTVF9IRUFEKGJxMjd4eHhfYmF0dGVyeV9kZXZpY2VzKTsKKworc3RhdGljIGludCBwb2xsX2ludGVydmFsX3BhcmFtX3NldChjb25zdCBjaGFyICp2YWwsIGNvbnN0IHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQoreworCXN0cnVjdCBicTI3eHh4X2RldmljZV9pbmZvICpkaTsKKwlpbnQgcmV0OworCisJcmV0ID0gcGFyYW1fc2V0X3VpbnQodmFsLCBrcCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwltdXRleF9sb2NrKCZicTI3eHh4X2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkaSwgJmJxMjd4eHhfYmF0dGVyeV9kZXZpY2VzLCBsaXN0KSB7CisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZGktPndvcmspOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRpLT53b3JrLCAwKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZicTI3eHh4X2xpc3RfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGtlcm5lbF9wYXJhbV9vcHMgcGFyYW1fb3BzX3BvbGxfaW50ZXJ2YWwgPSB7CisJLmdldCA9IHBhcmFtX2dldF91aW50LAorCS5zZXQgPSBwb2xsX2ludGVydmFsX3BhcmFtX3NldCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcG9sbF9pbnRlcnZhbCA9IDM2MDsKK21vZHVsZV9wYXJhbV9jYihwb2xsX2ludGVydmFsLCAmcGFyYW1fb3BzX3BvbGxfaW50ZXJ2YWwsICZwb2xsX2ludGVydmFsLCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocG9sbF9pbnRlcnZhbCwKKwkJICJiYXR0ZXJ5IHBvbGwgaW50ZXJ2YWwgaW4gc2Vjb25kcyAtIDAgZGlzYWJsZXMgcG9sbGluZyIpOworCisvKgorICogQ29tbW9uIGNvZGUgZm9yIEJRMjd4eHggZGV2aWNlcworICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGJxMjd4eHhfcmVhZChzdHJ1Y3QgYnEyN3h4eF9kZXZpY2VfaW5mbyAqZGksIGludCByZWdfaW5kZXgsCisJCQkgICAgICAgYm9vbCBzaW5nbGUpCit7CisJLyogUmVwb3J0cyBFSU5WQUwgZm9yIGludmFsaWQvbWlzc2luZyByZWdpc3RlcnMgKi8KKwlpZiAoIWRpIHx8IGRpLT5yZWdzW3JlZ19pbmRleF0gPT0gSU5WQUxJRF9SRUdfQUREUikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gZGktPmJ1cy5yZWFkKGRpLCBkaS0+cmVnc1tyZWdfaW5kZXhdLCBzaW5nbGUpOworfQorCisvKgorICogUmV0dXJuIHRoZSBiYXR0ZXJ5IFN0YXRlLW9mLUNoYXJnZQorICogT3IgPCAwIGlmIHNvbWV0aGluZyBmYWlscy4KKyAqLworc3RhdGljIGludCBicTI3eHh4X2JhdHRlcnlfcmVhZF9zb2Moc3RydWN0IGJxMjd4eHhfZGV2aWNlX2luZm8gKmRpKQoreworCWludCBzb2M7CisKKwlpZiAoZGktPmNoaXAgPT0gQlEyNzAwMCB8fCBkaS0+Y2hpcCA9PSBCUTI3MDEwKQorCQlzb2MgPSBicTI3eHh4X3JlYWQoZGksIEJRMjdYWFhfUkVHX1NPQywgdHJ1ZSk7CisJZWxzZQorCQlzb2MgPSBicTI3eHh4X3JlYWQoZGksIEJRMjdYWFhfUkVHX1NPQywgZmFsc2UpOworCisJaWYgKHNvYyA8IDApCisJCWRldl9kYmcoZGktPmRldiwgImVycm9yIHJlYWRpbmcgU3RhdGUtb2YtQ2hhcmdlXG4iKTsKKworCXJldHVybiBzb2M7Cit9CisKKy8qCisgKiBSZXR1cm4gYSBiYXR0ZXJ5IGNoYXJnZSB2YWx1ZSBpbiDCtUFoCisgKiBPciA8IDAgaWYgc29tZXRoaW5nIGZhaWxzLgorICovCitzdGF0aWMgaW50IGJxMjd4eHhfYmF0dGVyeV9yZWFkX2NoYXJnZShzdHJ1Y3QgYnEyN3h4eF9kZXZpY2VfaW5mbyAqZGksIHU4IHJlZykKK3sKKwlpbnQgY2hhcmdlOworCisJY2hhcmdlID0gYnEyN3h4eF9yZWFkKGRpLCByZWcsIGZhbHNlKTsKKwlpZiAoY2hhcmdlIDwgMCkgeworCQlkZXZfZGJnKGRpLT5kZXYsICJlcnJvciByZWFkaW5nIGNoYXJnZSByZWdpc3RlciAlMDJ4OiAlZFxuIiwKKwkJCXJlZywgY2hhcmdlKTsKKwkJcmV0dXJuIGNoYXJnZTsKKwl9CisKKwlpZiAoZGktPmNoaXAgPT0gQlEyNzAwMCB8fCBkaS0+Y2hpcCA9PSBCUTI3MDEwKQorCQljaGFyZ2UgKj0gQlEyN1hYWF9DVVJSRU5UX0NPTlNUQU5UIC8gQlEyN1hYWF9SUzsKKwllbHNlCisJCWNoYXJnZSAqPSAxMDAwOworCisJcmV0dXJuIGNoYXJnZTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgYmF0dGVyeSBOb21pbmFsIGF2YWlsYWJsZSBjYXBhY2l0eSBpbiDCtUFoCisgKiBPciA8IDAgaWYgc29tZXRoaW5nIGZhaWxzLgorICovCitzdGF0aWMgaW5saW5lIGludCBicTI3eHh4X2JhdHRlcnlfcmVhZF9uYWMoc3RydWN0IGJxMjd4eHhfZGV2aWNlX2luZm8gKmRpKQoreworCWludCBmbGFnczsKKworCWlmIChkaS0+Y2hpcCA9PSBCUTI3MDAwIHx8IGRpLT5jaGlwID09IEJRMjcwMTApIHsKKwkJZmxhZ3MgPSBicTI3eHh4X3JlYWQoZGksIEJRMjdYWFhfUkVHX0ZMQUdTLCB0cnVlKTsKKwkJaWYgKGZsYWdzID49IDAgJiYgKGZsYWdzICYgQlEyNzAwMF9GTEFHX0NJKSkKKwkJCXJldHVybiAtRU5PREFUQTsKKwl9CisKKwlyZXR1cm4gYnEyN3h4eF9iYXR0ZXJ5X3JlYWRfY2hhcmdlKGRpLCBCUTI3WFhYX1JFR19OQUMpOworfQorCisvKgorICogUmV0dXJuIHRoZSBiYXR0ZXJ5IEZ1bGwgQ2hhcmdlIENhcGFjaXR5IGluIMK1QWgKKyAqIE9yIDwgMCBpZiBzb21ldGhpbmcgZmFpbHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGJxMjd4eHhfYmF0dGVyeV9yZWFkX2ZjYyhzdHJ1Y3QgYnEyN3h4eF9kZXZpY2VfaW5mbyAqZGkpCit7CisJcmV0dXJuIGJxMjd4eHhfYmF0dGVyeV9yZWFkX2NoYXJnZShkaSwgQlEyN1hYWF9SRUdfRkNDKTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgRGVzaWduIENhcGFjaXR5IGluIMK1QWgKKyAqIE9yIDwgMCBpZiBzb21ldGhpbmcgZmFpbHMuCisgKi8KK3N0YXRpYyBpbnQgYnEyN3h4eF9iYXR0ZXJ5X3JlYWRfZGNhcChzdHJ1Y3QgYnEyN3h4eF9kZXZpY2VfaW5mbyAqZGkpCit7CisJaW50IGRjYXA7CisKKwlpZiAoZGktPmNoaXAgPT0gQlEyNzAwMCB8fCBkaS0+Y2hpcCA9PSBCUTI3MDEwKQorCQlkY2FwID0gYnEyN3h4eF9yZWFkKGRpLCBCUTI3WFhYX1JFR19EQ0FQLCB0cnVlKTsKKwllbHNlCisJCWRjYXAgPSBicTI3eHh4X3JlYWQoZGksIEJRMjdYWFhfUkVHX0RDQVAsIGZhbHNlKTsKKworCWlmIChkY2FwIDwgMCkgeworCQlkZXZfZGJnKGRpLT5kZXYsICJlcnJvciByZWFkaW5nIGluaXRpYWwgbGFzdCBtZWFzdXJlZCBkaXNjaGFyZ2VcbiIpOworCQlyZXR1cm4gZGNhcDsKKwl9CisKKwlpZiAoZGktPmNoaXAgPT0gQlEyNzAwMCB8fCBkaS0+Y2hpcCA9PSBCUTI3MDEwKQorCQlkY2FwID0gKGRjYXAgPDwgOCkgKiBCUTI3WFhYX0NVUlJFTlRfQ09OU1RBTlQgLyBCUTI3WFhYX1JTOworCWVsc2UKKwkJZGNhcCAqPSAxMDAwOworCisJcmV0dXJuIGRjYXA7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGJhdHRlcnkgQXZhaWxhYmxlIGVuZXJneSBpbiDCtVdoCisgKiBPciA8IDAgaWYgc29tZXRoaW5nIGZhaWxzLgorICovCitzdGF0aWMgaW50IGJxMjd4eHhfYmF0dGVyeV9yZWFkX2VuZXJneShzdHJ1Y3QgYnEyN3h4eF9kZXZpY2VfaW5mbyAqZGkpCit7CisJaW50IGFlOworCisJYWUgPSBicTI3eHh4X3JlYWQoZGksIEJRMjdYWFhfUkVHX0FFLCBmYWxzZSk7CisJaWYgKGFlIDwgMCkgeworCQlkZXZfZGJnKGRpLT5kZXYsICJlcnJvciByZWFkaW5nIGF2YWlsYWJsZSBlbmVyZ3lcbiIpOworCQlyZXR1cm4gYWU7CisJfQorCisJaWYgKGRpLT5jaGlwID09IEJRMjcwMDAgfHwgZGktPmNoaXAgPT0gQlEyNzAxMCkKKwkJYWUgKj0gQlEyN1hYWF9QT1dFUl9DT05TVEFOVCAvIEJRMjdYWFhfUlM7CisJZWxzZQorCQlhZSAqPSAxMDAwOworCisJcmV0dXJuIGFlOworfQorCisvKgorICogUmV0dXJuIHRoZSBiYXR0ZXJ5IHRlbXBlcmF0dXJlIGluIHRlbnRocyBvZiBkZWdyZWUgS2VsdmluCisgKiBPciA8IDAgaWYgc29tZXRoaW5nIGZhaWxzLgorICovCitzdGF0aWMgaW50IGJxMjd4eHhfYmF0dGVyeV9yZWFkX3RlbXBlcmF0dXJlKHN0cnVjdCBicTI3eHh4X2RldmljZV9pbmZvICpkaSkKK3sKKwlpbnQgdGVtcDsKKworCXRlbXAgPSBicTI3eHh4X3JlYWQoZGksIEJRMjdYWFhfUkVHX1RFTVAsIGZhbHNlKTsKKwlpZiAodGVtcCA8IDApIHsKKwkJZGV2X2VycihkaS0+ZGV2LCAiZXJyb3IgcmVhZGluZyB0ZW1wZXJhdHVyZVxuIik7CisJCXJldHVybiB0ZW1wOworCX0KKworCWlmIChkaS0+Y2hpcCA9PSBCUTI3MDAwIHx8IGRpLT5jaGlwID09IEJRMjcwMTApCisJCXRlbXAgPSA1ICogdGVtcCAvIDI7CisKKwlyZXR1cm4gdGVtcDsKK30KKworLyoKKyAqIFJldHVybiB0aGUgYmF0dGVyeSBDeWNsZSBjb3VudCB0b3RhbAorICogT3IgPCAwIGlmIHNvbWV0aGluZyBmYWlscy4KKyAqLworc3RhdGljIGludCBicTI3eHh4X2JhdHRlcnlfcmVhZF9jeWN0KHN0cnVjdCBicTI3eHh4X2RldmljZV9pbmZvICpkaSkKK3sKKwlpbnQgY3ljdDsKKworCWN5Y3QgPSBicTI3eHh4X3JlYWQoZGksIEJRMjdYWFhfUkVHX0NZQ1QsIGZhbHNlKTsKKwlpZiAoY3ljdCA8IDApCisJCWRldl9lcnIoZGktPmRldiwgImVycm9yIHJlYWRpbmcgY3ljbGUgY291bnQgdG90YWxcbiIpOworCisJcmV0dXJuIGN5Y3Q7Cit9CisKKy8qCisgKiBSZWFkIGEgdGltZSByZWdpc3Rlci4KKyAqIFJldHVybiA8IDAgaWYgc29tZXRoaW5nIGZhaWxzLgorICovCitzdGF0aWMgaW50IGJxMjd4eHhfYmF0dGVyeV9yZWFkX3RpbWUoc3RydWN0IGJxMjd4eHhfZGV2aWNlX2luZm8gKmRpLCB1OCByZWcpCit7CisJaW50IHR2YWw7CisKKwl0dmFsID0gYnEyN3h4eF9yZWFkKGRpLCByZWcsIGZhbHNlKTsKKwlpZiAodHZhbCA8IDApIHsKKwkJZGV2X2RiZyhkaS0+ZGV2LCAiZXJyb3IgcmVhZGluZyB0aW1lIHJlZ2lzdGVyICUwMng6ICVkXG4iLAorCQkJcmVnLCB0dmFsKTsKKwkJcmV0dXJuIHR2YWw7CisJfQorCisJaWYgKHR2YWwgPT0gNjU1MzUpCisJCXJldHVybiAtRU5PREFUQTsKKworCXJldHVybiB0dmFsICogNjA7Cit9CisKKy8qCisgKiBSZWFkIGFuIGF2ZXJhZ2UgcG93ZXIgcmVnaXN0ZXIuCisgKiBSZXR1cm4gPCAwIGlmIHNvbWV0aGluZyBmYWlscy4KKyAqLworc3RhdGljIGludCBicTI3eHh4X2JhdHRlcnlfcmVhZF9wd3JfYXZnKHN0cnVjdCBicTI3eHh4X2RldmljZV9pbmZvICpkaSkKK3sKKwlpbnQgdHZhbDsKKworCXR2YWwgPSBicTI3eHh4X3JlYWQoZGksIEJRMjdYWFhfUkVHX0FQLCBmYWxzZSk7CisJaWYgKHR2YWwgPCAwKSB7CisJCWRldl9lcnIoZGktPmRldiwgImVycm9yIHJlYWRpbmcgYXZlcmFnZSBwb3dlciByZWdpc3RlciAgJTAyeDogJWRcbiIsCisJCQlCUTI3WFhYX1JFR19BUCwgdHZhbCk7CisJCXJldHVybiB0dmFsOworCX0KKworCWlmIChkaS0+Y2hpcCA9PSBCUTI3MDAwIHx8IGRpLT5jaGlwID09IEJRMjcwMTApCisJCXJldHVybiAodHZhbCAqIEJRMjdYWFhfUE9XRVJfQ09OU1RBTlQpIC8gQlEyN1hYWF9SUzsKKwllbHNlCisJCXJldHVybiB0dmFsOworfQorCisvKgorICogUmV0dXJucyB0cnVlIGlmIGEgYmF0dGVyeSBvdmVyIHRlbXBlcmF0dXJlIGNvbmRpdGlvbiBpcyBkZXRlY3RlZAorICovCitzdGF0aWMgYm9vbCBicTI3eHh4X2JhdHRlcnlfb3ZlcnRlbXAoc3RydWN0IGJxMjd4eHhfZGV2aWNlX2luZm8gKmRpLCB1MTYgZmxhZ3MpCit7CisJaWYgKGRpLT5jaGlwID09IEJRMjc1MDAgfHwgZGktPmNoaXAgPT0gQlEyNzU0MSB8fCBkaS0+Y2hpcCA9PSBCUTI3NTQ1KQorCQlyZXR1cm4gZmxhZ3MgJiAoQlEyN1hYWF9GTEFHX09UQyB8IEJRMjdYWFhfRkxBR19PVEQpOworCWlmIChkaS0+Y2hpcCA9PSBCUTI3NTMwIHx8IGRpLT5jaGlwID09IEJRMjc0MjEpCisJCXJldHVybiBmbGFncyAmIEJRMjdYWFhfRkxBR19PVDsKKworCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIFJldHVybnMgdHJ1ZSBpZiBhIGJhdHRlcnkgdW5kZXIgdGVtcGVyYXR1cmUgY29uZGl0aW9uIGlzIGRldGVjdGVkCisgKi8KK3N0YXRpYyBib29sIGJxMjd4eHhfYmF0dGVyeV91bmRlcnRlbXAoc3RydWN0IGJxMjd4eHhfZGV2aWNlX2luZm8gKmRpLCB1MTYgZmxhZ3MpCit7CisJaWYgKGRpLT5jaGlwID09IEJRMjc1MzAgfHwgZGktPmNoaXAgPT0gQlEyNzQyMSkKKwkJcmV0dXJuIGZsYWdzICYgQlEyN1hYWF9GTEFHX1VUOworCisJcmV0dXJuIGZhbHNlOworfQorCisvKgorICogUmV0dXJucyB0cnVlIGlmIGEgbG93IHN0YXRlIG9mIGNoYXJnZSBjb25kaXRpb24gaXMgZGV0ZWN0ZWQKKyAqLworc3RhdGljIGJvb2wgYnEyN3h4eF9iYXR0ZXJ5X2RlYWQoc3RydWN0IGJxMjd4eHhfZGV2aWNlX2luZm8gKmRpLCB1MTYgZmxhZ3MpCit7CisJaWYgKGRpLT5jaGlwID09IEJRMjcwMDAgfHwgZGktPmNoaXAgPT0gQlEyNzAxMCkKKwkJcmV0dXJuIGZsYWdzICYgKEJRMjcwMDBfRkxBR19FRFYxIHwgQlEyNzAwMF9GTEFHX0VEVkYpOworCWVsc2UKKwkJcmV0dXJuIGZsYWdzICYgKEJRMjdYWFhfRkxBR19TT0MxIHwgQlEyN1hYWF9GTEFHX1NPQ0YpOworfQorCisvKgorICogUmVhZCBmbGFnIHJlZ2lzdGVyLgorICogUmV0dXJuIDwgMCBpZiBzb21ldGhpbmcgZmFpbHMuCisgKi8KK3N0YXRpYyBpbnQgYnEyN3h4eF9iYXR0ZXJ5X3JlYWRfaGVhbHRoKHN0cnVjdCBicTI3eHh4X2RldmljZV9pbmZvICpkaSkKK3sKKwlpbnQgZmxhZ3M7CisJYm9vbCBoYXNfc2luZ2VfZmxhZyA9IGRpLT5jaGlwID09IEJRMjcwMDAgfHwgZGktPmNoaXAgPT0gQlEyNzAxMDsKKworCWZsYWdzID0gYnEyN3h4eF9yZWFkKGRpLCBCUTI3WFhYX1JFR19GTEFHUywgaGFzX3NpbmdlX2ZsYWcpOworCWlmIChmbGFncyA8IDApIHsKKwkJZGV2X2VycihkaS0+ZGV2LCAiZXJyb3IgcmVhZGluZyBmbGFnIHJlZ2lzdGVyOiVkXG4iLCBmbGFncyk7CisJCXJldHVybiBmbGFnczsKKwl9CisKKwkvKiBVbmxpa2VseSBidXQgaW1wb3J0YW50IHRvIHJldHVybiBmaXJzdCAqLworCWlmICh1bmxpa2VseShicTI3eHh4X2JhdHRlcnlfb3ZlcnRlbXAoZGksIGZsYWdzKSkpCisJCXJldHVybiBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJIRUFUOworCWlmICh1bmxpa2VseShicTI3eHh4X2JhdHRlcnlfdW5kZXJ0ZW1wKGRpLCBmbGFncykpKQorCQlyZXR1cm4gUE9XRVJfU1VQUExZX0hFQUxUSF9DT0xEOworCWlmICh1bmxpa2VseShicTI3eHh4X2JhdHRlcnlfZGVhZChkaSwgZmxhZ3MpKSkKKwkJcmV0dXJuIFBPV0VSX1NVUFBMWV9IRUFMVEhfREVBRDsKKworCXJldHVybiBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0Q7Cit9CisKK3ZvaWQgYnEyN3h4eF9iYXR0ZXJ5X3VwZGF0ZShzdHJ1Y3QgYnEyN3h4eF9kZXZpY2VfaW5mbyAqZGkpCit7CisJc3RydWN0IGJxMjd4eHhfcmVnX2NhY2hlIGNhY2hlID0gezAsIH07CisJYm9vbCBoYXNfY2lfZmxhZyA9IGRpLT5jaGlwID09IEJRMjcwMDAgfHwgZGktPmNoaXAgPT0gQlEyNzAxMDsKKwlib29sIGhhc19zaW5nZV9mbGFnID0gZGktPmNoaXAgPT0gQlEyNzAwMCB8fCBkaS0+Y2hpcCA9PSBCUTI3MDEwOworCisJY2FjaGUuZmxhZ3MgPSBicTI3eHh4X3JlYWQoZGksIEJRMjdYWFhfUkVHX0ZMQUdTLCBoYXNfc2luZ2VfZmxhZyk7CisJaWYgKChjYWNoZS5mbGFncyAmIDB4ZmYpID09IDB4ZmYpCisJCWNhY2hlLmZsYWdzID0gLTE7IC8qIHJlYWQgZXJyb3IgKi8KKwlpZiAoY2FjaGUuZmxhZ3MgPj0gMCkgeworCQljYWNoZS50ZW1wZXJhdHVyZSA9IGJxMjd4eHhfYmF0dGVyeV9yZWFkX3RlbXBlcmF0dXJlKGRpKTsKKwkJaWYgKGhhc19jaV9mbGFnICYmIChjYWNoZS5mbGFncyAmIEJRMjcwMDBfRkxBR19DSSkpIHsKKwkJCWRldl9pbmZvX29uY2UoZGktPmRldiwgImJhdHRlcnkgaXMgbm90IGNhbGlicmF0ZWQhIGlnbm9yaW5nIGNhcGFjaXR5IHZhbHVlc1xuIik7CisJCQljYWNoZS5jYXBhY2l0eSA9IC1FTk9EQVRBOworCQkJY2FjaGUuZW5lcmd5ID0gLUVOT0RBVEE7CisJCQljYWNoZS50aW1lX3RvX2VtcHR5ID0gLUVOT0RBVEE7CisJCQljYWNoZS50aW1lX3RvX2VtcHR5X2F2ZyA9IC1FTk9EQVRBOworCQkJY2FjaGUudGltZV90b19mdWxsID0gLUVOT0RBVEE7CisJCQljYWNoZS5jaGFyZ2VfZnVsbCA9IC1FTk9EQVRBOworCQkJY2FjaGUuaGVhbHRoID0gLUVOT0RBVEE7CisJCX0gZWxzZSB7CisJCQlpZiAoZGktPnJlZ3NbQlEyN1hYWF9SRUdfVFRFXSAhPSBJTlZBTElEX1JFR19BRERSKQorCQkJCWNhY2hlLnRpbWVfdG9fZW1wdHkgPSBicTI3eHh4X2JhdHRlcnlfcmVhZF90aW1lKGRpLCBCUTI3WFhYX1JFR19UVEUpOworCQkJaWYgKGRpLT5yZWdzW0JRMjdYWFhfUkVHX1RURUNQXSAhPSBJTlZBTElEX1JFR19BRERSKQorCQkJCWNhY2hlLnRpbWVfdG9fZW1wdHlfYXZnID0gYnEyN3h4eF9iYXR0ZXJ5X3JlYWRfdGltZShkaSwgQlEyN1hYWF9SRUdfVFRFQ1ApOworCQkJaWYgKGRpLT5yZWdzW0JRMjdYWFhfUkVHX1RURl0gIT0gSU5WQUxJRF9SRUdfQUREUikKKwkJCQljYWNoZS50aW1lX3RvX2Z1bGwgPSBicTI3eHh4X2JhdHRlcnlfcmVhZF90aW1lKGRpLCBCUTI3WFhYX1JFR19UVEYpOworCQkJY2FjaGUuY2hhcmdlX2Z1bGwgPSBicTI3eHh4X2JhdHRlcnlfcmVhZF9mY2MoZGkpOworCQkJY2FjaGUuY2FwYWNpdHkgPSBicTI3eHh4X2JhdHRlcnlfcmVhZF9zb2MoZGkpOworCQkJaWYgKGRpLT5yZWdzW0JRMjdYWFhfUkVHX0FFXSAhPSBJTlZBTElEX1JFR19BRERSKQorCQkJCWNhY2hlLmVuZXJneSA9IGJxMjd4eHhfYmF0dGVyeV9yZWFkX2VuZXJneShkaSk7CisJCQljYWNoZS5oZWFsdGggPSBicTI3eHh4X2JhdHRlcnlfcmVhZF9oZWFsdGgoZGkpOworCQl9CisJCWlmIChkaS0+cmVnc1tCUTI3WFhYX1JFR19DWUNUXSAhPSBJTlZBTElEX1JFR19BRERSKQorCQkJY2FjaGUuY3ljbGVfY291bnQgPSBicTI3eHh4X2JhdHRlcnlfcmVhZF9jeWN0KGRpKTsKKwkJaWYgKGRpLT5yZWdzW0JRMjdYWFhfUkVHX0FQXSAhPSBJTlZBTElEX1JFR19BRERSKQorCQkJY2FjaGUucG93ZXJfYXZnID0gYnEyN3h4eF9iYXR0ZXJ5X3JlYWRfcHdyX2F2ZyhkaSk7CisKKwkJLyogV2Ugb25seSBoYXZlIHRvIHJlYWQgY2hhcmdlIGRlc2lnbiBmdWxsIG9uY2UgKi8KKwkJaWYgKGRpLT5jaGFyZ2VfZGVzaWduX2Z1bGwgPD0gMCkKKwkJCWRpLT5jaGFyZ2VfZGVzaWduX2Z1bGwgPSBicTI3eHh4X2JhdHRlcnlfcmVhZF9kY2FwKGRpKTsKKwl9CisKKwlpZiAoZGktPmNhY2hlLmNhcGFjaXR5ICE9IGNhY2hlLmNhcGFjaXR5KQorCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChkaS0+YmF0KTsKKworCWlmIChtZW1jbXAoJmRpLT5jYWNoZSwgJmNhY2hlLCBzaXplb2YoY2FjaGUpKSAhPSAwKQorCQlkaS0+Y2FjaGUgPSBjYWNoZTsKKworCWRpLT5sYXN0X3VwZGF0ZSA9IGppZmZpZXM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChicTI3eHh4X2JhdHRlcnlfdXBkYXRlKTsKKworc3RhdGljIHZvaWQgYnEyN3h4eF9iYXR0ZXJ5X3BvbGwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBicTI3eHh4X2RldmljZV9pbmZvICpkaSA9CisJCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGJxMjd4eHhfZGV2aWNlX2luZm8sCisJCQkJICAgICB3b3JrLndvcmspOworCisJYnEyN3h4eF9iYXR0ZXJ5X3VwZGF0ZShkaSk7CisKKwlpZiAocG9sbF9pbnRlcnZhbCA+IDApCisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZGktPndvcmssIHBvbGxfaW50ZXJ2YWwgKiBIWik7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGJhdHRlcnkgYXZlcmFnZSBjdXJyZW50IGluIMK1QQorICogTm90ZSB0aGF0IGN1cnJlbnQgY2FuIGJlIG5lZ2F0aXZlIHNpZ25lZCBhcyB3ZWxsCisgKiBPciAwIGlmIHNvbWV0aGluZyBmYWlscy4KKyAqLworc3RhdGljIGludCBicTI3eHh4X2JhdHRlcnlfY3VycmVudChzdHJ1Y3QgYnEyN3h4eF9kZXZpY2VfaW5mbyAqZGksCisJCQkJICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlpbnQgY3VycjsKKwlpbnQgZmxhZ3M7CisKKwljdXJyID0gYnEyN3h4eF9yZWFkKGRpLCBCUTI3WFhYX1JFR19BSSwgZmFsc2UpOworCWlmIChjdXJyIDwgMCkgeworCQlkZXZfZXJyKGRpLT5kZXYsICJlcnJvciByZWFkaW5nIGN1cnJlbnRcbiIpOworCQlyZXR1cm4gY3VycjsKKwl9CisKKwlpZiAoZGktPmNoaXAgPT0gQlEyNzAwMCB8fCBkaS0+Y2hpcCA9PSBCUTI3MDEwKSB7CisJCWZsYWdzID0gYnEyN3h4eF9yZWFkKGRpLCBCUTI3WFhYX1JFR19GTEFHUywgdHJ1ZSk7CisJCWlmIChmbGFncyAmIEJRMjcwMDBfRkxBR19DSEdTKSB7CisJCQlkZXZfZGJnKGRpLT5kZXYsICJuZWdhdGl2ZSBjdXJyZW50IVxuIik7CisJCQljdXJyID0gLWN1cnI7CisJCX0KKworCQl2YWwtPmludHZhbCA9IGN1cnIgKiBCUTI3WFhYX0NVUlJFTlRfQ09OU1RBTlQgLyBCUTI3WFhYX1JTOworCX0gZWxzZSB7CisJCS8qIE90aGVyIGdhdWdlcyByZXR1cm4gc2lnbmVkIHZhbHVlICovCisJCXZhbC0+aW50dmFsID0gKGludCkoKHMxNiljdXJyKSAqIDEwMDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnEyN3h4eF9iYXR0ZXJ5X3N0YXR1cyhzdHJ1Y3QgYnEyN3h4eF9kZXZpY2VfaW5mbyAqZGksCisJCQkJICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCWludCBzdGF0dXM7CisKKwlpZiAoZGktPmNoaXAgPT0gQlEyNzAwMCB8fCBkaS0+Y2hpcCA9PSBCUTI3MDEwKSB7CisJCWlmIChkaS0+Y2FjaGUuZmxhZ3MgJiBCUTI3MDAwX0ZMQUdfRkMpCisJCQlzdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0ZVTEw7CisJCWVsc2UgaWYgKGRpLT5jYWNoZS5mbGFncyAmIEJRMjcwMDBfRkxBR19DSEdTKQorCQkJc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKKwkJZWxzZSBpZiAocG93ZXJfc3VwcGx5X2FtX2lfc3VwcGxpZWQoZGktPmJhdCkpCisJCQlzdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX05PVF9DSEFSR0lORzsKKwkJZWxzZQorCQkJc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORzsKKwl9IGVsc2UgeworCQlpZiAoZGktPmNhY2hlLmZsYWdzICYgQlEyN1hYWF9GTEFHX0ZDKQorCQkJc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19GVUxMOworCQllbHNlIGlmIChkaS0+Y2FjaGUuZmxhZ3MgJiBCUTI3WFhYX0ZMQUdfRFNDKQorCQkJc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORzsKKwkJZWxzZQorCQkJc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKKwl9CisKKwl2YWwtPmludHZhbCA9IHN0YXR1czsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJxMjd4eHhfYmF0dGVyeV9jYXBhY2l0eV9sZXZlbChzdHJ1Y3QgYnEyN3h4eF9kZXZpY2VfaW5mbyAqZGksCisJCQkJCSAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlpbnQgbGV2ZWw7CisKKwlpZiAoZGktPmNoaXAgPT0gQlEyNzAwMCB8fCBkaS0+Y2hpcCA9PSBCUTI3MDEwKSB7CisJCWlmIChkaS0+Y2FjaGUuZmxhZ3MgJiBCUTI3MDAwX0ZMQUdfRkMpCisJCQlsZXZlbCA9IFBPV0VSX1NVUFBMWV9DQVBBQ0lUWV9MRVZFTF9GVUxMOworCQllbHNlIGlmIChkaS0+Y2FjaGUuZmxhZ3MgJiBCUTI3MDAwX0ZMQUdfRURWMSkKKwkJCWxldmVsID0gUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX0xPVzsKKwkJZWxzZSBpZiAoZGktPmNhY2hlLmZsYWdzICYgQlEyNzAwMF9GTEFHX0VEVkYpCisJCQlsZXZlbCA9IFBPV0VSX1NVUFBMWV9DQVBBQ0lUWV9MRVZFTF9DUklUSUNBTDsKKwkJZWxzZQorCQkJbGV2ZWwgPSBQT1dFUl9TVVBQTFlfQ0FQQUNJVFlfTEVWRUxfTk9STUFMOworCX0gZWxzZSB7CisJCWlmIChkaS0+Y2FjaGUuZmxhZ3MgJiBCUTI3WFhYX0ZMQUdfRkMpCisJCQlsZXZlbCA9IFBPV0VSX1NVUFBMWV9DQVBBQ0lUWV9MRVZFTF9GVUxMOworCQllbHNlIGlmIChkaS0+Y2FjaGUuZmxhZ3MgJiBCUTI3WFhYX0ZMQUdfU09DMSkKKwkJCWxldmVsID0gUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX0xPVzsKKwkJZWxzZSBpZiAoZGktPmNhY2hlLmZsYWdzICYgQlEyN1hYWF9GTEFHX1NPQ0YpCisJCQlsZXZlbCA9IFBPV0VSX1NVUFBMWV9DQVBBQ0lUWV9MRVZFTF9DUklUSUNBTDsKKwkJZWxzZQorCQkJbGV2ZWwgPSBQT1dFUl9TVVBQTFlfQ0FQQUNJVFlfTEVWRUxfTk9STUFMOworCX0KKworCXZhbC0+aW50dmFsID0gbGV2ZWw7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJldHVybiB0aGUgYmF0dGVyeSBWb2x0YWdlIGluIG1pbGxpdm9sdHMKKyAqIE9yIDwgMCBpZiBzb21ldGhpbmcgZmFpbHMuCisgKi8KK3N0YXRpYyBpbnQgYnEyN3h4eF9iYXR0ZXJ5X3ZvbHRhZ2Uoc3RydWN0IGJxMjd4eHhfZGV2aWNlX2luZm8gKmRpLAorCQkJCSAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJaW50IHZvbHQ7CisKKwl2b2x0ID0gYnEyN3h4eF9yZWFkKGRpLCBCUTI3WFhYX1JFR19WT0xULCBmYWxzZSk7CisJaWYgKHZvbHQgPCAwKSB7CisJCWRldl9lcnIoZGktPmRldiwgImVycm9yIHJlYWRpbmcgdm9sdGFnZVxuIik7CisJCXJldHVybiB2b2x0OworCX0KKworCXZhbC0+aW50dmFsID0gdm9sdCAqIDEwMDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBicTI3eHh4X3NpbXBsZV92YWx1ZShpbnQgdmFsdWUsCisJCQkJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlpZiAodmFsdWUgPCAwKQorCQlyZXR1cm4gdmFsdWU7CisKKwl2YWwtPmludHZhbCA9IHZhbHVlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnEyN3h4eF9iYXR0ZXJ5X2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJCQkJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwkJCQkJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYnEyN3h4eF9kZXZpY2VfaW5mbyAqZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKKworCW11dGV4X2xvY2soJmRpLT5sb2NrKTsKKwlpZiAodGltZV9pc19iZWZvcmVfamlmZmllcyhkaS0+bGFzdF91cGRhdGUgKyA1ICogSFopKSB7CisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZGktPndvcmspOworCQlicTI3eHh4X2JhdHRlcnlfcG9sbCgmZGktPndvcmsud29yayk7CisJfQorCW11dGV4X3VubG9jaygmZGktPmxvY2spOworCisJaWYgKHBzcCAhPSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UICYmIGRpLT5jYWNoZS5mbGFncyA8IDApCisJCXJldHVybiAtRU5PREVWOworCisJc3dpdGNoIChwc3ApIHsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKKwkJcmV0ID0gYnEyN3h4eF9iYXR0ZXJ5X3N0YXR1cyhkaSwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKKwkJcmV0ID0gYnEyN3h4eF9iYXR0ZXJ5X3ZvbHRhZ2UoZGksIHZhbCk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDoKKwkJdmFsLT5pbnR2YWwgPSBkaS0+Y2FjaGUuZmxhZ3MgPCAwID8gMCA6IDE7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1c6CisJCXJldCA9IGJxMjd4eHhfYmF0dGVyeV9jdXJyZW50KGRpLCB2YWwpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZOgorCQlyZXQgPSBicTI3eHh4X3NpbXBsZV92YWx1ZShkaS0+Y2FjaGUuY2FwYWNpdHksIHZhbCk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFlfTEVWRUw6CisJCXJldCA9IGJxMjd4eHhfYmF0dGVyeV9jYXBhY2l0eV9sZXZlbChkaSwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QOgorCQlyZXQgPSBicTI3eHh4X3NpbXBsZV92YWx1ZShkaS0+Y2FjaGUudGVtcGVyYXR1cmUsIHZhbCk7CisJCWlmIChyZXQgPT0gMCkKKwkJCXZhbC0+aW50dmFsIC09IDI3MzE7IC8qIGNvbnZlcnQgZGVjaWRlZ3JlZSBrIHRvIGMgKi8KKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0VNUFRZX05PVzoKKwkJcmV0ID0gYnEyN3h4eF9zaW1wbGVfdmFsdWUoZGktPmNhY2hlLnRpbWVfdG9fZW1wdHksIHZhbCk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19FTVBUWV9BVkc6CisJCXJldCA9IGJxMjd4eHhfc2ltcGxlX3ZhbHVlKGRpLT5jYWNoZS50aW1lX3RvX2VtcHR5X2F2ZywgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0ZVTExfTk9XOgorCQlyZXQgPSBicTI3eHh4X3NpbXBsZV92YWx1ZShkaS0+Y2FjaGUudGltZV90b19mdWxsLCB2YWwpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1k6CisJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1RFQ0hOT0xPR1lfTElPTjsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XOgorCQlyZXQgPSBicTI3eHh4X3NpbXBsZV92YWx1ZShicTI3eHh4X2JhdHRlcnlfcmVhZF9uYWMoZGkpLCB2YWwpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMOgorCQlyZXQgPSBicTI3eHh4X3NpbXBsZV92YWx1ZShkaS0+Y2FjaGUuY2hhcmdlX2Z1bGwsIHZhbCk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTExfREVTSUdOOgorCQlyZXQgPSBicTI3eHh4X3NpbXBsZV92YWx1ZShkaS0+Y2hhcmdlX2Rlc2lnbl9mdWxsLCB2YWwpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NZQ0xFX0NPVU5UOgorCQlyZXQgPSBicTI3eHh4X3NpbXBsZV92YWx1ZShkaS0+Y2FjaGUuY3ljbGVfY291bnQsIHZhbCk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX05PVzoKKwkJcmV0ID0gYnEyN3h4eF9zaW1wbGVfdmFsdWUoZGktPmNhY2hlLmVuZXJneSwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QT1dFUl9BVkc6CisJCXJldCA9IGJxMjd4eHhfc2ltcGxlX3ZhbHVlKGRpLT5jYWNoZS5wb3dlcl9hdmcsIHZhbCk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfSEVBTFRIOgorCQlyZXQgPSBicTI3eHh4X3NpbXBsZV92YWx1ZShkaS0+Y2FjaGUuaGVhbHRoLCB2YWwpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUjoKKwkJdmFsLT5zdHJ2YWwgPSBCUTI3WFhYX01BTlVGQUNUVVJFUjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYnEyN3h4eF9leHRlcm5hbF9wb3dlcl9jaGFuZ2VkKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSkKK3sKKwlzdHJ1Y3QgYnEyN3h4eF9kZXZpY2VfaW5mbyAqZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZGktPndvcmspOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZGktPndvcmssIDApOworfQorCitpbnQgYnEyN3h4eF9iYXR0ZXJ5X3NldHVwKHN0cnVjdCBicTI3eHh4X2RldmljZV9pbmZvICpkaSkKK3sKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgKnBzeV9kZXNjOworCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7IC5kcnZfZGF0YSA9IGRpLCB9OworCisJSU5JVF9ERUxBWUVEX1dPUksoJmRpLT53b3JrLCBicTI3eHh4X2JhdHRlcnlfcG9sbCk7CisJbXV0ZXhfaW5pdCgmZGktPmxvY2spOworCWRpLT5yZWdzID0gYnEyN3h4eF9yZWdzW2RpLT5jaGlwXTsKKworCXBzeV9kZXNjID0gZGV2bV9remFsbG9jKGRpLT5kZXYsIHNpemVvZigqcHN5X2Rlc2MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBzeV9kZXNjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBzeV9kZXNjLT5uYW1lID0gZGktPm5hbWU7CisJcHN5X2Rlc2MtPnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOworCXBzeV9kZXNjLT5wcm9wZXJ0aWVzID0gYnEyN3h4eF9iYXR0ZXJ5X3Byb3BzW2RpLT5jaGlwXS5wcm9wczsKKwlwc3lfZGVzYy0+bnVtX3Byb3BlcnRpZXMgPSBicTI3eHh4X2JhdHRlcnlfcHJvcHNbZGktPmNoaXBdLnNpemU7CisJcHN5X2Rlc2MtPmdldF9wcm9wZXJ0eSA9IGJxMjd4eHhfYmF0dGVyeV9nZXRfcHJvcGVydHk7CisJcHN5X2Rlc2MtPmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQgPSBicTI3eHh4X2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQ7CisKKwlkaS0+YmF0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyX25vX3dzKGRpLT5kZXYsIHBzeV9kZXNjLCAmcHN5X2NmZyk7CisJaWYgKElTX0VSUihkaS0+YmF0KSkgeworCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgYmF0dGVyeVxuIik7CisJCXJldHVybiBQVFJfRVJSKGRpLT5iYXQpOworCX0KKworCWRldl9pbmZvKGRpLT5kZXYsICJzdXBwb3J0IHZlci4gJXMgZW5hYmxlZFxuIiwgRFJJVkVSX1ZFUlNJT04pOworCisJYnEyN3h4eF9iYXR0ZXJ5X3VwZGF0ZShkaSk7CisKKwltdXRleF9sb2NrKCZicTI3eHh4X2xpc3RfbG9jayk7CisJbGlzdF9hZGQoJmRpLT5saXN0LCAmYnEyN3h4eF9iYXR0ZXJ5X2RldmljZXMpOworCW11dGV4X3VubG9jaygmYnEyN3h4eF9saXN0X2xvY2spOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChicTI3eHh4X2JhdHRlcnlfc2V0dXApOworCit2b2lkIGJxMjd4eHhfYmF0dGVyeV90ZWFyZG93bihzdHJ1Y3QgYnEyN3h4eF9kZXZpY2VfaW5mbyAqZGkpCit7CisJLyoKKwkgKiBwb3dlcl9zdXBwbHlfdW5yZWdpc3RlciBjYWxsIGJxMjd4eHhfYmF0dGVyeV9nZXRfcHJvcGVydHkgd2hpY2gKKwkgKiBjYWxsIGJxMjd4eHhfYmF0dGVyeV9wb2xsLgorCSAqIE1ha2Ugc3VyZSB0aGF0IGJxMjd4eHhfYmF0dGVyeV9wb2xsIHdpbGwgbm90IGNhbGwKKwkgKiBzY2hlZHVsZV9kZWxheWVkX3dvcmsgYWdhaW4gYWZ0ZXIgdW5yZWdpc3RlciAod2hpY2ggY2F1c2UgT09QUykuCisJICovCisJcG9sbF9pbnRlcnZhbCA9IDA7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmRpLT53b3JrKTsKKworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGRpLT5iYXQpOworCisJbXV0ZXhfbG9jaygmYnEyN3h4eF9saXN0X2xvY2spOworCWxpc3RfZGVsKCZkaS0+bGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZicTI3eHh4X2xpc3RfbG9jayk7CisKKwltdXRleF9kZXN0cm95KCZkaS0+bG9jayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChicTI3eHh4X2JhdHRlcnlfdGVhcmRvd24pOworCitzdGF0aWMgaW50IGJxMjd4eHhfYmF0dGVyeV9wbGF0Zm9ybV9yZWFkKHN0cnVjdCBicTI3eHh4X2RldmljZV9pbmZvICpkaSwgdTggcmVnLAorCQkJCQkgYm9vbCBzaW5nbGUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gZGktPmRldjsKKwlzdHJ1Y3QgYnEyN3h4eF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKwl1bnNpZ25lZCBpbnQgdGltZW91dCA9IDM7CisJaW50IHVwcGVyLCBsb3dlcjsKKwlpbnQgdGVtcDsKKworCWlmICghc2luZ2xlKSB7CisJCS8qIE1ha2Ugc3VyZSB0aGUgdmFsdWUgaGFzIG5vdCBjaGFuZ2VkIGluIGJldHdlZW4gcmVhZGluZyB0aGUKKwkJICogbG93ZXIgYW5kIHRoZSB1cHBlciBwYXJ0ICovCisJCXVwcGVyID0gcGRhdGEtPnJlYWQoZGV2LCByZWcgKyAxKTsKKwkJZG8geworCQkJdGVtcCA9IHVwcGVyOworCQkJaWYgKHVwcGVyIDwgMCkKKwkJCQlyZXR1cm4gdXBwZXI7CisKKwkJCWxvd2VyID0gcGRhdGEtPnJlYWQoZGV2LCByZWcpOworCQkJaWYgKGxvd2VyIDwgMCkKKwkJCQlyZXR1cm4gbG93ZXI7CisKKwkJCXVwcGVyID0gcGRhdGEtPnJlYWQoZGV2LCByZWcgKyAxKTsKKwkJfSB3aGlsZSAodGVtcCAhPSB1cHBlciAmJiAtLXRpbWVvdXQpOworCisJCWlmICh0aW1lb3V0ID09IDApCisJCQlyZXR1cm4gLUVJTzsKKworCQlyZXR1cm4gKHVwcGVyIDw8IDgpIHwgbG93ZXI7CisJfQorCisJcmV0dXJuIHBkYXRhLT5yZWFkKGRldiwgcmVnKTsKK30KKworc3RhdGljIGludCBicTI3eHh4X2JhdHRlcnlfcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYnEyN3h4eF9kZXZpY2VfaW5mbyAqZGk7CisJc3RydWN0IGJxMjd4eHhfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWlmICghcGRhdGEpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gcGxhdGZvcm1fZGF0YSBzdXBwbGllZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghcGRhdGEtPnJlYWQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gaGRxIHJlYWQgY2FsbGJhY2sgc3VwcGxpZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXBkYXRhLT5jaGlwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIGRldmljZSBzdXBwbGllZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRpID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZGkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRpKTsKKworCWRpLT5kZXYgPSAmcGRldi0+ZGV2OworCWRpLT5jaGlwID0gcGRhdGEtPmNoaXA7CisJZGktPm5hbWUgPSBwZGF0YS0+bmFtZSA/OiBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKKwlkaS0+YnVzLnJlYWQgPSBicTI3eHh4X2JhdHRlcnlfcGxhdGZvcm1fcmVhZDsKKworCXJldHVybiBicTI3eHh4X2JhdHRlcnlfc2V0dXAoZGkpOworfQorCitzdGF0aWMgaW50IGJxMjd4eHhfYmF0dGVyeV9wbGF0Zm9ybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYnEyN3h4eF9kZXZpY2VfaW5mbyAqZGkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWJxMjd4eHhfYmF0dGVyeV90ZWFyZG93bihkaSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgYnEyN3h4eF9iYXR0ZXJ5X3BsYXRmb3JtX2lkX3RhYmxlW10gPSB7CisJeyAiYnEyNzAwMC1iYXR0ZXJ5IiwgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBicTI3eHh4X2JhdHRlcnlfcGxhdGZvcm1faWRfdGFibGUpOworCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBicTI3eHh4X2JhdHRlcnlfcGxhdGZvcm1fb2ZfbWF0Y2hfdGFibGVbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInRpLGJxMjcwMDAiIH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYnEyN3h4eF9iYXR0ZXJ5X3BsYXRmb3JtX29mX21hdGNoX3RhYmxlKTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBicTI3eHh4X2JhdHRlcnlfcGxhdGZvcm1fZHJpdmVyID0geworCS5wcm9iZQk9IGJxMjd4eHhfYmF0dGVyeV9wbGF0Zm9ybV9wcm9iZSwKKwkucmVtb3ZlID0gYnEyN3h4eF9iYXR0ZXJ5X3BsYXRmb3JtX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJicTI3MDAwLWJhdHRlcnkiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoYnEyN3h4eF9iYXR0ZXJ5X3BsYXRmb3JtX29mX21hdGNoX3RhYmxlKSwKKwl9LAorCS5pZF90YWJsZSA9IGJxMjd4eHhfYmF0dGVyeV9wbGF0Zm9ybV9pZF90YWJsZSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGJxMjd4eHhfYmF0dGVyeV9wbGF0Zm9ybV9kcml2ZXIpOworCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmJxMjcwMDAtYmF0dGVyeSIpOworCitNT0RVTEVfQVVUSE9SKCJSb2RvbGZvIEdpb21ldHRpIDxnaW9tZXR0aUBsaW51eC5pdD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQlEyN3h4eCBiYXR0ZXJ5IG1vbml0b3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2JxMjd4eHhfYmF0dGVyeV9pMmMuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L2JxMjd4eHhfYmF0dGVyeV9pMmMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci9icTI3eHh4X2JhdHRlcnlfaTJjLmMKcmVuYW1lIHRvIGRyaXZlcnMvcG93ZXIvc3VwcGx5L2JxMjd4eHhfYmF0dGVyeV9pMmMuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9jaGFyZ2VyLW1hbmFnZXIuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L2NoYXJnZXItbWFuYWdlci5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3Bvd2VyL2NoYXJnZXItbWFuYWdlci5jCnJlbmFtZSB0byBkcml2ZXJzL3Bvd2VyL3N1cHBseS9jaGFyZ2VyLW1hbmFnZXIuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9jb2xsaWVfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvY29sbGllX2JhdHRlcnkuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci9jb2xsaWVfYmF0dGVyeS5jCnJlbmFtZSB0byBkcml2ZXJzL3Bvd2VyL3N1cHBseS9jb2xsaWVfYmF0dGVyeS5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2RhOTAzMF9iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9kYTkwMzBfYmF0dGVyeS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3Bvd2VyL2RhOTAzMF9iYXR0ZXJ5LmMKcmVuYW1lIHRvIGRyaXZlcnMvcG93ZXIvc3VwcGx5L2RhOTAzMF9iYXR0ZXJ5LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvZGE5MDUyLWJhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L2RhOTA1Mi1iYXR0ZXJ5LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvZGE5MDUyLWJhdHRlcnkuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvZGE5MDUyLWJhdHRlcnkuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9kYTkxNTAtY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvZGE5MTUwLWNoYXJnZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci9kYTkxNTAtY2hhcmdlci5jCnJlbmFtZSB0byBkcml2ZXJzL3Bvd2VyL3N1cHBseS9kYTkxNTAtY2hhcmdlci5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2RhOTE1MC1mZy5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvZGE5MTUwLWZnLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvZGE5MTUwLWZnLmMKcmVuYW1lIHRvIGRyaXZlcnMvcG93ZXIvc3VwcGx5L2RhOTE1MC1mZy5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9kczI3NjBfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvZHMyNzYwX2JhdHRlcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzIyNTY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvZHMyNzYwX2JhdHRlcnkuYwpAQCAtMCwwICsxLDY0OCBAQAorLyoKKyAqIERyaXZlciBmb3IgYmF0dGVyaWVzIHdpdGggRFMyNzYwIGNoaXBzIGluc2lkZS4KKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAwNyBBbnRvbiBWb3JvbnRzb3YKKyAqCSAgICAgICAyMDA0LTIwMDcgTWF0dCBSZWltZXIKKyAqCSAgICAgICAyMDA0IFN6YWJvbGNzIEd5dXJrbworICoKKyAqIFVzZSBjb25zaXN0ZW50IHdpdGggdGhlIEdOVSBHUEwgaXMgcGVybWl0dGVkLAorICogcHJvdmlkZWQgdGhhdCB0aGlzIGNvcHlyaWdodCBub3RpY2UgaXMKKyAqIHByZXNlcnZlZCBpbiBpdHMgZW50aXJldHkgaW4gYWxsIGNvcGllcyBhbmQgZGVyaXZlZCB3b3Jrcy4KKyAqCisgKiBBdXRob3I6ICBBbnRvbiBWb3JvbnRzb3YgPGNib3VAbWFpbC5ydT4KKyAqCSAgICBGZWJydWFyeSAyMDA3CisgKgorICoJICAgIE1hdHQgUmVpbWVyIDxtcmVpbWVyQHZwb3AubmV0PgorICoJICAgIEFwcmlsIDIwMDQsIDIwMDUsIDIwMDcKKyAqCisgKgkgICAgU3phYm9sY3MgR3l1cmtvIDxzemFib2xjcy5neXVya29AdGx0Lmh1PgorICoJICAgIFNlcHRlbWJlciAyMDA0CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgorCisjaW5jbHVkZSAiLi4vLi4vdzEvdzEuaCIKKyNpbmNsdWRlICIuLi8uLi93MS9zbGF2ZXMvdzFfZHMyNzYwLmgiCisKK3N0cnVjdCBkczI3NjBfZGV2aWNlX2luZm8geworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCS8qIERTMjc2MCBkYXRhLCB2YWxpZCBhZnRlciBjYWxsaW5nIGRzMjc2MF9iYXR0ZXJ5X3JlYWRfc3RhdHVzKCkgKi8KKwl1bnNpZ25lZCBsb25nIHVwZGF0ZV90aW1lOwkvKiBqaWZmaWVzIHdoZW4gZGF0YSByZWFkICovCisJY2hhciByYXdbRFMyNzYwX0RBVEFfU0laRV07CS8qIHJhdyBEUzI3NjAgZGF0YSAqLworCWludCB2b2x0YWdlX3JhdzsJCS8qIHVuaXRzIG9mIDQuODggbVYgKi8KKwlpbnQgdm9sdGFnZV91VjsJCQkvKiB1bml0cyBvZiDCtVYgKi8KKwlpbnQgY3VycmVudF9yYXc7CQkvKiB1bml0cyBvZiAwLjYyNSBtQSAqLworCWludCBjdXJyZW50X3VBOwkJCS8qIHVuaXRzIG9mIMK1QSAqLworCWludCBhY2N1bV9jdXJyZW50X3JhdzsJCS8qIHVuaXRzIG9mIDAuMjUgbUFoICovCisJaW50IGFjY3VtX2N1cnJlbnRfdUFoOwkJLyogdW5pdHMgb2YgwrVBaCAqLworCWludCB0ZW1wX3JhdzsJCQkvKiB1bml0cyBvZiAwLjEyNSDCsEMgKi8KKwlpbnQgdGVtcF9DOwkJCS8qIHVuaXRzIG9mIDAuMSDCsEMgKi8KKwlpbnQgcmF0ZWRfY2FwYWNpdHk7CQkvKiB1bml0cyBvZiDCtUFoICovCisJaW50IHJlbV9jYXBhY2l0eTsJCS8qIHBlcmNlbnRhZ2UgKi8KKwlpbnQgZnVsbF9hY3RpdmVfdUFoOwkJLyogdW5pdHMgb2YgwrVBaCAqLworCWludCBlbXB0eV91QWg7CQkJLyogdW5pdHMgb2YgwrVBaCAqLworCWludCBsaWZlX3NlYzsJCQkvKiB1bml0cyBvZiBzZWNvbmRzICovCisJaW50IGNoYXJnZV9zdGF0dXM7CQkvKiBQT1dFUl9TVVBQTFlfU1RBVFVTXyogKi8KKworCWludCBmdWxsX2NvdW50ZXI7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0OworCXN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBiYXRfZGVzYzsKKwlzdHJ1Y3QgZGV2aWNlICp3MV9kZXY7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKm1vbml0b3Jfd3F1ZXVlOworCXN0cnVjdCBkZWxheWVkX3dvcmsgbW9uaXRvcl93b3JrOworCXN0cnVjdCBkZWxheWVkX3dvcmsgc2V0X2NoYXJnZWRfd29yazsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2FjaGVfdGltZSA9IDEwMDA7Cittb2R1bGVfcGFyYW0oY2FjaGVfdGltZSwgdWludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNhY2hlX3RpbWUsICJjYWNoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyIpOworCitzdGF0aWMgYm9vbCBwbW9kX2VuYWJsZWQ7Cittb2R1bGVfcGFyYW0ocG1vZF9lbmFibGVkLCBib29sLCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocG1vZF9lbmFibGVkLCAiUE1PRCBlbmFibGUgYml0Iik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmF0ZWRfY2FwYWNpdHk7Cittb2R1bGVfcGFyYW0ocmF0ZWRfY2FwYWNpdHksIHVpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhyYXRlZF9jYXBhY2l0eSwgInJhdGVkIGJhdHRlcnkgY2FwYWNpdHksIDEwKm1BaCBvciBpbmRleCIpOworCitzdGF0aWMgdW5zaWduZWQgaW50IGN1cnJlbnRfYWNjdW07Cittb2R1bGVfcGFyYW0oY3VycmVudF9hY2N1bSwgdWludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGN1cnJlbnRfYWNjdW0sICJjdXJyZW50IGFjY3VtdWxhdG9yIHZhbHVlIik7CisKKy8qIFNvbWUgYmF0dGVyaWVzIGhhdmUgdGhlaXIgcmF0ZWQgY2FwYWNpdHkgc3RvcmVkIGEgTiAqIDEwIG1BaCwgd2hpbGUKKyAqIG90aGVycyB1c2UgYW4gaW5kZXggaW50byB0aGlzIHRhYmxlLiAqLworc3RhdGljIGludCByYXRlZF9jYXBhY2l0aWVzW10gPSB7CisJMCwKKwk5MjAsCS8qIFNhbXN1bmcgKi8KKwk5MjAsCS8qIEJZRCAqLworCTkyMCwJLyogTGlzaGVuICovCisJOTIwLAkvKiBORUMgKi8KKwkxNDQwLAkvKiBTYW1zdW5nICovCisJMTQ0MCwJLyogQllEICovCisjaWZkZWYgQ09ORklHX01BQ0hfSDQ3MDAKKwkxODAwLAkvKiBIUCBpUEFRIGh4NDcwMCAzLjdWIDE4MDBtQWggKDM1OTExMy0wMDEpICovCisjZWxzZQorCTE0NDAsCS8qIExpc2hlbiAqLworI2VuZGlmCisJMTQ0MCwJLyogTkVDICovCisJMjg4MCwJLyogU2Ftc3VuZyAqLworCTI4ODAsCS8qIEJZRCAqLworCTI4ODAsCS8qIExpc2hlbiAqLworCTI4ODAsCS8qIE5FQyAqLworI2lmZGVmIENPTkZJR19NQUNIX0g0NzAwCisJMCwKKwkzNjAwLAkvKiBIUCBpUEFRIGh4NDcwMCAzLjdWIDM2MDBtQWggKDM1OTExNC0wMDEpICovCisjZW5kaWYKK307CisKKy8qIGFycmF5IGlzIGxldmVsIGF0IHRlbXBzIDDCsEMsIDEwwrBDLCAyMMKwQywgMzDCsEMsIDQwwrBDCisgKiB0ZW1wIGlzIGluIENlbHNpdXMgKi8KK3N0YXRpYyBpbnQgYmF0dGVyeV9pbnRlcnBvbGF0ZShpbnQgYXJyYXlbXSwgaW50IHRlbXApCit7CisJaW50IGluZGV4LCBkdDsKKworCWlmICh0ZW1wIDw9IDApCisJCXJldHVybiBhcnJheVswXTsKKwlpZiAodGVtcCA+PSA0MCkKKwkJcmV0dXJuIGFycmF5WzRdOworCisJaW5kZXggPSB0ZW1wIC8gMTA7CisJZHQgICAgPSB0ZW1wICUgMTA7CisKKwlyZXR1cm4gYXJyYXlbaW5kZXhdICsgKCgoYXJyYXlbaW5kZXggKyAxXSAtIGFycmF5W2luZGV4XSkgKiBkdCkgLyAxMCk7Cit9CisKK3N0YXRpYyBpbnQgZHMyNzYwX2JhdHRlcnlfcmVhZF9zdGF0dXMoc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbyAqZGkpCit7CisJaW50IHJldCwgaSwgc3RhcnQsIGNvdW50LCBzY2FsZVs1XTsKKworCWlmIChkaS0+dXBkYXRlX3RpbWUgJiYgdGltZV9iZWZvcmUoamlmZmllcywgZGktPnVwZGF0ZV90aW1lICsKKwkJCQkJICAgbXNlY3NfdG9famlmZmllcyhjYWNoZV90aW1lKSkpCisJCXJldHVybiAwOworCisJLyogVGhlIGZpcnN0IHRpbWUgd2UgcmVhZCB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIFNSQU0vRUVQUk9NLAorCSAqIGJ1dCBhZnRlciB0aGF0IHdlIGp1c3QgcmVhZCB0aGUgaW50ZXJlc3RpbmcgYml0cyB0aGF0IGNoYW5nZS4gKi8KKwlpZiAoZGktPnVwZGF0ZV90aW1lID09IDApIHsKKwkJc3RhcnQgPSAwOworCQljb3VudCA9IERTMjc2MF9EQVRBX1NJWkU7CisJfSBlbHNlIHsKKwkJc3RhcnQgPSBEUzI3NjBfVk9MVEFHRV9NU0I7CisJCWNvdW50ID0gRFMyNzYwX1RFTVBfTFNCIC0gc3RhcnQgKyAxOworCX0KKworCXJldCA9IHcxX2RzMjc2MF9yZWFkKGRpLT53MV9kZXYsIGRpLT5yYXcgKyBzdGFydCwgc3RhcnQsIGNvdW50KTsKKwlpZiAocmV0ICE9IGNvdW50KSB7CisJCWRldl93YXJuKGRpLT5kZXYsICJjYWxsIHRvIHcxX2RzMjc2MF9yZWFkIGZhaWxlZCAoMHglcClcbiIsCisJCQkgZGktPncxX2Rldik7CisJCXJldHVybiAxOworCX0KKworCWRpLT51cGRhdGVfdGltZSA9IGppZmZpZXM7CisKKwkvKiBEUzI3NjAgcmVwb3J0cyB2b2x0YWdlIGluIHVuaXRzIG9mIDQuODhtViwgYnV0IHRoZSBiYXR0ZXJ5IGNsYXNzCisJICogcmVwb3J0cyBpbiB1bml0cyBvZiB1Viwgc28gY29udmVydCBieSBtdWx0aXBseWluZyBieSA0ODgwLiAqLworCWRpLT52b2x0YWdlX3JhdyA9IChkaS0+cmF3W0RTMjc2MF9WT0xUQUdFX01TQl0gPDwgMykgfAorCQkJICAoZGktPnJhd1tEUzI3NjBfVk9MVEFHRV9MU0JdID4+IDUpOworCWRpLT52b2x0YWdlX3VWID0gZGktPnZvbHRhZ2VfcmF3ICogNDg4MDsKKworCS8qIERTMjc2MCByZXBvcnRzIGN1cnJlbnQgaW4gc2lnbmVkIHVuaXRzIG9mIDAuNjI1bUEsIGJ1dCB0aGUgYmF0dGVyeQorCSAqIGNsYXNzIHJlcG9ydHMgaW4gdW5pdHMgb2YgwrVBLCBzbyBjb252ZXJ0IGJ5IG11bHRpcGx5aW5nIGJ5IDYyNS4gKi8KKwlkaS0+Y3VycmVudF9yYXcgPQorCSAgICAoKChzaWduZWQgY2hhcilkaS0+cmF3W0RTMjc2MF9DVVJSRU5UX01TQl0pIDw8IDUpIHwKKwkJCSAgKGRpLT5yYXdbRFMyNzYwX0NVUlJFTlRfTFNCXSA+PiAzKTsKKwlkaS0+Y3VycmVudF91QSA9IGRpLT5jdXJyZW50X3JhdyAqIDYyNTsKKworCS8qIERTMjc2MCByZXBvcnRzIGFjY3VtdWxhdGVkIGN1cnJlbnQgaW4gc2lnbmVkIHVuaXRzIG9mIDAuMjVtQWguICovCisJZGktPmFjY3VtX2N1cnJlbnRfcmF3ID0KKwkgICAgKCgoc2lnbmVkIGNoYXIpZGktPnJhd1tEUzI3NjBfQ1VSUkVOVF9BQ0NVTV9NU0JdKSA8PCA4KSB8CisJCQkgICBkaS0+cmF3W0RTMjc2MF9DVVJSRU5UX0FDQ1VNX0xTQl07CisJZGktPmFjY3VtX2N1cnJlbnRfdUFoID0gZGktPmFjY3VtX2N1cnJlbnRfcmF3ICogMjUwOworCisJLyogRFMyNzYwIHJlcG9ydHMgdGVtcGVyYXR1cmUgaW4gc2lnbmVkIHVuaXRzIG9mIDAuMTI1wrBDLCBidXQgdGhlCisJICogYmF0dGVyeSBjbGFzcyByZXBvcnRzIGluIHVuaXRzIG9mIDEvMTAgwrBDLCBzbyB3ZSBjb252ZXJ0IGJ5CisJICogbXVsdGlwbHlpbmcgYnkgLjEyNSAqIDEwID0gMS4yNS4gKi8KKwlkaS0+dGVtcF9yYXcgPSAoKChzaWduZWQgY2hhcilkaS0+cmF3W0RTMjc2MF9URU1QX01TQl0pIDw8IDMpIHwKKwkJCQkgICAgIChkaS0+cmF3W0RTMjc2MF9URU1QX0xTQl0gPj4gNSk7CisJZGktPnRlbXBfQyA9IGRpLT50ZW1wX3JhdyArIChkaS0+dGVtcF9yYXcgLyA0KTsKKworCS8qIEF0IGxlYXN0IHNvbWUgYmF0dGVyeSBtb25pdG9ycyAoZS5nLiBIUCBpUEFRKSBzdG9yZSB0aGUgYmF0dGVyeSdzCisJICogbWF4aW11bSByYXRlZCBjYXBhY2l0eS4gKi8KKwlpZiAoZGktPnJhd1tEUzI3NjBfUkFURURfQ0FQQUNJVFldIDwgQVJSQVlfU0laRShyYXRlZF9jYXBhY2l0aWVzKSkKKwkJZGktPnJhdGVkX2NhcGFjaXR5ID0gcmF0ZWRfY2FwYWNpdGllc1sKKwkJCSh1bnNpZ25lZCBpbnQpZGktPnJhd1tEUzI3NjBfUkFURURfQ0FQQUNJVFldXTsKKwllbHNlCisJCWRpLT5yYXRlZF9jYXBhY2l0eSA9IGRpLT5yYXdbRFMyNzYwX1JBVEVEX0NBUEFDSVRZXSAqIDEwOworCisJZGktPnJhdGVkX2NhcGFjaXR5ICo9IDEwMDA7IC8qIGNvbnZlcnQgdG8gwrVBaCAqLworCisJLyogQ2FsY3VsYXRlIHRoZSBmdWxsIGxldmVsIGF0IHRoZSBwcmVzZW50IHRlbXBlcmF0dXJlLiAqLworCWRpLT5mdWxsX2FjdGl2ZV91QWggPSBkaS0+cmF3W0RTMjc2MF9BQ1RJVkVfRlVMTF0gPDwgOCB8CisJCQkgICAgICBkaS0+cmF3W0RTMjc2MF9BQ1RJVkVfRlVMTCArIDFdOworCisJLyogSWYgdGhlIGZ1bGxfYWN0aXZlX3VBaCB2YWx1ZSBpcyBub3QgZ2l2ZW4sIGZhbGwgYmFjayB0byB0aGUgcmF0ZWQKKwkgKiBjYXBhY2l0eS4gVGhpcyBpcyBsaWtlbHkgdG8gaGFwcGVuIHdoZW4gY2hpcHMgYXJlIG5vdCBwYXJ0IG9mIHRoZQorCSAqIGJhdHRlcnkgcGFjayBhbmQgaXMgdGhlcmVmb3JlIG5vdCBib290c3RyYXBwZWQuICovCisJaWYgKGRpLT5mdWxsX2FjdGl2ZV91QWggPT0gMCkKKwkJZGktPmZ1bGxfYWN0aXZlX3VBaCA9IGRpLT5yYXRlZF9jYXBhY2l0eSAvIDEwMDBMOworCisJc2NhbGVbMF0gPSBkaS0+ZnVsbF9hY3RpdmVfdUFoOworCWZvciAoaSA9IDE7IGkgPCA1OyBpKyspCisJCXNjYWxlW2ldID0gc2NhbGVbaSAtIDFdICsgZGktPnJhd1tEUzI3NjBfQUNUSVZFX0ZVTEwgKyAxICsgaV07CisKKwlkaS0+ZnVsbF9hY3RpdmVfdUFoID0gYmF0dGVyeV9pbnRlcnBvbGF0ZShzY2FsZSwgZGktPnRlbXBfQyAvIDEwKTsKKwlkaS0+ZnVsbF9hY3RpdmVfdUFoICo9IDEwMDA7IC8qIGNvbnZlcnQgdG8gwrVBaCAqLworCisJLyogQ2FsY3VsYXRlIHRoZSBlbXB0eSBsZXZlbCBhdCB0aGUgcHJlc2VudCB0ZW1wZXJhdHVyZS4gKi8KKwlzY2FsZVs0XSA9IGRpLT5yYXdbRFMyNzYwX0FDVElWRV9FTVBUWSArIDRdOworCWZvciAoaSA9IDM7IGkgPj0gMDsgaS0tKQorCQlzY2FsZVtpXSA9IHNjYWxlW2kgKyAxXSArIGRpLT5yYXdbRFMyNzYwX0FDVElWRV9FTVBUWSArIGldOworCisJZGktPmVtcHR5X3VBaCA9IGJhdHRlcnlfaW50ZXJwb2xhdGUoc2NhbGUsIGRpLT50ZW1wX0MgLyAxMCk7CisJZGktPmVtcHR5X3VBaCAqPSAxMDAwOyAvKiBjb252ZXJ0IHRvIMK1QWggKi8KKworCWlmIChkaS0+ZnVsbF9hY3RpdmVfdUFoID09IGRpLT5lbXB0eV91QWgpCisJCWRpLT5yZW1fY2FwYWNpdHkgPSAwOworCWVsc2UKKwkJLyogRnJvbSBNYXhpbSBBcHBsaWNhdGlvbiBOb3RlIDEzMTogcmVtYWluaW5nIGNhcGFjaXR5ID0KKwkJICogKChJQ0EgLSBFbXB0eSBWYWx1ZSkgLyAoRnVsbCBWYWx1ZSAtIEVtcHR5IFZhbHVlKSkgeCAxMDAlICovCisJCWRpLT5yZW1fY2FwYWNpdHkgPSAoKGRpLT5hY2N1bV9jdXJyZW50X3VBaCAtIGRpLT5lbXB0eV91QWgpICogMTAwTCkgLworCQkJCSAgICAoZGktPmZ1bGxfYWN0aXZlX3VBaCAtIGRpLT5lbXB0eV91QWgpOworCisJaWYgKGRpLT5yZW1fY2FwYWNpdHkgPCAwKQorCQlkaS0+cmVtX2NhcGFjaXR5ID0gMDsKKwlpZiAoZGktPnJlbV9jYXBhY2l0eSA+IDEwMCkKKwkJZGktPnJlbV9jYXBhY2l0eSA9IDEwMDsKKworCWlmIChkaS0+Y3VycmVudF91QSA8IC0xMDBMKQorCQlkaS0+bGlmZV9zZWMgPSAtKChkaS0+YWNjdW1fY3VycmVudF91QWggLSBkaS0+ZW1wdHlfdUFoKSAqIDM2TCkKKwkJCQkJLyAoZGktPmN1cnJlbnRfdUEgLyAxMDBMKTsKKwllbHNlCisJCWRpLT5saWZlX3NlYyA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHMyNzYwX2JhdHRlcnlfc2V0X2N1cnJlbnRfYWNjdW0oc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbyAqZGksCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGFjcl92YWwpCit7CisJdW5zaWduZWQgY2hhciBhY3JbMl07CisKKwkvKiBhY3IgaXMgaW4gdW5pdHMgb2YgMC4yNSBtQWggKi8KKwlhY3JfdmFsICo9IDRMOworCWFjcl92YWwgLz0gMTAwMDsKKworCWFjclswXSA9IGFjcl92YWwgPj4gODsKKwlhY3JbMV0gPSBhY3JfdmFsICYgMHhmZjsKKworCWlmICh3MV9kczI3NjBfd3JpdGUoZGktPncxX2RldiwgYWNyLCBEUzI3NjBfQ1VSUkVOVF9BQ0NVTV9NU0IsIDIpIDwgMikKKwkJZGV2X3dhcm4oZGktPmRldiwgIkFDUiB3cml0ZSBmYWlsZWRcbiIpOworfQorCitzdGF0aWMgdm9pZCBkczI3NjBfYmF0dGVyeV91cGRhdGVfc3RhdHVzKHN0cnVjdCBkczI3NjBfZGV2aWNlX2luZm8gKmRpKQoreworCWludCBvbGRfY2hhcmdlX3N0YXR1cyA9IGRpLT5jaGFyZ2Vfc3RhdHVzOworCisJZHMyNzYwX2JhdHRlcnlfcmVhZF9zdGF0dXMoZGkpOworCisJaWYgKGRpLT5jaGFyZ2Vfc3RhdHVzID09IFBPV0VSX1NVUFBMWV9TVEFUVVNfVU5LTk9XTikKKwkJZGktPmZ1bGxfY291bnRlciA9IDA7CisKKwlpZiAocG93ZXJfc3VwcGx5X2FtX2lfc3VwcGxpZWQoZGktPmJhdCkpIHsKKwkJaWYgKGRpLT5jdXJyZW50X3VBID4gMTAwMDApIHsKKwkJCWRpLT5jaGFyZ2Vfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKKwkJCWRpLT5mdWxsX2NvdW50ZXIgPSAwOworCQl9IGVsc2UgaWYgKGRpLT5jdXJyZW50X3VBIDwgLTUwMDApIHsKKwkJCWlmIChkaS0+Y2hhcmdlX3N0YXR1cyAhPSBQT1dFUl9TVVBQTFlfU1RBVFVTX05PVF9DSEFSR0lORykKKwkJCQlkZXZfbm90aWNlKGRpLT5kZXYsICJub3QgZW5vdWdoIHBvd2VyIHRvICIKKwkJCQkJICAgImNoYXJnZVxuIik7CisJCQlkaS0+Y2hhcmdlX3N0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfTk9UX0NIQVJHSU5HOworCQkJZGktPmZ1bGxfY291bnRlciA9IDA7CisJCX0gZWxzZSBpZiAoZGktPmN1cnJlbnRfdUEgPCAxMDAwMCAmJgorCQkJICAgIGRpLT5jaGFyZ2Vfc3RhdHVzICE9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTCkgeworCisJCQkvKiBEb24ndCBjb25zaWRlciB0aGUgYmF0dGVyeSB0byBiZSBmdWxsIHVubGVzcworCQkJICogd2UndmUgc2VlbiB0aGUgY3VycmVudCA8IDEwIG1BIGF0IGxlYXN0IHR3bworCQkJICogY29uc2VjdXRpdmUgdGltZXMuICovCisKKwkJCWRpLT5mdWxsX2NvdW50ZXIrKzsKKworCQkJaWYgKGRpLT5mdWxsX2NvdW50ZXIgPCAyKSB7CisJCQkJZGktPmNoYXJnZV9zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOworCQkJfSBlbHNlIHsKKwkJCQlkaS0+Y2hhcmdlX3N0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTDsKKwkJCQlkczI3NjBfYmF0dGVyeV9zZXRfY3VycmVudF9hY2N1bShkaSwKKwkJCQkJCWRpLT5mdWxsX2FjdGl2ZV91QWgpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJZGktPmNoYXJnZV9zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOworCQlkaS0+ZnVsbF9jb3VudGVyID0gMDsKKwl9CisKKwlpZiAoZGktPmNoYXJnZV9zdGF0dXMgIT0gb2xkX2NoYXJnZV9zdGF0dXMpCisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5iYXQpOworfQorCitzdGF0aWMgdm9pZCBkczI3NjBfYmF0dGVyeV93cml0ZV9zdGF0dXMoc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbyAqZGksCisJCQkJCWNoYXIgc3RhdHVzKQoreworCWlmIChzdGF0dXMgPT0gZGktPnJhd1tEUzI3NjBfU1RBVFVTX1JFR10pCisJCXJldHVybjsKKworCXcxX2RzMjc2MF93cml0ZShkaS0+dzFfZGV2LCAmc3RhdHVzLCBEUzI3NjBfU1RBVFVTX1dSSVRFX1JFRywgMSk7CisJdzFfZHMyNzYwX3N0b3JlX2VlcHJvbShkaS0+dzFfZGV2LCBEUzI3NjBfRUVQUk9NX0JMT0NLMSk7CisJdzFfZHMyNzYwX3JlY2FsbF9lZXByb20oZGktPncxX2RldiwgRFMyNzYwX0VFUFJPTV9CTE9DSzEpOworfQorCitzdGF0aWMgdm9pZCBkczI3NjBfYmF0dGVyeV93cml0ZV9yYXRlZF9jYXBhY2l0eShzdHJ1Y3QgZHMyNzYwX2RldmljZV9pbmZvICpkaSwKKwkJCQkJCXVuc2lnbmVkIGNoYXIgcmF0ZWRfY2FwYWNpdHkpCit7CisJaWYgKHJhdGVkX2NhcGFjaXR5ID09IGRpLT5yYXdbRFMyNzYwX1JBVEVEX0NBUEFDSVRZXSkKKwkJcmV0dXJuOworCisJdzFfZHMyNzYwX3dyaXRlKGRpLT53MV9kZXYsICZyYXRlZF9jYXBhY2l0eSwgRFMyNzYwX1JBVEVEX0NBUEFDSVRZLCAxKTsKKwl3MV9kczI3NjBfc3RvcmVfZWVwcm9tKGRpLT53MV9kZXYsIERTMjc2MF9FRVBST01fQkxPQ0sxKTsKKwl3MV9kczI3NjBfcmVjYWxsX2VlcHJvbShkaS0+dzFfZGV2LCBEUzI3NjBfRUVQUk9NX0JMT0NLMSk7Cit9CisKK3N0YXRpYyB2b2lkIGRzMjc2MF9iYXR0ZXJ5X3dyaXRlX2FjdGl2ZV9mdWxsKHN0cnVjdCBkczI3NjBfZGV2aWNlX2luZm8gKmRpLAorCQkJCQkgICAgIGludCBhY3RpdmVfZnVsbCkKK3sKKwl1bnNpZ25lZCBjaGFyIHRtcFsyXSA9IHsKKwkJYWN0aXZlX2Z1bGwgPj4gOCwKKwkJYWN0aXZlX2Z1bGwgJiAweGZmCisJfTsKKworCWlmICh0bXBbMF0gPT0gZGktPnJhd1tEUzI3NjBfQUNUSVZFX0ZVTExdICYmCisJICAgIHRtcFsxXSA9PSBkaS0+cmF3W0RTMjc2MF9BQ1RJVkVfRlVMTCArIDFdKQorCQlyZXR1cm47CisKKwl3MV9kczI3NjBfd3JpdGUoZGktPncxX2RldiwgdG1wLCBEUzI3NjBfQUNUSVZFX0ZVTEwsIHNpemVvZih0bXApKTsKKwl3MV9kczI3NjBfc3RvcmVfZWVwcm9tKGRpLT53MV9kZXYsIERTMjc2MF9FRVBST01fQkxPQ0swKTsKKwl3MV9kczI3NjBfcmVjYWxsX2VlcHJvbShkaS0+dzFfZGV2LCBEUzI3NjBfRUVQUk9NX0JMT0NLMCk7CisKKwkvKiBXcml0ZSB0byB0aGUgZGktPnJhd1tdIGJ1ZmZlciBkaXJlY3RseSAtIHRoZSBEUzI3NjBfQUNUSVZFX0ZVTEwKKwkgKiB2YWx1ZXMgd29uJ3QgYmUgcmVhZCBiYWNrIGJ5IGRzMjc2MF9iYXR0ZXJ5X3JlYWRfc3RhdHVzKCkgKi8KKwlkaS0+cmF3W0RTMjc2MF9BQ1RJVkVfRlVMTF0gPSB0bXBbMF07CisJZGktPnJhd1tEUzI3NjBfQUNUSVZFX0ZVTEwgKyAxXSA9IHRtcFsxXTsKK30KKworc3RhdGljIHZvaWQgZHMyNzYwX2JhdHRlcnlfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbyAqZGkgPSBjb250YWluZXJfb2Yod29yaywKKwkJc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbywgbW9uaXRvcl93b3JrLndvcmspOworCWNvbnN0IGludCBpbnRlcnZhbCA9IEhaICogNjA7CisKKwlkZXZfZGJnKGRpLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCisJZHMyNzYwX2JhdHRlcnlfdXBkYXRlX3N0YXR1cyhkaSk7CisJcXVldWVfZGVsYXllZF93b3JrKGRpLT5tb25pdG9yX3dxdWV1ZSwgJmRpLT5tb25pdG9yX3dvcmssIGludGVydmFsKTsKK30KKworc3RhdGljIHZvaWQgZHMyNzYwX2JhdHRlcnlfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kpCit7CisJc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbyAqZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKKworCWRldl9kYmcoZGktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwltb2RfZGVsYXllZF93b3JrKGRpLT5tb25pdG9yX3dxdWV1ZSwgJmRpLT5tb25pdG9yX3dvcmssIEhaLzEwKTsKK30KKworCitzdGF0aWMgdm9pZCBkczI3NjBfYmF0dGVyeV9zZXRfY2hhcmdlZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwljaGFyIGJpYXM7CisJc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbyAqZGkgPSBjb250YWluZXJfb2Yod29yaywKKwkJc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbywgc2V0X2NoYXJnZWRfd29yay53b3JrKTsKKworCWRldl9kYmcoZGktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlkczI3NjBfYmF0dGVyeV9yZWFkX3N0YXR1cyhkaSk7CisKKwkvKiBXaGVuIHdlIGdldCBub3RpZmllZCBieSBleHRlcm5hbCBjaXJjdWl0cnkgdGhhdCB0aGUgYmF0dGVyeSBpcworCSAqIGNvbnNpZGVyZWQgZnVsbHkgY2hhcmdlZCBub3csIHdlIGtub3cgdGhhdCB0aGVyZSBpcyBubyBjdXJyZW50CisJICogZmxvdyBhbnkgbW9yZS4gSG93ZXZlciwgdGhlIGRzMjc2MCdzIGludGVybmFsIGN1cnJlbnQgbWV0ZXIgaXMKKwkgKiB0b28gaW5hY2N1cmF0ZSB0byByZWx5IG9uIC0gc3BlYyBzYXkgc29tZXRoaW5nIH4xNSUgZmFpbHVyZS4KKwkgKiBIZW5jZSwgd2UgdXNlIHRoZSBjdXJyZW50IG9mZnNldCBiaWFzIHJlZ2lzdGVyIHRvIGNvbXBlbnNhdGUKKwkgKiB0aGF0IGVycm9yLgorCSAqLworCisJaWYgKCFwb3dlcl9zdXBwbHlfYW1faV9zdXBwbGllZChkaS0+YmF0KSkKKwkJcmV0dXJuOworCisJYmlhcyA9IChzaWduZWQgY2hhcikgZGktPmN1cnJlbnRfcmF3ICsKKwkJKHNpZ25lZCBjaGFyKSBkaS0+cmF3W0RTMjc2MF9DVVJSRU5UX09GRlNFVF9CSUFTXTsKKworCWRldl9kYmcoZGktPmRldiwgIiVzOiBiaWFzID0gJWRcbiIsIF9fZnVuY19fLCBiaWFzKTsKKworCXcxX2RzMjc2MF93cml0ZShkaS0+dzFfZGV2LCAmYmlhcywgRFMyNzYwX0NVUlJFTlRfT0ZGU0VUX0JJQVMsIDEpOworCXcxX2RzMjc2MF9zdG9yZV9lZXByb20oZGktPncxX2RldiwgRFMyNzYwX0VFUFJPTV9CTE9DSzEpOworCXcxX2RzMjc2MF9yZWNhbGxfZWVwcm9tKGRpLT53MV9kZXYsIERTMjc2MF9FRVBST01fQkxPQ0sxKTsKKworCS8qIFdyaXRlIHRvIHRoZSBkaS0+cmF3W10gYnVmZmVyIGRpcmVjdGx5IC0gdGhlIENVUlJFTlRfT0ZGU0VUX0JJQVMKKwkgKiB2YWx1ZSB3b24ndCBiZSByZWFkIGJhY2sgYnkgZHMyNzYwX2JhdHRlcnlfcmVhZF9zdGF0dXMoKSAqLworCWRpLT5yYXdbRFMyNzYwX0NVUlJFTlRfT0ZGU0VUX0JJQVNdID0gYmlhczsKK30KKworc3RhdGljIHZvaWQgZHMyNzYwX2JhdHRlcnlfc2V0X2NoYXJnZWQoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KQoreworCXN0cnVjdCBkczI3NjBfZGV2aWNlX2luZm8gKmRpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CisKKwkvKiBwb3N0cG9uZSB0aGUgYWN0dWFsIHdvcmsgYnkgMjAgc2Vjcy4gVGhpcyBpcyBmb3IgZGVib3VuY2luZyBHUElPCisJICogc2lnbmFscyBhbmQgdG8gbGV0IHRoZSBjdXJyZW50IHZhbHVlIHNldHRsZS4gU2VlIEFONDE4OC4gKi8KKwltb2RfZGVsYXllZF93b3JrKGRpLT5tb25pdG9yX3dxdWV1ZSwgJmRpLT5zZXRfY2hhcmdlZF93b3JrLCBIWiAqIDIwKTsKK30KKworc3RhdGljIGludCBkczI3NjBfYmF0dGVyeV9nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAorCQkJCSAgICAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCisJCQkJICAgICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbyAqZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKKworCXN3aXRjaCAocHNwKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6CisJCXZhbC0+aW50dmFsID0gZGktPmNoYXJnZV9zdGF0dXM7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWRzMjc2MF9iYXR0ZXJ5X3JlYWRfc3RhdHVzKGRpKTsKKworCXN3aXRjaCAocHNwKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKKwkJdmFsLT5pbnR2YWwgPSBkaS0+dm9sdGFnZV91VjsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVzoKKwkJdmFsLT5pbnR2YWwgPSBkaS0+Y3VycmVudF91QTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTF9ERVNJR046CisJCXZhbC0+aW50dmFsID0gZGktPnJhdGVkX2NhcGFjaXR5OworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMOgorCQl2YWwtPmludHZhbCA9IGRpLT5mdWxsX2FjdGl2ZV91QWg7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0VNUFRZOgorCQl2YWwtPmludHZhbCA9IGRpLT5lbXB0eV91QWg7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVzoKKwkJdmFsLT5pbnR2YWwgPSBkaS0+YWNjdW1fY3VycmVudF91QWg7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUDoKKwkJdmFsLT5pbnR2YWwgPSBkaS0+dGVtcF9DOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRU1QVFlfTk9XOgorCQl2YWwtPmludHZhbCA9IGRpLT5saWZlX3NlYzsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWToKKwkJdmFsLT5pbnR2YWwgPSBkaS0+cmVtX2NhcGFjaXR5OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkczI3NjBfYmF0dGVyeV9zZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAorCQkJCSAgICAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCisJCQkJICAgICAgIGNvbnN0IHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbyAqZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKKworCXN3aXRjaCAocHNwKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTDoKKwkJLyogdGhlIGludGVyZmFjZSBjb3VudHMgaW4gdUFoLCBjb252ZXJ0IHRoZSB2YWx1ZSAqLworCQlkczI3NjBfYmF0dGVyeV93cml0ZV9hY3RpdmVfZnVsbChkaSwgdmFsLT5pbnR2YWwgLyAxMDAwTCk7CisJCWJyZWFrOworCisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XOgorCQkvKiBkczI3NjBfYmF0dGVyeV9zZXRfY3VycmVudF9hY2N1bSgpIGRvZXMgdGhlIGNvbnZlcnNpb24gKi8KKwkJZHMyNzYwX2JhdHRlcnlfc2V0X2N1cnJlbnRfYWNjdW0oZGksIHZhbC0+aW50dmFsKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVQRVJNOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzMjc2MF9iYXR0ZXJ5X3Byb3BlcnR5X2lzX3dyaXRlYWJsZShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJCQkJCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3ApCit7CisJc3dpdGNoIChwc3ApIHsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVzoKKwkJcmV0dXJuIDE7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IGRzMjc2MF9iYXR0ZXJ5X3Byb3BzW10gPSB7CisJUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMX0RFU0lHTiwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRU1QVFksCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9URU1QLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRU1QVFlfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZLAorfTsKKworc3RhdGljIGludCBkczI3NjBfYmF0dGVyeV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKKwljaGFyIHN0YXR1czsKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3QgZHMyNzYwX2RldmljZV9pbmZvICpkaTsKKworCWRpID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZGkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRpKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZGlfYWxsb2NfZmFpbGVkOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRpKTsKKworCWRpLT5kZXYJCQkJPSAmcGRldi0+ZGV2OworCWRpLT53MV9kZXYJCQk9IHBkZXYtPmRldi5wYXJlbnQ7CisJZGktPmJhdF9kZXNjLm5hbWUJCT0gZGV2X25hbWUoJnBkZXYtPmRldik7CisJZGktPmJhdF9kZXNjLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKKwlkaS0+YmF0X2Rlc2MucHJvcGVydGllcwkJPSBkczI3NjBfYmF0dGVyeV9wcm9wczsKKwlkaS0+YmF0X2Rlc2MubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKGRzMjc2MF9iYXR0ZXJ5X3Byb3BzKTsKKwlkaS0+YmF0X2Rlc2MuZ2V0X3Byb3BlcnR5CT0gZHMyNzYwX2JhdHRlcnlfZ2V0X3Byb3BlcnR5OworCWRpLT5iYXRfZGVzYy5zZXRfcHJvcGVydHkJPSBkczI3NjBfYmF0dGVyeV9zZXRfcHJvcGVydHk7CisJZGktPmJhdF9kZXNjLnByb3BlcnR5X2lzX3dyaXRlYWJsZSA9CisJCQkJICBkczI3NjBfYmF0dGVyeV9wcm9wZXJ0eV9pc193cml0ZWFibGU7CisJZGktPmJhdF9kZXNjLnNldF9jaGFyZ2VkCT0gZHMyNzYwX2JhdHRlcnlfc2V0X2NoYXJnZWQ7CisJZGktPmJhdF9kZXNjLmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQgPQorCQkJCSAgZHMyNzYwX2JhdHRlcnlfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZDsKKworCXBzeV9jZmcuZHJ2X2RhdGEJCT0gZGk7CisKKwlkaS0+Y2hhcmdlX3N0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfVU5LTk9XTjsKKworCS8qIGVuYWJsZSBzbGVlcCBtb2RlIGZlYXR1cmUgKi8KKwlkczI3NjBfYmF0dGVyeV9yZWFkX3N0YXR1cyhkaSk7CisJc3RhdHVzID0gZGktPnJhd1tEUzI3NjBfU1RBVFVTX1JFR107CisJaWYgKHBtb2RfZW5hYmxlZCkKKwkJc3RhdHVzIHw9IERTMjc2MF9TVEFUVVNfUE1PRDsKKwllbHNlCisJCXN0YXR1cyAmPSB+RFMyNzYwX1NUQVRVU19QTU9EOworCisJZHMyNzYwX2JhdHRlcnlfd3JpdGVfc3RhdHVzKGRpLCBzdGF0dXMpOworCisJLyogc2V0IHJhdGVkIGNhcGFjaXR5IGZyb20gbW9kdWxlIHBhcmFtICovCisJaWYgKHJhdGVkX2NhcGFjaXR5KQorCQlkczI3NjBfYmF0dGVyeV93cml0ZV9yYXRlZF9jYXBhY2l0eShkaSwgcmF0ZWRfY2FwYWNpdHkpOworCisJLyogc2V0IGN1cnJlbnQgYWNjdW11bGF0b3IgaWYgZ2l2ZW4gYXMgcGFyYW1ldGVyLgorCSAqIHRoaXMgc2hvdWxkIG9ubHkgYmUgZG9uZSBmb3IgYm9vdHN0cmFwcGluZyB0aGUgdmFsdWUgKi8KKwlpZiAoY3VycmVudF9hY2N1bSkKKwkJZHMyNzYwX2JhdHRlcnlfc2V0X2N1cnJlbnRfYWNjdW0oZGksIGN1cnJlbnRfYWNjdW0pOworCisJZGktPmJhdCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmZGktPmJhdF9kZXNjLCAmcHN5X2NmZyk7CisJaWYgKElTX0VSUihkaS0+YmF0KSkgeworCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgYmF0dGVyeVxuIik7CisJCXJldHZhbCA9IFBUUl9FUlIoZGktPmJhdCk7CisJCWdvdG8gYmF0dF9mYWlsZWQ7CisJfQorCisJSU5JVF9ERUxBWUVEX1dPUksoJmRpLT5tb25pdG9yX3dvcmssIGRzMjc2MF9iYXR0ZXJ5X3dvcmspOworCUlOSVRfREVMQVlFRF9XT1JLKCZkaS0+c2V0X2NoYXJnZWRfd29yaywKKwkJCSAgZHMyNzYwX2JhdHRlcnlfc2V0X2NoYXJnZWRfd29yayk7CisJZGktPm1vbml0b3Jfd3F1ZXVlID0gYWxsb2Nfb3JkZXJlZF93b3JrcXVldWUoZGV2X25hbWUoJnBkZXYtPmRldiksCisJCQkJCQkgICAgIFdRX01FTV9SRUNMQUlNKTsKKwlpZiAoIWRpLT5tb25pdG9yX3dxdWV1ZSkgeworCQlyZXR2YWwgPSAtRVNSQ0g7CisJCWdvdG8gd29ya3F1ZXVlX2ZhaWxlZDsKKwl9CisJcXVldWVfZGVsYXllZF93b3JrKGRpLT5tb25pdG9yX3dxdWV1ZSwgJmRpLT5tb25pdG9yX3dvcmssIEhaICogMSk7CisKKwlnb3RvIHN1Y2Nlc3M7CisKK3dvcmtxdWV1ZV9mYWlsZWQ6CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoZGktPmJhdCk7CitiYXR0X2ZhaWxlZDoKK2RpX2FsbG9jX2ZhaWxlZDoKK3N1Y2Nlc3M6CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBkczI3NjBfYmF0dGVyeV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZHMyNzYwX2RldmljZV9pbmZvICpkaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZkaS0+bW9uaXRvcl93b3JrKTsKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmRpLT5zZXRfY2hhcmdlZF93b3JrKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShkaS0+bW9uaXRvcl93cXVldWUpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGRpLT5iYXQpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKworc3RhdGljIGludCBkczI3NjBfYmF0dGVyeV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJICBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbyAqZGkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWRpLT5jaGFyZ2Vfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHMyNzYwX2JhdHRlcnlfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbyAqZGkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWRpLT5jaGFyZ2Vfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOworCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5iYXQpOworCisJbW9kX2RlbGF5ZWRfd29yayhkaS0+bW9uaXRvcl93cXVldWUsICZkaS0+bW9uaXRvcl93b3JrLCBIWik7CisKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKworI2RlZmluZSBkczI3NjBfYmF0dGVyeV9zdXNwZW5kIE5VTEwKKyNkZWZpbmUgZHMyNzYwX2JhdHRlcnlfcmVzdW1lIE5VTEwKKworI2VuZGlmIC8qIENPTkZJR19QTSAqLworCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmRzMjc2MC1iYXR0ZXJ5Iik7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGRzMjc2MF9iYXR0ZXJ5X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJkczI3NjAtYmF0dGVyeSIsCisJfSwKKwkucHJvYmUJICA9IGRzMjc2MF9iYXR0ZXJ5X3Byb2JlLAorCS5yZW1vdmUgICA9IGRzMjc2MF9iYXR0ZXJ5X3JlbW92ZSwKKwkuc3VzcGVuZCAgPSBkczI3NjBfYmF0dGVyeV9zdXNwZW5kLAorCS5yZXN1bWUJICA9IGRzMjc2MF9iYXR0ZXJ5X3Jlc3VtZSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoZHMyNzYwX2JhdHRlcnlfZHJpdmVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiU3phYm9sY3MgR3l1cmtvIDxzemFib2xjcy5neXVya29AdGx0Lmh1PiwgIgorCSAgICAgICJNYXR0IFJlaW1lciA8bXJlaW1lckB2cG9wLm5ldD4sICIKKwkgICAgICAiQW50b24gVm9yb250c292IDxjYm91QG1haWwucnU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImRzMjc2MCBiYXR0ZXJ5IGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9zdXBwbHkvZHMyNzgwX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L2RzMjc4MF9iYXR0ZXJ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIzYjZmYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L2RzMjc4MF9iYXR0ZXJ5LmMKQEAgLTAsMCArMSw4MzggQEAKKy8qCisgKiAxLXdpcmUgY2xpZW50L2RyaXZlciBmb3IgdGhlIE1heGltL0RhbGxhcyBEUzI3ODAgU3RhbmQtQWxvbmUgRnVlbCBHYXVnZSBJQworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBJbmRlc2lnbiwgTExDCisgKgorICogQXV0aG9yOiBDbGlmdG9uIEJhcm5lcyA8Y2FiYXJuZXNAaW5kZXNpZ24tbGxjLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBkczI3NjBfYmF0dGVyeSBhbmQgZHMyNzgyX2JhdHRlcnkgZHJpdmVycworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorCisjaW5jbHVkZSAiLi4vLi4vdzEvdzEuaCIKKyNpbmNsdWRlICIuLi8uLi93MS9zbGF2ZXMvdzFfZHMyNzgwLmgiCisKKy8qIEN1cnJlbnQgdW5pdCBtZWFzdXJlbWVudCBpbiB1QSBmb3IgYSAxIG1pbGxpLW9obSBzZW5zZSByZXNpc3RvciAqLworI2RlZmluZSBEUzI3ODBfQ1VSUkVOVF9VTklUUwkxNTYzCisvKiBDaGFyZ2UgdW5pdCBtZWFzdXJlbWVudCBpbiB1QWggZm9yIGEgMSBtaWxsaS1vaG0gc2Vuc2UgcmVzaXN0b3IgKi8KKyNkZWZpbmUgRFMyNzgwX0NIQVJHRV9VTklUUwkJNjI1MAorLyogTnVtYmVyIG9mIGJ5dGVzIGluIHVzZXIgRUVQUk9NIHNwYWNlICovCisjZGVmaW5lIERTMjc4MF9VU0VSX0VFUFJPTV9TSVpFCQkoRFMyNzgwX0VFUFJPTV9CTE9DSzBfRU5EIC0gXAorCQkJCQlEUzI3ODBfRUVQUk9NX0JMT0NLMF9TVEFSVCArIDEpCisvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gcGFyYW1ldGVyIEVFUFJPTSBzcGFjZSAqLworI2RlZmluZSBEUzI3ODBfUEFSQU1fRUVQUk9NX1NJWkUJKERTMjc4MF9FRVBST01fQkxPQ0sxX0VORCAtIFwKKwkJCQkJRFMyNzgwX0VFUFJPTV9CTE9DSzFfU1RBUlQgKyAxKQorCitzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0OworCXN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBiYXRfZGVzYzsKKwlzdHJ1Y3QgZGV2aWNlICp3MV9kZXY7Cit9OworCitlbnVtIGN1cnJlbnRfdHlwZXMgeworCUNVUlJFTlRfTk9XLAorCUNVUlJFTlRfQVZHLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgbW9kZWxbXSA9ICJEUzI3ODAiOworc3RhdGljIGNvbnN0IGNoYXIgbWFudWZhY3R1cmVyW10gPSAiTWF4aW0vRGFsbGFzIjsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICoKK3RvX2RzMjc4MF9kZXZpY2VfaW5mbyhzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kpCit7CisJcmV0dXJuIHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwb3dlcl9zdXBwbHkgKnRvX3Bvd2VyX3N1cHBseShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldl9nZXRfZHJ2ZGF0YShkZXYpOworfQorCitzdGF0aWMgaW5saW5lIGludCBkczI3ODBfYmF0dGVyeV9pbyhzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbywKKwljaGFyICpidWYsIGludCBhZGRyLCBzaXplX3QgY291bnQsIGludCBpbykKK3sKKwlyZXR1cm4gdzFfZHMyNzgwX2lvKGRldl9pbmZvLT53MV9kZXYsIGJ1ZiwgYWRkciwgY291bnQsIGlvKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZHMyNzgwX3JlYWQ4KHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLCB1OCAqdmFsLAorCWludCBhZGRyKQoreworCXJldHVybiBkczI3ODBfYmF0dGVyeV9pbyhkZXZfaW5mbywgdmFsLCBhZGRyLCBzaXplb2YodTgpLCAwKTsKK30KKworc3RhdGljIGludCBkczI3ODBfcmVhZDE2KHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLCBzMTYgKnZhbCwKKwlpbnQgYWRkcikKK3sKKwlpbnQgcmV0OworCXU4IHJhd1syXTsKKworCXJldCA9IGRzMjc4MF9iYXR0ZXJ5X2lvKGRldl9pbmZvLCByYXcsIGFkZHIsIHNpemVvZihyYXcpLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCSp2YWwgPSAocmF3WzBdIDw8IDgpIHwgcmF3WzFdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRzMjc4MF9yZWFkX2Jsb2NrKHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLAorCXU4ICp2YWwsIGludCBhZGRyLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIGRzMjc4MF9iYXR0ZXJ5X2lvKGRldl9pbmZvLCB2YWwsIGFkZHIsIGNvdW50LCAwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZHMyNzgwX3dyaXRlKHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLCB1OCAqdmFsLAorCWludCBhZGRyLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIGRzMjc4MF9iYXR0ZXJ5X2lvKGRldl9pbmZvLCB2YWwsIGFkZHIsIGNvdW50LCAxKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZHMyNzgwX3N0b3JlX2VlcHJvbShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBhZGRyKQoreworCXJldHVybiB3MV9kczI3ODBfZWVwcm9tX2NtZChkZXYsIGFkZHIsIFcxX0RTMjc4MF9DT1BZX0RBVEEpOworfQorCitzdGF0aWMgaW5saW5lIGludCBkczI3ODBfcmVjYWxsX2VlcHJvbShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBhZGRyKQoreworCXJldHVybiB3MV9kczI3ODBfZWVwcm9tX2NtZChkZXYsIGFkZHIsIFcxX0RTMjc4MF9SRUNBTExfREFUQSk7Cit9CisKK3N0YXRpYyBpbnQgZHMyNzgwX3NhdmVfZWVwcm9tKHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLCBpbnQgcmVnKQoreworCWludCByZXQ7CisKKwlyZXQgPSBkczI3ODBfc3RvcmVfZWVwcm9tKGRldl9pbmZvLT53MV9kZXYsIHJlZyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBkczI3ODBfcmVjYWxsX2VlcHJvbShkZXZfaW5mby0+dzFfZGV2LCByZWcpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKKy8qIFNldCBzZW5zZSByZXNpc3RvciB2YWx1ZSBpbiBtaG9zICovCitzdGF0aWMgaW50IGRzMjc4MF9zZXRfc2Vuc2VfcmVnaXN0ZXIoc3RydWN0IGRzMjc4MF9kZXZpY2VfaW5mbyAqZGV2X2luZm8sCisJdTggY29uZHVjdGFuY2UpCit7CisJaW50IHJldDsKKworCXJldCA9IGRzMjc4MF93cml0ZShkZXZfaW5mbywgJmNvbmR1Y3RhbmNlLAorCQkJCURTMjc4MF9SU05TUF9SRUcsIHNpemVvZih1OCkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGRzMjc4MF9zYXZlX2VlcHJvbShkZXZfaW5mbywgRFMyNzgwX1JTTlNQX1JFRyk7Cit9CisKKy8qIEdldCBSU0dBSU4gdmFsdWUgZnJvbSAwIHRvIDEuOTk5IGluIHN0ZXBzIG9mIDAuMDAxICovCitzdGF0aWMgaW50IGRzMjc4MF9nZXRfcnNnYWluX3JlZ2lzdGVyKHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLAorCXUxNiAqcnNnYWluKQoreworCXJldHVybiBkczI3ODBfcmVhZDE2KGRldl9pbmZvLCByc2dhaW4sIERTMjc4MF9SU0dBSU5fTVNCX1JFRyk7Cit9CisKKy8qIFNldCBSU0dBSU4gdmFsdWUgZnJvbSAwIHRvIDEuOTk5IGluIHN0ZXBzIG9mIDAuMDAxICovCitzdGF0aWMgaW50IGRzMjc4MF9zZXRfcnNnYWluX3JlZ2lzdGVyKHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLAorCXUxNiByc2dhaW4pCit7CisJaW50IHJldDsKKwl1OCByYXdbXSA9IHtyc2dhaW4gPj4gOCwgcnNnYWluICYgMHhGRn07CisKKwlyZXQgPSBkczI3ODBfd3JpdGUoZGV2X2luZm8sIHJhdywKKwkJCQlEUzI3ODBfUlNHQUlOX01TQl9SRUcsIHNpemVvZihyYXcpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBkczI3ODBfc2F2ZV9lZXByb20oZGV2X2luZm8sIERTMjc4MF9SU0dBSU5fTVNCX1JFRyk7Cit9CisKK3N0YXRpYyBpbnQgZHMyNzgwX2dldF92b2x0YWdlKHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLAorCWludCAqdm9sdGFnZV91VikKK3sKKwlpbnQgcmV0OworCXMxNiB2b2x0YWdlX3JhdzsKKworCS8qCisJICogVGhlIHZvbHRhZ2UgdmFsdWUgaXMgbG9jYXRlZCBpbiAxMCBiaXRzIGFjcm9zcyB0aGUgdm9sdGFnZSBNU0IKKwkgKiBhbmQgTFNCIHJlZ2lzdGVycyBpbiB0d28ncyBjb21wbGltZW50IGZvcm0KKwkgKiBTaWduIGJpdCBvZiB0aGUgdm9sdGFnZSB2YWx1ZSBpcyBpbiBiaXQgNyBvZiB0aGUgdm9sdGFnZSBNU0IgcmVnaXN0ZXIKKwkgKiBCaXRzIDkgLSAzIG9mIHRoZSB2b2x0YWdlIHZhbHVlIGFyZSBpbiBiaXRzIDYgLSAwIG9mIHRoZQorCSAqIHZvbHRhZ2UgTVNCIHJlZ2lzdGVyCisJICogQml0cyAyIC0gMCBvZiB0aGUgdm9sdGFnZSB2YWx1ZSBhcmUgaW4gYml0cyA3IC0gNSBvZiB0aGUKKwkgKiB2b2x0YWdlIExTQiByZWdpc3RlcgorCSAqLworCXJldCA9IGRzMjc4MF9yZWFkMTYoZGV2X2luZm8sICZ2b2x0YWdlX3JhdywKKwkJCQlEUzI3ODBfVk9MVF9NU0JfUkVHKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogRFMyNzgwIHJlcG9ydHMgdm9sdGFnZSBpbiB1bml0cyBvZiA0Ljg4bVYsIGJ1dCB0aGUgYmF0dGVyeSBjbGFzcworCSAqIHJlcG9ydHMgaW4gdW5pdHMgb2YgdVYsIHNvIGNvbnZlcnQgYnkgbXVsdGlwbHlpbmcgYnkgNDg4MC4KKwkgKi8KKwkqdm9sdGFnZV91ViA9ICh2b2x0YWdlX3JhdyAvIDMyKSAqIDQ4ODA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHMyNzgwX2dldF90ZW1wZXJhdHVyZShzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbywKKwlpbnQgKnRlbXBlcmF0dXJlKQoreworCWludCByZXQ7CisJczE2IHRlbXBlcmF0dXJlX3JhdzsKKworCS8qCisJICogVGhlIHRlbXBlcmF0dXJlIHZhbHVlIGlzIGxvY2F0ZWQgaW4gMTAgYml0cyBhY3Jvc3MgdGhlIHRlbXBlcmF0dXJlCisJICogTVNCIGFuZCBMU0IgcmVnaXN0ZXJzIGluIHR3bydzIGNvbXBsaW1lbnQgZm9ybQorCSAqIFNpZ24gYml0IG9mIHRoZSB0ZW1wZXJhdHVyZSB2YWx1ZSBpcyBpbiBiaXQgNyBvZiB0aGUgdGVtcGVyYXR1cmUKKwkgKiBNU0IgcmVnaXN0ZXIKKwkgKiBCaXRzIDkgLSAzIG9mIHRoZSB0ZW1wZXJhdHVyZSB2YWx1ZSBhcmUgaW4gYml0cyA2IC0gMCBvZiB0aGUKKwkgKiB0ZW1wZXJhdHVyZSBNU0IgcmVnaXN0ZXIKKwkgKiBCaXRzIDIgLSAwIG9mIHRoZSB0ZW1wZXJhdHVyZSB2YWx1ZSBhcmUgaW4gYml0cyA3IC0gNSBvZiB0aGUKKwkgKiB0ZW1wZXJhdHVyZSBMU0IgcmVnaXN0ZXIKKwkgKi8KKwlyZXQgPSBkczI3ODBfcmVhZDE2KGRldl9pbmZvLCAmdGVtcGVyYXR1cmVfcmF3LAorCQkJCURTMjc4MF9URU1QX01TQl9SRUcpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBUZW1wZXJhdHVyZSBpcyBtZWFzdXJlZCBpbiB1bml0cyBvZiAwLjEyNSBkZWdyZWVzIGNlbGNpdXMsIHRoZQorCSAqIHBvd2VyX3N1cHBseSBjbGFzcyBtZWFzdXJlcyB0ZW1wZXJhdHVyZSBpbiB0ZW50aHMgb2YgZGVncmVlcworCSAqIGNlbHNpdXMuIFRoZSB0ZW1wZXJhdHVyZSB2YWx1ZSBpcyBzdG9yZWQgYXMgYSAxMCBiaXQgbnVtYmVyLCBwbHVzCisJICogc2lnbiBpbiB0aGUgdXBwZXIgYml0cyBvZiBhIDE2IGJpdCByZWdpc3Rlci4KKwkgKi8KKwkqdGVtcGVyYXR1cmUgPSAoKHRlbXBlcmF0dXJlX3JhdyAvIDMyKSAqIDEyNSkgLyAxMDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHMyNzgwX2dldF9jdXJyZW50KHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLAorCWVudW0gY3VycmVudF90eXBlcyB0eXBlLCBpbnQgKmN1cnJlbnRfdUEpCit7CisJaW50IHJldCwgc2Vuc2VfcmVzOworCXMxNiBjdXJyZW50X3JhdzsKKwl1OCBzZW5zZV9yZXNfcmF3LCByZWdfbXNiOworCisJLyoKKwkgKiBUaGUgdW5pdHMgb2YgbWVhc3VyZW1lbnQgZm9yIGN1cnJlbnQgYXJlIGRlcGVuZGVudCBvbiB0aGUgdmFsdWUgb2YKKwkgKiB0aGUgc2Vuc2UgcmVzaXN0b3IuCisJICovCisJcmV0ID0gZHMyNzgwX3JlYWQ4KGRldl9pbmZvLCAmc2Vuc2VfcmVzX3JhdywgRFMyNzgwX1JTTlNQX1JFRyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoc2Vuc2VfcmVzX3JhdyA9PSAwKSB7CisJCWRldl9lcnIoZGV2X2luZm8tPmRldiwgInNlbnNlIHJlc2lzdG9yIHZhbHVlIGlzIDBcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc2Vuc2VfcmVzID0gMTAwMCAvIHNlbnNlX3Jlc19yYXc7CisKKwlpZiAodHlwZSA9PSBDVVJSRU5UX05PVykKKwkJcmVnX21zYiA9IERTMjc4MF9DVVJSRU5UX01TQl9SRUc7CisJZWxzZSBpZiAodHlwZSA9PSBDVVJSRU5UX0FWRykKKwkJcmVnX21zYiA9IERTMjc4MF9JQVZHX01TQl9SRUc7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogVGhlIGN1cnJlbnQgdmFsdWUgaXMgbG9jYXRlZCBpbiAxNiBiaXRzIGFjcm9zcyB0aGUgY3VycmVudCBNU0IKKwkgKiBhbmQgTFNCIHJlZ2lzdGVycyBpbiB0d28ncyBjb21wbGltZW50IGZvcm0KKwkgKiBTaWduIGJpdCBvZiB0aGUgY3VycmVudCB2YWx1ZSBpcyBpbiBiaXQgNyBvZiB0aGUgY3VycmVudCBNU0IgcmVnaXN0ZXIKKwkgKiBCaXRzIDE0IC0gOCBvZiB0aGUgY3VycmVudCB2YWx1ZSBhcmUgaW4gYml0cyA2IC0gMCBvZiB0aGUgY3VycmVudAorCSAqIE1TQiByZWdpc3RlcgorCSAqIEJpdHMgNyAtIDAgb2YgdGhlIGN1cnJlbnQgdmFsdWUgYXJlIGluIGJpdHMgNyAtIDAgb2YgdGhlIGN1cnJlbnQKKwkgKiBMU0IgcmVnaXN0ZXIKKwkgKi8KKwlyZXQgPSBkczI3ODBfcmVhZDE2KGRldl9pbmZvLCAmY3VycmVudF9yYXcsIHJlZ19tc2IpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJKmN1cnJlbnRfdUEgPSBjdXJyZW50X3JhdyAqIChEUzI3ODBfQ1VSUkVOVF9VTklUUyAvIHNlbnNlX3Jlcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHMyNzgwX2dldF9hY2N1bXVsYXRlZF9jdXJyZW50KHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLAorCWludCAqYWNjdW11bGF0ZWRfY3VycmVudCkKK3sKKwlpbnQgcmV0LCBzZW5zZV9yZXM7CisJczE2IGN1cnJlbnRfcmF3OworCXU4IHNlbnNlX3Jlc19yYXc7CisKKwkvKgorCSAqIFRoZSB1bml0cyBvZiBtZWFzdXJlbWVudCBmb3IgYWNjdW11bGF0ZWQgY3VycmVudCBhcmUgZGVwZW5kZW50IG9uCisJICogdGhlIHZhbHVlIG9mIHRoZSBzZW5zZSByZXNpc3Rvci4KKwkgKi8KKwlyZXQgPSBkczI3ODBfcmVhZDgoZGV2X2luZm8sICZzZW5zZV9yZXNfcmF3LCBEUzI3ODBfUlNOU1BfUkVHKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChzZW5zZV9yZXNfcmF3ID09IDApIHsKKwkJZGV2X2VycihkZXZfaW5mby0+ZGV2LCAic2Vuc2UgcmVzaXN0b3IgdmFsdWUgaXMgMFxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCXNlbnNlX3JlcyA9IDEwMDAgLyBzZW5zZV9yZXNfcmF3OworCisJLyoKKwkgKiBUaGUgQUNSIHZhbHVlIGlzIGxvY2F0ZWQgaW4gMTYgYml0cyBhY3Jvc3MgdGhlIEFDUiBNU0IgYW5kCisJICogTFNCIHJlZ2lzdGVycworCSAqIEJpdHMgMTUgLSA4IG9mIHRoZSBBQ1IgdmFsdWUgYXJlIGluIGJpdHMgNyAtIDAgb2YgdGhlIEFDUgorCSAqIE1TQiByZWdpc3RlcgorCSAqIEJpdHMgNyAtIDAgb2YgdGhlIEFDUiB2YWx1ZSBhcmUgaW4gYml0cyA3IC0gMCBvZiB0aGUgQUNSCisJICogTFNCIHJlZ2lzdGVyCisJICovCisJcmV0ID0gZHMyNzgwX3JlYWQxNihkZXZfaW5mbywgJmN1cnJlbnRfcmF3LCBEUzI3ODBfQUNSX01TQl9SRUcpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJKmFjY3VtdWxhdGVkX2N1cnJlbnQgPSBjdXJyZW50X3JhdyAqIChEUzI3ODBfQ0hBUkdFX1VOSVRTIC8gc2Vuc2VfcmVzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkczI3ODBfZ2V0X2NhcGFjaXR5KHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLAorCWludCAqY2FwYWNpdHkpCit7CisJaW50IHJldDsKKwl1OCByYXc7CisKKwlyZXQgPSBkczI3ODBfcmVhZDgoZGV2X2luZm8sICZyYXcsIERTMjc4MF9SQVJDX1JFRyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkqY2FwYWNpdHkgPSByYXc7CisJcmV0dXJuIHJhdzsKK30KKworc3RhdGljIGludCBkczI3ODBfZ2V0X3N0YXR1cyhzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbywgaW50ICpzdGF0dXMpCit7CisJaW50IHJldCwgY3VycmVudF91QSwgY2FwYWNpdHk7CisKKwlyZXQgPSBkczI3ODBfZ2V0X2N1cnJlbnQoZGV2X2luZm8sIENVUlJFTlRfTk9XLCAmY3VycmVudF91QSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBkczI3ODBfZ2V0X2NhcGFjaXR5KGRldl9pbmZvLCAmY2FwYWNpdHkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGNhcGFjaXR5ID09IDEwMCkKKwkJKnN0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTDsKKwllbHNlIGlmIChjdXJyZW50X3VBID09IDApCisJCSpzdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX05PVF9DSEFSR0lORzsKKwllbHNlIGlmIChjdXJyZW50X3VBIDwgMCkKKwkJKnN0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkc7CisJZWxzZQorCQkqc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzMjc4MF9nZXRfY2hhcmdlX25vdyhzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbywKKwlpbnQgKmNoYXJnZV9ub3cpCit7CisJaW50IHJldDsKKwl1MTYgY2hhcmdlX3JhdzsKKworCS8qCisJICogVGhlIFJBQUMgdmFsdWUgaXMgbG9jYXRlZCBpbiAxNiBiaXRzIGFjcm9zcyB0aGUgUkFBQyBNU0IgYW5kCisJICogTFNCIHJlZ2lzdGVycworCSAqIEJpdHMgMTUgLSA4IG9mIHRoZSBSQUFDIHZhbHVlIGFyZSBpbiBiaXRzIDcgLSAwIG9mIHRoZSBSQUFDCisJICogTVNCIHJlZ2lzdGVyCisJICogQml0cyA3IC0gMCBvZiB0aGUgUkFBQyB2YWx1ZSBhcmUgaW4gYml0cyA3IC0gMCBvZiB0aGUgUkFBQworCSAqIExTQiByZWdpc3RlcgorCSAqLworCXJldCA9IGRzMjc4MF9yZWFkMTYoZGV2X2luZm8sICZjaGFyZ2VfcmF3LCBEUzI3ODBfUkFBQ19NU0JfUkVHKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCSpjaGFyZ2Vfbm93ID0gY2hhcmdlX3JhdyAqIDE2MDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHMyNzgwX2dldF9jb250cm9sX3JlZ2lzdGVyKHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvLAorCXU4ICpjb250cm9sX3JlZykKK3sKKwlyZXR1cm4gZHMyNzgwX3JlYWQ4KGRldl9pbmZvLCBjb250cm9sX3JlZywgRFMyNzgwX0NPTlRST0xfUkVHKTsKK30KKworc3RhdGljIGludCBkczI3ODBfc2V0X2NvbnRyb2xfcmVnaXN0ZXIoc3RydWN0IGRzMjc4MF9kZXZpY2VfaW5mbyAqZGV2X2luZm8sCisJdTggY29udHJvbF9yZWcpCit7CisJaW50IHJldDsKKworCXJldCA9IGRzMjc4MF93cml0ZShkZXZfaW5mbywgJmNvbnRyb2xfcmVnLAorCQkJCURTMjc4MF9DT05UUk9MX1JFRywgc2l6ZW9mKHU4KSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gZHMyNzgwX3NhdmVfZWVwcm9tKGRldl9pbmZvLCBEUzI3ODBfQ09OVFJPTF9SRUcpOworfQorCitzdGF0aWMgaW50IGRzMjc4MF9iYXR0ZXJ5X2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGRzMjc4MF9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSB0b19kczI3ODBfZGV2aWNlX2luZm8ocHN5KTsKKworCXN3aXRjaCAocHNwKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKKwkJcmV0ID0gZHMyNzgwX2dldF92b2x0YWdlKGRldl9pbmZvLCAmdmFsLT5pbnR2YWwpOworCQlicmVhazsKKworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUDoKKwkJcmV0ID0gZHMyNzgwX2dldF90ZW1wZXJhdHVyZShkZXZfaW5mbywgJnZhbC0+aW50dmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX01PREVMX05BTUU6CisJCXZhbC0+c3RydmFsID0gbW9kZWw7CisJCWJyZWFrOworCisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9NQU5VRkFDVFVSRVI6CisJCXZhbC0+c3RydmFsID0gbWFudWZhY3R1cmVyOworCQlicmVhazsKKworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1c6CisJCXJldCA9IGRzMjc4MF9nZXRfY3VycmVudChkZXZfaW5mbywgQ1VSUkVOVF9OT1csICZ2YWwtPmludHZhbCk7CisJCWJyZWFrOworCisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX0FWRzoKKwkJcmV0ID0gZHMyNzgwX2dldF9jdXJyZW50KGRldl9pbmZvLCBDVVJSRU5UX0FWRywgJnZhbC0+aW50dmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKKwkJcmV0ID0gZHMyNzgwX2dldF9zdGF0dXMoZGV2X2luZm8sICZ2YWwtPmludHZhbCk7CisJCWJyZWFrOworCisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWToKKwkJcmV0ID0gZHMyNzgwX2dldF9jYXBhY2l0eShkZXZfaW5mbywgJnZhbC0+aW50dmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9DT1VOVEVSOgorCQlyZXQgPSBkczI3ODBfZ2V0X2FjY3VtdWxhdGVkX2N1cnJlbnQoZGV2X2luZm8sICZ2YWwtPmludHZhbCk7CisJCWJyZWFrOworCisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XOgorCQlyZXQgPSBkczI3ODBfZ2V0X2NoYXJnZV9ub3coZGV2X2luZm8sICZ2YWwtPmludHZhbCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgZHMyNzgwX2JhdHRlcnlfcHJvcHNbXSA9IHsKKwlQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMsCisJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1csCisJUE9XRVJfU1VQUExZX1BST1BfVEVNUCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9NT0RFTF9OQU1FLAorCVBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUiwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX0FWRywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfQ09VTlRFUiwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XLAorfTsKKworc3RhdGljIHNzaXplX3QgZHMyNzgwX2dldF9wbW9kX2VuYWJsZWQoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXU4IGNvbnRyb2xfcmVnOworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IHRvX3Bvd2VyX3N1cHBseShkZXYpOworCXN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvID0gdG9fZHMyNzgwX2RldmljZV9pbmZvKHBzeSk7CisKKwkvKiBHZXQgcG93ZXIgbW9kZSAqLworCXJldCA9IGRzMjc4MF9nZXRfY29udHJvbF9yZWdpc3RlcihkZXZfaW5mbywgJmNvbnRyb2xfcmVnKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAorCQkgISEoY29udHJvbF9yZWcgJiBEUzI3ODBfQ09OVFJPTF9SRUdfUE1PRCkpOworfQorCitzdGF0aWMgc3NpemVfdCBkczI3ODBfc2V0X3Btb2RfZW5hYmxlZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJY29uc3QgY2hhciAqYnVmLAorCXNpemVfdCBjb3VudCkKK3sKKwlpbnQgcmV0OworCXU4IGNvbnRyb2xfcmVnLCBuZXdfc2V0dGluZzsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSB0b19wb3dlcl9zdXBwbHkoZGV2KTsKKwlzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbyA9IHRvX2RzMjc4MF9kZXZpY2VfaW5mbyhwc3kpOworCisJLyogU2V0IHBvd2VyIG1vZGUgKi8KKwlyZXQgPSBkczI3ODBfZ2V0X2NvbnRyb2xfcmVnaXN0ZXIoZGV2X2luZm8sICZjb250cm9sX3JlZyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBrc3RydG91OChidWYsIDAsICZuZXdfc2V0dGluZyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoKG5ld19zZXR0aW5nICE9IDApICYmIChuZXdfc2V0dGluZyAhPSAxKSkgeworCQlkZXZfZXJyKGRldl9pbmZvLT5kZXYsICJJbnZhbGlkIHBtb2Qgc2V0dGluZyAoMCBvciAxKVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChuZXdfc2V0dGluZykKKwkJY29udHJvbF9yZWcgfD0gRFMyNzgwX0NPTlRST0xfUkVHX1BNT0Q7CisJZWxzZQorCQljb250cm9sX3JlZyAmPSB+RFMyNzgwX0NPTlRST0xfUkVHX1BNT0Q7CisKKwlyZXQgPSBkczI3ODBfc2V0X2NvbnRyb2xfcmVnaXN0ZXIoZGV2X2luZm8sIGNvbnRyb2xfcmVnKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgZHMyNzgwX2dldF9zZW5zZV9yZXNpc3Rvcl92YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJY2hhciAqYnVmKQoreworCWludCByZXQ7CisJdTggc2Vuc2VfcmVzaXN0b3I7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gdG9fcG93ZXJfc3VwcGx5KGRldik7CisJc3RydWN0IGRzMjc4MF9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSB0b19kczI3ODBfZGV2aWNlX2luZm8ocHN5KTsKKworCXJldCA9IGRzMjc4MF9yZWFkOChkZXZfaW5mbywgJnNlbnNlX3Jlc2lzdG9yLCBEUzI3ODBfUlNOU1BfUkVHKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIHNlbnNlX3Jlc2lzdG9yKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBkczI3ODBfc2V0X3NlbnNlX3Jlc2lzdG9yX3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwljb25zdCBjaGFyICpidWYsCisJc2l6ZV90IGNvdW50KQoreworCWludCByZXQ7CisJdTggbmV3X3NldHRpbmc7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gdG9fcG93ZXJfc3VwcGx5KGRldik7CisJc3RydWN0IGRzMjc4MF9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSB0b19kczI3ODBfZGV2aWNlX2luZm8ocHN5KTsKKworCXJldCA9IGtzdHJ0b3U4KGJ1ZiwgMCwgJm5ld19zZXR0aW5nKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGRzMjc4MF9zZXRfc2Vuc2VfcmVnaXN0ZXIoZGV2X2luZm8sIG5ld19zZXR0aW5nKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgZHMyNzgwX2dldF9yc2dhaW5fc2V0dGluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJY2hhciAqYnVmKQoreworCWludCByZXQ7CisJdTE2IHJzZ2FpbjsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSB0b19wb3dlcl9zdXBwbHkoZGV2KTsKKwlzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbyA9IHRvX2RzMjc4MF9kZXZpY2VfaW5mbyhwc3kpOworCisJcmV0ID0gZHMyNzgwX2dldF9yc2dhaW5fcmVnaXN0ZXIoZGV2X2luZm8sICZyc2dhaW4pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJzZ2Fpbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRzMjc4MF9zZXRfcnNnYWluX3NldHRpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCWNvbnN0IGNoYXIgKmJ1ZiwKKwlzaXplX3QgY291bnQpCit7CisJaW50IHJldDsKKwl1MTYgbmV3X3NldHRpbmc7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gdG9fcG93ZXJfc3VwcGx5KGRldik7CisJc3RydWN0IGRzMjc4MF9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSB0b19kczI3ODBfZGV2aWNlX2luZm8ocHN5KTsKKworCXJldCA9IGtzdHJ0b3UxNihidWYsIDAsICZuZXdfc2V0dGluZyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBHYWluIGNhbiBvbmx5IGJlIGZyb20gMCB0byAxLjk5OSBpbiBzdGVwcyBvZiAuMDAxICovCisJaWYgKG5ld19zZXR0aW5nID4gMTk5OSkgeworCQlkZXZfZXJyKGRldl9pbmZvLT5kZXYsICJJbnZhbGlkIHJzZ2FpbiBzZXR0aW5nICgwIC0gMTk5OSlcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBkczI3ODBfc2V0X3JzZ2Fpbl9yZWdpc3RlcihkZXZfaW5mbywgbmV3X3NldHRpbmcpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBkczI3ODBfZ2V0X3Bpb19waW4oc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXU4IHNmcjsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSB0b19wb3dlcl9zdXBwbHkoZGV2KTsKKwlzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbyA9IHRvX2RzMjc4MF9kZXZpY2VfaW5mbyhwc3kpOworCisJcmV0ID0gZHMyNzgwX3JlYWQ4KGRldl9pbmZvLCAmc2ZyLCBEUzI3ODBfU0ZSX1JFRyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBzZnIgJiBEUzI3ODBfU0ZSX1JFR19QSU9TQyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgZHMyNzgwX3NldF9waW9fcGluKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwljb25zdCBjaGFyICpidWYsCisJc2l6ZV90IGNvdW50KQoreworCWludCByZXQ7CisJdTggbmV3X3NldHRpbmc7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gdG9fcG93ZXJfc3VwcGx5KGRldik7CisJc3RydWN0IGRzMjc4MF9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSB0b19kczI3ODBfZGV2aWNlX2luZm8ocHN5KTsKKworCXJldCA9IGtzdHJ0b3U4KGJ1ZiwgMCwgJm5ld19zZXR0aW5nKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmICgobmV3X3NldHRpbmcgIT0gMCkgJiYgKG5ld19zZXR0aW5nICE9IDEpKSB7CisJCWRldl9lcnIoZGV2X2luZm8tPmRldiwgIkludmFsaWQgcGlvX3BpbiBzZXR0aW5nICgwIG9yIDEpXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gZHMyNzgwX3dyaXRlKGRldl9pbmZvLCAmbmV3X3NldHRpbmcsCisJCQkJRFMyNzgwX1NGUl9SRUcsIHNpemVvZih1OCkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBkczI3ODBfcmVhZF9wYXJhbV9lZXByb21fYmluKHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCXN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCXN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkJCQljaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gdG9fcG93ZXJfc3VwcGx5KGRldik7CisJc3RydWN0IGRzMjc4MF9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSB0b19kczI3ODBfZGV2aWNlX2luZm8ocHN5KTsKKworCXJldHVybiBkczI3ODBfcmVhZF9ibG9jayhkZXZfaW5mbywgYnVmLAorCQkJCURTMjc4MF9FRVBST01fQkxPQ0sxX1NUQVJUICsgb2ZmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRzMjc4MF93cml0ZV9wYXJhbV9lZXByb21fYmluKHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCXN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCXN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkJCQljaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gdG9fcG93ZXJfc3VwcGx5KGRldik7CisJc3RydWN0IGRzMjc4MF9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSB0b19kczI3ODBfZGV2aWNlX2luZm8ocHN5KTsKKwlpbnQgcmV0OworCisJcmV0ID0gZHMyNzgwX3dyaXRlKGRldl9pbmZvLCBidWYsCisJCQkJRFMyNzgwX0VFUFJPTV9CTE9DSzFfU1RBUlQgKyBvZmYsIGNvdW50KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGRzMjc4MF9zYXZlX2VlcHJvbShkZXZfaW5mbywgRFMyNzgwX0VFUFJPTV9CTE9DSzFfU1RBUlQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgZHMyNzgwX3BhcmFtX2VlcHJvbV9iaW5fYXR0ciA9IHsKKwkuYXR0ciA9IHsKKwkJLm5hbWUgPSAicGFyYW1fZWVwcm9tIiwKKwkJLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUiwKKwl9LAorCS5zaXplID0gRFMyNzgwX1BBUkFNX0VFUFJPTV9TSVpFLAorCS5yZWFkID0gZHMyNzgwX3JlYWRfcGFyYW1fZWVwcm9tX2JpbiwKKwkud3JpdGUgPSBkczI3ODBfd3JpdGVfcGFyYW1fZWVwcm9tX2JpbiwKK307CisKK3N0YXRpYyBzc2l6ZV90IGRzMjc4MF9yZWFkX3VzZXJfZWVwcm9tX2JpbihzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCisJCQkJY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IHRvX3Bvd2VyX3N1cHBseShkZXYpOworCXN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gKmRldl9pbmZvID0gdG9fZHMyNzgwX2RldmljZV9pbmZvKHBzeSk7CisKKwlyZXR1cm4gZHMyNzgwX3JlYWRfYmxvY2soZGV2X2luZm8sIGJ1ZiwKKwkJCQlEUzI3ODBfRUVQUk9NX0JMT0NLMF9TVEFSVCArIG9mZiwgY291bnQpOworfQorCitzdGF0aWMgc3NpemVfdCBkczI3ODBfd3JpdGVfdXNlcl9lZXByb21fYmluKHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCXN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCXN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkJCQljaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gdG9fcG93ZXJfc3VwcGx5KGRldik7CisJc3RydWN0IGRzMjc4MF9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSB0b19kczI3ODBfZGV2aWNlX2luZm8ocHN5KTsKKwlpbnQgcmV0OworCisJcmV0ID0gZHMyNzgwX3dyaXRlKGRldl9pbmZvLCBidWYsCisJCQkJRFMyNzgwX0VFUFJPTV9CTE9DSzBfU1RBUlQgKyBvZmYsIGNvdW50KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGRzMjc4MF9zYXZlX2VlcHJvbShkZXZfaW5mbywgRFMyNzgwX0VFUFJPTV9CTE9DSzBfU1RBUlQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgZHMyNzgwX3VzZXJfZWVwcm9tX2Jpbl9hdHRyID0geworCS5hdHRyID0geworCQkubmFtZSA9ICJ1c2VyX2VlcHJvbSIsCisJCS5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IsCisJfSwKKwkuc2l6ZSA9IERTMjc4MF9VU0VSX0VFUFJPTV9TSVpFLAorCS5yZWFkID0gZHMyNzgwX3JlYWRfdXNlcl9lZXByb21fYmluLAorCS53cml0ZSA9IGRzMjc4MF93cml0ZV91c2VyX2VlcHJvbV9iaW4sCit9OworCitzdGF0aWMgREVWSUNFX0FUVFIocG1vZF9lbmFibGVkLCBTX0lSVUdPIHwgU19JV1VTUiwgZHMyNzgwX2dldF9wbW9kX2VuYWJsZWQsCisJZHMyNzgwX3NldF9wbW9kX2VuYWJsZWQpOworc3RhdGljIERFVklDRV9BVFRSKHNlbnNlX3Jlc2lzdG9yX3ZhbHVlLCBTX0lSVUdPIHwgU19JV1VTUiwKKwlkczI3ODBfZ2V0X3NlbnNlX3Jlc2lzdG9yX3ZhbHVlLCBkczI3ODBfc2V0X3NlbnNlX3Jlc2lzdG9yX3ZhbHVlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihyc2dhaW5fc2V0dGluZywgU19JUlVHTyB8IFNfSVdVU1IsIGRzMjc4MF9nZXRfcnNnYWluX3NldHRpbmcsCisJZHMyNzgwX3NldF9yc2dhaW5fc2V0dGluZyk7CitzdGF0aWMgREVWSUNFX0FUVFIocGlvX3BpbiwgU19JUlVHTyB8IFNfSVdVU1IsIGRzMjc4MF9nZXRfcGlvX3BpbiwKKwlkczI3ODBfc2V0X3Bpb19waW4pOworCisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpkczI3ODBfYXR0cmlidXRlc1tdID0geworCSZkZXZfYXR0cl9wbW9kX2VuYWJsZWQuYXR0ciwKKwkmZGV2X2F0dHJfc2Vuc2VfcmVzaXN0b3JfdmFsdWUuYXR0ciwKKwkmZGV2X2F0dHJfcnNnYWluX3NldHRpbmcuYXR0ciwKKwkmZGV2X2F0dHJfcGlvX3Bpbi5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGRzMjc4MF9hdHRyX2dyb3VwID0geworCS5hdHRycyA9IGRzMjc4MF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCBkczI3ODBfYmF0dGVyeV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbzsKKworCWRldl9pbmZvID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZGV2X2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldl9pbmZvKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXZfaW5mbyk7CisKKwlkZXZfaW5mby0+ZGV2CQkJPSAmcGRldi0+ZGV2OworCWRldl9pbmZvLT53MV9kZXYJCT0gcGRldi0+ZGV2LnBhcmVudDsKKwlkZXZfaW5mby0+YmF0X2Rlc2MubmFtZQkJPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKKwlkZXZfaW5mby0+YmF0X2Rlc2MudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOworCWRldl9pbmZvLT5iYXRfZGVzYy5wcm9wZXJ0aWVzCT0gZHMyNzgwX2JhdHRlcnlfcHJvcHM7CisJZGV2X2luZm8tPmJhdF9kZXNjLm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShkczI3ODBfYmF0dGVyeV9wcm9wcyk7CisJZGV2X2luZm8tPmJhdF9kZXNjLmdldF9wcm9wZXJ0eQk9IGRzMjc4MF9iYXR0ZXJ5X2dldF9wcm9wZXJ0eTsKKworCXBzeV9jZmcuZHJ2X2RhdGEJCT0gZGV2X2luZm87CisKKwlkZXZfaW5mby0+YmF0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZkZXZfaW5mby0+YmF0X2Rlc2MsCisJCQkJCSAgICAgICZwc3lfY2ZnKTsKKwlpZiAoSVNfRVJSKGRldl9pbmZvLT5iYXQpKSB7CisJCWRldl9lcnIoZGV2X2luZm8tPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBiYXR0ZXJ5XG4iKTsKKwkJcmV0ID0gUFRSX0VSUihkZXZfaW5mby0+YmF0KTsKKwkJZ290byBmYWlsOworCX0KKworCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2X2luZm8tPmJhdC0+ZGV2LmtvYmosICZkczI3ODBfYXR0cl9ncm91cCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldl9pbmZvLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGdyb3VwXG4iKTsKKwkJZ290byBmYWlsX3VucmVnaXN0ZXI7CisJfQorCisJcmV0ID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZkZXZfaW5mby0+YmF0LT5kZXYua29iaiwKKwkJCQkJJmRzMjc4MF9wYXJhbV9lZXByb21fYmluX2F0dHIpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXZfaW5mby0+ZGV2LAorCQkJCSJmYWlsZWQgdG8gY3JlYXRlIHBhcmFtIGVlcHJvbSBiaW4gZmlsZSIpOworCQlnb3RvIGZhaWxfcmVtb3ZlX2dyb3VwOworCX0KKworCXJldCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmZGV2X2luZm8tPmJhdC0+ZGV2LmtvYmosCisJCQkJCSZkczI3ODBfdXNlcl9lZXByb21fYmluX2F0dHIpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXZfaW5mby0+ZGV2LAorCQkJCSJmYWlsZWQgdG8gY3JlYXRlIHVzZXIgZWVwcm9tIGJpbiBmaWxlIik7CisJCWdvdG8gZmFpbF9yZW1vdmVfYmluX2ZpbGU7CisJfQorCisJcmV0dXJuIDA7CisKK2ZhaWxfcmVtb3ZlX2Jpbl9maWxlOgorCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmZGV2X2luZm8tPmJhdC0+ZGV2LmtvYmosCisJCQkJJmRzMjc4MF9wYXJhbV9lZXByb21fYmluX2F0dHIpOworZmFpbF9yZW1vdmVfZ3JvdXA6CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXZfaW5mby0+YmF0LT5kZXYua29iaiwgJmRzMjc4MF9hdHRyX2dyb3VwKTsKK2ZhaWxfdW5yZWdpc3RlcjoKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihkZXZfaW5mby0+YmF0KTsKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkczI3ODBfYmF0dGVyeV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJLyoKKwkgKiBSZW1vdmUgYXR0cmlidXRlcyBiZWZvcmUgdW5yZWdpc3RlcmluZyBwb3dlciBzdXBwbHkKKwkgKiBiZWNhdXNlICdiYXQnIHdpbGwgYmUgZnJlZWQgb24gcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoKSBjYWxsLgorCSAqLworCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2X2luZm8tPmJhdC0+ZGV2LmtvYmosICZkczI3ODBfYXR0cl9ncm91cCk7CisKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihkZXZfaW5mby0+YmF0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBkczI3ODBfYmF0dGVyeV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiZHMyNzgwLWJhdHRlcnkiLAorCX0sCisJLnByb2JlCSAgPSBkczI3ODBfYmF0dGVyeV9wcm9iZSwKKwkucmVtb3ZlICAgPSBkczI3ODBfYmF0dGVyeV9yZW1vdmUsCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGRzMjc4MF9iYXR0ZXJ5X2RyaXZlcik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkNsaWZ0b24gQmFybmVzIDxjYWJhcm5lc0BpbmRlc2lnbi1sbGMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXhpbS9EYWxsYXMgRFMyNzgwIFN0YW5kLUFsb25lIEZ1ZWwgR2F1YWdlIElDIGRyaXZlciIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpkczI3ODAtYmF0dGVyeSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9zdXBwbHkvZHMyNzgxX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L2RzMjc4MV9iYXR0ZXJ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MwMTQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L2RzMjc4MV9iYXR0ZXJ5LmMKQEAgLTAsMCArMSw4MzkgQEAKKy8qCisgKiAxLXdpcmUgY2xpZW50L2RyaXZlciBmb3IgdGhlIE1heGltL0RhbGxhcyBEUzI3ODEgU3RhbmQtQWxvbmUgRnVlbCBHYXVnZSBJQworICoKKyAqIEF1dGhvcjogUmVuYXRhIFNheWFraG92YSA8cmVuYXRhQG9rdGV0bGFicy5ydT4KKyAqCisgKiBCYXNlZCBvbiBkczI3ODBfYmF0dGVyeSBkcml2ZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CisKKyNpbmNsdWRlICIuLi8uLi93MS93MS5oIgorI2luY2x1ZGUgIi4uLy4uL3cxL3NsYXZlcy93MV9kczI3ODEuaCIKKworLyogQ3VycmVudCB1bml0IG1lYXN1cmVtZW50IGluIHVBIGZvciBhIDEgbWlsbGktb2htIHNlbnNlIHJlc2lzdG9yICovCisjZGVmaW5lIERTMjc4MV9DVVJSRU5UX1VOSVRTCTE1NjMKKy8qIENoYXJnZSB1bml0IG1lYXN1cmVtZW50IGluIHVBaCBmb3IgYSAxIG1pbGxpLW9obSBzZW5zZSByZXNpc3RvciAqLworI2RlZmluZSBEUzI3ODFfQ0hBUkdFX1VOSVRTCQk2MjUwCisvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gdXNlciBFRVBST00gc3BhY2UgKi8KKyNkZWZpbmUgRFMyNzgxX1VTRVJfRUVQUk9NX1NJWkUJCShEUzI3ODFfRUVQUk9NX0JMT0NLMF9FTkQgLSBcCisJCQkJCURTMjc4MV9FRVBST01fQkxPQ0swX1NUQVJUICsgMSkKKy8qIE51bWJlciBvZiBieXRlcyBpbiBwYXJhbWV0ZXIgRUVQUk9NIHNwYWNlICovCisjZGVmaW5lIERTMjc4MV9QQVJBTV9FRVBST01fU0laRQkoRFMyNzgxX0VFUFJPTV9CTE9DSzFfRU5EIC0gXAorCQkJCQlEUzI3ODFfRUVQUk9NX0JMT0NLMV9TVEFSVCArIDEpCisKK3N0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8geworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXQ7CisJc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGJhdF9kZXNjOworCXN0cnVjdCBkZXZpY2UgKncxX2RldjsKK307CisKK2VudW0gY3VycmVudF90eXBlcyB7CisJQ1VSUkVOVF9OT1csCisJQ1VSUkVOVF9BVkcsCit9OworCitzdGF0aWMgY29uc3QgY2hhciBtb2RlbFtdID0gIkRTMjc4MSI7CitzdGF0aWMgY29uc3QgY2hhciBtYW51ZmFjdHVyZXJbXSA9ICJNYXhpbS9EYWxsYXMiOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8gKgordG9fZHMyNzgxX2RldmljZV9pbmZvKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSkKK3sKKwlyZXR1cm4gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBvd2VyX3N1cHBseSAqdG9fcG93ZXJfc3VwcGx5KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGV2X2dldF9kcnZkYXRhKGRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRzMjc4MV9iYXR0ZXJ5X2lvKHN0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8gKmRldl9pbmZvLAorCWNoYXIgKmJ1ZiwgaW50IGFkZHIsIHNpemVfdCBjb3VudCwgaW50IGlvKQoreworCXJldHVybiB3MV9kczI3ODFfaW8oZGV2X2luZm8tPncxX2RldiwgYnVmLCBhZGRyLCBjb3VudCwgaW8pOworfQorCitzdGF0aWMgaW50IHcxX2RzMjc4MV9yZWFkKHN0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8gKmRldl9pbmZvLCBjaGFyICpidWYsCisJCWludCBhZGRyLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIGRzMjc4MV9iYXR0ZXJ5X2lvKGRldl9pbmZvLCBidWYsIGFkZHIsIGNvdW50LCAwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZHMyNzgxX3JlYWQ4KHN0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8gKmRldl9pbmZvLCB1OCAqdmFsLAorCWludCBhZGRyKQoreworCXJldHVybiBkczI3ODFfYmF0dGVyeV9pbyhkZXZfaW5mbywgdmFsLCBhZGRyLCBzaXplb2YodTgpLCAwKTsKK30KKworc3RhdGljIGludCBkczI3ODFfcmVhZDE2KHN0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8gKmRldl9pbmZvLCBzMTYgKnZhbCwKKwlpbnQgYWRkcikKK3sKKwlpbnQgcmV0OworCXU4IHJhd1syXTsKKworCXJldCA9IGRzMjc4MV9iYXR0ZXJ5X2lvKGRldl9pbmZvLCByYXcsIGFkZHIsIHNpemVvZihyYXcpLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCSp2YWwgPSAocmF3WzBdIDw8IDgpIHwgcmF3WzFdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRzMjc4MV9yZWFkX2Jsb2NrKHN0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8gKmRldl9pbmZvLAorCXU4ICp2YWwsIGludCBhZGRyLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIGRzMjc4MV9iYXR0ZXJ5X2lvKGRldl9pbmZvLCB2YWwsIGFkZHIsIGNvdW50LCAwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZHMyNzgxX3dyaXRlKHN0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8gKmRldl9pbmZvLCB1OCAqdmFsLAorCWludCBhZGRyLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIGRzMjc4MV9iYXR0ZXJ5X2lvKGRldl9pbmZvLCB2YWwsIGFkZHIsIGNvdW50LCAxKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZHMyNzgxX3N0b3JlX2VlcHJvbShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBhZGRyKQoreworCXJldHVybiB3MV9kczI3ODFfZWVwcm9tX2NtZChkZXYsIGFkZHIsIFcxX0RTMjc4MV9DT1BZX0RBVEEpOworfQorCitzdGF0aWMgaW5saW5lIGludCBkczI3ODFfcmVjYWxsX2VlcHJvbShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBhZGRyKQoreworCXJldHVybiB3MV9kczI3ODFfZWVwcm9tX2NtZChkZXYsIGFkZHIsIFcxX0RTMjc4MV9SRUNBTExfREFUQSk7Cit9CisKK3N0YXRpYyBpbnQgZHMyNzgxX3NhdmVfZWVwcm9tKHN0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8gKmRldl9pbmZvLCBpbnQgcmVnKQoreworCWludCByZXQ7CisKKwlyZXQgPSBkczI3ODFfc3RvcmVfZWVwcm9tKGRldl9pbmZvLT53MV9kZXYsIHJlZyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBkczI3ODFfcmVjYWxsX2VlcHJvbShkZXZfaW5mby0+dzFfZGV2LCByZWcpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKKy8qIFNldCBzZW5zZSByZXNpc3RvciB2YWx1ZSBpbiBtaG9zICovCitzdGF0aWMgaW50IGRzMjc4MV9zZXRfc2Vuc2VfcmVnaXN0ZXIoc3RydWN0IGRzMjc4MV9kZXZpY2VfaW5mbyAqZGV2X2luZm8sCisJdTggY29uZHVjdGFuY2UpCit7CisJaW50IHJldDsKKworCXJldCA9IGRzMjc4MV93cml0ZShkZXZfaW5mbywgJmNvbmR1Y3RhbmNlLAorCQkJCURTMjc4MV9SU05TUCwgc2l6ZW9mKHU4KSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gZHMyNzgxX3NhdmVfZWVwcm9tKGRldl9pbmZvLCBEUzI3ODFfUlNOU1ApOworfQorCisvKiBHZXQgUlNHQUlOIHZhbHVlIGZyb20gMCB0byAxLjk5OSBpbiBzdGVwcyBvZiAwLjAwMSAqLworc3RhdGljIGludCBkczI3ODFfZ2V0X3JzZ2Fpbl9yZWdpc3RlcihzdHJ1Y3QgZHMyNzgxX2RldmljZV9pbmZvICpkZXZfaW5mbywKKwl1MTYgKnJzZ2FpbikKK3sKKwlyZXR1cm4gZHMyNzgxX3JlYWQxNihkZXZfaW5mbywgcnNnYWluLCBEUzI3ODFfUlNHQUlOX01TQik7Cit9CisKKy8qIFNldCBSU0dBSU4gdmFsdWUgZnJvbSAwIHRvIDEuOTk5IGluIHN0ZXBzIG9mIDAuMDAxICovCitzdGF0aWMgaW50IGRzMjc4MV9zZXRfcnNnYWluX3JlZ2lzdGVyKHN0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8gKmRldl9pbmZvLAorCXUxNiByc2dhaW4pCit7CisJaW50IHJldDsKKwl1OCByYXdbXSA9IHtyc2dhaW4gPj4gOCwgcnNnYWluICYgMHhGRn07CisKKwlyZXQgPSBkczI3ODFfd3JpdGUoZGV2X2luZm8sIHJhdywKKwkJCQlEUzI3ODFfUlNHQUlOX01TQiwgc2l6ZW9mKHJhdykpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGRzMjc4MV9zYXZlX2VlcHJvbShkZXZfaW5mbywgRFMyNzgxX1JTR0FJTl9NU0IpOworfQorCitzdGF0aWMgaW50IGRzMjc4MV9nZXRfdm9sdGFnZShzdHJ1Y3QgZHMyNzgxX2RldmljZV9pbmZvICpkZXZfaW5mbywKKwlpbnQgKnZvbHRhZ2VfdVYpCit7CisJaW50IHJldDsKKwljaGFyIHZhbFsyXTsKKwlpbnQgdm9sdGFnZV9yYXc7CisKKwlyZXQgPSB3MV9kczI3ODFfcmVhZChkZXZfaW5mbywgdmFsLCBEUzI3ODFfVk9MVF9NU0IsIDIgKiBzaXplb2YodTgpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwkvKgorCSAqIFRoZSB2b2x0YWdlIHZhbHVlIGlzIGxvY2F0ZWQgaW4gMTAgYml0cyBhY3Jvc3MgdGhlIHZvbHRhZ2UgTVNCCisJICogYW5kIExTQiByZWdpc3RlcnMgaW4gdHdvJ3MgY29tcGxpbWVudCBmb3JtCisJICogU2lnbiBiaXQgb2YgdGhlIHZvbHRhZ2UgdmFsdWUgaXMgaW4gYml0IDcgb2YgdGhlIHZvbHRhZ2UgTVNCIHJlZ2lzdGVyCisJICogQml0cyA5IC0gMyBvZiB0aGUgdm9sdGFnZSB2YWx1ZSBhcmUgaW4gYml0cyA2IC0gMCBvZiB0aGUKKwkgKiB2b2x0YWdlIE1TQiByZWdpc3RlcgorCSAqIEJpdHMgMiAtIDAgb2YgdGhlIHZvbHRhZ2UgdmFsdWUgYXJlIGluIGJpdHMgNyAtIDUgb2YgdGhlCisJICogdm9sdGFnZSBMU0IgcmVnaXN0ZXIKKwkgKi8KKwl2b2x0YWdlX3JhdyA9ICh2YWxbMF0gPDwgMykgfAorCQkodmFsWzFdID4+IDUpOworCisJLyogRFMyNzgxIHJlcG9ydHMgdm9sdGFnZSBpbiB1bml0cyBvZiA5Ljc2bVYsIGJ1dCB0aGUgYmF0dGVyeSBjbGFzcworCSAqIHJlcG9ydHMgaW4gdW5pdHMgb2YgdVYsIHNvIGNvbnZlcnQgYnkgbXVsdGlwbHlpbmcgYnkgOTc2MC4gKi8KKwkqdm9sdGFnZV91ViA9IHZvbHRhZ2VfcmF3ICogOTc2MDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzMjc4MV9nZXRfdGVtcGVyYXR1cmUoc3RydWN0IGRzMjc4MV9kZXZpY2VfaW5mbyAqZGV2X2luZm8sCisJaW50ICp0ZW1wKQoreworCWludCByZXQ7CisJY2hhciB2YWxbMl07CisJaW50IHRlbXBfcmF3OworCisJcmV0ID0gdzFfZHMyNzgxX3JlYWQoZGV2X2luZm8sIHZhbCwgRFMyNzgxX1RFTVBfTVNCLCAyICogc2l6ZW9mKHU4KSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJLyoKKwkgKiBUaGUgdGVtcGVyYXR1cmUgdmFsdWUgaXMgbG9jYXRlZCBpbiAxMCBiaXRzIGFjcm9zcyB0aGUgdGVtcGVyYXR1cmUKKwkgKiBNU0IgYW5kIExTQiByZWdpc3RlcnMgaW4gdHdvJ3MgY29tcGxpbWVudCBmb3JtCisJICogU2lnbiBiaXQgb2YgdGhlIHRlbXBlcmF0dXJlIHZhbHVlIGlzIGluIGJpdCA3IG9mIHRoZSB0ZW1wZXJhdHVyZQorCSAqIE1TQiByZWdpc3RlcgorCSAqIEJpdHMgOSAtIDMgb2YgdGhlIHRlbXBlcmF0dXJlIHZhbHVlIGFyZSBpbiBiaXRzIDYgLSAwIG9mIHRoZQorCSAqIHRlbXBlcmF0dXJlIE1TQiByZWdpc3RlcgorCSAqIEJpdHMgMiAtIDAgb2YgdGhlIHRlbXBlcmF0dXJlIHZhbHVlIGFyZSBpbiBiaXRzIDcgLSA1IG9mIHRoZQorCSAqIHRlbXBlcmF0dXJlIExTQiByZWdpc3RlcgorCSAqLworCXRlbXBfcmF3ID0gKCh2YWxbMF0pIDw8IDMpIHwKKwkJKHZhbFsxXSA+PiA1KTsKKwkqdGVtcCA9IHRlbXBfcmF3ICsgKHRlbXBfcmF3IC8gNCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkczI3ODFfZ2V0X2N1cnJlbnQoc3RydWN0IGRzMjc4MV9kZXZpY2VfaW5mbyAqZGV2X2luZm8sCisJZW51bSBjdXJyZW50X3R5cGVzIHR5cGUsIGludCAqY3VycmVudF91QSkKK3sKKwlpbnQgcmV0LCBzZW5zZV9yZXM7CisJczE2IGN1cnJlbnRfcmF3OworCXU4IHNlbnNlX3Jlc19yYXcsIHJlZ19tc2I7CisKKwkvKgorCSAqIFRoZSB1bml0cyBvZiBtZWFzdXJlbWVudCBmb3IgY3VycmVudCBhcmUgZGVwZW5kZW50IG9uIHRoZSB2YWx1ZSBvZgorCSAqIHRoZSBzZW5zZSByZXNpc3Rvci4KKwkgKi8KKwlyZXQgPSBkczI3ODFfcmVhZDgoZGV2X2luZm8sICZzZW5zZV9yZXNfcmF3LCBEUzI3ODFfUlNOU1ApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKHNlbnNlX3Jlc19yYXcgPT0gMCkgeworCQlkZXZfZXJyKGRldl9pbmZvLT5kZXYsICJzZW5zZSByZXNpc3RvciB2YWx1ZSBpcyAwXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXNlbnNlX3JlcyA9IDEwMDAgLyBzZW5zZV9yZXNfcmF3OworCisJaWYgKHR5cGUgPT0gQ1VSUkVOVF9OT1cpCisJCXJlZ19tc2IgPSBEUzI3ODFfQ1VSUkVOVF9NU0I7CisJZWxzZSBpZiAodHlwZSA9PSBDVVJSRU5UX0FWRykKKwkJcmVnX21zYiA9IERTMjc4MV9JQVZHX01TQjsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBUaGUgY3VycmVudCB2YWx1ZSBpcyBsb2NhdGVkIGluIDE2IGJpdHMgYWNyb3NzIHRoZSBjdXJyZW50IE1TQgorCSAqIGFuZCBMU0IgcmVnaXN0ZXJzIGluIHR3bydzIGNvbXBsaW1lbnQgZm9ybQorCSAqIFNpZ24gYml0IG9mIHRoZSBjdXJyZW50IHZhbHVlIGlzIGluIGJpdCA3IG9mIHRoZSBjdXJyZW50IE1TQiByZWdpc3RlcgorCSAqIEJpdHMgMTQgLSA4IG9mIHRoZSBjdXJyZW50IHZhbHVlIGFyZSBpbiBiaXRzIDYgLSAwIG9mIHRoZSBjdXJyZW50CisJICogTVNCIHJlZ2lzdGVyCisJICogQml0cyA3IC0gMCBvZiB0aGUgY3VycmVudCB2YWx1ZSBhcmUgaW4gYml0cyA3IC0gMCBvZiB0aGUgY3VycmVudAorCSAqIExTQiByZWdpc3RlcgorCSAqLworCXJldCA9IGRzMjc4MV9yZWFkMTYoZGV2X2luZm8sICZjdXJyZW50X3JhdywgcmVnX21zYik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkqY3VycmVudF91QSA9IGN1cnJlbnRfcmF3ICogKERTMjc4MV9DVVJSRU5UX1VOSVRTIC8gc2Vuc2VfcmVzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkczI3ODFfZ2V0X2FjY3VtdWxhdGVkX2N1cnJlbnQoc3RydWN0IGRzMjc4MV9kZXZpY2VfaW5mbyAqZGV2X2luZm8sCisJaW50ICphY2N1bXVsYXRlZF9jdXJyZW50KQoreworCWludCByZXQsIHNlbnNlX3JlczsKKwlzMTYgY3VycmVudF9yYXc7CisJdTggc2Vuc2VfcmVzX3JhdzsKKworCS8qCisJICogVGhlIHVuaXRzIG9mIG1lYXN1cmVtZW50IGZvciBhY2N1bXVsYXRlZCBjdXJyZW50IGFyZSBkZXBlbmRlbnQgb24KKwkgKiB0aGUgdmFsdWUgb2YgdGhlIHNlbnNlIHJlc2lzdG9yLgorCSAqLworCXJldCA9IGRzMjc4MV9yZWFkOChkZXZfaW5mbywgJnNlbnNlX3Jlc19yYXcsIERTMjc4MV9SU05TUCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoc2Vuc2VfcmVzX3JhdyA9PSAwKSB7CisJCWRldl9lcnIoZGV2X2luZm8tPmRldiwgInNlbnNlIHJlc2lzdG9yIHZhbHVlIGlzIDBcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc2Vuc2VfcmVzID0gMTAwMCAvIHNlbnNlX3Jlc19yYXc7CisKKwkvKgorCSAqIFRoZSBBQ1IgdmFsdWUgaXMgbG9jYXRlZCBpbiAxNiBiaXRzIGFjcm9zcyB0aGUgQUNSIE1TQiBhbmQKKwkgKiBMU0IgcmVnaXN0ZXJzCisJICogQml0cyAxNSAtIDggb2YgdGhlIEFDUiB2YWx1ZSBhcmUgaW4gYml0cyA3IC0gMCBvZiB0aGUgQUNSCisJICogTVNCIHJlZ2lzdGVyCisJICogQml0cyA3IC0gMCBvZiB0aGUgQUNSIHZhbHVlIGFyZSBpbiBiaXRzIDcgLSAwIG9mIHRoZSBBQ1IKKwkgKiBMU0IgcmVnaXN0ZXIKKwkgKi8KKwlyZXQgPSBkczI3ODFfcmVhZDE2KGRldl9pbmZvLCAmY3VycmVudF9yYXcsIERTMjc4MV9BQ1JfTVNCKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCSphY2N1bXVsYXRlZF9jdXJyZW50ID0gY3VycmVudF9yYXcgKiAoRFMyNzgxX0NIQVJHRV9VTklUUyAvIHNlbnNlX3Jlcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHMyNzgxX2dldF9jYXBhY2l0eShzdHJ1Y3QgZHMyNzgxX2RldmljZV9pbmZvICpkZXZfaW5mbywKKwlpbnQgKmNhcGFjaXR5KQoreworCWludCByZXQ7CisJdTggcmF3OworCisJcmV0ID0gZHMyNzgxX3JlYWQ4KGRldl9pbmZvLCAmcmF3LCBEUzI3ODFfUkFSQyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkqY2FwYWNpdHkgPSByYXc7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHMyNzgxX2dldF9zdGF0dXMoc3RydWN0IGRzMjc4MV9kZXZpY2VfaW5mbyAqZGV2X2luZm8sIGludCAqc3RhdHVzKQoreworCWludCByZXQsIGN1cnJlbnRfdUEsIGNhcGFjaXR5OworCisJcmV0ID0gZHMyNzgxX2dldF9jdXJyZW50KGRldl9pbmZvLCBDVVJSRU5UX05PVywgJmN1cnJlbnRfdUEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZHMyNzgxX2dldF9jYXBhY2l0eShkZXZfaW5mbywgJmNhcGFjaXR5KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChwb3dlcl9zdXBwbHlfYW1faV9zdXBwbGllZChkZXZfaW5mby0+YmF0KSkgeworCQlpZiAoY2FwYWNpdHkgPT0gMTAwKQorCQkJKnN0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTDsKKwkJZWxzZSBpZiAoY3VycmVudF91QSA+IDUwMDAwKQorCQkJKnN0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7CisJCWVsc2UKKwkJCSpzdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX05PVF9DSEFSR0lORzsKKwl9IGVsc2UgeworCQkqc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHMyNzgxX2dldF9jaGFyZ2Vfbm93KHN0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8gKmRldl9pbmZvLAorCWludCAqY2hhcmdlX25vdykKK3sKKwlpbnQgcmV0OworCXUxNiBjaGFyZ2VfcmF3OworCisJLyoKKwkgKiBUaGUgUkFBQyB2YWx1ZSBpcyBsb2NhdGVkIGluIDE2IGJpdHMgYWNyb3NzIHRoZSBSQUFDIE1TQiBhbmQKKwkgKiBMU0IgcmVnaXN0ZXJzCisJICogQml0cyAxNSAtIDggb2YgdGhlIFJBQUMgdmFsdWUgYXJlIGluIGJpdHMgNyAtIDAgb2YgdGhlIFJBQUMKKwkgKiBNU0IgcmVnaXN0ZXIKKwkgKiBCaXRzIDcgLSAwIG9mIHRoZSBSQUFDIHZhbHVlIGFyZSBpbiBiaXRzIDcgLSAwIG9mIHRoZSBSQUFDCisJICogTFNCIHJlZ2lzdGVyCisJICovCisJcmV0ID0gZHMyNzgxX3JlYWQxNihkZXZfaW5mbywgJmNoYXJnZV9yYXcsIERTMjc4MV9SQUFDX01TQik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkqY2hhcmdlX25vdyA9IGNoYXJnZV9yYXcgKiAxNjAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzMjc4MV9nZXRfY29udHJvbF9yZWdpc3RlcihzdHJ1Y3QgZHMyNzgxX2RldmljZV9pbmZvICpkZXZfaW5mbywKKwl1OCAqY29udHJvbF9yZWcpCit7CisJcmV0dXJuIGRzMjc4MV9yZWFkOChkZXZfaW5mbywgY29udHJvbF9yZWcsIERTMjc4MV9DT05UUk9MKTsKK30KKworc3RhdGljIGludCBkczI3ODFfc2V0X2NvbnRyb2xfcmVnaXN0ZXIoc3RydWN0IGRzMjc4MV9kZXZpY2VfaW5mbyAqZGV2X2luZm8sCisJdTggY29udHJvbF9yZWcpCit7CisJaW50IHJldDsKKworCXJldCA9IGRzMjc4MV93cml0ZShkZXZfaW5mbywgJmNvbnRyb2xfcmVnLAorCQkJCURTMjc4MV9DT05UUk9MLCBzaXplb2YodTgpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBkczI3ODFfc2F2ZV9lZXByb20oZGV2X2luZm8sIERTMjc4MV9DT05UUk9MKTsKK30KKworc3RhdGljIGludCBkczI3ODFfYmF0dGVyeV9nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAorCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8gKmRldl9pbmZvID0gdG9fZHMyNzgxX2RldmljZV9pbmZvKHBzeSk7CisKKwlzd2l0Y2ggKHBzcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c6CisJCXJldCA9IGRzMjc4MV9nZXRfdm9sdGFnZShkZXZfaW5mbywgJnZhbC0+aW50dmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVA6CisJCXJldCA9IGRzMjc4MV9nZXRfdGVtcGVyYXR1cmUoZGV2X2luZm8sICZ2YWwtPmludHZhbCk7CisJCWJyZWFrOworCisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9NT0RFTF9OQU1FOgorCQl2YWwtPnN0cnZhbCA9IG1vZGVsOworCQlicmVhazsKKworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfTUFOVUZBQ1RVUkVSOgorCQl2YWwtPnN0cnZhbCA9IG1hbnVmYWN0dXJlcjsKKwkJYnJlYWs7CisKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XOgorCQlyZXQgPSBkczI3ODFfZ2V0X2N1cnJlbnQoZGV2X2luZm8sIENVUlJFTlRfTk9XLCAmdmFsLT5pbnR2YWwpOworCQlicmVhazsKKworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9BVkc6CisJCXJldCA9IGRzMjc4MV9nZXRfY3VycmVudChkZXZfaW5mbywgQ1VSUkVOVF9BVkcsICZ2YWwtPmludHZhbCk7CisJCWJyZWFrOworCisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6CisJCXJldCA9IGRzMjc4MV9nZXRfc3RhdHVzKGRldl9pbmZvLCAmdmFsLT5pbnR2YWwpOworCQlicmVhazsKKworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFk6CisJCXJldCA9IGRzMjc4MV9nZXRfY2FwYWNpdHkoZGV2X2luZm8sICZ2YWwtPmludHZhbCk7CisJCWJyZWFrOworCisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfQ09VTlRFUjoKKwkJcmV0ID0gZHMyNzgxX2dldF9hY2N1bXVsYXRlZF9jdXJyZW50KGRldl9pbmZvLCAmdmFsLT5pbnR2YWwpOworCQlicmVhazsKKworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVzoKKwkJcmV0ID0gZHMyNzgxX2dldF9jaGFyZ2Vfbm93KGRldl9pbmZvLCAmdmFsLT5pbnR2YWwpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IGRzMjc4MV9iYXR0ZXJ5X3Byb3BzW10gPSB7CisJUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVAsCisJUE9XRVJfU1VQUExZX1BST1BfTU9ERUxfTkFNRSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9NQU5VRkFDVFVSRVIsCisJUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1csCisJUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9BVkcsCisJUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFksCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0NPVU5URVIsCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVywKK307CisKK3N0YXRpYyBzc2l6ZV90IGRzMjc4MV9nZXRfcG1vZF9lbmFibGVkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwljaGFyICpidWYpCit7CisJaW50IHJldDsKKwl1OCBjb250cm9sX3JlZzsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSB0b19wb3dlcl9zdXBwbHkoZGV2KTsKKwlzdHJ1Y3QgZHMyNzgxX2RldmljZV9pbmZvICpkZXZfaW5mbyA9IHRvX2RzMjc4MV9kZXZpY2VfaW5mbyhwc3kpOworCisJLyogR2V0IHBvd2VyIG1vZGUgKi8KKwlyZXQgPSBkczI3ODFfZ2V0X2NvbnRyb2xfcmVnaXN0ZXIoZGV2X2luZm8sICZjb250cm9sX3JlZyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKKwkJICEhKGNvbnRyb2xfcmVnICYgRFMyNzgxX0NPTlRST0xfUE1PRCkpOworfQorCitzdGF0aWMgc3NpemVfdCBkczI3ODFfc2V0X3Btb2RfZW5hYmxlZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJY29uc3QgY2hhciAqYnVmLAorCXNpemVfdCBjb3VudCkKK3sKKwlpbnQgcmV0OworCXU4IGNvbnRyb2xfcmVnLCBuZXdfc2V0dGluZzsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSB0b19wb3dlcl9zdXBwbHkoZGV2KTsKKwlzdHJ1Y3QgZHMyNzgxX2RldmljZV9pbmZvICpkZXZfaW5mbyA9IHRvX2RzMjc4MV9kZXZpY2VfaW5mbyhwc3kpOworCisJLyogU2V0IHBvd2VyIG1vZGUgKi8KKwlyZXQgPSBkczI3ODFfZ2V0X2NvbnRyb2xfcmVnaXN0ZXIoZGV2X2luZm8sICZjb250cm9sX3JlZyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBrc3RydG91OChidWYsIDAsICZuZXdfc2V0dGluZyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoKG5ld19zZXR0aW5nICE9IDApICYmIChuZXdfc2V0dGluZyAhPSAxKSkgeworCQlkZXZfZXJyKGRldl9pbmZvLT5kZXYsICJJbnZhbGlkIHBtb2Qgc2V0dGluZyAoMCBvciAxKVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChuZXdfc2V0dGluZykKKwkJY29udHJvbF9yZWcgfD0gRFMyNzgxX0NPTlRST0xfUE1PRDsKKwllbHNlCisJCWNvbnRyb2xfcmVnICY9IH5EUzI3ODFfQ09OVFJPTF9QTU9EOworCisJcmV0ID0gZHMyNzgxX3NldF9jb250cm9sX3JlZ2lzdGVyKGRldl9pbmZvLCBjb250cm9sX3JlZyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRzMjc4MV9nZXRfc2Vuc2VfcmVzaXN0b3JfdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXU4IHNlbnNlX3Jlc2lzdG9yOworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IHRvX3Bvd2VyX3N1cHBseShkZXYpOworCXN0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8gKmRldl9pbmZvID0gdG9fZHMyNzgxX2RldmljZV9pbmZvKHBzeSk7CisKKwlyZXQgPSBkczI3ODFfcmVhZDgoZGV2X2luZm8sICZzZW5zZV9yZXNpc3RvciwgRFMyNzgxX1JTTlNQKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIHNlbnNlX3Jlc2lzdG9yKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBkczI3ODFfc2V0X3NlbnNlX3Jlc2lzdG9yX3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwljb25zdCBjaGFyICpidWYsCisJc2l6ZV90IGNvdW50KQoreworCWludCByZXQ7CisJdTggbmV3X3NldHRpbmc7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gdG9fcG93ZXJfc3VwcGx5KGRldik7CisJc3RydWN0IGRzMjc4MV9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSB0b19kczI3ODFfZGV2aWNlX2luZm8ocHN5KTsKKworCXJldCA9IGtzdHJ0b3U4KGJ1ZiwgMCwgJm5ld19zZXR0aW5nKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGRzMjc4MV9zZXRfc2Vuc2VfcmVnaXN0ZXIoZGV2X2luZm8sIG5ld19zZXR0aW5nKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgZHMyNzgxX2dldF9yc2dhaW5fc2V0dGluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJY2hhciAqYnVmKQoreworCWludCByZXQ7CisJdTE2IHJzZ2FpbjsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSB0b19wb3dlcl9zdXBwbHkoZGV2KTsKKwlzdHJ1Y3QgZHMyNzgxX2RldmljZV9pbmZvICpkZXZfaW5mbyA9IHRvX2RzMjc4MV9kZXZpY2VfaW5mbyhwc3kpOworCisJcmV0ID0gZHMyNzgxX2dldF9yc2dhaW5fcmVnaXN0ZXIoZGV2X2luZm8sICZyc2dhaW4pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJzZ2Fpbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRzMjc4MV9zZXRfcnNnYWluX3NldHRpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCWNvbnN0IGNoYXIgKmJ1ZiwKKwlzaXplX3QgY291bnQpCit7CisJaW50IHJldDsKKwl1MTYgbmV3X3NldHRpbmc7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gdG9fcG93ZXJfc3VwcGx5KGRldik7CisJc3RydWN0IGRzMjc4MV9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSB0b19kczI3ODFfZGV2aWNlX2luZm8ocHN5KTsKKworCXJldCA9IGtzdHJ0b3UxNihidWYsIDAsICZuZXdfc2V0dGluZyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBHYWluIGNhbiBvbmx5IGJlIGZyb20gMCB0byAxLjk5OSBpbiBzdGVwcyBvZiAuMDAxICovCisJaWYgKG5ld19zZXR0aW5nID4gMTk5OSkgeworCQlkZXZfZXJyKGRldl9pbmZvLT5kZXYsICJJbnZhbGlkIHJzZ2FpbiBzZXR0aW5nICgwIC0gMTk5OSlcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBkczI3ODFfc2V0X3JzZ2Fpbl9yZWdpc3RlcihkZXZfaW5mbywgbmV3X3NldHRpbmcpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBkczI3ODFfZ2V0X3Bpb19waW4oc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCWNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXU4IHNmcjsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSB0b19wb3dlcl9zdXBwbHkoZGV2KTsKKwlzdHJ1Y3QgZHMyNzgxX2RldmljZV9pbmZvICpkZXZfaW5mbyA9IHRvX2RzMjc4MV9kZXZpY2VfaW5mbyhwc3kpOworCisJcmV0ID0gZHMyNzgxX3JlYWQ4KGRldl9pbmZvLCAmc2ZyLCBEUzI3ODFfU0ZSKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIHNmciAmIERTMjc4MV9TRlJfUElPU0MpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRzMjc4MV9zZXRfcGlvX3BpbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJY29uc3QgY2hhciAqYnVmLAorCXNpemVfdCBjb3VudCkKK3sKKwlpbnQgcmV0OworCXU4IG5ld19zZXR0aW5nOworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IHRvX3Bvd2VyX3N1cHBseShkZXYpOworCXN0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8gKmRldl9pbmZvID0gdG9fZHMyNzgxX2RldmljZV9pbmZvKHBzeSk7CisKKwlyZXQgPSBrc3RydG91OChidWYsIDAsICZuZXdfc2V0dGluZyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoKG5ld19zZXR0aW5nICE9IDApICYmIChuZXdfc2V0dGluZyAhPSAxKSkgeworCQlkZXZfZXJyKGRldl9pbmZvLT5kZXYsICJJbnZhbGlkIHBpb19waW4gc2V0dGluZyAoMCBvciAxKVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IGRzMjc4MV93cml0ZShkZXZfaW5mbywgJm5ld19zZXR0aW5nLAorCQkJCURTMjc4MV9TRlIsIHNpemVvZih1OCkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBkczI3ODFfcmVhZF9wYXJhbV9lZXByb21fYmluKHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCXN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCXN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkJCQljaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gdG9fcG93ZXJfc3VwcGx5KGRldik7CisJc3RydWN0IGRzMjc4MV9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSB0b19kczI3ODFfZGV2aWNlX2luZm8ocHN5KTsKKworCXJldHVybiBkczI3ODFfcmVhZF9ibG9jayhkZXZfaW5mbywgYnVmLAorCQkJCURTMjc4MV9FRVBST01fQkxPQ0sxX1NUQVJUICsgb2ZmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRzMjc4MV93cml0ZV9wYXJhbV9lZXByb21fYmluKHN0cnVjdCBmaWxlICpmaWxwLAorCQkJCXN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCXN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKKwkJCQljaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gdG9fcG93ZXJfc3VwcGx5KGRldik7CisJc3RydWN0IGRzMjc4MV9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSB0b19kczI3ODFfZGV2aWNlX2luZm8ocHN5KTsKKwlpbnQgcmV0OworCisJcmV0ID0gZHMyNzgxX3dyaXRlKGRldl9pbmZvLCBidWYsCisJCQkJRFMyNzgxX0VFUFJPTV9CTE9DSzFfU1RBUlQgKyBvZmYsIGNvdW50KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGRzMjc4MV9zYXZlX2VlcHJvbShkZXZfaW5mbywgRFMyNzgxX0VFUFJPTV9CTE9DSzFfU1RBUlQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgZHMyNzgxX3BhcmFtX2VlcHJvbV9iaW5fYXR0ciA9IHsKKwkuYXR0ciA9IHsKKwkJLm5hbWUgPSAicGFyYW1fZWVwcm9tIiwKKwkJLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUiwKKwl9LAorCS5zaXplID0gRFMyNzgxX1BBUkFNX0VFUFJPTV9TSVpFLAorCS5yZWFkID0gZHMyNzgxX3JlYWRfcGFyYW1fZWVwcm9tX2JpbiwKKwkud3JpdGUgPSBkczI3ODFfd3JpdGVfcGFyYW1fZWVwcm9tX2JpbiwKK307CisKK3N0YXRpYyBzc2l6ZV90IGRzMjc4MV9yZWFkX3VzZXJfZWVwcm9tX2JpbihzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQlzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCisJCQkJY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IHRvX3Bvd2VyX3N1cHBseShkZXYpOworCXN0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8gKmRldl9pbmZvID0gdG9fZHMyNzgxX2RldmljZV9pbmZvKHBzeSk7CisKKwlyZXR1cm4gZHMyNzgxX3JlYWRfYmxvY2soZGV2X2luZm8sIGJ1ZiwKKwkJCQlEUzI3ODFfRUVQUk9NX0JMT0NLMF9TVEFSVCArIG9mZiwgY291bnQpOworCit9CisKK3N0YXRpYyBzc2l6ZV90IGRzMjc4MV93cml0ZV91c2VyX2VlcHJvbV9iaW4oc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLAorCQkJCWNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSB0b19wb3dlcl9zdXBwbHkoZGV2KTsKKwlzdHJ1Y3QgZHMyNzgxX2RldmljZV9pbmZvICpkZXZfaW5mbyA9IHRvX2RzMjc4MV9kZXZpY2VfaW5mbyhwc3kpOworCWludCByZXQ7CisKKwlyZXQgPSBkczI3ODFfd3JpdGUoZGV2X2luZm8sIGJ1ZiwKKwkJCQlEUzI3ODFfRUVQUk9NX0JMT0NLMF9TVEFSVCArIG9mZiwgY291bnQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZHMyNzgxX3NhdmVfZWVwcm9tKGRldl9pbmZvLCBEUzI3ODFfRUVQUk9NX0JMT0NLMF9TVEFSVCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBkczI3ODFfdXNlcl9lZXByb21fYmluX2F0dHIgPSB7CisJLmF0dHIgPSB7CisJCS5uYW1lID0gInVzZXJfZWVwcm9tIiwKKwkJLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUiwKKwl9LAorCS5zaXplID0gRFMyNzgxX1VTRVJfRUVQUk9NX1NJWkUsCisJLnJlYWQgPSBkczI3ODFfcmVhZF91c2VyX2VlcHJvbV9iaW4sCisJLndyaXRlID0gZHMyNzgxX3dyaXRlX3VzZXJfZWVwcm9tX2JpbiwKK307CisKK3N0YXRpYyBERVZJQ0VfQVRUUihwbW9kX2VuYWJsZWQsIFNfSVJVR08gfCBTX0lXVVNSLCBkczI3ODFfZ2V0X3Btb2RfZW5hYmxlZCwKKwlkczI3ODFfc2V0X3Btb2RfZW5hYmxlZCk7CitzdGF0aWMgREVWSUNFX0FUVFIoc2Vuc2VfcmVzaXN0b3JfdmFsdWUsIFNfSVJVR08gfCBTX0lXVVNSLAorCWRzMjc4MV9nZXRfc2Vuc2VfcmVzaXN0b3JfdmFsdWUsIGRzMjc4MV9zZXRfc2Vuc2VfcmVzaXN0b3JfdmFsdWUpOworc3RhdGljIERFVklDRV9BVFRSKHJzZ2Fpbl9zZXR0aW5nLCBTX0lSVUdPIHwgU19JV1VTUiwgZHMyNzgxX2dldF9yc2dhaW5fc2V0dGluZywKKwlkczI3ODFfc2V0X3JzZ2Fpbl9zZXR0aW5nKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwaW9fcGluLCBTX0lSVUdPIHwgU19JV1VTUiwgZHMyNzgxX2dldF9waW9fcGluLAorCWRzMjc4MV9zZXRfcGlvX3Bpbik7CisKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmRzMjc4MV9hdHRyaWJ1dGVzW10gPSB7CisJJmRldl9hdHRyX3Btb2RfZW5hYmxlZC5hdHRyLAorCSZkZXZfYXR0cl9zZW5zZV9yZXNpc3Rvcl92YWx1ZS5hdHRyLAorCSZkZXZfYXR0cl9yc2dhaW5fc2V0dGluZy5hdHRyLAorCSZkZXZfYXR0cl9waW9fcGluLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgZHMyNzgxX2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gZHMyNzgxX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IGRzMjc4MV9iYXR0ZXJ5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgcHN5X2NmZyA9IHt9OworCWludCByZXQgPSAwOworCXN0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8gKmRldl9pbmZvOworCisJZGV2X2luZm8gPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpkZXZfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghZGV2X2luZm8pCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGV2X2luZm8pOworCisJZGV2X2luZm8tPmRldgkJCT0gJnBkZXYtPmRldjsKKwlkZXZfaW5mby0+dzFfZGV2CQk9IHBkZXYtPmRldi5wYXJlbnQ7CisJZGV2X2luZm8tPmJhdF9kZXNjLm5hbWUJCT0gZGV2X25hbWUoJnBkZXYtPmRldik7CisJZGV2X2luZm8tPmJhdF9kZXNjLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKKwlkZXZfaW5mby0+YmF0X2Rlc2MucHJvcGVydGllcwk9IGRzMjc4MV9iYXR0ZXJ5X3Byb3BzOworCWRldl9pbmZvLT5iYXRfZGVzYy5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUoZHMyNzgxX2JhdHRlcnlfcHJvcHMpOworCWRldl9pbmZvLT5iYXRfZGVzYy5nZXRfcHJvcGVydHkJPSBkczI3ODFfYmF0dGVyeV9nZXRfcHJvcGVydHk7CisKKwlwc3lfY2ZnLmRydl9kYXRhCQk9IGRldl9pbmZvOworCisJZGV2X2luZm8tPmJhdCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmZGV2X2luZm8tPmJhdF9kZXNjLAorCQkJCQkJJnBzeV9jZmcpOworCWlmIChJU19FUlIoZGV2X2luZm8tPmJhdCkpIHsKKwkJZGV2X2VycihkZXZfaW5mby0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGJhdHRlcnlcbiIpOworCQlyZXQgPSBQVFJfRVJSKGRldl9pbmZvLT5iYXQpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXZfaW5mby0+YmF0LT5kZXYua29iaiwgJmRzMjc4MV9hdHRyX2dyb3VwKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2X2luZm8tPmRldiwgImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgZ3JvdXBcbiIpOworCQlnb3RvIGZhaWxfdW5yZWdpc3RlcjsKKwl9CisKKwlyZXQgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmRldl9pbmZvLT5iYXQtPmRldi5rb2JqLAorCQkJCQkmZHMyNzgxX3BhcmFtX2VlcHJvbV9iaW5fYXR0cik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldl9pbmZvLT5kZXYsCisJCQkJImZhaWxlZCB0byBjcmVhdGUgcGFyYW0gZWVwcm9tIGJpbiBmaWxlIik7CisJCWdvdG8gZmFpbF9yZW1vdmVfZ3JvdXA7CisJfQorCisJcmV0ID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZkZXZfaW5mby0+YmF0LT5kZXYua29iaiwKKwkJCQkJJmRzMjc4MV91c2VyX2VlcHJvbV9iaW5fYXR0cik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldl9pbmZvLT5kZXYsCisJCQkJImZhaWxlZCB0byBjcmVhdGUgdXNlciBlZXByb20gYmluIGZpbGUiKTsKKwkJZ290byBmYWlsX3JlbW92ZV9iaW5fZmlsZTsKKwl9CisKKwlyZXR1cm4gMDsKKworZmFpbF9yZW1vdmVfYmluX2ZpbGU6CisJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZkZXZfaW5mby0+YmF0LT5kZXYua29iaiwKKwkJCQkmZHMyNzgxX3BhcmFtX2VlcHJvbV9iaW5fYXR0cik7CitmYWlsX3JlbW92ZV9ncm91cDoKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldl9pbmZvLT5iYXQtPmRldi5rb2JqLCAmZHMyNzgxX2F0dHJfZ3JvdXApOworZmFpbF91bnJlZ2lzdGVyOgorCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGRldl9pbmZvLT5iYXQpOworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRzMjc4MV9iYXR0ZXJ5X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8gKmRldl9pbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwkvKgorCSAqIFJlbW92ZSBhdHRyaWJ1dGVzIGJlZm9yZSB1bnJlZ2lzdGVyaW5nIHBvd2VyIHN1cHBseQorCSAqIGJlY2F1c2UgJ2JhdCcgd2lsbCBiZSBmcmVlZCBvbiBwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigpIGNhbGwuCisJICovCisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXZfaW5mby0+YmF0LT5kZXYua29iaiwgJmRzMjc4MV9hdHRyX2dyb3VwKTsKKworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGRldl9pbmZvLT5iYXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGRzMjc4MV9iYXR0ZXJ5X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJkczI3ODEtYmF0dGVyeSIsCisJfSwKKwkucHJvYmUJICA9IGRzMjc4MV9iYXR0ZXJ5X3Byb2JlLAorCS5yZW1vdmUgICA9IGRzMjc4MV9iYXR0ZXJ5X3JlbW92ZSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGRzMjc4MV9iYXR0ZXJ5X2RyaXZlcik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlJlbmF0YSBTYXlha2hvdmEgPHJlbmF0YUBva3RldGxhYnMucnU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1heGltL0RhbGxhcyBEUzI3ODEgU3RhbmQtQWxvbmUgRnVlbCBHYXVhZ2UgSUMgZHJpdmVyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmRzMjc4MS1iYXR0ZXJ5Iik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvZHMyNzgyX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L2RzMjc4Ml9iYXR0ZXJ5LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvZHMyNzgyX2JhdHRlcnkuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvZHMyNzgyX2JhdHRlcnkuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9nZW5lcmljLWFkYy1iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9nZW5lcmljLWFkYy1iYXR0ZXJ5LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvZ2VuZXJpYy1hZGMtYmF0dGVyeS5jCnJlbmFtZSB0byBkcml2ZXJzL3Bvd2VyL3N1cHBseS9nZW5lcmljLWFkYy1iYXR0ZXJ5LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvZ29sZGZpc2hfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvZ29sZGZpc2hfYmF0dGVyeS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3Bvd2VyL2dvbGRmaXNoX2JhdHRlcnkuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvZ29sZGZpc2hfYmF0dGVyeS5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2dwaW8tY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvZ3Bpby1jaGFyZ2VyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvZ3Bpby1jaGFyZ2VyLmMKcmVuYW1lIHRvIGRyaXZlcnMvcG93ZXIvc3VwcGx5L2dwaW8tY2hhcmdlci5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9pbnRlbF9taWRfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvaW50ZWxfbWlkX2JhdHRlcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzdmZWVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvaW50ZWxfbWlkX2JhdHRlcnkuYwpAQCAtMCwwICsxLDc5NSBAQAorLyoKKyAqIGludGVsX21pZF9iYXR0ZXJ5LmMgLSBJbnRlbCBNSUQgUE1JQyBCYXR0ZXJ5IERyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLglTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EuCisgKgorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqIEF1dGhvcjogTml0aGlzaCBNYWhhbGluZ2FtIDxuaXRoaXNoLm1haGFsaW5nYW1AaW50ZWwuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgorCisjaW5jbHVkZSA8YXNtL2ludGVsX3NjdV9pcGMuaD4KKworI2RlZmluZSBEUklWRVJfTkFNRSAicG1pY19iYXR0ZXJ5IgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJR2VuZXJpYyBkZWZpbmVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGRlYnVnOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkZsYWcgdG8gZW5hYmxlIFBNSUMgQmF0dGVyeSBkZWJ1ZyBtZXNzYWdlcy4iKTsKKworI2RlZmluZSBQTUlDX0JBVFRfRFJWX0lORk9fVVBEQVRFRAkxCisjZGVmaW5lIFBNSUNfQkFUVF9QUkVTRU5UCQkxCisjZGVmaW5lIFBNSUNfQkFUVF9OT1RfUFJFU0VOVAkJMAorI2RlZmluZSBQTUlDX1VTQl9QUkVTRU5UCQlQTUlDX0JBVFRfUFJFU0VOVAorI2RlZmluZSBQTUlDX1VTQl9OT1RfUFJFU0VOVAkJUE1JQ19CQVRUX05PVF9QUkVTRU5UCisKKy8qIHBtaWMgYmF0dGVyeSByZWdpc3RlciByZWxhdGVkICovCisjZGVmaW5lIFBNSUNfQkFUVF9DSFJfU0NIUkdJTlRfQUREUgkweEQyCisjZGVmaW5lIFBNSUNfQkFUVF9DSFJfU0JBVE9WUF9NQVNLCSgxIDw8IDEpCisjZGVmaW5lIFBNSUNfQkFUVF9DSFJfU1RFTVBfTUFTSwkoMSA8PCAyKQorI2RlZmluZSBQTUlDX0JBVFRfQ0hSX1NDT01QX01BU0sJKDEgPDwgMykKKyNkZWZpbmUgUE1JQ19CQVRUX0NIUl9TVVNCREVUX01BU0sJKDEgPDwgNCkKKyNkZWZpbmUgUE1JQ19CQVRUX0NIUl9TQkFUREVUX01BU0sJKDEgPDwgNSkKKyNkZWZpbmUgUE1JQ19CQVRUX0NIUl9TRENMTVRfTUFTSwkoMSA8PCA2KQorI2RlZmluZSBQTUlDX0JBVFRfQ0hSX1NVU0JPVlBfTUFTSwkoMSA8PCA3KQorI2RlZmluZSBQTUlDX0JBVFRfQ0hSX0VYQ1BUX01BU0sJMHg4NgorCisjZGVmaW5lIFBNSUNfQkFUVF9BRENfQUNDQ0hSR19NQVNLCSgxIDw8IDMxKQorI2RlZmluZSBQTUlDX0JBVFRfQURDX0FDQ0NIUkdWQUxfTUFTSwkweDdGRkZGRkZGCisKKy8qIHBtaWMgaXBjIHJlbGF0ZWQgKi8KKyNkZWZpbmUgUE1JQ19CQVRUX0NIUl9JUENfRkNIUkdfU1VCSUQJMHg0CisjZGVmaW5lIFBNSUNfQkFUVF9DSFJfSVBDX1RDSFJHX1NVQklECTB4NgorCisvKiB0eXBlcyBvZiBiYXR0ZXJ5IGNoYXJnaW5nICovCitlbnVtIGJhdHRfY2hhcmdlX3R5cGUgeworCUJBVFRfVVNCT1RHXzUwME1BX0NIQVJHRSwKKwlCQVRUX1VTQk9UR19UUklDS0xFX0NIQVJHRSwKK307CisKKy8qIHZhbGlkIGJhdHRlcnkgZXZlbnRzICovCitlbnVtIGJhdHRfZXZlbnQgeworCUJBVFRfRVZFTlRfQkFUT1ZQX0VYQ1BULAorCUJBVFRfRVZFTlRfVVNCT1ZQX0VYQ1BULAorCUJBVFRfRVZFTlRfVEVNUF9FWENQVCwKKwlCQVRUX0VWRU5UX0RDTE1UX0VYQ1BULAorCUJBVFRfRVZFTlRfRVhDUFQKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCUJhdHRlcnkgcHJvcGVydGllcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIHBtaWMgYmF0dGVyeSBpbmZvCisgKi8KK3N0cnVjdCBwbWljX3Bvd2VyX21vZHVsZV9pbmZvIHsKKwlib29sIGlzX2Rldl9pbmZvX3VwZGF0ZWQ7CisJc3RydWN0IGRldmljZSAqZGV2OworCS8qIHBtaWMgYmF0dGVyeSBkYXRhICovCisJdW5zaWduZWQgbG9uZyB1cGRhdGVfdGltZTsJCS8qIGppZmZpZXMgd2hlbiBkYXRhIHJlYWQgKi8KKwl1bnNpZ25lZCBpbnQgdXNiX2lzX3ByZXNlbnQ7CisJdW5zaWduZWQgaW50IGJhdHRfaXNfcHJlc2VudDsKKwl1bnNpZ25lZCBpbnQgYmF0dF9oZWFsdGg7CisJdW5zaWduZWQgaW50IHVzYl9oZWFsdGg7CisJdW5zaWduZWQgaW50IGJhdHRfc3RhdHVzOworCXVuc2lnbmVkIGludCBiYXR0X2NoYXJnZV9ub3c7CQkvKiBpbiBtQVMgKi8KKwl1bnNpZ25lZCBpbnQgYmF0dF9wcmV2X2NoYXJnZV9mdWxsOwkvKiBpbiBtQVMgKi8KKwl1bnNpZ25lZCBpbnQgYmF0dF9jaGFyZ2VfcmF0ZTsJCS8qIGluIHVuaXRzIHBlciBzZWNvbmQgKi8KKworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnVzYjsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXR0OworCWludCBpcnE7CQkJCS8qIEdQRV9JRCBvciBJUlEjICovCisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKm1vbml0b3Jfd3F1ZXVlOworCXN0cnVjdCBkZWxheWVkX3dvcmsgbW9uaXRvcl9iYXR0ZXJ5OworCXN0cnVjdCB3b3JrX3N0cnVjdCBoYW5kbGVyOworfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBkZWxheV90aW1lID0gMjAwMDsJLyogaW4gbXMgKi8KKworLyoKKyAqIHBtaWMgYWMgcHJvcGVydGllcworICovCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcG1pY191c2JfcHJvcHNbXSA9IHsKKwlQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5ULAorCVBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCwKK307CisKKy8qCisgKiBwbWljIGJhdHRlcnkgcHJvcGVydGllcworICovCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcG1pY19iYXR0ZXJ5X3Byb3BzW10gPSB7CisJUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAorCVBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5ULAorCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9OT1csCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTEwsCit9OworCisKKy8qCisgKiBHbHVlIGZ1bmN0aW9ucyBmb3IgdGFsa2luZyB0byB0aGUgSVBDCisgKi8KKworc3RydWN0IGJhdHRlcnlfcHJvcGVydHkgeworCXUzMiBjYXBhY2l0eTsJLyogQ2hhcmdlciBjYXBhY2l0eSAqLworCXU4ICBjcm50OwkvKiBRdWljayBjaGFyZ2UgY3VycmVudCB2YWx1ZSovCisJdTggIHZvbHQ7CS8qIEZpbmUgYWRqdXN0bWVudCBvZiBjb25zdGFudCBjaGFyZ2Ugdm9sdGFnZSAqLworCXU4ICBwcm90OwkvKiBDSFJHUFJPVCByZWdpc3RlciB2YWx1ZSAqLworCXU4ICBwcm90MjsJLyogQ0hSR1BST1QxIHJlZ2lzdGVyIHZhbHVlICovCisJdTggIHRpbWVyOwkvKiBDaGFyZ2luZyB0aW1lciAqLworfTsKKworI2RlZmluZSBJUENNU0dfQkFUVEVSWQkJMHhFRgorCisvKiBCYXR0ZXJ5IGNvdWxvbWIgY291bnRlciBhY2N1bXVsYXRvciBjb21tYW5kcyAqLworI2RlZmluZSBJUENfQ01EX0NDX1dSCQkgIDAgLyogVXBkYXRlIGNvdWxvbWIgY291bnRlciB2YWx1ZSAqLworI2RlZmluZSBJUENfQ01EX0NDX1JECQkgIDEgLyogUmVhZCBjb3Vsb21iIGNvdW50ZXIgdmFsdWUgKi8KKyNkZWZpbmUgSVBDX0NNRF9CQVRURVJZX1BST1BFUlRZICAyIC8qIFJlYWQgQmF0dGVyeSBwcm9wZXJ0eSAqLworCisvKioKKyAqCXBtaWNfc2N1X2lwY19iYXR0ZXJ5X2NjX3JlYWQJLQlyZWFkIGJhdHRlcnkgY2MKKyAqCUB2YWx1ZTogYmF0dGVyeSBjb3Vsb21iIGNvdW50ZXIgcmVhZAorICoKKyAqCVJlYWRzIHRoZSBiYXR0ZXJ5IGNvdWxvdW1iIGNvdW50ZXIgdmFsdWUsIHJldHVybnMgMCBvbiBzdWNjZXNzLCBvcgorICoJYW4gZXJyb3IgY29kZQorICoKKyAqCVRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwLiBMb2NraW5nIGZvciBTQ1UgYWNjZXNzZXMgaXMgaGFuZGxlZCBmb3IKKyAqCXRoZSBjYWxsZXIuCisgKi8KK3N0YXRpYyBpbnQgcG1pY19zY3VfaXBjX2JhdHRlcnlfY2NfcmVhZCh1MzIgKnZhbHVlKQoreworCXJldHVybiBpbnRlbF9zY3VfaXBjX2NvbW1hbmQoSVBDTVNHX0JBVFRFUlksIElQQ19DTURfQ0NfUkQsCisJCQkJCU5VTEwsIDAsIHZhbHVlLCAxKTsKK30KKworLyoqCisgKglwbWljX3NjdV9pcGNfYmF0dGVyeV9wcm9wZXJ0eV9nZXQJLQlmZXRjaCBwcm9wZXJ0aWVzCisgKglAcHJvcDogYmF0dGVyeSBwcm9wZXJ0aWVzCisgKgorICoJUmV0cmlldmUgdGhlIGJhdHRlcnkgcHJvcGVydGllcyBmcm9tIHRoZSBwb3dlciBtYW5hZ2VtZW50CisgKgorICoJVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAuIExvY2tpbmcgZm9yIFNDVSBhY2Nlc3NlcyBpcyBoYW5kbGVkIGZvcgorICoJdGhlIGNhbGxlci4KKyAqLworc3RhdGljIGludCBwbWljX3NjdV9pcGNfYmF0dGVyeV9wcm9wZXJ0eV9nZXQoc3RydWN0IGJhdHRlcnlfcHJvcGVydHkgKnByb3ApCit7CisJdTMyIGRhdGFbM107CisJdTggKnAgPSAodTggKikmZGF0YVsxXTsKKwlpbnQgZXJyID0gaW50ZWxfc2N1X2lwY19jb21tYW5kKElQQ01TR19CQVRURVJZLAorCQkJCUlQQ19DTURfQkFUVEVSWV9QUk9QRVJUWSwgTlVMTCwgMCwgZGF0YSwgMyk7CisKKwlwcm9wLT5jYXBhY2l0eSA9IGRhdGFbMF07CisJcHJvcC0+Y3JudCA9ICpwKys7CisJcHJvcC0+dm9sdCA9ICpwKys7CisJcHJvcC0+cHJvdCA9ICpwKys7CisJcHJvcC0+cHJvdDIgPSAqcCsrOworCXByb3AtPnRpbWVyID0gKnArKzsKKworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICoJcG1pY19zY3VfaXBjX3NldF9jaGFyZ2VyCS0Jc2V0IGNoYXJnZXIKKyAqCUBjaGFyZ2VyOiBjaGFyZ2VyIHRvIHNlbGVjdAorICoKKyAqCVN3aXRjaCB0aGUgY2hhcmdpbmcgbW9kZSBmb3IgdGhlIFNDVQorICovCisKK3N0YXRpYyBpbnQgcG1pY19zY3VfaXBjX3NldF9jaGFyZ2VyKGludCBjaGFyZ2VyKQoreworCXJldHVybiBpbnRlbF9zY3VfaXBjX3NpbXBsZV9jb21tYW5kKElQQ01TR19CQVRURVJZLCBjaGFyZ2VyKTsKK30KKworLyoqCisgKiBwbWljX2JhdHRlcnlfbG9nX2V2ZW50IC0gbG9nIGJhdHRlcnkgZXZlbnRzCisgKiBAZXZlbnQ6IGJhdHRlcnkgZXZlbnQgdG8gYmUgbG9nZ2VkCisgKiBDb250ZXh0OiBjYW4gc2xlZXAKKyAqCisgKiBUaGVyZSBhcmUgbXVsdGlwbGUgYmF0dGVyeSBldmVudHMgd2hpY2ggbWF5IGJlIG9mIGludGVyZXN0IHRvIHVzZXJzOworICogdGhpcyBiYXR0ZXJ5IGZ1bmN0aW9uIGxvZ3MgdGhlIGRpZmZlcmVudCBiYXR0ZXJ5IGV2ZW50cyBvbnRvIHRoZQorICoga2VybmVsIGxvZyBtZXNzYWdlcy4KKyAqLworc3RhdGljIHZvaWQgcG1pY19iYXR0ZXJ5X2xvZ19ldmVudChlbnVtIGJhdHRfZXZlbnQgZXZlbnQpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAicG1pYy1iYXR0ZXJ5OiAiKTsKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCQVRUX0VWRU5UX0JBVE9WUF9FWENQVDoKKwkJcHJpbnRrKEtFUk5fQ09OVCAiYmF0dGVyeSBvdmVydm9sdGFnZSBjb25kaXRpb25cbiIpOworCQlicmVhazsKKwljYXNlIEJBVFRfRVZFTlRfVVNCT1ZQX0VYQ1BUOgorCQlwcmludGsoS0VSTl9DT05UICJ1c2IgY2hhcmdlciBvdmVydm9sdGFnZSBjb25kaXRpb25cbiIpOworCQlicmVhazsKKwljYXNlIEJBVFRfRVZFTlRfVEVNUF9FWENQVDoKKwkJcHJpbnRrKEtFUk5fQ09OVCAiaGlnaCBiYXR0ZXJ5IHRlbXBlcmF0dXJlIGNvbmRpdGlvblxuIik7CisJCWJyZWFrOworCWNhc2UgQkFUVF9FVkVOVF9EQ0xNVF9FWENQVDoKKwkJcHJpbnRrKEtFUk5fQ09OVCAib3ZlciBiYXR0ZXJ5IGNoYXJnZSBjdXJyZW50IGNvbmRpdGlvblxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0NPTlQgImNoYXJnZXIvYmF0dGVyeSBleGNlcHRpb24gJWRcbiIsIGV2ZW50KTsKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIHBtaWNfYmF0dGVyeV9yZWFkX3N0YXR1cyAtIHJlYWQgYmF0dGVyeSBzdGF0dXMgaW5mb3JtYXRpb24KKyAqIEBwYmk6IGRldmljZSBpbmZvIHN0cnVjdHVyZSB0byB1cGRhdGUgdGhlIHJlYWQgaW5mb3JtYXRpb24KKyAqIENvbnRleHQ6IGNhbiBzbGVlcAorICoKKyAqIFBNSUMgcG93ZXIgc291cmNlIGluZm9ybWF0aW9uIG5lZWQgdG8gYmUgdXBkYXRlZCBiYXNlZCBvbiB0aGUgZGF0YSByZWFkCisgKiBmcm9tIHRoZSBQTUlDIGJhdHRlcnkgcmVnaXN0ZXJzLgorICoKKyAqLworc3RhdGljIHZvaWQgcG1pY19iYXR0ZXJ5X3JlYWRfc3RhdHVzKHN0cnVjdCBwbWljX3Bvd2VyX21vZHVsZV9pbmZvICpwYmkpCit7CisJdW5zaWduZWQgaW50IHVwZGF0ZV90aW1lX2ludHJ2bDsKKwl1bnNpZ25lZCBpbnQgY2hyZ192YWw7CisJdTMyIGNjdmFsOworCXU4IHI4OworCXN0cnVjdCBiYXR0ZXJ5X3Byb3BlcnR5IGJhdHRfcHJvcDsKKwlpbnQgYmF0dF9wcmVzZW50ID0gMDsKKwlpbnQgdXNiX3ByZXNlbnQgPSAwOworCWludCBiYXR0X2V4Y2VwdGlvbiA9IDA7CisKKwkvKiBtYWtlIHN1cmUgdGhlIGxhc3QgYmF0dF9zdGF0dXMgcmVhZCBoYXBwZW5lZCBkZWxheV90aW1lIGJlZm9yZSAqLworCWlmIChwYmktPnVwZGF0ZV90aW1lICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHBiaS0+dXBkYXRlX3RpbWUgKworCQkJCQkJbXNlY3NfdG9famlmZmllcyhkZWxheV90aW1lKSkpCisJCXJldHVybjsKKworCXVwZGF0ZV90aW1lX2ludHJ2bCA9IGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtCXBiaS0+dXBkYXRlX3RpbWUpOworCXBiaS0+dXBkYXRlX3RpbWUgPSBqaWZmaWVzOworCisJLyogcmVhZCBjb3Vsb21iIGNvdW50ZXIgcmVnaXN0ZXJzIGFuZCBzY2hyZ2ludCByZWdpc3RlciAqLworCWlmIChwbWljX3NjdV9pcGNfYmF0dGVyeV9jY19yZWFkKCZjY3ZhbCkpIHsKKwkJZGV2X3dhcm4ocGJpLT5kZXYsICIlcygpOiBpcGMgY29uZmlnIGNtZCBmYWlsZWRcbiIsCisJCQkJCQkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpbnRlbF9zY3VfaXBjX2lvcmVhZDgoUE1JQ19CQVRUX0NIUl9TQ0hSR0lOVF9BRERSLCAmcjgpKSB7CisJCWRldl93YXJuKHBiaS0+ZGV2LCAiJXMoKTogaXBjIHBtaWMgcmVhZCBmYWlsZWRcbiIsCisJCQkJCQkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogc2V0IHBtaWNfcG93ZXJfbW9kdWxlX2luZm8gbWVtYmVycyBiYXNlZCBvbiBwbWljIHJlZ2lzdGVyIHZhbHVlcworCSAqIHJlYWQuCisJICovCisKKwkvKiBzZXQgYmF0dF9pc19wcmVzZW50ICovCisJaWYgKHI4ICYgUE1JQ19CQVRUX0NIUl9TQkFUREVUX01BU0spIHsKKwkJcGJpLT5iYXR0X2lzX3ByZXNlbnQgPSBQTUlDX0JBVFRfUFJFU0VOVDsKKwkJYmF0dF9wcmVzZW50ID0gMTsKKwl9IGVsc2UgeworCQlwYmktPmJhdHRfaXNfcHJlc2VudCA9IFBNSUNfQkFUVF9OT1RfUFJFU0VOVDsKKwkJcGJpLT5iYXR0X2hlYWx0aCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfVU5LTk9XTjsKKwkJcGJpLT5iYXR0X3N0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfVU5LTk9XTjsKKwl9CisKKwkvKiBzZXQgYmF0dF9oZWFsdGggKi8KKwlpZiAoYmF0dF9wcmVzZW50KSB7CisJCWlmIChyOCAmIFBNSUNfQkFUVF9DSFJfU0JBVE9WUF9NQVNLKSB7CisJCQlwYmktPmJhdHRfaGVhbHRoID0gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSVk9MVEFHRTsKKwkJCXBiaS0+YmF0dF9zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX05PVF9DSEFSR0lORzsKKwkJCXBtaWNfYmF0dGVyeV9sb2dfZXZlbnQoQkFUVF9FVkVOVF9CQVRPVlBfRVhDUFQpOworCQkJYmF0dF9leGNlcHRpb24gPSAxOworCQl9IGVsc2UgaWYgKHI4ICYgUE1JQ19CQVRUX0NIUl9TVEVNUF9NQVNLKSB7CisJCQlwYmktPmJhdHRfaGVhbHRoID0gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSSEVBVDsKKwkJCXBiaS0+YmF0dF9zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX05PVF9DSEFSR0lORzsKKwkJCXBtaWNfYmF0dGVyeV9sb2dfZXZlbnQoQkFUVF9FVkVOVF9URU1QX0VYQ1BUKTsKKwkJCWJhdHRfZXhjZXB0aW9uID0gMTsKKwkJfSBlbHNlIHsKKwkJCXBiaS0+YmF0dF9oZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0Q7CisJCQlpZiAocjggJiBQTUlDX0JBVFRfQ0hSX1NEQ0xNVF9NQVNLKSB7CisJCQkJLyogUE1JQyB3aWxsIGNoYW5nZSBjaGFyZ2luZyBjdXJyZW50IGF1dG9tYXRpY2FsbHkgKi8KKwkJCQlwbWljX2JhdHRlcnlfbG9nX2V2ZW50KEJBVFRfRVZFTlRfRENMTVRfRVhDUFQpOworCQkJfQorCQl9CisJfQorCisJLyogc2V0IHVzYl9pc19wcmVzZW50ICovCisJaWYgKHI4ICYgUE1JQ19CQVRUX0NIUl9TVVNCREVUX01BU0spIHsKKwkJcGJpLT51c2JfaXNfcHJlc2VudCA9IFBNSUNfVVNCX1BSRVNFTlQ7CisJCXVzYl9wcmVzZW50ID0gMTsKKwl9IGVsc2UgeworCQlwYmktPnVzYl9pc19wcmVzZW50ID0gUE1JQ19VU0JfTk9UX1BSRVNFTlQ7CisJCXBiaS0+dXNiX2hlYWx0aCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfVU5LTk9XTjsKKwl9CisKKwlpZiAodXNiX3ByZXNlbnQpIHsKKwkJaWYgKHI4ICYgUE1JQ19CQVRUX0NIUl9TVVNCT1ZQX01BU0spIHsKKwkJCXBiaS0+dXNiX2hlYWx0aCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUlZPTFRBR0U7CisJCQlwbWljX2JhdHRlcnlfbG9nX2V2ZW50KEJBVFRfRVZFTlRfVVNCT1ZQX0VYQ1BUKTsKKwkJfSBlbHNlIHsKKwkJCXBiaS0+dXNiX2hlYWx0aCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfR09PRDsKKwkJfQorCX0KKworCWNocmdfdmFsID0gY2N2YWwgJiBQTUlDX0JBVFRfQURDX0FDQ0NIUkdWQUxfTUFTSzsKKworCS8qIHNldCBiYXR0X3ByZXZfY2hhcmdlX2Z1bGwgdG8gYmF0dGVyeSBjYXBhY2l0eSB0aGUgZmlyc3QgdGltZSAqLworCWlmICghcGJpLT5pc19kZXZfaW5mb191cGRhdGVkKSB7CisJCWlmIChwbWljX3NjdV9pcGNfYmF0dGVyeV9wcm9wZXJ0eV9nZXQoJmJhdHRfcHJvcCkpIHsKKwkJCWRldl93YXJuKHBiaS0+ZGV2LCAiJXMoKTogaXBjIGNvbmZpZyBjbWQgZmFpbGVkXG4iLAorCQkJCQkJCQlfX2Z1bmNfXyk7CisJCQlyZXR1cm47CisJCX0KKwkJcGJpLT5iYXR0X3ByZXZfY2hhcmdlX2Z1bGwgPSBiYXR0X3Byb3AuY2FwYWNpdHk7CisJfQorCisJLyogc2V0IGJhdHRfc3RhdHVzICovCisJaWYgKGJhdHRfcHJlc2VudCAmJiAhYmF0dF9leGNlcHRpb24pIHsKKwkJaWYgKHI4ICYgUE1JQ19CQVRUX0NIUl9TQ09NUF9NQVNLKSB7CisJCQlwYmktPmJhdHRfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19GVUxMOworCQkJcGJpLT5iYXR0X3ByZXZfY2hhcmdlX2Z1bGwgPSBjaHJnX3ZhbDsKKwkJfSBlbHNlIGlmIChjY3ZhbCAmIFBNSUNfQkFUVF9BRENfQUNDQ0hSR19NQVNLKSB7CisJCQlwYmktPmJhdHRfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORzsKKwkJfSBlbHNlIHsKKwkJCXBiaS0+YmF0dF9zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOworCQl9CisJfQorCisJLyogc2V0IGJhdHRfY2hhcmdlX3JhdGUgKi8KKwlpZiAocGJpLT5pc19kZXZfaW5mb191cGRhdGVkICYmIGJhdHRfcHJlc2VudCAmJiAhYmF0dF9leGNlcHRpb24pIHsKKwkJaWYgKHBiaS0+YmF0dF9zdGF0dXMgPT0gUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORykgeworCQkJaWYgKHBiaS0+YmF0dF9jaGFyZ2Vfbm93IC0gY2hyZ192YWwpIHsKKwkJCQlwYmktPmJhdHRfY2hhcmdlX3JhdGUgPSAoKHBiaS0+YmF0dF9jaGFyZ2Vfbm93IC0KKwkJCQkJY2hyZ192YWwpICogMTAwMCAqIDYwKSAvCisJCQkJCXVwZGF0ZV90aW1lX2ludHJ2bDsKKwkJCX0KKwkJfSBlbHNlIGlmIChwYmktPmJhdHRfc3RhdHVzID09IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkcpIHsKKwkJCWlmIChjaHJnX3ZhbCAtIHBiaS0+YmF0dF9jaGFyZ2Vfbm93KSB7CisJCQkJcGJpLT5iYXR0X2NoYXJnZV9yYXRlID0gKChjaHJnX3ZhbCAtCisJCQkJCXBiaS0+YmF0dF9jaGFyZ2Vfbm93KSAqIDEwMDAgKiA2MCkgLworCQkJCQl1cGRhdGVfdGltZV9pbnRydmw7CisJCQl9CisJCX0gZWxzZQorCQkJcGJpLT5iYXR0X2NoYXJnZV9yYXRlID0gMDsKKwl9IGVsc2UgeworCQlwYmktPmJhdHRfY2hhcmdlX3JhdGUgPSAtMTsKKwl9CisKKwkvKiBiYXR0X2NoYXJnZV9ub3cgKi8KKwlpZiAoYmF0dF9wcmVzZW50ICYmICFiYXR0X2V4Y2VwdGlvbikKKwkJcGJpLT5iYXR0X2NoYXJnZV9ub3cgPSBjaHJnX3ZhbDsKKwllbHNlCisJCXBiaS0+YmF0dF9jaGFyZ2Vfbm93ID0gLTE7CisKKwlwYmktPmlzX2Rldl9pbmZvX3VwZGF0ZWQgPSBQTUlDX0JBVFRfRFJWX0lORk9fVVBEQVRFRDsKK30KKworLyoqCisgKiBwbWljX3VzYl9nZXRfcHJvcGVydHkgLSB1c2IgcG93ZXIgc291cmNlIGdldCBwcm9wZXJ0eQorICogQHBzeTogdXNiIHBvd2VyIHN1cHBseSBjb250ZXh0CisgKiBAcHNwOiB1c2IgcG93ZXIgc291cmNlIHByb3BlcnR5CisgKiBAdmFsOiB1c2IgcG93ZXIgc291cmNlIHByb3BlcnR5IHZhbHVlCisgKiBDb250ZXh0OiBjYW4gc2xlZXAKKyAqCisgKiBQTUlDIHVzYiBwb3dlciBzb3VyY2UgcHJvcGVydHkgbmVlZHMgdG8gYmUgcHJvdmlkZWQgdG8gcG93ZXJfc3VwcGx5CisgKiBzdWJzeXRlbSBmb3IgaXQgdG8gcHJvdmlkZSB0aGUgaW5mb3JtYXRpb24gdG8gdXNlcnMuCisgKi8KK3N0YXRpYyBpbnQgcG1pY191c2JfZ2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKKwkJCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCisJCQkJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzdHJ1Y3QgcG1pY19wb3dlcl9tb2R1bGVfaW5mbyAqcGJpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CisKKwkvKiB1cGRhdGUgcG1pY19wb3dlcl9tb2R1bGVfaW5mbyBtZW1iZXJzICovCisJcG1pY19iYXR0ZXJ5X3JlYWRfc3RhdHVzKHBiaSk7CisKKwlzd2l0Y2ggKHBzcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDoKKwkJdmFsLT5pbnR2YWwgPSBwYmktPnVzYl9pc19wcmVzZW50OworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSDoKKwkJdmFsLT5pbnR2YWwgPSBwYmktPnVzYl9oZWFsdGg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbUFTdG91QWgodW5zaWduZWQgbG9uZyB2KQoreworCS8qIHNlY29uZHMgdG8gaG91cnMsIG1BIHRvIMK1QSAqLworCXJldHVybiAodiAqIDEwMDApIC8gMzYwMDsKK30KKworLyoqCisgKiBwbWljX2JhdHRlcnlfZ2V0X3Byb3BlcnR5IC0gYmF0dGVyeSBwb3dlciBzb3VyY2UgZ2V0IHByb3BlcnR5CisgKiBAcHN5OiBiYXR0ZXJ5IHBvd2VyIHN1cHBseSBjb250ZXh0CisgKiBAcHNwOiBiYXR0ZXJ5IHBvd2VyIHNvdXJjZSBwcm9wZXJ0eQorICogQHZhbDogYmF0dGVyeSBwb3dlciBzb3VyY2UgcHJvcGVydHkgdmFsdWUKKyAqIENvbnRleHQ6IGNhbiBzbGVlcAorICoKKyAqIFBNSUMgYmF0dGVyeSBwb3dlciBzb3VyY2UgcHJvcGVydHkgbmVlZHMgdG8gYmUgcHJvdmlkZWQgdG8gcG93ZXJfc3VwcGx5CisgKiBzdWJzeXRlbSBmb3IgaXQgdG8gcHJvdmlkZSB0aGUgaW5mb3JtYXRpb24gdG8gdXNlcnMuCisgKi8KK3N0YXRpYyBpbnQgcG1pY19iYXR0ZXJ5X2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJCQkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCQkJCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJc3RydWN0IHBtaWNfcG93ZXJfbW9kdWxlX2luZm8gKnBiaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOworCisJLyogdXBkYXRlIHBtaWNfcG93ZXJfbW9kdWxlX2luZm8gbWVtYmVycyAqLworCXBtaWNfYmF0dGVyeV9yZWFkX3N0YXR1cyhwYmkpOworCisJc3dpdGNoIChwc3ApIHsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKKwkJdmFsLT5pbnR2YWwgPSBwYmktPmJhdHRfc3RhdHVzOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSDoKKwkJdmFsLT5pbnR2YWwgPSBwYmktPmJhdHRfaGVhbHRoOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ6CisJCXZhbC0+aW50dmFsID0gcGJpLT5iYXR0X2lzX3ByZXNlbnQ7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVzoKKwkJdmFsLT5pbnR2YWwgPSBtQVN0b3VBaChwYmktPmJhdHRfY2hhcmdlX25vdyk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTEw6CisJCXZhbC0+aW50dmFsID0gbUFTdG91QWgocGJpLT5iYXR0X3ByZXZfY2hhcmdlX2Z1bGwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwbWljX2JhdHRlcnlfbW9uaXRvciAtIG1vbml0b3IgYmF0dGVyeSBzdGF0dXMKKyAqIEB3b3JrOiB3b3JrIHN0cnVjdHVyZQorICogQ29udGV4dDogY2FuIHNsZWVwCisgKgorICogUE1JQyBiYXR0ZXJ5IHN0YXR1cyBuZWVkcyB0byBiZSBtb25pdG9yZWQgZm9yIGFueSBjaGFuZ2UKKyAqIGFuZCBpbmZvcm1hdGlvbiBuZWVkcyB0byBiZSBmcmVxdWVudGx5IHVwZGF0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIHBtaWNfYmF0dGVyeV9tb25pdG9yKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgcG1pY19wb3dlcl9tb2R1bGVfaW5mbyAqcGJpID0gY29udGFpbmVyX29mKHdvcmssCisJCQlzdHJ1Y3QgcG1pY19wb3dlcl9tb2R1bGVfaW5mbywgbW9uaXRvcl9iYXR0ZXJ5LndvcmspOworCisJLyogdXBkYXRlIHBtaWNfcG93ZXJfbW9kdWxlX2luZm8gbWVtYmVycyAqLworCXBtaWNfYmF0dGVyeV9yZWFkX3N0YXR1cyhwYmkpOworCXF1ZXVlX2RlbGF5ZWRfd29yayhwYmktPm1vbml0b3Jfd3F1ZXVlLCAmcGJpLT5tb25pdG9yX2JhdHRlcnksIEhaICogMTApOworfQorCisvKioKKyAqIHBtaWNfYmF0dGVyeV9zZXRfY2hhcmdlciAtIHNldCBiYXR0ZXJ5IGNoYXJnZXIKKyAqIEBwYmk6IGRldmljZSBpbmZvIHN0cnVjdHVyZQorICogQGNocmc6IGNoYXJnZSBtb2RlIHRvIHNldCBiYXR0ZXJ5IGNoYXJnZXIgaW4KKyAqIENvbnRleHQ6IGNhbiBzbGVlcAorICoKKyAqIFBNSUMgYmF0dGVyeSBjaGFyZ2VyIG5lZWRzIHRvIGJlIGVuYWJsZWQgYmFzZWQgb24gdGhlIHVzYiBjaGFyZ2UKKyAqIGNhcGFiaWxpdGllcyBjb25uZWN0ZWQgdG8gdGhlIHBsYXRmb3JtLgorICovCitzdGF0aWMgaW50IHBtaWNfYmF0dGVyeV9zZXRfY2hhcmdlcihzdHJ1Y3QgcG1pY19wb3dlcl9tb2R1bGVfaW5mbyAqcGJpLAorCQkJCQkJZW51bSBiYXR0X2NoYXJnZV90eXBlIGNocmcpCit7CisJaW50IHJldHZhbDsKKworCS8qIHNldCB1c2JsbXQgYml0cyBhbmQgY2hyZ2NudGwgcmVnaXN0ZXIgYml0cyBhcHByb3ByaWF0ZWx5ICovCisJc3dpdGNoIChjaHJnKSB7CisJY2FzZSBCQVRUX1VTQk9UR181MDBNQV9DSEFSR0U6CisJCXJldHZhbCA9IHBtaWNfc2N1X2lwY19zZXRfY2hhcmdlcihQTUlDX0JBVFRfQ0hSX0lQQ19GQ0hSR19TVUJJRCk7CisJCWJyZWFrOworCWNhc2UgQkFUVF9VU0JPVEdfVFJJQ0tMRV9DSEFSR0U6CisJCXJldHZhbCA9IHBtaWNfc2N1X2lwY19zZXRfY2hhcmdlcihQTUlDX0JBVFRfQ0hSX0lQQ19UQ0hSR19TVUJJRCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl93YXJuKHBiaS0+ZGV2LCAiJXMoKTogb3V0IG9mIHJhbmdlIHVzYiBjaGFyZ2VyICIKKwkJCQkJCSJjaGFyZ2UgZGV0ZWN0ZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHJldHZhbCkgeworCQlkZXZfd2FybihwYmktPmRldiwgIiVzKCk6IGlwYyBwbWljIHJlYWQgZmFpbGVkXG4iLAorCQkJCQkJCQlfX2Z1bmNfXyk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcG1pY19iYXR0ZXJ5X2ludGVycnVwdF9oYW5kbGVyIC0gcG1pYyBiYXR0ZXJ5IGludGVycnVwdCBoYW5kbGVyCisgKiBDb250ZXh0OiBpbnRlcnJ1cHQgY29udGV4dAorICoKKyAqIFBNSUMgYmF0dGVyeSBpbnRlcnJ1cHQgaGFuZGxlciB3aGljaCB3aWxsIGJlIGNhbGxlZCB3aXRoIGVpdGhlcgorICogYmF0dGVyeSBmdWxsIGNvbmRpdGlvbiBvY2N1cnMgb3IgdXNiIG90ZyAmIGJhdHRlcnkgY29ubmVjdAorICogY29uZGl0aW9uIG9jY3Vycy4KKyAqLworc3RhdGljIGlycXJldHVybl90IHBtaWNfYmF0dGVyeV9pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaWQsIHZvaWQgKmRldikKK3sKKwlzdHJ1Y3QgcG1pY19wb3dlcl9tb2R1bGVfaW5mbyAqcGJpID0gZGV2OworCisJc2NoZWR1bGVfd29yaygmcGJpLT5oYW5kbGVyKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBwbWljX2JhdHRlcnlfaGFuZGxlX2ludHJwdCAtIHBtaWMgYmF0dGVyeSBzZXJ2aWNlIGludGVycnVwdAorICogQHdvcms6IHdvcmsgc3RydWN0dXJlCisgKiBDb250ZXh0OiBjYW4gc2xlZXAKKyAqCisgKiBQTUlDIGJhdHRlcnkgbmVlZHMgdG8gZWl0aGVyIHVwZGF0ZSB0aGUgYmF0dGVyeSBzdGF0dXMgYXMgZnVsbAorICogaWYgaXQgZGV0ZWN0cyBiYXR0ZXJ5IGZ1bGwgY29uZGl0aW9uIGNhdXNlZCB0aGUgaW50ZXJydXB0IG9yIG5lZWRzCisgKiB0byBlbmFibGUgYmF0dGVyeSBjaGFyZ2VyIGlmIGl0IGRldGVjdHMgdXNiIGFuZCBiYXR0ZXJ5IGRldGVjdAorICogY2F1c2VkIHRoZSBzb3VyY2Ugb2YgaW50ZXJydXB0LgorICovCitzdGF0aWMgdm9pZCBwbWljX2JhdHRlcnlfaGFuZGxlX2ludHJwdChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHBtaWNfcG93ZXJfbW9kdWxlX2luZm8gKnBiaSA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQkJCXN0cnVjdCBwbWljX3Bvd2VyX21vZHVsZV9pbmZvLCBoYW5kbGVyKTsKKwllbnVtIGJhdHRfY2hhcmdlX3R5cGUgY2hyZzsKKwl1OCByODsKKworCWlmIChpbnRlbF9zY3VfaXBjX2lvcmVhZDgoUE1JQ19CQVRUX0NIUl9TQ0hSR0lOVF9BRERSLCAmcjgpKSB7CisJCWRldl93YXJuKHBiaS0+ZGV2LCAiJXMoKTogaXBjIHBtaWMgcmVhZCBmYWlsZWRcbiIsCisJCQkJCQkJCV9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwkvKiBmaW5kIHRoZSBjYXVzZSBvZiB0aGUgaW50ZXJydXB0ICovCisJaWYgKHI4ICYgUE1JQ19CQVRUX0NIUl9TQkFUREVUX01BU0spIHsKKwkJcGJpLT5iYXR0X2lzX3ByZXNlbnQgPSBQTUlDX0JBVFRfUFJFU0VOVDsKKwl9IGVsc2UgeworCQlwYmktPmJhdHRfaXNfcHJlc2VudCA9IFBNSUNfQkFUVF9OT1RfUFJFU0VOVDsKKwkJcGJpLT5iYXR0X2hlYWx0aCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfVU5LTk9XTjsKKwkJcGJpLT5iYXR0X3N0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfVU5LTk9XTjsKKwkJcmV0dXJuOworCX0KKworCWlmIChyOCAmIFBNSUNfQkFUVF9DSFJfRVhDUFRfTUFTSykgeworCQlwYmktPmJhdHRfaGVhbHRoID0gUE9XRVJfU1VQUExZX0hFQUxUSF9VTktOT1dOOworCQlwYmktPmJhdHRfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19OT1RfQ0hBUkdJTkc7CisJCXBiaS0+dXNiX2hlYWx0aCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfVU5LTk9XTjsKKwkJcG1pY19iYXR0ZXJ5X2xvZ19ldmVudChCQVRUX0VWRU5UX0VYQ1BUKTsKKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCXBiaS0+YmF0dF9oZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0Q7CisJCXBiaS0+dXNiX2hlYWx0aCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfR09PRDsKKwl9CisKKwlpZiAocjggJiBQTUlDX0JBVFRfQ0hSX1NDT01QX01BU0spIHsKKwkJdTMyIGNjdmFsOworCQlwYmktPmJhdHRfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19GVUxMOworCisJCWlmIChwbWljX3NjdV9pcGNfYmF0dGVyeV9jY19yZWFkKCZjY3ZhbCkpIHsKKwkJCWRldl93YXJuKHBiaS0+ZGV2LCAiJXMoKTogaXBjIGNvbmZpZyBjbWQgIgorCQkJCQkJCSJmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybjsKKwkJfQorCQlwYmktPmJhdHRfcHJldl9jaGFyZ2VfZnVsbCA9IGNjdmFsICYKKwkJCQkJCVBNSUNfQkFUVF9BRENfQUNDQ0hSR1ZBTF9NQVNLOworCQlyZXR1cm47CisJfQorCisJaWYgKHI4ICYgUE1JQ19CQVRUX0NIUl9TVVNCREVUX01BU0spIHsKKwkJcGJpLT51c2JfaXNfcHJlc2VudCA9IFBNSUNfVVNCX1BSRVNFTlQ7CisJfSBlbHNlIHsKKwkJcGJpLT51c2JfaXNfcHJlc2VudCA9IFBNSUNfVVNCX05PVF9QUkVTRU5UOworCQlwYmktPnVzYl9oZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOS05PV047CisJCXJldHVybjsKKwl9CisKKwkvKiBzZXR1cCBiYXR0ZXJ5IGNoYXJnaW5nICovCisKKyNpZiAwCisJLyogY2hlY2sgdXNiIG90ZyBwb3dlciBjYXBhYmlsaXR5IGFuZCBzZXQgY2hhcmdlciBhY2NvcmRpbmdseSAqLworCXJldHZhbCA9IGxhbmd3ZWxsX3VkY19tYXhwb3dlcigmcG93ZXIpOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X3dhcm4ocGJpLT5kZXYsCisJCSAgICAiJXMoKTogdXNiIG90ZyBwb3dlciBxdWVyeSBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVkXG4iLAorCQkJX19mdW5jX18sIHJldHZhbCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAocG93ZXIgPj0gNTAwKQorCQljaHJnID0gQkFUVF9VU0JPVEdfNTAwTUFfQ0hBUkdFOworCWVsc2UKKyNlbmRpZgorCQljaHJnID0gQkFUVF9VU0JPVEdfVFJJQ0tMRV9DSEFSR0U7CisKKwkvKiBlbmFibGUgYmF0dGVyeSBjaGFyZ2luZyAqLworCWlmIChwbWljX2JhdHRlcnlfc2V0X2NoYXJnZXIocGJpLCBjaHJnKSkgeworCQlkZXZfd2FybihwYmktPmRldiwKKwkJCSIlcygpOiBmYWlsZWQgdG8gc2V0IHVwIGJhdHRlcnkgY2hhcmdpbmdcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWRldl9kYmcocGJpLT5kZXYsCisJCSJwbWljLWJhdHRlcnk6ICVzKCkgLSBzZXR0aW5nIHVwIGJhdHRlcnkgY2hhcmdlciBzdWNjZXNzZnVsXG4iLAorCQkJX19mdW5jX18pOworfQorCisvKgorICogRGVzY3JpcHRpb24gb2YgcG93ZXIgc3VwcGxpZXMKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBwbWljX3VzYl9kZXNjID0geworCS5uYW1lCQk9ICJwbWljLXVzYiIsCisJLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfVVNCLAorCS5wcm9wZXJ0aWVzCT0gcG1pY191c2JfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRShwbWljX3VzYl9wcm9wcyksCisJLmdldF9wcm9wZXJ0eQk9IHBtaWNfdXNiX2dldF9wcm9wZXJ0eSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgcG1pY19iYXR0X2Rlc2MgPSB7CisJLm5hbWUJCT0gInBtaWMtYmF0dCIsCisJLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKKwkucHJvcGVydGllcwk9IHBtaWNfYmF0dGVyeV9wcm9wcywKKwkubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKHBtaWNfYmF0dGVyeV9wcm9wcyksCisJLmdldF9wcm9wZXJ0eQk9IHBtaWNfYmF0dGVyeV9nZXRfcHJvcGVydHksCit9OworCisvKioKKyAqIHBtaWNfYmF0dGVyeV9wcm9iZSAtIHBtaWMgYmF0dGVyeSBpbml0aWFsaXplCisgKiBAaXJxOiBwbWljIGJhdHRlcnkgZGV2aWNlIGlycQorICogQGRldjogcG1pYyBiYXR0ZXJ5IGRldmljZSBzdHJ1Y3R1cmUKKyAqIENvbnRleHQ6IGNhbiBzbGVlcAorICoKKyAqIFBNSUMgYmF0dGVyeSBpbml0aWFsaXplcyBpdHMgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1ZSBhbmQgb3RoZXIKKyAqIGluZnJhc3RydWN0dXJlIGNvbXBvbmVudHMgZm9yIGl0IHRvIHdvcmsgYXMgZXhwZWN0ZWQuCisgKi8KK3N0YXRpYyBpbnQgcHJvYmUoaW50IGlycSwgc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXR2YWwgPSAwOworCXN0cnVjdCBwbWljX3Bvd2VyX21vZHVsZV9pbmZvICpwYmk7CisJc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgcHN5X2NmZyA9IHt9OworCisJZGV2X2RiZyhkZXYsICJwbWljLWJhdHRlcnk6IGZvdW5kIHBtaWMgYmF0dGVyeSBkZXZpY2VcbiIpOworCisJcGJpID0ga3phbGxvYyhzaXplb2YoKnBiaSksIEdGUF9LRVJORUwpOworCWlmICghcGJpKSB7CisJCWRldl9lcnIoZGV2LCAiJXMoKTogbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iLAorCQkJCQkJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBiaS0+ZGV2ID0gZGV2OworCXBiaS0+aXJxID0gaXJxOworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIHBiaSk7CisJcHN5X2NmZy5kcnZfZGF0YSA9IHBiaTsKKworCS8qIGluaXRpYWxpemUgYWxsIHJlcXVpcmVkIGZyYW1ld29yayBiZWZvcmUgZW5hYmxpbmcgaW50ZXJydXB0cyAqLworCUlOSVRfV09SSygmcGJpLT5oYW5kbGVyLCBwbWljX2JhdHRlcnlfaGFuZGxlX2ludHJwdCk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnBiaS0+bW9uaXRvcl9iYXR0ZXJ5LCBwbWljX2JhdHRlcnlfbW9uaXRvcik7CisJcGJpLT5tb25pdG9yX3dxdWV1ZSA9IGFsbG9jX3dvcmtxdWV1ZShkZXZfbmFtZShkZXYpLCBXUV9NRU1fUkVDTEFJTSwgMCk7CisJaWYgKCFwYmktPm1vbml0b3Jfd3F1ZXVlKSB7CisJCWRldl9lcnIoZGV2LCAiJXMoKTogd3F1ZXVlIGluaXQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHZhbCA9IC1FU1JDSDsKKwkJZ290byB3cXVldWVfZmFpbGVkOworCX0KKworCS8qIHJlZ2lzdGVyIGludGVycnVwdCAqLworCXJldHZhbCA9IHJlcXVlc3RfaXJxKHBiaS0+aXJxLCBwbWljX2JhdHRlcnlfaW50ZXJydXB0X2hhbmRsZXIsCisJCQkJCQkJMCwgRFJJVkVSX05BTUUsIHBiaSk7CisJaWYgKHJldHZhbCkgeworCQlkZXZfZXJyKGRldiwgIiVzKCk6IGNhbm5vdCBnZXQgSVJRXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gcmVxdWVzdGlycV9mYWlsZWQ7CisJfQorCisJLyogcmVnaXN0ZXIgcG1pYy1iYXR0IHdpdGggcG93ZXIgc3VwcGx5IHN1YnN5c3RlbSAqLworCXBiaS0+YmF0dCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcihkZXYsICZwbWljX3VzYl9kZXNjLCAmcHN5X2NmZyk7CisJaWYgKElTX0VSUihwYmktPmJhdHQpKSB7CisJCWRldl9lcnIoZGV2LAorCQkJIiVzKCk6IGZhaWxlZCB0byByZWdpc3RlciBwbWljIGJhdHRlcnkgZGV2aWNlIHdpdGggcG93ZXIgc3VwcGx5IHN1YnN5c3RlbVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCXJldHZhbCA9IFBUUl9FUlIocGJpLT5iYXR0KTsKKwkJZ290byBwb3dlcl9yZWdfZmFpbGVkOworCX0KKworCWRldl9kYmcoZGV2LCAicG1pYy1iYXR0ZXJ5OiAlcygpIC0gcG1pYyBiYXR0ZXJ5IGRldmljZSAiCisJCSJyZWdpc3RyYXRpb24gd2l0aCBwb3dlciBzdXBwbHkgc3Vic3lzdGVtIHN1Y2Nlc3NmdWxcbiIsCisJCV9fZnVuY19fKTsKKworCXF1ZXVlX2RlbGF5ZWRfd29yayhwYmktPm1vbml0b3Jfd3F1ZXVlLCAmcGJpLT5tb25pdG9yX2JhdHRlcnksIEhaICogMSk7CisKKwkvKiByZWdpc3RlciBwbWljLXVzYiB3aXRoIHBvd2VyIHN1cHBseSBzdWJzeXN0ZW0gKi8KKwlwYmktPnVzYiA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcihkZXYsICZwbWljX2JhdHRfZGVzYywgJnBzeV9jZmcpOworCWlmIChJU19FUlIocGJpLT51c2IpKSB7CisJCWRldl9lcnIoZGV2LAorCQkJIiVzKCk6IGZhaWxlZCB0byByZWdpc3RlciBwbWljIHVzYiBkZXZpY2Ugd2l0aCBwb3dlciBzdXBwbHkgc3Vic3lzdGVtXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJcmV0dmFsID0gUFRSX0VSUihwYmktPnVzYik7CisJCWdvdG8gcG93ZXJfcmVnX2ZhaWxlZF8xOworCX0KKworCWlmIChkZWJ1ZykKKwkJcHJpbnRrKEtFUk5fSU5GTyAicG1pYy1iYXR0ZXJ5OiAlcygpIC0gcG1pYyB1c2IgZGV2aWNlICIKKwkJCSJyZWdpc3RyYXRpb24gd2l0aCBwb3dlciBzdXBwbHkgc3Vic3lzdGVtIHN1Y2Nlc3NmdWxcbiIsCisJCQlfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0dmFsOworCitwb3dlcl9yZWdfZmFpbGVkXzE6CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIocGJpLT5iYXR0KTsKK3Bvd2VyX3JlZ19mYWlsZWQ6CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwYmktPm1vbml0b3JfYmF0dGVyeSk7CityZXF1ZXN0aXJxX2ZhaWxlZDoKKwlkZXN0cm95X3dvcmtxdWV1ZShwYmktPm1vbml0b3Jfd3F1ZXVlKTsKK3dxdWV1ZV9mYWlsZWQ6CisJa2ZyZWUocGJpKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgcGxhdGZvcm1fcG1pY19iYXR0ZXJ5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIHByb2JlKHBkZXYtPmlkLCAmcGRldi0+ZGV2KTsKK30KKworLyoqCisgKiBwbWljX2JhdHRlcnlfcmVtb3ZlIC0gcG1pYyBiYXR0ZXJ5IGZpbmFsaXplCisgKiBAZGV2OiBwbWljIGJhdHRlcnkgZGV2aWNlIHN0cnVjdHVyZQorICogQ29udGV4dDogY2FuIHNsZWVwCisgKgorICogUE1JQyBiYXR0ZXJ5IGZpbmFsaXplcyBpdHMgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1ZSBhbmQgb3RoZXIKKyAqIGluZnJhc3RydWN0dXJlIGNvbXBvbmVudHMgdGhhdCBpdCBpbml0aWFsaXplZCBpbgorICogcG1pY19iYXR0ZXJ5X3Byb2JlLgorICovCisKK3N0YXRpYyBpbnQgcGxhdGZvcm1fcG1pY19iYXR0ZXJ5X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwbWljX3Bvd2VyX21vZHVsZV9pbmZvICpwYmkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWZyZWVfaXJxKHBiaS0+aXJxLCBwYmkpOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcGJpLT5tb25pdG9yX2JhdHRlcnkpOworCWRlc3Ryb3lfd29ya3F1ZXVlKHBiaS0+bW9uaXRvcl93cXVldWUpOworCisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIocGJpLT51c2IpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKHBiaS0+YmF0dCk7CisKKwljYW5jZWxfd29ya19zeW5jKCZwYmktPmhhbmRsZXIpOworCWtmcmVlKHBiaSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHBsYXRmb3JtX3BtaWNfYmF0dGVyeV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwl9LAorCS5wcm9iZSA9IHBsYXRmb3JtX3BtaWNfYmF0dGVyeV9wcm9iZSwKKwkucmVtb3ZlID0gcGxhdGZvcm1fcG1pY19iYXR0ZXJ5X3JlbW92ZSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIocGxhdGZvcm1fcG1pY19iYXR0ZXJ5X2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIk5pdGhpc2ggTWFoYWxpbmdhbSA8bml0aGlzaC5tYWhhbGluZ2FtQGludGVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgTW9vcmVzdG93biBQTUlDIEJhdHRlcnkgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9pcGFxX21pY3JvX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L2lwYXFfbWljcm9fYmF0dGVyeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZjdiNzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9pcGFxX21pY3JvX2JhdHRlcnkuYwpAQCAtMCwwICsxLDMxNiBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogaDN4eHggYXRtZWwgbWljcm8gY29tcGFuaW9uIHN1cHBvcnQsIGJhdHRlcnkgc3ViZGV2aWNlCisgKiBiYXNlZCBvbiBwcmV2aW91cyBrZXJuZWwgMi40IHZlcnNpb24KKyAqIEF1dGhvciA6IEFsZXNzYW5kcm8gR2FyZGljaCA8Z3JlbWxpbkBncmVtbGluLml0PgorICogQXV0aG9yIDogTGludXMgV2FsbGVpaiA8bGludXMud2FsbGVpakBsaW5hcm8ub3JnPgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9pcGFxLW1pY3JvLmg+CisjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNkZWZpbmUgQkFUVF9QRVJJT0QgMTAwMDAwIC8qIDEwMCBzZWNvbmRzIGluIG1pbGxpc2Vjb25kcyAqLworCisjZGVmaW5lIE1JQ1JPX0JBVFRfQ0hFTV9BTEtBTElORQkweDAxCisjZGVmaW5lIE1JQ1JPX0JBVFRfQ0hFTV9OSUNECQkweDAyCisjZGVmaW5lIE1JQ1JPX0JBVFRfQ0hFTV9OSU1ICQkweDAzCisjZGVmaW5lIE1JQ1JPX0JBVFRfQ0hFTV9MSU9OCQkweDA0CisjZGVmaW5lIE1JQ1JPX0JBVFRfQ0hFTV9MSVBPTFkJCTB4MDUKKyNkZWZpbmUgTUlDUk9fQkFUVF9DSEVNX05PVF9JTlNUQUxMRUQJMHgwNgorI2RlZmluZSBNSUNST19CQVRUX0NIRU1fVU5LTk9XTgkJMHhmZgorCisjZGVmaW5lIE1JQ1JPX0JBVFRfU1RBVFVTX0hJR0gJCTB4MDEKKyNkZWZpbmUgTUlDUk9fQkFUVF9TVEFUVVNfTE9XCQkweDAyCisjZGVmaW5lIE1JQ1JPX0JBVFRfU1RBVFVTX0NSSVRJQ0FMCTB4MDQKKyNkZWZpbmUgTUlDUk9fQkFUVF9TVEFUVVNfQ0hBUkdJTkcJMHgwOAorI2RlZmluZSBNSUNST19CQVRUX1NUQVRVU19DSEFSR0VNQUlOCTB4MTAKKyNkZWZpbmUgTUlDUk9fQkFUVF9TVEFUVVNfREVBRAkJMHgyMCAvKiBCYXR0ZXJ5IHdpbGwgbm90IGNoYXJnZSAqLworI2RlZmluZSBNSUNST19CQVRUX1NUQVRVU19OT1RJTlNUQUxMRUQJMHgyMCAvKiBGb3IgZXhwYW5zaW9uIHBhY2sgYmF0dGVyaWVzICovCisjZGVmaW5lIE1JQ1JPX0JBVFRfU1RBVFVTX0ZVTEwJCTB4NDAgLyogQmF0dGVyeSBmdWxseSBjaGFyZ2VkICovCisjZGVmaW5lIE1JQ1JPX0JBVFRfU1RBVFVTX05PQkFUVEVSWQkweDgwCisjZGVmaW5lIE1JQ1JPX0JBVFRfU1RBVFVTX1VOS05PV04JMHhmZgorCitzdHJ1Y3QgbWljcm9fYmF0dGVyeSB7CisJc3RydWN0IGlwYXFfbWljcm8gKm1pY3JvOworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHVwZGF0ZTsKKwl1OCBhYzsKKwl1OCBjaGVtaXN0cnk7CisJdW5zaWduZWQgaW50IHZvbHRhZ2U7CisJdTE2IHRlbXBlcmF0dXJlOworCXU4IGZsYWc7Cit9OworCitzdGF0aWMgdm9pZCBtaWNyb19iYXR0ZXJ5X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBtaWNyb19iYXR0ZXJ5ICptYiA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQkJCXN0cnVjdCBtaWNyb19iYXR0ZXJ5LCB1cGRhdGUud29yayk7CisJc3RydWN0IGlwYXFfbWljcm9fbXNnIG1zZ19iYXR0ZXJ5ID0geworCQkuaWQgPSBNU0dfQkFUVEVSWSwKKwl9OworCXN0cnVjdCBpcGFxX21pY3JvX21zZyBtc2dfc2Vuc29yID0geworCQkuaWQgPSBNU0dfVEhFUk1BTF9TRU5TT1IsCisJfTsKKworCS8qIEZpcnN0IHNlbmQgYmF0dGVyeSBtZXNzYWdlICovCisJaXBhcV9taWNyb190eF9tc2dfc3luYyhtYi0+bWljcm8sICZtc2dfYmF0dGVyeSk7CisJaWYgKG1zZ19iYXR0ZXJ5LnJ4X2xlbiA8IDQpCisJCXByX2luZm8oIkVSUk9SIik7CisKKwkvKgorCSAqIFJldHVybmVkIG1lc3NhZ2UgZm9ybWF0OgorCSAqIGJ5dGUgMDogICAweDAwID0gTm90IHBsdWdnZWQgaW4KKwkgKiAgICAgICAgICAgMHgwMSA9IEFDIGFkYXB0ZXIgcGx1Z2dlZCBpbgorCSAqIGJ5dGUgMTogICBjaGVtaXN0cnkKKwkgKiBieXRlIDI6ICAgdm9sdGFnZSBMU0IKKwkgKiBieXRlIDM6ICAgdm9sdGFnZSBNU0IKKwkgKiBieXRlIDQ6ICAgZmxhZ3MKKwkgKiBieXRlIDUtOTogc2FtZSBmb3IgYmF0dGVyeSAyCisJICovCisJbWItPmFjID0gbXNnX2JhdHRlcnkucnhfZGF0YVswXTsKKwltYi0+Y2hlbWlzdHJ5ID0gbXNnX2JhdHRlcnkucnhfZGF0YVsxXTsKKwltYi0+dm9sdGFnZSA9ICgoKCh1bnNpZ25lZCBzaG9ydCltc2dfYmF0dGVyeS5yeF9kYXRhWzNdIDw8IDgpICsKKwkJCW1zZ19iYXR0ZXJ5LnJ4X2RhdGFbMl0pICogNTAwMEwpICogMTAwMCAvIDEwMjQ7CisJbWItPmZsYWcgPSBtc2dfYmF0dGVyeS5yeF9kYXRhWzRdOworCisJaWYgKG1zZ19iYXR0ZXJ5LnJ4X2xlbiA9PSA5KQorCQlwcl9kZWJ1Zygic2Vjb25kIGJhdHRlcnkgaWdub3JlZFxuIik7CisKKwkvKiBUaGVuIHJlYWQgdGhlIHNlbnNvciAqLworCWlwYXFfbWljcm9fdHhfbXNnX3N5bmMobWItPm1pY3JvLCAmbXNnX3NlbnNvcik7CisJbWItPnRlbXBlcmF0dXJlID0gbXNnX3NlbnNvci5yeF9kYXRhWzFdIDw8IDggfCBtc2dfc2Vuc29yLnJ4X2RhdGFbMF07CisKKwlxdWV1ZV9kZWxheWVkX3dvcmsobWItPndxLCAmbWItPnVwZGF0ZSwgbXNlY3NfdG9famlmZmllcyhCQVRUX1BFUklPRCkpOworfQorCitzdGF0aWMgaW50IGdldF9jYXBhY2l0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiKQoreworCXN0cnVjdCBtaWNyb19iYXR0ZXJ5ICptYiA9IGRldl9nZXRfZHJ2ZGF0YShiLT5kZXYucGFyZW50KTsKKworCXN3aXRjaCAobWItPmZsYWcgJiAweDA3KSB7CisJY2FzZSBNSUNST19CQVRUX1NUQVRVU19ISUdIOgorCQlyZXR1cm4gMTAwOworCQlicmVhazsKKwljYXNlIE1JQ1JPX0JBVFRfU1RBVFVTX0xPVzoKKwkJcmV0dXJuIDUwOworCQlicmVhazsKKwljYXNlIE1JQ1JPX0JBVFRfU1RBVFVTX0NSSVRJQ0FMOgorCQlyZXR1cm4gNTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9zdGF0dXMoc3RydWN0IHBvd2VyX3N1cHBseSAqYikKK3sKKwlzdHJ1Y3QgbWljcm9fYmF0dGVyeSAqbWIgPSBkZXZfZ2V0X2RydmRhdGEoYi0+ZGV2LnBhcmVudCk7CisKKwlpZiAobWItPmZsYWcgPT0gTUlDUk9fQkFUVF9TVEFUVVNfVU5LTk9XTikKKwkJcmV0dXJuIFBPV0VSX1NVUFBMWV9TVEFUVVNfVU5LTk9XTjsKKworCWlmIChtYi0+ZmxhZyAmIE1JQ1JPX0JBVFRfU1RBVFVTX0ZVTEwpCisJCXJldHVybiBQT1dFUl9TVVBQTFlfU1RBVFVTX0ZVTEw7CisKKwlpZiAoKG1iLT5mbGFnICYgTUlDUk9fQkFUVF9TVEFUVVNfQ0hBUkdJTkcpIHx8CisJCShtYi0+ZmxhZyAmIE1JQ1JPX0JBVFRfU1RBVFVTX0NIQVJHRU1BSU4pKQorCQlyZXR1cm4gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKKworCXJldHVybiBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOworfQorCitzdGF0aWMgaW50IG1pY3JvX2JhdHRfZ2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKmIsCisJCQkJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwkJCQkJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzdHJ1Y3QgbWljcm9fYmF0dGVyeSAqbWIgPSBkZXZfZ2V0X2RydmRhdGEoYi0+ZGV2LnBhcmVudCk7CisKKwlzd2l0Y2ggKHBzcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWToKKwkJc3dpdGNoIChtYi0+Y2hlbWlzdHJ5KSB7CisJCWNhc2UgTUlDUk9fQkFUVF9DSEVNX05JQ0Q6CisJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9URUNITk9MT0dZX05pQ2Q7CisJCQlicmVhazsKKwkJY2FzZSBNSUNST19CQVRUX0NIRU1fTklNSDoKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1RFQ0hOT0xPR1lfTmlNSDsKKwkJCWJyZWFrOworCQljYXNlIE1JQ1JPX0JBVFRfQ0hFTV9MSU9OOgorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfVEVDSE5PTE9HWV9MSU9OOworCQkJYnJlYWs7CisJCWNhc2UgTUlDUk9fQkFUVF9DSEVNX0xJUE9MWToKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1RFQ0hOT0xPR1lfTElQTzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfVEVDSE5PTE9HWV9VTktOT1dOOworCQkJYnJlYWs7CisJCX07CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgorCQl2YWwtPmludHZhbCA9IGdldF9zdGF0dXMoYik7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NQVhfREVTSUdOOgorCQl2YWwtPmludHZhbCA9IDQ3MDAwMDA7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFk6CisJCXZhbC0+aW50dmFsID0gZ2V0X2NhcGFjaXR5KGIpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVA6CisJCXZhbC0+aW50dmFsID0gbWItPnRlbXBlcmF0dXJlOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XOgorCQl2YWwtPmludHZhbCA9IG1iLT52b2x0YWdlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWljcm9fYWNfZ2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKmIsCisJCQkJIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwkJCQkgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzdHJ1Y3QgbWljcm9fYmF0dGVyeSAqbWIgPSBkZXZfZ2V0X2RydmRhdGEoYi0+ZGV2LnBhcmVudCk7CisKKwlzd2l0Y2ggKHBzcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FOgorCQl2YWwtPmludHZhbCA9IG1iLT5hYzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgbWljcm9fYmF0dF9wb3dlcl9wcm9wc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1ksCisJUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYX0RFU0lHTiwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9URU1QLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBtaWNyb19iYXR0X3Bvd2VyX2Rlc2MgPSB7CisJLm5hbWUJCQk9ICJtYWluLWJhdHRlcnkiLAorCS50eXBlCQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZLAorCS5wcm9wZXJ0aWVzCQk9IG1pY3JvX2JhdHRfcG93ZXJfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCQk9IEFSUkFZX1NJWkUobWljcm9fYmF0dF9wb3dlcl9wcm9wcyksCisJLmdldF9wcm9wZXJ0eQkJPSBtaWNyb19iYXR0X2dldF9wcm9wZXJ0eSwKKwkudXNlX2Zvcl9hcG0JCT0gMSwKK307CisKK3N0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBtaWNyb19hY19wb3dlcl9wcm9wc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX09OTElORSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgbWljcm9fYWNfcG93ZXJfZGVzYyA9IHsKKwkubmFtZQkJCT0gImFjIiwKKwkudHlwZQkJCT0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlMsCisJLnByb3BlcnRpZXMJCT0gbWljcm9fYWNfcG93ZXJfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCQk9IEFSUkFZX1NJWkUobWljcm9fYWNfcG93ZXJfcHJvcHMpLAorCS5nZXRfcHJvcGVydHkJCT0gbWljcm9fYWNfZ2V0X3Byb3BlcnR5LAorfTsKKworc3RhdGljIHN0cnVjdCBwb3dlcl9zdXBwbHkgKm1pY3JvX2JhdHRfcG93ZXIsICptaWNyb19hY19wb3dlcjsKKworc3RhdGljIGludCBtaWNyb19iYXR0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG1pY3JvX2JhdHRlcnkgKm1iOworCWludCByZXQ7CisKKwltYiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKm1iKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltYi0+bWljcm8gPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJbWItPndxID0gYWxsb2Nfd29ya3F1ZXVlKCJpcGFxLWJhdHRlcnktd3EiLCBXUV9NRU1fUkVDTEFJTSwgMCk7CisJaWYgKCFtYi0+d3EpCisJCXJldHVybiAtRU5PTUVNOworCisJSU5JVF9ERUxBWUVEX1dPUksoJm1iLT51cGRhdGUsIG1pY3JvX2JhdHRlcnlfd29yayk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWIpOworCXF1ZXVlX2RlbGF5ZWRfd29yayhtYi0+d3EsICZtYi0+dXBkYXRlLCAxKTsKKworCW1pY3JvX2JhdHRfcG93ZXIgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwKKwkJCQkJCSAmbWljcm9fYmF0dF9wb3dlcl9kZXNjLCBOVUxMKTsKKwlpZiAoSVNfRVJSKG1pY3JvX2JhdHRfcG93ZXIpKSB7CisJCXJldCA9IFBUUl9FUlIobWljcm9fYmF0dF9wb3dlcik7CisJCWdvdG8gYmF0dF9lcnI7CisJfQorCisJbWljcm9fYWNfcG93ZXIgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwKKwkJCQkJICAgICAgICZtaWNyb19hY19wb3dlcl9kZXNjLCBOVUxMKTsKKwlpZiAoSVNfRVJSKG1pY3JvX2FjX3Bvd2VyKSkgeworCQlyZXQgPSBQVFJfRVJSKG1pY3JvX2FjX3Bvd2VyKTsKKwkJZ290byBhY19lcnI7CisJfQorCisJZGV2X2luZm8oJnBkZXYtPmRldiwgImlQQVEgbWljcm8gYmF0dGVyeSBkcml2ZXJcbiIpOworCXJldHVybiAwOworCithY19lcnI6CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIobWljcm9fYmF0dF9wb3dlcik7CitiYXR0X2VycjoKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJm1iLT51cGRhdGUpOworCWRlc3Ryb3lfd29ya3F1ZXVlKG1iLT53cSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtaWNyb19iYXR0X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorCit7CisJc3RydWN0IG1pY3JvX2JhdHRlcnkgKm1iID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihtaWNyb19hY19wb3dlcik7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIobWljcm9fYmF0dF9wb3dlcik7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZtYi0+dXBkYXRlKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShtYi0+d3EpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgbWljcm9fYmF0dF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWljcm9fYmF0dGVyeSAqbWIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbWItPnVwZGF0ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgbWljcm9fYmF0dF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBtaWNyb19iYXR0ZXJ5ICptYiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcXVldWVfZGVsYXllZF93b3JrKG1iLT53cSwgJm1iLT51cGRhdGUsIG1zZWNzX3RvX2ppZmZpZXMoQkFUVF9QRVJJT0QpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIG1pY3JvX2JhdHRfZGV2X3BtX29wcyA9IHsKKwlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhtaWNyb19iYXR0X3N1c3BlbmQsIG1pY3JvX2JhdHRfcmVzdW1lKQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbWljcm9fYmF0dF9kZXZpY2VfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJpcGFxLW1pY3JvLWJhdHRlcnkiLAorCQkucG0JPSAmbWljcm9fYmF0dF9kZXZfcG1fb3BzLAorCX0sCisJLnByb2JlCQk9IG1pY3JvX2JhdHRfcHJvYmUsCisJLnJlbW92ZQkJPSBtaWNyb19iYXR0X3JlbW92ZSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG1pY3JvX2JhdHRfZGV2aWNlX2RyaXZlcik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiZHJpdmVyIGZvciBpUEFRIEF0bWVsIG1pY3JvIGJhdHRlcnkiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06YmF0dGVyeS1pcGFxLW1pY3JvIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2lzcDE3MDRfY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvaXNwMTcwNF9jaGFyZ2VyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvaXNwMTcwNF9jaGFyZ2VyLmMKcmVuYW1lIHRvIGRyaXZlcnMvcG93ZXIvc3VwcGx5L2lzcDE3MDRfY2hhcmdlci5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2p6NDc0MC1iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9qejQ3NDAtYmF0dGVyeS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3Bvd2VyL2p6NDc0MC1iYXR0ZXJ5LmMKcmVuYW1lIHRvIGRyaXZlcnMvcG93ZXIvc3VwcGx5L2p6NDc0MC1iYXR0ZXJ5LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvbHA4NzI3X2NoYXJnZXIuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L2xwODcyN19jaGFyZ2VyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvbHA4NzI3X2NoYXJnZXIuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvbHA4NzI3X2NoYXJnZXIuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9scDg3ODgtY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvbHA4Nzg4LWNoYXJnZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci9scDg3ODgtY2hhcmdlci5jCnJlbmFtZSB0byBkcml2ZXJzL3Bvd2VyL3N1cHBseS9scDg3ODgtY2hhcmdlci5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2x0YzI5NDEtYmF0dGVyeS1nYXVnZS5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvbHRjMjk0MS1iYXR0ZXJ5LWdhdWdlLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvbHRjMjk0MS1iYXR0ZXJ5LWdhdWdlLmMKcmVuYW1lIHRvIGRyaXZlcnMvcG93ZXIvc3VwcGx5L2x0YzI5NDEtYmF0dGVyeS1nYXVnZS5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9tYXgxNDU3N19jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9tYXgxNDU3N19jaGFyZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ5ZmM1NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L21heDE0NTc3X2NoYXJnZXIuYwpAQCAtMCwwICsxLDY0OCBAQAorLyoKKyAqIG1heDE0NTc3X2NoYXJnZXIuYyAtIEJhdHRlcnkgY2hhcmdlciBkcml2ZXIgZm9yIHRoZSBNYXhpbSAxNDU3Ny83NzgzNgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMywyMDE0IFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqIEtyenlzenRvZiBLb3psb3dza2kgPGtyemtAa2VybmVsLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9tYXgxNDU3Ny1wcml2YXRlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL21heDE0NTc3Lmg+CisKK3N0cnVjdCBtYXgxNDU3N19jaGFyZ2VyIHsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworCXN0cnVjdCBtYXgxNDU3NwkJKm1heDE0NTc3OworCXN0cnVjdCBwb3dlcl9zdXBwbHkJKmNoYXJnZXI7CisKKwlzdHJ1Y3QgbWF4MTQ1NzdfY2hhcmdlcl9wbGF0Zm9ybV9kYXRhCSpwZGF0YTsKK307CisKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIG1hcHBpbmcgdmFsdWVzIG9mIFNUQVRVUzIvQ0hHVFlQIHJlZ2lzdGVyIG9uIG1heDE0NTc3CisgKiBhbmQgbWF4Nzc4MzYgY2hpcHNldHMgdG8gZW51bSBtYXhpbV9tdWljX2NoYXJnZXJfdHlwZS4KKyAqLworc3RhdGljIGVudW0gbWF4MTQ1NzdfbXVpY19jaGFyZ2VyX3R5cGUgbWF4aW1fZ2V0X2NoYXJnZXJfdHlwZSgKKwkJZW51bSBtYXhpbV9kZXZpY2VfdHlwZSBkZXZfdHlwZSwgdTggdmFsKSB7CisJc3dpdGNoICh2YWwpIHsKKwljYXNlIE1BWDE0NTc3X0NIQVJHRVJfVFlQRV9OT05FOgorCWNhc2UgTUFYMTQ1NzdfQ0hBUkdFUl9UWVBFX1VTQjoKKwljYXNlIE1BWDE0NTc3X0NIQVJHRVJfVFlQRV9ET1dOU1RSRUFNX1BPUlQ6CisJY2FzZSBNQVgxNDU3N19DSEFSR0VSX1RZUEVfREVESUNBVEVEX0NIRzoKKwljYXNlIE1BWDE0NTc3X0NIQVJHRVJfVFlQRV9TUEVDSUFMXzUwME1BOgorCWNhc2UgTUFYMTQ1NzdfQ0hBUkdFUl9UWVBFX1NQRUNJQUxfMUE6CisJCXJldHVybiB2YWw7CisJY2FzZSBNQVgxNDU3N19DSEFSR0VSX1RZUEVfREVBRF9CQVRURVJZOgorCWNhc2UgTUFYMTQ1NzdfQ0hBUkdFUl9UWVBFX1JFU0VSVkVEOgorCQlpZiAoZGV2X3R5cGUgPT0gTUFYSU1fREVWSUNFX1RZUEVfTUFYNzc4MzYpCisJCQl2YWwgfD0gMHg4OworCQlyZXR1cm4gdmFsOworCWRlZmF1bHQ6CisJCVdBUk5fT05DRSgxLCAibWF4MTQ1Nzc6IFVuc3VwcG9ydGVkIGNoZ3R5cCByZWdpc3RlciB2YWx1ZSAweCUwMngiLCB2YWwpOworCQlyZXR1cm4gdmFsOworCX0KK30KKworc3RhdGljIGludCBtYXgxNDU3N19nZXRfY2hhcmdlcl9zdGF0ZShzdHJ1Y3QgbWF4MTQ1NzdfY2hhcmdlciAqY2hnLCBpbnQgKnZhbCkKK3sKKwlzdHJ1Y3QgcmVnbWFwICpybWFwID0gY2hnLT5tYXgxNDU3Ny0+cmVnbWFwOworCWludCByZXQ7CisJdTggcmVnX2RhdGE7CisKKwkvKgorCSAqIENoYXJnaW5nIG9jY3VycyBvbmx5IGlmOgorCSAqICAtIENIR0NUUkwyL01CQ0hPU1RFTiA9PSAxCisJICogIC0gU1RBVFVTMi9DR01CQyA9PSAxCisJICoKKwkgKiBUT0RPOgorCSAqICAtIGhhbmRsZSBGVUxMIGFmdGVyIFRvcC1vZmYgdGltZXIgKEVPQyByZWdpc3RlciBtYXkgYmUgb2ZmCisJICogICAgYW5kIHRoZSBjaGFyZ2VyIHdvbid0IGJlIGNoYXJnaW5nIGFsdGhvdWdoIE1CQ0hPU1RFTiBpcyBvbikKKwkgKiAgLSBoYW5kbGUgcHJvcGVybHkgZGVhZC1iYXR0ZXJ5IGNoYXJnaW5nIChyZXNwZWN0IHRpbWVyKQorCSAqICAtIGhhbmRsZSB0aW1lcnMgKGZhc3QtY2hhcmdlIGFuZCBwcmVxdWFsKSAvTUJDQ0hHRVJSLworCSAqLworCXJldCA9IG1heDE0NTc3X3JlYWRfcmVnKHJtYXAsIE1BWDE0NTc3X0NIR19SRUdfQ0hHX0NUUkwyLCAmcmVnX2RhdGEpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCWlmICgocmVnX2RhdGEgJiBDSEdDVFJMMl9NQkNIT1NURU5fTUFTSykgPT0gMCkgeworCQkqdmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORzsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gbWF4MTQ1NzdfcmVhZF9yZWcocm1hcCwgTUFYMTQ1NzdfQ0hHX1JFR19TVEFUVVMzLCAmcmVnX2RhdGEpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCWlmIChyZWdfZGF0YSAmIFNUQVRVUzNfQ0dNQkNfTUFTSykgeworCQkvKiBDaGFyZ2VyIG9yIFVTQi1jYWJsZSBpcyBjb25uZWN0ZWQgKi8KKwkJaWYgKHJlZ19kYXRhICYgU1RBVFVTM19FT0NfTUFTSykKKwkJCSp2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0ZVTEw7CisJCWVsc2UKKwkJCSp2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOworCQlnb3RvIG91dDsKKwl9CisKKwkqdmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORzsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBTdXBwb3J0ZWQgY2hhcmdlIHR5cGVzOgorICogIC0gUE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX05PTkUKKyAqICAtIFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9GQVNUCisgKi8KK3N0YXRpYyBpbnQgbWF4MTQ1NzdfZ2V0X2NoYXJnZV90eXBlKHN0cnVjdCBtYXgxNDU3N19jaGFyZ2VyICpjaGcsIGludCAqdmFsKQoreworCWludCByZXQsIGNoYXJnaW5nOworCisJLyoKKwkgKiBUT0RPOiBDSEFSR0VfVFlQRV9UUklDS0xFIChWQ0hHUl9SQyBvciBFT0MpPworCSAqIEFzIHNwZWMgc2F5czoKKwkgKiBbYWZ0ZXIgcmVhY2hpbmcgRU9DIGludGVycnVwdF0KKwkgKiAiV2hlbiB0aGUgYmF0dGVyeSBpcyBmdWxseSBjaGFyZ2VkLCB0aGUgMzAtbWludXRlICh0eXApCisJICogIHRvcC1vZmYgdGltZXIgc3RhcnRzLiBUaGUgZGV2aWNlIGNvbnRpbnVlcyB0byB0cmlja2xlCisJICogIGNoYXJnZSB0aGUgYmF0dGVyeSB1bnRpbCB0aGUgdG9wLW9mZiB0aW1lciBydW5zIG91dC4iCisJICovCisJcmV0ID0gbWF4MTQ1NzdfZ2V0X2NoYXJnZXJfc3RhdGUoY2hnLCAmY2hhcmdpbmcpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGNoYXJnaW5nID09IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkcpCisJCSp2YWwgPSBQT1dFUl9TVVBQTFlfQ0hBUkdFX1RZUEVfRkFTVDsKKwllbHNlCisJCSp2YWwgPSBQT1dFUl9TVVBQTFlfQ0hBUkdFX1RZUEVfTk9ORTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1heDE0NTc3X2dldF9vbmxpbmUoc3RydWN0IG1heDE0NTc3X2NoYXJnZXIgKmNoZywgaW50ICp2YWwpCit7CisJc3RydWN0IHJlZ21hcCAqcm1hcCA9IGNoZy0+bWF4MTQ1NzctPnJlZ21hcDsKKwl1OCByZWdfZGF0YTsKKwlpbnQgcmV0OworCWVudW0gbWF4MTQ1NzdfbXVpY19jaGFyZ2VyX3R5cGUgY2hnX3R5cGU7CisKKwlyZXQgPSBtYXgxNDU3N19yZWFkX3JlZyhybWFwLCBNQVgxNDU3N19NVUlDX1JFR19TVEFUVVMyLCAmcmVnX2RhdGEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmVnX2RhdGEgPSAoKHJlZ19kYXRhICYgU1RBVFVTMl9DSEdUWVBfTUFTSykgPj4gU1RBVFVTMl9DSEdUWVBfU0hJRlQpOworCWNoZ190eXBlID0gbWF4aW1fZ2V0X2NoYXJnZXJfdHlwZShjaGctPm1heDE0NTc3LT5kZXZfdHlwZSwgcmVnX2RhdGEpOworCXN3aXRjaCAoY2hnX3R5cGUpIHsKKwljYXNlIE1BWDE0NTc3X0NIQVJHRVJfVFlQRV9VU0I6CisJY2FzZSBNQVgxNDU3N19DSEFSR0VSX1RZUEVfREVESUNBVEVEX0NIRzoKKwljYXNlIE1BWDE0NTc3X0NIQVJHRVJfVFlQRV9TUEVDSUFMXzUwME1BOgorCWNhc2UgTUFYMTQ1NzdfQ0hBUkdFUl9UWVBFX1NQRUNJQUxfMUE6CisJY2FzZSBNQVgxNDU3N19DSEFSR0VSX1RZUEVfREVBRF9CQVRURVJZOgorCWNhc2UgTUFYNzc4MzZfQ0hBUkdFUl9UWVBFX1NQRUNJQUxfQklBUzoKKwkJKnZhbCA9IDE7CisJCWJyZWFrOworCWNhc2UgTUFYMTQ1NzdfQ0hBUkdFUl9UWVBFX05PTkU6CisJY2FzZSBNQVgxNDU3N19DSEFSR0VSX1RZUEVfRE9XTlNUUkVBTV9QT1JUOgorCWNhc2UgTUFYMTQ1NzdfQ0hBUkdFUl9UWVBFX1JFU0VSVkVEOgorCWNhc2UgTUFYNzc4MzZfQ0hBUkdFUl9UWVBFX1JFU0VSVkVEOgorCWRlZmF1bHQ6CisJCSp2YWwgPSAwOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogU3VwcG9ydGVkIGhlYWx0aCBzdGF0dXNlczoKKyAqICAtIFBPV0VSX1NVUFBMWV9IRUFMVEhfREVBRAorICogIC0gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSVk9MVEFHRQorICogIC0gUE9XRVJfU1VQUExZX0hFQUxUSF9HT09ECisgKi8KK3N0YXRpYyBpbnQgbWF4MTQ1NzdfZ2V0X2JhdHRlcnlfaGVhbHRoKHN0cnVjdCBtYXgxNDU3N19jaGFyZ2VyICpjaGcsIGludCAqdmFsKQoreworCXN0cnVjdCByZWdtYXAgKnJtYXAgPSBjaGctPm1heDE0NTc3LT5yZWdtYXA7CisJaW50IHJldDsKKwl1OCByZWdfZGF0YTsKKwllbnVtIG1heDE0NTc3X211aWNfY2hhcmdlcl90eXBlIGNoZ190eXBlOworCisJcmV0ID0gbWF4MTQ1NzdfcmVhZF9yZWcocm1hcCwgTUFYMTQ1NzdfTVVJQ19SRUdfU1RBVFVTMiwgJnJlZ19kYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZWdfZGF0YSA9ICgocmVnX2RhdGEgJiBTVEFUVVMyX0NIR1RZUF9NQVNLKSA+PiBTVEFUVVMyX0NIR1RZUF9TSElGVCk7CisJY2hnX3R5cGUgPSBtYXhpbV9nZXRfY2hhcmdlcl90eXBlKGNoZy0+bWF4MTQ1NzctPmRldl90eXBlLCByZWdfZGF0YSk7CisJaWYgKGNoZ190eXBlID09IE1BWDE0NTc3X0NIQVJHRVJfVFlQRV9ERUFEX0JBVFRFUlkpIHsKKwkJKnZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfREVBRDsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gbWF4MTQ1NzdfcmVhZF9yZWcocm1hcCwgTUFYMTQ1NzdfQ0hHX1JFR19TVEFUVVMzLCAmcmVnX2RhdGEpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCWlmIChyZWdfZGF0YSAmIFNUQVRVUzNfT1ZQX01BU0spIHsKKwkJKnZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUlZPTFRBR0U7CisJCWdvdG8gb3V0OworCX0KKworCS8qIE5vdCBkZWFkLCBub3Qgb3ZlcnZvbHRhZ2UgKi8KKwkqdmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9HT09EOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEFsd2F5cyByZXR1cm5zIDEuCisgKiBUaGUgbWF4MTQ1NzcgY2hpcCBkb2Vzbid0IHJlcG9ydCBhbnkgc3RhdHVzIG9mIGJhdHRlcnkgcHJlc2VuY2UuCisgKiBMZXRzIGFzc3VtZSB0aGF0IGl0IHdpbGwgYWx3YXlzIGJlIHVzZWQgd2l0aCBzb21lIGJhdHRlcnkuCisgKi8KK3N0YXRpYyBpbnQgbWF4MTQ1NzdfZ2V0X3ByZXNlbnQoc3RydWN0IG1heDE0NTc3X2NoYXJnZXIgKmNoZywgaW50ICp2YWwpCit7CisJKnZhbCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXgxNDU3N19zZXRfZmFzdF9jaGFyZ2VfdGltZXIoc3RydWN0IG1heDE0NTc3X2NoYXJnZXIgKmNoZywKKwkJdW5zaWduZWQgbG9uZyBob3VycykKK3sKKwl1OCByZWdfZGF0YTsKKworCXN3aXRjaCAoaG91cnMpIHsKKwljYXNlIDUgLi4uIDc6CisJCXJlZ19kYXRhID0gaG91cnMgLSAzOworCQlicmVhazsKKwljYXNlIDA6CisJCS8qIERpc2FibGUgKi8KKwkJcmVnX2RhdGEgPSAweDc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoY2hnLT5kZXYsICJXcm9uZyB2YWx1ZSBmb3IgRmFzdC1DaGFyZ2UgVGltZXI6ICVsdVxuIiwKKwkJCQlob3Vycyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZWdfZGF0YSA8PD0gQ0hHQ1RSTDFfVENIV19TSElGVDsKKworCXJldHVybiBtYXgxNDU3N191cGRhdGVfcmVnKGNoZy0+bWF4MTQ1NzctPnJlZ21hcCwKKwkJCU1BWDE0NTc3X1JFR19DSEdDVFJMMSwgQ0hHQ1RSTDFfVENIV19NQVNLLCByZWdfZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgbWF4MTQ1NzdfaW5pdF9jb25zdGFudF92b2x0YWdlKHN0cnVjdCBtYXgxNDU3N19jaGFyZ2VyICpjaGcsCisJCXVuc2lnbmVkIGludCB1dm9sdCkKK3sKKwl1OCByZWdfZGF0YTsKKworCWlmICh1dm9sdCA8IE1BWElNX0NIQVJHRVJfQ09OU1RBTlRfVk9MVEFHRV9NSU4gfHwKKwkJCXV2b2x0ID4gTUFYSU1fQ0hBUkdFUl9DT05TVEFOVF9WT0xUQUdFX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodXZvbHQgPT0gNDIwMDAwMCkKKwkJcmVnX2RhdGEgPSAweDA7CisJZWxzZSBpZiAodXZvbHQgPT0gTUFYSU1fQ0hBUkdFUl9DT05TVEFOVF9WT0xUQUdFX01BWCkKKwkJcmVnX2RhdGEgPSAweDFmOworCWVsc2UgaWYgKHV2b2x0IDw9IDQyODAwMDApIHsKKwkJdW5zaWduZWQgaW50IHZhbCA9IHV2b2x0OworCisJCXZhbCAtPSBNQVhJTV9DSEFSR0VSX0NPTlNUQU5UX1ZPTFRBR0VfTUlOOworCQl2YWwgLz0gTUFYSU1fQ0hBUkdFUl9DT05TVEFOVF9WT0xUQUdFX1NURVA7CisJCWlmICh1dm9sdCA8PSA0MTgwMDAwKQorCQkJcmVnX2RhdGEgPSAweDEgKyB2YWw7CisJCWVsc2UKKwkJCXJlZ19kYXRhID0gdmFsOyAvKiBGaXggZm9yIGdhcCBiZXR3ZWVuIDQuMThWIGFuZCA0LjIyViAqLworCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlZ19kYXRhIDw8PSBDSEdDVFJMM19NQkNDVldSQ19TSElGVDsKKworCXJldHVybiBtYXgxNDU3N193cml0ZV9yZWcoY2hnLT5tYXgxNDU3Ny0+cmVnbWFwLAorCQkJTUFYMTQ1NzdfQ0hHX1JFR19DSEdfQ1RSTDMsIHJlZ19kYXRhKTsKK30KKworc3RhdGljIGludCBtYXgxNDU3N19pbml0X2VvYyhzdHJ1Y3QgbWF4MTQ1NzdfY2hhcmdlciAqY2hnLAorCQl1bnNpZ25lZCBpbnQgdWFtcCkKK3sKKwl1bnNpZ25lZCBpbnQgY3VycmVudF9iaXRzID0gMHhmOworCXU4IHJlZ19kYXRhOworCisJc3dpdGNoIChjaGctPm1heDE0NTc3LT5kZXZfdHlwZSkgeworCWNhc2UgTUFYSU1fREVWSUNFX1RZUEVfTUFYNzc4MzY6CisJCWlmICh1YW1wIDwgNTAwMCkKKwkJCXJldHVybiAtRUlOVkFMOyAvKiBSZXF1ZXN0ZWQgY3VycmVudCBpcyB0b28gbG93ICovCisKKwkJaWYgKHVhbXAgPj0gNzUwMCAmJiB1YW1wIDwgMTAwMDApCisJCQljdXJyZW50X2JpdHMgPSAweDA7CisJCWVsc2UgaWYgKHVhbXAgPD0gNTAwMDApIHsKKwkJCS8qIDw1MDAwLCA3NDk5PiBhbmQgPDEwMDAwLCA1MDAwMD4gKi8KKwkJCWN1cnJlbnRfYml0cyA9IHVhbXAgLyA1MDAwOworCQl9IGVsc2UgeworCQkJdWFtcCA9IG1pbih1YW1wLCAxMDAwMDBVKSAtIDUwMDAwVTsKKwkJCWN1cnJlbnRfYml0cyA9IDB4YSArIHVhbXAgLyAxMDAwMDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUFYSU1fREVWSUNFX1RZUEVfTUFYMTQ1Nzc6CisJZGVmYXVsdDoKKwkJaWYgKHVhbXAgPCBNQVgxNDU3N19DSEFSR0VSX0VPQ19DVVJSRU5UX0xJTUlUX01JTikKKwkJCXJldHVybiAtRUlOVkFMOyAvKiBSZXF1ZXN0ZWQgY3VycmVudCBpcyB0b28gbG93ICovCisKKwkJdWFtcCA9IG1pbih1YW1wLCBNQVgxNDU3N19DSEFSR0VSX0VPQ19DVVJSRU5UX0xJTUlUX01BWCk7CisJCXVhbXAgLT0gTUFYMTQ1NzdfQ0hBUkdFUl9FT0NfQ1VSUkVOVF9MSU1JVF9NSU47CisJCWN1cnJlbnRfYml0cyA9IHVhbXAgLyBNQVgxNDU3N19DSEFSR0VSX0VPQ19DVVJSRU5UX0xJTUlUX1NURVA7CisJCWJyZWFrOworCX0KKworCXJlZ19kYXRhID0gY3VycmVudF9iaXRzIDw8IENIR0NUUkw1X0VPQ1NfU0hJRlQ7CisKKwlyZXR1cm4gbWF4MTQ1NzdfdXBkYXRlX3JlZyhjaGctPm1heDE0NTc3LT5yZWdtYXAsCisJCQlNQVgxNDU3N19DSEdfUkVHX0NIR19DVFJMNSwgQ0hHQ1RSTDVfRU9DU19NQVNLLAorCQkJcmVnX2RhdGEpOworfQorCitzdGF0aWMgaW50IG1heDE0NTc3X2luaXRfZmFzdF9jaGFyZ2Uoc3RydWN0IG1heDE0NTc3X2NoYXJnZXIgKmNoZywKKwkJdW5zaWduZWQgaW50IHVhbXApCit7CisJdTggcmVnX2RhdGE7CisJaW50IHJldDsKKwljb25zdCBzdHJ1Y3QgbWF4aW1fY2hhcmdlcl9jdXJyZW50ICpsaW1pdHMgPQorCQkmbWF4aW1fY2hhcmdlcl9jdXJyZW50c1tjaGctPm1heDE0NTc3LT5kZXZfdHlwZV07CisKKwlyZXQgPSBtYXhpbV9jaGFyZ2VyX2NhbGNfcmVnX2N1cnJlbnQobGltaXRzLCB1YW1wLCB1YW1wLCAmcmVnX2RhdGEpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihjaGctPmRldiwgIldyb25nIHZhbHVlIGZvciBmYXN0IGNoYXJnZTogJXVcbiIsIHVhbXApOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBtYXgxNDU3N191cGRhdGVfcmVnKGNoZy0+bWF4MTQ1NzctPnJlZ21hcCwKKwkJCU1BWDE0NTc3X0NIR19SRUdfQ0hHX0NUUkw0LAorCQkJQ0hHQ1RSTDRfTUJDSUNIV1JDTF9NQVNLIHwgQ0hHQ1RSTDRfTUJDSUNIV1JDSF9NQVNLLAorCQkJcmVnX2RhdGEpOworfQorCisvKgorICogU2V0cyBjaGFyZ2VyIHJlZ2lzdGVycyB0byBwcm9wZXIgYW5kIHNhZmUgZGVmYXVsdCB2YWx1ZXMuCisgKiBTb21lIG9mIHRoZXNlIHZhbHVlcyBhcmUgZXF1YWwgdG8gZGVmYXVsdHMgaW4gTUFYMTQ1NzdFCisgKiBkYXRhIHNoZWV0IGJ1dCB0aGVyZSBhcmUgbWlub3IgZGlmZmVyZW5jZXMuCisgKi8KK3N0YXRpYyBpbnQgbWF4MTQ1NzdfY2hhcmdlcl9yZWdfaW5pdChzdHJ1Y3QgbWF4MTQ1NzdfY2hhcmdlciAqY2hnKQoreworCXN0cnVjdCByZWdtYXAgKnJtYXAgPSBjaGctPm1heDE0NTc3LT5yZWdtYXA7CisJdTggcmVnX2RhdGE7CisJaW50IHJldDsKKworCS8qCisJICogQ2hhcmdlci1UeXBlIE1hbnVhbCBEZXRlY3Rpb24sIGRlZmF1bHQgb2ZmIChzZXQgQ0hHVFlQTUFOIHRvIDApCisJICogQ2hhcmdlci1EZXRlY3Rpb24gRW5hYmxlLCBkZWZhdWx0IG9uIChzZXQgQ0hHREVURU4gdG8gMSkKKwkgKiBDb21iaW5lZCBtYXNrIG9mIENIR0RFVEVOIGFuZCBDSEdUWVBNQU4gd2lsbCB6ZXJvIHRoZSBDSEdUWVBNQU4gYml0CisJICovCisJcmVnX2RhdGEgPSAweDEgPDwgQ0RFVENUUkwxX0NIR0RFVEVOX1NISUZUOworCW1heDE0NTc3X3VwZGF0ZV9yZWcocm1hcCwgTUFYMTQ1NzdfUkVHX0NERVRDVFJMMSwKKwkJCUNERVRDVFJMMV9DSEdERVRFTl9NQVNLIHwgQ0RFVENUUkwxX0NIR1RZUE1BTl9NQVNLLAorCQkJcmVnX2RhdGEpOworCisJLyoKKwkgKiBXYWxsLUFkYXB0ZXIgUmFwaWQgQ2hhcmdlLCBkZWZhdWx0IG9uCisJICogQmF0dGVyeS1DaGFyZ2VyLCBkZWZhdWx0IG9uCisJICovCisJcmVnX2RhdGEgPSAweDEgPDwgQ0hHQ1RSTDJfVkNIR1JfUkNfU0hJRlQ7CisJcmVnX2RhdGEgfD0gMHgxIDw8IENIR0NUUkwyX01CQ0hPU1RFTl9TSElGVDsKKwltYXgxNDU3N193cml0ZV9yZWcocm1hcCwgTUFYMTQ1NzdfUkVHX0NIR0NUUkwyLCByZWdfZGF0YSk7CisKKwkvKiBBdXRvIENoYXJnaW5nIFN0b3AsIGRlZmF1bHQgb2ZmICovCisJcmVnX2RhdGEgPSAweDAgPDwgQ0hHQ1RSTDZfQVVUT1NUT1BfU0hJRlQ7CisJbWF4MTQ1Nzdfd3JpdGVfcmVnKHJtYXAsIE1BWDE0NTc3X1JFR19DSEdDVFJMNiwgcmVnX2RhdGEpOworCisJcmV0ID0gbWF4MTQ1NzdfaW5pdF9jb25zdGFudF92b2x0YWdlKGNoZywgY2hnLT5wZGF0YS0+Y29uc3RhbnRfdXZvbHQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBtYXgxNDU3N19pbml0X2VvYyhjaGcsIGNoZy0+cGRhdGEtPmVvY191YW1wKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbWF4MTQ1NzdfaW5pdF9mYXN0X2NoYXJnZShjaGcsIGNoZy0+cGRhdGEtPmZhc3RfY2hhcmdlX3VhbXApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBtYXgxNDU3N19zZXRfZmFzdF9jaGFyZ2VfdGltZXIoY2hnLAorCQkJTUFYSU1fQ0hBUkdFUl9GQVNUX0NIQVJHRV9USU1FUl9ERUZBVUxUKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogSW5pdGlhbGl6ZSBPdmVydm9sdGFnZS1Qcm90ZWN0aW9uIFRocmVzaG9sZCAqLworCXN3aXRjaCAoY2hnLT5wZGF0YS0+b3ZwX3V2b2x0KSB7CisJY2FzZSA3NTAwMDAwOgorCQlyZWdfZGF0YSA9IDB4MDsKKwkJYnJlYWs7CisJY2FzZSA2MDAwMDAwOgorCWNhc2UgNjUwMDAwMDoKKwljYXNlIDcwMDAwMDA6CisJCXJlZ19kYXRhID0gMHgxICsgKGNoZy0+cGRhdGEtPm92cF91dm9sdCAtIDYwMDAwMDApIC8gNTAwMDAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNoZy0+ZGV2LCAiV3JvbmcgdmFsdWUgZm9yIE9WUDogJXVcbiIsCisJCQkJY2hnLT5wZGF0YS0+b3ZwX3V2b2x0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJlZ19kYXRhIDw8PSBDSEdDVFJMN19PVFBDR0hDVlNfU0hJRlQ7CisJbWF4MTQ1Nzdfd3JpdGVfcmVnKHJtYXAsIE1BWDE0NTc3X1JFR19DSEdDVFJMNywgcmVnX2RhdGEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFN1cHBvcnQgcHJvcGVydHkgZnJvbSBjaGFyZ2VyICovCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgbWF4MTQ1NzdfY2hhcmdlcl9wcm9wc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfVFlQRSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEgsCisJUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUsCisJUE9XRVJfU1VQUExZX1BST1BfTU9ERUxfTkFNRSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9NQU5VRkFDVFVSRVIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1vZGVsX25hbWVzW10gPSB7CisJW01BWElNX0RFVklDRV9UWVBFX1VOS05PV05dCT0gIk1BWDE0NTc3LWxpa2UiLAorCVtNQVhJTV9ERVZJQ0VfVFlQRV9NQVgxNDU3N10JPSAiTUFYMTQ1NzciLAorCVtNQVhJTV9ERVZJQ0VfVFlQRV9NQVg3NzgzNl0JPSAiTUFYNzc4MzYiLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICptYW51ZmFjdHVyZXIgPSAiTWF4aW0gSW50ZWdyYXRlZCI7CisKK3N0YXRpYyBpbnQgbWF4MTQ1NzdfY2hhcmdlcl9nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAorCQkJICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwkJCSAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXN0cnVjdCBtYXgxNDU3N19jaGFyZ2VyICpjaGcgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAocHNwKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6CisJCXJldCA9IG1heDE0NTc3X2dldF9jaGFyZ2VyX3N0YXRlKGNoZywgJnZhbC0+aW50dmFsKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfVFlQRToKKwkJcmV0ID0gbWF4MTQ1NzdfZ2V0X2NoYXJnZV90eXBlKGNoZywgJnZhbC0+aW50dmFsKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEg6CisJCXJldCA9IG1heDE0NTc3X2dldF9iYXR0ZXJ5X2hlYWx0aChjaGcsICZ2YWwtPmludHZhbCk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDoKKwkJcmV0ID0gbWF4MTQ1NzdfZ2V0X3ByZXNlbnQoY2hnLCAmdmFsLT5pbnR2YWwpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORToKKwkJcmV0ID0gbWF4MTQ1NzdfZ2V0X29ubGluZShjaGcsICZ2YWwtPmludHZhbCk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfTU9ERUxfTkFNRToKKwkJQlVJTERfQlVHX09OKEFSUkFZX1NJWkUobW9kZWxfbmFtZXMpICE9IE1BWElNX0RFVklDRV9UWVBFX05VTSk7CisJCXZhbC0+c3RydmFsID0gbW9kZWxfbmFtZXNbY2hnLT5tYXgxNDU3Ny0+ZGV2X3R5cGVdOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUjoKKwkJdmFsLT5zdHJ2YWwgPSBtYW51ZmFjdHVyZXI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgbWF4MTQ1NzdfY2hhcmdlcl9kZXNjID0geworCS5uYW1lID0gIm1heDE0NTc3LWNoYXJnZXIiLAorCS50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKKwkucHJvcGVydGllcyA9IG1heDE0NTc3X2NoYXJnZXJfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShtYXgxNDU3N19jaGFyZ2VyX3Byb3BzKSwKKwkuZ2V0X3Byb3BlcnR5ID0gbWF4MTQ1NzdfY2hhcmdlcl9nZXRfcHJvcGVydHksCit9OworCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgc3RydWN0IG1heDE0NTc3X2NoYXJnZXJfcGxhdGZvcm1fZGF0YSAqbWF4MTQ1NzdfY2hhcmdlcl9kdF9pbml0KAorCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtYXgxNDU3N19jaGFyZ2VyX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlpbnQgcmV0OworCisJaWYgKCFucCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBjaGFyZ2VyIE9GIG5vZGVcbiIpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwlwZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwZGF0YSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgIm1heGltLGNvbnN0YW50LXV2b2x0IiwKKwkJCSZwZGF0YS0+Y29uc3RhbnRfdXZvbHQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IHBhcnNlIG1heGltLGNvbnN0YW50LXV2b2x0IGZpZWxkIGZyb20gRFRcbiIpOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAibWF4aW0sZmFzdC1jaGFyZ2UtdWFtcCIsCisJCQkmcGRhdGEtPmZhc3RfY2hhcmdlX3VhbXApOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IHBhcnNlIG1heGltLGZhc3QtY2hhcmdlLXVhbXAgZmllbGQgZnJvbSBEVFxuIik7CisJCXJldHVybiBFUlJfUFRSKHJldCk7CisJfQorCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJtYXhpbSxlb2MtdWFtcCIsICZwZGF0YS0+ZW9jX3VhbXApOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IHBhcnNlIG1heGltLGVvYy11YW1wIGZpZWxkIGZyb20gRFRcbiIpOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAibWF4aW0sb3ZwLXV2b2x0IiwgJnBkYXRhLT5vdnBfdXZvbHQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IHBhcnNlIG1heGltLG92cC11dm9sdCBmaWVsZCBmcm9tIERUXG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisKKwlyZXR1cm4gcGRhdGE7Cit9CisjZWxzZSAvKiBDT05GSUdfT0YgKi8KK3N0YXRpYyBzdHJ1Y3QgbWF4MTQ1NzdfY2hhcmdlcl9wbGF0Zm9ybV9kYXRhICptYXgxNDU3N19jaGFyZ2VyX2R0X2luaXQoCisJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYgLyogQ09ORklHX09GICovCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFzdF9jaGFyZ2VfdGltZXIoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBtYXgxNDU3N19jaGFyZ2VyICpjaGcgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1OCByZWdfZGF0YTsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCB2YWw7CisKKwlyZXQgPSBtYXgxNDU3N19yZWFkX3JlZyhjaGctPm1heDE0NTc3LT5yZWdtYXAsIE1BWDE0NTc3X1JFR19DSEdDVFJMMSwKKwkJCSZyZWdfZGF0YSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJlZ19kYXRhICY9IENIR0NUUkwxX1RDSFdfTUFTSzsKKwlyZWdfZGF0YSA+Pj0gQ0hHQ1RSTDFfVENIV19TSElGVDsKKwlzd2l0Y2ggKHJlZ19kYXRhKSB7CisJY2FzZSAweDIgLi4uIDB4NDoKKwkJdmFsID0gcmVnX2RhdGEgKyAzOworCQlicmVhazsKKwljYXNlIDB4NzoKKwkJdmFsID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdmFsID0gNTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9mYXN0X2NoYXJnZV90aW1lcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgbWF4MTQ1NzdfY2hhcmdlciAqY2hnID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHJldDsKKworCXJldCA9IGtzdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBtYXgxNDU3N19zZXRfZmFzdF9jaGFyZ2VfdGltZXIoY2hnLCB2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihmYXN0X2NoYXJnZV90aW1lciwgU19JUlVHTyB8IFNfSVdVU1IsCisJCXNob3dfZmFzdF9jaGFyZ2VfdGltZXIsIHN0b3JlX2Zhc3RfY2hhcmdlX3RpbWVyKTsKKworc3RhdGljIGludCBtYXgxNDU3N19jaGFyZ2VyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG1heDE0NTc3X2NoYXJnZXIgKmNoZzsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307CisJc3RydWN0IG1heDE0NTc3ICptYXgxNDU3NyA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKwlpbnQgcmV0OworCisJY2hnID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqY2hnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaGcpCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY2hnKTsKKwljaGctPmRldiA9ICZwZGV2LT5kZXY7CisJY2hnLT5tYXgxNDU3NyA9IG1heDE0NTc3OworCisJY2hnLT5wZGF0YSA9IG1heDE0NTc3X2NoYXJnZXJfZHRfaW5pdChwZGV2KTsKKwlpZiAoSVNfRVJSX09SX05VTEwoY2hnLT5wZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKGNoZy0+cGRhdGEpOworCisJcmV0ID0gbWF4MTQ1NzdfY2hhcmdlcl9yZWdfaW5pdChjaGcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2Zhc3RfY2hhcmdlX3RpbWVyKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZDogY3JlYXRlIHN5c2ZzIGVudHJ5XG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwc3lfY2ZnLmRydl9kYXRhID0gY2hnOworCWNoZy0+Y2hhcmdlciA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmbWF4MTQ1NzdfY2hhcmdlcl9kZXNjLAorCQkJCQkJJnBzeV9jZmcpOworCWlmIChJU19FUlIoY2hnLT5jaGFyZ2VyKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQ6IHBvd2VyIHN1cHBseSByZWdpc3RlclxuIik7CisJCXJldCA9IFBUUl9FUlIoY2hnLT5jaGFyZ2VyKTsKKwkJZ290byBlcnI7CisJfQorCisJLyogQ2hlY2sgZm9yIHZhbGlkIHZhbHVlcyBmb3IgY2hhcmdlciAqLworCUJVSUxEX0JVR19PTihNQVgxNDU3N19DSEFSR0VSX0VPQ19DVVJSRU5UX0xJTUlUX01JTiArCisJCQlNQVgxNDU3N19DSEFSR0VSX0VPQ19DVVJSRU5UX0xJTUlUX1NURVAgKiAweGYgIT0KKwkJCU1BWDE0NTc3X0NIQVJHRVJfRU9DX0NVUlJFTlRfTElNSVRfTUFYKTsKKwlyZXR1cm4gMDsKKworZXJyOgorCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZmFzdF9jaGFyZ2VfdGltZXIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtYXgxNDU3N19jaGFyZ2VyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtYXgxNDU3N19jaGFyZ2VyICpjaGcgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZmFzdF9jaGFyZ2VfdGltZXIpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGNoZy0+Y2hhcmdlcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgbWF4MTQ1NzdfY2hhcmdlcl9pZFtdID0geworCXsgIm1heDE0NTc3LWNoYXJnZXIiLCBNQVhJTV9ERVZJQ0VfVFlQRV9NQVgxNDU3NywgfSwKKwl7ICJtYXg3NzgzNi1jaGFyZ2VyIiwgTUFYSU1fREVWSUNFX1RZUEVfTUFYNzc4MzYsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwbGF0Zm9ybSwgbWF4MTQ1NzdfY2hhcmdlcl9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1heDE0NTc3X2NoYXJnZXJfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gIm1heDE0NTc3LWNoYXJnZXIiLAorCX0sCisJLnByb2JlCQk9IG1heDE0NTc3X2NoYXJnZXJfcHJvYmUsCisJLnJlbW92ZQkJPSBtYXgxNDU3N19jaGFyZ2VyX3JlbW92ZSwKKwkuaWRfdGFibGUJPSBtYXgxNDU3N19jaGFyZ2VyX2lkLAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobWF4MTQ1NzdfY2hhcmdlcl9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJLcnp5c3p0b2YgS296bG93c2tpIDxrcnprQGtlcm5lbC5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1heGltIDE0NTc3Lzc3ODM2IGNoYXJnZXIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL21heDE3MDQwX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L21heDE3MDQwX2JhdHRlcnkuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci9tYXgxNzA0MF9iYXR0ZXJ5LmMKcmVuYW1lIHRvIGRyaXZlcnMvcG93ZXIvc3VwcGx5L21heDE3MDQwX2JhdHRlcnkuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9zdXBwbHkvbWF4MTcwNDJfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvbWF4MTcwNDJfYmF0dGVyeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhN2E3NWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9tYXgxNzA0Ml9iYXR0ZXJ5LmMKQEAgLTAsMCArMSwxMDE5IEBACisvKgorICogRnVlbCBnYXVnZSBkcml2ZXIgZm9yIE1heGltIDE3MDQyIC8gODk2NiAvIDg5OTcKKyAqICBOb3RlIHRoYXQgTWF4aW0gODk2NiBhbmQgODk5NyBhcmUgbWZkIGFuZCB0aGlzIGlzIGl0cyBzdWJkZXZpY2UuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqIE15dW5nSm9vIEhhbSA8bXl1bmdqb28uaGFtQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiBtYXgxNzA0MF9iYXR0ZXJ5LmMKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CisjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+CisjaW5jbHVkZSA8bGludXgvcG93ZXIvbWF4MTcwNDJfYmF0dGVyeS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKy8qIFN0YXR1cyByZWdpc3RlciBiaXRzICovCisjZGVmaW5lIFNUQVRVU19QT1JfQklUICAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgU1RBVFVTX0JTVF9CSVQgICAgICAgICAoMSA8PCAzKQorI2RlZmluZSBTVEFUVVNfVk1OX0JJVCAgICAgICAgICgxIDw8IDgpCisjZGVmaW5lIFNUQVRVU19UTU5fQklUICAgICAgICAgKDEgPDwgOSkKKyNkZWZpbmUgU1RBVFVTX1NNTl9CSVQgICAgICAgICAoMSA8PCAxMCkKKyNkZWZpbmUgU1RBVFVTX0JJX0JJVCAgICAgICAgICAoMSA8PCAxMSkKKyNkZWZpbmUgU1RBVFVTX1ZNWF9CSVQgICAgICAgICAoMSA8PCAxMikKKyNkZWZpbmUgU1RBVFVTX1RNWF9CSVQgICAgICAgICAoMSA8PCAxMykKKyNkZWZpbmUgU1RBVFVTX1NNWF9CSVQgICAgICAgICAoMSA8PCAxNCkKKyNkZWZpbmUgU1RBVFVTX0JSX0JJVCAgICAgICAgICAoMSA8PCAxNSkKKworLyogSW50ZXJydXB0IG1hc2sgYml0cyAqLworI2RlZmluZSBDT05GSUdfQUxSVF9CSVRfRU5CTAkoMSA8PCAyKQorI2RlZmluZSBTVEFUVVNfSU5UUl9TT0NNSU5fQklUCSgxIDw8IDEwKQorI2RlZmluZSBTVEFUVVNfSU5UUl9TT0NNQVhfQklUCSgxIDw8IDE0KQorCisjZGVmaW5lIFZGU09DMF9MT0NLCQkweDAwMDAKKyNkZWZpbmUgVkZTT0MwX1VOTE9DSwkJMHgwMDgwCisjZGVmaW5lIE1PREVMX1VOTE9DSzEJMFgwMDU5CisjZGVmaW5lIE1PREVMX1VOTE9DSzIJMFgwMEM0CisjZGVmaW5lIE1PREVMX0xPQ0sxCQkwWDAwMDAKKyNkZWZpbmUgTU9ERUxfTE9DSzIJCTBYMDAwMAorCisjZGVmaW5lIGRRX0FDQ19ESVYJMHg0CisjZGVmaW5lIGRQX0FDQ18xMDAJMHgxOTAwCisjZGVmaW5lIGRQX0FDQ18yMDAJMHgzMjAwCisKKyNkZWZpbmUgTUFYMTcwNDJfVk1BWF9UT0xFUkFOQ0UJCTUwIC8qIDUwIG1WICovCisKK3N0cnVjdCBtYXgxNzA0Ml9jaGlwIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXR0ZXJ5OworCWVudW0gbWF4MTcweHhfY2hpcF90eXBlIGNoaXBfdHlwZTsKKwlzdHJ1Y3QgbWF4MTcwNDJfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJaW50ICAgIGluaXRfY29tcGxldGU7Cit9OworCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgbWF4MTcwNDJfYmF0dGVyeV9wcm9wc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsCisJUE9XRVJfU1VQUExZX1BST1BfQ1lDTEVfQ09VTlQsCisJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NQVgsCisJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU5fREVTSUdOLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfQVZHLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfT0NWLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9DT1VOVEVSLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVAsCisJUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTEVSVF9NSU4sCisJUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTEVSVF9NQVgsCisJUE9XRVJfU1VQUExZX1BST1BfVEVNUF9NSU4sCisJUE9XRVJfU1VQUExZX1BST1BfVEVNUF9NQVgsCisJUE9XRVJfU1VQUExZX1BST1BfSEVBTFRILAorCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfQVZHLAorfTsKKworc3RhdGljIGludCBtYXgxNzA0Ml9nZXRfdGVtcGVyYXR1cmUoc3RydWN0IG1heDE3MDQyX2NoaXAgKmNoaXAsIGludCAqdGVtcCkKK3sKKwlpbnQgcmV0OworCXUzMiBkYXRhOworCXN0cnVjdCByZWdtYXAgKm1hcCA9IGNoaXAtPnJlZ21hcDsKKworCXJldCA9IHJlZ21hcF9yZWFkKG1hcCwgTUFYMTcwNDJfVEVNUCwgJmRhdGEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJKnRlbXAgPSBkYXRhOworCS8qIFRoZSB2YWx1ZSBpcyBzaWduZWQuICovCisJaWYgKCp0ZW1wICYgMHg4MDAwKSB7CisJCSp0ZW1wID0gKDB4N2ZmZiAmIH4qdGVtcCkgKyAxOworCQkqdGVtcCAqPSAtMTsKKwl9CisKKwkvKiBUaGUgdmFsdWUgaXMgY29udmVydGVkIGludG8gZGVjaS1jZW50aWdyYWRlIHNjYWxlICovCisJLyogVW5pdHMgb2YgTFNCID0gMSAvIDI1NiBkZWdyZWUgQ2Vsc2l1cyAqLworCSp0ZW1wID0gKnRlbXAgKiAxMCAvIDI1NjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXgxNzA0Ml9nZXRfYmF0dGVyeV9oZWFsdGgoc3RydWN0IG1heDE3MDQyX2NoaXAgKmNoaXAsIGludCAqaGVhbHRoKQoreworCWludCB0ZW1wLCB2YXZnLCB2YmF0dCwgcmV0OworCXUzMiB2YWw7CisKKwlyZXQgPSByZWdtYXBfcmVhZChjaGlwLT5yZWdtYXAsIE1BWDE3MDQyX0F2Z1ZDRUxMLCAmdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBoZWFsdGhfZXJyb3I7CisKKwkvKiBiaXRzIFswLTNdIHVudXNlZCAqLworCXZhdmcgPSB2YWwgKiA2MjUgLyA4OworCS8qIENvbnZlcnQgdG8gbWlsbGl2b2x0cyAqLworCXZhdmcgLz0gMTAwMDsKKworCXJldCA9IHJlZ21hcF9yZWFkKGNoaXAtPnJlZ21hcCwgTUFYMTcwNDJfVkNFTEwsICZ2YWwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGhlYWx0aF9lcnJvcjsKKworCS8qIGJpdHMgWzAtM10gdW51c2VkICovCisJdmJhdHQgPSB2YWwgKiA2MjUgLyA4OworCS8qIENvbnZlcnQgdG8gbWlsbGl2b2x0cyAqLworCXZiYXR0IC89IDEwMDA7CisKKwlpZiAodmF2ZyA8IGNoaXAtPnBkYXRhLT52bWluKSB7CisJCSpoZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0RFQUQ7CisJCWdvdG8gb3V0OworCX0KKworCWlmICh2YmF0dCA+IGNoaXAtPnBkYXRhLT52bWF4ICsgTUFYMTcwNDJfVk1BWF9UT0xFUkFOQ0UpIHsKKwkJKmhlYWx0aCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUlZPTFRBR0U7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG1heDE3MDQyX2dldF90ZW1wZXJhdHVyZShjaGlwLCAmdGVtcCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gaGVhbHRoX2Vycm9yOworCisJaWYgKHRlbXAgPD0gY2hpcC0+cGRhdGEtPnRlbXBfbWluKSB7CisJCSpoZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0NPTEQ7CisJCWdvdG8gb3V0OworCX0KKworCWlmICh0ZW1wID49IGNoaXAtPnBkYXRhLT50ZW1wX21heCkgeworCQkqaGVhbHRoID0gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSSEVBVDsKKwkJZ290byBvdXQ7CisJfQorCisJKmhlYWx0aCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfR09PRDsKKworb3V0OgorCXJldHVybiAwOworCitoZWFsdGhfZXJyb3I6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtYXgxNzA0Ml9nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAorCQkJICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwkJCSAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXN0cnVjdCBtYXgxNzA0Ml9jaGlwICpjaGlwID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CisJc3RydWN0IHJlZ21hcCAqbWFwID0gY2hpcC0+cmVnbWFwOworCWludCByZXQ7CisJdTMyIGRhdGE7CisKKwlpZiAoIWNoaXAtPmluaXRfY29tcGxldGUpCisJCXJldHVybiAtRUFHQUlOOworCisJc3dpdGNoIChwc3ApIHsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ6CisJCXJldCA9IHJlZ21hcF9yZWFkKG1hcCwgTUFYMTcwNDJfU1RBVFVTLCAmZGF0YSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlpZiAoZGF0YSAmIE1BWDE3MDQyX1NUQVRVU19CYXR0QWJzZW50KQorCQkJdmFsLT5pbnR2YWwgPSAwOworCQllbHNlCisJCQl2YWwtPmludHZhbCA9IDE7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ1lDTEVfQ09VTlQ6CisJCXJldCA9IHJlZ21hcF9yZWFkKG1hcCwgTUFYMTcwNDJfQ3ljbGVzLCAmZGF0YSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQl2YWwtPmludHZhbCA9IGRhdGE7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NQVg6CisJCXJldCA9IHJlZ21hcF9yZWFkKG1hcCwgTUFYMTcwNDJfTWluTWF4Vm9sdCwgJmRhdGEpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJdmFsLT5pbnR2YWwgPSBkYXRhID4+IDg7CisJCXZhbC0+aW50dmFsICo9IDIwMDAwOyAvKiBVbml0cyBvZiBMU0IgPSAyMG1WICovCisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU5fREVTSUdOOgorCQlpZiAoY2hpcC0+Y2hpcF90eXBlID09IE1BWElNX0RFVklDRV9UWVBFX01BWDE3MDQyKQorCQkJcmV0ID0gcmVnbWFwX3JlYWQobWFwLCBNQVgxNzA0Ml9WX2VtcHR5LCAmZGF0YSk7CisJCWVsc2UKKwkJCXJldCA9IHJlZ21hcF9yZWFkKG1hcCwgTUFYMTcwNDdfVl9lbXB0eSwgJmRhdGEpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJdmFsLT5pbnR2YWwgPSBkYXRhID4+IDc7CisJCXZhbC0+aW50dmFsICo9IDEwMDAwOyAvKiBVbml0cyBvZiBMU0IgPSAxMG1WICovCisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c6CisJCXJldCA9IHJlZ21hcF9yZWFkKG1hcCwgTUFYMTcwNDJfVkNFTEwsICZkYXRhKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXZhbC0+aW50dmFsID0gZGF0YSAqIDYyNSAvIDg7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9BVkc6CisJCXJldCA9IHJlZ21hcF9yZWFkKG1hcCwgTUFYMTcwNDJfQXZnVkNFTEwsICZkYXRhKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXZhbC0+aW50dmFsID0gZGF0YSAqIDYyNSAvIDg7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9PQ1Y6CisJCXJldCA9IHJlZ21hcF9yZWFkKG1hcCwgTUFYMTcwNDJfT0NWSW50ZXJuYWwsICZkYXRhKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXZhbC0+aW50dmFsID0gZGF0YSAqIDYyNSAvIDg7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFk6CisJCXJldCA9IHJlZ21hcF9yZWFkKG1hcCwgTUFYMTcwNDJfUmVwU09DLCAmZGF0YSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQl2YWwtPmludHZhbCA9IGRhdGEgPj4gODsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTDoKKwkJcmV0ID0gcmVnbWFwX3JlYWQobWFwLCBNQVgxNzA0Ml9GdWxsQ0FQLCAmZGF0YSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQl2YWwtPmludHZhbCA9IGRhdGEgKiAxMDAwIC8gMjsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfQ09VTlRFUjoKKwkJcmV0ID0gcmVnbWFwX3JlYWQobWFwLCBNQVgxNzA0Ml9RSCwgJmRhdGEpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJdmFsLT5pbnR2YWwgPSBkYXRhICogMTAwMCAvIDI7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUDoKKwkJcmV0ID0gbWF4MTcwNDJfZ2V0X3RlbXBlcmF0dXJlKGNoaXAsICZ2YWwtPmludHZhbCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QX0FMRVJUX01JTjoKKwkJcmV0ID0gcmVnbWFwX3JlYWQobWFwLCBNQVgxNzA0Ml9UQUxSVF9UaCwgJmRhdGEpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCS8qIExTQiBpcyBBbGVydCBNaW5pbXVtLiBJbiBkZWNpLWNlbnRpZ3JhZGUgKi8KKwkJdmFsLT5pbnR2YWwgPSAoZGF0YSAmIDB4ZmYpICogMTA7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTEVSVF9NQVg6CisJCXJldCA9IHJlZ21hcF9yZWFkKG1hcCwgTUFYMTcwNDJfVEFMUlRfVGgsICZkYXRhKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQkvKiBNU0IgaXMgQWxlcnQgTWF4aW11bS4gSW4gZGVjaS1jZW50aWdyYWRlICovCisJCXZhbC0+aW50dmFsID0gKGRhdGEgPj4gOCkgKiAxMDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QX01JTjoKKwkJdmFsLT5pbnR2YWwgPSBjaGlwLT5wZGF0YS0+dGVtcF9taW47CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUF9NQVg6CisJCXZhbC0+aW50dmFsID0gY2hpcC0+cGRhdGEtPnRlbXBfbWF4OworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSDoKKwkJcmV0ID0gbWF4MTcwNDJfZ2V0X2JhdHRlcnlfaGVhbHRoKGNoaXAsICZ2YWwtPmludHZhbCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVzoKKwkJaWYgKGNoaXAtPnBkYXRhLT5lbmFibGVfY3VycmVudF9zZW5zZSkgeworCQkJcmV0ID0gcmVnbWFwX3JlYWQobWFwLCBNQVgxNzA0Ml9DdXJyZW50LCAmZGF0YSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCisJCQl2YWwtPmludHZhbCA9IGRhdGE7CisJCQlpZiAodmFsLT5pbnR2YWwgJiAweDgwMDApIHsKKwkJCQkvKiBOZWdhdGl2ZSAqLworCQkJCXZhbC0+aW50dmFsID0gfnZhbC0+aW50dmFsICYgMHg3ZmZmOworCQkJCXZhbC0+aW50dmFsKys7CisJCQkJdmFsLT5pbnR2YWwgKj0gLTE7CisJCQl9CisJCQl2YWwtPmludHZhbCAqPSAxNTYyNTAwIC8gY2hpcC0+cGRhdGEtPnJfc25zOworCQl9IGVsc2UgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX0FWRzoKKwkJaWYgKGNoaXAtPnBkYXRhLT5lbmFibGVfY3VycmVudF9zZW5zZSkgeworCQkJcmV0ID0gcmVnbWFwX3JlYWQobWFwLCBNQVgxNzA0Ml9BdmdDdXJyZW50LCAmZGF0YSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCisJCQl2YWwtPmludHZhbCA9IGRhdGE7CisJCQlpZiAodmFsLT5pbnR2YWwgJiAweDgwMDApIHsKKwkJCQkvKiBOZWdhdGl2ZSAqLworCQkJCXZhbC0+aW50dmFsID0gfnZhbC0+aW50dmFsICYgMHg3ZmZmOworCQkJCXZhbC0+aW50dmFsKys7CisJCQkJdmFsLT5pbnR2YWwgKj0gLTE7CisJCQl9CisJCQl2YWwtPmludHZhbCAqPSAxNTYyNTAwIC8gY2hpcC0+cGRhdGEtPnJfc25zOworCQl9IGVsc2UgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1heDE3MDQyX3NldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJCQkgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCQkJICAgIGNvbnN0IHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJc3RydWN0IG1heDE3MDQyX2NoaXAgKmNoaXAgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKKwlzdHJ1Y3QgcmVnbWFwICptYXAgPSBjaGlwLT5yZWdtYXA7CisJaW50IHJldCA9IDA7CisJdTMyIGRhdGE7CisJaW50OF90IHRlbXA7CisKKwlzd2l0Y2ggKHBzcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTEVSVF9NSU46CisJCXJldCA9IHJlZ21hcF9yZWFkKG1hcCwgTUFYMTcwNDJfVEFMUlRfVGgsICZkYXRhKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCS8qIElucHV0IGluIGRlY2ktY2VudGlncmFkZSwgY29udmVydCB0byBjZW50aWdyYWRlICovCisJCXRlbXAgPSB2YWwtPmludHZhbCAvIDEwOworCQkvKiBmb3JjZSBtaW4gPCBtYXggKi8KKwkJaWYgKHRlbXAgPj0gKGludDhfdCkoZGF0YSA+PiA4KSkKKwkJCXRlbXAgPSAoaW50OF90KShkYXRhID4+IDgpIC0gMTsKKwkJLyogV3JpdGUgYm90aCBNQVggYW5kIE1JTiBBTEVSVCAqLworCQlkYXRhID0gKGRhdGEgJiAweGZmMDApICsgdGVtcDsKKwkJcmV0ID0gcmVnbWFwX3dyaXRlKG1hcCwgTUFYMTcwNDJfVEFMUlRfVGgsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQUxFUlRfTUFYOgorCQlyZXQgPSByZWdtYXBfcmVhZChtYXAsIE1BWDE3MDQyX1RBTFJUX1RoLCAmZGF0YSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQkvKiBJbnB1dCBpbiBEZWNpLUNlbnRpZ3JhZGUsIGNvbnZlcnQgdG8gY2VudGlncmFkZSAqLworCQl0ZW1wID0gdmFsLT5pbnR2YWwgLyAxMDsKKwkJLyogZm9yY2UgbWF4ID4gbWluICovCisJCWlmICh0ZW1wIDw9IChpbnQ4X3QpKGRhdGEgJiAweGZmKSkKKwkJCXRlbXAgPSAoaW50OF90KShkYXRhICYgMHhmZikgKyAxOworCQkvKiBXcml0ZSBib3RoIE1BWCBhbmQgTUlOIEFMRVJUICovCisJCWRhdGEgPSAoZGF0YSAmIDB4ZmYpICsgKHRlbXAgPDwgOCk7CisJCXJldCA9IHJlZ21hcF93cml0ZShtYXAsIE1BWDE3MDQyX1RBTFJUX1RoLCBkYXRhKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1heDE3MDQyX3Byb3BlcnR5X2lzX3dyaXRlYWJsZShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCkKK3sKKwlpbnQgcmV0OworCisJc3dpdGNoIChwc3ApIHsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQUxFUlRfTUlOOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTEVSVF9NQVg6CisJCXJldCA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IDA7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtYXgxNzA0Ml93cml0ZV92ZXJpZnlfcmVnKHN0cnVjdCByZWdtYXAgKm1hcCwgdTggcmVnLCB1MzIgdmFsdWUpCit7CisJaW50IHJldHJpZXMgPSA4OworCWludCByZXQ7CisJdTMyIHJlYWRfdmFsdWU7CisKKwlkbyB7CisJCXJldCA9IHJlZ21hcF93cml0ZShtYXAsIHJlZywgdmFsdWUpOworCQlyZWdtYXBfcmVhZChtYXAsIHJlZywgJnJlYWRfdmFsdWUpOworCQlpZiAocmVhZF92YWx1ZSAhPSB2YWx1ZSkgeworCQkJcmV0ID0gLUVJTzsKKwkJCXJldHJpZXMtLTsKKwkJfQorCX0gd2hpbGUgKHJldHJpZXMgJiYgcmVhZF92YWx1ZSAhPSB2YWx1ZSk7CisKKwlpZiAocmV0IDwgMCkKKwkJcHJfZXJyKCIlczogZXJyICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXgxNzA0Ml9vdmVycmlkZV9wb3Ioc3RydWN0IHJlZ21hcCAqbWFwLAorCQkJCQkgdTggcmVnLCB1MTYgdmFsdWUpCit7CisJaWYgKHZhbHVlKQorCQlyZWdtYXBfd3JpdGUobWFwLCByZWcsIHZhbHVlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1heDEwNzQyX3VubG9ja19tb2RlbChzdHJ1Y3QgbWF4MTcwNDJfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3QgcmVnbWFwICptYXAgPSBjaGlwLT5yZWdtYXA7CisKKwlyZWdtYXBfd3JpdGUobWFwLCBNQVgxNzA0Ml9NTE9DS1JlZzEsIE1PREVMX1VOTE9DSzEpOworCXJlZ21hcF93cml0ZShtYXAsIE1BWDE3MDQyX01MT0NLUmVnMiwgTU9ERUxfVU5MT0NLMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXgxMDc0Ml9sb2NrX21vZGVsKHN0cnVjdCBtYXgxNzA0Ml9jaGlwICpjaGlwKQoreworCXN0cnVjdCByZWdtYXAgKm1hcCA9IGNoaXAtPnJlZ21hcDsKKworCXJlZ21hcF93cml0ZShtYXAsIE1BWDE3MDQyX01MT0NLUmVnMSwgTU9ERUxfTE9DSzEpOworCXJlZ21hcF93cml0ZShtYXAsIE1BWDE3MDQyX01MT0NLUmVnMiwgTU9ERUxfTE9DSzIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWF4MTcwNDJfd3JpdGVfbW9kZWxfZGF0YShzdHJ1Y3QgbWF4MTcwNDJfY2hpcCAqY2hpcCwKKwkJCQkJdTggYWRkciwgaW50IHNpemUpCit7CisJc3RydWN0IHJlZ21hcCAqbWFwID0gY2hpcC0+cmVnbWFwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJcmVnbWFwX3dyaXRlKG1hcCwgYWRkciArIGksCisJCQljaGlwLT5wZGF0YS0+Y29uZmlnX2RhdGEtPmNlbGxfY2hhcl90YmxbaV0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWF4MTcwNDJfcmVhZF9tb2RlbF9kYXRhKHN0cnVjdCBtYXgxNzA0Ml9jaGlwICpjaGlwLAorCQkJCQl1OCBhZGRyLCB1MTYgKmRhdGEsIGludCBzaXplKQoreworCXN0cnVjdCByZWdtYXAgKm1hcCA9IGNoaXAtPnJlZ21hcDsKKwlpbnQgaTsKKwl1MzIgdG1wOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlyZWdtYXBfcmVhZChtYXAsIGFkZHIgKyBpLCAmdG1wKTsKKwkJZGF0YVtpXSA9ICh1MTYpdG1wOworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgbWF4MTcwNDJfbW9kZWxfZGF0YV9jb21wYXJlKHN0cnVjdCBtYXgxNzA0Ml9jaGlwICpjaGlwLAorCQkJCQl1MTYgKmRhdGExLCB1MTYgKmRhdGEyLCBpbnQgc2l6ZSkKK3sKKwlpbnQgaTsKKworCWlmIChtZW1jbXAoZGF0YTEsIGRhdGEyLCBzaXplKSkgeworCQlkZXZfZXJyKCZjaGlwLT5jbGllbnQtPmRldiwgIiVzIGNvbXBhcmUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCQlkZXZfaW5mbygmY2hpcC0+Y2xpZW50LT5kZXYsICIweCV4LCAweCV4IiwKKwkJCQlkYXRhMVtpXSwgZGF0YTJbaV0pOworCQlkZXZfaW5mbygmY2hpcC0+Y2xpZW50LT5kZXYsICJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWF4MTcwNDJfaW5pdF9tb2RlbChzdHJ1Y3QgbWF4MTcwNDJfY2hpcCAqY2hpcCkKK3sKKwlpbnQgcmV0OworCWludCB0YWJsZV9zaXplID0gQVJSQVlfU0laRShjaGlwLT5wZGF0YS0+Y29uZmlnX2RhdGEtPmNlbGxfY2hhcl90YmwpOworCXUxNiAqdGVtcF9kYXRhOworCisJdGVtcF9kYXRhID0ga2NhbGxvYyh0YWJsZV9zaXplLCBzaXplb2YoKnRlbXBfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghdGVtcF9kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1heDEwNzQyX3VubG9ja19tb2RlbChjaGlwKTsKKwltYXgxNzA0Ml93cml0ZV9tb2RlbF9kYXRhKGNoaXAsIE1BWDE3MDQyX01PREVMQ2hyVGJsLAorCQkJCXRhYmxlX3NpemUpOworCW1heDE3MDQyX3JlYWRfbW9kZWxfZGF0YShjaGlwLCBNQVgxNzA0Ml9NT0RFTENoclRibCwgdGVtcF9kYXRhLAorCQkJCXRhYmxlX3NpemUpOworCisJcmV0ID0gbWF4MTcwNDJfbW9kZWxfZGF0YV9jb21wYXJlKAorCQljaGlwLAorCQljaGlwLT5wZGF0YS0+Y29uZmlnX2RhdGEtPmNlbGxfY2hhcl90YmwsCisJCXRlbXBfZGF0YSwKKwkJdGFibGVfc2l6ZSk7CisKKwltYXgxMDc0Ml9sb2NrX21vZGVsKGNoaXApOworCWtmcmVlKHRlbXBfZGF0YSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1heDE3MDQyX3ZlcmlmeV9tb2RlbF9sb2NrKHN0cnVjdCBtYXgxNzA0Ml9jaGlwICpjaGlwKQoreworCWludCBpOworCWludCB0YWJsZV9zaXplID0gQVJSQVlfU0laRShjaGlwLT5wZGF0YS0+Y29uZmlnX2RhdGEtPmNlbGxfY2hhcl90YmwpOworCXUxNiAqdGVtcF9kYXRhOworCWludCByZXQgPSAwOworCisJdGVtcF9kYXRhID0ga2NhbGxvYyh0YWJsZV9zaXplLCBzaXplb2YoKnRlbXBfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghdGVtcF9kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1heDE3MDQyX3JlYWRfbW9kZWxfZGF0YShjaGlwLCBNQVgxNzA0Ml9NT0RFTENoclRibCwgdGVtcF9kYXRhLAorCQkJCXRhYmxlX3NpemUpOworCWZvciAoaSA9IDA7IGkgPCB0YWJsZV9zaXplOyBpKyspCisJCWlmICh0ZW1wX2RhdGFbaV0pCisJCQlyZXQgPSAtRUlOVkFMOworCisJa2ZyZWUodGVtcF9kYXRhKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtYXgxNzA0Ml93cml0ZV9jb25maWdfcmVncyhzdHJ1Y3QgbWF4MTcwNDJfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3QgbWF4MTcwNDJfY29uZmlnX2RhdGEgKmNvbmZpZyA9IGNoaXAtPnBkYXRhLT5jb25maWdfZGF0YTsKKwlzdHJ1Y3QgcmVnbWFwICptYXAgPSBjaGlwLT5yZWdtYXA7CisKKwlyZWdtYXBfd3JpdGUobWFwLCBNQVgxNzA0Ml9DT05GSUcsIGNvbmZpZy0+Y29uZmlnKTsKKwlyZWdtYXBfd3JpdGUobWFwLCBNQVgxNzA0Ml9MZWFybkNGRywgY29uZmlnLT5sZWFybl9jZmcpOworCXJlZ21hcF93cml0ZShtYXAsIE1BWDE3MDQyX0ZpbHRlckNGRywKKwkJCWNvbmZpZy0+ZmlsdGVyX2NmZyk7CisJcmVnbWFwX3dyaXRlKG1hcCwgTUFYMTcwNDJfUmVsYXhDRkcsIGNvbmZpZy0+cmVsYXhfY2ZnKTsKKwlpZiAoY2hpcC0+Y2hpcF90eXBlID09IE1BWElNX0RFVklDRV9UWVBFX01BWDE3MDQ3IHx8CisJCQljaGlwLT5jaGlwX3R5cGUgPT0gTUFYSU1fREVWSUNFX1RZUEVfTUFYMTcwNTApCisJCXJlZ21hcF93cml0ZShtYXAsIE1BWDE3MDQ3X0Z1bGxTT0NUaHIsCisJCQkJCQljb25maWctPmZ1bGxfc29jX3RocmVzaCk7Cit9CisKK3N0YXRpYyB2b2lkICBtYXgxNzA0Ml93cml0ZV9jdXN0b21fcmVncyhzdHJ1Y3QgbWF4MTcwNDJfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3QgbWF4MTcwNDJfY29uZmlnX2RhdGEgKmNvbmZpZyA9IGNoaXAtPnBkYXRhLT5jb25maWdfZGF0YTsKKwlzdHJ1Y3QgcmVnbWFwICptYXAgPSBjaGlwLT5yZWdtYXA7CisKKwltYXgxNzA0Ml93cml0ZV92ZXJpZnlfcmVnKG1hcCwgTUFYMTcwNDJfUkNPTVAwLCBjb25maWctPnJjb21wMCk7CisJbWF4MTcwNDJfd3JpdGVfdmVyaWZ5X3JlZyhtYXAsIE1BWDE3MDQyX1RlbXBDbywJY29uZmlnLT50Y29tcGMwKTsKKwltYXgxNzA0Ml93cml0ZV92ZXJpZnlfcmVnKG1hcCwgTUFYMTcwNDJfSUNIR1Rlcm0sIGNvbmZpZy0+aWNoZ3RfdGVybSk7CisJaWYgKGNoaXAtPmNoaXBfdHlwZSA9PSBNQVhJTV9ERVZJQ0VfVFlQRV9NQVgxNzA0MikgeworCQlyZWdtYXBfd3JpdGUobWFwLCBNQVgxNzA0Ml9FbXB0eVRlbXBDbywJY29uZmlnLT5lbXB0eV90ZW1wY28pOworCQltYXgxNzA0Ml93cml0ZV92ZXJpZnlfcmVnKG1hcCwgTUFYMTcwNDJfS19lbXB0eTAsCisJCQkJCWNvbmZpZy0+a2VtcHR5MCk7CisJfSBlbHNlIHsKKwkJbWF4MTcwNDJfd3JpdGVfdmVyaWZ5X3JlZyhtYXAsIE1BWDE3MDQ3X1FSVGJsMDAsCisJCQkJCQljb25maWctPnFydGJsMDApOworCQltYXgxNzA0Ml93cml0ZV92ZXJpZnlfcmVnKG1hcCwgTUFYMTcwNDdfUVJUYmwxMCwKKwkJCQkJCWNvbmZpZy0+cXJ0YmwxMCk7CisJCW1heDE3MDQyX3dyaXRlX3ZlcmlmeV9yZWcobWFwLCBNQVgxNzA0N19RUlRibDIwLAorCQkJCQkJY29uZmlnLT5xcnRibDIwKTsKKwkJbWF4MTcwNDJfd3JpdGVfdmVyaWZ5X3JlZyhtYXAsIE1BWDE3MDQ3X1FSVGJsMzAsCisJCQkJCQljb25maWctPnFydGJsMzApOworCX0KK30KKworc3RhdGljIHZvaWQgbWF4MTcwNDJfdXBkYXRlX2NhcGFjaXR5X3JlZ3Moc3RydWN0IG1heDE3MDQyX2NoaXAgKmNoaXApCit7CisJc3RydWN0IG1heDE3MDQyX2NvbmZpZ19kYXRhICpjb25maWcgPSBjaGlwLT5wZGF0YS0+Y29uZmlnX2RhdGE7CisJc3RydWN0IHJlZ21hcCAqbWFwID0gY2hpcC0+cmVnbWFwOworCisJbWF4MTcwNDJfd3JpdGVfdmVyaWZ5X3JlZyhtYXAsIE1BWDE3MDQyX0Z1bGxDQVAsCisJCQkJY29uZmlnLT5mdWxsY2FwKTsKKwlyZWdtYXBfd3JpdGUobWFwLCBNQVgxNzA0Ml9EZXNpZ25DYXAsIGNvbmZpZy0+ZGVzaWduX2NhcCk7CisJbWF4MTcwNDJfd3JpdGVfdmVyaWZ5X3JlZyhtYXAsIE1BWDE3MDQyX0Z1bGxDQVBOb20sCisJCQkJY29uZmlnLT5mdWxsY2Fwbm9tKTsKK30KKworc3RhdGljIHZvaWQgbWF4MTcwNDJfcmVzZXRfdmZzb2MwX3JlZyhzdHJ1Y3QgbWF4MTcwNDJfY2hpcCAqY2hpcCkKK3sKKwl1bnNpZ25lZCBpbnQgdmZTb2M7CisJc3RydWN0IHJlZ21hcCAqbWFwID0gY2hpcC0+cmVnbWFwOworCisJcmVnbWFwX3JlYWQobWFwLCBNQVgxNzA0Ml9WRlNPQywgJnZmU29jKTsKKwlyZWdtYXBfd3JpdGUobWFwLCBNQVgxNzA0Ml9WRlNPQzBFbmFibGUsIFZGU09DMF9VTkxPQ0spOworCW1heDE3MDQyX3dyaXRlX3ZlcmlmeV9yZWcobWFwLCBNQVgxNzA0Ml9WRlNPQzAsIHZmU29jKTsKKwlyZWdtYXBfd3JpdGUobWFwLCBNQVgxNzA0Ml9WRlNPQzBFbmFibGUsIFZGU09DMF9MT0NLKTsKK30KKworc3RhdGljIHZvaWQgbWF4MTcwNDJfbG9hZF9uZXdfY2FwYWNpdHlfcGFyYW1zKHN0cnVjdCBtYXgxNzA0Ml9jaGlwICpjaGlwKQoreworCXUzMiBmdWxsX2NhcDAsIHJlcF9jYXAsIGRxX2FjYywgdmZTb2M7CisJdTMyIHJlbV9jYXA7CisKKwlzdHJ1Y3QgbWF4MTcwNDJfY29uZmlnX2RhdGEgKmNvbmZpZyA9IGNoaXAtPnBkYXRhLT5jb25maWdfZGF0YTsKKwlzdHJ1Y3QgcmVnbWFwICptYXAgPSBjaGlwLT5yZWdtYXA7CisKKwlyZWdtYXBfcmVhZChtYXAsIE1BWDE3MDQyX0Z1bGxDQVAwLCAmZnVsbF9jYXAwKTsKKwlyZWdtYXBfcmVhZChtYXAsIE1BWDE3MDQyX1ZGU09DLCAmdmZTb2MpOworCisJLyogZmdfdmZTb2MgbmVlZHMgdG8gc2hpZnRlZCBieSA4IGJpdHMgdG8gZ2V0IHRoZQorCSAqIHBlcmMgaW4gMSUgYWNjdXJhY3ksIHRvIGdldCB0aGUgcmlnaHQgcmVtX2NhcCBtdWx0aXBseQorCSAqIGZ1bGxfY2FwMCwgZmdfdmZTb2MgYW5kIGRldmlkZSBieSAxMDAKKwkgKi8KKwlyZW1fY2FwID0gKCh2ZlNvYyA+PiA4KSAqIGZ1bGxfY2FwMCkgLyAxMDA7CisJbWF4MTcwNDJfd3JpdGVfdmVyaWZ5X3JlZyhtYXAsIE1BWDE3MDQyX1JlbUNhcCwgcmVtX2NhcCk7CisKKwlyZXBfY2FwID0gcmVtX2NhcDsKKwltYXgxNzA0Ml93cml0ZV92ZXJpZnlfcmVnKG1hcCwgTUFYMTcwNDJfUmVwQ2FwLCByZXBfY2FwKTsKKworCS8qIFdyaXRlIGRRX2FjYyB0byAyMDAlIG9mIENhcGFjaXR5IGFuZCBkUF9hY2MgdG8gMjAwJSAqLworCWRxX2FjYyA9IGNvbmZpZy0+ZnVsbGNhcCAvIGRRX0FDQ19ESVY7CisJbWF4MTcwNDJfd3JpdGVfdmVyaWZ5X3JlZyhtYXAsIE1BWDE3MDQyX2RRYWNjLCBkcV9hY2MpOworCW1heDE3MDQyX3dyaXRlX3ZlcmlmeV9yZWcobWFwLCBNQVgxNzA0Ml9kUGFjYywgZFBfQUNDXzIwMCk7CisKKwltYXgxNzA0Ml93cml0ZV92ZXJpZnlfcmVnKG1hcCwgTUFYMTcwNDJfRnVsbENBUCwKKwkJCWNvbmZpZy0+ZnVsbGNhcCk7CisJcmVnbWFwX3dyaXRlKG1hcCwgTUFYMTcwNDJfRGVzaWduQ2FwLAorCQkJY29uZmlnLT5kZXNpZ25fY2FwKTsKKwltYXgxNzA0Ml93cml0ZV92ZXJpZnlfcmVnKG1hcCwgTUFYMTcwNDJfRnVsbENBUE5vbSwKKwkJCWNvbmZpZy0+ZnVsbGNhcG5vbSk7CisJLyogVXBkYXRlIFNPQyByZWdpc3RlciB3aXRoIG5ldyBTT0MgKi8KKwlyZWdtYXBfd3JpdGUobWFwLCBNQVgxNzA0Ml9SZXBTT0MsIHZmU29jKTsKK30KKworLyoKKyAqIEJsb2NrIHdyaXRlIGFsbCB0aGUgb3ZlcnJpZGUgdmFsdWVzIGNvbWluZyBmcm9tIHBsYXRmb3JtIGRhdGEuCisgKiBUaGlzIGZ1bmN0aW9uIE1VU1QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgUE9SIGluaXRpYWxpemF0aW9uIHByb2NlZWR1cmUKKyAqIHNwZWNpZmllZCBieSBtYXhpbS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG1heDE3MDQyX292ZXJyaWRlX3Bvcl92YWx1ZXMoc3RydWN0IG1heDE3MDQyX2NoaXAgKmNoaXApCit7CisJc3RydWN0IHJlZ21hcCAqbWFwID0gY2hpcC0+cmVnbWFwOworCXN0cnVjdCBtYXgxNzA0Ml9jb25maWdfZGF0YSAqY29uZmlnID0gY2hpcC0+cGRhdGEtPmNvbmZpZ19kYXRhOworCisJbWF4MTcwNDJfb3ZlcnJpZGVfcG9yKG1hcCwgTUFYMTcwNDJfVEdBSU4sIGNvbmZpZy0+dGdhaW4pOworCW1heDE3MDQyX292ZXJyaWRlX3BvcihtYXAsIE1BeDE3MDQyX1RPRkYsIGNvbmZpZy0+dG9mZik7CisJbWF4MTcwNDJfb3ZlcnJpZGVfcG9yKG1hcCwgTUFYMTcwNDJfQ0dBSU4sIGNvbmZpZy0+Y2dhaW4pOworCW1heDE3MDQyX292ZXJyaWRlX3BvcihtYXAsIE1BWDE3MDQyX0NPRkYsIGNvbmZpZy0+Y29mZik7CisKKwltYXgxNzA0Ml9vdmVycmlkZV9wb3IobWFwLCBNQVgxNzA0Ml9WQUxSVF9UaCwgY29uZmlnLT52YWxydF90aHJlc2gpOworCW1heDE3MDQyX292ZXJyaWRlX3BvcihtYXAsIE1BWDE3MDQyX1RBTFJUX1RoLCBjb25maWctPnRhbHJ0X3RocmVzaCk7CisJbWF4MTcwNDJfb3ZlcnJpZGVfcG9yKG1hcCwgTUFYMTcwNDJfU0FMUlRfVGgsCisJCQkJCQljb25maWctPnNvY19hbHJ0X3RocmVzaCk7CisJbWF4MTcwNDJfb3ZlcnJpZGVfcG9yKG1hcCwgTUFYMTcwNDJfQ09ORklHLCBjb25maWctPmNvbmZpZyk7CisJbWF4MTcwNDJfb3ZlcnJpZGVfcG9yKG1hcCwgTUFYMTcwNDJfU0hETlRJTUVSLCBjb25maWctPnNoZG50aW1lcik7CisKKwltYXgxNzA0Ml9vdmVycmlkZV9wb3IobWFwLCBNQVgxNzA0Ml9EZXNpZ25DYXAsIGNvbmZpZy0+ZGVzaWduX2NhcCk7CisJbWF4MTcwNDJfb3ZlcnJpZGVfcG9yKG1hcCwgTUFYMTcwNDJfSUNIR1Rlcm0sIGNvbmZpZy0+aWNoZ3RfdGVybSk7CisKKwltYXgxNzA0Ml9vdmVycmlkZV9wb3IobWFwLCBNQVgxNzA0Ml9BdFJhdGUsIGNvbmZpZy0+YXRfcmF0ZSk7CisJbWF4MTcwNDJfb3ZlcnJpZGVfcG9yKG1hcCwgTUFYMTcwNDJfTGVhcm5DRkcsIGNvbmZpZy0+bGVhcm5fY2ZnKTsKKwltYXgxNzA0Ml9vdmVycmlkZV9wb3IobWFwLCBNQVgxNzA0Ml9GaWx0ZXJDRkcsIGNvbmZpZy0+ZmlsdGVyX2NmZyk7CisJbWF4MTcwNDJfb3ZlcnJpZGVfcG9yKG1hcCwgTUFYMTcwNDJfUmVsYXhDRkcsIGNvbmZpZy0+cmVsYXhfY2ZnKTsKKwltYXgxNzA0Ml9vdmVycmlkZV9wb3IobWFwLCBNQVgxNzA0Ml9NaXNjQ0ZHLCBjb25maWctPm1pc2NfY2ZnKTsKKwltYXgxNzA0Ml9vdmVycmlkZV9wb3IobWFwLCBNQVgxNzA0Ml9NYXNrU09DLCBjb25maWctPm1hc2tzb2MpOworCisJbWF4MTcwNDJfb3ZlcnJpZGVfcG9yKG1hcCwgTUFYMTcwNDJfRnVsbENBUCwgY29uZmlnLT5mdWxsY2FwKTsKKwltYXgxNzA0Ml9vdmVycmlkZV9wb3IobWFwLCBNQVgxNzA0Ml9GdWxsQ0FQTm9tLCBjb25maWctPmZ1bGxjYXBub20pOworCWlmIChjaGlwLT5jaGlwX3R5cGUgPT0gTUFYSU1fREVWSUNFX1RZUEVfTUFYMTcwNDIpCisJCW1heDE3MDQyX292ZXJyaWRlX3BvcihtYXAsIE1BWDE3MDQyX1NPQ19lbXB0eSwKKwkJCQkJCWNvbmZpZy0+c29jZW1wdHkpOworCW1heDE3MDQyX292ZXJyaWRlX3BvcihtYXAsIE1BWDE3MDQyX0xBdmdfZW1wdHksIGNvbmZpZy0+bGF2Z19lbXB0eSk7CisJbWF4MTcwNDJfb3ZlcnJpZGVfcG9yKG1hcCwgTUFYMTcwNDJfZFFhY2MsIGNvbmZpZy0+ZHFhY2MpOworCW1heDE3MDQyX292ZXJyaWRlX3BvcihtYXAsIE1BWDE3MDQyX2RQYWNjLCBjb25maWctPmRwYWNjKTsKKworCWlmIChjaGlwLT5jaGlwX3R5cGUgPT0gTUFYSU1fREVWSUNFX1RZUEVfTUFYMTcwNDIpCisJCW1heDE3MDQyX292ZXJyaWRlX3BvcihtYXAsIE1BWDE3MDQyX1ZfZW1wdHksIGNvbmZpZy0+dmVtcHR5KTsKKwllbHNlCisJCW1heDE3MDQyX292ZXJyaWRlX3BvcihtYXAsIE1BWDE3MDQ3X1ZfZW1wdHksIGNvbmZpZy0+dmVtcHR5KTsKKwltYXgxNzA0Ml9vdmVycmlkZV9wb3IobWFwLCBNQVgxNzA0Ml9UZW1wTm9tLCBjb25maWctPnRlbXBfbm9tKTsKKwltYXgxNzA0Ml9vdmVycmlkZV9wb3IobWFwLCBNQVgxNzA0Ml9UZW1wTGltLCBjb25maWctPnRlbXBfbGltKTsKKwltYXgxNzA0Ml9vdmVycmlkZV9wb3IobWFwLCBNQVgxNzA0Ml9GQ1RDLCBjb25maWctPmZjdGMpOworCW1heDE3MDQyX292ZXJyaWRlX3BvcihtYXAsIE1BWDE3MDQyX1JDT01QMCwgY29uZmlnLT5yY29tcDApOworCW1heDE3MDQyX292ZXJyaWRlX3BvcihtYXAsIE1BWDE3MDQyX1RlbXBDbywgY29uZmlnLT50Y29tcGMwKTsKKwlpZiAoY2hpcC0+Y2hpcF90eXBlKSB7CisJCW1heDE3MDQyX292ZXJyaWRlX3BvcihtYXAsIE1BWDE3MDQyX0VtcHR5VGVtcENvLAorCQkJCQkJY29uZmlnLT5lbXB0eV90ZW1wY28pOworCQltYXgxNzA0Ml9vdmVycmlkZV9wb3IobWFwLCBNQVgxNzA0Ml9LX2VtcHR5MCwKKwkJCQkJCWNvbmZpZy0+a2VtcHR5MCk7CisJfQorfQorCitzdGF0aWMgaW50IG1heDE3MDQyX2luaXRfY2hpcChzdHJ1Y3QgbWF4MTcwNDJfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3QgcmVnbWFwICptYXAgPSBjaGlwLT5yZWdtYXA7CisJaW50IHJldDsKKworCW1heDE3MDQyX292ZXJyaWRlX3Bvcl92YWx1ZXMoY2hpcCk7CisJLyogQWZ0ZXIgUG93ZXIgdXAsIHRoZSBNQVgxNzA0MiByZXF1aXJlcyA1MDBtUyBpbiBvcmRlcgorCSAqIHRvIHBlcmZvcm0gc2lnbmFsIGRlYm91bmNpbmcgYW5kIGluaXRpYWwgU09DIHJlcG9ydGluZworCSAqLworCW1zbGVlcCg1MDApOworCisJLyogSW5pdGlhbGl6ZSBjb25maWdhcmF0aW9uICovCisJbWF4MTcwNDJfd3JpdGVfY29uZmlnX3JlZ3MoY2hpcCk7CisKKwkvKiB3cml0ZSBjZWxsIGNoYXJhY3Rlcml6YXRpb24gZGF0YSAqLworCXJldCA9IG1heDE3MDQyX2luaXRfbW9kZWwoY2hpcCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjaGlwLT5jbGllbnQtPmRldiwgIiVzIGluaXQgZmFpbGVkXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXQgPSBtYXgxNzA0Ml92ZXJpZnlfbW9kZWxfbG9jayhjaGlwKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmNoaXAtPmNsaWVudC0+ZGV2LCAiJXMgbG9jayB2ZXJpZnkgZmFpbGVkXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTzsKKwl9CisJLyogd3JpdGUgY3VzdG9tIHBhcmFtZXRlcnMgKi8KKwltYXgxNzA0Ml93cml0ZV9jdXN0b21fcmVncyhjaGlwKTsKKworCS8qIHVwZGF0ZSBjYXBhY2l0eSBwYXJhbXMgKi8KKwltYXgxNzA0Ml91cGRhdGVfY2FwYWNpdHlfcmVncyhjaGlwKTsKKworCS8qIGRlbGF5IG11c3QgYmUgYXRsZWFzdCAzNTBtUyB0byBhbGxvdyBWRlNPQworCSAqIHRvIGJlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgbmV3IGNvbmZpZ3VyYXRpb24KKwkgKi8KKwltc2xlZXAoMzUwKTsKKworCS8qIHJlc2V0IHZmc29jMCByZWcgKi8KKwltYXgxNzA0Ml9yZXNldF92ZnNvYzBfcmVnKGNoaXApOworCisJLyogbG9hZCBuZXcgY2FwYWNpdHkgcGFyYW1zICovCisJbWF4MTcwNDJfbG9hZF9uZXdfY2FwYWNpdHlfcGFyYW1zKGNoaXApOworCisJLyogSW5pdCBjb21wbGV0ZSwgQ2xlYXIgdGhlIFBPUiBiaXQgKi8KKwlyZWdtYXBfdXBkYXRlX2JpdHMobWFwLCBNQVgxNzA0Ml9TVEFUVVMsIFNUQVRVU19QT1JfQklULCAweDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtYXgxNzA0Ml9zZXRfc29jX3RocmVzaG9sZChzdHJ1Y3QgbWF4MTcwNDJfY2hpcCAqY2hpcCwgdTE2IG9mZikKK3sKKwlzdHJ1Y3QgcmVnbWFwICptYXAgPSBjaGlwLT5yZWdtYXA7CisJdTMyIHNvYywgc29jX3RyOworCisJLyogcHJvZ3JhbSBpbnRlcnJ1cHQgdGhlc2hvbGRzIHN1Y2ggdGhhdCB3ZSBzaG91bGQKKwkgKiBnZXQgaW50ZXJydXB0IGZvciBldmVyeSAnb2ZmJyBwZXJjIGNoYW5nZSBpbiB0aGUgc29jCisJICovCisJcmVnbWFwX3JlYWQobWFwLCBNQVgxNzA0Ml9SZXBTT0MsICZzb2MpOworCXNvYyA+Pj0gODsKKwlzb2NfdHIgPSAoc29jICsgb2ZmKSA8PCA4OworCXNvY190ciB8PSAoc29jIC0gb2ZmKTsKKwlyZWdtYXBfd3JpdGUobWFwLCBNQVgxNzA0Ml9TQUxSVF9UaCwgc29jX3RyKTsKK30KKworc3RhdGljIGlycXJldHVybl90IG1heDE3MDQyX3RocmVhZF9oYW5kbGVyKGludCBpZCwgdm9pZCAqZGV2KQoreworCXN0cnVjdCBtYXgxNzA0Ml9jaGlwICpjaGlwID0gZGV2OworCXUzMiB2YWw7CisKKwlyZWdtYXBfcmVhZChjaGlwLT5yZWdtYXAsIE1BWDE3MDQyX1NUQVRVUywgJnZhbCk7CisJaWYgKCh2YWwgJiBTVEFUVVNfSU5UUl9TT0NNSU5fQklUKSB8fAorCQkodmFsICYgU1RBVFVTX0lOVFJfU09DTUFYX0JJVCkpIHsKKwkJZGV2X2luZm8oJmNoaXAtPmNsaWVudC0+ZGV2LCAiU09DIHRocmVzaG9sZCBJTlRSXG4iKTsKKwkJbWF4MTcwNDJfc2V0X3NvY190aHJlc2hvbGQoY2hpcCwgMSk7CisJfQorCisJcG93ZXJfc3VwcGx5X2NoYW5nZWQoY2hpcC0+YmF0dGVyeSk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBtYXgxNzA0Ml9pbml0X3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IG1heDE3MDQyX2NoaXAgKmNoaXAgPSBjb250YWluZXJfb2Yod29yaywKKwkJCQlzdHJ1Y3QgbWF4MTcwNDJfY2hpcCwgd29yayk7CisJaW50IHJldDsKKworCS8qIEluaXRpYWxpemUgcmVnaXN0ZXJzIGFjY29yZGluZyB0byB2YWx1ZXMgZnJvbSB0aGUgcGxhdGZvcm0gZGF0YSAqLworCWlmIChjaGlwLT5wZGF0YS0+ZW5hYmxlX3Bvcl9pbml0ICYmIGNoaXAtPnBkYXRhLT5jb25maWdfZGF0YSkgeworCQlyZXQgPSBtYXgxNzA0Ml9pbml0X2NoaXAoY2hpcCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm47CisJfQorCisJY2hpcC0+aW5pdF9jb21wbGV0ZSA9IDE7Cit9CisKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBzdHJ1Y3QgbWF4MTcwNDJfcGxhdGZvcm1fZGF0YSAqCittYXgxNzA0Ml9nZXRfcGRhdGEoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CisJdTMyIHByb3A7CisJc3RydWN0IG1heDE3MDQyX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCisJaWYgKCFucCkKKwkJcmV0dXJuIGRldi0+cGxhdGZvcm1fZGF0YTsKKworCXBkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghcGRhdGEpCisJCXJldHVybiBOVUxMOworCisJLyoKKwkgKiBSZXF1aXJlIGN1cnJlbnQgc2Vuc2UgcmVzaXN0b3IgdmFsdWUgdG8gYmUgc3BlY2lmaWVkIGZvcgorCSAqIGN1cnJlbnQtc2Vuc2UgZnVuY3Rpb25hbGl0eSB0byBiZSBlbmFibGVkIGF0IGFsbC4KKwkgKi8KKwlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJtYXhpbSxyc25zLW1pY3Jvb2htIiwgJnByb3ApID09IDApIHsKKwkJcGRhdGEtPnJfc25zID0gcHJvcDsKKwkJcGRhdGEtPmVuYWJsZV9jdXJyZW50X3NlbnNlID0gdHJ1ZTsKKwl9CisKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9zMzIobnAsICJtYXhpbSxjb2xkLXRlbXAiLCAmcGRhdGEtPnRlbXBfbWluKSkKKwkJcGRhdGEtPnRlbXBfbWluID0gSU5UX01JTjsKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9zMzIobnAsICJtYXhpbSxvdmVyLWhlYXQtdGVtcCIsICZwZGF0YS0+dGVtcF9tYXgpKQorCQlwZGF0YS0+dGVtcF9tYXggPSBJTlRfTUFYOworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3MzMihucCwgIm1heGltLGRlYWQtdm9sdCIsICZwZGF0YS0+dm1pbikpCisJCXBkYXRhLT52bWluID0gSU5UX01JTjsKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9zMzIobnAsICJtYXhpbSxvdmVyLXZvbHQiLCAmcGRhdGEtPnZtYXgpKQorCQlwZGF0YS0+dm1heCA9IElOVF9NQVg7CisKKwlyZXR1cm4gcGRhdGE7Cit9CisjZWxzZQorc3RhdGljIHN0cnVjdCBtYXgxNzA0Ml9wbGF0Zm9ybV9kYXRhICoKK21heDE3MDQyX2dldF9wZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldi0+cGxhdGZvcm1fZGF0YTsKK30KKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgbWF4MTcwNDJfcmVnbWFwX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDE2LAorCS52YWxfZm9ybWF0X2VuZGlhbiA9IFJFR01BUF9FTkRJQU5fTkFUSVZFLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBtYXgxNzA0Ml9wc3lfZGVzYyA9IHsKKwkubmFtZQkJPSAibWF4MTcweHhfYmF0dGVyeSIsCisJLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKKwkuZ2V0X3Byb3BlcnR5CT0gbWF4MTcwNDJfZ2V0X3Byb3BlcnR5LAorCS5zZXRfcHJvcGVydHkJPSBtYXgxNzA0Ml9zZXRfcHJvcGVydHksCisJLnByb3BlcnR5X2lzX3dyaXRlYWJsZQk9IG1heDE3MDQyX3Byb3BlcnR5X2lzX3dyaXRlYWJsZSwKKwkucHJvcGVydGllcwk9IG1heDE3MDQyX2JhdHRlcnlfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRShtYXgxNzA0Ml9iYXR0ZXJ5X3Byb3BzKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgbWF4MTcwNDJfbm9fY3VycmVudF9zZW5zZV9wc3lfZGVzYyA9IHsKKwkubmFtZQkJPSAibWF4MTcweHhfYmF0dGVyeSIsCisJLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKKwkuZ2V0X3Byb3BlcnR5CT0gbWF4MTcwNDJfZ2V0X3Byb3BlcnR5LAorCS5zZXRfcHJvcGVydHkJPSBtYXgxNzA0Ml9zZXRfcHJvcGVydHksCisJLnByb3BlcnR5X2lzX3dyaXRlYWJsZQk9IG1heDE3MDQyX3Byb3BlcnR5X2lzX3dyaXRlYWJsZSwKKwkucHJvcGVydGllcwk9IG1heDE3MDQyX2JhdHRlcnlfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRShtYXgxNzA0Ml9iYXR0ZXJ5X3Byb3BzKSAtIDIsCit9OworCitzdGF0aWMgaW50IG1heDE3MDQyX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gdG9faTJjX2FkYXB0ZXIoY2xpZW50LT5kZXYucGFyZW50KTsKKwljb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgKm1heDE3MDQyX2Rlc2MgPSAmbWF4MTcwNDJfcHN5X2Rlc2M7CisJc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgcHN5X2NmZyA9IHt9OworCXN0cnVjdCBtYXgxNzA0Ml9jaGlwICpjaGlwOworCWludCByZXQ7CisJaW50IGk7CisJdTMyIHZhbDsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBKSkKKwkJcmV0dXJuIC1FSU87CisKKwljaGlwID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKCpjaGlwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaGlwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNoaXAtPmNsaWVudCA9IGNsaWVudDsKKwljaGlwLT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZtYXgxNzA0Ml9yZWdtYXBfY29uZmlnKTsKKwlpZiAoSVNfRVJSKGNoaXAtPnJlZ21hcCkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSByZWdtYXBcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljaGlwLT5wZGF0YSA9IG1heDE3MDQyX2dldF9wZGF0YSgmY2xpZW50LT5kZXYpOworCWlmICghY2hpcC0+cGRhdGEpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJubyBwbGF0Zm9ybSBkYXRhIHByb3ZpZGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgY2hpcCk7CisJY2hpcC0+Y2hpcF90eXBlID0gaWQtPmRyaXZlcl9kYXRhOworCXBzeV9jZmcuZHJ2X2RhdGEgPSBjaGlwOworCisJLyogV2hlbiBjdXJyZW50IGlzIG5vdCBtZWFzdXJlZCwKKwkgKiBDVVJSRU5UX05PVyBhbmQgQ1VSUkVOVF9BVkcgcHJvcGVydGllcyBzaG91bGQgYmUgaW52aXNpYmxlLiAqLworCWlmICghY2hpcC0+cGRhdGEtPmVuYWJsZV9jdXJyZW50X3NlbnNlKQorCQltYXgxNzA0Ml9kZXNjID0gJm1heDE3MDQyX25vX2N1cnJlbnRfc2Vuc2VfcHN5X2Rlc2M7CisKKwlpZiAoY2hpcC0+cGRhdGEtPnJfc25zID09IDApCisJCWNoaXAtPnBkYXRhLT5yX3NucyA9IE1BWDE3MDQyX0RFRkFVTFRfU05TX1JFU0lTVE9SOworCisJaWYgKGNoaXAtPnBkYXRhLT5pbml0X2RhdGEpCisJCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5wZGF0YS0+bnVtX2luaXRfZGF0YTsgaSsrKQorCQkJcmVnbWFwX3dyaXRlKGNoaXAtPnJlZ21hcCwKKwkJCQkJY2hpcC0+cGRhdGEtPmluaXRfZGF0YVtpXS5hZGRyLAorCQkJCQljaGlwLT5wZGF0YS0+aW5pdF9kYXRhW2ldLmRhdGEpOworCisJaWYgKCFjaGlwLT5wZGF0YS0+ZW5hYmxlX2N1cnJlbnRfc2Vuc2UpIHsKKwkJcmVnbWFwX3dyaXRlKGNoaXAtPnJlZ21hcCwgTUFYMTcwNDJfQ0dBSU4sIDB4MDAwMCk7CisJCXJlZ21hcF93cml0ZShjaGlwLT5yZWdtYXAsIE1BWDE3MDQyX01pc2NDRkcsIDB4MDAwMyk7CisJCXJlZ21hcF93cml0ZShjaGlwLT5yZWdtYXAsIE1BWDE3MDQyX0xlYXJuQ0ZHLCAweDAwMDcpOworCX0KKworCWNoaXAtPmJhdHRlcnkgPSBkZXZtX3Bvd2VyX3N1cHBseV9yZWdpc3RlcigmY2xpZW50LT5kZXYsIG1heDE3MDQyX2Rlc2MsCisJCQkJCQkgICAmcHN5X2NmZyk7CisJaWYgKElTX0VSUihjaGlwLT5iYXR0ZXJ5KSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZDogcG93ZXIgc3VwcGx5IHJlZ2lzdGVyXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoY2hpcC0+YmF0dGVyeSk7CisJfQorCisJaWYgKGNsaWVudC0+aXJxKSB7CisJCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoJmNsaWVudC0+ZGV2LCBjbGllbnQtPmlycSwKKwkJCQkJCU5VTEwsCisJCQkJCQltYXgxNzA0Ml90aHJlYWRfaGFuZGxlciwKKwkJCQkJCUlSUUZfVFJJR0dFUl9GQUxMSU5HIHwKKwkJCQkJCUlSUUZfT05FU0hPVCwKKwkJCQkJCWNoaXAtPmJhdHRlcnktPmRlc2MtPm5hbWUsCisJCQkJCQljaGlwKTsKKwkJaWYgKCFyZXQpIHsKKwkJCXJlZ21hcF91cGRhdGVfYml0cyhjaGlwLT5yZWdtYXAsIE1BWDE3MDQyX0NPTkZJRywKKwkJCQkJQ09ORklHX0FMUlRfQklUX0VOQkwsCisJCQkJCUNPTkZJR19BTFJUX0JJVF9FTkJMKTsKKwkJCW1heDE3MDQyX3NldF9zb2NfdGhyZXNob2xkKGNoaXAsIDEpOworCQl9IGVsc2UgeworCQkJY2xpZW50LT5pcnEgPSAwOworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlcygpOiBjYW5ub3QgZ2V0IElSUVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCX0KKwl9CisKKwlyZWdtYXBfcmVhZChjaGlwLT5yZWdtYXAsIE1BWDE3MDQyX1NUQVRVUywgJnZhbCk7CisJaWYgKHZhbCAmIFNUQVRVU19QT1JfQklUKSB7CisJCUlOSVRfV09SSygmY2hpcC0+d29yaywgbWF4MTcwNDJfaW5pdF93b3JrZXIpOworCQlzY2hlZHVsZV93b3JrKCZjaGlwLT53b3JrKTsKKwl9IGVsc2UgeworCQljaGlwLT5pbml0X2NvbXBsZXRlID0gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBtYXgxNzA0Ml9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWF4MTcwNDJfY2hpcCAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJLyoKKwkgKiBkaXNhYmxlIHRoZSBpcnEgYW5kIGVuYWJsZSBpcnFfd2FrZQorCSAqIGNhcGFiaWxpdHkgdG8gdGhlIGludGVycnVwdCBsaW5lLgorCSAqLworCWlmIChjaGlwLT5jbGllbnQtPmlycSkgeworCQlkaXNhYmxlX2lycShjaGlwLT5jbGllbnQtPmlycSk7CisJCWVuYWJsZV9pcnFfd2FrZShjaGlwLT5jbGllbnQtPmlycSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWF4MTcwNDJfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWF4MTcwNDJfY2hpcCAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKGNoaXAtPmNsaWVudC0+aXJxKSB7CisJCWRpc2FibGVfaXJxX3dha2UoY2hpcC0+Y2xpZW50LT5pcnEpOworCQllbmFibGVfaXJxKGNoaXAtPmNsaWVudC0+aXJxKTsKKwkJLyogcmUtcHJvZ3JhbSB0aGUgU09DIHRocmVzaG9sZHMgdG8gMSUgY2hhbmdlICovCisJCW1heDE3MDQyX3NldF9zb2NfdGhyZXNob2xkKGNoaXAsIDEpOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhtYXgxNzA0Ml9wbV9vcHMsIG1heDE3MDQyX3N1c3BlbmQsCisJCQltYXgxNzA0Ml9yZXN1bWUpOworCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtYXgxNzA0Ml9kdF9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAibWF4aW0sbWF4MTcwNDIiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJtYXhpbSxtYXgxNzA0NyIgfSwKKwl7IC5jb21wYXRpYmxlID0gIm1heGltLG1heDE3MDUwIiB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtYXgxNzA0Ml9kdF9tYXRjaCk7CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIG1heDE3MDQyX2lkW10gPSB7CisJeyAibWF4MTcwNDIiLCBNQVhJTV9ERVZJQ0VfVFlQRV9NQVgxNzA0MiB9LAorCXsgIm1heDE3MDQ3IiwgTUFYSU1fREVWSUNFX1RZUEVfTUFYMTcwNDcgfSwKKwl7ICJtYXgxNzA1MCIsIE1BWElNX0RFVklDRV9UWVBFX01BWDE3MDUwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIG1heDE3MDQyX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG1heDE3MDQyX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlcgk9IHsKKwkJLm5hbWUJPSAibWF4MTcwNDIiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIobWF4MTcwNDJfZHRfbWF0Y2gpLAorCQkucG0JPSAmbWF4MTcwNDJfcG1fb3BzLAorCX0sCisJLnByb2JlCQk9IG1heDE3MDQyX3Byb2JlLAorCS5pZF90YWJsZQk9IG1heDE3MDQyX2lkLAorfTsKK21vZHVsZV9pMmNfZHJpdmVyKG1heDE3MDQyX2kyY19kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJNeXVuZ0pvbyBIYW0gPG15dW5nam9vLmhhbUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTUFYMTcwNDIgRnVlbCBHYXVnZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9zdXBwbHkvbWF4Nzc2OTNfY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvbWF4Nzc2OTNfY2hhcmdlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNzg4ODQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9tYXg3NzY5M19jaGFyZ2VyLmMKQEAgLTAsMCArMSw3NzEgQEAKKy8qCisgKiBtYXg3NzY5M19jaGFyZ2VyLmMgLSBCYXR0ZXJ5IGNoYXJnZXIgZHJpdmVyIGZvciB0aGUgTWF4aW0gNzc2OTMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgU2Ftc3VuZyBFbGVjdHJvbmljcworICogS3J6eXN6dG9mIEtvemxvd3NraSA8a3J6a0BrZXJuZWwub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL21heDc3NjkzLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL21heDc3NjkzLWNvbW1vbi5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9tYXg3NzY5My1wcml2YXRlLmg+CisKKyNkZWZpbmUgTUFYNzc2OTNfQ0hBUkdFUl9OQU1FCQkJCSJtYXg3NzY5My1jaGFyZ2VyIgorc3RhdGljIGNvbnN0IGNoYXIgKm1heDc3NjkzX2NoYXJnZXJfbW9kZWwJCT0gIk1BWDc3NjkzIjsKK3N0YXRpYyBjb25zdCBjaGFyICptYXg3NzY5M19jaGFyZ2VyX21hbnVmYWN0dXJlcgk9ICJNYXhpbSBJbnRlZ3JhdGVkIjsKKworc3RydWN0IG1heDc3NjkzX2NoYXJnZXIgeworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CisJc3RydWN0IG1heDc3NjkzX2RldgkqbWF4Nzc2OTM7CisJc3RydWN0IHBvd2VyX3N1cHBseQkqY2hhcmdlcjsKKworCXUzMiBjb25zdGFudF92b2x0OworCXUzMiBtaW5fc3lzdGVtX3ZvbHQ7CisJdTMyIHRoZXJtYWxfcmVndWxhdGlvbl90ZW1wOworCXUzMiBiYXR0dGVyeV9vdmVyY3VycmVudDsKKwl1MzIgY2hhcmdlX2lucHV0X3RocmVzaG9sZF92b2x0OworfTsKKworc3RhdGljIGludCBtYXg3NzY5M19nZXRfY2hhcmdlcl9zdGF0ZShzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGludCAqdmFsKQoreworCWludCByZXQ7CisJdW5zaWduZWQgaW50IGRhdGE7CisKKwlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIE1BWDc3NjkzX0NIR19SRUdfQ0hHX0RFVEFJTFNfMDEsICZkYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWRhdGEgJj0gQ0hHX0RFVEFJTFNfMDFfQ0hHX01BU0s7CisJZGF0YSA+Pj0gQ0hHX0RFVEFJTFNfMDFfQ0hHX1NISUZUOworCisJc3dpdGNoIChkYXRhKSB7CisJY2FzZSBNQVg3NzY5M19DSEFSR0lOR19QUkVRVUFMSUZJQ0FUSU9OOgorCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfRkFTVF9DT05TVF9DVVJSRU5UOgorCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfRkFTVF9DT05TVF9WT0xUQUdFOgorCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfVE9QX09GRjoKKwkvKiBJbiBoaWdoIHRlbXAgdGhlIGNoYXJnaW5nIGN1cnJlbnQgaXMgcmVkdWNlZCwgYnV0IHN0aWxsIGNoYXJnaW5nICovCisJY2FzZSBNQVg3NzY5M19DSEFSR0lOR19ISUdIX1RFTVA6CisJCSp2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOworCQlicmVhazsKKwljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX0RPTkU6CisJCSp2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0ZVTEw7CisJCWJyZWFrOworCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfVElNRVJfRVhQSVJFRDoKKwljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX1RIRVJNSVNUT1JfU1VTUEVORDoKKwkJKnZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfTk9UX0NIQVJHSU5HOworCQlicmVhazsKKwljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX09GRjoKKwljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX09WRVJfVEVNUDoKKwljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX1dBVENIRE9HX0VYUElSRUQ6CisJCSp2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOworCQlicmVhazsKKwljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX1JFU0VSVkVEOgorCWRlZmF1bHQ6CisJCSp2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWF4Nzc2OTNfZ2V0X2NoYXJnZV90eXBlKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgaW50ICp2YWwpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKworCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTUFYNzc2OTNfQ0hHX1JFR19DSEdfREVUQUlMU18wMSwgJmRhdGEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZGF0YSAmPSBDSEdfREVUQUlMU18wMV9DSEdfTUFTSzsKKwlkYXRhID4+PSBDSEdfREVUQUlMU18wMV9DSEdfU0hJRlQ7CisKKwlzd2l0Y2ggKGRhdGEpIHsKKwljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX1BSRVFVQUxJRklDQVRJT046CisJLyoKKwkgKiBUb3Atb2ZmOiB0cmlja2xlIG9yIGZhc3Q/IEluIHRvcC1vZmYgdGhlIGN1cnJlbnQgdmFyaWVzIGJldHdlZW4KKwkgKiAxMDAgYW5kIDI1MCBtQS4gSXQgaXMgaGlnaGVyIHRoYW4gcHJlcXVhbGlmaWNhdGlvbiBjdXJyZW50LgorCSAqLworCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfVE9QX09GRjoKKwkJKnZhbCA9IFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9UUklDS0xFOworCQlicmVhazsKKwljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX0ZBU1RfQ09OU1RfQ1VSUkVOVDoKKwljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX0ZBU1RfQ09OU1RfVk9MVEFHRToKKwkvKiBJbiBoaWdoIHRlbXAgdGhlIGNoYXJnaW5nIGN1cnJlbnQgaXMgcmVkdWNlZCwgYnV0IHN0aWxsIGNoYXJnaW5nICovCisJY2FzZSBNQVg3NzY5M19DSEFSR0lOR19ISUdIX1RFTVA6CisJCSp2YWwgPSBQT1dFUl9TVVBQTFlfQ0hBUkdFX1RZUEVfRkFTVDsKKwkJYnJlYWs7CisJY2FzZSBNQVg3NzY5M19DSEFSR0lOR19ET05FOgorCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfVElNRVJfRVhQSVJFRDoKKwljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX1RIRVJNSVNUT1JfU1VTUEVORDoKKwljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX09GRjoKKwljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX09WRVJfVEVNUDoKKwljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX1dBVENIRE9HX0VYUElSRUQ6CisJCSp2YWwgPSBQT1dFUl9TVVBQTFlfQ0hBUkdFX1RZUEVfTk9ORTsKKwkJYnJlYWs7CisJY2FzZSBNQVg3NzY5M19DSEFSR0lOR19SRVNFUlZFRDoKKwlkZWZhdWx0OgorCQkqdmFsID0gUE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX1VOS05PV047CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTdXBwb3J0ZWQgaGVhbHRoIHN0YXR1c2VzOgorICogIC0gUE9XRVJfU1VQUExZX0hFQUxUSF9ERUFECisgKiAgLSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0QKKyAqICAtIFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUlZPTFRBR0UKKyAqICAtIFBPV0VSX1NVUFBMWV9IRUFMVEhfU0FGRVRZX1RJTUVSX0VYUElSRQorICogIC0gUE9XRVJfU1VQUExZX0hFQUxUSF9VTktOT1dOCisgKiAgLSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOU1BFQ19GQUlMVVJFCisgKi8KK3N0YXRpYyBpbnQgbWF4Nzc2OTNfZ2V0X2JhdHRlcnlfaGVhbHRoKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgaW50ICp2YWwpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKworCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTUFYNzc2OTNfQ0hHX1JFR19DSEdfREVUQUlMU18wMSwgJmRhdGEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZGF0YSAmPSBDSEdfREVUQUlMU18wMV9CQVRfTUFTSzsKKwlkYXRhID4+PSBDSEdfREVUQUlMU18wMV9CQVRfU0hJRlQ7CisKKwlzd2l0Y2ggKGRhdGEpIHsKKwljYXNlIE1BWDc3NjkzX0JBVFRFUllfTk9CQVQ6CisJCSp2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0RFQUQ7CisJCWJyZWFrOworCWNhc2UgTUFYNzc2OTNfQkFUVEVSWV9QUkVRVUFMSUZJQ0FUSU9OOgorCWNhc2UgTUFYNzc2OTNfQkFUVEVSWV9HT09EOgorCWNhc2UgTUFYNzc2OTNfQkFUVEVSWV9MT1dWT0xUQUdFOgorCQkqdmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9HT09EOworCQlicmVhazsKKwljYXNlIE1BWDc3NjkzX0JBVFRFUllfVElNRVJfRVhQSVJFRDoKKwkJLyoKKwkJICogVG9vayBsb25nZXIgdG8gY2hhcmdlIHRoYW4gZXhwZWN0ZWQsIGNoYXJnaW5nIHN1c3BlbmRlZC4KKwkJICogRGFtYWdlZCBiYXR0ZXJ5PworCQkgKi8KKwkJKnZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfU0FGRVRZX1RJTUVSX0VYUElSRTsKKwkJYnJlYWs7CisJY2FzZSBNQVg3NzY5M19CQVRURVJZX09WRVJWT0xUQUdFOgorCQkqdmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSVk9MVEFHRTsKKwkJYnJlYWs7CisJY2FzZSBNQVg3NzY5M19CQVRURVJZX09WRVJDVVJSRU5UOgorCQkqdmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9VTlNQRUNfRkFJTFVSRTsKKwkJYnJlYWs7CisJY2FzZSBNQVg3NzY5M19CQVRURVJZX1JFU0VSVkVEOgorCWRlZmF1bHQ6CisJCSp2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOS05PV047CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1heDc3NjkzX2dldF9wcmVzZW50KHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgaW50ICp2YWwpCit7CisJdW5zaWduZWQgaW50IGRhdGE7CisJaW50IHJldDsKKworCS8qCisJICogUmVhZCBDSEdfSU5UX09LIHJlZ2lzdGVyLiBIaWdoIERFVEJBVCBiaXQgaGVyZSBzaG91bGQgYmUKKwkgKiBlcXVhbCB0byB2YWx1ZSAweDAgaW4gQ0hHX0RFVEFJTFNfMDEvQkFUIGZpZWxkLgorCSAqLworCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTUFYNzc2OTNfQ0hHX1JFR19DSEdfSU5UX09LLCAmZGF0YSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkqdmFsID0gKGRhdGEgJiBDSEdfSU5UX09LX0RFVEJBVF9NQVNLKSA/IDAgOiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWF4Nzc2OTNfZ2V0X29ubGluZShzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGludCAqdmFsKQoreworCXVuc2lnbmVkIGludCBkYXRhOworCWludCByZXQ7CisKKwlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIE1BWDc3NjkzX0NIR19SRUdfQ0hHX0lOVF9PSywgJmRhdGEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJKnZhbCA9IChkYXRhICYgQ0hHX0lOVF9PS19DSEdJTl9NQVNLKSA/IDEgOiAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBtYXg3NzY5M19jaGFyZ2VyX3Byb3BzW10gPSB7CisJUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9UWVBFLAorCVBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5ULAorCVBPV0VSX1NVUFBMWV9QUk9QX09OTElORSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9NT0RFTF9OQU1FLAorCVBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUiwKK307CisKK3N0YXRpYyBpbnQgbWF4Nzc2OTNfY2hhcmdlcl9nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAorCQkJICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwkJCSAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGcgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBjaGctPm1heDc3NjkzLT5yZWdtYXA7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKHBzcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgorCQlyZXQgPSBtYXg3NzY5M19nZXRfY2hhcmdlcl9zdGF0ZShyZWdtYXAsICZ2YWwtPmludHZhbCk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX1RZUEU6CisJCXJldCA9IG1heDc3NjkzX2dldF9jaGFyZ2VfdHlwZShyZWdtYXAsICZ2YWwtPmludHZhbCk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfSEVBTFRIOgorCQlyZXQgPSBtYXg3NzY5M19nZXRfYmF0dGVyeV9oZWFsdGgocmVnbWFwLCAmdmFsLT5pbnR2YWwpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ6CisJCXJldCA9IG1heDc3NjkzX2dldF9wcmVzZW50KHJlZ21hcCwgJnZhbC0+aW50dmFsKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkU6CisJCXJldCA9IG1heDc3NjkzX2dldF9vbmxpbmUocmVnbWFwLCAmdmFsLT5pbnR2YWwpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX01PREVMX05BTUU6CisJCXZhbC0+c3RydmFsID0gbWF4Nzc2OTNfY2hhcmdlcl9tb2RlbDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9NQU5VRkFDVFVSRVI6CisJCXZhbC0+c3RydmFsID0gbWF4Nzc2OTNfY2hhcmdlcl9tYW51ZmFjdHVyZXI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgbWF4Nzc2OTNfY2hhcmdlcl9kZXNjID0geworCS5uYW1lCQk9IE1BWDc3NjkzX0NIQVJHRVJfTkFNRSwKKwkudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZLAorCS5wcm9wZXJ0aWVzCT0gbWF4Nzc2OTNfY2hhcmdlcl9wcm9wcywKKwkubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKG1heDc3NjkzX2NoYXJnZXJfcHJvcHMpLAorCS5nZXRfcHJvcGVydHkJPSBtYXg3NzY5M19jaGFyZ2VyX2dldF9wcm9wZXJ0eSwKK307CisKK3N0YXRpYyBzc2l6ZV90IGRldmljZV9hdHRyX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQlpbnQgKCpmbikoc3RydWN0IG1heDc3NjkzX2NoYXJnZXIgKiwgdW5zaWduZWQgbG9uZykpCit7CisJc3RydWN0IG1heDc3NjkzX2NoYXJnZXIgKmNoZyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCByZXQ7CisKKwlyZXQgPSBrc3RydG91bChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZm4oY2hnLCB2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZhc3RfY2hhcmdlX3RpbWVyX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGcgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBpbnQgZGF0YSwgdmFsOworCWludCByZXQ7CisKKwlyZXQgPSByZWdtYXBfcmVhZChjaGctPm1heDc3NjkzLT5yZWdtYXAsIE1BWDc3NjkzX0NIR19SRUdfQ0hHX0NORkdfMDEsCisJCQkmZGF0YSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlkYXRhICY9IENIR19DTkZHXzAxX0ZDSEdUSU1FX01BU0s7CisJZGF0YSA+Pj0gQ0hHX0NORkdfMDFfRkNIR1RJTUVfU0hJRlQ7CisJc3dpdGNoIChkYXRhKSB7CisJY2FzZSAweDEgLi4uIDB4NzoKKwkJLyogU3RhcnRpbmcgZnJvbSA0IGhvdXJzLCBzdGVwIGJ5IDIgaG91cnMgKi8KKwkJdmFsID0gNCArIChkYXRhIC0gMSkgKiAyOworCQlicmVhazsKKwljYXNlIDB4MDoKKwlkZWZhdWx0OgorCQl2YWwgPSAwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgbWF4Nzc2OTNfc2V0X2Zhc3RfY2hhcmdlX3RpbWVyKHN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGcsCisJCXVuc2lnbmVkIGxvbmcgaG91cnMpCit7CisJdW5zaWduZWQgaW50IGRhdGE7CisKKwkvKgorCSAqIDB4MDAgLSBkaXNhYmxlCisJICogMHgwMSAtIDRoCisJICogMHgwMiAtIDZoCisJICogLi4uCisJICogMHgwNyAtIDE2aAorCSAqIFJvdW5kIGRvd24gb2RkIHZhbHVlcy4KKwkgKi8KKwlzd2l0Y2ggKGhvdXJzKSB7CisJY2FzZSA0IC4uLiAxNjoKKwkJZGF0YSA9IChob3VycyAtIDQpIC8gMiArIDE7CisJCWJyZWFrOworCWNhc2UgMDoKKwkJLyogRGlzYWJsZSAqLworCQlkYXRhID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRhdGEgPDw9IENIR19DTkZHXzAxX0ZDSEdUSU1FX1NISUZUOworCisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhjaGctPm1heDc3NjkzLT5yZWdtYXAsCisJCQlNQVg3NzY5M19DSEdfUkVHX0NIR19DTkZHXzAxLAorCQkJQ0hHX0NORkdfMDFfRkNIR1RJTUVfTUFTSywgZGF0YSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZhc3RfY2hhcmdlX3RpbWVyX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBkZXZpY2VfYXR0cl9zdG9yZShkZXYsIGF0dHIsIGJ1ZiwgY291bnQsCisJCQltYXg3NzY5M19zZXRfZmFzdF9jaGFyZ2VfdGltZXIpOworfQorCitzdGF0aWMgc3NpemVfdCB0b3Bfb2ZmX3RocmVzaG9sZF9jdXJyZW50X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGcgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBpbnQgZGF0YSwgdmFsOworCWludCByZXQ7CisKKwlyZXQgPSByZWdtYXBfcmVhZChjaGctPm1heDc3NjkzLT5yZWdtYXAsIE1BWDc3NjkzX0NIR19SRUdfQ0hHX0NORkdfMDMsCisJCQkmZGF0YSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlkYXRhICY9IENIR19DTkZHXzAzX1RPSVRIX01BU0s7CisJZGF0YSA+Pj0gQ0hHX0NORkdfMDNfVE9JVEhfU0hJRlQ7CisKKwlpZiAoZGF0YSA8PSAweDA0KQorCQl2YWwgPSAxMDAwMDAgKyBkYXRhICogMjUwMDA7CisJZWxzZQorCQl2YWwgPSBkYXRhICogNTAwMDA7CisKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgbWF4Nzc2OTNfc2V0X3RvcF9vZmZfdGhyZXNob2xkX2N1cnJlbnQoc3RydWN0IG1heDc3NjkzX2NoYXJnZXIgKmNoZywKKwkJdW5zaWduZWQgbG9uZyB1YW1wKQoreworCXVuc2lnbmVkIGludCBkYXRhOworCisJaWYgKHVhbXAgPCAxMDAwMDAgfHwgdWFtcCA+IDM1MDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodWFtcCA8PSAyMDAwMDApCisJCWRhdGEgPSAodWFtcCAtIDEwMDAwMCkgLyAyNTAwMDsKKwllbHNlCisJCS8qICgyMDAwMDAsIDM1MDAwMD4gKi8KKwkJZGF0YSA9IHVhbXAgLyA1MDAwMDsKKworCWRhdGEgPDw9IENIR19DTkZHXzAzX1RPSVRIX1NISUZUOworCisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhjaGctPm1heDc3NjkzLT5yZWdtYXAsCisJCQlNQVg3NzY5M19DSEdfUkVHX0NIR19DTkZHXzAzLAorCQkJQ0hHX0NORkdfMDNfVE9JVEhfTUFTSywgZGF0YSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRvcF9vZmZfdGhyZXNob2xkX2N1cnJlbnRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIGRldmljZV9hdHRyX3N0b3JlKGRldiwgYXR0ciwgYnVmLCBjb3VudCwKKwkJCW1heDc3NjkzX3NldF90b3Bfb2ZmX3RocmVzaG9sZF9jdXJyZW50KTsKK30KKworc3RhdGljIHNzaXplX3QgdG9wX29mZl90aW1lcl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbWF4Nzc2OTNfY2hhcmdlciAqY2hnID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IGRhdGEsIHZhbDsKKwlpbnQgcmV0OworCisJcmV0ID0gcmVnbWFwX3JlYWQoY2hnLT5tYXg3NzY5My0+cmVnbWFwLCBNQVg3NzY5M19DSEdfUkVHX0NIR19DTkZHXzAzLAorCQkJJmRhdGEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZGF0YSAmPSBDSEdfQ05GR18wM19UT1RJTUVfTUFTSzsKKwlkYXRhID4+PSBDSEdfQ05GR18wM19UT1RJTUVfU0hJRlQ7CisKKwl2YWwgPSBkYXRhICogMTA7CisKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgbWF4Nzc2OTNfc2V0X3RvcF9vZmZfdGltZXIoc3RydWN0IG1heDc3NjkzX2NoYXJnZXIgKmNoZywKKwkJdW5zaWduZWQgbG9uZyBtaW51dGVzKQoreworCXVuc2lnbmVkIGludCBkYXRhOworCisJaWYgKG1pbnV0ZXMgPiA3MCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkYXRhID0gbWludXRlcyAvIDEwOworCWRhdGEgPDw9IENIR19DTkZHXzAzX1RPVElNRV9TSElGVDsKKworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoY2hnLT5tYXg3NzY5My0+cmVnbWFwLAorCQkJTUFYNzc2OTNfQ0hHX1JFR19DSEdfQ05GR18wMywKKwkJCUNIR19DTkZHXzAzX1RPVElNRV9NQVNLLCBkYXRhKTsKK30KKworc3RhdGljIHNzaXplX3QgdG9wX29mZl90aW1lcl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gZGV2aWNlX2F0dHJfc3RvcmUoZGV2LCBhdHRyLCBidWYsIGNvdW50LAorCQkJbWF4Nzc2OTNfc2V0X3RvcF9vZmZfdGltZXIpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFJfUlcoZmFzdF9jaGFyZ2VfdGltZXIpOworc3RhdGljIERFVklDRV9BVFRSX1JXKHRvcF9vZmZfdGhyZXNob2xkX2N1cnJlbnQpOworc3RhdGljIERFVklDRV9BVFRSX1JXKHRvcF9vZmZfdGltZXIpOworCitzdGF0aWMgaW50IG1heDc3NjkzX3NldF9jb25zdGFudF92b2x0KHN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGcsCisJCXVuc2lnbmVkIGludCB1dm9sdCkKK3sKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKworCS8qCisJICogMHgwMCAtIDMuNjUwIFYKKwkgKiAweDAxIC0gMy42NzUgVgorCSAqIC4uLgorCSAqIDB4MWIgLSA0LjMyNSBWCisJICogMHgxYyAtIDQuMzQwIFYKKwkgKiAweDFkIC0gNC4zNTAgVgorCSAqIDB4MWUgLSA0LjM3NSBWCisJICogMHgxZiAtIDQuNDAwIFYKKwkgKi8KKwlpZiAodXZvbHQgPj0gMzY1MDAwMCAmJiB1dm9sdCA8IDQzNDAwMDApCisJCWRhdGEgPSAodXZvbHQgLSAzNjUwMDAwKSAvIDI1MDAwOworCWVsc2UgaWYgKHV2b2x0ID49IDQzNDAwMDAgJiYgdXZvbHQgPCA0MzUwMDAwKQorCQlkYXRhID0gMHgxYzsKKwllbHNlIGlmICh1dm9sdCA+PSA0MzUwMDAwICYmIHV2b2x0IDw9IDQ0MDAwMDApCisJCWRhdGEgPSAweDFkICsgKHV2b2x0IC0gNDM1MDAwMCkgLyAyNTAwMDsKKwllbHNlIHsKKwkJZGV2X2VycihjaGctPmRldiwgIldyb25nIHZhbHVlIGZvciBjaGFyZ2luZyBjb25zdGFudCB2b2x0YWdlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGF0YSA8PD0gQ0hHX0NORkdfMDRfQ0hHQ1ZQUk1fU0hJRlQ7CisKKwlkZXZfZGJnKGNoZy0+ZGV2LCAiQ2hhcmdpbmcgY29uc3RhbnQgdm9sdGFnZTogJXUgKDB4JXgpXG4iLCB1dm9sdCwKKwkJCWRhdGEpOworCisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhjaGctPm1heDc3NjkzLT5yZWdtYXAsCisJCQlNQVg3NzY5M19DSEdfUkVHX0NIR19DTkZHXzA0LAorCQkJQ0hHX0NORkdfMDRfQ0hHQ1ZQUk1fTUFTSywgZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgbWF4Nzc2OTNfc2V0X21pbl9zeXN0ZW1fdm9sdChzdHJ1Y3QgbWF4Nzc2OTNfY2hhcmdlciAqY2hnLAorCQl1bnNpZ25lZCBpbnQgdXZvbHQpCit7CisJdW5zaWduZWQgaW50IGRhdGE7CisKKwlpZiAodXZvbHQgPCAzMDAwMDAwIHx8IHV2b2x0ID4gMzcwMDAwMCkgeworCQlkZXZfZXJyKGNoZy0+ZGV2LCAiV3JvbmcgdmFsdWUgZm9yIG1pbmltdW0gc3lzdGVtIHJlZ3VsYXRpb24gdm9sdGFnZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRhdGEgPSAodXZvbHQgLSAzMDAwMDAwKSAvIDEwMDAwMDsKKworCWRhdGEgPDw9IENIR19DTkZHXzA0X01JTlZTWVNfU0hJRlQ7CisKKwlkZXZfZGJnKGNoZy0+ZGV2LCAiTWluaW11bSBzeXN0ZW0gcmVndWxhdGlvbiB2b2x0YWdlOiAldSAoMHgleClcbiIsCisJCQl1dm9sdCwgZGF0YSk7CisKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGNoZy0+bWF4Nzc2OTMtPnJlZ21hcCwKKwkJCU1BWDc3NjkzX0NIR19SRUdfQ0hHX0NORkdfMDQsCisJCQlDSEdfQ05GR18wNF9NSU5WU1lTX01BU0ssIGRhdGEpOworfQorCitzdGF0aWMgaW50IG1heDc3NjkzX3NldF90aGVybWFsX3JlZ3VsYXRpb25fdGVtcChzdHJ1Y3QgbWF4Nzc2OTNfY2hhcmdlciAqY2hnLAorCQl1bnNpZ25lZCBpbnQgY2VscykKK3sKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKworCXN3aXRjaCAoY2VscykgeworCWNhc2UgNzA6CisJY2FzZSA4NToKKwljYXNlIDEwMDoKKwljYXNlIDExNToKKwkJZGF0YSA9IChjZWxzIC0gNzApIC8gMTU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoY2hnLT5kZXYsICJXcm9uZyB2YWx1ZSBmb3IgdGhlcm1hbCByZWd1bGF0aW9uIGxvb3AgdGVtcGVyYXR1cmVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkYXRhIDw8PSBDSEdfQ05GR18wN19SRUdURU1QX1NISUZUOworCisJZGV2X2RiZyhjaGctPmRldiwgIlRoZXJtYWwgcmVndWxhdGlvbiBsb29wIHRlbXBlcmF0dXJlOiAldSAoMHgleClcbiIsCisJCQljZWxzLCBkYXRhKTsKKworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoY2hnLT5tYXg3NzY5My0+cmVnbWFwLAorCQkJTUFYNzc2OTNfQ0hHX1JFR19DSEdfQ05GR18wNywKKwkJCUNIR19DTkZHXzA3X1JFR1RFTVBfTUFTSywgZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgbWF4Nzc2OTNfc2V0X2JhdHR0ZXJ5X292ZXJjdXJyZW50KHN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGcsCisJCXVuc2lnbmVkIGludCB1YW1wKQoreworCXVuc2lnbmVkIGludCBkYXRhOworCisJaWYgKHVhbXAgJiYgKHVhbXAgPCAyMDAwMDAwIHx8IHVhbXAgPiAzNTAwMDAwKSkgeworCQlkZXZfZXJyKGNoZy0+ZGV2LCAiV3JvbmcgdmFsdWUgZm9yIGJhdHRlcnkgb3ZlcmN1cnJlbnRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodWFtcCkKKwkJZGF0YSA9ICgodWFtcCAtIDIwMDAwMDApIC8gMjUwMDAwKSArIDE7CisJZWxzZQorCQlkYXRhID0gMDsgLyogZGlzYWJsZSAqLworCisJZGF0YSA8PD0gQ0hHX0NORkdfMTJfQjJTT1ZSQ19TSElGVDsKKworCWRldl9kYmcoY2hnLT5kZXYsICJCYXR0ZXJ5IG92ZXJjdXJyZW50OiAldSAoMHgleClcbiIsIHVhbXAsIGRhdGEpOworCisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhjaGctPm1heDc3NjkzLT5yZWdtYXAsCisJCQlNQVg3NzY5M19DSEdfUkVHX0NIR19DTkZHXzEyLAorCQkJQ0hHX0NORkdfMTJfQjJTT1ZSQ19NQVNLLCBkYXRhKTsKK30KKworc3RhdGljIGludCBtYXg3NzY5M19zZXRfY2hhcmdlX2lucHV0X3RocmVzaG9sZF92b2x0KHN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGcsCisJCXVuc2lnbmVkIGludCB1dm9sdCkKK3sKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKworCXN3aXRjaCAodXZvbHQpIHsKKwljYXNlIDQzMDAwMDA6CisJCWRhdGEgPSAweDA7CisJCWJyZWFrOworCWNhc2UgNDcwMDAwMDoKKwljYXNlIDQ4MDAwMDA6CisJY2FzZSA0OTAwMDAwOgorCQlkYXRhID0gKHV2b2x0IC0gNDcwMDAwMCkgLyAxMDAwMDA7CisJZGVmYXVsdDoKKwkJZGV2X2VycihjaGctPmRldiwgIldyb25nIHZhbHVlIGZvciBjaGFyZ2UgaW5wdXQgdm9sdGFnZSByZWd1bGF0aW9uIHRocmVzaG9sZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRhdGEgPDw9IENIR19DTkZHXzEyX1ZDSEdJTlJFR19TSElGVDsKKworCWRldl9kYmcoY2hnLT5kZXYsICJDaGFyZ2UgaW5wdXQgdm9sdGFnZSByZWd1bGF0aW9uIHRocmVzaG9sZDogJXUgKDB4JXgpXG4iLAorCQkJdXZvbHQsIGRhdGEpOworCisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhjaGctPm1heDc3NjkzLT5yZWdtYXAsCisJCQlNQVg3NzY5M19DSEdfUkVHX0NIR19DTkZHXzEyLAorCQkJQ0hHX0NORkdfMTJfVkNIR0lOUkVHX01BU0ssIGRhdGEpOworfQorCisvKgorICogU2V0cyBjaGFyZ2VyIHJlZ2lzdGVycyB0byBwcm9wZXIgYW5kIHNhZmUgZGVmYXVsdCB2YWx1ZXMuCisgKi8KK3N0YXRpYyBpbnQgbWF4Nzc2OTNfcmVnX2luaXQoc3RydWN0IG1heDc3NjkzX2NoYXJnZXIgKmNoZykKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBkYXRhOworCisJLyogVW5sb2NrIGNoYXJnZXIgcmVnaXN0ZXIgcHJvdGVjdGlvbiAqLworCWRhdGEgPSAoMHgzIDw8IENIR19DTkZHXzA2X0NIR1BST1RfU0hJRlQpOworCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhjaGctPm1heDc3NjkzLT5yZWdtYXAsCisJCQkJTUFYNzc2OTNfQ0hHX1JFR19DSEdfQ05GR18wNiwKKwkJCQlDSEdfQ05GR18wNl9DSEdQUk9UX01BU0ssIGRhdGEpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihjaGctPmRldiwgIkVycm9yIHVubG9ja2luZyByZWdpc3RlcnM6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IG1heDc3NjkzX3NldF9mYXN0X2NoYXJnZV90aW1lcihjaGcsIERFRkFVTFRfRkFTVF9DSEFSR0VfVElNRVIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBtYXg3NzY5M19zZXRfdG9wX29mZl90aHJlc2hvbGRfY3VycmVudChjaGcsCisJCQlERUZBVUxUX1RPUF9PRkZfVEhSRVNIT0xEX0NVUlJFTlQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBtYXg3NzY5M19zZXRfdG9wX29mZl90aW1lcihjaGcsIERFRkFVTFRfVE9QX09GRl9USU1FUik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG1heDc3NjkzX3NldF9jb25zdGFudF92b2x0KGNoZywgY2hnLT5jb25zdGFudF92b2x0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbWF4Nzc2OTNfc2V0X21pbl9zeXN0ZW1fdm9sdChjaGcsIGNoZy0+bWluX3N5c3RlbV92b2x0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbWF4Nzc2OTNfc2V0X3RoZXJtYWxfcmVndWxhdGlvbl90ZW1wKGNoZywKKwkJCWNoZy0+dGhlcm1hbF9yZWd1bGF0aW9uX3RlbXApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBtYXg3NzY5M19zZXRfYmF0dHRlcnlfb3ZlcmN1cnJlbnQoY2hnLCBjaGctPmJhdHR0ZXJ5X292ZXJjdXJyZW50KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIG1heDc3NjkzX3NldF9jaGFyZ2VfaW5wdXRfdGhyZXNob2xkX3ZvbHQoY2hnLAorCQkJY2hnLT5jaGFyZ2VfaW5wdXRfdGhyZXNob2xkX3ZvbHQpOworfQorCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgaW50IG1heDc3NjkzX2R0X2luaXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgbWF4Nzc2OTNfY2hhcmdlciAqY2hnKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CisKKwlpZiAoIW5wKSB7CisJCWRldl9lcnIoZGV2LCAibm8gY2hhcmdlciBPRiBub2RlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAibWF4aW0sY29uc3RhbnQtbWljcm92b2x0IiwKKwkJCSZjaGctPmNvbnN0YW50X3ZvbHQpKQorCQljaGctPmNvbnN0YW50X3ZvbHQgPSBERUZBVUxUX0NPTlNUQU5UX1ZPTFQ7CisKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJtYXhpbSxtaW4tc3lzdGVtLW1pY3Jvdm9sdCIsCisJCQkmY2hnLT5taW5fc3lzdGVtX3ZvbHQpKQorCQljaGctPm1pbl9zeXN0ZW1fdm9sdCA9IERFRkFVTFRfTUlOX1NZU1RFTV9WT0xUOworCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAibWF4aW0sdGhlcm1hbC1yZWd1bGF0aW9uLWNlbHNpdXMiLAorCQkJJmNoZy0+dGhlcm1hbF9yZWd1bGF0aW9uX3RlbXApKQorCQljaGctPnRoZXJtYWxfcmVndWxhdGlvbl90ZW1wID0gREVGQVVMVF9USEVSTUFMX1JFR1VMQVRJT05fVEVNUDsKKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgIm1heGltLGJhdHRlcnktb3ZlcmN1cnJlbnQtbWljcm9hbXAiLAorCQkJJmNoZy0+YmF0dHRlcnlfb3ZlcmN1cnJlbnQpKQorCQljaGctPmJhdHR0ZXJ5X292ZXJjdXJyZW50ID0gREVGQVVMVF9CQVRURVJZX09WRVJDVVJSRU5UOworCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAibWF4aW0sY2hhcmdlLWlucHV0LXRocmVzaG9sZC1taWNyb3ZvbHQiLAorCQkJJmNoZy0+Y2hhcmdlX2lucHV0X3RocmVzaG9sZF92b2x0KSkKKwkJY2hnLT5jaGFyZ2VfaW5wdXRfdGhyZXNob2xkX3ZvbHQgPQorCQkJREVGQVVMVF9DSEFSR0VSX0lOUFVUX1RIUkVTSE9MRF9WT0xUOworCisJcmV0dXJuIDA7Cit9CisjZWxzZSAvKiBDT05GSUdfT0YgKi8KK3N0YXRpYyBpbnQgbWF4Nzc2OTNfZHRfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGcpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX09GICovCisKK3N0YXRpYyBpbnQgbWF4Nzc2OTNfY2hhcmdlcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGc7CisJc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgcHN5X2NmZyA9IHt9OworCXN0cnVjdCBtYXg3NzY5M19kZXYgKm1heDc3NjkzID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCWludCByZXQ7CisKKwljaGcgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpjaGcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjaGcpOworCWNoZy0+ZGV2ID0gJnBkZXYtPmRldjsKKwljaGctPm1heDc3NjkzID0gbWF4Nzc2OTM7CisKKwlyZXQgPSBtYXg3NzY5M19kdF9pbml0KCZwZGV2LT5kZXYsIGNoZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG1heDc3NjkzX3JlZ19pbml0KGNoZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXBzeV9jZmcuZHJ2X2RhdGEgPSBjaGc7CisKKwlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2Zhc3RfY2hhcmdlX3RpbWVyKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZDogY3JlYXRlIGZhc3QgY2hhcmdlIHRpbWVyIHN5c2ZzIGVudHJ5XG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsCisJCQkmZGV2X2F0dHJfdG9wX29mZl90aHJlc2hvbGRfY3VycmVudCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQ6IGNyZWF0ZSB0b3Agb2ZmIGN1cnJlbnQgc3lzZnMgZW50cnlcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX3RvcF9vZmZfdGltZXIpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkOiBjcmVhdGUgdG9wIG9mZiB0aW1lciBzeXNmcyBlbnRyeVxuIik7CisJCWdvdG8gZXJyOworCX0KKworCWNoZy0+Y2hhcmdlciA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LAorCQkJCQkJJm1heDc3NjkzX2NoYXJnZXJfZGVzYywKKwkJCQkJCSZwc3lfY2ZnKTsKKwlpZiAoSVNfRVJSKGNoZy0+Y2hhcmdlcikpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkOiBwb3dlciBzdXBwbHkgcmVnaXN0ZXJcbiIpOworCQlyZXQgPSBQVFJfRVJSKGNoZy0+Y2hhcmdlcik7CisJCWdvdG8gZXJyOworCX0KKworCXJldHVybiAwOworCitlcnI6CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl90b3Bfb2ZmX3RpbWVyKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX3RvcF9vZmZfdGhyZXNob2xkX2N1cnJlbnQpOworCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZmFzdF9jaGFyZ2VfdGltZXIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtYXg3NzY5M19jaGFyZ2VyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGcgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfdG9wX29mZl90aW1lcik7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl90b3Bfb2ZmX3RocmVzaG9sZF9jdXJyZW50KTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2Zhc3RfY2hhcmdlX3RpbWVyKTsKKworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGNoZy0+Y2hhcmdlcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgbWF4Nzc2OTNfY2hhcmdlcl9pZFtdID0geworCXsgIm1heDc3NjkzLWNoYXJnZXIiLCAwLCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGxhdGZvcm0sIG1heDc3NjkzX2NoYXJnZXJfaWQpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtYXg3NzY5M19jaGFyZ2VyX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJtYXg3NzY5My1jaGFyZ2VyIiwKKwl9LAorCS5wcm9iZQkJPSBtYXg3NzY5M19jaGFyZ2VyX3Byb2JlLAorCS5yZW1vdmUJCT0gbWF4Nzc2OTNfY2hhcmdlcl9yZW1vdmUsCisJLmlkX3RhYmxlCT0gbWF4Nzc2OTNfY2hhcmdlcl9pZCwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG1heDc3NjkzX2NoYXJnZXJfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiS3J6eXN6dG9mIEtvemxvd3NraSA8a3J6a0BrZXJuZWwub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXhpbSA3NzY5MyBjaGFyZ2VyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9tYXg4OTAzX2NoYXJnZXIuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L21heDg5MDNfY2hhcmdlci5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3Bvd2VyL21heDg5MDNfY2hhcmdlci5jCnJlbmFtZSB0byBkcml2ZXJzL3Bvd2VyL3N1cHBseS9tYXg4OTAzX2NoYXJnZXIuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9tYXg4OTI1X3Bvd2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9tYXg4OTI1X3Bvd2VyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvbWF4ODkyNV9wb3dlci5jCnJlbmFtZSB0byBkcml2ZXJzL3Bvd2VyL3N1cHBseS9tYXg4OTI1X3Bvd2VyLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvbWF4ODk5N19jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9tYXg4OTk3X2NoYXJnZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci9tYXg4OTk3X2NoYXJnZXIuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvbWF4ODk5N19jaGFyZ2VyLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvbWF4ODk5OF9jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9tYXg4OTk4X2NoYXJnZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci9tYXg4OTk4X2NoYXJnZXIuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvbWF4ODk5OF9jaGFyZ2VyLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvb2xwY19iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9vbHBjX2JhdHRlcnkuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci9vbHBjX2JhdHRlcnkuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvb2xwY19iYXR0ZXJ5LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvcGNmNTA2MzMtY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvcGNmNTA2MzMtY2hhcmdlci5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3Bvd2VyL3BjZjUwNjMzLWNoYXJnZXIuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvcGNmNTA2MzMtY2hhcmdlci5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3BkYV9wb3dlci5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvcGRhX3Bvd2VyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvcGRhX3Bvd2VyLmMKcmVuYW1lIHRvIGRyaXZlcnMvcG93ZXIvc3VwcGx5L3BkYV9wb3dlci5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9wbTIzMDFfY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvcG0yMzAxX2NoYXJnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODU2MWI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvcG0yMzAxX2NoYXJnZXIuYwpAQCAtMCwwICsxLDEyNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMiBTVCBFcmljc3Nvbi4KKyAqCisgKiBQb3dlciBzdXBwbHkgZHJpdmVyIGZvciBTVCBFcmljc3NvbiBwbTJ4eHhfY2hhcmdlciBjaGFyZ2VyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9hYng1MDAvYWI4NTAwLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2FieDUwMC9hYjg1MDAtYm0uaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvYWJ4NTAwL3V4NTAwX2NoYXJnYWxnLmg+CisjaW5jbHVkZSA8bGludXgvcG0yMzAxX2NoYXJnZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisKKyNpbmNsdWRlICJwbTIzMDFfY2hhcmdlci5oIgorCisjZGVmaW5lIHRvX3BtMnh4eF9jaGFyZ2VyX2FjX2RldmljZV9pbmZvKHgpIGNvbnRhaW5lcl9vZigoeCksIFwKKwkJc3RydWN0IHBtMnh4eF9jaGFyZ2VyLCBhY19jaGcpCisjZGVmaW5lIFNMRUVQX01JTgkJNTAKKyNkZWZpbmUgU0xFRVBfTUFYCQkxMDAKKyNkZWZpbmUgUE0yWFhYX0FVVE9TVVNQRU5EX0RFTEFZIDUwMAorCitzdGF0aWMgaW50IHBtMnh4eF9pbnRlcnJ1cHRfcmVnaXN0ZXJzW10gPSB7CisJUE0yWFhYX1JFR19JTlQxLAorCVBNMlhYWF9SRUdfSU5UMiwKKwlQTTJYWFhfUkVHX0lOVDMsCisJUE0yWFhYX1JFR19JTlQ0LAorCVBNMlhYWF9SRUdfSU5UNSwKKwlQTTJYWFhfUkVHX0lOVDYsCit9OworCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcG0yeHh4X2NoYXJnZXJfYWNfcHJvcHNbXSA9IHsKKwlQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEgsCisJUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUsCisJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9BVkcsCit9OworCitzdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2VyX3ZvbHRhZ2VfbWFwW10gPSB7CisJMzUwMCwKKwkzNTI1LAorCTM1NTAsCisJMzU3NSwKKwkzNjAwLAorCTM2MjUsCisJMzY1MCwKKwkzNjc1LAorCTM3MDAsCisJMzcyNSwKKwkzNzUwLAorCTM3NzUsCisJMzgwMCwKKwkzODI1LAorCTM4NTAsCisJMzg3NSwKKwkzOTAwLAorCTM5MjUsCisJMzk1MCwKKwkzOTc1LAorCTQwMDAsCisJNDAyNSwKKwk0MDUwLAorCTQwNzUsCisJNDEwMCwKKwk0MTI1LAorCTQxNTAsCisJNDE3NSwKKwk0MjAwLAorCTQyMjUsCisJNDI1MCwKKwk0Mjc1LAorCTQzMDAsCit9OworCitzdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2VyX2N1cnJlbnRfbWFwW10gPSB7CisJMjAwLAorCTIwMCwKKwk0MDAsCisJNjAwLAorCTgwMCwKKwkxMDAwLAorCTEyMDAsCisJMTQwMCwKKwkxNjAwLAorCTE4MDAsCisJMjAwMCwKKwkyMjAwLAorCTI0MDAsCisJMjYwMCwKKwkyODAwLAorCTMwMDAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgcG0yeHh4X2lkZW50W10gPSB7CisJeyAicG0yMzAxIiwgMCB9LAorCXsgfQorfTsKKworc3RhdGljIHZvaWQgc2V0X2xwbl9waW4oc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIpCit7CisJaWYgKCFwbTItPmFjLmNoYXJnZXJfY29ubmVjdGVkICYmIGdwaW9faXNfdmFsaWQocG0yLT5scG5fcGluKSkgeworCQlncGlvX3NldF92YWx1ZShwbTItPmxwbl9waW4sIDEpOworCQl1c2xlZXBfcmFuZ2UoU0xFRVBfTUlOLCBTTEVFUF9NQVgpOworCX0KK30KKworc3RhdGljIHZvaWQgY2xlYXJfbHBuX3BpbihzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMikKK3sKKwlpZiAoIXBtMi0+YWMuY2hhcmdlcl9jb25uZWN0ZWQgJiYgZ3Bpb19pc192YWxpZChwbTItPmxwbl9waW4pKQorCQlncGlvX3NldF92YWx1ZShwbTItPmxwbl9waW4sIDApOworfQorCitzdGF0aWMgaW50IHBtMnh4eF9yZWdfcmVhZChzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMiwgaW50IHJlZywgdTggKnZhbCkKK3sKKwlpbnQgcmV0OworCisJLyogd2FrZSB1cCB0aGUgZGV2aWNlICovCisJcG1fcnVudGltZV9nZXRfc3luYyhwbTItPmRldik7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShwbTItPmNvbmZpZy5wbTJ4eHhfaTJjLCByZWcsCisJCQkJMSwgdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycihwbTItPmRldiwgIkVycm9yIHJlYWRpbmcgcmVnaXN0ZXIgYXQgMHgleFxuIiwgcmVnKTsKKwllbHNlCisJCXJldCA9IDA7CisKKwlwbV9ydW50aW1lX3B1dF9zeW5jKHBtMi0+ZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcG0yeHh4X3JlZ193cml0ZShzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMiwgaW50IHJlZywgdTggdmFsKQoreworCWludCByZXQ7CisKKwkvKiB3YWtlIHVwIHRoZSBkZXZpY2UgKi8KKwlwbV9ydW50aW1lX2dldF9zeW5jKHBtMi0+ZGV2KTsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV9pMmNfYmxvY2tfZGF0YShwbTItPmNvbmZpZy5wbTJ4eHhfaTJjLCByZWcsCisJCQkJMSwgJnZhbCk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIocG0yLT5kZXYsICJFcnJvciB3cml0aW5nIHJlZ2lzdGVyIGF0IDB4JXhcbiIsIHJlZyk7CisJZWxzZQorCQlyZXQgPSAwOworCisJcG1fcnVudGltZV9wdXRfc3luYyhwbTItPmRldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2luZ19lbmFibGVfbW5ndChzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMikKK3sKKwlpbnQgcmV0OworCisJLyogRW5hYmxlIGNoYXJnaW5nICovCisJcmV0ID0gcG0yeHh4X3JlZ193cml0ZShwbTIsIFBNMlhYWF9CQVRUX0NUUkxfUkVHMiwKKwkJCShQTTJYWFhfQ0hfQVVUT19SRVNVTUVfRU4gfCBQTTJYWFhfQ0hBUkdFUl9FTkEpKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcG0yeHh4X2NoYXJnaW5nX2Rpc2FibGVfbW5ndChzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMikKK3sKKwlpbnQgcmV0OworCisJLyogRGlzYWJsZSBTVyBFT0MgY3RybCAqLworCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfU1dfQ1RSTF9SRUcsIFBNMlhYWF9TV0NUUkxfSFcpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocG0yLT5kZXYsICIlcyBwbTJ4eHggd3JpdGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogRGlzYWJsZSBjaGFyZ2luZyAqLworCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfQkFUVF9DVFJMX1JFRzIsCisJCQkoUE0yWFhYX0NIX0FVVE9fUkVTVU1FX0RJUyB8IFBNMlhYWF9DSEFSR0VSX0RJUykpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocG0yLT5kZXYsICIlcyBwbTJ4eHggd3JpdGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG0yeHh4X2NoYXJnZXJfYmF0dF90aGVybV9tbmd0KHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yLCBpbnQgdmFsKQoreworCXF1ZXVlX3dvcmsocG0yLT5jaGFyZ2VyX3dxLCAmcG0yLT5jaGVja19tYWluX3RoZXJtYWxfcHJvdF93b3JrKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcG0yeHh4X2NoYXJnZXJfZGllX3RoZXJtX21uZ3Qoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIsIGludCB2YWwpCit7CisJcXVldWVfd29yayhwbTItPmNoYXJnZXJfd3EsICZwbTItPmNoZWNrX21haW5fdGhlcm1hbF9wcm90X3dvcmspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG0yeHh4X2NoYXJnZXJfb3Z2X21uZ3Qoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIsIGludCB2YWwpCit7CisJZGV2X2VycihwbTItPmRldiwgIk92ZXJ2b2x0YWdlIGRldGVjdGVkXG4iKTsKKwlwbTItPmZsYWdzLm92diA9IHRydWU7CisJcG93ZXJfc3VwcGx5X2NoYW5nZWQocG0yLT5hY19jaGcucHN5KTsKKworCS8qIFNjaGVkdWxlIGEgbmV3IEhXIGZhaWx1cmUgY2hlY2sgKi8KKwlxdWV1ZV9kZWxheWVkX3dvcmsocG0yLT5jaGFyZ2VyX3dxLCAmcG0yLT5jaGVja19od19mYWlsdXJlX3dvcmssIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG0yeHh4X2NoYXJnZXJfd2RfZXhwX21uZ3Qoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIsIGludCB2YWwpCit7CisJZGV2X2RiZyhwbTItPmRldiAsICIyMCBtaW51dGVzIHdhdGNoZG9nIGV4cGlyZWRcbiIpOworCisJcG0yLT5hYy53ZF9leHBpcmVkID0gdHJ1ZTsKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZChwbTItPmFjX2NoZy5wc3kpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG0yeHh4X2NoYXJnZXJfdmJhdF9sc2lnX21uZ3Qoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIsIGludCB2YWwpCit7CisJaW50IHJldDsKKworCXN3aXRjaCAodmFsKSB7CisJY2FzZSBQTTJYWFhfSU5UMV9JVFZCQVRMT1dSOgorCQlkZXZfZGJnKHBtMi0+ZGV2LCAiVkJBVCBncm93cyBhYm92ZSBWQkFUX0xPVyBsZXZlbFxuIik7CisJCS8qIEVuYWJsZSBTVyBFT0MgY3RybCAqLworCQlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX1NXX0NUUkxfUkVHLAorCQkJCQkJCVBNMlhYWF9TV0NUUkxfU1cpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihwbTItPmRldiwgIiVzIHBtMnh4eCB3cml0ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFBNMlhYWF9JTlQxX0lUVkJBVExPV0Y6CisJCWRldl9kYmcocG0yLT5kZXYsICJWQkFUIGRyb3BzIGJlbG93IFZCQVRfTE9XIGxldmVsXG4iKTsKKwkJLyogRGlzYWJsZSBTVyBFT0MgY3RybCAqLworCQlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX1NXX0NUUkxfUkVHLAorCQkJCQkJCVBNMlhYWF9TV0NUUkxfSFcpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihwbTItPmRldiwgIiVzIHBtMnh4eCB3cml0ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyKHBtMi0+ZGV2LCAiVW5rbm93biBWQkFUIGxldmVsXG4iKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbTJ4eHhfY2hhcmdlcl9iYXRfZGlzY19tbmd0KHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yLCBpbnQgdmFsKQoreworCWRldl9kYmcocG0yLT5kZXYsICJiYXR0ZXJ5IGRpc2Nvbm5lY3RlZFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbTJ4eHhfY2hhcmdlcl9kZXRlY3Rpb24oc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIsIHU4ICp2YWwpCit7CisJaW50IHJldDsKKworCXJldCA9IHBtMnh4eF9yZWdfcmVhZChwbTIsIFBNMlhYWF9TUkNFX1JFR19JTlQyLCB2YWwpOworCisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihwbTItPmRldiwgIkNoYXJnZXIgZGV0ZWN0aW9uIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCSp2YWwgJj0gKFBNMlhYWF9JTlQyX1NfSVRWUFdSMVBMVUcgfCBQTTJYWFhfSU5UMl9TX0lUVlBXUjJQTFVHKTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcG0yeHh4X2NoYXJnZXJfaXR2X3B3cl9wbHVnX21uZ3Qoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIsIGludCB2YWwpCit7CisKKwlpbnQgcmV0OworCXU4IHJlYWRfdmFsOworCisJLyoKKwkgKiBTaW5jZSB3ZSBjYW4ndCBiZSBzdXJlIHRoYXQgdGhlIGV2ZW50cyBhcmUgcmVjZWl2ZWQKKwkgKiBzeW5jaHJvbm91c2x5LCB3ZSBoYXZlIHRoZSBjaGVjayBpZiB0aGUgbWFpbiBjaGFyZ2VyIGlzCisJICogY29ubmVjdGVkIGJ5IHJlYWRpbmcgdGhlIGludGVycnVwdCBzb3VyY2UgcmVnaXN0ZXIuCisJICovCisJcmV0ID0gcG0yeHh4X2NoYXJnZXJfZGV0ZWN0aW9uKHBtMiwgJnJlYWRfdmFsKTsKKworCWlmICgocmV0ID09IDApICYmIHJlYWRfdmFsKSB7CisJCXBtMi0+YWMuY2hhcmdlcl9jb25uZWN0ZWQgPSAxOworCQlwbTItPmFjX2Nvbm4gPSB0cnVlOworCQlxdWV1ZV93b3JrKHBtMi0+Y2hhcmdlcl93cSwgJnBtMi0+YWNfd29yayk7CisJfQorCisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2VyX2l0dl9wd3JfdW5wbHVnX21uZ3Qoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIsCisJCQkJCQkJCWludCB2YWwpCit7CisJcG0yLT5hYy5jaGFyZ2VyX2Nvbm5lY3RlZCA9IDA7CisJcXVldWVfd29yayhwbTItPmNoYXJnZXJfd3EsICZwbTItPmFjX3dvcmspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG0yX2ludF9yZWcwKHZvaWQgKnBtMl9kYXRhLCBpbnQgdmFsKQoreworCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yID0gcG0yX2RhdGE7CisJaW50IHJldCA9IDA7CisKKwlpZiAodmFsICYgUE0yWFhYX0lOVDFfSVRWQkFUTE9XUikgeworCQlyZXQgPSBwbTJ4eHhfY2hhcmdlcl92YmF0X2xzaWdfbW5ndChwbTIsCisJCQkJCQlQTTJYWFhfSU5UMV9JVFZCQVRMT1dSKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKwl9CisKKwlpZiAodmFsICYgUE0yWFhYX0lOVDFfSVRWQkFUTE9XRikgeworCQlyZXQgPSBwbTJ4eHhfY2hhcmdlcl92YmF0X2xzaWdfbW5ndChwbTIsCisJCQkJCQlQTTJYWFhfSU5UMV9JVFZCQVRMT1dGKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKwl9CisKKwlpZiAodmFsICYgUE0yWFhYX0lOVDFfSVRWQkFURElTQ09OTkVDVCkgeworCQlyZXQgPSBwbTJ4eHhfY2hhcmdlcl9iYXRfZGlzY19tbmd0KHBtMiwKKwkJCQlQTTJYWFhfSU5UMV9JVFZCQVRESVNDT05ORUNUKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwbTJfaW50X3JlZzEodm9pZCAqcG0yX2RhdGEsIGludCB2YWwpCit7CisJc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIgPSBwbTJfZGF0YTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICh2YWwgJiAoUE0yWFhYX0lOVDJfSVRWUFdSMVBMVUcgfCBQTTJYWFhfSU5UMl9JVFZQV1IyUExVRykpIHsKKwkJZGV2X2RiZyhwbTItPmRldiAsICJNYWluIGNoYXJnZXIgcGx1Z2dlZFxuIik7CisJCXJldCA9IHBtMnh4eF9jaGFyZ2VyX2l0dl9wd3JfcGx1Z19tbmd0KHBtMiwgdmFsICYKKwkJCShQTTJYWFhfSU5UMl9JVFZQV1IxUExVRyB8IFBNMlhYWF9JTlQyX0lUVlBXUjJQTFVHKSk7CisJfQorCisJaWYgKHZhbCAmCisJCShQTTJYWFhfSU5UMl9JVFZQV1IxVU5QTFVHIHwgUE0yWFhYX0lOVDJfSVRWUFdSMlVOUExVRykpIHsKKwkJZGV2X2RiZyhwbTItPmRldiAsICJNYWluIGNoYXJnZXIgdW5wbHVnZ2VkXG4iKTsKKwkJcmV0ID0gcG0yeHh4X2NoYXJnZXJfaXR2X3B3cl91bnBsdWdfbW5ndChwbTIsIHZhbCAmCisJCQkJCQkoUE0yWFhYX0lOVDJfSVRWUFdSMVVOUExVRyB8CisJCQkJCQlQTTJYWFhfSU5UMl9JVFZQV1IyVU5QTFVHKSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwbTJfaW50X3JlZzIodm9pZCAqcG0yX2RhdGEsIGludCB2YWwpCit7CisJc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIgPSBwbTJfZGF0YTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICh2YWwgJiBQTTJYWFhfSU5UM19JVEFVVE9USU1FT1VUV0QpCisJCXJldCA9IHBtMnh4eF9jaGFyZ2VyX3dkX2V4cF9tbmd0KHBtMiwgdmFsKTsKKworCWlmICh2YWwgJiAoUE0yWFhYX0lOVDNfSVRDSFBSRUNIQVJHRVdEIHwKKwkJCQlQTTJYWFhfSU5UM19JVENIQ0NXRCB8IFBNMlhYWF9JTlQzX0lUQ0hDVldEKSkgeworCQlkZXZfZGJnKHBtMi0+ZGV2LAorCQkJIldhdGNoZG9nIG9jY3VycmVkIGZvciBwcmVjaGFyZ2UsIENDIGFuZCBDViBjaGFyZ2VcbiIpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcG0yX2ludF9yZWczKHZvaWQgKnBtMl9kYXRhLCBpbnQgdmFsKQoreworCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yID0gcG0yX2RhdGE7CisJaW50IHJldCA9IDA7CisKKwlpZiAodmFsICYgKFBNMlhYWF9JTlQ0X0lUQ0hBUkdJTkdPTikpIHsKKwkJZGV2X2RiZyhwbTItPmRldiAsCisJCQkiY2hhcmdpbmQgb3BlcmF0aW9uIGhhcyBzdGFydGVkXG4iKTsKKwl9CisKKwlpZiAodmFsICYgKFBNMlhYWF9JTlQ0X0lUVlJFU1VNRSkpIHsKKwkJZGV2X2RiZyhwbTItPmRldiwKKwkJCSJiYXR0ZXJ5IGRpc2NoYXJnZWQgZG93biB0byBWUmVzdW1lIHRocmVzaG9sZFxuIik7CisJfQorCisJaWYgKHZhbCAmIChQTTJYWFhfSU5UNF9JVEJBVFRGVUxMKSkgeworCQlkZXZfZGJnKHBtMi0+ZGV2ICwgImJhdHRlcnkgZnVsbHkgZGV0ZWN0ZWRcbiIpOworCX0KKworCWlmICh2YWwgJiAoUE0yWFhYX0lOVDRfSVRDVlBIQVNFKSkgeworCQlkZXZfZGJnKHBtMi0+ZGV2LCAiQ1YgcGhhc2UgZW50ZXIgd2l0aCAwLjVDIGNoYXJnaW5nXG4iKTsKKwl9CisKKwlpZiAodmFsICYgKFBNMlhYWF9JTlQ0X0lUVlBXUjJPVlYgfCBQTTJYWFhfSU5UNF9JVFZQV1IxT1ZWKSkgeworCQlwbTItPmZhaWx1cmVfY2FzZSA9IFZQV1JfT1ZWOworCQlyZXQgPSBwbTJ4eHhfY2hhcmdlcl9vdnZfbW5ndChwbTIsIHZhbCAmCisJCQkoUE0yWFhYX0lOVDRfSVRWUFdSMk9WViB8IFBNMlhYWF9JTlQ0X0lUVlBXUjFPVlYpKTsKKwkJZGV2X2RiZyhwbTItPmRldiwgIlZQV1IvVlNZU1RFTSBvdmVydm9sdGFnZSBkZXRlY3RlZFxuIik7CisJfQorCisJaWYgKHZhbCAmIChQTTJYWFhfSU5UNF9TX0lUQkFUVEVNUENPTEQgfAorCQkJCVBNMlhYWF9JTlQ0X1NfSVRCQVRURU1QSE9UKSkgeworCQlyZXQgPSBwbTJ4eHhfY2hhcmdlcl9iYXR0X3RoZXJtX21uZ3QocG0yLCB2YWwgJgorCQkJKFBNMlhYWF9JTlQ0X1NfSVRCQVRURU1QQ09MRCB8CisJCQlQTTJYWFhfSU5UNF9TX0lUQkFUVEVNUEhPVCkpOworCQlkZXZfZGJnKHBtMi0+ZGV2LCAiQlRFTVAgaXMgdG9vIExvdy9IaWdoXG4iKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBtMl9pbnRfcmVnNCh2b2lkICpwbTJfZGF0YSwgaW50IHZhbCkKK3sKKwlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMiA9IHBtMl9kYXRhOworCWludCByZXQgPSAwOworCisJaWYgKHZhbCAmIFBNMlhYWF9JTlQ1X0lUVlNZU1RFTU9WVikgeworCQlwbTItPmZhaWx1cmVfY2FzZSA9IFZTWVNURU1fT1ZWOworCQlyZXQgPSBwbTJ4eHhfY2hhcmdlcl9vdnZfbW5ndChwbTIsIHZhbCAmCisJCQkJCQlQTTJYWFhfSU5UNV9JVFZTWVNURU1PVlYpOworCQlkZXZfZGJnKHBtMi0+ZGV2LCAiVlNZU1RFTSBvdmVydm9sdGFnZSBkZXRlY3RlZFxuIik7CisJfQorCisJaWYgKHZhbCAmIChQTTJYWFhfSU5UNV9JVFRIRVJNQUxXQVJOSU5HRkFMTCB8CisJCQkJUE0yWFhYX0lOVDVfSVRUSEVSTUFMV0FSTklOR1JJU0UgfAorCQkJCVBNMlhYWF9JTlQ1X0lUVEhFUk1BTFNIVVRET1dORkFMTCB8CisJCQkJUE0yWFhYX0lOVDVfSVRUSEVSTUFMU0hVVERPV05SSVNFKSkgeworCQlkZXZfZGJnKHBtMi0+ZGV2LCAiQlRFTVAgZGllIHRlbXBlcmF0dXJlIGlzIHRvbyBMb3cvSGlnaFxuIik7CisJCXJldCA9IHBtMnh4eF9jaGFyZ2VyX2RpZV90aGVybV9tbmd0KHBtMiwgdmFsICYKKwkJCShQTTJYWFhfSU5UNV9JVFRIRVJNQUxXQVJOSU5HRkFMTCB8CisJCQlQTTJYWFhfSU5UNV9JVFRIRVJNQUxXQVJOSU5HUklTRSB8CisJCQlQTTJYWFhfSU5UNV9JVFRIRVJNQUxTSFVURE9XTkZBTEwgfAorCQkJUE0yWFhYX0lOVDVfSVRUSEVSTUFMU0hVVERPV05SSVNFKSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwbTJfaW50X3JlZzUodm9pZCAqcG0yX2RhdGEsIGludCB2YWwpCit7CisJc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIgPSBwbTJfZGF0YTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICh2YWwgJiAoUE0yWFhYX0lOVDZfSVRWUFdSMkRST1AgfCBQTTJYWFhfSU5UNl9JVFZQV1IxRFJPUCkpIHsKKwkJZGV2X2RiZyhwbTItPmRldiwgIlZNUFdSIGRyb3AgdG8gVkJBVCBsZXZlbFxuIik7CisJfQorCisJaWYgKHZhbCAmIChQTTJYWFhfSU5UNl9JVFZQV1IyVkFMSURSSVNFIHwKKwkJCVBNMlhYWF9JTlQ2X0lUVlBXUjFWQUxJRFJJU0UgfAorCQkJUE0yWFhYX0lOVDZfSVRWUFdSMlZBTElERkFMTCB8CisJCQlQTTJYWFhfSU5UNl9JVFZQV1IxVkFMSURGQUxMKSkgeworCQlkZXZfZGJnKHBtMi0+ZGV2LCAiRmFsbGluZy9SaXNpbmcgZWRnZSBvbiBXUFdSMS8yXG4iKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgIHBtMnh4eF9pcnFfaW50KGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIgPSBkYXRhOworCXN0cnVjdCBwbTJ4eHhfaW50ZXJydXB0cyAqaW50ZXJydXB0ID0gcG0yLT5wbTJfaW50OworCWludCBpOworCisJLyogd2FrZSB1cCB0aGUgZGV2aWNlICovCisJcG1fcnVudGltZV9nZXRfc3luYyhwbTItPmRldik7CisKKwlkbyB7CisJCWZvciAoaSA9IDA7IGkgPCBQTTJYWFhfTlVNX0lOVF9SRUc7IGkrKykgeworCQkJcG0yeHh4X3JlZ19yZWFkKHBtMiwKKwkJCQlwbTJ4eHhfaW50ZXJydXB0X3JlZ2lzdGVyc1tpXSwKKwkJCQkmKGludGVycnVwdC0+cmVnW2ldKSk7CisKKwkJCWlmIChpbnRlcnJ1cHQtPnJlZ1tpXSA+IDApCisJCQkJaW50ZXJydXB0LT5oYW5kbGVyW2ldKHBtMiwgaW50ZXJydXB0LT5yZWdbaV0pOworCQl9CisJfSB3aGlsZSAoZ3Bpb19nZXRfdmFsdWUocG0yLT5wZGF0YS0+Z3Bpb19pcnFfbnVtYmVyKSA9PSAwKTsKKworCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3kocG0yLT5kZXYpOworCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKHBtMi0+ZGV2KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBwbTJ4eHhfY2hhcmdlcl9nZXRfYWNfY3Yoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIpCit7CisJaW50IHJldCA9IDA7CisJdTggdmFsOworCisJaWYgKHBtMi0+YWMuY2hhcmdlcl9jb25uZWN0ZWQgJiYgcG0yLT5hYy5jaGFyZ2VyX29ubGluZSkgeworCisJCXJldCA9IHBtMnh4eF9yZWdfcmVhZChwbTIsIFBNMlhYWF9TUkNFX1JFR19JTlQ0LCAmdmFsKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIocG0yLT5kZXYsICIlcyBwbTJ4eHggcmVhZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKHZhbCAmIFBNMlhYWF9JTlQ0X1NfSVRDVlBIQVNFKQorCQkJcmV0ID0gUE0yWFhYX0NPTlNUX1ZPTFQ7CisJCWVsc2UKKwkJCXJldCA9IFBNMlhYWF9DT05TVF9DVVJSOworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBtMnh4eF9jdXJyZW50X3RvX3JlZ3ZhbChpbnQgY3VycikKK3sKKwlpbnQgaTsKKworCWlmIChjdXJyIDwgcG0yeHh4X2NoYXJnZXJfY3VycmVudF9tYXBbMF0pCisJCXJldHVybiAwOworCisJZm9yIChpID0gMTsgaSA8IEFSUkFZX1NJWkUocG0yeHh4X2NoYXJnZXJfY3VycmVudF9tYXApOyBpKyspIHsKKwkJaWYgKGN1cnIgPCBwbTJ4eHhfY2hhcmdlcl9jdXJyZW50X21hcFtpXSkKKwkJCXJldHVybiAoaSAtIDEpOworCX0KKworCWkgPSBBUlJBWV9TSVpFKHBtMnh4eF9jaGFyZ2VyX2N1cnJlbnRfbWFwKSAtIDE7CisJaWYgKGN1cnIgPT0gcG0yeHh4X2NoYXJnZXJfY3VycmVudF9tYXBbaV0pCisJCXJldHVybiBpOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgcG0yeHh4X3ZvbHRhZ2VfdG9fcmVndmFsKGludCBjdXJyKQoreworCWludCBpOworCisJaWYgKGN1cnIgPCBwbTJ4eHhfY2hhcmdlcl92b2x0YWdlX21hcFswXSkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAxOyBpIDwgQVJSQVlfU0laRShwbTJ4eHhfY2hhcmdlcl92b2x0YWdlX21hcCk7IGkrKykgeworCQlpZiAoY3VyciA8IHBtMnh4eF9jaGFyZ2VyX3ZvbHRhZ2VfbWFwW2ldKQorCQkJcmV0dXJuIGkgLSAxOworCX0KKworCWkgPSBBUlJBWV9TSVpFKHBtMnh4eF9jaGFyZ2VyX3ZvbHRhZ2VfbWFwKSAtIDE7CisJaWYgKGN1cnIgPT0gcG0yeHh4X2NoYXJnZXJfdm9sdGFnZV9tYXBbaV0pCisJCXJldHVybiBpOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgcG0yeHh4X2NoYXJnZXJfdXBkYXRlX2NoYXJnZXJfY3VycmVudChzdHJ1Y3QgdXg1MDBfY2hhcmdlciAqY2hhcmdlciwKKwkJaW50IGljaF9vdXQpCit7CisJaW50IHJldDsKKwlpbnQgY3Vycl9pbmRleDsKKwlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMjsKKwl1OCB2YWw7CisKKwlpZiAoY2hhcmdlci0+cHN5LT5kZXNjLT50eXBlID09IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TKQorCQlwbTIgPSB0b19wbTJ4eHhfY2hhcmdlcl9hY19kZXZpY2VfaW5mbyhjaGFyZ2VyKTsKKwllbHNlCisJCXJldHVybiAtRU5YSU87CisKKwljdXJyX2luZGV4ID0gcG0yeHh4X2N1cnJlbnRfdG9fcmVndmFsKGljaF9vdXQpOworCWlmIChjdXJyX2luZGV4IDwgMCkgeworCQlkZXZfZXJyKHBtMi0+ZGV2LAorCQkJIkNoYXJnZXIgY3VycmVudCB0b28gaGlnaCwgY2hhcmdpbmcgbm90IHN0YXJ0ZWRcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXJldCA9IHBtMnh4eF9yZWdfcmVhZChwbTIsIFBNMlhYWF9CQVRUX0NUUkxfUkVHNiwgJnZhbCk7CisJaWYgKHJldCA+PSAwKSB7CisJCXZhbCAmPSB+UE0yWFhYX0RJUl9DSF9DQ19DVVJSRU5UX01BU0s7CisJCXZhbCB8PSBjdXJyX2luZGV4OworCQlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0JBVFRfQ1RSTF9SRUc2LCB2YWwpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihwbTItPmRldiwKKwkJCQkiJXMgd3JpdGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCX0KKwl9CisJZWxzZQorCQlkZXZfZXJyKHBtMi0+ZGV2LCAiJXMgcmVhZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcG0yeHh4X2NoYXJnZXJfYWNfZ2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKKwllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCisJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMjsKKworCXBtMiA9IHRvX3BtMnh4eF9jaGFyZ2VyX2FjX2RldmljZV9pbmZvKHBzeV90b191eDUwMF9jaGFyZ2VyKHBzeSkpOworCisJc3dpdGNoIChwc3ApIHsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSDoKKwkJaWYgKHBtMi0+ZmxhZ3MubWFpbmV4dGNobm90b2spCisJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfVU5TUEVDX0ZBSUxVUkU7CisJCWVsc2UgaWYgKHBtMi0+YWMud2RfZXhwaXJlZCkKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9ERUFEOworCQllbHNlIGlmIChwbTItPmZsYWdzLm1haW5fdGhlcm1hbF9wcm90KQorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJIRUFUOworCQllbHNlIGlmIChwbTItPmZsYWdzLm92dikKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSVk9MVEFHRTsKKwkJZWxzZQorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0Q7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FOgorCQl2YWwtPmludHZhbCA9IHBtMi0+YWMuY2hhcmdlcl9vbmxpbmU7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDoKKwkJdmFsLT5pbnR2YWwgPSBwbTItPmFjLmNoYXJnZXJfY29ubmVjdGVkOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfQVZHOgorCQlwbTItPmFjLmN2X2FjdGl2ZSA9IHBtMnh4eF9jaGFyZ2VyX2dldF9hY19jdihwbTIpOworCQl2YWwtPmludHZhbCA9IHBtMi0+YWMuY3ZfYWN0aXZlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG0yeHh4X2NoYXJnaW5nX2luaXQoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIpCit7CisJaW50IHJldCA9IDA7CisKKwkvKiBlbmFibGUgQ0MgYW5kIENWIHdhdGNoZG9nICovCisJcmV0ID0gcG0yeHh4X3JlZ193cml0ZShwbTIsIFBNMlhYWF9CQVRUX0NUUkxfUkVHMywKKwkJKFBNMlhYWF9DSF9XRF9DVl9QSEFTRV82ME1JTiB8IFBNMlhYWF9DSF9XRF9DQ19QSEFTRV82ME1JTikpOworCWlmKCByZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogZW5hYmxlIHByZWNoYXJnZSB3YXRjaGRvZyAqLworCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfQkFUVF9DVFJMX1JFRzQsCisJCQkJCVBNMlhYWF9DSF9XRF9QUkVDSF9QSEFTRV82ME1JTik7CisKKwkvKiBEaXNhYmxlIGF1dG8gdGltZW91dCAqLworCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfQkFUVF9DVFJMX1JFRzUsCisJCQkJCVBNMlhYWF9DSF9XRF9BVVRPX1RJTUVPVVRfMjBNSU4pOworCisJLyoKKyAgICAgKiBFT0MgY3VycmVudCBsZXZlbCA9IDEwMG1BCisJICogUHJlY2hhcmdlIGN1cnJlbnQgbGV2ZWwgPSAxMDBtQQorCSAqIENDIGN1cnJlbnQgbGV2ZWwgPSAxMDAwbUEKKwkgKi8KKwlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0JBVFRfQ1RSTF9SRUc2LAorCQkoUE0yWFhYX0RJUl9DSF9DQ19DVVJSRU5UXzEwMDBNQSB8CisJCVBNMlhYWF9DSF9QUkVDSF9DVVJSRU5UXzEwME1BIHwKKwkJUE0yWFhYX0NIX0VPQ19DVVJSRU5UXzEwME1BKSk7CisKKwkvKgorICAgICAqIHJlY2hhcmdlIHRocmVzaG9sZCA9IDMuOFYKKwkgKiBQcmVjaGFyZ2UgdG8gQ0MgdGhyZXNob2xkID0gMi45VgorCSAqLworCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfQkFUVF9DVFJMX1JFRzcsCisJCShQTTJYWFhfQ0hfUFJFQ0hfVk9MXzJfOSB8IFBNMlhYWF9DSF9WUkVTVU1FX1ZPTF8zXzgpKTsKKworCS8qIGZsb2F0IHZvbHRhZ2UgY2hhcmdlciBsZXZlbCA9IDQuMlYgKi8KKwlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0JBVFRfQ1RSTF9SRUc4LAorCQlQTTJYWFhfQ0hfVk9MVF80XzIpOworCisJLyogVm9sdGFnZSBkcm9wIGJldHdlZW4gVkJBVCBhbmQgVlNZUyBpbiBIVyBjaGFyZ2luZyA9IDMwMG1WICovCisJcmV0ID0gcG0yeHh4X3JlZ193cml0ZShwbTIsIFBNMlhYWF9CQVRUX0NUUkxfUkVHOSwKKwkJKFBNMlhYWF9DSF8xNTBNVl9EUk9QXzMwME1WIHwgUE0yWFhYX0NIQVJDSElOR19JTkZPX0RJUyB8CisJCVBNMlhYWF9DSF9DQ19SRURVQ0VEX0NVUlJFTlRfSURFTlQgfAorCQlQTTJYWFhfQ0hfQ0NfTU9ERURST1BfRElTKSk7CisKKwkvKiBJbnB1dCBjaGFyZ2VyIGxldmVsIG9mIG92ZXIgdm9sdGFnZSA9IDEwViAqLworCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfSU5QX1ZPTFRfVlBXUjIsCisJCQkJCVBNMlhYWF9WUFdSMl9PVlZfMTApOworCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfSU5QX1ZPTFRfVlBXUjEsCisJCQkJCVBNMlhYWF9WUFdSMV9PVlZfMTApOworCisJLyogSW5wdXQgY2hhcmdlciBkcm9wICovCisJcmV0ID0gcG0yeHh4X3JlZ193cml0ZShwbTIsIFBNMlhYWF9JTlBfRFJPUF9WUFdSMiwKKwkJKFBNMlhYWF9WUFdSMl9IV19PUFRfRElTIHwgUE0yWFhYX1ZQV1IyX1ZBTElEX0RJUyB8CisJCVBNMlhYWF9WUFdSMl9EUk9QX0RJUykpOworCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfSU5QX0RST1BfVlBXUjEsCisJCShQTTJYWFhfVlBXUjFfSFdfT1BUX0RJUyB8IFBNMlhYWF9WUFdSMV9WQUxJRF9ESVMgfAorCQlQTTJYWFhfVlBXUjFfRFJPUF9ESVMpKTsKKworCS8qIERpc2FibGUgYmF0dGVyeSBsb3cgbW9uaXRvcmluZyAqLworCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfQkFUVF9MT1dfTEVWX0NPTVBfUkVHLAorCQlQTTJYWFhfVkJBVF9MT1dfTU9OSVRPUklOR19FTkEpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwbTJ4eHhfY2hhcmdlcl9hY19lbihzdHJ1Y3QgdXg1MDBfY2hhcmdlciAqY2hhcmdlciwKKwlpbnQgZW5hYmxlLCBpbnQgdnNldCwgaW50IGlzZXQpCit7CisJaW50IHJldDsKKwlpbnQgdm9sdF9pbmRleDsKKwlpbnQgY3Vycl9pbmRleDsKKwl1OCB2YWw7CisKKwlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMiA9IHRvX3BtMnh4eF9jaGFyZ2VyX2FjX2RldmljZV9pbmZvKGNoYXJnZXIpOworCisJaWYgKGVuYWJsZSkgeworCQlpZiAoIXBtMi0+YWMuY2hhcmdlcl9jb25uZWN0ZWQpIHsKKwkJCWRldl9kYmcocG0yLT5kZXYsICJBQyBjaGFyZ2VyIG5vdCBjb25uZWN0ZWRcbiIpOworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQorCisJCWRldl9kYmcocG0yLT5kZXYsICJFbmFibGUgQUM6ICVkbVYgJWRtQVxuIiwgdnNldCwgaXNldCk7CisJCWlmICghcG0yLT52ZGRhZGNfZW5fYWMpIHsKKwkJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUocG0yLT5yZWd1KTsKKwkJCWlmIChyZXQpCisJCQkJZGV2X3dhcm4ocG0yLT5kZXYsCisJCQkJCSJGYWlsZWQgdG8gZW5hYmxlIHZkZGFkYyByZWd1bGF0b3JcbiIpOworCQkJZWxzZQorCQkJCXBtMi0+dmRkYWRjX2VuX2FjID0gdHJ1ZTsKKwkJfQorCisJCXJldCA9IHBtMnh4eF9jaGFyZ2luZ19pbml0KHBtMik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKHBtMi0+ZGV2LCAiJXMgY2hhcmdpbmcgaW5pdCBmYWlsZWRcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCWdvdG8gZXJyb3Jfb2NjdXJlZDsKKwkJfQorCisJCXZvbHRfaW5kZXggPSBwbTJ4eHhfdm9sdGFnZV90b19yZWd2YWwodnNldCk7CisJCWN1cnJfaW5kZXggPSBwbTJ4eHhfY3VycmVudF90b19yZWd2YWwoaXNldCk7CisKKwkJaWYgKHZvbHRfaW5kZXggPCAwIHx8IGN1cnJfaW5kZXggPCAwKSB7CisJCQlkZXZfZXJyKHBtMi0+ZGV2LAorCQkJCSJDaGFyZ2VyIHZvbHRhZ2Ugb3IgY3VycmVudCB0b28gaGlnaCwgIgorCQkJCSJjaGFyZ2luZyBub3Qgc3RhcnRlZFxuIik7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisKKwkJcmV0ID0gcG0yeHh4X3JlZ19yZWFkKHBtMiwgUE0yWFhYX0JBVFRfQ1RSTF9SRUc4LCAmdmFsKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIocG0yLT5kZXYsICIlcyBwbTJ4eHggcmVhZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCWdvdG8gZXJyb3Jfb2NjdXJlZDsKKwkJfQorCQl2YWwgJj0gflBNMlhYWF9DSF9WT0xUX01BU0s7CisJCXZhbCB8PSB2b2x0X2luZGV4OworCQlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0JBVFRfQ1RSTF9SRUc4LCB2YWwpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihwbTItPmRldiwgIiVzIHBtMnh4eCB3cml0ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCWdvdG8gZXJyb3Jfb2NjdXJlZDsKKwkJfQorCisJCXJldCA9IHBtMnh4eF9yZWdfcmVhZChwbTIsIFBNMlhYWF9CQVRUX0NUUkxfUkVHNiwgJnZhbCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKHBtMi0+ZGV2LCAiJXMgcG0yeHh4IHJlYWQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlnb3RvIGVycm9yX29jY3VyZWQ7CisJCX0KKwkJdmFsICY9IH5QTTJYWFhfRElSX0NIX0NDX0NVUlJFTlRfTUFTSzsKKwkJdmFsIHw9IGN1cnJfaW5kZXg7CisJCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfQkFUVF9DVFJMX1JFRzYsIHZhbCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKHBtMi0+ZGV2LCAiJXMgcG0yeHh4IHdyaXRlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJZ290byBlcnJvcl9vY2N1cmVkOworCQl9CisKKwkJaWYgKCFwbTItPmJhdC0+ZW5hYmxlX292ZXJzaG9vdCkgeworCQkJcmV0ID0gcG0yeHh4X3JlZ19yZWFkKHBtMiwgUE0yWFhYX0xFRF9DVFJMX1JFRywgJnZhbCk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWRldl9lcnIocG0yLT5kZXYsICIlcyBwbTJ4eHggcmVhZCBmYWlsZWRcbiIsCisJCQkJCQkJCV9fZnVuY19fKTsKKwkJCQlnb3RvIGVycm9yX29jY3VyZWQ7CisJCQl9CisJCQl2YWwgfD0gUE0yWFhYX0FOVElfT1ZFUlNIT09UX0VOOworCQkJcmV0ID0gcG0yeHh4X3JlZ193cml0ZShwbTIsIFBNMlhYWF9MRURfQ1RSTF9SRUcsIHZhbCk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWRldl9lcnIocG0yLT5kZXYsICIlcyBwbTJ4eHggd3JpdGUgZmFpbGVkXG4iLAorCQkJCQkJCQlfX2Z1bmNfXyk7CisJCQkJZ290byBlcnJvcl9vY2N1cmVkOworCQkJfQorCQl9CisKKwkJcmV0ID0gcG0yeHh4X2NoYXJnaW5nX2VuYWJsZV9tbmd0KHBtMik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKHBtMi0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSIKKwkJCQkJCSJwbTJ4eHggYWMgY2hhcmdlclxuIik7CisJCQlnb3RvIGVycm9yX29jY3VyZWQ7CisJCX0KKworCQlwbTItPmFjLmNoYXJnZXJfb25saW5lID0gMTsKKwl9IGVsc2UgeworCQlwbTItPmFjLmNoYXJnZXJfb25saW5lID0gMDsKKwkJcG0yLT5hYy53ZF9leHBpcmVkID0gZmFsc2U7CisKKwkJLyogRGlzYWJsZSByZWd1bGF0b3IgaWYgZW5hYmxlZCAqLworCQlpZiAocG0yLT52ZGRhZGNfZW5fYWMpIHsKKwkJCXJlZ3VsYXRvcl9kaXNhYmxlKHBtMi0+cmVndSk7CisJCQlwbTItPnZkZGFkY19lbl9hYyA9IGZhbHNlOworCQl9CisKKwkJcmV0ID0gcG0yeHh4X2NoYXJnaW5nX2Rpc2FibGVfbW5ndChwbTIpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihwbTItPmRldiwgImZhaWxlZCB0byBkaXNhYmxlIgorCQkJCQkJInBtMnh4eCBhYyBjaGFyZ2VyXG4iKTsKKwkJCWdvdG8gZXJyb3Jfb2NjdXJlZDsKKwkJfQorCisJCWRldl9kYmcocG0yLT5kZXYsICJQTTIzMDE6ICIgIkRpc2FibGVkIEFDIGNoYXJnaW5nXG4iKTsKKwl9CisJcG93ZXJfc3VwcGx5X2NoYW5nZWQocG0yLT5hY19jaGcucHN5KTsKKworZXJyb3Jfb2NjdXJlZDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2VyX3dhdGNoZG9nX2tpY2soc3RydWN0IHV4NTAwX2NoYXJnZXIgKmNoYXJnZXIpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMjsKKworCWlmIChjaGFyZ2VyLT5wc3ktPmRlc2MtPnR5cGUgPT0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlMpCisJCXBtMiA9IHRvX3BtMnh4eF9jaGFyZ2VyX2FjX2RldmljZV9pbmZvKGNoYXJnZXIpOworCWVsc2UKKwkJcmV0dXJuIC1FTlhJTzsKKworCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfQkFUVF9XRF9LSUNLLCBXRF9USU1FUik7CisJaWYgKHJldCkKKwkJZGV2X2VycihwbTItPmRldiwgIkZhaWxlZCB0byBraWNrIFdEIVxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBwbTJ4eHhfY2hhcmdlcl9hY193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMiA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIsIGFjX3dvcmspOworCisKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZChwbTItPmFjX2NoZy5wc3kpOworCXN5c2ZzX25vdGlmeSgmcG0yLT5hY19jaGcucHN5LT5kZXYua29iaiwgTlVMTCwgInByZXNlbnQiKTsKK307CisKK3N0YXRpYyB2b2lkIHBtMnh4eF9jaGFyZ2VyX2NoZWNrX2h3X2ZhaWx1cmVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJdTggcmVnX3ZhbHVlOworCisJc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIgPSBjb250YWluZXJfb2Yod29yaywKKwkJc3RydWN0IHBtMnh4eF9jaGFyZ2VyLCBjaGVja19od19mYWlsdXJlX3dvcmsud29yayk7CisKKwlpZiAocG0yLT5mbGFncy5vdnYpIHsKKwkJcG0yeHh4X3JlZ19yZWFkKHBtMiwgUE0yWFhYX1NSQ0VfUkVHX0lOVDQsICZyZWdfdmFsdWUpOworCisJCWlmICghKHJlZ192YWx1ZSAmIChQTTJYWFhfSU5UNF9TX0lUVlBXUjFPVlYgfAorCQkJCQlQTTJYWFhfSU5UNF9TX0lUVlBXUjJPVlYpKSkgeworCQkJcG0yLT5mbGFncy5vdnYgPSBmYWxzZTsKKwkJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKHBtMi0+YWNfY2hnLnBzeSk7CisJCX0KKwl9CisKKwkvKiBJZiB3ZSBzdGlsbCBoYXZlIGEgZmFpbHVyZSwgc2NoZWR1bGUgYSBuZXcgY2hlY2sgKi8KKwlpZiAocG0yLT5mbGFncy5vdnYpIHsKKwkJcXVldWVfZGVsYXllZF93b3JrKHBtMi0+Y2hhcmdlcl93cSwKKwkJCSZwbTItPmNoZWNrX2h3X2ZhaWx1cmVfd29yaywgcm91bmRfamlmZmllcyhIWikpOworCX0KK30KKworc3RhdGljIHZvaWQgcG0yeHh4X2NoYXJnZXJfY2hlY2tfbWFpbl90aGVybWFsX3Byb3Rfd29yaygKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJaW50IHJldDsKKwl1OCB2YWw7CisKKwlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIsCisJCQkJCWNoZWNrX21haW5fdGhlcm1hbF9wcm90X3dvcmspOworCisJLyogQ2hlY2sgaWYgZGllIHRlbXAgd2FybmluZyBpcyBzdGlsbCBhY3RpdmUgKi8KKwlyZXQgPSBwbTJ4eHhfcmVnX3JlYWQocG0yLCBQTTJYWFhfU1JDRV9SRUdfSU5UNSwgJnZhbCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihwbTItPmRldiwgIiVzIHBtMnh4eCByZWFkIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCWlmICh2YWwgJiAoUE0yWFhYX0lOVDVfU19JVFRIRVJNQUxXQVJOSU5HUklTRQorCQkJfCBQTTJYWFhfSU5UNV9TX0lUVEhFUk1BTFNIVVRET1dOUklTRSkpCisJCXBtMi0+ZmxhZ3MubWFpbl90aGVybWFsX3Byb3QgPSB0cnVlOworCWVsc2UgaWYgKHZhbCAmIChQTTJYWFhfSU5UNV9TX0lUVEhFUk1BTFdBUk5JTkdGQUxMCisJCQkJfCBQTTJYWFhfSU5UNV9TX0lUVEhFUk1BTFNIVVRET1dORkFMTCkpCisJCXBtMi0+ZmxhZ3MubWFpbl90aGVybWFsX3Byb3QgPSBmYWxzZTsKKworCXBvd2VyX3N1cHBseV9jaGFuZ2VkKHBtMi0+YWNfY2hnLnBzeSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcG0yeHh4X2ludGVycnVwdHMgcG0yeHh4X2ludCA9IHsKKwkuaGFuZGxlclswXSA9IHBtMl9pbnRfcmVnMCwKKwkuaGFuZGxlclsxXSA9IHBtMl9pbnRfcmVnMSwKKwkuaGFuZGxlclsyXSA9IHBtMl9pbnRfcmVnMiwKKwkuaGFuZGxlclszXSA9IHBtMl9pbnRfcmVnMywKKwkuaGFuZGxlcls0XSA9IHBtMl9pbnRfcmVnNCwKKwkuaGFuZGxlcls1XSA9IHBtMl9pbnRfcmVnNSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcG0yeHh4X2lycSBwbTJ4eHhfY2hhcmdlcl9pcnFbXSA9IHsKKwl7IlBNMlhYWF9JUlFfSU5UIiwgcG0yeHh4X2lycV9pbnR9LAorfTsKKworc3RhdGljIGludCBfX21heWJlX3VudXNlZCBwbTJ4eHhfd2FsbF9jaGFyZ2VyX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmkyY19jbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTI7CisKKwlwbTIgPSAgKHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqKWkyY19nZXRfY2xpZW50ZGF0YShpMmNfY2xpZW50KTsKKwlzZXRfbHBuX3BpbihwbTIpOworCisJLyogSWYgd2Ugc3RpbGwgaGF2ZSBhIEhXIGZhaWx1cmUsIHNjaGVkdWxlIGEgbmV3IGNoZWNrICovCisJaWYgKHBtMi0+ZmxhZ3Mub3Z2KQorCQlxdWV1ZV9kZWxheWVkX3dvcmsocG0yLT5jaGFyZ2VyX3dxLAorCQkJCSZwbTItPmNoZWNrX2h3X2ZhaWx1cmVfd29yaywgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX21heWJlX3VudXNlZCBwbTJ4eHhfd2FsbF9jaGFyZ2VyX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICppMmNfY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yOworCisJcG0yID0gIChzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKilpMmNfZ2V0X2NsaWVudGRhdGEoaTJjX2NsaWVudCk7CisJY2xlYXJfbHBuX3BpbihwbTIpOworCisJLyogQ2FuY2VsIGFueSBwZW5kaW5nIEhXIGZhaWx1cmUgY2hlY2sgKi8KKwlpZiAoZGVsYXllZF93b3JrX3BlbmRpbmcoJnBtMi0+Y2hlY2tfaHdfZmFpbHVyZV93b3JrKSkKKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcG0yLT5jaGVja19od19mYWlsdXJlX3dvcmspOworCisJZmx1c2hfd29yaygmcG0yLT5hY193b3JrKTsKKwlmbHVzaF93b3JrKCZwbTItPmNoZWNrX21haW5fdGhlcm1hbF9wcm90X3dvcmspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgcG0yeHh4X3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKnBtMnh4eF9pMmNfY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yOworCisJcG0yID0gKHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqKWkyY19nZXRfY2xpZW50ZGF0YShwbTJ4eHhfaTJjX2NsaWVudCk7CisJY2xlYXJfbHBuX3BpbihwbTIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgcG0yeHh4X3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqcG0yeHh4X2kyY19jbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTI7CisKKwlwbTIgPSAoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICopaTJjX2dldF9jbGllbnRkYXRhKHBtMnh4eF9pMmNfY2xpZW50KTsKKworCWlmIChncGlvX2lzX3ZhbGlkKHBtMi0+bHBuX3BpbikgJiYgZ3Bpb19nZXRfdmFsdWUocG0yLT5scG5fcGluKSA9PSAwKQorCQlzZXRfbHBuX3BpbihwbTIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBwbTJ4eHhfcG1fb3BzIF9fbWF5YmVfdW51c2VkID0geworCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKHBtMnh4eF93YWxsX2NoYXJnZXJfc3VzcGVuZCwKKwkJcG0yeHh4X3dhbGxfY2hhcmdlcl9yZXN1bWUpCisJU0VUX1JVTlRJTUVfUE1fT1BTKHBtMnh4eF9ydW50aW1lX3N1c3BlbmQsIHBtMnh4eF9ydW50aW1lX3Jlc3VtZSwgTlVMTCkKK307CisKK3N0YXRpYyBpbnQgcG0yeHh4X3dhbGxfY2hhcmdlcl9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjX2NsaWVudCwKKwkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBwbTJ4eHhfcGxhdGZvcm1fZGF0YSAqcGxfZGF0YSA9IGkyY19jbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKKwlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMjsKKwlpbnQgcmV0ID0gMDsKKwl1OCB2YWw7CisJaW50IGk7CisKKwlpZiAoIXBsX2RhdGEpIHsKKwkJZGV2X2VycigmaTJjX2NsaWVudC0+ZGV2LCAiTm8gcGxhdGZvcm0gZGF0YSBzdXBwbGllZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBtMiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbTJ4eHhfY2hhcmdlciksIEdGUF9LRVJORUwpOworCWlmICghcG0yKSB7CisJCWRldl9lcnIoJmkyY19jbGllbnQtPmRldiwgInBtMnh4eF9jaGFyZ2VyIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogZ2V0IHBhcmVudCBkYXRhICovCisJcG0yLT5kZXYgPSAmaTJjX2NsaWVudC0+ZGV2OworCisJcG0yLT5wbTJfaW50ID0gJnBtMnh4eF9pbnQ7CisKKwkvKiBnZXQgY2hhcmdlciBzcGNpZmljIHBsYXRmb3JtIGRhdGEgKi8KKwlpZiAoIXBsX2RhdGEtPndhbGxfY2hhcmdlcikgeworCQlkZXZfZXJyKHBtMi0+ZGV2LCAibm8gY2hhcmdlciBwbGF0Zm9ybSBkYXRhIHN1cHBsaWVkXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmcmVlX2RldmljZV9pbmZvOworCX0KKworCXBtMi0+cGRhdGEgPSBwbF9kYXRhLT53YWxsX2NoYXJnZXI7CisKKwkvKiBnZXQgYmF0dGVyeSBzcGVjaWZpYyBwbGF0Zm9ybSBkYXRhICovCisJaWYgKCFwbF9kYXRhLT5iYXR0ZXJ5KSB7CisJCWRldl9lcnIocG0yLT5kZXYsICJubyBiYXR0ZXJ5IHBsYXRmb3JtIGRhdGEgc3VwcGxpZWRcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZyZWVfZGV2aWNlX2luZm87CisJfQorCisJcG0yLT5iYXQgPSBwbF9kYXRhLT5iYXR0ZXJ5OworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShpMmNfY2xpZW50LT5hZGFwdGVyLAorCQkJSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIHwKKwkJCUkyQ19GVU5DX1NNQlVTX1JFQURfV09SRF9EQVRBKSkgeworCQlyZXQgPSAtRU5PREVWOworCQlkZXZfaW5mbyhwbTItPmRldiwgInBtMjMwMSBpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eSBmYWlsZWRcbiIpOworCQlnb3RvIGZyZWVfZGV2aWNlX2luZm87CisJfQorCisJcG0yLT5jb25maWcucG0yeHh4X2kyYyA9IGkyY19jbGllbnQ7CisJcG0yLT5jb25maWcucG0yeHh4X2lkID0gKHN0cnVjdCBpMmNfZGV2aWNlX2lkICopIGlkOworCWkyY19zZXRfY2xpZW50ZGF0YShpMmNfY2xpZW50LCBwbTIpOworCisJLyogQUMgc3VwcGx5ICovCisJLyogcG93ZXJfc3VwcGx5IGJhc2UgY2xhc3MgKi8KKwlwbTItPmFjX2NoZ19kZXNjLm5hbWUgPSBwbTItPnBkYXRhLT5sYWJlbDsKKwlwbTItPmFjX2NoZ19kZXNjLnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUzsKKwlwbTItPmFjX2NoZ19kZXNjLnByb3BlcnRpZXMgPSBwbTJ4eHhfY2hhcmdlcl9hY19wcm9wczsKKwlwbTItPmFjX2NoZ19kZXNjLm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShwbTJ4eHhfY2hhcmdlcl9hY19wcm9wcyk7CisJcG0yLT5hY19jaGdfZGVzYy5nZXRfcHJvcGVydHkgPSBwbTJ4eHhfY2hhcmdlcl9hY19nZXRfcHJvcGVydHk7CisKKwlwc3lfY2ZnLnN1cHBsaWVkX3RvID0gcG0yLT5wZGF0YS0+c3VwcGxpZWRfdG87CisJcHN5X2NmZy5udW1fc3VwcGxpY2FudHMgPSBwbTItPnBkYXRhLT5udW1fc3VwcGxpY2FudHM7CisJLyogcG0yeHh4X2NoYXJnZXIgc3ViLWNsYXNzICovCisJcG0yLT5hY19jaGcub3BzLmVuYWJsZSA9ICZwbTJ4eHhfY2hhcmdlcl9hY19lbjsKKwlwbTItPmFjX2NoZy5vcHMua2lja193ZCA9ICZwbTJ4eHhfY2hhcmdlcl93YXRjaGRvZ19raWNrOworCXBtMi0+YWNfY2hnLm9wcy51cGRhdGVfY3VyciA9ICZwbTJ4eHhfY2hhcmdlcl91cGRhdGVfY2hhcmdlcl9jdXJyZW50OworCXBtMi0+YWNfY2hnLm1heF9vdXRfdm9sdCA9IHBtMnh4eF9jaGFyZ2VyX3ZvbHRhZ2VfbWFwWworCQlBUlJBWV9TSVpFKHBtMnh4eF9jaGFyZ2VyX3ZvbHRhZ2VfbWFwKSAtIDFdOworCXBtMi0+YWNfY2hnLm1heF9vdXRfY3VyciA9IHBtMnh4eF9jaGFyZ2VyX2N1cnJlbnRfbWFwWworCQlBUlJBWV9TSVpFKHBtMnh4eF9jaGFyZ2VyX2N1cnJlbnRfbWFwKSAtIDFdOworCXBtMi0+YWNfY2hnLndkdF9yZWZyZXNoID0gV0RfS0lDS19JTlRFUlZBTDsKKwlwbTItPmFjX2NoZy5lbmFibGVkID0gdHJ1ZTsKKwlwbTItPmFjX2NoZy5leHRlcm5hbCA9IHRydWU7CisKKwkvKiBDcmVhdGUgYSB3b3JrIHF1ZXVlIGZvciB0aGUgY2hhcmdlciAqLworCXBtMi0+Y2hhcmdlcl93cSA9IGFsbG9jX29yZGVyZWRfd29ya3F1ZXVlKCJwbTJ4eHhfY2hhcmdlcl93cSIsCisJCQkJCQkgIFdRX01FTV9SRUNMQUlNKTsKKwlpZiAocG0yLT5jaGFyZ2VyX3dxID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZGV2X2VycihwbTItPmRldiwgImZhaWxlZCB0byBjcmVhdGUgd29yayBxdWV1ZVxuIik7CisJCWdvdG8gZnJlZV9kZXZpY2VfaW5mbzsKKwl9CisKKwkvKiBJbml0IHdvcmsgZm9yIGNoYXJnZXIgZGV0ZWN0aW9uICovCisJSU5JVF9XT1JLKCZwbTItPmFjX3dvcmssIHBtMnh4eF9jaGFyZ2VyX2FjX3dvcmspOworCisJLyogSW5pdCB3b3JrIGZvciBjaGVja2luZyBIVyBzdGF0dXMgKi8KKwlJTklUX1dPUksoJnBtMi0+Y2hlY2tfbWFpbl90aGVybWFsX3Byb3Rfd29yaywKKwkJcG0yeHh4X2NoYXJnZXJfY2hlY2tfbWFpbl90aGVybWFsX3Byb3Rfd29yayk7CisKKwkvKiBJbml0IHdvcmsgZm9yIEhXIGZhaWx1cmUgY2hlY2sgKi8KKwlJTklUX0RFRkVSUkFCTEVfV09SSygmcG0yLT5jaGVja19od19mYWlsdXJlX3dvcmssCisJCXBtMnh4eF9jaGFyZ2VyX2NoZWNrX2h3X2ZhaWx1cmVfd29yayk7CisKKwkvKgorCSAqIFZERCBBREMgc3VwcGx5IG5lZWRzIHRvIGJlIGVuYWJsZWQgZnJvbSB0aGlzIGRyaXZlciB3aGVuIHRoZXJlCisJICogaXMgYSBjaGFyZ2VyIGNvbm5lY3RlZCB0byBhdm9pZCBlcnJvbmVvdXMgQlRFTVBfSElHSC9MT1cKKwkgKiBpbnRlcnJ1cHRzIGR1cmluZyBjaGFyZ2luZworCSAqLworCXBtMi0+cmVndSA9IHJlZ3VsYXRvcl9nZXQocG0yLT5kZXYsICJ2ZGRhZGMiKTsKKwlpZiAoSVNfRVJSKHBtMi0+cmVndSkpIHsKKwkJcmV0ID0gUFRSX0VSUihwbTItPnJlZ3UpOworCQlkZXZfZXJyKHBtMi0+ZGV2LCAiZmFpbGVkIHRvIGdldCB2ZGRhZGMgcmVndWxhdG9yXG4iKTsKKwkJZ290byBmcmVlX2NoYXJnZXJfd3E7CisJfQorCisJLyogUmVnaXN0ZXIgQUMgY2hhcmdlciBjbGFzcyAqLworCXBtMi0+YWNfY2hnLnBzeSA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcihwbTItPmRldiwgJnBtMi0+YWNfY2hnX2Rlc2MsCisJCQkJCQkmcHN5X2NmZyk7CisJaWYgKElTX0VSUihwbTItPmFjX2NoZy5wc3kpKSB7CisJCWRldl9lcnIocG0yLT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgQUMgY2hhcmdlclxuIik7CisJCXJldCA9IFBUUl9FUlIocG0yLT5hY19jaGcucHN5KTsKKwkJZ290byBmcmVlX3JlZ3VsYXRvcjsKKwl9CisKKwkvKiBSZWdpc3RlciBpbnRlcnJ1cHRzICovCisJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoZ3Bpb190b19pcnEocG0yLT5wZGF0YS0+Z3Bpb19pcnFfbnVtYmVyKSwKKwkJCQlOVUxMLAorCQkJCXBtMnh4eF9jaGFyZ2VyX2lycVswXS5pc3IsCisJCQkJcG0yLT5wZGF0YS0+aXJxX3R5cGUsCisJCQkJcG0yeHh4X2NoYXJnZXJfaXJxWzBdLm5hbWUsIHBtMik7CisKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihwbTItPmRldiwgImZhaWxlZCB0byByZXF1ZXN0ICVzIElSUSAlZDogJWRcbiIsCisJCXBtMnh4eF9jaGFyZ2VyX2lycVswXS5uYW1lLAorCQkJZ3Bpb190b19pcnEocG0yLT5wZGF0YS0+Z3Bpb19pcnFfbnVtYmVyKSwgcmV0KTsKKwkJZ290byB1bnJlZ2lzdGVyX3BtMnh4eF9jaGFyZ2VyOworCX0KKworCXJldCA9IHBtX3J1bnRpbWVfc2V0X2FjdGl2ZShwbTItPmRldik7CisJaWYgKHJldCkKKwkJZGV2X2VycihwbTItPmRldiwgInNldCBhY3RpdmUgRXJyb3JcbiIpOworCisJcG1fcnVudGltZV9lbmFibGUocG0yLT5kZXYpOworCXBtX3J1bnRpbWVfc2V0X2F1dG9zdXNwZW5kX2RlbGF5KHBtMi0+ZGV2LCBQTTJYWFhfQVVUT1NVU1BFTkRfREVMQVkpOworCXBtX3J1bnRpbWVfdXNlX2F1dG9zdXNwZW5kKHBtMi0+ZGV2KTsKKwlwbV9ydW50aW1lX3Jlc3VtZShwbTItPmRldik7CisKKwkvKiBwbSBpbnRlcnJ1cHQgY2FuIHdha2UgdXAgc3lzdGVtICovCisJcmV0ID0gZW5hYmxlX2lycV93YWtlKGdwaW9fdG9faXJxKHBtMi0+cGRhdGEtPmdwaW9faXJxX251bWJlcikpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihwbTItPmRldiwgImZhaWxlZCB0byBzZXQgaXJxIHdha2VcbiIpOworCQlnb3RvIHVucmVnaXN0ZXJfcG0yeHh4X2ludGVycnVwdDsKKwl9CisKKwltdXRleF9pbml0KCZwbTItPmxvY2spOworCisJaWYgKGdwaW9faXNfdmFsaWQocG0yLT5wZGF0YS0+bHBuX2dwaW8pKSB7CisJCS8qIGdldCBscG4gR1BJTyBmcm9tIHBsYXRmb3JtIGRhdGEgKi8KKwkJcG0yLT5scG5fcGluID0gcG0yLT5wZGF0YS0+bHBuX2dwaW87CisKKwkJLyoKKwkJICogQ2hhcmdlciBkZXRlY3Rpb24gbWVjaGFuaXNtIHJlcXVpcmVzIHB1bGxpbmcgdXAgdGhlIExQTiBwaW4KKwkJICogd2hpbGUgaTJjIGNvbW11bmljYXRpb24gaWYgQ2hhcmdlciBpcyBub3QgY29ubmVjdGVkCisJCSAqIExQTiBwaW4gb2YgUE0yMzAxIGlzIEdQSU82MCBvZiBBQjk1NDAKKwkJICovCisJCXJldCA9IGdwaW9fcmVxdWVzdChwbTItPmxwbl9waW4sICJwbTIzMDFfbHBtX2dwaW8iKTsKKworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihwbTItPmRldiwgInBtMjMwMV9scG1fZ3BpbyByZXF1ZXN0IGZhaWxlZFxuIik7CisJCQlnb3RvIGRpc2FibGVfcG0yX2lycV93YWtlOworCQl9CisJCXJldCA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChwbTItPmxwbl9waW4sIDApOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihwbTItPmRldiwgInBtMjMwMV9scG1fZ3BpbyBkaXJlY3Rpb24gZmFpbGVkXG4iKTsKKwkJCWdvdG8gZnJlZV9ncGlvOworCQl9CisJCXNldF9scG5fcGluKHBtMik7CisJfQorCisJLyogcmVhZCAgaW50ZXJydXB0IHJlZ2lzdGVycyAqLworCWZvciAoaSA9IDA7IGkgPCBQTTJYWFhfTlVNX0lOVF9SRUc7IGkrKykKKwkJcG0yeHh4X3JlZ19yZWFkKHBtMiwKKwkJCXBtMnh4eF9pbnRlcnJ1cHRfcmVnaXN0ZXJzW2ldLAorCQkJJnZhbCk7CisKKwlyZXQgPSBwbTJ4eHhfY2hhcmdlcl9kZXRlY3Rpb24ocG0yLCAmdmFsKTsKKworCWlmICgocmV0ID09IDApICYmIHZhbCkgeworCQlwbTItPmFjLmNoYXJnZXJfY29ubmVjdGVkID0gMTsKKwkJYWI4NTAwX292ZXJyaWRlX3R1cm5fb25fc3RhdCh+QUI4NTAwX1BPV19LRVlfMV9PTiwKKwkJCQkJICAgICBBQjg1MDBfTUFJTl9DSF9ERVQpOworCQlwbTItPmFjX2Nvbm4gPSB0cnVlOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChwbTItPmFjX2NoZy5wc3kpOworCQlzeXNmc19ub3RpZnkoJnBtMi0+YWNfY2hnLnBzeS0+ZGV2LmtvYmosIE5VTEwsICJwcmVzZW50Iik7CisJfQorCisJcmV0dXJuIDA7CisKK2ZyZWVfZ3BpbzoKKwlpZiAoZ3Bpb19pc192YWxpZChwbTItPmxwbl9waW4pKQorCQlncGlvX2ZyZWUocG0yLT5scG5fcGluKTsKK2Rpc2FibGVfcG0yX2lycV93YWtlOgorCWRpc2FibGVfaXJxX3dha2UoZ3Bpb190b19pcnEocG0yLT5wZGF0YS0+Z3Bpb19pcnFfbnVtYmVyKSk7Cit1bnJlZ2lzdGVyX3BtMnh4eF9pbnRlcnJ1cHQ6CisJLyogZGlzYWJsZSBpbnRlcnJ1cHQgKi8KKwlmcmVlX2lycShncGlvX3RvX2lycShwbTItPnBkYXRhLT5ncGlvX2lycV9udW1iZXIpLCBwbTIpOwordW5yZWdpc3Rlcl9wbTJ4eHhfY2hhcmdlcjoKKwkvKiB1bnJlZ2lzdGVyIHBvd2VyIHN1cHBseSAqLworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKHBtMi0+YWNfY2hnLnBzeSk7CitmcmVlX3JlZ3VsYXRvcjoKKwkvKiBkaXNhYmxlIHRoZSByZWd1bGF0b3IgKi8KKwlyZWd1bGF0b3JfcHV0KHBtMi0+cmVndSk7CitmcmVlX2NoYXJnZXJfd3E6CisJZGVzdHJveV93b3JrcXVldWUocG0yLT5jaGFyZ2VyX3dxKTsKK2ZyZWVfZGV2aWNlX2luZm86CisJa2ZyZWUocG0yKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcG0yeHh4X3dhbGxfY2hhcmdlcl9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmkyY19jbGllbnQpCit7CisJc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoaTJjX2NsaWVudCk7CisKKwkvKiBEaXNhYmxlIHBtX3J1bnRpbWUgKi8KKwlwbV9ydW50aW1lX2Rpc2FibGUocG0yLT5kZXYpOworCS8qIERpc2FibGUgQUMgY2hhcmdpbmcgKi8KKwlwbTJ4eHhfY2hhcmdlcl9hY19lbigmcG0yLT5hY19jaGcsIGZhbHNlLCAwLCAwKTsKKworCS8qIERpc2FibGUgd2FrZSBieSBwbSBpbnRlcnJ1cHQgKi8KKwlkaXNhYmxlX2lycV93YWtlKGdwaW9fdG9faXJxKHBtMi0+cGRhdGEtPmdwaW9faXJxX251bWJlcikpOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJZnJlZV9pcnEoZ3Bpb190b19pcnEocG0yLT5wZGF0YS0+Z3Bpb19pcnFfbnVtYmVyKSwgcG0yKTsKKworCS8qIERlbGV0ZSB0aGUgd29yayBxdWV1ZSAqLworCWRlc3Ryb3lfd29ya3F1ZXVlKHBtMi0+Y2hhcmdlcl93cSk7CisKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJLyogZGlzYWJsZSB0aGUgcmVndWxhdG9yICovCisJcmVndWxhdG9yX3B1dChwbTItPnJlZ3UpOworCisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIocG0yLT5hY19jaGcucHN5KTsKKworCWlmIChncGlvX2lzX3ZhbGlkKHBtMi0+bHBuX3BpbikpCisJCWdwaW9fZnJlZShwbTItPmxwbl9waW4pOworCisJa2ZyZWUocG0yKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgcG0yeHh4X2lkW10gPSB7CisJeyAicG0yMzAxIiwgMCB9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHBtMnh4eF9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBwbTJ4eHhfY2hhcmdlcl9kcml2ZXIgPSB7CisJLnByb2JlID0gcG0yeHh4X3dhbGxfY2hhcmdlcl9wcm9iZSwKKwkucmVtb3ZlID0gcG0yeHh4X3dhbGxfY2hhcmdlcl9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAicG0yeHh4LXdhbGxfY2hhcmdlciIsCisJCS5wbSA9IElTX0VOQUJMRUQoQ09ORklHX1BNKSA/ICZwbTJ4eHhfcG1fb3BzIDogTlVMTCwKKwl9LAorCS5pZF90YWJsZSA9IHBtMnh4eF9pZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBtMnh4eF9jaGFyZ2VyX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJnBtMnh4eF9jaGFyZ2VyX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwbTJ4eHhfY2hhcmdlcl9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJnBtMnh4eF9jaGFyZ2VyX2RyaXZlcik7Cit9CisKK2RldmljZV9pbml0Y2FsbF9zeW5jKHBtMnh4eF9jaGFyZ2VyX2luaXQpOworbW9kdWxlX2V4aXQocG0yeHh4X2NoYXJnZXJfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BVVRIT1IoIlJhamt1bWFyIGthc2lyYWphbiwgT2xpdmllciBMYXVuYXkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUE0yeHh4IGNoYXJnZXIgbWFuYWdlbWVudCBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvcG0yMzAxX2NoYXJnZXIuaCBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3BtMjMwMV9jaGFyZ2VyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvcG0yMzAxX2NoYXJnZXIuaApyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvcG0yMzAxX2NoYXJnZXIuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9wbXVfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvcG11X2JhdHRlcnkuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci9wbXVfYmF0dGVyeS5jCnJlbmFtZSB0byBkcml2ZXJzL3Bvd2VyL3N1cHBseS9wbXVfYmF0dGVyeS5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3Bvd2VyX3N1cHBseS5oIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvcG93ZXJfc3VwcGx5LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvcG93ZXJfc3VwcGx5LmgKcmVuYW1lIHRvIGRyaXZlcnMvcG93ZXIvc3VwcGx5L3Bvd2VyX3N1cHBseS5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3Bvd2VyX3N1cHBseV9jb3JlLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9wb3dlcl9zdXBwbHlfY29yZS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3Bvd2VyL3Bvd2VyX3N1cHBseV9jb3JlLmMKcmVuYW1lIHRvIGRyaXZlcnMvcG93ZXIvc3VwcGx5L3Bvd2VyX3N1cHBseV9jb3JlLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvcG93ZXJfc3VwcGx5X2xlZHMuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3Bvd2VyX3N1cHBseV9sZWRzLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvcG93ZXJfc3VwcGx5X2xlZHMuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvcG93ZXJfc3VwcGx5X2xlZHMuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9wb3dlcl9zdXBwbHlfc3lzZnMuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3Bvd2VyX3N1cHBseV9zeXNmcy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3Bvd2VyL3Bvd2VyX3N1cHBseV9zeXNmcy5jCnJlbmFtZSB0byBkcml2ZXJzL3Bvd2VyL3N1cHBseS9wb3dlcl9zdXBwbHlfc3lzZnMuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9xY29tX3NtYmIuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3Fjb21fc21iYi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3Bvd2VyL3Fjb21fc21iYi5jCnJlbmFtZSB0byBkcml2ZXJzL3Bvd2VyL3N1cHBseS9xY29tX3NtYmIuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9ydDUwMzNfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvcnQ1MDMzX2JhdHRlcnkuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci9ydDUwMzNfYmF0dGVyeS5jCnJlbmFtZSB0byBkcml2ZXJzL3Bvd2VyL3N1cHBseS9ydDUwMzNfYmF0dGVyeS5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3J0OTQ1NV9jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9ydDk0NTVfY2hhcmdlci5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3Bvd2VyL3J0OTQ1NV9jaGFyZ2VyLmMKcmVuYW1lIHRvIGRyaXZlcnMvcG93ZXIvc3VwcGx5L3J0OTQ1NV9jaGFyZ2VyLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvcng1MV9iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9yeDUxX2JhdHRlcnkuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci9yeDUxX2JhdHRlcnkuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvcng1MV9iYXR0ZXJ5LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvczNjX2FkY19iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9zM2NfYWRjX2JhdHRlcnkuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci9zM2NfYWRjX2JhdHRlcnkuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvczNjX2FkY19iYXR0ZXJ5LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3Nicy1iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9zYnMtYmF0dGVyeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYjJlYjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9zYnMtYmF0dGVyeS5jCkBAIC0wLDAgKzEsOTM0IEBACisvKgorICogR2FzIEdhdWdlIGRyaXZlciBmb3IgU0JTIENvbXBsaWFudCBCYXR0ZXJpZXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE5WSURJQSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorCisjaW5jbHVkZSA8bGludXgvcG93ZXIvc2JzLWJhdHRlcnkuaD4KKworZW51bSB7CisJUkVHX01BTlVGQUNUVVJFUl9EQVRBLAorCVJFR19URU1QRVJBVFVSRSwKKwlSRUdfVk9MVEFHRSwKKwlSRUdfQ1VSUkVOVCwKKwlSRUdfQ0FQQUNJVFksCisJUkVHX1RJTUVfVE9fRU1QVFksCisJUkVHX1RJTUVfVE9fRlVMTCwKKwlSRUdfU1RBVFVTLAorCVJFR19DQVBBQ0lUWV9MRVZFTCwKKwlSRUdfQ1lDTEVfQ09VTlQsCisJUkVHX1NFUklBTF9OVU1CRVIsCisJUkVHX1JFTUFJTklOR19DQVBBQ0lUWSwKKwlSRUdfUkVNQUlOSU5HX0NBUEFDSVRZX0NIQVJHRSwKKwlSRUdfRlVMTF9DSEFSR0VfQ0FQQUNJVFksCisJUkVHX0ZVTExfQ0hBUkdFX0NBUEFDSVRZX0NIQVJHRSwKKwlSRUdfREVTSUdOX0NBUEFDSVRZLAorCVJFR19ERVNJR05fQ0FQQUNJVFlfQ0hBUkdFLAorCVJFR19ERVNJR05fVk9MVEFHRV9NSU4sCisJUkVHX0RFU0lHTl9WT0xUQUdFX01BWCwKKwlSRUdfTUFOVUZBQ1RVUkVSLAorCVJFR19NT0RFTF9OQU1FLAorfTsKKworLyogQmF0dGVyeSBNb2RlIGRlZmluZXMgKi8KKyNkZWZpbmUgQkFUVEVSWV9NT0RFX09GRlNFVAkJMHgwMworI2RlZmluZSBCQVRURVJZX01PREVfTUFTSwkJMHg4MDAwCitlbnVtIHNic19iYXR0ZXJ5X21vZGUgeworCUJBVFRFUllfTU9ERV9BTVBTLAorCUJBVFRFUllfTU9ERV9XQVRUUworfTsKKworLyogbWFudWZhY3R1cmVyIGFjY2VzcyBkZWZpbmVzICovCisjZGVmaW5lIE1BTlVGQUNUVVJFUl9BQ0NFU1NfU1RBVFVTCTB4MDAwNgorI2RlZmluZSBNQU5VRkFDVFVSRVJfQUNDRVNTX1NMRUVQCTB4MDAxMQorCisvKiBiYXR0ZXJ5IHN0YXR1cyB2YWx1ZSBiaXRzICovCisjZGVmaW5lIEJBVFRFUllfSU5JVElBTElaRUQJCTB4ODAKKyNkZWZpbmUgQkFUVEVSWV9ESVNDSEFSR0lORwkJMHg0MAorI2RlZmluZSBCQVRURVJZX0ZVTExfQ0hBUkdFRAkJMHgyMAorI2RlZmluZSBCQVRURVJZX0ZVTExfRElTQ0hBUkdFRAkJMHgxMAorCisvKiBtaW5fdmFsdWUgYW5kIG1heF92YWx1ZSBhcmUgb25seSB2YWxpZCBmb3IgbnVtZXJpY2FsIGRhdGEgKi8KKyNkZWZpbmUgU0JTX0RBVEEoX3BzcCwgX2FkZHIsIF9taW5fdmFsdWUsIF9tYXhfdmFsdWUpIHsgXAorCS5wc3AgPSBfcHNwLCBcCisJLmFkZHIgPSBfYWRkciwgXAorCS5taW5fdmFsdWUgPSBfbWluX3ZhbHVlLCBcCisJLm1heF92YWx1ZSA9IF9tYXhfdmFsdWUsIFwKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjaGlwX2RhdGEgeworCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcDsKKwl1OCBhZGRyOworCWludCBtaW5fdmFsdWU7CisJaW50IG1heF92YWx1ZTsKK30gc2JzX2RhdGFbXSA9IHsKKwlbUkVHX01BTlVGQUNUVVJFUl9EQVRBXSA9CisJCVNCU19EQVRBKFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsIDB4MDAsIDAsIDY1NTM1KSwKKwlbUkVHX1RFTVBFUkFUVVJFXSA9CisJCVNCU19EQVRBKFBPV0VSX1NVUFBMWV9QUk9QX1RFTVAsIDB4MDgsIDAsIDY1NTM1KSwKKwlbUkVHX1ZPTFRBR0VdID0KKwkJU0JTX0RBVEEoUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1csIDB4MDksIDAsIDIwMDAwKSwKKwlbUkVHX0NVUlJFTlRdID0KKwkJU0JTX0RBVEEoUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1csIDB4MEEsIC0zMjc2OCwgMzI3NjcpLAorCVtSRUdfQ0FQQUNJVFldID0KKwkJU0JTX0RBVEEoUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFksIDB4MEQsIDAsIDEwMCksCisJW1JFR19SRU1BSU5JTkdfQ0FQQUNJVFldID0KKwkJU0JTX0RBVEEoUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX05PVywgMHgwRiwgMCwgNjU1MzUpLAorCVtSRUdfUkVNQUlOSU5HX0NBUEFDSVRZX0NIQVJHRV0gPQorCQlTQlNfREFUQShQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XLCAweDBGLCAwLCA2NTUzNSksCisJW1JFR19GVUxMX0NIQVJHRV9DQVBBQ0lUWV0gPQorCQlTQlNfREFUQShQT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfRlVMTCwgMHgxMCwgMCwgNjU1MzUpLAorCVtSRUdfRlVMTF9DSEFSR0VfQ0FQQUNJVFlfQ0hBUkdFXSA9CisJCVNCU19EQVRBKFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMLCAweDEwLCAwLCA2NTUzNSksCisJW1JFR19USU1FX1RPX0VNUFRZXSA9CisJCVNCU19EQVRBKFBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRU1QVFlfQVZHLCAweDEyLCAwLCA2NTUzNSksCisJW1JFR19USU1FX1RPX0ZVTExdID0KKwkJU0JTX0RBVEEoUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19GVUxMX0FWRywgMHgxMywgMCwgNjU1MzUpLAorCVtSRUdfU1RBVFVTXSA9CisJCVNCU19EQVRBKFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywgMHgxNiwgMCwgNjU1MzUpLAorCVtSRUdfQ0FQQUNJVFlfTEVWRUxdID0KKwkJU0JTX0RBVEEoUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFlfTEVWRUwsIDB4MTYsIDAsIDY1NTM1KSwKKwlbUkVHX0NZQ0xFX0NPVU5UXSA9CisJCVNCU19EQVRBKFBPV0VSX1NVUFBMWV9QUk9QX0NZQ0xFX0NPVU5ULCAweDE3LCAwLCA2NTUzNSksCisJW1JFR19ERVNJR05fQ0FQQUNJVFldID0KKwkJU0JTX0RBVEEoUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX0ZVTExfREVTSUdOLCAweDE4LCAwLCA2NTUzNSksCisJW1JFR19ERVNJR05fQ0FQQUNJVFlfQ0hBUkdFXSA9CisJCVNCU19EQVRBKFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMX0RFU0lHTiwgMHgxOCwgMCwgNjU1MzUpLAorCVtSRUdfREVTSUdOX1ZPTFRBR0VfTUlOXSA9CisJCVNCU19EQVRBKFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOX0RFU0lHTiwgMHgxOSwgMCwgNjU1MzUpLAorCVtSRUdfREVTSUdOX1ZPTFRBR0VfTUFYXSA9CisJCVNCU19EQVRBKFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYX0RFU0lHTiwgMHgxOSwgMCwgNjU1MzUpLAorCVtSRUdfU0VSSUFMX05VTUJFUl0gPQorCQlTQlNfREFUQShQT1dFUl9TVVBQTFlfUFJPUF9TRVJJQUxfTlVNQkVSLCAweDFDLCAwLCA2NTUzNSksCisJLyogUHJvcGVydGllcyBvZiB0eXBlIGBjb25zdCBjaGFyIConICovCisJW1JFR19NQU5VRkFDVFVSRVJdID0KKwkJU0JTX0RBVEEoUE9XRVJfU1VQUExZX1BST1BfTUFOVUZBQ1RVUkVSLCAweDIwLCAwLCA2NTUzNSksCisJW1JFR19NT0RFTF9OQU1FXSA9CisJCVNCU19EQVRBKFBPV0VSX1NVUFBMWV9QUk9QX01PREVMX05BTUUsIDB4MjEsIDAsIDY1NTM1KQorfTsKKworc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHNic19wcm9wZXJ0aWVzW10gPSB7CisJUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZX0xFVkVMLAorCVBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5ULAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1ksCisJUE9XRVJfU1VQUExZX1BST1BfQ1lDTEVfQ09VTlQsCisJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1csCisJUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1csCisJUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFksCisJUE9XRVJfU1VQUExZX1BST1BfVEVNUCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0VNUFRZX0FWRywKKwlQT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0ZVTExfQVZHLAorCVBPV0VSX1NVUFBMWV9QUk9QX1NFUklBTF9OVU1CRVIsCisJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU5fREVTSUdOLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYX0RFU0lHTiwKKwlQT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9GVUxMLAorCVBPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9GVUxMX0RFU0lHTiwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMX0RFU0lHTiwKKwkvKiBQcm9wZXJ0aWVzIG9mIHR5cGUgYGNvbnN0IGNoYXIgKicgKi8KKwlQT1dFUl9TVVBQTFlfUFJPUF9NQU5VRkFDVFVSRVIsCisJUE9XRVJfU1VQUExZX1BST1BfTU9ERUxfTkFNRQorfTsKKworc3RydWN0IHNic19pbmZvIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudAkJKmNsaWVudDsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5CQkqcG93ZXJfc3VwcGx5OworCWJvb2wJCQkJaXNfcHJlc2VudDsKKwlzdHJ1Y3QgZ3Bpb19kZXNjCQkqZ3Bpb19kZXRlY3Q7CisJYm9vbAkJCQllbmFibGVfZGV0ZWN0aW9uOworCWludAkJCQlsYXN0X3N0YXRlOworCWludAkJCQlwb2xsX3RpbWU7CisJdTMyCQkJCWkyY19yZXRyeV9jb3VudDsKKwl1MzIJCQkJcG9sbF9yZXRyeV9jb3VudDsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCQl3b3JrOworCWludAkJCQlpZ25vcmVfY2hhbmdlczsKK307CisKK3N0YXRpYyBjaGFyIG1vZGVsX25hbWVbSTJDX1NNQlVTX0JMT0NLX01BWCArIDFdOworc3RhdGljIGNoYXIgbWFudWZhY3R1cmVyW0kyQ19TTUJVU19CTE9DS19NQVggKyAxXTsKK3N0YXRpYyBib29sIGZvcmNlX2xvYWQ7CisKK3N0YXRpYyBpbnQgc2JzX3JlYWRfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGFkZHJlc3MpCit7CisJc3RydWN0IHNic19pbmZvICpjaGlwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJczMyIHJldCA9IDA7CisJaW50IHJldHJpZXMgPSAxOworCisJcmV0cmllcyA9IGNoaXAtPmkyY19yZXRyeV9jb3VudDsKKworCXdoaWxlIChyZXRyaWVzID4gMCkgeworCQlyZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCBhZGRyZXNzKTsKKwkJaWYgKHJldCA+PSAwKQorCQkJYnJlYWs7CisJCXJldHJpZXMtLTsKKwl9CisKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwKKwkJCSIlczogaTJjIHJlYWQgYXQgYWRkcmVzcyAweCV4IGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBhZGRyZXNzKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gbGUxNl90b19jcHUocmV0KTsKK30KKworc3RhdGljIGludCBzYnNfcmVhZF9zdHJpbmdfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBhZGRyZXNzLAorCQkJCWNoYXIgKnZhbHVlcykKK3sKKwlzdHJ1Y3Qgc2JzX2luZm8gKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzMzIgcmV0ID0gMCwgYmxvY2tfbGVuZ3RoID0gMDsKKwlpbnQgcmV0cmllc19sZW5ndGggPSAxLCByZXRyaWVzX2Jsb2NrID0gMTsKKwl1OCBibG9ja19idWZmZXJbSTJDX1NNQlVTX0JMT0NLX01BWCArIDFdOworCisJcmV0cmllc19sZW5ndGggPSBjaGlwLT5pMmNfcmV0cnlfY291bnQ7CisJcmV0cmllc19ibG9jayA9IGNoaXAtPmkyY19yZXRyeV9jb3VudDsKKworCS8qIEFkYXB0ZXIgbmVlZHMgdG8gc3VwcG9ydCB0aGVzZSB0d28gZnVuY3Rpb25zICovCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsCisJCQkJICAgICBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgfAorCQkJCSAgICAgSTJDX0ZVTkNfU01CVVNfSTJDX0JMT0NLKSl7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIEdldCB0aGUgbGVuZ3RoIG9mIGJsb2NrIGRhdGEgKi8KKwl3aGlsZSAocmV0cmllc19sZW5ndGggPiAwKSB7CisJCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIGFkZHJlc3MpOworCQlpZiAocmV0ID49IDApCisJCQlicmVhazsKKwkJcmV0cmllc19sZW5ndGgtLTsKKwl9CisKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwKKwkJCSIlczogaTJjIHJlYWQgYXQgYWRkcmVzcyAweCV4IGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fLCBhZGRyZXNzKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBibG9ja19sZW5ndGggZG9lcyBub3QgaW5jbHVkZSBOVUxMIHRlcm1pbmF0b3IgKi8KKwlibG9ja19sZW5ndGggPSByZXQ7CisJaWYgKGJsb2NrX2xlbmd0aCA+IEkyQ19TTUJVU19CTE9DS19NQVgpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkiJXM6IFJldHVybmVkIGJsb2NrX2xlbmd0aCBpcyBsb25nZXIgdGhhbiAweCV4XG4iLAorCQkJX19mdW5jX18sIEkyQ19TTUJVU19CTE9DS19NQVgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBHZXQgdGhlIGJsb2NrIGRhdGEgKi8KKwl3aGlsZSAocmV0cmllc19ibG9jayA+IDApIHsKKwkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoCisJCQkJY2xpZW50LCBhZGRyZXNzLAorCQkJCWJsb2NrX2xlbmd0aCArIDEsIGJsb2NrX2J1ZmZlcik7CisJCWlmIChyZXQgPj0gMCkKKwkJCWJyZWFrOworCQlyZXRyaWVzX2Jsb2NrLS07CisJfQorCisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsCisJCQkiJXM6IGkyYyByZWFkIGF0IGFkZHJlc3MgMHgleCBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgYWRkcmVzcyk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogYmxvY2tfYnVmZmVyWzBdID09IGJsb2NrX2xlbmd0aCAqLworCW1lbWNweSh2YWx1ZXMsIGJsb2NrX2J1ZmZlciArIDEsIGJsb2NrX2xlbmd0aCk7CisJdmFsdWVzW2Jsb2NrX2xlbmd0aF0gPSAnXDAnOworCisJcmV0dXJuIGxlMTZfdG9fY3B1KHJldCk7Cit9CisKK3N0YXRpYyBpbnQgc2JzX3dyaXRlX3dvcmRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBhZGRyZXNzLAorCXUxNiB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc2JzX2luZm8gKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzMzIgcmV0ID0gMDsKKwlpbnQgcmV0cmllcyA9IDE7CisKKwlyZXRyaWVzID0gY2hpcC0+aTJjX3JldHJ5X2NvdW50OworCisJd2hpbGUgKHJldHJpZXMgPiAwKSB7CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCBhZGRyZXNzLAorCQkJbGUxNl90b19jcHUodmFsdWUpKTsKKwkJaWYgKHJldCA+PSAwKQorCQkJYnJlYWs7CisJCXJldHJpZXMtLTsKKwl9CisKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZGJnKCZjbGllbnQtPmRldiwKKwkJCSIlczogaTJjIHdyaXRlIHRvIGFkZHJlc3MgMHgleCBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgYWRkcmVzcyk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2JzX2dldF9iYXR0ZXJ5X3ByZXNlbmNlX2FuZF9oZWFsdGgoCisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJczMyIHJldDsKKwlzdHJ1Y3Qgc2JzX2luZm8gKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWlmIChwc3AgPT0gUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCAmJiBjaGlwLT5ncGlvX2RldGVjdCkgeworCQlyZXQgPSBncGlvZF9nZXRfdmFsdWVfY2Fuc2xlZXAoY2hpcC0+Z3Bpb19kZXRlY3QpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXZhbC0+aW50dmFsID0gcmV0OworCQljaGlwLT5pc19wcmVzZW50ID0gdmFsLT5pbnR2YWw7CisJCXJldHVybiByZXQ7CisJfQorCisJLyoKKwkgKiBXcml0ZSB0byBNYW51ZmFjdHVyZXJBY2Nlc3Mgd2l0aCBNYW51ZmFjdHVyZXJBY2Nlc3MgY29tbWFuZAorCSAqIGFuZCB0aGVuIHJlYWQgdGhlIHN0YXR1cy4gRG8gbm90IGNoZWNrIGZvciBlcnJvciBvbiB0aGUgd3JpdGUKKwkgKiBzaW5jZSBub3QgYWxsIGJhdHRlcmllcyBpbXBsZW1lbnQgd3JpdGUgYWNjZXNzIHRvIHRoaXMgY29tbWFuZCwKKwkgKiB3aGlsZSBvdGhlcnMgbWFuZGF0ZSBpdC4KKwkgKi8KKwlzYnNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgc2JzX2RhdGFbUkVHX01BTlVGQUNUVVJFUl9EQVRBXS5hZGRyLAorCQkJICAgIE1BTlVGQUNUVVJFUl9BQ0NFU1NfU1RBVFVTKTsKKworCXJldCA9IHNic19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHNic19kYXRhW1JFR19NQU5VRkFDVFVSRVJfREFUQV0uYWRkcik7CisJaWYgKHJldCA8IDApIHsKKwkJaWYgKHBzcCA9PSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UKQorCQkJdmFsLT5pbnR2YWwgPSAwOyAvKiBiYXR0ZXJ5IHJlbW92ZWQgKi8KKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAocmV0IDwgc2JzX2RhdGFbUkVHX01BTlVGQUNUVVJFUl9EQVRBXS5taW5fdmFsdWUgfHwKKwkgICAgcmV0ID4gc2JzX2RhdGFbUkVHX01BTlVGQUNUVVJFUl9EQVRBXS5tYXhfdmFsdWUpIHsKKwkJdmFsLT5pbnR2YWwgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBNYXNrIHRoZSB1cHBlciBuaWJibGUgb2YgMm5kIGJ5dGUgYW5kCisJICogbG93ZXIgYnl0ZSBvZiByZXNwb25zZSB0aGVuCisJICogc2hpZnQgdGhlIHJlc3VsdCBieSA4IHRvIGdldCBzdGF0dXMqLworCXJldCAmPSAweDBGMDA7CisJcmV0ID4+PSA4OworCWlmIChwc3AgPT0gUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCkgeworCQlpZiAocmV0ID09IDB4MEYpCisJCQkvKiBiYXR0ZXJ5IHJlbW92ZWQgKi8KKwkJCXZhbC0+aW50dmFsID0gMDsKKwkJZWxzZQorCQkJdmFsLT5pbnR2YWwgPSAxOworCX0gZWxzZSBpZiAocHNwID09IFBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCkgeworCQlpZiAocmV0ID09IDB4MDkpCisJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfVU5TUEVDX0ZBSUxVUkU7CisJCWVsc2UgaWYgKHJldCA9PSAweDBCKQorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJIRUFUOworCQllbHNlIGlmIChyZXQgPT0gMHgwQykKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9ERUFEOworCQllbHNlCisJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfR09PRDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYnNfZ2V0X2JhdHRlcnlfcHJvcGVydHkoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwlpbnQgcmVnX29mZnNldCwgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJc3RydWN0IHNic19pbmZvICpjaGlwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJczMyIHJldDsKKworCXJldCA9IHNic19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHNic19kYXRhW3JlZ19vZmZzZXRdLmFkZHIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogcmV0dXJuZWQgdmFsdWVzIGFyZSAxNiBiaXQgKi8KKwlpZiAoc2JzX2RhdGFbcmVnX29mZnNldF0ubWluX3ZhbHVlIDwgMCkKKwkJcmV0ID0gKHMxNilyZXQ7CisKKwlpZiAocmV0ID49IHNic19kYXRhW3JlZ19vZmZzZXRdLm1pbl92YWx1ZSAmJgorCSAgICByZXQgPD0gc2JzX2RhdGFbcmVnX29mZnNldF0ubWF4X3ZhbHVlKSB7CisJCXZhbC0+aW50dmFsID0gcmV0OworCQlpZiAocHNwID09IFBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZX0xFVkVMKSB7CisJCQlpZiAoIShyZXQgJiBCQVRURVJZX0lOSVRJQUxJWkVEKSkKKwkJCQl2YWwtPmludHZhbCA9CisJCQkJCVBPV0VSX1NVUFBMWV9DQVBBQ0lUWV9MRVZFTF9VTktOT1dOOworCQkJZWxzZSBpZiAocmV0ICYgQkFUVEVSWV9GVUxMX0NIQVJHRUQpCisJCQkJdmFsLT5pbnR2YWwgPQorCQkJCQlQT1dFUl9TVVBQTFlfQ0FQQUNJVFlfTEVWRUxfRlVMTDsKKwkJCWVsc2UgaWYgKHJldCAmIEJBVFRFUllfRlVMTF9ESVNDSEFSR0VEKQorCQkJCXZhbC0+aW50dmFsID0KKwkJCQkJUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX0NSSVRJQ0FMOworCQkJZWxzZQorCQkJCXZhbC0+aW50dmFsID0KKwkJCQkJUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX05PUk1BTDsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKHBzcCAhPSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMpIHsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKHJldCAmIEJBVFRFUllfRlVMTF9DSEFSR0VEKQorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0ZVTEw7CisJCWVsc2UgaWYgKHJldCAmIEJBVFRFUllfRElTQ0hBUkdJTkcpCisJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkc7CisJCWVsc2UKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKKworCQlpZiAoY2hpcC0+cG9sbF90aW1lID09IDApCisJCQljaGlwLT5sYXN0X3N0YXRlID0gdmFsLT5pbnR2YWw7CisJCWVsc2UgaWYgKGNoaXAtPmxhc3Rfc3RhdGUgIT0gdmFsLT5pbnR2YWwpIHsKKwkJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmY2hpcC0+d29yayk7CisJCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChjaGlwLT5wb3dlcl9zdXBwbHkpOworCQkJY2hpcC0+cG9sbF90aW1lID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChwc3AgPT0gUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTKQorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047CisJCWVsc2UKKwkJCXZhbC0+aW50dmFsID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYnNfZ2V0X2JhdHRlcnlfc3RyaW5nX3Byb3BlcnR5KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJaW50IHJlZ19vZmZzZXQsIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwgY2hhciAqdmFsKQoreworCXMzMiByZXQ7CisKKwlyZXQgPSBzYnNfcmVhZF9zdHJpbmdfZGF0YShjbGllbnQsIHNic19kYXRhW3JlZ19vZmZzZXRdLmFkZHIsIHZhbCk7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCAgc2JzX3VuaXRfYWRqdXN0bWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKyNkZWZpbmUgQkFTRV9VTklUX0NPTlZFUlNJT04JCTEwMDAKKyNkZWZpbmUgQkFUVEVSWV9NT0RFX0NBUF9NVUxUX1dBVFQJKDEwICogQkFTRV9VTklUX0NPTlZFUlNJT04pCisjZGVmaW5lIFRJTUVfVU5JVF9DT05WRVJTSU9OCQk2MAorI2RlZmluZSBURU1QX0tFTFZJTl9UT19DRUxTSVVTCQkyNzMxCisJc3dpdGNoIChwc3ApIHsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9OT1c6CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfRlVMTDoKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9GVUxMX0RFU0lHTjoKKwkJLyogc2JzIHByb3ZpZGVzIGVuZXJneSBpbiB1bml0cyBvZiAxMG1XaC4KKwkJICogQ29udmVydCB0byDCtVdoCisJCSAqLworCQl2YWwtPmludHZhbCAqPSBCQVRURVJZX01PREVfQ0FQX01VTFRfV0FUVDsKKwkJYnJlYWs7CisKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU5fREVTSUdOOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NQVhfREVTSUdOOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1c6CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTEw6CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTF9ERVNJR046CisJCXZhbC0+aW50dmFsICo9IEJBU0VfVU5JVF9DT05WRVJTSU9OOworCQlicmVhazsKKworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUDoKKwkJLyogc2JzIHByb3ZpZGVzIGJhdHRlcnkgdGVtcGVyYXR1cmUgaW4gMC4xSworCQkgKiBzbyBjb252ZXJ0IGl0IHRvIDAuMcKwQworCQkgKi8KKwkJdmFsLT5pbnR2YWwgLT0gVEVNUF9LRUxWSU5fVE9fQ0VMU0lVUzsKKwkJYnJlYWs7CisKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRU1QVFlfQVZHOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19GVUxMX0FWRzoKKwkJLyogc2JzIHByb3ZpZGVzIHRpbWUgdG8gZW1wdHkgYW5kIHRpbWUgdG8gZnVsbCBpbiBtaW51dGVzLgorCQkgKiBDb252ZXJ0IHRvIHNlY29uZHMKKwkJICovCisJCXZhbC0+aW50dmFsICo9IFRJTUVfVU5JVF9DT05WRVJTSU9OOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LAorCQkJIiVzOiBubyBuZWVkIGZvciB1bml0IGNvbnZlcnNpb24gJWRcbiIsIF9fZnVuY19fLCBwc3ApOworCX0KK30KKworc3RhdGljIGVudW0gc2JzX2JhdHRlcnlfbW9kZSBzYnNfc2V0X2JhdHRlcnlfbW9kZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCWVudW0gc2JzX2JhdHRlcnlfbW9kZSBtb2RlKQoreworCWludCByZXQsIG9yaWdpbmFsX3ZhbDsKKworCW9yaWdpbmFsX3ZhbCA9IHNic19yZWFkX3dvcmRfZGF0YShjbGllbnQsIEJBVFRFUllfTU9ERV9PRkZTRVQpOworCWlmIChvcmlnaW5hbF92YWwgPCAwKQorCQlyZXR1cm4gb3JpZ2luYWxfdmFsOworCisJaWYgKChvcmlnaW5hbF92YWwgJiBCQVRURVJZX01PREVfTUFTSykgPT0gbW9kZSkKKwkJcmV0dXJuIG1vZGU7CisKKwlpZiAobW9kZSA9PSBCQVRURVJZX01PREVfQU1QUykKKwkJcmV0ID0gb3JpZ2luYWxfdmFsICYgfkJBVFRFUllfTU9ERV9NQVNLOworCWVsc2UKKwkJcmV0ID0gb3JpZ2luYWxfdmFsIHwgQkFUVEVSWV9NT0RFX01BU0s7CisKKwlyZXQgPSBzYnNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgQkFUVEVSWV9NT0RFX09GRlNFVCwgcmV0KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBvcmlnaW5hbF92YWwgJiBCQVRURVJZX01PREVfTUFTSzsKK30KKworc3RhdGljIGludCBzYnNfZ2V0X2JhdHRlcnlfY2FwYWNpdHkoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwlpbnQgcmVnX29mZnNldCwgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJczMyIHJldDsKKwllbnVtIHNic19iYXR0ZXJ5X21vZGUgbW9kZSA9IEJBVFRFUllfTU9ERV9XQVRUUzsKKworCWlmIChwb3dlcl9zdXBwbHlfaXNfYW1wX3Byb3BlcnR5KHBzcCkpCisJCW1vZGUgPSBCQVRURVJZX01PREVfQU1QUzsKKworCW1vZGUgPSBzYnNfc2V0X2JhdHRlcnlfbW9kZShjbGllbnQsIG1vZGUpOworCWlmIChtb2RlIDwgMCkKKwkJcmV0dXJuIG1vZGU7CisKKwlyZXQgPSBzYnNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCBzYnNfZGF0YVtyZWdfb2Zmc2V0XS5hZGRyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChwc3AgPT0gUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFkpIHsKKwkJLyogc2JzIHNwZWMgc2F5cyB0aGF0IHRoaXMgY2FuIGJlID4xMDAgJQorCQkqIGV2ZW4gaWYgbWF4IHZhbHVlIGlzIDEwMCAlICovCisJCXZhbC0+aW50dmFsID0gbWluKHJldCwgMTAwKTsKKwl9IGVsc2UKKwkJdmFsLT5pbnR2YWwgPSByZXQ7CisKKwlyZXQgPSBzYnNfc2V0X2JhdHRlcnlfbW9kZShjbGllbnQsIG1vZGUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyIHNic19zZXJpYWxbNV07CitzdGF0aWMgaW50IHNic19nZXRfYmF0dGVyeV9zZXJpYWxfbnVtYmVyKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gc2JzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgc2JzX2RhdGFbUkVHX1NFUklBTF9OVU1CRVJdLmFkZHIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gc3ByaW50ZihzYnNfc2VyaWFsLCAiJTA0eCIsIHJldCk7CisJdmFsLT5zdHJ2YWwgPSBzYnNfc2VyaWFsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2JzX2dldF9wcm9wZXJ0eV9pbmRleChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCkKK3sKKwlpbnQgY291bnQ7CisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgQVJSQVlfU0laRShzYnNfZGF0YSk7IGNvdW50KyspCisJCWlmIChwc3AgPT0gc2JzX2RhdGFbY291bnRdLnBzcCkKKwkJCXJldHVybiBjb3VudDsKKworCWRldl93YXJuKCZjbGllbnQtPmRldiwKKwkJIiVzOiBJbnZhbGlkIFByb3BlcnR5IC0gJWRcbiIsIF9fZnVuY19fLCBwc3ApOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgc2JzX2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNic19pbmZvICpjaGlwID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKKworCXN3aXRjaCAocHNwKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfSEVBTFRIOgorCQlyZXQgPSBzYnNfZ2V0X2JhdHRlcnlfcHJlc2VuY2VfYW5kX2hlYWx0aChjbGllbnQsIHBzcCwgdmFsKTsKKwkJaWYgKHBzcCA9PSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZOgorCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9URUNITk9MT0dZX0xJT047CisJCWdvdG8gZG9uZTsgLyogZG9uJ3QgdHJpZ2dlciBwb3dlcl9zdXBwbHlfY2hhbmdlZCgpISAqLworCisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfTk9XOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX0ZVTEw6CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfRlVMTF9ERVNJR046CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTEw6CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTF9ERVNJR046CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWToKKwkJcmV0ID0gc2JzX2dldF9wcm9wZXJ0eV9pbmRleChjbGllbnQsIHBzcCk7CisJCWlmIChyZXQgPCAwKQorCQkJYnJlYWs7CisKKwkJcmV0ID0gc2JzX2dldF9iYXR0ZXJ5X2NhcGFjaXR5KGNsaWVudCwgcmV0LCBwc3AsIHZhbCk7CisJCWJyZWFrOworCisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TRVJJQUxfTlVNQkVSOgorCQlyZXQgPSBzYnNfZ2V0X2JhdHRlcnlfc2VyaWFsX251bWJlcihjbGllbnQsIHZhbCk7CisJCWJyZWFrOworCisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWV9MRVZFTDoKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NZQ0xFX0NPVU5UOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c6CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVzoKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVA6CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0VNUFRZX0FWRzoKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRlVMTF9BVkc6CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTl9ERVNJR046CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWF9ERVNJR046CisJCXJldCA9IHNic19nZXRfcHJvcGVydHlfaW5kZXgoY2xpZW50LCBwc3ApOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCisJCXJldCA9IHNic19nZXRfYmF0dGVyeV9wcm9wZXJ0eShjbGllbnQsIHJldCwgcHNwLCB2YWwpOworCQlicmVhazsKKworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfTU9ERUxfTkFNRToKKwkJcmV0ID0gc2JzX2dldF9wcm9wZXJ0eV9pbmRleChjbGllbnQsIHBzcCk7CisJCWlmIChyZXQgPCAwKQorCQkJYnJlYWs7CisKKwkJcmV0ID0gc2JzX2dldF9iYXR0ZXJ5X3N0cmluZ19wcm9wZXJ0eShjbGllbnQsIHJldCwgcHNwLAorCQkJCQkJICAgICAgbW9kZWxfbmFtZSk7CisJCXZhbC0+c3RydmFsID0gbW9kZWxfbmFtZTsKKwkJYnJlYWs7CisKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUjoKKwkJcmV0ID0gc2JzX2dldF9wcm9wZXJ0eV9pbmRleChjbGllbnQsIHBzcCk7CisJCWlmIChyZXQgPCAwKQorCQkJYnJlYWs7CisKKwkJcmV0ID0gc2JzX2dldF9iYXR0ZXJ5X3N0cmluZ19wcm9wZXJ0eShjbGllbnQsIHJldCwgcHNwLAorCQkJCQkJICAgICAgbWFudWZhY3R1cmVyKTsKKwkJdmFsLT5zdHJ2YWwgPSBtYW51ZmFjdHVyZXI7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkiJXM6IElOVkFMSUQgcHJvcGVydHlcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFjaGlwLT5lbmFibGVfZGV0ZWN0aW9uKQorCQlnb3RvIGRvbmU7CisKKwlpZiAoIWNoaXAtPmdwaW9fZGV0ZWN0ICYmCisJCWNoaXAtPmlzX3ByZXNlbnQgIT0gKHJldCA+PSAwKSkgeworCQljaGlwLT5pc19wcmVzZW50ID0gKHJldCA+PSAwKTsKKwkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoY2hpcC0+cG93ZXJfc3VwcGx5KTsKKwl9CisKK2RvbmU6CisJaWYgKCFyZXQpIHsKKwkJLyogQ29udmVydCB1bml0cyB0byBtYXRjaCByZXF1aXJlbWVudHMgZm9yIHBvd2VyIHN1cHBseSBjbGFzcyAqLworCQlzYnNfdW5pdF9hZGp1c3RtZW50KGNsaWVudCwgcHNwLCB2YWwpOworCX0KKworCWRldl9kYmcoJmNsaWVudC0+ZGV2LAorCQkiJXM6IHByb3BlcnR5ID0gJWQsIHZhbHVlID0gJXhcbiIsIF9fZnVuY19fLCBwc3AsIHZhbC0+aW50dmFsKTsKKworCWlmIChyZXQgJiYgY2hpcC0+aXNfcHJlc2VudCkKKwkJcmV0dXJuIHJldDsKKworCS8qIGJhdHRlcnkgbm90IHByZXNlbnQsIHNvIHJldHVybiBOT0RBVEEgZm9yIHByb3BlcnRpZXMgKi8KKwlpZiAocmV0KQorCQlyZXR1cm4gLUVOT0RBVEE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IHNic19pcnEoaW50IGlycSwgdm9pZCAqZGV2aWQpCit7CisJc3RydWN0IHNic19pbmZvICpjaGlwID0gZGV2aWQ7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0dGVyeSA9IGNoaXAtPnBvd2VyX3N1cHBseTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ3Bpb2RfZ2V0X3ZhbHVlX2NhbnNsZWVwKGNoaXAtPmdwaW9fZGV0ZWN0KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwljaGlwLT5pc19wcmVzZW50ID0gcmV0OworCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGJhdHRlcnkpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBzYnNfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kpCit7CisJc3RydWN0IHNic19pbmZvICpjaGlwID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CisKKwlpZiAoY2hpcC0+aWdub3JlX2NoYW5nZXMgPiAwKSB7CisJCWNoaXAtPmlnbm9yZV9jaGFuZ2VzLS07CisJCXJldHVybjsKKwl9CisKKwkvKiBjYW5jZWwgb3V0c3RhbmRpbmcgd29yayAqLworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmY2hpcC0+d29yayk7CisKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNoaXAtPndvcmssIEhaKTsKKwljaGlwLT5wb2xsX3RpbWUgPSBjaGlwLT5wb2xsX3JldHJ5X2NvdW50OworfQorCitzdGF0aWMgdm9pZCBzYnNfZGVsYXllZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgc2JzX2luZm8gKmNoaXA7CisJczMyIHJldDsKKworCWNoaXAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHNic19pbmZvLCB3b3JrLndvcmspOworCisJcmV0ID0gc2JzX3JlYWRfd29yZF9kYXRhKGNoaXAtPmNsaWVudCwgc2JzX2RhdGFbUkVHX1NUQVRVU10uYWRkcik7CisJLyogaWYgdGhlIHJlYWQgZmFpbGVkLCBnaXZlIHVwIG9uIHRoaXMgd29yayAqLworCWlmIChyZXQgPCAwKSB7CisJCWNoaXAtPnBvbGxfdGltZSA9IDA7CisJCXJldHVybjsKKwl9CisKKwlpZiAocmV0ICYgQkFUVEVSWV9GVUxMX0NIQVJHRUQpCisJCXJldCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTDsKKwllbHNlIGlmIChyZXQgJiBCQVRURVJZX0RJU0NIQVJHSU5HKQorCQlyZXQgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOworCWVsc2UKKwkJcmV0ID0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKKworCWlmIChjaGlwLT5sYXN0X3N0YXRlICE9IHJldCkgeworCQljaGlwLT5wb2xsX3RpbWUgPSAwOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChjaGlwLT5wb3dlcl9zdXBwbHkpOworCQlyZXR1cm47CisJfQorCWlmIChjaGlwLT5wb2xsX3RpbWUgPiAwKSB7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2hpcC0+d29yaywgSFopOworCQljaGlwLT5wb2xsX3RpbWUtLTsKKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBzYnNfZGVmYXVsdF9kZXNjID0geworCS50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKKwkucHJvcGVydGllcyA9IHNic19wcm9wZXJ0aWVzLAorCS5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUoc2JzX3Byb3BlcnRpZXMpLAorCS5nZXRfcHJvcGVydHkgPSBzYnNfZ2V0X3Byb3BlcnR5LAorCS5leHRlcm5hbF9wb3dlcl9jaGFuZ2VkID0gc2JzX2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQsCit9OworCitzdGF0aWMgaW50IHNic19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3Qgc2JzX2luZm8gKmNoaXA7CisJc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjICpzYnNfZGVzYzsKKwlzdHJ1Y3Qgc2JzX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307CisJaW50IHJjOworCWludCBpcnE7CisKKwlzYnNfZGVzYyA9IGRldm1fa21lbWR1cCgmY2xpZW50LT5kZXYsICZzYnNfZGVmYXVsdF9kZXNjLAorCQkJc2l6ZW9mKCpzYnNfZGVzYyksIEdGUF9LRVJORUwpOworCWlmICghc2JzX2Rlc2MpCisJCXJldHVybiAtRU5PTUVNOworCisJc2JzX2Rlc2MtPm5hbWUgPSBkZXZtX2thc3ByaW50ZigmY2xpZW50LT5kZXYsIEdGUF9LRVJORUwsICJzYnMtJXMiLAorCQkJZGV2X25hbWUoJmNsaWVudC0+ZGV2KSk7CisJaWYgKCFzYnNfZGVzYy0+bmFtZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljaGlwID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKHN0cnVjdCBzYnNfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghY2hpcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljaGlwLT5jbGllbnQgPSBjbGllbnQ7CisJY2hpcC0+ZW5hYmxlX2RldGVjdGlvbiA9IGZhbHNlOworCXBzeV9jZmcub2Zfbm9kZSA9IGNsaWVudC0+ZGV2Lm9mX25vZGU7CisJcHN5X2NmZy5kcnZfZGF0YSA9IGNoaXA7CisJLyogaWdub3JlIGZpcnN0IG5vdGlmaWNhdGlvbiBvZiBleHRlcm5hbCBjaGFuZ2UsIGl0IGlzIGdlbmVyYXRlZAorCSAqIGZyb20gdGhlIHBvd2VyX3N1cHBseV9yZWdpc3RlciBjYWxsIGJhY2sKKwkgKi8KKwljaGlwLT5pZ25vcmVfY2hhbmdlcyA9IDE7CisJY2hpcC0+bGFzdF9zdGF0ZSA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfVU5LTk9XTjsKKworCS8qIHVzZSBwZGF0YSBpZiBhdmFpbGFibGUsIGZhbGwgYmFjayB0byBEVCBwcm9wZXJ0aWVzLAorCSAqIG9yIGhhcmRjb2RlZCBkZWZhdWx0cyBpZiBub3QKKwkgKi8KKwlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGNsaWVudC0+ZGV2Lm9mX25vZGUsICJzYnMsaTJjLXJldHJ5LWNvdW50IiwKKwkJCQkgICZjaGlwLT5pMmNfcmV0cnlfY291bnQpOworCWlmIChyYykKKwkJY2hpcC0+aTJjX3JldHJ5X2NvdW50ID0gMDsKKworCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoY2xpZW50LT5kZXYub2Zfbm9kZSwgInNicyxwb2xsLXJldHJ5LWNvdW50IiwKKwkJCQkgICZjaGlwLT5wb2xsX3JldHJ5X2NvdW50KTsKKwlpZiAocmMpCisJCWNoaXAtPnBvbGxfcmV0cnlfY291bnQgPSAwOworCisJaWYgKHBkYXRhKSB7CisJCWNoaXAtPnBvbGxfcmV0cnlfY291bnQgPSBwZGF0YS0+cG9sbF9yZXRyeV9jb3VudDsKKwkJY2hpcC0+aTJjX3JldHJ5X2NvdW50ICA9IHBkYXRhLT5pMmNfcmV0cnlfY291bnQ7CisJfQorCWNoaXAtPmkyY19yZXRyeV9jb3VudCA9IGNoaXAtPmkyY19yZXRyeV9jb3VudCArIDE7CisKKwljaGlwLT5ncGlvX2RldGVjdCA9IGRldm1fZ3Bpb2RfZ2V0X29wdGlvbmFsKCZjbGllbnQtPmRldiwKKwkJCSJzYnMsYmF0dGVyeS1kZXRlY3QiLCBHUElPRF9JTik7CisJaWYgKElTX0VSUihjaGlwLT5ncGlvX2RldGVjdCkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gZ2V0IGdwaW86ICVsZFxuIiwKKwkJCVBUUl9FUlIoY2hpcC0+Z3Bpb19kZXRlY3QpKTsKKwkJcmV0dXJuIFBUUl9FUlIoY2hpcC0+Z3Bpb19kZXRlY3QpOworCX0KKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGNoaXApOworCisJaWYgKCFjaGlwLT5ncGlvX2RldGVjdCkKKwkJZ290byBza2lwX2dwaW87CisKKwlpcnEgPSBncGlvZF90b19pcnEoY2hpcC0+Z3Bpb19kZXRlY3QpOworCWlmIChpcnEgPD0gMCkgeworCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gZ2V0IGdwaW8gYXMgaXJxOiAlZFxuIiwgaXJxKTsKKwkJZ290byBza2lwX2dwaW87CisJfQorCisJcmMgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKCZjbGllbnQtPmRldiwgaXJxLCBOVUxMLCBzYnNfaXJxLAorCQlJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9UUklHR0VSX0ZBTExJTkcsCisJCWRldl9uYW1lKCZjbGllbnQtPmRldiksIGNoaXApOworCWlmIChyYykgeworCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBpcnE6ICVkXG4iLCByYyk7CisJCWdvdG8gc2tpcF9ncGlvOworCX0KKworc2tpcF9ncGlvOgorCS8qCisJICogQmVmb3JlIHdlIHJlZ2lzdGVyLCB3ZSBtaWdodCBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBjYW4gYWN0dWFsbHkgdGFsaworCSAqIHRvIHRoZSBiYXR0ZXJ5LgorCSAqLworCWlmICghKGZvcmNlX2xvYWQgfHwgY2hpcC0+Z3Bpb19kZXRlY3QpKSB7CisJCXJjID0gc2JzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgc2JzX2RhdGFbUkVHX1NUQVRVU10uYWRkcik7CisKKwkJaWYgKHJjIDwgMCkgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogRmFpbGVkIHRvIGdldCBkZXZpY2Ugc3RhdHVzXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCWdvdG8gZXhpdF9wc3VwcGx5OworCQl9CisJfQorCisJY2hpcC0+cG93ZXJfc3VwcGx5ID0gZGV2bV9wb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCBzYnNfZGVzYywKKwkJCQkJCSAgICZwc3lfY2ZnKTsKKwlpZiAoSVNfRVJSKGNoaXAtPnBvd2VyX3N1cHBseSkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkiJXM6IEZhaWxlZCB0byByZWdpc3RlciBwb3dlciBzdXBwbHlcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSBQVFJfRVJSKGNoaXAtPnBvd2VyX3N1cHBseSk7CisJCWdvdG8gZXhpdF9wc3VwcGx5OworCX0KKworCWRldl9pbmZvKCZjbGllbnQtPmRldiwKKwkJIiVzOiBiYXR0ZXJ5IGdhcyBnYXVnZSBkZXZpY2UgcmVnaXN0ZXJlZFxuIiwgY2xpZW50LT5uYW1lKTsKKworCUlOSVRfREVMQVlFRF9XT1JLKCZjaGlwLT53b3JrLCBzYnNfZGVsYXllZF93b3JrKTsKKworCWNoaXAtPmVuYWJsZV9kZXRlY3Rpb24gPSB0cnVlOworCisJcmV0dXJuIDA7CisKK2V4aXRfcHN1cHBseToKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgc2JzX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBzYnNfaW5mbyAqY2hpcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZjaGlwLT53b3JrKTsKKworCXJldHVybiAwOworfQorCisjaWYgZGVmaW5lZCBDT05GSUdfUE1fU0xFRVAKKworc3RhdGljIGludCBzYnNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3Qgc2JzX2luZm8gKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWlmIChjaGlwLT5wb2xsX3RpbWUgPiAwKQorCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmNoaXAtPndvcmspOworCisJLyoKKwkgKiBXcml0ZSB0byBtYW51ZmFjdHVyZXIgYWNjZXNzIHdpdGggc2xlZXAgY29tbWFuZC4KKwkgKiBTdXBwb3J0IGlzIG1hbnVmYWN0dXJlciBkZXBlbmRlbmQsIHNvIGlnbm9yZSBlcnJvcnMuCisJICovCisJc2JzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHNic19kYXRhW1JFR19NQU5VRkFDVFVSRVJfREFUQV0uYWRkciwKKwkJTUFOVUZBQ1RVUkVSX0FDQ0VTU19TTEVFUCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKHNic19wbV9vcHMsIHNic19zdXNwZW5kLCBOVUxMKTsKKyNkZWZpbmUgU0JTX1BNX09QUyAoJnNic19wbV9vcHMpCisKKyNlbHNlCisjZGVmaW5lIFNCU19QTV9PUFMgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBzYnNfaWRbXSA9IHsKKwl7ICJicTIwejc1IiwgMCB9LAorCXsgInNicy1iYXR0ZXJ5IiwgMSB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHNic19pZCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNic19kdF9pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInNicyxzYnMtYmF0dGVyeSIgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLGJxMjB6NzUiIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc2JzX2R0X2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBzYnNfYmF0dGVyeV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHNic19wcm9iZSwKKwkucmVtb3ZlCQk9IHNic19yZW1vdmUsCisJLmlkX3RhYmxlCT0gc2JzX2lkLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInNicy1iYXR0ZXJ5IiwKKwkJLm9mX21hdGNoX3RhYmxlID0gc2JzX2R0X2lkcywKKwkJLnBtCT0gU0JTX1BNX09QUywKKwl9LAorfTsKK21vZHVsZV9pMmNfZHJpdmVyKHNic19iYXR0ZXJ5X2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiU0JTIGJhdHRlcnkgbW9uaXRvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtKGZvcmNlX2xvYWQsIGJvb2wsIFNfSVJVU1IgfCBTX0lSR1JQIHwgU19JUk9USCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2xvYWQsCisJCSAiQXR0ZW1wdCB0byBsb2FkIHRoZSBkcml2ZXIgZXZlbiBpZiBubyBiYXR0ZXJ5IGlzIGNvbm5lY3RlZCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9zbWIzNDctY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvc21iMzQ3LWNoYXJnZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci9zbWIzNDctY2hhcmdlci5jCnJlbmFtZSB0byBkcml2ZXJzL3Bvd2VyL3N1cHBseS9zbWIzNDctY2hhcmdlci5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3Rlc3RfcG93ZXIuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3Rlc3RfcG93ZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci90ZXN0X3Bvd2VyLmMKcmVuYW1lIHRvIGRyaXZlcnMvcG93ZXIvc3VwcGx5L3Rlc3RfcG93ZXIuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci90b3NhX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3Rvc2FfYmF0dGVyeS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3Bvd2VyL3Rvc2FfYmF0dGVyeS5jCnJlbmFtZSB0byBkcml2ZXJzL3Bvd2VyL3N1cHBseS90b3NhX2JhdHRlcnkuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci90cHM2NTA5MC1jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS90cHM2NTA5MC1jaGFyZ2VyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvdHBzNjUwOTAtY2hhcmdlci5jCnJlbmFtZSB0byBkcml2ZXJzL3Bvd2VyL3N1cHBseS90cHM2NTA5MC1jaGFyZ2VyLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3RwczY1MjE3X2NoYXJnZXIuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3RwczY1MjE3X2NoYXJnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmQwMTlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvdHBzNjUyMTdfY2hhcmdlci5jCkBAIC0wLDAgKzEsMjk1IEBACisvKgorICogQmF0dGVyeSBjaGFyZ2VyIGRyaXZlciBmb3IgVEkncyB0cHM2NTIxNworICoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgQ29sbGFib3JhIEx0ZC4KKworICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKy8qCisgKiBCYXR0ZXJ5IGNoYXJnZXIgZHJpdmVyIGZvciBUSSdzIHRwczY1MjE3CisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgorCisjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvdHBzNjUyMTcuaD4KKworI2RlZmluZSBQT0xMX0lOVEVSVkFMCQkoSFogKiAyKQorCitzdHJ1Y3QgdHBzNjUyMTdfY2hhcmdlciB7CisJc3RydWN0IHRwczY1MjE3ICp0cHM7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmFjOworCisJaW50CWFjX29ubGluZTsKKwlpbnQJcHJldl9hY19vbmxpbmU7CisKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnBvbGxfdGFzazsKKworCWludAlpcnE7Cit9OworCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgdHBzNjUyMTdfYWNfcHJvcHNbXSA9IHsKKwlQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUsCit9OworCitzdGF0aWMgaW50IHRwczY1MjE3X2NvbmZpZ19jaGFyZ2VyKHN0cnVjdCB0cHM2NTIxN19jaGFyZ2VyICpjaGFyZ2VyKQoreworCWludCByZXQ7CisKKwlkZXZfZGJnKGNoYXJnZXItPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwkvKgorCSAqIHRwczY1MjE3IHJldi4gRywgcC4gMzEgKHNlZSBwLiAzMiBmb3IgTlRDIHNjaGVtYXRpYykKKwkgKgorCSAqIFRoZSBkZXZpY2UgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBhIDEwMGsgTlRDIChCID0gMzk2MCkgYnkKKwkgKiBzZXR0aW5nIHRoZSB0aGUgTlRDX1RZUEUgYml0IGluIHJlZ2lzdGVyIENIR0NPTkZJRzEgdG8gMS4gSG93ZXZlciBpdAorCSAqIGlzIG5vdCByZWNvbW1lbmRlZCB0byBkbyBzby4gSW4gc2xlZXAgbW9kZSwgdGhlIGNoYXJnZXIgY29udGludWVzCisJICogY2hhcmdpbmcgdGhlIGJhdHRlcnksIGJ1dCBhbGwgcmVnaXN0ZXIgdmFsdWVzIGFyZSByZXNldCB0byBkZWZhdWx0CisJICogdmFsdWVzLiBUaGVyZWZvcmUsIHRoZSBjaGFyZ2VyIHdvdWxkIGdldCB0aGUgd3JvbmcgdGVtcGVyYXR1cmUKKwkgKiBpbmZvcm1hdGlvbi4gSWYgMTAwayBOVEMgc2V0dGluZyBpcyByZXF1aXJlZCwgcGxlYXNlIGNvbnRhY3QgdGhlCisJICogZmFjdG9yeS4KKwkgKgorCSAqIEFUVEVOVElPTiwgY29uZmxpY3RpbmcgaW5mb3JtYXRpb24sIGZyb20gcC4gNDYKKwkgKgorCSAqIE5UQyBUWVBFIChmb3IgYmF0dGVyeSB0ZW1wZXJhdHVyZSBtZWFzdXJlbWVudCkKKwkgKiAgIDAg4oCTIDEwMGsgKGN1cnZlIDEsIEIgPSAzOTYwKQorCSAqICAgMSDigJMgMTBrICAoY3VydmUgMiwgQiA9IDM0ODApIChkZWZhdWx0IG9uIHJlc2V0KQorCSAqCisJICovCisJcmV0ID0gdHBzNjUyMTdfY2xlYXJfYml0cyhjaGFyZ2VyLT50cHMsIFRQUzY1MjE3X1JFR19DSEdDT05GSUcxLAorCQkJCSAgVFBTNjUyMTdfQ0hHQ09ORklHMV9OVENfVFlQRSwKKwkJCQkgIFRQUzY1MjE3X1BST1RFQ1RfTk9ORSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGNoYXJnZXItPmRldiwKKwkJCSJmYWlsZWQgdG8gc2V0IDEwMGsgTlRDIHNldHRpbmc6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRwczY1MjE3X2VuYWJsZV9jaGFyZ2luZyhzdHJ1Y3QgdHBzNjUyMTdfY2hhcmdlciAqY2hhcmdlcikKK3sKKwlpbnQgcmV0OworCisJLyogY2hhcmdlciBhbHJlYWR5IGVuYWJsZWQgKi8KKwlpZiAoY2hhcmdlci0+YWNfb25saW5lKQorCQlyZXR1cm4gMDsKKworCWRldl9kYmcoY2hhcmdlci0+ZGV2LCAiJXM6IGVuYWJsZSBjaGFyZ2luZ1xuIiwgX19mdW5jX18pOworCXJldCA9IHRwczY1MjE3X3NldF9iaXRzKGNoYXJnZXItPnRwcywgVFBTNjUyMTdfUkVHX0NIR0NPTkZJRzEsCisJCQkJVFBTNjUyMTdfQ0hHQ09ORklHMV9DSEdfRU4sCisJCQkJVFBTNjUyMTdfQ0hHQ09ORklHMV9DSEdfRU4sCisJCQkJVFBTNjUyMTdfUFJPVEVDVF9OT05FKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoY2hhcmdlci0+ZGV2LAorCQkJIiVzOiBFcnJvciBpbiB3cml0aW5nIENIR19FTiBpbiByZWcgMHgleDogJWRcbiIsCisJCQlfX2Z1bmNfXywgVFBTNjUyMTdfUkVHX0NIR0NPTkZJRzEsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJY2hhcmdlci0+YWNfb25saW5lID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRwczY1MjE3X2FjX2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCisJCQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXN0cnVjdCB0cHM2NTIxN19jaGFyZ2VyICpjaGFyZ2VyID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CisKKwlpZiAocHNwID09IFBPV0VSX1NVUFBMWV9QUk9QX09OTElORSkgeworCQl2YWwtPmludHZhbCA9IGNoYXJnZXItPmFjX29ubGluZTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgdHBzNjUyMTdfY2hhcmdlcl9pcnEoaW50IGlycSwgdm9pZCAqZGV2KQoreworCWludCByZXQsIHZhbDsKKwlzdHJ1Y3QgdHBzNjUyMTdfY2hhcmdlciAqY2hhcmdlciA9IGRldjsKKworCWNoYXJnZXItPnByZXZfYWNfb25saW5lID0gY2hhcmdlci0+YWNfb25saW5lOworCisJcmV0ID0gdHBzNjUyMTdfcmVnX3JlYWQoY2hhcmdlci0+dHBzLCBUUFM2NTIxN19SRUdfU1RBVFVTLCAmdmFsKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGNoYXJnZXItPmRldiwgIiVzOiBFcnJvciBpbiByZWFkaW5nIHJlZyAweCV4XG4iLAorCQkJX19mdW5jX18sIFRQUzY1MjE3X1JFR19TVEFUVVMpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJZGV2X2RiZyhjaGFyZ2VyLT5kZXYsICIlczogMHgleFxuIiwgX19mdW5jX18sIHZhbCk7CisKKwkvKiBjaGVjayBmb3IgQUMgc3RhdHVzIGJpdCAqLworCWlmICh2YWwgJiBUUFM2NTIxN19TVEFUVVNfQUNQV1IpIHsKKwkJcmV0ID0gdHBzNjUyMTdfZW5hYmxlX2NoYXJnaW5nKGNoYXJnZXIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGNoYXJnZXItPmRldiwKKwkJCQkiZmFpbGVkIHRvIGVuYWJsZSBjaGFyZ2VyOiAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJfQorCX0gZWxzZSB7CisJCWNoYXJnZXItPmFjX29ubGluZSA9IDA7CisJfQorCisJaWYgKGNoYXJnZXItPnByZXZfYWNfb25saW5lICE9IGNoYXJnZXItPmFjX29ubGluZSkKKwkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoY2hhcmdlci0+YWMpOworCisJcmV0ID0gdHBzNjUyMTdfcmVnX3JlYWQoY2hhcmdlci0+dHBzLCBUUFM2NTIxN19SRUdfQ0hHQ09ORklHMCwgJnZhbCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihjaGFyZ2VyLT5kZXYsICIlczogRXJyb3IgaW4gcmVhZGluZyByZWcgMHgleFxuIiwKKwkJCV9fZnVuY19fLCBUUFM2NTIxN19SRUdfQ0hHQ09ORklHMCk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAodmFsICYgVFBTNjUyMTdfQ0hHQ09ORklHMF9BQ1RJVkUpCisJCWRldl9kYmcoY2hhcmdlci0+ZGV2LCAiJXM6IGNoYXJnZXIgaXMgY2hhcmdpbmdcbiIsIF9fZnVuY19fKTsKKwllbHNlCisJCWRldl9kYmcoY2hhcmdlci0+ZGV2LAorCQkJIiVzOiBjaGFyZ2VyIGlzIE5PVCBjaGFyZ2luZ1xuIiwgX19mdW5jX18pOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHRwczY1MjE3X2NoYXJnZXJfcG9sbF90YXNrKHZvaWQgKmRhdGEpCit7CisJc2V0X2ZyZWV6YWJsZSgpOworCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKFBPTExfSU5URVJWQUwpOworCQl0cnlfdG9fZnJlZXplKCk7CisJCXRwczY1MjE3X2NoYXJnZXJfaXJxKC0xLCBkYXRhKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgdHBzNjUyMTdfY2hhcmdlcl9kZXNjID0geworCS5uYW1lCQkJPSAidHBzNjUyMTctYWMiLAorCS50eXBlCQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUywKKwkuZ2V0X3Byb3BlcnR5CQk9IHRwczY1MjE3X2FjX2dldF9wcm9wZXJ0eSwKKwkucHJvcGVydGllcwkJPSB0cHM2NTIxN19hY19wcm9wcywKKwkubnVtX3Byb3BlcnRpZXMJCT0gQVJSQVlfU0laRSh0cHM2NTIxN19hY19wcm9wcyksCit9OworCitzdGF0aWMgaW50IHRwczY1MjE3X2NoYXJnZXJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdHBzNjUyMTcgKnRwcyA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgdHBzNjUyMTdfY2hhcmdlciAqY2hhcmdlcjsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBjZmcgPSB7fTsKKwlpbnQgaXJxOworCWludCByZXQ7CisKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCisJY2hhcmdlciA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmNoYXJnZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoYXJnZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY2hhcmdlcik7CisJY2hhcmdlci0+dHBzID0gdHBzOworCWNoYXJnZXItPmRldiA9ICZwZGV2LT5kZXY7CisKKwljZmcub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCWNmZy5kcnZfZGF0YSA9IGNoYXJnZXI7CisKKwljaGFyZ2VyLT5hYyA9IGRldm1fcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsCisJCQkJCQkgJnRwczY1MjE3X2NoYXJnZXJfZGVzYywKKwkJCQkJCSAmY2ZnKTsKKwlpZiAoSVNfRVJSKGNoYXJnZXItPmFjKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQ6IHBvd2VyIHN1cHBseSByZWdpc3RlclxuIik7CisJCXJldHVybiBQVFJfRVJSKGNoYXJnZXItPmFjKTsKKwl9CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAiQUMiKTsKKwlpZiAoaXJxIDwgMCkKKwkJaXJxID0gLUVOWElPOworCWNoYXJnZXItPmlycSA9IGlycTsKKworCXJldCA9IHRwczY1MjE3X2NvbmZpZ19jaGFyZ2VyKGNoYXJnZXIpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY2hhcmdlci0+ZGV2LCAiY2hhcmdlciBjb25maWcgZmFpbGVkLCBlcnIgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGlycSAhPSAtRU5YSU8pIHsKKwkJcmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycSgmcGRldi0+ZGV2LCBpcnEsIE5VTEwsCisJCQkJCQl0cHM2NTIxN19jaGFyZ2VyX2lycSwKKwkJCQkJCTAsICJ0cHM2NTIxNy1jaGFyZ2VyIiwKKwkJCQkJCWNoYXJnZXIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGNoYXJnZXItPmRldiwKKwkJCQkiVW5hYmxlIHRvIHJlZ2lzdGVyIGlycSAlZCBlcnIgJWRcbiIsIGlycSwKKwkJCQlyZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCS8qIENoZWNrIGN1cnJlbnQgc3RhdGUgKi8KKwkJdHBzNjUyMTdfY2hhcmdlcl9pcnEoaXJxLCBjaGFyZ2VyKTsKKwl9IGVsc2UgeworCQljaGFyZ2VyLT5wb2xsX3Rhc2sgPSBrdGhyZWFkX3J1bih0cHM2NTIxN19jaGFyZ2VyX3BvbGxfdGFzaywKKwkJCQkJCWNoYXJnZXIsICJrdHBzNjUyMTdjaGFyZ2VyIik7CisJCWlmIChJU19FUlIoY2hhcmdlci0+cG9sbF90YXNrKSkgeworCQkJcmV0ID0gUFRSX0VSUihjaGFyZ2VyLT5wb2xsX3Rhc2spOworCQkJZGV2X2VycihjaGFyZ2VyLT5kZXYsCisJCQkJIlVuYWJsZSB0byBydW4ga3RocmVhZCBlcnIgJWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHBzNjUyMTdfY2hhcmdlcl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdHBzNjUyMTdfY2hhcmdlciAqY2hhcmdlciA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGNoYXJnZXItPmlycSA9PSAtRU5YSU8pCisJCWt0aHJlYWRfc3RvcChjaGFyZ2VyLT5wb2xsX3Rhc2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHRwczY1MjE3X2NoYXJnZXJfbWF0Y2hfdGFibGVbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInRpLHRwczY1MjE3LWNoYXJnZXIiLCB9LAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHRwczY1MjE3X2NoYXJnZXJfbWF0Y2hfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0cHM2NTIxN19jaGFyZ2VyX2RyaXZlciA9IHsKKwkucHJvYmUJPSB0cHM2NTIxN19jaGFyZ2VyX3Byb2JlLAorCS5yZW1vdmUgPSB0cHM2NTIxN19jaGFyZ2VyX3JlbW92ZSwKKwkuZHJpdmVyCT0geworCQkubmFtZQk9ICJ0cHM2NTIxNy1jaGFyZ2VyIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHRwczY1MjE3X2NoYXJnZXJfbWF0Y2hfdGFibGUpLAorCX0sCisKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHRwczY1MjE3X2NoYXJnZXJfZHJpdmVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FVVEhPUigiRW5yaWMgQmFsbGV0Ym8gU2VycmEgPGVucmljLmJhbGxldGJvQGNvbGxhYm9yYS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRQUzY1MjE3IGJhdHRlcnkgY2hhcmdlciBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvdHdsNDAzMF9jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS90d2w0MDMwX2NoYXJnZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci90d2w0MDMwX2NoYXJnZXIuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvdHdsNDAzMF9jaGFyZ2VyLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvdHdsNDAzMF9tYWRjX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3R3bDQwMzBfbWFkY19iYXR0ZXJ5LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvdHdsNDAzMF9tYWRjX2JhdHRlcnkuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvdHdsNDAzMF9tYWRjX2JhdHRlcnkuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci93bTgzMXhfYmFja3VwLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS93bTgzMXhfYmFja3VwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvd204MzF4X2JhY2t1cC5jCnJlbmFtZSB0byBkcml2ZXJzL3Bvd2VyL3N1cHBseS93bTgzMXhfYmFja3VwLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvd204MzF4X3Bvd2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS93bTgzMXhfcG93ZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci93bTgzMXhfcG93ZXIuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvd204MzF4X3Bvd2VyLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvd204MzUwX3Bvd2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS93bTgzNTBfcG93ZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci93bTgzNTBfcG93ZXIuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvd204MzUwX3Bvd2VyLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3dtOTd4eF9iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS93bTk3eHhfYmF0dGVyeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyODU2MjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS93bTk3eHhfYmF0dGVyeS5jCkBAIC0wLDAgKzEsMjk3IEBACisvKgorICogQmF0dGVyeSBtZWFzdXJlbWVudCBjb2RlIGZvciBXTTk3eHgKKyAqCisgKiBiYXNlZCBvbiB0b3NhX2JhdHRlcnkuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBNYXJlayBWYXN1dCA8bWFyZWsudmFzdXRAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+CisjaW5jbHVkZSA8bGludXgvd205N3h4Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCitzdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IGJhdF93b3JrOworc3RhdGljIERFRklORV9NVVRFWCh3b3JrX2xvY2spOworc3RhdGljIGludCBiYXRfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOworc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5ICpwcm9wOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyB3bTk3eHhfcmVhZF9iYXQoc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0X3BzKQoreworCXN0cnVjdCB3bTk3eHhfcGRhdGEgKndtZGF0YSA9IGJhdF9wcy0+ZGV2LnBhcmVudC0+cGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3Qgd205N3h4X2JhdHRfcGRhdGEgKnBkYXRhID0gd21kYXRhLT5iYXR0X3BkYXRhOworCisJcmV0dXJuIHdtOTd4eF9yZWFkX2F1eF9hZGMoZGV2X2dldF9kcnZkYXRhKGJhdF9wcy0+ZGV2LnBhcmVudCksCisJCQkJCXBkYXRhLT5iYXR0X2F1eCkgKiBwZGF0YS0+YmF0dF9tdWx0IC8KKwkJCQkJcGRhdGEtPmJhdHRfZGl2OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB3bTk3eHhfcmVhZF90ZW1wKHN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdF9wcykKK3sKKwlzdHJ1Y3Qgd205N3h4X3BkYXRhICp3bWRhdGEgPSBiYXRfcHMtPmRldi5wYXJlbnQtPnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHdtOTd4eF9iYXR0X3BkYXRhICpwZGF0YSA9IHdtZGF0YS0+YmF0dF9wZGF0YTsKKworCXJldHVybiB3bTk3eHhfcmVhZF9hdXhfYWRjKGRldl9nZXRfZHJ2ZGF0YShiYXRfcHMtPmRldi5wYXJlbnQpLAorCQkJCQlwZGF0YS0+dGVtcF9hdXgpICogcGRhdGEtPnRlbXBfbXVsdCAvCisJCQkJCXBkYXRhLT50ZW1wX2RpdjsKK30KKworc3RhdGljIGludCB3bTk3eHhfYmF0X2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXRfcHMsCisJCQkgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCQkJICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJc3RydWN0IHdtOTd4eF9wZGF0YSAqd21kYXRhID0gYmF0X3BzLT5kZXYucGFyZW50LT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCB3bTk3eHhfYmF0dF9wZGF0YSAqcGRhdGEgPSB3bWRhdGEtPmJhdHRfcGRhdGE7CisKKwlzd2l0Y2ggKHBzcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgorCQl2YWwtPmludHZhbCA9IGJhdF9zdGF0dXM7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWToKKwkJdmFsLT5pbnR2YWwgPSBwZGF0YS0+YmF0dF90ZWNoOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XOgorCQlpZiAocGRhdGEtPmJhdHRfYXV4ID49IDApCisJCQl2YWwtPmludHZhbCA9IHdtOTd4eF9yZWFkX2JhdChiYXRfcHMpOworCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QOgorCQlpZiAocGRhdGEtPnRlbXBfYXV4ID49IDApCisJCQl2YWwtPmludHZhbCA9IHdtOTd4eF9yZWFkX3RlbXAoYmF0X3BzKTsKKwkJZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NQVg6CisJCWlmIChwZGF0YS0+bWF4X3ZvbHRhZ2UgPj0gMCkKKwkJCXZhbC0+aW50dmFsID0gcGRhdGEtPm1heF92b2x0YWdlOworCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTjoKKwkJaWYgKHBkYXRhLT5taW5fdm9sdGFnZSA+PSAwKQorCQkJdmFsLT5pbnR2YWwgPSBwZGF0YS0+bWluX3ZvbHRhZ2U7CisJCWVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ6CisJCXZhbC0+aW50dmFsID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3bTk3eHhfYmF0X2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQoc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0X3BzKQoreworCXNjaGVkdWxlX3dvcmsoJmJhdF93b3JrKTsKK30KKworc3RhdGljIHZvaWQgd205N3h4X2JhdF91cGRhdGUoc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0X3BzKQoreworCWludCBvbGRfc3RhdHVzID0gYmF0X3N0YXR1czsKKwlzdHJ1Y3Qgd205N3h4X3BkYXRhICp3bWRhdGEgPSBiYXRfcHMtPmRldi5wYXJlbnQtPnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHdtOTd4eF9iYXR0X3BkYXRhICpwZGF0YSA9IHdtZGF0YS0+YmF0dF9wZGF0YTsKKworCW11dGV4X2xvY2soJndvcmtfbG9jayk7CisKKwliYXRfc3RhdHVzID0gKHBkYXRhLT5jaGFyZ2VfZ3BpbyA+PSAwKSA/CisJCQkoZ3Bpb19nZXRfdmFsdWUocGRhdGEtPmNoYXJnZV9ncGlvKSA/CisJCQlQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HIDoKKwkJCVBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkcpIDoKKwkJCVBPV0VSX1NVUFBMWV9TVEFUVVNfVU5LTk9XTjsKKworCWlmIChvbGRfc3RhdHVzICE9IGJhdF9zdGF0dXMpIHsKKwkJcHJfZGVidWcoIiVzOiAlaSAtPiAlaVxuIiwgYmF0X3BzLT5kZXNjLT5uYW1lLCBvbGRfc3RhdHVzLAorCQkJCQliYXRfc3RhdHVzKTsKKwkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoYmF0X3BzKTsKKwl9CisKKwltdXRleF91bmxvY2soJndvcmtfbG9jayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXRfcHN5Oworc3RhdGljIHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBiYXRfcHN5X2Rlc2MgPSB7CisJLnR5cGUJCQk9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlksCisJLmdldF9wcm9wZXJ0eQkJPSB3bTk3eHhfYmF0X2dldF9wcm9wZXJ0eSwKKwkuZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCA9IHdtOTd4eF9iYXRfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCwKKwkudXNlX2Zvcl9hcG0JCT0gMSwKK307CisKK3N0YXRpYyB2b2lkIHdtOTd4eF9iYXRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJd205N3h4X2JhdF91cGRhdGUoYmF0X3BzeSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3bTk3eHhfY2hyZ19pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzY2hlZHVsZV93b3JrKCZiYXRfd29yayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHdtOTd4eF9iYXRfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJZmx1c2hfd29yaygmYmF0X3dvcmspOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtOTd4eF9iYXRfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzY2hlZHVsZV93b3JrKCZiYXRfd29yayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyB3bTk3eHhfYmF0X3BtX29wcyA9IHsKKwkuc3VzcGVuZAk9IHdtOTd4eF9iYXRfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHdtOTd4eF9iYXRfcmVzdW1lLAorfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IHdtOTd4eF9iYXRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCWludCByZXQgPSAwOworCWludCBwcm9wcyA9IDE7CS8qIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQgKi8KKwlpbnQgaSA9IDA7CisJc3RydWN0IHdtOTd4eF9wZGF0YSAqd21kYXRhID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3Qgd205N3h4X2JhdHRfcGRhdGEgKnBkYXRhOworCisJaWYgKCF3bWRhdGEpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJObyBwbGF0Zm9ybSBkYXRhIHN1cHBsaWVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGRhdGEgPSB3bWRhdGEtPmJhdHRfcGRhdGE7CisKKwlpZiAoZGV2LT5pZCAhPSAtMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXBkYXRhKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiTm8gcGxhdGZvcm1fZGF0YSBzdXBwbGllZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT5jaGFyZ2VfZ3BpbykpIHsKKwkJcmV0ID0gZ3Bpb19yZXF1ZXN0KHBkYXRhLT5jaGFyZ2VfZ3BpbywgIkJBVFQgQ0hSRyIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnI7CisJCXJldCA9IGdwaW9fZGlyZWN0aW9uX2lucHV0KHBkYXRhLT5jaGFyZ2VfZ3Bpbyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjI7CisJCXJldCA9IHJlcXVlc3RfaXJxKGdwaW9fdG9faXJxKHBkYXRhLT5jaGFyZ2VfZ3BpbyksCisJCQkJd205N3h4X2NocmdfaXJxLCAwLAorCQkJCSJBQyBEZXRlY3QiLCBkZXYpOworCQlpZiAocmV0KQorCQkJZ290byBlcnIyOworCQlwcm9wcysrOwkvKiBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMgKi8KKwl9CisKKwlpZiAocGRhdGEtPmJhdHRfdGVjaCA+PSAwKQorCQlwcm9wcysrOwkvKiBQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZICovCisJaWYgKHBkYXRhLT50ZW1wX2F1eCA+PSAwKQorCQlwcm9wcysrOwkvKiBQT1dFUl9TVVBQTFlfUFJPUF9URU1QICovCisJaWYgKHBkYXRhLT5iYXR0X2F1eCA+PSAwKQorCQlwcm9wcysrOwkvKiBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVyAqLworCWlmIChwZGF0YS0+bWF4X3ZvbHRhZ2UgPj0gMCkKKwkJcHJvcHMrKzsJLyogUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NQVggKi8KKwlpZiAocGRhdGEtPm1pbl92b2x0YWdlID49IDApCisJCXByb3BzKys7CS8qIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOICovCisKKwlwcm9wID0ga3phbGxvYyhwcm9wcyAqIHNpemVvZigqcHJvcCksIEdGUF9LRVJORUwpOworCWlmICghcHJvcCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycjM7CisJfQorCisJcHJvcFtpKytdID0gUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDsKKwlpZiAocGRhdGEtPmNoYXJnZV9ncGlvID49IDApCisJCXByb3BbaSsrXSA9IFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzsKKwlpZiAocGRhdGEtPmJhdHRfdGVjaCA+PSAwKQorCQlwcm9wW2krK10gPSBQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZOworCWlmIChwZGF0YS0+dGVtcF9hdXggPj0gMCkKKwkJcHJvcFtpKytdID0gUE9XRVJfU1VQUExZX1BST1BfVEVNUDsKKwlpZiAocGRhdGEtPmJhdHRfYXV4ID49IDApCisJCXByb3BbaSsrXSA9IFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XOworCWlmIChwZGF0YS0+bWF4X3ZvbHRhZ2UgPj0gMCkKKwkJcHJvcFtpKytdID0gUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NQVg7CisJaWYgKHBkYXRhLT5taW5fdm9sdGFnZSA+PSAwKQorCQlwcm9wW2krK10gPSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTjsKKworCUlOSVRfV09SSygmYmF0X3dvcmssIHdtOTd4eF9iYXRfd29yayk7CisKKwlpZiAoIXBkYXRhLT5iYXR0X25hbWUpIHsKKwkJZGV2X2luZm8oJmRldi0+ZGV2LCAiUGxlYXNlIGNvbnNpZGVyIHNldHRpbmcgcHJvcGVyIGJhdHRlcnkgIgorCQkJCSJuYW1lIGluIHBsYXRmb3JtIGRlZmluaXRpb24gZmlsZSwgZmFsbGluZyAiCisJCQkJImJhY2sgdG8gbmFtZSBcIndtOTd4eC1iYXR0XCJcbiIpOworCQliYXRfcHN5X2Rlc2MubmFtZSA9ICJ3bTk3eHgtYmF0dCI7CisJfSBlbHNlCisJCWJhdF9wc3lfZGVzYy5uYW1lID0gcGRhdGEtPmJhdHRfbmFtZTsKKworCWJhdF9wc3lfZGVzYy5wcm9wZXJ0aWVzID0gcHJvcDsKKwliYXRfcHN5X2Rlc2MubnVtX3Byb3BlcnRpZXMgPSBwcm9wczsKKworCWJhdF9wc3kgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJmRldi0+ZGV2LCAmYmF0X3BzeV9kZXNjLCBOVUxMKTsKKwlpZiAoIUlTX0VSUihiYXRfcHN5KSkgeworCQlzY2hlZHVsZV93b3JrKCZiYXRfd29yayk7CisJfSBlbHNlIHsKKwkJcmV0ID0gUFRSX0VSUihiYXRfcHN5KTsKKwkJZ290byBlcnI0OworCX0KKworCXJldHVybiAwOworZXJyNDoKKwlrZnJlZShwcm9wKTsKK2VycjM6CisJaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPmNoYXJnZV9ncGlvKSkKKwkJZnJlZV9pcnEoZ3Bpb190b19pcnEocGRhdGEtPmNoYXJnZV9ncGlvKSwgZGV2KTsKK2VycjI6CisJaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPmNoYXJnZV9ncGlvKSkKKwkJZ3Bpb19mcmVlKHBkYXRhLT5jaGFyZ2VfZ3Bpbyk7CitlcnI6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3bTk3eHhfYmF0X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHdtOTd4eF9wZGF0YSAqd21kYXRhID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3Qgd205N3h4X2JhdHRfcGRhdGEgKnBkYXRhID0gd21kYXRhLT5iYXR0X3BkYXRhOworCisJaWYgKHBkYXRhICYmIGdwaW9faXNfdmFsaWQocGRhdGEtPmNoYXJnZV9ncGlvKSkgeworCQlmcmVlX2lycShncGlvX3RvX2lycShwZGF0YS0+Y2hhcmdlX2dwaW8pLCBkZXYpOworCQlncGlvX2ZyZWUocGRhdGEtPmNoYXJnZV9ncGlvKTsKKwl9CisJY2FuY2VsX3dvcmtfc3luYygmYmF0X3dvcmspOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGJhdF9wc3kpOworCWtmcmVlKHByb3ApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB3bTk3eHhfYmF0X2RyaXZlciA9IHsKKwkuZHJpdmVyCT0geworCQkubmFtZQk9ICJ3bTk3eHgtYmF0dGVyeSIsCisjaWZkZWYgQ09ORklHX1BNCisJCS5wbQk9ICZ3bTk3eHhfYmF0X3BtX29wcywKKyNlbmRpZgorCX0sCisJLnByb2JlCQk9IHdtOTd4eF9iYXRfcHJvYmUsCisJLnJlbW92ZQkJPSB3bTk3eHhfYmF0X3JlbW92ZSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIod205N3h4X2JhdF9kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJNYXJlayBWYXN1dCA8bWFyZWsudmFzdXRAZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJXTTk3eHggYmF0dGVyeSBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3oyX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3oyX2JhdHRlcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTQzYjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvejJfYmF0dGVyeS5jCkBAIC0wLDAgKzEsMzMwIEBACisvKgorICogQmF0dGVyeSBtZWFzdXJlbWVudCBjb2RlIGZvciBaaXBpdCBaMgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBQZXRlciBFZHdhcmRzIDxzd2VldGxpbG1yZUBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvejJfYmF0dGVyeS5oPgorCisjZGVmaW5lCVoyX0RFRkFVTFRfTkFNRQkiWjIiCisKK3N0cnVjdCB6Ml9jaGFyZ2VyIHsKKwlzdHJ1Y3QgejJfYmF0dGVyeV9pbmZvCQkqaW5mbzsKKwlpbnQJCQkJYmF0X3N0YXR1czsKKwlzdHJ1Y3QgaTJjX2NsaWVudAkJKmNsaWVudDsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5CQkqYmF0dF9wczsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MJYmF0dF9wc19kZXNjOworCXN0cnVjdCBtdXRleAkJCXdvcmtfbG9jazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCWJhdF93b3JrOworfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgejJfcmVhZF9iYXQoc3RydWN0IHoyX2NoYXJnZXIgKmNoYXJnZXIpCit7CisJaW50IGRhdGE7CisJZGF0YSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjaGFyZ2VyLT5jbGllbnQsCisJCQkJCWNoYXJnZXItPmluZm8tPmJhdHRfSTJDX3JlZyk7CisJaWYgKGRhdGEgPCAwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBkYXRhICogY2hhcmdlci0+aW5mby0+YmF0dF9tdWx0IC8gY2hhcmdlci0+aW5mby0+YmF0dF9kaXY7Cit9CisKK3N0YXRpYyBpbnQgejJfYmF0dF9nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0dF9wcywKKwkJCSAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCisJCQkgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzdHJ1Y3QgejJfY2hhcmdlciAqY2hhcmdlciA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShiYXR0X3BzKTsKKwlzdHJ1Y3QgejJfYmF0dGVyeV9pbmZvICppbmZvID0gY2hhcmdlci0+aW5mbzsKKworCXN3aXRjaCAocHNwKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6CisJCXZhbC0+aW50dmFsID0gY2hhcmdlci0+YmF0X3N0YXR1czsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZOgorCQl2YWwtPmludHZhbCA9IGluZm8tPmJhdHRfdGVjaDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKKwkJaWYgKGluZm8tPmJhdHRfSTJDX3JlZyA+PSAwKQorCQkJdmFsLT5pbnR2YWwgPSB6Ml9yZWFkX2JhdChjaGFyZ2VyKTsKKwkJZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NQVg6CisJCWlmIChpbmZvLT5tYXhfdm9sdGFnZSA+PSAwKQorCQkJdmFsLT5pbnR2YWwgPSBpbmZvLT5tYXhfdm9sdGFnZTsKKwkJZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU46CisJCWlmIChpbmZvLT5taW5fdm9sdGFnZSA+PSAwKQorCQkJdmFsLT5pbnR2YWwgPSBpbmZvLT5taW5fdm9sdGFnZTsKKwkJZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDoKKwkJdmFsLT5pbnR2YWwgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgejJfYmF0dF9leHRfcG93ZXJfY2hhbmdlZChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXR0X3BzKQoreworCXN0cnVjdCB6Ml9jaGFyZ2VyICpjaGFyZ2VyID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKGJhdHRfcHMpOworCisJc2NoZWR1bGVfd29yaygmY2hhcmdlci0+YmF0X3dvcmspOworfQorCitzdGF0aWMgdm9pZCB6Ml9iYXR0X3VwZGF0ZShzdHJ1Y3QgejJfY2hhcmdlciAqY2hhcmdlcikKK3sKKwlpbnQgb2xkX3N0YXR1cyA9IGNoYXJnZXItPmJhdF9zdGF0dXM7CisJc3RydWN0IHoyX2JhdHRlcnlfaW5mbyAqaW5mbzsKKworCWluZm8gPSBjaGFyZ2VyLT5pbmZvOworCisJbXV0ZXhfbG9jaygmY2hhcmdlci0+d29ya19sb2NrKTsKKworCWNoYXJnZXItPmJhdF9zdGF0dXMgPSAoaW5mby0+Y2hhcmdlX2dwaW8gPj0gMCkgPworCQkoZ3Bpb19nZXRfdmFsdWUoaW5mby0+Y2hhcmdlX2dwaW8pID8KKwkJUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORyA6CisJCVBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkcpIDoKKwkJUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOworCisJaWYgKG9sZF9zdGF0dXMgIT0gY2hhcmdlci0+YmF0X3N0YXR1cykgeworCQlwcl9kZWJ1ZygiJXM6ICVpIC0+ICVpXG4iLCBjaGFyZ2VyLT5iYXR0X3BzLT5kZXNjLT5uYW1lLAorCQkJCW9sZF9zdGF0dXMsCisJCQkJY2hhcmdlci0+YmF0X3N0YXR1cyk7CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGNoYXJnZXItPmJhdHRfcHMpOworCX0KKworCW11dGV4X3VubG9jaygmY2hhcmdlci0+d29ya19sb2NrKTsKK30KKworc3RhdGljIHZvaWQgejJfYmF0dF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgejJfY2hhcmdlciAqY2hhcmdlcjsKKwljaGFyZ2VyID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB6Ml9jaGFyZ2VyLCBiYXRfd29yayk7CisJejJfYmF0dF91cGRhdGUoY2hhcmdlcik7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB6Ml9jaGFyZ2Vfc3dpdGNoX2lycShpbnQgaXJxLCB2b2lkICpkZXZpZCkKK3sKKwlzdHJ1Y3QgejJfY2hhcmdlciAqY2hhcmdlciA9IGRldmlkOworCXNjaGVkdWxlX3dvcmsoJmNoYXJnZXItPmJhdF93b3JrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgejJfYmF0dF9wc19pbml0KHN0cnVjdCB6Ml9jaGFyZ2VyICpjaGFyZ2VyLCBpbnQgcHJvcHMpCit7CisJaW50IGkgPSAwOworCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5ICpwcm9wOworCXN0cnVjdCB6Ml9iYXR0ZXJ5X2luZm8gKmluZm8gPSBjaGFyZ2VyLT5pbmZvOworCisJaWYgKGluZm8tPmNoYXJnZV9ncGlvID49IDApCisJCXByb3BzKys7CS8qIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUyAqLworCWlmIChpbmZvLT5iYXR0X3RlY2ggPj0gMCkKKwkJcHJvcHMrKzsJLyogUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWSAqLworCWlmIChpbmZvLT5iYXR0X0kyQ19yZWcgPj0gMCkKKwkJcHJvcHMrKzsJLyogUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1cgKi8KKwlpZiAoaW5mby0+bWF4X3ZvbHRhZ2UgPj0gMCkKKwkJcHJvcHMrKzsJLyogUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NQVggKi8KKwlpZiAoaW5mby0+bWluX3ZvbHRhZ2UgPj0gMCkKKwkJcHJvcHMrKzsJLyogUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU4gKi8KKworCXByb3AgPSBremFsbG9jKHByb3BzICogc2l6ZW9mKCpwcm9wKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcm9wKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByb3BbaSsrXSA9IFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ7CisJaWYgKGluZm8tPmNoYXJnZV9ncGlvID49IDApCisJCXByb3BbaSsrXSA9IFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzsKKwlpZiAoaW5mby0+YmF0dF90ZWNoID49IDApCisJCXByb3BbaSsrXSA9IFBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1k7CisJaWYgKGluZm8tPmJhdHRfSTJDX3JlZyA+PSAwKQorCQlwcm9wW2krK10gPSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzsKKwlpZiAoaW5mby0+bWF4X3ZvbHRhZ2UgPj0gMCkKKwkJcHJvcFtpKytdID0gUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NQVg7CisJaWYgKGluZm8tPm1pbl92b2x0YWdlID49IDApCisJCXByb3BbaSsrXSA9IFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOOworCisJaWYgKCFpbmZvLT5iYXR0X25hbWUpIHsKKwkJZGV2X2luZm8oJmNoYXJnZXItPmNsaWVudC0+ZGV2LAorCQkJCSJQbGVhc2UgY29uc2lkZXIgc2V0dGluZyBwcm9wZXIgYmF0dGVyeSAiCisJCQkJIm5hbWUgaW4gcGxhdGZvcm0gZGVmaW5pdGlvbiBmaWxlLCBmYWxsaW5nICIKKwkJCQkiYmFjayB0byBuYW1lIFwiIFoyX0RFRkFVTFRfTkFNRSBcIlxuIik7CisJCWNoYXJnZXItPmJhdHRfcHNfZGVzYy5uYW1lID0gWjJfREVGQVVMVF9OQU1FOworCX0gZWxzZQorCQljaGFyZ2VyLT5iYXR0X3BzX2Rlc2MubmFtZSA9IGluZm8tPmJhdHRfbmFtZTsKKworCWNoYXJnZXItPmJhdHRfcHNfZGVzYy5wcm9wZXJ0aWVzCT0gcHJvcDsKKwljaGFyZ2VyLT5iYXR0X3BzX2Rlc2MubnVtX3Byb3BlcnRpZXMJPSBwcm9wczsKKwljaGFyZ2VyLT5iYXR0X3BzX2Rlc2MudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOworCWNoYXJnZXItPmJhdHRfcHNfZGVzYy5nZXRfcHJvcGVydHkJPSB6Ml9iYXR0X2dldF9wcm9wZXJ0eTsKKwljaGFyZ2VyLT5iYXR0X3BzX2Rlc2MuZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCA9CisJCQkJCQl6Ml9iYXR0X2V4dF9wb3dlcl9jaGFuZ2VkOworCWNoYXJnZXItPmJhdHRfcHNfZGVzYy51c2VfZm9yX2FwbQk9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB6Ml9iYXR0X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCWludCByZXQgPSAwOworCWludCBwcm9wcyA9IDE7CS8qIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQgKi8KKwlzdHJ1Y3QgejJfY2hhcmdlciAqY2hhcmdlcjsKKwlzdHJ1Y3QgejJfYmF0dGVyeV9pbmZvICppbmZvID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307CisKKwlpZiAoaW5mbyA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJIlBsZWFzZSBzZXQgcGxhdGZvcm0gZGV2aWNlIHBsYXRmb3JtX2RhdGEiCisJCQkiIHRvIGEgdmFsaWQgejJfYmF0dGVyeV9pbmZvIHBvaW50ZXIhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2hhcmdlciA9IGt6YWxsb2Moc2l6ZW9mKCpjaGFyZ2VyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNoYXJnZXIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljaGFyZ2VyLT5iYXRfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOworCWNoYXJnZXItPmluZm8gPSBpbmZvOworCWNoYXJnZXItPmNsaWVudCA9IGNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBjaGFyZ2VyKTsKKwlwc3lfY2ZnLmRydl9kYXRhID0gY2hhcmdlcjsKKworCW11dGV4X2luaXQoJmNoYXJnZXItPndvcmtfbG9jayk7CisKKwlpZiAoaW5mby0+Y2hhcmdlX2dwaW8gPj0gMCAmJiBncGlvX2lzX3ZhbGlkKGluZm8tPmNoYXJnZV9ncGlvKSkgeworCQlyZXQgPSBncGlvX3JlcXVlc3QoaW5mby0+Y2hhcmdlX2dwaW8sICJCQVRUIENIUkciKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyOworCisJCXJldCA9IGdwaW9fZGlyZWN0aW9uX2lucHV0KGluZm8tPmNoYXJnZV9ncGlvKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyMjsKKworCQlpcnFfc2V0X2lycV90eXBlKGdwaW9fdG9faXJxKGluZm8tPmNoYXJnZV9ncGlvKSwKKwkJCQkgSVJRX1RZUEVfRURHRV9CT1RIKTsKKwkJcmV0ID0gcmVxdWVzdF9pcnEoZ3Bpb190b19pcnEoaW5mby0+Y2hhcmdlX2dwaW8pLAorCQkJCXoyX2NoYXJnZV9zd2l0Y2hfaXJxLCAwLAorCQkJCSJBQyBEZXRlY3QiLCBjaGFyZ2VyKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyMzsKKwl9CisKKwlyZXQgPSB6Ml9iYXR0X3BzX2luaXQoY2hhcmdlciwgcHJvcHMpOworCWlmIChyZXQpCisJCWdvdG8gZXJyMzsKKworCUlOSVRfV09SSygmY2hhcmdlci0+YmF0X3dvcmssIHoyX2JhdHRfd29yayk7CisKKwljaGFyZ2VyLT5iYXR0X3BzID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwKKwkJCQkJCSAmY2hhcmdlci0+YmF0dF9wc19kZXNjLAorCQkJCQkJICZwc3lfY2ZnKTsKKwlpZiAoSVNfRVJSKGNoYXJnZXItPmJhdHRfcHMpKSB7CisJCXJldCA9IFBUUl9FUlIoY2hhcmdlci0+YmF0dF9wcyk7CisJCWdvdG8gZXJyNDsKKwl9CisKKwlzY2hlZHVsZV93b3JrKCZjaGFyZ2VyLT5iYXRfd29yayk7CisKKwlyZXR1cm4gMDsKKworZXJyNDoKKwlrZnJlZShjaGFyZ2VyLT5iYXR0X3BzX2Rlc2MucHJvcGVydGllcyk7CitlcnIzOgorCWlmIChpbmZvLT5jaGFyZ2VfZ3BpbyA+PSAwICYmIGdwaW9faXNfdmFsaWQoaW5mby0+Y2hhcmdlX2dwaW8pKQorCQlmcmVlX2lycShncGlvX3RvX2lycShpbmZvLT5jaGFyZ2VfZ3BpbyksIGNoYXJnZXIpOworZXJyMjoKKwlpZiAoaW5mby0+Y2hhcmdlX2dwaW8gPj0gMCAmJiBncGlvX2lzX3ZhbGlkKGluZm8tPmNoYXJnZV9ncGlvKSkKKwkJZ3Bpb19mcmVlKGluZm8tPmNoYXJnZV9ncGlvKTsKK2VycjoKKwlrZnJlZShjaGFyZ2VyKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHoyX2JhdHRfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHoyX2NoYXJnZXIgKmNoYXJnZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgejJfYmF0dGVyeV9pbmZvICppbmZvID0gY2hhcmdlci0+aW5mbzsKKworCWNhbmNlbF93b3JrX3N5bmMoJmNoYXJnZXItPmJhdF93b3JrKTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihjaGFyZ2VyLT5iYXR0X3BzKTsKKworCWtmcmVlKGNoYXJnZXItPmJhdHRfcHNfZGVzYy5wcm9wZXJ0aWVzKTsKKwlpZiAoaW5mby0+Y2hhcmdlX2dwaW8gPj0gMCAmJiBncGlvX2lzX3ZhbGlkKGluZm8tPmNoYXJnZV9ncGlvKSkgeworCQlmcmVlX2lycShncGlvX3RvX2lycShpbmZvLT5jaGFyZ2VfZ3BpbyksIGNoYXJnZXIpOworCQlncGlvX2ZyZWUoaW5mby0+Y2hhcmdlX2dwaW8pOworCX0KKworCWtmcmVlKGNoYXJnZXIpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgejJfYmF0dF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB6Ml9jaGFyZ2VyICpjaGFyZ2VyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlmbHVzaF93b3JrKCZjaGFyZ2VyLT5iYXRfd29yayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgejJfYmF0dF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHoyX2NoYXJnZXIgKmNoYXJnZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXNjaGVkdWxlX3dvcmsoJmNoYXJnZXItPmJhdF93b3JrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHoyX2JhdHRlcnlfcG1fb3BzID0geworCS5zdXNwZW5kCT0gejJfYmF0dF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gejJfYmF0dF9yZXN1bWUsCit9OworCisjZGVmaW5lCVoyX0JBVFRFUllfUE1fT1BTCSgmejJfYmF0dGVyeV9wbV9vcHMpCisKKyNlbHNlCisjZGVmaW5lCVoyX0JBVFRFUllfUE1fT1BTCShOVUxMKQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB6Ml9iYXR0X2lkW10gPSB7CisJeyAiYWVyOTE1IiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCB6Ml9iYXR0X2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHoyX2JhdHRfZHJpdmVyID0geworCS5kcml2ZXIJPSB7CisJCS5uYW1lCT0gInoyLWJhdHRlcnkiLAorCQkucG0JPSBaMl9CQVRURVJZX1BNX09QUworCX0sCisJLnByb2JlCQk9IHoyX2JhdHRfcHJvYmUsCisJLnJlbW92ZQkJPSB6Ml9iYXR0X3JlbW92ZSwKKwkuaWRfdGFibGUJPSB6Ml9iYXR0X2lkLAorfTsKK21vZHVsZV9pMmNfZHJpdmVyKHoyX2JhdHRfZHJpdmVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiUGV0ZXIgRWR3YXJkcyA8c3dlZXRsaWxtcmVAZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJaaXBpdCBaMiBiYXR0ZXJ5IGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci90cHM2NTIxN19jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3RwczY1MjE3X2NoYXJnZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkZmFlNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3Bvd2VyL3RwczY1MjE3X2NoYXJnZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vKgotICogQmF0dGVyeSBjaGFyZ2VyIGRyaXZlciBmb3IgVEkncyB0cHM2NTIxNwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgQ29sbGFib3JhIEx0ZC4KLQotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLQotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotICovCi0KLS8qCi0gKiBCYXR0ZXJ5IGNoYXJnZXIgZHJpdmVyIGZvciBUSSdzIHRwczY1MjE3Ci0gKi8KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgotCi0jaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvdHBzNjUyMTcuaD4KLQotI2RlZmluZSBQT0xMX0lOVEVSVkFMCQkoSFogKiAyKQotCi1zdHJ1Y3QgdHBzNjUyMTdfY2hhcmdlciB7Ci0Jc3RydWN0IHRwczY1MjE3ICp0cHM7Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmFjOwotCi0JaW50CWFjX29ubGluZTsKLQlpbnQJcHJldl9hY19vbmxpbmU7Ci0KLQlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnBvbGxfdGFzazsKLX07Ci0KLXN0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSB0cHM2NTIxN19hY19wcm9wc1tdID0gewotCVBPV0VSX1NVUFBMWV9QUk9QX09OTElORSwKLX07Ci0KLXN0YXRpYyBpbnQgdHBzNjUyMTdfY29uZmlnX2NoYXJnZXIoc3RydWN0IHRwczY1MjE3X2NoYXJnZXIgKmNoYXJnZXIpCi17Ci0JaW50IHJldDsKLQotCWRldl9kYmcoY2hhcmdlci0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKLQotCS8qCi0JICogdHBzNjUyMTcgcmV2LiBHLCBwLiAzMSAoc2VlIHAuIDMyIGZvciBOVEMgc2NoZW1hdGljKQotCSAqCi0JICogVGhlIGRldmljZSBjYW4gYmUgY29uZmlndXJlZCB0byBzdXBwb3J0IGEgMTAwayBOVEMgKEIgPSAzOTYwKSBieQotCSAqIHNldHRpbmcgdGhlIHRoZSBOVENfVFlQRSBiaXQgaW4gcmVnaXN0ZXIgQ0hHQ09ORklHMSB0byAxLiBIb3dldmVyIGl0Ci0JICogaXMgbm90IHJlY29tbWVuZGVkIHRvIGRvIHNvLiBJbiBzbGVlcCBtb2RlLCB0aGUgY2hhcmdlciBjb250aW51ZXMKLQkgKiBjaGFyZ2luZyB0aGUgYmF0dGVyeSwgYnV0IGFsbCByZWdpc3RlciB2YWx1ZXMgYXJlIHJlc2V0IHRvIGRlZmF1bHQKLQkgKiB2YWx1ZXMuIFRoZXJlZm9yZSwgdGhlIGNoYXJnZXIgd291bGQgZ2V0IHRoZSB3cm9uZyB0ZW1wZXJhdHVyZQotCSAqIGluZm9ybWF0aW9uLiBJZiAxMDBrIE5UQyBzZXR0aW5nIGlzIHJlcXVpcmVkLCBwbGVhc2UgY29udGFjdCB0aGUKLQkgKiBmYWN0b3J5LgotCSAqCi0JICogQVRURU5USU9OLCBjb25mbGljdGluZyBpbmZvcm1hdGlvbiwgZnJvbSBwLiA0NgotCSAqCi0JICogTlRDIFRZUEUgKGZvciBiYXR0ZXJ5IHRlbXBlcmF0dXJlIG1lYXN1cmVtZW50KQotCSAqICAgMCDigJMgMTAwayAoY3VydmUgMSwgQiA9IDM5NjApCi0JICogICAxIOKAkyAxMGsgIChjdXJ2ZSAyLCBCID0gMzQ4MCkgKGRlZmF1bHQgb24gcmVzZXQpCi0JICoKLQkgKi8KLQlyZXQgPSB0cHM2NTIxN19jbGVhcl9iaXRzKGNoYXJnZXItPnRwcywgVFBTNjUyMTdfUkVHX0NIR0NPTkZJRzEsCi0JCQkJICBUUFM2NTIxN19DSEdDT05GSUcxX05UQ19UWVBFLAotCQkJCSAgVFBTNjUyMTdfUFJPVEVDVF9OT05FKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoY2hhcmdlci0+ZGV2LAotCQkJImZhaWxlZCB0byBzZXQgMTAwayBOVEMgc2V0dGluZzogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdHBzNjUyMTdfZW5hYmxlX2NoYXJnaW5nKHN0cnVjdCB0cHM2NTIxN19jaGFyZ2VyICpjaGFyZ2VyKQotewotCWludCByZXQ7Ci0KLQkvKiBjaGFyZ2VyIGFscmVhZHkgZW5hYmxlZCAqLwotCWlmIChjaGFyZ2VyLT5hY19vbmxpbmUpCi0JCXJldHVybiAwOwotCi0JZGV2X2RiZyhjaGFyZ2VyLT5kZXYsICIlczogZW5hYmxlIGNoYXJnaW5nXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0ID0gdHBzNjUyMTdfc2V0X2JpdHMoY2hhcmdlci0+dHBzLCBUUFM2NTIxN19SRUdfQ0hHQ09ORklHMSwKLQkJCQlUUFM2NTIxN19DSEdDT05GSUcxX0NIR19FTiwKLQkJCQlUUFM2NTIxN19DSEdDT05GSUcxX0NIR19FTiwKLQkJCQlUUFM2NTIxN19QUk9URUNUX05PTkUpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihjaGFyZ2VyLT5kZXYsCi0JCQkiJXM6IEVycm9yIGluIHdyaXRpbmcgQ0hHX0VOIGluIHJlZyAweCV4OiAlZFxuIiwKLQkJCV9fZnVuY19fLCBUUFM2NTIxN19SRUdfQ0hHQ09ORklHMSwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQljaGFyZ2VyLT5hY19vbmxpbmUgPSAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdHBzNjUyMTdfYWNfZ2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKLQkJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKLQkJCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCi17Ci0Jc3RydWN0IHRwczY1MjE3X2NoYXJnZXIgKmNoYXJnZXIgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKLQotCWlmIChwc3AgPT0gUE9XRVJfU1VQUExZX1BST1BfT05MSU5FKSB7Ci0JCXZhbC0+aW50dmFsID0gY2hhcmdlci0+YWNfb25saW5lOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCB0cHM2NTIxN19jaGFyZ2VyX2lycShpbnQgaXJxLCB2b2lkICpkZXYpCi17Ci0JaW50IHJldCwgdmFsOwotCXN0cnVjdCB0cHM2NTIxN19jaGFyZ2VyICpjaGFyZ2VyID0gZGV2OwotCi0JY2hhcmdlci0+cHJldl9hY19vbmxpbmUgPSBjaGFyZ2VyLT5hY19vbmxpbmU7Ci0KLQlyZXQgPSB0cHM2NTIxN19yZWdfcmVhZChjaGFyZ2VyLT50cHMsIFRQUzY1MjE3X1JFR19TVEFUVVMsICZ2YWwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY2hhcmdlci0+ZGV2LCAiJXM6IEVycm9yIGluIHJlYWRpbmcgcmVnIDB4JXhcbiIsCi0JCQlfX2Z1bmNfXywgVFBTNjUyMTdfUkVHX1NUQVRVUyk7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLQlkZXZfZGJnKGNoYXJnZXItPmRldiwgIiVzOiAweCV4XG4iLCBfX2Z1bmNfXywgdmFsKTsKLQotCS8qIGNoZWNrIGZvciBBQyBzdGF0dXMgYml0ICovCi0JaWYgKHZhbCAmIFRQUzY1MjE3X1NUQVRVU19BQ1BXUikgewotCQlyZXQgPSB0cHM2NTIxN19lbmFibGVfY2hhcmdpbmcoY2hhcmdlcik7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoY2hhcmdlci0+ZGV2LAotCQkJCSJmYWlsZWQgdG8gZW5hYmxlIGNoYXJnZXI6ICVkXG4iLCByZXQpOwotCQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCQl9Ci0JfSBlbHNlIHsKLQkJY2hhcmdlci0+YWNfb25saW5lID0gMDsKLQl9Ci0KLQlpZiAoY2hhcmdlci0+cHJldl9hY19vbmxpbmUgIT0gY2hhcmdlci0+YWNfb25saW5lKQotCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChjaGFyZ2VyLT5hYyk7Ci0KLQlyZXQgPSB0cHM2NTIxN19yZWdfcmVhZChjaGFyZ2VyLT50cHMsIFRQUzY1MjE3X1JFR19DSEdDT05GSUcwLCAmdmFsKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNoYXJnZXItPmRldiwgIiVzOiBFcnJvciBpbiByZWFkaW5nIHJlZyAweCV4XG4iLAotCQkJX19mdW5jX18sIFRQUzY1MjE3X1JFR19DSEdDT05GSUcwKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KLQotCWlmICh2YWwgJiBUUFM2NTIxN19DSEdDT05GSUcwX0FDVElWRSkKLQkJZGV2X2RiZyhjaGFyZ2VyLT5kZXYsICIlczogY2hhcmdlciBpcyBjaGFyZ2luZ1xuIiwgX19mdW5jX18pOwotCWVsc2UKLQkJZGV2X2RiZyhjaGFyZ2VyLT5kZXYsCi0JCQkiJXM6IGNoYXJnZXIgaXMgTk9UIGNoYXJnaW5nXG4iLCBfX2Z1bmNfXyk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBpbnQgdHBzNjUyMTdfY2hhcmdlcl9wb2xsX3Rhc2sodm9pZCAqZGF0YSkKLXsKLQlzZXRfZnJlZXphYmxlKCk7Ci0KLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewotCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoUE9MTF9JTlRFUlZBTCk7Ci0JCXRyeV90b19mcmVlemUoKTsKLQkJdHBzNjUyMTdfY2hhcmdlcl9pcnEoLTEsIGRhdGEpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyB0cHM2NTIxN19jaGFyZ2VyX2Rlc2MgPSB7Ci0JLm5hbWUJCQk9ICJ0cHM2NTIxNy1hYyIsCi0JLnR5cGUJCQk9IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TLAotCS5nZXRfcHJvcGVydHkJCT0gdHBzNjUyMTdfYWNfZ2V0X3Byb3BlcnR5LAotCS5wcm9wZXJ0aWVzCQk9IHRwczY1MjE3X2FjX3Byb3BzLAotCS5udW1fcHJvcGVydGllcwkJPSBBUlJBWV9TSVpFKHRwczY1MjE3X2FjX3Byb3BzKSwKLX07Ci0KLXN0YXRpYyBpbnQgdHBzNjUyMTdfY2hhcmdlcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCB0cHM2NTIxNyAqdHBzID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwotCXN0cnVjdCB0cHM2NTIxN19jaGFyZ2VyICpjaGFyZ2VyOwotCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIGNmZyA9IHt9OwotCWludCByZXQ7Ci0KLQlkZXZfZGJnKCZwZGV2LT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwotCi0JY2hhcmdlciA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmNoYXJnZXIpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNoYXJnZXIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JY2hhcmdlci0+dHBzID0gdHBzOwotCWNoYXJnZXItPmRldiA9ICZwZGV2LT5kZXY7Ci0KLQljZmcub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwotCWNmZy5kcnZfZGF0YSA9IGNoYXJnZXI7Ci0KLQljaGFyZ2VyLT5hYyA9IGRldm1fcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsCi0JCQkJCQkgJnRwczY1MjE3X2NoYXJnZXJfZGVzYywKLQkJCQkJCSAmY2ZnKTsKLQlpZiAoSVNfRVJSKGNoYXJnZXItPmFjKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQ6IHBvd2VyIHN1cHBseSByZWdpc3RlclxuIik7Ci0JCXJldHVybiBQVFJfRVJSKGNoYXJnZXItPmFjKTsKLQl9Ci0KLQlyZXQgPSB0cHM2NTIxN19jb25maWdfY2hhcmdlcihjaGFyZ2VyKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNoYXJnZXItPmRldiwgImNoYXJnZXIgY29uZmlnIGZhaWxlZCwgZXJyICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWNoYXJnZXItPnBvbGxfdGFzayA9IGt0aHJlYWRfcnVuKHRwczY1MjE3X2NoYXJnZXJfcG9sbF90YXNrLAotCQkJCSAgICAgIGNoYXJnZXIsICJrdHBzNjUyMTdjaGFyZ2VyIik7Ci0JaWYgKElTX0VSUihjaGFyZ2VyLT5wb2xsX3Rhc2spKSB7Ci0JCXJldCA9IFBUUl9FUlIoY2hhcmdlci0+cG9sbF90YXNrKTsKLQkJZGV2X2VycihjaGFyZ2VyLT5kZXYsICJVbmFibGUgdG8gcnVuIGt0aHJlYWQgZXJyICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRwczY1MjE3X2NoYXJnZXJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHRwczY1MjE3X2NoYXJnZXIgKmNoYXJnZXIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWt0aHJlYWRfc3RvcChjaGFyZ2VyLT5wb2xsX3Rhc2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHRwczY1MjE3X2NoYXJnZXJfbWF0Y2hfdGFibGVbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInRpLHRwczY1MjE3LWNoYXJnZXIiLCB9LAotCXsgLyogc2VudGluZWwgKi8gfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHRwczY1MjE3X2NoYXJnZXJfbWF0Y2hfdGFibGUpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0cHM2NTIxN19jaGFyZ2VyX2RyaXZlciA9IHsKLQkucHJvYmUJPSB0cHM2NTIxN19jaGFyZ2VyX3Byb2JlLAotCS5yZW1vdmUgPSB0cHM2NTIxN19jaGFyZ2VyX3JlbW92ZSwKLQkuZHJpdmVyCT0gewotCQkubmFtZQk9ICJ0cHM2NTIxNy1jaGFyZ2VyIiwKLQkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHRwczY1MjE3X2NoYXJnZXJfbWF0Y2hfdGFibGUpLAotCX0sCi0KLX07Ci1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHRwczY1MjE3X2NoYXJnZXJfZHJpdmVyKTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotTU9EVUxFX0FVVEhPUigiRW5yaWMgQmFsbGV0Ym8gU2VycmEgPGVucmljLmJhbGxldGJvQGNvbGxhYm9yYS5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlRQUzY1MjE3IGJhdHRlcnkgY2hhcmdlciBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvd205N3h4X2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvd205N3h4X2JhdHRlcnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJmMDllZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3Bvd2VyL3dtOTd4eF9iYXR0ZXJ5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2RyaXZlcnMvcG93ZXIvd205N3h4X2JhdHRlcnkuYwotICoKLSAqIEJhdHRlcnkgbWVhc3VyZW1lbnQgY29kZSBmb3IgV005N3h4Ci0gKgotICogYmFzZWQgb24gdG9zYV9iYXR0ZXJ5LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggTWFyZWsgVmFzdXQgPG1hcmVrLnZhc3V0QGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgotI2luY2x1ZGUgPGxpbnV4L3dtOTd4eC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLQotc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBiYXRfd29yazsKLXN0YXRpYyBERUZJTkVfTVVURVgod29ya19sb2NrKTsKLXN0YXRpYyBpbnQgYmF0X3N0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfVU5LTk9XTjsKLXN0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSAqcHJvcDsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgd205N3h4X3JlYWRfYmF0KHN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdF9wcykKLXsKLQlzdHJ1Y3Qgd205N3h4X3BkYXRhICp3bWRhdGEgPSBiYXRfcHMtPmRldi5wYXJlbnQtPnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IHdtOTd4eF9iYXR0X3BkYXRhICpwZGF0YSA9IHdtZGF0YS0+YmF0dF9wZGF0YTsKLQotCXJldHVybiB3bTk3eHhfcmVhZF9hdXhfYWRjKGRldl9nZXRfZHJ2ZGF0YShiYXRfcHMtPmRldi5wYXJlbnQpLAotCQkJCQlwZGF0YS0+YmF0dF9hdXgpICogcGRhdGEtPmJhdHRfbXVsdCAvCi0JCQkJCXBkYXRhLT5iYXR0X2RpdjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgd205N3h4X3JlYWRfdGVtcChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXRfcHMpCi17Ci0Jc3RydWN0IHdtOTd4eF9wZGF0YSAqd21kYXRhID0gYmF0X3BzLT5kZXYucGFyZW50LT5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCB3bTk3eHhfYmF0dF9wZGF0YSAqcGRhdGEgPSB3bWRhdGEtPmJhdHRfcGRhdGE7Ci0KLQlyZXR1cm4gd205N3h4X3JlYWRfYXV4X2FkYyhkZXZfZ2V0X2RydmRhdGEoYmF0X3BzLT5kZXYucGFyZW50KSwKLQkJCQkJcGRhdGEtPnRlbXBfYXV4KSAqIHBkYXRhLT50ZW1wX211bHQgLwotCQkJCQlwZGF0YS0+dGVtcF9kaXY7Ci19Ci0KLXN0YXRpYyBpbnQgd205N3h4X2JhdF9nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0X3BzLAotCQkJICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKLQkJCSAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQotewotCXN0cnVjdCB3bTk3eHhfcGRhdGEgKndtZGF0YSA9IGJhdF9wcy0+ZGV2LnBhcmVudC0+cGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3Qgd205N3h4X2JhdHRfcGRhdGEgKnBkYXRhID0gd21kYXRhLT5iYXR0X3BkYXRhOwotCi0Jc3dpdGNoIChwc3ApIHsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKLQkJdmFsLT5pbnR2YWwgPSBiYXRfc3RhdHVzOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1k6Ci0JCXZhbC0+aW50dmFsID0gcGRhdGEtPmJhdHRfdGVjaDsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKLQkJaWYgKHBkYXRhLT5iYXR0X2F1eCA+PSAwKQotCQkJdmFsLT5pbnR2YWwgPSB3bTk3eHhfcmVhZF9iYXQoYmF0X3BzKTsKLQkJZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUDoKLQkJaWYgKHBkYXRhLT50ZW1wX2F1eCA+PSAwKQotCQkJdmFsLT5pbnR2YWwgPSB3bTk3eHhfcmVhZF90ZW1wKGJhdF9wcyk7Ci0JCWVsc2UKLQkJCXJldHVybiAtRUlOVkFMOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYOgotCQlpZiAocGRhdGEtPm1heF92b2x0YWdlID49IDApCi0JCQl2YWwtPmludHZhbCA9IHBkYXRhLT5tYXhfdm9sdGFnZTsKLQkJZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU46Ci0JCWlmIChwZGF0YS0+bWluX3ZvbHRhZ2UgPj0gMCkKLQkJCXZhbC0+aW50dmFsID0gcGRhdGEtPm1pbl92b2x0YWdlOwotCQllbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOgotCQl2YWwtPmludHZhbCA9IDE7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgd205N3h4X2JhdF9leHRlcm5hbF9wb3dlcl9jaGFuZ2VkKHN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdF9wcykKLXsKLQlzY2hlZHVsZV93b3JrKCZiYXRfd29yayk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdtOTd4eF9iYXRfdXBkYXRlKHN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdF9wcykKLXsKLQlpbnQgb2xkX3N0YXR1cyA9IGJhdF9zdGF0dXM7Ci0Jc3RydWN0IHdtOTd4eF9wZGF0YSAqd21kYXRhID0gYmF0X3BzLT5kZXYucGFyZW50LT5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCB3bTk3eHhfYmF0dF9wZGF0YSAqcGRhdGEgPSB3bWRhdGEtPmJhdHRfcGRhdGE7Ci0KLQltdXRleF9sb2NrKCZ3b3JrX2xvY2spOwotCi0JYmF0X3N0YXR1cyA9IChwZGF0YS0+Y2hhcmdlX2dwaW8gPj0gMCkgPwotCQkJKGdwaW9fZ2V0X3ZhbHVlKHBkYXRhLT5jaGFyZ2VfZ3BpbykgPwotCQkJUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORyA6Ci0JCQlQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HKSA6Ci0JCQlQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047Ci0KLQlpZiAob2xkX3N0YXR1cyAhPSBiYXRfc3RhdHVzKSB7Ci0JCXByX2RlYnVnKCIlczogJWkgLT4gJWlcbiIsIGJhdF9wcy0+ZGVzYy0+bmFtZSwgb2xkX3N0YXR1cywKLQkJCQkJYmF0X3N0YXR1cyk7Ci0JCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGJhdF9wcyk7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZ3b3JrX2xvY2spOwotfQotCi1zdGF0aWMgc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0X3BzeTsKLXN0YXRpYyBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgYmF0X3BzeV9kZXNjID0gewotCS50eXBlCQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZLAotCS5nZXRfcHJvcGVydHkJCT0gd205N3h4X2JhdF9nZXRfcHJvcGVydHksCi0JLmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQgPSB3bTk3eHhfYmF0X2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQsCi0JLnVzZV9mb3JfYXBtCQk9IDEsCi19OwotCi1zdGF0aWMgdm9pZCB3bTk3eHhfYmF0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXdtOTd4eF9iYXRfdXBkYXRlKGJhdF9wc3kpOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3Qgd205N3h4X2NocmdfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCi17Ci0Jc2NoZWR1bGVfd29yaygmYmF0X3dvcmspOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCB3bTk3eHhfYmF0X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCWZsdXNoX3dvcmsoJmJhdF93b3JrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3bTk3eHhfYmF0X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc2NoZWR1bGVfd29yaygmYmF0X3dvcmspOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgd205N3h4X2JhdF9wbV9vcHMgPSB7Ci0JLnN1c3BlbmQJPSB3bTk3eHhfYmF0X3N1c3BlbmQsCi0JLnJlc3VtZQkJPSB3bTk3eHhfYmF0X3Jlc3VtZSwKLX07Ci0jZW5kaWYKLQotc3RhdGljIGludCB3bTk3eHhfYmF0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgcHJvcHMgPSAxOwkvKiBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UICovCi0JaW50IGkgPSAwOwotCXN0cnVjdCB3bTk3eHhfcGRhdGEgKndtZGF0YSA9IGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IHdtOTd4eF9iYXR0X3BkYXRhICpwZGF0YTsKLQotCWlmICghd21kYXRhKSB7Ci0JCWRldl9lcnIoJmRldi0+ZGV2LCAiTm8gcGxhdGZvcm0gZGF0YSBzdXBwbGllZFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXBkYXRhID0gd21kYXRhLT5iYXR0X3BkYXRhOwotCi0JaWYgKGRldi0+aWQgIT0gLTEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCFwZGF0YSkgewotCQlkZXZfZXJyKCZkZXYtPmRldiwgIk5vIHBsYXRmb3JtX2RhdGEgc3VwcGxpZWRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoZ3Bpb19pc192YWxpZChwZGF0YS0+Y2hhcmdlX2dwaW8pKSB7Ci0JCXJldCA9IGdwaW9fcmVxdWVzdChwZGF0YS0+Y2hhcmdlX2dwaW8sICJCQVRUIENIUkciKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyOwotCQlyZXQgPSBncGlvX2RpcmVjdGlvbl9pbnB1dChwZGF0YS0+Y2hhcmdlX2dwaW8pOwotCQlpZiAocmV0KQotCQkJZ290byBlcnIyOwotCQlyZXQgPSByZXF1ZXN0X2lycShncGlvX3RvX2lycShwZGF0YS0+Y2hhcmdlX2dwaW8pLAotCQkJCXdtOTd4eF9jaHJnX2lycSwgMCwKLQkJCQkiQUMgRGV0ZWN0IiwgZGV2KTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyMjsKLQkJcHJvcHMrKzsJLyogUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTICovCi0JfQotCi0JaWYgKHBkYXRhLT5iYXR0X3RlY2ggPj0gMCkKLQkJcHJvcHMrKzsJLyogUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWSAqLwotCWlmIChwZGF0YS0+dGVtcF9hdXggPj0gMCkKLQkJcHJvcHMrKzsJLyogUE9XRVJfU1VQUExZX1BST1BfVEVNUCAqLwotCWlmIChwZGF0YS0+YmF0dF9hdXggPj0gMCkKLQkJcHJvcHMrKzsJLyogUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1cgKi8KLQlpZiAocGRhdGEtPm1heF92b2x0YWdlID49IDApCi0JCXByb3BzKys7CS8qIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYICovCi0JaWYgKHBkYXRhLT5taW5fdm9sdGFnZSA+PSAwKQotCQlwcm9wcysrOwkvKiBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTiAqLwotCi0JcHJvcCA9IGt6YWxsb2MocHJvcHMgKiBzaXplb2YoKnByb3ApLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByb3ApIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnIzOwotCX0KLQotCXByb3BbaSsrXSA9IFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ7Ci0JaWYgKHBkYXRhLT5jaGFyZ2VfZ3BpbyA+PSAwKQotCQlwcm9wW2krK10gPSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM7Ci0JaWYgKHBkYXRhLT5iYXR0X3RlY2ggPj0gMCkKLQkJcHJvcFtpKytdID0gUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWTsKLQlpZiAocGRhdGEtPnRlbXBfYXV4ID49IDApCi0JCXByb3BbaSsrXSA9IFBPV0VSX1NVUFBMWV9QUk9QX1RFTVA7Ci0JaWYgKHBkYXRhLT5iYXR0X2F1eCA+PSAwKQotCQlwcm9wW2krK10gPSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzsKLQlpZiAocGRhdGEtPm1heF92b2x0YWdlID49IDApCi0JCXByb3BbaSsrXSA9IFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYOwotCWlmIChwZGF0YS0+bWluX3ZvbHRhZ2UgPj0gMCkKLQkJcHJvcFtpKytdID0gUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU47Ci0KLQlJTklUX1dPUksoJmJhdF93b3JrLCB3bTk3eHhfYmF0X3dvcmspOwotCi0JaWYgKCFwZGF0YS0+YmF0dF9uYW1lKSB7Ci0JCWRldl9pbmZvKCZkZXYtPmRldiwgIlBsZWFzZSBjb25zaWRlciBzZXR0aW5nIHByb3BlciBiYXR0ZXJ5ICIKLQkJCQkibmFtZSBpbiBwbGF0Zm9ybSBkZWZpbml0aW9uIGZpbGUsIGZhbGxpbmcgIgotCQkJCSJiYWNrIHRvIG5hbWUgXCJ3bTk3eHgtYmF0dFwiXG4iKTsKLQkJYmF0X3BzeV9kZXNjLm5hbWUgPSAid205N3h4LWJhdHQiOwotCX0gZWxzZQotCQliYXRfcHN5X2Rlc2MubmFtZSA9IHBkYXRhLT5iYXR0X25hbWU7Ci0KLQliYXRfcHN5X2Rlc2MucHJvcGVydGllcyA9IHByb3A7Ci0JYmF0X3BzeV9kZXNjLm51bV9wcm9wZXJ0aWVzID0gcHJvcHM7Ci0KLQliYXRfcHN5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZkZXYtPmRldiwgJmJhdF9wc3lfZGVzYywgTlVMTCk7Ci0JaWYgKCFJU19FUlIoYmF0X3BzeSkpIHsKLQkJc2NoZWR1bGVfd29yaygmYmF0X3dvcmspOwotCX0gZWxzZSB7Ci0JCXJldCA9IFBUUl9FUlIoYmF0X3BzeSk7Ci0JCWdvdG8gZXJyNDsKLQl9Ci0KLQlyZXR1cm4gMDsKLWVycjQ6Ci0Ja2ZyZWUocHJvcCk7Ci1lcnIzOgotCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT5jaGFyZ2VfZ3BpbykpCi0JCWZyZWVfaXJxKGdwaW9fdG9faXJxKHBkYXRhLT5jaGFyZ2VfZ3BpbyksIGRldik7Ci1lcnIyOgotCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT5jaGFyZ2VfZ3BpbykpCi0JCWdwaW9fZnJlZShwZGF0YS0+Y2hhcmdlX2dwaW8pOwotZXJyOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd205N3h4X2JhdF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQotewotCXN0cnVjdCB3bTk3eHhfcGRhdGEgKndtZGF0YSA9IGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IHdtOTd4eF9iYXR0X3BkYXRhICpwZGF0YSA9IHdtZGF0YS0+YmF0dF9wZGF0YTsKLQotCWlmIChwZGF0YSAmJiBncGlvX2lzX3ZhbGlkKHBkYXRhLT5jaGFyZ2VfZ3BpbykpIHsKLQkJZnJlZV9pcnEoZ3Bpb190b19pcnEocGRhdGEtPmNoYXJnZV9ncGlvKSwgZGV2KTsKLQkJZ3Bpb19mcmVlKHBkYXRhLT5jaGFyZ2VfZ3Bpbyk7Ci0JfQotCWNhbmNlbF93b3JrX3N5bmMoJmJhdF93b3JrKTsKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihiYXRfcHN5KTsKLQlrZnJlZShwcm9wKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgd205N3h4X2JhdF9kcml2ZXIgPSB7Ci0JLmRyaXZlcgk9IHsKLQkJLm5hbWUJPSAid205N3h4LWJhdHRlcnkiLAotI2lmZGVmIENPTkZJR19QTQotCQkucG0JPSAmd205N3h4X2JhdF9wbV9vcHMsCi0jZW5kaWYKLQl9LAotCS5wcm9iZQkJPSB3bTk3eHhfYmF0X3Byb2JlLAotCS5yZW1vdmUJCT0gd205N3h4X2JhdF9yZW1vdmUsCi19OwotCi1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHdtOTd4eF9iYXRfZHJpdmVyKTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiTWFyZWsgVmFzdXQgPG1hcmVrLnZhc3V0QGdtYWlsLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiV005N3h4IGJhdHRlcnkgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3oyX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvejJfYmF0dGVyeS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjAxZTNmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvcG93ZXIvejJfYmF0dGVyeS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8qCi0gKiBCYXR0ZXJ5IG1lYXN1cmVtZW50IGNvZGUgZm9yIFppcGl0IFoyCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFBldGVyIEVkd2FyZHMgPHN3ZWV0bGlsbXJlQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC96Ml9iYXR0ZXJ5Lmg+Ci0KLSNkZWZpbmUJWjJfREVGQVVMVF9OQU1FCSJaMiIKLQotc3RydWN0IHoyX2NoYXJnZXIgewotCXN0cnVjdCB6Ml9iYXR0ZXJ5X2luZm8JCSppbmZvOwotCWludAkJCQliYXRfc3RhdHVzOwotCXN0cnVjdCBpMmNfY2xpZW50CQkqY2xpZW50OwotCXN0cnVjdCBwb3dlcl9zdXBwbHkJCSpiYXR0X3BzOwotCXN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYwliYXR0X3BzX2Rlc2M7Ci0Jc3RydWN0IG11dGV4CQkJd29ya19sb2NrOwotCXN0cnVjdCB3b3JrX3N0cnVjdAkJYmF0X3dvcms7Ci19OwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB6Ml9yZWFkX2JhdChzdHJ1Y3QgejJfY2hhcmdlciAqY2hhcmdlcikKLXsKLQlpbnQgZGF0YTsKLQlkYXRhID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNoYXJnZXItPmNsaWVudCwKLQkJCQkJY2hhcmdlci0+aW5mby0+YmF0dF9JMkNfcmVnKTsKLQlpZiAoZGF0YSA8IDApCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIGRhdGEgKiBjaGFyZ2VyLT5pbmZvLT5iYXR0X211bHQgLyBjaGFyZ2VyLT5pbmZvLT5iYXR0X2RpdjsKLX0KLQotc3RhdGljIGludCB6Ml9iYXR0X2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXR0X3BzLAotCQkJICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKLQkJCSAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQotewotCXN0cnVjdCB6Ml9jaGFyZ2VyICpjaGFyZ2VyID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKGJhdHRfcHMpOwotCXN0cnVjdCB6Ml9iYXR0ZXJ5X2luZm8gKmluZm8gPSBjaGFyZ2VyLT5pbmZvOwotCi0Jc3dpdGNoIChwc3ApIHsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKLQkJdmFsLT5pbnR2YWwgPSBjaGFyZ2VyLT5iYXRfc3RhdHVzOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1k6Ci0JCXZhbC0+aW50dmFsID0gaW5mby0+YmF0dF90ZWNoOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XOgotCQlpZiAoaW5mby0+YmF0dF9JMkNfcmVnID49IDApCi0JCQl2YWwtPmludHZhbCA9IHoyX3JlYWRfYmF0KGNoYXJnZXIpOwotCQllbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWDoKLQkJaWYgKGluZm8tPm1heF92b2x0YWdlID49IDApCi0JCQl2YWwtPmludHZhbCA9IGluZm8tPm1heF92b2x0YWdlOwotCQllbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTjoKLQkJaWYgKGluZm8tPm1pbl92b2x0YWdlID49IDApCi0JCQl2YWwtPmludHZhbCA9IGluZm8tPm1pbl92b2x0YWdlOwotCQllbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOgotCQl2YWwtPmludHZhbCA9IDE7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB6Ml9iYXR0X2V4dF9wb3dlcl9jaGFuZ2VkKHN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdHRfcHMpCi17Ci0Jc3RydWN0IHoyX2NoYXJnZXIgKmNoYXJnZXIgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEoYmF0dF9wcyk7Ci0KLQlzY2hlZHVsZV93b3JrKCZjaGFyZ2VyLT5iYXRfd29yayk7Ci19Ci0KLXN0YXRpYyB2b2lkIHoyX2JhdHRfdXBkYXRlKHN0cnVjdCB6Ml9jaGFyZ2VyICpjaGFyZ2VyKQotewotCWludCBvbGRfc3RhdHVzID0gY2hhcmdlci0+YmF0X3N0YXR1czsKLQlzdHJ1Y3QgejJfYmF0dGVyeV9pbmZvICppbmZvOwotCi0JaW5mbyA9IGNoYXJnZXItPmluZm87Ci0KLQltdXRleF9sb2NrKCZjaGFyZ2VyLT53b3JrX2xvY2spOwotCi0JY2hhcmdlci0+YmF0X3N0YXR1cyA9IChpbmZvLT5jaGFyZ2VfZ3BpbyA+PSAwKSA/Ci0JCShncGlvX2dldF92YWx1ZShpbmZvLT5jaGFyZ2VfZ3BpbykgPwotCQlQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HIDoKLQkJUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORykgOgotCQlQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047Ci0KLQlpZiAob2xkX3N0YXR1cyAhPSBjaGFyZ2VyLT5iYXRfc3RhdHVzKSB7Ci0JCXByX2RlYnVnKCIlczogJWkgLT4gJWlcbiIsIGNoYXJnZXItPmJhdHRfcHMtPmRlc2MtPm5hbWUsCi0JCQkJb2xkX3N0YXR1cywKLQkJCQljaGFyZ2VyLT5iYXRfc3RhdHVzKTsKLQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoY2hhcmdlci0+YmF0dF9wcyk7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZjaGFyZ2VyLT53b3JrX2xvY2spOwotfQotCi1zdGF0aWMgdm9pZCB6Ml9iYXR0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCB6Ml9jaGFyZ2VyICpjaGFyZ2VyOwotCWNoYXJnZXIgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHoyX2NoYXJnZXIsIGJhdF93b3JrKTsKLQl6Ml9iYXR0X3VwZGF0ZShjaGFyZ2VyKTsKLX0KLQotc3RhdGljIGlycXJldHVybl90IHoyX2NoYXJnZV9zd2l0Y2hfaXJxKGludCBpcnEsIHZvaWQgKmRldmlkKQotewotCXN0cnVjdCB6Ml9jaGFyZ2VyICpjaGFyZ2VyID0gZGV2aWQ7Ci0Jc2NoZWR1bGVfd29yaygmY2hhcmdlci0+YmF0X3dvcmspOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIGludCB6Ml9iYXR0X3BzX2luaXQoc3RydWN0IHoyX2NoYXJnZXIgKmNoYXJnZXIsIGludCBwcm9wcykKLXsKLQlpbnQgaSA9IDA7Ci0JZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgKnByb3A7Ci0Jc3RydWN0IHoyX2JhdHRlcnlfaW5mbyAqaW5mbyA9IGNoYXJnZXItPmluZm87Ci0KLQlpZiAoaW5mby0+Y2hhcmdlX2dwaW8gPj0gMCkKLQkJcHJvcHMrKzsJLyogUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTICovCi0JaWYgKGluZm8tPmJhdHRfdGVjaCA+PSAwKQotCQlwcm9wcysrOwkvKiBQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZICovCi0JaWYgKGluZm8tPmJhdHRfSTJDX3JlZyA+PSAwKQotCQlwcm9wcysrOwkvKiBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVyAqLwotCWlmIChpbmZvLT5tYXhfdm9sdGFnZSA+PSAwKQotCQlwcm9wcysrOwkvKiBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWCAqLwotCWlmIChpbmZvLT5taW5fdm9sdGFnZSA+PSAwKQotCQlwcm9wcysrOwkvKiBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTiAqLwotCi0JcHJvcCA9IGt6YWxsb2MocHJvcHMgKiBzaXplb2YoKnByb3ApLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByb3ApCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcHJvcFtpKytdID0gUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDsKLQlpZiAoaW5mby0+Y2hhcmdlX2dwaW8gPj0gMCkKLQkJcHJvcFtpKytdID0gUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOwotCWlmIChpbmZvLT5iYXR0X3RlY2ggPj0gMCkKLQkJcHJvcFtpKytdID0gUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWTsKLQlpZiAoaW5mby0+YmF0dF9JMkNfcmVnID49IDApCi0JCXByb3BbaSsrXSA9IFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XOwotCWlmIChpbmZvLT5tYXhfdm9sdGFnZSA+PSAwKQotCQlwcm9wW2krK10gPSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWDsKLQlpZiAoaW5mby0+bWluX3ZvbHRhZ2UgPj0gMCkKLQkJcHJvcFtpKytdID0gUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU47Ci0KLQlpZiAoIWluZm8tPmJhdHRfbmFtZSkgewotCQlkZXZfaW5mbygmY2hhcmdlci0+Y2xpZW50LT5kZXYsCi0JCQkJIlBsZWFzZSBjb25zaWRlciBzZXR0aW5nIHByb3BlciBiYXR0ZXJ5ICIKLQkJCQkibmFtZSBpbiBwbGF0Zm9ybSBkZWZpbml0aW9uIGZpbGUsIGZhbGxpbmcgIgotCQkJCSJiYWNrIHRvIG5hbWUgXCIgWjJfREVGQVVMVF9OQU1FIFwiXG4iKTsKLQkJY2hhcmdlci0+YmF0dF9wc19kZXNjLm5hbWUgPSBaMl9ERUZBVUxUX05BTUU7Ci0JfSBlbHNlCi0JCWNoYXJnZXItPmJhdHRfcHNfZGVzYy5uYW1lID0gaW5mby0+YmF0dF9uYW1lOwotCi0JY2hhcmdlci0+YmF0dF9wc19kZXNjLnByb3BlcnRpZXMJPSBwcm9wOwotCWNoYXJnZXItPmJhdHRfcHNfZGVzYy5udW1fcHJvcGVydGllcwk9IHByb3BzOwotCWNoYXJnZXItPmJhdHRfcHNfZGVzYy50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7Ci0JY2hhcmdlci0+YmF0dF9wc19kZXNjLmdldF9wcm9wZXJ0eQk9IHoyX2JhdHRfZ2V0X3Byb3BlcnR5OwotCWNoYXJnZXItPmJhdHRfcHNfZGVzYy5leHRlcm5hbF9wb3dlcl9jaGFuZ2VkID0KLQkJCQkJCXoyX2JhdHRfZXh0X3Bvd2VyX2NoYW5nZWQ7Ci0JY2hhcmdlci0+YmF0dF9wc19kZXNjLnVzZV9mb3JfYXBtCT0gMTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHoyX2JhdHRfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IHByb3BzID0gMTsJLyogUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCAqLwotCXN0cnVjdCB6Ml9jaGFyZ2VyICpjaGFyZ2VyOwotCXN0cnVjdCB6Ml9iYXR0ZXJ5X2luZm8gKmluZm8gPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKLQotCWlmIChpbmZvID09IE5VTEwpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsCi0JCQkiUGxlYXNlIHNldCBwbGF0Zm9ybSBkZXZpY2UgcGxhdGZvcm1fZGF0YSIKLQkJCSIgdG8gYSB2YWxpZCB6Ml9iYXR0ZXJ5X2luZm8gcG9pbnRlciFcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQljaGFyZ2VyID0ga3phbGxvYyhzaXplb2YoKmNoYXJnZXIpLCBHRlBfS0VSTkVMKTsKLQlpZiAoY2hhcmdlciA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWNoYXJnZXItPmJhdF9zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047Ci0JY2hhcmdlci0+aW5mbyA9IGluZm87Ci0JY2hhcmdlci0+Y2xpZW50ID0gY2xpZW50OwotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGNoYXJnZXIpOwotCXBzeV9jZmcuZHJ2X2RhdGEgPSBjaGFyZ2VyOwotCi0JbXV0ZXhfaW5pdCgmY2hhcmdlci0+d29ya19sb2NrKTsKLQotCWlmIChpbmZvLT5jaGFyZ2VfZ3BpbyA+PSAwICYmIGdwaW9faXNfdmFsaWQoaW5mby0+Y2hhcmdlX2dwaW8pKSB7Ci0JCXJldCA9IGdwaW9fcmVxdWVzdChpbmZvLT5jaGFyZ2VfZ3BpbywgIkJBVFQgQ0hSRyIpOwotCQlpZiAocmV0KQotCQkJZ290byBlcnI7Ci0KLQkJcmV0ID0gZ3Bpb19kaXJlY3Rpb25faW5wdXQoaW5mby0+Y2hhcmdlX2dwaW8pOwotCQlpZiAocmV0KQotCQkJZ290byBlcnIyOwotCi0JCWlycV9zZXRfaXJxX3R5cGUoZ3Bpb190b19pcnEoaW5mby0+Y2hhcmdlX2dwaW8pLAotCQkJCSBJUlFfVFlQRV9FREdFX0JPVEgpOwotCQlyZXQgPSByZXF1ZXN0X2lycShncGlvX3RvX2lycShpbmZvLT5jaGFyZ2VfZ3BpbyksCi0JCQkJejJfY2hhcmdlX3N3aXRjaF9pcnEsIDAsCi0JCQkJIkFDIERldGVjdCIsIGNoYXJnZXIpOwotCQlpZiAocmV0KQotCQkJZ290byBlcnIzOwotCX0KLQotCXJldCA9IHoyX2JhdHRfcHNfaW5pdChjaGFyZ2VyLCBwcm9wcyk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnIzOwotCi0JSU5JVF9XT1JLKCZjaGFyZ2VyLT5iYXRfd29yaywgejJfYmF0dF93b3JrKTsKLQotCWNoYXJnZXItPmJhdHRfcHMgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LAotCQkJCQkJICZjaGFyZ2VyLT5iYXR0X3BzX2Rlc2MsCi0JCQkJCQkgJnBzeV9jZmcpOwotCWlmIChJU19FUlIoY2hhcmdlci0+YmF0dF9wcykpIHsKLQkJcmV0ID0gUFRSX0VSUihjaGFyZ2VyLT5iYXR0X3BzKTsKLQkJZ290byBlcnI0OwotCX0KLQotCXNjaGVkdWxlX3dvcmsoJmNoYXJnZXItPmJhdF93b3JrKTsKLQotCXJldHVybiAwOwotCi1lcnI0OgotCWtmcmVlKGNoYXJnZXItPmJhdHRfcHNfZGVzYy5wcm9wZXJ0aWVzKTsKLWVycjM6Ci0JaWYgKGluZm8tPmNoYXJnZV9ncGlvID49IDAgJiYgZ3Bpb19pc192YWxpZChpbmZvLT5jaGFyZ2VfZ3BpbykpCi0JCWZyZWVfaXJxKGdwaW9fdG9faXJxKGluZm8tPmNoYXJnZV9ncGlvKSwgY2hhcmdlcik7Ci1lcnIyOgotCWlmIChpbmZvLT5jaGFyZ2VfZ3BpbyA+PSAwICYmIGdwaW9faXNfdmFsaWQoaW5mby0+Y2hhcmdlX2dwaW8pKQotCQlncGlvX2ZyZWUoaW5mby0+Y2hhcmdlX2dwaW8pOwotZXJyOgotCWtmcmVlKGNoYXJnZXIpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgejJfYmF0dF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgejJfY2hhcmdlciAqY2hhcmdlciA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCXN0cnVjdCB6Ml9iYXR0ZXJ5X2luZm8gKmluZm8gPSBjaGFyZ2VyLT5pbmZvOwotCi0JY2FuY2VsX3dvcmtfc3luYygmY2hhcmdlci0+YmF0X3dvcmspOwotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGNoYXJnZXItPmJhdHRfcHMpOwotCi0Ja2ZyZWUoY2hhcmdlci0+YmF0dF9wc19kZXNjLnByb3BlcnRpZXMpOwotCWlmIChpbmZvLT5jaGFyZ2VfZ3BpbyA+PSAwICYmIGdwaW9faXNfdmFsaWQoaW5mby0+Y2hhcmdlX2dwaW8pKSB7Ci0JCWZyZWVfaXJxKGdwaW9fdG9faXJxKGluZm8tPmNoYXJnZV9ncGlvKSwgY2hhcmdlcik7Ci0JCWdwaW9fZnJlZShpbmZvLT5jaGFyZ2VfZ3Bpbyk7Ci0JfQotCi0Ja2ZyZWUoY2hhcmdlcik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCB6Ml9iYXR0X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IHoyX2NoYXJnZXIgKmNoYXJnZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQotCWZsdXNoX3dvcmsoJmNoYXJnZXItPmJhdF93b3JrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB6Ml9iYXR0X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgejJfY2hhcmdlciAqY2hhcmdlciA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCi0Jc2NoZWR1bGVfd29yaygmY2hhcmdlci0+YmF0X3dvcmspOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgejJfYmF0dGVyeV9wbV9vcHMgPSB7Ci0JLnN1c3BlbmQJPSB6Ml9iYXR0X3N1c3BlbmQsCi0JLnJlc3VtZQkJPSB6Ml9iYXR0X3Jlc3VtZSwKLX07Ci0KLSNkZWZpbmUJWjJfQkFUVEVSWV9QTV9PUFMJKCZ6Ml9iYXR0ZXJ5X3BtX29wcykKLQotI2Vsc2UKLSNkZWZpbmUJWjJfQkFUVEVSWV9QTV9PUFMJKE5VTEwpCi0jZW5kaWYKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHoyX2JhdHRfaWRbXSA9IHsKLQl7ICJhZXI5MTUiLCAwIH0sCi0JeyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHoyX2JhdHRfaWQpOwotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgejJfYmF0dF9kcml2ZXIgPSB7Ci0JLmRyaXZlcgk9IHsKLQkJLm5hbWUJPSAiejItYmF0dGVyeSIsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCQkucG0JPSBaMl9CQVRURVJZX1BNX09QUwotCX0sCi0JLnByb2JlCQk9IHoyX2JhdHRfcHJvYmUsCi0JLnJlbW92ZQkJPSB6Ml9iYXR0X3JlbW92ZSwKLQkuaWRfdGFibGUJPSB6Ml9iYXR0X2lkLAotfTsKLW1vZHVsZV9pMmNfZHJpdmVyKHoyX2JhdHRfZHJpdmVyKTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiUGV0ZXIgRWR3YXJkcyA8c3dlZXRsaWxtcmVAZ21haWwuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJaaXBpdCBaMiBiYXR0ZXJ5IGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlcmNhcC9pbnRlbF9yYXBsLmMgYi9kcml2ZXJzL3Bvd2VyY2FwL2ludGVsX3JhcGwuYwppbmRleCBmYmFiMjlkLi4yNDNiMjMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyY2FwL2ludGVsX3JhcGwuYworKysgYi9kcml2ZXJzL3Bvd2VyY2FwL2ludGVsX3JhcGwuYwpAQCAtMTE1NCw4ICsxMTU0LDggQEAKIAogCVJBUExfQ1BVKElOVEVMX0ZBTTZfQVRPTV9TSUxWRVJNT05UMSwJcmFwbF9kZWZhdWx0c19ieXQpLAogCVJBUExfQ1BVKElOVEVMX0ZBTTZfQVRPTV9BSVJNT05ULAlyYXBsX2RlZmF1bHRzX2NodCksCi0JUkFQTF9DUFUoSU5URUxfRkFNNl9BVE9NX01FUlJJRklFTEQxLAlyYXBsX2RlZmF1bHRzX3RuZyksCi0JUkFQTF9DUFUoSU5URUxfRkFNNl9BVE9NX01FUlJJRklFTEQyLAlyYXBsX2RlZmF1bHRzX2FubiksCisJUkFQTF9DUFUoSU5URUxfRkFNNl9BVE9NX01FUlJJRklFTEQsCXJhcGxfZGVmYXVsdHNfdG5nKSwKKwlSQVBMX0NQVShJTlRFTF9GQU02X0FUT01fTU9PUkVGSUVMRCwJcmFwbF9kZWZhdWx0c19hbm4pLAogCVJBUExfQ1BVKElOVEVMX0ZBTTZfQVRPTV9HT0xETU9OVCwJcmFwbF9kZWZhdWx0c19jb3JlKSwKIAlSQVBMX0NQVShJTlRFTF9GQU02X0FUT01fREVOVkVSVE9OLAlyYXBsX2RlZmF1bHRzX2NvcmUpLAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3B0cC9wdHBfY2xvY2suYyBiL2RyaXZlcnMvcHRwL3B0cF9jbG9jay5jCmluZGV4IDJlNDgxYjkuLjg2MjgwYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHRwL3B0cF9jbG9jay5jCisrKyBiL2RyaXZlcnMvcHRwL3B0cF9jbG9jay5jCkBAIC0yNjMsNiArMjYzLDcgQEAKIG5vX2RldmljZToKIAltdXRleF9kZXN0cm95KCZwdHAtPnRzZXZxX211eCk7CiAJbXV0ZXhfZGVzdHJveSgmcHRwLT5waW5jZmdfbXV4KTsKKwlpZGFfc2ltcGxlX3JlbW92ZSgmcHRwX2Nsb2Nrc19tYXAsIGluZGV4KTsKIG5vX3Nsb3Q6CiAJa2ZyZWUocHRwKTsKIG5vX21lbW9yeToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHRwL3B0cF9peHA0NnguYyBiL2RyaXZlcnMvcHRwL3B0cF9peHA0NnguYwppbmRleCBlZTRmMTgzLi4zNDRhM2JhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3B0cC9wdHBfaXhwNDZ4LmMKKysrIGIvZHJpdmVycy9wdHAvcHRwX2l4cDQ2eC5jCkBAIC0yNjgsMTggKzI2OCwxOSBAQAogCQlyZXR1cm4gZXJyOwogCiAJaXJxID0gZ3Bpb190b19pcnEoZ3Bpbyk7CisJaWYgKGlycSA8IDApCisJCXJldHVybiBpcnE7CiAKLQlpZiAoTk9fSVJRID09IGlycSkKLQkJcmV0dXJuIE5PX0lSUTsKLQotCWlmIChpcnFfc2V0X2lycV90eXBlKGlycSwgSVJRRl9UUklHR0VSX0ZBTExJTkcpKSB7CisJZXJyID0gaXJxX3NldF9pcnFfdHlwZShpcnEsIElSUUZfVFJJR0dFUl9GQUxMSU5HKTsKKwlpZiAoZXJyKSB7CiAJCXByX2VycigiY2Fubm90IHNldCB0cmlnZ2VyIHR5cGUgZm9yIGlycSAlZFxuIiwgaXJxKTsKLQkJcmV0dXJuIE5PX0lSUTsKKwkJcmV0dXJuIGVycjsKIAl9CiAKLQlpZiAocmVxdWVzdF9pcnEoaXJxLCBpc3IsIDAsIERSSVZFUiwgJml4cF9jbG9jaykpIHsKKwllcnIgPSByZXF1ZXN0X2lycShpcnEsIGlzciwgMCwgRFJJVkVSLCAmaXhwX2Nsb2NrKTsKKwlpZiAoZXJyKSB7CiAJCXByX2VycigicmVxdWVzdF9pcnEgZmFpbGVkIGZvciBpcnEgJWRcbiIsIGlycSk7Ci0JCXJldHVybiBOT19JUlE7CisJCXJldHVybiBlcnI7CiAJfQogCiAJcmV0dXJuIGlycTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmFwaWRpby9kZXZpY2VzL3RzaTcyMS5jIGIvZHJpdmVycy9yYXBpZGlvL2RldmljZXMvdHNpNzIxLmMKaW5kZXggMzJmMGYwMS4uOWQxOWI5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yYXBpZGlvL2RldmljZXMvdHNpNzIxLmMKKysrIGIvZHJpdmVycy9yYXBpZGlvL2RldmljZXMvdHNpNzIxLmMKQEAgLTExNjEsNyArMTE2MSw3IEBACiAJCX0gZWxzZSBpZiAoaWJ3X3N0YXJ0IDwgKGliX3dpbi0+cnN0YXJ0ICsgaWJfd2luLT5zaXplKSAmJgogCQkJICAgKGlid19zdGFydCArIGlid19zaXplKSA+IGliX3dpbi0+cnN0YXJ0KSB7CiAJCQkvKiBSZXR1cm4gZXJyb3IgaWYgYWRkcmVzcyB0cmFuc2xhdGlvbiBpbnZvbHZlZCAqLwotCQkJaWYgKGRpcmVjdCAmJiBpYl93aW4tPnhsYXQpIHsKKwkJCWlmICghZGlyZWN0IHx8IGliX3dpbi0+eGxhdCkgewogCQkJCXJldCA9IC1FRkFVTFQ7CiAJCQkJYnJlYWs7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JhcGlkaW8vcmlvX2NtLmMgYi9kcml2ZXJzL3JhcGlkaW8vcmlvX2NtLmMKaW5kZXggM2ZhMTdhYy4uY2ViYzI5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9yYXBpZGlvL3Jpb19jbS5jCisrKyBiL2RyaXZlcnMvcmFwaWRpby9yaW9fY20uYwpAQCAtMjI0NywxNyArMjI0NywzMCBAQAogewogCXN0cnVjdCByaW9fY2hhbm5lbCAqY2g7CiAJdW5zaWduZWQgaW50IGk7CisJTElTVF9IRUFEKGxpc3QpOwogCiAJcmlvY21fZGVidWcoRVhJVCwgIi4iKTsKIAorCS8qCisJICogSWYgdGhlcmUgYXJlIGFueSBjaGFubmVscyBsZWZ0IGluIGNvbm5lY3RlZCBzdGF0ZSBzZW5kCisJICogY2xvc2Ugbm90aWZpY2F0aW9uIHRvIHRoZSBjb25uZWN0aW9uIHBhcnRuZXIuCisJICogRmlyc3QgYnVpbGQgYSBsaXN0IG9mIGNoYW5uZWxzIHRoYXQgcmVxdWlyZSBhIGNsb3NpbmcKKwkgKiBub3RpZmljYXRpb24gYmVjYXVzZSBmdW5jdGlvbiByaW9jbV9zZW5kX2Nsb3NlKCkgc2hvdWxkCisJICogYmUgY2FsbGVkIG91dHNpZGUgb2Ygc3BpbmxvY2sgcHJvdGVjdGVkIGNvZGUuCisJICovCiAJc3Bpbl9sb2NrX2JoKCZpZHJfbG9jayk7CiAJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjaF9pZHIsIGNoLCBpKSB7Ci0JCXJpb2NtX2RlYnVnKEVYSVQsICJjbG9zZSBjaCAlZCIsIGNoLT5pZCk7Ci0JCWlmIChjaC0+c3RhdGUgPT0gUklPX0NNX0NPTk5FQ1RFRCkKLQkJCXJpb2NtX3NlbmRfY2xvc2UoY2gpOworCQlpZiAoY2gtPnN0YXRlID09IFJJT19DTV9DT05ORUNURUQpIHsKKwkJCXJpb2NtX2RlYnVnKEVYSVQsICJjbG9zZSBjaCAlZCIsIGNoLT5pZCk7CisJCQlpZHJfcmVtb3ZlKCZjaF9pZHIsIGNoLT5pZCk7CisJCQlsaXN0X2FkZCgmY2gtPmNoX25vZGUsICZsaXN0KTsKKwkJfQogCX0KIAlzcGluX3VubG9ja19iaCgmaWRyX2xvY2spOwogCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaCwgJmxpc3QsIGNoX25vZGUpCisJCXJpb2NtX3NlbmRfY2xvc2UoY2gpOworCiAJcmV0dXJuIE5PVElGWV9ET05FOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnIGIvZHJpdmVycy9yZWd1bGF0b3IvS2NvbmZpZwppbmRleCA2MjA0MTI5Li45MzZmN2NjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL0tjb25maWcKQEAgLTM1Myw2ICszNTMsMTQgQEAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgTFRDMzU4OSwgTFRDMzU4OS0xLCBhbmQgTFRDMzU4OS0yCiAJICA4LW91dHB1dCByZWd1bGF0b3JzIGNvbnRyb2xsZWQgdmlhIEkyQy4KIAorY29uZmlnIFJFR1VMQVRPUl9MVEMzNjc2CisJdHJpc3RhdGUgIkxUQzM2NzYgOC1vdXRwdXQgdm9sdGFnZSByZWd1bGF0b3IiCisJZGVwZW5kcyBvbiBJMkMKKwlzZWxlY3QgUkVHTUFQX0kyQworCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgTFRDMzY3NgorCSAgOC1vdXRwdXQgcmVndWxhdG9ycyBjb250cm9sbGVkIHZpYSBJMkMuCisKIGNvbmZpZyBSRUdVTEFUT1JfTUFYMTQ1NzcKIAl0cmlzdGF0ZSAiTWF4aW0gMTQ1NzcvNzc4MzYgcmVndWxhdG9yIgogCWRlcGVuZHMgb24gTUZEX01BWDE0NTc3CkBAIC04MjAsNyArODI4LDcgQEAKIAkgICAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgVFBTNjU5MTIgdm9sdGFnZSByZWd1bGF0b3IgY2hpcC4KIAogY29uZmlnIFJFR1VMQVRPUl9UUFM4MDAzMQotCXRyaXN0YXRlICJUSSBUUFM4MDAzMS9UUFM4MDAzMiBwb3dlciByZWd1YWx0b3IgZHJpdmVyIgorCXRyaXN0YXRlICJUSSBUUFM4MDAzMS9UUFM4MDAzMiBwb3dlciByZWd1bGF0b3IgZHJpdmVyIgogCWRlcGVuZHMgb24gTUZEX1RQUzgwMDMxCiAJaGVscAogCSAgVFBTODAwMzEvIFRQUzgwMDMyIEZ1bGx5IEludGVncmF0ZWQgUG93ZXIgTWFuYWdlbWVudCB3aXRoIFBvd2VyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9NYWtlZmlsZSBiL2RyaXZlcnMvcmVndWxhdG9yL01ha2VmaWxlCmluZGV4IGYzZGE5ZWUuLjIxNDJhNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL01ha2VmaWxlCkBAIC00Nyw2ICs0Nyw3IEBACiBvYmotJChDT05GSUdfUkVHVUxBVE9SX0xQODc4OCkgKz0gbHA4Nzg4LWxkby5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX0xQODc1NSkgKz0gbHA4NzU1Lm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfTFRDMzU4OSkgKz0gbHRjMzU4OS5vCitvYmotJChDT05GSUdfUkVHVUxBVE9SX0xUQzM2NzYpICs9IGx0YzM2NzYubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9NQVgxNDU3NykgKz0gbWF4MTQ1NzctcmVndWxhdG9yLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfTUFYMTU4NikgKz0gbWF4MTU4Ni5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX01BWDc3NjIwKSArPSBtYXg3NzYyMC1yZWd1bGF0b3IubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvY29yZS5jIGIvZHJpdmVycy9yZWd1bGF0b3IvY29yZS5jCmluZGV4IGRiMzIwZTguLjY3NDI2YzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2NvcmUuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9jb3JlLmMKQEAgLTY3OSwyNCArNjc5LDYgQEAKIAkgICAgIXJkZXYtPmRlc2MtPm9wcy0+c2V0X2xvYWQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JLyogZ2V0IG91dHB1dCB2b2x0YWdlICovCi0Jb3V0cHV0X3VWID0gX3JlZ3VsYXRvcl9nZXRfdm9sdGFnZShyZGV2KTsKLQlpZiAob3V0cHV0X3VWIDw9IDApIHsKLQkJcmRldl9lcnIocmRldiwgImludmFsaWQgb3V0cHV0IHZvbHRhZ2UgZm91bmRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBnZXQgaW5wdXQgdm9sdGFnZSAqLwotCWlucHV0X3VWID0gMDsKLQlpZiAocmRldi0+c3VwcGx5KQotCQlpbnB1dF91ViA9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZShyZGV2LT5zdXBwbHkpOwotCWlmIChpbnB1dF91ViA8PSAwKQotCQlpbnB1dF91ViA9IHJkZXYtPmNvbnN0cmFpbnRzLT5pbnB1dF91VjsKLQlpZiAoaW5wdXRfdVYgPD0gMCkgewotCQlyZGV2X2VycihyZGV2LCAiaW52YWxpZCBpbnB1dCB2b2x0YWdlIGZvdW5kXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJLyogY2FsYyB0b3RhbCByZXF1ZXN0ZWQgbG9hZCAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoc2libGluZywgJnJkZXYtPmNvbnN1bWVyX2xpc3QsIGxpc3QpCiAJCWN1cnJlbnRfdUEgKz0gc2libGluZy0+dUFfbG9hZDsKQEAgLTcwOSw2ICs2OTEsMjQgQEAKIAkJaWYgKGVyciA8IDApCiAJCQlyZGV2X2VycihyZGV2LCAiZmFpbGVkIHRvIHNldCBsb2FkICVkXG4iLCBjdXJyZW50X3VBKTsKIAl9IGVsc2UgeworCQkvKiBnZXQgb3V0cHV0IHZvbHRhZ2UgKi8KKwkJb3V0cHV0X3VWID0gX3JlZ3VsYXRvcl9nZXRfdm9sdGFnZShyZGV2KTsKKwkJaWYgKG91dHB1dF91ViA8PSAwKSB7CisJCQlyZGV2X2VycihyZGV2LCAiaW52YWxpZCBvdXRwdXQgdm9sdGFnZSBmb3VuZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIGdldCBpbnB1dCB2b2x0YWdlICovCisJCWlucHV0X3VWID0gMDsKKwkJaWYgKHJkZXYtPnN1cHBseSkKKwkJCWlucHV0X3VWID0gcmVndWxhdG9yX2dldF92b2x0YWdlKHJkZXYtPnN1cHBseSk7CisJCWlmIChpbnB1dF91ViA8PSAwKQorCQkJaW5wdXRfdVYgPSByZGV2LT5jb25zdHJhaW50cy0+aW5wdXRfdVY7CisJCWlmIChpbnB1dF91ViA8PSAwKSB7CisJCQlyZGV2X2VycihyZGV2LCAiaW52YWxpZCBpbnB1dCB2b2x0YWdlIGZvdW5kXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKIAkJLyogbm93IGdldCB0aGUgb3B0aW11bSBtb2RlIGZvciBvdXIgbmV3IHRvdGFsIHJlZ3VsYXRvciBsb2FkICovCiAJCW1vZGUgPSByZGV2LT5kZXNjLT5vcHMtPmdldF9vcHRpbXVtX21vZGUocmRldiwgaW5wdXRfdVYsCiAJCQkJCQkJIG91dHB1dF91ViwgY3VycmVudF91QSk7CkBAIC0yNzQzLDYgKzI3NDMsMjQgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IF9yZWd1bGF0b3Jfc2V0X3ZvbHRhZ2VfdGltZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKKwkJCQkgICAgICAgaW50IG9sZF91ViwgaW50IG5ld191VikKK3sKKwl1bnNpZ25lZCBpbnQgcmFtcF9kZWxheSA9IDA7CisKKwlpZiAocmRldi0+Y29uc3RyYWludHMtPnJhbXBfZGVsYXkpCisJCXJhbXBfZGVsYXkgPSByZGV2LT5jb25zdHJhaW50cy0+cmFtcF9kZWxheTsKKwllbHNlIGlmIChyZGV2LT5kZXNjLT5yYW1wX2RlbGF5KQorCQlyYW1wX2RlbGF5ID0gcmRldi0+ZGVzYy0+cmFtcF9kZWxheTsKKworCWlmIChyYW1wX2RlbGF5ID09IDApIHsKKwkJcmRldl93YXJuKHJkZXYsICJyYW1wX2RlbGF5IG5vdCBzZXRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gRElWX1JPVU5EX1VQKGFicyhuZXdfdVYgLSBvbGRfdVYpLCByYW1wX2RlbGF5KTsKK30KKwogc3RhdGljIGludCBfcmVndWxhdG9yX2RvX3NldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAogCQkJCSAgICAgaW50IG1pbl91ViwgaW50IG1heF91VikKIHsKQEAgLTI3NTEsNiArMjc2OSw4IEBACiAJaW50IGJlc3RfdmFsID0gMDsKIAl1bnNpZ25lZCBpbnQgc2VsZWN0b3I7CiAJaW50IG9sZF9zZWxlY3RvciA9IC0xOworCWNvbnN0IHN0cnVjdCByZWd1bGF0b3Jfb3BzICpvcHMgPSByZGV2LT5kZXNjLT5vcHM7CisJaW50IG9sZF91ViA9IF9yZWd1bGF0b3JfZ2V0X3ZvbHRhZ2UocmRldik7CiAKIAl0cmFjZV9yZWd1bGF0b3Jfc2V0X3ZvbHRhZ2UocmRldl9nZXRfbmFtZShyZGV2KSwgbWluX3VWLCBtYXhfdVYpOwogCkBAIC0yNzYyLDI5ICsyNzgyLDI4IEBACiAJICogaW5mbyB0byBjYWxsIHNldF92b2x0YWdlX3RpbWVfc2VsKCkuCiAJICovCiAJaWYgKF9yZWd1bGF0b3JfaXNfZW5hYmxlZChyZGV2KSAmJgotCSAgICByZGV2LT5kZXNjLT5vcHMtPnNldF92b2x0YWdlX3RpbWVfc2VsICYmCi0JICAgIHJkZXYtPmRlc2MtPm9wcy0+Z2V0X3ZvbHRhZ2Vfc2VsKSB7Ci0JCW9sZF9zZWxlY3RvciA9IHJkZXYtPmRlc2MtPm9wcy0+Z2V0X3ZvbHRhZ2Vfc2VsKHJkZXYpOworCSAgICBvcHMtPnNldF92b2x0YWdlX3RpbWVfc2VsICYmIG9wcy0+Z2V0X3ZvbHRhZ2Vfc2VsKSB7CisJCW9sZF9zZWxlY3RvciA9IG9wcy0+Z2V0X3ZvbHRhZ2Vfc2VsKHJkZXYpOwogCQlpZiAob2xkX3NlbGVjdG9yIDwgMCkKIAkJCXJldHVybiBvbGRfc2VsZWN0b3I7CiAJfQogCi0JaWYgKHJkZXYtPmRlc2MtPm9wcy0+c2V0X3ZvbHRhZ2UpIHsKKwlpZiAob3BzLT5zZXRfdm9sdGFnZSkgewogCQlyZXQgPSBfcmVndWxhdG9yX2NhbGxfc2V0X3ZvbHRhZ2UocmRldiwgbWluX3VWLCBtYXhfdVYsCiAJCQkJCQkgICZzZWxlY3Rvcik7CiAKIAkJaWYgKHJldCA+PSAwKSB7Ci0JCQlpZiAocmRldi0+ZGVzYy0+b3BzLT5saXN0X3ZvbHRhZ2UpCi0JCQkJYmVzdF92YWwgPSByZGV2LT5kZXNjLT5vcHMtPmxpc3Rfdm9sdGFnZShyZGV2LAotCQkJCQkJCQkJIHNlbGVjdG9yKTsKKwkJCWlmIChvcHMtPmxpc3Rfdm9sdGFnZSkKKwkJCQliZXN0X3ZhbCA9IG9wcy0+bGlzdF92b2x0YWdlKHJkZXYsCisJCQkJCQkJICAgICBzZWxlY3Rvcik7CiAJCQllbHNlCiAJCQkJYmVzdF92YWwgPSBfcmVndWxhdG9yX2dldF92b2x0YWdlKHJkZXYpOwogCQl9CiAKLQl9IGVsc2UgaWYgKHJkZXYtPmRlc2MtPm9wcy0+c2V0X3ZvbHRhZ2Vfc2VsKSB7CisJfSBlbHNlIGlmIChvcHMtPnNldF92b2x0YWdlX3NlbCkgewogCQlyZXQgPSByZWd1bGF0b3JfbWFwX3ZvbHRhZ2UocmRldiwgbWluX3VWLCBtYXhfdVYpOwogCQlpZiAocmV0ID49IDApIHsKLQkJCWJlc3RfdmFsID0gcmRldi0+ZGVzYy0+b3BzLT5saXN0X3ZvbHRhZ2UocmRldiwgcmV0KTsKKwkJCWJlc3RfdmFsID0gb3BzLT5saXN0X3ZvbHRhZ2UocmRldiwgcmV0KTsKIAkJCWlmIChtaW5fdVYgPD0gYmVzdF92YWwgJiYgbWF4X3VWID49IGJlc3RfdmFsKSB7CiAJCQkJc2VsZWN0b3IgPSByZXQ7CiAJCQkJaWYgKG9sZF9zZWxlY3RvciA9PSBzZWxlY3RvcikKQEAgLTI4MDAsMzQgKzI4MTksNTAgQEAKIAkJcmV0ID0gLUVJTlZBTDsKIAl9CiAKLQkvKiBDYWxsIHNldF92b2x0YWdlX3RpbWVfc2VsIGlmIHN1Y2Nlc3NmdWxseSBvYnRhaW5lZCBvbGRfc2VsZWN0b3IgKi8KLQlpZiAocmV0ID09IDAgJiYgIXJkZXYtPmNvbnN0cmFpbnRzLT5yYW1wX2Rpc2FibGUgJiYgb2xkX3NlbGVjdG9yID49IDAKLQkJJiYgb2xkX3NlbGVjdG9yICE9IHNlbGVjdG9yKSB7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CiAKLQkJZGVsYXkgPSByZGV2LT5kZXNjLT5vcHMtPnNldF92b2x0YWdlX3RpbWVfc2VsKHJkZXYsCi0JCQkJCQlvbGRfc2VsZWN0b3IsIHNlbGVjdG9yKTsKLQkJaWYgKGRlbGF5IDwgMCkgewotCQkJcmRldl93YXJuKHJkZXYsICJzZXRfdm9sdGFnZV90aW1lX3NlbCgpIGZhaWxlZDogJWRcbiIsCi0JCQkJICBkZWxheSk7Ci0JCQlkZWxheSA9IDA7Ci0JCX0KLQotCQkvKiBJbnNlcnQgYW55IG5lY2Vzc2FyeSBkZWxheXMgKi8KLQkJaWYgKGRlbGF5ID49IDEwMDApIHsKLQkJCW1kZWxheShkZWxheSAvIDEwMDApOwotCQkJdWRlbGF5KGRlbGF5ICUgMTAwMCk7Ci0JCX0gZWxzZSBpZiAoZGVsYXkpIHsKLQkJCXVkZWxheShkZWxheSk7CisJaWYgKG9wcy0+c2V0X3ZvbHRhZ2VfdGltZV9zZWwpIHsKKwkJLyoKKwkJICogQ2FsbCBzZXRfdm9sdGFnZV90aW1lX3NlbCBpZiBzdWNjZXNzZnVsbHkgb2J0YWluZWQKKwkJICogb2xkX3NlbGVjdG9yCisJCSAqLworCQlpZiAob2xkX3NlbGVjdG9yID49IDAgJiYgb2xkX3NlbGVjdG9yICE9IHNlbGVjdG9yKQorCQkJZGVsYXkgPSBvcHMtPnNldF92b2x0YWdlX3RpbWVfc2VsKHJkZXYsIG9sZF9zZWxlY3RvciwKKwkJCQkJCQkgIHNlbGVjdG9yKTsKKwl9IGVsc2UgeworCQlpZiAob2xkX3VWICE9IGJlc3RfdmFsKSB7CisJCQlpZiAob3BzLT5zZXRfdm9sdGFnZV90aW1lKQorCQkJCWRlbGF5ID0gb3BzLT5zZXRfdm9sdGFnZV90aW1lKHJkZXYsIG9sZF91ViwKKwkJCQkJCQkgICAgICBiZXN0X3ZhbCk7CisJCQllbHNlCisJCQkJZGVsYXkgPSBfcmVndWxhdG9yX3NldF92b2x0YWdlX3RpbWUocmRldiwKKwkJCQkJCQkJICAgIG9sZF91ViwKKwkJCQkJCQkJICAgIGJlc3RfdmFsKTsKIAkJfQogCX0KIAotCWlmIChyZXQgPT0gMCAmJiBiZXN0X3ZhbCA+PSAwKSB7CisJaWYgKGRlbGF5IDwgMCkgeworCQlyZGV2X3dhcm4ocmRldiwgImZhaWxlZCB0byBnZXQgZGVsYXk6ICVkXG4iLCBkZWxheSk7CisJCWRlbGF5ID0gMDsKKwl9CisKKwkvKiBJbnNlcnQgYW55IG5lY2Vzc2FyeSBkZWxheXMgKi8KKwlpZiAoZGVsYXkgPj0gMTAwMCkgeworCQltZGVsYXkoZGVsYXkgLyAxMDAwKTsKKwkJdWRlbGF5KGRlbGF5ICUgMTAwMCk7CisJfSBlbHNlIGlmIChkZWxheSkgeworCQl1ZGVsYXkoZGVsYXkpOworCX0KKworCWlmIChiZXN0X3ZhbCA+PSAwKSB7CiAJCXVuc2lnbmVkIGxvbmcgZGF0YSA9IGJlc3RfdmFsOwogCiAJCV9ub3RpZmllcl9jYWxsX2NoYWluKHJkZXYsIFJFR1VMQVRPUl9FVkVOVF9WT0xUQUdFX0NIQU5HRSwKIAkJCQkgICAgICh2b2lkICopZGF0YSk7CiAJfQogCitvdXQ6CiAJdHJhY2VfcmVndWxhdG9yX3NldF92b2x0YWdlX2NvbXBsZXRlKHJkZXZfZ2V0X25hbWUocmRldiksIGJlc3RfdmFsKTsKIAogCXJldHVybiByZXQ7CkBAIC0yOTk4LDkgKzMwMzMsMTMgQEAKIAlpbnQgdm9sdGFnZTsKIAlpbnQgaTsKIAorCWlmIChvcHMtPnNldF92b2x0YWdlX3RpbWUpCisJCXJldHVybiBvcHMtPnNldF92b2x0YWdlX3RpbWUocmRldiwgb2xkX3VWLCBuZXdfdVYpOworCWVsc2UgaWYgKCFvcHMtPnNldF92b2x0YWdlX3RpbWVfc2VsKQorCQlyZXR1cm4gX3JlZ3VsYXRvcl9zZXRfdm9sdGFnZV90aW1lKHJkZXYsIG9sZF91ViwgbmV3X3VWKTsKKwogCS8qIEN1cnJlbnRseSByZXF1aXJlcyBvcGVyYXRpb25zIHRvIGRvIHRoaXMgKi8KLQlpZiAoIW9wcy0+bGlzdF92b2x0YWdlIHx8ICFvcHMtPnNldF92b2x0YWdlX3RpbWVfc2VsCi0JICAgIHx8ICFyZGV2LT5kZXNjLT5uX3ZvbHRhZ2VzKQorCWlmICghb3BzLT5saXN0X3ZvbHRhZ2UgfHwgIXJkZXYtPmRlc2MtPm5fdm9sdGFnZXMpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJZm9yIChpID0gMDsgaSA8IHJkZXYtPmRlc2MtPm5fdm9sdGFnZXM7IGkrKykgewpAQCAtMzAzOSwxOSArMzA3OCw4IEBACiAJCQkJICAgdW5zaWduZWQgaW50IG9sZF9zZWxlY3RvciwKIAkJCQkgICB1bnNpZ25lZCBpbnQgbmV3X3NlbGVjdG9yKQogewotCXVuc2lnbmVkIGludCByYW1wX2RlbGF5ID0gMDsKIAlpbnQgb2xkX3ZvbHQsIG5ld192b2x0OwogCi0JaWYgKHJkZXYtPmNvbnN0cmFpbnRzLT5yYW1wX2RlbGF5KQotCQlyYW1wX2RlbGF5ID0gcmRldi0+Y29uc3RyYWludHMtPnJhbXBfZGVsYXk7Ci0JZWxzZSBpZiAocmRldi0+ZGVzYy0+cmFtcF9kZWxheSkKLQkJcmFtcF9kZWxheSA9IHJkZXYtPmRlc2MtPnJhbXBfZGVsYXk7Ci0KLQlpZiAocmFtcF9kZWxheSA9PSAwKSB7Ci0JCXJkZXZfd2FybihyZGV2LCAicmFtcF9kZWxheSBub3Qgc2V0XG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCiAJLyogc2FuaXR5IGNoZWNrICovCiAJaWYgKCFyZGV2LT5kZXNjLT5vcHMtPmxpc3Rfdm9sdGFnZSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zMDU5LDcgKzMwODcsMTEgQEAKIAlvbGRfdm9sdCA9IHJkZXYtPmRlc2MtPm9wcy0+bGlzdF92b2x0YWdlKHJkZXYsIG9sZF9zZWxlY3Rvcik7CiAJbmV3X3ZvbHQgPSByZGV2LT5kZXNjLT5vcHMtPmxpc3Rfdm9sdGFnZShyZGV2LCBuZXdfc2VsZWN0b3IpOwogCi0JcmV0dXJuIERJVl9ST1VORF9VUChhYnMobmV3X3ZvbHQgLSBvbGRfdm9sdCksIHJhbXBfZGVsYXkpOworCWlmIChyZGV2LT5kZXNjLT5vcHMtPnNldF92b2x0YWdlX3RpbWUpCisJCXJldHVybiByZGV2LT5kZXNjLT5vcHMtPnNldF92b2x0YWdlX3RpbWUocmRldiwgb2xkX3ZvbHQsCisJCQkJCQkJIG5ld192b2x0KTsKKwllbHNlCisJCXJldHVybiBfcmVndWxhdG9yX3NldF92b2x0YWdlX3RpbWUocmRldiwgb2xkX3ZvbHQsIG5ld192b2x0KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlZ3VsYXRvcl9zZXRfdm9sdGFnZV90aW1lX3NlbCk7CiAKQEAgLTM0ODMsMTAgKzM1MTUsOCBAQAogCQljb25zdW1lcnNbaV0uY29uc3VtZXIgPSBOVUxMOwogCiAJZm9yIChpID0gMDsgaSA8IG51bV9jb25zdW1lcnM7IGkrKykgewotCQljb25zdW1lcnNbaV0uY29uc3VtZXIgPSBfcmVndWxhdG9yX2dldChkZXYsCi0JCQkJCQkgICAgICAgY29uc3VtZXJzW2ldLnN1cHBseSwKLQkJCQkJCSAgICAgICBmYWxzZSwKLQkJCQkJCSAgICAgICAhY29uc3VtZXJzW2ldLm9wdGlvbmFsKTsKKwkJY29uc3VtZXJzW2ldLmNvbnN1bWVyID0gcmVndWxhdG9yX2dldChkZXYsCisJCQkJCQkgICAgICBjb25zdW1lcnNbaV0uc3VwcGx5KTsKIAkJaWYgKElTX0VSUihjb25zdW1lcnNbaV0uY29uc3VtZXIpKSB7CiAJCQlyZXQgPSBQVFJfRVJSKGNvbnN1bWVyc1tpXS5jb25zdW1lcik7CiAJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBnZXQgc3VwcGx5ICclcyc6ICVkXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvZGJ4NTAwLXByY211LmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9kYng1MDAtcHJjbXUuYwppbmRleCAzOTYzZGZhLi44OTc2MTQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9kYng1MDAtcHJjbXUuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9kYng1MDAtcHJjbXUuYwpAQCAtNzUsMjQgKzc1LDYgQEAKIAl1OCAqc3RhdGVfYWZ0ZXJfc3VzcGVuZDsKIH0gcmRlYnVnOwogCi12b2lkIHV4NTAwX3JlZ3VsYXRvcl9zdXNwZW5kX2RlYnVnKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcmRlYnVnLm51bV9yZWd1bGF0b3JzOyBpKyspCi0JCXJkZWJ1Zy5zdGF0ZV9iZWZvcmVfc3VzcGVuZFtpXSA9Ci0JCQlyZGVidWcucmVndWxhdG9yX2FycmF5W2ldLmlzX2VuYWJsZWQ7Ci19Ci0KLXZvaWQgdXg1MDBfcmVndWxhdG9yX3Jlc3VtZV9kZWJ1Zyh2b2lkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IHJkZWJ1Zy5udW1fcmVndWxhdG9yczsgaSsrKQotCQlyZGVidWcuc3RhdGVfYWZ0ZXJfc3VzcGVuZFtpXSA9Ci0JCQlyZGVidWcucmVndWxhdG9yX2FycmF5W2ldLmlzX2VuYWJsZWQ7Ci19Ci0KIHN0YXRpYyBpbnQgdXg1MDBfcmVndWxhdG9yX3Bvd2VyX3N0YXRlX2NudF9wcmludChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnApCiB7CiAJLyogcHJpbnQgcG93ZXIgc3RhdGUgY291bnQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2RldnJlcy5jIGIvZHJpdmVycy9yZWd1bGF0b3IvZGV2cmVzLmMKaW5kZXggNmFkOGFiNC4uNmVjMWQ0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvZGV2cmVzLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvZGV2cmVzLmMKQEAgLTE2NCwxMSArMTY0LDggQEAKIAkJY29uc3VtZXJzW2ldLmNvbnN1bWVyID0gTlVMTDsKIAogCWZvciAoaSA9IDA7IGkgPCBudW1fY29uc3VtZXJzOyBpKyspIHsKLQkJY29uc3VtZXJzW2ldLmNvbnN1bWVyID0gX2Rldm1fcmVndWxhdG9yX2dldChkZXYsCi0JCQkJCQkJICAgIGNvbnN1bWVyc1tpXS5zdXBwbHksCi0JCQkJCQkJICAgIGNvbnN1bWVyc1tpXS5vcHRpb25hbCA/Ci0JCQkJCQkJCU9QVElPTkFMX0dFVCA6Ci0JCQkJCQkJCU5PUk1BTF9HRVQpOworCQljb25zdW1lcnNbaV0uY29uc3VtZXIgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoZGV2LAorCQkJCQkJCSAgIGNvbnN1bWVyc1tpXS5zdXBwbHkpOwogCQlpZiAoSVNfRVJSKGNvbnN1bWVyc1tpXS5jb25zdW1lcikpIHsKIAkJCXJldCA9IFBUUl9FUlIoY29uc3VtZXJzW2ldLmNvbnN1bWVyKTsKIAkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGdldCBzdXBwbHkgJyVzJzogJWRcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9oaTY0MjEtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9oaTY0MjEtcmVndWxhdG9yLmMKaW5kZXggNDJkYzVmYi4uNjJjNWY1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvaGk2NDIxLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2hpNjQyMS1yZWd1bGF0b3IuYwpAQCAtNDc3LDcgKzQ3Nyw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXVuc2lnbmVkIGludCBoaTY0MjFfcmVndWxhdG9yX2xkb19nZXRfb3B0aW11bV9tb2RlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAorc3RhdGljIHVuc2lnbmVkIGludAoraGk2NDIxX3JlZ3VsYXRvcl9sZG9fZ2V0X29wdGltdW1fbW9kZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKIAkJCWludCBpbnB1dF91ViwgaW50IG91dHB1dF91ViwgaW50IGxvYWRfdUEpCiB7CiAJc3RydWN0IGhpNjQyMV9yZWd1bGF0b3JfaW5mbyAqaW5mbyA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9sdGMzNjc2LmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9sdGMzNjc2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJiNDc2YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2x0YzM2NzYuYwpAQCAtMCwwICsxLDQyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBHYXRld29ya3MgQ29ycG9yYXRpb24sIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL29mX3JlZ3VsYXRvci5oPgorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkibHRjMzY3NiIKKworLyogTFRDMzY3NiBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgTFRDMzY3Nl9CVUNLMSAgICAgMHgwMQorI2RlZmluZSBMVEMzNjc2X0JVQ0syICAgICAweDAyCisjZGVmaW5lIExUQzM2NzZfQlVDSzMgICAgIDB4MDMKKyNkZWZpbmUgTFRDMzY3Nl9CVUNLNCAgICAgMHgwNAorI2RlZmluZSBMVEMzNjc2X0xET0EgICAgICAweDA1CisjZGVmaW5lIExUQzM2NzZfTERPQiAgICAgIDB4MDYKKyNkZWZpbmUgTFRDMzY3Nl9TUUQxICAgICAgMHgwNworI2RlZmluZSBMVEMzNjc2X1NRRDIgICAgICAweDA4CisjZGVmaW5lIExUQzM2NzZfQ05UUkwgICAgIDB4MDkKKyNkZWZpbmUgTFRDMzY3Nl9EVkIxQSAgICAgMHgwQQorI2RlZmluZSBMVEMzNjc2X0RWQjFCICAgICAweDBCCisjZGVmaW5lIExUQzM2NzZfRFZCMkEgICAgIDB4MEMKKyNkZWZpbmUgTFRDMzY3Nl9EVkIyQiAgICAgMHgwRAorI2RlZmluZSBMVEMzNjc2X0RWQjNBICAgICAweDBFCisjZGVmaW5lIExUQzM2NzZfRFZCM0IgICAgIDB4MEYKKyNkZWZpbmUgTFRDMzY3Nl9EVkI0QSAgICAgMHgxMAorI2RlZmluZSBMVEMzNjc2X0RWQjRCICAgICAweDExCisjZGVmaW5lIExUQzM2NzZfTVNLSVJRICAgIDB4MTIKKyNkZWZpbmUgTFRDMzY3Nl9NU0tQRyAgICAgMHgxMworI2RlZmluZSBMVEMzNjc2X1VTRVIgICAgICAweDE0CisjZGVmaW5lIExUQzM2NzZfSVJRU1RBVCAgIDB4MTUKKyNkZWZpbmUgTFRDMzY3Nl9QR1NUQVRMICAgMHgxNgorI2RlZmluZSBMVEMzNjc2X1BHU1RBVFJUICAweDE3CisjZGVmaW5lIExUQzM2NzZfSFJTVCAgICAgIDB4MUUKKyNkZWZpbmUgTFRDMzY3Nl9DTElSUSAgICAgMHgxRgorCisjZGVmaW5lIExUQzM2NzZfRFZCeEFfUkVGX1NFTEVDVAlCSVQoNSkKKworI2RlZmluZSBMVEMzNjc2X0lSUVNUQVRfUEdPT0RfVElNRU9VVAlCSVQoMykKKyNkZWZpbmUgTFRDMzY3Nl9JUlFTVEFUX1VOREVSVk9MVF9XQVJOCUJJVCg0KQorI2RlZmluZSBMVEMzNjc2X0lSUVNUQVRfVU5ERVJWT0xUX0ZBVUxUCUJJVCg1KQorI2RlZmluZSBMVEMzNjc2X0lSUVNUQVRfVEhFUk1BTF9XQVJOCUJJVCg2KQorI2RlZmluZSBMVEMzNjc2X0lSUVNUQVRfVEhFUk1BTF9GQVVMVAlCSVQoNykKKworZW51bSBsdGMzNjc2X3JlZyB7CisJTFRDMzY3Nl9TVzEsCisJTFRDMzY3Nl9TVzIsCisJTFRDMzY3Nl9TVzMsCisJTFRDMzY3Nl9TVzQsCisJTFRDMzY3Nl9MRE8xLAorCUxUQzM2NzZfTERPMiwKKwlMVEMzNjc2X0xETzMsCisJTFRDMzY3Nl9MRE80LAorCUxUQzM2NzZfTlVNX1JFR1VMQVRPUlMsCit9OworCitzdHJ1Y3QgbHRjMzY3NiB7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgcmVndWxhdG9yX2Rlc2NzW0xUQzM2NzZfTlVNX1JFR1VMQVRPUlNdOworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZWd1bGF0b3JzW0xUQzM2NzZfTlVNX1JFR1VMQVRPUlNdOworfTsKKworc3RhdGljIGludCBsdGMzNjc2X3NldF9zdXNwZW5kX3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsIGludCB1VikKK3sKKwlzdHJ1Y3QgbHRjMzY3NiAqbHRjMzY3NiA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gbHRjMzY3Ni0+ZGV2OworCWludCBkY2RjID0gcmRldl9nZXRfaWQocmRldik7CisJaW50IHNlbDsKKworCWRldl9kYmcoZGV2LCAiJXMgaWQ9JWQgdVY9JWRcbiIsIF9fZnVuY19fLCBkY2RjLCB1Vik7CisJc2VsID0gcmVndWxhdG9yX21hcF92b2x0YWdlX2xpbmVhcihyZGV2LCB1ViwgdVYpOworCWlmIChzZWwgPCAwKQorCQlyZXR1cm4gc2VsOworCisJLyogRFZCQiByZWdpc3RlciBmb2xsb3dzIHJpZ2h0IGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIERWQkEgcmVnaXN0ZXIgKi8KKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGx0YzM2NzYtPnJlZ21hcCwgcmRldi0+ZGVzYy0+dnNlbF9yZWcgKyAxLAorCQkJCSAgcmRldi0+ZGVzYy0+dnNlbF9tYXNrLCBzZWwpOworfQorCitzdGF0aWMgaW50IGx0YzM2NzZfc2V0X3N1c3BlbmRfbW9kZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKKwkJCQkgICAgdW5zaWduZWQgaW50IG1vZGUpCit7CisJc3RydWN0IGx0YzM2NzYgKmx0YzM2NzY9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gbHRjMzY3Ni0+ZGV2OworCWludCBtYXNrLCB2YWw7CisJaW50IGRjZGMgPSByZGV2X2dldF9pZChyZGV2KTsKKworCWRldl9kYmcoZGV2LCAiJXMgaWQ9JWQgbW9kZT0lZFxuIiwgX19mdW5jX18sIGRjZGMsIG1vZGUpOworCisJbWFzayA9IExUQzM2NzZfRFZCeEFfUkVGX1NFTEVDVDsKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIFJFR1VMQVRPUl9NT0RFX1NUQU5EQlk6CisJCXZhbCA9IDA7IC8qIHNlbGVjdCBEVkJ4QSAqLworCQlicmVhazsKKwljYXNlIFJFR1VMQVRPUl9NT0RFX05PUk1BTDoKKwkJdmFsID0gTFRDMzY3Nl9EVkJ4QV9SRUZfU0VMRUNUOyAvKiBzZWxlY3QgRFZCeEIgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oJnJkZXYtPmRldiwgIiVzOiByZWd1bGF0b3IgbW9kZTogMHgleCBub3Qgc3VwcG9ydGVkXG4iLAorCQkJIHJkZXYtPmRlc2MtPm5hbWUsIG1vZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGx0YzM2NzYtPnJlZ21hcCwgcmRldi0+ZGVzYy0+dnNlbF9yZWcsCisJCQkJICBtYXNrLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBsdGMzNjc2X3NjYWxlKHVuc2lnbmVkIGludCB1ViwgdTMyIHIxLCB1MzIgcjIpCit7CisJdWludDY0X3QgdG1wOworCWlmICh1ViA9PSAwKQorCQlyZXR1cm4gMDsKKwl0bXAgPSAodWludDY0X3QpdVYgKiByMTsKKwlkb19kaXYodG1wLCByMik7CisJcmV0dXJuIHVWICsgKHVuc2lnbmVkIGludCl0bXA7Cit9CisKK3N0YXRpYyBpbnQgbHRjMzY3Nl9vZl9wYXJzZV9jYihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCByZWd1bGF0b3JfZGVzYyAqZGVzYywKKwkJCSAgICAgICBzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyAqY29uZmlnKQoreworCXN0cnVjdCBsdGMzNjc2ICpsdGMzNjc2ID0gY29uZmlnLT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgKnJkZXNjID0gJmx0YzM2NzYtPnJlZ3VsYXRvcl9kZXNjc1tkZXNjLT5pZF07CisJdTMyIHJbMl07CisJaW50IHJldDsKKworCS8qIExETzMgaGFzIGEgZml4ZWQgb3V0cHV0ICovCisJaWYgKGRlc2MtPmlkID09IExUQzM2NzZfTERPMykKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShucCwgImxsdGMsZmItdm9sdGFnZS1kaXZpZGVyIiwgciwgMik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGx0YzM2NzYtPmRldiwgIkZhaWxlZCB0byBwYXJzZSB2b2x0YWdlIGRpdmlkZXI6ICVkXG4iLAorCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZGVzYy0+bWluX3VWID0gbHRjMzY3Nl9zY2FsZShkZXNjLT5taW5fdVYsIHJbMF0sIHJbMV0pOworCXJkZXNjLT51Vl9zdGVwID0gbHRjMzY3Nl9zY2FsZShkZXNjLT51Vl9zdGVwLCByWzBdLCByWzFdKTsKKwlyZGVzYy0+Zml4ZWRfdVYgPSBsdGMzNjc2X3NjYWxlKGRlc2MtPmZpeGVkX3VWLCByWzBdLCByWzFdKTsKKworCXJldHVybiAwOworfQorCisvKiBTVzEsIFNXMiwgU1czLCBTVzQgbGluZWFyIDAuOFYtMy4zViB3aXRoIHNjYWxhciB2aWEgUjEvUjIgZmVlYmFjayByZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyBsdGMzNjc2X2xpbmVhcl9yZWd1bGF0b3Jfb3BzID0geworCS5lbmFibGUgPSByZWd1bGF0b3JfZW5hYmxlX3JlZ21hcCwKKwkuZGlzYWJsZSA9IHJlZ3VsYXRvcl9kaXNhYmxlX3JlZ21hcCwKKwkuaXNfZW5hYmxlZCA9IHJlZ3VsYXRvcl9pc19lbmFibGVkX3JlZ21hcCwKKwkubGlzdF92b2x0YWdlID0gcmVndWxhdG9yX2xpc3Rfdm9sdGFnZV9saW5lYXIsCisJLnNldF92b2x0YWdlX3NlbCA9IHJlZ3VsYXRvcl9zZXRfdm9sdGFnZV9zZWxfcmVnbWFwLAorCS5nZXRfdm9sdGFnZV9zZWwgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKKwkuc2V0X3N1c3BlbmRfdm9sdGFnZSA9IGx0YzM2NzZfc2V0X3N1c3BlbmRfdm9sdGFnZSwKKwkuc2V0X3N1c3BlbmRfbW9kZSA9IGx0YzM2NzZfc2V0X3N1c3BlbmRfbW9kZSwKK307CisKKy8qIExETzEgYWx3YXlzIG9uIGZpeGVkIDAuOFYtMy4zViB2aWEgc2NhbGFyIHZpYSBSMS9SMiBmZWViYWNrIHJlcyAqLworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIGx0YzM2NzZfZml4ZWRfc3RhbmRieV9yZWd1bGF0b3Jfb3BzID0geworfTsKKworLyogTERPMiwgTERPMyBmaXhlZCAoTERPMiBoYXMgZXh0ZXJuYWwgc2NhbGFyIHZpYSBSMS9SMiBmZWVkYmFjayByZXMpICovCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgbHRjMzY3Nl9maXhlZF9yZWd1bGF0b3Jfb3BzID0geworCS5lbmFibGUgPSByZWd1bGF0b3JfZW5hYmxlX3JlZ21hcCwKKwkuZGlzYWJsZSA9IHJlZ3VsYXRvcl9kaXNhYmxlX3JlZ21hcCwKKwkuaXNfZW5hYmxlZCA9IHJlZ3VsYXRvcl9pc19lbmFibGVkX3JlZ21hcCwKK307CisKKyNkZWZpbmUgTFRDMzY3Nl9SRUcoX2lkLCBfbmFtZSwgX29wcywgZW5fcmVnLCBlbl9iaXQsIGR2YmFfcmVnLCBkdmJfbWFzaykgICBcCisJW0xUQzM2NzZfICMjIF9pZF0gPSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJLm5hbWUgPSAjX25hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCS5vZl9tYXRjaCA9IG9mX21hdGNoX3B0cigjX25hbWUpLCAgICAgICAgICAgICAgXAorCQkucmVndWxhdG9yc19ub2RlID0gb2ZfbWF0Y2hfcHRyKCJyZWd1bGF0b3JzIiksIFwKKwkJLm9mX3BhcnNlX2NiID0gbHRjMzY3Nl9vZl9wYXJzZV9jYiwgICAgICAgICAgICBcCisJCS5uX3ZvbHRhZ2VzID0gKGR2Yl9tYXNrKSArIDEsICAgICAgICAgICAgICAgICAgXAorCQkubWluX3VWID0gKGR2YmFfcmVnKSA/IDQxMjUwMCA6IDAsICAgICAgICAgICAgIFwKKwkJLnVWX3N0ZXAgPSAoZHZiYV9yZWcpID8gMTI1MDAgOiAwLCAgICAgICAgICAgICBcCisJCS5yYW1wX2RlbGF5ID0gKGR2YmFfcmVnKSA/IDgwMCA6IDAsICAgICAgICAgICAgXAorCQkuZml4ZWRfdVYgPSAoZHZiX21hc2spID8gMCA6IDcyNTAwMCwgICAgICAgICAgIFwKKwkJLm9wcyA9ICZsdGMzNjc2XyAjIyBfb3BzICMjIF9yZWd1bGF0b3Jfb3BzLCAgICBcCisJCS50eXBlID0gUkVHVUxBVE9SX1ZPTFRBR0UsICAgICAgICAgICAgICAgICAgICAgXAorCQkuaWQgPSBMVEMzNjc2XyAjIyBfaWQsICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCS52c2VsX3JlZyA9IChkdmJhX3JlZyksICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkudnNlbF9tYXNrID0gKGR2Yl9tYXNrKSwgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJLmVuYWJsZV9yZWcgPSAoZW5fcmVnKSwgICAgICAgICAgICAgICAgICAgICAgICBcCisJCS5lbmFibGVfbWFzayA9ICgxIDw8IGVuX2JpdCksICAgICAgICAgICAgICAgICAgXAorCX0KKworI2RlZmluZSBMVEMzNjc2X0xJTkVBUl9SRUcoX2lkLCBfbmFtZSwgX2VuLCBfZHZiYSkgICAgICAgICAgICAgICAgICAgICBcCisJTFRDMzY3Nl9SRUcoX2lkLCBfbmFtZSwgbGluZWFyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkgICAgTFRDMzY3Nl8gIyMgX2VuLCA3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkgICAgTFRDMzY3Nl8gIyMgX2R2YmEsIDB4MWYpCisKKyNkZWZpbmUgTFRDMzY3Nl9GSVhFRF9SRUcoX2lkLCBfbmFtZSwgX2VuX3JlZywgX2VuX2JpdCkgICAgICAgICAgICAgICAgXAorCUxUQzM2NzZfUkVHKF9pZCwgX25hbWUsIGZpeGVkLCBMVEMzNjc2XyAjIyBfZW5fcmVnLCBfZW5fYml0LCAwLCAwKQorCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9kZXNjIGx0YzM2NzZfcmVndWxhdG9yc1tMVEMzNjc2X05VTV9SRUdVTEFUT1JTXSA9IHsKKwlMVEMzNjc2X0xJTkVBUl9SRUcoU1cxLCBzdzEsIEJVQ0sxLCBEVkIxQSksCisJTFRDMzY3Nl9MSU5FQVJfUkVHKFNXMiwgc3cyLCBCVUNLMiwgRFZCMkEpLAorCUxUQzM2NzZfTElORUFSX1JFRyhTVzMsIHN3MywgQlVDSzMsIERWQjNBKSwKKwlMVEMzNjc2X0xJTkVBUl9SRUcoU1c0LCBzdzQsIEJVQ0s0LCBEVkI0QSksCisJTFRDMzY3Nl9SRUcoTERPMSwgbGRvMSwgZml4ZWRfc3RhbmRieSwgMCwgMCwgMCwgMCksCisJTFRDMzY3Nl9GSVhFRF9SRUcoTERPMiwgbGRvMiwgTERPQSwgMiksCisJTFRDMzY3Nl9GSVhFRF9SRUcoTERPMywgbGRvMywgTERPQSwgNSksCisJTFRDMzY3Nl9GSVhFRF9SRUcoTERPNCwgbGRvNCwgTERPQiwgMiksCit9OworCitzdGF0aWMgYm9vbCBsdGMzNjc2X3dyaXRlYWJsZV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBMVEMzNjc2X0lSUVNUQVQ6CisJY2FzZSBMVEMzNjc2X0JVQ0sxOgorCWNhc2UgTFRDMzY3Nl9CVUNLMjoKKwljYXNlIExUQzM2NzZfQlVDSzM6CisJY2FzZSBMVEMzNjc2X0JVQ0s0OgorCWNhc2UgTFRDMzY3Nl9MRE9BOgorCWNhc2UgTFRDMzY3Nl9MRE9COgorCWNhc2UgTFRDMzY3Nl9TUUQxOgorCWNhc2UgTFRDMzY3Nl9TUUQyOgorCWNhc2UgTFRDMzY3Nl9DTlRSTDoKKwljYXNlIExUQzM2NzZfRFZCMUE6CisJY2FzZSBMVEMzNjc2X0RWQjFCOgorCWNhc2UgTFRDMzY3Nl9EVkIyQToKKwljYXNlIExUQzM2NzZfRFZCMkI6CisJY2FzZSBMVEMzNjc2X0RWQjNBOgorCWNhc2UgTFRDMzY3Nl9EVkIzQjoKKwljYXNlIExUQzM2NzZfRFZCNEE6CisJY2FzZSBMVEMzNjc2X0RWQjRCOgorCWNhc2UgTFRDMzY3Nl9NU0tJUlE6CisJY2FzZSBMVEMzNjc2X01TS1BHOgorCWNhc2UgTFRDMzY3Nl9VU0VSOgorCWNhc2UgTFRDMzY3Nl9IUlNUOgorCWNhc2UgTFRDMzY3Nl9DTElSUToKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgbHRjMzY3Nl9yZWFkYWJsZV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBMVEMzNjc2X0lSUVNUQVQ6CisJY2FzZSBMVEMzNjc2X0JVQ0sxOgorCWNhc2UgTFRDMzY3Nl9CVUNLMjoKKwljYXNlIExUQzM2NzZfQlVDSzM6CisJY2FzZSBMVEMzNjc2X0JVQ0s0OgorCWNhc2UgTFRDMzY3Nl9MRE9BOgorCWNhc2UgTFRDMzY3Nl9MRE9COgorCWNhc2UgTFRDMzY3Nl9TUUQxOgorCWNhc2UgTFRDMzY3Nl9TUUQyOgorCWNhc2UgTFRDMzY3Nl9DTlRSTDoKKwljYXNlIExUQzM2NzZfRFZCMUE6CisJY2FzZSBMVEMzNjc2X0RWQjFCOgorCWNhc2UgTFRDMzY3Nl9EVkIyQToKKwljYXNlIExUQzM2NzZfRFZCMkI6CisJY2FzZSBMVEMzNjc2X0RWQjNBOgorCWNhc2UgTFRDMzY3Nl9EVkIzQjoKKwljYXNlIExUQzM2NzZfRFZCNEE6CisJY2FzZSBMVEMzNjc2X0RWQjRCOgorCWNhc2UgTFRDMzY3Nl9NU0tJUlE6CisJY2FzZSBMVEMzNjc2X01TS1BHOgorCWNhc2UgTFRDMzY3Nl9VU0VSOgorCWNhc2UgTFRDMzY3Nl9IUlNUOgorCWNhc2UgTFRDMzY3Nl9DTElSUToKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgbHRjMzY3Nl92b2xhdGlsZV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBMVEMzNjc2X0lSUVNUQVQ6CisJY2FzZSBMVEMzNjc2X1BHU1RBVEw6CisJY2FzZSBMVEMzNjc2X1BHU1RBVFJUOgorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgbHRjMzY3Nl9yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cyA9IDgsCisJLnZhbF9iaXRzID0gOCwKKwkud3JpdGVhYmxlX3JlZyA9IGx0YzM2NzZfd3JpdGVhYmxlX3JlZywKKwkucmVhZGFibGVfcmVnID0gbHRjMzY3Nl9yZWFkYWJsZV9yZWcsCisJLnZvbGF0aWxlX3JlZyA9IGx0YzM2NzZfdm9sYXRpbGVfcmVnLAorCS5tYXhfcmVnaXN0ZXIgPSBMVEMzNjc2X0NMSVJRLAorCS51c2Vfc2luZ2xlX3J3ID0gdHJ1ZSwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKK307CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBsdGMzNjc2X2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGx0YzM2NzYgKmx0YzM2NzYgPSBkZXZfaWQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gbHRjMzY3Ni0+ZGV2OworCXVuc2lnbmVkIGludCBpLCBpcnFzdGF0LCBldmVudDsKKworCXJlZ21hcF9yZWFkKGx0YzM2NzYtPnJlZ21hcCwgTFRDMzY3Nl9JUlFTVEFULCAmaXJxc3RhdCk7CisKKwlkZXZfZGJnKGRldiwgImlycSVkIGlycXN0YXQ9MHglMDJ4XG4iLCBpcnEsIGlycXN0YXQpOworCWlmIChpcnFzdGF0ICYgTFRDMzY3Nl9JUlFTVEFUX1RIRVJNQUxfV0FSTikgeworCQlkZXZfd2FybihkZXYsICJPdmVyLXRlbXBlcmF0dXJlIFdhcm5pbmdcbiIpOworCQlldmVudCA9IFJFR1VMQVRPUl9FVkVOVF9PVkVSX1RFTVA7CisJCWZvciAoaSA9IDA7IGkgPCBMVEMzNjc2X05VTV9SRUdVTEFUT1JTOyBpKyspCisJCQlyZWd1bGF0b3Jfbm90aWZpZXJfY2FsbF9jaGFpbihsdGMzNjc2LT5yZWd1bGF0b3JzW2ldLAorCQkJCQkJICAgICAgZXZlbnQsIE5VTEwpOworCX0KKworCWlmIChpcnFzdGF0ICYgTFRDMzY3Nl9JUlFTVEFUX1VOREVSVk9MVF9XQVJOKSB7CisJCWRldl9pbmZvKGRldiwgIlVuZGVydm9sdGFnZSBXYXJuaW5nXG4iKTsKKwkJZXZlbnQgPSBSRUdVTEFUT1JfRVZFTlRfVU5ERVJfVk9MVEFHRTsKKwkJZm9yIChpID0gMDsgaSA8IExUQzM2NzZfTlVNX1JFR1VMQVRPUlM7IGkrKykKKwkJCXJlZ3VsYXRvcl9ub3RpZmllcl9jYWxsX2NoYWluKGx0YzM2NzYtPnJlZ3VsYXRvcnNbaV0sCisJCQkJCQkgICAgICBldmVudCwgTlVMTCk7CisJfQorCisJLyogQ2xlYXIgd2FybmluZyBjb25kaXRpb24gKi8KKwlyZWdtYXBfd3JpdGUobHRjMzY3Ni0+cmVnbWFwLCBMVEMzNjc2X0NMSVJRLCAwKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBsdGMzNjc2X3JlZ3VsYXRvcl9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OworCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICppbml0X2RhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXNjICpkZXNjczsKKwlzdHJ1Y3QgbHRjMzY3NiAqbHRjMzY3NjsKKwlpbnQgaSwgcmV0OworCisJbHRjMzY3NiA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqbHRjMzY3NiksIEdGUF9LRVJORUwpOworCWlmICghbHRjMzY3NikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBsdGMzNjc2KTsKKwlsdGMzNjc2LT5kZXYgPSBkZXY7CisKKwlkZXNjcyA9IGx0YzM2NzYtPnJlZ3VsYXRvcl9kZXNjczsKKwltZW1jcHkoZGVzY3MsIGx0YzM2NzZfcmVndWxhdG9ycywgc2l6ZW9mKGx0YzM2NzZfcmVndWxhdG9ycykpOworCWRlc2NzW0xUQzM2NzZfTERPM10uZml4ZWRfdVYgPSAxODAwMDAwOyAvKiBMRE8zIGlzIGZpeGVkIDEuOFYgKi8KKworCWx0YzM2NzYtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGNsaWVudCwgJmx0YzM2NzZfcmVnbWFwX2NvbmZpZyk7CisJaWYgKElTX0VSUihsdGMzNjc2LT5yZWdtYXApKSB7CisJCXJldCA9IFBUUl9FUlIobHRjMzY3Ni0+cmVnbWFwKTsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSByZWdtYXA6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBMVEMzNjc2X05VTV9SRUdVTEFUT1JTOyBpKyspIHsKKwkJc3RydWN0IHJlZ3VsYXRvcl9kZXNjICpkZXNjID0gJmx0YzM2NzYtPnJlZ3VsYXRvcl9kZXNjc1tpXTsKKwkJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0geyB9OworCisJCWlmIChpbml0X2RhdGEpCisJCQljb25maWcuaW5pdF9kYXRhID0gJmluaXRfZGF0YVtpXTsKKworCQljb25maWcuZGV2ID0gZGV2OworCQljb25maWcuZHJpdmVyX2RhdGEgPSBsdGMzNjc2OworCisJCWx0YzM2NzYtPnJlZ3VsYXRvcnNbaV0gPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcihkZXYsIGRlc2MsCisJCQkJCQkJCSAmY29uZmlnKTsKKwkJaWYgKElTX0VSUihsdGMzNjc2LT5yZWd1bGF0b3JzW2ldKSkgeworCQkJcmV0ID0gUFRSX0VSUihsdGMzNjc2LT5yZWd1bGF0b3JzW2ldKTsKKwkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIHJlZ3VsYXRvciAlczogJWRcbiIsCisJCQkJZGVzYy0+bmFtZSwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZWdtYXBfd3JpdGUobHRjMzY3Ni0+cmVnbWFwLCBMVEMzNjc2X0NMSVJRLCAwKTsKKwlpZiAoY2xpZW50LT5pcnEpIHsKKwkJcmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycShkZXYsIGNsaWVudC0+aXJxLCBOVUxMLAorCQkJCQkJbHRjMzY3Nl9pc3IsCisJCQkJCQlJUlFGX1RSSUdHRVJfTE9XIHwgSVJRRl9PTkVTSE9ULAorCQkJCQkJY2xpZW50LT5uYW1lLCBsdGMzNjc2KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBJUlE6ICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbHRjMzY3Nl9pMmNfaWRbXSA9IHsKKwl7ICJsdGMzNjc2IiB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBsdGMzNjc2X2kyY19pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBsdGMzNjc2X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9IERSSVZFUl9OQU1FLAorCX0sCisJLnByb2JlID0gbHRjMzY3Nl9yZWd1bGF0b3JfcHJvYmUsCisJLmlkX3RhYmxlID0gbHRjMzY3Nl9pMmNfaWQsCit9OworbW9kdWxlX2kyY19kcml2ZXIobHRjMzY3Nl9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJUaW0gSGFydmV5IDx0aGFydmV5QGdhdGV3b3Jrcy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJlZ3VsYXRvciBkcml2ZXIgZm9yIExpbmVhciBUZWNobm9sb2d5IExUQzEzNzYiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL21heDE0NTc3LXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4MTQ1NzctcmVndWxhdG9yLmMKaW5kZXggYjJkYWE2Ni4uYzlmZjI2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4MTQ1NzctcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4MTQ1NzctcmVndWxhdG9yLmMKQEAgLTIsNyArMiw3IEBACiAgKiBtYXgxNDU3Ny5jIC0gUmVndWxhdG9yIGRyaXZlciBmb3IgdGhlIE1heGltIDE0NTc3Lzc3ODM2CiAgKgogICogQ29weXJpZ2h0IChDKSAyMDEzLDIwMTQgU2Ftc3VuZyBFbGVjdHJvbmljcwotICogS3J6eXN6dG9mIEtvemxvd3NraSA8ay5rb3psb3dza2lAc2Ftc3VuZy5jb20+CisgKiBLcnp5c3p0b2YgS296bG93c2tpIDxrcnprQGtlcm5lbC5vcmc+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0zMzEsNyArMzMxLDcgQEAKIH0KIG1vZHVsZV9leGl0KG1heDE0NTc3X3JlZ3VsYXRvcl9leGl0KTsKIAotTU9EVUxFX0FVVEhPUigiS3J6eXN6dG9mIEtvemxvd3NraSA8ay5rb3psb3dza2lAc2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJLcnp5c3p0b2YgS296bG93c2tpIDxrcnprQGtlcm5lbC5vcmc+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIk1heGltIDE0NTc3Lzc3ODM2IHJlZ3VsYXRvciBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BTElBUygicGxhdGZvcm06bWF4MTQ1NzctcmVndWxhdG9yIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg3NzY5My1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDc3NjkzLXJlZ3VsYXRvci5jCmluZGV4IGRlNzMwZmQuLmNmYmI5NTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL21heDc3NjkzLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDc3NjkzLXJlZ3VsYXRvci5jCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIENvcHlyaWdodCAoQykgMjAxMy0yMDE1IFNhbXN1bmcgRWxlY3Ryb25pY3MKICAqIEpvbmdod2EgTGVlIDxqb25naHdhMy5sZWVAc2Ftc3VuZy5jb20+Ci0gKiBLcnp5c3p0b2YgS296bG93c2tpIDxrLmtvemxvd3NraS5rQGdtYWlsLmNvbT4KKyAqIEtyenlzenRvZiBLb3psb3dza2kgPGtyemtAa2VybmVsLm9yZz4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTMxNCw1ICszMTQsNSBAQAogCiBNT0RVTEVfREVTQ1JJUFRJT04oIk1BWElNIDc3NjkzLzc3ODQzIHJlZ3VsYXRvciBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIkpvbmdod2EgTGVlIDxqb25naHdhMy5sZWVAc2Ftc3VuZy5jb20+Iik7Ci1NT0RVTEVfQVVUSE9SKCJLcnp5c3p0b2YgS296bG93c2tpIDxrLmtvemxvd3NraS5rQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIktyenlzenRvZiBLb3psb3dza2kgPGtyemtAa2VybmVsLm9yZz4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3B2ODgwODAtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9wdjg4MDgwLXJlZ3VsYXRvci5jCmluZGV4IDgxOTUwYmQuLjk1NGEyMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3B2ODgwODAtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvcHY4ODA4MC1yZWd1bGF0b3IuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CkBAIC0yNiw3ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL29mX3JlZ3VsYXRvci5oPgogI2luY2x1ZGUgInB2ODgwODAtcmVndWxhdG9yLmgiCiAKLSNkZWZpbmUgUFY4ODA4MF9NQVhfUkVHVUxBVE9SUwkzCisjZGVmaW5lIFBWODgwODBfTUFYX1JFR1VMQVRPUlMJNAogCiAvKiBQVjg4MDgwIFJFR1VMQVRPUiBJRHMgKi8KIGVudW0gewpAQCAtMzQsNiArMzUsMTIgQEAKIAlQVjg4MDgwX0lEX0JVQ0sxLAogCVBWODgwODBfSURfQlVDSzIsCiAJUFY4ODA4MF9JRF9CVUNLMywKKwlQVjg4MDgwX0lEX0hWQlVDSywKK307CisKK2VudW0gcHY4ODA4MF90eXBlcyB7CisJVFlQRV9QVjg4MDgwX0FBLAorCVRZUEVfUFY4ODA4MF9CQSwKIH07CiAKIHN0cnVjdCBwdjg4MDgwX3JlZ3VsYXRvciB7CkBAIC00Miw3ICs0OSw4IEBACiAJdW5zaWduZWQgaW50IG5fY3VycmVudF9saW1pdHM7CiAJY29uc3QgaW50ICpjdXJyZW50X2xpbWl0czsKIAl1bnNpZ25lZCBpbnQgbGltaXRfbWFzazsKLQl1bnNpZ25lZCBpbnQgY29uZjsKKwl1bnNpZ25lZCBpbnQgbW9kZV9yZWc7CisJdW5zaWduZWQgaW50IGxpbWl0X3JlZzsKIAl1bnNpZ25lZCBpbnQgY29uZjI7CiAJdW5zaWduZWQgaW50IGNvbmY1OwogfTsKQEAgLTUxLDYgKzU5LDggQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2W1BWODgwODBfTUFYX1JFR1VMQVRPUlNdOworCXVuc2lnbmVkIGxvbmcgdHlwZTsKKwljb25zdCBzdHJ1Y3QgcHY4ODA4MF9jb21wYXRpYmxlX3JlZ21hcCAqcmVnbWFwX2NvbmZpZzsKIH07CiAKIHN0cnVjdCBwdjg4MDgwX2J1Y2tfdm9sdGFnZSB7CkBAIC01OSw2ICs2OSwzMCBAQAogCWludCB1Vl9zdGVwOwogfTsKIAorc3RydWN0IHB2ODgwODBfYnVja19yZWdtYXAgeworCS8qIFJFR1MgKi8KKwlpbnQgYnVja19lbmFibGVfcmVnOworCWludCBidWNrX3ZzZWxfcmVnOworCWludCBidWNrX21vZGVfcmVnOworCWludCBidWNrX2xpbWl0X3JlZzsKKwlpbnQgYnVja192ZGFjX3JhbmdlX3JlZzsKKwlpbnQgYnVja192cmFuZ2VfZ2Fpbl9yZWc7CisJLyogTUFTS1MgKi8KKwlpbnQgYnVja19lbmFibGVfbWFzazsKKwlpbnQgYnVja192c2VsX21hc2s7CisJaW50IGJ1Y2tfbGltaXRfbWFzazsKK307CisKK3N0cnVjdCBwdjg4MDgwX2NvbXBhdGlibGVfcmVnbWFwIHsKKwkvKiBCVUNLMSwgMiwgMyAqLworCXN0cnVjdCBwdjg4MDgwX2J1Y2tfcmVnbWFwIGJ1Y2tfcmVnbWFwW1BWODgwODBfTUFYX1JFR1VMQVRPUlMtMV07CisJLyogSFZCVUNLICovCisJaW50IGh2YnVja19lbmFibGVfcmVnOworCWludCBodmJ1Y2tfdnNlbF9yZWc7CisJaW50IGh2YnVja19lbmFibGVfbWFzazsKKwlpbnQgaHZidWNrX3ZzZWxfbWFzazsKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBwdjg4MDgwX3JlZ21hcF9jb25maWcgPSB7CiAJLnJlZ19iaXRzID0gOCwKIAkudmFsX2JpdHMgPSA4LApAQCAtODksMTMgKzEyMywxMTEgQEAKIAl9LAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBwdjg4MDgwX2NvbXBhdGlibGVfcmVnbWFwIHB2ODgwODBfYWFfcmVncyA9IHsKKwkvKiBCVUNLMSAqLworCS5idWNrX3JlZ21hcFswXSA9IHsKKwkJLmJ1Y2tfZW5hYmxlX3JlZyAgICAgID0gUFY4ODA4MEFBX1JFR19CVUNLMV9DT05GMCwKKwkJLmJ1Y2tfdnNlbF9yZWcgICAgICAgID0gUFY4ODA4MEFBX1JFR19CVUNLMV9DT05GMCwKKwkJLmJ1Y2tfbW9kZV9yZWcgICAgICAgID0gUFY4ODA4MEFBX1JFR19CVUNLMV9DT05GMSwKKwkJLmJ1Y2tfbGltaXRfcmVnICAgICAgID0gUFY4ODA4MEFBX1JFR19CVUNLMV9DT05GMSwKKwkJLmJ1Y2tfdmRhY19yYW5nZV9yZWcgID0gUFY4ODA4MEFBX1JFR19CVUNLMV9DT05GMiwKKwkJLmJ1Y2tfdnJhbmdlX2dhaW5fcmVnID0gUFY4ODA4MEFBX1JFR19CVUNLMV9DT05GNSwKKwkJLmJ1Y2tfZW5hYmxlX21hc2sgICAgID0gUFY4ODA4MF9CVUNLMV9FTiwKKwkJLmJ1Y2tfdnNlbF9tYXNrICAgICAgID0gUFY4ODA4MF9WQlVDSzFfTUFTSywKKwkJLmJ1Y2tfbGltaXRfbWFzayAgICAgID0gUFY4ODA4MF9CVUNLMV9JTElNX01BU0ssCisJfSwKKwkvKiBCVUNLMiAqLworCS5idWNrX3JlZ21hcFsxXSA9IHsKKwkJLmJ1Y2tfZW5hYmxlX3JlZyAgICAgID0gUFY4ODA4MEFBX1JFR19CVUNLMl9DT05GMCwKKwkJLmJ1Y2tfdnNlbF9yZWcgICAgICAgID0gUFY4ODA4MEFBX1JFR19CVUNLMl9DT05GMCwKKwkJLmJ1Y2tfbW9kZV9yZWcgICAgICAgID0gUFY4ODA4MEFBX1JFR19CVUNLMl9DT05GMSwKKwkJLmJ1Y2tfbGltaXRfcmVnCSAgICAgID0gUFY4ODA4MEFBX1JFR19CVUNLMl9DT05GMSwKKwkJLmJ1Y2tfdmRhY19yYW5nZV9yZWcgID0gUFY4ODA4MEFBX1JFR19CVUNLMl9DT05GMiwKKwkJLmJ1Y2tfdnJhbmdlX2dhaW5fcmVnID0gUFY4ODA4MEFBX1JFR19CVUNLMl9DT05GNSwKKwkJLmJ1Y2tfZW5hYmxlX21hc2sJICA9IFBWODgwODBfQlVDSzJfRU4sCisJCS5idWNrX3ZzZWxfbWFzayAgICAgICA9IFBWODgwODBfVkJVQ0syX01BU0ssCisJCS5idWNrX2xpbWl0X21hc2sgICAgICA9IFBWODgwODBfQlVDSzJfSUxJTV9NQVNLLAorCX0sCisJLyogQlVDSzMgKi8KKwkuYnVja19yZWdtYXBbMl0gPSB7CisJCS5idWNrX2VuYWJsZV9yZWcJICA9IFBWODgwODBBQV9SRUdfQlVDSzNfQ09ORjAsCisJCS5idWNrX3ZzZWxfcmVnICAgICAgICA9IFBWODgwODBBQV9SRUdfQlVDSzNfQ09ORjAsCisJCS5idWNrX21vZGVfcmVnICAgICAgICA9IFBWODgwODBBQV9SRUdfQlVDSzNfQ09ORjEsCisJCS5idWNrX2xpbWl0X3JlZwkgICAgICA9IFBWODgwODBBQV9SRUdfQlVDSzNfQ09ORjEsCisJCS5idWNrX3ZkYWNfcmFuZ2VfcmVnICA9IFBWODgwODBBQV9SRUdfQlVDSzNfQ09ORjIsCisJCS5idWNrX3ZyYW5nZV9nYWluX3JlZyA9IFBWODgwODBBQV9SRUdfQlVDSzNfQ09ORjUsCisJCS5idWNrX2VuYWJsZV9tYXNrCSAgPSBQVjg4MDgwX0JVQ0szX0VOLAorCQkuYnVja192c2VsX21hc2sgICAgICAgPSBQVjg4MDgwX1ZCVUNLM19NQVNLLAorCQkuYnVja19saW1pdF9tYXNrICAgICAgPSBQVjg4MDgwX0JVQ0szX0lMSU1fTUFTSywKKwl9LAorCS8qIEhWQlVDSyAqLworCS5odmJ1Y2tfZW5hYmxlX3JlZwkgICAgICA9IFBWODgwODBBQV9SRUdfSFZCVUNLX0NPTkYyLAorCS5odmJ1Y2tfdnNlbF9yZWcgICAgICAgICAgPSBQVjg4MDgwQUFfUkVHX0hWQlVDS19DT05GMSwKKwkuaHZidWNrX2VuYWJsZV9tYXNrICAgICAgID0gUFY4ODA4MF9IVkJVQ0tfRU4sCisJLmh2YnVja192c2VsX21hc2sgICAgICAgICA9IFBWODgwODBfVkhWQlVDS19NQVNLLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwdjg4MDgwX2NvbXBhdGlibGVfcmVnbWFwIHB2ODgwODBfYmFfcmVncyA9IHsKKwkvKiBCVUNLMSAqLworCS5idWNrX3JlZ21hcFswXSA9IHsKKwkJLmJ1Y2tfZW5hYmxlX3JlZwkgID0gUFY4ODA4MEJBX1JFR19CVUNLMV9DT05GMCwKKwkJLmJ1Y2tfdnNlbF9yZWcgICAgICAgID0gUFY4ODA4MEJBX1JFR19CVUNLMV9DT05GMCwKKwkJLmJ1Y2tfbW9kZV9yZWcgICAgICAgID0gUFY4ODA4MEJBX1JFR19CVUNLMV9DT05GMSwKKwkJLmJ1Y2tfbGltaXRfcmVnICAgICAgID0gUFY4ODA4MEJBX1JFR19CVUNLMV9DT05GMSwKKwkJLmJ1Y2tfdmRhY19yYW5nZV9yZWcgID0gUFY4ODA4MEJBX1JFR19CVUNLMV9DT05GMiwKKwkJLmJ1Y2tfdnJhbmdlX2dhaW5fcmVnID0gUFY4ODA4MEJBX1JFR19CVUNLMV9DT05GNSwKKwkJLmJ1Y2tfZW5hYmxlX21hc2sgICAgID0gUFY4ODA4MF9CVUNLMV9FTiwKKwkJLmJ1Y2tfdnNlbF9tYXNrICAgICAgID0gUFY4ODA4MF9WQlVDSzFfTUFTSywKKwkJLmJ1Y2tfbGltaXRfbWFzawkgID0gUFY4ODA4MF9CVUNLMV9JTElNX01BU0ssCisJfSwKKwkvKiBCVUNLMiAqLworCS5idWNrX3JlZ21hcFsxXSA9IHsKKwkJLmJ1Y2tfZW5hYmxlX3JlZwkgID0gUFY4ODA4MEJBX1JFR19CVUNLMl9DT05GMCwKKwkJLmJ1Y2tfdnNlbF9yZWcgICAgICAgID0gUFY4ODA4MEJBX1JFR19CVUNLMl9DT05GMCwKKwkJLmJ1Y2tfbW9kZV9yZWcgICAgICAgID0gUFY4ODA4MEJBX1JFR19CVUNLMl9DT05GMSwKKwkJLmJ1Y2tfbGltaXRfcmVnCSAgICAgID0gUFY4ODA4MEJBX1JFR19CVUNLMl9DT05GMSwKKwkJLmJ1Y2tfdmRhY19yYW5nZV9yZWcgID0gUFY4ODA4MEJBX1JFR19CVUNLMl9DT05GMiwKKwkJLmJ1Y2tfdnJhbmdlX2dhaW5fcmVnID0gUFY4ODA4MEJBX1JFR19CVUNLMl9DT05GNSwKKwkJLmJ1Y2tfZW5hYmxlX21hc2sJICA9IFBWODgwODBfQlVDSzJfRU4sCisJCS5idWNrX3ZzZWxfbWFzayAgICAgICA9IFBWODgwODBfVkJVQ0syX01BU0ssCisJCS5idWNrX2xpbWl0X21hc2sJICA9IFBWODgwODBfQlVDSzJfSUxJTV9NQVNLLAorCX0sCisJLyogQlVDSzMgKi8KKwkuYnVja19yZWdtYXBbMl0gPSB7CisJCS5idWNrX2VuYWJsZV9yZWcJICA9IFBWODgwODBCQV9SRUdfQlVDSzNfQ09ORjAsCisJCS5idWNrX3ZzZWxfcmVnICAgICAgICA9IFBWODgwODBCQV9SRUdfQlVDSzNfQ09ORjAsCisJCS5idWNrX21vZGVfcmVnICAgICAgICA9IFBWODgwODBCQV9SRUdfQlVDSzNfQ09ORjEsCisJCS5idWNrX2xpbWl0X3JlZwkgICAgICA9IFBWODgwODBCQV9SRUdfQlVDSzNfQ09ORjEsCisJCS5idWNrX3ZkYWNfcmFuZ2VfcmVnICA9IFBWODgwODBCQV9SRUdfQlVDSzNfQ09ORjIsCisJCS5idWNrX3ZyYW5nZV9nYWluX3JlZyA9IFBWODgwODBCQV9SRUdfQlVDSzNfQ09ORjUsCisJCS5idWNrX2VuYWJsZV9tYXNrCSAgPSBQVjg4MDgwX0JVQ0szX0VOLAorCQkuYnVja192c2VsX21hc2sgICAgICAgPSBQVjg4MDgwX1ZCVUNLM19NQVNLLAorCQkuYnVja19saW1pdF9tYXNrCSAgPSBQVjg4MDgwX0JVQ0szX0lMSU1fTUFTSywKKwl9LAorCS8qIEhWQlVDSyAqLworCS5odmJ1Y2tfZW5hYmxlX3JlZwkgICAgICA9IFBWODgwODBCQV9SRUdfSFZCVUNLX0NPTkYyLAorCS5odmJ1Y2tfdnNlbF9yZWcgICAgICAgICAgPSBQVjg4MDgwQkFfUkVHX0hWQlVDS19DT05GMSwKKwkuaHZidWNrX2VuYWJsZV9tYXNrICAgICAgID0gUFY4ODA4MF9IVkJVQ0tfRU4sCisJLmh2YnVja192c2VsX21hc2sJCSAgPSBQVjg4MDgwX1ZIVkJVQ0tfTUFTSywKK307CisKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHB2ODgwODBfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJwdnMscHY4ODA4MCIsICAgIC5kYXRhID0gKHZvaWQgKilUWVBFX1BWODgwODBfQUEgfSwKKwl7IC5jb21wYXRpYmxlID0gInB2cyxwdjg4MDgwLWFhIiwgLmRhdGEgPSAodm9pZCAqKVRZUEVfUFY4ODA4MF9BQSB9LAorCXsgLmNvbXBhdGlibGUgPSAicHZzLHB2ODgwODAtYmEiLCAuZGF0YSA9ICh2b2lkICopVFlQRV9QVjg4MDgwX0JBIH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcHY4ODA4MF9kdF9pZHMpOworI2VuZGlmCisKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcHY4ODA4MF9idWNrX2dldF9tb2RlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQogewogCXN0cnVjdCBwdjg4MDgwX3JlZ3VsYXRvciAqaW5mbyA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CiAJdW5zaWduZWQgaW50IGRhdGE7CiAJaW50IHJldCwgbW9kZSA9IDA7CiAKLQlyZXQgPSByZWdtYXBfcmVhZChyZGV2LT5yZWdtYXAsIGluZm8tPmNvbmYsICZkYXRhKTsKKwlyZXQgPSByZWdtYXBfcmVhZChyZGV2LT5yZWdtYXAsIGluZm8tPm1vZGVfcmVnLCAmZGF0YSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTEzNiw3ICsyNjgsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHJkZXYtPnJlZ21hcCwgaW5mby0+Y29uZiwKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHJkZXYtPnJlZ21hcCwgaW5mby0+bW9kZV9yZWcsCiAJCQkJCVBWODgwODBfQlVDSzFfTU9ERV9NQVNLLCB2YWwpOwogfQogCkBAIC0xNTEsNyArMjgzLDcgQEAKIAkJaWYgKG1pbiA8PSBpbmZvLT5jdXJyZW50X2xpbWl0c1tpXQogCQkJJiYgbWF4ID49IGluZm8tPmN1cnJlbnRfbGltaXRzW2ldKSB7CiAJCQkJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhyZGV2LT5yZWdtYXAsCi0JCQkJCWluZm8tPmNvbmYsCisJCQkJCWluZm8tPmxpbWl0X3JlZywKIAkJCQkJaW5mby0+bGltaXRfbWFzaywKIAkJCQkJaSA8PCBQVjg4MDgwX0JVQ0sxX0lMSU1fU0hJRlQpOwogCQl9CkBAIC0xNjYsNyArMjk4LDcgQEAKIAl1bnNpZ25lZCBpbnQgZGF0YTsKIAlpbnQgcmV0OwogCi0JcmV0ID0gcmVnbWFwX3JlYWQocmRldi0+cmVnbWFwLCBpbmZvLT5jb25mLCAmZGF0YSk7CisJcmV0ID0gcmVnbWFwX3JlYWQocmRldi0+cmVnbWFwLCBpbmZvLT5saW1pdF9yZWcsICZkYXRhKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTg3LDYgKzMxOSwxNSBAQAogCS5nZXRfY3VycmVudF9saW1pdCA9IHB2ODgwODBfZ2V0X2N1cnJlbnRfbGltaXQsCiB9OwogCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgcHY4ODA4MF9odmJ1Y2tfb3BzID0geworCS5lbmFibGUgPSByZWd1bGF0b3JfZW5hYmxlX3JlZ21hcCwKKwkuZGlzYWJsZSA9IHJlZ3VsYXRvcl9kaXNhYmxlX3JlZ21hcCwKKwkuaXNfZW5hYmxlZCA9IHJlZ3VsYXRvcl9pc19lbmFibGVkX3JlZ21hcCwKKwkuc2V0X3ZvbHRhZ2Vfc2VsID0gcmVndWxhdG9yX3NldF92b2x0YWdlX3NlbF9yZWdtYXAsCisJLmdldF92b2x0YWdlX3NlbCA9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZV9zZWxfcmVnbWFwLAorCS5saXN0X3ZvbHRhZ2UgPSByZWd1bGF0b3JfbGlzdF92b2x0YWdlX2xpbmVhciwKK307CisKICNkZWZpbmUgUFY4ODA4MF9CVUNLKGNoaXAsIHJlZ2xfbmFtZSwgbWluLCBzdGVwLCBtYXgsIGxpbWl0c19hcnJheSkgXAoge1wKIAkuZGVzYwk9CXtcCkBAIC0yMDAsMTcgKzM0MSwyNSBAQAogCQkubWluX3VWID0gbWluLCBcCiAJCS51Vl9zdGVwID0gc3RlcCwgXAogCQkubl92b2x0YWdlcyA9ICgobWF4KSAtIChtaW4pKS8oc3RlcCkgKyAxLCBcCi0JCS5lbmFibGVfcmVnID0gUFY4ODA4MF9SRUdfIyNyZWdsX25hbWUjI19DT05GMCwgXAotCQkuZW5hYmxlX21hc2sgPSBQVjg4MDgwXyMjcmVnbF9uYW1lIyNfRU4sIFwKLQkJLnZzZWxfcmVnID0gUFY4ODA4MF9SRUdfIyNyZWdsX25hbWUjI19DT05GMCwgXAotCQkudnNlbF9tYXNrID0gUFY4ODA4MF9WIyNyZWdsX25hbWUjI19NQVNLLCBcCiAJfSxcCiAJLmN1cnJlbnRfbGltaXRzID0gbGltaXRzX2FycmF5LCBcCiAJLm5fY3VycmVudF9saW1pdHMgPSBBUlJBWV9TSVpFKGxpbWl0c19hcnJheSksIFwKLQkubGltaXRfbWFzayA9IFBWODgwODBfIyNyZWdsX25hbWUjI19JTElNX01BU0ssIFwKLQkuY29uZiA9IFBWODgwODBfUkVHXyMjcmVnbF9uYW1lIyNfQ09ORjEsIFwKLQkuY29uZjIgPSBQVjg4MDgwX1JFR18jI3JlZ2xfbmFtZSMjX0NPTkYyLCBcCi0JLmNvbmY1ID0gUFY4ODA4MF9SRUdfIyNyZWdsX25hbWUjI19DT05GNSwgXAorfQorCisjZGVmaW5lIFBWODgwODBfSFZCVUNLKGNoaXAsIHJlZ2xfbmFtZSwgbWluLCBzdGVwLCBtYXgpIFwKK3tcCisJLmRlc2MJPQl7XAorCQkuaWQgPSBjaGlwIyNfSURfIyNyZWdsX25hbWUsXAorCQkubmFtZSA9IF9fc3RyaW5naWZ5KGNoaXAjI18jI3JlZ2xfbmFtZSksXAorCQkub2ZfbWF0Y2ggPSBvZl9tYXRjaF9wdHIoI3JlZ2xfbmFtZSksXAorCQkucmVndWxhdG9yc19ub2RlID0gb2ZfbWF0Y2hfcHRyKCJyZWd1bGF0b3JzIiksXAorCQkudHlwZSA9IFJFR1VMQVRPUl9WT0xUQUdFLFwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsXAorCQkub3BzID0gJnB2ODgwODBfaHZidWNrX29wcyxcCisJCS5taW5fdVYgPSBtaW4sIFwKKwkJLnVWX3N0ZXAgPSBzdGVwLCBcCisJCS5uX3ZvbHRhZ2VzID0gKChtYXgpIC0gKG1pbikpLyhzdGVwKSArIDEsIFwKKwl9LFwKIH0KIAogc3RhdGljIHN0cnVjdCBwdjg4MDgwX3JlZ3VsYXRvciBwdjg4MDgwX3JlZ3VsYXRvcl9pbmZvW10gPSB7CkBAIC0yMjAsNiArMzY5LDcgQEAKIAkJcHY4ODA4MF9idWNrMjNfbGltaXRzKSwKIAlQVjg4MDgwX0JVQ0soUFY4ODA4MCwgQlVDSzMsIDYwMDAwMCwgNjI1MCwgMTM5Mzc1MCwKIAkJcHY4ODA4MF9idWNrMjNfbGltaXRzKSwKKwlQVjg4MDgwX0hWQlVDSyhQVjg4MDgwLCBIVkJVQ0ssIDAsIDUwMDAsIDEyNzUwMDApLAogfTsKIAogc3RhdGljIGlycXJldHVybl90IHB2ODgwODBfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKQEAgLTI4MCw2ICs0MzAsOCBAQAogewogCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICppbml0X2RhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZpMmMtPmRldik7CiAJc3RydWN0IHB2ODgwODAgKmNoaXA7CisJY29uc3Qgc3RydWN0IHB2ODgwODBfY29tcGF0aWJsZV9yZWdtYXAgKnJlZ21hcF9jb25maWc7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CiAJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0geyB9OwogCWludCBpLCBlcnJvciwgcmV0OwogCXVuc2lnbmVkIGludCBjb25mMiwgY29uZjU7CkBAIC0yOTcsNiArNDQ5LDE3IEBACiAJCXJldHVybiBlcnJvcjsKIAl9CiAKKwlpZiAoaTJjLT5kZXYub2Zfbm9kZSkgeworCQltYXRjaCA9IG9mX21hdGNoX25vZGUocHY4ODA4MF9kdF9pZHMsIGkyYy0+ZGV2Lm9mX25vZGUpOworCQlpZiAoIW1hdGNoKSB7CisJCQlkZXZfZXJyKGNoaXAtPmRldiwgIkZhaWxlZCB0byBnZXQgb2ZfbWF0Y2hfbm9kZVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQljaGlwLT50eXBlID0gKHVuc2lnbmVkIGxvbmcpbWF0Y2gtPmRhdGE7CisJfSBlbHNlIHsKKwkJY2hpcC0+dHlwZSA9IGlkLT5kcml2ZXJfZGF0YTsKKwl9CisKIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBjaGlwKTsKIAogCWlmIChpMmMtPmlycSAhPSAwKSB7CkBAIC0zMzYsMzEgKzQ5OSw1OCBAQAogCQkJCSJGYWlsZWQgdG8gdXBkYXRlIG1hc2sgcmVnOiAlZFxuIiwgcmV0KTsKIAkJCXJldHVybiByZXQ7CiAJCX0KLQogCX0gZWxzZSB7CiAJCWRldl93YXJuKGNoaXAtPmRldiwgIk5vIElSUSBjb25maWd1cmVkXG4iKTsKIAl9CiAKKwlzd2l0Y2ggKGNoaXAtPnR5cGUpIHsKKwljYXNlIFRZUEVfUFY4ODA4MF9BQToKKwkJY2hpcC0+cmVnbWFwX2NvbmZpZyA9ICZwdjg4MDgwX2FhX3JlZ3M7CisJCWJyZWFrOworCWNhc2UgVFlQRV9QVjg4MDgwX0JBOgorCQljaGlwLT5yZWdtYXBfY29uZmlnID0gJnB2ODgwODBfYmFfcmVnczsKKwkJYnJlYWs7CisJfQorCisJcmVnbWFwX2NvbmZpZyA9IGNoaXAtPnJlZ21hcF9jb25maWc7CiAJY29uZmlnLmRldiA9IGNoaXAtPmRldjsKIAljb25maWcucmVnbWFwID0gY2hpcC0+cmVnbWFwOwogCi0JZm9yIChpID0gMDsgaSA8IFBWODgwODBfTUFYX1JFR1VMQVRPUlM7IGkrKykgeworCS8qIFJlZ2lzdGVyYXRpb24gZm9yIEJVQ0sxLCAyLCAzICovCisJZm9yIChpID0gMDsgaSA8IFBWODgwODBfTUFYX1JFR1VMQVRPUlMtMTsgaSsrKSB7CiAJCWlmIChpbml0X2RhdGEpCiAJCQljb25maWcuaW5pdF9kYXRhID0gJmluaXRfZGF0YVtpXTsKIAorCQlwdjg4MDgwX3JlZ3VsYXRvcl9pbmZvW2ldLmxpbWl0X3JlZworCQkJPSByZWdtYXBfY29uZmlnLT5idWNrX3JlZ21hcFtpXS5idWNrX2xpbWl0X3JlZzsKKwkJcHY4ODA4MF9yZWd1bGF0b3JfaW5mb1tpXS5saW1pdF9tYXNrCisJCQk9IHJlZ21hcF9jb25maWctPmJ1Y2tfcmVnbWFwW2ldLmJ1Y2tfbGltaXRfbWFzazsKKwkJcHY4ODA4MF9yZWd1bGF0b3JfaW5mb1tpXS5tb2RlX3JlZworCQkJPSByZWdtYXBfY29uZmlnLT5idWNrX3JlZ21hcFtpXS5idWNrX21vZGVfcmVnOworCQlwdjg4MDgwX3JlZ3VsYXRvcl9pbmZvW2ldLmNvbmYyCisJCQk9IHJlZ21hcF9jb25maWctPmJ1Y2tfcmVnbWFwW2ldLmJ1Y2tfdmRhY19yYW5nZV9yZWc7CisJCXB2ODgwODBfcmVndWxhdG9yX2luZm9baV0uY29uZjUKKwkJCT0gcmVnbWFwX2NvbmZpZy0+YnVja19yZWdtYXBbaV0uYnVja192cmFuZ2VfZ2Fpbl9yZWc7CisJCXB2ODgwODBfcmVndWxhdG9yX2luZm9baV0uZGVzYy5lbmFibGVfcmVnCisJCQk9IHJlZ21hcF9jb25maWctPmJ1Y2tfcmVnbWFwW2ldLmJ1Y2tfZW5hYmxlX3JlZzsKKwkJcHY4ODA4MF9yZWd1bGF0b3JfaW5mb1tpXS5kZXNjLmVuYWJsZV9tYXNrCisJCQk9IHJlZ21hcF9jb25maWctPmJ1Y2tfcmVnbWFwW2ldLmJ1Y2tfZW5hYmxlX21hc2s7CisJCXB2ODgwODBfcmVndWxhdG9yX2luZm9baV0uZGVzYy52c2VsX3JlZworCQkJPSByZWdtYXBfY29uZmlnLT5idWNrX3JlZ21hcFtpXS5idWNrX3ZzZWxfcmVnOworCQlwdjg4MDgwX3JlZ3VsYXRvcl9pbmZvW2ldLmRlc2MudnNlbF9tYXNrCisJCQk9IHJlZ21hcF9jb25maWctPmJ1Y2tfcmVnbWFwW2ldLmJ1Y2tfdnNlbF9tYXNrOworCiAJCXJldCA9IHJlZ21hcF9yZWFkKGNoaXAtPnJlZ21hcCwKLQkJCXB2ODgwODBfcmVndWxhdG9yX2luZm9baV0uY29uZjIsICZjb25mMik7CisJCQkJcHY4ODA4MF9yZWd1bGF0b3JfaW5mb1tpXS5jb25mMiwgJmNvbmYyKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwotCiAJCWNvbmYyID0gKChjb25mMiA+PiBQVjg4MDgwX0JVQ0tfVkRBQ19SQU5HRV9TSElGVCkgJgogCQkJUFY4ODA4MF9CVUNLX1ZEQUNfUkFOR0VfTUFTSyk7CiAKIAkJcmV0ID0gcmVnbWFwX3JlYWQoY2hpcC0+cmVnbWFwLAotCQkJcHY4ODA4MF9yZWd1bGF0b3JfaW5mb1tpXS5jb25mNSwgJmNvbmY1KTsKKwkJCQlwdjg4MDgwX3JlZ3VsYXRvcl9pbmZvW2ldLmNvbmY1LCAmY29uZjUpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7Ci0KIAkJY29uZjUgPSAoKGNvbmY1ID4+IFBWODgwODBfQlVDS19WUkFOR0VfR0FJTl9TSElGVCkgJgogCQkJUFY4ODA4MF9CVUNLX1ZSQU5HRV9HQUlOX01BU0spOwogCkBAIC0zODMsMjMgKzU3MywzOCBAQAogCQl9CiAJfQogCisJcHY4ODA4MF9yZWd1bGF0b3JfaW5mb1tQVjg4MDgwX0lEX0hWQlVDS10uZGVzYy5lbmFibGVfcmVnCisJCT0gcmVnbWFwX2NvbmZpZy0+aHZidWNrX2VuYWJsZV9yZWc7CisJcHY4ODA4MF9yZWd1bGF0b3JfaW5mb1tQVjg4MDgwX0lEX0hWQlVDS10uZGVzYy5lbmFibGVfbWFzaworCQk9IHJlZ21hcF9jb25maWctPmh2YnVja19lbmFibGVfbWFzazsKKwlwdjg4MDgwX3JlZ3VsYXRvcl9pbmZvW1BWODgwODBfSURfSFZCVUNLXS5kZXNjLnZzZWxfcmVnCisJCT0gcmVnbWFwX2NvbmZpZy0+aHZidWNrX3ZzZWxfcmVnOworCXB2ODgwODBfcmVndWxhdG9yX2luZm9bUFY4ODA4MF9JRF9IVkJVQ0tdLmRlc2MudnNlbF9tYXNrCisJCT0gcmVnbWFwX2NvbmZpZy0+aHZidWNrX3ZzZWxfbWFzazsKKworCS8qIFJlZ2lzdGVyYXRpb24gZm9yIEhWQlVDSyAqLworCWlmIChpbml0X2RhdGEpCisJCWNvbmZpZy5pbml0X2RhdGEgPSAmaW5pdF9kYXRhW1BWODgwODBfSURfSFZCVUNLXTsKKworCWNvbmZpZy5kcml2ZXJfZGF0YSA9ICh2b2lkICopJnB2ODgwODBfcmVndWxhdG9yX2luZm9bUFY4ODA4MF9JRF9IVkJVQ0tdOworCWNoaXAtPnJkZXZbUFY4ODA4MF9JRF9IVkJVQ0tdID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoY2hpcC0+ZGV2LAorCQkmcHY4ODA4MF9yZWd1bGF0b3JfaW5mb1tQVjg4MDgwX0lEX0hWQlVDS10uZGVzYywgJmNvbmZpZyk7CisJaWYgKElTX0VSUihjaGlwLT5yZGV2W1BWODgwODBfSURfSFZCVUNLXSkpIHsKKwkJZGV2X2VycihjaGlwLT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgUFY4ODA4MCByZWd1bGF0b3JcbiIpOworCQlyZXR1cm4gUFRSX0VSUihjaGlwLT5yZGV2W1BWODgwODBfSURfSFZCVUNLXSk7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBwdjg4MDgwX2kyY19pZFtdID0gewotCXsicHY4ODA4MCIsIDB9LAorCXsgInB2ODgwODAiLCAgICBUWVBFX1BWODgwODBfQUEgfSwKKwl7ICJwdjg4MDgwLWFhIiwgVFlQRV9QVjg4MDgwX0FBIH0sCisJeyAicHY4ODA4MC1iYSIsIFRZUEVfUFY4ODA4MF9CQSB9LAogCXt9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBwdjg4MDgwX2kyY19pZCk7CiAKLSNpZmRlZiBDT05GSUdfT0YKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHB2ODgwODBfZHRfaWRzW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJwdnMscHY4ODA4MCIsIC5kYXRhID0gJnB2ODgwODBfaTJjX2lkWzBdIH0sCi0Je30sCi19OwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcHY4ODA4MF9kdF9pZHMpOwotI2VuZGlmCi0KIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBwdjg4MDgwX3JlZ3VsYXRvcl9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAicHY4ODA4MCIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9wdjg4MDgwLXJlZ3VsYXRvci5oIGIvZHJpdmVycy9yZWd1bGF0b3IvcHY4ODA4MC1yZWd1bGF0b3IuaAppbmRleCA1ZTlhZmRlLi5hZTI1ZmYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9wdjg4MDgwLXJlZ3VsYXRvci5oCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3B2ODgwODAtcmVndWxhdG9yLmgKQEAgLTE3LDU1ICsxNyw3NSBAQAogI2RlZmluZSBfX1BWODgwODBfUkVHSVNURVJTX0hfXwogCiAvKiBTeXN0ZW0gQ29udHJvbCBhbmQgRXZlbnQgUmVnaXN0ZXJzICovCi0jZGVmaW5lCVBWODgwODBfUkVHX0VWRU5UX0EJCQkweDA0Ci0jZGVmaW5lCVBWODgwODBfUkVHX01BU0tfQQkJCTB4MDkKLSNkZWZpbmUJUFY4ODA4MF9SRUdfTUFTS19CCQkJMHgwYQotI2RlZmluZQlQVjg4MDgwX1JFR19NQVNLX0MJCQkweDBiCisjZGVmaW5lCVBWODgwODBfUkVHX0VWRU5UX0EJCQkJMHgwNAorI2RlZmluZQlQVjg4MDgwX1JFR19NQVNLX0EJCQkJMHgwOQorI2RlZmluZQlQVjg4MDgwX1JFR19NQVNLX0IJCQkJMHgwQQorI2RlZmluZQlQVjg4MDgwX1JFR19NQVNLX0MJCQkJMHgwQgogCi0vKiBSZWd1bGF0b3IgUmVnaXN0ZXJzICovCi0jZGVmaW5lCVBWODgwODBfUkVHX0JVQ0sxX0NPTkYwCQkJMHgyNwotI2RlZmluZQlQVjg4MDgwX1JFR19CVUNLMV9DT05GMQkJCTB4MjgKLSNkZWZpbmUJUFY4ODA4MF9SRUdfQlVDSzFfQ09ORjIJCQkweDU5Ci0jZGVmaW5lCVBWODgwODBfUkVHX0JVQ0sxX0NPTkY1CQkJMHg1YwotI2RlZmluZQlQVjg4MDgwX1JFR19CVUNLMl9DT05GMAkJCTB4MjkKLSNkZWZpbmUJUFY4ODA4MF9SRUdfQlVDSzJfQ09ORjEJCQkweDJhCi0jZGVmaW5lCVBWODgwODBfUkVHX0JVQ0syX0NPTkYyCQkJMHg2MQotI2RlZmluZQlQVjg4MDgwX1JFR19CVUNLMl9DT05GNQkJCTB4NjQKLSNkZWZpbmUJUFY4ODA4MF9SRUdfQlVDSzNfQ09ORjAJCQkweDJiCi0jZGVmaW5lCVBWODgwODBfUkVHX0JVQ0szX0NPTkYxCQkJMHgyYwotI2RlZmluZQlQVjg4MDgwX1JFR19CVUNLM19DT05GMgkJCTB4NjkKLSNkZWZpbmUJUFY4ODA4MF9SRUdfQlVDSzNfQ09ORjUJCQkweDZjCisvKiBSZWd1bGF0b3IgUmVnaXN0ZXJzIC0gcmV2LiBBQSAqLworI2RlZmluZSBQVjg4MDgwQUFfUkVHX0hWQlVDS19DT05GMQkJMHgyRAorI2RlZmluZSBQVjg4MDgwQUFfUkVHX0hWQlVDS19DT05GMgkJMHgyRQorI2RlZmluZQlQVjg4MDgwQUFfUkVHX0JVQ0sxX0NPTkYwCQkweDI3CisjZGVmaW5lCVBWODgwODBBQV9SRUdfQlVDSzFfQ09ORjEJCTB4MjgKKyNkZWZpbmUJUFY4ODA4MEFBX1JFR19CVUNLMV9DT05GMgkJMHg1OQorI2RlZmluZQlQVjg4MDgwQUFfUkVHX0JVQ0sxX0NPTkY1CQkweDVDCisjZGVmaW5lCVBWODgwODBBQV9SRUdfQlVDSzJfQ09ORjAJCTB4MjkKKyNkZWZpbmUJUFY4ODA4MEFBX1JFR19CVUNLMl9DT05GMQkJMHgyQQorI2RlZmluZQlQVjg4MDgwQUFfUkVHX0JVQ0syX0NPTkYyCQkweDYxCisjZGVmaW5lCVBWODgwODBBQV9SRUdfQlVDSzJfQ09ORjUJCTB4NjQKKyNkZWZpbmUJUFY4ODA4MEFBX1JFR19CVUNLM19DT05GMAkJMHgyQgorI2RlZmluZQlQVjg4MDgwQUFfUkVHX0JVQ0szX0NPTkYxCQkweDJDCisjZGVmaW5lCVBWODgwODBBQV9SRUdfQlVDSzNfQ09ORjIJCTB4NjkKKyNkZWZpbmUJUFY4ODA4MEFBX1JFR19CVUNLM19DT05GNQkJMHg2QworCisvKiBSZWd1bGF0b3IgUmVnaXN0ZXJzIC0gcmV2LiBCQSAqLworI2RlZmluZQlQVjg4MDgwQkFfUkVHX0hWQlVDS19DT05GMQkJMHgzMworI2RlZmluZQlQVjg4MDgwQkFfUkVHX0hWQlVDS19DT05GMgkJMHgzNAorI2RlZmluZQlQVjg4MDgwQkFfUkVHX0JVQ0sxX0NPTkYwCQkweDJBCisjZGVmaW5lCVBWODgwODBCQV9SRUdfQlVDSzFfQ09ORjEJCTB4MkMKKyNkZWZpbmUJUFY4ODA4MEJBX1JFR19CVUNLMV9DT05GMgkJMHg1QQorI2RlZmluZQlQVjg4MDgwQkFfUkVHX0JVQ0sxX0NPTkY1CQkweDVECisjZGVmaW5lCVBWODgwODBCQV9SRUdfQlVDSzJfQ09ORjAJCTB4MkQKKyNkZWZpbmUJUFY4ODA4MEJBX1JFR19CVUNLMl9DT05GMQkJMHgyRgorI2RlZmluZQlQVjg4MDgwQkFfUkVHX0JVQ0syX0NPTkYyCQkweDYzCisjZGVmaW5lCVBWODgwODBCQV9SRUdfQlVDSzJfQ09ORjUJCTB4NjYKKyNkZWZpbmUJUFY4ODA4MEJBX1JFR19CVUNLM19DT05GMAkJMHgzMAorI2RlZmluZQlQVjg4MDgwQkFfUkVHX0JVQ0szX0NPTkYxCQkweDMyCisjZGVmaW5lCVBWODgwODBCQV9SRUdfQlVDSzNfQ09ORjIJCTB4NkMKKyNkZWZpbmUJUFY4ODA4MEJBX1JFR19CVUNLM19DT05GNQkJMHg2RgogCiAvKiBQVjg4MDgwX1JFR19FVkVOVF9BIChhZGRyPTB4MDQpICovCiAjZGVmaW5lCVBWODgwODBfRV9WRERfRkxUCQkJCTB4MDEKLSNkZWZpbmUJUFY4ODA4MF9FX09WRVJfVEVNUAkJCTB4MDIKKyNkZWZpbmUJUFY4ODA4MF9FX09WRVJfVEVNUAkJCQkweDAyCiAKIC8qIFBWODgwODBfUkVHX01BU0tfQSAoYWRkcj0weDA5KSAqLwogI2RlZmluZQlQVjg4MDgwX01fVkREX0ZMVAkJCQkweDAxCi0jZGVmaW5lCVBWODgwODBfTV9PVkVSX1RFTVAJCQkweDAyCisjZGVmaW5lCVBWODgwODBfTV9PVkVSX1RFTVAJCQkJMHgwMgogCi0vKiBQVjg4MDgwX1JFR19CVUNLMV9DT05GMCAoYWRkcj0weDI3KSAqLworLyogUFY4ODA4MF9SRUdfQlVDSzFfQ09ORjAgKGFkZHI9MHgyN3wweDJBKSAqLwogI2RlZmluZQlQVjg4MDgwX0JVQ0sxX0VOCQkJCTB4ODAKLSNkZWZpbmUgUFY4ODA4MF9WQlVDSzFfTUFTSwkJCTB4N0YKLS8qIFBWODgwODBfUkVHX0JVQ0syX0NPTkYwIChhZGRyPTB4MjkpICovCi0jZGVmaW5lCVBWODgwODBfQlVDSzJfRU4JCQkJMHg4MAotI2RlZmluZSBQVjg4MDgwX1ZCVUNLMl9NQVNLCQkJMHg3RgotLyogUFY4ODA4MF9SRUdfQlVDSzNfQ09ORjAgKGFkZHI9MHgyYikgKi8KLSNkZWZpbmUJUFY4ODA4MF9CVUNLM19FTgkJCQkweDgwCi0jZGVmaW5lIFBWODgwODBfVkJVQ0szX01BU0sJCQkweDdGCisjZGVmaW5lIFBWODgwODBfVkJVQ0sxX01BU0sJCQkJMHg3RgogCi0vKiBQVjg4MDgwX1JFR19CVUNLMV9DT05GMSAoYWRkcj0weDI4KSAqLwotI2RlZmluZSBQVjg4MDgwX0JVQ0sxX0lMSU1fU0hJRlQJCQkyCisvKiBQVjg4MDgwX1JFR19CVUNLMl9DT05GMCAoYWRkcj0weDI5fDB4MkQpICovCisjZGVmaW5lCVBWODgwODBfQlVDSzJfRU4JCQkJMHg4MAorI2RlZmluZSBQVjg4MDgwX1ZCVUNLMl9NQVNLCQkJCTB4N0YKKworLyogUFY4ODA4MF9SRUdfQlVDSzNfQ09ORjAgKGFkZHI9MHgyQnwweDMwKSAqLworI2RlZmluZQlQVjg4MDgwX0JVQ0szX0VOCQkJCTB4ODAKKyNkZWZpbmUgUFY4ODA4MF9WQlVDSzNfTUFTSwkJCQkweDdGCisKKy8qIFBWODgwODBfUkVHX0JVQ0sxX0NPTkYxIChhZGRyPTB4Mjh8MHgyQykgKi8KKyNkZWZpbmUgUFY4ODA4MF9CVUNLMV9JTElNX1NISUZUCQkyCiAjZGVmaW5lIFBWODgwODBfQlVDSzFfSUxJTV9NQVNLCQkJMHgwQwogI2RlZmluZSBQVjg4MDgwX0JVQ0sxX01PREVfTUFTSwkJCTB4MDMKIAotLyogUFY4ODA4MF9SRUdfQlVDSzJfQ09ORjEgKGFkZHI9MHgyYSkgKi8KLSNkZWZpbmUgUFY4ODA4MF9CVUNLMl9JTElNX1NISUZUCQkJMgorLyogUFY4ODA4MF9SRUdfQlVDSzJfQ09ORjEgKGFkZHI9MHgyQXwweDJGKSAqLworI2RlZmluZSBQVjg4MDgwX0JVQ0syX0lMSU1fU0hJRlQJCTIKICNkZWZpbmUgUFY4ODA4MF9CVUNLMl9JTElNX01BU0sJCQkweDBDCiAjZGVmaW5lIFBWODgwODBfQlVDSzJfTU9ERV9NQVNLCQkJMHgwMwogCi0vKiBQVjg4MDgwX1JFR19CVUNLM19DT05GMSAoYWRkcj0weDJjKSAqLwotI2RlZmluZSBQVjg4MDgwX0JVQ0szX0lMSU1fU0hJRlQJCQkyCisvKiBQVjg4MDgwX1JFR19CVUNLM19DT05GMSAoYWRkcj0weDJDfDB4MzIpICovCisjZGVmaW5lIFBWODgwODBfQlVDSzNfSUxJTV9TSElGVAkJMgogI2RlZmluZSBQVjg4MDgwX0JVQ0szX0lMSU1fTUFTSwkJCTB4MEMKICNkZWZpbmUgUFY4ODA4MF9CVUNLM19NT0RFX01BU0sJCQkweDAzCiAKQEAgLTczLDIwICs5MywyNiBAQAogI2RlZmluZQlQVjg4MDgwX0JVQ0tfTU9ERV9BVVRPCQkJMHgwMQogI2RlZmluZQlQVjg4MDgwX0JVQ0tfTU9ERV9TWU5DCQkJMHgwMgogCi0vKiBQVjg4MDgwX1JFR19CVUNLMl9DT05GMiAoYWRkcj0weDYxKSAqLwotLyogUFY4ODA4MF9SRUdfQlVDSzNfQ09ORjIgKGFkZHI9MHg2OSkgKi8KLSNkZWZpbmUgUFY4ODA4MF9CVUNLX1ZEQUNfUkFOR0VfU0hJRlQJCQk3Ci0jZGVmaW5lIFBWODgwODBfQlVDS19WREFDX1JBTkdFX01BU0sJCQkweDAxCisvKiBQVjg4MDgwX1JFR19IVkJVQ0tfQ09ORjEgKGFkZHI9MHgyRHwweDMzKSAqLworI2RlZmluZSBQVjg4MDgwX1ZIVkJVQ0tfTUFTSwkJCTB4RkYKIAotI2RlZmluZSBQVjg4MDgwX0JVQ0tfVkRBQ19SQU5HRV8xCQkJMHgwMAotI2RlZmluZSBQVjg4MDgwX0JVQ0tfVkRBQ19SQU5HRV8yCQkJMHgwMQorLyogUFY4ODA4MF9SRUdfSFZCVUNLX0NPTkYxIChhZGRyPTB4MkV8MHgzNCkgKi8KKyNkZWZpbmUgUFY4ODA4MF9IVkJVQ0tfRU4JCQkJMHgwMQogCi0vKiBQVjg4MDgwX1JFR19CVUNLMl9DT05GNSAoYWRkcj0weDY0KSAqLwotLyogUFY4ODA4MF9SRUdfQlVDSzNfQ09ORjUgKGFkZHI9MHg2YykgKi8KLSNkZWZpbmUgUFY4ODA4MF9CVUNLX1ZSQU5HRV9HQUlOX1NISUZUCQkJMAotI2RlZmluZSBQVjg4MDgwX0JVQ0tfVlJBTkdFX0dBSU5fTUFTSwkJCTB4MDEKKy8qIFBWODgwODBfUkVHX0JVQ0syX0NPTkYyIChhZGRyPTB4NjF8MHg2MykgKi8KKy8qIFBWODgwODBfUkVHX0JVQ0szX0NPTkYyIChhZGRyPTB4Njl8MHg2QykgKi8KKyNkZWZpbmUgUFY4ODA4MF9CVUNLX1ZEQUNfUkFOR0VfU0hJRlQJNworI2RlZmluZSBQVjg4MDgwX0JVQ0tfVkRBQ19SQU5HRV9NQVNLCTB4MDEKIAotI2RlZmluZSBQVjg4MDgwX0JVQ0tfVlJBTkdFX0dBSU5fMQkJCTB4MDAKLSNkZWZpbmUgUFY4ODA4MF9CVUNLX1ZSQU5HRV9HQUlOXzIJCQkweDAxCisjZGVmaW5lIFBWODgwODBfQlVDS19WREFDX1JBTkdFXzEJCTB4MDAKKyNkZWZpbmUgUFY4ODA4MF9CVUNLX1ZEQUNfUkFOR0VfMgkJMHgwMQorCisvKiBQVjg4MDgwX1JFR19CVUNLMl9DT05GNSAoYWRkcj0weDY0fDB4NjYpICovCisvKiBQVjg4MDgwX1JFR19CVUNLM19DT05GNSAoYWRkcj0weDZDfDB4NkYpICovCisjZGVmaW5lIFBWODgwODBfQlVDS19WUkFOR0VfR0FJTl9TSElGVAkwCisjZGVmaW5lIFBWODgwODBfQlVDS19WUkFOR0VfR0FJTl9NQVNLCTB4MDEKKworI2RlZmluZSBQVjg4MDgwX0JVQ0tfVlJBTkdFX0dBSU5fMQkJMHgwMAorI2RlZmluZSBQVjg4MDgwX0JVQ0tfVlJBTkdFX0dBSU5fMgkJMHgwMQogCiAjZW5kaWYJLyogX19QVjg4MDgwX1JFR0lTVEVSU19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3B3bS1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3B3bS1yZWd1bGF0b3IuYwppbmRleCBjMjQ1MjQyLi4xYjg4ZTBlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvcHdtLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3B3bS1yZWd1bGF0b3IuYwpAQCAtMTAsNyArMTAsNiBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgpAQCAtMTk0LDEyICsxOTMsMTAgQEAKIAl1bnNpZ25lZCBpbnQgbWluX3VWX2R1dHkgPSBkcnZkYXRhLT5jb250aW51b3VzLm1pbl91Vl9kdXR5Y3ljbGU7CiAJdW5zaWduZWQgaW50IG1heF91Vl9kdXR5ID0gZHJ2ZGF0YS0+Y29udGludW91cy5tYXhfdVZfZHV0eWN5Y2xlOwogCXVuc2lnbmVkIGludCBkdXR5X3VuaXQgPSBkcnZkYXRhLT5jb250aW51b3VzLmR1dHljeWNsZV91bml0OwotCXVuc2lnbmVkIGludCByYW1wX2RlbGF5ID0gcmRldi0+Y29uc3RyYWludHMtPnJhbXBfZGVsYXk7CiAJaW50IG1pbl91ViA9IHJkZXYtPmNvbnN0cmFpbnRzLT5taW5fdVY7CiAJaW50IG1heF91ViA9IHJkZXYtPmNvbnN0cmFpbnRzLT5tYXhfdVY7CiAJaW50IGRpZmZfdVYgPSBtYXhfdVYgLSBtaW5fdVY7CiAJc3RydWN0IHB3bV9zdGF0ZSBwc3RhdGU7Ci0JaW50IG9sZF91ViA9IHB3bV9yZWd1bGF0b3JfZ2V0X3ZvbHRhZ2UocmRldik7CiAJdW5zaWduZWQgaW50IGRpZmZfZHV0eTsKIAl1bnNpZ25lZCBpbnQgZHV0eWN5Y2xlOwogCWludCByZXQ7CkBAIC0yMzMsMTMgKzIzMCw2IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JaWYgKChyYW1wX2RlbGF5ID09IDApIHx8ICFwd21fcmVndWxhdG9yX2lzX2VuYWJsZWQocmRldikpCi0JCXJldHVybiAwOwotCi0JLyogUmFtcCBkZWxheSBpcyBpbiB1Vi91Uy4gQWRqdXN0IHRvIHVTIGFuZCBkZWxheSAqLwotCXJhbXBfZGVsYXkgPSBESVZfUk9VTkRfVVAoYWJzKHJlcV9taW5fdVYgLSBvbGRfdVYpLCByYW1wX2RlbGF5KTsKLQl1c2xlZXBfcmFuZ2UocmFtcF9kZWxheSwgcmFtcF9kZWxheSArIERJVl9ST1VORF9VUChyYW1wX2RlbGF5LCAxMCkpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3Fjb21fc21kLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvcWNvbV9zbWQtcmVndWxhdG9yLmMKaW5kZXggNTAyMmZhOC4uOGVkNDZhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvcWNvbV9zbWQtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvcWNvbV9zbWQtcmVndWxhdG9yLmMKQEAgLTE3OCwyMCArMTc4LDIxIEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9kZXNjIHBtYTgwODRfZnRzbXBzID0gewogCS5saW5lYXJfcmFuZ2VzID0gKHN0cnVjdCByZWd1bGF0b3JfbGluZWFyX3JhbmdlW10pIHsKIAkJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSgzNTAwMDAsICAwLCAxODQsIDUwMDApLAotCQlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDcwMDAwMCwgMTg1LCAzMzksIDEwMDAwKSwKKwkJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSgxMjgwMDAwLCAxODUsIDI2MSwgMTAwMDApLAogCX0sCiAJLm5fbGluZWFyX3JhbmdlcyA9IDIsCi0JLm5fdm9sdGFnZXMgPSAzNDAsCisJLm5fdm9sdGFnZXMgPSAyNjIsCiAJLm9wcyA9ICZycG1fc21wc19sZG9fb3BzLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWd1bGF0b3JfZGVzYyBwbWE4MDg0X3BsZG8gPSB7CiAJLmxpbmVhcl9yYW5nZXMgPSAoc3RydWN0IHJlZ3VsYXRvcl9saW5lYXJfcmFuZ2VbXSkgewotCQlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDc1MDAwMCwgIDAsICAzMCwgMjUwMDApLAotCQlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDE1MDAwMDAsIDMxLCA5OSwgNTAwMDApLAorCQlSRUdVTEFUT1JfTElORUFSX1JBTkdFKCA3NTAwMDAsICAwLCAgNjMsIDEyNTAwKSwKKwkJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSgxNTUwMDAwLCA2NCwgMTI2LCAyNTAwMCksCisJCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoMzEwMDAwMCwgMTI3LCAxNjMsIDUwMDAwKSwKIAl9LAotCS5uX2xpbmVhcl9yYW5nZXMgPSAyLAotCS5uX3ZvbHRhZ2VzID0gMTAwLAorCS5uX2xpbmVhcl9yYW5nZXMgPSAzLAorCS5uX3ZvbHRhZ2VzID0gMTY0LAogCS5vcHMgPSAmcnBtX3NtcHNfbGRvX29wcywKIH07CiAKQEAgLTIyMSwyOSArMjIyLDMwIEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9kZXNjIHBtODg0MV9mdHNtcHMgPSB7CiAJLmxpbmVhcl9yYW5nZXMgPSAoc3RydWN0IHJlZ3VsYXRvcl9saW5lYXJfcmFuZ2VbXSkgewogCQlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDM1MDAwMCwgIDAsIDE4NCwgNTAwMCksCi0JCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoNzAwMDAwLCAxODUsIDMzOSwgMTAwMDApLAorCQlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDEyODAwMDAsIDE4NSwgMjYxLCAxMDAwMCksCiAJfSwKIAkubl9saW5lYXJfcmFuZ2VzID0gMiwKLQkubl92b2x0YWdlcyA9IDM0MCwKKwkubl92b2x0YWdlcyA9IDI2MiwKIAkub3BzID0gJnJwbV9zbXBzX2xkb19vcHMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9kZXNjIHBtODk0MV9ib29zdCA9IHsKIAkubGluZWFyX3JhbmdlcyA9IChzdHJ1Y3QgcmVndWxhdG9yX2xpbmVhcl9yYW5nZVtdKSB7Ci0JCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoNDAwMDAwMCwgMCwgMTUsIDEwMDAwMCksCisJCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoNDAwMDAwMCwgMCwgMzAsIDUwMDAwKSwKIAl9LAogCS5uX2xpbmVhcl9yYW5nZXMgPSAxLAotCS5uX3ZvbHRhZ2VzID0gMTYsCisJLm5fdm9sdGFnZXMgPSAzMSwKIAkub3BzID0gJnJwbV9zbXBzX2xkb19vcHMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9kZXNjIHBtODk0MV9wbGRvID0gewogCS5saW5lYXJfcmFuZ2VzID0gKHN0cnVjdCByZWd1bGF0b3JfbGluZWFyX3JhbmdlW10pIHsKLQkJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSggNzUwMDAwLCAgMCwgIDMwLCAyNTAwMCksCi0JCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoMTUwMDAwMCwgMzEsIDk5LCA1MDAwMCksCisJCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoIDc1MDAwMCwgIDAsICA2MywgMTI1MDApLAorCQlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDE1NTAwMDAsIDY0LCAxMjYsIDI1MDAwKSwKKwkJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSgzMTAwMDAwLCAxMjcsIDE2MywgNTAwMDApLAogCX0sCi0JLm5fbGluZWFyX3JhbmdlcyA9IDIsCi0JLm5fdm9sdGFnZXMgPSAxMDAsCisJLm5fbGluZWFyX3JhbmdlcyA9IDMsCisJLm5fdm9sdGFnZXMgPSAxNjQsCiAJLm9wcyA9ICZycG1fc21wc19sZG9fb3BzLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3Ivcms4MDgtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9yazgwOC1yZWd1bGF0b3IuYwppbmRleCA1ZjQxMmE1Li4zMzE0YmYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9yazgwOC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9yazgwOC1yZWd1bGF0b3IuYwpAQCAtNjYxLDggKzY2MSw3IEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciByazgwOF9yZWd1bGF0b3JfZHJpdmVyID0gewogCS5wcm9iZSA9IHJrODA4X3JlZ3VsYXRvcl9wcm9iZSwKIAkuZHJpdmVyID0gewotCQkubmFtZSA9ICJyazgwOC1yZWd1bGF0b3IiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm5hbWUgPSAicms4MDgtcmVndWxhdG9yIgogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTIxOC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MjE4LXJlZ3VsYXRvci5jCmluZGV4IGQxZTYzMWQuLmViMGY1YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MjE4LXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MjE4LXJlZ3VsYXRvci5jCkBAIC0xODAsNiArMTgwLDE0IEBACiAJaWYgKHJpZCA8IFRQUzY1MjE4X0RDRENfMSB8fCByaWQgPiBUUFM2NTIxOF9MRE9fMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwkvKgorCSAqIENlcnRhaW4gcmV2aXNpb25zIG9mIFRQUzY1MjE4IHdpbGwgbmVlZCB0byBoYXZlIERDREMzIHJlZ3VsYXRvcgorCSAqIGVuYWJsZWQgYWx3YXlzLCBvdGhlcndpc2UgYW4gaW1tZWRpYXRlIHN5c3RlbSByZWJvb3Qgd2lsbCBvY2N1cgorCSAqIGR1cmluZyBwb3dlcm9mZi4KKwkgKi8KKwlpZiAocmlkID09IFRQUzY1MjE4X0RDRENfMyAmJiB0cHMtPnJldiA9PSBUUFM2NTIxOF9SRVZfMl8xKQorCQlyZXR1cm4gMDsKKwogCWlmICghdHBzLT5pbmZvW3JpZF0tPnN0cm9iZSkgewogCQlpZiAocmlkID09IFRQUzY1MjE4X0RDRENfMykKIAkJCXRwcy0+aW5mb1tyaWRdLT5zdHJvYmUgPSAzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjU5MTAtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTkxMC1yZWd1bGF0b3IuYwppbmRleCBmYjk5MWVjLi42OTYxMTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTkxMC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTkxMC1yZWd1bGF0b3IuYwpAQCAtMTExMSw2ICsxMTExLDEyIEBACiAJCXBtaWMtPm51bV9yZWd1bGF0b3JzID0gQVJSQVlfU0laRSh0cHM2NTkxMF9yZWdzKTsKIAkJcG1pYy0+ZXh0X3NsZWVwX2NvbnRyb2wgPSB0cHM2NTkxMF9leHRfc2xlZXBfY29udHJvbDsKIAkJaW5mbyA9IHRwczY1OTEwX3JlZ3M7CisJCS8qIFdvcmsgYXJvdW5kIHNpbGljb24gZXJyYXR1bSBTV0NaMDEwOiBvdXRwdXQgcHJvZ3JhbW1lZAorCQkgKiB2b2x0YWdlIGxldmVsIGNhbiBnbyBoaWdoZXIgdGhhbiBleHBlY3RlZCBvciBjcmFzaAorCQkgKiBXb3JrYXJvdW5kOiB1c2Ugbm8gc3luY2hyb25pemF0aW9uIG9mIERDREMgY2xvY2tzCisJCSAqLworCQl0cHM2NTkxMF9yZWdfY2xlYXJfYml0cyhwbWljLT5tZmQsIFRQUzY1OTEwX0RDRENDVFJMLAorCQkJCQlEQ0RDQ1RSTF9EQ0RDQ0tTWU5DX01BU0spOwogCQlicmVhazsKIAljYXNlIFRQUzY1OTExOgogCQlwbWljLT5nZXRfY3RybF9yZWcgPSAmdHBzNjU5MTFfZ2V0X2N0cmxfcmVnaXN0ZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlbW90ZXByb2MvS2NvbmZpZyBiL2RyaXZlcnMvcmVtb3RlcHJvYy9LY29uZmlnCmluZGV4IDFhOGJmNzZhLi5mMzk2YmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlbW90ZXByb2MvS2NvbmZpZworKysgYi9kcml2ZXJzL3JlbW90ZXByb2MvS2NvbmZpZwpAQCAtMTcsNyArMTcsNyBAQAogCXNlbGVjdCBSRU1PVEVQUk9DCiAJc2VsZWN0IE1BSUxCT1gKIAlzZWxlY3QgT01BUDJQTFVTX01CT1gKLQlzZWxlY3QgUlBNU0cKKwlzZWxlY3QgUlBNU0dfVklSVElPCiAJaGVscAogCSAgU2F5IHkgaGVyZSB0byBzdXBwb3J0IE9NQVAncyByZW1vdGUgcHJvY2Vzc29ycyAoZHVhbCBNMwogCSAgYW5kIERTUCBvbiBPTUFQNCkgdmlhIHRoZSByZW1vdGUgcHJvY2Vzc29yIGZyYW1ld29yay4KQEAgLTU5LDcgKzU5LDcgQEAKIAlkZXBlbmRzIG9uIEFSQ0hfREFWSU5DSV9EQThYWAogCXNlbGVjdCBDTUEgaWYgTU1VCiAJc2VsZWN0IFJFTU9URVBST0MKLQlzZWxlY3QgUlBNU0cKKwlzZWxlY3QgUlBNU0dfVklSVElPCiAJaGVscAogCSAgU2F5IHkgaGVyZSB0byBzdXBwb3J0IERBOHh4L09NQVAtTDEzeCByZW1vdGUgcHJvY2Vzc29ycyB2aWEgdGhlCiAJICByZW1vdGUgcHJvY2Vzc29yIGZyYW1ld29yay4KQEAgLTkxLDYgKzkxLDIyIEBACiAJICBTYXkgeSBoZXJlIHRvIHN1cHBvcnQgdGhlIFF1YWxjb21tIFBlcmlwaGVyaWFsIEltYWdlIExvYWRlciBmb3IgdGhlCiAJICBIZXhhZ29uIFY1IGJhc2VkIHJlbW90ZSBwcm9jZXNzb3JzLgogCitjb25maWcgUUNPTV9XQ05TU19JUklTCisJdHJpc3RhdGUKKwlkZXBlbmRzIG9uIE9GICYmIEFSQ0hfUUNPTQorCitjb25maWcgUUNPTV9XQ05TU19QSUwKKwl0cmlzdGF0ZSAiUXVhbGNvbW0gV0NOU1MgUGVyaXBoZXJhbCBJbWFnZSBMb2FkZXIiCisJZGVwZW5kcyBvbiBPRiAmJiBBUkNIX1FDT00KKwlkZXBlbmRzIG9uIFFDT01fU01FTQorCXNlbGVjdCBRQ09NX01EVF9MT0FERVIKKwlzZWxlY3QgUUNPTV9TQ00KKwlzZWxlY3QgUUNPTV9XQ05TU19JUklTCisJc2VsZWN0IFJFTU9URVBST0MKKwloZWxwCisJICBTYXkgeSBoZXJlIHRvIHN1cHBvcnQgdGhlIFBlcmlwaGVyYWwgSW1hZ2UgTG9hZGVyIGZvciB0aGUgUXVhbGNvbW0KKwkgIFdpcmVsZXNzIENvbm5lY3Rpdml0eSBTdWJzeXN0ZW0uCisKIGNvbmZpZyBTVF9SRU1PVEVQUk9DCiAJdHJpc3RhdGUgIlNUIHJlbW90ZXByb2Mgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEFSQ0hfU1RJCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlbW90ZXByb2MvTWFrZWZpbGUgYi9kcml2ZXJzL3JlbW90ZXByb2MvTWFrZWZpbGUKaW5kZXggOTJkMzc1OC4uNmRmYjYyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZW1vdGVwcm9jL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcmVtb3RlcHJvYy9NYWtlZmlsZQpAQCAtMTMsNCArMTMsNiBAQAogb2JqLSQoQ09ORklHX0RBOFhYX1JFTU9URVBST0MpCQkrPSBkYTh4eF9yZW1vdGVwcm9jLm8KIG9iai0kKENPTkZJR19RQ09NX01EVF9MT0FERVIpCQkrPSBxY29tX21kdF9sb2FkZXIubwogb2JqLSQoQ09ORklHX1FDT01fUTZWNV9QSUwpCQkrPSBxY29tX3E2djVfcGlsLm8KK29iai0kKENPTkZJR19RQ09NX1dDTlNTX0lSSVMpCQkrPSBxY29tX3djbnNzX2lyaXMubworb2JqLSQoQ09ORklHX1FDT01fV0NOU1NfUElMKQkJKz0gcWNvbV93Y25zcy5vCiBvYmotJChDT05GSUdfU1RfUkVNT1RFUFJPQykJCSs9IHN0X3JlbW90ZXByb2MubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZW1vdGVwcm9jL2RhOHh4X3JlbW90ZXByb2MuYyBiL2RyaXZlcnMvcmVtb3RlcHJvYy9kYTh4eF9yZW1vdGVwcm9jLmMKaW5kZXggMDA5ZTU2Zi4uMWFmYWM4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZW1vdGVwcm9jL2RhOHh4X3JlbW90ZXByb2MuYworKysgYi9kcml2ZXJzL3JlbW90ZXByb2MvZGE4eHhfcmVtb3RlcHJvYy5jCkBAIC0xNDcsNyArMTQ3LDcgQEAKIHsKIAlzdHJ1Y3QgZGE4eHhfcnByb2MgKmRycHJvYyA9IChzdHJ1Y3QgZGE4eHhfcnByb2MgKilycHJvYy0+cHJpdjsKIAotCS8qIEludGVydXB0IHJlbW90ZSBwcm9jICovCisJLyogSW50ZXJydXB0IHJlbW90ZSBwcm9jICovCiAJd3JpdGVsKFNZU0NGR19DSElQU0lHMiwgZHJwcm9jLT5jaGlwc2lnKTsKIH0KIApAQCAtMjYxLDcgKzI2MSw3IEBACiAJcmV0dXJuIDA7CiAKIGZyZWVfcnByb2M6Ci0JcnByb2NfcHV0KHJwcm9jKTsKKwlycHJvY19mcmVlKHJwcm9jKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yOTAsNyArMjkwLDcgQEAKIAlkaXNhYmxlX2lycShkcnByb2MtPmlycSk7CiAKIAlycHJvY19kZWwocnByb2MpOwotCXJwcm9jX3B1dChycHJvYyk7CisJcnByb2NfZnJlZShycHJvYyk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVtb3RlcHJvYy9vbWFwX3JlbW90ZXByb2MuYyBiL2RyaXZlcnMvcmVtb3RlcHJvYy9vbWFwX3JlbW90ZXByb2MuYwppbmRleCBiNzQzNjhhLi5mYTYzYmYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlbW90ZXByb2Mvb21hcF9yZW1vdGVwcm9jLmMKKysrIGIvZHJpdmVycy9yZW1vdGVwcm9jL29tYXBfcmVtb3RlcHJvYy5jCkBAIC05Niw3ICs5Niw4IEBACiAJLyogc2VuZCB0aGUgaW5kZXggb2YgdGhlIHRyaWdnZXJlZCB2aXJ0cXVldWUgaW4gdGhlIG1haWxib3ggcGF5bG9hZCAqLwogCXJldCA9IG1ib3hfc2VuZF9tZXNzYWdlKG9wcm9jLT5tYm94LCAodm9pZCAqKXZxaWQpOwogCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKGRldiwgIm9tYXBfbWJveF9tc2dfc2VuZCBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBzZW5kIG1haWxib3ggbWVzc2FnZSwgc3RhdHVzID0gJWRcbiIsCisJCQlyZXQpOwogfQogCiAvKgpAQCAtMTk2LDcgKzE5Nyw3IEBACiAJfQogCiAJcnByb2MgPSBycHJvY19hbGxvYygmcGRldi0+ZGV2LCBwZGF0YS0+bmFtZSwgJm9tYXBfcnByb2Nfb3BzLAotCQkJCXBkYXRhLT5maXJtd2FyZSwgc2l6ZW9mKCpvcHJvYykpOworCQkJICAgIHBkYXRhLT5maXJtd2FyZSwgc2l6ZW9mKCpvcHJvYykpOwogCWlmICghcnByb2MpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0yMTQsNyArMjE1LDcgQEAKIAlyZXR1cm4gMDsKIAogZnJlZV9ycHJvYzoKLQlycHJvY19wdXQocnByb2MpOworCXJwcm9jX2ZyZWUocnByb2MpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTIyMyw3ICsyMjQsNyBAQAogCXN0cnVjdCBycHJvYyAqcnByb2MgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAogCXJwcm9jX2RlbChycHJvYyk7Ci0JcnByb2NfcHV0KHJwcm9jKTsKKwlycHJvY19mcmVlKHJwcm9jKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZW1vdGVwcm9jL3Fjb21fcTZ2NV9waWwuYyBiL2RyaXZlcnMvcmVtb3RlcHJvYy9xY29tX3E2djVfcGlsLmMKaW5kZXggMmExYjJjNy4uMmUwY2FhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZW1vdGVwcm9jL3Fjb21fcTZ2NV9waWwuYworKysgYi9kcml2ZXJzL3JlbW90ZXByb2MvcWNvbV9xNnY1X3BpbC5jCkBAIC04NjMsOCArODYzLDEwIEBACiAJCWdvdG8gZnJlZV9ycHJvYzsKIAogCXFwcm9jLT5zdGF0ZSA9IHFjb21fc21lbV9zdGF0ZV9nZXQoJnBkZXYtPmRldiwgInN0b3AiLCAmcXByb2MtPnN0b3BfYml0KTsKLQlpZiAoSVNfRVJSKHFwcm9jLT5zdGF0ZSkpCisJaWYgKElTX0VSUihxcHJvYy0+c3RhdGUpKSB7CisJCXJldCA9IFBUUl9FUlIocXByb2MtPnN0YXRlKTsKIAkJZ290byBmcmVlX3Jwcm9jOworCX0KIAogCXJldCA9IHJwcm9jX2FkZChycHJvYyk7CiAJaWYgKHJldCkKQEAgLTg3Myw3ICs4NzUsNyBAQAogCXJldHVybiAwOwogCiBmcmVlX3Jwcm9jOgotCXJwcm9jX3B1dChycHJvYyk7CisJcnByb2NfZnJlZShycHJvYyk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtODgzLDcgKzg4NSw3IEBACiAJc3RydWN0IHE2djUgKnFwcm9jID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKIAlycHJvY19kZWwocXByb2MtPnJwcm9jKTsKLQlycHJvY19wdXQocXByb2MtPnJwcm9jKTsKKwlycHJvY19mcmVlKHFwcm9jLT5ycHJvYyk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVtb3RlcHJvYy9xY29tX3djbnNzLmMgYi9kcml2ZXJzL3JlbW90ZXByb2MvcWNvbV93Y25zcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1Y2VkZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3JlbW90ZXByb2MvcWNvbV93Y25zcy5jCkBAIC0wLDAgKzEsNjI0IEBACisvKgorICogUXVhbGNvbW0gV2lyZWxlc3MgQ29ubmVjdGl2aXR5IFN1YnN5c3RlbSBQZXJpcGhlcmFsIEltYWdlIExvYWRlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBMaW5hcm8gTHRkCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgU29ueSBNb2JpbGUgQ29tbXVuaWNhdGlvbnMgQUIKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9xY29tX3NjbS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlbW90ZXByb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2MvcWNvbS9zbWVtLmg+CisjaW5jbHVkZSA8bGludXgvc29jL3Fjb20vc21lbV9zdGF0ZS5oPgorCisjaW5jbHVkZSAicWNvbV9tZHRfbG9hZGVyLmgiCisjaW5jbHVkZSAicmVtb3RlcHJvY19pbnRlcm5hbC5oIgorI2luY2x1ZGUgInFjb21fd2Nuc3MuaCIKKworI2RlZmluZSBXQ05TU19DUkFTSF9SRUFTT05fU01FTQkJNDIyCisjZGVmaW5lIFdDTlNTX0ZJUk1XQVJFX05BTUUJCSJ3Y25zcy5tZHQiCisjZGVmaW5lIFdDTlNTX1BBU19JRAkJCTYKKworI2RlZmluZSBXQ05TU19TUEFSRV9OVkJJTl9ETE5ECQlCSVQoMjUpCisKKyNkZWZpbmUgV0NOU1NfUE1VX0lSSVNfWE9fQ0ZHCQlCSVQoMykKKyNkZWZpbmUgV0NOU1NfUE1VX0lSSVNfWE9fRU4JCUJJVCg0KQorI2RlZmluZSBXQ05TU19QTVVfR0NfQlVTX01VWF9TRUxfVE9QCUJJVCg1KQorI2RlZmluZSBXQ05TU19QTVVfSVJJU19YT19DRkdfU1RTCUJJVCg2KSAvKiAxOiBpbiBwcm9ncmVzcywgMDogZG9uZSAqLworCisjZGVmaW5lIFdDTlNTX1BNVV9JUklTX1JFU0VUCQlCSVQoNykKKyNkZWZpbmUgV0NOU1NfUE1VX0lSSVNfUkVTRVRfU1RTCUJJVCg4KSAvKiAxOiBpbiBwcm9ncmVzcywgMDogZG9uZSAqLworI2RlZmluZSBXQ05TU19QTVVfSVJJU19YT19SRUFECQlCSVQoOSkKKyNkZWZpbmUgV0NOU1NfUE1VX0lSSVNfWE9fUkVBRF9TVFMJQklUKDEwKQorCisjZGVmaW5lIFdDTlNTX1BNVV9YT19NT0RFX01BU0sJCUdFTk1BU0soMiwgMSkKKyNkZWZpbmUgV0NOU1NfUE1VX1hPX01PREVfMTlwMgkJMAorI2RlZmluZSBXQ05TU19QTVVfWE9fTU9ERV80OAkJMworCitzdHJ1Y3Qgd2Nuc3NfZGF0YSB7CisJc2l6ZV90IHBtdV9vZmZzZXQ7CisJc2l6ZV90IHNwYXJlX29mZnNldDsKKworCWNvbnN0IHN0cnVjdCB3Y25zc192cmVnX2luZm8gKnZyZWdzOworCXNpemVfdCBudW1fdnJlZ3M7Cit9OworCitzdHJ1Y3QgcWNvbV93Y25zcyB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBycHJvYyAqcnByb2M7CisKKwl2b2lkIF9faW9tZW0gKnBtdV9jZmc7CisJdm9pZCBfX2lvbWVtICpzcGFyZV9vdXQ7CisKKwlib29sIHVzZV80OG1oel94bzsKKworCWludCB3ZG9nX2lycTsKKwlpbnQgZmF0YWxfaXJxOworCWludCByZWFkeV9pcnE7CisJaW50IGhhbmRvdmVyX2lycTsKKwlpbnQgc3RvcF9hY2tfaXJxOworCisJc3RydWN0IHFjb21fc21lbV9zdGF0ZSAqc3RhdGU7CisJdW5zaWduZWQgc3RvcF9iaXQ7CisKKwlzdHJ1Y3QgbXV0ZXggaXJpc19sb2NrOworCXN0cnVjdCBxY29tX2lyaXMgKmlyaXM7CisKKwlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSAqdnJlZ3M7CisJc2l6ZV90IG51bV92cmVnczsKKworCXN0cnVjdCBjb21wbGV0aW9uIHN0YXJ0X2RvbmU7CisJc3RydWN0IGNvbXBsZXRpb24gc3RvcF9kb25lOworCisJcGh5c19hZGRyX3QgbWVtX3BoeXM7CisJcGh5c19hZGRyX3QgbWVtX3JlbG9jOworCXZvaWQgKm1lbV9yZWdpb247CisJc2l6ZV90IG1lbV9zaXplOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB3Y25zc19kYXRhIHJpdmFfZGF0YSA9IHsKKwkucG11X29mZnNldCA9IDB4MjgsCisJLnNwYXJlX29mZnNldCA9IDB4YjQsCisKKwkudnJlZ3MgPSAoc3RydWN0IHdjbnNzX3ZyZWdfaW5mb1tdKSB7CisJCXsgInZkZG14IiwgIDEwNTAwMDAsIDExNTAwMDAsIDAgfSwKKwkJeyAidmRkY3giLCAgMTA1MDAwMCwgMTE1MDAwMCwgMCB9LAorCQl7ICJ2ZGRweCIsICAxODAwMDAwLCAxODAwMDAwLCAwIH0sCisJfSwKKwkubnVtX3ZyZWdzID0gMywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2Nuc3NfZGF0YSBwcm9udG9fdjFfZGF0YSA9IHsKKwkucG11X29mZnNldCA9IDB4MTAwNCwKKwkuc3BhcmVfb2Zmc2V0ID0gMHgxMDg4LAorCisJLnZyZWdzID0gKHN0cnVjdCB3Y25zc192cmVnX2luZm9bXSkgeworCQl7ICJ2ZGRteCIsIDk1MDAwMCwgMTE1MDAwMCwgMCB9LAorCQl7ICJ2ZGRjeCIsIC5zdXBlcl90dXJibyA9IHRydWV9LAorCQl7ICJ2ZGRweCIsIDE4MDAwMDAsIDE4MDAwMDAsIDAgfSwKKwl9LAorCS5udW1fdnJlZ3MgPSAzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB3Y25zc19kYXRhIHByb250b192Ml9kYXRhID0geworCS5wbXVfb2Zmc2V0ID0gMHgxMDA0LAorCS5zcGFyZV9vZmZzZXQgPSAweDEwODgsCisKKwkudnJlZ3MgPSAoc3RydWN0IHdjbnNzX3ZyZWdfaW5mb1tdKSB7CisJCXsgInZkZG14IiwgMTI4NzUwMCwgMTI4NzUwMCwgMCB9LAorCQl7ICJ2ZGRjeCIsIC5zdXBlcl90dXJibyA9IHRydWUgfSwKKwkJeyAidmRkcHgiLCAxODAwMDAwLCAxODAwMDAwLCAwIH0sCisJfSwKKwkubnVtX3ZyZWdzID0gMywKK307CisKK3ZvaWQgcWNvbV93Y25zc19hc3NpZ25faXJpcyhzdHJ1Y3QgcWNvbV93Y25zcyAqd2Nuc3MsCisJCQkgICAgc3RydWN0IHFjb21faXJpcyAqaXJpcywKKwkJCSAgICBib29sIHVzZV80OG1oel94bykKK3sKKwltdXRleF9sb2NrKCZ3Y25zcy0+aXJpc19sb2NrKTsKKworCXdjbnNzLT5pcmlzID0gaXJpczsKKwl3Y25zcy0+dXNlXzQ4bWh6X3hvID0gdXNlXzQ4bWh6X3hvOworCisJbXV0ZXhfdW5sb2NrKCZ3Y25zcy0+aXJpc19sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHFjb21fd2Nuc3NfYXNzaWduX2lyaXMpOworCitzdGF0aWMgaW50IHdjbnNzX2xvYWQoc3RydWN0IHJwcm9jICpycHJvYywgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdykKK3sKKwlzdHJ1Y3QgcWNvbV93Y25zcyAqd2Nuc3MgPSAoc3RydWN0IHFjb21fd2Nuc3MgKilycHJvYy0+cHJpdjsKKwlwaHlzX2FkZHJfdCBmd19hZGRyOworCXNpemVfdCBmd19zaXplOworCWJvb2wgcmVsb2NhdGU7CisJaW50IHJldDsKKworCXJldCA9IHFjb21fc2NtX3Bhc19pbml0X2ltYWdlKFdDTlNTX1BBU19JRCwgZnctPmRhdGEsIGZ3LT5zaXplKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnJwcm9jLT5kZXYsICJpbnZhbGlkIGZpcm13YXJlIG1ldGFkYXRhXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBxY29tX21kdF9wYXJzZShmdywgJmZ3X2FkZHIsICZmd19zaXplLCAmcmVsb2NhdGUpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcnByb2MtPmRldiwgImZhaWxlZCB0byBwYXJzZSBtZHQgaGVhZGVyXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAocmVsb2NhdGUpIHsKKwkJd2Nuc3MtPm1lbV9yZWxvYyA9IGZ3X2FkZHI7CisKKwkJcmV0ID0gcWNvbV9zY21fcGFzX21lbV9zZXR1cChXQ05TU19QQVNfSUQsIHdjbnNzLT5tZW1fcGh5cywgZndfc2l6ZSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnJwcm9jLT5kZXYsICJ1bmFibGUgdG8gc2V0dXAgbWVtb3J5IGZvciBpbWFnZVxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIHFjb21fbWR0X2xvYWQocnByb2MsIGZ3LCBycHJvYy0+ZmlybXdhcmUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJwcm9jX2Z3X29wcyB3Y25zc19md19vcHMgPSB7CisJLmZpbmRfcnNjX3RhYmxlID0gcWNvbV9tZHRfZmluZF9yc2NfdGFibGUsCisJLmxvYWQgPSB3Y25zc19sb2FkLAorfTsKKworc3RhdGljIHZvaWQgd2Nuc3NfaW5kaWNhdGVfbnZfZG93bmxvYWQoc3RydWN0IHFjb21fd2Nuc3MgKndjbnNzKQoreworCXUzMiB2YWw7CisKKwkvKiBJbmRpY2F0ZSBOViBkb3dubG9hZCBjYXBhYmlsaXR5ICovCisJdmFsID0gcmVhZGwod2Nuc3MtPnNwYXJlX291dCk7CisJdmFsIHw9IFdDTlNTX1NQQVJFX05WQklOX0RMTkQ7CisJd3JpdGVsKHZhbCwgd2Nuc3MtPnNwYXJlX291dCk7Cit9CisKK3N0YXRpYyB2b2lkIHdjbnNzX2NvbmZpZ3VyZV9pcmlzKHN0cnVjdCBxY29tX3djbnNzICp3Y25zcykKK3sKKwl1MzIgdmFsOworCisJLyogQ2xlYXIgUE1VIGNmZyByZWdpc3RlciAqLworCXdyaXRlbCgwLCB3Y25zcy0+cG11X2NmZyk7CisKKwl2YWwgPSBXQ05TU19QTVVfR0NfQlVTX01VWF9TRUxfVE9QIHwgV0NOU1NfUE1VX0lSSVNfWE9fRU47CisJd3JpdGVsKHZhbCwgd2Nuc3MtPnBtdV9jZmcpOworCisJLyogQ2xlYXIgWE9fTU9ERSAqLworCXZhbCAmPSB+V0NOU1NfUE1VX1hPX01PREVfTUFTSzsKKwlpZiAod2Nuc3MtPnVzZV80OG1oel94bykKKwkJdmFsIHw9IFdDTlNTX1BNVV9YT19NT0RFXzQ4IDw8IDE7CisJZWxzZQorCQl2YWwgfD0gV0NOU1NfUE1VX1hPX01PREVfMTlwMiA8PCAxOworCXdyaXRlbCh2YWwsIHdjbnNzLT5wbXVfY2ZnKTsKKworCS8qIFJlc2V0IElSSVMgKi8KKwl2YWwgfD0gV0NOU1NfUE1VX0lSSVNfUkVTRVQ7CisJd3JpdGVsKHZhbCwgd2Nuc3MtPnBtdV9jZmcpOworCisJLyogV2FpdCBmb3IgUE1VLmlyaXNfcmVnX3Jlc2V0X3N0cyAqLworCXdoaWxlIChyZWFkbCh3Y25zcy0+cG11X2NmZykgJiBXQ05TU19QTVVfSVJJU19SRVNFVF9TVFMpCisJCWNwdV9yZWxheCgpOworCisJLyogQ2xlYXIgSVJJUyByZXNldCAqLworCXZhbCAmPSB+V0NOU1NfUE1VX0lSSVNfUkVTRVQ7CisJd3JpdGVsKHZhbCwgd2Nuc3MtPnBtdV9jZmcpOworCisJLyogU3RhcnQgSVJJUyBYTyBjb25maWd1cmF0aW9uICovCisJdmFsIHw9IFdDTlNTX1BNVV9JUklTX1hPX0NGRzsKKwl3cml0ZWwodmFsLCB3Y25zcy0+cG11X2NmZyk7CisKKwkvKiBXYWl0IGZvciBYTyBjb25maWd1cmF0aW9uIHRvIGZpbmlzaCAqLworCXdoaWxlIChyZWFkbCh3Y25zcy0+cG11X2NmZykgJiBXQ05TU19QTVVfSVJJU19YT19DRkdfU1RTKQorCQljcHVfcmVsYXgoKTsKKworCS8qIFN0b3AgSVJJUyBYTyBjb25maWd1cmF0aW9uICovCisJdmFsICY9IH5XQ05TU19QTVVfR0NfQlVTX01VWF9TRUxfVE9QOworCXZhbCAmPSB+V0NOU1NfUE1VX0lSSVNfWE9fQ0ZHOworCXdyaXRlbCh2YWwsIHdjbnNzLT5wbXVfY2ZnKTsKKworCS8qIEFkZCBzb21lIGRlbGF5IGZvciBYTyB0byBzZXR0bGUgKi8KKwltc2xlZXAoMjApOworfQorCitzdGF0aWMgaW50IHdjbnNzX3N0YXJ0KHN0cnVjdCBycHJvYyAqcnByb2MpCit7CisJc3RydWN0IHFjb21fd2Nuc3MgKndjbnNzID0gKHN0cnVjdCBxY29tX3djbnNzICopcnByb2MtPnByaXY7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJndjbnNzLT5pcmlzX2xvY2spOworCWlmICghd2Nuc3MtPmlyaXMpIHsKKwkJZGV2X2Vycih3Y25zcy0+ZGV2LCAibm8gaXJpcyByZWdpc3RlcmVkXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byByZWxlYXNlX2lyaXNfbG9jazsKKwl9CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUod2Nuc3MtPm51bV92cmVncywgd2Nuc3MtPnZyZWdzKTsKKwlpZiAocmV0KQorCQlnb3RvIHJlbGVhc2VfaXJpc19sb2NrOworCisJcmV0ID0gcWNvbV9pcmlzX2VuYWJsZSh3Y25zcy0+aXJpcyk7CisJaWYgKHJldCkKKwkJZ290byBkaXNhYmxlX3JlZ3VsYXRvcnM7CisKKwl3Y25zc19pbmRpY2F0ZV9udl9kb3dubG9hZCh3Y25zcyk7CisJd2Nuc3NfY29uZmlndXJlX2lyaXMod2Nuc3MpOworCisJcmV0ID0gcWNvbV9zY21fcGFzX2F1dGhfYW5kX3Jlc2V0KFdDTlNTX1BBU19JRCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHdjbnNzLT5kZXYsCisJCQkiZmFpbGVkIHRvIGF1dGhlbnRpY2F0ZSBpbWFnZSBhbmQgcmVsZWFzZSByZXNldFxuIik7CisJCWdvdG8gZGlzYWJsZV9pcmlzOworCX0KKworCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmd2Nuc3MtPnN0YXJ0X2RvbmUsCisJCQkJCSAgbXNlY3NfdG9famlmZmllcyg1MDAwKSk7CisJaWYgKHdjbnNzLT5yZWFkeV9pcnEgPiAwICYmIHJldCA9PSAwKSB7CisJCS8qIFdlIGhhdmUgYSByZWFkeV9pcnEsIGJ1dCBpdCBkaWRuJ3QgZmlyZSBpbiB0aW1lLiAqLworCQlkZXZfZXJyKHdjbnNzLT5kZXYsICJzdGFydCB0aW1lZCBvdXRcbiIpOworCQlxY29tX3NjbV9wYXNfc2h1dGRvd24oV0NOU1NfUEFTX0lEKTsKKwkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJZ290byBkaXNhYmxlX2lyaXM7CisJfQorCisJcmV0ID0gMDsKKworZGlzYWJsZV9pcmlzOgorCXFjb21faXJpc19kaXNhYmxlKHdjbnNzLT5pcmlzKTsKK2Rpc2FibGVfcmVndWxhdG9yczoKKwlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKHdjbnNzLT5udW1fdnJlZ3MsIHdjbnNzLT52cmVncyk7CityZWxlYXNlX2lyaXNfbG9jazoKKwltdXRleF91bmxvY2soJndjbnNzLT5pcmlzX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3Y25zc19zdG9wKHN0cnVjdCBycHJvYyAqcnByb2MpCit7CisJc3RydWN0IHFjb21fd2Nuc3MgKndjbnNzID0gKHN0cnVjdCBxY29tX3djbnNzICopcnByb2MtPnByaXY7CisJaW50IHJldDsKKworCWlmICh3Y25zcy0+c3RhdGUpIHsKKwkJcWNvbV9zbWVtX3N0YXRlX3VwZGF0ZV9iaXRzKHdjbnNzLT5zdGF0ZSwKKwkJCQkJICAgIEJJVCh3Y25zcy0+c3RvcF9iaXQpLAorCQkJCQkgICAgQklUKHdjbnNzLT5zdG9wX2JpdCkpOworCisJCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmd2Nuc3MtPnN0b3BfZG9uZSwKKwkJCQkJCSAgbXNlY3NfdG9famlmZmllcyg1MDAwKSk7CisJCWlmIChyZXQgPT0gMCkKKwkJCWRldl9lcnIod2Nuc3MtPmRldiwgInRpbWVkIG91dCBvbiB3YWl0XG4iKTsKKworCQlxY29tX3NtZW1fc3RhdGVfdXBkYXRlX2JpdHMod2Nuc3MtPnN0YXRlLAorCQkJCQkgICAgQklUKHdjbnNzLT5zdG9wX2JpdCksCisJCQkJCSAgICAwKTsKKwl9CisKKwlyZXQgPSBxY29tX3NjbV9wYXNfc2h1dGRvd24oV0NOU1NfUEFTX0lEKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKHdjbnNzLT5kZXYsICJmYWlsZWQgdG8gc2h1dGRvd246ICVkXG4iLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgKndjbnNzX2RhX3RvX3ZhKHN0cnVjdCBycHJvYyAqcnByb2MsIHU2NCBkYSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgcWNvbV93Y25zcyAqd2Nuc3MgPSAoc3RydWN0IHFjb21fd2Nuc3MgKilycHJvYy0+cHJpdjsKKwlpbnQgb2Zmc2V0OworCisJb2Zmc2V0ID0gZGEgLSB3Y25zcy0+bWVtX3JlbG9jOworCWlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCArIGxlbiA+IHdjbnNzLT5tZW1fc2l6ZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gd2Nuc3MtPm1lbV9yZWdpb24gKyBvZmZzZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnByb2Nfb3BzIHdjbnNzX29wcyA9IHsKKwkuc3RhcnQgPSB3Y25zc19zdGFydCwKKwkuc3RvcCA9IHdjbnNzX3N0b3AsCisJLmRhX3RvX3ZhID0gd2Nuc3NfZGFfdG9fdmEsCit9OworCitzdGF0aWMgaXJxcmV0dXJuX3Qgd2Nuc3Nfd2RvZ19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2KQoreworCXN0cnVjdCBxY29tX3djbnNzICp3Y25zcyA9IGRldjsKKworCXJwcm9jX3JlcG9ydF9jcmFzaCh3Y25zcy0+cnByb2MsIFJQUk9DX1dBVENIRE9HKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IHdjbnNzX2ZhdGFsX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXYpCit7CisJc3RydWN0IHFjb21fd2Nuc3MgKndjbnNzID0gZGV2OworCXNpemVfdCBsZW47CisJY2hhciAqbXNnOworCisJbXNnID0gcWNvbV9zbWVtX2dldChRQ09NX1NNRU1fSE9TVF9BTlksIFdDTlNTX0NSQVNIX1JFQVNPTl9TTUVNLCAmbGVuKTsKKwlpZiAoIUlTX0VSUihtc2cpICYmIGxlbiA+IDAgJiYgbXNnWzBdKQorCQlkZXZfZXJyKHdjbnNzLT5kZXYsICJmYXRhbCBlcnJvciByZWNlaXZlZDogJXNcbiIsIG1zZyk7CisKKwlycHJvY19yZXBvcnRfY3Jhc2god2Nuc3MtPnJwcm9jLCBSUFJPQ19GQVRBTF9FUlJPUik7CisKKwlpZiAoIUlTX0VSUihtc2cpKQorCQltc2dbMF0gPSAnXDAnOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgd2Nuc3NfcmVhZHlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldikKK3sKKwlzdHJ1Y3QgcWNvbV93Y25zcyAqd2Nuc3MgPSBkZXY7CisKKwljb21wbGV0ZSgmd2Nuc3MtPnN0YXJ0X2RvbmUpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgd2Nuc3NfaGFuZG92ZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldikKK3sKKwkvKgorCSAqIFhYWDogQXQgdGhpcyBwb2ludCB3ZSdyZSBzdXBwb3NlZCB0byByZWxlYXNlIHRoZSByZXNvdXJjZXMgdGhhdCB3ZQorCSAqIGhhdmUgYmVlbiBob2xkaW5nIG9uIGJlaGFsZiBvZiB0aGUgV0NOU1MuIFVuZm9ydHVuYXRlbHkgdGhpcworCSAqIGludGVycnVwdCBjb21lcyB3YXkgYmVmb3JlIHRoZSBvdGhlciBzaWRlIHNlZW1zIHRvIGJlIGRvbmUuCisJICoKKwkgKiBTbyB3ZSdyZSBjdXJyZW50bHkgcmVseWluZyBvbiB0aGUgcmVhZHkgaW50ZXJydXB0IGZpcmluZyBsYXRlciB0aGVuCisJICogdGhpcyBhbmQgd2UganVzdCBkaXNhYmxlIHRoZSByZXNvdXJjZXMgYXQgdGhlIGVuZCBvZiB3Y25zc19zdGFydCgpLgorCSAqLworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgd2Nuc3Nfc3RvcF9hY2tfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldikKK3sKKwlzdHJ1Y3QgcWNvbV93Y25zcyAqd2Nuc3MgPSBkZXY7CisKKwljb21wbGV0ZSgmd2Nuc3MtPnN0b3BfZG9uZSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgd2Nuc3NfaW5pdF9yZWd1bGF0b3JzKHN0cnVjdCBxY29tX3djbnNzICp3Y25zcywKKwkJCQkgY29uc3Qgc3RydWN0IHdjbnNzX3ZyZWdfaW5mbyAqaW5mbywKKwkJCQkgaW50IG51bV92cmVncykKK3sKKwlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSAqYnVsazsKKwlpbnQgcmV0OworCWludCBpOworCisJYnVsayA9IGRldm1fa2NhbGxvYyh3Y25zcy0+ZGV2LAorCQkJICAgIG51bV92cmVncywgc2l6ZW9mKHN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhKSwKKwkJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1bGspCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IG51bV92cmVnczsgaSsrKQorCQlidWxrW2ldLnN1cHBseSA9IGluZm9baV0ubmFtZTsKKworCXJldCA9IGRldm1fcmVndWxhdG9yX2J1bGtfZ2V0KHdjbnNzLT5kZXYsIG51bV92cmVncywgYnVsayk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fdnJlZ3M7IGkrKykgeworCQlpZiAoaW5mb1tpXS5tYXhfdm9sdGFnZSkKKwkJCXJlZ3VsYXRvcl9zZXRfdm9sdGFnZShidWxrW2ldLmNvbnN1bWVyLAorCQkJCQkgICAgICBpbmZvW2ldLm1pbl92b2x0YWdlLAorCQkJCQkgICAgICBpbmZvW2ldLm1heF92b2x0YWdlKTsKKworCQlpZiAoaW5mb1tpXS5sb2FkX3VBKQorCQkJcmVndWxhdG9yX3NldF9sb2FkKGJ1bGtbaV0uY29uc3VtZXIsIGluZm9baV0ubG9hZF91QSk7CisJfQorCisJd2Nuc3MtPnZyZWdzID0gYnVsazsKKwl3Y25zcy0+bnVtX3ZyZWdzID0gbnVtX3ZyZWdzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2Nuc3NfcmVxdWVzdF9pcnEoc3RydWN0IHFjb21fd2Nuc3MgKndjbnNzLAorCQkJICAgICBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJICAgICBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgICBib29sIG9wdGlvbmFsLAorCQkJICAgICBpcnFfaGFuZGxlcl90IHRocmVhZF9mbikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgbmFtZSk7CisJaWYgKHJldCA8IDAgJiYgb3B0aW9uYWwpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAibm8gJXMgSVJRIGRlZmluZWQsIGlnbm9yaW5nXG4iLCBuYW1lKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vICVzIElSUSBkZWZpbmVkXG4iLCBuYW1lKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKCZwZGV2LT5kZXYsIHJldCwKKwkJCQkJTlVMTCwgdGhyZWFkX2ZuLAorCQkJCQlJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9PTkVTSE9ULAorCQkJCQkid2Nuc3MiLCB3Y25zcyk7CisJaWYgKHJldCkKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicmVxdWVzdCAlcyBJUlEgZmFpbGVkXG4iLCBuYW1lKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2Nuc3NfYWxsb2NfbWVtb3J5X3JlZ2lvbihzdHJ1Y3QgcWNvbV93Y25zcyAqd2Nuc3MpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlOworCXN0cnVjdCByZXNvdXJjZSByOworCWludCByZXQ7CisKKwlub2RlID0gb2ZfcGFyc2VfcGhhbmRsZSh3Y25zcy0+ZGV2LT5vZl9ub2RlLCAibWVtb3J5LXJlZ2lvbiIsIDApOworCWlmICghbm9kZSkgeworCQlkZXZfZXJyKHdjbnNzLT5kZXYsICJubyBtZW1vcnktcmVnaW9uIHNwZWNpZmllZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uobm9kZSwgMCwgJnIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl3Y25zcy0+bWVtX3BoeXMgPSB3Y25zcy0+bWVtX3JlbG9jID0gci5zdGFydDsKKwl3Y25zcy0+bWVtX3NpemUgPSByZXNvdXJjZV9zaXplKCZyKTsKKwl3Y25zcy0+bWVtX3JlZ2lvbiA9IGRldm1faW9yZW1hcF93Yyh3Y25zcy0+ZGV2LCB3Y25zcy0+bWVtX3BoeXMsIHdjbnNzLT5tZW1fc2l6ZSk7CisJaWYgKCF3Y25zcy0+bWVtX3JlZ2lvbikgeworCQlkZXZfZXJyKHdjbnNzLT5kZXYsICJ1bmFibGUgdG8gbWFwIG1lbW9yeSByZWdpb246ICVwYSslenhcbiIsCisJCQkmci5zdGFydCwgd2Nuc3MtPm1lbV9zaXplKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3Y25zc19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWNvbnN0IHN0cnVjdCB3Y25zc19kYXRhICpkYXRhOworCXN0cnVjdCBxY29tX3djbnNzICp3Y25zczsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgcnByb2MgKnJwcm9jOworCXZvaWQgX19pb21lbSAqbW1pbzsKKwlpbnQgcmV0OworCisJZGF0YSA9IG9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YSgmcGRldi0+ZGV2KTsKKworCWlmICghcWNvbV9zY21faXNfYXZhaWxhYmxlKCkpCisJCXJldHVybiAtRVBST0JFX0RFRkVSOworCisJaWYgKCFxY29tX3NjbV9wYXNfc3VwcG9ydGVkKFdDTlNTX1BBU19JRCkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiUEFTIGlzIG5vdCBhdmFpbGFibGUgZm9yIFdDTlNTXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlycHJvYyA9IHJwcm9jX2FsbG9jKCZwZGV2LT5kZXYsIHBkZXYtPm5hbWUsICZ3Y25zc19vcHMsCisJCQkgICAgV0NOU1NfRklSTVdBUkVfTkFNRSwgc2l6ZW9mKCp3Y25zcykpOworCWlmICghcnByb2MpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIHJlbW90ZXByb2NcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlycHJvYy0+Zndfb3BzID0gJndjbnNzX2Z3X29wczsKKworCXdjbnNzID0gKHN0cnVjdCBxY29tX3djbnNzICopcnByb2MtPnByaXY7CisJd2Nuc3MtPmRldiA9ICZwZGV2LT5kZXY7CisJd2Nuc3MtPnJwcm9jID0gcnByb2M7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgd2Nuc3MpOworCisJaW5pdF9jb21wbGV0aW9uKCZ3Y25zcy0+c3RhcnRfZG9uZSk7CisJaW5pdF9jb21wbGV0aW9uKCZ3Y25zcy0+c3RvcF9kb25lKTsKKworCW11dGV4X2luaXQoJndjbnNzLT5pcmlzX2xvY2spOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgInBtdSIpOworCW1taW8gPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKG1taW8pKSB7CisJCXJldCA9IFBUUl9FUlIobW1pbyk7CisJCWdvdG8gZnJlZV9ycHJvYzsKKwl9OworCisJcmV0ID0gd2Nuc3NfYWxsb2NfbWVtb3J5X3JlZ2lvbih3Y25zcyk7CisJaWYgKHJldCkKKwkJZ290byBmcmVlX3Jwcm9jOworCisJd2Nuc3MtPnBtdV9jZmcgPSBtbWlvICsgZGF0YS0+cG11X29mZnNldDsKKwl3Y25zcy0+c3BhcmVfb3V0ID0gbW1pbyArIGRhdGEtPnNwYXJlX29mZnNldDsKKworCXJldCA9IHdjbnNzX2luaXRfcmVndWxhdG9ycyh3Y25zcywgZGF0YS0+dnJlZ3MsIGRhdGEtPm51bV92cmVncyk7CisJaWYgKHJldCkKKwkJZ290byBmcmVlX3Jwcm9jOworCisJcmV0ID0gd2Nuc3NfcmVxdWVzdF9pcnEod2Nuc3MsIHBkZXYsICJ3ZG9nIiwgZmFsc2UsIHdjbnNzX3dkb2dfaW50ZXJydXB0KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBmcmVlX3Jwcm9jOworCXdjbnNzLT53ZG9nX2lycSA9IHJldDsKKworCXJldCA9IHdjbnNzX3JlcXVlc3RfaXJxKHdjbnNzLCBwZGV2LCAiZmF0YWwiLCBmYWxzZSwgd2Nuc3NfZmF0YWxfaW50ZXJydXB0KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBmcmVlX3Jwcm9jOworCXdjbnNzLT5mYXRhbF9pcnEgPSByZXQ7CisKKwlyZXQgPSB3Y25zc19yZXF1ZXN0X2lycSh3Y25zcywgcGRldiwgInJlYWR5IiwgdHJ1ZSwgd2Nuc3NfcmVhZHlfaW50ZXJydXB0KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBmcmVlX3Jwcm9jOworCXdjbnNzLT5yZWFkeV9pcnEgPSByZXQ7CisKKwlyZXQgPSB3Y25zc19yZXF1ZXN0X2lycSh3Y25zcywgcGRldiwgImhhbmRvdmVyIiwgdHJ1ZSwgd2Nuc3NfaGFuZG92ZXJfaW50ZXJydXB0KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBmcmVlX3Jwcm9jOworCXdjbnNzLT5oYW5kb3Zlcl9pcnEgPSByZXQ7CisKKwlyZXQgPSB3Y25zc19yZXF1ZXN0X2lycSh3Y25zcywgcGRldiwgInN0b3AtYWNrIiwgdHJ1ZSwgd2Nuc3Nfc3RvcF9hY2tfaW50ZXJydXB0KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBmcmVlX3Jwcm9jOworCXdjbnNzLT5zdG9wX2Fja19pcnEgPSByZXQ7CisKKwlpZiAod2Nuc3MtPnN0b3BfYWNrX2lycSkgeworCQl3Y25zcy0+c3RhdGUgPSBxY29tX3NtZW1fc3RhdGVfZ2V0KCZwZGV2LT5kZXYsICJzdG9wIiwKKwkJCQkJCSAgICZ3Y25zcy0+c3RvcF9iaXQpOworCQlpZiAoSVNfRVJSKHdjbnNzLT5zdGF0ZSkpIHsKKwkJCXJldCA9IFBUUl9FUlIod2Nuc3MtPnN0YXRlKTsKKwkJCWdvdG8gZnJlZV9ycHJvYzsKKwkJfQorCX0KKworCXJldCA9IHJwcm9jX2FkZChycHJvYyk7CisJaWYgKHJldCkKKwkJZ290byBmcmVlX3Jwcm9jOworCisJcmV0dXJuIG9mX3BsYXRmb3JtX3BvcHVsYXRlKHBkZXYtPmRldi5vZl9ub2RlLCBOVUxMLCBOVUxMLCAmcGRldi0+ZGV2KTsKKworZnJlZV9ycHJvYzoKKwlycHJvY19mcmVlKHJwcm9jKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2Nuc3NfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHFjb21fd2Nuc3MgKndjbnNzID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlvZl9wbGF0Zm9ybV9kZXBvcHVsYXRlKCZwZGV2LT5kZXYpOworCisJcWNvbV9zbWVtX3N0YXRlX3B1dCh3Y25zcy0+c3RhdGUpOworCXJwcm9jX2RlbCh3Y25zcy0+cnByb2MpOworCXJwcm9jX2ZyZWUod2Nuc3MtPnJwcm9jKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3Y25zc19vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAicWNvbSxyaXZhLXBpbCIsICZyaXZhX2RhdGEgfSwKKwl7IC5jb21wYXRpYmxlID0gInFjb20scHJvbnRvLXYxLXBpbCIsICZwcm9udG9fdjFfZGF0YSB9LAorCXsgLmNvbXBhdGlibGUgPSAicWNvbSxwcm9udG8tdjItcGlsIiwgJnByb250b192Ml9kYXRhIH0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgd2Nuc3NfZHJpdmVyID0geworCS5wcm9iZSA9IHdjbnNzX3Byb2JlLAorCS5yZW1vdmUgPSB3Y25zc19yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAicWNvbS13Y25zcy1waWwiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB3Y25zc19vZl9tYXRjaCwKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih3Y25zc19kcml2ZXIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJRdWFsY29tbSBQZXJpcGhlcmlhbCBJbWFnZSBMb2FkZXIgZm9yIFdpcmVsZXNzIFN1YnN5c3RlbSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZW1vdGVwcm9jL3Fjb21fd2Nuc3MuaCBiL2RyaXZlcnMvcmVtb3RlcHJvYy9xY29tX3djbnNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRjNGE5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcmVtb3RlcHJvYy9xY29tX3djbnNzLmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBfX1FDT01fV05DU1NfSF9fCisjZGVmaW5lIF9fUUNPTV9XTkNTU19IX18KKworc3RydWN0IHFjb21faXJpczsKK3N0cnVjdCBxY29tX3djbnNzOworCitzdHJ1Y3Qgd2Nuc3NfdnJlZ19pbmZvIHsKKwljb25zdCBjaGFyICogY29uc3QgbmFtZTsKKwlpbnQgbWluX3ZvbHRhZ2U7CisJaW50IG1heF92b2x0YWdlOworCisJaW50IGxvYWRfdUE7CisKKwlib29sIHN1cGVyX3R1cmJvOworfTsKKworaW50IHFjb21faXJpc19lbmFibGUoc3RydWN0IHFjb21faXJpcyAqaXJpcyk7Cit2b2lkIHFjb21faXJpc19kaXNhYmxlKHN0cnVjdCBxY29tX2lyaXMgKmlyaXMpOworCit2b2lkIHFjb21fd2Nuc3NfYXNzaWduX2lyaXMoc3RydWN0IHFjb21fd2Nuc3MgKndjbnNzLCBzdHJ1Y3QgcWNvbV9pcmlzICppcmlzLCBib29sIHVzZV80OG1oel94byk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZW1vdGVwcm9jL3Fjb21fd2Nuc3NfaXJpcy5jIGIvZHJpdmVycy9yZW1vdGVwcm9jL3Fjb21fd2Nuc3NfaXJpcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwY2EyNGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3JlbW90ZXByb2MvcWNvbV93Y25zc19pcmlzLmMKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBRdWFsY29tbSBXaXJlbGVzcyBDb25uZWN0aXZpdHkgU3Vic3lzdGVtIElyaXMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IExpbmFybyBMdGQKKyAqIENvcHlyaWdodCAoQykgMjAxNCBTb255IE1vYmlsZSBDb21tdW5pY2F0aW9ucyBBQgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisKKyNpbmNsdWRlICJxY29tX3djbnNzLmgiCisKK3N0cnVjdCBxY29tX2lyaXMgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCXN0cnVjdCBjbGsgKnhvX2NsazsKKworCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhICp2cmVnczsKKwlzaXplX3QgbnVtX3ZyZWdzOworfTsKKworc3RydWN0IGlyaXNfZGF0YSB7CisJY29uc3Qgc3RydWN0IHdjbnNzX3ZyZWdfaW5mbyAqdnJlZ3M7CisJc2l6ZV90IG51bV92cmVnczsKKworCWJvb2wgdXNlXzQ4bWh6X3hvOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpcmlzX2RhdGEgd2NuMzYyMF9kYXRhID0geworCS52cmVncyA9IChzdHJ1Y3Qgd2Nuc3NfdnJlZ19pbmZvW10pIHsKKwkJeyAidmRkeG8iLCAgMTgwMDAwMCwgMTgwMDAwMCwgMTAwMDAgfSwKKwkJeyAidmRkcmZhIiwgMTMwMDAwMCwgMTMwMDAwMCwgMTAwMDAwIH0sCisJCXsgInZkZHBhIiwgIDMzMDAwMDAsIDMzMDAwMDAsIDUxNTAwMCB9LAorCQl7ICJ2ZGRkaWciLCAxODAwMDAwLCAxODAwMDAwLCAxMDAwMCB9LAorCX0sCisJLm51bV92cmVncyA9IDQsCisJLnVzZV80OG1oel94byA9IGZhbHNlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpcmlzX2RhdGEgd2NuMzY2MF9kYXRhID0geworCS52cmVncyA9IChzdHJ1Y3Qgd2Nuc3NfdnJlZ19pbmZvW10pIHsKKwkJeyAidmRkeG8iLCAgMTgwMDAwMCwgMTgwMDAwMCwgMTAwMDAgfSwKKwkJeyAidmRkcmZhIiwgMTMwMDAwMCwgMTMwMDAwMCwgMTAwMDAwIH0sCisJCXsgInZkZHBhIiwgIDI5MDAwMDAsIDMwMDAwMDAsIDUxNTAwMCB9LAorCQl7ICJ2ZGRkaWciLCAxMjAwMDAwLCAxMjI1MDAwLCAxMDAwMCB9LAorCX0sCisJLm51bV92cmVncyA9IDQsCisJLnVzZV80OG1oel94byA9IHRydWUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlyaXNfZGF0YSB3Y24zNjgwX2RhdGEgPSB7CisJLnZyZWdzID0gKHN0cnVjdCB3Y25zc192cmVnX2luZm9bXSkgeworCQl7ICJ2ZGR4byIsICAxODAwMDAwLCAxODAwMDAwLCAxMDAwMCB9LAorCQl7ICJ2ZGRyZmEiLCAxMzAwMDAwLCAxMzAwMDAwLCAxMDAwMDAgfSwKKwkJeyAidmRkcGEiLCAgMzMwMDAwMCwgMzMwMDAwMCwgNTE1MDAwIH0sCisJCXsgInZkZGRpZyIsIDE4MDAwMDAsIDE4MDAwMDAsIDEwMDAwIH0sCisJfSwKKwkubnVtX3ZyZWdzID0gNCwKKwkudXNlXzQ4bWh6X3hvID0gdHJ1ZSwKK307CisKK2ludCBxY29tX2lyaXNfZW5hYmxlKHN0cnVjdCBxY29tX2lyaXMgKmlyaXMpCit7CisJaW50IHJldDsKKworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShpcmlzLT5udW1fdnJlZ3MsIGlyaXMtPnZyZWdzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGlyaXMtPnhvX2Nsayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGlyaXMtPmRldiwgImZhaWxlZCB0byBlbmFibGUgeG8gY2xrXG4iKTsKKwkJZ290byBkaXNhYmxlX3JlZ3VsYXRvcnM7CisJfQorCisJcmV0dXJuIDA7CisKK2Rpc2FibGVfcmVndWxhdG9yczoKKwlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKGlyaXMtPm51bV92cmVncywgaXJpcy0+dnJlZ3MpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHFjb21faXJpc19lbmFibGUpOworCit2b2lkIHFjb21faXJpc19kaXNhYmxlKHN0cnVjdCBxY29tX2lyaXMgKmlyaXMpCit7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGlyaXMtPnhvX2Nsayk7CisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShpcmlzLT5udW1fdnJlZ3MsIGlyaXMtPnZyZWdzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHFjb21faXJpc19kaXNhYmxlKTsKKworc3RhdGljIGludCBxY29tX2lyaXNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwljb25zdCBzdHJ1Y3QgaXJpc19kYXRhICpkYXRhOworCXN0cnVjdCBxY29tX3djbnNzICp3Y25zczsKKwlzdHJ1Y3QgcWNvbV9pcmlzICppcmlzOworCWludCByZXQ7CisJaW50IGk7CisKKwlpcmlzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgcWNvbV9pcmlzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpcmlzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRhdGEgPSBvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGEoJnBkZXYtPmRldik7CisJd2Nuc3MgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisKKwlpcmlzLT54b19jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgInhvIik7CisJaWYgKElTX0VSUihpcmlzLT54b19jbGspKSB7CisJCWlmIChQVFJfRVJSKGlyaXMtPnhvX2NsaykgIT0gLUVQUk9CRV9ERUZFUikKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhY3F1aXJlIHhvIGNsa1xuIik7CisJCXJldHVybiBQVFJfRVJSKGlyaXMtPnhvX2Nsayk7CisJfQorCisJaXJpcy0+bnVtX3ZyZWdzID0gZGF0YS0+bnVtX3ZyZWdzOworCWlyaXMtPnZyZWdzID0gZGV2bV9rY2FsbG9jKCZwZGV2LT5kZXYsCisJCQkJICAgaXJpcy0+bnVtX3ZyZWdzLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSksCisJCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFpcmlzLT52cmVncykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgaXJpcy0+bnVtX3ZyZWdzOyBpKyspCisJCWlyaXMtPnZyZWdzW2ldLnN1cHBseSA9IGRhdGEtPnZyZWdzW2ldLm5hbWU7CisKKwlyZXQgPSBkZXZtX3JlZ3VsYXRvcl9idWxrX2dldCgmcGRldi0+ZGV2LCBpcmlzLT5udW1fdnJlZ3MsIGlyaXMtPnZyZWdzKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgcmVndWxhdG9yc1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGlyaXMtPm51bV92cmVnczsgaSsrKSB7CisJCWlmIChkYXRhLT52cmVnc1tpXS5tYXhfdm9sdGFnZSkKKwkJCXJlZ3VsYXRvcl9zZXRfdm9sdGFnZShpcmlzLT52cmVnc1tpXS5jb25zdW1lciwKKwkJCQkJICAgICAgZGF0YS0+dnJlZ3NbaV0ubWluX3ZvbHRhZ2UsCisJCQkJCSAgICAgIGRhdGEtPnZyZWdzW2ldLm1heF92b2x0YWdlKTsKKworCQlpZiAoZGF0YS0+dnJlZ3NbaV0ubG9hZF91QSkKKwkJCXJlZ3VsYXRvcl9zZXRfbG9hZChpcmlzLT52cmVnc1tpXS5jb25zdW1lciwKKwkJCQkJICAgZGF0YS0+dnJlZ3NbaV0ubG9hZF91QSk7CisJfQorCisJcWNvbV93Y25zc19hc3NpZ25faXJpcyh3Y25zcywgaXJpcywgZGF0YS0+dXNlXzQ4bWh6X3hvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFjb21faXJpc19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcWNvbV93Y25zcyAqd2Nuc3MgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisKKwlxY29tX3djbnNzX2Fzc2lnbl9pcmlzKHdjbnNzLCBOVUxMLCBmYWxzZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgaXJpc19vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAicWNvbSx3Y24zNjIwIiwgLmRhdGEgPSAmd2NuMzYyMF9kYXRhIH0sCisJeyAuY29tcGF0aWJsZSA9ICJxY29tLHdjbjM2NjAiLCAuZGF0YSA9ICZ3Y24zNjYwX2RhdGEgfSwKKwl7IC5jb21wYXRpYmxlID0gInFjb20sd2NuMzY4MCIsIC5kYXRhID0gJndjbjM2ODBfZGF0YSB9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB3Y25zc19kcml2ZXIgPSB7CisJLnByb2JlID0gcWNvbV9pcmlzX3Byb2JlLAorCS5yZW1vdmUgPSBxY29tX2lyaXNfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInFjb20taXJpcyIsCisJCS5vZl9tYXRjaF90YWJsZSA9IGlyaXNfb2ZfbWF0Y2gsCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIod2Nuc3NfZHJpdmVyKTsKK01PRFVMRV9ERVNDUklQVElPTigiUXVhbGNvbW0gV2lyZWxlc3MgU3Vic3lzdGVtIElyaXMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlbW90ZXByb2MvcmVtb3RlcHJvY19jb3JlLmMgYi9kcml2ZXJzL3JlbW90ZXByb2MvcmVtb3RlcHJvY19jb3JlLmMKaW5kZXggZmUwNTM5ZS4uYzZiZmIzNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVtb3RlcHJvYy9yZW1vdGVwcm9jX2NvcmUuYworKysgYi9kcml2ZXJzL3JlbW90ZXByb2MvcmVtb3RlcHJvY19jb3JlLmMKQEAgLTc4LDcgKzc4LDcgQEAKICAqIHdpbGwgdHJ5IHRvIGFjY2VzcyBhbiB1bm1hcHBlZCBkZXZpY2UgYWRkcmVzcy4KICAqLwogc3RhdGljIGludCBycHJvY19pb21tdV9mYXVsdChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJdW5zaWduZWQgbG9uZyBpb3ZhLCBpbnQgZmxhZ3MsIHZvaWQgKnRva2VuKQorCQkJICAgICB1bnNpZ25lZCBsb25nIGlvdmEsIGludCBmbGFncywgdm9pZCAqdG9rZW4pCiB7CiAJc3RydWN0IHJwcm9jICpycHJvYyA9IHRva2VuOwogCkBAIC0yMzYsOCArMjM2LDggQEAKIAl9CiAJbm90aWZ5aWQgPSByZXQ7CiAKLQlkZXZfZGJnKGRldiwgInZyaW5nJWQ6IHZhICVwIGRtYSAlbGx4IHNpemUgJXggaWRyICVkXG4iLCBpLCB2YSwKLQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWRtYSwgc2l6ZSwgbm90aWZ5aWQpOworCWRldl9kYmcoZGV2LCAidnJpbmclZDogdmEgJXAgZG1hICVwYWQgc2l6ZSAweCV4IGlkciAlZFxuIiwKKwkJaSwgdmEsICZkbWEsIHNpemUsIG5vdGlmeWlkKTsKIAogCXJ2cmluZy0+dmEgPSB2YTsKIAlydnJpbmctPmRtYSA9IGRtYTsKQEAgLTI2MywxOSArMjYzLDEzIEBACiAJc3RydWN0IGZ3X3JzY192ZGV2X3ZyaW5nICp2cmluZyA9ICZyc2MtPnZyaW5nW2ldOwogCXN0cnVjdCBycHJvY192cmluZyAqcnZyaW5nID0gJnJ2ZGV2LT52cmluZ1tpXTsKIAotCWRldl9kYmcoZGV2LCAidmRldiByc2M6IHZyaW5nJWQ6IGRhICV4LCBxc3ogJWQsIGFsaWduICVkXG4iLAotCQkJCWksIHZyaW5nLT5kYSwgdnJpbmctPm51bSwgdnJpbmctPmFsaWduKTsKLQotCS8qIG1ha2Ugc3VyZSByZXNlcnZlZCBieXRlcyBhcmUgemVyb2VzICovCi0JaWYgKHZyaW5nLT5yZXNlcnZlZCkgewotCQlkZXZfZXJyKGRldiwgInZyaW5nIHJzYyBoYXMgbm9uIHplcm8gcmVzZXJ2ZWQgYnl0ZXNcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJZGV2X2RiZyhkZXYsICJ2ZGV2IHJzYzogdnJpbmclZDogZGEgMHgleCwgcXN6ICVkLCBhbGlnbiAlZFxuIiwKKwkJaSwgdnJpbmctPmRhLCB2cmluZy0+bnVtLCB2cmluZy0+YWxpZ24pOwogCiAJLyogdmVyaWZ5IHF1ZXVlIHNpemUgYW5kIHZyaW5nIGFsaWdubWVudCBhcmUgc2FuZSAqLwogCWlmICghdnJpbmctPm51bSB8fCAhdnJpbmctPmFsaWduKSB7CiAJCWRldl9lcnIoZGV2LCAiaW52YWxpZCBxc3ogKCVkKSBvciBhbGlnbm1lbnQgKCVkKVxuIiwKLQkJCQkJCXZyaW5nLT5udW0sIHZyaW5nLT5hbGlnbik7CisJCQl2cmluZy0+bnVtLCB2cmluZy0+YWxpZ24pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTMzMCw3ICszMjQsNyBAQAogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIGFuIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUgb3RoZXJ3aXNlCiAgKi8KIHN0YXRpYyBpbnQgcnByb2NfaGFuZGxlX3ZkZXYoc3RydWN0IHJwcm9jICpycHJvYywgc3RydWN0IGZ3X3JzY192ZGV2ICpyc2MsCi0JCQkJCQkJaW50IG9mZnNldCwgaW50IGF2YWlsKQorCQkJICAgICBpbnQgb2Zmc2V0LCBpbnQgYXZhaWwpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnJwcm9jLT5kZXY7CiAJc3RydWN0IHJwcm9jX3ZkZXYgKnJ2ZGV2OwpAQCAtMzQ5LDcgKzM0Myw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWRldl9kYmcoZGV2LCAidmRldiByc2M6IGlkICVkLCBkZmVhdHVyZXMgJXgsIGNmZyBsZW4gJWQsICVkIHZyaW5nc1xuIiwKKwlkZXZfZGJnKGRldiwgInZkZXYgcnNjOiBpZCAlZCwgZGZlYXR1cmVzIDB4JXgsIGNmZyBsZW4gJWQsICVkIHZyaW5nc1xuIiwKIAkJcnNjLT5pZCwgcnNjLT5kZmVhdHVyZXMsIHJzYy0+Y29uZmlnX2xlbiwgcnNjLT5udW1fb2ZfdnJpbmdzKTsKIAogCS8qIHdlIGN1cnJlbnRseSBzdXBwb3J0IG9ubHkgdHdvIHZyaW5ncyBwZXIgcnZkZXYgKi8KQEAgLTM1OCw3ICszNTIsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlydmRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBycHJvY192ZGV2KSwgR0ZQX0tFUk5FTCk7CisJcnZkZXYgPSBremFsbG9jKHNpemVvZigqcnZkZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJ2ZGV2KQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtNDA3LDcgKzQwMSw3IEBACiAgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgYW4gYXBwcm9wcmlhdGUgZXJyb3IgY29kZSBvdGhlcndpc2UKICAqLwogc3RhdGljIGludCBycHJvY19oYW5kbGVfdHJhY2Uoc3RydWN0IHJwcm9jICpycHJvYywgc3RydWN0IGZ3X3JzY190cmFjZSAqcnNjLAotCQkJCQkJCWludCBvZmZzZXQsIGludCBhdmFpbCkKKwkJCSAgICAgIGludCBvZmZzZXQsIGludCBhdmFpbCkKIHsKIAlzdHJ1Y3QgcnByb2NfbWVtX2VudHJ5ICp0cmFjZTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcnByb2MtPmRldjsKQEAgLTQ1NSw4ICs0NDksOCBAQAogCiAJcnByb2MtPm51bV90cmFjZXMrKzsKIAotCWRldl9kYmcoZGV2LCAiJXMgYWRkZWQ6IHZhICVwLCBkYSAweCV4LCBsZW4gMHgleFxuIiwgbmFtZSwgcHRyLAotCQkJCQkJcnNjLT5kYSwgcnNjLT5sZW4pOworCWRldl9kYmcoZGV2LCAiJXMgYWRkZWQ6IHZhICVwLCBkYSAweCV4LCBsZW4gMHgleFxuIiwKKwkJbmFtZSwgcHRyLCByc2MtPmRhLCByc2MtPmxlbik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ4Nyw3ICs0ODEsNyBAQAogICogYXJlIG91dHNpZGUgdGhvc2UgcmFuZ2VzLgogICovCiBzdGF0aWMgaW50IHJwcm9jX2hhbmRsZV9kZXZtZW0oc3RydWN0IHJwcm9jICpycHJvYywgc3RydWN0IGZ3X3JzY19kZXZtZW0gKnJzYywKLQkJCQkJCQlpbnQgb2Zmc2V0LCBpbnQgYXZhaWwpCisJCQkgICAgICAgaW50IG9mZnNldCwgaW50IGF2YWlsKQogewogCXN0cnVjdCBycHJvY19tZW1fZW50cnkgKm1hcHBpbmc7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnJwcm9jLT5kZXY7CkBAIC01MzAsNyArNTI0LDcgQEAKIAlsaXN0X2FkZF90YWlsKCZtYXBwaW5nLT5ub2RlLCAmcnByb2MtPm1hcHBpbmdzKTsKIAogCWRldl9kYmcoZGV2LCAibWFwcGVkIGRldm1lbSBwYSAweCV4LCBkYSAweCV4LCBsZW4gMHgleFxuIiwKLQkJCQkJcnNjLT5wYSwgcnNjLT5kYSwgcnNjLT5sZW4pOworCQlyc2MtPnBhLCByc2MtPmRhLCByc2MtPmxlbik7CiAKIAlyZXR1cm4gMDsKIApAQCAtNTU4LDkgKzU1Miw4IEBACiAgKiBwcmVzc3VyZSBpcyBpbXBvcnRhbnQ7IGl0IG1heSBoYXZlIGEgc3Vic3RhbnRpYWwgaW1wYWN0IG9uIHBlcmZvcm1hbmNlLgogICovCiBzdGF0aWMgaW50IHJwcm9jX2hhbmRsZV9jYXJ2ZW91dChzdHJ1Y3QgcnByb2MgKnJwcm9jLAotCQkJCQkJc3RydWN0IGZ3X3JzY19jYXJ2ZW91dCAqcnNjLAotCQkJCQkJaW50IG9mZnNldCwgaW50IGF2YWlsKQotCisJCQkJIHN0cnVjdCBmd19yc2NfY2FydmVvdXQgKnJzYywKKwkJCQkgaW50IG9mZnNldCwgaW50IGF2YWlsKQogewogCXN0cnVjdCBycHJvY19tZW1fZW50cnkgKmNhcnZlb3V0LCAqbWFwcGluZzsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcnByb2MtPmRldjsKQEAgLTU3OSw4ICs1NzIsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlkZXZfZGJnKGRldiwgImNhcnZlb3V0IHJzYzogZGEgJXgsIHBhICV4LCBsZW4gJXgsIGZsYWdzICV4XG4iLAotCQkJcnNjLT5kYSwgcnNjLT5wYSwgcnNjLT5sZW4sIHJzYy0+ZmxhZ3MpOworCWRldl9kYmcoZGV2LCAiY2FydmVvdXQgcnNjOiBuYW1lOiAlcywgZGEgMHgleCwgcGEgMHgleCwgbGVuIDB4JXgsIGZsYWdzIDB4JXhcbiIsCisJCXJzYy0+bmFtZSwgcnNjLT5kYSwgcnNjLT5wYSwgcnNjLT5sZW4sIHJzYy0+ZmxhZ3MpOwogCiAJY2FydmVvdXQgPSBremFsbG9jKHNpemVvZigqY2FydmVvdXQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNhcnZlb3V0KQpAQCAtNTg4LDEzICs1ODEsMTQgQEAKIAogCXZhID0gZG1hX2FsbG9jX2NvaGVyZW50KGRldi0+cGFyZW50LCByc2MtPmxlbiwgJmRtYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF2YSkgewotCQlkZXZfZXJyKGRldi0+cGFyZW50LCAiZG1hX2FsbG9jX2NvaGVyZW50IGVycjogJWRcbiIsIHJzYy0+bGVuKTsKKwkJZGV2X2VycihkZXYtPnBhcmVudCwKKwkJCSJmYWlsZWQgdG8gYWxsb2NhdGUgZG1hIG1lbW9yeTogbGVuIDB4JXhcbiIsIHJzYy0+bGVuKTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBmcmVlX2NhcnY7CiAJfQogCi0JZGV2X2RiZyhkZXYsICJjYXJ2ZW91dCB2YSAlcCwgZG1hICVsbHgsIGxlbiAweCV4XG4iLCB2YSwKLQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylkbWEsIHJzYy0+bGVuKTsKKwlkZXZfZGJnKGRldiwgImNhcnZlb3V0IHZhICVwLCBkbWEgJXBhZCwgbGVuIDB4JXhcbiIsCisJCXZhLCAmZG1hLCByc2MtPmxlbik7CiAKIAkvKgogCSAqIE9rLCB0aGlzIGlzIG5vbi1zdGFuZGFyZC4KQEAgLTYxNiwxMyArNjEwLDEyIEBACiAJaWYgKHJwcm9jLT5kb21haW4pIHsKIAkJbWFwcGluZyA9IGt6YWxsb2Moc2l6ZW9mKCptYXBwaW5nKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghbWFwcGluZykgewotCQkJZGV2X2VycihkZXYsICJremFsbG9jIG1hcHBpbmcgZmFpbGVkXG4iKTsKIAkJCXJldCA9IC1FTk9NRU07CiAJCQlnb3RvIGRtYV9mcmVlOwogCQl9CiAKIAkJcmV0ID0gaW9tbXVfbWFwKHJwcm9jLT5kb21haW4sIHJzYy0+ZGEsIGRtYSwgcnNjLT5sZW4sCi0JCQkJCQkJCXJzYy0+ZmxhZ3MpOworCQkJCXJzYy0+ZmxhZ3MpOwogCQlpZiAocmV0KSB7CiAJCQlkZXZfZXJyKGRldiwgImlvbW11X21hcCBmYWlsZWQ6ICVkXG4iLCByZXQpOwogCQkJZ290byBmcmVlX21hcHBpbmc7CkBAIC02MzksOCArNjMyLDggQEAKIAkJbWFwcGluZy0+bGVuID0gcnNjLT5sZW47CiAJCWxpc3RfYWRkX3RhaWwoJm1hcHBpbmctPm5vZGUsICZycHJvYy0+bWFwcGluZ3MpOwogCi0JCWRldl9kYmcoZGV2LCAiY2FydmVvdXQgbWFwcGVkIDB4JXggdG8gMHglbGx4XG4iLAotCQkJCQlyc2MtPmRhLCAodW5zaWduZWQgbG9uZyBsb25nKWRtYSk7CisJCWRldl9kYmcoZGV2LCAiY2FydmVvdXQgbWFwcGVkIDB4JXggdG8gJXBhZFxuIiwKKwkJCXJzYy0+ZGEsICZkbWEpOwogCX0KIAogCS8qCkBAIC02OTcsMTcgKzY5MCwxMyBAQAogCVtSU0NfQ0FSVkVPVVRdID0gKHJwcm9jX2hhbmRsZV9yZXNvdXJjZV90KXJwcm9jX2hhbmRsZV9jYXJ2ZW91dCwKIAlbUlNDX0RFVk1FTV0gPSAocnByb2NfaGFuZGxlX3Jlc291cmNlX3QpcnByb2NfaGFuZGxlX2Rldm1lbSwKIAlbUlNDX1RSQUNFXSA9IChycHJvY19oYW5kbGVfcmVzb3VyY2VfdClycHJvY19oYW5kbGVfdHJhY2UsCi0JW1JTQ19WREVWXSA9IE5VTEwsIC8qIFZERVZzIHdlcmUgaGFuZGxlZCB1cG9uIHJlZ2lzdHJhcmlvbiAqLworCVtSU0NfVkRFVl0gPSAocnByb2NfaGFuZGxlX3Jlc291cmNlX3QpcnByb2NfY291bnRfdnJpbmdzLAogfTsKIAogc3RhdGljIHJwcm9jX2hhbmRsZV9yZXNvdXJjZV90IHJwcm9jX3ZkZXZfaGFuZGxlcltSU0NfTEFTVF0gPSB7CiAJW1JTQ19WREVWXSA9IChycHJvY19oYW5kbGVfcmVzb3VyY2VfdClycHJvY19oYW5kbGVfdmRldiwKIH07CiAKLXN0YXRpYyBycHJvY19oYW5kbGVfcmVzb3VyY2VfdCBycHJvY19jb3VudF92cmluZ3NfaGFuZGxlcltSU0NfTEFTVF0gPSB7Ci0JW1JTQ19WREVWXSA9IChycHJvY19oYW5kbGVfcmVzb3VyY2VfdClycHJvY19jb3VudF92cmluZ3MsCi19OwotCiAvKiBoYW5kbGUgZmlybXdhcmUgcmVzb3VyY2UgZW50cmllcyBiZWZvcmUgYm9vdGluZyB0aGUgcmVtb3RlIHByb2Nlc3NvciAqLwogc3RhdGljIGludCBycHJvY19oYW5kbGVfcmVzb3VyY2VzKHN0cnVjdCBycHJvYyAqcnByb2MsIGludCBsZW4sCiAJCQkJICBycHJvY19oYW5kbGVfcmVzb3VyY2VfdCBoYW5kbGVyc1tSU0NfTEFTVF0pCkBAIC03NTcsNiArNzQ2LDcgQEAKIHN0YXRpYyB2b2lkIHJwcm9jX3Jlc291cmNlX2NsZWFudXAoc3RydWN0IHJwcm9jICpycHJvYykKIHsKIAlzdHJ1Y3QgcnByb2NfbWVtX2VudHJ5ICplbnRyeSwgKnRtcDsKKwlzdHJ1Y3QgcnByb2NfdmRldiAqcnZkZXYsICpydnRtcDsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcnByb2MtPmRldjsKIAogCS8qIGNsZWFuIHVwIGRlYnVnZnMgdHJhY2UgZW50cmllcyAqLwpAQCAtNzc1LDcgKzc2NSw3IEBACiAJCWlmICh1bm1hcHBlZCAhPSBlbnRyeS0+bGVuKSB7CiAJCQkvKiBub3RoaW5nIG11Y2ggdG8gZG8gYmVzaWRlcyBjb21wbGFpbmluZyAqLwogCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gdW5tYXAgJXUvJXp1XG4iLCBlbnRyeS0+bGVuLAotCQkJCQkJCQl1bm1hcHBlZCk7CisJCQkJdW5tYXBwZWQpOwogCQl9CiAKIAkJbGlzdF9kZWwoJmVudHJ5LT5ub2RlKTsKQEAgLTc4OSw2ICs3NzksMTAgQEAKIAkJbGlzdF9kZWwoJmVudHJ5LT5ub2RlKTsKIAkJa2ZyZWUoZW50cnkpOwogCX0KKworCS8qIGNsZWFuIHVwIHJlbW90ZSB2ZGV2IGVudHJpZXMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocnZkZXYsIHJ2dG1wLCAmcnByb2MtPnJ2ZGV2cywgbm9kZSkKKwkJcnByb2NfcmVtb3ZlX3ZpcnRpb19kZXYocnZkZXYpOwogfQogCiAvKgpAQCAtODAxLDkgKzc5NSw2IEBACiAJc3RydWN0IHJlc291cmNlX3RhYmxlICp0YWJsZSwgKmxvYWRlZF90YWJsZTsKIAlpbnQgcmV0LCB0YWJsZXN6OwogCi0JaWYgKCFycHJvYy0+dGFibGVfcHRyKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCXJldCA9IHJwcm9jX2Z3X3Nhbml0eV9jaGVjayhycHJvYywgZncpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CkBAIC04MzAsOSArODIxLDI1IEBACiAJCWdvdG8gY2xlYW5fdXA7CiAJfQogCi0JLyogVmVyaWZ5IHRoYXQgcmVzb3VyY2UgdGFibGUgaW4gbG9hZGVkIGZ3IGlzIHVuY2hhbmdlZCAqLwotCWlmIChycHJvYy0+dGFibGVfY3N1bSAhPSBjcmMzMigwLCB0YWJsZSwgdGFibGVzeikpIHsKLQkJZGV2X2VycihkZXYsICJyZXNvdXJjZSBjaGVja3N1bSBmYWlsZWQsIGZ3IGNoYW5nZWQ/XG4iKTsKKwkvKgorCSAqIENyZWF0ZSBhIGNvcHkgb2YgdGhlIHJlc291cmNlIHRhYmxlLiBXaGVuIGEgdmlydGlvIGRldmljZSBzdGFydHMKKwkgKiBhbmQgY2FsbHMgdnJpbmdfbmV3X3ZpcnRxdWV1ZSgpIHRoZSBhZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQgdnJpbmcKKwkgKiB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgY2FjaGVkX3RhYmxlLiBCZWZvcmUgdGhlIGRldmljZSBpcyBzdGFydGVkLAorCSAqIGNhY2hlZF90YWJsZSB3aWxsIGJlIGNvcGllZCBpbnRvIGRldmljZSBtZW1vcnkuCisJICovCisJcnByb2MtPmNhY2hlZF90YWJsZSA9IGttZW1kdXAodGFibGUsIHRhYmxlc3osIEdGUF9LRVJORUwpOworCWlmICghcnByb2MtPmNhY2hlZF90YWJsZSkKKwkJZ290byBjbGVhbl91cDsKKworCXJwcm9jLT50YWJsZV9wdHIgPSBycHJvYy0+Y2FjaGVkX3RhYmxlOworCisJLyogcmVzZXQgbWF4X25vdGlmeWlkICovCisJcnByb2MtPm1heF9ub3RpZnlpZCA9IC0xOworCisJLyogbG9vayBmb3IgdmlydGlvIGRldmljZXMgYW5kIHJlZ2lzdGVyIHRoZW0gKi8KKwlyZXQgPSBycHJvY19oYW5kbGVfcmVzb3VyY2VzKHJwcm9jLCB0YWJsZXN6LCBycHJvY192ZGV2X2hhbmRsZXIpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gaGFuZGxlIHZkZXYgcmVzb3VyY2VzOiAlZFxuIiwgcmV0KTsKIAkJZ290byBjbGVhbl91cDsKIAl9CiAKQEAgLTg0MCw0OSArODQ3LDUwIEBACiAJcmV0ID0gcnByb2NfaGFuZGxlX3Jlc291cmNlcyhycHJvYywgdGFibGVzeiwgcnByb2NfbG9hZGluZ19oYW5kbGVycyk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBwcm9jZXNzIHJlc291cmNlczogJWRcbiIsIHJldCk7Ci0JCWdvdG8gY2xlYW5fdXA7CisJCWdvdG8gY2xlYW5fdXBfcmVzb3VyY2VzOwogCX0KIAogCS8qIGxvYWQgdGhlIEVMRiBzZWdtZW50cyB0byBtZW1vcnkgKi8KIAlyZXQgPSBycHJvY19sb2FkX3NlZ21lbnRzKHJwcm9jLCBmdyk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBsb2FkIHByb2dyYW0gc2VnbWVudHM6ICVkXG4iLCByZXQpOwotCQlnb3RvIGNsZWFuX3VwOworCQlnb3RvIGNsZWFuX3VwX3Jlc291cmNlczsKIAl9CiAKIAkvKgogCSAqIFRoZSBzdGFydGluZyBkZXZpY2UgaGFzIGJlZW4gZ2l2ZW4gdGhlIHJwcm9jLT5jYWNoZWRfdGFibGUgYXMgdGhlCiAJICogcmVzb3VyY2UgdGFibGUuIFRoZSBhZGRyZXNzIG9mIHRoZSB2cmluZyBhbG9uZyB3aXRoIHRoZSBvdGhlcgogCSAqIGFsbG9jYXRlZCByZXNvdXJjZXMgKGNhcnZlb3V0cyBldGMpIGlzIHN0b3JlZCBpbiBjYWNoZWRfdGFibGUuCi0JICogSW4gb3JkZXIgdG8gcGFzcyB0aGlzIGluZm9ybWF0aW9uIHRvIHRoZSByZW1vdGUgZGV2aWNlIHdlIG11c3QKLQkgKiBjb3B5IHRoaXMgaW5mb3JtYXRpb24gdG8gZGV2aWNlIG1lbW9yeS4KKwkgKiBJbiBvcmRlciB0byBwYXNzIHRoaXMgaW5mb3JtYXRpb24gdG8gdGhlIHJlbW90ZSBkZXZpY2Ugd2UgbXVzdCBjb3B5CisJICogdGhpcyBpbmZvcm1hdGlvbiB0byBkZXZpY2UgbWVtb3J5LiBXZSBhbHNvIHVwZGF0ZSB0aGUgdGFibGVfcHRyIHNvCisJICogdGhhdCBhbnkgc3Vic2VxdWVudCBjaGFuZ2VzIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgbG9hZGVkIHZlcnNpb24uCiAJICovCiAJbG9hZGVkX3RhYmxlID0gcnByb2NfZmluZF9sb2FkZWRfcnNjX3RhYmxlKHJwcm9jLCBmdyk7Ci0JaWYgKGxvYWRlZF90YWJsZSkKKwlpZiAobG9hZGVkX3RhYmxlKSB7CiAJCW1lbWNweShsb2FkZWRfdGFibGUsIHJwcm9jLT5jYWNoZWRfdGFibGUsIHRhYmxlc3opOworCQlycHJvYy0+dGFibGVfcHRyID0gbG9hZGVkX3RhYmxlOworCX0KIAogCS8qIHBvd2VyIHVwIHRoZSByZW1vdGUgcHJvY2Vzc29yICovCiAJcmV0ID0gcnByb2MtPm9wcy0+c3RhcnQocnByb2MpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycihkZXYsICJjYW4ndCBzdGFydCBycHJvYyAlczogJWRcbiIsIHJwcm9jLT5uYW1lLCByZXQpOwotCQlnb3RvIGNsZWFuX3VwOworCQlnb3RvIGNsZWFuX3VwX3Jlc291cmNlczsKIAl9CiAKLQkvKgotCSAqIFVwZGF0ZSB0YWJsZV9wdHIgc28gdGhhdCBhbGwgc3Vic2VxdWVudCB2cmluZyBhbGxvY2F0aW9ucyBhbmQKLQkgKiB2aXJ0aW8gZmllbGRzIG1hbmlwdWxhdGlvbiB1cGRhdGUgdGhlIGFjdHVhbCBsb2FkZWQgcmVzb3VyY2UgdGFibGUKLQkgKiBpbiBkZXZpY2UgbWVtb3J5LgotCSAqLwotCXJwcm9jLT50YWJsZV9wdHIgPSBsb2FkZWRfdGFibGU7Ci0KIAlycHJvYy0+c3RhdGUgPSBSUFJPQ19SVU5OSU5HOwogCiAJZGV2X2luZm8oZGV2LCAicmVtb3RlIHByb2Nlc3NvciAlcyBpcyBub3cgdXBcbiIsIHJwcm9jLT5uYW1lKTsKIAogCXJldHVybiAwOwogCi1jbGVhbl91cDoKK2NsZWFuX3VwX3Jlc291cmNlczoKIAlycHJvY19yZXNvdXJjZV9jbGVhbnVwKHJwcm9jKTsKK2NsZWFuX3VwOgorCWtmcmVlKHJwcm9jLT5jYWNoZWRfdGFibGUpOworCXJwcm9jLT5jYWNoZWRfdGFibGUgPSBOVUxMOworCXJwcm9jLT50YWJsZV9wdHIgPSBOVUxMOworCiAJcnByb2NfZGlzYWJsZV9pb21tdShycHJvYyk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTg5OCw0MiArOTA2LDExIEBACiBzdGF0aWMgdm9pZCBycHJvY19md19jb25maWdfdmlydGlvKGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsIHZvaWQgKmNvbnRleHQpCiB7CiAJc3RydWN0IHJwcm9jICpycHJvYyA9IGNvbnRleHQ7Ci0Jc3RydWN0IHJlc291cmNlX3RhYmxlICp0YWJsZTsKLQlpbnQgcmV0LCB0YWJsZXN6OwogCi0JaWYgKHJwcm9jX2Z3X3Nhbml0eV9jaGVjayhycHJvYywgZncpIDwgMCkKLQkJZ290byBvdXQ7CisJLyogaWYgcnByb2MgaXMgbWFya2VkIGFsd2F5cy1vbiwgcmVxdWVzdCBpdCB0byBib290ICovCisJaWYgKHJwcm9jLT5hdXRvX2Jvb3QpCisJCXJwcm9jX2Jvb3Rfbm93YWl0KHJwcm9jKTsKIAotCS8qIGxvb2sgZm9yIHRoZSByZXNvdXJjZSB0YWJsZSAqLwotCXRhYmxlID0gcnByb2NfZmluZF9yc2NfdGFibGUocnByb2MsIGZ3LCAgJnRhYmxlc3opOwotCWlmICghdGFibGUpCi0JCWdvdG8gb3V0OwotCi0JcnByb2MtPnRhYmxlX2NzdW0gPSBjcmMzMigwLCB0YWJsZSwgdGFibGVzeik7Ci0KLQkvKgotCSAqIENyZWF0ZSBhIGNvcHkgb2YgdGhlIHJlc291cmNlIHRhYmxlLiBXaGVuIGEgdmlydGlvIGRldmljZSBzdGFydHMKLQkgKiBhbmQgY2FsbHMgdnJpbmdfbmV3X3ZpcnRxdWV1ZSgpIHRoZSBhZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQgdnJpbmcKLQkgKiB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgY2FjaGVkX3RhYmxlLiBCZWZvcmUgdGhlIGRldmljZSBpcyBzdGFydGVkLAotCSAqIGNhY2hlZF90YWJsZSB3aWxsIGJlIGNvcGllZCBpbnRvIGRldmljIG1lbW9yeS4KLQkgKi8KLQlycHJvYy0+Y2FjaGVkX3RhYmxlID0ga21lbWR1cCh0YWJsZSwgdGFibGVzeiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFycHJvYy0+Y2FjaGVkX3RhYmxlKQotCQlnb3RvIG91dDsKLQotCXJwcm9jLT50YWJsZV9wdHIgPSBycHJvYy0+Y2FjaGVkX3RhYmxlOwotCi0JLyogY291bnQgdGhlIG51bWJlciBvZiBub3RpZnktaWRzICovCi0JcnByb2MtPm1heF9ub3RpZnlpZCA9IC0xOwotCXJldCA9IHJwcm9jX2hhbmRsZV9yZXNvdXJjZXMocnByb2MsIHRhYmxlc3osCi0JCQkJICAgICBycHJvY19jb3VudF92cmluZ3NfaGFuZGxlcik7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0KLQkvKiBsb29rIGZvciB2aXJ0aW8gZGV2aWNlcyBhbmQgcmVnaXN0ZXIgdGhlbSAqLwotCXJldCA9IHJwcm9jX2hhbmRsZV9yZXNvdXJjZXMocnByb2MsIHRhYmxlc3osIHJwcm9jX3ZkZXZfaGFuZGxlcik7Ci0KLW91dDoKIAlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKIAkvKiBhbGxvdyBycHJvY19kZWwoKSBjb250ZXh0cywgaWYgYW55LCB0byBwcm9jZWVkICovCiAJY29tcGxldGVfYWxsKCZycHJvYy0+ZmlybXdhcmVfbG9hZGluZ19jb21wbGV0ZSk7CkBAIC05NjksNyArOTQ2LDcgQEAKICAqIHJwcm9jX3RyaWdnZXJfcmVjb3ZlcnkoKSAtIHJlY292ZXIgYSByZW1vdGVwcm9jCiAgKiBAcnByb2M6IHRoZSByZW1vdGUgcHJvY2Vzc29yCiAgKgotICogVGhlIHJlY292ZXJ5IGlzIGRvbmUgYnkgcmVzZXRpbmcgYWxsIHRoZSB2aXJ0aW8gZGV2aWNlcywgdGhhdCB3YXkgYWxsIHRoZQorICogVGhlIHJlY292ZXJ5IGlzIGRvbmUgYnkgcmVzZXR0aW5nIGFsbCB0aGUgdmlydGlvIGRldmljZXMsIHRoYXQgd2F5IGFsbCB0aGUKICAqIHJwbXNnIGRyaXZlcnMgd2lsbCBiZSByZXNldGVkIGFsb25nIHdpdGggdGhlIHJlbW90ZSBwcm9jZXNzb3IgbWFraW5nIHRoZQogICogcmVtb3RlcHJvYyBmdW5jdGlvbmFsIGFnYWluLgogICoKQEAgLTk3NywyMyArOTU0LDIzIEBACiAgKi8KIGludCBycHJvY190cmlnZ2VyX3JlY292ZXJ5KHN0cnVjdCBycHJvYyAqcnByb2MpCiB7Ci0Jc3RydWN0IHJwcm9jX3ZkZXYgKnJ2ZGV2LCAqcnZ0bXA7Ci0KIAlkZXZfZXJyKCZycHJvYy0+ZGV2LCAicmVjb3ZlcmluZyAlc1xuIiwgcnByb2MtPm5hbWUpOwogCiAJaW5pdF9jb21wbGV0aW9uKCZycHJvYy0+Y3Jhc2hfY29tcCk7CiAKLQkvKiBjbGVhbiB1cCByZW1vdGUgdmRldiBlbnRyaWVzICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJ2ZGV2LCBydnRtcCwgJnJwcm9jLT5ydmRldnMsIG5vZGUpCi0JCXJwcm9jX3JlbW92ZV92aXJ0aW9fZGV2KHJ2ZGV2KTsKKwkvKiBzaHV0IGRvd24gdGhlIHJlbW90ZSAqLworCS8qIFRPRE86IG1ha2Ugc3VyZSB0aGlzIHdvcmtzIHdpdGggcnByb2MtPnBvd2VyID4gMSAqLworCXJwcm9jX3NodXRkb3duKHJwcm9jKTsKIAogCS8qIHdhaXQgdW50aWwgdGhlcmUgaXMgbm8gbW9yZSBycHJvYyB1c2VycyAqLwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJnJwcm9jLT5jcmFzaF9jb21wKTsKIAotCS8qIEZyZWUgdGhlIGNvcHkgb2YgdGhlIHJlc291cmNlIHRhYmxlICovCi0Ja2ZyZWUocnByb2MtPmNhY2hlZF90YWJsZSk7CisJLyoKKwkgKiBib290IHRoZSByZW1vdGUgcHJvY2Vzc29yIHVwIGFnYWluCisJICovCisJcnByb2NfYm9vdChycHJvYyk7CiAKLQlyZXR1cm4gcnByb2NfYWRkX3ZpcnRpb19kZXZpY2VzKHJwcm9jKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0xMDU4LDIwICsxMDM1LDYgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQkvKiBsb2FkaW5nIGEgZmlybXdhcmUgaXMgcmVxdWlyZWQgKi8KLQlpZiAoIXJwcm9jLT5maXJtd2FyZSkgewotCQlkZXZfZXJyKGRldiwgIiVzOiBubyBmaXJtd2FyZSB0byBsb2FkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gdW5sb2NrX211dGV4OwotCX0KLQotCS8qIHByZXZlbnQgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBmcm9tIGJlaW5nIHJlbW92ZWQgKi8KLQlpZiAoIXRyeV9tb2R1bGVfZ2V0KGRldi0+cGFyZW50LT5kcml2ZXItPm93bmVyKSkgewotCQlkZXZfZXJyKGRldiwgIiVzOiBjYW4ndCBnZXQgb3duZXJcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byB1bmxvY2tfbXV0ZXg7Ci0JfQotCiAJLyogc2tpcCB0aGUgYm9vdCBwcm9jZXNzIGlmIHJwcm9jIGlzIGFscmVhZHkgcG93ZXJlZCB1cCAqLwogCWlmIChhdG9taWNfaW5jX3JldHVybigmcnByb2MtPnBvd2VyKSA+IDEpIHsKIAkJcmV0ID0gMDsKQEAgLTEwOTYsMTAgKzEwNTksOCBAQAogCXJlbGVhc2VfZmlybXdhcmUoZmlybXdhcmVfcCk7CiAKIGRvd25yZWZfcnByb2M6Ci0JaWYgKHJldCkgewotCQltb2R1bGVfcHV0KGRldi0+cGFyZW50LT5kcml2ZXItPm93bmVyKTsKKwlpZiAocmV0KQogCQlhdG9taWNfZGVjKCZycHJvYy0+cG93ZXIpOwotCX0KIHVubG9ja19tdXRleDoKIAltdXRleF91bmxvY2soJnJwcm9jLT5sb2NrKTsKIAlyZXR1cm4gcmV0OwpAQCAtMTE3Myw4ICsxMTM0LDEwIEBACiAKIAlycHJvY19kaXNhYmxlX2lvbW11KHJwcm9jKTsKIAotCS8qIEdpdmUgdGhlIG5leHQgc3RhcnQgYSBjbGVhbiByZXNvdXJjZSB0YWJsZSAqLwotCXJwcm9jLT50YWJsZV9wdHIgPSBycHJvYy0+Y2FjaGVkX3RhYmxlOworCS8qIEZyZWUgdGhlIGNvcHkgb2YgdGhlIHJlc291cmNlIHRhYmxlICovCisJa2ZyZWUocnByb2MtPmNhY2hlZF90YWJsZSk7CisJcnByb2MtPmNhY2hlZF90YWJsZSA9IE5VTEw7CisJcnByb2MtPnRhYmxlX3B0ciA9IE5VTEw7CiAKIAkvKiBpZiBpbiBjcmFzaCBzdGF0ZSwgdW5sb2NrIGNyYXNoIGhhbmRsZXIgKi8KIAlpZiAocnByb2MtPnN0YXRlID09IFJQUk9DX0NSQVNIRUQpCkBAIC0xMTg2LDggKzExNDksNiBAQAogCiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZycHJvYy0+bG9jayk7Ci0JaWYgKCFyZXQpCi0JCW1vZHVsZV9wdXQoZGV2LT5wYXJlbnQtPmRyaXZlci0+b3duZXIpOwogfQogRVhQT1JUX1NZTUJPTChycHJvY19zaHV0ZG93bik7CiAKQEAgLTEyMTYsNiArMTE3NywxMiBAQAogCW11dGV4X2xvY2soJnJwcm9jX2xpc3RfbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkociwgJnJwcm9jX2xpc3QsIG5vZGUpIHsKIAkJaWYgKHItPmRldi5wYXJlbnQgJiYgci0+ZGV2LnBhcmVudC0+b2Zfbm9kZSA9PSBucCkgeworCQkJLyogcHJldmVudCB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGZyb20gYmVpbmcgcmVtb3ZlZCAqLworCQkJaWYgKCF0cnlfbW9kdWxlX2dldChyLT5kZXYucGFyZW50LT5kcml2ZXItPm93bmVyKSkgeworCQkJCWRldl9lcnIoJnItPmRldiwgImNhbid0IGdldCBvd25lclxuIik7CisJCQkJYnJlYWs7CisJCQl9CisKIAkJCXJwcm9jID0gcjsKIAkJCWdldF9kZXZpY2UoJnJwcm9jLT5kZXYpOwogCQkJYnJlYWs7CkBAIC0xMzM1LDExICsxMzAyLDExIEBACiAgKiBPbiBzdWNjZXNzIHRoZSBuZXcgcnByb2MgaXMgcmV0dXJuZWQsIGFuZCBvbiBmYWlsdXJlLCBOVUxMLgogICoKICAqIE5vdGU6IF9uZXZlcl8gZGlyZWN0bHkgZGVhbGxvY2F0ZSBAcnByb2MsIGV2ZW4gaWYgaXQgd2FzIG5vdCByZWdpc3RlcmVkCi0gKiB5ZXQuIEluc3RlYWQsIHdoZW4geW91IG5lZWQgdG8gdW5yb2xsIHJwcm9jX2FsbG9jKCksIHVzZSBycHJvY19wdXQoKS4KKyAqIHlldC4gSW5zdGVhZCwgd2hlbiB5b3UgbmVlZCB0byB1bnJvbGwgcnByb2NfYWxsb2MoKSwgdXNlIHJwcm9jX2ZyZWUoKS4KICAqLwogc3RydWN0IHJwcm9jICpycHJvY19hbGxvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJY29uc3Qgc3RydWN0IHJwcm9jX29wcyAqb3BzLAotCQkJCWNvbnN0IGNoYXIgKmZpcm13YXJlLCBpbnQgbGVuKQorCQkJICBjb25zdCBzdHJ1Y3QgcnByb2Nfb3BzICpvcHMsCisJCQkgIGNvbnN0IGNoYXIgKmZpcm13YXJlLCBpbnQgbGVuKQogewogCXN0cnVjdCBycHJvYyAqcnByb2M7CiAJY2hhciAqcCwgKnRlbXBsYXRlID0gInJwcm9jLSVzLWZ3IjsKQEAgLTEzNTksNyArMTMyNiw3IEBACiAJCSAqLwogCQluYW1lX2xlbiA9IHN0cmxlbihuYW1lKSArIHN0cmxlbih0ZW1wbGF0ZSkgLSAyICsgMTsKIAotCXJwcm9jID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJwcm9jKSArIGxlbiArIG5hbWVfbGVuLCBHRlBfS0VSTkVMKTsKKwlycHJvYyA9IGt6YWxsb2Moc2l6ZW9mKCpycHJvYykgKyBsZW4gKyBuYW1lX2xlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFycHJvYykKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTEzNzQsNiArMTM0MSw3IEBACiAJcnByb2MtPm5hbWUgPSBuYW1lOwogCXJwcm9jLT5vcHMgPSBvcHM7CiAJcnByb2MtPnByaXYgPSAmcnByb2NbMV07CisJcnByb2MtPmF1dG9fYm9vdCA9IHRydWU7CiAKIAlkZXZpY2VfaW5pdGlhbGl6ZSgmcnByb2MtPmRldik7CiAJcnByb2MtPmRldi5wYXJlbnQgPSBkZXY7CkBAIC0xNDEzLDcgKzEzODEsMjIgQEAKIEVYUE9SVF9TWU1CT0wocnByb2NfYWxsb2MpOwogCiAvKioKLSAqIHJwcm9jX3B1dCgpIC0gdW5yb2xsIHJwcm9jX2FsbG9jKCkKKyAqIHJwcm9jX2ZyZWUoKSAtIHVucm9sbCBycHJvY19hbGxvYygpCisgKiBAcnByb2M6IHRoZSByZW1vdGUgcHJvY2Vzc29yIGhhbmRsZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gZGVjcmVtZW50cyB0aGUgcnByb2MgZGV2IHJlZmNvdW50LgorICoKKyAqIElmIG5vIG9uZSBob2xkcyBhbnkgcmVmZXJlbmNlIHRvIHJwcm9jIGFueW1vcmUsIHRoZW4gaXRzIHJlZmNvdW50IHdvdWxkCisgKiBub3cgZHJvcCB0byB6ZXJvLCBhbmQgaXQgd291bGQgYmUgZnJlZWQuCisgKi8KK3ZvaWQgcnByb2NfZnJlZShzdHJ1Y3QgcnByb2MgKnJwcm9jKQoreworCXB1dF9kZXZpY2UoJnJwcm9jLT5kZXYpOworfQorRVhQT1JUX1NZTUJPTChycHJvY19mcmVlKTsKKworLyoqCisgKiBycHJvY19wdXQoKSAtIHJlbGVhc2UgcnByb2MgcmVmZXJlbmNlCiAgKiBAcnByb2M6IHRoZSByZW1vdGUgcHJvY2Vzc29yIGhhbmRsZQogICoKICAqIFRoaXMgZnVuY3Rpb24gZGVjcmVtZW50cyB0aGUgcnByb2MgZGV2IHJlZmNvdW50LgpAQCAtMTQyMyw2ICsxNDA2LDcgQEAKICAqLwogdm9pZCBycHJvY19wdXQoc3RydWN0IHJwcm9jICpycHJvYykKIHsKKwltb2R1bGVfcHV0KHJwcm9jLT5kZXYucGFyZW50LT5kcml2ZXItPm93bmVyKTsKIAlwdXRfZGV2aWNlKCZycHJvYy0+ZGV2KTsKIH0KIEVYUE9SVF9TWU1CT0wocnByb2NfcHV0KTsKQEAgLTE0MzgsNyArMTQyMiw3IEBACiAgKgogICogQWZ0ZXIgcnByb2NfZGVsKCkgcmV0dXJucywgQHJwcm9jIGlzbid0IGZyZWVkIHlldCwgYmVjYXVzZQogICogb2YgdGhlIG91dHN0YW5kaW5nIHJlZmVyZW5jZSBjcmVhdGVkIGJ5IHJwcm9jX2FsbG9jLiBUbyBkZWNyZW1lbnQgdGhhdAotICogb25lIGxhc3QgcmVmY291bnQsIG9uZSBzdGlsbCBuZWVkcyB0byBjYWxsIHJwcm9jX3B1dCgpLgorICogb25lIGxhc3QgcmVmY291bnQsIG9uZSBzdGlsbCBuZWVkcyB0byBjYWxsIHJwcm9jX2ZyZWUoKS4KICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgLUVJTlZBTCBpZiBAcnByb2MgaXNuJ3QgdmFsaWQuCiAgKi8KQEAgLTE0NTIsMTMgKzE0MzYsMTUgQEAKIAkvKiBpZiBycHJvYyBpcyBqdXN0IGJlaW5nIHJlZ2lzdGVyZWQsIHdhaXQgKi8KIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZycHJvYy0+ZmlybXdhcmVfbG9hZGluZ19jb21wbGV0ZSk7CiAKKwkvKiBpZiBycHJvYyBpcyBtYXJrZWQgYWx3YXlzLW9uLCBycHJvY19hZGQoKSBib290ZWQgaXQgKi8KKwkvKiBUT0RPOiBtYWtlIHN1cmUgdGhpcyB3b3JrcyB3aXRoIHJwcm9jLT5wb3dlciA+IDEgKi8KKwlpZiAocnByb2MtPmF1dG9fYm9vdCkKKwkJcnByb2Nfc2h1dGRvd24ocnByb2MpOworCiAJLyogY2xlYW4gdXAgcmVtb3RlIHZkZXYgZW50cmllcyAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShydmRldiwgdG1wLCAmcnByb2MtPnJ2ZGV2cywgbm9kZSkKIAkJcnByb2NfcmVtb3ZlX3ZpcnRpb19kZXYocnZkZXYpOwogCi0JLyogRnJlZSB0aGUgY29weSBvZiB0aGUgcmVzb3VyY2UgdGFibGUgKi8KLQlrZnJlZShycHJvYy0+Y2FjaGVkX3RhYmxlKTsKLQogCS8qIHRoZSBycHJvYyBpcyBkb3ducmVmJ2VkIGFzIHNvb24gYXMgaXQncyByZW1vdmVkIGZyb20gdGhlIGtsaXN0ICovCiAJbXV0ZXhfbG9jaygmcnByb2NfbGlzdF9tdXRleCk7CiAJbGlzdF9kZWwoJnJwcm9jLT5ub2RlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVtb3RlcHJvYy9yZW1vdGVwcm9jX2RlYnVnZnMuYyBiL2RyaXZlcnMvcmVtb3RlcHJvYy9yZW1vdGVwcm9jX2RlYnVnZnMuYwppbmRleCA3NGExMjBiLi4zNzQ3OTcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlbW90ZXByb2MvcmVtb3RlcHJvY19kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9yZW1vdGVwcm9jL3JlbW90ZXByb2NfZGVidWdmcy5jCkBAIC00NSw3ICs0NSw3IEBACiAgKiBhcyBpdCBwcm92aWRlcyB2ZXJ5IGVhcmx5IHRyYWNpbmcgd2l0aCBsaXR0bGUgdG8gbm8gZGVwZW5kZW5jaWVzIGF0IGFsbC4KICAqLwogc3RhdGljIHNzaXplX3QgcnByb2NfdHJhY2VfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKnVzZXJidWYsCi0JCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgcnByb2NfbWVtX2VudHJ5ICp0cmFjZSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlpbnQgbGVuID0gc3Rybmxlbih0cmFjZS0+dmEsIHRyYWNlLT5sZW4pOwpAQCAtNzMsNyArNzMsNyBAQAogCiAvKiBleHBvc2UgdGhlIHN0YXRlIG9mIHRoZSByZW1vdGUgcHJvY2Vzc29yIHZpYSBkZWJ1Z2ZzICovCiBzdGF0aWMgc3NpemVfdCBycHJvY19zdGF0ZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKLQkJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQorCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBycHJvYyAqcnByb2MgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgaW50IHN0YXRlOwpAQCAtODMsNyArODMsNyBAQAogCXN0YXRlID0gcnByb2MtPnN0YXRlID4gUlBST0NfTEFTVCA/IFJQUk9DX0xBU1QgOiBycHJvYy0+c3RhdGU7CiAKIAlpID0gc2NucHJpbnRmKGJ1ZiwgMzAsICIlLjI4cyAoJWQpXG4iLCBycHJvY19zdGF0ZV9zdHJpbmdbc3RhdGVdLAotCQkJCQkJCXJwcm9jLT5zdGF0ZSk7CisJCSAgICAgIHJwcm9jLT5zdGF0ZSk7CiAKIAlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgaSk7CiB9CkBAIC0xMzAsNyArMTMwLDcgQEAKIAogLyogZXhwb3NlIHRoZSBuYW1lIG9mIHRoZSByZW1vdGUgcHJvY2Vzc29yIHZpYSBkZWJ1Z2ZzICovCiBzdGF0aWMgc3NpemVfdCBycHJvY19uYW1lX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICp1c2VyYnVmLAotCQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCisJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IHJwcm9jICpycHJvYyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAkvKiBuZWVkIHJvb20gZm9yIHRoZSBuYW1lLCBhIG5ld2xpbmUgYW5kIGEgdGVybWluYXRpbmcgbnVsbCAqLwpAQCAtMjMwLDEyICsyMzAsMTIgQEAKIH0KIAogc3RydWN0IGRlbnRyeSAqcnByb2NfY3JlYXRlX3RyYWNlX2ZpbGUoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHJwcm9jICpycHJvYywKLQkJCQkJc3RydWN0IHJwcm9jX21lbV9lbnRyeSAqdHJhY2UpCisJCQkJICAgICAgIHN0cnVjdCBycHJvY19tZW1fZW50cnkgKnRyYWNlKQogewogCXN0cnVjdCBkZW50cnkgKnRmaWxlOwogCi0JdGZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIDA0MDAsIHJwcm9jLT5kYmdfZGlyLAotCQkJCQkJdHJhY2UsICZ0cmFjZV9ycHJvY19vcHMpOworCXRmaWxlID0gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCAwNDAwLCBycHJvYy0+ZGJnX2RpciwgdHJhY2UsCisJCQkJICAgICZ0cmFjZV9ycHJvY19vcHMpOwogCWlmICghdGZpbGUpIHsKIAkJZGV2X2VycigmcnByb2MtPmRldiwgImZhaWxlZCB0byBjcmVhdGUgZGVidWdmcyB0cmFjZSBlbnRyeVxuIik7CiAJCXJldHVybiBOVUxMOwpAQCAtMjY0LDExICsyNjQsMTEgQEAKIAkJcmV0dXJuOwogCiAJZGVidWdmc19jcmVhdGVfZmlsZSgibmFtZSIsIDA0MDAsIHJwcm9jLT5kYmdfZGlyLAotCQkJCQlycHJvYywgJnJwcm9jX25hbWVfb3BzKTsKKwkJCSAgICBycHJvYywgJnJwcm9jX25hbWVfb3BzKTsKIAlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJzdGF0ZSIsIDA0MDAsIHJwcm9jLT5kYmdfZGlyLAotCQkJCQlycHJvYywgJnJwcm9jX3N0YXRlX29wcyk7CisJCQkgICAgcnByb2MsICZycHJvY19zdGF0ZV9vcHMpOwogCWRlYnVnZnNfY3JlYXRlX2ZpbGUoInJlY292ZXJ5IiwgMDQwMCwgcnByb2MtPmRiZ19kaXIsCi0JCQkJCXJwcm9jLCAmcnByb2NfcmVjb3Zlcnlfb3BzKTsKKwkJCSAgICBycHJvYywgJnJwcm9jX3JlY292ZXJ5X29wcyk7CiB9CiAKIHZvaWQgX19pbml0IHJwcm9jX2luaXRfZGVidWdmcyh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZW1vdGVwcm9jL3JlbW90ZXByb2NfZWxmX2xvYWRlci5jIGIvZHJpdmVycy9yZW1vdGVwcm9jL3JlbW90ZXByb2NfZWxmX2xvYWRlci5jCmluZGV4IGNlMjgzYTUuLmM1MjM5ODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVtb3RlcHJvYy9yZW1vdGVwcm9jX2VsZl9sb2FkZXIuYworKysgYi9kcml2ZXJzL3JlbW90ZXByb2MvcmVtb3RlcHJvY19lbGZfbG9hZGVyLmMKQEAgLTE2NiwxOCArMTY2LDE4IEBACiAJCQljb250aW51ZTsKIAogCQlkZXZfZGJnKGRldiwgInBoZHI6IHR5cGUgJWQgZGEgMHgleCBtZW1zeiAweCV4IGZpbGVzeiAweCV4XG4iLAotCQkJCQlwaGRyLT5wX3R5cGUsIGRhLCBtZW1zeiwgZmlsZXN6KTsKKwkJCXBoZHItPnBfdHlwZSwgZGEsIG1lbXN6LCBmaWxlc3opOwogCiAJCWlmIChmaWxlc3ogPiBtZW1zeikgewogCQkJZGV2X2VycihkZXYsICJiYWQgcGhkciBmaWxlc3ogMHgleCBtZW1zeiAweCV4XG4iLAotCQkJCQkJCWZpbGVzeiwgbWVtc3opOworCQkJCWZpbGVzeiwgbWVtc3opOwogCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWJyZWFrOwogCQl9CiAKIAkJaWYgKG9mZnNldCArIGZpbGVzeiA+IGZ3LT5zaXplKSB7CiAJCQlkZXZfZXJyKGRldiwgInRydW5jYXRlZCBmdzogbmVlZCAweCV4IGF2YWlsIDB4JXp4XG4iLAotCQkJCQlvZmZzZXQgKyBmaWxlc3osIGZ3LT5zaXplKTsKKwkJCQlvZmZzZXQgKyBmaWxlc3osIGZ3LT5zaXplKTsKIAkJCXJldCA9IC1FSU5WQUw7CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZW1vdGVwcm9jL3JlbW90ZXByb2NfaW50ZXJuYWwuaCBiL2RyaXZlcnMvcmVtb3RlcHJvYy9yZW1vdGVwcm9jX2ludGVybmFsLmgKaW5kZXggNTdlMWRlNS4uNGNmOTNjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZW1vdGVwcm9jL3JlbW90ZXByb2NfaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL3JlbW90ZXByb2MvcmVtb3RlcHJvY19pbnRlcm5hbC5oCkBAIC0zNiwxMCArMzYsMTAgQEAKICAqLwogc3RydWN0IHJwcm9jX2Z3X29wcyB7CiAJc3RydWN0IHJlc291cmNlX3RhYmxlICooKmZpbmRfcnNjX3RhYmxlKShzdHJ1Y3QgcnByb2MgKnJwcm9jLAotCQkJCQkJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywKLQkJCQkJCWludCAqdGFibGVzeik7Ci0Jc3RydWN0IHJlc291cmNlX3RhYmxlICooKmZpbmRfbG9hZGVkX3JzY190YWJsZSkoc3RydWN0IHJwcm9jICpycHJvYywKLQkJCQkJCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncpOworCQkJCQkJIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsCisJCQkJCQkgaW50ICp0YWJsZXN6KTsKKwlzdHJ1Y3QgcmVzb3VyY2VfdGFibGUgKigqZmluZF9sb2FkZWRfcnNjX3RhYmxlKSgKKwkJCQlzdHJ1Y3QgcnByb2MgKnJwcm9jLCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3KTsKIAlpbnQgKCpsb2FkKShzdHJ1Y3QgcnByb2MgKnJwcm9jLCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3KTsKIAlpbnQgKCpzYW5pdHlfY2hlY2spKHN0cnVjdCBycHJvYyAqcnByb2MsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncpOwogCXUzMiAoKmdldF9ib290X2FkZHIpKHN0cnVjdCBycHJvYyAqcnByb2MsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncpOwpAQCAtNTcsNyArNTcsNyBAQAogLyogZnJvbSByZW1vdGVwcm9jX2RlYnVnZnMuYyAqLwogdm9pZCBycHJvY19yZW1vdmVfdHJhY2VfZmlsZShzdHJ1Y3QgZGVudHJ5ICp0ZmlsZSk7CiBzdHJ1Y3QgZGVudHJ5ICpycHJvY19jcmVhdGVfdHJhY2VfZmlsZShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgcnByb2MgKnJwcm9jLAotCQkJCQlzdHJ1Y3QgcnByb2NfbWVtX2VudHJ5ICp0cmFjZSk7CisJCQkJICAgICAgIHN0cnVjdCBycHJvY19tZW1fZW50cnkgKnRyYWNlKTsKIHZvaWQgcnByb2NfZGVsZXRlX2RlYnVnX2RpcihzdHJ1Y3QgcnByb2MgKnJwcm9jKTsKIHZvaWQgcnByb2NfY3JlYXRlX2RlYnVnX2RpcihzdHJ1Y3QgcnByb2MgKnJwcm9jKTsKIHZvaWQgcnByb2NfaW5pdF9kZWJ1Z2ZzKHZvaWQpOwpAQCAtOTgsNyArOTgsOCBAQAogCiBzdGF0aWMgaW5saW5lCiBzdHJ1Y3QgcmVzb3VyY2VfdGFibGUgKnJwcm9jX2ZpbmRfcnNjX3RhYmxlKHN0cnVjdCBycHJvYyAqcnByb2MsCi0JCQkJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywgaW50ICp0YWJsZXN6KQorCQkJCQkgICAgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywKKwkJCQkJICAgIGludCAqdGFibGVzeikKIHsKIAlpZiAocnByb2MtPmZ3X29wcy0+ZmluZF9yc2NfdGFibGUpCiAJCXJldHVybiBycHJvYy0+Zndfb3BzLT5maW5kX3JzY190YWJsZShycHJvYywgZncsIHRhYmxlc3opOwpAQCAtMTA4LDcgKzEwOSw3IEBACiAKIHN0YXRpYyBpbmxpbmUKIHN0cnVjdCByZXNvdXJjZV90YWJsZSAqcnByb2NfZmluZF9sb2FkZWRfcnNjX3RhYmxlKHN0cnVjdCBycHJvYyAqcnByb2MsCi0JCQkJCQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3KQorCQkJCQkJICAgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdykKIHsKIAlpZiAocnByb2MtPmZ3X29wcy0+ZmluZF9sb2FkZWRfcnNjX3RhYmxlKQogCQlyZXR1cm4gcnByb2MtPmZ3X29wcy0+ZmluZF9sb2FkZWRfcnNjX3RhYmxlKHJwcm9jLCBmdyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlbW90ZXByb2MvcmVtb3RlcHJvY192aXJ0aW8uYyBiL2RyaXZlcnMvcmVtb3RlcHJvYy9yZW1vdGVwcm9jX3ZpcnRpby5jCmluZGV4IGNjOTE1NTYuLjAxODcwYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVtb3RlcHJvYy9yZW1vdGVwcm9jX3ZpcnRpby5jCisrKyBiL2RyaXZlcnMvcmVtb3RlcHJvYy9yZW1vdGVwcm9jX3ZpcnRpby5jCkBAIC02OSw3ICs2OSw3IEBACiBFWFBPUlRfU1lNQk9MKHJwcm9jX3ZxX2ludGVycnVwdCk7CiAKIHN0YXRpYyBzdHJ1Y3QgdmlydHF1ZXVlICpycF9maW5kX3ZxKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2LAotCQkJCSAgICB1bnNpZ25lZCBpZCwKKwkJCQkgICAgdW5zaWduZWQgaW50IGlkLAogCQkJCSAgICB2b2lkICgqY2FsbGJhY2spKHN0cnVjdCB2aXJ0cXVldWUgKnZxKSwKIAkJCQkgICAgY29uc3QgY2hhciAqbmFtZSkKIHsKQEAgLTEwMSwxNCArMTAxLDE0IEBACiAJbWVtc2V0KGFkZHIsIDAsIHNpemUpOwogCiAJZGV2X2RiZyhkZXYsICJ2cmluZyVkOiB2YSAlcCBxc3ogJWQgbm90aWZ5aWQgJWRcbiIsCi0JCQkJCWlkLCBhZGRyLCBsZW4sIHJ2cmluZy0+bm90aWZ5aWQpOworCQlpZCwgYWRkciwgbGVuLCBydnJpbmctPm5vdGlmeWlkKTsKIAogCS8qCiAJICogQ3JlYXRlIHRoZSBuZXcgdnEsIGFuZCB0ZWxsIHZpcnRpbyB3ZSdyZSBub3QgaW50ZXJlc3RlZCBpbgogCSAqIHRoZSAnd2Vhaycgc21wIGJhcnJpZXJzLCBzaW5jZSB3ZSdyZSB0YWxraW5nIHdpdGggYSByZWFsIGRldmljZS4KIAkgKi8KIAl2cSA9IHZyaW5nX25ld192aXJ0cXVldWUoaWQsIGxlbiwgcnZyaW5nLT5hbGlnbiwgdmRldiwgZmFsc2UsIGFkZHIsCi0JCQkJCXJwcm9jX3ZpcnRpb19ub3RpZnksIGNhbGxiYWNrLCBuYW1lKTsKKwkJCQkgcnByb2NfdmlydGlvX25vdGlmeSwgY2FsbGJhY2ssIG5hbWUpOwogCWlmICghdnEpIHsKIAkJZGV2X2VycihkZXYsICJ2cmluZ19uZXdfdmlydHF1ZXVlICVzIGZhaWxlZFxuIiwgbmFtZSk7CiAJCXJwcm9jX2ZyZWVfdnJpbmcocnZyaW5nKTsKQEAgLTEzNiwyMCArMTM2LDE0IEBACiAKIHN0YXRpYyB2b2lkIHJwcm9jX3ZpcnRpb19kZWxfdnFzKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2KQogewotCXN0cnVjdCBycHJvYyAqcnByb2MgPSB2ZGV2X3RvX3Jwcm9jKHZkZXYpOwotCi0JLyogcG93ZXIgZG93biB0aGUgcmVtb3RlIHByb2Nlc3NvciBiZWZvcmUgZGVsZXRpbmcgdnFzICovCi0JcnByb2Nfc2h1dGRvd24ocnByb2MpOwotCiAJX19ycHJvY192aXJ0aW9fZGVsX3Zxcyh2ZGV2KTsKIH0KIAotc3RhdGljIGludCBycHJvY192aXJ0aW9fZmluZF92cXMoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYsIHVuc2lnbmVkIG52cXMsCi0JCSAgICAgICBzdHJ1Y3QgdmlydHF1ZXVlICp2cXNbXSwKLQkJICAgICAgIHZxX2NhbGxiYWNrX3QgKmNhbGxiYWNrc1tdLAotCQkgICAgICAgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzW10pCitzdGF0aWMgaW50IHJwcm9jX3ZpcnRpb19maW5kX3ZxcyhzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldiwgdW5zaWduZWQgaW50IG52cXMsCisJCQkJIHN0cnVjdCB2aXJ0cXVldWUgKnZxc1tdLAorCQkJCSB2cV9jYWxsYmFja190ICpjYWxsYmFja3NbXSwKKwkJCQkgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzW10pCiB7Ci0Jc3RydWN0IHJwcm9jICpycHJvYyA9IHZkZXZfdG9fcnByb2ModmRldik7CiAJaW50IGksIHJldDsKIAogCWZvciAoaSA9IDA7IGkgPCBudnFzOyArK2kpIHsKQEAgLTE2MCwxMyArMTU0LDYgQEAKIAkJfQogCX0KIAotCS8qIG5vdyB0aGF0IHRoZSB2cXMgYXJlIGFsbCBzZXQsIGJvb3QgdGhlIHJlbW90ZSBwcm9jZXNzb3IgKi8KLQlyZXQgPSBycHJvY19ib290X25vd2FpdChycHJvYyk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZycHJvYy0+ZGV2LCAicnByb2NfYm9vdCgpIGZhaWxlZCAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KIAlyZXR1cm4gMDsKIAogZXJyb3I6CkBAIC0yMzksOCArMjI2LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcnByb2NfdmlydGlvX2dldChzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldiwgdW5zaWduZWQgb2Zmc2V0LAotCQkJCQkJCXZvaWQgKmJ1ZiwgdW5zaWduZWQgbGVuKQorc3RhdGljIHZvaWQgcnByb2NfdmlydGlvX2dldChzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldiwgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJCSAgICAgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCXN0cnVjdCBycHJvY192ZGV2ICpydmRldiA9IHZkZXZfdG9fcnZkZXYodmRldik7CiAJc3RydWN0IGZ3X3JzY192ZGV2ICpyc2M7CkBAIC0yNTcsOCArMjQ0LDggQEAKIAltZW1jcHkoYnVmLCBjZmcgKyBvZmZzZXQsIGxlbik7CiB9CiAKLXN0YXRpYyB2b2lkIHJwcm9jX3ZpcnRpb19zZXQoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYsIHVuc2lnbmVkIG9mZnNldCwKLQkJICAgICAgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsZW4pCitzdGF0aWMgdm9pZCBycHJvY192aXJ0aW9fc2V0KHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2LCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkJICAgICBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJc3RydWN0IHJwcm9jX3ZkZXYgKnJ2ZGV2ID0gdmRldl90b19ydmRldih2ZGV2KTsKIAlzdHJ1Y3QgZndfcnNjX3ZkZXYgKnJzYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVtb3RlcHJvYy9zdF9yZW1vdGVwcm9jLmMgYi9kcml2ZXJzL3JlbW90ZXByb2Mvc3RfcmVtb3RlcHJvYy5jCmluZGV4IDZmMDU2Y2EuLmFlODk2M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVtb3RlcHJvYy9zdF9yZW1vdGVwcm9jLmMKKysrIGIvZHJpdmVycy9yZW1vdGVwcm9jL3N0X3JlbW90ZXByb2MuYwpAQCAtMjYyLDcgKzI2Miw3IEBACiAJcmV0dXJuIDA7CiAKIGZyZWVfcnByb2M6Ci0JcnByb2NfcHV0KHJwcm9jKTsKKwlycHJvY19mcmVlKHJwcm9jKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yNzcsNyArMjc3LDcgQEAKIAogCW9mX3Jlc2VydmVkX21lbV9kZXZpY2VfcmVsZWFzZSgmcGRldi0+ZGV2KTsKIAotCXJwcm9jX3B1dChycHJvYyk7CisJcnByb2NfZnJlZShycHJvYyk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVtb3RlcHJvYy9zdGVfbW9kZW1fcnByb2MuYyBiL2RyaXZlcnMvcmVtb3RlcHJvYy9zdGVfbW9kZW1fcnByb2MuYwppbmRleCA1M2RjMTdiLi4wM2Q2OWE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlbW90ZXByb2Mvc3RlX21vZGVtX3Jwcm9jLmMKKysrIGIvZHJpdmVycy9yZW1vdGVwcm9jL3N0ZV9tb2RlbV9ycHJvYy5jCkBAIC0yNTcsNyArMjU3LDcgQEAKIAlycHJvY19kZWwoc3Byb2MtPnJwcm9jKTsKIAlkbWFfZnJlZV9jb2hlcmVudChzcHJvYy0+cnByb2MtPmRldi5wYXJlbnQsIFNQUk9DX0ZXX1NJWkUsCiAJCQkgIHNwcm9jLT5md19hZGRyLCBzcHJvYy0+ZndfZG1hX2FkZHIpOwotCXJwcm9jX3B1dChzcHJvYy0+cnByb2MpOworCXJwcm9jX2ZyZWUoc3Byb2MtPnJwcm9jKTsKIAogCW1kZXYtPmRydl9kYXRhID0gTlVMTDsKIApAQCAtMzI1LDcgKzMyNSw3IEBACiBmcmVlX3Jwcm9jOgogCS8qIFJlc2V0IGRldmljZSBkYXRhIHVwb24gZXJyb3IgKi8KIAltZGV2LT5kcnZfZGF0YSA9IE5VTEw7Ci0JcnByb2NfcHV0KHJwcm9jKTsKKwlycHJvY19mcmVlKHJwcm9jKTsKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlbW90ZXByb2Mvd2t1cF9tM19ycHJvYy5jIGIvZHJpdmVycy9yZW1vdGVwcm9jL3drdXBfbTNfcnByb2MuYwppbmRleCAwMmQyNzFkLi4xODE3NWQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlbW90ZXByb2Mvd2t1cF9tM19ycHJvYy5jCisrKyBiL2RyaXZlcnMvcmVtb3RlcHJvYy93a3VwX20zX3Jwcm9jLmMKQEAgLTE2Nyw2ICsxNjcsOCBAQAogCQlnb3RvIGVycjsKIAl9CiAKKwlycHJvYy0+YXV0b19ib290ID0gZmFsc2U7CisKIAl3a3VwbTMgPSBycHJvYy0+cHJpdjsKIAl3a3VwbTMtPnJwcm9jID0gcnByb2M7CiAJd2t1cG0zLT5wZGV2ID0gcGRldjsKQEAgLTIwNiw3ICsyMDgsNyBAQAogCXJldHVybiAwOwogCiBlcnJfcHV0X3Jwcm9jOgotCXJwcm9jX3B1dChycHJvYyk7CisJcnByb2NfZnJlZShycHJvYyk7CiBlcnI6CiAJcG1fcnVudGltZV9wdXRfbm9pZGxlKGRldik7CiAJcG1fcnVudGltZV9kaXNhYmxlKGRldik7CkBAIC0yMTgsNyArMjIwLDcgQEAKIAlzdHJ1Y3QgcnByb2MgKnJwcm9jID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKIAlycHJvY19kZWwocnByb2MpOwotCXJwcm9jX3B1dChycHJvYyk7CisJcnByb2NfZnJlZShycHJvYyk7CiAJcG1fcnVudGltZV9wdXRfc3luYygmcGRldi0+ZGV2KTsKIAlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnBtc2cvS2NvbmZpZyBiL2RyaXZlcnMvcnBtc2cvS2NvbmZpZwppbmRleCA2OWEyMTkzLi5kZTMxYzVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JwbXNnL0tjb25maWcKKysrIGIvZHJpdmVycy9ycG1zZy9LY29uZmlnCkBAIC0zLDYgKzMsMjAgQEAKICMgUlBNU0cgYWx3YXlzIGdldHMgc2VsZWN0ZWQgYnkgd2hvZXZlciB3YW50cyBpdAogY29uZmlnIFJQTVNHCiAJdHJpc3RhdGUKKworY29uZmlnIFJQTVNHX1FDT01fU01ECisJdHJpc3RhdGUgIlF1YWxjb21tIFNoYXJlZCBNZW1vcnkgRHJpdmVyIChTTUQpIgorCWRlcGVuZHMgb24gUUNPTV9TTUVNCisJZGVwZW5kcyBvbiBRQ09NX1NNRD1uCisJc2VsZWN0IFJQTVNHCisJaGVscAorCSAgU2F5IHkgaGVyZSB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIFF1YWxjb21tIFNoYXJlZCBNZW1vcnkgRHJpdmVyCisJICBwcm92aWRpbmcgY29tbXVuaWNhdGlvbiBjaGFubmVscyB0byByZW1vdGUgcHJvY2Vzc29ycyBpbiBRdWFsY29tbQorCSAgcGxhdGZvcm1zLgorCitjb25maWcgUlBNU0dfVklSVElPCisJdHJpc3RhdGUKKwlzZWxlY3QgUlBNU0cKIAlzZWxlY3QgVklSVElPCiAJc2VsZWN0IFZJUlRVQUxJWkFUSU9OCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnBtc2cvTWFrZWZpbGUgYi9kcml2ZXJzL3JwbXNnL01ha2VmaWxlCmluZGV4IDc2MTdmY2IuLmFlOWM5MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnBtc2cvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ycG1zZy9NYWtlZmlsZQpAQCAtMSArMSwzIEBACi1vYmotJChDT05GSUdfUlBNU0cpCSs9IHZpcnRpb19ycG1zZ19idXMubworb2JqLSQoQ09ORklHX1JQTVNHKQkJKz0gcnBtc2dfY29yZS5vCitvYmotJChDT05GSUdfUlBNU0dfUUNPTV9TTUQpCSs9IHFjb21fc21kLm8KK29iai0kKENPTkZJR19SUE1TR19WSVJUSU8pCSs9IHZpcnRpb19ycG1zZ19idXMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ycG1zZy9xY29tX3NtZC5jIGIvZHJpdmVycy9ycG1zZy9xY29tX3NtZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZmVmMmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3JwbXNnL3Fjb21fc21kLmMKQEAgLTAsMCArMSwxNDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCBTb255IE1vYmlsZSBDb21tdW5pY2F0aW9ucyBBQi4KKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9zeXNjb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvYy9xY29tL3NtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvcnBtc2cuaD4KKworI2luY2x1ZGUgInJwbXNnX2ludGVybmFsLmgiCisKKy8qCisgKiBUaGUgUXVhbGNvbW0gU2hhcmVkIE1lbW9yeSBjb21tdW5pY2F0aW9uIHNvbHV0aW9uIHByb3ZpZGVzIHBvaW50LXRvLXBvaW50CisgKiBjaGFubmVscyBmb3IgY2xpZW50cyB0byBzZW5kIGFuZCByZWNlaXZlIHN0cmVhbWluZyBvciBwYWNrZXQgYmFzZWQgZGF0YS4KKyAqCisgKiBFYWNoIGNoYW5uZWwgY29uc2lzdHMgb2YgYSBjb250cm9sIGl0ZW0gKGNoYW5uZWwgaW5mbykgYW5kIGEgcmluZyBidWZmZXIKKyAqIHBhaXIuIFRoZSBjaGFubmVsIGluZm8gY2FycnkgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBjaGFubmVsIHN0YXRlLCBmbG93CisgKiBjb250cm9sIGFuZCB0aGUgb2Zmc2V0cyB3aXRoaW4gdGhlIHJpbmcgYnVmZmVyLgorICoKKyAqIEFsbCBhbGxvY2F0ZWQgY2hhbm5lbHMgYXJlIGxpc3RlZCBpbiBhbiBhbGxvY2F0aW9uIHRhYmxlLCBpZGVudGlmeWluZyB0aGUKKyAqIHBhaXIgb2YgaXRlbXMgYnkgbmFtZSwgdHlwZSBhbmQgcmVtb3RlIHByb2Nlc3Nvci4KKyAqCisgKiBVcG9uIGNyZWF0aW5nIGEgbmV3IGNoYW5uZWwgdGhlIHJlbW90ZSBwcm9jZXNzb3IgYWxsb2NhdGVzIGNoYW5uZWwgaW5mbyBhbmQKKyAqIHJpbmcgYnVmZmVyIGl0ZW1zIGZyb20gdGhlIHNtZW0gaGVhcCBhbmQgcG9wdWxhdGUgdGhlIGFsbG9jYXRpb24gdGFibGUuIEFuCisgKiBpbnRlcnJ1cHQgaXMgc2VudCB0byB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjaGFubmVsIGFuZCBhIHNjYW4gZm9yIG5ldworICogY2hhbm5lbHMgc2hvdWxkIGJlIGRvbmUuIEEgY2hhbm5lbCBuZXZlciBnb2VzIGF3YXksIGl0IHdpbGwgb25seSBjaGFuZ2UKKyAqIHN0YXRlLgorICoKKyAqIFRoZSByZW1vdGUgcHJvY2Vzc29yIHNpZ25hbHMgaXQgaW50ZW50IGZvciBicmluZyB1cCB0aGUgY29tbXVuaWNhdGlvbgorICogY2hhbm5lbCBieSBzZXR0aW5nIHRoZSBzdGF0ZSBvZiBpdHMgZW5kIG9mIHRoZSBjaGFubmVsIHRvICJvcGVuaW5nIiBhbmQKKyAqIHNlbmRzIG91dCBhbiBpbnRlcnJ1cHQuIFdlIGRldGVjdCB0aGlzIGNoYW5nZSBhbmQgcmVnaXN0ZXIgYSBzbWQgZGV2aWNlIHRvCisgKiBjb25zdW1lIHRoZSBjaGFubmVsLiBVcG9uIGZpbmRpbmcgYSBjb25zdW1lciB3ZSBmaW5pc2ggdGhlIGhhbmRzaGFrZSBhbmQgdGhlCisgKiBjaGFubmVsIGlzIHVwLgorICoKKyAqIFVwb24gY2xvc2luZyBhIGNoYW5uZWwsIHRoZSByZW1vdGUgcHJvY2Vzc29yIHdpbGwgdXBkYXRlIHRoZSBzdGF0ZSBvZiBpdHMKKyAqIGVuZCBvZiB0aGUgY2hhbm5lbCBhbmQgc2lnbmFsIHVzLCB3ZSB3aWxsIHRoZW4gdW5yZWdpc3RlciBhbnkgYXR0YWNoZWQKKyAqIGRldmljZSBhbmQgY2xvc2Ugb3VyIGVuZCBvZiB0aGUgY2hhbm5lbC4KKyAqCisgKiBEZXZpY2VzIGF0dGFjaGVkIHRvIGEgY2hhbm5lbCBjYW4gdXNlIHRoZSBxY29tX3NtZF9zZW5kIGZ1bmN0aW9uIHRvIHB1c2gKKyAqIGRhdGEgdG8gdGhlIGNoYW5uZWwsIHRoaXMgaXMgZG9uZSBieSBjb3B5aW5nIHRoZSBkYXRhIGludG8gdGhlIHR4IHJpbmcKKyAqIGJ1ZmZlciwgdXBkYXRpbmcgdGhlIHBvaW50ZXJzIGluIHRoZSBjaGFubmVsIGluZm8gYW5kIHNpZ25hbGluZyB0aGUgcmVtb3RlCisgKiBwcm9jZXNzb3IuCisgKgorICogVGhlIHJlbW90ZSBwcm9jZXNzb3IgZG9lcyB0aGUgZXF1aXZhbGVudCB3aGVuIGl0IHRyYW5zZmVyIGRhdGEgYW5kIHVwb24KKyAqIHJlY2VpdmluZyB0aGUgaW50ZXJydXB0IHdlIGNoZWNrIHRoZSBjaGFubmVsIGluZm8gZm9yIG5ldyBkYXRhIGFuZCBkZWxpdmVycworICogdGhpcyB0byB0aGUgYXR0YWNoZWQgZGV2aWNlLiBJZiB0aGUgZGV2aWNlIGlzIG5vdCByZWFkeSB0byByZWNlaXZlIHRoZSBkYXRhCisgKiB3ZSBsZWF2ZSBpdCBpbiB0aGUgcmluZyBidWZmZXIgZm9yIG5vdy4KKyAqLworCitzdHJ1Y3Qgc21kX2NoYW5uZWxfaW5mbzsKK3N0cnVjdCBzbWRfY2hhbm5lbF9pbmZvX3BhaXI7CitzdHJ1Y3Qgc21kX2NoYW5uZWxfaW5mb193b3JkOworc3RydWN0IHNtZF9jaGFubmVsX2luZm9fd29yZF9wYWlyOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJwbXNnX2VuZHBvaW50X29wcyBxY29tX3NtZF9lbmRwb2ludF9vcHM7CisKKyNkZWZpbmUgU01EX0FMTE9DX1RCTF9DT1VOVAkyCisjZGVmaW5lIFNNRF9BTExPQ19UQkxfU0laRQk2NAorCisvKgorICogVGhpcyBsaXN0cyB0aGUgdmFyaW91cyBzbWVtIGhlYXAgaXRlbXMgcmVsZXZhbnQgZm9yIHRoZSBhbGxvY2F0aW9uIHRhYmxlIGFuZAorICogc21kIGNoYW5uZWwgZW50cmllcy4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJdW5zaWduZWQgYWxsb2NfdGJsX2lkOworCXVuc2lnbmVkIGluZm9fYmFzZV9pZDsKKwl1bnNpZ25lZCBmaWZvX2Jhc2VfaWQ7Cit9IHNtZW1faXRlbXNbU01EX0FMTE9DX1RCTF9DT1VOVF0gPSB7CisJeworCQkuYWxsb2NfdGJsX2lkID0gMTMsCisJCS5pbmZvX2Jhc2VfaWQgPSAxNCwKKwkJLmZpZm9fYmFzZV9pZCA9IDMzOAorCX0sCisJeworCQkuYWxsb2NfdGJsX2lkID0gMjY2LAorCQkuaW5mb19iYXNlX2lkID0gMTM4LAorCQkuZmlmb19iYXNlX2lkID0gMjAyLAorCX0sCit9OworCisvKioKKyAqIHN0cnVjdCBxY29tX3NtZF9lZGdlIC0gcmVwcmVzZW50aW5nIGEgcmVtb3RlIHByb2Nlc3NvcgorICogQG9mX25vZGU6CQlvZl9ub2RlIGhhbmRsZSBmb3IgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGlzIGVkZ2UKKyAqIEBlZGdlX2lkOgkJaWRlbnRpZmllciBvZiB0aGlzIGVkZ2UKKyAqIEByZW1vdGVfcGlkOgkJaWRlbnRpZmllciBvZiByZW1vdGUgcHJvY2Vzc29yCisgKiBAaXJxOgkJaW50ZXJydXB0IGZvciBzaWduYWxzIG9uIHRoaXMgZWRnZQorICogQGlwY19yZWdtYXA6CQlyZWdtYXAgaGFuZGxlIGhvbGRpbmcgdGhlIG91dGdvaW5nIGlwYyByZWdpc3RlcgorICogQGlwY19vZmZzZXQ6CQlvZmZzZXQgd2l0aGluIEBpcGNfcmVnbWFwIG9mIHRoZSByZWdpc3RlciBmb3IgaXBjCisgKiBAaXBjX2JpdDoJCWJpdCBpbiB0aGUgcmVnaXN0ZXIgYXQgQGlwY19vZmZzZXQgb2YgQGlwY19yZWdtYXAKKyAqIEBjaGFubmVsczoJCWxpc3Qgb2YgYWxsIGNoYW5uZWxzIGRldGVjdGVkIG9uIHRoaXMgZWRnZQorICogQGNoYW5uZWxzX2xvY2s6CWd1YXJkIGZvciBtb2RpZmljYXRpb25zIG9mIEBjaGFubmVscworICogQGFsbG9jYXRlZDoJCWFycmF5IG9mIGJpdG1hcHMgcmVwcmVzZW50aW5nIGFscmVhZHkgYWxsb2NhdGVkIGNoYW5uZWxzCisgKiBAc21lbV9hdmFpbGFibGU6CWxhc3QgYXZhaWxhYmxlIGFtb3VudCBvZiBzbWVtIHRyaWdnZXJpbmcgYSBjaGFubmVsIHNjYW4KKyAqIEBzY2FuX3dvcms6CQl3b3JrIGl0ZW0gZm9yIGRpc2NvdmVyaW5nIG5ldyBjaGFubmVscworICogQHN0YXRlX3dvcms6CQl3b3JrIGl0ZW0gZm9yIGVkZ2Ugc3RhdGUgY2hhbmdlcworICovCitzdHJ1Y3QgcWNvbV9zbWRfZWRnZSB7CisJc3RydWN0IGRldmljZSBkZXY7CisKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGU7CisJdW5zaWduZWQgZWRnZV9pZDsKKwl1bnNpZ25lZCByZW1vdGVfcGlkOworCisJaW50IGlycTsKKworCXN0cnVjdCByZWdtYXAgKmlwY19yZWdtYXA7CisJaW50IGlwY19vZmZzZXQ7CisJaW50IGlwY19iaXQ7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNoYW5uZWxzOworCXNwaW5sb2NrX3QgY2hhbm5lbHNfbG9jazsKKworCURFQ0xBUkVfQklUTUFQKGFsbG9jYXRlZFtTTURfQUxMT0NfVEJMX0NPVU5UXSwgU01EX0FMTE9DX1RCTF9TSVpFKTsKKworCXVuc2lnbmVkIHNtZW1fYXZhaWxhYmxlOworCisJd2FpdF9xdWV1ZV9oZWFkX3QgbmV3X2NoYW5uZWxfZXZlbnQ7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc2Nhbl93b3JrOworCXN0cnVjdCB3b3JrX3N0cnVjdCBzdGF0ZV93b3JrOworfTsKKworLyoKKyAqIFNNRCBjaGFubmVsIHN0YXRlcy4KKyAqLworZW51bSBzbWRfY2hhbm5lbF9zdGF0ZSB7CisJU01EX0NIQU5ORUxfQ0xPU0VELAorCVNNRF9DSEFOTkVMX09QRU5JTkcsCisJU01EX0NIQU5ORUxfT1BFTkVELAorCVNNRF9DSEFOTkVMX0ZMVVNISU5HLAorCVNNRF9DSEFOTkVMX0NMT1NJTkcsCisJU01EX0NIQU5ORUxfUkVTRVQsCisJU01EX0NIQU5ORUxfUkVTRVRfT1BFTklORworfTsKKworc3RydWN0IHFjb21fc21kX2RldmljZSB7CisJc3RydWN0IHJwbXNnX2RldmljZSBycGRldjsKKworCXN0cnVjdCBxY29tX3NtZF9lZGdlICplZGdlOworfTsKKworc3RydWN0IHFjb21fc21kX2VuZHBvaW50IHsKKwlzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgZXB0OworCisJc3RydWN0IHFjb21fc21kX2NoYW5uZWwgKnFzY2g7Cit9OworCisjZGVmaW5lIHRvX3NtZF9kZXZpY2UoX3JwZGV2KQljb250YWluZXJfb2YoX3JwZGV2LCBzdHJ1Y3QgcWNvbV9zbWRfZGV2aWNlLCBycGRldikKKyNkZWZpbmUgdG9fc21kX2VkZ2UoZCkJCWNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgcWNvbV9zbWRfZWRnZSwgZGV2KQorI2RlZmluZSB0b19zbWRfZW5kcG9pbnQoZXB0KQljb250YWluZXJfb2YoZXB0LCBzdHJ1Y3QgcWNvbV9zbWRfZW5kcG9pbnQsIGVwdCkKKworLyoqCisgKiBzdHJ1Y3QgcWNvbV9zbWRfY2hhbm5lbCAtIHNtZCBjaGFubmVsIHN0cnVjdAorICogQGVkZ2U6CQlxY29tX3NtZF9lZGdlIHRoaXMgY2hhbm5lbCBpcyBsaXZpbmcgb24KKyAqIEBxc2RldjoJCXJlZmVyZW5jZSB0byBhIGFzc29jaWF0ZWQgc21kIGNsaWVudCBkZXZpY2UKKyAqIEBuYW1lOgkJbmFtZSBvZiB0aGUgY2hhbm5lbAorICogQHN0YXRlOgkJbG9jYWwgc3RhdGUgb2YgdGhlIGNoYW5uZWwKKyAqIEByZW1vdGVfc3RhdGU6CXJlbW90ZSBzdGF0ZSBvZiB0aGUgY2hhbm5lbAorICogQGluZm86CQlieXRlIGFsaWduZWQgb3V0Z29pbmcvaW5jb21pbmcgY2hhbm5lbCBpbmZvCisgKiBAaW5mb193b3JkOgkJd29yZCBhbGlnbmVkIG91dGdvaW5nL2luY29taW5nIGNoYW5uZWwgaW5mbworICogQHR4X2xvY2s6CQlsb2NrIHRvIG1ha2Ugd3JpdGVzIHRvIHRoZSBjaGFubmVsIG11dHVhbGx5IGV4Y2x1c2l2ZQorICogQGZibG9ja3JlYWRfZXZlbnQ6CXdha2V1cCBldmVudCB0aWVkIHRvIHR4IGZCTE9DS1JFQURJTlRSCisgKiBAdHhfZmlmbzoJCXBvaW50ZXIgdG8gdGhlIG91dGdvaW5nIHJpbmcgYnVmZmVyCisgKiBAcnhfZmlmbzoJCXBvaW50ZXIgdG8gdGhlIGluY29taW5nIHJpbmcgYnVmZmVyCisgKiBAZmlmb19zaXplOgkJc2l6ZSBvZiBlYWNoIHJpbmcgYnVmZmVyCisgKiBAYm91bmNlX2J1ZmZlcjoJYm91bmNlIGJ1ZmZlciBmb3IgcmVhZGluZyB3cmFwcGVkIHBhY2tldHMKKyAqIEBjYjoJCQljYWxsYmFjayBmdW5jdGlvbiByZWdpc3RlcmVkIGZvciB0aGlzIGNoYW5uZWwKKyAqIEByZWN2X2xvY2s6CQlndWFyZCBmb3IgcnggaW5mbyBtb2RpZmljYXRpb25zIGFuZCBjYiBwb2ludGVyCisgKiBAcGt0X3NpemU6CQlzaXplIG9mIHRoZSBjdXJyZW50bHkgaGFuZGxlZCBwYWNrZXQKKyAqIEBsaXN0OgkJbGl0ZSBlbnRyeSBmb3IgQGNoYW5uZWxzIGluIHFjb21fc21kX2VkZ2UKKyAqLworc3RydWN0IHFjb21fc21kX2NoYW5uZWwgeworCXN0cnVjdCBxY29tX3NtZF9lZGdlICplZGdlOworCisJc3RydWN0IHFjb21fc21kX2VuZHBvaW50ICpxc2VwdDsKKwlib29sIHJlZ2lzdGVyZWQ7CisKKwljaGFyICpuYW1lOworCWVudW0gc21kX2NoYW5uZWxfc3RhdGUgc3RhdGU7CisJZW51bSBzbWRfY2hhbm5lbF9zdGF0ZSByZW1vdGVfc3RhdGU7CisKKwlzdHJ1Y3Qgc21kX2NoYW5uZWxfaW5mb19wYWlyICppbmZvOworCXN0cnVjdCBzbWRfY2hhbm5lbF9pbmZvX3dvcmRfcGFpciAqaW5mb193b3JkOworCisJc3RydWN0IG11dGV4IHR4X2xvY2s7CisJd2FpdF9xdWV1ZV9oZWFkX3QgZmJsb2NrcmVhZF9ldmVudDsKKworCXZvaWQgKnR4X2ZpZm87CisJdm9pZCAqcnhfZmlmbzsKKwlpbnQgZmlmb19zaXplOworCisJdm9pZCAqYm91bmNlX2J1ZmZlcjsKKworCXNwaW5sb2NrX3QgcmVjdl9sb2NrOworCisJaW50IHBrdF9zaXplOworCisJdm9pZCAqZHJ2ZGF0YTsKKworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKKy8qCisgKiBGb3JtYXQgb2YgdGhlIHNtZF9pbmZvIHNtZW0gaXRlbXMsIGZvciBieXRlIGFsaWduZWQgY2hhbm5lbHMuCisgKi8KK3N0cnVjdCBzbWRfY2hhbm5lbF9pbmZvIHsKKwlfX2xlMzIgc3RhdGU7CisJdTggIGZEU1I7CisJdTggIGZDVFM7CisJdTggIGZDRDsKKwl1OCAgZlJJOworCXU4ICBmSEVBRDsKKwl1OCAgZlRBSUw7CisJdTggIGZTVEFURTsKKwl1OCAgZkJMT0NLUkVBRElOVFI7CisJX19sZTMyIHRhaWw7CisJX19sZTMyIGhlYWQ7Cit9OworCitzdHJ1Y3Qgc21kX2NoYW5uZWxfaW5mb19wYWlyIHsKKwlzdHJ1Y3Qgc21kX2NoYW5uZWxfaW5mbyB0eDsKKwlzdHJ1Y3Qgc21kX2NoYW5uZWxfaW5mbyByeDsKK307CisKKy8qCisgKiBGb3JtYXQgb2YgdGhlIHNtZF9pbmZvIHNtZW0gaXRlbXMsIGZvciB3b3JkIGFsaWduZWQgY2hhbm5lbHMuCisgKi8KK3N0cnVjdCBzbWRfY2hhbm5lbF9pbmZvX3dvcmQgeworCV9fbGUzMiBzdGF0ZTsKKwlfX2xlMzIgZkRTUjsKKwlfX2xlMzIgZkNUUzsKKwlfX2xlMzIgZkNEOworCV9fbGUzMiBmUkk7CisJX19sZTMyIGZIRUFEOworCV9fbGUzMiBmVEFJTDsKKwlfX2xlMzIgZlNUQVRFOworCV9fbGUzMiBmQkxPQ0tSRUFESU5UUjsKKwlfX2xlMzIgdGFpbDsKKwlfX2xlMzIgaGVhZDsKK307CisKK3N0cnVjdCBzbWRfY2hhbm5lbF9pbmZvX3dvcmRfcGFpciB7CisJc3RydWN0IHNtZF9jaGFubmVsX2luZm9fd29yZCB0eDsKKwlzdHJ1Y3Qgc21kX2NoYW5uZWxfaW5mb193b3JkIHJ4OworfTsKKworI2RlZmluZSBHRVRfUlhfQ0hBTk5FTF9GTEFHKGNoYW5uZWwsIHBhcmFtKQkJCQkgICAgIFwKKwkoewkJCQkJCQkJICAgICBcCisJCUJVSUxEX0JVR19PTihzaXplb2YoY2hhbm5lbC0+aW5mby0+cngucGFyYW0pICE9IHNpemVvZih1OCkpOyBcCisJCWNoYW5uZWwtPmluZm9fd29yZCA/CQkJCQkgICAgIFwKKwkJCWxlMzJfdG9fY3B1KGNoYW5uZWwtPmluZm9fd29yZC0+cngucGFyYW0pIDoJICAgICBcCisJCQljaGFubmVsLT5pbmZvLT5yeC5wYXJhbTsJCQkgICAgIFwKKwl9KQorCisjZGVmaW5lIEdFVF9SWF9DSEFOTkVMX0lORk8oY2hhbm5lbCwgcGFyYW0pCQkJCSAgICAgIFwKKwkoewkJCQkJCQkJICAgICAgXAorCQlCVUlMRF9CVUdfT04oc2l6ZW9mKGNoYW5uZWwtPmluZm8tPnJ4LnBhcmFtKSAhPSBzaXplb2YodTMyKSk7IFwKKwkJbGUzMl90b19jcHUoY2hhbm5lbC0+aW5mb193b3JkID8JCQkgICAgICBcCisJCQljaGFubmVsLT5pbmZvX3dvcmQtPnJ4LnBhcmFtIDoJCQkgICAgICBcCisJCQljaGFubmVsLT5pbmZvLT5yeC5wYXJhbSk7CQkJICAgICAgXAorCX0pCisKKyNkZWZpbmUgU0VUX1JYX0NIQU5ORUxfRkxBRyhjaGFubmVsLCBwYXJhbSwgdmFsdWUpCQkJICAgICBcCisJKHsJCQkJCQkJCSAgICAgXAorCQlCVUlMRF9CVUdfT04oc2l6ZW9mKGNoYW5uZWwtPmluZm8tPnJ4LnBhcmFtKSAhPSBzaXplb2YodTgpKTsgXAorCQlpZiAoY2hhbm5lbC0+aW5mb193b3JkKQkJCQkJICAgICBcCisJCQljaGFubmVsLT5pbmZvX3dvcmQtPnJ4LnBhcmFtID0gY3B1X3RvX2xlMzIodmFsdWUpOyAgIFwKKwkJZWxzZQkJCQkJCQkgICAgIFwKKwkJCWNoYW5uZWwtPmluZm8tPnJ4LnBhcmFtID0gdmFsdWU7CQkgICAgIFwKKwl9KQorCisjZGVmaW5lIFNFVF9SWF9DSEFOTkVMX0lORk8oY2hhbm5lbCwgcGFyYW0sIHZhbHVlKQkJCSAgICAgIFwKKwkoewkJCQkJCQkJICAgICAgXAorCQlCVUlMRF9CVUdfT04oc2l6ZW9mKGNoYW5uZWwtPmluZm8tPnJ4LnBhcmFtKSAhPSBzaXplb2YodTMyKSk7IFwKKwkJaWYgKGNoYW5uZWwtPmluZm9fd29yZCkJCQkJCSAgICAgIFwKKwkJCWNoYW5uZWwtPmluZm9fd29yZC0+cngucGFyYW0gPSBjcHVfdG9fbGUzMih2YWx1ZSk7ICAgIFwKKwkJZWxzZQkJCQkJCQkgICAgICBcCisJCQljaGFubmVsLT5pbmZvLT5yeC5wYXJhbSA9IGNwdV90b19sZTMyKHZhbHVlKTsJICAgICAgXAorCX0pCisKKyNkZWZpbmUgR0VUX1RYX0NIQU5ORUxfRkxBRyhjaGFubmVsLCBwYXJhbSkJCQkJICAgICBcCisJKHsJCQkJCQkJCSAgICAgXAorCQlCVUlMRF9CVUdfT04oc2l6ZW9mKGNoYW5uZWwtPmluZm8tPnR4LnBhcmFtKSAhPSBzaXplb2YodTgpKTsgXAorCQljaGFubmVsLT5pbmZvX3dvcmQgPwkJCQkJICAgICBcCisJCQlsZTMyX3RvX2NwdShjaGFubmVsLT5pbmZvX3dvcmQtPnR4LnBhcmFtKSA6ICAgICAgICAgIFwKKwkJCWNoYW5uZWwtPmluZm8tPnR4LnBhcmFtOwkJCSAgICAgXAorCX0pCisKKyNkZWZpbmUgR0VUX1RYX0NIQU5ORUxfSU5GTyhjaGFubmVsLCBwYXJhbSkJCQkJICAgICAgXAorCSh7CQkJCQkJCQkgICAgICBcCisJCUJVSUxEX0JVR19PTihzaXplb2YoY2hhbm5lbC0+aW5mby0+dHgucGFyYW0pICE9IHNpemVvZih1MzIpKTsgXAorCQlsZTMyX3RvX2NwdShjaGFubmVsLT5pbmZvX3dvcmQgPwkJCSAgICAgIFwKKwkJCWNoYW5uZWwtPmluZm9fd29yZC0+dHgucGFyYW0gOgkJCSAgICAgIFwKKwkJCWNoYW5uZWwtPmluZm8tPnR4LnBhcmFtKTsJCQkgICAgICBcCisJfSkKKworI2RlZmluZSBTRVRfVFhfQ0hBTk5FTF9GTEFHKGNoYW5uZWwsIHBhcmFtLCB2YWx1ZSkJCQkgICAgIFwKKwkoewkJCQkJCQkJICAgICBcCisJCUJVSUxEX0JVR19PTihzaXplb2YoY2hhbm5lbC0+aW5mby0+dHgucGFyYW0pICE9IHNpemVvZih1OCkpOyBcCisJCWlmIChjaGFubmVsLT5pbmZvX3dvcmQpCQkJCQkgICAgIFwKKwkJCWNoYW5uZWwtPmluZm9fd29yZC0+dHgucGFyYW0gPSBjcHVfdG9fbGUzMih2YWx1ZSk7ICAgXAorCQllbHNlCQkJCQkJCSAgICAgXAorCQkJY2hhbm5lbC0+aW5mby0+dHgucGFyYW0gPSB2YWx1ZTsJCSAgICAgXAorCX0pCisKKyNkZWZpbmUgU0VUX1RYX0NIQU5ORUxfSU5GTyhjaGFubmVsLCBwYXJhbSwgdmFsdWUpCQkJICAgICAgXAorCSh7CQkJCQkJCQkgICAgICBcCisJCUJVSUxEX0JVR19PTihzaXplb2YoY2hhbm5lbC0+aW5mby0+dHgucGFyYW0pICE9IHNpemVvZih1MzIpKTsgXAorCQlpZiAoY2hhbm5lbC0+aW5mb193b3JkKQkJCQkJICAgICAgXAorCQkJY2hhbm5lbC0+aW5mb193b3JkLT50eC5wYXJhbSA9IGNwdV90b19sZTMyKHZhbHVlKTsgICBcCisJCWVsc2UJCQkJCQkJICAgICAgXAorCQkJY2hhbm5lbC0+aW5mby0+dHgucGFyYW0gPSBjcHVfdG9fbGUzMih2YWx1ZSk7CSAgICAgIFwKKwl9KQorCisvKioKKyAqIHN0cnVjdCBxY29tX3NtZF9hbGxvY19lbnRyeSAtIGNoYW5uZWwgYWxsb2NhdGlvbiBlbnRyeQorICogQG5hbWU6CWNoYW5uZWwgbmFtZQorICogQGNpZDoJY2hhbm5lbCBpbmRleAorICogQGZsYWdzOgljaGFubmVsIGZsYWdzIGFuZCBlZGdlIGlkCisgKiBAcmVmX2NvdW50OglyZWZlcmVuY2UgY291bnQgb2YgdGhlIGNoYW5uZWwKKyAqLworc3RydWN0IHFjb21fc21kX2FsbG9jX2VudHJ5IHsKKwl1OCBuYW1lWzIwXTsKKwlfX2xlMzIgY2lkOworCV9fbGUzMiBmbGFnczsKKwlfX2xlMzIgcmVmX2NvdW50OworfSBfX3BhY2tlZDsKKworI2RlZmluZSBTTURfQ0hBTk5FTF9GTEFHU19FREdFX01BU0sJMHhmZgorI2RlZmluZSBTTURfQ0hBTk5FTF9GTEFHU19TVFJFQU0JQklUKDgpCisjZGVmaW5lIFNNRF9DSEFOTkVMX0ZMQUdTX1BBQ0tFVAlCSVQoOSkKKworLyoKKyAqIEVhY2ggc21kIHBhY2tldCBjb250YWlucyBhIDIwIGJ5dGUgaGVhZGVyLCB3aXRoIHRoZSBmaXJzdCA0IGJlaW5nIHRoZSBsZW5ndGgKKyAqIG9mIHRoZSBwYWNrZXQuCisgKi8KKyNkZWZpbmUgU01EX1BBQ0tFVF9IRUFERVJfTEVOCTIwCisKKy8qCisgKiBTaWduYWwgdGhlIHJlbW90ZSBwcm9jZXNzb3IgYXNzb2NpYXRlZCB3aXRoICdjaGFubmVsJy4KKyAqLworc3RhdGljIHZvaWQgcWNvbV9zbWRfc2lnbmFsX2NoYW5uZWwoc3RydWN0IHFjb21fc21kX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IHFjb21fc21kX2VkZ2UgKmVkZ2UgPSBjaGFubmVsLT5lZGdlOworCisJcmVnbWFwX3dyaXRlKGVkZ2UtPmlwY19yZWdtYXAsIGVkZ2UtPmlwY19vZmZzZXQsIEJJVChlZGdlLT5pcGNfYml0KSk7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSB0eCBjaGFubmVsIGluZm8KKyAqLworc3RhdGljIHZvaWQgcWNvbV9zbWRfY2hhbm5lbF9yZXNldChzdHJ1Y3QgcWNvbV9zbWRfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlTRVRfVFhfQ0hBTk5FTF9JTkZPKGNoYW5uZWwsIHN0YXRlLCBTTURfQ0hBTk5FTF9DTE9TRUQpOworCVNFVF9UWF9DSEFOTkVMX0ZMQUcoY2hhbm5lbCwgZkRTUiwgMCk7CisJU0VUX1RYX0NIQU5ORUxfRkxBRyhjaGFubmVsLCBmQ1RTLCAwKTsKKwlTRVRfVFhfQ0hBTk5FTF9GTEFHKGNoYW5uZWwsIGZDRCwgMCk7CisJU0VUX1RYX0NIQU5ORUxfRkxBRyhjaGFubmVsLCBmUkksIDApOworCVNFVF9UWF9DSEFOTkVMX0ZMQUcoY2hhbm5lbCwgZkhFQUQsIDApOworCVNFVF9UWF9DSEFOTkVMX0ZMQUcoY2hhbm5lbCwgZlRBSUwsIDApOworCVNFVF9UWF9DSEFOTkVMX0ZMQUcoY2hhbm5lbCwgZlNUQVRFLCAxKTsKKwlTRVRfVFhfQ0hBTk5FTF9GTEFHKGNoYW5uZWwsIGZCTE9DS1JFQURJTlRSLCAxKTsKKwlTRVRfVFhfQ0hBTk5FTF9JTkZPKGNoYW5uZWwsIGhlYWQsIDApOworCVNFVF9SWF9DSEFOTkVMX0lORk8oY2hhbm5lbCwgdGFpbCwgMCk7CisKKwlxY29tX3NtZF9zaWduYWxfY2hhbm5lbChjaGFubmVsKTsKKworCWNoYW5uZWwtPnN0YXRlID0gU01EX0NIQU5ORUxfQ0xPU0VEOworCWNoYW5uZWwtPnBrdF9zaXplID0gMDsKK30KKworLyoKKyAqIFNldCB0aGUgY2FsbGJhY2sgZm9yIGEgY2hhbm5lbCwgd2l0aCBhcHByb3ByaWF0ZSBsb2NraW5nCisgKi8KK3N0YXRpYyB2b2lkIHFjb21fc21kX2NoYW5uZWxfc2V0X2NhbGxiYWNrKHN0cnVjdCBxY29tX3NtZF9jaGFubmVsICpjaGFubmVsLAorCQkJCQkgIHJwbXNnX3J4X2NiX3QgY2IpCit7CisJc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQgPSAmY2hhbm5lbC0+cXNlcHQtPmVwdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW5uZWwtPnJlY3ZfbG9jaywgZmxhZ3MpOworCWVwdC0+Y2IgPSBjYjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFubmVsLT5yZWN2X2xvY2ssIGZsYWdzKTsKK307CisKKy8qCisgKiBDYWxjdWxhdGUgdGhlIGFtb3VudCBvZiBkYXRhIGF2YWlsYWJsZSBpbiB0aGUgcnggZmlmbworICovCitzdGF0aWMgc2l6ZV90IHFjb21fc21kX2NoYW5uZWxfZ2V0X3J4X2F2YWlsKHN0cnVjdCBxY29tX3NtZF9jaGFubmVsICpjaGFubmVsKQoreworCXVuc2lnbmVkIGhlYWQ7CisJdW5zaWduZWQgdGFpbDsKKworCWhlYWQgPSBHRVRfUlhfQ0hBTk5FTF9JTkZPKGNoYW5uZWwsIGhlYWQpOworCXRhaWwgPSBHRVRfUlhfQ0hBTk5FTF9JTkZPKGNoYW5uZWwsIHRhaWwpOworCisJcmV0dXJuIChoZWFkIC0gdGFpbCkgJiAoY2hhbm5lbC0+Zmlmb19zaXplIC0gMSk7Cit9CisKKy8qCisgKiBTZXQgdHggY2hhbm5lbCBzdGF0ZSBhbmQgaW5mb3JtIHRoZSByZW1vdGUgcHJvY2Vzc29yCisgKi8KK3N0YXRpYyB2b2lkIHFjb21fc21kX2NoYW5uZWxfc2V0X3N0YXRlKHN0cnVjdCBxY29tX3NtZF9jaGFubmVsICpjaGFubmVsLAorCQkJCSAgICAgICBpbnQgc3RhdGUpCit7CisJc3RydWN0IHFjb21fc21kX2VkZ2UgKmVkZ2UgPSBjaGFubmVsLT5lZGdlOworCWJvb2wgaXNfb3BlbiA9IHN0YXRlID09IFNNRF9DSEFOTkVMX09QRU5FRDsKKworCWlmIChjaGFubmVsLT5zdGF0ZSA9PSBzdGF0ZSkKKwkJcmV0dXJuOworCisJZGV2X2RiZygmZWRnZS0+ZGV2LCAic2V0X3N0YXRlKCVzLCAlZClcbiIsIGNoYW5uZWwtPm5hbWUsIHN0YXRlKTsKKworCVNFVF9UWF9DSEFOTkVMX0ZMQUcoY2hhbm5lbCwgZkRTUiwgaXNfb3Blbik7CisJU0VUX1RYX0NIQU5ORUxfRkxBRyhjaGFubmVsLCBmQ1RTLCBpc19vcGVuKTsKKwlTRVRfVFhfQ0hBTk5FTF9GTEFHKGNoYW5uZWwsIGZDRCwgaXNfb3Blbik7CisKKwlTRVRfVFhfQ0hBTk5FTF9JTkZPKGNoYW5uZWwsIHN0YXRlLCBzdGF0ZSk7CisJU0VUX1RYX0NIQU5ORUxfRkxBRyhjaGFubmVsLCBmU1RBVEUsIDEpOworCisJY2hhbm5lbC0+c3RhdGUgPSBzdGF0ZTsKKwlxY29tX3NtZF9zaWduYWxfY2hhbm5lbChjaGFubmVsKTsKK30KKworLyoKKyAqIENvcHkgY291bnQgYnl0ZXMgb2YgZGF0YSB1c2luZyAzMmJpdCBhY2Nlc3NlcywgaWYgdGhhdCdzIHJlcXVpcmVkLgorICovCitzdGF0aWMgdm9pZCBzbWRfY29weV90b19maWZvKHZvaWQgX19pb21lbSAqZHN0LAorCQkJICAgICBjb25zdCB2b2lkICpzcmMsCisJCQkgICAgIHNpemVfdCBjb3VudCwKKwkJCSAgICAgYm9vbCB3b3JkX2FsaWduZWQpCit7CisJaWYgKHdvcmRfYWxpZ25lZCkgeworCQlfX2lvd3JpdGUzMl9jb3B5KGRzdCwgc3JjLCBjb3VudCAvIHNpemVvZih1MzIpKTsKKwl9IGVsc2UgeworCQltZW1jcHlfdG9pbyhkc3QsIHNyYywgY291bnQpOworCX0KK30KKworLyoKKyAqIENvcHkgY291bnQgYnl0ZXMgb2YgZGF0YSB1c2luZyAzMmJpdCBhY2Nlc3NlcywgaWYgdGhhdCBpcyByZXF1aXJlZC4KKyAqLworc3RhdGljIHZvaWQgc21kX2NvcHlfZnJvbV9maWZvKHZvaWQgKmRzdCwKKwkJCSAgICAgICBjb25zdCB2b2lkIF9faW9tZW0gKnNyYywKKwkJCSAgICAgICBzaXplX3QgY291bnQsCisJCQkgICAgICAgYm9vbCB3b3JkX2FsaWduZWQpCit7CisJaWYgKHdvcmRfYWxpZ25lZCkgeworCQlfX2lvcmVhZDMyX2NvcHkoZHN0LCBzcmMsIGNvdW50IC8gc2l6ZW9mKHUzMikpOworCX0gZWxzZSB7CisJCW1lbWNweV9mcm9taW8oZHN0LCBzcmMsIGNvdW50KTsKKwl9Cit9CisKKy8qCisgKiBSZWFkIGNvdW50IGJ5dGVzIG9mIGRhdGEgZnJvbSB0aGUgcnggZmlmbyBpbnRvIGJ1ZiwgYnV0IGRvbid0IGFkdmFuY2UgdGhlCisgKiB0YWlsLgorICovCitzdGF0aWMgc2l6ZV90IHFjb21fc21kX2NoYW5uZWxfcGVlayhzdHJ1Y3QgcWNvbV9zbWRfY2hhbm5lbCAqY2hhbm5lbCwKKwkJCQkgICAgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCit7CisJYm9vbCB3b3JkX2FsaWduZWQ7CisJdW5zaWduZWQgdGFpbDsKKwlzaXplX3QgbGVuOworCisJd29yZF9hbGlnbmVkID0gY2hhbm5lbC0+aW5mb193b3JkOworCXRhaWwgPSBHRVRfUlhfQ0hBTk5FTF9JTkZPKGNoYW5uZWwsIHRhaWwpOworCisJbGVuID0gbWluX3Qoc2l6ZV90LCBjb3VudCwgY2hhbm5lbC0+Zmlmb19zaXplIC0gdGFpbCk7CisJaWYgKGxlbikgeworCQlzbWRfY29weV9mcm9tX2ZpZm8oYnVmLAorCQkJCSAgIGNoYW5uZWwtPnJ4X2ZpZm8gKyB0YWlsLAorCQkJCSAgIGxlbiwKKwkJCQkgICB3b3JkX2FsaWduZWQpOworCX0KKworCWlmIChsZW4gIT0gY291bnQpIHsKKwkJc21kX2NvcHlfZnJvbV9maWZvKGJ1ZiArIGxlbiwKKwkJCQkgICBjaGFubmVsLT5yeF9maWZvLAorCQkJCSAgIGNvdW50IC0gbGVuLAorCQkJCSAgIHdvcmRfYWxpZ25lZCk7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCisvKgorICogQWR2YW5jZSB0aGUgcnggdGFpbCBieSBjb3VudCBieXRlcy4KKyAqLworc3RhdGljIHZvaWQgcWNvbV9zbWRfY2hhbm5lbF9hZHZhbmNlKHN0cnVjdCBxY29tX3NtZF9jaGFubmVsICpjaGFubmVsLAorCQkJCSAgICAgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIHRhaWw7CisKKwl0YWlsID0gR0VUX1JYX0NIQU5ORUxfSU5GTyhjaGFubmVsLCB0YWlsKTsKKwl0YWlsICs9IGNvdW50OworCXRhaWwgJj0gKGNoYW5uZWwtPmZpZm9fc2l6ZSAtIDEpOworCVNFVF9SWF9DSEFOTkVMX0lORk8oY2hhbm5lbCwgdGFpbCwgdGFpbCk7Cit9CisKKy8qCisgKiBSZWFkIG91dCBhIHNpbmdsZSBwYWNrZXQgZnJvbSB0aGUgcnggZmlmbyBhbmQgZGVsaXZlciBpdCB0byB0aGUgZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgcWNvbV9zbWRfY2hhbm5lbF9yZWN2X3NpbmdsZShzdHJ1Y3QgcWNvbV9zbWRfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdCA9ICZjaGFubmVsLT5xc2VwdC0+ZXB0OworCXVuc2lnbmVkIHRhaWw7CisJc2l6ZV90IGxlbjsKKwl2b2lkICpwdHI7CisJaW50IHJldDsKKworCXRhaWwgPSBHRVRfUlhfQ0hBTk5FTF9JTkZPKGNoYW5uZWwsIHRhaWwpOworCisJLyogVXNlIGJvdW5jZSBidWZmZXIgaWYgdGhlIGRhdGEgd3JhcHMgKi8KKwlpZiAodGFpbCArIGNoYW5uZWwtPnBrdF9zaXplID49IGNoYW5uZWwtPmZpZm9fc2l6ZSkgeworCQlwdHIgPSBjaGFubmVsLT5ib3VuY2VfYnVmZmVyOworCQlsZW4gPSBxY29tX3NtZF9jaGFubmVsX3BlZWsoY2hhbm5lbCwgcHRyLCBjaGFubmVsLT5wa3Rfc2l6ZSk7CisJfSBlbHNlIHsKKwkJcHRyID0gY2hhbm5lbC0+cnhfZmlmbyArIHRhaWw7CisJCWxlbiA9IGNoYW5uZWwtPnBrdF9zaXplOworCX0KKworCXJldCA9IGVwdC0+Y2IoZXB0LT5ycGRldiwgcHRyLCBsZW4sIGVwdC0+cHJpdiwgUlBNU0dfQUREUl9BTlkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogT25seSBmb3J3YXJkIHRoZSB0YWlsIGlmIHRoZSBjbGllbnQgY29uc3VtZWQgdGhlIGRhdGEgKi8KKwlxY29tX3NtZF9jaGFubmVsX2FkdmFuY2UoY2hhbm5lbCwgbGVuKTsKKworCWNoYW5uZWwtPnBrdF9zaXplID0gMDsKKworCXJldHVybiAwOworfQorCisvKgorICogUGVyIGNoYW5uZWwgaW50ZXJydXB0IGhhbmRsaW5nCisgKi8KK3N0YXRpYyBib29sIHFjb21fc21kX2NoYW5uZWxfaW50cihzdHJ1Y3QgcWNvbV9zbWRfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlib29sIG5lZWRfc3RhdGVfc2NhbiA9IGZhbHNlOworCWludCByZW1vdGVfc3RhdGU7CisJX19sZTMyIHBrdGxlbjsKKwlpbnQgYXZhaWw7CisJaW50IHJldDsKKworCS8qIEhhbmRsZSBzdGF0ZSBjaGFuZ2VzICovCisJcmVtb3RlX3N0YXRlID0gR0VUX1JYX0NIQU5ORUxfSU5GTyhjaGFubmVsLCBzdGF0ZSk7CisJaWYgKHJlbW90ZV9zdGF0ZSAhPSBjaGFubmVsLT5yZW1vdGVfc3RhdGUpIHsKKwkJY2hhbm5lbC0+cmVtb3RlX3N0YXRlID0gcmVtb3RlX3N0YXRlOworCQluZWVkX3N0YXRlX3NjYW4gPSB0cnVlOworCX0KKwkvKiBJbmRpY2F0ZSB0aGF0IHdlIGhhdmUgc2VlbiBhbnkgc3RhdGUgY2hhbmdlICovCisJU0VUX1JYX0NIQU5ORUxfRkxBRyhjaGFubmVsLCBmU1RBVEUsIDApOworCisJLyogU2lnbmFsIHdhaXRpbmcgcWNvbV9zbWRfc2VuZCgpIGFib3V0IHRoZSBpbnRlcnJ1cHQgKi8KKwlpZiAoIUdFVF9UWF9DSEFOTkVMX0ZMQUcoY2hhbm5lbCwgZkJMT0NLUkVBRElOVFIpKQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNoYW5uZWwtPmZibG9ja3JlYWRfZXZlbnQpOworCisJLyogRG9uJ3QgY29uc3VtZSBhbnkgZGF0YSB1bnRpbCB3ZSd2ZSBvcGVuZWQgdGhlIGNoYW5uZWwgKi8KKwlpZiAoY2hhbm5lbC0+c3RhdGUgIT0gU01EX0NIQU5ORUxfT1BFTkVEKQorCQlnb3RvIG91dDsKKworCS8qIEluZGljYXRlIHRoYXQgd2UndmUgc2VlbiB0aGUgbmV3IGRhdGEgKi8KKwlTRVRfUlhfQ0hBTk5FTF9GTEFHKGNoYW5uZWwsIGZIRUFELCAwKTsKKworCS8qIENvbnN1bWUgZGF0YSAqLworCWZvciAoOzspIHsKKwkJYXZhaWwgPSBxY29tX3NtZF9jaGFubmVsX2dldF9yeF9hdmFpbChjaGFubmVsKTsKKworCQlpZiAoIWNoYW5uZWwtPnBrdF9zaXplICYmIGF2YWlsID49IFNNRF9QQUNLRVRfSEVBREVSX0xFTikgeworCQkJcWNvbV9zbWRfY2hhbm5lbF9wZWVrKGNoYW5uZWwsICZwa3RsZW4sIHNpemVvZihwa3RsZW4pKTsKKwkJCXFjb21fc21kX2NoYW5uZWxfYWR2YW5jZShjaGFubmVsLCBTTURfUEFDS0VUX0hFQURFUl9MRU4pOworCQkJY2hhbm5lbC0+cGt0X3NpemUgPSBsZTMyX3RvX2NwdShwa3RsZW4pOworCQl9IGVsc2UgaWYgKGNoYW5uZWwtPnBrdF9zaXplICYmIGF2YWlsID49IGNoYW5uZWwtPnBrdF9zaXplKSB7CisJCQlyZXQgPSBxY29tX3NtZF9jaGFubmVsX3JlY3Zfc2luZ2xlKGNoYW5uZWwpOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogSW5kaWNhdGUgdGhhdCB3ZSBoYXZlIHNlZW4gYW5kIHVwZGF0ZWQgdGFpbCAqLworCVNFVF9SWF9DSEFOTkVMX0ZMQUcoY2hhbm5lbCwgZlRBSUwsIDEpOworCisJLyogU2lnbmFsIHRoZSByZW1vdGUgdGhhdCB3ZSd2ZSBjb25zdW1lZCB0aGUgZGF0YSAoaWYgcmVxdWVzdGVkKSAqLworCWlmICghR0VUX1JYX0NIQU5ORUxfRkxBRyhjaGFubmVsLCBmQkxPQ0tSRUFESU5UUikpIHsKKwkJLyogRW5zdXJlIG9yZGVyaW5nIG9mIGNoYW5uZWwgaW5mbyB1cGRhdGVzICovCisJCXdtYigpOworCisJCXFjb21fc21kX3NpZ25hbF9jaGFubmVsKGNoYW5uZWwpOworCX0KKworb3V0OgorCXJldHVybiBuZWVkX3N0YXRlX3NjYW47Cit9CisKKy8qCisgKiBUaGUgZWRnZSBpbnRlcnJ1cHRzIGFyZSB0cmlnZ2VyZWQgYnkgdGhlIHJlbW90ZSBwcm9jZXNzb3Igb24gc3RhdGUgY2hhbmdlcywKKyAqIGNoYW5uZWwgaW5mbyB1cGRhdGVzIG9yIHdoZW4gbmV3IGNoYW5uZWxzIGFyZSBjcmVhdGVkLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgcWNvbV9zbWRfZWRnZV9pbnRyKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHFjb21fc21kX2VkZ2UgKmVkZ2UgPSBkYXRhOworCXN0cnVjdCBxY29tX3NtZF9jaGFubmVsICpjaGFubmVsOworCXVuc2lnbmVkIGF2YWlsYWJsZTsKKwlib29sIGtpY2tfc2Nhbm5lciA9IGZhbHNlOworCWJvb2wga2lja19zdGF0ZSA9IGZhbHNlOworCisJLyoKKwkgKiBIYW5kbGUgc3RhdGUgY2hhbmdlcyBvciBkYXRhIG9uIGVhY2ggb2YgdGhlIGNoYW5uZWxzIG9uIHRoaXMgZWRnZQorCSAqLworCXNwaW5fbG9jaygmZWRnZS0+Y2hhbm5lbHNfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGFubmVsLCAmZWRnZS0+Y2hhbm5lbHMsIGxpc3QpIHsKKwkJc3Bpbl9sb2NrKCZjaGFubmVsLT5yZWN2X2xvY2spOworCQlraWNrX3N0YXRlIHw9IHFjb21fc21kX2NoYW5uZWxfaW50cihjaGFubmVsKTsKKwkJc3Bpbl91bmxvY2soJmNoYW5uZWwtPnJlY3ZfbG9jayk7CisJfQorCXNwaW5fdW5sb2NrKCZlZGdlLT5jaGFubmVsc19sb2NrKTsKKworCS8qCisJICogQ3JlYXRpbmcgYSBuZXcgY2hhbm5lbCByZXF1aXJlcyBhbGxvY2F0aW5nIGFuIHNtZW0gZW50cnksIHNvIHdlIG9ubHkKKwkgKiBoYXZlIHRvIHNjYW4gaWYgdGhlIGFtb3VudCBvZiBhdmFpbGFibGUgc3BhY2UgaW4gc21lbSBoYXZlIGNoYW5nZWQKKwkgKiBzaW5jZSBsYXN0IHNjYW4uCisJICovCisJYXZhaWxhYmxlID0gcWNvbV9zbWVtX2dldF9mcmVlX3NwYWNlKGVkZ2UtPnJlbW90ZV9waWQpOworCWlmIChhdmFpbGFibGUgIT0gZWRnZS0+c21lbV9hdmFpbGFibGUpIHsKKwkJZWRnZS0+c21lbV9hdmFpbGFibGUgPSBhdmFpbGFibGU7CisJCWtpY2tfc2Nhbm5lciA9IHRydWU7CisJfQorCisJaWYgKGtpY2tfc2Nhbm5lcikKKwkJc2NoZWR1bGVfd29yaygmZWRnZS0+c2Nhbl93b3JrKTsKKwlpZiAoa2lja19zdGF0ZSkKKwkJc2NoZWR1bGVfd29yaygmZWRnZS0+c3RhdGVfd29yayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgaG93IG11Y2ggc3BhY2UgaXMgYXZhaWxhYmxlIGluIHRoZSB0eCBmaWZvLgorICovCitzdGF0aWMgc2l6ZV90IHFjb21fc21kX2dldF90eF9hdmFpbChzdHJ1Y3QgcWNvbV9zbWRfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwl1bnNpZ25lZCBoZWFkOworCXVuc2lnbmVkIHRhaWw7CisJdW5zaWduZWQgbWFzayA9IGNoYW5uZWwtPmZpZm9fc2l6ZSAtIDE7CisKKwloZWFkID0gR0VUX1RYX0NIQU5ORUxfSU5GTyhjaGFubmVsLCBoZWFkKTsKKwl0YWlsID0gR0VUX1RYX0NIQU5ORUxfSU5GTyhjaGFubmVsLCB0YWlsKTsKKworCXJldHVybiBtYXNrIC0gKChoZWFkIC0gdGFpbCkgJiBtYXNrKTsKK30KKworLyoKKyAqIFdyaXRlIGNvdW50IGJ5dGVzIG9mIGRhdGEgaW50byBjaGFubmVsLCBwb3NzaWJseSB3cmFwcGluZyBpbiB0aGUgcmluZyBidWZmZXIKKyAqLworc3RhdGljIGludCBxY29tX3NtZF93cml0ZV9maWZvKHN0cnVjdCBxY29tX3NtZF9jaGFubmVsICpjaGFubmVsLAorCQkJICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkgICAgICAgc2l6ZV90IGNvdW50KQoreworCWJvb2wgd29yZF9hbGlnbmVkOworCXVuc2lnbmVkIGhlYWQ7CisJc2l6ZV90IGxlbjsKKworCXdvcmRfYWxpZ25lZCA9IGNoYW5uZWwtPmluZm9fd29yZDsKKwloZWFkID0gR0VUX1RYX0NIQU5ORUxfSU5GTyhjaGFubmVsLCBoZWFkKTsKKworCWxlbiA9IG1pbl90KHNpemVfdCwgY291bnQsIGNoYW5uZWwtPmZpZm9fc2l6ZSAtIGhlYWQpOworCWlmIChsZW4pIHsKKwkJc21kX2NvcHlfdG9fZmlmbyhjaGFubmVsLT50eF9maWZvICsgaGVhZCwKKwkJCQkgZGF0YSwKKwkJCQkgbGVuLAorCQkJCSB3b3JkX2FsaWduZWQpOworCX0KKworCWlmIChsZW4gIT0gY291bnQpIHsKKwkJc21kX2NvcHlfdG9fZmlmbyhjaGFubmVsLT50eF9maWZvLAorCQkJCSBkYXRhICsgbGVuLAorCQkJCSBjb3VudCAtIGxlbiwKKwkJCQkgd29yZF9hbGlnbmVkKTsKKwl9CisKKwloZWFkICs9IGNvdW50OworCWhlYWQgJj0gKGNoYW5uZWwtPmZpZm9fc2l6ZSAtIDEpOworCVNFVF9UWF9DSEFOTkVMX0lORk8oY2hhbm5lbCwgaGVhZCwgaGVhZCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qKgorICogcWNvbV9zbWRfc2VuZCAtIHdyaXRlIGRhdGEgdG8gc21kIGNoYW5uZWwKKyAqIEBjaGFubmVsOgljaGFubmVsIGhhbmRsZQorICogQGRhdGE6CWJ1ZmZlciBvZiBkYXRhIHRvIHdyaXRlCisgKiBAbGVuOgludW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKKyAqCisgKiBUaGlzIGlzIGEgYmxvY2tpbmcgd3JpdGUgb2YgbGVuIGJ5dGVzIGludG8gdGhlIGNoYW5uZWwncyB0eCByaW5nIGJ1ZmZlciBhbmQKKyAqIHNpZ25hbCB0aGUgcmVtb3RlIGVuZC4gSXQgd2lsbCBzbGVlcCB1bnRpbCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlCisgKiBpbiB0aGUgdHggYnVmZmVyLCB1dGlsaXppbmcgdGhlIGZCTE9DS1JFQURJTlRSIHNpZ25hbGluZyBtZWNoYW5pc20gdG8gYXZvaWQKKyAqIHBvbGxpbmcuCisgKi8KK3N0YXRpYyBpbnQgX19xY29tX3NtZF9zZW5kKHN0cnVjdCBxY29tX3NtZF9jaGFubmVsICpjaGFubmVsLCBjb25zdCB2b2lkICpkYXRhLAorCQkJICAgaW50IGxlbiwgYm9vbCB3YWl0KQoreworCV9fbGUzMiBoZHJbNV0gPSB7IGNwdV90b19sZTMyKGxlbiksIH07CisJaW50IHRsZW4gPSBzaXplb2YoaGRyKSArIGxlbjsKKwlpbnQgcmV0OworCisJLyogV29yZCBhbGlnbmVkIGNoYW5uZWxzIG9ubHkgYWNjZXB0IHdvcmQgc2l6ZSBhbGlnbmVkIGRhdGEgKi8KKwlpZiAoY2hhbm5lbC0+aW5mb193b3JkICYmIGxlbiAlIDQpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogUmVqZWN0IHBhY2tldHMgdGhhdCBhcmUgdG9vIGJpZyAqLworCWlmICh0bGVuID49IGNoYW5uZWwtPmZpZm9fc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmNoYW5uZWwtPnR4X2xvY2spOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl3aGlsZSAocWNvbV9zbWRfZ2V0X3R4X2F2YWlsKGNoYW5uZWwpIDwgdGxlbikgeworCQlpZiAoIXdhaXQpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChjaGFubmVsLT5zdGF0ZSAhPSBTTURfQ0hBTk5FTF9PUEVORUQpIHsKKwkJCXJldCA9IC1FUElQRTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJU0VUX1RYX0NIQU5ORUxfRkxBRyhjaGFubmVsLCBmQkxPQ0tSRUFESU5UUiwgMCk7CisKKwkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGNoYW5uZWwtPmZibG9ja3JlYWRfZXZlbnQsCisJCQkJICAgICAgIHFjb21fc21kX2dldF90eF9hdmFpbChjaGFubmVsKSA+PSB0bGVuIHx8CisJCQkJICAgICAgIGNoYW5uZWwtPnN0YXRlICE9IFNNRF9DSEFOTkVMX09QRU5FRCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKworCQlTRVRfVFhfQ0hBTk5FTF9GTEFHKGNoYW5uZWwsIGZCTE9DS1JFQURJTlRSLCAxKTsKKwl9CisKKwlTRVRfVFhfQ0hBTk5FTF9GTEFHKGNoYW5uZWwsIGZUQUlMLCAwKTsKKworCXFjb21fc21kX3dyaXRlX2ZpZm8oY2hhbm5lbCwgaGRyLCBzaXplb2YoaGRyKSk7CisJcWNvbV9zbWRfd3JpdGVfZmlmbyhjaGFubmVsLCBkYXRhLCBsZW4pOworCisJU0VUX1RYX0NIQU5ORUxfRkxBRyhjaGFubmVsLCBmSEVBRCwgMSk7CisKKwkvKiBFbnN1cmUgb3JkZXJpbmcgb2YgY2hhbm5lbCBpbmZvIHVwZGF0ZXMgKi8KKwl3bWIoKTsKKworCXFjb21fc21kX3NpZ25hbF9jaGFubmVsKGNoYW5uZWwpOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZjaGFubmVsLT50eF9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBIZWxwZXIgZm9yIG9wZW5pbmcgYSBjaGFubmVsCisgKi8KK3N0YXRpYyBpbnQgcWNvbV9zbWRfY2hhbm5lbF9vcGVuKHN0cnVjdCBxY29tX3NtZF9jaGFubmVsICpjaGFubmVsLAorCQkJCSBycG1zZ19yeF9jYl90IGNiKQoreworCXNpemVfdCBiYl9zaXplOworCisJLyoKKwkgKiBQYWNrZXRzIGFyZSBtYXhpbXVtIDRrLCBidXQgcmVkdWNlIGlmIHRoZSBmaWZvIGlzIHNtYWxsZXIKKwkgKi8KKwliYl9zaXplID0gbWluKGNoYW5uZWwtPmZpZm9fc2l6ZSwgU1pfNEspOworCWNoYW5uZWwtPmJvdW5jZV9idWZmZXIgPSBrbWFsbG9jKGJiX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghY2hhbm5lbC0+Ym91bmNlX2J1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlxY29tX3NtZF9jaGFubmVsX3NldF9jYWxsYmFjayhjaGFubmVsLCBjYik7CisJcWNvbV9zbWRfY2hhbm5lbF9zZXRfc3RhdGUoY2hhbm5lbCwgU01EX0NIQU5ORUxfT1BFTklORyk7CisJcWNvbV9zbWRfY2hhbm5lbF9zZXRfc3RhdGUoY2hhbm5lbCwgU01EX0NIQU5ORUxfT1BFTkVEKTsKKworCXJldHVybiAwOworfQorCisvKgorICogSGVscGVyIGZvciBjbG9zaW5nIGFuZCByZXNldHRpbmcgYSBjaGFubmVsCisgKi8KK3N0YXRpYyB2b2lkIHFjb21fc21kX2NoYW5uZWxfY2xvc2Uoc3RydWN0IHFjb21fc21kX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJcWNvbV9zbWRfY2hhbm5lbF9zZXRfY2FsbGJhY2soY2hhbm5lbCwgTlVMTCk7CisKKwlrZnJlZShjaGFubmVsLT5ib3VuY2VfYnVmZmVyKTsKKwljaGFubmVsLT5ib3VuY2VfYnVmZmVyID0gTlVMTDsKKworCXFjb21fc21kX2NoYW5uZWxfc2V0X3N0YXRlKGNoYW5uZWwsIFNNRF9DSEFOTkVMX0NMT1NFRCk7CisJcWNvbV9zbWRfY2hhbm5lbF9yZXNldChjaGFubmVsKTsKK30KKworc3RhdGljIHN0cnVjdCBxY29tX3NtZF9jaGFubmVsICoKK3Fjb21fc21kX2ZpbmRfY2hhbm5lbChzdHJ1Y3QgcWNvbV9zbWRfZWRnZSAqZWRnZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgcWNvbV9zbWRfY2hhbm5lbCAqY2hhbm5lbDsKKwlzdHJ1Y3QgcWNvbV9zbWRfY2hhbm5lbCAqcmV0ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHN0YXRlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVkZ2UtPmNoYW5uZWxzX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoYW5uZWwsICZlZGdlLT5jaGFubmVscywgbGlzdCkgeworCQlpZiAoc3RyY21wKGNoYW5uZWwtPm5hbWUsIG5hbWUpKQorCQkJY29udGludWU7CisKKwkJc3RhdGUgPSBHRVRfUlhfQ0hBTk5FTF9JTkZPKGNoYW5uZWwsIHN0YXRlKTsKKwkJaWYgKHN0YXRlICE9IFNNRF9DSEFOTkVMX09QRU5JTkcgJiYKKwkJICAgIHN0YXRlICE9IFNNRF9DSEFOTkVMX09QRU5FRCkKKwkJCWNvbnRpbnVlOworCisJCXJldCA9IGNoYW5uZWw7CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZGdlLT5jaGFubmVsc19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2VwdF9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0ID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBycG1zZ19lbmRwb2ludCwKKwkJCQkJCSAgcmVmY291bnQpOworCWtmcmVlKHRvX3NtZF9lbmRwb2ludChlcHQpKTsKK30KKworc3RhdGljIHN0cnVjdCBycG1zZ19lbmRwb2ludCAqcWNvbV9zbWRfY3JlYXRlX2VwdChzdHJ1Y3QgcnBtc2dfZGV2aWNlICpycGRldiwKKwkJCQkJCSAgcnBtc2dfcnhfY2JfdCBjYiwgdm9pZCAqcHJpdiwKKwkJCQkJCSAgc3RydWN0IHJwbXNnX2NoYW5uZWxfaW5mbyBjaGluZm8pCit7CisJc3RydWN0IHFjb21fc21kX2VuZHBvaW50ICpxc2VwdDsKKwlzdHJ1Y3QgcWNvbV9zbWRfY2hhbm5lbCAqY2hhbm5lbDsKKwlzdHJ1Y3QgcWNvbV9zbWRfZGV2aWNlICpxc2RldiA9IHRvX3NtZF9kZXZpY2UocnBkZXYpOworCXN0cnVjdCBxY29tX3NtZF9lZGdlICplZGdlID0gcXNkZXYtPmVkZ2U7CisJc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQ7CisJY29uc3QgY2hhciAqbmFtZSA9IGNoaW5mby5uYW1lOworCWludCByZXQ7CisKKwkvKiBXYWl0IHVwIHRvIEhaIGZvciB0aGUgY2hhbm5lbCB0byBhcHBlYXIgKi8KKwlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChlZGdlLT5uZXdfY2hhbm5lbF9ldmVudCwKKwkJCShjaGFubmVsID0gcWNvbV9zbWRfZmluZF9jaGFubmVsKGVkZ2UsIG5hbWUpKSAhPSBOVUxMLAorCQkJSFopOworCWlmICghcmV0KQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChjaGFubmVsLT5zdGF0ZSAhPSBTTURfQ0hBTk5FTF9DTE9TRUQpIHsKKwkJZGV2X2VycigmcnBkZXYtPmRldiwgImNoYW5uZWwgJXMgaXMgYnVzeVxuIiwgY2hhbm5lbC0+bmFtZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXFzZXB0ID0ga3phbGxvYyhzaXplb2YoKnFzZXB0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFxc2VwdCkKKwkJcmV0dXJuIE5VTEw7CisKKwllcHQgPSAmcXNlcHQtPmVwdDsKKworCWtyZWZfaW5pdCgmZXB0LT5yZWZjb3VudCk7CisKKwllcHQtPnJwZGV2ID0gcnBkZXY7CisJZXB0LT5jYiA9IGNiOworCWVwdC0+cHJpdiA9IHByaXY7CisJZXB0LT5vcHMgPSAmcWNvbV9zbWRfZW5kcG9pbnRfb3BzOworCisJY2hhbm5lbC0+cXNlcHQgPSBxc2VwdDsKKwlxc2VwdC0+cXNjaCA9IGNoYW5uZWw7CisKKwlyZXQgPSBxY29tX3NtZF9jaGFubmVsX29wZW4oY2hhbm5lbCwgY2IpOworCWlmIChyZXQpCisJCWdvdG8gZnJlZV9lcHQ7CisKKwlyZXR1cm4gZXB0OworCitmcmVlX2VwdDoKKwljaGFubmVsLT5xc2VwdCA9IE5VTEw7CisJa3JlZl9wdXQoJmVwdC0+cmVmY291bnQsIF9fZXB0X3JlbGVhc2UpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBxY29tX3NtZF9kZXN0cm95X2VwdChzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdCkKK3sKKwlzdHJ1Y3QgcWNvbV9zbWRfZW5kcG9pbnQgKnFzZXB0ID0gdG9fc21kX2VuZHBvaW50KGVwdCk7CisJc3RydWN0IHFjb21fc21kX2NoYW5uZWwgKmNoID0gcXNlcHQtPnFzY2g7CisKKwlxY29tX3NtZF9jaGFubmVsX2Nsb3NlKGNoKTsKKwljaC0+cXNlcHQgPSBOVUxMOworCWtyZWZfcHV0KCZlcHQtPnJlZmNvdW50LCBfX2VwdF9yZWxlYXNlKTsKK30KKworc3RhdGljIGludCBxY29tX3NtZF9zZW5kKHN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0LCB2b2lkICpkYXRhLCBpbnQgbGVuKQoreworCXN0cnVjdCBxY29tX3NtZF9lbmRwb2ludCAqcXNlcHQgPSB0b19zbWRfZW5kcG9pbnQoZXB0KTsKKworCXJldHVybiBfX3Fjb21fc21kX3NlbmQocXNlcHQtPnFzY2gsIGRhdGEsIGxlbiwgdHJ1ZSk7Cit9CisKK3N0YXRpYyBpbnQgcWNvbV9zbWRfdHJ5c2VuZChzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdCwgdm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgcWNvbV9zbWRfZW5kcG9pbnQgKnFzZXB0ID0gdG9fc21kX2VuZHBvaW50KGVwdCk7CisKKwlyZXR1cm4gX19xY29tX3NtZF9zZW5kKHFzZXB0LT5xc2NoLCBkYXRhLCBsZW4sIGZhbHNlKTsKK30KKworLyoKKyAqIEZpbmRzIHRoZSBkZXZpY2Vfbm9kZSBmb3IgdGhlIHNtZCBjaGlsZCBpbnRlcmVzdGVkIGluIHRoaXMgY2hhbm5lbC4KKyAqLworc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqcWNvbV9zbWRfbWF0Y2hfY2hhbm5lbChzdHJ1Y3QgZGV2aWNlX25vZGUgKmVkZ2Vfbm9kZSwKKwkJCQkJCSAgY29uc3QgY2hhciAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkOworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqa2V5OworCWludCByZXQ7CisKKwlmb3JfZWFjaF9hdmFpbGFibGVfY2hpbGRfb2Zfbm9kZShlZGdlX25vZGUsIGNoaWxkKSB7CisJCWtleSA9ICJxY29tLHNtZC1jaGFubmVscyI7CisJCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKGNoaWxkLCBrZXksICZuYW1lKTsKKwkJaWYgKHJldCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChzdHJjbXAobmFtZSwgY2hhbm5lbCkgPT0gMCkKKwkJCXJldHVybiBjaGlsZDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBycG1zZ19kZXZpY2Vfb3BzIHFjb21fc21kX2RldmljZV9vcHMgPSB7CisJLmNyZWF0ZV9lcHQgPSBxY29tX3NtZF9jcmVhdGVfZXB0LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBycG1zZ19lbmRwb2ludF9vcHMgcWNvbV9zbWRfZW5kcG9pbnRfb3BzID0geworCS5kZXN0cm95X2VwdCA9IHFjb21fc21kX2Rlc3Ryb3lfZXB0LAorCS5zZW5kID0gcWNvbV9zbWRfc2VuZCwKKwkudHJ5c2VuZCA9IHFjb21fc21kX3RyeXNlbmQsCit9OworCisvKgorICogQ3JlYXRlIGEgc21kIGNsaWVudCBkZXZpY2UgZm9yIGNoYW5uZWwgdGhhdCBpcyBiZWluZyBvcGVuZWQuCisgKi8KK3N0YXRpYyBpbnQgcWNvbV9zbWRfY3JlYXRlX2RldmljZShzdHJ1Y3QgcWNvbV9zbWRfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgcWNvbV9zbWRfZGV2aWNlICpxc2RldjsKKwlzdHJ1Y3QgcnBtc2dfZGV2aWNlICpycGRldjsKKwlzdHJ1Y3QgcWNvbV9zbWRfZWRnZSAqZWRnZSA9IGNoYW5uZWwtPmVkZ2U7CisKKwlkZXZfZGJnKCZlZGdlLT5kZXYsICJyZWdpc3RlcmluZyAnJXMnXG4iLCBjaGFubmVsLT5uYW1lKTsKKworCXFzZGV2ID0ga3phbGxvYyhzaXplb2YoKnFzZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFxc2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBMaW5rIHFzZGV2IHRvIG91ciBTTUQgZWRnZSAqLworCXFzZGV2LT5lZGdlID0gZWRnZTsKKworCS8qIEFzc2lnbiBjYWxsYmFja3MgZm9yIHJwbXNnX2RldmljZSAqLworCXFzZGV2LT5ycGRldi5vcHMgPSAmcWNvbV9zbWRfZGV2aWNlX29wczsKKworCS8qIEFzc2lnbiBwdWJsaWMgaW5mb3JtYXRpb24gdG8gdGhlIHJwbXNnX2RldmljZSAqLworCXJwZGV2ID0gJnFzZGV2LT5ycGRldjsKKwlzdHJuY3B5KHJwZGV2LT5pZC5uYW1lLCBjaGFubmVsLT5uYW1lLCBSUE1TR19OQU1FX1NJWkUpOworCXJwZGV2LT5zcmMgPSBSUE1TR19BRERSX0FOWTsKKwlycGRldi0+ZHN0ID0gUlBNU0dfQUREUl9BTlk7CisKKwlycGRldi0+ZGV2Lm9mX25vZGUgPSBxY29tX3NtZF9tYXRjaF9jaGFubmVsKGVkZ2UtPm9mX25vZGUsIGNoYW5uZWwtPm5hbWUpOworCXJwZGV2LT5kZXYucGFyZW50ID0gJmVkZ2UtPmRldjsKKworCXJldHVybiBycG1zZ19yZWdpc3Rlcl9kZXZpY2UocnBkZXYpOworfQorCisvKgorICogQWxsb2NhdGUgdGhlIHFjb21fc21kX2NoYW5uZWwgb2JqZWN0IGZvciBhIG5ld2x5IGZvdW5kIHNtZCBjaGFubmVsLAorICogcmV0cmlldmluZyBhbmQgdmFsaWRhdGluZyB0aGUgc21lbSBpdGVtcyBpbnZvbHZlZC4KKyAqLworc3RhdGljIHN0cnVjdCBxY29tX3NtZF9jaGFubmVsICpxY29tX3NtZF9jcmVhdGVfY2hhbm5lbChzdHJ1Y3QgcWNvbV9zbWRfZWRnZSAqZWRnZSwKKwkJCQkJCQl1bnNpZ25lZCBzbWVtX2luZm9faXRlbSwKKwkJCQkJCQl1bnNpZ25lZCBzbWVtX2ZpZm9faXRlbSwKKwkJCQkJCQljaGFyICpuYW1lKQoreworCXN0cnVjdCBxY29tX3NtZF9jaGFubmVsICpjaGFubmVsOworCXNpemVfdCBmaWZvX3NpemU7CisJc2l6ZV90IGluZm9fc2l6ZTsKKwl2b2lkICpmaWZvX2Jhc2U7CisJdm9pZCAqaW5mbzsKKwlpbnQgcmV0OworCisJY2hhbm5lbCA9IGRldm1fa3phbGxvYygmZWRnZS0+ZGV2LCBzaXplb2YoKmNoYW5uZWwpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoYW5uZWwpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJY2hhbm5lbC0+ZWRnZSA9IGVkZ2U7CisJY2hhbm5lbC0+bmFtZSA9IGRldm1fa3N0cmR1cCgmZWRnZS0+ZGV2LCBuYW1lLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoYW5uZWwtPm5hbWUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJbXV0ZXhfaW5pdCgmY2hhbm5lbC0+dHhfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmNoYW5uZWwtPnJlY3ZfbG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmY2hhbm5lbC0+ZmJsb2NrcmVhZF9ldmVudCk7CisKKwlpbmZvID0gcWNvbV9zbWVtX2dldChlZGdlLT5yZW1vdGVfcGlkLCBzbWVtX2luZm9faXRlbSwgJmluZm9fc2l6ZSk7CisJaWYgKElTX0VSUihpbmZvKSkgeworCQlyZXQgPSBQVFJfRVJSKGluZm8pOworCQlnb3RvIGZyZWVfbmFtZV9hbmRfY2hhbm5lbDsKKwl9CisKKwkvKgorCSAqIFVzZSB0aGUgc2l6ZSBvZiB0aGUgaXRlbSB0byBmaWd1cmUgb3V0IHdoaWNoIGNoYW5uZWwgaW5mbyBzdHJ1Y3QgdG8KKwkgKiB1c2UuCisJICovCisJaWYgKGluZm9fc2l6ZSA9PSAyICogc2l6ZW9mKHN0cnVjdCBzbWRfY2hhbm5lbF9pbmZvX3dvcmQpKSB7CisJCWNoYW5uZWwtPmluZm9fd29yZCA9IGluZm87CisJfSBlbHNlIGlmIChpbmZvX3NpemUgPT0gMiAqIHNpemVvZihzdHJ1Y3Qgc21kX2NoYW5uZWxfaW5mbykpIHsKKwkJY2hhbm5lbC0+aW5mbyA9IGluZm87CisJfSBlbHNlIHsKKwkJZGV2X2VycigmZWRnZS0+ZGV2LAorCQkJImNoYW5uZWwgaW5mbyBvZiBzaXplICV6dSBub3Qgc3VwcG9ydGVkXG4iLCBpbmZvX3NpemUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZyZWVfbmFtZV9hbmRfY2hhbm5lbDsKKwl9CisKKwlmaWZvX2Jhc2UgPSBxY29tX3NtZW1fZ2V0KGVkZ2UtPnJlbW90ZV9waWQsIHNtZW1fZmlmb19pdGVtLCAmZmlmb19zaXplKTsKKwlpZiAoSVNfRVJSKGZpZm9fYmFzZSkpIHsKKwkJcmV0ID0gIFBUUl9FUlIoZmlmb19iYXNlKTsKKwkJZ290byBmcmVlX25hbWVfYW5kX2NoYW5uZWw7CisJfQorCisJLyogVGhlIGNoYW5uZWwgY29uc2lzdCBvZiBhIHJ4IGFuZCB0eCBmaWZvIG9mIGVxdWFsIHNpemUgKi8KKwlmaWZvX3NpemUgLz0gMjsKKworCWRldl9kYmcoJmVkZ2UtPmRldiwgIm5ldyBjaGFubmVsICclcycgaW5mby1zaXplOiAlenUgZmlmby1zaXplOiAlenVcbiIsCisJCQkgIG5hbWUsIGluZm9fc2l6ZSwgZmlmb19zaXplKTsKKworCWNoYW5uZWwtPnR4X2ZpZm8gPSBmaWZvX2Jhc2U7CisJY2hhbm5lbC0+cnhfZmlmbyA9IGZpZm9fYmFzZSArIGZpZm9fc2l6ZTsKKwljaGFubmVsLT5maWZvX3NpemUgPSBmaWZvX3NpemU7CisKKwlxY29tX3NtZF9jaGFubmVsX3Jlc2V0KGNoYW5uZWwpOworCisJcmV0dXJuIGNoYW5uZWw7CisKK2ZyZWVfbmFtZV9hbmRfY2hhbm5lbDoKKwlkZXZtX2tmcmVlKCZlZGdlLT5kZXYsIGNoYW5uZWwtPm5hbWUpOworCWRldm1fa2ZyZWUoJmVkZ2UtPmRldiwgY2hhbm5lbCk7CisKKwlyZXR1cm4gRVJSX1BUUihyZXQpOworfQorCisvKgorICogU2NhbnMgdGhlIGFsbG9jYXRpb24gdGFibGUgZm9yIGFueSBuZXdseSBhbGxvY2F0ZWQgY2hhbm5lbHMsIGNhbGxzCisgKiBxY29tX3NtZF9jcmVhdGVfY2hhbm5lbCgpIHRvIGNyZWF0ZSByZXByZXNlbnRhdGlvbnMgb2YgdGhlc2UgYW5kIGFkZAorICogdGhlbSB0byB0aGUgZWRnZSdzIGxpc3Qgb2YgY2hhbm5lbHMuCisgKi8KK3N0YXRpYyB2b2lkIHFjb21fY2hhbm5lbF9zY2FuX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHFjb21fc21kX2VkZ2UgKmVkZ2UgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHFjb21fc21kX2VkZ2UsIHNjYW5fd29yayk7CisJc3RydWN0IHFjb21fc21kX2FsbG9jX2VudHJ5ICphbGxvY190Ymw7CisJc3RydWN0IHFjb21fc21kX2FsbG9jX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgcWNvbV9zbWRfY2hhbm5lbCAqY2hhbm5lbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGZpZm9faWQ7CisJdW5zaWduZWQgaW5mb19pZDsKKwlpbnQgdGJsOworCWludCBpOworCXUzMiBlZmxhZ3MsIGNpZDsKKworCWZvciAodGJsID0gMDsgdGJsIDwgU01EX0FMTE9DX1RCTF9DT1VOVDsgdGJsKyspIHsKKwkJYWxsb2NfdGJsID0gcWNvbV9zbWVtX2dldChlZGdlLT5yZW1vdGVfcGlkLAorCQkJCSAgICBzbWVtX2l0ZW1zW3RibF0uYWxsb2NfdGJsX2lkLCBOVUxMKTsKKwkJaWYgKElTX0VSUihhbGxvY190YmwpKQorCQkJY29udGludWU7CisKKwkJZm9yIChpID0gMDsgaSA8IFNNRF9BTExPQ19UQkxfU0laRTsgaSsrKSB7CisJCQllbnRyeSA9ICZhbGxvY190YmxbaV07CisJCQllZmxhZ3MgPSBsZTMyX3RvX2NwdShlbnRyeS0+ZmxhZ3MpOworCQkJaWYgKHRlc3RfYml0KGksIGVkZ2UtPmFsbG9jYXRlZFt0YmxdKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGVudHJ5LT5yZWZfY291bnQgPT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKCFlbnRyeS0+bmFtZVswXSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKCEoZWZsYWdzICYgU01EX0NIQU5ORUxfRkxBR1NfUEFDS0VUKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKChlZmxhZ3MgJiBTTURfQ0hBTk5FTF9GTEFHU19FREdFX01BU0spICE9IGVkZ2UtPmVkZ2VfaWQpCisJCQkJY29udGludWU7CisKKwkJCWNpZCA9IGxlMzJfdG9fY3B1KGVudHJ5LT5jaWQpOworCQkJaW5mb19pZCA9IHNtZW1faXRlbXNbdGJsXS5pbmZvX2Jhc2VfaWQgKyBjaWQ7CisJCQlmaWZvX2lkID0gc21lbV9pdGVtc1t0YmxdLmZpZm9fYmFzZV9pZCArIGNpZDsKKworCQkJY2hhbm5lbCA9IHFjb21fc21kX2NyZWF0ZV9jaGFubmVsKGVkZ2UsIGluZm9faWQsIGZpZm9faWQsIGVudHJ5LT5uYW1lKTsKKwkJCWlmIChJU19FUlIoY2hhbm5lbCkpCisJCQkJY29udGludWU7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZlZGdlLT5jaGFubmVsc19sb2NrLCBmbGFncyk7CisJCQlsaXN0X2FkZCgmY2hhbm5lbC0+bGlzdCwgJmVkZ2UtPmNoYW5uZWxzKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVkZ2UtPmNoYW5uZWxzX2xvY2ssIGZsYWdzKTsKKworCQkJZGV2X2RiZygmZWRnZS0+ZGV2LCAibmV3IGNoYW5uZWwgZm91bmQ6ICclcydcbiIsIGNoYW5uZWwtPm5hbWUpOworCQkJc2V0X2JpdChpLCBlZGdlLT5hbGxvY2F0ZWRbdGJsXSk7CisKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZWRnZS0+bmV3X2NoYW5uZWxfZXZlbnQpOworCQl9CisJfQorCisJc2NoZWR1bGVfd29yaygmZWRnZS0+c3RhdGVfd29yayk7Cit9CisKKy8qCisgKiBUaGlzIHBlciBlZGdlIHdvcmtlciBzY2FucyBzbWVtIGZvciBhbnkgbmV3IGNoYW5uZWxzIGFuZCByZWdpc3RlciB0aGVzZS4gSXQKKyAqIHRoZW4gc2NhbnMgYWxsIHJlZ2lzdGVyZWQgY2hhbm5lbHMgZm9yIHN0YXRlIGNoYW5nZXMgdGhhdCBzaG91bGQgYmUgaGFuZGxlZAorICogYnkgY3JlYXRpbmcgb3IgZGVzdHJveWluZyBzbWQgY2xpZW50IGRldmljZXMgZm9yIHRoZSByZWdpc3RlcmVkIGNoYW5uZWxzLgorICoKKyAqIExPQ0tJTkc6IGVkZ2UtPmNoYW5uZWxzX2xvY2sgb25seSBuZWVkcyB0byBjb3ZlciB0aGUgbGlzdCBvcGVyYXRpb25zLCBhcyB0aGUKKyAqIHdvcmtlciBpcyBraWxsZWQgYmVmb3JlIGFueSBjaGFubmVscyBhcmUgZGVhbGxvY2F0ZWQKKyAqLworc3RhdGljIHZvaWQgcWNvbV9jaGFubmVsX3N0YXRlX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHFjb21fc21kX2NoYW5uZWwgKmNoYW5uZWw7CisJc3RydWN0IHFjb21fc21kX2VkZ2UgKmVkZ2UgPSBjb250YWluZXJfb2Yod29yaywKKwkJCQkJCSAgc3RydWN0IHFjb21fc21kX2VkZ2UsCisJCQkJCQkgIHN0YXRlX3dvcmspOworCXN0cnVjdCBycG1zZ19jaGFubmVsX2luZm8gY2hpbmZvOworCXVuc2lnbmVkIHJlbW90ZV9zdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBSZWdpc3RlciBhIGRldmljZSBmb3IgYW55IGNsb3NlZCBjaGFubmVsIHdoZXJlIHRoZSByZW1vdGUgcHJvY2Vzc29yCisJICogaXMgc2hvd2luZyBpbnRlcmVzdCBpbiBvcGVuaW5nIHRoZSBjaGFubmVsLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZlZGdlLT5jaGFubmVsc19sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGFubmVsLCAmZWRnZS0+Y2hhbm5lbHMsIGxpc3QpIHsKKwkJaWYgKGNoYW5uZWwtPnN0YXRlICE9IFNNRF9DSEFOTkVMX0NMT1NFRCkKKwkJCWNvbnRpbnVlOworCisJCXJlbW90ZV9zdGF0ZSA9IEdFVF9SWF9DSEFOTkVMX0lORk8oY2hhbm5lbCwgc3RhdGUpOworCQlpZiAocmVtb3RlX3N0YXRlICE9IFNNRF9DSEFOTkVMX09QRU5JTkcgJiYKKwkJICAgIHJlbW90ZV9zdGF0ZSAhPSBTTURfQ0hBTk5FTF9PUEVORUQpCisJCQljb250aW51ZTsKKworCQlpZiAoY2hhbm5lbC0+cmVnaXN0ZXJlZCkKKwkJCWNvbnRpbnVlOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVkZ2UtPmNoYW5uZWxzX2xvY2ssIGZsYWdzKTsKKwkJcWNvbV9zbWRfY3JlYXRlX2RldmljZShjaGFubmVsKTsKKwkJY2hhbm5lbC0+cmVnaXN0ZXJlZCA9IHRydWU7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZlZGdlLT5jaGFubmVsc19sb2NrLCBmbGFncyk7CisKKwkJY2hhbm5lbC0+cmVnaXN0ZXJlZCA9IHRydWU7CisJfQorCisJLyoKKwkgKiBVbnJlZ2lzdGVyIHRoZSBkZXZpY2UgZm9yIGFueSBjaGFubmVsIHRoYXQgaXMgb3BlbmVkIHdoZXJlIHRoZQorCSAqIHJlbW90ZSBwcm9jZXNzb3IgaXMgY2xvc2luZyB0aGUgY2hhbm5lbC4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoYW5uZWwsICZlZGdlLT5jaGFubmVscywgbGlzdCkgeworCQlpZiAoY2hhbm5lbC0+c3RhdGUgIT0gU01EX0NIQU5ORUxfT1BFTklORyAmJgorCQkgICAgY2hhbm5lbC0+c3RhdGUgIT0gU01EX0NIQU5ORUxfT1BFTkVEKQorCQkJY29udGludWU7CisKKwkJcmVtb3RlX3N0YXRlID0gR0VUX1JYX0NIQU5ORUxfSU5GTyhjaGFubmVsLCBzdGF0ZSk7CisJCWlmIChyZW1vdGVfc3RhdGUgPT0gU01EX0NIQU5ORUxfT1BFTklORyB8fAorCQkgICAgcmVtb3RlX3N0YXRlID09IFNNRF9DSEFOTkVMX09QRU5FRCkKKwkJCWNvbnRpbnVlOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVkZ2UtPmNoYW5uZWxzX2xvY2ssIGZsYWdzKTsKKworCQlzdHJuY3B5KGNoaW5mby5uYW1lLCBjaGFubmVsLT5uYW1lLCBzaXplb2YoY2hpbmZvLm5hbWUpKTsKKwkJY2hpbmZvLnNyYyA9IFJQTVNHX0FERFJfQU5ZOworCQljaGluZm8uZHN0ID0gUlBNU0dfQUREUl9BTlk7CisJCXJwbXNnX3VucmVnaXN0ZXJfZGV2aWNlKCZlZGdlLT5kZXYsICZjaGluZm8pOworCQljaGFubmVsLT5yZWdpc3RlcmVkID0gZmFsc2U7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZlZGdlLT5jaGFubmVsc19sb2NrLCBmbGFncyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVkZ2UtPmNoYW5uZWxzX2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIFBhcnNlcyBhbiBvZl9ub2RlIGRlc2NyaWJpbmcgYW4gZWRnZS4KKyAqLworc3RhdGljIGludCBxY29tX3NtZF9wYXJzZV9lZGdlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkgICAgICAgc3RydWN0IHFjb21fc21kX2VkZ2UgKmVkZ2UpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpzeXNjb25fbnA7CisJY29uc3QgY2hhciAqa2V5OworCWludCBpcnE7CisJaW50IHJldDsKKworCUlOSVRfTElTVF9IRUFEKCZlZGdlLT5jaGFubmVscyk7CisJc3Bpbl9sb2NrX2luaXQoJmVkZ2UtPmNoYW5uZWxzX2xvY2spOworCisJSU5JVF9XT1JLKCZlZGdlLT5zY2FuX3dvcmssIHFjb21fY2hhbm5lbF9zY2FuX3dvcmtlcik7CisJSU5JVF9XT1JLKCZlZGdlLT5zdGF0ZV93b3JrLCBxY29tX2NoYW5uZWxfc3RhdGVfd29ya2VyKTsKKworCWVkZ2UtPm9mX25vZGUgPSBvZl9ub2RlX2dldChub2RlKTsKKworCWtleSA9ICJxY29tLHNtZC1lZGdlIjsKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCBrZXksICZlZGdlLT5lZGdlX2lkKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZWRnZSBtaXNzaW5nICVzIHByb3BlcnR5XG4iLCBrZXkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwllZGdlLT5yZW1vdGVfcGlkID0gUUNPTV9TTUVNX0hPU1RfQU5ZOworCWtleSA9ICJxY29tLHJlbW90ZS1waWQiOworCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsIGtleSwgJmVkZ2UtPnJlbW90ZV9waWQpOworCisJc3lzY29uX25wID0gb2ZfcGFyc2VfcGhhbmRsZShub2RlLCAicWNvbSxpcGMiLCAwKTsKKwlpZiAoIXN5c2Nvbl9ucCkgeworCQlkZXZfZXJyKGRldiwgIm5vIHFjb20saXBjIG5vZGVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwllZGdlLT5pcGNfcmVnbWFwID0gc3lzY29uX25vZGVfdG9fcmVnbWFwKHN5c2Nvbl9ucCk7CisJaWYgKElTX0VSUihlZGdlLT5pcGNfcmVnbWFwKSkKKwkJcmV0dXJuIFBUUl9FUlIoZWRnZS0+aXBjX3JlZ21hcCk7CisKKwlrZXkgPSAicWNvbSxpcGMiOworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2luZGV4KG5vZGUsIGtleSwgMSwgJmVkZ2UtPmlwY19vZmZzZXQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAibm8gb2Zmc2V0IGluICVzXG4iLCBrZXkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleChub2RlLCBrZXksIDIsICZlZGdlLT5pcGNfYml0KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIm5vIGJpdCBpbiAlc1xuIiwga2V5KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobm9kZSwgMCk7CisJaWYgKGlycSA8IDApIHsKKwkJZGV2X2VycihkZXYsICJyZXF1aXJlZCBzbWQgaW50ZXJydXB0IG1pc3NpbmdcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgaXJxLAorCQkJICAgICAgIHFjb21fc21kX2VkZ2VfaW50ciwgSVJRRl9UUklHR0VSX1JJU0lORywKKwkJCSAgICAgICBub2RlLT5uYW1lLCBlZGdlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3Qgc21kIGlycVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJZWRnZS0+aXJxID0gaXJxOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWxlYXNlIGZ1bmN0aW9uIGZvciBhbiBlZGdlLgorICAqIFJlc2V0IHRoZSBzdGF0ZSBvZiBlYWNoIGFzc29jaWF0ZWQgY2hhbm5lbCBhbmQgZnJlZSB0aGUgZWRnZSBjb250ZXh0LgorICovCitzdGF0aWMgdm9pZCBxY29tX3NtZF9lZGdlX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBxY29tX3NtZF9jaGFubmVsICpjaGFubmVsOworCXN0cnVjdCBxY29tX3NtZF9lZGdlICplZGdlID0gdG9fc21kX2VkZ2UoZGV2KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hhbm5lbCwgJmVkZ2UtPmNoYW5uZWxzLCBsaXN0KSB7CisJCVNFVF9SWF9DSEFOTkVMX0lORk8oY2hhbm5lbCwgc3RhdGUsIFNNRF9DSEFOTkVMX0NMT1NFRCk7CisJCVNFVF9SWF9DSEFOTkVMX0lORk8oY2hhbm5lbCwgaGVhZCwgMCk7CisJCVNFVF9SWF9DSEFOTkVMX0lORk8oY2hhbm5lbCwgdGFpbCwgMCk7CisJfQorCisJa2ZyZWUoZWRnZSk7Cit9CisKKy8qKgorICogcWNvbV9zbWRfcmVnaXN0ZXJfZWRnZSgpIC0gcmVnaXN0ZXIgYW4gZWRnZSBiYXNlZCBvbiBhbiBkZXZpY2Vfbm9kZQorICogQHBhcmVudDogICAgcGFyZW50IGRldmljZSBmb3IgdGhlIGVkZ2UKKyAqIEBub2RlOiAgICAgIGRldmljZV9ub2RlIGRlc2NyaWJpbmcgdGhlIGVkZ2UKKyAqCisgKiBSZXR1cm5zIGFuIGVkZ2UgcmVmZXJlbmNlLCBvciBuZWdhdGl2ZSBFUlJfUFRSKCkgb24gZmFpbHVyZS4KKyAqLworc3RydWN0IHFjb21fc21kX2VkZ2UgKnFjb21fc21kX3JlZ2lzdGVyX2VkZ2Uoc3RydWN0IGRldmljZSAqcGFyZW50LAorCQkJCQkgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgcWNvbV9zbWRfZWRnZSAqZWRnZTsKKwlpbnQgcmV0OworCisJZWRnZSA9IGt6YWxsb2Moc2l6ZW9mKCplZGdlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlZGdlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmVkZ2UtPm5ld19jaGFubmVsX2V2ZW50KTsKKworCWVkZ2UtPmRldi5wYXJlbnQgPSBwYXJlbnQ7CisJZWRnZS0+ZGV2LnJlbGVhc2UgPSBxY29tX3NtZF9lZGdlX3JlbGVhc2U7CisJZGV2X3NldF9uYW1lKCZlZGdlLT5kZXYsICIlczolcyIsIGRldl9uYW1lKHBhcmVudCksIG5vZGUtPm5hbWUpOworCXJldCA9IGRldmljZV9yZWdpc3RlcigmZWRnZS0+ZGV2KTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiZmFpbGVkIHRvIHJlZ2lzdGVyIHNtZCBlZGdlXG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisKKwlyZXQgPSBxY29tX3NtZF9wYXJzZV9lZGdlKCZlZGdlLT5kZXYsIG5vZGUsIGVkZ2UpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmZWRnZS0+ZGV2LCAiZmFpbGVkIHRvIHBhcnNlIHNtZCBlZGdlXG4iKTsKKwkJZ290byB1bnJlZ2lzdGVyX2RldjsKKwl9CisKKwlzY2hlZHVsZV93b3JrKCZlZGdlLT5zY2FuX3dvcmspOworCisJcmV0dXJuIGVkZ2U7CisKK3VucmVnaXN0ZXJfZGV2OgorCXB1dF9kZXZpY2UoJmVkZ2UtPmRldik7CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KK0VYUE9SVF9TWU1CT0wocWNvbV9zbWRfcmVnaXN0ZXJfZWRnZSk7CisKK3N0YXRpYyBpbnQgcWNvbV9zbWRfcmVtb3ZlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHFjb21fc21kX3VucmVnaXN0ZXJfZWRnZSgpIC0gcmVsZWFzZSBhbiBlZGdlIGFuZCBpdHMgY2hpbGRyZW4KKyAqIEBlZGdlOiAgICAgIGVkZ2UgcmVmZXJlbmNlIGFjcXVpcmVkIGZyb20gcWNvbV9zbWRfcmVnaXN0ZXJfZWRnZQorICovCitpbnQgcWNvbV9zbWRfdW5yZWdpc3Rlcl9lZGdlKHN0cnVjdCBxY29tX3NtZF9lZGdlICplZGdlKQoreworCWludCByZXQ7CisKKwlkaXNhYmxlX2lycShlZGdlLT5pcnEpOworCWNhbmNlbF93b3JrX3N5bmMoJmVkZ2UtPnNjYW5fd29yayk7CisJY2FuY2VsX3dvcmtfc3luYygmZWRnZS0+c3RhdGVfd29yayk7CisKKwlyZXQgPSBkZXZpY2VfZm9yX2VhY2hfY2hpbGQoJmVkZ2UtPmRldiwgTlVMTCwgcWNvbV9zbWRfcmVtb3ZlX2RldmljZSk7CisJaWYgKHJldCkKKwkJZGV2X3dhcm4oJmVkZ2UtPmRldiwgImNhbid0IHJlbW92ZSBzbWQgZGV2aWNlOiAlZFxuIiwgcmV0KTsKKworCWRldmljZV91bnJlZ2lzdGVyKCZlZGdlLT5kZXYpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHFjb21fc21kX3VucmVnaXN0ZXJfZWRnZSk7CisKK3N0YXRpYyBpbnQgcWNvbV9zbWRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CisJdm9pZCAqcDsKKworCS8qIFdhaXQgZm9yIHNtZW0gKi8KKwlwID0gcWNvbV9zbWVtX2dldChRQ09NX1NNRU1fSE9TVF9BTlksIHNtZW1faXRlbXNbMF0uYWxsb2NfdGJsX2lkLCBOVUxMKTsKKwlpZiAoUFRSX0VSUihwKSA9PSAtRVBST0JFX0RFRkVSKQorCQlyZXR1cm4gUFRSX0VSUihwKTsKKworCWZvcl9lYWNoX2F2YWlsYWJsZV9jaGlsZF9vZl9ub2RlKHBkZXYtPmRldi5vZl9ub2RlLCBub2RlKQorCQlxY29tX3NtZF9yZWdpc3Rlcl9lZGdlKCZwZGV2LT5kZXYsIG5vZGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcWNvbV9zbWRfcmVtb3ZlX2VkZ2Uoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBxY29tX3NtZF9lZGdlICplZGdlID0gdG9fc21kX2VkZ2UoZGV2KTsKKworCXJldHVybiBxY29tX3NtZF91bnJlZ2lzdGVyX2VkZ2UoZWRnZSk7Cit9CisKKy8qCisgKiBTaHV0IGRvd24gYWxsIHNtZCBjbGllbnRzIGJ5IG1ha2luZyBzdXJlIHRoYXQgZWFjaCBlZGdlIHN0b3BzIHByb2Nlc3NpbmcKKyAqIGV2ZW50cyBhbmQgc2Nhbm5pbmcgZm9yIG5ldyBjaGFubmVscywgdGhlbiBjYWxsIGRlc3Ryb3kgb24gdGhlIGRldmljZXMuCisgKi8KK3N0YXRpYyBpbnQgcWNvbV9zbWRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldDsKKworCXJldCA9IGRldmljZV9mb3JfZWFjaF9jaGlsZCgmcGRldi0+ZGV2LCBOVUxMLCBxY29tX3NtZF9yZW1vdmVfZWRnZSk7CisJaWYgKHJldCkKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImNhbid0IHJlbW92ZSBzbWQgZGV2aWNlOiAlZFxuIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHFjb21fc21kX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJxY29tLHNtZCIgfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHFjb21fc21kX29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcWNvbV9zbWRfZHJpdmVyID0geworCS5wcm9iZSA9IHFjb21fc21kX3Byb2JlLAorCS5yZW1vdmUgPSBxY29tX3NtZF9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAicWNvbS1zbWQiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBxY29tX3NtZF9vZl9tYXRjaCwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgcWNvbV9zbWRfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnFjb21fc21kX2RyaXZlcik7Cit9CitzdWJzeXNfaW5pdGNhbGwocWNvbV9zbWRfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBxY29tX3NtZF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnFjb21fc21kX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChxY29tX3NtZF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQmpvcm4gQW5kZXJzc29uIDxiam9ybi5hbmRlcnNzb25Ac29ueW1vYmlsZS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlF1YWxjb21tIFNoYXJlZCBNZW1vcnkgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JwbXNnL3JwbXNnX2NvcmUuYyBiL2RyaXZlcnMvcnBtc2cvcnBtc2dfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZWE5ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3JwbXNnL3JwbXNnX2NvcmUuYwpAQCAtMCwwICsxLDQ5OCBAQAorLyoKKyAqIHJlbW90ZSBwcm9jZXNzb3IgbWVzc2FnaW5nIGJ1cworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSwgSW5jLgorICoKKyAqIE9oYWQgQmVuLUNvaGVuIDxvaGFkQHdpemVyeS5jb20+CisgKiBCcmlhbiBTd2V0bGFuZCA8c3dldGxhbmRAZ29vZ2xlLmNvbT4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgIiVzOiAiIGZtdCwgX19mdW5jX18KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JwbXNnLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAicnBtc2dfaW50ZXJuYWwuaCIKKworLyoqCisgKiBycG1zZ19jcmVhdGVfZXB0KCkgLSBjcmVhdGUgYSBuZXcgcnBtc2dfZW5kcG9pbnQKKyAqIEBycGRldjogcnBtc2cgY2hhbm5lbCBkZXZpY2UKKyAqIEBjYjogcnggY2FsbGJhY2sgaGFuZGxlcgorICogQHByaXY6IHByaXZhdGUgZGF0YSBmb3IgdGhlIGRyaXZlcidzIHVzZQorICogQGNoaW5mbzogY2hhbm5lbF9pbmZvIHdpdGggdGhlIGxvY2FsIHJwbXNnIGFkZHJlc3MgdG8gYmluZCB3aXRoIEBjYgorICoKKyAqIEV2ZXJ5IHJwbXNnIGFkZHJlc3MgaW4gdGhlIHN5c3RlbSBpcyBib3VuZCB0byBhbiByeCBjYWxsYmFjayAoc28gd2hlbgorICogaW5ib3VuZCBtZXNzYWdlcyBhcnJpdmUsIHRoZXkgYXJlIGRpc3BhdGNoZWQgYnkgdGhlIHJwbXNnIGJ1cyB1c2luZyB0aGUKKyAqIGFwcHJvcHJpYXRlIGNhbGxiYWNrIGhhbmRsZXIpIGJ5IG1lYW5zIG9mIGFuIHJwbXNnX2VuZHBvaW50IHN0cnVjdC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyBkcml2ZXJzIHRvIGNyZWF0ZSBzdWNoIGFuIGVuZHBvaW50LCBhbmQgYnkgdGhhdCwKKyAqIGJpbmQgYSBjYWxsYmFjaywgYW5kIHBvc3NpYmx5IHNvbWUgcHJpdmF0ZSBkYXRhIHRvbywgdG8gYW4gcnBtc2cgYWRkcmVzcworICogKGVpdGhlciBvbmUgdGhhdCBpcyBrbm93biBpbiBhZHZhbmNlLCBvciBvbmUgdGhhdCB3aWxsIGJlIGR5bmFtaWNhbGx5CisgKiBhc3NpZ25lZCBmb3IgdGhlbSkuCisgKgorICogU2ltcGxlIHJwbXNnIGRyaXZlcnMgbmVlZCBub3QgY2FsbCBycG1zZ19jcmVhdGVfZXB0LCBiZWNhdXNlIGFuIGVuZHBvaW50CisgKiBpcyBhbHJlYWR5IGNyZWF0ZWQgZm9yIHRoZW0gd2hlbiB0aGV5IGFyZSBwcm9iZWQgYnkgdGhlIHJwbXNnIGJ1cworICogKHVzaW5nIHRoZSByeCBjYWxsYmFjayBwcm92aWRlZCB3aGVuIHRoZXkgcmVnaXN0ZXJlZCB0byB0aGUgcnBtc2cgYnVzKS4KKyAqCisgKiBTbyB0aGluZ3Mgc2hvdWxkIGp1c3Qgd29yayBmb3Igc2ltcGxlIGRyaXZlcnM6IHRoZXkgYWxyZWFkeSBoYXZlIGFuCisgKiBlbmRwb2ludCwgdGhlaXIgcnggY2FsbGJhY2sgaXMgYm91bmQgdG8gdGhlaXIgcnBtc2cgYWRkcmVzcywgYW5kIHdoZW4KKyAqIHJlbGV2YW50IGluYm91bmQgbWVzc2FnZXMgYXJyaXZlIChpLmUuIG1lc3NhZ2VzIHdoaWNoIHRoZWlyIGRzdCBhZGRyZXNzCisgKiBlcXVhbHMgdG8gdGhlIHNyYyBhZGRyZXNzIG9mIHRoZWlyIHJwbXNnIGNoYW5uZWwpLCB0aGUgZHJpdmVyJ3MgaGFuZGxlcgorICogaXMgaW52b2tlZCB0byBwcm9jZXNzIGl0LgorICoKKyAqIFRoYXQgc2FpZCwgbW9yZSBjb21wbGljYXRlZCBkcml2ZXJzIG1pZ2h0IGRvIG5lZWQgdG8gYWxsb2NhdGUKKyAqIGFkZGl0aW9uYWwgcnBtc2cgYWRkcmVzc2VzLCBhbmQgYmluZCB0aGVtIHRvIGRpZmZlcmVudCByeCBjYWxsYmFja3MuCisgKiBUbyBhY2NvbXBsaXNoIHRoYXQsIHRob3NlIGRyaXZlcnMgbmVlZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24uCisgKgorICogRHJpdmVycyBzaG91bGQgcHJvdmlkZSB0aGVpciBAcnBkZXYgY2hhbm5lbCAoc28gdGhlIG5ldyBlbmRwb2ludCB3b3VsZCBiZWxvbmcKKyAqIHRvIHRoZSBzYW1lIHJlbW90ZSBwcm9jZXNzb3IgdGhlaXIgY2hhbm5lbCBiZWxvbmdzIHRvKSwgYW4gcnggY2FsbGJhY2sKKyAqIGZ1bmN0aW9uLCBhbiBvcHRpb25hbCBwcml2YXRlIGRhdGEgKHdoaWNoIGlzIHByb3ZpZGVkIGJhY2sgd2hlbiB0aGUKKyAqIHJ4IGNhbGxiYWNrIGlzIGludm9rZWQpLCBhbmQgYW4gYWRkcmVzcyB0aGV5IHdhbnQgdG8gYmluZCB3aXRoIHRoZQorICogY2FsbGJhY2suIElmIEBhZGRyIGlzIFJQTVNHX0FERFJfQU5ZLCB0aGVuIHJwbXNnX2NyZWF0ZV9lcHQgd2lsbAorICogZHluYW1pY2FsbHkgYXNzaWduIHRoZW0gYW4gYXZhaWxhYmxlIHJwbXNnIGFkZHJlc3MgKGRyaXZlcnMgc2hvdWxkIGhhdmUKKyAqIGEgdmVyeSBnb29kIHJlYXNvbiB3aHkgbm90IHRvIGFsd2F5cyB1c2UgUlBNU0dfQUREUl9BTlkgaGVyZSkuCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGVuZHBvaW50IG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZXJyb3IuCisgKi8KK3N0cnVjdCBycG1zZ19lbmRwb2ludCAqcnBtc2dfY3JlYXRlX2VwdChzdHJ1Y3QgcnBtc2dfZGV2aWNlICpycGRldiwKKwkJCQkJcnBtc2dfcnhfY2JfdCBjYiwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHJwbXNnX2NoYW5uZWxfaW5mbyBjaGluZm8pCit7CisJcmV0dXJuIHJwZGV2LT5vcHMtPmNyZWF0ZV9lcHQocnBkZXYsIGNiLCBwcml2LCBjaGluZm8pOworfQorRVhQT1JUX1NZTUJPTChycG1zZ19jcmVhdGVfZXB0KTsKKworLyoqCisgKiBycG1zZ19kZXN0cm95X2VwdCgpIC0gZGVzdHJveSBhbiBleGlzdGluZyBycG1zZyBlbmRwb2ludAorICogQGVwdDogZW5kcG9pbmcgdG8gZGVzdHJveQorICoKKyAqIFNob3VsZCBiZSB1c2VkIGJ5IGRyaXZlcnMgdG8gZGVzdHJveSBhbiBycG1zZyBlbmRwb2ludCBwcmV2aW91c2x5CisgKiBjcmVhdGVkIHdpdGggcnBtc2dfY3JlYXRlX2VwdCgpLgorICovCit2b2lkIHJwbXNnX2Rlc3Ryb3lfZXB0KHN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0KQoreworCWVwdC0+b3BzLT5kZXN0cm95X2VwdChlcHQpOworfQorRVhQT1JUX1NZTUJPTChycG1zZ19kZXN0cm95X2VwdCk7CisKKy8qKgorICogcnBtc2dfc2VuZCgpIC0gc2VuZCBhIG1lc3NhZ2UgYWNyb3NzIHRvIHRoZSByZW1vdGUgcHJvY2Vzc29yCisgKiBAZXB0OiB0aGUgcnBtc2cgZW5kcG9pbnQKKyAqIEBkYXRhOiBwYXlsb2FkIG9mIG1lc3NhZ2UKKyAqIEBsZW46IGxlbmd0aCBvZiBwYXlsb2FkCisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyBAZGF0YSBvZiBsZW5ndGggQGxlbiBvbiB0aGUgQGVwdCBlbmRwb2ludC4KKyAqIFRoZSBtZXNzYWdlIHdpbGwgYmUgc2VudCB0byB0aGUgcmVtb3RlIHByb2Nlc3NvciB3aGljaCB0aGUgQGVwdAorICogZW5kcG9pbnQgYmVsb25ncyB0bywgdXNpbmcgQGVwdCdzIGFkZHJlc3MgYW5kIGl0cyBhc3NvY2lhdGVkIHJwbXNnCisgKiBkZXZpY2UgZGVzdGluYXRpb24gYWRkcmVzc2VzLgorICogSW4gY2FzZSB0aGVyZSBhcmUgbm8gVFggYnVmZmVycyBhdmFpbGFibGUsIHRoZSBmdW5jdGlvbiB3aWxsIGJsb2NrIHVudGlsCisgKiBvbmUgYmVjb21lcyBhdmFpbGFibGUsIG9yIGEgdGltZW91dCBvZiAxNSBzZWNvbmRzIGVsYXBzZXMuIFdoZW4gdGhlIGxhdHRlcgorICogaGFwcGVucywgLUVSRVNUQVJUU1lTIGlzIHJldHVybmVkLgorICoKKyAqIENhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIHByb2Nlc3MgY29udGV4dCAoZm9yIG5vdykuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIHZhbHVlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBycG1zZ19zZW5kKHN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0LCB2b2lkICpkYXRhLCBpbnQgbGVuKQoreworCXJldHVybiBlcHQtPm9wcy0+c2VuZChlcHQsIGRhdGEsIGxlbik7Cit9CitFWFBPUlRfU1lNQk9MKHJwbXNnX3NlbmQpOworCisvKioKKyAqIHJwbXNnX3NlbmR0bygpIC0gc2VuZCBhIG1lc3NhZ2UgYWNyb3NzIHRvIHRoZSByZW1vdGUgcHJvY2Vzc29yLCBzcGVjaWZ5IGRzdAorICogQGVwdDogdGhlIHJwbXNnIGVuZHBvaW50CisgKiBAZGF0YTogcGF5bG9hZCBvZiBtZXNzYWdlCisgKiBAbGVuOiBsZW5ndGggb2YgcGF5bG9hZAorICogQGRzdDogZGVzdGluYXRpb24gYWRkcmVzcworICoKKyAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgQGRhdGEgb2YgbGVuZ3RoIEBsZW4gdG8gdGhlIHJlbW90ZSBAZHN0IGFkZHJlc3MuCisgKiBUaGUgbWVzc2FnZSB3aWxsIGJlIHNlbnQgdG8gdGhlIHJlbW90ZSBwcm9jZXNzb3Igd2hpY2ggdGhlIEBlcHQKKyAqIGVuZHBvaW50IGJlbG9uZ3MgdG8sIHVzaW5nIEBlcHQncyBhZGRyZXNzIGFzIHNvdXJjZS4KKyAqIEluIGNhc2UgdGhlcmUgYXJlIG5vIFRYIGJ1ZmZlcnMgYXZhaWxhYmxlLCB0aGUgZnVuY3Rpb24gd2lsbCBibG9jayB1bnRpbAorICogb25lIGJlY29tZXMgYXZhaWxhYmxlLCBvciBhIHRpbWVvdXQgb2YgMTUgc2Vjb25kcyBlbGFwc2VzLiBXaGVuIHRoZSBsYXR0ZXIKKyAqIGhhcHBlbnMsIC1FUkVTVEFSVFNZUyBpcyByZXR1cm5lZC4KKyAqCisgKiBDYW4gb25seSBiZSBjYWxsZWQgZnJvbSBwcm9jZXNzIGNvbnRleHQgKGZvciBub3cpLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCBhbiBhcHByb3ByaWF0ZSBlcnJvciB2YWx1ZSBvbiBmYWlsdXJlLgorICovCitpbnQgcnBtc2dfc2VuZHRvKHN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0LCB2b2lkICpkYXRhLCBpbnQgbGVuLCB1MzIgZHN0KQoreworCXJldHVybiBlcHQtPm9wcy0+c2VuZHRvKGVwdCwgZGF0YSwgbGVuLCBkc3QpOworfQorRVhQT1JUX1NZTUJPTChycG1zZ19zZW5kdG8pOworCisvKioKKyAqIHJwbXNnX3NlbmRfb2ZmY2hhbm5lbCgpIC0gc2VuZCBhIG1lc3NhZ2UgdXNpbmcgZXhwbGljaXQgc3JjL2RzdCBhZGRyZXNzZXMKKyAqIEBlcHQ6IHRoZSBycG1zZyBlbmRwb2ludAorICogQHNyYzogc291cmNlIGFkZHJlc3MKKyAqIEBkc3Q6IGRlc3RpbmF0aW9uIGFkZHJlc3MKKyAqIEBkYXRhOiBwYXlsb2FkIG9mIG1lc3NhZ2UKKyAqIEBsZW46IGxlbmd0aCBvZiBwYXlsb2FkCisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyBAZGF0YSBvZiBsZW5ndGggQGxlbiB0byB0aGUgcmVtb3RlIEBkc3QgYWRkcmVzcywKKyAqIGFuZCB1c2VzIEBzcmMgYXMgdGhlIHNvdXJjZSBhZGRyZXNzLgorICogVGhlIG1lc3NhZ2Ugd2lsbCBiZSBzZW50IHRvIHRoZSByZW1vdGUgcHJvY2Vzc29yIHdoaWNoIHRoZSBAZXB0CisgKiBlbmRwb2ludCBiZWxvbmdzIHRvLgorICogSW4gY2FzZSB0aGVyZSBhcmUgbm8gVFggYnVmZmVycyBhdmFpbGFibGUsIHRoZSBmdW5jdGlvbiB3aWxsIGJsb2NrIHVudGlsCisgKiBvbmUgYmVjb21lcyBhdmFpbGFibGUsIG9yIGEgdGltZW91dCBvZiAxNSBzZWNvbmRzIGVsYXBzZXMuIFdoZW4gdGhlIGxhdHRlcgorICogaGFwcGVucywgLUVSRVNUQVJUU1lTIGlzIHJldHVybmVkLgorICoKKyAqIENhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIHByb2Nlc3MgY29udGV4dCAoZm9yIG5vdykuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIHZhbHVlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBycG1zZ19zZW5kX29mZmNoYW5uZWwoc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQsIHUzMiBzcmMsIHUzMiBkc3QsCisJCQkgIHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJcmV0dXJuIGVwdC0+b3BzLT5zZW5kX29mZmNoYW5uZWwoZXB0LCBzcmMsIGRzdCwgZGF0YSwgbGVuKTsKK30KK0VYUE9SVF9TWU1CT0wocnBtc2dfc2VuZF9vZmZjaGFubmVsKTsKKworLyoqCisgKiBycG1zZ19zZW5kKCkgLSBzZW5kIGEgbWVzc2FnZSBhY3Jvc3MgdG8gdGhlIHJlbW90ZSBwcm9jZXNzb3IKKyAqIEBlcHQ6IHRoZSBycG1zZyBlbmRwb2ludAorICogQGRhdGE6IHBheWxvYWQgb2YgbWVzc2FnZQorICogQGxlbjogbGVuZ3RoIG9mIHBheWxvYWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIEBkYXRhIG9mIGxlbmd0aCBAbGVuIG9uIHRoZSBAZXB0IGVuZHBvaW50LgorICogVGhlIG1lc3NhZ2Ugd2lsbCBiZSBzZW50IHRvIHRoZSByZW1vdGUgcHJvY2Vzc29yIHdoaWNoIHRoZSBAZXB0CisgKiBlbmRwb2ludCBiZWxvbmdzIHRvLCB1c2luZyBAZXB0J3MgYWRkcmVzcyBhcyBzb3VyY2UgYW5kIGl0cyBhc3NvY2lhdGVkCisgKiBycGRldidzIGFkZHJlc3MgYXMgZGVzdGluYXRpb24uCisgKiBJbiBjYXNlIHRoZXJlIGFyZSBubyBUWCBidWZmZXJzIGF2YWlsYWJsZSwgdGhlIGZ1bmN0aW9uIHdpbGwgaW1tZWRpYXRlbHkKKyAqIHJldHVybiAtRU5PTUVNIHdpdGhvdXQgd2FpdGluZyB1bnRpbCBvbmUgYmVjb21lcyBhdmFpbGFibGUuCisgKgorICogQ2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gcHJvY2VzcyBjb250ZXh0IChmb3Igbm93KS4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3IgdmFsdWUgb24gZmFpbHVyZS4KKyAqLworaW50IHJwbXNnX3RyeXNlbmQoc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQsIHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJcmV0dXJuIGVwdC0+b3BzLT50cnlzZW5kKGVwdCwgZGF0YSwgbGVuKTsKK30KK0VYUE9SVF9TWU1CT0wocnBtc2dfdHJ5c2VuZCk7CisKKy8qKgorICogcnBtc2dfc2VuZHRvKCkgLSBzZW5kIGEgbWVzc2FnZSBhY3Jvc3MgdG8gdGhlIHJlbW90ZSBwcm9jZXNzb3IsIHNwZWNpZnkgZHN0CisgKiBAZXB0OiB0aGUgcnBtc2cgZW5kcG9pbnQKKyAqIEBkYXRhOiBwYXlsb2FkIG9mIG1lc3NhZ2UKKyAqIEBsZW46IGxlbmd0aCBvZiBwYXlsb2FkCisgKiBAZHN0OiBkZXN0aW5hdGlvbiBhZGRyZXNzCisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyBAZGF0YSBvZiBsZW5ndGggQGxlbiB0byB0aGUgcmVtb3RlIEBkc3QgYWRkcmVzcy4KKyAqIFRoZSBtZXNzYWdlIHdpbGwgYmUgc2VudCB0byB0aGUgcmVtb3RlIHByb2Nlc3NvciB3aGljaCB0aGUgQGVwdAorICogZW5kcG9pbnQgYmVsb25ncyB0bywgdXNpbmcgQGVwdCdzIGFkZHJlc3MgYXMgc291cmNlLgorICogSW4gY2FzZSB0aGVyZSBhcmUgbm8gVFggYnVmZmVycyBhdmFpbGFibGUsIHRoZSBmdW5jdGlvbiB3aWxsIGltbWVkaWF0ZWx5CisgKiByZXR1cm4gLUVOT01FTSB3aXRob3V0IHdhaXRpbmcgdW50aWwgb25lIGJlY29tZXMgYXZhaWxhYmxlLgorICoKKyAqIENhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIHByb2Nlc3MgY29udGV4dCAoZm9yIG5vdykuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIHZhbHVlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBycG1zZ190cnlzZW5kdG8oc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQsIHZvaWQgKmRhdGEsIGludCBsZW4sIHUzMiBkc3QpCit7CisJcmV0dXJuIGVwdC0+b3BzLT50cnlzZW5kdG8oZXB0LCBkYXRhLCBsZW4sIGRzdCk7Cit9CitFWFBPUlRfU1lNQk9MKHJwbXNnX3RyeXNlbmR0byk7CisKKy8qKgorICogcnBtc2dfc2VuZF9vZmZjaGFubmVsKCkgLSBzZW5kIGEgbWVzc2FnZSB1c2luZyBleHBsaWNpdCBzcmMvZHN0IGFkZHJlc3NlcworICogQGVwdDogdGhlIHJwbXNnIGVuZHBvaW50CisgKiBAc3JjOiBzb3VyY2UgYWRkcmVzcworICogQGRzdDogZGVzdGluYXRpb24gYWRkcmVzcworICogQGRhdGE6IHBheWxvYWQgb2YgbWVzc2FnZQorICogQGxlbjogbGVuZ3RoIG9mIHBheWxvYWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIEBkYXRhIG9mIGxlbmd0aCBAbGVuIHRvIHRoZSByZW1vdGUgQGRzdCBhZGRyZXNzLAorICogYW5kIHVzZXMgQHNyYyBhcyB0aGUgc291cmNlIGFkZHJlc3MuCisgKiBUaGUgbWVzc2FnZSB3aWxsIGJlIHNlbnQgdG8gdGhlIHJlbW90ZSBwcm9jZXNzb3Igd2hpY2ggdGhlIEBlcHQKKyAqIGVuZHBvaW50IGJlbG9uZ3MgdG8uCisgKiBJbiBjYXNlIHRoZXJlIGFyZSBubyBUWCBidWZmZXJzIGF2YWlsYWJsZSwgdGhlIGZ1bmN0aW9uIHdpbGwgaW1tZWRpYXRlbHkKKyAqIHJldHVybiAtRU5PTUVNIHdpdGhvdXQgd2FpdGluZyB1bnRpbCBvbmUgYmVjb21lcyBhdmFpbGFibGUuCisgKgorICogQ2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gcHJvY2VzcyBjb250ZXh0IChmb3Igbm93KS4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3IgdmFsdWUgb24gZmFpbHVyZS4KKyAqLworaW50IHJwbXNnX3RyeXNlbmRfb2ZmY2hhbm5lbChzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdCwgdTMyIHNyYywgdTMyIGRzdCwKKwkJCSAgICAgdm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKwlyZXR1cm4gZXB0LT5vcHMtPnRyeXNlbmRfb2ZmY2hhbm5lbChlcHQsIHNyYywgZHN0LCBkYXRhLCBsZW4pOworfQorRVhQT1JUX1NZTUJPTChycG1zZ190cnlzZW5kX29mZmNoYW5uZWwpOworCisvKgorICogbWF0Y2ggYW4gcnBtc2cgY2hhbm5lbCB3aXRoIGEgY2hhbm5lbCBpbmZvIHN0cnVjdC4KKyAqIHRoaXMgaXMgdXNlZCB0byBtYWtlIHN1cmUgd2UncmUgbm90IGNyZWF0aW5nIHJwbXNnIGRldmljZXMgZm9yIGNoYW5uZWxzCisgKiB0aGF0IGFscmVhZHkgZXhpc3QuCisgKi8KK3N0YXRpYyBpbnQgcnBtc2dfZGV2aWNlX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcnBtc2dfY2hhbm5lbF9pbmZvICpjaGluZm8gPSBkYXRhOworCXN0cnVjdCBycG1zZ19kZXZpY2UgKnJwZGV2ID0gdG9fcnBtc2dfZGV2aWNlKGRldik7CisKKwlpZiAoY2hpbmZvLT5zcmMgIT0gUlBNU0dfQUREUl9BTlkgJiYgY2hpbmZvLT5zcmMgIT0gcnBkZXYtPnNyYykKKwkJcmV0dXJuIDA7CisKKwlpZiAoY2hpbmZvLT5kc3QgIT0gUlBNU0dfQUREUl9BTlkgJiYgY2hpbmZvLT5kc3QgIT0gcnBkZXYtPmRzdCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc3RybmNtcChjaGluZm8tPm5hbWUsIHJwZGV2LT5pZC5uYW1lLCBSUE1TR19OQU1FX1NJWkUpKQorCQlyZXR1cm4gMDsKKworCS8qIGZvdW5kIGEgbWF0Y2ggISAqLworCXJldHVybiAxOworfQorCitzdHJ1Y3QgZGV2aWNlICpycG1zZ19maW5kX2RldmljZShzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCisJCQkJIHN0cnVjdCBycG1zZ19jaGFubmVsX2luZm8gKmNoaW5mbykKK3sKKwlyZXR1cm4gZGV2aWNlX2ZpbmRfY2hpbGQocGFyZW50LCBjaGluZm8sIHJwbXNnX2RldmljZV9tYXRjaCk7CisKK30KK0VYUE9SVF9TWU1CT0wocnBtc2dfZmluZF9kZXZpY2UpOworCisvKiBzeXNmcyBzaG93IGNvbmZpZ3VyYXRpb24gZmllbGRzICovCisjZGVmaW5lIHJwbXNnX3Nob3dfYXR0cihmaWVsZCwgcGF0aCwgZm9ybWF0X3N0cmluZykJCQlcCitzdGF0aWMgc3NpemVfdAkJCQkJCQkJXAorZmllbGQjI19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwJCQkJCVwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHJwbXNnX2RldmljZSAqcnBkZXYgPSB0b19ycG1zZ19kZXZpY2UoZGV2KTsJCVwKKwkJCQkJCQkJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsIGZvcm1hdF9zdHJpbmcsIHJwZGV2LT5wYXRoKTsJCVwKK30KKworLyogZm9yIG1vcmUgaW5mbywgc2VlIERvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXJwbXNnICovCitycG1zZ19zaG93X2F0dHIobmFtZSwgaWQubmFtZSwgIiVzXG4iKTsKK3JwbXNnX3Nob3dfYXR0cihzcmMsIHNyYywgIjB4JXhcbiIpOworcnBtc2dfc2hvd19hdHRyKGRzdCwgZHN0LCAiMHgleFxuIik7CitycG1zZ19zaG93X2F0dHIoYW5ub3VuY2UsIGFubm91bmNlID8gInRydWUiIDogImZhbHNlIiwgIiVzXG4iKTsKKworc3RhdGljIHNzaXplX3QgbW9kYWxpYXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHJwbXNnX2RldmljZSAqcnBkZXYgPSB0b19ycG1zZ19kZXZpY2UoZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgUlBNU0dfREVWSUNFX01PREFMSUFTX0ZNVCAiXG4iLCBycGRldi0+aWQubmFtZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBycG1zZ19kZXZfYXR0cnNbXSA9IHsKKwlfX0FUVFJfUk8obmFtZSksCisJX19BVFRSX1JPKG1vZGFsaWFzKSwKKwlfX0FUVFJfUk8oZHN0KSwKKwlfX0FUVFJfUk8oc3JjKSwKKwlfX0FUVFJfUk8oYW5ub3VuY2UpLAorCV9fQVRUUl9OVUxMCit9OworCisvKiBycG1zZyBkZXZpY2VzIGFuZCBkcml2ZXJzIGFyZSBtYXRjaGVkIHVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJwbXNnX2lkX21hdGNoKGNvbnN0IHN0cnVjdCBycG1zZ19kZXZpY2UgKnJwZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IHJwbXNnX2RldmljZV9pZCAqaWQpCit7CisJcmV0dXJuIHN0cm5jbXAoaWQtPm5hbWUsIHJwZGV2LT5pZC5uYW1lLCBSUE1TR19OQU1FX1NJWkUpID09IDA7Cit9CisKKy8qIG1hdGNoIHJwbXNnIGNoYW5uZWwgYW5kIHJwbXNnIGRyaXZlciAqLworc3RhdGljIGludCBycG1zZ19kZXZfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCBycG1zZ19kZXZpY2UgKnJwZGV2ID0gdG9fcnBtc2dfZGV2aWNlKGRldik7CisJc3RydWN0IHJwbXNnX2RyaXZlciAqcnBkcnYgPSB0b19ycG1zZ19kcml2ZXIoZHJ2KTsKKwljb25zdCBzdHJ1Y3QgcnBtc2dfZGV2aWNlX2lkICppZHMgPSBycGRydi0+aWRfdGFibGU7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoaWRzKQorCQlmb3IgKGkgPSAwOyBpZHNbaV0ubmFtZVswXTsgaSsrKQorCQkJaWYgKHJwbXNnX2lkX21hdGNoKHJwZGV2LCAmaWRzW2ldKSkKKwkJCQlyZXR1cm4gMTsKKworCXJldHVybiBvZl9kcml2ZXJfbWF0Y2hfZGV2aWNlKGRldiwgZHJ2KTsKK30KKworc3RhdGljIGludCBycG1zZ191ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpCit7CisJc3RydWN0IHJwbXNnX2RldmljZSAqcnBkZXYgPSB0b19ycG1zZ19kZXZpY2UoZGV2KTsKKworCXJldHVybiBhZGRfdWV2ZW50X3ZhcihlbnYsICJNT0RBTElBUz0iIFJQTVNHX0RFVklDRV9NT0RBTElBU19GTVQsCisJCQkJCXJwZGV2LT5pZC5uYW1lKTsKK30KKworLyoKKyAqIHdoZW4gYW4gcnBtc2cgZHJpdmVyIGlzIHByb2JlZCB3aXRoIGEgY2hhbm5lbCwgd2Ugc2VhbWxlc3NseSBjcmVhdGUKKyAqIGl0IGFuIGVuZHBvaW50LCBiaW5kaW5nIGl0cyByeCBjYWxsYmFjayB0byBhIHVuaXF1ZSBsb2NhbCBycG1zZworICogYWRkcmVzcy4KKyAqCisgKiBpZiB3ZSBuZWVkIHRvLCB3ZSBhbHNvIGFubm91bmNlIGFib3V0IHRoaXMgY2hhbm5lbCB0byB0aGUgcmVtb3RlCisgKiBwcm9jZXNzb3IgKG5lZWRlZCBpbiBjYXNlIHRoZSBkcml2ZXIgaXMgZXhwb3NpbmcgYW4gcnBtc2cgc2VydmljZSkuCisgKi8KK3N0YXRpYyBpbnQgcnBtc2dfZGV2X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnBtc2dfZGV2aWNlICpycGRldiA9IHRvX3JwbXNnX2RldmljZShkZXYpOworCXN0cnVjdCBycG1zZ19kcml2ZXIgKnJwZHJ2ID0gdG9fcnBtc2dfZHJpdmVyKHJwZGV2LT5kZXYuZHJpdmVyKTsKKwlzdHJ1Y3QgcnBtc2dfY2hhbm5lbF9pbmZvIGNoaW5mbyA9IHt9OworCXN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0OworCWludCBlcnI7CisKKwlzdHJuY3B5KGNoaW5mby5uYW1lLCBycGRldi0+aWQubmFtZSwgUlBNU0dfTkFNRV9TSVpFKTsKKwljaGluZm8uc3JjID0gcnBkZXYtPnNyYzsKKwljaGluZm8uZHN0ID0gUlBNU0dfQUREUl9BTlk7CisKKwllcHQgPSBycG1zZ19jcmVhdGVfZXB0KHJwZGV2LCBycGRydi0+Y2FsbGJhY2ssIE5VTEwsIGNoaW5mbyk7CisJaWYgKCFlcHQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gY3JlYXRlIGVuZHBvaW50XG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJcnBkZXYtPmVwdCA9IGVwdDsKKwlycGRldi0+c3JjID0gZXB0LT5hZGRyOworCisJZXJyID0gcnBkcnYtPnByb2JlKHJwZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IGZhaWxlZDogJWRcbiIsIF9fZnVuY19fLCBlcnIpOworCQlycG1zZ19kZXN0cm95X2VwdChlcHQpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocnBkZXYtPm9wcy0+YW5ub3VuY2VfY3JlYXRlKQorCQllcnIgPSBycGRldi0+b3BzLT5hbm5vdW5jZV9jcmVhdGUocnBkZXYpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcnBtc2dfZGV2X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJwbXNnX2RldmljZSAqcnBkZXYgPSB0b19ycG1zZ19kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcnBtc2dfZHJpdmVyICpycGRydiA9IHRvX3JwbXNnX2RyaXZlcihycGRldi0+ZGV2LmRyaXZlcik7CisJaW50IGVyciA9IDA7CisKKwlpZiAocnBkZXYtPm9wcy0+YW5ub3VuY2VfZGVzdHJveSkKKwkJZXJyID0gcnBkZXYtPm9wcy0+YW5ub3VuY2VfZGVzdHJveShycGRldik7CisKKwlycGRydi0+cmVtb3ZlKHJwZGV2KTsKKworCXJwbXNnX2Rlc3Ryb3lfZXB0KHJwZGV2LT5lcHQpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBidXNfdHlwZSBycG1zZ19idXMgPSB7CisJLm5hbWUJCT0gInJwbXNnIiwKKwkubWF0Y2gJCT0gcnBtc2dfZGV2X21hdGNoLAorCS5kZXZfYXR0cnMJPSBycG1zZ19kZXZfYXR0cnMsCisJLnVldmVudAkJPSBycG1zZ191ZXZlbnQsCisJLnByb2JlCQk9IHJwbXNnX2Rldl9wcm9iZSwKKwkucmVtb3ZlCQk9IHJwbXNnX2Rldl9yZW1vdmUsCit9OworCitzdGF0aWMgdm9pZCBycG1zZ19yZWxlYXNlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJwbXNnX2RldmljZSAqcnBkZXYgPSB0b19ycG1zZ19kZXZpY2UoZGV2KTsKKworCWtmcmVlKHJwZGV2KTsKK30KKworaW50IHJwbXNnX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgcnBtc2dfZGV2aWNlICpycGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcnBkZXYtPmRldjsKKwlpbnQgcmV0OworCisJZGV2X3NldF9uYW1lKCZycGRldi0+ZGV2LCAiJXM6JXMiLAorCQkgICAgIGRldl9uYW1lKGRldi0+cGFyZW50KSwgcnBkZXYtPmlkLm5hbWUpOworCisJcnBkZXYtPmRldi5idXMgPSAmcnBtc2dfYnVzOworCXJwZGV2LT5kZXYucmVsZWFzZSA9IHJwbXNnX3JlbGVhc2VfZGV2aWNlOworCisJcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKCZycGRldi0+ZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZGV2aWNlX3JlZ2lzdGVyIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCXB1dF9kZXZpY2UoJnJwZGV2LT5kZXYpOworCX0KKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHJwbXNnX3JlZ2lzdGVyX2RldmljZSk7CisKKy8qCisgKiBmaW5kIGFuIGV4aXN0aW5nIGNoYW5uZWwgdXNpbmcgaXRzIG5hbWUgKyBhZGRyZXNzIHByb3BlcnRpZXMsCisgKiBhbmQgZGVzdHJveSBpdAorICovCitpbnQgcnBtc2dfdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqcGFyZW50LAorCQkJICAgIHN0cnVjdCBycG1zZ19jaGFubmVsX2luZm8gKmNoaW5mbykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwlkZXYgPSBycG1zZ19maW5kX2RldmljZShwYXJlbnQsIGNoaW5mbyk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKKworCXB1dF9kZXZpY2UoZGV2KTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChycG1zZ191bnJlZ2lzdGVyX2RldmljZSk7CisKKy8qKgorICogX19yZWdpc3Rlcl9ycG1zZ19kcml2ZXIoKSAtIHJlZ2lzdGVyIGFuIHJwbXNnIGRyaXZlciB3aXRoIHRoZSBycG1zZyBidXMKKyAqIEBycGRydjogcG9pbnRlciB0byBhIHN0cnVjdCBycG1zZ19kcml2ZXIKKyAqIEBvd25lcjogb3duaW5nIG1vZHVsZS9kcml2ZXIKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIHZhbHVlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBfX3JlZ2lzdGVyX3JwbXNnX2RyaXZlcihzdHJ1Y3QgcnBtc2dfZHJpdmVyICpycGRydiwgc3RydWN0IG1vZHVsZSAqb3duZXIpCit7CisJcnBkcnYtPmRydi5idXMgPSAmcnBtc2dfYnVzOworCXJwZHJ2LT5kcnYub3duZXIgPSBvd25lcjsKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZycGRydi0+ZHJ2KTsKK30KK0VYUE9SVF9TWU1CT0woX19yZWdpc3Rlcl9ycG1zZ19kcml2ZXIpOworCisvKioKKyAqIHVucmVnaXN0ZXJfcnBtc2dfZHJpdmVyKCkgLSB1bnJlZ2lzdGVyIGFuIHJwbXNnIGRyaXZlciBmcm9tIHRoZSBycG1zZyBidXMKKyAqIEBycGRydjogcG9pbnRlciB0byBhIHN0cnVjdCBycG1zZ19kcml2ZXIKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIHZhbHVlIG9uIGZhaWx1cmUuCisgKi8KK3ZvaWQgdW5yZWdpc3Rlcl9ycG1zZ19kcml2ZXIoc3RydWN0IHJwbXNnX2RyaXZlciAqcnBkcnYpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJnJwZHJ2LT5kcnYpOworfQorRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX3JwbXNnX2RyaXZlcik7CisKKworc3RhdGljIGludCBfX2luaXQgcnBtc2dfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBidXNfcmVnaXN0ZXIoJnJwbXNnX2J1cyk7CisJaWYgKHJldCkKKwkJcHJfZXJyKCJmYWlsZWQgdG8gcmVnaXN0ZXIgcnBtc2cgYnVzOiAlZFxuIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9Citwb3N0Y29yZV9pbml0Y2FsbChycG1zZ19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHJwbXNnX2Zpbmkodm9pZCkKK3sKKwlidXNfdW5yZWdpc3RlcigmcnBtc2dfYnVzKTsKK30KK21vZHVsZV9leGl0KHJwbXNnX2ZpbmkpOworCitNT0RVTEVfREVTQ1JJUFRJT04oInJlbW90ZSBwcm9jZXNzb3IgbWVzc2FnaW5nIGJ1cyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ycG1zZy9ycG1zZ19pbnRlcm5hbC5oIGIvZHJpdmVycy9ycG1zZy9ycG1zZ19pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNzVhMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3JwbXNnL3JwbXNnX2ludGVybmFsLmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIHJlbW90ZSBwcm9jZXNzb3IgbWVzc2FnaW5nIGJ1cyBpbnRlcm5hbHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUsIEluYy4KKyAqCisgKiBPaGFkIEJlbi1Db2hlbiA8b2hhZEB3aXplcnkuY29tPgorICogQnJpYW4gU3dldGxhbmQgPHN3ZXRsYW5kQGdvb2dsZS5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fUlBNU0dfSU5URVJOQUxfSF9fCisjZGVmaW5lIF9fUlBNU0dfSU5URVJOQUxfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9ycG1zZy5oPgorCisjZGVmaW5lIHRvX3JwbXNnX2RldmljZShkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IHJwbXNnX2RldmljZSwgZGV2KQorI2RlZmluZSB0b19ycG1zZ19kcml2ZXIoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBycG1zZ19kcml2ZXIsIGRydikKKworLyoqCisgKiBzdHJ1Y3QgcnBtc2dfZGV2aWNlX29wcyAtIGluZGlyZWN0aW9uIHRhYmxlIGZvciB0aGUgcnBtc2dfZGV2aWNlIG9wZXJhdGlvbnMKKyAqIEBjcmVhdGVfZXB0OgkJY3JlYXRlIGJhY2tlbmQtc3BlY2lmaWMgZW5kcG9pbnQsIHJlcXVyaWVkCisgKiBAYW5ub3VuY2VfY3JlYXRlOglhbm5vdW5jZSBwcmVzZW5jZSBvZiBuZXcgY2hhbm5lbCwgb3B0aW9uYWwKKyAqIEBhbm5vdW5jZV9kZXN0cm95Oglhbm5vdW5jZSBkZXN0cnVjdGlvbiBvZiBjaGFubmVsLCBvcHRpb25hbAorICoKKyAqIEluZGlyZWN0aW9uIHRhYmxlIGZvciB0aGUgb3BlcmF0aW9ucyB0aGF0IGEgcnBtc2cgYmFja2VuZCBzaG91bGQgaW1wbGVtZW50LgorICogQGFubm91bmNlX2NyZWF0ZSBhbmQgQGFubm91bmNlX2Rlc3Ryb3kgYXJlIG9wdGlvbmFsIGFzIHRoZSBiYWNrZW5kIG1pZ2h0CisgKiBhZHZlcnRpc2UgbmV3IGNoYW5uZWxzIGltcGxpY2l0bHkgYnkgY3JlYXRpbmcgdGhlIGVuZHBvaW50cy4KKyAqLworc3RydWN0IHJwbXNnX2RldmljZV9vcHMgeworCXN0cnVjdCBycG1zZ19lbmRwb2ludCAqKCpjcmVhdGVfZXB0KShzdHJ1Y3QgcnBtc2dfZGV2aWNlICpycGRldiwKKwkJCQkJICAgIHJwbXNnX3J4X2NiX3QgY2IsIHZvaWQgKnByaXYsCisJCQkJCSAgICBzdHJ1Y3QgcnBtc2dfY2hhbm5lbF9pbmZvIGNoaW5mbyk7CisKKwlpbnQgKCphbm5vdW5jZV9jcmVhdGUpKHN0cnVjdCBycG1zZ19kZXZpY2UgKmVwdCk7CisJaW50ICgqYW5ub3VuY2VfZGVzdHJveSkoc3RydWN0IHJwbXNnX2RldmljZSAqZXB0KTsKK307CisKKy8qKgorICogc3RydWN0IHJwbXNnX2VuZHBvaW50X29wcyAtIGluZGlyZWN0aW9uIHRhYmxlIGZvciBycG1zZ19lbmRwb2ludCBvcGVyYXRpb25zCisgKiBAZGVzdHJveV9lcHQ6CWRlc3Ryb3kgdGhlIGdpdmVuIGVuZHBvaW50LCByZXF1aXJlZAorICogQHNlbmQ6CQlzZWUgQHJwbXNnX3NlbmQoKSwgcmVxdWlyZWQKKyAqIEBzZW5kdG86CQlzZWUgQHJwbXNnX3NlbmR0bygpLCBvcHRpb25hbAorICogQHNlbmRfb2ZmY2hhbm5lbDoJc2VlIEBycG1zZ19zZW5kX29mZmNoYW5uZWwoKSwgb3B0aW9uYWwKKyAqIEB0cnlzZW5kOgkJc2VlIEBycG1zZ190cnlzZW5kKCksIHJlcXVpcmVkCisgKiBAdHJ5c2VuZHRvOgkJc2VlIEBycG1zZ190cnlzZW5kdG8oKSwgb3B0aW9uYWwKKyAqIEB0cnlzZW5kX29mZmNoYW5uZWw6CXNlZSBAcnBtc2dfdHJ5c2VuZF9vZmZjaGFubmVsKCksIG9wdGlvbmFsCisgKgorICogSW5kaXJlY3Rpb24gdGFibGUgZm9yIHRoZSBvcGVyYXRpb25zIHRoYXQgYSBycG1zZyBiYWNrZW5kIHNob3VsZCBpbXBsZW1lbnQuCisgKiBJbiBhZGRpdGlvbiB0byBAZGVzdHJveV9lcHQsIHRoZSBiYWNrZW5kIG11c3QgYXQgbGVhc3QgaW1wbGVtZW50IEBzZW5kIGFuZAorICogQHRyeXNlbmQsIHdoaWxlIHRoZSB2YXJpYW50cyBzZW5kaW5nIGRhdGEgb2ZmLWNoYW5uZWwgYXJlIG9wdGlvbmFsLgorICovCitzdHJ1Y3QgcnBtc2dfZW5kcG9pbnRfb3BzIHsKKwl2b2lkICgqZGVzdHJveV9lcHQpKHN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0KTsKKworCWludCAoKnNlbmQpKHN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0LCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKKwlpbnQgKCpzZW5kdG8pKHN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0LCB2b2lkICpkYXRhLCBpbnQgbGVuLCB1MzIgZHN0KTsKKwlpbnQgKCpzZW5kX29mZmNoYW5uZWwpKHN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0LCB1MzIgc3JjLCB1MzIgZHN0LAorCQkJCSAgdm9pZCAqZGF0YSwgaW50IGxlbik7CisKKwlpbnQgKCp0cnlzZW5kKShzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdCwgdm9pZCAqZGF0YSwgaW50IGxlbik7CisJaW50ICgqdHJ5c2VuZHRvKShzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdCwgdm9pZCAqZGF0YSwgaW50IGxlbiwgdTMyIGRzdCk7CisJaW50ICgqdHJ5c2VuZF9vZmZjaGFubmVsKShzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdCwgdTMyIHNyYywgdTMyIGRzdCwKKwkJCSAgICAgdm9pZCAqZGF0YSwgaW50IGxlbik7Cit9OworCitpbnQgcnBtc2dfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBycG1zZ19kZXZpY2UgKnJwZGV2KTsKK2ludCBycG1zZ191bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCisJCQkgICAgc3RydWN0IHJwbXNnX2NoYW5uZWxfaW5mbyAqY2hpbmZvKTsKKworc3RydWN0IGRldmljZSAqcnBtc2dfZmluZF9kZXZpY2Uoc3RydWN0IGRldmljZSAqcGFyZW50LAorCQkJCSBzdHJ1Y3QgcnBtc2dfY2hhbm5lbF9pbmZvICpjaGluZm8pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnBtc2cvdmlydGlvX3JwbXNnX2J1cy5jIGIvZHJpdmVycy9ycG1zZy92aXJ0aW9fcnBtc2dfYnVzLmMKaW5kZXggZmUwM2IyYS4uMzA5MGIwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ycG1zZy92aXJ0aW9fcnBtc2dfYnVzLmMKKysrIGIvZHJpdmVycy9ycG1zZy92aXJ0aW9fcnBtc2dfYnVzLmMKQEAgLTMzLDYgKzMzLDkgQEAKICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvcnBtc2cuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorCisjaW5jbHVkZSAicnBtc2dfaW50ZXJuYWwuaCIKIAogLyoqCiAgKiBzdHJ1Y3QgdmlydHByb2NfaW5mbyAtIHZpcnR1YWwgcmVtb3RlIHByb2Nlc3NvciBzdGF0ZQpAQCAtNzIsMjAgKzc1LDY5IEBACiAJc3RydWN0IHJwbXNnX2VuZHBvaW50ICpuc19lcHQ7CiB9OwogCisvKiBUaGUgZmVhdHVyZSBiaXRtYXAgZm9yIHZpcnRpbyBycG1zZyAqLworI2RlZmluZSBWSVJUSU9fUlBNU0dfRl9OUwkwIC8qIFJQIHN1cHBvcnRzIG5hbWUgc2VydmljZSBub3RpZmljYXRpb25zICovCisKIC8qKgotICogc3RydWN0IHJwbXNnX2NoYW5uZWxfaW5mbyAtIGludGVybmFsIGNoYW5uZWwgaW5mbyByZXByZXNlbnRhdGlvbgotICogQG5hbWU6IG5hbWUgb2Ygc2VydmljZQotICogQHNyYzogbG9jYWwgYWRkcmVzcworICogc3RydWN0IHJwbXNnX2hkciAtIGNvbW1vbiBoZWFkZXIgZm9yIGFsbCBycG1zZyBtZXNzYWdlcworICogQHNyYzogc291cmNlIGFkZHJlc3MKICAqIEBkc3Q6IGRlc3RpbmF0aW9uIGFkZHJlc3MKKyAqIEByZXNlcnZlZDogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKKyAqIEBsZW46IGxlbmd0aCBvZiBwYXlsb2FkIChpbiBieXRlcykKKyAqIEBmbGFnczogbWVzc2FnZSBmbGFncworICogQGRhdGE6IEBsZW4gYnl0ZXMgb2YgbWVzc2FnZSBwYXlsb2FkIGRhdGEKKyAqCisgKiBFdmVyeSBtZXNzYWdlIHNlbnQoL3JlY2VpdmVkKSBvbiB0aGUgcnBtc2cgYnVzIGJlZ2lucyB3aXRoIHRoaXMgaGVhZGVyLgogICovCi1zdHJ1Y3QgcnBtc2dfY2hhbm5lbF9pbmZvIHsKLQljaGFyIG5hbWVbUlBNU0dfTkFNRV9TSVpFXTsKK3N0cnVjdCBycG1zZ19oZHIgewogCXUzMiBzcmM7CiAJdTMyIGRzdDsKKwl1MzIgcmVzZXJ2ZWQ7CisJdTE2IGxlbjsKKwl1MTYgZmxhZ3M7CisJdTggZGF0YVswXTsKK30gX19wYWNrZWQ7CisKKy8qKgorICogc3RydWN0IHJwbXNnX25zX21zZyAtIGR5bmFtaWMgbmFtZSBzZXJ2aWNlIGFubm91bmNlbWVudCBtZXNzYWdlCisgKiBAbmFtZTogbmFtZSBvZiByZW1vdGUgc2VydmljZSB0aGF0IGlzIHB1Ymxpc2hlZAorICogQGFkZHI6IGFkZHJlc3Mgb2YgcmVtb3RlIHNlcnZpY2UgdGhhdCBpcyBwdWJsaXNoZWQKKyAqIEBmbGFnczogaW5kaWNhdGVzIHdoZXRoZXIgc2VydmljZSBpcyBjcmVhdGVkIG9yIGRlc3Ryb3llZAorICoKKyAqIFRoaXMgbWVzc2FnZSBpcyBzZW50IGFjcm9zcyB0byBwdWJsaXNoIGEgbmV3IHNlcnZpY2UsIG9yIGFubm91bmNlCisgKiBhYm91dCBpdHMgcmVtb3ZhbC4gV2hlbiB3ZSByZWNlaXZlIHRoZXNlIG1lc3NhZ2VzLCBhbiBhcHByb3ByaWF0ZQorICogcnBtc2cgY2hhbm5lbCAoaS5lIGRldmljZSkgaXMgY3JlYXRlZC9kZXN0cm95ZWQuIEluIHR1cm4sIHRoZSAtPnByb2JlKCkKKyAqIG9yIC0+cmVtb3ZlKCkgaGFuZGxlciBvZiB0aGUgYXBwcm9wcmlhdGUgcnBtc2cgZHJpdmVyIHdpbGwgYmUgaW52b2tlZAorICogKGlmL2FzLXNvb24tYXMgb25lIGlzIHJlZ2lzdGVyZWQpLgorICovCitzdHJ1Y3QgcnBtc2dfbnNfbXNnIHsKKwljaGFyIG5hbWVbUlBNU0dfTkFNRV9TSVpFXTsKKwl1MzIgYWRkcjsKKwl1MzIgZmxhZ3M7Cit9IF9fcGFja2VkOworCisvKioKKyAqIGVudW0gcnBtc2dfbnNfZmxhZ3MgLSBkeW5hbWljIG5hbWUgc2VydmljZSBhbm5vdW5jZW1lbnQgZmxhZ3MKKyAqCisgKiBAUlBNU0dfTlNfQ1JFQVRFOiBhIG5ldyByZW1vdGUgc2VydmljZSB3YXMganVzdCBjcmVhdGVkCisgKiBAUlBNU0dfTlNfREVTVFJPWTogYSBrbm93biByZW1vdGUgc2VydmljZSB3YXMganVzdCBkZXN0cm95ZWQKKyAqLworZW51bSBycG1zZ19uc19mbGFncyB7CisJUlBNU0dfTlNfQ1JFQVRFCQk9IDAsCisJUlBNU0dfTlNfREVTVFJPWQk9IDEsCiB9OwogCi0jZGVmaW5lIHRvX3JwbXNnX2NoYW5uZWwoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBycG1zZ19jaGFubmVsLCBkZXYpCi0jZGVmaW5lIHRvX3JwbXNnX2RyaXZlcihkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IHJwbXNnX2RyaXZlciwgZHJ2KQorLyoqCisgKiBAdnJwOiB0aGUgcmVtb3RlIHByb2Nlc3NvciB0aGlzIGNoYW5uZWwgYmVsb25ncyB0bworICovCitzdHJ1Y3QgdmlydGlvX3JwbXNnX2NoYW5uZWwgeworCXN0cnVjdCBycG1zZ19kZXZpY2UgcnBkZXY7CisKKwlzdHJ1Y3QgdmlydHByb2NfaW5mbyAqdnJwOworfTsKKworI2RlZmluZSB0b192aXJ0aW9fcnBtc2dfY2hhbm5lbChfcnBkZXYpIFwKKwljb250YWluZXJfb2YoX3JwZGV2LCBzdHJ1Y3QgdmlydGlvX3JwbXNnX2NoYW5uZWwsIHJwZGV2KQogCiAvKgogICogV2UncmUgYWxsb2NhdGluZyBidWZmZXJzIG9mIDUxMiBieXRlcyBlYWNoIGZvciBjb21tdW5pY2F0aW9ucy4gVGhlCkBAIC0xMTgsNzggKzE3MCwyOCBAQAogLyogQWRkcmVzcyA1MyBpcyByZXNlcnZlZCBmb3IgYWR2ZXJ0aXNpbmcgcmVtb3RlIHNlcnZpY2VzICovCiAjZGVmaW5lIFJQTVNHX05TX0FERFIJCQkoNTMpCiAKLS8qIHN5c2ZzIHNob3cgY29uZmlndXJhdGlvbiBmaWVsZHMgKi8KLSNkZWZpbmUgcnBtc2dfc2hvd19hdHRyKGZpZWxkLCBwYXRoLCBmb3JtYXRfc3RyaW5nKQkJCVwKLXN0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCi1maWVsZCMjX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAkJCQkJXAotCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJXAotewkJCQkJCQkJCVwKLQlzdHJ1Y3QgcnBtc2dfY2hhbm5lbCAqcnBkZXYgPSB0b19ycG1zZ19jaGFubmVsKGRldik7CQlcCi0JCQkJCQkJCQlcCi0JcmV0dXJuIHNwcmludGYoYnVmLCBmb3JtYXRfc3RyaW5nLCBycGRldi0+cGF0aCk7CQlcCi19CitzdGF0aWMgdm9pZCB2aXJ0aW9fcnBtc2dfZGVzdHJveV9lcHQoc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQpOworc3RhdGljIGludCB2aXJ0aW9fcnBtc2dfc2VuZChzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdCwgdm9pZCAqZGF0YSwgaW50IGxlbik7CitzdGF0aWMgaW50IHZpcnRpb19ycG1zZ19zZW5kdG8oc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQsIHZvaWQgKmRhdGEsIGludCBsZW4sCisJCQkgICAgICAgdTMyIGRzdCk7CitzdGF0aWMgaW50IHZpcnRpb19ycG1zZ19zZW5kX29mZmNoYW5uZWwoc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQsIHUzMiBzcmMsCisJCQkJCXUzMiBkc3QsIHZvaWQgKmRhdGEsIGludCBsZW4pOworc3RhdGljIGludCB2aXJ0aW9fcnBtc2dfdHJ5c2VuZChzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdCwgdm9pZCAqZGF0YSwgaW50IGxlbik7CitzdGF0aWMgaW50IHZpcnRpb19ycG1zZ190cnlzZW5kdG8oc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQsIHZvaWQgKmRhdGEsCisJCQkJICBpbnQgbGVuLCB1MzIgZHN0KTsKK3N0YXRpYyBpbnQgdmlydGlvX3JwbXNnX3RyeXNlbmRfb2ZmY2hhbm5lbChzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdCwgdTMyIHNyYywKKwkJCQkJICAgdTMyIGRzdCwgdm9pZCAqZGF0YSwgaW50IGxlbik7CiAKLS8qIGZvciBtb3JlIGluZm8sIHNlZSBEb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJ1cy1ycG1zZyAqLwotcnBtc2dfc2hvd19hdHRyKG5hbWUsIGlkLm5hbWUsICIlc1xuIik7Ci1ycG1zZ19zaG93X2F0dHIoc3JjLCBzcmMsICIweCV4XG4iKTsKLXJwbXNnX3Nob3dfYXR0cihkc3QsIGRzdCwgIjB4JXhcbiIpOwotcnBtc2dfc2hvd19hdHRyKGFubm91bmNlLCBhbm5vdW5jZSA/ICJ0cnVlIiA6ICJmYWxzZSIsICIlc1xuIik7Ci0KLS8qCi0gKiBVbmlxdWUgKGFuZCBmcmVlIHJ1bm5pbmcpIGluZGV4IGZvciBycG1zZyBkZXZpY2VzLgotICoKLSAqIFllYWgsIHdlJ3JlIG5vdCByZWN5Y2xpbmcgdGhvc2UgbnVtYmVycyAoeWV0PykuIHdpbGwgYmUgZWFzeQotICogdG8gY2hhbmdlIGlmL3doZW4gd2Ugd2FudCB0by4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBycG1zZ19kZXZfaW5kZXg7Ci0KLXN0YXRpYyBzc2l6ZV90IG1vZGFsaWFzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBycG1zZ19jaGFubmVsICpycGRldiA9IHRvX3JwbXNnX2NoYW5uZWwoZGV2KTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgUlBNU0dfREVWSUNFX01PREFMSUFTX0ZNVCAiXG4iLCBycGRldi0+aWQubmFtZSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBycG1zZ19kZXZfYXR0cnNbXSA9IHsKLQlfX0FUVFJfUk8obmFtZSksCi0JX19BVFRSX1JPKG1vZGFsaWFzKSwKLQlfX0FUVFJfUk8oZHN0KSwKLQlfX0FUVFJfUk8oc3JjKSwKLQlfX0FUVFJfUk8oYW5ub3VuY2UpLAotCV9fQVRUUl9OVUxMCitzdGF0aWMgY29uc3Qgc3RydWN0IHJwbXNnX2VuZHBvaW50X29wcyB2aXJ0aW9fZW5kcG9pbnRfb3BzID0geworCS5kZXN0cm95X2VwdCA9IHZpcnRpb19ycG1zZ19kZXN0cm95X2VwdCwKKwkuc2VuZCA9IHZpcnRpb19ycG1zZ19zZW5kLAorCS5zZW5kdG8gPSB2aXJ0aW9fcnBtc2dfc2VuZHRvLAorCS5zZW5kX29mZmNoYW5uZWwgPSB2aXJ0aW9fcnBtc2dfc2VuZF9vZmZjaGFubmVsLAorCS50cnlzZW5kID0gdmlydGlvX3JwbXNnX3RyeXNlbmQsCisJLnRyeXNlbmR0byA9IHZpcnRpb19ycG1zZ190cnlzZW5kdG8sCisJLnRyeXNlbmRfb2ZmY2hhbm5lbCA9IHZpcnRpb19ycG1zZ190cnlzZW5kX29mZmNoYW5uZWwsCiB9OwogCi0vKiBycG1zZyBkZXZpY2VzIGFuZCBkcml2ZXJzIGFyZSBtYXRjaGVkIHVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHJwbXNnX2lkX21hdGNoKGNvbnN0IHN0cnVjdCBycG1zZ19jaGFubmVsICpycGRldiwKLQkJCQkgIGNvbnN0IHN0cnVjdCBycG1zZ19kZXZpY2VfaWQgKmlkKQotewotCXJldHVybiBzdHJuY21wKGlkLT5uYW1lLCBycGRldi0+aWQubmFtZSwgUlBNU0dfTkFNRV9TSVpFKSA9PSAwOwotfQotCi0vKiBtYXRjaCBycG1zZyBjaGFubmVsIGFuZCBycG1zZyBkcml2ZXIgKi8KLXN0YXRpYyBpbnQgcnBtc2dfZGV2X21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKLXsKLQlzdHJ1Y3QgcnBtc2dfY2hhbm5lbCAqcnBkZXYgPSB0b19ycG1zZ19jaGFubmVsKGRldik7Ci0Jc3RydWN0IHJwbXNnX2RyaXZlciAqcnBkcnYgPSB0b19ycG1zZ19kcml2ZXIoZHJ2KTsKLQljb25zdCBzdHJ1Y3QgcnBtc2dfZGV2aWNlX2lkICppZHMgPSBycGRydi0+aWRfdGFibGU7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpZHNbaV0ubmFtZVswXTsgaSsrKQotCQlpZiAocnBtc2dfaWRfbWF0Y2gocnBkZXYsICZpZHNbaV0pKQotCQkJcmV0dXJuIDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBycG1zZ191ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpCi17Ci0Jc3RydWN0IHJwbXNnX2NoYW5uZWwgKnJwZGV2ID0gdG9fcnBtc2dfY2hhbm5lbChkZXYpOwotCi0JcmV0dXJuIGFkZF91ZXZlbnRfdmFyKGVudiwgIk1PREFMSUFTPSIgUlBNU0dfREVWSUNFX01PREFMSUFTX0ZNVCwKLQkJCQkJcnBkZXYtPmlkLm5hbWUpOwotfQotCiAvKioKICAqIF9fZXB0X3JlbGVhc2UoKSAtIGRlYWxsb2NhdGUgYW4gcnBtc2cgZW5kcG9pbnQKICAqIEBrcmVmOiB0aGUgZXB0J3MgcmVmZXJlbmNlIGNvdW50CkBAIC0yMTIsMTggKzIxNCwxNyBAQAogCiAvKiBmb3IgbW9yZSBpbmZvLCBzZWUgYmVsb3cgZG9jdW1lbnRhdGlvbiBvZiBycG1zZ19jcmVhdGVfZXB0KCkgKi8KIHN0YXRpYyBzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKl9fcnBtc2dfY3JlYXRlX2VwdChzdHJ1Y3QgdmlydHByb2NfaW5mbyAqdnJwLAotCQlzdHJ1Y3QgcnBtc2dfY2hhbm5lbCAqcnBkZXYsIHJwbXNnX3J4X2NiX3QgY2IsCi0JCXZvaWQgKnByaXYsIHUzMiBhZGRyKQorCQkJCQkJIHN0cnVjdCBycG1zZ19kZXZpY2UgKnJwZGV2LAorCQkJCQkJIHJwbXNnX3J4X2NiX3QgY2IsCisJCQkJCQkgdm9pZCAqcHJpdiwgdTMyIGFkZHIpCiB7CiAJaW50IGlkX21pbiwgaWRfbWF4LCBpZDsKIAlzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdDsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBycGRldiA/ICZycGRldi0+ZGV2IDogJnZycC0+dmRldi0+ZGV2OwogCiAJZXB0ID0ga3phbGxvYyhzaXplb2YoKmVwdCksIEdGUF9LRVJORUwpOwotCWlmICghZXB0KSB7Ci0JCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGt6YWxsb2MgYSBuZXcgZXB0XG4iKTsKKwlpZiAoIWVwdCkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJa3JlZl9pbml0KCZlcHQtPnJlZmNvdW50KTsKIAltdXRleF9pbml0KCZlcHQtPmNiX2xvY2spOwpAQCAtMjMxLDYgKzIzMiw3IEBACiAJZXB0LT5ycGRldiA9IHJwZGV2OwogCWVwdC0+Y2IgPSBjYjsKIAllcHQtPnByaXYgPSBwcml2OworCWVwdC0+b3BzID0gJnZpcnRpb19lbmRwb2ludF9vcHM7CiAKIAkvKiBkbyB3ZSBuZWVkIHRvIGFsbG9jYXRlIGEgbG9jYWwgYWRkcmVzcyA/ICovCiAJaWYgKGFkZHIgPT0gUlBNU0dfQUREUl9BTlkpIHsKQEAgLTI2MSw1MiArMjYzLDE1IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLS8qKgotICogcnBtc2dfY3JlYXRlX2VwdCgpIC0gY3JlYXRlIGEgbmV3IHJwbXNnX2VuZHBvaW50Ci0gKiBAcnBkZXY6IHJwbXNnIGNoYW5uZWwgZGV2aWNlCi0gKiBAY2I6IHJ4IGNhbGxiYWNrIGhhbmRsZXIKLSAqIEBwcml2OiBwcml2YXRlIGRhdGEgZm9yIHRoZSBkcml2ZXIncyB1c2UKLSAqIEBhZGRyOiBsb2NhbCBycG1zZyBhZGRyZXNzIHRvIGJpbmQgd2l0aCBAY2IKLSAqCi0gKiBFdmVyeSBycG1zZyBhZGRyZXNzIGluIHRoZSBzeXN0ZW0gaXMgYm91bmQgdG8gYW4gcnggY2FsbGJhY2sgKHNvIHdoZW4KLSAqIGluYm91bmQgbWVzc2FnZXMgYXJyaXZlLCB0aGV5IGFyZSBkaXNwYXRjaGVkIGJ5IHRoZSBycG1zZyBidXMgdXNpbmcgdGhlCi0gKiBhcHByb3ByaWF0ZSBjYWxsYmFjayBoYW5kbGVyKSBieSBtZWFucyBvZiBhbiBycG1zZ19lbmRwb2ludCBzdHJ1Y3QuCi0gKgotICogVGhpcyBmdW5jdGlvbiBhbGxvd3MgZHJpdmVycyB0byBjcmVhdGUgc3VjaCBhbiBlbmRwb2ludCwgYW5kIGJ5IHRoYXQsCi0gKiBiaW5kIGEgY2FsbGJhY2ssIGFuZCBwb3NzaWJseSBzb21lIHByaXZhdGUgZGF0YSB0b28sIHRvIGFuIHJwbXNnIGFkZHJlc3MKLSAqIChlaXRoZXIgb25lIHRoYXQgaXMga25vd24gaW4gYWR2YW5jZSwgb3Igb25lIHRoYXQgd2lsbCBiZSBkeW5hbWljYWxseQotICogYXNzaWduZWQgZm9yIHRoZW0pLgotICoKLSAqIFNpbXBsZSBycG1zZyBkcml2ZXJzIG5lZWQgbm90IGNhbGwgcnBtc2dfY3JlYXRlX2VwdCwgYmVjYXVzZSBhbiBlbmRwb2ludAotICogaXMgYWxyZWFkeSBjcmVhdGVkIGZvciB0aGVtIHdoZW4gdGhleSBhcmUgcHJvYmVkIGJ5IHRoZSBycG1zZyBidXMKLSAqICh1c2luZyB0aGUgcnggY2FsbGJhY2sgcHJvdmlkZWQgd2hlbiB0aGV5IHJlZ2lzdGVyZWQgdG8gdGhlIHJwbXNnIGJ1cykuCi0gKgotICogU28gdGhpbmdzIHNob3VsZCBqdXN0IHdvcmsgZm9yIHNpbXBsZSBkcml2ZXJzOiB0aGV5IGFscmVhZHkgaGF2ZSBhbgotICogZW5kcG9pbnQsIHRoZWlyIHJ4IGNhbGxiYWNrIGlzIGJvdW5kIHRvIHRoZWlyIHJwbXNnIGFkZHJlc3MsIGFuZCB3aGVuCi0gKiByZWxldmFudCBpbmJvdW5kIG1lc3NhZ2VzIGFycml2ZSAoaS5lLiBtZXNzYWdlcyB3aGljaCB0aGVpciBkc3QgYWRkcmVzcwotICogZXF1YWxzIHRvIHRoZSBzcmMgYWRkcmVzcyBvZiB0aGVpciBycG1zZyBjaGFubmVsKSwgdGhlIGRyaXZlcidzIGhhbmRsZXIKLSAqIGlzIGludm9rZWQgdG8gcHJvY2VzcyBpdC4KLSAqCi0gKiBUaGF0IHNhaWQsIG1vcmUgY29tcGxpY2F0ZWQgZHJpdmVycyBtaWdodCBkbyBuZWVkIHRvIGFsbG9jYXRlCi0gKiBhZGRpdGlvbmFsIHJwbXNnIGFkZHJlc3NlcywgYW5kIGJpbmQgdGhlbSB0byBkaWZmZXJlbnQgcnggY2FsbGJhY2tzLgotICogVG8gYWNjb21wbGlzaCB0aGF0LCB0aG9zZSBkcml2ZXJzIG5lZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLgotICoKLSAqIERyaXZlcnMgc2hvdWxkIHByb3ZpZGUgdGhlaXIgQHJwZGV2IGNoYW5uZWwgKHNvIHRoZSBuZXcgZW5kcG9pbnQgd291bGQgYmVsb25nCi0gKiB0byB0aGUgc2FtZSByZW1vdGUgcHJvY2Vzc29yIHRoZWlyIGNoYW5uZWwgYmVsb25ncyB0byksIGFuIHJ4IGNhbGxiYWNrCi0gKiBmdW5jdGlvbiwgYW4gb3B0aW9uYWwgcHJpdmF0ZSBkYXRhICh3aGljaCBpcyBwcm92aWRlZCBiYWNrIHdoZW4gdGhlCi0gKiByeCBjYWxsYmFjayBpcyBpbnZva2VkKSwgYW5kIGFuIGFkZHJlc3MgdGhleSB3YW50IHRvIGJpbmQgd2l0aCB0aGUKLSAqIGNhbGxiYWNrLiBJZiBAYWRkciBpcyBSUE1TR19BRERSX0FOWSwgdGhlbiBycG1zZ19jcmVhdGVfZXB0IHdpbGwKLSAqIGR5bmFtaWNhbGx5IGFzc2lnbiB0aGVtIGFuIGF2YWlsYWJsZSBycG1zZyBhZGRyZXNzIChkcml2ZXJzIHNob3VsZCBoYXZlCi0gKiBhIHZlcnkgZ29vZCByZWFzb24gd2h5IG5vdCB0byBhbHdheXMgdXNlIFJQTVNHX0FERFJfQU5ZIGhlcmUpLgotICoKLSAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBlbmRwb2ludCBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGVycm9yLgotICovCi1zdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKnJwbXNnX2NyZWF0ZV9lcHQoc3RydWN0IHJwbXNnX2NoYW5uZWwgKnJwZGV2LAotCQkJCXJwbXNnX3J4X2NiX3QgY2IsIHZvaWQgKnByaXYsIHUzMiBhZGRyKQorc3RhdGljIHN0cnVjdCBycG1zZ19lbmRwb2ludCAqdmlydGlvX3JwbXNnX2NyZWF0ZV9lcHQoc3RydWN0IHJwbXNnX2RldmljZSAqcnBkZXYsCisJCQkJCQkgICAgICBycG1zZ19yeF9jYl90IGNiLAorCQkJCQkJICAgICAgdm9pZCAqcHJpdiwKKwkJCQkJCSAgICAgIHN0cnVjdCBycG1zZ19jaGFubmVsX2luZm8gY2hpbmZvKQogewotCXJldHVybiBfX3JwbXNnX2NyZWF0ZV9lcHQocnBkZXYtPnZycCwgcnBkZXYsIGNiLCBwcml2LCBhZGRyKTsKKwlzdHJ1Y3QgdmlydGlvX3JwbXNnX2NoYW5uZWwgKnZjaCA9IHRvX3ZpcnRpb19ycG1zZ19jaGFubmVsKHJwZGV2KTsKKworCXJldHVybiBfX3JwbXNnX2NyZWF0ZV9lcHQodmNoLT52cnAsIHJwZGV2LCBjYiwgcHJpdiwgY2hpbmZvLnNyYyk7CiB9Ci1FWFBPUlRfU1lNQk9MKHJwbXNnX2NyZWF0ZV9lcHQpOwogCiAvKioKICAqIF9fcnBtc2dfZGVzdHJveV9lcHQoKSAtIGRlc3Ryb3kgYW4gZXhpc3RpbmcgcnBtc2cgZW5kcG9pbnQKQEAgLTMzNCwxNzggKzI5OSw4MiBAQAogCWtyZWZfcHV0KCZlcHQtPnJlZmNvdW50LCBfX2VwdF9yZWxlYXNlKTsKIH0KIAotLyoqCi0gKiBycG1zZ19kZXN0cm95X2VwdCgpIC0gZGVzdHJveSBhbiBleGlzdGluZyBycG1zZyBlbmRwb2ludAotICogQGVwdDogZW5kcG9pbmcgdG8gZGVzdHJveQotICoKLSAqIFNob3VsZCBiZSB1c2VkIGJ5IGRyaXZlcnMgdG8gZGVzdHJveSBhbiBycG1zZyBlbmRwb2ludCBwcmV2aW91c2x5Ci0gKiBjcmVhdGVkIHdpdGggcnBtc2dfY3JlYXRlX2VwdCgpLgotICovCi12b2lkIHJwbXNnX2Rlc3Ryb3lfZXB0KHN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0KQorc3RhdGljIHZvaWQgdmlydGlvX3JwbXNnX2Rlc3Ryb3lfZXB0KHN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0KQogewotCV9fcnBtc2dfZGVzdHJveV9lcHQoZXB0LT5ycGRldi0+dnJwLCBlcHQpOworCXN0cnVjdCB2aXJ0aW9fcnBtc2dfY2hhbm5lbCAqdmNoID0gdG9fdmlydGlvX3JwbXNnX2NoYW5uZWwoZXB0LT5ycGRldik7CisKKwlfX3JwbXNnX2Rlc3Ryb3lfZXB0KHZjaC0+dnJwLCBlcHQpOwogfQotRVhQT1JUX1NZTUJPTChycG1zZ19kZXN0cm95X2VwdCk7CiAKLS8qCi0gKiB3aGVuIGFuIHJwbXNnIGRyaXZlciBpcyBwcm9iZWQgd2l0aCBhIGNoYW5uZWwsIHdlIHNlYW1sZXNzbHkgY3JlYXRlCi0gKiBpdCBhbiBlbmRwb2ludCwgYmluZGluZyBpdHMgcnggY2FsbGJhY2sgdG8gYSB1bmlxdWUgbG9jYWwgcnBtc2cKLSAqIGFkZHJlc3MuCi0gKgotICogaWYgd2UgbmVlZCB0bywgd2UgYWxzbyBhbm5vdW5jZSBhYm91dCB0aGlzIGNoYW5uZWwgdG8gdGhlIHJlbW90ZQotICogcHJvY2Vzc29yIChuZWVkZWQgaW4gY2FzZSB0aGUgZHJpdmVyIGlzIGV4cG9zaW5nIGFuIHJwbXNnIHNlcnZpY2UpLgotICovCi1zdGF0aWMgaW50IHJwbXNnX2Rldl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHZpcnRpb19ycG1zZ19hbm5vdW5jZV9jcmVhdGUoc3RydWN0IHJwbXNnX2RldmljZSAqcnBkZXYpCiB7Ci0Jc3RydWN0IHJwbXNnX2NoYW5uZWwgKnJwZGV2ID0gdG9fcnBtc2dfY2hhbm5lbChkZXYpOwotCXN0cnVjdCBycG1zZ19kcml2ZXIgKnJwZHJ2ID0gdG9fcnBtc2dfZHJpdmVyKHJwZGV2LT5kZXYuZHJpdmVyKTsKLQlzdHJ1Y3QgdmlydHByb2NfaW5mbyAqdnJwID0gcnBkZXYtPnZycDsKLQlzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdDsKLQlpbnQgZXJyOwotCi0JZXB0ID0gcnBtc2dfY3JlYXRlX2VwdChycGRldiwgcnBkcnYtPmNhbGxiYWNrLCBOVUxMLCBycGRldi0+c3JjKTsKLQlpZiAoIWVwdCkgewotCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBjcmVhdGUgZW5kcG9pbnRcbiIpOwotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlycGRldi0+ZXB0ID0gZXB0OwotCXJwZGV2LT5zcmMgPSBlcHQtPmFkZHI7Ci0KLQllcnIgPSBycGRydi0+cHJvYmUocnBkZXYpOwotCWlmIChlcnIpIHsKLQkJZGV2X2VycihkZXYsICIlczogZmFpbGVkOiAlZFxuIiwgX19mdW5jX18sIGVycik7Ci0JCXJwbXNnX2Rlc3Ryb3lfZXB0KGVwdCk7Ci0JCWdvdG8gb3V0OwotCX0KKwlzdHJ1Y3QgdmlydGlvX3JwbXNnX2NoYW5uZWwgKnZjaCA9IHRvX3ZpcnRpb19ycG1zZ19jaGFubmVsKHJwZGV2KTsKKwlzdHJ1Y3QgdmlydHByb2NfaW5mbyAqdnJwID0gdmNoLT52cnA7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnJwZGV2LT5kZXY7CisJaW50IGVyciA9IDA7CiAKIAkvKiBuZWVkIHRvIHRlbGwgcmVtb3RlIHByb2Nlc3NvcidzIG5hbWUgc2VydmljZSBhYm91dCB0aGlzIGNoYW5uZWwgPyAqLwogCWlmIChycGRldi0+YW5ub3VuY2UgJiYKLQkJCXZpcnRpb19oYXNfZmVhdHVyZSh2cnAtPnZkZXYsIFZJUlRJT19SUE1TR19GX05TKSkgeworCSAgICB2aXJ0aW9faGFzX2ZlYXR1cmUodnJwLT52ZGV2LCBWSVJUSU9fUlBNU0dfRl9OUykpIHsKIAkJc3RydWN0IHJwbXNnX25zX21zZyBuc207CiAKIAkJc3RybmNweShuc20ubmFtZSwgcnBkZXYtPmlkLm5hbWUsIFJQTVNHX05BTUVfU0laRSk7Ci0JCW5zbS5hZGRyID0gcnBkZXYtPnNyYzsKKwkJbnNtLmFkZHIgPSBycGRldi0+ZXB0LT5hZGRyOwogCQluc20uZmxhZ3MgPSBSUE1TR19OU19DUkVBVEU7CiAKLQkJZXJyID0gcnBtc2dfc2VuZHRvKHJwZGV2LCAmbnNtLCBzaXplb2YobnNtKSwgUlBNU0dfTlNfQUREUik7CisJCWVyciA9IHJwbXNnX3NlbmR0byhycGRldi0+ZXB0LCAmbnNtLCBzaXplb2YobnNtKSwgUlBNU0dfTlNfQUREUik7CiAJCWlmIChlcnIpCiAJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBhbm5vdW5jZSBzZXJ2aWNlICVkXG4iLCBlcnIpOwogCX0KIAotb3V0OgogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgcnBtc2dfZGV2X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHZpcnRpb19ycG1zZ19hbm5vdW5jZV9kZXN0cm95KHN0cnVjdCBycG1zZ19kZXZpY2UgKnJwZGV2KQogewotCXN0cnVjdCBycG1zZ19jaGFubmVsICpycGRldiA9IHRvX3JwbXNnX2NoYW5uZWwoZGV2KTsKLQlzdHJ1Y3QgcnBtc2dfZHJpdmVyICpycGRydiA9IHRvX3JwbXNnX2RyaXZlcihycGRldi0+ZGV2LmRyaXZlcik7Ci0Jc3RydWN0IHZpcnRwcm9jX2luZm8gKnZycCA9IHJwZGV2LT52cnA7CisJc3RydWN0IHZpcnRpb19ycG1zZ19jaGFubmVsICp2Y2ggPSB0b192aXJ0aW9fcnBtc2dfY2hhbm5lbChycGRldik7CisJc3RydWN0IHZpcnRwcm9jX2luZm8gKnZycCA9IHZjaC0+dnJwOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZycGRldi0+ZGV2OwogCWludCBlcnIgPSAwOwogCiAJLyogdGVsbCByZW1vdGUgcHJvY2Vzc29yJ3MgbmFtZSBzZXJ2aWNlIHdlJ3JlIHJlbW92aW5nIHRoaXMgY2hhbm5lbCAqLwogCWlmIChycGRldi0+YW5ub3VuY2UgJiYKLQkJCXZpcnRpb19oYXNfZmVhdHVyZSh2cnAtPnZkZXYsIFZJUlRJT19SUE1TR19GX05TKSkgeworCSAgICB2aXJ0aW9faGFzX2ZlYXR1cmUodnJwLT52ZGV2LCBWSVJUSU9fUlBNU0dfRl9OUykpIHsKIAkJc3RydWN0IHJwbXNnX25zX21zZyBuc207CiAKIAkJc3RybmNweShuc20ubmFtZSwgcnBkZXYtPmlkLm5hbWUsIFJQTVNHX05BTUVfU0laRSk7CiAJCW5zbS5hZGRyID0gcnBkZXYtPnNyYzsKIAkJbnNtLmZsYWdzID0gUlBNU0dfTlNfREVTVFJPWTsKIAotCQllcnIgPSBycG1zZ19zZW5kdG8ocnBkZXYsICZuc20sIHNpemVvZihuc20pLCBSUE1TR19OU19BRERSKTsKKwkJZXJyID0gcnBtc2dfc2VuZHRvKHJwZGV2LT5lcHQsICZuc20sIHNpemVvZihuc20pLCBSUE1TR19OU19BRERSKTsKIAkJaWYgKGVycikKIAkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGFubm91bmNlIHNlcnZpY2UgJWRcbiIsIGVycik7CiAJfQogCi0JcnBkcnYtPnJlbW92ZShycGRldik7Ci0KLQlycG1zZ19kZXN0cm95X2VwdChycGRldi0+ZXB0KTsKLQogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgcnBtc2dfYnVzID0gewotCS5uYW1lCQk9ICJycG1zZyIsCi0JLm1hdGNoCQk9IHJwbXNnX2Rldl9tYXRjaCwKLQkuZGV2X2F0dHJzCT0gcnBtc2dfZGV2X2F0dHJzLAotCS51ZXZlbnQJCT0gcnBtc2dfdWV2ZW50LAotCS5wcm9iZQkJPSBycG1zZ19kZXZfcHJvYmUsCi0JLnJlbW92ZQkJPSBycG1zZ19kZXZfcmVtb3ZlLAorc3RhdGljIGNvbnN0IHN0cnVjdCBycG1zZ19kZXZpY2Vfb3BzIHZpcnRpb19ycG1zZ19vcHMgPSB7CisJLmNyZWF0ZV9lcHQgPSB2aXJ0aW9fcnBtc2dfY3JlYXRlX2VwdCwKKwkuYW5ub3VuY2VfY3JlYXRlID0gdmlydGlvX3JwbXNnX2Fubm91bmNlX2NyZWF0ZSwKKwkuYW5ub3VuY2VfZGVzdHJveSA9IHZpcnRpb19ycG1zZ19hbm5vdW5jZV9kZXN0cm95LAogfTsKIAotLyoqCi0gKiBfX3JlZ2lzdGVyX3JwbXNnX2RyaXZlcigpIC0gcmVnaXN0ZXIgYW4gcnBtc2cgZHJpdmVyIHdpdGggdGhlIHJwbXNnIGJ1cwotICogQHJwZHJ2OiBwb2ludGVyIHRvIGEgc3RydWN0IHJwbXNnX2RyaXZlcgotICogQG93bmVyOiBvd25pbmcgbW9kdWxlL2RyaXZlcgotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBhbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3IgdmFsdWUgb24gZmFpbHVyZS4KLSAqLwotaW50IF9fcmVnaXN0ZXJfcnBtc2dfZHJpdmVyKHN0cnVjdCBycG1zZ19kcml2ZXIgKnJwZHJ2LCBzdHJ1Y3QgbW9kdWxlICpvd25lcikKLXsKLQlycGRydi0+ZHJ2LmJ1cyA9ICZycG1zZ19idXM7Ci0JcnBkcnYtPmRydi5vd25lciA9IG93bmVyOwotCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJnJwZHJ2LT5kcnYpOwotfQotRVhQT1JUX1NZTUJPTChfX3JlZ2lzdGVyX3JwbXNnX2RyaXZlcik7Ci0KLS8qKgotICogdW5yZWdpc3Rlcl9ycG1zZ19kcml2ZXIoKSAtIHVucmVnaXN0ZXIgYW4gcnBtc2cgZHJpdmVyIGZyb20gdGhlIHJwbXNnIGJ1cwotICogQHJwZHJ2OiBwb2ludGVyIHRvIGEgc3RydWN0IHJwbXNnX2RyaXZlcgotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBhbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3IgdmFsdWUgb24gZmFpbHVyZS4KLSAqLwotdm9pZCB1bnJlZ2lzdGVyX3JwbXNnX2RyaXZlcihzdHJ1Y3QgcnBtc2dfZHJpdmVyICpycGRydikKLXsKLQlkcml2ZXJfdW5yZWdpc3RlcigmcnBkcnYtPmRydik7Ci19Ci1FWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfcnBtc2dfZHJpdmVyKTsKLQotc3RhdGljIHZvaWQgcnBtc2dfcmVsZWFzZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBycG1zZ19jaGFubmVsICpycGRldiA9IHRvX3JwbXNnX2NoYW5uZWwoZGV2KTsKLQotCWtmcmVlKHJwZGV2KTsKLX0KLQotLyoKLSAqIG1hdGNoIGFuIHJwbXNnIGNoYW5uZWwgd2l0aCBhIGNoYW5uZWwgaW5mbyBzdHJ1Y3QuCi0gKiB0aGlzIGlzIHVzZWQgdG8gbWFrZSBzdXJlIHdlJ3JlIG5vdCBjcmVhdGluZyBycG1zZyBkZXZpY2VzIGZvciBjaGFubmVscwotICogdGhhdCBhbHJlYWR5IGV4aXN0LgotICovCi1zdGF0aWMgaW50IHJwbXNnX2NoYW5uZWxfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBycG1zZ19jaGFubmVsX2luZm8gKmNoaW5mbyA9IGRhdGE7Ci0Jc3RydWN0IHJwbXNnX2NoYW5uZWwgKnJwZGV2ID0gdG9fcnBtc2dfY2hhbm5lbChkZXYpOwotCi0JaWYgKGNoaW5mby0+c3JjICE9IFJQTVNHX0FERFJfQU5ZICYmIGNoaW5mby0+c3JjICE9IHJwZGV2LT5zcmMpCi0JCXJldHVybiAwOwotCi0JaWYgKGNoaW5mby0+ZHN0ICE9IFJQTVNHX0FERFJfQU5ZICYmIGNoaW5mby0+ZHN0ICE9IHJwZGV2LT5kc3QpCi0JCXJldHVybiAwOwotCi0JaWYgKHN0cm5jbXAoY2hpbmZvLT5uYW1lLCBycGRldi0+aWQubmFtZSwgUlBNU0dfTkFNRV9TSVpFKSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBmb3VuZCBhIG1hdGNoICEgKi8KLQlyZXR1cm4gMTsKLX0KLQogLyoKICAqIGNyZWF0ZSBhbiBycG1zZyBjaGFubmVsIHVzaW5nIGl0cyBuYW1lIGFuZCBhZGRyZXNzIGluZm8uCiAgKiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYm90aCBzdGF0aWMgYW5kIGR5bmFtaWMKICAqIGNoYW5uZWxzLgogICovCi1zdGF0aWMgc3RydWN0IHJwbXNnX2NoYW5uZWwgKnJwbXNnX2NyZWF0ZV9jaGFubmVsKHN0cnVjdCB2aXJ0cHJvY19pbmZvICp2cnAsCi0JCQkJc3RydWN0IHJwbXNnX2NoYW5uZWxfaW5mbyAqY2hpbmZvKQorc3RhdGljIHN0cnVjdCBycG1zZ19kZXZpY2UgKnJwbXNnX2NyZWF0ZV9jaGFubmVsKHN0cnVjdCB2aXJ0cHJvY19pbmZvICp2cnAsCisJCQkJCQkgc3RydWN0IHJwbXNnX2NoYW5uZWxfaW5mbyAqY2hpbmZvKQogewotCXN0cnVjdCBycG1zZ19jaGFubmVsICpycGRldjsKKwlzdHJ1Y3QgdmlydGlvX3JwbXNnX2NoYW5uZWwgKnZjaDsKKwlzdHJ1Y3QgcnBtc2dfZGV2aWNlICpycGRldjsKIAlzdHJ1Y3QgZGV2aWNlICp0bXAsICpkZXYgPSAmdnJwLT52ZGV2LT5kZXY7CiAJaW50IHJldDsKIAogCS8qIG1ha2Ugc3VyZSBhIHNpbWlsYXIgY2hhbm5lbCBkb2Vzbid0IGFscmVhZHkgZXhpc3QgKi8KLQl0bXAgPSBkZXZpY2VfZmluZF9jaGlsZChkZXYsIGNoaW5mbywgcnBtc2dfY2hhbm5lbF9tYXRjaCk7CisJdG1wID0gcnBtc2dfZmluZF9kZXZpY2UoZGV2LCBjaGluZm8pOwogCWlmICh0bXApIHsKIAkJLyogZGVjcmVtZW50IHRoZSBtYXRjaGVkIGRldmljZSdzIHJlZmNvdW50IGJhY2sgKi8KIAkJcHV0X2RldmljZSh0bXApOwpAQCAtNTE0LDYyICszODMsMzggQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JcnBkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcnBtc2dfY2hhbm5lbCksIEdGUF9LRVJORUwpOwotCWlmICghcnBkZXYpIHsKLQkJcHJfZXJyKCJremFsbG9jIGZhaWxlZFxuIik7CisJdmNoID0ga3phbGxvYyhzaXplb2YoKnZjaCksIEdGUF9LRVJORUwpOworCWlmICghdmNoKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKLQlycGRldi0+dnJwID0gdnJwOworCS8qIExpbmsgdGhlIGNoYW5uZWwgdG8gb3VyIHZycCAqLworCXZjaC0+dnJwID0gdnJwOworCisJLyogQXNzaWduIGNhbGxiYWNrcyBmb3IgcnBtc2dfY2hhbm5lbCAqLworCXZjaC0+cnBkZXYub3BzID0gJnZpcnRpb19ycG1zZ19vcHM7CisKKwkvKiBBc3NpZ24gcHVibGljIGluZm9ybWF0aW9uIHRvIHRoZSBycG1zZ19kZXZpY2UgKi8KKwlycGRldiA9ICZ2Y2gtPnJwZGV2OwogCXJwZGV2LT5zcmMgPSBjaGluZm8tPnNyYzsKIAlycGRldi0+ZHN0ID0gY2hpbmZvLT5kc3Q7CisJcnBkZXYtPm9wcyA9ICZ2aXJ0aW9fcnBtc2dfb3BzOwogCiAJLyoKIAkgKiBycG1zZyBzZXJ2ZXIgY2hhbm5lbHMgaGFzIHByZWRlZmluZWQgbG9jYWwgYWRkcmVzcyAoZm9yIG5vdyksCiAJICogYW5kIHRoZWlyIGV4aXN0ZW5jZSBuZWVkcyB0byBiZSBhbm5vdW5jZWQgcmVtb3RlbHkKIAkgKi8KLQlycGRldi0+YW5ub3VuY2UgPSBycGRldi0+c3JjICE9IFJQTVNHX0FERFJfQU5ZID8gdHJ1ZSA6IGZhbHNlOworCXJwZGV2LT5hbm5vdW5jZSA9IHJwZGV2LT5zcmMgIT0gUlBNU0dfQUREUl9BTlk7CiAKIAlzdHJuY3B5KHJwZGV2LT5pZC5uYW1lLCBjaGluZm8tPm5hbWUsIFJQTVNHX05BTUVfU0laRSk7CiAKLQkvKiB2ZXJ5IHNpbXBsZSBkZXZpY2UgaW5kZXhpbmcgcGx1bWJpbmcgd2hpY2ggaXMgZW5vdWdoIGZvciBub3cgKi8KLQlkZXZfc2V0X25hbWUoJnJwZGV2LT5kZXYsICJycG1zZyVkIiwgcnBtc2dfZGV2X2luZGV4KyspOwotCiAJcnBkZXYtPmRldi5wYXJlbnQgPSAmdnJwLT52ZGV2LT5kZXY7Ci0JcnBkZXYtPmRldi5idXMgPSAmcnBtc2dfYnVzOwotCXJwZGV2LT5kZXYucmVsZWFzZSA9IHJwbXNnX3JlbGVhc2VfZGV2aWNlOwotCi0JcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKCZycGRldi0+ZGV2KTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZGV2LCAiZGV2aWNlX3JlZ2lzdGVyIGZhaWxlZDogJWRcbiIsIHJldCk7Ci0JCXB1dF9kZXZpY2UoJnJwZGV2LT5kZXYpOworCXJldCA9IHJwbXNnX3JlZ2lzdGVyX2RldmljZShycGRldik7CisJaWYgKHJldCkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJcmV0dXJuIHJwZGV2OwogfQogCi0vKgotICogZmluZCBhbiBleGlzdGluZyBjaGFubmVsIHVzaW5nIGl0cyBuYW1lICsgYWRkcmVzcyBwcm9wZXJ0aWVzLAotICogYW5kIGRlc3Ryb3kgaXQKLSAqLwotc3RhdGljIGludCBycG1zZ19kZXN0cm95X2NoYW5uZWwoc3RydWN0IHZpcnRwcm9jX2luZm8gKnZycCwKLQkJCQkJc3RydWN0IHJwbXNnX2NoYW5uZWxfaW5mbyAqY2hpbmZvKQotewotCXN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2ID0gdnJwLT52ZGV2OwotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQotCWRldiA9IGRldmljZV9maW5kX2NoaWxkKCZ2ZGV2LT5kZXYsIGNoaW5mbywgcnBtc2dfY2hhbm5lbF9tYXRjaCk7Ci0JaWYgKCFkZXYpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKLQotCXB1dF9kZXZpY2UoZGV2KTsKLQotCXJldHVybiAwOwotfQotCiAvKiBzdXBlciBzaW1wbGUgYnVmZmVyICJhbGxvY2F0b3IiIHRoYXQgaXMganVzdCBlbm91Z2ggZm9yIG5vdyAqLwogc3RhdGljIHZvaWQgKmdldF9hX3R4X2J1ZihzdHJ1Y3QgdmlydHByb2NfaW5mbyAqdnJwKQogewpAQCAtNjg0LDEwICs1MjksMTIgQEAKICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3IgdmFsdWUgb24gZmFpbHVyZS4KICAqLwotaW50IHJwbXNnX3NlbmRfb2ZmY2hhbm5lbF9yYXcoc3RydWN0IHJwbXNnX2NoYW5uZWwgKnJwZGV2LCB1MzIgc3JjLCB1MzIgZHN0LAotCQkJCQl2b2lkICpkYXRhLCBpbnQgbGVuLCBib29sIHdhaXQpCitzdGF0aWMgaW50IHJwbXNnX3NlbmRfb2ZmY2hhbm5lbF9yYXcoc3RydWN0IHJwbXNnX2RldmljZSAqcnBkZXYsCisJCQkJICAgICB1MzIgc3JjLCB1MzIgZHN0LAorCQkJCSAgICAgdm9pZCAqZGF0YSwgaW50IGxlbiwgYm9vbCB3YWl0KQogewotCXN0cnVjdCB2aXJ0cHJvY19pbmZvICp2cnAgPSBycGRldi0+dnJwOworCXN0cnVjdCB2aXJ0aW9fcnBtc2dfY2hhbm5lbCAqdmNoID0gdG9fdmlydGlvX3JwbXNnX2NoYW5uZWwocnBkZXYpOworCXN0cnVjdCB2aXJ0cHJvY19pbmZvICp2cnAgPSB2Y2gtPnZycDsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcnBkZXYtPmRldjsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CiAJc3RydWN0IHJwbXNnX2hkciAqbXNnOwpAQCAtNzUxLDEwICs1OTgsMTEgQEAKIAltZW1jcHkobXNnLT5kYXRhLCBkYXRhLCBsZW4pOwogCiAJZGV2X2RiZyhkZXYsICJUWCBGcm9tIDB4JXgsIFRvIDB4JXgsIExlbiAlZCwgRmxhZ3MgJWQsIFJlc2VydmVkICVkXG4iLAotCQkJCQltc2ctPnNyYywgbXNnLT5kc3QsIG1zZy0+bGVuLAotCQkJCQltc2ctPmZsYWdzLCBtc2ctPnJlc2VydmVkKTsKLQlwcmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCAicnBtc2dfdmlydGlvIFRYOiAiLCBEVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwKLQkJCQkJbXNnLCBzaXplb2YoKm1zZykgKyBtc2ctPmxlbiwgdHJ1ZSk7CisJCW1zZy0+c3JjLCBtc2ctPmRzdCwgbXNnLT5sZW4sIG1zZy0+ZmxhZ3MsIG1zZy0+cmVzZXJ2ZWQpOworI2lmIGRlZmluZWQoQ09ORklHX0RZTkFNSUNfREVCVUcpCisJZHluYW1pY19oZXhfZHVtcCgicnBtc2dfdmlydGlvIFRYOiAiLCBEVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwKKwkJCSBtc2csIHNpemVvZigqbXNnKSArIG1zZy0+bGVuLCB0cnVlKTsKKyNlbmRpZgogCiAJc2dfaW5pdF9vbmUoJnNnLCBtc2csIHNpemVvZigqbXNnKSArIGxlbik7CiAKQEAgLTc4MCw2ICs2MjgsNTYgQEAKIH0KIEVYUE9SVF9TWU1CT0wocnBtc2dfc2VuZF9vZmZjaGFubmVsX3Jhdyk7CiAKK3N0YXRpYyBpbnQgdmlydGlvX3JwbXNnX3NlbmQoc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQsIHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IHJwbXNnX2RldmljZSAqcnBkZXYgPSBlcHQtPnJwZGV2OworCXUzMiBzcmMgPSBlcHQtPmFkZHIsIGRzdCA9IHJwZGV2LT5kc3Q7CisKKwlyZXR1cm4gcnBtc2dfc2VuZF9vZmZjaGFubmVsX3JhdyhycGRldiwgc3JjLCBkc3QsIGRhdGEsIGxlbiwgdHJ1ZSk7Cit9CisKK3N0YXRpYyBpbnQgdmlydGlvX3JwbXNnX3NlbmR0byhzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdCwgdm9pZCAqZGF0YSwgaW50IGxlbiwKKwkJCSAgICAgICB1MzIgZHN0KQoreworCXN0cnVjdCBycG1zZ19kZXZpY2UgKnJwZGV2ID0gZXB0LT5ycGRldjsKKwl1MzIgc3JjID0gZXB0LT5hZGRyOworCisJcmV0dXJuIHJwbXNnX3NlbmRfb2ZmY2hhbm5lbF9yYXcocnBkZXYsIHNyYywgZHN0LCBkYXRhLCBsZW4sIHRydWUpOworfQorCitzdGF0aWMgaW50IHZpcnRpb19ycG1zZ19zZW5kX29mZmNoYW5uZWwoc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQsIHUzMiBzcmMsCisJCQkJCXUzMiBkc3QsIHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IHJwbXNnX2RldmljZSAqcnBkZXYgPSBlcHQtPnJwZGV2OworCisJcmV0dXJuIHJwbXNnX3NlbmRfb2ZmY2hhbm5lbF9yYXcocnBkZXYsIHNyYywgZHN0LCBkYXRhLCBsZW4sIHRydWUpOworfQorCitzdGF0aWMgaW50IHZpcnRpb19ycG1zZ190cnlzZW5kKHN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0LCB2b2lkICpkYXRhLCBpbnQgbGVuKQoreworCXN0cnVjdCBycG1zZ19kZXZpY2UgKnJwZGV2ID0gZXB0LT5ycGRldjsKKwl1MzIgc3JjID0gZXB0LT5hZGRyLCBkc3QgPSBycGRldi0+ZHN0OworCisJcmV0dXJuIHJwbXNnX3NlbmRfb2ZmY2hhbm5lbF9yYXcocnBkZXYsIHNyYywgZHN0LCBkYXRhLCBsZW4sIGZhbHNlKTsKK30KKworc3RhdGljIGludCB2aXJ0aW9fcnBtc2dfdHJ5c2VuZHRvKHN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0LCB2b2lkICpkYXRhLAorCQkJCSAgaW50IGxlbiwgdTMyIGRzdCkKK3sKKwlzdHJ1Y3QgcnBtc2dfZGV2aWNlICpycGRldiA9IGVwdC0+cnBkZXY7CisJdTMyIHNyYyA9IGVwdC0+YWRkcjsKKworCXJldHVybiBycG1zZ19zZW5kX29mZmNoYW5uZWxfcmF3KHJwZGV2LCBzcmMsIGRzdCwgZGF0YSwgbGVuLCBmYWxzZSk7Cit9CisKK3N0YXRpYyBpbnQgdmlydGlvX3JwbXNnX3RyeXNlbmRfb2ZmY2hhbm5lbChzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdCwgdTMyIHNyYywKKwkJCQkJICAgdTMyIGRzdCwgdm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgcnBtc2dfZGV2aWNlICpycGRldiA9IGVwdC0+cnBkZXY7CisKKwlyZXR1cm4gcnBtc2dfc2VuZF9vZmZjaGFubmVsX3JhdyhycGRldiwgc3JjLCBkc3QsIGRhdGEsIGxlbiwgZmFsc2UpOworfQorCiBzdGF0aWMgaW50IHJwbXNnX3JlY3Zfc2luZ2xlKHN0cnVjdCB2aXJ0cHJvY19pbmZvICp2cnAsIHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICAgc3RydWN0IHJwbXNnX2hkciAqbXNnLCB1bnNpZ25lZCBpbnQgbGVuKQogewpAQCAtNzg4LDE3ICs2ODYsMTggQEAKIAlpbnQgZXJyOwogCiAJZGV2X2RiZyhkZXYsICJGcm9tOiAweCV4LCBUbzogMHgleCwgTGVuOiAlZCwgRmxhZ3M6ICVkLCBSZXNlcnZlZDogJWRcbiIsCi0JCQkJCW1zZy0+c3JjLCBtc2ctPmRzdCwgbXNnLT5sZW4sCi0JCQkJCW1zZy0+ZmxhZ3MsIG1zZy0+cmVzZXJ2ZWQpOwotCXByaW50X2hleF9kdW1wKEtFUk5fREVCVUcsICJycG1zZ192aXJ0aW8gUlg6ICIsIERVTVBfUFJFRklYX05PTkUsIDE2LCAxLAotCQkJCQltc2csIHNpemVvZigqbXNnKSArIG1zZy0+bGVuLCB0cnVlKTsKKwkJbXNnLT5zcmMsIG1zZy0+ZHN0LCBtc2ctPmxlbiwgbXNnLT5mbGFncywgbXNnLT5yZXNlcnZlZCk7CisjaWYgZGVmaW5lZChDT05GSUdfRFlOQU1JQ19ERUJVRykKKwlkeW5hbWljX2hleF9kdW1wKCJycG1zZ192aXJ0aW8gUlg6ICIsIERVTVBfUFJFRklYX05PTkUsIDE2LCAxLAorCQkJIG1zZywgc2l6ZW9mKCptc2cpICsgbXNnLT5sZW4sIHRydWUpOworI2VuZGlmCiAKIAkvKgogCSAqIFdlIGN1cnJlbnRseSB1c2UgZml4ZWQtc2l6ZWQgYnVmZmVycywgc28gdHJpdmlhbGx5IHNhbml0aXplCiAJICogdGhlIHJlcG9ydGVkIHBheWxvYWQgbGVuZ3RoLgogCSAqLwogCWlmIChsZW4gPiBSUE1TR19CVUZfU0laRSB8fAotCQltc2ctPmxlbiA+IChsZW4gLSBzaXplb2Yoc3RydWN0IHJwbXNnX2hkcikpKSB7CisJICAgIG1zZy0+bGVuID4gKGxlbiAtIHNpemVvZihzdHJ1Y3QgcnBtc2dfaGRyKSkpIHsKIAkJZGV2X3dhcm4oZGV2LCAiaW5ib3VuZCBtc2cgdG9vIGJpZzogKCVkLCAlZClcbiIsIGxlbiwgbXNnLT5sZW4pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC04NjUsNyArNzY0LDcgQEAKIAkJbXNnc19yZWNlaXZlZCsrOwogCiAJCW1zZyA9IHZpcnRxdWV1ZV9nZXRfYnVmKHJ2cSwgJmxlbik7Ci0JfTsKKwl9CiAKIAlkZXZfZGJnKGRldiwgIlJlY2VpdmVkICV1IG1lc3NhZ2VzXG4iLCBtc2dzX3JlY2VpdmVkKTsKIApAQCAtODkyLDIzICs3OTEsMjQgQEAKIH0KIAogLyogaW52b2tlZCB3aGVuIGEgbmFtZSBzZXJ2aWNlIGFubm91bmNlbWVudCBhcnJpdmVzICovCi1zdGF0aWMgdm9pZCBycG1zZ19uc19jYihzdHJ1Y3QgcnBtc2dfY2hhbm5lbCAqcnBkZXYsIHZvaWQgKmRhdGEsIGludCBsZW4sCi0JCQkJCQkJdm9pZCAqcHJpdiwgdTMyIHNyYykKK3N0YXRpYyBpbnQgcnBtc2dfbnNfY2Ioc3RydWN0IHJwbXNnX2RldmljZSAqcnBkZXYsIHZvaWQgKmRhdGEsIGludCBsZW4sCisJCSAgICAgICB2b2lkICpwcml2LCB1MzIgc3JjKQogewogCXN0cnVjdCBycG1zZ19uc19tc2cgKm1zZyA9IGRhdGE7Ci0Jc3RydWN0IHJwbXNnX2NoYW5uZWwgKm5ld2NoOworCXN0cnVjdCBycG1zZ19kZXZpY2UgKm5ld2NoOwogCXN0cnVjdCBycG1zZ19jaGFubmVsX2luZm8gY2hpbmZvOwogCXN0cnVjdCB2aXJ0cHJvY19pbmZvICp2cnAgPSBwcml2OwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ2cnAtPnZkZXYtPmRldjsKIAlpbnQgcmV0OwogCi0JcHJpbnRfaGV4X2R1bXAoS0VSTl9ERUJVRywgIk5TIGFubm91bmNlbWVudDogIiwKLQkJCURVTVBfUFJFRklYX05PTkUsIDE2LCAxLAotCQkJZGF0YSwgbGVuLCB0cnVlKTsKKyNpZiBkZWZpbmVkKENPTkZJR19EWU5BTUlDX0RFQlVHKQorCWR5bmFtaWNfaGV4X2R1bXAoIk5TIGFubm91bmNlbWVudDogIiwgRFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsCisJCQkgZGF0YSwgbGVuLCB0cnVlKTsKKyNlbmRpZgogCiAJaWYgKGxlbiAhPSBzaXplb2YoKm1zZykpIHsKIAkJZGV2X2VycihkZXYsICJtYWxmb3JtZWQgbnMgbXNnICglZClcbiIsIGxlbik7Ci0JCXJldHVybjsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyoKQEAgLTkxOSwyMiArODE5LDIyIEBACiAJICovCiAJaWYgKHJwZGV2KSB7CiAJCWRldl9lcnIoZGV2LCAiYW5vbWFseTogbnMgZXB0IGhhcyBhbiBycGRldiBoYW5kbGVcbiIpOwotCQlyZXR1cm47CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCS8qIGRvbid0IHRydXN0IHRoZSByZW1vdGUgcHJvY2Vzc29yIGZvciBudWxsIHRlcm1pbmF0aW5nIHRoZSBuYW1lICovCiAJbXNnLT5uYW1lW1JQTVNHX05BTUVfU0laRSAtIDFdID0gJ1wwJzsKIAogCWRldl9pbmZvKGRldiwgIiVzaW5nIGNoYW5uZWwgJXMgYWRkciAweCV4XG4iLAotCQkJbXNnLT5mbGFncyAmIFJQTVNHX05TX0RFU1RST1kgPyAiZGVzdHJveSIgOiAiY3JlYXQiLAotCQkJbXNnLT5uYW1lLCBtc2ctPmFkZHIpOworCQkgbXNnLT5mbGFncyAmIFJQTVNHX05TX0RFU1RST1kgPyAiZGVzdHJveSIgOiAiY3JlYXQiLAorCQkgbXNnLT5uYW1lLCBtc2ctPmFkZHIpOwogCiAJc3RybmNweShjaGluZm8ubmFtZSwgbXNnLT5uYW1lLCBzaXplb2YoY2hpbmZvLm5hbWUpKTsKIAljaGluZm8uc3JjID0gUlBNU0dfQUREUl9BTlk7CiAJY2hpbmZvLmRzdCA9IG1zZy0+YWRkcjsKIAogCWlmIChtc2ctPmZsYWdzICYgUlBNU0dfTlNfREVTVFJPWSkgewotCQlyZXQgPSBycG1zZ19kZXN0cm95X2NoYW5uZWwodnJwLCAmY2hpbmZvKTsKKwkJcmV0ID0gcnBtc2dfdW5yZWdpc3Rlcl9kZXZpY2UoJnZycC0+dmRldi0+ZGV2LCAmY2hpbmZvKTsKIAkJaWYgKHJldCkKIAkJCWRldl9lcnIoZGV2LCAicnBtc2dfZGVzdHJveV9jaGFubmVsIGZhaWxlZDogJWRcbiIsIHJldCk7CiAJfSBlbHNlIHsKQEAgLTk0Miw2ICs4NDIsOCBAQAogCQlpZiAoIW5ld2NoKQogCQkJZGV2X2VycihkZXYsICJycG1zZ19jcmVhdGVfY2hhbm5lbCBmYWlsZWRcbiIpOwogCX0KKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHJwbXNnX3Byb2JlKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2KQpAQCAtOTk1LDggKzg5Nyw4IEBACiAJCWdvdG8gdnFzX2RlbDsKIAl9CiAKLQlkZXZfZGJnKCZ2ZGV2LT5kZXYsICJidWZmZXJzOiB2YSAlcCwgZG1hIDB4JWxseFxuIiwgYnVmc192YSwKLQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2cnAtPmJ1ZnNfZG1hKTsKKwlkZXZfZGJnKCZ2ZGV2LT5kZXYsICJidWZmZXJzOiB2YSAlcCwgZG1hICVwYWRcbiIsCisJCWJ1ZnNfdmEsICZ2cnAtPmJ1ZnNfZG1hKTsKIAogCS8qIGhhbGYgb2YgdGhlIGJ1ZmZlcnMgaXMgZGVkaWNhdGVkIGZvciBSWCAqLwogCXZycC0+cmJ1ZnMgPSBidWZzX3ZhOwpAQCAtMTAxMiw3ICs5MTQsNyBAQAogCQlzZ19pbml0X29uZSgmc2csIGNwdV9hZGRyLCBSUE1TR19CVUZfU0laRSk7CiAKIAkJZXJyID0gdmlydHF1ZXVlX2FkZF9pbmJ1Zih2cnAtPnJ2cSwgJnNnLCAxLCBjcHVfYWRkciwKLQkJCQkJCQkJR0ZQX0tFUk5FTCk7CisJCQkJCSAgR0ZQX0tFUk5FTCk7CiAJCVdBUk5fT04oZXJyKTsgLyogc2FuaXR5IGNoZWNrOyB0aGlzIGNhbid0IHJlYWxseSBoYXBwZW4gKi8KIAl9CiAKQEAgLTExMTksMTcgKzEwMjEsOSBAQAogewogCWludCByZXQ7CiAKLQlyZXQgPSBidXNfcmVnaXN0ZXIoJnJwbXNnX2J1cyk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoImZhaWxlZCB0byByZWdpc3RlciBycG1zZyBidXM6ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCXJldCA9IHJlZ2lzdGVyX3ZpcnRpb19kcml2ZXIoJnZpcnRpb19pcGNfZHJpdmVyKTsKLQlpZiAocmV0KSB7CisJaWYgKHJldCkKIAkJcHJfZXJyKCJmYWlsZWQgdG8gcmVnaXN0ZXIgdmlydGlvIGRyaXZlcjogJWRcbiIsIHJldCk7Ci0JCWJ1c191bnJlZ2lzdGVyKCZycG1zZ19idXMpOwotCX0KIAogCXJldHVybiByZXQ7CiB9CkBAIC0xMTM4LDcgKzEwMzIsNiBAQAogc3RhdGljIHZvaWQgX19leGl0IHJwbXNnX2Zpbmkodm9pZCkKIHsKIAl1bnJlZ2lzdGVyX3ZpcnRpb19kcml2ZXIoJnZpcnRpb19pcGNfZHJpdmVyKTsKLQlidXNfdW5yZWdpc3RlcigmcnBtc2dfYnVzKTsKIH0KIG1vZHVsZV9leGl0KHJwbXNnX2ZpbmkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYwppbmRleCA4OTczZDM0Li4xZGUwODkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMKQEAgLTIxMiwxNiArMjEyLDYgQEAKIHsKIAkvKiBEaXNhYmxlIGV4dGVuZGVkIGVycm9yIHJlcG9ydGluZyBmb3IgdGhpcyBkZXZpY2UuICovCiAJZGFzZF9lZXJfZGlzYWJsZShkZXZpY2UpOwotCS8qIEZvcmdldCB0aGUgZGlzY2lwbGluZSBpbmZvcm1hdGlvbi4gKi8KLQlpZiAoZGV2aWNlLT5kaXNjaXBsaW5lKSB7Ci0JCWlmIChkZXZpY2UtPmRpc2NpcGxpbmUtPnVuY2hlY2tfZGV2aWNlKQotCQkJZGV2aWNlLT5kaXNjaXBsaW5lLT51bmNoZWNrX2RldmljZShkZXZpY2UpOwotCQltb2R1bGVfcHV0KGRldmljZS0+ZGlzY2lwbGluZS0+b3duZXIpOwotCX0KLQlkZXZpY2UtPmRpc2NpcGxpbmUgPSBOVUxMOwotCWlmIChkZXZpY2UtPmJhc2VfZGlzY2lwbGluZSkKLQkJbW9kdWxlX3B1dChkZXZpY2UtPmJhc2VfZGlzY2lwbGluZS0+b3duZXIpOwotCWRldmljZS0+YmFzZV9kaXNjaXBsaW5lID0gTlVMTDsKIAlkZXZpY2UtPnN0YXRlID0gREFTRF9TVEFURV9ORVc7CiAKIAlpZiAoZGV2aWNlLT5ibG9jaykKQEAgLTMzNiw2ICszMjYsNyBAQAogewogCWludCByYzsKIAlzdHJ1Y3QgZGFzZF9ibG9jayAqYmxvY2s7CisJc3RydWN0IGdlbmRpc2sgKmRpc2s7CiAKIAlyYyA9IDA7CiAJYmxvY2sgPSBkZXZpY2UtPmJsb2NrOwpAQCAtMzQ2LDYgKzMzNyw5IEBACiAJCWlmIChyYykgewogCQkJaWYgKHJjICE9IC1FQUdBSU4pIHsKIAkJCQlkZXZpY2UtPnN0YXRlID0gREFTRF9TVEFURV9VTkZNVDsKKwkJCQlkaXNrID0gZGV2aWNlLT5ibG9jay0+Z2RwOworCQkJCWtvYmplY3RfdWV2ZW50KCZkaXNrX3RvX2RldihkaXNrKS0+a29iaiwKKwkJCQkJICAgICAgIEtPQkpfQ0hBTkdFKTsKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAkJCXJldHVybiByYzsKQEAgLTE2NDMsOSArMTYzNywxOCBAQAogCXU4ICpzZW5zZSA9IE5VTEw7CiAJaW50IGV4cGlyZXM7CiAKKwljcXIgPSAoc3RydWN0IGRhc2RfY2N3X3JlcSAqKSBpbnRwYXJtOwogCWlmIChJU19FUlIoaXJiKSkgewogCQlzd2l0Y2ggKFBUUl9FUlIoaXJiKSkgewogCQljYXNlIC1FSU86CisJCQlpZiAoY3FyICYmIGNxci0+c3RhdHVzID09IERBU0RfQ1FSX0NMRUFSX1BFTkRJTkcpIHsKKwkJCQlkZXZpY2UgPSAoc3RydWN0IGRhc2RfZGV2aWNlICopIGNxci0+c3RhcnRkZXY7CisJCQkJY3FyLT5zdGF0dXMgPSBEQVNEX0NRUl9DTEVBUkVEOworCQkJCWRhc2RfZGV2aWNlX2NsZWFyX3RpbWVyKGRldmljZSk7CisJCQkJd2FrZV91cCgmZGFzZF9mbHVzaF93cSk7CisJCQkJZGFzZF9zY2hlZHVsZV9kZXZpY2VfYmgoZGV2aWNlKTsKKwkJCQlyZXR1cm47CisJCQl9CiAJCQlicmVhazsKIAkJY2FzZSAtRVRJTUVET1VUOgogCQkJREJGX0VWRU5UX0RFVklEKERCRl9XQVJOSU5HLCBjZGV2LCAiJXM6ICIKQEAgLTE2NjEsNyArMTY2NCw2IEBACiAJfQogCiAJbm93ID0gZ2V0X3RvZF9jbG9jaygpOwotCWNxciA9IChzdHJ1Y3QgZGFzZF9jY3dfcmVxICopIGludHBhcm07CiAJLyogY2hlY2sgZm9yIGNvbmRpdGlvbnMgdGhhdCBzaG91bGQgYmUgaGFuZGxlZCBpbW1lZGlhdGVseSAqLwogCWlmICghY3FyIHx8CiAJICAgICEoc2Nzd19kc3RhdCgmaXJiLT5zY3N3KSA9PSAoREVWX1NUQVRfQ0hOX0VORCB8IERFVl9TVEFUX0RFVl9FTkQpICYmCkBAIC0yMjY2LDYgKzIyNjgsMTUgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAJCS8qCisJCSAqIERvbid0IHRyeSB0byBzdGFydCByZXF1ZXN0cyBpZiBkZXZpY2UgaXMgaW4KKwkJICogb2ZmbGluZSBwcm9jZXNzaW5nLCBpdCBtaWdodCB3YWl0IGZvcmV2ZXIKKwkJICovCisJCWlmICh0ZXN0X2JpdChEQVNEX0ZMQUdfT0ZGTElORSwgJmRldmljZS0+ZmxhZ3MpKSB7CisJCQljcXItPnN0YXR1cyA9IERBU0RfQ1FSX0ZBSUxFRDsKKwkJCWNxci0+aW50cmMgPSAtRU5PREVWOworCQkJY29udGludWU7CisJCX0KKwkJLyoKIAkJICogRG9uJ3QgdHJ5IHRvIHN0YXJ0IHJlcXVlc3RzIGlmIGRldmljZSBpcyBzdG9wcGVkCiAJCSAqIGV4Y2VwdCBwYXRoIHZlcmlmaWNhdGlvbiByZXF1ZXN0cwogCQkgKi8KQEAgLTMzNTYsNiArMzM2NywyMiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZGFzZF9nZW5lcmljX3Byb2JlKTsKIAordm9pZCBkYXNkX2dlbmVyaWNfZnJlZV9kaXNjaXBsaW5lKHN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlKQoreworCS8qIEZvcmdldCB0aGUgZGlzY2lwbGluZSBpbmZvcm1hdGlvbi4gKi8KKwlpZiAoZGV2aWNlLT5kaXNjaXBsaW5lKSB7CisJCWlmIChkZXZpY2UtPmRpc2NpcGxpbmUtPnVuY2hlY2tfZGV2aWNlKQorCQkJZGV2aWNlLT5kaXNjaXBsaW5lLT51bmNoZWNrX2RldmljZShkZXZpY2UpOworCQltb2R1bGVfcHV0KGRldmljZS0+ZGlzY2lwbGluZS0+b3duZXIpOworCQlkZXZpY2UtPmRpc2NpcGxpbmUgPSBOVUxMOworCX0KKwlpZiAoZGV2aWNlLT5iYXNlX2Rpc2NpcGxpbmUpIHsKKwkJbW9kdWxlX3B1dChkZXZpY2UtPmJhc2VfZGlzY2lwbGluZS0+b3duZXIpOworCQlkZXZpY2UtPmJhc2VfZGlzY2lwbGluZSA9IE5VTEw7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoZGFzZF9nZW5lcmljX2ZyZWVfZGlzY2lwbGluZSk7CisKIC8qCiAgKiBUaGlzIHdpbGwgb25lIGRheSBiZSBjYWxsZWQgZnJvbSBhIGdsb2JhbCBub3Rfb3BlciBoYW5kbGVyLgogICogSXQgaXMgYWxzbyB1c2VkIGJ5IGRyaXZlcl91bnJlZ2lzdGVyIGR1cmluZyBtb2R1bGUgdW5sb2FkLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZGV2bWFwLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kZXZtYXAuYwppbmRleCAzY2RiY2U0Li4xNWExYTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kZXZtYXAuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kZXZtYXAuYwpAQCAtNjE3LDYgKzYxNyw3IEBACiAJLyogV2FpdCBmb3IgcmVmZXJlbmNlIGNvdW50ZXIgdG8gZHJvcCB0byB6ZXJvLiAqLwogCXdhaXRfZXZlbnQoZGFzZF9kZWxldGVfd3EsIGF0b21pY19yZWFkKCZkZXZpY2UtPnJlZl9jb3VudCkgPT0gMCk7CiAKKwlkYXNkX2dlbmVyaWNfZnJlZV9kaXNjaXBsaW5lKGRldmljZSk7CiAJLyogRGlzY29ubmVjdCBkYXNkX2RldmljZSBzdHJ1Y3R1cmUgZnJvbSBjY3dfZGV2aWNlIHN0cnVjdHVyZS4gKi8KIAljZGV2ID0gZGV2aWNlLT5jZGV2OwogCWRldmljZS0+Y2RldiA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lY2tkLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lY2tkLmMKaW5kZXggZmQyZWZmNC4uODMxOTM1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWNrZC5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vja2QuYwpAQCAtNTA3OCw2ICs1MDc4LDggQEAKIAkJcmV0dXJuIFBUUl9FUlIoY3FyKTsKIAl9CiAKKwljcXItPmxwbSA9IGxwdW07CityZXRyeToKIAljcXItPnN0YXJ0ZGV2ID0gZGV2aWNlOwogCWNxci0+bWVtZGV2ID0gZGV2aWNlOwogCWNxci0+YmxvY2sgPSBOVUxMOwpAQCAtNTEyMiw2ICs1MTI0LDE0IEBACiAJCQkocHJzc2RwICsgMSk7CiAJCW1lbWNweShtZXNzYWdlcywgbWVzc2FnZV9idWYsCiAJCSAgICAgICBzaXplb2Yoc3RydWN0IGRhc2RfcnNzZF9tZXNzYWdlcykpOworCX0gZWxzZSBpZiAoY3FyLT5scG0pIHsKKwkJLyoKKwkJICogb24gei9WTSB3ZSBtaWdodCBub3QgYmUgYWJsZSB0byBkbyBJL08gb24gdGhlIHJlcXVlc3RlZCBwYXRoCisJCSAqIGJ1dCBpbnN0ZWFkIHdlIGdldCB0aGUgcmVxdWlyZWQgaW5mb3JtYXRpb24gb24gYW55IHBhdGgKKwkJICogc28gcmV0cnkgd2l0aCBvcGVuIHBhdGggbWFzaworCQkgKi8KKwkJY3FyLT5scG0gPSAwOworCQlnb3RvIHJldHJ5OwogCX0gZWxzZQogCQlEQkZfRVZFTlRfREVWSUQoREJGX1dBUk5JTkcsIGRldmljZS0+Y2RldiwKIAkJCQkiUmVhZGluZyBtZXNzYWdlcyBmYWlsZWQgd2l0aCByYz0lZFxuIgpAQCAtNTE5MSw3ICs1MjAxLDcgQEAKIAogCWNxci0+YnVpbGRjbGsgPSBnZXRfdG9kX2Nsb2NrKCk7CiAJY3FyLT5zdGF0dXMgPSBEQVNEX0NRUl9GSUxMRUQ7Ci0JcmMgPSBkYXNkX3NsZWVwX29uKGNxcik7CisJcmMgPSBkYXNkX3NsZWVwX29uX2ludGVycnVwdGlibGUoY3FyKTsKIAlpZiAocmMgPT0gMCkgewogCQkqZGF0YSA9ICpob3N0X2FjY2VzczsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZXJwLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lcnAuYwppbmRleCBlMWU4ODQ4Li5kMTM4ZDAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lcnAuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lcnAuYwpAQCAtMTY5LDEyICsxNjksMTIgQEAKIAlkZXZpY2UgPSBjcXItPnN0YXJ0ZGV2OwogCWlmIChjcXItPmludHJjID09IC1FVElNRURPVVQpIHsKIAkJZGV2X2VycigmZGV2aWNlLT5jZGV2LT5kZXYsCi0JCQkiQSB0aW1lb3V0IGVycm9yIG9jY3VycmVkIGZvciBjcXIgJXAiLCBjcXIpOworCQkJIkEgdGltZW91dCBlcnJvciBvY2N1cnJlZCBmb3IgY3FyICVwXG4iLCBjcXIpOwogCQlyZXR1cm47CiAJfQogCWlmIChjcXItPmludHJjID09IC1FTk9MSU5LKSB7CiAJCWRldl9lcnIoJmRldmljZS0+Y2Rldi0+ZGV2LAotCQkJIkEgdHJhbnNwb3J0IGVycm9yIG9jY3VycmVkIGZvciBjcXIgJXAiLCBjcXIpOworCQkJIkEgdHJhbnNwb3J0IGVycm9yIG9jY3VycmVkIGZvciBjcXIgJXBcbiIsIGNxcik7CiAJCXJldHVybjsKIAl9CiAJLyogZHVtcCBzZW5zZSBkYXRhICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9pbnQuaCBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ludC5oCmluZGV4IGFjNzAyN2UuLjg3ZmY2Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ludC5oCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ludC5oCkBAIC03MjUsNiArNzI1LDcgQEAKIGludCAgZGFzZF9jYW5jZWxfcmVxKHN0cnVjdCBkYXNkX2Njd19yZXEgKik7CiBpbnQgZGFzZF9mbHVzaF9kZXZpY2VfcXVldWUoc3RydWN0IGRhc2RfZGV2aWNlICopOwogaW50IGRhc2RfZ2VuZXJpY19wcm9iZSAoc3RydWN0IGNjd19kZXZpY2UgKiwgc3RydWN0IGRhc2RfZGlzY2lwbGluZSAqKTsKK3ZvaWQgZGFzZF9nZW5lcmljX2ZyZWVfZGlzY2lwbGluZShzdHJ1Y3QgZGFzZF9kZXZpY2UgKik7CiB2b2lkIGRhc2RfZ2VuZXJpY19yZW1vdmUgKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KTsKIGludCBkYXNkX2dlbmVyaWNfc2V0X29ubGluZShzdHJ1Y3QgY2N3X2RldmljZSAqLCBzdHJ1Y3QgZGFzZF9kaXNjaXBsaW5lICopOwogaW50IGRhc2RfZ2VuZXJpY19zZXRfb2ZmbGluZSAoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvY29uMzI3MC5jIGIvZHJpdmVycy9zMzkwL2NoYXIvY29uMzI3MC5jCmluZGV4IDZiMTU3N2MuLjI4NWI0MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyNzAuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjcwLmMKQEAgLTEyNCw3ICsxMjQsMTIgQEAKIHN0YXRpYyB2b2lkCiBjb24zMjcwX3VwZGF0ZV9zdHJpbmcoc3RydWN0IGNvbjMyNzAgKmNwLCBzdHJ1Y3Qgc3RyaW5nICpzLCBpbnQgbnIpCiB7Ci0JaWYgKHMtPmxlbiA+PSBjcC0+dmlldy5jb2xzIC0gNSkKKwlpZiAocy0+bGVuIDwgNCkgeworCQkvKiBUaGlzIGluZGljYXRlcyBhIGJ1ZywgYnV0IHByaW50aW5nIGEgd2FybmluZyB3b3VsZAorCQkgKiBjYXVzZSBhIGRlYWRsb2NrLiAqLworCQlyZXR1cm47CisJfQorCWlmIChzLT5zdHJpbmdbcy0+bGVuIC0gNF0gIT0gVE9fUkEpCiAJCXJldHVybjsKIAlyYXczMjcwX2J1ZmZlcl9hZGRyZXNzKGNwLT52aWV3LmRldiwgcy0+c3RyaW5nICsgcy0+bGVuIC0gMywKIAkJCSAgICAgICBjcC0+dmlldy5jb2xzICogKG5yICsgMSkpOwpAQCAtNDYwLDExICs0NjUsMTEgQEAKIAkJY3AtPmNsaW5lLT5sZW4gKyA0IDogY3AtPnZpZXcuY29sczsKIAlzID0gY29uMzI3MF9hbGxvY19zdHJpbmcoY3AsIHNpemUpOwogCW1lbWNweShzLT5zdHJpbmcsIGNwLT5jbGluZS0+c3RyaW5nLCBjcC0+Y2xpbmUtPmxlbik7Ci0JaWYgKHMtPmxlbiA8IGNwLT52aWV3LmNvbHMgLSA1KSB7CisJaWYgKGNwLT5jbGluZS0+bGVuIDwgY3AtPnZpZXcuY29scyAtIDUpIHsKIAkJcy0+c3RyaW5nW3MtPmxlbiAtIDRdID0gVE9fUkE7CiAJCXMtPnN0cmluZ1tzLT5sZW4gLSAxXSA9IDA7CiAJfSBlbHNlIHsKLQkJd2hpbGUgKC0tc2l6ZSA+IGNwLT5jbGluZS0+bGVuKQorCQl3aGlsZSAoLS1zaXplID49IGNwLT5jbGluZS0+bGVuKQogCQkJcy0+c3RyaW5nW3NpemVdID0gY3AtPnZpZXcuYXNjZWJjWycgJ107CiAJfQogCS8qIFJlcGxhY2UgY2xpbmUgd2l0aCBhbGxvY2F0ZWQgbGluZSBzIGFuZCByZXNldCBjbGluZS4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfY3RsLmMgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX2N0bC5jCmluZGV4IGVhNjA3YTQuLjU1NGVhYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfY3RsLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9jdGwuYwpAQCAtMTI2LDIxICsxMjYsNCBAQAogCS5uYW1lID0gInNjbHAiLAogCS5mb3BzID0gJnNjbHBfY3RsX2ZvcHMsCiB9OwotCi0vKgotICogUmVnaXN0ZXIgc2NscF9jdGwgbWlzYyBkZXZpY2UKLSAqLwotc3RhdGljIGludCBfX2luaXQgc2NscF9jdGxfaW5pdCh2b2lkKQotewotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZzY2xwX2N0bF9kZXZpY2UpOwotfQotbW9kdWxlX2luaXQoc2NscF9jdGxfaW5pdCk7Ci0KLS8qCi0gKiBEZXJlZ2lzdGVyIHNjbHBfY3RsIG1pc2MgZGV2aWNlCi0gKi8KLXN0YXRpYyB2b2lkIF9fZXhpdCBzY2xwX2N0bF9leGl0KHZvaWQpCi17Ci0JbWlzY19kZXJlZ2lzdGVyKCZzY2xwX2N0bF9kZXZpY2UpOwotfQotbW9kdWxlX2V4aXQoc2NscF9jdGxfZXhpdCk7Cittb2R1bGVfbWlzY19kZXZpY2Uoc2NscF9jdGxfZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfMzU5MC5jIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMKaW5kZXggZDNkMTkzNi4uZTM1MjA0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMKQEAgLTMxMiwxNSArMzEyLDEwIEBACiAJCXJldHVybiAtRU5PU1lTOwogCWlmICghY3J5cHRfZW5hYmxlZChkZXZpY2UpKQogCQlyZXR1cm4gLUVVTkFUQ0g7Ci0JZXh0X2tla2xzID0ga21hbGxvYyhzaXplb2YoKmV4dF9rZWtscyksIEdGUF9LRVJORUwpOwotCWlmICghZXh0X2tla2xzKQotCQlyZXR1cm4gLUVOT01FTTsKLQlpZiAoY29weV9mcm9tX3VzZXIoZXh0X2tla2xzLCAoY2hhciBfX3VzZXIgKilhcmcsIHNpemVvZigqZXh0X2tla2xzKSkpIHsKLQkJcmMgPSAtRUZBVUxUOwotCQlnb3RvIG91dDsKLQl9CisJZXh0X2tla2xzID0gbWVtZHVwX3VzZXIoKGNoYXIgX191c2VyICopYXJnLCBzaXplb2YoKmV4dF9rZWtscykpOworCWlmIChJU19FUlIoZXh0X2tla2xzKSkKKwkJcmV0dXJuIFBUUl9FUlIoZXh0X2tla2xzKTsKIAlyYyA9IHRhcGVfMzU5Ml9rZWtsX3NldChkZXZpY2UsIGV4dF9rZWtscyk7Ci1vdXQ6CiAJa2ZyZWUoZXh0X2tla2xzKTsKIAlyZXR1cm4gcmM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci92bXVyLmMgYi9kcml2ZXJzL3MzOTAvY2hhci92bXVyLmMKaW5kZXggNmMzMGU5M2EuLmZmMThmMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3ZtdXIuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci92bXVyLmMKQEAgLTMwNiwxMCArMzA2LDExIEBACiB7CiAJc3RydWN0IHVyZGV2ICp1cmQ7CiAKLQlUUkFDRSgidXJfaW50X2hhbmRsZXI6IGludHBhcm09MHglbHggY3N0YXQ9JTAyeCBkc3RhdD0lMDJ4IHJlcz0ldVxuIiwKLQkgICAgICBpbnRwYXJtLCBpcmItPnNjc3cuY21kLmNzdGF0LCBpcmItPnNjc3cuY21kLmRzdGF0LAotCSAgICAgIGlyYi0+c2Nzdy5jbWQuY291bnQpOwotCisJaWYgKCFJU19FUlIoaXJiKSkgeworCQlUUkFDRSgidXJfaW50X2hhbmRsZXI6IGludHBhcm09MHglbHggY3N0YXQ9JTAyeCBkc3RhdD0lMDJ4IHJlcz0ldVxuIiwKKwkJICAgICAgaW50cGFybSwgaXJiLT5zY3N3LmNtZC5jc3RhdCwgaXJiLT5zY3N3LmNtZC5kc3RhdCwKKwkJICAgICAgaXJiLT5zY3N3LmNtZC5jb3VudCk7CisJfQogCWlmICghaW50cGFybSkgewogCQlUUkFDRSgidXJfaW50X2hhbmRsZXI6IHVuc29saWNpdGVkIGludGVycnVwdFxuIik7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2hzYy5jIGIvZHJpdmVycy9zMzkwL2Npby9jaHNjLmMKaW5kZXggOTQwZTcyNS4uMTE2NzQ2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jaHNjLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jaHNjLmMKQEAgLTk1LDEyICs5NSwxMyBAQAogaW50IGNoc2NfZ2V0X3NzZF9pbmZvKHN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkLCBzdHJ1Y3QgY2hzY19zc2RfaW5mbyAqc3NkKQogewogCXN0cnVjdCBjaHNjX3NzZF9hcmVhICpzc2RfYXJlYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBjY29kZTsKIAlpbnQgcmV0OwogCWludCBpOwogCWludCBtYXNrOwogCi0Jc3Bpbl9sb2NrX2lycSgmY2hzY19wYWdlX2xvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaHNjX3BhZ2VfbG9jaywgZmxhZ3MpOwogCW1lbXNldChjaHNjX3BhZ2UsIDAsIFBBR0VfU0laRSk7CiAJc3NkX2FyZWEgPSBjaHNjX3BhZ2U7CiAJc3NkX2FyZWEtPnJlcXVlc3QubGVuZ3RoID0gMHgwMDEwOwpAQCAtMTQ0LDcgKzE0NSw3IEBACiAJCQlzc2QtPmZsYVtpXSA9IHNzZF9hcmVhLT5mbGFbaV07CiAJfQogb3V0OgotCXNwaW5fdW5sb2NrX2lycSgmY2hzY19wYWdlX2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoc2NfcGFnZV9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtODMyLDkgKzgzMywxMCBAQAogCQl1MzIgZm10IDogNDsKIAkJdTMyIDogMTY7CiAJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgKnNlY21fYXJlYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQsIGNjb2RlOwogCi0Jc3Bpbl9sb2NrX2lycSgmY2hzY19wYWdlX2xvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaHNjX3BhZ2VfbG9jaywgZmxhZ3MpOwogCW1lbXNldChjaHNjX3BhZ2UsIDAsIFBBR0VfU0laRSk7CiAJc2VjbV9hcmVhID0gY2hzY19wYWdlOwogCXNlY21fYXJlYS0+cmVxdWVzdC5sZW5ndGggPSAweDAwNTA7CkBAIC04NjQsNyArODY2LDcgQEAKIAkJQ0lPX0NSV19FVkVOVCgyLCAiY2hzYzogc2VjbSBmYWlsZWQgKHJjPSUwNHgpXG4iLAogCQkJICAgICAgc2VjbV9hcmVhLT5yZXNwb25zZS5jb2RlKTsKIG91dDoKLQlzcGluX3VubG9ja19pcnEoJmNoc2NfcGFnZV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaHNjX3BhZ2VfbG9jaywgZmxhZ3MpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTk5Miw2ICs5OTQsNyBAQAogCiBpbnQgY2hzY19nZXRfY2hhbm5lbF9tZWFzdXJlbWVudF9jaGFycyhzdHJ1Y3QgY2hhbm5lbF9wYXRoICpjaHApCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgY2NvZGUsIHJldDsKIAogCXN0cnVjdCB7CkBAIC0xMDIxLDcgKzEwMjQsNyBAQAogCWlmICghY3NzX2Noc2NfY2hhcmFjdGVyaXN0aWNzLnNjbWMgfHwgIWNzc19jaHNjX2NoYXJhY3RlcmlzdGljcy5zZWNtKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXNwaW5fbG9ja19pcnEoJmNoc2NfcGFnZV9sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hzY19wYWdlX2xvY2ssIGZsYWdzKTsKIAltZW1zZXQoY2hzY19wYWdlLCAwLCBQQUdFX1NJWkUpOwogCXNjbWNfYXJlYSA9IGNoc2NfcGFnZTsKIAlzY21jX2FyZWEtPnJlcXVlc3QubGVuZ3RoID0gMHgwMDEwOwpAQCAtMTA1Myw3ICsxMDU2LDcgQEAKIAljaHNjX2luaXRpYWxpemVfY21nX2NoYXJzKGNocCwgc2NtY19hcmVhLT5jbWN2LAogCQkJCSAgKHN0cnVjdCBjbWdfY2hhcnMgKikgJnNjbWNfYXJlYS0+ZGF0YSk7CiBvdXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxKCZjaHNjX3BhZ2VfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hzY19wYWdlX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMTM0LDYgKzExMzcsNyBAQAogaW50IF9faW5pdAogY2hzY19kZXRlcm1pbmVfY3NzX2NoYXJhY3RlcmlzdGljcyh2b2lkKQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJlc3VsdDsKIAlzdHJ1Y3QgewogCQlzdHJ1Y3QgY2hzY19oZWFkZXIgcmVxdWVzdDsKQEAgLTExNDYsNyArMTE1MCw3IEBACiAJCXUzMiBjaHNjX2NoYXJbNTA4XTsKIAl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAqc2NzY19hcmVhOwogCi0Jc3Bpbl9sb2NrX2lycSgmY2hzY19wYWdlX2xvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaHNjX3BhZ2VfbG9jaywgZmxhZ3MpOwogCW1lbXNldChjaHNjX3BhZ2UsIDAsIFBBR0VfU0laRSk7CiAJc2NzY19hcmVhID0gY2hzY19wYWdlOwogCXNjc2NfYXJlYS0+cmVxdWVzdC5sZW5ndGggPSAweDAwMTA7CkBAIC0xMTY4LDcgKzExNzIsNyBAQAogCQlDSU9fQ1JXX0VWRU5UKDIsICJjaHNjOiBzY3NjIGZhaWxlZCAocmM9JTA0eClcbiIsCiAJCQkgICAgICBzY3NjX2FyZWEtPnJlc3BvbnNlLmNvZGUpOwogZXhpdDoKLQlzcGluX3VubG9ja19pcnEoJmNoc2NfcGFnZV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaHNjX3BhZ2VfbG9jaywgZmxhZ3MpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmggYi9kcml2ZXJzL3MzOTAvY2lvL2Npby5oCmluZGV4IDkzZGUwYjQuLmYwZTU3YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmgKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jaW8uaApAQCAtMTI3LDcgKzEyNyw2IEBACiBleHRlcm4gaW50IGNpb19oYWx0IChzdHJ1Y3Qgc3ViY2hhbm5lbCAqKTsKIGV4dGVybiBpbnQgY2lvX3N0YXJ0IChzdHJ1Y3Qgc3ViY2hhbm5lbCAqLCBzdHJ1Y3QgY2N3MSAqLCBfX3U4KTsKIGV4dGVybiBpbnQgY2lvX3N0YXJ0X2tleSAoc3RydWN0IHN1YmNoYW5uZWwgKiwgc3RydWN0IGNjdzEgKiwgX191OCwgX191OCk7Ci1leHRlcm4gaW50IGNpb19jYW5jZWwgKHN0cnVjdCBzdWJjaGFubmVsICopOwogZXh0ZXJuIGludCBjaW9fc2V0X29wdGlvbnMgKHN0cnVjdCBzdWJjaGFubmVsICosIGludCk7CiBleHRlcm4gaW50IGNpb191cGRhdGVfc2NoaWIoc3RydWN0IHN1YmNoYW5uZWwgKnNjaCk7CiBleHRlcm4gaW50IGNpb19jb21taXRfY29uZmlnKHN0cnVjdCBzdWJjaGFubmVsICpzY2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMKaW5kZXggN2FkYTA3OC4uNmE1OGJjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5jCkBAIC03NjIsNyArNzYyLDYgQEAKIAlwcml2LT5zdGF0ZSA9IERFVl9TVEFURV9OT1RfT1BFUjsKIAlwcml2LT5kZXZfaWQuZGV2bm8gPSBzY2gtPnNjaGliLnBtY3cuZGV2OwogCXByaXYtPmRldl9pZC5zc2lkID0gc2NoLT5zY2hpZC5zc2lkOwotCXByaXYtPnNjaGlkID0gc2NoLT5zY2hpZDsKIAogCUlOSVRfV09SSygmcHJpdi0+dG9kb193b3JrLCBjY3dfZGV2aWNlX3RvZG8pOwogCUlOSVRfTElTVF9IRUFEKCZwcml2LT5jbWJfbGlzdCk7CkBAIC0xMDAwLDcgKzk5OSw2IEBACiAJcHV0X2RldmljZSgmb2xkX3NjaC0+ZGV2KTsKIAkvKiBJbml0aWFsaXplIG5ldyBzdWJjaGFubmVsLiAqLwogCXNwaW5fbG9ja19pcnEoc2NoLT5sb2NrKTsKLQljZGV2LT5wcml2YXRlLT5zY2hpZCA9IHNjaC0+c2NoaWQ7CiAJY2Rldi0+Y2N3bG9jayA9IHNjaC0+bG9jazsKIAlpZiAoIXNjaF9pc19wc2V1ZG9fc2NoKHNjaCkpCiAJCXNjaF9zZXRfY2RldihzY2gsIGNkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfc3RhdHVzLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9zdGF0dXMuYwppbmRleCAxNWI1NmExLi45YmMzNTEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9zdGF0dXMuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9zdGF0dXMuYwpAQCAtMjYsNiArMjYsNyBAQAogc3RhdGljIHZvaWQKIGNjd19kZXZpY2VfbXNnX2NvbnRyb2xfY2hlY2soc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsIHN0cnVjdCBpcmIgKmlyYikKIHsKKwlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoID0gdG9fc3ViY2hhbm5lbChjZGV2LT5kZXYucGFyZW50KTsKIAljaGFyIGRiZl90ZXh0WzE1XTsKIAogCWlmICghc2Nzd19pc192YWxpZF9jc3RhdCgmaXJiLT5zY3N3KSB8fApAQCAtMzYsMTAgKzM3LDEwIEBACiAJCSAgICAgICJyZWNlaXZlZCIKIAkJICAgICAgIiAuLi4gZGV2aWNlICUwNHggb24gc3ViY2hhbm5lbCAwLiV4LiUwNHgsIGRldl9zdGF0ICIKIAkJICAgICAgIjogJTAyWCBzY2hfc3RhdCA6ICUwMlhcbiIsCi0JCSAgICAgIGNkZXYtPnByaXZhdGUtPmRldl9pZC5kZXZubywgY2Rldi0+cHJpdmF0ZS0+c2NoaWQuc3NpZCwKLQkJICAgICAgY2Rldi0+cHJpdmF0ZS0+c2NoaWQuc2NoX25vLAorCQkgICAgICBjZGV2LT5wcml2YXRlLT5kZXZfaWQuZGV2bm8sIHNjaC0+c2NoaWQuc3NpZCwKKwkJICAgICAgc2NoLT5zY2hpZC5zY2hfbm8sCiAJCSAgICAgIHNjc3dfZHN0YXQoJmlyYi0+c2NzdyksIHNjc3dfY3N0YXQoJmlyYi0+c2NzdykpOwotCXNwcmludGYoZGJmX3RleHQsICJjaGsleCIsIGNkZXYtPnByaXZhdGUtPnNjaGlkLnNjaF9ubyk7CisJc3ByaW50ZihkYmZfdGV4dCwgImNoayV4Iiwgc2NoLT5zY2hpZC5zY2hfbm8pOwogCUNJT19UUkFDRV9FVkVOVCgwLCBkYmZfdGV4dCk7CiAJQ0lPX0hFWF9FVkVOVCgwLCBpcmIsIHNpemVvZihzdHJ1Y3QgaXJiKSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2lvX3NjaC5oIGIvZHJpdmVycy9zMzkwL2Npby9pb19zY2guaAppbmRleCA4OTc1MDYwLi4yMjBmNDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2lvX3NjaC5oCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vaW9fc2NoLmgKQEAgLTEyMCw3ICsxMjAsNiBAQAogCWludCBzdGF0ZTsJCS8qIGRldmljZSBzdGF0ZSAqLwogCWF0b21pY190IG9ub2ZmOwogCXN0cnVjdCBjY3dfZGV2X2lkIGRldl9pZDsJLyogZGV2aWNlIGlkICovCi0Jc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQ7CS8qIHN1YmNoYW5uZWwgbnVtYmVyICovCiAJc3RydWN0IGNjd19yZXF1ZXN0IHJlcTsJCS8qIGludGVybmFsIEkvTyByZXF1ZXN0ICovCiAJaW50IGlyZXRyeTsKIAl1OCBwZ2lkX3ZhbGlkX21hc2s7CS8qIG1hc2sgb2YgdmFsaWQgUEdJRHMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vcWRpb19tYWluLmMgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fbWFpbi5jCmluZGV4IDRiYjUyNjJmLi43MWJmOWJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vcWRpb19tYWluLmMKQEAgLTY4Niw2ICs2ODYsMTUgQEAKIAlxLT5xZGlvX2Vycm9yID0gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgcWRpb190YXNrbGV0X3NjaGVkdWxlKHN0cnVjdCBxZGlvX3EgKnEpCit7CisJaWYgKGxpa2VseShxLT5pcnFfcHRyLT5zdGF0ZSA9PSBRRElPX0lSUV9TVEFURV9BQ1RJVkUpKSB7CisJCXRhc2tsZXRfc2NoZWR1bGUoJnEtPnRhc2tsZXQpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FUEVSTTsKK30KKwogc3RhdGljIHZvaWQgX19xZGlvX2luYm91bmRfcHJvY2Vzc2luZyhzdHJ1Y3QgcWRpb19xICpxKQogewogCXFwZXJmX2luYyhxLCB0YXNrbGV0X2luYm91bmQpOwpAQCAtNjk4LDEwICs3MDcsOCBAQAogCWlmICghcWRpb19pbmJvdW5kX3FfZG9uZShxKSkgewogCQkvKiBtZWFucyBwb2xsIHRpbWUgaXMgbm90IHlldCBvdmVyICovCiAJCXFwZXJmX2luYyhxLCB0YXNrbGV0X2luYm91bmRfcmVzY2hlZCk7Ci0JCWlmIChsaWtlbHkocS0+aXJxX3B0ci0+c3RhdGUgIT0gUURJT19JUlFfU1RBVEVfU1RPUFBFRCkpIHsKLQkJCXRhc2tsZXRfc2NoZWR1bGUoJnEtPnRhc2tsZXQpOworCQlpZiAoIXFkaW9fdGFza2xldF9zY2hlZHVsZShxKSkKIAkJCXJldHVybjsKLQkJfQogCX0KIAogCXFkaW9fc3RvcF9wb2xsaW5nKHEpOwpAQCAtNzExLDggKzcxOCw3IEBACiAJICovCiAJaWYgKCFxZGlvX2luYm91bmRfcV9kb25lKHEpKSB7CiAJCXFwZXJmX2luYyhxLCB0YXNrbGV0X2luYm91bmRfcmVzY2hlZDIpOwotCQlpZiAobGlrZWx5KHEtPmlycV9wdHItPnN0YXRlICE9IFFESU9fSVJRX1NUQVRFX1NUT1BQRUQpKQotCQkJdGFza2xldF9zY2hlZHVsZSgmcS0+dGFza2xldCk7CisJCXFkaW9fdGFza2xldF9zY2hlZHVsZShxKTsKIAl9CiB9CiAKQEAgLTg2OSwxNiArODc1LDE1IEBACiAJICogaXMgbm90aWNlZCBhbmQgb3V0Ym91bmRfaGFuZGxlciBpcyBjYWxsZWQgYWZ0ZXIgc29tZSB0aW1lLgogCSAqLwogCWlmIChxZGlvX291dGJvdW5kX3FfZG9uZShxKSkKLQkJZGVsX3RpbWVyKCZxLT51Lm91dC50aW1lcik7CisJCWRlbF90aW1lcl9zeW5jKCZxLT51Lm91dC50aW1lcik7CiAJZWxzZQotCQlpZiAoIXRpbWVyX3BlbmRpbmcoJnEtPnUub3V0LnRpbWVyKSkKKwkJaWYgKCF0aW1lcl9wZW5kaW5nKCZxLT51Lm91dC50aW1lcikgJiYKKwkJICAgIGxpa2VseShxLT5pcnFfcHRyLT5zdGF0ZSA9PSBRRElPX0lSUV9TVEFURV9BQ1RJVkUpKQogCQkJbW9kX3RpbWVyKCZxLT51Lm91dC50aW1lciwgamlmZmllcyArIDEwICogSFopOwogCXJldHVybjsKIAogc2NoZWQ6Ci0JaWYgKHVubGlrZWx5KHEtPmlycV9wdHItPnN0YXRlID09IFFESU9fSVJRX1NUQVRFX1NUT1BQRUQpKQotCQlyZXR1cm47Ci0JdGFza2xldF9zY2hlZHVsZSgmcS0+dGFza2xldCk7CisJcWRpb190YXNrbGV0X3NjaGVkdWxlKHEpOwogfQogCiAvKiBvdXRib3VuZCB0YXNrbGV0ICovCkBAIC04OTIsOSArODk3LDcgQEAKIHsKIAlzdHJ1Y3QgcWRpb19xICpxID0gKHN0cnVjdCBxZGlvX3EgKilkYXRhOwogCi0JaWYgKHVubGlrZWx5KHEtPmlycV9wdHItPnN0YXRlID09IFFESU9fSVJRX1NUQVRFX1NUT1BQRUQpKQotCQlyZXR1cm47Ci0JdGFza2xldF9zY2hlZHVsZSgmcS0+dGFza2xldCk7CisJcWRpb190YXNrbGV0X3NjaGVkdWxlKHEpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcWRpb19jaGVja19vdXRib3VuZF9hZnRlcl90aGluaW50KHN0cnVjdCBxZGlvX3EgKnEpCkBAIC05MDcsNyArOTEwLDcgQEAKIAogCWZvcl9lYWNoX291dHB1dF9xdWV1ZShxLT5pcnFfcHRyLCBvdXQsIGkpCiAJCWlmICghcWRpb19vdXRib3VuZF9xX2RvbmUob3V0KSkKLQkJCXRhc2tsZXRfc2NoZWR1bGUoJm91dC0+dGFza2xldCk7CisJCQlxZGlvX3Rhc2tsZXRfc2NoZWR1bGUob3V0KTsKIH0KIAogc3RhdGljIHZvaWQgX190aXFkaW9faW5ib3VuZF9wcm9jZXNzaW5nKHN0cnVjdCBxZGlvX3EgKnEpCkBAIC05MjksMTAgKzkzMiw4IEBACiAKIAlpZiAoIXFkaW9faW5ib3VuZF9xX2RvbmUocSkpIHsKIAkJcXBlcmZfaW5jKHEsIHRhc2tsZXRfaW5ib3VuZF9yZXNjaGVkKTsKLQkJaWYgKGxpa2VseShxLT5pcnFfcHRyLT5zdGF0ZSAhPSBRRElPX0lSUV9TVEFURV9TVE9QUEVEKSkgewotCQkJdGFza2xldF9zY2hlZHVsZSgmcS0+dGFza2xldCk7CisJCWlmICghcWRpb190YXNrbGV0X3NjaGVkdWxlKHEpKQogCQkJcmV0dXJuOwotCQl9CiAJfQogCiAJcWRpb19zdG9wX3BvbGxpbmcocSk7CkBAIC05NDIsOCArOTQzLDcgQEAKIAkgKi8KIAlpZiAoIXFkaW9faW5ib3VuZF9xX2RvbmUocSkpIHsKIAkJcXBlcmZfaW5jKHEsIHRhc2tsZXRfaW5ib3VuZF9yZXNjaGVkMik7Ci0JCWlmIChsaWtlbHkocS0+aXJxX3B0ci0+c3RhdGUgIT0gUURJT19JUlFfU1RBVEVfU1RPUFBFRCkpCi0JCQl0YXNrbGV0X3NjaGVkdWxlKCZxLT50YXNrbGV0KTsKKwkJcWRpb190YXNrbGV0X3NjaGVkdWxlKHEpOwogCX0KIH0KIApAQCAtOTc3LDcgKzk3Nyw3IEBACiAJaW50IGk7CiAJc3RydWN0IHFkaW9fcSAqcTsKIAotCWlmICh1bmxpa2VseShpcnFfcHRyLT5zdGF0ZSA9PSBRRElPX0lSUV9TVEFURV9TVE9QUEVEKSkKKwlpZiAodW5saWtlbHkoaXJxX3B0ci0+c3RhdGUgIT0gUURJT19JUlFfU1RBVEVfQUNUSVZFKSkKIAkJcmV0dXJuOwogCiAJZm9yX2VhY2hfaW5wdXRfcXVldWUoaXJxX3B0ciwgcSwgaSkgewpAQCAtMTAwMyw3ICsxMDAzLDcgQEAKIAkJCWNvbnRpbnVlOwogCQlpZiAobmVlZF9zaWdhX3N5bmMocSkgJiYgbmVlZF9zaWdhX3N5bmNfb3V0X2FmdGVyX3BjaShxKSkKIAkJCXFkaW9fc2lnYV9zeW5jX3EocSk7Ci0JCXRhc2tsZXRfc2NoZWR1bGUoJnEtPnRhc2tsZXQpOworCQlxZGlvX3Rhc2tsZXRfc2NoZWR1bGUocSk7CiAJfQogfQogCkBAIC0xMDY2LDEwICsxMDY2LDEyIEBACiAJCSAgICAgIHN0cnVjdCBpcmIgKmlyYikKIHsKIAlzdHJ1Y3QgcWRpb19pcnEgKmlycV9wdHIgPSBjZGV2LT5wcml2YXRlLT5xZGlvX2RhdGE7CisJc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQ7CiAJaW50IGNzdGF0LCBkc3RhdDsKIAogCWlmICghaW50cGFybSB8fCAhaXJxX3B0cikgewotCQlEQkZfRVJST1IoInFpbnQ6JTR4IiwgY2Rldi0+cHJpdmF0ZS0+c2NoaWQuc2NoX25vKTsKKwkJY2N3X2RldmljZV9nZXRfc2NoaWQoY2RldiwgJnNjaGlkKTsKKwkJREJGX0VSUk9SKCJxaW50OiU0eCIsIHNjaGlkLnNjaF9ubyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTExMjIsMTIgKzExMjQsMTQgQEAKIGludCBxZGlvX2dldF9zc3FkX2Rlc2Moc3RydWN0IGNjd19kZXZpY2UgKmNkZXYsCiAJCSAgICAgICBzdHJ1Y3QgcWRpb19zc3FkX2Rlc2MgKmRhdGEpCiB7CisJc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQ7CiAKIAlpZiAoIWNkZXYgfHwgIWNkZXYtPnByaXZhdGUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JREJGX0VWRU5UKCJnZXQgc3NxZDolNHgiLCBjZGV2LT5wcml2YXRlLT5zY2hpZC5zY2hfbm8pOwotCXJldHVybiBxZGlvX3NldHVwX2dldF9zc3FkKE5VTEwsICZjZGV2LT5wcml2YXRlLT5zY2hpZCwgZGF0YSk7CisJY2N3X2RldmljZV9nZXRfc2NoaWQoY2RldiwgJnNjaGlkKTsKKwlEQkZfRVZFTlQoImdldCBzc3FkOiU0eCIsIHNjaGlkLnNjaF9ubyk7CisJcmV0dXJuIHFkaW9fc2V0dXBfZ2V0X3NzcWQoTlVMTCwgJnNjaGlkLCBkYXRhKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHFkaW9fZ2V0X3NzcWRfZGVzYyk7CiAKQEAgLTExNDEsNyArMTE0NSw3IEBACiAJCXRhc2tsZXRfa2lsbCgmcS0+dGFza2xldCk7CiAKIAlmb3JfZWFjaF9vdXRwdXRfcXVldWUoaXJxX3B0ciwgcSwgaSkgewotCQlkZWxfdGltZXIoJnEtPnUub3V0LnRpbWVyKTsKKwkJZGVsX3RpbWVyX3N5bmMoJnEtPnUub3V0LnRpbWVyKTsKIAkJdGFza2xldF9raWxsKCZxLT50YXNrbGV0KTsKIAl9CiB9CkBAIC0xMTU0LDE0ICsxMTU4LDE1IEBACiBpbnQgcWRpb19zaHV0ZG93bihzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgaW50IGhvdykKIHsKIAlzdHJ1Y3QgcWRpb19pcnEgKmlycV9wdHIgPSBjZGV2LT5wcml2YXRlLT5xZGlvX2RhdGE7CisJc3RydWN0IHN1YmNoYW5uZWxfaWQgc2NoaWQ7CiAJaW50IHJjOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoIWlycV9wdHIpCiAJCXJldHVybiAtRU5PREVWOwogCiAJV0FSTl9PTl9PTkNFKGlycXNfZGlzYWJsZWQoKSk7Ci0JREJGX0VWRU5UKCJxc2h1dGRvd246JTR4IiwgY2Rldi0+cHJpdmF0ZS0+c2NoaWQuc2NoX25vKTsKKwljY3dfZGV2aWNlX2dldF9zY2hpZChjZGV2LCAmc2NoaWQpOworCURCRl9FVkVOVCgicXNodXRkb3duOiU0eCIsIHNjaGlkLnNjaF9ubyk7CiAKIAltdXRleF9sb2NrKCZpcnFfcHRyLT5zZXR1cF9tdXRleCk7CiAJLyoKQEAgLTExODQsNyArMTE4OSw3IEBACiAJcWRpb19zaHV0ZG93bl9kZWJ1Z19lbnRyaWVzKGlycV9wdHIpOwogCiAJLyogY2xlYW51cCBzdWJjaGFubmVsICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoZ2V0X2Njd2Rldl9sb2NrKGNkZXYpLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycShnZXRfY2N3ZGV2X2xvY2soY2RldikpOwogCiAJaWYgKGhvdyAmIFFESU9fRkxBR19DTEVBTlVQX1VTSU5HX0NMRUFSKQogCQlyYyA9IGNjd19kZXZpY2VfY2xlYXIoY2RldiwgUURJT19ET0lOR19DTEVBTlVQKTsKQEAgLTExOTgsMTIgKzEyMDMsMTIgQEAKIAl9CiAKIAlxZGlvX3NldF9zdGF0ZShpcnFfcHRyLCBRRElPX0lSUV9TVEFURV9DTEVBTlVQKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGdldF9jY3dkZXZfbG9jayhjZGV2KSwgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycShnZXRfY2N3ZGV2X2xvY2soY2RldikpOwogCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGNkZXYtPnByaXZhdGUtPndhaXRfcSwKIAkJaXJxX3B0ci0+c3RhdGUgPT0gUURJT19JUlFfU1RBVEVfSU5BQ1RJVkUgfHwKIAkJaXJxX3B0ci0+c3RhdGUgPT0gUURJT19JUlFfU1RBVEVfRVJSLAogCQkxMCAqIEhaKTsKLQlzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2soY2RldiksIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxKGdldF9jY3dkZXZfbG9jayhjZGV2KSk7CiAKIG5vX2NsZWFudXA6CiAJcWRpb19zaHV0ZG93bl90aGluaW50KGlycV9wdHIpOwpAQCAtMTIxMSw3ICsxMjE2LDcgQEAKIAkvKiByZXN0b3JlIGludGVycnVwdCBoYW5kbGVyICovCiAJaWYgKCh2b2lkICopY2Rldi0+aGFuZGxlciA9PSAodm9pZCAqKXFkaW9faW50X2hhbmRsZXIpCiAJCWNkZXYtPmhhbmRsZXIgPSBpcnFfcHRyLT5vcmlnX2hhbmRsZXI7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShnZXRfY2N3ZGV2X2xvY2soY2RldiksIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnEoZ2V0X2Njd2Rldl9sb2NrKGNkZXYpKTsKIAogCXFkaW9fc2V0X3N0YXRlKGlycV9wdHIsIFFESU9fSVJRX1NUQVRFX0lOQUNUSVZFKTsKIAltdXRleF91bmxvY2soJmlycV9wdHItPnNldHVwX211dGV4KTsKQEAgLTEyMjgsMTEgKzEyMzMsMTMgQEAKIGludCBxZGlvX2ZyZWUoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpCiB7CiAJc3RydWN0IHFkaW9faXJxICppcnFfcHRyID0gY2Rldi0+cHJpdmF0ZS0+cWRpb19kYXRhOworCXN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkOwogCiAJaWYgKCFpcnFfcHRyKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCURCRl9FVkVOVCgicWZyZWU6JTR4IiwgY2Rldi0+cHJpdmF0ZS0+c2NoaWQuc2NoX25vKTsKKwljY3dfZGV2aWNlX2dldF9zY2hpZChjZGV2LCAmc2NoaWQpOworCURCRl9FVkVOVCgicWZyZWU6JTR4Iiwgc2NoaWQuc2NoX25vKTsKIAlEQkZfREVWX0VWRU5UKERCRl9FUlIsIGlycV9wdHIsICJkYmYgYWJhbmRvbmVkIik7CiAJbXV0ZXhfbG9jaygmaXJxX3B0ci0+c2V0dXBfbXV0ZXgpOwogCkBAIC0xMjUxLDkgKzEyNTgsMTEgQEAKICAqLwogaW50IHFkaW9fYWxsb2NhdGUoc3RydWN0IHFkaW9faW5pdGlhbGl6ZSAqaW5pdF9kYXRhKQogeworCXN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkOwogCXN0cnVjdCBxZGlvX2lycSAqaXJxX3B0cjsKIAotCURCRl9FVkVOVCgicWFsbG9jYXRlOiU0eCIsIGluaXRfZGF0YS0+Y2Rldi0+cHJpdmF0ZS0+c2NoaWQuc2NoX25vKTsKKwljY3dfZGV2aWNlX2dldF9zY2hpZChpbml0X2RhdGEtPmNkZXYsICZzY2hpZCk7CisJREJGX0VWRU5UKCJxYWxsb2NhdGU6JTR4Iiwgc2NoaWQuc2NoX25vKTsKIAogCWlmICgoaW5pdF9kYXRhLT5ub19pbnB1dF9xcyAmJiAhaW5pdF9kYXRhLT5pbnB1dF9oYW5kbGVyKSB8fAogCSAgICAoaW5pdF9kYXRhLT5ub19vdXRwdXRfcXMgJiYgIWluaXRfZGF0YS0+b3V0cHV0X2hhbmRsZXIpKQpAQCAtMTMzMSwyMCArMTM0MCwxOCBAQAogICovCiBpbnQgcWRpb19lc3RhYmxpc2goc3RydWN0IHFkaW9faW5pdGlhbGl6ZSAqaW5pdF9kYXRhKQogewotCXN0cnVjdCBxZGlvX2lycSAqaXJxX3B0cjsKIAlzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiA9IGluaXRfZGF0YS0+Y2RldjsKLQl1bnNpZ25lZCBsb25nIHNhdmVmbGFnczsKKwlzdHJ1Y3Qgc3ViY2hhbm5lbF9pZCBzY2hpZDsKKwlzdHJ1Y3QgcWRpb19pcnEgKmlycV9wdHI7CiAJaW50IHJjOwogCi0JREJGX0VWRU5UKCJxZXN0YWJsaXNoOiU0eCIsIGNkZXYtPnByaXZhdGUtPnNjaGlkLnNjaF9ubyk7CisJY2N3X2RldmljZV9nZXRfc2NoaWQoY2RldiwgJnNjaGlkKTsKKwlEQkZfRVZFTlQoInFlc3RhYmxpc2g6JTR4Iiwgc2NoaWQuc2NoX25vKTsKIAogCWlycV9wdHIgPSBjZGV2LT5wcml2YXRlLT5xZGlvX2RhdGE7CiAJaWYgKCFpcnFfcHRyKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmIChjZGV2LT5wcml2YXRlLT5zdGF0ZSAhPSBERVZfU1RBVEVfT05MSU5FKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCW11dGV4X2xvY2soJmlycV9wdHItPnNldHVwX211dGV4KTsKIAlxZGlvX3NldHVwX2lycShpbml0X2RhdGEpOwogCkBAIC0xMzYxLDE3ICsxMzY4LDE0IEBACiAJaXJxX3B0ci0+Y2N3LmNvdW50ID0gaXJxX3B0ci0+ZXF1ZXVlLmNvdW50OwogCWlycV9wdHItPmNjdy5jZGEgPSAodTMyKSgoYWRkcl90KWlycV9wdHItPnFkcik7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2soY2RldiksIHNhdmVmbGFncyk7CisJc3Bpbl9sb2NrX2lycShnZXRfY2N3ZGV2X2xvY2soY2RldikpOwogCWNjd19kZXZpY2Vfc2V0X29wdGlvbnNfbWFzayhjZGV2LCAwKTsKIAogCXJjID0gY2N3X2RldmljZV9zdGFydChjZGV2LCAmaXJxX3B0ci0+Y2N3LCBRRElPX0RPSU5HX0VTVEFCTElTSCwgMCwgMCk7CisJc3Bpbl91bmxvY2tfaXJxKGdldF9jY3dkZXZfbG9jayhjZGV2KSk7CiAJaWYgKHJjKSB7CiAJCURCRl9FUlJPUigiJTR4IGVzdCBJTyBFUlIiLCBpcnFfcHRyLT5zY2hpZC5zY2hfbm8pOwogCQlEQkZfRVJST1IoInJjOiU0eCIsIHJjKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShnZXRfY2N3ZGV2X2xvY2soY2RldiksIHNhdmVmbGFncyk7Ci0KLQlpZiAocmMpIHsKIAkJbXV0ZXhfdW5sb2NrKCZpcnFfcHRyLT5zZXR1cF9tdXRleCk7CiAJCXFkaW9fc2h1dGRvd24oY2RldiwgUURJT19GTEFHX0NMRUFOVVBfVVNJTkdfQ0xFQVIpOwogCQlyZXR1cm4gcmM7CkBAIC0xNDA3LDE5ICsxNDExLDE3IEBACiAgKi8KIGludCBxZGlvX2FjdGl2YXRlKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KQogeworCXN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkOwogCXN0cnVjdCBxZGlvX2lycSAqaXJxX3B0cjsKIAlpbnQgcmM7Ci0JdW5zaWduZWQgbG9uZyBzYXZlZmxhZ3M7CiAKLQlEQkZfRVZFTlQoInFhY3RpdmF0ZTolNHgiLCBjZGV2LT5wcml2YXRlLT5zY2hpZC5zY2hfbm8pOworCWNjd19kZXZpY2VfZ2V0X3NjaGlkKGNkZXYsICZzY2hpZCk7CisJREJGX0VWRU5UKCJxYWN0aXZhdGU6JTR4Iiwgc2NoaWQuc2NoX25vKTsKIAogCWlycV9wdHIgPSBjZGV2LT5wcml2YXRlLT5xZGlvX2RhdGE7CiAJaWYgKCFpcnFfcHRyKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmIChjZGV2LT5wcml2YXRlLT5zdGF0ZSAhPSBERVZfU1RBVEVfT05MSU5FKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCW11dGV4X2xvY2soJmlycV9wdHItPnNldHVwX211dGV4KTsKIAlpZiAoaXJxX3B0ci0+c3RhdGUgPT0gUURJT19JUlFfU1RBVEVfSU5BQ1RJVkUpIHsKIAkJcmMgPSAtRUJVU1k7CkBAIC0xNDMxLDE5ICsxNDMzLDE3IEBACiAJaXJxX3B0ci0+Y2N3LmNvdW50ID0gaXJxX3B0ci0+YXF1ZXVlLmNvdW50OwogCWlycV9wdHItPmNjdy5jZGEgPSAwOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoZ2V0X2Njd2Rldl9sb2NrKGNkZXYpLCBzYXZlZmxhZ3MpOworCXNwaW5fbG9ja19pcnEoZ2V0X2Njd2Rldl9sb2NrKGNkZXYpKTsKIAljY3dfZGV2aWNlX3NldF9vcHRpb25zKGNkZXYsIENDV0RFVl9SRVBPUlRfQUxMKTsKIAogCXJjID0gY2N3X2RldmljZV9zdGFydChjZGV2LCAmaXJxX3B0ci0+Y2N3LCBRRElPX0RPSU5HX0FDVElWQVRFLAogCQkJICAgICAgMCwgRE9JT19ERU5ZX1BSRUZFVENIKTsKKwlzcGluX3VubG9ja19pcnEoZ2V0X2Njd2Rldl9sb2NrKGNkZXYpKTsKIAlpZiAocmMpIHsKIAkJREJGX0VSUk9SKCIlNHggYWN0IElPIEVSUiIsIGlycV9wdHItPnNjaGlkLnNjaF9ubyk7CiAJCURCRl9FUlJPUigicmM6JTR4IiwgcmMpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGdldF9jY3dkZXZfbG9jayhjZGV2KSwgc2F2ZWZsYWdzKTsKLQotCWlmIChyYykKIAkJZ290byBvdXQ7CisJfQogCiAJaWYgKGlzX3RoaW5pbnRfaXJxKGlycV9wdHIpKQogCQl0aXFkaW9fYWRkX2lucHV0X3F1ZXVlcyhpcnFfcHRyKTsKQEAgLTE1ODUsMTAgKzE1ODUsMTEgQEAKIAogCS8qIGluIGNhc2Ugb2YgU0lHQSBlcnJvcnMgd2UgbXVzdCBwcm9jZXNzIHRoZSBlcnJvciBpbW1lZGlhdGVseSAqLwogCWlmICh1c2VkID49IHEtPnUub3V0LnNjYW5fdGhyZXNob2xkIHx8IHJjKQotCQl0YXNrbGV0X3NjaGVkdWxlKCZxLT50YXNrbGV0KTsKKwkJcWRpb190YXNrbGV0X3NjaGVkdWxlKHEpOwogCWVsc2UKIAkJLyogZnJlZSB0aGUgU0JBTHMgaW4gY2FzZSBvZiBubyBmdXJ0aGVyIHRyYWZmaWMgKi8KLQkJaWYgKCF0aW1lcl9wZW5kaW5nKCZxLT51Lm91dC50aW1lcikpCisJCWlmICghdGltZXJfcGVuZGluZygmcS0+dS5vdXQudGltZXIpICYmCisJCSAgICBsaWtlbHkocS0+aXJxX3B0ci0+c3RhdGUgPT0gUURJT19JUlFfU1RBVEVfQUNUSVZFKSkKIAkJCW1vZF90aW1lcigmcS0+dS5vdXQudGltZXIsIGppZmZpZXMgKyBIWik7CiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmUuaCBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlLmgKaW5kZXggYmY0MDA2My4uNmQ0YjY4YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlLmgKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmUuaApAQCAtOTk5LDYgKzk5OSw3IEBACiAJCQkJCQkgX191MTYsIF9fdTE2LAogCQkJCQkJIGVudW0gcWV0aF9wcm90X3ZlcnNpb25zKTsKIGludCBxZXRoX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqLCBuZXRkZXZfZmVhdHVyZXNfdCk7CitpbnQgcWV0aF9yZWNvdmVyX2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICopOwogbmV0ZGV2X2ZlYXR1cmVzX3QgcWV0aF9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKiwgbmV0ZGV2X2ZlYXR1cmVzX3QpOwogCiAvKiBleHBvcnRzIGZvciBPU04gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21haW4uYyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21haW4uYwppbmRleCA3ZGJhNmM4Li4yMGNmMjk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZV9tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfbWFpbi5jCkBAIC0zNjE5LDcgKzM2MTksOCBAQAogCQlpbnQgZTsKIAogCQllID0gMDsKLQkJd2hpbGUgKGJ1ZmZlci0+ZWxlbWVudFtlXS5hZGRyKSB7CisJCXdoaWxlICgoZSA8IFFESU9fTUFYX0VMRU1FTlRTX1BFUl9CVUZGRVIpICYmCisJCSAgICAgICBidWZmZXItPmVsZW1lbnRbZV0uYWRkcikgewogCQkJdW5zaWduZWQgbG9uZyBwaHlzX2FvYl9hZGRyOwogCiAJCQlwaHlzX2FvYl9hZGRyID0gKHVuc2lnbmVkIGxvbmcpIGJ1ZmZlci0+ZWxlbWVudFtlXS5hZGRyOwpAQCAtNjEzMSw2ICs2MTMyLDM1IEBACiAJcmV0dXJuIHJjOwogfQogCisvKiB0cnkgdG8gcmVzdG9yZSBkZXZpY2UgZmVhdHVyZXMgb24gYSBkZXZpY2UgYWZ0ZXIgcmVjb3ZlcnkgKi8KK2ludCBxZXRoX3JlY292ZXJfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkID0gZGV2LT5tbF9wcml2OworCW5ldGRldl9mZWF0dXJlc190IHJlY292ZXIgPSBkZXYtPmZlYXR1cmVzOworCisJaWYgKHJlY292ZXIgJiBORVRJRl9GX0lQX0NTVU0pIHsKKwkJaWYgKHFldGhfc2V0X2lwYV9jc3VtKGNhcmQsIDEsIElQQV9PVVRCT1VORF9DSEVDS1NVTSkpCisJCQlyZWNvdmVyIF49IE5FVElGX0ZfSVBfQ1NVTTsKKwl9CisJaWYgKHJlY292ZXIgJiBORVRJRl9GX1JYQ1NVTSkgeworCQlpZiAocWV0aF9zZXRfaXBhX2NzdW0oY2FyZCwgMSwgSVBBX0lOQk9VTkRfQ0hFQ0tTVU0pKQorCQkJcmVjb3ZlciBePSBORVRJRl9GX1JYQ1NVTTsKKwl9CisJaWYgKHJlY292ZXIgJiBORVRJRl9GX1RTTykgeworCQlpZiAocWV0aF9zZXRfaXBhX3RzbyhjYXJkLCAxKSkKKwkJCXJlY292ZXIgXj0gTkVUSUZfRl9UU087CisJfQorCisJaWYgKHJlY292ZXIgPT0gZGV2LT5mZWF0dXJlcykKKwkJcmV0dXJuIDA7CisKKwlkZXZfd2FybigmY2FyZC0+Z2Rldi0+ZGV2LAorCQkgIkRldmljZSByZWNvdmVyeSBmYWlsZWQgdG8gcmVzdG9yZSBhbGwgb2ZmbG9hZCBmZWF0dXJlc1xuIik7CisJZGV2LT5mZWF0dXJlcyA9IHJlY292ZXI7CisJcmV0dXJuIC1FSU87Cit9CitFWFBPUlRfU1lNQk9MX0dQTChxZXRoX3JlY292ZXJfZmVhdHVyZXMpOworCiBpbnQgcWV0aF9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJc3RydWN0IHFldGhfY2FyZCAqY2FyZCA9IGRldi0+bWxfcHJpdjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sMl9tYWluLmMgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDJfbWFpbi5jCmluZGV4IDdiYzIwYzUuLmJiMjcwNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sMl9tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wyX21haW4uYwpAQCAtMTEyNCwxNCArMTEyNCwxMSBAQAogCQkJY2FyZC0+ZGV2LT5od19mZWF0dXJlcyB8PSBORVRJRl9GX1JYQ1NVTTsKIAkJCWNhcmQtPmRldi0+dmxhbl9mZWF0dXJlcyB8PSBORVRJRl9GX1JYQ1NVTTsKIAkJfQotCQkvKiBUdXJuIG9uIFNHIHBlciBkZWZhdWx0ICovCi0JCWNhcmQtPmRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9TRzsKIAl9CiAJY2FyZC0+aW5mby5icm9hZGNhc3RfY2FwYWJsZSA9IDE7CiAJcWV0aF9sMl9yZXF1ZXN0X2luaXRpYWxfbWFjKGNhcmQpOwogCWNhcmQtPmRldi0+Z3NvX21heF9zaXplID0gKFFFVEhfTUFYX0JVRkZFUl9FTEVNRU5UUyhjYXJkKSAtIDEpICoKIAkJCQkgIFBBR0VfU0laRTsKLQljYXJkLT5kZXYtPmdzb19tYXhfc2VncyA9IChRRVRIX01BWF9CVUZGRVJfRUxFTUVOVFMoY2FyZCkgLSAxKTsKIAlTRVRfTkVUREVWX0RFVihjYXJkLT5kZXYsICZjYXJkLT5nZGV2LT5kZXYpOwogCW5ldGlmX25hcGlfYWRkKGNhcmQtPmRldiwgJmNhcmQtPm5hcGksIHFldGhfbDJfcG9sbCwgUUVUSF9OQVBJX1dFSUdIVCk7CiAJbmV0aWZfY2Fycmllcl9vZmYoY2FyZC0+ZGV2KTsKQEAgLTEyNDYsNiArMTI0Myw5IEBACiAJCX0KIAkJLyogdGhpcyBhbHNvIHNldHMgc2F2ZWQgdW5pY2FzdCBhZGRyZXNzZXMgKi8KIAkJcWV0aF9sMl9zZXRfcnhfbW9kZShjYXJkLT5kZXYpOworCQlydG5sX2xvY2soKTsKKwkJcWV0aF9yZWNvdmVyX2ZlYXR1cmVzKGNhcmQtPmRldik7CisJCXJ0bmxfdW5sb2NrKCk7CiAJfQogCS8qIGxldCB1c2VyX3NwYWNlIGtub3cgdGhhdCBkZXZpY2UgaXMgb25saW5lICovCiAJa29iamVjdF91ZXZlbnQoJmdkZXYtPmRldi5rb2JqLCBLT0JKX0NIQU5HRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDNfbWFpbi5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wzX21haW4uYwppbmRleCA3MjkzNDY2Li4yNzJkOWU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDNfbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19tYWluLmMKQEAgLTI1Nyw2ICsyNTcsMTEgQEAKIAlpZiAoYWRkci0+aW5fcHJvZ3Jlc3MpCiAJCXJldHVybiAtRUlOUFJPR1JFU1M7CiAKKwlpZiAoIXFldGhfY2FyZF9od19pc19yZWFjaGFibGUoY2FyZCkpIHsKKwkJYWRkci0+ZGlzcF9mbGFnID0gUUVUSF9ESVNQX0FERFJfREVMRVRFOworCQlyZXR1cm4gMDsKKwl9CisKIAlyYyA9IHFldGhfbDNfZGVyZWdpc3Rlcl9hZGRyX2VudHJ5KGNhcmQsIGFkZHIpOwogCiAJaGFzaF9kZWwoJmFkZHItPmhub2RlKTsKQEAgLTI5Niw2ICszMDEsMTEgQEAKIAkJaGFzaF9hZGQoY2FyZC0+aXBfaHRhYmxlLCAmYWRkci0+aG5vZGUsCiAJCQkJcWV0aF9sM19pcGFkZHJfaGFzaChhZGRyKSk7CiAKKwkJaWYgKCFxZXRoX2NhcmRfaHdfaXNfcmVhY2hhYmxlKGNhcmQpKSB7CisJCQlhZGRyLT5kaXNwX2ZsYWcgPSBRRVRIX0RJU1BfQUREUl9BREQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCiAJCS8qIHFldGhfbDNfcmVnaXN0ZXJfYWRkcl9lbnRyeSBjYW4gZ28gdG8gc2xlZXAKIAkJICogaWYgd2UgYWRkIGEgSVBWNCBhZGRyLiBJdCBpcyBjYXVzZWQgYnkgdGhlIHJlYXNvbgogCQkgKiB0aGF0IFNFVElQIGlwYSBjbWQgc3RhcnRzIEFSUCBzdGFmZiBmb3IgSVBWNCBhZGRyLgpAQCAtMzkwLDEyICs0MDAsMTYgQEAKIAlpbnQgaTsKIAlpbnQgcmM7CiAKLQlRRVRIX0NBUkRfVEVYVChjYXJkLCA0LCAicmVjb3ZlcmlwIik7CisJUUVUSF9DQVJEX1RFWFQoY2FyZCwgNCwgInJlY292cmlwIik7CiAKIAlzcGluX2xvY2tfYmgoJmNhcmQtPmlwX2xvY2spOwogCiAJaGFzaF9mb3JfZWFjaF9zYWZlKGNhcmQtPmlwX2h0YWJsZSwgaSwgdG1wLCBhZGRyLCBobm9kZSkgewotCQlpZiAoYWRkci0+ZGlzcF9mbGFnID09IFFFVEhfRElTUF9BRERSX0FERCkgeworCQlpZiAoYWRkci0+ZGlzcF9mbGFnID09IFFFVEhfRElTUF9BRERSX0RFTEVURSkgeworCQkJcWV0aF9sM19kZXJlZ2lzdGVyX2FkZHJfZW50cnkoY2FyZCwgYWRkcik7CisJCQloYXNoX2RlbCgmYWRkci0+aG5vZGUpOworCQkJa2ZyZWUoYWRkcik7CisJCX0gZWxzZSBpZiAoYWRkci0+ZGlzcF9mbGFnID09IFFFVEhfRElTUF9BRERSX0FERCkgewogCQkJaWYgKGFkZHItPnByb3RvID09IFFFVEhfUFJPVF9JUFY0KSB7CiAJCQkJYWRkci0+aW5fcHJvZ3Jlc3MgPSAxOwogCQkJCXNwaW5fdW5sb2NrX2JoKCZjYXJkLT5pcF9sb2NrKTsKQEAgLTQwNywxMCArNDIxLDggQEAKIAogCQkJaWYgKCFyYykgewogCQkJCWFkZHItPmRpc3BfZmxhZyA9IFFFVEhfRElTUF9BRERSX0RPX05PVEhJTkc7Ci0JCQkJaWYgKGFkZHItPnJlZl9jb3VudGVyIDwgMSkgeworCQkJCWlmIChhZGRyLT5yZWZfY291bnRlciA8IDEpCiAJCQkJCXFldGhfbDNfZGVsZXRlX2lwKGNhcmQsIGFkZHIpOwotCQkJCQlrZnJlZShhZGRyKTsKLQkJCQl9CiAJCQl9IGVsc2UgewogCQkJCWhhc2hfZGVsKCZhZGRyLT5obm9kZSk7CiAJCQkJa2ZyZWUoYWRkcik7CkBAIC02ODksNyArNzAxLDcgQEAKIAogCXNwaW5fbG9ja19iaCgmY2FyZC0+aXBfbG9jayk7CiAKLQlpZiAoIXFldGhfbDNfaXBfZnJvbV9oYXNoKGNhcmQsIGlwYWRkcikpCisJaWYgKHFldGhfbDNfaXBfZnJvbV9oYXNoKGNhcmQsIGlwYWRkcikpCiAJCXJjID0gLUVFWElTVDsKIAllbHNlCiAJCXFldGhfbDNfYWRkX2lwKGNhcmQsIGlwYWRkcik7CkBAIC03NTcsNyArNzY5LDcgQEAKIAogCXNwaW5fbG9ja19iaCgmY2FyZC0+aXBfbG9jayk7CiAKLQlpZiAoIXFldGhfbDNfaXBfZnJvbV9oYXNoKGNhcmQsIGlwYWRkcikpCisJaWYgKHFldGhfbDNfaXBfZnJvbV9oYXNoKGNhcmQsIGlwYWRkcikpCiAJCXJjID0gLUVFWElTVDsKIAllbHNlCiAJCXFldGhfbDNfYWRkX2lwKGNhcmQsIGlwYWRkcik7CkBAIC0zMTA4LDcgKzMxMjAsNiBAQAogCQkJCWNhcmQtPmRldi0+dmxhbl9mZWF0dXJlcyA9IE5FVElGX0ZfU0cgfAogCQkJCQlORVRJRl9GX1JYQ1NVTSB8IE5FVElGX0ZfSVBfQ1NVTSB8CiAJCQkJCU5FVElGX0ZfVFNPOwotCQkJCWNhcmQtPmRldi0+ZmVhdHVyZXMgPSBORVRJRl9GX1NHOwogCQkJfQogCQl9CiAJfSBlbHNlIGlmIChjYXJkLT5pbmZvLnR5cGUgPT0gUUVUSF9DQVJEX1RZUEVfSVFEKSB7CkBAIC0zMTM2LDcgKzMxNDcsNiBAQAogCW5ldGlmX2tlZXBfZHN0KGNhcmQtPmRldik7CiAJY2FyZC0+ZGV2LT5nc29fbWF4X3NpemUgPSAoUUVUSF9NQVhfQlVGRkVSX0VMRU1FTlRTKGNhcmQpIC0gMSkgKgogCQkJCSAgUEFHRV9TSVpFOwotCWNhcmQtPmRldi0+Z3NvX21heF9zZWdzID0gKFFFVEhfTUFYX0JVRkZFUl9FTEVNRU5UUyhjYXJkKSAtIDEpOwogCiAJU0VUX05FVERFVl9ERVYoY2FyZC0+ZGV2LCAmY2FyZC0+Z2Rldi0+ZGV2KTsKIAluZXRpZl9uYXBpX2FkZChjYXJkLT5kZXYsICZjYXJkLT5uYXBpLCBxZXRoX2wzX3BvbGwsIFFFVEhfTkFQSV9XRUlHSFQpOwpAQCAtMzI2OSw2ICszMjc5LDcgQEAKIAkJZWxzZQogCQkJZGV2X29wZW4oY2FyZC0+ZGV2KTsKIAkJcWV0aF9sM19zZXRfbXVsdGljYXN0X2xpc3QoY2FyZC0+ZGV2KTsKKwkJcWV0aF9yZWNvdmVyX2ZlYXR1cmVzKGNhcmQtPmRldik7CiAJCXJ0bmxfdW5sb2NrKCk7CiAJfQogCXFldGhfdHJhY2VfZmVhdHVyZXMoY2FyZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDNfc3lzLmMgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDNfc3lzLmMKaW5kZXggNjU2NDViMS4uMGUwMGE1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wzX3N5cy5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19zeXMuYwpAQCAtMjk3LDcgKzI5Nyw5IEBACiAJCWFkZHItPnUuYTYucGZ4bGVuID0gMDsKIAkJYWRkci0+dHlwZSA9IFFFVEhfSVBfVFlQRV9OT1JNQUw7CiAKKwkJc3Bpbl9sb2NrX2JoKCZjYXJkLT5pcF9sb2NrKTsKIAkJcWV0aF9sM19kZWxldGVfaXAoY2FyZCwgYWRkcik7CisJCXNwaW5fdW5sb2NrX2JoKCZjYXJkLT5pcF9sb2NrKTsKIAkJa2ZyZWUoYWRkcik7CiAJfQogCkBAIC0zMjksNyArMzMxLDEwIEBACiAJCWFkZHItPnR5cGUgPSBRRVRIX0lQX1RZUEVfTk9STUFMOwogCX0gZWxzZQogCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19iaCgmY2FyZC0+aXBfbG9jayk7CiAJcWV0aF9sM19hZGRfaXAoY2FyZCwgYWRkcik7CisJc3Bpbl91bmxvY2tfYmgoJmNhcmQtPmlwX2xvY2spOwogCWtmcmVlKGFkZHIpOwogCiAJcmV0dXJuIGNvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9hdXguYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfYXV4LmMKaW5kZXggYzAwYWM0Ni4uYmNjOGYzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9hdXguYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2F1eC5jCkBAIC0zMTAsNyArMzEwLDcgQEAKIAogCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgInpmY3BfcV8lcyIsCiAJCSBkZXZfbmFtZSgmYWRhcHRlci0+Y2N3X2RldmljZS0+ZGV2KSk7Ci0JYWRhcHRlci0+d29ya19xdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKG5hbWUpOworCWFkYXB0ZXItPndvcmtfcXVldWUgPSBhbGxvY19vcmRlcmVkX3dvcmtxdWV1ZShuYW1lLCBXUV9NRU1fUkVDTEFJTSk7CiAKIAlpZiAoYWRhcHRlci0+d29ya19xdWV1ZSkKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tY3RybC5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbWN0cmwuYwppbmRleCBiMzgxYjM3MS4uNTY0OGI3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbWN0cmwuYworKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tY3RybC5jCkBAIC02Myw3ICs2Myw3IEBACiAJc3RydWN0IGZpYiAqZmlicHRyOwogCXN0cnVjdCBod19maWIgKiBod19maWIgPSAoc3RydWN0IGh3X2ZpYiAqKTA7CiAJZG1hX2FkZHJfdCBod19maWJfcGEgPSAoZG1hX2FkZHJfdCkwTEw7Ci0JdW5zaWduZWQgc2l6ZTsKKwl1bnNpZ25lZCBpbnQgc2l6ZSwgb3NpemU7CiAJaW50IHJldHZhbDsKIAogCWlmIChkZXYtPmluX3Jlc2V0KSB7CkBAIC04Nyw3ICs4Nyw4IEBACiAJICoJd2lsbCBub3Qgb3ZlcnJ1biB0aGUgYnVmZmVyIHdoZW4gd2UgY29weSB0aGUgbWVtb3J5LiBSZXR1cm4KIAkgKglhbiBlcnJvciBpZiB3ZSB3b3VsZC4KIAkgKi8KLQlzaXplID0gbGUxNl90b19jcHUoa2ZpYi0+aGVhZGVyLlNpemUpICsgc2l6ZW9mKHN0cnVjdCBhYWNfZmliaGRyKTsKKwlvc2l6ZSA9IHNpemUgPSBsZTE2X3RvX2NwdShrZmliLT5oZWFkZXIuU2l6ZSkgKworCQlzaXplb2Yoc3RydWN0IGFhY19maWJoZHIpOwogCWlmIChzaXplIDwgbGUxNl90b19jcHUoa2ZpYi0+aGVhZGVyLlNlbmRlclNpemUpKQogCQlzaXplID0gbGUxNl90b19jcHUoa2ZpYi0+aGVhZGVyLlNlbmRlclNpemUpOwogCWlmIChzaXplID4gZGV2LT5tYXhfZmliX3NpemUpIHsKQEAgLTExOCw2ICsxMTksMTQgQEAKIAkJZ290byBjbGVhbnVwOwogCX0KIAorCS8qIFNhbml0eSBjaGVjayB0aGUgc2Vjb25kIGNvcHkgKi8KKwlpZiAoKG9zaXplICE9IGxlMTZfdG9fY3B1KGtmaWItPmhlYWRlci5TaXplKSArCisJCXNpemVvZihzdHJ1Y3QgYWFjX2ZpYmhkcikpCisJCXx8IChzaXplIDwgbGUxNl90b19jcHUoa2ZpYi0+aGVhZGVyLlNlbmRlclNpemUpKSkgeworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIGNsZWFudXA7CisJfQorCiAJaWYgKGtmaWItPmhlYWRlci5Db21tYW5kID09IGNwdV90b19sZTE2KFRha2VBQnJlYWtQdCkpIHsKIAkJYWFjX2FkYXB0ZXJfaW50ZXJydXB0KGRldik7CiAJCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvY29uc3RhbnRzLmMgYi9kcml2ZXJzL3Njc2kvY29uc3RhbnRzLmMKaW5kZXggODM0NThmNy4uNmRjOTZjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2NvbnN0YW50cy5jCisrKyBiL2RyaXZlcnMvc2NzaS9jb25zdGFudHMuYwpAQCAtMzYxLDggKzM2MSw5IEBACiAKIC8qIEdldCBzZW5zZSBrZXkgc3RyaW5nIG9yIE5VTEwgaWYgbm90IGF2YWlsYWJsZSAqLwogY29uc3QgY2hhciAqCi1zY3NpX3NlbnNlX2tleV9zdHJpbmcodW5zaWduZWQgY2hhciBrZXkpIHsKLQlpZiAoa2V5IDw9IDB4RSkKK3Njc2lfc2Vuc2Vfa2V5X3N0cmluZyh1bnNpZ25lZCBjaGFyIGtleSkKK3sKKwlpZiAoa2V5IDwgQVJSQVlfU0laRShzbnN0ZXh0KSkKIAkJcmV0dXJuIHNuc3RleHRba2V5XTsKIAlyZXR1cm4gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jeGdiaS9jeGdiNGkvY3hnYjRpLmMgYi9kcml2ZXJzL3Njc2kvY3hnYmkvY3hnYjRpL2N4Z2I0aS5jCmluZGV4IGU0YmEyZDIuLjdjMGQ3YWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9jeGdiaS9jeGdiNGkvY3hnYjRpLmMKKysrIGIvZHJpdmVycy9zY3NpL2N4Z2JpL2N4Z2I0aS9jeGdiNGkuYwpAQCAtODQsNiArODQsOSBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGN4Z2I0X3VsZF9pbmZvIGN4Z2I0aV91bGRfaW5mbyA9IHsKIAkubmFtZSA9IERSVl9NT0RVTEVfTkFNRSwKKwkubnJ4cSA9IE1BWF9VTERfUVNFVFMsCisJLnJ4cV9zaXplID0gMTAyNCwKKwkubHJvID0gZmFsc2UsCiAJLmFkZCA9IHQ0X3VsZF9hZGQsCiAJLnJ4X2hhbmRsZXIgPSB0NF91bGRfcnhfaGFuZGxlciwKIAkuc3RhdGVfY2hhbmdlID0gdDRfdWxkX3N0YXRlX2NoYW5nZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9mY29lL2Zjb2VfY3Rsci5jIGIvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZV9jdGxyLmMKaW5kZXggYTU2OWM2NS4uZGNmMzY1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZV9jdGxyLmMKKysrIGIvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZV9jdGxyLmMKQEAgLTI5MjMsNyArMjkyMyw3IEBACiAJbXV0ZXhfdW5sb2NrKCZmaXAtPmN0bHJfbXV0ZXgpOwogCiBkcm9wOgotCWtmcmVlKHNrYik7CisJa2ZyZWVfc2tiKHNrYik7CiAJcmV0dXJuIHJjOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaG9zdHMuYyBiL2RyaXZlcnMvc2NzaS9ob3N0cy5jCmluZGV4IGJhOWFmNGEuLmVjNjM4MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ob3N0cy5jCisrKyBiL2RyaXZlcnMvc2NzaS9ob3N0cy5jCkBAIC00ODYsNiArNDg2LDggQEAKIAllbHNlCiAJCXNob3N0LT5kbWFfYm91bmRhcnkgPSAweGZmZmZmZmZmOwogCisJc2hvc3QtPnVzZV9ibGtfbXEgPSBzY3NpX3VzZV9ibGtfbXE7CisKIAlkZXZpY2VfaW5pdGlhbGl6ZSgmc2hvc3QtPnNob3N0X2dlbmRldik7CiAJZGV2X3NldF9uYW1lKCZzaG9zdC0+c2hvc3RfZ2VuZGV2LCAiaG9zdCVkIiwgc2hvc3QtPmhvc3Rfbm8pOwogCXNob3N0LT5zaG9zdF9nZW5kZXYuYnVzID0gJnNjc2lfYnVzX3R5cGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Jhc2UuYyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfYmFzZS5jCmluZGV4IDJkYWIzZGMuLmMxZWQyNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfYmFzZS5jCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfYmFzZS5jCkBAIC01MDM3LDcgKzUwMzcsNyBAQAogCS8qIEZpbmQgZmlyc3QgbWVtb3J5IGJhciAqLwogCWJhcl9saXN0ID0gcGNpX3NlbGVjdF9iYXJzKGluc3RhbmNlLT5wZGV2LCBJT1JFU09VUkNFX01FTSk7CiAJaW5zdGFuY2UtPmJhciA9IGZpbmRfZmlyc3RfYml0KCZiYXJfbGlzdCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKLQlpZiAocGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9ucyhpbnN0YW5jZS0+cGRldiwgaW5zdGFuY2UtPmJhciwKKwlpZiAocGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9ucyhpbnN0YW5jZS0+cGRldiwgMTw8aW5zdGFuY2UtPmJhciwKIAkJCQkJICJtZWdhc2FzOiBMU0kiKSkgewogCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZpbnN0YW5jZS0+cGRldi0+ZGV2LCAiSU8gbWVtb3J5IHJlZ2lvbiBidXN5IVxuIik7CiAJCXJldHVybiAtRUJVU1k7CkBAIC01MzM5LDcgKzUzMzksNyBAQAogCWlvdW5tYXAoaW5zdGFuY2UtPnJlZ19zZXQpOwogCiAgICAgICBmYWlsX2lvcmVtYXA6Ci0JcGNpX3JlbGVhc2Vfc2VsZWN0ZWRfcmVnaW9ucyhpbnN0YW5jZS0+cGRldiwgaW5zdGFuY2UtPmJhcik7CisJcGNpX3JlbGVhc2Vfc2VsZWN0ZWRfcmVnaW9ucyhpbnN0YW5jZS0+cGRldiwgMTw8aW5zdGFuY2UtPmJhcik7CiAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KQEAgLTUzNjAsNyArNTM2MCw3IEBACiAKIAlpb3VubWFwKGluc3RhbmNlLT5yZWdfc2V0KTsKIAotCXBjaV9yZWxlYXNlX3NlbGVjdGVkX3JlZ2lvbnMoaW5zdGFuY2UtPnBkZXYsIGluc3RhbmNlLT5iYXIpOworCXBjaV9yZWxlYXNlX3NlbGVjdGVkX3JlZ2lvbnMoaW5zdGFuY2UtPnBkZXYsIDE8PGluc3RhbmNlLT5iYXIpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnVzaW9uLmMgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Z1c2lvbi5jCmluZGV4IGVjODM3NTQuLjUyZDhiYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnVzaW9uLmMKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19mdXNpb24uYwpAQCAtMjYwMyw3ICsyNjAzLDcgQEAKIAogCWlvdW5tYXAoaW5zdGFuY2UtPnJlZ19zZXQpOwogCi0JcGNpX3JlbGVhc2Vfc2VsZWN0ZWRfcmVnaW9ucyhpbnN0YW5jZS0+cGRldiwgaW5zdGFuY2UtPmJhcik7CisJcGNpX3JlbGVhc2Vfc2VsZWN0ZWRfcmVnaW9ucyhpbnN0YW5jZS0+cGRldiwgMTw8aW5zdGFuY2UtPmJhcik7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDNzYXMvbXB0M3Nhc19iYXNlLmMgYi9kcml2ZXJzL3Njc2kvbXB0M3Nhcy9tcHQzc2FzX2Jhc2UuYwppbmRleCA3NTFmMTNlLi43NTBmODJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXB0M3Nhcy9tcHQzc2FzX2Jhc2UuYworKysgYi9kcml2ZXJzL3Njc2kvbXB0M3Nhcy9tcHQzc2FzX2Jhc2UuYwpAQCAtMjE4OCw2ICsyMTg4LDE3IEBACiAJfSBlbHNlCiAJCWlvYy0+bXNpeDk2X3ZlY3RvciA9IDA7CiAKKwlpZiAoaW9jLT5pc193YXJwZHJpdmUpIHsKKwkJaW9jLT5yZXBseV9wb3N0X2hvc3RfaW5kZXhbMF0gPSAocmVzb3VyY2Vfc2l6ZV90IF9faW9tZW0gKikKKwkJICAgICZpb2MtPmNoaXAtPlJlcGx5UG9zdEhvc3RJbmRleDsKKworCQlmb3IgKGkgPSAxOyBpIDwgaW9jLT5jcHVfbXNpeF90YWJsZV9zejsgaSsrKQorCQkJaW9jLT5yZXBseV9wb3N0X2hvc3RfaW5kZXhbaV0gPQorCQkJKHJlc291cmNlX3NpemVfdCBfX2lvbWVtICopCisJCQkoKHU4IF9faW9tZW0gKikmaW9jLT5jaGlwLT5Eb29yYmVsbCArICgweDQwMDAgKyAoKGkgLSAxKQorCQkJKiA0KSkpOworCX0KKwogCWxpc3RfZm9yX2VhY2hfZW50cnkocmVwbHlfcSwgJmlvYy0+cmVwbHlfcXVldWVfbGlzdCwgbGlzdCkKIAkJcHJfaW5mbyhNUFQzU0FTX0ZNVCAiJXM6IElSUSAlZFxuIiwKIAkJICAgIHJlcGx5X3EtPm5hbWUsICAoKGlvYy0+bXNpeF9lbmFibGUpID8gIlBDSS1NU0ktWCBlbmFibGVkIiA6CkBAIC01MjgwLDE3ICs1MjkxLDYgQEAKIAlpZiAocikKIAkJZ290byBvdXRfZnJlZV9yZXNvdXJjZXM7CiAKLQlpZiAoaW9jLT5pc193YXJwZHJpdmUpIHsKLQkJaW9jLT5yZXBseV9wb3N0X2hvc3RfaW5kZXhbMF0gPSAocmVzb3VyY2Vfc2l6ZV90IF9faW9tZW0gKikKLQkJICAgICZpb2MtPmNoaXAtPlJlcGx5UG9zdEhvc3RJbmRleDsKLQotCQlmb3IgKGkgPSAxOyBpIDwgaW9jLT5jcHVfbXNpeF90YWJsZV9zejsgaSsrKQotCQkJaW9jLT5yZXBseV9wb3N0X2hvc3RfaW5kZXhbaV0gPQotCQkJKHJlc291cmNlX3NpemVfdCBfX2lvbWVtICopCi0JCQkoKHU4IF9faW9tZW0gKikmaW9jLT5jaGlwLT5Eb29yYmVsbCArICgweDQwMDAgKyAoKGkgLSAxKQotCQkJKiA0KSkpOwotCX0KLQogCXBjaV9zZXRfZHJ2ZGF0YShpb2MtPnBkZXYsIGlvYy0+c2hvc3QpOwogCXIgPSBfYmFzZV9nZXRfaW9jX2ZhY3RzKGlvYywgQ0FOX1NMRUVQKTsKIAlpZiAocikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpLmMgYi9kcml2ZXJzL3Njc2kvc2NzaS5jCmluZGV4IDFmMzZhY2EuLjFkZWI2YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2kuYwpAQCAtMTE2MCw3ICsxMTYwLDYgQEAKIGJvb2wgc2NzaV91c2VfYmxrX21xID0gZmFsc2U7CiAjZW5kaWYKIG1vZHVsZV9wYXJhbV9uYW1lZCh1c2VfYmxrX21xLCBzY3NpX3VzZV9ibGtfbXEsIGJvb2wsIFNfSVdVU1IgfCBTX0lSVUdPKTsKLUVYUE9SVF9TWU1CT0xfR1BMKHNjc2lfdXNlX2Jsa19tcSk7CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfc2NzaSh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfZGV2aW5mby5jIGIvZHJpdmVycy9zY3NpL3Njc2lfZGV2aW5mby5jCmluZGV4IGVhY2NkNjUuLjI0NjQ1NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2RldmluZm8uYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9kZXZpbmZvLmMKQEAgLTI0Niw2ICsyNDYsMTAgQEAKIAl7IklCTSIsICJVbml2ZXJzYWwgWHBvcnQiLCAiKiIsIEJMSVNUX05PX1VMRF9BVFRBQ0h9LAogCXsiU1VOIiwgIlVuaXZlcnNhbCBYcG9ydCIsICIqIiwgQkxJU1RfTk9fVUxEX0FUVEFDSH0sCiAJeyJERUxMIiwgIlVuaXZlcnNhbCBYcG9ydCIsICIqIiwgQkxJU1RfTk9fVUxEX0FUVEFDSH0sCisJeyJTVEsiLCAiVW5pdmVyc2FsIFhwb3J0IiwgIioiLCBCTElTVF9OT19VTERfQVRUQUNIfSwKKwl7Ik5FVEFQUCIsICJVbml2ZXJzYWwgWHBvcnQiLCAiKiIsIEJMSVNUX05PX1VMRF9BVFRBQ0h9LAorCXsiTFNJIiwgIlVuaXZlcnNhbCBYcG9ydCIsICIqIiwgQkxJU1RfTk9fVUxEX0FUVEFDSH0sCisJeyJFTkdFTklPIiwgIlVuaXZlcnNhbCBYcG9ydCIsICIqIiwgQkxJU1RfTk9fVUxEX0FUVEFDSH0sCiAJeyJTTVNDIiwgIlVTQiAyIEhTLUNGIiwgTlVMTCwgQkxJU1RfU1BBUlNFTFVOIHwgQkxJU1RfSU5RVUlSWV8zNn0sCiAJeyJTT05ZIiwgIkNELVJPTSBDRFUtODAwMSIsIE5VTEwsIEJMSVNUX0JPUktFTn0sCiAJeyJTT05ZIiwgIlRTTCIsIE5VTEwsIEJMSVNUX0ZPUkNFTFVOfSwJCS8qIEREUzMgJiBERFM0IGF1dG9sb2FkZXJzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9wcml2LmggYi9kcml2ZXJzL3Njc2kvc2NzaV9wcml2LmgKaW5kZXggNTdhNGI5OS4uODVjOGE1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfcHJpdi5oCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3ByaXYuaApAQCAtMjksNiArMjksNyBAQAogZXh0ZXJuIHZvaWQgc2NzaV9leGl0X2hvc3RzKHZvaWQpOwogCiAvKiBzY3NpLmMgKi8KK2V4dGVybiBib29sIHNjc2lfdXNlX2Jsa19tcTsKIGV4dGVybiBpbnQgc2NzaV9zZXR1cF9jb21tYW5kX2ZyZWVsaXN0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KTsKIGV4dGVybiB2b2lkIHNjc2lfZGVzdHJveV9jb21tYW5kX2ZyZWVsaXN0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KTsKICNpZmRlZiBDT05GSUdfU0NTSV9MT0dHSU5HCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc2FzLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc2FzLmMKaW5kZXggM2YwZmYwNy4uNjBiNjUxYmZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc2FzLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3Nhcy5jCkBAIC0zNDEsMjIgKzM0MSw2IEBACiB9CiAKIC8qKgotICogaXNfc2FzX2F0dGFjaGVkIC0gY2hlY2sgaWYgZGV2aWNlIGlzIFNBUyBhdHRhY2hlZAotICogQHNkZXY6IHNjc2kgZGV2aWNlIHRvIGNoZWNrCi0gKgotICogcmV0dXJucyB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgU0FTIGF0dGFjaGVkCi0gKi8KLWludCBpc19zYXNfYXR0YWNoZWQoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQotewotCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gc2Rldi0+aG9zdDsKLQotCXJldHVybiBzaG9zdC0+dHJhbnNwb3J0dC0+aG9zdF9hdHRycy5hYy5jbGFzcyA9PQotCQkmc2FzX2hvc3RfY2xhc3MuY2xhc3M7Ci19Ci1FWFBPUlRfU1lNQk9MKGlzX3Nhc19hdHRhY2hlZCk7Ci0KLQotLyoqCiAgKiBzYXNfcmVtb3ZlX2NoaWxkcmVuICAtICB0ZWFyIGRvd24gYSBkZXZpY2VzIFNBUyBkYXRhIHN0cnVjdHVyZXMKICAqIEBkZXY6CWRldmljZSBiZWxvbmdpbmcgdG8gdGhlIHNhcyBvYmplY3QKICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2VzLmMgYi9kcml2ZXJzL3Njc2kvc2VzLmMKaW5kZXggNTNlZjFjYi4uOGM5YTM1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Nlcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zZXMuYwpAQCAtNTg3LDcgKzU4Nyw3IEBACiAKIAlzZXNfZW5jbG9zdXJlX2RhdGFfcHJvY2VzcyhlZGV2LCB0b19zY3NpX2RldmljZShlZGV2LT5lZGV2LnBhcmVudCksIDApOwogCi0JaWYgKGlzX3Nhc19hdHRhY2hlZChzZGV2KSkKKwlpZiAoc2NzaV9pc19zYXNfcnBoeSgmc2Rldi0+c2Rldl9nZW5kZXYpKQogCQllZmQuYWRkciA9IHNhc19nZXRfYWRkcmVzcyhzZGV2KTsKIAogCWlmIChlZmQuYWRkcikgewpAQCAtNzc4LDYgKzc3OCw4IEBACiAJaWYgKCFlZGV2KQogCQlyZXR1cm47CiAKKwllbmNsb3N1cmVfdW5yZWdpc3RlcihlZGV2KTsKKwogCXNlc19kZXYgPSBlZGV2LT5zY3JhdGNoOwogCWVkZXYtPnNjcmF0Y2ggPSBOVUxMOwogCkBAIC03ODksNyArNzkxLDYgQEAKIAlrZnJlZShlZGV2LT5jb21wb25lbnRbMF0uc2NyYXRjaCk7CiAKIAlwdXRfZGV2aWNlKCZlZGV2LT5lZGV2KTsKLQllbmNsb3N1cmVfdW5yZWdpc3RlcihlZGV2KTsKIH0KIAogc3RhdGljIHZvaWQgc2VzX2ludGZfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmNkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvdmlydGlvX3Njc2kuYyBiL2RyaXZlcnMvc2NzaS92aXJ0aW9fc2NzaS5jCmluZGV4IDdkYmJiMjkuLmRlZWZhYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS92aXJ0aW9fc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS92aXJ0aW9fc2NzaS5jCkBAIC0xMDcsOCArMTA3LDggQEAKIAkvKiBJZiB0aGUgYWZmaW5pdHkgaGludCBpcyBzZXQgZm9yIHZpcnRxdWV1ZXMgKi8KIAlib29sIGFmZmluaXR5X2hpbnRfc2V0OwogCi0JLyogQ1BVIGhvdHBsdWcgbm90aWZpZXIgKi8KLQlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbmI7CisJc3RydWN0IGhsaXN0X25vZGUgbm9kZTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlX2RlYWQ7CiAKIAkvKiBQcm90ZWN0ZWQgYnkgZXZlbnRfdnEgbG9jayAqLwogCWJvb2wgc3RvcF9ldmVudHM7CkBAIC0xMTgsNiArMTE4LDcgQEAKIAlzdHJ1Y3QgdmlydGlvX3Njc2lfdnEgcmVxX3Zxc1tdOwogfTsKIAorc3RhdGljIGVudW0gY3B1aHBfc3RhdGUgdmlydGlvc2NzaV9vbmxpbmU7CiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnZpcnRzY3NpX2NtZF9jYWNoZTsKIHN0YXRpYyBtZW1wb29sX3QgKnZpcnRzY3NpX2NtZF9wb29sOwogCkBAIC04NTIsMjEgKzg1MywzMyBAQAogCXB1dF9vbmxpbmVfY3B1cygpOwogfQogCi1zdGF0aWMgaW50IHZpcnRzY3NpX2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKLQkJCQkgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCitzdGF0aWMgaW50IHZpcnRzY3NpX2NwdV9vbmxpbmUodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUpCiB7Ci0Jc3RydWN0IHZpcnRpb19zY3NpICp2c2NzaSA9IGNvbnRhaW5lcl9vZihuZmIsIHN0cnVjdCB2aXJ0aW9fc2NzaSwgbmIpOwotCXN3aXRjaChhY3Rpb24pIHsKLQljYXNlIENQVV9PTkxJTkU6Ci0JY2FzZSBDUFVfT05MSU5FX0ZST1pFTjoKLQljYXNlIENQVV9ERUFEOgotCWNhc2UgQ1BVX0RFQURfRlJPWkVOOgotCQlfX3ZpcnRzY3NpX3NldF9hZmZpbml0eSh2c2NzaSwgdHJ1ZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gTk9USUZZX09LOworCXN0cnVjdCB2aXJ0aW9fc2NzaSAqdnNjc2kgPSBobGlzdF9lbnRyeV9zYWZlKG5vZGUsIHN0cnVjdCB2aXJ0aW9fc2NzaSwKKwkJCQkJCSAgICAgbm9kZSk7CisJX192aXJ0c2NzaV9zZXRfYWZmaW5pdHkodnNjc2ksIHRydWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpcnRzY3NpX2NwdV9ub3RpZl9hZGQoc3RydWN0IHZpcnRpb19zY3NpICp2aSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gY3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlKHZpcnRpb3Njc2lfb25saW5lLCAmdmktPm5vZGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBjcHVocF9zdGF0ZV9hZGRfaW5zdGFuY2UoQ1BVSFBfVklSVF9TQ1NJX0RFQUQsICZ2aS0+bm9kZV9kZWFkKTsKKwlpZiAocmV0KQorCQljcHVocF9zdGF0ZV9yZW1vdmVfaW5zdGFuY2UodmlydGlvc2NzaV9vbmxpbmUsICZ2aS0+bm9kZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdmlydHNjc2lfY3B1X25vdGlmX3JlbW92ZShzdHJ1Y3QgdmlydGlvX3Njc2kgKnZpKQoreworCWNwdWhwX3N0YXRlX3JlbW92ZV9pbnN0YW5jZV9ub2NhbGxzKHZpcnRpb3Njc2lfb25saW5lLCAmdmktPm5vZGUpOworCWNwdWhwX3N0YXRlX3JlbW92ZV9pbnN0YW5jZV9ub2NhbGxzKENQVUhQX1ZJUlRfU0NTSV9ERUFELAorCQkJCQkgICAgJnZpLT5ub2RlX2RlYWQpOwogfQogCiBzdGF0aWMgdm9pZCB2aXJ0c2NzaV9pbml0X3ZxKHN0cnVjdCB2aXJ0aW9fc2NzaV92cSAqdmlydHNjc2lfdnEsCkBAIC05MjksOCArOTQyLDYgQEAKIAkJdmlydHNjc2lfaW5pdF92cSgmdnNjc2ktPnJlcV92cXNbaSAtIFZJUlRJT19TQ1NJX1ZRX0JBU0VdLAogCQkJCSB2cXNbaV0pOwogCi0JdmlydHNjc2lfc2V0X2FmZmluaXR5KHZzY3NpLCB0cnVlKTsKLQogCXZpcnRzY3NpX2NvbmZpZ19zZXQodmRldiwgY2RiX3NpemUsIFZJUlRJT19TQ1NJX0NEQl9TSVpFKTsKIAl2aXJ0c2NzaV9jb25maWdfc2V0KHZkZXYsIHNlbnNlX3NpemUsIFZJUlRJT19TQ1NJX1NFTlNFX1NJWkUpOwogCkBAIC05ODcsMTIgKzk5OCw5IEBACiAJaWYgKGVycikKIAkJZ290byB2aXJ0c2NzaV9pbml0X2ZhaWxlZDsKIAotCXZzY3NpLT5uYi5ub3RpZmllcl9jYWxsID0gJnZpcnRzY3NpX2NwdV9jYWxsYmFjazsKLQllcnIgPSByZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJnZzY3NpLT5uYik7Ci0JaWYgKGVycikgewotCQlwcl9lcnIoInJlZ2lzdGVyaW5nIGNwdSBub3RpZmllciBmYWlsZWRcbiIpOworCWVyciA9IHZpcnRzY3NpX2NwdV9ub3RpZl9hZGQodnNjc2kpOworCWlmIChlcnIpCiAJCWdvdG8gc2NzaV9hZGRfaG9zdF9mYWlsZWQ7Ci0JfQogCiAJY21kX3Blcl9sdW4gPSB2aXJ0c2NzaV9jb25maWdfZ2V0KHZkZXYsIGNtZF9wZXJfbHVuKSA/OiAxOwogCXNob3N0LT5jbWRfcGVyX2x1biA9IG1pbl90KHUzMiwgY21kX3Blcl9sdW4sIHNob3N0LT5jYW5fcXVldWUpOwpAQCAtMTA0OSw3ICsxMDU3LDcgQEAKIAogCXNjc2lfcmVtb3ZlX2hvc3Qoc2hvc3QpOwogCi0JdW5yZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJnZzY3NpLT5uYik7CisJdmlydHNjc2lfY3B1X25vdGlmX3JlbW92ZSh2c2NzaSk7CiAKIAl2aXJ0c2NzaV9yZW1vdmVfdnFzKHZkZXYpOwogCXNjc2lfaG9zdF9wdXQoc2hvc3QpOwpAQCAtMTA2MSw3ICsxMDY5LDcgQEAKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaCA9IHZpcnRpb19zY3NpX2hvc3QodmRldik7CiAJc3RydWN0IHZpcnRpb19zY3NpICp2c2NzaSA9IHNob3N0X3ByaXYoc2gpOwogCi0JdW5yZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJnZzY3NpLT5uYik7CisJdmlydHNjc2lfY3B1X25vdGlmX3JlbW92ZSh2c2NzaSk7CiAJdmlydHNjc2lfcmVtb3ZlX3Zxcyh2ZGV2KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTEwNzYsMTIgKzEwODQsMTEgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JZXJyID0gcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZ2c2NzaS0+bmIpOworCWVyciA9IHZpcnRzY3NpX2NwdV9ub3RpZl9hZGQodnNjc2kpOwogCWlmIChlcnIpIHsKIAkJdmRldi0+Y29uZmlnLT5kZWxfdnFzKHZkZXYpOwogCQlyZXR1cm4gZXJyOwogCX0KLQogCXZpcnRpb19kZXZpY2VfcmVhZHkodmRldik7CiAKIAlpZiAodmlydGlvX2hhc19mZWF0dXJlKHZkZXYsIFZJUlRJT19TQ1NJX0ZfSE9UUExVRykpCkBAIC0xMTM2LDYgKzExNDMsMTYgQEAKIAkJcHJfZXJyKCJtZW1wb29sX2NyZWF0ZSgpIGZvciB2aXJ0c2NzaV9jbWRfcG9vbCBmYWlsZWRcbiIpOwogCQlnb3RvIGVycm9yOwogCX0KKwlyZXQgPSBjcHVocF9zZXR1cF9zdGF0ZV9tdWx0aShDUFVIUF9BUF9PTkxJTkVfRFlOLAorCQkJCSAgICAgICJzY3NpL3ZpcnRpbzpvbmxpbmUiLAorCQkJCSAgICAgIHZpcnRzY3NpX2NwdV9vbmxpbmUsIE5VTEwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCXZpcnRpb3Njc2lfb25saW5lID0gcmV0OworCXJldCA9IGNwdWhwX3NldHVwX3N0YXRlX211bHRpKENQVUhQX1ZJUlRfU0NTSV9ERUFELCAic2NzaS92aXJ0aW86ZGVhZCIsCisJCQkJICAgICAgTlVMTCwgdmlydHNjc2lfY3B1X29ubGluZSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKIAlyZXQgPSByZWdpc3Rlcl92aXJ0aW9fZHJpdmVyKCZ2aXJ0aW9fc2NzaV9kcml2ZXIpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycm9yOwpAQCAtMTE1MSwxMiArMTE2OCwxNyBAQAogCQlrbWVtX2NhY2hlX2Rlc3Ryb3kodmlydHNjc2lfY21kX2NhY2hlKTsKIAkJdmlydHNjc2lfY21kX2NhY2hlID0gTlVMTDsKIAl9CisJaWYgKHZpcnRpb3Njc2lfb25saW5lKQorCQljcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUodmlydGlvc2NzaV9vbmxpbmUpOworCWNwdWhwX3JlbW92ZV9tdWx0aV9zdGF0ZShDUFVIUF9WSVJUX1NDU0lfREVBRCk7CiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKIHsKIAl1bnJlZ2lzdGVyX3ZpcnRpb19kcml2ZXIoJnZpcnRpb19zY3NpX2RyaXZlcik7CisJY3B1aHBfcmVtb3ZlX211bHRpX3N0YXRlKHZpcnRpb3Njc2lfb25saW5lKTsKKwljcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUoQ1BVSFBfVklSVF9TQ1NJX0RFQUQpOwogCW1lbXBvb2xfZGVzdHJveSh2aXJ0c2NzaV9jbWRfcG9vbCk7CiAJa21lbV9jYWNoZV9kZXN0cm95KHZpcnRzY3NpX2NtZF9jYWNoZSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvd2Q3MTl4LmMgYi9kcml2ZXJzL3Njc2kvd2Q3MTl4LmMKaW5kZXggZTNkYTFhMi4uMmE5ZGEyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3dkNzE5eC5jCisrKyBiL2RyaXZlcnMvc2NzaS93ZDcxOXguYwpAQCAtOTYyLDcgKzk2Miw3IEBACiAJc2NzaV9ob3N0X3B1dChzaCk7CiB9CiAKLXN0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRSh3ZDcxOXhfcGNpX3RhYmxlKSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCB3ZDcxOXhfcGNpX3RhYmxlW10gPSB7CiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfV0QsIDB4MzI5NikgfSwKIAl7fQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL3NhbXN1bmcvcG1fZG9tYWlucy5jIGIvZHJpdmVycy9zb2Mvc2Ftc3VuZy9wbV9kb21haW5zLmMKaW5kZXggNDgyMjM0Ni4uNzExMjAwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zb2Mvc2Ftc3VuZy9wbV9kb21haW5zLmMKKysrIGIvZHJpdmVycy9zb2Mvc2Ftc3VuZy9wbV9kb21haW5zLmMKQEAgLTIxNSwyOSArMjE1LDIyIEBACiAKIAkvKiBBc3NpZ24gdGhlIGNoaWxkIHBvd2VyIGRvbWFpbnMgdG8gdGhlaXIgcGFyZW50cyAqLwogCWZvcl9lYWNoX21hdGNoaW5nX25vZGUobnAsIGV4eW5vc19wbV9kb21haW5fb2ZfbWF0Y2gpIHsKLQkJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpjaGlsZF9kb21haW4sICpwYXJlbnRfZG9tYWluOwotCQlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzIGFyZ3M7CisJCXN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgY2hpbGQsIHBhcmVudDsKIAotCQlhcmdzLm5wID0gbnA7Ci0JCWFyZ3MuYXJnc19jb3VudCA9IDA7Ci0JCWNoaWxkX2RvbWFpbiA9IG9mX2dlbnBkX2dldF9mcm9tX3Byb3ZpZGVyKCZhcmdzKTsKLQkJaWYgKElTX0VSUihjaGlsZF9kb21haW4pKQotCQkJY29udGludWU7CisJCWNoaWxkLm5wID0gbnA7CisJCWNoaWxkLmFyZ3NfY291bnQgPSAwOwogCiAJCWlmIChvZl9wYXJzZV9waGFuZGxlX3dpdGhfYXJncyhucCwgInBvd2VyLWRvbWFpbnMiLAotCQkJCQkgIiNwb3dlci1kb21haW4tY2VsbHMiLCAwLCAmYXJncykgIT0gMCkKKwkJCQkJICAgICAgICIjcG93ZXItZG9tYWluLWNlbGxzIiwgMCwKKwkJCQkJICAgICAgICZwYXJlbnQpICE9IDApCiAJCQljb250aW51ZTsKIAotCQlwYXJlbnRfZG9tYWluID0gb2ZfZ2VucGRfZ2V0X2Zyb21fcHJvdmlkZXIoJmFyZ3MpOwotCQlpZiAoSVNfRVJSKHBhcmVudF9kb21haW4pKQotCQkJY29udGludWU7Ci0KLQkJaWYgKHBtX2dlbnBkX2FkZF9zdWJkb21haW4ocGFyZW50X2RvbWFpbiwgY2hpbGRfZG9tYWluKSkKKwkJaWYgKG9mX2dlbnBkX2FkZF9zdWJkb21haW4oJnBhcmVudCwgJmNoaWxkKSkKIAkJCXByX3dhcm4oIiVzIGZhaWxlZCB0byBhZGQgc3ViZG9tYWluOiAlc1xuIiwKLQkJCQlwYXJlbnRfZG9tYWluLT5uYW1lLCBjaGlsZF9kb21haW4tPm5hbWUpOworCQkJCXBhcmVudC5ucC0+bmFtZSwgY2hpbGQubnAtPm5hbWUpOwogCQllbHNlCiAJCQlwcl9pbmZvKCIlcyBoYXMgYXMgY2hpbGQgc3ViZG9tYWluOiAlcy5cbiIsCi0JCQkJcGFyZW50X2RvbWFpbi0+bmFtZSwgY2hpbGRfZG9tYWluLT5uYW1lKTsKKwkJCQlwYXJlbnQubnAtPm5hbWUsIGNoaWxkLm5wLT5uYW1lKTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL0tjb25maWcgYi9kcml2ZXJzL3NwaS9LY29uZmlnCmluZGV4IGQ2ZmI4ZDQuLmI3OTk1NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL0tjb25maWcKKysrIGIvZHJpdmVycy9zcGkvS2NvbmZpZwpAQCAtMTUzLDYgKzE1MywxNiBAQAogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBIaWdoIFNwZWVkIFNQSSBjb250cm9sbGVyIHByZXNlbnQgb24KIAkgIG5ld2VyIEJyb2FkY29tIEJDTTYzWFggU29Dcy4KIAorY29uZmlnIFNQSV9CQ01fUVNQSQorCXRyaXN0YXRlICJCcm9hZGNvbSBCU1BJIGFuZCBNU1BJIGNvbnRyb2xsZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfQlJDTVNUQiB8fCBBUkNIX0JDTSB8fCBBUkNIX0JDTV9JUFJPQyB8fCBDT01QSUxFX1RFU1QKKwlkZWZhdWx0IEFSQ0hfQkNNX0lQUk9DCisJaGVscAorCSAgRW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgQnJvYWRjb20gU1BJIGZsYXNoIGFuZCBNU1BJIGNvbnRyb2xsZXIuCisJICBTZWxlY3QgdGhpcyBvcHRpb24gZm9yIGFueSBvbmUgb2YgQlJDTVNUQiwgaVByb2MgTlNQIGFuZCBOUzIgU29DcworCSAgYmFzZWQgcGxhdGZvcm1zLiBUaGlzIGRyaXZlciB3b3JrcyBmb3IgYm90aCBTUEkgbWFzdGVyIGZvciBzcGktbm9yCisJICBmbGFzaCBkZXZpY2UgYXMgd2VsbCBhcyBNU1BJIGRldmljZS4KKwogY29uZmlnIFNQSV9CSVRCQU5HCiAJdHJpc3RhdGUgIlV0aWxpdGllcyBmb3IgQml0YmFuZ2luZyBTUEkgbWFzdGVycyIKIAloZWxwCkBAIC0yODUsNiArMjk1LDEzIEBACiAJICBUaGlzIGVuYWJsZXMgdXNpbmcgdGhlIEZyZWVzY2FsZSBpLk1YIFNQSSBjb250cm9sbGVycyBpbiBtYXN0ZXIKIAkgIG1vZGUuCiAKK2NvbmZpZyBTUElfSkNPUkUKKwl0cmlzdGF0ZSAiSi1Db3JlIFNQSSBNYXN0ZXIiCisJZGVwZW5kcyBvbiBPRiAmJiAoU1VQRVJIIHx8IENPTVBJTEVfVEVTVCkKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIFNQSSBtYXN0ZXIgY29udHJvbGxlciBpbiB0aGUgSi1Db3JlCisJICBzeW50aGVzaXphYmxlLCBvcGVuIHNvdXJjZSBTb0MuCisKIGNvbmZpZyBTUElfTE03MF9MTFAKIAl0cmlzdGF0ZSAiUGFyYWxsZWwgcG9ydCBhZGFwdGVyIGZvciBMTTcwIGV2YWwgYm9hcmQgKERFVkVMT1BNRU5UKSIKIAlkZXBlbmRzIG9uIFBBUlBPUlQKQEAgLTU0OSw3ICs1NjYsNyBAQAogY29uZmlnIFNQSV9TSF9NU0lPRgogCXRyaXN0YXRlICJTdXBlckggTVNJT0YgU1BJIGNvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBIQVZFX0NMSyAmJiBIQVNfRE1BCi0JZGVwZW5kcyBvbiBTVVBFUkggfHwgQVJDSF9SRU5FU0FTIHx8IENPTVBJTEVfVEVTVAorCWRlcGVuZHMgb24gQVJDSF9TSE1PQklMRSB8fCBBUkNIX1JFTkVTQVMgfHwgQ09NUElMRV9URVNUCiAJaGVscAogCSAgU1BJIGRyaXZlciBmb3IgU3VwZXJIIGFuZCBTSCBNb2JpbGUgTVNJT0YgYmxvY2tzLgogCkBAIC02MzEsNiArNjQ4LDEzIEBACiAJaGVscAogCSAgU1BJIGRyaXZlciBmb3IgTnZpZGlhIFRlZ3JhMjAvVGVncmEzMCBTTElOSyBDb250cm9sbGVyIGludGVyZmFjZS4KIAorY29uZmlnIFNQSV9USFVOREVSWAorCXRyaXN0YXRlICJDYXZpdW0gVGh1bmRlclggU1BJIGNvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBQQ0kgJiYgNjRCSVQgJiYgKEFSTTY0IHx8IENPTVBJTEVfVEVTVCkKKwloZWxwCisJICBTUEkgaG9zdCBkcml2ZXIgZm9yIHRoZSBoYXJkd2FyZSBmb3VuZCBvbiBDYXZpdW0gVGh1bmRlclgKKwkgIFNPQ3MuCisKIGNvbmZpZyBTUElfVE9QQ0xJRkZfUENICiAJdHJpc3RhdGUgIkludGVsIEVHMjBUIFBDSC9MQVBJUyBTZW1pY29uIElPSChNTDcyMTMvTUw3MjIzL01MNzgzMSkgU1BJIgogCWRlcGVuZHMgb24gUENJICYmIChYODZfMzIgfHwgTUlQUyB8fCBDT01QSUxFX1RFU1QpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9NYWtlZmlsZSBiL2RyaXZlcnMvc3BpL01ha2VmaWxlCmluZGV4IDE4NTM2N2UuLmFhOTM5ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3BpL01ha2VmaWxlCkBAIC0yMSw2ICsyMSw3IEBACiBvYmotJChDT05GSUdfU1BJX0JDTTUzWFgpCQkrPSBzcGktYmNtNTN4eC5vCiBvYmotJChDT05GSUdfU1BJX0JDTTYzWFgpCQkrPSBzcGktYmNtNjN4eC5vCiBvYmotJChDT05GSUdfU1BJX0JDTTYzWFhfSFNTUEkpCQkrPSBzcGktYmNtNjN4eC1oc3NwaS5vCitvYmotJChDT05GSUdfU1BJX0JDTV9RU1BJKQkJKz0gc3BpLWlwcm9jLXFzcGkubyBzcGktYnJjbXN0Yi1xc3BpLm8gc3BpLWJjbS1xc3BpLm8KIG9iai0kKENPTkZJR19TUElfQkZJTjVYWCkJCSs9IHNwaS1iZmluNXh4Lm8KIG9iai0kKENPTkZJR19TUElfQURJX1YzKSAgICAgICAgICAgICAgICArPSBzcGktYWRpLXYzLm8KIG9iai0kKENPTkZJR19TUElfQkZJTl9TUE9SVCkJCSs9IHNwaS1iZmluLXNwb3J0Lm8KQEAgLTQ2LDYgKzQ3LDcgQEAKIG9iai0kKENPTkZJR19TUElfR1BJTykJCQkrPSBzcGktZ3Bpby5vCiBvYmotJChDT05GSUdfU1BJX0lNR19TUEZJKQkJKz0gc3BpLWltZy1zcGZpLm8KIG9iai0kKENPTkZJR19TUElfSU1YKQkJCSs9IHNwaS1pbXgubworb2JqLSQoQ09ORklHX1NQSV9KQ09SRSkJCQkrPSBzcGktamNvcmUubwogb2JqLSQoQ09ORklHX1NQSV9MTTcwX0xMUCkJCSs9IHNwaS1sbTcwbGxwLm8KIG9iai0kKENPTkZJR19TUElfTFA4ODQxX1JUQykJCSs9IHNwaS1scDg4NDEtcnRjLm8KIG9iai0kKENPTkZJR19TUElfTUVTT05fU1BJRkMpCQkrPSBzcGktbWVzb24tc3BpZmMubwpAQCAtOTEsNiArOTMsOCBAQAogb2JqLSQoQ09ORklHX1NQSV9URUdSQTIwX1NGTEFTSCkJKz0gc3BpLXRlZ3JhMjAtc2ZsYXNoLm8KIG9iai0kKENPTkZJR19TUElfVEVHUkEyMF9TTElOSykJCSs9IHNwaS10ZWdyYTIwLXNsaW5rLm8KIG9iai0kKENPTkZJR19TUElfVExFNjJYMCkJCSs9IHNwaS10bGU2MngwLm8KK3NwaS10aHVuZGVyeC1vYmpzCQkJOj0gc3BpLWNhdml1bS5vIHNwaS1jYXZpdW0tdGh1bmRlcngubworb2JqLSQoQ09ORklHX1NQSV9USFVOREVSWCkJCSs9IHNwaS10aHVuZGVyeC5vCiBvYmotJChDT05GSUdfU1BJX1RPUENMSUZGX1BDSCkJCSs9IHNwaS10b3BjbGlmZi1wY2gubwogb2JqLSQoQ09ORklHX1NQSV9UWFg5KQkJCSs9IHNwaS10eHg5Lm8KIG9iai0kKENPTkZJR19TUElfWENPTU0pCQkrPSBzcGkteGNvbW0ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWJjbS1xc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGktYmNtLXFzcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGY5ZGVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvc3BpLWJjbS1xc3BpLmMKQEAgLTAsMCArMSwxMzk3IEBACisvKgorICogRHJpdmVyIGZvciBCcm9hZGNvbSBCUkNNU1RCLCBOU1AsICBOUzIsIEN5Z251cyBTUEkgQ29udHJvbGxlcnMKKyAqCisgKiBDb3B5cmlnaHQgMjAxNiBCcm9hZGNvbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiAodGhlICJHUEwiKS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKEdQTHYyKSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgKEdQTHYyKSBhbG9uZyB3aXRoIHRoaXMgc291cmNlIGNvZGUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3NwaS1ub3IuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgInNwaS1iY20tcXNwaS5oIgorCisjZGVmaW5lIERSSVZFUl9OQU1FICJiY21fcXNwaSIKKworCisvKiBCU1BJIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgQlNQSV9SRVZJU0lPTl9JRAkJCTB4MDAwCisjZGVmaW5lIEJTUElfU0NSQVRDSAkJCQkweDAwNAorI2RlZmluZSBCU1BJX01BU1RfTl9CT09UX0NUUkwJCQkweDAwOAorI2RlZmluZSBCU1BJX0JVU1lfU1RBVFVTCQkJMHgwMGMKKyNkZWZpbmUgQlNQSV9JTlRSX1NUQVRVUwkJCTB4MDEwCisjZGVmaW5lIEJTUElfQjBfU1RBVFVTCQkJCTB4MDE0CisjZGVmaW5lIEJTUElfQjBfQ1RSTAkJCQkweDAxOAorI2RlZmluZSBCU1BJX0IxX1NUQVRVUwkJCQkweDAxYworI2RlZmluZSBCU1BJX0IxX0NUUkwJCQkJMHgwMjAKKyNkZWZpbmUgQlNQSV9TVFJBUF9PVkVSUklERV9DVFJMCQkweDAyNAorI2RlZmluZSBCU1BJX0ZMRVhfTU9ERV9FTkFCTEUJCQkweDAyOAorI2RlZmluZSBCU1BJX0JJVFNfUEVSX0NZQ0xFCQkJMHgwMmMKKyNkZWZpbmUgQlNQSV9CSVRTX1BFUl9QSEFTRQkJCTB4MDMwCisjZGVmaW5lIEJTUElfQ01EX0FORF9NT0RFX0JZVEUJCQkweDAzNAorI2RlZmluZSBCU1BJX0JTUElfRkxBU0hfVVBQRVJfQUREUl9CWVRFCTB4MDM4CisjZGVmaW5lIEJTUElfQlNQSV9YT1JfVkFMVUUJCQkweDAzYworI2RlZmluZSBCU1BJX0JTUElfWE9SX0VOQUJMRQkJCTB4MDQwCisjZGVmaW5lIEJTUElfQlNQSV9QSU9fTU9ERV9FTkFCTEUJCTB4MDQ0CisjZGVmaW5lIEJTUElfQlNQSV9QSU9fSU9ESVIJCQkweDA0OAorI2RlZmluZSBCU1BJX0JTUElfUElPX0RBVEEJCQkweDA0YworCisvKiBSQUYgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBCU1BJX1JBRl9TVEFSVF9BRERSCQkJMHgxMDAKKyNkZWZpbmUgQlNQSV9SQUZfTlVNX1dPUkRTCQkJMHgxMDQKKyNkZWZpbmUgQlNQSV9SQUZfQ1RSTAkJCQkweDEwOAorI2RlZmluZSBCU1BJX1JBRl9GVUxMTkVTUwkJCTB4MTBjCisjZGVmaW5lIEJTUElfUkFGX1dBVEVSTUFSSwkJCTB4MTEwCisjZGVmaW5lIEJTUElfUkFGX1NUQVRVUwkJCTB4MTE0CisjZGVmaW5lIEJTUElfUkFGX1JFQURfREFUQQkJCTB4MTE4CisjZGVmaW5lIEJTUElfUkFGX1dPUkRfQ05UCQkJMHgxMWMKKyNkZWZpbmUgQlNQSV9SQUZfQ1VSUl9BRERSCQkJMHgxMjAKKworLyogT3ZlcnJpZGUgbW9kZSBtYXNrcyAqLworI2RlZmluZSBCU1BJX1NUUkFQX09WRVJSSURFX0NUUkxfT1ZFUlJJREUJQklUKDApCisjZGVmaW5lIEJTUElfU1RSQVBfT1ZFUlJJREVfQ1RSTF9EQVRBX0RVQUwJQklUKDEpCisjZGVmaW5lIEJTUElfU1RSQVBfT1ZFUlJJREVfQ1RSTF9BRERSXzRCWVRFCUJJVCgyKQorI2RlZmluZSBCU1BJX1NUUkFQX09WRVJSSURFX0NUUkxfREFUQV9RVUFECUJJVCgzKQorI2RlZmluZSBCU1BJX1NUUkFQX09WRVJSSURFX0NUUkxfRU5EQUlOX01PREUJQklUKDQpCisKKyNkZWZpbmUgQlNQSV9BRERSTEVOXzNCWVRFUwkJCTMKKyNkZWZpbmUgQlNQSV9BRERSTEVOXzRCWVRFUwkJCTQKKworI2RlZmluZSBCU1BJX1JBRl9TVEFUVVNfRklGT19FTVBUWV9NQVNLCUJJVCgxKQorCisjZGVmaW5lIEJTUElfUkFGX0NUUkxfU1RBUlRfTUFTSwkJQklUKDApCisjZGVmaW5lIEJTUElfUkFGX0NUUkxfQ0xFQVJfTUFTSwkJQklUKDEpCisKKyNkZWZpbmUgQlNQSV9CUFBfTU9ERV9TRUxFQ1RfTUFTSwkJQklUKDgpCisjZGVmaW5lIEJTUElfQlBQX0FERFJfU0VMRUNUX01BU0sJCUJJVCgxNikKKworI2RlZmluZSBCU1BJX1JFQURfTEVOR1RICQkJMjU2CisKKy8qIE1TUEkgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBNU1BJX1NQQ1IwX0xTQgkJCQkweDAwMAorI2RlZmluZSBNU1BJX1NQQ1IwX01TQgkJCQkweDAwNAorI2RlZmluZSBNU1BJX1NQQ1IxX0xTQgkJCQkweDAwOAorI2RlZmluZSBNU1BJX1NQQ1IxX01TQgkJCQkweDAwYworI2RlZmluZSBNU1BJX05FV1FQCQkJCTB4MDEwCisjZGVmaW5lIE1TUElfRU5EUVAJCQkJMHgwMTQKKyNkZWZpbmUgTVNQSV9TUENSMgkJCQkweDAxOAorI2RlZmluZSBNU1BJX01TUElfU1RBVFVTCQkJMHgwMjAKKyNkZWZpbmUgTVNQSV9DUFRRUAkJCQkweDAyNAorI2RlZmluZSBNU1BJX1NQQ1IzCQkJCTB4MDI4CisjZGVmaW5lIE1TUElfVFhSQU0JCQkJMHgwNDAKKyNkZWZpbmUgTVNQSV9SWFJBTQkJCQkweDBjMAorI2RlZmluZSBNU1BJX0NEUkFNCQkJCTB4MTQwCisjZGVmaW5lIE1TUElfV1JJVEVfTE9DSwkJCTB4MTgwCisKKyNkZWZpbmUgTVNQSV9NQVNURVJfQklUCQkJQklUKDcpCisKKyNkZWZpbmUgTVNQSV9OVU1fQ0RSQU0JCQkJMTYKKyNkZWZpbmUgTVNQSV9DRFJBTV9DT05UX0JJVAkJCUJJVCg3KQorI2RlZmluZSBNU1BJX0NEUkFNX0JJVFNFX0JJVAkJCUJJVCg2KQorI2RlZmluZSBNU1BJX0NEUkFNX1BDUwkJCQkweGYKKworI2RlZmluZSBNU1BJX1NQQ1IyX1NQRQkJCQlCSVQoNikKKyNkZWZpbmUgTVNQSV9TUENSMl9DT05UX0FGVEVSX0NNRAkJQklUKDcpCisKKyNkZWZpbmUgTVNQSV9NU1BJX1NUQVRVU19TUElGCQkJQklUKDApCisKKyNkZWZpbmUgSU5UUl9CQVNFX0JJVF9TSElGVAkJCTB4MDIKKyNkZWZpbmUgSU5UUl9DT1VOVAkJCQkweDA3CisKKyNkZWZpbmUgTlVNX0NISVBTRUxFQ1QJCQkJNAorI2RlZmluZSBRU1BJX1NQQlJfTUlOCQkJCThVCisjZGVmaW5lIFFTUElfU1BCUl9NQVgJCQkJMjU1VQorCisjZGVmaW5lIE9QQ09ERV9ESU9SCQkJCTB4QkIKKyNkZWZpbmUgT1BDT0RFX1FJT1IJCQkJMHhFQgorI2RlZmluZSBPUENPREVfRElPUl80QgkJCQkweEJDCisjZGVmaW5lIE9QQ09ERV9RSU9SXzRCCQkJCTB4RUMKKworI2RlZmluZSBNQVhfQ01EX1NJWkUJCQkJNgorCisjZGVmaW5lIEFERFJfNE1CX01BU0sJCQkJR0VOTUFTSygyMiwgMCkKKworLyogc3RvcCBhdCBlbmQgb2YgdHJhbnNmZXIsIG5vIG90aGVyIHJlYXNvbiAqLworI2RlZmluZSBUUkFOU19TVEFUVVNfQlJFQUtfTk9ORQkJMAorLyogc3RvcCBhdCBlbmQgb2Ygc3BpX21lc3NhZ2UgKi8KKyNkZWZpbmUgVFJBTlNfU1RBVFVTX0JSRUFLX0VPTQkJCTEKKy8qIHN0b3AgYXQgZW5kIG9mIHNwaV90cmFuc2ZlciBpZiBkZWxheSAqLworI2RlZmluZSBUUkFOU19TVEFUVVNfQlJFQUtfREVMQVkJCTIKKy8qIHN0b3AgYXQgZW5kIG9mIHNwaV90cmFuc2ZlciBpZiBjc19jaGFuZ2UgKi8KKyNkZWZpbmUgVFJBTlNfU1RBVFVTX0JSRUFLX0NTX0NIQU5HRQkJNAorLyogc3RvcCBpZiB3ZSBydW4gb3V0IG9mIGJ5dGVzICovCisjZGVmaW5lIFRSQU5TX1NUQVRVU19CUkVBS19OT19CWVRFUwkJOAorCisvKiBldmVudHMgdGhhdCBtYWtlIHVzIHN0b3AgZmlsbGluZyBUWCBzbG90cyAqLworI2RlZmluZSBUUkFOU19TVEFUVVNfQlJFQUtfVFggKFRSQU5TX1NUQVRVU19CUkVBS19FT00gfAkJXAorCQkJICAgICAgIFRSQU5TX1NUQVRVU19CUkVBS19ERUxBWSB8CQlcCisJCQkgICAgICAgVFJBTlNfU1RBVFVTX0JSRUFLX0NTX0NIQU5HRSkKKworLyogZXZlbnRzIHRoYXQgbWFrZSB1cyBkZWFzc2VydCBDUyAqLworI2RlZmluZSBUUkFOU19TVEFUVVNfQlJFQUtfREVTRUxFQ1QgKFRSQU5TX1NUQVRVU19CUkVBS19FT00gfAkJXAorCQkJCSAgICAgVFJBTlNfU1RBVFVTX0JSRUFLX0NTX0NIQU5HRSkKKworc3RydWN0IGJjbV9xc3BpX3Bhcm1zIHsKKwl1MzIgc3BlZWRfaHo7CisJdTggbW9kZTsKKwl1OCBiaXRzX3Blcl93b3JkOworfTsKKworc3RydWN0IGJjbV94ZmVyX21vZGUgeworCWJvb2wgZmxleF9tb2RlOworCXVuc2lnbmVkIGludCB3aWR0aDsKKwl1bnNpZ25lZCBpbnQgYWRkcmxlbjsKKwl1bnNpZ25lZCBpbnQgaHA7Cit9OworCitlbnVtIGJhc2VfdHlwZSB7CisJTVNQSSwKKwlCU1BJLAorCUNISVBfU0VMRUNULAorCUJBU0VNQVgsCit9OworCitlbnVtIGlycV9zb3VyY2UgeworCVNJTkdMRV9MMiwKKwlNVVhFRF9MMSwKK307CisKK3N0cnVjdCBiY21fcXNwaV9pcnEgeworCWNvbnN0IGNoYXIgKmlycV9uYW1lOworCWNvbnN0IGlycV9oYW5kbGVyX3QgaXJxX2hhbmRsZXI7CisJaW50IGlycV9zb3VyY2U7CisJdTMyIG1hc2s7Cit9OworCitzdHJ1Y3QgYmNtX3FzcGlfZGV2X2lkIHsKKwljb25zdCBzdHJ1Y3QgYmNtX3FzcGlfaXJxICppcnFwOworCXZvaWQgKmRldjsKK307CisKK3N0cnVjdCBxc3BpX3RyYW5zIHsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0cmFuczsKKwlpbnQgYnl0ZTsKK307CisKK3N0cnVjdCBiY21fcXNwaSB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworCXN0cnVjdCBjbGsgKmNsazsKKwl1MzIgYmFzZV9jbGs7CisJdTMyIG1heF9zcGVlZF9oejsKKwl2b2lkIF9faW9tZW0gKmJhc2VbQkFTRU1BWF07CisKKwkvKiBTb21lIFNvQ3MgcHJvdmlkZSBjdXN0b20gaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlcihzKSAqLworCXN0cnVjdCBiY21fcXNwaV9zb2NfaW50Ywkqc29jX2ludGM7CisKKwlzdHJ1Y3QgYmNtX3FzcGlfcGFybXMgbGFzdF9wYXJtczsKKwlzdHJ1Y3QgcXNwaV90cmFucyAgdHJhbnNfcG9zOworCWludCBjdXJyX2NzOworCWludCBic3BpX21hal9yZXY7CisJaW50IGJzcGlfbWluX3JldjsKKwlpbnQgYnNwaV9lbmFibGVkOworCXN0cnVjdCBzcGlfZmxhc2hfcmVhZF9tZXNzYWdlICpic3BpX3JmX21zZzsKKwl1MzIgYnNwaV9yZl9tc2dfaWR4OworCXUzMiBic3BpX3JmX21zZ19sZW47CisJdTMyIGJzcGlfcmZfbXNnX3N0YXR1czsKKwlzdHJ1Y3QgYmNtX3hmZXJfbW9kZSB4ZmVyX21vZGU7CisJdTMyIHMzX3N0cmFwX292ZXJyaWRlX2N0cmw7CisJYm9vbCBic3BpX21vZGU7CisJYm9vbCBiaWdfZW5kaWFuOworCWludCBudW1faXJxczsKKwlzdHJ1Y3QgYmNtX3FzcGlfZGV2X2lkICpkZXZfaWRzOworCXN0cnVjdCBjb21wbGV0aW9uIG1zcGlfZG9uZTsKKwlzdHJ1Y3QgY29tcGxldGlvbiBic3BpX2RvbmU7Cit9OworCitzdGF0aWMgaW5saW5lIGJvb2wgaGFzX2JzcGkoc3RydWN0IGJjbV9xc3BpICpxc3BpKQoreworCXJldHVybiBxc3BpLT5ic3BpX21vZGU7Cit9CisKKy8qIFJlYWQgcXNwaSBjb250cm9sbGVyIHJlZ2lzdGVyKi8KK3N0YXRpYyBpbmxpbmUgdTMyIGJjbV9xc3BpX3JlYWQoc3RydWN0IGJjbV9xc3BpICpxc3BpLCBlbnVtIGJhc2VfdHlwZSB0eXBlLAorCQkJCXVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJcmV0dXJuIGJjbV9xc3BpX3JlYWRsKHFzcGktPmJpZ19lbmRpYW4sIHFzcGktPmJhc2VbdHlwZV0gKyBvZmZzZXQpOworfQorCisvKiBXcml0ZSBxc3BpIGNvbnRyb2xsZXIgcmVnaXN0ZXIqLworc3RhdGljIGlubGluZSB2b2lkIGJjbV9xc3BpX3dyaXRlKHN0cnVjdCBiY21fcXNwaSAqcXNwaSwgZW51bSBiYXNlX3R5cGUgdHlwZSwKKwkJCQkgIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBkYXRhKQoreworCWJjbV9xc3BpX3dyaXRlbChxc3BpLT5iaWdfZW5kaWFuLCBkYXRhLCBxc3BpLT5iYXNlW3R5cGVdICsgb2Zmc2V0KTsKK30KKworLyogQlNQSSBoZWxwZXJzICovCitzdGF0aWMgaW50IGJjbV9xc3BpX2JzcGlfYnVzeV9wb2xsKHN0cnVjdCBiY21fcXNwaSAqcXNwaSkKK3sKKwlpbnQgaTsKKworCS8qIHRoaXMgc2hvdWxkIG5vcm1hbGx5IGZpbmlzaCB3aXRoaW4gMTB1cyAqLworCWZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKwkJaWYgKCEoYmNtX3FzcGlfcmVhZChxc3BpLCBCU1BJLCBCU1BJX0JVU1lfU1RBVFVTKSAmIDEpKQorCQkJcmV0dXJuIDA7CisJCXVkZWxheSgxKTsKKwl9CisJZGV2X3dhcm4oJnFzcGktPnBkZXYtPmRldiwgInRpbWVvdXQgd2FpdGluZyBmb3IgIWJ1c3lfc3RhdHVzXG4iKTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGlubGluZSBib29sIGJjbV9xc3BpX2JzcGlfdmVyX3RocmVlKHN0cnVjdCBiY21fcXNwaSAqcXNwaSkKK3sKKwlpZiAocXNwaS0+YnNwaV9tYWpfcmV2IDwgNCkKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBiY21fcXNwaV9ic3BpX2ZsdXNoX3ByZWZldGNoX2J1ZmZlcnMoc3RydWN0IGJjbV9xc3BpICpxc3BpKQoreworCWJjbV9xc3BpX2JzcGlfYnVzeV9wb2xsKHFzcGkpOworCS8qIEZvcmNlIHJpc2luZyBlZGdlIGZvciB0aGUgYjAvYjEgJ2ZsdXNoJyBmaWVsZCAqLworCWJjbV9xc3BpX3dyaXRlKHFzcGksIEJTUEksIEJTUElfQjBfQ1RSTCwgMSk7CisJYmNtX3FzcGlfd3JpdGUocXNwaSwgQlNQSSwgQlNQSV9CMV9DVFJMLCAxKTsKKwliY21fcXNwaV93cml0ZShxc3BpLCBCU1BJLCBCU1BJX0IwX0NUUkwsIDApOworCWJjbV9xc3BpX3dyaXRlKHFzcGksIEJTUEksIEJTUElfQjFfQ1RSTCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgYmNtX3FzcGlfYnNwaV9scl9pc19maWZvX2VtcHR5KHN0cnVjdCBiY21fcXNwaSAqcXNwaSkKK3sKKwlyZXR1cm4gKGJjbV9xc3BpX3JlYWQocXNwaSwgQlNQSSwgQlNQSV9SQUZfU1RBVFVTKSAmCisJCQkJQlNQSV9SQUZfU1RBVFVTX0ZJRk9fRU1QVFlfTUFTSyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGJjbV9xc3BpX2JzcGlfbHJfcmVhZF9maWZvKHN0cnVjdCBiY21fcXNwaSAqcXNwaSkKK3sKKwl1MzIgZGF0YSA9IGJjbV9xc3BpX3JlYWQocXNwaSwgQlNQSSwgQlNQSV9SQUZfUkVBRF9EQVRBKTsKKworCS8qIEJTUEkgdjMgTFIgaXMgTEUgb25seSwgY29udmVydCBkYXRhIHRvIGhvc3QgZW5kaWFubmVzcyAqLworCWlmIChiY21fcXNwaV9ic3BpX3Zlcl90aHJlZShxc3BpKSkKKwkJZGF0YSA9IGxlMzJfdG9fY3B1KGRhdGEpOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21fcXNwaV9ic3BpX2xyX3N0YXJ0KHN0cnVjdCBiY21fcXNwaSAqcXNwaSkKK3sKKwliY21fcXNwaV9ic3BpX2J1c3lfcG9sbChxc3BpKTsKKwliY21fcXNwaV93cml0ZShxc3BpLCBCU1BJLCBCU1BJX1JBRl9DVFJMLAorCQkgICAgICAgQlNQSV9SQUZfQ1RSTF9TVEFSVF9NQVNLKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJjbV9xc3BpX2JzcGlfbHJfY2xlYXIoc3RydWN0IGJjbV9xc3BpICpxc3BpKQoreworCWJjbV9xc3BpX3dyaXRlKHFzcGksIEJTUEksIEJTUElfUkFGX0NUUkwsCisJCSAgICAgICBCU1BJX1JBRl9DVFJMX0NMRUFSX01BU0spOworCWJjbV9xc3BpX2JzcGlfZmx1c2hfcHJlZmV0Y2hfYnVmZmVycyhxc3BpKTsKK30KKworc3RhdGljIHZvaWQgYmNtX3FzcGlfYnNwaV9scl9kYXRhX3JlYWQoc3RydWN0IGJjbV9xc3BpICpxc3BpKQoreworCXUzMiAqYnVmID0gKHUzMiAqKXFzcGktPmJzcGlfcmZfbXNnLT5idWY7CisJdTMyIGRhdGEgPSAwOworCisJZGV2X2RiZygmcXNwaS0+cGRldi0+ZGV2LCAieGZlciAlcCByeCAlcCByeGxlbiAlZFxuIiwgcXNwaS0+YnNwaV9yZl9tc2csCisJCXFzcGktPmJzcGlfcmZfbXNnLT5idWYsIHFzcGktPmJzcGlfcmZfbXNnX2xlbik7CisJd2hpbGUgKCFiY21fcXNwaV9ic3BpX2xyX2lzX2ZpZm9fZW1wdHkocXNwaSkpIHsKKwkJZGF0YSA9IGJjbV9xc3BpX2JzcGlfbHJfcmVhZF9maWZvKHFzcGkpOworCQlpZiAobGlrZWx5KHFzcGktPmJzcGlfcmZfbXNnX2xlbiA+PSA0KSAmJgorCQkgICAgSVNfQUxJR05FRCgodWludHB0cl90KWJ1ZiwgNCkpIHsKKwkJCWJ1Zltxc3BpLT5ic3BpX3JmX21zZ19pZHgrK10gPSBkYXRhOworCQkJcXNwaS0+YnNwaV9yZl9tc2dfbGVuIC09IDQ7CisJCX0gZWxzZSB7CisJCQkvKiBSZWFkIG91dCByZW1haW5pbmcgYnl0ZXMsIG1ha2Ugc3VyZSovCisJCQl1OCAqY2J1ZiA9ICh1OCAqKSZidWZbcXNwaS0+YnNwaV9yZl9tc2dfaWR4XTsKKworCQkJZGF0YSA9IGNwdV90b19sZTMyKGRhdGEpOworCQkJd2hpbGUgKHFzcGktPmJzcGlfcmZfbXNnX2xlbikgeworCQkJCSpjYnVmKysgPSAodTgpZGF0YTsKKwkJCQlkYXRhID4+PSA4OworCQkJCXFzcGktPmJzcGlfcmZfbXNnX2xlbi0tOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBiY21fcXNwaV9ic3BpX3NldF94ZmVyX3BhcmFtcyhzdHJ1Y3QgYmNtX3FzcGkgKnFzcGksIHU4IGNtZF9ieXRlLAorCQkJCQkgIGludCBicHAsIGludCBicGMsIGludCBmbGV4X21vZGUpCit7CisJYmNtX3FzcGlfd3JpdGUocXNwaSwgQlNQSSwgQlNQSV9GTEVYX01PREVfRU5BQkxFLCAwKTsKKwliY21fcXNwaV93cml0ZShxc3BpLCBCU1BJLCBCU1BJX0JJVFNfUEVSX0NZQ0xFLCBicGMpOworCWJjbV9xc3BpX3dyaXRlKHFzcGksIEJTUEksIEJTUElfQklUU19QRVJfUEhBU0UsIGJwcCk7CisJYmNtX3FzcGlfd3JpdGUocXNwaSwgQlNQSSwgQlNQSV9DTURfQU5EX01PREVfQllURSwgY21kX2J5dGUpOworCWJjbV9xc3BpX3dyaXRlKHFzcGksIEJTUEksIEJTUElfRkxFWF9NT0RFX0VOQUJMRSwgZmxleF9tb2RlKTsKK30KKworc3RhdGljIGludCBiY21fcXNwaV9ic3BpX3NldF9mbGV4X21vZGUoc3RydWN0IGJjbV9xc3BpICpxc3BpLCBpbnQgd2lkdGgsCisJCQkJICAgICAgIGludCBhZGRybGVuLCBpbnQgaHApCit7CisJaW50IGJwYyA9IDAsIGJwcCA9IDA7CisJdTggY29tbWFuZCA9IFNQSU5PUl9PUF9SRUFEX0ZBU1Q7CisJaW50IGZsZXhfbW9kZSA9IDEsIHJ2ID0gMDsKKwlib29sIHNwYW5zXzRieXRlID0gZmFsc2U7CisKKwlkZXZfZGJnKCZxc3BpLT5wZGV2LT5kZXYsICJzZXQgZmxleCBtb2RlIHcgJXggYWRkcmxlbiAleCBocCAlZFxuIiwKKwkJd2lkdGgsIGFkZHJsZW4sIGhwKTsKKworCWlmIChhZGRybGVuID09IEJTUElfQUREUkxFTl80QllURVMpIHsKKwkJYnBwID0gQlNQSV9CUFBfQUREUl9TRUxFQ1RfTUFTSzsKKwkJc3BhbnNfNGJ5dGUgPSB0cnVlOworCX0KKworCWJwcCB8PSA4OworCisJc3dpdGNoICh3aWR0aCkgeworCWNhc2UgU1BJX05CSVRTX1NJTkdMRToKKwkJaWYgKGFkZHJsZW4gPT0gQlNQSV9BRERSTEVOXzNCWVRFUykKKwkJCS8qIGRlZmF1bHQgbW9kZSwgZG9lcyBub3QgbmVlZCBmbGV4X2NtZCAqLworCQkJZmxleF9tb2RlID0gMDsKKwkJZWxzZQorCQkJY29tbWFuZCA9IFNQSU5PUl9PUF9SRUFENF9GQVNUOworCQlicmVhazsKKwljYXNlIFNQSV9OQklUU19EVUFMOgorCQlicGMgPSAweDAwMDAwMDAxOworCQlpZiAoaHApIHsKKwkJCWJwYyB8PSAweDAwMDEwMTAwOyAvKiBhZGRyZXNzIGFuZCBtb2RlIGFyZSAyLWJpdCAqLworCQkJYnBwID0gQlNQSV9CUFBfTU9ERV9TRUxFQ1RfTUFTSzsKKwkJCWNvbW1hbmQgPSBPUENPREVfRElPUjsKKwkJCWlmIChzcGFuc180Ynl0ZSkKKwkJCQljb21tYW5kID0gT1BDT0RFX0RJT1JfNEI7CisJCX0gZWxzZSB7CisJCQljb21tYW5kID0gU1BJTk9SX09QX1JFQURfMV8xXzI7CisJCQlpZiAoc3BhbnNfNGJ5dGUpCisJCQkJY29tbWFuZCA9IFNQSU5PUl9PUF9SRUFENF8xXzFfMjsKKwkJfQorCQlicmVhazsKKwljYXNlIFNQSV9OQklUU19RVUFEOgorCQlicGMgPSAweDAwMDAwMDAyOworCQlpZiAoaHApIHsKKwkJCWJwYyB8PSAweDAwMDIwMjAwOyAvKiBhZGRyZXNzIGFuZCBtb2RlIGFyZSA0LWJpdCAqLworCQkJYnBwID0gNDsgLyogZHVtbXkgY3ljbGVzICovCisJCQlicHAgfD0gQlNQSV9CUFBfQUREUl9TRUxFQ1RfTUFTSzsKKwkJCWNvbW1hbmQgPSBPUENPREVfUUlPUjsKKwkJCWlmIChzcGFuc180Ynl0ZSkKKwkJCQljb21tYW5kID0gT1BDT0RFX1FJT1JfNEI7CisJCX0gZWxzZSB7CisJCQljb21tYW5kID0gU1BJTk9SX09QX1JFQURfMV8xXzQ7CisJCQlpZiAoc3BhbnNfNGJ5dGUpCisJCQkJY29tbWFuZCA9IFNQSU5PUl9PUF9SRUFENF8xXzFfNDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlydiA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCWlmIChydiA9PSAwKQorCQliY21fcXNwaV9ic3BpX3NldF94ZmVyX3BhcmFtcyhxc3BpLCBjb21tYW5kLCBicHAsIGJwYywKKwkJCQkJICAgICAgZmxleF9tb2RlKTsKKworCXJldHVybiBydjsKK30KKworc3RhdGljIGludCBiY21fcXNwaV9ic3BpX3NldF9vdmVycmlkZShzdHJ1Y3QgYmNtX3FzcGkgKnFzcGksIGludCB3aWR0aCwKKwkJCQkgICAgICBpbnQgYWRkcmxlbiwgaW50IGhwKQoreworCXUzMiBkYXRhID0gYmNtX3FzcGlfcmVhZChxc3BpLCBCU1BJLCBCU1BJX1NUUkFQX09WRVJSSURFX0NUUkwpOworCisJZGV2X2RiZygmcXNwaS0+cGRldi0+ZGV2LCAic2V0IG92ZXJyaWRlIG1vZGUgdyAleCBhZGRybGVuICV4IGhwICVkXG4iLAorCQl3aWR0aCwgYWRkcmxlbiwgaHApOworCisJc3dpdGNoICh3aWR0aCkgeworCWNhc2UgU1BJX05CSVRTX1NJTkdMRToKKwkJLyogY2xlYXIgcXVhZC9kdWFsIG1vZGUgKi8KKwkJZGF0YSAmPSB+KEJTUElfU1RSQVBfT1ZFUlJJREVfQ1RSTF9EQVRBX1FVQUQgfAorCQkJICBCU1BJX1NUUkFQX09WRVJSSURFX0NUUkxfREFUQV9EVUFMKTsKKwkJYnJlYWs7CisKKwljYXNlIFNQSV9OQklUU19RVUFEOgorCQkvKiBjbGVhciBkdWFsIG1vZGUgYW5kIHNldCBxdWFkIG1vZGUgKi8KKwkJZGF0YSAmPSB+QlNQSV9TVFJBUF9PVkVSUklERV9DVFJMX0RBVEFfRFVBTDsKKwkJZGF0YSB8PSBCU1BJX1NUUkFQX09WRVJSSURFX0NUUkxfREFUQV9RVUFEOworCQlicmVhazsKKwljYXNlIFNQSV9OQklUU19EVUFMOgorCQkvKiBjbGVhciBxdWFkIG1vZGUgc2V0IGR1YWwgbW9kZSAqLworCQlkYXRhICY9IH5CU1BJX1NUUkFQX09WRVJSSURFX0NUUkxfREFUQV9RVUFEOworCQlkYXRhIHw9IEJTUElfU1RSQVBfT1ZFUlJJREVfQ1RSTF9EQVRBX0RVQUw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChhZGRybGVuID09IEJTUElfQUREUkxFTl80QllURVMpCisJCS8qIHNldCA0Ynl0ZSBtb2RlKi8KKwkJZGF0YSB8PSBCU1BJX1NUUkFQX09WRVJSSURFX0NUUkxfQUREUl80QllURTsKKwllbHNlCisJCS8qIGNsZWFyIDQgYnl0ZSBtb2RlICovCisJCWRhdGEgJj0gfkJTUElfU1RSQVBfT1ZFUlJJREVfQ1RSTF9BRERSXzRCWVRFOworCisJLyogc2V0IHRoZSBvdmVycmlkZSBtb2RlICovCisJZGF0YSB8PQlCU1BJX1NUUkFQX09WRVJSSURFX0NUUkxfT1ZFUlJJREU7CisJYmNtX3FzcGlfd3JpdGUocXNwaSwgQlNQSSwgQlNQSV9TVFJBUF9PVkVSUklERV9DVFJMLCBkYXRhKTsKKwliY21fcXNwaV9ic3BpX3NldF94ZmVyX3BhcmFtcyhxc3BpLCBTUElOT1JfT1BfUkVBRF9GQVNULCAwLCAwLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbV9xc3BpX2JzcGlfc2V0X21vZGUoc3RydWN0IGJjbV9xc3BpICpxc3BpLAorCQkJCSAgaW50IHdpZHRoLCBpbnQgYWRkcmxlbiwgaW50IGhwKQoreworCWludCBlcnJvciA9IDA7CisKKwkvKiBkZWZhdWx0IG1vZGUgKi8KKwlxc3BpLT54ZmVyX21vZGUuZmxleF9tb2RlID0gdHJ1ZTsKKworCWlmICghYmNtX3FzcGlfYnNwaV92ZXJfdGhyZWUocXNwaSkpIHsKKwkJdTMyIHZhbCwgbWFzazsKKworCQl2YWwgPSBiY21fcXNwaV9yZWFkKHFzcGksIEJTUEksIEJTUElfU1RSQVBfT1ZFUlJJREVfQ1RSTCk7CisJCW1hc2sgPSBCU1BJX1NUUkFQX09WRVJSSURFX0NUUkxfT1ZFUlJJREU7CisJCWlmICh2YWwgJiBtYXNrIHx8IHFzcGktPnMzX3N0cmFwX292ZXJyaWRlX2N0cmwgJiBtYXNrKSB7CisJCQlxc3BpLT54ZmVyX21vZGUuZmxleF9tb2RlID0gZmFsc2U7CisJCQliY21fcXNwaV93cml0ZShxc3BpLCBCU1BJLCBCU1BJX0ZMRVhfTU9ERV9FTkFCTEUsCisJCQkJICAgICAgIDApOworCisJCQlpZiAoKHZhbCB8IHFzcGktPnMzX3N0cmFwX292ZXJyaWRlX2N0cmwpICYKKwkJCSAgICBCU1BJX1NUUkFQX09WRVJSSURFX0NUUkxfREFUQV9EVUFMKQorCQkJCXdpZHRoID0gU1BJX05CSVRTX0RVQUw7CisJCQllbHNlIGlmICgodmFsIHwgIHFzcGktPnMzX3N0cmFwX292ZXJyaWRlX2N0cmwpICYKKwkJCQkgQlNQSV9TVFJBUF9PVkVSUklERV9DVFJMX0RBVEFfUVVBRCkKKwkJCQl3aWR0aCA9IFNQSV9OQklUU19RVUFEOworCisJCQllcnJvciA9IGJjbV9xc3BpX2JzcGlfc2V0X292ZXJyaWRlKHFzcGksIHdpZHRoLCBhZGRybGVuLAorCQkJCQkJCSAgIGhwKTsKKwkJfQorCX0KKworCWlmIChxc3BpLT54ZmVyX21vZGUuZmxleF9tb2RlKQorCQllcnJvciA9IGJjbV9xc3BpX2JzcGlfc2V0X2ZsZXhfbW9kZShxc3BpLCB3aWR0aCwgYWRkcmxlbiwgaHApOworCisJaWYgKGVycm9yKSB7CisJCWRldl93YXJuKCZxc3BpLT5wZGV2LT5kZXYsCisJCQkgIklOVkFMSUQgQ09NQklOQVRJT046IHdpZHRoPSVkIGFkZHJsZW49JWQgaHA9JWRcbiIsCisJCQkgd2lkdGgsIGFkZHJsZW4sIGhwKTsKKwl9IGVsc2UgaWYgKHFzcGktPnhmZXJfbW9kZS53aWR0aCAhPSB3aWR0aCB8fAorCQkgICBxc3BpLT54ZmVyX21vZGUuYWRkcmxlbiAhPSBhZGRybGVuIHx8CisJCSAgIHFzcGktPnhmZXJfbW9kZS5ocCAhPSBocCkgeworCQlxc3BpLT54ZmVyX21vZGUud2lkdGggPSB3aWR0aDsKKwkJcXNwaS0+eGZlcl9tb2RlLmFkZHJsZW4gPSBhZGRybGVuOworCQlxc3BpLT54ZmVyX21vZGUuaHAgPSBocDsKKwkJZGV2X2RiZygmcXNwaS0+cGRldi0+ZGV2LAorCQkJImNzOiVkICVkLWxhbmUgb3V0cHV0LCAlZC1ieXRlIGFkZHJlc3Mlc1xuIiwKKwkJCXFzcGktPmN1cnJfY3MsCisJCQlxc3BpLT54ZmVyX21vZGUud2lkdGgsCisJCQlxc3BpLT54ZmVyX21vZGUuYWRkcmxlbiwKKwkJCXFzcGktPnhmZXJfbW9kZS5ocCAhPSAtMSA/ICIsIGhwIG1vZGUiIDogIiIpOworCX0KKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgYmNtX3FzcGlfZW5hYmxlX2JzcGkoc3RydWN0IGJjbV9xc3BpICpxc3BpKQoreworCWlmICghaGFzX2JzcGkocXNwaSkgfHwgKHFzcGktPmJzcGlfZW5hYmxlZCkpCisJCXJldHVybjsKKworCXFzcGktPmJzcGlfZW5hYmxlZCA9IDE7CisJaWYgKChiY21fcXNwaV9yZWFkKHFzcGksIEJTUEksIEJTUElfTUFTVF9OX0JPT1RfQ1RSTCkgJiAxKSA9PSAwKQorCQlyZXR1cm47CisKKwliY21fcXNwaV9ic3BpX2ZsdXNoX3ByZWZldGNoX2J1ZmZlcnMocXNwaSk7CisJdWRlbGF5KDEpOworCWJjbV9xc3BpX3dyaXRlKHFzcGksIEJTUEksIEJTUElfTUFTVF9OX0JPT1RfQ1RSTCwgMCk7CisJdWRlbGF5KDEpOworfQorCitzdGF0aWMgdm9pZCBiY21fcXNwaV9kaXNhYmxlX2JzcGkoc3RydWN0IGJjbV9xc3BpICpxc3BpKQoreworCWlmICghaGFzX2JzcGkocXNwaSkgfHwgKCFxc3BpLT5ic3BpX2VuYWJsZWQpKQorCQlyZXR1cm47CisKKwlxc3BpLT5ic3BpX2VuYWJsZWQgPSAwOworCWlmICgoYmNtX3FzcGlfcmVhZChxc3BpLCBCU1BJLCBCU1BJX01BU1RfTl9CT09UX0NUUkwpICYgMSkpCisJCXJldHVybjsKKworCWJjbV9xc3BpX2JzcGlfYnVzeV9wb2xsKHFzcGkpOworCWJjbV9xc3BpX3dyaXRlKHFzcGksIEJTUEksIEJTUElfTUFTVF9OX0JPT1RfQ1RSTCwgMSk7CisJdWRlbGF5KDEpOworfQorCitzdGF0aWMgdm9pZCBiY21fcXNwaV9jaGlwX3NlbGVjdChzdHJ1Y3QgYmNtX3FzcGkgKnFzcGksIGludCBjcykKK3sKKwl1MzIgZGF0YSA9IDA7CisKKwlpZiAocXNwaS0+Y3Vycl9jcyA9PSBjcykKKwkJcmV0dXJuOworCWlmIChxc3BpLT5iYXNlW0NISVBfU0VMRUNUXSkgeworCQlkYXRhID0gYmNtX3FzcGlfcmVhZChxc3BpLCBDSElQX1NFTEVDVCwgMCk7CisJCWRhdGEgPSAoZGF0YSAmIH4weGZmKSB8ICgxIDw8IGNzKTsKKwkJYmNtX3FzcGlfd3JpdGUocXNwaSwgQ0hJUF9TRUxFQ1QsIDAsIGRhdGEpOworCQl1c2xlZXBfcmFuZ2UoMTAsIDIwKTsKKwl9CisJcXNwaS0+Y3Vycl9jcyA9IGNzOworfQorCisvKiBNU1BJIGhlbHBlcnMgKi8KK3N0YXRpYyB2b2lkIGJjbV9xc3BpX2h3X3NldF9wYXJtcyhzdHJ1Y3QgYmNtX3FzcGkgKnFzcGksCisJCQkJICBjb25zdCBzdHJ1Y3QgYmNtX3FzcGlfcGFybXMgKnhwKQoreworCXUzMiBzcGNyLCBzcGJyID0gMDsKKworCWlmICh4cC0+c3BlZWRfaHopCisJCXNwYnIgPSBxc3BpLT5iYXNlX2NsayAvICgyICogeHAtPnNwZWVkX2h6KTsKKworCXNwY3IgPSBjbGFtcF92YWwoc3BiciwgUVNQSV9TUEJSX01JTiwgUVNQSV9TUEJSX01BWCk7CisJYmNtX3FzcGlfd3JpdGUocXNwaSwgTVNQSSwgTVNQSV9TUENSMF9MU0IsIHNwY3IpOworCisJc3BjciA9IE1TUElfTUFTVEVSX0JJVDsKKwkvKiBmb3IgMTYgYml0IHRoZSBkYXRhIHNob3VsZCBiZSB6ZXJvICovCisJaWYgKHhwLT5iaXRzX3Blcl93b3JkICE9IDE2KQorCQlzcGNyIHw9IHhwLT5iaXRzX3Blcl93b3JkIDw8IDI7CisJc3BjciB8PSB4cC0+bW9kZSAmIDM7CisJYmNtX3FzcGlfd3JpdGUocXNwaSwgTVNQSSwgTVNQSV9TUENSMF9NU0IsIHNwY3IpOworCisJcXNwaS0+bGFzdF9wYXJtcyA9ICp4cDsKK30KKworc3RhdGljIHZvaWQgYmNtX3FzcGlfdXBkYXRlX3Bhcm1zKHN0cnVjdCBiY21fcXNwaSAqcXNwaSwKKwkJCQkgIHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0cmFucykKK3sKKwlzdHJ1Y3QgYmNtX3FzcGlfcGFybXMgeHA7CisKKwl4cC5zcGVlZF9oeiA9IHRyYW5zLT5zcGVlZF9oejsKKwl4cC5iaXRzX3Blcl93b3JkID0gdHJhbnMtPmJpdHNfcGVyX3dvcmQ7CisJeHAubW9kZSA9IHNwaS0+bW9kZTsKKworCWJjbV9xc3BpX2h3X3NldF9wYXJtcyhxc3BpLCAmeHApOworfQorCitzdGF0aWMgaW50IGJjbV9xc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGJjbV9xc3BpX3Bhcm1zICp4cDsKKworCWlmIChzcGktPmJpdHNfcGVyX3dvcmQgPiAxNikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl4cCA9IHNwaV9nZXRfY3RsZGF0YShzcGkpOworCWlmICgheHApIHsKKwkJeHAgPSBremFsbG9jKHNpemVvZigqeHApLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF4cCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlzcGlfc2V0X2N0bGRhdGEoc3BpLCB4cCk7CisJfQorCXhwLT5zcGVlZF9oeiA9IHNwaS0+bWF4X3NwZWVkX2h6OworCXhwLT5tb2RlID0gc3BpLT5tb2RlOworCisJaWYgKHNwaS0+Yml0c19wZXJfd29yZCkKKwkJeHAtPmJpdHNfcGVyX3dvcmQgPSBzcGktPmJpdHNfcGVyX3dvcmQ7CisJZWxzZQorCQl4cC0+Yml0c19wZXJfd29yZCA9IDg7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1cGRhdGVfcXNwaV90cmFuc19ieXRlX2NvdW50KHN0cnVjdCBiY21fcXNwaSAqcXNwaSwKKwkJCQkJc3RydWN0IHFzcGlfdHJhbnMgKnF0LCBpbnQgZmxhZ3MpCit7CisJaW50IHJldCA9IFRSQU5TX1NUQVRVU19CUkVBS19OT05FOworCisJLyogY291bnQgdGhlIGxhc3QgdHJhbnNmZXJyZWQgYnl0ZXMgKi8KKwlpZiAocXQtPnRyYW5zLT5iaXRzX3Blcl93b3JkIDw9IDgpCisJCXF0LT5ieXRlKys7CisJZWxzZQorCQlxdC0+Ynl0ZSArPSAyOworCisJaWYgKHF0LT5ieXRlID49IHF0LT50cmFucy0+bGVuKSB7CisJCS8qIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIHNwaV90cmFuc2ZlciAqLworCisJCS8qIGluIFRYIG1vZGUsIG5lZWQgdG8gcGF1c2UgZm9yIGEgZGVsYXkgb3IgQ1MgY2hhbmdlICovCisJCWlmIChxdC0+dHJhbnMtPmRlbGF5X3VzZWNzICYmCisJCSAgICAoZmxhZ3MgJiBUUkFOU19TVEFUVVNfQlJFQUtfREVMQVkpKQorCQkJcmV0IHw9IFRSQU5TX1NUQVRVU19CUkVBS19ERUxBWTsKKwkJaWYgKHF0LT50cmFucy0+Y3NfY2hhbmdlICYmCisJCSAgICAoZmxhZ3MgJiBUUkFOU19TVEFUVVNfQlJFQUtfQ1NfQ0hBTkdFKSkKKwkJCXJldCB8PSBUUkFOU19TVEFUVVNfQlJFQUtfQ1NfQ0hBTkdFOworCQlpZiAocmV0KQorCQkJZ290byBkb25lOworCisJCWRldl9kYmcoJnFzcGktPnBkZXYtPmRldiwgImFkdmFuY2UgbXNnIGV4aXRcbiIpOworCQlpZiAoc3BpX3RyYW5zZmVyX2lzX2xhc3QocXNwaS0+bWFzdGVyLCBxdC0+dHJhbnMpKQorCQkJcmV0ID0gVFJBTlNfU1RBVFVTX0JSRUFLX0VPTTsKKwkJZWxzZQorCQkJcmV0ID0gVFJBTlNfU1RBVFVTX0JSRUFLX05PX0JZVEVTOworCisJCXF0LT50cmFucyA9IE5VTEw7CisJfQorCitkb25lOgorCWRldl9kYmcoJnFzcGktPnBkZXYtPmRldiwgInRyYW5zICVwIGxlbiAlZCBieXRlICVkIHJldCAleFxuIiwKKwkJcXQtPnRyYW5zLCBxdC0+dHJhbnMgPyBxdC0+dHJhbnMtPmxlbiA6IDAsIHF0LT5ieXRlLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggcmVhZF9yeHJhbV9zbG90X3U4KHN0cnVjdCBiY21fcXNwaSAqcXNwaSwgaW50IHNsb3QpCit7CisJdTMyIHNsb3Rfb2Zmc2V0ID0gTVNQSV9SWFJBTSArIChzbG90IDw8IDMpICsgMHg0OworCisJLyogbWFzayBvdXQgcmVzZXJ2ZWQgYml0cyAqLworCXJldHVybiBiY21fcXNwaV9yZWFkKHFzcGksIE1TUEksIHNsb3Rfb2Zmc2V0KSAmIDB4ZmY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IHJlYWRfcnhyYW1fc2xvdF91MTYoc3RydWN0IGJjbV9xc3BpICpxc3BpLCBpbnQgc2xvdCkKK3sKKwl1MzIgcmVnX29mZnNldCA9IE1TUElfUlhSQU07CisJdTMyIGxzYl9vZmZzZXQgPSByZWdfb2Zmc2V0ICsgKHNsb3QgPDwgMykgKyAweDQ7CisJdTMyIG1zYl9vZmZzZXQgPSByZWdfb2Zmc2V0ICsgKHNsb3QgPDwgMyk7CisKKwlyZXR1cm4gKGJjbV9xc3BpX3JlYWQocXNwaSwgTVNQSSwgbHNiX29mZnNldCkgJiAweGZmKSB8CisJCSgoYmNtX3FzcGlfcmVhZChxc3BpLCBNU1BJLCBtc2Jfb2Zmc2V0KSAmIDB4ZmYpIDw8IDgpOworfQorCitzdGF0aWMgdm9pZCByZWFkX2Zyb21faHcoc3RydWN0IGJjbV9xc3BpICpxc3BpLCBpbnQgc2xvdHMpCit7CisJc3RydWN0IHFzcGlfdHJhbnMgdHA7CisJaW50IHNsb3Q7CisKKwliY21fcXNwaV9kaXNhYmxlX2JzcGkocXNwaSk7CisKKwlpZiAoc2xvdHMgPiBNU1BJX05VTV9DRFJBTSkgeworCQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCWRldl9lcnIoJnFzcGktPnBkZXYtPmRldiwgIiVzOiB0b28gbWFueSBzbG90cyFcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXRwID0gcXNwaS0+dHJhbnNfcG9zOworCisJZm9yIChzbG90ID0gMDsgc2xvdCA8IHNsb3RzOyBzbG90KyspIHsKKwkJaWYgKHRwLnRyYW5zLT5iaXRzX3Blcl93b3JkIDw9IDgpIHsKKwkJCXU4ICpidWYgPSB0cC50cmFucy0+cnhfYnVmOworCisJCQlpZiAoYnVmKQorCQkJCWJ1Zlt0cC5ieXRlXSA9IHJlYWRfcnhyYW1fc2xvdF91OChxc3BpLCBzbG90KTsKKwkJCWRldl9kYmcoJnFzcGktPnBkZXYtPmRldiwgIlJEICUwMnhcbiIsCisJCQkJYnVmID8gYnVmW3RwLmJ5dGVdIDogMHhmZik7CisJCX0gZWxzZSB7CisJCQl1MTYgKmJ1ZiA9IHRwLnRyYW5zLT5yeF9idWY7CisKKwkJCWlmIChidWYpCisJCQkJYnVmW3RwLmJ5dGUgLyAyXSA9IHJlYWRfcnhyYW1fc2xvdF91MTYocXNwaSwKKwkJCQkJCQkJICAgICAgc2xvdCk7CisJCQlkZXZfZGJnKCZxc3BpLT5wZGV2LT5kZXYsICJSRCAlMDR4XG4iLAorCQkJCWJ1ZiA/IGJ1Zlt0cC5ieXRlXSA6IDB4ZmZmZik7CisJCX0KKworCQl1cGRhdGVfcXNwaV90cmFuc19ieXRlX2NvdW50KHFzcGksICZ0cCwKKwkJCQkJICAgICBUUkFOU19TVEFUVVNfQlJFQUtfTk9ORSk7CisJfQorCisJcXNwaS0+dHJhbnNfcG9zID0gdHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV90eHJhbV9zbG90X3U4KHN0cnVjdCBiY21fcXNwaSAqcXNwaSwgaW50IHNsb3QsCisJCQkJICAgICAgIHU4IHZhbCkKK3sKKwl1MzIgcmVnX29mZnNldCA9IE1TUElfVFhSQU0gKyAoc2xvdCA8PCAzKTsKKworCS8qIG1hc2sgb3V0IHJlc2VydmVkIGJpdHMgKi8KKwliY21fcXNwaV93cml0ZShxc3BpLCBNU1BJLCByZWdfb2Zmc2V0LCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfdHhyYW1fc2xvdF91MTYoc3RydWN0IGJjbV9xc3BpICpxc3BpLCBpbnQgc2xvdCwKKwkJCQkJdTE2IHZhbCkKK3sKKwl1MzIgcmVnX29mZnNldCA9IE1TUElfVFhSQU07CisJdTMyIG1zYl9vZmZzZXQgPSByZWdfb2Zmc2V0ICsgKHNsb3QgPDwgMyk7CisJdTMyIGxzYl9vZmZzZXQgPSByZWdfb2Zmc2V0ICsgKHNsb3QgPDwgMykgKyAweDQ7CisKKwliY21fcXNwaV93cml0ZShxc3BpLCBNU1BJLCBtc2Jfb2Zmc2V0LCAodmFsID4+IDgpKTsKKwliY21fcXNwaV93cml0ZShxc3BpLCBNU1BJLCBsc2Jfb2Zmc2V0LCAodmFsICYgMHhmZikpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiByZWFkX2NkcmFtX3Nsb3Qoc3RydWN0IGJjbV9xc3BpICpxc3BpLCBpbnQgc2xvdCkKK3sKKwlyZXR1cm4gYmNtX3FzcGlfcmVhZChxc3BpLCBNU1BJLCBNU1BJX0NEUkFNICsgKHNsb3QgPDwgMikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfY2RyYW1fc2xvdChzdHJ1Y3QgYmNtX3FzcGkgKnFzcGksIGludCBzbG90LCB1MzIgdmFsKQoreworCWJjbV9xc3BpX3dyaXRlKHFzcGksIE1TUEksIChNU1BJX0NEUkFNICsgKHNsb3QgPDwgMikpLCB2YWwpOworfQorCisvKiBSZXR1cm4gbnVtYmVyIG9mIHNsb3RzIHdyaXR0ZW4gKi8KK3N0YXRpYyBpbnQgd3JpdGVfdG9faHcoc3RydWN0IGJjbV9xc3BpICpxc3BpLCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBxc3BpX3RyYW5zIHRwOworCWludCBzbG90ID0gMCwgdHN0YXR1cyA9IDA7CisJdTMyIG1zcGlfY2RyYW0gPSAwOworCisJYmNtX3FzcGlfZGlzYWJsZV9ic3BpKHFzcGkpOworCXRwID0gcXNwaS0+dHJhbnNfcG9zOworCWJjbV9xc3BpX3VwZGF0ZV9wYXJtcyhxc3BpLCBzcGksIHRwLnRyYW5zKTsKKworCS8qIFJ1biB1bnRpbCBlbmQgb2YgdHJhbnNmZXIgb3IgcmVhY2hlZCB0aGUgbWF4IGRhdGEgKi8KKwl3aGlsZSAoIXRzdGF0dXMgJiYgc2xvdCA8IE1TUElfTlVNX0NEUkFNKSB7CisJCWlmICh0cC50cmFucy0+Yml0c19wZXJfd29yZCA8PSA4KSB7CisJCQljb25zdCB1OCAqYnVmID0gdHAudHJhbnMtPnR4X2J1ZjsKKwkJCXU4IHZhbCA9IGJ1ZiA/IGJ1Zlt0cC5ieXRlXSA6IDB4ZmY7CisKKwkJCXdyaXRlX3R4cmFtX3Nsb3RfdTgocXNwaSwgc2xvdCwgdmFsKTsKKwkJCWRldl9kYmcoJnFzcGktPnBkZXYtPmRldiwgIldSICUwMnhcbiIsIHZhbCk7CisJCX0gZWxzZSB7CisJCQljb25zdCB1MTYgKmJ1ZiA9IHRwLnRyYW5zLT50eF9idWY7CisJCQl1MTYgdmFsID0gYnVmID8gYnVmW3RwLmJ5dGUgLyAyXSA6IDB4ZmZmZjsKKworCQkJd3JpdGVfdHhyYW1fc2xvdF91MTYocXNwaSwgc2xvdCwgdmFsKTsKKwkJCWRldl9kYmcoJnFzcGktPnBkZXYtPmRldiwgIldSICUwNHhcbiIsIHZhbCk7CisJCX0KKwkJbXNwaV9jZHJhbSA9IE1TUElfQ0RSQU1fQ09OVF9CSVQ7CisJCW1zcGlfY2RyYW0gfD0gKH4oMSA8PCBzcGktPmNoaXBfc2VsZWN0KSAmCisJCQkgICAgICAgTVNQSV9DRFJBTV9QQ1MpOworCQltc3BpX2NkcmFtIHw9ICgodHAudHJhbnMtPmJpdHNfcGVyX3dvcmQgPD0gOCkgPyAwIDoKKwkJCQlNU1BJX0NEUkFNX0JJVFNFX0JJVCk7CisKKwkJd3JpdGVfY2RyYW1fc2xvdChxc3BpLCBzbG90LCBtc3BpX2NkcmFtKTsKKworCQl0c3RhdHVzID0gdXBkYXRlX3FzcGlfdHJhbnNfYnl0ZV9jb3VudChxc3BpLCAmdHAsCisJCQkJCQkgICAgICAgVFJBTlNfU1RBVFVTX0JSRUFLX1RYKTsKKwkJc2xvdCsrOworCX0KKworCWlmICghc2xvdCkgeworCQlkZXZfZXJyKCZxc3BpLT5wZGV2LT5kZXYsICIlczogbm8gZGF0YSB0byBzZW5kPyIsIF9fZnVuY19fKTsKKwkJZ290byBkb25lOworCX0KKworCWRldl9kYmcoJnFzcGktPnBkZXYtPmRldiwgInN1Ym1pdHRpbmcgJWQgc2xvdHNcbiIsIHNsb3QpOworCWJjbV9xc3BpX3dyaXRlKHFzcGksIE1TUEksIE1TUElfTkVXUVAsIDApOworCWJjbV9xc3BpX3dyaXRlKHFzcGksIE1TUEksIE1TUElfRU5EUVAsIHNsb3QgLSAxKTsKKworCWlmICh0c3RhdHVzICYgVFJBTlNfU1RBVFVTX0JSRUFLX0RFU0VMRUNUKSB7CisJCW1zcGlfY2RyYW0gPSByZWFkX2NkcmFtX3Nsb3QocXNwaSwgc2xvdCAtIDEpICYKKwkJCX5NU1BJX0NEUkFNX0NPTlRfQklUOworCQl3cml0ZV9jZHJhbV9zbG90KHFzcGksIHNsb3QgLSAxLCBtc3BpX2NkcmFtKTsKKwl9CisKKwlpZiAoaGFzX2JzcGkocXNwaSkpCisJCWJjbV9xc3BpX3dyaXRlKHFzcGksIE1TUEksIE1TUElfV1JJVEVfTE9DSywgMSk7CisKKwkvKiBNdXN0IGZsdXNoIHByZXZpb3VzIHdyaXRlcyBiZWZvcmUgc3RhcnRpbmcgTVNQSSBvcGVyYXRpb24gKi8KKwltYigpOworCS8qIFNldCBjb250IHwgc3BlIHwgc3BpZmllICovCisJYmNtX3FzcGlfd3JpdGUocXNwaSwgTVNQSSwgTVNQSV9TUENSMiwgMHhlMCk7CisKK2RvbmU6CisJcmV0dXJuIHNsb3Q7Cit9CisKK3N0YXRpYyBpbnQgYmNtX3FzcGlfYnNwaV9mbGFzaF9yZWFkKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJICAgIHN0cnVjdCBzcGlfZmxhc2hfcmVhZF9tZXNzYWdlICptc2cpCit7CisJc3RydWN0IGJjbV9xc3BpICpxc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJdTMyIGFkZHIgPSAwLCBsZW4sIGxlbl93b3JkczsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIHRpbWVvID0gbXNlY3NfdG9famlmZmllcygxMDApOworCXN0cnVjdCBiY21fcXNwaV9zb2NfaW50YyAqc29jX2ludGMgPSBxc3BpLT5zb2NfaW50YzsKKworCWlmIChiY21fcXNwaV9ic3BpX3Zlcl90aHJlZShxc3BpKSkKKwkJaWYgKG1zZy0+YWRkcl93aWR0aCA9PSBCU1BJX0FERFJMRU5fNEJZVEVTKQorCQkJcmV0dXJuIC1FSU87CisKKwliY21fcXNwaV9jaGlwX3NlbGVjdChxc3BpLCBzcGktPmNoaXBfc2VsZWN0KTsKKwliY21fcXNwaV93cml0ZShxc3BpLCBNU1BJLCBNU1BJX1dSSVRFX0xPQ0ssIDApOworCisJLyoKKwkgKiB3aGVuIHVzaW5nIGZsZXggbW9kZSBtb2RlIHdlIG5lZWQgdG8gc2VuZAorCSAqIHRoZSB1cHBlciBhZGRyZXNzIGJ5dGUgdG8gYnNwaQorCSAqLworCWlmIChiY21fcXNwaV9ic3BpX3Zlcl90aHJlZShxc3BpKSA9PSBmYWxzZSkgeworCQlhZGRyID0gbXNnLT5mcm9tICYgMHhmZjAwMDAwMDsKKwkJYmNtX3FzcGlfd3JpdGUocXNwaSwgQlNQSSwKKwkJCSAgICAgICBCU1BJX0JTUElfRkxBU0hfVVBQRVJfQUREUl9CWVRFLCBhZGRyKTsKKwl9CisKKwlpZiAoIXFzcGktPnhmZXJfbW9kZS5mbGV4X21vZGUpCisJCWFkZHIgPSBtc2ctPmZyb207CisJZWxzZQorCQlhZGRyID0gbXNnLT5mcm9tICYgMHgwMGZmZmZmZjsKKworCS8qIHNldCBCU1BJIFJBRiBidWZmZXIgbWF4IHJlYWQgbGVuZ3RoICovCisJbGVuID0gbXNnLT5sZW47CisJaWYgKGxlbiA+IEJTUElfUkVBRF9MRU5HVEgpCisJCWxlbiA9IEJTUElfUkVBRF9MRU5HVEg7CisKKwlpZiAoYmNtX3FzcGlfYnNwaV92ZXJfdGhyZWUocXNwaSkgPT0gdHJ1ZSkKKwkJYWRkciA9IChhZGRyICsgMHhjMDAwMDApICYgMHhmZmZmZmY7CisKKwlyZWluaXRfY29tcGxldGlvbigmcXNwaS0+YnNwaV9kb25lKTsKKwliY21fcXNwaV9lbmFibGVfYnNwaShxc3BpKTsKKwlsZW5fd29yZHMgPSAobGVuICsgMykgPj4gMjsKKwlxc3BpLT5ic3BpX3JmX21zZyA9IG1zZzsKKwlxc3BpLT5ic3BpX3JmX21zZ19zdGF0dXMgPSAwOworCXFzcGktPmJzcGlfcmZfbXNnX2lkeCA9IDA7CisJcXNwaS0+YnNwaV9yZl9tc2dfbGVuID0gbGVuOworCWRldl9kYmcoJnFzcGktPnBkZXYtPmRldiwgImJzcGkgeGZyIGFkZHIgMHgleCBsZW4gMHgleCIsIGFkZHIsIGxlbik7CisKKwliY21fcXNwaV93cml0ZShxc3BpLCBCU1BJLCBCU1BJX1JBRl9TVEFSVF9BRERSLCBhZGRyKTsKKwliY21fcXNwaV93cml0ZShxc3BpLCBCU1BJLCBCU1BJX1JBRl9OVU1fV09SRFMsIGxlbl93b3Jkcyk7CisJYmNtX3FzcGlfd3JpdGUocXNwaSwgQlNQSSwgQlNQSV9SQUZfV0FURVJNQVJLLCAwKTsKKworCWlmIChxc3BpLT5zb2NfaW50YykgeworCQkvKgorCQkgKiBjbGVhciBzb2MgTVNQSSBhbmQgQlNQSSBpbnRlcnJ1cHRzIGFuZCBlbmFibGUKKwkJICogQlNQSSBpbnRlcnJ1cHRzLgorCQkgKi8KKwkJc29jX2ludGMtPmJjbV9xc3BpX2ludF9hY2soc29jX2ludGMsIE1TUElfQlNQSV9ET05FKTsKKwkJc29jX2ludGMtPmJjbV9xc3BpX2ludF9zZXQoc29jX2ludGMsIEJTUElfRE9ORSwgdHJ1ZSk7CisJfQorCisJLyogTXVzdCBmbHVzaCBwcmV2aW91cyB3cml0ZXMgYmVmb3JlIHN0YXJ0aW5nIEJTUEkgb3BlcmF0aW9uICovCisJbWIoKTsKKworCWJjbV9xc3BpX2JzcGlfbHJfc3RhcnQocXNwaSk7CisJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnFzcGktPmJzcGlfZG9uZSwgdGltZW8pKSB7CisJCWRldl9lcnIoJnFzcGktPnBkZXYtPmRldiwgInRpbWVvdXQgd2FpdGluZyBmb3IgQlNQSVxuIik7CisJCXJldCA9IC1FVElNRURPVVQ7CisJfSBlbHNlIHsKKwkJLyogc2V0IHRoZSByZXR1cm4gbGVuZ3RoIGZvciB0aGUgY2FsbGVyICovCisJCW1zZy0+cmV0bGVuID0gbGVuOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYmNtX3FzcGlfZmxhc2hfcmVhZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJICAgICAgIHN0cnVjdCBzcGlfZmxhc2hfcmVhZF9tZXNzYWdlICptc2cpCit7CisJc3RydWN0IGJjbV9xc3BpICpxc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJaW50IHJldCA9IDA7CisJYm9vbCBtc3BpX3JlYWQgPSBmYWxzZTsKKwl1MzIgaW9fd2lkdGgsIGFkZHJsZW4sIGFkZHIsIGxlbjsKKwl1X2NoYXIgKmJ1ZjsKKworCWJ1ZiA9IG1zZy0+YnVmOworCWFkZHIgPSBtc2ctPmZyb207CisJbGVuID0gbXNnLT5sZW47CisKKwlpZiAoYmNtX3FzcGlfYnNwaV92ZXJfdGhyZWUocXNwaSkgPT0gdHJ1ZSkgeworCQkvKgorCQkgKiBUaGUgYWRkcmVzcyBjb21pbmcgaW50byB0aGlzIGZ1bmN0aW9uIGlzIGEgcmF3IGZsYXNoIG9mZnNldC4KKwkJICogQnV0IGZvciBCU1BJIDw9IFYzLCB3ZSBuZWVkIHRvIGNvbnZlcnQgaXQgdG8gYSByZW1hcHBlZCBCU1BJCisJCSAqIGFkZHJlc3MuIElmIGl0IGNyb3NzZXMgYSA0TUIgYm91bmRhcnksIGp1c3QgcmV2ZXJ0IGJhY2sgdG8KKwkJICogdXNpbmcgTVNQSS4KKwkJICovCisJCWFkZHIgPSAoYWRkciArIDB4YzAwMDAwKSAmIDB4ZmZmZmZmOworCisJCWlmICgofkFERFJfNE1CX01BU0sgJiBhZGRyKSBeCisJCSAgICAofkFERFJfNE1CX01BU0sgJiAoYWRkciArIGxlbiAtIDEpKSkKKwkJCW1zcGlfcmVhZCA9IHRydWU7CisJfQorCisJLyogbm9uLWFsaWduZWQgYW5kIHZlcnkgc2hvcnQgdHJhbnNmZXJzIGFyZSBoYW5kbGVkIGJ5IE1TUEkgKi8KKwlpZiAoIUlTX0FMSUdORUQoKHVpbnRwdHJfdClhZGRyLCA0KSB8fCAhSVNfQUxJR05FRCgodWludHB0cl90KWJ1ZiwgNCkgfHwKKwkgICAgbGVuIDwgNCkKKwkJbXNwaV9yZWFkID0gdHJ1ZTsKKworCWlmIChtc3BpX3JlYWQpCisJCS8qIHRoaXMgd2lsbCBtYWtlIHRoZSBtMjVwODAgcmVhZCB0byBmYWxsYmFjayB0byBtc3BpIHJlYWQgKi8KKwkJcmV0dXJuIC1FQUdBSU47CisKKwlpb193aWR0aCA9IG1zZy0+ZGF0YV9uYml0cyA/IG1zZy0+ZGF0YV9uYml0cyA6IFNQSV9OQklUU19TSU5HTEU7CisJYWRkcmxlbiA9IG1zZy0+YWRkcl93aWR0aDsKKwlyZXQgPSBiY21fcXNwaV9ic3BpX3NldF9tb2RlKHFzcGksIGlvX3dpZHRoLCBhZGRybGVuLCAtMSk7CisKKwlpZiAoIXJldCkKKwkJcmV0ID0gYmNtX3FzcGlfYnNwaV9mbGFzaF9yZWFkKHNwaSwgbXNnKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYmNtX3FzcGlfdHJhbnNmZXJfb25lKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCisJCQkJIHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnRyYW5zKQoreworCXN0cnVjdCBiY21fcXNwaSAqcXNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlpbnQgc2xvdHM7CisJdW5zaWduZWQgbG9uZyB0aW1lbyA9IG1zZWNzX3RvX2ppZmZpZXMoMTAwKTsKKworCWJjbV9xc3BpX2NoaXBfc2VsZWN0KHFzcGksIHNwaS0+Y2hpcF9zZWxlY3QpOworCXFzcGktPnRyYW5zX3Bvcy50cmFucyA9IHRyYW5zOworCXFzcGktPnRyYW5zX3Bvcy5ieXRlID0gMDsKKworCXdoaWxlIChxc3BpLT50cmFuc19wb3MuYnl0ZSA8IHRyYW5zLT5sZW4pIHsKKwkJcmVpbml0X2NvbXBsZXRpb24oJnFzcGktPm1zcGlfZG9uZSk7CisKKwkJc2xvdHMgPSB3cml0ZV90b19odyhxc3BpLCBzcGkpOworCQlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcXNwaS0+bXNwaV9kb25lLCB0aW1lbykpIHsKKwkJCWRldl9lcnIoJnFzcGktPnBkZXYtPmRldiwgInRpbWVvdXQgd2FpdGluZyBmb3IgTVNQSVxuIik7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCisJCXJlYWRfZnJvbV9odyhxc3BpLCBzbG90cyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJjbV9xc3BpX2NsZWFudXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYmNtX3FzcGlfcGFybXMgKnhwID0gc3BpX2dldF9jdGxkYXRhKHNwaSk7CisKKwlrZnJlZSh4cCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBiY21fcXNwaV9tc3BpX2wyX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGJjbV9xc3BpX2Rldl9pZCAqcXNwaV9kZXZfaWQgPSBkZXZfaWQ7CisJc3RydWN0IGJjbV9xc3BpICpxc3BpID0gcXNwaV9kZXZfaWQtPmRldjsKKwl1MzIgc3RhdHVzID0gYmNtX3FzcGlfcmVhZChxc3BpLCBNU1BJLCBNU1BJX01TUElfU1RBVFVTKTsKKworCWlmIChzdGF0dXMgJiBNU1BJX01TUElfU1RBVFVTX1NQSUYpIHsKKwkJc3RydWN0IGJjbV9xc3BpX3NvY19pbnRjICpzb2NfaW50YyA9IHFzcGktPnNvY19pbnRjOworCQkvKiBjbGVhciBpbnRlcnJ1cHQgKi8KKwkJc3RhdHVzICY9IH5NU1BJX01TUElfU1RBVFVTX1NQSUY7CisJCWJjbV9xc3BpX3dyaXRlKHFzcGksIE1TUEksIE1TUElfTVNQSV9TVEFUVVMsIHN0YXR1cyk7CisJCWlmIChxc3BpLT5zb2NfaW50YykKKwkJCXNvY19pbnRjLT5iY21fcXNwaV9pbnRfYWNrKHNvY19pbnRjLCBNU1BJX0RPTkUpOworCQljb21wbGV0ZSgmcXNwaS0+bXNwaV9kb25lKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCXJldHVybiBJUlFfTk9ORTsKK30KKworc3RhdGljIGlycXJldHVybl90IGJjbV9xc3BpX2JzcGlfbHJfbDJfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgYmNtX3FzcGlfZGV2X2lkICpxc3BpX2Rldl9pZCA9IGRldl9pZDsKKwlzdHJ1Y3QgYmNtX3FzcGkgKnFzcGkgPSBxc3BpX2Rldl9pZC0+ZGV2OworCXN0cnVjdCBiY21fcXNwaV9zb2NfaW50YyAqc29jX2ludGMgPSBxc3BpLT5zb2NfaW50YzsKKwl1MzIgc3RhdHVzID0gcXNwaV9kZXZfaWQtPmlycXAtPm1hc2s7CisKKwlpZiAocXNwaS0+YnNwaV9lbmFibGVkICYmIHFzcGktPmJzcGlfcmZfbXNnKSB7CisJCWJjbV9xc3BpX2JzcGlfbHJfZGF0YV9yZWFkKHFzcGkpOworCQlpZiAocXNwaS0+YnNwaV9yZl9tc2dfbGVuID09IDApIHsKKwkJCXFzcGktPmJzcGlfcmZfbXNnID0gTlVMTDsKKwkJCWlmIChxc3BpLT5zb2NfaW50YykgeworCQkJCS8qIGRpc2FibGUgc29jIEJTUEkgaW50ZXJydXB0ICovCisJCQkJc29jX2ludGMtPmJjbV9xc3BpX2ludF9zZXQoc29jX2ludGMsIEJTUElfRE9ORSwKKwkJCQkJCQkgICBmYWxzZSk7CisJCQkJLyogaW5kaWNhdGUgZG9uZSAqLworCQkJCXN0YXR1cyA9IElOVFJfQlNQSV9MUl9TRVNTSU9OX0RPTkVfTUFTSzsKKwkJCX0KKworCQkJaWYgKHFzcGktPmJzcGlfcmZfbXNnX3N0YXR1cykKKwkJCQliY21fcXNwaV9ic3BpX2xyX2NsZWFyKHFzcGkpOworCQkJZWxzZQorCQkJCWJjbV9xc3BpX2JzcGlfZmx1c2hfcHJlZmV0Y2hfYnVmZmVycyhxc3BpKTsKKwkJfQorCisJCWlmIChxc3BpLT5zb2NfaW50YykKKwkJCS8qIGNsZWFyIHNvYyBCU1BJIGludGVycnVwdCAqLworCQkJc29jX2ludGMtPmJjbV9xc3BpX2ludF9hY2soc29jX2ludGMsIEJTUElfRE9ORSk7CisJfQorCisJc3RhdHVzICY9IElOVFJfQlNQSV9MUl9TRVNTSU9OX0RPTkVfTUFTSzsKKwlpZiAocXNwaS0+YnNwaV9lbmFibGVkICYmIHN0YXR1cyAmJiBxc3BpLT5ic3BpX3JmX21zZ19sZW4gPT0gMCkKKwkJY29tcGxldGUoJnFzcGktPmJzcGlfZG9uZSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBiY21fcXNwaV9ic3BpX2xyX2Vycl9sMl9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBiY21fcXNwaV9kZXZfaWQgKnFzcGlfZGV2X2lkID0gZGV2X2lkOworCXN0cnVjdCBiY21fcXNwaSAqcXNwaSA9IHFzcGlfZGV2X2lkLT5kZXY7CisJc3RydWN0IGJjbV9xc3BpX3NvY19pbnRjICpzb2NfaW50YyA9IHFzcGktPnNvY19pbnRjOworCisJZGV2X2VycigmcXNwaS0+cGRldi0+ZGV2LCAiQlNQSSBJTlQgZXJyb3JcbiIpOworCXFzcGktPmJzcGlfcmZfbXNnX3N0YXR1cyA9IC1FSU87CisJaWYgKHFzcGktPnNvY19pbnRjKQorCQkvKiBjbGVhciBzb2MgaW50ZXJydXB0ICovCisJCXNvY19pbnRjLT5iY21fcXNwaV9pbnRfYWNrKHNvY19pbnRjLCBCU1BJX0VSUik7CisKKwljb21wbGV0ZSgmcXNwaS0+YnNwaV9kb25lKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBiY21fcXNwaV9sMV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBiY21fcXNwaV9kZXZfaWQgKnFzcGlfZGV2X2lkID0gZGV2X2lkOworCXN0cnVjdCBiY21fcXNwaSAqcXNwaSA9IHFzcGlfZGV2X2lkLT5kZXY7CisJc3RydWN0IGJjbV9xc3BpX3NvY19pbnRjICpzb2NfaW50YyA9IHFzcGktPnNvY19pbnRjOworCWlycXJldHVybl90IHJldCA9IElSUV9OT05FOworCisJaWYgKHNvY19pbnRjKSB7CisJCXUzMiBzdGF0dXMgPSBzb2NfaW50Yy0+YmNtX3FzcGlfZ2V0X2ludF9zdGF0dXMoc29jX2ludGMpOworCisJCWlmIChzdGF0dXMgJiBNU1BJX0RPTkUpCisJCQlyZXQgPSBiY21fcXNwaV9tc3BpX2wyX2lzcihpcnEsIGRldl9pZCk7CisJCWVsc2UgaWYgKHN0YXR1cyAmIEJTUElfRE9ORSkKKwkJCXJldCA9IGJjbV9xc3BpX2JzcGlfbHJfbDJfaXNyKGlycSwgZGV2X2lkKTsKKwkJZWxzZSBpZiAoc3RhdHVzICYgQlNQSV9FUlIpCisJCQlyZXQgPSBiY21fcXNwaV9ic3BpX2xyX2Vycl9sMl9pc3IoaXJxLCBkZXZfaWQpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYmNtX3FzcGlfaXJxIHFzcGlfaXJxX3RhYltdID0geworCXsKKwkJLmlycV9uYW1lID0gInNwaV9scl9mdWxsbmVzc19yZWFjaGVkIiwKKwkJLmlycV9oYW5kbGVyID0gYmNtX3FzcGlfYnNwaV9scl9sMl9pc3IsCisJCS5tYXNrID0gSU5UUl9CU1BJX0xSX0ZVTExORVNTX1JFQUNIRURfTUFTSywKKwl9LAorCXsKKwkJLmlycV9uYW1lID0gInNwaV9scl9zZXNzaW9uX2Fib3J0ZWQiLAorCQkuaXJxX2hhbmRsZXIgPSBiY21fcXNwaV9ic3BpX2xyX2Vycl9sMl9pc3IsCisJCS5tYXNrID0gSU5UUl9CU1BJX0xSX1NFU1NJT05fQUJPUlRFRF9NQVNLLAorCX0sCisJeworCQkuaXJxX25hbWUgPSAic3BpX2xyX2ltcGF0aWVudCIsCisJCS5pcnFfaGFuZGxlciA9IGJjbV9xc3BpX2JzcGlfbHJfZXJyX2wyX2lzciwKKwkJLm1hc2sgPSBJTlRSX0JTUElfTFJfSU1QQVRJRU5UX01BU0ssCisJfSwKKwl7CisJCS5pcnFfbmFtZSA9ICJzcGlfbHJfc2Vzc2lvbl9kb25lIiwKKwkJLmlycV9oYW5kbGVyID0gYmNtX3FzcGlfYnNwaV9scl9sMl9pc3IsCisJCS5tYXNrID0gSU5UUl9CU1BJX0xSX1NFU1NJT05fRE9ORV9NQVNLLAorCX0sCisjaWZkZWYgUVNQSV9JTlRfREVCVUcKKwkvKiB0aGlzIGludGVycnVwdCBpcyBmb3IgZGVidWcgcHVycG9zZXMgb25seSwgZG9udCByZXF1ZXN0IGlycSAqLworCXsKKwkJLmlycV9uYW1lID0gInNwaV9scl9vdmVycmVhZCIsCisJCS5pcnFfaGFuZGxlciA9IGJjbV9xc3BpX2JzcGlfbHJfZXJyX2wyX2lzciwKKwkJLm1hc2sgPSBJTlRSX0JTUElfTFJfT1ZFUlJFQURfTUFTSywKKwl9LAorI2VuZGlmCisJeworCQkuaXJxX25hbWUgPSAibXNwaV9kb25lIiwKKwkJLmlycV9oYW5kbGVyID0gYmNtX3FzcGlfbXNwaV9sMl9pc3IsCisJCS5tYXNrID0gSU5UUl9NU1BJX0RPTkVfTUFTSywKKwl9LAorCXsKKwkJLmlycV9uYW1lID0gIm1zcGlfaGFsdGVkIiwKKwkJLmlycV9oYW5kbGVyID0gYmNtX3FzcGlfbXNwaV9sMl9pc3IsCisJCS5tYXNrID0gSU5UUl9NU1BJX0hBTFRFRF9NQVNLLAorCX0sCisJeworCQkvKiBzaW5nbGUgbXV4ZWQgTDEgaW50ZXJydXB0IHNvdXJjZSAqLworCQkuaXJxX25hbWUgPSAic3BpX2wxX2ludHIiLAorCQkuaXJxX2hhbmRsZXIgPSBiY21fcXNwaV9sMV9pc3IsCisJCS5pcnFfc291cmNlID0gTVVYRURfTDEsCisJCS5tYXNrID0gUVNQSV9JTlRFUlJVUFRTX0FMTCwKKwl9LAorfTsKKworc3RhdGljIHZvaWQgYmNtX3FzcGlfYnNwaV9pbml0KHN0cnVjdCBiY21fcXNwaSAqcXNwaSkKK3sKKwl1MzIgdmFsID0gMDsKKworCXZhbCA9IGJjbV9xc3BpX3JlYWQocXNwaSwgQlNQSSwgQlNQSV9SRVZJU0lPTl9JRCk7CisJcXNwaS0+YnNwaV9tYWpfcmV2ID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJcXNwaS0+YnNwaV9taW5fcmV2ID0gdmFsICYgMHhmZjsKKwlpZiAoIShiY21fcXNwaV9ic3BpX3Zlcl90aHJlZShxc3BpKSkpIHsKKwkJLyogRm9yY2UgbWFwcGluZyBvZiBCU1BJIGFkZHJlc3MgLT4gZmxhc2ggb2Zmc2V0ICovCisJCWJjbV9xc3BpX3dyaXRlKHFzcGksIEJTUEksIEJTUElfQlNQSV9YT1JfVkFMVUUsIDApOworCQliY21fcXNwaV93cml0ZShxc3BpLCBCU1BJLCBCU1BJX0JTUElfWE9SX0VOQUJMRSwgMSk7CisJfQorCXFzcGktPmJzcGlfZW5hYmxlZCA9IDE7CisJYmNtX3FzcGlfZGlzYWJsZV9ic3BpKHFzcGkpOworCWJjbV9xc3BpX3dyaXRlKHFzcGksIEJTUEksIEJTUElfQjBfQ1RSTCwgMCk7CisJYmNtX3FzcGlfd3JpdGUocXNwaSwgQlNQSSwgQlNQSV9CMV9DVFJMLCAwKTsKK30KKworc3RhdGljIHZvaWQgYmNtX3FzcGlfaHdfaW5pdChzdHJ1Y3QgYmNtX3FzcGkgKnFzcGkpCit7CisJc3RydWN0IGJjbV9xc3BpX3Bhcm1zIHBhcm1zOworCisJYmNtX3FzcGlfd3JpdGUocXNwaSwgTVNQSSwgTVNQSV9TUENSMV9MU0IsIDApOworCWJjbV9xc3BpX3dyaXRlKHFzcGksIE1TUEksIE1TUElfU1BDUjFfTVNCLCAwKTsKKwliY21fcXNwaV93cml0ZShxc3BpLCBNU1BJLCBNU1BJX05FV1FQLCAwKTsKKwliY21fcXNwaV93cml0ZShxc3BpLCBNU1BJLCBNU1BJX0VORFFQLCAwKTsKKwliY21fcXNwaV93cml0ZShxc3BpLCBNU1BJLCBNU1BJX1NQQ1IyLCAweDIwKTsKKworCXBhcm1zLm1vZGUgPSBTUElfTU9ERV8zOworCXBhcm1zLmJpdHNfcGVyX3dvcmQgPSA4OworCXBhcm1zLnNwZWVkX2h6ID0gcXNwaS0+bWF4X3NwZWVkX2h6OworCWJjbV9xc3BpX2h3X3NldF9wYXJtcyhxc3BpLCAmcGFybXMpOworCisJaWYgKGhhc19ic3BpKHFzcGkpKQorCQliY21fcXNwaV9ic3BpX2luaXQocXNwaSk7Cit9CisKK3N0YXRpYyB2b2lkIGJjbV9xc3BpX2h3X3VuaW5pdChzdHJ1Y3QgYmNtX3FzcGkgKnFzcGkpCit7CisJYmNtX3FzcGlfd3JpdGUocXNwaSwgTVNQSSwgTVNQSV9TUENSMiwgMCk7CisJaWYgKGhhc19ic3BpKHFzcGkpKQorCQliY21fcXNwaV93cml0ZShxc3BpLCBNU1BJLCBNU1BJX1dSSVRFX0xPQ0ssIDApOworCit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJjbV9xc3BpX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJicmNtLHNwaS1iY20tcXNwaSIgfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBiY21fcXNwaV9vZl9tYXRjaCk7CisKK2ludCBiY21fcXNwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkgICBzdHJ1Y3QgYmNtX3FzcGlfc29jX2ludGMgKnNvY19pbnRjKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGJjbV9xc3BpICpxc3BpOworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGlycSwgcmV0ID0gMCwgbnVtX2ludHMgPSAwOworCXUzMiB2YWw7CisJY29uc3QgY2hhciAqbmFtZSA9IE5VTEw7CisJaW50IG51bV9pcnFzID0gQVJSQVlfU0laRShxc3BpX2lycV90YWIpOworCisJLyogV2Ugb25seSBzdXBwb3J0IGRldmljZS10cmVlIGluc3RhbnRpYXRpb24gKi8KKwlpZiAoIWRldi0+b2Zfbm9kZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIW9mX21hdGNoX25vZGUoYmNtX3FzcGlfb2ZfbWF0Y2gsIGRldi0+b2Zfbm9kZSkpCisJCXJldHVybiAtRU5PREVWOworCisJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcihkZXYsIHNpemVvZihzdHJ1Y3QgYmNtX3FzcGkpKTsKKwlpZiAoIW1hc3RlcikgeworCQlkZXZfZXJyKGRldiwgImVycm9yIGFsbG9jYXRpbmcgc3BpX21hc3RlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXFzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJcXNwaS0+cGRldiA9IHBkZXY7CisJcXNwaS0+dHJhbnNfcG9zLnRyYW5zID0gTlVMTDsKKwlxc3BpLT50cmFuc19wb3MuYnl0ZSA9IDA7CisJcXNwaS0+bWFzdGVyID0gbWFzdGVyOworCisJbWFzdGVyLT5idXNfbnVtID0gLTE7CisJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BIQSB8IFNQSV9DUE9MIHwgU1BJX1JYX0RVQUwgfCBTUElfUlhfUVVBRDsKKwltYXN0ZXItPnNldHVwID0gYmNtX3FzcGlfc2V0dXA7CisJbWFzdGVyLT50cmFuc2Zlcl9vbmUgPSBiY21fcXNwaV90cmFuc2Zlcl9vbmU7CisJbWFzdGVyLT5zcGlfZmxhc2hfcmVhZCA9IGJjbV9xc3BpX2ZsYXNoX3JlYWQ7CisJbWFzdGVyLT5jbGVhbnVwID0gYmNtX3FzcGlfY2xlYW51cDsKKwltYXN0ZXItPmRldi5vZl9ub2RlID0gZGV2LT5vZl9ub2RlOworCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBOVU1fQ0hJUFNFTEVDVDsKKworCXFzcGktPmJpZ19lbmRpYW4gPSBvZl9kZXZpY2VfaXNfYmlnX2VuZGlhbihkZXYtPm9mX25vZGUpOworCisJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihkZXYtPm9mX25vZGUsICJudW0tY3MiLCAmdmFsKSkKKwkJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IHZhbDsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJoaWZfbXNwaSIpOworCWlmICghcmVzKQorCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLAorCQkJCQkJICAgIm1zcGkiKTsKKworCWlmIChyZXMpIHsKKwkJcXNwaS0+YmFzZVtNU1BJXSAgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCQlpZiAoSVNfRVJSKHFzcGktPmJhc2VbTVNQSV0pKSB7CisJCQlyZXQgPSBQVFJfRVJSKHFzcGktPmJhc2VbTVNQSV0pOworCQkJZ290byBxc3BpX3Byb2JlX2VycjsKKwkJfQorCX0gZWxzZSB7CisJCWdvdG8gcXNwaV9wcm9iZV9lcnI7CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgImJzcGkiKTsKKwlpZiAocmVzKSB7CisJCXFzcGktPmJhc2VbQlNQSV0gID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwkJaWYgKElTX0VSUihxc3BpLT5iYXNlW0JTUEldKSkgeworCQkJcmV0ID0gUFRSX0VSUihxc3BpLT5iYXNlW0JTUEldKTsKKwkJCWdvdG8gcXNwaV9wcm9iZV9lcnI7CisJCX0KKwkJcXNwaS0+YnNwaV9tb2RlID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlxc3BpLT5ic3BpX21vZGUgPSBmYWxzZTsKKwl9CisKKwlkZXZfaW5mbyhkZXYsICJ1c2luZyAlc21zcGkgbW9kZVxuIiwgcXNwaS0+YnNwaV9tb2RlID8gImJzcGktIiA6ICIiKTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJjc19yZWciKTsKKwlpZiAocmVzKSB7CisJCXFzcGktPmJhc2VbQ0hJUF9TRUxFQ1RdICA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CisJCWlmIChJU19FUlIocXNwaS0+YmFzZVtDSElQX1NFTEVDVF0pKSB7CisJCQlyZXQgPSBQVFJfRVJSKHFzcGktPmJhc2VbQ0hJUF9TRUxFQ1RdKTsKKwkJCWdvdG8gcXNwaV9wcm9iZV9lcnI7CisJCX0KKwl9CisKKwlxc3BpLT5kZXZfaWRzID0ga2NhbGxvYyhudW1faXJxcywgc2l6ZW9mKHN0cnVjdCBiY21fcXNwaV9kZXZfaWQpLAorCQkJCUdGUF9LRVJORUwpOworCWlmICghcXNwaS0+ZGV2X2lkcykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHFzcGlfcHJvYmVfZXJyOworCX0KKworCWZvciAodmFsID0gMDsgdmFsIDwgbnVtX2lycXM7IHZhbCsrKSB7CisJCWlycSA9IC0xOworCQluYW1lID0gcXNwaV9pcnFfdGFiW3ZhbF0uaXJxX25hbWU7CisJCWlmIChxc3BpX2lycV90YWJbdmFsXS5pcnFfc291cmNlID09IFNJTkdMRV9MMikgeworCQkJLyogZ2V0IHRoZSBsMiBpbnRlcnJ1cHRzICovCisJCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCBuYW1lKTsKKwkJfSBlbHNlIGlmICghbnVtX2ludHMgJiYgc29jX2ludGMpIHsKKwkJCS8qIGFsbCBtc3BpLCBic3BpIGludHJzIG11eGVkIHRvIG9uZSBMMSBpbnRyICovCisJCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCQl9CisKKwkJaWYgKGlycSAgPj0gMCkgeworCQkJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBpcnEsCisJCQkJCSAgICAgICBxc3BpX2lycV90YWJbdmFsXS5pcnFfaGFuZGxlciwgMCwKKwkJCQkJICAgICAgIG5hbWUsCisJCQkJCSAgICAgICAmcXNwaS0+ZGV2X2lkc1t2YWxdKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiSVJRICVzIG5vdCBmb3VuZFxuIiwgbmFtZSk7CisJCQkJZ290byBxc3BpX3Byb2JlX2VycjsKKwkJCX0KKworCQkJcXNwaS0+ZGV2X2lkc1t2YWxdLmRldiA9IHFzcGk7CisJCQlxc3BpLT5kZXZfaWRzW3ZhbF0uaXJxcCA9ICZxc3BpX2lycV90YWJbdmFsXTsKKwkJCW51bV9pbnRzKys7CisJCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJyZWdpc3RlcmVkIElSUSAlcyAlZFxuIiwKKwkJCQlxc3BpX2lycV90YWJbdmFsXS5pcnFfbmFtZSwKKwkJCQlpcnEpOworCQl9CisJfQorCisJaWYgKCFudW1faW50cykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBJUlFzIHJlZ2lzdGVyZWQsIGNhbm5vdCBpbml0IGRyaXZlclxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gcXNwaV9wcm9iZV9lcnI7CisJfQorCisJLyoKKwkgKiBTb21lIFNvQ3MgaW50ZWdyYXRlIHNwaSBjb250cm9sbGVyIChlLmcuLCBpdHMgaW50ZXJydXB0IGJpdHMpCisJICogaW4gc3BlY2lmaWMgd2F5cworCSAqLworCWlmIChzb2NfaW50YykgeworCQlxc3BpLT5zb2NfaW50YyA9IHNvY19pbnRjOworCQlzb2NfaW50Yy0+YmNtX3FzcGlfaW50X3NldChzb2NfaW50YywgTVNQSV9ET05FLCB0cnVlKTsKKwl9IGVsc2UgeworCQlxc3BpLT5zb2NfaW50YyA9IE5VTEw7CisJfQorCisJcXNwaS0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOworCWlmIChJU19FUlIocXNwaS0+Y2xrKSkgeworCQlkZXZfd2FybihkZXYsICJ1bmFibGUgdG8gZ2V0IGNsb2NrXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihxc3BpLT5jbGspOworCQlnb3RvIHFzcGlfcHJvYmVfZXJyOworCX0KKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShxc3BpLT5jbGspOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcHJlcGFyZSBjbG9ja1xuIik7CisJCWdvdG8gcXNwaV9wcm9iZV9lcnI7CisJfQorCisJcXNwaS0+YmFzZV9jbGsgPSBjbGtfZ2V0X3JhdGUocXNwaS0+Y2xrKTsKKwlxc3BpLT5tYXhfc3BlZWRfaHogPSBxc3BpLT5iYXNlX2NsayAvIChRU1BJX1NQQlJfTUlOICogMik7CisKKwliY21fcXNwaV9od19pbml0KHFzcGkpOworCWluaXRfY29tcGxldGlvbigmcXNwaS0+bXNwaV9kb25lKTsKKwlpbml0X2NvbXBsZXRpb24oJnFzcGktPmJzcGlfZG9uZSk7CisJcXNwaS0+Y3Vycl9jcyA9IC0xOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcXNwaSk7CisKKwlxc3BpLT54ZmVyX21vZGUud2lkdGggPSAtMTsKKwlxc3BpLT54ZmVyX21vZGUuYWRkcmxlbiA9IC0xOworCXFzcGktPnhmZXJfbW9kZS5ocCA9IC0xOworCisJcmV0ID0gZGV2bV9zcGlfcmVnaXN0ZXJfbWFzdGVyKCZwZGV2LT5kZXYsIG1hc3Rlcik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJjYW4ndCByZWdpc3RlciBtYXN0ZXJcbiIpOworCQlnb3RvIHFzcGlfcmVnX2VycjsKKwl9CisKKwlyZXR1cm4gMDsKKworcXNwaV9yZWdfZXJyOgorCWJjbV9xc3BpX2h3X3VuaW5pdChxc3BpKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocXNwaS0+Y2xrKTsKK3FzcGlfcHJvYmVfZXJyOgorCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisJa2ZyZWUocXNwaS0+ZGV2X2lkcyk7CisJcmV0dXJuIHJldDsKK30KKy8qIHByb2JlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBieSBTb0Mgc3BlY2lmaWMgcGxhdGZvcm0gZHJpdmVyIHByb2JlICovCitFWFBPUlRfU1lNQk9MX0dQTChiY21fcXNwaV9wcm9iZSk7CisKK2ludCBiY21fcXNwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYmNtX3FzcGkgKnFzcGkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWJjbV9xc3BpX2h3X3VuaW5pdChxc3BpKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocXNwaS0+Y2xrKTsKKwlrZnJlZShxc3BpLT5kZXZfaWRzKTsKKwlzcGlfdW5yZWdpc3Rlcl9tYXN0ZXIocXNwaS0+bWFzdGVyKTsKKworCXJldHVybiAwOworfQorLyogZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJ5IFNvQyBzcGVjaWZpYyBwbGF0Zm9ybSBkcml2ZXIgcmVtb3ZlKCkgKi8KK0VYUE9SVF9TWU1CT0xfR1BMKGJjbV9xc3BpX3JlbW92ZSk7CisKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgYmNtX3FzcGlfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJjbV9xc3BpICpxc3BpID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlzcGlfbWFzdGVyX3N1c3BlbmQocXNwaS0+bWFzdGVyKTsKKwljbGtfZGlzYWJsZShxc3BpLT5jbGspOworCWJjbV9xc3BpX2h3X3VuaW5pdChxc3BpKTsKKworCXJldHVybiAwOworfTsKKworc3RhdGljIGludCBfX21heWJlX3VudXNlZCBiY21fcXNwaV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBiY21fcXNwaSAqcXNwaSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZXQgPSAwOworCisJYmNtX3FzcGlfaHdfaW5pdChxc3BpKTsKKwliY21fcXNwaV9jaGlwX3NlbGVjdChxc3BpLCBxc3BpLT5jdXJyX2NzKTsKKwlpZiAocXNwaS0+c29jX2ludGMpCisJCS8qIGVuYWJsZSBNU1BJIGludGVycnVwdCAqLworCQlxc3BpLT5zb2NfaW50Yy0+YmNtX3FzcGlfaW50X3NldChxc3BpLT5zb2NfaW50YywgTVNQSV9ET05FLAorCQkJCQkJIHRydWUpOworCisJcmV0ID0gY2xrX2VuYWJsZShxc3BpLT5jbGspOworCWlmICghcmV0KQorCQlzcGlfbWFzdGVyX3Jlc3VtZShxc3BpLT5tYXN0ZXIpOworCisJcmV0dXJuIHJldDsKK30KKworU0lNUExFX0RFVl9QTV9PUFMoYmNtX3FzcGlfcG1fb3BzLCBiY21fcXNwaV9zdXNwZW5kLCBiY21fcXNwaV9yZXN1bWUpOworCisvKiBwbV9vcHMgdG8gYmUgY2FsbGVkIGJ5IFNvQyBzcGVjaWZpYyBwbGF0Zm9ybSBkcml2ZXIgKi8KK0VYUE9SVF9TWU1CT0xfR1BMKGJjbV9xc3BpX3BtX29wcyk7CisKK01PRFVMRV9BVVRIT1IoIkthbWFsIERhc3UiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQnJvYWRjb20gUVNQSSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06IiBEUklWRVJfTkFNRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYmNtLXFzcGkuaCBiL2RyaXZlcnMvc3BpL3NwaS1iY20tcXNwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYmZjNzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGktYmNtLXFzcGkuaApAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEJyb2FkY29tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uICh0aGUgIkdQTCIpLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAoR1BMdjIpIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiAoR1BMdjIpIGFsb25nIHdpdGggdGhpcyBzb3VyY2UgY29kZS4KKyAqLworCisjaWZuZGVmIF9fU1BJX0JDTV9RU1BJX0hfXworI2RlZmluZSBfX1NQSV9CQ01fUVNQSV9IX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworLyogQlNQSSBpbnRlcnJ1cHQgbWFza3MgKi8KKyNkZWZpbmUgSU5UUl9CU1BJX0xSX09WRVJSRUFEX01BU0sJCUJJVCg0KQorI2RlZmluZSBJTlRSX0JTUElfTFJfU0VTU0lPTl9ET05FX01BU0sJCUJJVCgzKQorI2RlZmluZSBJTlRSX0JTUElfTFJfSU1QQVRJRU5UX01BU0sJCUJJVCgyKQorI2RlZmluZSBJTlRSX0JTUElfTFJfU0VTU0lPTl9BQk9SVEVEX01BU0sJQklUKDEpCisjZGVmaW5lIElOVFJfQlNQSV9MUl9GVUxMTkVTU19SRUFDSEVEX01BU0sJQklUKDApCisKKyNkZWZpbmUgQlNQSV9MUl9JTlRFUlJVUFRTX0RBVEEJCSAgICAgICBcCisJKElOVFJfQlNQSV9MUl9TRVNTSU9OX0RPTkVfTUFTSyB8CSAgICAgICBcCisJIElOVFJfQlNQSV9MUl9GVUxMTkVTU19SRUFDSEVEX01BU0spCisKKyNkZWZpbmUgQlNQSV9MUl9JTlRFUlJVUFRTX0VSUk9SICAgICAgICAgICAgICAgXAorCShJTlRSX0JTUElfTFJfT1ZFUlJFQURfTUFTSyB8CSAgICAgICBcCisJIElOVFJfQlNQSV9MUl9JTVBBVElFTlRfTUFTSyB8CSAgICAgICBcCisJIElOVFJfQlNQSV9MUl9TRVNTSU9OX0FCT1JURURfTUFTSykKKworI2RlZmluZSBCU1BJX0xSX0lOVEVSUlVQVFNfQUxMICAgICAgICAgICAgICAgICBcCisJKEJTUElfTFJfSU5URVJSVVBUU19FUlJPUiB8CSAgICAgICBcCisJIEJTUElfTFJfSU5URVJSVVBUU19EQVRBKQorCisvKiBNU1BJIEludGVycnVwdCBtYXNrcyAqLworI2RlZmluZSBJTlRSX01TUElfSEFMVEVEX01BU0sJCQlCSVQoNikKKyNkZWZpbmUgSU5UUl9NU1BJX0RPTkVfTUFTSwkJCUJJVCg1KQorCisjZGVmaW5lIE1TUElfSU5URVJSVVBUU19BTEwJCSAgICAgICBcCisJKElOVFJfTVNQSV9ET05FX01BU0sgfAkJICAgICAgIFwKKwkgSU5UUl9NU1BJX0hBTFRFRF9NQVNLKQorCisjZGVmaW5lIFFTUElfSU5URVJSVVBUU19BTEwgICAgICAgICAgICAgICAgICAgIFwKKwkoTVNQSV9JTlRFUlJVUFRTX0FMTCB8CQkgICAgICAgXAorCSBCU1BJX0xSX0lOVEVSUlVQVFNfQUxMKQorCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlOworc3RydWN0IGRldl9wbV9vcHM7CisKK2VudW0geworCU1TUElfRE9ORSA9IDB4MSwKKwlCU1BJX0RPTkUgPSAweDIsCisJQlNQSV9FUlIgPSAweDQsCisJTVNQSV9CU1BJX0RPTkUgPSAweDcKK307CisKK3N0cnVjdCBiY21fcXNwaV9zb2NfaW50YyB7CisJdm9pZCAoKmJjbV9xc3BpX2ludF9hY2spKHN0cnVjdCBiY21fcXNwaV9zb2NfaW50YyAqc29jX2ludGMsIGludCB0eXBlKTsKKwl2b2lkICgqYmNtX3FzcGlfaW50X3NldCkoc3RydWN0IGJjbV9xc3BpX3NvY19pbnRjICpzb2NfaW50YywgaW50IHR5cGUsCisJCQkJIGJvb2wgZW4pOworCXUzMiAoKmJjbV9xc3BpX2dldF9pbnRfc3RhdHVzKShzdHJ1Y3QgYmNtX3FzcGlfc29jX2ludGMgKnNvY19pbnRjKTsKK307CisKKy8qIFJlYWQgY29udHJvbGxlciByZWdpc3RlciovCitzdGF0aWMgaW5saW5lIHUzMiBiY21fcXNwaV9yZWFkbChib29sIGJlLCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJaWYgKGJlKQorCQlyZXR1cm4gaW9yZWFkMzJiZShhZGRyKTsKKwllbHNlCisJCXJldHVybiByZWFkbF9yZWxheGVkKGFkZHIpOworfQorCisvKiBXcml0ZSBjb250cm9sbGVyIHJlZ2lzdGVyKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21fcXNwaV93cml0ZWwoYm9vbCBiZSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgZGF0YSwgdm9pZCBfX2lvbWVtICphZGRyKQoreworCWlmIChiZSkKKwkJaW93cml0ZTMyYmUoZGF0YSwgYWRkcik7CisJZWxzZQorCQl3cml0ZWxfcmVsYXhlZChkYXRhLCBhZGRyKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgZ2V0X3FzcGlfbWFzayhpbnQgdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIE1TUElfRE9ORToKKwkJcmV0dXJuIElOVFJfTVNQSV9ET05FX01BU0s7CisJY2FzZSBCU1BJX0RPTkU6CisJCXJldHVybiBCU1BJX0xSX0lOVEVSUlVQVFNfQUxMOworCWNhc2UgTVNQSV9CU1BJX0RPTkU6CisJCXJldHVybiBRU1BJX0lOVEVSUlVQVFNfQUxMOworCWNhc2UgQlNQSV9FUlI6CisJCXJldHVybiBCU1BJX0xSX0lOVEVSUlVQVFNfRVJST1I7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBjb21tb24gZHJpdmVyIGZ1bmN0aW9ucyB0byBiZSBjYWxsZWQgYnkgdGhlIFNvQyBwbGF0Zm9ybSBkcml2ZXIgKi8KK2ludCBiY21fcXNwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkgICBzdHJ1Y3QgYmNtX3FzcGlfc29jX2ludGMgKnNvY19pbnRjKTsKK2ludCBiY21fcXNwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CisKKy8qIHBtX29wcyB1c2VkIGJ5IHRoZSBTb0MgcGxhdGZvcm0gZHJpdmVyIGNhbGxlZCBvbiBQTSBzdXNwZW5kL3Jlc3VtZSAqLworZXh0ZXJuIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGJjbV9xc3BpX3BtX29wczsKKworI2VuZGlmIC8qIF9fU1BJX0JDTV9RU1BJX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWJyY21zdGItcXNwaS5jIGIvZHJpdmVycy9zcGkvc3BpLWJyY21zdGItcXNwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZGY5MmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGktYnJjbXN0Yi1xc3BpLmMKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IEJyb2FkY29tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uICh0aGUgIkdQTCIpLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAoR1BMdjIpIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiAoR1BMdjIpIGFsb25nIHdpdGggdGhpcyBzb3VyY2UgY29kZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlICJzcGktYmNtLXFzcGkuaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYnJjbXN0Yl9xc3BpX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJicmNtLHNwaS1icmNtc3RiLXFzcGkiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJicmNtLHNwaS1icmNtc3RiLW1zcGkiIH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYnJjbXN0Yl9xc3BpX29mX21hdGNoKTsKKworc3RhdGljIGludCBicmNtc3RiX3FzcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gYmNtX3FzcGlfcHJvYmUocGRldiwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgYnJjbXN0Yl9xc3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiBiY21fcXNwaV9yZW1vdmUocGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJyY21zdGJfcXNwaV9kcml2ZXIgPSB7CisJLnByb2JlCQkJPSBicmNtc3RiX3FzcGlfcHJvYmUsCisJLnJlbW92ZQkJCT0gYnJjbXN0Yl9xc3BpX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZQkJPSAiYnJjbXN0Yl9xc3BpIiwKKwkJLnBtCQk9ICZiY21fcXNwaV9wbV9vcHMsCisJCS5vZl9tYXRjaF90YWJsZSA9IGJyY21zdGJfcXNwaV9vZl9tYXRjaCwKKwl9Cit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihicmNtc3RiX3FzcGlfZHJpdmVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FVVEhPUigiS2FtYWwgRGFzdSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCcm9hZGNvbSBTUEkgZHJpdmVyIGZvciBzZXR0b3AgU29DIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktY2F2aXVtLXRodW5kZXJ4LmMgYi9kcml2ZXJzL3NwaS9zcGktY2F2aXVtLXRodW5kZXJ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc3OTM3NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1jYXZpdW0tdGh1bmRlcnguYwpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIENhdml1bSBUaHVuZGVyWCBTUEkgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBDYXZpdW0gSW5jLgorICogQXV0aG9yczogSmFuIEdsYXViZXIgPGpnbGF1YmVyQGNhdml1bS5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKworI2luY2x1ZGUgInNwaS1jYXZpdW0uaCIKKworI2RlZmluZSBEUlZfTkFNRSAic3BpLXRodW5kZXJ4IgorCisjZGVmaW5lIFNZU19GUkVRX0RFRkFVTFQgNzAwMDAwMDAwIC8qIDcwMCBNaHogKi8KKworc3RhdGljIGludCB0aHVuZGVyeF9zcGlfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKwlzdHJ1Y3Qgb2N0ZW9uX3NwaSAqcDsKKwlpbnQgcmV0OworCisJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcihkZXYsIHNpemVvZihzdHJ1Y3Qgb2N0ZW9uX3NwaSkpOworCWlmICghbWFzdGVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXAgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwlyZXQgPSBwY2ltX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlwLT5yZWdpc3Rlcl9iYXNlID0gcGNpbV9pb21hcChwZGV2LCAwLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKKwlpZiAoIXAtPnJlZ2lzdGVyX2Jhc2UpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlwLT5yZWdzLmNvbmZpZyA9IDB4MTAwMDsKKwlwLT5yZWdzLnN0YXR1cyA9IDB4MTAwODsKKwlwLT5yZWdzLnR4ID0gMHgxMDEwOworCXAtPnJlZ3MuZGF0YSA9IDB4MTA4MDsKKworCXAtPmNsayA9IGRldm1fY2xrX2dldChkZXYsIE5VTEwpOworCWlmIChJU19FUlIocC0+Y2xrKSkgeworCQlyZXQgPSBQVFJfRVJSKHAtPmNsayk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHAtPmNsayk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXAtPnN5c19mcmVxID0gY2xrX2dldF9yYXRlKHAtPmNsayk7CisJaWYgKCFwLT5zeXNfZnJlcSkKKwkJcC0+c3lzX2ZyZXEgPSBTWVNfRlJFUV9ERUZBVUxUOworCWRldl9pbmZvKGRldiwgIlNldCBzeXN0ZW0gY2xvY2sgdG8gJXVcbiIsIHAtPnN5c19mcmVxKTsKKworCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSA0OworCW1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NQSEEgfCBTUElfQ1BPTCB8IFNQSV9DU19ISUdIIHwKKwkJCSAgICBTUElfTFNCX0ZJUlNUIHwgU1BJXzNXSVJFOworCW1hc3Rlci0+dHJhbnNmZXJfb25lX21lc3NhZ2UgPSBvY3Rlb25fc3BpX3RyYW5zZmVyX29uZV9tZXNzYWdlOworCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gU1BJX0JQV19NQVNLKDgpOworCW1hc3Rlci0+bWF4X3NwZWVkX2h6ID0gT0NURU9OX1NQSV9NQVhfQ0xPQ0tfSFo7CisJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIG1hc3Rlcik7CisKKwlyZXQgPSBkZXZtX3NwaV9yZWdpc3Rlcl9tYXN0ZXIoZGV2LCBtYXN0ZXIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHAtPmNsayk7CisJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB0aHVuZGVyeF9zcGlfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IG9jdGVvbl9zcGkgKnA7CisKKwlwID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCWlmICghcCkKKwkJcmV0dXJuOworCisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHAtPmNsayk7CisJLyogUHV0IGV2ZXJ5dGhpbmcgaW4gYSBrbm93biBzdGF0ZS4gKi8KKwl3cml0ZXEoMCwgcC0+cmVnaXN0ZXJfYmFzZSArIE9DVEVPTl9TUElfQ0ZHKHApKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHRodW5kZXJ4X3NwaV9wY2lfaWRfdGFibGVbXSA9IHsKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9DQVZJVU0sIDB4YTAwYikgfSwKKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB0aHVuZGVyeF9zcGlfcGNpX2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHRodW5kZXJ4X3NwaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gRFJWX05BTUUsCisJLmlkX3RhYmxlCT0gdGh1bmRlcnhfc3BpX3BjaV9pZF90YWJsZSwKKwkucHJvYmUJCT0gdGh1bmRlcnhfc3BpX3Byb2JlLAorCS5yZW1vdmUJCT0gdGh1bmRlcnhfc3BpX3JlbW92ZSwKK307CisKK21vZHVsZV9wY2lfZHJpdmVyKHRodW5kZXJ4X3NwaV9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkNhdml1bSwgSW5jLiBUaHVuZGVyWCBTUEkgYnVzIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiSmFuIEdsYXViZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1jYXZpdW0uaCBiL2RyaXZlcnMvc3BpL3NwaS1jYXZpdW0uaAppbmRleCA4OGM1ZjM2Li4xZjkxZDYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktY2F2aXVtLmgKKysrIGIvZHJpdmVycy9zcGkvc3BpLWNhdml1bS5oCkBAIC0xLDYgKzEsOCBAQAogI2lmbmRlZiBfX1NQSV9DQVZJVU1fSAogI2RlZmluZSBfX1NQSV9DQVZJVU1fSAogCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisKICNkZWZpbmUgT0NURU9OX1NQSV9NQVhfQllURVMgOQogI2RlZmluZSBPQ1RFT05fU1BJX01BWF9DTE9DS19IWiAxNjAwMDAwMAogCkBAIC0xNyw2ICsxOSw3IEBACiAJdTY0IGNzX2VuYXg7CiAJaW50IHN5c19mcmVxOwogCXN0cnVjdCBvY3Rlb25fc3BpX3JlZ3MgcmVnczsKKwlzdHJ1Y3QgY2xrICpjbGs7CiB9OwogCiAjZGVmaW5lIE9DVEVPTl9TUElfQ0ZHKHgpCSh4LT5yZWdzLmNvbmZpZykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1kdy5jIGIvZHJpdmVycy9zcGkvc3BpLWR3LmMKaW5kZXggYzA5YmI3NC4uMjc5NjBlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWR3LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWR3LmMKQEAgLTI4Myw3ICsyODMsNiBAQAogCXN0cnVjdCBjaGlwX2RhdGEgKmNoaXAgPSBzcGlfZ2V0X2N0bGRhdGEoc3BpKTsKIAl1OCBpbWFzayA9IDA7CiAJdTE2IHR4bGV2ZWwgPSAwOwotCXUxNiBjbGtfZGl2OwogCXUzMiBjcjA7CiAJaW50IHJldDsKIApAQCAtMjk4LDEzICsyOTcsMTMgQEAKIAlzcGlfZW5hYmxlX2NoaXAoZHdzLCAwKTsKIAogCS8qIEhhbmRsZSBwZXIgdHJhbnNmZXIgb3B0aW9ucyBmb3IgYnB3IGFuZCBzcGVlZCAqLwotCWlmICh0cmFuc2Zlci0+c3BlZWRfaHogIT0gY2hpcC0+c3BlZWRfaHopIHsKLQkJLyogY2xrX2RpdiBkb2Vzbid0IHN1cHBvcnQgb2RkIG51bWJlciAqLwotCQljbGtfZGl2ID0gKGR3cy0+bWF4X2ZyZXEgLyB0cmFuc2Zlci0+c3BlZWRfaHogKyAxKSAmIDB4ZmZmZTsKLQotCQljaGlwLT5zcGVlZF9oeiA9IHRyYW5zZmVyLT5zcGVlZF9oejsKLQkJY2hpcC0+Y2xrX2RpdiA9IGNsa19kaXY7Ci0KKwlpZiAodHJhbnNmZXItPnNwZWVkX2h6ICE9IGR3cy0+Y3VycmVudF9mcmVxKSB7CisJCWlmICh0cmFuc2Zlci0+c3BlZWRfaHogIT0gY2hpcC0+c3BlZWRfaHopIHsKKwkJCS8qIGNsa19kaXYgZG9lc24ndCBzdXBwb3J0IG9kZCBudW1iZXIgKi8KKwkJCWNoaXAtPmNsa19kaXYgPSAoRElWX1JPVU5EX1VQKGR3cy0+bWF4X2ZyZXEsIHRyYW5zZmVyLT5zcGVlZF9oeikgKyAxKSAmIDB4ZmZmZTsKKwkJCWNoaXAtPnNwZWVkX2h6ID0gdHJhbnNmZXItPnNwZWVkX2h6OworCQl9CisJCWR3cy0+Y3VycmVudF9mcmVxID0gdHJhbnNmZXItPnNwZWVkX2h6OwogCQlzcGlfc2V0X2Nsayhkd3MsIGNoaXAtPmNsa19kaXYpOwogCX0KIAlpZiAodHJhbnNmZXItPmJpdHNfcGVyX3dvcmQgPT0gOCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWR3LmggYi9kcml2ZXJzL3NwaS9zcGktZHcuaAppbmRleCA2MWJjM2NiLi5jMjFjYTAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktZHcuaAorKysgYi9kcml2ZXJzL3NwaS9zcGktZHcuaApAQCAtMTIzLDYgKzEyMyw3IEBACiAJdTgJCQluX2J5dGVzOwkvKiBjdXJyZW50IGlzIGEgMS8yIGJ5dGVzIG9wICovCiAJdTMyCQkJZG1hX3dpZHRoOwogCWlycXJldHVybl90CQkoKnRyYW5zZmVyX2hhbmRsZXIpKHN0cnVjdCBkd19zcGkgKmR3cyk7CisJdTMyCQkJY3VycmVudF9mcmVxOwkvKiBmcmVxdWVuY3kgaW4gaHogKi8KIAogCS8qIERNQSBpbmZvICovCiAJaW50CQkJZG1hX2luaXRlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1mc2wtZHNwaS5jIGIvZHJpdmVycy9zcGkvc3BpLWZzbC1kc3BpLmMKaW5kZXggOWU5ZGFkYi4uMzVjMGRkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWZzbC1kc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWZzbC1kc3BpLmMKQEAgLTE1OSw3ICsxNTksNyBAQAogCXU4CQkJY3M7CiAJdTE2CQkJdm9pZF93cml0ZV9kYXRhOwogCXUzMgkJCWNzX2NoYW5nZTsKLQlzdHJ1Y3QgZnNsX2RzcGlfZGV2dHlwZV9kYXRhICpkZXZ0eXBlX2RhdGE7CisJY29uc3Qgc3RydWN0IGZzbF9kc3BpX2RldnR5cGVfZGF0YSAqZGV2dHlwZV9kYXRhOwogCiAJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdHE7CiAJdTMyCQkJd2FpdGZsYWdzOwpAQCAtNjI0LDEwICs2MjQsMTMgQEAKIHsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IGZzbF9kc3BpICpkc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCWludCByZXQ7CiAKIAlwaW5jdHJsX3BtX3NlbGVjdF9kZWZhdWx0X3N0YXRlKGRldik7CiAKLQljbGtfcHJlcGFyZV9lbmFibGUoZHNwaS0+Y2xrKTsKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZHNwaS0+Y2xrKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCXNwaV9tYXN0ZXJfcmVzdW1lKG1hc3Rlcik7CiAKIAlyZXR1cm4gMDsKQEAgLTY1MSw4ICs2NTQsNiBAQAogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCXZvaWQgX19pb21lbSAqYmFzZTsKIAlpbnQgcmV0ID0gMCwgY3NfbnVtLCBidXNfbnVtOwotCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkID0KLQkJCW9mX21hdGNoX2RldmljZShmc2xfZHNwaV9kdF9pZHMsICZwZGV2LT5kZXYpOwogCiAJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGZzbF9kc3BpKSk7CiAJaWYgKCFtYXN0ZXIpCkBAIC02ODYsNyArNjg3LDcgQEAKIAl9CiAJbWFzdGVyLT5idXNfbnVtID0gYnVzX251bTsKIAotCWRzcGktPmRldnR5cGVfZGF0YSA9IChzdHJ1Y3QgZnNsX2RzcGlfZGV2dHlwZV9kYXRhICopb2ZfaWQtPmRhdGE7CisJZHNwaS0+ZGV2dHlwZV9kYXRhID0gb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKCZwZGV2LT5kZXYpOwogCWlmICghZHNwaS0+ZGV2dHlwZV9kYXRhKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IGdldCBkZXZ0eXBlX2RhdGFcbiIpOwogCQlyZXQgPSAtRUZBVUxUOwpAQCAtNzI4LDcgKzcyOSw5IEBACiAJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBnZXQgY2xvY2tcbiIpOwogCQlnb3RvIG91dF9tYXN0ZXJfcHV0OwogCX0KLQljbGtfcHJlcGFyZV9lbmFibGUoZHNwaS0+Y2xrKTsKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZHNwaS0+Y2xrKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9tYXN0ZXJfcHV0OwogCiAJbWFzdGVyLT5tYXhfc3BlZWRfaHogPQogCQljbGtfZ2V0X3JhdGUoZHNwaS0+Y2xrKSAvIGRzcGktPmRldnR5cGVfZGF0YS0+bWF4X2Nsb2NrX2ZhY3RvcjsKQEAgLTc2MCw3ICs3NjMsNiBAQAogCS8qIERpc2Nvbm5lY3QgZnJvbSB0aGUgU1BJIGZyYW1ld29yayAqLwogCWNsa19kaXNhYmxlX3VucHJlcGFyZShkc3BpLT5jbGspOwogCXNwaV91bnJlZ2lzdGVyX21hc3Rlcihkc3BpLT5tYXN0ZXIpOwotCXNwaV9tYXN0ZXJfcHV0KGRzcGktPm1hc3Rlcik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1mc2wtZXNwaS5jIGIvZHJpdmVycy9zcGkvc3BpLWZzbC1lc3BpLmMKaW5kZXggOGQ4NWEzYy4uNzQ1MTU4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWZzbC1lc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWZzbC1lc3BpLmMKQEAgLTEyLDcgKzEyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9mc2xfZGV2aWNlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KQEAgLTI3LDQwICsyNiwyOSBAQAogI2luY2x1ZGUgInNwaS1mc2wtbGliLmgiCiAKIC8qIGVTUEkgQ29udHJvbGxlciByZWdpc3RlcnMgKi8KLXN0cnVjdCBmc2xfZXNwaV9yZWcgewotCV9fYmUzMiBtb2RlOwkJLyogMHgwMDAgLSBlU1BJIG1vZGUgcmVnaXN0ZXIgKi8KLQlfX2JlMzIgZXZlbnQ7CQkvKiAweDAwNCAtIGVTUEkgZXZlbnQgcmVnaXN0ZXIgKi8KLQlfX2JlMzIgbWFzazsJCS8qIDB4MDA4IC0gZVNQSSBtYXNrIHJlZ2lzdGVyICovCi0JX19iZTMyIGNvbW1hbmQ7CQkvKiAweDAwYyAtIGVTUEkgY29tbWFuZCByZWdpc3RlciAqLwotCV9fYmUzMiB0cmFuc21pdDsJLyogMHgwMTAgLSBlU1BJIHRyYW5zbWl0IEZJRk8gYWNjZXNzIHJlZ2lzdGVyKi8KLQlfX2JlMzIgcmVjZWl2ZTsJCS8qIDB4MDE0IC0gZVNQSSByZWNlaXZlIEZJRk8gYWNjZXNzIHJlZ2lzdGVyKi8KLQl1OCByZXNbOF07CQkvKiAweDAxOCAtIDB4MDFjIHJlc2VydmVkICovCi0JX19iZTMyIGNzbW9kZVs0XTsJLyogMHgwMjAgLSAweDAyYyBlU1BJIGNzIG1vZGUgcmVnaXN0ZXIgKi8KLX07CisjZGVmaW5lIEVTUElfU1BNT0RFCTB4MDAJLyogZVNQSSBtb2RlIHJlZ2lzdGVyICovCisjZGVmaW5lIEVTUElfU1BJRQkweDA0CS8qIGVTUEkgZXZlbnQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRVNQSV9TUElNCTB4MDgJLyogZVNQSSBtYXNrIHJlZ2lzdGVyICovCisjZGVmaW5lIEVTUElfU1BDT00JMHgwYwkvKiBlU1BJIGNvbW1hbmQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRVNQSV9TUElURgkweDEwCS8qIGVTUEkgdHJhbnNtaXQgRklGTyBhY2Nlc3MgcmVnaXN0ZXIqLworI2RlZmluZSBFU1BJX1NQSVJGCTB4MTQJLyogZVNQSSByZWNlaXZlIEZJRk8gYWNjZXNzIHJlZ2lzdGVyKi8KKyNkZWZpbmUgRVNQSV9TUE1PREUwCTB4MjAJLyogZVNQSSBjczAgbW9kZSByZWdpc3RlciAqLwogCi1zdHJ1Y3QgZnNsX2VzcGlfdHJhbnNmZXIgewotCWNvbnN0IHZvaWQgKnR4X2J1ZjsKLQl2b2lkICpyeF9idWY7Ci0JdW5zaWduZWQgbGVuOwotCXVuc2lnbmVkIG5fdHg7Ci0JdW5zaWduZWQgbl9yeDsKLQl1bnNpZ25lZCBhY3R1YWxfbGVuZ3RoOwotCWludCBzdGF0dXM7Ci19OworI2RlZmluZSBFU1BJX1NQTU9ERXgoeCkJKEVTUElfU1BNT0RFMCArICh4KSAqIDQpCiAKIC8qIGVTUEkgQ29udHJvbGxlciBtb2RlIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCi0jZGVmaW5lIFNQTU9ERV9FTkFCTEUJCSgxIDw8IDMxKQotI2RlZmluZSBTUE1PREVfTE9PUAkJKDEgPDwgMzApCisjZGVmaW5lIFNQTU9ERV9FTkFCTEUJCUJJVCgzMSkKKyNkZWZpbmUgU1BNT0RFX0xPT1AJCUJJVCgzMCkKICNkZWZpbmUgU1BNT0RFX1RYVEhSKHgpCQkoKHgpIDw8IDgpCiAjZGVmaW5lIFNQTU9ERV9SWFRIUih4KQkJKCh4KSA8PCAwKQogCiAvKiBlU1BJIENvbnRyb2xsZXIgQ1MgbW9kZSByZWdpc3RlciBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBDU01PREVfQ0lfSU5BQ1RJVkVISUdICSgxIDw8IDMxKQotI2RlZmluZSBDU01PREVfQ1BfQkVHSU5fRURHRUNMSwkoMSA8PCAzMCkKLSNkZWZpbmUgQ1NNT0RFX1JFVgkJKDEgPDwgMjkpCi0jZGVmaW5lIENTTU9ERV9ESVYxNgkJKDEgPDwgMjgpCisjZGVmaW5lIENTTU9ERV9DSV9JTkFDVElWRUhJR0gJQklUKDMxKQorI2RlZmluZSBDU01PREVfQ1BfQkVHSU5fRURHRUNMSwlCSVQoMzApCisjZGVmaW5lIENTTU9ERV9SRVYJCUJJVCgyOSkKKyNkZWZpbmUgQ1NNT0RFX0RJVjE2CQlCSVQoMjgpCiAjZGVmaW5lIENTTU9ERV9QTSh4KQkJKCh4KSA8PCAyNCkKLSNkZWZpbmUgQ1NNT0RFX1BPTF8xCQkoMSA8PCAyMCkKKyNkZWZpbmUgQ1NNT0RFX1BPTF8xCQlCSVQoMjApCiAjZGVmaW5lIENTTU9ERV9MRU4oeCkJCSgoeCkgPDwgMTYpCiAjZGVmaW5lIENTTU9ERV9CRUYoeCkJCSgoeCkgPDwgMTIpCiAjZGVmaW5lIENTTU9ERV9BRlQoeCkJCSgoeCkgPDwgOCkKQEAgLTcyLDI5ICs2MCwxMTQgQEAKIAkJfCBDU01PREVfQUZUKDApIHwgQ1NNT0RFX0NHKDEpKQogCiAvKiBTUElFIHJlZ2lzdGVyIHZhbHVlcyAqLwotI2RlZmluZQlTUElFX05FCQkweDAwMDAwMjAwCS8qIE5vdCBlbXB0eSAqLwotI2RlZmluZQlTUElFX05GCQkweDAwMDAwMTAwCS8qIE5vdCBmdWxsICovCi0KLS8qIFNQSU0gcmVnaXN0ZXIgdmFsdWVzICovCi0jZGVmaW5lCVNQSU1fTkUJCTB4MDAwMDAyMDAJLyogTm90IGVtcHR5ICovCi0jZGVmaW5lCVNQSU1fTkYJCTB4MDAwMDAxMDAJLyogTm90IGZ1bGwgKi8KICNkZWZpbmUgU1BJRV9SWENOVChyZWcpICAgICAoKHJlZyA+PiAyNCkgJiAweDNGKQogI2RlZmluZSBTUElFX1RYQ05UKHJlZykgICAgICgocmVnID4+IDE2KSAmIDB4M0YpCisjZGVmaW5lCVNQSUVfVFhFCQlCSVQoMTUpCS8qIFRYIEZJRk8gZW1wdHkgKi8KKyNkZWZpbmUJU1BJRV9ET04JCUJJVCgxNCkJLyogVFggZG9uZSAqLworI2RlZmluZQlTUElFX1JYVAkJQklUKDEzKQkvKiBSWCBGSUZPIHRocmVzaG9sZCAqLworI2RlZmluZQlTUElFX1JYRgkJQklUKDEyKQkvKiBSWCBGSUZPIGZ1bGwgKi8KKyNkZWZpbmUJU1BJRV9UWFQJCUJJVCgxMSkJLyogVFggRklGTyB0aHJlc2hvbGQqLworI2RlZmluZQlTUElFX1JORQkJQklUKDkpCS8qIFJYIEZJRk8gbm90IGVtcHR5ICovCisjZGVmaW5lCVNQSUVfVE5GCQlCSVQoOCkJLyogVFggRklGTyBub3QgZnVsbCAqLworCisvKiBTUElNIHJlZ2lzdGVyIHZhbHVlcyAqLworI2RlZmluZQlTUElNX1RYRQkJQklUKDE1KQkvKiBUWCBGSUZPIGVtcHR5ICovCisjZGVmaW5lCVNQSU1fRE9OCQlCSVQoMTQpCS8qIFRYIGRvbmUgKi8KKyNkZWZpbmUJU1BJTV9SWFQJCUJJVCgxMykJLyogUlggRklGTyB0aHJlc2hvbGQgKi8KKyNkZWZpbmUJU1BJTV9SWEYJCUJJVCgxMikJLyogUlggRklGTyBmdWxsICovCisjZGVmaW5lCVNQSU1fVFhUCQlCSVQoMTEpCS8qIFRYIEZJRk8gdGhyZXNob2xkKi8KKyNkZWZpbmUJU1BJTV9STkUJCUJJVCg5KQkvKiBSWCBGSUZPIG5vdCBlbXB0eSAqLworI2RlZmluZQlTUElNX1RORgkJQklUKDgpCS8qIFRYIEZJRk8gbm90IGZ1bGwgKi8KIAogLyogU1BDT00gcmVnaXN0ZXIgdmFsdWVzICovCiAjZGVmaW5lIFNQQ09NX0NTKHgpCQkoKHgpIDw8IDMwKQorI2RlZmluZSBTUENPTV9ETwkJQklUKDI4KSAvKiBEdWFsIG91dHB1dCAqLworI2RlZmluZSBTUENPTV9UTwkJQklUKDI3KSAvKiBUWCBvbmx5ICovCisjZGVmaW5lIFNQQ09NX1JYU0tJUCh4KQkJKCh4KSA8PCAxNikKICNkZWZpbmUgU1BDT01fVFJBTkxFTih4KQkoKHgpIDw8IDApCisKICNkZWZpbmUJU1BDT01fVFJBTkxFTl9NQVgJMHgxMDAwMAkvKiBNYXggdHJhbnNhY3Rpb24gbGVuZ3RoICovCiAKICNkZWZpbmUgQVVUT1NVU1BFTkRfVElNRU9VVCAyMDAwCiAKK3N0YXRpYyBpbmxpbmUgdTMyIGZzbF9lc3BpX3JlYWRfcmVnKHN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSwgaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gaW9yZWFkMzJiZShtc3BpLT5yZWdfYmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggZnNsX2VzcGlfcmVhZF9yZWc4KHN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSwgaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gaW9yZWFkOChtc3BpLT5yZWdfYmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmc2xfZXNwaV93cml0ZV9yZWcoc3RydWN0IG1wYzh4eHhfc3BpICptc3BpLCBpbnQgb2Zmc2V0LAorCQkJCSAgICAgIHUzMiB2YWwpCit7CisJaW93cml0ZTMyYmUodmFsLCBtc3BpLT5yZWdfYmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmc2xfZXNwaV93cml0ZV9yZWc4KHN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSwgaW50IG9mZnNldCwKKwkJCQkgICAgICAgdTggdmFsKQoreworCWlvd3JpdGU4KHZhbCwgbXNwaS0+cmVnX2Jhc2UgKyBvZmZzZXQpOworfQorCitzdGF0aWMgdm9pZCBmc2xfZXNwaV9jb3B5X3RvX2J1ZihzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0sCisJCQkJIHN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSkKK3sKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0OworCXU4ICpidWYgPSBtc3BpLT5sb2NhbF9idWY7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKKwkJaWYgKHQtPnR4X2J1ZikKKwkJCW1lbWNweShidWYsIHQtPnR4X2J1ZiwgdC0+bGVuKTsKKwkJZWxzZQorCQkJbWVtc2V0KGJ1ZiwgMCwgdC0+bGVuKTsKKwkJYnVmICs9IHQtPmxlbjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9lc3BpX2NvcHlfZnJvbV9idWYoc3RydWN0IHNwaV9tZXNzYWdlICptLAorCQkJCSAgIHN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSkKK3sKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0OworCXU4ICpidWYgPSBtc3BpLT5sb2NhbF9idWY7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKKwkJaWYgKHQtPnJ4X2J1ZikKKwkJCW1lbWNweSh0LT5yeF9idWYsIGJ1ZiwgdC0+bGVuKTsKKwkJYnVmICs9IHQtPmxlbjsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZnNsX2VzcGlfY2hlY2tfbWVzc2FnZShzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0pCit7CisJc3RydWN0IG1wYzh4eHhfc3BpICptc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtLT5zcGktPm1hc3Rlcik7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqdCwgKmZpcnN0OworCisJaWYgKG0tPmZyYW1lX2xlbmd0aCA+IFNQQ09NX1RSQU5MRU5fTUFYKSB7CisJCWRldl9lcnIobXNwaS0+ZGV2LCAibWVzc2FnZSB0b28gbG9uZywgc2l6ZSBpcyAldSBieXRlc1xuIiwKKwkJCW0tPmZyYW1lX2xlbmd0aCk7CisJCXJldHVybiAtRU1TR1NJWkU7CisJfQorCisJZmlyc3QgPSBsaXN0X2ZpcnN0X2VudHJ5KCZtLT50cmFuc2ZlcnMsIHN0cnVjdCBzcGlfdHJhbnNmZXIsCisJCQkJIHRyYW5zZmVyX2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJm0tPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgeworCQlpZiAoZmlyc3QtPmJpdHNfcGVyX3dvcmQgIT0gdC0+Yml0c19wZXJfd29yZCB8fAorCQkgICAgZmlyc3QtPnNwZWVkX2h6ICE9IHQtPnNwZWVkX2h6KSB7CisJCQlkZXZfZXJyKG1zcGktPmRldiwgImJpdHNfcGVyX3dvcmQvc3BlZWRfaHogc2hvdWxkIGJlIHRoZSBzYW1lIGZvciBhbGwgdHJhbnNmZXJzXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIGZzbF9lc3BpX2NoYW5nZV9tb2RlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJc3RydWN0IG1wYzh4eHhfc3BpICptc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CiAJc3RydWN0IHNwaV9tcGM4eHh4X2NzICpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKLQlzdHJ1Y3QgZnNsX2VzcGlfcmVnICpyZWdfYmFzZSA9IG1zcGktPnJlZ19iYXNlOwotCV9fYmUzMiBfX2lvbWVtICptb2RlID0gJnJlZ19iYXNlLT5jc21vZGVbc3BpLT5jaGlwX3NlbGVjdF07Ci0JX19iZTMyIF9faW9tZW0gKmVzcGlfbW9kZSA9ICZyZWdfYmFzZS0+bW9kZTsKIAl1MzIgdG1wOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTEwMiwxMCArMTc1LDExIEBACiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCiAJLyogVHVybiBvZmYgU1BJIHVuaXQgcHJpb3IgY2hhbmdpbmcgbW9kZSAqLwotCXRtcCA9IG1wYzh4eHhfc3BpX3JlYWRfcmVnKGVzcGlfbW9kZSk7Ci0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKGVzcGlfbW9kZSwgdG1wICYgflNQTU9ERV9FTkFCTEUpOwotCW1wYzh4eHhfc3BpX3dyaXRlX3JlZyhtb2RlLCBjcy0+aHdfbW9kZSk7Ci0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKGVzcGlfbW9kZSwgdG1wKTsKKwl0bXAgPSBmc2xfZXNwaV9yZWFkX3JlZyhtc3BpLCBFU1BJX1NQTU9ERSk7CisJZnNsX2VzcGlfd3JpdGVfcmVnKG1zcGksIEVTUElfU1BNT0RFLCB0bXAgJiB+U1BNT0RFX0VOQUJMRSk7CisJZnNsX2VzcGlfd3JpdGVfcmVnKG1zcGksIEVTUElfU1BNT0RFeChzcGktPmNoaXBfc2VsZWN0KSwKKwkJCSAgICAgIGNzLT5od19tb2RlKTsKKwlmc2xfZXNwaV93cml0ZV9yZWcobXNwaSwgRVNQSV9TUE1PREUsIHRtcCk7CiAKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CkBAIC0xMzEsMjcgKzIwNSwxNSBAQAogCXJldHVybiBkYXRhOwogfQogCi1zdGF0aWMgaW50IGZzbF9lc3BpX3NldHVwX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCitzdGF0aWMgdm9pZCBmc2xfZXNwaV9zZXR1cF90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAogCQkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQogewogCXN0cnVjdCBtcGM4eHh4X3NwaSAqbXBjOHh4eF9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQlpbnQgYml0c19wZXJfd29yZCA9IDA7CisJaW50IGJpdHNfcGVyX3dvcmQgPSB0ID8gdC0+Yml0c19wZXJfd29yZCA6IHNwaS0+Yml0c19wZXJfd29yZDsKKwl1MzIgaHogPSB0ID8gdC0+c3BlZWRfaHogOiBzcGktPm1heF9zcGVlZF9oejsKIAl1OCBwbTsKLQl1MzIgaHogPSAwOwogCXN0cnVjdCBzcGlfbXBjOHh4eF9jcyAqY3MgPSBzcGktPmNvbnRyb2xsZXJfc3RhdGU7CiAKLQlpZiAodCkgewotCQliaXRzX3Blcl93b3JkID0gdC0+Yml0c19wZXJfd29yZDsKLQkJaHogPSB0LT5zcGVlZF9oejsKLQl9Ci0KLQkvKiBzcGlfdHJhbnNmZXIgbGV2ZWwgY2FsbHMgdGhhdCB3b3JrIHBlci13b3JkICovCi0JaWYgKCFiaXRzX3Blcl93b3JkKQotCQliaXRzX3Blcl93b3JkID0gc3BpLT5iaXRzX3Blcl93b3JkOwotCi0JaWYgKCFoeikKLQkJaHogPSBzcGktPm1heF9zcGVlZF9oejsKLQogCWNzLT5yeF9zaGlmdCA9IDA7CiAJY3MtPnR4X3NoaWZ0ID0gMDsKIAljcy0+Z2V0X3J4ID0gbXBjOHh4eF9zcGlfcnhfYnVmX3UzMjsKQEAgLTE2OSwxMiArMjMxLDEwIEBACiAJbXBjOHh4eF9zcGktPmdldF9yeCA9IGNzLT5nZXRfcng7CiAJbXBjOHh4eF9zcGktPmdldF90eCA9IGNzLT5nZXRfdHg7CiAKLQliaXRzX3Blcl93b3JkID0gYml0c19wZXJfd29yZCAtIDE7Ci0KIAkvKiBtYXNrIG91dCBiaXRzIHdlIGFyZSBnb2luZyB0byBzZXQgKi8KIAljcy0+aHdfbW9kZSAmPSB+KENTTU9ERV9MRU4oMHhGKSB8IENTTU9ERV9ESVYxNiB8IENTTU9ERV9QTSgweEYpKTsKIAotCWNzLT5od19tb2RlIHw9IENTTU9ERV9MRU4oYml0c19wZXJfd29yZCk7CisJY3MtPmh3X21vZGUgfD0gQ1NNT0RFX0xFTihiaXRzX3Blcl93b3JkIC0gMSk7CiAKIAlpZiAoKG1wYzh4eHhfc3BpLT5zcGlicmcgLyBoeikgPiA2NCkgewogCQljcy0+aHdfbW9kZSB8PSBDU01PREVfRElWMTY7CkBAIC0xOTYsMzYgKzI1NiwxNiBAQAogCWNzLT5od19tb2RlIHw9IENTTU9ERV9QTShwbSk7CiAKIAlmc2xfZXNwaV9jaGFuZ2VfbW9kZShzcGkpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGZzbF9lc3BpX2NwdV9idWZzKHN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqdCwKLQkJdW5zaWduZWQgaW50IGxlbikKLXsKLQl1MzIgd29yZDsKLQlzdHJ1Y3QgZnNsX2VzcGlfcmVnICpyZWdfYmFzZSA9IG1zcGktPnJlZ19iYXNlOwotCi0JbXNwaS0+Y291bnQgPSBsZW47Ci0KLQkvKiBlbmFibGUgcnggaW50cyAqLwotCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPm1hc2ssIFNQSU1fTkUpOwotCi0JLyogdHJhbnNtaXQgd29yZCAqLwotCXdvcmQgPSBtc3BpLT5nZXRfdHgobXNwaSk7Ci0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+dHJhbnNtaXQsIHdvcmQpOwotCi0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZnNsX2VzcGlfYnVmcyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQogewogCXN0cnVjdCBtcGM4eHh4X3NwaSAqbXBjOHh4eF9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQlzdHJ1Y3QgZnNsX2VzcGlfcmVnICpyZWdfYmFzZSA9IG1wYzh4eHhfc3BpLT5yZWdfYmFzZTsKLQl1bnNpZ25lZCBpbnQgbGVuID0gdC0+bGVuOworCXUzMiB3b3JkOwogCWludCByZXQ7CiAKIAltcGM4eHh4X3NwaS0+bGVuID0gdC0+bGVuOwotCWxlbiA9IHJvdW5kdXAobGVuLCA0KSAvIDQ7CisJbXBjOHh4eF9zcGktPmNvdW50ID0gcm91bmR1cCh0LT5sZW4sIDQpIC8gNDsKIAogCW1wYzh4eHhfc3BpLT50eCA9IHQtPnR4X2J1ZjsKIAltcGM4eHh4X3NwaS0+cnggPSB0LT5yeF9idWY7CkBAIC0yMzMsMTcgKzI3MywxNSBAQAogCXJlaW5pdF9jb21wbGV0aW9uKCZtcGM4eHh4X3NwaS0+ZG9uZSk7CiAKIAkvKiBTZXQgU1BDT01bQ1NdIGFuZCBTUENPTVtUUkFOTEVOXSBmaWVsZCAqLwotCWlmICh0LT5sZW4gPiBTUENPTV9UUkFOTEVOX01BWCkgewotCQlkZXZfZXJyKG1wYzh4eHhfc3BpLT5kZXYsICJUcmFuc2FjdGlvbiBsZW5ndGggKCVkKSIKLQkJCQkiIGJleW9uZCB0aGUgU1BDT01bVFJBTkxFTl0gZmllbGRcbiIsIHQtPmxlbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQltcGM4eHh4X3NwaV93cml0ZV9yZWcoJnJlZ19iYXNlLT5jb21tYW5kLAorCWZzbF9lc3BpX3dyaXRlX3JlZyhtcGM4eHh4X3NwaSwgRVNQSV9TUENPTSwKIAkJKFNQQ09NX0NTKHNwaS0+Y2hpcF9zZWxlY3QpIHwgU1BDT01fVFJBTkxFTih0LT5sZW4gLSAxKSkpOwogCi0JcmV0ID0gZnNsX2VzcGlfY3B1X2J1ZnMobXBjOHh4eF9zcGksIHQsIGxlbik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwkvKiBlbmFibGUgcnggaW50cyAqLworCWZzbF9lc3BpX3dyaXRlX3JlZyhtcGM4eHh4X3NwaSwgRVNQSV9TUElNLCBTUElNX1JORSk7CisKKwkvKiB0cmFuc21pdCB3b3JkICovCisJd29yZCA9IG1wYzh4eHhfc3BpLT5nZXRfdHgobXBjOHh4eF9zcGkpOworCWZzbF9lc3BpX3dyaXRlX3JlZyhtcGM4eHh4X3NwaSwgRVNQSV9TUElURiwgd29yZCk7CiAKIAkvKiBXb24ndCBoYW5nIHVwIGZvcmV2ZXIsIFNQSSBidXMgc29tZXRpbWVzIGdvdCBsb3N0IGludGVycnVwdHMuLi4gKi8KIAlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJm1wYzh4eHhfc3BpLT5kb25lLCAyICogSFopOwpAQCAtMjUzLDIzMCArMjkxLDc2IEBACiAJCQltcGM4eHh4X3NwaS0+Y291bnQpOwogCiAJLyogZGlzYWJsZSByeCBpbnRzICovCi0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+bWFzaywgMCk7CisJZnNsX2VzcGlfd3JpdGVfcmVnKG1wYzh4eHhfc3BpLCBFU1BJX1NQSU0sIDApOwogCi0JcmV0dXJuIG1wYzh4eHhfc3BpLT5jb3VudDsKKwlyZXR1cm4gbXBjOHh4eF9zcGktPmNvdW50ID4gMCA/IC1FTVNHU0laRSA6IDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBmc2xfZXNwaV9hZGRyMmNtZCh1bnNpZ25lZCBpbnQgYWRkciwgdTggKmNtZCkKK3N0YXRpYyBpbnQgZnNsX2VzcGlfdHJhbnMoc3RydWN0IHNwaV9tZXNzYWdlICptLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0cmFucykKIHsKLQlpZiAoY21kKSB7Ci0JCWNtZFsxXSA9ICh1OCkoYWRkciA+PiAxNik7Ci0JCWNtZFsyXSA9ICh1OCkoYWRkciA+PiA4KTsKLQkJY21kWzNdID0gKHU4KShhZGRyID4+IDApOwotCX0KLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZnNsX2VzcGlfY21kMmFkZHIodTggKmNtZCkKLXsKLQlpZiAoY21kKQotCQlyZXR1cm4gY21kWzFdIDw8IDE2IHwgY21kWzJdIDw8IDggfCBjbWRbM10gPDwgMDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBmc2xfZXNwaV9kb190cmFucyhzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0sCi0JCQkJc3RydWN0IGZzbF9lc3BpX3RyYW5zZmVyICp0cikKLXsKKwlzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG0tPnNwaS0+bWFzdGVyKTsKIAlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gbS0+c3BpOwotCXN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCXN0cnVjdCBmc2xfZXNwaV90cmFuc2ZlciAqZXNwaV90cmFucyA9IHRyOwotCXN0cnVjdCBzcGlfbWVzc2FnZSBtZXNzYWdlOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQsICpmaXJzdCwgdHJhbnM7Ci0JaW50IHN0YXR1cyA9IDA7CisJaW50IHJldDsKIAotCXNwaV9tZXNzYWdlX2luaXQoJm1lc3NhZ2UpOwotCW1lbXNldCgmdHJhbnMsIDAsIHNpemVvZih0cmFucykpOworCWZzbF9lc3BpX2NvcHlfdG9fYnVmKG0sIG1zcGkpOworCWZzbF9lc3BpX3NldHVwX3RyYW5zZmVyKHNwaSwgdHJhbnMpOwogCi0JZmlyc3QgPSBsaXN0X2ZpcnN0X2VudHJ5KCZtLT50cmFuc2ZlcnMsIHN0cnVjdCBzcGlfdHJhbnNmZXIsCi0JCQl0cmFuc2Zlcl9saXN0KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKLQkJaWYgKChmaXJzdC0+Yml0c19wZXJfd29yZCAhPSB0LT5iaXRzX3Blcl93b3JkKSB8fAotCQkJKGZpcnN0LT5zcGVlZF9oeiAhPSB0LT5zcGVlZF9oeikpIHsKLQkJCWVzcGlfdHJhbnMtPnN0YXR1cyA9IC1FSU5WQUw7Ci0JCQlkZXZfZXJyKG1zcGktPmRldiwKLQkJCQkiYml0c19wZXJfd29yZC9zcGVlZF9oeiBzaG91bGQgYmUgc2FtZSBmb3IgdGhlIHNhbWUgU1BJIHRyYW5zZmVyXG4iKTsKLQkJCXJldHVybjsKLQkJfQorCXJldCA9IGZzbF9lc3BpX2J1ZnMoc3BpLCB0cmFucyk7CiAKLQkJdHJhbnMuc3BlZWRfaHogPSB0LT5zcGVlZF9oejsKLQkJdHJhbnMuYml0c19wZXJfd29yZCA9IHQtPmJpdHNfcGVyX3dvcmQ7Ci0JCXRyYW5zLmRlbGF5X3VzZWNzID0gbWF4KGZpcnN0LT5kZWxheV91c2VjcywgdC0+ZGVsYXlfdXNlY3MpOwotCX0KKwlpZiAodHJhbnMtPmRlbGF5X3VzZWNzKQorCQl1ZGVsYXkodHJhbnMtPmRlbGF5X3VzZWNzKTsKIAotCXRyYW5zLmxlbiA9IGVzcGlfdHJhbnMtPmxlbjsKLQl0cmFucy50eF9idWYgPSBlc3BpX3RyYW5zLT50eF9idWY7Ci0JdHJhbnMucnhfYnVmID0gZXNwaV90cmFucy0+cnhfYnVmOwotCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0cmFucywgJm1lc3NhZ2UpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbWVzc2FnZS50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKLQkJaWYgKHQtPmJpdHNfcGVyX3dvcmQgfHwgdC0+c3BlZWRfaHopIHsKLQkJCXN0YXR1cyA9IC1FSU5WQUw7Ci0KLQkJCXN0YXR1cyA9IGZzbF9lc3BpX3NldHVwX3RyYW5zZmVyKHNwaSwgdCk7Ci0JCQlpZiAoc3RhdHVzIDwgMCkKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmICh0LT5sZW4pCi0JCQlzdGF0dXMgPSBmc2xfZXNwaV9idWZzKHNwaSwgdCk7Ci0KLQkJaWYgKHN0YXR1cykgewotCQkJc3RhdHVzID0gLUVNU0dTSVpFOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAodC0+ZGVsYXlfdXNlY3MpCi0JCQl1ZGVsYXkodC0+ZGVsYXlfdXNlY3MpOwotCX0KLQotCWVzcGlfdHJhbnMtPnN0YXR1cyA9IHN0YXR1czsKIAlmc2xfZXNwaV9zZXR1cF90cmFuc2ZlcihzcGksIE5VTEwpOwotfQogCi1zdGF0aWMgdm9pZCBmc2xfZXNwaV9jbWRfdHJhbnMoc3RydWN0IHNwaV9tZXNzYWdlICptLAotCQkJCXN0cnVjdCBmc2xfZXNwaV90cmFuc2ZlciAqdHJhbnMsIHU4ICpyeF9idWZmKQotewotCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQ7Ci0JdTggKmxvY2FsX2J1ZjsKLQlpbnQgaSA9IDA7Ci0Jc3RydWN0IGZzbF9lc3BpX3RyYW5zZmVyICplc3BpX3RyYW5zID0gdHJhbnM7CisJaWYgKCFyZXQpCisJCWZzbF9lc3BpX2NvcHlfZnJvbV9idWYobSwgbXNwaSk7CiAKLQlsb2NhbF9idWYgPSBremFsbG9jKFNQQ09NX1RSQU5MRU5fTUFYLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWxvY2FsX2J1ZikgewotCQllc3BpX3RyYW5zLT5zdGF0dXMgPSAtRU5PTUVNOwotCQlyZXR1cm47Ci0JfQotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbS0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCWlmICh0LT50eF9idWYpIHsKLQkJCW1lbWNweShsb2NhbF9idWYgKyBpLCB0LT50eF9idWYsIHQtPmxlbik7Ci0JCQlpICs9IHQtPmxlbjsKLQkJfQotCX0KLQotCWVzcGlfdHJhbnMtPnR4X2J1ZiA9IGxvY2FsX2J1ZjsKLQllc3BpX3RyYW5zLT5yeF9idWYgPSBsb2NhbF9idWY7Ci0JZnNsX2VzcGlfZG9fdHJhbnMobSwgZXNwaV90cmFucyk7Ci0KLQllc3BpX3RyYW5zLT5hY3R1YWxfbGVuZ3RoID0gZXNwaV90cmFucy0+bGVuOwotCWtmcmVlKGxvY2FsX2J1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkIGZzbF9lc3BpX3J3X3RyYW5zKHN0cnVjdCBzcGlfbWVzc2FnZSAqbSwKLQkJCQlzdHJ1Y3QgZnNsX2VzcGlfdHJhbnNmZXIgKnRyYW5zLCB1OCAqcnhfYnVmZikKLXsKLQlzdHJ1Y3QgZnNsX2VzcGlfdHJhbnNmZXIgKmVzcGlfdHJhbnMgPSB0cmFuczsKLQl1bnNpZ25lZCBpbnQgdG90YWxfbGVuID0gZXNwaV90cmFucy0+bGVuOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQ7Ci0JdTggKmxvY2FsX2J1ZjsKLQl1OCAqcnhfYnVmID0gcnhfYnVmZjsKLQl1bnNpZ25lZCBpbnQgdHJhbnNfbGVuOwotCXVuc2lnbmVkIGludCBhZGRyOwotCXVuc2lnbmVkIGludCB0eF9vbmx5OwotCXVuc2lnbmVkIGludCByeF9wb3MgPSAwOwotCXVuc2lnbmVkIGludCBwb3M7Ci0JaW50IGksIGxvb3A7Ci0KLQlsb2NhbF9idWYgPSBremFsbG9jKFNQQ09NX1RSQU5MRU5fTUFYLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWxvY2FsX2J1ZikgewotCQllc3BpX3RyYW5zLT5zdGF0dXMgPSAtRU5PTUVNOwotCQlyZXR1cm47Ci0JfQotCi0JZm9yIChwb3MgPSAwLCBsb29wID0gMDsgcG9zIDwgdG90YWxfbGVuOyBwb3MgKz0gdHJhbnNfbGVuLCBsb29wKyspIHsKLQkJdHJhbnNfbGVuID0gdG90YWxfbGVuIC0gcG9zOwotCi0JCWkgPSAwOwotCQl0eF9vbmx5ID0gMDsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbS0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCQlpZiAodC0+dHhfYnVmKSB7Ci0JCQkJbWVtY3B5KGxvY2FsX2J1ZiArIGksIHQtPnR4X2J1ZiwgdC0+bGVuKTsKLQkJCQlpICs9IHQtPmxlbjsKLQkJCQlpZiAoIXQtPnJ4X2J1ZikKLQkJCQkJdHhfb25seSArPSB0LT5sZW47Ci0JCQl9Ci0JCX0KLQotCQkvKiBBZGQgYWRkaXRpb25hbCBUWCBieXRlcyB0byBjb21wZW5zYXRlIFNQQ09NX1RSQU5MRU5fTUFYICovCi0JCWlmIChsb29wID4gMCkKLQkJCXRyYW5zX2xlbiArPSB0eF9vbmx5OwotCi0JCWlmICh0cmFuc19sZW4gPiBTUENPTV9UUkFOTEVOX01BWCkKLQkJCXRyYW5zX2xlbiA9IFNQQ09NX1RSQU5MRU5fTUFYOwotCi0JCS8qIFVwZGF0ZSBkZXZpY2Ugb2Zmc2V0ICovCi0JCWlmIChwb3MgPiAwKSB7Ci0JCQlhZGRyID0gZnNsX2VzcGlfY21kMmFkZHIobG9jYWxfYnVmKTsKLQkJCWFkZHIgKz0gcnhfcG9zOwotCQkJZnNsX2VzcGlfYWRkcjJjbWQoYWRkciwgbG9jYWxfYnVmKTsKLQkJfQotCi0JCWVzcGlfdHJhbnMtPmxlbiA9IHRyYW5zX2xlbjsKLQkJZXNwaV90cmFucy0+dHhfYnVmID0gbG9jYWxfYnVmOwotCQllc3BpX3RyYW5zLT5yeF9idWYgPSBsb2NhbF9idWY7Ci0JCWZzbF9lc3BpX2RvX3RyYW5zKG0sIGVzcGlfdHJhbnMpOwotCi0JCS8qIElmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBSWCBieXRlIHRoZW4gY29weSBpdCB0byByeF9idWYgKi8KLQkJaWYgKHR4X29ubHkgPCBTUENPTV9UUkFOTEVOX01BWCkKLQkJCW1lbWNweShyeF9idWYgKyByeF9wb3MsIGVzcGlfdHJhbnMtPnJ4X2J1ZiArIHR4X29ubHksCi0JCQkJCXRyYW5zX2xlbiAtIHR4X29ubHkpOwotCi0JCXJ4X3BvcyArPSB0cmFuc19sZW4gLSB0eF9vbmx5OwotCi0JCWlmIChsb29wID4gMCkKLQkJCWVzcGlfdHJhbnMtPmFjdHVhbF9sZW5ndGggKz0gZXNwaV90cmFucy0+bGVuIC0gdHhfb25seTsKLQkJZWxzZQotCQkJZXNwaV90cmFucy0+YWN0dWFsX2xlbmd0aCArPSBlc3BpX3RyYW5zLT5sZW47Ci0JfQotCi0Ja2ZyZWUobG9jYWxfYnVmKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGZzbF9lc3BpX2RvX29uZV9tc2coc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKIAkJCSAgICAgICBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0pCiB7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqdDsKLQl1OCAqcnhfYnVmID0gTlVMTDsKLQl1bnNpZ25lZCBpbnQgbl90eCA9IDA7Ci0JdW5zaWduZWQgaW50IG5fcnggPSAwOwotCXVuc2lnbmVkIGludCB4ZmVyX2xlbiA9IDA7Ci0Jc3RydWN0IGZzbF9lc3BpX3RyYW5zZmVyIGVzcGlfdHJhbnM7CisJc3RydWN0IG1wYzh4eHhfc3BpICptc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtLT5zcGktPm1hc3Rlcik7CisJdW5zaWduZWQgaW50IGRlbGF5X3VzZWNzID0gMDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0LCB0cmFucyA9IHt9OworCWludCByZXQ7CisKKwlyZXQgPSBmc2xfZXNwaV9jaGVja19tZXNzYWdlKG0pOworCWlmIChyZXQpCisJCWdvdG8gb3V0OwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmbS0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7Ci0JCWlmICh0LT50eF9idWYpCi0JCQluX3R4ICs9IHQtPmxlbjsKLQkJaWYgKHQtPnJ4X2J1ZikgewotCQkJbl9yeCArPSB0LT5sZW47Ci0JCQlyeF9idWYgPSB0LT5yeF9idWY7Ci0JCX0KLQkJaWYgKCh0LT50eF9idWYpIHx8ICh0LT5yeF9idWYpKQotCQkJeGZlcl9sZW4gKz0gdC0+bGVuOworCQlpZiAodC0+ZGVsYXlfdXNlY3MgPiBkZWxheV91c2VjcykKKwkJCWRlbGF5X3VzZWNzID0gdC0+ZGVsYXlfdXNlY3M7CiAJfQogCi0JZXNwaV90cmFucy5uX3R4ID0gbl90eDsKLQllc3BpX3RyYW5zLm5fcnggPSBuX3J4OwotCWVzcGlfdHJhbnMubGVuID0geGZlcl9sZW47Ci0JZXNwaV90cmFucy5hY3R1YWxfbGVuZ3RoID0gMDsKLQllc3BpX3RyYW5zLnN0YXR1cyA9IDA7CisJdCA9IGxpc3RfZmlyc3RfZW50cnkoJm0tPnRyYW5zZmVycywgc3RydWN0IHNwaV90cmFuc2ZlciwKKwkJCSAgICAgdHJhbnNmZXJfbGlzdCk7CiAKLQlpZiAoIXJ4X2J1ZikKLQkJZnNsX2VzcGlfY21kX3RyYW5zKG0sICZlc3BpX3RyYW5zLCBOVUxMKTsKLQllbHNlCi0JCWZzbF9lc3BpX3J3X3RyYW5zKG0sICZlc3BpX3RyYW5zLCByeF9idWYpOworCXRyYW5zLmxlbiA9IG0tPmZyYW1lX2xlbmd0aDsKKwl0cmFucy5zcGVlZF9oeiA9IHQtPnNwZWVkX2h6OworCXRyYW5zLmJpdHNfcGVyX3dvcmQgPSB0LT5iaXRzX3Blcl93b3JkOworCXRyYW5zLmRlbGF5X3VzZWNzID0gZGVsYXlfdXNlY3M7CisJdHJhbnMudHhfYnVmID0gbXNwaS0+bG9jYWxfYnVmOworCXRyYW5zLnJ4X2J1ZiA9IG1zcGktPmxvY2FsX2J1ZjsKIAotCW0tPmFjdHVhbF9sZW5ndGggPSBlc3BpX3RyYW5zLmFjdHVhbF9sZW5ndGg7Ci0JbS0+c3RhdHVzID0gZXNwaV90cmFucy5zdGF0dXM7CisJaWYgKHRyYW5zLmxlbikKKwkJcmV0ID0gZnNsX2VzcGlfdHJhbnMobSwgJnRyYW5zKTsKKworCW0tPmFjdHVhbF9sZW5ndGggPSByZXQgPyAwIDogdHJhbnMubGVuOworb3V0OgorCWlmIChtLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKQorCQltLT5zdGF0dXMgPSByZXQ7CisKIAlzcGlfZmluYWxpemVfY3VycmVudF9tZXNzYWdlKG1hc3Rlcik7Ci0JcmV0dXJuIDA7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGZzbF9lc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJc3RydWN0IG1wYzh4eHhfc3BpICptcGM4eHh4X3NwaTsKLQlzdHJ1Y3QgZnNsX2VzcGlfcmVnICpyZWdfYmFzZTsKLQlpbnQgcmV0dmFsOwotCXUzMiBod19tb2RlOwogCXUzMiBsb29wX21vZGU7CiAJc3RydWN0IHNwaV9tcGM4eHh4X2NzICpjcyA9IHNwaV9nZXRfY3RsZGF0YShzcGkpOwogCkBAIC00OTEsMTMgKzM3NSwxMSBAQAogCX0KIAogCW1wYzh4eHhfc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0JcmVnX2Jhc2UgPSBtcGM4eHh4X3NwaS0+cmVnX2Jhc2U7CiAKIAlwbV9ydW50aW1lX2dldF9zeW5jKG1wYzh4eHhfc3BpLT5kZXYpOwogCi0JaHdfbW9kZSA9IGNzLT5od19tb2RlOyAvKiBTYXZlIG9yaWdpbmFsIHNldHRpbmdzICovCi0JY3MtPmh3X21vZGUgPSBtcGM4eHh4X3NwaV9yZWFkX3JlZygKLQkJCSZyZWdfYmFzZS0+Y3Ntb2RlW3NwaS0+Y2hpcF9zZWxlY3RdKTsKKwljcy0+aHdfbW9kZSA9IGZzbF9lc3BpX3JlYWRfcmVnKG1wYzh4eHhfc3BpLAorCQkJCQkgICBFU1BJX1NQTU9ERXgoc3BpLT5jaGlwX3NlbGVjdCkpOwogCS8qIG1hc2sgb3V0IGJpdHMgd2UgYXJlIGdvaW5nIHRvIHNldCAqLwogCWNzLT5od19tb2RlICY9IH4oQ1NNT0RFX0NQX0JFR0lOX0VER0VDTEsgfCBDU01PREVfQ0lfSU5BQ1RJVkVISUdICiAJCQkgfCBDU01PREVfUkVWKTsKQEAgLTUxMCwyMSArMzkyLDE3IEBACiAJCWNzLT5od19tb2RlIHw9IENTTU9ERV9SRVY7CiAKIAkvKiBIYW5kbGUgdGhlIGxvb3AgbW9kZSAqLwotCWxvb3BfbW9kZSA9IG1wYzh4eHhfc3BpX3JlYWRfcmVnKCZyZWdfYmFzZS0+bW9kZSk7CisJbG9vcF9tb2RlID0gZnNsX2VzcGlfcmVhZF9yZWcobXBjOHh4eF9zcGksIEVTUElfU1BNT0RFKTsKIAlsb29wX21vZGUgJj0gflNQTU9ERV9MT09QOwogCWlmIChzcGktPm1vZGUgJiBTUElfTE9PUCkKIAkJbG9vcF9tb2RlIHw9IFNQTU9ERV9MT09QOwotCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPm1vZGUsIGxvb3BfbW9kZSk7CisJZnNsX2VzcGlfd3JpdGVfcmVnKG1wYzh4eHhfc3BpLCBFU1BJX1NQTU9ERSwgbG9vcF9tb2RlKTsKIAotCXJldHZhbCA9IGZzbF9lc3BpX3NldHVwX3RyYW5zZmVyKHNwaSwgTlVMTCk7CisJZnNsX2VzcGlfc2V0dXBfdHJhbnNmZXIoc3BpLCBOVUxMKTsKIAogCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3kobXBjOHh4eF9zcGktPmRldik7CiAJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQobXBjOHh4eF9zcGktPmRldik7CiAKLQlpZiAocmV0dmFsIDwgMCkgewotCQljcy0+aHdfbW9kZSA9IGh3X21vZGU7IC8qIFJlc3RvcmUgc2V0dGluZ3MgKi8KLQkJcmV0dXJuIHJldHZhbDsKLQl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUzNiwxMiArNDE0LDEwIEBACiAJc3BpX3NldF9jdGxkYXRhKHNwaSwgTlVMTCk7CiB9CiAKLXZvaWQgZnNsX2VzcGlfY3B1X2lycShzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1zcGksIHUzMiBldmVudHMpCitzdGF0aWMgdm9pZCBmc2xfZXNwaV9jcHVfaXJxKHN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSwgdTMyIGV2ZW50cykKIHsKLQlzdHJ1Y3QgZnNsX2VzcGlfcmVnICpyZWdfYmFzZSA9IG1zcGktPnJlZ19iYXNlOwotCiAJLyogV2UgbmVlZCBoYW5kbGUgUlggZmlyc3QgKi8KLQlpZiAoZXZlbnRzICYgU1BJRV9ORSkgeworCWlmIChldmVudHMgJiBTUElFX1JORSkgewogCQl1MzIgcnhfZGF0YSwgdG1wOwogCQl1OCByeF9kYXRhXzg7CiAJCWludCByeF9ucl9ieXRlcyA9IDQ7CkBAIC01NTEsNyArNDI3LDcgQEAKIAkJaWYgKFNQSUVfUlhDTlQoZXZlbnRzKSA8IG1pbig0LCBtc3BpLT5sZW4pKSB7CiAJCQlyZXQgPSBzcGluX2V2ZW50X3RpbWVvdXQoCiAJCQkJIShTUElFX1JYQ05UKGV2ZW50cyA9Ci0JCQkJbXBjOHh4eF9zcGlfcmVhZF9yZWcoJnJlZ19iYXNlLT5ldmVudCkpIDwKKwkJCQlmc2xfZXNwaV9yZWFkX3JlZyhtc3BpLCBFU1BJX1NQSUUpKSA8CiAJCQkJCQltaW4oNCwgbXNwaS0+bGVuKSksCiAJCQkJCQkxMDAwMCwgMCk7IC8qIDEwIG1zZWMgKi8KIAkJCWlmICghcmV0KQpAQCAtNTYwLDEwICs0MzYsMTAgQEAKIAkJfQogCiAJCWlmIChtc3BpLT5sZW4gPj0gNCkgewotCQkJcnhfZGF0YSA9IG1wYzh4eHhfc3BpX3JlYWRfcmVnKCZyZWdfYmFzZS0+cmVjZWl2ZSk7CisJCQlyeF9kYXRhID0gZnNsX2VzcGlfcmVhZF9yZWcobXNwaSwgRVNQSV9TUElSRik7CiAJCX0gZWxzZSBpZiAobXNwaS0+bGVuIDw9IDApIHsKIAkJCWRldl9lcnIobXNwaS0+ZGV2LAotCQkJCSJ1bmV4cGVjdGVkIFJYKFNQSUVfTkUpIGludGVycnVwdCBvY2N1cnJlZCxcbiIKKwkJCQkidW5leHBlY3RlZCBSWChTUElFX1JORSkgaW50ZXJydXB0IG9jY3VycmVkLFxuIgogCQkJCSIobG9jYWwgcnhsZW4gJWQgYnl0ZXMsIHJlZyByeGxlbiAlZCBieXRlcylcbiIsCiAJCQkJbWluKDQsIG1zcGktPmxlbiksIFNQSUVfUlhDTlQoZXZlbnRzKSk7CiAJCQlyeF9ucl9ieXRlcyA9IDA7CkBAIC01NzIsNyArNDQ4LDggQEAKIAkJCXRtcCA9IG1zcGktPmxlbjsKIAkJCXJ4X2RhdGEgPSAwOwogCQkJd2hpbGUgKHRtcC0tKSB7Ci0JCQkJcnhfZGF0YV84ID0gaW5fOCgodTggKikmcmVnX2Jhc2UtPnJlY2VpdmUpOworCQkJCXJ4X2RhdGFfOCA9IGZzbF9lc3BpX3JlYWRfcmVnOChtc3BpLAorCQkJCQkJCSAgICAgICBFU1BJX1NQSVJGKTsKIAkJCQlyeF9kYXRhIHw9IChyeF9kYXRhXzggPDwgKHRtcCAqIDgpKTsKIAkJCX0KIApAQCAtNTg1LDMwICs0NjIsMjQgQEAKIAkJCW1zcGktPmdldF9yeChyeF9kYXRhLCBtc3BpKTsKIAl9CiAKLQlpZiAoIShldmVudHMgJiBTUElFX05GKSkgeworCWlmICghKGV2ZW50cyAmIFNQSUVfVE5GKSkgewogCQlpbnQgcmV0OwogCiAJCS8qIHNwaW4gdW50aWwgVFggaXMgZG9uZSAqLwotCQlyZXQgPSBzcGluX2V2ZW50X3RpbWVvdXQoKChldmVudHMgPSBtcGM4eHh4X3NwaV9yZWFkX3JlZygKLQkJCQkmcmVnX2Jhc2UtPmV2ZW50KSkgJiBTUElFX05GKSwgMTAwMCwgMCk7CisJCXJldCA9IHNwaW5fZXZlbnRfdGltZW91dCgoKGV2ZW50cyA9IGZzbF9lc3BpX3JlYWRfcmVnKAorCQkJCW1zcGksIEVTUElfU1BJRSkpICYgU1BJRV9UTkYpLCAxMDAwLCAwKTsKIAkJaWYgKCFyZXQpIHsKLQkJCWRldl9lcnIobXNwaS0+ZGV2LCAidGlyZWQgd2FpdGluZyBmb3IgU1BJRV9ORlxuIik7Ci0KLQkJCS8qIENsZWFyIHRoZSBTUElFIGJpdHMgKi8KLQkJCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPmV2ZW50LCBldmVudHMpOworCQkJZGV2X2Vycihtc3BpLT5kZXYsICJ0aXJlZCB3YWl0aW5nIGZvciBTUElFX1RORlxuIik7CiAJCQljb21wbGV0ZSgmbXNwaS0+ZG9uZSk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CiAKLQkvKiBDbGVhciB0aGUgZXZlbnRzICovCi0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+ZXZlbnQsIGV2ZW50cyk7Ci0KIAltc3BpLT5jb3VudCAtPSAxOwogCWlmIChtc3BpLT5jb3VudCkgewogCQl1MzIgd29yZCA9IG1zcGktPmdldF90eChtc3BpKTsKIAotCQltcGM4eHh4X3NwaV93cml0ZV9yZWcoJnJlZ19iYXNlLT50cmFuc21pdCwgd29yZCk7CisJCWZzbF9lc3BpX3dyaXRlX3JlZyhtc3BpLCBFU1BJX1NQSVRGLCB3b3JkKTsKIAl9IGVsc2UgewogCQljb21wbGV0ZSgmbXNwaS0+ZG9uZSk7CiAJfQpAQCAtNjE3LDIwICs0ODgsMjEgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBmc2xfZXNwaV9pcnEoczMyIGlycSwgdm9pZCAqY29udGV4dF9kYXRhKQogewogCXN0cnVjdCBtcGM4eHh4X3NwaSAqbXNwaSA9IGNvbnRleHRfZGF0YTsKLQlzdHJ1Y3QgZnNsX2VzcGlfcmVnICpyZWdfYmFzZSA9IG1zcGktPnJlZ19iYXNlOwotCWlycXJldHVybl90IHJldCA9IElSUV9OT05FOwogCXUzMiBldmVudHM7CiAKIAkvKiBHZXQgaW50ZXJydXB0IGV2ZW50cyh0eC9yeCkgKi8KLQlldmVudHMgPSBtcGM4eHh4X3NwaV9yZWFkX3JlZygmcmVnX2Jhc2UtPmV2ZW50KTsKLQlpZiAoZXZlbnRzKQotCQlyZXQgPSBJUlFfSEFORExFRDsKKwlldmVudHMgPSBmc2xfZXNwaV9yZWFkX3JlZyhtc3BpLCBFU1BJX1NQSUUpOworCWlmICghZXZlbnRzKQorCQlyZXR1cm4gSVJRX05PTkU7CiAKIAlkZXZfdmRiZyhtc3BpLT5kZXYsICIlczogZXZlbnRzICV4XG4iLCBfX2Z1bmNfXywgZXZlbnRzKTsKIAogCWZzbF9lc3BpX2NwdV9pcnEobXNwaSwgZXZlbnRzKTsKIAotCXJldHVybiByZXQ7CisJLyogQ2xlYXIgdGhlIGV2ZW50cyAqLworCWZzbF9lc3BpX3dyaXRlX3JlZyhtc3BpLCBFU1BJX1NQSUUsIGV2ZW50cyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKICNpZmRlZiBDT05GSUdfUE0KQEAgLTYzOCwxMiArNTEwLDExIEBACiB7CiAJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBtcGM4eHh4X3NwaSAqbXBjOHh4eF9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0Jc3RydWN0IGZzbF9lc3BpX3JlZyAqcmVnX2Jhc2UgPSBtcGM4eHh4X3NwaS0+cmVnX2Jhc2U7CiAJdTMyIHJlZ3ZhbDsKIAotCXJlZ3ZhbCA9IG1wYzh4eHhfc3BpX3JlYWRfcmVnKCZyZWdfYmFzZS0+bW9kZSk7CisJcmVndmFsID0gZnNsX2VzcGlfcmVhZF9yZWcobXBjOHh4eF9zcGksIEVTUElfU1BNT0RFKTsKIAlyZWd2YWwgJj0gflNQTU9ERV9FTkFCTEU7Ci0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+bW9kZSwgcmVndmFsKTsKKwlmc2xfZXNwaV93cml0ZV9yZWcobXBjOHh4eF9zcGksIEVTUElfU1BNT0RFLCByZWd2YWwpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02NTIsMzkgKzUyMywzNSBAQAogewogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgbXBjOHh4eF9zcGkgKm1wYzh4eHhfc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwotCXN0cnVjdCBmc2xfZXNwaV9yZWcgKnJlZ19iYXNlID0gbXBjOHh4eF9zcGktPnJlZ19iYXNlOwogCXUzMiByZWd2YWw7CiAKLQlyZWd2YWwgPSBtcGM4eHh4X3NwaV9yZWFkX3JlZygmcmVnX2Jhc2UtPm1vZGUpOworCXJlZ3ZhbCA9IGZzbF9lc3BpX3JlYWRfcmVnKG1wYzh4eHhfc3BpLCBFU1BJX1NQTU9ERSk7CiAJcmVndmFsIHw9IFNQTU9ERV9FTkFCTEU7Ci0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+bW9kZSwgcmVndmFsKTsKKwlmc2xfZXNwaV93cml0ZV9yZWcobXBjOHh4eF9zcGksIEVTUElfU1BNT0RFLCByZWd2YWwpOwogCiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYKIAotc3RhdGljIHNpemVfdCBmc2xfZXNwaV9tYXhfdHJhbnNmZXJfc2l6ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQorc3RhdGljIHNpemVfdCBmc2xfZXNwaV9tYXhfbWVzc2FnZV9zaXplKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJcmV0dXJuIFNQQ09NX1RSQU5MRU5fTUFYOwogfQogCi1zdGF0aWMgc3RydWN0IHNwaV9tYXN0ZXIgKiBmc2xfZXNwaV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCByZXNvdXJjZSAqbWVtLCB1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIGludCBmc2xfZXNwaV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqbWVtLAorCQkJICB1bnNpZ25lZCBpbnQgaXJxKQogewogCXN0cnVjdCBmc2xfc3BpX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShkZXYpOwogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CiAJc3RydWN0IG1wYzh4eHhfc3BpICptcGM4eHh4X3NwaTsKLQlzdHJ1Y3QgZnNsX2VzcGlfcmVnICpyZWdfYmFzZTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5jOwogCWNvbnN0IF9fYmUzMiAqcHJvcDsKIAl1MzIgcmVndmFsLCBjc21vZGU7Ci0JaW50IGksIGxlbiwgcmV0ID0gMDsKKwlpbnQgaSwgbGVuLCByZXQ7CiAKIAltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKGRldiwgc2l6ZW9mKHN0cnVjdCBtcGM4eHh4X3NwaSkpOwotCWlmICghbWFzdGVyKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyOwotCX0KKwlpZiAoIW1hc3RlcikKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlkZXZfc2V0X2RydmRhdGEoZGV2LCBtYXN0ZXIpOwogCkBAIC02OTUsMTggKzU2MiwyMyBAQAogCW1hc3Rlci0+Y2xlYW51cCA9IGZzbF9lc3BpX2NsZWFudXA7CiAJbWFzdGVyLT50cmFuc2Zlcl9vbmVfbWVzc2FnZSA9IGZzbF9lc3BpX2RvX29uZV9tc2c7CiAJbWFzdGVyLT5hdXRvX3J1bnRpbWVfcG0gPSB0cnVlOwotCW1hc3Rlci0+bWF4X3RyYW5zZmVyX3NpemUgPSBmc2xfZXNwaV9tYXhfdHJhbnNmZXJfc2l6ZTsKKwltYXN0ZXItPm1heF9tZXNzYWdlX3NpemUgPSBmc2xfZXNwaV9tYXhfbWVzc2FnZV9zaXplOwogCiAJbXBjOHh4eF9zcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CiAKKwltcGM4eHh4X3NwaS0+bG9jYWxfYnVmID0KKwkJZGV2bV9rbWFsbG9jKGRldiwgU1BDT01fVFJBTkxFTl9NQVgsIEdGUF9LRVJORUwpOworCWlmICghbXBjOHh4eF9zcGktPmxvY2FsX2J1ZikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9wcm9iZTsKKwl9CisKIAltcGM4eHh4X3NwaS0+cmVnX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCBtZW0pOwogCWlmIChJU19FUlIobXBjOHh4eF9zcGktPnJlZ19iYXNlKSkgewogCQlyZXQgPSBQVFJfRVJSKG1wYzh4eHhfc3BpLT5yZWdfYmFzZSk7CiAJCWdvdG8gZXJyX3Byb2JlOwogCX0KIAotCXJlZ19iYXNlID0gbXBjOHh4eF9zcGktPnJlZ19iYXNlOwotCiAJLyogUmVnaXN0ZXIgZm9yIFNQSSBJbnRlcnJ1cHQgKi8KIAlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgbXBjOHh4eF9zcGktPmlycSwgZnNsX2VzcGlfaXJxLAogCQkJICAwLCAiZnNsX2VzcGkiLCBtcGM4eHh4X3NwaSk7CkBAIC03MTksMTAgKzU5MSwxMCBAQAogCX0KIAogCS8qIFNQSSBjb250cm9sbGVyIGluaXRpYWxpemF0aW9ucyAqLwotCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPm1vZGUsIDApOwotCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPm1hc2ssIDApOwotCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPmNvbW1hbmQsIDApOwotCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPmV2ZW50LCAweGZmZmZmZmZmKTsKKwlmc2xfZXNwaV93cml0ZV9yZWcobXBjOHh4eF9zcGksIEVTUElfU1BNT0RFLCAwKTsKKwlmc2xfZXNwaV93cml0ZV9yZWcobXBjOHh4eF9zcGksIEVTUElfU1BJTSwgMCk7CisJZnNsX2VzcGlfd3JpdGVfcmVnKG1wYzh4eHhfc3BpLCBFU1BJX1NQQ09NLCAwKTsKKwlmc2xfZXNwaV93cml0ZV9yZWcobXBjOHh4eF9zcGksIEVTUElfU1BJRSwgMHhmZmZmZmZmZik7CiAKIAkvKiBJbml0IGVTUEkgQ1MgbW9kZSByZWdpc3RlciAqLwogCWZvcl9lYWNoX2F2YWlsYWJsZV9jaGlsZF9vZl9ub2RlKG1hc3Rlci0+ZGV2Lm9mX25vZGUsIG5jKSB7CkBAIC03NDcsNyArNjE5LDcgQEAKIAkJCWNzbW9kZSAmPSB+KENTTU9ERV9BRlQoMHhmKSk7CiAJCQljc21vZGUgfD0gQ1NNT0RFX0FGVChiZTMyX3RvX2NwdXAocHJvcCkpOwogCQl9Ci0JCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPmNzbW9kZVtpXSwgY3Ntb2RlKTsKKwkJZnNsX2VzcGlfd3JpdGVfcmVnKG1wYzh4eHhfc3BpLCBFU1BJX1NQTU9ERXgoaSksIGNzbW9kZSk7CiAKIAkJZGV2X2luZm8oZGV2LCAiY3M9JWQsIGluaXRfY3Ntb2RlPTB4JXhcbiIsIGksIGNzbW9kZSk7CiAJfQpAQCAtNzU1LDcgKzYyNyw3IEBACiAJLyogRW5hYmxlIFNQSSBpbnRlcmZhY2UgKi8KIAlyZWd2YWwgPSBwZGF0YS0+aW5pdGlhbF9zcG1vZGUgfCBTUE1PREVfSU5JVF9WQUwgfCBTUE1PREVfRU5BQkxFOwogCi0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+bW9kZSwgcmVndmFsKTsKKwlmc2xfZXNwaV93cml0ZV9yZWcobXBjOHh4eF9zcGksIEVTUElfU1BNT0RFLCByZWd2YWwpOwogCiAJcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXkoZGV2LCBBVVRPU1VTUEVORF9USU1FT1VUKTsKIAlwbV9ydW50aW1lX3VzZV9hdXRvc3VzcGVuZChkZXYpOwpAQCAtNzY3LDEyICs2MzksMTMgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJfcG07CiAKLQlkZXZfaW5mbyhkZXYsICJhdCAweCVwIChpcnEgPSAlZClcbiIsIHJlZ19iYXNlLCBtcGM4eHh4X3NwaS0+aXJxKTsKKwlkZXZfaW5mbyhkZXYsICJhdCAweCVwIChpcnEgPSAlZClcbiIsIG1wYzh4eHhfc3BpLT5yZWdfYmFzZSwKKwkJIG1wYzh4eHhfc3BpLT5pcnEpOwogCiAJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShkZXYpOwogCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGRldik7CiAKLQlyZXR1cm4gbWFzdGVyOworCXJldHVybiAwOwogCiBlcnJfcG06CiAJcG1fcnVudGltZV9wdXRfbm9pZGxlKGRldik7CkBAIC03ODAsOCArNjUzLDcgQEAKIAlwbV9ydW50aW1lX3NldF9zdXNwZW5kZWQoZGV2KTsKIGVycl9wcm9iZToKIAlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOwotZXJyOgotCXJldHVybiBFUlJfUFRSKHJldCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBvZl9mc2xfZXNwaV9nZXRfY2hpcHNlbGVjdHMoc3RydWN0IGRldmljZSAqZGV2KQpAQCAtODA3LDEwICs2NzksOSBAQAogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZvZmRldi0+ZGV2OwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBvZmRldi0+ZGV2Lm9mX25vZGU7Ci0Jc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKIAlzdHJ1Y3QgcmVzb3VyY2UgbWVtOwogCXVuc2lnbmVkIGludCBpcnE7Ci0JaW50IHJldCA9IC1FTk9NRU07CisJaW50IHJldDsKIAogCXJldCA9IG9mX21wYzh4eHhfc3BpX3Byb2JlKG9mZGV2KTsKIAlpZiAocmV0KQpAQCAtODE4LDI4ICs2ODksMTcgQEAKIAogCXJldCA9IG9mX2ZzbF9lc3BpX2dldF9jaGlwc2VsZWN0cyhkZXYpOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyOworCQlyZXR1cm4gcmV0OwogCiAJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJm1lbSk7CiAJaWYgKHJldCkKLQkJZ290byBlcnI7CisJCXJldHVybiByZXQ7CiAKIAlpcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7Ci0JaWYgKCFpcnEpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQorCWlmICghaXJxKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCW1hc3RlciA9IGZzbF9lc3BpX3Byb2JlKGRldiwgJm1lbSwgaXJxKTsKLQlpZiAoSVNfRVJSKG1hc3RlcikpIHsKLQkJcmV0ID0gUFRSX0VSUihtYXN0ZXIpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotZXJyOgotCXJldHVybiByZXQ7CisJcmV0dXJuIGZzbF9lc3BpX3Byb2JlKGRldiwgJm1lbSwgaXJxKTsKIH0KIAogc3RhdGljIGludCBvZl9mc2xfZXNwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQpAQCAtODczLDI3ICs3MzMsMjYgQEAKIAlzdHJ1Y3QgZnNsX3NwaV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoZGV2KTsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IG1wYzh4eHhfc3BpICptcGM4eHh4X3NwaTsKLQlzdHJ1Y3QgZnNsX2VzcGlfcmVnICpyZWdfYmFzZTsKIAl1MzIgcmVndmFsOwogCWludCBpLCByZXQ7CiAKIAltcGM4eHh4X3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQlyZWdfYmFzZSA9IG1wYzh4eHhfc3BpLT5yZWdfYmFzZTsKIAogCS8qIFNQSSBjb250cm9sbGVyIGluaXRpYWxpemF0aW9ucyAqLwotCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPm1vZGUsIDApOwotCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPm1hc2ssIDApOwotCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPmNvbW1hbmQsIDApOwotCW1wYzh4eHhfc3BpX3dyaXRlX3JlZygmcmVnX2Jhc2UtPmV2ZW50LCAweGZmZmZmZmZmKTsKKwlmc2xfZXNwaV93cml0ZV9yZWcobXBjOHh4eF9zcGksIEVTUElfU1BNT0RFLCAwKTsKKwlmc2xfZXNwaV93cml0ZV9yZWcobXBjOHh4eF9zcGksIEVTUElfU1BJTSwgMCk7CisJZnNsX2VzcGlfd3JpdGVfcmVnKG1wYzh4eHhfc3BpLCBFU1BJX1NQQ09NLCAwKTsKKwlmc2xfZXNwaV93cml0ZV9yZWcobXBjOHh4eF9zcGksIEVTUElfU1BJRSwgMHhmZmZmZmZmZik7CiAKIAkvKiBJbml0IGVTUEkgQ1MgbW9kZSByZWdpc3RlciAqLwogCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bWF4X2NoaXBzZWxlY3Q7IGkrKykKLQkJbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+Y3Ntb2RlW2ldLCBDU01PREVfSU5JVF9WQUwpOworCQlmc2xfZXNwaV93cml0ZV9yZWcobXBjOHh4eF9zcGksIEVTUElfU1BNT0RFeChpKSwKKwkJCQkgICAgICBDU01PREVfSU5JVF9WQUwpOwogCiAJLyogRW5hYmxlIFNQSSBpbnRlcmZhY2UgKi8KIAlyZWd2YWwgPSBwZGF0YS0+aW5pdGlhbF9zcG1vZGUgfCBTUE1PREVfSU5JVF9WQUwgfCBTUE1PREVfRU5BQkxFOwogCi0JbXBjOHh4eF9zcGlfd3JpdGVfcmVnKCZyZWdfYmFzZS0+bW9kZSwgcmVndmFsKTsKKwlmc2xfZXNwaV93cml0ZV9yZWcobXBjOHh4eF9zcGksIEVTUElfU1BNT0RFLCByZWd2YWwpOwogCiAJcmV0ID0gcG1fcnVudGltZV9mb3JjZV9yZXN1bWUoZGV2KTsKIAlpZiAocmV0IDwgMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1mc2wtbGliLmggYi9kcml2ZXJzL3NwaS9zcGktZnNsLWxpYi5oCmluZGV4IDg0ZjVkY2IuLjI5MjVjODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1mc2wtbGliLmgKKysrIGIvZHJpdmVycy9zcGkvc3BpLWZzbC1saWIuaApAQCAtMjMsMTMgKzIzLDE0IEBACiAvKiBTUEkvZVNQSSBDb250cm9sbGVyIGRyaXZlcidzIHByaXZhdGUgZGF0YS4gKi8KIHN0cnVjdCBtcGM4eHh4X3NwaSB7CiAJc3RydWN0IGRldmljZSAqZGV2OwotCXZvaWQgKnJlZ19iYXNlOworCXZvaWQgX19pb21lbSAqcmVnX2Jhc2U7CiAKIAkvKiByeCAmIHR4IGJ1ZnMgZnJvbSB0aGUgc3BpX3RyYW5zZmVyICovCiAJY29uc3Qgdm9pZCAqdHg7CiAJdm9pZCAqcng7CiAjaWYgSVNfRU5BQkxFRChDT05GSUdfU1BJX0ZTTF9FU1BJKQogCWludCBsZW47CisJdTggKmxvY2FsX2J1ZjsKICNlbmRpZgogCiAJaW50IHN1YmJsb2NrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWltZy1zcGZpLmMgYi9kcml2ZXJzL3NwaS9zcGktaW1nLXNwZmkuYwppbmRleCA4MjNjYmM5Li43YTM3MDkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktaW1nLXNwZmkuYworKysgYi9kcml2ZXJzL3NwaS9zcGktaW1nLXNwZmkuYwpAQCAtNzIwLDggKzcyMCw2IEBACiAJCWNsa19kaXNhYmxlX3VucHJlcGFyZShzcGZpLT5zeXNfY2xrKTsKIAl9CiAKLQlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1pbXguYyBiL2RyaXZlcnMvc3BpL3NwaS1pbXguYwppbmRleCBmNjNjYjMwLi5kZWI3ODJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktaW14LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWlteC5jCkBAIC0xODYsMTcgKzE4NiwxOSBAQAogCiAvKiBNWDEsIE1YMzEsIE1YMzUsIE1YNTEgQ1NQSSAqLwogc3RhdGljIHVuc2lnbmVkIGludCBzcGlfaW14X2Nsa2Rpdl8yKHVuc2lnbmVkIGludCBmaW4sCi0JCXVuc2lnbmVkIGludCBmc3BpKQorCQl1bnNpZ25lZCBpbnQgZnNwaSwgdW5zaWduZWQgaW50ICpmcmVzKQogewogCWludCBpLCBkaXYgPSA0OwogCiAJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgewogCQlpZiAoZnNwaSAqIGRpdiA+PSBmaW4pCi0JCQlyZXR1cm4gaTsKKwkJCWdvdG8gb3V0OwogCQlkaXYgPDw9IDE7CiAJfQogCi0JcmV0dXJuIDc7CitvdXQ6CisJKmZyZXMgPSBmaW4gLyBkaXY7CisJcmV0dXJuIGk7CiB9CiAKIHN0YXRpYyBpbnQgc3BpX2lteF9ieXRlc19wZXJfd29yZChjb25zdCBpbnQgYnB3KQpAQCAtNDUzLDYgKzQ1NSw5IEBACiAjZGVmaW5lIE1YMzFfQ1NQSVNUQVRVUwkJMHgxNAogI2RlZmluZSBNWDMxX1NUQVRVU19SUgkJKDEgPDwgMykKIAorI2RlZmluZSBNWDMxX0NTUElfVEVTVFJFRwkweDFDCisjZGVmaW5lIE1YMzFfVEVTVF9MQkMJCSgxIDw8IDE0KQorCiAvKiBUaGVzZSBmdW5jdGlvbnMgYWxzbyB3b3JrIGZvciB0aGUgaS5NWDM1LCBidXQgYmUgYXdhcmUgdGhhdAogICogdGhlIGkuTVgzNSBoYXMgYSBzbGlnaHRseSBkaWZmZXJlbnQgcmVnaXN0ZXIgbGF5b3V0IGZvciBiaXRzCiAgKiB3ZSBkbyBub3QgdXNlIGhlcmUuCkBAIC00ODIsOSArNDg3LDExIEBACiB7CiAJc3RydWN0IHNwaV9pbXhfZGF0YSAqc3BpX2lteCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwogCXVuc2lnbmVkIGludCByZWcgPSBNWDMxX0NTUElDVFJMX0VOQUJMRSB8IE1YMzFfQ1NQSUNUUkxfTUFTVEVSOworCXVuc2lnbmVkIGludCBjbGs7CiAKLQlyZWcgfD0gc3BpX2lteF9jbGtkaXZfMihzcGlfaW14LT5zcGlfY2xrLCBjb25maWctPnNwZWVkX2h6KSA8PAorCXJlZyB8PSBzcGlfaW14X2Nsa2Rpdl8yKHNwaV9pbXgtPnNwaV9jbGssIGNvbmZpZy0+c3BlZWRfaHosICZjbGspIDw8CiAJCU1YMzFfQ1NQSUNUUkxfRFJfU0hJRlQ7CisJc3BpX2lteC0+c3BpX2J1c19jbGsgPSBjbGs7CiAKIAlpZiAoaXNfaW14MzVfY3NwaShzcGlfaW14KSkgewogCQlyZWcgfD0gKGNvbmZpZy0+YnB3IC0gMSkgPDwgTVgzNV9DU1BJQ1RSTF9CTF9TSElGVDsKQEAgLTUwNiw2ICs1MTMsMTMgQEAKIAogCXdyaXRlbChyZWcsIHNwaV9pbXgtPmJhc2UgKyBNWENfQ1NQSUNUUkwpOwogCisJcmVnID0gcmVhZGwoc3BpX2lteC0+YmFzZSArIE1YMzFfQ1NQSV9URVNUUkVHKTsKKwlpZiAoc3BpLT5tb2RlICYgU1BJX0xPT1ApCisJCXJlZyB8PSBNWDMxX1RFU1RfTEJDOworCWVsc2UKKwkJcmVnICY9IH5NWDMxX1RFU1RfTEJDOworCXdyaXRlbChyZWcsIHNwaV9pbXgtPmJhc2UgKyBNWDMxX0NTUElfVEVTVFJFRyk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjI1LDkgKzYzOSwxMiBAQAogewogCXN0cnVjdCBzcGlfaW14X2RhdGEgKnNwaV9pbXggPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKIAl1bnNpZ25lZCBpbnQgcmVnID0gTVgxX0NTUElDVFJMX0VOQUJMRSB8IE1YMV9DU1BJQ1RSTF9NQVNURVI7CisJdW5zaWduZWQgaW50IGNsazsKIAotCXJlZyB8PSBzcGlfaW14X2Nsa2Rpdl8yKHNwaV9pbXgtPnNwaV9jbGssIGNvbmZpZy0+c3BlZWRfaHopIDw8CisJcmVnIHw9IHNwaV9pbXhfY2xrZGl2XzIoc3BpX2lteC0+c3BpX2NsaywgY29uZmlnLT5zcGVlZF9oeiwgJmNsaykgPDwKIAkJTVgxX0NTUElDVFJMX0RSX1NISUZUOworCXNwaV9pbXgtPnNwaV9idXNfY2xrID0gY2xrOworCiAJcmVnIHw9IGNvbmZpZy0+YnB3IC0gMTsKIAogCWlmIChzcGktPm1vZGUgJiBTUElfQ1BIQSkKQEAgLTExNzksNyArMTE5Niw3IEBACiAJc3BpX2lteC0+Yml0YmFuZy5tYXN0ZXItPnByZXBhcmVfbWVzc2FnZSA9IHNwaV9pbXhfcHJlcGFyZV9tZXNzYWdlOwogCXNwaV9pbXgtPmJpdGJhbmcubWFzdGVyLT51bnByZXBhcmVfbWVzc2FnZSA9IHNwaV9pbXhfdW5wcmVwYXJlX21lc3NhZ2U7CiAJc3BpX2lteC0+Yml0YmFuZy5tYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfQ1NfSElHSDsKLQlpZiAoaXNfaW14NTFfZWNzcGkoc3BpX2lteCkpCisJaWYgKGlzX2lteDM1X2NzcGkoc3BpX2lteCkgfHwgaXNfaW14NTFfZWNzcGkoc3BpX2lteCkpCiAJCXNwaV9pbXgtPmJpdGJhbmcubWFzdGVyLT5tb2RlX2JpdHMgfD0gU1BJX0xPT1A7CiAKIAlpbml0X2NvbXBsZXRpb24oJnNwaV9pbXgtPnhmZXJfZG9uZSk7CkBAIC0xMjUxLDYgKzEyNjgsMTIgQEAKIAkJZ290byBvdXRfY2xrX3B1dDsKIAl9CiAKKwlpZiAoIW1hc3Rlci0+Y3NfZ3Bpb3MpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gQ1MgR1BJT3MgYXZhaWxhYmxlXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfY2xrX3B1dDsKKwl9CisKIAlmb3IgKGkgPSAwOyBpIDwgbWFzdGVyLT5udW1fY2hpcHNlbGVjdDsgaSsrKSB7CiAJCWlmICghZ3Bpb19pc192YWxpZChtYXN0ZXItPmNzX2dwaW9zW2ldKSkKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWlwcm9jLXFzcGkuYyBiL2RyaXZlcnMvc3BpL3NwaS1pcHJvYy1xc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU2Y2NiMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1pcHJvYy1xc3BpLmMKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBCcm9hZGNvbSBMaW1pdGVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAic3BpLWJjbS1xc3BpLmgiCisKKyNkZWZpbmUgSU5UUl9CQVNFX0JJVF9TSElGVAkJCTB4MDIKKyNkZWZpbmUgSU5UUl9DT1VOVAkJCQkweDA3CisKK3N0cnVjdCBiY21faXByb2NfaW50YyB7CisJc3RydWN0IGJjbV9xc3BpX3NvY19pbnRjIHNvY19pbnRjOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJdm9pZCBfX2lvbWVtICppbnRfcmVnOworCXZvaWQgX19pb21lbSAqaW50X3N0YXR1c19yZWc7CisJc3BpbmxvY2tfdCBzb2Nsb2NrOworCWJvb2wgYmlnX2VuZGlhbjsKK307CisKK3N0YXRpYyB1MzIgYmNtX2lwcm9jX3FzcGlfZ2V0X2wyX2ludF9zdGF0dXMoc3RydWN0IGJjbV9xc3BpX3NvY19pbnRjICpzb2NfaW50YykKK3sKKwlzdHJ1Y3QgYmNtX2lwcm9jX2ludGMgKnByaXYgPQorCQkJY29udGFpbmVyX29mKHNvY19pbnRjLCBzdHJ1Y3QgYmNtX2lwcm9jX2ludGMsIHNvY19pbnRjKTsKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBwcml2LT5pbnRfc3RhdHVzX3JlZzsKKwlpbnQgaTsKKwl1MzIgdmFsID0gMCwgc3RzID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBJTlRSX0NPVU5UOyBpKyspIHsKKwkJaWYgKGJjbV9xc3BpX3JlYWRsKHByaXYtPmJpZ19lbmRpYW4sIG1taW8gKyAoaSAqIDQpKSkKKwkJCXZhbCB8PSAxVUwgPDwgaTsKKwl9CisKKwlpZiAodmFsICYgSU5UUl9NU1BJX0RPTkVfTUFTSykKKwkJc3RzIHw9IE1TUElfRE9ORTsKKworCWlmICh2YWwgJiBCU1BJX0xSX0lOVEVSUlVQVFNfQUxMKQorCQlzdHMgfD0gQlNQSV9ET05FOworCisJaWYgKHZhbCAmIEJTUElfTFJfSU5URVJSVVBUU19FUlJPUikKKwkJc3RzIHw9IEJTUElfRVJSOworCisJcmV0dXJuIHN0czsKK30KKworc3RhdGljIHZvaWQgYmNtX2lwcm9jX3FzcGlfaW50X2FjayhzdHJ1Y3QgYmNtX3FzcGlfc29jX2ludGMgKnNvY19pbnRjLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgYmNtX2lwcm9jX2ludGMgKnByaXYgPQorCQkJY29udGFpbmVyX29mKHNvY19pbnRjLCBzdHJ1Y3QgYmNtX2lwcm9jX2ludGMsIHNvY19pbnRjKTsKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBwcml2LT5pbnRfc3RhdHVzX3JlZzsKKwl1MzIgbWFzayA9IGdldF9xc3BpX21hc2sodHlwZSk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSU5UUl9DT1VOVDsgaSsrKSB7CisJCWlmIChtYXNrICYgKDFVTCA8PCBpKSkKKwkJCWJjbV9xc3BpX3dyaXRlbChwcml2LT5iaWdfZW5kaWFuLCAxLCBtbWlvICsgKGkgKiA0KSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBiY21faXByb2NfcXNwaV9pbnRfc2V0KHN0cnVjdCBiY21fcXNwaV9zb2NfaW50YyAqc29jX2ludGMsIGludCB0eXBlLAorCQkJCSAgIGJvb2wgZW4pCit7CisJc3RydWN0IGJjbV9pcHJvY19pbnRjICpwcml2ID0KKwkJCWNvbnRhaW5lcl9vZihzb2NfaW50Yywgc3RydWN0IGJjbV9pcHJvY19pbnRjLCBzb2NfaW50Yyk7CisJdm9pZCBfX2lvbWVtICptbWlvID0gcHJpdi0+aW50X3JlZzsKKwl1MzIgbWFzayA9IGdldF9xc3BpX21hc2sodHlwZSk7CisJdTMyIHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNvY2xvY2ssIGZsYWdzKTsKKworCXZhbCA9IGJjbV9xc3BpX3JlYWRsKHByaXYtPmJpZ19lbmRpYW4sIG1taW8pOworCisJaWYgKGVuKQorCQl2YWwgPSB2YWwgfCAobWFzayA8PCBJTlRSX0JBU0VfQklUX1NISUZUKTsKKwllbHNlCisJCXZhbCA9IHZhbCAmIH4obWFzayA8PCBJTlRSX0JBU0VfQklUX1NISUZUKTsKKworCWJjbV9xc3BpX3dyaXRlbChwcml2LT5iaWdfZW5kaWFuLCB2YWwsIG1taW8pOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c29jbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGJjbV9pcHJvY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGJjbV9pcHJvY19pbnRjICpwcml2OworCXN0cnVjdCBiY21fcXNwaV9zb2NfaW50YyAqc29jX2ludGM7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisKKwlwcml2ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKwlzb2NfaW50YyA9ICZwcml2LT5zb2NfaW50YzsKKwlwcml2LT5wZGV2ID0gcGRldjsKKworCXNwaW5fbG9ja19pbml0KCZwcml2LT5zb2Nsb2NrKTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJpbnRyX3JlZ3MiKTsKKwlwcml2LT5pbnRfcmVnID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHByaXYtPmludF9yZWcpKQorCQlyZXR1cm4gUFRSX0VSUihwcml2LT5pbnRfcmVnKTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCisJCQkJCSAgICJpbnRyX3N0YXR1c19yZWciKTsKKwlwcml2LT5pbnRfc3RhdHVzX3JlZyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CisJaWYgKElTX0VSUihwcml2LT5pbnRfc3RhdHVzX3JlZykpCisJCXJldHVybiBQVFJfRVJSKHByaXYtPmludF9zdGF0dXNfcmVnKTsKKworCXByaXYtPmJpZ19lbmRpYW4gPSBvZl9kZXZpY2VfaXNfYmlnX2VuZGlhbihkZXYtPm9mX25vZGUpOworCisJYmNtX2lwcm9jX3FzcGlfaW50X2Fjayhzb2NfaW50YywgTVNQSV9CU1BJX0RPTkUpOworCWJjbV9pcHJvY19xc3BpX2ludF9zZXQoc29jX2ludGMsIE1TUElfQlNQSV9ET05FLCBmYWxzZSk7CisKKwlzb2NfaW50Yy0+YmNtX3FzcGlfaW50X2FjayA9IGJjbV9pcHJvY19xc3BpX2ludF9hY2s7CisJc29jX2ludGMtPmJjbV9xc3BpX2ludF9zZXQgPSBiY21faXByb2NfcXNwaV9pbnRfc2V0OworCXNvY19pbnRjLT5iY21fcXNwaV9nZXRfaW50X3N0YXR1cyA9IGJjbV9pcHJvY19xc3BpX2dldF9sMl9pbnRfc3RhdHVzOworCisJcmV0dXJuIGJjbV9xc3BpX3Byb2JlKHBkZXYsIHNvY19pbnRjKTsKK30KKworc3RhdGljIGludCBiY21faXByb2NfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIGJjbV9xc3BpX3JlbW92ZShwZGV2KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYmNtX2lwcm9jX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJicmNtLHNwaS1uc3AtcXNwaSIgfSwKKwl7IC5jb21wYXRpYmxlID0gImJyY20sc3BpLW5zMi1xc3BpIiB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGJjbV9pcHJvY19vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJjbV9pcHJvY19kcml2ZXIgPSB7CisJLnByb2JlCQkJPSBiY21faXByb2NfcHJvYmUsCisJLnJlbW92ZQkJCT0gYmNtX2lwcm9jX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZQkJPSAiYmNtX2lwcm9jIiwKKwkJLnBtCQk9ICZiY21fcXNwaV9wbV9vcHMsCisJCS5vZl9tYXRjaF90YWJsZSA9IGJjbV9pcHJvY19vZl9tYXRjaCwKKwl9Cit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihiY21faXByb2NfZHJpdmVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FVVEhPUigiS2FtYWwgRGFzdSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTUEkgZmxhc2ggZHJpdmVyIGZvciBCcm9hZGNvbSBpUHJvYyBTb0NzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktamNvcmUuYyBiL2RyaXZlcnMvc3BpL3NwaS1qY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MTE3YjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGktamNvcmUuYwpAQCAtMCwwICsxLDIzMSBAQAorLyoKKyAqIEotQ29yZSBTUEkgY29udHJvbGxlciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNiBTbWFydCBFbmVyZ3kgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBDdXJyZW50IHZlcnNpb24gYnkgUmljaCBGZWxrZXIKKyAqIEJhc2VkIGxvb3NlbHkgb24gaW5pdGlhbCB2ZXJzaW9uIGJ5IE9sZWtzYW5kciBHIFpoYWRhbgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2RlZmluZSBEUlZfTkFNRQkiamNvcmVfc3BpIgorCisjZGVmaW5lIENUUkxfUkVHCTB4MAorI2RlZmluZSBEQVRBX1JFRwkweDQKKworI2RlZmluZSBKQ09SRV9TUElfQ1RSTF9YTUlUCQkweDAyCisjZGVmaW5lIEpDT1JFX1NQSV9TVEFUX0JVU1kJCTB4MDIKKyNkZWZpbmUgSkNPUkVfU1BJX0NUUkxfTE9PUAkJMHgwOAorI2RlZmluZSBKQ09SRV9TUElfQ1RSTF9DU19CSVRTCQkweDE1CisKKyNkZWZpbmUgSkNPUkVfU1BJX1dBSVRfUkRZX01BWF9MT09QCTIwMDAwMDAKKworc3RydWN0IGpjb3JlX3NwaSB7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJdW5zaWduZWQgaW50IGNzX3JlZzsKKwl1bnNpZ25lZCBpbnQgc3BlZWRfcmVnOworCXVuc2lnbmVkIGludCBzcGVlZF9oejsKKwl1bnNpZ25lZCBpbnQgY2xvY2tfZnJlcTsKK307CisKK3N0YXRpYyBpbnQgamNvcmVfc3BpX3dhaXQodm9pZCBfX2lvbWVtICpjdHJsX3JlZykKK3sKKwl1bnNpZ25lZCB0aW1lb3V0ID0gSkNPUkVfU1BJX1dBSVRfUkRZX01BWF9MT09QOworCisJZG8geworCQlpZiAoIShyZWFkbChjdHJsX3JlZykgJiBKQ09SRV9TUElfU1RBVF9CVVNZKSkKKwkJCXJldHVybiAwOworCQljcHVfcmVsYXgoKTsKKwl9IHdoaWxlICgtLXRpbWVvdXQpOworCisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIHZvaWQgamNvcmVfc3BpX3Byb2dyYW0oc3RydWN0IGpjb3JlX3NwaSAqaHcpCit7CisJdm9pZCBfX2lvbWVtICpjdHJsX3JlZyA9IGh3LT5iYXNlICsgQ1RSTF9SRUc7CisKKwlpZiAoamNvcmVfc3BpX3dhaXQoY3RybF9yZWcpKQorCQlkZXZfZXJyKGh3LT5tYXN0ZXItPmRldi5wYXJlbnQsCisJCQkidGltZW91dCB3YWl0aW5nIHRvIHByb2dyYW0gY3RybCByZWcuXG4iKTsKKworCXdyaXRlbChody0+Y3NfcmVnIHwgaHctPnNwZWVkX3JlZywgY3RybF9yZWcpOworfQorCitzdGF0aWMgdm9pZCBqY29yZV9zcGlfY2hpcHNlbChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBib29sIHZhbHVlKQoreworCXN0cnVjdCBqY29yZV9zcGkgKmh3ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJdTMyIGNzYml0ID0gMVUgPDwgKDIgKiBzcGktPmNoaXBfc2VsZWN0KTsKKworCWRldl9kYmcoaHctPm1hc3Rlci0+ZGV2LnBhcmVudCwgImNoaXBzZWxlY3QgJWRcbiIsIHNwaS0+Y2hpcF9zZWxlY3QpOworCisJaWYgKHZhbHVlKQorCQlody0+Y3NfcmVnIHw9IGNzYml0OworCWVsc2UKKwkJaHctPmNzX3JlZyAmPSB+Y3NiaXQ7CisKKwlqY29yZV9zcGlfcHJvZ3JhbShodyk7Cit9CisKK3N0YXRpYyB2b2lkIGpjb3JlX3NwaV9iYXVkcmF0ZShzdHJ1Y3QgamNvcmVfc3BpICpodywgaW50IHNwZWVkKQoreworCWlmIChzcGVlZCA9PSBody0+c3BlZWRfaHopIHJldHVybjsKKwlody0+c3BlZWRfaHogPSBzcGVlZDsKKwlpZiAoc3BlZWQgPj0gaHctPmNsb2NrX2ZyZXEgLyAyKQorCQlody0+c3BlZWRfcmVnID0gMDsKKwllbHNlCisJCWh3LT5zcGVlZF9yZWcgPSAoKGh3LT5jbG9ja19mcmVxIC8gMiAvIHNwZWVkKSAtIDEpIDw8IDI3OworCWpjb3JlX3NwaV9wcm9ncmFtKGh3KTsKKwlkZXZfZGJnKGh3LT5tYXN0ZXItPmRldi5wYXJlbnQsICJzcGVlZD0lZCByZWc9MHgleFxuIiwKKwkJc3BlZWQsIGh3LT5zcGVlZF9yZWcpOworfQorCitzdGF0aWMgaW50IGpjb3JlX3NwaV90eHJ4KHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsIHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnQpCit7CisJc3RydWN0IGpjb3JlX3NwaSAqaHcgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwl2b2lkIF9faW9tZW0gKmN0cmxfcmVnID0gaHctPmJhc2UgKyBDVFJMX1JFRzsKKwl2b2lkIF9faW9tZW0gKmRhdGFfcmVnID0gaHctPmJhc2UgKyBEQVRBX1JFRzsKKwl1MzIgeG1pdDsKKworCS8qIGRhdGEgYnVmZmVycyAqLworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnR4OworCXVuc2lnbmVkIGNoYXIgKnJ4OworCXVuc2lnbmVkIGludCBsZW47CisJdW5zaWduZWQgaW50IGNvdW50OworCisJamNvcmVfc3BpX2JhdWRyYXRlKGh3LCB0LT5zcGVlZF9oeik7CisKKwl4bWl0ID0gaHctPmNzX3JlZyB8IGh3LT5zcGVlZF9yZWcgfCBKQ09SRV9TUElfQ1RSTF9YTUlUOworCXR4ID0gdC0+dHhfYnVmOworCXJ4ID0gdC0+cnhfYnVmOworCWxlbiA9IHQtPmxlbjsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGxlbjsgY291bnQrKykgeworCQlpZiAoamNvcmVfc3BpX3dhaXQoY3RybF9yZWcpKQorCQkJYnJlYWs7CisKKwkJd3JpdGVsKHR4ID8gKnR4KysgOiAwLCBkYXRhX3JlZyk7CisJCXdyaXRlbCh4bWl0LCBjdHJsX3JlZyk7CisKKwkJaWYgKGpjb3JlX3NwaV93YWl0KGN0cmxfcmVnKSkKKwkJCWJyZWFrOworCisJCWlmIChyeCkKKwkJCSpyeCsrID0gcmVhZGwoZGF0YV9yZWcpOworCX0KKworCXNwaV9maW5hbGl6ZV9jdXJyZW50X3RyYW5zZmVyKG1hc3Rlcik7CisKKwlpZiAoY291bnQgPCBsZW4pCisJCXJldHVybiAtRVJFTU9URUlPOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgamNvcmVfc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJc3RydWN0IGpjb3JlX3NwaSAqaHc7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwl1MzIgY2xvY2tfZnJlcTsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJaW50IGVyciA9IC1FTk9ERVY7CisKKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgamNvcmVfc3BpKSk7CisJaWYgKCFtYXN0ZXIpCisJCXJldHVybiBlcnI7CisKKwkvKiBTZXR1cCB0aGUgbWFzdGVyIHN0YXRlLiAqLworCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSAzOworCW1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NQT0wgfCBTUElfQ1BIQSB8IFNQSV9DU19ISUdIOworCW1hc3Rlci0+dHJhbnNmZXJfb25lID0gamNvcmVfc3BpX3R4cng7CisJbWFzdGVyLT5zZXRfY3MgPSBqY29yZV9zcGlfY2hpcHNlbDsKKwltYXN0ZXItPmRldi5vZl9ub2RlID0gbm9kZTsKKwltYXN0ZXItPmJ1c19udW0gPSBwZGV2LT5pZDsKKworCWh3ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCWh3LT5tYXN0ZXIgPSBtYXN0ZXI7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaHcpOworCisJLyogRmluZCBhbmQgbWFwIG91ciByZXNvdXJjZXMgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKQorCQlnb3RvIGV4aXRfYnVzeTsKKwlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCisJCQkJICAgICByZXNvdXJjZV9zaXplKHJlcyksIHBkZXYtPm5hbWUpKQorCQlnb3RvIGV4aXRfYnVzeTsKKwlody0+YmFzZSA9IGRldm1faW9yZW1hcF9ub2NhY2hlKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCisJCQkJCXJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFody0+YmFzZSkKKwkJZ290byBleGl0X2J1c3k7CisKKwkvKgorCSAqIFRoZSBTUEkgY2xvY2sgcmF0ZSBjb250cm9sbGVkIHZpYSBhIGNvbmZpZ3VyYWJsZSBjbG9jayBkaXZpZGVyCisJICogd2hpY2ggaXMgYXBwbGllZCB0byB0aGUgcmVmZXJlbmNlIGNsb2NrLiBBIDUwIE1IeiByZWZlcmVuY2UgaXMKKwkgKiBtb3N0IHN1aXRhYmxlIGZvciBvYnRhaW5pbmcgc3RhbmRhcmQgU1BJIGNsb2NrIHJhdGVzLCBidXQgc29tZQorCSAqIGRlc2lnbnMgbWF5IGhhdmUgYSBkaWZmZXJlbnQgcmVmZXJlbmNlIGNsb2NrLCBhbmQgdGhlIERUIG11c3QKKwkgKiBtYWtlIHRoZSBkcml2ZXIgYXdhcmUgc28gdGhhdCBpdCBjYW4gcHJvcGVybHkgcHJvZ3JhbSB0aGUKKwkgKiByZXF1ZXN0ZWQgcmF0ZS4gSWYgdGhlIGNsb2NrIGlzIG9taXR0ZWQsIDUwIE1IeiBpcyBhc3N1bWVkLgorCSAqLworCWNsb2NrX2ZyZXEgPSA1MDAwMDAwMDsKKwljbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgInJlZl9jbGsiKTsKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKGNsaykpIHsKKwkJaWYgKGNsa19lbmFibGUoY2xrKSA9PSAwKQorCQkJY2xvY2tfZnJlcSA9IGNsa19nZXRfcmF0ZShjbGspOworCQllbHNlCisJCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiY291bGQgbm90IGVuYWJsZSByZWZfY2xrXG4iKTsKKwl9CisJaHctPmNsb2NrX2ZyZXEgPSBjbG9ja19mcmVxOworCisJLyogSW5pdGlhbGl6ZSBhbGwgQ1MgYml0cyB0byBoaWdoLiAqLworCWh3LT5jc19yZWcgPSBKQ09SRV9TUElfQ1RSTF9DU19CSVRTOworCWpjb3JlX3NwaV9iYXVkcmF0ZShodywgNDAwMDAwKTsKKworCS8qIFJlZ2lzdGVyIG91ciBzcGkgY29udHJvbGxlciAqLworCWVyciA9IGRldm1fc3BpX3JlZ2lzdGVyX21hc3RlcigmcGRldi0+ZGV2LCBtYXN0ZXIpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdDsKKworCXJldHVybiAwOworCitleGl0X2J1c3k6CisJZXJyID0gLUVCVVNZOworZXhpdDoKKwlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGpjb3JlX3NwaV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiamNvcmUsc3BpMiIgfSwKKwl7fSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGpjb3JlX3NwaV9kcml2ZXIgPSB7CisJLnByb2JlID0gamNvcmVfc3BpX3Byb2JlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gRFJWX05BTUUsCisJCS5vZl9tYXRjaF90YWJsZSA9IGpjb3JlX3NwaV9vZl9tYXRjaCwKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihqY29yZV9zcGlfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJKLUNvcmUgU1BJIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiUmljaCBGZWxrZXIgPGRhbGlhc0BsaWJjLm9yZz4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06IiBEUlZfTkFNRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktbG9vcGJhY2stdGVzdC5jIGIvZHJpdmVycy9zcGkvc3BpLWxvb3BiYWNrLXRlc3QuYwppbmRleCBmYWExYjEzLi41MGU2MjBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktbG9vcGJhY2stdGVzdC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1sb29wYmFjay10ZXN0LmMKQEAgLTQwNSw3ICs0MDUsNyBAQAogCXU4ICplbmQ7CiB9OwogCi1pbnQgcnhfcmFuZ2VzX2NtcCh2b2lkICpwcml2LCBzdHJ1Y3QgbGlzdF9oZWFkICphLCBzdHJ1Y3QgbGlzdF9oZWFkICpiKQorc3RhdGljIGludCByeF9yYW5nZXNfY21wKHZvaWQgKnByaXYsIHN0cnVjdCBsaXN0X2hlYWQgKmEsIHN0cnVjdCBsaXN0X2hlYWQgKmIpCiB7CiAJc3RydWN0IHJ4X3JhbmdlcyAqcnhfYSA9IGxpc3RfZW50cnkoYSwgc3RydWN0IHJ4X3JhbmdlcywgbGlzdCk7CiAJc3RydWN0IHJ4X3JhbmdlcyAqcnhfYiA9IGxpc3RfZW50cnkoYiwgc3RydWN0IHJ4X3JhbmdlcywgbGlzdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktbWVzb24tc3BpZmMuYyBiL2RyaXZlcnMvc3BpL3NwaS1tZXNvbi1zcGlmYy5jCmluZGV4IDI0NjUyNTkuLjYxNjU2NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1tZXNvbi1zcGlmYy5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1tZXNvbi1zcGlmYy5jCkBAIC00NDIsNiArNDQyLDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbWVzb25fc3BpZmNfZHRfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gImFtbG9naWMsbWVzb242LXNwaWZjIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImFtbG9naWMsbWVzb24tZ3hiYi1zcGlmYyIsIH0sCiAJeyB9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1lc29uX3NwaWZjX2R0X21hdGNoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1tdDY1eHguYyBiL2RyaXZlcnMvc3BpL3NwaS1tdDY1eHguYwppbmRleCAwYmU4OWUwLi44OTlkN2E4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktbXQ2NXh4LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLW10NjV4eC5jCkBAIC02ODUsNyArNjg1LDYgQEAKIAlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CiAKIAltdGtfc3BpX3Jlc2V0KG1kYXRhKTsKLQlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktcGljMzItc3FpLmMgYi9kcml2ZXJzL3NwaS9zcGktcGljMzItc3FpLmMKaW5kZXggYzQxYWJkZC4uYmQxYzZiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXBpYzMyLXNxaS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1waWMzMi1zcWkuYwpAQCAtMjUzLDE1ICsyNTMsMTMgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlyZGVzYyA9IGxpc3RfZmlyc3RfZW50cnkoJnNxaS0+YmRfbGlzdF9mcmVlLCBzdHJ1Y3QgcmluZ19kZXNjLCBsaXN0KTsKLQlsaXN0X2RlbCgmcmRlc2MtPmxpc3QpOwotCWxpc3RfYWRkX3RhaWwoJnJkZXNjLT5saXN0LCAmc3FpLT5iZF9saXN0X3VzZWQpOworCWxpc3RfbW92ZV90YWlsKCZyZGVzYy0+bGlzdCwgJnNxaS0+YmRfbGlzdF91c2VkKTsKIAlyZXR1cm4gcmRlc2M7CiB9CiAKIHN0YXRpYyB2b2lkIHJpbmdfZGVzY19wdXQoc3RydWN0IHBpYzMyX3NxaSAqc3FpLCBzdHJ1Y3QgcmluZ19kZXNjICpyZGVzYykKIHsKLQlsaXN0X2RlbCgmcmRlc2MtPmxpc3QpOwotCWxpc3RfYWRkKCZyZGVzYy0+bGlzdCwgJnNxaS0+YmRfbGlzdF9mcmVlKTsKKwlsaXN0X21vdmUoJnJkZXNjLT5saXN0LCAmc3FpLT5iZF9saXN0X2ZyZWUpOwogfQogCiBzdGF0aWMgaW50IHBpYzMyX3NxaV9vbmVfdHJhbnNmZXIoc3RydWN0IHBpYzMyX3NxaSAqc3FpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC1kbWEuYyBiL2RyaXZlcnMvc3BpL3NwaS1weGEyeHgtZG1hLmMKaW5kZXggZGIzYWUxZC4uMDRmM2VlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC1kbWEuYworKysgYi9kcml2ZXJzL3NwaS9zcGktcHhhMnh4LWRtYS5jCkBAIC0yMyw3ICsyMyw3IEBACiBzdGF0aWMgdm9pZCBweGEyeHhfc3BpX2RtYV90cmFuc2Zlcl9jb21wbGV0ZShzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhLAogCQkJCQkgICAgIGJvb2wgZXJyb3IpCiB7Ci0Jc3RydWN0IHNwaV9tZXNzYWdlICptc2cgPSBkcnZfZGF0YS0+Y3VyX21zZzsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZyA9IGRydl9kYXRhLT5tYXN0ZXItPmN1cl9tc2c7CiAKIAkvKgogCSAqIEl0IGlzIHBvc3NpYmxlIHRoYXQgb25lIENQVSBpcyBoYW5kbGluZyBST1IgaW50ZXJydXB0IGFuZCBvdGhlcgpAQCAtNzYsNyArNzYsOCBAQAogcHhhMnh4X3NwaV9kbWFfcHJlcGFyZV9vbmUoc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YSwKIAkJCSAgIGVudW0gZG1hX3RyYW5zZmVyX2RpcmVjdGlvbiBkaXIpCiB7Ci0Jc3RydWN0IGNoaXBfZGF0YSAqY2hpcCA9IGRydl9kYXRhLT5jdXJfY2hpcDsKKwlzdHJ1Y3QgY2hpcF9kYXRhICpjaGlwID0KKwkJc3BpX2dldF9jdGxkYXRhKGRydl9kYXRhLT5tYXN0ZXItPmN1cl9tc2ctPnNwaSk7CiAJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlciA9IGRydl9kYXRhLT5jdXJfdHJhbnNmZXI7CiAJZW51bSBkbWFfc2xhdmVfYnVzd2lkdGggd2lkdGg7CiAJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgY2ZnOwpAQCAtMTQ2LDcgKzE0Nyw3IEBACiBpbnQgcHhhMnh4X3NwaV9kbWFfcHJlcGFyZShzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhLCB1MzIgZG1hX2J1cnN0KQogewogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHhfZGVzYywgKnJ4X2Rlc2M7Ci0JaW50IGVyciA9IDA7CisJaW50IGVycjsKIAogCXR4X2Rlc2MgPSBweGEyeHhfc3BpX2RtYV9wcmVwYXJlX29uZShkcnZfZGF0YSwgRE1BX01FTV9UT19ERVYpOwogCWlmICghdHhfZGVzYykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC1wY2kuYyBiL2RyaXZlcnMvc3BpL3NwaS1weGEyeHgtcGNpLmMKaW5kZXggZjNkZjUyMi4uNThkMmQ0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC1wY2kuYworKysgYi9kcml2ZXJzL3NwaS9zcGktcHhhMnh4LXBjaS5jCkBAIC0yMTQsNiArMjE0LDcgQEAKIAkJcmV0dXJuIFBUUl9FUlIoc3NwLT5jbGspOwogCiAJbWVtc2V0KCZwaSwgMCwgc2l6ZW9mKHBpKSk7CisJcGkuZndub2RlID0gZGV2LT5kZXYuZndub2RlOwogCXBpLnBhcmVudCA9ICZkZXYtPmRldjsKIAlwaS5uYW1lID0gInB4YTJ4eC1zcGkiOwogCXBpLmlkID0gc3NwLT5wb3J0X2lkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC5jIGIvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC5jCmluZGV4IDg3MTUwYTEuLmRkN2I1YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1weGEyeHguYworKysgYi9kcml2ZXJzL3NwaS9zcGktcHhhMnh4LmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9jb25zdW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CkBAIC02Miw2ICs2MywxMyBAQAogCQkJCXwgUVVBUktfWDEwMDBfU1NDUjFfVEZUCQlcCiAJCQkJfCBTU0NSMV9TUEggfCBTU0NSMV9TUE8gfCBTU0NSMV9MQk0pCiAKKyNkZWZpbmUgQ0U0MTAwX1NTQ1IxX0NIQU5HRV9NQVNLIChTU0NSMV9UVEVMUCB8IFNTQ1IxX1RURSB8IFNTQ1IxX1NDRlIgXAorCQkJCXwgU1NDUjFfRUNSQSB8IFNTQ1IxX0VDUkIgfCBTU0NSMV9TQ0xLRElSIFwKKwkJCQl8IFNTQ1IxX1NGUk1ESVIgfCBTU0NSMV9SV09UIHwgU1NDUjFfVFJBSUwgXAorCQkJCXwgU1NDUjFfSUZTIHwgU1NDUjFfU1RSRiB8IFNTQ1IxX0VGV1IgXAorCQkJCXwgQ0U0MTAwX1NTQ1IxX1JGVCB8IENFNDEwMF9TU0NSMV9URlQgfCBTU0NSMV9NV0RTIFwKKwkJCQl8IFNTQ1IxX1NQSCB8IFNTQ1IxX1NQTyB8IFNTQ1IxX0xCTSkKKwogI2RlZmluZSBMUFNTX0dFTkVSQUxfUkVHX1JYVE9fSE9MRE9GRl9ESVNBQkxFCUJJVCgyNCkKICNkZWZpbmUgTFBTU19DU19DT05UUk9MX1NXX01PREUJCQlCSVQoMCkKICNkZWZpbmUgTFBTU19DU19DT05UUk9MX0NTX0hJR0gJCQlCSVQoMSkKQEAgLTE3NSw2ICsxODMsOCBAQAogCXN3aXRjaCAoZHJ2X2RhdGEtPnNzcF90eXBlKSB7CiAJY2FzZSBRVUFSS19YMTAwMF9TU1A6CiAJCXJldHVybiBRVUFSS19YMTAwMF9TU0NSMV9DSEFOR0VfTUFTSzsKKwljYXNlIENFNDEwMF9TU1A6CisJCXJldHVybiBDRTQxMDBfU1NDUjFfQ0hBTkdFX01BU0s7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIFNTQ1IxX0NIQU5HRV9NQVNLOwogCX0KQEAgLTE4Niw2ICsxOTYsOCBAQAogCXN3aXRjaCAoZHJ2X2RhdGEtPnNzcF90eXBlKSB7CiAJY2FzZSBRVUFSS19YMTAwMF9TU1A6CiAJCXJldHVybiBSWF9USFJFU0hfUVVBUktfWDEwMDBfREZMVDsKKwljYXNlIENFNDEwMF9TU1A6CisJCXJldHVybiBSWF9USFJFU0hfQ0U0MTAwX0RGTFQ7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIFJYX1RIUkVTSF9ERkxUOwogCX0KQEAgLTE5OSw2ICsyMTEsOSBAQAogCWNhc2UgUVVBUktfWDEwMDBfU1NQOgogCQltYXNrID0gUVVBUktfWDEwMDBfU1NTUl9URkxfTUFTSzsKIAkJYnJlYWs7CisJY2FzZSBDRTQxMDBfU1NQOgorCQltYXNrID0gQ0U0MTAwX1NTU1JfVEZMX01BU0s7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCW1hc2sgPSBTU1NSX1RGTF9NQVNLOwogCQlicmVhazsKQEAgLTIxNiw2ICsyMzEsOSBAQAogCWNhc2UgUVVBUktfWDEwMDBfU1NQOgogCQltYXNrID0gUVVBUktfWDEwMDBfU1NDUjFfUkZUOwogCQlicmVhazsKKwljYXNlIENFNDEwMF9TU1A6CisJCW1hc2sgPSBDRTQxMDBfU1NDUjFfUkZUOworCQlicmVhazsKIAlkZWZhdWx0OgogCQltYXNrID0gU1NDUjFfUkZUOwogCQlicmVhazsKQEAgLTIzMCw2ICsyNDgsOSBAQAogCWNhc2UgUVVBUktfWDEwMDBfU1NQOgogCQkqc2NjcjFfcmVnIHw9IFFVQVJLX1gxMDAwX1NTQ1IxX1J4VHJlc2godGhyZXNob2xkKTsKIAkJYnJlYWs7CisJY2FzZSBDRTQxMDBfU1NQOgorCQkqc2NjcjFfcmVnIHw9IENFNDEwMF9TU0NSMV9SeFRyZXNoKHRocmVzaG9sZCk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCSpzY2NyMV9yZWcgfD0gU1NDUjFfUnhUcmVzaCh0aHJlc2hvbGQpOwogCQlicmVhazsKQEAgLTMxNiw3ICszMzcsNyBAQAogCiAJdmFsdWUgPSBfX2xwc3Nfc3NwX3JlYWRfcHJpdihkcnZfZGF0YSwgY29uZmlnLT5yZWdfY3NfY3RybCk7CiAKLQljcyA9IGRydl9kYXRhLT5jdXJfbXNnLT5zcGktPmNoaXBfc2VsZWN0OworCWNzID0gZHJ2X2RhdGEtPm1hc3Rlci0+Y3VyX21zZy0+c3BpLT5jaGlwX3NlbGVjdDsKIAljcyA8PD0gY29uZmlnLT5jc19zZWxfc2hpZnQ7CiAJaWYgKGNzICE9ICh2YWx1ZSAmIGNvbmZpZy0+Y3Nfc2VsX21hc2spKSB7CiAJCS8qCkBAIC0zNTUsMTAgKzM3NiwxMSBAQAogCiBzdGF0aWMgdm9pZCBjc19hc3NlcnQoc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YSkKIHsKLQlzdHJ1Y3QgY2hpcF9kYXRhICpjaGlwID0gZHJ2X2RhdGEtPmN1cl9jaGlwOworCXN0cnVjdCBjaGlwX2RhdGEgKmNoaXAgPQorCQlzcGlfZ2V0X2N0bGRhdGEoZHJ2X2RhdGEtPm1hc3Rlci0+Y3VyX21zZy0+c3BpKTsKIAogCWlmIChkcnZfZGF0YS0+c3NwX3R5cGUgPT0gQ0U0MTAwX1NTUCkgewotCQlweGEyeHhfc3BpX3dyaXRlKGRydl9kYXRhLCBTU1NSLCBkcnZfZGF0YS0+Y3VyX2NoaXAtPmZybSk7CisJCXB4YTJ4eF9zcGlfd3JpdGUoZHJ2X2RhdGEsIFNTU1IsIGNoaXAtPmZybSk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTM3OCw3ICs0MDAsOCBAQAogCiBzdGF0aWMgdm9pZCBjc19kZWFzc2VydChzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhKQogewotCXN0cnVjdCBjaGlwX2RhdGEgKmNoaXAgPSBkcnZfZGF0YS0+Y3VyX2NoaXA7CisJc3RydWN0IGNoaXBfZGF0YSAqY2hpcCA9CisJCXNwaV9nZXRfY3RsZGF0YShkcnZfZGF0YS0+bWFzdGVyLT5jdXJfbXNnLT5zcGkpOwogCiAJaWYgKGRydl9kYXRhLT5zc3BfdHlwZSA9PSBDRTQxMDBfU1NQKQogCQlyZXR1cm47CkBAIC01MDgsNyArNTMxLDcgQEAKIAogdm9pZCAqcHhhMnh4X3NwaV9uZXh0X3RyYW5zZmVyKHN0cnVjdCBkcml2ZXJfZGF0YSAqZHJ2X2RhdGEpCiB7Ci0Jc3RydWN0IHNwaV9tZXNzYWdlICptc2cgPSBkcnZfZGF0YS0+Y3VyX21zZzsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZyA9IGRydl9kYXRhLT5tYXN0ZXItPmN1cl9tc2c7CiAJc3RydWN0IHNwaV90cmFuc2ZlciAqdHJhbnMgPSBkcnZfZGF0YS0+Y3VyX3RyYW5zZmVyOwogCiAJLyogTW92ZSB0byBuZXh0IHRyYW5zZmVyICovCkBAIC01MjksOCArNTUyLDcgQEAKIAlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZzsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAKLQltc2cgPSBkcnZfZGF0YS0+Y3VyX21zZzsKLQlkcnZfZGF0YS0+Y3VyX21zZyA9IE5VTEw7CisJbXNnID0gZHJ2X2RhdGEtPm1hc3Rlci0+Y3VyX21zZzsKIAlkcnZfZGF0YS0+Y3VyX3RyYW5zZmVyID0gTlVMTDsKIAogCWxhc3RfdHJhbnNmZXIgPSBsaXN0X2xhc3RfZW50cnkoJm1zZy0+dHJhbnNmZXJzLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyLApAQCAtNTc1LDEzICs1OTcsMTMgQEAKIAkJCWNzX2RlYXNzZXJ0KGRydl9kYXRhKTsKIAl9CiAKLQlkcnZfZGF0YS0+Y3VyX2NoaXAgPSBOVUxMOwogCXNwaV9maW5hbGl6ZV9jdXJyZW50X21lc3NhZ2UoZHJ2X2RhdGEtPm1hc3Rlcik7CiB9CiAKIHN0YXRpYyB2b2lkIHJlc2V0X3NjY3IxKHN0cnVjdCBkcml2ZXJfZGF0YSAqZHJ2X2RhdGEpCiB7Ci0Jc3RydWN0IGNoaXBfZGF0YSAqY2hpcCA9IGRydl9kYXRhLT5jdXJfY2hpcDsKKwlzdHJ1Y3QgY2hpcF9kYXRhICpjaGlwID0KKwkJc3BpX2dldF9jdGxkYXRhKGRydl9kYXRhLT5tYXN0ZXItPmN1cl9tc2ctPnNwaSk7CiAJdTMyIHNjY3IxX3JlZzsKIAogCXNjY3IxX3JlZyA9IHB4YTJ4eF9zcGlfcmVhZChkcnZfZGF0YSwgU1NDUjEpICYgfmRydl9kYXRhLT5pbnRfY3IxOwpAQCAtNTg5LDYgKzYxMSw5IEBACiAJY2FzZSBRVUFSS19YMTAwMF9TU1A6CiAJCXNjY3IxX3JlZyAmPSB+UVVBUktfWDEwMDBfU1NDUjFfUkZUOwogCQlicmVhazsKKwljYXNlIENFNDEwMF9TU1A6CisJCXNjY3IxX3JlZyAmPSB+Q0U0MTAwX1NTQ1IxX1JGVDsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJc2NjcjFfcmVnICY9IH5TU0NSMV9SRlQ7CiAJCWJyZWFrOwpAQCAtNjEwLDcgKzYzNSw3IEBACiAKIAlkZXZfZXJyKCZkcnZfZGF0YS0+cGRldi0+ZGV2LCAiJXNcbiIsIG1zZyk7CiAKLQlkcnZfZGF0YS0+Y3VyX21zZy0+c3RhdGUgPSBFUlJPUl9TVEFURTsKKwlkcnZfZGF0YS0+bWFzdGVyLT5jdXJfbXNnLT5zdGF0ZSA9IEVSUk9SX1NUQVRFOwogCXRhc2tsZXRfc2NoZWR1bGUoJmRydl9kYXRhLT5wdW1wX3RyYW5zZmVycyk7CiB9CiAKQEAgLTYyMyw3ICs2NDgsNyBAQAogCQlweGEyeHhfc3BpX3dyaXRlKGRydl9kYXRhLCBTU1RPLCAwKTsKIAogCS8qIFVwZGF0ZSB0b3RhbCBieXRlIHRyYW5zZmVycmVkIHJldHVybiBjb3VudCBhY3R1YWwgYnl0ZXMgcmVhZCAqLwotCWRydl9kYXRhLT5jdXJfbXNnLT5hY3R1YWxfbGVuZ3RoICs9IGRydl9kYXRhLT5sZW4gLQorCWRydl9kYXRhLT5tYXN0ZXItPmN1cl9tc2ctPmFjdHVhbF9sZW5ndGggKz0gZHJ2X2RhdGEtPmxlbiAtCiAJCQkJKGRydl9kYXRhLT5yeF9lbmQgLSBkcnZfZGF0YS0+cngpOwogCiAJLyogVHJhbnNmZXIgZGVsYXlzIGFuZCBjaGlwIHNlbGVjdCByZWxlYXNlIGFyZQpAQCAtNjMxLDcgKzY1Niw3IEBACiAJICovCiAKIAkvKiBNb3ZlIHRvIG5leHQgdHJhbnNmZXIgKi8KLQlkcnZfZGF0YS0+Y3VyX21zZy0+c3RhdGUgPSBweGEyeHhfc3BpX25leHRfdHJhbnNmZXIoZHJ2X2RhdGEpOworCWRydl9kYXRhLT5tYXN0ZXItPmN1cl9tc2ctPnN0YXRlID0gcHhhMnh4X3NwaV9uZXh0X3RyYW5zZmVyKGRydl9kYXRhKTsKIAogCS8qIFNjaGVkdWxlIHRyYW5zZmVyIHRhc2tsZXQgKi8KIAl0YXNrbGV0X3NjaGVkdWxlKCZkcnZfZGF0YS0+cHVtcF90cmFuc2ZlcnMpOwpAQCAtNzQ2LDcgKzc3MSw3IEBACiAJaWYgKCEoc3RhdHVzICYgbWFzaykpCiAJCXJldHVybiBJUlFfTk9ORTsKIAotCWlmICghZHJ2X2RhdGEtPmN1cl9tc2cpIHsKKwlpZiAoIWRydl9kYXRhLT5tYXN0ZXItPmN1cl9tc2cpIHsKIAogCQlweGEyeHhfc3BpX3dyaXRlKGRydl9kYXRhLCBTU0NSMCwKIAkJCQkgcHhhMnh4X3NwaV9yZWFkKGRydl9kYXRhLCBTU0NSMCkKQEAgLTkwNSw3ICs5MzAsOCBAQAogc3RhdGljIHVuc2lnbmVkIGludCBweGEyeHhfc3NwX2dldF9jbGtfZGl2KHN0cnVjdCBkcml2ZXJfZGF0YSAqZHJ2X2RhdGEsCiAJCQkJCSAgIGludCByYXRlKQogewotCXN0cnVjdCBjaGlwX2RhdGEgKmNoaXAgPSBkcnZfZGF0YS0+Y3VyX2NoaXA7CisJc3RydWN0IGNoaXBfZGF0YSAqY2hpcCA9CisJCXNwaV9nZXRfY3RsZGF0YShkcnZfZGF0YS0+bWFzdGVyLT5jdXJfbXNnLT5zcGkpOwogCXVuc2lnbmVkIGludCBjbGtfZGl2OwogCiAJc3dpdGNoIChkcnZfZGF0YS0+c3NwX3R5cGUpIHsKQEAgLTkzNCwyNSArOTYwLDIzIEBACiB7CiAJc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YSA9IChzdHJ1Y3QgZHJpdmVyX2RhdGEgKilkYXRhOwogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBkcnZfZGF0YS0+bWFzdGVyOwotCXN0cnVjdCBzcGlfbWVzc2FnZSAqbWVzc2FnZSA9IE5VTEw7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqdHJhbnNmZXIgPSBOVUxMOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnByZXZpb3VzID0gTlVMTDsKLQlzdHJ1Y3QgY2hpcF9kYXRhICpjaGlwID0gTlVMTDsKLQl1MzIgY2xrX2RpdiA9IDA7Ci0JdTggYml0cyA9IDA7Ci0JdTMyIHNwZWVkID0gMDsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1lc3NhZ2UgPSBtYXN0ZXItPmN1cl9tc2c7CisJc3RydWN0IGNoaXBfZGF0YSAqY2hpcCA9IHNwaV9nZXRfY3RsZGF0YShtZXNzYWdlLT5zcGkpOworCXUzMiBkbWFfdGhyZXNoID0gY2hpcC0+ZG1hX3RocmVzaG9sZDsKKwl1MzIgZG1hX2J1cnN0ID0gY2hpcC0+ZG1hX2J1cnN0X3NpemU7CisJdTMyIGNoYW5nZV9tYXNrID0gcHhhMnh4X3NwaV9nZXRfc3NyYzFfY2hhbmdlX21hc2soZHJ2X2RhdGEpOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnRyYW5zZmVyOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnByZXZpb3VzOworCXUzMiBjbGtfZGl2OworCXU4IGJpdHM7CisJdTMyIHNwZWVkOwogCXUzMiBjcjA7CiAJdTMyIGNyMTsKLQl1MzIgZG1hX3RocmVzaCA9IGRydl9kYXRhLT5jdXJfY2hpcC0+ZG1hX3RocmVzaG9sZDsKLQl1MzIgZG1hX2J1cnN0ID0gZHJ2X2RhdGEtPmN1cl9jaGlwLT5kbWFfYnVyc3Rfc2l6ZTsKLQl1MzIgY2hhbmdlX21hc2sgPSBweGEyeHhfc3BpX2dldF9zc3JjMV9jaGFuZ2VfbWFzayhkcnZfZGF0YSk7CiAJaW50IGVycjsKIAlpbnQgZG1hX21hcHBlZDsKIAogCS8qIEdldCBjdXJyZW50IHN0YXRlIGluZm9ybWF0aW9uICovCi0JbWVzc2FnZSA9IGRydl9kYXRhLT5jdXJfbXNnOwogCXRyYW5zZmVyID0gZHJ2X2RhdGEtPmN1cl90cmFuc2ZlcjsKLQljaGlwID0gZHJ2X2RhdGEtPmN1cl9jaGlwOwogCiAJLyogSGFuZGxlIGZvciBhYm9ydCAqLwogCWlmIChtZXNzYWdlLT5zdGF0ZSA9PSBFUlJPUl9TVEFURSkgewpAQCAtMTE0NiwxNyArMTE3MCwxMiBAQAogewogCXN0cnVjdCBkcml2ZXJfZGF0YSAqZHJ2X2RhdGEgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CiAKLQlkcnZfZGF0YS0+Y3VyX21zZyA9IG1zZzsKIAkvKiBJbml0aWFsIG1lc3NhZ2Ugc3RhdGUqLwotCWRydl9kYXRhLT5jdXJfbXNnLT5zdGF0ZSA9IFNUQVJUX1NUQVRFOwotCWRydl9kYXRhLT5jdXJfdHJhbnNmZXIgPSBsaXN0X2VudHJ5KGRydl9kYXRhLT5jdXJfbXNnLT50cmFuc2ZlcnMubmV4dCwKKwltc2ctPnN0YXRlID0gU1RBUlRfU1RBVEU7CisJZHJ2X2RhdGEtPmN1cl90cmFuc2ZlciA9IGxpc3RfZW50cnkobXNnLT50cmFuc2ZlcnMubmV4dCwKIAkJCQkJCXN0cnVjdCBzcGlfdHJhbnNmZXIsCiAJCQkJCQl0cmFuc2Zlcl9saXN0KTsKIAotCS8qIHByZXBhcmUgdG8gc2V0dXAgdGhlIFNTUCwgaW4gcHVtcF90cmFuc2ZlcnMsIHVzaW5nIHRoZSBwZXIKLQkgKiBjaGlwIGNvbmZpZ3VyYXRpb24gKi8KLQlkcnZfZGF0YS0+Y3VyX2NoaXAgPSBzcGlfZ2V0X2N0bGRhdGEoZHJ2X2RhdGEtPmN1cl9tc2ctPnNwaSk7Ci0KIAkvKiBNYXJrIGFzIGJ1c3kgYW5kIGxhdW5jaCB0cmFuc2ZlcnMgKi8KIAl0YXNrbGV0X3NjaGVkdWxlKCZkcnZfZGF0YS0+cHVtcF90cmFuc2ZlcnMpOwogCXJldHVybiAwOwpAQCAtMTE3Niw5ICsxMTk1LDI2IEBACiBzdGF0aWMgaW50IHNldHVwX2NzKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBjaGlwX2RhdGEgKmNoaXAsCiAJCSAgICBzdHJ1Y3QgcHhhMnh4X3NwaV9jaGlwICpjaGlwX2luZm8pCiB7CisJc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwogCWludCBlcnIgPSAwOwogCi0JaWYgKGNoaXAgPT0gTlVMTCB8fCBjaGlwX2luZm8gPT0gTlVMTCkKKwlpZiAoY2hpcCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWlmIChkcnZfZGF0YS0+Y3NfZ3Bpb2RzKSB7CisJCXN0cnVjdCBncGlvX2Rlc2MgKmdwaW9kOworCisJCWdwaW9kID0gZHJ2X2RhdGEtPmNzX2dwaW9kc1tzcGktPmNoaXBfc2VsZWN0XTsKKwkJaWYgKGdwaW9kKSB7CisJCQljaGlwLT5ncGlvX2NzID0gZGVzY190b19ncGlvKGdwaW9kKTsKKwkJCWNoaXAtPmdwaW9fY3NfaW52ZXJ0ZWQgPSBzcGktPm1vZGUgJiBTUElfQ1NfSElHSDsKKwkJCWdwaW9kX3NldF92YWx1ZShncGlvZCwgY2hpcC0+Z3Bpb19jc19pbnZlcnRlZCk7CisJCX0KKworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoY2hpcF9pbmZvID09IE5VTEwpCiAJCXJldHVybiAwOwogCiAJLyogTk9URTogc2V0dXAoKSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLCBwb3NzaWJseSB3aXRoCkBAIC0xMjEzLDcgKzEyNDksNyBAQAogCiBzdGF0aWMgaW50IHNldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7Ci0Jc3RydWN0IHB4YTJ4eF9zcGlfY2hpcCAqY2hpcF9pbmZvID0gTlVMTDsKKwlzdHJ1Y3QgcHhhMnh4X3NwaV9jaGlwICpjaGlwX2luZm87CiAJc3RydWN0IGNoaXBfZGF0YSAqY2hpcDsKIAljb25zdCBzdHJ1Y3QgbHBzc19jb25maWcgKmNvbmZpZzsKIAlzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CkBAIC0xMjI1LDYgKzEyNjEsMTEgQEAKIAkJdHhfaGlfdGhyZXMgPSAwOwogCQlyeF90aHJlcyA9IFJYX1RIUkVTSF9RVUFSS19YMTAwMF9ERkxUOwogCQlicmVhazsKKwljYXNlIENFNDEwMF9TU1A6CisJCXR4X3RocmVzID0gVFhfVEhSRVNIX0NFNDEwMF9ERkxUOworCQl0eF9oaV90aHJlcyA9IDA7CisJCXJ4X3RocmVzID0gUlhfVEhSRVNIX0NFNDEwMF9ERkxUOworCQlicmVhazsKIAljYXNlIExQU1NfTFBUX1NTUDoKIAljYXNlIExQU1NfQllUX1NTUDoKIAljYXNlIExQU1NfQlNXX1NTUDoKQEAgLTEzMDksNiArMTM1MCwxMCBAQAogCQkJCSAgIHwgKFFVQVJLX1gxMDAwX1NTQ1IxX1R4VHJlc2godHhfdGhyZXMpCiAJCQkJICAgJiBRVUFSS19YMTAwMF9TU0NSMV9URlQpOwogCQlicmVhazsKKwljYXNlIENFNDEwMF9TU1A6CisJCWNoaXAtPnRocmVzaG9sZCA9IChDRTQxMDBfU1NDUjFfUnhUcmVzaChyeF90aHJlcykgJiBDRTQxMDBfU1NDUjFfUkZUKSB8CisJCQkoQ0U0MTAwX1NTQ1IxX1R4VHJlc2godHhfdGhyZXMpICYgQ0U0MTAwX1NTQ1IxX1RGVCk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWNoaXAtPnRocmVzaG9sZCA9IChTU0NSMV9SeFRyZXNoKHJ4X3RocmVzKSAmIFNTQ1IxX1JGVCkgfAogCQkJKFNTQ1IxX1R4VHJlc2godHhfdGhyZXMpICYgU1NDUjFfVEZUKTsKQEAgLTEzNTIsNyArMTM5Nyw4IEBACiAJaWYgKCFjaGlwKQogCQlyZXR1cm47CiAKLQlpZiAoZHJ2X2RhdGEtPnNzcF90eXBlICE9IENFNDEwMF9TU1AgJiYgZ3Bpb19pc192YWxpZChjaGlwLT5ncGlvX2NzKSkKKwlpZiAoZHJ2X2RhdGEtPnNzcF90eXBlICE9IENFNDEwMF9TU1AgJiYgIWRydl9kYXRhLT5jc19ncGlvZHMgJiYKKwkgICAgZ3Bpb19pc192YWxpZChjaGlwLT5ncGlvX2NzKSkKIAkJZ3Bpb19mcmVlKGNoaXAtPmdwaW9fY3MpOwogCiAJa2ZyZWUoY2hpcCk7CkBAIC0xNTMwLDcgKzE1NzYsNyBAQAogCXN0cnVjdCBkcml2ZXJfZGF0YSAqZHJ2X2RhdGE7CiAJc3RydWN0IHNzcF9kZXZpY2UgKnNzcDsKIAljb25zdCBzdHJ1Y3QgbHBzc19jb25maWcgKmNvbmZpZzsKLQlpbnQgc3RhdHVzOworCWludCBzdGF0dXMsIGNvdW50OwogCXUzMiB0bXA7CiAKIAlwbGF0Zm9ybV9pbmZvID0gZGV2X2dldF9wbGF0ZGF0YShkZXYpOwpAQCAtMTYzMCwxNSArMTY3NiwyMCBAQAogCXB4YTJ4eF9zcGlfd3JpdGUoZHJ2X2RhdGEsIFNTQ1IwLCAwKTsKIAlzd2l0Y2ggKGRydl9kYXRhLT5zc3BfdHlwZSkgewogCWNhc2UgUVVBUktfWDEwMDBfU1NQOgotCQl0bXAgPSBRVUFSS19YMTAwMF9TU0NSMV9SeFRyZXNoKFJYX1RIUkVTSF9RVUFSS19YMTAwMF9ERkxUKQotCQkgICAgICB8IFFVQVJLX1gxMDAwX1NTQ1IxX1R4VHJlc2goVFhfVEhSRVNIX1FVQVJLX1gxMDAwX0RGTFQpOworCQl0bXAgPSBRVUFSS19YMTAwMF9TU0NSMV9SeFRyZXNoKFJYX1RIUkVTSF9RVUFSS19YMTAwMF9ERkxUKSB8CisJCSAgICAgIFFVQVJLX1gxMDAwX1NTQ1IxX1R4VHJlc2goVFhfVEhSRVNIX1FVQVJLX1gxMDAwX0RGTFQpOwogCQlweGEyeHhfc3BpX3dyaXRlKGRydl9kYXRhLCBTU0NSMSwgdG1wKTsKIAogCQkvKiB1c2luZyB0aGUgTW90b3JvbGEgU1BJIHByb3RvY29sIGFuZCB1c2UgOCBiaXQgZnJhbWUgKi8KLQkJcHhhMnh4X3NwaV93cml0ZShkcnZfZGF0YSwgU1NDUjAsCi0JCQkJIFFVQVJLX1gxMDAwX1NTQ1IwX01vdG9yb2xhCi0JCQkJIHwgUVVBUktfWDEwMDBfU1NDUjBfRGF0YVNpemUoOCkpOworCQl0bXAgPSBRVUFSS19YMTAwMF9TU0NSMF9Nb3Rvcm9sYSB8IFFVQVJLX1gxMDAwX1NTQ1IwX0RhdGFTaXplKDgpOworCQlweGEyeHhfc3BpX3dyaXRlKGRydl9kYXRhLCBTU0NSMCwgdG1wKTsKIAkJYnJlYWs7CisJY2FzZSBDRTQxMDBfU1NQOgorCQl0bXAgPSBDRTQxMDBfU1NDUjFfUnhUcmVzaChSWF9USFJFU0hfQ0U0MTAwX0RGTFQpIHwKKwkJICAgICAgQ0U0MTAwX1NTQ1IxX1R4VHJlc2goVFhfVEhSRVNIX0NFNDEwMF9ERkxUKTsKKwkJcHhhMnh4X3NwaV93cml0ZShkcnZfZGF0YSwgU1NDUjEsIHRtcCk7CisJCXRtcCA9IFNTQ1IwX1NDUigyKSB8IFNTQ1IwX01vdG9yb2xhIHwgU1NDUjBfRGF0YVNpemUoOCk7CisJCXB4YTJ4eF9zcGlfd3JpdGUoZHJ2X2RhdGEsIFNTQ1IwLCB0bXApOwogCWRlZmF1bHQ6CiAJCXRtcCA9IFNTQ1IxX1J4VHJlc2goUlhfVEhSRVNIX0RGTFQpIHwKIAkJICAgICAgU1NDUjFfVHhUcmVzaChUWF9USFJFU0hfREZMVCk7CkBAIC0xNjY5LDYgKzE3MjAsMzkgQEAKIAl9CiAJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IHBsYXRmb3JtX2luZm8tPm51bV9jaGlwc2VsZWN0OwogCisJY291bnQgPSBncGlvZF9jb3VudCgmcGRldi0+ZGV2LCAiY3MiKTsKKwlpZiAoY291bnQgPiAwKSB7CisJCWludCBpOworCisJCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBtYXhfdChpbnQsIGNvdW50LAorCQkJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCk7CisKKwkJZHJ2X2RhdGEtPmNzX2dwaW9kcyA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LAorCQkJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCwgc2l6ZW9mKHN0cnVjdCBncGlvX2Rlc2MgKiksCisJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKCFkcnZfZGF0YS0+Y3NfZ3Bpb2RzKSB7CisJCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJZ290byBvdXRfZXJyb3JfY2xvY2tfZW5hYmxlZDsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBtYXN0ZXItPm51bV9jaGlwc2VsZWN0OyBpKyspIHsKKwkJCXN0cnVjdCBncGlvX2Rlc2MgKmdwaW9kOworCisJCQlncGlvZCA9IGRldm1fZ3Bpb2RfZ2V0X2luZGV4KGRldiwgImNzIiwgaSwKKwkJCQkJCSAgICAgR1BJT0RfT1VUX0hJR0gpOworCQkJaWYgKElTX0VSUihncGlvZCkpIHsKKwkJCQkvKiBNZWFucyB1c2UgbmF0aXZlIGNoaXAgc2VsZWN0ICovCisJCQkJaWYgKFBUUl9FUlIoZ3Bpb2QpID09IC1FTk9FTlQpCisJCQkJCWNvbnRpbnVlOworCisJCQkJc3RhdHVzID0gKGludClQVFJfRVJSKGdwaW9kKTsKKwkJCQlnb3RvIG91dF9lcnJvcl9jbG9ja19lbmFibGVkOworCQkJfSBlbHNlIHsKKwkJCQlkcnZfZGF0YS0+Y3NfZ3Bpb2RzW2ldID0gZ3Bpb2Q7CisJCQl9CisJCX0KKwl9CisKIAl0YXNrbGV0X2luaXQoJmRydl9kYXRhLT5wdW1wX3RyYW5zZmVycywgcHVtcF90cmFuc2ZlcnMsCiAJCSAgICAgKHVuc2lnbmVkIGxvbmcpZHJ2X2RhdGEpOwogCkBAIC0xNzQyLDcgKzE4MjYsNyBAQAogewogCXN0cnVjdCBkcml2ZXJfZGF0YSAqZHJ2X2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3Qgc3NwX2RldmljZSAqc3NwID0gZHJ2X2RhdGEtPnNzcDsKLQlpbnQgc3RhdHVzID0gMDsKKwlpbnQgc3RhdHVzOwogCiAJc3RhdHVzID0gc3BpX21hc3Rlcl9zdXNwZW5kKGRydl9kYXRhLT5tYXN0ZXIpOwogCWlmIChzdGF0dXMgIT0gMCkKQEAgLTE3NTksNyArMTg0Myw3IEBACiB7CiAJc3RydWN0IGRyaXZlcl9kYXRhICpkcnZfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBzc3BfZGV2aWNlICpzc3AgPSBkcnZfZGF0YS0+c3NwOwotCWludCBzdGF0dXMgPSAwOworCWludCBzdGF0dXM7CiAKIAkvKiBFbmFibGUgdGhlIFNTUCBjbG9jayAqLwogCWlmICghcG1fcnVudGltZV9zdXNwZW5kZWQoZGV2KSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1weGEyeHguaCBiL2RyaXZlcnMvc3BpL3NwaS1weGEyeHguaAppbmRleCBkMjE3YWQ1Li5jZTMxYjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktcHhhMnh4LmgKKysrIGIvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC5oCkBAIC01Myw5ICs1Myw3IEBACiAJYXRvbWljX3QgZG1hX3J1bm5pbmc7CiAKIAkvKiBDdXJyZW50IG1lc3NhZ2UgdHJhbnNmZXIgc3RhdGUgaW5mbyAqLwotCXN0cnVjdCBzcGlfbWVzc2FnZSAqY3VyX21zZzsKIAlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICpjdXJfdHJhbnNmZXI7Ci0Jc3RydWN0IGNoaXBfZGF0YSAqY3VyX2NoaXA7CiAJc2l6ZV90IGxlbjsKIAl2b2lkICp0eDsKIAl2b2lkICp0eF9lbmQ7CkBAIC02OCw2ICs2Niw5IEBACiAJdm9pZCAoKmNzX2NvbnRyb2wpKHUzMiBjb21tYW5kKTsKIAogCXZvaWQgX19pb21lbSAqbHBzc19iYXNlOworCisJLyogR1BJT3MgZm9yIGNoaXAgc2VsZWN0cyAqLworCXN0cnVjdCBncGlvX2Rlc2MgKipjc19ncGlvZHM7CiB9OwogCiBzdHJ1Y3QgY2hpcF9kYXRhIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1xdXAuYyBiL2RyaXZlcnMvc3BpL3NwaS1xdXAuYwppbmRleCBjMzM4ZWYxLi4xYmZhODg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktcXVwLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXF1cC5jCkBAIC05ODIsOCArOTgyLDEwIEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWNsa19kaXNhYmxlX3VucHJlcGFyZShjb250cm9sbGVyLT5jY2xrKTsKLQljbGtfZGlzYWJsZV91bnByZXBhcmUoY29udHJvbGxlci0+aWNsayk7CisJaWYgKCFwbV9ydW50aW1lX3N1c3BlbmRlZChkZXZpY2UpKSB7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShjb250cm9sbGVyLT5jY2xrKTsKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGNvbnRyb2xsZXItPmljbGspOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTAzMCw3ICsxMDMyLDYgQEAKIAogCXBtX3J1bnRpbWVfcHV0X25vaWRsZSgmcGRldi0+ZGV2KTsKIAlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7Ci0Jc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXJzcGkuYyBiL2RyaXZlcnMvc3BpL3NwaS1yc3BpLmMKaW5kZXggODE4ODQzMy4uYTgxNmYwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXJzcGkuYworKysgYi9kcml2ZXJzL3NwaS9zcGktcnNwaS5jCkBAIC0yOTUsMTQgKzI5NSwyNCBAQAogc3RhdGljIGludCByc3BpX3J6X3NldF9jb25maWdfcmVnaXN0ZXIoc3RydWN0IHJzcGlfZGF0YSAqcnNwaSwgaW50IGFjY2Vzc19zaXplKQogewogCWludCBzcGJyOworCWludCBkaXYgPSAwOworCXVuc2lnbmVkIGxvbmcgY2xrc3JjOwogCiAJLyogU2V0cyBvdXRwdXQgbW9kZSwgTU9TSSBzaWduYWwsIGFuZCAob3B0aW9uYWxseSkgbG9vcGJhY2sgKi8KIAlyc3BpX3dyaXRlOChyc3BpLCByc3BpLT5zcHBjciwgUlNQSV9TUFBDUik7CiAKKwljbGtzcmMgPSBjbGtfZ2V0X3JhdGUocnNwaS0+Y2xrKTsKKwl3aGlsZSAoZGl2IDwgMykgeworCQlpZiAocnNwaS0+bWF4X3NwZWVkX2h6ID49IGNsa3NyYy80KSAvKiA0PShDTEsvMikvMiAqLworCQkJYnJlYWs7CisJCWRpdisrOworCQljbGtzcmMgLz0gMjsKKwl9CisKIAkvKiBTZXRzIHRyYW5zZmVyIGJpdCByYXRlICovCi0Jc3BiciA9IERJVl9ST1VORF9VUChjbGtfZ2V0X3JhdGUocnNwaS0+Y2xrKSwKLQkJCSAgICAyICogcnNwaS0+bWF4X3NwZWVkX2h6KSAtIDE7CisJc3BiciA9IERJVl9ST1VORF9VUChjbGtzcmMsIDIgKiByc3BpLT5tYXhfc3BlZWRfaHopIC0gMTsKIAlyc3BpX3dyaXRlOChyc3BpLCBjbGFtcChzcGJyLCAwLCAyNTUpLCBSU1BJX1NQQlIpOworCXJzcGktPnNwY21kIHw9IGRpdiA8PCAyOwogCiAJLyogRGlzYWJsZSBkdW1teSB0cmFuc21pc3Npb24sIHNldCBieXRlIGFjY2VzcyAqLwogCXJzcGlfd3JpdGU4KHJzcGksIFNQRENSX1NQTEJZVEUsIFJTUElfU1BEQ1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXNjMThpczYwMi5jIGIvZHJpdmVycy9zcGkvc3BpLXNjMThpczYwMi5jCmluZGV4IDM2YWY0ZDQuLmY2MzcxNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1zYzE4aXM2MDIuYworKysgYi9kcml2ZXJzL3NwaS9zcGktc2MxOGlzNjAyLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL3NjMThpczYwMi5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8vY29uc3VtZXIuaD4KIAogZW51bSBjaGlwcyB7IHNjMThpczYwMiwgc2MxOGlzNjAyYiwgc2MxOGlzNjAzIH07CiAKQEAgLTUwLDYgKzUxLDggQEAKIAl1OAkJCWJ1ZmZlcltTQzE4SVM2MDJfQlVGU0laICsgMV07CiAJaW50CQkJdGxlbjsJLyogRGF0YSBxdWV1ZWQgZm9yIHR4IGluIGJ1ZmZlciAqLwogCWludAkJCXJpbmRleDsJLyogUmVjZWl2ZSBkYXRhIGluZGV4IGluIGJ1ZmZlciAqLworCisJc3RydWN0IGdwaW9fZGVzYwkqcmVzZXQ7CiB9OwogCiBzdGF0aWMgaW50IHNjMThpczYwMl93YWl0X3JlYWR5KHN0cnVjdCBzYzE4aXM2MDIgKmh3LCBpbnQgbGVuKQpAQCAtMjU3LDYgKzI2MCwxMiBAQAogCWh3ID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOwogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGh3KTsKIAorCS8qIGFzc2VydCByZXNldCBhbmQgdGhlbiByZWxlYXNlICovCisJaHctPnJlc2V0ID0gZGV2bV9ncGlvZF9nZXRfb3B0aW9uYWwoZGV2LCAicmVzZXQiLCBHUElPRF9PVVRfSElHSCk7CisJaWYgKElTX0VSUihody0+cmVzZXQpKQorCQlyZXR1cm4gUFRSX0VSUihody0+cmVzZXQpOworCWdwaW9kX3NldF92YWx1ZV9jYW5zbGVlcChody0+cmVzZXQsIDApOworCiAJaHctPm1hc3RlciA9IG1hc3RlcjsKIAlody0+Y2xpZW50ID0gY2xpZW50OwogCWh3LT5kZXYgPSBkZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktc2gtbXNpb2YuYyBiL2RyaXZlcnMvc3BpL3NwaS1zaC1tc2lvZi5jCmluZGV4IDBmODNhZDEuLjFkZTNhNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1zaC1tc2lvZi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1zaC1tc2lvZi5jCkBAIC0yNjIsNiArMjYyLDkgQEAKIAogCWZvciAoayA9IDA7IGsgPCBBUlJBWV9TSVpFKHNoX21zaW9mX3NwaV9kaXZfdGFibGUpOyBrKyspIHsKIAkJYnJwcyA9IERJVl9ST1VORF9VUChkaXYsIHNoX21zaW9mX3NwaV9kaXZfdGFibGVba10uZGl2KTsKKwkJLyogU0NSX0JSRFZfRElWXzEgaXMgdmFsaWQgb25seSBpZiBCUlBTIGlzIHggMS8xIG9yIHggMS8yICovCisJCWlmIChzaF9tc2lvZl9zcGlfZGl2X3RhYmxlW2tdLmRpdiA9PSAxICYmIGJycHMgPiAyKQorCQkJY29udGludWU7CiAJCWlmIChicnBzIDw9IDMyKSAvKiBtYXggb2YgYnJkdiBpcyAzMiAqLwogCQkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXN0LXNzYzQuYyBiL2RyaXZlcnMvc3BpL3NwaS1zdC1zc2M0LmMKaW5kZXggYTU2ZWNhMC4uZTU0YjU5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXN0LXNzYzQuYworKysgYi9kcml2ZXJzL3NwaS9zcGktc3Qtc3NjNC5jCkBAIC0xNzUsMTAgKzE3NSw3IEBACiAKIHN0YXRpYyB2b2lkIHNwaV9zdF9jbGVhbnVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7Ci0JaW50IGNzID0gc3BpLT5jc19ncGlvOwotCi0JaWYgKGdwaW9faXNfdmFsaWQoY3MpKQotCQlkZXZtX2dwaW9fZnJlZSgmc3BpLT5kZXYsIGNzKTsKKwlncGlvX2ZyZWUoc3BpLT5jc19ncGlvKTsKIH0KIAogLyogdGhlIHNwaS0+bW9kZSBiaXRzIHVuZGVyc3Rvb2QgYnkgdGhpcyBkcml2ZXI6ICovCkBAIC0yMDEsMTQgKzE5OCwxNSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoZGV2bV9ncGlvX3JlcXVlc3QoJnNwaS0+ZGV2LCBjcywgZGV2X25hbWUoJnNwaS0+ZGV2KSkpIHsKKwlyZXQgPSBncGlvX3JlcXVlc3QoY3MsIGRldl9uYW1lKCZzcGktPmRldikpOworCWlmIChyZXQpIHsKIAkJZGV2X2Vycigmc3BpLT5kZXYsICJjb3VsZCBub3QgcmVxdWVzdCBncGlvOiVkXG4iLCBjcyk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldCA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChjcywgc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpOwogCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJCWdvdG8gb3V0X2ZyZWVfZ3BpbzsKIAogCXNwaV9zdF9jbGsgPSBjbGtfZ2V0X3JhdGUoc3BpX3N0LT5jbGspOwogCkBAIC0yMTcsNyArMjE1LDggQEAKIAlpZiAoc3NjYnJnIDwgMHgwNyB8fCBzc2NicmcgPiBCSVQoMTYpKSB7CiAJCWRldl9lcnIoJnNwaS0+ZGV2LAogCQkJImJhdWRyYXRlICVkIG91dHNpZGUgdmFsaWQgcmFuZ2UgJWRcbiIsIHNzY2JyZywgaHopOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZnJlZV9ncGlvOwogCX0KIAogCXNwaV9zdC0+YmF1ZCA9IHNwaV9zdF9jbGsgLyAoMiAqIHNzY2JyZyk7CkBAIC0yNjYsNiArMjY1LDEwIEBACiAJIHJlYWRsX3JlbGF4ZWQoc3BpX3N0LT5iYXNlICsgU1NDX1JCVUYpOwogCiAJIHJldHVybiAwOworCitvdXRfZnJlZV9ncGlvOgorCWdwaW9fZnJlZShjcyk7CisJcmV0dXJuIHJldDsKIH0KIAogLyogSW50ZXJydXB0IGZpcmVkIHdoZW4gVFggc2hpZnQgcmVnaXN0ZXIgYmVjb21lcyBlbXB0eSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXRpLXFzcGkuYyBiL2RyaXZlcnMvc3BpL3NwaS10aS1xc3BpLmMKaW5kZXggYWMwYjA3Mi4uY2FlYWM2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXRpLXFzcGkuYworKysgYi9kcml2ZXJzL3NwaS9zcGktdGktcXNwaS5jCkBAIC00MSw2ICs0MSw4IEBACiB9OwogCiBzdHJ1Y3QgdGlfcXNwaSB7CisJc3RydWN0IGNvbXBsZXRpb24JdHJhbnNmZXJfY29tcGxldGU7CisKIAkvKiBsaXN0IHN5bmNocm9uaXphdGlvbiAqLwogCXN0cnVjdCBtdXRleCAgICAgICAgICAgIGxpc3RfbG9jazsKIApAQCAtNTQsNiArNTYsOSBAQAogCiAJc3RydWN0IHRpX3FzcGlfcmVncyAgICAgY3R4X3JlZzsKIAorCWRtYV9hZGRyX3QJCW1tYXBfcGh5c19iYXNlOworCXN0cnVjdCBkbWFfY2hhbgkJKnJ4X2NoYW47CisKIAl1MzIgc3BpX21heF9mcmVxdWVuY3k7CiAJdTMyIGNtZDsKIAl1MzIgZGM7CkBAIC0zNzksNiArMzg0LDcyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHRpX3FzcGlfZG1hX2NhbGxiYWNrKHZvaWQgKnBhcmFtKQoreworCXN0cnVjdCB0aV9xc3BpICpxc3BpID0gcGFyYW07CisKKwljb21wbGV0ZSgmcXNwaS0+dHJhbnNmZXJfY29tcGxldGUpOworfQorCitzdGF0aWMgaW50IHRpX3FzcGlfZG1hX3hmZXIoc3RydWN0IHRpX3FzcGkgKnFzcGksIGRtYV9hZGRyX3QgZG1hX2RzdCwKKwkJCSAgICBkbWFfYWRkcl90IGRtYV9zcmMsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGRtYV9jaGFuICpjaGFuID0gcXNwaS0+cnhfY2hhbjsKKwlzdHJ1Y3QgZG1hX2RldmljZSAqZG1hX2RldiA9IGNoYW4tPmRldmljZTsKKwlkbWFfY29va2llX3QgY29va2llOworCWVudW0gZG1hX2N0cmxfZmxhZ3MgZmxhZ3MgPSBETUFfQ1RSTF9BQ0sgfCBETUFfUFJFUF9JTlRFUlJVUFQ7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eDsKKwlpbnQgcmV0OworCisJdHggPSBkbWFfZGV2LT5kZXZpY2VfcHJlcF9kbWFfbWVtY3B5KGNoYW4sIGRtYV9kc3QsIGRtYV9zcmMsCisJCQkJCSAgICAgbGVuLCBmbGFncyk7CisJaWYgKCF0eCkgeworCQlkZXZfZXJyKHFzcGktPmRldiwgImRldmljZV9wcmVwX2RtYV9tZW1jcHkgZXJyb3JcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwl0eC0+Y2FsbGJhY2sgPSB0aV9xc3BpX2RtYV9jYWxsYmFjazsKKwl0eC0+Y2FsbGJhY2tfcGFyYW0gPSBxc3BpOworCWNvb2tpZSA9IHR4LT50eF9zdWJtaXQodHgpOworCisJcmV0ID0gZG1hX3N1Ym1pdF9lcnJvcihjb29raWUpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycihxc3BpLT5kZXYsICJkbWFfc3VibWl0X2Vycm9yICVkXG4iLCBjb29raWUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlkbWFfYXN5bmNfaXNzdWVfcGVuZGluZyhjaGFuKTsKKwlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnFzcGktPnRyYW5zZmVyX2NvbXBsZXRlLAorCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMobGVuKSk7CisJaWYgKHJldCA8PSAwKSB7CisJCWRtYWVuZ2luZV90ZXJtaW5hdGVfc3luYyhjaGFuKTsKKwkJZGV2X2Vycihxc3BpLT5kZXYsICJETUEgd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0XG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGlfcXNwaV9kbWFfeGZlcl9zZyhzdHJ1Y3QgdGlfcXNwaSAqcXNwaSwgc3RydWN0IHNnX3RhYmxlIHJ4X3NnLAorCQkJICAgICAgIGxvZmZfdCBmcm9tKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJZG1hX2FkZHJfdCBkbWFfc3JjID0gcXNwaS0+bW1hcF9waHlzX2Jhc2UgKyBmcm9tOworCWRtYV9hZGRyX3QgZG1hX2RzdDsKKwlpbnQgaSwgbGVuLCByZXQ7CisKKwlmb3JfZWFjaF9zZyhyeF9zZy5zZ2wsIHNnLCByeF9zZy5uZW50cywgaSkgeworCQlkbWFfZHN0ID0gc2dfZG1hX2FkZHJlc3Moc2cpOworCQlsZW4gPSBzZ19kbWFfbGVuKHNnKTsKKwkJcmV0ID0gdGlfcXNwaV9kbWFfeGZlcihxc3BpLCBkbWFfZHN0LCBkbWFfc3JjLCBsZW4pOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJZG1hX3NyYyArPSBsZW47CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIHRpX3FzcGlfZW5hYmxlX21lbW9yeV9tYXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlzdHJ1Y3QgdGlfcXNwaSAgKnFzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKQEAgLTQyNiw3ICs0OTcsNyBAQAogCQkgICAgICBRU1BJX1NQSV9TRVRVUF9SRUcoc3BpLT5jaGlwX3NlbGVjdCkpOwogfQogCi1zdGF0aWMgaW50IHRpX3FzcGlfc3BpX2ZsYXNoX3JlYWQoc3RydWN0ICBzcGlfZGV2aWNlICpzcGksCitzdGF0aWMgaW50IHRpX3FzcGlfc3BpX2ZsYXNoX3JlYWQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKIAkJCQkgIHN0cnVjdCBzcGlfZmxhc2hfcmVhZF9tZXNzYWdlICptc2cpCiB7CiAJc3RydWN0IHRpX3FzcGkgKnFzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKQEAgLTQzNyw5ICs1MDgsMjMgQEAKIAlpZiAoIXFzcGktPm1tYXBfZW5hYmxlZCkKIAkJdGlfcXNwaV9lbmFibGVfbWVtb3J5X21hcChzcGkpOwogCXRpX3FzcGlfc2V0dXBfbW1hcF9yZWFkKHNwaSwgbXNnKTsKLQltZW1jcHlfZnJvbWlvKG1zZy0+YnVmLCBxc3BpLT5tbWFwX2Jhc2UgKyBtc2ctPmZyb20sIG1zZy0+bGVuKTsKKworCWlmIChxc3BpLT5yeF9jaGFuKSB7CisJCWlmIChtc2ctPmN1cl9tc2dfbWFwcGVkKSB7CisJCQlyZXQgPSB0aV9xc3BpX2RtYV94ZmVyX3NnKHFzcGksIG1zZy0+cnhfc2csIG1zZy0+ZnJvbSk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyX3VubG9jazsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIocXNwaS0+ZGV2LCAiSW52YWxpZCBhZGRyZXNzIGZvciBETUFcbiIpOworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gZXJyX3VubG9jazsKKwkJfQorCX0gZWxzZSB7CisJCW1lbWNweV9mcm9taW8obXNnLT5idWYsIHFzcGktPm1tYXBfYmFzZSArIG1zZy0+ZnJvbSwgbXNnLT5sZW4pOworCX0KIAltc2ctPnJldGxlbiA9IG1zZy0+bGVuOwogCitlcnJfdW5sb2NrOgogCW11dGV4X3VubG9jaygmcXNwaS0+bGlzdF9sb2NrKTsKIAogCXJldHVybiByZXQ7CkBAIC01MzYsNiArNjIxLDcgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAJdTMyIG1heF9mcmVxOwogCWludCByZXQgPSAwLCBudW1fY3MsIGlycTsKKwlkbWFfY2FwX21hc2tfdCBtYXNrOwogCiAJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcigmcGRldi0+ZGV2LCBzaXplb2YoKnFzcGkpKTsKIAlpZiAoIW1hc3RlcikKQEAgLTU1MCw2ICs2MzYsNyBAQAogCW1hc3Rlci0+ZGV2Lm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAltYXN0ZXItPmJpdHNfcGVyX3dvcmRfbWFzayA9IFNQSV9CUFdfTUFTSygzMikgfCBTUElfQlBXX01BU0soMTYpIHwKIAkJCQkgICAgIFNQSV9CUFdfTUFTSyg4KTsKKwltYXN0ZXItPnNwaV9mbGFzaF9yZWFkID0gdGlfcXNwaV9zcGlfZmxhc2hfcmVhZDsKIAogCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJudW0tY3MiLCAmbnVtX2NzKSkKIAkJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IG51bV9jczsKQEAgLTU5MiwxNyArNjc5LDYgQEAKIAkJZ290byBmcmVlX21hc3RlcjsKIAl9CiAKLQlpZiAocmVzX21tYXApIHsKLQkJcXNwaS0+bW1hcF9iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsCi0JCQkJCQkJcmVzX21tYXApOwotCQltYXN0ZXItPnNwaV9mbGFzaF9yZWFkID0gdGlfcXNwaV9zcGlfZmxhc2hfcmVhZDsKLQkJaWYgKElTX0VSUihxc3BpLT5tbWFwX2Jhc2UpKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkJImZhbGxpbmcgYmFjayB0byBQSU8gbW9kZVxuIik7Ci0JCQltYXN0ZXItPnNwaV9mbGFzaF9yZWFkID0gTlVMTDsKLQkJfQotCX0KLQlxc3BpLT5tbWFwX2VuYWJsZWQgPSBmYWxzZTsKIAogCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJzeXNjb24tY2hpcHNlbGVjdHMiKSkgewogCQlxc3BpLT5jdHJsX2Jhc2UgPQpAQCAtNjMzLDExICs3MDksMzcgQEAKIAlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAic3BpLW1heC1mcmVxdWVuY3kiLCAmbWF4X2ZyZXEpKQogCQlxc3BpLT5zcGlfbWF4X2ZyZXF1ZW5jeSA9IG1heF9mcmVxOwogCi0JcmV0ID0gZGV2bV9zcGlfcmVnaXN0ZXJfbWFzdGVyKCZwZGV2LT5kZXYsIG1hc3Rlcik7Ci0JaWYgKHJldCkKLQkJZ290byBmcmVlX21hc3RlcjsKKwlkbWFfY2FwX3plcm8obWFzayk7CisJZG1hX2NhcF9zZXQoRE1BX01FTUNQWSwgbWFzayk7CiAKLQlyZXR1cm4gMDsKKwlxc3BpLT5yeF9jaGFuID0gZG1hX3JlcXVlc3RfY2hhbl9ieV9tYXNrKCZtYXNrKTsKKwlpZiAoIXFzcGktPnJ4X2NoYW4pIHsKKwkJZGV2X2Vycihxc3BpLT5kZXYsCisJCQkiTm8gUnggRE1BIGF2YWlsYWJsZSwgdHJ5aW5nIG1tYXAgbW9kZVxuIik7CisJCXJldCA9IDA7CisJCWdvdG8gbm9fZG1hOworCX0KKwltYXN0ZXItPmRtYV9yeCA9IHFzcGktPnJ4X2NoYW47CisJaW5pdF9jb21wbGV0aW9uKCZxc3BpLT50cmFuc2Zlcl9jb21wbGV0ZSk7CisJaWYgKHJlc19tbWFwKQorCQlxc3BpLT5tbWFwX3BoeXNfYmFzZSA9IChkbWFfYWRkcl90KXJlc19tbWFwLT5zdGFydDsKKworbm9fZG1hOgorCWlmICghcXNwaS0+cnhfY2hhbiAmJiByZXNfbW1hcCkgeworCQlxc3BpLT5tbWFwX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzX21tYXApOworCQlpZiAoSVNfRVJSKHFzcGktPm1tYXBfYmFzZSkpIHsKKwkJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCQkJICJtbWFwIGZhaWxlZCB3aXRoIGVycm9yICVsZCB1c2luZyBQSU8gbW9kZVxuIiwKKwkJCQkgUFRSX0VSUihxc3BpLT5tbWFwX2Jhc2UpKTsKKwkJCXFzcGktPm1tYXBfYmFzZSA9IE5VTEw7CisJCQltYXN0ZXItPnNwaV9mbGFzaF9yZWFkID0gTlVMTDsKKwkJfQorCX0KKwlxc3BpLT5tbWFwX2VuYWJsZWQgPSBmYWxzZTsKKworCXJldCA9IGRldm1fc3BpX3JlZ2lzdGVyX21hc3RlcigmcGRldi0+ZGV2LCBtYXN0ZXIpOworCWlmICghcmV0KQorCQlyZXR1cm4gMDsKIAogZnJlZV9tYXN0ZXI6CiAJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKQEAgLTY1Niw2ICs3NTgsOSBAQAogCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnBkZXYtPmRldik7CiAJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwogCisJaWYgKHFzcGktPnJ4X2NoYW4pCisJCWRtYV9yZWxlYXNlX2NoYW5uZWwocXNwaS0+cnhfY2hhbik7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXR4eDkuYyBiL2RyaXZlcnMvc3BpL3NwaS10eHg5LmMKaW5kZXggNzQ5MmVhMy4uNTE3NTlkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXR4eDkuYworKysgYi9kcml2ZXJzL3NwaS9zcGktdHh4OS5jCkBAIC0zNDYsNyArMzQ2LDcgQEAKIAkJYy0+Y2xrID0gTlVMTDsKIAkJZ290byBleGl0OwogCX0KLQlyZXQgPSBjbGtfZW5hYmxlKGMtPmNsayk7CisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGMtPmNsayk7CiAJaWYgKHJldCkgewogCQljLT5jbGsgPSBOVUxMOwogCQlnb3RvIGV4aXQ7CkBAIC0zOTUsNyArMzk1LDcgQEAKIGV4aXRfYnVzeToKIAlyZXQgPSAtRUJVU1k7CiBleGl0OgotCWNsa19kaXNhYmxlKGMtPmNsayk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGMtPmNsayk7CiAJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtNDA2LDcgKzQwNiw3IEBACiAJc3RydWN0IHR4eDlzcGkgKmMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CiAKIAlmbHVzaF93b3JrKCZjLT53b3JrKTsKLQljbGtfZGlzYWJsZShjLT5jbGspOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShjLT5jbGspOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGkteGxwLmMgYi9kcml2ZXJzL3NwaS9zcGkteGxwLmMKaW5kZXggOGYwNGZlYy4uNDA3MWE3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXhscC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS14bHAuYwpAQCAtMTEsNiArMTEsNyBAQAogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqLworI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTQwNSw4ICs0MDYsOSBAQAogCWNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKIAlpZiAoSVNfRVJSKGNsaykpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IGdldCBzcGkgY2xvY2tcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKIAl9CisKIAl4c3BpLT5zcGlfY2xrID0gY2xrX2dldF9yYXRlKGNsayk7CiAKIAltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIDApOwpAQCAtNDM3LDYgKzQzOSwxNCBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX0FDUEkKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgeGxwX3NwaV9hY3BpX21hdGNoW10gPSB7CisJeyAiQlJDTTkwMEQiLCAwIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoYWNwaSwgeGxwX3NwaV9hY3BpX21hdGNoKTsKKyNlbmRpZgorCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB4bHBfc3BpX2R0X2lkW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJuZXRsb2dpYyx4bHA4MzItc3BpIiB9LAogCXsgfSwKQEAgLTQ0Nyw2ICs0NTcsNyBAQAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gInhscC1zcGkiLAogCQkub2ZfbWF0Y2hfdGFibGUgPSB4bHBfc3BpX2R0X2lkLAorCQkuYWNwaV9tYXRjaF90YWJsZSA9IEFDUElfUFRSKHhscF9zcGlfYWNwaV9tYXRjaCksCiAJfSwKIH07CiBtb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHhscF9zcGlfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS5jIGIvZHJpdmVycy9zcGkvc3BpLmMKaW5kZXggNTFhZDQyZi4uODE0NmNjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KIAogI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3NwaS5oPgpAQCAtNzA5LDYgKzcxMCwxMyBAQAogewogCWNvbnN0IGJvb2wgdm1hbGxvY2VkX2J1ZiA9IGlzX3ZtYWxsb2NfYWRkcihidWYpOwogCXVuc2lnbmVkIGludCBtYXhfc2VnX3NpemUgPSBkbWFfZ2V0X21heF9zZWdfc2l6ZShkZXYpOworI2lmZGVmIENPTkZJR19ISUdITUVNCisJY29uc3QgYm9vbCBrbWFwX2J1ZiA9ICgodW5zaWduZWQgbG9uZylidWYgPj0gUEtNQVBfQkFTRSAmJgorCQkJCSh1bnNpZ25lZCBsb25nKWJ1ZiA8IChQS01BUF9CQVNFICsKKwkJCQkJKExBU1RfUEtNQVAgKiBQQUdFX1NJWkUpKSk7CisjZWxzZQorCWNvbnN0IGJvb2wga21hcF9idWYgPSBmYWxzZTsKKyNlbmRpZgogCWludCBkZXNjX2xlbjsKIAlpbnQgc2dzOwogCXN0cnVjdCBwYWdlICp2bV9wYWdlOwpAQCAtNzE2LDcgKzcyNCw3IEBACiAJc2l6ZV90IG1pbjsKIAlpbnQgaSwgcmV0OwogCi0JaWYgKHZtYWxsb2NlZF9idWYpIHsKKwlpZiAodm1hbGxvY2VkX2J1ZiB8fCBrbWFwX2J1ZikgewogCQlkZXNjX2xlbiA9IG1pbl90KGludCwgbWF4X3NlZ19zaXplLCBQQUdFX1NJWkUpOwogCQlzZ3MgPSBESVZfUk9VTkRfVVAobGVuICsgb2Zmc2V0X2luX3BhZ2UoYnVmKSwgZGVzY19sZW4pOwogCX0gZWxzZSBpZiAodmlydF9hZGRyX3ZhbGlkKGJ1ZikpIHsKQEAgLTczMiwxMCArNzQwLDEzIEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgc2dzOyBpKyspIHsKIAotCQlpZiAodm1hbGxvY2VkX2J1ZikgeworCQlpZiAodm1hbGxvY2VkX2J1ZiB8fCBrbWFwX2J1ZikgewogCQkJbWluID0gbWluX3Qoc2l6ZV90LAogCQkJCSAgICBsZW4sIGRlc2NfbGVuIC0gb2Zmc2V0X2luX3BhZ2UoYnVmKSk7Ci0JCQl2bV9wYWdlID0gdm1hbGxvY190b19wYWdlKGJ1Zik7CisJCQlpZiAodm1hbGxvY2VkX2J1ZikKKwkJCQl2bV9wYWdlID0gdm1hbGxvY190b19wYWdlKGJ1Zik7CisJCQllbHNlCisJCQkJdm1fcGFnZSA9IGttYXBfdG9fcGFnZShidWYpOwogCQkJaWYgKCF2bV9wYWdlKSB7CiAJCQkJc2dfZnJlZV90YWJsZShzZ3QpOwogCQkJCXJldHVybiAtRU5PTUVNOwpAQCAtOTYwLDcgKzk3MSw3IEBACiAJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcjsKIAlib29sIGtlZXBfY3MgPSBmYWxzZTsKIAlpbnQgcmV0ID0gMDsKLQl1bnNpZ25lZCBsb25nIG1zID0gMTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbXMgPSAxOwogCXN0cnVjdCBzcGlfc3RhdGlzdGljcyAqc3RhdG0gPSAmbWFzdGVyLT5zdGF0aXN0aWNzOwogCXN0cnVjdCBzcGlfc3RhdGlzdGljcyAqc3RhdHMgPSAmbXNnLT5zcGktPnN0YXRpc3RpY3M7CiAKQEAgLTk5MSw5ICsxMDAyLDEzIEBACiAKIAkJCWlmIChyZXQgPiAwKSB7CiAJCQkJcmV0ID0gMDsKLQkJCQltcyA9IHhmZXItPmxlbiAqIDggKiAxMDAwIC8geGZlci0+c3BlZWRfaHo7CisJCQkJbXMgPSA4TEwgKiAxMDAwTEwgKiB4ZmVyLT5sZW47CisJCQkJZG9fZGl2KG1zLCB4ZmVyLT5zcGVlZF9oeik7CiAJCQkJbXMgKz0gbXMgKyAxMDA7IC8qIHNvbWUgdG9sZXJhbmNlICovCiAKKwkJCQlpZiAobXMgPiBVSU5UX01BWCkKKwkJCQkJbXMgPSBVSU5UX01BWDsKKwogCQkJCW1zID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZtYXN0ZXItPnhmZXJfY29tcGxldGlvbiwKIAkJCQkJCQkJIG1zZWNzX3RvX2ppZmZpZXMobXMpKTsKIAkJCX0KQEAgLTExNTksNiArMTE3NCw3IEBACiAJCWlmIChyZXQgPCAwKSB7CiAJCQlkZXZfZXJyKCZtYXN0ZXItPmRldiwgIkZhaWxlZCB0byBwb3dlciBkZXZpY2U6ICVkXG4iLAogCQkJCXJldCk7CisJCQltdXRleF91bmxvY2soJm1hc3Rlci0+aW9fbXV0ZXgpOwogCQkJcmV0dXJuOwogCQl9CiAJfQpAQCAtMTE3NCw2ICsxMTkwLDcgQEAKIAogCQkJaWYgKG1hc3Rlci0+YXV0b19ydW50aW1lX3BtKQogCQkJCXBtX3J1bnRpbWVfcHV0KG1hc3Rlci0+ZGV2LnBhcmVudCk7CisJCQltdXRleF91bmxvY2soJm1hc3Rlci0+aW9fbXV0ZXgpOwogCQkJcmV0dXJuOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcG1pL3NwbWktcG1pYy1hcmIuYyBiL2RyaXZlcnMvc3BtaS9zcG1pLXBtaWMtYXJiLmMKaW5kZXggYWNhMjgyZC4uNWVjM2E1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcG1pL3NwbWktcG1pYy1hcmIuYworKysgYi9kcml2ZXJzL3NwbWkvc3BtaS1wbWljLWFyYi5jCkBAIC05NTQsNiArOTU0LDcgQEAKIAlpZiAoY2hhbm5lbCA+IDUpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiaW52YWxpZCBjaGFubmVsICgldSkgc3BlY2lmaWVkLlxuIiwKIAkJCWNoYW5uZWwpOworCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIGVycl9wdXRfY3RybDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKaW5kZXggYWY5NDc2NC4uNThhN2IzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKQEAgLTQwLDggKzQwLDYgQEAKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L0tjb25maWciCiAKLXNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9LY29uZmlnIgotCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL29jdGVvbi9LY29uZmlnIgpAQCAtMTA0LDQgKzEwMiw4IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2tzNzAxMC9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvS2NvbmZpZyIKKwogZW5kaWYgIyBTVEFHSU5HCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUKaW5kZXggOWY2MDA5ZC4uMmZhOTc0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZQpAQCAtOSw3ICs5LDYgQEAKIG9iai0kKENPTkZJR19SVEw4MTkyRSkJCSs9IHJ0bDgxOTJlLwogb2JqLSQoQ09ORklHX1I4NzEyVSkJCSs9IHJ0bDg3MTIvCiBvYmotJChDT05GSUdfUjgxODhFVSkJCSs9IHJ0bDgxODhldS8KLW9iai0kKENPTkZJR19SODcyM0FVKQkJKz0gcnRsODcyM2F1Lwogb2JqLSQoQ09ORklHX1JUUzUyMDgpCQkrPSBydHM1MjA4Lwogb2JqLSQoQ09ORklHX05FVExPR0lDX1hMUl9ORVQpCSs9IG5ldGxvZ2ljLwogb2JqLSQoQ09ORklHX09DVEVPTl9FVEhFUk5FVCkJKz0gb2N0ZW9uLwpAQCAtNDEsMyArNDAsNSBAQAogb2JqLSQoQ09ORklHX01PU1QpCQkrPSBtb3N0Lwogb2JqLSQoQ09ORklHX0lTRE5fSTRMKQkJKz0gaTRsLwogb2JqLSQoQ09ORklHX0tTNzAxMCkJCSs9IGtzNzAxMC8KK29iai0kKENPTkZJR19HUkVZQlVTKQkJKz0gZ3JleWJ1cy8KK29iai0kKENPTkZJR19CQ00yNzA4X1ZDSElRKQkrPSB2YzA0X3NlcnZpY2VzLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL0tjb25maWcKaW5kZXggMDZlNDFkMi4uNmMwMGQ2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9LY29uZmlnCkBAIC0yNCwxOSArMjQsNiBAQAogCSAgc2NyaXB0cyAoL2luaXQucmMpLCBhbmQgaXQgZGVmaW5lcyBwcmlvcml0eSB2YWx1ZXMgd2l0aCBtaW5pbXVtIGZyZWUgbWVtb3J5IHNpemUKIAkgIGZvciBlYWNoIHByaW9yaXR5LgogCi1jb25maWcgU1dfU1lOQwotCWJvb2wgIlNvZnR3YXJlIHN5bmNocm9uaXphdGlvbiBmcmFtZXdvcmsiCi0JZGVmYXVsdCBuCi0JZGVwZW5kcyBvbiBTWU5DX0ZJTEUKLQlkZXBlbmRzIG9uIERFQlVHX0ZTCi0JLS0taGVscC0tLQotCSAgQSBzeW5jIG9iamVjdCBkcml2ZXIgdGhhdCB1c2VzIGEgMzJiaXQgY291bnRlciB0byBjb29yZGluYXRlCi0JICBzeW5jaHJvbml6YXRpb24uICBVc2VmdWwgd2hlbiB0aGVyZSBpcyBubyBoYXJkd2FyZSBwcmltaXRpdmUgYmFja2luZwotCSAgdGhlIHN5bmNocm9uaXphdGlvbi4KLQotCSAgV0FSTklORzogaW1wcm9wZXIgdXNlIG9mIHRoaXMgY2FuIHJlc3VsdCBpbiBkZWFkbG9ja2luZyBrZXJuZWwKLQkgIGRyaXZlcnMgZnJvbSB1c2Vyc3BhY2UuIEludGVuZGVkIGZvciB0ZXN0IGFuZCBkZWJ1ZyBvbmx5LgotCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9LY29uZmlnIgogCiBlbmRpZiAjIGlmIEFORFJPSUQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvTWFrZWZpbGUKaW5kZXggN2NhNjFiNy4uN2VkMWJlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvTWFrZWZpbGUKQEAgLTQsNCArNCwzIEBACiAKIG9iai0kKENPTkZJR19BU0hNRU0pCQkJKz0gYXNobWVtLm8KIG9iai0kKENPTkZJR19BTkRST0lEX0xPV19NRU1PUllfS0lMTEVSKQkrPSBsb3dtZW1vcnlraWxsZXIubwotb2JqLSQoQ09ORklHX1NXX1NZTkMpCQkJKz0gc3dfc3luYy5vIHN5bmNfZGVidWcubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vS2NvbmZpZwppbmRleCAxOWMxNTcyLi5jOGZiNDEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vS2NvbmZpZwpAQCAtMzYsNyArMzYsMTkgQEAKIGNvbmZpZyBJT05fSElTSQogCXRyaXN0YXRlICJJb24gZm9yIEhpc2lsaWNvbiIKIAlkZXBlbmRzIG9uIEFSQ0hfSElTSSAmJiBJT04KKwlzZWxlY3QgSU9OX09GCiAJaGVscAogCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSB3aXNoIHRvIHVzZSBpb24gb24gSGlzaWxpY29uIFBsYXRmb3JtLgogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9oaXNpbGljb24vS2NvbmZpZyIKKworY29uZmlnIElPTl9PRgorCWJvb2wgIkRldmljZXRyZWUgc3VwcG9ydCBmb3IgSW9uIgorCWRlcGVuZHMgb24gSU9OICYmIE9GX0FERFJFU1MKKwloZWxwCisJICBQcm92aWRlcyBiYXNlIHN1cHBvcnQgZm9yIGRlZmluaW5nIElvbiBoZWFwcyBpbiBkZXZpY2V0cmVlCisJICBhbmQgc2V0dGluZyB0aGVtIHVwLiBBbHNvIGluY2x1ZGVzIGZ1bmN0aW9ucyBmb3IgcGxhdGZvcm1zCisJICB0byBwYXJzZSB0aGUgZGV2aWNldHJlZSBhbmQgZXhwYW5kIGZvciB0aGVpciBvd24gY3VzdG9tCisJICBleHRlbnNpb25zCisKKwkgIElmIHVzaW5nIElvbiBhbmQgZGV2aWNldHJlZSwgeW91IHNob3VsZCBzYXkgWSBoZXJlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vTWFrZWZpbGUKaW5kZXggMThjYzJhYS4uNWQ2MzBhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9NYWtlZmlsZQpAQCAtMSw0ICsxLDUgQEAKLW9iai0kKENPTkZJR19JT04pICs9CWlvbi5vIGlvbl9oZWFwLm8gaW9uX3BhZ2VfcG9vbC5vIGlvbl9zeXN0ZW1faGVhcC5vIFwKK29iai0kKENPTkZJR19JT04pICs9CWlvbi5vIGlvbi1pb2N0bC5vIGlvbl9oZWFwLm8gXAorCQkJaW9uX3BhZ2VfcG9vbC5vIGlvbl9zeXN0ZW1faGVhcC5vIFwKIAkJCWlvbl9jYXJ2ZW91dF9oZWFwLm8gaW9uX2NodW5rX2hlYXAubyBpb25fY21hX2hlYXAubwogb2JqLSQoQ09ORklHX0lPTl9URVNUKSArPSBpb25fdGVzdC5vCiBpZmRlZiBDT05GSUdfQ09NUEFUCkBAIC04LDQgKzksNSBAQAogb2JqLSQoQ09ORklHX0lPTl9EVU1NWSkgKz0gaW9uX2R1bW15X2RyaXZlci5vCiBvYmotJChDT05GSUdfSU9OX1RFR1JBKSArPSB0ZWdyYS8KIG9iai0kKENPTkZJR19JT05fSElTSSkgKz0gaGlzaWxpY29uLworb2JqLSQoQ09ORklHX0lPTl9PRikgKz0gaW9uX29mLm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2RldmljZXRyZWUudHh0IGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2RldmljZXRyZWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ODcxNTI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2RldmljZXRyZWUudHh0CkBAIC0wLDAgKzEsNTEgQEAKK0lvbiBNZW1vcnkgTWFuYWdlcgorCitJb24gaXMgYSBtZW1vcnkgbWFuYWdlciB0aGF0IGFsbG93cyBmb3Igc2hhcmluZyBvZiBidWZmZXJzIHZpYSBkbWEtYnVmLgorSW9uIGFsbG93cyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIGFsbG9jYXRpb24gdmlhIGFuIGFic3RyYWN0aW9uIGNhbGxlZAorYSAnaGVhcCcuIEEgaGVhcCByZXByZXNlbnRzIGEgc3BlY2lmaWMgdHlwZSBvZiBtZW1vcnkuIEVhY2ggaGVhcCBoYXMKK2EgZGlmZmVyZW50IHR5cGUuIFRoZXJlIGNhbiBiZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgaGVhcAordHlwZS4KKworU3BlY2lmaWMgaGVhcCBpbnN0YW5jZXMgYXJlIHRpZWQgdG8gaGVhcCBJRHMuIEhlYXAgSURzIGFyZSBub3QgdG8gYmUgc3BlY2lmaWVkCitpbiB0aGUgZGV2aWNldHJlZS4KKworUmVxdWlyZWQgcHJvcGVydGllcyBmb3IgSW9uCisKKy0gY29tcGF0aWJsZTogImxpbnV4LGlvbiIgUExVUyBhIGNvbXBhdGlibGUgcHJvcGVydHkgZm9yIHRoZSBkZXZpY2UKKworQWxsIGNoaWxkIG5vZGVzIG9mIGEgbGludXgsaW9uIG5vZGUgYXJlIGludGVycHJldGVkIGFzIGhlYXBzCisKK3JlcXVpcmVkIHByb3BlcnRpZXMgZm9yIGhlYXBzCisKKy0gY29tcGF0aWJsZTogY29tcGF0aWJsZSBzdHJpbmcgZm9yIGEgaGVhcCB0eXBlIFBMVVMgYSBjb21wYXRpYmxlIHByb3BlcnR5Citmb3IgdGhlIHNwZWNpZmljIGluc3RhbmNlIG9mIHRoZSBoZWFwLiBDdXJyZW50IGhlYXAgdHlwZXMKKy0tIGxpbnV4LGlvbi1oZWFwLXN5c3RlbQorLS0gbGludXgsaW9uLWhlYXAtc3lzdGVtLWNvbnRpZworLS0gbGludXgsaW9uLWhlYXAtY2FydmVvdXQKKy0tIGxpbnV4LGlvbi1oZWFwLWNodW5rCistLSBsaW51eCxpb24taGVhcC1kbWEKKy0tIGxpbnV4LGlvbi1oZWFwLWN1c3RvbQorCitPcHRpb25hbCBwcm9wZXJ0aWVzCistIG1lbW9yeS1yZWdpb246IEEgcGhhbmRsZSB0byBhIG1lbW9yeSByZWdpb24uIFJlcXVpcmVkIGZvciBETUEgaGVhcCB0eXBlCisoc2VlIHJlc2VydmVkLW1lbW9yeS50eHQgZm9yIGRldGFpbHMgb24gdGhlIHJlc2VydmF0aW9uKQorCitFeGFtcGxlOgorCisJaW9uIHsKKwkJY29tcGF0YmlsZSA9ICJoaXNpbGljb24saW9uIiwgImxpbnV4LGlvbiI7CisKKwkJaW9uLXN5c3RlbS1oZWFwIHsKKwkJCWNvbXBhdGJpbGUgPSAiaGlzaWxpY29uLHN5c3RlbS1oZWFwIiwgImxpbnV4LGlvbi1oZWFwLXN5c3RlbSIKKwkJfTsKKworCQlpb24tY2FtZXJhLXJlZ2lvbiB7CisJCQljb21wYXRpYmxlID0gImhpc2lsaWNvbixjYW1lcmEtaGVhcCIsICJsaW51eCxpb24taGVhcC1kbWEiCisJCQltZW1vcnktcmVnaW9uID0gPCZjYW1lcmFfcmVnaW9uPjsKKwkJfTsKKworCQlpb24tZmItcmVnaW9uIHsKKwkJCWNvbXBhdGJpbGUgPSAiaGlzaWxpY29uLGZiLWhlYXAiLCAibGludXgsaW9uLWhlYXAtZG1hIgorCQkJbWVtb3J5LXJlZ2lvbiA9IDwmZmJfcmVnaW9uPjsKKwkJfTsKKwl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaGlzaWxpY29uL2hpNjIyMF9pb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9oaXNpbGljb24vaGk2MjIwX2lvbi5jCmluZGV4IGZlOWYwZmQuLjBkZTc4OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9oaXNpbGljb24vaGk2MjIwX2lvbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9oaXNpbGljb24vaGk2MjIwX2lvbi5jCkBAIC0xOSwxODEgKzE5LDc0IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlICIuLi9pb25fcHJpdi5oIgogI2luY2x1ZGUgIi4uL2lvbi5oIgorI2luY2x1ZGUgIi4uL2lvbl9vZi5oIgogCi1zdHJ1Y3QgaGk2MjIwX2lvbl90eXBlX3RhYmxlIHsKLQljb25zdCBjaGFyICpuYW1lOwotCWVudW0gaW9uX2hlYXBfdHlwZSB0eXBlOworc3RydWN0IGhpc2lfaW9uX2RldiB7CisJc3RydWN0IGlvbl9oZWFwCSoqaGVhcHM7CisJc3RydWN0IGlvbl9kZXZpY2UgKmlkZXY7CisJc3RydWN0IGlvbl9wbGF0Zm9ybV9kYXRhICpkYXRhOwogfTsKIAotc3RhdGljIHN0cnVjdCBoaTYyMjBfaW9uX3R5cGVfdGFibGUgaW9uX3R5cGVfdGFibGVbXSA9IHsKLQl7Imlvbl9zeXN0ZW0iLCBJT05fSEVBUF9UWVBFX1NZU1RFTX0sCi0JeyJpb25fc3lzdGVtX2NvbnRpZyIsIElPTl9IRUFQX1RZUEVfU1lTVEVNX0NPTlRJR30sCi0JeyJpb25fY2FydmVvdXQiLCBJT05fSEVBUF9UWVBFX0NBUlZFT1VUfSwKLQl7Imlvbl9jaHVuayIsIElPTl9IRUFQX1RZUEVfQ0hVTkt9LAotCXsiaW9uX2RtYSIsIElPTl9IRUFQX1RZUEVfRE1BfSwKLQl7Imlvbl9jdXN0b20iLCBJT05fSEVBUF9UWVBFX0NVU1RPTX0sCitzdGF0aWMgc3RydWN0IGlvbl9vZl9oZWFwIGhpc2lfaGVhcHNbXSA9IHsKKwlQTEFURk9STV9IRUFQKCJoaXNpbGljb24sc3lzX3VzZXIiLCAwLAorCQkgICAgICBJT05fSEVBUF9UWVBFX1NZU1RFTSwgInN5c191c2VyIiksCisJUExBVEZPUk1fSEVBUCgiaGlzaWxpY29uLHN5c19jb250aWciLCAxLAorCQkgICAgICBJT05fSEVBUF9UWVBFX1NZU1RFTV9DT05USUcsICJzeXNfY29udGlnIiksCisJUExBVEZPUk1fSEVBUCgiaGlzaWxpY29uLGNtYSIsIElPTl9IRUFQX1RZUEVfRE1BLCBJT05fSEVBUF9UWVBFX0RNQSwKKwkJICAgICAgImNtYSIpLAorCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IGlvbl9kZXZpY2UgKmlkZXY7Ci1zdGF0aWMgaW50IG51bV9oZWFwczsKLXN0YXRpYyBzdHJ1Y3QgaW9uX2hlYXAgKipoZWFwczsKLXN0YXRpYyBzdHJ1Y3QgaW9uX3BsYXRmb3JtX2hlYXAgKipoZWFwc19kYXRhOwotCi1zdGF0aWMgaW50IGdldF90eXBlX2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSwgZW51bSBpb25faGVhcF90eXBlICp0eXBlKQorc3RhdGljIGludCBoaTYyMjBfaW9uX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CisJc3RydWN0IGhpc2lfaW9uX2RldiAqaXBkZXY7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpb25fdHlwZV90YWJsZSk7IGkrKykgewotCQlpZiAoc3RybmNtcChuYW1lLCBpb25fdHlwZV90YWJsZVtpXS5uYW1lLCBzdHJsZW4obmFtZSkpKQotCQkJY29udGludWU7Ci0KLQkJKnR5cGUgPSBpb25fdHlwZV90YWJsZVtpXS50eXBlOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIGludCBoaTYyMjBfc2V0X3BsYXRmb3JtX2RhdGEoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQl1bnNpZ25lZCBpbnQgYmFzZTsKLQl1bnNpZ25lZCBpbnQgc2l6ZTsKLQl1bnNpZ25lZCBpbnQgaWQ7Ci0JY29uc3QgY2hhciAqaGVhcF9uYW1lOwotCWNvbnN0IGNoYXIgKnR5cGVfbmFtZTsKLQllbnVtIGlvbl9oZWFwX3R5cGUgdHlwZTsKLQlpbnQgcmV0OwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0Jc3RydWN0IGlvbl9wbGF0Zm9ybV9oZWFwICpwX2RhdGE7Ci0JY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpkdF9ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7Ci0JaW50IGluZGV4ID0gMDsKLQotCWZvcl9lYWNoX2NoaWxkX29mX25vZGUoZHRfbm9kZSwgbnApCi0JCW51bV9oZWFwcysrOwotCi0JaGVhcHNfZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAotCQkJCSAgc2l6ZW9mKHN0cnVjdCBpb25fcGxhdGZvcm1faGVhcCAqKSAqCi0JCQkJICBudW1faGVhcHMsCi0JCQkJICBHRlBfS0VSTkVMKTsKLQlpZiAoIWhlYXBzX2RhdGEpCisJaXBkZXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCppcGRldiksIEdGUF9LRVJORUwpOworCWlmICghaXBkZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShkdF9ub2RlLCBucCkgewotCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhucCwgImhlYXAtbmFtZSIsICZoZWFwX25hbWUpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCJjaGVjayB0aGUgbmFtZSBvZiBub2RlICVzXG4iLCBucC0+bmFtZSk7Ci0JCQljb250aW51ZTsKLQkJfQorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGlwZGV2KTsKIAotCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImhlYXAtaWQiLCAmaWQpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCJjaGVjayB0aGUgaWQgJXNcbiIsIG5wLT5uYW1lKTsKLQkJCWNvbnRpbnVlOwotCQl9CisJaXBkZXYtPmlkZXYgPSBpb25fZGV2aWNlX2NyZWF0ZShOVUxMKTsKKwlpZiAoSVNfRVJSKGlwZGV2LT5pZGV2KSkKKwkJcmV0dXJuIFBUUl9FUlIoaXBkZXYtPmlkZXYpOwogCi0JCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiaGVhcC1iYXNlIiwgJmJhc2UpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCJjaGVjayB0aGUgYmFzZSBvZiBub2RlICVzXG4iLCBucC0+bmFtZSk7Ci0JCQljb250aW51ZTsKLQkJfQorCWlwZGV2LT5kYXRhID0gaW9uX3BhcnNlX2R0KHBkZXYsIGhpc2lfaGVhcHMpOworCWlmIChJU19FUlIoaXBkZXYtPmRhdGEpKQorCQlyZXR1cm4gUFRSX0VSUihpcGRldi0+ZGF0YSk7CiAKLQkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJoZWFwLXNpemUiLCAmc2l6ZSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoImNoZWNrIHRoZSBzaXplIG9mIG5vZGUgJXNcbiIsIG5wLT5uYW1lKTsKLQkJCWNvbnRpbnVlOwotCQl9CisJaXBkZXYtPmhlYXBzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCisJCQkJc2l6ZW9mKHN0cnVjdCBpb25faGVhcCkgKiBpcGRldi0+ZGF0YS0+bnIsCisJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFpcGRldi0+aGVhcHMpIHsKKwkJaW9uX2Rlc3Ryb3lfcGxhdGZvcm1fZGF0YShpcGRldi0+ZGF0YSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KIAotCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhucCwgImhlYXAtdHlwZSIsICZ0eXBlX25hbWUpOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJfZXJyKCJjaGVjayB0aGUgdHlwZSBvZiBub2RlICVzXG4iLCBucC0+bmFtZSk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXJldCA9IGdldF90eXBlX2J5X25hbWUodHlwZV9uYW1lLCAmdHlwZSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcl9lcnIoInR5cGUgbmFtZSBlcnJvciAlcyFcbiIsIHR5cGVfbmFtZSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlwcl9pbmZvKCJoZWFwIGluZGV4ICVkIDogbmFtZSAlcyBiYXNlIDB4JXggc2l6ZSAweCV4IGlkICVkIHR5cGUgJWRcbiIsCi0JCQlpbmRleCwgaGVhcF9uYW1lLCBiYXNlLCBzaXplLCBpZCwgdHlwZSk7Ci0KLQkJcF9kYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCi0JCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBpb25fcGxhdGZvcm1faGVhcCksCi0JCQkJICAgICAgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcF9kYXRhKQorCWZvciAoaSA9IDA7IGkgPCBpcGRldi0+ZGF0YS0+bnI7IGkrKykgeworCQlpcGRldi0+aGVhcHNbaV0gPSBpb25faGVhcF9jcmVhdGUoJmlwZGV2LT5kYXRhLT5oZWFwc1tpXSk7CisJCWlmICghaXBkZXYtPmhlYXBzKSB7CisJCQlpb25fZGVzdHJveV9wbGF0Zm9ybV9kYXRhKGlwZGV2LT5kYXRhKTsKIAkJCXJldHVybiAtRU5PTUVNOwotCi0JCXBfZGF0YS0+bmFtZSA9IGhlYXBfbmFtZTsKLQkJcF9kYXRhLT5iYXNlID0gYmFzZTsKLQkJcF9kYXRhLT5zaXplID0gc2l6ZTsKLQkJcF9kYXRhLT5pZCA9IGlkOwotCQlwX2RhdGEtPnR5cGUgPSB0eXBlOwotCi0JCWhlYXBzX2RhdGFbaW5kZXhdID0gcF9kYXRhOwotCQlpbmRleCsrOworCQl9CisJCWlvbl9kZXZpY2VfYWRkX2hlYXAoaXBkZXYtPmlkZXYsIGlwZGV2LT5oZWFwc1tpXSk7CiAJfQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGhpNjIyMF9pb25fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgaTsKLQlpbnQgZXJyOwotCXN0YXRpYyBzdHJ1Y3QgaW9uX3BsYXRmb3JtX2hlYXAgKnBfaGVhcDsKLQotCWlkZXYgPSBpb25fZGV2aWNlX2NyZWF0ZShOVUxMKTsKLQllcnIgPSBoaTYyMjBfc2V0X3BsYXRmb3JtX2RhdGEocGRldik7Ci0JaWYgKGVycikgewotCQlwcl9lcnIoImlvbiBzZXQgcGxhdGZvcm0gZGF0YSBlcnJvciFcbiIpOwotCQlnb3RvIGVycl9mcmVlX2lkZXY7Ci0JfQotCWhlYXBzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCi0JCQkgICAgIHNpemVvZihzdHJ1Y3QgaW9uX2hlYXAgKikgKiBudW1faGVhcHMsCi0JCQkgICAgIEdGUF9LRVJORUwpOwotCWlmICghaGVhcHMpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBlcnJfZnJlZV9pZGV2OwotCX0KLQotCS8qCi0JICogY3JlYXRlIHRoZSBoZWFwcyBhcyBzcGVjaWZpZWQgaW4gdGhlIGR0cyBmaWxlCi0JICovCi0JZm9yIChpID0gMDsgaSA8IG51bV9oZWFwczsgaSsrKSB7Ci0JCXBfaGVhcCA9IGhlYXBzX2RhdGFbaV07Ci0JCWhlYXBzW2ldID0gaW9uX2hlYXBfY3JlYXRlKHBfaGVhcCk7Ci0JCWlmIChJU19FUlJfT1JfTlVMTChoZWFwc1tpXSkpIHsKLQkJCWVyciA9IFBUUl9FUlIoaGVhcHNbaV0pOwotCQkJZ290byBlcnJfZnJlZV9oZWFwczsKLQkJfQotCi0JCWlvbl9kZXZpY2VfYWRkX2hlYXAoaWRldiwgaGVhcHNbaV0pOwotCi0JCXByX2luZm8oIiVzOiBhZGRpbmcgaGVhcCAlcyBvZiB0eXBlICVkIHdpdGggJWx4QCVseFxuIiwKLQkJCV9fZnVuY19fLCBwX2hlYXAtPm5hbWUsIHBfaGVhcC0+dHlwZSwKLQkJCXBfaGVhcC0+YmFzZSwgKHVuc2lnbmVkIGxvbmcpcF9oZWFwLT5zaXplKTsKLQl9Ci0JcmV0dXJuIGVycjsKLQotZXJyX2ZyZWVfaGVhcHM6Ci0JZm9yIChpID0gMDsgaSA8IG51bV9oZWFwczsgKytpKSB7Ci0JCWlvbl9oZWFwX2Rlc3Ryb3koaGVhcHNbaV0pOwotCQloZWFwc1tpXSA9IE5VTEw7Ci0JfQotZXJyX2ZyZWVfaWRldjoKLQlpb25fZGV2aWNlX2Rlc3Ryb3koaWRldik7Ci0KLQlyZXR1cm4gZXJyOwotfQotCiBzdGF0aWMgaW50IGhpNjIyMF9pb25fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CisJc3RydWN0IGhpc2lfaW9uX2RldiAqaXBkZXY7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2hlYXBzOyBpKyspIHsKLQkJaW9uX2hlYXBfZGVzdHJveShoZWFwc1tpXSk7Ci0JCWhlYXBzW2ldID0gTlVMTDsKLQl9Ci0JaW9uX2RldmljZV9kZXN0cm95KGlkZXYpOworCWlwZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlmb3IgKGkgPSAwOyBpIDwgaXBkZXYtPmRhdGEtPm5yOyBpKyspCisJCWlvbl9oZWFwX2Rlc3Ryb3koaXBkZXYtPmhlYXBzW2ldKTsKKworCWlvbl9kZXN0cm95X3BsYXRmb3JtX2RhdGEoaXBkZXYtPmRhdGEpOworCWlvbl9kZXZpY2VfZGVzdHJveShpcGRldi0+aWRldik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb24taW9jdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb24taW9jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTc0MzFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbi1pb2N0bC5jCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUsIEluYy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiaW9uLmgiCisjaW5jbHVkZSAiaW9uX3ByaXYuaCIKKyNpbmNsdWRlICJjb21wYXRfaW9uLmgiCisKK3VuaW9uIGlvbl9pb2N0bF9hcmcgeworCXN0cnVjdCBpb25fZmRfZGF0YSBmZDsKKwlzdHJ1Y3QgaW9uX2FsbG9jYXRpb25fZGF0YSBhbGxvY2F0aW9uOworCXN0cnVjdCBpb25faGFuZGxlX2RhdGEgaGFuZGxlOworCXN0cnVjdCBpb25fY3VzdG9tX2RhdGEgY3VzdG9tOworCXN0cnVjdCBpb25faGVhcF9xdWVyeSBxdWVyeTsKK307CisKK3N0YXRpYyBpbnQgdmFsaWRhdGVfaW9jdGxfYXJnKHVuc2lnbmVkIGludCBjbWQsIHVuaW9uIGlvbl9pb2N0bF9hcmcgKmFyZykKK3sKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBJT05fSU9DX0hFQVBfUVVFUlk6CisJCXJldCA9IGFyZy0+cXVlcnkucmVzZXJ2ZWQwICE9IDA7CisJCXJldCB8PSBhcmctPnF1ZXJ5LnJlc2VydmVkMSAhPSAwOworCQlyZXQgfD0gYXJnLT5xdWVyeS5yZXNlcnZlZDIgIT0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldCA/IC1FSU5WQUwgOiAwOworfQorCisvKiBmaXggdXAgdGhlIGNhc2VzIHdoZXJlIHRoZSBpb2N0bCBkaXJlY3Rpb24gYml0cyBhcmUgaW5jb3JyZWN0ICovCitzdGF0aWMgdW5zaWduZWQgaW50IGlvbl9pb2N0bF9kaXIodW5zaWduZWQgaW50IGNtZCkKK3sKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSU9OX0lPQ19TWU5DOgorCWNhc2UgSU9OX0lPQ19GUkVFOgorCWNhc2UgSU9OX0lPQ19DVVNUT006CisJCXJldHVybiBfSU9DX1dSSVRFOworCWRlZmF1bHQ6CisJCXJldHVybiBfSU9DX0RJUihjbWQpOworCX0KK30KKworbG9uZyBpb25faW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGlvbl9kZXZpY2UgKmRldiA9IGNsaWVudC0+ZGV2OworCXN0cnVjdCBpb25faGFuZGxlICpjbGVhbnVwX2hhbmRsZSA9IE5VTEw7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50IGRpcjsKKwl1bmlvbiBpb25faW9jdGxfYXJnIGRhdGE7CisKKwlkaXIgPSBpb25faW9jdGxfZGlyKGNtZCk7CisKKwlpZiAoX0lPQ19TSVpFKGNtZCkgPiBzaXplb2YoZGF0YSkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBUaGUgY29weV9mcm9tX3VzZXIgaXMgdW5jb25kaXRpb25hbCBoZXJlIGZvciBib3RoIHJlYWQgYW5kIHdyaXRlCisJICogdG8gZG8gdGhlIHZhbGlkYXRlLiBJZiB0aGVyZSBpcyBubyB3cml0ZSBmb3IgdGhlIGlvY3RsLCB0aGUKKwkgKiBidWZmZXIgaXMgY2xlYXJlZAorCSAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmZGF0YSwgKHZvaWQgX191c2VyICopYXJnLCBfSU9DX1NJWkUoY21kKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0ID0gdmFsaWRhdGVfaW9jdGxfYXJnKGNtZCwgJmRhdGEpOworCWlmIChXQVJOX09OX09OQ0UocmV0KSkKKwkJcmV0dXJuIHJldDsKKworCWlmICghKGRpciAmIF9JT0NfV1JJVEUpKQorCQltZW1zZXQoJmRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSU9OX0lPQ19BTExPQzoKKwl7CisJCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGU7CisKKwkJaGFuZGxlID0gaW9uX2FsbG9jKGNsaWVudCwgZGF0YS5hbGxvY2F0aW9uLmxlbiwKKwkJCQkJCWRhdGEuYWxsb2NhdGlvbi5hbGlnbiwKKwkJCQkJCWRhdGEuYWxsb2NhdGlvbi5oZWFwX2lkX21hc2ssCisJCQkJCQlkYXRhLmFsbG9jYXRpb24uZmxhZ3MpOworCQlpZiAoSVNfRVJSKGhhbmRsZSkpCisJCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOworCisJCWRhdGEuYWxsb2NhdGlvbi5oYW5kbGUgPSBoYW5kbGUtPmlkOworCisJCWNsZWFudXBfaGFuZGxlID0gaGFuZGxlOworCQlicmVhazsKKwl9CisJY2FzZSBJT05fSU9DX0ZSRUU6CisJeworCQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlOworCisJCW11dGV4X2xvY2soJmNsaWVudC0+bG9jayk7CisJCWhhbmRsZSA9IGlvbl9oYW5kbGVfZ2V0X2J5X2lkX25vbG9jayhjbGllbnQsIGRhdGEuaGFuZGxlLmhhbmRsZSk7CisJCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQkJbXV0ZXhfdW5sb2NrKCZjbGllbnQtPmxvY2spOworCQkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKwkJfQorCQlpb25fZnJlZV9ub2xvY2soY2xpZW50LCBoYW5kbGUpOworCQlpb25faGFuZGxlX3B1dF9ub2xvY2soaGFuZGxlKTsKKwkJbXV0ZXhfdW5sb2NrKCZjbGllbnQtPmxvY2spOworCQlicmVhazsKKwl9CisJY2FzZSBJT05fSU9DX1NIQVJFOgorCWNhc2UgSU9OX0lPQ19NQVA6CisJeworCQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlOworCisJCWhhbmRsZSA9IGlvbl9oYW5kbGVfZ2V0X2J5X2lkKGNsaWVudCwgZGF0YS5oYW5kbGUuaGFuZGxlKTsKKwkJaWYgKElTX0VSUihoYW5kbGUpKQorCQkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKwkJZGF0YS5mZC5mZCA9IGlvbl9zaGFyZV9kbWFfYnVmX2ZkKGNsaWVudCwgaGFuZGxlKTsKKwkJaW9uX2hhbmRsZV9wdXQoaGFuZGxlKTsKKwkJaWYgKGRhdGEuZmQuZmQgPCAwKQorCQkJcmV0ID0gZGF0YS5mZC5mZDsKKwkJYnJlYWs7CisJfQorCWNhc2UgSU9OX0lPQ19JTVBPUlQ6CisJeworCQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlOworCisJCWhhbmRsZSA9IGlvbl9pbXBvcnRfZG1hX2J1Zl9mZChjbGllbnQsIGRhdGEuZmQuZmQpOworCQlpZiAoSVNfRVJSKGhhbmRsZSkpCisJCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7CisJCWVsc2UKKwkJCWRhdGEuaGFuZGxlLmhhbmRsZSA9IGhhbmRsZS0+aWQ7CisJCWJyZWFrOworCX0KKwljYXNlIElPTl9JT0NfU1lOQzoKKwl7CisJCXJldCA9IGlvbl9zeW5jX2Zvcl9kZXZpY2UoY2xpZW50LCBkYXRhLmZkLmZkKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgSU9OX0lPQ19DVVNUT006CisJeworCQlpZiAoIWRldi0+Y3VzdG9tX2lvY3RsKQorCQkJcmV0dXJuIC1FTk9UVFk7CisJCXJldCA9IGRldi0+Y3VzdG9tX2lvY3RsKGNsaWVudCwgZGF0YS5jdXN0b20uY21kLAorCQkJCQkJZGF0YS5jdXN0b20uYXJnKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgSU9OX0lPQ19IRUFQX1FVRVJZOgorCQlyZXQgPSBpb25fcXVlcnlfaGVhcHMoY2xpZW50LCAmZGF0YS5xdWVyeSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFRZOworCX0KKworCWlmIChkaXIgJiBfSU9DX1JFQUQpIHsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZkYXRhLCBfSU9DX1NJWkUoY21kKSkpIHsKKwkJCWlmIChjbGVhbnVwX2hhbmRsZSkKKwkJCQlpb25fZnJlZShjbGllbnQsIGNsZWFudXBfaGFuZGxlKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uLmMKaW5kZXggYTJjZjkzYi4uMzk2ZGVkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb24uYwpAQCAtNDEsODAgKzQxLDYgQEAKICNpbmNsdWRlICJpb25fcHJpdi5oIgogI2luY2x1ZGUgImNvbXBhdF9pb24uaCIKIAotLyoqCi0gKiBzdHJ1Y3QgaW9uX2RldmljZSAtIHRoZSBtZXRhZGF0YSBvZiB0aGUgaW9uIGRldmljZSBub2RlCi0gKiBAZGV2OgkJdGhlIGFjdHVhbCBtaXNjIGRldmljZQotICogQGJ1ZmZlcnM6CQlhbiByYiB0cmVlIG9mIGFsbCB0aGUgZXhpc3RpbmcgYnVmZmVycwotICogQGJ1ZmZlcl9sb2NrOglsb2NrIHByb3RlY3RpbmcgdGhlIHRyZWUgb2YgYnVmZmVycwotICogQGxvY2s6CQlyd3NlbSBwcm90ZWN0aW5nIHRoZSB0cmVlIG9mIGhlYXBzIGFuZCBjbGllbnRzCi0gKiBAaGVhcHM6CQlsaXN0IG9mIGFsbCB0aGUgaGVhcHMgaW4gdGhlIHN5c3RlbQotICogQHVzZXJfY2xpZW50czoJbGlzdCBvZiBhbGwgdGhlIGNsaWVudHMgY3JlYXRlZCBmcm9tIHVzZXJzcGFjZQotICovCi1zdHJ1Y3QgaW9uX2RldmljZSB7Ci0Jc3RydWN0IG1pc2NkZXZpY2UgZGV2OwotCXN0cnVjdCByYl9yb290IGJ1ZmZlcnM7Ci0Jc3RydWN0IG11dGV4IGJ1ZmZlcl9sb2NrOwotCXN0cnVjdCByd19zZW1hcGhvcmUgbG9jazsKLQlzdHJ1Y3QgcGxpc3RfaGVhZCBoZWFwczsKLQlsb25nICgqY3VzdG9tX2lvY3RsKShzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLAotCQkJICAgICB1bnNpZ25lZCBsb25nIGFyZyk7Ci0Jc3RydWN0IHJiX3Jvb3QgY2xpZW50czsKLQlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z19yb290OwotCXN0cnVjdCBkZW50cnkgKmhlYXBzX2RlYnVnX3Jvb3Q7Ci0Jc3RydWN0IGRlbnRyeSAqY2xpZW50c19kZWJ1Z19yb290OwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgaW9uX2NsaWVudCAtIGEgcHJvY2Vzcy9odyBibG9jayBsb2NhbCBhZGRyZXNzIHNwYWNlCi0gKiBAbm9kZToJCW5vZGUgaW4gdGhlIHRyZWUgb2YgYWxsIGNsaWVudHMKLSAqIEBkZXY6CQliYWNrcG9pbnRlciB0byBpb24gZGV2aWNlCi0gKiBAaGFuZGxlczoJCWFuIHJiIHRyZWUgb2YgYWxsIHRoZSBoYW5kbGVzIGluIHRoaXMgY2xpZW50Ci0gKiBAaWRyOgkJYW4gaWRyIHNwYWNlIGZvciBhbGxvY2F0aW5nIGhhbmRsZSBpZHMKLSAqIEBsb2NrOgkJbG9jayBwcm90ZWN0aW5nIHRoZSB0cmVlIG9mIGhhbmRsZXMKLSAqIEBuYW1lOgkJdXNlZCBmb3IgZGVidWdnaW5nCi0gKiBAZGlzcGxheV9uYW1lOgl1c2VkIGZvciBkZWJ1Z2dpbmcgKHVuaXF1ZSB2ZXJzaW9uIG9mIEBuYW1lKQotICogQGRpc3BsYXlfc2VyaWFsOgl1c2VkIGZvciBkZWJ1Z2dpbmcgKHRvIG1ha2UgZGlzcGxheV9uYW1lIHVuaXF1ZSkKLSAqIEB0YXNrOgkJdXNlZCBmb3IgZGVidWdnaW5nCi0gKgotICogQSBjbGllbnQgcmVwcmVzZW50cyBhIGxpc3Qgb2YgYnVmZmVycyB0aGlzIGNsaWVudCBtYXkgYWNjZXNzLgotICogVGhlIG11dGV4IHN0b3JlZCBoZXJlIGlzIHVzZWQgdG8gcHJvdGVjdCBib3RoIGhhbmRsZXMgdHJlZQotICogYXMgd2VsbCBhcyB0aGUgaGFuZGxlcyB0aGVtc2VsdmVzLCBhbmQgc2hvdWxkIGJlIGhlbGQgd2hpbGUgbW9kaWZ5aW5nIGVpdGhlci4KLSAqLwotc3RydWN0IGlvbl9jbGllbnQgewotCXN0cnVjdCByYl9ub2RlIG5vZGU7Ci0Jc3RydWN0IGlvbl9kZXZpY2UgKmRldjsKLQlzdHJ1Y3QgcmJfcm9vdCBoYW5kbGVzOwotCXN0cnVjdCBpZHIgaWRyOwotCXN0cnVjdCBtdXRleCBsb2NrOwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JY2hhciAqZGlzcGxheV9uYW1lOwotCWludCBkaXNwbGF5X3NlcmlhbDsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7Ci0JcGlkX3QgcGlkOwotCXN0cnVjdCBkZW50cnkgKmRlYnVnX3Jvb3Q7Ci19OwotCi0vKioKLSAqIGlvbl9oYW5kbGUgLSBhIGNsaWVudCBsb2NhbCByZWZlcmVuY2UgdG8gYSBidWZmZXIKLSAqIEByZWY6CQlyZWZlcmVuY2UgY291bnQKLSAqIEBjbGllbnQ6CQliYWNrIHBvaW50ZXIgdG8gdGhlIGNsaWVudCB0aGUgYnVmZmVyIHJlc2lkZXMgaW4KLSAqIEBidWZmZXI6CQlwb2ludGVyIHRvIHRoZSBidWZmZXIKLSAqIEBub2RlOgkJbm9kZSBpbiB0aGUgY2xpZW50J3MgaGFuZGxlIHJidHJlZQotICogQGttYXBfY250OgkJY291bnQgb2YgdGltZXMgdGhpcyBjbGllbnQgaGFzIG1hcHBlZCB0byBrZXJuZWwKLSAqIEBpZDoJCQljbGllbnQtdW5pcXVlIGlkIGFsbG9jYXRlZCBieSBjbGllbnQtPmlkcgotICoKLSAqIE1vZGlmaWNhdGlvbnMgdG8gbm9kZSwgbWFwX2NudCBvciBtYXBwaW5nIHNob3VsZCBiZSBwcm90ZWN0ZWQgYnkgdGhlCi0gKiBsb2NrIGluIHRoZSBjbGllbnQuICBPdGhlciBmaWVsZHMgYXJlIG5ldmVyIGNoYW5nZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uCi0gKi8KLXN0cnVjdCBpb25faGFuZGxlIHsKLQlzdHJ1Y3Qga3JlZiByZWY7Ci0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudDsKLQlzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyOwotCXN0cnVjdCByYl9ub2RlIG5vZGU7Ci0JdW5zaWduZWQgaW50IGttYXBfY250OwotCWludCBpZDsKLX07Ci0KIGJvb2wgaW9uX2J1ZmZlcl9mYXVsdF91c2VyX21hcHBpbmdzKHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIpCiB7CiAJcmV0dXJuIChidWZmZXItPmZsYWdzICYgSU9OX0ZMQUdfQ0FDSEVEKSAmJgpAQCAtMTc0LDEwICsxMDAsMTAgQEAKIAogLyogdGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hpbGUgZGV2LT5sb2NrIGlzIGhlbGQgKi8KIHN0YXRpYyBzdHJ1Y3QgaW9uX2J1ZmZlciAqaW9uX2J1ZmZlcl9jcmVhdGUoc3RydWN0IGlvbl9oZWFwICpoZWFwLAotCQkJCSAgICAgc3RydWN0IGlvbl9kZXZpY2UgKmRldiwKLQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgbGVuLAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyBhbGlnbiwKLQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJCQkJCSAgICBzdHJ1Y3QgaW9uX2RldmljZSAqZGV2LAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyBsZW4sCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIGFsaWduLAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyOwogCXN0cnVjdCBzZ190YWJsZSAqdGFibGU7CkBAIC0yMDUsMTkgKzEzMSwxNiBAQAogCQkJZ290byBlcnIyOwogCX0KIAotCWJ1ZmZlci0+ZGV2ID0gZGV2OwotCWJ1ZmZlci0+c2l6ZSA9IGxlbjsKLQotCXRhYmxlID0gaGVhcC0+b3BzLT5tYXBfZG1hKGhlYXAsIGJ1ZmZlcik7Ci0JaWYgKFdBUk5fT05DRSh0YWJsZSA9PSBOVUxMLAotCQkJImhlYXAtPm9wcy0+bWFwX2RtYSBzaG91bGQgcmV0dXJuIEVSUl9QVFIgb24gZXJyb3IiKSkKLQkJdGFibGUgPSBFUlJfUFRSKC1FSU5WQUwpOwotCWlmIChJU19FUlIodGFibGUpKSB7CisJaWYgKGJ1ZmZlci0+c2dfdGFibGUgPT0gTlVMTCkgeworCQlXQVJOX09OQ0UoMSwgIlRoaXMgaGVhcCBuZWVkcyB0byBzZXQgdGhlIHNndGFibGUiKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBlcnIxOwogCX0KIAotCWJ1ZmZlci0+c2dfdGFibGUgPSB0YWJsZTsKKwl0YWJsZSA9IGJ1ZmZlci0+c2dfdGFibGU7CisJYnVmZmVyLT5kZXYgPSBkZXY7CisJYnVmZmVyLT5zaXplID0gbGVuOworCiAJaWYgKGlvbl9idWZmZXJfZmF1bHRfdXNlcl9tYXBwaW5ncyhidWZmZXIpKSB7CiAJCWludCBudW1fcGFnZXMgPSBQQUdFX0FMSUdOKGJ1ZmZlci0+c2l6ZSkgLyBQQUdFX1NJWkU7CiAJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CkBAIC0yMjYsNyArMTQ5LDcgQEAKIAkJYnVmZmVyLT5wYWdlcyA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBwYWdlICopICogbnVtX3BhZ2VzKTsKIAkJaWYgKCFidWZmZXItPnBhZ2VzKSB7CiAJCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBlcnI7CisJCQlnb3RvIGVycjE7CiAJCX0KIAogCQlmb3JfZWFjaF9zZyh0YWJsZS0+c2dsLCBzZywgdGFibGUtPm5lbnRzLCBpKSB7CkBAIC0yNjAsOCArMTgzLDYgQEAKIAltdXRleF91bmxvY2soJmRldi0+YnVmZmVyX2xvY2spOwogCXJldHVybiBidWZmZXI7CiAKLWVycjoKLQloZWFwLT5vcHMtPnVubWFwX2RtYShoZWFwLCBidWZmZXIpOwogZXJyMToKIAloZWFwLT5vcHMtPmZyZWUoYnVmZmVyKTsKIGVycjI6CkBAIC0yNzMsNyArMTk0LDYgQEAKIHsKIAlpZiAoV0FSTl9PTihidWZmZXItPmttYXBfY250ID4gMCkpCiAJCWJ1ZmZlci0+aGVhcC0+b3BzLT51bm1hcF9rZXJuZWwoYnVmZmVyLT5oZWFwLCBidWZmZXIpOwotCWJ1ZmZlci0+aGVhcC0+b3BzLT51bm1hcF9kbWEoYnVmZmVyLT5oZWFwLCBidWZmZXIpOwogCWJ1ZmZlci0+aGVhcC0+b3BzLT5mcmVlKGJ1ZmZlcik7CiAJdmZyZWUoYnVmZmVyLT5wYWdlcyk7CiAJa2ZyZWUoYnVmZmVyKTsKQEAgLTMzNyw3ICsyNTcsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGlvbl9oYW5kbGUgKmlvbl9oYW5kbGVfY3JlYXRlKHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsCi0JCQkJICAgICBzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyKQorCQkJCQkgICAgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcikKIHsKIAlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlOwogCkBAIC0zNzcsMjYgKzI5NywxNyBAQAogCWtmcmVlKGhhbmRsZSk7CiB9CiAKLXN0cnVjdCBpb25fYnVmZmVyICppb25faGFuZGxlX2J1ZmZlcihzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlKQotewotCXJldHVybiBoYW5kbGUtPmJ1ZmZlcjsKLX0KLQogc3RhdGljIHZvaWQgaW9uX2hhbmRsZV9nZXQoc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSkKIHsKIAlrcmVmX2dldCgmaGFuZGxlLT5yZWYpOwogfQogCi1zdGF0aWMgaW50IGlvbl9oYW5kbGVfcHV0X25vbG9jayhzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlKQoraW50IGlvbl9oYW5kbGVfcHV0X25vbG9jayhzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlKQogewotCWludCByZXQ7Ci0KLQlyZXQgPSBrcmVmX3B1dCgmaGFuZGxlLT5yZWYsIGlvbl9oYW5kbGVfZGVzdHJveSk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiBrcmVmX3B1dCgmaGFuZGxlLT5yZWYsIGlvbl9oYW5kbGVfZGVzdHJveSk7CiB9CiAKLXN0YXRpYyBpbnQgaW9uX2hhbmRsZV9wdXQoc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSkKK2ludCBpb25faGFuZGxlX3B1dChzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlKQogewogCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQgPSBoYW5kbGUtPmNsaWVudDsKIAlpbnQgcmV0OwpAQCAtNDI2LDggKzMzNyw4IEBACiAJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaW9uX2hhbmRsZSAqaW9uX2hhbmRsZV9nZXRfYnlfaWRfbm9sb2NrKHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsCi0JCQkJCQlpbnQgaWQpCitzdHJ1Y3QgaW9uX2hhbmRsZSAqaW9uX2hhbmRsZV9nZXRfYnlfaWRfbm9sb2NrKHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsCisJCQkJCSAgICAgICBpbnQgaWQpCiB7CiAJc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZTsKIApAQCAtNDM4LDcgKzM0OSw3IEBACiAJcmV0dXJuIGhhbmRsZSA/IGhhbmRsZSA6IEVSUl9QVFIoLUVJTlZBTCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaW9uX2hhbmRsZSAqaW9uX2hhbmRsZV9nZXRfYnlfaWQoc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwKK3N0cnVjdCBpb25faGFuZGxlICppb25faGFuZGxlX2dldF9ieV9pZChzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LAogCQkJCQkgICAgICAgaW50IGlkKQogewogCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGU7CkBAIC01NTEsMTUgKzQ2MiwxMCBAQAogfQogRVhQT1JUX1NZTUJPTChpb25fYWxsb2MpOwogCi1zdGF0aWMgdm9pZCBpb25fZnJlZV9ub2xvY2soc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwgc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSkKK3ZvaWQgaW9uX2ZyZWVfbm9sb2NrKHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsCisJCSAgICAgc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSkKIHsKLQlib29sIHZhbGlkX2hhbmRsZTsKLQotCUJVR19PTihjbGllbnQgIT0gaGFuZGxlLT5jbGllbnQpOwotCi0JdmFsaWRfaGFuZGxlID0gaW9uX2hhbmRsZV92YWxpZGF0ZShjbGllbnQsIGhhbmRsZSk7Ci0KLQlpZiAoIXZhbGlkX2hhbmRsZSkgeworCWlmICghaW9uX2hhbmRsZV92YWxpZGF0ZShjbGllbnQsIGhhbmRsZSkpIHsKIAkJV0FSTigxLCAiJXM6IGludmFsaWQgaGFuZGxlIHBhc3NlZCB0byBmcmVlLlxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQpAQCAtNTc2LDMyICs0ODIsNiBAQAogfQogRVhQT1JUX1NZTUJPTChpb25fZnJlZSk7CiAKLWludCBpb25fcGh5cyhzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlLAotCSAgICAgaW9uX3BoeXNfYWRkcl90ICphZGRyLCBzaXplX3QgKmxlbikKLXsKLQlzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyOwotCWludCByZXQ7Ci0KLQltdXRleF9sb2NrKCZjbGllbnQtPmxvY2spOwotCWlmICghaW9uX2hhbmRsZV92YWxpZGF0ZShjbGllbnQsIGhhbmRsZSkpIHsKLQkJbXV0ZXhfdW5sb2NrKCZjbGllbnQtPmxvY2spOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlidWZmZXIgPSBoYW5kbGUtPmJ1ZmZlcjsKLQotCWlmICghYnVmZmVyLT5oZWFwLT5vcHMtPnBoeXMpIHsKLQkJcHJfZXJyKCIlczogaW9uX3BoeXMgaXMgbm90IGltcGxlbWVudGVkIGJ5IHRoaXMgaGVhcCAobmFtZT0lcywgdHlwZT0lZCkuXG4iLAotCQkJX19mdW5jX18sIGJ1ZmZlci0+aGVhcC0+bmFtZSwgYnVmZmVyLT5oZWFwLT50eXBlKTsKLQkJbXV0ZXhfdW5sb2NrKCZjbGllbnQtPmxvY2spOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZjbGllbnQtPmxvY2spOwotCXJldCA9IGJ1ZmZlci0+aGVhcC0+b3BzLT5waHlzKGJ1ZmZlci0+aGVhcCwgYnVmZmVyLCBhZGRyLCBsZW4pOwotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGlvbl9waHlzKTsKLQogc3RhdGljIHZvaWQgKmlvbl9idWZmZXJfa21hcF9nZXQoc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcikKIHsKIAl2b2lkICp2YWRkcjsKQEAgLTYxMiw3ICs0OTIsNyBAQAogCX0KIAl2YWRkciA9IGJ1ZmZlci0+aGVhcC0+b3BzLT5tYXBfa2VybmVsKGJ1ZmZlci0+aGVhcCwgYnVmZmVyKTsKIAlpZiAoV0FSTl9PTkNFKHZhZGRyID09IE5VTEwsCi0JCQkiaGVhcC0+b3BzLT5tYXBfa2VybmVsIHNob3VsZCByZXR1cm4gRVJSX1BUUiBvbiBlcnJvciIpKQorCQkgICAgICAiaGVhcC0+b3BzLT5tYXBfa2VybmVsIHNob3VsZCByZXR1cm4gRVJSX1BUUiBvbiBlcnJvciIpKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAlpZiAoSVNfRVJSKHZhZGRyKSkKIAkJcmV0dXJuIHZhZGRyOwpAQCAtNzgxLDE0ICs2NjEsMTQgQEAKIH07CiAKIHN0YXRpYyBpbnQgaW9uX2dldF9jbGllbnRfc2VyaWFsKGNvbnN0IHN0cnVjdCByYl9yb290ICpyb290LAotCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lKQorCQkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lKQogewogCWludCBzZXJpYWwgPSAtMTsKIAlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKIAogCWZvciAobm9kZSA9IHJiX2ZpcnN0KHJvb3QpOyBub2RlOyBub2RlID0gcmJfbmV4dChub2RlKSkgewogCQlzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50ID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGlvbl9jbGllbnQsCi0JCQkJCQlub2RlKTsKKwkJCQkJCSAgICAgbm9kZSk7CiAKIAkJaWYgKHN0cmNtcChjbGllbnQtPm5hbWUsIG5hbWUpKQogCQkJY29udGludWU7CkBAIC04NjMsMTQgKzc0MywxNCBAQAogCXJiX2luc2VydF9jb2xvcigmY2xpZW50LT5ub2RlLCAmZGV2LT5jbGllbnRzKTsKIAogCWNsaWVudC0+ZGVidWdfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoY2xpZW50LT5kaXNwbGF5X25hbWUsIDA2NjQsCi0JCQkJCQlkZXYtPmNsaWVudHNfZGVidWdfcm9vdCwKLQkJCQkJCWNsaWVudCwgJmRlYnVnX2NsaWVudF9mb3BzKTsKKwkJCQkJCSBkZXYtPmNsaWVudHNfZGVidWdfcm9vdCwKKwkJCQkJCSBjbGllbnQsICZkZWJ1Z19jbGllbnRfZm9wcyk7CiAJaWYgKCFjbGllbnQtPmRlYnVnX3Jvb3QpIHsKIAkJY2hhciBidWZbMjU2XSwgKnBhdGg7CiAKIAkJcGF0aCA9IGRlbnRyeV9wYXRoKGRldi0+Y2xpZW50c19kZWJ1Z19yb290LCBidWYsIDI1Nik7CiAJCXByX2VycigiRmFpbGVkIHRvIGNyZWF0ZSBjbGllbnQgZGVidWdmcyBhdCAlcy8lc1xuIiwKLQkJCXBhdGgsIGNsaWVudC0+ZGlzcGxheV9uYW1lKTsKKwkJICAgICAgIHBhdGgsIGNsaWVudC0+ZGlzcGxheV9uYW1lKTsKIAl9CiAKIAl1cF93cml0ZSgmZGV2LT5sb2NrKTsKQEAgLTkxNywyNiArNzk3LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0woaW9uX2NsaWVudF9kZXN0cm95KTsKIAotc3RydWN0IHNnX3RhYmxlICppb25fc2dfdGFibGUoc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwKLQkJCSAgICAgIHN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUpCi17Ci0Jc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcjsKLQlzdHJ1Y3Qgc2dfdGFibGUgKnRhYmxlOwotCi0JbXV0ZXhfbG9jaygmY2xpZW50LT5sb2NrKTsKLQlpZiAoIWlvbl9oYW5kbGVfdmFsaWRhdGUoY2xpZW50LCBoYW5kbGUpKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgaGFuZGxlIHBhc3NlZCB0byBtYXBfZG1hLlxuIiwKLQkJICAgICAgIF9fZnVuY19fKTsKLQkJbXV0ZXhfdW5sb2NrKCZjbGllbnQtPmxvY2spOwotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQl9Ci0JYnVmZmVyID0gaGFuZGxlLT5idWZmZXI7Ci0JdGFibGUgPSBidWZmZXItPnNnX3RhYmxlOwotCW11dGV4X3VubG9jaygmY2xpZW50LT5sb2NrKTsKLQlyZXR1cm4gdGFibGU7Ci19Ci1FWFBPUlRfU1lNQk9MKGlvbl9zZ190YWJsZSk7Ci0KIHN0YXRpYyB2b2lkIGlvbl9idWZmZXJfc3luY19mb3JfZGV2aWNlKHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIsCiAJCQkJICAgICAgIHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKQEAgLTk1OCw3ICs4MTgsNyBAQAogfQogCiB2b2lkIGlvbl9wYWdlc19zeW5jX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkJc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKKwkJCSAgICAgICBzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQogewogCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKIApAQCAtOTk4LDcgKzg1OCw3IEBACiAKIAkJaWYgKGlvbl9idWZmZXJfcGFnZV9pc19kaXJ0eShwYWdlKSkKIAkJCWlvbl9wYWdlc19zeW5jX2Zvcl9kZXZpY2UoZGV2LCBpb25fYnVmZmVyX3BhZ2UocGFnZSksCi0JCQkJCQkJUEFHRV9TSVpFLCBkaXIpOworCQkJCQkJICBQQUdFX1NJWkUsIGRpcik7CiAKIAkJaW9uX2J1ZmZlcl9wYWdlX2NsZWFuKGJ1ZmZlci0+cGFnZXMgKyBpKTsKIAl9CkBAIC0xMDc2LDcgKzkzNiw3IEBACiAKIAlpZiAoIWJ1ZmZlci0+aGVhcC0+b3BzLT5tYXBfdXNlcikgewogCQlwcl9lcnIoIiVzOiB0aGlzIGhlYXAgZG9lcyBub3QgZGVmaW5lIGEgbWV0aG9kIGZvciBtYXBwaW5nIHRvIHVzZXJzcGFjZVxuIiwKLQkJCV9fZnVuY19fKTsKKwkJICAgICAgIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xMTY3LDcgKzEwMjcsNyBAQAogfTsKIAogc3RydWN0IGRtYV9idWYgKmlvbl9zaGFyZV9kbWFfYnVmKHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsCi0JCQkJCQlzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlKQorCQkJCSAgc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSkKIHsKIAlERUZJTkVfRE1BX0JVRl9FWFBPUlRfSU5GTyhleHBfaW5mbyk7CiAJc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcjsKQEAgLTEyNzUsNyArMTEzNSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGlvbl9pbXBvcnRfZG1hX2J1Zl9mZCk7CiAKLXN0YXRpYyBpbnQgaW9uX3N5bmNfZm9yX2RldmljZShzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LCBpbnQgZmQpCitpbnQgaW9uX3N5bmNfZm9yX2RldmljZShzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LCBpbnQgZmQpCiB7CiAJc3RydWN0IGRtYV9idWYgKmRtYWJ1ZjsKIAlzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyOwpAQCAtMTI5OSwxMjQgKzExNTksNDUgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogZml4IHVwIHRoZSBjYXNlcyB3aGVyZSB0aGUgaW9jdGwgZGlyZWN0aW9uIGJpdHMgYXJlIGluY29ycmVjdCAqLwotc3RhdGljIHVuc2lnbmVkIGludCBpb25faW9jdGxfZGlyKHVuc2lnbmVkIGludCBjbWQpCitpbnQgaW9uX3F1ZXJ5X2hlYXBzKHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsIHN0cnVjdCBpb25faGVhcF9xdWVyeSAqcXVlcnkpCiB7Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIElPTl9JT0NfU1lOQzoKLQljYXNlIElPTl9JT0NfRlJFRToKLQljYXNlIElPTl9JT0NfQ1VTVE9NOgotCQlyZXR1cm4gX0lPQ19XUklURTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gX0lPQ19ESVIoY21kKTsKLQl9Ci19Ci0KLXN0YXRpYyBsb25nIGlvbl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgaW9uX2RldmljZSAqZGV2ID0gY2xpZW50LT5kZXY7Ci0Jc3RydWN0IGlvbl9oYW5kbGUgKmNsZWFudXBfaGFuZGxlID0gTlVMTDsKLQlpbnQgcmV0ID0gMDsKLQl1bnNpZ25lZCBpbnQgZGlyOworCXN0cnVjdCBpb25faGVhcF9kYXRhIF9fdXNlciAqYnVmZmVyID0gdTY0X3RvX3VzZXJfcHRyKHF1ZXJ5LT5oZWFwcyk7CisJaW50IHJldCA9IC1FSU5WQUwsIGNudCA9IDAsIG1heF9jbnQ7CisJc3RydWN0IGlvbl9oZWFwICpoZWFwOworCXN0cnVjdCBpb25faGVhcF9kYXRhIGhkYXRhOwogCi0JdW5pb24gewotCQlzdHJ1Y3QgaW9uX2ZkX2RhdGEgZmQ7Ci0JCXN0cnVjdCBpb25fYWxsb2NhdGlvbl9kYXRhIGFsbG9jYXRpb247Ci0JCXN0cnVjdCBpb25faGFuZGxlX2RhdGEgaGFuZGxlOwotCQlzdHJ1Y3QgaW9uX2N1c3RvbV9kYXRhIGN1c3RvbTsKLQl9IGRhdGE7CisJbWVtc2V0KCZoZGF0YSwgMCwgc2l6ZW9mKGhkYXRhKSk7CiAKLQlkaXIgPSBpb25faW9jdGxfZGlyKGNtZCk7Ci0KLQlpZiAoX0lPQ19TSVpFKGNtZCkgPiBzaXplb2YoZGF0YSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGRpciAmIF9JT0NfV1JJVEUpCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmZGF0YSwgKHZvaWQgX191c2VyICopYXJnLCBfSU9DX1NJWkUoY21kKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBJT05fSU9DX0FMTE9DOgotCXsKLQkJc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZTsKLQotCQloYW5kbGUgPSBpb25fYWxsb2MoY2xpZW50LCBkYXRhLmFsbG9jYXRpb24ubGVuLAotCQkJCQkJZGF0YS5hbGxvY2F0aW9uLmFsaWduLAotCQkJCQkJZGF0YS5hbGxvY2F0aW9uLmhlYXBfaWRfbWFzaywKLQkJCQkJCWRhdGEuYWxsb2NhdGlvbi5mbGFncyk7Ci0JCWlmIChJU19FUlIoaGFuZGxlKSkKLQkJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7Ci0KLQkJZGF0YS5hbGxvY2F0aW9uLmhhbmRsZSA9IGhhbmRsZS0+aWQ7Ci0KLQkJY2xlYW51cF9oYW5kbGUgPSBoYW5kbGU7Ci0JCWJyZWFrOwotCX0KLQljYXNlIElPTl9JT0NfRlJFRToKLQl7Ci0JCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGU7Ci0KLQkJbXV0ZXhfbG9jaygmY2xpZW50LT5sb2NrKTsKLQkJaGFuZGxlID0gaW9uX2hhbmRsZV9nZXRfYnlfaWRfbm9sb2NrKGNsaWVudCwgZGF0YS5oYW5kbGUuaGFuZGxlKTsKLQkJaWYgKElTX0VSUihoYW5kbGUpKSB7Ci0JCQltdXRleF91bmxvY2soJmNsaWVudC0+bG9jayk7Ci0JCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOwotCQl9Ci0JCWlvbl9mcmVlX25vbG9jayhjbGllbnQsIGhhbmRsZSk7Ci0JCWlvbl9oYW5kbGVfcHV0X25vbG9jayhoYW5kbGUpOwotCQltdXRleF91bmxvY2soJmNsaWVudC0+bG9jayk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIElPTl9JT0NfU0hBUkU6Ci0JY2FzZSBJT05fSU9DX01BUDoKLQl7Ci0JCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGU7Ci0KLQkJaGFuZGxlID0gaW9uX2hhbmRsZV9nZXRfYnlfaWQoY2xpZW50LCBkYXRhLmhhbmRsZS5oYW5kbGUpOwotCQlpZiAoSVNfRVJSKGhhbmRsZSkpCi0JCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOwotCQlkYXRhLmZkLmZkID0gaW9uX3NoYXJlX2RtYV9idWZfZmQoY2xpZW50LCBoYW5kbGUpOwotCQlpb25faGFuZGxlX3B1dChoYW5kbGUpOwotCQlpZiAoZGF0YS5mZC5mZCA8IDApCi0JCQlyZXQgPSBkYXRhLmZkLmZkOwotCQlicmVhazsKLQl9Ci0JY2FzZSBJT05fSU9DX0lNUE9SVDoKLQl7Ci0JCXN0cnVjdCBpb25faGFuZGxlICpoYW5kbGU7Ci0KLQkJaGFuZGxlID0gaW9uX2ltcG9ydF9kbWFfYnVmX2ZkKGNsaWVudCwgZGF0YS5mZC5mZCk7Ci0JCWlmIChJU19FUlIoaGFuZGxlKSkKLQkJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKLQkJZWxzZQotCQkJZGF0YS5oYW5kbGUuaGFuZGxlID0gaGFuZGxlLT5pZDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgSU9OX0lPQ19TWU5DOgotCXsKLQkJcmV0ID0gaW9uX3N5bmNfZm9yX2RldmljZShjbGllbnQsIGRhdGEuZmQuZmQpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBJT05fSU9DX0NVU1RPTToKLQl7Ci0JCWlmICghZGV2LT5jdXN0b21faW9jdGwpCi0JCQlyZXR1cm4gLUVOT1RUWTsKLQkJcmV0ID0gZGV2LT5jdXN0b21faW9jdGwoY2xpZW50LCBkYXRhLmN1c3RvbS5jbWQsCi0JCQkJCQlkYXRhLmN1c3RvbS5hcmcpOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FTk9UVFk7CisJZG93bl9yZWFkKCZkZXYtPmxvY2spOworCWlmICghYnVmZmVyKSB7CisJCXF1ZXJ5LT5jbnQgPSBkZXYtPmhlYXBfY250OworCQlyZXQgPSAwOworCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAoZGlyICYgX0lPQ19SRUFEKSB7Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmZGF0YSwgX0lPQ19TSVpFKGNtZCkpKSB7Ci0JCQlpZiAoY2xlYW51cF9oYW5kbGUpCi0JCQkJaW9uX2ZyZWUoY2xpZW50LCBjbGVhbnVwX2hhbmRsZSk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQorCWlmIChxdWVyeS0+Y250IDw9IDApCisJCWdvdG8gb3V0OworCisJbWF4X2NudCA9IHF1ZXJ5LT5jbnQ7CisKKwlwbGlzdF9mb3JfZWFjaF9lbnRyeShoZWFwLCAmZGV2LT5oZWFwcywgbm9kZSkgeworCQlzdHJuY3B5KGhkYXRhLm5hbWUsIGhlYXAtPm5hbWUsIE1BWF9IRUFQX05BTUUpOworCQloZGF0YS5uYW1lW3NpemVvZihoZGF0YS5uYW1lKSAtIDFdID0gJ1wwJzsKKwkJaGRhdGEudHlwZSA9IGhlYXAtPnR5cGU7CisJCWhkYXRhLmhlYXBfaWQgPSBoZWFwLT5pZDsKKworCQlyZXQgPSBjb3B5X3RvX3VzZXIoJmJ1ZmZlcltjbnRdLAorCQkJCSAgICZoZGF0YSwgc2l6ZW9mKGhkYXRhKSk7CisKKwkJY250Kys7CisJCWlmIChjbnQgPj0gbWF4X2NudCkKKwkJCWJyZWFrOwogCX0KKworCXF1ZXJ5LT5jbnQgPSBjbnQ7CitvdXQ6CisJdXBfcmVhZCgmZGV2LT5sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNTI4LDcgKzEzMDksNyBAQAogCXNlcV9wcmludGYocywgIiUxNnMgJTE2enVcbiIsICJ0b3RhbCAiLCB0b3RhbF9zaXplKTsKIAlpZiAoaGVhcC0+ZmxhZ3MgJiBJT05fSEVBUF9GTEFHX0RFRkVSX0ZSRUUpCiAJCXNlcV9wcmludGYocywgIiUxNnMgJTE2enVcbiIsICJkZWZlcnJlZCBmcmVlIiwKLQkJCQloZWFwLT5mcmVlX2xpc3Rfc2l6ZSk7CisJCQkgICBoZWFwLT5mcmVlX2xpc3Rfc2l6ZSk7CiAJc2VxX3B1dHMocywgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogCiAJaWYgKGhlYXAtPmRlYnVnX3Nob3cpCkBAIC0xNTg4LDggKzEzNjksNyBAQAogewogCXN0cnVjdCBkZW50cnkgKmRlYnVnX2ZpbGU7CiAKLQlpZiAoIWhlYXAtPm9wcy0+YWxsb2NhdGUgfHwgIWhlYXAtPm9wcy0+ZnJlZSB8fCAhaGVhcC0+b3BzLT5tYXBfZG1hIHx8Ci0JICAgICFoZWFwLT5vcHMtPnVubWFwX2RtYSkKKwlpZiAoIWhlYXAtPm9wcy0+YWxsb2NhdGUgfHwgIWhlYXAtPm9wcy0+ZnJlZSkKIAkJcHJfZXJyKCIlczogY2FuIG5vdCBhZGQgaGVhcCB3aXRoIGludmFsaWQgb3BzIHN0cnVjdC5cbiIsCiAJCSAgICAgICBfX2Z1bmNfXyk7CiAKQEAgLTE2MTEsMTUgKzEzOTEsMTUgQEAKIAlwbGlzdF9ub2RlX2luaXQoJmhlYXAtPm5vZGUsIC1oZWFwLT5pZCk7CiAJcGxpc3RfYWRkKCZoZWFwLT5ub2RlLCAmZGV2LT5oZWFwcyk7CiAJZGVidWdfZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoaGVhcC0+bmFtZSwgMDY2NCwKLQkJCQkJZGV2LT5oZWFwc19kZWJ1Z19yb290LCBoZWFwLAotCQkJCQkmZGVidWdfaGVhcF9mb3BzKTsKKwkJCQkJIGRldi0+aGVhcHNfZGVidWdfcm9vdCwgaGVhcCwKKwkJCQkJICZkZWJ1Z19oZWFwX2ZvcHMpOwogCiAJaWYgKCFkZWJ1Z19maWxlKSB7CiAJCWNoYXIgYnVmWzI1Nl0sICpwYXRoOwogCiAJCXBhdGggPSBkZW50cnlfcGF0aChkZXYtPmhlYXBzX2RlYnVnX3Jvb3QsIGJ1ZiwgMjU2KTsKIAkJcHJfZXJyKCJGYWlsZWQgdG8gY3JlYXRlIGhlYXAgZGVidWdmcyBhdCAlcy8lc1xuIiwKLQkJCXBhdGgsIGhlYXAtPm5hbWUpOworCQkgICAgICAgcGF0aCwgaGVhcC0+bmFtZSk7CiAJfQogCiAJaWYgKGhlYXAtPnNocmlua2VyLmNvdW50X29iamVjdHMgJiYgaGVhcC0+c2hyaW5rZXIuc2Nhbl9vYmplY3RzKSB7CkBAIC0xNjM0LDEwICsxNDE0LDExIEBACiAKIAkJCXBhdGggPSBkZW50cnlfcGF0aChkZXYtPmhlYXBzX2RlYnVnX3Jvb3QsIGJ1ZiwgMjU2KTsKIAkJCXByX2VycigiRmFpbGVkIHRvIGNyZWF0ZSBoZWFwIHNocmlua2VyIGRlYnVnZnMgYXQgJXMvJXNcbiIsCi0JCQkJcGF0aCwgZGVidWdfbmFtZSk7CisJCQkgICAgICAgcGF0aCwgZGVidWdfbmFtZSk7CiAJCX0KIAl9CiAKKwlkZXYtPmhlYXBfY250Kys7CiAJdXBfd3JpdGUoJmRldi0+bG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MKGlvbl9kZXZpY2VfYWRkX2hlYXApOwpAQCAtMTcwMiwzOCArMTQ4MywzIEBACiAJa2ZyZWUoZGV2KTsKIH0KIEVYUE9SVF9TWU1CT0woaW9uX2RldmljZV9kZXN0cm95KTsKLQotdm9pZCBfX2luaXQgaW9uX3Jlc2VydmUoc3RydWN0IGlvbl9wbGF0Zm9ybV9kYXRhICpkYXRhKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGRhdGEtPm5yOyBpKyspIHsKLQkJaWYgKGRhdGEtPmhlYXBzW2ldLnNpemUgPT0gMCkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChkYXRhLT5oZWFwc1tpXS5iYXNlID09IDApIHsKLQkJCXBoeXNfYWRkcl90IHBhZGRyOwotCi0JCQlwYWRkciA9IG1lbWJsb2NrX2FsbG9jX2Jhc2UoZGF0YS0+aGVhcHNbaV0uc2l6ZSwKLQkJCQkJCSAgICBkYXRhLT5oZWFwc1tpXS5hbGlnbiwKLQkJCQkJCSAgICBNRU1CTE9DS19BTExPQ19BTllXSEVSRSk7Ci0JCQlpZiAoIXBhZGRyKSB7Ci0JCQkJcHJfZXJyKCIlczogZXJyb3IgYWxsb2NhdGluZyBtZW1ibG9jayBmb3IgaGVhcCAlZFxuIiwKLQkJCQkJX19mdW5jX18sIGkpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZGF0YS0+aGVhcHNbaV0uYmFzZSA9IHBhZGRyOwotCQl9IGVsc2UgewotCQkJaW50IHJldCA9IG1lbWJsb2NrX3Jlc2VydmUoZGF0YS0+aGVhcHNbaV0uYmFzZSwKLQkJCQkJICAgICAgIGRhdGEtPmhlYXBzW2ldLnNpemUpOwotCQkJaWYgKHJldCkKLQkJCQlwcl9lcnIoIm1lbWJsb2NrIHJlc2VydmUgb2YgJXp4QCVseCBmYWlsZWRcbiIsCi0JCQkJICAgICAgIGRhdGEtPmhlYXBzW2ldLnNpemUsCi0JCQkJICAgICAgIGRhdGEtPmhlYXBzW2ldLmJhc2UpOwotCQl9Ci0JCXByX2luZm8oIiVzOiAlcyByZXNlcnZlZCBiYXNlICVseCBzaXplICV6dVxuIiwgX19mdW5jX18sCi0JCQlkYXRhLT5oZWFwc1tpXS5uYW1lLAotCQkJZGF0YS0+aGVhcHNbaV0uYmFzZSwKLQkJCWRhdGEtPmhlYXBzW2ldLnNpemUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb24uaCBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb24uaAppbmRleCBhMTMzMWZjLi45M2RhZmI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbi5oCkBAIC03MywxNyArNzMsNiBAQAogfTsKIAogLyoqCi0gKiBpb25fcmVzZXJ2ZSgpIC0gcmVzZXJ2ZSBtZW1vcnkgZm9yIGlvbiBoZWFwcyBpZiBhcHBsaWNhYmxlCi0gKiBAZGF0YToJcGxhdGZvcm0gZGF0YSBzcGVjaWZ5aW5nIHN0YXJ0aW5nIHBoeXNpY2FsIGFkZHJlc3MgYW5kCi0gKgkJc2l6ZQotICoKLSAqIENhbGxzIG1lbWJsb2NrIHJlc2VydmUgdG8gc2V0IGFzaWRlIG1lbW9yeSBmb3IgaGVhcHMgdGhhdCBhcmUKLSAqIGxvY2F0ZWQgYXQgc3BlY2lmaWMgbWVtb3J5IGFkZHJlc3NlcyBvciBvZiBzcGVjaWZpYyBzaXplcyBub3QKLSAqIG1hbmFnZWQgYnkgdGhlIGtlcm5lbAotICovCi12b2lkIGlvbl9yZXNlcnZlKHN0cnVjdCBpb25fcGxhdGZvcm1fZGF0YSAqZGF0YSk7Ci0KLS8qKgogICogaW9uX2NsaWVudF9jcmVhdGUoKSAtICBhbGxvY2F0ZSBhIGNsaWVudCBhbmQgcmV0dXJucyBpdAogICogQGRldjoJCXRoZSBnbG9iYWwgaW9uIGRldmljZQogICogQG5hbWU6CQl1c2VkIGZvciBkZWJ1Z2dpbmcKQEAgLTEzMCwzNiArMTE5LDYgQEAKIHZvaWQgaW9uX2ZyZWUoc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwgc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSk7CiAKIC8qKgotICogaW9uX3BoeXMgLSByZXR1cm5zIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBsZW4gb2YgYSBoYW5kbGUKLSAqIEBjbGllbnQ6CXRoZSBjbGllbnQKLSAqIEBoYW5kbGU6CXRoZSBoYW5kbGUKLSAqIEBhZGRyOglhIHBvaW50ZXIgdG8gcHV0IHRoZSBhZGRyZXNzIGluCi0gKiBAbGVuOglhIHBvaW50ZXIgdG8gcHV0IHRoZSBsZW5ndGggaW4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHF1ZXJpZXMgdGhlIGhlYXAgZm9yIGEgcGFydGljdWxhciBoYW5kbGUgdG8gZ2V0IHRoZQotICogaGFuZGxlJ3MgcGh5c2ljYWwgYWRkcmVzcy4gIEl0J3Qgb3V0cHV0IGlzIG9ubHkgY29ycmVjdCBpZgotICogYSBoZWFwIHJldHVybnMgcGh5c2ljYWxseSBjb250aWd1b3VzIG1lbW9yeSAtLSBpbiBvdGhlciBjYXNlcwotICogdGhpcyBhcGkgc2hvdWxkIG5vdCBiZSBpbXBsZW1lbnRlZCAtLSBpb25fc2dfdGFibGUgc2hvdWxkIGJlIHVzZWQKLSAqIGluc3RlYWQuICBSZXR1cm5zIC1FSU5WQUwgaWYgdGhlIGhhbmRsZSBpcyBpbnZhbGlkLiAgVGhpcyBoYXMKLSAqIG5vIGltcGxpY2F0aW9ucyBvbiB0aGUgcmVmZXJlbmNlIGNvdW50aW5nIG9mIHRoZSBoYW5kbGUgLS0KLSAqIHRoZSByZXR1cm5lZCB2YWx1ZSBtYXkgbm90IGJlIHZhbGlkIGlmIHRoZSBjYWxsZXIgaXMgbm90Ci0gKiBob2xkaW5nIGEgcmVmZXJlbmNlLgotICovCi1pbnQgaW9uX3BoeXMoc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwgc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSwKLQkgICAgIGlvbl9waHlzX2FkZHJfdCAqYWRkciwgc2l6ZV90ICpsZW4pOwotCi0vKioKLSAqIGlvbl9tYXBfZG1hIC0gcmV0dXJuIGFuIHNnX3RhYmxlIGRlc2NyaWJpbmcgYSBoYW5kbGUKLSAqIEBjbGllbnQ6CXRoZSBjbGllbnQKLSAqIEBoYW5kbGU6CXRoZSBoYW5kbGUKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNnX3RhYmxlIGRlc2NyaWJpbmcKLSAqIGEgcGFydGljdWxhciBpb24gaGFuZGxlLgotICovCi1zdHJ1Y3Qgc2dfdGFibGUgKmlvbl9zZ190YWJsZShzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LAotCQkJICAgICAgc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSk7Ci0KLS8qKgogICogaW9uX21hcF9rZXJuZWwgLSBjcmVhdGUgbWFwcGluZyBmb3IgdGhlIGdpdmVuIGhhbmRsZQogICogQGNsaWVudDoJdGhlIGNsaWVudAogICogQGhhbmRsZToJaGFuZGxlIHRvIG1hcApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9jYXJ2ZW91dF9oZWFwLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX2NhcnZlb3V0X2hlYXAuYwppbmRleCAxZmIwZDgxLi5hOGVhOTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX2NhcnZlb3V0X2hlYXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX2NhcnZlb3V0X2hlYXAuYwpAQCAtMjUsMTUgKzI1LDE3IEBACiAjaW5jbHVkZSAiaW9uLmgiCiAjaW5jbHVkZSAiaW9uX3ByaXYuaCIKIAorI2RlZmluZSBJT05fQ0FSVkVPVVRfQUxMT0NBVEVfRkFJTAktMQorCiBzdHJ1Y3QgaW9uX2NhcnZlb3V0X2hlYXAgewogCXN0cnVjdCBpb25faGVhcCBoZWFwOwogCXN0cnVjdCBnZW5fcG9vbCAqcG9vbDsKIAlpb25fcGh5c19hZGRyX3QgYmFzZTsKIH07CiAKLWlvbl9waHlzX2FkZHJfdCBpb25fY2FydmVvdXRfYWxsb2NhdGUoc3RydWN0IGlvbl9oZWFwICpoZWFwLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGFsaWduKQorc3RhdGljIGlvbl9waHlzX2FkZHJfdCBpb25fY2FydmVvdXRfYWxsb2NhdGUoc3RydWN0IGlvbl9oZWFwICpoZWFwLAorCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nIGFsaWduKQogewogCXN0cnVjdCBpb25fY2FydmVvdXRfaGVhcCAqY2FydmVvdXRfaGVhcCA9CiAJCWNvbnRhaW5lcl9vZihoZWFwLCBzdHJ1Y3QgaW9uX2NhcnZlb3V0X2hlYXAsIGhlYXApOwpAQCAtNDUsOCArNDcsOCBAQAogCXJldHVybiBvZmZzZXQ7CiB9CiAKLXZvaWQgaW9uX2NhcnZlb3V0X2ZyZWUoc3RydWN0IGlvbl9oZWFwICpoZWFwLCBpb25fcGh5c19hZGRyX3QgYWRkciwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3N0YXRpYyB2b2lkIGlvbl9jYXJ2ZW91dF9mcmVlKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgaW9uX3BoeXNfYWRkcl90IGFkZHIsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJc3RydWN0IGlvbl9jYXJ2ZW91dF9oZWFwICpjYXJ2ZW91dF9oZWFwID0KIAkJY29udGFpbmVyX29mKGhlYXAsIHN0cnVjdCBpb25fY2FydmVvdXRfaGVhcCwgaGVhcCk7CkBAIC01NiwxOSArNTgsNiBAQAogCWdlbl9wb29sX2ZyZWUoY2FydmVvdXRfaGVhcC0+cG9vbCwgYWRkciwgc2l6ZSk7CiB9CiAKLXN0YXRpYyBpbnQgaW9uX2NhcnZlb3V0X2hlYXBfcGh5cyhzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsCi0JCQkJICBzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyLAotCQkJCSAgaW9uX3BoeXNfYWRkcl90ICphZGRyLCBzaXplX3QgKmxlbikKLXsKLQlzdHJ1Y3Qgc2dfdGFibGUgKnRhYmxlID0gYnVmZmVyLT5wcml2X3ZpcnQ7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSBzZ19wYWdlKHRhYmxlLT5zZ2wpOwotCWlvbl9waHlzX2FkZHJfdCBwYWRkciA9IFBGTl9QSFlTKHBhZ2VfdG9fcGZuKHBhZ2UpKTsKLQotCSphZGRyID0gcGFkZHI7Ci0JKmxlbiA9IGJ1ZmZlci0+c2l6ZTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBpb25fY2FydmVvdXRfaGVhcF9hbGxvY2F0ZShzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsCiAJCQkJICAgICAgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlciwKIAkJCQkgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgYWxpZ24sCkBAIC05NSw3ICs4NCw3IEBACiAJfQogCiAJc2dfc2V0X3BhZ2UodGFibGUtPnNnbCwgcGZuX3RvX3BhZ2UoUEZOX0RPV04ocGFkZHIpKSwgc2l6ZSwgMCk7Ci0JYnVmZmVyLT5wcml2X3ZpcnQgPSB0YWJsZTsKKwlidWZmZXItPnNnX3RhYmxlID0gdGFibGU7CiAKIAlyZXR1cm4gMDsKIApAQCAtMTA5LDcgKzk4LDcgQEAKIHN0YXRpYyB2b2lkIGlvbl9jYXJ2ZW91dF9oZWFwX2ZyZWUoc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcikKIHsKIAlzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAgPSBidWZmZXItPmhlYXA7Ci0Jc3RydWN0IHNnX3RhYmxlICp0YWJsZSA9IGJ1ZmZlci0+cHJpdl92aXJ0OworCXN0cnVjdCBzZ190YWJsZSAqdGFibGUgPSBidWZmZXItPnNnX3RhYmxlOwogCXN0cnVjdCBwYWdlICpwYWdlID0gc2dfcGFnZSh0YWJsZS0+c2dsKTsKIAlpb25fcGh5c19hZGRyX3QgcGFkZHIgPSBQRk5fUEhZUyhwYWdlX3RvX3BmbihwYWdlKSk7CiAKQEAgLTEyNCwyMyArMTEzLDkgQEAKIAlrZnJlZSh0YWJsZSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2dfdGFibGUgKmlvbl9jYXJ2ZW91dF9oZWFwX21hcF9kbWEoc3RydWN0IGlvbl9oZWFwICpoZWFwLAotCQkJCQkJICBzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyKQotewotCXJldHVybiBidWZmZXItPnByaXZfdmlydDsKLX0KLQotc3RhdGljIHZvaWQgaW9uX2NhcnZlb3V0X2hlYXBfdW5tYXBfZG1hKHN0cnVjdCBpb25faGVhcCAqaGVhcCwKLQkJCQkJc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcikKLXsKLX0KLQogc3RhdGljIHN0cnVjdCBpb25faGVhcF9vcHMgY2FydmVvdXRfaGVhcF9vcHMgPSB7CiAJLmFsbG9jYXRlID0gaW9uX2NhcnZlb3V0X2hlYXBfYWxsb2NhdGUsCiAJLmZyZWUgPSBpb25fY2FydmVvdXRfaGVhcF9mcmVlLAotCS5waHlzID0gaW9uX2NhcnZlb3V0X2hlYXBfcGh5cywKLQkubWFwX2RtYSA9IGlvbl9jYXJ2ZW91dF9oZWFwX21hcF9kbWEsCi0JLnVubWFwX2RtYSA9IGlvbl9jYXJ2ZW91dF9oZWFwX3VubWFwX2RtYSwKIAkubWFwX3VzZXIgPSBpb25faGVhcF9tYXBfdXNlciwKIAkubWFwX2tlcm5lbCA9IGlvbl9oZWFwX21hcF9rZXJuZWwsCiAJLnVubWFwX2tlcm5lbCA9IGlvbl9oZWFwX3VubWFwX2tlcm5lbCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fY2h1bmtfaGVhcC5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9jaHVua19oZWFwLmMKaW5kZXggZTA1NTNmZS4uNzA0OTVkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9jaHVua19oZWFwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9jaHVua19oZWFwLmMKQEAgLTM0LDkgKzM0LDkgQEAKIH07CiAKIHN0YXRpYyBpbnQgaW9uX2NodW5rX2hlYXBfYWxsb2NhdGUoc3RydWN0IGlvbl9oZWFwICpoZWFwLAotCQkJCSAgICAgIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGFsaWduLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJCQkJICAgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlciwKKwkJCQkgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgYWxpZ24sCisJCQkJICAgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3QgaW9uX2NodW5rX2hlYXAgKmNodW5rX2hlYXAgPQogCQljb250YWluZXJfb2YoaGVhcCwgc3RydWN0IGlvbl9jaHVua19oZWFwLCBoZWFwKTsKQEAgLTcxLDExICs3MSwxMSBAQAogCQlpZiAoIXBhZGRyKQogCQkJZ290byBlcnI7CiAJCXNnX3NldF9wYWdlKHNnLCBwZm5fdG9fcGFnZShQRk5fRE9XTihwYWRkcikpLAotCQkJCWNodW5rX2hlYXAtPmNodW5rX3NpemUsIDApOworCQkJICAgIGNodW5rX2hlYXAtPmNodW5rX3NpemUsIDApOwogCQlzZyA9IHNnX25leHQoc2cpOwogCX0KIAotCWJ1ZmZlci0+cHJpdl92aXJ0ID0gdGFibGU7CisJYnVmZmVyLT5zZ190YWJsZSA9IHRhYmxlOwogCWNodW5rX2hlYXAtPmFsbG9jYXRlZCArPSBhbGxvY2F0ZWRfc2l6ZTsKIAlyZXR1cm4gMDsKIGVycjoKQEAgLTk1LDcgKzk1LDcgQEAKIAlzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAgPSBidWZmZXItPmhlYXA7CiAJc3RydWN0IGlvbl9jaHVua19oZWFwICpjaHVua19oZWFwID0KIAkJY29udGFpbmVyX29mKGhlYXAsIHN0cnVjdCBpb25fY2h1bmtfaGVhcCwgaGVhcCk7Ci0Jc3RydWN0IHNnX3RhYmxlICp0YWJsZSA9IGJ1ZmZlci0+cHJpdl92aXJ0OworCXN0cnVjdCBzZ190YWJsZSAqdGFibGUgPSBidWZmZXItPnNnX3RhYmxlOwogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyBhbGxvY2F0ZWRfc2l6ZTsKQEAgLTEwNiw3ICsxMDYsNyBAQAogCiAJaWYgKGlvbl9idWZmZXJfY2FjaGVkKGJ1ZmZlcikpCiAJCWRtYV9zeW5jX3NnX2Zvcl9kZXZpY2UoTlVMTCwgdGFibGUtPnNnbCwgdGFibGUtPm5lbnRzLAotCQkJCQkJCURNQV9CSURJUkVDVElPTkFMKTsKKwkJCQkgICAgICAgRE1BX0JJRElSRUNUSU9OQUwpOwogCiAJZm9yX2VhY2hfc2codGFibGUtPnNnbCwgc2csIHRhYmxlLT5uZW50cywgaSkgewogCQlnZW5fcG9vbF9mcmVlKGNodW5rX2hlYXAtPnBvb2wsIHBhZ2VfdG9fcGh5cyhzZ19wYWdlKHNnKSksCkBAIC0xMTcsMjIgKzExNyw5IEBACiAJa2ZyZWUodGFibGUpOwogfQogCi1zdGF0aWMgc3RydWN0IHNnX3RhYmxlICppb25fY2h1bmtfaGVhcF9tYXBfZG1hKHN0cnVjdCBpb25faGVhcCAqaGVhcCwKLQkJCQkJICAgICAgIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIpCi17Ci0JcmV0dXJuIGJ1ZmZlci0+cHJpdl92aXJ0OwotfQotCi1zdGF0aWMgdm9pZCBpb25fY2h1bmtfaGVhcF91bm1hcF9kbWEoc3RydWN0IGlvbl9oZWFwICpoZWFwLAotCQkJCSAgICAgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcikKLXsKLX0KLQogc3RhdGljIHN0cnVjdCBpb25faGVhcF9vcHMgY2h1bmtfaGVhcF9vcHMgPSB7CiAJLmFsbG9jYXRlID0gaW9uX2NodW5rX2hlYXBfYWxsb2NhdGUsCiAJLmZyZWUgPSBpb25fY2h1bmtfaGVhcF9mcmVlLAotCS5tYXBfZG1hID0gaW9uX2NodW5rX2hlYXBfbWFwX2RtYSwKLQkudW5tYXBfZG1hID0gaW9uX2NodW5rX2hlYXBfdW5tYXBfZG1hLAogCS5tYXBfdXNlciA9IGlvbl9oZWFwX21hcF91c2VyLAogCS5tYXBfa2VybmVsID0gaW9uX2hlYXBfbWFwX2tlcm5lbCwKIAkudW5tYXBfa2VybmVsID0gaW9uX2hlYXBfdW5tYXBfa2VybmVsLApAQCAtMTc0LDcgKzE2MSw3IEBACiAJY2h1bmtfaGVhcC0+aGVhcC50eXBlID0gSU9OX0hFQVBfVFlQRV9DSFVOSzsKIAljaHVua19oZWFwLT5oZWFwLmZsYWdzID0gSU9OX0hFQVBfRkxBR19ERUZFUl9GUkVFOwogCXByX2RlYnVnKCIlczogYmFzZSAlbHUgc2l6ZSAlenUgYWxpZ24gJWxkXG4iLCBfX2Z1bmNfXywKLQkJY2h1bmtfaGVhcC0+YmFzZSwgaGVhcF9kYXRhLT5zaXplLCBoZWFwX2RhdGEtPmFsaWduKTsKKwkJIGNodW5rX2hlYXAtPmJhc2UsIGhlYXBfZGF0YS0+c2l6ZSwgaGVhcF9kYXRhLT5hbGlnbik7CiAKIAlyZXR1cm4gJmNodW5rX2hlYXAtPmhlYXA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fY21hX2hlYXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fY21hX2hlYXAuYwppbmRleCBhMzQ0NmRhLi42YzdkZTc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX2NtYV9oZWFwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9jbWFfaGVhcC5jCkBAIC03OCw2ICs3OCw3IEBACiAJCWdvdG8gZnJlZV90YWJsZTsKIAkvKiBrZWVwIHRoaXMgZm9yIG1lbW9yeSByZWxlYXNlICovCiAJYnVmZmVyLT5wcml2X3ZpcnQgPSBpbmZvOworCWJ1ZmZlci0+c2dfdGFibGUgPSBpbmZvLT50YWJsZTsKIAlkZXZfZGJnKGRldiwgIkFsbG9jYXRlIGJ1ZmZlciAlcFxuIiwgYnVmZmVyKTsKIAlyZXR1cm4gMDsKIApAQCAtMTA1LDM2ICsxMDYsNiBAQAogCWtmcmVlKGluZm8pOwogfQogCi0vKiByZXR1cm4gcGh5c2ljYWwgYWRkcmVzcyBpbiBhZGRyICovCi1zdGF0aWMgaW50IGlvbl9jbWFfcGh5cyhzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIsCi0JCQlpb25fcGh5c19hZGRyX3QgKmFkZHIsIHNpemVfdCAqbGVuKQotewotCXN0cnVjdCBpb25fY21hX2hlYXAgKmNtYV9oZWFwID0gdG9fY21hX2hlYXAoYnVmZmVyLT5oZWFwKTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjbWFfaGVhcC0+ZGV2OwotCXN0cnVjdCBpb25fY21hX2J1ZmZlcl9pbmZvICppbmZvID0gYnVmZmVyLT5wcml2X3ZpcnQ7Ci0KLQlkZXZfZGJnKGRldiwgIlJldHVybiBidWZmZXIgJXAgcGh5c2ljYWwgYWRkcmVzcyAlcGFcbiIsIGJ1ZmZlciwKLQkJJmluZm8tPmhhbmRsZSk7Ci0KLQkqYWRkciA9IGluZm8tPmhhbmRsZTsKLQkqbGVuID0gYnVmZmVyLT5zaXplOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2dfdGFibGUgKmlvbl9jbWFfaGVhcF9tYXBfZG1hKHN0cnVjdCBpb25faGVhcCAqaGVhcCwKLQkJCQkJICAgICBzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyKQotewotCXN0cnVjdCBpb25fY21hX2J1ZmZlcl9pbmZvICppbmZvID0gYnVmZmVyLT5wcml2X3ZpcnQ7Ci0KLQlyZXR1cm4gaW5mby0+dGFibGU7Ci19Ci0KLXN0YXRpYyB2b2lkIGlvbl9jbWFfaGVhcF91bm1hcF9kbWEoc3RydWN0IGlvbl9oZWFwICpoZWFwLAotCQkJCSAgIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIpCi17Ci19Ci0KIHN0YXRpYyBpbnQgaW9uX2NtYV9tbWFwKHN0cnVjdCBpb25faGVhcCAqbWFwcGVyLCBzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyLAogCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CkBAIC0xNTUsMTYgKzEyNiwxMyBAQAogfQogCiBzdGF0aWMgdm9pZCBpb25fY21hX3VubWFwX2tlcm5lbChzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsCi0JCQkJCXN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIpCisJCQkJIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIpCiB7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaW9uX2hlYXBfb3BzIGlvbl9jbWFfb3BzID0gewogCS5hbGxvY2F0ZSA9IGlvbl9jbWFfYWxsb2NhdGUsCiAJLmZyZWUgPSBpb25fY21hX2ZyZWUsCi0JLm1hcF9kbWEgPSBpb25fY21hX2hlYXBfbWFwX2RtYSwKLQkudW5tYXBfZG1hID0gaW9uX2NtYV9oZWFwX3VubWFwX2RtYSwKLQkucGh5cyA9IGlvbl9jbWFfcGh5cywKIAkubWFwX3VzZXIgPSBpb25fY21hX21tYXAsCiAJLm1hcF9rZXJuZWwgPSBpb25fY21hX21hcF9rZXJuZWwsCiAJLnVubWFwX2tlcm5lbCA9IGlvbl9jbWFfdW5tYXBfa2VybmVsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9kdW1teV9kcml2ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fZHVtbXlfZHJpdmVyLmMKaW5kZXggODE0YTNjOS4uYjIzZjJjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9kdW1teV9kcml2ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX2R1bW15X2RyaXZlci5jCkBAIC05OSw3ICs5OSw3IEBACiAJCXN0cnVjdCBpb25fcGxhdGZvcm1faGVhcCAqaGVhcF9kYXRhID0gJmR1bW15X2lvbl9wZGF0YS5oZWFwc1tpXTsKIAogCQlpZiAoaGVhcF9kYXRhLT50eXBlID09IElPTl9IRUFQX1RZUEVfQ0FSVkVPVVQgJiYKLQkJCQkJCQkhaGVhcF9kYXRhLT5iYXNlKQorCQkgICAgIWhlYXBfZGF0YS0+YmFzZSkKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChoZWFwX2RhdGEtPnR5cGUgPT0gSU9OX0hFQVBfVFlQRV9DSFVOSyAmJiAhaGVhcF9kYXRhLT5iYXNlKQpAQCAtMTIwLDEyICsxMjAsMTIgQEAKIAogCWlmIChjYXJ2ZW91dF9wdHIpIHsKIAkJZnJlZV9wYWdlc19leGFjdChjYXJ2ZW91dF9wdHIsCi0JCQkJZHVtbXlfaGVhcHNbSU9OX0hFQVBfVFlQRV9DQVJWRU9VVF0uc2l6ZSk7CisJCQkJIGR1bW15X2hlYXBzW0lPTl9IRUFQX1RZUEVfQ0FSVkVPVVRdLnNpemUpOwogCQljYXJ2ZW91dF9wdHIgPSBOVUxMOwogCX0KIAlpZiAoY2h1bmtfcHRyKSB7CiAJCWZyZWVfcGFnZXNfZXhhY3QoY2h1bmtfcHRyLAotCQkJCWR1bW15X2hlYXBzW0lPTl9IRUFQX1RZUEVfQ0hVTktdLnNpemUpOworCQkJCSBkdW1teV9oZWFwc1tJT05fSEVBUF9UWVBFX0NIVU5LXS5zaXplKTsKIAkJY2h1bmtfcHRyID0gTlVMTDsKIAl9CiAJcmV0dXJuIGVycjsKQEAgLTE0NCwxMiArMTQ0LDEyIEBACiAKIAlpZiAoY2FydmVvdXRfcHRyKSB7CiAJCWZyZWVfcGFnZXNfZXhhY3QoY2FydmVvdXRfcHRyLAotCQkJCWR1bW15X2hlYXBzW0lPTl9IRUFQX1RZUEVfQ0FSVkVPVVRdLnNpemUpOworCQkJCSBkdW1teV9oZWFwc1tJT05fSEVBUF9UWVBFX0NBUlZFT1VUXS5zaXplKTsKIAkJY2FydmVvdXRfcHRyID0gTlVMTDsKIAl9CiAJaWYgKGNodW5rX3B0cikgewogCQlmcmVlX3BhZ2VzX2V4YWN0KGNodW5rX3B0ciwKLQkJCQlkdW1teV9oZWFwc1tJT05fSEVBUF9UWVBFX0NIVU5LXS5zaXplKTsKKwkJCQkgZHVtbXlfaGVhcHNbSU9OX0hFQVBfVFlQRV9DSFVOS10uc2l6ZSk7CiAJCWNodW5rX3B0ciA9IE5VTEw7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9oZWFwLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX2hlYXAuYwppbmRleCBjYTE1YTg3Li40ZTVjMGYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX2hlYXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX2hlYXAuYwpAQCAtOTMsNyArOTMsNyBAQAogCQl9CiAJCWxlbiA9IG1pbihsZW4sIHJlbWFpbmRlcik7CiAJCXJldCA9IHJlbWFwX3Bmbl9yYW5nZSh2bWEsIGFkZHIsIHBhZ2VfdG9fcGZuKHBhZ2UpLCBsZW4sCi0JCQkJdm1hLT52bV9wYWdlX3Byb3QpOworCQkJCSAgICAgIHZtYS0+dm1fcGFnZV9wcm90KTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJCWFkZHIgKz0gbGVuOwpAQCAtMTE2LDcgKzExNiw3IEBACiB9CiAKIHN0YXRpYyBpbnQgaW9uX2hlYXBfc2dsaXN0X3plcm8oc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIHVuc2lnbmVkIGludCBuZW50cywKLQkJCQkJCXBncHJvdF90IHBncHJvdCkKKwkJCQlwZ3Byb3RfdCBwZ3Byb3QpCiB7CiAJaW50IHAgPSAwOwogCWludCByZXQgPSAwOwpAQCAtMTgxLDcgKzE4MSw3IEBACiB9CiAKIHN0YXRpYyBzaXplX3QgX2lvbl9oZWFwX2ZyZWVsaXN0X2RyYWluKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgc2l6ZV90IHNpemUsCi0JCQkJYm9vbCBza2lwX3Bvb2xzKQorCQkJCSAgICAgICBib29sIHNraXBfcG9vbHMpCiB7CiAJc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcjsKIAlzaXplX3QgdG90YWxfZHJhaW5lZCA9IDA7CkBAIC0yNjYsNyArMjY2LDcgQEAKIH0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgaW9uX2hlYXBfc2hyaW5rX2NvdW50KHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rZXIsCi0JCQkJCQlzdHJ1Y3Qgc2hyaW5rX2NvbnRyb2wgKnNjKQorCQkJCQkgICBzdHJ1Y3Qgc2hyaW5rX2NvbnRyb2wgKnNjKQogewogCXN0cnVjdCBpb25faGVhcCAqaGVhcCA9IGNvbnRhaW5lcl9vZihzaHJpbmtlciwgc3RydWN0IGlvbl9oZWFwLAogCQkJCQkgICAgIHNocmlua2VyKTsKQEAgLTI3OSw3ICsyNzksNyBAQAogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBpb25faGVhcF9zaHJpbmtfc2NhbihzdHJ1Y3Qgc2hyaW5rZXIgKnNocmlua2VyLAotCQkJCQkJc3RydWN0IHNocmlua19jb250cm9sICpzYykKKwkJCQkJICBzdHJ1Y3Qgc2hyaW5rX2NvbnRyb2wgKnNjKQogewogCXN0cnVjdCBpb25faGVhcCAqaGVhcCA9IGNvbnRhaW5lcl9vZihzaHJpbmtlciwgc3RydWN0IGlvbl9oZWFwLAogCQkJCQkgICAgIHNocmlua2VyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fb2YuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fb2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWJhYzkyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9vZi5jCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICogQmFzZWQgb24gd29yayBmcm9tOgorICogICBBbmRyZXcgQW5kcmlhbm92IDxhbmRyZXdAbmNybW50Lm9yZz4KKyAqICAgR29vZ2xlCisgKiAgIFRoZSBMaW51eCBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvY21hLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLWNvbnRpZ3VvdXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3Jlc2VydmVkX21lbS5oPgorI2luY2x1ZGUgImlvbi5oIgorI2luY2x1ZGUgImlvbl9wcml2LmgiCisjaW5jbHVkZSAiaW9uX29mLmgiCisKK3N0YXRpYyBpbnQgaW9uX3BhcnNlX2R0X2hlYXBfY29tbW9uKHN0cnVjdCBkZXZpY2Vfbm9kZSAqaGVhcF9ub2RlLAorCQkJCSAgICBzdHJ1Y3QgaW9uX3BsYXRmb3JtX2hlYXAgKmhlYXAsCisJCQkJICAgIHN0cnVjdCBpb25fb2ZfaGVhcCAqY29tcGF0aWJsZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGNvbXBhdGlibGVbaV0ubmFtZTsgaSsrKSB7CisJCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShoZWFwX25vZGUsIGNvbXBhdGlibGVbaV0uY29tcGF0KSkKKwkJCWJyZWFrOworCX0KKworCWlmICghY29tcGF0aWJsZVtpXS5uYW1lKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWhlYXAtPmlkID0gY29tcGF0aWJsZVtpXS5oZWFwX2lkOworCWhlYXAtPnR5cGUgPSBjb21wYXRpYmxlW2ldLnR5cGU7CisJaGVhcC0+bmFtZSA9IGNvbXBhdGlibGVbaV0ubmFtZTsKKwloZWFwLT5hbGlnbiA9IGNvbXBhdGlibGVbaV0uYWxpZ247CisKKwkvKiBTb21lIGtpbmQgb2YgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlcj8gKi8KKworCXByX2luZm8oIiVzOiBpZCAlZCB0eXBlICVkIG5hbWUgJXMgYWxpZ24gJWx4XG4iLCBfX2Z1bmNfXywKKwkJaGVhcC0+aWQsIGhlYXAtPnR5cGUsIGhlYXAtPm5hbWUsIGhlYXAtPmFsaWduKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpb25fc2V0dXBfaGVhcF9jb21tb24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGFyZW50LAorCQkJCSBzdHJ1Y3QgZGV2aWNlX25vZGUgKmhlYXBfbm9kZSwKKwkJCQkgc3RydWN0IGlvbl9wbGF0Zm9ybV9oZWFwICpoZWFwKQoreworCWludCByZXQgPSAwOworCisJc3dpdGNoIChoZWFwLT50eXBlKSB7CisJY2FzZSBJT05fSEVBUF9UWVBFX0NBUlZFT1VUOgorCWNhc2UgSU9OX0hFQVBfVFlQRV9DSFVOSzoKKwkJaWYgKGhlYXAtPmJhc2UgJiYgaGVhcC0+c2l6ZSkKKwkJCXJldHVybiAwOworCisJCXJldCA9IG9mX3Jlc2VydmVkX21lbV9kZXZpY2VfaW5pdChoZWFwLT5wcml2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IGlvbl9wbGF0Zm9ybV9kYXRhICppb25fcGFyc2VfZHQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkgICAgICAgc3RydWN0IGlvbl9vZl9oZWFwICpjb21wYXRpYmxlKQoreworCWludCBudW1faGVhcHMsIHJldDsKKwljb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmR0X25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CisJc3RydWN0IGlvbl9wbGF0Zm9ybV9oZWFwICpoZWFwczsKKwlzdHJ1Y3QgaW9uX3BsYXRmb3JtX2RhdGEgKmRhdGE7CisJaW50IGkgPSAwOworCisJbnVtX2hlYXBzID0gb2ZfZ2V0X2F2YWlsYWJsZV9jaGlsZF9jb3VudChkdF9ub2RlKTsKKworCWlmICghbnVtX2hlYXBzKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCWhlYXBzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgaW9uX3BsYXRmb3JtX2hlYXApICogbnVtX2hlYXBzLAorCQkJICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWhlYXBzKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBpb25fcGxhdGZvcm1fZGF0YSksCisJCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWZvcl9lYWNoX2F2YWlsYWJsZV9jaGlsZF9vZl9ub2RlKGR0X25vZGUsIG5vZGUpIHsKKwkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqaGVhcF9wZGV2OworCisJCXJldCA9IGlvbl9wYXJzZV9kdF9oZWFwX2NvbW1vbihub2RlLCAmaGVhcHNbaV0sIGNvbXBhdGlibGUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKworCQloZWFwX3BkZXYgPSBvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKG5vZGUsIGhlYXBzW2ldLm5hbWUsCisJCQkJCQkgICAgICAmcGRldi0+ZGV2KTsKKwkJaWYgKCFwZGV2KQorCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJCWhlYXBfcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSAmaGVhcHNbaV07CisKKwkJaGVhcHNbaV0ucHJpdiA9ICZoZWFwX3BkZXYtPmRldjsKKworCQlyZXQgPSBpb25fc2V0dXBfaGVhcF9jb21tb24ocGRldiwgbm9kZSwgJmhlYXBzW2ldKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X2VycjsKKwkJaSsrOworCX0KKworCWRhdGEtPmhlYXBzID0gaGVhcHM7CisJZGF0YS0+bnIgPSBudW1faGVhcHM7CisJcmV0dXJuIGRhdGE7CisKK291dF9lcnI6CisJZm9yICggOyBpID49IDA7IGktLSkKKwkJaWYgKGhlYXBzW2ldLnByaXYpCisJCQlvZl9kZXZpY2VfdW5yZWdpc3Rlcih0b19wbGF0Zm9ybV9kZXZpY2UoaGVhcHNbaV0ucHJpdikpOworCisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KKwordm9pZCBpb25fZGVzdHJveV9wbGF0Zm9ybV9kYXRhKHN0cnVjdCBpb25fcGxhdGZvcm1fZGF0YSAqZGF0YSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5ucjsgaSsrKQorCQlpZiAoZGF0YS0+aGVhcHNbaV0ucHJpdikKKwkJCW9mX2RldmljZV91bnJlZ2lzdGVyKHRvX3BsYXRmb3JtX2RldmljZSgKKwkJCQlkYXRhLT5oZWFwc1tpXS5wcml2KSk7Cit9CisKKyNpZmRlZiBDT05GSUdfT0ZfUkVTRVJWRURfTUVNCisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9mZHQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9yZXNlcnZlZF9tZW0uaD4KKworc3RhdGljIGludCBybWVtX2lvbl9kZXZpY2VfaW5pdChzdHJ1Y3QgcmVzZXJ2ZWRfbWVtICpybWVtLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBpb25fcGxhdGZvcm1faGVhcCAqaGVhcCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJaGVhcC0+YmFzZSA9IHJtZW0tPmJhc2U7CisJaGVhcC0+YmFzZSA9IHJtZW0tPnNpemU7CisJcHJfZGVidWcoIiVzOiBoZWFwICVzIGJhc2UgJXBhIHNpemUgJXBhIGRldiAlcFxuIiwgX19mdW5jX18sCisJCSBoZWFwLT5uYW1lLCAmcm1lbS0+YmFzZSwgJnJtZW0tPnNpemUsIGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJtZW1faW9uX2RldmljZV9yZWxlYXNlKHN0cnVjdCByZXNlcnZlZF9tZW0gKnJtZW0sCisJCQkJICAgIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVzZXJ2ZWRfbWVtX29wcyBybWVtX2RtYV9vcHMgPSB7CisJLmRldmljZV9pbml0CT0gcm1lbV9pb25fZGV2aWNlX2luaXQsCisJLmRldmljZV9yZWxlYXNlCT0gcm1lbV9pb25fZGV2aWNlX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBybWVtX2lvbl9zZXR1cChzdHJ1Y3QgcmVzZXJ2ZWRfbWVtICpybWVtKQoreworCXBoeXNfYWRkcl90IHNpemUgPSBybWVtLT5zaXplOworCisJc2l6ZSA9IHNpemUgLyAxMDI0OworCisJcHJfaW5mbygiSW9uIG1lbW9yeSBzZXR1cCBhdCAlcGEgc2l6ZSAlcGEgTWlCXG4iLAorCQkmcm1lbS0+YmFzZSwgJnNpemUpOworCXJtZW0tPm9wcyA9ICZybWVtX2RtYV9vcHM7CisJcmV0dXJuIDA7Cit9CisKK1JFU0VSVkVETUVNX09GX0RFQ0xBUkUoaW9uLCAiaW9uLXJlZ2lvbiIsIHJtZW1faW9uX3NldHVwKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9vZi5oIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9vZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNDFhMTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX29mLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIEJhc2VkIG9uIHdvcmsgZnJvbToKKyAqICAgQW5kcmV3IEFuZHJpYW5vdiA8YW5kcmV3QG5jcm1udC5vcmc+CisgKiAgIEdvb2dsZQorICogICBUaGUgTGludXggRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfSU9OX09GX0gKKyNkZWZpbmUgX0lPTl9PRl9ICisKK3N0cnVjdCBpb25fb2ZfaGVhcCB7CisJY29uc3QgY2hhciAqY29tcGF0OworCWludCBoZWFwX2lkOworCWludCB0eXBlOworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IGFsaWduOworfTsKKworI2RlZmluZSBQTEFURk9STV9IRUFQKF9jb21wYXQsIF9pZCwgX3R5cGUsIF9uYW1lKSBcCit7IFwKKwkuY29tcGF0ID0gX2NvbXBhdCwgXAorCS5oZWFwX2lkID0gX2lkLCBcCisJLnR5cGUgPSBfdHlwZSwgXAorCS5uYW1lID0gX25hbWUsIFwKKwkuYWxpZ24gPSBQQUdFX1NJWkUsIFwKK30KKworc3RydWN0IGlvbl9wbGF0Zm9ybV9kYXRhICppb25fcGFyc2VfZHQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkJc3RydWN0IGlvbl9vZl9oZWFwICpjb21wYXRpYmxlKTsKKwordm9pZCBpb25fZGVzdHJveV9wbGF0Zm9ybV9kYXRhKHN0cnVjdCBpb25fcGxhdGZvcm1fZGF0YSAqZGF0YSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9wYWdlX3Bvb2wuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fcGFnZV9wb29sLmMKaW5kZXggMWZlODAxNi4uYWVhODljMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9wYWdlX3Bvb2wuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3BhZ2VfcG9vbC5jCkBAIC0zMCw4ICszMCw5IEBACiAKIAlpZiAoIXBhZ2UpCiAJCXJldHVybiBOVUxMOwotCWlvbl9wYWdlc19zeW5jX2Zvcl9kZXZpY2UoTlVMTCwgcGFnZSwgUEFHRV9TSVpFIDw8IHBvb2wtPm9yZGVyLAotCQkJCQkJRE1BX0JJRElSRUNUSU9OQUwpOworCWlmICghcG9vbC0+Y2FjaGVkKQorCQlpb25fcGFnZXNfc3luY19mb3JfZGV2aWNlKE5VTEwsIHBhZ2UsIFBBR0VfU0laRSA8PCBwb29sLT5vcmRlciwKKwkJCQkJICBETUFfQklESVJFQ1RJT05BTCk7CiAJcmV0dXJuIHBhZ2U7CiB9CiAKQEAgLTExNCw3ICsxMTUsNyBAQAogfQogCiBpbnQgaW9uX3BhZ2VfcG9vbF9zaHJpbmsoc3RydWN0IGlvbl9wYWdlX3Bvb2wgKnBvb2wsIGdmcF90IGdmcF9tYXNrLAotCQkJCWludCBucl90b19zY2FuKQorCQkJIGludCBucl90b19zY2FuKQogewogCWludCBmcmVlZCA9IDA7CiAJYm9vbCBoaWdoOwpAQCAtMTQ3LDcgKzE0OCw4IEBACiAJcmV0dXJuIGZyZWVkOwogfQogCi1zdHJ1Y3QgaW9uX3BhZ2VfcG9vbCAqaW9uX3BhZ2VfcG9vbF9jcmVhdGUoZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlcikKK3N0cnVjdCBpb25fcGFnZV9wb29sICppb25fcGFnZV9wb29sX2NyZWF0ZShnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgaW50IG9yZGVyLAorCQkJCQkgICBib29sIGNhY2hlZCkKIHsKIAlzdHJ1Y3QgaW9uX3BhZ2VfcG9vbCAqcG9vbCA9IGttYWxsb2Moc2l6ZW9mKCpwb29sKSwgR0ZQX0tFUk5FTCk7CiAKQEAgLTE2MSw2ICsxNjMsOCBAQAogCXBvb2wtPm9yZGVyID0gb3JkZXI7CiAJbXV0ZXhfaW5pdCgmcG9vbC0+bXV0ZXgpOwogCXBsaXN0X25vZGVfaW5pdCgmcG9vbC0+bGlzdCwgb3JkZXIpOworCWlmIChjYWNoZWQpCisJCXBvb2wtPmNhY2hlZCA9IHRydWU7CiAKIAlyZXR1cm4gcG9vbDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fcHJpdi5oIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9wcml2LmgKaW5kZXggMDIzOTg4My4uM2MzYjMyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9wcml2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9wcml2LmgKQEAgLTI2LDExICsyNiwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2hyaW5rZXIuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KIAogI2luY2x1ZGUgImlvbi5oIgogCi1zdHJ1Y3QgaW9uX2J1ZmZlciAqaW9uX2hhbmRsZV9idWZmZXIoc3RydWN0IGlvbl9oYW5kbGUgKmhhbmRsZSk7Ci0KIC8qKgogICogc3RydWN0IGlvbl9idWZmZXIgLSBtZXRhZGF0YSBmb3IgYSBwYXJ0aWN1bGFyIGJ1ZmZlcgogICogQHJlZjoJCXJlZmVyZW5jZSBjb3VudApAQCAtNDIsOCArNDEsNiBAQAogICogQHNpemU6CQlzaXplIG9mIHRoZSBidWZmZXIKICAqIEBwcml2X3ZpcnQ6CQlwcml2YXRlIGRhdGEgdG8gdGhlIGJ1ZmZlciByZXByZXNlbnRhYmxlIGFzCiAgKgkJCWEgdm9pZCAqCi0gKiBAcHJpdl9waHlzOgkJcHJpdmF0ZSBkYXRhIHRvIHRoZSBidWZmZXIgcmVwcmVzZW50YWJsZSBhcwotICoJCQlhbiBpb25fcGh5c19hZGRyX3QgKGFuZCBzb21lZGF5IGEgcGh5c19hZGRyX3QpCiAgKiBAbG9jazoJCXByb3RlY3RzIHRoZSBidWZmZXJzIGNudCBmaWVsZHMKICAqIEBrbWFwX2NudDoJCW51bWJlciBvZiB0aW1lcyB0aGUgYnVmZmVyIGlzIG1hcHBlZCB0byB0aGUga2VybmVsCiAgKiBAdmFkZHI6CQl0aGUga2VybmVsIG1hcHBpbmcgaWYga21hcF9jbnQgaXMgbm90IHplcm8KQEAgLTY5LDEwICs2Niw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBsb25nIHByaXZhdGVfZmxhZ3M7CiAJc2l6ZV90IHNpemU7Ci0JdW5pb24gewotCQl2b2lkICpwcml2X3ZpcnQ7Ci0JCWlvbl9waHlzX2FkZHJfdCBwcml2X3BoeXM7Ci0JfTsKKwl2b2lkICpwcml2X3ZpcnQ7CiAJc3RydWN0IG11dGV4IGxvY2s7CiAJaW50IGttYXBfY250OwogCXZvaWQgKnZhZGRyOwpAQCAtODgsMTMgKzgyLDg0IEBACiB2b2lkIGlvbl9idWZmZXJfZGVzdHJveShzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyKTsKIAogLyoqCisgKiBzdHJ1Y3QgaW9uX2RldmljZSAtIHRoZSBtZXRhZGF0YSBvZiB0aGUgaW9uIGRldmljZSBub2RlCisgKiBAZGV2OgkJdGhlIGFjdHVhbCBtaXNjIGRldmljZQorICogQGJ1ZmZlcnM6CQlhbiByYiB0cmVlIG9mIGFsbCB0aGUgZXhpc3RpbmcgYnVmZmVycworICogQGJ1ZmZlcl9sb2NrOglsb2NrIHByb3RlY3RpbmcgdGhlIHRyZWUgb2YgYnVmZmVycworICogQGxvY2s6CQlyd3NlbSBwcm90ZWN0aW5nIHRoZSB0cmVlIG9mIGhlYXBzIGFuZCBjbGllbnRzCisgKiBAaGVhcHM6CQlsaXN0IG9mIGFsbCB0aGUgaGVhcHMgaW4gdGhlIHN5c3RlbQorICogQHVzZXJfY2xpZW50czoJbGlzdCBvZiBhbGwgdGhlIGNsaWVudHMgY3JlYXRlZCBmcm9tIHVzZXJzcGFjZQorICovCitzdHJ1Y3QgaW9uX2RldmljZSB7CisJc3RydWN0IG1pc2NkZXZpY2UgZGV2OworCXN0cnVjdCByYl9yb290IGJ1ZmZlcnM7CisJc3RydWN0IG11dGV4IGJ1ZmZlcl9sb2NrOworCXN0cnVjdCByd19zZW1hcGhvcmUgbG9jazsKKwlzdHJ1Y3QgcGxpc3RfaGVhZCBoZWFwczsKKwlsb25nICgqY3VzdG9tX2lvY3RsKShzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGFyZyk7CisJc3RydWN0IHJiX3Jvb3QgY2xpZW50czsKKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z19yb290OworCXN0cnVjdCBkZW50cnkgKmhlYXBzX2RlYnVnX3Jvb3Q7CisJc3RydWN0IGRlbnRyeSAqY2xpZW50c19kZWJ1Z19yb290OworCWludCBoZWFwX2NudDsKK307CisKKy8qKgorICogc3RydWN0IGlvbl9jbGllbnQgLSBhIHByb2Nlc3MvaHcgYmxvY2sgbG9jYWwgYWRkcmVzcyBzcGFjZQorICogQG5vZGU6CQlub2RlIGluIHRoZSB0cmVlIG9mIGFsbCBjbGllbnRzCisgKiBAZGV2OgkJYmFja3BvaW50ZXIgdG8gaW9uIGRldmljZQorICogQGhhbmRsZXM6CQlhbiByYiB0cmVlIG9mIGFsbCB0aGUgaGFuZGxlcyBpbiB0aGlzIGNsaWVudAorICogQGlkcjoJCWFuIGlkciBzcGFjZSBmb3IgYWxsb2NhdGluZyBoYW5kbGUgaWRzCisgKiBAbG9jazoJCWxvY2sgcHJvdGVjdGluZyB0aGUgdHJlZSBvZiBoYW5kbGVzCisgKiBAbmFtZToJCXVzZWQgZm9yIGRlYnVnZ2luZworICogQGRpc3BsYXlfbmFtZToJdXNlZCBmb3IgZGVidWdnaW5nICh1bmlxdWUgdmVyc2lvbiBvZiBAbmFtZSkKKyAqIEBkaXNwbGF5X3NlcmlhbDoJdXNlZCBmb3IgZGVidWdnaW5nICh0byBtYWtlIGRpc3BsYXlfbmFtZSB1bmlxdWUpCisgKiBAdGFzazoJCXVzZWQgZm9yIGRlYnVnZ2luZworICoKKyAqIEEgY2xpZW50IHJlcHJlc2VudHMgYSBsaXN0IG9mIGJ1ZmZlcnMgdGhpcyBjbGllbnQgbWF5IGFjY2Vzcy4KKyAqIFRoZSBtdXRleCBzdG9yZWQgaGVyZSBpcyB1c2VkIHRvIHByb3RlY3QgYm90aCBoYW5kbGVzIHRyZWUKKyAqIGFzIHdlbGwgYXMgdGhlIGhhbmRsZXMgdGhlbXNlbHZlcywgYW5kIHNob3VsZCBiZSBoZWxkIHdoaWxlIG1vZGlmeWluZyBlaXRoZXIuCisgKi8KK3N0cnVjdCBpb25fY2xpZW50IHsKKwlzdHJ1Y3QgcmJfbm9kZSBub2RlOworCXN0cnVjdCBpb25fZGV2aWNlICpkZXY7CisJc3RydWN0IHJiX3Jvb3QgaGFuZGxlczsKKwlzdHJ1Y3QgaWRyIGlkcjsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwljb25zdCBjaGFyICpuYW1lOworCWNoYXIgKmRpc3BsYXlfbmFtZTsKKwlpbnQgZGlzcGxheV9zZXJpYWw7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCXBpZF90IHBpZDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z19yb290OworfTsKKworLyoqCisgKiBpb25faGFuZGxlIC0gYSBjbGllbnQgbG9jYWwgcmVmZXJlbmNlIHRvIGEgYnVmZmVyCisgKiBAcmVmOgkJcmVmZXJlbmNlIGNvdW50CisgKiBAY2xpZW50OgkJYmFjayBwb2ludGVyIHRvIHRoZSBjbGllbnQgdGhlIGJ1ZmZlciByZXNpZGVzIGluCisgKiBAYnVmZmVyOgkJcG9pbnRlciB0byB0aGUgYnVmZmVyCisgKiBAbm9kZToJCW5vZGUgaW4gdGhlIGNsaWVudCdzIGhhbmRsZSByYnRyZWUKKyAqIEBrbWFwX2NudDoJCWNvdW50IG9mIHRpbWVzIHRoaXMgY2xpZW50IGhhcyBtYXBwZWQgdG8ga2VybmVsCisgKiBAaWQ6CQkJY2xpZW50LXVuaXF1ZSBpZCBhbGxvY2F0ZWQgYnkgY2xpZW50LT5pZHIKKyAqCisgKiBNb2RpZmljYXRpb25zIHRvIG5vZGUsIG1hcF9jbnQgb3IgbWFwcGluZyBzaG91bGQgYmUgcHJvdGVjdGVkIGJ5IHRoZQorICogbG9jayBpbiB0aGUgY2xpZW50LiAgT3RoZXIgZmllbGRzIGFyZSBuZXZlciBjaGFuZ2VkIGFmdGVyIGluaXRpYWxpemF0aW9uLgorICovCitzdHJ1Y3QgaW9uX2hhbmRsZSB7CisJc3RydWN0IGtyZWYgcmVmOworCXN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcjsKKwlzdHJ1Y3QgcmJfbm9kZSBub2RlOworCXVuc2lnbmVkIGludCBrbWFwX2NudDsKKwlpbnQgaWQ7Cit9OworCisvKioKICAqIHN0cnVjdCBpb25faGVhcF9vcHMgLSBvcHMgdG8gb3BlcmF0ZSBvbiBhIGdpdmVuIGhlYXAKICAqIEBhbGxvY2F0ZToJCWFsbG9jYXRlIG1lbW9yeQogICogQGZyZWU6CQlmcmVlIG1lbW9yeQotICogQHBoeXMJCWdldCBwaHlzaWNhbCBhZGRyZXNzIG9mIGEgYnVmZmVyIChvbmx5IGRlZmluZSBvbgotICoJCQlwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgaGVhcHMpCi0gKiBAbWFwX2RtYQkJbWFwIHRoZSBtZW1vcnkgZm9yIGRtYSB0byBhIHNjYXR0ZXJsaXN0Ci0gKiBAdW5tYXBfZG1hCQl1bm1hcCB0aGUgbWVtb3J5IGZvciBkbWEKICAqIEBtYXBfa2VybmVsCQltYXAgbWVtb3J5IHRvIHRoZSBrZXJuZWwKICAqIEB1bm1hcF9rZXJuZWwJdW5tYXAgbWVtb3J5IHRvIHRoZSBrZXJuZWwKICAqIEBtYXBfdXNlcgkJbWFwIG1lbW9yeSB0byB1c2Vyc3BhY2UKQEAgLTExMSwxMSArMTc2LDYgQEAKIAkJCXN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgbGVuLAogCQkJdW5zaWduZWQgbG9uZyBhbGlnbiwgdW5zaWduZWQgbG9uZyBmbGFncyk7CiAJdm9pZCAoKmZyZWUpKHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIpOwotCWludCAoKnBoeXMpKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlciwKLQkJICAgIGlvbl9waHlzX2FkZHJfdCAqYWRkciwgc2l6ZV90ICpsZW4pOwotCXN0cnVjdCBzZ190YWJsZSAqICgqbWFwX2RtYSkoc3RydWN0IGlvbl9oZWFwICpoZWFwLAotCQkJCSAgICAgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcik7Ci0Jdm9pZCAoKnVubWFwX2RtYSkoc3RydWN0IGlvbl9oZWFwICpoZWFwLCBzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyKTsKIAl2b2lkICogKCptYXBfa2VybmVsKShzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIpOwogCXZvaWQgKCp1bm1hcF9rZXJuZWwpKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcik7CiAJaW50ICgqbWFwX3VzZXIpKHN0cnVjdCBpb25faGVhcCAqbWFwcGVyLCBzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyLApAQCAtMzI4LDIwICszODgsNiBAQAogdm9pZCBpb25fY21hX2hlYXBfZGVzdHJveShzdHJ1Y3QgaW9uX2hlYXAgKik7CiAKIC8qKgotICoga2VybmVsIGFwaSB0byBhbGxvY2F0ZS9mcmVlIGZyb20gY2FydmVvdXQgLS0gdXNlZCB3aGVuIGNhcnZlb3V0IGlzCi0gKiB1c2VkIHRvIGJhY2sgYW4gYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGN1c3RvbSBoZWFwCi0gKi8KLWlvbl9waHlzX2FkZHJfdCBpb25fY2FydmVvdXRfYWxsb2NhdGUoc3RydWN0IGlvbl9oZWFwICpoZWFwLCB1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBhbGlnbik7Ci12b2lkIGlvbl9jYXJ2ZW91dF9mcmVlKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgaW9uX3BoeXNfYWRkcl90IGFkZHIsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpOwotLyoqCi0gKiBUaGUgY2FydmVvdXQgaGVhcCByZXR1cm5zIHBoeXNpY2FsIGFkZHJlc3Nlcywgc2luY2UgMCBtYXkgYmUgYSB2YWxpZAotICogcGh5c2ljYWwgYWRkcmVzcywgdGhpcyBpcyB1c2VkIHRvIGluZGljYXRlIGFsbG9jYXRpb24gZmFpbGVkCi0gKi8KLSNkZWZpbmUgSU9OX0NBUlZFT1VUX0FMTE9DQVRFX0ZBSUwgLTEKLQotLyoqCiAgKiBmdW5jdGlvbnMgZm9yIGNyZWF0aW5nIGFuZCBkZXN0cm95aW5nIGEgaGVhcCBwb29sIC0tIGFsbG93cyB5b3UKICAqIHRvIGtlZXAgYSBwb29sIG9mIHByZSBhbGxvY2F0ZWQgbWVtb3J5IHRvIHVzZSBmcm9tIHlvdXIgaGVhcC4gIEtlZXBpbmcKICAqIGEgcG9vbCBvZiBtZW1vcnkgdGhhdCBpcyByZWFkeSBmb3IgZG1hLCBpZSBhbnkgY2FjaGVkIG1hcHBpbmcgaGF2ZSBiZWVuCkBAIC0zNjAsNiArNDA2LDcgQEAKICAqIEBnZnBfbWFzazoJCWdmcF9tYXNrIHRvIHVzZSBmcm9tIGFsbG9jCiAgKiBAb3JkZXI6CQlvcmRlciBvZiBwYWdlcyBpbiB0aGUgcG9vbAogICogQGxpc3Q6CQlwbGlzdCBub2RlIGZvciBsaXN0IG9mIHBvb2xzCisgKiBAY2FjaGVkOgkJaXQncyBjYWNoZWQgcG9vbCBvciBub3QKICAqCiAgKiBBbGxvd3MgeW91IHRvIGtlZXAgYSBwb29sIG9mIHByZSBhbGxvY2F0ZWQgcGFnZXMgdG8gdXNlIGZyb20geW91ciBoZWFwLgogICogS2VlcGluZyBhIHBvb2wgb2YgcGFnZXMgdGhhdCBpcyByZWFkeSBmb3IgZG1hLCBpZSBhbnkgY2FjaGVkIG1hcHBpbmcgaGF2ZQpAQCAtMzY5LDYgKzQxNiw3IEBACiBzdHJ1Y3QgaW9uX3BhZ2VfcG9vbCB7CiAJaW50IGhpZ2hfY291bnQ7CiAJaW50IGxvd19jb3VudDsKKwlib29sIGNhY2hlZDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGhpZ2hfaXRlbXM7CiAJc3RydWN0IGxpc3RfaGVhZCBsb3dfaXRlbXM7CiAJc3RydWN0IG11dGV4IG11dGV4OwpAQCAtMzc3LDcgKzQyNSw4IEBACiAJc3RydWN0IHBsaXN0X25vZGUgbGlzdDsKIH07CiAKLXN0cnVjdCBpb25fcGFnZV9wb29sICppb25fcGFnZV9wb29sX2NyZWF0ZShnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgaW50IG9yZGVyKTsKK3N0cnVjdCBpb25fcGFnZV9wb29sICppb25fcGFnZV9wb29sX2NyZWF0ZShnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgaW50IG9yZGVyLAorCQkJCQkgICBib29sIGNhY2hlZCk7CiB2b2lkIGlvbl9wYWdlX3Bvb2xfZGVzdHJveShzdHJ1Y3QgaW9uX3BhZ2VfcG9vbCAqKTsKIHN0cnVjdCBwYWdlICppb25fcGFnZV9wb29sX2FsbG9jKHN0cnVjdCBpb25fcGFnZV9wb29sICopOwogdm9pZCBpb25fcGFnZV9wb29sX2ZyZWUoc3RydWN0IGlvbl9wYWdlX3Bvb2wgKiwgc3RydWN0IHBhZ2UgKik7CkBAIC00MDMsNCArNDUyLDIyIEBACiB2b2lkIGlvbl9wYWdlc19zeW5jX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcik7CiAKK2xvbmcgaW9uX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisKK2ludCBpb25fc3luY19mb3JfZGV2aWNlKHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsIGludCBmZCk7CisKK3N0cnVjdCBpb25faGFuZGxlICppb25faGFuZGxlX2dldF9ieV9pZF9ub2xvY2soc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwKKwkJCQkJCWludCBpZCk7CisKK3ZvaWQgaW9uX2ZyZWVfbm9sb2NrKHN0cnVjdCBpb25fY2xpZW50ICpjbGllbnQsIHN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUpOworCitpbnQgaW9uX2hhbmRsZV9wdXRfbm9sb2NrKHN0cnVjdCBpb25faGFuZGxlICpoYW5kbGUpOworCitzdHJ1Y3QgaW9uX2hhbmRsZSAqaW9uX2hhbmRsZV9nZXRfYnlfaWQoc3RydWN0IGlvbl9jbGllbnQgKmNsaWVudCwKKwkJCQkJCWludCBpZCk7CisKK2ludCBpb25faGFuZGxlX3B1dChzdHJ1Y3QgaW9uX2hhbmRsZSAqaGFuZGxlKTsKKworaW50IGlvbl9xdWVyeV9oZWFwcyhzdHJ1Y3QgaW9uX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgaW9uX2hlYXBfcXVlcnkgKnF1ZXJ5KTsKKwogI2VuZGlmIC8qIF9JT05fUFJJVl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3N5c3RlbV9oZWFwLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3N5c3RlbV9oZWFwLmMKaW5kZXggYjY5ZGZjNy4uN2UwMjNkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl9zeXN0ZW1faGVhcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fc3lzdGVtX2hlYXAuYwpAQCAtMjYsMTYgKzI2LDE4IEBACiAjaW5jbHVkZSAiaW9uLmgiCiAjaW5jbHVkZSAiaW9uX3ByaXYuaCIKIAorI2RlZmluZSBOVU1fT1JERVJTIEFSUkFZX1NJWkUob3JkZXJzKQorCiBzdGF0aWMgZ2ZwX3QgaGlnaF9vcmRlcl9nZnBfZmxhZ3MgPSAoR0ZQX0hJR0hVU0VSIHwgX19HRlBfWkVSTyB8IF9fR0ZQX05PV0FSTiB8CiAJCQkJICAgICBfX0dGUF9OT1JFVFJZKSAmIH5fX0dGUF9SRUNMQUlNOwotc3RhdGljIGdmcF90IGxvd19vcmRlcl9nZnBfZmxhZ3MgID0gKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8gfCBfX0dGUF9OT1dBUk4pOworc3RhdGljIGdmcF90IGxvd19vcmRlcl9nZnBfZmxhZ3MgID0gKEdGUF9ISUdIVVNFUiB8IF9fR0ZQX1pFUk8pOwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBvcmRlcnNbXSA9IHs4LCA0LCAwfTsKLXN0YXRpYyBjb25zdCBpbnQgbnVtX29yZGVycyA9IEFSUkFZX1NJWkUob3JkZXJzKTsKKwogc3RhdGljIGludCBvcmRlcl90b19pbmRleCh1bnNpZ25lZCBpbnQgb3JkZXIpCiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX29yZGVyczsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBOVU1fT1JERVJTOyBpKyspCiAJCWlmIChvcmRlciA9PSBvcmRlcnNbaV0pCiAJCQlyZXR1cm4gaTsKIAlCVUcoKTsKQEAgLTQ5LDQ3ICs1MSw1NSBAQAogCiBzdHJ1Y3QgaW9uX3N5c3RlbV9oZWFwIHsKIAlzdHJ1Y3QgaW9uX2hlYXAgaGVhcDsKLQlzdHJ1Y3QgaW9uX3BhZ2VfcG9vbCAqcG9vbHNbMF07CisJc3RydWN0IGlvbl9wYWdlX3Bvb2wgKnVuY2FjaGVkX3Bvb2xzW05VTV9PUkRFUlNdOworCXN0cnVjdCBpb25fcGFnZV9wb29sICpjYWNoZWRfcG9vbHNbTlVNX09SREVSU107CiB9OwogCisvKioKKyAqIFRoZSBwYWdlIGZyb20gcGFnZS1wb29sIGFyZSBhbGwgemVyb2VkIGJlZm9yZS4gV2UgbmVlZCBkbyBjYWNoZQorICogY2xlYW4gZm9yIGNhY2hlZCBidWZmZXIuIFRoZSB1bmNhY2hlZCBidWZmZXIgYXJlIGFsd2F5cyBub24tY2FjaGVkCisgKiBzaW5jZSBpdCdzIGFsbG9jYXRlZC4gU28gbm8gbmVlZCBmb3Igbm9uLWNhY2hlZCBwYWdlcy4KKyAqLwogc3RhdGljIHN0cnVjdCBwYWdlICphbGxvY19idWZmZXJfcGFnZShzdHJ1Y3QgaW9uX3N5c3RlbV9oZWFwICpoZWFwLAogCQkJCSAgICAgIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIsCiAJCQkJICAgICAgdW5zaWduZWQgbG9uZyBvcmRlcikKIHsKIAlib29sIGNhY2hlZCA9IGlvbl9idWZmZXJfY2FjaGVkKGJ1ZmZlcik7Ci0Jc3RydWN0IGlvbl9wYWdlX3Bvb2wgKnBvb2wgPSBoZWFwLT5wb29sc1tvcmRlcl90b19pbmRleChvcmRlcildOworCXN0cnVjdCBpb25fcGFnZV9wb29sICpwb29sOwogCXN0cnVjdCBwYWdlICpwYWdlOwogCi0JaWYgKCFjYWNoZWQpIHsKLQkJcGFnZSA9IGlvbl9wYWdlX3Bvb2xfYWxsb2MocG9vbCk7Ci0JfSBlbHNlIHsKLQkJZ2ZwX3QgZ2ZwX2ZsYWdzID0gbG93X29yZGVyX2dmcF9mbGFnczsKKwlpZiAoIWNhY2hlZCkKKwkJcG9vbCA9IGhlYXAtPnVuY2FjaGVkX3Bvb2xzW29yZGVyX3RvX2luZGV4KG9yZGVyKV07CisJZWxzZQorCQlwb29sID0gaGVhcC0+Y2FjaGVkX3Bvb2xzW29yZGVyX3RvX2luZGV4KG9yZGVyKV07CiAKLQkJaWYgKG9yZGVyID4gNCkKLQkJCWdmcF9mbGFncyA9IGhpZ2hfb3JkZXJfZ2ZwX2ZsYWdzOwotCQlwYWdlID0gYWxsb2NfcGFnZXMoZ2ZwX2ZsYWdzIHwgX19HRlBfQ09NUCwgb3JkZXIpOwotCQlpZiAoIXBhZ2UpCi0JCQlyZXR1cm4gTlVMTDsKKwlwYWdlID0gaW9uX3BhZ2VfcG9vbF9hbGxvYyhwb29sKTsKKworCWlmIChjYWNoZWQpCiAJCWlvbl9wYWdlc19zeW5jX2Zvcl9kZXZpY2UoTlVMTCwgcGFnZSwgUEFHRV9TSVpFIDw8IG9yZGVyLAotCQkJCQkJRE1BX0JJRElSRUNUSU9OQUwpOwotCX0KLQorCQkJCQkgIERNQV9CSURJUkVDVElPTkFMKTsKIAlyZXR1cm4gcGFnZTsKIH0KIAogc3RhdGljIHZvaWQgZnJlZV9idWZmZXJfcGFnZShzdHJ1Y3QgaW9uX3N5c3RlbV9oZWFwICpoZWFwLAogCQkJICAgICBzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKKwlzdHJ1Y3QgaW9uX3BhZ2VfcG9vbCAqcG9vbDsKIAl1bnNpZ25lZCBpbnQgb3JkZXIgPSBjb21wb3VuZF9vcmRlcihwYWdlKTsKIAlib29sIGNhY2hlZCA9IGlvbl9idWZmZXJfY2FjaGVkKGJ1ZmZlcik7CiAKLQlpZiAoIWNhY2hlZCAmJiAhKGJ1ZmZlci0+cHJpdmF0ZV9mbGFncyAmIElPTl9QUklWX0ZMQUdfU0hSSU5LRVJfRlJFRSkpIHsKLQkJc3RydWN0IGlvbl9wYWdlX3Bvb2wgKnBvb2wgPSBoZWFwLT5wb29sc1tvcmRlcl90b19pbmRleChvcmRlcildOwotCi0JCWlvbl9wYWdlX3Bvb2xfZnJlZShwb29sLCBwYWdlKTsKLQl9IGVsc2UgeworCS8qIGdvIHRvIHN5c3RlbSAqLworCWlmIChidWZmZXItPnByaXZhdGVfZmxhZ3MgJiBJT05fUFJJVl9GTEFHX1NIUklOS0VSX0ZSRUUpIHsKIAkJX19mcmVlX3BhZ2VzKHBhZ2UsIG9yZGVyKTsKKwkJcmV0dXJuOwogCX0KKworCWlmICghY2FjaGVkKQorCQlwb29sID0gaGVhcC0+dW5jYWNoZWRfcG9vbHNbb3JkZXJfdG9faW5kZXgob3JkZXIpXTsKKwllbHNlCisJCXBvb2wgPSBoZWFwLT5jYWNoZWRfcG9vbHNbb3JkZXJfdG9faW5kZXgob3JkZXIpXTsKKworCWlvbl9wYWdlX3Bvb2xfZnJlZShwb29sLCBwYWdlKTsKIH0KIAogCkBAIC0xMDEsNyArMTExLDcgQEAKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBudW1fb3JkZXJzOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX09SREVSUzsgaSsrKSB7CiAJCWlmIChzaXplIDwgb3JkZXJfdG9fc2l6ZShvcmRlcnNbaV0pKQogCQkJY29udGludWU7CiAJCWlmIChtYXhfb3JkZXIgPCBvcmRlcnNbaV0pCkBAIC0xMTgsOSArMTI4LDkgQEAKIH0KIAogc3RhdGljIGludCBpb25fc3lzdGVtX2hlYXBfYWxsb2NhdGUoc3RydWN0IGlvbl9oZWFwICpoZWFwLAotCQkJCSAgICAgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlciwKLQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBhbGlnbiwKLQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJCQkJICAgIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBhbGlnbiwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3QgaW9uX3N5c3RlbV9oZWFwICpzeXNfaGVhcCA9IGNvbnRhaW5lcl9vZihoZWFwLAogCQkJCQkJCXN0cnVjdCBpb25fc3lzdGVtX2hlYXAsCkBAIC0xNDIsNyArMTUyLDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmcGFnZXMpOwogCXdoaWxlIChzaXplX3JlbWFpbmluZyA+IDApIHsKIAkJcGFnZSA9IGFsbG9jX2xhcmdlc3RfYXZhaWxhYmxlKHN5c19oZWFwLCBidWZmZXIsIHNpemVfcmVtYWluaW5nLAotCQkJCQkJbWF4X29yZGVyKTsKKwkJCQkJICAgICAgIG1heF9vcmRlcik7CiAJCWlmICghcGFnZSkKIAkJCWdvdG8gZnJlZV9wYWdlczsKIAkJbGlzdF9hZGRfdGFpbCgmcGFnZS0+bHJ1LCAmcGFnZXMpOwpAQCAtMTY0LDcgKzE3NCw3IEBACiAJCWxpc3RfZGVsKCZwYWdlLT5scnUpOwogCX0KIAotCWJ1ZmZlci0+cHJpdl92aXJ0ID0gdGFibGU7CisJYnVmZmVyLT5zZ190YWJsZSA9IHRhYmxlOwogCXJldHVybiAwOwogCiBmcmVlX3RhYmxlOgpAQCAtMTgxLDE2ICsxOTEsMTEgQEAKIAkJCQkJCQlzdHJ1Y3QgaW9uX3N5c3RlbV9oZWFwLAogCQkJCQkJCWhlYXApOwogCXN0cnVjdCBzZ190YWJsZSAqdGFibGUgPSBidWZmZXItPnNnX3RhYmxlOwotCWJvb2wgY2FjaGVkID0gaW9uX2J1ZmZlcl9jYWNoZWQoYnVmZmVyKTsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwogCWludCBpOwogCi0JLyoKLQkgKiAgdW5jYWNoZWQgcGFnZXMgY29tZSBmcm9tIHRoZSBwYWdlIHBvb2xzLCB6ZXJvIHRoZW0gYmVmb3JlIHJldHVybmluZwotCSAqICBmb3Igc2VjdXJpdHkgcHVycG9zZXMgKG90aGVyIGFsbG9jYXRpb25zIGFyZSB6ZXJvZCBhdAotCSAqICBhbGxvYyB0aW1lCi0JICovCi0JaWYgKCFjYWNoZWQgJiYgIShidWZmZXItPnByaXZhdGVfZmxhZ3MgJiBJT05fUFJJVl9GTEFHX1NIUklOS0VSX0ZSRUUpKQorCS8qIHplcm8gdGhlIGJ1ZmZlciBiZWZvcmUgZ290byBwYWdlIHBvb2wgKi8KKwlpZiAoIShidWZmZXItPnByaXZhdGVfZmxhZ3MgJiBJT05fUFJJVl9GTEFHX1NIUklOS0VSX0ZSRUUpKQogCQlpb25faGVhcF9idWZmZXJfemVybyhidWZmZXIpOwogCiAJZm9yX2VhY2hfc2codGFibGUtPnNnbCwgc2csIHRhYmxlLT5uZW50cywgaSkKQEAgLTE5OSwyMCArMjA0LDExIEBACiAJa2ZyZWUodGFibGUpOwogfQogCi1zdGF0aWMgc3RydWN0IHNnX3RhYmxlICppb25fc3lzdGVtX2hlYXBfbWFwX2RtYShzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsCi0JCQkJCQlzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyKQotewotCXJldHVybiBidWZmZXItPnByaXZfdmlydDsKLX0KLQotc3RhdGljIHZvaWQgaW9uX3N5c3RlbV9oZWFwX3VubWFwX2RtYShzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsCi0JCQkJICAgICAgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlcikKLXsKLX0KLQogc3RhdGljIGludCBpb25fc3lzdGVtX2hlYXBfc2hyaW5rKHN0cnVjdCBpb25faGVhcCAqaGVhcCwgZ2ZwX3QgZ2ZwX21hc2ssCi0JCQkJCWludCBucl90b19zY2FuKQorCQkJCSAgaW50IG5yX3RvX3NjYW4pCiB7CisJc3RydWN0IGlvbl9wYWdlX3Bvb2wgKnVuY2FjaGVkX3Bvb2w7CisJc3RydWN0IGlvbl9wYWdlX3Bvb2wgKmNhY2hlZF9wb29sOwogCXN0cnVjdCBpb25fc3lzdGVtX2hlYXAgKnN5c19oZWFwOwogCWludCBucl90b3RhbCA9IDA7CiAJaW50IGksIG5yX2ZyZWVkOwpAQCAtMjIzLDI4ICsyMTksNDEgQEAKIAlpZiAoIW5yX3RvX3NjYW4pCiAJCW9ubHlfc2NhbiA9IDE7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX29yZGVyczsgaSsrKSB7Ci0JCXN0cnVjdCBpb25fcGFnZV9wb29sICpwb29sID0gc3lzX2hlYXAtPnBvb2xzW2ldOworCWZvciAoaSA9IDA7IGkgPCBOVU1fT1JERVJTOyBpKyspIHsKKwkJdW5jYWNoZWRfcG9vbCA9IHN5c19oZWFwLT51bmNhY2hlZF9wb29sc1tpXTsKKwkJY2FjaGVkX3Bvb2wgPSBzeXNfaGVhcC0+Y2FjaGVkX3Bvb2xzW2ldOwogCi0JCW5yX2ZyZWVkID0gaW9uX3BhZ2VfcG9vbF9zaHJpbmsocG9vbCwgZ2ZwX21hc2ssIG5yX3RvX3NjYW4pOwotCQlucl90b3RhbCArPSBucl9mcmVlZDsKKwkJaWYgKG9ubHlfc2NhbikgeworCQkJbnJfdG90YWwgKz0gaW9uX3BhZ2VfcG9vbF9zaHJpbmsodW5jYWNoZWRfcG9vbCwKKwkJCQkJCQkgZ2ZwX21hc2ssCisJCQkJCQkJIG5yX3RvX3NjYW4pOwogCi0JCWlmICghb25seV9zY2FuKSB7CisJCQlucl90b3RhbCArPSBpb25fcGFnZV9wb29sX3NocmluayhjYWNoZWRfcG9vbCwKKwkJCQkJCQkgZ2ZwX21hc2ssCisJCQkJCQkJIG5yX3RvX3NjYW4pOworCQl9IGVsc2UgeworCQkJbnJfZnJlZWQgPSBpb25fcGFnZV9wb29sX3Nocmluayh1bmNhY2hlZF9wb29sLAorCQkJCQkJCWdmcF9tYXNrLAorCQkJCQkJCW5yX3RvX3NjYW4pOwogCQkJbnJfdG9fc2NhbiAtPSBucl9mcmVlZDsKLQkJCS8qIHNocmluayBjb21wbGV0ZWQgKi8KKwkJCW5yX3RvdGFsICs9IG5yX2ZyZWVkOworCQkJaWYgKG5yX3RvX3NjYW4gPD0gMCkKKwkJCQlicmVhazsKKwkJCW5yX2ZyZWVkID0gaW9uX3BhZ2VfcG9vbF9zaHJpbmsoY2FjaGVkX3Bvb2wsCisJCQkJCQkJZ2ZwX21hc2ssCisJCQkJCQkJbnJfdG9fc2Nhbik7CisJCQlucl90b19zY2FuIC09IG5yX2ZyZWVkOworCQkJbnJfdG90YWwgKz0gbnJfZnJlZWQ7CiAJCQlpZiAobnJfdG9fc2NhbiA8PSAwKQogCQkJCWJyZWFrOwogCQl9CiAJfQotCiAJcmV0dXJuIG5yX3RvdGFsOwogfQogCiBzdGF0aWMgc3RydWN0IGlvbl9oZWFwX29wcyBzeXN0ZW1faGVhcF9vcHMgPSB7CiAJLmFsbG9jYXRlID0gaW9uX3N5c3RlbV9oZWFwX2FsbG9jYXRlLAogCS5mcmVlID0gaW9uX3N5c3RlbV9oZWFwX2ZyZWUsCi0JLm1hcF9kbWEgPSBpb25fc3lzdGVtX2hlYXBfbWFwX2RtYSwKLQkudW5tYXBfZG1hID0gaW9uX3N5c3RlbV9oZWFwX3VubWFwX2RtYSwKIAkubWFwX2tlcm5lbCA9IGlvbl9oZWFwX21hcF9rZXJuZWwsCiAJLnVubWFwX2tlcm5lbCA9IGlvbl9oZWFwX3VubWFwX2tlcm5lbCwKIAkubWFwX3VzZXIgPSBpb25faGVhcF9tYXBfdXNlciwKQEAgLTI1OSw1MiArMjY4LDg5IEBACiAJCQkJCQkJc3RydWN0IGlvbl9zeXN0ZW1faGVhcCwKIAkJCQkJCQloZWFwKTsKIAlpbnQgaTsKKwlzdHJ1Y3QgaW9uX3BhZ2VfcG9vbCAqcG9vbDsKIAotCWZvciAoaSA9IDA7IGkgPCBudW1fb3JkZXJzOyBpKyspIHsKLQkJc3RydWN0IGlvbl9wYWdlX3Bvb2wgKnBvb2wgPSBzeXNfaGVhcC0+cG9vbHNbaV07CisJZm9yIChpID0gMDsgaSA8IE5VTV9PUkRFUlM7IGkrKykgeworCQlwb29sID0gc3lzX2hlYXAtPnVuY2FjaGVkX3Bvb2xzW2ldOwogCi0JCXNlcV9wcmludGYocywgIiVkIG9yZGVyICV1IGhpZ2htZW0gcGFnZXMgaW4gcG9vbCA9ICVsdSB0b3RhbFxuIiwKKwkJc2VxX3ByaW50ZihzLCAiJWQgb3JkZXIgJXUgaGlnaG1lbSBwYWdlcyB1bmNhY2hlZCAlbHUgdG90YWxcbiIsCiAJCQkgICBwb29sLT5oaWdoX2NvdW50LCBwb29sLT5vcmRlciwKIAkJCSAgIChQQUdFX1NJWkUgPDwgcG9vbC0+b3JkZXIpICogcG9vbC0+aGlnaF9jb3VudCk7Ci0JCXNlcV9wcmludGYocywgIiVkIG9yZGVyICV1IGxvd21lbSBwYWdlcyBpbiBwb29sID0gJWx1IHRvdGFsXG4iLAorCQlzZXFfcHJpbnRmKHMsICIlZCBvcmRlciAldSBsb3dtZW0gcGFnZXMgdW5jYWNoZWQgJWx1IHRvdGFsXG4iLAorCQkJICAgcG9vbC0+bG93X2NvdW50LCBwb29sLT5vcmRlciwKKwkJCSAgIChQQUdFX1NJWkUgPDwgcG9vbC0+b3JkZXIpICogcG9vbC0+bG93X2NvdW50KTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX09SREVSUzsgaSsrKSB7CisJCXBvb2wgPSBzeXNfaGVhcC0+Y2FjaGVkX3Bvb2xzW2ldOworCisJCXNlcV9wcmludGYocywgIiVkIG9yZGVyICV1IGhpZ2htZW0gcGFnZXMgY2FjaGVkICVsdSB0b3RhbFxuIiwKKwkJCSAgIHBvb2wtPmhpZ2hfY291bnQsIHBvb2wtPm9yZGVyLAorCQkJICAgKFBBR0VfU0laRSA8PCBwb29sLT5vcmRlcikgKiBwb29sLT5oaWdoX2NvdW50KTsKKwkJc2VxX3ByaW50ZihzLCAiJWQgb3JkZXIgJXUgbG93bWVtIHBhZ2VzIGNhY2hlZCAlbHUgdG90YWxcbiIsCiAJCQkgICBwb29sLT5sb3dfY291bnQsIHBvb2wtPm9yZGVyLAogCQkJICAgKFBBR0VfU0laRSA8PCBwb29sLT5vcmRlcikgKiBwb29sLT5sb3dfY291bnQpOwogCX0KIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgaW9uX3N5c3RlbV9oZWFwX2Rlc3Ryb3lfcG9vbHMoc3RydWN0IGlvbl9wYWdlX3Bvb2wgKipwb29scykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fT1JERVJTOyBpKyspCisJCWlmIChwb29sc1tpXSkKKwkJCWlvbl9wYWdlX3Bvb2xfZGVzdHJveShwb29sc1tpXSk7Cit9CisKK3N0YXRpYyBpbnQgaW9uX3N5c3RlbV9oZWFwX2NyZWF0ZV9wb29scyhzdHJ1Y3QgaW9uX3BhZ2VfcG9vbCAqKnBvb2xzLAorCQkJCQlib29sIGNhY2hlZCkKK3sKKwlpbnQgaTsKKwlnZnBfdCBnZnBfZmxhZ3MgPSBsb3dfb3JkZXJfZ2ZwX2ZsYWdzOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9PUkRFUlM7IGkrKykgeworCQlzdHJ1Y3QgaW9uX3BhZ2VfcG9vbCAqcG9vbDsKKworCQlpZiAob3JkZXJzW2ldID4gNCkKKwkJCWdmcF9mbGFncyA9IGhpZ2hfb3JkZXJfZ2ZwX2ZsYWdzOworCisJCXBvb2wgPSBpb25fcGFnZV9wb29sX2NyZWF0ZShnZnBfZmxhZ3MsIG9yZGVyc1tpXSwgY2FjaGVkKTsKKwkJaWYgKCFwb29sKQorCQkJZ290byBlcnJfY3JlYXRlX3Bvb2w7CisJCXBvb2xzW2ldID0gcG9vbDsKKwl9CisJcmV0dXJuIDA7CisKK2Vycl9jcmVhdGVfcG9vbDoKKwlpb25fc3lzdGVtX2hlYXBfZGVzdHJveV9wb29scyhwb29scyk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKIHN0cnVjdCBpb25faGVhcCAqaW9uX3N5c3RlbV9oZWFwX2NyZWF0ZShzdHJ1Y3QgaW9uX3BsYXRmb3JtX2hlYXAgKnVudXNlZCkKIHsKIAlzdHJ1Y3QgaW9uX3N5c3RlbV9oZWFwICpoZWFwOwotCWludCBpOwogCi0JaGVhcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpb25fc3lzdGVtX2hlYXApICsKLQkJCXNpemVvZihzdHJ1Y3QgaW9uX3BhZ2VfcG9vbCAqKSAqIG51bV9vcmRlcnMsCi0JCQlHRlBfS0VSTkVMKTsKKwloZWFwID0ga3phbGxvYyhzaXplb2YoKmhlYXApLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWhlYXApCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCWhlYXAtPmhlYXAub3BzID0gJnN5c3RlbV9oZWFwX29wczsKIAloZWFwLT5oZWFwLnR5cGUgPSBJT05fSEVBUF9UWVBFX1NZU1RFTTsKIAloZWFwLT5oZWFwLmZsYWdzID0gSU9OX0hFQVBfRkxBR19ERUZFUl9GUkVFOwogCi0JZm9yIChpID0gMDsgaSA8IG51bV9vcmRlcnM7IGkrKykgewotCQlzdHJ1Y3QgaW9uX3BhZ2VfcG9vbCAqcG9vbDsKLQkJZ2ZwX3QgZ2ZwX2ZsYWdzID0gbG93X29yZGVyX2dmcF9mbGFnczsKKwlpZiAoaW9uX3N5c3RlbV9oZWFwX2NyZWF0ZV9wb29scyhoZWFwLT51bmNhY2hlZF9wb29scywgZmFsc2UpKQorCQlnb3RvIGZyZWVfaGVhcDsKIAotCQlpZiAob3JkZXJzW2ldID4gNCkKLQkJCWdmcF9mbGFncyA9IGhpZ2hfb3JkZXJfZ2ZwX2ZsYWdzOwotCQlwb29sID0gaW9uX3BhZ2VfcG9vbF9jcmVhdGUoZ2ZwX2ZsYWdzLCBvcmRlcnNbaV0pOwotCQlpZiAoIXBvb2wpCi0JCQlnb3RvIGRlc3Ryb3lfcG9vbHM7Ci0JCWhlYXAtPnBvb2xzW2ldID0gcG9vbDsKLQl9CisJaWYgKGlvbl9zeXN0ZW1faGVhcF9jcmVhdGVfcG9vbHMoaGVhcC0+Y2FjaGVkX3Bvb2xzLCB0cnVlKSkKKwkJZ290byBkZXN0cm95X3VuY2FjaGVkX3Bvb2xzOwogCiAJaGVhcC0+aGVhcC5kZWJ1Z19zaG93ID0gaW9uX3N5c3RlbV9oZWFwX2RlYnVnX3Nob3c7CiAJcmV0dXJuICZoZWFwLT5oZWFwOwogCi1kZXN0cm95X3Bvb2xzOgotCXdoaWxlIChpLS0pCi0JCWlvbl9wYWdlX3Bvb2xfZGVzdHJveShoZWFwLT5wb29sc1tpXSk7CitkZXN0cm95X3VuY2FjaGVkX3Bvb2xzOgorCWlvbl9zeXN0ZW1faGVhcF9kZXN0cm95X3Bvb2xzKGhlYXAtPnVuY2FjaGVkX3Bvb2xzKTsKKworZnJlZV9oZWFwOgogCWtmcmVlKGhlYXApOwogCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogfQpAQCAtMzE2LDggKzM2MiwxMCBAQAogCQkJCQkJCWhlYXApOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IG51bV9vcmRlcnM7IGkrKykKLQkJaW9uX3BhZ2VfcG9vbF9kZXN0cm95KHN5c19oZWFwLT5wb29sc1tpXSk7CisJZm9yIChpID0gMDsgaSA8IE5VTV9PUkRFUlM7IGkrKykgeworCQlpb25fcGFnZV9wb29sX2Rlc3Ryb3koc3lzX2hlYXAtPnVuY2FjaGVkX3Bvb2xzW2ldKTsKKwkJaW9uX3BhZ2VfcG9vbF9kZXN0cm95KHN5c19oZWFwLT5jYWNoZWRfcG9vbHNbaV0pOworCX0KIAlrZnJlZShzeXNfaGVhcCk7CiB9CiAKQEAgLTM1OCw3ICs0MDYsNyBAQAogCiAJc2dfc2V0X3BhZ2UodGFibGUtPnNnbCwgcGFnZSwgbGVuLCAwKTsKIAotCWJ1ZmZlci0+cHJpdl92aXJ0ID0gdGFibGU7CisJYnVmZmVyLT5zZ190YWJsZSA9IHRhYmxlOwogCiAJaW9uX3BhZ2VzX3N5bmNfZm9yX2RldmljZShOVUxMLCBwYWdlLCBsZW4sIERNQV9CSURJUkVDVElPTkFMKTsKIApAQCAtMzc1LDcgKzQyMyw3IEBACiAKIHN0YXRpYyB2b2lkIGlvbl9zeXN0ZW1fY29udGlnX2hlYXBfZnJlZShzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyKQogewotCXN0cnVjdCBzZ190YWJsZSAqdGFibGUgPSBidWZmZXItPnByaXZfdmlydDsKKwlzdHJ1Y3Qgc2dfdGFibGUgKnRhYmxlID0gYnVmZmVyLT5zZ190YWJsZTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHNnX3BhZ2UodGFibGUtPnNnbCk7CiAJdW5zaWduZWQgbG9uZyBwYWdlcyA9IFBBR0VfQUxJR04oYnVmZmVyLT5zaXplKSA+PiBQQUdFX1NISUZUOwogCXVuc2lnbmVkIGxvbmcgaTsKQEAgLTM4NiwzNCArNDM0LDkgQEAKIAlrZnJlZSh0YWJsZSk7CiB9CiAKLXN0YXRpYyBpbnQgaW9uX3N5c3RlbV9jb250aWdfaGVhcF9waHlzKHN0cnVjdCBpb25faGVhcCAqaGVhcCwKLQkJCQkgICAgICAgc3RydWN0IGlvbl9idWZmZXIgKmJ1ZmZlciwKLQkJCQkgICAgICAgaW9uX3BoeXNfYWRkcl90ICphZGRyLCBzaXplX3QgKmxlbikKLXsKLQlzdHJ1Y3Qgc2dfdGFibGUgKnRhYmxlID0gYnVmZmVyLT5wcml2X3ZpcnQ7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSBzZ19wYWdlKHRhYmxlLT5zZ2wpOwotCSphZGRyID0gcGFnZV90b19waHlzKHBhZ2UpOwotCSpsZW4gPSBidWZmZXItPnNpemU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2dfdGFibGUgKmlvbl9zeXN0ZW1fY29udGlnX2hlYXBfbWFwX2RtYShzdHJ1Y3QgaW9uX2hlYXAgKmhlYXAsCi0JCQkJCQlzdHJ1Y3QgaW9uX2J1ZmZlciAqYnVmZmVyKQotewotCXJldHVybiBidWZmZXItPnByaXZfdmlydDsKLX0KLQotc3RhdGljIHZvaWQgaW9uX3N5c3RlbV9jb250aWdfaGVhcF91bm1hcF9kbWEoc3RydWN0IGlvbl9oZWFwICpoZWFwLAotCQkJCQkgICAgIHN0cnVjdCBpb25fYnVmZmVyICpidWZmZXIpCi17Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgaW9uX2hlYXBfb3BzIGttYWxsb2Nfb3BzID0gewogCS5hbGxvY2F0ZSA9IGlvbl9zeXN0ZW1fY29udGlnX2hlYXBfYWxsb2NhdGUsCiAJLmZyZWUgPSBpb25fc3lzdGVtX2NvbnRpZ19oZWFwX2ZyZWUsCi0JLnBoeXMgPSBpb25fc3lzdGVtX2NvbnRpZ19oZWFwX3BoeXMsCi0JLm1hcF9kbWEgPSBpb25fc3lzdGVtX2NvbnRpZ19oZWFwX21hcF9kbWEsCi0JLnVubWFwX2RtYSA9IGlvbl9zeXN0ZW1fY29udGlnX2hlYXBfdW5tYXBfZG1hLAogCS5tYXBfa2VybmVsID0gaW9uX2hlYXBfbWFwX2tlcm5lbCwKIAkudW5tYXBfa2VybmVsID0gaW9uX2hlYXBfdW5tYXBfa2VybmVsLAogCS5tYXBfdXNlciA9IGlvbl9oZWFwX21hcF91c2VyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl90ZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3Rlc3QuYwppbmRleCA1YTM5NmExLi41YWJmODMyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl90ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbl90ZXN0LmMKQEAgLTQyLDcgKzQyLDggQEAKIH07CiAKIHN0YXRpYyBpbnQgaW9uX2hhbmRsZV90ZXN0X2RtYShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkbWFfYnVmICpkbWFfYnVmLAotCQl2b2lkIF9fdXNlciAqcHRyLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgYm9vbCB3cml0ZSkKKwkJCSAgICAgICB2b2lkIF9fdXNlciAqcHRyLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKKwkJCSAgICAgICBib29sIHdyaXRlKQogewogCWludCByZXQgPSAwOwogCXN0cnVjdCBkbWFfYnVmX2F0dGFjaG1lbnQgKmF0dGFjaDsKQEAgLTk4LDcgKzk5LDcgQEAKIH0KIAogc3RhdGljIGludCBpb25faGFuZGxlX3Rlc3Rfa2VybmVsKHN0cnVjdCBkbWFfYnVmICpkbWFfYnVmLCB2b2lkIF9fdXNlciAqcHRyLAotCQlzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgYm9vbCB3cml0ZSkKKwkJCQkgIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBib29sIHdyaXRlKQogewogCWludCByZXQ7CiAJdW5zaWduZWQgbG9uZyBwYWdlX29mZnNldCA9IG9mZnNldCA+PiBQQUdFX1NISUZUOwpAQCAtMTQ0LDcgKzE0NSw3IEBACiB9CiAKIHN0YXRpYyBsb25nIGlvbl90ZXN0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJCQkJdW5zaWduZWQgbG9uZyBhcmcpCisJCQkgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3QgaW9uX3Rlc3RfZGF0YSAqdGVzdF9kYXRhID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCWludCByZXQgPSAwOwpAQCAtMTc5LDE3ICsxODAsMTkgQEAKIAljYXNlIElPTl9JT0NfVEVTVF9ETUFfTUFQUElORzoKIAl7CiAJCXJldCA9IGlvbl9oYW5kbGVfdGVzdF9kbWEodGVzdF9kYXRhLT5kZXYsIHRlc3RfZGF0YS0+ZG1hX2J1ZiwKLQkJCQkJdTY0X3RvX3VwdHIoZGF0YS50ZXN0X3J3LnB0ciksCi0JCQkJCWRhdGEudGVzdF9ydy5vZmZzZXQsIGRhdGEudGVzdF9ydy5zaXplLAotCQkJCQlkYXRhLnRlc3Rfcncud3JpdGUpOworCQkJCQkgIHU2NF90b191cHRyKGRhdGEudGVzdF9ydy5wdHIpLAorCQkJCQkgIGRhdGEudGVzdF9ydy5vZmZzZXQsCisJCQkJCSAgZGF0YS50ZXN0X3J3LnNpemUsCisJCQkJCSAgZGF0YS50ZXN0X3J3LndyaXRlKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgSU9OX0lPQ19URVNUX0tFUk5FTF9NQVBQSU5HOgogCXsKIAkJcmV0ID0gaW9uX2hhbmRsZV90ZXN0X2tlcm5lbCh0ZXN0X2RhdGEtPmRtYV9idWYsCi0JCQkJCXU2NF90b191cHRyKGRhdGEudGVzdF9ydy5wdHIpLAotCQkJCQlkYXRhLnRlc3Rfcncub2Zmc2V0LCBkYXRhLnRlc3Rfcncuc2l6ZSwKLQkJCQkJZGF0YS50ZXN0X3J3LndyaXRlKTsKKwkJCQkJICAgICB1NjRfdG9fdXB0cihkYXRhLnRlc3RfcncucHRyKSwKKwkJCQkJICAgICBkYXRhLnRlc3Rfcncub2Zmc2V0LAorCQkJCQkgICAgIGRhdGEudGVzdF9ydy5zaXplLAorCQkJCQkgICAgIGRhdGEudGVzdF9ydy53cml0ZSk7CiAJCWJyZWFrOwogCX0KIAlkZWZhdWx0OgpAQCAtMjQyLDcgKzI0NSw3IEBACiAJc3RydWN0IGlvbl90ZXN0X2RldmljZSAqdGVzdGRldjsKIAogCXRlc3RkZXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBpb25fdGVzdF9kZXZpY2UpLAotCQkJCUdGUF9LRVJORUwpOworCQkJICAgICAgIEdGUF9LRVJORUwpOwogCWlmICghdGVzdGRldikKIAkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2xvd21lbW9yeWtpbGxlci5jIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG93bWVtb3J5a2lsbGVyLmMKaW5kZXggNDVhMWI0ZS4uZWMzYjY2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG93bWVtb3J5a2lsbGVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvbG93bWVtb3J5a2lsbGVyLmMKQEAgLTkyLDggKzkyLDggQEAKIAlpbnQgYXJyYXlfc2l6ZSA9IEFSUkFZX1NJWkUobG93bWVtX2Fkaik7CiAJaW50IG90aGVyX2ZyZWUgPSBnbG9iYWxfcGFnZV9zdGF0ZShOUl9GUkVFX1BBR0VTKSAtIHRvdGFscmVzZXJ2ZV9wYWdlczsKIAlpbnQgb3RoZXJfZmlsZSA9IGdsb2JhbF9ub2RlX3BhZ2Vfc3RhdGUoTlJfRklMRV9QQUdFUykgLQotCQkJCQkJZ2xvYmFsX25vZGVfcGFnZV9zdGF0ZShOUl9TSE1FTSkgLQotCQkJCQkJdG90YWxfc3dhcGNhY2hlX3BhZ2VzKCk7CisJCQkJZ2xvYmFsX25vZGVfcGFnZV9zdGF0ZShOUl9TSE1FTSkgLQorCQkJCXRvdGFsX3N3YXBjYWNoZV9wYWdlcygpOwogCiAJaWYgKGxvd21lbV9hZGpfc2l6ZSA8IGFycmF5X3NpemUpCiAJCWFycmF5X3NpemUgPSBsb3dtZW1fYWRqX3NpemU7CkBAIC0yMDQsMTAgKzIwNCw5IEBACiAgKiBub3QgcmVhbGx5IG1vZHVsYXIsIGJ1dCB0aGUgZWFzaWVzdCB3YXkgdG8ga2VlcCBjb21wYXQgd2l0aCBleGlzdGluZwogICogYm9vdGFyZ3MgYmVoYXZpb3VyIGlzIHRvIGNvbnRpbnVlIHVzaW5nIG1vZHVsZV9wYXJhbSBoZXJlLgogICovCi1tb2R1bGVfcGFyYW1fbmFtZWQoY29zdCwgbG93bWVtX3Nocmlua2VyLnNlZWtzLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKLW1vZHVsZV9wYXJhbV9hcnJheV9uYW1lZChhZGosIGxvd21lbV9hZGosIHNob3J0LCAmbG93bWVtX2Fkal9zaXplLAotCQkJIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbV9uYW1lZChjb3N0LCBsb3dtZW1fc2hyaW5rZXIuc2Vla3MsIGludCwgMDY0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXlfbmFtZWQoYWRqLCBsb3dtZW1fYWRqLCBzaG9ydCwgJmxvd21lbV9hZGpfc2l6ZSwgMDY0NCk7CiBtb2R1bGVfcGFyYW1fYXJyYXlfbmFtZWQobWluZnJlZSwgbG93bWVtX21pbmZyZWUsIHVpbnQsICZsb3dtZW1fbWluZnJlZV9zaXplLAotCQkJIFNfSVJVR08gfCBTX0lXVVNSKTsKLW1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1Z19sZXZlbCwgbG93bWVtX2RlYnVnX2xldmVsLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7CisJCQkgMDY0NCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWdfbGV2ZWwsIGxvd21lbV9kZWJ1Z19sZXZlbCwgdWludCwgMDY0NCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3N3X3N5bmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3N3X3N5bmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1YzkxNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9zd19zeW5jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoKLSAqIGRyaXZlcnMvZG1hLWJ1Zi9zd19zeW5jLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlLCBJbmMuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc3luY19maWxlLmg+Ci0KLSNpbmNsdWRlICJzeW5jX2RlYnVnLmgiCi0KLSNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwotI2luY2x1ZGUgInRyYWNlL3N5bmMuaCIKLQotc3RydWN0IHN3X3N5bmNfY3JlYXRlX2ZlbmNlX2RhdGEgewotCV9fdTMyCXZhbHVlOwotCWNoYXIJbmFtZVszMl07Ci0JX19zMzIJZmVuY2U7IC8qIGZkIG9mIG5ldyBmZW5jZSAqLwotfTsKLQotI2RlZmluZSBTV19TWU5DX0lPQ19NQUdJQwknVycKLQotI2RlZmluZSBTV19TWU5DX0lPQ19DUkVBVEVfRkVOQ0UJX0lPV1IoU1dfU1lOQ19JT0NfTUFHSUMsIDAsXAotCQlzdHJ1Y3Qgc3dfc3luY19jcmVhdGVfZmVuY2VfZGF0YSkKLSNkZWZpbmUgU1dfU1lOQ19JT0NfSU5DCQkJX0lPVyhTV19TWU5DX0lPQ19NQUdJQywgMSwgX191MzIpCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmVuY2Vfb3BzIHRpbWVsaW5lX2ZlbmNlX29wczsKLQotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3luY19wdCAqZmVuY2VfdG9fc3luY19wdChzdHJ1Y3QgZmVuY2UgKmZlbmNlKQotewotCWlmIChmZW5jZS0+b3BzICE9ICZ0aW1lbGluZV9mZW5jZV9vcHMpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBjb250YWluZXJfb2YoZmVuY2UsIHN0cnVjdCBzeW5jX3B0LCBiYXNlKTsKLX0KLQotLyoqCi0gKiBzeW5jX3RpbWVsaW5lX2NyZWF0ZSgpIC0gY3JlYXRlcyBhIHN5bmMgb2JqZWN0Ci0gKiBAbmFtZToJc3luY190aW1lbGluZSBuYW1lCi0gKgotICogQ3JlYXRlcyBhIG5ldyBzeW5jX3RpbWVsaW5lLiBSZXR1cm5zIHRoZSBzeW5jX3RpbWVsaW5lIG9iamVjdCBvciBOVUxMIGluCi0gKiBjYXNlIG9mIGVycm9yLgotICovCi1zdHJ1Y3Qgc3luY190aW1lbGluZSAqc3luY190aW1lbGluZV9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqOwotCi0Jb2JqID0ga3phbGxvYyhzaXplb2YoKm9iaiksIEdGUF9LRVJORUwpOwotCWlmICghb2JqKQotCQlyZXR1cm4gTlVMTDsKLQotCWtyZWZfaW5pdCgmb2JqLT5rcmVmKTsKLQlvYmotPmNvbnRleHQgPSBmZW5jZV9jb250ZXh0X2FsbG9jKDEpOwotCXN0cmxjcHkob2JqLT5uYW1lLCBuYW1lLCBzaXplb2Yob2JqLT5uYW1lKSk7Ci0KLQlJTklUX0xJU1RfSEVBRCgmb2JqLT5jaGlsZF9saXN0X2hlYWQpOwotCUlOSVRfTElTVF9IRUFEKCZvYmotPmFjdGl2ZV9saXN0X2hlYWQpOwotCXNwaW5fbG9ja19pbml0KCZvYmotPmNoaWxkX2xpc3RfbG9jayk7Ci0KLQlzeW5jX3RpbWVsaW5lX2RlYnVnX2FkZChvYmopOwotCi0JcmV0dXJuIG9iajsKLX0KLQotc3RhdGljIHZvaWQgc3luY190aW1lbGluZV9mcmVlKHN0cnVjdCBrcmVmICprcmVmKQotewotCXN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmogPQotCQljb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IHN5bmNfdGltZWxpbmUsIGtyZWYpOwotCi0Jc3luY190aW1lbGluZV9kZWJ1Z19yZW1vdmUob2JqKTsKLQotCWtmcmVlKG9iaik7Ci19Ci0KLXN0YXRpYyB2b2lkIHN5bmNfdGltZWxpbmVfZ2V0KHN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmopCi17Ci0Ja3JlZl9nZXQoJm9iai0+a3JlZik7Ci19Ci0KLXN0YXRpYyB2b2lkIHN5bmNfdGltZWxpbmVfcHV0KHN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmopCi17Ci0Ja3JlZl9wdXQoJm9iai0+a3JlZiwgc3luY190aW1lbGluZV9mcmVlKTsKLX0KLQotLyoqCi0gKiBzeW5jX3RpbWVsaW5lX3NpZ25hbCgpIC0gc2lnbmFsIGEgc3RhdHVzIGNoYW5nZSBvbiBhIHN5bmNfdGltZWxpbmUKLSAqIEBvYmo6CXN5bmNfdGltZWxpbmUgdG8gc2lnbmFsCi0gKiBAaW5jOgludW0gdG8gaW5jcmVtZW50IG9uIHRpbWVsaW5lLT52YWx1ZQotICoKLSAqIEEgc3luYyBpbXBsZW1lbnRhdGlvbiBzaG91bGQgY2FsbCB0aGlzIGFueSB0aW1lIG9uZSBvZiBpdCdzIGZlbmNlcwotICogaGFzIHNpZ25hbGVkIG9yIGhhcyBhbiBlcnJvciBjb25kaXRpb24uCi0gKi8KLXN0YXRpYyB2b2lkIHN5bmNfdGltZWxpbmVfc2lnbmFsKHN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmosIHVuc2lnbmVkIGludCBpbmMpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3Qgc3luY19wdCAqcHQsICpuZXh0OwotCi0JdHJhY2Vfc3luY190aW1lbGluZShvYmopOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm9iai0+Y2hpbGRfbGlzdF9sb2NrLCBmbGFncyk7Ci0KLQlvYmotPnZhbHVlICs9IGluYzsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwdCwgbmV4dCwgJm9iai0+YWN0aXZlX2xpc3RfaGVhZCwKLQkJCQkgYWN0aXZlX2xpc3QpIHsKLQkJaWYgKGZlbmNlX2lzX3NpZ25hbGVkX2xvY2tlZCgmcHQtPmJhc2UpKQotCQkJbGlzdF9kZWxfaW5pdCgmcHQtPmFjdGl2ZV9saXN0KTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvYmotPmNoaWxkX2xpc3RfbG9jaywgZmxhZ3MpOwotfQotCi0vKioKLSAqIHN5bmNfcHRfY3JlYXRlKCkgLSBjcmVhdGVzIGEgc3luYyBwdAotICogQHBhcmVudDoJZmVuY2UncyBwYXJlbnQgc3luY190aW1lbGluZQotICogQHNpemU6CXNpemUgdG8gYWxsb2NhdGUgZm9yIHRoaXMgcHQKLSAqIEBpbmM6CXZhbHVlIG9mIHRoZSBmZW5jZQotICoKLSAqIENyZWF0ZXMgYSBuZXcgc3luY19wdCBhcyBhIGNoaWxkIG9mIEBwYXJlbnQuICBAc2l6ZSBieXRlcyB3aWxsIGJlCi0gKiBhbGxvY2F0ZWQgYWxsb3dpbmcgZm9yIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGRhdGEgdG8gYmUga2VwdCBhZnRlcgotICogdGhlIGdlbmVyaWMgc3luY190aW1lbGluZSBzdHJ1Y3QuIFJldHVybnMgdGhlIHN5bmNfcHQgb2JqZWN0IG9yCi0gKiBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgc3luY19wdCAqc3luY19wdF9jcmVhdGUoc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaiwgaW50IHNpemUsCi0JCQkgICAgIHVuc2lnbmVkIGludCB2YWx1ZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBzeW5jX3B0ICpwdDsKLQotCWlmIChzaXplIDwgc2l6ZW9mKCpwdCkpCi0JCXJldHVybiBOVUxMOwotCi0JcHQgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwotCWlmICghcHQpCi0JCXJldHVybiBOVUxMOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm9iai0+Y2hpbGRfbGlzdF9sb2NrLCBmbGFncyk7Ci0Jc3luY190aW1lbGluZV9nZXQob2JqKTsKLQlmZW5jZV9pbml0KCZwdC0+YmFzZSwgJnRpbWVsaW5lX2ZlbmNlX29wcywgJm9iai0+Y2hpbGRfbGlzdF9sb2NrLAotCQkgICBvYmotPmNvbnRleHQsIHZhbHVlKTsKLQlsaXN0X2FkZF90YWlsKCZwdC0+Y2hpbGRfbGlzdCwgJm9iai0+Y2hpbGRfbGlzdF9oZWFkKTsKLQlJTklUX0xJU1RfSEVBRCgmcHQtPmFjdGl2ZV9saXN0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvYmotPmNoaWxkX2xpc3RfbG9jaywgZmxhZ3MpOwotCXJldHVybiBwdDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnRpbWVsaW5lX2ZlbmNlX2dldF9kcml2ZXJfbmFtZShzdHJ1Y3QgZmVuY2UgKmZlbmNlKQotewotCXJldHVybiAic3dfc3luYyI7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICp0aW1lbGluZV9mZW5jZV9nZXRfdGltZWxpbmVfbmFtZShzdHJ1Y3QgZmVuY2UgKmZlbmNlKQotewotCXN0cnVjdCBzeW5jX3RpbWVsaW5lICpwYXJlbnQgPSBmZW5jZV9wYXJlbnQoZmVuY2UpOwotCi0JcmV0dXJuIHBhcmVudC0+bmFtZTsKLX0KLQotc3RhdGljIHZvaWQgdGltZWxpbmVfZmVuY2VfcmVsZWFzZShzdHJ1Y3QgZmVuY2UgKmZlbmNlKQotewotCXN0cnVjdCBzeW5jX3B0ICpwdCA9IGZlbmNlX3RvX3N5bmNfcHQoZmVuY2UpOwotCXN0cnVjdCBzeW5jX3RpbWVsaW5lICpwYXJlbnQgPSBmZW5jZV9wYXJlbnQoZmVuY2UpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZShmZW5jZS0+bG9jaywgZmxhZ3MpOwotCWxpc3RfZGVsKCZwdC0+Y2hpbGRfbGlzdCk7Ci0JaWYgKFdBUk5fT05fT05DRSghbGlzdF9lbXB0eSgmcHQtPmFjdGl2ZV9saXN0KSkpCi0JCWxpc3RfZGVsKCZwdC0+YWN0aXZlX2xpc3QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoZmVuY2UtPmxvY2ssIGZsYWdzKTsKLQotCXN5bmNfdGltZWxpbmVfcHV0KHBhcmVudCk7Ci0JZmVuY2VfZnJlZShmZW5jZSk7Ci19Ci0KLXN0YXRpYyBib29sIHRpbWVsaW5lX2ZlbmNlX3NpZ25hbGVkKHN0cnVjdCBmZW5jZSAqZmVuY2UpCi17Ci0Jc3RydWN0IHN5bmNfdGltZWxpbmUgKnBhcmVudCA9IGZlbmNlX3BhcmVudChmZW5jZSk7Ci0KLQlyZXR1cm4gKGZlbmNlLT5zZXFubyA+IHBhcmVudC0+dmFsdWUpID8gZmFsc2UgOiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCB0aW1lbGluZV9mZW5jZV9lbmFibGVfc2lnbmFsaW5nKHN0cnVjdCBmZW5jZSAqZmVuY2UpCi17Ci0Jc3RydWN0IHN5bmNfcHQgKnB0ID0gZmVuY2VfdG9fc3luY19wdChmZW5jZSk7Ci0Jc3RydWN0IHN5bmNfdGltZWxpbmUgKnBhcmVudCA9IGZlbmNlX3BhcmVudChmZW5jZSk7Ci0KLQlpZiAodGltZWxpbmVfZmVuY2Vfc2lnbmFsZWQoZmVuY2UpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlsaXN0X2FkZF90YWlsKCZwdC0+YWN0aXZlX2xpc3QsICZwYXJlbnQtPmFjdGl2ZV9saXN0X2hlYWQpOwotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCB0aW1lbGluZV9mZW5jZV92YWx1ZV9zdHIoc3RydWN0IGZlbmNlICpmZW5jZSwKLQkJCQkgICAgY2hhciAqc3RyLCBpbnQgc2l6ZSkKLXsKLQlzbnByaW50ZihzdHIsIHNpemUsICIlZCIsIGZlbmNlLT5zZXFubyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHRpbWVsaW5lX2ZlbmNlX3RpbWVsaW5lX3ZhbHVlX3N0cihzdHJ1Y3QgZmVuY2UgKmZlbmNlLAotCQkJCQkgICAgIGNoYXIgKnN0ciwgaW50IHNpemUpCi17Ci0Jc3RydWN0IHN5bmNfdGltZWxpbmUgKnBhcmVudCA9IGZlbmNlX3BhcmVudChmZW5jZSk7Ci0KLQlzbnByaW50ZihzdHIsIHNpemUsICIlZCIsIHBhcmVudC0+dmFsdWUpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZlbmNlX29wcyB0aW1lbGluZV9mZW5jZV9vcHMgPSB7Ci0JLmdldF9kcml2ZXJfbmFtZSA9IHRpbWVsaW5lX2ZlbmNlX2dldF9kcml2ZXJfbmFtZSwKLQkuZ2V0X3RpbWVsaW5lX25hbWUgPSB0aW1lbGluZV9mZW5jZV9nZXRfdGltZWxpbmVfbmFtZSwKLQkuZW5hYmxlX3NpZ25hbGluZyA9IHRpbWVsaW5lX2ZlbmNlX2VuYWJsZV9zaWduYWxpbmcsCi0JLnNpZ25hbGVkID0gdGltZWxpbmVfZmVuY2Vfc2lnbmFsZWQsCi0JLndhaXQgPSBmZW5jZV9kZWZhdWx0X3dhaXQsCi0JLnJlbGVhc2UgPSB0aW1lbGluZV9mZW5jZV9yZWxlYXNlLAotCS5mZW5jZV92YWx1ZV9zdHIgPSB0aW1lbGluZV9mZW5jZV92YWx1ZV9zdHIsCi0JLnRpbWVsaW5lX3ZhbHVlX3N0ciA9IHRpbWVsaW5lX2ZlbmNlX3RpbWVsaW5lX3ZhbHVlX3N0ciwKLX07Ci0KLS8qCi0gKiAqV0FSTklORyoKLSAqCi0gKiBpbXByb3BlciB1c2Ugb2YgdGhpcyBjYW4gcmVzdWx0IGluIGRlYWRsb2NraW5nIGtlcm5lbCBkcml2ZXJzIGZyb20gdXNlcnNwYWNlLgotICovCi0KLS8qIG9wZW5pbmcgc3dfc3luYyBjcmVhdGUgYSBuZXcgc3luYyBvYmogKi8KLXN0YXRpYyBpbnQgc3dfc3luY19kZWJ1Z2ZzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iajsKLQljaGFyIHRhc2tfY29tbVtUQVNLX0NPTU1fTEVOXTsKLQotCWdldF90YXNrX2NvbW0odGFza19jb21tLCBjdXJyZW50KTsKLQotCW9iaiA9IHN5bmNfdGltZWxpbmVfY3JlYXRlKHRhc2tfY29tbSk7Ci0JaWYgKCFvYmopCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gb2JqOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3dfc3luY19kZWJ1Z2ZzX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCXNtcF93bWIoKTsKLQotCXN5bmNfdGltZWxpbmVfcHV0KG9iaik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nIHN3X3N5bmNfaW9jdGxfY3JlYXRlX2ZlbmNlKHN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmosCi0JCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCWludCBmZCA9IGdldF91bnVzZWRfZmRfZmxhZ3MoT19DTE9FWEVDKTsKLQlpbnQgZXJyOwotCXN0cnVjdCBzeW5jX3B0ICpwdDsKLQlzdHJ1Y3Qgc3luY19maWxlICpzeW5jX2ZpbGU7Ci0Jc3RydWN0IHN3X3N5bmNfY3JlYXRlX2ZlbmNlX2RhdGEgZGF0YTsKLQotCWlmIChmZCA8IDApCi0JCXJldHVybiBmZDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmZGF0YSwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoZGF0YSkpKSB7Ci0JCWVyciA9IC1FRkFVTFQ7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXB0ID0gc3luY19wdF9jcmVhdGUob2JqLCBzaXplb2YoKnB0KSwgZGF0YS52YWx1ZSk7Ci0JaWYgKCFwdCkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlzeW5jX2ZpbGUgPSBzeW5jX2ZpbGVfY3JlYXRlKCZwdC0+YmFzZSk7Ci0JaWYgKCFzeW5jX2ZpbGUpIHsKLQkJZmVuY2VfcHV0KCZwdC0+YmFzZSk7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyOwotCX0KLQotCWRhdGEuZmVuY2UgPSBmZDsKLQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmRhdGEsIHNpemVvZihkYXRhKSkpIHsKLQkJZnB1dChzeW5jX2ZpbGUtPmZpbGUpOwotCQllcnIgPSAtRUZBVUxUOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlmZF9pbnN0YWxsKGZkLCBzeW5jX2ZpbGUtPmZpbGUpOwotCi0JcmV0dXJuIDA7Ci0KLWVycjoKLQlwdXRfdW51c2VkX2ZkKGZkKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgbG9uZyBzd19zeW5jX2lvY3RsX2luYyhzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQl1MzIgdmFsdWU7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbHVlLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZih2YWx1ZSkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXN5bmNfdGltZWxpbmVfc2lnbmFsKG9iaiwgdmFsdWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nIHN3X3N5bmNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmogPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU1dfU1lOQ19JT0NfQ1JFQVRFX0ZFTkNFOgotCQlyZXR1cm4gc3dfc3luY19pb2N0bF9jcmVhdGVfZmVuY2Uob2JqLCBhcmcpOwotCi0JY2FzZSBTV19TWU5DX0lPQ19JTkM6Ci0JCXJldHVybiBzd19zeW5jX2lvY3RsX2luYyhvYmosIGFyZyk7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOT1RUWTsKLQl9Ci19Ci0KLWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3dfc3luY19kZWJ1Z2ZzX2ZvcHMgPSB7Ci0JLm9wZW4gICAgICAgICAgID0gc3dfc3luY19kZWJ1Z2ZzX29wZW4sCi0JLnJlbGVhc2UgICAgICAgID0gc3dfc3luY19kZWJ1Z2ZzX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsID0gc3dfc3luY19pb2N0bCwKLQkuY29tcGF0X2lvY3RsCT0gc3dfc3luY19pb2N0bCwKLX07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9zeW5jX2RlYnVnLmMgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9zeW5jX2RlYnVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNWE4NTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvc3luY19kZWJ1Zy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qCi0gKiBkcml2ZXJzL2Jhc2Uvc3luYy5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSwgSW5jLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSAic3luY19kZWJ1Zy5oIgotCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqZGJnZnM7Ci0KLXN0YXRpYyBMSVNUX0hFQUQoc3luY190aW1lbGluZV9saXN0X2hlYWQpOwotc3RhdGljIERFRklORV9TUElOTE9DSyhzeW5jX3RpbWVsaW5lX2xpc3RfbG9jayk7Ci1zdGF0aWMgTElTVF9IRUFEKHN5bmNfZmlsZV9saXN0X2hlYWQpOwotc3RhdGljIERFRklORV9TUElOTE9DSyhzeW5jX2ZpbGVfbGlzdF9sb2NrKTsKLQotdm9pZCBzeW5jX3RpbWVsaW5lX2RlYnVnX2FkZChzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3luY190aW1lbGluZV9saXN0X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZvYmotPnN5bmNfdGltZWxpbmVfbGlzdCwgJnN5bmNfdGltZWxpbmVfbGlzdF9oZWFkKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzeW5jX3RpbWVsaW5lX2xpc3RfbG9jaywgZmxhZ3MpOwotfQotCi12b2lkIHN5bmNfdGltZWxpbmVfZGVidWdfcmVtb3ZlKHN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmopCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzeW5jX3RpbWVsaW5lX2xpc3RfbG9jaywgZmxhZ3MpOwotCWxpc3RfZGVsKCZvYmotPnN5bmNfdGltZWxpbmVfbGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3luY190aW1lbGluZV9saXN0X2xvY2ssIGZsYWdzKTsKLX0KLQotdm9pZCBzeW5jX2ZpbGVfZGVidWdfYWRkKHN0cnVjdCBzeW5jX2ZpbGUgKnN5bmNfZmlsZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnN5bmNfZmlsZV9saXN0X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZzeW5jX2ZpbGUtPnN5bmNfZmlsZV9saXN0LCAmc3luY19maWxlX2xpc3RfaGVhZCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3luY19maWxlX2xpc3RfbG9jaywgZmxhZ3MpOwotfQotCi12b2lkIHN5bmNfZmlsZV9kZWJ1Z19yZW1vdmUoc3RydWN0IHN5bmNfZmlsZSAqc3luY19maWxlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3luY19maWxlX2xpc3RfbG9jaywgZmxhZ3MpOwotCWxpc3RfZGVsKCZzeW5jX2ZpbGUtPnN5bmNfZmlsZV9saXN0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzeW5jX2ZpbGVfbGlzdF9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzeW5jX3N0YXR1c19zdHIoaW50IHN0YXR1cykKLXsKLQlpZiAoc3RhdHVzID09IDApCi0JCXJldHVybiAic2lnbmFsZWQiOwotCi0JaWYgKHN0YXR1cyA+IDApCi0JCXJldHVybiAiYWN0aXZlIjsKLQotCXJldHVybiAiZXJyb3IiOwotfQotCi1zdGF0aWMgdm9pZCBzeW5jX3ByaW50X2ZlbmNlKHN0cnVjdCBzZXFfZmlsZSAqcywgc3RydWN0IGZlbmNlICpmZW5jZSwgYm9vbCBzaG93KQotewotCWludCBzdGF0dXMgPSAxOwotCXN0cnVjdCBzeW5jX3RpbWVsaW5lICpwYXJlbnQgPSBmZW5jZV9wYXJlbnQoZmVuY2UpOwotCi0JaWYgKGZlbmNlX2lzX3NpZ25hbGVkX2xvY2tlZChmZW5jZSkpCi0JCXN0YXR1cyA9IGZlbmNlLT5zdGF0dXM7Ci0KLQlzZXFfcHJpbnRmKHMsICIgICVzJXNmZW5jZSAlcyIsCi0JCSAgIHNob3cgPyBwYXJlbnQtPm5hbWUgOiAiIiwKLQkJICAgc2hvdyA/ICJfIiA6ICIiLAotCQkgICBzeW5jX3N0YXR1c19zdHIoc3RhdHVzKSk7Ci0KLQlpZiAoc3RhdHVzIDw9IDApIHsKLQkJc3RydWN0IHRpbWVzcGVjNjQgdHM2NCA9Ci0JCQlrdGltZV90b190aW1lc3BlYzY0KGZlbmNlLT50aW1lc3RhbXApOwotCi0JCXNlcV9wcmludGYocywgIkAlbGxkLiUwOWxkIiwgKHM2NCl0czY0LnR2X3NlYywgdHM2NC50dl9uc2VjKTsKLQl9Ci0KLQlpZiAoZmVuY2UtPm9wcy0+dGltZWxpbmVfdmFsdWVfc3RyICYmCi0JCWZlbmNlLT5vcHMtPmZlbmNlX3ZhbHVlX3N0cikgewotCQljaGFyIHZhbHVlWzY0XTsKLQkJYm9vbCBzdWNjZXNzOwotCi0JCWZlbmNlLT5vcHMtPmZlbmNlX3ZhbHVlX3N0cihmZW5jZSwgdmFsdWUsIHNpemVvZih2YWx1ZSkpOwotCQlzdWNjZXNzID0gc3RybGVuKHZhbHVlKTsKLQotCQlpZiAoc3VjY2VzcykgewotCQkJc2VxX3ByaW50ZihzLCAiOiAlcyIsIHZhbHVlKTsKLQotCQkJZmVuY2UtPm9wcy0+dGltZWxpbmVfdmFsdWVfc3RyKGZlbmNlLCB2YWx1ZSwKLQkJCQkJCSAgICAgICBzaXplb2YodmFsdWUpKTsKLQotCQkJaWYgKHN0cmxlbih2YWx1ZSkpCi0JCQkJc2VxX3ByaW50ZihzLCAiIC8gJXMiLCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlzZXFfcHV0cyhzLCAiXG4iKTsKLX0KLQotc3RhdGljIHZvaWQgc3luY19wcmludF9vYmooc3RydWN0IHNlcV9maWxlICpzLCBzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc2VxX3ByaW50ZihzLCAiJXM6ICVkXG4iLCBvYmotPm5hbWUsIG9iai0+dmFsdWUpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm9iai0+Y2hpbGRfbGlzdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaChwb3MsICZvYmotPmNoaWxkX2xpc3RfaGVhZCkgewotCQlzdHJ1Y3Qgc3luY19wdCAqcHQgPQotCQkJY29udGFpbmVyX29mKHBvcywgc3RydWN0IHN5bmNfcHQsIGNoaWxkX2xpc3QpOwotCQlzeW5jX3ByaW50X2ZlbmNlKHMsICZwdC0+YmFzZSwgZmFsc2UpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvYmotPmNoaWxkX2xpc3RfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBzeW5jX3ByaW50X3N5bmNfZmlsZShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCi0JCQkJICBzdHJ1Y3Qgc3luY19maWxlICpzeW5jX2ZpbGUpCi17Ci0JaW50IGk7Ci0KLQlzZXFfcHJpbnRmKHMsICJbJXBdICVzOiAlc1xuIiwgc3luY19maWxlLCBzeW5jX2ZpbGUtPm5hbWUsCi0JCSAgIHN5bmNfc3RhdHVzX3N0cihhdG9taWNfcmVhZCgmc3luY19maWxlLT5zdGF0dXMpKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc3luY19maWxlLT5udW1fZmVuY2VzOyArK2kpCi0JCXN5bmNfcHJpbnRfZmVuY2Uocywgc3luY19maWxlLT5jYnNbaV0uZmVuY2UsIHRydWUpOwotfQotCi1zdGF0aWMgaW50IHN5bmNfZGVidWdmc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdW51c2VkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcG9zOwotCi0Jc2VxX3B1dHMocywgIm9ianM6XG4tLS0tLS0tLS0tLS0tLVxuIik7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3luY190aW1lbGluZV9saXN0X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoKHBvcywgJnN5bmNfdGltZWxpbmVfbGlzdF9oZWFkKSB7Ci0JCXN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmogPQotCQkJY29udGFpbmVyX29mKHBvcywgc3RydWN0IHN5bmNfdGltZWxpbmUsCi0JCQkJICAgICBzeW5jX3RpbWVsaW5lX2xpc3QpOwotCi0JCXN5bmNfcHJpbnRfb2JqKHMsIG9iaik7Ci0JCXNlcV9wdXRzKHMsICJcbiIpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzeW5jX3RpbWVsaW5lX2xpc3RfbG9jaywgZmxhZ3MpOwotCi0Jc2VxX3B1dHMocywgImZlbmNlczpcbi0tLS0tLS0tLS0tLS0tXG4iKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzeW5jX2ZpbGVfbGlzdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaChwb3MsICZzeW5jX2ZpbGVfbGlzdF9oZWFkKSB7Ci0JCXN0cnVjdCBzeW5jX2ZpbGUgKnN5bmNfZmlsZSA9Ci0JCQljb250YWluZXJfb2YocG9zLCBzdHJ1Y3Qgc3luY19maWxlLCBzeW5jX2ZpbGVfbGlzdCk7Ci0KLQkJc3luY19wcmludF9zeW5jX2ZpbGUocywgc3luY19maWxlKTsKLQkJc2VxX3B1dHMocywgIlxuIik7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN5bmNfZmlsZV9saXN0X2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzeW5jX2luZm9fZGVidWdmc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzeW5jX2RlYnVnZnNfc2hvdywgaW5vZGUtPmlfcHJpdmF0ZSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN5bmNfaW5mb19kZWJ1Z2ZzX2ZvcHMgPSB7Ci0JLm9wZW4gICAgICAgICAgID0gc3luY19pbmZvX2RlYnVnZnNfb3BlbiwKLQkucmVhZCAgICAgICAgICAgPSBzZXFfcmVhZCwKLQkubGxzZWVrICAgICAgICAgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgICAgICAgID0gc2luZ2xlX3JlbGVhc2UsCi19OwotCi1zdGF0aWMgX19pbml0IGludCBzeW5jX2RlYnVnZnNfaW5pdCh2b2lkKQotewotCWRiZ2ZzID0gZGVidWdmc19jcmVhdGVfZGlyKCJzeW5jIiwgTlVMTCk7Ci0KLQkvKgotCSAqIFRoZSBkZWJ1Z2ZzIGZpbGVzIHdvbid0IGV2ZXIgZ2V0IHJlbW92ZWQgYW5kIHRodXMsIHRoZXJlIGlzCi0JICogbm8gbmVlZCB0byBwcm90ZWN0IGl0IGFnYWluc3QgcmVtb3ZhbCByYWNlcy4gVGhlIHVzZSBvZgotCSAqIGRlYnVnZnNfY3JlYXRlX2ZpbGVfdW5zYWZlKCkgaXMgYWN0dWFsbHkgc2FmZSBoZXJlLgotCSAqLwotCWRlYnVnZnNfY3JlYXRlX2ZpbGVfdW5zYWZlKCJpbmZvIiwgMDQ0NCwgZGJnZnMsIE5VTEwsCi0JCQkJICAgJnN5bmNfaW5mb19kZWJ1Z2ZzX2ZvcHMpOwotCWRlYnVnZnNfY3JlYXRlX2ZpbGVfdW5zYWZlKCJzd19zeW5jIiwgMDY0NCwgZGJnZnMsIE5VTEwsCi0JCQkJICAgJnN3X3N5bmNfZGVidWdmc19mb3BzKTsKLQotCXJldHVybiAwOwotfQotbGF0ZV9pbml0Y2FsbChzeW5jX2RlYnVnZnNfaW5pdCk7Ci0KLSNkZWZpbmUgRFVNUF9DSFVOSyAyNTYKLXN0YXRpYyBjaGFyIHN5bmNfZHVtcF9idWZbNjQgKiAxMDI0XTsKLXZvaWQgc3luY19kdW1wKHZvaWQpCi17Ci0Jc3RydWN0IHNlcV9maWxlIHMgPSB7Ci0JCS5idWYgPSBzeW5jX2R1bXBfYnVmLAotCQkuc2l6ZSA9IHNpemVvZihzeW5jX2R1bXBfYnVmKSAtIDEsCi0JfTsKLQlpbnQgaTsKLQotCXN5bmNfZGVidWdmc19zaG93KCZzLCBOVUxMKTsKLQotCWZvciAoaSA9IDA7IGkgPCBzLmNvdW50OyBpICs9IERVTVBfQ0hVTkspIHsKLQkJaWYgKChzLmNvdW50IC0gaSkgPiBEVU1QX0NIVU5LKSB7Ci0JCQljaGFyIGMgPSBzLmJ1ZltpICsgRFVNUF9DSFVOS107Ci0KLQkJCXMuYnVmW2kgKyBEVU1QX0NIVU5LXSA9IDA7Ci0JCQlwcl9jb250KCIlcyIsIHMuYnVmICsgaSk7Ci0JCQlzLmJ1ZltpICsgRFVNUF9DSFVOS10gPSBjOwotCQl9IGVsc2UgewotCQkJcy5idWZbcy5jb3VudF0gPSAwOwotCQkJcHJfY29udCgiJXMiLCBzLmJ1ZiArIGkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvc3luY19kZWJ1Zy5oIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvc3luY19kZWJ1Zy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWI2NjM5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3N5bmNfZGVidWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2xpbnV4L3N5bmMuaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUsIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIF9MSU5VWF9TWU5DX0gKLSNkZWZpbmUgX0xJTlVYX1NZTkNfSAotCi0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvZmVuY2UuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3N5bmNfZmlsZS5oPgotI2luY2x1ZGUgPHVhcGkvbGludXgvc3luY19maWxlLmg+Ci0KLS8qKgotICogc3RydWN0IHN5bmNfdGltZWxpbmUgLSBzeW5jIG9iamVjdAotICogQGtyZWY6CQlyZWZlcmVuY2UgY291bnQgb24gZmVuY2UuCi0gKiBAbmFtZToJCW5hbWUgb2YgdGhlIHN5bmNfdGltZWxpbmUuIFVzZWZ1bCBmb3IgZGVidWdnaW5nCi0gKiBAY2hpbGRfbGlzdF9oZWFkOglsaXN0IG9mIGNoaWxkcmVuIHN5bmNfcHRzIGZvciB0aGlzIHN5bmNfdGltZWxpbmUKLSAqIEBjaGlsZF9saXN0X2xvY2s6CWxvY2sgcHJvdGVjdGluZyBAY2hpbGRfbGlzdF9oZWFkIGFuZCBmZW5jZS5zdGF0dXMKLSAqIEBhY3RpdmVfbGlzdF9oZWFkOglsaXN0IG9mIGFjdGl2ZSAodW5zaWduYWxlZC9lcnJvcmVkKSBzeW5jX3B0cwotICogQHN5bmNfdGltZWxpbmVfbGlzdDoJbWVtYmVyc2hpcCBpbiBnbG9iYWwgc3luY190aW1lbGluZV9saXN0Ci0gKi8KLXN0cnVjdCBzeW5jX3RpbWVsaW5lIHsKLQlzdHJ1Y3Qga3JlZgkJa3JlZjsKLQljaGFyCQkJbmFtZVszMl07Ci0KLQkvKiBwcm90ZWN0ZWQgYnkgY2hpbGRfbGlzdF9sb2NrICovCi0JdTY0CQkJY29udGV4dDsKLQlpbnQJCQl2YWx1ZTsKLQotCXN0cnVjdCBsaXN0X2hlYWQJY2hpbGRfbGlzdF9oZWFkOwotCXNwaW5sb2NrX3QJCWNoaWxkX2xpc3RfbG9jazsKLQotCXN0cnVjdCBsaXN0X2hlYWQJYWN0aXZlX2xpc3RfaGVhZDsKLQotCXN0cnVjdCBsaXN0X2hlYWQJc3luY190aW1lbGluZV9saXN0OwotfTsKLQotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3luY190aW1lbGluZSAqZmVuY2VfcGFyZW50KHN0cnVjdCBmZW5jZSAqZmVuY2UpCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihmZW5jZS0+bG9jaywgc3RydWN0IHN5bmNfdGltZWxpbmUsCi0JCQkgICAgY2hpbGRfbGlzdF9sb2NrKTsKLX0KLQotLyoqCi0gKiBzdHJ1Y3Qgc3luY19wdCAtIHN5bmNfcHQgb2JqZWN0Ci0gKiBAYmFzZTogYmFzZSBmZW5jZSBvYmplY3QKLSAqIEBjaGlsZF9saXN0OiBzeW5jIHRpbWVsaW5lIGNoaWxkJ3MgbGlzdAotICogQGFjdGl2ZV9saXN0OiBzeW5jIHRpbWVsaW5lIGFjdGl2ZSBjaGlsZCdzIGxpc3QKLSAqLwotc3RydWN0IHN5bmNfcHQgewotCXN0cnVjdCBmZW5jZSBiYXNlOwotCXN0cnVjdCBsaXN0X2hlYWQgY2hpbGRfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGFjdGl2ZV9saXN0OwotfTsKLQotI2lmZGVmIENPTkZJR19TV19TWU5DCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN3X3N5bmNfZGVidWdmc19mb3BzOwotCi12b2lkIHN5bmNfdGltZWxpbmVfZGVidWdfYWRkKHN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmopOwotdm9pZCBzeW5jX3RpbWVsaW5lX2RlYnVnX3JlbW92ZShzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqKTsKLXZvaWQgc3luY19maWxlX2RlYnVnX2FkZChzdHJ1Y3Qgc3luY19maWxlICpmZW5jZSk7Ci12b2lkIHN5bmNfZmlsZV9kZWJ1Z19yZW1vdmUoc3RydWN0IHN5bmNfZmlsZSAqZmVuY2UpOwotdm9pZCBzeW5jX2R1bXAodm9pZCk7Ci0KLSNlbHNlCi0jIGRlZmluZSBzeW5jX3RpbWVsaW5lX2RlYnVnX2FkZChvYmopCi0jIGRlZmluZSBzeW5jX3RpbWVsaW5lX2RlYnVnX3JlbW92ZShvYmopCi0jIGRlZmluZSBzeW5jX2ZpbGVfZGVidWdfYWRkKGZlbmNlKQotIyBkZWZpbmUgc3luY19maWxlX2RlYnVnX3JlbW92ZShmZW5jZSkKLSMgZGVmaW5lIHN5bmNfZHVtcCgpCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9MSU5VWF9TWU5DX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RyYWNlL3N5bmMuaCBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3RyYWNlL3N5bmMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI1Y2U5Ni4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90cmFjZS9zeW5jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jdW5kZWYgVFJBQ0VfU1lTVEVNCi0jZGVmaW5lIFRSQUNFX0lOQ0xVREVfUEFUSCAuLi8uLi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC90cmFjZQotI2RlZmluZSBUUkFDRV9TWVNURU0gc3luYwotCi0jaWYgIWRlZmluZWQoX1RSQUNFX1NZTkNfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKLSNkZWZpbmUgX1RSQUNFX1NZTkNfSAotCi0jaW5jbHVkZSAiLi4vc3luY19kZWJ1Zy5oIgotI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KLQotVFJBQ0VfRVZFTlQoc3luY190aW1lbGluZSwKLQlUUF9QUk9UTyhzdHJ1Y3Qgc3luY190aW1lbGluZSAqdGltZWxpbmUpLAotCi0JVFBfQVJHUyh0aW1lbGluZSksCi0KLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQkJX19zdHJpbmcobmFtZSwgdGltZWxpbmUtPm5hbWUpCi0JCQlfX2ZpZWxkKHUzMiwgdmFsdWUpCi0JKSwKLQotCVRQX2Zhc3RfYXNzaWduKAotCQkJX19hc3NpZ25fc3RyKG5hbWUsIHRpbWVsaW5lLT5uYW1lKTsKLQkJCV9fZW50cnktPnZhbHVlID0gdGltZWxpbmUtPnZhbHVlOwotCSksCi0KLQlUUF9wcmludGsoIm5hbWU9JXMgdmFsdWU9JWQiLCBfX2dldF9zdHIobmFtZSksIF9fZW50cnktPnZhbHVlKQotKTsKLQotI2VuZGlmIC8qIGlmICFkZWZpbmVkKF9UUkFDRV9TWU5DX0gpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpICovCi0KLS8qIFRoaXMgcGFydCBtdXN0IGJlIG91dHNpZGUgcHJvdGVjdGlvbiAqLwotI2luY2x1ZGUgPHRyYWNlL2RlZmluZV90cmFjZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdWFwaS9pb24uaCBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvaW9uLmgKaW5kZXggMGE4ZTQwZi4uMTRjZDg3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvdWFwaS9pb24uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC91YXBpL2lvbi5oCkBAIC00NCwzMiArNDQsMjYgQEAKIAkJCSAgICAgICAqIG11c3QgYmUgbGFzdCBzbyBkZXZpY2Ugc3BlY2lmaWMgaGVhcHMgYWx3YXlzCiAJCQkgICAgICAgKiBhcmUgYXQgdGhlIGVuZCBvZiB0aGlzIGVudW0KIAkJCSAgICAgICAqLwotCUlPTl9OVU1fSEVBUFMgPSAxNiwKIH07CiAKLSNkZWZpbmUgSU9OX0hFQVBfU1lTVEVNX01BU0sJCSgxIDw8IElPTl9IRUFQX1RZUEVfU1lTVEVNKQotI2RlZmluZSBJT05fSEVBUF9TWVNURU1fQ09OVElHX01BU0sJKDEgPDwgSU9OX0hFQVBfVFlQRV9TWVNURU1fQ09OVElHKQotI2RlZmluZSBJT05fSEVBUF9DQVJWRU9VVF9NQVNLCQkoMSA8PCBJT05fSEVBUF9UWVBFX0NBUlZFT1VUKQotI2RlZmluZSBJT05fSEVBUF9UWVBFX0RNQV9NQVNLCQkoMSA8PCBJT05fSEVBUF9UWVBFX0RNQSkKLQogI2RlZmluZSBJT05fTlVNX0hFQVBfSURTCQkoc2l6ZW9mKHVuc2lnbmVkIGludCkgKiA4KQogCiAvKioKICAqIGFsbG9jYXRpb24gZmxhZ3MgLSB0aGUgbG93ZXIgMTYgYml0cyBhcmUgdXNlZCBieSBjb3JlIGlvbiwgdGhlIHVwcGVyIDE2CiAgKiBiaXRzIGFyZSByZXNlcnZlZCBmb3IgdXNlIGJ5IHRoZSBoZWFwcyB0aGVtc2VsdmVzLgogICovCi0jZGVmaW5lIElPTl9GTEFHX0NBQ0hFRCAxCQkvKgotCQkJCQkgKiBtYXBwaW5ncyBvZiB0aGlzIGJ1ZmZlciBzaG91bGQgYmUKLQkJCQkJICogY2FjaGVkLCBpb24gd2lsbCBkbyBjYWNoZQotCQkJCQkgKiBtYWludGVuYW5jZSB3aGVuIHRoZSBidWZmZXIgaXMKLQkJCQkJICogbWFwcGVkIGZvciBkbWEKLQkJCQkJKi8KLSNkZWZpbmUgSU9OX0ZMQUdfQ0FDSEVEX05FRURTX1NZTkMgMgkvKgotCQkJCQkgKiBtYXBwaW5ncyBvZiB0aGlzIGJ1ZmZlciB3aWxsIGNyZWF0ZWQKLQkJCQkJICogYXQgbW1hcCB0aW1lLCBpZiB0aGlzIGlzIHNldAotCQkJCQkgKiBjYWNoZXMgbXVzdCBiZSBtYW5hZ2VkCi0JCQkJCSAqIG1hbnVhbGx5Ci0JCQkJCSAqLworCisvKgorICogbWFwcGluZ3Mgb2YgdGhpcyBidWZmZXIgc2hvdWxkIGJlIGNhY2hlZCwgaW9uIHdpbGwgZG8gY2FjaGUgbWFpbnRlbmFuY2UKKyAqIHdoZW4gdGhlIGJ1ZmZlciBpcyBtYXBwZWQgZm9yIGRtYQorICovCisjZGVmaW5lIElPTl9GTEFHX0NBQ0hFRCAxCisKKy8qCisgKiBtYXBwaW5ncyBvZiB0aGlzIGJ1ZmZlciB3aWxsIGNyZWF0ZWQgYXQgbW1hcCB0aW1lLCBpZiB0aGlzIGlzIHNldAorICogY2FjaGVzIG11c3QgYmUgbWFuYWdlZCBtYW51YWxseQorICovCisjZGVmaW5lIElPTl9GTEFHX0NBQ0hFRF9ORUVEU19TWU5DIDIKIAogLyoqCiAgKiBET0M6IElvbiBVc2Vyc3BhY2UgQVBJCkBAIC0xMzQsNiArMTI4LDM2IEBACiAJdW5zaWduZWQgbG9uZyBhcmc7CiB9OwogCisjZGVmaW5lIE1BWF9IRUFQX05BTUUJCQkzMgorCisvKioKKyAqIHN0cnVjdCBpb25faGVhcF9kYXRhIC0gZGF0YSBhYm91dCBhIGhlYXAKKyAqIEBuYW1lIC0gZmlyc3QgMzIgY2hhcmFjdGVycyBvZiB0aGUgaGVhcCBuYW1lCisgKiBAdHlwZSAtIGhlYXAgdHlwZQorICogQGhlYXBfaWQgLSBoZWFwIGlkIGZvciB0aGUgaGVhcAorICovCitzdHJ1Y3QgaW9uX2hlYXBfZGF0YSB7CisJY2hhciBuYW1lW01BWF9IRUFQX05BTUVdOworCV9fdTMyIHR5cGU7CisJX191MzIgaGVhcF9pZDsKKwlfX3UzMiByZXNlcnZlZDA7CisJX191MzIgcmVzZXJ2ZWQxOworCV9fdTMyIHJlc2VydmVkMjsKK307CisKKy8qKgorICogc3RydWN0IGlvbl9oZWFwX3F1ZXJ5IC0gY29sbGVjdGlvbiBvZiBkYXRhIGFib3V0IGFsbCBoZWFwcworICogQGNudCAtIHRvdGFsIG51bWJlciBvZiBoZWFwcyB0byBiZSBjb3BpZWQKKyAqIEBoZWFwcyAtIGJ1ZmZlciB0byBjb3B5IGhlYXAgZGF0YQorICovCitzdHJ1Y3QgaW9uX2hlYXBfcXVlcnkgeworCV9fdTMyIGNudDsgLyogVG90YWwgbnVtYmVyIG9mIGhlYXBzIHRvIGJlIGNvcGllZCAqLworCV9fdTMyIHJlc2VydmVkMDsgLyogYWxpZ24gdG8gNjRiaXRzICovCisJX191NjQgaGVhcHM7IC8qIGJ1ZmZlciB0byBiZSBwb3B1bGF0ZWQgKi8KKwlfX3UzMiByZXNlcnZlZDE7CisJX191MzIgcmVzZXJ2ZWQyOworfTsKKwogI2RlZmluZSBJT05fSU9DX01BR0lDCQknSScKIAogLyoqCkBAIC0yMDAsNCArMjI0LDEzIEBACiAgKi8KICNkZWZpbmUgSU9OX0lPQ19DVVNUT00JCV9JT1dSKElPTl9JT0NfTUFHSUMsIDYsIHN0cnVjdCBpb25fY3VzdG9tX2RhdGEpCiAKKy8qKgorICogRE9DOiBJT05fSU9DX0hFQVBfUVVFUlkgLSBpbmZvcm1hdGlvbiBhYm91dCBhdmFpbGFibGUgaGVhcHMKKyAqCisgKiBUYWtlcyBhbiBpb25faGVhcF9xdWVyeSBzdHJ1Y3R1cmUgYW5kIHBvcHVsYXRlcyBpbmZvcm1hdGlvbiBhYm91dAorICogYXZhaWxhYmxlIElvbiBoZWFwcy4KKyAqLworI2RlZmluZSBJT05fSU9DX0hFQVBfUVVFUlkgICAgIF9JT1dSKElPTl9JT0NfTUFHSUMsIDgsIFwKKwkJCQkJc3RydWN0IGlvbl9oZWFwX3F1ZXJ5KQorCiAjZW5kaWYgLyogX1VBUElfTElOVVhfSU9OX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ib2FyZC9ib2FyZC5jIGIvZHJpdmVycy9zdGFnaW5nL2JvYXJkL2JvYXJkLmMKaW5kZXggNDU4MDdkOC4uODZkYzQxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JvYXJkL2JvYXJkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JvYXJkL2JvYXJkLmMKQEAgLTE0MCw3ICsxNDAsNiBAQAogCQkJCQljb25zdCBjaGFyICpkb21haW4pCiB7CiAJc3RydWN0IG9mX3BoYW5kbGVfYXJncyBwZF9hcmdzOwotCXN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqcGQ7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKIAogCW5wID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoZG9tYWluKTsKQEAgLTE1MSwxNCArMTUwLDggQEAKIAogCXBkX2FyZ3MubnAgPSBucDsKIAlwZF9hcmdzLmFyZ3NfY291bnQgPSAwOwotCXBkID0gb2ZfZ2VucGRfZ2V0X2Zyb21fcHJvdmlkZXIoJnBkX2FyZ3MpOwotCWlmIChJU19FUlIocGQpKSB7Ci0JCXByX2VycigiQ2Fubm90IGZpbmQgZ2VucGQgJXMgKCVsZClcbiIsIGRvbWFpbiwgUFRSX0VSUihwZCkpOwotCQlyZXR1cm4gUFRSX0VSUihwZCk7Ci0JfQotCXByX2RlYnVnKCJGb3VuZCBnZW5wZCAlcyBmb3IgZGV2aWNlICVzXG4iLCBwZC0+bmFtZSwgcGRldi0+bmFtZSk7CiAKLQlyZXR1cm4gcG1fZ2VucGRfYWRkX2RldmljZShwZCwgJnBkZXYtPmRldik7CisJcmV0dXJuIG9mX2dlbnBkX2FkZF9kZXZpY2UoJnBkX2FyZ3MsICZwZGV2LT5kZXYpOwogfQogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgaW50IGJvYXJkX3N0YWdpbmdfYWRkX2Rldl9kb21haW4oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ZvcHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ZvcHMuYwppbmRleCAxOTk5ZWVkLi42NGIzOTY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfZm9wcy5jCkBAIC04MSwyMCArODEsMjAgQEAKIAkoQ09NRURJX05VTV9NSU5PUlMgLSBDT01FRElfTlVNX0JPQVJEX01JTk9SUykKIAogc3RhdGljIGludCBjb21lZGlfbnVtX2xlZ2FjeV9taW5vcnM7Ci1tb2R1bGVfcGFyYW0oY29tZWRpX251bV9sZWdhY3lfbWlub3JzLCBpbnQsIFNfSVJVR08pOworbW9kdWxlX3BhcmFtKGNvbWVkaV9udW1fbGVnYWN5X21pbm9ycywgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoY29tZWRpX251bV9sZWdhY3lfbWlub3JzLAogCQkgIm51bWJlciBvZiBjb21lZGkgbWlub3IgZGV2aWNlcyB0byByZXNlcnZlIGZvciBub24tYXV0by1jb25maWd1cmVkIGRldmljZXMgKGRlZmF1bHQgMCkiCiAJCSk7CiAKIHVuc2lnbmVkIGludCBjb21lZGlfZGVmYXVsdF9idWZfc2l6ZV9rYiA9IENPTkZJR19DT01FRElfREVGQVVMVF9CVUZfU0laRV9LQjsKLW1vZHVsZV9wYXJhbShjb21lZGlfZGVmYXVsdF9idWZfc2l6ZV9rYiwgdWludCwgU19JUlVHTyB8IFNfSVdVU1IpOworbW9kdWxlX3BhcmFtKGNvbWVkaV9kZWZhdWx0X2J1Zl9zaXplX2tiLCB1aW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoY29tZWRpX2RlZmF1bHRfYnVmX3NpemVfa2IsCiAJCSAiZGVmYXVsdCBhc3luY2hyb25vdXMgYnVmZmVyIHNpemUgaW4gS2lCIChkZWZhdWx0ICIKIAkJIF9fTU9EVUxFX1NUUklORyhDT05GSUdfQ09NRURJX0RFRkFVTFRfQlVGX1NJWkVfS0IpICIpIik7CiAKIHVuc2lnbmVkIGludCBjb21lZGlfZGVmYXVsdF9idWZfbWF4c2l6ZV9rYgogCT0gQ09ORklHX0NPTUVESV9ERUZBVUxUX0JVRl9NQVhTSVpFX0tCOwotbW9kdWxlX3BhcmFtKGNvbWVkaV9kZWZhdWx0X2J1Zl9tYXhzaXplX2tiLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW0oY29tZWRpX2RlZmF1bHRfYnVmX21heHNpemVfa2IsIHVpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhjb21lZGlfZGVmYXVsdF9idWZfbWF4c2l6ZV9rYiwKIAkJICJkZWZhdWx0IG1heGltdW0gc2l6ZSBvZiBhc3luY2hyb25vdXMgYnVmZmVyIGluIEtpQiAoZGVmYXVsdCAiCiAJCSBfX01PRFVMRV9TVFJJTkcoQ09ORklHX0NPTUVESV9ERUZBVUxUX0JVRl9NQVhTSVpFX0tCKSAiKSIpOwpAQCAtMjIzMyw3ICsyMjMzLDcgQEAKIAkJZ290byBkb25lOwogCX0KIAotCW5fcGFnZXMgPSBzaXplID4+IFBBR0VfU0hJRlQ7CisJbl9wYWdlcyA9IHZtYV9wYWdlcyh2bWEpOwogCiAJLyogZ2V0IHJlZmVyZW5jZSB0byBjdXJyZW50IGJ1ZiBtYXAgKGlmIGFueSkgKi8KIAlibSA9IGNvbWVkaV9idWZfbWFwX2Zyb21fc3ViZGV2X2dldChzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLmMKaW5kZXggNDQ1MTFkNy4uYTViZjJjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLmMKQEAgLTE1LDcgKzE1LDcgQEAKICAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotKi8KKyAqLwogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzNTAxLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaS1kYXRhL2h3ZHJ2X2FwY2kzNTAxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NTcwNzQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGktZGF0YS9od2Rydl9hcGNpMzUwMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qIFdhdGNoZG9nIFJlbGF0ZWQgRGVmaW5lcyAqLwotCi0jZGVmaW5lIEFERElEQVRBX1RJTUVSCQkJMAotI2RlZmluZSBBRERJREFUQV9XQVRDSERPRwkJMgotCi0vKgotICogKCppbnNuX2NvbmZpZykgZm9yIHRoZSB0aW1lciBzdWJkZXZpY2UKLSAqCi0gKiBDb25maWd1cmVzIFRoZSBUaW1lciwgQ291bnRlciBvciBXYXRjaGRvZwotICogRGF0YSBQb2ludGVyIGNvbnRhaW5zIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcyBiZWxvdwotICoJZGF0YVswXSA6IDAgQ29uZmlndXJlIEFzIFRpbWVyCi0gKgkJICAxIENvbmZpZ3VyZSBBcyBDb3VudGVyCi0gKgkJICAyIENvbmZpZ3VyZSBBcyBXYXRjaGRvZwotICoJZGF0YVsxXSA6IDEgRW5hYmxlICBJbnRlcnJ1cHQKLSAqCQkgIDAgRGlzYWJsZSBJbnRlcnJ1cHQKLSAqCWRhdGFbMl0gOiBUaW1lIFVuaXQKLSAqCWRhdGFbM10gOiBSZWxvYWQgVmFsdWUKLSAqLwotc3RhdGljIGludCBhcGNpMzUwMV9jb25maWdfaW5zbl90aW1lcihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCSAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCi17Ci0Jc3RydWN0IGFwY2kzNTAxX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdW5zaWduZWQgaW50IGN0cmw7Ci0KLQlpZiAoZGF0YVswXSAhPSBBRERJREFUQV9XQVRDSERPRyAmJgotCSAgICBkYXRhWzBdICE9IEFERElEQVRBX1RJTUVSKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRldnByaXYtPnRza19DdXJyZW50ID0gY3VycmVudDsKLQotCWRldnByaXYtPnRpbWVyX21vZGUgPSBkYXRhWzBdOwotCi0JLyogZmlyc3QsIGRpc2FibGUgdGhlIHdhdGNoZG9nIG9yIHN0b3AgdGhlIHRpbWVyICovCi0JaWYgKGRldnByaXYtPnRpbWVyX21vZGUgPT0gQURESURBVEFfV0FUQ0hET0cpIHsKLQkJY3RybCA9IDA7Ci0JfSBlbHNlIHsKLQkJY3RybCA9IGlubChkZXZwcml2LT50Y3cgKyBBRERJX1RDV19DVFJMX1JFRyk7Ci0JCWN0cmwgJj0gfihBRERJX1RDV19DVFJMX0dBVEUgfCBBRERJX1RDV19DVFJMX1RSSUcgfAotCQkJICBBRERJX1RDV19DVFJMX0VOQSk7Ci0JfQotCW91dGwoY3RybCwgZGV2cHJpdi0+dGN3ICsgQURESV9UQ1dfQ1RSTF9SRUcpOwotCi0JLyogZW5hYmxlL2Rpc2FibGUgdGhlIHRpbWVyIGludGVycnVwdCAqLwotCWN0cmwgPSAoZGF0YVsxXSA9PSAxKSA/IEFERElfVENXX0NUUkxfSVJRX0VOQSA6IDA7Ci0Jb3V0bChjdHJsLCBkZXZwcml2LT50Y3cgKyBBRERJX1RDV19DVFJMX1JFRyk7Ci0KLQlvdXRsKGRhdGFbMl0sIGRldnByaXYtPnRjdyArIEFERElfVENXX1RJTUVCQVNFX1JFRyk7Ci0Jb3V0bChkYXRhWzNdLCBkZXZwcml2LT50Y3cgKyBBRERJX1RDV19SRUxPQURfUkVHKTsKLQotCWN0cmwgPSBpbmwoZGV2cHJpdi0+dGN3ICsgQURESV9UQ1dfQ1RSTF9SRUcpOwotCWlmIChkZXZwcml2LT50aW1lcl9tb2RlID09IEFERElEQVRBX1dBVENIRE9HKSB7Ci0JCS8qIFNldCB0aGUgbW9kZSAoZTItPmUwKSBOT1RFOiB0aGlzIGRvZXNuJ3QgbG9vayBjb3JyZWN0ICovCi0JCWN0cmwgfD0gfihBRERJX1RDV19DVFJMX0NOVF9VUCB8IEFERElfVENXX0NUUkxfRVhUX0NMS19NQVNLIHwKLQkJCSAgQURESV9UQ1dfQ1RSTF9NT0RFX01BU0sgfCBBRERJX1RDV19DVFJMX0dBVEUgfAotCQkJICBBRERJX1RDV19DVFJMX1RSSUcgfCBBRERJX1RDV19DVFJMX1RJTUVSX0VOQSB8Ci0JCQkgIEFERElfVENXX0NUUkxfUkVTRVRfRU5BIHwgQURESV9UQ1dfQ1RSTF9XQVJOX0VOQSB8Ci0JCQkgIEFERElfVENXX0NUUkxfSVJRX0VOQSB8IEFERElfVENXX0NUUkxfRU5BKTsKLQl9IGVsc2UgewotCQkvKiBtb2RlIDIgKi8KLQkJY3RybCAmPSB+KEFERElfVENXX0NUUkxfQ05UUl9FTkEgfCBBRERJX1RDV19DVFJMX01PREVfTUFTSyB8Ci0JCQkgIEFERElfVENXX0NUUkxfR0FURSB8IEFERElfVENXX0NUUkxfVFJJRyB8Ci0JCQkgIEFERElfVENXX0NUUkxfVElNRVJfRU5BIHwgQURESV9UQ1dfQ1RSTF9SRVNFVF9FTkEgfAotCQkJICBBRERJX1RDV19DVFJMX1dBUk5fRU5BIHwgQURESV9UQ1dfQ1RSTF9FTkEpOwotCQljdHJsIHw9IEFERElfVENXX0NUUkxfTU9ERSgyKSB8IEFERElfVENXX0NUUkxfVElNRVJfRU5BOwotCX0KLQlvdXRsKGN0cmwsIGRldnByaXYtPnRjdyArIEFERElfVENXX0NUUkxfUkVHKTsKLQotCXJldHVybiBpbnNuLT5uOwotfQotCi0vKgotICogKCppbnNuX3dyaXRlKSBmb3IgdGhlIHRpbWVyIHN1YmRldmljZQotICoKLSAqIFN0YXJ0IC8gU3RvcCBUaGUgU2VsZWN0ZWQgVGltZXIgLCBDb3VudGVyIG9yIFdhdGNoZG9nCi0gKiBEYXRhIFBvaW50ZXIgY29udGFpbnMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFzIGJlbG93Ci0gKglkYXRhWzBdIDogMCBUaW1lcgotICoJCSAgMSBDb3VudGVyCi0gKgkJICAyIFdhdGNoZG9nCi0gKglkYXRhWzFdIDogMSBTdGFydAotICoJCSAgMCBTdG9wCi0gKgkJICAyIFRyaWdnZXIKLSAqLwotc3RhdGljIGludCBhcGNpMzUwMV93cml0ZV9pbnNuX3RpbWVyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKLXsKLQlzdHJ1Y3QgYXBjaTM1MDFfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBpbnQgY3RybDsKLQotCWlmIChkZXZwcml2LT50aW1lcl9tb2RlID09IEFERElEQVRBX1dBVENIRE9HIHx8Ci0JICAgIGRldnByaXYtPnRpbWVyX21vZGUgPT0gQURESURBVEFfVElNRVIpIHsKLQkJY3RybCA9IGlubChkZXZwcml2LT50Y3cgKyBBRERJX1RDV19DVFJMX1JFRyk7Ci0JCWN0cmwgJj0gfihBRERJX1RDV19DVFJMX0dBVEUgfCBBRERJX1RDV19DVFJMX1RSSUcpOwotCi0JCWlmIChkYXRhWzFdID09IDEpIHsJCS8qIGVuYWJsZSAqLwotCQkJY3RybCB8PSBBRERJX1RDV19DVFJMX0VOQTsKLQkJfSBlbHNlIGlmIChkYXRhWzFdID09IDApIHsJLyogc3RvcCAqLwotCQkJaWYgKGRldnByaXYtPnRpbWVyX21vZGUgPT0gQURESURBVEFfV0FUQ0hET0cpCi0JCQkJY3RybCA9IDA7Ci0JCQllbHNlCi0JCQkJY3RybCAmPSB+QURESV9UQ1dfQ1RSTF9FTkE7Ci0JCX0gZWxzZSBpZiAoZGF0YVsxXSA9PSAyKSB7CS8qIHRyaWdnZXIgKi8KLQkJCWN0cmwgfD0gQURESV9UQ1dfQ1RSTF9UUklHOwotCQl9Ci0JCW91dGwoY3RybCwgZGV2cHJpdi0+dGN3ICsgQURESV9UQ1dfQ1RSTF9SRUcpOwotCX0KLQotCWlubChkZXZwcml2LT50Y3cgKyBBRERJX1RDV19TVEFUVVNfUkVHKTsKLQlyZXR1cm4gaW5zbi0+bjsKLX0KLQotLyoKLSAqICgqaW5zbl9yZWFkKSBmb3IgdGhlIHRpbWVyIHN1YmRldmljZQotICoKLSAqIFJlYWQgVGhlIFNlbGVjdGVkIFRpbWVyLCBDb3VudGVyIG9yIFdhdGNoZG9nCi0gKiBEYXRhIFBvaW50ZXIgY29udGFpbnMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFzIGJlbG93Ci0gKglkYXRhWzBdIDogMCBUaW1lcgotICoJCSAgMSBDb3VudGVyCi0gKgkJICAyIFdhdGNoZG9nCi0gKglkYXRhWzFdIDogVGltZXIgQ291bnRlciBXYXRjaGRvZyBOdW1iZXIKLSAqLwotc3RhdGljIGludCBhcGNpMzUwMV9yZWFkX2luc25fdGltZXIoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkgICAgdW5zaWduZWQgaW50ICpkYXRhKQotewotCXN0cnVjdCBhcGNpMzUwMV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCi0JaWYgKGRldnByaXYtPnRpbWVyX21vZGUgIT0gQURESURBVEFfVElNRVIgJiYKLQkgICAgZGV2cHJpdi0+dGltZXJfbW9kZSAhPSBBRERJREFUQV9XQVRDSERPRykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkYXRhWzBdID0gaW5sKGRldnByaXYtPnRjdyArIEFERElfVENXX1NUQVRVU19SRUcpICYKLQkJICBBRERJX1RDV19TVEFUVVNfT1ZFUkZMT1c7Ci0JZGF0YVsxXSA9IGlubChkZXZwcml2LT50Y3cgKyBBRERJX1RDV19WQUxfUkVHKTsKLQotCXJldHVybiBpbnNuLT5uOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zNTAxLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzM1MDEuYwppbmRleCA0MGZmOTE0Li41N2YwZjQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzM1MDEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzM1MDEuYwpAQCAtMjIsMTIgKzIyLDM2IEBACiAgKiBtb3JlIGRldGFpbHMuCiAgKi8KIAorLyoKKyAqIERyaXZlcjogYWRkaV9hcGNpXzM1MDEKKyAqIERlc2NyaXB0aW9uOiBBRERJLURBVEEgQVBDSS0zNTAxIEFuYWxvZyBvdXRwdXQgYm9hcmQKKyAqIERldmljZXM6IFtBRERJLURBVEFdIEFQQ0ktMzUwMSAoYWRkaV9hcGNpXzM1MDEpCisgKiBBdXRob3I6IEggSGFydGxleSBTd2VldGVuIDxoc3dlZXRlbkB2aXNpb25lbmdyYXZlcnMuY29tPgorICogVXBkYXRlZDogTW9uLCAyMCBKdW4gMjAxNiAxMDo1NzowMSAtMDcwMAorICogU3RhdHVzOiB1bnRlc3RlZAorICoKKyAqIENvbmZpZ3VyYXRpb24gT3B0aW9uczogbm90IGFwcGxpY2FibGUsIHVzZXMgY29tZWRpIFBDSSBhdXRvIGNvbmZpZworICoKKyAqIFRoaXMgYm9hcmQgaGFzIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXM6CisgKiAgIC0gNCBvciA4IGFuYWxvZyBvdXRwdXQgY2hhbm5lbHMKKyAqICAgLSAyIG9wdGljYWxseSBpc29sYXRlZCBkaWdpdGFsIGlucHV0cworICogICAtIDIgb3B0aWNhbGx5IGlzb2xhdGVkIGRpZ2l0YWwgb3V0cHV0cworICogICAtIDEgMTItYml0IHdhdGNoZG9nL3RpbWVyCisgKgorICogVGhlcmUgYXJlIDIgdmVyc2lvbnMgb2YgdGhlIEFQQ0ktMzUwMToKKyAqICAgLSBBUENJLTM1MDEtNCAgNCBhbmFsb2cgb3V0cHV0IGNoYW5uZWxzCisgKiAgIC0gQVBDSS0zNTAxLTggIDggYW5hbG9nIG91dHB1dCBjaGFubmVscworICoKKyAqIFRoZXNlIGJvYXJkcyB1c2UgdGhlIHNhbWUgUENJIFZlbmRvci9EZXZpY2UgSURzLiBUaGUgbnVtYmVyIG9mIG91dHB1dAorICogY2hhbm5lbHMgdXNlZCBieSB0aGlzIGRyaXZlciBpcyBkZXRlcm1pbmVkIGJ5IHJlYWRpbmcgdGhlIEVFUFJPTSBvbgorICogdGhlIGJvYXJkLgorICoKKyAqIFRoZSB3YXRjaGRvZy90aW1lciBzdWJkZXZpY2UgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCisgKi8KKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAKICNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCi0jaW5jbHVkZSAiYWRkaV90Y3cuaCIKICNpbmNsdWRlICJhbWNjX3M1OTMzLmgiCiAKIC8qCkBAIC02Nyw4ICs5MSw2IEBACiAKIHN0cnVjdCBhcGNpMzUwMV9wcml2YXRlIHsKIAl1bnNpZ25lZCBsb25nIGFtY2M7Ci0JdW5zaWduZWQgbG9uZyB0Y3c7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0c2tfQ3VycmVudDsKIAl1bnNpZ25lZCBjaGFyIHRpbWVyX21vZGU7CiB9OwogCkBAIC0xMzksOCArMTYxLDYgQEAKIAlyZXR1cm4gaW5zbi0+bjsKIH0KIAotI2luY2x1ZGUgImFkZGktZGF0YS9od2Rydl9hcGNpMzUwMS5jIgotCiBzdGF0aWMgaW50IGFwY2kzNTAxX2RpX2luc25fYml0cyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLApAQCAtMjUzLDM3ICsyNzMsNiBAQAogCXJldHVybiBpbnNuLT5uOwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QgYXBjaTM1MDFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmQpCi17Ci0Jc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA9IGQ7Ci0Jc3RydWN0IGFwY2kzNTAxX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdW5zaWduZWQgaW50IHN0YXR1czsKLQl1bnNpZ25lZCBpbnQgY3RybDsKLQotCS8qICBEaXNhYmxlIEludGVycnVwdCAqLwotCWN0cmwgPSBpbmwoZGV2cHJpdi0+dGN3ICsgQURESV9UQ1dfQ1RSTF9SRUcpOwotCWN0cmwgJj0gfihBRERJX1RDV19DVFJMX0dBVEUgfCBBRERJX1RDV19DVFJMX1RSSUcgfAotCQkgIEFERElfVENXX0NUUkxfSVJRX0VOQSk7Ci0Jb3V0bChjdHJsLCBkZXZwcml2LT50Y3cgKyBBRERJX1RDV19DVFJMX1JFRyk7Ci0KLQlzdGF0dXMgPSBpbmwoZGV2cHJpdi0+dGN3ICsgQURESV9UQ1dfSVJRX1JFRyk7Ci0JaWYgKCEoc3RhdHVzICYgQURESV9UQ1dfSVJRKSkgewotCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiSVJRIGZyb20gdW5rbm93biBzb3VyY2VcbiIpOwotCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQotCi0JLyogRW5hYmxlIEludGVycnVwdCBTZW5kIGEgc2lnbmFsIHRvIGZyb20ga2VybmVsIHRvIHVzZXIgc3BhY2UgKi8KLQlzZW5kX3NpZyhTSUdJTywgZGV2cHJpdi0+dHNrX0N1cnJlbnQsIDApOwotCWN0cmwgPSBpbmwoZGV2cHJpdi0+dGN3ICsgQURESV9UQ1dfQ1RSTF9SRUcpOwotCWN0cmwgJj0gfihBRERJX1RDV19DVFJMX0dBVEUgfCBBRERJX1RDV19DVFJMX1RSSUcgfAotCQkgIEFERElfVENXX0NUUkxfSVJRX0VOQSk7Ci0JY3RybCB8PSBBRERJX1RDV19DVFJMX0lSUV9FTkE7Ci0Jb3V0bChjdHJsLCBkZXZwcml2LT50Y3cgKyBBRERJX1RDV19DVFJMX1JFRyk7Ci0JaW5sKGRldnByaXYtPnRjdyArIEFERElfVENXX1NUQVRVU19SRUcpOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCiBzdGF0aWMgaW50IGFwY2kzNTAxX3Jlc2V0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7CiAJdW5zaWduZWQgaW50IHZhbDsKQEAgLTMzMywxNyArMzIyLDkgQEAKIAogCWRldnByaXYtPmFtY2MgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAwKTsKIAlkZXYtPmlvYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDEpOwotCWRldnByaXYtPnRjdyA9IGRldi0+aW9iYXNlICsgQVBDSTM1MDFfVElNRVJfQkFTRTsKIAogCWFvX25fY2hhbiA9IGFwY2kzNTAxX2VlcHJvbV9nZXRfYW9fbl9jaGFuKGRldik7CiAKLQlpZiAocGNpZGV2LT5pcnEgPiAwKSB7Ci0JCXJldCA9IHJlcXVlc3RfaXJxKHBjaWRldi0+aXJxLCBhcGNpMzUwMV9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAotCQkJCSAgZGV2LT5ib2FyZF9uYW1lLCBkZXYpOwotCQlpZiAocmV0ID09IDApCi0JCQlkZXYtPmlycSA9IHBjaWRldi0+aXJxOwotCX0KLQogCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgNSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTM4MywxNyArMzY0LDkgQEAKIAlzLT5yYW5nZV90YWJsZQk9ICZyYW5nZV9kaWdpdGFsOwogCXMtPmluc25fYml0cwk9IGFwY2kzNTAxX2RvX2luc25fYml0czsKIAotCS8qIEluaXRpYWxpemUgdGhlIHRpbWVyL3dhdGNoZG9nIHN1YmRldmljZSAqLworCS8qIFRpbWVyL1dhdGNoZG9nIHN1YmRldmljZSAqLwogCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzNdOwotCXMtPnR5cGUgPSBDT01FRElfU1VCRF9USU1FUjsKLQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfV1JJVEFCTEU7Ci0Jcy0+bl9jaGFuID0gMTsKLQlzLT5tYXhkYXRhID0gMDsKLQlzLT5sZW5fY2hhbmxpc3QgPSAxOwotCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7Ci0Jcy0+aW5zbl93cml0ZSA9IGFwY2kzNTAxX3dyaXRlX2luc25fdGltZXI7Ci0Jcy0+aW5zbl9yZWFkID0gYXBjaTM1MDFfcmVhZF9pbnNuX3RpbWVyOwotCXMtPmluc25fY29uZmlnID0gYXBjaTM1MDFfY29uZmlnX2luc25fdGltZXI7CisJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9VTlVTRUQ7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBlZXByb20gc3ViZGV2aWNlICovCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbNF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTkxMTguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpOTExOC5jCmluZGV4IGJlNzBiZDMuLjg2NDUwYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpOTExOC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpOTExOC5jCkBAIC0xNjkzLDggKzE2OTMsNyBAQAogCQlwY2k5MTE4X3Jlc2V0KGRldik7CiAJY29tZWRpX3BjaV9kZXRhY2goZGV2KTsKIAlwY2k5MTE4X2ZyZWVfZG1hKGRldik7Ci0JaWYgKHBjaWRldikKLQkJcGNpX2Rldl9wdXQocGNpZGV2KTsKKwlwY2lfZGV2X3B1dChwY2lkZXYpOwogfQogCiBzdGF0aWMgc3RydWN0IGNvbWVkaV9kcml2ZXIgYWRsX3BjaTkxMThfZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2kxNzYwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3NjAuYwppbmRleCBkN2RkMWU1Li45ZjUyNWZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3NjAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3NjAuYwpAQCAtMTk2LDYgKzE5Niw3IEBACiAJCWJyZWFrOwogCWNhc2UgQ01ERl9ST1VORF9ET1dOOgogCQlkaXZpc29yID0gbnMgLyBQQ0kxNzYwX1BXTV9USU1FQkFTRTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRhczY0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGFzNjQuYwppbmRleCAxZjljMDhhLi5jYjljMjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGFzNjQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGFzNjQuYwpAQCAtMSwzNCArMSwzNCBAQAogLyoKLSAgICBjb21lZGkvZHJpdmVycy9jYl9wY2lkYXM2NC5jCi0gICAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIENvbXB1dGVyQm9hcmRzL01lYXN1cmVtZW50Q29tcHV0aW5nIFBDSS1EQVMKLSAgICA2NHh4LCA2MHh4LCBhbmQgNDAyMCBjYXJkcy4KLQotICAgIEF1dGhvcjogIEZyYW5rIE1vcmkgSGVzcyA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KLSAgICBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgRnJhbmsgTW9yaSBIZXNzCi0KLSAgICBUaGFua3MgYWxzbyBnbyB0byB0aGUgZm9sbG93aW5nIHBlb3BsZToKLQotICAgIFN0ZXZlIFJvc2VuYmx1dGgsIGZvciBwcm92aWRpbmcgdGhlIHNvdXJjZSBjb2RlIGZvcgotICAgIGhpcyBwY2ktZGFzNjQwMiBkcml2ZXIsIGFuZCBzb3VyY2UgY29kZSBmb3Igd29ya2luZyBRTlggcGNpLTY0MDIKLSAgICBkcml2ZXJzIGJ5IEdyZWcgTGFpcmQgYW5kIE1hcml1c3ogQm9nYWN6LiAgTm9uZSBvZiB0aGUgY29kZSB3YXMKLSAgICB1c2VkIGRpcmVjdGx5IGhlcmUsIGJ1dCBpdCB3YXMgdXNlZnVsIGFzIGFuIGFkZGl0aW9uYWwgc291cmNlIG9mCi0gICAgZG9jdW1lbnRhdGlvbiBvbiBob3cgdG8gcHJvZ3JhbSB0aGUgYm9hcmRzLgotCi0gICAgSm9obiBTaW1zLCBmb3IgbXVjaCB0ZXN0aW5nIGFuZCBmZWVkYmFjayBvbiBwY2lkYXMtNDAyMCBzdXBwb3J0LgotCi0gICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQotICAgIENvcHlyaWdodCAoQykgMTk5Ny04IERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0qLworICogY29tZWRpL2RyaXZlcnMvY2JfcGNpZGFzNjQuYworICogVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIENvbXB1dGVyQm9hcmRzL01lYXN1cmVtZW50Q29tcHV0aW5nIFBDSS1EQVMKKyAqIDY0eHgsIDYweHgsIGFuZCA0MDIwIGNhcmRzLgorICoKKyAqIEF1dGhvcjogIEZyYW5rIE1vcmkgSGVzcyA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBGcmFuayBNb3JpIEhlc3MKKyAqCisgKiBUaGFua3MgYWxzbyBnbyB0byB0aGUgZm9sbG93aW5nIHBlb3BsZToKKyAqCisgKiBTdGV2ZSBSb3NlbmJsdXRoLCBmb3IgcHJvdmlkaW5nIHRoZSBzb3VyY2UgY29kZSBmb3IKKyAqIGhpcyBwY2ktZGFzNjQwMiBkcml2ZXIsIGFuZCBzb3VyY2UgY29kZSBmb3Igd29ya2luZyBRTlggcGNpLTY0MDIKKyAqIGRyaXZlcnMgYnkgR3JlZyBMYWlyZCBhbmQgTWFyaXVzeiBCb2dhY3ouICBOb25lIG9mIHRoZSBjb2RlIHdhcworICogdXNlZCBkaXJlY3RseSBoZXJlLCBidXQgaXQgd2FzIHVzZWZ1bCBhcyBhbiBhZGRpdGlvbmFsIHNvdXJjZSBvZgorICogZG9jdW1lbnRhdGlvbiBvbiBob3cgdG8gcHJvZ3JhbSB0aGUgYm9hcmRzLgorICoKKyAqIEpvaG4gU2ltcywgZm9yIG11Y2ggdGVzdGluZyBhbmQgZmVlZGJhY2sgb24gcGNpZGFzLTQwMjAgc3VwcG9ydC4KKyAqCisgKiBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTctOCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KIAogLyoKICAqIERyaXZlcjogY2JfcGNpZGFzNjQKQEAgLTY2LDE5ICs2NiwxOCBAQAogICovCiAKIC8qCi0KLVRPRE86Ci0JbWFrZSBpdCByZXR1cm4gZXJyb3IgaWYgdXNlciBhdHRlbXB0cyBhbiBhaSBjb21tYW5kIHRoYXQgdXNlcyB0aGUKLQlleHRlcm5hbCBxdWV1ZSwgYW5kIGFuIGFvIGNvbW1hbmQgc2ltdWx0YW5lb3VzbHkgdXNlciBjb3VudGVyIHN1YmRldmljZQotCXRoZXJlIGFyZSBhIG51bWJlciBvZiBib2FyZHMgdGhpcyBkcml2ZXIgd2lsbCBzdXBwb3J0IHdoZW4gdGhleSBhcmUKLQlmdWxseSByZWxlYXNlZCwgYnV0IGRvZXMgbm90IHlldCBzaW5jZSB0aGUgcGNpIGRldmljZSBpZCBudW1iZXJzCi0JYXJlIG5vdCB5ZXQgYXZhaWxhYmxlLgotCi0Jc3VwcG9ydCBwcmVzY2FsZWQgMTAwa2h6IGNsb2NrIGZvciBzbG93IHBhY2luZyAobm90IGF2YWlsYWJsZSBvbiA2MDAwCi0Jc2VyaWVzPykKLQotCW1ha2UgYW8gZmlmbyBzaXplIGFkanVzdGFibGUgbGlrZSBhaSBmaWZvCi0qLworICogVE9ETzoKKyAqIG1ha2UgaXQgcmV0dXJuIGVycm9yIGlmIHVzZXIgYXR0ZW1wdHMgYW4gYWkgY29tbWFuZCB0aGF0IHVzZXMgdGhlCisgKiBleHRlcm5hbCBxdWV1ZSwgYW5kIGFuIGFvIGNvbW1hbmQgc2ltdWx0YW5lb3VzbHkgdXNlciBjb3VudGVyIHN1YmRldmljZQorICogdGhlcmUgYXJlIGEgbnVtYmVyIG9mIGJvYXJkcyB0aGlzIGRyaXZlciB3aWxsIHN1cHBvcnQgd2hlbiB0aGV5IGFyZQorICogZnVsbHkgcmVsZWFzZWQsIGJ1dCBkb2VzIG5vdCB5ZXQgc2luY2UgdGhlIHBjaSBkZXZpY2UgaWQgbnVtYmVycworICogYXJlIG5vdCB5ZXQgYXZhaWxhYmxlLgorICoKKyAqIHN1cHBvcnQgcHJlc2NhbGVkIDEwMGtoeiBjbG9jayBmb3Igc2xvdyBwYWNpbmcgKG5vdCBhdmFpbGFibGUgb24gNjAwMAorICogc2VyaWVzPykKKyAqCisgKiBtYWtlIGFvIGZpZm8gc2l6ZSBhZGp1c3RhYmxlIGxpa2UgYWkgZmlmbworICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtOTAsNTMgKzg5LDU2IEBACiAjaW5jbHVkZSAicGx4OTA4MC5oIgogCiAjZGVmaW5lIFRJTUVSX0JBU0UgMjUJCS8qICA0ME1IeiBtYXN0ZXIgY2xvY2sgKi8KLS8qIDEwMGtIeiAncHJlc2NhbGVkJyBjbG9jayBmb3Igc2xvdyBhY3F1aXNpdGlvbiwKLSAqIG1heWJlIEknbGwgc3VwcG9ydCB0aGlzIHNvbWVkYXkgKi8KKy8qCisgKiAxMDBrSHogJ3ByZXNjYWxlZCcgY2xvY2sgZm9yIHNsb3cgYWNxdWlzaXRpb24sCisgKiBtYXliZSBJJ2xsIHN1cHBvcnQgdGhpcyBzb21lZGF5CisgKi8KICNkZWZpbmUgUFJFU0NBTEVEX1RJTUVSX0JBU0UJMTAwMDAKLSNkZWZpbmUgRE1BX0JVRkZFUl9TSVpFIDB4MTAwMAorI2RlZmluZSBETUFfQlVGRkVSX1NJWkUJCTB4MTAwMAorI2RlZmluZSBEQUNfRklGT19TSVpFCQkweDIwMDAKIAotLyogbWF4aW11bSB2YWx1ZSB0aGF0IGNhbiBiZSBsb2FkZWQgaW50byBib2FyZCdzIDI0LWJpdCBjb3VudGVycyovCisvKiBtYXhpbXVtIHZhbHVlIHRoYXQgY2FuIGJlIGxvYWRlZCBpbnRvIGJvYXJkJ3MgMjQtYml0IGNvdW50ZXJzICovCiBzdGF0aWMgY29uc3QgaW50IG1heF9jb3VudGVyX3ZhbHVlID0gMHhmZmZmZmY7CiAKIC8qIFBDSS1EQVM2NHh4eCBiYXNlIGFkZHJlc3NlcyAqLwogCiAvKiBkZXZwcml2LT5tYWluX2lvYmFzZSByZWdpc3RlcnMgKi8KIGVudW0gd3JpdGVfb25seV9yZWdpc3RlcnMgewotCUlOVFJfRU5BQkxFX1JFRyA9IDB4MCwJLyogIGludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIgKi8KLQlIV19DT05GSUdfUkVHID0gMHgyLAkvKiAgaGFyZHdhcmUgY29uZmlnIHJlZ2lzdGVyICovCisJSU5UUl9FTkFCTEVfUkVHID0gMHgwLAkJLyogaW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciAqLworCUhXX0NPTkZJR19SRUcgPSAweDIsCQkvKiBoYXJkd2FyZSBjb25maWcgcmVnaXN0ZXIgKi8KIAlEQVFfU1lOQ19SRUcgPSAweGMsCiAJREFRX0FUUklHX0xPV180MDIwX1JFRyA9IDB4YywKLQlBRENfQ09OVFJPTDBfUkVHID0gMHgxMCwJLyogIGFkYyBjb250cm9sIHJlZ2lzdGVyIDAgKi8KLQlBRENfQ09OVFJPTDFfUkVHID0gMHgxMiwJLyogIGFkYyBjb250cm9sIHJlZ2lzdGVyIDEgKi8KKwlBRENfQ09OVFJPTDBfUkVHID0gMHgxMCwJLyogYWRjIGNvbnRyb2wgcmVnaXN0ZXIgMCAqLworCUFEQ19DT05UUk9MMV9SRUcgPSAweDEyLAkvKiBhZGMgY29udHJvbCByZWdpc3RlciAxICovCiAJQ0FMSUJSQVRJT05fUkVHID0gMHgxNCwKLQkvKiAgbG93ZXIgMTYgYml0cyBvZiBhZGMgc2FtcGxlIGludGVydmFsIGNvdW50ZXIgKi8KKwkvKiBsb3dlciAxNiBiaXRzIG9mIGFkYyBzYW1wbGUgaW50ZXJ2YWwgY291bnRlciAqLwogCUFEQ19TQU1QTEVfSU5URVJWQUxfTE9XRVJfUkVHID0gMHgxNiwKLQkvKiAgdXBwZXIgOCBiaXRzIG9mIGFkYyBzYW1wbGUgaW50ZXJ2YWwgY291bnRlciAqLworCS8qIHVwcGVyIDggYml0cyBvZiBhZGMgc2FtcGxlIGludGVydmFsIGNvdW50ZXIgKi8KIAlBRENfU0FNUExFX0lOVEVSVkFMX1VQUEVSX1JFRyA9IDB4MTgsCi0JLyogIGxvd2VyIDE2IGJpdHMgb2YgZGVsYXkgaW50ZXJ2YWwgY291bnRlciAqLworCS8qIGxvd2VyIDE2IGJpdHMgb2YgZGVsYXkgaW50ZXJ2YWwgY291bnRlciAqLwogCUFEQ19ERUxBWV9JTlRFUlZBTF9MT1dFUl9SRUcgPSAweDFhLAotCS8qICB1cHBlciA4IGJpdHMgb2YgZGVsYXkgaW50ZXJ2YWwgY291bnRlciAqLworCS8qIHVwcGVyIDggYml0cyBvZiBkZWxheSBpbnRlcnZhbCBjb3VudGVyICovCiAJQURDX0RFTEFZX0lOVEVSVkFMX1VQUEVSX1JFRyA9IDB4MWMsCi0JLyogIGxvd2VyIDE2IGJpdHMgb2YgaGFyZHdhcmUgY29udmVyc2lvbi9zY2FuIGNvdW50ZXIgKi8KKwkvKiBsb3dlciAxNiBiaXRzIG9mIGhhcmR3YXJlIGNvbnZlcnNpb24vc2NhbiBjb3VudGVyICovCiAJQURDX0NPVU5UX0xPV0VSX1JFRyA9IDB4MWUsCi0JLyogIHVwcGVyIDggYml0cyBvZiBoYXJkd2FyZSBjb252ZXJzaW9uL3NjYW4gY291bnRlciAqLworCS8qIHVwcGVyIDggYml0cyBvZiBoYXJkd2FyZSBjb252ZXJzaW9uL3NjYW4gY291bnRlciAqLwogCUFEQ19DT1VOVF9VUFBFUl9SRUcgPSAweDIwLAotCUFEQ19TVEFSVF9SRUcgPSAweDIyLAkvKiAgc29mdHdhcmUgdHJpZ2dlciB0byBzdGFydCBhY3F1aXNpdGlvbiAqLwotCUFEQ19DT05WRVJUX1JFRyA9IDB4MjQsCS8qICBpbml0aWF0ZXMgc2luZ2xlIGNvbnZlcnNpb24gKi8KLQlBRENfUVVFVUVfQ0xFQVJfUkVHID0gMHgyNiwJLyogIGNsZWFycyBhZGMgcXVldWUgKi8KLQlBRENfUVVFVUVfTE9BRF9SRUcgPSAweDI4LAkvKiAgbG9hZHMgYWRjIHF1ZXVlICovCisJQURDX1NUQVJUX1JFRyA9IDB4MjIsCS8qIHNvZnR3YXJlIHRyaWdnZXIgdG8gc3RhcnQgYWNxdWlzaXRpb24gKi8KKwlBRENfQ09OVkVSVF9SRUcgPSAweDI0LAkvKiBpbml0aWF0ZXMgc2luZ2xlIGNvbnZlcnNpb24gKi8KKwlBRENfUVVFVUVfQ0xFQVJfUkVHID0gMHgyNiwJLyogY2xlYXJzIGFkYyBxdWV1ZSAqLworCUFEQ19RVUVVRV9MT0FEX1JFRyA9IDB4MjgsCS8qIGxvYWRzIGFkYyBxdWV1ZSAqLwogCUFEQ19CVUZGRVJfQ0xFQVJfUkVHID0gMHgyYSwKLQkvKiAgaGlnaCBjaGFubmVsIGZvciBpbnRlcm5hbCBxdWV1ZSwgdXNlIGFkY19jaGFuX2JpdHMoKSBpbmxpbmUgYWJvdmUgKi8KKwkvKiBoaWdoIGNoYW5uZWwgZm9yIGludGVybmFsIHF1ZXVlLCB1c2UgYWRjX2NoYW5fYml0cygpIGlubGluZSBhYm92ZSAqLwogCUFEQ19RVUVVRV9ISUdIX1JFRyA9IDB4MmMsCi0JREFDX0NPTlRST0wwX1JFRyA9IDB4NTAsCS8qICBkYWMgY29udHJvbCByZWdpc3RlciAwICovCi0JREFDX0NPTlRST0wxX1JFRyA9IDB4NTIsCS8qICBkYWMgY29udHJvbCByZWdpc3RlciAwICovCi0JLyogIGxvd2VyIDE2IGJpdHMgb2YgZGFjIHNhbXBsZSBpbnRlcnZhbCBjb3VudGVyICovCisJREFDX0NPTlRST0wwX1JFRyA9IDB4NTAsCS8qIGRhYyBjb250cm9sIHJlZ2lzdGVyIDAgKi8KKwlEQUNfQ09OVFJPTDFfUkVHID0gMHg1MiwJLyogZGFjIGNvbnRyb2wgcmVnaXN0ZXIgMCAqLworCS8qIGxvd2VyIDE2IGJpdHMgb2YgZGFjIHNhbXBsZSBpbnRlcnZhbCBjb3VudGVyICovCiAJREFDX1NBTVBMRV9JTlRFUlZBTF9MT1dFUl9SRUcgPSAweDU0LAotCS8qICB1cHBlciA4IGJpdHMgb2YgZGFjIHNhbXBsZSBpbnRlcnZhbCBjb3VudGVyICovCisJLyogdXBwZXIgOCBiaXRzIG9mIGRhYyBzYW1wbGUgaW50ZXJ2YWwgY291bnRlciAqLwogCURBQ19TQU1QTEVfSU5URVJWQUxfVVBQRVJfUkVHID0gMHg1NiwKIAlEQUNfU0VMRUNUX1JFRyA9IDB4NjAsCiAJREFDX1NUQVJUX1JFRyA9IDB4NjQsCi0JREFDX0JVRkZFUl9DTEVBUl9SRUcgPSAweDY2LAkvKiAgY2xlYXIgZGFjIGJ1ZmZlciAqLworCURBQ19CVUZGRVJfQ0xFQVJfUkVHID0gMHg2NiwJLyogY2xlYXIgZGFjIGJ1ZmZlciAqLwogfTsKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZGFjX2NvbnZlcnRfcmVnKHVuc2lnbmVkIGludCBjaGFubmVsKQpAQCAtMTY4LDggKzE3MCw4IEBACiB9OwogCiBlbnVtIHJlYWRfd3JpdGVfcmVnaXN0ZXJzIHsKLQlJODI1NV80MDIwX1JFRyA9IDB4NDgsCS8qICA4MjU1IG9mZnNldCwgZm9yIDQwMjAgb25seSAqLwotCS8qICBleHRlcm5hbCBjaGFubmVsL2dhaW4gcXVldWUsIHVzZXMgc2FtZSBiaXRzIGFzIEFEQ19RVUVVRV9MT0FEX1JFRyAqLworCUk4MjU1XzQwMjBfUkVHID0gMHg0OCwJLyogODI1NSBvZmZzZXQsIGZvciA0MDIwIG9ubHkgKi8KKwkvKiBleHRlcm5hbCBjaGFubmVsL2dhaW4gcXVldWUsIHVzZXMgc2FtZSBiaXRzIGFzIEFEQ19RVUVVRV9MT0FEX1JFRyAqLwogCUFEQ19RVUVVRV9GSUZPX1JFRyA9IDB4MTAwLAogCUFEQ19GSUZPX1JFRyA9IDB4MjAwLAkvKiBhZGMgZGF0YSBmaWZvICovCiAJLyogZGFjIGRhdGEgZmlmbywgaGFzIHdlaXJkIGludGVyYWN0aW9ucyB3aXRoIGV4dGVybmFsIGNoYW5uZWwgcXVldWUgKi8KQEAgLTE4OCw1MCArMTkwLDUxIEBACiAvKiBiaXQgZGVmaW5pdGlvbnMgZm9yIHdyaXRlLW9ubHkgcmVnaXN0ZXJzICovCiAKIGVudW0gaW50cl9lbmFibGVfY29udGVudHMgewotCUFEQ19JTlRSX1NSQ19NQVNLID0gMHgzLAkvKiAgYWRjIGludGVycnVwdCBzb3VyY2UgbWFzayAqLwotCUFEQ19JTlRSX1FGVUxMX0JJVFMgPSAweDAsCS8qICBpbnRlcnJ1cHQgZmlmbyBxdWFydGVyIGZ1bGwgKi8KLQlBRENfSU5UUl9FT0NfQklUUyA9IDB4MSwJLyogIGludGVycnVwdCBlbmQgb2YgY29udmVyc2lvbiAqLwotCUFEQ19JTlRSX0VPU0NBTl9CSVRTID0gMHgyLAkvKiAgaW50ZXJydXB0IGVuZCBvZiBzY2FuICovCi0JQURDX0lOVFJfRU9TRVFfQklUUyA9IDB4MywJLyogIGludGVycnVwdCBlbmQgb2Ygc2VxdWVuY2UgbWFzayAqLwotCUVOX0FEQ19JTlRSX1NSQ19CSVQgPSAweDQsCS8qICBlbmFibGUgYWRjIGludGVycnVwdCBzb3VyY2UgKi8KLQlFTl9BRENfRE9ORV9JTlRSX0JJVCA9IDB4OCwJLyogIGVuYWJsZSBhZGMgYWNxdWlzaXRpb24gZG9uZSBpbnRyICovCisJQURDX0lOVFJfU1JDX01BU0sgPSAweDMsCS8qIGFkYyBpbnRlcnJ1cHQgc291cmNlIG1hc2sgKi8KKwlBRENfSU5UUl9RRlVMTF9CSVRTID0gMHgwLAkvKiBpbnRlcnJ1cHQgZmlmbyBxdWFydGVyIGZ1bGwgKi8KKwlBRENfSU5UUl9FT0NfQklUUyA9IDB4MSwJLyogaW50ZXJydXB0IGVuZCBvZiBjb252ZXJzaW9uICovCisJQURDX0lOVFJfRU9TQ0FOX0JJVFMgPSAweDIsCS8qIGludGVycnVwdCBlbmQgb2Ygc2NhbiAqLworCUFEQ19JTlRSX0VPU0VRX0JJVFMgPSAweDMsCS8qIGludGVycnVwdCBlbmQgb2Ygc2VxdWVuY2UgbWFzayAqLworCUVOX0FEQ19JTlRSX1NSQ19CSVQgPSAweDQsCS8qIGVuYWJsZSBhZGMgaW50ZXJydXB0IHNvdXJjZSAqLworCUVOX0FEQ19ET05FX0lOVFJfQklUID0gMHg4LAkvKiBlbmFibGUgYWRjIGFjcXVpc2l0aW9uIGRvbmUgaW50ciAqLwogCURBQ19JTlRSX1NSQ19NQVNLID0gMHgzMCwKIAlEQUNfSU5UUl9RRU1QVFlfQklUUyA9IDB4MCwKIAlEQUNfSU5UUl9ISUdIX0NIQU5fQklUUyA9IDB4MTAsCi0JRU5fREFDX0lOVFJfU1JDX0JJVCA9IDB4NDAsCS8qICBlbmFibGUgZGFjIGludGVycnVwdCBzb3VyY2UgKi8KKwlFTl9EQUNfSU5UUl9TUkNfQklUID0gMHg0MCwJLyogZW5hYmxlIGRhYyBpbnRlcnJ1cHQgc291cmNlICovCiAJRU5fREFDX0RPTkVfSU5UUl9CSVQgPSAweDgwLAotCUVOX0FEQ19BQ1RJVkVfSU5UUl9CSVQgPSAweDIwMCwJLyogIGVuYWJsZSBhZGMgYWN0aXZlIGludGVycnVwdCAqLwotCUVOX0FEQ19TVE9QX0lOVFJfQklUID0gMHg0MDAsCS8qICBlbmFibGUgYWRjIHN0b3AgdHJpZ2dlciBpbnRlcnJ1cHQgKi8KLQlFTl9EQUNfQUNUSVZFX0lOVFJfQklUID0gMHg4MDAsCS8qICBlbmFibGUgZGFjIGFjdGl2ZSBpbnRlcnJ1cHQgKi8KLQlFTl9EQUNfVU5ERVJSVU5fQklUID0gMHg0MDAwLAkvKiAgZW5hYmxlIGRhYyB1bmRlcnJ1biBzdGF0dXMgYml0ICovCi0JRU5fQURDX09WRVJSVU5fQklUID0gMHg4MDAwLAkvKiAgZW5hYmxlIGFkYyBvdmVycnVuIHN0YXR1cyBiaXQgKi8KKwlFTl9BRENfQUNUSVZFX0lOVFJfQklUID0gMHgyMDAsCS8qIGVuYWJsZSBhZGMgYWN0aXZlIGludGVycnVwdCAqLworCUVOX0FEQ19TVE9QX0lOVFJfQklUID0gMHg0MDAsCS8qIGVuYWJsZSBhZGMgc3RvcCB0cmlnZ2VyIGludGVycnVwdCAqLworCUVOX0RBQ19BQ1RJVkVfSU5UUl9CSVQgPSAweDgwMCwJLyogZW5hYmxlIGRhYyBhY3RpdmUgaW50ZXJydXB0ICovCisJRU5fREFDX1VOREVSUlVOX0JJVCA9IDB4NDAwMCwJLyogZW5hYmxlIGRhYyB1bmRlcnJ1biBzdGF0dXMgYml0ICovCisJRU5fQURDX09WRVJSVU5fQklUID0gMHg4MDAwLAkvKiBlbmFibGUgYWRjIG92ZXJydW4gc3RhdHVzIGJpdCAqLwogfTsKIAogZW51bSBod19jb25maWdfY29udGVudHMgewotCU1BU1RFUl9DTE9DS180MDIwX01BU0sgPSAweDMsCS8qICBtYXN0ZXIgY2xvY2sgc291cmNlIG1hc2sgZm9yIDQwMjAgKi8KLQlJTlRFUk5BTF9DTE9DS180MDIwX0JJVFMgPSAweDEsCS8qICB1c2UgNDAgTUh6IGludGVybmFsIG1hc3RlciBjbG9jayAqLwotCUJOQ19DTE9DS180MDIwX0JJVFMgPSAweDIsCS8qICB1c2UgQk5DIGlucHV0IGZvciBtYXN0ZXIgY2xvY2sgKi8KLQlFWFRfQ0xPQ0tfNDAyMF9CSVRTID0gMHgzLAkvKiAgdXNlIGRpbyBpbnB1dCBmb3IgbWFzdGVyIGNsb2NrICovCi0JRVhUX1FVRVVFX0JJVCA9IDB4MjAwLAkJLyogIHVzZSBleHRlcm5hbCBjaGFubmVsL2dhaW4gcXVldWUgKi8KLQkvKiAgdXNlIDIyNSBuYW5vc2VjIHN0cm9iZSB3aGVuIGxvYWRpbmcgZGFjIGluc3RlYWQgb2YgNTAgbmFub3NlYyAqLworCU1BU1RFUl9DTE9DS180MDIwX01BU0sgPSAweDMsCS8qIG1hc3RlciBjbG9jayBzb3VyY2UgbWFzayBmb3IgNDAyMCAqLworCUlOVEVSTkFMX0NMT0NLXzQwMjBfQklUUyA9IDB4MSwJLyogdXNlIDQwIE1IeiBpbnRlcm5hbCBtYXN0ZXIgY2xvY2sgKi8KKwlCTkNfQ0xPQ0tfNDAyMF9CSVRTID0gMHgyLAkvKiB1c2UgQk5DIGlucHV0IGZvciBtYXN0ZXIgY2xvY2sgKi8KKwlFWFRfQ0xPQ0tfNDAyMF9CSVRTID0gMHgzLAkvKiB1c2UgZGlvIGlucHV0IGZvciBtYXN0ZXIgY2xvY2sgKi8KKwlFWFRfUVVFVUVfQklUID0gMHgyMDAsCQkvKiB1c2UgZXh0ZXJuYWwgY2hhbm5lbC9nYWluIHF1ZXVlICovCisJLyogdXNlIDIyNSBuYW5vc2VjIHN0cm9iZSB3aGVuIGxvYWRpbmcgZGFjIGluc3RlYWQgb2YgNTAgbmFub3NlYyAqLwogCVNMT1dfREFDX0JJVCA9IDB4NDAwLAotCS8qICBiaXQgd2l0aCB1bmtub3duIGZ1bmN0aW9uIHlldCBnaXZlbiBhcyBkZWZhdWx0IHZhbHVlIGluIHBjaS1kYXM2NAotCSAqICBtYW51YWwgKi8KKwkvKgorCSAqIGJpdCB3aXRoIHVua25vd24gZnVuY3Rpb24geWV0IGdpdmVuIGFzIGRlZmF1bHQgdmFsdWUgaW4gcGNpLWRhczY0CisJICogbWFudWFsCisJICovCiAJSFdfQ09ORklHX0RVTU1ZX0JJVFMgPSAweDIwMDAsCi0JLyogIGJpdCBzZWxlY3RzIGNoYW5uZWxzIDEvMCBmb3IgYW5hbG9nIGlucHV0L291dHB1dCwgb3RoZXJ3aXNlIDAvMSAqLworCS8qIGJpdCBzZWxlY3RzIGNoYW5uZWxzIDEvMCBmb3IgYW5hbG9nIGlucHV0L291dHB1dCwgb3RoZXJ3aXNlIDAvMSAqLwogCURNQV9DSF9TRUxFQ1RfQklUID0gMHg4MDAwLAotCUZJRk9fU0laRV9SRUcgPSAweDQsCQkvKiAgYWxsb3dzIGFkanVzdG1lbnQgb2YgZmlmbyBzaXplcyAqLwotCURBQ19GSUZPX1NJWkVfTUFTSyA9IDB4ZmYwMCwJLyogIGJpdHMgdGhhdCBzZXQgZGFjIGZpZm8gc2l6ZSAqLwotCURBQ19GSUZPX0JJVFMgPSAweGY4MDAsCQkvKiAgOGsgc2FtcGxlIGFvIGZpZm8gKi8KKwlGSUZPX1NJWkVfUkVHID0gMHg0LAkJLyogYWxsb3dzIGFkanVzdG1lbnQgb2YgZmlmbyBzaXplcyAqLworCURBQ19GSUZPX1NJWkVfTUFTSyA9IDB4ZmYwMCwJLyogYml0cyB0aGF0IHNldCBkYWMgZmlmbyBzaXplICovCisJREFDX0ZJRk9fQklUUyA9IDB4ZjgwMCwJCS8qIDhrIHNhbXBsZSBhbyBmaWZvICovCiB9OwotI2RlZmluZSBEQUNfRklGT19TSVpFIDB4MjAwMAogCiBlbnVtIGRhcV9hdHJpZ19sb3dfNDAyMF9jb250ZW50cyB7Ci0JLyogIHVzZSB0cmlnL2V4dCBjbGsgYm5jIGlucHV0IGZvciBhbmFsb2cgZ2F0ZSBzaWduYWwgKi8KKwkvKiB1c2UgdHJpZy9leHQgY2xrIGJuYyBpbnB1dCBmb3IgYW5hbG9nIGdhdGUgc2lnbmFsICovCiAJRVhUX0FHQVRFX0JOQ19CSVQgPSAweDgwMDAsCi0JLyogIHVzZSB0cmlnL2V4dCBjbGsgYm5jIGlucHV0IGZvciBleHRlcm5hbCBzdG9wIHRyaWdnZXIgc2lnbmFsICovCisJLyogdXNlIHRyaWcvZXh0IGNsayBibmMgaW5wdXQgZm9yIGV4dGVybmFsIHN0b3AgdHJpZ2dlciBzaWduYWwgKi8KIAlFWFRfU1RPUF9UUklHX0JOQ19CSVQgPSAweDQwMDAsCi0JLyogIHVzZSB0cmlnL2V4dCBjbGsgYm5jIGlucHV0IGZvciBleHRlcm5hbCBzdGFydCB0cmlnZ2VyIHNpZ25hbCAqLworCS8qIHVzZSB0cmlnL2V4dCBjbGsgYm5jIGlucHV0IGZvciBleHRlcm5hbCBzdGFydCB0cmlnZ2VyIHNpZ25hbCAqLwogCUVYVF9TVEFSVF9UUklHX0JOQ19CSVQgPSAweDIwMDAsCiB9OwogCkBAIC0yNDEsMzggKzI0NCwzOCBAQAogfQogCiBlbnVtIGFkY19jb250cm9sMF9jb250ZW50cyB7Ci0JQURDX0dBVEVfU1JDX01BU0sgPSAweDMsCS8qICBiaXRzIHRoYXQgc2VsZWN0IGdhdGUgKi8KLQlBRENfU09GVF9HQVRFX0JJVFMgPSAweDEsCS8qICBzb2Z0d2FyZSBnYXRlICovCi0JQURDX0VYVF9HQVRFX0JJVFMgPSAweDIsCS8qICBleHRlcm5hbCBkaWdpdGFsIGdhdGUgKi8KLQlBRENfQU5BTE9HX0dBVEVfQklUUyA9IDB4MywJLyogIGFuYWxvZyBsZXZlbCBnYXRlICovCi0JLyogIGxldmVsLXNlbnNpdGl2ZSBnYXRlIChmb3IgZGlnaXRhbCkgKi8KKwlBRENfR0FURV9TUkNfTUFTSyA9IDB4MywJLyogYml0cyB0aGF0IHNlbGVjdCBnYXRlICovCisJQURDX1NPRlRfR0FURV9CSVRTID0gMHgxLAkvKiBzb2Z0d2FyZSBnYXRlICovCisJQURDX0VYVF9HQVRFX0JJVFMgPSAweDIsCS8qIGV4dGVybmFsIGRpZ2l0YWwgZ2F0ZSAqLworCUFEQ19BTkFMT0dfR0FURV9CSVRTID0gMHgzLAkvKiBhbmFsb2cgbGV2ZWwgZ2F0ZSAqLworCS8qIGxldmVsLXNlbnNpdGl2ZSBnYXRlIChmb3IgZGlnaXRhbCkgKi8KIAlBRENfR0FURV9MRVZFTF9CSVQgPSAweDQsCi0JQURDX0dBVEVfUE9MQVJJVFlfQklUID0gMHg4LAkvKiAgZ2F0ZSBhY3RpdmUgbG93ICovCisJQURDX0dBVEVfUE9MQVJJVFlfQklUID0gMHg4LAkvKiBnYXRlIGFjdGl2ZSBsb3cgKi8KIAlBRENfU1RBUlRfVFJJR19TT0ZUX0JJVFMgPSAweDEwLAogCUFEQ19TVEFSVF9UUklHX0VYVF9CSVRTID0gMHgyMCwKIAlBRENfU1RBUlRfVFJJR19BTkFMT0dfQklUUyA9IDB4MzAsCiAJQURDX1NUQVJUX1RSSUdfTUFTSyA9IDB4MzAsCi0JQURDX1NUQVJUX1RSSUdfRkFMTElOR19CSVQgPSAweDQwLAkvKiAgdHJpZyAxIHVzZXMgZmFsbGluZyBlZGdlICovCi0JLyogIGV4dGVybmFsIHBhY2luZyB1c2VzIGZhbGxpbmcgZWRnZSAqLworCUFEQ19TVEFSVF9UUklHX0ZBTExJTkdfQklUID0gMHg0MCwJLyogdHJpZyAxIHVzZXMgZmFsbGluZyBlZGdlICovCisJLyogZXh0ZXJuYWwgcGFjaW5nIHVzZXMgZmFsbGluZyBlZGdlICovCiAJQURDX0VYVF9DT05WX0ZBTExJTkdfQklUID0gMHg4MDAsCi0JLyogIGVuYWJsZSBoYXJkd2FyZSBzY2FuIGNvdW50ZXIgKi8KKwkvKiBlbmFibGUgaGFyZHdhcmUgc2NhbiBjb3VudGVyICovCiAJQURDX1NBTVBMRV9DT1VOVEVSX0VOX0JJVCA9IDB4MTAwMCwKLQlBRENfRE1BX0RJU0FCTEVfQklUID0gMHg0MDAwLAkvKiAgZGlzYWJsZXMgZG1hICovCi0JQURDX0VOQUJMRV9CSVQgPSAweDgwMDAsCS8qICBtYXN0ZXIgYWRjIGVuYWJsZSAqLworCUFEQ19ETUFfRElTQUJMRV9CSVQgPSAweDQwMDAsCS8qIGRpc2FibGVzIGRtYSAqLworCUFEQ19FTkFCTEVfQklUID0gMHg4MDAwLAkvKiBtYXN0ZXIgYWRjIGVuYWJsZSAqLwogfTsKIAogZW51bSBhZGNfY29udHJvbDFfY29udGVudHMgewotCS8qICBzaG91bGQgYmUgc2V0IGZvciBib2FyZHMgd2l0aCA+IDE2IGNoYW5uZWxzICovCisJLyogc2hvdWxkIGJlIHNldCBmb3IgYm9hcmRzIHdpdGggPiAxNiBjaGFubmVscyAqLwogCUFEQ19RVUVVRV9DT05GSUdfQklUID0gMHgxLAogCUNPTlZFUlRfUE9MQVJJVFlfQklUID0gMHgxMCwKIAlFT0NfUE9MQVJJVFlfQklUID0gMHgyMCwKLQlBRENfU1dfR0FURV9CSVQgPSAweDQwLAkvKiAgc29mdHdhcmUgZ2F0ZSBvZiBhZGMgKi8KLQlBRENfRElUSEVSX0JJVCA9IDB4MjAwLAkvKiAgdHVybiBvbiBleHRyYSBub2lzZSBmb3IgZGl0aGVyaW5nICovCisJQURDX1NXX0dBVEVfQklUID0gMHg0MCwJCS8qIHNvZnR3YXJlIGdhdGUgb2YgYWRjICovCisJQURDX0RJVEhFUl9CSVQgPSAweDIwMCwJCS8qIHR1cm4gb24gZXh0cmEgbm9pc2UgZm9yIGRpdGhlcmluZyAqLwogCVJFVFJJR0dFUl9CSVQgPSAweDgwMCwKIAlBRENfTE9fQ0hBTk5FTF80MDIwX01BU0sgPSAweDMwMCwKIAlBRENfSElfQ0hBTk5FTF80MDIwX01BU0sgPSAweGMwMCwKLQlUV09fQ0hBTk5FTF80MDIwX0JJVFMgPSAweDEwMDAsCS8qICB0d28gY2hhbm5lbCBtb2RlIGZvciA0MDIwICovCi0JRk9VUl9DSEFOTkVMXzQwMjBfQklUUyA9IDB4MjAwMCwgLyogIGZvdXIgY2hhbm5lbCBtb2RlIGZvciA0MDIwICovCisJVFdPX0NIQU5ORUxfNDAyMF9CSVRTID0gMHgxMDAwLAkJLyogdHdvIGNoYW5uZWwgbW9kZSBmb3IgNDAyMCAqLworCUZPVVJfQ0hBTk5FTF80MDIwX0JJVFMgPSAweDIwMDAsCS8qIGZvdXIgY2hhbm5lbCBtb2RlIGZvciA0MDIwICovCiAJQ0hBTk5FTF9NT0RFXzQwMjBfTUFTSyA9IDB4MzAwMCwKIAlBRENfTU9ERV9NQVNLID0gMHhmMDAwLAogfTsKQEAgLTI5NiwxMCArMjk5LDEwIEBACiAJU0VMRUNUXzg4MDBfQklUID0gMHgxLAogCVNFTEVDVF84NDAyXzY0WFhfQklUID0gMHgyLAogCVNFTEVDVF8xNTkwXzYwWFhfQklUID0gMHgyLAotCUNBTF9FTl82NFhYX0JJVCA9IDB4NDAsCS8qICBjYWxpYnJhdGlvbiBlbmFibGUgZm9yIDY0eHggc2VyaWVzICovCisJQ0FMX0VOXzY0WFhfQklUID0gMHg0MCwJCS8qIGNhbGlicmF0aW9uIGVuYWJsZSBmb3IgNjR4eCBzZXJpZXMgKi8KIAlTRVJJQUxfREFUQV9JTl9CSVQgPSAweDgwLAogCVNFUklBTF9DTE9DS19CSVQgPSAweDEwMCwKLQlDQUxfRU5fNjBYWF9CSVQgPSAweDIwMCwgLyogIGNhbGlicmF0aW9uIGVuYWJsZSBmb3IgNjB4eCBzZXJpZXMgKi8KKwlDQUxfRU5fNjBYWF9CSVQgPSAweDIwMCwJLyogY2FsaWJyYXRpb24gZW5hYmxlIGZvciA2MHh4IHNlcmllcyAqLwogCUNBTF9HQUlOX0JJVCA9IDB4ODAwLAogfTsKIApAQCAtMzI2LDEyICszMjksMTIgQEAKIH07CiAKIGVudW0gYWRjX3F1ZXVlX2xvYWRfY29udGVudHMgewotCVVOSVBfQklUID0gMHg4MDAsCS8qICB1bmlwb2xhci9iaXBvbGFyIGJpdCAqLwotCUFEQ19TRV9ESUZGX0JJVCA9IDB4MTAwMCwJLyogIHNpbmdsZS1lbmRlZC8gZGlmZmVyZW50aWFsIGJpdCAqLwotCS8qICBub24tcmVmZXJlbmNlZCBzaW5nbGUtZW5kZWQgKGNvbW1vbi1tb2RlIGlucHV0KSAqLworCVVOSVBfQklUID0gMHg4MDAsCQkvKiB1bmlwb2xhci9iaXBvbGFyIGJpdCAqLworCUFEQ19TRV9ESUZGX0JJVCA9IDB4MTAwMCwJLyogc2luZ2xlLWVuZGVkLyBkaWZmZXJlbnRpYWwgYml0ICovCisJLyogbm9uLXJlZmVyZW5jZWQgc2luZ2xlLWVuZGVkIChjb21tb24tbW9kZSBpbnB1dCkgKi8KIAlBRENfQ09NTU9OX0JJVCA9IDB4MjAwMCwKLQlRVUVVRV9FT1NFUV9CSVQgPSAweDQwMDAsCS8qICBxdWV1ZSBlbmQgb2Ygc2VxdWVuY2UgKi8KLQlRVUVVRV9FT1NDQU5fQklUID0gMHg4MDAwLAkvKiAgcXVldWUgZW5kIG9mIHNjYW4gKi8KKwlRVUVVRV9FT1NFUV9CSVQgPSAweDQwMDAsCS8qIHF1ZXVlIGVuZCBvZiBzZXF1ZW5jZSAqLworCVFVRVVFX0VPU0NBTl9CSVQgPSAweDgwMDAsCS8qIHF1ZXVlIGVuZCBvZiBzY2FuICovCiB9OwogCiBzdGF0aWMgaW5saW5lIHVpbnQxNl90IGFkY19jaGFuX2JpdHModW5zaWduZWQgaW50IGNoYW5uZWwpCkBAIC0zNDAsNyArMzQzLDcgQEAKIH07CiAKIGVudW0gZGFjX2NvbnRyb2wwX2NvbnRlbnRzIHsKLQlEQUNfRU5BQkxFX0JJVCA9IDB4ODAwMCwJLyogIGRhYyBjb250cm9sbGVyIGVuYWJsZSBiaXQgKi8KKwlEQUNfRU5BQkxFX0JJVCA9IDB4ODAwMCwJLyogZGFjIGNvbnRyb2xsZXIgZW5hYmxlIGJpdCAqLwogCURBQ19DWUNMSUNfU1RPUF9CSVQgPSAweDQwMDAsCiAJREFDX1dBVkVGT1JNX01PREVfQklUID0gMHgxMDAsCiAJREFDX0VYVF9VUERBVEVfRkFMTElOR19CSVQgPSAweDgwLApAQCAtMzYwLDcgKzM2Myw3IEBACiAJREFDX1dSSVRFX1BPTEFSSVRZX0JJVCA9IDB4ODAwLAkvKiBib2FyZC1kZXBlbmRlbnQgc2V0dGluZyAqLwogCURBQzFfRVhUX1JFRl9CSVQgPSAweDIwMCwKIAlEQUMwX0VYVF9SRUZfQklUID0gMHgxMDAsCi0JREFDX09VVFBVVF9FTkFCTEVfQklUID0gMHg4MCwJLyogIGRhYyBvdXRwdXQgZW5hYmxlIGJpdCAqLworCURBQ19PVVRQVVRfRU5BQkxFX0JJVCA9IDB4ODAsCS8qIGRhYyBvdXRwdXQgZW5hYmxlIGJpdCAqLwogCURBQ19VUERBVEVfUE9MQVJJVFlfQklUID0gMHg0MCwJLyogYm9hcmQtZGVwZW5kZW50IHNldHRpbmcgKi8KIAlEQUNfU1dfR0FURV9CSVQgPSAweDIwLAogCURBQzFfVU5JUE9MQVJfQklUID0gMHg4LApAQCAtNDA5LDkgKzQxMiw5IEBACiB9OwogCiBlbnVtIHJhbmdlX2NhbF9pMmNfY29udGVudHMgewotCS8qICBiaXRzIHRoYXQgc2V0IHdoYXQgc291cmNlIHRoZSBhZGMgY29udmVydGVyIG1lYXN1cmVzICovCisJLyogYml0cyB0aGF0IHNldCB3aGF0IHNvdXJjZSB0aGUgYWRjIGNvbnZlcnRlciBtZWFzdXJlcyAqLwogCUFEQ19TUkNfNDAyMF9NQVNLID0gMHg3MCwKLQkvKiAgbWFrZSBibmMgdHJpZy9leHQgY2xvY2sgdGhyZXNob2xkIDBWIGluc3RlYWQgb2YgMi41ViAqLworCS8qIG1ha2UgYm5jIHRyaWcvZXh0IGNsb2NrIHRocmVzaG9sZCAwViBpbnN0ZWFkIG9mIDIuNVYgKi8KIAlCTkNfVFJJR19USFJFU0hPTERfMFZfQklUID0gMHg4MCwKIH07CiAKQEAgLTQyMiw3ICs0MjUsNyBAQAogCiBzdGF0aWMgaW5saW5lIHVpbnQ4X3QgYXR0ZW51YXRlX2JpdCh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKIHsKLQkvKiAgYXR0ZW51YXRlIGNoYW5uZWwgKCstNVYgaW5wdXQgcmFuZ2UpICovCisJLyogYXR0ZW51YXRlIGNoYW5uZWwgKCstNVYgaW5wdXQgcmFuZ2UpICovCiAJcmV0dXJuIDEgPDwgKGNoYW5uZWwgJiAweDMpOwogfTsKIApAQCAtNjI3LDE4ICs2MzAsMTggQEAKIAogc3RydWN0IHBjaWRhczY0X2JvYXJkIHsKIAljb25zdCBjaGFyICpuYW1lOwotCWludCBhaV9zZV9jaGFuczsJLyogIG51bWJlciBvZiBhaSBpbnB1dHMgaW4gc2luZ2xlLWVuZGVkIG1vZGUgKi8KLQlpbnQgYWlfYml0czsJCS8qICBhbmFsb2cgaW5wdXQgcmVzb2x1dGlvbiAqLwotCWludCBhaV9zcGVlZDsJCS8qICBmYXN0ZXN0IGNvbnZlcnNpb24gcGVyaW9kIGluIG5zICovCisJaW50IGFpX3NlX2NoYW5zOwkvKiBudW1iZXIgb2YgYWkgaW5wdXRzIGluIHNpbmdsZS1lbmRlZCBtb2RlICovCisJaW50IGFpX2JpdHM7CQkvKiBhbmFsb2cgaW5wdXQgcmVzb2x1dGlvbiAqLworCWludCBhaV9zcGVlZDsJCS8qIGZhc3Rlc3QgY29udmVyc2lvbiBwZXJpb2QgaW4gbnMgKi8KIAljb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqYWlfcmFuZ2VfdGFibGU7CiAJY29uc3QgdWludDhfdCAqYWlfcmFuZ2VfY29kZTsKLQlpbnQgYW9fbmNoYW47CQkvKiAgbnVtYmVyIG9mIGFuYWxvZyBvdXQgY2hhbm5lbHMgKi8KLQlpbnQgYW9fYml0czsJCS8qICBhbmFsb2cgb3V0cHV0IHJlc29sdXRpb24gKi8KLQlpbnQgYW9fc2Nhbl9zcGVlZDsJLyogIGFuYWxvZyBvdXRwdXQgc2NhbiBzcGVlZCAqLworCWludCBhb19uY2hhbjsJCS8qIG51bWJlciBvZiBhbmFsb2cgb3V0IGNoYW5uZWxzICovCisJaW50IGFvX2JpdHM7CQkvKiBhbmFsb2cgb3V0cHV0IHJlc29sdXRpb24gKi8KKwlpbnQgYW9fc2Nhbl9zcGVlZDsJLyogYW5hbG9nIG91dHB1dCBzY2FuIHNwZWVkICovCiAJY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgKmFvX3JhbmdlX3RhYmxlOwogCWNvbnN0IGludCAqYW9fcmFuZ2VfY29kZTsKIAljb25zdCBzdHJ1Y3QgaHdfZmlmb19pbmZvICpjb25zdCBhaV9maWZvOwotCS8qICBkaWZmZXJlbnQgYm9hcmQgZmFtaWxpZXMgaGF2ZSBzbGlnaHRseSBkaWZmZXJlbnQgcmVnaXN0ZXJzICovCisJLyogZGlmZmVyZW50IGJvYXJkIGZhbWlsaWVzIGhhdmUgc2xpZ2h0bHkgZGlmZmVyZW50IHJlZ2lzdGVycyAqLwogCWVudW0gcmVnaXN0ZXJfbGF5b3V0IGxheW91dDsKIAl1bnNpZ25lZCBoYXNfODI1NToxOwogfTsKQEAgLTY5OSw3ICs3MDIsNyBAQAogCQkuaGFzXzgyNTUJPSAxLAogCX0sCiAJW0JPQVJEX1BDSURBUzY0MDJfMTJdID0gewotCQkubmFtZQkJPSAicGNpLWRhczY0MDIvMTIiLAkvKiAgWFhYIGNoZWNrICovCisJCS5uYW1lCQk9ICJwY2ktZGFzNjQwMi8xMiIsCS8qIFhYWCBjaGVjayAqLwogCQkuYWlfc2VfY2hhbnMJPSA2NCwKIAkJLmFpX2JpdHMJPSAxMiwKIAkJLmFpX3NwZWVkCT0gNTAwMCwKQEAgLTk5Niw3ICs5OTksNyBAQAogCQkuYWlfc3BlZWQJPSA1MCwKIAkJLmFvX2JpdHMJPSAxMiwKIAkJLmFvX25jaGFuCT0gMiwKLQkJLmFvX3NjYW5fc3BlZWQJPSAwLAkvKiAgbm8gaGFyZHdhcmUgcGFjaW5nIG9uIGFvICovCisJCS5hb19zY2FuX3NwZWVkCT0gMCwJLyogbm8gaGFyZHdhcmUgcGFjaW5nIG9uIGFvICovCiAJCS5sYXlvdXQJCT0gTEFZT1VUXzQwMjAsCiAJCS5haV9yYW5nZV90YWJsZQk9ICZhaV9yYW5nZXNfNDAyMCwKIAkJLmFvX3JhbmdlX3RhYmxlCT0gJmFvX3Jhbmdlc180MDIwLApAQCAtMTAwNSw5ICsxMDA4LDcgQEAKIAkJLmhhc184MjU1CT0gMSwKIAl9LAogI2lmIDAKLQkvKgotCSAqIFRoZSBkZXZpY2UgaWQgZm9yIHRoZXNlIGJvYXJkcyBpcyB1bmtub3duCi0JICovCisJLyogVGhlIGRldmljZSBpZCBmb3IgdGhlc2UgYm9hcmRzIGlzIHVua25vd24gKi8KIAogCVtCT0FSRF9QQ0lEQVM2NDAyXzE2X0pSXSA9IHsKIAkJLm5hbWUJCT0gInBjaS1kYXM2NDAyLzE2L2pyIiwKQEAgLTExMTYsNjIgKzExMTcsNjYgQEAKIH0KIAogc3RydWN0IGV4dF9jbG9ja19pbmZvIHsKLQkvKiAgbWFzdGVyIGNsb2NrIGRpdmlzb3IgdG8gdXNlIGZvciBzY2FucyB3aXRoIGV4dGVybmFsIG1hc3RlciBjbG9jayAqLworCS8qIG1hc3RlciBjbG9jayBkaXZpc29yIHRvIHVzZSBmb3Igc2NhbnMgd2l0aCBleHRlcm5hbCBtYXN0ZXIgY2xvY2sgKi8KIAl1bnNpZ25lZCBpbnQgZGl2aXNvcjsKLQkvKiAgY2hhbnNwZWMgZm9yIG1hc3RlciBjbG9jayBpbnB1dCB3aGVuIHVzZWQgYXMgc2NhbiBiZWdpbiBzcmMgKi8KKwkvKiBjaGFuc3BlYyBmb3IgbWFzdGVyIGNsb2NrIGlucHV0IHdoZW4gdXNlZCBhcyBzY2FuIGJlZ2luIHNyYyAqLwogCXVuc2lnbmVkIGludCBjaGFuc3BlYzsKIH07CiAKIC8qIHRoaXMgc3RydWN0dXJlIGlzIGZvciBkYXRhIHVuaXF1ZSB0byB0aGlzIGhhcmR3YXJlIGRyaXZlci4gKi8KIHN0cnVjdCBwY2lkYXM2NF9wcml2YXRlIHsKLQkvKiAgYmFzZSBhZGRyZXNzZXMgKHBoeXNpY2FsKSAqLworCS8qIGJhc2UgYWRkcmVzc2VzIChwaHlzaWNhbCkgKi8KIAlyZXNvdXJjZV9zaXplX3QgbWFpbl9waHlzX2lvYmFzZTsKIAlyZXNvdXJjZV9zaXplX3QgZGlvX2NvdW50ZXJfcGh5c19pb2Jhc2U7Ci0JLyogIGJhc2UgYWRkcmVzc2VzIChpb3JlbWFwcGVkKSAqLworCS8qIGJhc2UgYWRkcmVzc2VzIChpb3JlbWFwcGVkKSAqLwogCXZvaWQgX19pb21lbSAqcGx4OTA4MF9pb2Jhc2U7CiAJdm9pZCBfX2lvbWVtICptYWluX2lvYmFzZTsKLQkvKiAgbG9jYWwgYWRkcmVzcyAodXNlZCBieSBkbWEgY29udHJvbGxlcikgKi8KKwkvKiBsb2NhbCBhZGRyZXNzICh1c2VkIGJ5IGRtYSBjb250cm9sbGVyKSAqLwogCXVpbnQzMl90IGxvY2FsMF9pb2Jhc2U7CiAJdWludDMyX3QgbG9jYWwxX2lvYmFzZTsKLQkvKiAgZG1hIGJ1ZmZlcnMgZm9yIGFuYWxvZyBpbnB1dCAqLworCS8qIGRtYSBidWZmZXJzIGZvciBhbmFsb2cgaW5wdXQgKi8KIAl1aW50MTZfdCAqYWlfYnVmZmVyW01BWF9BSV9ETUFfUklOR19DT1VOVF07Ci0JLyogIHBoeXNpY2FsIGFkZHJlc3NlcyBvZiBhaSBkbWEgYnVmZmVycyAqLworCS8qIHBoeXNpY2FsIGFkZHJlc3NlcyBvZiBhaSBkbWEgYnVmZmVycyAqLwogCWRtYV9hZGRyX3QgYWlfYnVmZmVyX2J1c19hZGRyW01BWF9BSV9ETUFfUklOR19DT1VOVF07Ci0JLyogIGFycmF5IG9mIGFpIGRtYSBkZXNjcmlwdG9ycyByZWFkIGJ5IHBseDkwODAsCi0JICogIGFsbG9jYXRlZCB0byBnZXQgcHJvcGVyIGFsaWdubWVudCAqLworCS8qCisJICogYXJyYXkgb2YgYWkgZG1hIGRlc2NyaXB0b3JzIHJlYWQgYnkgcGx4OTA4MCwKKwkgKiBhbGxvY2F0ZWQgdG8gZ2V0IHByb3BlciBhbGlnbm1lbnQKKwkgKi8KIAlzdHJ1Y3QgcGx4X2RtYV9kZXNjICphaV9kbWFfZGVzYzsKLQkvKiAgcGh5c2ljYWwgYWRkcmVzcyBvZiBhaSBkbWEgZGVzY3JpcHRvciBhcnJheSAqLworCS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgYWkgZG1hIGRlc2NyaXB0b3IgYXJyYXkgKi8KIAlkbWFfYWRkcl90IGFpX2RtYV9kZXNjX2J1c19hZGRyOwotCS8qICBpbmRleCBvZiB0aGUgYWkgZG1hIGRlc2NyaXB0b3IvYnVmZmVyCi0JICogIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIHVzZWQgKi8KKwkvKgorCSAqIGluZGV4IG9mIHRoZSBhaSBkbWEgZGVzY3JpcHRvci9idWZmZXIKKwkgKiB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyB1c2VkCisJICovCiAJdW5zaWduZWQgaW50IGFpX2RtYV9pbmRleDsKLQkvKiAgZG1hIGJ1ZmZlcnMgZm9yIGFuYWxvZyBvdXRwdXQgKi8KKwkvKiBkbWEgYnVmZmVycyBmb3IgYW5hbG9nIG91dHB1dCAqLwogCXVpbnQxNl90ICphb19idWZmZXJbQU9fRE1BX1JJTkdfQ09VTlRdOwotCS8qICBwaHlzaWNhbCBhZGRyZXNzZXMgb2YgYW8gZG1hIGJ1ZmZlcnMgKi8KKwkvKiBwaHlzaWNhbCBhZGRyZXNzZXMgb2YgYW8gZG1hIGJ1ZmZlcnMgKi8KIAlkbWFfYWRkcl90IGFvX2J1ZmZlcl9idXNfYWRkcltBT19ETUFfUklOR19DT1VOVF07CiAJc3RydWN0IHBseF9kbWFfZGVzYyAqYW9fZG1hX2Rlc2M7CiAJZG1hX2FkZHJfdCBhb19kbWFfZGVzY19idXNfYWRkcjsKLQkvKiAga2VlcHMgdHJhY2sgb2YgYnVmZmVyIHdoZXJlIHRoZSBuZXh0IGFvIHNhbXBsZSBzaG91bGQgZ28gKi8KKwkvKiBrZWVwcyB0cmFjayBvZiBidWZmZXIgd2hlcmUgdGhlIG5leHQgYW8gc2FtcGxlIHNob3VsZCBnbyAqLwogCXVuc2lnbmVkIGludCBhb19kbWFfaW5kZXg7Ci0JdW5zaWduZWQgaW50IGh3X3JldmlzaW9uOwkvKiAgc3RjIGNoaXAgaGFyZHdhcmUgcmV2aXNpb24gbnVtYmVyICovCi0JLyogIGxhc3QgYml0cyBzZW50IHRvIElOVFJfRU5BQkxFX1JFRyByZWdpc3RlciAqLworCXVuc2lnbmVkIGludCBod19yZXZpc2lvbjsJLyogc3RjIGNoaXAgaGFyZHdhcmUgcmV2aXNpb24gbnVtYmVyICovCisJLyogbGFzdCBiaXRzIHNlbnQgdG8gSU5UUl9FTkFCTEVfUkVHIHJlZ2lzdGVyICovCiAJdW5zaWduZWQgaW50IGludHJfZW5hYmxlX2JpdHM7Ci0JLyogIGxhc3QgYml0cyBzZW50IHRvIEFEQ19DT05UUk9MMV9SRUcgcmVnaXN0ZXIgKi8KKwkvKiBsYXN0IGJpdHMgc2VudCB0byBBRENfQ09OVFJPTDFfUkVHIHJlZ2lzdGVyICovCiAJdWludDE2X3QgYWRjX2NvbnRyb2wxX2JpdHM7Ci0JLyogIGxhc3QgYml0cyBzZW50IHRvIEZJRk9fU0laRV9SRUcgcmVnaXN0ZXIgKi8KKwkvKiBsYXN0IGJpdHMgc2VudCB0byBGSUZPX1NJWkVfUkVHIHJlZ2lzdGVyICovCiAJdWludDE2X3QgZmlmb19zaXplX2JpdHM7Ci0JLyogIGxhc3QgYml0cyBzZW50IHRvIEhXX0NPTkZJR19SRUcgcmVnaXN0ZXIgKi8KKwkvKiBsYXN0IGJpdHMgc2VudCB0byBIV19DT05GSUdfUkVHIHJlZ2lzdGVyICovCiAJdWludDE2X3QgaHdfY29uZmlnX2JpdHM7CiAJdWludDE2X3QgZGFjX2NvbnRyb2wxX2JpdHM7Ci0JLyogIGxhc3QgYml0cyB3cml0dGVuIHRvIHBseDkwODAgY29udHJvbCByZWdpc3RlciAqLworCS8qIGxhc3QgYml0cyB3cml0dGVuIHRvIHBseDkwODAgY29udHJvbCByZWdpc3RlciAqLwogCXVpbnQzMl90IHBseF9jb250cm9sX2JpdHM7Ci0JLyogIGxhc3QgYml0cyB3cml0dGVuIHRvIHBseCBpbnRlcnJ1cHQgY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVyICovCisJLyogbGFzdCBiaXRzIHdyaXR0ZW4gdG8gcGx4IGludGVycnVwdCBjb250cm9sIGFuZCBzdGF0dXMgcmVnaXN0ZXIgKi8KIAl1aW50MzJfdCBwbHhfaW50Y3NyX2JpdHM7Ci0JLyogIGluZGV4IG9mIGNhbGlicmF0aW9uIHNvdXJjZSByZWFkYWJsZSB0aHJvdWdoIGFpIGNoMCAqLworCS8qIGluZGV4IG9mIGNhbGlicmF0aW9uIHNvdXJjZSByZWFkYWJsZSB0aHJvdWdoIGFpIGNoMCAqLwogCWludCBjYWxpYnJhdGlvbl9zb3VyY2U7Ci0JLyogIGJpdHMgd3JpdHRlbiB0byBpMmMgY2FsaWJyYXRpb24vcmFuZ2UgcmVnaXN0ZXIgKi8KKwkvKiBiaXRzIHdyaXR0ZW4gdG8gaTJjIGNhbGlicmF0aW9uL3JhbmdlIHJlZ2lzdGVyICovCiAJdWludDhfdCBpMmNfY2FsX3JhbmdlX2JpdHM7Ci0JLyogIGNvbmZpZ3VyZSBkaWdpdGFsIHRyaWdnZXJzIHRvIHRyaWdnZXIgb24gZmFsbGluZyBlZGdlICovCisJLyogY29uZmlndXJlIGRpZ2l0YWwgdHJpZ2dlcnMgdG8gdHJpZ2dlciBvbiBmYWxsaW5nIGVkZ2UgKi8KIAl1bnNpZ25lZCBpbnQgZXh0X3RyaWdfZmFsbGluZzsKIAlzaG9ydCBhaV9jbWRfcnVubmluZzsKIAl1bnNpZ25lZCBpbnQgYWlfZmlmb19zZWdtZW50X2xlbmd0aDsKQEAgLTEyMjQsNyArMTIyOSw3IEBACiAJc3RydWN0IHBjaWRhczY0X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCS8qICBzcGlubG9jayBmb3IgcGx4IGRtYSBjb250cm9sL3N0YXR1cyByZWcgKi8KKwkvKiBzcGlubG9jayBmb3IgcGx4IGRtYSBjb250cm9sL3N0YXR1cyByZWcgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOwogCiAJcGx4OTA4MF9hYm9ydF9kbWEoZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UsIGNoYW5uZWwpOwpAQCAtMTI3MSw3ICsxMjc2LDcgQEAKIAkgKiBpZiBDTURGX1dBS0VfRU9TIGZsYWcgaXMgc2V0LgogCSAqLwogCWlmIChjbWQtPmZsYWdzICYgQ01ERl9XQUtFX0VPUykgewotCQkvKiAgNDAyMCBkb2Vzbid0IHN1cHBvcnQgcGlvIHRyYW5zZmVycyBleGNlcHQgZm9yIGZpZm8gZHJlZ3MgKi8KKwkJLyogNDAyMCBkb2Vzbid0IHN1cHBvcnQgcGlvIHRyYW5zZmVycyBleGNlcHQgZm9yIGZpZm8gZHJlZ3MgKi8KIAkJaWYgKGJvYXJkLT5sYXlvdXQgIT0gTEFZT1VUXzQwMjApCiAJCQliaXRzIHw9IEFEQ19JTlRSX0VPU0NBTl9CSVRTIHwgRU5fQURDX0lOVFJfU1JDX0JJVDsKIAl9CkBAIC0xMzA1LDM2ICsxMzEwLDQwIEBACiAJYWJvcnRfZG1hKGRldiwgMCk7CiAJYWJvcnRfZG1hKGRldiwgMSk7CiAKLQkvKiAgY29uZmlndXJlIGRtYTAgbW9kZSAqLworCS8qIGNvbmZpZ3VyZSBkbWEwIG1vZGUgKi8KIAliaXRzID0gMDsKLQkvKiAgZW5hYmxlIHJlYWR5IGlucHV0LCBub3Qgc3VyZSBpZiB0aGlzIGlzIG5lY2Vzc2FyeSAqLworCS8qIGVuYWJsZSByZWFkeSBpbnB1dCwgbm90IHN1cmUgaWYgdGhpcyBpcyBuZWNlc3NhcnkgKi8KIAliaXRzIHw9IFBMWF9ETUFNT0RFX1JFQURZSUVOOwotCS8qICBlbmFibGUgYnRlcm0sIG5vdCBzdXJlIGlmIHRoaXMgaXMgbmVjZXNzYXJ5ICovCisJLyogZW5hYmxlIGJ0ZXJtLCBub3Qgc3VyZSBpZiB0aGlzIGlzIG5lY2Vzc2FyeSAqLwogCWJpdHMgfD0gUExYX0RNQU1PREVfQlRFUk1JRU47Ci0JLyogIGVuYWJsZSBkbWEgY2hhaW5pbmcgKi8KKwkvKiBlbmFibGUgZG1hIGNoYWluaW5nICovCiAJYml0cyB8PSBQTFhfRE1BTU9ERV9DSEFJTkVOOwotCS8qICBlbmFibGUgaW50ZXJydXB0IG9uIGRtYSBkb25lCi0JICogIChwcm9iYWJseSBkb24ndCBuZWVkIHRoaXMsIHNpbmNlIGNoYWluIG5ldmVyIGZpbmlzaGVzKSAqLworCS8qCisJICogZW5hYmxlIGludGVycnVwdCBvbiBkbWEgZG9uZQorCSAqIChwcm9iYWJseSBkb24ndCBuZWVkIHRoaXMsIHNpbmNlIGNoYWluIG5ldmVyIGZpbmlzaGVzKQorCSAqLwogCWJpdHMgfD0gUExYX0RNQU1PREVfRE9ORUlFTjsKLQkvKiAgZG9uJ3QgaW5jcmVtZW50IGxvY2FsIGFkZHJlc3MgZHVyaW5nIHRyYW5zZmVycwotCSAqICAod2UgYXJlIHRyYW5zZmVycmluZyBmcm9tIGEgZml4ZWQgZmlmbyByZWdpc3RlcikgKi8KKwkvKgorCSAqIGRvbid0IGluY3JlbWVudCBsb2NhbCBhZGRyZXNzIGR1cmluZyB0cmFuc2ZlcnMKKwkgKiAod2UgYXJlIHRyYW5zZmVycmluZyBmcm9tIGEgZml4ZWQgZmlmbyByZWdpc3RlcikKKwkgKi8KIAliaXRzIHw9IFBMWF9ETUFNT0RFX0xBQ09OU1Q7Ci0JLyogIHJvdXRlIGRtYSBpbnRlcnJ1cHQgdG8gcGNpIGJ1cyAqLworCS8qIHJvdXRlIGRtYSBpbnRlcnJ1cHQgdG8gcGNpIGJ1cyAqLwogCWJpdHMgfD0gUExYX0RNQU1PREVfSU5UUlBDSTsKLQkvKiAgZW5hYmxlIGRlbWFuZCBtb2RlICovCisJLyogZW5hYmxlIGRlbWFuZCBtb2RlICovCiAJYml0cyB8PSBQTFhfRE1BTU9ERV9ERU1BTkQ7Ci0JLyogIGVuYWJsZSBsb2NhbCBidXJzdCBtb2RlICovCisJLyogZW5hYmxlIGxvY2FsIGJ1cnN0IG1vZGUgKi8KIAliaXRzIHw9IFBMWF9ETUFNT0RFX0JVUlNURU47Ci0JLyogIDQwMjAgdXNlcyAzMiBiaXQgZG1hICovCisJLyogNDAyMCB1c2VzIDMyIGJpdCBkbWEgKi8KIAlpZiAoYm9hcmQtPmxheW91dCA9PSBMQVlPVVRfNDAyMCkKLQkJYml0cyB8PSBQTFhfRE1BTU9ERV9XSURUSDMyOwotCWVsc2UJCS8qICBsb2NhbHNwYWNlMCBidXMgaXMgMTYgYml0cyB3aWRlICovCi0JCWJpdHMgfD0gUExYX0RNQU1PREVfV0lEVEgxNjsKKwkJYml0cyB8PSBQTFhfRE1BTU9ERV9XSURUSF8zMjsKKwllbHNlCQkJCS8qIGxvY2Fsc3BhY2UwIGJ1cyBpcyAxNiBiaXRzIHdpZGUgKi8KKwkJYml0cyB8PSBQTFhfRE1BTU9ERV9XSURUSF8xNjsKIAl3cml0ZWwoYml0cywgcGx4X2lvYmFzZSArIFBMWF9SRUdfRE1BTU9ERTEpOwogCWlmIChhb19jbWRfaXNfc3VwcG9ydGVkKGJvYXJkKSkKIAkJd3JpdGVsKGJpdHMsIHBseF9pb2Jhc2UgKyBQTFhfUkVHX0RNQU1PREUwKTsKIAotCS8qICBlbmFibGUgaW50ZXJydXB0cyBvbiBwbHggOTA4MCAqLworCS8qIGVuYWJsZSBpbnRlcnJ1cHRzIG9uIHBseCA5MDgwICovCiAJZGV2cHJpdi0+cGx4X2ludGNzcl9iaXRzIHw9CiAJICAgIFBMWF9JTlRDU1JfTFNFQUJPUlRFTiB8IFBMWF9JTlRDU1JfTFNFUEFSSVRZRU4gfCBQTFhfSU5UQ1NSX1BJRU4gfAogCSAgICBQTFhfSU5UQ1NSX1BMSUVOIHwgUExYX0lOVENTUl9QQUJPUlRJRU4gfCBQTFhfSU5UQ1NSX0xJT0VOIHwKQEAgLTEzNzYsNyArMTM4NSw3IEBACiAJaWYgKG51bV9lbnRyaWVzID4gZmlmby0+bWF4X3NlZ21lbnRfbGVuZ3RoKQogCQludW1fZW50cmllcyA9IGZpZm8tPm1heF9zZWdtZW50X2xlbmd0aDsKIAotCS8qICAxID09IDI1NiBlbnRyaWVzLCAyID09IDUxMiBlbnRyaWVzLCBldGMgKi8KKwkvKiAxID09IDI1NiBlbnRyaWVzLCAyID09IDUxMiBlbnRyaWVzLCBldGMgKi8KIAludW1faW5jcmVtZW50cyA9IERJVl9ST1VORF9DTE9TRVNUKG51bV9lbnRyaWVzLCBpbmNyZW1lbnRfc2l6ZSk7CiAKIAliaXRzID0gKH4obnVtX2luY3JlbWVudHMgLSAxKSkgJiBmaWZvLT5maWZvX3NpemVfcmVnX21hc2s7CkBAIC0xNDQyLDcgKzE0NTEsNyBAQAogCXdyaXRldyhkZXZwcml2LT5hZGNfY29udHJvbDFfYml0cywKIAkgICAgICAgZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBBRENfQ09OVFJPTDFfUkVHKTsKIAotCS8qICA2NDAyLzE2IG1hbnVhbCBzYXlzIHRoaXMgcmVnaXN0ZXIgbXVzdCBiZSBpbml0aWFsaXplZCB0byAweGZmPyAqLworCS8qIDY0MDIvMTYgbWFudWFsIHNheXMgdGhpcyByZWdpc3RlciBtdXN0IGJlIGluaXRpYWxpemVkIHRvIDB4ZmY/ICovCiAJd3JpdGV3KDB4ZmYsIGRldnByaXYtPm1haW5faW9iYXNlICsgQURDX1NBTVBMRV9JTlRFUlZBTF9VUFBFUl9SRUcpOwogCiAJYml0cyA9IFNMT1dfREFDX0JJVCB8IERNQV9DSF9TRUxFQ1RfQklUOwpAQCAtMTQ1Nyw3ICsxNDY2LDcgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKIAotCS8qICBzZXQgZmlmb3MgdG8gbWF4aW11bSBzaXplICovCisJLyogc2V0IGZpZm9zIHRvIG1heGltdW0gc2l6ZSAqLwogCWRldnByaXYtPmZpZm9fc2l6ZV9iaXRzIHw9IERBQ19GSUZPX0JJVFM7CiAJc2V0X2FpX2ZpZm9fc2VnbWVudF9sZW5ndGgoZGV2LCBib2FyZC0+YWlfZmlmby0+bWF4X3NlZ21lbnRfbGVuZ3RoKTsKIApAQCAtMTQ3OCw3ICsxNDg3LDcgQEAKIAlzdHJ1Y3QgcGNpZGFzNjRfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlpbnQgaTsKIAotCS8qICBhbGxvY2F0ZSBwY2kgZG1hIGJ1ZmZlcnMgKi8KKwkvKiBhbGxvY2F0ZSBwY2kgZG1hIGJ1ZmZlcnMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgYWlfZG1hX3JpbmdfY291bnQoYm9hcmQpOyBpKyspIHsKIAkJZGV2cHJpdi0+YWlfYnVmZmVyW2ldID0KIAkJCWRtYV9hbGxvY19jb2hlcmVudCgmcGNpZGV2LT5kZXYsIERNQV9CVUZGRVJfU0laRSwKQEAgLTE0OTksNyArMTUwOCw3IEBACiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAl9Ci0JLyogIGFsbG9jYXRlIGRtYSBkZXNjcmlwdG9ycyAqLworCS8qIGFsbG9jYXRlIGRtYSBkZXNjcmlwdG9ycyAqLwogCWRldnByaXYtPmFpX2RtYV9kZXNjID0KIAkJZG1hX2FsbG9jX2NvaGVyZW50KCZwY2lkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBwbHhfZG1hX2Rlc2MpICoKIAkJCQkgICBhaV9kbWFfcmluZ19jb3VudChib2FyZCksCkBAIC0xNTE3LDcgKzE1MjYsNyBAQAogCQlpZiAoIWRldnByaXYtPmFvX2RtYV9kZXNjKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJfQotCS8qICBpbml0aWFsaXplIGRtYSBkZXNjcmlwdG9ycyAqLworCS8qIGluaXRpYWxpemUgZG1hIGRlc2NyaXB0b3JzICovCiAJZm9yIChpID0gMDsgaSA8IGFpX2RtYV9yaW5nX2NvdW50KGJvYXJkKTsgaSsrKSB7CiAJCWRldnByaXYtPmFpX2RtYV9kZXNjW2ldLnBjaV9zdGFydF9hZGRyID0KIAkJCWNwdV90b19sZTMyKGRldnByaXYtPmFpX2J1ZmZlcl9idXNfYWRkcltpXSk7CkBAIC0xNjE4LDEzICsxNjI3LDExIEBACiAJdm9pZCBfX2lvbWVtICpwbHhfY29udHJvbF9hZGRyID0gZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UgKwogCQkJCQkgUExYX1JFR19DTlRSTDsKIAotCWlmIChzdGF0ZSkgewotCQkvKiAgc2V0IGRhdGEgbGluZSBoaWdoICovCisJaWYgKHN0YXRlKSB7CQkJCS8qIHNldCBkYXRhIGxpbmUgaGlnaCAqLwogCQlkZXZwcml2LT5wbHhfY29udHJvbF9iaXRzICY9IH5kYXRhX2JpdDsKIAkJd3JpdGVsKGRldnByaXYtPnBseF9jb250cm9sX2JpdHMsIHBseF9jb250cm9sX2FkZHIpOwogCQl1ZGVsYXkoaTJjX2hpZ2hfdWRlbGF5KTsKLQl9IGVsc2UgewkJLyogIHNldCBkYXRhIGxpbmUgbG93ICovCi0KKwl9IGVsc2UgewkJCQkvKiBzZXQgZGF0YSBsaW5lIGxvdyAqLwogCQlkZXZwcml2LT5wbHhfY29udHJvbF9iaXRzIHw9IGRhdGFfYml0OwogCQl3cml0ZWwoZGV2cHJpdi0+cGx4X2NvbnRyb2xfYml0cywgcGx4X2NvbnRyb2xfYWRkcik7CiAJCXVkZWxheShpMmNfbG93X3VkZWxheSk7CkBAIC0xNjM5LDEzICsxNjQ2LDExIEBACiAJdm9pZCBfX2lvbWVtICpwbHhfY29udHJvbF9hZGRyID0gZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UgKwogCQkJCQkgUExYX1JFR19DTlRSTDsKIAotCWlmIChzdGF0ZSkgewotCQkvKiAgc2V0IGNsb2NrIGxpbmUgaGlnaCAqLworCWlmIChzdGF0ZSkgewkJCQkvKiBzZXQgY2xvY2sgbGluZSBoaWdoICovCiAJCWRldnByaXYtPnBseF9jb250cm9sX2JpdHMgJj0gfmNsb2NrX2JpdDsKIAkJd3JpdGVsKGRldnByaXYtPnBseF9jb250cm9sX2JpdHMsIHBseF9jb250cm9sX2FkZHIpOwogCQl1ZGVsYXkoaTJjX2hpZ2hfdWRlbGF5KTsKLQl9IGVsc2UgewkJLyogIHNldCBjbG9jayBsaW5lIGxvdyAqLwotCisJfSBlbHNlIHsJCQkJLyogc2V0IGNsb2NrIGxpbmUgbG93ICovCiAJCWRldnByaXYtPnBseF9jb250cm9sX2JpdHMgfD0gY2xvY2tfYml0OwogCQl3cml0ZWwoZGV2cHJpdi0+cGx4X2NvbnRyb2xfYml0cywgcGx4X2NvbnRyb2xfYWRkcik7CiAJCXVkZWxheShpMmNfbG93X3VkZWxheSk7CkBAIC0xNjc0LDcgKzE2NzksNyBAQAogCWkyY19zZXRfc2RhKGRldiwgMSk7CiAJaTJjX3NldF9zY2woZGV2LCAxKTsKIAotCXJldHVybiAwOwkJLyogIHJldHVybiBmYWtlIGFja25vd2xlZGdlIGJpdCAqLworCXJldHVybiAwOwkJLyogcmV0dXJuIGZha2UgYWNrbm93bGVkZ2UgYml0ICovCiB9CiAKIC8qIHNlbmQgc3RhcnQgYml0ICovCkBAIC0xNzA3LDIzICsxNzEyLDIzIEBACiAJICogZWVwcm9tIGFuZCBpMmMgYnVzCiAJICovCiAKLQkvKiAgbWFrZSBzdXJlIHdlIGRvbnQgc2VuZCBhbnl0aGluZyB0byBlZXByb20gKi8KKwkvKiBtYWtlIHN1cmUgd2UgZG9udCBzZW5kIGFueXRoaW5nIHRvIGVlcHJvbSAqLwogCWRldnByaXYtPnBseF9jb250cm9sX2JpdHMgJj0gflBMWF9DTlRSTF9FRUNTOwogCiAJaTJjX3N0b3AoZGV2KTsKIAlpMmNfc3RhcnQoZGV2KTsKIAotCS8qICBzZW5kIGFkZHJlc3MgYW5kIHdyaXRlIGJpdCAqLworCS8qIHNlbmQgYWRkcmVzcyBhbmQgd3JpdGUgYml0ICovCiAJYml0c3RyZWFtID0gKGFkZHJlc3MgPDwgMSkgJiB+cmVhZF9iaXQ7CiAJaTJjX3dyaXRlX2J5dGUoZGV2LCBiaXRzdHJlYW0pOwogCi0JLyogIGdldCBhY2tub3dsZWRnZSAqLworCS8qIGdldCBhY2tub3dsZWRnZSAqLwogCWlmIChpMmNfcmVhZF9hY2soZGV2KSAhPSAwKSB7CiAJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJmYWlsZWQ6IG5vIGFja25vd2xlZGdlXG4iKTsKIAkJaTJjX3N0b3AoZGV2KTsKIAkJcmV0dXJuOwogCX0KLQkvKiAgd3JpdGUgZGF0YSBieXRlcyAqLworCS8qIHdyaXRlIGRhdGEgYnl0ZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKIAkJaTJjX3dyaXRlX2J5dGUoZGV2LCBkYXRhW2ldKTsKIAkJaWYgKGkyY19yZWFkX2FjayhkZXYpICE9IDApIHsKQEAgLTE3NzAsOCArMTc3NSw4IEBACiAJcmFuZ2UgPSBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYyk7CiAJYXJlZiA9IENSX0FSRUYoaW5zbi0+Y2hhbnNwZWMpOwogCi0JLyogIGRpc2FibGUgY2FyZCdzIGFuYWxvZyBpbnB1dCBpbnRlcnJ1cHQgc291cmNlcyBhbmQgcGFjaW5nICovCi0JLyogIDQwMjAgZ2VuZXJhdGVzIGRhYyBkb25lIGludGVycnVwdHMgZXZlbiB0aG91Z2ggdGhleSBhcmUgZGlzYWJsZWQgKi8KKwkvKiBkaXNhYmxlIGNhcmQncyBhbmFsb2cgaW5wdXQgaW50ZXJydXB0IHNvdXJjZXMgYW5kIHBhY2luZyAqLworCS8qIDQwMjAgZ2VuZXJhdGVzIGRhYyBkb25lIGludGVycnVwdHMgZXZlbiB0aG91Z2ggdGhleSBhcmUgZGlzYWJsZWQgKi8KIAlkaXNhYmxlX2FpX3BhY2luZyhkZXYpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKQEAgLTE3ODQsMTIgKzE3ODksMTIgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CiAKIAlpZiAoYm9hcmQtPmxheW91dCAhPSBMQVlPVVRfNDAyMCkgewotCQkvKiAgdXNlIGludGVybmFsIHF1ZXVlICovCisJCS8qIHVzZSBpbnRlcm5hbCBxdWV1ZSAqLwogCQlkZXZwcml2LT5od19jb25maWdfYml0cyAmPSB+RVhUX1FVRVVFX0JJVDsKIAkJd3JpdGV3KGRldnByaXYtPmh3X2NvbmZpZ19iaXRzLAogCQkgICAgICAgZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBIV19DT05GSUdfUkVHKTsKIAotCQkvKiAgQUxUX1NPVVJDRSBpcyBpbnRlcm5hbCBjYWxpYnJhdGlvbiByZWZlcmVuY2UgKi8KKwkJLyogQUxUX1NPVVJDRSBpcyBpbnRlcm5hbCBjYWxpYnJhdGlvbiByZWZlcmVuY2UgKi8KIAkJaWYgKGluc24tPmNoYW5zcGVjICYgQ1JfQUxUX1NPVVJDRSkgewogCQkJdW5zaWduZWQgaW50IGNhbF9lbl9iaXQ7CiAKQEAgLTE4MTEsMTkgKzE4MTYsMTkgQEAKIAkJCSAqLwogCQkJd3JpdGV3KDAsIGRldnByaXYtPm1haW5faW9iYXNlICsgQ0FMSUJSQVRJT05fUkVHKTsKIAkJfQotCQkvKiAgbG9hZCBpbnRlcm5hbCBxdWV1ZSAqLworCQkvKiBsb2FkIGludGVybmFsIHF1ZXVlICovCiAJCWJpdHMgPSAwOwotCQkvKiAgc2V0IGdhaW4gKi8KKwkJLyogc2V0IGdhaW4gKi8KIAkJYml0cyB8PSBhaV9yYW5nZV9iaXRzXzZ4eHgoZGV2LCBDUl9SQU5HRShpbnNuLT5jaGFuc3BlYykpOwotCQkvKiAgc2V0IHNpbmdsZS1lbmRlZCAvIGRpZmZlcmVudGlhbCAqLworCQkvKiBzZXQgc2luZ2xlLWVuZGVkIC8gZGlmZmVyZW50aWFsICovCiAJCWJpdHMgfD0gc2VfZGlmZl9iaXRfNnh4eChkZXYsIGFyZWYgPT0gQVJFRl9ESUZGKTsKIAkJaWYgKGFyZWYgPT0gQVJFRl9DT01NT04pCiAJCQliaXRzIHw9IEFEQ19DT01NT05fQklUOwogCQliaXRzIHw9IGFkY19jaGFuX2JpdHMoY2hhbm5lbCk7Ci0JCS8qICBzZXQgc3RvcCBjaGFubmVsICovCisJCS8qIHNldCBzdG9wIGNoYW5uZWwgKi8KIAkJd3JpdGV3KGFkY19jaGFuX2JpdHMoY2hhbm5lbCksCiAJCSAgICAgICBkZXZwcml2LT5tYWluX2lvYmFzZSArIEFEQ19RVUVVRV9ISUdIX1JFRyk7Ci0JCS8qICBzZXQgc3RhcnQgY2hhbm5lbCwgYW5kIHJlc3Qgb2Ygc2V0dGluZ3MgKi8KKwkJLyogc2V0IHN0YXJ0IGNoYW5uZWwsIGFuZCByZXN0IG9mIHNldHRpbmdzICovCiAJCXdyaXRldyhiaXRzLCBkZXZwcml2LT5tYWluX2lvYmFzZSArIEFEQ19RVUVVRV9MT0FEX1JFRyk7CiAJfSBlbHNlIHsKIAkJdWludDhfdCBvbGRfY2FsX3JhbmdlX2JpdHMgPSBkZXZwcml2LT5pMmNfY2FsX3JhbmdlX2JpdHM7CkBAIC0xODM1LDcgKzE4NDAsNyBAQAogCQl9IGVsc2UgewkvKiBzZWxlY3QgQk5DIGlucHV0cyAqLwogCQkJZGV2cHJpdi0+aTJjX2NhbF9yYW5nZV9iaXRzIHw9IGFkY19zcmNfNDAyMF9iaXRzKDQpOwogCQl9Ci0JCS8qICBzZWxlY3QgcmFuZ2UgKi8KKwkJLyogc2VsZWN0IHJhbmdlICovCiAJCWlmIChyYW5nZSA9PSAwKQogCQkJZGV2cHJpdi0+aTJjX2NhbF9yYW5nZV9iaXRzIHw9IGF0dGVudWF0ZV9iaXQoY2hhbm5lbCk7CiAJCWVsc2UKQEAgLTE4NjIsMTQgKzE4NjcsMTQgQEAKIAl9CiAKIAlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7Ci0JCS8qICBjbGVhciBhZGMgYnVmZmVyIChpbnNpZGUgbG9vcCBmb3IgNDAyMCBzYWtlKSAqLworCQkvKiBjbGVhciBhZGMgYnVmZmVyIChpbnNpZGUgbG9vcCBmb3IgNDAyMCBzYWtlKSAqLwogCQl3cml0ZXcoMCwgZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBBRENfQlVGRkVSX0NMRUFSX1JFRyk7CiAKIAkJLyogdHJpZ2dlciBjb252ZXJzaW9uLCBiaXRzIHNlbnQgb25seSBtYXR0ZXIgZm9yIDQwMjAgKi8KIAkJd3JpdGV3KGFkY19jb252ZXJ0X2NoYW5fNDAyMF9iaXRzKENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpKSwKIAkJICAgICAgIGRldnByaXYtPm1haW5faW9iYXNlICsgQURDX0NPTlZFUlRfUkVHKTsKIAotCQkvKiAgd2FpdCBmb3IgZGF0YSAqLworCQkvKiB3YWl0IGZvciBkYXRhICovCiAJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgY2JfcGNpZGFzNjRfYWlfZW9jLCAwKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CkBAIC0yMjQ5LDcgKzIyNTQsNyBAQAogewogCXN0cnVjdCBwY2lkYXM2NF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCi0JLyogIGxvYWQgaGFyZHdhcmUgY29udmVyc2lvbiBjb3VudGVyICovCisJLyogbG9hZCBoYXJkd2FyZSBjb252ZXJzaW9uIGNvdW50ZXIgKi8KIAlpZiAodXNlX2h3X3NhbXBsZV9jb3VudGVyKGNtZCkpIHsKIAkJd3JpdGV3KGNtZC0+c3RvcF9hcmcgJiAweGZmZmYsCiAJCSAgICAgICBkZXZwcml2LT5tYWluX2lvYmFzZSArIEFEQ19DT1VOVF9MT1dFUl9SRUcpOwpAQCAtMjI3Nyw3ICsyMjgyLDcgQEAKIHN0YXRpYyB1aW50MzJfdCBhaV9jb252ZXJ0X2NvdW50ZXJfNnh4eChjb25zdCBzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJCQljb25zdCBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQogewotCS8qICBzdXBwb3NlZCB0byBsb2FkIGNvdW50ZXIgd2l0aCBkZXNpcmVkIGRpdmlzb3IgbWludXMgMyAqLworCS8qIHN1cHBvc2VkIHRvIGxvYWQgY291bnRlciB3aXRoIGRlc2lyZWQgZGl2aXNvciBtaW51cyAzICovCiAJcmV0dXJuIGNtZC0+Y29udmVydF9hcmcgLyBUSU1FUl9CQVNFIC0gMzsKIH0KIApAQCAtMjI4Niw3ICsyMjkxLDcgQEAKIHsKIAl1aW50MzJfdCBjb3VudDsKIAotCS8qICBmaWd1cmUgb3V0IGhvdyBsb25nIHdlIG5lZWQgdG8gZGVsYXkgYXQgZW5kIG9mIHNjYW4gKi8KKwkvKiBmaWd1cmUgb3V0IGhvdyBsb25nIHdlIG5lZWQgdG8gZGVsYXkgYXQgZW5kIG9mIHNjYW4gKi8KIAlzd2l0Y2ggKGNtZC0+c2Nhbl9iZWdpbl9zcmMpIHsKIAljYXNlIFRSSUdfVElNRVI6CiAJCWNvdW50ID0gKGNtZC0+c2Nhbl9iZWdpbl9hcmcgLQpAQCAtMjMxNSwxMyArMjMyMCwxMyBAQAogCWNhc2UgVFJJR19PVEhFUjoKIAkJZGl2aXNvciA9IGRldnByaXYtPmV4dF9jbG9jay5kaXZpc29yOwogCQlicmVhazsKLQlkZWZhdWx0OgkJLyogIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwlkZWZhdWx0OgkJLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwogCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiYnVnISBmYWlsZWQgdG8gc2V0IGFpIHBhY2luZyFcbiIpOwogCQlkaXZpc29yID0gMTAwMDsKIAkJYnJlYWs7CiAJfQogCi0JLyogIHN1cHBvc2VkIHRvIGxvYWQgY291bnRlciB3aXRoIGRlc2lyZWQgZGl2aXNvciBtaW51cyAyIGZvciA0MDIwICovCisJLyogc3VwcG9zZWQgdG8gbG9hZCBjb3VudGVyIHdpdGggZGVzaXJlZCBkaXZpc29yIG1pbnVzIDIgZm9yIDQwMjAgKi8KIAlyZXR1cm4gZGl2aXNvciAtIDI7CiB9CiAKQEAgLTIzMzAsNyArMjMzNSw3IEBACiB7CiAJc3RydWN0IHBjaWRhczY0X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAKLQkvKiAgc2VsZWN0IGludGVybmFsL2V4dGVybmFsIG1hc3RlciBjbG9jayAqLworCS8qIHNlbGVjdCBpbnRlcm5hbC9leHRlcm5hbCBtYXN0ZXIgY2xvY2sgKi8KIAlkZXZwcml2LT5od19jb25maWdfYml0cyAmPSB+TUFTVEVSX0NMT0NLXzQwMjBfTUFTSzsKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX09USEVSKSB7CiAJCWludCBjaGFuc3BlYyA9IGRldnByaXYtPmV4dF9jbG9jay5jaGFuc3BlYzsKQEAgLTIzNjYsNyArMjM3MSw3IEBACiAJc3RydWN0IHBjaWRhczY0X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCS8qICBzcGlubG9jayBmb3IgcGx4IGRtYSBjb250cm9sL3N0YXR1cyByZWcgKi8KKwkvKiBzcGlubG9jayBmb3IgcGx4IGRtYSBjb250cm9sL3N0YXR1cyByZWcgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOwogCXdyaXRlYihQTFhfRE1BQ1NSX0VOQUJMRSB8IFBMWF9ETUFDU1JfU1RBUlQgfCBQTFhfRE1BQ1NSX0NMRUFSSU5UUiwKIAkgICAgICAgZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UgKyBQTFhfUkVHX0RNQUNTUihjaGFubmVsKSk7CkBAIC0yMzkwLDE2ICsyMzk1LDE2IEBACiAJCXNjYW5fY291bnRlciA9IGFpX3NjYW5fY291bnRlcl82eHh4KGRldiwgY21kKTsKIAl9CiAKLQkvKiAgbG9hZCBsb3dlciAxNiBiaXRzIG9mIGNvbnZlcnQgaW50ZXJ2YWwgKi8KKwkvKiBsb2FkIGxvd2VyIDE2IGJpdHMgb2YgY29udmVydCBpbnRlcnZhbCAqLwogCXdyaXRldyhjb252ZXJ0X2NvdW50ZXIgJiAweGZmZmYsCiAJICAgICAgIGRldnByaXYtPm1haW5faW9iYXNlICsgQURDX1NBTVBMRV9JTlRFUlZBTF9MT1dFUl9SRUcpOwotCS8qICBsb2FkIHVwcGVyIDggYml0cyBvZiBjb252ZXJ0IGludGVydmFsICovCisJLyogbG9hZCB1cHBlciA4IGJpdHMgb2YgY29udmVydCBpbnRlcnZhbCAqLwogCXdyaXRldygoY29udmVydF9jb3VudGVyID4+IDE2KSAmIDB4ZmYsCiAJICAgICAgIGRldnByaXYtPm1haW5faW9iYXNlICsgQURDX1NBTVBMRV9JTlRFUlZBTF9VUFBFUl9SRUcpOwotCS8qICBsb2FkIGxvd2VyIDE2IGJpdHMgb2Ygc2NhbiBkZWxheSAqLworCS8qIGxvYWQgbG93ZXIgMTYgYml0cyBvZiBzY2FuIGRlbGF5ICovCiAJd3JpdGV3KHNjYW5fY291bnRlciAmIDB4ZmZmZiwKIAkgICAgICAgZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBBRENfREVMQVlfSU5URVJWQUxfTE9XRVJfUkVHKTsKLQkvKiAgbG9hZCB1cHBlciA4IGJpdHMgb2Ygc2NhbiBkZWxheSAqLworCS8qIGxvYWQgdXBwZXIgOCBiaXRzIG9mIHNjYW4gZGVsYXkgKi8KIAl3cml0ZXcoKHNjYW5fY291bnRlciA+PiAxNikgJiAweGZmLAogCSAgICAgICBkZXZwcml2LT5tYWluX2lvYmFzZSArIEFEQ19ERUxBWV9JTlRFUlZBTF9VUFBFUl9SRUcpOwogfQpAQCAtMjQzNSwyNiArMjQ0MCwyNiBAQAogCQkJd3JpdGV3KGRldnByaXYtPmh3X2NvbmZpZ19iaXRzLAogCQkJICAgICAgIGRldnByaXYtPm1haW5faW9iYXNlICsgSFdfQ09ORklHX1JFRyk7CiAJCQliaXRzID0gMDsKLQkJCS8qICBzZXQgY2hhbm5lbCAqLworCQkJLyogc2V0IGNoYW5uZWwgKi8KIAkJCWJpdHMgfD0gYWRjX2NoYW5fYml0cyhDUl9DSEFOKGNtZC0+Y2hhbmxpc3RbMF0pKTsKLQkJCS8qICBzZXQgZ2FpbiAqLworCQkJLyogc2V0IGdhaW4gKi8KIAkJCWJpdHMgfD0gYWlfcmFuZ2VfYml0c182eHh4KGRldiwKIAkJCQkJCSAgIENSX1JBTkdFKGNtZC0+Y2hhbmxpc3RbMF0pKTsKLQkJCS8qICBzZXQgc2luZ2xlLWVuZGVkIC8gZGlmZmVyZW50aWFsICovCisJCQkvKiBzZXQgc2luZ2xlLWVuZGVkIC8gZGlmZmVyZW50aWFsICovCiAJCQliaXRzIHw9IHNlX2RpZmZfYml0XzZ4eHgoZGV2LAogCQkJCQkJIENSX0FSRUYoY21kLT5jaGFubGlzdFswXSkgPT0KIAkJCQkJCSBBUkVGX0RJRkYpOwogCQkJaWYgKENSX0FSRUYoY21kLT5jaGFubGlzdFswXSkgPT0gQVJFRl9DT01NT04pCiAJCQkJYml0cyB8PSBBRENfQ09NTU9OX0JJVDsKLQkJCS8qICBzZXQgc3RvcCBjaGFubmVsICovCisJCQkvKiBzZXQgc3RvcCBjaGFubmVsICovCiAJCQl3cml0ZXcoYWRjX2NoYW5fYml0cwogCQkJICAgICAgIChDUl9DSEFOKGNtZC0+Y2hhbmxpc3RbY21kLT5jaGFubGlzdF9sZW4gLSAxXSkpLAogCQkJICAgICAgIGRldnByaXYtPm1haW5faW9iYXNlICsgQURDX1FVRVVFX0hJR0hfUkVHKTsKLQkJCS8qICBzZXQgc3RhcnQgY2hhbm5lbCwgYW5kIHJlc3Qgb2Ygc2V0dGluZ3MgKi8KKwkJCS8qIHNldCBzdGFydCBjaGFubmVsLCBhbmQgcmVzdCBvZiBzZXR0aW5ncyAqLwogCQkJd3JpdGV3KGJpdHMsCiAJCQkgICAgICAgZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBBRENfUVVFVUVfTE9BRF9SRUcpOwogCQl9IGVsc2UgewotCQkJLyogIHVzZSBleHRlcm5hbCBxdWV1ZSAqLworCQkJLyogdXNlIGV4dGVybmFsIHF1ZXVlICovCiAJCQlpZiAoZGV2LT53cml0ZV9zdWJkZXYgJiYgZGV2LT53cml0ZV9zdWJkZXYtPmJ1c3kpIHsKIAkJCQl3YXJuX2V4dGVybmFsX3F1ZXVlKGRldik7CiAJCQkJcmV0dXJuIC1FQlVTWTsKQEAgLTI0NjIsMzAgKzI0NjcsMzAgQEAKIAkJCWRldnByaXYtPmh3X2NvbmZpZ19iaXRzIHw9IEVYVF9RVUVVRV9CSVQ7CiAJCQl3cml0ZXcoZGV2cHJpdi0+aHdfY29uZmlnX2JpdHMsCiAJCQkgICAgICAgZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBIV19DT05GSUdfUkVHKTsKLQkJCS8qICBjbGVhciBEQUMgYnVmZmVyIHRvIHByZXZlbnQgd2VpcmQgaW50ZXJhY3Rpb25zICovCisJCQkvKiBjbGVhciBEQUMgYnVmZmVyIHRvIHByZXZlbnQgd2VpcmQgaW50ZXJhY3Rpb25zICovCiAJCQl3cml0ZXcoMCwKIAkJCSAgICAgICBkZXZwcml2LT5tYWluX2lvYmFzZSArIERBQ19CVUZGRVJfQ0xFQVJfUkVHKTsKLQkJCS8qICBjbGVhciBxdWV1ZSBwb2ludGVyICovCisJCQkvKiBjbGVhciBxdWV1ZSBwb2ludGVyICovCiAJCQl3cml0ZXcoMCwgZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBBRENfUVVFVUVfQ0xFQVJfUkVHKTsKLQkJCS8qICBsb2FkIGV4dGVybmFsIHF1ZXVlICovCisJCQkvKiBsb2FkIGV4dGVybmFsIHF1ZXVlICovCiAJCQlmb3IgKGkgPSAwOyBpIDwgY21kLT5jaGFubGlzdF9sZW47IGkrKykgewogCQkJCWJpdHMgPSAwOwotCQkJCS8qICBzZXQgY2hhbm5lbCAqLworCQkJCS8qIHNldCBjaGFubmVsICovCiAJCQkJYml0cyB8PSBhZGNfY2hhbl9iaXRzKENSX0NIQU4oY21kLT4KIAkJCQkJCQkgICAgICBjaGFubGlzdFtpXSkpOwotCQkJCS8qICBzZXQgZ2FpbiAqLworCQkJCS8qIHNldCBnYWluICovCiAJCQkJYml0cyB8PSBhaV9yYW5nZV9iaXRzXzZ4eHgoZGV2LAogCQkJCQkJCSAgIENSX1JBTkdFKGNtZC0+CiAJCQkJCQkJCSAgICBjaGFubGlzdAogCQkJCQkJCQkgICAgW2ldKSk7Ci0JCQkJLyogIHNldCBzaW5nbGUtZW5kZWQgLyBkaWZmZXJlbnRpYWwgKi8KKwkJCQkvKiBzZXQgc2luZ2xlLWVuZGVkIC8gZGlmZmVyZW50aWFsICovCiAJCQkJYml0cyB8PSBzZV9kaWZmX2JpdF82eHh4KGRldiwKIAkJCQkJCQkgQ1JfQVJFRihjbWQtPgogCQkJCQkJCQkgY2hhbmxpc3RbaV0pID09CiAJCQkJCQkJIEFSRUZfRElGRik7CiAJCQkJaWYgKENSX0FSRUYoY21kLT5jaGFubGlzdFtpXSkgPT0gQVJFRl9DT01NT04pCiAJCQkJCWJpdHMgfD0gQURDX0NPTU1PTl9CSVQ7Ci0JCQkJLyogIG1hcmsgZW5kIG9mIHF1ZXVlICovCisJCQkJLyogbWFyayBlbmQgb2YgcXVldWUgKi8KIAkJCQlpZiAoaSA9PSBjbWQtPmNoYW5saXN0X2xlbiAtIDEpCiAJCQkJCWJpdHMgfD0gUVVFVUVfRU9TQ0FOX0JJVCB8CiAJCQkJCQlRVUVVRV9FT1NFUV9CSVQ7CkBAIC0yNDk4LDcgKzI1MDMsNyBAQAogCQkJICogYnV0IHJlcXVpcmVkIGZvciByZWxpYWJsZSBvcGVyYXRpb24KIAkJCSAqLwogCQkJd3JpdGV3KDAsIGRldnByaXYtPm1haW5faW9iYXNlICsgQURDX1FVRVVFX0NMRUFSX1JFRyk7Ci0JCQkvKiAgcHJpbWUgcXVldWUgaG9sZGluZyByZWdpc3RlciAqLworCQkJLyogcHJpbWUgcXVldWUgaG9sZGluZyByZWdpc3RlciAqLwogCQkJd3JpdGV3KDAsIGRldnByaXYtPm1haW5faW9iYXNlICsgQURDX1FVRVVFX0xPQURfUkVHKTsKIAkJfQogCX0gZWxzZSB7CkBAIC0yNTA3LDcgKzI1MTIsNyBAQAogCQlkZXZwcml2LT5pMmNfY2FsX3JhbmdlX2JpdHMgJj0gfkFEQ19TUkNfNDAyMF9NQVNLOwogCQkvKiBzZWxlY3QgQk5DIGlucHV0cyAqLwogCQlkZXZwcml2LT5pMmNfY2FsX3JhbmdlX2JpdHMgfD0gYWRjX3NyY180MDIwX2JpdHMoNCk7Ci0JCS8qICBzZWxlY3QgcmFuZ2VzICovCisJCS8qIHNlbGVjdCByYW5nZXMgKi8KIAkJZm9yIChpID0gMDsgaSA8IGNtZC0+Y2hhbmxpc3RfbGVuOyBpKyspIHsKIAkJCXVuc2lnbmVkIGludCBjaGFubmVsID0gQ1JfQ0hBTihjbWQtPmNoYW5saXN0W2ldKTsKIAkJCXVuc2lnbmVkIGludCByYW5nZSA9IENSX1JBTkdFKGNtZC0+Y2hhbmxpc3RbaV0pOwpAQCAtMjU3OSw3ICsyNTg0LDcgQEAKIAlpZiAocmV0dmFsIDwgMCkKIAkJcmV0dXJuIHJldHZhbDsKIAotCS8qICBtYWtlIHN1cmUgaW50ZXJuYWwgY2FsaWJyYXRpb24gc291cmNlIGlzIHR1cm5lZCBvZmYgKi8KKwkvKiBtYWtlIHN1cmUgaW50ZXJuYWwgY2FsaWJyYXRpb24gc291cmNlIGlzIHR1cm5lZCBvZmYgKi8KIAl3cml0ZXcoMCwgZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBDQUxJQlJBVElPTl9SRUcpOwogCiAJc2V0X2FpX3BhY2luZyhkZXYsIGNtZCk7CkBAIC0yNTk1LDEwICsyNjAwLDEwIEBACiAJaWYgKGJvYXJkLT5sYXlvdXQgIT0gTEFZT1VUXzQwMjApIHsKIAkJZGV2cHJpdi0+YWRjX2NvbnRyb2wxX2JpdHMgJj0gfkFEQ19NT0RFX01BU0s7CiAJCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfRVhUKQotCQkJLyogIGdvb2Qgb2xkIG1vZGUgMTMgKi8KKwkJCS8qIGdvb2Qgb2xkIG1vZGUgMTMgKi8KIAkJCWRldnByaXYtPmFkY19jb250cm9sMV9iaXRzIHw9IGFkY19tb2RlX2JpdHMoMTMpOwogCQllbHNlCi0JCQkvKiAgbW9kZSA4LiAgV2hhdCBlbHNlIGNvdWxkIHlvdSBuZWVkPyAqLworCQkJLyogbW9kZSA4LiAgV2hhdCBlbHNlIGNvdWxkIHlvdSBuZWVkPyAqLwogCQkJZGV2cHJpdi0+YWRjX2NvbnRyb2wxX2JpdHMgfD0gYWRjX21vZGVfYml0cyg4KTsKIAl9IGVsc2UgewogCQlkZXZwcml2LT5hZGNfY29udHJvbDFfYml0cyAmPSB+Q0hBTk5FTF9NT0RFXzQwMjBfTUFTSzsKQEAgLTI2MTgsMjAgKzI2MjMsMjAgQEAKIAkgICAgICAgZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBBRENfQ09OVFJPTDFfUkVHKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CiAKLQkvKiAgY2xlYXIgYWRjIGJ1ZmZlciAqLworCS8qIGNsZWFyIGFkYyBidWZmZXIgKi8KIAl3cml0ZXcoMCwgZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBBRENfQlVGRkVSX0NMRUFSX1JFRyk7CiAKIAlpZiAoKGNtZC0+ZmxhZ3MgJiBDTURGX1dBS0VfRU9TKSA9PSAwIHx8CiAJICAgIGJvYXJkLT5sYXlvdXQgPT0gTEFZT1VUXzQwMjApIHsKIAkJZGV2cHJpdi0+YWlfZG1hX2luZGV4ID0gMDsKIAotCQkvKiAgc2V0IGRtYSB0cmFuc2ZlciBzaXplICovCisJCS8qIHNldCBkbWEgdHJhbnNmZXIgc2l6ZSAqLwogCQlmb3IgKGkgPSAwOyBpIDwgYWlfZG1hX3JpbmdfY291bnQoYm9hcmQpOyBpKyspCiAJCQlkZXZwcml2LT5haV9kbWFfZGVzY1tpXS50cmFuc2Zlcl9zaXplID0KIAkJCQljcHVfdG9fbGUzMihkbWFfdHJhbnNmZXJfc2l6ZShkZXYpICoKIAkJCQkJICAgIHNpemVvZih1aW50MTZfdCkpOwogCi0JCS8qICBnaXZlIGxvY2F0aW9uIG9mIGZpcnN0IGRtYSBkZXNjcmlwdG9yICovCisJCS8qIGdpdmUgbG9jYXRpb24gb2YgZmlyc3QgZG1hIGRlc2NyaXB0b3IgKi8KIAkJbG9hZF9maXJzdF9kbWFfZGVzY3JpcHRvcihkZXYsIDEsCiAJCQkJCSAgZGV2cHJpdi0+YWlfZG1hX2Rlc2NfYnVzX2FkZHIgfAogCQkJCQkgIFBMWF9ETUFEUFJfREVTQ1BDSSB8CkBAIC0yNjU3LDcgKzI2NjIsNyBAQAogCWJpdHMgPSBBRENfRU5BQkxFX0JJVCB8IEFEQ19TT0ZUX0dBVEVfQklUUyB8IEFEQ19HQVRFX0xFVkVMX0JJVDsKIAlpZiAoY21kLT5mbGFncyAmIENNREZfV0FLRV9FT1MpCiAJCWJpdHMgfD0gQURDX0RNQV9ESVNBQkxFX0JJVDsKLQkvKiAgc2V0IHN0YXJ0IHRyaWdnZXIgKi8KKwkvKiBzZXQgc3RhcnQgdHJpZ2dlciAqLwogCWlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCkgewogCQliaXRzIHw9IEFEQ19TVEFSVF9UUklHX0VYVF9CSVRTOwogCQlpZiAoY21kLT5zdGFydF9hcmcgJiBDUl9JTlZFUlQpCkBAIC0yNjczLDcgKzI2NzgsNyBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zcGlubG9jaywgZmxhZ3MpOwogCi0JLyogIHN0YXJ0IGFjcXVpc2l0aW9uICovCisJLyogc3RhcnQgYWNxdWlzaXRpb24gKi8KIAlpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19OT1cpCiAJCXdyaXRldygwLCBkZXZwcml2LT5tYWluX2lvYmFzZSArIEFEQ19TVEFSVF9SRUcpOwogCkBAIC0yNjkxLDcgKzI2OTYsNyBAQAogCWludCBudW1fc2FtcGxlczsKIAogCWRvIHsKLQkJLyogIGdldCBsZWFzdCBzaWduaWZpY2FudCAxNSBiaXRzICovCisJCS8qIGdldCBsZWFzdCBzaWduaWZpY2FudCAxNSBiaXRzICovCiAJCXJlYWRfaW5kZXggPSByZWFkdyhkZXZwcml2LT5tYWluX2lvYmFzZSArIEFEQ19SRUFEX1BOVFJfUkVHKSAmCiAJCQkgICAgIDB4N2ZmZjsKIAkJd3JpdGVfaW5kZXggPSByZWFkdyhkZXZwcml2LT5tYWluX2lvYmFzZSArIEFEQ19XUklURV9QTlRSX1JFRykgJgpAQCAtMjc5NiwxNCArMjgwMSwxNCBAQAogCiAJcGNpX2FkZHJfcmVnID0gZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UgKyBQTFhfUkVHX0RNQVBBRFIoY2hhbm5lbCk7CiAKLQkvKiAgbG9vcCB1bnRpbCB3ZSBoYXZlIHJlYWQgYWxsIHRoZSBmdWxsIGJ1ZmZlcnMgKi8KKwkvKiBsb29wIHVudGlsIHdlIGhhdmUgcmVhZCBhbGwgdGhlIGZ1bGwgYnVmZmVycyAqLwogCWZvciAoaiA9IDAsIG5leHRfdHJhbnNmZXJfYWRkciA9IHJlYWRsKHBjaV9hZGRyX3JlZyk7CiAJICAgICAobmV4dF90cmFuc2Zlcl9hZGRyIDwKIAkgICAgICBkZXZwcml2LT5haV9idWZmZXJfYnVzX2FkZHJbZGV2cHJpdi0+YWlfZG1hX2luZGV4XSB8fAogCSAgICAgIG5leHRfdHJhbnNmZXJfYWRkciA+PQogCSAgICAgIGRldnByaXYtPmFpX2J1ZmZlcl9idXNfYWRkcltkZXZwcml2LT5haV9kbWFfaW5kZXhdICsKIAkgICAgICBETUFfQlVGRkVSX1NJWkUpICYmIGogPCBhaV9kbWFfcmluZ19jb3VudChib2FyZCk7IGorKykgewotCQkvKiAgdHJhbnNmZXIgZGF0YSBmcm9tIGRtYSBidWZmZXIgdG8gY29tZWRpIGJ1ZmZlciAqLworCQkvKiB0cmFuc2ZlciBkYXRhIGZyb20gZG1hIGJ1ZmZlciB0byBjb21lZGkgYnVmZmVyICovCiAJCW51bV9zYW1wbGVzID0gY29tZWRpX25zYW1wbGVzX2xlZnQocywgZG1hX3RyYW5zZmVyX3NpemUoZGV2KSk7CiAJCWNvbWVkaV9idWZfd3JpdGVfc2FtcGxlcyhzLAogCQkJCWRldnByaXYtPmFpX2J1ZmZlcltkZXZwcml2LT5haV9kbWFfaW5kZXhdLApAQCAtMjgyOSwxNSArMjgzNCwxNSBAQAogCXVpbnQ4X3QgZG1hMV9zdGF0dXM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCS8qICBjaGVjayBmb3IgZmlmbyBvdmVycnVuICovCisJLyogY2hlY2sgZm9yIGZpZm8gb3ZlcnJ1biAqLwogCWlmIChzdGF0dXMgJiBBRENfT1ZFUlJVTl9CSVQpIHsKIAkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgImZpZm8gb3ZlcnJ1blxuIik7CiAJCWFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SOwogCX0KLQkvKiAgc3BpbiBsb2NrIG1ha2VzIHN1cmUgbm8gb25lIGVsc2UgY2hhbmdlcyBwbHggZG1hIGNvbnRyb2wgcmVnICovCisJLyogc3BpbiBsb2NrIG1ha2VzIHN1cmUgbm8gb25lIGVsc2UgY2hhbmdlcyBwbHggZG1hIGNvbnRyb2wgcmVnICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKIAlkbWExX3N0YXR1cyA9IHJlYWRiKGRldnByaXYtPnBseDkwODBfaW9iYXNlICsgUExYX1JFR19ETUFDU1IxKTsKLQlpZiAocGx4X3N0YXR1cyAmIFBMWF9JTlRDU1JfRE1BMUlBKSB7CS8qICBkbWEgY2hhbiAxIGludGVycnVwdCAqLworCWlmIChwbHhfc3RhdHVzICYgUExYX0lOVENTUl9ETUExSUEpIHsJLyogZG1hIGNoYW4gMSBpbnRlcnJ1cHQgKi8KIAkJd3JpdGViKChkbWExX3N0YXR1cyAmIFBMWF9ETUFDU1JfRU5BQkxFKSB8IFBMWF9ETUFDU1JfQ0xFQVJJTlRSLAogCQkgICAgICAgZGV2cHJpdi0+cGx4OTA4MF9pb2Jhc2UgKyBQTFhfUkVHX0RNQUNTUjEpOwogCkBAIC0yODQ2LDcgKzI4NTEsNyBAQAogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CiAKLQkvKiAgZHJhaW4gZmlmbyB3aXRoIHBpbyAqLworCS8qIGRyYWluIGZpZm8gd2l0aCBwaW8gKi8KIAlpZiAoKHN0YXR1cyAmIEFEQ19ET05FX0JJVCkgfHwKIAkgICAgKChjbWQtPmZsYWdzICYgQ01ERl9XQUtFX0VPUykgJiYKIAkgICAgIChzdGF0dXMgJiBBRENfSU5UUl9QRU5ESU5HX0JJVCkgJiYKQEAgLTI4NTksNyArMjg2NCw3IEBACiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CiAJCX0KIAl9Ci0JLyogIGlmIHdlIGFyZSBoYXZlIGFsbCB0aGUgZGF0YSwgdGhlbiBxdWl0ICovCisJLyogaWYgd2UgYXJlIGhhdmUgYWxsIHRoZSBkYXRhLCB0aGVuIHF1aXQgKi8KIAlpZiAoKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCAmJgogCSAgICAgYXN5bmMtPnNjYW5zX2RvbmUgPj0gY21kLT5zdG9wX2FyZykgfHwKIAkgICAgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19FWFQgJiYgKHN0YXR1cyAmIEFEQ19TVE9QX0JJVCkpKQpAQCAtMzAxMiw3ICszMDE3LDcgQEAKIAlhc3luYyA9IHMtPmFzeW5jOwogCWNtZCA9ICZhc3luYy0+Y21kOwogCi0JLyogIHNwaW4gbG9jayBtYWtlcyBzdXJlIG5vIG9uZSBlbHNlIGNoYW5nZXMgcGx4IGRtYSBjb250cm9sIHJlZyAqLworCS8qIHNwaW4gbG9jayBtYWtlcyBzdXJlIG5vIG9uZSBlbHNlIGNoYW5nZXMgcGx4IGRtYSBjb250cm9sIHJlZyAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CiAJZG1hMF9zdGF0dXMgPSByZWFkYihkZXZwcml2LT5wbHg5MDgwX2lvYmFzZSArIFBMWF9SRUdfRE1BQ1NSMCk7CiAJaWYgKHBseF9zdGF0dXMgJiBQTFhfSU5UQ1NSX0RNQTBJQSkgewkvKiAgZG1hIGNoYW4gMCBpbnRlcnJ1cHQgKi8KQEAgLTMxMDYsMTUgKzMxMTEsMTUgQEAKIAlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwogCWludCByYW5nZSA9IENSX1JBTkdFKGluc24tPmNoYW5zcGVjKTsKIAotCS8qICBkbyBzb21lIGluaXRpYWxpemluZyAqLworCS8qIGRvIHNvbWUgaW5pdGlhbGl6aW5nICovCiAJd3JpdGV3KDAsIGRldnByaXYtPm1haW5faW9iYXNlICsgREFDX0NPTlRST0wwX1JFRyk7CiAKLQkvKiAgc2V0IHJhbmdlICovCisJLyogc2V0IHJhbmdlICovCiAJc2V0X2RhY19yYW5nZV9iaXRzKGRldiwgJmRldnByaXYtPmRhY19jb250cm9sMV9iaXRzLCBjaGFuLCByYW5nZSk7CiAJd3JpdGV3KGRldnByaXYtPmRhY19jb250cm9sMV9iaXRzLAogCSAgICAgICBkZXZwcml2LT5tYWluX2lvYmFzZSArIERBQ19DT05UUk9MMV9SRUcpOwogCi0JLyogIHdyaXRlIHRvIGNoYW5uZWwgKi8KKwkvKiB3cml0ZSB0byBjaGFubmVsICovCiAJaWYgKGJvYXJkLT5sYXlvdXQgPT0gTEFZT1VUXzQwMjApIHsKIAkJd3JpdGV3KGRhdGFbMF0gJiAweGZmLAogCQkgICAgICAgZGV2cHJpdi0+bWFpbl9pb2Jhc2UgKyBkYWNfbHNiXzQwMjBfcmVnKGNoYW4pKTsKQEAgLTMxMjQsNyArMzEyOSw3IEBACiAJCXdyaXRldyhkYXRhWzBdLCBkZXZwcml2LT5tYWluX2lvYmFzZSArIGRhY19jb252ZXJ0X3JlZyhjaGFuKSk7CiAJfQogCi0JLyogIHJlbWVtYmVyIG91dHB1dCB2YWx1ZSAqLworCS8qIHJlbWVtYmVyIG91dHB1dCB2YWx1ZSAqLwogCXMtPnJlYWRiYWNrW2NoYW5dID0gZGF0YVswXTsKIAogCXJldHVybiAxOwpAQCAtMzU1Niw3ICszNTYxLDcgQEAKIAl1aW50OF90IHNlcmlhbF9ieXRlc1szXTsKIAl1aW50OF90IGkyY19hZGRyOwogCWVudW0gcG9pbnRlcl9iaXRzIHsKLQkJLyogIG1hbnVhbCBoYXMgZ2FpbiBhbmQgb2Zmc2V0IGJpdHMgc3dpdGNoZWQgKi8KKwkJLyogbWFudWFsIGhhcyBnYWluIGFuZCBvZmZzZXQgYml0cyBzd2l0Y2hlZCAqLwogCQlPRkZTRVRfMF8yID0gMHgxLAogCQlHQUlOXzBfMiA9IDB4MiwKIAkJT0ZGU0VUXzFfMyA9IDB4NCwKQEAgLTM1NjcsMzUgKzM1NzIsMzUgQEAKIAl9OwogCiAJc3dpdGNoIChjYWxkYWNfY2hhbm5lbCkgewotCWNhc2UgMDoJCS8qICBjaGFuIDAgb2Zmc2V0ICovCisJY2FzZSAwOgkJCQkJLyogY2hhbiAwIG9mZnNldCAqLwogCQlpMmNfYWRkciA9IENBTERBQzBfSTJDX0FERFI7CiAJCXNlcmlhbF9ieXRlc1swXSA9IE9GRlNFVF8wXzI7CiAJCWJyZWFrOwotCWNhc2UgMToJCS8qICBjaGFuIDEgb2Zmc2V0ICovCisJY2FzZSAxOgkJCQkJLyogY2hhbiAxIG9mZnNldCAqLwogCQlpMmNfYWRkciA9IENBTERBQzBfSTJDX0FERFI7CiAJCXNlcmlhbF9ieXRlc1swXSA9IE9GRlNFVF8xXzM7CiAJCWJyZWFrOwotCWNhc2UgMjoJCS8qICBjaGFuIDIgb2Zmc2V0ICovCisJY2FzZSAyOgkJCQkJLyogY2hhbiAyIG9mZnNldCAqLwogCQlpMmNfYWRkciA9IENBTERBQzFfSTJDX0FERFI7CiAJCXNlcmlhbF9ieXRlc1swXSA9IE9GRlNFVF8wXzI7CiAJCWJyZWFrOwotCWNhc2UgMzoJCS8qICBjaGFuIDMgb2Zmc2V0ICovCisJY2FzZSAzOgkJCQkJLyogY2hhbiAzIG9mZnNldCAqLwogCQlpMmNfYWRkciA9IENBTERBQzFfSTJDX0FERFI7CiAJCXNlcmlhbF9ieXRlc1swXSA9IE9GRlNFVF8xXzM7CiAJCWJyZWFrOwotCWNhc2UgNDoJCS8qICBjaGFuIDAgZ2FpbiAqLworCWNhc2UgNDoJCQkJCS8qIGNoYW4gMCBnYWluICovCiAJCWkyY19hZGRyID0gQ0FMREFDMF9JMkNfQUREUjsKIAkJc2VyaWFsX2J5dGVzWzBdID0gR0FJTl8wXzI7CiAJCWJyZWFrOwotCWNhc2UgNToJCS8qICBjaGFuIDEgZ2FpbiAqLworCWNhc2UgNToJCQkJCS8qIGNoYW4gMSBnYWluICovCiAJCWkyY19hZGRyID0gQ0FMREFDMF9JMkNfQUREUjsKIAkJc2VyaWFsX2J5dGVzWzBdID0gR0FJTl8xXzM7CiAJCWJyZWFrOwotCWNhc2UgNjoJCS8qICBjaGFuIDIgZ2FpbiAqLworCWNhc2UgNjoJCQkJCS8qIGNoYW4gMiBnYWluICovCiAJCWkyY19hZGRyID0gQ0FMREFDMV9JMkNfQUREUjsKIAkJc2VyaWFsX2J5dGVzWzBdID0gR0FJTl8wXzI7CiAJCWJyZWFrOwotCWNhc2UgNzoJCS8qICBjaGFuIDMgZ2FpbiAqLworCWNhc2UgNzoJCQkJCS8qIGNoYW4gMyBnYWluICovCiAJCWkyY19hZGRyID0gQ0FMREFDMV9JMkNfQUREUjsKIAkJc2VyaWFsX2J5dGVzWzBdID0gR0FJTl8xXzM7CiAJCWJyZWFrOwpAQCAtMzcxOCwyNCArMzcyMywyNCBAQAogCiAJdWRlbGF5KGVlcHJvbV91ZGVsYXkpOwogCWRldnByaXYtPnBseF9jb250cm9sX2JpdHMgJj0gflBMWF9DTlRSTF9FRVNLICYgflBMWF9DTlRSTF9FRUNTOwotCS8qICBtYWtlIHN1cmUgd2UgZG9uJ3Qgc2VuZCBhbnl0aGluZyB0byB0aGUgaTJjIGJ1cyBvbiA0MDIwICovCisJLyogbWFrZSBzdXJlIHdlIGRvbid0IHNlbmQgYW55dGhpbmcgdG8gdGhlIGkyYyBidXMgb24gNDAyMCAqLwogCWRldnByaXYtPnBseF9jb250cm9sX2JpdHMgfD0gUExYX0NOVFJMX1VTRVJPOwogCXdyaXRlbChkZXZwcml2LT5wbHhfY29udHJvbF9iaXRzLCBwbHhfY29udHJvbF9hZGRyKTsKLQkvKiAgYWN0aXZhdGUgc2VyaWFsIGVlcHJvbSAqLworCS8qIGFjdGl2YXRlIHNlcmlhbCBlZXByb20gKi8KIAl1ZGVsYXkoZWVwcm9tX3VkZWxheSk7CiAJZGV2cHJpdi0+cGx4X2NvbnRyb2xfYml0cyB8PSBQTFhfQ05UUkxfRUVDUzsKIAl3cml0ZWwoZGV2cHJpdi0+cGx4X2NvbnRyb2xfYml0cywgcGx4X2NvbnRyb2xfYWRkcik7CiAKLQkvKiAgd3JpdGUgcmVhZCBjb21tYW5kIGFuZCBkZXNpcmVkIG1lbW9yeSBhZGRyZXNzICovCisJLyogd3JpdGUgcmVhZCBjb21tYW5kIGFuZCBkZXNpcmVkIG1lbW9yeSBhZGRyZXNzICovCiAJZm9yIChiaXQgPSAxIDw8IChiaXRzdHJlYW1fbGVuZ3RoIC0gMSk7IGJpdDsgYml0ID4+PSAxKSB7Ci0JCS8qICBzZXQgYml0IHRvIGJlIHdyaXR0ZW4gKi8KKwkJLyogc2V0IGJpdCB0byBiZSB3cml0dGVuICovCiAJCXVkZWxheShlZXByb21fdWRlbGF5KTsKIAkJaWYgKGJpdHN0cmVhbSAmIGJpdCkKIAkJCWRldnByaXYtPnBseF9jb250cm9sX2JpdHMgfD0gUExYX0NOVFJMX0VFV0I7CiAJCWVsc2UKIAkJCWRldnByaXYtPnBseF9jb250cm9sX2JpdHMgJj0gflBMWF9DTlRSTF9FRVdCOwogCQl3cml0ZWwoZGV2cHJpdi0+cGx4X2NvbnRyb2xfYml0cywgcGx4X2NvbnRyb2xfYWRkcik7Ci0JCS8qICBjbG9jayBpbiBiaXQgKi8KKwkJLyogY2xvY2sgaW4gYml0ICovCiAJCXVkZWxheShlZXByb21fdWRlbGF5KTsKIAkJZGV2cHJpdi0+cGx4X2NvbnRyb2xfYml0cyB8PSBQTFhfQ05UUkxfRUVTSzsKIAkJd3JpdGVsKGRldnByaXYtPnBseF9jb250cm9sX2JpdHMsIHBseF9jb250cm9sX2FkZHIpOwpAQCAtMzc0MywxMCArMzc0OCwxMCBAQAogCQlkZXZwcml2LT5wbHhfY29udHJvbF9iaXRzICY9IH5QTFhfQ05UUkxfRUVTSzsKIAkJd3JpdGVsKGRldnByaXYtPnBseF9jb250cm9sX2JpdHMsIHBseF9jb250cm9sX2FkZHIpOwogCX0KLQkvKiAgcmVhZCBiYWNrIHZhbHVlIGZyb20gZWVwcm9tIG1lbW9yeSBsb2NhdGlvbiAqLworCS8qIHJlYWQgYmFjayB2YWx1ZSBmcm9tIGVlcHJvbSBtZW1vcnkgbG9jYXRpb24gKi8KIAl2YWx1ZSA9IDA7CiAJZm9yIChiaXQgPSAxIDw8ICh2YWx1ZV9sZW5ndGggLSAxKTsgYml0OyBiaXQgPj49IDEpIHsKLQkJLyogIGNsb2NrIG91dCBiaXQgKi8KKwkJLyogY2xvY2sgb3V0IGJpdCAqLwogCQl1ZGVsYXkoZWVwcm9tX3VkZWxheSk7CiAJCWRldnByaXYtPnBseF9jb250cm9sX2JpdHMgfD0gUExYX0NOVFJMX0VFU0s7CiAJCXdyaXRlbChkZXZwcml2LT5wbHhfY29udHJvbF9iaXRzLCBwbHhfY29udHJvbF9hZGRyKTsKQEAgLTM3NTgsNyArMzc2Myw3IEBACiAJCQl2YWx1ZSB8PSBiaXQ7CiAJfQogCi0JLyogIGRlYWN0aXZhdGUgZWVwcm9tIHNlcmlhbCBpbnB1dCAqLworCS8qIGRlYWN0aXZhdGUgZWVwcm9tIHNlcmlhbCBpbnB1dCAqLwogCXVkZWxheShlZXByb21fdWRlbGF5KTsKIAlkZXZwcml2LT5wbHhfY29udHJvbF9iaXRzICY9IH5QTFhfQ05UUkxfRUVDUzsKIAl3cml0ZWwoZGV2cHJpdi0+cGx4X2NvbnRyb2xfYml0cywgcGx4X2NvbnRyb2xfYWRkcik7CkBAIC0zNzc1LDkgKzM3ODAsNyBAQAogCXJldHVybiAxOwogfQogCi0vKgotICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIHN1YmRldmljZSBzdHJ1Y3R1cmVzLgotICovCisvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgc3ViZGV2aWNlIHN0cnVjdHVyZXMuICovCiBzdGF0aWMgaW50IHNldHVwX3N1YmRldmljZXMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKIAljb25zdCBzdHJ1Y3QgcGNpZGFzNjRfYm9hcmQgKmJvYXJkID0gZGV2LT5ib2FyZF9wdHI7CkBAIC0zODE2LDcgKzM4MTksNyBAQAogCQkgKiAobm90IGludGVybmFsIGNhbGlicmF0aW9uIHNvdXJjZXMpCiAJCSAqLwogCQlkZXZwcml2LT5pMmNfY2FsX3JhbmdlX2JpdHMgPSBhZGNfc3JjXzQwMjBfYml0cyg0KTsKLQkJLyogIHNldCBjaGFubmVscyB0byArLTUgdm9sdCBpbnB1dCByYW5nZXMgKi8KKwkJLyogc2V0IGNoYW5uZWxzIHRvICstNSB2b2x0IGlucHV0IHJhbmdlcyAqLwogCQlmb3IgKGkgPSAwOyBpIDwgcy0+bl9jaGFuOyBpKyspCiAJCQlkZXZwcml2LT5pMmNfY2FsX3JhbmdlX2JpdHMgfD0gYXR0ZW51YXRlX2JpdChpKTsKIAkJZGF0YSA9IGRldnByaXYtPmkyY19jYWxfcmFuZ2VfYml0czsKQEAgLTM4NDksNyArMzg1Miw3IEBACiAJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7CiAJfQogCi0JLyogIGRpZ2l0YWwgaW5wdXQgKi8KKwkvKiBkaWdpdGFsIGlucHV0ICovCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbMl07CiAJaWYgKGJvYXJkLT5sYXlvdXQgPT0gTEFZT1VUXzY0WFgpIHsKIAkJcy0+dHlwZSA9IENPTUVESV9TVUJEX0RJOwpAQCAtMzg2Miw3ICszODY1LDcgQEAKIAkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKIAl9CiAKLQkvKiAgZGlnaXRhbCBvdXRwdXQgKi8KKwkvKiBkaWdpdGFsIG91dHB1dCAqLwogCWlmIChib2FyZC0+bGF5b3V0ID09IExBWU9VVF82NFhYKSB7CiAJCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzNdOwogCQlzLT50eXBlID0gQ09NRURJX1NVQkRfRE87CkBAIC0zODkxLDcgKzM4OTQsNyBAQAogCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOwogCX0KIAotCS8qICA4IGNoYW5uZWwgZGlvIGZvciA2MHh4ICovCisJLyogOCBjaGFubmVsIGRpbyBmb3IgNjB4eCAqLwogCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzVdOwogCWlmIChib2FyZC0+bGF5b3V0ID09IExBWU9VVF82MFhYKSB7CiAJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9ESU87CkBAIC0zOTA1LDcgKzM5MDgsNyBAQAogCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOwogCX0KIAotCS8qICBjYWxkYWMgKi8KKwkvKiBjYWxkYWMgKi8KIAlzID0gJmRldi0+c3ViZGV2aWNlc1s2XTsKIAlzLT50eXBlID0gQ09NRURJX1NVQkRfQ0FMSUI7CiAJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX1dSSVRBQkxFIHwgU0RGX0lOVEVSTkFMOwpAQCAtMzkyNSw3ICszOTI4LDcgQEAKIAkJcy0+cmVhZGJhY2tbaV0gPSBzLT5tYXhkYXRhIC8gMjsKIAl9CiAKLQkvKiAgMiBjaGFubmVsIGFkODQwMiBwb3RlbnRpb21ldGVyICovCisJLyogMiBjaGFubmVsIGFkODQwMiBwb3RlbnRpb21ldGVyICovCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbN107CiAJaWYgKGJvYXJkLT5sYXlvdXQgPT0gTEFZT1VUXzY0WFgpIHsKIAkJcy0+dHlwZSA9IENPTUVESV9TVUJEX0NBTElCOwpAQCAtMzk1OSw3ICszOTYyLDcgQEAKIAkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKIAl9CiAKLQkvKiAgdXNlciBjb3VudGVyIHN1YmQgWFhYICovCisJLyogdXNlciBjb3VudGVyIHN1YmQgWFhYICovCiAJcyA9ICZkZXYtPnN1YmRldmljZXNbOV07CiAJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKIApAQCAtNDAwNSw3ICs0MDA4LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JLyogIGZpZ3VyZSBvdXQgd2hhdCBsb2NhbCBhZGRyZXNzZXMgYXJlICovCisJLyogZmlndXJlIG91dCB3aGF0IGxvY2FsIGFkZHJlc3NlcyBhcmUgKi8KIAlsb2NhbF9yYW5nZSA9IHJlYWRsKGRldnByaXYtPnBseDkwODBfaW9iYXNlICsgUExYX1JFR19MQVMwUlIpICYKIAkJICAgICAgUExYX0xBU1JSX01FTV9NQVNLOwogCWxvY2FsX2RlY29kZSA9IHJlYWRsKGRldnByaXYtPnBseDkwODBfaW9iYXNlICsgUExYX1JFR19MQVMwQkEpICYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfdGVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV90ZXN0LmMKaW5kZXggNGFiMTg2Ni4uZWM1YjlhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV90ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV90ZXN0LmMKQEAgLTU2LDExICs1Niw2IEBACiAKICNkZWZpbmUgTl9DSEFOUyA4CiAKLWVudW0gd2F2ZWZvcm1fc3RhdGVfYml0cyB7Ci0JV0FWRUZPUk1fQUlfUlVOTklORywKLQlXQVZFRk9STV9BT19SVU5OSU5HCi19OwotCiAvKiBEYXRhIHVuaXF1ZSB0byB0aGlzIGRyaXZlciAqLwogc3RydWN0IHdhdmVmb3JtX3ByaXZhdGUgewogCXN0cnVjdCB0aW1lcl9saXN0IGFpX3RpbWVyOwkvKiB0aW1lciBmb3IgQUkgY29tbWFuZHMgKi8KQEAgLTY4LDcgKzYzLDYgQEAKIAl1bnNpZ25lZCBpbnQgd2ZfYW1wbGl0dWRlOwkvKiB3YXZlZm9ybSBhbXBsaXR1ZGUgaW4gbWljcm92b2x0cyAqLwogCXVuc2lnbmVkIGludCB3Zl9wZXJpb2Q7CQkvKiB3YXZlZm9ybSBwZXJpb2QgaW4gbWljcm9zZWNvbmRzICovCiAJdW5zaWduZWQgaW50IHdmX2N1cnJlbnQ7CS8qIGN1cnJlbnQgdGltZSBpbiB3YXZlZm9ybSBwZXJpb2QgKi8KLQl1bnNpZ25lZCBsb25nIHN0YXRlX2JpdHM7CiAJdW5zaWduZWQgaW50IGFpX3NjYW5fcGVyaW9kOwkvKiBBSSBzY2FuIHBlcmlvZCBpbiB1c2VjICovCiAJdW5zaWduZWQgaW50IGFpX2NvbnZlcnRfcGVyaW9kOwkvKiBBSSBjb252ZXJzaW9uIHBlcmlvZCBpbiB1c2VjICovCiAJc3RydWN0IHRpbWVyX2xpc3QgYW9fdGltZXI7CS8qIHRpbWVyIGZvciBBTyBjb21tYW5kcyAqLwpAQCAtMTkxLDEwICsxODUsNiBAQAogCXVuc2lnbmVkIGludCBuc2FtcGxlczsKIAl1bnNpZ25lZCBpbnQgdGltZV9pbmNyZW1lbnQ7CiAKLQkvKiBjaGVjayBjb21tYW5kIGlzIHN0aWxsIGFjdGl2ZSAqLwotCWlmICghdGVzdF9iaXQoV0FWRUZPUk1fQUlfUlVOTklORywgJmRldnByaXYtPnN0YXRlX2JpdHMpKQotCQlyZXR1cm47Ci0KIAlub3cgPSBrdGltZV90b191cyhrdGltZV9nZXQoKSk7CiAJbnNhbXBsZXMgPSBjb21lZGlfbnNhbXBsZXNfbGVmdChzLCBVSU5UX01BWCk7CiAKQEAgLTM4NiwxMSArMzc2LDYgQEAKIAkgKi8KIAlkZXZwcml2LT5haV90aW1lci5leHBpcmVzID0KIAkJamlmZmllcyArIHVzZWNzX3RvX2ppZmZpZXMoZGV2cHJpdi0+YWlfY29udmVydF9wZXJpb2QpICsgMTsKLQotCS8qIG1hcmsgY29tbWFuZCBhcyBhY3RpdmUgKi8KLQlzbXBfbWJfX2JlZm9yZV9hdG9taWMoKTsKLQlzZXRfYml0KFdBVkVGT1JNX0FJX1JVTk5JTkcsICZkZXZwcml2LT5zdGF0ZV9iaXRzKTsKLQlzbXBfbWJfX2FmdGVyX2F0b21pYygpOwogCWFkZF90aW1lcigmZGV2cHJpdi0+YWlfdGltZXIpOwogCXJldHVybiAwOwogfQpAQCAtNDAwLDExICszODUsMTIgQEAKIHsKIAlzdHJ1Y3Qgd2F2ZWZvcm1fcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAotCS8qIG1hcmsgY29tbWFuZCBhcyBubyBsb25nZXIgYWN0aXZlICovCi0JY2xlYXJfYml0KFdBVkVGT1JNX0FJX1JVTk5JTkcsICZkZXZwcml2LT5zdGF0ZV9iaXRzKTsKLQlzbXBfbWJfX2FmdGVyX2F0b21pYygpOwotCS8qIGNhbm5vdCBjYWxsIGRlbF90aW1lcl9zeW5jKCkgYXMgbWF5IGJlIGNhbGxlZCBmcm9tIHRpbWVyIHJvdXRpbmUgKi8KLQlkZWxfdGltZXIoJmRldnByaXYtPmFpX3RpbWVyKTsKKwlpZiAoaW5fc29mdGlycSgpKSB7CisJCS8qIEFzc3VtZSB3ZSB3ZXJlIGNhbGxlZCBmcm9tIHRoZSB0aW1lciByb3V0aW5lIGl0c2VsZi4gKi8KKwkJZGVsX3RpbWVyKCZkZXZwcml2LT5haV90aW1lcik7CisJfSBlbHNlIHsKKwkJZGVsX3RpbWVyX3N5bmMoJmRldnByaXYtPmFpX3RpbWVyKTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQzNiwxMCArNDIyLDYgQEAKIAl1NjQgc2NhbnNfc2luY2U7CiAJdW5zaWduZWQgaW50IHNjYW5zX2F2YWlsID0gMDsKIAotCS8qIGNoZWNrIGNvbW1hbmQgaXMgc3RpbGwgYWN0aXZlICovCi0JaWYgKCF0ZXN0X2JpdChXQVZFRk9STV9BT19SVU5OSU5HLCAmZGV2cHJpdi0+c3RhdGVfYml0cykpCi0JCXJldHVybjsKLQogCS8qIGRldGVybWluZSBudW1iZXIgb2Ygc2NhbiBwZXJpb2RzIHNpbmNlIGxhc3QgdGltZSAqLwogCW5vdyA9IGt0aW1lX3RvX3VzKGt0aW1lX2dldCgpKTsKIAlzY2Fuc19zaW5jZSA9IG5vdyAtIGRldnByaXYtPmFvX2xhc3Rfc2Nhbl90aW1lOwpAQCAtNTE4LDExICs1MDAsNiBAQAogCWRldnByaXYtPmFvX2xhc3Rfc2Nhbl90aW1lID0ga3RpbWVfdG9fdXMoa3RpbWVfZ2V0KCkpOwogCWRldnByaXYtPmFvX3RpbWVyLmV4cGlyZXMgPQogCQlqaWZmaWVzICsgdXNlY3NfdG9famlmZmllcyhkZXZwcml2LT5hb19zY2FuX3BlcmlvZCk7Ci0KLQkvKiBtYXJrIGNvbW1hbmQgYXMgYWN0aXZlICovCi0Jc21wX21iX19iZWZvcmVfYXRvbWljKCk7Ci0Jc2V0X2JpdChXQVZFRk9STV9BT19SVU5OSU5HLCAmZGV2cHJpdi0+c3RhdGVfYml0cyk7Ci0Jc21wX21iX19hZnRlcl9hdG9taWMoKTsKIAlhZGRfdGltZXIoJmRldnByaXYtPmFvX3RpbWVyKTsKIAogCXJldHVybiAxOwpAQCAtNjA4LDExICs1ODUsMTIgQEAKIAlzdHJ1Y3Qgd2F2ZWZvcm1fcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAogCXMtPmFzeW5jLT5pbnR0cmlnID0gTlVMTDsKLQkvKiBtYXJrIGNvbW1hbmQgYXMgbm8gbG9uZ2VyIGFjdGl2ZSAqLwotCWNsZWFyX2JpdChXQVZFRk9STV9BT19SVU5OSU5HLCAmZGV2cHJpdi0+c3RhdGVfYml0cyk7Ci0Jc21wX21iX19hZnRlcl9hdG9taWMoKTsKLQkvKiBjYW5ub3QgY2FsbCBkZWxfdGltZXJfc3luYygpIGFzIG1heSBiZSBjYWxsZWQgZnJvbSB0aW1lciByb3V0aW5lICovCi0JZGVsX3RpbWVyKCZkZXZwcml2LT5hb190aW1lcik7CisJaWYgKGluX3NvZnRpcnEoKSkgeworCQkvKiBBc3N1bWUgd2Ugd2VyZSBjYWxsZWQgZnJvbSB0aGUgdGltZXIgcm91dGluZSBpdHNlbGYuICovCisJCWRlbF90aW1lcigmZGV2cHJpdi0+YW9fdGltZXIpOworCX0gZWxzZSB7CisJCWRlbF90aW1lcl9zeW5jKCZkZXZwcml2LT5hb190aW1lcik7CisJfQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFxYm9hcmQyMDAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFxYm9hcmQyMDAwLmMKaW5kZXggNjVkYWVmMC4uMGY0ZWI5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhcWJvYXJkMjAwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXFib2FyZDIwMDAuYwpAQCAtNjM0LDcgKzYzNCw3IEBACiAJY29uc3Qgc3RydWN0IGRhcTIwMF9ib2FyZHR5cGUgKmJvYXJkOwogCWludCBpOwogCi0JaWYgKHBjaWRldi0+c3Vic3lzdGVtX2RldmljZSAhPSBQQ0lfVkVORE9SX0lEX0lPVEVDSCkKKwlpZiAocGNpZGV2LT5zdWJzeXN0ZW1fdmVuZG9yICE9IFBDSV9WRU5ET1JfSURfSU9URUNIKQogCQlyZXR1cm4gTlVMTDsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJvYXJkdHlwZXMpOyBpKyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMwOF9jcy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczA4X2NzLmMKaW5kZXggOWMwMmIxNy4uMzE3YTliNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczA4X2NzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczA4X2NzLmMKQEAgLTEsNDMgKzEsNDIgQEAKIC8qCi0gICAgY29tZWRpL2RyaXZlcnMvZGFzMDhfY3MuYwotICAgIERBUzA4IGRyaXZlcgorICogQ29tZWRpIGRyaXZlciBmb3IgREFTMDA4IFBDTUNJQSBib2FyZHMKKyAqCisgKiBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiwyMDAzIEZyYW5rIE1vcmkgSGVzcyA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogUENNQ0lBIHN1cHBvcnQgY29kZSBmb3IgdGhpcyBkcml2ZXIgaXMgYWRhcHRlZCBmcm9tIHRoZSBkdW1teV9jcy5jCisgKiBkcml2ZXIgb2YgdGhlIExpbnV4IFBDTUNJQSBDYXJkIFNlcnZpY2VzIHBhY2thZ2UuCisgKgorICogVGhlIGluaXRpYWwgZGV2ZWxvcGVyIG9mIHRoZSBvcmlnaW5hbCBjb2RlIGlzIERhdmlkIEEuIEhpbmRzCisgKiA8ZGFoaW5kc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+LiAgUG9ydGlvbnMgY3JlYXRlZCBieSBEYXZpZCBBLiBIaW5kcworICogYXJlIENvcHlyaWdodCAoQykgMTk5OSBEYXZpZCBBLiBIaW5kcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KIAotICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKLSAgICBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+Ci0gICAgQ29weXJpZ2h0IChDKSAyMDAxLDIwMDIsMjAwMyBGcmFuayBNb3JpIEhlc3MgPGZtaGVzc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFBDTUNJQSBzdXBwb3J0IGNvZGUgZm9yIHRoaXMgZHJpdmVyIGlzIGFkYXB0ZWQgZnJvbSB0aGUgZHVtbXlfY3MuYwotICAgIGRyaXZlciBvZiB0aGUgTGludXggUENNQ0lBIENhcmQgU2VydmljZXMgcGFja2FnZS4KLQotICAgIFRoZSBpbml0aWFsIGRldmVsb3BlciBvZiB0aGUgb3JpZ2luYWwgY29kZSBpcyBEYXZpZCBBLiBIaW5kcwotICAgIDxkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4uICBQb3J0aW9ucyBjcmVhdGVkIGJ5IERhdmlkIEEuIEhpbmRzCi0gICAgYXJlIENvcHlyaWdodCAoQykgMTk5OSBEYXZpZCBBLiBIaW5kcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qLwogLyoKLURyaXZlcjogZGFzMDhfY3MKLURlc2NyaXB0aW9uOiBEQVMtMDggUENNQ0lBIGJvYXJkcwotQXV0aG9yOiBXYXJyZW4gSmFzcGVyLCBkcywgRnJhbmsgSGVzcwotRGV2aWNlczogW0NvbXB1dGVyQm9hcmRzXSBQQ00tREFTMDggKHBjbS1kYXMwOCkKLVN0YXR1czogd29ya3MKLQotVGhpcyBpcyB0aGUgUENNQ0lBLXNwZWNpZmljIHN1cHBvcnQgc3BsaXQgb2ZmIGZyb20gdGhlCi1kYXMwOCBkcml2ZXIuCi0KLU9wdGlvbnMgKGZvciBwY20tZGFzMDgpOgotCU5PTkUKLQotQ29tbWFuZCBzdXBwb3J0IGRvZXMgbm90IGV4aXN0LCBidXQgY291bGQgYmUgYWRkZWQgZm9yIHRoaXMgYm9hcmQuCi0qLworICogRHJpdmVyOiBkYXMwOF9jcworICogRGVzY3JpcHRpb246IERBUy0wOCBQQ01DSUEgYm9hcmRzCisgKiBBdXRob3I6IFdhcnJlbiBKYXNwZXIsIGRzLCBGcmFuayBIZXNzCisgKiBEZXZpY2VzOiBbQ29tcHV0ZXJCb2FyZHNdIFBDTS1EQVMwOCAocGNtLWRhczA4KQorICogU3RhdHVzOiB3b3JrcworICoKKyAqIFRoaXMgaXMgdGhlIFBDTUNJQS1zcGVjaWZpYyBzdXBwb3J0IHNwbGl0IG9mZiBmcm9tIHRoZQorICogZGFzMDggZHJpdmVyLgorICoKKyAqIENvbmZpZ3VyYXRpb24gT3B0aW9uczogbm9uZSwgdXNlcyBQQ01DSUEgYXV0byBjb25maWcKKyAqCisgKiBDb21tYW5kIHN1cHBvcnQgZG9lcyBub3QgZXhpc3QsIGJ1dCBjb3VsZCBiZSBhZGRlZCBmb3IgdGhpcyBib2FyZC4KKyAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTEuYwppbmRleCA5MDRmNjM3Ny4uZmNkODU0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTEuYwpAQCAtOTYsMTEgKzk2LDExIEBACiAgKiAgICA2ICAgICAgNiAgICAgIDEwMCBrSHoJIDYgICAxMDAwMDAwCiAgKiAgICA3ICAgICAxMiAgICAgICA1MCBrSHoJIDcgICAxMDAwMDAwMAogICovCi1jb25zdCB1bnNpZ25lZCBpbnQgZHQyODExX2Nsa19kaXZpZGVyc1tdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdDI4MTFfY2xrX2RpdmlkZXJzW10gPSB7CiAJMSwgMTAsIDIsIDMsIDQsIDUsIDYsIDEyCiB9OwogCi1jb25zdCB1bnNpZ25lZCBpbnQgZHQyODExX2Nsa19tdWx0aXBsaWVyc1tdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdDI4MTFfY2xrX211bHRpcGxpZXJzW10gPSB7CiAJMSwgMTAsIDEwMCwgMTAwMCwgMTAwMDAsIDEwMDAwMCwgMTAwMDAwMCwgMTAwMDAwMDAKIH07CiAKQEAgLTU4OCw4ICs1ODgsOCBAQAogCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzBdOwogCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfQUk7CiAJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1JFQURBQkxFIHwKLQkJCSAgKGl0LT5vcHRpb25zWzJdID09IDEpID8gU0RGX0RJRkYgOgotCQkJICAoaXQtPm9wdGlvbnNbMl0gPT0gMikgPyBTREZfQ09NTU9OIDogU0RGX0dST1VORDsKKwkJCSAgKChpdC0+b3B0aW9uc1syXSA9PSAxKSA/IFNERl9ESUZGIDoKKwkJCSAgIChpdC0+b3B0aW9uc1syXSA9PSAyKSA/IFNERl9DT01NT04gOiBTREZfR1JPVU5EKTsKIAlzLT5uX2NoYW4JPSAoaXQtPm9wdGlvbnNbMl0gPT0gMSkgPyA4IDogMTY7CiAJcy0+bWF4ZGF0YQk9IDB4MGZmZjsKIAlzLT5yYW5nZV90YWJsZQk9IGJvYXJkLT5pc19wZ2ggPyAmZHQyODExX3BnaF9haV9yYW5nZXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDk4MTIuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDk4MTIuYwppbmRleCAzMjk1YmI0Li43ZWJjYTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQ5ODEyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0OTgxMi5jCkBAIC02NjAsMTIgKzY2MCwxMiBAQAogCQljYXNlIDE6CiAJCQlkaXIgPSBVU0JfRElSX09VVDsKIAkJCWRldnByaXYtPmNtZF93ci5hZGRyID0gZXAtPmJFbmRwb2ludEFkZHJlc3M7Ci0JCQlkZXZwcml2LT5jbWRfd3Iuc2l6ZSA9IGxlMTZfdG9fY3B1KGVwLT53TWF4UGFja2V0U2l6ZSk7CisJCQlkZXZwcml2LT5jbWRfd3Iuc2l6ZSA9IHVzYl9lbmRwb2ludF9tYXhwKGVwKTsKIAkJCWJyZWFrOwogCQljYXNlIDI6CiAJCQlkaXIgPSBVU0JfRElSX0lOOwogCQkJZGV2cHJpdi0+Y21kX3JkLmFkZHIgPSBlcC0+YkVuZHBvaW50QWRkcmVzczsKLQkJCWRldnByaXYtPmNtZF9yZC5zaXplID0gbGUxNl90b19jcHUoZXAtPndNYXhQYWNrZXRTaXplKTsKKwkJCWRldnByaXYtPmNtZF9yZC5zaXplID0gdXNiX2VuZHBvaW50X21heHAoZXApOwogCQkJYnJlYWs7CiAJCWNhc2UgMzoKIAkJCS8qIHVudXNlZCB3cml0ZSBzdHJlYW0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9nc2NfaHBkaS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2dzY19ocGRpLmMKaW5kZXggYWY0YjQxNy4uZTViOTQ4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2dzY19ocGRpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2dzY19ocGRpLmMKQEAgLTU4Miw3ICs1ODIsNyBAQAogCWJpdHMgfD0gUExYX0RNQU1PREVfREVNQU5EOwogCS8qIGVuYWJsZSBsb2NhbCBidXJzdCBtb2RlICovCiAJYml0cyB8PSBQTFhfRE1BTU9ERV9CVVJTVEVOOwotCWJpdHMgfD0gUExYX0RNQU1PREVfV0lEVEgzMjsKKwliaXRzIHw9IFBMWF9ETUFNT0RFX1dJRFRIXzMyOwogCXdyaXRlbChiaXRzLCBwbHhfaW9iYXNlICsgUExYX1JFR19ETUFNT0RFMCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9qcjNfcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvanIzX3BjaS5jCmluZGV4IDZjNGZmMDIuLjcwMzkwZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9qcjNfcGNpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2pyM19wY2kuYwpAQCAtMTQxLDcgKzE0MSw3IEBACiB7CiAJaW50IGk7CiAKLQludW0gJj0gMHgwMDBmOwkJLyogIE1ha2Ugc3VyZSB0aGF0IDAgPD0gbnVtIDw9IDE1ICovCisJbnVtICY9IDB4MDAwZjsJCS8qIE1ha2Ugc3VyZSB0aGF0IDAgPD0gbnVtIDw9IDE1ICovCiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewogCQlzZXRfdTE2KCZjaGFubmVsLT50cmFuc2Zvcm1zW251bV0ubGlua1tpXS5saW5rX3R5cGUsCiAJCQl0cmFuc2YubGlua1tpXS5saW5rX3R5cGUpOwpAQCAtMzIzLDEwICszMjMsMTAgQEAKIAlpbnQgdmFsdWU7CiAKIAlpZiAocG9zICYmIHZhbCkgewotCQkvKiAgU2tpcCBvdmVyIG5vbiBoZXggKi8KKwkJLyogU2tpcCBvdmVyIG5vbiBoZXggKi8KIAkJZm9yICg7ICpwb3MgPCBzaXplICYmICFpc3hkaWdpdChkYXRhWypwb3NdKTsgKCpwb3MpKyspCiAJCQk7Ci0JCS8qICBDb2xsZWN0IHZhbHVlICovCisJCS8qIENvbGxlY3QgdmFsdWUgKi8KIAkJKnZhbCA9IDA7CiAJCWZvciAoOyAqcG9zIDwgc2l6ZTsgKCpwb3MpKyspIHsKIAkJCXZhbHVlID0gaGV4X3RvX2JpbihkYXRhWypwb3NdKTsKQEAgLTQ0OCw3ICs0NDgsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGpyM19wY2lfcG9sbF9kZWxheSBqcjNfcGNpX3BvbGxfc3ViZGV2aWNlKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQorc3RhdGljIHN0cnVjdCBqcjNfcGNpX3BvbGxfZGVsYXkKK2pyM19wY2lfcG9sbF9zdWJkZXZpY2Uoc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7CiAJc3RydWN0IGpyM19wY2lfc3ViZGV2X3ByaXZhdGUgKnNwcml2ID0gcy0+cHJpdmF0ZTsKIAlzdHJ1Y3QganIzX3BjaV9wb2xsX2RlbGF5IHJlc3VsdCA9IHBvbGxfZGVsYXlfbWluX21heCgxMDAwLCAyMDAwKTsKQEAgLTczMywxMyArNzM0LDEzIEBACiAJCX0KIAl9CiAKLQkvKiAgUmVzZXQgRFNQIGNhcmQgKi8KKwkvKiBSZXNldCBEU1AgY2FyZCAqLwogCXdyaXRlbCgwLCAmZGV2cHJpdi0+aW9iYXNlLT5jaGFubmVsWzBdLnJlc2V0KTsKIAogCXJldCA9IGNvbWVkaV9sb2FkX2Zpcm13YXJlKGRldiwgJmNvbWVkaV90b19wY2lfZGV2KGRldiktPmRldiwKIAkJCQkgICAiY29tZWRpL2pyM3BjaS5pZG0iLAogCQkJCSAgIGpyM19kb3dubG9hZF9maXJtd2FyZSwgMCk7Ci0JZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwgIkZpcm1hcmUgbG9hZCAlZFxuIiwgcmV0KTsKKwlkZXZfZGJnKGRldi0+Y2xhc3NfZGV2LCAiRmlybXdhcmUgbG9hZCAlZFxuIiwgcmV0KTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAkvKgpAQCAtNzYzLDcgKzc2NCw3IEBACiAJCQkJZGF0YS5jb3B5cmlnaHRbaV0pID4+IDgpOwogCX0KIAotCS8qICBTdGFydCBjYXJkIHRpbWVyICovCisJLyogU3RhcnQgY2FyZCB0aW1lciAqLwogCWZvciAoaSA9IDA7IGkgPCBkZXYtPm5fc3ViZGV2aWNlczsgaSsrKSB7CiAJCXMgPSAmZGV2LT5zdWJkZXZpY2VzW2ldOwogCQlzcHJpdiA9IHMtPnByaXZhdGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvanIzX3BjaS5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2pyM19wY2kuaAppbmRleCAzNTY4MTFkLi5mMTBhODRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvanIzX3BjaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9qcjNfcGNpLmgKQEAgLTEsNCArMSw1IEBACi0vKiBIZWxwZXIgdHlwZXMgdG8gdGFrZSBjYXJlIG9mIHRoZSBmYWN0IHRoYXQgdGhlIERTUCBjYXJkIG1lbW9yeQorLyoKKyAqIEhlbHBlciB0eXBlcyB0byB0YWtlIGNhcmUgb2YgdGhlIGZhY3QgdGhhdCB0aGUgRFNQIGNhcmQgbWVtb3J5CiAgKiBpcyAxNiBiaXRzLCBidXQgYWxpZ25lZCBvbiBhIDMyIGJpdCBQQ0kgYm91bmRhcnkKICAqLwogCkBAIC0yMiw3ICsyMyw4IEBACiAJd3JpdGVsKHZhbCwgcCk7CiB9CiAKLS8qIFRoZSByYXcgZGF0YSBpcyBzdG9yZWQgaW4gYSBmb3JtYXQgd2hpY2ggZmFjaWxpdGF0ZXMgcmFwaWQKKy8qCisgKiBUaGUgcmF3IGRhdGEgaXMgc3RvcmVkIGluIGEgZm9ybWF0IHdoaWNoIGZhY2lsaXRhdGVzIHJhcGlkCiAgKiBwcm9jZXNzaW5nIGJ5IHRoZSBKUjMgRFNQIGNoaXAuIFRoZSByYXdfY2hhbm5lbCBzdHJ1Y3R1cmUgc2hvd3MgdGhlCiAgKiBmb3JtYXQgZm9yIGEgc2luZ2xlIGNoYW5uZWwgb2YgZGF0YS4gRWFjaCBjaGFubmVsIHRha2VzIGZvdXIsCiAgKiB0d28tYnl0ZSB3b3Jkcy4KQEAgLTQ3LDcgKzQ5LDggQEAKIAlzMzIgcmVzZXJ2ZWRbMl07CiB9OwogCi0vKiBUaGUgZm9yY2VfYXJyYXkgc3RydWN0dXJlIHNob3dzIHRoZSBsYXlvdXQgZm9yIHRoZSBkZWNvdXBsZWQgYW5kCisvKgorICogVGhlIGZvcmNlX2FycmF5IHN0cnVjdHVyZSBzaG93cyB0aGUgbGF5b3V0IGZvciB0aGUgZGVjb3VwbGVkIGFuZAogICogZmlsdGVyZWQgZm9yY2UgZGF0YS4KICAqLwogc3RydWN0IGZvcmNlX2FycmF5IHsKQEAgLTYxLDcgKzY0LDggQEAKIAlzMzIgdjI7CiB9OwogCi0vKiBUaGUgc2l4X2F4aXNfYXJyYXkgc3RydWN0dXJlIHNob3dzIHRoZSBsYXlvdXQgZm9yIHRoZSBvZmZzZXRzIGFuZAorLyoKKyAqIFRoZSBzaXhfYXhpc19hcnJheSBzdHJ1Y3R1cmUgc2hvd3MgdGhlIGxheW91dCBmb3IgdGhlIG9mZnNldHMgYW5kCiAgKiB0aGUgZnVsbCBzY2FsZXMuCiAgKi8KIHN0cnVjdCBzaXhfYXhpc19hcnJheSB7CkBAIC03NCw3ICs3OCw4IEBACiB9OwogCiAvKiBWRUNUX0JJVFMgKi8KLS8qIFRoZSB2ZWN0X2JpdHMgc3RydWN0dXJlIHNob3dzIHRoZSBsYXlvdXQgZm9yIGluZGljYXRpbmcKKy8qCisgKiBUaGUgdmVjdF9iaXRzIHN0cnVjdHVyZSBzaG93cyB0aGUgbGF5b3V0IGZvciBpbmRpY2F0aW5nCiAgKiB3aGljaCBheGVzIHRvIHVzZSBpbiBjb21wdXRpbmcgdGhlIHZlY3RvcnMuIEVhY2ggYml0IHNpZ25pZmllcwogICogc2VsZWN0aW9uIG9mIGEgc2luZ2xlIGF4aXMuIFRoZSBWMXggYXhpcyBiaXQgY29ycmVzcG9uZHMgdG8gYSBoZXgKICAqIHZhbHVlIG9mIDB4MDAwMSBhbmQgdGhlIFYyeiBiaXQgY29ycmVzcG9uZHMgdG8gYSBoZXggdmFsdWUgb2YKQEAgLTEwMCwxMiArMTA1LDE0IEBACiB9OwogCiAvKiBXQVJOSU5HX0JJVFMgKi8KLS8qIFRoZSB3YXJuaW5nX2JpdHMgc3RydWN0dXJlIHNob3dzIHRoZSBiaXQgcGF0dGVybiBmb3IgdGhlIHdhcm5pbmcKKy8qCisgKiBUaGUgd2FybmluZ19iaXRzIHN0cnVjdHVyZSBzaG93cyB0aGUgYml0IHBhdHRlcm4gZm9yIHRoZSB3YXJuaW5nCiAgKiB3b3JkLiBUaGUgYml0IGZpZWxkcyBhcmUgc2hvd24gZnJvbSBiaXQgMCAobHNiKSB0byBiaXQgMTUgKG1zYikuCiAgKi8KIAotLyogIFhYX05FQVJfU0VUICovCi0vKiBUaGUgeHhfbmVhcl9zYXQgYml0cyBzaWduaWZ5IHRoYXQgdGhlIGluZGljYXRlZCBheGlzIGhhcyByZWFjaGVkIG9yCisvKiBYWF9ORUFSX1NFVCAqLworLyoKKyAqIFRoZSB4eF9uZWFyX3NhdCBiaXRzIHNpZ25pZnkgdGhhdCB0aGUgaW5kaWNhdGVkIGF4aXMgaGFzIHJlYWNoZWQgb3IKICAqIGV4Y2VlZGVkIHRoZSBuZWFyIHNhdHVyYXRpb24gdmFsdWUuCiAgKi8KIApAQCAtMTE4LDEyICsxMjUsMTMgQEAKIAltel9uZWFyX3NhdCA9IDB4MDAyMAogfTsKIAotLyogIEVSUk9SX0JJVFMgKi8KLS8qICBYWF9TQVQgKi8KLS8qICBNRU1PUllfRVJST1IgKi8KLS8qICBTRU5TT1JfQ0hBTkdFICovCisvKiBFUlJPUl9CSVRTICovCisvKiBYWF9TQVQgKi8KKy8qIE1FTU9SWV9FUlJPUiAqLworLyogU0VOU09SX0NIQU5HRSAqLwogCi0vKiBUaGUgZXJyb3JfYml0cyBzdHJ1Y3R1cmUgc2hvd3MgdGhlIGJpdCBwYXR0ZXJuIGZvciB0aGUgZXJyb3Igd29yZC4KKy8qCisgKiBUaGUgZXJyb3JfYml0cyBzdHJ1Y3R1cmUgc2hvd3MgdGhlIGJpdCBwYXR0ZXJuIGZvciB0aGUgZXJyb3Igd29yZC4KICAqIFRoZSBiaXQgZmllbGRzIGFyZSBzaG93biBmcm9tIGJpdCAwIChsc2IpIHRvIGJpdCAxNSAobXNiKS4gVGhlCiAgKiB4eF9zYXQgYml0cyBzaWduaWZ5IHRoYXQgdGhlIGluZGljYXRlZCBheGlzIGhhcyByZWFjaGVkIG9yIGV4Y2VlZGVkCiAgKiB0aGUgc2F0dXJhdGlvbiB2YWx1ZS4gVGhlIG1lbW9yeV9lcnJvciBiaXQgaW5kaWNhdGVzIHRoYXQgYSBwcm9ibGVtCkBAIC0xMzQsOSArMTQyLDEwIEBACiAgKgogICovCiAKLS8qICBTWVNURU1fQlVTWSAqLworLyogU1lTVEVNX0JVU1kgKi8KIAotLyogVGhlIHN5c3RlbV9idXN5IGJpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgSlIzIERTUCBpcyBjdXJyZW50bHkgYnVzeQorLyoKKyAqIFRoZSBzeXN0ZW1fYnVzeSBiaXQgaW5kaWNhdGVzIHRoYXQgdGhlIEpSMyBEU1AgaXMgY3VycmVudGx5IGJ1c3kKICAqIGFuZCBpcyBub3QgY2FsY3VsYXRpbmcgZm9yY2UgZGF0YS4gVGhpcyBvY2N1cnMgd2hlbiBhIG5ldwogICogY29vcmRpbmF0ZSB0cmFuc2Zvcm1hdGlvbiwgb3IgbmV3IHNlbnNvciBmdWxsIHNjYWxlIGlzIHNldCBieSB0aGUKICAqIHVzZXIuIEEgdmVyeSBmYXN0IHN5c3RlbSB1c2luZyB0aGUgZm9yY2UgZGF0YSBmb3IgZmVlZGJhY2sgbWlnaHQKQEAgLTE0Niw5ICsxNTUsMTAgQEAKICAqIGNhbGlicmF0aW9uIENSQy4KICAqLwogCi0vKiAgQ0FMX0NSQ19CQUQgKi8KKy8qIENBTF9DUkNfQkFEICovCiAKLS8qIFRoZSBjYWxfY3JjX2JhZCBiaXQgaW5kaWNhdGVzIHRoYXQgdGhlIGNhbGlicmF0aW9uIENSQyBoYXMgbm90CisvKgorICogVGhlIGNhbF9jcmNfYmFkIGJpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2FsaWJyYXRpb24gQ1JDIGhhcyBub3QKICAqIGNhbGN1bGF0ZWQgdG8gemVyby4gQ1JDIGlzIHNob3J0IGZvciBjeWNsaWMgcmVkdW5kYW5jeSBjb2RlLiBJdCBpcwogICogYSBtZXRob2QgZm9yIGRldGVybWluaW5nIHRoZSBpbnRlZ3JpdHkgb2YgbWVzc2FnZXMgaW4gZGF0YQogICogY29tbXVuaWNhdGlvbi4gVGhlIGNhbGlicmF0aW9uIGRhdGEgc3RvcmVkIGluc2lkZSB0aGUgc2Vuc29yIGlzCkBAIC0xNjgsNyArMTc4LDggQEAKIC8qIFdBVENIX0RPRyAqLwogLyogV0FUQ0hfRE9HMiAqLwogCi0vKiBUaGUgd2F0Y2hfZG9nIGFuZCB3YXRjaF9kb2cyIGJpdHMgYXJlIHNlbnNvciwgbm90IHByb2Nlc3Nvciwgd2F0Y2gKKy8qCisgKiBUaGUgd2F0Y2hfZG9nIGFuZCB3YXRjaF9kb2cyIGJpdHMgYXJlIHNlbnNvciwgbm90IHByb2Nlc3Nvciwgd2F0Y2gKICAqIGRvZyBiaXRzLiBXYXRjaF9kb2cgaW5kaWNhdGVzIHRoYXQgdGhlIHNlbnNvciBkYXRhIGxpbmUgc2VlbXMgdG8gYmUKICAqIGFjdGluZyBjb3JyZWN0bHksIHdoaWxlIHdhdGNoX2RvZzIgaW5kaWNhdGVzIHRoYXQgc2Vuc29yIGRhdGEgYW5kCiAgKiBjbG9jayBhcmUgYmVpbmcgcmVjZWl2ZWQuIEl0IGlzIHBvc3NpYmxlIGZvciB3YXRjaF9kb2cyIHRvIGdvIG9mZgpAQCAtMTkyLDkgKzIwMywxMCBAQAogCXdhdGNoX2RvZyA9IDB4ODAwMAogfTsKIAotLyogIFRIUkVTSF9TVFJVQ1QgKi8KKy8qIFRIUkVTSF9TVFJVQ1QgKi8KIAotLyogVGhpcyBzdHJ1Y3R1cmUgc2hvd3MgdGhlIGxheW91dCBmb3IgYSBzaW5nbGUgdGhyZXNob2xkIHBhY2tldCBpbnNpZGUgb2YgYQorLyoKKyAqIFRoaXMgc3RydWN0dXJlIHNob3dzIHRoZSBsYXlvdXQgZm9yIGEgc2luZ2xlIHRocmVzaG9sZCBwYWNrZXQgaW5zaWRlIG9mIGEKICAqIGxvYWQgZW52ZWxvcGUuIEVhY2ggbG9hZCBlbnZlbG9wZSBjYW4gY29udGFpbiBzZXZlcmFsIHRocmVzaG9sZCBzdHJ1Y3R1cmVzLgogICogMS4gZGF0YV9hZGRyZXNzIGNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhIGZvciB0aGF0IHRocmVzaG9sZC4gVGhpcwogICogICAgaW5jbHVkZXMgZmlsdGVyZWQsIHVuZmlsdGVyZWQsIHJhdywgcmF0ZSwgY291bnRlcnMsIGVycm9yIGFuZCB3YXJuaW5nIGRhdGEKQEAgLTIxMCw5ICsyMjIsMTAgQEAKIAlzMzIgYml0X3BhdHRlcm47CiB9OwogCi0vKiAgTEVfU1RSVUNUICovCisvKiBMRV9TVFJVQ1QgKi8KIAotLyogTGF5b3V0IG9mIGEgbG9hZCBlbnZlbG9wZWQgcGFja2V0LiBGb3VyIHRocmVzaG9sZHMgYXJlIHNob3dlZCAuLi4gZm9yIG1vcmUKKy8qCisgKiBMYXlvdXQgb2YgYSBsb2FkIGVudmVsb3BlZCBwYWNrZXQuIEZvdXIgdGhyZXNob2xkcyBhcmUgc2hvd2VkIC4uLiBmb3IgbW9yZQogICogc2VlIG1hbnVhbCAocGFnLjI1KQogICogMS4gbGF0Y2hfYml0cyBpcyBhIGJpdCBwYXR0ZXJuIHRoYXQgc2hvdyB3aGljaCBiaXRzIHRoZSB1c2VyIHdhbnRzIHRvIGxhdGNoLgogICogICAgVGhlIGxhdGNoZWQgYml0cyB3aWxsIG5vdCBiZSByZXNldCBvbmNlIHRoZSB0aHJlc2hvbGQgd2hpY2ggc2V0IHRoZW0gaXMKQEAgLTIyOCw4ICsyNDEsOSBAQAogCXMzMiByZXNlcnZlZDsKIH07CiAKLS8qICBMSU5LX1RZUEVTICovCi0vKiBMaW5rIHR5cGVzIGlzIGFuIGVudW1lcmF0ZWQgdmFsdWUgc2hvd2luZyB0aGUgZGlmZmVyZW50IHBvc3NpYmxlIHRyYW5zZm9ybQorLyogTElOS19UWVBFUyAqLworLyoKKyAqIExpbmsgdHlwZXMgaXMgYW4gZW51bWVyYXRlZCB2YWx1ZSBzaG93aW5nIHRoZSBkaWZmZXJlbnQgcG9zc2libGUgdHJhbnNmb3JtCiAgKiBsaW5rIHR5cGVzLgogICogMCAtIGVuZCB0cmFuc2Zvcm0gcGFja2V0CiAgKiAxIC0gdHJhbnNsYXRlIGFsb25nIFggYXhpcyAoVFgpCkBAIC0yNTIsOCArMjY2LDggQEAKIAluZWcKIH07CiAKLS8qICBUUkFOU0ZPUk0gKi8KLS8qICBTdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSBhIHRyYW5zZm9ybS4gKi8KKy8qIFRSQU5TRk9STSAqLworLyogU3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgYSB0cmFuc2Zvcm0uICovCiBzdHJ1Y3QgaW50ZXJuX3RyYW5zZm9ybSB7CiAJc3RydWN0IHsKIAkJdTMyIGxpbmtfdHlwZTsKQEAgLTI2MSwyMyArMjc1LDI5IEBACiAJfSBsaW5rWzhdOwogfTsKIAotLyogIEpSMyBmb3JjZS90b3JxdWUgc2Vuc29yIGRhdGEgZGVmaW5pdGlvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHNlbnNvcgotICogIGFuZCBoYXJkd2FyZSBtYW51YWxzLgorLyoKKyAqIEpSMyBmb3JjZS90b3JxdWUgc2Vuc29yIGRhdGEgZGVmaW5pdGlvbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHNlbnNvcgorICogYW5kIGhhcmR3YXJlIG1hbnVhbHMuCiAgKi8KIAogc3RydWN0IGpyM19jaGFubmVsIHsKLQkvKiAgUmF3X2NoYW5uZWxzIGlzIHRoZSBhcmVhIHVzZWQgdG8gc3RvcmUgdGhlIHJhdyBkYXRhIGNvbWluZyBmcm9tICovCi0JLyogIHRoZSBzZW5zb3IuICovCisJLyoKKwkgKiBSYXdfY2hhbm5lbHMgaXMgdGhlIGFyZWEgdXNlZCB0byBzdG9yZSB0aGUgcmF3IGRhdGEgY29taW5nIGZyb20KKwkgKiB0aGUgc2Vuc29yLgorCSAqLwogCiAJc3RydWN0IHJhd19jaGFubmVsIHJhd19jaGFubmVsc1sxNl07CS8qIG9mZnNldCAweDAwMDAgKi8KIAotCS8qICBDb3B5cmlnaHQgaXMgYSBudWxsIHRlcm1pbmF0ZWQgQVNDSUkgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIEpSMyAqLwotCS8qICBjb3B5cmlnaHQgbm90aWNlLiAqLworCS8qCisJICogQ29weXJpZ2h0IGlzIGEgbnVsbCB0ZXJtaW5hdGVkIEFTQ0lJIHN0cmluZyBjb250YWluaW5nIHRoZSBKUjMKKwkgKiBjb3B5cmlnaHQgbm90aWNlLgorCSAqLwogCiAJdTMyIGNvcHlyaWdodFsweDAwMThdOwkvKiBvZmZzZXQgMHgwMDQwICovCiAJczMyIHJlc2VydmVkMVsweDAwMDhdOwkvKiBvZmZzZXQgMHgwMDU4ICovCiAKLQkvKiBTaHVudHMgY29udGFpbnMgdGhlIHNlbnNvciBzaHVudCByZWFkaW5ncy4gU29tZSBKUjMgc2Vuc29ycyBoYXZlCisJLyoKKwkgKiBTaHVudHMgY29udGFpbnMgdGhlIHNlbnNvciBzaHVudCByZWFkaW5ncy4gU29tZSBKUjMgc2Vuc29ycyBoYXZlCiAJICogdGhlIGFiaWxpdHkgdG8gaGF2ZSB0aGVpciBnYWlucyBhZGp1c3RlZC4gVGhpcyBhbGxvd3MgdGhlCiAJICogaGFyZHdhcmUgZnVsbCBzY2FsZXMgdG8gYmUgYWRqdXN0ZWQgdG8gcG90ZW50aWFsbHkgYWxsb3cKIAkgKiBiZXR0ZXIgcmVzb2x1dGlvbiBvciBkeW5hbWljIHJhbmdlLiBGb3Igc2Vuc29ycyB0aGF0IGhhdmUKQEAgLTI5OCwyNSArMzE4LDI5IEBACiAJICogY29tbWFuZCAoMTApIHNldCBuZXcgZnVsbCBzY2FsZXMgKHBnLiAzOCkuCiAJICovCiAKLQlzdHJ1Y3Qgc2l4X2F4aXNfYXJyYXkgc2h1bnRzOwkvKiBvZmZzZXQgMHgwMDYwICovCi0JczMyIHJlc2VydmVkMlsyXTsJLyogb2Zmc2V0IDB4MDA2NiAqLworCXN0cnVjdCBzaXhfYXhpc19hcnJheSBzaHVudHM7CQkvKiBvZmZzZXQgMHgwMDYwICovCisJczMyIHJlc2VydmVkMlsyXTsJCQkvKiBvZmZzZXQgMHgwMDY2ICovCiAKLQkvKiBEZWZhdWx0X0ZTIGNvbnRhaW5zIHRoZSBmdWxsIHNjYWxlIHRoYXQgaXMgdXNlZCBpZiB0aGUgdXNlciBkb2VzICovCi0JLyogbm90IHNldCBhIGZ1bGwgc2NhbGUuICovCisJLyoKKwkgKiBEZWZhdWx0X0ZTIGNvbnRhaW5zIHRoZSBmdWxsIHNjYWxlIHRoYXQgaXMgdXNlZCBpZiB0aGUgdXNlciBkb2VzCisJICogbm90IHNldCBhIGZ1bGwgc2NhbGUuCisJICovCiAKIAlzdHJ1Y3Qgc2l4X2F4aXNfYXJyYXkgZGVmYXVsdF9GUzsJLyogb2Zmc2V0IDB4MDA2OCAqLwotCXMzMiByZXNlcnZlZDM7CQkvKiBvZmZzZXQgMHgwMDZlICovCisJczMyIHJlc2VydmVkMzsJCQkJLyogb2Zmc2V0IDB4MDA2ZSAqLwogCi0JLyogTG9hZF9lbnZlbG9wZV9udW0gaXMgdGhlIGxvYWQgZW52ZWxvcGUgbnVtYmVyIHRoYXQgaXMgY3VycmVudGx5CisJLyoKKwkgKiBMb2FkX2VudmVsb3BlX251bSBpcyB0aGUgbG9hZCBlbnZlbG9wZSBudW1iZXIgdGhhdCBpcyBjdXJyZW50bHkKIAkgKiBpbiB1c2UuIFRoaXMgdmFsdWUgaXMgc2V0IGJ5IHRoZSB1c2VyIGFmdGVyIG9uZSBvZiB0aGUgbG9hZAogCSAqIGVudmVsb3BlcyBoYXMgYmVlbiBpbml0aWFsaXplZC4KIAkgKi8KIAotCXMzMiBsb2FkX2VudmVsb3BlX251bTsJLyogb2Zmc2V0IDB4MDA2ZiAqLworCXMzMiBsb2FkX2VudmVsb3BlX251bTsJCQkvKiBvZmZzZXQgMHgwMDZmICovCiAKIAkvKiBNaW5fZnVsbF9zY2FsZSBpcyB0aGUgcmVjb21tZW5kIG1pbmltdW0gZnVsbCBzY2FsZS4gKi8KIAotCS8qIFRoZXNlIHZhbHVlcyBpbiBjb25qdW5jdGlvbiB3aXRoIG1heF9mdWxsX3NjYWxlIChwZy4gOSkgaGVscHMKKwkvKgorCSAqIFRoZXNlIHZhbHVlcyBpbiBjb25qdW5jdGlvbiB3aXRoIG1heF9mdWxsX3NjYWxlIChwZy4gOSkgaGVscHMKIAkgKiBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGZvciBzZXR0aW5nIHRoZSBmdWxsIHNjYWxlcy4gVGhlCiAJICogc29mdHdhcmUgYWxsb3dzIHRoZSB1c2VyIHRvIHNldCB0aGUgc2Vuc29yIGZ1bGwgc2NhbGUgdG8gYW4KIAkgKiBhcmJpdHJhcnkgdmFsdWUuIEJ1dCBzZXR0aW5nIHRoZSBmdWxsIHNjYWxlcyBoYXMgc29tZSBoYXphcmRzLiBJZgpAQCAtMzQyLDMwICszNjYsMzUgQEAKIAkgKi8KIAogCXN0cnVjdCBzaXhfYXhpc19hcnJheSBtaW5fZnVsbF9zY2FsZTsJLyogb2Zmc2V0IDB4MDA3MCAqLwotCXMzMiByZXNlcnZlZDQ7CQkvKiBvZmZzZXQgMHgwMDc2ICovCisJczMyIHJlc2VydmVkNDsJCQkJLyogb2Zmc2V0IDB4MDA3NiAqLwogCi0JLyogVHJhbnNmb3JtX251bSBpcyB0aGUgdHJhbnNmb3JtIG51bWJlciB0aGF0IGlzIGN1cnJlbnRseSBpbiB1c2UuCisJLyoKKwkgKiBUcmFuc2Zvcm1fbnVtIGlzIHRoZSB0cmFuc2Zvcm0gbnVtYmVyIHRoYXQgaXMgY3VycmVudGx5IGluIHVzZS4KIAkgKiBUaGlzIHZhbHVlIGlzIHNldCBieSB0aGUgSlIzIERTUCBhZnRlciB0aGUgdXNlciBoYXMgdXNlZCBjb21tYW5kCiAJICogKDUpIHVzZSB0cmFuc2Zvcm0gIyAocGcuIDMzKS4KIAkgKi8KIAotCXMzMiB0cmFuc2Zvcm1fbnVtOwkvKiBvZmZzZXQgMHgwMDc3ICovCisJczMyIHRyYW5zZm9ybV9udW07CQkJLyogb2Zmc2V0IDB4MDA3NyAqLwogCi0JLyogIE1heF9mdWxsX3NjYWxlIGlzIHRoZSByZWNvbW1lbmRlZCBtYXhpbXVtIGZ1bGwgc2NhbGUuIFNlZSAqLwotCS8qICBtaW5fZnVsbF9zY2FsZSAocGcuIDkpIGZvciBtb3JlIGRldGFpbHMuICovCisJLyoKKwkgKiBNYXhfZnVsbF9zY2FsZSBpcyB0aGUgcmVjb21tZW5kZWQgbWF4aW11bSBmdWxsIHNjYWxlLgorCSAqIFNlZSBtaW5fZnVsbF9zY2FsZSAocGcuIDkpIGZvciBtb3JlIGRldGFpbHMuCisJICovCiAKIAlzdHJ1Y3Qgc2l4X2F4aXNfYXJyYXkgbWF4X2Z1bGxfc2NhbGU7CS8qIG9mZnNldCAweDAwNzggKi8KLQlzMzIgcmVzZXJ2ZWQ1OwkJLyogb2Zmc2V0IDB4MDA3ZSAqLworCXMzMiByZXNlcnZlZDU7CQkJCS8qIG9mZnNldCAweDAwN2UgKi8KIAotCS8qIFBlYWtfYWRkcmVzcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YSB3aGljaCB3aWxsIGJlIG1vbml0b3JlZAorCS8qCisJICogUGVha19hZGRyZXNzIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhIHdoaWNoIHdpbGwgYmUgbW9uaXRvcmVkCiAJICogYnkgdGhlIHBlYWsgcm91dGluZS4gVGhpcyB2YWx1ZSBpcyBzZXQgYnkgdGhlIHVzZXIuIFRoZSBwZWFrCiAJICogcm91dGluZSB3aWxsIG1vbml0b3IgYW55IDggY29udGlndW91cyBhZGRyZXNzZXMgZm9yIHBlYWsgdmFsdWVzLgogCSAqIChleC4gdG8gd2F0Y2ggZmlsdGVyMyBkYXRhIGZvciBwZWFrcywgc2V0IHRoaXMgdmFsdWUgdG8gMHgwMGE4KS4KIAkgKi8KIAotCXMzMiBwZWFrX2FkZHJlc3M7CS8qIG9mZnNldCAweDAwN2YgKi8KKwlzMzIgcGVha19hZGRyZXNzOwkJCS8qIG9mZnNldCAweDAwN2YgKi8KIAotCS8qIEZ1bGxfc2NhbGUgaXMgdGhlIHNlbnNvciBmdWxsIHNjYWxlcyB3aGljaCBhcmUgY3VycmVudGx5IGluIHVzZS4KKwkvKgorCSAqIEZ1bGxfc2NhbGUgaXMgdGhlIHNlbnNvciBmdWxsIHNjYWxlcyB3aGljaCBhcmUgY3VycmVudGx5IGluIHVzZS4KIAkgKiBEZWNvdXBsZWQgYW5kIGZpbHRlcmVkIGRhdGEgaXMgc2NhbGVkIHNvIHRoYXQgKy8tIDE2Mzg0IGlzIGVxdWFsCiAJICogdG8gdGhlIGZ1bGwgc2NhbGVzLiBUaGUgZW5naW5lZXJpbmcgdW5pdHMgdXNlZCBhcmUgaW5kaWNhdGVkIGJ5CiAJICogdGhlIHVuaXRzIHZhbHVlIGRpc2N1c3NlZCBvbiBwYWdlIDE2LiBUaGUgZnVsbCBzY2FsZXMgZm9yIEZ4LCBGeSwKQEAgLTM3Nyw5ICs0MDYsMTAgQEAKIAkgKiBheGVzIHVzZWQgZm9yIGVhY2ggdmVjdG9yIHJlc3BlY3RpdmVseS4KIAkgKi8KIAotCXN0cnVjdCBmb3JjZV9hcnJheSBmdWxsX3NjYWxlOwkvKiBvZmZzZXQgMHgwMDgwICovCisJc3RydWN0IGZvcmNlX2FycmF5IGZ1bGxfc2NhbGU7CQkvKiBvZmZzZXQgMHgwMDgwICovCiAKLQkvKiBPZmZzZXRzIGNvbnRhaW5zIHRoZSBzZW5zb3Igb2Zmc2V0cy4gVGhlc2UgdmFsdWVzIGFyZSBzdWJ0cmFjdGVkIGZyb20KKwkvKgorCSAqIE9mZnNldHMgY29udGFpbnMgdGhlIHNlbnNvciBvZmZzZXRzLiBUaGVzZSB2YWx1ZXMgYXJlIHN1YnRyYWN0ZWQgZnJvbQogCSAqIHRoZSBzZW5zb3IgZGF0YSB0byBvYnRhaW4gdGhlIGRlY291cGxlZCBkYXRhLiBUaGUgb2Zmc2V0cyBhcmUgc2V0IGEKIAkgKiBmZXcgc2Vjb25kcyAoPCAxMCkgYWZ0ZXIgdGhlIGNhbGlicmF0aW9uIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQuCiAJICogVGhleSBhcmUgc2V0IHNvIHRoYXQgdGhlIG91dHB1dCBkYXRhIHdpbGwgYmUgemVyby4gVGhlc2UgdmFsdWVzCkBAIC0zOTIsMjMgKzQyMiwyNiBAQAogCSAqIGFib3V0IFogYnkgOTAgZGVncmVlcywgRlkgd291bGQgYmUgNSBhbmQgYWxsIG90aGVycyB3b3VsZCBiZSB6ZXJvLgogCSAqLwogCi0Jc3RydWN0IHNpeF9heGlzX2FycmF5IG9mZnNldHM7CS8qIG9mZnNldCAweDAwODggKi8KKwlzdHJ1Y3Qgc2l4X2F4aXNfYXJyYXkgb2Zmc2V0czsJCS8qIG9mZnNldCAweDAwODggKi8KIAotCS8qIE9mZnNldF9udW0gaXMgdGhlIG51bWJlciBvZiB0aGUgb2Zmc2V0IGN1cnJlbnRseSBpbiB1c2UuIFRoaXMKKwkvKgorCSAqIE9mZnNldF9udW0gaXMgdGhlIG51bWJlciBvZiB0aGUgb2Zmc2V0IGN1cnJlbnRseSBpbiB1c2UuIFRoaXMKIAkgKiB2YWx1ZSBpcyBzZXQgYnkgdGhlIEpSMyBEU1AgYWZ0ZXIgdGhlIHVzZXIgaGFzIGV4ZWN1dGVkIHRoZSB1c2UKIAkgKiBvZmZzZXQgIyBjb21tYW5kIChwZy4gMzQpLiBJdCBjYW4gdmFyeSBiZXR3ZWVuIDAgYW5kIDE1LgogCSAqLwogCi0JczMyIG9mZnNldF9udW07CQkvKiBvZmZzZXQgMHgwMDhlICovCisJczMyIG9mZnNldF9udW07CQkJCS8qIG9mZnNldCAweDAwOGUgKi8KIAotCS8qIFZlY3RfYXhlcyBpcyBhIGJpdCBtYXAgc2hvd2luZyB3aGljaCBvZiB0aGUgYXhlcyBhcmUgYmVpbmcgdXNlZAorCS8qCisJICogVmVjdF9heGVzIGlzIGEgYml0IG1hcCBzaG93aW5nIHdoaWNoIG9mIHRoZSBheGVzIGFyZSBiZWluZyB1c2VkCiAJICogaW4gdGhlIHZlY3RvciBjYWxjdWxhdGlvbnMuIFRoaXMgdmFsdWUgaXMgc2V0IGJ5IHRoZSBKUjMgRFNQCiAJICogYWZ0ZXIgdGhlIHVzZXIgaGFzIGV4ZWN1dGVkIHRoZSBzZXQgdmVjdG9yIGF4ZXMgY29tbWFuZCAocGcuIDM3KS4KIAkgKi8KIAotCXUzMiB2ZWN0X2F4ZXM7CQkvKiBvZmZzZXQgMHgwMDhmICovCisJdTMyIHZlY3RfYXhlczsJCQkJLyogb2Zmc2V0IDB4MDA4ZiAqLwogCi0JLyogRmlsdGVyMCBpcyB0aGUgZGVjb3VwbGVkLCB1bmZpbHRlcmVkIGRhdGEgZnJvbSB0aGUgSlIzIHNlbnNvci4KKwkvKgorCSAqIEZpbHRlcjAgaXMgdGhlIGRlY291cGxlZCwgdW5maWx0ZXJlZCBkYXRhIGZyb20gdGhlIEpSMyBzZW5zb3IuCiAJICogVGhpcyBkYXRhIGhhcyBoYWQgdGhlIG9mZnNldHMgcmVtb3ZlZC4KIAkgKgogCSAqIFRoZXNlIGZvcmNlX2FycmF5cyBob2xkIHRoZSBmaWx0ZXJlZCBkYXRhLiBUaGUgZGVjb3VwbGVkIGRhdGEgaXMKQEAgLTQyMCwyMyArNDUzLDI3IEBACiAJICogY3V0b2ZmIGF0IDEyNSBIeiwgMzEuMjUgSHosIDcuODEzIEh6LCAxLjk1MyBIeiBhbmQgMC40ODgzIEh6LgogCSAqLwogCi0Jc3RydWN0IGZvcmNlX2FycmF5IGZpbHRlcls3XTsJLyogb2Zmc2V0IDB4MDA5MCwKLQkJCQkJICAgb2Zmc2V0IDB4MDA5OCwKLQkJCQkJICAgb2Zmc2V0IDB4MDBhMCwKLQkJCQkJICAgb2Zmc2V0IDB4MDBhOCwKLQkJCQkJICAgb2Zmc2V0IDB4MDBiMCwKLQkJCQkJICAgb2Zmc2V0IDB4MDBiOCAsCi0JCQkJCSAgIG9mZnNldCAweDAwYzAgKi8KKwlzdHJ1Y3QgZm9yY2VfYXJyYXkgZmlsdGVyWzddOwkJLyoKKwkJCQkJCSAqIG9mZnNldCAweDAwOTAsCisJCQkJCQkgKiBvZmZzZXQgMHgwMDk4LAorCQkJCQkJICogb2Zmc2V0IDB4MDBhMCwKKwkJCQkJCSAqIG9mZnNldCAweDAwYTgsCisJCQkJCQkgKiBvZmZzZXQgMHgwMGIwLAorCQkJCQkJICogb2Zmc2V0IDB4MDBiOCwKKwkJCQkJCSAqIG9mZnNldCAweDAwYzAKKwkJCQkJCSAqLwogCi0JLyogUmF0ZV9kYXRhIGlzIHRoZSBjYWxjdWxhdGVkIHJhdGUgZGF0YS4gSXQgaXMgYSBmaXJzdCBkZXJpdmF0aXZlCisJLyoKKwkgKiBSYXRlX2RhdGEgaXMgdGhlIGNhbGN1bGF0ZWQgcmF0ZSBkYXRhLiBJdCBpcyBhIGZpcnN0IGRlcml2YXRpdmUKIAkgKiBjYWxjdWxhdGlvbi4gSXQgaXMgY2FsY3VsYXRlZCBhdCBhIGZyZXF1ZW5jeSBzcGVjaWZpZWQgYnkgdGhlCiAJICogdmFyaWFibGUgcmF0ZV9kaXZpc29yIChwZy4gMTIpLiBUaGUgZGF0YSBvbiB3aGljaCB0aGUgcmF0ZSBpcwogCSAqIGNhbGN1bGF0ZWQgaXMgc3BlY2lmaWVkIGJ5IHRoZSB2YXJpYWJsZSByYXRlX2FkZHJlc3MgKHBnLiAxMikuCiAJICovCiAKLQlzdHJ1Y3QgZm9yY2VfYXJyYXkgcmF0ZV9kYXRhOwkvKiBvZmZzZXQgMHgwMGM4ICovCisJc3RydWN0IGZvcmNlX2FycmF5IHJhdGVfZGF0YTsJCS8qIG9mZnNldCAweDAwYzggKi8KIAotCS8qIE1pbmltdW1fZGF0YSAmIG1heGltdW1fZGF0YSBhcmUgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gKHBlYWspCisJLyoKKwkgKiBNaW5pbXVtX2RhdGEgJiBtYXhpbXVtX2RhdGEgYXJlIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIChwZWFrKQogCSAqIGRhdGEgdmFsdWVzLiBUaGUgSlIzIERTUCBjYW4gbW9uaXRvciBhbnkgOCBjb250aWd1b3VzIGRhdGEgaXRlbXMKIAkgKiBmb3IgbWluaW11bXMgYW5kIG1heGltdW1zIGF0IGZ1bGwgc2Vuc29yIGJhbmR3aWR0aC4gVGhpcyBhcmVhIGlzCiAJICogb25seSB1cGRhdGVkIGF0IHVzZXIgcmVxdWVzdC4gVGhpcyBpcyBkb25lIHNvIHRoYXQgdGhlIHVzZXIgZG9lcwpAQCAtNDUxLDcgKzQ4OCw4IEBACiAJc3RydWN0IGZvcmNlX2FycmF5IG1pbmltdW1fZGF0YTsJLyogb2Zmc2V0IDB4MDBkMCAqLwogCXN0cnVjdCBmb3JjZV9hcnJheSBtYXhpbXVtX2RhdGE7CS8qIG9mZnNldCAweDAwZDggKi8KIAotCS8qIE5lYXJfc2F0X3ZhbHVlICYgc2F0X3ZhbHVlIGNvbnRhaW4gdGhlIHZhbHVlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmCisJLyoKKwkgKiBOZWFyX3NhdF92YWx1ZSAmIHNhdF92YWx1ZSBjb250YWluIHRoZSB2YWx1ZSB1c2VkIHRvIGRldGVybWluZSBpZgogCSAqIHRoZSByYXcgc2Vuc29yIGlzIHNhdHVyYXRlZC4gQmVjYXVzZSBvZiBkZWNvdXBsaW5nIGFuZCBvZmZzZXQKIAkgKiByZW1vdmFsLCBpdCBpcyBkaWZmaWN1bHQgdG8gdGVsbCBmcm9tIHRoZSBwcm9jZXNzZWQgZGF0YSBpZiB0aGUKIAkgKiBzZW5zb3IgaXMgc2F0dXJhdGVkLiBUaGVzZSB2YWx1ZXMsIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGVycm9yCkBAIC00NjUsMTAgKzUwMywxMSBAQAogCSAqICAgc2F0X3ZhbHVlID0gMzI3NjggLSAyXigxNiAtIEFEQyBiaXRzKQogCSAqLwogCi0JczMyIG5lYXJfc2F0X3ZhbHVlOwkvKiBvZmZzZXQgMHgwMGUwICovCi0JczMyIHNhdF92YWx1ZTsJCS8qIG9mZnNldCAweDAwZTEgKi8KKwlzMzIgbmVhcl9zYXRfdmFsdWU7CQkJLyogb2Zmc2V0IDB4MDBlMCAqLworCXMzMiBzYXRfdmFsdWU7CQkJCS8qIG9mZnNldCAweDAwZTEgKi8KIAotCS8qIFJhdGVfYWRkcmVzcywgcmF0ZV9kaXZpc29yICYgcmF0ZV9jb3VudCBjb250YWluIHRoZSBkYXRhIHVzZWQgdG8KKwkvKgorCSAqIFJhdGVfYWRkcmVzcywgcmF0ZV9kaXZpc29yICYgcmF0ZV9jb3VudCBjb250YWluIHRoZSBkYXRhIHVzZWQgdG8KIAkgKiBjb250cm9sIHRoZSBjYWxjdWxhdGlvbnMgb2YgdGhlIHJhdGVzLiBSYXRlX2FkZHJlc3MgaXMgdGhlCiAJICogYWRkcmVzcyBvZiB0aGUgZGF0YSB1c2VkIGZvciB0aGUgcmF0ZSBjYWxjdWxhdGlvbi4gVGhlIEpSMyBEU1AKIAkgKiB3aWxsIGNhbGN1bGF0ZSByYXRlcyBmb3IgYW55IDggY29udGlndW91cyB2YWx1ZXMgKGV4LiB0bwpAQCAtNDg1LDExICs1MjQsMTIgQEAKIAkgKiB3aWxsIG1pbmltaXplIHRoZSB0aW1lIG5lY2Vzc2FyeSB0byBzdGFydCB0aGUgcmF0ZSBjYWxjdWxhdGlvbnMuCiAJICovCiAKLQlzMzIgcmF0ZV9hZGRyZXNzOwkvKiBvZmZzZXQgMHgwMGUyICovCi0JdTMyIHJhdGVfZGl2aXNvcjsJLyogb2Zmc2V0IDB4MDBlMyAqLwotCXUzMiByYXRlX2NvdW50OwkJLyogb2Zmc2V0IDB4MDBlNCAqLworCXMzMiByYXRlX2FkZHJlc3M7CQkJLyogb2Zmc2V0IDB4MDBlMiAqLworCXUzMiByYXRlX2Rpdmlzb3I7CQkJLyogb2Zmc2V0IDB4MDBlMyAqLworCXUzMiByYXRlX2NvdW50OwkJCQkvKiBvZmZzZXQgMHgwMGU0ICovCiAKLQkvKiBDb21tYW5kX3dvcmQyIHRocm91Z2ggY29tbWFuZF93b3JkMCBhcmUgdGhlIGxvY2F0aW9ucyB1c2VkIHRvCisJLyoKKwkgKiBDb21tYW5kX3dvcmQyIHRocm91Z2ggY29tbWFuZF93b3JkMCBhcmUgdGhlIGxvY2F0aW9ucyB1c2VkIHRvCiAJICogc2VuZCBjb21tYW5kcyB0byB0aGUgSlIzIERTUC4gVGhlaXIgdXNhZ2UgdmFyaWVzIHdpdGggdGhlIGNvbW1hbmQKIAkgKiBhbmQgaXMgZGV0YWlsZWQgbGF0ZXIgaW4gdGhlIENvbW1hbmQgRGVmaW5pdGlvbnMgc2VjdGlvbiAocGcuCiAJICogMjkpLiBJbiBnZW5lcmFsIHRoZSB1c2VyIHBsYWNlcyB2YWx1ZXMgaW50byB2YXJpb3VzIG1lbW9yeQpAQCAtNTAyLDExICs1NDIsMTIgQEAKIAkgKiBjb21tYW5kX3dvcmQxKS4KIAkgKi8KIAotCXMzMiBjb21tYW5kX3dvcmQyOwkvKiBvZmZzZXQgMHgwMGU1ICovCi0JczMyIGNvbW1hbmRfd29yZDE7CS8qIG9mZnNldCAweDAwZTYgKi8KLQlzMzIgY29tbWFuZF93b3JkMDsJLyogb2Zmc2V0IDB4MDBlNyAqLworCXMzMiBjb21tYW5kX3dvcmQyOwkJCS8qIG9mZnNldCAweDAwZTUgKi8KKwlzMzIgY29tbWFuZF93b3JkMTsJCQkvKiBvZmZzZXQgMHgwMGU2ICovCisJczMyIGNvbW1hbmRfd29yZDA7CQkJLyogb2Zmc2V0IDB4MDBlNyAqLwogCi0JLyogQ291bnQxIHRocm91Z2ggY291bnQ2IGFyZSB1bnNpZ25lZCBjb3VudGVycyB3aGljaCBhcmUgaW5jcmVtZW50ZWQKKwkvKgorCSAqIENvdW50MSB0aHJvdWdoIGNvdW50NiBhcmUgdW5zaWduZWQgY291bnRlcnMgd2hpY2ggYXJlIGluY3JlbWVudGVkCiAJICogZXZlcnkgdGltZSB0aGUgbWF0Y2hpbmcgZmlsdGVycyBhcmUgY2FsY3VsYXRlZC4gRmlsdGVyMSBpcwogCSAqIGNhbGN1bGF0ZWQgYXQgdGhlIHNlbnNvciBkYXRhIGJhbmR3aWR0aC4gU28gdGhpcyBjb3VudGVyIHdvdWxkCiAJICogaW5jcmVtZW50IGF0IDgga0h6IGZvciBhIHR5cGljYWwgc2Vuc29yLiBUaGUgcmVzdCBvZiB0aGUgY291bnRlcnMKQEAgLTUxOCwxNCArNTU5LDE1IEBACiAJICogb25jZS4KIAkgKi8KIAotCXUzMiBjb3VudDE7CQkvKiBvZmZzZXQgMHgwMGU4ICovCi0JdTMyIGNvdW50MjsJCS8qIG9mZnNldCAweDAwZTkgKi8KLQl1MzIgY291bnQzOwkJLyogb2Zmc2V0IDB4MDBlYSAqLwotCXUzMiBjb3VudDQ7CQkvKiBvZmZzZXQgMHgwMGViICovCi0JdTMyIGNvdW50NTsJCS8qIG9mZnNldCAweDAwZWMgKi8KLQl1MzIgY291bnQ2OwkJLyogb2Zmc2V0IDB4MDBlZCAqLworCXUzMiBjb3VudDE7CQkJCS8qIG9mZnNldCAweDAwZTggKi8KKwl1MzIgY291bnQyOwkJCQkvKiBvZmZzZXQgMHgwMGU5ICovCisJdTMyIGNvdW50MzsJCQkJLyogb2Zmc2V0IDB4MDBlYSAqLworCXUzMiBjb3VudDQ7CQkJCS8qIG9mZnNldCAweDAwZWIgKi8KKwl1MzIgY291bnQ1OwkJCQkvKiBvZmZzZXQgMHgwMGVjICovCisJdTMyIGNvdW50NjsJCQkJLyogb2Zmc2V0IDB4MDBlZCAqLwogCi0JLyogRXJyb3JfY291bnQgaXMgYSBydW5uaW5nIGNvdW50IG9mIGRhdGEgcmVjZXB0aW9uIGVycm9ycy4gSWYgdGhpcworCS8qCisJICogRXJyb3JfY291bnQgaXMgYSBydW5uaW5nIGNvdW50IG9mIGRhdGEgcmVjZXB0aW9uIGVycm9ycy4gSWYgdGhpcwogCSAqIGNvdW50ZXIgaXMgY2hhbmdpbmcgcmFwaWRseSwgaXQgcHJvYmFibHkgaW5kaWNhdGVzIGEgYmFkIHNlbnNvcgogCSAqIGNhYmxlIGNvbm5lY3Rpb24gb3Igb3RoZXIgaGFyZHdhcmUgcHJvYmxlbS4gSW4gbW9zdCBpbnN0YWxsYXRpb25zCiAJICogZXJyb3JfY291bnQgc2hvdWxkIG5vdCBjaGFuZ2UgYXQgYWxsLiBCdXQgaXQgaXMgcG9zc2libGUgaW4gYW4KQEAgLTUzNSw3NSArNTc3LDg0IEBACiAJICogd2hlcmUgdGhpcyBjb3VudGVyIGNvdW50cyBhIGJhZCBzYW1wbGUsIHRoYXQgc2FtcGxlIGlzIGlnbm9yZWQuCiAJICovCiAKLQl1MzIgZXJyb3JfY291bnQ7CS8qIG9mZnNldCAweDAwZWUgKi8KKwl1MzIgZXJyb3JfY291bnQ7CQkJLyogb2Zmc2V0IDB4MDBlZSAqLwogCi0JLyogQ291bnRfeCBpcyBhIGNvdW50ZXIgd2hpY2ggaXMgaW5jcmVtZW50ZWQgZXZlcnkgdGltZSB0aGUgSlIzIERTUAorCS8qCisJICogQ291bnRfeCBpcyBhIGNvdW50ZXIgd2hpY2ggaXMgaW5jcmVtZW50ZWQgZXZlcnkgdGltZSB0aGUgSlIzIERTUAogCSAqIHNlYXJjaGVzIGl0cyBqb2IgcXVldWVzIGFuZCBmaW5kcyBub3RoaW5nIHRvIGRvLiBJdCBpbmRpY2F0ZXMgdGhlCiAJICogYW1vdW50IG9mIGlkbGUgdGltZSB0aGUgSlIzIERTUCBoYXMgYXZhaWxhYmxlLiBJdCBjYW4gYWxzbyBiZQogCSAqIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBKUjMgRFNQIGlzIGFsaXZlLiBTZWUgdGhlIFBlcmZvcm1hbmNlCiAJICogSXNzdWVzIHNlY3Rpb24gb24gcGcuIDQ5IGZvciBtb3JlIGRldGFpbHMuCiAJICovCiAKLQl1MzIgY291bnRfeDsJCS8qIG9mZnNldCAweDAwZWYgKi8KKwl1MzIgY291bnRfeDsJCQkJLyogb2Zmc2V0IDB4MDBlZiAqLwogCi0JLyogV2FybmluZ3MgJiBlcnJvcnMgY29udGFpbiB0aGUgd2FybmluZyBhbmQgZXJyb3IgYml0cworCS8qCisJICogV2FybmluZ3MgJiBlcnJvcnMgY29udGFpbiB0aGUgd2FybmluZyBhbmQgZXJyb3IgYml0cwogCSAqIHJlc3BlY3RpdmVseS4gVGhlIGZvcm1hdCBvZiB0aGVzZSB0d28gd29yZHMgaXMgZGlzY3Vzc2VkIG9uIHBhZ2UKIAkgKiAyMSB1bmRlciB0aGUgaGVhZGluZ3Mgd2FybmluZ3NfYml0cyBhbmQgZXJyb3JfYml0cy4KIAkgKi8KIAotCXUzMiB3YXJuaW5nczsJCS8qIG9mZnNldCAweDAwZjAgKi8KLQl1MzIgZXJyb3JzOwkJLyogb2Zmc2V0IDB4MDBmMSAqLworCXUzMiB3YXJuaW5nczsJCQkJLyogb2Zmc2V0IDB4MDBmMCAqLworCXUzMiBlcnJvcnM7CQkJCS8qIG9mZnNldCAweDAwZjEgKi8KIAotCS8qIFRocmVzaG9sZF9iaXRzIGlzIGEgd29yZCBjb250YWluaW5nIHRoZSBiaXRzIHRoYXQgYXJlIHNldCBieSB0aGUKKwkvKgorCSAqIFRocmVzaG9sZF9iaXRzIGlzIGEgd29yZCBjb250YWluaW5nIHRoZSBiaXRzIHRoYXQgYXJlIHNldCBieSB0aGUKIAkgKiBsb2FkIGVudmVsb3Blcy4gU2VlIGxvYWRfZW52ZWxvcGVzIChwZy4gMTcpIGFuZCB0aHJlc2hfc3RydWN0CiAJICogKHBnLiAyMykgZm9yIG1vcmUgZGV0YWlscy4KIAkgKi8KIAotCXMzMiB0aHJlc2hvbGRfYml0czsJLyogb2Zmc2V0IDB4MDBmMiAqLworCXMzMiB0aHJlc2hvbGRfYml0czsJCQkvKiBvZmZzZXQgMHgwMGYyICovCiAKLQkvKiBMYXN0X2NyYyBpcyB0aGUgdmFsdWUgdGhhdCBzaG93cyB0aGUgYWN0dWFsIGNhbGN1bGF0ZWQgQ1JDLiBDUkMKKwkvKgorCSAqIExhc3RfY3JjIGlzIHRoZSB2YWx1ZSB0aGF0IHNob3dzIHRoZSBhY3R1YWwgY2FsY3VsYXRlZCBDUkMuIENSQwogCSAqIGlzIHNob3J0IGZvciBjeWNsaWMgcmVkdW5kYW5jeSBjb2RlLiBJdCBzaG91bGQgYmUgemVyby4gU2VlIHRoZQogCSAqIGRlc2NyaXB0aW9uIGZvciBjYWxfY3JjX2JhZCAocGcuIDIxKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KIAkgKi8KIAotCXMzMiBsYXN0X0NSQzsJCS8qIG9mZnNldCAweDAwZjMgKi8KKwlzMzIgbGFzdF9DUkM7CQkJCS8qIG9mZnNldCAweDAwZjMgKi8KIAotCS8qIEVFUHJvbV92ZXJfbm8gY29udGFpbnMgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBzZW5zb3IgRUVQcm9tLgorCS8qCisJICogRUVQcm9tX3Zlcl9ubyBjb250YWlucyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHNlbnNvciBFRVByb20uCiAJICogRUVQcm9tIHZlcnNpb24gbnVtYmVycyBjYW4gdmFyeSBiZXR3ZWVuIDAgYW5kIDI1NS4KIAkgKiBTb2Z0d2FyZV92ZXJfbm8gY29udGFpbnMgdGhlIHNvZnR3YXJlIHZlcnNpb24gbnVtYmVyLiBWZXJzaW9uCiAJICogMy4wMiB3b3VsZCBiZSBzdG9yZWQgYXMgMzAyLgogCSAqLwogCi0JczMyIGVlcHJvbV92ZXJfbm87CS8qIG9mZnNldCAweDAwZjQgKi8KLQlzMzIgc29mdHdhcmVfdmVyX25vOwkvKiBvZmZzZXQgMHgwMGY1ICovCisJczMyIGVlcHJvbV92ZXJfbm87CQkJLyogb2Zmc2V0IDB4MDBmNCAqLworCXMzMiBzb2Z0d2FyZV92ZXJfbm87CQkJLyogb2Zmc2V0IDB4MDBmNSAqLwogCi0JLyogU29mdHdhcmVfZGF5ICYgc29mdHdhcmVfeWVhciBhcmUgdGhlIHJlbGVhc2UgZGF0ZSBvZiB0aGUgc29mdHdhcmUKKwkvKgorCSAqIFNvZnR3YXJlX2RheSAmIHNvZnR3YXJlX3llYXIgYXJlIHRoZSByZWxlYXNlIGRhdGUgb2YgdGhlIHNvZnR3YXJlCiAJICogdGhlIEpSMyBEU1AgaXMgY3VycmVudGx5IHJ1bm5pbmcuIERheSBpcyB0aGUgZGF5IG9mIHRoZSB5ZWFyLAogCSAqIHdpdGggSmFudWFyeSAxIGJlaW5nIDEsIGFuZCBEZWNlbWJlciAzMSwgYmVpbmcgMzY1IGZvciBub24gbGVhcAogCSAqIHllYXJzLgogCSAqLwogCi0JczMyIHNvZnR3YXJlX2RheTsJLyogb2Zmc2V0IDB4MDBmNiAqLwotCXMzMiBzb2Z0d2FyZV95ZWFyOwkvKiBvZmZzZXQgMHgwMGY3ICovCisJczMyIHNvZnR3YXJlX2RheTsJCQkvKiBvZmZzZXQgMHgwMGY2ICovCisJczMyIHNvZnR3YXJlX3llYXI7CQkJLyogb2Zmc2V0IDB4MDBmNyAqLwogCi0JLyogU2VyaWFsX25vICYgbW9kZWxfbm8gYXJlIHRoZSB0d28gdmFsdWVzIHdoaWNoIHVuaXF1ZWx5IGlkZW50aWZ5IGEKKwkvKgorCSAqIFNlcmlhbF9ubyAmIG1vZGVsX25vIGFyZSB0aGUgdHdvIHZhbHVlcyB3aGljaCB1bmlxdWVseSBpZGVudGlmeSBhCiAJICogc2Vuc29yLiBUaGlzIG1vZGVsIG51bWJlciBkb2VzIG5vdCBkaXJlY3RseSBjb3JyZXNwb25kIHRvIHRoZSBKUjMKIAkgKiBtb2RlbCBudW1iZXIsIGJ1dCBpdCB3aWxsIHByb3ZpZGUgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IKIAkgKiBkaWZmZXJlbnQgc2Vuc29yIGNvbmZpZ3VyYXRpb25zLgogCSAqLwogCi0JdTMyIHNlcmlhbF9ubzsJCS8qIG9mZnNldCAweDAwZjggKi8KLQl1MzIgbW9kZWxfbm87CQkvKiBvZmZzZXQgMHgwMGY5ICovCisJdTMyIHNlcmlhbF9ubzsJCQkJLyogb2Zmc2V0IDB4MDBmOCAqLworCXUzMiBtb2RlbF9ubzsJCQkJLyogb2Zmc2V0IDB4MDBmOSAqLwogCi0JLyogQ2FsX2RheSAmIGNhbF95ZWFyIGFyZSB0aGUgc2Vuc29yIGNhbGlicmF0aW9uIGRhdGUuIERheSBpcyB0aGUKKwkvKgorCSAqIENhbF9kYXkgJiBjYWxfeWVhciBhcmUgdGhlIHNlbnNvciBjYWxpYnJhdGlvbiBkYXRlLiBEYXkgaXMgdGhlCiAJICogZGF5IG9mIHRoZSB5ZWFyLCB3aXRoIEphbnVhcnkgMSBiZWluZyAxLCBhbmQgRGVjZW1iZXIgMzEsIGJlaW5nCiAJICogMzY2IGZvciBsZWFwIHllYXJzLgogCSAqLwogCi0JczMyIGNhbF9kYXk7CQkvKiBvZmZzZXQgMHgwMGZhICovCi0JczMyIGNhbF95ZWFyOwkJLyogb2Zmc2V0IDB4MDBmYiAqLworCXMzMiBjYWxfZGF5OwkJCQkvKiBvZmZzZXQgMHgwMGZhICovCisJczMyIGNhbF95ZWFyOwkJCQkvKiBvZmZzZXQgMHgwMGZiICovCiAKLQkvKiBVbml0cyBpcyBhbiBlbnVtZXJhdGVkIHJlYWQgb25seSB2YWx1ZSBkZWZpbmluZyB0aGUgZW5naW5lZXJpbmcKKwkvKgorCSAqIFVuaXRzIGlzIGFuIGVudW1lcmF0ZWQgcmVhZCBvbmx5IHZhbHVlIGRlZmluaW5nIHRoZSBlbmdpbmVlcmluZwogCSAqIHVuaXRzIHVzZWQgaW4gdGhlIHNlbnNvciBmdWxsIHNjYWxlLiBUaGUgbWVhbmluZ3Mgb2YgcGFydGljdWxhcgogCSAqIHZhbHVlcyBhcmUgZGlzY3Vzc2VkIGluIHRoZSBzZWN0aW9uIGRldGFpbGluZyB0aGUgZm9yY2VfdW5pdHMKIAkgKiBzdHJ1Y3R1cmUgb24gcGFnZSAyMi4gVGhlIGVuZ2luZWVyaW5nIHVuaXRzIGFyZSBzZXR0byBjdXN0b21lcgpAQCAtNjI2LDIwICs2NzcsMjIgQEAKIAkgKiByZWNlaXZlZC4KIAkgKi8KIAotCXUzMiB1bml0czsJCS8qIG9mZnNldCAweDAwZmMgKi8KLQlzMzIgYml0czsJCS8qIG9mZnNldCAweDAwZmQgKi8KLQlzMzIgY2hhbm5lbHM7CQkvKiBvZmZzZXQgMHgwMGZlICovCisJdTMyIHVuaXRzOwkJCQkvKiBvZmZzZXQgMHgwMGZjICovCisJczMyIGJpdHM7CQkJCS8qIG9mZnNldCAweDAwZmQgKi8KKwlzMzIgY2hhbm5lbHM7CQkJCS8qIG9mZnNldCAweDAwZmUgKi8KIAotCS8qIFRoaWNrbmVzcyBzcGVjaWZpZXMgdGhlIG92ZXJhbGwgdGhpY2tuZXNzIG9mIHRoZSBzZW5zb3IgZnJvbQorCS8qCisJICogVGhpY2tuZXNzIHNwZWNpZmllcyB0aGUgb3ZlcmFsbCB0aGlja25lc3Mgb2YgdGhlIHNlbnNvciBmcm9tCiAJICogZmxhbmdlIHRvIGZsYW5nZS4gVGhlIGVuZ2luZWVyaW5nIHVuaXRzIGZvciB0aGlzIHZhbHVlIGFyZQogCSAqIGNvbnRhaW5lZCBpbiB1bml0cyAocGcuIDE2KS4gVGhlIHNlbnNvciBjYWxpYnJhdGlvbiBpcyByZWxhdGl2ZQogCSAqIHRvIHRoZSBjZW50ZXIgb2YgdGhlIHNlbnNvci4gVGhpcyB2YWx1ZSBhbGxvd3MgZWFzeSBjb29yZGluYXRlCiAJICogdHJhbnNmb3JtYXRpb24gZnJvbSB0aGUgY2VudGVyIG9mIHRoZSBzZW5zb3IgdG8gZWl0aGVyIGZsYW5nZS4KIAkgKi8KIAotCXMzMiB0aGlja25lc3M7CQkvKiBvZmZzZXQgMHgwMGZmICovCisJczMyIHRoaWNrbmVzczsJCQkJLyogb2Zmc2V0IDB4MDBmZiAqLwogCi0JLyogTG9hZF9lbnZlbG9wZXMgaXMgYSB0YWJsZSBjb250YWluaW5nIHRoZSBsb2FkIGVudmVsb3BlCisJLyoKKwkgKiBMb2FkX2VudmVsb3BlcyBpcyBhIHRhYmxlIGNvbnRhaW5pbmcgdGhlIGxvYWQgZW52ZWxvcGUKIAkgKiBkZXNjcmlwdGlvbnMuIFRoZXJlIGFyZSAxNiBwb3NzaWJsZSBsb2FkIGVudmVsb3BlIHNsb3RzIGluIHRoZQogCSAqIHRhYmxlLiBUaGUgc2xvdHMgYXJlIG9uIDE2IHdvcmQgYm91bmRhcmllcyBhbmQgYXJlIG51bWJlcmVkIDAtMTUuCiAJICogRWFjaCBsb2FkIGVudmVsb3BlIG5lZWRzIHRvIHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBzbG90IGJ1dApAQCAtNjU1LDcgKzcwOCw4IEBACiAKIAlzdHJ1Y3QgbGVfc3RydWN0IGxvYWRfZW52ZWxvcGVzWzB4MTBdOwkvKiBvZmZzZXQgMHgwMTAwICovCiAKLQkvKiBUcmFuc2Zvcm1zIGlzIGEgdGFibGUgY29udGFpbmluZyB0aGUgdHJhbnNmb3JtIGRlc2NyaXB0aW9ucy4KKwkvKgorCSAqIFRyYW5zZm9ybXMgaXMgYSB0YWJsZSBjb250YWluaW5nIHRoZSB0cmFuc2Zvcm0gZGVzY3JpcHRpb25zLgogCSAqIFRoZXJlIGFyZSAxNiBwb3NzaWJsZSB0cmFuc2Zvcm0gc2xvdHMgaW4gdGhlIHRhYmxlLiBUaGUgc2xvdHMgYXJlCiAJICogb24gMTYgd29yZCBib3VuZGFyaWVzIGFuZCBhcmUgbnVtYmVyZWQgMC0xNS4gRWFjaCB0cmFuc2Zvcm0gbmVlZHMKIAkgKiB0byBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgc2xvdCBidXQgbmVlZCBub3QgYmUgZnVsbHkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NzB4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjcweC5jCmluZGV4IDNlNzI3MTg4MC4uNzQ5MTFkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY3MHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjcweC5jCkBAIC0xLDQwICsxLDM0IEBACiAvKgotICAgIGNvbWVkaS9kcml2ZXJzL25pXzY3MHguYwotICAgIEhhcmR3YXJlIGRyaXZlciBmb3IgTkkgNjcweCBkZXZpY2VzCi0KLSAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDEgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSovCi0vKgotRHJpdmVyOiBuaV82NzB4Ci1EZXNjcmlwdGlvbjogTmF0aW9uYWwgSW5zdHJ1bWVudHMgNjcweAotQXV0aG9yOiBCYXJ0IEpvcmlzIDxiam9yaXNAYWR2YWx2YXMuYmU+Ci1VcGRhdGVkOiBXZWQsIDExIERlYyAyMDAyIDE4OjI1OjM1IC0wODAwCi1EZXZpY2VzOiBbTmF0aW9uYWwgSW5zdHJ1bWVudHNdIFBDSS02NzAzIChuaV82NzB4KSwgUENJLTY3MDQKLVN0YXR1czogdW5rbm93bgotCi1Db21tYW5kcyBhcmUgbm90IHN1cHBvcnRlZC4KLSovCisgKiBDb21lZGkgZHJpdmVyIGZvciBOSSA2NzB4IGRldmljZXMKKyAqCisgKiBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMSBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KIAogLyoKLQlCYXJ0IEpvcmlzIDxiam9yaXNAYWR2YWx2YXMuYmU+IExhc3QgdXBkYXRlZCBvbiAyMC8wOC8yMDAxCi0KLQlNYW51YWxzOgotCi0JMzIyMTEwYS5wZGYJUENJL1BYSS02NzA0IFVzZXIgTWFudWFsCi0JMzIyMTEwYi5wZGYJUENJL1BYSS02NzAzLzY3MDQgVXNlciBNYW51YWwKLQotKi8KKyAqIERyaXZlcjogbmlfNjcweAorICogRGVzY3JpcHRpb246IE5hdGlvbmFsIEluc3RydW1lbnRzIDY3MHgKKyAqIEF1dGhvcjogQmFydCBKb3JpcyA8YmpvcmlzQGFkdmFsdmFzLmJlPgorICogVXBkYXRlZDogV2VkLCAxMSBEZWMgMjAwMiAxODoyNTozNSAtMDgwMAorICogRGV2aWNlczogW05hdGlvbmFsIEluc3RydW1lbnRzXSBQQ0ktNjcwMyAobmlfNjcweCksIFBDSS02NzA0CisgKiBTdGF0dXM6IHVua25vd24KKyAqCisgKiBDb21tYW5kcyBhcmUgbm90IHN1cHBvcnRlZC4KKyAqCisgKiBNYW51YWxzOgorICogICAzMjIxMTBhLnBkZglQQ0kvUFhJLTY3MDQgVXNlciBNYW51YWwKKyAqICAgMzIyMTEwYi5wZGYJUENJL1BYSS02NzAzLzY3MDQgVXNlciBNYW51YWwKKyAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRfYTIxNTAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdF9hMjE1MC5jCmluZGV4IDliNDQ0ZjguLjVhNGRjYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdF9hMjE1MC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdF9hMjE1MC5jCkBAIC0xLDYyICsxLDQ3IEBACiAvKgotICAgIGNvbWVkaS9kcml2ZXJzL25pX2F0X2EyMTUwLmMKLSAgICBEcml2ZXIgZm9yIE5hdGlvbmFsIEluc3RydW1lbnRzIEFULUEyMTUwIGJvYXJkcwotICAgIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBGcmFuayBNb3JpIEhlc3MgPGZtaGVzc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgKiBDb21lZGkgZHJpdmVyIGZvciBOYXRpb25hbCBJbnN0cnVtZW50cyBBVC1BMjE1MCBib2FyZHMKKyAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBGcmFuayBNb3JpIEhlc3MgPGZtaGVzc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICogQ29weXJpZ2h0IChDKSAyMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLwogCi0gICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQotICAgIENvcHlyaWdodCAoQykgMjAwMCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotKi8KIC8qCi1Ecml2ZXI6IG5pX2F0X2EyMTUwCi1EZXNjcmlwdGlvbjogTmF0aW9uYWwgSW5zdHJ1bWVudHMgQVQtQTIxNTAKLUF1dGhvcjogRnJhbmsgTW9yaSBIZXNzCi1TdGF0dXM6IHdvcmtzCi1EZXZpY2VzOiBbTmF0aW9uYWwgSW5zdHJ1bWVudHNdIEFULUEyMTUwQyAoYXRfYTIxNTBjKSwgQVQtMjE1MFMgKGF0X2EyMTUwcykKLQotSWYgeW91IHdhbnQgdG8gYWMgY291cGxlIHRoZSBib2FyZCdzIGlucHV0cywgdXNlIEFSRUZfT1RIRVIuCi0KLUNvbmZpZ3VyYXRpb24gb3B0aW9uczoKLSAgWzBdIC0gSS9PIHBvcnQgYmFzZSBhZGRyZXNzCi0gIFsxXSAtIElSUSAob3B0aW9uYWwsIHJlcXVpcmVkIGZvciB0aW1lZCBjb252ZXJzaW9ucykKLSAgWzJdIC0gRE1BIChvcHRpb25hbCwgcmVxdWlyZWQgZm9yIHRpbWVkIGNvbnZlcnNpb25zKQotCi0qLwotLyoKLVlldCBhbm90aGVyIGRyaXZlciBmb3Igb2Jzb2xldGUgaGFyZHdhcmUgYnJvdWdodCB0byB5b3UgYnkgRnJhbmsgSGVzcy4KLVRlc3RpbmcgYW5kIGRlYnVnZ2luZyBoZWxwIHByb3ZpZGVkIGJ5IERhdmUgQW5kcnVjenlrLgotCi1UaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgYm9hcmRzOgotCi1BVC1BMjE1MEMKLUFULUEyMTUwUwotCi1UaGUgb25seSBkaWZmZXJlbmNlIGlzIHRoZWlyIG1hc3RlciBjbG9jayBmcmVxdWVuY2llcy4KLQotT3B0aW9uczoKLQlbMF0gLSBiYXNlIGlvIGFkZHJlc3MKLQlbMV0gLSBpcnEKLQlbMl0gLSBkbWEgY2hhbm5lbAotCi1SZWZlcmVuY2VzIChmcm9tIGZ0cDovL2Z0cC5uYXRpbnN0LmNvbS9zdXBwb3J0L21hbnVhbHMpOgotCi0JICAgMzIwMzYwLnBkZiAgQVQtQTIxNTAgVXNlciBNYW51YWwKLQotVE9ETzoKLQotYW5hbG9nIGxldmVsIHRyaWdnZXJpbmcKLVRSSUdfV0FLRV9FT1MKLQotKi8KKyAqIERyaXZlcjogbmlfYXRfYTIxNTAKKyAqIERlc2NyaXB0aW9uOiBOYXRpb25hbCBJbnN0cnVtZW50cyBBVC1BMjE1MAorICogQXV0aG9yOiBGcmFuayBNb3JpIEhlc3MKKyAqIFN0YXR1czogd29ya3MKKyAqIERldmljZXM6IFtOYXRpb25hbCBJbnN0cnVtZW50c10gQVQtQTIxNTBDIChhdF9hMjE1MGMpLCBBVC0yMTUwUyAoYXRfYTIxNTBzKQorICoKKyAqIENvbmZpZ3VyYXRpb24gb3B0aW9uczoKKyAqICAgWzBdIC0gSS9PIHBvcnQgYmFzZSBhZGRyZXNzCisgKiAgIFsxXSAtIElSUSAob3B0aW9uYWwsIHJlcXVpcmVkIGZvciB0aW1lZCBjb252ZXJzaW9ucykKKyAqICAgWzJdIC0gRE1BIChvcHRpb25hbCwgcmVxdWlyZWQgZm9yIHRpbWVkIGNvbnZlcnNpb25zKQorICoKKyAqIFlldCBhbm90aGVyIGRyaXZlciBmb3Igb2Jzb2xldGUgaGFyZHdhcmUgYnJvdWdodCB0byB5b3UgYnkgRnJhbmsgSGVzcy4KKyAqIFRlc3RpbmcgYW5kIGRlYnVnZ2luZyBoZWxwIHByb3ZpZGVkIGJ5IERhdmUgQW5kcnVjenlrLgorICoKKyAqIElmIHlvdSB3YW50IHRvIGFjIGNvdXBsZSB0aGUgYm9hcmQncyBpbnB1dHMsIHVzZSBBUkVGX09USEVSLgorICoKKyAqIFRoZSBvbmx5IGRpZmZlcmVuY2UgaW4gdGhlIGJvYXJkcyBpcyB0aGVpciBtYXN0ZXIgY2xvY2sgZnJlcXVlbmNpZXMuCisgKgorICogUmVmZXJlbmNlcyAoZnJvbSBmdHA6Ly9mdHAubmF0aW5zdC5jb20vc3VwcG9ydC9tYW51YWxzKToKKyAqICAgMzIwMzYwLnBkZiAgQVQtQTIxNTAgVXNlciBNYW51YWwKKyAqCisgKiBUT0RPOgorICogLSBhbmFsb2cgbGV2ZWwgdHJpZ2dlcmluZworICogLSBUUklHX1dBS0VfRU9TCisgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC03Myw0OCArNTgsNTIgQEAKIAogLyogUmVnaXN0ZXJzIGFuZCBiaXRzICovCiAjZGVmaW5lIENPTkZJR19SRUcJCTB4MAotI2RlZmluZSAgIENIQU5ORUxfQklUUyh4KQkJKCh4KSAmIDB4NykKKyNkZWZpbmUgICBDSEFOTkVMX0JJVFMoeCkJKCh4KSAmIDB4NykKICNkZWZpbmUgICBDSEFOTkVMX01BU0sJCTB4NwotI2RlZmluZSAgIENMT0NLX1NFTEVDVF9CSVRTKHgpCQkoKCh4KSAmIDB4MykgPDwgMykKLSNkZWZpbmUgICBDTE9DS19ESVZJU09SX0JJVFMoeCkJCSgoKHgpICYgMHgzKSA8PCA1KQorI2RlZmluZSAgIENMT0NLX1NFTEVDVF9CSVRTKHgpCSgoKHgpICYgMHgzKSA8PCAzKQorI2RlZmluZSAgIENMT0NLX0RJVklTT1JfQklUUyh4KQkoKCh4KSAmIDB4MykgPDwgNSkKICNkZWZpbmUgICBDTE9DS19NQVNLCQkoMHhmIDw8IDMpCi0jZGVmaW5lICAgRU5BQkxFMF9CSVQJCTB4ODAJLyogIGVuYWJsZSAoZG9uJ3QgaW50ZXJuYWxseSBncm91bmQpIGNoYW5uZWxzIDAgYW5kIDEgKi8KLSNkZWZpbmUgICBFTkFCTEUxX0JJVAkJMHgxMDAJLyogIGVuYWJsZSAoZG9uJ3QgaW50ZXJuYWxseSBncm91bmQpIGNoYW5uZWxzIDIgYW5kIDMgKi8KLSNkZWZpbmUgICBBQzBfQklUCQkweDIwMAkvKiAgYWMgY291cGxlIGNoYW5uZWxzIDAsMSAqLwotI2RlZmluZSAgIEFDMV9CSVQJCTB4NDAwCS8qICBhYyBjb3VwbGUgY2hhbm5lbHMgMiwzICovCi0jZGVmaW5lICAgQVBEX0JJVAkJMHg4MDAJLyogIGFuYWxvZyBwb3dlciBkb3duICovCi0jZGVmaW5lICAgRFBEX0JJVAkJMHgxMDAwCS8qICBkaWdpdGFsIHBvd2VyIGRvd24gKi8KLSNkZWZpbmUgVFJJR0dFUl9SRUcJCTB4MgkvKiAgdHJpZ2dlciBjb25maWcgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgICBQT1NUX1RSSUdHRVJfQklUUwkJMHgyCi0jZGVmaW5lICAgREVMQVlfVFJJR0dFUl9CSVRTCQkweDMKLSNkZWZpbmUgICBIV19UUklHX0VOCQkweDEwCS8qICBlbmFibGUgaGFyZHdhcmUgdHJpZ2dlciAqLwotI2RlZmluZSBGSUZPX1NUQVJUX1JFRwkJMHg2CS8qICBzb2Z0d2FyZSBzdGFydCBhcXVpc3Rpb24gdHJpZ2dlciAqLwotI2RlZmluZSBGSUZPX1JFU0VUX1JFRwkJMHg4CS8qICBjbGVhcnMgZmlmbyArIGZpZm8gZmxhZ3MgKi8KLSNkZWZpbmUgRklGT19EQVRBX1JFRwkJMHhhCS8qICByZWFkIGRhdGEgKi8KLSNkZWZpbmUgRE1BX1RDX0NMRUFSX1JFRwkJMHhlCS8qICBjbGVhciBkbWEgdGVybWluYWwgY291bnQgaW50ZXJydXB0ICovCi0jZGVmaW5lIFNUQVRVU19SRUcJCTB4MTIJLyogIHJlYWQgb25seSAqLwotI2RlZmluZSAgIEZORV9CSVQJCTB4MQkvKiAgZmlmbyBub3QgZW1wdHkgKi8KLSNkZWZpbmUgICBPVkZMX0JJVAkJMHg4CS8qICBmaWZvIG92ZXJmbG93ICovCi0jZGVmaW5lICAgRURBUV9CSVQJCTB4MTAJLyogIGVuZCBvZiBhY3F1aXNpdGlvbiBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgICBEQ0FMX0JJVAkJMHgyMAkvKiAgb2Zmc2V0IGNhbGlicmF0aW9uIGluIHByb2dyZXNzICovCi0jZGVmaW5lICAgSU5UUl9CSVQJCTB4NDAJLyogIGludGVycnVwdCBoYXMgb2NjdXJyZWQgKi8KLSNkZWZpbmUgICBETUFfVENfQklUCQkweDgwCS8qICBkbWEgdGVybWluYWwgY291bnQgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCAqLwotI2RlZmluZSAgIElEX0JJVFMoeCkJKCgoeCkgPj4gOCkgJiAweDMpCi0jZGVmaW5lIElSUV9ETUFfQ05UUkxfUkVHCQkweDEyCS8qICB3cml0ZSBvbmx5ICovCi0jZGVmaW5lICAgRE1BX0NIQU5fQklUUyh4KQkJKCh4KSAmIDB4NykJLyogIHNldHMgZG1hIGNoYW5uZWwgKi8KLSNkZWZpbmUgICBETUFfRU5fQklUCQkweDgJLyogIGVuYWJsZXMgZG1hICovCi0jZGVmaW5lICAgSVJRX0xWTF9CSVRTKHgpCQkoKCh4KSAmIDB4ZikgPDwgNCkJLyogIHNldHMgaXJxIGxldmVsICovCi0jZGVmaW5lICAgRklGT19JTlRSX0VOX0JJVAkJMHgxMDAJLyogIGVuYWJsZSBmaWZvIGludGVycnVwdHMgKi8KLSNkZWZpbmUgICBGSUZPX0lOVFJfRkhGX0JJVAkJMHgyMDAJLyogIGludGVycnVwdCBmaWZvIGhhbGYgZnVsbCAqLwotI2RlZmluZSAgIERNQV9JTlRSX0VOX0JJVAkJMHg4MDAJLyogIGVuYWJsZSBpbnRlcnJ1cHQgb24gZG1hIHRlcm1pbmFsIGNvdW50ICovCi0jZGVmaW5lICAgRE1BX0RFTV9FTl9CSVQJMHgxMDAwCS8qICBlbmFibGVzIGRlbWFuZCBtb2RlIGRtYSAqLworLyogZW5hYmxlIChkb24ndCBpbnRlcm5hbGx5IGdyb3VuZCkgY2hhbm5lbHMgMCBhbmQgMSAqLworI2RlZmluZSAgIEVOQUJMRTBfQklUCQkweDgwCisvKiBlbmFibGUgKGRvbid0IGludGVybmFsbHkgZ3JvdW5kKSBjaGFubmVscyAyIGFuZCAzICovCisjZGVmaW5lICAgRU5BQkxFMV9CSVQJCTB4MTAwCisjZGVmaW5lICAgQUMwX0JJVAkJMHgyMDAJLyogYWMgY291cGxlIGNoYW5uZWxzIDAsMSAqLworI2RlZmluZSAgIEFDMV9CSVQJCTB4NDAwCS8qIGFjIGNvdXBsZSBjaGFubmVscyAyLDMgKi8KKyNkZWZpbmUgICBBUERfQklUCQkweDgwMAkvKiBhbmFsb2cgcG93ZXIgZG93biAqLworI2RlZmluZSAgIERQRF9CSVQJCTB4MTAwMAkvKiBkaWdpdGFsIHBvd2VyIGRvd24gKi8KKyNkZWZpbmUgVFJJR0dFUl9SRUcJCTB4MgkvKiB0cmlnZ2VyIGNvbmZpZyByZWdpc3RlciAqLworI2RlZmluZSAgIFBPU1RfVFJJR0dFUl9CSVRTCTB4MgorI2RlZmluZSAgIERFTEFZX1RSSUdHRVJfQklUUwkweDMKKyNkZWZpbmUgICBIV19UUklHX0VOCQkweDEwCS8qIGVuYWJsZSBoYXJkd2FyZSB0cmlnZ2VyICovCisjZGVmaW5lIEZJRk9fU1RBUlRfUkVHCQkweDYJLyogc29mdHdhcmUgc3RhcnQgYXF1aXN0aW9uIHRyaWdnZXIgKi8KKyNkZWZpbmUgRklGT19SRVNFVF9SRUcJCTB4OAkvKiBjbGVhcnMgZmlmbyArIGZpZm8gZmxhZ3MgKi8KKyNkZWZpbmUgRklGT19EQVRBX1JFRwkJMHhhCS8qIHJlYWQgZGF0YSAqLworI2RlZmluZSBETUFfVENfQ0xFQVJfUkVHCTB4ZQkvKiBjbGVhciBkbWEgdGVybWluYWwgY291bnQgaW50ZXJydXB0ICovCisjZGVmaW5lIFNUQVRVU19SRUcJCTB4MTIJLyogcmVhZCBvbmx5ICovCisjZGVmaW5lICAgRk5FX0JJVAkJMHgxCS8qIGZpZm8gbm90IGVtcHR5ICovCisjZGVmaW5lICAgT1ZGTF9CSVQJCTB4OAkvKiBmaWZvIG92ZXJmbG93ICovCisjZGVmaW5lICAgRURBUV9CSVQJCTB4MTAJLyogZW5kIG9mIGFjcXVpc2l0aW9uIGludGVycnVwdCAqLworI2RlZmluZSAgIERDQUxfQklUCQkweDIwCS8qIG9mZnNldCBjYWxpYnJhdGlvbiBpbiBwcm9ncmVzcyAqLworI2RlZmluZSAgIElOVFJfQklUCQkweDQwCS8qIGludGVycnVwdCBoYXMgb2NjdXJyZWQgKi8KKy8qIGRtYSB0ZXJtaW5hbCBjb3VudCBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkICovCisjZGVmaW5lICAgRE1BX1RDX0JJVAkJMHg4MAorI2RlZmluZSAgIElEX0JJVFMoeCkJCSgoKHgpID4+IDgpICYgMHgzKQorI2RlZmluZSBJUlFfRE1BX0NOVFJMX1JFRwkweDEyCQkJLyogd3JpdGUgb25seSAqLworI2RlZmluZSAgIERNQV9DSEFOX0JJVFMoeCkJKCh4KSAmIDB4NykJCS8qIHNldHMgZG1hIGNoYW5uZWwgKi8KKyNkZWZpbmUgICBETUFfRU5fQklUCQkweDgJCQkvKiBlbmFibGVzIGRtYSAqLworI2RlZmluZSAgIElSUV9MVkxfQklUUyh4KQkoKCh4KSAmIDB4ZikgPDwgNCkJLyogc2V0cyBpcnEgbGV2ZWwgKi8KKyNkZWZpbmUgICBGSUZPX0lOVFJfRU5fQklUCTB4MTAwCS8qIGVuYWJsZSBmaWZvIGludGVycnVwdHMgKi8KKyNkZWZpbmUgICBGSUZPX0lOVFJfRkhGX0JJVAkweDIwMAkvKiBpbnRlcnJ1cHQgZmlmbyBoYWxmIGZ1bGwgKi8KKy8qIGVuYWJsZSBpbnRlcnJ1cHQgb24gZG1hIHRlcm1pbmFsIGNvdW50ICovCisjZGVmaW5lICAgRE1BX0lOVFJfRU5fQklUCTB4ODAwCisjZGVmaW5lICAgRE1BX0RFTV9FTl9CSVQJMHgxMDAwCS8qIGVuYWJsZXMgZGVtYW5kIG1vZGUgZG1hICovCiAjZGVmaW5lIEk4MjUzX0JBU0VfUkVHCQkweDE0CiAKIHN0cnVjdCBhMjE1MF9ib2FyZCB7CiAJY29uc3QgY2hhciAqbmFtZTsKLQlpbnQgY2xvY2tbNF07CQkvKiAgbWFzdGVyIGNsb2NrIHBlcmlvZHMsIGluIG5hbm9zZWNvbmRzICovCi0JaW50IG51bV9jbG9ja3M7CQkvKiAgbnVtYmVyIG9mIGF2YWlsYWJsZSBtYXN0ZXIgY2xvY2sgc3BlZWRzICovCi0JaW50IGFpX3NwZWVkOwkJLyogIG1heGltdW0gY29udmVyc2lvbiByYXRlIGluIG5hbm9zZWNvbmRzICovCisJaW50IGNsb2NrWzRdOwkJLyogbWFzdGVyIGNsb2NrIHBlcmlvZHMsIGluIG5hbm9zZWNvbmRzICovCisJaW50IG51bV9jbG9ja3M7CQkvKiBudW1iZXIgb2YgYXZhaWxhYmxlIG1hc3RlciBjbG9jayBzcGVlZHMgKi8KKwlpbnQgYWlfc3BlZWQ7CQkvKiBtYXhpbXVtIGNvbnZlcnNpb24gcmF0ZSBpbiBuYW5vc2Vjb25kcyAqLwogfTsKIAogLyogYW5hbG9nIGlucHV0IHJhbmdlICovCkBAIC0xNDQsOCArMTMzLDggQEAKIHN0cnVjdCBhMjE1MF9wcml2YXRlIHsKIAlzdHJ1Y3QgY29tZWRpX2lzYWRtYSAqZG1hOwogCXVuc2lnbmVkIGludCBjb3VudDsJLyogbnVtYmVyIG9mIGRhdGEgcG9pbnRzIGxlZnQgdG8gYmUgdGFrZW4gKi8KLQlpbnQgaXJxX2RtYV9iaXRzOwkvKiAgaXJxL2RtYSByZWdpc3RlciBiaXRzICovCi0JaW50IGNvbmZpZ19iaXRzOwkvKiAgY29uZmlnIHJlZ2lzdGVyIGJpdHMgKi8KKwlpbnQgaXJxX2RtYV9iaXRzOwkvKiBpcnEvZG1hIHJlZ2lzdGVyIGJpdHMgKi8KKwlpbnQgY29uZmlnX2JpdHM7CS8qIGNvbmZpZyByZWdpc3RlciBiaXRzICovCiB9OwogCiAvKiBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lICovCkBAIC0xODksMTMgKzE3OCwxMyBAQAogCSAqLwogCXJlc2lkdWUgPSBjb21lZGlfaXNhZG1hX2Rpc2FibGUoZGVzYy0+Y2hhbik7CiAKLQkvKiAgZmlndXJlIG91dCBob3cgbWFueSBwb2ludHMgdG8gcmVhZCAqLworCS8qIGZpZ3VyZSBvdXQgaG93IG1hbnkgcG9pbnRzIHRvIHJlYWQgKi8KIAltYXhfcG9pbnRzID0gY29tZWRpX2J5dGVzX3RvX3NhbXBsZXMocywgZGVzYy0+c2l6ZSk7CiAJbnVtX3BvaW50cyA9IG1heF9wb2ludHMgLSBjb21lZGlfYnl0ZXNfdG9fc2FtcGxlcyhzLCByZXNpZHVlKTsKIAlpZiAoZGV2cHJpdi0+Y291bnQgPCBudW1fcG9pbnRzICYmIGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKIAkJbnVtX3BvaW50cyA9IGRldnByaXYtPmNvdW50OwogCi0JLyogIGZpZ3VyZSBvdXQgaG93IG1hbnkgcG9pbnRzIHdpbGwgYmUgc3RvcmVkIG5leHQgdGltZSAqLworCS8qIGZpZ3VyZSBvdXQgaG93IG1hbnkgcG9pbnRzIHdpbGwgYmUgc3RvcmVkIG5leHQgdGltZSAqLwogCWxlZnRvdmVyID0gMDsKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX05PTkUpIHsKIAkJbGVmdG92ZXIgPSBjb21lZGlfYnl0ZXNfdG9fc2FtcGxlcyhzLCBkZXNjLT5zaXplKTsKQEAgLTIwNCw3ICsxOTMsOCBAQAogCQlpZiAobGVmdG92ZXIgPiBtYXhfcG9pbnRzKQogCQkJbGVmdG92ZXIgPSBtYXhfcG9pbnRzOwogCX0KLQkvKiB0aGVyZSBzaG91bGQgb25seSBiZSBhIHJlc2lkdWUgaWYgY29sbGVjdGlvbiB3YXMgc3RvcHBlZCBieSBoYXZpbmcKKwkvKgorCSAqIFRoZXJlIHNob3VsZCBvbmx5IGJlIGEgcmVzaWR1ZSBpZiBjb2xsZWN0aW9uIHdhcyBzdG9wcGVkIGJ5IGhhdmluZwogCSAqIHRoZSBzdG9wX3NyYyBzZXQgdG8gYW4gZXh0ZXJuYWwgdHJpZ2dlciwgaW4gd2hpY2ggY2FzZSB0aGVyZQogCSAqIHdpbGwgYmUgbm8gbW9yZSBkYXRhCiAJICovCkBAIC0yMTQsNyArMjA0LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX3BvaW50czsgaSsrKSB7CiAJCS8qIHdyaXRlIGRhdGEgcG9pbnQgdG8gY29tZWRpIGJ1ZmZlciAqLwogCQlkcG50ID0gYnVmW2ldOwotCQkvKiAgY29udmVydCBmcm9tIDIncyBjb21wbGVtZW50IHRvIHVuc2lnbmVkIGNvZGluZyAqLworCQkvKiBjb252ZXJ0IGZyb20gMidzIGNvbXBsZW1lbnQgdG8gdW5zaWduZWQgY29kaW5nICovCiAJCWRwbnQgXj0gMHg4MDAwOwogCQljb21lZGlfYnVmX3dyaXRlX3NhbXBsZXMocywgJmRwbnQsIDEpOwogCQlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7CkBAIC0yNDQsMTQgKzIzNCwxNCBAQAogCXN0cnVjdCBjb21lZGlfaXNhZG1hICpkbWEgPSBkZXZwcml2LT5kbWE7CiAJc3RydWN0IGNvbWVkaV9pc2FkbWFfZGVzYyAqZGVzYyA9ICZkbWEtPmRlc2NbMF07CiAKLQkvKiAgZGlzYWJsZSBkbWEgb24gY2FyZCAqLworCS8qIGRpc2FibGUgZG1hIG9uIGNhcmQgKi8KIAlkZXZwcml2LT5pcnFfZG1hX2JpdHMgJj0gfkRNQV9JTlRSX0VOX0JJVCAmIH5ETUFfRU5fQklUOwogCW91dHcoZGV2cHJpdi0+aXJxX2RtYV9iaXRzLCBkZXYtPmlvYmFzZSArIElSUV9ETUFfQ05UUkxfUkVHKTsKIAotCS8qICBkaXNhYmxlIGNvbXB1dGVyJ3MgZG1hICovCisJLyogZGlzYWJsZSBjb21wdXRlcidzIGRtYSAqLwogCWNvbWVkaV9pc2FkbWFfZGlzYWJsZShkZXNjLT5jaGFuKTsKIAotCS8qICBjbGVhciBmaWZvIGFuZCByZXNldCB0cmlnZ2VyaW5nIGNpcmN1aXRyeSAqLworCS8qIGNsZWFyIGZpZm8gYW5kIHJlc2V0IHRyaWdnZXJpbmcgY2lyY3VpdHJ5ICovCiAJb3V0dygwLCBkZXYtPmlvYmFzZSArIEZJRk9fUkVTRVRfUkVHKTsKIAogCXJldHVybiAwOwpAQCAtMjcwLDcgKzI2MCw3IEBACiAJaW50IGx1Yl9kaXZpc29yX3NoaWZ0LCBsdWJfaW5kZXgsIGdsYl9kaXZpc29yX3NoaWZ0LCBnbGJfaW5kZXg7CiAJaW50IGksIGo7CiAKLQkvKiAgaW5pdGlhbGl6ZSBncmVhdGVzdCBsb3dlciBhbmQgbGVhc3QgdXBwZXIgYm91bmRzICovCisJLyogaW5pdGlhbGl6ZSBncmVhdGVzdCBsb3dlciBhbmQgbGVhc3QgdXBwZXIgYm91bmRzICovCiAJbHViX2Rpdmlzb3Jfc2hpZnQgPSAzOwogCWx1Yl9pbmRleCA9IDA7CiAJbHViID0gYm9hcmQtPmNsb2NrW2x1Yl9pbmRleF0gKiAoMSA8PCBsdWJfZGl2aXNvcl9zaGlmdCk7CkBAIC0yNzgsMTkgKzI2OCwxOSBAQAogCWdsYl9pbmRleCA9IGJvYXJkLT5udW1fY2xvY2tzIC0gMTsKIAlnbGIgPSBib2FyZC0+Y2xvY2tbZ2xiX2luZGV4XSAqICgxIDw8IGdsYl9kaXZpc29yX3NoaWZ0KTsKIAotCS8qICBtYWtlIHN1cmUgcGVyaW9kIGlzIGluIGF2YWlsYWJsZSByYW5nZSAqLworCS8qIG1ha2Ugc3VyZSBwZXJpb2QgaXMgaW4gYXZhaWxhYmxlIHJhbmdlICovCiAJaWYgKCpwZXJpb2QgPCBnbGIpCiAJCSpwZXJpb2QgPSBnbGI7CiAJaWYgKCpwZXJpb2QgPiBsdWIpCiAJCSpwZXJpb2QgPSBsdWI7CiAKLQkvKiAgd2UgY2FuIG11bHRpcGx5IHBlcmlvZCBieSAxLCAyLCA0LCBvciA4LCB1c2luZyAoMSA8PCBpKSAqLworCS8qIHdlIGNhbiBtdWx0aXBseSBwZXJpb2QgYnkgMSwgMiwgNCwgb3IgOCwgdXNpbmcgKDEgPDwgaSkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCS8qICB0aGVyZSBhcmUgYSBtYXhpbXVtIG9mIDQgbWFzdGVyIGNsb2NrcyAqLworCQkvKiB0aGVyZSBhcmUgYSBtYXhpbXVtIG9mIDQgbWFzdGVyIGNsb2NrcyAqLwogCQlmb3IgKGogPSAwOyBqIDwgYm9hcmQtPm51bV9jbG9ja3M7IGorKykgewotCQkJLyogIHRlbXAgaXMgdGhlIHBlcmlvZCBpbiBuYW5vc2VjIHdlIGFyZSBldmFsdWF0aW5nICovCisJCQkvKiB0ZW1wIGlzIHRoZSBwZXJpb2QgaW4gbmFub3NlYyB3ZSBhcmUgZXZhbHVhdGluZyAqLwogCQkJdGVtcCA9IGJvYXJkLT5jbG9ja1tqXSAqICgxIDw8IGkpOwotCQkJLyogIGlmIGl0IGlzIHRoZSBiZXN0IG1hdGNoIHlldCAqLworCQkJLyogaWYgaXQgaXMgdGhlIGJlc3QgbWF0Y2ggeWV0ICovCiAJCQlpZiAodGVtcCA8IGx1YiAmJiB0ZW1wID49ICpwZXJpb2QpIHsKIAkJCQlsdWJfZGl2aXNvcl9zaGlmdCA9IGk7CiAJCQkJbHViX2luZGV4ID0gajsKQEAgLTMwNiw3ICsyOTYsNyBAQAogCXN3aXRjaCAoZmxhZ3MgJiBDTURGX1JPVU5EX01BU0spIHsKIAljYXNlIENNREZfUk9VTkRfTkVBUkVTVDoKIAlkZWZhdWx0OgotCQkvKiAgaWYgbGVhc3QgdXBwZXIgYm91bmQgaXMgYmV0dGVyIGFwcHJveGltYXRpb24gKi8KKwkJLyogaWYgbGVhc3QgdXBwZXIgYm91bmQgaXMgYmV0dGVyIGFwcHJveGltYXRpb24gKi8KIAkJaWYgKGx1YiAtICpwZXJpb2QgPCAqcGVyaW9kIC0gZ2xiKQogCQkJKnBlcmlvZCA9IGx1YjsKIAkJZWxzZQpAQCAtMzIwLDcgKzMxMCw3IEBACiAJCWJyZWFrOwogCX0KIAotCS8qICBzZXQgY2xvY2sgYml0cyBmb3IgY29uZmlnIHJlZ2lzdGVyIGFwcHJvcHJpYXRlbHkgKi8KKwkvKiBzZXQgY2xvY2sgYml0cyBmb3IgY29uZmlnIHJlZ2lzdGVyIGFwcHJvcHJpYXRlbHkgKi8KIAlkZXZwcml2LT5jb25maWdfYml0cyAmPSB+Q0xPQ0tfTUFTSzsKIAlpZiAoKnBlcmlvZCA9PSBsdWIpIHsKIAkJZGV2cHJpdi0+Y29uZmlnX2JpdHMgfD0KQEAgLTQ5NSw3ICs0ODUsNyBAQAogCQkJImRtYSBpbmNvbXBhdGlibGUgd2l0aCBoYXJkIHJlYWwtdGltZSBpbnRlcnJ1cHQgKENNREZfUFJJT1JJVFkpLCBhYm9ydGluZ1xuIik7CiAJCXJldHVybiAtMTsKIAl9Ci0JLyogIGNsZWFyIGZpZm8gYW5kIHJlc2V0IHRyaWdnZXJpbmcgY2lyY3VpdHJ5ICovCisJLyogY2xlYXIgZmlmbyBhbmQgcmVzZXQgdHJpZ2dlcmluZyBjaXJjdWl0cnkgKi8KIAlvdXR3KDAsIGRldi0+aW9iYXNlICsgRklGT19SRVNFVF9SRUcpOwogCiAJLyogc2V0dXAgY2hhbmxpc3QgKi8KQEAgLTUwMyw3ICs0OTMsNyBAQAogCQkJICAgICAgIGNtZC0+Y2hhbmxpc3RfbGVuKSA8IDApCiAJCXJldHVybiAtMTsKIAotCS8qICBzZXR1cCBhYy9kYyBjb3VwbGluZyAqLworCS8qIHNldHVwIGFjL2RjIGNvdXBsaW5nICovCiAJaWYgKENSX0FSRUYoY21kLT5jaGFubGlzdFswXSkgPT0gQVJFRl9PVEhFUikKIAkJZGV2cHJpdi0+Y29uZmlnX2JpdHMgfD0gQUMwX0JJVDsKIAllbHNlCkBAIC01MTMsMTggKzUwMywxOCBAQAogCWVsc2UKIAkJZGV2cHJpdi0+Y29uZmlnX2JpdHMgJj0gfkFDMV9CSVQ7CiAKLQkvKiAgc2V0dXAgdGltaW5nICovCisJLyogc2V0dXAgdGltaW5nICovCiAJYTIxNTBfZ2V0X3RpbWluZyhkZXYsICZjbWQtPnNjYW5fYmVnaW5fYXJnLCBjbWQtPmZsYWdzKTsKIAotCS8qICBzZW5kIHRpbWluZywgY2hhbm5lbCwgY29uZmlnIGJpdHMgKi8KKwkvKiBzZW5kIHRpbWluZywgY2hhbm5lbCwgY29uZmlnIGJpdHMgKi8KIAlvdXR3KGRldnByaXYtPmNvbmZpZ19iaXRzLCBkZXYtPmlvYmFzZSArIENPTkZJR19SRUcpOwogCi0JLyogIGluaXRpYWxpemUgbnVtYmVyIG9mIHNhbXBsZXMgcmVtYWluaW5nICovCisJLyogaW5pdGlhbGl6ZSBudW1iZXIgb2Ygc2FtcGxlcyByZW1haW5pbmcgKi8KIAlkZXZwcml2LT5jb3VudCA9IGNtZC0+c3RvcF9hcmcgKiBjbWQtPmNoYW5saXN0X2xlbjsKIAogCWNvbWVkaV9pc2FkbWFfZGlzYWJsZShkZXNjLT5jaGFuKTsKIAotCS8qICBzZXQgc2l6ZSBvZiB0cmFuc2ZlciB0byBmaWxsIGluIDEvMyBzZWNvbmQgKi8KKwkvKiBzZXQgc2l6ZSBvZiB0cmFuc2ZlciB0byBmaWxsIGluIDEvMyBzZWNvbmQgKi8KICNkZWZpbmUgT05FX1RISVJEX1NFQ09ORCAzMzMzMzMzMzMKIAlkZXNjLT5zaXplID0gY29tZWRpX2J5dGVzX3Blcl9zYW1wbGUocykgKiBjbWQtPmNoYW5saXN0X2xlbiAqCiAJCSAgICBPTkVfVEhJUkRfU0VDT05EIC8gY21kLT5zY2FuX2JlZ2luX2FyZzsKQEAgLTUzNiw0MCArNTI2LDQ1IEBACiAKIAljb21lZGlfaXNhZG1hX3Byb2dyYW0oZGVzYyk7CiAKLQkvKiBjbGVhciBkbWEgaW50ZXJydXB0IGJlZm9yZSBlbmFibGluZyBpdCwgdG8gdHJ5IGFuZCBnZXQgcmlkIG9mIHRoYXQKLQkgKiBvbmUgc3B1cmlvdXMgaW50ZXJydXB0IHRoYXQgaGFzIGJlZW4gaGFwcGVuaW5nICovCisJLyoKKwkgKiBDbGVhciBkbWEgaW50ZXJydXB0IGJlZm9yZSBlbmFibGluZyBpdCwgdG8gdHJ5IGFuZCBnZXQgcmlkIG9mCisJICogdGhhdCBvbmUgc3B1cmlvdXMgaW50ZXJydXB0IHRoYXQgaGFzIGJlZW4gaGFwcGVuaW5nLgorCSAqLwogCW91dHcoMHgwMCwgZGV2LT5pb2Jhc2UgKyBETUFfVENfQ0xFQVJfUkVHKTsKIAotCS8qICBlbmFibGUgZG1hIG9uIGNhcmQgKi8KKwkvKiBlbmFibGUgZG1hIG9uIGNhcmQgKi8KIAlkZXZwcml2LT5pcnFfZG1hX2JpdHMgfD0gRE1BX0lOVFJfRU5fQklUIHwgRE1BX0VOX0JJVDsKIAlvdXR3KGRldnByaXYtPmlycV9kbWFfYml0cywgZGV2LT5pb2Jhc2UgKyBJUlFfRE1BX0NOVFJMX1JFRyk7CiAKLQkvKiAgbWF5IG5lZWQgdG8gd2FpdCA3MiBzYW1wbGluZyBwZXJpb2RzIGlmIHRpbWluZyB3YXMgY2hhbmdlZCAqLworCS8qIG1heSBuZWVkIHRvIHdhaXQgNzIgc2FtcGxpbmcgcGVyaW9kcyBpZiB0aW1pbmcgd2FzIGNoYW5nZWQgKi8KIAljb21lZGlfODI1NF9sb2FkKGRldi0+cGFjZXIsIDIsIDcyLCBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7CiAKLQkvKiAgc2V0dXAgc3RhcnQgdHJpZ2dlcmluZyAqLworCS8qIHNldHVwIHN0YXJ0IHRyaWdnZXJpbmcgKi8KIAl0cmlnZ2VyX2JpdHMgPSAwOwotCS8qICBkZWNpZGUgaWYgd2UgbmVlZCB0byB3YWl0IDcyIHBlcmlvZHMgZm9yIHZhbGlkIGRhdGEgKi8KKwkvKiBkZWNpZGUgaWYgd2UgbmVlZCB0byB3YWl0IDcyIHBlcmlvZHMgZm9yIHZhbGlkIGRhdGEgKi8KIAlpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19OT1cgJiYKIAkgICAgKG9sZF9jb25maWdfYml0cyAmIENMT0NLX01BU0spICE9CiAJICAgIChkZXZwcml2LT5jb25maWdfYml0cyAmIENMT0NLX01BU0spKSB7Ci0JCS8qICBzZXQgdHJpZ2dlciBzb3VyY2UgdG8gZGVsYXkgdHJpZ2dlciAqLworCQkvKiBzZXQgdHJpZ2dlciBzb3VyY2UgdG8gZGVsYXkgdHJpZ2dlciAqLwogCQl0cmlnZ2VyX2JpdHMgfD0gREVMQVlfVFJJR0dFUl9CSVRTOwogCX0gZWxzZSB7Ci0JCS8qICBvdGhlcndpc2Ugbm8gZGVsYXkgKi8KKwkJLyogb3RoZXJ3aXNlIG5vIGRlbGF5ICovCiAJCXRyaWdnZXJfYml0cyB8PSBQT1NUX1RSSUdHRVJfQklUUzsKIAl9Ci0JLyogIGVuYWJsZSBleHRlcm5hbCBoYXJkd2FyZSB0cmlnZ2VyICovCisJLyogZW5hYmxlIGV4dGVybmFsIGhhcmR3YXJlIHRyaWdnZXIgKi8KIAlpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQpIHsKIAkJdHJpZ2dlcl9iaXRzIHw9IEhXX1RSSUdfRU47CiAJfSBlbHNlIGlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX09USEVSKSB7Ci0JCS8qICBYWFggYWRkIHN1cHBvcnQgZm9yIGxldmVsL3Nsb3BlIHN0YXJ0IHRyaWdnZXIgdXNpbmcgVFJJR19PVEhFUiAqLworCQkvKgorCQkgKiBYWFggYWRkIHN1cHBvcnQgZm9yIGxldmVsL3Nsb3BlIHN0YXJ0IHRyaWdnZXIKKwkJICogdXNpbmcgVFJJR19PVEhFUgorCQkgKi8KIAkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgInlvdSBzaG91bGRuJ3Qgc2VlIHRoaXM/XG4iKTsKIAl9Ci0JLyogIHNlbmQgdHJpZ2dlciBjb25maWcgYml0cyAqLworCS8qIHNlbmQgdHJpZ2dlciBjb25maWcgYml0cyAqLwogCW91dHcodHJpZ2dlcl9iaXRzLCBkZXYtPmlvYmFzZSArIFRSSUdHRVJfUkVHKTsKIAotCS8qICBzdGFydCBhY3F1aXNpdGlvbiBmb3Igc29mdCB0cmlnZ2VyICovCisJLyogc3RhcnQgYWNxdWlzaXRpb24gZm9yIHNvZnQgdHJpZ2dlciAqLwogCWlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX05PVykKIAkJb3V0dygwLCBkZXYtPmlvYmFzZSArIEZJRk9fU1RBUlRfUkVHKTsKIApAQCAtNTk2LDI4ICs1OTEsMjggQEAKIAl1bnNpZ25lZCBpbnQgbjsKIAlpbnQgcmV0OwogCi0JLyogIGNsZWFyIGZpZm8gYW5kIHJlc2V0IHRyaWdnZXJpbmcgY2lyY3VpdHJ5ICovCisJLyogY2xlYXIgZmlmbyBhbmQgcmVzZXQgdHJpZ2dlcmluZyBjaXJjdWl0cnkgKi8KIAlvdXR3KDAsIGRldi0+aW9iYXNlICsgRklGT19SRVNFVF9SRUcpOwogCiAJLyogc2V0dXAgY2hhbmxpc3QgKi8KIAlpZiAoYTIxNTBfc2V0X2NoYW5saXN0KGRldiwgQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyksIDEpIDwgMCkKIAkJcmV0dXJuIC0xOwogCi0JLyogIHNldCBkYyBjb3VwbGluZyAqLworCS8qIHNldCBkYyBjb3VwbGluZyAqLwogCWRldnByaXYtPmNvbmZpZ19iaXRzICY9IH5BQzBfQklUOwogCWRldnByaXYtPmNvbmZpZ19iaXRzICY9IH5BQzFfQklUOwogCi0JLyogIHNlbmQgdGltaW5nLCBjaGFubmVsLCBjb25maWcgYml0cyAqLworCS8qIHNlbmQgdGltaW5nLCBjaGFubmVsLCBjb25maWcgYml0cyAqLwogCW91dHcoZGV2cHJpdi0+Y29uZmlnX2JpdHMsIGRldi0+aW9iYXNlICsgQ09ORklHX1JFRyk7CiAKLQkvKiAgZGlzYWJsZSBkbWEgb24gY2FyZCAqLworCS8qIGRpc2FibGUgZG1hIG9uIGNhcmQgKi8KIAlkZXZwcml2LT5pcnFfZG1hX2JpdHMgJj0gfkRNQV9JTlRSX0VOX0JJVCAmIH5ETUFfRU5fQklUOwogCW91dHcoZGV2cHJpdi0+aXJxX2RtYV9iaXRzLCBkZXYtPmlvYmFzZSArIElSUV9ETUFfQ05UUkxfUkVHKTsKIAotCS8qICBzZXR1cCBzdGFydCB0cmlnZ2VyaW5nICovCisJLyogc2V0dXAgc3RhcnQgdHJpZ2dlcmluZyAqLwogCW91dHcoMCwgZGV2LT5pb2Jhc2UgKyBUUklHR0VSX1JFRyk7CiAKLQkvKiAgc3RhcnQgYWNxdWlzaXRpb24gZm9yIHNvZnQgdHJpZ2dlciAqLworCS8qIHN0YXJ0IGFjcXVpc2l0aW9uIGZvciBzb2Z0IHRyaWdnZXIgKi8KIAlvdXR3KDAsIGRldi0+aW9iYXNlICsgRklGT19TVEFSVF9SRUcpOwogCiAJLyoKQEAgLTYzMiw3ICs2MjcsNyBAQAogCQlpbncoZGV2LT5pb2Jhc2UgKyBGSUZPX0RBVEFfUkVHKTsKIAl9CiAKLQkvKiAgcmVhZCBkYXRhICovCisJLyogcmVhZCBkYXRhICovCiAJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgewogCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIHMsIGluc24sIGEyMTUwX2FpX2VvYywgMCk7CiAJCWlmIChyZXQpCkBAIC02NDIsNyArNjM3LDcgQEAKIAkJZGF0YVtuXSBePSAweDgwMDA7CiAJfQogCi0JLyogIGNsZWFyIGZpZm8gYW5kIHJlc2V0IHRyaWdnZXJpbmcgY2lyY3VpdHJ5ICovCisJLyogY2xlYXIgZmlmbyBhbmQgcmVzZXQgdHJpZ2dlcmluZyBjaXJjdWl0cnkgKi8KIAlvdXR3KDAsIGRldi0+aW9iYXNlICsgRklGT19SRVNFVF9SRUcpOwogCiAJcmV0dXJuIG47CkBAIC03NDksMTYgKzc0NCwxNiBAQAogCQlzLT5jYW5jZWwgPSBhMjE1MF9jYW5jZWw7CiAJfQogCi0JLyogIHNldCBjYXJkJ3MgaXJxIGFuZCBkbWEgbGV2ZWxzICovCisJLyogc2V0IGNhcmQncyBpcnEgYW5kIGRtYSBsZXZlbHMgKi8KIAlvdXR3KGRldnByaXYtPmlycV9kbWFfYml0cywgZGV2LT5pb2Jhc2UgKyBJUlFfRE1BX0NOVFJMX1JFRyk7CiAKLQkvKiAgcmVzZXQgYW5kIHN5bmMgYWRjIGNsb2NrIGNpcmN1aXRyeSAqLworCS8qIHJlc2V0IGFuZCBzeW5jIGFkYyBjbG9jayBjaXJjdWl0cnkgKi8KIAlvdXR3X3AoRFBEX0JJVCB8IEFQRF9CSVQsIGRldi0+aW9iYXNlICsgQ09ORklHX1JFRyk7CiAJb3V0d19wKERQRF9CSVQsIGRldi0+aW9iYXNlICsgQ09ORklHX1JFRyk7Ci0JLyogIGluaXRpYWxpemUgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworCS8qIGluaXRpYWxpemUgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLwogCWRldnByaXYtPmNvbmZpZ19iaXRzID0gMDsKIAlvdXR3KGRldnByaXYtPmNvbmZpZ19iaXRzLCBkZXYtPmlvYmFzZSArIENPTkZJR19SRUcpOwotCS8qICB3YWl0IHVudGlsIG9mZnNldCBjYWxpYnJhdGlvbiBpcyBkb25lLCB0aGVuIGVuYWJsZSBhbmFsb2cgaW5wdXRzICovCisJLyogd2FpdCB1bnRpbCBvZmZzZXQgY2FsaWJyYXRpb24gaXMgZG9uZSwgdGhlbiBlbmFibGUgYW5hbG9nIGlucHV0cyAqLwogCWZvciAoaSA9IDA7IGkgPCB0aW1lb3V0OyBpKyspIHsKIAkJaWYgKChEQ0FMX0JJVCAmIGludyhkZXYtPmlvYmFzZSArIFNUQVRVU19SRUcpKSA9PSAwKQogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRtaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdG1pby5jCmluZGV4IDk1NDM1YjguLmZmY2Y3YWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdG1pby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdG1pby5jCkBAIC0xLDkzICsxLDg0IEBACiAvKgotICAgIGNvbWVkaS9kcml2ZXJzL25pX2F0bWlvLmMKLSAgICBIYXJkd2FyZSBkcml2ZXIgZm9yIE5JIEFULU1JTyBFIHNlcmllcyBjYXJkcworICogQ29tZWRpIGRyaXZlciBmb3IgTkkgQVQtTUlPIEUgc2VyaWVzIGNhcmRzCisgKgorICogQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICogQ29weXJpZ2h0IChDKSAxOTk3LTIwMDEgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCiAKLSAgICBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCi0gICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDEgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSovCiAvKgotRHJpdmVyOiBuaV9hdG1pbwotRGVzY3JpcHRpb246IE5hdGlvbmFsIEluc3RydW1lbnRzIEFULU1JTy1FIHNlcmllcwotQXV0aG9yOiBkcwotRGV2aWNlczogW05hdGlvbmFsIEluc3RydW1lbnRzXSBBVC1NSU8tMTZFLTEgKG5pX2F0bWlvKSwKLSAgQVQtTUlPLTE2RS0yLCBBVC1NSU8tMTZFLTEwLCBBVC1NSU8tMTZERS0xMCwgQVQtTUlPLTY0RS0zLAotICBBVC1NSU8tMTZYRS01MCwgQVQtTUlPLTE2WEUtMTAsIEFULUFJLTE2WEUtMTAKLVN0YXR1czogd29ya3MKLVVwZGF0ZWQ6IFRodSBNYXkgIDEgMjA6MDM6MDIgQ0RUIDIwMDMKKyAqIERyaXZlcjogbmlfYXRtaW8KKyAqIERlc2NyaXB0aW9uOiBOYXRpb25hbCBJbnN0cnVtZW50cyBBVC1NSU8tRSBzZXJpZXMKKyAqIEF1dGhvcjogZHMKKyAqIERldmljZXM6IFtOYXRpb25hbCBJbnN0cnVtZW50c10gQVQtTUlPLTE2RS0xIChuaV9hdG1pbyksCisgKiAgIEFULU1JTy0xNkUtMiwgQVQtTUlPLTE2RS0xMCwgQVQtTUlPLTE2REUtMTAsIEFULU1JTy02NEUtMywKKyAqICAgQVQtTUlPLTE2WEUtNTAsIEFULU1JTy0xNlhFLTEwLCBBVC1BSS0xNlhFLTEwCisgKiBTdGF0dXM6IHdvcmtzCisgKiBVcGRhdGVkOiBUaHUgTWF5ICAxIDIwOjAzOjAyIENEVCAyMDAzCisgKgorICogVGhlIGRyaXZlciBoYXMgMi42IGtlcm5lbCBpc2FwbnAgc3VwcG9ydCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSBwcm9iZSBmb3IKKyAqIGEgc3VwcG9ydGVkIGJvYXJkIGlmIHRoZSBJL08gYmFzZSBpcyBsZWZ0IHVuc3BlY2lmaWVkIHdpdGggY29tZWRpX2NvbmZpZy4KKyAqIEhvd2V2ZXIsIG1hbnkgb2YgdGhlIGlzYXBucCBpZCBudW1iZXJzIGFyZSB1bmtub3duLiBJZiB5b3VyIGJvYXJkIGlzIG5vdAorICogcmVjb2duaXplZCwgcGxlYXNlIHNlbmQgdGhlIG91dHB1dCBvZiAnY2F0IC9wcm9jL2lzYXBucCcgKHlvdSBtYXkgbmVlZCB0bworICogbW9kcHJvYmUgdGhlIGlzYS1wbnAgbW9kdWxlIGZvciAvcHJvYy9pc2FwbnAgdG8gZXhpc3QpIHNvIHRoZSBpZCBudW1iZXJzCisgKiBmb3IgeW91ciBib2FyZCBjYW4gYmUgYWRkZWQgdG8gdGhlIGRyaXZlci4KKyAqCisgKiBPdGhlcndpc2UsIHlvdSBjYW4gdXNlIHRoZSBpc2FwbnB0b29scyBwYWNrYWdlIHRvIGNvbmZpZ3VyZSB5b3VyIGJvYXJkLgorICogVXNlIGlzYXBucCB0byBjb25maWd1cmUgdGhlIEkvTyBiYXNlIGFuZCBJUlEgZm9yIHRoZSBib2FyZCwgYW5kIHRoZW4gcGFzcworICogdGhlIHNhbWUgdmFsdWVzIGFzIHBhcmFtZXRlcnMgaW4gY29tZWRpX2NvbmZpZy4gQSBzYW1wbGUgaXNhcG5wLmNvbmYgZmlsZQorICogaXMgaW5jbHVkZWQgaW4gdGhlIGV0Yy8gZGlyZWN0b3J5IG9mIENvbWVkaWxpYi4KKyAqCisgKiBDb21lZGlsaWIgaW5jbHVkZXMgYSB1dGlsaXR5IHRvIGF1dG9jYWxpYnJhdGUgdGhlc2UgYm9hcmRzLiBUaGUgYm9hcmRzCisgKiBzZWVtIHRvIGJvb3QgaW50byBhIHN0YXRlIHdoZXJlIHRoZSBhbGwgY2FsaWJyYXRpb24gREFDcyBhcmUgYXQgb25lCisgKiBleHRyZW1lIG9mIHRoZWlyIHJhbmdlLCB0aHVzIHRoZSBkZWZhdWx0IGNhbGlicmF0aW9uIGlzIHRlcnJpYmxlLgorICogQ2FsaWJyYXRpb24gYXQgYm9vdCBpcyBzdHJvbmdseSBlbmNvdXJhZ2VkLgorICoKKyAqIFRvIHVzZSB0aGUgZXh0ZW5kZWQgZGlnaXRhbCBJL08gb24gc29tZSBvZiB0aGUgYm9hcmRzLCBlbmFibGUgdGhlCisgKiA4MjU1IGRyaXZlciB3aGVuIGNvbmZpZ3VyaW5nIHRoZSBDb21lZGkgc291cmNlIHRyZWUuCisgKgorICogRXh0ZXJuYWwgdHJpZ2dlcmluZyBpcyBzdXBwb3J0ZWQgZm9yIHNvbWUgZXZlbnRzLiBUaGUgY2hhbm5lbCBpbmRleAorICogKHNjYW5fYmVnaW5fYXJnLCBldGMuKSBtYXBzIHRvIFBGSTAgLSBQRkk5LgorICoKKyAqIFNvbWUgb2YgdGhlIG1vcmUgZXNvdGVyaWMgdHJpZ2dlcmluZyBwb3NzaWJpbGl0aWVzIG9mIHRoZXNlIGJvYXJkcyBhcmUKKyAqIG5vdCBzdXBwb3J0ZWQuCisgKi8KIAotVGhlIGRyaXZlciBoYXMgMi42IGtlcm5lbCBpc2FwbnAgc3VwcG9ydCwgYW5kCi13aWxsIGF1dG9tYXRpY2FsbHkgcHJvYmUgZm9yIGEgc3VwcG9ydGVkIGJvYXJkIGlmIHRoZQotSS9PIGJhc2UgaXMgbGVmdCB1bnNwZWNpZmllZCB3aXRoIGNvbWVkaV9jb25maWcuCi1Ib3dldmVyLCBtYW55IG9mCi10aGUgaXNhcG5wIGlkIG51bWJlcnMgYXJlIHVua25vd24uICBJZiB5b3VyIGJvYXJkIGlzIG5vdAotcmVjb2duaXplZCwgcGxlYXNlIHNlbmQgdGhlIG91dHB1dCBvZiAnY2F0IC9wcm9jL2lzYXBucCcKLSh5b3UgbWF5IG5lZWQgdG8gbW9kcHJvYmUgdGhlIGlzYS1wbnAgbW9kdWxlIGZvcgotL3Byb2MvaXNhcG5wIHRvIGV4aXN0KSBzbyB0aGUKLWlkIG51bWJlcnMgZm9yIHlvdXIgYm9hcmQgY2FuIGJlIGFkZGVkIHRvIHRoZSBkcml2ZXIuCi0KLU90aGVyd2lzZSwgeW91IGNhbiB1c2UgdGhlIGlzYXBucHRvb2xzIHBhY2thZ2UgdG8gY29uZmlndXJlCi15b3VyIGJvYXJkLiAgVXNlIGlzYXBucCB0bwotY29uZmlndXJlIHRoZSBJL08gYmFzZSBhbmQgSVJRIGZvciB0aGUgYm9hcmQsIGFuZCB0aGVuIHBhc3MKLXRoZSBzYW1lIHZhbHVlcyBhcwotcGFyYW1ldGVycyBpbiBjb21lZGlfY29uZmlnLiAgQSBzYW1wbGUgaXNhcG5wLmNvbmYgZmlsZSBpcyBpbmNsdWRlZAotaW4gdGhlIGV0Yy8gZGlyZWN0b3J5IG9mIENvbWVkaWxpYi4KLQotQ29tZWRpbGliIGluY2x1ZGVzIGEgdXRpbGl0eSB0byBhdXRvY2FsaWJyYXRlIHRoZXNlIGJvYXJkcy4gIFRoZQotYm9hcmRzIHNlZW0gdG8gYm9vdCBpbnRvIGEgc3RhdGUgd2hlcmUgdGhlIGFsbCBjYWxpYnJhdGlvbiBEQUNzCi1hcmUgYXQgb25lIGV4dHJlbWUgb2YgdGhlaXIgcmFuZ2UsIHRodXMgdGhlIGRlZmF1bHQgY2FsaWJyYXRpb24KLWlzIHRlcnJpYmxlLiAgQ2FsaWJyYXRpb24gYXQgYm9vdCBpcyBzdHJvbmdseSBlbmNvdXJhZ2VkLgotCi1UbyB1c2UgdGhlIGV4dGVuZGVkIGRpZ2l0YWwgSS9PIG9uIHNvbWUgb2YgdGhlIGJvYXJkcywgZW5hYmxlIHRoZQotODI1NSBkcml2ZXIgd2hlbiBjb25maWd1cmluZyB0aGUgQ29tZWRpIHNvdXJjZSB0cmVlLgotCi1FeHRlcm5hbCB0cmlnZ2VyaW5nIGlzIHN1cHBvcnRlZCBmb3Igc29tZSBldmVudHMuICBUaGUgY2hhbm5lbCBpbmRleAotKHNjYW5fYmVnaW5fYXJnLCBldGMuKSBtYXBzIHRvIFBGSTAgLSBQRkk5LgotCi1Tb21lIG9mIHRoZSBtb3JlIGVzb3RlcmljIHRyaWdnZXJpbmcgcG9zc2liaWxpdGllcyBvZiB0aGVzZSBib2FyZHMKLWFyZSBub3Qgc3VwcG9ydGVkLgotKi8KIC8qCi0JVGhlIHJlYWwgZ3V0cyBvZiB0aGUgZHJpdmVyIGlzIGluIG5pX21pb19jb21tb24uYywgd2hpY2ggaXMgaW5jbHVkZWQKLQlib3RoIGhlcmUgYW5kIGluIG5pX3BjaW1pby5jCi0KLQlJbnRlcnJ1cHQgc3VwcG9ydCBhZGRlZCBieSBUcnV4dG9uIEZ1bHRvbiA8dHJ1eEB0cnV4dG9uLmNvbT4KLQotCVJlZmVyZW5jZXMgZm9yIHNwZWNpZmljYXRpb25zOgotCi0JICAgMzQwNzQ3Yi5wZGYgIFJlZ2lzdGVyIExldmVsIFByb2dyYW1tZXIgTWFudWFsIChvYnNvbGV0ZSkKLQkgICAzNDA3NDdjLnBkZiAgUmVnaXN0ZXIgTGV2ZWwgUHJvZ3JhbW1lciBNYW51YWwgKG5ldykKLQkgICBEQVEtU1RDIHJlZmVyZW5jZSBtYW51YWwKLQotCU90aGVyIHBvc3NpYmx5IHJlbGV2YW50IGluZm86Ci0KLQkgICAzMjA1MTdjLnBkZiAgVXNlciBtYW51YWwgKG9ic29sZXRlKQotCSAgIDMyMDUxN2YucGRmICBVc2VyIG1hbnVhbCAobmV3KQotCSAgIDMyMDg4OWEucGRmICBkZWxldGUKLQkgICAzMjA5MDZjLnBkZiAgbWF4aW11bSBzaWduYWwgcmF0aW5ncwotCSAgIDMyMTA2NmEucGRmICBhYm91dCAxNngKLQkgICAzMjE3OTFhLnBkZiAgZGlzY29udGludWF0aW9uIG9mIGF0LW1pby0xNmUtMTAgcmV2LiBjCi0JICAgMzIxODA4YS5wZGYgIGFib3V0IGF0LW1pby0xNmUtMTAgcmV2IFAKLQkgICAzMjE4MzdhLnBkZiAgZGlzY29udGludWF0aW9uIG9mIGF0LW1pby0xNmRlLTEwIHJldiBkCi0JICAgMzIxODM4YS5wZGYgIGFib3V0IGF0LW1pby0xNmRlLTEwIHJldiBOCi0KLQlJU1NVRVM6Ci0KLQluZWVkIHRvIGRlYWwgd2l0aCBleHRlcm5hbCByZWZlcmVuY2UgZm9yIERBQywgYW5kIG90aGVyIERBQwotCXByb3BlcnRpZXMgaW4gYm9hcmQgcHJvcGVydGllcwotCi0JZGVhbCB3aXRoIGF0LW1pby0xNmRlLTEwIHJldmlzaW9uIEQgdG8gTiBjaGFuZ2VzLCBldGMuCi0KLSovCisgKiBUaGUgcmVhbCBndXRzIG9mIHRoZSBkcml2ZXIgaXMgaW4gbmlfbWlvX2NvbW1vbi5jLCB3aGljaCBpcyBpbmNsdWRlZAorICogYm90aCBoZXJlIGFuZCBpbiBuaV9wY2ltaW8uYworICoKKyAqIEludGVycnVwdCBzdXBwb3J0IGFkZGVkIGJ5IFRydXh0b24gRnVsdG9uIDx0cnV4QHRydXh0b24uY29tPgorICoKKyAqIFJlZmVyZW5jZXMgZm9yIHNwZWNpZmljYXRpb25zOgorICoJMzQwNzQ3Yi5wZGYgIFJlZ2lzdGVyIExldmVsIFByb2dyYW1tZXIgTWFudWFsIChvYnNvbGV0ZSkKKyAqCTM0MDc0N2MucGRmICBSZWdpc3RlciBMZXZlbCBQcm9ncmFtbWVyIE1hbnVhbCAobmV3KQorICoJCSAgICAgREFRLVNUQyByZWZlcmVuY2UgbWFudWFsCisgKgorICogT3RoZXIgcG9zc2libHkgcmVsZXZhbnQgaW5mbzoKKyAqCTMyMDUxN2MucGRmICBVc2VyIG1hbnVhbCAob2Jzb2xldGUpCisgKgkzMjA1MTdmLnBkZiAgVXNlciBtYW51YWwgKG5ldykKKyAqCTMyMDg4OWEucGRmICBkZWxldGUKKyAqCTMyMDkwNmMucGRmICBtYXhpbXVtIHNpZ25hbCByYXRpbmdzCisgKgkzMjEwNjZhLnBkZiAgYWJvdXQgMTZ4CisgKgkzMjE3OTFhLnBkZiAgZGlzY29udGludWF0aW9uIG9mIGF0LW1pby0xNmUtMTAgcmV2LiBjCisgKgkzMjE4MDhhLnBkZiAgYWJvdXQgYXQtbWlvLTE2ZS0xMCByZXYgUAorICoJMzIxODM3YS5wZGYgIGRpc2NvbnRpbnVhdGlvbiBvZiBhdC1taW8tMTZkZS0xMCByZXYgZAorICoJMzIxODM4YS5wZGYgIGFib3V0IGF0LW1pby0xNmRlLTEwIHJldiBOCisgKgorICogSVNTVUVTOgorICogLSBuZWVkIHRvIGRlYWwgd2l0aCBleHRlcm5hbCByZWZlcmVuY2UgZm9yIERBQywgYW5kIG90aGVyIERBQworICogICBwcm9wZXJ0aWVzIGluIGJvYXJkIHByb3BlcnRpZXMKKyAqIC0gZGVhbCB3aXRoIGF0LW1pby0xNmRlLTEwIHJldmlzaW9uIEQgdG8gTiBjaGFuZ2VzLCBldGMuCisgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtOTgsMTAgKzg5LDcgQEAKICNpbmNsdWRlICJuaV9zdGMuaCIKICNpbmNsdWRlICI4MjU1LmgiCiAKLS8qCi0gKiAgQVQgc3BlY2lmaWMgc2V0dXAKLSAqLwotCisvKiBBVCBzcGVjaWZpYyBzZXR1cCAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBuaV9ib2FyZF9zdHJ1Y3QgbmlfYm9hcmRzW10gPSB7CiAJewogCQkubmFtZQkJPSAiYXQtbWlvLTE2ZS0xIiwKQEAgLTIxNSw3ICsyMDMsNyBAQAogCQkubl9hZGNoYW4JPSAxNiwKIAkJLmFpX21heGRhdGEJPSAweGZmZmYsCiAJCS5haV9maWZvX2RlcHRoCT0gNTEyLAotCQkuYWx3YXlzZGl0aGVyCT0gMSwJLyogdW5rbm93biAqLworCQkuYWx3YXlzZGl0aGVyCT0gMSwJCS8qIHVua25vd24gKi8KIAkJLmdhaW5sa3VwCT0gYWlfZ2Fpbl8xNCwKIAkJLmFpX3NwZWVkCT0gMTAwMDAsCiAJCS5jYWxkYWMJCT0geyBkYWM4ODAwLCBkYWM4MDQzLCBhZDg1MjIgfSwKQEAgLTI4NywxMCArMjc1LDEwIEBACiAJfQogCWlmIChkZXZpY2VfaWQgPT0gMjU1KQogCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiY2FuJ3QgZmluZCBib2FyZFxuIik7Ci0JIGVsc2UgaWYgKGRldmljZV9pZCA9PSAwKQorCWVsc2UgaWYgKGRldmljZV9pZCA9PSAwKQogCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAogCQkJIkVFUFJPTSByZWFkIGVycm9yICg/KSBvciBkZXZpY2Ugbm90IGZvdW5kXG4iKTsKLQkgZWxzZQorCWVsc2UKIAkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKIAkJCSJ1bmtub3duIGRldmljZSBJRCAlZCAtLSBjb250YWN0IGF1dGhvclxuIiwgZGV2aWNlX2lkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0bWlvMTZkLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRtaW8xNmQuYwppbmRleCBjM2ViNTQ2Li5mYjU5YjBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRtaW8xNmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRtaW8xNmQuYwpAQCAtMSwyNSArMSw0MSBAQAogLyoKLSAgIGNvbWVkaS9kcml2ZXJzL25pX2F0bWlvMTZkLmMKLSAgIEhhcmR3YXJlIGRyaXZlciBmb3IgTmF0aW9uYWwgSW5zdHJ1bWVudHMgQVQtTUlPMTZEIGJvYXJkCi0gICBDb3B5cmlnaHQgKEMpIDIwMDAgQ2hyaXMgUi4gQmF1Z2hlciA8YmF1Z2hlckBlbnRlcmFjdC5jb20+Ci0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiBDb21lZGkgZHJpdmVyIGZvciBOYXRpb25hbCBJbnN0cnVtZW50cyBBVC1NSU8xNkQgYm9hcmQKKyAqIENvcHlyaWdodCAoQykgMjAwMCBDaHJpcyBSLiBCYXVnaGVyIDxiYXVnaGVyQGVudGVyYWN0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KKwogLyoKLURyaXZlcjogbmlfYXRtaW8xNmQKLURlc2NyaXB0aW9uOiBOYXRpb25hbCBJbnN0cnVtZW50cyBBVC1NSU8tMTZECi1BdXRob3I6IENocmlzIFIuIEJhdWdoZXIgPGJhdWdoZXJAZW50ZXJhY3QuY29tPgotU3RhdHVzOiB1bmtub3duCi1EZXZpY2VzOiBbTmF0aW9uYWwgSW5zdHJ1bWVudHNdIEFULU1JTy0xNiAoYXRtaW8xNiksIEFULU1JTy0xNkQgKGF0bWlvMTZkKQotKi8KKyAqIERyaXZlcjogbmlfYXRtaW8xNmQKKyAqIERlc2NyaXB0aW9uOiBOYXRpb25hbCBJbnN0cnVtZW50cyBBVC1NSU8tMTZECisgKiBBdXRob3I6IENocmlzIFIuIEJhdWdoZXIgPGJhdWdoZXJAZW50ZXJhY3QuY29tPgorICogU3RhdHVzOiB1bmtub3duCisgKiBEZXZpY2VzOiBbTmF0aW9uYWwgSW5zdHJ1bWVudHNdIEFULU1JTy0xNiAoYXRtaW8xNiksIEFULU1JTy0xNkQgKGF0bWlvMTZkKQorICoKKyAqIENvbmZpZ3VyYXRpb24gb3B0aW9uczoKKyAqICAgWzBdIC0gSS9PIHBvcnQKKyAqICAgWzFdIC0gTUlPIGlycSAoMCA9PSBubyBpcnE7IG9yIDMsNCw1LDYsNyw5LDEwLDExLDEyLDE0LDE1KQorICogICBbMl0gLSBESU8gaXJxICgwID09IG5vIGlycTsgb3IgMyw0LDUsNiw3LDkpCisgKiAgIFszXSAtIERNQTEgY2hhbm5lbCAoMCA9PSBubyBETUE7IG9yIDUsNiw3KQorICogICBbNF0gLSBETUEyIGNoYW5uZWwgKDAgPT0gbm8gRE1BOyBvciA1LDYsNykKKyAqICAgWzVdIC0gYS9kIG11eCAoMD1kaWZmZXJlbnRpYWw7IDE9c2luZ2xlKQorICogICBbNl0gLSBhL2QgcmFuZ2UgKDA9Ymlwb2xhcjEwOyAxPWJpcG9sYXI1OyAyPXVuaXBvbGFyMTApCisgKiAgIFs3XSAtIGRhYzAgcmFuZ2UgKDA9Ymlwb2xhcjsgMT11bmlwb2xhcikKKyAqICAgWzhdIC0gZGFjMCByZWZlcmVuY2UgKDA9aW50ZXJuYWw7IDE9ZXh0ZXJuYWwpCisgKiAgIFs5XSAtIGRhYzAgY29kaW5nICgwPTIncyBjb21wOyAxPXN0cmFpZ2h0IGJpbmFyeSkKKyAqICAgWzEwXSAtIGRhYzEgcmFuZ2UgKHNhbWUgYXMgZGFjMCBvcHRpb25zKQorICogICBbMTFdIC0gZGFjMSByZWZlcmVuY2UgKHNhbWUgYXMgZGFjMCBvcHRpb25zKQorICogICBbMTJdIC0gZGFjMSBjb2RpbmcgKHNhbWUgYXMgZGFjMCBvcHRpb25zKQorICovCisKIC8qCiAgKiBJIG11c3QgZ2l2ZSBjcmVkaXQgaGVyZSB0byBNaWNoYWwgRG9iZXMgPGRvYmVzQHRlc25ldC5jej4gd2hvCiAgKiB3cm90ZSB0aGUgZHJpdmVyIGZvciBBZHZhbnRlYydzIHBjbDgxMiBib2FyZHMuIEkgdXNlZCB0aGUgaW50ZXJydXB0CkBAIC0yOTUsOCArMzExLDEwIEBACiAJdW5zaWduZWQgaW50IHNhbXBsZV9jb3VudCwgdG1wLCBjaGFuLCBnYWluOwogCWludCBpOwogCi0JLyogVGhpcyBpcyBzbG93bHkgYmVjb21pbmcgYSB3b3JraW5nIGNvbW1hbmQgaW50ZXJmYWNlLiAqCi0JICogSXQgaXMgc3RpbGwgdWJlci1leHBlcmltZW50YWwgKi8KKwkvKgorCSAqIFRoaXMgaXMgc2xvd2x5IGJlY29taW5nIGEgd29ya2luZyBjb21tYW5kIGludGVyZmFjZS4KKwkgKiBJdCBpcyBzdGlsbCB1YmVyLWV4cGVyaW1lbnRhbAorCSAqLwogCiAJcmVzZXRfY291bnRlcnMoZGV2KTsKIApAQCAtMzIyLDkgKzM0MCwxMCBAQAogCQlvdXR3KHRtcCwgZGV2LT5pb2Jhc2UgKyBNVVhfR0FJTl9SRUcpOwogCX0KIAotCS8qIE5vdyBwcm9ncmFtIHRoZSBzYW1wbGUgaW50ZXJ2YWwgdGltZXIgKi8KLQkvKiBGaWd1cmUgb3V0IHdoaWNoIGNsb2NrIHRvIHVzZSB0aGVuIGdldCBhbgotCSAqIGFwcHJvcHJpYXRlIHRpbWVyIHZhbHVlICovCisJLyoKKwkgKiBOb3cgcHJvZ3JhbSB0aGUgc2FtcGxlIGludGVydmFsIHRpbWVyLgorCSAqIEZpZ3VyZSBvdXQgd2hpY2ggY2xvY2sgdG8gdXNlIHRoZW4gZ2V0IGFuIGFwcHJvcHJpYXRlIHRpbWVyIHZhbHVlLgorCSAqLwogCWlmIChjbWQtPmNvbnZlcnRfYXJnIDwgNjU1MzYwMDApIHsKIAkJYmFzZV9jbG9jayA9IENMT0NLXzFfTUhaOwogCQl0aW1lciA9IGNtZC0+Y29udmVydF9hcmcgLyAxMDAwOwpAQCAtMzg2LDkgKzQwNSwxMCBAQAogCQlvdXR3KGRldnByaXYtPmNvbV9yZWdfMV9zdGF0ZSwgZGV2LT5pb2Jhc2UgKyBDT01fUkVHXzEpOwogCX0KIAotCS8qIFByb2dyYW0gdGhlIHNjYW4gaW50ZXJ2YWwgdGltZXIgT05MWSBJRiBTQ0FOTklORyBJUyBFTkFCTEVEICovCi0JLyogRmlndXJlIG91dCB3aGljaCBjbG9jayB0byB1c2UgdGhlbiBnZXQgYW4KLQkgKiBhcHByb3ByaWF0ZSB0aW1lciB2YWx1ZSAqLworCS8qCisJICogUHJvZ3JhbSB0aGUgc2NhbiBpbnRlcnZhbCB0aW1lciBPTkxZIElGIFNDQU5OSU5HIElTIEVOQUJMRUQuCisJICogRmlndXJlIG91dCB3aGljaCBjbG9jayB0byB1c2UgdGhlbiBnZXQgYW4gYXBwcm9wcmlhdGUgdGltZXIgdmFsdWUuCisJICovCiAJaWYgKGNtZC0+Y2hhbmxpc3RfbGVuID4gMSkgewogCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyA8IDY1NTM2MDAwKSB7CiAJCQliYXNlX2Nsb2NrID0gQ0xPQ0tfMV9NSFo7CkBAIC01NjYsMzggKzU4Niw2IEBACiAJcmV0dXJuIGluc24tPm47CiB9CiAKLS8qCi0gICBvcHRpb25zWzBdIC0gSS9PIHBvcnQKLSAgIG9wdGlvbnNbMV0gLSBNSU8gaXJxCi0JCTAgPT0gbm8gaXJxCi0JCU4gPT0gaXJxIE4gezMsNCw1LDYsNyw5LDEwLDExLDEyLDE0LDE1fQotICAgb3B0aW9uc1syXSAtIERJTyBpcnEKLQkJMCA9PSBubyBpcnEKLQkJTiA9PSBpcnEgTiB7Myw0LDUsNiw3LDl9Ci0gICBvcHRpb25zWzNdIC0gRE1BMSBjaGFubmVsCi0JCTAgPT0gbm8gRE1BCi0JCU4gPT0gRE1BIE4gezUsNiw3fQotICAgb3B0aW9uc1s0XSAtIERNQTIgY2hhbm5lbAotCQkwID09IG5vIERNQQotCQlOID09IERNQSBOIHs1LDYsN30KLQotICAgb3B0aW9uc1s1XSAtIGEvZCBtdXgKLQkwPWRpZmZlcmVudGlhbCwgMT1zaW5nbGUKLSAgIG9wdGlvbnNbNl0gLSBhL2QgcmFuZ2UKLQkwPWJpcG9sYXIxMCwgMT1iaXBvbGFyNSwgMj11bmlwb2xhcjEwCi0KLSAgIG9wdGlvbnNbN10gLSBkYWMwIHJhbmdlCi0JMD1iaXBvbGFyLCAxPXVuaXBvbGFyCi0gICBvcHRpb25zWzhdIC0gZGFjMCByZWZlcmVuY2UKLQkwPWludGVybmFsLCAxPWV4dGVybmFsCi0gICBvcHRpb25zWzldIC0gZGFjMCBjb2RpbmcKLQkwPTIncyBjb21wLCAxPXN0cmFpZ2h0IGJpbmFyeQotCi0gICBvcHRpb25zWzEwXSAtIGRhYzEgcmFuZ2UKLSAgIG9wdGlvbnNbMTFdIC0gZGFjMSByZWZlcmVuY2UKLSAgIG9wdGlvbnNbMTJdIC0gZGFjMSBjb2RpbmcKLSAqLwotCiBzdGF0aWMgaW50IGF0bWlvMTZkX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgc3RydWN0IGNvbWVkaV9kZXZjb25maWcgKml0KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2RhcV9kaW8yNC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2RhcV9kaW8yNC5jCmluZGV4IGQ5ZGU4M2EuLjczM2QzZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9kYXFfZGlvMjQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfZGFxX2RpbzI0LmMKQEAgLTEsMzUgKzEsMzUgQEAKIC8qCi0gICAgY29tZWRpL2RyaXZlcnMvbmlfZGFxX2RpbzI0LmMKLSAgICBEcml2ZXIgZm9yIE5hdGlvbmFsIEluc3RydW1lbnRzIFBDTUNJQSBEQVEtQ2FyZCBESU8tMjQKLSAgICBDb3B5cmlnaHQgKEMpIDIwMDIgRGFuaWVsIFZlY2lubyBDYXN0ZWwgPGR2ZWNpbm9AYWJsZS5lcz4KKyAqIENvbWVkaSBkcml2ZXIgZm9yIE5hdGlvbmFsIEluc3RydW1lbnRzIFBDTUNJQSBEQVEtQ2FyZCBESU8tMjQKKyAqIENvcHlyaWdodCAoQykgMjAwMiBEYW5pZWwgVmVjaW5vIENhc3RlbCA8ZHZlY2lub0BhYmxlLmVzPgorICoKKyAqIFBDTUNJQSBjcmFwIGF0IGVuZCBvZiBmaWxlIGlzIGFkYXB0ZWQgZnJvbSBkdW1teV9jcy5jIDEuMzEKKyAqIDIwMDEvMDgvMjQgMTI6MTM6MTMgZnJvbSB0aGUgcGNtY2lhIHBhY2thZ2UuCisgKiBUaGUgaW5pdGlhbCBkZXZlbG9wZXIgb2YgdGhlIHBjbWNpYSBkdW1teV9jcy5jIGNvZGUgaXMgRGF2aWQgQS4gSGluZHMKKyAqIDxkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4uICBQb3J0aW9ucyBjcmVhdGVkIGJ5IERhdmlkIEEuIEhpbmRzCisgKiBhcmUgQ29weXJpZ2h0IChDKSAxOTk5IERhdmlkIEEuIEhpbmRzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KIAotICAgIFBDTUNJQSBjcmFwIGF0IGVuZCBvZiBmaWxlIGlzIGFkYXB0ZWQgZnJvbSBkdW1teV9jcy5jIDEuMzEKLSAgICAyMDAxLzA4LzI0IDEyOjEzOjEzIGZyb20gdGhlIHBjbWNpYSBwYWNrYWdlLgotICAgIFRoZSBpbml0aWFsIGRldmVsb3BlciBvZiB0aGUgcGNtY2lhIGR1bW15X2NzLmMgY29kZSBpcyBEYXZpZCBBLiBIaW5kcwotICAgIDxkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4uICBQb3J0aW9ucyBjcmVhdGVkIGJ5IERhdmlkIEEuIEhpbmRzCi0gICAgYXJlIENvcHlyaWdodCAoQykgMTk5OSBEYXZpZCBBLiBIaW5kcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSovCiAvKgotRHJpdmVyOiBuaV9kYXFfZGlvMjQKLURlc2NyaXB0aW9uOiBOYXRpb25hbCBJbnN0cnVtZW50cyBQQ01DSUEgREFRLUNhcmQgRElPLTI0Ci1BdXRob3I6IERhbmllbCBWZWNpbm8gQ2FzdGVsIDxkdmVjaW5vQGFibGUuZXM+Ci1EZXZpY2VzOiBbTmF0aW9uYWwgSW5zdHJ1bWVudHNdIFBDTUNJQSBEQVEtQ2FyZCBESU8tMjQgKG5pX2RhcV9kaW8yNCkKLVN0YXR1czogPwotVXBkYXRlZDogVGh1LCAwNyBOb3YgMjAwMiAyMTo1MzowNiAtMDgwMAotCi1UaGlzIGlzIGp1c3QgYSB3cmFwcGVyIGFyb3VuZCB0aGUgODI1NS5vIGRyaXZlciB0byBwcm9wZXJseSBoYW5kbGUKLXRoZSBQQ01DSUEgaW50ZXJmYWNlLgotKi8KKyAqIERyaXZlcjogbmlfZGFxX2RpbzI0CisgKiBEZXNjcmlwdGlvbjogTmF0aW9uYWwgSW5zdHJ1bWVudHMgUENNQ0lBIERBUS1DYXJkIERJTy0yNAorICogQXV0aG9yOiBEYW5pZWwgVmVjaW5vIENhc3RlbCA8ZHZlY2lub0BhYmxlLmVzPgorICogRGV2aWNlczogW05hdGlvbmFsIEluc3RydW1lbnRzXSBQQ01DSUEgREFRLUNhcmQgRElPLTI0IChuaV9kYXFfZGlvMjQpCisgKiBTdGF0dXM6ID8KKyAqIFVwZGF0ZWQ6IFRodSwgMDcgTm92IDIwMDIgMjE6NTM6MDYgLTA4MDAKKyAqCisgKiBUaGlzIGlzIGp1c3QgYSB3cmFwcGVyIGFyb3VuZCB0aGUgODI1NS5vIGRyaXZlciB0byBwcm9wZXJseSBoYW5kbGUKKyAqIHRoZSBQQ01DSUEgaW50ZXJmYWNlLgorICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlICIuLi9jb21lZGlfcGNtY2lhLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbWlvX2NvbW1vbi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX21pb19jb21tb24uYwppbmRleCA4ZGFiYjE5Li4wZjk3ZDdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbWlvX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9taW9fY29tbW9uLmMKQEAgLTI3NzIsNyArMjc3MiwxNSBAQAogCWludCBpOwogCXN0YXRpYyBjb25zdCBpbnQgdGltZW91dCA9IDEwMDA7CiAKLQlpZiAodHJpZ19udW0gIT0gY21kLT5zdGFydF9hcmcpCisJLyoKKwkgKiBSZXF1aXJlIHRyaWdfbnVtID09IGNtZC0+c3RhcnRfYXJnIHdoZW4gY21kLT5zdGFydF9zcmMgPT0gVFJJR19JTlQuCisJICogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBhbHNvIGFsbG93IHRyaWdfbnVtID09IDAgd2hlbgorCSAqIGNtZC0+c3RhcnRfc3JjICE9IFRSSUdfSU5UIChpLmUuIHdoZW4gY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQpOworCSAqIGluIHRoYXQgY2FzZSwgdGhlIGludGVybmFsIHRyaWdnZXIgaXMgYmVpbmcgdXNlZCBhcyBhIHByZS10cmlnZ2VyCisJICogYmVmb3JlIHRoZSBleHRlcm5hbCB0cmlnZ2VyLgorCSAqLworCWlmICghKHRyaWdfbnVtID09IGNtZC0+c3RhcnRfYXJnIHx8CisJICAgICAgKHRyaWdfbnVtID09IDAgJiYgY21kLT5zdGFydF9zcmMgIT0gVFJJR19JTlQpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKgpAQCAtNTQ4MCw3ICs1NDg4LDcgQEAKIAkJcy0+bWF4ZGF0YQk9IChkZXZwcml2LT5pc19tX3NlcmllcykgPyAweGZmZmZmZmZmCiAJCQkJCQkJIDogMHgwMGZmZmZmZjsKIAkJcy0+aW5zbl9yZWFkCT0gbmlfdGlvX2luc25fcmVhZDsKLQkJcy0+aW5zbl93cml0ZQk9IG5pX3Rpb19pbnNuX3JlYWQ7CisJCXMtPmluc25fd3JpdGUJPSBuaV90aW9faW5zbl93cml0ZTsKIAkJcy0+aW5zbl9jb25maWcJPSBuaV90aW9faW5zbl9jb25maWc7CiAjaWZkZWYgUENJRE1BCiAJCWlmIChkZXYtPmlycSAmJiBkZXZwcml2LT5taXRlKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbWlvX2NzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbWlvX2NzLmMKaW5kZXggZTNkODIxYi4uMjFmODIzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX21pb19jcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9taW9fY3MuYwpAQCAtMSw0MCArMSwzOSBAQAogLyoKLSAgICBjb21lZGkvZHJpdmVycy9uaV9taW9fY3MuYwotICAgIEhhcmR3YXJlIGRyaXZlciBmb3IgTkkgUENNQ0lBIE1JTyBFIHNlcmllcyBjYXJkcworICogQ29tZWRpIGRyaXZlciBmb3IgTkkgUENNQ0lBIE1JTyBFIHNlcmllcyBjYXJkcworICoKKyAqIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKKyAqIENvcHlyaWdodCAoQykgMTk5Ny0yMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLwogCi0gICAgQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQotICAgIENvcHlyaWdodCAoQykgMTk5Ny0yMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0qLwogLyoKLURyaXZlcjogbmlfbWlvX2NzCi1EZXNjcmlwdGlvbjogTmF0aW9uYWwgSW5zdHJ1bWVudHMgREFRQ2FyZCBFIHNlcmllcwotQXV0aG9yOiBkcwotU3RhdHVzOiB3b3JrcwotRGV2aWNlczogW05hdGlvbmFsIEluc3RydW1lbnRzXSBEQVFDYXJkLUFJLTE2WEUtNTAgKG5pX21pb19jcyksCi0gIERBUUNhcmQtQUktMTZFLTQsIERBUUNhcmQtNjA2MkUsIERBUUNhcmQtNjAyNEUsIERBUUNhcmQtNjAzNkUKLVVwZGF0ZWQ6IFRodSBPY3QgMjMgMTk6NDM6MTcgQ0RUIDIwMDMKKyAqIERyaXZlcjogbmlfbWlvX2NzCisgKiBEZXNjcmlwdGlvbjogTmF0aW9uYWwgSW5zdHJ1bWVudHMgREFRQ2FyZCBFIHNlcmllcworICogQXV0aG9yOiBkcworICogU3RhdHVzOiB3b3JrcworICogRGV2aWNlczogW05hdGlvbmFsIEluc3RydW1lbnRzXSBEQVFDYXJkLUFJLTE2WEUtNTAgKG5pX21pb19jcyksCisgKiAgIERBUUNhcmQtQUktMTZFLTQsIERBUUNhcmQtNjA2MkUsIERBUUNhcmQtNjAyNEUsIERBUUNhcmQtNjAzNkUKKyAqIFVwZGF0ZWQ6IFRodSBPY3QgMjMgMTk6NDM6MTcgQ0RUIDIwMDMKKyAqCisgKiBTZWUgdGhlIG5vdGVzIGluIHRoZSBuaV9hdG1pby5vIGRyaXZlci4KKyAqLwogCi1TZWUgdGhlIG5vdGVzIGluIHRoZSBuaV9hdG1pby5vIGRyaXZlci4KLSovCiAvKgotCVRoZSByZWFsIGd1dHMgb2YgdGhlIGRyaXZlciBpcyBpbiBuaV9taW9fY29tbW9uLmMsIHdoaWNoIGlzCi0JaW5jbHVkZWQgYnkgYWxsIHRoZSBFIHNlcmllcyBkcml2ZXJzLgotCi0JUmVmZXJlbmNlcyBmb3Igc3BlY2lmaWNhdGlvbnM6Ci0KLQkgICAzNDEwODBhLnBkZiAgREFRQ2FyZCBFIFNlcmllcyBSZWdpc3RlciBMZXZlbCBQcm9ncmFtbWVyIE1hbnVhbAotCi0qLworICogVGhlIHJlYWwgZ3V0cyBvZiB0aGUgZHJpdmVyIGlzIGluIG5pX21pb19jb21tb24uYywgd2hpY2ggaXMKKyAqIGluY2x1ZGVkIGJ5IGFsbCB0aGUgRSBzZXJpZXMgZHJpdmVycy4KKyAqCisgKiBSZWZlcmVuY2VzIGZvciBzcGVjaWZpY2F0aW9uczoKKyAqCTM0MTA4MGEucGRmICBEQVFDYXJkIEUgU2VyaWVzIFJlZ2lzdGVyIExldmVsIFByb2dyYW1tZXIgTWFudWFsCisgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpZGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpZGlvLmMKaW5kZXggMzVlZjE5Mi4uZGFlYjRhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaWRpby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9wY2lkaW8uYwpAQCAtMSw1MCArMSw0OSBAQAogLyoKLSAgICBjb21lZGkvZHJpdmVycy9uaV9wY2lkaW8uYwotICAgIGRyaXZlciBmb3IgTmF0aW9uYWwgSW5zdHJ1bWVudHMgUENJLURJTy0zMkhTCisgKiBDb21lZGkgZHJpdmVyIGZvciBOYXRpb25hbCBJbnN0cnVtZW50cyBQQ0ktRElPLTMySFMKKyAqCisgKiBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMiBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KIAotICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMiBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotKi8KIC8qCi1Ecml2ZXI6IG5pX3BjaWRpbwotRGVzY3JpcHRpb246IE5hdGlvbmFsIEluc3RydW1lbnRzIFBDSS1ESU8zMkhTLCBQQ0ktNjUzMwotQXV0aG9yOiBkcwotU3RhdHVzOiB3b3JrcwotRGV2aWNlczogW05hdGlvbmFsIEluc3RydW1lbnRzXSBQQ0ktRElPLTMySFMgKG5pX3BjaWRpbykKLQkgW05hdGlvbmFsIEluc3RydW1lbnRzXSBQWEktNjUzMywgUENJLTY1MzMgKHB4aS02NTMzKQotCSBbTmF0aW9uYWwgSW5zdHJ1bWVudHNdIFBDSS02NTM0IChwY2ktNjUzNCkKLVVwZGF0ZWQ6IE1vbiwgMDkgSmFuIDIwMTIgMTQ6Mjc6MjMgKzAwMDAKLQotVGhlIERJTzMySFMgYm9hcmQgYXBwZWFycyBhcyBvbmUgc3ViZGV2aWNlLCB3aXRoIDMyIGNoYW5uZWxzLgotRWFjaCBjaGFubmVsIGlzIGluZGl2aWR1YWxseSBJL08gY29uZmlndXJhYmxlLiAgVGhlIGNoYW5uZWwgb3JkZXIKLWlzIDA9QTAsIDE9QTEsIDI9QTIsIC4uLiA4PUIwLCAxNj1DMCwgMjQ9RDAuICBUaGUgZHJpdmVyIG9ubHkKLXN1cHBvcnRzIHNpbXBsZSBkaWdpdGFsIEkvTzsgbm8gaGFuZHNoYWtpbmcgaXMgc3VwcG9ydGVkLgotCi1ETUEgbW9zdGx5IHdvcmtzIGZvciB0aGUgUENJLURJTzMySFMsIGJ1dCBvbmx5IGluIHRpbWVkIGlucHV0IG1vZGUuCi0KLVRoZSBQQ0ktRElPLTMySFMvUENJLTY1MzMgaGFzIGEgY29uZmlndXJhYmxlIGV4dGVybmFsIHRyaWdnZXIuIFNldHRpbmcKLXNjYW5fYmVnaW5fYXJnIHRvIDAgb3IgQ1JfRURHRSB0cmlnZ2VycyBvbiB0aGUgbGVhZGluZyBlZGdlLiBTZXR0aW5nCi1zY2FuX2JlZ2luX2FyZyB0byBDUl9JTlZFUlQgb3IgKENSX0VER0UgfCBDUl9JTlZFUlQpIHRyaWdnZXJzIG9uIHRoZQotdHJhaWxpbmcgZWRnZS4KLQotVGhpcyBkcml2ZXIgY291bGQgYmUgZWFzaWx5IG1vZGlmaWVkIHRvIHN1cHBvcnQgQVQtTUlPMzJIUyBhbmQKLUFULU1JTzk2LgotCi1UaGUgUENJLTY1MzQgcmVxdWlyZXMgYSBmaXJtd2FyZSB1cGxvYWQgYWZ0ZXIgcG93ZXItdXAgdG8gd29yaywgdGhlCi1maXJtd2FyZSBkYXRhIGFuZCBpbnN0cnVjdGlvbnMgZm9yIGxvYWRpbmcgaXQgd2l0aCBjb21lZGlfY29uZmlnCi1pdCBhcmUgY29udGFpbmVkIGluIHRoZQotY29tZWRpX25vbmZyZWVfZmlybXdhcmUgdGFyYmFsbCBhdmFpbGFibGUgZnJvbSBodHRwOi8vd3d3LmNvbWVkaS5vcmcKLSovCisgKiBEcml2ZXI6IG5pX3BjaWRpbworICogRGVzY3JpcHRpb246IE5hdGlvbmFsIEluc3RydW1lbnRzIFBDSS1ESU8zMkhTLCBQQ0ktNjUzMworICogQXV0aG9yOiBkcworICogU3RhdHVzOiB3b3JrcworICogRGV2aWNlczogW05hdGlvbmFsIEluc3RydW1lbnRzXSBQQ0ktRElPLTMySFMgKG5pX3BjaWRpbykKKyAqICAgW05hdGlvbmFsIEluc3RydW1lbnRzXSBQWEktNjUzMywgUENJLTY1MzMgKHB4aS02NTMzKQorICogICBbTmF0aW9uYWwgSW5zdHJ1bWVudHNdIFBDSS02NTM0IChwY2ktNjUzNCkKKyAqIFVwZGF0ZWQ6IE1vbiwgMDkgSmFuIDIwMTIgMTQ6Mjc6MjMgKzAwMDAKKyAqCisgKiBUaGUgRElPMzJIUyBib2FyZCBhcHBlYXJzIGFzIG9uZSBzdWJkZXZpY2UsIHdpdGggMzIgY2hhbm5lbHMuIEVhY2gKKyAqIGNoYW5uZWwgaXMgaW5kaXZpZHVhbGx5IEkvTyBjb25maWd1cmFibGUuIFRoZSBjaGFubmVsIG9yZGVyIGlzIDA9QTAsCisgKiAxPUExLCAyPUEyLCAuLi4gOD1CMCwgMTY9QzAsIDI0PUQwLiBUaGUgZHJpdmVyIG9ubHkgc3VwcG9ydHMgc2ltcGxlCisgKiBkaWdpdGFsIEkvTzsgbm8gaGFuZHNoYWtpbmcgaXMgc3VwcG9ydGVkLgorICoKKyAqIERNQSBtb3N0bHkgd29ya3MgZm9yIHRoZSBQQ0ktRElPMzJIUywgYnV0IG9ubHkgaW4gdGltZWQgaW5wdXQgbW9kZS4KKyAqCisgKiBUaGUgUENJLURJTy0zMkhTL1BDSS02NTMzIGhhcyBhIGNvbmZpZ3VyYWJsZSBleHRlcm5hbCB0cmlnZ2VyLiBTZXR0aW5nCisgKiBzY2FuX2JlZ2luX2FyZyB0byAwIG9yIENSX0VER0UgdHJpZ2dlcnMgb24gdGhlIGxlYWRpbmcgZWRnZS4gU2V0dGluZworICogc2Nhbl9iZWdpbl9hcmcgdG8gQ1JfSU5WRVJUIG9yIChDUl9FREdFIHwgQ1JfSU5WRVJUKSB0cmlnZ2VycyBvbiB0aGUKKyAqIHRyYWlsaW5nIGVkZ2UuCisgKgorICogVGhpcyBkcml2ZXIgY291bGQgYmUgZWFzaWx5IG1vZGlmaWVkIHRvIHN1cHBvcnQgQVQtTUlPMzJIUyBhbmQgQVQtTUlPOTYuCisgKgorICogVGhlIFBDSS02NTM0IHJlcXVpcmVzIGEgZmlybXdhcmUgdXBsb2FkIGFmdGVyIHBvd2VyLXVwIHRvIHdvcmssIHRoZQorICogZmlybXdhcmUgZGF0YSBhbmQgaW5zdHJ1Y3Rpb25zIGZvciBsb2FkaW5nIGl0IHdpdGggY29tZWRpX2NvbmZpZworICogaXQgYXJlIGNvbnRhaW5lZCBpbiB0aGUgY29tZWRpX25vbmZyZWVfZmlybXdhcmUgdGFyYmFsbCBhdmFpbGFibGUgZnJvbQorICogaHR0cDovL3d3dy5jb21lZGkub3JnCisgKi8KIAogI2RlZmluZSBVU0VfRE1BCiAKQEAgLTYxLDM2ICs2MCwzNiBAQAogCiAjZGVmaW5lIFdpbmRvd19BZGRyZXNzCQkJNAkvKiBXICovCiAjZGVmaW5lIEludGVycnVwdF9BbmRfV2luZG93X1N0YXR1cwk0CS8qIFIgKi8KLSNkZWZpbmUgSW50U3RhdHVzMQkJCQkoMTw8MCkKLSNkZWZpbmUgSW50U3RhdHVzMgkJCQkoMTw8MSkKKyNkZWZpbmUgSW50U3RhdHVzMQkJCQlCSVQoMCkKKyNkZWZpbmUgSW50U3RhdHVzMgkJCQlCSVQoMSkKICNkZWZpbmUgV2luZG93QWRkcmVzc1N0YXR1c19tYXNrCQkweDdjCiAKICNkZWZpbmUgTWFzdGVyX0RNQV9BbmRfSW50ZXJydXB0X0NvbnRyb2wgNQkvKiBXICovCiAjZGVmaW5lIEludGVycnVwdExpbmUoeCkJCQkoKHgpJjMpCi0jZGVmaW5lIE9wZW5JbnQJCQkJKDE8PDIpCisjZGVmaW5lIE9wZW5JbnQJCQkJQklUKDIpCiAjZGVmaW5lIEdyb3VwX1N0YXR1cwkJCTUJLyogUiAqLwotI2RlZmluZSBEYXRhTGVmdAkJCQkoMTw8MCkKLSNkZWZpbmUgUmVxCQkJCQkoMTw8MikKLSNkZWZpbmUgU3RvcFRyaWcJCQkJKDE8PDMpCisjZGVmaW5lIERhdGFMZWZ0CQkJCUJJVCgwKQorI2RlZmluZSBSZXEJCQkJCUJJVCgyKQorI2RlZmluZSBTdG9wVHJpZwkJCQlCSVQoMykKIAogI2RlZmluZSBHcm91cF8xX0ZsYWdzCQkJNgkvKiBSICovCiAjZGVmaW5lIEdyb3VwXzJfRmxhZ3MJCQk3CS8qIFIgKi8KLSNkZWZpbmUgVHJhbnNmZXJSZWFkeQkJCQkoMTw8MCkKLSNkZWZpbmUgQ291bnRFeHBpcmVkCQkJCSgxPDwxKQotI2RlZmluZSBXYWl0ZWQJCQkJKDE8PDUpCi0jZGVmaW5lIFByaW1hcnlUQwkJCQkoMTw8NikKLSNkZWZpbmUgU2Vjb25kYXJ5VEMJCQkJKDE8PDcpCisjZGVmaW5lIFRyYW5zZmVyUmVhZHkJCQkJQklUKDApCisjZGVmaW5lIENvdW50RXhwaXJlZAkJCQlCSVQoMSkKKyNkZWZpbmUgV2FpdGVkCQkJCQlCSVQoNSkKKyNkZWZpbmUgUHJpbWFyeVRDCQkJCUJJVCg2KQorI2RlZmluZSBTZWNvbmRhcnlUQwkJCQlCSVQoNykKICAgLyogI2RlZmluZSBTZXJpYWxSb3NlICovCiAgIC8qICNkZWZpbmUgUmVxUm9zZSAqLwogICAvKiAjZGVmaW5lIFBhdXNlZCAqLwogCiAjZGVmaW5lIEdyb3VwXzFfRmlyc3RfQ2xlYXIJCTYJLyogVyAqLwogI2RlZmluZSBHcm91cF8yX0ZpcnN0X0NsZWFyCQk3CS8qIFcgKi8KLSNkZWZpbmUgQ2xlYXJXYWl0ZWQJCQkJKDE8PDMpCi0jZGVmaW5lIENsZWFyUHJpbWFyeVRDCQkJKDE8PDQpCi0jZGVmaW5lIENsZWFyU2Vjb25kYXJ5VEMJCQkoMTw8NSkKLSNkZWZpbmUgRE1BUmVzZXQJCQkJKDE8PDYpCi0jZGVmaW5lIEZJRk9SZXNldAkJCQkoMTw8NykKKyNkZWZpbmUgQ2xlYXJXYWl0ZWQJCQkJQklUKDMpCisjZGVmaW5lIENsZWFyUHJpbWFyeVRDCQkJCUJJVCg0KQorI2RlZmluZSBDbGVhclNlY29uZGFyeVRDCQkJQklUKDUpCisjZGVmaW5lIERNQVJlc2V0CQkJCUJJVCg2KQorI2RlZmluZSBGSUZPUmVzZXQJCQkJQklUKDcpCiAjZGVmaW5lIENsZWFyQWxsCQkJCTB4ZjgKIAogI2RlZmluZSBHcm91cF8xX0ZJRk8JCQk4CS8qIFcgKi8KQEAgLTExMSwyNyArMTEwLDI3IEBACiAKICNkZWZpbmUgR3JvdXBfMV9TZWNvbmRfQ2xlYXIJCTQ2CS8qIFcgKi8KICNkZWZpbmUgR3JvdXBfMl9TZWNvbmRfQ2xlYXIJCTQ3CS8qIFcgKi8KLSNkZWZpbmUgQ2xlYXJFeHBpcmVkCQkJCSgxPDwwKQorI2RlZmluZSBDbGVhckV4cGlyZWQJCQkJQklUKDApCiAKICNkZWZpbmUgUG9ydF9QYXR0ZXJuKHgpCQkJKDQ4Kyh4KSkKIAogI2RlZmluZSBEYXRhX1BhdGgJCQk2NAotI2RlZmluZSBGSUZPRW5hYmxlQQkJKDE8PDApCi0jZGVmaW5lIEZJRk9FbmFibGVCCQkoMTw8MSkKLSNkZWZpbmUgRklGT0VuYWJsZUMJCSgxPDwyKQotI2RlZmluZSBGSUZPRW5hYmxlRAkJKDE8PDMpCisjZGVmaW5lIEZJRk9FbmFibGVBCQlCSVQoMCkKKyNkZWZpbmUgRklGT0VuYWJsZUIJCUJJVCgxKQorI2RlZmluZSBGSUZPRW5hYmxlQwkJQklUKDIpCisjZGVmaW5lIEZJRk9FbmFibGVECQlCSVQoMykKICNkZWZpbmUgRnVubmVsaW5nKHgpCQkoKCh4KSYzKTw8NCkKLSNkZWZpbmUgR3JvdXBEaXJlY3Rpb24JKDE8PDcpCisjZGVmaW5lIEdyb3VwRGlyZWN0aW9uCQlCSVQoNykKIAogI2RlZmluZSBQcm90b2NvbF9SZWdpc3Rlcl8xCQk2NQogI2RlZmluZSBPcE1vZGUJCQkJUHJvdG9jb2xfUmVnaXN0ZXJfMQogI2RlZmluZSBSdW5Nb2RlKHgpCQkoKHgpJjcpCi0jZGVmaW5lIE51bWJlcmVkCQkoMTw8MykKKyNkZWZpbmUgTnVtYmVyZWQJCUJJVCgzKQogCiAjZGVmaW5lIFByb3RvY29sX1JlZ2lzdGVyXzIJCTY2CiAjZGVmaW5lIENsb2NrUmVnCQkJUHJvdG9jb2xfUmVnaXN0ZXJfMgogI2RlZmluZSBDbG9ja0xpbmUoeCkJCSgoKHgpJjMpPDw1KQotI2RlZmluZSBJbnZlcnRTdG9wVHJpZwkoMTw8NykKKyNkZWZpbmUgSW52ZXJ0U3RvcFRyaWcJCUJJVCg3KQogI2RlZmluZSBEYXRhTGF0Y2hpbmcoeCkgICAgICAgKCgoeCkmMyk8PDUpCiAKICNkZWZpbmUgUHJvdG9jb2xfUmVnaXN0ZXJfMwkJNjcKQEAgLTE1MiwxNyArMTUxLDE3IEBACiAKICNkZWZpbmUgUHJvdG9jb2xfUmVnaXN0ZXJfNgkJNzMKICNkZWZpbmUgTGluZVBvbGFyaXRpZXMJCQlQcm90b2NvbF9SZWdpc3Rlcl82Ci0jZGVmaW5lIEludmVydEFjawkJKDE8PDApCi0jZGVmaW5lIEludmVydFJlcQkJKDE8PDEpCi0jZGVmaW5lIEludmVydENsb2NrCQkoMTw8MikKLSNkZWZpbmUgSW52ZXJ0U2VyaWFsCQkoMTw8MykKLSNkZWZpbmUgT3BlbkFjawkJKDE8PDQpCi0jZGVmaW5lIE9wZW5DbG9jawkJKDE8PDUpCisjZGVmaW5lIEludmVydEFjawkJQklUKDApCisjZGVmaW5lIEludmVydFJlcQkJQklUKDEpCisjZGVmaW5lIEludmVydENsb2NrCQlCSVQoMikKKyNkZWZpbmUgSW52ZXJ0U2VyaWFsCQlCSVQoMykKKyNkZWZpbmUgT3BlbkFjawkJQklUKDQpCisjZGVmaW5lIE9wZW5DbG9jawkJQklUKDUpCiAKICNkZWZpbmUgUHJvdG9jb2xfUmVnaXN0ZXJfNwkJNzQKICNkZWZpbmUgQWNrU2VyCQkJCVByb3RvY29sX1JlZ2lzdGVyXzcKICNkZWZpbmUgQWNrTGluZSh4KQkJKCgoeCkmMyk8PDIpCi0jZGVmaW5lIEV4Y2hhbmdlUGlucwkJKDE8PDcpCisjZGVmaW5lIEV4Y2hhbmdlUGlucwkJQklUKDcpCiAKICNkZWZpbmUgSW50ZXJydXB0X0NvbnRyb2wJCTc1CiAgIC8qIGJpdHMgc2FtZSBhcyBmbGFncyAqLwpAQCAtMTgzLDIwICsxODIsMjAgQEAKICNkZWZpbmUgVHJhbnNmZXJfU2l6ZV9Db250cm9sCQk3NwogI2RlZmluZSBUcmFuc2ZlcldpZHRoKHgpCSgoeCkmMykKICNkZWZpbmUgVHJhbnNmZXJMZW5ndGgoeCkJKCgoeCkmMyk8PDMpCi0jZGVmaW5lIFJlcXVpcmVSTGV2ZWwJCSgxPDw1KQorI2RlZmluZSBSZXF1aXJlUkxldmVsCQlCSVQoNSkKIAogI2RlZmluZSBQcm90b2NvbF9SZWdpc3Rlcl8xNQkJNzkKICNkZWZpbmUgREFRT3B0aW9ucwkJCVByb3RvY29sX1JlZ2lzdGVyXzE1CiAjZGVmaW5lIFN0YXJ0U291cmNlKHgpCQkJKCh4KSYweDMpCi0jZGVmaW5lIEludmVydFN0YXJ0CQkJCSgxPDwyKQorI2RlZmluZSBJbnZlcnRTdGFydAkJCQlCSVQoMikKICNkZWZpbmUgU3RvcFNvdXJjZSh4KQkJCQkoKCh4KSYweDMpPDwzKQotI2RlZmluZSBSZXFTdGFydAkJCQkoMTw8NikKLSNkZWZpbmUgUHJlU3RhcnQJCQkJKDE8PDcpCisjZGVmaW5lIFJlcVN0YXJ0CQkJCUJJVCg2KQorI2RlZmluZSBQcmVTdGFydAkJCQlCSVQoNykKIAogI2RlZmluZSBQYXR0ZXJuX0RldGVjdGlvbgkJODEKLSNkZWZpbmUgRGV0ZWN0aW9uTWV0aG9kCQkJKDE8PDApCi0jZGVmaW5lIEludmVydE1hdGNoCQkJCSgxPDwxKQotI2RlZmluZSBJRV9QYXR0ZXJuX0RldGVjdGlvbgkJCSgxPDwyKQorI2RlZmluZSBEZXRlY3Rpb25NZXRob2QJCQlCSVQoMCkKKyNkZWZpbmUgSW52ZXJ0TWF0Y2gJCQkJQklUKDEpCisjZGVmaW5lIElFX1BhdHRlcm5fRGV0ZWN0aW9uCQkJQklUKDIpCiAKICNkZWZpbmUgUHJvdG9jb2xfUmVnaXN0ZXJfOQkJODIKICNkZWZpbmUgUmVxRGVsYXkJCQlQcm90b2NvbF9SZWdpc3Rlcl85CkBAIC02NDksOCArNjQ4LDEwIEBACiAJCXdyaXRlYigxLCBkZXYtPm1taW8gKyBBY2tEZWxheSk7CiAJCXdyaXRlYigweDBiLCBkZXYtPm1taW8gKyBBY2tOb3REZWxheSk7CiAJCXdyaXRlYigweDAxLCBkZXYtPm1taW8gKyBEYXRhMURlbGF5KTsKLQkJLyogbWFudWFsLCBwYWdlIDQtNTogQ2xvY2tTcGVlZCBjb21tZW50IGlzIGluY29ycmVjdGx5IGxpc3RlZAotCQkgKiBvbiBEQVFPcHRpb25zICovCisJCS8qCisJCSAqIG1hbnVhbCwgcGFnZSA0LTU6CisJCSAqIENsb2NrU3BlZWQgY29tbWVudCBpcyBpbmNvcnJlY3RseSBsaXN0ZWQgb24gREFRT3B0aW9ucworCQkgKi8KIAkJd3JpdGV3KDAsIGRldi0+bW1pbyArIENsb2NrU3BlZWQpOwogCQl3cml0ZWIoMCwgZGV2LT5tbWlvICsgREFRT3B0aW9ucyk7CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9wY2ltaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9wY2ltaW8uYwppbmRleCBkODkxNzM5Li5mMTNhMmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpbWlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaW1pby5jCkBAIC0xLDExMSArMSwxMDYgQEAKIC8qCi0gICAgY29tZWRpL2RyaXZlcnMvbmlfcGNpbWlvLmMKLSAgICBIYXJkd2FyZSBkcml2ZXIgZm9yIE5JIFBDSS1NSU8gRSBzZXJpZXMgY2FyZHMKKyAqIENvbWVkaSBkcml2ZXIgZm9yIE5JIFBDSS1NSU8gRSBzZXJpZXMgY2FyZHMKKyAqCisgKiBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTctOCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KIAotICAgIENPTUVESSAtIExpbnV4IENvbnRyb2wgYW5kIE1lYXN1cmVtZW50IERldmljZSBJbnRlcmZhY2UKLSAgICBDb3B5cmlnaHQgKEMpIDE5OTctOCBEYXZpZCBBLiBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotKi8KIC8qCi1Ecml2ZXI6IG5pX3BjaW1pbwotRGVzY3JpcHRpb246IE5hdGlvbmFsIEluc3RydW1lbnRzIFBDSS1NSU8tRSBzZXJpZXMgYW5kIE0gc2VyaWVzIChhbGwgYm9hcmRzKQotQXV0aG9yOiBkcywgSm9obiBIYWxsZW4sIEZyYW5rIE1vcmkgSGVzcywgUm9sZiBNdWVsbGVyLCBIZXJiZXJ0IFBlcmVtYW5zLAotICBIZXJtYW4gQnJ1eW5pbmNreCwgVGVycnkgQmFybmFieQotU3RhdHVzOiB3b3JrcwotRGV2aWNlczogW05hdGlvbmFsIEluc3RydW1lbnRzXSBQQ0ktTUlPLTE2WEUtNTAgKG5pX3BjaW1pbyksCi0gIFBDSS1NSU8tMTZYRS0xMCwgUFhJLTYwMzBFLCBQQ0ktTUlPLTE2RS0xLCBQQ0ktTUlPLTE2RS00LCBQQ0ktNjAxNCwgUENJLTYwNDBFLAotICBQWEktNjA0MEUsIFBDSS02MDMwRSwgUENJLTYwMzFFLCBQQ0ktNjAzMkUsIFBDSS02MDMzRSwgUENJLTYwNzFFLCBQQ0ktNjAyM0UsCi0gIFBDSS02MDI0RSwgUENJLTYwMjVFLCBQWEktNjAyNUUsIFBDSS02MDM0RSwgUENJLTYwMzVFLCBQQ0ktNjA1MkUsCi0gIFBDSS02MTEwLCBQQ0ktNjExMSwgUENJLTYyMjAsIFBDSS02MjIxLCBQQ0ktNjIyNCwgUFhJLTYyMjQsCi0gIFBDSS02MjI1LCBQWEktNjIyNSwgUENJLTYyMjksIFBDSS02MjUwLAotICBQQ0ktNjI1MSwgUFhJLTYyNTEsIFBDSWUtNjI1MSwgUFhJZS02MjUxLAotICBQQ0ktNjI1NCwgUENJLTYyNTksIFBDSWUtNjI1OSwKLSAgUENJLTYyODAsIFBDSS02MjgxLCBQWEktNjI4MSwgUENJLTYyODQsIFBDSS02Mjg5LAotICBQQ0ktNjcxMSwgUFhJLTY3MTEsIFBDSS02NzEzLCBQWEktNjcxMywKLSAgUFhJLTYwNzFFLCBQQ0ktNjA3MEUsIFBYSS02MDcwRSwKLSAgUFhJLTYwNTJFLCBQQ0ktNjAzNkUsIFBDSS02NzMxLCBQQ0ktNjczMywgUFhJLTY3MzMsCi0gIFBDSS02MTQzLCBQWEktNjE0MwotVXBkYXRlZDogTW9uLCAwOSBKYW4gMjAxMiAxNDo1Mjo0OCArMDAwMAorICogRHJpdmVyOiBuaV9wY2ltaW8KKyAqIERlc2NyaXB0aW9uOiBOYXRpb25hbCBJbnN0cnVtZW50cyBQQ0ktTUlPLUUgc2VyaWVzIGFuZCBNIHNlcmllcyAoYWxsIGJvYXJkcykKKyAqIEF1dGhvcjogZHMsIEpvaG4gSGFsbGVuLCBGcmFuayBNb3JpIEhlc3MsIFJvbGYgTXVlbGxlciwgSGVyYmVydCBQZXJlbWFucywKKyAqICAgSGVybWFuIEJydXluaW5ja3gsIFRlcnJ5IEJhcm5hYnkKKyAqIFN0YXR1czogd29ya3MKKyAqIERldmljZXM6IFtOYXRpb25hbCBJbnN0cnVtZW50c10gUENJLU1JTy0xNlhFLTUwIChuaV9wY2ltaW8pLAorICogICBQQ0ktTUlPLTE2WEUtMTAsIFBYSS02MDMwRSwgUENJLU1JTy0xNkUtMSwgUENJLU1JTy0xNkUtNCwgUENJLTYwMTQsCisgKiAgIFBDSS02MDQwRSwgUFhJLTYwNDBFLCBQQ0ktNjAzMEUsIFBDSS02MDMxRSwgUENJLTYwMzJFLCBQQ0ktNjAzM0UsCisgKiAgIFBDSS02MDcxRSwgUENJLTYwMjNFLCBQQ0ktNjAyNEUsIFBDSS02MDI1RSwgUFhJLTYwMjVFLCBQQ0ktNjAzNEUsCisgKiAgIFBDSS02MDM1RSwgUENJLTYwNTJFLAorICogICBQQ0ktNjExMCwgUENJLTYxMTEsIFBDSS02MjIwLCBQQ0ktNjIyMSwgUENJLTYyMjQsIFBYSS02MjI0LAorICogICBQQ0ktNjIyNSwgUFhJLTYyMjUsIFBDSS02MjI5LCBQQ0ktNjI1MCwKKyAqICAgUENJLTYyNTEsIFBYSS02MjUxLCBQQ0llLTYyNTEsIFBYSWUtNjI1MSwKKyAqICAgUENJLTYyNTQsIFBDSS02MjU5LCBQQ0llLTYyNTksCisgKiAgIFBDSS02MjgwLCBQQ0ktNjI4MSwgUFhJLTYyODEsIFBDSS02Mjg0LCBQQ0ktNjI4OSwKKyAqICAgUENJLTY3MTEsIFBYSS02NzExLCBQQ0ktNjcxMywgUFhJLTY3MTMsCisgKiAgIFBYSS02MDcxRSwgUENJLTYwNzBFLCBQWEktNjA3MEUsCisgKiAgIFBYSS02MDUyRSwgUENJLTYwMzZFLCBQQ0ktNjczMSwgUENJLTY3MzMsIFBYSS02NzMzLAorICogICBQQ0ktNjE0MywgUFhJLTYxNDMKKyAqIFVwZGF0ZWQ6IE1vbiwgMDkgSmFuIDIwMTIgMTQ6NTI6NDggKzAwMDAKKyAqCisgKiBUaGVzZSBib2FyZHMgYXJlIGFsbW9zdCBpZGVudGljYWwgdG8gdGhlIEFULU1JTyBFIHNlcmllcywgZXhjZXB0IHRoYXQKKyAqIHRoZXkgdXNlIHRoZSBQQ0kgYnVzIGluc3RlYWQgb2YgSVNBIChpLmUuLCBBVCkuIFNlZSB0aGUgbm90ZXMgZm9yIHRoZQorICogbmlfYXRtaW8ubyBkcml2ZXIgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlc2UgYm9hcmRzLgorICoKKyAqIEF1dG9jYWxpYnJhdGlvbiBpcyBzdXBwb3J0ZWQgb24gbWFueSBvZiB0aGUgZGV2aWNlcywgdXNpbmcgdGhlCisgKiBjb21lZGlfY2FsaWJyYXRlIChvciBjb21lZGlfc29mdF9jYWxpYnJhdGUgZm9yIG0tc2VyaWVzKSB1dGlsaXR5LgorICogTS1TZXJpZXMgYm9hcmRzIGRvIGFuYWxvZyBpbnB1dCBhbmQgYW5hbG9nIG91dHB1dCBjYWxpYnJhdGlvbiBlbnRpcmVseQorICogaW4gc29mdHdhcmUuIFRoZSBzb2Z0d2FyZSBjYWxpYnJhdGlvbiBjb3JyZWN0cyB0aGUgYW5hbG9nIGlucHV0IGZvcgorICogb2Zmc2V0LCBnYWluIGFuZCBub25saW5lYXJpdHkuIFRoZSBhbmFsb2cgb3V0cHV0cyBhcmUgY29ycmVjdGVkIGZvcgorICogb2Zmc2V0IGFuZCBnYWluLiBTZWUgdGhlIGNvbWVkaWxpYiBkb2N1bWVudGF0aW9uIG9uCisgKiBjb21lZGlfZ2V0X3NvZnRjYWxfY29udmVydGVyKCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKgorICogQnkgZGVmYXVsdCwgdGhlIGRyaXZlciB1c2VzIERNQSB0byB0cmFuc2ZlciBhbmFsb2cgaW5wdXQgZGF0YSB0bworICogbWVtb3J5LiAgV2hlbiBETUEgaXMgZW5hYmxlZCwgbm90IGFsbCB0cmlnZ2VyaW5nIGZlYXR1cmVzIGFyZQorICogc3VwcG9ydGVkLgorICoKKyAqIERpZ2l0YWwgSS9PIG1heSBub3Qgd29yayBvbiA2NzN4LgorICoKKyAqIE5vdGUgdGhhdCB0aGUgUENJLTYxNDMgaXMgYSBzaW11bHRhaW5lb3VzIHNhbXBsaW5nIGRldmljZSB3aXRoIDgKKyAqIGNvbnZlcnRvcnMuIFdpdGggdGhpcyBib2FyZCBhbGwgb2YgdGhlIGNvbnZlcnRvcnMgcGVyZm9ybSBvbmUKKyAqIHNpbXVsdGFpbmVvdXMgc2FtcGxlIGR1cmluZyBhIHNjYW4gaW50ZXJ2YWwuIFRoZSBwZXJpb2QgZm9yIGEgc2NhbgorICogaXMgdXNlZCBmb3IgdGhlIGNvbnZlcnQgdGltZSBpbiBhIENvbWVkaSBjbWQuIFRoZSBjb252ZXJ0IHRyaWdnZXIKKyAqIHNvdXJjZSBpcyBub3JtYWxseSBzZXQgdG8gVFJJR19OT1cgYnkgZGVmYXVsdC4KKyAqCisgKiBUaGUgUlRTSSB0cmlnZ2VyIGJ1cyBpcyBzdXBwb3J0ZWQgb24gdGhlc2UgY2FyZHMgb24gc3ViZGV2aWNlIDEwLgorICogU2VlIHRoZSBjb21lZGlsaWIgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4KKyAqCisgKiBJbmZvcm1hdGlvbiAobnVtYmVyIG9mIGNoYW5uZWxzLCBiaXRzLCBldGMuKSBmb3Igc29tZSBkZXZpY2VzIG1heSBiZQorICogaW5jb3JyZWN0LiBQbGVhc2UgY2hlY2sgdGhpcyBhbmQgc3VibWl0IGEgYnVnIGlmIHRoZXJlIGFyZSBwcm9ibGVtcworICogZm9yIHlvdXIgZGV2aWNlLgorICoKKyAqIFNDWEkgaXMgcHJvYmFibHkgYnJva2VuIGZvciBtLXNlcmllcyBib2FyZHMuCisgKgorICogQnVnczoKKyAqIC0gV2hlbiBETUEgaXMgZW5hYmxlZCwgQ09NRURJX0VWX0NPTlZFUlQgZG9lcyBub3Qgd29yayBjb3JyZWN0bHkuCisgKi8KIAotVGhlc2UgYm9hcmRzIGFyZSBhbG1vc3QgaWRlbnRpY2FsIHRvIHRoZSBBVC1NSU8gRSBzZXJpZXMsIGV4Y2VwdCB0aGF0Ci10aGV5IHVzZSB0aGUgUENJIGJ1cyBpbnN0ZWFkIG9mIElTQSAoaS5lLiwgQVQpLiAgU2VlIHRoZSBub3RlcyBmb3IKLXRoZSBuaV9hdG1pby5vIGRyaXZlciBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGVzZSBib2FyZHMuCi0KLUF1dG9jYWxpYnJhdGlvbiBpcyBzdXBwb3J0ZWQgb24gbWFueSBvZiB0aGUgZGV2aWNlcywgdXNpbmcgdGhlCi1jb21lZGlfY2FsaWJyYXRlIChvciBjb21lZGlfc29mdF9jYWxpYnJhdGUgZm9yIG0tc2VyaWVzKSB1dGlsaXR5LgotTS1TZXJpZXMgYm9hcmRzIGRvIGFuYWxvZyBpbnB1dCBhbmQgYW5hbG9nIG91dHB1dCBjYWxpYnJhdGlvbiBlbnRpcmVseQotaW4gc29mdHdhcmUuIFRoZSBzb2Z0d2FyZSBjYWxpYnJhdGlvbiBjb3JyZWN0cwotdGhlIGFuYWxvZyBpbnB1dCBmb3Igb2Zmc2V0LCBnYWluIGFuZAotbm9ubGluZWFyaXR5LiAgVGhlIGFuYWxvZyBvdXRwdXRzIGFyZSBjb3JyZWN0ZWQgZm9yIG9mZnNldCBhbmQgZ2Fpbi4KLVNlZSB0aGUgY29tZWRpbGliIGRvY3VtZW50YXRpb24gb24gY29tZWRpX2dldF9zb2Z0Y2FsX2NvbnZlcnRlcigpIGZvcgotbW9yZSBpbmZvcm1hdGlvbi4KLQotQnkgZGVmYXVsdCwgdGhlIGRyaXZlciB1c2VzIERNQSB0byB0cmFuc2ZlciBhbmFsb2cgaW5wdXQgZGF0YSB0bwotbWVtb3J5LiAgV2hlbiBETUEgaXMgZW5hYmxlZCwgbm90IGFsbCB0cmlnZ2VyaW5nIGZlYXR1cmVzIGFyZQotc3VwcG9ydGVkLgotCi1EaWdpdGFsIEkvTyBtYXkgbm90IHdvcmsgb24gNjczeC4KLQotTm90ZSB0aGF0IHRoZSBQQ0ktNjE0MyBpcyBhIHNpbXVsdGFpbmVvdXMgc2FtcGxpbmcgZGV2aWNlIHdpdGggOCBjb252ZXJ0b3JzLgotV2l0aCB0aGlzIGJvYXJkIGFsbCBvZiB0aGUgY29udmVydG9ycyBwZXJmb3JtIG9uZSBzaW11bHRhaW5lb3VzIHNhbXBsZSBkdXJpbmcKLWEgc2NhbiBpbnRlcnZhbC4gVGhlIHBlcmlvZCBmb3IgYSBzY2FuIGlzIHVzZWQgZm9yIHRoZSBjb252ZXJ0IHRpbWUgaW4gYQotQ29tZWRpIGNtZC4gVGhlIGNvbnZlcnQgdHJpZ2dlciBzb3VyY2UgaXMgbm9ybWFsbHkgc2V0IHRvIFRSSUdfTk9XIGJ5IGRlZmF1bHQuCi0KLVRoZSBSVFNJIHRyaWdnZXIgYnVzIGlzIHN1cHBvcnRlZCBvbiB0aGVzZSBjYXJkcyBvbgotc3ViZGV2aWNlIDEwLiBTZWUgdGhlIGNvbWVkaWxpYiBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgotCi1JbmZvcm1hdGlvbiAobnVtYmVyIG9mIGNoYW5uZWxzLCBiaXRzLCBldGMuKSBmb3Igc29tZSBkZXZpY2VzIG1heSBiZQotaW5jb3JyZWN0LiAgUGxlYXNlIGNoZWNrIHRoaXMgYW5kIHN1Ym1pdCBhIGJ1ZyBpZiB0aGVyZSBhcmUgcHJvYmxlbXMKLWZvciB5b3VyIGRldmljZS4KLQotU0NYSSBpcyBwcm9iYWJseSBicm9rZW4gZm9yIG0tc2VyaWVzIGJvYXJkcy4KLQotQnVnczoKLSAtIFdoZW4gRE1BIGlzIGVuYWJsZWQsIENPTUVESV9FVl9DT05WRVJUIGRvZXMKLSAgIG5vdCB3b3JrIGNvcnJlY3RseS4KLQotKi8KIC8qCi0JVGhlIFBDSS1NSU8gRSBzZXJpZXMgZHJpdmVyIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkKLQlUb21hc3ogTW90eWxld3NraSA8Li4uPiwgYW5kIHBvcnRlZCB0byBjb21lZGkgYnkgZHMuCi0KLQlSZWZlcmVuY2VzOgotCi0JICAgMzQxMDc5Yi5wZGYgIFBDSSBFIFNlcmllcyBSZWdpc3Rlci1MZXZlbCBQcm9ncmFtbWVyIE1hbnVhbAotCSAgIDM0MDkzNGIucGRmICBEQVEtU1RDIHJlZmVyZW5jZSBtYW51YWwKLQotCSAgIDMyMjA4MGIucGRmICA2NzExLzY3MTMvNjcxNSBVc2VyIE1hbnVhbAotCi0JICAgMzIwOTQ1Yy5wZGYgIFBDSSBFIFNlcmllcyBVc2VyIE1hbnVhbAotCSAgIDMyMjEzOGEucGRmICBQQ0ktNjA1MkUgYW5kIERBUVBhZC02MDUyRSBVc2VyIE1hbnVhbAotCi0JSVNTVUVTOgotCi0JbmVlZCB0byBkZWFsIHdpdGggZXh0ZXJuYWwgcmVmZXJlbmNlIGZvciBEQUMsIGFuZCBvdGhlciBEQUMKLQlwcm9wZXJ0aWVzIGluIGJvYXJkIHByb3BlcnRpZXMKLQotCWRlYWwgd2l0aCBhdC1taW8tMTZkZS0xMCByZXZpc2lvbiBEIHRvIE4gY2hhbmdlcywgZXRjLgotCi0JbmVlZCB0byBhZGQgb3RoZXIgQ0FMREFDIHR5cGUKLQotCW5lZWQgdG8gc2xvdyBkb3duIERBQyBsb2FkaW5nLiAgSSBkb24ndCB0cnVzdCBOSSdzIGNsYWltIHRoYXQKLQl0d28gd3JpdGVzIHRvIHRoZSBQQ0kgYnVzIHNsb3dzIElPIGVub3VnaC4gIEkgd291bGQgcHJlZmVyIHRvCi0JdXNlIHVkZWxheSgpLiAgVGltaW5nIHNwZWNzOiAoY2xvY2spCi0JCUFEODUyMgkJMzBucwotCQlEQUM4MDQzCQkxMjBucwotCQlEQUM4ODAwCQk2MG5zCi0JCU1CODgzNDEJCT8KLQotKi8KKyAqIFRoZSBQQ0ktTUlPIEUgc2VyaWVzIGRyaXZlciB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5CisgKiBUb21hc3ogTW90eWxld3NraSA8Li4uPiwgYW5kIHBvcnRlZCB0byBjb21lZGkgYnkgZHMuCisgKgorICogUmVmZXJlbmNlczoKKyAqCTM0MTA3OWIucGRmICBQQ0kgRSBTZXJpZXMgUmVnaXN0ZXItTGV2ZWwgUHJvZ3JhbW1lciBNYW51YWwKKyAqCTM0MDkzNGIucGRmICBEQVEtU1RDIHJlZmVyZW5jZSBtYW51YWwKKyAqCisgKgkzMjIwODBiLnBkZiAgNjcxMS82NzEzLzY3MTUgVXNlciBNYW51YWwKKyAqCisgKgkzMjA5NDVjLnBkZiAgUENJIEUgU2VyaWVzIFVzZXIgTWFudWFsCisgKgkzMjIxMzhhLnBkZiAgUENJLTYwNTJFIGFuZCBEQVFQYWQtNjA1MkUgVXNlciBNYW51YWwKKyAqCisgKiBJU1NVRVM6CisgKiAtIG5lZWQgdG8gZGVhbCB3aXRoIGV4dGVybmFsIHJlZmVyZW5jZSBmb3IgREFDLCBhbmQgb3RoZXIgREFDCisgKiAgIHByb3BlcnRpZXMgaW4gYm9hcmQgcHJvcGVydGllcworICogLSBkZWFsIHdpdGggYXQtbWlvLTE2ZGUtMTAgcmV2aXNpb24gRCB0byBOIGNoYW5nZXMsIGV0Yy4KKyAqIC0gbmVlZCB0byBhZGQgb3RoZXIgQ0FMREFDIHR5cGUKKyAqIC0gbmVlZCB0byBzbG93IGRvd24gREFDIGxvYWRpbmcuIEkgZG9uJ3QgdHJ1c3QgTkkncyBjbGFpbSB0aGF0CisgKiAgIHR3byB3cml0ZXMgdG8gdGhlIFBDSSBidXMgc2xvd3MgSU8gZW5vdWdoLiBJIHdvdWxkIHByZWZlciB0bworICogICB1c2UgdWRlbGF5KCkuCisgKiAgIFRpbWluZyBzcGVjczogKGNsb2NrKQorICoJQUQ4NTIyCQkzMG5zCisgKglEQUM4MDQzCQkxMjBucworICoJREFDODgwMAkJNjBucworICoJTUI4ODM0MQkJPworICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtMTE5LDEzICsxMTQsMTQgQEAKIAogI2RlZmluZSBQQ0lETUEKIAotLyogVGhlc2UgYXJlIG5vdCBhbGwgdGhlIHBvc3NpYmxlIGFvIHJhbmdlcyBmb3IgNjI4eCBib2FyZHMuCi0gVGhleSBjYW4gZG8gT0ZGU0VUICstIFJFRkVSRU5DRSB3aGVyZSBPRkZTRVQgY2FuIGJlCi0gMFYsIDVWLCBBUEZJPDAsMT4sIG9yIEFPPDAuLi4zPiBhbmQgUkFOR0UgY2FuCi0gYmUgMTBWLCA1ViwgMlYsIDFWLCBBUEZJPDAsMT4sIEFPPDAuLi4zPi4gIFRoYXQncwotIDYzIGRpZmZlcmVudCBwb3NzaWJpbGl0aWVzLiAgQW4gQU8gY2hhbm5lbAotIGNhbiBub3QgYWN0IGFzIGl0J3Mgb3duIE9GRlNFVCBvciBSRUZFUkVOQ0UuCi0qLworLyoKKyAqIFRoZXNlIGFyZSBub3QgYWxsIHRoZSBwb3NzaWJsZSBhbyByYW5nZXMgZm9yIDYyOHggYm9hcmRzLgorICogVGhleSBjYW4gZG8gT0ZGU0VUICstIFJFRkVSRU5DRSB3aGVyZSBPRkZTRVQgY2FuIGJlCisgKiAwViwgNVYsIEFQRkk8MCwxPiwgb3IgQU88MC4uLjM+IGFuZCBSQU5HRSBjYW4KKyAqIGJlIDEwViwgNVYsIDJWLCAxViwgQVBGSTwwLDE+LCBBTzwwLi4uMz4uICBUaGF0J3MKKyAqIDYzIGRpZmZlcmVudCBwb3NzaWJpbGl0aWVzLiAgQW4gQU8gY2hhbm5lbAorICogY2FuIG5vdCBhY3QgYXMgaXQncyBvd24gT0ZGU0VUIG9yIFJFRkVSRU5DRS4KKyAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIHJhbmdlX25pX01fNjI4eF9hbyA9IHsKIAk4LCB7CiAJCUJJUF9SQU5HRSgxMCksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfdXNiNjUwMS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3VzYjY1MDEuYwppbmRleCA5NWI1MzdhLi41MDM2ZWViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfdXNiNjUwMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV91c2I2NTAxLmMKQEAgLTQ2NSwxMiArNDY1LDEyIEBACiAJc3RydWN0IG5pNjUwMV9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXNpemVfdCBzaXplOwogCi0Jc2l6ZSA9IGxlMTZfdG9fY3B1KGRldnByaXYtPmVwX3J4LT53TWF4UGFja2V0U2l6ZSk7CisJc2l6ZSA9IHVzYl9lbmRwb2ludF9tYXhwKGRldnByaXYtPmVwX3J4KTsKIAlkZXZwcml2LT51c2JfcnhfYnVmID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldnByaXYtPnVzYl9yeF9idWYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jc2l6ZSA9IGxlMTZfdG9fY3B1KGRldnByaXYtPmVwX3R4LT53TWF4UGFja2V0U2l6ZSk7CisJc2l6ZSA9IHVzYl9lbmRwb2ludF9tYXhwKGRldnByaXYtPmVwX3R4KTsKIAlkZXZwcml2LT51c2JfdHhfYnVmID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldnByaXYtPnVzYl90eF9idWYpIHsKIAkJa2ZyZWUoZGV2cHJpdi0+dXNiX3J4X2J1Zik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGx4OTA4MC5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BseDkwODAuaAppbmRleCAwZTIwY2M1Li5lMjNlNjNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGx4OTA4MC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wbHg5MDgwLmgKQEAgLTYwLDkgKzYwLDkgQEAKICNkZWZpbmUgUExYX1JFR19MQVMxUlIJCTB4MDBmMAogCiAjZGVmaW5lIFBMWF9MQVNSUl9JTwkJQklUKDApCQkvKiBNYXAgdG86IDE9SS9PLCAwPU1lbSAqLwotI2RlZmluZSBQTFhfTEFTUlJfQU5ZMzIJCShCSVQoMSkgKiAwKQkvKiBMb2NhdGUgYW55d2hlcmUgaW4gMzIgYml0ICovCi0jZGVmaW5lIFBMWF9MQVNSUl9MVDFNQgkJKEJJVCgxKSAqIDEpCS8qIExvY2F0ZSBpbiAxc3QgbWVnICovCi0jZGVmaW5lIFBMWF9MQVNSUl9BTlk2NAkJKEJJVCgxKSAqIDIpCS8qIExvY2F0ZSBhbnl3aGVyZSBpbiA2NCBiaXQgKi8KKyNkZWZpbmUgUExYX0xBU1JSX01MT0NfQU5ZMzIJKEJJVCgxKSAqIDApCS8qIExvY2F0ZSBhbnl3aGVyZSBpbiAzMiBiaXQgKi8KKyNkZWZpbmUgUExYX0xBU1JSX01MT0NfTFQxTUIJKEJJVCgxKSAqIDEpCS8qIExvY2F0ZSBpbiAxc3QgbWVnICovCisjZGVmaW5lIFBMWF9MQVNSUl9NTE9DX0FOWTY0CShCSVQoMSkgKiAyKQkvKiBMb2NhdGUgYW55d2hlcmUgaW4gNjQgYml0ICovCiAjZGVmaW5lIFBMWF9MQVNSUl9NTE9DX01BU0sJR0VOTUFTSygyLCAxKQkvKiBNZW1vcnkgbG9jYXRpb24gYml0cyAqLwogI2RlZmluZSBQTFhfTEFTUlJfUFJFRkVUQ0gJQklUKDMpCQkvKiBNZW1vcnkgaXMgcHJlZmV0Y2hhYmxlICovCiAvKiBiaXRzIHRoYXQgc3BlY2lmeSByYW5nZSBmb3IgbWVtb3J5IHNwYWNlIGRlY29kZSBiaXRzICovCkBAIC04OSwxMSArODksMTEgQEAKIC8qIExvY2FsIEJ1cyBMYXRlbmN5IFRpbWVyICovCiAjZGVmaW5lIFBMWF9NQVJCUl9MVCh4KQkJKEJJVCgwKSAqICgoeCkgJiAweGZmKSkKICNkZWZpbmUgUExYX01BUkJSX0xUX01BU0sJR0VOTUFTSyg3LCAwKQotI2RlZmluZSBQTFhfTUFSQlJfTFRfU0hJRlQJMAorI2RlZmluZSBQTFhfTUFSQlJfVE9fTFQocikJKChyKSAmIFBMWF9NQVJCUl9MVF9NQVNLKQogLyogTG9jYWwgQnVzIFBhdXNlIFRpbWVyICovCiAjZGVmaW5lIFBMWF9NQVJCUl9QVCh4KQkJKEJJVCg4KSAqICgoeCkgJiAweGZmKSkKICNkZWZpbmUgUExYX01BUkJSX1BUX01BU0sJR0VOTUFTSygxNSwgOCkKLSNkZWZpbmUgUExYX01BUkJSX1BUX1NISUZUCTgKKyNkZWZpbmUgUExYX01BUkJSX1RPX1BUKHIpCSgoKHIpICYgUExYX01BUkJSX1BUX01BU0spID4+IDgpCiAvKiBMb2NhbCBCdXMgTGF0ZW5jeSBUaW1lciBFbmFibGUgKi8KICNkZWZpbmUgUExYX01BUkJSX0xURU4JCUJJVCgxNikKIC8qIExvY2FsIEJ1cyBQYXVzZSBUaW1lciBFbmFibGUgKi8KQEAgLTE2NiwxNiArMTY2LDE1IEBACiAjZGVmaW5lIFBMWF9SRUdfTEJSRDEJCTB4MDBmOAogCiAvKiBNZW1vcnkgU3BhY2UgTG9jYWwgQnVzIFdpZHRoICovCi0jZGVmaW5lIFBMWF9MQlJEX01TV0lEVEg4CShCSVQoMCkgKiAwKQkvKiA4IGJpdHMgd2lkZSAqLwotI2RlZmluZSBQTFhfTEJSRF9NU1dJRFRIMTYJKEJJVCgwKSAqIDEpCS8qIDE2IGJpdHMgd2lkZSAqLwotI2RlZmluZSBQTFhfTEJSRF9NU1dJRFRIMzIJKEJJVCgwKSAqIDIpCS8qIDMyIGJpdHMgd2lkZSAqLwotI2RlZmluZSBQTFhfTEJSRF9NU1dJRFRIMzJBCShCSVQoMCkgKiAzKQkvKiAzMiBiaXRzIHdpZGUgKi8KKyNkZWZpbmUgUExYX0xCUkRfTVNXSURUSF84CShCSVQoMCkgKiAwKQkvKiA4IGJpdHMgd2lkZSAqLworI2RlZmluZSBQTFhfTEJSRF9NU1dJRFRIXzE2CShCSVQoMCkgKiAxKQkvKiAxNiBiaXRzIHdpZGUgKi8KKyNkZWZpbmUgUExYX0xCUkRfTVNXSURUSF8zMgkoQklUKDApICogMikJLyogMzIgYml0cyB3aWRlICovCisjZGVmaW5lIFBMWF9MQlJEX01TV0lEVEhfMzJBCShCSVQoMCkgKiAzKQkvKiAzMiBiaXRzIHdpZGUgKi8KICNkZWZpbmUgUExYX0xCUkRfTVNXSURUSF9NQVNLCUdFTk1BU0soMSwgMCkKLSNkZWZpbmUgUExYX0xCUkRfTVNXSURUSF9TSElGVAkwCiAvKiBNZW1vcnkgU3BhY2UgSW50ZXJuYWwgV2FpdCBTdGF0ZXMgKi8KICNkZWZpbmUgUExYX0xCUkRfTVNJV1MoeCkJKEJJVCgyKSAqICgoeCkgJiAweGYpKQogI2RlZmluZSBQTFhfTEJSRF9NU0lXU19NQVNLCUdFTk1BU0soNSwgMikKLSNkZWZpbmUgUExYX0xCUkRfTVNJV1NfU0hJRlQJMgorI2RlZmluZSBQTFhfTEJSRF9UT19NU0lXUyhyKQkoKChyKSAmIFBMU19MQlJEX01TSVdTX01BU0spID4+IDIpCiAvKiBNZW1vcnkgU3BhY2UgUmVhZHkgSW5wdXQgRW5hYmxlICovCiAjZGVmaW5lIFBMWF9MQlJEX01TUkVBRFlJRU4JQklUKDYpCiAvKiBNZW1vcnkgU3BhY2UgQlRFUk0jIElucHV0IEVuYWJsZSAqLwpAQCAtMTkzLDE4ICsxOTIsMTcgQEAKIC8qIFByZWZldGNoIENvdW50ZXIgKi8KICNkZWZpbmUgUExYX0xCUkRfUEZDT1VOVCh4KQkoQklUKDExKSAqICgoeCkgJiAweGYpKQogI2RlZmluZSBQTFhfTEJSRF9QRkNPVU5UX01BU0sJR0VOTUFTSygxNCwgMTEpCi0jZGVmaW5lIFBMWF9MQlJEX1BGQ09VTlRfU0hJRlQJMTEKKyNkZWZpbmUgUExYX0xCUkRfVE9fUEZDT1VOVChyKQkoKChyKSAmIFBMWF9MQlJEX1BGQ09VTlRfTUFTSykgPj4gMTEpCiAvKiBFeHBhbnNpb24gUk9NIFNwYWNlIExvY2FsIEJ1cyBXaWR0aCAoTEJSRDAgb25seSkgKi8KLSNkZWZpbmUgUExYX0xCUkQwX0VST01XSURUSDgJKEJJVCgxNikgKiAwKQkvKiA4IGJpdHMgd2lkZSAqLwotI2RlZmluZSBQTFhfTEJSRDBfRVJPTVdJRFRIMTYJKEJJVCgxNikgKiAxKQkvKiAxNiBiaXRzIHdpZGUgKi8KLSNkZWZpbmUgUExYX0xCUkQwX0VST01XSURUSDMyCShCSVQoMTYpICogMikJLyogMzIgYml0cyB3aWRlICovCi0jZGVmaW5lIFBMWF9MQlJEMF9FUk9NV0lEVEgzMkEJKEJJVCgxNikgKiAzKQkvKiAzMiBiaXRzIHdpZGUgKi8KKyNkZWZpbmUgUExYX0xCUkQwX0VST01XSURUSF84CShCSVQoMTYpICogMCkJLyogOCBiaXRzIHdpZGUgKi8KKyNkZWZpbmUgUExYX0xCUkQwX0VST01XSURUSF8xNgkoQklUKDE2KSAqIDEpCS8qIDE2IGJpdHMgd2lkZSAqLworI2RlZmluZSBQTFhfTEJSRDBfRVJPTVdJRFRIXzMyCShCSVQoMTYpICogMikJLyogMzIgYml0cyB3aWRlICovCisjZGVmaW5lIFBMWF9MQlJEMF9FUk9NV0lEVEhfMzJBCShCSVQoMTYpICogMykJLyogMzIgYml0cyB3aWRlICovCiAjZGVmaW5lIFBMWF9MQlJEMF9FUk9NV0lEVEhfTUFTSwlHRU5NQVNLKDE3LCAxNikKLSNkZWZpbmUgUExYX0xCUkQwX0VST01XSURUSF9TSElGVAkxNgogLyogRXhwYW5zaW9uIFJPTSBTcGFjZSBJbnRlcm5hbCBXYWl0IFN0YXRlcyAoTEJSRDAgb25seSkgKi8KICNkZWZpbmUgUExYX0xCUkQwX0VST01JV1MoeCkJKEJJVCgxOCkgKiAoKHgpICYgMHhmKSkKICNkZWZpbmUgUExYX0xCUkQwX0VST01JV1NfTUFTSwlHRU5NQVNLKDIxLCAxOCkKLSNkZWZpbmUgUExYX0xCUkQwX0VST01JV1NfU0hJRlQJMTgKKyNkZWZpbmUgUExYX0xCUkQwX1RPX0VST01JV1MocikJKCgocikgJiBQTFhfTEJSRDBfRVJPTUlXU19NQVNLKSA+PiAxOCkKIC8qIEV4cGFuc2lvbiBST00gU3BhY2UgUmVhZHkgSW5wdXQgRW5hYmxlIChMQkRSMCBvbmx5KSAqLwogI2RlZmluZSBQTFhfTEJSRDBfRVJPTVJFQURZSUVOCUJJVCgyMikKIC8qIEV4cGFuc2lvbiBST00gU3BhY2UgQlRFUk0jIElucHV0IEVuYWJsZSAoTEJSRDAgb25seSkgKi8KQEAgLTIyMCw3ICsyMTgsNyBAQAogLyogUENJIFRhcmdldCBSZXRyeSBEZWxheSBDbG9ja3MgLyA4IChMQlJEMCBvbmx5KSAqLwogI2RlZmluZSBQTFhfTEJSRDBfVFJERUxBWSh4KQkoQklUKDI4KSAqICgoeCkgJiAweEYpKQogI2RlZmluZSBQTFhfTEJSRDBfVFJERUxBWV9NQVNLCUdFTk1BU0soMzEsIDI4KQotI2RlZmluZSBQTFhfTEJSRDBfVFJERUxBWV9TSElGVAkyOAorI2RlZmluZSBQTFhfTEJSRDBfVE9fVFJERUxBWShyKQkoKChyKSAmIFBMWF9MQlJEMF9UUkRFTEFZX01BU0spID4+IDI4KQogCiAvKiBMb2NhbCBSYW5nZSBSZWdpc3RlciBmb3IgRGlyZWN0IE1hc3RlciB0byBQQ0kgKi8KICNkZWZpbmUgUExYX1JFR19ETVJSCQkweDAwMWMKQEAgLTI0MSwxMCArMjM5LDEwIEBACiAvKiBMTE9DSyMgSW5wdXQgRW5hYmxlICovCiAjZGVmaW5lIFBMWF9ETVBCQU1fTExPQ0tJRU4JQklUKDIpCiAvKiBEaXJlY3QgTWFzdGVyIFJlYWQgUHJlZmV0Y2ggU2l6ZSBDb250cm9sIChiaXRzIDEyLCAzKSAqLwotI2RlZmluZSBQTFhfRE1QQkFNX1JQU0laRUNPTlQJKChCSVQoMTIpICogMCkgfCAoQklUKDMpICogMCkpCi0jZGVmaW5lIFBMWF9ETVBCQU1fUlBTSVpFNAkoKEJJVCgxMikgKiAwKSB8IChCSVQoMykgKiAxKSkKLSNkZWZpbmUgUExYX0RNUEJBTV9SUFNJWkU4CSgoQklUKDEyKSAqIDEpIHwgKEJJVCgzKSAqIDApKQotI2RlZmluZSBQTFhfRE1QQkFNX1JQU0laRTE2CSgoQklUKDEyKSAqIDEpIHwgKEJJVCgzKSAqIDEpKQorI2RlZmluZSBQTFhfRE1QQkFNX1JQU0laRV9DT05UCSgoQklUKDEyKSAqIDApIHwgKEJJVCgzKSAqIDApKQorI2RlZmluZSBQTFhfRE1QQkFNX1JQU0laRV80CSgoQklUKDEyKSAqIDApIHwgKEJJVCgzKSAqIDEpKQorI2RlZmluZSBQTFhfRE1QQkFNX1JQU0laRV84CSgoQklUKDEyKSAqIDEpIHwgKEJJVCgzKSAqIDApKQorI2RlZmluZSBQTFhfRE1QQkFNX1JQU0laRV8xNgkoKEJJVCgxMikgKiAxKSB8IChCSVQoMykgKiAxKSkKICNkZWZpbmUgUExYX0RNUEJBTV9SUFNJWkVfTUFTSwkoQklUKDEyKSB8IEJJVCgzKSkKIC8qIERpcmVjdCBNYXN0ZXIgUENJIFJlYWQgTW9kZSAtIGRlYXNzZXJ0IElSRFkgd2hlbiBGSUZPIGZ1bGwgKi8KICNkZWZpbmUgUExYX0RNUEJBTV9STUlSRFkJQklUKDQpCkBAIC0yNjEsMTAgKzI1OSwxMCBAQAogLyogSS9PIFJlbWFwIFNlbGVjdCAqLwogI2RlZmluZSBQTFhfRE1QQkFNX0lPUkVNQVBTRUwJQklUKDEzKQogLyogRGlyZWN0IE1hc3RlciBXcml0ZSBEZWxheSAqLwotI2RlZmluZSBQTFhfRE1QQkFNX1dERUxBWU5PTkUJKEJJVCgxNCkgKiAwKQotI2RlZmluZSBQTFhfRE1QQkFNX1dERUxBWTQJKEJJVCgxNCkgKiAxKQotI2RlZmluZSBQTFhfRE1QQkFNX1dERUxBWTgJKEJJVCgxNCkgKiAyKQotI2RlZmluZSBQTFhfRE1QQkFNX1dERUxBWTE2CShCSVQoMTQpICogMykKKyNkZWZpbmUgUExYX0RNUEJBTV9XREVMQVlfTk9ORQkoQklUKDE0KSAqIDApCisjZGVmaW5lIFBMWF9ETVBCQU1fV0RFTEFZXzQJKEJJVCgxNCkgKiAxKQorI2RlZmluZSBQTFhfRE1QQkFNX1dERUxBWV84CShCSVQoMTQpICogMikKKyNkZWZpbmUgUExYX0RNUEJBTV9XREVMQVlfMTYJKEJJVCgxNCkgKiAzKQogI2RlZmluZSBQTFhfRE1QQkFNX1dERUxBWV9NQVNLCUdFTk1BU0soMTUsIDE0KQogLyogUmVtYXAgb2YgTG9jYWwtdG8tUENJIFNwYWNlIEludG8gUENJIEFkZHJlc3MgU3BhY2UgKi8KICNkZWZpbmUgUExYX0RNUEJBTV9SRU1BUF9NQVNLCUdFTk1BU0soMzEsIDE2KQpAQCAtMjc5LDE5ICsyNzcsMTkgQEAKIC8qIFJlZ2lzdGVyIE51bWJlciAqLwogI2RlZmluZSBQTFhfRE1DRkdBX1JFR05VTSh4KQkoQklUKDIpICogKCh4KSAmIDB4M2YpKQogI2RlZmluZSBQTFhfRE1DRkdBX1JFR05VTV9NQVNLCUdFTk1BU0soNywgMikKLSNkZWZpbmUgUExYX0RNQ0ZHQV9SRUdOVU1fU0hJRlQJMgorI2RlZmluZSBQTFhfRE1DRkdBX1RPX1JFR05VTShyKQkoKChyKSAmIFBMWF9ETUNGR0FfUkVHTlVNX01BU0spID4+IDIpCiAvKiBGdW5jdGlvbiBOdW1iZXIgKi8KICNkZWZpbmUgUExYX0RNQ0ZHQV9GVU5DTlVNKHgpCShCSVQoOCkgKiAoKHgpICYgMHg3KSkKICNkZWZpbmUgUExYX0RNQ0ZHQV9GVU5DTlVNX01BU0sJR0VOTUFTSygxMCwgOCkKLSNkZWZpbmUgUExYX0RNQ0ZHQV9GVU5DTlVNX1NISUZUIDgKKyNkZWZpbmUgUExYX0RNQ0ZHQV9UT19GVU5DTlVNKHIpICgoKHIpICYgUExYX0RNQ0ZHQV9GVU5DTlVNX01BU0spID4+IDgpCiAvKiBEZXZpY2UgTnVtYmVyICovCiAjZGVmaW5lIFBMWF9ETUNGR0FfREVWTlVNKHgpCShCSVQoMTEpICogKCh4KSAmIDB4MWYpKQogI2RlZmluZSBQTFhfRE1DRkdBX0RFVk5VTV9NQVNLCUdFTk1BU0soMTUsIDExKQotI2RlZmluZSBQTFhfRE1DRkdBX0RFVk5VTV9TSElGVAkxMQorI2RlZmluZSBQTFhfRE1DRkdBX1RPX0RFVk5VTShyKQkoKChyKSAmIFBMWF9ETUNGR0FfREVWTlVNX01BU0spID4+IDExKQogLyogQnVzIE51bWJlciAqLwogI2RlZmluZSBQTFhfRE1DRkdBX0JVU05VTSh4KQkoQklUKDE2KSAqICgoeCkgJiAweGZmKSkKICNkZWZpbmUgUExYX0RNQ0ZHQV9CVVNOVU1fTUFTSwlHRU5NQVNLKDIzLCAxNikKLSNkZWZpbmUgUExYX0RNQ0ZHQV9CVVNOVU1fU0hJRlQJMTYKKyNkZWZpbmUgUExYX0RNQ0ZHQV9UT19CVVNOVU0ocikJKCgocikgJiBQTFhfRE1DRkdBX0JVU05VTV9NQVNLKSA+PiAxNikKIC8qIENvbmZpZ3VyYXRpb24gRW5hYmxlICovCiAjZGVmaW5lIFBMWF9ETUNGR0FfQ09ORklHRU4JQklUKDMxKQogCkBAIC00MDIsMjIgKzQwMCwyMiBAQAogLyogUENJIFJlYWQgQ29tbWFuZCBDb2RlIEZvciBETUEgKi8KICNkZWZpbmUgUExYX0NOVFJMX0NDUkRNQSh4KQkoQklUKDApICogKCh4KSAmIDB4ZikpCiAjZGVmaW5lIFBMWF9DTlRSTF9DQ1JETUFfTUFTSwlHRU5NQVNLKDMsIDApCi0jZGVmaW5lIFBMWF9DTlRSTF9DQ1JETUFfU0hJRlQJMAorI2RlZmluZSBQTFhfQ05UUkxfVE9fQ0NSRE1BKHIpCSgocikgJiBQTFhfQ05UUkxfQ0NSRE1BX01BU0spCiAjZGVmaW5lIFBMWF9DTlRSTF9DQ1JETUFfTk9STUFMCVBMWF9DTlRSTF9DQ1JETUEoMTQpCS8qIHZhbHVlIGFmdGVyIHJlc2V0ICovCiAvKiBQQ0kgV3JpdGUgQ29tbWFuZCBDb2RlIEZvciBETUEgMCAqLwogI2RlZmluZSBQTFhfQ05UUkxfQ0NXRE1BKHgpCShCSVQoNCkgKiAoKHgpICYgMHhmKSkKICNkZWZpbmUgUExYX0NOVFJMX0NDV0RNQV9NQVNLCUdFTk1BU0soNywgNCkKLSNkZWZpbmUgUExYX0NOVFJMX0NDV0RNQV9TSElGVAk0CisjZGVmaW5lIFBMWF9DTlRSTF9UT19DQ1dETUEocikJKCgocikgJiBQTFhfQ05UUkxfQ0NXRE1BX01BU0spID4+IDQpCiAjZGVmaW5lIFBMWF9DTlRSTF9DQ1dETUFfTk9STUFMCVBMWF9DTlRSTF9DQ1dETUEoNykJLyogdmFsdWUgYWZ0ZXIgcmVzZXQgKi8KIC8qIFBDSSBNZW1vcnkgUmVhZCBDb21tYW5kIENvZGUgRm9yIERpcmVjdCBNYXN0ZXIgKi8KICNkZWZpbmUgUExYX0NOVFJMX0NDUkRNKHgpCShCSVQoOCkgKiAoKHgpICYgMHhmKSkKICNkZWZpbmUgUExYX0NOVFJMX0NDUkRNX01BU0sJR0VOTUFTSygxMSwgOCkKLSNkZWZpbmUgUExYX0NOVFJMX0NDUkRNX1NISUZUCTgKKyNkZWZpbmUgUExYX0NOVFJMX1RPX0NDUkRNKHIpCSgoKHIpICYgUExYX0NOVFJMX0NDUkRNX01BU0spID4+IDgpCiAjZGVmaW5lIFBMWF9DTlRSTF9DQ1JETV9OT1JNQUwJUExYX0NOVFJMX0NDUkRNKDYpCS8qIHZhbHVlIGFmdGVyIHJlc2V0ICovCiAvKiBQQ0kgTWVtb3J5IFdyaXRlIENvbW1hbmQgQ29kZSBGb3IgRGlyZWN0IE1hc3RlciAqLwogI2RlZmluZSBQTFhfQ05UUkxfQ0NXRE0oeCkJKEJJVCgxMikgKiAoKHgpICYgMHhmKSkKICNkZWZpbmUgUExYX0NOVFJMX0NDV0RNX01BU0sJR0VOTUFTSygxNSwgMTIpCi0jZGVmaW5lIFBMWF9DTlRSTF9DQ1dETV9TSElGVAkxMgorI2RlZmluZSBQTFhfQ05UUkxfVE9fQ0NXRE0ocikJKCgocikgJiBQTFhfQ05UUkxfQ0NXRE1fTUFTSykgPj4gMTIpCiAjZGVmaW5lIFBMWF9DTlRSTF9DQ1dETV9OT1JNQUwJUExYX0NOVFJMX0NDV0RNKDcpCS8qIHZhbHVlIGFmdGVyIHJlc2V0ICovCiAvKiBHZW5lcmFsIFB1cnBvc2UgT3V0cHV0IChVU0VSTykgKi8KICNkZWZpbmUgUExYX0NOVFJMX1VTRVJPCQlCSVQoMTYpCkBAIC00NjQsMTYgKzQ2MiwxNSBAQAogI2RlZmluZSBQTFhfUkVHX0RNQU1PREUxCTB4MDA5NAogCiAvKiBMb2NhbCBCdXMgV2lkdGggKi8KLSNkZWZpbmUgUExYX0RNQU1PREVfV0lEVEg4CShCSVQoMCkgKiAwKQkvKiA4IGJpdHMgd2lkZSAqLwotI2RlZmluZSBQTFhfRE1BTU9ERV9XSURUSDE2CShCSVQoMCkgKiAxKQkvKiAxNiBiaXRzIHdpZGUgKi8KLSNkZWZpbmUgUExYX0RNQU1PREVfV0lEVEgzMgkoQklUKDApICogMikJLyogMzIgYml0cyB3aWRlICovCi0jZGVmaW5lIFBMWF9ETUFNT0RFX1dJRFRIMzJBCShCSVQoMCkgKiAzKQkvKiAzMiBiaXRzIHdpZGUgKi8KKyNkZWZpbmUgUExYX0RNQU1PREVfV0lEVEhfOAkoQklUKDApICogMCkJLyogOCBiaXRzIHdpZGUgKi8KKyNkZWZpbmUgUExYX0RNQU1PREVfV0lEVEhfMTYJKEJJVCgwKSAqIDEpCS8qIDE2IGJpdHMgd2lkZSAqLworI2RlZmluZSBQTFhfRE1BTU9ERV9XSURUSF8zMgkoQklUKDApICogMikJLyogMzIgYml0cyB3aWRlICovCisjZGVmaW5lIFBMWF9ETUFNT0RFX1dJRFRIXzMyQQkoQklUKDApICogMykJLyogMzIgYml0cyB3aWRlICovCiAjZGVmaW5lIFBMWF9ETUFNT0RFX1dJRFRIX01BU0sJR0VOTUFTSygxLCAwKQotI2RlZmluZSBQTFhfRE1BTU9ERV9XSURUSF9TSElGVAkwCiAvKiBJbnRlcm5hbCBXYWl0IFN0YXRlcyAqLwogI2RlZmluZSBQTFhfRE1BTU9ERV9JV1MoeCkJKEJJVCgyKSAqICgoeCkgJiAweGYpKQogI2RlZmluZSBQTFhfRE1BTU9ERV9JV1NfTUFTSwlHRU5NQVNLKDUsIDIpCi0jZGVmaW5lIFBMWF9ETUFNT0RFX1NISUZUCTIKKyNkZWZpbmUgUExYX0RNQU1PREVfVE9fSVdTKHIpCSgoKHIpICYgUExYX0RNQU1PREVfSVdTX01BU0spID4+IDIpCiAvKiBSZWFkeSBJbnB1dCBFbmFibGUgKi8KICNkZWZpbmUgUExYX0RNQU1PREVfUkVBRFlJRU4JQklUKDYpCiAvKiBCVEVSTSMgSW5wdXQgRW5hYmxlICovCkBAIC01NjAsMzUgKzU1NywzNSBAQAogLyogRE1BIENoYW5uZWwgMCBQQ0ktdG8tTG9jYWwgQWxtb3N0IEZ1bGwgKGRpdmlkZWQgYnkgMiwgbWludXMgMSkgKi8KICNkZWZpbmUgUExYX0RNQVRIUl9DMFBMQUYoeCkJKEJJVCgwKSAqICgoeCkgJiAweGYpKQogI2RlZmluZSBQTFhfRE1BVEhSX0MwUExBRl9NQVNLCUdFTk1BU0soMywgMCkKLSNkZWZpbmUgUExYX0RNQVRIUl9DMFBMQUZfU0hJRlQJMAorI2RlZmluZSBQTFhfRE1BVEhSX1RPX0MwUExBRihyKQkoKHIpICYgUExYX0RNQVRIUl9DMFBMQUZfTUFTSykKIC8qIERNQSBDaGFubmVsIDAgTG9jYWwtdG8tUENJIEFsbW9zdCBFbXB0eSAoZGl2aWRlZCBieSAyLCBtaW51cyAxKSAqLwogI2RlZmluZSBQTFhfRE1BVEhSX0MwTFBBRSh4KQkoQklUKDQpICogKCh4KSAmIDB4ZikpCiAjZGVmaW5lIFBMWF9ETUFUSFJfQzBMUEFFX01BU0sJR0VOTUFTSyg3LCA0KQotI2RlZmluZSBQTFhfRE1BVEhSX0MwTFBBRV9TSElGVAk0CisjZGVmaW5lIFBMWF9ETUFUSFJfVE9fQzBMUEFFKHIpCSgoKHIpICYgUExYX0RNQVRIUl9DMExQQUVfTUFTSykgPj4gNCkKIC8qIERNQSBDaGFubmVsIDAgTG9jYWwtdG8tUENJIEFsbW9zdCBGdWxsIChkaXZpZGVkIGJ5IDIsIG1pbnVzIDEpICovCiAjZGVmaW5lIFBMWF9ETUFUSFJfQzBMUEFGKHgpCShCSVQoOCkgKiAoKHgpICYgMHhmKSkKICNkZWZpbmUgUExYX0RNQVRIUl9DMExQQUZfTUFTSwlHRU5NQVNLKDExLCA4KQotI2RlZmluZSBQTFhfRE1BVEhSX0MwTFBBRl9TSElGVAk4CisjZGVmaW5lIFBMWF9ETUFUSFJfVE9fQzBMUEFGKHIpCSgoKHIpICYgUExYX0RNQVRIUl9DMExQQUZfTUFTSykgPj4gOCkKIC8qIERNQSBDaGFubmVsIDAgUENJLXRvLUxvY2FsIEFsbW9zdCBFbXB0eSAoZGl2aWRlZCBieSAyLCBtaW51cyAxKSAqLwogI2RlZmluZSBQTFhfRE1BVEhSX0MwUExBRSh4KQkoQklUKDEyKSAqICgoeCkgJiAweGYpKQogI2RlZmluZSBQTFhfRE1BVEhSX0MwUExBRV9NQVNLCUdFTk1BU0soMTUsIDEyKQotI2RlZmluZSBQTFhfRE1BVEhSX0MwUExBRV9TSElGVAkxMgorI2RlZmluZSBQTFhfRE1BVEhSX1RPX0MwUExBRShyKQkoKChyKSAmIFBMWF9ETUFUSFJfQzBQTEFFX01BU0spID4+IDEyKQogLyogRE1BIENoYW5uZWwgMSBQQ0ktdG8tTG9jYWwgQWxtb3N0IEZ1bGwgKGRpdmlkZWQgYnkgMiwgbWludXMgMSkgKi8KICNkZWZpbmUgUExYX0RNQVRIUl9DMVBMQUYoeCkJKEJJVCgxNikgKiAoKHgpICYgMHhmKSkKICNkZWZpbmUgUExYX0RNQVRIUl9DMVBMQUZfTUFTSwlHRU5NQVNLKDE5LCAxNikKLSNkZWZpbmUgUExYX0RNQVRIUl9DMVBMQUZfU0hJRlQJMTYKKyNkZWZpbmUgUExYX0RNQVRIUl9UT19DMVBMQUYocikJKCgocikgJiBQTFhfRE1BVEhSX0MxUExBRl9NQVNLKSA+PiAxNikKIC8qIERNQSBDaGFubmVsIDEgTG9jYWwtdG8tUENJIEFsbW9zdCBFbXB0eSAoZGl2aWRlZCBieSAyLCBtaW51cyAxKSAqLwogI2RlZmluZSBQTFhfRE1BVEhSX0MxTFBBRSh4KQkoQklUKDIwKSAqICgoeCkgJiAweGYpKQogI2RlZmluZSBQTFhfRE1BVEhSX0MxTFBBRV9NQVNLCUdFTk1BU0soMjMsIDIwKQotI2RlZmluZSBQTFhfRE1BVEhSX0MxTFBBRV9TSElGVAkyMAorI2RlZmluZSBQTFhfRE1BVEhSX1RPX0MxTFBBRShyKQkoKChyKSAmIFBMWF9ETUFUSFJfQzFMUEFFX01BU0spID4+IDIwKQogLyogRE1BIENoYW5uZWwgMSBMb2NhbC10by1QQ0kgQWxtb3N0IEZ1bGwgKGRpdmlkZWQgYnkgMiwgbWludXMgMSkgKi8KICNkZWZpbmUgUExYX0RNQVRIUl9DMUxQQUYoeCkJKEJJVCgyNCkgKiAoKHgpICYgMHhmKSkKICNkZWZpbmUgUExYX0RNQVRIUl9DMUxQQUZfTUFTSwlHRU5NQVNLKDI3LCAyNCkKLSNkZWZpbmUgUExYX0RNQVRIUl9DMUxQQUZfU0hJRlQJMjQKKyNkZWZpbmUgUExYX0RNQVRIUl9UT19DMUxQQUYocikJKCgocikgJiBQTFhfRE1BVEhSX0MxTFBBRl9NQVNLKSA+PiAyNCkKIC8qIERNQSBDaGFubmVsIDEgUENJLXRvLUxvY2FsIEFsbW9zdCBFbXB0eSAoZGl2aWRlZCBieSAyLCBtaW51cyAxKSAqLwogI2RlZmluZSBQTFhfRE1BVEhSX0MxUExBRSh4KQkoQklUKDI4KSAqICgoeCkgJiAweGYpKQogI2RlZmluZSBQTFhfRE1BVEhSX0MxUExBRV9NQVNLCUdFTk1BU0soMzEsIDI4KQotI2RlZmluZSBQTFhfRE1BVEhSX0MxUExBRV9TSElGVAkyOAorI2RlZmluZSBQTFhfRE1BVEhSX1RPX0MxUExBRShyKQkoKChyKSAmIFBMWF9ETUFUSFJfQzFQTEFFX01BU0spID4+IDI4KQogCiAvKgogICogTWVzc2FnaW5nIFF1ZXVlIFJlZ2lzdGVycyBPUExGSVMsIE9QTEZJTSwgSVFQLCBPUVAsIE1RQ1IsIFFCQVIsIElGSFBSLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmMKaW5kZXggNGE4N2I0Yi4uYzE0YTAyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5jCkBAIC02OTcsMTM0ICs2OTcsNiBAQAogCXM2MjZfZGViaV9yZXBsYWNlKGRldiwgUzYyNl9MUF9DUkIoY2hhbiksIH5TNjI2X0NSQk1TS19JTlRDVFJMLCBzZXQpOwogfQogCi0jaWZkZWYgdW51c2VkCi0vKgotICogUmV0dXJuIGNvdW50ZXIgc2V0dXAgaW4gYSBmb3JtYXQgKENPVU5URVJfU0VUVVApIHRoYXQgaXMgY29uc2lzdGVudAotICogZm9yIGJvdGggQSBhbmQgQiBjb3VudGVycy4KLSAqLwotc3RhdGljIHVpbnQxNl90IHM2MjZfZ2V0X21vZGVfYShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCXVuc2lnbmVkIGludCBjaGFuKQotewotCXVpbnQxNl90IGNyYTsKLQl1aW50MTZfdCBjcmI7Ci0JdWludDE2X3Qgc2V0dXA7Ci0JdW5zaWduZWQgaW50IGNudHNyYywgY2xrbXVsdCwgY2xrcG9sLCBlbmNtb2RlOwotCi0JLyogRmV0Y2ggQ1JBIGFuZCBDUkIgcmVnaXN0ZXIgaW1hZ2VzLiAqLwotCWNyYSA9IHM2MjZfZGViaV9yZWFkKGRldiwgUzYyNl9MUF9DUkEoY2hhbikpOwotCWNyYiA9IHM2MjZfZGViaV9yZWFkKGRldiwgUzYyNl9MUF9DUkIoY2hhbikpOwotCi0JLyoKLQkgKiBQb3B1bGF0ZSB0aGUgc3RhbmRhcmRpemVkIGNvdW50ZXIgc2V0dXAgYml0IGZpZWxkcy4KLQkgKi8KLQlzZXR1cCA9Ci0JCS8qIExvYWRTcmMgID0gTG9hZFNyY0EuICovCi0JCVM2MjZfU0VUX1NURF9MT0FEU1JDKFM2MjZfR0VUX0NSQV9MT0FEU1JDX0EoY3JhKSkgfAotCQkvKiBMYXRjaFNyYyA9IExhdGNoU3JjQS4gKi8KLQkJUzYyNl9TRVRfU1REX0xBVENIU1JDKFM2MjZfR0VUX0NSQl9MQVRDSFNSQyhjcmIpKSB8Ci0JCS8qIEludFNyYyAgID0gSW50U3JjQS4gKi8KLQkJUzYyNl9TRVRfU1REX0lOVFNSQyhTNjI2X0dFVF9DUkFfSU5UU1JDX0EoY3JhKSkgfAotCQkvKiBJbmR4U3JjICA9IEluZHhTcmNBLiAqLwotCQlTNjI2X1NFVF9TVERfSU5EWFNSQyhTNjI2X0dFVF9DUkFfSU5EWFNSQ19BKGNyYSkpIHwKLQkJLyogSW5keFBvbCAgPSBJbmR4UG9sQS4gKi8KLQkJUzYyNl9TRVRfU1REX0lORFhQT0woUzYyNl9HRVRfQ1JBX0lORFhQT0xfQShjcmEpKSB8Ci0JCS8qIENsa0VuYWIgID0gQ2xrRW5hYkEuICovCi0JCVM2MjZfU0VUX1NURF9DTEtFTkFCKFM2MjZfR0VUX0NSQl9DTEtFTkFCX0EoY3JiKSk7Ci0KLQkvKiBBZGp1c3QgbW9kZS1kZXBlbmRlbnQgcGFyYW1ldGVycy4gKi8KLQljbnRzcmMgPSBTNjI2X0dFVF9DUkFfQ05UU1JDX0EoY3JhKTsKLQlpZiAoY250c3JjICYgUzYyNl9DTlRTUkNfU1lTQ0xLKSB7Ci0JCS8qIFRpbWVyIG1vZGUgKENudFNyY0E8MT4gPT0gMSk6ICovCi0JCWVuY21vZGUgPSBTNjI2X0VOQ01PREVfVElNRVI7Ci0JCS8qIFNldCBDbGtQb2wgdG8gaW5kaWNhdGUgY291bnQgZGlyZWN0aW9uIChDbnRTcmNBPDA+KS4gKi8KLQkJY2xrcG9sID0gY250c3JjICYgMTsKLQkJLyogQ2xrTXVsdCBtdXN0IGJlIDF4IGluIFRpbWVyIG1vZGUuICovCi0JCWNsa211bHQgPSBTNjI2X0NMS01VTFRfMVg7Ci0JfSBlbHNlIHsKLQkJLyogQ291bnRlciBtb2RlIChDbnRTcmNBPDE+ID09IDApOiAqLwotCQllbmNtb2RlID0gUzYyNl9FTkNNT0RFX0NPVU5URVI7Ci0JCS8qIFBhc3MgdGhyb3VnaCBDbGtQb2wuICovCi0JCWNsa3BvbCA9IFM2MjZfR0VUX0NSQV9DTEtQT0xfQShjcmEpOwotCQkvKiBGb3JjZSBDbGtNdWx0IHRvIDF4IGlmIG5vdCBsZWdhbCwgZWxzZSBwYXNzIHRocm91Z2guICovCi0JCWNsa211bHQgPSBTNjI2X0dFVF9DUkFfQ0xLTVVMVF9BKGNyYSk7Ci0JCWlmIChjbGttdWx0ID09IFM2MjZfQ0xLTVVMVF9TUEVDSUFMKQotCQkJY2xrbXVsdCA9IFM2MjZfQ0xLTVVMVF8xWDsKLQl9Ci0Jc2V0dXAgfD0gUzYyNl9TRVRfU1REX0VOQ01PREUoZW5jbW9kZSkgfCBTNjI2X1NFVF9TVERfQ0xLTVVMVChjbGttdWx0KSB8Ci0JCSBTNjI2X1NFVF9TVERfQ0xLUE9MKGNsa3BvbCk7Ci0KLQkvKiBSZXR1cm4gYWRqdXN0ZWQgY291bnRlciBzZXR1cC4gKi8KLQlyZXR1cm4gc2V0dXA7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBzNjI2X2dldF9tb2RlX2Ioc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQl1bnNpZ25lZCBpbnQgY2hhbikKLXsKLQl1aW50MTZfdCBjcmE7Ci0JdWludDE2X3QgY3JiOwotCXVpbnQxNl90IHNldHVwOwotCXVuc2lnbmVkIGludCBjbnRzcmMsIGNsa211bHQsIGNsa3BvbCwgZW5jbW9kZTsKLQotCS8qIEZldGNoIENSQSBhbmQgQ1JCIHJlZ2lzdGVyIGltYWdlcy4gKi8KLQljcmEgPSBzNjI2X2RlYmlfcmVhZChkZXYsIFM2MjZfTFBfQ1JBKGNoYW4pKTsKLQljcmIgPSBzNjI2X2RlYmlfcmVhZChkZXYsIFM2MjZfTFBfQ1JCKGNoYW4pKTsKLQotCS8qCi0JICogUG9wdWxhdGUgdGhlIHN0YW5kYXJkaXplZCBjb3VudGVyIHNldHVwIGJpdCBmaWVsZHMuCi0JICovCi0Jc2V0dXAgPQotCQkvKiBJbnRTcmMgICA9IEludFNyY0IuICovCi0JCVM2MjZfU0VUX1NURF9JTlRTUkMoUzYyNl9HRVRfQ1JCX0lOVFNSQ19CKGNyYikpIHwKLQkJLyogTGF0Y2hTcmMgPSBMYXRjaFNyY0IuICovCi0JCVM2MjZfU0VUX1NURF9MQVRDSFNSQyhTNjI2X0dFVF9DUkJfTEFUQ0hTUkMoY3JiKSkgfAotCQkvKiBMb2FkU3JjICA9IExvYWRTcmNCLiAqLwotCQlTNjI2X1NFVF9TVERfTE9BRFNSQyhTNjI2X0dFVF9DUkJfTE9BRFNSQ19CKGNyYikpIHwKLQkJLyogSW5keFBvbCAgPSBJbmR4UG9sQi4gKi8KLQkJUzYyNl9TRVRfU1REX0lORFhQT0woUzYyNl9HRVRfQ1JCX0lORFhQT0xfQihjcmIpKSB8Ci0JCS8qIENsa0VuYWIgID0gQ2xrRW5hYkIuICovCi0JCVM2MjZfU0VUX1NURF9DTEtFTkFCKFM2MjZfR0VUX0NSQl9DTEtFTkFCX0IoY3JiKSkgfAotCQkvKiBJbmR4U3JjICA9IEluZHhTcmNCLiAqLwotCQlTNjI2X1NFVF9TVERfSU5EWFNSQyhTNjI2X0dFVF9DUkFfSU5EWFNSQ19CKGNyYSkpOwotCi0JLyogQWRqdXN0IG1vZGUtZGVwZW5kZW50IHBhcmFtZXRlcnMuICovCi0JY250c3JjID0gUzYyNl9HRVRfQ1JBX0NOVFNSQ19CKGNyYSk7Ci0JY2xrbXVsdCA9IFM2MjZfR0VUX0NSQl9DTEtNVUxUX0IoY3JiKTsKLQlpZiAoY2xrbXVsdCA9PSBTNjI2X0NMS01VTFRfU1BFQ0lBTCkgewotCQkvKiBFeHRlbmRlciBtb2RlIChDbGtNdWx0QiA9PSBTNjI2X0NMS01VTFRfU1BFQ0lBTCk6ICovCi0JCWVuY21vZGUgPSBTNjI2X0VOQ01PREVfRVhURU5ERVI7Ci0JCS8qIEluZGljYXRlIG11bHRpcGxpZXIgaXMgMXguICovCi0JCWNsa211bHQgPSBTNjI2X0NMS01VTFRfMVg7Ci0JCS8qIFNldCBDbGtQb2wgZXF1YWwgdG8gVGltZXIgY291bnQgZGlyZWN0aW9uIChDbnRTcmNCPDA+KS4gKi8KLQkJY2xrcG9sID0gY250c3JjICYgMTsKLQl9IGVsc2UgaWYgKGNudHNyYyAmIFM2MjZfQ05UU1JDX1NZU0NMSykgewotCQkvKiBUaW1lciBtb2RlIChDbnRTcmNCPDE+ID09IDEpOiAqLwotCQllbmNtb2RlID0gUzYyNl9FTkNNT0RFX1RJTUVSOwotCQkvKiBJbmRpY2F0ZSBtdWx0aXBsaWVyIGlzIDF4LiAqLwotCQljbGttdWx0ID0gUzYyNl9DTEtNVUxUXzFYOwotCQkvKiBTZXQgQ2xrUG9sIGVxdWFsIHRvIFRpbWVyIGNvdW50IGRpcmVjdGlvbiAoQ250U3JjQjwwPikuICovCi0JCWNsa3BvbCA9IGNudHNyYyAmIDE7Ci0JfSBlbHNlIHsKLQkJLyogSWYgQ291bnRlciBtb2RlIChDbnRTcmNCPDE+ID09IDApOiAqLwotCQllbmNtb2RlID0gUzYyNl9FTkNNT0RFX0NPVU5URVI7Ci0JCS8qIENsb2NrIG11bHRpcGxpZXIgaXMgcGFzc2VkIHRocm91Z2guICovCi0JCS8qIENsb2NrIHBvbGFyaXR5IGlzIHBhc3NlZCB0aHJvdWdoLiAqLwotCQljbGtwb2wgPSBTNjI2X0dFVF9DUkJfQ0xLUE9MX0IoY3JiKTsKLQl9Ci0Jc2V0dXAgfD0gUzYyNl9TRVRfU1REX0VOQ01PREUoZW5jbW9kZSkgfCBTNjI2X1NFVF9TVERfQ0xLTVVMVChjbGttdWx0KSB8Ci0JCSBTNjI2X1NFVF9TVERfQ0xLUE9MKGNsa3BvbCk7Ci0KLQkvKiBSZXR1cm4gYWRqdXN0ZWQgY291bnRlciBzZXR1cC4gKi8KLQlyZXR1cm4gc2V0dXA7Ci19Ci0KLXN0YXRpYyB1aW50MTZfdCBzNjI2X2dldF9tb2RlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgY2hhbikKLXsKLQlyZXR1cm4gKGNoYW4gPCAzKSA/IHM2MjZfZ2V0X21vZGVfYShkZXYsIGNoYW4pCi0JCQkgIDogczYyNl9nZXRfbW9kZV9iKGRldiwgY2hhbik7Ci19Ci0jZW5kaWYKLQogLyoKICAqIFNldCB0aGUgb3BlcmF0aW5nIG1vZGUgZm9yIHRoZSBzcGVjaWZpZWQgY291bnRlci4gIFRoZSBzZXR1cAogICogcGFyYW1ldGVyIGlzIHRyZWF0ZWQgYXMgYSBDT1VOVEVSX1NFVFVQIGRhdGEgdHlwZS4gIFRoZSBmb2xsb3dpbmcKQEAgLTEwMjMsMjUgKzg5NSw2IEBACiAJczYyNl9kZWJpX3JlcGxhY2UoZGV2LCBTNjI2X0xQX0NSQihjaGFuKSwgfm1hc2ssIHNldCk7CiB9CiAKLSNpZmRlZiB1bnVzZWQKLXN0YXRpYyB1aW50MTZfdCBzNjI2X2dldF9lbmFibGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQl1bnNpZ25lZCBpbnQgY2hhbikKLXsKLQl1aW50MTZfdCBjcmIgPSBzNjI2X2RlYmlfcmVhZChkZXYsIFM2MjZfTFBfQ1JCKGNoYW4pKTsKLQotCXJldHVybiAoY2hhbiA8IDMpID8gUzYyNl9HRVRfQ1JCX0NMS0VOQUJfQShjcmIpCi0JCQkgIDogUzYyNl9HRVRfQ1JCX0NMS0VOQUJfQihjcmIpOwotfQotI2VuZGlmCi0KLSNpZmRlZiB1bnVzZWQKLXN0YXRpYyB1aW50MTZfdCBzNjI2X2dldF9sYXRjaF9zb3VyY2Uoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgY2hhbikKLXsKLQlyZXR1cm4gUzYyNl9HRVRfQ1JCX0xBVENIU1JDKHM2MjZfZGViaV9yZWFkKGRldiwgUzYyNl9MUF9DUkIoY2hhbikpKTsKLX0KLSNlbmRpZgotCiAvKgogICogUmV0dXJuL3NldCB0aGUgZXZlbnQgdGhhdCB3aWxsIHRyaWdnZXIgdHJhbnNmZXIgb2YgdGhlIHByZWxvYWQKICAqIHJlZ2lzdGVyIGludG8gdGhlIGNvdW50ZXIuICAwPVRoaXNDbnRyX0luZGV4LCAxPVRoaXNDbnRyX092ZXJmbG93LApAQCAtMTA2NiwxOSArOTE5LDYgQEAKIAlzNjI2X2RlYmlfcmVwbGFjZShkZXYsIHJlZywgfm1hc2ssIHNldCk7CiB9CiAKLSNpZmRlZiB1bnVzZWQKLXN0YXRpYyB1aW50MTZfdCBzNjI2X2dldF9sb2FkX3RyaWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgICB1bnNpZ25lZCBpbnQgY2hhbikKLXsKLQlpZiAoY2hhbiA8IDMpCi0JCXJldHVybiBTNjI2X0dFVF9DUkFfTE9BRFNSQ19BKHM2MjZfZGViaV9yZWFkKGRldiwKLQkJCQkJCQlTNjI2X0xQX0NSQShjaGFuKSkpOwotCWVsc2UKLQkJcmV0dXJuIFM2MjZfR0VUX0NSQl9MT0FEU1JDX0IoczYyNl9kZWJpX3JlYWQoZGV2LAotCQkJCQkJCVM2MjZfTFBfQ1JCKGNoYW4pKSk7Ci19Ci0jZW5kaWYKLQogLyoKICAqIFJldHVybi9zZXQgY291bnRlciBpbnRlcnJ1cHQgc291cmNlIGFuZCBjbGVhciBhbnkgY2FwdHVyZWQKICAqIGluZGV4L292ZXJmbG93IGV2ZW50cy4gIGludF9zb3VyY2U6IDA9RGlzYWJsZWQsIDE9T3ZlcmZsb3dPbmx5LApAQCAtMTEzOCw5MyArOTc4LDYgQEAKIAl9CiB9CiAKLSNpZmRlZiB1bnVzZWQKLXN0YXRpYyB1aW50MTZfdCBzNjI2X2dldF9pbnRfc3JjKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJIHVuc2lnbmVkIGludCBjaGFuKQotewotCWlmIChjaGFuIDwgMykKLQkJcmV0dXJuIFM2MjZfR0VUX0NSQV9JTlRTUkNfQShzNjI2X2RlYmlfcmVhZChkZXYsCi0JCQkJCQkJUzYyNl9MUF9DUkEoY2hhbikpKTsKLQllbHNlCi0JCXJldHVybiBTNjI2X0dFVF9DUkJfSU5UU1JDX0IoczYyNl9kZWJpX3JlYWQoZGV2LAotCQkJCQkJCVM2MjZfTFBfQ1JCKGNoYW4pKSk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIHVudXNlZAotLyoKLSAqIFJldHVybi9zZXQgdGhlIGNsb2NrIG11bHRpcGxpZXIuCi0gKi8KLXN0YXRpYyB2b2lkIHM2MjZfc2V0X2Nsa19tdWx0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgY2hhbiwgdWludDE2X3QgdmFsdWUpCi17Ci0JdWludDE2X3QgbW9kZTsKLQotCW1vZGUgPSBzNjI2X2dldF9tb2RlKGRldiwgY2hhbik7Ci0JbW9kZSAmPSB+UzYyNl9TVERNU0tfQ0xLTVVMVDsKLQltb2RlIHw9IFM2MjZfU0VUX1NURF9DTEtNVUxUKHZhbHVlKTsKLQotCXM2MjZfc2V0X21vZGUoZGV2LCBjaGFuLCBtb2RlLCBmYWxzZSk7Ci19Ci0KLS8qCi0gKiBSZXR1cm4vc2V0IHRoZSBjbG9jayBwb2xhcml0eS4KLSAqLwotc3RhdGljIHZvaWQgczYyNl9zZXRfY2xrX3BvbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICB1bnNpZ25lZCBpbnQgY2hhbiwgdWludDE2X3QgdmFsdWUpCi17Ci0JdWludDE2X3QgbW9kZTsKLQotCW1vZGUgPSBzNjI2X2dldF9tb2RlKGRldiwgY2hhbik7Ci0JbW9kZSAmPSB+UzYyNl9TVERNU0tfQ0xLUE9MOwotCW1vZGUgfD0gUzYyNl9TRVRfU1REX0NMS1BPTCh2YWx1ZSk7Ci0KLQlzNjI2X3NldF9tb2RlKGRldiwgY2hhbiwgbW9kZSwgZmFsc2UpOwotfQotCi0vKgotICogUmV0dXJuL3NldCB0aGUgZW5jb2RlciBtb2RlLgotICovCi1zdGF0aWMgdm9pZCBzNjI2X3NldF9lbmNfbW9kZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICAgdW5zaWduZWQgaW50IGNoYW4sIHVpbnQxNl90IHZhbHVlKQotewotCXVpbnQxNl90IG1vZGU7Ci0KLQltb2RlID0gczYyNl9nZXRfbW9kZShkZXYsIGNoYW4pOwotCW1vZGUgJj0gflM2MjZfU1RETVNLX0VOQ01PREU7Ci0JbW9kZSB8PSBTNjI2X1NFVF9TVERfRU5DTU9ERSh2YWx1ZSk7Ci0KLQlzNjI2X3NldF9tb2RlKGRldiwgY2hhbiwgbW9kZSwgZmFsc2UpOwotfQotCi1zdGF0aWMgdWludDE2X3QgczYyNl9nZXRfaW5kZXhfcG9sKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICAgdW5zaWduZWQgaW50IGNoYW4pCi17Ci0JcmV0dXJuIFM2MjZfR0VUX1NURF9JTkRYUE9MKHM2MjZfZ2V0X21vZGUoZGV2LCBjaGFuKSk7Ci19Ci0KLS8qCi0gKiBSZXR1cm4vc2V0IHRoZSBpbmRleCBzb3VyY2UuCi0gKi8KLXN0YXRpYyB2b2lkIHM2MjZfc2V0X2luZGV4X3NyYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICAgIHVuc2lnbmVkIGludCBjaGFuLCB1aW50MTZfdCB2YWx1ZSkKLXsKLQl1aW50MTZfdCBtb2RlOwotCi0JbW9kZSA9IHM2MjZfZ2V0X21vZGUoZGV2LCBjaGFuKTsKLQltb2RlICY9IH5TNjI2X1NURE1TS19JTkRYU1JDOwotCW1vZGUgfD0gUzYyNl9TRVRfU1REX0lORFhTUkModmFsdWUgIT0gMCk7Ci0KLQlzNjI2X3NldF9tb2RlKGRldiwgY2hhbiwgbW9kZSwgZmFsc2UpOwotfQotCi1zdGF0aWMgdWludDE2X3QgczYyNl9nZXRfaW5kZXhfc3JjKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICAgdW5zaWduZWQgaW50IGNoYW4pCi17Ci0JcmV0dXJuIFM2MjZfR0VUX1NURF9JTkRYU1JDKHM2MjZfZ2V0X21vZGUoZGV2LCBjaGFuKSk7Ci19Ci0jZW5kaWYKLQogLyoKICAqIEdlbmVyYXRlIGFuIGluZGV4IHB1bHNlLgogICovCkBAIC0xNzE3LDQzICsxNDcwLDYgQEAKIAkvKiBFbmQgb2YgUlBTIHByb2dyYW0gYnVpbGQgKi8KIH0KIAotI2lmZGVmIHVudXNlZF9jb2RlCi1zdGF0aWMgaW50IHM2MjZfYWlfcmluc24oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkgdW5zaWduZWQgaW50ICpkYXRhKQotewotCXN0cnVjdCBzNjI2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdWludDhfdCBpOwotCWludDMyX3QgKnJlYWRhZGRyOwotCi0JLyogVHJpZ2dlciBBREMgc2NhbiBsb29wIHN0YXJ0ICovCi0JczYyNl9tY19lbmFibGUoZGV2LCBTNjI2X01DMl9BRENfUlBTLCBTNjI2X1BfTUMyKTsKLQotCS8qIFdhaXQgdW50aWwgQURDIHNjYW4gbG9vcCBpcyBmaW5pc2hlZCAoUlBTIFNpZ25hbCAwIHJlc2V0KSAqLwotCXdoaWxlIChzNjI2X21jX3Rlc3QoZGV2LCBTNjI2X01DMl9BRENfUlBTLCBTNjI2X1BfTUMyKSkKLQkJOwotCi0JLyoKLQkgKiBJbml0IHB0ciB0byBETUEgYnVmZmVyIHRoYXQgaG9sZHMgbmV3IEFEQyBkYXRhLiAgV2Ugc2tpcCB0aGUKLQkgKiBmaXJzdCB1aW50MTZfdCBpbiB0aGUgYnVmZmVyIGJlY2F1c2UgaXQgY29udGFpbnMganVuayBkYXRhIGZyb20KLQkgKiB0aGUgZmluYWwgQURDIG9mIHRoZSBwcmV2aW91cyBwb2xsIGxpc3Qgc2Nhbi4KLQkgKi8KLQlyZWFkYWRkciA9ICh1aW50MzJfdCAqKWRldnByaXYtPmFuYV9idWYubG9naWNhbF9iYXNlICsgMTsKLQotCS8qCi0JICogQ29udmVydCBBREMgZGF0YSB0byAxNi1iaXQgaW50ZWdlciB2YWx1ZXMgYW5kCi0JICogY29weSB0byBhcHBsaWNhdGlvbiBidWZmZXIuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IGRldnByaXYtPmFkY19pdGVtczsgaSsrKSB7Ci0JCSpkYXRhID0gczYyNl9haV9yZWdfdG9fdWludCgqcmVhZGFkZHIrKyk7Ci0JCWRhdGErKzsKLQl9Ci0KLQlyZXR1cm4gaTsKLX0KLSNlbmRpZgotCiBzdGF0aWMgaW50IHM2MjZfYWlfZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKQEAgLTI1MDAsNyArMjIxNiw4IEBACiAJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogCQl3cml0ZWwoUzYyNl9JMkNfQ0xLU0VMLCBkZXYtPm1taW8gKyBTNjI2X1BfSTJDU1RBVCk7CiAJCXM2MjZfbWNfZW5hYmxlKGRldiwgUzYyNl9NQzJfVVBMRF9JSUMsIFM2MjZfUF9NQzIpOwotCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIE5VTEwsIE5VTEwsIHM2MjZfaTJjX2hhbmRzaGFrZV9lb2MsIDApOworCQlyZXQgPSBjb21lZGlfdGltZW91dChkZXYsIE5VTEwsCisJCQkJICAgICBOVUxMLCBzNjI2X2kyY19oYW5kc2hha2VfZW9jLCAwKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmgKaW5kZXggNmEwMGE2NC4uNGNlZjQ1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5oCkBAIC03OSw3ICs3OSw3IEBACiAvKiBBZGRyZXNzIG9mZnNldHMsIGluIERXT1JEUywgZnJvbSBiYXNlIG9mIERNQSBidWZmZXIuICovCiAjZGVmaW5lIFM2MjZfREFDX1dETUFCVUZfT1MJUzYyNl9BRENfRE1BQlVGX0RXT1JEUwogCi0vKiAgSW50ZXJydXB0IGVuYWJsZSBiaXQgaW4gSVNSIGFuZCBJRVIuICovCisvKiBJbnRlcnJ1cHQgZW5hYmxlIGJpdCBpbiBJU1IgYW5kIElFUi4gKi8KICNkZWZpbmUgUzYyNl9JUlFfR1BJTzMJCTB4MDAwMDAwNDAJLyogSVJRIGVuYWJsZSBmb3IgR1BJTzMuICovCiAjZGVmaW5lIFM2MjZfSVJRX1JQUzEJCTB4MTAwMDAwMDAKICNkZWZpbmUgUzYyNl9JU1JfQUZPVQkJMHgwMDAwMDgwMApAQCAtMzI5LDcgKzMyOSw3IEBACiAJCQkJCQkgKiBXUzEtV1M0ID0gQ1MqIG91dHB1dHMuCiAJCQkJCQkgKi8KIAotI2lmIFM2MjZfUExBVEZPUk0gPT0gUzYyNl9JTlRFTAkJLyoKKyNpZiAoUzYyNl9QTEFURk9STSA9PSBTNjI2X0lOVEVMKQkvKgogCQkJCQkgKiBCYXNlIEFDT04xIGNvbmZpZzogYWx3YXlzIHJ1bgogCQkJCQkgKiBBMSBiYXNlZCBvbiBUU0wxLgogCQkJCQkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXhmYXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4ZmFzdC5jCmluZGV4IDEwZjk0ZWMuLjYwODQwM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXhmYXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eGZhc3QuYwpAQCAtOTQ2LDEwICs5NDYsOCBAQAogCX0KIAogCWRldnByaXYtPnVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXZwcml2LT51cmIpIHsKLQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIkNvdWxkIG5vdCBhbGxvYy4gdXJiXG4iKTsKKwlpZiAoIWRldnByaXYtPnVyYikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJZGV2cHJpdi0+aW5idWYgPSBrbWFsbG9jKFNJWkVJTkJVRiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkZXZwcml2LT5pbmJ1ZikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy92bWs4MHh4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdm1rODB4eC5jCmluZGV4IDhjNzM5M2UuLmEwMDRhZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy92bWs4MHh4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3ZtazgweHguYwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAJICogVGhlIG1heCBwYWNrZXQgc2l6ZSBhdHRyaWJ1dGVzIG9mIHRoZSBLODA2MQogCSAqIGlucHV0L291dHB1dCBlbmRwb2ludHMgYXJlIGlkZW50aWNhbAogCSAqLwotCXNpemUgPSBsZTE2X3RvX2NwdShkZXZwcml2LT5lcF90eC0+d01heFBhY2tldFNpemUpOworCXNpemUgPSB1c2JfZW5kcG9pbnRfbWF4cChkZXZwcml2LT5lcF90eCk7CiAKIAl1c2JfYnVsa19tc2codXNiLCB0eF9waXBlLCBkZXZwcml2LT51c2JfdHhfYnVmLAogCQkgICAgIHNpemUsIE5VTEwsIGRldnByaXYtPmVwX3R4LT5iSW50ZXJ2YWwpOwpAQCAtMTk5LDcgKzE5OSw3IEBACiAJZXAgPSBkZXZwcml2LT5lcF9yeDsKIAlwaXBlID0gdXNiX3JjdmludHBpcGUodXNiLCBlcC0+YkVuZHBvaW50QWRkcmVzcyk7CiAJcmV0dXJuIHVzYl9pbnRlcnJ1cHRfbXNnKHVzYiwgcGlwZSwgZGV2cHJpdi0+dXNiX3J4X2J1ZiwKLQkJCQkgbGUxNl90b19jcHUoZXAtPndNYXhQYWNrZXRTaXplKSwgTlVMTCwKKwkJCQkgdXNiX2VuZHBvaW50X21heHAoZXApLCBOVUxMLAogCQkJCSBIWiAqIDEwKTsKIH0KIApAQCAtMjIwLDcgKzIyMCw3IEBACiAJZXAgPSBkZXZwcml2LT5lcF90eDsKIAlwaXBlID0gdXNiX3NuZGludHBpcGUodXNiLCBlcC0+YkVuZHBvaW50QWRkcmVzcyk7CiAJcmV0dXJuIHVzYl9pbnRlcnJ1cHRfbXNnKHVzYiwgcGlwZSwgZGV2cHJpdi0+dXNiX3R4X2J1ZiwKLQkJCQkgbGUxNl90b19jcHUoZXAtPndNYXhQYWNrZXRTaXplKSwgTlVMTCwKKwkJCQkgdXNiX2VuZHBvaW50X21heHAoZXApLCBOVUxMLAogCQkJCSBIWiAqIDEwKTsKIH0KIApAQCAtMjMwLDcgKzIzMCw3IEBACiAJc2l6ZV90IHNpemU7CiAJaW50IHJldHZhbDsKIAotCXNpemUgPSBsZTE2X3RvX2NwdShkZXZwcml2LT5lcF90eC0+d01heFBhY2tldFNpemUpOworCXNpemUgPSB1c2JfZW5kcG9pbnRfbWF4cChkZXZwcml2LT5lcF90eCk7CiAJbWVtc2V0KGRldnByaXYtPnVzYl90eF9idWYsIDAsIHNpemUpOwogCXJldHZhbCA9IHZtazgweHhfd3JpdGVfcGFja2V0KGRldiwgVk1LODA1NV9DTURfUlNUKTsKIAlpZiAocmV0dmFsKQpAQCAtNjg0LDEyICs2ODQsMTIgQEAKIAlzdHJ1Y3Qgdm1rODB4eF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXNpemVfdCBzaXplOwogCi0Jc2l6ZSA9IGxlMTZfdG9fY3B1KGRldnByaXYtPmVwX3J4LT53TWF4UGFja2V0U2l6ZSk7CisJc2l6ZSA9IHVzYl9lbmRwb2ludF9tYXhwKGRldnByaXYtPmVwX3J4KTsKIAlkZXZwcml2LT51c2JfcnhfYnVmID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldnByaXYtPnVzYl9yeF9idWYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jc2l6ZSA9IGxlMTZfdG9fY3B1KGRldnByaXYtPmVwX3R4LT53TWF4UGFja2V0U2l6ZSk7CisJc2l6ZSA9IHVzYl9lbmRwb2ludF9tYXhwKGRldnByaXYtPmVwX3R4KTsKIAlkZXZwcml2LT51c2JfdHhfYnVmID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldnByaXYtPnVzYl90eF9idWYpIHsKIAkJa2ZyZWUoZGV2cHJpdi0+dXNiX3J4X2J1Zik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2Nscy5jIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19jbHMuYwppbmRleCA0NmMwNTBjLi5hZWRjYTY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2Nscy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfY2xzLmMKQEAgLTI2LDU2ICsyNiw2IEBACiAjaW5jbHVkZSAiZGduY19jbHMuaCIKICNpbmNsdWRlICJkZ25jX3R0eS5oIgogCi1zdGF0aWMgaW5saW5lIHZvaWQgY2xzX3BhcnNlX2lzcihzdHJ1Y3QgZGduY19ib2FyZCAqYnJkLCB1aW50IHBvcnQpOwotc3RhdGljIGlubGluZSB2b2lkIGNsc19jbGVhcl9icmVhayhzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgaW50IGZvcmNlKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBjbHNfc2V0X2N0c19mbG93X2NvbnRyb2woc3RydWN0IGNoYW5uZWxfdCAqY2gpOwotc3RhdGljIGlubGluZSB2b2lkIGNsc19zZXRfcnRzX2Zsb3dfY29udHJvbChzdHJ1Y3QgY2hhbm5lbF90ICpjaCk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgY2xzX3NldF9peG9uX2Zsb3dfY29udHJvbChzdHJ1Y3QgY2hhbm5lbF90ICpjaCk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgY2xzX3NldF9peG9mZl9mbG93X2NvbnRyb2woc3RydWN0IGNoYW5uZWxfdCAqY2gpOwotc3RhdGljIGlubGluZSB2b2lkIGNsc19zZXRfbm9fb3V0cHV0X2Zsb3dfY29udHJvbChzdHJ1Y3QgY2hhbm5lbF90ICpjaCk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgY2xzX3NldF9ub19pbnB1dF9mbG93X2NvbnRyb2woc3RydWN0IGNoYW5uZWxfdCAqY2gpOwotc3RhdGljIHZvaWQgY2xzX3BhcnNlX21vZGVtKHN0cnVjdCBjaGFubmVsX3QgKmNoLCB1bnNpZ25lZCBjaGFyIHNpZ25hbHMpOwotc3RhdGljIHZvaWQgY2xzX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyB2b2lkIGNsc192cGQoc3RydWN0IGRnbmNfYm9hcmQgKmJyZCk7Ci1zdGF0aWMgdm9pZCBjbHNfdWFydF9pbml0KHN0cnVjdCBjaGFubmVsX3QgKmNoKTsKLXN0YXRpYyB2b2lkIGNsc191YXJ0X29mZihzdHJ1Y3QgY2hhbm5lbF90ICpjaCk7Ci1zdGF0aWMgaW50IGNsc19kcmFpbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1aW50IHNlY29uZHMpOwotc3RhdGljIHZvaWQgY2xzX3BhcmFtKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotc3RhdGljIHZvaWQgY2xzX2Fzc2VydF9tb2RlbV9zaWduYWxzKHN0cnVjdCBjaGFubmVsX3QgKmNoKTsKLXN0YXRpYyB2b2lkIGNsc19mbHVzaF91YXJ0X3dyaXRlKHN0cnVjdCBjaGFubmVsX3QgKmNoKTsKLXN0YXRpYyB2b2lkIGNsc19mbHVzaF91YXJ0X3JlYWQoc3RydWN0IGNoYW5uZWxfdCAqY2gpOwotc3RhdGljIHZvaWQgY2xzX2Rpc2FibGVfcmVjZWl2ZXIoc3RydWN0IGNoYW5uZWxfdCAqY2gpOwotc3RhdGljIHZvaWQgY2xzX2VuYWJsZV9yZWNlaXZlcihzdHJ1Y3QgY2hhbm5lbF90ICpjaCk7Ci1zdGF0aWMgdm9pZCBjbHNfc2VuZF9icmVhayhzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgaW50IG1zZWNzKTsKLXN0YXRpYyB2b2lkIGNsc19zZW5kX3N0YXJ0X2NoYXJhY3RlcihzdHJ1Y3QgY2hhbm5lbF90ICpjaCk7Ci1zdGF0aWMgdm9pZCBjbHNfc2VuZF9zdG9wX2NoYXJhY3RlcihzdHJ1Y3QgY2hhbm5lbF90ICpjaCk7Ci1zdGF0aWMgdm9pZCBjbHNfY29weV9kYXRhX2Zyb21fdWFydF90b19xdWV1ZShzdHJ1Y3QgY2hhbm5lbF90ICpjaCk7Ci1zdGF0aWMgdm9pZCBjbHNfY29weV9kYXRhX2Zyb21fcXVldWVfdG9fdWFydChzdHJ1Y3QgY2hhbm5lbF90ICpjaCk7Ci1zdGF0aWMgdWludCBjbHNfZ2V0X3VhcnRfYnl0ZXNfbGVmdChzdHJ1Y3QgY2hhbm5lbF90ICpjaCk7Ci1zdGF0aWMgdm9pZCBjbHNfc2VuZF9pbW1lZGlhdGVfY2hhcihzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgdW5zaWduZWQgY2hhcik7Ci1zdGF0aWMgaXJxcmV0dXJuX3QgY2xzX2ludHIoaW50IGlycSwgdm9pZCAqdm9pZGJyZCk7Ci0KLXN0cnVjdCBib2FyZF9vcHMgZGduY19jbHNfb3BzID0gewotCS50YXNrbGV0ID0JCQljbHNfdGFza2xldCwKLQkuaW50ciA9CQkJCWNsc19pbnRyLAotCS51YXJ0X2luaXQgPQkJCWNsc191YXJ0X2luaXQsCi0JLnVhcnRfb2ZmID0JCQljbHNfdWFydF9vZmYsCi0JLmRyYWluID0JCQljbHNfZHJhaW4sCi0JLnBhcmFtID0JCQljbHNfcGFyYW0sCi0JLnZwZCA9CQkJCWNsc192cGQsCi0JLmFzc2VydF9tb2RlbV9zaWduYWxzID0JCWNsc19hc3NlcnRfbW9kZW1fc2lnbmFscywKLQkuZmx1c2hfdWFydF93cml0ZSA9CQljbHNfZmx1c2hfdWFydF93cml0ZSwKLQkuZmx1c2hfdWFydF9yZWFkID0JCWNsc19mbHVzaF91YXJ0X3JlYWQsCi0JLmRpc2FibGVfcmVjZWl2ZXIgPQkJY2xzX2Rpc2FibGVfcmVjZWl2ZXIsCi0JLmVuYWJsZV9yZWNlaXZlciA9CQljbHNfZW5hYmxlX3JlY2VpdmVyLAotCS5zZW5kX2JyZWFrID0JCQljbHNfc2VuZF9icmVhaywKLQkuc2VuZF9zdGFydF9jaGFyYWN0ZXIgPQkJY2xzX3NlbmRfc3RhcnRfY2hhcmFjdGVyLAotCS5zZW5kX3N0b3BfY2hhcmFjdGVyID0JCWNsc19zZW5kX3N0b3BfY2hhcmFjdGVyLAotCS5jb3B5X2RhdGFfZnJvbV9xdWV1ZV90b191YXJ0ID0gY2xzX2NvcHlfZGF0YV9mcm9tX3F1ZXVlX3RvX3VhcnQsCi0JLmdldF91YXJ0X2J5dGVzX2xlZnQgPQkJY2xzX2dldF91YXJ0X2J5dGVzX2xlZnQsCi0JLnNlbmRfaW1tZWRpYXRlX2NoYXIgPQkJY2xzX3NlbmRfaW1tZWRpYXRlX2NoYXIKLX07Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBjbHNfc2V0X2N0c19mbG93X2NvbnRyb2woc3RydWN0IGNoYW5uZWxfdCAqY2gpCiB7CiAJdW5zaWduZWQgY2hhciBsY3JiID0gcmVhZGIoJmNoLT5jaF9jbHNfdWFydC0+bGNyKTsKQEAgLTM1Nyw2ICszMDcsMjUzIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKIH0KIAorc3RhdGljIHZvaWQgY2xzX2NvcHlfZGF0YV9mcm9tX3VhcnRfdG9fcXVldWUoc3RydWN0IGNoYW5uZWxfdCAqY2gpCit7CisJaW50IHFsZWZ0ID0gMDsKKwl1bnNpZ25lZCBjaGFyIGxpbmVzdGF0dXMgPSAwOworCXVuc2lnbmVkIGNoYXIgZXJyb3JfbWFzayA9IDA7CisJdXNob3J0IGhlYWQ7CisJdXNob3J0IHRhaWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHTkNfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7CisKKwkvKiBjYWNoZSBoZWFkIGFuZCB0YWlsIG9mIHF1ZXVlICovCisJaGVhZCA9IGNoLT5jaF9yX2hlYWQ7CisJdGFpbCA9IGNoLT5jaF9yX3RhaWw7CisKKwkvKiBTdG9yZSBob3cgbXVjaCBzcGFjZSB3ZSBoYXZlIGxlZnQgaW4gdGhlIHF1ZXVlICovCisJcWxlZnQgPSB0YWlsIC0gaGVhZCAtIDE7CisJaWYgKHFsZWZ0IDwgMCkKKwkJcWxlZnQgKz0gUlFVRVVFTUFTSyArIDE7CisKKwkvKgorCSAqIENyZWF0ZSBhIG1hc2sgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2Ugc2hvdWxkCisJICogaW5zZXJ0IHRoZSBjaGFyYWN0ZXIgKGlmIGFueSkgaW50byBvdXIgcXVldWUuCisJICovCisJaWYgKGNoLT5jaF9jX2lmbGFnICYgSUdOQlJLKQorCQllcnJvcl9tYXNrIHw9IFVBUlRfTFNSX0JJOworCisJd2hpbGUgKDEpIHsKKwkJbGluZXN0YXR1cyA9IHJlYWRiKCZjaC0+Y2hfY2xzX3VhcnQtPmxzcik7CisKKwkJaWYgKCEobGluZXN0YXR1cyAmIChVQVJUX0xTUl9EUikpKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogRGlzY2FyZCBjaGFyYWN0ZXIgaWYgd2UgYXJlIGlnbm9yaW5nIHRoZSBlcnJvciBtYXNrLgorCQkgKi8KKwkJaWYgKGxpbmVzdGF0dXMgJiBlcnJvcl9tYXNrKSAgeworCQkJbGluZXN0YXR1cyA9IDA7CisJCQlyZWFkYigmY2gtPmNoX2Nsc191YXJ0LT50eHJ4KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogSWYgb3VyIHF1ZXVlIGlzIGZ1bGwsIHdlIGhhdmUgbm8gY2hvaWNlIGJ1dCB0byBkcm9wIHNvbWUKKwkJICogZGF0YS4gVGhlIGFzc3VtcHRpb24gaXMgdGhhdCBIV0ZMT1cgb3IgU1dGTE9XIHNob3VsZCBoYXZlCisJCSAqIHN0b3BwZWQgdGhpbmdzIHdheSB3YXkgYmVmb3JlIHdlIGdvdCB0byB0aGlzIHBvaW50LgorCQkgKgorCQkgKiBJIGRlY2lkZWQgdGhhdCBJIHdhbnRlZCB0byBkaXRjaCB0aGUgb2xkZXN0IGRhdGEgZmlyc3QsCisJCSAqIEkgaG9wZSB0aGF0cyBva2F5IHdpdGggZXZlcnlvbmU/IFllcz8gR29vZC4KKwkJICovCisJCXdoaWxlIChxbGVmdCA8IDEpIHsKKwkJCXRhaWwgPSAodGFpbCArIDEpICYgUlFVRVVFTUFTSzsKKwkJCWNoLT5jaF9yX3RhaWwgPSB0YWlsOworCQkJY2gtPmNoX2Vycl9vdmVycnVuKys7CisJCQlxbGVmdCsrOworCQl9CisKKwkJY2gtPmNoX2VxdWV1ZVtoZWFkXSA9IGxpbmVzdGF0dXMgJiAoVUFSVF9MU1JfQkkgfCBVQVJUX0xTUl9QRQorCQkJCQkJCQkgfCBVQVJUX0xTUl9GRSk7CisJCWNoLT5jaF9ycXVldWVbaGVhZF0gPSByZWFkYigmY2gtPmNoX2Nsc191YXJ0LT50eHJ4KTsKKworCQlxbGVmdC0tOworCisJCWlmIChjaC0+Y2hfZXF1ZXVlW2hlYWRdICYgVUFSVF9MU1JfUEUpCisJCQljaC0+Y2hfZXJyX3Bhcml0eSsrOworCQlpZiAoY2gtPmNoX2VxdWV1ZVtoZWFkXSAmIFVBUlRfTFNSX0JJKQorCQkJY2gtPmNoX2Vycl9icmVhaysrOworCQlpZiAoY2gtPmNoX2VxdWV1ZVtoZWFkXSAmIFVBUlRfTFNSX0ZFKQorCQkJY2gtPmNoX2Vycl9mcmFtZSsrOworCisJCS8qIEFkZCB0bywgYW5kIGZsaXAgaGVhZCBpZiBuZWVkZWQgKi8KKwkJaGVhZCA9IChoZWFkICsgMSkgJiBSUVVFVUVNQVNLOworCQljaC0+Y2hfcnhjb3VudCsrOworCX0KKworCS8qCisJICogV3JpdGUgbmV3IGZpbmFsIGhlYWRzIHRvIGNoYW5uZWwgc3RydWN0dXJlLgorCSAqLworCWNoLT5jaF9yX2hlYWQgPSBoZWFkICYgUlFVRVVFTUFTSzsKKwljaC0+Y2hfZV9oZWFkID0gaGVhZCAmIEVRVUVVRU1BU0s7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOworfQorCisvKiBNYWtlIHRoZSBVQVJUIHJhaXNlIGFueSBvZiB0aGUgb3V0cHV0IHNpZ25hbHMgd2Ugd2FudCB1cCAqLworc3RhdGljIHZvaWQgY2xzX2Fzc2VydF9tb2RlbV9zaWduYWxzKHN0cnVjdCBjaGFubmVsX3QgKmNoKQoreworCXVuc2lnbmVkIGNoYXIgb3V0OworCisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdOQ19DSEFOTkVMX01BR0lDKQorCQlyZXR1cm47CisKKwlvdXQgPSBjaC0+Y2hfbW9zdGF0OworCisJaWYgKGNoLT5jaF9mbGFncyAmIENIX0xPT1BCQUNLKQorCQlvdXQgfD0gVUFSVF9NQ1JfTE9PUDsKKworCXdyaXRlYihvdXQsICZjaC0+Y2hfY2xzX3VhcnQtPm1jcik7CisKKwkvKiBHaXZlIHRpbWUgZm9yIHRoZSBVQVJUIHRvIGFjdHVhbGx5IGRyb3AgdGhlIHNpZ25hbHMgKi8KKwl1ZGVsYXkoMTApOworfQorCitzdGF0aWMgdm9pZCBjbHNfY29weV9kYXRhX2Zyb21fcXVldWVfdG9fdWFydChzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKK3sKKwl1c2hvcnQgaGVhZDsKKwl1c2hvcnQgdGFpbDsKKwlpbnQgbjsKKwlpbnQgcWxlbjsKKwl1aW50IGxlbl93cml0dGVuID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdOQ19DSEFOTkVMX01BR0lDKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKKworCS8qIE5vIGRhdGEgdG8gd3JpdGUgdG8gdGhlIFVBUlQgKi8KKwlpZiAoY2gtPmNoX3dfdGFpbCA9PSBjaC0+Y2hfd19oZWFkKQorCQlnb3RvIGV4aXRfdW5sb2NrOworCisJLyogSWYgcG9ydCBpcyAic3RvcHBlZCIsIGRvbid0IHNlbmQgYW55IGRhdGEgdG8gdGhlIFVBUlQgKi8KKwlpZiAoKGNoLT5jaF9mbGFncyAmIENIX0ZPUkNFRF9TVE9QKSB8fAorCSAgICAoY2gtPmNoX2ZsYWdzICYgQ0hfQlJFQUtfU0VORElORykpCisJCWdvdG8gZXhpdF91bmxvY2s7CisKKwlpZiAoIShjaC0+Y2hfZmxhZ3MgJiAoQ0hfVFhfRklGT19FTVBUWSB8IENIX1RYX0ZJRk9fTFdNKSkpCisJCWdvdG8gZXhpdF91bmxvY2s7CisKKwluID0gMzI7CisKKwkvKiBjYWNoZSBoZWFkIGFuZCB0YWlsIG9mIHF1ZXVlICovCisJaGVhZCA9IGNoLT5jaF93X2hlYWQgJiBXUVVFVUVNQVNLOworCXRhaWwgPSBjaC0+Y2hfd190YWlsICYgV1FVRVVFTUFTSzsKKwlxbGVuID0gKGhlYWQgLSB0YWlsKSAmIFdRVUVVRU1BU0s7CisKKwkvKiBGaW5kIG1pbmltdW0gb2YgdGhlIEZJRk8gc3BhY2UsIHZlcnN1cyBxdWV1ZSBsZW5ndGggKi8KKwluID0gbWluKG4sIHFsZW4pOworCisJd2hpbGUgKG4gPiAwKSB7CisJCS8qCisJCSAqIElmIFJUUyBUb2dnbGUgbW9kZSBpcyBvbiwgdHVybiBvbiBSVFMgbm93IGlmIG5vdCBhbHJlYWR5IHNldCwKKwkJICogYW5kIG1ha2Ugc3VyZSB3ZSBnZXQgYW4gZXZlbnQgd2hlbiB0aGUgZGF0YSB0cmFuc2ZlciBoYXMKKwkJICogY29tcGxldGVkLgorCQkgKi8KKwkJaWYgKGNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MgJiBESUdJX1JUU19UT0dHTEUpIHsKKwkJCWlmICghKGNoLT5jaF9tb3N0YXQgJiBVQVJUX01DUl9SVFMpKSB7CisJCQkJY2gtPmNoX21vc3RhdCB8PSAoVUFSVF9NQ1JfUlRTKTsKKwkJCQljbHNfYXNzZXJ0X21vZGVtX3NpZ25hbHMoY2gpOworCQkJfQorCQkJY2gtPmNoX3R1bi51bl9mbGFncyB8PSAoVU5fRU1QVFkpOworCQl9CisKKwkJLyoKKwkJICogSWYgRFRSIFRvZ2dsZSBtb2RlIGlzIG9uLCB0dXJuIG9uIERUUiBub3cgaWYgbm90IGFscmVhZHkgc2V0LAorCQkgKiBhbmQgbWFrZSBzdXJlIHdlIGdldCBhbiBldmVudCB3aGVuIHRoZSBkYXRhIHRyYW5zZmVyIGhhcworCQkgKiBjb21wbGV0ZWQuCisJCSAqLworCQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERJR0lfRFRSX1RPR0dMRSkgeworCQkJaWYgKCEoY2gtPmNoX21vc3RhdCAmIFVBUlRfTUNSX0RUUikpIHsKKwkJCQljaC0+Y2hfbW9zdGF0IHw9IChVQVJUX01DUl9EVFIpOworCQkJCWNsc19hc3NlcnRfbW9kZW1fc2lnbmFscyhjaCk7CisJCQl9CisJCQljaC0+Y2hfdHVuLnVuX2ZsYWdzIHw9IChVTl9FTVBUWSk7CisJCX0KKwkJd3JpdGViKGNoLT5jaF93cXVldWVbY2gtPmNoX3dfdGFpbF0sICZjaC0+Y2hfY2xzX3VhcnQtPnR4cngpOworCQljaC0+Y2hfd190YWlsKys7CisJCWNoLT5jaF93X3RhaWwgJj0gV1FVRVVFTUFTSzsKKwkJY2gtPmNoX3R4Y291bnQrKzsKKwkJbGVuX3dyaXR0ZW4rKzsKKwkJbi0tOworCX0KKworCWlmIChsZW5fd3JpdHRlbiA+IDApCisJCWNoLT5jaF9mbGFncyAmPSB+KENIX1RYX0ZJRk9fRU1QVFkgfCBDSF9UWF9GSUZPX0xXTSk7CisKK2V4aXRfdW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGNsc19wYXJzZV9tb2RlbShzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgdW5zaWduZWQgY2hhciBzaWduYWxzKQoreworCXVuc2lnbmVkIGNoYXIgbXNpZ25hbHMgPSBzaWduYWxzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER05DX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybjsKKworCS8qCisJICogRG8gYWx0cGluIHN3aXRjaGluZy4gQWx0cGluIHN3aXRjaGVzIERDRCBhbmQgRFNSLgorCSAqIFRoaXMgcHJvbGx5IGJyZWFrcyBEU1JQQUNFLCBzbyB3ZSBzaG91bGQgYmUgbW9yZSBjbGV2ZXIgaGVyZS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKKwlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERJR0lfQUxUUElOKSB7CisJCXVuc2lnbmVkIGNoYXIgbXN3YXAgPSBzaWduYWxzOworCisJCWlmIChtc3dhcCAmIFVBUlRfTVNSX0REQ0QpIHsKKwkJCW1zaWduYWxzICY9IH5VQVJUX01TUl9ERENEOworCQkJbXNpZ25hbHMgfD0gVUFSVF9NU1JfRERTUjsKKwkJfQorCQlpZiAobXN3YXAgJiBVQVJUX01TUl9ERFNSKSB7CisJCQltc2lnbmFscyAmPSB+VUFSVF9NU1JfRERTUjsKKwkJCW1zaWduYWxzIHw9IFVBUlRfTVNSX0REQ0Q7CisJCX0KKwkJaWYgKG1zd2FwICYgVUFSVF9NU1JfRENEKSB7CisJCQltc2lnbmFscyAmPSB+VUFSVF9NU1JfRENEOworCQkJbXNpZ25hbHMgfD0gVUFSVF9NU1JfRFNSOworCQl9CisJCWlmIChtc3dhcCAmIFVBUlRfTVNSX0RTUikgeworCQkJbXNpZ25hbHMgJj0gflVBUlRfTVNSX0RTUjsKKwkJCW1zaWduYWxzIHw9IFVBUlRfTVNSX0RDRDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBTY3J1YiBvZmYgbG93ZXIgYml0cy4gVGhleSBzaWduaWZ5IGRlbHRhJ3MsIHdoaWNoIEkgZG9uJ3QKKwkgKiBjYXJlIGFib3V0CisJICovCisJc2lnbmFscyAmPSAweGYwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7CisJaWYgKG1zaWduYWxzICYgVUFSVF9NU1JfRENEKQorCQljaC0+Y2hfbWlzdGF0IHw9IFVBUlRfTVNSX0RDRDsKKwllbHNlCisJCWNoLT5jaF9taXN0YXQgJj0gflVBUlRfTVNSX0RDRDsKKworCWlmIChtc2lnbmFscyAmIFVBUlRfTVNSX0RTUikKKwkJY2gtPmNoX21pc3RhdCB8PSBVQVJUX01TUl9EU1I7CisJZWxzZQorCQljaC0+Y2hfbWlzdGF0ICY9IH5VQVJUX01TUl9EU1I7CisKKwlpZiAobXNpZ25hbHMgJiBVQVJUX01TUl9SSSkKKwkJY2gtPmNoX21pc3RhdCB8PSBVQVJUX01TUl9SSTsKKwllbHNlCisJCWNoLT5jaF9taXN0YXQgJj0gflVBUlRfTVNSX1JJOworCisJaWYgKG1zaWduYWxzICYgVUFSVF9NU1JfQ1RTKQorCQljaC0+Y2hfbWlzdGF0IHw9IFVBUlRfTVNSX0NUUzsKKwllbHNlCisJCWNoLT5jaF9taXN0YXQgJj0gflVBUlRfTVNSX0NUUzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOworfQorCiAvKiBQYXJzZSB0aGUgSVNSIHJlZ2lzdGVyIGZvciB0aGUgc3BlY2lmaWMgcG9ydCAqLwogc3RhdGljIGlubGluZSB2b2lkIGNsc19wYXJzZV9pc3Ioc3RydWN0IGRnbmNfYm9hcmQgKmJyZCwgdWludCBwb3J0KQogewpAQCAtMzg3LDggKzU4NCw2IEBACiAJCS8qIFJlY2VpdmUgSW50ZXJydXB0IHBlbmRpbmcgKi8KIAkJaWYgKGlzciAmIChVQVJUX0lJUl9SREkgfCBVQVJUX0lJUl9SRElfVElNRU9VVCkpIHsKIAkJCS8qIFJlYWQgZGF0YSBmcm9tIHVhcnQgLT4gcXVldWUgKi8KLQkJCWJyZC0+aW50cl9yeCsrOwotCQkJY2gtPmNoX2ludHJfcngrKzsKIAkJCWNsc19jb3B5X2RhdGFfZnJvbV91YXJ0X3RvX3F1ZXVlKGNoKTsKIAkJCWRnbmNfY2hlY2tfcXVldWVfZmxvd19jb250cm9sKGNoKTsKIAkJfQpAQCAtMzk4LDI3ICs1OTMsNDggQEAKIAkJCS8qIFRyYW5zZmVyIGRhdGEgKGlmIGFueSkgZnJvbSBXcml0ZSBRdWV1ZSAtPiBVQVJULiAqLwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7CiAJCQljaC0+Y2hfZmxhZ3MgfD0gKENIX1RYX0ZJRk9fRU1QVFkgfCBDSF9UWF9GSUZPX0xXTSk7Ci0JCQlicmQtPmludHJfdHgrKzsKLQkJCWNoLT5jaF9pbnRyX3R4Kys7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwogCQkJY2xzX2NvcHlfZGF0YV9mcm9tX3F1ZXVlX3RvX3VhcnQoY2gpOwogCQl9CiAKLQkJLyogQ1RTL1JUUyBjaGFuZ2Ugb2Ygc3RhdGUgKi8KLQkJaWYgKGlzciAmIFVBUlRfSUlSX0NUU1JUUykgewotCQkJYnJkLT5pbnRyX21vZGVtKys7Ci0JCQljaC0+Y2hfaW50cl9tb2RlbSsrOwotCQkJLyoKLQkJCSAqIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcsIHRoZSBjbHNfcGFyc2VfbW9kZW0KLQkJCSAqIGJlbG93IHdpbGwgZ3JhYiB0aGUgdXBkYXRlZCBtb2RlbSBzaWduYWxzLgotCQkJICovCi0JCX0KLQogCQkvKiBQYXJzZSBhbnkgbW9kZW0gc2lnbmFsIGNoYW5nZXMgKi8KIAkJY2xzX3BhcnNlX21vZGVtKGNoLCByZWFkYigmY2gtPmNoX2Nsc191YXJ0LT5tc3IpKTsKIAl9CiB9CiAKKy8qIENoYW5uZWwgbG9jayBNVVNUIGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiEgKi8KK3N0YXRpYyB2b2lkIGNsc19mbHVzaF91YXJ0X3dyaXRlKHN0cnVjdCBjaGFubmVsX3QgKmNoKQoreworCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHTkNfQ0hBTk5FTF9NQUdJQykKKwkJcmV0dXJuOworCisJd3JpdGViKChVQVJUX0ZDUl9FTkFCTEVfRklGTyB8IFVBUlRfRkNSX0NMRUFSX1hNSVQpLAorCSAgICAgICAmY2gtPmNoX2Nsc191YXJ0LT5pc3JfZmNyKTsKKwl1c2xlZXBfcmFuZ2UoMTAsIDIwKTsKKworCWNoLT5jaF9mbGFncyB8PSAoQ0hfVFhfRklGT19FTVBUWSB8IENIX1RYX0ZJRk9fTFdNKTsKK30KKworLyogQ2hhbm5lbCBsb2NrIE1VU1QgYmUgaGVsZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uISAqLworc3RhdGljIHZvaWQgY2xzX2ZsdXNoX3VhcnRfcmVhZChzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKK3sKKwlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER05DX0NIQU5ORUxfTUFHSUMpCisJCXJldHVybjsKKworCS8qCisJICogRm9yIGNvbXBsZXRlIFBPU0lYIGNvbXBhdGliaWxpdHksIHdlIHNob3VsZCBiZSBwdXJnaW5nIHRoZQorCSAqIHJlYWQgRklGTyBpbiB0aGUgVUFSVCBoZXJlLgorCSAqCisJICogSG93ZXZlciwgY2xlYXJpbmcgdGhlIHJlYWQgRklGTyAoVUFSVF9GQ1JfQ0xFQVJfUkNWUikgYWxzbworCSAqIGluY29ycmVjdGx5IGZsdXNoZXMgd3JpdGUgZGF0YSBhcyB3ZWxsIGFzIGp1c3QgYmFzaWNhbGx5IHRyYXNoaW5nIHRoZQorCSAqIEZJRk8uCisJICoKKwkgKiBQcmVzdW1hYmx5LCB0aGlzIGlzIGEgYnVnIGluIHRoaXMgVUFSVC4KKwkgKi8KKworCXVkZWxheSgxMCk7Cit9CisKIC8qCiAgKiBjbHNfcGFyYW0oKQogICogU2VuZCBhbnkvYWxsIGNoYW5nZXMgdG8gdGhlIGxpbmUgdG8gdGhlIFVBUlQuCkBAIC03NjAsOCArOTc2LDYgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZicmQtPmJkX2ludHJfbG9jaywgZmxhZ3MpOwogCi0JYnJkLT5pbnRyX2NvdW50Kys7Ci0KIAkvKgogCSAqIENoZWNrIHRoZSBib2FyZCdzIGdsb2JhbCBpbnRlcnJ1cHQgb2Zmc2V0IHRvIHNlZSBpZiB3ZQogCSAqIHdlIGFjdHVhbGx5IGRvIGhhdmUgYW4gaW50ZXJydXB0IHBlbmRpbmcgZm9yIHVzLgpAQCAtODA0LDkzICsxMDE4LDYgQEAKIAl3cml0ZWIodG1wLCAmY2gtPmNoX2Nsc191YXJ0LT5pZXIpOwogfQogCi1zdGF0aWMgdm9pZCBjbHNfY29weV9kYXRhX2Zyb21fdWFydF90b19xdWV1ZShzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKLXsKLQlpbnQgcWxlZnQgPSAwOwotCXVuc2lnbmVkIGNoYXIgbGluZXN0YXR1cyA9IDA7Ci0JdW5zaWduZWQgY2hhciBlcnJvcl9tYXNrID0gMDsKLQl1c2hvcnQgaGVhZDsKLQl1c2hvcnQgdGFpbDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdOQ19DSEFOTkVMX01BR0lDKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKLQotCS8qIGNhY2hlIGhlYWQgYW5kIHRhaWwgb2YgcXVldWUgKi8KLQloZWFkID0gY2gtPmNoX3JfaGVhZDsKLQl0YWlsID0gY2gtPmNoX3JfdGFpbDsKLQotCS8qIFN0b3JlIGhvdyBtdWNoIHNwYWNlIHdlIGhhdmUgbGVmdCBpbiB0aGUgcXVldWUgKi8KLQlxbGVmdCA9IHRhaWwgLSBoZWFkIC0gMTsKLQlpZiAocWxlZnQgPCAwKQotCQlxbGVmdCArPSBSUVVFVUVNQVNLICsgMTsKLQotCS8qCi0JICogQ3JlYXRlIGEgbWFzayB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSBzaG91bGQKLQkgKiBpbnNlcnQgdGhlIGNoYXJhY3RlciAoaWYgYW55KSBpbnRvIG91ciBxdWV1ZS4KLQkgKi8KLQlpZiAoY2gtPmNoX2NfaWZsYWcgJiBJR05CUkspCi0JCWVycm9yX21hc2sgfD0gVUFSVF9MU1JfQkk7Ci0KLQl3aGlsZSAoMSkgewotCQlsaW5lc3RhdHVzID0gcmVhZGIoJmNoLT5jaF9jbHNfdWFydC0+bHNyKTsKLQotCQlpZiAoIShsaW5lc3RhdHVzICYgKFVBUlRfTFNSX0RSKSkpCi0JCQlicmVhazsKLQotCQkvKgotCQkgKiBEaXNjYXJkIGNoYXJhY3RlciBpZiB3ZSBhcmUgaWdub3JpbmcgdGhlIGVycm9yIG1hc2suCi0JCSovCi0JCWlmIChsaW5lc3RhdHVzICYgZXJyb3JfbWFzaykgIHsKLQkJCWxpbmVzdGF0dXMgPSAwOwotCQkJcmVhZGIoJmNoLT5jaF9jbHNfdWFydC0+dHhyeCk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qCi0JCSAqIElmIG91ciBxdWV1ZSBpcyBmdWxsLCB3ZSBoYXZlIG5vIGNob2ljZSBidXQgdG8gZHJvcCBzb21lCi0JCSAqIGRhdGEuIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgSFdGTE9XIG9yIFNXRkxPVyBzaG91bGQgaGF2ZQotCQkgKiBzdG9wcGVkIHRoaW5ncyB3YXkgd2F5IGJlZm9yZSB3ZSBnb3QgdG8gdGhpcyBwb2ludC4KLQkJICoKLQkJICogSSBkZWNpZGVkIHRoYXQgSSB3YW50ZWQgdG8gZGl0Y2ggdGhlIG9sZGVzdCBkYXRhIGZpcnN0LAotCQkgKiBJIGhvcGUgdGhhdHMgb2theSB3aXRoIGV2ZXJ5b25lPyBZZXM/IEdvb2QuCi0JCSAqLwotCQl3aGlsZSAocWxlZnQgPCAxKSB7Ci0JCQl0YWlsID0gKHRhaWwgKyAxKSAmIFJRVUVVRU1BU0s7Ci0JCQljaC0+Y2hfcl90YWlsID0gdGFpbDsKLQkJCWNoLT5jaF9lcnJfb3ZlcnJ1bisrOwotCQkJcWxlZnQrKzsKLQkJfQotCi0JCWNoLT5jaF9lcXVldWVbaGVhZF0gPSBsaW5lc3RhdHVzICYgKFVBUlRfTFNSX0JJIHwgVUFSVF9MU1JfUEUKLQkJCQkJCQkJIHwgVUFSVF9MU1JfRkUpOwotCQljaC0+Y2hfcnF1ZXVlW2hlYWRdID0gcmVhZGIoJmNoLT5jaF9jbHNfdWFydC0+dHhyeCk7Ci0KLQkJcWxlZnQtLTsKLQotCQlpZiAoY2gtPmNoX2VxdWV1ZVtoZWFkXSAmIFVBUlRfTFNSX1BFKQotCQkJY2gtPmNoX2Vycl9wYXJpdHkrKzsKLQkJaWYgKGNoLT5jaF9lcXVldWVbaGVhZF0gJiBVQVJUX0xTUl9CSSkKLQkJCWNoLT5jaF9lcnJfYnJlYWsrKzsKLQkJaWYgKGNoLT5jaF9lcXVldWVbaGVhZF0gJiBVQVJUX0xTUl9GRSkKLQkJCWNoLT5jaF9lcnJfZnJhbWUrKzsKLQotCQkvKiBBZGQgdG8sIGFuZCBmbGlwIGhlYWQgaWYgbmVlZGVkICovCi0JCWhlYWQgPSAoaGVhZCArIDEpICYgUlFVRVVFTUFTSzsKLQkJY2gtPmNoX3J4Y291bnQrKzsKLQl9Ci0KLQkvKgotCSAqIFdyaXRlIG5ldyBmaW5hbCBoZWFkcyB0byBjaGFubmVsIHN0cnVjdHVyZS4KLQkgKi8KLQljaC0+Y2hfcl9oZWFkID0gaGVhZCAmIFJRVUVVRU1BU0s7Ci0JY2gtPmNoX2VfaGVhZCA9IGhlYWQgJiBFUVVFVUVNQVNLOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKLX0KLQogLyoKICAqIFRoaXMgZnVuY3Rpb24gYmFzaWNhbGx5IGdvZXMgdG8gc2xlZXAgZm9yIHNlY3MsIG9yIHVudGlsCiAgKiBpdCBnZXRzIHNpZ25hbGxlZCB0aGF0IHRoZSBwb3J0IGhhcyBmdWxseSBkcmFpbmVkLgpAQCAtOTI2LDE5OSArMTA1Myw2IEBACiAJCQkJCSAoKHVuLT51bl9mbGFncyAmIFVOX0VNUFRZKSA9PSAwKSk7CiB9CiAKLS8qIENoYW5uZWwgbG9jayBNVVNUIGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiEgKi8KLXN0YXRpYyB2b2lkIGNsc19mbHVzaF91YXJ0X3dyaXRlKHN0cnVjdCBjaGFubmVsX3QgKmNoKQotewotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHTkNfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuOwotCi0Jd3JpdGViKChVQVJUX0ZDUl9FTkFCTEVfRklGTyB8IFVBUlRfRkNSX0NMRUFSX1hNSVQpLAotCSAgICAgICAmY2gtPmNoX2Nsc191YXJ0LT5pc3JfZmNyKTsKLQl1c2xlZXBfcmFuZ2UoMTAsIDIwKTsKLQotCWNoLT5jaF9mbGFncyB8PSAoQ0hfVFhfRklGT19FTVBUWSB8IENIX1RYX0ZJRk9fTFdNKTsKLX0KLQotLyogQ2hhbm5lbCBsb2NrIE1VU1QgYmUgaGVsZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uISAqLwotc3RhdGljIHZvaWQgY2xzX2ZsdXNoX3VhcnRfcmVhZChzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKLXsKLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER05DX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybjsKLQotCS8qCi0JICogRm9yIGNvbXBsZXRlIFBPU0lYIGNvbXBhdGliaWxpdHksIHdlIHNob3VsZCBiZSBwdXJnaW5nIHRoZQotCSAqIHJlYWQgRklGTyBpbiB0aGUgVUFSVCBoZXJlLgotCSAqCi0JICogSG93ZXZlciwgY2xlYXJpbmcgdGhlIHJlYWQgRklGTyAoVUFSVF9GQ1JfQ0xFQVJfUkNWUikgYWxzbwotCSAqIGluY29ycmVjdGx5IGZsdXNoZXMgd3JpdGUgZGF0YSBhcyB3ZWxsIGFzIGp1c3QgYmFzaWNhbGx5IHRyYXNoaW5nIHRoZQotCSAqIEZJRk8uCi0JICoKLQkgKiBQcmVzdW1hYmx5LCB0aGlzIGlzIGEgYnVnIGluIHRoaXMgVUFSVC4KLQkgKi8KLQotCXVkZWxheSgxMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsc19jb3B5X2RhdGFfZnJvbV9xdWV1ZV90b191YXJ0KHN0cnVjdCBjaGFubmVsX3QgKmNoKQotewotCXVzaG9ydCBoZWFkOwotCXVzaG9ydCB0YWlsOwotCWludCBuOwotCWludCBxbGVuOwotCXVpbnQgbGVuX3dyaXR0ZW4gPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER05DX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwotCi0JLyogTm8gZGF0YSB0byB3cml0ZSB0byB0aGUgVUFSVCAqLwotCWlmIChjaC0+Y2hfd190YWlsID09IGNoLT5jaF93X2hlYWQpCi0JCWdvdG8gZXhpdF91bmxvY2s7Ci0KLQkvKiBJZiBwb3J0IGlzICJzdG9wcGVkIiwgZG9uJ3Qgc2VuZCBhbnkgZGF0YSB0byB0aGUgVUFSVCAqLwotCWlmICgoY2gtPmNoX2ZsYWdzICYgQ0hfRk9SQ0VEX1NUT1ApIHx8Ci0JICAgIChjaC0+Y2hfZmxhZ3MgJiBDSF9CUkVBS19TRU5ESU5HKSkKLQkJZ290byBleGl0X3VubG9jazsKLQotCWlmICghKGNoLT5jaF9mbGFncyAmIChDSF9UWF9GSUZPX0VNUFRZIHwgQ0hfVFhfRklGT19MV00pKSkKLQkJZ290byBleGl0X3VubG9jazsKLQotCW4gPSAzMjsKLQotCS8qIGNhY2hlIGhlYWQgYW5kIHRhaWwgb2YgcXVldWUgKi8KLQloZWFkID0gY2gtPmNoX3dfaGVhZCAmIFdRVUVVRU1BU0s7Ci0JdGFpbCA9IGNoLT5jaF93X3RhaWwgJiBXUVVFVUVNQVNLOwotCXFsZW4gPSAoaGVhZCAtIHRhaWwpICYgV1FVRVVFTUFTSzsKLQotCS8qIEZpbmQgbWluaW11bSBvZiB0aGUgRklGTyBzcGFjZSwgdmVyc3VzIHF1ZXVlIGxlbmd0aCAqLwotCW4gPSBtaW4obiwgcWxlbik7Ci0KLQl3aGlsZSAobiA+IDApIHsKLQkJLyoKLQkJICogSWYgUlRTIFRvZ2dsZSBtb2RlIGlzIG9uLCB0dXJuIG9uIFJUUyBub3cgaWYgbm90IGFscmVhZHkgc2V0LAotCQkgKiBhbmQgbWFrZSBzdXJlIHdlIGdldCBhbiBldmVudCB3aGVuIHRoZSBkYXRhIHRyYW5zZmVyIGhhcwotCQkgKiBjb21wbGV0ZWQuCi0JCSAqLwotCQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERJR0lfUlRTX1RPR0dMRSkgewotCQkJaWYgKCEoY2gtPmNoX21vc3RhdCAmIFVBUlRfTUNSX1JUUykpIHsKLQkJCQljaC0+Y2hfbW9zdGF0IHw9IChVQVJUX01DUl9SVFMpOwotCQkJCWNsc19hc3NlcnRfbW9kZW1fc2lnbmFscyhjaCk7Ci0JCQl9Ci0JCQljaC0+Y2hfdHVuLnVuX2ZsYWdzIHw9IChVTl9FTVBUWSk7Ci0JCX0KLQotCQkvKgotCQkgKiBJZiBEVFIgVG9nZ2xlIG1vZGUgaXMgb24sIHR1cm4gb24gRFRSIG5vdyBpZiBub3QgYWxyZWFkeSBzZXQsCi0JCSAqIGFuZCBtYWtlIHN1cmUgd2UgZ2V0IGFuIGV2ZW50IHdoZW4gdGhlIGRhdGEgdHJhbnNmZXIgaGFzCi0JCSAqIGNvbXBsZXRlZC4KLQkJICovCi0JCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9EVFJfVE9HR0xFKSB7Ci0JCQlpZiAoIShjaC0+Y2hfbW9zdGF0ICYgVUFSVF9NQ1JfRFRSKSkgewotCQkJCWNoLT5jaF9tb3N0YXQgfD0gKFVBUlRfTUNSX0RUUik7Ci0JCQkJY2xzX2Fzc2VydF9tb2RlbV9zaWduYWxzKGNoKTsKLQkJCX0KLQkJCWNoLT5jaF90dW4udW5fZmxhZ3MgfD0gKFVOX0VNUFRZKTsKLQkJfQotCQl3cml0ZWIoY2gtPmNoX3dxdWV1ZVtjaC0+Y2hfd190YWlsXSwgJmNoLT5jaF9jbHNfdWFydC0+dHhyeCk7Ci0JCWNoLT5jaF93X3RhaWwrKzsKLQkJY2gtPmNoX3dfdGFpbCAmPSBXUVVFVUVNQVNLOwotCQljaC0+Y2hfdHhjb3VudCsrOwotCQlsZW5fd3JpdHRlbisrOwotCQluLS07Ci0JfQotCi0JaWYgKGxlbl93cml0dGVuID4gMCkKLQkJY2gtPmNoX2ZsYWdzICY9IH4oQ0hfVFhfRklGT19FTVBUWSB8IENIX1RYX0ZJRk9fTFdNKTsKLQotZXhpdF91bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgY2xzX3BhcnNlX21vZGVtKHN0cnVjdCBjaGFubmVsX3QgKmNoLCB1bnNpZ25lZCBjaGFyIHNpZ25hbHMpCi17Ci0JdW5zaWduZWQgY2hhciBtc2lnbmFscyA9IHNpZ25hbHM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghY2ggfHwgY2gtPm1hZ2ljICE9IERHTkNfQ0hBTk5FTF9NQUdJQykKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBEbyBhbHRwaW4gc3dpdGNoaW5nLiBBbHRwaW4gc3dpdGNoZXMgRENEIGFuZCBEU1IuCi0JICogVGhpcyBwcm9sbHkgYnJlYWtzIERTUlBBQ0UsIHNvIHdlIHNob3VsZCBiZSBtb3JlIGNsZXZlciBoZXJlLgotCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwotCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9BTFRQSU4pIHsKLQkJdW5zaWduZWQgY2hhciBtc3dhcCA9IHNpZ25hbHM7Ci0KLQkJaWYgKG1zd2FwICYgVUFSVF9NU1JfRERDRCkgewotCQkJbXNpZ25hbHMgJj0gflVBUlRfTVNSX0REQ0Q7Ci0JCQltc2lnbmFscyB8PSBVQVJUX01TUl9ERFNSOwotCQl9Ci0JCWlmIChtc3dhcCAmIFVBUlRfTVNSX0REU1IpIHsKLQkJCW1zaWduYWxzICY9IH5VQVJUX01TUl9ERFNSOwotCQkJbXNpZ25hbHMgfD0gVUFSVF9NU1JfRERDRDsKLQkJfQotCQlpZiAobXN3YXAgJiBVQVJUX01TUl9EQ0QpIHsKLQkJCW1zaWduYWxzICY9IH5VQVJUX01TUl9EQ0Q7Ci0JCQltc2lnbmFscyB8PSBVQVJUX01TUl9EU1I7Ci0JCX0KLQkJaWYgKG1zd2FwICYgVUFSVF9NU1JfRFNSKSB7Ci0JCQltc2lnbmFscyAmPSB+VUFSVF9NU1JfRFNSOwotCQkJbXNpZ25hbHMgfD0gVUFSVF9NU1JfRENEOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7Ci0KLQkvKgotCSAqIFNjcnViIG9mZiBsb3dlciBiaXRzLiBUaGV5IHNpZ25pZnkgZGVsdGEncywgd2hpY2ggSSBkb24ndAotCSAqIGNhcmUgYWJvdXQKLQkgKi8KLQlzaWduYWxzICY9IDB4ZjA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKLQlpZiAobXNpZ25hbHMgJiBVQVJUX01TUl9EQ0QpCi0JCWNoLT5jaF9taXN0YXQgfD0gVUFSVF9NU1JfRENEOwotCWVsc2UKLQkJY2gtPmNoX21pc3RhdCAmPSB+VUFSVF9NU1JfRENEOwotCi0JaWYgKG1zaWduYWxzICYgVUFSVF9NU1JfRFNSKQotCQljaC0+Y2hfbWlzdGF0IHw9IFVBUlRfTVNSX0RTUjsKLQllbHNlCi0JCWNoLT5jaF9taXN0YXQgJj0gflVBUlRfTVNSX0RTUjsKLQotCWlmIChtc2lnbmFscyAmIFVBUlRfTVNSX1JJKQotCQljaC0+Y2hfbWlzdGF0IHw9IFVBUlRfTVNSX1JJOwotCWVsc2UKLQkJY2gtPmNoX21pc3RhdCAmPSB+VUFSVF9NU1JfUkk7Ci0KLQlpZiAobXNpZ25hbHMgJiBVQVJUX01TUl9DVFMpCi0JCWNoLT5jaF9taXN0YXQgfD0gVUFSVF9NU1JfQ1RTOwotCWVsc2UKLQkJY2gtPmNoX21pc3RhdCAmPSB+VUFSVF9NU1JfQ1RTOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7Ci19Ci0KLS8qIE1ha2UgdGhlIFVBUlQgcmFpc2UgYW55IG9mIHRoZSBvdXRwdXQgc2lnbmFscyB3ZSB3YW50IHVwICovCi1zdGF0aWMgdm9pZCBjbHNfYXNzZXJ0X21vZGVtX3NpZ25hbHMoc3RydWN0IGNoYW5uZWxfdCAqY2gpCi17Ci0JdW5zaWduZWQgY2hhciBvdXQ7Ci0KLQlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER05DX0NIQU5ORUxfTUFHSUMpCi0JCXJldHVybjsKLQotCW91dCA9IGNoLT5jaF9tb3N0YXQ7Ci0KLQlpZiAoY2gtPmNoX2ZsYWdzICYgQ0hfTE9PUEJBQ0spCi0JCW91dCB8PSBVQVJUX01DUl9MT09QOwotCi0Jd3JpdGViKG91dCwgJmNoLT5jaF9jbHNfdWFydC0+bWNyKTsKLQotCS8qIEdpdmUgdGltZSBmb3IgdGhlIFVBUlQgdG8gYWN0dWFsbHkgZHJvcCB0aGUgc2lnbmFscyAqLwotCXVkZWxheSgxMCk7Ci19Ci0KIHN0YXRpYyB2b2lkIGNsc19zZW5kX3N0YXJ0X2NoYXJhY3RlcihzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKIHsKIAlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER05DX0NIQU5ORUxfTUFHSUMpCkBAIC0xMjk4LDMgKzEyMzIsMjQgQEAKIAogCWlvdW5tYXAocmVfbWFwX3ZwZGJhc2UpOwogfQorCitzdHJ1Y3QgYm9hcmRfb3BzIGRnbmNfY2xzX29wcyA9IHsKKwkudGFza2xldCA9CQkJY2xzX3Rhc2tsZXQsCisJLmludHIgPQkJCQljbHNfaW50ciwKKwkudWFydF9pbml0ID0JCQljbHNfdWFydF9pbml0LAorCS51YXJ0X29mZiA9CQkJY2xzX3VhcnRfb2ZmLAorCS5kcmFpbiA9CQkJY2xzX2RyYWluLAorCS5wYXJhbSA9CQkJY2xzX3BhcmFtLAorCS52cGQgPQkJCQljbHNfdnBkLAorCS5hc3NlcnRfbW9kZW1fc2lnbmFscyA9CQljbHNfYXNzZXJ0X21vZGVtX3NpZ25hbHMsCisJLmZsdXNoX3VhcnRfd3JpdGUgPQkJY2xzX2ZsdXNoX3VhcnRfd3JpdGUsCisJLmZsdXNoX3VhcnRfcmVhZCA9CQljbHNfZmx1c2hfdWFydF9yZWFkLAorCS5kaXNhYmxlX3JlY2VpdmVyID0JCWNsc19kaXNhYmxlX3JlY2VpdmVyLAorCS5lbmFibGVfcmVjZWl2ZXIgPQkJY2xzX2VuYWJsZV9yZWNlaXZlciwKKwkuc2VuZF9icmVhayA9CQkJY2xzX3NlbmRfYnJlYWssCisJLnNlbmRfc3RhcnRfY2hhcmFjdGVyID0JCWNsc19zZW5kX3N0YXJ0X2NoYXJhY3RlciwKKwkuc2VuZF9zdG9wX2NoYXJhY3RlciA9CQljbHNfc2VuZF9zdG9wX2NoYXJhY3RlciwKKwkuY29weV9kYXRhX2Zyb21fcXVldWVfdG9fdWFydCA9IGNsc19jb3B5X2RhdGFfZnJvbV9xdWV1ZV90b191YXJ0LAorCS5nZXRfdWFydF9ieXRlc19sZWZ0ID0JCWNsc19nZXRfdWFydF9ieXRlc19sZWZ0LAorCS5zZW5kX2ltbWVkaWF0ZV9jaGFyID0JCWNsc19zZW5kX2ltbWVkaWF0ZV9jaGFyCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19kcml2ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfZHJpdmVyLmMKaW5kZXggYWYyZTgzNS4uZmQzNzJkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19kcml2ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2RyaXZlci5jCkBAIC0zNywxMyArMzcsMTQgQEAKICAqCiAgKi8KIHN0YXRpYyBpbnQJCWRnbmNfc3RhcnQodm9pZCk7Ci1zdGF0aWMgaW50CQlkZ25jX2ZpbmFsaXplX2JvYXJkX2luaXQoc3RydWN0IGRnbmNfYm9hcmQgKmJyZCk7Ci1zdGF0aWMgaW50CQlkZ25jX2ZvdW5kX2JvYXJkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgaWQpOworc3RhdGljIGludCBkZ25jX3JlcXVlc3RfaXJxKHN0cnVjdCBkZ25jX2JvYXJkICpicmQpOworc3RhdGljIHZvaWQgZGduY19mcmVlX2lycShzdHJ1Y3QgZGduY19ib2FyZCAqYnJkKTsKK3N0YXRpYyBzdHJ1Y3QgZGduY19ib2FyZCAqZGduY19mb3VuZF9ib2FyZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGlkKTsKIHN0YXRpYyB2b2lkCQlkZ25jX2NsZWFudXBfYm9hcmQoc3RydWN0IGRnbmNfYm9hcmQgKmJyZCk7CiBzdGF0aWMgdm9pZAkJZGduY19wb2xsX2hhbmRsZXIodWxvbmcgZHVtbXkpOwogc3RhdGljIGludAkJZGduY19pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKLXN0YXRpYyB2b2lkCQlkZ25jX2RvX3JlbWFwKHN0cnVjdCBkZ25jX2JvYXJkICpicmQpOworc3RhdGljIGludAkJZGduY19kb19yZW1hcChzdHJ1Y3QgZGduY19ib2FyZCAqYnJkKTsKIAogLyoKICAqIEZpbGUgb3BlcmF0aW9ucyBwZXJtaXR0ZWQgb24gQ29udHJvbC9NYW5hZ2VtZW50IG1ham9yLgpAQCAtMTQ2LDcgKzE0Nyw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgZGduY19udW1fYm9hcmRzOyArK2kpIHsKIAkJZGduY19yZW1vdmVfcG9ydHNfc3lzZmlsZXMoZGduY19ib2FyZFtpXSk7Ci0JCWRnbmNfdHR5X3VuaW5pdChkZ25jX2JvYXJkW2ldKTsKKwkJZGduY19jbGVhbnVwX3R0eShkZ25jX2JvYXJkW2ldKTsKIAkJZGduY19jbGVhbnVwX2JvYXJkKGRnbmNfYm9hcmRbaV0pOwogCX0KIApAQCAtMTU4LDcgKzE1OSw3IEBACiAgKgogICogTW9kdWxlIHVubG9hZC4gIFRoaXMgaXMgd2hlcmUgaXQgYWxsIGVuZHMuCiAgKi8KLXN0YXRpYyB2b2lkIGRnbmNfY2xlYW51cF9tb2R1bGUodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBkZ25jX2NsZWFudXBfbW9kdWxlKHZvaWQpCiB7CiAJY2xlYW51cCh0cnVlKTsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRnbmNfZHJpdmVyKTsKQEAgLTI3NCw2ICsyNzUsNyBAQAogc3RhdGljIGludCBkZ25jX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewogCWludCByYzsKKwlzdHJ1Y3QgZGduY19ib2FyZCAqYnJkOwogCiAJLyogd2FrZSB1cCBhbmQgZW5hYmxlIGRldmljZSAqLwogCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CkBAIC0yODEsOSArMjgzLDQ4IEBACiAJaWYgKHJjKQogCQlyZXR1cm4gLUVJTzsKIAotCXJjID0gZGduY19mb3VuZF9ib2FyZChwZGV2LCBlbnQtPmRyaXZlcl9kYXRhKTsKLQlpZiAocmMgPT0gMCkKLQkJZGduY19udW1fYm9hcmRzKys7CisJYnJkID0gZGduY19mb3VuZF9ib2FyZChwZGV2LCBlbnQtPmRyaXZlcl9kYXRhKTsKKwlpZiAoSVNfRVJSKGJyZCkpCisJCXJldHVybiBQVFJfRVJSKGJyZCk7CisKKwkvKgorCSAqIERvIHR0eSBkZXZpY2UgaW5pdGlhbGl6YXRpb24uCisJICovCisKKwlyYyA9IGRnbmNfdHR5X3JlZ2lzdGVyKGJyZCk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoRFJWU1RSICI6IENhbid0IHJlZ2lzdGVyIHR0eSBkZXZpY2VzICglZClcbiIsIHJjKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJcmMgPSBkZ25jX3JlcXVlc3RfaXJxKGJyZCk7CisJaWYgKHJjIDwgMCkgeworCQlwcl9lcnIoRFJWU1RSICI6IENhbid0IGZpbmFsaXplIGJvYXJkIGluaXQgKCVkKVxuIiwgcmMpOworCQlnb3RvIHVucmVnaXN0ZXJfdHR5OworCX0KKworCXJjID0gZGduY190dHlfaW5pdChicmQpOworCWlmIChyYyA8IDApIHsKKwkJcHJfZXJyKERSVlNUUiAiOiBDYW4ndCBpbml0IHR0eSBkZXZpY2VzICglZClcbiIsIHJjKTsKKwkJZ290byBmcmVlX2lycTsKKwl9CisKKwlicmQtPnN0YXRlID0gQk9BUkRfUkVBRFk7CisJYnJkLT5kcGFzdGF0dXMgPSBCRF9SVU5OSU5HOworCisJZGduY19jcmVhdGVfcG9ydHNfc3lzZmlsZXMoYnJkKTsKKworCWRnbmNfYm9hcmRbZGduY19udW1fYm9hcmRzKytdID0gYnJkOworCisJcmV0dXJuIDA7CisKK2ZyZWVfaXJxOgorCWRnbmNfZnJlZV9pcnEoYnJkKTsKK3VucmVnaXN0ZXJfdHR5OgorCWRnbmNfdHR5X3VucmVnaXN0ZXIoYnJkKTsKKworZmFpbGVkOgorCWtmcmVlKGJyZCk7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC0zMjQsMTcgKzM2NSw2IEBACiAJCWJyZC0+cmVfbWFwX21lbWJhc2UgPSBOVUxMOwogCX0KIAotCWlmIChicmQtPm1zZ2J1Zl9oZWFkKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRnbmNfZ2xvYmFsX2xvY2ssIGZsYWdzKTsKLQkJYnJkLT5tc2didWYgPSBOVUxMOwotCQlkZXZfZGJnKCZicmQtPnBkZXYtPmRldiwgIiVzXG4iLCBicmQtPm1zZ2J1Zl9oZWFkKTsKLQkJa2ZyZWUoYnJkLT5tc2didWZfaGVhZCk7Ci0JCWJyZC0+bXNnYnVmX2hlYWQgPSBOVUxMOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZ25jX2dsb2JhbF9sb2NrLCBmbGFncyk7Ci0JfQotCiAJLyogRnJlZSBhbGwgYWxsb2NhdGVkIGNoYW5uZWxzIHN0cnVjdHMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTUFYUE9SVFMgOyBpKyspIHsKIAkJaWYgKGJyZC0+Y2hhbm5lbHNbaV0pIHsKQEAgLTM1NiwyOSArMzg2LDE3IEBACiAgKgogICogQSBib2FyZCBoYXMgYmVlbiBmb3VuZCwgaW5pdCBpdC4KICAqLwotc3RhdGljIGludCBkZ25jX2ZvdW5kX2JvYXJkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgaWQpCitzdGF0aWMgc3RydWN0IGRnbmNfYm9hcmQgKmRnbmNfZm91bmRfYm9hcmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBpZCkKIHsKIAlzdHJ1Y3QgZGduY19ib2FyZCAqYnJkOwogCXVuc2lnbmVkIGludCBwY2lfaXJxOwogCWludCBpID0gMDsKIAlpbnQgcmMgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBnZXQgdGhlIGJvYXJkIHN0cnVjdHVyZSBhbmQgcHJlcCBpdCAqLwotCWRnbmNfYm9hcmRbZGduY19udW1fYm9hcmRzXSA9IGt6YWxsb2Moc2l6ZW9mKCpicmQpLCBHRlBfS0VSTkVMKTsKLQlicmQgPSBkZ25jX2JvYXJkW2RnbmNfbnVtX2JvYXJkc107Ci0KKwlicmQgPSBremFsbG9jKHNpemVvZigqYnJkKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFicmQpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyogbWFrZSBhIHRlbXBvcmFyeSBtZXNzYWdlIGJ1ZmZlciBmb3IgdGhlIGJvb3QgbWVzc2FnZXMgKi8KLQlicmQtPm1zZ2J1Zl9oZWFkID0ga2NhbGxvYyg4MTkyLCBzaXplb2YodTgpLCBHRlBfS0VSTkVMKTsKLQlicmQtPm1zZ2J1ZiA9IGJyZC0+bXNnYnVmX2hlYWQ7Ci0KLQlpZiAoIWJyZC0+bXNnYnVmKSB7Ci0JCWtmcmVlKGJyZCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAkvKiBzdG9yZSB0aGUgaW5mbyBmb3IgdGhlIGJvYXJkIHdlJ3ZlIGZvdW5kICovCiAJYnJkLT5tYWdpYyA9IERHTkNfQk9BUkRfTUFHSUM7CkBAIC00MDAsOSArNDE4LDYgQEAKIAogCWJyZC0+c3RhdGUJCT0gQk9BUkRfRk9VTkQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYUE9SVFM7IGkrKykKLQkJYnJkLT5jaGFubmVsc1tpXSA9IE5VTEw7Ci0KIAkvKiBzdG9yZSB3aGljaCBjYXJkICYgcmV2aXNpb24gd2UgaGF2ZSAqLwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCAmYnJkLT5zdWJ2ZW5kb3IpOwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9TVUJTWVNURU1fSUQsICZicmQtPnN1YmRldmljZSk7CkBAIC00MzUsNyArNDUwLDggQEAKIAkJaWYgKCFicmQtPm1lbWJhc2UpIHsKIAkJCWRldl9lcnIoJmJyZC0+cGRldi0+ZGV2LAogCQkJCSJDYXJkIGhhcyBubyBQQ0kgSU8gcmVzb3VyY2VzLCBmYWlsaW5nLlxuIik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKKwkJCXJjID0gLUVOT0RFVjsKKwkJCWdvdG8gZmFpbGVkOwogCQl9CiAKIAkJYnJkLT5tZW1iYXNlX2VuZCA9IHBjaV9yZXNvdXJjZV9lbmQocGRldiwgNCk7CkBAIC00NTUsNyArNDcxLDEwIEBACiAJCWJyZC0+YmRfdWFydF9vZmZzZXQgPSAweDg7CiAJCWJyZC0+YmRfZGl2aWRlbmQgPSA5MjE2MDA7CiAKLQkJZGduY19kb19yZW1hcChicmQpOworCQlyYyA9IGRnbmNfZG9fcmVtYXAoYnJkKTsKKworCQlpZiAocmMgPCAwKQorCQkJZ290byBmYWlsZWQ7CiAKIAkJLyogR2V0IGFuZCBzdG9yZSB0aGUgYm9hcmQgVlBELCBpZiBpdCBleGlzdHMgKi8KIAkJYnJkLT5iZF9vcHMtPnZwZChicmQpOwpAQCAtNTA3LDgxICs1MjYsNDUgQEAKIAkJYnJkLT5iZF91YXJ0X29mZnNldCA9IDB4MjAwOwogCQlicmQtPmJkX2RpdmlkZW5kID0gOTIxNjAwOwogCi0JCWRnbmNfZG9fcmVtYXAoYnJkKTsKKwkJcmMgPSBkZ25jX2RvX3JlbWFwKGJyZCk7CiAKLQkJaWYgKGJyZC0+cmVfbWFwX21lbWJhc2UpIHsKLQkJCS8qIFJlYWQgYW5kIHN0b3JlIHRoZSBkdmlkIGFmdGVyIHJlbWFwcGluZyAqLwotCQkJYnJkLT5kdmlkID0gcmVhZGIoYnJkLT5yZV9tYXBfbWVtYmFzZSArIDB4OEQpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBmYWlsZWQ7CiAKLQkJCS8qIEdldCBhbmQgc3RvcmUgdGhlIGJvYXJkIFZQRCwgaWYgaXQgZXhpc3RzICovCi0JCQlicmQtPmJkX29wcy0+dnBkKGJyZCk7Ci0JCX0KKwkJLyogUmVhZCBhbmQgc3RvcmUgdGhlIGR2aWQgYWZ0ZXIgcmVtYXBwaW5nICovCisJCWJyZC0+ZHZpZCA9IHJlYWRiKGJyZC0+cmVfbWFwX21lbWJhc2UgKyAweDhEKTsKKworCQkvKiBHZXQgYW5kIHN0b3JlIHRoZSBib2FyZCBWUEQsIGlmIGl0IGV4aXN0cyAqLworCQlicmQtPmJkX29wcy0+dnBkKGJyZCk7CisKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQlkZXZfZXJyKCZicmQtPnBkZXYtPmRldiwKIAkJCSJEaWRuJ3QgZmluZCBhbnkgY29tcGF0aWJsZSBOZW8vQ2xhc3NpYyBQQ0kgYm9hcmRzLlxuIik7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0JLyoKLQkgKiBEbyB0dHkgZGV2aWNlIGluaXRpYWxpemF0aW9uLgotCSAqLwotCi0JcmMgPSBkZ25jX3R0eV9yZWdpc3RlcihicmQpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKERSVlNUUiAiOiBDYW4ndCByZWdpc3RlciB0dHkgZGV2aWNlcyAoJWQpXG4iLCByYyk7CisJCXJjID0gLUVOWElPOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKLQlyYyA9IGRnbmNfZmluYWxpemVfYm9hcmRfaW5pdChicmQpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKERSVlNUUiAiOiBDYW4ndCBmaW5hbGl6ZSBib2FyZCBpbml0ICglZClcbiIsIHJjKTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0JcmMgPSBkZ25jX3R0eV9pbml0KGJyZCk7Ci0JaWYgKHJjIDwgMCkgewotCQlwcl9lcnIoRFJWU1RSICI6IENhbid0IGluaXQgdHR5IGRldmljZXMgKCVkKVxuIiwgcmMpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQlicmQtPnN0YXRlID0gQk9BUkRfUkVBRFk7Ci0JYnJkLT5kcGFzdGF0dXMgPSBCRF9SVU5OSU5HOwotCi0JZGduY19jcmVhdGVfcG9ydHNfc3lzZmlsZXMoYnJkKTsKLQogCS8qIGluaXQgb3VyIHBvbGwgaGVscGVyIHRhc2tsZXQgKi8KIAl0YXNrbGV0X2luaXQoJmJyZC0+aGVscGVyX3Rhc2tsZXQsCiAJCSAgICAgYnJkLT5iZF9vcHMtPnRhc2tsZXQsCiAJCSAgICAgKHVuc2lnbmVkIGxvbmcpYnJkKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZkZ25jX2dsb2JhbF9sb2NrLCBmbGFncyk7Ci0JYnJkLT5tc2didWYgPSBOVUxMOwotCWRldl9kYmcoJmJyZC0+cGRldi0+ZGV2LCAiJXNcbiIsIGJyZC0+bXNnYnVmX2hlYWQpOwotCWtmcmVlKGJyZC0+bXNnYnVmX2hlYWQpOwotCWJyZC0+bXNnYnVmX2hlYWQgPSBOVUxMOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRnbmNfZ2xvYmFsX2xvY2ssIGZsYWdzKTsKLQogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYnJkLT5zdGF0ZV93YWl0KTsKIAotCXJldHVybiAwOworCXJldHVybiBicmQ7CiAKIGZhaWxlZDoKLQlkZ25jX3R0eV91bmluaXQoYnJkKTsKLQlicmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOwotCWJyZC0+ZHBhc3RhdHVzID0gQkRfTk9GRVA7CisJa2ZyZWUoYnJkKTsKIAotCXJldHVybiAtRU5YSU87CisJcmV0dXJuIEVSUl9QVFIocmMpOwogfQogCi1zdGF0aWMgaW50IGRnbmNfZmluYWxpemVfYm9hcmRfaW5pdChzdHJ1Y3QgZGduY19ib2FyZCAqYnJkKQorc3RhdGljIGludCBkZ25jX3JlcXVlc3RfaXJxKHN0cnVjdCBkZ25jX2JvYXJkICpicmQpCiB7CiAJaW50IHJjID0gMDsKIAotCWlmICghYnJkIHx8IGJyZC0+bWFnaWMgIT0gREdOQ19CT0FSRF9NQUdJQykKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAlpZiAoYnJkLT5pcnEpIHsKIAkJcmMgPSByZXF1ZXN0X2lycShicmQtPmlycSwgYnJkLT5iZF9vcHMtPmludHIsCiAJCQkJIElSUUZfU0hBUkVELCAiREdOQyIsIGJyZCk7CkBAIC01OTcsNDIgKzU4MCw1MSBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIHZvaWQgZGduY19mcmVlX2lycShzdHJ1Y3QgZGduY19ib2FyZCAqYnJkKQoreworCWlmIChicmQtPmlycSkKKwkJZnJlZV9pcnEoYnJkLT5pcnEsIGJyZCk7Cit9CisKIC8qCiAgKiBSZW1hcCBQQ0kgbWVtb3J5LgogICovCi1zdGF0aWMgdm9pZCBkZ25jX2RvX3JlbWFwKHN0cnVjdCBkZ25jX2JvYXJkICpicmQpCitzdGF0aWMgaW50IGRnbmNfZG9fcmVtYXAoc3RydWN0IGRnbmNfYm9hcmQgKmJyZCkKIHsKLQlpZiAoIWJyZCB8fCBicmQtPm1hZ2ljICE9IERHTkNfQk9BUkRfTUFHSUMpCi0JCXJldHVybjsKKwlpbnQgcmMgPSAwOwogCiAJYnJkLT5yZV9tYXBfbWVtYmFzZSA9IGlvcmVtYXAoYnJkLT5tZW1iYXNlLCAweDEwMDApOworCWlmICghYnJkLT5yZV9tYXBfbWVtYmFzZSkKKwkJcmMgPSAtRU5PTUVNOworCisJcmV0dXJuIHJjOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogRnVuY3Rpb246Ci0qCi0qICAgIGRnbmNfcG9sbF9oYW5kbGVyCi0qCi0qIEF1dGhvcjoKLSoKLSogICAgU2NvdHQgSCBLaWxhdQotKgotKiBQYXJhbWV0ZXJzOgotKgotKiAgICBkdW1teSAtLSBpZ25vcmVkCi0qCi0qIFJldHVybiBWYWx1ZXM6Ci0qCi0qICAgIG5vbmUKLSoKLSogRGVzY3JpcHRpb246Ci0qCi0qICAgIEFzIGVhY2ggdGltZXIgZXhwaXJlcywgaXQgZGV0ZXJtaW5lcyAoYSkgd2hldGhlciB0aGUgInRyYW5zbWl0IgotKiAgICB3YWl0ZXIgbmVlZHMgdG8gYmUgd29rZW4gdXAsIGFuZCAoYikgd2hldGhlciB0aGUgcG9sbGVyIG5lZWRzIHRvCi0qICAgIGJlIHJlc2NoZWR1bGVkLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqCisgKiBGdW5jdGlvbjoKKyAqCisgKiAgICBkZ25jX3BvbGxfaGFuZGxlcgorICoKKyAqIEF1dGhvcjoKKyAqCisgKiAgICBTY290dCBIIEtpbGF1CisgKgorICogUGFyYW1ldGVyczoKKyAqCisgKiAgICBkdW1teSAtLSBpZ25vcmVkCisgKgorICogUmV0dXJuIFZhbHVlczoKKyAqCisgKiAgICBub25lCisgKgorICogRGVzY3JpcHRpb246CisgKgorICogICAgQXMgZWFjaCB0aW1lciBleHBpcmVzLCBpdCBkZXRlcm1pbmVzIChhKSB3aGV0aGVyIHRoZSAidHJhbnNtaXQiCisgKiAgICB3YWl0ZXIgbmVlZHMgdG8gYmUgd29rZW4gdXAsIGFuZCAoYikgd2hldGhlciB0aGUgcG9sbGVyIG5lZWRzIHRvCisgKiAgICBiZSByZXNjaGVkdWxlZC4KKyAqCisgKi8KIAogc3RhdGljIHZvaWQgZGduY19wb2xsX2hhbmRsZXIodWxvbmcgZHVtbXkpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2RyaXZlci5oIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19kcml2ZXIuaAppbmRleCA5NWVjNzI5Li44NzkyMDI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2RyaXZlci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfZHJpdmVyLmgKQEAgLTE4MywxMCArMTgzLDYgQEAKIAl1aW50CQluYXN5bmM7CQkvKiBOdW1iZXIgb2YgcG9ydHMgb24gY2FyZCAqLwogCiAJdWludAkJaXJxOwkJLyogSW50ZXJydXB0IHJlcXVlc3QgbnVtYmVyICovCi0JdWxvbmcJCWludHJfY291bnQ7CS8qIENvdW50IG9mIGludGVycnVwdHMgKi8KLQl1bG9uZwkJaW50cl9tb2RlbTsJLyogQ291bnQgb2YgaW50ZXJydXB0cyAqLwotCXVsb25nCQlpbnRyX3R4OwkvKiBDb3VudCBvZiBpbnRlcnJ1cHRzICovCi0JdWxvbmcJCWludHJfcng7CS8qIENvdW50IG9mIGludGVycnVwdHMgKi8KIAogCXVsb25nCQltZW1iYXNlOwkvKiBTdGFydCBvZiBiYXNlIG1lbW9yeSBvZiB0aGUgY2FyZCAqLwogCXVsb25nCQltZW1iYXNlX2VuZDsJLyogRW5kIG9mIGJhc2UgbWVtb3J5IG9mIHRoZSBjYXJkICovCkBAIC0yMDcsOSArMjAzLDYgQEAKIAlzdHJ1Y3QgdHR5X2RyaXZlciAqcHJpbnRfZHJpdmVyOwogCWNoYXIJCXByaW50X25hbWVbMjAwXTsKIAotCWJvb2wJCWRnbmNfbWFqb3Jfc2VyaWFsX3JlZ2lzdGVyZWQ7Ci0JYm9vbAkJZGduY19tYWpvcl90cmFuc3BhcmVudF9wcmludF9yZWdpc3RlcmVkOwotCiAJdTE2CQlkcGF0eXBlOwkvKiBUaGUgYm9hcmQgInR5cGUiLAogCQkJCQkgKiBhcyBkZWZpbmVkIGJ5IERQQQogCQkJCQkgKi8KQEAgLTIxNywxMiArMjEwLDYgQEAKIAkJCQkJICogYXMgZGVmaW5lZCBieSBEUEEKIAkJCQkJICovCiAKLQkvKgotCSAqCU1nbXQgZGF0YS4KLQkgKi8KLQljaGFyCQkqbXNnYnVmX2hlYWQ7Ci0JY2hhcgkJKm1zZ2J1ZjsKLQogCXVpbnQJCWJkX2RpdmlkZW5kOwkvKiBCb2FyZC9VQVJUcyBzcGVjaWZpYyBkaXZpZGVuZCAqLwogCiAJc3RydWN0IGJvYXJkX29wcyAqYmRfb3BzOwpAQCAtMzgxLDEwICszNjgsNiBAQAogCXVsb25nCQljaF94b25fc2VuZHM7CS8qIENvdW50IG9mIHhvbnMgdHJhbnNtaXR0ZWQgKi8KIAl1bG9uZwkJY2hfeG9mZl9zZW5kczsJLyogQ291bnQgb2YgeG9mZnMgdHJhbnNtaXR0ZWQgKi8KIAotCXVsb25nCQljaF9pbnRyX21vZGVtOwkvKiBDb3VudCBvZiBpbnRlcnJ1cHRzICovCi0JdWxvbmcJCWNoX2ludHJfdHg7CS8qIENvdW50IG9mIGludGVycnVwdHMgKi8KLQl1bG9uZwkJY2hfaW50cl9yeDsJLyogQ291bnQgb2YgaW50ZXJydXB0cyAqLwotCiAJLyogL3Byb2MvPGJvYXJkPi88Y2hhbm5lbD4gZW50cmllcyAqLwogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19lbnRyeV9wb2ludGVyOwogCXN0cnVjdCBkZ25jX3Byb2NfZW50cnkgKmRnbmNfY2hhbm5lbF90YWJsZTsKQEAgLTM5OCw3ICszODEsNyBAQAogZXh0ZXJuIGludAkJZGduY19wb2xsX3RpY2s7CQkvKiBQb2xsIGludGVydmFsIC0gMjAgbXMgKi8KIGV4dGVybiBzcGlubG9ja190CWRnbmNfZ2xvYmFsX2xvY2s7CS8qIERyaXZlciBnbG9iYWwgc3BpbmxvY2sgKi8KIGV4dGVybiBzcGlubG9ja190CWRnbmNfcG9sbF9sb2NrOwkJLyogUG9sbCBzY2hlZHVsaW5nIGxvY2sgKi8KLWV4dGVybiB1aW50CQlkZ25jX251bV9ib2FyZHM7CQkvKiBUb3RhbCBudW1iZXIgb2YgYm9hcmRzICovCitleHRlcm4gdWludAkJZGduY19udW1fYm9hcmRzOwkvKiBUb3RhbCBudW1iZXIgb2YgYm9hcmRzICovCiBleHRlcm4gc3RydWN0IGRnbmNfYm9hcmQJKmRnbmNfYm9hcmRbTUFYQk9BUkRTXTsJLyogQXJyYXkgb2YgYm9hcmQKIAkJCQkJCQkgKiBzdHJ1Y3RzCiAJCQkJCQkJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX25lby5jIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19uZW8uYwppbmRleCBiYTU3ZTk1Li41YmVjYjM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX25lby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfbmVvLmMKQEAgLTEwNyw3ICsxMDcsOSBAQAogCS8qIFR1cm4gb2ZmIGF1dG8gWG9uIGZsb3cgY29udHJvbCAqLwogCWVmciAmPSB+VUFSVF8xNzE1OF9FRlJfSVhPTjsKIAotCS8qIFdoeT8gQmVjdXogRXhhcidzIHNwZWMgc2F5cyB3ZSBoYXZlIHRvIHplcm8gaXQgb3V0IGJlZm9yZSBzZXR0aW5nIGl0ICovCisJLyogV2h5PyBCZWNhdXNlIEV4YXIncyBzcGVjIHNheXMgd2UgaGF2ZSB0byB6ZXJvIGl0CisJICogb3V0IGJlZm9yZSBzZXR0aW5nIGl0CisJICovCiAJd3JpdGViKDAsICZjaC0+Y2hfbmVvX3VhcnQtPmVmcik7CiAKIAkvKiBUdXJuIG9uIFVBUlQgZW5oYW5jZWQgYml0cyAqLwpAQCAtMTQzLDcgKzE0NSw5IEBACiAJaWVyICY9IH5VQVJUXzE3MTU4X0lFUl9YT0ZGOwogCWVmciAmPSB+VUFSVF8xNzE1OF9FRlJfSVhPRkY7CiAKLQkvKiBXaHk/IEJlY3V6IEV4YXIncyBzcGVjIHNheXMgd2UgaGF2ZSB0byB6ZXJvIGl0IG91dCBiZWZvcmUgc2V0dGluZyBpdCAqLworCS8qIFdoeT8gQmVjYXVzZSBFeGFyJ3Mgc3BlYyBzYXlzIHdlIGhhdmUgdG8gemVybyBpdAorCSAqIG91dCBiZWZvcmUgc2V0dGluZyBpdAorCSAqLwogCXdyaXRlYigwLCAmY2gtPmNoX25lb191YXJ0LT5lZnIpOwogCiAJLyogVHVybiBvbiBVQVJUIGVuaGFuY2VkIGJpdHMgKi8KQEAgLTE4MSw3ICsxODUsOSBAQAogCS8qIFR1cm4gb24gYXV0byBYb24gZmxvdyBjb250cm9sICovCiAJZWZyIHw9IChVQVJUXzE3MTU4X0VGUl9FQ0IgfCBVQVJUXzE3MTU4X0VGUl9JWE9OKTsKIAotCS8qIFdoeT8gQmVjdXogRXhhcidzIHNwZWMgc2F5cyB3ZSBoYXZlIHRvIHplcm8gaXQgb3V0IGJlZm9yZSBzZXR0aW5nIGl0ICovCisJLyogV2h5PyBCZWNhdXNlIEV4YXIncyBzcGVjIHNheXMgd2UgaGF2ZSB0byB6ZXJvIGl0CisJICogb3V0IGJlZm9yZSBzZXR0aW5nIGl0CisJICovCiAJd3JpdGViKDAsICZjaC0+Y2hfbmVvX3VhcnQtPmVmcik7CiAKIAkvKiBUdXJuIG9uIFVBUlQgZW5oYW5jZWQgYml0cyAqLwpAQCAtMjE5LDcgKzIyNSw5IEBACiAJaWVyIHw9IFVBUlRfMTcxNThfSUVSX1hPRkY7CiAJZWZyIHw9IChVQVJUXzE3MTU4X0VGUl9FQ0IgfCBVQVJUXzE3MTU4X0VGUl9JWE9GRik7CiAKLQkvKiBXaHk/IEJlY3V6IEV4YXIncyBzcGVjIHNheXMgd2UgaGF2ZSB0byB6ZXJvIGl0IG91dCBiZWZvcmUgc2V0dGluZyBpdCAqLworCS8qIFdoeT8gQmVjYXVzZSBFeGFyJ3Mgc3BlYyBzYXlzIHdlIGhhdmUgdG8gemVybyBpdAorCSAqIG91dCBiZWZvcmUgc2V0dGluZyBpdAorCSAqLwogCXdyaXRlYigwLCAmY2gtPmNoX25lb191YXJ0LT5lZnIpOwogCiAJLyogVHVybiBvbiBVQVJUIGVuaGFuY2VkIGJpdHMgKi8KQEAgLTI2MCw3ICsyNjgsOSBAQAogCWVsc2UKIAkJZWZyICY9IH4oVUFSVF8xNzE1OF9FRlJfRUNCIHwgVUFSVF8xNzE1OF9FRlJfSVhPRkYpOwogCi0JLyogV2h5PyBCZWN1eiBFeGFyJ3Mgc3BlYyBzYXlzIHdlIGhhdmUgdG8gemVybyBpdCBvdXQgYmVmb3JlIHNldHRpbmcgaXQgKi8KKwkvKiBXaHk/IEJlY2F1c2UgRXhhcidzIHNwZWMgc2F5cyB3ZSBoYXZlIHRvIHplcm8KKwkgKiBpdCBvdXQgYmVmb3JlIHNldHRpbmcgaXQKKwkgKi8KIAl3cml0ZWIoMCwgJmNoLT5jaF9uZW9fdWFydC0+ZWZyKTsKIAogCS8qIFR1cm4gb24gVUFSVCBlbmhhbmNlZCBiaXRzICovCkBAIC0yOTgsNyArMzA4LDkgQEAKIAllbHNlCiAJCWVmciAmPSB+KFVBUlRfMTcxNThfRUZSX0VDQiB8IFVBUlRfMTcxNThfRUZSX0lYT04pOwogCi0JLyogV2h5PyBCZWN1eiBFeGFyJ3Mgc3BlYyBzYXlzIHdlIGhhdmUgdG8gemVybyBpdCBvdXQgYmVmb3JlIHNldHRpbmcgaXQgKi8KKwkvKiBXaHk/IEJlY2F1c2UgRXhhcidzIHNwZWMgc2F5cyB3ZSBoYXZlIHRvIHplcm8gaXQKKwkgKiBvdXQgYmVmb3JlIHNldHRpbmcgaXQKKwkgKi8KIAl3cml0ZWIoMCwgJmNoLT5jaF9uZW9fdWFydC0+ZWZyKTsKIAogCS8qIFR1cm4gb24gVUFSVCBlbmhhbmNlZCBiaXRzICovCkBAIC0zOTksMTkgKzQxMSwxNyBAQAogCiAJCWlmIChpc3IgJiAoVUFSVF8xNzE1OF9JSVJfUkRJX1RJTUVPVVQgfCBVQVJUX0lJUl9SREkpKSB7CiAJCQkvKiBSZWFkIGRhdGEgZnJvbSB1YXJ0IC0+IHF1ZXVlICovCi0JCQlicmQtPmludHJfcngrKzsKLQkJCWNoLT5jaF9pbnRyX3J4Kys7CiAJCQluZW9fY29weV9kYXRhX2Zyb21fdWFydF90b19xdWV1ZShjaCk7CiAKLQkJCS8qIENhbGwgb3VyIHR0eSBsYXllciB0byBlbmZvcmNlIHF1ZXVlIGZsb3cgY29udHJvbCBpZiBuZWVkZWQuICovCisJCQkvKiBDYWxsIG91ciB0dHkgbGF5ZXIgdG8gZW5mb3JjZSBxdWV1ZQorCQkJICogZmxvdyBjb250cm9sIGlmIG5lZWRlZC4KKwkJCSAqLwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7CiAJCQlkZ25jX2NoZWNrX3F1ZXVlX2Zsb3dfY29udHJvbChjaCk7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwogCQl9CiAKIAkJaWYgKGlzciAmIFVBUlRfSUlSX1RIUkkpIHsKLQkJCWJyZC0+aW50cl90eCsrOwotCQkJY2gtPmNoX2ludHJfdHgrKzsKIAkJCS8qIFRyYW5zZmVyIGRhdGEgKGlmIGFueSkgZnJvbSBXcml0ZSBRdWV1ZSAtPiBVQVJULiAqLwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7CiAJCQljaC0+Y2hfZmxhZ3MgfD0gKENIX1RYX0ZJRk9fRU1QVFkgfCBDSF9UWF9GSUZPX0xXTSk7CkBAIC00MjgsNyArNDM4LDkgQEAKIAkJCSAqIG9uZSBpdCB3YXMsIHNvIHdlIGNhbiBzdXNwZW5kIG9yIHJlc3VtZSBkYXRhIGZsb3cuCiAJCQkgKi8KIAkJCWlmIChjYXVzZSA9PSBVQVJUXzE3MTU4X1hPTl9ERVRFQ1QpIHsKLQkJCQkvKiBJcyBvdXRwdXQgc3RvcHBlZCByaWdodCBub3csIGlmIHNvLCByZXN1bWUgaXQgKi8KKwkJCQkvKiBJcyBvdXRwdXQgc3RvcHBlZCByaWdodCBub3csIGlmIHNvLAorCQkJCSAqIHJlc3VtZSBpdAorCQkJCSAqLwogCQkJCWlmIChicmQtPmNoYW5uZWxzW3BvcnRdLT5jaF9mbGFncyAmIENIX1NUT1ApIHsKIAkJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLAogCQkJCQkJCSAgZmxhZ3MpOwpAQCAtNDM3LDcgKzQ0OSw4IEBACiAJCQkJCQkJICAgICAgIGZsYWdzKTsKIAkJCQl9CiAJCQl9IGVsc2UgaWYgKGNhdXNlID09IFVBUlRfMTcxNThfWE9GRl9ERVRFQ1QpIHsKLQkJCQlpZiAoIShicmQtPmNoYW5uZWxzW3BvcnRdLT5jaF9mbGFncyAmIENIX1NUT1ApKSB7CisJCQkJaWYgKCEoYnJkLT5jaGFubmVsc1twb3J0XS0+Y2hfZmxhZ3MgJgorCQkJCSAgICAgIENIX1NUT1ApKSB7CiAJCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywKIAkJCQkJCQkgIGZsYWdzKTsKIAkJCQkJY2gtPmNoX2ZsYWdzIHw9IENIX1NUT1A7CkBAIC00NDksMTEgKzQ2MiwxMCBAQAogCiAJCWlmIChpc3IgJiBVQVJUXzE3MTU4X0lJUl9IV0ZMT1dfU1RBVEVfQ0hBTkdFKSB7CiAJCQkvKgotCQkJICogSWYgd2UgZ2V0IGhlcmUsIHRoaXMgbWVhbnMgdGhlIGhhcmR3YXJlIGlzIGRvaW5nIGF1dG8gZmxvdyBjb250cm9sLgotCQkJICogQ2hlY2sgdG8gc2VlIHdoZXRoZXIgUlRTL0RUUiBvciBDVFMvRFNSIGNhdXNlZCB0aGlzIGludGVycnVwdC4KKwkJCSAqIElmIHdlIGdldCBoZXJlLCB0aGlzIG1lYW5zIHRoZSBoYXJkd2FyZSBpcworCQkJICogZG9pbmcgYXV0byBmbG93IGNvbnRyb2wuIENoZWNrIHRvIHNlZSB3aGV0aGVyCisJCQkgKiBSVFMvRFRSIG9yIENUUy9EU1IgY2F1c2VkIHRoaXMgaW50ZXJydXB0LgogCQkJICovCi0JCQlicmQtPmludHJfbW9kZW0rKzsKLQkJCWNoLT5jaF9pbnRyX21vZGVtKys7CiAJCQljYXVzZSA9IHJlYWRiKCZjaC0+Y2hfbmVvX3VhcnQtPm1jcik7CiAJCQkvKiBXaGljaCBwaW4gaXMgZG9pbmcgYXV0byBmbG93PyBSVFMgb3IgRFRSPyAqLwogCQkJaWYgKChjYXVzZSAmIDB4NCkgPT0gMCkgewpAQCAtNTE3LDggKzUyOSw2IEBACiAJY2gtPmNoX2NhY2hlZF9sc3IgfD0gbGluZXN0YXR1czsKIAogCWlmIChjaC0+Y2hfY2FjaGVkX2xzciAmIFVBUlRfTFNSX0RSKSB7Ci0JCWJyZC0+aW50cl9yeCsrOwotCQljaC0+Y2hfaW50cl9yeCsrOwogCQkvKiBSZWFkIGRhdGEgZnJvbSB1YXJ0IC0+IHF1ZXVlICovCiAJCW5lb19jb3B5X2RhdGFfZnJvbV91YXJ0X3RvX3F1ZXVlKGNoKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7CkBAIC01NDUsMTQgKzU1NSwxMyBAQAogCQkgKiBSeCBPcnVucy4gRXhhciBzYXlzIHRoYXQgYW4gb3J1biB3aWxsIE5PVCBjb3JydXB0CiAJCSAqIHRoZSBGSUZPLiBJdCB3aWxsIGp1c3QgcmVwbGFjZSB0aGUgaG9sZGluZyByZWdpc3RlcgogCQkgKiB3aXRoIHRoaXMgbmV3IGRhdGEgYnl0ZS4gU28gYmFzaWNhbGx5IGp1c3QgaWdub3JlIHRoaXMuCi0JCSAqIFByb2JhYmx5IHdlIHNob3VsZCBldmVudHVhbGx5IGhhdmUgYW4gb3J1biBzdGF0IGluIG91ciBkcml2ZXIuLi4KKwkJICogUHJvYmFibHkgd2Ugc2hvdWxkIGV2ZW50dWFsbHkgaGF2ZSBhbiBvcnVuIHN0YXQgaW4gb3VyCisJCSAqIGRyaXZlci4uLgogCQkgKi8KIAkJY2gtPmNoX2Vycl9vdmVycnVuKys7CiAJfQogCiAJaWYgKGxpbmVzdGF0dXMgJiBVQVJUX0xTUl9USFJFKSB7Ci0JCWJyZC0+aW50cl90eCsrOwotCQljaC0+Y2hfaW50cl90eCsrOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKIAkJY2gtPmNoX2ZsYWdzIHw9IChDSF9UWF9GSUZPX0VNUFRZIHwgQ0hfVFhfRklGT19MV00pOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwpAQCAtNTYwLDggKzU2OSw2IEBACiAJCS8qIFRyYW5zZmVyIGRhdGEgKGlmIGFueSkgZnJvbSBXcml0ZSBRdWV1ZSAtPiBVQVJULiAqLwogCQluZW9fY29weV9kYXRhX2Zyb21fcXVldWVfdG9fdWFydChjaCk7CiAJfSBlbHNlIGlmIChsaW5lc3RhdHVzICYgVUFSVF8xNzE1OF9UWF9BTkRfRklGT19DTFIpIHsKLQkJYnJkLT5pbnRyX3R4Kys7Ci0JCWNoLT5jaF9pbnRyX3R4Kys7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwogCQljaC0+Y2hfZmxhZ3MgfD0gKENIX1RYX0ZJRk9fRU1QVFkgfCBDSF9UWF9GSUZPX0xXTSk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7CkBAIC02NjUsNyArNjcyLDkgQEAKIAkJCQk0ODAwLCAgIDk2MDAsICAgMTkyMDAsICAzODQwMCB9CiAJCX07CiAKLQkJLyogT25seSB1c2UgdGhlIFRYUHJpbnQgYmF1ZCByYXRlIGlmIHRoZSB0ZXJtaW5hbCB1bml0IGlzIE5PVCBvcGVuICovCisJCS8qIE9ubHkgdXNlIHRoZSBUWFByaW50IGJhdWQgcmF0ZSBpZiB0aGUgdGVybWluYWwgdW5pdAorCQkgKiBpcyBOT1Qgb3BlbgorCQkgKi8KIAkJaWYgKCEoY2gtPmNoX3R1bi51bl9mbGFncyAmIFVOX0lTT1BFTikgJiYKIAkJICAgICh1bi0+dW5fdHlwZSA9PSBER05DX1BSSU5UKSkKIAkJCWJhdWQgPSBDX0JBVUQoY2gtPmNoX3B1bi51bl90dHkpICYgMHhmZjsKQEAgLTc4OCw3ICs3OTcsOSBAQAogCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgQ1RTUEFDRSB8fCBjaC0+Y2hfY19jZmxhZyAmIENSVFNDVFMpIHsKIAkJbmVvX3NldF9jdHNfZmxvd19jb250cm9sKGNoKTsKIAl9IGVsc2UgaWYgKGNoLT5jaF9jX2lmbGFnICYgSVhPTikgewotCQkvKiBJZiBzdGFydC9zdG9wIGlzIHNldCB0byBkaXNhYmxlLCB0aGVuIHdlIHNob3VsZCBkaXNhYmxlIGZsb3cgY29udHJvbCAqLworCQkvKiBJZiBzdGFydC9zdG9wIGlzIHNldCB0byBkaXNhYmxlLCB0aGVuIHdlIHNob3VsZAorCQkgKiBkaXNhYmxlIGZsb3cgY29udHJvbAorCQkgKi8KIAkJaWYgKChjaC0+Y2hfc3RhcnRjID09IF9QT1NJWF9WRElTQUJMRSkgfHwKIAkJICAgIChjaC0+Y2hfc3RvcGMgPT0gX1BPU0lYX1ZESVNBQkxFKSkKIAkJCW5lb19zZXRfbm9fb3V0cHV0X2Zsb3dfY29udHJvbChjaCk7CkBAIC04MDEsNyArODEyLDkgQEAKIAlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIFJUU1BBQ0UgfHwgY2gtPmNoX2NfY2ZsYWcgJiBDUlRTQ1RTKSB7CiAJCW5lb19zZXRfcnRzX2Zsb3dfY29udHJvbChjaCk7CiAJfSBlbHNlIGlmIChjaC0+Y2hfY19pZmxhZyAmIElYT0ZGKSB7Ci0JCS8qIElmIHN0YXJ0L3N0b3AgaXMgc2V0IHRvIGRpc2FibGUsIHRoZW4gd2Ugc2hvdWxkIGRpc2FibGUgZmxvdyBjb250cm9sICovCisJCS8qIElmIHN0YXJ0L3N0b3AgaXMgc2V0IHRvIGRpc2FibGUsIHRoZW4gd2Ugc2hvdWxkCisJCSAqIGRpc2FibGUgZmxvdyBjb250cm9sCisJCSAqLwogCQlpZiAoKGNoLT5jaF9zdGFydGMgPT0gX1BPU0lYX1ZESVNBQkxFKSB8fAogCQkgICAgKGNoLT5jaF9zdG9wYyA9PSBfUE9TSVhfVkRJU0FCTEUpKQogCQkJbmVvX3NldF9ub19pbnB1dF9mbG93X2NvbnRyb2woY2gpOwpAQCAtOTI2LDggKzkzOSw2IEBACiAJaWYgKCFicmQgfHwgYnJkLT5tYWdpYyAhPSBER05DX0JPQVJEX01BR0lDKQogCQlyZXR1cm4gSVJRX05PTkU7CiAKLQlicmQtPmludHJfY291bnQrKzsKLQogCS8qIExvY2sgb3V0IHRoZSBzbG93IHBvbGxlciBmcm9tIHJ1bm5pbmcgb24gdGhpcyBib2FyZC4gKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmYnJkLT5iZF9pbnRyX2xvY2ssIGZsYWdzKTsKIApAQCAtOTQwLDE0ICs5NTEsMTggQEAKIAogCS8qCiAJICogSWYgMCwgbm8gaW50ZXJydXB0cyBwZW5kaW5nLgotCSAqIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgSVJRIGlzIHNoYXJlZCBhbW9uZyBhIGNvdXBsZSBOZW8vQ2xhc3NpYyBib2FyZHMuCisJICogVGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBJUlEgaXMgc2hhcmVkIGFtb25nIGEgY291cGxlIE5lby9DbGFzc2ljCisJICogYm9hcmRzLgogCSAqLwogCWlmICghdWFydF9wb2xsKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJyZC0+YmRfaW50cl9sb2NrLCBmbGFncyk7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAKLQkvKiBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIGF0IGxlYXN0IFNPTUVUSElORyB0byBzZXJ2aWNlLCBkaWcgZnVydGhlci4uLiAqLworCS8qCisJICogQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBhdCBsZWFzdCBTT01FVEhJTkcgdG8gc2VydmljZSwgZGlnCisJICogZnVydGhlci4uLgorCSAqLwogCiAJLyogTG9vcCBvbiBlYWNoIHBvcnQgKi8KIAl3aGlsZSAoKHVhcnRfcG9sbCAmIDB4ZmYpICE9IDApIHsKQEAgLTk3MSw3ICs5ODYsMTAgQEAKIAkJCWNoID0gYnJkLT5jaGFubmVsc1twb3J0XTsKIAkJCW5lb19jb3B5X2RhdGFfZnJvbV91YXJ0X3RvX3F1ZXVlKGNoKTsKIAotCQkJLyogQ2FsbCBvdXIgdHR5IGxheWVyIHRvIGVuZm9yY2UgcXVldWUgZmxvdyBjb250cm9sIGlmIG5lZWRlZC4gKi8KKwkJCS8qCisJCQkgKiBDYWxsIG91ciB0dHkgbGF5ZXIgdG8gZW5mb3JjZSBxdWV1ZSBmbG93IGNvbnRyb2wgaWYKKwkJCSAqIG5lZWRlZC4KKwkJCSAqLwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBmbGFnczIpOwogCQkJZGduY19jaGVja19xdWV1ZV9mbG93X2NvbnRyb2woY2gpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGZsYWdzMik7CkBAIC05ODcsMTYgKzEwMDUsMTggQEAKIAogCQljYXNlIFVBUlRfMTcxNThfVFhSRFk6CiAJCQkvKgotCQkJICogVFhSRFkgaW50ZXJydXB0IGNsZWFycyBhZnRlciByZWFkaW5nIElTUiByZWdpc3RlciBmb3IgdGhlIFVBUlQgY2hhbm5lbC4KKwkJCSAqIFRYUkRZIGludGVycnVwdCBjbGVhcnMgYWZ0ZXIgcmVhZGluZyBJU1IgcmVnaXN0ZXIKKwkJCSAqIGZvciB0aGUgVUFSVCBjaGFubmVsLgogCQkJICovCiAKIAkJCS8qCiAJCQkgKiBZZXMsIHRoaXMgaXMgb2RkLi4uCiAJCQkgKiBXaHkgd291bGQgSSBjaGVjayBFVkVSWSBwb3NzaWJpbGl0eSBvZiB0eXBlIG9mCiAJCQkgKiBpbnRlcnJ1cHQsIHdoZW4gd2Uga25vdyBpdHMgVFhSRFk/Pz8KLQkJCSAqIEJlY3V6IGZvciBzb21lIHJlYXNvbiwgZXZlbiB0aG8gd2UgZ290IHRyaWdnZXJlZCBmb3IgVFhSRFksCi0JCQkgKiBpdCBzZWVtcyB0byBiZSBvY2Nhc2lvbmFsbHkgd3JvbmcuIEluc3RlYWQgb2YgVFgsIHdoaWNoCi0JCQkgKiBpdCBzaG91bGQgYmUsIEkgd2FzIGdldHRpbmcgdGhpbmdzIGxpa2UgUlhEWSB0b28uIFdlaXJkLgorCQkJICogQmVjdXogZm9yIHNvbWUgcmVhc29uLCBldmVuIHRobyB3ZSBnb3QgdHJpZ2dlcmVkIGZvcgorCQkJICogVFhSRFksIGl0IHNlZW1zIHRvIGJlIG9jY2FzaW9uYWxseSB3cm9uZy4gSW5zdGVhZCBvZgorCQkJICogVFgsIHdoaWNoIGl0IHNob3VsZCBiZSwgSSB3YXMgZ2V0dGluZyB0aGluZ3MgbGlrZQorCQkJICogUlhEWSB0b28uIFdlaXJkLgogCQkJICovCiAJCQluZW9fcGFyc2VfaXNyKGJyZCwgcG9ydCk7CiAJCQlicmVhazsKQEAgLTEwMTEsOCArMTAzMSw4IEBACiAJCWRlZmF1bHQ6CiAJCQkvKgogCQkJICogVGhlIFVBUlQgdHJpZ2dlcmVkIHVzIHdpdGggYSBib2d1cyBpbnRlcnJ1cHQgdHlwZS4KLQkJCSAqIEl0IGFwcGVhcnMgdGhlIEV4YXIgY2hpcCwgd2hlbiBSRUFMTFkgYm9nZ2VkIGRvd24sIHdpbGwgdGhyb3cKLQkJCSAqIHRoZXNlIG9uY2UgYW5kIGF3aGlsZS4KKwkJCSAqIEl0IGFwcGVhcnMgdGhlIEV4YXIgY2hpcCwgd2hlbiBSRUFMTFkgYm9nZ2VkIGRvd24sCisJCQkgKiB3aWxsIHRocm93IHRoZXNlIG9uY2UgYW5kIGF3aGlsZS4KIAkJCSAqIEl0cyBoYXJtbGVzcywganVzdCBpZ25vcmUgaXQgYW5kIG1vdmUgb24uCiAJCQkgKi8KIAkJCWJyZWFrOwpAQCAtMTIzMCw3ICsxMjUwLDggQEAKIAkJfQogCiAJCS8qCi0JCSAqIElmIG91ciBxdWV1ZSBpcyBmdWxsLCB3ZSBoYXZlIG5vIGNob2ljZSBidXQgdG8gZHJvcCBzb21lIGRhdGEuCisJCSAqIElmIG91ciBxdWV1ZSBpcyBmdWxsLCB3ZSBoYXZlIG5vIGNob2ljZSBidXQgdG8gZHJvcCBzb21lCisJCSAqIGRhdGEuCiAJCSAqIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgSFdGTE9XIG9yIFNXRkxPVyBzaG91bGQgaGF2ZSBzdG9wcGVkCiAJCSAqIHRoaW5ncyB3YXkgd2F5IGJlZm9yZSB3ZSBnb3QgdG8gdGhpcyBwb2ludC4KIAkJICoKQEAgLTEzMjMsNyArMTM0NCwxMCBAQAogCW5lb19wY2lfcG9zdGluZ19mbHVzaChjaC0+Y2hfYmQpOwogCiAJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBVQVJUIGZlZWxzIGl0IGNvbXBsZXRlbHkgZmx1c2hlZCB0aGUgRklGTy4gKi8KKwkJLyoKKwkJICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBVQVJUIGZlZWxzIGl0IGNvbXBsZXRlbHkgZmx1c2hlZCB0aGUKKwkJICogRklGTy4KKwkJICovCiAJCXRtcCA9IHJlYWRiKCZjaC0+Y2hfbmVvX3VhcnQtPmlzcl9mY3IpOwogCQlpZiAodG1wICYgNCkKIAkJCXVkZWxheSgxMCk7CkBAIC0xMzUyLDcgKzEzNzYsMTAgQEAKIAluZW9fcGNpX3Bvc3RpbmdfZmx1c2goY2gtPmNoX2JkKTsKIAogCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgVUFSVCBmZWVscyBpdCBjb21wbGV0ZWx5IGZsdXNoZWQgdGhlIEZJRk8uICovCisJCS8qCisJCSAqIENoZWNrIHRvIHNlZSBpZiB0aGUgVUFSVCBmZWVscyBpdCBjb21wbGV0ZWx5IGZsdXNoZWQgdGhlCisJCSAqIEZJRk8uCisJCSAqLwogCQl0bXAgPSByZWFkYigmY2gtPmNoX25lb191YXJ0LT5pc3JfZmNyKTsKIAkJaWYgKHRtcCAmIDIpCiAJCQl1ZGVsYXkoMTApOwpAQCAtMTM5Nyw4ICsxNDI0LDkgQEAKIAkJCWNoLT5jaF9jYWNoZWRfbHNyICY9IH4oVUFSVF9MU1JfVEhSRSk7CiAKIAkJCS8qCi0JCQkgKiBJZiBSVFMgVG9nZ2xlIG1vZGUgaXMgb24sIHR1cm4gb24gUlRTIG5vdyBpZiBub3QgYWxyZWFkeSBzZXQsCi0JCQkgKiBhbmQgbWFrZSBzdXJlIHdlIGdldCBhbiBldmVudCB3aGVuIHRoZSBkYXRhIHRyYW5zZmVyIGhhcyBjb21wbGV0ZWQuCisJCQkgKiBJZiBSVFMgVG9nZ2xlIG1vZGUgaXMgb24sIHR1cm4gb24gUlRTIG5vdyBpZiBub3QKKwkJCSAqIGFscmVhZHkgc2V0LCBhbmQgbWFrZSBzdXJlIHdlIGdldCBhbiBldmVudCB3aGVuIHRoZQorCQkJICogZGF0YSB0cmFuc2ZlciBoYXMgY29tcGxldGVkLgogCQkJICovCiAJCQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERJR0lfUlRTX1RPR0dMRSkgewogCQkJCWlmICghKGNoLT5jaF9tb3N0YXQgJiBVQVJUX01DUl9SVFMpKSB7CkBAIC0xNDA4LDggKzE0MzYsOSBAQAogCQkJCWNoLT5jaF90dW4udW5fZmxhZ3MgfD0gKFVOX0VNUFRZKTsKIAkJCX0KIAkJCS8qCi0JCQkgKiBJZiBEVFIgVG9nZ2xlIG1vZGUgaXMgb24sIHR1cm4gb24gRFRSIG5vdyBpZiBub3QgYWxyZWFkeSBzZXQsCi0JCQkgKiBhbmQgbWFrZSBzdXJlIHdlIGdldCBhbiBldmVudCB3aGVuIHRoZSBkYXRhIHRyYW5zZmVyIGhhcyBjb21wbGV0ZWQuCisJCQkgKiBJZiBEVFIgVG9nZ2xlIG1vZGUgaXMgb24sIHR1cm4gb24gRFRSIG5vdyBpZiBub3QKKwkJCSAqIGFscmVhZHkgc2V0LCBhbmQgbWFrZSBzdXJlIHdlIGdldCBhbiBldmVudCB3aGVuIHRoZQorCQkJICogZGF0YSB0cmFuc2ZlciBoYXMgY29tcGxldGVkLgogCQkJICovCiAJCQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERJR0lfRFRSX1RPR0dMRSkgewogCQkJCWlmICghKGNoLT5jaF9tb3N0YXQgJiBVQVJUX01DUl9EVFIpKSB7CkBAIC0xNDY1LDcgKzE0OTQsOCBAQAogCiAJCS8qCiAJCSAqIElmIFJUUyBUb2dnbGUgbW9kZSBpcyBvbiwgdHVybiBvbiBSVFMgbm93IGlmIG5vdCBhbHJlYWR5IHNldCwKLQkJICogYW5kIG1ha2Ugc3VyZSB3ZSBnZXQgYW4gZXZlbnQgd2hlbiB0aGUgZGF0YSB0cmFuc2ZlciBoYXMgY29tcGxldGVkLgorCQkgKiBhbmQgbWFrZSBzdXJlIHdlIGdldCBhbiBldmVudCB3aGVuIHRoZSBkYXRhIHRyYW5zZmVyIGhhcworCQkgKiBjb21wbGV0ZWQuCiAJCSAqLwogCQlpZiAoY2gtPmNoX2RpZ2kuZGlnaV9mbGFncyAmIERJR0lfUlRTX1RPR0dMRSkgewogCQkJaWYgKCEoY2gtPmNoX21vc3RhdCAmIFVBUlRfTUNSX1JUUykpIHsKQEAgLTE0NzcsNyArMTUwNyw4IEBACiAKIAkJLyoKIAkJICogSWYgRFRSIFRvZ2dsZSBtb2RlIGlzIG9uLCB0dXJuIG9uIERUUiBub3cgaWYgbm90IGFscmVhZHkgc2V0LAotCQkgKiBhbmQgbWFrZSBzdXJlIHdlIGdldCBhbiBldmVudCB3aGVuIHRoZSBkYXRhIHRyYW5zZmVyIGhhcyBjb21wbGV0ZWQuCisJCSAqIGFuZCBtYWtlIHN1cmUgd2UgZ2V0IGFuIGV2ZW50IHdoZW4gdGhlIGRhdGEgdHJhbnNmZXIgaGFzCisJCSAqIGNvbXBsZXRlZC4KIAkJICovCiAJCWlmIChjaC0+Y2hfZGlnaS5kaWdpX2ZsYWdzICYgRElHSV9EVFJfVE9HR0xFKSB7CiAJCQlpZiAoIShjaC0+Y2hfbW9zdGF0ICYgVUFSVF9NQ1JfRFRSKSkgewpAQCAtMTU0MSw3ICsxNTcyLDEwIEBACiAJCX0KIAl9CiAKLQkvKiBTY3J1YiBvZmYgbG93ZXIgYml0cy4gVGhleSBzaWduaWZ5IGRlbHRhJ3MsIHdoaWNoIEkgZG9uJ3QgY2FyZSBhYm91dCAqLworCS8qCisJICogU2NydWIgb2ZmIGxvd2VyIGJpdHMuIFRoZXkgc2lnbmlmeSBkZWx0YSdzLCB3aGljaCBJIGRvbid0IGNhcmUKKwkgKiBhYm91dAorCSAqLwogCW1zaWduYWxzICY9IDB4ZjA7CiAKIAlpZiAobXNpZ25hbHMgJiBVQVJUX01TUl9EQ0QpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3N5c2ZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3N5c2ZzLmMKaW5kZXggYjhkNDFjNS4uMjkwYmY2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19zeXNmcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfc3lzZnMuYwpAQCAtMjUsMzEgKzI1LDMxIEBACiAjaW5jbHVkZSAiZGduY19kcml2ZXIuaCIKICNpbmNsdWRlICJkZ25jX21nbXQuaCIKIAotc3RhdGljIHNzaXplX3QgZGduY19kcml2ZXJfdmVyc2lvbl9zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHZlcnNpb25fc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRwLCBjaGFyICpidWYpCiB7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIERHX1BBUlQpOwogfQotc3RhdGljIERSSVZFUl9BVFRSKHZlcnNpb24sIFNfSVJVU1IsIGRnbmNfZHJpdmVyX3ZlcnNpb25fc2hvdywgTlVMTCk7CitzdGF0aWMgRFJJVkVSX0FUVFJfUk8odmVyc2lvbik7CiAKLXN0YXRpYyBzc2l6ZV90IGRnbmNfZHJpdmVyX2JvYXJkc19zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IGJvYXJkc19zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsIGNoYXIgKmJ1ZikKIHsKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgZGduY19udW1fYm9hcmRzKTsKIH0KLXN0YXRpYyBEUklWRVJfQVRUUihib2FyZHMsIFNfSVJVU1IsIGRnbmNfZHJpdmVyX2JvYXJkc19zaG93LCBOVUxMKTsKK3N0YXRpYyBEUklWRVJfQVRUUl9STyhib2FyZHMpOwogCi1zdGF0aWMgc3NpemVfdCBkZ25jX2RyaXZlcl9tYXhib2FyZHNfc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRwLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBtYXhib2FyZHNfc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRwLCBjaGFyICpidWYpCiB7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIE1BWEJPQVJEUyk7CiB9Ci1zdGF0aWMgRFJJVkVSX0FUVFIobWF4Ym9hcmRzLCBTX0lSVVNSLCBkZ25jX2RyaXZlcl9tYXhib2FyZHNfc2hvdywgTlVMTCk7CitzdGF0aWMgRFJJVkVSX0FUVFJfUk8obWF4Ym9hcmRzKTsKIAotc3RhdGljIHNzaXplX3QgZGduY19kcml2ZXJfcG9sbHJhdGVfc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRwLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBwb2xscmF0ZV9zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsIGNoYXIgKmJ1ZikKIHsKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZG1zXG4iLCBkZ25jX3BvbGxfdGljayk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGRnbmNfZHJpdmVyX3BvbGxyYXRlX3N0b3JlKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHAsCi0JCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBwb2xscmF0ZV9zdG9yZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZGRwLAorCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgdGljazsKQEAgLTY1LDggKzY1LDcgQEAKIAogCXJldHVybiBjb3VudDsKIH0KLXN0YXRpYyBEUklWRVJfQVRUUihwb2xscmF0ZSwgKFNfSVJVU1IgfCBTX0lXVVNSKSwgZGduY19kcml2ZXJfcG9sbHJhdGVfc2hvdywKLQkJICAgZGduY19kcml2ZXJfcG9sbHJhdGVfc3RvcmUpOworc3RhdGljIERSSVZFUl9BVFRSX1JXKHBvbGxyYXRlKTsKIAogdm9pZCBkZ25jX2NyZWF0ZV9kcml2ZXJfc3lzZmlsZXMoc3RydWN0IHBjaV9kcml2ZXIgKmRnbmNfZHJpdmVyKQogewpAQCAtMTAzLDggKzEwMiw4IEBACiAJCQlyZXR1cm4gMDsJCQkJXAogCX0gd2hpbGUgKDApCiAKLXN0YXRpYyBzc2l6ZV90IGRnbmNfdnBkX3Nob3coc3RydWN0IGRldmljZSAqcCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHZwZF9zaG93KHN0cnVjdCBkZXZpY2UgKnAsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQogewogCXN0cnVjdCBkZ25jX2JvYXJkICpiZDsKIAlpbnQgY291bnQgPSAwOwpAQCAtMTIzLDEwICsxMjIsMTAgQEAKIAogCXJldHVybiBjb3VudDsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUih2cGQsIFNfSVJVU1IsIGRnbmNfdnBkX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSX1JPKHZwZCk7CiAKLXN0YXRpYyBzc2l6ZV90IGRnbmNfc2VyaWFsX251bWJlcl9zaG93KHN0cnVjdCBkZXZpY2UgKnAsCi0JCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzZXJpYWxfbnVtYmVyX3Nob3coc3RydWN0IGRldmljZSAqcCwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGRnbmNfYm9hcmQgKmJkOwogCWludCBjb3VudCA9IDA7CkBAIC0xNDAsMTAgKzEzOSwxMCBAQAogCiAJcmV0dXJuIGNvdW50OwogfQotc3RhdGljIERFVklDRV9BVFRSKHNlcmlhbF9udW1iZXIsIFNfSVJVU1IsIGRnbmNfc2VyaWFsX251bWJlcl9zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhzZXJpYWxfbnVtYmVyKTsKIAotc3RhdGljIHNzaXplX3QgZGduY19wb3J0c19zdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKnAsCi0JCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgcG9ydHNfc3RhdGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGRnbmNfYm9hcmQgKmJkOwogCWludCBjb3VudCA9IDA7CkBAIC0xNTgsMTAgKzE1NywxMCBAQAogCX0KIAlyZXR1cm4gY291bnQ7CiB9Ci1zdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfc3RhdGUsIFNfSVJVU1IsIGRnbmNfcG9ydHNfc3RhdGVfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8ocG9ydHNfc3RhdGUpOwogCi1zdGF0aWMgc3NpemVfdCBkZ25jX3BvcnRzX2JhdWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAotCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgcG9ydHNfYmF1ZF9zaG93KHN0cnVjdCBkZXZpY2UgKnAsCisJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZGduY19ib2FyZCAqYmQ7CiAJaW50IGNvdW50ID0gMDsKQEAgLTE3NiwxMSArMTc1LDEwIEBACiAJfQogCXJldHVybiBjb3VudDsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUihwb3J0c19iYXVkLCBTX0lSVVNSLCBkZ25jX3BvcnRzX2JhdWRfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8ocG9ydHNfYmF1ZCk7CiAKLXN0YXRpYyBzc2l6ZV90IGRnbmNfcG9ydHNfbXNpZ25hbHNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAotCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkJY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgcG9ydHNfbXNpZ25hbHNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGRnbmNfYm9hcmQgKmJkOwogCWludCBjb3VudCA9IDA7CkBAIC0yMDgsMTAgKzIwNiwxMCBAQAogCX0KIAlyZXR1cm4gY291bnQ7CiB9Ci1zdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfbXNpZ25hbHMsIFNfSVJVU1IsIGRnbmNfcG9ydHNfbXNpZ25hbHNfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8ocG9ydHNfbXNpZ25hbHMpOwogCi1zdGF0aWMgc3NpemVfdCBkZ25jX3BvcnRzX2lmbGFnX3Nob3coc3RydWN0IGRldmljZSAqcCwKLQkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBwb3J0c19pZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKnAsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZGduY19ib2FyZCAqYmQ7CiAJaW50IGNvdW50ID0gMDsKQEAgLTIyNiwxMCArMjI0LDEwIEBACiAJfQogCXJldHVybiBjb3VudDsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUihwb3J0c19pZmxhZywgU19JUlVTUiwgZGduY19wb3J0c19pZmxhZ19zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhwb3J0c19pZmxhZyk7CiAKLXN0YXRpYyBzc2l6ZV90IGRnbmNfcG9ydHNfY2ZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAotCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHBvcnRzX2NmbGFnX3Nob3coc3RydWN0IGRldmljZSAqcCwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBkZ25jX2JvYXJkICpiZDsKIAlpbnQgY291bnQgPSAwOwpAQCAtMjQ0LDEwICsyNDIsMTAgQEAKIAl9CiAJcmV0dXJuIGNvdW50OwogfQotc3RhdGljIERFVklDRV9BVFRSKHBvcnRzX2NmbGFnLCBTX0lSVVNSLCBkZ25jX3BvcnRzX2NmbGFnX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSX1JPKHBvcnRzX2NmbGFnKTsKIAotc3RhdGljIHNzaXplX3QgZGduY19wb3J0c19vZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKnAsCi0JCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgcG9ydHNfb2ZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGRnbmNfYm9hcmQgKmJkOwogCWludCBjb3VudCA9IDA7CkBAIC0yNjIsMTAgKzI2MCwxMCBAQAogCX0KIAlyZXR1cm4gY291bnQ7CiB9Ci1zdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfb2ZsYWcsIFNfSVJVU1IsIGRnbmNfcG9ydHNfb2ZsYWdfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8ocG9ydHNfb2ZsYWcpOwogCi1zdGF0aWMgc3NpemVfdCBkZ25jX3BvcnRzX2xmbGFnX3Nob3coc3RydWN0IGRldmljZSAqcCwKLQkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBwb3J0c19sZmxhZ19zaG93KHN0cnVjdCBkZXZpY2UgKnAsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZGduY19ib2FyZCAqYmQ7CiAJaW50IGNvdW50ID0gMDsKQEAgLTI4MCwxMSArMjc4LDEwIEBACiAJfQogCXJldHVybiBjb3VudDsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUihwb3J0c19sZmxhZywgU19JUlVTUiwgZGduY19wb3J0c19sZmxhZ19zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhwb3J0c19sZmxhZyk7CiAKLXN0YXRpYyBzc2l6ZV90IGRnbmNfcG9ydHNfZGlnaV9mbGFnX3Nob3coc3RydWN0IGRldmljZSAqcCwKLQkJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCQkgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgcG9ydHNfZGlnaV9mbGFnX3Nob3coc3RydWN0IGRldmljZSAqcCwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZGduY19ib2FyZCAqYmQ7CiAJaW50IGNvdW50ID0gMDsKQEAgLTI5OSwxMCArMjk2LDEwIEBACiAJfQogCXJldHVybiBjb3VudDsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUihwb3J0c19kaWdpX2ZsYWcsIFNfSVJVU1IsIGRnbmNfcG9ydHNfZGlnaV9mbGFnX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSX1JPKHBvcnRzX2RpZ2lfZmxhZyk7CiAKLXN0YXRpYyBzc2l6ZV90IGRnbmNfcG9ydHNfcnhjb3VudF9zaG93KHN0cnVjdCBkZXZpY2UgKnAsCi0JCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBwb3J0c19yeGNvdW50X3Nob3coc3RydWN0IGRldmljZSAqcCwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGRnbmNfYm9hcmQgKmJkOwogCWludCBjb3VudCA9IDA7CkBAIC0zMTcsMTAgKzMxNCwxMCBAQAogCX0KIAlyZXR1cm4gY291bnQ7CiB9Ci1zdGF0aWMgREVWSUNFX0FUVFIocG9ydHNfcnhjb3VudCwgU19JUlVTUiwgZGduY19wb3J0c19yeGNvdW50X3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSX1JPKHBvcnRzX3J4Y291bnQpOwogCi1zdGF0aWMgc3NpemVfdCBkZ25jX3BvcnRzX3R4Y291bnRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpwLAotCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgcG9ydHNfdHhjb3VudF9zaG93KHN0cnVjdCBkZXZpY2UgKnAsCisJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBkZ25jX2JvYXJkICpiZDsKIAlpbnQgY291bnQgPSAwOwpAQCAtMzM1LDcgKzMzMiw3IEBACiAJfQogCXJldHVybiBjb3VudDsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUihwb3J0c190eGNvdW50LCBTX0lSVVNSLCBkZ25jX3BvcnRzX3R4Y291bnRfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8ocG9ydHNfdHhjb3VudCk7CiAKIC8qIHRoaXMgZnVuY3Rpb24gY3JlYXRlcyB0aGUgc3lzIGZpbGVzIHRoYXQgd2lsbCBleHBvcnQgZWFjaCBzaWduYWwgc3RhdHVzCiAgKiB0byBzeXNmcyBlYWNoIHZhbHVlIHdpbGwgYmUgcHV0IGluIGEgc2VwYXJhdGUgZmlsZW5hbWUKQEAgLTM3OCw4ICszNzUsOCBAQAogCWRldmljZV9yZW1vdmVfZmlsZSgmYmQtPnBkZXYtPmRldiwgJmRldl9hdHRyX3NlcmlhbF9udW1iZXIpOwogfQogCi1zdGF0aWMgc3NpemVfdCBkZ25jX3R0eV9zdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHR0eV9zdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmQsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBkZ25jX2JvYXJkICpiZDsKIAlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKQEAgLTQwMiwxMCArMzk5LDEwIEBACiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXMiLAogCQkJdW4tPnVuX29wZW5fY291bnQgPyAiT3BlbiIgOiAiQ2xvc2VkIik7CiB9Ci1zdGF0aWMgREVWSUNFX0FUVFIoc3RhdGUsIFNfSVJVU1IsIGRnbmNfdHR5X3N0YXRlX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSX1JPKHR0eV9zdGF0ZSk7CiAKLXN0YXRpYyBzc2l6ZV90IGRnbmNfdHR5X2JhdWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHR0eV9iYXVkX3Nob3coc3RydWN0IGRldmljZSAqZCwKKwkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZGduY19ib2FyZCAqYmQ7CiAJc3RydWN0IGNoYW5uZWxfdCAqY2g7CkBAIC00MjcsMTAgKzQyNCwxMCBAQAogCiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGNoLT5jaF9vbGRfYmF1ZCk7CiB9Ci1zdGF0aWMgREVWSUNFX0FUVFIoYmF1ZCwgU19JUlVTUiwgZGduY190dHlfYmF1ZF9zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyh0dHlfYmF1ZCk7CiAKLXN0YXRpYyBzc2l6ZV90IGRnbmNfdHR5X21zaWduYWxzX3Nob3coc3RydWN0IGRldmljZSAqZCwKLQkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgdHR5X21zaWduYWxzX3Nob3coc3RydWN0IGRldmljZSAqZCwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZGduY19ib2FyZCAqYmQ7CiAJc3RydWN0IGNoYW5uZWxfdCAqY2g7CkBAIC00NjEsMTAgKzQ1OCwxMCBAQAogCX0KIAlyZXR1cm4gMDsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUihtc2lnbmFscywgU19JUlVTUiwgZGduY190dHlfbXNpZ25hbHNfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8odHR5X21zaWduYWxzKTsKIAotc3RhdGljIHNzaXplX3QgZGduY190dHlfaWZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCB0dHlfaWZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZGduY19ib2FyZCAqYmQ7CiAJc3RydWN0IGNoYW5uZWxfdCAqY2g7CkBAIC00ODYsMTAgKzQ4MywxMCBAQAogCiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXhcbiIsIGNoLT5jaF9jX2lmbGFnKTsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUihpZmxhZywgU19JUlVTUiwgZGduY190dHlfaWZsYWdfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8odHR5X2lmbGFnKTsKIAotc3RhdGljIHNzaXplX3QgZGduY190dHlfY2ZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCB0dHlfY2ZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZGduY19ib2FyZCAqYmQ7CiAJc3RydWN0IGNoYW5uZWxfdCAqY2g7CkBAIC01MTEsMTAgKzUwOCwxMCBAQAogCiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXhcbiIsIGNoLT5jaF9jX2NmbGFnKTsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUihjZmxhZywgU19JUlVTUiwgZGduY190dHlfY2ZsYWdfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8odHR5X2NmbGFnKTsKIAotc3RhdGljIHNzaXplX3QgZGduY190dHlfb2ZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCB0dHlfb2ZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZGduY19ib2FyZCAqYmQ7CiAJc3RydWN0IGNoYW5uZWxfdCAqY2g7CkBAIC01MzYsMTAgKzUzMywxMCBAQAogCiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXhcbiIsIGNoLT5jaF9jX29mbGFnKTsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUihvZmxhZywgU19JUlVTUiwgZGduY190dHlfb2ZsYWdfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8odHR5X29mbGFnKTsKIAotc3RhdGljIHNzaXplX3QgZGduY190dHlfbGZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCB0dHlfbGZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZGduY19ib2FyZCAqYmQ7CiAJc3RydWN0IGNoYW5uZWxfdCAqY2g7CkBAIC01NjEsMTAgKzU1OCwxMCBAQAogCiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXhcbiIsIGNoLT5jaF9jX2xmbGFnKTsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUihsZmxhZywgU19JUlVTUiwgZGduY190dHlfbGZsYWdfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8odHR5X2xmbGFnKTsKIAotc3RhdGljIHNzaXplX3QgZGduY190dHlfZGlnaV9mbGFnX3Nob3coc3RydWN0IGRldmljZSAqZCwKLQkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHR0eV9kaWdpX2ZsYWdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZGduY19ib2FyZCAqYmQ7CiAJc3RydWN0IGNoYW5uZWxfdCAqY2g7CkBAIC01ODYsMTAgKzU4MywxMCBAQAogCiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXhcbiIsIGNoLT5jaF9kaWdpLmRpZ2lfZmxhZ3MpOwogfQotc3RhdGljIERFVklDRV9BVFRSKGRpZ2lfZmxhZywgU19JUlVTUiwgZGduY190dHlfZGlnaV9mbGFnX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSX1JPKHR0eV9kaWdpX2ZsYWcpOwogCi1zdGF0aWMgc3NpemVfdCBkZ25jX3R0eV9yeGNvdW50X3Nob3coc3RydWN0IGRldmljZSAqZCwKLQkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCB0dHlfcnhjb3VudF9zaG93KHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZGduY19ib2FyZCAqYmQ7CiAJc3RydWN0IGNoYW5uZWxfdCAqY2g7CkBAIC02MTEsMTAgKzYwOCwxMCBAQAogCiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWxkXG4iLCBjaC0+Y2hfcnhjb3VudCk7CiB9Ci1zdGF0aWMgREVWSUNFX0FUVFIocnhjb3VudCwgU19JUlVTUiwgZGduY190dHlfcnhjb3VudF9zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyh0dHlfcnhjb3VudCk7CiAKLXN0YXRpYyBzc2l6ZV90IGRnbmNfdHR5X3R4Y291bnRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHR0eV90eGNvdW50X3Nob3coc3RydWN0IGRldmljZSAqZCwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBkZ25jX2JvYXJkICpiZDsKIAlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKQEAgLTYzNiwxMCArNjMzLDEwIEBACiAKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGRcbiIsIGNoLT5jaF90eGNvdW50KTsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUih0eGNvdW50LCBTX0lSVVNSLCBkZ25jX3R0eV90eGNvdW50X3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSX1JPKHR0eV90eGNvdW50KTsKIAotc3RhdGljIHNzaXplX3QgZGduY190dHlfbmFtZV9zaG93KHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgdHR5X2N1c3RvbV9uYW1lX3Nob3coc3RydWN0IGRldmljZSAqZCwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgZGduY19ib2FyZCAqYmQ7CiAJc3RydWN0IGNoYW5uZWxfdCAqY2g7CkBAIC02NjMsMjQgKzY2MCwyNCBAQAogCQkodW4tPnVuX3R5cGUgPT0gREdOQ19QUklOVCkgPyAicHIiIDogInR0eSIsCiAJCWJkLT5ib2FyZG51bSArIDEsICdhJyArIGNoLT5jaF9wb3J0bnVtKTsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUihjdXN0b21fbmFtZSwgU19JUlVTUiwgZGduY190dHlfbmFtZV9zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyh0dHlfY3VzdG9tX25hbWUpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZGduY19zeXNmc190dHlfZW50cmllc1tdID0gewotCSZkZXZfYXR0cl9zdGF0ZS5hdHRyLAotCSZkZXZfYXR0cl9iYXVkLmF0dHIsCi0JJmRldl9hdHRyX21zaWduYWxzLmF0dHIsCi0JJmRldl9hdHRyX2lmbGFnLmF0dHIsCi0JJmRldl9hdHRyX2NmbGFnLmF0dHIsCi0JJmRldl9hdHRyX29mbGFnLmF0dHIsCi0JJmRldl9hdHRyX2xmbGFnLmF0dHIsCi0JJmRldl9hdHRyX2RpZ2lfZmxhZy5hdHRyLAotCSZkZXZfYXR0cl9yeGNvdW50LmF0dHIsCi0JJmRldl9hdHRyX3R4Y291bnQuYXR0ciwKLQkmZGV2X2F0dHJfY3VzdG9tX25hbWUuYXR0ciwKKwkmZGV2X2F0dHJfdHR5X3N0YXRlLmF0dHIsCisJJmRldl9hdHRyX3R0eV9iYXVkLmF0dHIsCisJJmRldl9hdHRyX3R0eV9tc2lnbmFscy5hdHRyLAorCSZkZXZfYXR0cl90dHlfaWZsYWcuYXR0ciwKKwkmZGV2X2F0dHJfdHR5X2NmbGFnLmF0dHIsCisJJmRldl9hdHRyX3R0eV9vZmxhZy5hdHRyLAorCSZkZXZfYXR0cl90dHlfbGZsYWcuYXR0ciwKKwkmZGV2X2F0dHJfdHR5X2RpZ2lfZmxhZy5hdHRyLAorCSZkZXZfYXR0cl90dHlfcnhjb3VudC5hdHRyLAorCSZkZXZfYXR0cl90dHlfdHhjb3VudC5hdHRyLAorCSZkZXZfYXR0cl90dHlfY3VzdG9tX25hbWUuYXR0ciwKIAlOVUxMCiB9OwogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBkZ25jX3R0eV9hdHRyaWJ1dGVfZ3JvdXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBkZ25jX3R0eV9hdHRyaWJ1dGVfZ3JvdXAgPSB7CiAJLm5hbWUgPSBOVUxMLAogCS5hdHRycyA9IGRnbmNfc3lzZnNfdHR5X2VudHJpZXMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY190dHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfdHR5LmMKaW5kZXggNGVlZWNjOS4uOTUzZDkzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY190dHkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3R0eS5jCkBAIC00NSw3ICs0NSw2IEBACiAvKgogICogaW50ZXJuYWwgdmFyaWFibGVzCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZGduY19ib2FyZAkqZGduY19Cb2FyZHNCeU1ham9yWzI1Nl07CiBzdGF0aWMgdW5zaWduZWQgY2hhcgkJKmRnbmNfVG1wV3JpdGVCdWY7CiAKIC8qCkBAIC0xMDAsNyArOTksNyBAQAogc3RhdGljIHZvaWQgZGduY190dHlfZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiBzdGF0aWMgdm9pZCBkZ25jX3R0eV9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiBzdGF0aWMgdm9pZCBkZ25jX3R0eV9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7Ci1zdGF0aWMgaW50IGRnbmNfc2V0X21vZGVtX2luZm8oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgaW50IGNvbW1hbmQsCitzdGF0aWMgaW50IGRnbmNfc2V0X21vZGVtX2luZm8oc3RydWN0IGNoYW5uZWxfdCAqY2gsIHVuc2lnbmVkIGludCBjb21tYW5kLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBfX3VzZXIgKnZhbHVlKTsKIHN0YXRpYyBpbnQgZGduY19nZXRfbW9kZW1faW5mbyhzdHJ1Y3QgY2hhbm5lbF90ICpjaCwKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgX191c2VyICp2YWx1ZSk7CkBAIC0xODYsNyArMTg1LDggQEAKIAlpZiAoSVNfRVJSKGJyZC0+c2VyaWFsX2RyaXZlcikpCiAJCXJldHVybiBQVFJfRVJSKGJyZC0+c2VyaWFsX2RyaXZlcik7CiAKLQlzbnByaW50ZihicmQtPnNlcmlhbF9uYW1lLCBNQVhUVFlOQU1FTEVOLCAidHR5X2RnbmNfJWRfIiwgYnJkLT5ib2FyZG51bSk7CisJc25wcmludGYoYnJkLT5zZXJpYWxfbmFtZSwgTUFYVFRZTkFNRUxFTiwgInR0eV9kZ25jXyVkXyIsCisJCSBicmQtPmJvYXJkbnVtKTsKIAogCWJyZC0+c2VyaWFsX2RyaXZlci0+bmFtZSA9IGJyZC0+c2VyaWFsX25hbWU7CiAJYnJkLT5zZXJpYWxfZHJpdmVyLT5uYW1lX2Jhc2UgPSAwOwpAQCAtMjAzLDE1ICsyMDMsMTEgQEAKIAkgKi8KIAl0dHlfc2V0X29wZXJhdGlvbnMoYnJkLT5zZXJpYWxfZHJpdmVyLCAmZGduY190dHlfb3BzKTsKIAotCWlmICghYnJkLT5kZ25jX21ham9yX3NlcmlhbF9yZWdpc3RlcmVkKSB7Ci0JCS8qIFJlZ2lzdGVyIHR0eSBkZXZpY2VzICovCi0JCXJjID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihicmQtPnNlcmlhbF9kcml2ZXIpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlkZXZfZGJnKCZicmQtPnBkZXYtPmRldiwKLQkJCQkiQ2FuJ3QgcmVnaXN0ZXIgdHR5IGRldmljZSAoJWQpXG4iLCByYyk7Ci0JCQlnb3RvIGZyZWVfc2VyaWFsX2RyaXZlcjsKLQkJfQotCQlicmQtPmRnbmNfbWFqb3Jfc2VyaWFsX3JlZ2lzdGVyZWQgPSB0cnVlOworCXJjID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihicmQtPnNlcmlhbF9kcml2ZXIpOworCWlmIChyYyA8IDApIHsKKwkJZGV2X2RiZygmYnJkLT5wZGV2LT5kZXYsCisJCQkiQ2FuJ3QgcmVnaXN0ZXIgdHR5IGRldmljZSAoJWQpXG4iLCByYyk7CisJCWdvdG8gZnJlZV9zZXJpYWxfZHJpdmVyOwogCX0KIAogCS8qCkBAIC0yNDYsMjAgKzI0MiwxNCBAQAogCSAqLwogCXR0eV9zZXRfb3BlcmF0aW9ucyhicmQtPnByaW50X2RyaXZlciwgJmRnbmNfdHR5X29wcyk7CiAKLQlpZiAoIWJyZC0+ZGduY19tYWpvcl90cmFuc3BhcmVudF9wcmludF9yZWdpc3RlcmVkKSB7Ci0JCS8qIFJlZ2lzdGVyIFRyYW5zcGFyZW50IFByaW50IGRldmljZXMgKi8KLQkJcmMgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyKGJyZC0+cHJpbnRfZHJpdmVyKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJZGV2X2RiZygmYnJkLT5wZGV2LT5kZXYsCi0JCQkJIkNhbid0IHJlZ2lzdGVyIFRyYW5zcGFyZW50IFByaW50IGRldmljZSglZClcbiIsCi0JCQkJcmMpOwotCQkJZ290byBmcmVlX3ByaW50X2RyaXZlcjsKLQkJfQotCQlicmQtPmRnbmNfbWFqb3JfdHJhbnNwYXJlbnRfcHJpbnRfcmVnaXN0ZXJlZCA9IHRydWU7CisJcmMgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyKGJyZC0+cHJpbnRfZHJpdmVyKTsKKwlpZiAocmMgPCAwKSB7CisJCWRldl9kYmcoJmJyZC0+cGRldi0+ZGV2LAorCQkJIkNhbid0IHJlZ2lzdGVyIFRyYW5zcGFyZW50IFByaW50IGRldmljZSglZClcbiIsCisJCQlyYyk7CisJCWdvdG8gZnJlZV9wcmludF9kcml2ZXI7CiAJfQogCi0JZGduY19Cb2FyZHNCeU1ham9yW2JyZC0+c2VyaWFsX2RyaXZlci0+bWFqb3JdID0gYnJkOwotCiAJcmV0dXJuIDA7CiAKIGZyZWVfcHJpbnRfZHJpdmVyOgpAQCAtMjcyLDYgKzI2MiwxNCBAQAogCXJldHVybiByYzsKIH0KIAordm9pZCBkZ25jX3R0eV91bnJlZ2lzdGVyKHN0cnVjdCBkZ25jX2JvYXJkICpicmQpCit7CisJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKGJyZC0+cHJpbnRfZHJpdmVyKTsKKwl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoYnJkLT5zZXJpYWxfZHJpdmVyKTsKKwlwdXRfdHR5X2RyaXZlcihicmQtPnByaW50X2RyaXZlcik7CisJcHV0X3R0eV9kcml2ZXIoYnJkLT5zZXJpYWxfZHJpdmVyKTsKK30KKwogLyoKICAqIGRnbmNfdHR5X2luaXQoKQogICoKQEAgLTM3OCwzOCArMzc2LDMwIEBACiB9CiAKIC8qCi0gKiBkZ25jX3R0eV91bmluaXQoKQorICogZGduY19jbGVhbnVwX3R0eSgpCiAgKgogICogVW5pbml0aWFsaXplIHRoZSBUVFkgcG9ydGlvbiBvZiB0aGlzIGRyaXZlci4gIEZyZWUgYWxsIG1lbW9yeSBhbmQKICAqIHJlc291cmNlcy4KICAqLwotdm9pZCBkZ25jX3R0eV91bmluaXQoc3RydWN0IGRnbmNfYm9hcmQgKmJyZCkKK3ZvaWQgZGduY19jbGVhbnVwX3R0eShzdHJ1Y3QgZGduY19ib2FyZCAqYnJkKQogewogCWludCBpID0gMDsKIAotCWlmIChicmQtPmRnbmNfbWFqb3Jfc2VyaWFsX3JlZ2lzdGVyZWQpIHsKLQkJZGduY19Cb2FyZHNCeU1ham9yW2JyZC0+c2VyaWFsX2RyaXZlci0+bWFqb3JdID0gTlVMTDsKLQkJZm9yIChpID0gMDsgaSA8IGJyZC0+bmFzeW5jOyBpKyspIHsKLQkJCWlmIChicmQtPmNoYW5uZWxzW2ldKQotCQkJCWRnbmNfcmVtb3ZlX3R0eV9zeXNmcyhicmQtPmNoYW5uZWxzW2ldLT4KLQkJCQkJCSAgICAgIGNoX3R1bi51bl9zeXNmcyk7Ci0JCQl0dHlfdW5yZWdpc3Rlcl9kZXZpY2UoYnJkLT5zZXJpYWxfZHJpdmVyLCBpKTsKLQkJfQotCQl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoYnJkLT5zZXJpYWxfZHJpdmVyKTsKLQkJYnJkLT5kZ25jX21ham9yX3NlcmlhbF9yZWdpc3RlcmVkID0gZmFsc2U7CisJZm9yIChpID0gMDsgaSA8IGJyZC0+bmFzeW5jOyBpKyspIHsKKwkJaWYgKGJyZC0+Y2hhbm5lbHNbaV0pCisJCQlkZ25jX3JlbW92ZV90dHlfc3lzZnMoYnJkLT5jaGFubmVsc1tpXS0+CisJCQkJCSAgICAgIGNoX3R1bi51bl9zeXNmcyk7CisJCXR0eV91bnJlZ2lzdGVyX2RldmljZShicmQtPnNlcmlhbF9kcml2ZXIsIGkpOwogCX0KKwl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoYnJkLT5zZXJpYWxfZHJpdmVyKTsKIAotCWlmIChicmQtPmRnbmNfbWFqb3JfdHJhbnNwYXJlbnRfcHJpbnRfcmVnaXN0ZXJlZCkgewotCQlkZ25jX0JvYXJkc0J5TWFqb3JbYnJkLT5wcmludF9kcml2ZXItPm1ham9yXSA9IE5VTEw7Ci0JCWZvciAoaSA9IDA7IGkgPCBicmQtPm5hc3luYzsgaSsrKSB7Ci0JCQlpZiAoYnJkLT5jaGFubmVsc1tpXSkKLQkJCQlkZ25jX3JlbW92ZV90dHlfc3lzZnMoYnJkLT5jaGFubmVsc1tpXS0+Ci0JCQkJCQkgICAgICBjaF9wdW4udW5fc3lzZnMpOwotCQkJdHR5X3VucmVnaXN0ZXJfZGV2aWNlKGJyZC0+cHJpbnRfZHJpdmVyLCBpKTsKLQkJfQotCQl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoYnJkLT5wcmludF9kcml2ZXIpOwotCQlicmQtPmRnbmNfbWFqb3JfdHJhbnNwYXJlbnRfcHJpbnRfcmVnaXN0ZXJlZCA9IGZhbHNlOworCWZvciAoaSA9IDA7IGkgPCBicmQtPm5hc3luYzsgaSsrKSB7CisJCWlmIChicmQtPmNoYW5uZWxzW2ldKQorCQkJZGduY19yZW1vdmVfdHR5X3N5c2ZzKGJyZC0+Y2hhbm5lbHNbaV0tPgorCQkJCQkgICAgICBjaF9wdW4udW5fc3lzZnMpOworCQl0dHlfdW5yZWdpc3Rlcl9kZXZpY2UoYnJkLT5wcmludF9kcml2ZXIsIGkpOwogCX0KKwl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoYnJkLT5wcmludF9kcml2ZXIpOwogCiAJcHV0X3R0eV9kcml2ZXIoYnJkLT5zZXJpYWxfZHJpdmVyKTsKIAlwdXRfdHR5X2RyaXZlcihicmQtPnByaW50X2RyaXZlcik7CkBAIC02NDAsMTkgKzYzMCwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgZGduY19jYXJyaWVyKHN0cnVjdCBjaGFubmVsX3QgKmNoKQogewotCXN0cnVjdCBkZ25jX2JvYXJkICpiZDsKLQogCWludCB2aXJ0X2NhcnJpZXIgPSAwOwogCWludCBwaHlzX2NhcnJpZXIgPSAwOwogCiAJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdOQ19DSEFOTkVMX01BR0lDKQogCQlyZXR1cm47CiAKLQliZCA9IGNoLT5jaF9iZDsKLQotCWlmICghYmQgfHwgYmQtPm1hZ2ljICE9IERHTkNfQk9BUkRfTUFHSUMpCi0JCXJldHVybjsKLQogCWlmIChjaC0+Y2hfbWlzdGF0ICYgVUFSVF9NU1JfRENEKQogCQlwaHlzX2NhcnJpZXIgPSAxOwogCkBAIC05NDcsNiArOTMwLDI0IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKIH0KIAorc3RydWN0IGRnbmNfYm9hcmQgKmZpbmRfYm9hcmRfYnlfbWFqb3IodW5zaWduZWQgaW50IG1ham9yKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWEJPQVJEUzsgaSsrKSB7CisJCXN0cnVjdCBkZ25jX2JvYXJkICpicmQgPSBkZ25jX2JvYXJkW2ldOworCisJCWlmICghYnJkKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJaWYgKG1ham9yID09IGJyZC0+c2VyaWFsX2RyaXZlci0+bWFqb3IgfHwKKwkJICAgIG1ham9yID09IGJyZC0+cHJpbnRfZHJpdmVyLT5tYWpvcikKKwkJCXJldHVybiBicmQ7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBUVFkgRW50cnkgcG9pbnRzIGFuZCBoZWxwZXIgZnVuY3Rpb25zCkBAIC05NzYsNyArOTc3LDcgQEAKIAkJcmV0dXJuIC1FTlhJTzsKIAogCS8qIEdldCBib2FyZCBwb2ludGVyIGZyb20gb3VyIGFycmF5IG9mIG1ham9ycyB3ZSBoYXZlIGFsbG9jYXRlZCAqLwotCWJyZCA9IGRnbmNfQm9hcmRzQnlNYWpvclttYWpvcl07CisJYnJkID0gZmluZF9ib2FyZF9ieV9tYWpvcihtYWpvcik7CiAJaWYgKCFicmQpCiAJCXJldHVybiAtRU5YSU87CiAKQEAgLTExNzIsMTcgKzExNzMsMTIgQEAKIAkJCQlzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKIHsKIAlpbnQgcmV0dmFsID0gMDsKLQlzdHJ1Y3QgdW5fdCAqdW4gPSBOVUxMOworCXN0cnVjdCB1bl90ICp1biA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1aW50CW9sZF9mbGFncyA9IDA7CiAJaW50CXNsZWVwX29uX3VuX2ZsYWdzID0gMDsKIAotCWlmICghdHR5IHx8IHR0eS0+bWFnaWMgIT0gVFRZX01BR0lDIHx8ICFmaWxlIHx8ICFjaCB8fAotCSAgICBjaC0+bWFnaWMgIT0gREdOQ19DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gLUVOWElPOwotCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHTkNfVU5JVF9NQUdJQykKKwlpZiAoIWZpbGUpCiAJCXJldHVybiAtRU5YSU87CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKQEAgLTEzMDEsMTUgKzEyOTcsOSBAQAogICovCiBzdGF0aWMgdm9pZCBkZ25jX3R0eV9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlzdHJ1Y3QgdW5fdAkqdW47Ci0KIAlpZiAoIXR0eSB8fCB0dHktPm1hZ2ljICE9IFRUWV9NQUdJQykKIAkJcmV0dXJuOwogCi0JdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCWlmICghdW4gfHwgdW4tPm1hZ2ljICE9IERHTkNfVU5JVF9NQUdJQykKLQkJcmV0dXJuOwotCiAJLyogZmx1c2ggdGhlIHRyYW5zbWl0IHF1ZXVlcyAqLwogCWRnbmNfdHR5X2ZsdXNoX2J1ZmZlcih0dHkpOwogfQpAQCAtMTUxMCwxOCArMTUwMCw4IEBACiAgKiByZXR1cm5zIHRoZSBuZXcgYnl0ZXNfYXZhaWxhYmxlLiAgVGhpcyBvbmx5IGFmZmVjdHMgcHJpbnRlcgogICogb3V0cHV0LgogICovCi1zdGF0aWMgaW50IGRnbmNfbWF4Y3BzX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGJ5dGVzX2F2YWlsYWJsZSkKK3N0YXRpYyBpbnQgZGduY19tYXhjcHNfcm9vbShzdHJ1Y3QgY2hhbm5lbF90ICpjaCwgaW50IGJ5dGVzX2F2YWlsYWJsZSkKIHsKLQlzdHJ1Y3QgdW5fdCAqdW4gPSB0dHktPmRyaXZlcl9kYXRhOwotCXN0cnVjdCBjaGFubmVsX3QgKmNoID0gdW4tPnVuX2NoOwotCi0JLyoKLQkgKiBJZiBpdHMgbm90IHRoZSBUcmFuc3BhcmVudCBwcmludCBkZXZpY2UsIHJldHVybgotCSAqIHRoZSBmdWxsIGRhdGEgYW1vdW50LgotCSAqLwotCWlmICh1bi0+dW5fdHlwZSAhPSBER05DX1BSSU5UKQotCQlyZXR1cm4gYnl0ZXNfYXZhaWxhYmxlOwotCiAJaWYgKGNoLT5jaF9kaWdpLmRpZ2lfbWF4Y3BzID4gMCAmJiBjaC0+Y2hfZGlnaS5kaWdpX2J1ZnNpemUgPiAwKSB7CiAJCWludCBjcHNfbGltaXQgPSAwOwogCQl1bnNpZ25lZCBsb25nIGN1cnJlbnRfdGltZSA9IGppZmZpZXM7CkBAIC0xNTg1LDcgKzE1NjUsOCBAQAogCQlyZXQgKz0gV1FVRVVFU0laRTsKIAogCS8qIExpbWl0IHByaW50ZXIgdG8gbWF4Y3BzICovCi0JcmV0ID0gZGduY19tYXhjcHNfcm9vbSh0dHksIHJldCk7CisJaWYgKHVuLT51bl90eXBlICE9IERHTkNfUFJJTlQpCisJCXJldCA9IGRnbmNfbWF4Y3BzX3Jvb20oY2gsIHJldCk7CiAKIAkvKgogCSAqIElmIHdlIGFyZSBwcmludGVyIGRldmljZSwgbGVhdmUgc3BhY2UgZm9yCkBAIC0xNjc3LDcgKzE2NTgsOCBAQAogCSAqIExpbWl0IHByaW50ZXIgb3V0cHV0IHRvIG1heGNwcyBvdmVyYWxsLCB3aXRoIGJ1cnN0cyBhbGxvd2VkCiAJICogdXAgdG8gYnVmc2l6ZSBjaGFyYWN0ZXJzLgogCSAqLwotCWJ1ZmNvdW50ID0gZGduY19tYXhjcHNfcm9vbSh0dHksIGJ1ZmNvdW50KTsKKwlpZiAodW4tPnVuX3R5cGUgIT0gREdOQ19QUklOVCkKKwkJYnVmY291bnQgPSBkZ25jX21heGNwc19yb29tKGNoLCBidWZjb3VudCk7CiAKIAkvKgogCSAqIFRha2UgbWluaW11bSBvZiB3aGF0IHRoZSB1c2VyIHdhbnRzIHRvIHNlbmQsIGFuZCB0aGUKQEAgLTE5ODQsNyArMTk2Niw3IEBACiBzdGF0aWMgaW5saW5lIGludCBkZ25jX2dldF9tc3RhdChzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKIHsKIAl1bnNpZ25lZCBjaGFyIG1zdGF0OwotCWludCByZXN1bHQgPSAtRUlPOworCWludCByZXN1bHQgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER05DX0NIQU5ORUxfTUFHSUMpCkBAIC0xOTk2LDggKzE5NzgsNiBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKIAotCXJlc3VsdCA9IDA7Ci0KIAlpZiAobXN0YXQgJiBVQVJUX01DUl9EVFIpCiAJCXJlc3VsdCB8PSBUSU9DTV9EVFI7CiAJaWYgKG1zdGF0ICYgVUFSVF9NQ1JfUlRTKQpAQCAtMjAyOCwzMiArMjAwOCwxNCBAQAogICoKICAqIFNldCBtb2RlbSBzaWduYWxzLCBjYWxsZWQgYnkgbGQuCiAgKi8KLXN0YXRpYyBpbnQgZGduY19zZXRfbW9kZW1faW5mbyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorc3RhdGljIGludCBkZ25jX3NldF9tb2RlbV9pbmZvKHN0cnVjdCBjaGFubmVsX3QgKmNoLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBjb21tYW5kLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBfX3VzZXIgKnZhbHVlKQogewotCXN0cnVjdCBkZ25jX2JvYXJkICpiZDsKLQlzdHJ1Y3QgY2hhbm5lbF90ICpjaDsKLQlzdHJ1Y3QgdW5fdCAqdW47CiAJaW50IHJldCA9IC1FTlhJTzsKIAl1bnNpZ25lZCBpbnQgYXJnID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKCF0dHkgfHwgdHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpCi0JCXJldHVybiByZXQ7Ci0KLQl1biA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaWYgKCF1biB8fCB1bi0+bWFnaWMgIT0gREdOQ19VTklUX01BR0lDKQotCQlyZXR1cm4gcmV0OwotCi0JY2ggPSB1bi0+dW5fY2g7Ci0JaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdOQ19DSEFOTkVMX01BR0lDKQotCQlyZXR1cm4gcmV0OwotCi0JYmQgPSBjaC0+Y2hfYmQ7Ci0JaWYgKCFiZCB8fCBiZC0+bWFnaWMgIT0gREdOQ19CT0FSRF9NQUdJQykKLQkJcmV0dXJuIHJldDsKLQogCXJldCA9IGdldF91c2VyKGFyZywgdmFsdWUpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CkBAIC0yNTkzLDkgKzI1NTUsOCBAQAogCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7CiAKLQkJcmMgPSBwdXRfdXNlcihDX0NMT0NBTCh0dHkpID8gMSA6IDAsCi0JCQkgICAgICAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmcpOwotCQlyZXR1cm4gcmM7CisJCXJldHVybiBwdXRfdXNlcihDX0NMT0NBTCh0dHkpID8gMSA6IDAsCisJCQkJKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJnKTsKIAogCWNhc2UgVElPQ1NTT0ZUQ0FSOgogCkBAIC0yNjIwLDcgKzI1ODEsNyBAQAogCWNhc2UgVElPQ01CSUM6CiAJY2FzZSBUSU9DTVNFVDoKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIGRnbmNfc2V0X21vZGVtX2luZm8odHR5LCBjbWQsIHVhcmcpOworCQlyZXR1cm4gZGduY19zZXRfbW9kZW1faW5mbyhjaCwgY21kLCB1YXJnKTsKIAogCQkvKgogCQkgKiBIZXJlIGFyZSBhbnkgYWRkaXRpb25hbCBpb2N0bCdzIHRoYXQgd2Ugd2FudCB0byBpbXBsZW1lbnQKQEAgLTI3NjYsOCArMjcyNyw4IEBACiAKIAljYXNlIERJR0lfR0VUQ1VTVE9NQkFVRDoKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKLQkJcmMgPSBwdXRfdXNlcihjaC0+Y2hfY3VzdG9tX3NwZWVkLCAodW5zaWduZWQgaW50IF9fdXNlciAqKWFyZyk7Ci0JCXJldHVybiByYzsKKwkJcmV0dXJuIHB1dF91c2VyKGNoLT5jaF9jdXN0b21fc3BlZWQsCisJCQkJKHVuc2lnbmVkIGludCBfX3VzZXIgKilhcmcpOwogCiAJY2FzZSBESUdJX1NFVENVU1RPTUJBVUQ6CiAJewpAQCAtMjg1Myw4ICsyODE0LDcgQEAKIAkJCWV2ZW50cyB8PSAoRVZfSVBVIHwgRVZfSVBTKTsKIAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwotCQlyYyA9IHB1dF91c2VyKGV2ZW50cywgKHVuc2lnbmVkIGludCBfX3VzZXIgKilhcmcpOwotCQlyZXR1cm4gcmM7CisJCXJldHVybiBwdXRfdXNlcihldmVudHMsICh1bnNpZ25lZCBpbnQgX191c2VyICopYXJnKTsKIAl9CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY190dHkuaCBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfdHR5LmgKaW5kZXggMjFkMzM2OS4uMjRjOWE0MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfdHR5LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY190dHkuaApAQCAtMTksMTIgKzE5LDEzIEBACiAjaW5jbHVkZSAiZGduY19kcml2ZXIuaCIKIAogaW50CWRnbmNfdHR5X3JlZ2lzdGVyKHN0cnVjdCBkZ25jX2JvYXJkICpicmQpOwordm9pZCBkZ25jX3R0eV91bnJlZ2lzdGVyKHN0cnVjdCBkZ25jX2JvYXJkICpicmQpOwogCiBpbnQJZGduY190dHlfcHJlaW5pdCh2b2lkKTsKIGludCAgICAgZGduY190dHlfaW5pdChzdHJ1Y3QgZGduY19ib2FyZCAqKTsKIAogdm9pZAlkZ25jX3R0eV9wb3N0X3VuaW5pdCh2b2lkKTsKLXZvaWQJZGduY190dHlfdW5pbml0KHN0cnVjdCBkZ25jX2JvYXJkICopOwordm9pZAlkZ25jX2NsZWFudXBfdHR5KHN0cnVjdCBkZ25jX2JvYXJkICopOwogCiB2b2lkCWRnbmNfaW5wdXQoc3RydWN0IGNoYW5uZWxfdCAqY2gpOwogdm9pZAlkZ25jX2NhcnJpZXIoc3RydWN0IGNoYW5uZWxfdCAqY2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VteHhfdWRjL2VteHhfdWRjLmMgYi9kcml2ZXJzL3N0YWdpbmcvZW14eF91ZGMvZW14eF91ZGMuYwppbmRleCAzYjU2YjI4Li5jM2UyOTg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZW14eF91ZGMvZW14eF91ZGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZW14eF91ZGMvZW14eF91ZGMuYwpAQCAtMTMxLDcgKzEzMSw2IEBACiAJCXJlZ19kYXRhID0gIF9uYnUyc3NfcmVhZGwoCiAJCQkodTMyICopSU9fQUREUkVTUyhVU0JfQkFTRV9BRERSRVNTICsgaSArIDEyKSk7CiAJCWRldl9kYmcoJnVkYy0+ZGV2LCAiICUwOHhcbiIsIChpbnQpcmVnX2RhdGEpOwotCiAJfQogCiAJc3Bpbl9sb2NrKCZ1ZGMtPmxvY2spOwpAQCAtNDc4LDkgKzQ3Nyw5IEBACiApCiB7CiAJaWYgKHJlcS0+cmVxLmRtYSA9PSBETUFfQUREUl9JTlZBTElEKSB7Ci0JCWlmIChyZXEtPnVuYWxpZ25lZCkKKwkJaWYgKHJlcS0+dW5hbGlnbmVkKSB7CiAJCQlyZXEtPnJlcS5kbWEgPSBlcC0+cGh5c19idWY7Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJcmVxLT5yZXEuZG1hID0gZG1hX21hcF9zaW5nbGUoCiAJCQkJdWRjLT5nYWRnZXQuZGV2LnBhcmVudCwKIAkJCQlyZXEtPnJlcS5idWYsCkBAIC0xMjM2LDkgKzEyMzUsOSBAQAogCXJlcS0+ZG1hX2ZsYWcgPSBGQUxTRTsKIAlyZXEtPmRpdl9sZW4gPSAwOwogCi0JaWYgKHJlcS0+cmVxLmxlbmd0aCA9PSAwKQorCWlmIChyZXEtPnJlcS5sZW5ndGggPT0gMCkgewogCQlyZXEtPnplcm8gPSBmYWxzZTsKLQllbHNlIHsKKwl9IGVsc2UgewogCQlpZiAoKHJlcS0+cmVxLmxlbmd0aCAlIGVwLT5lcC5tYXhwYWNrZXQpID09IDApCiAJCQlyZXEtPnplcm8gPSByZXEtPnJlcS56ZXJvOwogCQllbHNlCkBAIC0xOTQxLDkgKzE5NDAsOSBAQAogCWlmIChsaWtlbHkocmVxLT5yZXEuc3RhdHVzID09IC1FSU5QUk9HUkVTUykpCiAJCXJlcS0+cmVxLnN0YXR1cyA9IHN0YXR1czsKIAotCWlmIChlcC0+c3RhbGxlZCkKKwlpZiAoZXAtPnN0YWxsZWQpIHsKIAkJX25idTJzc19lcG5fc2V0X3N0YWxsKHVkYywgZXApOwotCWVsc2UgeworCX0gZWxzZSB7CiAJCWlmICghbGlzdF9lbXB0eSgmZXAtPnF1ZXVlKSkKIAkJCV9uYnUyc3NfcmVzdGVydF90cmFuc2ZlcihlcCk7CiAJfQpAQCAtMjI2NCw5ICsyMjYzLDcgQEAKIAlpZiAodWRjLT51ZGNfZW5hYmxlZCkKIAkJcmV0dXJuIDA7CiAKLQkvKgotCQlSZXNldAotCSovCisJLyogUmVzZXQgKi8KIAlfbmJ1MnNzX2JpdHNldCgmdWRjLT5wX3JlZ3MtPkVQQ1RSLCAoRElSUEQgfCBFUENfUlNUKSk7CiAJdWRlbGF5KEVQQ19SU1RfRElTQUJMRV9USU1FKTsJLyogMXVzIHdhaXQgKi8KIApAQCAtMjQ3Niw4ICsyNDczLDkgQEAKIAkJCV9uYnUyc3Nfd3JpdGVsKCZwcmVnLT5VU0JfSU5UX1NUQSwgflVTQl9JTlRfU1RBX1JXKTsKIAkJCV9uYnUyc3Nfd3JpdGVsKCZwcmVnLT5VU0JfSU5UX0VOQSwgMCk7CiAJCQlzdGF0dXMgPSAwOwotCQl9IGVsc2UKKwkJfSBlbHNlIHsKIAkJCXN0YXR1cyA9IF9uYnUyc3NfcmVhZGwoJnByZWctPlVTQl9JTlRfU1RBKTsKKwkJfQogCiAJCWlmIChzdGF0dXMgPT0gMCkKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2VteHhfdWRjL2VteHhfdWRjLmggYi9kcml2ZXJzL3N0YWdpbmcvZW14eF91ZGMvZW14eF91ZGMuaAppbmRleCAzOTc2OWUzLi43ODliZmI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZW14eF91ZGMvZW14eF91ZGMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZW14eF91ZGMvZW14eF91ZGMuaApAQCAtNTg2LDcgKzU4Niw3IEBACiAJdW5zaWduZWQJCXJlbW90ZV93YWtldXA6MTsKIAl1bnNpZ25lZAkJdWRjX2VuYWJsZWQ6MTsKIAotCXVuc2lnbmVkCQltQTsKKwl1bnNpZ25lZCBpbnQJCW1BOwogCiAJdTMyCQljdXJyX2NvbmZpZzsJLyogQ3VycmVudCBDb25maWd1cmF0aW9uIE51bWJlciAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfYWdtMTI2NGstZmwuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9hZ20xMjY0ay1mbC5jCmluZGV4IDgyYjQ2Y2QuLjc1NjEzODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9hZ20xMjY0ay1mbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9hZ20xMjY0ay1mbC5jCkBAIC0zNTAsOCArMzUwLDggQEAKIAkJCQl9CiAJCX0KIAotCSAvKiAxIHN0cmluZyA9IDIgcGFnZXMgKi8KLQkgZm9yICh5ID0gYWRkcl93aW4ueXNfcGFnZTsgeSA8PSBhZGRyX3dpbi55ZV9wYWdlOyArK3kpIHsKKwkvKiAxIHN0cmluZyA9IDIgcGFnZXMgKi8KKwlmb3IgKHkgPSBhZGRyX3dpbi55c19wYWdlOyB5IDw9IGFkZHJfd2luLnllX3BhZ2U7ICsreSkgewogCQkvKiBsZWZ0IGhhbGYgb2YgZGlzcGxheSAqLwogCQlpZiAoYWRkcl93aW4ueHMgPCBwYXItPmluZm8tPnZhci54cmVzIC8gMikgewogCQkJY29uc3RydWN0X2xpbmVfYml0bWFwKHBhciwgYnVmLCBjb252ZXJ0X2J1ZiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9pbGk5MzIwLmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaWxpOTMyMC5jCmluZGV4IDZmZjIyMmQuLjI3OGU0YzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9pbGk5MzIwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2lsaTkzMjAuYwpAQCAtMjksNyArMjksNyBAQAogI2RlZmluZSBERUZBVUxUX0dBTU1BCSIwNyAwNyA2IDAgMCAwIDUgNSA0IDBcbiIgXAogCQkJIjA3IDA4IDQgNyA1IDEgMiAwIDcgNyIKIAotc3RhdGljIHVuc2lnbmVkIHJlYWRfZGV2aWNlY29kZShzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIpCitzdGF0aWMgdW5zaWduZWQgaW50IHJlYWRfZGV2aWNlY29kZShzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIpCiB7CiAJaW50IHJldDsKIAl1OCByeGJ1Zls4XSA9IHswLCB9OwpAQCAtNDEsNyArNDEsNyBAQAogCiBzdGF0aWMgaW50IGluaXRfZGlzcGxheShzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIpCiB7Ci0JdW5zaWduZWQgZGV2Y29kZTsKKwl1bnNpZ25lZCBpbnQgZGV2Y29kZTsKIAogCXBhci0+ZmJ0ZnRvcHMucmVzZXQocGFyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2lsaTkzMjUuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9pbGk5MzI1LmMKaW5kZXggZmRmOThkMy4uYzMxZTJlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2lsaTkzMjUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaWxpOTMyNS5jCkBAIC0zMiwyNiArMzIsMjYgQEAKICNkZWZpbmUgREVGQVVMVF9HQU1NQQkiMEYgMDAgNyAyIDAgMCA2IDUgNCAxXG4iIFwKIAkJCSIwNCAxNiAyIDcgNiAzIDIgMSA3IDciCiAKLXN0YXRpYyB1bnNpZ25lZCBidCA9IDY7IC8qIFZHTD1WY2kqNCAsIFZHSD1WY2kqNCAqLworc3RhdGljIHVuc2lnbmVkIGludCBidCA9IDY7IC8qIFZHTD1WY2kqNCAsIFZHSD1WY2kqNCAqLwogbW9kdWxlX3BhcmFtKGJ0LCB1aW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoYnQsICJTZXRzIHRoZSBmYWN0b3IgdXNlZCBpbiB0aGUgc3RlcC11cCBjaXJjdWl0cyIpOwogCi1zdGF0aWMgdW5zaWduZWQgdmMgPSAweDAzOyAvKiBWY2kxPVZjaSowLjgwICovCitzdGF0aWMgdW5zaWduZWQgaW50IHZjID0gMHgwMzsgLyogVmNpMT1WY2kqMC44MCAqLwogbW9kdWxlX3BhcmFtKHZjLCB1aW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0ModmMsCiAiU2V0cyB0aGUgcmF0aW8gZmFjdG9yIG9mIFZjaSB0byBnZW5lcmF0ZSB0aGUgcmVmZXJlbmNlIHZvbHRhZ2VzIFZjaTEiKTsKIAotc3RhdGljIHVuc2lnbmVkIHZyaCA9IDB4MGQ7IC8qIFZSRUcxT1VUPVZjaSoxLjg1ICovCitzdGF0aWMgdW5zaWduZWQgaW50IHZyaCA9IDB4MGQ7IC8qIFZSRUcxT1VUPVZjaSoxLjg1ICovCiBtb2R1bGVfcGFyYW0odnJoLCB1aW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0ModnJoLAogIlNldCB0aGUgYW1wbGlmeWluZyByYXRlICgxLjYgfiAxLjkpIG9mIFZjaSBhcHBsaWVkIHRvIG91dHB1dCB0aGUgVlJFRzFPVVQiKTsKIAotc3RhdGljIHVuc2lnbmVkIHZkdiA9IDB4MTI7IC8qIFZDT01IIGFtcGxpdHVkZT1WUkVHMU9VVCowLjk4ICovCitzdGF0aWMgdW5zaWduZWQgaW50IHZkdiA9IDB4MTI7IC8qIFZDT01IIGFtcGxpdHVkZT1WUkVHMU9VVCowLjk4ICovCiBtb2R1bGVfcGFyYW0odmR2LCB1aW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0ModmR2LAogIlNlbGVjdCB0aGUgZmFjdG9yIG9mIFZSRUcxT1VUIHRvIHNldCB0aGUgYW1wbGl0dWRlIG9mIFZjb20iKTsKIAotc3RhdGljIHVuc2lnbmVkIHZjbSA9IDB4MGE7IC8qIFZDT01IPVZSRUcxT1VUKjAuNzM1ICovCitzdGF0aWMgdW5zaWduZWQgaW50IHZjbSA9IDB4MGE7IC8qIFZDT01IPVZSRUcxT1VUKjAuNzM1ICovCiBtb2R1bGVfcGFyYW0odmNtLCB1aW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0ModmNtLCAiU2V0IHRoZSBpbnRlcm5hbCBWY29tSCB2b2x0YWdlIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9wY2Q4NTQ0LmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfcGNkODU0NC5jCmluZGV4IGE2YjQzMzIuLmE0NzEwZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9wY2Q4NTQ0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3BjZDg1NDQuYwpAQCAtMzIsMTEgKzMyLDExIEBACiAjZGVmaW5lIFRYQlVGTEVOICAgICAgICg4NCAqIDYpCiAjZGVmaW5lIERFRkFVTFRfR0FNTUEgICI0MCIgLyogZ2FtbWEgY29udHJvbHMgdGhlIGNvbnRyYXN0IGluIHRoaXMgZHJpdmVyICovCiAKLXN0YXRpYyB1bnNpZ25lZCB0YzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGM7CiBtb2R1bGVfcGFyYW0odGMsIHVpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyh0YywgIlRDWzE6MF0gVGVtcGVyYXR1cmUgY29lZmZpY2llbnQ6IDAtMyAoZGVmYXVsdDogMCkiKTsKIAotc3RhdGljIHVuc2lnbmVkIGJzID0gNDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYnMgPSA0OwogbW9kdWxlX3BhcmFtKGJzLCB1aW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoYnMsICJCU1syOjBdIEJpYXMgdm9sdGFnZSBsZXZlbDogMC03IChkZWZhdWx0OiA0KSIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfczZkMDJhMS5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3M2ZDAyYTEuYwppbmRleCAzMTEzMzU1Li43NzRiMGZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfczZkMDJhMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zNmQwMmExLmMKQEAgLTExMywxMiArMTEzLDE0IEBACiAjZGVmaW5lIE1WIEJJVCg1KQogc3RhdGljIGludCBzZXRfdmFyKHN0cnVjdCBmYnRmdF9wYXIgKnBhcikKIHsKLQkvKiBNZW1vcnkgZGF0YSBhY2Nlc3MgY29udHJvbCAoMHgzNmgpCi0JICAgICBSR0IvQkdSOgotCQkxLiBNb2RlIHNlbGVjdGlvbiBwaW4gU1JHQgotCQkJUkdCIEgvVyBwaW4gZm9yIGNvbG9yIGZpbHRlciBzZXR0aW5nOiAwPVJHQiwgMT1CR1IKLQkJMi4gTUFEQ1RMIFJHQiBiaXQKLQkJCVJHQi1CR1IgT1JERVIgY29sb3IgZmlsdGVyIHBhbmVsOiAwPVJHQiwgMT1CR1IgKi8KKwkvKgorCSAqIE1lbW9yeSBkYXRhIGFjY2VzcyBjb250cm9sICgweDM2aCkKKwkgKiBSR0IvQkdSOgorCSAqCTEuIE1vZGUgc2VsZWN0aW9uIHBpbiBTUkdCCisJICoJCVJHQiBIL1cgcGluIGZvciBjb2xvciBmaWx0ZXIgc2V0dGluZzogMD1SR0IsIDE9QkdSCisJICoJMi4gTUFEQ1RMIFJHQiBiaXQKKwkgKgkJUkdCLUJHUiBPUkRFUiBjb2xvciBmaWx0ZXIgcGFuZWw6IDA9UkdCLCAxPUJHUgorCSAqLwogCXN3aXRjaCAocGFyLT5pbmZvLT52YXIucm90YXRlKSB7CiAJY2FzZSAwOgogCQl3cml0ZV9yZWcocGFyLCBNSVBJX0RDU19TRVRfQUREUkVTU19NT0RFLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3M2ZDExMjEuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zNmQxMTIxLmMKaW5kZXggZDZhZTc2Yi4uOWIxZDcwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3M2ZDExMjEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfczZkMTEyMS5jCkBAIC0xMjUsMTAgKzEyNSwxMCBAQAogfQogCiAvKgotICBHYW1tYSBzdHJpbmcgZm9ybWF0OgotICAgIFBLUDAgUEtQMSBQS1AyIFBLUDMgUEtQNCBQS1A1IFBLUDYgUEtQNyBQS1A4IFBLUDkgUEtQMTAgUEtQMTEgVlJQMCBWUlAxCi0gICAgUEtOMCBQS04xIFBLTjIgUEtOMyBQS040IFBLTjUgUEtONiBQS043IFBSTjggUFJOOSBQUk4xMCBQUk4xMSBWUk4wIFZSTjEKLSovCisgKiBHYW1tYSBzdHJpbmcgZm9ybWF0OgorICogUEtQMCBQS1AxIFBLUDIgUEtQMyBQS1A0IFBLUDUgUEtQNiBQS1A3IFBLUDggUEtQOSBQS1AxMCBQS1AxMSBWUlAwIFZSUDEKKyAqIFBLTjAgUEtOMSBQS04yIFBLTjMgUEtONCBQS041IFBLTjYgUEtONyBQUk44IFBSTjkgUFJOMTAgUFJOMTEgVlJOMCBWUk4xCisgKi8KICNkZWZpbmUgQ1VSVkUobnVtLCBpZHgpICBjdXJ2ZXNbbnVtICogcGFyLT5nYW1tYS5udW1fdmFsdWVzICsgaWR4XQogc3RhdGljIGludCBzZXRfZ2FtbWEoc3RydWN0IGZidGZ0X3BhciAqcGFyLCB1bnNpZ25lZCBsb25nICpjdXJ2ZXMpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfc3NkMTI4OS5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3NzZDEyODkuYwppbmRleCAxMTYyYzA4Li4yNWY5ZmJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfc3NkMTI4OS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zc2QxMjg5LmMKQEAgLTI5LDcgKzI5LDcgQEAKICNkZWZpbmUgREVGQVVMVF9HQU1NQQkiMDIgMDMgMiA1IDcgNyA0IDIgNCAyXG4iIFwKIAkJCSIwMiAwMyAyIDUgNyA1IDQgMiA0IDIiCiAKLXN0YXRpYyB1bnNpZ25lZCByZWcxMSA9IDB4NjA0MDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmVnMTEgPSAweDYwNDA7CiBtb2R1bGVfcGFyYW0ocmVnMTEsIHVpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhyZWcxMSwgIlJlZ2lzdGVyIDExaCB2YWx1ZSIpOwogCkBAIC0xMzEsMTAgKzEzMSwxMCBAQAogfQogCiAvKgotICBHYW1tYSBzdHJpbmcgZm9ybWF0OgotICAgIFZSUDAgVlJQMSBQUlAwIFBSUDEgUEtQMCBQS1AxIFBLUDIgUEtQMyBQS1A0IFBLUDUKLSAgICBWUk4wIFZSTjEgUFJOMCBQUk4xIFBLTjAgUEtOMSBQS04yIFBLTjMgUEtONCBQS041Ci0qLworICogR2FtbWEgc3RyaW5nIGZvcm1hdDoKKyAqIFZSUDAgVlJQMSBQUlAwIFBSUDEgUEtQMCBQS1AxIFBLUDIgUEtQMyBQS1A0IFBLUDUKKyAqIFZSTjAgVlJOMSBQUk4wIFBSTjEgUEtOMCBQS04xIFBLTjIgUEtOMyBQS040IFBLTjUKKyAqLwogI2RlZmluZSBDVVJWRShudW0sIGlkeCkgIGN1cnZlc1tudW0gKiBwYXItPmdhbW1hLm51bV92YWx1ZXMgKyBpZHhdCiBzdGF0aWMgaW50IHNldF9nYW1tYShzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIsIHVuc2lnbmVkIGxvbmcgKmN1cnZlcykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zc2QxMzA2LmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfc3NkMTMwNi5jCmluZGV4IGUwYjM0YTQuLjgwZmM1NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zc2QxMzA2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3NzZDEzMDYuYwpAQCAtMjcsMTUgKzI3LDE1IEBACiAjZGVmaW5lIEhFSUdIVAkJNjQKIAogLyoKLSAgd3JpdGVfcmVnKCkgY2F2ZWF0OgotCi0gICAgIFRoaXMgZG9lc24ndCB3b3JrIGJlY2F1c2UgRC9DIGhhcyB0byBiZSBMT1cgZm9yIGJvdGggdmFsdWVzOgotICAgICAgIHdyaXRlX3JlZyhwYXIsIHZhbDEsIHZhbDIpOwotCi0gICAgIERvIGl0IGxpa2UgdGhpczoKLSAgICAgICB3cml0ZV9yZWcocGFyLCB2YWwxKTsKLSAgICAgICB3cml0ZV9yZWcocGFyLCB2YWwyKTsKLSovCisgKiB3cml0ZV9yZWcoKSBjYXZlYXQ6CisgKgorICogVGhpcyBkb2Vzbid0IHdvcmsgYmVjYXVzZSBEL0MgaGFzIHRvIGJlIExPVyBmb3IgYm90aCB2YWx1ZXM6CisgKiB3cml0ZV9yZWcocGFyLCB2YWwxLCB2YWwyKTsKKyAqCisgKiBEbyBpdCBsaWtlIHRoaXM6CisgKiB3cml0ZV9yZWcocGFyLCB2YWwxKTsKKyAqIHdyaXRlX3JlZyhwYXIsIHZhbDIpOworICovCiAKIC8qIEluaXQgc2VxdWVuY2UgdGFrZW4gZnJvbSB0aGUgQWRhZnJ1aXQgU1NEMTMwNiBBcmR1aW5vIGxpYnJhcnkgKi8KIHN0YXRpYyBpbnQgaW5pdF9kaXNwbGF5KHN0cnVjdCBmYnRmdF9wYXIgKnBhcikKQEAgLTExMyw4ICsxMTMsOSBAQAogCXdyaXRlX3JlZyhwYXIsIDB4QTQpOwogCiAJLyogU2V0IE5vcm1hbCBEaXNwbGF5Ci0JICAgMCBpbiBSQU06IE9GRiBpbiBkaXNwbGF5IHBhbmVsCi0JICAgMSBpbiBSQU06IE9OIGluIGRpc3BsYXkgcGFuZWwgKi8KKwkgKiAwIGluIFJBTTogT0ZGIGluIGRpc3BsYXkgcGFuZWwKKwkgKiAxIGluIFJBTTogT04gaW4gZGlzcGxheSBwYW5lbAorCSAqLwogCXdyaXRlX3JlZyhwYXIsIDB4QTYpOwogCiAJLyogU2V0IERpc3BsYXkgT04gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zc2QxMzMxLmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfc3NkMTMzMS5jCmluZGV4IGJkMjk0ZjguLjFkNzRhYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zc2QxMzMxLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3NzZDEzMzEuYwpAQCAtMTAyLDI2ICsxMDIsMjYgQEAKIH0KIAogLyoKLQlHcmF5c2NhbGUgTG9va3VwIFRhYmxlCi0JR1MxIC0gR1M2MwotCVRoZSBkcml2ZXIgR2FtbWEgY3VydmUgY29udGFpbnMgdGhlIHJlbGF0aXZlIHZhbHVlcyBiZXR3ZWVuIHRoZSBlbnRyaWVzCi0JaW4gdGhlIExvb2t1cCB0YWJsZS4KLQotCUZyb20gZGF0YXNoZWV0OgotCTguOCBHcmF5IFNjYWxlIERlY29kZXIKLQotCQl0aGVyZSBhcmUgdG90YWwgMTgwIEdhbW1hIFNldHRpbmdzIChTZXR0aW5nIDAgdG8gU2V0dGluZyAxODApCi0JCWF2YWlsYWJsZSBmb3IgdGhlIEdyYXkgU2NhbGUgdGFibGUuCi0KLQkJVGhlIGdyYXkgc2NhbGUgaXMgZGVmaW5lZCBpbiBpbmNyZW1lbnRhbCB3YXksIHdpdGggcmVmZXJlbmNlCi0JCXRvIHRoZSBsZW5ndGggb2YgcHJldmlvdXMgdGFibGUgZW50cnk6Ci0JCQlTZXR0aW5nIG9mIEdTMSBoYXMgdG8gYmUgPj0gMAotCQkJU2V0dGluZyBvZiBHUzIgaGFzIHRvIGJlID4gU2V0dGluZyBvZiBHUzEgKzEKLQkJCVNldHRpbmcgb2YgR1MzIGhhcyB0byBiZSA+IFNldHRpbmcgb2YgR1MyICsxCi0JCQk6Ci0JCQlTZXR0aW5nIG9mIEdTNjMgaGFzIHRvIGJlID4gU2V0dGluZyBvZiBHUzYyICsxCi0KLSovCisgKiBHcmF5c2NhbGUgTG9va3VwIFRhYmxlCisgKiBHUzEgLSBHUzYzCisgKiBUaGUgZHJpdmVyIEdhbW1hIGN1cnZlIGNvbnRhaW5zIHRoZSByZWxhdGl2ZSB2YWx1ZXMgYmV0d2VlbiB0aGUgZW50cmllcworICogaW4gdGhlIExvb2t1cCB0YWJsZS4KKyAqCisgKiBGcm9tIGRhdGFzaGVldDoKKyAqIDguOCBHcmF5IFNjYWxlIERlY29kZXIKKyAqCisgKiB0aGVyZSBhcmUgdG90YWwgMTgwIEdhbW1hIFNldHRpbmdzIChTZXR0aW5nIDAgdG8gU2V0dGluZyAxODApCisgKiBhdmFpbGFibGUgZm9yIHRoZSBHcmF5IFNjYWxlIHRhYmxlLgorICoKKyAqIFRoZSBncmF5IHNjYWxlIGlzIGRlZmluZWQgaW4gaW5jcmVtZW50YWwgd2F5LCB3aXRoIHJlZmVyZW5jZQorICogdG8gdGhlIGxlbmd0aCBvZiBwcmV2aW91cyB0YWJsZSBlbnRyeToKKyAqIFNldHRpbmcgb2YgR1MxIGhhcyB0byBiZSA+PSAwCisgKiBTZXR0aW5nIG9mIEdTMiBoYXMgdG8gYmUgPiBTZXR0aW5nIG9mIEdTMSArMQorICogU2V0dGluZyBvZiBHUzMgaGFzIHRvIGJlID4gU2V0dGluZyBvZiBHUzIgKzEKKyAqIDoKKyAqIFNldHRpbmcgb2YgR1M2MyBoYXMgdG8gYmUgPiBTZXR0aW5nIG9mIEdTNjIgKzEKKyAqCisgKi8KIHN0YXRpYyBpbnQgc2V0X2dhbW1hKHN0cnVjdCBmYnRmdF9wYXIgKnBhciwgdW5zaWduZWQgbG9uZyAqY3VydmVzKQogewogCXVuc2lnbmVkIGxvbmcgdG1wW0dBTU1BX05VTSAqIEdBTU1BX0xFTl07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfc3NkMTM1MS5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3NzZDEzNTEuYwppbmRleCBjZWYzM2U0Li4yMDBhYTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfc3NkMTM1MS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zc2QxMzUxLmMKQEAgLTI1LDggKzI1LDggQEAKIAogc3RhdGljIGludCBpbml0X2Rpc3BsYXkoc3RydWN0IGZidGZ0X3BhciAqcGFyKQogewotCWlmIChwYXItPnBkYXRhCi0JCSYmIHBhci0+cGRhdGEtPmRpc3BsYXkuYmFja2xpZ2h0ID09IEZCVEZUX09OQk9BUkRfQkFDS0xJR0hUKSB7CisJaWYgKHBhci0+cGRhdGEgJiYKKwkgICAgcGFyLT5wZGF0YS0+ZGlzcGxheS5iYWNrbGlnaHQgPT0gRkJURlRfT05CT0FSRF9CQUNLTElHSFQpIHsKIAkJLyogbW9kdWxlIHVzZXMgb25ib2FyZCBHUElPIGZvciBwYW5lbCBwb3dlciAqLwogCQlwYXItPmZidGZ0b3BzLnJlZ2lzdGVyX2JhY2tsaWdodCA9IHJlZ2lzdGVyX29uYm9hcmRfYmFja2xpZ2h0OwogCX0KQEAgLTY2LDcgKzY2LDcgQEAKIAogc3RhdGljIGludCBzZXRfdmFyKHN0cnVjdCBmYnRmdF9wYXIgKnBhcikKIHsKLQl1bnNpZ25lZCByZW1hcDsKKwl1bnNpZ25lZCBpbnQgcmVtYXA7CiAKIAlpZiAocGFyLT5mYnRmdG9wcy5pbml0X2Rpc3BsYXkgIT0gaW5pdF9kaXNwbGF5KSB7CiAJCS8qIGRvbid0IHJpc2sgbWVzc2luZyB1cCByZWdpc3RlciBBMGggKi8KQEAgLTgwLDEwICs4MCwxMCBAQAogCiAJc3dpdGNoIChwYXItPmluZm8tPnZhci5yb3RhdGUpIHsKIAljYXNlIDA6Ci0JCXdyaXRlX3JlZyhwYXIsIDB4QTAsIHJlbWFwIHwgMHgwMCB8IDE8PDQpOworCQl3cml0ZV9yZWcocGFyLCAweEEwLCByZW1hcCB8IDB4MDAgfCAxIDw8IDQpOwogCQlicmVhazsKIAljYXNlIDI3MDoKLQkJd3JpdGVfcmVnKHBhciwgMHhBMCwgcmVtYXAgfCAweDAzIHwgMTw8NCk7CisJCXdyaXRlX3JlZyhwYXIsIDB4QTAsIHJlbWFwIHwgMHgwMyB8IDEgPDwgNCk7CiAJCWJyZWFrOwogCWNhc2UgMTgwOgogCQl3cml0ZV9yZWcocGFyLCAweEEwLCByZW1hcCB8IDB4MDIpOwpAQCAtMTg5LDggKzE4OSw4IEBACiAJCSIlczogcG93ZXI9JWQsIGZiX2JsYW5rPSVkXG4iLAogCQlfX2Z1bmNfXywgYmQtPnByb3BzLnBvd2VyLCBiZC0+cHJvcHMuZmJfYmxhbmspOwogCi0Jb24gPSAoYmQtPnByb3BzLnBvd2VyID09IEZCX0JMQU5LX1VOQkxBTkspCi0JCSYmIChiZC0+cHJvcHMuZmJfYmxhbmsgPT0gRkJfQkxBTktfVU5CTEFOSyk7CisJb24gPSAoYmQtPnByb3BzLnBvd2VyID09IEZCX0JMQU5LX1VOQkxBTkspICYmCisJICAgICAoYmQtPnByb3BzLmZiX2JsYW5rID09IEZCX0JMQU5LX1VOQkxBTkspOwogCS8qIE9uYm9hcmQgYmFja2xpZ2h0IGNvbm5lY3RlZCB0byBHUElPMCBvbiBTU0QxMzUxLCBHUElPMSB1bnVzZWQgKi8KIAl3cml0ZV9yZWcocGFyLCAweEI1LCBvbiA/IDB4MDMgOiAweDAyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3N0NzczNXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zdDc3MzVyLmMKaW5kZXggYzVlNTFmZS4uNjY3MGYyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3N0NzczNXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfc3Q3NzM1ci5jCkBAIC0zMywzNSArMzMsNDMgQEAKIAktMiwgNTAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWxheSAqLwogCiAJLyogRlJNQ1RSMSAtIGZyYW1lIHJhdGUgY29udHJvbDogbm9ybWFsIG1vZGUKLQkgICAgIGZyYW1lIHJhdGUgPSBmb3NjIC8gKDEgeCAyICsgNDApICogKExJTkUgKyAyQyArIDJEKSAqLworCSAqIGZyYW1lIHJhdGUgPSBmb3NjIC8gKDEgeCAyICsgNDApICogKExJTkUgKyAyQyArIDJEKQorCSAqLwogCS0xLCAweEIxLCAweDAxLCAweDJDLCAweDJELAogCiAJLyogRlJNQ1RSMiAtIGZyYW1lIHJhdGUgY29udHJvbDogaWRsZSBtb2RlCi0JICAgICBmcmFtZSByYXRlID0gZm9zYyAvICgxIHggMiArIDQwKSAqIChMSU5FICsgMkMgKyAyRCkgKi8KKwkgKiBmcmFtZSByYXRlID0gZm9zYyAvICgxIHggMiArIDQwKSAqIChMSU5FICsgMkMgKyAyRCkKKwkgKi8KIAktMSwgMHhCMiwgMHgwMSwgMHgyQywgMHgyRCwKIAogCS8qIEZSTUNUUjMgLSBmcmFtZSByYXRlIGNvbnRyb2wgLSBwYXJ0aWFsIG1vZGUKLQkgICAgIGRvdCBpbnZlcnNpb24gbW9kZSwgbGluZSBpbnZlcnNpb24gbW9kZSAqLworCSAqIGRvdCBpbnZlcnNpb24gbW9kZSwgbGluZSBpbnZlcnNpb24gbW9kZQorCSAqLwogCS0xLCAweEIzLCAweDAxLCAweDJDLCAweDJELCAweDAxLCAweDJDLCAweDJELAogCiAJLyogSU5WQ1RSIC0gZGlzcGxheSBpbnZlcnNpb24gY29udHJvbAotCSAgICAgbm8gaW52ZXJzaW9uICovCisJICogbm8gaW52ZXJzaW9uCisJICovCiAJLTEsIDB4QjQsIDB4MDcsCiAKIAkvKiBQV0NUUjEgLSBQb3dlciBDb250cm9sCi0JICAgICAtNC42ViwgQVVUTyBtb2RlICovCisJICogLTQuNlYsIEFVVE8gbW9kZQorCSAqLwogCS0xLCAweEMwLCAweEEyLCAweDAyLCAweDg0LAogCiAJLyogUFdDVFIyIC0gUG93ZXIgQ29udHJvbAotCSAgICAgVkdIMjUgPSAyLjRDIFZHU0VMID0gLTEwIFZHSCA9IDMgKiBBVkREICovCisJICogVkdIMjUgPSAyLjRDIFZHU0VMID0gLTEwIFZHSCA9IDMgKiBBVkRECisJICovCiAJLTEsIDB4QzEsIDB4QzUsCiAKIAkvKiBQV0NUUjMgLSBQb3dlciBDb250cm9sCi0JICAgICBPcGFtcCBjdXJyZW50IHNtYWxsLCBCb29zdCBmcmVxdWVuY3kgKi8KKwkgKiBPcGFtcCBjdXJyZW50IHNtYWxsLCBCb29zdCBmcmVxdWVuY3kKKwkgKi8KIAktMSwgMHhDMiwgMHgwQSwgMHgwMCwKIAogCS8qIFBXQ1RSNCAtIFBvd2VyIENvbnRyb2wKLQkgICAgIEJDTEsvMiwgT3BhbXAgY3VycmVudCBzbWFsbCAmIE1lZGl1bSBsb3cgKi8KKwkgKiBCQ0xLLzIsIE9wYW1wIGN1cnJlbnQgc21hbGwgJiBNZWRpdW0gbG93CisJICovCiAJLTEsIDB4QzMsIDB4OEEsIDB4MkEsCiAKIAkvKiBQV0NUUjUgLSBQb3dlciBDb250cm9sICovCkBAIC0xMDEsMTEgKzEwOSwxMiBAQAogc3RhdGljIGludCBzZXRfdmFyKHN0cnVjdCBmYnRmdF9wYXIgKnBhcikKIHsKIAkvKiBNQURDVEwgLSBNZW1vcnkgZGF0YSBhY2Nlc3MgY29udHJvbAotCSAgICAgUkdCL0JHUjoKLQkgICAgIDEuIE1vZGUgc2VsZWN0aW9uIHBpbiBTUkdCCi0JCVJHQiBIL1cgcGluIGZvciBjb2xvciBmaWx0ZXIgc2V0dGluZzogMD1SR0IsIDE9QkdSCi0JICAgICAyLiBNQURDVEwgUkdCIGJpdAotCQlSR0ItQkdSIE9SREVSIGNvbG9yIGZpbHRlciBwYW5lbDogMD1SR0IsIDE9QkdSICovCisJICogUkdCL0JHUjoKKwkgKiAxLiBNb2RlIHNlbGVjdGlvbiBwaW4gU1JHQgorCSAqICAgIFJHQiBIL1cgcGluIGZvciBjb2xvciBmaWx0ZXIgc2V0dGluZzogMD1SR0IsIDE9QkdSCisJICogMi4gTUFEQ1RMIFJHQiBiaXQKKwkgKiAgICBSR0ItQkdSIE9SREVSIGNvbG9yIGZpbHRlciBwYW5lbDogMD1SR0IsIDE9QkdSCisJICovCiAJc3dpdGNoIChwYXItPmluZm8tPnZhci5yb3RhdGUpIHsKIAljYXNlIDA6CiAJCXdyaXRlX3JlZyhwYXIsIE1JUElfRENTX1NFVF9BRERSRVNTX01PREUsCkBAIC0xMjksMTAgKzEzOCwxMCBAQAogfQogCiAvKgotICBHYW1tYSBzdHJpbmcgZm9ybWF0OgotICAgIFZSRjBQIFZPUzBQIFBLMFAgUEsxUCBQSzJQIFBLM1AgUEs0UCBQSzVQIFBLNlAgUEs3UCBQSzhQIFBLOVAgU0VMVjBQIFNFTFYxUCBTRUxWNjJQIFNFTFY2M1AKLSAgICBWUkYwTiBWT1MwTiBQSzBOIFBLMU4gUEsyTiBQSzNOIFBLNE4gUEs1TiBQSzZOIFBLN04gUEs4TiBQSzlOIFNFTFYwTiBTRUxWMU4gU0VMVjYyTiBTRUxWNjNOCi0qLworICogR2FtbWEgc3RyaW5nIGZvcm1hdDoKKyAqIFZSRjBQIFZPUzBQIFBLMFAgUEsxUCBQSzJQIFBLM1AgUEs0UCBQSzVQIFBLNlAgUEs3UCBQSzhQIFBLOVAgU0VMVjBQIFNFTFYxUCBTRUxWNjJQIFNFTFY2M1AKKyAqIFZSRjBOIFZPUzBOIFBLME4gUEsxTiBQSzJOIFBLM04gUEs0TiBQSzVOIFBLNk4gUEs3TiBQSzhOIFBLOU4gU0VMVjBOIFNFTFYxTiBTRUxWNjJOIFNFTFY2M04KKyAqLwogI2RlZmluZSBDVVJWRShudW0sIGlkeCkgIGN1cnZlc1tudW0gKiBwYXItPmdhbW1hLm51bV92YWx1ZXMgKyBpZHhdCiBzdGF0aWMgaW50IHNldF9nYW1tYShzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIsIHVuc2lnbmVkIGxvbmcgKmN1cnZlcykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl90bHM4MjA0LmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfdGxzODIwNC5jCmluZGV4IDIxODNmOTguLmVhMmRkYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl90bHM4MjA0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3RsczgyMDQuYwpAQCAtMzUsNyArMzUsNyBAQAogLyogZ2FtbWEgaXMgdXNlZCB0byBjb250cm9sIGNvbnRyYXN0IGluIHRoaXMgZHJpdmVyICovCiAjZGVmaW5lIERFRkFVTFRfR0FNTUEJIjQwIgogCi1zdGF0aWMgdW5zaWduZWQgYnMgPSA0Oworc3RhdGljIHVuc2lnbmVkIGludCBicyA9IDQ7CiBtb2R1bGVfcGFyYW0oYnMsIHVpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhicywgIkJTWzI6MF0gQmlhcyB2b2x0YWdlIGxldmVsOiAwLTcgKGRlZmF1bHQ6IDQpIik7CiAKQEAgLTQ0LDIxICs0NCwyMSBAQAogCXBhci0+ZmJ0ZnRvcHMucmVzZXQocGFyKTsKIAogCS8qIEVudGVyIGV4dGVuZGVkIGNvbW1hbmQgbW9kZSAqLwotCXdyaXRlX3JlZyhwYXIsIDB4MjEpOyAvKiA1OjEgIDEKLQkJCQkgMjowICBQRCAtIFBvd2VyZG93biBjb250cm9sOiBjaGlwIGlzIGFjdGl2ZQotCQkJCSAxOjAgIFYgIC0gRW50cnkgbW9kZTogaG9yaXpvbnRhbCBhZGRyZXNzaW5nCi0JCQkJIDA6MSAgSCAgLSBFeHRlbmRlZCBpbnN0cnVjdGlvbiBzZXQgY29udHJvbDoKLQkJCQkJCWV4dGVuZGVkCi0JCQkgICAgICAqLworCXdyaXRlX3JlZyhwYXIsIDB4MjEpOwkvKiA1OjEgIDEKKwkJCQkgKiAyOjAgIFBEIC0gUG93ZXJkb3duIGNvbnRyb2w6IGNoaXAgaXMgYWN0aXZlCisJCQkJICogMTowICBWICAtIEVudHJ5IG1vZGU6IGhvcml6b250YWwgYWRkcmVzc2luZworCQkJCSAqIDA6MSAgSCAgLSBFeHRlbmRlZCBpbnN0cnVjdGlvbiBzZXQgY29udHJvbDoKKwkJCQkgKgkgICAgIGV4dGVuZGVkCisJCQkJICovCiAKIAkvKiBIPTEgQmlhcyBzeXN0ZW0gKi8KLQl3cml0ZV9yZWcocGFyLCAweDEwIHwgKGJzICYgMHg3KSk7IC8qCi0JCQkJIDQ6MSAgMQotCQkJCSAzOjAgIDAKLQkJCQkgMjp4ICBCUzIgLSBCaWFzIFN5c3RlbQotCQkJCSAxOnggIEJTMQotCQkJCSAwOnggIEJTMAotCQkJICAgICAgKi8KKwl3cml0ZV9yZWcocGFyLCAweDEwIHwgKGJzICYgMHg3KSk7CisJCQkJLyogNDoxICAxCisJCQkJICogMzowICAwCisJCQkJICogMjp4ICBCUzIgLSBCaWFzIFN5c3RlbQorCQkJCSAqIDE6eCAgQlMxCisJCQkJICogMDp4ICBCUzAKKwkJCQkgKi8KIAogCS8qIFNldCB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgZGlzcGxheSBsaW5lLiAqLwogCXdyaXRlX3JlZyhwYXIsIDB4MDQgfCAoNjQgPj4gNikpOwpAQCAtNjgsMTIgKzY4LDEyIEBACiAJd3JpdGVfcmVnKHBhciwgMHgyMCk7CiAKIAkvKiBIPTAgRGlzcGxheSBjb250cm9sICovCi0Jd3JpdGVfcmVnKHBhciwgMHgwOCB8IDQpOyAvKgotCQkJCSAzOjEgIDEKLQkJCQkgMjoxICBEICAtIERFOiAxMD1ub3JtYWwgbW9kZQotCQkJCSAxOjAgIDAKLQkJCQkgMDowICBFCi0JCQkgICAgICAqLworCXdyaXRlX3JlZyhwYXIsIDB4MDggfCA0KTsKKwkJCQkvKiAzOjEgIDEKKwkJCQkgKiAyOjEgIEQgLSBERTogMTA9bm9ybWFsIG1vZGUKKwkJCQkgKiAxOjAgIDAKKwkJCQkgKiAwOjAgIEUKKwkJCQkgKi8KIAogCXJldHVybiAwOwogfQpAQCAtODEsMTUgKzgxLDE1IEBACiBzdGF0aWMgdm9pZCBzZXRfYWRkcl93aW4oc3RydWN0IGZidGZ0X3BhciAqcGFyLCBpbnQgeHMsIGludCB5cywgaW50IHhlLCBpbnQgeWUpCiB7CiAJLyogSD0wIFNldCBYIGFkZHJlc3Mgb2YgUkFNICovCi0Jd3JpdGVfcmVnKHBhciwgMHg4MCk7IC8qIDc6MSAgMQotCQkJCSA2LTA6IFhbNjowXSAtIDB4MDAKLQkJCSAgICAgICovCisJd3JpdGVfcmVnKHBhciwgMHg4MCk7CS8qIDc6MSAgMQorCQkJCSAqIDYtMDogWFs2OjBdIC0gMHgwMAorCQkJCSAqLwogCiAJLyogSD0wIFNldCBZIGFkZHJlc3Mgb2YgUkFNICovCi0Jd3JpdGVfcmVnKHBhciwgMHg0MCk7IC8qIDc6MCAgMAotCQkJCSA2OjEgIDEKLQkJCQkgMi0wOiBZWzI6MF0gLSAweDAKLQkJCSAgICAgICovCisJd3JpdGVfcmVnKHBhciwgMHg0MCk7CS8qIDc6MCAgMAorCQkJCSAqIDY6MSAgMQorCQkJCSAqIDItMDogWVsyOjBdIC0gMHgwCisJCQkJICovCiB9CiAKIHN0YXRpYyBpbnQgd3JpdGVfdm1lbShzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW4pCkBAIC0xMDAsOCArMTAwLDkgQEAKIAogCWZvciAoeSA9IDA7IHkgPCBIRUlHSFQgLyA4OyB5KyspIHsKIAkJdTggKmJ1ZiA9IHBhci0+dHhidWYuYnVmOwotCQkvKiBUaGUgZGlzcGxheSBpcyAxMDJ4NjggYnV0IHRoZSBMQ0QgaXMgODR4NDguICBTZXQKLQkJICAgdGhlIHdyaXRlIHBvaW50ZXIgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggcm93LiAqLworCQkvKiBUaGUgZGlzcGxheSBpcyAxMDJ4NjggYnV0IHRoZSBMQ0QgaXMgODR4NDguCisJCSAqIFNldCB0aGUgd3JpdGUgcG9pbnRlciBhdCB0aGUgc3RhcnQgb2YgZWFjaCByb3cuCisJCSAqLwogCQlncGlvX3NldF92YWx1ZShwYXItPmdwaW8uZGMsIDApOwogCQl3cml0ZV9yZWcocGFyLCAweDgwIHwgMCk7CiAJCXdyaXRlX3JlZyhwYXIsIDB4NDAgfCB5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl91YzE2MTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl91YzE2MTEuYwppbmRleCBlODc0MDFhLi5iMzNiNzNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfdWMxNjExLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3VjMTYxMS5jCkBAIC00MSwzMCArNDEsMzAgQEAKICAqLwogCiAvKiBCUiAtPiBhY3R1YWwgcmF0aW86IDAtMyAtPiA1LCAxMCwgMTEsIDEzICovCi1zdGF0aWMgdW5zaWduZWQgcmF0aW8gPSAyOworc3RhdGljIHVuc2lnbmVkIGludCByYXRpbyA9IDI7CiBtb2R1bGVfcGFyYW0ocmF0aW8sIHVpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhyYXRpbywgIkJSWzE6MF0gQmlhcyB2b2x0YWdlIHJhdGlvOiAwLTMgKGRlZmF1bHQ6IDIpIik7CiAKLXN0YXRpYyB1bnNpZ25lZCBnYWluID0gMzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2FpbiA9IDM7CiBtb2R1bGVfcGFyYW0oZ2FpbiwgdWludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGdhaW4sICJHTlsxOjBdIEJpYXMgdm9sdGFnZSBnYWluOiAwLTMgKGRlZmF1bHQ6IDMpIik7CiAKLXN0YXRpYyB1bnNpZ25lZCBwb3QgPSAxNjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcG90ID0gMTY7CiBtb2R1bGVfcGFyYW0ocG90LCB1aW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MocG90LCAiUE1bNjowXSBCaWFzIHZvbHRhZ2UgcG90LjogMC02MyAoZGVmYXVsdDogMTYpIik7CiAKIC8qIFRDIC0+ICUgY29tcGVuc2F0aW9uIHBlciBkZWcgQzogMC0zIC0+IC0uMDUsIC0uMTAsIC0uMDE1LCAtLjIwICovCi1zdGF0aWMgdW5zaWduZWQgdGVtcDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGVtcDsKIG1vZHVsZV9wYXJhbSh0ZW1wLCB1aW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0ModGVtcCwgIlRDWzE6MF0gVGVtcGVyYXR1cmUgY29tcGVuc2F0aW9uOiAwLTMgKGRlZmF1bHQ6IDApIik7CiAKIC8qIFBDWzE6MF0gLT4gTENEIGNhcGFjaXRhbmNlOiAwLTMgLT4gPDIwbkYsIDIwLTI4IG5GLCAyOS00MCBuRiwgNDAtNTYgbkYgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb2FkID0gMTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbG9hZCA9IDE7CiBtb2R1bGVfcGFyYW0obG9hZCwgdWludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGxvYWQsICJQQ1sxOjBdIFBhbmVsIExvYWRpbmc6IDAtMyAoZGVmYXVsdDogMSkiKTsKIAogLyogUENbMzoyXSAtPiBWX0xDRDogMCwgMSwgMyAtPiBleHQuLCBpbnQuIHdpdGggcmF0aW8gPSA1LCBpbnQuIHN0YW5kYXJkICovCi1zdGF0aWMgdW5zaWduZWQgcHVtcCA9IDM7CitzdGF0aWMgdW5zaWduZWQgaW50IHB1bXAgPSAzOwogbW9kdWxlX3BhcmFtKHB1bXAsIHVpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhwdW1wLCAiUENbMzoyXSBQdW1wIGNvbnRyb2w6IDAsMSwzIChkZWZhdWx0OiAzKSIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfd2F0dGVyb3R0LmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfd2F0dGVyb3R0LmMKaW5kZXggZjhjYjYxMC4uYTUyZTI4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3dhdHRlcm90dC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl93YXR0ZXJvdHQuYwpAQCAtNjcsNyArNjcsNyBAQAogCiBzdGF0aWMgaW50IHdyaXRlX3ZtZW0oc3RydWN0IGZidGZ0X3BhciAqcGFyLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuKQogewotCXVuc2lnbmVkIHN0YXJ0X2xpbmUsIGVuZF9saW5lOworCXVuc2lnbmVkIGludCBzdGFydF9saW5lLCBlbmRfbGluZTsKIAl1MTYgKnZtZW0xNiA9ICh1MTYgKikocGFyLT5pbmZvLT5zY3JlZW5fYnVmZmVyICsgb2Zmc2V0KTsKIAl1MTYgKnBvcyA9IHBhci0+dHhidWYuYnVmICsgMTsKIAl1MTYgKmJ1ZjE2ID0gcGFyLT50eGJ1Zi5idWYgKyAxMDsKQEAgLTEwNCw3ICsxMDQsNyBAQAogCiBzdGF0aWMgaW50IHdyaXRlX3ZtZW1fOGJpdChzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW4pCiB7Ci0JdW5zaWduZWQgc3RhcnRfbGluZSwgZW5kX2xpbmU7CisJdW5zaWduZWQgaW50IHN0YXJ0X2xpbmUsIGVuZF9saW5lOwogCXUxNiAqdm1lbTE2ID0gKHUxNiAqKShwYXItPmluZm8tPnNjcmVlbl9idWZmZXIgKyBvZmZzZXQpOwogCXUxNiAqcG9zID0gcGFyLT50eGJ1Zi5idWYgKyAxOwogCXU4ICpidWY4ID0gcGFyLT50eGJ1Zi5idWYgKyAxMDsKQEAgLTEzNyw3ICsxMzcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgZmlybXdhcmVfdmVyc2lvbihzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIpCitzdGF0aWMgdW5zaWduZWQgaW50IGZpcm13YXJlX3ZlcnNpb24oc3RydWN0IGZidGZ0X3BhciAqcGFyKQogewogCXU4IHJ4YnVmWzRdID0gezAsIH07CiAKQEAgLTE1Miw3ICsxNTIsNyBAQAogc3RhdGljIGludCBpbml0X2Rpc3BsYXkoc3RydWN0IGZidGZ0X3BhciAqcGFyKQogewogCWludCByZXQ7Ci0JdW5zaWduZWQgdmVyc2lvbjsKKwl1bnNpZ25lZCBpbnQgdmVyc2lvbjsKIAl1OCBzYXZlX21vZGU7CiAKIAkvKiBlbmFibGUgU1BJIGludGVyZmFjZSBieSBoYXZpbmcgQ1MgYW5kIE1PU0kgbG93IGR1cmluZyByZXNldCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZidGZ0LWJ1cy5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZidGZ0LWJ1cy5jCmluZGV4IDgzNTA1YmMuLmVjNDUwNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYnRmdC1idXMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnQtYnVzLmMKQEAgLTkyLDcgKzkyLDggQEAKIAogCWlmIChwYXItPnNwaSAmJiAocGFyLT5zcGktPmJpdHNfcGVyX3dvcmQgPT0gOCkpIHsKIAkJLyogd2UncmUgZW11bGF0aW5nIDktYml0LCBwYWQgc3RhcnQgb2YgYnVmZmVyIHdpdGggbm8tb3BzCi0JCSAgIChhc3N1bWluZyBoZXJlIHRoYXQgemVybyBpcyBhIG5vLW9wKSAqLworCQkgKiAoYXNzdW1pbmcgaGVyZSB0aGF0IHplcm8gaXMgYSBuby1vcCkKKwkJICovCiAJCXBhZCA9IChsZW4gJSA0KSA/IDQgLSAobGVuICUgNCkgOiAwOwogCQlmb3IgKGkgPSAwOyBpIDwgcGFkOyBpKyspCiAJCQkqYnVmKysgPSAweDAwMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYnRmdC1jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnQtY29yZS5jCmluZGV4IDBjMWE3N2MuLjU4N2Y2OGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYnRmdC1jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZidGZ0LWNvcmUuYwpAQCAtMzQxLDggKzM0MSw4IEBACiAJbWRlbGF5KDEyMCk7CiB9CiAKLXN0YXRpYyB2b2lkIGZidGZ0X3VwZGF0ZV9kaXNwbGF5KHN0cnVjdCBmYnRmdF9wYXIgKnBhciwgdW5zaWduZWQgc3RhcnRfbGluZSwKLQkJCQkgdW5zaWduZWQgZW5kX2xpbmUpCitzdGF0aWMgdm9pZCBmYnRmdF91cGRhdGVfZGlzcGxheShzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIsIHVuc2lnbmVkIGludCBzdGFydF9saW5lLAorCQkJCSB1bnNpZ25lZCBpbnQgZW5kX2xpbmUpCiB7CiAJc2l6ZV90IG9mZnNldCwgbGVuOwogCWt0aW1lX3QgdHNfc3RhcnQsIHRzX2VuZDsKQEAgLTM5MSwxMSArMzkxLDExIEBACiAKIAlpZiAodW5saWtlbHkodGltZWl0KSkgewogCQl0c19lbmQgPSBrdGltZV9nZXQoKTsKLQkJaWYgKGt0aW1lX3RvX25zKHBhci0+dXBkYXRlX3RpbWUpKQorCQlpZiAoIWt0aW1lX3RvX25zKHBhci0+dXBkYXRlX3RpbWUpKQogCQkJcGFyLT51cGRhdGVfdGltZSA9IHRzX3N0YXJ0OwogCi0JCXBhci0+dXBkYXRlX3RpbWUgPSB0c19zdGFydDsKIAkJZnBzID0ga3RpbWVfdXNfZGVsdGEodHNfc3RhcnQsIHBhci0+dXBkYXRlX3RpbWUpOworCQlwYXItPnVwZGF0ZV90aW1lID0gdHNfc3RhcnQ7CiAJCWZwcyA9IGZwcyA/IDEwMDAwMDAgLyBmcHMgOiAwOwogCiAJCXRocm91Z2hwdXQgPSBrdGltZV91c19kZWx0YSh0c19lbmQsIHRzX3N0YXJ0KTsKQEAgLTQzNSwxMCArNDM1LDEwIEBACiBzdGF0aWMgdm9pZCBmYnRmdF9kZWZlcnJlZF9pbyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IGxpc3RfaGVhZCAqcGFnZWxpc3QpCiB7CiAJc3RydWN0IGZidGZ0X3BhciAqcGFyID0gaW5mby0+cGFyOwotCXVuc2lnbmVkIGRpcnR5X2xpbmVzX3N0YXJ0LCBkaXJ0eV9saW5lc19lbmQ7CisJdW5zaWduZWQgaW50IGRpcnR5X2xpbmVzX3N0YXJ0LCBkaXJ0eV9saW5lc19lbmQ7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJdW5zaWduZWQgbG9uZyBpbmRleDsKLQl1bnNpZ25lZCB5X2xvdyA9IDAsIHlfaGlnaCA9IDA7CisJdW5zaWduZWQgaW50IHlfbG93ID0gMCwgeV9oaWdoID0gMDsKIAlpbnQgY291bnQgPSAwOwogCiAJc3Bpbl9sb2NrKCZwYXItPmRpcnR5X2xvY2spOwpAQCAtNTI2LDE4ICs1MjYsMTggQEAKIH0KIAogLyogZnJvbSBweGFmYi5jICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGNoYW5fdG9fZmllbGQodW5zaWduZWQgY2hhbiwgc3RydWN0IGZiX2JpdGZpZWxkICpiZikKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2hhbl90b19maWVsZCh1bnNpZ25lZCBpbnQgY2hhbiwgc3RydWN0IGZiX2JpdGZpZWxkICpiZikKIHsKIAljaGFuICY9IDB4ZmZmZjsKIAljaGFuID4+PSAxNiAtIGJmLT5sZW5ndGg7CiAJcmV0dXJuIGNoYW4gPDwgYmYtPm9mZnNldDsKIH0KIAotc3RhdGljIGludCBmYnRmdF9mYl9zZXRjb2xyZWcodW5zaWduZWQgcmVnbm8sIHVuc2lnbmVkIHJlZCwgdW5zaWduZWQgZ3JlZW4sCi0JCQkgICAgICB1bnNpZ25lZCBibHVlLCB1bnNpZ25lZCB0cmFuc3AsCitzdGF0aWMgaW50IGZidGZ0X2ZiX3NldGNvbHJlZyh1bnNpZ25lZCBpbnQgcmVnbm8sIHVuc2lnbmVkIGludCByZWQsIHVuc2lnbmVkIGludCBncmVlbiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBibHVlLCB1bnNpZ25lZCBpbnQgdHJhbnNwLAogCQkJICAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0JdW5zaWduZWQgdmFsOworCXVuc2lnbmVkIGludCB2YWw7CiAJaW50IHJldCA9IDE7CiAKIAlkZXZfZGJnKGluZm8tPmRldiwKQEAgLTY1NCwxMSArNjU0LDExIEBACiAJdTggKnZtZW0gPSBOVUxMOwogCXZvaWQgKnR4YnVmID0gTlVMTDsKIAl2b2lkICpidWYgPSBOVUxMOwotCXVuc2lnbmVkIHdpZHRoOwotCXVuc2lnbmVkIGhlaWdodDsKKwl1bnNpZ25lZCBpbnQgd2lkdGg7CisJdW5zaWduZWQgaW50IGhlaWdodDsKIAlpbnQgdHhidWZsZW4gPSBkaXNwbGF5LT50eGJ1ZmxlbjsKLQl1bnNpZ25lZCBicHAgPSBkaXNwbGF5LT5icHA7Ci0JdW5zaWduZWQgZnBzID0gZGlzcGxheS0+ZnBzOworCXVuc2lnbmVkIGludCBicHAgPSBkaXNwbGF5LT5icHA7CisJdW5zaWduZWQgaW50IGZwcyA9IGRpc3BsYXktPmZwczsKIAlpbnQgdm1lbV9zaXplLCBpOwogCWludCAqaW5pdF9zZXF1ZW5jZSA9IGRpc3BsYXktPmluaXRfc2VxdWVuY2U7CiAJY2hhciAqZ2FtbWEgPSBkaXNwbGF5LT5nYW1tYTsKQEAgLTgyMCw2ICs4MjAsOCBAQAogCS8qIFRyYW5zbWl0IGJ1ZmZlciAqLwogCWlmICh0eGJ1ZmxlbiA9PSAtMSkKIAkJdHhidWZsZW4gPSB2bWVtX3NpemUgKyAyOyAvKiBhZGQgaW4gY2FzZSBzdGFydGJ5dGUgaXMgdXNlZCAqLworCWlmICh0eGJ1ZmxlbiA+PSB2bWVtX3NpemUgKyAyKQorCQl0eGJ1ZmxlbiA9IDA7CiAKICNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KIAlpZiAoKCF0eGJ1ZmxlbikgJiYgKGJwcCA+IDgpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZidGZ0LmggYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnQuaAppbmRleCBkM2JjMzk0Li44OWM0YjViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnQuaApAQCAtMzgsNyArMzgsNyBAQAogICovCiBzdHJ1Y3QgZmJ0ZnRfZ3BpbyB7CiAJY2hhciBuYW1lW0ZCVEZUX0dQSU9fTkFNRV9TSVpFXTsKLQl1bnNpZ25lZCBncGlvOworCXVuc2lnbmVkIGludCBncGlvOwogfTsKIAogc3RydWN0IGZidGZ0X3BhcjsKQEAgLTc5LDcgKzc5LDcgQEAKIAl2b2lkICgqcmVzZXQpKHN0cnVjdCBmYnRmdF9wYXIgKnBhcik7CiAJdm9pZCAoKm1rZGlydHkpKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgZnJvbSwgaW50IHRvKTsKIAl2b2lkICgqdXBkYXRlX2Rpc3BsYXkpKHN0cnVjdCBmYnRmdF9wYXIgKnBhciwKLQkJCQl1bnNpZ25lZCBzdGFydF9saW5lLCB1bnNpZ25lZCBlbmRfbGluZSk7CisJCQkJdW5zaWduZWQgaW50IHN0YXJ0X2xpbmUsIHVuc2lnbmVkIGludCBlbmRfbGluZSk7CiAJaW50ICgqaW5pdF9kaXNwbGF5KShzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIpOwogCWludCAoKmJsYW5rKShzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIsIGJvb2wgb24pOwogCkBAIC0xMTUsMTQgKzExNSwxNCBAQAogICogVGhpcyBzdHJ1Y3R1cmUgaXMgbm90IHN0b3JlZCBieSBGQlRGVCBleGNlcHQgZm9yIGluaXRfc2VxdWVuY2UuCiAgKi8KIHN0cnVjdCBmYnRmdF9kaXNwbGF5IHsKLQl1bnNpZ25lZCB3aWR0aDsKLQl1bnNpZ25lZCBoZWlnaHQ7Ci0JdW5zaWduZWQgcmVnd2lkdGg7Ci0JdW5zaWduZWQgYnVzd2lkdGg7Ci0JdW5zaWduZWQgYmFja2xpZ2h0OworCXVuc2lnbmVkIGludCB3aWR0aDsKKwl1bnNpZ25lZCBpbnQgaGVpZ2h0OworCXVuc2lnbmVkIGludCByZWd3aWR0aDsKKwl1bnNpZ25lZCBpbnQgYnVzd2lkdGg7CisJdW5zaWduZWQgaW50IGJhY2tsaWdodDsKIAlzdHJ1Y3QgZmJ0ZnRfb3BzIGZidGZ0b3BzOwotCXVuc2lnbmVkIGJwcDsKLQl1bnNpZ25lZCBmcHM7CisJdW5zaWduZWQgaW50IGJwcDsKKwl1bnNpZ25lZCBpbnQgZnBzOwogCWludCB0eGJ1ZmxlbjsKIAlpbnQgKmluaXRfc2VxdWVuY2U7CiAJY2hhciAqZ2FtbWE7CkBAIC0xNDYsOSArMTQ2LDkgQEAKIHN0cnVjdCBmYnRmdF9wbGF0Zm9ybV9kYXRhIHsKIAlzdHJ1Y3QgZmJ0ZnRfZGlzcGxheSBkaXNwbGF5OwogCWNvbnN0IHN0cnVjdCBmYnRmdF9ncGlvICpncGlvczsKLQl1bnNpZ25lZCByb3RhdGU7CisJdW5zaWduZWQgaW50IHJvdGF0ZTsKIAlib29sIGJncjsKLQl1bnNpZ25lZCBmcHM7CisJdW5zaWduZWQgaW50IGZwczsKIAlpbnQgdHhidWZsZW47CiAJdTggc3RhcnRieXRlOwogCWNoYXIgKmdhbW1hOwpAQCAtMjE2LDggKzIxNiw4IEBACiAJdTggc3RhcnRieXRlOwogCXN0cnVjdCBmYnRmdF9vcHMgZmJ0ZnRvcHM7CiAJc3BpbmxvY2tfdCBkaXJ0eV9sb2NrOwotCXVuc2lnbmVkIGRpcnR5X2xpbmVzX3N0YXJ0OwotCXVuc2lnbmVkIGRpcnR5X2xpbmVzX2VuZDsKKwl1bnNpZ25lZCBpbnQgZGlydHlfbGluZXNfc3RhcnQ7CisJdW5zaWduZWQgaW50IGRpcnR5X2xpbmVzX2VuZDsKIAlzdHJ1Y3QgewogCQlpbnQgcmVzZXQ7CiAJCWludCBkYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYnRmdF9kZXZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYnRmdF9kZXZpY2UuYwppbmRleCBlNGEzNTVhLi5lOTIxMTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnRfZGV2aWNlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZidGZ0X2RldmljZS5jCkBAIC0zMiwyMCArMzIsMjAgQEAKIG1vZHVsZV9wYXJhbShuYW1lLCBjaGFycCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKG5hbWUsICJEZXZpY2VuYW1lIChyZXF1aXJlZCkuIG5hbWU9bGlzdCA9PiBsaXN0IGFsbCBzdXBwb3J0ZWQgZGV2aWNlcy4iKTsKIAotc3RhdGljIHVuc2lnbmVkIHJvdGF0ZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcm90YXRlOwogbW9kdWxlX3BhcmFtKHJvdGF0ZSwgdWludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHJvdGF0ZSwKICJBbmdsZSB0byByb3RhdGUgZGlzcGxheSBjb3VudGVyIGNsb2Nrd2lzZTogMCwgOTAsIDE4MCwgMjcwIik7CiAKLXN0YXRpYyB1bnNpZ25lZCBidXNudW07CitzdGF0aWMgdW5zaWduZWQgaW50IGJ1c251bTsKIG1vZHVsZV9wYXJhbShidXNudW0sIHVpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhidXNudW0sICJTUEkgYnVzIG51bWJlciAoZGVmYXVsdD0wKSIpOwogCi1zdGF0aWMgdW5zaWduZWQgY3M7CitzdGF0aWMgdW5zaWduZWQgaW50IGNzOwogbW9kdWxlX3BhcmFtKGNzLCB1aW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoY3MsICJTUEkgY2hpcCBzZWxlY3QgKGRlZmF1bHQ9MCkiKTsKIAotc3RhdGljIHVuc2lnbmVkIHNwZWVkOworc3RhdGljIHVuc2lnbmVkIGludCBzcGVlZDsKIG1vZHVsZV9wYXJhbShzcGVlZCwgdWludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHNwZWVkLCAiU1BJIHNwZWVkIChvdmVycmlkZSBkZXZpY2UgZGVmYXVsdCkiKTsKIApAQCAtNTgsNyArNTgsNyBAQAogTU9EVUxFX1BBUk1fREVTQyhncGlvcywKICJMaXN0IG9mIGdwaW9zLiBDb21tYSBzZXBhcmF0ZWQgd2l0aCB0aGUgZm9ybTogcmVzZXQ6MjMsZGM6MjQgKHdoZW4gb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCwgYWxsIGdwaW9zIG11c3QgYmUgc3BlY2lmaWVkKSIpOwogCi1zdGF0aWMgdW5zaWduZWQgZnBzOworc3RhdGljIHVuc2lnbmVkIGludCBmcHM7CiBtb2R1bGVfcGFyYW0oZnBzLCB1aW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoZnBzLCAiRnJhbWVzIHBlciBzZWNvbmQgKG92ZXJyaWRlIGRyaXZlciBkZWZhdWx0KSIpOwogCkBAIC03Niw3ICs3Niw3IEBACiBNT0RVTEVfUEFSTV9ERVNDKGJnciwKICJCR1IgYml0IChzdXBwb3J0ZWQgYnkgc29tZSBkcml2ZXJzKS4iKTsKIAotc3RhdGljIHVuc2lnbmVkIHN0YXJ0Ynl0ZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnRieXRlOwogbW9kdWxlX3BhcmFtKHN0YXJ0Ynl0ZSwgdWludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0Ynl0ZSwgIlNldHMgdGhlIFN0YXJ0IGJ5dGUgdXNlZCBieSBzb21lIFNQSSBkaXNwbGF5cy4iKTsKIApAQCAtODQsMTUgKzg0LDE1IEBACiBtb2R1bGVfcGFyYW0oY3VzdG9tLCBib29sLCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoY3VzdG9tLCAiQWRkIGEgY3VzdG9tIGRpc3BsYXkgZGV2aWNlLiBVc2Ugc3BlZWQ9IGFyZ3VtZW50IHRvIG1ha2UgaXQgYSBTUEkgZGV2aWNlLCBlbHNlIHBsYXRmb3JtX2RldmljZSIpOwogCi1zdGF0aWMgdW5zaWduZWQgd2lkdGg7CitzdGF0aWMgdW5zaWduZWQgaW50IHdpZHRoOwogbW9kdWxlX3BhcmFtKHdpZHRoLCB1aW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0Mod2lkdGgsICJEaXNwbGF5IHdpZHRoLCB1c2VkIHdpdGggdGhlIGN1c3RvbSBhcmd1bWVudCIpOwogCi1zdGF0aWMgdW5zaWduZWQgaGVpZ2h0Oworc3RhdGljIHVuc2lnbmVkIGludCBoZWlnaHQ7CiBtb2R1bGVfcGFyYW0oaGVpZ2h0LCB1aW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoaGVpZ2h0LCAiRGlzcGxheSBoZWlnaHQsIHVzZWQgd2l0aCB0aGUgY3VzdG9tIGFyZ3VtZW50Iik7CiAKLXN0YXRpYyB1bnNpZ25lZCBidXN3aWR0aCA9IDg7CitzdGF0aWMgdW5zaWduZWQgaW50IGJ1c3dpZHRoID0gODsKIG1vZHVsZV9wYXJhbShidXN3aWR0aCwgdWludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGJ1c3dpZHRoLCAiRGlzcGxheSBidXMgd2lkdGgsIHVzZWQgd2l0aCB0aGUgY3VzdG9tIGFyZ3VtZW50Iik7CiAKQEAgLTEwNiw3ICsxMDYsNyBAQAogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywKICJsZXZlbDogMC03ICh0aGUgcmVtYWluaW5nIDI5IGJpdHMgaXMgZm9yIGFkdmFuY2VkIHVzYWdlKSIpOwogCi1zdGF0aWMgdW5zaWduZWQgdmVyYm9zZSA9IDM7CitzdGF0aWMgdW5zaWduZWQgaW50IHZlcmJvc2UgPSAzOwogbW9kdWxlX3BhcmFtKHZlcmJvc2UsIHVpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyh2ZXJib3NlLAogIjAgc2lsZW50LCA+MCBzaG93IGdwaW9zLCA+MSBzaG93IGRldmljZXMsID4yIHNob3cgZGV2aWNlcyBiZWZvcmUgKGRlZmF1bHQ9MykiKTsKQEAgLTEyMTUsNyArMTIxNSw4IEBACiAJCX0KIAl9LCB7CiAJCS8qIFRoaXMgc2hvdWxkIGJlIHRoZSBsYXN0IGl0ZW0uCi0JCSAgIFVzZWQgd2l0aCB0aGUgY3VzdG9tIGFyZ3VtZW50ICovCisJCSAqIFVzZWQgd2l0aCB0aGUgY3VzdG9tIGFyZ3VtZW50CisJCSAqLwogCQkubmFtZSA9ICIiLAogCQkuc3BpID0gJihzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8pIHsKIAkJCS5tb2RhbGlhcyA9ICIiLApAQCAtMTMwNiw4ICsxMzA3LDkgQEAKIHN0YXRpYyB2b2lkIGZidGZ0X2RldmljZV9wZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQogewogLyogTmVlZGVkIHRvIHNpbGVuY2UgdGhpcyBtZXNzYWdlOgotRGV2aWNlICd4eHgnIGRvZXMgbm90IGhhdmUgYSByZWxlYXNlKCkgZnVuY3Rpb24sIGl0IGlzIGJyb2tlbiBhbmQgbXVzdCBiZSBmaXhlZAotKi8KKyAqIERldmljZSAneHh4JyBkb2VzIG5vdCBoYXZlIGEgcmVsZWFzZSgpIGZ1bmN0aW9uLAorICogaXQgaXMgYnJva2VuIGFuZCBtdXN0IGJlIGZpeGVkCisgKi8KIH0KIAogc3RhdGljIGludCBzcGlfZGV2aWNlX2ZvdW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKQEAgLTEzNDYsNyArMTM0OCw3IEBACiB9CiAKICNpZmRlZiBNT0RVTEUKLXN0YXRpYyB2b2lkIGZidGZ0X2RldmljZV9zcGlfZGVsZXRlKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsIHVuc2lnbmVkIGNzKQorc3RhdGljIHZvaWQgZmJ0ZnRfZGV2aWNlX3NwaV9kZWxldGUoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwgdW5zaWduZWQgaW50IGNzKQogewogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAljaGFyIHN0clszMl07CkBAIC0xMzk5LDcgKzE0MDEsNyBAQAogCWxvbmcgdmFsOwogCWludCByZXQgPSAwOwogCi0JaWYgKG5hbWUgPT0gTlVMTCkgeworCWlmICghbmFtZSkgewogI2lmZGVmIE1PRFVMRQogCQlwcl9lcnIoIm1pc3NpbmcgbW9kdWxlIHBhcmFtZXRlcjogJ25hbWUnXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNDE2LDE0ICsxNDE4LDE0IEBACiAKIAkvKiBwYXJzZSBtb2R1bGUgcGFyYW1ldGVyOiBncGlvcyAqLwogCXdoaWxlICgocF9ncGlvID0gc3Ryc2VwKCZncGlvcywgIiwiKSkpIHsKLQkJaWYgKHN0cmNocihwX2dwaW8sICc6JykgPT0gTlVMTCkgeworCQlpZiAoIXN0cmNocihwX2dwaW8sICc6JykpIHsKIAkJCXByX2VycigiZXJyb3I6IG1pc3NpbmcgJzonIGluIGdwaW9zIHBhcmFtZXRlcjogJXNcbiIsCiAJCQkgICAgICAgcF9ncGlvKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCXBfbnVtID0gcF9ncGlvOwogCQlwX25hbWUgPSBzdHJzZXAoJnBfbnVtLCAiOiIpOwotCQlpZiAocF9uYW1lID09IE5VTEwgfHwgcF9udW0gPT0gTlVMTCkgeworCQlpZiAoIXBfbmFtZSB8fCAhcF9udW0pIHsKIAkJCXByX2Vycigic29tZXRoaW5nIGJhZCBoYXBwZW5lZCBwYXJzaW5nIGdwaW9zIHBhcmFtZXRlcjogJXNcbiIsCiAJCQkgICAgICAgcF9ncGlvKTsKIAkJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9NYWtlZmlsZQppbmRleCBlNzMxNTE3Li4zODcxNmZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9NYWtlZmlsZQpAQCAtNywxMyArNywxNCBAQAogIwogb2JqLSQoQ09ORklHX0ZTTF9NQ19CVVMpICs9IG1jLWJ1cy1kcml2ZXIubwogCi1tYy1idXMtZHJpdmVyLW9ianMgOj0gbWMtYnVzLm8gXAorbWMtYnVzLWRyaXZlci1vYmpzIDo9IGZzbC1tYy1idXMubyBcCiAJCSAgICAgIG1jLXN5cy5vIFwKKwkJICAgICAgbWMtaW8ubyBcCiAJCSAgICAgIGRwcmMubyBcCiAJCSAgICAgIGRwbW5nLm8gXAogCQkgICAgICBkcHJjLWRyaXZlci5vIFwKLQkJICAgICAgbWMtYWxsb2NhdG9yLm8gXAotCQkgICAgICBtYy1tc2kubyBcCisJCSAgICAgIGZzbC1tYy1hbGxvY2F0b3IubyBcCisJCSAgICAgIGZzbC1tYy1tc2kubyBcCiAJCSAgICAgIGlycS1naWMtdjMtaXRzLWZzbC1tYy1tc2kubyBcCiAJCSAgICAgIGRwbWNwLm8gXAogCQkgICAgICBkcGJwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwYnAuYyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwYnAuYwppbmRleCBmZTI3MWZiLi41ZDRjZDgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcGJwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHBicC5jCkBAIC0xLDM0ICsxLDM0IEBACiAvKiBDb3B5cmlnaHQgMjAxMy0yMDE2IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0qIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0qIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0qICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUKLSogbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSogZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0qCi0qCi0qIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLSogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLSogbGF0ZXIgdmVyc2lvbi4KLSoKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCi0qIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUKLSogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0qLworICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZQorICogbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1zeXMuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL21jLWNtZC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvZHBicC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHBtY3AuYyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwbWNwLmMKaW5kZXggMDY0NDAxNy4uNTU3NjZmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHBtY3AuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcG1jcC5jCkBAIC0zMSw2ICszMSw3IEBACiAgKi8KICNpbmNsdWRlICIuLi9pbmNsdWRlL21jLXN5cy5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtY21kLmgiCisKICNpbmNsdWRlICJkcG1jcC5oIgogI2luY2x1ZGUgImRwbWNwLWNtZC5oIgogCkBAIC0zNjgsNyArMzY5LDYgQEAKIAlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKIAlzdHJ1Y3QgZHBtY3BfY21kX3NldF9pcnFfbWFzayAqY21kX3BhcmFtczsKIAotCiAJLyogcHJlcGFyZSBjb21tYW5kICovCiAJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQTUNQX0NNRElEX1NFVF9JUlFfTUFTSywKIAkJCQkJICBjbWRfZmxhZ3MsIHRva2VuKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwbW5nLWNtZC5oIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHBtbmctY21kLmgKaW5kZXggNzc5YmY5Yy4uYTdiNzdkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHBtbmctY21kLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHBtbmctY21kLmgKQEAgLTEsNCArMSw1IEBACi0vKiBDb3B5cmlnaHQgMjAxMy0yMDE2IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKy8qCisgKiBDb3B5cmlnaHQgMjAxMy0yMDE2IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgpAQCAtMzAsMTIgKzMxLDEyIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKgotIGRwbW5nLWNtZC5oCi0KLSBkZWZpbmVzIHBvcnRhbCBjb21tYW5kcwotCi0gKi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZHBtbmctY21kLmgKKyAqCisgKiBkZWZpbmVzIHBvcnRhbCBjb21tYW5kcworICoKKyAqLwogCiAjaWZuZGVmIF9fRlNMX0RQTU5HX0NNRF9ICiAjZGVmaW5lIF9fRlNMX0RQTU5HX0NNRF9ICmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcG1uZy5jIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHBtbmcuYwppbmRleCA2NjBiYmU3Li45NmIxZDY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcG1uZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwbW5nLmMKQEAgLTEsMzcgKzEsMzggQEAKIC8qIENvcHlyaWdodCAyMDEzLTIwMTYgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0qICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZQotKiBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotKiBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSoKLSoKLSogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQotKiBsYXRlciB2ZXJzaW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKLSogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRQotKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSovCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlCisgKiBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KICNpbmNsdWRlICIuLi9pbmNsdWRlL21jLXN5cy5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtY21kLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9kcG1uZy5oIgorCiAjaW5jbHVkZSAiZHBtbmctY21kLmgiCiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHByYy1jbWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwcmMtY21kLmgKaW5kZXggYmIxMjdmNC4uMDA5ZDY1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHByYy1jbWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcHJjLWNtZC5oCkBAIC0xLDQgKzEsNSBAQAotLyogQ29weXJpZ2h0IDIwMTMtMjAxNiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisvKgorICogQ29weXJpZ2h0IDIwMTMtMjAxNiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKQEAgLTMwLDEyICszMSwxMiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoKLSBkcHJjLWNtZC5oCi0KLSBkZWZpbmVzIGRwcmMgcG9ydGFsIGNvbW1hbmRzCi0KLSAqLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBkcHJjLWNtZC5oCisgKgorICogZGVmaW5lcyBkcHJjIHBvcnRhbCBjb21tYW5kcworICoKKyAqLwogCiAjaWZuZGVmIF9GU0xfRFBSQ19DTURfSAogI2RlZmluZSBfRlNMX0RQUkNfQ01EX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwcmMtZHJpdmVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcHJjLWRyaXZlci5jCmluZGV4IGQyYTcxZjEuLmM1ZWU0NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwcmMtZHJpdmVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHByYy1kcml2ZXIuYwpAQCAtOSwxMyArOSwyMSBAQAogICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICovCiAKLSNpbmNsdWRlICIuLi9pbmNsdWRlL21jLXByaXZhdGUuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL21jLXN5cy5oIgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tc2kuaD4KKyNpbmNsdWRlICIuLi9pbmNsdWRlL21jLWJ1cy5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtc3lzLmgiCisKICNpbmNsdWRlICJkcHJjLWNtZC5oIgorI2luY2x1ZGUgImZzbC1tYy1wcml2YXRlLmgiCisKKyNkZWZpbmUgRlNMX01DX0RQUkNfRFJJVkVSX05BTUUgICAgImZzbF9tY19kcHJjIgorCisjZGVmaW5lIEZTTF9NQ19ERVZJQ0VfTUFUQ0goX21jX2RldiwgX29ial9kZXNjKSBcCisJKHN0cmNtcCgoX21jX2RldiktPm9ial9kZXNjLnR5cGUsIChfb2JqX2Rlc2MpLT50eXBlKSA9PSAwICYmIFwKKwkgKF9tY19kZXYpLT5vYmpfZGVzYy5pZCA9PSAoX29ial9kZXNjKS0+aWQpCiAKIHN0cnVjdCBkcHJjX2NoaWxkX29ianMgewogCWludCBjaGlsZF9jb3VudDsKQEAgLTE5MCw1NSArMTk4LDYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGRwcmNfaW5pdF9hbGxfcmVzb3VyY2VfcG9vbHMoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYpCi17Ci0JaW50IHBvb2xfdHlwZTsKLQlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzID0gdG9fZnNsX21jX2J1cyhtY19idXNfZGV2KTsKLQotCWZvciAocG9vbF90eXBlID0gMDsgcG9vbF90eXBlIDwgRlNMX01DX05VTV9QT09MX1RZUEVTOyBwb29sX3R5cGUrKykgewotCQlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlX3Bvb2wgKnJlc19wb29sID0KLQkJICAgICZtY19idXMtPnJlc291cmNlX3Bvb2xzW3Bvb2xfdHlwZV07Ci0KLQkJcmVzX3Bvb2wtPnR5cGUgPSBwb29sX3R5cGU7Ci0JCXJlc19wb29sLT5tYXhfY291bnQgPSAwOwotCQlyZXNfcG9vbC0+ZnJlZV9jb3VudCA9IDA7Ci0JCXJlc19wb29sLT5tY19idXMgPSBtY19idXM7Ci0JCUlOSVRfTElTVF9IRUFEKCZyZXNfcG9vbC0+ZnJlZV9saXN0KTsKLQkJbXV0ZXhfaW5pdCgmcmVzX3Bvb2wtPm11dGV4KTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGRwcmNfY2xlYW51cF9yZXNvdXJjZV9wb29sKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2LAotCQkJCSAgICAgICBlbnVtIGZzbF9tY19wb29sX3R5cGUgcG9vbF90eXBlKQotewotCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKnJlc291cmNlOwotCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKm5leHQ7Ci0Jc3RydWN0IGZzbF9tY19idXMgKm1jX2J1cyA9IHRvX2ZzbF9tY19idXMobWNfYnVzX2Rldik7Ci0Jc3RydWN0IGZzbF9tY19yZXNvdXJjZV9wb29sICpyZXNfcG9vbCA9Ci0JCQkJCSZtY19idXMtPnJlc291cmNlX3Bvb2xzW3Bvb2xfdHlwZV07Ci0JaW50IGZyZWVfY291bnQgPSAwOwotCi0JV0FSTl9PTihyZXNfcG9vbC0+dHlwZSAhPSBwb29sX3R5cGUpOwotCVdBUk5fT04ocmVzX3Bvb2wtPmZyZWVfY291bnQgIT0gcmVzX3Bvb2wtPm1heF9jb3VudCk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVzb3VyY2UsIG5leHQsICZyZXNfcG9vbC0+ZnJlZV9saXN0LCBub2RlKSB7Ci0JCWZyZWVfY291bnQrKzsKLQkJV0FSTl9PTihyZXNvdXJjZS0+dHlwZSAhPSByZXNfcG9vbC0+dHlwZSk7Ci0JCVdBUk5fT04ocmVzb3VyY2UtPnBhcmVudF9wb29sICE9IHJlc19wb29sKTsKLQkJZGV2bV9rZnJlZSgmbWNfYnVzX2Rldi0+ZGV2LCByZXNvdXJjZSk7Ci0JfQotCi0JV0FSTl9PTihmcmVlX2NvdW50ICE9IHJlc19wb29sLT5mcmVlX2NvdW50KTsKLX0KLQotc3RhdGljIHZvaWQgZHByY19jbGVhbnVwX2FsbF9yZXNvdXJjZV9wb29scyhzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldikKLXsKLQlpbnQgcG9vbF90eXBlOwotCi0JZm9yIChwb29sX3R5cGUgPSAwOyBwb29sX3R5cGUgPCBGU0xfTUNfTlVNX1BPT0xfVFlQRVM7IHBvb2xfdHlwZSsrKQotCQlkcHJjX2NsZWFudXBfcmVzb3VyY2VfcG9vbChtY19idXNfZGV2LCBwb29sX3R5cGUpOwotfQotCiAvKioKICAqIGRwcmNfc2Nhbl9vYmplY3RzIC0gRGlzY292ZXIgb2JqZWN0cyBpbiBhIERQUkMKICAqCkBAIC0zNjMsNyArMzIyLDcgQEAKIAl1bnNpZ25lZCBpbnQgaXJxX2NvdW50OwogCXN0cnVjdCBmc2xfbWNfYnVzICptY19idXMgPSB0b19mc2xfbWNfYnVzKG1jX2J1c19kZXYpOwogCi0JZHByY19pbml0X2FsbF9yZXNvdXJjZV9wb29scyhtY19idXNfZGV2KTsKKwlmc2xfbWNfaW5pdF9hbGxfcmVzb3VyY2VfcG9vbHMobWNfYnVzX2Rldik7CiAKIAkvKgogCSAqIERpc2NvdmVyIG9iamVjdHMgaW4gdGhlIERQUkM6CkBAIC0zOTAsNyArMzQ5LDcgQEAKIAogCXJldHVybiAwOwogZXJyb3I6Ci0JZHByY19jbGVhbnVwX2FsbF9yZXNvdXJjZV9wb29scyhtY19idXNfZGV2KTsKKwlmc2xfbWNfY2xlYW51cF9hbGxfcmVzb3VyY2VfcG9vbHMobWNfYnVzX2Rldik7CiAJcmV0dXJuIGVycm9yOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZHByY19zY2FuX2NvbnRhaW5lcik7CkBAIC02NDksNyArNjA4LDcgQEAKIAkJLyoKIAkJICogVGhpcyBpcyBhIGNoaWxkIERQUkM6CiAJCSAqLwotCQlpZiAoV0FSTl9PTihwYXJlbnRfZGV2LT5idXMgIT0gJmZzbF9tY19idXNfdHlwZSkpCisJCWlmIChXQVJOX09OKCFkZXZfaXNfZnNsX21jKHBhcmVudF9kZXYpKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJCWlmIChXQVJOX09OKG1jX2Rldi0+b2JqX2Rlc2MucmVnaW9uX2NvdW50ID09IDApKQpAQCAtNjgxLDcgKzY0MCw3IEBACiAJCSAqLwogCQlzdHJ1Y3QgaXJxX2RvbWFpbiAqbWNfbXNpX2RvbWFpbjsKIAotCQlpZiAoV0FSTl9PTihwYXJlbnRfZGV2LT5idXMgPT0gJmZzbF9tY19idXNfdHlwZSkpCisJCWlmIChXQVJOX09OKGRldl9pc19mc2xfbWMocGFyZW50X2RldikpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJZXJyb3IgPSBmc2xfbWNfZmluZF9tc2lfZG9tYWluKHBhcmVudF9kZXYsCkBAIC04MDIsNyArNzYxLDcgQEAKIAkJZGV2X3NldF9tc2lfZG9tYWluKCZtY19kZXYtPmRldiwgTlVMTCk7CiAJfQogCi0JZHByY19jbGVhbnVwX2FsbF9yZXNvdXJjZV9wb29scyhtY19kZXYpOworCWZzbF9tY19jbGVhbnVwX2FsbF9yZXNvdXJjZV9wb29scyhtY19kZXYpOwogCiAJZXJyb3IgPSBkcHJjX2Nsb3NlKG1jX2Rldi0+bWNfaW8sIDAsIG1jX2Rldi0+bWNfaGFuZGxlKTsKIAlpZiAoZXJyb3IgPCAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHByYy5jIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHByYy5jCmluZGV4IGMyNjA1NDkuLjlmZWEzZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwcmMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcHJjLmMKQEAgLTEsMzcgKzEsMzggQEAKIC8qIENvcHlyaWdodCAyMDEzLTIwMTYgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0qICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZQotKiBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotKiBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSoKLSoKLSogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQotKiBsYXRlciB2ZXJzaW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKLSogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRQotKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSovCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlCisgKiBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KICNpbmNsdWRlICIuLi9pbmNsdWRlL21jLXN5cy5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtY21kLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9kcHJjLmgiCisKICNpbmNsdWRlICJkcHJjLWNtZC5oIgogCiAvKioKQEAgLTEzMzQsMjAgKzEzMzUsMjAgQEAKIH0KIAogLyoqCi0qIGRwcmNfZ2V0X2Nvbm5lY3Rpb24oKSAtIEdldCBjb25uZWN0ZWQgZW5kcG9pbnQgYW5kIGxpbmsgc3RhdHVzIGlmIGNvbm5lY3Rpb24KLSoJCQlleGlzdHMuCi0qIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0Ci0qIEBjbWRfZmxhZ3M6CUNvbW1hbmQgZmxhZ3M7IG9uZSBvciBtb3JlIG9mICdNQ19DTURfRkxBR18nCi0qIEB0b2tlbjoJVG9rZW4gb2YgRFBSQyBvYmplY3QKLSogQGVuZHBvaW50MToJRW5kcG9pbnQgMSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKLSogQGVuZHBvaW50MjoJUmV0dXJuZWQgZW5kcG9pbnQgMiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKLSogQHN0YXRlOglSZXR1cm5lZCBsaW5rIHN0YXRlOgotKgkJMSAtIGxpbmsgaXMgdXA7Ci0qCQkwIC0gbGluayBpcyBkb3duOwotKgkJLTEgLSBubyBjb25uZWN0aW9uIChlbmRwb2ludDIgaW5mb3JtYXRpb24gaXMgaXJyZWxldmFudCkKLSoKLSogUmV0dXJuOiAgICAgJzAnIG9uIFN1Y2Nlc3M7IC1FTkFWQUlMIGlmIGNvbm5lY3Rpb24gZG9lcyBub3QgZXhpc3QuCi0qLworICogZHByY19nZXRfY29ubmVjdGlvbigpIC0gR2V0IGNvbm5lY3RlZCBlbmRwb2ludCBhbmQgbGluayBzdGF0dXMgaWYgY29ubmVjdGlvbgorICoJCQlleGlzdHMuCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQGNtZF9mbGFnczoJQ29tbWFuZCBmbGFnczsgb25lIG9yIG1vcmUgb2YgJ01DX0NNRF9GTEFHXycKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBSQyBvYmplY3QKKyAqIEBlbmRwb2ludDE6CUVuZHBvaW50IDEgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgKiBAZW5kcG9pbnQyOglSZXR1cm5lZCBlbmRwb2ludCAyIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworICogQHN0YXRlOglSZXR1cm5lZCBsaW5rIHN0YXRlOgorICoJCTEgLSBsaW5rIGlzIHVwOworICoJCTAgLSBsaW5rIGlzIGRvd247CisgKgkJLTEgLSBubyBjb25uZWN0aW9uIChlbmRwb2ludDIgaW5mb3JtYXRpb24gaXMgaXJyZWxldmFudCkKKyAqCisgKiBSZXR1cm46ICAgICAnMCcgb24gU3VjY2VzczsgLUVOQVZBSUwgaWYgY29ubmVjdGlvbiBkb2VzIG5vdCBleGlzdC4KKyAqLwogaW50IGRwcmNfZ2V0X2Nvbm5lY3Rpb24oc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCiAJCQl1MzIgY21kX2ZsYWdzLAogCQkJdTE2IHRva2VuLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZnNsLW1jLWFsbG9jYXRvci5jIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZnNsLW1jLWFsbG9jYXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5M2FiNTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9mc2wtbWMtYWxsb2NhdG9yLmMKQEAgLTAsMCArMSw2NjggQEAKKy8qCisgKiBGcmVlc2NhbGUgTUMgb2JqZWN0IGRldmljZSBhbGxvY2F0b3IgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXNpLmg+CisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1idXMuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL21jLXN5cy5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZHBicC1jbWQuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2RwY29uLWNtZC5oIgorCisjaW5jbHVkZSAiZnNsLW1jLXByaXZhdGUuaCIKKworI2RlZmluZSBGU0xfTUNfSVNfQUxMT0NBVEFCTEUoX29ial90eXBlKSBcCisJKHN0cmNtcChfb2JqX3R5cGUsICJkcGJwIikgPT0gMCB8fCBcCisJIHN0cmNtcChfb2JqX3R5cGUsICJkcG1jcCIpID09IDAgfHwgXAorCSBzdHJjbXAoX29ial90eXBlLCAiZHBjb24iKSA9PSAwKQorCisvKioKKyAqIGZzbF9tY19yZXNvdXJjZV9wb29sX2FkZF9kZXZpY2UgLSBhZGQgYWxsb2NhdGFibGUgZGV2aWNlIHRvIGEgcmVzb3VyY2UKKyAqIHBvb2wgb2YgYSBnaXZlbiBNQyBidXMKKyAqCisgKiBAbWNfYnVzOiBwb2ludGVyIHRvIHRoZSBNQyBidXMKKyAqIEBwb29sX3R5cGU6IE1DIGJ1cyBwb29sIHR5cGUKKyAqIEBtY19kZXY6IFBvaW50ZXIgdG8gYWxsb2NhdGFibGUgTUMgb2JqZWN0IGRldmljZQorICoKKyAqIEl0IGFkZHMgYW4gYWxsb2NhdGFibGUgTUMgb2JqZWN0IGRldmljZSB0byBhIGNvbnRhaW5lcidzIHJlc291cmNlIHBvb2wgb2YKKyAqIHRoZSBnaXZlbiByZXNvdXJjZSB0eXBlCisgKi8KK3N0YXRpYyBpbnQgX19tdXN0X2NoZWNrIGZzbF9tY19yZXNvdXJjZV9wb29sX2FkZF9kZXZpY2Uoc3RydWN0IGZzbF9tY19idXMKKwkJCQkJCQkJKm1jX2J1cywKKwkJCQkJCQllbnVtIGZzbF9tY19wb29sX3R5cGUKKwkJCQkJCQkJcG9vbF90eXBlLAorCQkJCQkJCXN0cnVjdCBmc2xfbWNfZGV2aWNlCisJCQkJCQkJCSptY19kZXYpCit7CisJc3RydWN0IGZzbF9tY19yZXNvdXJjZV9wb29sICpyZXNfcG9vbDsKKwlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlICpyZXNvdXJjZTsKKwlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldiA9ICZtY19idXMtPm1jX2RldjsKKwlpbnQgZXJyb3IgPSAtRUlOVkFMOworCisJaWYgKFdBUk5fT04ocG9vbF90eXBlIDwgMCB8fCBwb29sX3R5cGUgPj0gRlNMX01DX05VTV9QT09MX1RZUEVTKSkKKwkJZ290byBvdXQ7CisJaWYgKFdBUk5fT04oIUZTTF9NQ19JU19BTExPQ0FUQUJMRShtY19kZXYtPm9ial9kZXNjLnR5cGUpKSkKKwkJZ290byBvdXQ7CisJaWYgKFdBUk5fT04obWNfZGV2LT5yZXNvdXJjZSkpCisJCWdvdG8gb3V0OworCisJcmVzX3Bvb2wgPSAmbWNfYnVzLT5yZXNvdXJjZV9wb29sc1twb29sX3R5cGVdOworCWlmIChXQVJOX09OKHJlc19wb29sLT50eXBlICE9IHBvb2xfdHlwZSkpCisJCWdvdG8gb3V0OworCWlmIChXQVJOX09OKHJlc19wb29sLT5tY19idXMgIT0gbWNfYnVzKSkKKwkJZ290byBvdXQ7CisKKwltdXRleF9sb2NrKCZyZXNfcG9vbC0+bXV0ZXgpOworCisJaWYgKFdBUk5fT04ocmVzX3Bvb2wtPm1heF9jb3VudCA8IDApKQorCQlnb3RvIG91dF91bmxvY2s7CisJaWYgKFdBUk5fT04ocmVzX3Bvb2wtPmZyZWVfY291bnQgPCAwIHx8CisJCSAgICByZXNfcG9vbC0+ZnJlZV9jb3VudCA+IHJlc19wb29sLT5tYXhfY291bnQpKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlyZXNvdXJjZSA9IGRldm1fa3phbGxvYygmbWNfYnVzX2Rldi0+ZGV2LCBzaXplb2YoKnJlc291cmNlKSwKKwkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXJlc291cmNlKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZGV2X2VycigmbWNfYnVzX2Rldi0+ZGV2LAorCQkJIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGZzbF9tY19yZXNvdXJjZVxuIik7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlyZXNvdXJjZS0+dHlwZSA9IHBvb2xfdHlwZTsKKwlyZXNvdXJjZS0+aWQgPSBtY19kZXYtPm9ial9kZXNjLmlkOworCXJlc291cmNlLT5kYXRhID0gbWNfZGV2OworCXJlc291cmNlLT5wYXJlbnRfcG9vbCA9IHJlc19wb29sOworCUlOSVRfTElTVF9IRUFEKCZyZXNvdXJjZS0+bm9kZSk7CisJbGlzdF9hZGRfdGFpbCgmcmVzb3VyY2UtPm5vZGUsICZyZXNfcG9vbC0+ZnJlZV9saXN0KTsKKwltY19kZXYtPnJlc291cmNlID0gcmVzb3VyY2U7CisJcmVzX3Bvb2wtPmZyZWVfY291bnQrKzsKKwlyZXNfcG9vbC0+bWF4X2NvdW50Kys7CisJZXJyb3IgPSAwOworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJnJlc19wb29sLT5tdXRleCk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIGZzbF9tY19yZXNvdXJjZV9wb29sX3JlbW92ZV9kZXZpY2UgLSByZW1vdmUgYW4gYWxsb2NhdGFibGUgZGV2aWNlIGZyb20gYQorICogcmVzb3VyY2UgcG9vbAorICoKKyAqIEBtY19kZXY6IFBvaW50ZXIgdG8gYWxsb2NhdGFibGUgTUMgb2JqZWN0IGRldmljZQorICoKKyAqIEl0IHBlcm1hbmVudGx5IHJlbW92ZXMgYW4gYWxsb2NhdGFibGUgTUMgb2JqZWN0IGRldmljZSBmcm9tIHRoZSByZXNvdXJjZQorICogcG9vbCwgdGhlIGRldmljZSBpcyBjdXJyZW50bHkgaW4sIGFzIGxvbmcgYXMgaXQgaXMgaW4gdGhlIHBvb2wncyBmcmVlIGxpc3QuCisgKi8KK3N0YXRpYyBpbnQgX19tdXN0X2NoZWNrIGZzbF9tY19yZXNvdXJjZV9wb29sX3JlbW92ZV9kZXZpY2Uoc3RydWN0IGZzbF9tY19kZXZpY2UKKwkJCQkJCQkJICAgKm1jX2RldikKK3sKKwlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldjsKKwlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzOworCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2VfcG9vbCAqcmVzX3Bvb2w7CisJc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqcmVzb3VyY2U7CisJaW50IGVycm9yID0gLUVJTlZBTDsKKworCWlmIChXQVJOX09OKCFGU0xfTUNfSVNfQUxMT0NBVEFCTEUobWNfZGV2LT5vYmpfZGVzYy50eXBlKSkpCisJCWdvdG8gb3V0OworCisJcmVzb3VyY2UgPSBtY19kZXYtPnJlc291cmNlOworCWlmIChXQVJOX09OKCFyZXNvdXJjZSB8fCByZXNvdXJjZS0+ZGF0YSAhPSBtY19kZXYpKQorCQlnb3RvIG91dDsKKworCW1jX2J1c19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKG1jX2Rldi0+ZGV2LnBhcmVudCk7CisJbWNfYnVzID0gdG9fZnNsX21jX2J1cyhtY19idXNfZGV2KTsKKwlyZXNfcG9vbCA9IHJlc291cmNlLT5wYXJlbnRfcG9vbDsKKwlpZiAoV0FSTl9PTihyZXNfcG9vbCAhPSAmbWNfYnVzLT5yZXNvdXJjZV9wb29sc1tyZXNvdXJjZS0+dHlwZV0pKQorCQlnb3RvIG91dDsKKworCW11dGV4X2xvY2soJnJlc19wb29sLT5tdXRleCk7CisKKwlpZiAoV0FSTl9PTihyZXNfcG9vbC0+bWF4X2NvdW50IDw9IDApKQorCQlnb3RvIG91dF91bmxvY2s7CisJaWYgKFdBUk5fT04ocmVzX3Bvb2wtPmZyZWVfY291bnQgPD0gMCB8fAorCQkgICAgcmVzX3Bvb2wtPmZyZWVfY291bnQgPiByZXNfcG9vbC0+bWF4X2NvdW50KSkKKwkJZ290byBvdXRfdW5sb2NrOworCisJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIGlzIGN1cnJlbnRseSBhbGxvY2F0ZWQsIGl0cyByZXNvdXJjZSBpcyBub3QKKwkgKiBpbiB0aGUgZnJlZSBsaXN0IGFuZCB0aHVzLCB0aGUgZGV2aWNlIGNhbm5vdCBiZSByZW1vdmVkLgorCSAqLworCWlmIChsaXN0X2VtcHR5KCZyZXNvdXJjZS0+bm9kZSkpIHsKKwkJZXJyb3IgPSAtRUJVU1k7CisJCWRldl9lcnIoJm1jX2J1c19kZXYtPmRldiwKKwkJCSJEZXZpY2UgJXMgY2Fubm90IGJlIHJlbW92ZWQgZnJvbSByZXNvdXJjZSBwb29sXG4iLAorCQkJZGV2X25hbWUoJm1jX2Rldi0+ZGV2KSk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlsaXN0X2RlbF9pbml0KCZyZXNvdXJjZS0+bm9kZSk7CisJcmVzX3Bvb2wtPmZyZWVfY291bnQtLTsKKwlyZXNfcG9vbC0+bWF4X2NvdW50LS07CisKKwlkZXZtX2tmcmVlKCZtY19idXNfZGV2LT5kZXYsIHJlc291cmNlKTsKKwltY19kZXYtPnJlc291cmNlID0gTlVMTDsKKwllcnJvciA9IDA7CitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmcmVzX3Bvb2wtPm11dGV4KTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBmc2xfbWNfcG9vbF90eXBlX3N0cmluZ3NbXSA9IHsKKwlbRlNMX01DX1BPT0xfRFBNQ1BdID0gImRwbWNwIiwKKwlbRlNMX01DX1BPT0xfRFBCUF0gPSAiZHBicCIsCisJW0ZTTF9NQ19QT09MX0RQQ09OXSA9ICJkcGNvbiIsCisJW0ZTTF9NQ19QT09MX0lSUV0gPSAiaXJxIiwKK307CisKK3N0YXRpYyBpbnQgX19tdXN0X2NoZWNrIG9iamVjdF90eXBlX3RvX3Bvb2xfdHlwZShjb25zdCBjaGFyICpvYmplY3RfdHlwZSwKKwkJCQkJCSBlbnVtIGZzbF9tY19wb29sX3R5cGUKKwkJCQkJCQkJKnBvb2xfdHlwZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZzbF9tY19wb29sX3R5cGVfc3RyaW5ncyk7IGkrKykgeworCQlpZiAoc3RyY21wKG9iamVjdF90eXBlLCBmc2xfbWNfcG9vbF90eXBlX3N0cmluZ3NbaV0pID09IDApIHsKKwkJCSpwb29sX3R5cGUgPSBpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50IF9fbXVzdF9jaGVjayBmc2xfbWNfcmVzb3VyY2VfYWxsb2NhdGUoc3RydWN0IGZzbF9tY19idXMgKm1jX2J1cywKKwkJCQkJICBlbnVtIGZzbF9tY19wb29sX3R5cGUgcG9vbF90eXBlLAorCQkJCQkgIHN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKipuZXdfcmVzb3VyY2UpCit7CisJc3RydWN0IGZzbF9tY19yZXNvdXJjZV9wb29sICpyZXNfcG9vbDsKKwlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlICpyZXNvdXJjZTsKKwlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldiA9ICZtY19idXMtPm1jX2RldjsKKwlpbnQgZXJyb3IgPSAtRUlOVkFMOworCisJQlVJTERfQlVHX09OKEFSUkFZX1NJWkUoZnNsX21jX3Bvb2xfdHlwZV9zdHJpbmdzKSAhPQorCQkgICAgIEZTTF9NQ19OVU1fUE9PTF9UWVBFUyk7CisKKwkqbmV3X3Jlc291cmNlID0gTlVMTDsKKwlpZiAoV0FSTl9PTihwb29sX3R5cGUgPCAwIHx8IHBvb2xfdHlwZSA+PSBGU0xfTUNfTlVNX1BPT0xfVFlQRVMpKQorCQlnb3RvIG91dDsKKworCXJlc19wb29sID0gJm1jX2J1cy0+cmVzb3VyY2VfcG9vbHNbcG9vbF90eXBlXTsKKwlpZiAoV0FSTl9PTihyZXNfcG9vbC0+bWNfYnVzICE9IG1jX2J1cykpCisJCWdvdG8gb3V0OworCisJbXV0ZXhfbG9jaygmcmVzX3Bvb2wtPm11dGV4KTsKKwlyZXNvdXJjZSA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmcmVzX3Bvb2wtPmZyZWVfbGlzdCwKKwkJCQkJICAgIHN0cnVjdCBmc2xfbWNfcmVzb3VyY2UsIG5vZGUpOworCisJaWYgKCFyZXNvdXJjZSkgeworCQlXQVJOX09OKHJlc19wb29sLT5mcmVlX2NvdW50ICE9IDApOworCQllcnJvciA9IC1FTlhJTzsKKwkJZGV2X2VycigmbWNfYnVzX2Rldi0+ZGV2LAorCQkJIk5vIG1vcmUgcmVzb3VyY2VzIG9mIHR5cGUgJXMgbGVmdFxuIiwKKwkJCWZzbF9tY19wb29sX3R5cGVfc3RyaW5nc1twb29sX3R5cGVdKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWlmIChXQVJOX09OKHJlc291cmNlLT50eXBlICE9IHBvb2xfdHlwZSkpCisJCWdvdG8gb3V0X3VubG9jazsKKwlpZiAoV0FSTl9PTihyZXNvdXJjZS0+cGFyZW50X3Bvb2wgIT0gcmVzX3Bvb2wpKQorCQlnb3RvIG91dF91bmxvY2s7CisJaWYgKFdBUk5fT04ocmVzX3Bvb2wtPmZyZWVfY291bnQgPD0gMCB8fAorCQkgICAgcmVzX3Bvb2wtPmZyZWVfY291bnQgPiByZXNfcG9vbC0+bWF4X2NvdW50KSkKKwkJZ290byBvdXRfdW5sb2NrOworCisJbGlzdF9kZWxfaW5pdCgmcmVzb3VyY2UtPm5vZGUpOworCisJcmVzX3Bvb2wtPmZyZWVfY291bnQtLTsKKwllcnJvciA9IDA7CitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmcmVzX3Bvb2wtPm11dGV4KTsKKwkqbmV3X3Jlc291cmNlID0gcmVzb3VyY2U7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX3Jlc291cmNlX2FsbG9jYXRlKTsKKwordm9pZCBmc2xfbWNfcmVzb3VyY2VfZnJlZShzdHJ1Y3QgZnNsX21jX3Jlc291cmNlICpyZXNvdXJjZSkKK3sKKwlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlX3Bvb2wgKnJlc19wb29sOworCisJcmVzX3Bvb2wgPSByZXNvdXJjZS0+cGFyZW50X3Bvb2w7CisJaWYgKFdBUk5fT04ocmVzb3VyY2UtPnR5cGUgIT0gcmVzX3Bvb2wtPnR5cGUpKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZyZXNfcG9vbC0+bXV0ZXgpOworCWlmIChXQVJOX09OKHJlc19wb29sLT5mcmVlX2NvdW50IDwgMCB8fAorCQkgICAgcmVzX3Bvb2wtPmZyZWVfY291bnQgPj0gcmVzX3Bvb2wtPm1heF9jb3VudCkpCisJCWdvdG8gb3V0X3VubG9jazsKKworCWlmIChXQVJOX09OKCFsaXN0X2VtcHR5KCZyZXNvdXJjZS0+bm9kZSkpKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlsaXN0X2FkZF90YWlsKCZyZXNvdXJjZS0+bm9kZSwgJnJlc19wb29sLT5mcmVlX2xpc3QpOworCXJlc19wb29sLT5mcmVlX2NvdW50Kys7CitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmcmVzX3Bvb2wtPm11dGV4KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19yZXNvdXJjZV9mcmVlKTsKKworLyoqCisgKiBmc2xfbWNfb2JqZWN0X2FsbG9jYXRlIC0gQWxsb2NhdGVzIGEgTUMgb2JqZWN0IGRldmljZSBvZiB0aGUgZ2l2ZW4KKyAqIHBvb2wgdHlwZSBmcm9tIGEgZ2l2ZW4gTUMgYnVzCisgKgorICogQG1jX2RldjogTUMgZGV2aWNlIGZvciB3aGljaCB0aGUgTUMgb2JqZWN0IGRldmljZSBpcyB0byBiZSBhbGxvY2F0ZWQKKyAqIEBwb29sX3R5cGU6IE1DIGJ1cyByZXNvdXJjZSBwb29sIHR5cGUKKyAqIEBuZXdfbWNfZGV2OiBQb2ludGVyIHRvIGFyZWEgd2hlcmUgdGhlIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZAorICogTUMgb2JqZWN0IGRldmljZSBpcyB0byBiZSByZXR1cm5lZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGEgTUMgb2JqZWN0IGRldmljZSBmcm9tIHRoZSBkZXZpY2UncyBwYXJlbnQgRFBSQywKKyAqIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgTUMgYnVzJyBwb29sIG9mIGFsbG9jYXRhYmxlIE1DIG9iamVjdCBkZXZpY2VzIG9mCisgKiB0aGUgZ2l2ZW4gcmVzb3VyY2UgdHlwZS4gbWNfZGV2IGNhbm5vdCBiZSBhIERQUkMgaXRzZWxmLgorICoKKyAqIE5PVEU6IHBvb2xfdHlwZSBtdXN0IGJlIGRpZmZlcmVudCBmcm9tIEZTTF9NQ19QT09MX01DUCwgc2luY2UgTUMKKyAqIHBvcnRhbHMgYXJlIGFsbG9jYXRlZCB1c2luZyBmc2xfbWNfcG9ydGFsX2FsbG9jYXRlKCksIGluc3RlYWQgb2YKKyAqIHRoaXMgZnVuY3Rpb24uCisgKi8KK2ludCBfX211c3RfY2hlY2sgZnNsX21jX29iamVjdF9hbGxvY2F0ZShzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2LAorCQkJCQllbnVtIGZzbF9tY19wb29sX3R5cGUgcG9vbF90eXBlLAorCQkJCQlzdHJ1Y3QgZnNsX21jX2RldmljZSAqKm5ld19tY19hZGV2KQoreworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2OworCXN0cnVjdCBmc2xfbWNfYnVzICptY19idXM7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2FkZXY7CisJaW50IGVycm9yID0gLUVJTlZBTDsKKwlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlICpyZXNvdXJjZSA9IE5VTEw7CisKKwkqbmV3X21jX2FkZXYgPSBOVUxMOworCWlmIChXQVJOX09OKG1jX2Rldi0+ZmxhZ3MgJiBGU0xfTUNfSVNfRFBSQykpCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoV0FSTl9PTighZGV2X2lzX2ZzbF9tYyhtY19kZXYtPmRldi5wYXJlbnQpKSkKKwkJZ290byBlcnJvcjsKKworCWlmIChXQVJOX09OKHBvb2xfdHlwZSA9PSBGU0xfTUNfUE9PTF9EUE1DUCkpCisJCWdvdG8gZXJyb3I7CisKKwltY19idXNfZGV2ID0gdG9fZnNsX21jX2RldmljZShtY19kZXYtPmRldi5wYXJlbnQpOworCW1jX2J1cyA9IHRvX2ZzbF9tY19idXMobWNfYnVzX2Rldik7CisJZXJyb3IgPSBmc2xfbWNfcmVzb3VyY2VfYWxsb2NhdGUobWNfYnVzLCBwb29sX3R5cGUsICZyZXNvdXJjZSk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBlcnJvcjsKKworCW1jX2FkZXYgPSByZXNvdXJjZS0+ZGF0YTsKKwlpZiAoV0FSTl9PTighbWNfYWRldikpCisJCWdvdG8gZXJyb3I7CisKKwkqbmV3X21jX2FkZXYgPSBtY19hZGV2OworCXJldHVybiAwOworZXJyb3I6CisJaWYgKHJlc291cmNlKQorCQlmc2xfbWNfcmVzb3VyY2VfZnJlZShyZXNvdXJjZSk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfb2JqZWN0X2FsbG9jYXRlKTsKKworLyoqCisgKiBmc2xfbWNfb2JqZWN0X2ZyZWUgLSBSZXR1cm5zIGFuIGFsbG9jYXRhYmxlIE1DIG9iamVjdCBkZXZpY2UgdG8gdGhlCisgKiBjb3JyZXNwb25kaW5nIHJlc291cmNlIHBvb2wgb2YgYSBnaXZlbiBNQyBidXMuCisgKgorICogQG1jX2FkZXY6IFBvaW50ZXIgdG8gdGhlIE1DIG9iamVjdCBkZXZpY2UKKyAqLwordm9pZCBmc2xfbWNfb2JqZWN0X2ZyZWUoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2FkZXYpCit7CisJc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqcmVzb3VyY2U7CisKKwlyZXNvdXJjZSA9IG1jX2FkZXYtPnJlc291cmNlOworCWlmIChXQVJOX09OKHJlc291cmNlLT50eXBlID09IEZTTF9NQ19QT09MX0RQTUNQKSkKKwkJcmV0dXJuOworCWlmIChXQVJOX09OKHJlc291cmNlLT5kYXRhICE9IG1jX2FkZXYpKQorCQlyZXR1cm47CisKKwlmc2xfbWNfcmVzb3VyY2VfZnJlZShyZXNvdXJjZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfb2JqZWN0X2ZyZWUpOworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgaW50ZXJydXB0IHBvb2wgYXNzb2NpYXRlZCB3aXRoIGEgTUMgYnVzLgorICogSXQgYWxsb2NhdGVzIGEgYmxvY2sgb2YgSVJRcyBmcm9tIHRoZSBHSUMtSVRTCisgKi8KK2ludCBmc2xfbWNfcG9wdWxhdGVfaXJxX3Bvb2woc3RydWN0IGZzbF9tY19idXMgKm1jX2J1cywKKwkJCSAgICAgdW5zaWduZWQgaW50IGlycV9jb3VudCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgbXNpX2Rlc2MgKm1zaV9kZXNjOworCXN0cnVjdCBmc2xfbWNfZGV2aWNlX2lycSAqaXJxX3Jlc291cmNlczsKKwlzdHJ1Y3QgZnNsX21jX2RldmljZV9pcnEgKm1jX2Rldl9pcnE7CisJaW50IGVycm9yOworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2ID0gJm1jX2J1cy0+bWNfZGV2OworCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2VfcG9vbCAqcmVzX3Bvb2wgPQorCQkJJm1jX2J1cy0+cmVzb3VyY2VfcG9vbHNbRlNMX01DX1BPT0xfSVJRXTsKKworCWlmIChXQVJOX09OKGlycV9jb3VudCA9PSAwIHx8CisJCSAgICBpcnFfY291bnQgPiBGU0xfTUNfSVJRX1BPT0xfTUFYX1RPVEFMX0lSUVMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVycm9yID0gZnNsX21jX21zaV9kb21haW5fYWxsb2NfaXJxcygmbWNfYnVzX2Rldi0+ZGV2LCBpcnFfY291bnQpOworCWlmIChlcnJvciA8IDApCisJCXJldHVybiBlcnJvcjsKKworCWlycV9yZXNvdXJjZXMgPSBkZXZtX2t6YWxsb2MoJm1jX2J1c19kZXYtPmRldiwKKwkJCQkgICAgIHNpemVvZigqaXJxX3Jlc291cmNlcykgKiBpcnFfY291bnQsCisJCQkJICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWlycV9yZXNvdXJjZXMpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGNsZWFudXBfbXNpX2lycXM7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGlycV9jb3VudDsgaSsrKSB7CisJCW1jX2Rldl9pcnEgPSAmaXJxX3Jlc291cmNlc1tpXTsKKworCQkvKgorCQkgKiBOT1RFOiBUaGlzIG1jX2Rldl9pcnEncyBNU0kgYWRkci92YWx1ZSBwYWlyIHdpbGwgYmUgc2V0CisJCSAqIGJ5IHRoZSBmc2xfbWNfbXNpX3dyaXRlX21zZygpIGNhbGxiYWNrCisJCSAqLworCQltY19kZXZfaXJxLT5yZXNvdXJjZS50eXBlID0gcmVzX3Bvb2wtPnR5cGU7CisJCW1jX2Rldl9pcnEtPnJlc291cmNlLmRhdGEgPSBtY19kZXZfaXJxOworCQltY19kZXZfaXJxLT5yZXNvdXJjZS5wYXJlbnRfcG9vbCA9IHJlc19wb29sOworCQlJTklUX0xJU1RfSEVBRCgmbWNfZGV2X2lycS0+cmVzb3VyY2Uubm9kZSk7CisJCWxpc3RfYWRkX3RhaWwoJm1jX2Rldl9pcnEtPnJlc291cmNlLm5vZGUsICZyZXNfcG9vbC0+ZnJlZV9saXN0KTsKKwl9CisKKwlmb3JfZWFjaF9tc2lfZW50cnkobXNpX2Rlc2MsICZtY19idXNfZGV2LT5kZXYpIHsKKwkJbWNfZGV2X2lycSA9ICZpcnFfcmVzb3VyY2VzW21zaV9kZXNjLT5mc2xfbWMubXNpX2luZGV4XTsKKwkJbWNfZGV2X2lycS0+bXNpX2Rlc2MgPSBtc2lfZGVzYzsKKwkJbWNfZGV2X2lycS0+cmVzb3VyY2UuaWQgPSBtc2lfZGVzYy0+aXJxOworCX0KKworCXJlc19wb29sLT5tYXhfY291bnQgPSBpcnFfY291bnQ7CisJcmVzX3Bvb2wtPmZyZWVfY291bnQgPSBpcnFfY291bnQ7CisJbWNfYnVzLT5pcnFfcmVzb3VyY2VzID0gaXJxX3Jlc291cmNlczsKKwlyZXR1cm4gMDsKKworY2xlYW51cF9tc2lfaXJxczoKKwlmc2xfbWNfbXNpX2RvbWFpbl9mcmVlX2lycXMoJm1jX2J1c19kZXYtPmRldik7CisJcmV0dXJuIGVycm9yOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX3BvcHVsYXRlX2lycV9wb29sKTsKKworLyoqCisgKiBUZWFyZG93biB0aGUgaW50ZXJydXB0IHBvb2wgYXNzb2NpYXRlZCB3aXRoIGFuIE1DIGJ1cy4KKyAqIEl0IGZyZWVzIHRoZSBJUlFzIHRoYXQgd2VyZSBhbGxvY2F0ZWQgdG8gdGhlIHBvb2wsIGJhY2sgdG8gdGhlIEdJQy1JVFMuCisgKi8KK3ZvaWQgZnNsX21jX2NsZWFudXBfaXJxX3Bvb2woc3RydWN0IGZzbF9tY19idXMgKm1jX2J1cykKK3sKKwlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldiA9ICZtY19idXMtPm1jX2RldjsKKwlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlX3Bvb2wgKnJlc19wb29sID0KKwkJCSZtY19idXMtPnJlc291cmNlX3Bvb2xzW0ZTTF9NQ19QT09MX0lSUV07CisKKwlpZiAoV0FSTl9PTighbWNfYnVzLT5pcnFfcmVzb3VyY2VzKSkKKwkJcmV0dXJuOworCisJaWYgKFdBUk5fT04ocmVzX3Bvb2wtPm1heF9jb3VudCA9PSAwKSkKKwkJcmV0dXJuOworCisJaWYgKFdBUk5fT04ocmVzX3Bvb2wtPmZyZWVfY291bnQgIT0gcmVzX3Bvb2wtPm1heF9jb3VudCkpCisJCXJldHVybjsKKworCUlOSVRfTElTVF9IRUFEKCZyZXNfcG9vbC0+ZnJlZV9saXN0KTsKKwlyZXNfcG9vbC0+bWF4X2NvdW50ID0gMDsKKwlyZXNfcG9vbC0+ZnJlZV9jb3VudCA9IDA7CisJbWNfYnVzLT5pcnFfcmVzb3VyY2VzID0gTlVMTDsKKwlmc2xfbWNfbXNpX2RvbWFpbl9mcmVlX2lycXMoJm1jX2J1c19kZXYtPmRldik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfY2xlYW51cF9pcnFfcG9vbCk7CisKKy8qKgorICogSXQgYWxsb2NhdGVzIHRoZSBJUlFzIHJlcXVpcmVkIGJ5IGEgZ2l2ZW4gTUMgb2JqZWN0IGRldmljZS4gVGhlCisgKiBJUlFzIGFyZSBhbGxvY2F0ZWQgZnJvbSB0aGUgaW50ZXJydXB0IHBvb2wgYXNzb2NpYXRlZCB3aXRoIHRoZQorICogTUMgYnVzIHRoYXQgY29udGFpbnMgdGhlIGRldmljZSwgaWYgdGhlIGRldmljZSBpcyBub3QgYSBEUFJDIGRldmljZS4KKyAqIE90aGVyd2lzZSwgdGhlIElSUXMgYXJlIGFsbG9jYXRlZCBmcm9tIHRoZSBpbnRlcnJ1cHQgcG9vbCBhc3NvY2lhdGVkCisgKiB3aXRoIHRoZSBNQyBidXMgdGhhdCByZXByZXNlbnRzIHRoZSBEUFJDIGRldmljZSBpdHNlbGYuCisgKi8KK2ludCBfX211c3RfY2hlY2sgZnNsX21jX2FsbG9jYXRlX2lycXMoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldikKK3sKKwlpbnQgaTsKKwlpbnQgaXJxX2NvdW50OworCWludCByZXNfYWxsb2NhdGVkX2NvdW50ID0gMDsKKwlpbnQgZXJyb3IgPSAtRUlOVkFMOworCXN0cnVjdCBmc2xfbWNfZGV2aWNlX2lycSAqKmlycXMgPSBOVUxMOworCXN0cnVjdCBmc2xfbWNfYnVzICptY19idXM7CisJc3RydWN0IGZzbF9tY19yZXNvdXJjZV9wb29sICpyZXNfcG9vbDsKKworCWlmIChXQVJOX09OKG1jX2Rldi0+aXJxcykpCisJCXJldHVybiAtRUlOVkFMOworCisJaXJxX2NvdW50ID0gbWNfZGV2LT5vYmpfZGVzYy5pcnFfY291bnQ7CisJaWYgKFdBUk5fT04oaXJxX2NvdW50ID09IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzdHJjbXAobWNfZGV2LT5vYmpfZGVzYy50eXBlLCAiZHByYyIpID09IDApCisJCW1jX2J1cyA9IHRvX2ZzbF9tY19idXMobWNfZGV2KTsKKwllbHNlCisJCW1jX2J1cyA9IHRvX2ZzbF9tY19idXModG9fZnNsX21jX2RldmljZShtY19kZXYtPmRldi5wYXJlbnQpKTsKKworCWlmIChXQVJOX09OKCFtY19idXMtPmlycV9yZXNvdXJjZXMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlc19wb29sID0gJm1jX2J1cy0+cmVzb3VyY2VfcG9vbHNbRlNMX01DX1BPT0xfSVJRXTsKKwlpZiAocmVzX3Bvb2wtPmZyZWVfY291bnQgPCBpcnFfY291bnQpIHsKKwkJZGV2X2VycigmbWNfZGV2LT5kZXYsCisJCQkiTm90IGFibGUgdG8gYWxsb2NhdGUgJXUgaXJxcyBmb3IgZGV2aWNlXG4iLCBpcnFfY291bnQpOworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisKKwlpcnFzID0gZGV2bV9remFsbG9jKCZtY19kZXYtPmRldiwgaXJxX2NvdW50ICogc2l6ZW9mKGlycXNbMF0pLAorCQkJICAgIEdGUF9LRVJORUwpOworCWlmICghaXJxcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgaXJxX2NvdW50OyBpKyspIHsKKwkJc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqcmVzb3VyY2U7CisKKwkJZXJyb3IgPSBmc2xfbWNfcmVzb3VyY2VfYWxsb2NhdGUobWNfYnVzLCBGU0xfTUNfUE9PTF9JUlEsCisJCQkJCQkgJnJlc291cmNlKTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWdvdG8gZXJyb3JfcmVzb3VyY2VfYWxsb2M7CisKKwkJaXJxc1tpXSA9IHRvX2ZzbF9tY19pcnEocmVzb3VyY2UpOworCQlyZXNfYWxsb2NhdGVkX2NvdW50Kys7CisKKwkJV0FSTl9PTihpcnFzW2ldLT5tY19kZXYpOworCQlpcnFzW2ldLT5tY19kZXYgPSBtY19kZXY7CisJCWlycXNbaV0tPmRldl9pcnFfaW5kZXggPSBpOworCX0KKworCW1jX2Rldi0+aXJxcyA9IGlycXM7CisJcmV0dXJuIDA7CisKK2Vycm9yX3Jlc291cmNlX2FsbG9jOgorCWZvciAoaSA9IDA7IGkgPCByZXNfYWxsb2NhdGVkX2NvdW50OyBpKyspIHsKKwkJaXJxc1tpXS0+bWNfZGV2ID0gTlVMTDsKKwkJZnNsX21jX3Jlc291cmNlX2ZyZWUoJmlycXNbaV0tPnJlc291cmNlKTsKKwl9CisKKwlyZXR1cm4gZXJyb3I7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfYWxsb2NhdGVfaXJxcyk7CisKKy8qCisgKiBJdCBmcmVlcyB0aGUgSVJRcyB0aGF0IHdlcmUgYWxsb2NhdGVkIGZvciBhIE1DIG9iamVjdCBkZXZpY2UsIGJ5CisgKiByZXR1cm5pbmcgdGhlbSB0byB0aGUgY29ycmVzcG9uZGluZyBpbnRlcnJ1cHQgcG9vbC4KKyAqLwordm9pZCBmc2xfbWNfZnJlZV9pcnFzKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYpCit7CisJaW50IGk7CisJaW50IGlycV9jb3VudDsKKwlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzOworCXN0cnVjdCBmc2xfbWNfZGV2aWNlX2lycSAqKmlycXMgPSBtY19kZXYtPmlycXM7CisKKwlpZiAoV0FSTl9PTighaXJxcykpCisJCXJldHVybjsKKworCWlycV9jb3VudCA9IG1jX2Rldi0+b2JqX2Rlc2MuaXJxX2NvdW50OworCisJaWYgKHN0cmNtcChtY19kZXYtPm9ial9kZXNjLnR5cGUsICJkcHJjIikgPT0gMCkKKwkJbWNfYnVzID0gdG9fZnNsX21jX2J1cyhtY19kZXYpOworCWVsc2UKKwkJbWNfYnVzID0gdG9fZnNsX21jX2J1cyh0b19mc2xfbWNfZGV2aWNlKG1jX2Rldi0+ZGV2LnBhcmVudCkpOworCisJaWYgKFdBUk5fT04oIW1jX2J1cy0+aXJxX3Jlc291cmNlcykpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBpcnFfY291bnQ7IGkrKykgeworCQlXQVJOX09OKCFpcnFzW2ldLT5tY19kZXYpOworCQlpcnFzW2ldLT5tY19kZXYgPSBOVUxMOworCQlmc2xfbWNfcmVzb3VyY2VfZnJlZSgmaXJxc1tpXS0+cmVzb3VyY2UpOworCX0KKworCW1jX2Rldi0+aXJxcyA9IE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfZnJlZV9pcnFzKTsKKwordm9pZCBmc2xfbWNfaW5pdF9hbGxfcmVzb3VyY2VfcG9vbHMoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYpCit7CisJaW50IHBvb2xfdHlwZTsKKwlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzID0gdG9fZnNsX21jX2J1cyhtY19idXNfZGV2KTsKKworCWZvciAocG9vbF90eXBlID0gMDsgcG9vbF90eXBlIDwgRlNMX01DX05VTV9QT09MX1RZUEVTOyBwb29sX3R5cGUrKykgeworCQlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlX3Bvb2wgKnJlc19wb29sID0KKwkJICAgICZtY19idXMtPnJlc291cmNlX3Bvb2xzW3Bvb2xfdHlwZV07CisKKwkJcmVzX3Bvb2wtPnR5cGUgPSBwb29sX3R5cGU7CisJCXJlc19wb29sLT5tYXhfY291bnQgPSAwOworCQlyZXNfcG9vbC0+ZnJlZV9jb3VudCA9IDA7CisJCXJlc19wb29sLT5tY19idXMgPSBtY19idXM7CisJCUlOSVRfTElTVF9IRUFEKCZyZXNfcG9vbC0+ZnJlZV9saXN0KTsKKwkJbXV0ZXhfaW5pdCgmcmVzX3Bvb2wtPm11dGV4KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9tY19jbGVhbnVwX3Jlc291cmNlX3Bvb2woc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYsCisJCQkJCSBlbnVtIGZzbF9tY19wb29sX3R5cGUgcG9vbF90eXBlKQoreworCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKnJlc291cmNlOworCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKm5leHQ7CisJc3RydWN0IGZzbF9tY19idXMgKm1jX2J1cyA9IHRvX2ZzbF9tY19idXMobWNfYnVzX2Rldik7CisJc3RydWN0IGZzbF9tY19yZXNvdXJjZV9wb29sICpyZXNfcG9vbCA9CisJCQkJCSZtY19idXMtPnJlc291cmNlX3Bvb2xzW3Bvb2xfdHlwZV07CisJaW50IGZyZWVfY291bnQgPSAwOworCisJV0FSTl9PTihyZXNfcG9vbC0+dHlwZSAhPSBwb29sX3R5cGUpOworCVdBUk5fT04ocmVzX3Bvb2wtPmZyZWVfY291bnQgIT0gcmVzX3Bvb2wtPm1heF9jb3VudCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVzb3VyY2UsIG5leHQsICZyZXNfcG9vbC0+ZnJlZV9saXN0LCBub2RlKSB7CisJCWZyZWVfY291bnQrKzsKKwkJV0FSTl9PTihyZXNvdXJjZS0+dHlwZSAhPSByZXNfcG9vbC0+dHlwZSk7CisJCVdBUk5fT04ocmVzb3VyY2UtPnBhcmVudF9wb29sICE9IHJlc19wb29sKTsKKwkJZGV2bV9rZnJlZSgmbWNfYnVzX2Rldi0+ZGV2LCByZXNvdXJjZSk7CisJfQorCisJV0FSTl9PTihmcmVlX2NvdW50ICE9IHJlc19wb29sLT5mcmVlX2NvdW50KTsKK30KKwordm9pZCBmc2xfbWNfY2xlYW51cF9hbGxfcmVzb3VyY2VfcG9vbHMoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYpCit7CisJaW50IHBvb2xfdHlwZTsKKworCWZvciAocG9vbF90eXBlID0gMDsgcG9vbF90eXBlIDwgRlNMX01DX05VTV9QT09MX1RZUEVTOyBwb29sX3R5cGUrKykKKwkJZnNsX21jX2NsZWFudXBfcmVzb3VyY2VfcG9vbChtY19idXNfZGV2LCBwb29sX3R5cGUpOworfQorCisvKioKKyAqIGZzbF9tY19hbGxvY2F0b3JfcHJvYmUgLSBjYWxsYmFjayBpbnZva2VkIHdoZW4gYW4gYWxsb2NhdGFibGUgZGV2aWNlIGlzCisgKiBiZWluZyBhZGRlZCB0byB0aGUgc3lzdGVtCisgKi8KK3N0YXRpYyBpbnQgZnNsX21jX2FsbG9jYXRvcl9wcm9iZShzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2KQoreworCWVudW0gZnNsX21jX3Bvb2xfdHlwZSBwb29sX3R5cGU7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXY7CisJc3RydWN0IGZzbF9tY19idXMgKm1jX2J1czsKKwlpbnQgZXJyb3I7CisKKwlpZiAoV0FSTl9PTighRlNMX01DX0lTX0FMTE9DQVRBQkxFKG1jX2Rldi0+b2JqX2Rlc2MudHlwZSkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1jX2J1c19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKG1jX2Rldi0+ZGV2LnBhcmVudCk7CisJaWYgKFdBUk5fT04oIWRldl9pc19mc2xfbWMoJm1jX2J1c19kZXYtPmRldikpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1jX2J1cyA9IHRvX2ZzbF9tY19idXMobWNfYnVzX2Rldik7CisJZXJyb3IgPSBvYmplY3RfdHlwZV90b19wb29sX3R5cGUobWNfZGV2LT5vYmpfZGVzYy50eXBlLCAmcG9vbF90eXBlKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKKwllcnJvciA9IGZzbF9tY19yZXNvdXJjZV9wb29sX2FkZF9kZXZpY2UobWNfYnVzLCBwb29sX3R5cGUsIG1jX2Rldik7CisJaWYgKGVycm9yIDwgMCkKKwkJcmV0dXJuIGVycm9yOworCisJZGV2X2RiZygmbWNfZGV2LT5kZXYsCisJCSJBbGxvY2F0YWJsZSBNQyBvYmplY3QgZGV2aWNlIGJvdW5kIHRvIGZzbF9tY19hbGxvY2F0b3IgZHJpdmVyIik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZnNsX21jX2FsbG9jYXRvcl9yZW1vdmUgLSBjYWxsYmFjayBpbnZva2VkIHdoZW4gYW4gYWxsb2NhdGFibGUgZGV2aWNlIGlzCisgKiBiZWluZyByZW1vdmVkIGZyb20gdGhlIHN5c3RlbQorICovCitzdGF0aWMgaW50IGZzbF9tY19hbGxvY2F0b3JfcmVtb3ZlKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYpCit7CisJaW50IGVycm9yOworCisJaWYgKFdBUk5fT04oIUZTTF9NQ19JU19BTExPQ0FUQUJMRShtY19kZXYtPm9ial9kZXNjLnR5cGUpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobWNfZGV2LT5yZXNvdXJjZSkgeworCQllcnJvciA9IGZzbF9tY19yZXNvdXJjZV9wb29sX3JlbW92ZV9kZXZpY2UobWNfZGV2KTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCXJldHVybiBlcnJvcjsKKwl9CisKKwlkZXZfZGJnKCZtY19kZXYtPmRldiwKKwkJIkFsbG9jYXRhYmxlIE1DIG9iamVjdCBkZXZpY2UgdW5ib3VuZCBmcm9tIGZzbF9tY19hbGxvY2F0b3IgZHJpdmVyIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZnNsX21jX2RldmljZV9pZCBtYXRjaF9pZF90YWJsZVtdID0geworCXsKKwkgLnZlbmRvciA9IEZTTF9NQ19WRU5ET1JfRlJFRVNDQUxFLAorCSAub2JqX3R5cGUgPSAiZHBicCIsCisJfSwKKwl7CisJIC52ZW5kb3IgPSBGU0xfTUNfVkVORE9SX0ZSRUVTQ0FMRSwKKwkgLm9ial90eXBlID0gImRwbWNwIiwKKwl9LAorCXsKKwkgLnZlbmRvciA9IEZTTF9NQ19WRU5ET1JfRlJFRVNDQUxFLAorCSAub2JqX3R5cGUgPSAiZHBjb24iLAorCX0sCisJey52ZW5kb3IgPSAweDB9LAorfTsKKworc3RhdGljIHN0cnVjdCBmc2xfbWNfZHJpdmVyIGZzbF9tY19hbGxvY2F0b3JfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gImZzbF9tY19hbGxvY2F0b3IiLAorCQkgICAucG0gPSBOVUxMLAorCQkgICB9LAorCS5tYXRjaF9pZF90YWJsZSA9IG1hdGNoX2lkX3RhYmxlLAorCS5wcm9iZSA9IGZzbF9tY19hbGxvY2F0b3JfcHJvYmUsCisJLnJlbW92ZSA9IGZzbF9tY19hbGxvY2F0b3JfcmVtb3ZlLAorfTsKKworaW50IF9faW5pdCBmc2xfbWNfYWxsb2NhdG9yX2RyaXZlcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGZzbF9tY19kcml2ZXJfcmVnaXN0ZXIoJmZzbF9tY19hbGxvY2F0b3JfZHJpdmVyKTsKK30KKwordm9pZCBmc2xfbWNfYWxsb2NhdG9yX2RyaXZlcl9leGl0KHZvaWQpCit7CisJZnNsX21jX2RyaXZlcl91bnJlZ2lzdGVyKCZmc2xfbWNfYWxsb2NhdG9yX2RyaXZlcik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9mc2wtbWMtYnVzLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9mc2wtbWMtYnVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRmNjRiNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2ZzbC1tYy1idXMuYwpAQCAtMCwwICsxLDkyMCBAQAorLyoKKyAqIEZyZWVzY2FsZSBNYW5hZ2VtZW50IENvbXBsZXggKE1DKSBidXMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBBdXRob3I6IEdlcm1hbiBSaXZlcmEgPEdlcm1hbi5SaXZlcmFAZnJlZXNjYWxlLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L21zaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1idXMuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2RwbW5nLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1zeXMuaCIKKworI2luY2x1ZGUgImZzbC1tYy1wcml2YXRlLmgiCisjaW5jbHVkZSAiZHByYy1jbWQuaCIKKworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICptY19kZXZfY2FjaGU7CisKKy8qKgorICogRGVmYXVsdCBETUEgbWFzayBmb3IgZGV2aWNlcyBvbiBhIGZzbC1tYyBidXMKKyAqLworI2RlZmluZSBGU0xfTUNfREVGQVVMVF9ETUFfTUFTSwkofjBVTEwpCisKKy8qKgorICogc3RydWN0IGZzbF9tYyAtIFByaXZhdGUgZGF0YSBvZiBhICJmc2wscW9yaXEtbWMiIHBsYXRmb3JtIGRldmljZQorICogQHJvb3RfbWNfYnVzX2RldjogTUMgb2JqZWN0IGRldmljZSByZXByZXNlbnRpbmcgdGhlIHJvb3QgRFBSQworICogQG51bV90cmFuc2xhdGlvbl9yYW5nZXM6IG51bWJlciBvZiBlbnRyaWVzIGluIGFkZHJfdHJhbnNsYXRpb25fcmFuZ2VzCisgKiBAdHJhbnNsYXRpb25fcmFuZ2VzOiBhcnJheSBvZiBidXMgdG8gc3lzdGVtIGFkZHJlc3MgdHJhbnNsYXRpb24gcmFuZ2VzCisgKi8KK3N0cnVjdCBmc2xfbWMgeworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICpyb290X21jX2J1c19kZXY7CisJdTggbnVtX3RyYW5zbGF0aW9uX3JhbmdlczsKKwlzdHJ1Y3QgZnNsX21jX2FkZHJfdHJhbnNsYXRpb25fcmFuZ2UgKnRyYW5zbGF0aW9uX3JhbmdlczsKK307CisKKy8qKgorICogc3RydWN0IGZzbF9tY19hZGRyX3RyYW5zbGF0aW9uX3JhbmdlIC0gYnVzIHRvIHN5c3RlbSBhZGRyZXNzIHRyYW5zbGF0aW9uCisgKiByYW5nZQorICogQG1jX3JlZ2lvbl90eXBlOiBUeXBlIG9mIE1DIHJlZ2lvbiBmb3IgdGhlIHJhbmdlIGJlaW5nIHRyYW5zbGF0ZWQKKyAqIEBzdGFydF9tY19vZmZzZXQ6IFN0YXJ0IE1DIG9mZnNldCBvZiB0aGUgcmFuZ2UgYmVpbmcgdHJhbnNsYXRlZAorICogQGVuZF9tY19vZmZzZXQ6IE1DIG9mZnNldCBvZiB0aGUgZmlyc3QgYnl0ZSBhZnRlciB0aGUgcmFuZ2UgKGxhc3QgTUMKKyAqIG9mZnNldCBvZiB0aGUgcmFuZ2UgaXMgZW5kX21jX29mZnNldCAtIDEpCisgKiBAc3RhcnRfcGh5c19hZGRyOiBzeXN0ZW0gcGh5c2ljYWwgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvIHN0YXJ0X21jX2FkZHIKKyAqLworc3RydWN0IGZzbF9tY19hZGRyX3RyYW5zbGF0aW9uX3JhbmdlIHsKKwllbnVtIGRwcmNfcmVnaW9uX3R5cGUgbWNfcmVnaW9uX3R5cGU7CisJdTY0IHN0YXJ0X21jX29mZnNldDsKKwl1NjQgZW5kX21jX29mZnNldDsKKwlwaHlzX2FkZHJfdCBzdGFydF9waHlzX2FkZHI7Cit9OworCisvKioKKyAqIGZzbF9tY19idXNfbWF0Y2ggLSBkZXZpY2UgdG8gZHJpdmVyIG1hdGNoaW5nIGNhbGxiYWNrCisgKiBAZGV2OiB0aGUgTUMgb2JqZWN0IGRldmljZSBzdHJ1Y3R1cmUgdG8gbWF0Y2ggYWdhaW5zdAorICogQGRydjogdGhlIGRldmljZSBkcml2ZXIgdG8gc2VhcmNoIGZvciBtYXRjaGluZyBNQyBvYmplY3QgZGV2aWNlIGlkCisgKiBzdHJ1Y3R1cmVzCisgKgorICogUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IGZzbF9tY19idXNfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCWNvbnN0IHN0cnVjdCBmc2xfbWNfZGV2aWNlX2lkICppZDsKKwlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2ID0gdG9fZnNsX21jX2RldmljZShkZXYpOworCXN0cnVjdCBmc2xfbWNfZHJpdmVyICptY19kcnYgPSB0b19mc2xfbWNfZHJpdmVyKGRydik7CisJYm9vbCBmb3VuZCA9IGZhbHNlOworCisJaWYgKFdBUk5fT04oIWZzbF9tY19idXNfZXhpc3RzKCkpKQorCQlnb3RvIG91dDsKKworCWlmICghbWNfZHJ2LT5tYXRjaF9pZF90YWJsZSkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIElmIHRoZSBvYmplY3QgaXMgbm90ICdwbHVnZ2VkJyBkb24ndCBtYXRjaC4KKwkgKiBPbmx5IGV4Y2VwdGlvbiBpcyB0aGUgcm9vdCBEUFJDLCB3aGljaCBpcyBhIHNwZWNpYWwgY2FzZS4KKwkgKi8KKwlpZiAoKG1jX2Rldi0+b2JqX2Rlc2Muc3RhdGUgJiBEUFJDX09CSl9TVEFURV9QTFVHR0VEKSA9PSAwICYmCisJICAgICFmc2xfbWNfaXNfcm9vdF9kcHJjKCZtY19kZXYtPmRldikpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBUcmF2ZXJzZSB0aGUgbWF0Y2hfaWQgdGFibGUgb2YgdGhlIGdpdmVuIGRyaXZlciwgdHJ5aW5nIHRvIGZpbmQKKwkgKiBhIG1hdGNoaW5nIGZvciB0aGUgZ2l2ZW4gTUMgb2JqZWN0IGRldmljZS4KKwkgKi8KKwlmb3IgKGlkID0gbWNfZHJ2LT5tYXRjaF9pZF90YWJsZTsgaWQtPnZlbmRvciAhPSAweDA7IGlkKyspIHsKKwkJaWYgKGlkLT52ZW5kb3IgPT0gbWNfZGV2LT5vYmpfZGVzYy52ZW5kb3IgJiYKKwkJICAgIHN0cmNtcChpZC0+b2JqX3R5cGUsIG1jX2Rldi0+b2JqX2Rlc2MudHlwZSkgPT0gMCkgeworCQkJZm91bmQgPSB0cnVlOworCisJCQlicmVhazsKKwkJfQorCX0KKworb3V0OgorCWRldl9kYmcoZGV2LCAiJXNtYXRjaGVkXG4iLCBmb3VuZCA/ICIiIDogIm5vdCAiKTsKKwlyZXR1cm4gZm91bmQ7Cit9CisKKy8qKgorICogZnNsX21jX2J1c191ZXZlbnQgLSBjYWxsYmFjayBpbnZva2VkIHdoZW4gYSBkZXZpY2UgaXMgYWRkZWQKKyAqLworc3RhdGljIGludCBmc2xfbWNfYnVzX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudikKK3sKKwlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2ID0gdG9fZnNsX21jX2RldmljZShkZXYpOworCisJaWYgKGFkZF91ZXZlbnRfdmFyKGVudiwgIk1PREFMSUFTPWZzbC1tYzp2JTA4WGQlcyIsCisJCQkgICBtY19kZXYtPm9ial9kZXNjLnZlbmRvciwKKwkJCSAgIG1jX2Rldi0+b2JqX2Rlc2MudHlwZSkpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1vZGFsaWFzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKGRldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICJmc2wtbWM6diUwOFhkJXNcbiIsIG1jX2Rldi0+b2JqX2Rlc2MudmVuZG9yLAorCQkgICAgICAgbWNfZGV2LT5vYmpfZGVzYy50eXBlKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhtb2RhbGlhcyk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpmc2xfbWNfZGV2X2F0dHJzW10gPSB7CisJJmRldl9hdHRyX21vZGFsaWFzLmF0dHIsCisJTlVMTCwKK307CisKK0FUVFJJQlVURV9HUk9VUFMoZnNsX21jX2Rldik7CisKK3N0cnVjdCBidXNfdHlwZSBmc2xfbWNfYnVzX3R5cGUgPSB7CisJLm5hbWUgPSAiZnNsLW1jIiwKKwkubWF0Y2ggPSBmc2xfbWNfYnVzX21hdGNoLAorCS51ZXZlbnQgPSBmc2xfbWNfYnVzX3VldmVudCwKKwkuZGV2X2dyb3VwcyA9IGZzbF9tY19kZXZfZ3JvdXBzLAorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19idXNfdHlwZSk7CisKK3N0YXRpYyBhdG9taWNfdCByb290X2RwcmNfY291bnQgPSBBVE9NSUNfSU5JVCgwKTsKKworc3RhdGljIGludCBmc2xfbWNfZHJpdmVyX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZnNsX21jX2RyaXZlciAqbWNfZHJ2OworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKGRldik7CisJaW50IGVycm9yOworCisJaWYgKFdBUk5fT04oIWRldi0+ZHJpdmVyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltY19kcnYgPSB0b19mc2xfbWNfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlpZiAoV0FSTl9PTighbWNfZHJ2LT5wcm9iZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyb3IgPSBtY19kcnYtPnByb2JlKG1jX2Rldik7CisJaWYgKGVycm9yIDwgMCkgeworCQlkZXZfZXJyKGRldiwgIk1DIG9iamVjdCBkZXZpY2UgcHJvYmUgY2FsbGJhY2sgZmFpbGVkOiAlZFxuIiwKKwkJCWVycm9yKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZzbF9tY19kcml2ZXJfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZnNsX21jX2RyaXZlciAqbWNfZHJ2ID0gdG9fZnNsX21jX2RyaXZlcihkZXYtPmRyaXZlcik7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldiA9IHRvX2ZzbF9tY19kZXZpY2UoZGV2KTsKKwlpbnQgZXJyb3I7CisKKwlpZiAoV0FSTl9PTighZGV2LT5kcml2ZXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVycm9yID0gbWNfZHJ2LT5yZW1vdmUobWNfZGV2KTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCWRldl9lcnIoZGV2LAorCQkJIk1DIG9iamVjdCBkZXZpY2UgcmVtb3ZlIGNhbGxiYWNrIGZhaWxlZDogJWRcbiIsCisJCQllcnJvcik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnNsX21jX2RyaXZlcl9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZzbF9tY19kcml2ZXIgKm1jX2RydiA9IHRvX2ZzbF9tY19kcml2ZXIoZGV2LT5kcml2ZXIpOworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKGRldik7CisKKwltY19kcnYtPnNodXRkb3duKG1jX2Rldik7Cit9CisKKy8qKgorICogX19mc2xfbWNfZHJpdmVyX3JlZ2lzdGVyIC0gcmVnaXN0ZXJzIGEgY2hpbGQgZGV2aWNlIGRyaXZlciB3aXRoIHRoZQorICogTUMgYnVzCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBpbXBsaWNpdGx5IGludm9rZWQgZnJvbSB0aGUgcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIG9mCisgKiBmc2xfbWMgZGV2aWNlIGRyaXZlcnMsIHdoaWNoIGlzIGdlbmVyYXRlZCBieSB0aGUKKyAqIG1vZHVsZV9mc2xfbWNfZHJpdmVyKCkgbWFjcm8uCisgKi8KK2ludCBfX2ZzbF9tY19kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IGZzbF9tY19kcml2ZXIgKm1jX2RyaXZlciwKKwkJCSAgICAgc3RydWN0IG1vZHVsZSAqb3duZXIpCit7CisJaW50IGVycm9yOworCisJbWNfZHJpdmVyLT5kcml2ZXIub3duZXIgPSBvd25lcjsKKwltY19kcml2ZXItPmRyaXZlci5idXMgPSAmZnNsX21jX2J1c190eXBlOworCisJaWYgKG1jX2RyaXZlci0+cHJvYmUpCisJCW1jX2RyaXZlci0+ZHJpdmVyLnByb2JlID0gZnNsX21jX2RyaXZlcl9wcm9iZTsKKworCWlmIChtY19kcml2ZXItPnJlbW92ZSkKKwkJbWNfZHJpdmVyLT5kcml2ZXIucmVtb3ZlID0gZnNsX21jX2RyaXZlcl9yZW1vdmU7CisKKwlpZiAobWNfZHJpdmVyLT5zaHV0ZG93bikKKwkJbWNfZHJpdmVyLT5kcml2ZXIuc2h1dGRvd24gPSBmc2xfbWNfZHJpdmVyX3NodXRkb3duOworCisJZXJyb3IgPSBkcml2ZXJfcmVnaXN0ZXIoJm1jX2RyaXZlci0+ZHJpdmVyKTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCXByX2VycigiZHJpdmVyX3JlZ2lzdGVyKCkgZmFpbGVkIGZvciAlczogJWRcbiIsCisJCSAgICAgICBtY19kcml2ZXItPmRyaXZlci5uYW1lLCBlcnJvcik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlwcl9pbmZvKCJNQyBvYmplY3QgZGV2aWNlIGRyaXZlciAlcyByZWdpc3RlcmVkXG4iLAorCQltY19kcml2ZXItPmRyaXZlci5uYW1lKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fZnNsX21jX2RyaXZlcl9yZWdpc3Rlcik7CisKKy8qKgorICogZnNsX21jX2RyaXZlcl91bnJlZ2lzdGVyIC0gdW5yZWdpc3RlcnMgYSBkZXZpY2UgZHJpdmVyIGZyb20gdGhlCisgKiBNQyBidXMKKyAqLwordm9pZCBmc2xfbWNfZHJpdmVyX3VucmVnaXN0ZXIoc3RydWN0IGZzbF9tY19kcml2ZXIgKm1jX2RyaXZlcikKK3sKKwlkcml2ZXJfdW5yZWdpc3RlcigmbWNfZHJpdmVyLT5kcml2ZXIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX2RyaXZlcl91bnJlZ2lzdGVyKTsKKworLyoqCisgKiBmc2xfbWNfYnVzX2V4aXN0cyAtIGNoZWNrIGlmIGEgcm9vdCBkcHJjIGV4aXN0cworICovCitib29sIGZzbF9tY19idXNfZXhpc3RzKHZvaWQpCit7CisJcmV0dXJuIGF0b21pY19yZWFkKCZyb290X2RwcmNfY291bnQpID4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19idXNfZXhpc3RzKTsKKworLyoqCisgKiBmc2xfbWNfZ2V0X3Jvb3RfZHByYyAtIGZ1bmN0aW9uIHRvIHRyYXZlcnNlIHRvIHRoZSByb290IGRwcmMKKyAqLwordm9pZCBmc2xfbWNfZ2V0X3Jvb3RfZHByYyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBkZXZpY2UgKipyb290X2RwcmNfZGV2KQoreworCWlmIChXQVJOX09OKCFkZXYpKSB7CisJCSpyb290X2RwcmNfZGV2ID0gTlVMTDsKKwl9IGVsc2UgaWYgKFdBUk5fT04oIWRldl9pc19mc2xfbWMoZGV2KSkpIHsKKwkJKnJvb3RfZHByY19kZXYgPSBOVUxMOworCX0gZWxzZSB7CisJCSpyb290X2RwcmNfZGV2ID0gZGV2OworCQl3aGlsZSAoZGV2X2lzX2ZzbF9tYygoKnJvb3RfZHByY19kZXYpLT5wYXJlbnQpKQorCQkJKnJvb3RfZHByY19kZXYgPSAoKnJvb3RfZHByY19kZXYpLT5wYXJlbnQ7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX2dldF9yb290X2RwcmMpOworCitzdGF0aWMgaW50IGdldF9kcHJjX2F0dHIoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCQkgaW50IGNvbnRhaW5lcl9pZCwgc3RydWN0IGRwcmNfYXR0cmlidXRlcyAqYXR0cikKK3sKKwl1MTYgZHByY19oYW5kbGU7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBkcHJjX29wZW4obWNfaW8sIDAsIGNvbnRhaW5lcl9pZCwgJmRwcmNfaGFuZGxlKTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCWRldl9lcnIobWNfaW8tPmRldiwgImRwcmNfb3BlbigpIGZhaWxlZDogJWRcbiIsIGVycm9yKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCW1lbXNldChhdHRyLCAwLCBzaXplb2Yoc3RydWN0IGRwcmNfYXR0cmlidXRlcykpOworCWVycm9yID0gZHByY19nZXRfYXR0cmlidXRlcyhtY19pbywgMCwgZHByY19oYW5kbGUsIGF0dHIpOworCWlmIChlcnJvciA8IDApIHsKKwkJZGV2X2VycihtY19pby0+ZGV2LCAiZHByY19nZXRfYXR0cmlidXRlcygpIGZhaWxlZDogJWRcbiIsCisJCQllcnJvcik7CisJCWdvdG8gY29tbW9uX2NsZWFudXA7CisJfQorCisJZXJyb3IgPSAwOworCitjb21tb25fY2xlYW51cDoKKwkodm9pZClkcHJjX2Nsb3NlKG1jX2lvLCAwLCBkcHJjX2hhbmRsZSk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IGdldF9kcHJjX2ljaWQoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCQkgaW50IGNvbnRhaW5lcl9pZCwgdTE2ICppY2lkKQoreworCXN0cnVjdCBkcHJjX2F0dHJpYnV0ZXMgYXR0cjsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGdldF9kcHJjX2F0dHIobWNfaW8sIGNvbnRhaW5lcl9pZCwgJmF0dHIpOworCWlmIChlcnJvciA9PSAwKQorCQkqaWNpZCA9IGF0dHIuaWNpZDsKKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBnZXRfZHByY192ZXJzaW9uKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkJICAgIGludCBjb250YWluZXJfaWQsIHUxNiAqbWFqb3IsIHUxNiAqbWlub3IpCit7CisJc3RydWN0IGRwcmNfYXR0cmlidXRlcyBhdHRyOworCWludCBlcnJvcjsKKworCWVycm9yID0gZ2V0X2RwcmNfYXR0cihtY19pbywgY29udGFpbmVyX2lkLCAmYXR0cik7CisJaWYgKGVycm9yID09IDApIHsKKwkJKm1ham9yID0gYXR0ci52ZXJzaW9uLm1ham9yOworCQkqbWlub3IgPSBhdHRyLnZlcnNpb24ubWlub3I7CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IHRyYW5zbGF0ZV9tY19hZGRyKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYsCisJCQkgICAgIGVudW0gZHByY19yZWdpb25fdHlwZSBtY19yZWdpb25fdHlwZSwKKwkJCSAgICAgdTY0IG1jX29mZnNldCwgcGh5c19hZGRyX3QgKnBoeXNfYWRkcikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZGV2aWNlICpyb290X2RwcmNfZGV2OworCXN0cnVjdCBmc2xfbWMgKm1jOworCisJZnNsX21jX2dldF9yb290X2RwcmMoJm1jX2Rldi0+ZGV2LCAmcm9vdF9kcHJjX2Rldik7CisJaWYgKFdBUk5fT04oIXJvb3RfZHByY19kZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwltYyA9IGRldl9nZXRfZHJ2ZGF0YShyb290X2RwcmNfZGV2LT5wYXJlbnQpOworCisJaWYgKG1jLT5udW1fdHJhbnNsYXRpb25fcmFuZ2VzID09IDApIHsKKwkJLyoKKwkJICogRG8gaWRlbnRpdHkgbWFwcGluZzoKKwkJICovCisJCSpwaHlzX2FkZHIgPSBtY19vZmZzZXQ7CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtYy0+bnVtX3RyYW5zbGF0aW9uX3JhbmdlczsgaSsrKSB7CisJCXN0cnVjdCBmc2xfbWNfYWRkcl90cmFuc2xhdGlvbl9yYW5nZSAqcmFuZ2UgPQorCQkJJm1jLT50cmFuc2xhdGlvbl9yYW5nZXNbaV07CisKKwkJaWYgKG1jX3JlZ2lvbl90eXBlID09IHJhbmdlLT5tY19yZWdpb25fdHlwZSAmJgorCQkgICAgbWNfb2Zmc2V0ID49IHJhbmdlLT5zdGFydF9tY19vZmZzZXQgJiYKKwkJICAgIG1jX29mZnNldCA8IHJhbmdlLT5lbmRfbWNfb2Zmc2V0KSB7CisJCQkqcGh5c19hZGRyID0gcmFuZ2UtPnN0YXJ0X3BoeXNfYWRkciArCisJCQkJICAgICAobWNfb2Zmc2V0IC0gcmFuZ2UtPnN0YXJ0X21jX29mZnNldCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAtRUZBVUxUOworfQorCitzdGF0aWMgaW50IGZzbF9tY19kZXZpY2VfZ2V0X21taW9fcmVnaW9ucyhzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2LAorCQkJCQkgIHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2KQoreworCWludCBpOworCWludCBlcnJvcjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlZ2lvbnM7CisJc3RydWN0IGRwcmNfb2JqX2Rlc2MgKm9ial9kZXNjID0gJm1jX2Rldi0+b2JqX2Rlc2M7CisJc3RydWN0IGRldmljZSAqcGFyZW50X2RldiA9IG1jX2Rldi0+ZGV2LnBhcmVudDsKKwllbnVtIGRwcmNfcmVnaW9uX3R5cGUgbWNfcmVnaW9uX3R5cGU7CisKKwlpZiAoc3RyY21wKG9ial9kZXNjLT50eXBlLCAiZHByYyIpID09IDAgfHwKKwkgICAgc3RyY21wKG9ial9kZXNjLT50eXBlLCAiZHBtY3AiKSA9PSAwKSB7CisJCW1jX3JlZ2lvbl90eXBlID0gRFBSQ19SRUdJT05fVFlQRV9NQ19QT1JUQUw7CisJfSBlbHNlIGlmIChzdHJjbXAob2JqX2Rlc2MtPnR5cGUsICJkcGlvIikgPT0gMCkgeworCQltY19yZWdpb25fdHlwZSA9IERQUkNfUkVHSU9OX1RZUEVfUUJNQU5fUE9SVEFMOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBoYXZlIGJlZW4gY2FsbGVkIGZvciB0aGlzIE1DIG9iamVjdAorCQkgKiB0eXBlLCBhcyB0aGlzIG9iamVjdCB0eXBlIGlzIG5vdCBzdXBwb3NlZCB0byBoYXZlIE1NSU8KKwkJICogcmVnaW9ucworCQkgKi8KKwkJV0FSTl9PTih0cnVlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVnaW9ucyA9IGttYWxsb2NfYXJyYXkob2JqX2Rlc2MtPnJlZ2lvbl9jb3VudCwKKwkJCQlzaXplb2YocmVnaW9uc1swXSksIEdGUF9LRVJORUwpOworCWlmICghcmVnaW9ucykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgb2JqX2Rlc2MtPnJlZ2lvbl9jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBkcHJjX3JlZ2lvbl9kZXNjIHJlZ2lvbl9kZXNjOworCisJCWVycm9yID0gZHByY19nZXRfb2JqX3JlZ2lvbihtY19idXNfZGV2LT5tY19pbywKKwkJCQkJICAgIDAsCisJCQkJCSAgICBtY19idXNfZGV2LT5tY19oYW5kbGUsCisJCQkJCSAgICBvYmpfZGVzYy0+dHlwZSwKKwkJCQkJICAgIG9ial9kZXNjLT5pZCwgaSwgJnJlZ2lvbl9kZXNjKTsKKwkJaWYgKGVycm9yIDwgMCkgeworCQkJZGV2X2VycihwYXJlbnRfZGV2LAorCQkJCSJkcHJjX2dldF9vYmpfcmVnaW9uKCkgZmFpbGVkOiAlZFxuIiwgZXJyb3IpOworCQkJZ290byBlcnJvcl9jbGVhbnVwX3JlZ2lvbnM7CisJCX0KKworCQlXQVJOX09OKHJlZ2lvbl9kZXNjLnNpemUgPT0gMCk7CisJCWVycm9yID0gdHJhbnNsYXRlX21jX2FkZHIobWNfZGV2LCBtY19yZWdpb25fdHlwZSwKKwkJCQkJICByZWdpb25fZGVzYy5iYXNlX29mZnNldCwKKwkJCQkJICAmcmVnaW9uc1tpXS5zdGFydCk7CisJCWlmIChlcnJvciA8IDApIHsKKwkJCWRldl9lcnIocGFyZW50X2RldiwKKwkJCQkiSW52YWxpZCBNQyBvZmZzZXQ6ICUjeCAoZm9yICVzLiVkXCdzIHJlZ2lvbiAlZClcbiIsCisJCQkJcmVnaW9uX2Rlc2MuYmFzZV9vZmZzZXQsCisJCQkJb2JqX2Rlc2MtPnR5cGUsIG9ial9kZXNjLT5pZCwgaSk7CisJCQlnb3RvIGVycm9yX2NsZWFudXBfcmVnaW9uczsKKwkJfQorCisJCXJlZ2lvbnNbaV0uZW5kID0gcmVnaW9uc1tpXS5zdGFydCArIHJlZ2lvbl9kZXNjLnNpemUgLSAxOworCQlyZWdpb25zW2ldLm5hbWUgPSAiZnNsLW1jIG9iamVjdCBNTUlPIHJlZ2lvbiI7CisJCXJlZ2lvbnNbaV0uZmxhZ3MgPSBJT1JFU09VUkNFX0lPOworCQlpZiAocmVnaW9uX2Rlc2MuZmxhZ3MgJiBEUFJDX1JFR0lPTl9DQUNIRUFCTEUpCisJCQlyZWdpb25zW2ldLmZsYWdzIHw9IElPUkVTT1VSQ0VfQ0FDSEVBQkxFOworCX0KKworCW1jX2Rldi0+cmVnaW9ucyA9IHJlZ2lvbnM7CisJcmV0dXJuIDA7CisKK2Vycm9yX2NsZWFudXBfcmVnaW9uczoKKwlrZnJlZShyZWdpb25zKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogZnNsX21jX2lzX3Jvb3RfZHByYyAtIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIGEgZ2l2ZW4gZGV2aWNlIGlzIGEgcm9vdCBkcHJjCisgKi8KK2Jvb2wgZnNsX21jX2lzX3Jvb3RfZHByYyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldmljZSAqcm9vdF9kcHJjX2RldjsKKworCWZzbF9tY19nZXRfcm9vdF9kcHJjKGRldiwgJnJvb3RfZHByY19kZXYpOworCWlmICghcm9vdF9kcHJjX2RldikKKwkJcmV0dXJuIGZhbHNlOworCXJldHVybiBkZXYgPT0gcm9vdF9kcHJjX2RldjsKK30KKworLyoqCisgKiBBZGQgYSBuZXdseSBkaXNjb3ZlcmVkIE1DIG9iamVjdCBkZXZpY2UgdG8gYmUgdmlzaWJsZSBpbiBMaW51eAorICovCitpbnQgZnNsX21jX2RldmljZV9hZGQoc3RydWN0IGRwcmNfb2JqX2Rlc2MgKm9ial9kZXNjLAorCQkgICAgICBzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJICAgICAgc3RydWN0IGRldmljZSAqcGFyZW50X2RldiwKKwkJICAgICAgc3RydWN0IGZzbF9tY19kZXZpY2UgKipuZXdfbWNfZGV2KQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzID0gTlVMTDsKKwlzdHJ1Y3QgZnNsX21jX2RldmljZSAqcGFyZW50X21jX2RldjsKKworCWlmIChkZXZfaXNfZnNsX21jKHBhcmVudF9kZXYpKQorCQlwYXJlbnRfbWNfZGV2ID0gdG9fZnNsX21jX2RldmljZShwYXJlbnRfZGV2KTsKKwllbHNlCisJCXBhcmVudF9tY19kZXYgPSBOVUxMOworCisJaWYgKHN0cmNtcChvYmpfZGVzYy0+dHlwZSwgImRwcmMiKSA9PSAwKSB7CisJCS8qCisJCSAqIEFsbG9jYXRlIGFuIE1DIGJ1cyBkZXZpY2Ugb2JqZWN0OgorCQkgKi8KKwkJbWNfYnVzID0gZGV2bV9remFsbG9jKHBhcmVudF9kZXYsIHNpemVvZigqbWNfYnVzKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghbWNfYnVzKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJbWNfZGV2ID0gJm1jX2J1cy0+bWNfZGV2OworCX0gZWxzZSB7CisJCS8qCisJCSAqIEFsbG9jYXRlIGEgcmVndWxhciBmc2xfbWNfZGV2aWNlIG9iamVjdDoKKwkJICovCisJCW1jX2RldiA9IGttZW1fY2FjaGVfemFsbG9jKG1jX2Rldl9jYWNoZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghbWNfZGV2KQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWNfZGV2LT5vYmpfZGVzYyA9ICpvYmpfZGVzYzsKKwltY19kZXYtPm1jX2lvID0gbWNfaW87CisJZGV2aWNlX2luaXRpYWxpemUoJm1jX2Rldi0+ZGV2KTsKKwltY19kZXYtPmRldi5wYXJlbnQgPSBwYXJlbnRfZGV2OworCW1jX2Rldi0+ZGV2LmJ1cyA9ICZmc2xfbWNfYnVzX3R5cGU7CisJZGV2X3NldF9uYW1lKCZtY19kZXYtPmRldiwgIiVzLiVkIiwgb2JqX2Rlc2MtPnR5cGUsIG9ial9kZXNjLT5pZCk7CisKKwlpZiAoc3RyY21wKG9ial9kZXNjLT50eXBlLCAiZHByYyIpID09IDApIHsKKwkJc3RydWN0IGZzbF9tY19pbyAqbWNfaW8yOworCisJCW1jX2Rldi0+ZmxhZ3MgfD0gRlNMX01DX0lTX0RQUkM7CisKKwkJLyoKKwkJICogVG8gZ2V0IHRoZSBEUFJDJ3MgSUNJRCwgd2UgbmVlZCB0byBvcGVuIHRoZSBEUFJDCisJCSAqIGluIGdldF9kcHJjX2ljaWQoKS4gRm9yIGNoaWxkIERQUkNzLCB3ZSBkbyBzbyB1c2luZyB0aGUKKwkJICogcGFyZW50IERQUkMncyBNQyBwb3J0YWwgaW5zdGVhZCBvZiB0aGUgY2hpbGQgRFBSQydzIE1DCisJCSAqIHBvcnRhbCwgaW4gY2FzZSB0aGUgY2hpbGQgRFBSQyBpcyBhbHJlYWR5IG9wZW5lZCB3aXRoCisJCSAqIGl0cyBvd24gcG9ydGFsIChlLmcuLCB0aGUgRFBSQyB1c2VkIGJ5IEFJT1ApLgorCQkgKgorCQkgKiBOT1RFOiBUaGVyZSBjYW5ub3QgYmUgbW9yZSB0aGFuIG9uZSBhY3RpdmUgb3BlbiBmb3IgYQorCQkgKiBnaXZlbiBNQyBvYmplY3QsIHVzaW5nIHRoZSBzYW1lIE1DIHBvcnRhbC4KKwkJICovCisJCWlmIChwYXJlbnRfbWNfZGV2KSB7CisJCQkvKgorCQkJICogZGV2aWNlIGJlaW5nIGFkZGVkIGlzIGEgY2hpbGQgRFBSQyBkZXZpY2UKKwkJCSAqLworCQkJbWNfaW8yID0gcGFyZW50X21jX2Rldi0+bWNfaW87CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogZGV2aWNlIGJlaW5nIGFkZGVkIGlzIHRoZSByb290IERQUkMgZGV2aWNlCisJCQkgKi8KKwkJCWlmIChXQVJOX09OKCFtY19pbykpIHsKKwkJCQllcnJvciA9IC1FSU5WQUw7CisJCQkJZ290byBlcnJvcl9jbGVhbnVwX2RldjsKKwkJCX0KKworCQkJbWNfaW8yID0gbWNfaW87CisKKwkJCWF0b21pY19pbmMoJnJvb3RfZHByY19jb3VudCk7CisJCX0KKworCQllcnJvciA9IGdldF9kcHJjX2ljaWQobWNfaW8yLCBvYmpfZGVzYy0+aWQsICZtY19kZXYtPmljaWQpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBlcnJvcl9jbGVhbnVwX2RldjsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBBIG5vbi1EUFJDIE1DIG9iamVjdCBkZXZpY2UgaGFzIHRvIGJlIGEgY2hpbGQgb2YgYW5vdGhlcgorCQkgKiBNQyBvYmplY3QgKHNwZWNpZmljYWxseSBhIERQUkMgb2JqZWN0KQorCQkgKi8KKwkJbWNfZGV2LT5pY2lkID0gcGFyZW50X21jX2Rldi0+aWNpZDsKKwkJbWNfZGV2LT5kbWFfbWFzayA9IEZTTF9NQ19ERUZBVUxUX0RNQV9NQVNLOworCQltY19kZXYtPmRldi5kbWFfbWFzayA9ICZtY19kZXYtPmRtYV9tYXNrOworCQlkZXZfc2V0X21zaV9kb21haW4oJm1jX2Rldi0+ZGV2LAorCQkJCSAgIGRldl9nZXRfbXNpX2RvbWFpbigmcGFyZW50X21jX2Rldi0+ZGV2KSk7CisJfQorCisJLyoKKwkgKiBHZXQgTU1JTyByZWdpb25zIGZvciB0aGUgZGV2aWNlIGZyb20gdGhlIE1DOgorCSAqCisJICogTk9URTogdGhlIHJvb3QgRFBSQyBpcyBhIHNwZWNpYWwgY2FzZSBhcyBpdHMgTU1JTyByZWdpb24gaXMKKwkgKiBvYnRhaW5lZCBmcm9tIHRoZSBkZXZpY2UgdHJlZQorCSAqLworCWlmIChwYXJlbnRfbWNfZGV2ICYmIG9ial9kZXNjLT5yZWdpb25fY291bnQgIT0gMCkgeworCQllcnJvciA9IGZzbF9tY19kZXZpY2VfZ2V0X21taW9fcmVnaW9ucyhtY19kZXYsCisJCQkJCQkgICAgICAgcGFyZW50X21jX2Rldik7CisJCWlmIChlcnJvciA8IDApCisJCQlnb3RvIGVycm9yX2NsZWFudXBfZGV2OworCX0KKworCS8qIE9iamVjdHMgYXJlIGNvaGVyZW50LCB1bmxlc3MgJ25vIHNoYXJlYWJpbGl0eScgZmxhZyBzZXQuICovCisJaWYgKCEob2JqX2Rlc2MtPmZsYWdzICYgRFBSQ19PQkpfRkxBR19OT19NRU1fU0hBUkVBQklMSVRZKSkKKwkJYXJjaF9zZXR1cF9kbWFfb3BzKCZtY19kZXYtPmRldiwgMCwgMCwgTlVMTCwgdHJ1ZSk7CisKKwkvKgorCSAqIFRoZSBkZXZpY2Utc3BlY2lmaWMgcHJvYmUgY2FsbGJhY2sgd2lsbCBnZXQgaW52b2tlZCBieSBkZXZpY2VfYWRkKCkKKwkgKi8KKwllcnJvciA9IGRldmljZV9hZGQoJm1jX2Rldi0+ZGV2KTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCWRldl9lcnIocGFyZW50X2RldiwKKwkJCSJkZXZpY2VfYWRkKCkgZmFpbGVkIGZvciBkZXZpY2UgJXM6ICVkXG4iLAorCQkJZGV2X25hbWUoJm1jX2Rldi0+ZGV2KSwgZXJyb3IpOworCQlnb3RvIGVycm9yX2NsZWFudXBfZGV2OworCX0KKworCSh2b2lkKWdldF9kZXZpY2UoJm1jX2Rldi0+ZGV2KTsKKwlkZXZfZGJnKHBhcmVudF9kZXYsICJBZGRlZCBNQyBvYmplY3QgZGV2aWNlICVzXG4iLAorCQlkZXZfbmFtZSgmbWNfZGV2LT5kZXYpKTsKKworCSpuZXdfbWNfZGV2ID0gbWNfZGV2OworCXJldHVybiAwOworCitlcnJvcl9jbGVhbnVwX2RldjoKKwlrZnJlZShtY19kZXYtPnJlZ2lvbnMpOworCWlmIChtY19idXMpCisJCWRldm1fa2ZyZWUocGFyZW50X2RldiwgbWNfYnVzKTsKKwllbHNlCisJCWttZW1fY2FjaGVfZnJlZShtY19kZXZfY2FjaGUsIG1jX2Rldik7CisKKwlyZXR1cm4gZXJyb3I7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfZGV2aWNlX2FkZCk7CisKKy8qKgorICogZnNsX21jX2RldmljZV9yZW1vdmUgLSBSZW1vdmUgYSBNQyBvYmplY3QgZGV2aWNlIGZyb20gYmVpbmcgdmlzaWJsZSB0bworICogTGludXgKKyAqCisgKiBAbWNfZGV2OiBQb2ludGVyIHRvIGEgTUMgb2JqZWN0IGRldmljZSBvYmplY3QKKyAqLwordm9pZCBmc2xfbWNfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2KQoreworCXN0cnVjdCBmc2xfbWNfYnVzICptY19idXMgPSBOVUxMOworCisJa2ZyZWUobWNfZGV2LT5yZWdpb25zKTsKKworCS8qCisJICogVGhlIGRldmljZS1zcGVjaWZpYyByZW1vdmUgY2FsbGJhY2sgd2lsbCBnZXQgaW52b2tlZCBieSBkZXZpY2VfZGVsKCkKKwkgKi8KKwlkZXZpY2VfZGVsKCZtY19kZXYtPmRldik7CisJcHV0X2RldmljZSgmbWNfZGV2LT5kZXYpOworCisJaWYgKHN0cmNtcChtY19kZXYtPm9ial9kZXNjLnR5cGUsICJkcHJjIikgPT0gMCkgeworCQltY19idXMgPSB0b19mc2xfbWNfYnVzKG1jX2Rldik7CisKKwkJaWYgKGZzbF9tY19pc19yb290X2RwcmMoJm1jX2Rldi0+ZGV2KSkgeworCQkJaWYgKGF0b21pY19yZWFkKCZyb290X2RwcmNfY291bnQpID4gMCkKKwkJCQlhdG9taWNfZGVjKCZyb290X2RwcmNfY291bnQpOworCQkJZWxzZQorCQkJCVdBUk5fT04oMSk7CisJCX0KKwl9CisKKwlpZiAobWNfYnVzKQorCQlkZXZtX2tmcmVlKG1jX2Rldi0+ZGV2LnBhcmVudCwgbWNfYnVzKTsKKwllbHNlCisJCWttZW1fY2FjaGVfZnJlZShtY19kZXZfY2FjaGUsIG1jX2Rldik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfZGV2aWNlX3JlbW92ZSk7CisKK3N0YXRpYyBpbnQgcGFyc2VfbWNfcmFuZ2VzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgIGludCAqcGFkZHJfY2VsbHMsCisJCQkgICBpbnQgKm1jX2FkZHJfY2VsbHMsCisJCQkgICBpbnQgKm1jX3NpemVfY2VsbHMsCisJCQkgICBjb25zdCBfX2JlMzIgKipyYW5nZXNfc3RhcnQsCisJCQkgICB1OCAqbnVtX3JhbmdlcykKK3sKKwljb25zdCBfX2JlMzIgKnByb3A7CisJaW50IHJhbmdlX3R1cGxlX2NlbGxfY291bnQ7CisJaW50IHJhbmdlc19sZW47CisJaW50IHR1cGxlX2xlbjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm1jX25vZGUgPSBkZXYtPm9mX25vZGU7CisKKwkqcmFuZ2VzX3N0YXJ0ID0gb2ZfZ2V0X3Byb3BlcnR5KG1jX25vZGUsICJyYW5nZXMiLCAmcmFuZ2VzX2xlbik7CisJaWYgKCEoKnJhbmdlc19zdGFydCkgfHwgIXJhbmdlc19sZW4pIHsKKwkJZGV2X3dhcm4oZGV2LAorCQkJICJtaXNzaW5nIG9yIGVtcHR5IHJhbmdlcyBwcm9wZXJ0eSBmb3IgZGV2aWNlIHRyZWUgbm9kZSAnJXMnXG4iLAorCQkJIG1jX25vZGUtPm5hbWUpOworCisJCSpudW1fcmFuZ2VzID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJKnBhZGRyX2NlbGxzID0gb2Zfbl9hZGRyX2NlbGxzKG1jX25vZGUpOworCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShtY19ub2RlLCAiI2FkZHJlc3MtY2VsbHMiLCBOVUxMKTsKKwlpZiAocHJvcCkKKwkJKm1jX2FkZHJfY2VsbHMgPSBiZTMyX3RvX2NwdXAocHJvcCk7CisJZWxzZQorCQkqbWNfYWRkcl9jZWxscyA9ICpwYWRkcl9jZWxsczsKKworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobWNfbm9kZSwgIiNzaXplLWNlbGxzIiwgTlVMTCk7CisJaWYgKHByb3ApCisJCSptY19zaXplX2NlbGxzID0gYmUzMl90b19jcHVwKHByb3ApOworCWVsc2UKKwkJKm1jX3NpemVfY2VsbHMgPSBvZl9uX3NpemVfY2VsbHMobWNfbm9kZSk7CisKKwlyYW5nZV90dXBsZV9jZWxsX2NvdW50ID0gKnBhZGRyX2NlbGxzICsgKm1jX2FkZHJfY2VsbHMgKworCQkJCSAqbWNfc2l6ZV9jZWxsczsKKworCXR1cGxlX2xlbiA9IHJhbmdlX3R1cGxlX2NlbGxfY291bnQgKiBzaXplb2YoX19iZTMyKTsKKwlpZiAocmFuZ2VzX2xlbiAlIHR1cGxlX2xlbiAhPSAwKSB7CisJCWRldl9lcnIoZGV2LCAibWFsZm9ybWVkIHJhbmdlcyBwcm9wZXJ0eSAnJXMnXG4iLCBtY19ub2RlLT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJKm51bV9yYW5nZXMgPSByYW5nZXNfbGVuIC8gdHVwbGVfbGVuOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9tY19hZGRyX3RyYW5zbGF0aW9uX3JhbmdlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgc3RydWN0IGZzbF9tY19hZGRyX3RyYW5zbGF0aW9uX3JhbmdlCisJCQkJCQkqKnJhbmdlcywKKwkJCQkJICB1OCAqbnVtX3JhbmdlcykKK3sKKwlpbnQgZXJyb3I7CisJaW50IHBhZGRyX2NlbGxzOworCWludCBtY19hZGRyX2NlbGxzOworCWludCBtY19zaXplX2NlbGxzOworCWludCBpOworCWNvbnN0IF9fYmUzMiAqcmFuZ2VzX3N0YXJ0OworCWNvbnN0IF9fYmUzMiAqY2VsbDsKKworCWVycm9yID0gcGFyc2VfbWNfcmFuZ2VzKGRldiwKKwkJCQkmcGFkZHJfY2VsbHMsCisJCQkJJm1jX2FkZHJfY2VsbHMsCisJCQkJJm1jX3NpemVfY2VsbHMsCisJCQkJJnJhbmdlc19zdGFydCwKKwkJCQludW1fcmFuZ2VzKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKKwlpZiAoISgqbnVtX3JhbmdlcykpIHsKKwkJLyoKKwkJICogTWlzc2luZyBvciBlbXB0eSByYW5nZXMgcHJvcGVydHkgKCJyYW5nZXM7IikgZm9yIHRoZQorCQkgKiAnZnNsLHFvcmlxLW1jJyBub2RlLiBJbiB0aGlzIGNhc2UsIGlkZW50aXR5IG1hcHBpbmcKKwkJICogd2lsbCBiZSB1c2VkLgorCQkgKi8KKwkJKnJhbmdlcyA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKworCSpyYW5nZXMgPSBkZXZtX2tjYWxsb2MoZGV2LCAqbnVtX3JhbmdlcywKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGZzbF9tY19hZGRyX3RyYW5zbGF0aW9uX3JhbmdlKSwKKwkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoISgqcmFuZ2VzKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljZWxsID0gcmFuZ2VzX3N0YXJ0OworCWZvciAoaSA9IDA7IGkgPCAqbnVtX3JhbmdlczsgKytpKSB7CisJCXN0cnVjdCBmc2xfbWNfYWRkcl90cmFuc2xhdGlvbl9yYW5nZSAqcmFuZ2UgPSAmKCpyYW5nZXMpW2ldOworCisJCXJhbmdlLT5tY19yZWdpb25fdHlwZSA9IG9mX3JlYWRfbnVtYmVyKGNlbGwsIDEpOworCQlyYW5nZS0+c3RhcnRfbWNfb2Zmc2V0ID0gb2ZfcmVhZF9udW1iZXIoY2VsbCArIDEsCisJCQkJCQkJbWNfYWRkcl9jZWxscyAtIDEpOworCQljZWxsICs9IG1jX2FkZHJfY2VsbHM7CisJCXJhbmdlLT5zdGFydF9waHlzX2FkZHIgPSBvZl9yZWFkX251bWJlcihjZWxsLCBwYWRkcl9jZWxscyk7CisJCWNlbGwgKz0gcGFkZHJfY2VsbHM7CisJCXJhbmdlLT5lbmRfbWNfb2Zmc2V0ID0gcmFuZ2UtPnN0YXJ0X21jX29mZnNldCArCisJCQkJICAgICBvZl9yZWFkX251bWJlcihjZWxsLCBtY19zaXplX2NlbGxzKTsKKworCQljZWxsICs9IG1jX3NpemVfY2VsbHM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZnNsX21jX2J1c19wcm9iZSAtIGNhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgcm9vdCBNQyBidXMgaXMgYmVpbmcKKyAqIGFkZGVkCisgKi8KK3N0YXRpYyBpbnQgZnNsX21jX2J1c19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkcHJjX29ial9kZXNjIG9ial9kZXNjOworCWludCBlcnJvcjsKKwlzdHJ1Y3QgZnNsX21jICptYzsKKwlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldiA9IE5VTEw7CisJc3RydWN0IGZzbF9tY19pbyAqbWNfaW8gPSBOVUxMOworCWludCBjb250YWluZXJfaWQ7CisJcGh5c19hZGRyX3QgbWNfcG9ydGFsX3BoeXNfYWRkcjsKKwl1MzIgbWNfcG9ydGFsX3NpemU7CisJc3RydWN0IG1jX3ZlcnNpb24gbWNfdmVyc2lvbjsKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIlJvb3QgTUMgYnVzIGRldmljZSBwcm9iZWQiKTsKKworCW1jID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqbWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1jKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1jKTsKKworCS8qCisJICogR2V0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgTUMgcG9ydGFsIGZvciB0aGUgcm9vdCBEUFJDOgorCSAqLworCWVycm9yID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShwZGV2LT5kZXYub2Zfbm9kZSwgMCwgJnJlcyk7CisJaWYgKGVycm9yIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkib2ZfYWRkcmVzc190b19yZXNvdXJjZSgpIGZhaWxlZCBmb3IgJXNcbiIsCisJCQlwZGV2LT5kZXYub2Zfbm9kZS0+ZnVsbF9uYW1lKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCW1jX3BvcnRhbF9waHlzX2FkZHIgPSByZXMuc3RhcnQ7CisJbWNfcG9ydGFsX3NpemUgPSByZXNvdXJjZV9zaXplKCZyZXMpOworCWVycm9yID0gZnNsX2NyZWF0ZV9tY19pbygmcGRldi0+ZGV2LCBtY19wb3J0YWxfcGh5c19hZGRyLAorCQkJCSBtY19wb3J0YWxfc2l6ZSwgTlVMTCwKKwkJCQkgRlNMX01DX0lPX0FUT01JQ19DT05URVhUX1BPUlRBTCwgJm1jX2lvKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKKwllcnJvciA9IG1jX2dldF92ZXJzaW9uKG1jX2lvLCAwLCAmbWNfdmVyc2lvbik7CisJaWYgKGVycm9yICE9IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIm1jX2dldF92ZXJzaW9uKCkgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsIGVycm9yKTsKKwkJZ290byBlcnJvcl9jbGVhbnVwX21jX2lvOworCX0KKworCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCSAiRnJlZXNjYWxlIE1hbmFnZW1lbnQgQ29tcGxleCBGaXJtd2FyZSB2ZXJzaW9uOiAldS4ldS4ldVxuIiwKKwkJIG1jX3ZlcnNpb24ubWFqb3IsIG1jX3ZlcnNpb24ubWlub3IsIG1jX3ZlcnNpb24ucmV2aXNpb24pOworCisJZXJyb3IgPSBnZXRfbWNfYWRkcl90cmFuc2xhdGlvbl9yYW5nZXMoJnBkZXYtPmRldiwKKwkJCQkJICAgICAgICZtYy0+dHJhbnNsYXRpb25fcmFuZ2VzLAorCQkJCQkgICAgICAgJm1jLT5udW1fdHJhbnNsYXRpb25fcmFuZ2VzKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIGVycm9yX2NsZWFudXBfbWNfaW87CisKKwllcnJvciA9IGRwbW5nX2dldF9jb250YWluZXJfaWQobWNfaW8sIDAsICZjb250YWluZXJfaWQpOworCWlmIChlcnJvciA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJImRwbW5nX2dldF9jb250YWluZXJfaWQoKSBmYWlsZWQ6ICVkXG4iLCBlcnJvcik7CisJCWdvdG8gZXJyb3JfY2xlYW51cF9tY19pbzsKKwl9CisKKwltZW1zZXQoJm9ial9kZXNjLCAwLCBzaXplb2Yoc3RydWN0IGRwcmNfb2JqX2Rlc2MpKTsKKwllcnJvciA9IGdldF9kcHJjX3ZlcnNpb24obWNfaW8sIGNvbnRhaW5lcl9pZCwKKwkJCQkgJm9ial9kZXNjLnZlcl9tYWpvciwgJm9ial9kZXNjLnZlcl9taW5vcik7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBlcnJvcl9jbGVhbnVwX21jX2lvOworCisJb2JqX2Rlc2MudmVuZG9yID0gRlNMX01DX1ZFTkRPUl9GUkVFU0NBTEU7CisJc3RyY3B5KG9ial9kZXNjLnR5cGUsICJkcHJjIik7CisJb2JqX2Rlc2MuaWQgPSBjb250YWluZXJfaWQ7CisJb2JqX2Rlc2MuaXJxX2NvdW50ID0gMTsKKwlvYmpfZGVzYy5yZWdpb25fY291bnQgPSAwOworCisJZXJyb3IgPSBmc2xfbWNfZGV2aWNlX2FkZCgmb2JqX2Rlc2MsIG1jX2lvLCAmcGRldi0+ZGV2LCAmbWNfYnVzX2Rldik7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBlcnJvcl9jbGVhbnVwX21jX2lvOworCisJbWMtPnJvb3RfbWNfYnVzX2RldiA9IG1jX2J1c19kZXY7CisJcmV0dXJuIDA7CisKK2Vycm9yX2NsZWFudXBfbWNfaW86CisJZnNsX2Rlc3Ryb3lfbWNfaW8obWNfaW8pOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKiBmc2xfbWNfYnVzX3JlbW92ZSAtIGNhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgcm9vdCBNQyBidXMgaXMgYmVpbmcKKyAqIHJlbW92ZWQKKyAqLworc3RhdGljIGludCBmc2xfbWNfYnVzX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBmc2xfbWMgKm1jID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoV0FSTl9PTighZnNsX21jX2lzX3Jvb3RfZHByYygmbWMtPnJvb3RfbWNfYnVzX2Rldi0+ZGV2KSkpCisJCXJldHVybiAtRUlOVkFMOworCisJZnNsX21jX2RldmljZV9yZW1vdmUobWMtPnJvb3RfbWNfYnVzX2Rldik7CisKKwlmc2xfZGVzdHJveV9tY19pbyhtYy0+cm9vdF9tY19idXNfZGV2LT5tY19pbyk7CisJbWMtPnJvb3RfbWNfYnVzX2Rldi0+bWNfaW8gPSBOVUxMOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIlJvb3QgTUMgYnVzIGRldmljZSByZW1vdmVkIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGZzbF9tY19idXNfbWF0Y2hfdGFibGVbXSA9IHsKKwl7LmNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLW1jIix9LAorCXt9LAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgZnNsX21jX2J1c19tYXRjaF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGZzbF9tY19idXNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gImZzbF9tY19idXMiLAorCQkgICAucG0gPSBOVUxMLAorCQkgICAub2ZfbWF0Y2hfdGFibGUgPSBmc2xfbWNfYnVzX21hdGNoX3RhYmxlLAorCQkgICB9LAorCS5wcm9iZSA9IGZzbF9tY19idXNfcHJvYmUsCisJLnJlbW92ZSA9IGZzbF9tY19idXNfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZnNsX21jX2J1c19kcml2ZXJfaW5pdCh2b2lkKQoreworCWludCBlcnJvcjsKKworCW1jX2Rldl9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJmc2xfbWNfZGV2aWNlIiwKKwkJCQkJIHNpemVvZihzdHJ1Y3QgZnNsX21jX2RldmljZSksIDAsIDAsCisJCQkJCSBOVUxMKTsKKwlpZiAoIW1jX2Rldl9jYWNoZSkgeworCQlwcl9lcnIoIkNvdWxkIG5vdCBjcmVhdGUgZnNsX21jX2RldmljZSBjYWNoZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWVycm9yID0gYnVzX3JlZ2lzdGVyKCZmc2xfbWNfYnVzX3R5cGUpOworCWlmIChlcnJvciA8IDApIHsKKwkJcHJfZXJyKCJmc2wtbWMgYnVzIHR5cGUgcmVnaXN0cmF0aW9uIGZhaWxlZDogJWRcbiIsIGVycm9yKTsKKwkJZ290byBlcnJvcl9jbGVhbnVwX2NhY2hlOworCX0KKworCXByX2luZm8oImZzbC1tYyBidXMgdHlwZSByZWdpc3RlcmVkXG4iKTsKKworCWVycm9yID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZmc2xfbWNfYnVzX2RyaXZlcik7CisJaWYgKGVycm9yIDwgMCkgeworCQlwcl9lcnIoInBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigpIGZhaWxlZDogJWRcbiIsIGVycm9yKTsKKwkJZ290byBlcnJvcl9jbGVhbnVwX2J1czsKKwl9CisKKwllcnJvciA9IGRwcmNfZHJpdmVyX2luaXQoKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIGVycm9yX2NsZWFudXBfZHJpdmVyOworCisJZXJyb3IgPSBmc2xfbWNfYWxsb2NhdG9yX2RyaXZlcl9pbml0KCk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBlcnJvcl9jbGVhbnVwX2RwcmNfZHJpdmVyOworCisJZXJyb3IgPSBpdHNfZnNsX21jX21zaV9pbml0KCk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBlcnJvcl9jbGVhbnVwX21jX2FsbG9jYXRvcjsKKworCXJldHVybiAwOworCitlcnJvcl9jbGVhbnVwX21jX2FsbG9jYXRvcjoKKwlmc2xfbWNfYWxsb2NhdG9yX2RyaXZlcl9leGl0KCk7CisKK2Vycm9yX2NsZWFudXBfZHByY19kcml2ZXI6CisJZHByY19kcml2ZXJfZXhpdCgpOworCitlcnJvcl9jbGVhbnVwX2RyaXZlcjoKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZnNsX21jX2J1c19kcml2ZXIpOworCitlcnJvcl9jbGVhbnVwX2J1czoKKwlidXNfdW5yZWdpc3RlcigmZnNsX21jX2J1c190eXBlKTsKKworZXJyb3JfY2xlYW51cF9jYWNoZToKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kobWNfZGV2X2NhY2hlKTsKKwlyZXR1cm4gZXJyb3I7Cit9Citwb3N0Y29yZV9pbml0Y2FsbChmc2xfbWNfYnVzX2RyaXZlcl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2ZzbC1tYy1tc2kuYyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2ZzbC1tYy1tc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDQ2YjFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZnNsLW1jLW1zaS5jCkBAIC0wLDAgKzEsMjg0IEBACisvKgorICogRnJlZXNjYWxlIE1hbmFnZW1lbnQgQ29tcGxleCAoTUMpIGJ1cyBkcml2ZXIgTVNJIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIEF1dGhvcjogR2VybWFuIFJpdmVyYSA8R2VybWFuLlJpdmVyYUBmcmVlc2NhbGUuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFjaGlwL2FybS1naWMtdjMuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KKyNpbmNsdWRlIDxsaW51eC9tc2kuaD4KKyNpbmNsdWRlICIuLi9pbmNsdWRlL21jLWJ1cy5oIgorCisvKgorICogR2VuZXJhdGUgYSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIGludGVycnVwdCAob25seSB1c2VkIHdpdGhpbiB0aGUgTVNJCisgKiBpcnFkb21haW4uICBDb21iaW5lIHRoZSBpY2lkIHdpdGggdGhlIGludGVycnVwdCBpbmRleC4KKyAqLworc3RhdGljIGlycV9od19udW1iZXJfdCBmc2xfbWNfZG9tYWluX2NhbGNfaHdpcnEoc3RydWN0IGZzbF9tY19kZXZpY2UgKmRldiwKKwkJCQkJCXN0cnVjdCBtc2lfZGVzYyAqZGVzYykKK3sKKwkvKgorCSAqIE1ha2UgdGhlIGJhc2UgaHdpcnEgdmFsdWUgZm9yIElDSUQqMTAwMDAgc28gaXQgaXMgcmVhZGFibGUKKwkgKiBhcyBhIGRlY2ltYWwgdmFsdWUgaW4gL3Byb2MvaW50ZXJydXB0cy4KKwkgKi8KKwlyZXR1cm4gKGlycV9od19udW1iZXJfdCkoZGVzYy0+ZnNsX21jLm1zaV9pbmRleCArIChkZXYtPmljaWQgKiAxMDAwMCkpOworfQorCitzdGF0aWMgdm9pZCBmc2xfbWNfbXNpX3NldF9kZXNjKG1zaV9hbGxvY19pbmZvX3QgKmFyZywKKwkJCQlzdHJ1Y3QgbXNpX2Rlc2MgKmRlc2MpCit7CisJYXJnLT5kZXNjID0gZGVzYzsKKwlhcmctPmh3aXJxID0gZnNsX21jX2RvbWFpbl9jYWxjX2h3aXJxKHRvX2ZzbF9tY19kZXZpY2UoZGVzYy0+ZGV2KSwKKwkJCQkJICAgICAgZGVzYyk7Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9tY19tc2lfdXBkYXRlX2RvbV9vcHMoc3RydWN0IG1zaV9kb21haW5faW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgbXNpX2RvbWFpbl9vcHMgKm9wcyA9IGluZm8tPm9wczsKKworCWlmIChXQVJOX09OKCFvcHMpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIHNldF9kZXNjIHNob3VsZCBub3QgYmUgc2V0IGJ5IHRoZSBjYWxsZXIKKwkgKi8KKwlpZiAoIW9wcy0+c2V0X2Rlc2MpCisJCW9wcy0+c2V0X2Rlc2MgPSBmc2xfbWNfbXNpX3NldF9kZXNjOworfQorCitzdGF0aWMgdm9pZCBfX2ZzbF9tY19tc2lfd3JpdGVfbXNnKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2LAorCQkJCSAgIHN0cnVjdCBmc2xfbWNfZGV2aWNlX2lycSAqbWNfZGV2X2lycSkKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKm93bmVyX21jX2RldiA9IG1jX2Rldl9pcnEtPm1jX2RldjsKKwlzdHJ1Y3QgbXNpX2Rlc2MgKm1zaV9kZXNjID0gbWNfZGV2X2lycS0+bXNpX2Rlc2M7CisJc3RydWN0IGRwcmNfaXJxX2NmZyBpcnFfY2ZnOworCisJLyoKKwkgKiBtc2lfZGVzYy0+bXNnLmFkZHJlc3MgaXMgMHgwIHdoZW4gdGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIGluCisJICogdGhlIGZyZWVfaXJxKCkgY29kZSBwYXRoLiBJbiB0aGlzIGNhc2UsIGZvciB0aGUgTUMsIHdlIGRvbid0CisJICogcmVhbGx5IG5lZWQgdG8gInVucHJvZ3JhbSIgdGhlIE1TSSwgc28gd2UganVzdCByZXR1cm4uCisJICovCisJaWYgKG1zaV9kZXNjLT5tc2cuYWRkcmVzc19sbyA9PSAweDAgJiYgbXNpX2Rlc2MtPm1zZy5hZGRyZXNzX2hpID09IDB4MCkKKwkJcmV0dXJuOworCisJaWYgKFdBUk5fT04oIW93bmVyX21jX2RldikpCisJCXJldHVybjsKKworCWlycV9jZmcucGFkZHIgPSAoKHU2NCltc2lfZGVzYy0+bXNnLmFkZHJlc3NfaGkgPDwgMzIpIHwKKwkJCW1zaV9kZXNjLT5tc2cuYWRkcmVzc19sbzsKKwlpcnFfY2ZnLnZhbCA9IG1zaV9kZXNjLT5tc2cuZGF0YTsKKwlpcnFfY2ZnLmlycV9udW0gPSBtc2lfZGVzYy0+aXJxOworCisJaWYgKG93bmVyX21jX2RldiA9PSBtY19idXNfZGV2KSB7CisJCS8qCisJCSAqIElSUSBpcyBmb3IgdGhlIG1jX2J1c19kZXYncyBEUFJDIGl0c2VsZgorCQkgKi8KKwkJZXJyb3IgPSBkcHJjX3NldF9pcnEobWNfYnVzX2Rldi0+bWNfaW8sCisJCQkJICAgICBNQ19DTURfRkxBR19JTlRSX0RJUyB8IE1DX0NNRF9GTEFHX1BSSSwKKwkJCQkgICAgIG1jX2J1c19kZXYtPm1jX2hhbmRsZSwKKwkJCQkgICAgIG1jX2Rldl9pcnEtPmRldl9pcnFfaW5kZXgsCisJCQkJICAgICAmaXJxX2NmZyk7CisJCWlmIChlcnJvciA8IDApIHsKKwkJCWRldl9lcnIoJm93bmVyX21jX2Rldi0+ZGV2LAorCQkJCSJkcHJjX3NldF9pcnEoKSBmYWlsZWQ6ICVkXG4iLCBlcnJvcik7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBJUlEgaXMgZm9yIGZvciBhIGNoaWxkIGRldmljZSBvZiBtY19idXNfZGV2CisJCSAqLworCQllcnJvciA9IGRwcmNfc2V0X29ial9pcnEobWNfYnVzX2Rldi0+bWNfaW8sCisJCQkJCSBNQ19DTURfRkxBR19JTlRSX0RJUyB8IE1DX0NNRF9GTEFHX1BSSSwKKwkJCQkJIG1jX2J1c19kZXYtPm1jX2hhbmRsZSwKKwkJCQkJIG93bmVyX21jX2Rldi0+b2JqX2Rlc2MudHlwZSwKKwkJCQkJIG93bmVyX21jX2Rldi0+b2JqX2Rlc2MuaWQsCisJCQkJCSBtY19kZXZfaXJxLT5kZXZfaXJxX2luZGV4LAorCQkJCQkgJmlycV9jZmcpOworCQlpZiAoZXJyb3IgPCAwKSB7CisJCQlkZXZfZXJyKCZvd25lcl9tY19kZXYtPmRldiwKKwkJCQkiZHByY19vYmpfc2V0X2lycSgpIGZhaWxlZDogJWRcbiIsIGVycm9yKTsKKwkJfQorCX0KK30KKworLyoKKyAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQKKyAqLworc3RhdGljIHZvaWQgZnNsX21jX21zaV93cml0ZV9tc2coc3RydWN0IGlycV9kYXRhICppcnFfZGF0YSwKKwkJCQkgc3RydWN0IG1zaV9tc2cgKm1zZykKK3sKKwlzdHJ1Y3QgbXNpX2Rlc2MgKm1zaV9kZXNjID0gaXJxX2RhdGFfZ2V0X21zaV9kZXNjKGlycV9kYXRhKTsKKwlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldiA9IHRvX2ZzbF9tY19kZXZpY2UobXNpX2Rlc2MtPmRldik7CisJc3RydWN0IGZzbF9tY19idXMgKm1jX2J1cyA9IHRvX2ZzbF9tY19idXMobWNfYnVzX2Rldik7CisJc3RydWN0IGZzbF9tY19kZXZpY2VfaXJxICptY19kZXZfaXJxID0KKwkJJm1jX2J1cy0+aXJxX3Jlc291cmNlc1ttc2lfZGVzYy0+ZnNsX21jLm1zaV9pbmRleF07CisKKwlXQVJOX09OKG1jX2Rldl9pcnEtPm1zaV9kZXNjICE9IG1zaV9kZXNjKTsKKwltc2lfZGVzYy0+bXNnID0gKm1zZzsKKworCS8qCisJICogUHJvZ3JhbSB0aGUgTVNJIChwYWRkciwgdmFsdWUpIHBhaXIgaW4gdGhlIGRldmljZToKKwkgKi8KKwlfX2ZzbF9tY19tc2lfd3JpdGVfbXNnKG1jX2J1c19kZXYsIG1jX2Rldl9pcnEpOworfQorCitzdGF0aWMgdm9pZCBmc2xfbWNfbXNpX3VwZGF0ZV9jaGlwX29wcyhzdHJ1Y3QgbXNpX2RvbWFpbl9pbmZvICppbmZvKQoreworCXN0cnVjdCBpcnFfY2hpcCAqY2hpcCA9IGluZm8tPmNoaXA7CisKKwlpZiAoV0FSTl9PTigoIWNoaXApKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBpcnFfd3JpdGVfbXNpX21zZyBzaG91bGQgbm90IGJlIHNldCBieSB0aGUgY2FsbGVyCisJICovCisJaWYgKCFjaGlwLT5pcnFfd3JpdGVfbXNpX21zZykKKwkJY2hpcC0+aXJxX3dyaXRlX21zaV9tc2cgPSBmc2xfbWNfbXNpX3dyaXRlX21zZzsKK30KKworLyoqCisgKiBmc2xfbWNfbXNpX2NyZWF0ZV9pcnFfZG9tYWluIC0gQ3JlYXRlIGEgZnNsLW1jIE1TSSBpbnRlcnJ1cHQgZG9tYWluCisgKiBAbnA6CQlPcHRpb25hbCBkZXZpY2UtdHJlZSBub2RlIG9mIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlcgorICogQGluZm86CU1TSSBkb21haW4gaW5mbworICogQHBhcmVudDoJUGFyZW50IGlycSBkb21haW4KKyAqCisgKiBVcGRhdGVzIHRoZSBkb21haW4gYW5kIGNoaXAgb3BzIGFuZCBjcmVhdGVzIGEgZnNsLW1jIE1TSQorICogaW50ZXJydXB0IGRvbWFpbi4KKyAqCisgKiBSZXR1cm5zOgorICogQSBkb21haW4gcG9pbnRlciBvciBOVUxMIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworc3RydWN0IGlycV9kb21haW4gKmZzbF9tY19tc2lfY3JlYXRlX2lycV9kb21haW4oc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3bm9kZSwKKwkJCQkJCXN0cnVjdCBtc2lfZG9tYWluX2luZm8gKmluZm8sCisJCQkJCQlzdHJ1Y3QgaXJxX2RvbWFpbiAqcGFyZW50KQoreworCXN0cnVjdCBpcnFfZG9tYWluICpkb21haW47CisKKwlpZiAoaW5mby0+ZmxhZ3MgJiBNU0lfRkxBR19VU0VfREVGX0RPTV9PUFMpCisJCWZzbF9tY19tc2lfdXBkYXRlX2RvbV9vcHMoaW5mbyk7CisJaWYgKGluZm8tPmZsYWdzICYgTVNJX0ZMQUdfVVNFX0RFRl9DSElQX09QUykKKwkJZnNsX21jX21zaV91cGRhdGVfY2hpcF9vcHMoaW5mbyk7CisKKwlkb21haW4gPSBtc2lfY3JlYXRlX2lycV9kb21haW4oZndub2RlLCBpbmZvLCBwYXJlbnQpOworCWlmIChkb21haW4pCisJCWRvbWFpbi0+YnVzX3Rva2VuID0gRE9NQUlOX0JVU19GU0xfTUNfTVNJOworCisJcmV0dXJuIGRvbWFpbjsKK30KKworaW50IGZzbF9tY19maW5kX21zaV9kb21haW4oc3RydWN0IGRldmljZSAqbWNfcGxhdGZvcm1fZGV2LAorCQkJICAgc3RydWN0IGlycV9kb21haW4gKiptY19tc2lfZG9tYWluKQoreworCXN0cnVjdCBpcnFfZG9tYWluICptc2lfZG9tYWluOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbWNfb2Zfbm9kZSA9IG1jX3BsYXRmb3JtX2Rldi0+b2Zfbm9kZTsKKworCW1zaV9kb21haW4gPSBvZl9tc2lfZ2V0X2RvbWFpbihtY19wbGF0Zm9ybV9kZXYsIG1jX29mX25vZGUsCisJCQkJICAgICAgIERPTUFJTl9CVVNfRlNMX01DX01TSSk7CisJaWYgKCFtc2lfZG9tYWluKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGZpbmQgZnNsLW1jIE1TSSBkb21haW4gZm9yICVzXG4iLAorCQkgICAgICAgbWNfb2Zfbm9kZS0+ZnVsbF9uYW1lKTsKKworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwkqbWNfbXNpX2RvbWFpbiA9IG1zaV9kb21haW47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9tY19tc2lfZnJlZV9kZXNjcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1zaV9kZXNjICpkZXNjLCAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlc2MsIHRtcCwgZGV2X3RvX21zaV9saXN0KGRldiksIGxpc3QpIHsKKwkJbGlzdF9kZWwoJmRlc2MtPmxpc3QpOworCQlmcmVlX21zaV9lbnRyeShkZXNjKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZnNsX21jX21zaV9hbGxvY19kZXNjcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBpcnFfY291bnQpCisKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgZXJyb3I7CisJc3RydWN0IG1zaV9kZXNjICptc2lfZGVzYzsKKworCWZvciAoaSA9IDA7IGkgPCBpcnFfY291bnQ7IGkrKykgeworCQltc2lfZGVzYyA9IGFsbG9jX21zaV9lbnRyeShkZXYsIDEsIE5VTEwpOworCQlpZiAoIW1zaV9kZXNjKSB7CisJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtc2kgZW50cnlcbiIpOworCQkJZXJyb3IgPSAtRU5PTUVNOworCQkJZ290byBjbGVhbnVwX21zaV9kZXNjczsKKwkJfQorCisJCW1zaV9kZXNjLT5mc2xfbWMubXNpX2luZGV4ID0gaTsKKwkJSU5JVF9MSVNUX0hFQUQoJm1zaV9kZXNjLT5saXN0KTsKKwkJbGlzdF9hZGRfdGFpbCgmbXNpX2Rlc2MtPmxpc3QsIGRldl90b19tc2lfbGlzdChkZXYpKTsKKwl9CisKKwlyZXR1cm4gMDsKKworY2xlYW51cF9tc2lfZGVzY3M6CisJZnNsX21jX21zaV9mcmVlX2Rlc2NzKGRldik7CisJcmV0dXJuIGVycm9yOworfQorCitpbnQgZnNsX21jX21zaV9kb21haW5fYWxsb2NfaXJxcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHVuc2lnbmVkIGludCBpcnFfY291bnQpCit7CisJc3RydWN0IGlycV9kb21haW4gKm1zaV9kb21haW47CisJaW50IGVycm9yOworCisJaWYgKFdBUk5fT04oIWxpc3RfZW1wdHkoZGV2X3RvX21zaV9saXN0KGRldikpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnJvciA9IGZzbF9tY19tc2lfYWxsb2NfZGVzY3MoZGV2LCBpcnFfY291bnQpOworCWlmIChlcnJvciA8IDApCisJCXJldHVybiBlcnJvcjsKKworCW1zaV9kb21haW4gPSBkZXZfZ2V0X21zaV9kb21haW4oZGV2KTsKKwlpZiAoV0FSTl9PTighbXNpX2RvbWFpbikpIHsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIGNsZWFudXBfbXNpX2Rlc2NzOworCX0KKworCS8qCisJICogTk9URTogQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpbGwgdHJpZ2dlciB0aGUgaW52b2NhdGlvbiBvZiB0aGUKKwkgKiBpdHNfZnNsX21jX21zaV9wcmVwYXJlKCkgY2FsbGJhY2sKKwkgKi8KKwllcnJvciA9IG1zaV9kb21haW5fYWxsb2NfaXJxcyhtc2lfZG9tYWluLCBkZXYsIGlycV9jb3VudCk7CisKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgSVJRc1xuIik7CisJCWdvdG8gY2xlYW51cF9tc2lfZGVzY3M7CisJfQorCisJcmV0dXJuIDA7CisKK2NsZWFudXBfbXNpX2Rlc2NzOgorCWZzbF9tY19tc2lfZnJlZV9kZXNjcyhkZXYpOworCXJldHVybiBlcnJvcjsKK30KKwordm9pZCBmc2xfbWNfbXNpX2RvbWFpbl9mcmVlX2lycXMoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpcnFfZG9tYWluICptc2lfZG9tYWluOworCisJbXNpX2RvbWFpbiA9IGRldl9nZXRfbXNpX2RvbWFpbihkZXYpOworCWlmIChXQVJOX09OKCFtc2lfZG9tYWluKSkKKwkJcmV0dXJuOworCisJbXNpX2RvbWFpbl9mcmVlX2lycXMobXNpX2RvbWFpbiwgZGV2KTsKKworCWlmIChXQVJOX09OKGxpc3RfZW1wdHkoZGV2X3RvX21zaV9saXN0KGRldikpKSkKKwkJcmV0dXJuOworCisJZnNsX21jX21zaV9mcmVlX2Rlc2NzKGRldik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9mc2wtbWMtcHJpdmF0ZS5oIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZnNsLW1jLXByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDU5YzI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZnNsLW1jLXByaXZhdGUuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogRnJlZXNjYWxlIE1hbmFnZW1lbnQgQ29tcGxleCAoTUMpIGJ1cyBwcml2YXRlIGRlY2xhcmF0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKyNpZm5kZWYgX0ZTTF9NQ19QUklWQVRFX0hfCisjZGVmaW5lIF9GU0xfTUNfUFJJVkFURV9IXworCitpbnQgX19tdXN0X2NoZWNrIGZzbF9tY19kZXZpY2VfYWRkKHN0cnVjdCBkcHJjX29ial9kZXNjICpvYmpfZGVzYywKKwkJCQkgICBzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnRfZGV2LAorCQkJCSAgIHN0cnVjdCBmc2xfbWNfZGV2aWNlICoqbmV3X21jX2Rldik7CisKK3ZvaWQgZnNsX21jX2RldmljZV9yZW1vdmUoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2Rldik7CisKK2ludCBfX2luaXQgZHByY19kcml2ZXJfaW5pdCh2b2lkKTsKKwordm9pZCBkcHJjX2RyaXZlcl9leGl0KHZvaWQpOworCitpbnQgX19pbml0IGZzbF9tY19hbGxvY2F0b3JfZHJpdmVyX2luaXQodm9pZCk7CisKK3ZvaWQgZnNsX21jX2FsbG9jYXRvcl9kcml2ZXJfZXhpdCh2b2lkKTsKKworaW50IF9fbXVzdF9jaGVjayBmc2xfbWNfcmVzb3VyY2VfYWxsb2NhdGUoc3RydWN0IGZzbF9tY19idXMgKm1jX2J1cywKKwkJCQkJICBlbnVtIGZzbF9tY19wb29sX3R5cGUgcG9vbF90eXBlLAorCQkJCQkgIHN0cnVjdCBmc2xfbWNfcmVzb3VyY2UKKwkJCQkJCQkgICoqbmV3X3Jlc291cmNlKTsKKwordm9pZCBmc2xfbWNfcmVzb3VyY2VfZnJlZShzdHJ1Y3QgZnNsX21jX3Jlc291cmNlICpyZXNvdXJjZSk7CisKK2ludCBmc2xfbWNfbXNpX2RvbWFpbl9hbGxvY19pcnFzKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgdW5zaWduZWQgaW50IGlycV9jb3VudCk7CisKK3ZvaWQgZnNsX21jX21zaV9kb21haW5fZnJlZV9pcnFzKHN0cnVjdCBkZXZpY2UgKmRldik7CisKK2ludCBfX2luaXQgaXRzX2ZzbF9tY19tc2lfaW5pdCh2b2lkKTsKKwordm9pZCBpdHNfZnNsX21jX21zaV9jbGVhbnVwKHZvaWQpOworCitpbnQgX19tdXN0X2NoZWNrIGZzbF9jcmVhdGVfbWNfaW8oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgcGh5c19hZGRyX3QgbWNfcG9ydGFsX3BoeXNfYWRkciwKKwkJCQkgIHUzMiBtY19wb3J0YWxfc2l6ZSwKKwkJCQkgIHN0cnVjdCBmc2xfbWNfZGV2aWNlICpkcG1jcF9kZXYsCisJCQkJICB1MzIgZmxhZ3MsIHN0cnVjdCBmc2xfbWNfaW8gKipuZXdfbWNfaW8pOworCit2b2lkIGZzbF9kZXN0cm95X21jX2lvKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvKTsKKworI2VuZGlmIC8qIF9GU0xfTUNfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvaXJxLWdpYy12My1pdHMtZnNsLW1jLW1zaS5jIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvaXJxLWdpYy12My1pdHMtZnNsLW1jLW1zaS5jCmluZGV4IDcyMGUyYjAuLjdhNmFjNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2lycS1naWMtdjMtaXRzLWZzbC1tYy1tc2kuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9pcnEtZ2ljLXYzLWl0cy1mc2wtbWMtbXNpLmMKQEAgLTksNyArOSw2IEBACiAgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKi8KIAotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtcHJpdmF0ZS5oIgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9pcnFjaGlwL2FybS1naWMtdjMuaD4KQEAgLTE3LDggKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tc2kuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtc3lzLmgiCi0jaW5jbHVkZSAiZHByYy1jbWQuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL21jLWJ1cy5oIgogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGl0c19tc2lfaXJxX2NoaXAgPSB7CiAJLm5hbWUgPSAiZnNsLW1jLWJ1cy1tc2kiLApAQCAtMzUsNyArMzMsNyBAQAogCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2OwogCXN0cnVjdCBtc2lfZG9tYWluX2luZm8gKm1zaV9pbmZvOwogCi0JaWYgKFdBUk5fT04oZGV2LT5idXMgIT0gJmZzbF9tY19idXNfdHlwZSkpCisJaWYgKFdBUk5fT04oIWRldl9pc19mc2xfbWMoZGV2KSkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJbWNfYnVzX2RldiA9IHRvX2ZzbF9tY19kZXZpY2UoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL21jLWFsbG9jYXRvci5jIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvbWMtYWxsb2NhdG9yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1OWQ4NTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvbWMtYWxsb2NhdG9yLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NTUgKzAsMCBAQAotLyoKLSAqIEZyZWVzY2FsZSBNQyBvYmplY3QgZGV2aWNlIGFsbG9jYXRvciBkcml2ZXIKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQotICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICovCi0KLSNpbmNsdWRlICIuLi9pbmNsdWRlL21jLXByaXZhdGUuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL21jLXN5cy5oIgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvZHBicC1jbWQuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2RwY29uLWNtZC5oIgotI2luY2x1ZGUgImRwbWNwLWNtZC5oIgotI2luY2x1ZGUgImRwbWNwLmgiCi0jaW5jbHVkZSA8bGludXgvbXNpLmg+Ci0KLS8qKgotICogZnNsX21jX3Jlc291cmNlX3Bvb2xfYWRkX2RldmljZSAtIGFkZCBhbGxvY2F0YWJsZSBkZXZpY2UgdG8gYSByZXNvdXJjZQotICogcG9vbCBvZiBhIGdpdmVuIE1DIGJ1cwotICoKLSAqIEBtY19idXM6IHBvaW50ZXIgdG8gdGhlIE1DIGJ1cwotICogQHBvb2xfdHlwZTogTUMgYnVzIHBvb2wgdHlwZQotICogQG1jX2RldjogUG9pbnRlciB0byBhbGxvY2F0YWJsZSBNQyBvYmplY3QgZGV2aWNlCi0gKgotICogSXQgYWRkcyBhbiBhbGxvY2F0YWJsZSBNQyBvYmplY3QgZGV2aWNlIHRvIGEgY29udGFpbmVyJ3MgcmVzb3VyY2UgcG9vbCBvZgotICogdGhlIGdpdmVuIHJlc291cmNlIHR5cGUKLSAqLwotc3RhdGljIGludCBfX211c3RfY2hlY2sgZnNsX21jX3Jlc291cmNlX3Bvb2xfYWRkX2RldmljZShzdHJ1Y3QgZnNsX21jX2J1cwotCQkJCQkJCQkqbWNfYnVzLAotCQkJCQkJCWVudW0gZnNsX21jX3Bvb2xfdHlwZQotCQkJCQkJCQlwb29sX3R5cGUsCi0JCQkJCQkJc3RydWN0IGZzbF9tY19kZXZpY2UKLQkJCQkJCQkJKm1jX2RldikKLXsKLQlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlX3Bvb2wgKnJlc19wb29sOwotCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKnJlc291cmNlOwotCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2ID0gJm1jX2J1cy0+bWNfZGV2OwotCWludCBlcnJvciA9IC1FSU5WQUw7Ci0KLQlpZiAoV0FSTl9PTihwb29sX3R5cGUgPCAwIHx8IHBvb2xfdHlwZSA+PSBGU0xfTUNfTlVNX1BPT0xfVFlQRVMpKQotCQlnb3RvIG91dDsKLQlpZiAoV0FSTl9PTighRlNMX01DX0lTX0FMTE9DQVRBQkxFKG1jX2Rldi0+b2JqX2Rlc2MudHlwZSkpKQotCQlnb3RvIG91dDsKLQlpZiAoV0FSTl9PTihtY19kZXYtPnJlc291cmNlKSkKLQkJZ290byBvdXQ7Ci0KLQlyZXNfcG9vbCA9ICZtY19idXMtPnJlc291cmNlX3Bvb2xzW3Bvb2xfdHlwZV07Ci0JaWYgKFdBUk5fT04ocmVzX3Bvb2wtPnR5cGUgIT0gcG9vbF90eXBlKSkKLQkJZ290byBvdXQ7Ci0JaWYgKFdBUk5fT04ocmVzX3Bvb2wtPm1jX2J1cyAhPSBtY19idXMpKQotCQlnb3RvIG91dDsKLQotCW11dGV4X2xvY2soJnJlc19wb29sLT5tdXRleCk7Ci0KLQlpZiAoV0FSTl9PTihyZXNfcG9vbC0+bWF4X2NvdW50IDwgMCkpCi0JCWdvdG8gb3V0X3VubG9jazsKLQlpZiAoV0FSTl9PTihyZXNfcG9vbC0+ZnJlZV9jb3VudCA8IDAgfHwKLQkJICAgIHJlc19wb29sLT5mcmVlX2NvdW50ID4gcmVzX3Bvb2wtPm1heF9jb3VudCkpCi0JCWdvdG8gb3V0X3VubG9jazsKLQotCXJlc291cmNlID0gZGV2bV9remFsbG9jKCZtY19idXNfZGV2LT5kZXYsIHNpemVvZigqcmVzb3VyY2UpLAotCQkJCUdGUF9LRVJORUwpOwotCWlmICghcmVzb3VyY2UpIHsKLQkJZXJyb3IgPSAtRU5PTUVNOwotCQlkZXZfZXJyKCZtY19idXNfZGV2LT5kZXYsCi0JCQkiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZnNsX21jX3Jlc291cmNlXG4iKTsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQotCXJlc291cmNlLT50eXBlID0gcG9vbF90eXBlOwotCXJlc291cmNlLT5pZCA9IG1jX2Rldi0+b2JqX2Rlc2MuaWQ7Ci0JcmVzb3VyY2UtPmRhdGEgPSBtY19kZXY7Ci0JcmVzb3VyY2UtPnBhcmVudF9wb29sID0gcmVzX3Bvb2w7Ci0JSU5JVF9MSVNUX0hFQUQoJnJlc291cmNlLT5ub2RlKTsKLQlsaXN0X2FkZF90YWlsKCZyZXNvdXJjZS0+bm9kZSwgJnJlc19wb29sLT5mcmVlX2xpc3QpOwotCW1jX2Rldi0+cmVzb3VyY2UgPSByZXNvdXJjZTsKLQlyZXNfcG9vbC0+ZnJlZV9jb3VudCsrOwotCXJlc19wb29sLT5tYXhfY291bnQrKzsKLQllcnJvciA9IDA7Ci1vdXRfdW5sb2NrOgotCW11dGV4X3VubG9jaygmcmVzX3Bvb2wtPm11dGV4KTsKLW91dDoKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLS8qKgotICogZnNsX21jX3Jlc291cmNlX3Bvb2xfcmVtb3ZlX2RldmljZSAtIHJlbW92ZSBhbiBhbGxvY2F0YWJsZSBkZXZpY2UgZnJvbSBhCi0gKiByZXNvdXJjZSBwb29sCi0gKgotICogQG1jX2RldjogUG9pbnRlciB0byBhbGxvY2F0YWJsZSBNQyBvYmplY3QgZGV2aWNlCi0gKgotICogSXQgcGVybWFuZW50bHkgcmVtb3ZlcyBhbiBhbGxvY2F0YWJsZSBNQyBvYmplY3QgZGV2aWNlIGZyb20gdGhlIHJlc291cmNlCi0gKiBwb29sLCB0aGUgZGV2aWNlIGlzIGN1cnJlbnRseSBpbiwgYXMgbG9uZyBhcyBpdCBpcyBpbiB0aGUgcG9vbCdzIGZyZWUgbGlzdC4KLSAqLwotc3RhdGljIGludCBfX211c3RfY2hlY2sgZnNsX21jX3Jlc291cmNlX3Bvb2xfcmVtb3ZlX2RldmljZShzdHJ1Y3QgZnNsX21jX2RldmljZQotCQkJCQkJCQkgICAqbWNfZGV2KQotewotCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2OwotCXN0cnVjdCBmc2xfbWNfYnVzICptY19idXM7Ci0Jc3RydWN0IGZzbF9tY19yZXNvdXJjZV9wb29sICpyZXNfcG9vbDsKLQlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlICpyZXNvdXJjZTsKLQlpbnQgZXJyb3IgPSAtRUlOVkFMOwotCi0JaWYgKFdBUk5fT04oIUZTTF9NQ19JU19BTExPQ0FUQUJMRShtY19kZXYtPm9ial9kZXNjLnR5cGUpKSkKLQkJZ290byBvdXQ7Ci0KLQlyZXNvdXJjZSA9IG1jX2Rldi0+cmVzb3VyY2U7Ci0JaWYgKFdBUk5fT04oIXJlc291cmNlIHx8IHJlc291cmNlLT5kYXRhICE9IG1jX2RldikpCi0JCWdvdG8gb3V0OwotCi0JbWNfYnVzX2RldiA9IHRvX2ZzbF9tY19kZXZpY2UobWNfZGV2LT5kZXYucGFyZW50KTsKLQltY19idXMgPSB0b19mc2xfbWNfYnVzKG1jX2J1c19kZXYpOwotCXJlc19wb29sID0gcmVzb3VyY2UtPnBhcmVudF9wb29sOwotCWlmIChXQVJOX09OKHJlc19wb29sICE9ICZtY19idXMtPnJlc291cmNlX3Bvb2xzW3Jlc291cmNlLT50eXBlXSkpCi0JCWdvdG8gb3V0OwotCi0JbXV0ZXhfbG9jaygmcmVzX3Bvb2wtPm11dGV4KTsKLQotCWlmIChXQVJOX09OKHJlc19wb29sLT5tYXhfY291bnQgPD0gMCkpCi0JCWdvdG8gb3V0X3VubG9jazsKLQlpZiAoV0FSTl9PTihyZXNfcG9vbC0+ZnJlZV9jb3VudCA8PSAwIHx8Ci0JCSAgICByZXNfcG9vbC0+ZnJlZV9jb3VudCA+IHJlc19wb29sLT5tYXhfY291bnQpKQotCQlnb3RvIG91dF91bmxvY2s7Ci0KLQkvKgotCSAqIElmIHRoZSBkZXZpY2UgaXMgY3VycmVudGx5IGFsbG9jYXRlZCwgaXRzIHJlc291cmNlIGlzIG5vdAotCSAqIGluIHRoZSBmcmVlIGxpc3QgYW5kIHRodXMsIHRoZSBkZXZpY2UgY2Fubm90IGJlIHJlbW92ZWQuCi0JICovCi0JaWYgKGxpc3RfZW1wdHkoJnJlc291cmNlLT5ub2RlKSkgewotCQllcnJvciA9IC1FQlVTWTsKLQkJZGV2X2VycigmbWNfYnVzX2Rldi0+ZGV2LAotCQkJIkRldmljZSAlcyBjYW5ub3QgYmUgcmVtb3ZlZCBmcm9tIHJlc291cmNlIHBvb2xcbiIsCi0JCQlkZXZfbmFtZSgmbWNfZGV2LT5kZXYpKTsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQotCWxpc3RfZGVsKCZyZXNvdXJjZS0+bm9kZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJnJlc291cmNlLT5ub2RlKTsKLQlyZXNfcG9vbC0+ZnJlZV9jb3VudC0tOwotCXJlc19wb29sLT5tYXhfY291bnQtLTsKLQotCWRldm1fa2ZyZWUoJm1jX2J1c19kZXYtPmRldiwgcmVzb3VyY2UpOwotCW1jX2Rldi0+cmVzb3VyY2UgPSBOVUxMOwotCWVycm9yID0gMDsKLW91dF91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZyZXNfcG9vbC0+bXV0ZXgpOwotb3V0OgotCXJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGZzbF9tY19wb29sX3R5cGVfc3RyaW5nc1tdID0gewotCVtGU0xfTUNfUE9PTF9EUE1DUF0gPSAiZHBtY3AiLAotCVtGU0xfTUNfUE9PTF9EUEJQXSA9ICJkcGJwIiwKLQlbRlNMX01DX1BPT0xfRFBDT05dID0gImRwY29uIiwKLQlbRlNMX01DX1BPT0xfSVJRXSA9ICJpcnEiLAotfTsKLQotc3RhdGljIGludCBfX211c3RfY2hlY2sgb2JqZWN0X3R5cGVfdG9fcG9vbF90eXBlKGNvbnN0IGNoYXIgKm9iamVjdF90eXBlLAotCQkJCQkJIGVudW0gZnNsX21jX3Bvb2xfdHlwZQotCQkJCQkJCQkqcG9vbF90eXBlKQotewotCXVuc2lnbmVkIGludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZnNsX21jX3Bvb2xfdHlwZV9zdHJpbmdzKTsgaSsrKSB7Ci0JCWlmIChzdHJjbXAob2JqZWN0X3R5cGUsIGZzbF9tY19wb29sX3R5cGVfc3RyaW5nc1tpXSkgPT0gMCkgewotCQkJKnBvb2xfdHlwZSA9IGk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1pbnQgX19tdXN0X2NoZWNrIGZzbF9tY19yZXNvdXJjZV9hbGxvY2F0ZShzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzLAotCQkJCQkgIGVudW0gZnNsX21jX3Bvb2xfdHlwZSBwb29sX3R5cGUsCi0JCQkJCSAgc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqKm5ld19yZXNvdXJjZSkKLXsKLQlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlX3Bvb2wgKnJlc19wb29sOwotCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKnJlc291cmNlOwotCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2ID0gJm1jX2J1cy0+bWNfZGV2OwotCWludCBlcnJvciA9IC1FSU5WQUw7Ci0KLQlCVUlMRF9CVUdfT04oQVJSQVlfU0laRShmc2xfbWNfcG9vbF90eXBlX3N0cmluZ3MpICE9Ci0JCSAgICAgRlNMX01DX05VTV9QT09MX1RZUEVTKTsKLQotCSpuZXdfcmVzb3VyY2UgPSBOVUxMOwotCWlmIChXQVJOX09OKHBvb2xfdHlwZSA8IDAgfHwgcG9vbF90eXBlID49IEZTTF9NQ19OVU1fUE9PTF9UWVBFUykpCi0JCWdvdG8gb3V0OwotCi0JcmVzX3Bvb2wgPSAmbWNfYnVzLT5yZXNvdXJjZV9wb29sc1twb29sX3R5cGVdOwotCWlmIChXQVJOX09OKHJlc19wb29sLT5tY19idXMgIT0gbWNfYnVzKSkKLQkJZ290byBvdXQ7Ci0KLQltdXRleF9sb2NrKCZyZXNfcG9vbC0+bXV0ZXgpOwotCXJlc291cmNlID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZyZXNfcG9vbC0+ZnJlZV9saXN0LAotCQkJCQkgICAgc3RydWN0IGZzbF9tY19yZXNvdXJjZSwgbm9kZSk7Ci0KLQlpZiAoIXJlc291cmNlKSB7Ci0JCVdBUk5fT04ocmVzX3Bvb2wtPmZyZWVfY291bnQgIT0gMCk7Ci0JCWVycm9yID0gLUVOWElPOwotCQlkZXZfZXJyKCZtY19idXNfZGV2LT5kZXYsCi0JCQkiTm8gbW9yZSByZXNvdXJjZXMgb2YgdHlwZSAlcyBsZWZ0XG4iLAotCQkJZnNsX21jX3Bvb2xfdHlwZV9zdHJpbmdzW3Bvb2xfdHlwZV0pOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCi0JaWYgKFdBUk5fT04ocmVzb3VyY2UtPnR5cGUgIT0gcG9vbF90eXBlKSkKLQkJZ290byBvdXRfdW5sb2NrOwotCWlmIChXQVJOX09OKHJlc291cmNlLT5wYXJlbnRfcG9vbCAhPSByZXNfcG9vbCkpCi0JCWdvdG8gb3V0X3VubG9jazsKLQlpZiAoV0FSTl9PTihyZXNfcG9vbC0+ZnJlZV9jb3VudCA8PSAwIHx8Ci0JCSAgICByZXNfcG9vbC0+ZnJlZV9jb3VudCA+IHJlc19wb29sLT5tYXhfY291bnQpKQotCQlnb3RvIG91dF91bmxvY2s7Ci0KLQlsaXN0X2RlbCgmcmVzb3VyY2UtPm5vZGUpOwotCUlOSVRfTElTVF9IRUFEKCZyZXNvdXJjZS0+bm9kZSk7Ci0KLQlyZXNfcG9vbC0+ZnJlZV9jb3VudC0tOwotCWVycm9yID0gMDsKLW91dF91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZyZXNfcG9vbC0+bXV0ZXgpOwotCSpuZXdfcmVzb3VyY2UgPSByZXNvdXJjZTsKLW91dDoKLQlyZXR1cm4gZXJyb3I7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfcmVzb3VyY2VfYWxsb2NhdGUpOwotCi12b2lkIGZzbF9tY19yZXNvdXJjZV9mcmVlKHN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKnJlc291cmNlKQotewotCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2VfcG9vbCAqcmVzX3Bvb2w7Ci0KLQlyZXNfcG9vbCA9IHJlc291cmNlLT5wYXJlbnRfcG9vbDsKLQlpZiAoV0FSTl9PTihyZXNvdXJjZS0+dHlwZSAhPSByZXNfcG9vbC0+dHlwZSkpCi0JCXJldHVybjsKLQotCW11dGV4X2xvY2soJnJlc19wb29sLT5tdXRleCk7Ci0JaWYgKFdBUk5fT04ocmVzX3Bvb2wtPmZyZWVfY291bnQgPCAwIHx8Ci0JCSAgICByZXNfcG9vbC0+ZnJlZV9jb3VudCA+PSByZXNfcG9vbC0+bWF4X2NvdW50KSkKLQkJZ290byBvdXRfdW5sb2NrOwotCi0JaWYgKFdBUk5fT04oIWxpc3RfZW1wdHkoJnJlc291cmNlLT5ub2RlKSkpCi0JCWdvdG8gb3V0X3VubG9jazsKLQotCWxpc3RfYWRkX3RhaWwoJnJlc291cmNlLT5ub2RlLCAmcmVzX3Bvb2wtPmZyZWVfbGlzdCk7Ci0JcmVzX3Bvb2wtPmZyZWVfY291bnQrKzsKLW91dF91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZyZXNfcG9vbC0+bXV0ZXgpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX3Jlc291cmNlX2ZyZWUpOwotCi0vKioKLSAqIGZzbF9tY19wb3J0YWxfYWxsb2NhdGUgLSBBbGxvY2F0ZXMgYW4gTUMgcG9ydGFsCi0gKgotICogQG1jX2RldjogTUMgZGV2aWNlIGZvciB3aGljaCB0aGUgTUMgcG9ydGFsIGlzIHRvIGJlIGFsbG9jYXRlZAotICogQG1jX2lvX2ZsYWdzOiBGbGFncyBmb3IgdGhlIGZzbF9tY19pbyBvYmplY3QgdGhhdCB3cmFwcyB0aGUgYWxsb2NhdGVkCi0gKiBNQyBwb3J0YWwuCi0gKiBAbmV3X21jX2lvOiBQb2ludGVyIHRvIGFyZWEgd2hlcmUgdGhlIHBvaW50ZXIgdG8gdGhlIGZzbF9tY19pbyBvYmplY3QKLSAqIHRoYXQgd3JhcHMgdGhlIGFsbG9jYXRlZCBNQyBwb3J0YWwgaXMgdG8gYmUgcmV0dXJuZWQKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhbiBNQyBwb3J0YWwgZnJvbSB0aGUgZGV2aWNlJ3MgcGFyZW50IERQUkMsCi0gKiBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIE1DIGJ1cycgcG9vbCBvZiBNQyBwb3J0YWxzIGFuZCB3cmFwcwotICogaXQgaW4gYSBuZXcgZnNsX21jX2lvIG9iamVjdC4gSWYgJ21jX2RldicgaXMgYSBEUFJDIGl0c2VsZiwgdGhlCi0gKiBwb3J0YWwgaXMgYWxsb2NhdGVkIGZyb20gaXRzIG93biBNQyBidXMuCi0gKi8KLWludCBfX211c3RfY2hlY2sgZnNsX21jX3BvcnRhbF9hbGxvY2F0ZShzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2LAotCQkJCQl1MTYgbWNfaW9fZmxhZ3MsCi0JCQkJCXN0cnVjdCBmc2xfbWNfaW8gKipuZXdfbWNfaW8pCi17Ci0Jc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXY7Ci0Jc3RydWN0IGZzbF9tY19idXMgKm1jX2J1czsKLQlwaHlzX2FkZHJfdCBtY19wb3J0YWxfcGh5c19hZGRyOwotCXNpemVfdCBtY19wb3J0YWxfc2l6ZTsKLQlzdHJ1Y3QgZnNsX21jX2RldmljZSAqZHBtY3BfZGV2OwotCWludCBlcnJvciA9IC1FSU5WQUw7Ci0Jc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqcmVzb3VyY2UgPSBOVUxMOwotCXN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvID0gTlVMTDsKLQotCWlmIChtY19kZXYtPmZsYWdzICYgRlNMX01DX0lTX0RQUkMpIHsKLQkJbWNfYnVzX2RldiA9IG1jX2RldjsKLQl9IGVsc2UgewotCQlpZiAoV0FSTl9PTihtY19kZXYtPmRldi5wYXJlbnQtPmJ1cyAhPSAmZnNsX21jX2J1c190eXBlKSkKLQkJCXJldHVybiBlcnJvcjsKLQotCQltY19idXNfZGV2ID0gdG9fZnNsX21jX2RldmljZShtY19kZXYtPmRldi5wYXJlbnQpOwotCX0KLQotCW1jX2J1cyA9IHRvX2ZzbF9tY19idXMobWNfYnVzX2Rldik7Ci0JKm5ld19tY19pbyA9IE5VTEw7Ci0JZXJyb3IgPSBmc2xfbWNfcmVzb3VyY2VfYWxsb2NhdGUobWNfYnVzLCBGU0xfTUNfUE9PTF9EUE1DUCwgJnJlc291cmNlKTsKLQlpZiAoZXJyb3IgPCAwKQotCQlyZXR1cm4gZXJyb3I7Ci0KLQllcnJvciA9IC1FSU5WQUw7Ci0JZHBtY3BfZGV2ID0gcmVzb3VyY2UtPmRhdGE7Ci0JaWYgKFdBUk5fT04oIWRwbWNwX2RldikpCi0JCWdvdG8gZXJyb3JfY2xlYW51cF9yZXNvdXJjZTsKLQotCWlmIChkcG1jcF9kZXYtPm9ial9kZXNjLnZlcl9tYWpvciA8IERQTUNQX01JTl9WRVJfTUFKT1IgfHwKLQkgICAgKGRwbWNwX2Rldi0+b2JqX2Rlc2MudmVyX21ham9yID09IERQTUNQX01JTl9WRVJfTUFKT1IgJiYKLQkgICAgIGRwbWNwX2Rldi0+b2JqX2Rlc2MudmVyX21pbm9yIDwgRFBNQ1BfTUlOX1ZFUl9NSU5PUikpIHsKLQkJZGV2X2VycigmZHBtY3BfZGV2LT5kZXYsCi0JCQkiRVJST1I6IFZlcnNpb24gJWQuJWQgb2YgRFBNQ1Agbm90IHN1cHBvcnRlZC5cbiIsCi0JCQlkcG1jcF9kZXYtPm9ial9kZXNjLnZlcl9tYWpvciwKLQkJCWRwbWNwX2Rldi0+b2JqX2Rlc2MudmVyX21pbm9yKTsKLQkJZXJyb3IgPSAtRU5PVFNVUFA7Ci0JCWdvdG8gZXJyb3JfY2xlYW51cF9yZXNvdXJjZTsKLQl9Ci0KLQlpZiAoV0FSTl9PTihkcG1jcF9kZXYtPm9ial9kZXNjLnJlZ2lvbl9jb3VudCA9PSAwKSkKLQkJZ290byBlcnJvcl9jbGVhbnVwX3Jlc291cmNlOwotCi0JbWNfcG9ydGFsX3BoeXNfYWRkciA9IGRwbWNwX2Rldi0+cmVnaW9uc1swXS5zdGFydDsKLQltY19wb3J0YWxfc2l6ZSA9IGRwbWNwX2Rldi0+cmVnaW9uc1swXS5lbmQgLQotCQkJIGRwbWNwX2Rldi0+cmVnaW9uc1swXS5zdGFydCArIDE7Ci0KLQlpZiAoV0FSTl9PTihtY19wb3J0YWxfc2l6ZSAhPSBtY19idXNfZGV2LT5tY19pby0+cG9ydGFsX3NpemUpKQotCQlnb3RvIGVycm9yX2NsZWFudXBfcmVzb3VyY2U7Ci0KLQllcnJvciA9IGZzbF9jcmVhdGVfbWNfaW8oJm1jX2J1c19kZXYtPmRldiwKLQkJCQkgbWNfcG9ydGFsX3BoeXNfYWRkciwKLQkJCQkgbWNfcG9ydGFsX3NpemUsIGRwbWNwX2RldiwKLQkJCQkgbWNfaW9fZmxhZ3MsICZtY19pbyk7Ci0JaWYgKGVycm9yIDwgMCkKLQkJZ290byBlcnJvcl9jbGVhbnVwX3Jlc291cmNlOwotCi0JKm5ld19tY19pbyA9IG1jX2lvOwotCXJldHVybiAwOwotCi1lcnJvcl9jbGVhbnVwX3Jlc291cmNlOgotCWZzbF9tY19yZXNvdXJjZV9mcmVlKHJlc291cmNlKTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfcG9ydGFsX2FsbG9jYXRlKTsKLQotLyoqCi0gKiBmc2xfbWNfcG9ydGFsX2ZyZWUgLSBSZXR1cm5zIGFuIE1DIHBvcnRhbCB0byB0aGUgcG9vbCBvZiBmcmVlIE1DIHBvcnRhbHMKLSAqIG9mIGEgZ2l2ZW4gTUMgYnVzCi0gKgotICogQG1jX2lvOiBQb2ludGVyIHRvIHRoZSBmc2xfbWNfaW8gb2JqZWN0IHRoYXQgd3JhcHMgdGhlIE1DIHBvcnRhbCB0byBmcmVlCi0gKi8KLXZvaWQgZnNsX21jX3BvcnRhbF9mcmVlKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvKQotewotCXN0cnVjdCBmc2xfbWNfZGV2aWNlICpkcG1jcF9kZXY7Ci0Jc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqcmVzb3VyY2U7Ci0KLQkvKgotCSAqIEV2ZXJ5IG1jX2lvIG9idGFpbmVkIGJ5IGNhbGxpbmcgZnNsX21jX3BvcnRhbF9hbGxvY2F0ZSgpIGlzIHN1cHBvc2VkCi0JICogdG8gaGF2ZSBhIERQTUNQIG9iamVjdCBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JZHBtY3BfZGV2ID0gbWNfaW8tPmRwbWNwX2RldjsKLQlpZiAoV0FSTl9PTighZHBtY3BfZGV2KSkKLQkJcmV0dXJuOwotCi0JcmVzb3VyY2UgPSBkcG1jcF9kZXYtPnJlc291cmNlOwotCWlmIChXQVJOX09OKCFyZXNvdXJjZSB8fCByZXNvdXJjZS0+dHlwZSAhPSBGU0xfTUNfUE9PTF9EUE1DUCkpCi0JCXJldHVybjsKLQotCWlmIChXQVJOX09OKHJlc291cmNlLT5kYXRhICE9IGRwbWNwX2RldikpCi0JCXJldHVybjsKLQotCWZzbF9kZXN0cm95X21jX2lvKG1jX2lvKTsKLQlmc2xfbWNfcmVzb3VyY2VfZnJlZShyZXNvdXJjZSk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfcG9ydGFsX2ZyZWUpOwotCi0vKioKLSAqIGZzbF9tY19wb3J0YWxfcmVzZXQgLSBSZXNldHMgdGhlIGRwbWNwIG9iamVjdCBmb3IgYSBnaXZlbiBmc2xfbWNfaW8gb2JqZWN0Ci0gKgotICogQG1jX2lvOiBQb2ludGVyIHRvIHRoZSBmc2xfbWNfaW8gb2JqZWN0IHRoYXQgd3JhcHMgdGhlIE1DIHBvcnRhbCB0byBmcmVlCi0gKi8KLWludCBmc2xfbWNfcG9ydGFsX3Jlc2V0KHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvKQotewotCWludCBlcnJvcjsKLQlzdHJ1Y3QgZnNsX21jX2RldmljZSAqZHBtY3BfZGV2ID0gbWNfaW8tPmRwbWNwX2RldjsKLQotCWlmIChXQVJOX09OKCFkcG1jcF9kZXYpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWVycm9yID0gZHBtY3BfcmVzZXQobWNfaW8sIDAsIGRwbWNwX2Rldi0+bWNfaGFuZGxlKTsKLQlpZiAoZXJyb3IgPCAwKSB7Ci0JCWRldl9lcnIoJmRwbWNwX2Rldi0+ZGV2LCAiZHBtY3BfcmVzZXQoKSBmYWlsZWQ6ICVkXG4iLCBlcnJvcik7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19wb3J0YWxfcmVzZXQpOwotCi0vKioKLSAqIGZzbF9tY19vYmplY3RfYWxsb2NhdGUgLSBBbGxvY2F0ZXMgYSBNQyBvYmplY3QgZGV2aWNlIG9mIHRoZSBnaXZlbgotICogcG9vbCB0eXBlIGZyb20gYSBnaXZlbiBNQyBidXMKLSAqCi0gKiBAbWNfZGV2OiBNQyBkZXZpY2UgZm9yIHdoaWNoIHRoZSBNQyBvYmplY3QgZGV2aWNlIGlzIHRvIGJlIGFsbG9jYXRlZAotICogQHBvb2xfdHlwZTogTUMgYnVzIHJlc291cmNlIHBvb2wgdHlwZQotICogQG5ld19tY19kZXY6IFBvaW50ZXIgdG8gYXJlYSB3aGVyZSB0aGUgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkCi0gKiBNQyBvYmplY3QgZGV2aWNlIGlzIHRvIGJlIHJldHVybmVkCi0gKgotICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYSBNQyBvYmplY3QgZGV2aWNlIGZyb20gdGhlIGRldmljZSdzIHBhcmVudCBEUFJDLAotICogZnJvbSB0aGUgY29ycmVzcG9uZGluZyBNQyBidXMnIHBvb2wgb2YgYWxsb2NhdGFibGUgTUMgb2JqZWN0IGRldmljZXMgb2YKLSAqIHRoZSBnaXZlbiByZXNvdXJjZSB0eXBlLiBtY19kZXYgY2Fubm90IGJlIGEgRFBSQyBpdHNlbGYuCi0gKgotICogTk9URTogcG9vbF90eXBlIG11c3QgYmUgZGlmZmVyZW50IGZyb20gRlNMX01DX1BPT0xfTUNQLCBzaW5jZSBNQwotICogcG9ydGFscyBhcmUgYWxsb2NhdGVkIHVzaW5nIGZzbF9tY19wb3J0YWxfYWxsb2NhdGUoKSwgaW5zdGVhZCBvZgotICogdGhpcyBmdW5jdGlvbi4KLSAqLwotaW50IF9fbXVzdF9jaGVjayBmc2xfbWNfb2JqZWN0X2FsbG9jYXRlKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYsCi0JCQkJCWVudW0gZnNsX21jX3Bvb2xfdHlwZSBwb29sX3R5cGUsCi0JCQkJCXN0cnVjdCBmc2xfbWNfZGV2aWNlICoqbmV3X21jX2FkZXYpCi17Ci0Jc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXY7Ci0Jc3RydWN0IGZzbF9tY19idXMgKm1jX2J1czsKLQlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYWRldjsKLQlpbnQgZXJyb3IgPSAtRUlOVkFMOwotCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKnJlc291cmNlID0gTlVMTDsKLQotCSpuZXdfbWNfYWRldiA9IE5VTEw7Ci0JaWYgKFdBUk5fT04obWNfZGV2LT5mbGFncyAmIEZTTF9NQ19JU19EUFJDKSkKLQkJZ290byBlcnJvcjsKLQotCWlmIChXQVJOX09OKG1jX2Rldi0+ZGV2LnBhcmVudC0+YnVzICE9ICZmc2xfbWNfYnVzX3R5cGUpKQotCQlnb3RvIGVycm9yOwotCi0JaWYgKFdBUk5fT04ocG9vbF90eXBlID09IEZTTF9NQ19QT09MX0RQTUNQKSkKLQkJZ290byBlcnJvcjsKLQotCW1jX2J1c19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKG1jX2Rldi0+ZGV2LnBhcmVudCk7Ci0JbWNfYnVzID0gdG9fZnNsX21jX2J1cyhtY19idXNfZGV2KTsKLQllcnJvciA9IGZzbF9tY19yZXNvdXJjZV9hbGxvY2F0ZShtY19idXMsIHBvb2xfdHlwZSwgJnJlc291cmNlKTsKLQlpZiAoZXJyb3IgPCAwKQotCQlnb3RvIGVycm9yOwotCi0JbWNfYWRldiA9IHJlc291cmNlLT5kYXRhOwotCWlmIChXQVJOX09OKCFtY19hZGV2KSkKLQkJZ290byBlcnJvcjsKLQotCSpuZXdfbWNfYWRldiA9IG1jX2FkZXY7Ci0JcmV0dXJuIDA7Ci1lcnJvcjoKLQlpZiAocmVzb3VyY2UpCi0JCWZzbF9tY19yZXNvdXJjZV9mcmVlKHJlc291cmNlKTsKLQotCXJldHVybiBlcnJvcjsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19vYmplY3RfYWxsb2NhdGUpOwotCi0vKioKLSAqIGZzbF9tY19vYmplY3RfZnJlZSAtIFJldHVybnMgYW4gYWxsb2NhdGFibGUgTUMgb2JqZWN0IGRldmljZSB0byB0aGUKLSAqIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgcG9vbCBvZiBhIGdpdmVuIE1DIGJ1cy4KLSAqCi0gKiBAbWNfYWRldjogUG9pbnRlciB0byB0aGUgTUMgb2JqZWN0IGRldmljZQotICovCi12b2lkIGZzbF9tY19vYmplY3RfZnJlZShzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYWRldikKLXsKLQlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlICpyZXNvdXJjZTsKLQotCXJlc291cmNlID0gbWNfYWRldi0+cmVzb3VyY2U7Ci0JaWYgKFdBUk5fT04ocmVzb3VyY2UtPnR5cGUgPT0gRlNMX01DX1BPT0xfRFBNQ1ApKQotCQlyZXR1cm47Ci0JaWYgKFdBUk5fT04ocmVzb3VyY2UtPmRhdGEgIT0gbWNfYWRldikpCi0JCXJldHVybjsKLQotCWZzbF9tY19yZXNvdXJjZV9mcmVlKHJlc291cmNlKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19vYmplY3RfZnJlZSk7Ci0KLS8qCi0gKiBJbml0aWFsaXplIHRoZSBpbnRlcnJ1cHQgcG9vbCBhc3NvY2lhdGVkIHdpdGggYSBNQyBidXMuCi0gKiBJdCBhbGxvY2F0ZXMgYSBibG9jayBvZiBJUlFzIGZyb20gdGhlIEdJQy1JVFMKLSAqLwotaW50IGZzbF9tY19wb3B1bGF0ZV9pcnFfcG9vbChzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzLAotCQkJICAgICB1bnNpZ25lZCBpbnQgaXJxX2NvdW50KQotewotCXVuc2lnbmVkIGludCBpOwotCXN0cnVjdCBtc2lfZGVzYyAqbXNpX2Rlc2M7Ci0Jc3RydWN0IGZzbF9tY19kZXZpY2VfaXJxICppcnFfcmVzb3VyY2VzOwotCXN0cnVjdCBmc2xfbWNfZGV2aWNlX2lycSAqbWNfZGV2X2lycTsKLQlpbnQgZXJyb3I7Ci0Jc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYgPSAmbWNfYnVzLT5tY19kZXY7Ci0Jc3RydWN0IGZzbF9tY19yZXNvdXJjZV9wb29sICpyZXNfcG9vbCA9Ci0JCQkmbWNfYnVzLT5yZXNvdXJjZV9wb29sc1tGU0xfTUNfUE9PTF9JUlFdOwotCi0JaWYgKFdBUk5fT04oaXJxX2NvdW50ID09IDAgfHwKLQkJICAgIGlycV9jb3VudCA+IEZTTF9NQ19JUlFfUE9PTF9NQVhfVE9UQUxfSVJRUykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZXJyb3IgPSBmc2xfbWNfbXNpX2RvbWFpbl9hbGxvY19pcnFzKCZtY19idXNfZGV2LT5kZXYsIGlycV9jb3VudCk7Ci0JaWYgKGVycm9yIDwgMCkKLQkJcmV0dXJuIGVycm9yOwotCi0JaXJxX3Jlc291cmNlcyA9IGRldm1fa3phbGxvYygmbWNfYnVzX2Rldi0+ZGV2LAotCQkJCSAgICAgc2l6ZW9mKCppcnFfcmVzb3VyY2VzKSAqIGlycV9jb3VudCwKLQkJCQkgICAgIEdGUF9LRVJORUwpOwotCWlmICghaXJxX3Jlc291cmNlcykgewotCQllcnJvciA9IC1FTk9NRU07Ci0JCWdvdG8gY2xlYW51cF9tc2lfaXJxczsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgaXJxX2NvdW50OyBpKyspIHsKLQkJbWNfZGV2X2lycSA9ICZpcnFfcmVzb3VyY2VzW2ldOwotCi0JCS8qCi0JCSAqIE5PVEU6IFRoaXMgbWNfZGV2X2lycSdzIE1TSSBhZGRyL3ZhbHVlIHBhaXIgd2lsbCBiZSBzZXQKLQkJICogYnkgdGhlIGZzbF9tY19tc2lfd3JpdGVfbXNnKCkgY2FsbGJhY2sKLQkJICovCi0JCW1jX2Rldl9pcnEtPnJlc291cmNlLnR5cGUgPSByZXNfcG9vbC0+dHlwZTsKLQkJbWNfZGV2X2lycS0+cmVzb3VyY2UuZGF0YSA9IG1jX2Rldl9pcnE7Ci0JCW1jX2Rldl9pcnEtPnJlc291cmNlLnBhcmVudF9wb29sID0gcmVzX3Bvb2w7Ci0JCUlOSVRfTElTVF9IRUFEKCZtY19kZXZfaXJxLT5yZXNvdXJjZS5ub2RlKTsKLQkJbGlzdF9hZGRfdGFpbCgmbWNfZGV2X2lycS0+cmVzb3VyY2Uubm9kZSwgJnJlc19wb29sLT5mcmVlX2xpc3QpOwotCX0KLQotCWZvcl9lYWNoX21zaV9lbnRyeShtc2lfZGVzYywgJm1jX2J1c19kZXYtPmRldikgewotCQltY19kZXZfaXJxID0gJmlycV9yZXNvdXJjZXNbbXNpX2Rlc2MtPmZzbF9tYy5tc2lfaW5kZXhdOwotCQltY19kZXZfaXJxLT5tc2lfZGVzYyA9IG1zaV9kZXNjOwotCQltY19kZXZfaXJxLT5yZXNvdXJjZS5pZCA9IG1zaV9kZXNjLT5pcnE7Ci0JfQotCi0JcmVzX3Bvb2wtPm1heF9jb3VudCA9IGlycV9jb3VudDsKLQlyZXNfcG9vbC0+ZnJlZV9jb3VudCA9IGlycV9jb3VudDsKLQltY19idXMtPmlycV9yZXNvdXJjZXMgPSBpcnFfcmVzb3VyY2VzOwotCXJldHVybiAwOwotCi1jbGVhbnVwX21zaV9pcnFzOgotCWZzbF9tY19tc2lfZG9tYWluX2ZyZWVfaXJxcygmbWNfYnVzX2Rldi0+ZGV2KTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfcG9wdWxhdGVfaXJxX3Bvb2wpOwotCi0vKioKLSAqIFRlYXJkb3duIHRoZSBpbnRlcnJ1cHQgcG9vbCBhc3NvY2lhdGVkIHdpdGggYW4gTUMgYnVzLgotICogSXQgZnJlZXMgdGhlIElSUXMgdGhhdCB3ZXJlIGFsbG9jYXRlZCB0byB0aGUgcG9vbCwgYmFjayB0byB0aGUgR0lDLUlUUy4KLSAqLwotdm9pZCBmc2xfbWNfY2xlYW51cF9pcnFfcG9vbChzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzKQotewotCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2ID0gJm1jX2J1cy0+bWNfZGV2OwotCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2VfcG9vbCAqcmVzX3Bvb2wgPQotCQkJJm1jX2J1cy0+cmVzb3VyY2VfcG9vbHNbRlNMX01DX1BPT0xfSVJRXTsKLQotCWlmIChXQVJOX09OKCFtY19idXMtPmlycV9yZXNvdXJjZXMpKQotCQlyZXR1cm47Ci0KLQlpZiAoV0FSTl9PTihyZXNfcG9vbC0+bWF4X2NvdW50ID09IDApKQotCQlyZXR1cm47Ci0KLQlpZiAoV0FSTl9PTihyZXNfcG9vbC0+ZnJlZV9jb3VudCAhPSByZXNfcG9vbC0+bWF4X2NvdW50KSkKLQkJcmV0dXJuOwotCi0JSU5JVF9MSVNUX0hFQUQoJnJlc19wb29sLT5mcmVlX2xpc3QpOwotCXJlc19wb29sLT5tYXhfY291bnQgPSAwOwotCXJlc19wb29sLT5mcmVlX2NvdW50ID0gMDsKLQltY19idXMtPmlycV9yZXNvdXJjZXMgPSBOVUxMOwotCWZzbF9tY19tc2lfZG9tYWluX2ZyZWVfaXJxcygmbWNfYnVzX2Rldi0+ZGV2KTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19jbGVhbnVwX2lycV9wb29sKTsKLQotLyoqCi0gKiBJdCBhbGxvY2F0ZXMgdGhlIElSUXMgcmVxdWlyZWQgYnkgYSBnaXZlbiBNQyBvYmplY3QgZGV2aWNlLiBUaGUKLSAqIElSUXMgYXJlIGFsbG9jYXRlZCBmcm9tIHRoZSBpbnRlcnJ1cHQgcG9vbCBhc3NvY2lhdGVkIHdpdGggdGhlCi0gKiBNQyBidXMgdGhhdCBjb250YWlucyB0aGUgZGV2aWNlLCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBhIERQUkMgZGV2aWNlLgotICogT3RoZXJ3aXNlLCB0aGUgSVJRcyBhcmUgYWxsb2NhdGVkIGZyb20gdGhlIGludGVycnVwdCBwb29sIGFzc29jaWF0ZWQKLSAqIHdpdGggdGhlIE1DIGJ1cyB0aGF0IHJlcHJlc2VudHMgdGhlIERQUkMgZGV2aWNlIGl0c2VsZi4KLSAqLwotaW50IF9fbXVzdF9jaGVjayBmc2xfbWNfYWxsb2NhdGVfaXJxcyhzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2KQotewotCWludCBpOwotCWludCBpcnFfY291bnQ7Ci0JaW50IHJlc19hbGxvY2F0ZWRfY291bnQgPSAwOwotCWludCBlcnJvciA9IC1FSU5WQUw7Ci0Jc3RydWN0IGZzbF9tY19kZXZpY2VfaXJxICoqaXJxcyA9IE5VTEw7Ci0Jc3RydWN0IGZzbF9tY19idXMgKm1jX2J1czsKLQlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlX3Bvb2wgKnJlc19wb29sOwotCi0JaWYgKFdBUk5fT04obWNfZGV2LT5pcnFzKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpcnFfY291bnQgPSBtY19kZXYtPm9ial9kZXNjLmlycV9jb3VudDsKLQlpZiAoV0FSTl9PTihpcnFfY291bnQgPT0gMCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHN0cmNtcChtY19kZXYtPm9ial9kZXNjLnR5cGUsICJkcHJjIikgPT0gMCkKLQkJbWNfYnVzID0gdG9fZnNsX21jX2J1cyhtY19kZXYpOwotCWVsc2UKLQkJbWNfYnVzID0gdG9fZnNsX21jX2J1cyh0b19mc2xfbWNfZGV2aWNlKG1jX2Rldi0+ZGV2LnBhcmVudCkpOwotCi0JaWYgKFdBUk5fT04oIW1jX2J1cy0+aXJxX3Jlc291cmNlcykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmVzX3Bvb2wgPSAmbWNfYnVzLT5yZXNvdXJjZV9wb29sc1tGU0xfTUNfUE9PTF9JUlFdOwotCWlmIChyZXNfcG9vbC0+ZnJlZV9jb3VudCA8IGlycV9jb3VudCkgewotCQlkZXZfZXJyKCZtY19kZXYtPmRldiwKLQkJCSJOb3QgYWJsZSB0byBhbGxvY2F0ZSAldSBpcnFzIGZvciBkZXZpY2VcbiIsIGlycV9jb3VudCk7Ci0JCXJldHVybiAtRU5PU1BDOwotCX0KLQotCWlycXMgPSBkZXZtX2t6YWxsb2MoJm1jX2Rldi0+ZGV2LCBpcnFfY291bnQgKiBzaXplb2YoaXJxc1swXSksCi0JCQkgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpcnFzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWZvciAoaSA9IDA7IGkgPCBpcnFfY291bnQ7IGkrKykgewotCQlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlICpyZXNvdXJjZTsKLQotCQllcnJvciA9IGZzbF9tY19yZXNvdXJjZV9hbGxvY2F0ZShtY19idXMsIEZTTF9NQ19QT09MX0lSUSwKLQkJCQkJCSAmcmVzb3VyY2UpOwotCQlpZiAoZXJyb3IgPCAwKQotCQkJZ290byBlcnJvcl9yZXNvdXJjZV9hbGxvYzsKLQotCQlpcnFzW2ldID0gdG9fZnNsX21jX2lycShyZXNvdXJjZSk7Ci0JCXJlc19hbGxvY2F0ZWRfY291bnQrKzsKLQotCQlXQVJOX09OKGlycXNbaV0tPm1jX2Rldik7Ci0JCWlycXNbaV0tPm1jX2RldiA9IG1jX2RldjsKLQkJaXJxc1tpXS0+ZGV2X2lycV9pbmRleCA9IGk7Ci0JfQotCi0JbWNfZGV2LT5pcnFzID0gaXJxczsKLQlyZXR1cm4gMDsKLQotZXJyb3JfcmVzb3VyY2VfYWxsb2M6Ci0JZm9yIChpID0gMDsgaSA8IHJlc19hbGxvY2F0ZWRfY291bnQ7IGkrKykgewotCQlpcnFzW2ldLT5tY19kZXYgPSBOVUxMOwotCQlmc2xfbWNfcmVzb3VyY2VfZnJlZSgmaXJxc1tpXS0+cmVzb3VyY2UpOwotCX0KLQotCXJldHVybiBlcnJvcjsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19hbGxvY2F0ZV9pcnFzKTsKLQotLyoKLSAqIEl0IGZyZWVzIHRoZSBJUlFzIHRoYXQgd2VyZSBhbGxvY2F0ZWQgZm9yIGEgTUMgb2JqZWN0IGRldmljZSwgYnkKLSAqIHJldHVybmluZyB0aGVtIHRvIHRoZSBjb3JyZXNwb25kaW5nIGludGVycnVwdCBwb29sLgotICovCi12b2lkIGZzbF9tY19mcmVlX2lycXMoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldikKLXsKLQlpbnQgaTsKLQlpbnQgaXJxX2NvdW50OwotCXN0cnVjdCBmc2xfbWNfYnVzICptY19idXM7Ci0Jc3RydWN0IGZzbF9tY19kZXZpY2VfaXJxICoqaXJxcyA9IG1jX2Rldi0+aXJxczsKLQotCWlmIChXQVJOX09OKCFpcnFzKSkKLQkJcmV0dXJuOwotCi0JaXJxX2NvdW50ID0gbWNfZGV2LT5vYmpfZGVzYy5pcnFfY291bnQ7Ci0KLQlpZiAoc3RyY21wKG1jX2Rldi0+b2JqX2Rlc2MudHlwZSwgImRwcmMiKSA9PSAwKQotCQltY19idXMgPSB0b19mc2xfbWNfYnVzKG1jX2Rldik7Ci0JZWxzZQotCQltY19idXMgPSB0b19mc2xfbWNfYnVzKHRvX2ZzbF9tY19kZXZpY2UobWNfZGV2LT5kZXYucGFyZW50KSk7Ci0KLQlpZiAoV0FSTl9PTighbWNfYnVzLT5pcnFfcmVzb3VyY2VzKSkKLQkJcmV0dXJuOwotCi0JZm9yIChpID0gMDsgaSA8IGlycV9jb3VudDsgaSsrKSB7Ci0JCVdBUk5fT04oIWlycXNbaV0tPm1jX2Rldik7Ci0JCWlycXNbaV0tPm1jX2RldiA9IE5VTEw7Ci0JCWZzbF9tY19yZXNvdXJjZV9mcmVlKCZpcnFzW2ldLT5yZXNvdXJjZSk7Ci0JfQotCi0JbWNfZGV2LT5pcnFzID0gTlVMTDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19mcmVlX2lycXMpOwotCi0vKioKLSAqIGZzbF9tY19hbGxvY2F0b3JfcHJvYmUgLSBjYWxsYmFjayBpbnZva2VkIHdoZW4gYW4gYWxsb2NhdGFibGUgZGV2aWNlIGlzCi0gKiBiZWluZyBhZGRlZCB0byB0aGUgc3lzdGVtCi0gKi8KLXN0YXRpYyBpbnQgZnNsX21jX2FsbG9jYXRvcl9wcm9iZShzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2KQotewotCWVudW0gZnNsX21jX3Bvb2xfdHlwZSBwb29sX3R5cGU7Ci0Jc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXY7Ci0Jc3RydWN0IGZzbF9tY19idXMgKm1jX2J1czsKLQlpbnQgZXJyb3I7Ci0KLQlpZiAoV0FSTl9PTighRlNMX01DX0lTX0FMTE9DQVRBQkxFKG1jX2Rldi0+b2JqX2Rlc2MudHlwZSkpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW1jX2J1c19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKG1jX2Rldi0+ZGV2LnBhcmVudCk7Ci0JaWYgKFdBUk5fT04obWNfYnVzX2Rldi0+ZGV2LmJ1cyAhPSAmZnNsX21jX2J1c190eXBlKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltY19idXMgPSB0b19mc2xfbWNfYnVzKG1jX2J1c19kZXYpOwotCWVycm9yID0gb2JqZWN0X3R5cGVfdG9fcG9vbF90eXBlKG1jX2Rldi0+b2JqX2Rlc2MudHlwZSwgJnBvb2xfdHlwZSk7Ci0JaWYgKGVycm9yIDwgMCkKLQkJcmV0dXJuIGVycm9yOwotCi0JZXJyb3IgPSBmc2xfbWNfcmVzb3VyY2VfcG9vbF9hZGRfZGV2aWNlKG1jX2J1cywgcG9vbF90eXBlLCBtY19kZXYpOwotCWlmIChlcnJvciA8IDApCi0JCXJldHVybiBlcnJvcjsKLQotCWRldl9kYmcoJm1jX2Rldi0+ZGV2LAotCQkiQWxsb2NhdGFibGUgTUMgb2JqZWN0IGRldmljZSBib3VuZCB0byBmc2xfbWNfYWxsb2NhdG9yIGRyaXZlciIpOwotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGZzbF9tY19hbGxvY2F0b3JfcmVtb3ZlIC0gY2FsbGJhY2sgaW52b2tlZCB3aGVuIGFuIGFsbG9jYXRhYmxlIGRldmljZSBpcwotICogYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBzeXN0ZW0KLSAqLwotc3RhdGljIGludCBmc2xfbWNfYWxsb2NhdG9yX3JlbW92ZShzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2KQotewotCWludCBlcnJvcjsKLQotCWlmIChXQVJOX09OKCFGU0xfTUNfSVNfQUxMT0NBVEFCTEUobWNfZGV2LT5vYmpfZGVzYy50eXBlKSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKG1jX2Rldi0+cmVzb3VyY2UpIHsKLQkJZXJyb3IgPSBmc2xfbWNfcmVzb3VyY2VfcG9vbF9yZW1vdmVfZGV2aWNlKG1jX2Rldik7Ci0JCWlmIChlcnJvciA8IDApCi0JCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JZGV2X2RiZygmbWNfZGV2LT5kZXYsCi0JCSJBbGxvY2F0YWJsZSBNQyBvYmplY3QgZGV2aWNlIHVuYm91bmQgZnJvbSBmc2xfbWNfYWxsb2NhdG9yIGRyaXZlciIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZzbF9tY19kZXZpY2VfaWQgbWF0Y2hfaWRfdGFibGVbXSA9IHsKLQl7Ci0JIC52ZW5kb3IgPSBGU0xfTUNfVkVORE9SX0ZSRUVTQ0FMRSwKLQkgLm9ial90eXBlID0gImRwYnAiLAotCX0sCi0JewotCSAudmVuZG9yID0gRlNMX01DX1ZFTkRPUl9GUkVFU0NBTEUsCi0JIC5vYmpfdHlwZSA9ICJkcG1jcCIsCi0JfSwKLQl7Ci0JIC52ZW5kb3IgPSBGU0xfTUNfVkVORE9SX0ZSRUVTQ0FMRSwKLQkgLm9ial90eXBlID0gImRwY29uIiwKLQl9LAotCXsudmVuZG9yID0gMHgwfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZnNsX21jX2RyaXZlciBmc2xfbWNfYWxsb2NhdG9yX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkgICAubmFtZSA9ICJmc2xfbWNfYWxsb2NhdG9yIiwKLQkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCSAgIC5wbSA9IE5VTEwsCi0JCSAgIH0sCi0JLm1hdGNoX2lkX3RhYmxlID0gbWF0Y2hfaWRfdGFibGUsCi0JLnByb2JlID0gZnNsX21jX2FsbG9jYXRvcl9wcm9iZSwKLQkucmVtb3ZlID0gZnNsX21jX2FsbG9jYXRvcl9yZW1vdmUsCi19OwotCi1pbnQgX19pbml0IGZzbF9tY19hbGxvY2F0b3JfZHJpdmVyX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gZnNsX21jX2RyaXZlcl9yZWdpc3RlcigmZnNsX21jX2FsbG9jYXRvcl9kcml2ZXIpOwotfQotCi12b2lkIGZzbF9tY19hbGxvY2F0b3JfZHJpdmVyX2V4aXQodm9pZCkKLXsKLQlmc2xfbWNfZHJpdmVyX3VucmVnaXN0ZXIoJmZzbF9tY19hbGxvY2F0b3JfZHJpdmVyKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL21jLWJ1cy5jIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvbWMtYnVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiM2FmZGIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvbWMtYnVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MTEgKzAsMCBAQAotLyoKLSAqIEZyZWVzY2FsZSBNYW5hZ2VtZW50IENvbXBsZXggKE1DKSBidXMgZHJpdmVyCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDE0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCi0gKiBBdXRob3I6IEdlcm1hbiBSaXZlcmEgPEdlcm1hbi5SaXZlcmFAZnJlZXNjYWxlLmNvbT4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQotICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICovCi0KLSNpbmNsdWRlICIuLi9pbmNsdWRlL21jLXByaXZhdGUuaCIKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L21zaS5oPgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvZHBtbmcuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL21jLXN5cy5oIgotI2luY2x1ZGUgImRwcmMtY21kLmgiCi0KLXN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqbWNfZGV2X2NhY2hlOwotCi0vKioKLSAqIGZzbF9tY19idXNfbWF0Y2ggLSBkZXZpY2UgdG8gZHJpdmVyIG1hdGNoaW5nIGNhbGxiYWNrCi0gKiBAZGV2OiB0aGUgTUMgb2JqZWN0IGRldmljZSBzdHJ1Y3R1cmUgdG8gbWF0Y2ggYWdhaW5zdAotICogQGRydjogdGhlIGRldmljZSBkcml2ZXIgdG8gc2VhcmNoIGZvciBtYXRjaGluZyBNQyBvYmplY3QgZGV2aWNlIGlkCi0gKiBzdHJ1Y3R1cmVzCi0gKgotICogUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb3RoZXJ3aXNlLgotICovCi1zdGF0aWMgaW50IGZzbF9tY19idXNfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQotewotCWNvbnN0IHN0cnVjdCBmc2xfbWNfZGV2aWNlX2lkICppZDsKLQlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2ID0gdG9fZnNsX21jX2RldmljZShkZXYpOwotCXN0cnVjdCBmc2xfbWNfZHJpdmVyICptY19kcnYgPSB0b19mc2xfbWNfZHJpdmVyKGRydik7Ci0JYm9vbCBmb3VuZCA9IGZhbHNlOwotCi0JaWYgKFdBUk5fT04oIWZzbF9tY19idXNfZXhpc3RzKCkpKQotCQlnb3RvIG91dDsKLQotCWlmICghbWNfZHJ2LT5tYXRjaF9pZF90YWJsZSkKLQkJZ290byBvdXQ7Ci0KLQkvKgotCSAqIElmIHRoZSBvYmplY3QgaXMgbm90ICdwbHVnZ2VkJyBkb24ndCBtYXRjaC4KLQkgKiBPbmx5IGV4Y2VwdGlvbiBpcyB0aGUgcm9vdCBEUFJDLCB3aGljaCBpcyBhIHNwZWNpYWwgY2FzZS4KLQkgKi8KLQlpZiAoKG1jX2Rldi0+b2JqX2Rlc2Muc3RhdGUgJiBEUFJDX09CSl9TVEFURV9QTFVHR0VEKSA9PSAwICYmCi0JICAgICFmc2xfbWNfaXNfcm9vdF9kcHJjKCZtY19kZXYtPmRldikpCi0JCWdvdG8gb3V0OwotCi0JLyoKLQkgKiBUcmF2ZXJzZSB0aGUgbWF0Y2hfaWQgdGFibGUgb2YgdGhlIGdpdmVuIGRyaXZlciwgdHJ5aW5nIHRvIGZpbmQKLQkgKiBhIG1hdGNoaW5nIGZvciB0aGUgZ2l2ZW4gTUMgb2JqZWN0IGRldmljZS4KLQkgKi8KLQlmb3IgKGlkID0gbWNfZHJ2LT5tYXRjaF9pZF90YWJsZTsgaWQtPnZlbmRvciAhPSAweDA7IGlkKyspIHsKLQkJaWYgKGlkLT52ZW5kb3IgPT0gbWNfZGV2LT5vYmpfZGVzYy52ZW5kb3IgJiYKLQkJICAgIHN0cmNtcChpZC0+b2JqX3R5cGUsIG1jX2Rldi0+b2JqX2Rlc2MudHlwZSkgPT0gMCkgewotCQkJZm91bmQgPSB0cnVlOwotCi0JCQlicmVhazsKLQkJfQotCX0KLQotb3V0OgotCWRldl9kYmcoZGV2LCAiJXNtYXRjaGVkXG4iLCBmb3VuZCA/ICIiIDogIm5vdCAiKTsKLQlyZXR1cm4gZm91bmQ7Ci19Ci0KLS8qKgotICogZnNsX21jX2J1c191ZXZlbnQgLSBjYWxsYmFjayBpbnZva2VkIHdoZW4gYSBkZXZpY2UgaXMgYWRkZWQKLSAqLwotc3RhdGljIGludCBmc2xfbWNfYnVzX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudikKLXsKLQlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2ID0gdG9fZnNsX21jX2RldmljZShkZXYpOwotCi0JaWYgKGFkZF91ZXZlbnRfdmFyKGVudiwgIk1PREFMSUFTPWZzbC1tYzp2JTA4WGQlcyIsCi0JCQkgICBtY19kZXYtPm9ial9kZXNjLnZlbmRvciwKLQkJCSAgIG1jX2Rldi0+b2JqX2Rlc2MudHlwZSkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IG1vZGFsaWFzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgY2hhciAqYnVmKQotewotCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKGRldik7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICJmc2wtbWM6diUwOFhkJXNcbiIsIG1jX2Rldi0+b2JqX2Rlc2MudmVuZG9yLAotCQkgICAgICAgbWNfZGV2LT5vYmpfZGVzYy50eXBlKTsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUl9STyhtb2RhbGlhcyk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpmc2xfbWNfZGV2X2F0dHJzW10gPSB7Ci0JJmRldl9hdHRyX21vZGFsaWFzLmF0dHIsCi0JTlVMTCwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGZzbF9tY19kZXZfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gZnNsX21jX2Rldl9hdHRycywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpmc2xfbWNfZGV2X2dyb3Vwc1tdID0gewotCSZmc2xfbWNfZGV2X2dyb3VwLAotCU5VTEwsCi19OwotCi1zdHJ1Y3QgYnVzX3R5cGUgZnNsX21jX2J1c190eXBlID0gewotCS5uYW1lID0gImZzbC1tYyIsCi0JLm1hdGNoID0gZnNsX21jX2J1c19tYXRjaCwKLQkudWV2ZW50ID0gZnNsX21jX2J1c191ZXZlbnQsCi0JLmRldl9ncm91cHMgPSBmc2xfbWNfZGV2X2dyb3VwcywKLX07Ci1FWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfYnVzX3R5cGUpOwotCi1zdGF0aWMgYXRvbWljX3Qgcm9vdF9kcHJjX2NvdW50ID0gQVRPTUlDX0lOSVQoMCk7Ci0KLXN0YXRpYyBpbnQgZnNsX21jX2RyaXZlcl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGZzbF9tY19kcml2ZXIgKm1jX2RydjsKLQlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2ID0gdG9fZnNsX21jX2RldmljZShkZXYpOwotCWludCBlcnJvcjsKLQotCWlmIChXQVJOX09OKCFkZXYtPmRyaXZlcikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbWNfZHJ2ID0gdG9fZnNsX21jX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0JaWYgKFdBUk5fT04oIW1jX2Rydi0+cHJvYmUpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWVycm9yID0gbWNfZHJ2LT5wcm9iZShtY19kZXYpOwotCWlmIChlcnJvciA8IDApIHsKLQkJZGV2X2VycihkZXYsICJNQyBvYmplY3QgZGV2aWNlIHByb2JlIGNhbGxiYWNrIGZhaWxlZDogJWRcbiIsCi0JCQllcnJvcik7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBmc2xfbWNfZHJpdmVyX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGZzbF9tY19kcml2ZXIgKm1jX2RydiA9IHRvX2ZzbF9tY19kcml2ZXIoZGV2LT5kcml2ZXIpOwotCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKGRldik7Ci0JaW50IGVycm9yOwotCi0JaWYgKFdBUk5fT04oIWRldi0+ZHJpdmVyKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQllcnJvciA9IG1jX2Rydi0+cmVtb3ZlKG1jX2Rldik7Ci0JaWYgKGVycm9yIDwgMCkgewotCQlkZXZfZXJyKGRldiwKLQkJCSJNQyBvYmplY3QgZGV2aWNlIHJlbW92ZSBjYWxsYmFjayBmYWlsZWQ6ICVkXG4iLAotCQkJZXJyb3IpOwotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGZzbF9tY19kcml2ZXJfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBmc2xfbWNfZHJpdmVyICptY19kcnYgPSB0b19mc2xfbWNfZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2ID0gdG9fZnNsX21jX2RldmljZShkZXYpOwotCi0JbWNfZHJ2LT5zaHV0ZG93bihtY19kZXYpOwotfQotCi0vKioKLSAqIF9fZnNsX21jX2RyaXZlcl9yZWdpc3RlciAtIHJlZ2lzdGVycyBhIGNoaWxkIGRldmljZSBkcml2ZXIgd2l0aCB0aGUKLSAqIE1DIGJ1cwotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgaW1wbGljaXRseSBpbnZva2VkIGZyb20gdGhlIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBvZgotICogZnNsX21jIGRldmljZSBkcml2ZXJzLCB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgdGhlCi0gKiBtb2R1bGVfZnNsX21jX2RyaXZlcigpIG1hY3JvLgotICovCi1pbnQgX19mc2xfbWNfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBmc2xfbWNfZHJpdmVyICptY19kcml2ZXIsCi0JCQkgICAgIHN0cnVjdCBtb2R1bGUgKm93bmVyKQotewotCWludCBlcnJvcjsKLQotCW1jX2RyaXZlci0+ZHJpdmVyLm93bmVyID0gb3duZXI7Ci0JbWNfZHJpdmVyLT5kcml2ZXIuYnVzID0gJmZzbF9tY19idXNfdHlwZTsKLQotCWlmIChtY19kcml2ZXItPnByb2JlKQotCQltY19kcml2ZXItPmRyaXZlci5wcm9iZSA9IGZzbF9tY19kcml2ZXJfcHJvYmU7Ci0KLQlpZiAobWNfZHJpdmVyLT5yZW1vdmUpCi0JCW1jX2RyaXZlci0+ZHJpdmVyLnJlbW92ZSA9IGZzbF9tY19kcml2ZXJfcmVtb3ZlOwotCi0JaWYgKG1jX2RyaXZlci0+c2h1dGRvd24pCi0JCW1jX2RyaXZlci0+ZHJpdmVyLnNodXRkb3duID0gZnNsX21jX2RyaXZlcl9zaHV0ZG93bjsKLQotCWVycm9yID0gZHJpdmVyX3JlZ2lzdGVyKCZtY19kcml2ZXItPmRyaXZlcik7Ci0JaWYgKGVycm9yIDwgMCkgewotCQlwcl9lcnIoImRyaXZlcl9yZWdpc3RlcigpIGZhaWxlZCBmb3IgJXM6ICVkXG4iLAotCQkgICAgICAgbWNfZHJpdmVyLT5kcml2ZXIubmFtZSwgZXJyb3IpOwotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JcHJfaW5mbygiTUMgb2JqZWN0IGRldmljZSBkcml2ZXIgJXMgcmVnaXN0ZXJlZFxuIiwKLQkJbWNfZHJpdmVyLT5kcml2ZXIubmFtZSk7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChfX2ZzbF9tY19kcml2ZXJfcmVnaXN0ZXIpOwotCi0vKioKLSAqIGZzbF9tY19kcml2ZXJfdW5yZWdpc3RlciAtIHVucmVnaXN0ZXJzIGEgZGV2aWNlIGRyaXZlciBmcm9tIHRoZQotICogTUMgYnVzCi0gKi8KLXZvaWQgZnNsX21jX2RyaXZlcl91bnJlZ2lzdGVyKHN0cnVjdCBmc2xfbWNfZHJpdmVyICptY19kcml2ZXIpCi17Ci0JZHJpdmVyX3VucmVnaXN0ZXIoJm1jX2RyaXZlci0+ZHJpdmVyKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19kcml2ZXJfdW5yZWdpc3Rlcik7Ci0KLS8qKgotICogZnNsX21jX2J1c19leGlzdHMgLSBjaGVjayBpZiBhIHJvb3QgZHByYyBleGlzdHMKLSAqLwotYm9vbCBmc2xfbWNfYnVzX2V4aXN0cyh2b2lkKQotewotCXJldHVybiBhdG9taWNfcmVhZCgmcm9vdF9kcHJjX2NvdW50KSA+IDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfYnVzX2V4aXN0cyk7Ci0KLS8qKgotKiBmc2xfbWNfZ2V0X3Jvb3RfZHByYyAtIGZ1bmN0aW9uIHRvIHRyYXZlcnNlIHRvIHRoZSByb290IGRwcmMKLSovCi1zdGF0aWMgdm9pZCBmc2xfbWNfZ2V0X3Jvb3RfZHByYyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJIHN0cnVjdCBkZXZpY2UgKipyb290X2RwcmNfZGV2KQotewotCWlmIChXQVJOX09OKCFkZXYpKSB7Ci0JCSpyb290X2RwcmNfZGV2ID0gTlVMTDsKLQl9IGVsc2UgaWYgKFdBUk5fT04oZGV2LT5idXMgIT0gJmZzbF9tY19idXNfdHlwZSkpIHsKLQkJKnJvb3RfZHByY19kZXYgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCSpyb290X2RwcmNfZGV2ID0gZGV2OwotCQl3aGlsZSAoKCpyb290X2RwcmNfZGV2KS0+cGFyZW50LT5idXMgPT0gJmZzbF9tY19idXNfdHlwZSkKLQkJCSpyb290X2RwcmNfZGV2ID0gKCpyb290X2RwcmNfZGV2KS0+cGFyZW50OwotCX0KLX0KLQotc3RhdGljIGludCBnZXRfZHByY19hdHRyKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAotCQkJIGludCBjb250YWluZXJfaWQsIHN0cnVjdCBkcHJjX2F0dHJpYnV0ZXMgKmF0dHIpCi17Ci0JdTE2IGRwcmNfaGFuZGxlOwotCWludCBlcnJvcjsKLQotCWVycm9yID0gZHByY19vcGVuKG1jX2lvLCAwLCBjb250YWluZXJfaWQsICZkcHJjX2hhbmRsZSk7Ci0JaWYgKGVycm9yIDwgMCkgewotCQlkZXZfZXJyKG1jX2lvLT5kZXYsICJkcHJjX29wZW4oKSBmYWlsZWQ6ICVkXG4iLCBlcnJvcik7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0KLQltZW1zZXQoYXR0ciwgMCwgc2l6ZW9mKHN0cnVjdCBkcHJjX2F0dHJpYnV0ZXMpKTsKLQllcnJvciA9IGRwcmNfZ2V0X2F0dHJpYnV0ZXMobWNfaW8sIDAsIGRwcmNfaGFuZGxlLCBhdHRyKTsKLQlpZiAoZXJyb3IgPCAwKSB7Ci0JCWRldl9lcnIobWNfaW8tPmRldiwgImRwcmNfZ2V0X2F0dHJpYnV0ZXMoKSBmYWlsZWQ6ICVkXG4iLAotCQkJZXJyb3IpOwotCQlnb3RvIGNvbW1vbl9jbGVhbnVwOwotCX0KLQotCWVycm9yID0gMDsKLQotY29tbW9uX2NsZWFudXA6Ci0JKHZvaWQpZHByY19jbG9zZShtY19pbywgMCwgZHByY19oYW5kbGUpOwotCXJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIGludCBnZXRfZHByY19pY2lkKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAotCQkJIGludCBjb250YWluZXJfaWQsIHUxNiAqaWNpZCkKLXsKLQlzdHJ1Y3QgZHByY19hdHRyaWJ1dGVzIGF0dHI7Ci0JaW50IGVycm9yOwotCi0JZXJyb3IgPSBnZXRfZHByY19hdHRyKG1jX2lvLCBjb250YWluZXJfaWQsICZhdHRyKTsKLQlpZiAoZXJyb3IgPT0gMCkKLQkJKmljaWQgPSBhdHRyLmljaWQ7Ci0KLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2RwcmNfdmVyc2lvbihzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKLQkJCSAgICBpbnQgY29udGFpbmVyX2lkLCB1MTYgKm1ham9yLCB1MTYgKm1pbm9yKQotewotCXN0cnVjdCBkcHJjX2F0dHJpYnV0ZXMgYXR0cjsKLQlpbnQgZXJyb3I7Ci0KLQllcnJvciA9IGdldF9kcHJjX2F0dHIobWNfaW8sIGNvbnRhaW5lcl9pZCwgJmF0dHIpOwotCWlmIChlcnJvciA9PSAwKSB7Ci0JCSptYWpvciA9IGF0dHIudmVyc2lvbi5tYWpvcjsKLQkJKm1pbm9yID0gYXR0ci52ZXJzaW9uLm1pbm9yOwotCX0KLQotCXJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIGludCB0cmFuc2xhdGVfbWNfYWRkcihzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2LAotCQkJICAgICBlbnVtIGRwcmNfcmVnaW9uX3R5cGUgbWNfcmVnaW9uX3R5cGUsCi0JCQkgICAgIHU2NCBtY19vZmZzZXQsIHBoeXNfYWRkcl90ICpwaHlzX2FkZHIpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IGRldmljZSAqcm9vdF9kcHJjX2RldjsKLQlzdHJ1Y3QgZnNsX21jICptYzsKLQotCWZzbF9tY19nZXRfcm9vdF9kcHJjKCZtY19kZXYtPmRldiwgJnJvb3RfZHByY19kZXYpOwotCWlmIChXQVJOX09OKCFyb290X2RwcmNfZGV2KSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JbWMgPSBkZXZfZ2V0X2RydmRhdGEocm9vdF9kcHJjX2Rldi0+cGFyZW50KTsKLQotCWlmIChtYy0+bnVtX3RyYW5zbGF0aW9uX3JhbmdlcyA9PSAwKSB7Ci0JCS8qCi0JCSAqIERvIGlkZW50aXR5IG1hcHBpbmc6Ci0JCSAqLwotCQkqcGh5c19hZGRyID0gbWNfb2Zmc2V0OwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbWMtPm51bV90cmFuc2xhdGlvbl9yYW5nZXM7IGkrKykgewotCQlzdHJ1Y3QgZnNsX21jX2FkZHJfdHJhbnNsYXRpb25fcmFuZ2UgKnJhbmdlID0KLQkJCSZtYy0+dHJhbnNsYXRpb25fcmFuZ2VzW2ldOwotCi0JCWlmIChtY19yZWdpb25fdHlwZSA9PSByYW5nZS0+bWNfcmVnaW9uX3R5cGUgJiYKLQkJICAgIG1jX29mZnNldCA+PSByYW5nZS0+c3RhcnRfbWNfb2Zmc2V0ICYmCi0JCSAgICBtY19vZmZzZXQgPCByYW5nZS0+ZW5kX21jX29mZnNldCkgewotCQkJKnBoeXNfYWRkciA9IHJhbmdlLT5zdGFydF9waHlzX2FkZHIgKwotCQkJCSAgICAgKG1jX29mZnNldCAtIHJhbmdlLT5zdGFydF9tY19vZmZzZXQpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gLUVGQVVMVDsKLX0KLQotc3RhdGljIGludCBmc2xfbWNfZGV2aWNlX2dldF9tbWlvX3JlZ2lvbnMoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldiwKLQkJCQkJICBzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldikKLXsKLQlpbnQgaTsKLQlpbnQgZXJyb3I7Ci0Jc3RydWN0IHJlc291cmNlICpyZWdpb25zOwotCXN0cnVjdCBkcHJjX29ial9kZXNjICpvYmpfZGVzYyA9ICZtY19kZXYtPm9ial9kZXNjOwotCXN0cnVjdCBkZXZpY2UgKnBhcmVudF9kZXYgPSBtY19kZXYtPmRldi5wYXJlbnQ7Ci0JZW51bSBkcHJjX3JlZ2lvbl90eXBlIG1jX3JlZ2lvbl90eXBlOwotCi0JaWYgKHN0cmNtcChvYmpfZGVzYy0+dHlwZSwgImRwcmMiKSA9PSAwIHx8Ci0JICAgIHN0cmNtcChvYmpfZGVzYy0+dHlwZSwgImRwbWNwIikgPT0gMCkgewotCQltY19yZWdpb25fdHlwZSA9IERQUkNfUkVHSU9OX1RZUEVfTUNfUE9SVEFMOwotCX0gZWxzZSBpZiAoc3RyY21wKG9ial9kZXNjLT50eXBlLCAiZHBpbyIpID09IDApIHsKLQkJbWNfcmVnaW9uX3R5cGUgPSBEUFJDX1JFR0lPTl9UWVBFX1FCTUFOX1BPUlRBTDsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgaGF2ZSBiZWVuIGNhbGxlZCBmb3IgdGhpcyBNQyBvYmplY3QKLQkJICogdHlwZSwgYXMgdGhpcyBvYmplY3QgdHlwZSBpcyBub3Qgc3VwcG9zZWQgdG8gaGF2ZSBNTUlPCi0JCSAqIHJlZ2lvbnMKLQkJICovCi0JCVdBUk5fT04odHJ1ZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJlZ2lvbnMgPSBrbWFsbG9jX2FycmF5KG9ial9kZXNjLT5yZWdpb25fY291bnQsCi0JCQkJc2l6ZW9mKHJlZ2lvbnNbMF0pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJlZ2lvbnMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZm9yIChpID0gMDsgaSA8IG9ial9kZXNjLT5yZWdpb25fY291bnQ7IGkrKykgewotCQlzdHJ1Y3QgZHByY19yZWdpb25fZGVzYyByZWdpb25fZGVzYzsKLQotCQllcnJvciA9IGRwcmNfZ2V0X29ial9yZWdpb24obWNfYnVzX2Rldi0+bWNfaW8sCi0JCQkJCSAgICAwLAotCQkJCQkgICAgbWNfYnVzX2Rldi0+bWNfaGFuZGxlLAotCQkJCQkgICAgb2JqX2Rlc2MtPnR5cGUsCi0JCQkJCSAgICBvYmpfZGVzYy0+aWQsIGksICZyZWdpb25fZGVzYyk7Ci0JCWlmIChlcnJvciA8IDApIHsKLQkJCWRldl9lcnIocGFyZW50X2RldiwKLQkJCQkiZHByY19nZXRfb2JqX3JlZ2lvbigpIGZhaWxlZDogJWRcbiIsIGVycm9yKTsKLQkJCWdvdG8gZXJyb3JfY2xlYW51cF9yZWdpb25zOwotCQl9Ci0KLQkJV0FSTl9PTihyZWdpb25fZGVzYy5zaXplID09IDApOwotCQllcnJvciA9IHRyYW5zbGF0ZV9tY19hZGRyKG1jX2RldiwgbWNfcmVnaW9uX3R5cGUsCi0JCQkJCSAgcmVnaW9uX2Rlc2MuYmFzZV9vZmZzZXQsCi0JCQkJCSAgJnJlZ2lvbnNbaV0uc3RhcnQpOwotCQlpZiAoZXJyb3IgPCAwKSB7Ci0JCQlkZXZfZXJyKHBhcmVudF9kZXYsCi0JCQkJIkludmFsaWQgTUMgb2Zmc2V0OiAlI3ggKGZvciAlcy4lZFwncyByZWdpb24gJWQpXG4iLAotCQkJCXJlZ2lvbl9kZXNjLmJhc2Vfb2Zmc2V0LAotCQkJCW9ial9kZXNjLT50eXBlLCBvYmpfZGVzYy0+aWQsIGkpOwotCQkJZ290byBlcnJvcl9jbGVhbnVwX3JlZ2lvbnM7Ci0JCX0KLQotCQlyZWdpb25zW2ldLmVuZCA9IHJlZ2lvbnNbaV0uc3RhcnQgKyByZWdpb25fZGVzYy5zaXplIC0gMTsKLQkJcmVnaW9uc1tpXS5uYW1lID0gImZzbC1tYyBvYmplY3QgTU1JTyByZWdpb24iOwotCQlyZWdpb25zW2ldLmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKLQkJaWYgKHJlZ2lvbl9kZXNjLmZsYWdzICYgRFBSQ19SRUdJT05fQ0FDSEVBQkxFKQotCQkJcmVnaW9uc1tpXS5mbGFncyB8PSBJT1JFU09VUkNFX0NBQ0hFQUJMRTsKLQl9Ci0KLQltY19kZXYtPnJlZ2lvbnMgPSByZWdpb25zOwotCXJldHVybiAwOwotCi1lcnJvcl9jbGVhbnVwX3JlZ2lvbnM6Ci0Ja2ZyZWUocmVnaW9ucyk7Ci0JcmV0dXJuIGVycm9yOwotfQotCi0vKioKLSAqIGZzbF9tY19pc19yb290X2RwcmMgLSBmdW5jdGlvbiB0byBjaGVjayBpZiBhIGdpdmVuIGRldmljZSBpcyBhIHJvb3QgZHByYwotICovCi1ib29sIGZzbF9tY19pc19yb290X2RwcmMoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBkZXZpY2UgKnJvb3RfZHByY19kZXY7Ci0KLQlmc2xfbWNfZ2V0X3Jvb3RfZHByYyhkZXYsICZyb290X2RwcmNfZGV2KTsKLQlpZiAoIXJvb3RfZHByY19kZXYpCi0JCXJldHVybiBmYWxzZTsKLQlyZXR1cm4gZGV2ID09IHJvb3RfZHByY19kZXY7Ci19Ci0KLS8qKgotICogQWRkIGEgbmV3bHkgZGlzY292ZXJlZCBNQyBvYmplY3QgZGV2aWNlIHRvIGJlIHZpc2libGUgaW4gTGludXgKLSAqLwotaW50IGZzbF9tY19kZXZpY2VfYWRkKHN0cnVjdCBkcHJjX29ial9kZXNjICpvYmpfZGVzYywKLQkJICAgICAgc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCi0JCSAgICAgIHN0cnVjdCBkZXZpY2UgKnBhcmVudF9kZXYsCi0JCSAgICAgIHN0cnVjdCBmc2xfbWNfZGV2aWNlICoqbmV3X21jX2RldikKLXsKLQlpbnQgZXJyb3I7Ci0Jc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldiA9IE5VTEw7Ci0Jc3RydWN0IGZzbF9tY19idXMgKm1jX2J1cyA9IE5VTEw7Ci0Jc3RydWN0IGZzbF9tY19kZXZpY2UgKnBhcmVudF9tY19kZXY7Ci0KLQlpZiAocGFyZW50X2Rldi0+YnVzID09ICZmc2xfbWNfYnVzX3R5cGUpCi0JCXBhcmVudF9tY19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKHBhcmVudF9kZXYpOwotCWVsc2UKLQkJcGFyZW50X21jX2RldiA9IE5VTEw7Ci0KLQlpZiAoc3RyY21wKG9ial9kZXNjLT50eXBlLCAiZHByYyIpID09IDApIHsKLQkJLyoKLQkJICogQWxsb2NhdGUgYW4gTUMgYnVzIGRldmljZSBvYmplY3Q6Ci0JCSAqLwotCQltY19idXMgPSBkZXZtX2t6YWxsb2MocGFyZW50X2Rldiwgc2l6ZW9mKCptY19idXMpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFtY19idXMpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQltY19kZXYgPSAmbWNfYnVzLT5tY19kZXY7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogQWxsb2NhdGUgYSByZWd1bGFyIGZzbF9tY19kZXZpY2Ugb2JqZWN0OgotCQkgKi8KLQkJbWNfZGV2ID0ga21lbV9jYWNoZV96YWxsb2MobWNfZGV2X2NhY2hlLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFtY19kZXYpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQltY19kZXYtPm9ial9kZXNjID0gKm9ial9kZXNjOwotCW1jX2Rldi0+bWNfaW8gPSBtY19pbzsKLQlkZXZpY2VfaW5pdGlhbGl6ZSgmbWNfZGV2LT5kZXYpOwotCW1jX2Rldi0+ZGV2LnBhcmVudCA9IHBhcmVudF9kZXY7Ci0JbWNfZGV2LT5kZXYuYnVzID0gJmZzbF9tY19idXNfdHlwZTsKLQlkZXZfc2V0X25hbWUoJm1jX2Rldi0+ZGV2LCAiJXMuJWQiLCBvYmpfZGVzYy0+dHlwZSwgb2JqX2Rlc2MtPmlkKTsKLQotCWlmIChzdHJjbXAob2JqX2Rlc2MtPnR5cGUsICJkcHJjIikgPT0gMCkgewotCQlzdHJ1Y3QgZnNsX21jX2lvICptY19pbzI7Ci0KLQkJbWNfZGV2LT5mbGFncyB8PSBGU0xfTUNfSVNfRFBSQzsKLQotCQkvKgotCQkgKiBUbyBnZXQgdGhlIERQUkMncyBJQ0lELCB3ZSBuZWVkIHRvIG9wZW4gdGhlIERQUkMKLQkJICogaW4gZ2V0X2RwcmNfaWNpZCgpLiBGb3IgY2hpbGQgRFBSQ3MsIHdlIGRvIHNvIHVzaW5nIHRoZQotCQkgKiBwYXJlbnQgRFBSQydzIE1DIHBvcnRhbCBpbnN0ZWFkIG9mIHRoZSBjaGlsZCBEUFJDJ3MgTUMKLQkJICogcG9ydGFsLCBpbiBjYXNlIHRoZSBjaGlsZCBEUFJDIGlzIGFscmVhZHkgb3BlbmVkIHdpdGgKLQkJICogaXRzIG93biBwb3J0YWwgKGUuZy4sIHRoZSBEUFJDIHVzZWQgYnkgQUlPUCkuCi0JCSAqCi0JCSAqIE5PVEU6IFRoZXJlIGNhbm5vdCBiZSBtb3JlIHRoYW4gb25lIGFjdGl2ZSBvcGVuIGZvciBhCi0JCSAqIGdpdmVuIE1DIG9iamVjdCwgdXNpbmcgdGhlIHNhbWUgTUMgcG9ydGFsLgotCQkgKi8KLQkJaWYgKHBhcmVudF9tY19kZXYpIHsKLQkJCS8qCi0JCQkgKiBkZXZpY2UgYmVpbmcgYWRkZWQgaXMgYSBjaGlsZCBEUFJDIGRldmljZQotCQkJICovCi0JCQltY19pbzIgPSBwYXJlbnRfbWNfZGV2LT5tY19pbzsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBkZXZpY2UgYmVpbmcgYWRkZWQgaXMgdGhlIHJvb3QgRFBSQyBkZXZpY2UKLQkJCSAqLwotCQkJaWYgKFdBUk5fT04oIW1jX2lvKSkgewotCQkJCWVycm9yID0gLUVJTlZBTDsKLQkJCQlnb3RvIGVycm9yX2NsZWFudXBfZGV2OwotCQkJfQotCi0JCQltY19pbzIgPSBtY19pbzsKLQotCQkJYXRvbWljX2luYygmcm9vdF9kcHJjX2NvdW50KTsKLQkJfQotCi0JCWVycm9yID0gZ2V0X2RwcmNfaWNpZChtY19pbzIsIG9ial9kZXNjLT5pZCwgJm1jX2Rldi0+aWNpZCk7Ci0JCWlmIChlcnJvciA8IDApCi0JCQlnb3RvIGVycm9yX2NsZWFudXBfZGV2OwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIEEgbm9uLURQUkMgTUMgb2JqZWN0IGRldmljZSBoYXMgdG8gYmUgYSBjaGlsZCBvZiBhbm90aGVyCi0JCSAqIE1DIG9iamVjdCAoc3BlY2lmaWNhbGx5IGEgRFBSQyBvYmplY3QpCi0JCSAqLwotCQltY19kZXYtPmljaWQgPSBwYXJlbnRfbWNfZGV2LT5pY2lkOwotCQltY19kZXYtPmRtYV9tYXNrID0gRlNMX01DX0RFRkFVTFRfRE1BX01BU0s7Ci0JCW1jX2Rldi0+ZGV2LmRtYV9tYXNrID0gJm1jX2Rldi0+ZG1hX21hc2s7Ci0JCWRldl9zZXRfbXNpX2RvbWFpbigmbWNfZGV2LT5kZXYsCi0JCQkJICAgZGV2X2dldF9tc2lfZG9tYWluKCZwYXJlbnRfbWNfZGV2LT5kZXYpKTsKLQl9Ci0KLQkvKgotCSAqIEdldCBNTUlPIHJlZ2lvbnMgZm9yIHRoZSBkZXZpY2UgZnJvbSB0aGUgTUM6Ci0JICoKLQkgKiBOT1RFOiB0aGUgcm9vdCBEUFJDIGlzIGEgc3BlY2lhbCBjYXNlIGFzIGl0cyBNTUlPIHJlZ2lvbiBpcwotCSAqIG9idGFpbmVkIGZyb20gdGhlIGRldmljZSB0cmVlCi0JICovCi0JaWYgKHBhcmVudF9tY19kZXYgJiYgb2JqX2Rlc2MtPnJlZ2lvbl9jb3VudCAhPSAwKSB7Ci0JCWVycm9yID0gZnNsX21jX2RldmljZV9nZXRfbW1pb19yZWdpb25zKG1jX2RldiwKLQkJCQkJCSAgICAgICBwYXJlbnRfbWNfZGV2KTsKLQkJaWYgKGVycm9yIDwgMCkKLQkJCWdvdG8gZXJyb3JfY2xlYW51cF9kZXY7Ci0JfQotCi0JLyogT2JqZWN0cyBhcmUgY29oZXJlbnQsIHVubGVzcyAnbm8gc2hhcmVhYmlsaXR5JyBmbGFnIHNldC4gKi8KLQlpZiAoIShvYmpfZGVzYy0+ZmxhZ3MgJiBEUFJDX09CSl9GTEFHX05PX01FTV9TSEFSRUFCSUxJVFkpKQotCQlhcmNoX3NldHVwX2RtYV9vcHMoJm1jX2Rldi0+ZGV2LCAwLCAwLCBOVUxMLCB0cnVlKTsKLQotCS8qCi0JICogVGhlIGRldmljZS1zcGVjaWZpYyBwcm9iZSBjYWxsYmFjayB3aWxsIGdldCBpbnZva2VkIGJ5IGRldmljZV9hZGQoKQotCSAqLwotCWVycm9yID0gZGV2aWNlX2FkZCgmbWNfZGV2LT5kZXYpOwotCWlmIChlcnJvciA8IDApIHsKLQkJZGV2X2VycihwYXJlbnRfZGV2LAotCQkJImRldmljZV9hZGQoKSBmYWlsZWQgZm9yIGRldmljZSAlczogJWRcbiIsCi0JCQlkZXZfbmFtZSgmbWNfZGV2LT5kZXYpLCBlcnJvcik7Ci0JCWdvdG8gZXJyb3JfY2xlYW51cF9kZXY7Ci0JfQotCi0JKHZvaWQpZ2V0X2RldmljZSgmbWNfZGV2LT5kZXYpOwotCWRldl9kYmcocGFyZW50X2RldiwgIkFkZGVkIE1DIG9iamVjdCBkZXZpY2UgJXNcbiIsCi0JCWRldl9uYW1lKCZtY19kZXYtPmRldikpOwotCi0JKm5ld19tY19kZXYgPSBtY19kZXY7Ci0JcmV0dXJuIDA7Ci0KLWVycm9yX2NsZWFudXBfZGV2OgotCWtmcmVlKG1jX2Rldi0+cmVnaW9ucyk7Ci0JaWYgKG1jX2J1cykKLQkJZGV2bV9rZnJlZShwYXJlbnRfZGV2LCBtY19idXMpOwotCWVsc2UKLQkJa21lbV9jYWNoZV9mcmVlKG1jX2Rldl9jYWNoZSwgbWNfZGV2KTsKLQotCXJldHVybiBlcnJvcjsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19kZXZpY2VfYWRkKTsKLQotLyoqCi0gKiBmc2xfbWNfZGV2aWNlX3JlbW92ZSAtIFJlbW92ZSBhIE1DIG9iamVjdCBkZXZpY2UgZnJvbSBiZWluZyB2aXNpYmxlIHRvCi0gKiBMaW51eAotICoKLSAqIEBtY19kZXY6IFBvaW50ZXIgdG8gYSBNQyBvYmplY3QgZGV2aWNlIG9iamVjdAotICovCi12b2lkIGZzbF9tY19kZXZpY2VfcmVtb3ZlKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYpCi17Ci0Jc3RydWN0IGZzbF9tY19idXMgKm1jX2J1cyA9IE5VTEw7Ci0KLQlrZnJlZShtY19kZXYtPnJlZ2lvbnMpOwotCi0JLyoKLQkgKiBUaGUgZGV2aWNlLXNwZWNpZmljIHJlbW92ZSBjYWxsYmFjayB3aWxsIGdldCBpbnZva2VkIGJ5IGRldmljZV9kZWwoKQotCSAqLwotCWRldmljZV9kZWwoJm1jX2Rldi0+ZGV2KTsKLQlwdXRfZGV2aWNlKCZtY19kZXYtPmRldik7Ci0KLQlpZiAoc3RyY21wKG1jX2Rldi0+b2JqX2Rlc2MudHlwZSwgImRwcmMiKSA9PSAwKSB7Ci0JCW1jX2J1cyA9IHRvX2ZzbF9tY19idXMobWNfZGV2KTsKLQotCQlpZiAoZnNsX21jX2lzX3Jvb3RfZHByYygmbWNfZGV2LT5kZXYpKSB7Ci0JCQlpZiAoYXRvbWljX3JlYWQoJnJvb3RfZHByY19jb3VudCkgPiAwKQotCQkJCWF0b21pY19kZWMoJnJvb3RfZHByY19jb3VudCk7Ci0JCQllbHNlCi0JCQkJV0FSTl9PTigxKTsKLQkJfQotCX0KLQotCWlmIChtY19idXMpCi0JCWRldm1fa2ZyZWUobWNfZGV2LT5kZXYucGFyZW50LCBtY19idXMpOwotCWVsc2UKLQkJa21lbV9jYWNoZV9mcmVlKG1jX2Rldl9jYWNoZSwgbWNfZGV2KTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19kZXZpY2VfcmVtb3ZlKTsKLQotc3RhdGljIGludCBwYXJzZV9tY19yYW5nZXMoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgaW50ICpwYWRkcl9jZWxscywKLQkJCSAgIGludCAqbWNfYWRkcl9jZWxscywKLQkJCSAgIGludCAqbWNfc2l6ZV9jZWxscywKLQkJCSAgIGNvbnN0IF9fYmUzMiAqKnJhbmdlc19zdGFydCwKLQkJCSAgIHU4ICpudW1fcmFuZ2VzKQotewotCWNvbnN0IF9fYmUzMiAqcHJvcDsKLQlpbnQgcmFuZ2VfdHVwbGVfY2VsbF9jb3VudDsKLQlpbnQgcmFuZ2VzX2xlbjsKLQlpbnQgdHVwbGVfbGVuOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbWNfbm9kZSA9IGRldi0+b2Zfbm9kZTsKLQotCSpyYW5nZXNfc3RhcnQgPSBvZl9nZXRfcHJvcGVydHkobWNfbm9kZSwgInJhbmdlcyIsICZyYW5nZXNfbGVuKTsKLQlpZiAoISgqcmFuZ2VzX3N0YXJ0KSB8fCAhcmFuZ2VzX2xlbikgewotCQlkZXZfd2FybihkZXYsCi0JCQkgIm1pc3Npbmcgb3IgZW1wdHkgcmFuZ2VzIHByb3BlcnR5IGZvciBkZXZpY2UgdHJlZSBub2RlICclcydcbiIsCi0JCQkgbWNfbm9kZS0+bmFtZSk7Ci0KLQkJKm51bV9yYW5nZXMgPSAwOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkqcGFkZHJfY2VsbHMgPSBvZl9uX2FkZHJfY2VsbHMobWNfbm9kZSk7Ci0KLQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG1jX25vZGUsICIjYWRkcmVzcy1jZWxscyIsIE5VTEwpOwotCWlmIChwcm9wKQotCQkqbWNfYWRkcl9jZWxscyA9IGJlMzJfdG9fY3B1cChwcm9wKTsKLQllbHNlCi0JCSptY19hZGRyX2NlbGxzID0gKnBhZGRyX2NlbGxzOwotCi0JcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShtY19ub2RlLCAiI3NpemUtY2VsbHMiLCBOVUxMKTsKLQlpZiAocHJvcCkKLQkJKm1jX3NpemVfY2VsbHMgPSBiZTMyX3RvX2NwdXAocHJvcCk7Ci0JZWxzZQotCQkqbWNfc2l6ZV9jZWxscyA9IG9mX25fc2l6ZV9jZWxscyhtY19ub2RlKTsKLQotCXJhbmdlX3R1cGxlX2NlbGxfY291bnQgPSAqcGFkZHJfY2VsbHMgKyAqbWNfYWRkcl9jZWxscyArCi0JCQkJICptY19zaXplX2NlbGxzOwotCi0JdHVwbGVfbGVuID0gcmFuZ2VfdHVwbGVfY2VsbF9jb3VudCAqIHNpemVvZihfX2JlMzIpOwotCWlmIChyYW5nZXNfbGVuICUgdHVwbGVfbGVuICE9IDApIHsKLQkJZGV2X2VycihkZXYsICJtYWxmb3JtZWQgcmFuZ2VzIHByb3BlcnR5ICclcydcbiIsIG1jX25vZGUtPm5hbWUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkqbnVtX3JhbmdlcyA9IHJhbmdlc19sZW4gLyB0dXBsZV9sZW47Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X21jX2FkZHJfdHJhbnNsYXRpb25fcmFuZ2VzKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJICBzdHJ1Y3QgZnNsX21jX2FkZHJfdHJhbnNsYXRpb25fcmFuZ2UKLQkJCQkJCSoqcmFuZ2VzLAotCQkJCQkgIHU4ICpudW1fcmFuZ2VzKQotewotCWludCBlcnJvcjsKLQlpbnQgcGFkZHJfY2VsbHM7Ci0JaW50IG1jX2FkZHJfY2VsbHM7Ci0JaW50IG1jX3NpemVfY2VsbHM7Ci0JaW50IGk7Ci0JY29uc3QgX19iZTMyICpyYW5nZXNfc3RhcnQ7Ci0JY29uc3QgX19iZTMyICpjZWxsOwotCi0JZXJyb3IgPSBwYXJzZV9tY19yYW5nZXMoZGV2LAotCQkJCSZwYWRkcl9jZWxscywKLQkJCQkmbWNfYWRkcl9jZWxscywKLQkJCQkmbWNfc2l6ZV9jZWxscywKLQkJCQkmcmFuZ2VzX3N0YXJ0LAotCQkJCW51bV9yYW5nZXMpOwotCWlmIChlcnJvciA8IDApCi0JCXJldHVybiBlcnJvcjsKLQotCWlmICghKCpudW1fcmFuZ2VzKSkgewotCQkvKgotCQkgKiBNaXNzaW5nIG9yIGVtcHR5IHJhbmdlcyBwcm9wZXJ0eSAoInJhbmdlczsiKSBmb3IgdGhlCi0JCSAqICdmc2wscW9yaXEtbWMnIG5vZGUuIEluIHRoaXMgY2FzZSwgaWRlbnRpdHkgbWFwcGluZwotCQkgKiB3aWxsIGJlIHVzZWQuCi0JCSAqLwotCQkqcmFuZ2VzID0gTlVMTDsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JKnJhbmdlcyA9IGRldm1fa2NhbGxvYyhkZXYsICpudW1fcmFuZ2VzLAotCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZnNsX21jX2FkZHJfdHJhbnNsYXRpb25fcmFuZ2UpLAotCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmICghKCpyYW5nZXMpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWNlbGwgPSByYW5nZXNfc3RhcnQ7Ci0JZm9yIChpID0gMDsgaSA8ICpudW1fcmFuZ2VzOyArK2kpIHsKLQkJc3RydWN0IGZzbF9tY19hZGRyX3RyYW5zbGF0aW9uX3JhbmdlICpyYW5nZSA9ICYoKnJhbmdlcylbaV07Ci0KLQkJcmFuZ2UtPm1jX3JlZ2lvbl90eXBlID0gb2ZfcmVhZF9udW1iZXIoY2VsbCwgMSk7Ci0JCXJhbmdlLT5zdGFydF9tY19vZmZzZXQgPSBvZl9yZWFkX251bWJlcihjZWxsICsgMSwKLQkJCQkJCQltY19hZGRyX2NlbGxzIC0gMSk7Ci0JCWNlbGwgKz0gbWNfYWRkcl9jZWxsczsKLQkJcmFuZ2UtPnN0YXJ0X3BoeXNfYWRkciA9IG9mX3JlYWRfbnVtYmVyKGNlbGwsIHBhZGRyX2NlbGxzKTsKLQkJY2VsbCArPSBwYWRkcl9jZWxsczsKLQkJcmFuZ2UtPmVuZF9tY19vZmZzZXQgPSByYW5nZS0+c3RhcnRfbWNfb2Zmc2V0ICsKLQkJCQkgICAgIG9mX3JlYWRfbnVtYmVyKGNlbGwsIG1jX3NpemVfY2VsbHMpOwotCi0JCWNlbGwgKz0gbWNfc2l6ZV9jZWxsczsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBmc2xfbWNfYnVzX3Byb2JlIC0gY2FsbGJhY2sgaW52b2tlZCB3aGVuIHRoZSByb290IE1DIGJ1cyBpcyBiZWluZwotICogYWRkZWQKLSAqLwotc3RhdGljIGludCBmc2xfbWNfYnVzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGRwcmNfb2JqX2Rlc2Mgb2JqX2Rlc2M7Ci0JaW50IGVycm9yOwotCXN0cnVjdCBmc2xfbWMgKm1jOwotCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgZnNsX21jX2lvICptY19pbyA9IE5VTEw7Ci0JaW50IGNvbnRhaW5lcl9pZDsKLQlwaHlzX2FkZHJfdCBtY19wb3J0YWxfcGh5c19hZGRyOwotCXUzMiBtY19wb3J0YWxfc2l6ZTsKLQlzdHJ1Y3QgbWNfdmVyc2lvbiBtY192ZXJzaW9uOwotCXN0cnVjdCByZXNvdXJjZSByZXM7Ci0KLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiUm9vdCBNQyBidXMgZGV2aWNlIHByb2JlZCIpOwotCi0JbWMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCptYyksIEdGUF9LRVJORUwpOwotCWlmICghbWMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWMpOwotCi0JLyoKLQkgKiBHZXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBNQyBwb3J0YWwgZm9yIHRoZSByb290IERQUkM6Ci0JICovCi0JZXJyb3IgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKHBkZXYtPmRldi5vZl9ub2RlLCAwLCAmcmVzKTsKLQlpZiAoZXJyb3IgPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCSJvZl9hZGRyZXNzX3RvX3Jlc291cmNlKCkgZmFpbGVkIGZvciAlc1xuIiwKLQkJCXBkZXYtPmRldi5vZl9ub2RlLT5mdWxsX25hbWUpOwotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JbWNfcG9ydGFsX3BoeXNfYWRkciA9IHJlcy5zdGFydDsKLQltY19wb3J0YWxfc2l6ZSA9IHJlc291cmNlX3NpemUoJnJlcyk7Ci0JZXJyb3IgPSBmc2xfY3JlYXRlX21jX2lvKCZwZGV2LT5kZXYsIG1jX3BvcnRhbF9waHlzX2FkZHIsCi0JCQkJIG1jX3BvcnRhbF9zaXplLCBOVUxMLAotCQkJCSBGU0xfTUNfSU9fQVRPTUlDX0NPTlRFWFRfUE9SVEFMLCAmbWNfaW8pOwotCWlmIChlcnJvciA8IDApCi0JCXJldHVybiBlcnJvcjsKLQotCWVycm9yID0gbWNfZ2V0X3ZlcnNpb24obWNfaW8sIDAsICZtY192ZXJzaW9uKTsKLQlpZiAoZXJyb3IgIT0gMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkibWNfZ2V0X3ZlcnNpb24oKSBmYWlsZWQgd2l0aCBlcnJvciAlZFxuIiwgZXJyb3IpOwotCQlnb3RvIGVycm9yX2NsZWFudXBfbWNfaW87Ci0JfQotCi0JZGV2X2luZm8oJnBkZXYtPmRldiwKLQkJICJGcmVlc2NhbGUgTWFuYWdlbWVudCBDb21wbGV4IEZpcm13YXJlIHZlcnNpb246ICV1LiV1LiV1XG4iLAotCQkgbWNfdmVyc2lvbi5tYWpvciwgbWNfdmVyc2lvbi5taW5vciwgbWNfdmVyc2lvbi5yZXZpc2lvbik7Ci0KLQllcnJvciA9IGdldF9tY19hZGRyX3RyYW5zbGF0aW9uX3JhbmdlcygmcGRldi0+ZGV2LAotCQkJCQkgICAgICAgJm1jLT50cmFuc2xhdGlvbl9yYW5nZXMsCi0JCQkJCSAgICAgICAmbWMtPm51bV90cmFuc2xhdGlvbl9yYW5nZXMpOwotCWlmIChlcnJvciA8IDApCi0JCWdvdG8gZXJyb3JfY2xlYW51cF9tY19pbzsKLQotCWVycm9yID0gZHBtbmdfZ2V0X2NvbnRhaW5lcl9pZChtY19pbywgMCwgJmNvbnRhaW5lcl9pZCk7Ci0JaWYgKGVycm9yIDwgMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkiZHBtbmdfZ2V0X2NvbnRhaW5lcl9pZCgpIGZhaWxlZDogJWRcbiIsIGVycm9yKTsKLQkJZ290byBlcnJvcl9jbGVhbnVwX21jX2lvOwotCX0KLQotCW1lbXNldCgmb2JqX2Rlc2MsIDAsIHNpemVvZihzdHJ1Y3QgZHByY19vYmpfZGVzYykpOwotCWVycm9yID0gZ2V0X2RwcmNfdmVyc2lvbihtY19pbywgY29udGFpbmVyX2lkLAotCQkJCSAmb2JqX2Rlc2MudmVyX21ham9yLCAmb2JqX2Rlc2MudmVyX21pbm9yKTsKLQlpZiAoZXJyb3IgPCAwKQotCQlnb3RvIGVycm9yX2NsZWFudXBfbWNfaW87Ci0KLQlvYmpfZGVzYy52ZW5kb3IgPSBGU0xfTUNfVkVORE9SX0ZSRUVTQ0FMRTsKLQlzdHJjcHkob2JqX2Rlc2MudHlwZSwgImRwcmMiKTsKLQlvYmpfZGVzYy5pZCA9IGNvbnRhaW5lcl9pZDsKLQlvYmpfZGVzYy5pcnFfY291bnQgPSAxOwotCW9ial9kZXNjLnJlZ2lvbl9jb3VudCA9IDA7Ci0KLQllcnJvciA9IGZzbF9tY19kZXZpY2VfYWRkKCZvYmpfZGVzYywgbWNfaW8sICZwZGV2LT5kZXYsICZtY19idXNfZGV2KTsKLQlpZiAoZXJyb3IgPCAwKQotCQlnb3RvIGVycm9yX2NsZWFudXBfbWNfaW87Ci0KLQltYy0+cm9vdF9tY19idXNfZGV2ID0gbWNfYnVzX2RldjsKLQlyZXR1cm4gMDsKLQotZXJyb3JfY2xlYW51cF9tY19pbzoKLQlmc2xfZGVzdHJveV9tY19pbyhtY19pbyk7Ci0JcmV0dXJuIGVycm9yOwotfQotCi0vKioKLSAqIGZzbF9tY19idXNfcmVtb3ZlIC0gY2FsbGJhY2sgaW52b2tlZCB3aGVuIHRoZSByb290IE1DIGJ1cyBpcyBiZWluZwotICogcmVtb3ZlZAotICovCi1zdGF0aWMgaW50IGZzbF9tY19idXNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGZzbF9tYyAqbWMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWlmIChXQVJOX09OKCFmc2xfbWNfaXNfcm9vdF9kcHJjKCZtYy0+cm9vdF9tY19idXNfZGV2LT5kZXYpKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlmc2xfbWNfZGV2aWNlX3JlbW92ZShtYy0+cm9vdF9tY19idXNfZGV2KTsKLQotCWZzbF9kZXN0cm95X21jX2lvKG1jLT5yb290X21jX2J1c19kZXYtPm1jX2lvKTsKLQltYy0+cm9vdF9tY19idXNfZGV2LT5tY19pbyA9IE5VTEw7Ci0KLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiUm9vdCBNQyBidXMgZGV2aWNlIHJlbW92ZWQiKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZnNsX21jX2J1c19tYXRjaF90YWJsZVtdID0gewotCXsuY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtbWMiLH0sCi0Je30sCi19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBmc2xfbWNfYnVzX21hdGNoX3RhYmxlKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZnNsX21jX2J1c19kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJICAgLm5hbWUgPSAiZnNsX21jX2J1cyIsCi0JCSAgIC5wbSA9IE5VTEwsCi0JCSAgIC5vZl9tYXRjaF90YWJsZSA9IGZzbF9tY19idXNfbWF0Y2hfdGFibGUsCi0JCSAgIH0sCi0JLnByb2JlID0gZnNsX21jX2J1c19wcm9iZSwKLQkucmVtb3ZlID0gZnNsX21jX2J1c19yZW1vdmUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBmc2xfbWNfYnVzX2RyaXZlcl9pbml0KHZvaWQpCi17Ci0JaW50IGVycm9yOwotCi0JbWNfZGV2X2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImZzbF9tY19kZXZpY2UiLAotCQkJCQkgc2l6ZW9mKHN0cnVjdCBmc2xfbWNfZGV2aWNlKSwgMCwgMCwKLQkJCQkJIE5VTEwpOwotCWlmICghbWNfZGV2X2NhY2hlKSB7Ci0JCXByX2VycigiQ291bGQgbm90IGNyZWF0ZSBmc2xfbWNfZGV2aWNlIGNhY2hlXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JZXJyb3IgPSBidXNfcmVnaXN0ZXIoJmZzbF9tY19idXNfdHlwZSk7Ci0JaWYgKGVycm9yIDwgMCkgewotCQlwcl9lcnIoImZzbC1tYyBidXMgdHlwZSByZWdpc3RyYXRpb24gZmFpbGVkOiAlZFxuIiwgZXJyb3IpOwotCQlnb3RvIGVycm9yX2NsZWFudXBfY2FjaGU7Ci0JfQotCi0JcHJfaW5mbygiZnNsLW1jIGJ1cyB0eXBlIHJlZ2lzdGVyZWRcbiIpOwotCi0JZXJyb3IgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmZzbF9tY19idXNfZHJpdmVyKTsKLQlpZiAoZXJyb3IgPCAwKSB7Ci0JCXByX2VycigicGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCkgZmFpbGVkOiAlZFxuIiwgZXJyb3IpOwotCQlnb3RvIGVycm9yX2NsZWFudXBfYnVzOwotCX0KLQotCWVycm9yID0gZHByY19kcml2ZXJfaW5pdCgpOwotCWlmIChlcnJvciA8IDApCi0JCWdvdG8gZXJyb3JfY2xlYW51cF9kcml2ZXI7Ci0KLQllcnJvciA9IGZzbF9tY19hbGxvY2F0b3JfZHJpdmVyX2luaXQoKTsKLQlpZiAoZXJyb3IgPCAwKQotCQlnb3RvIGVycm9yX2NsZWFudXBfZHByY19kcml2ZXI7Ci0KLQllcnJvciA9IGl0c19mc2xfbWNfbXNpX2luaXQoKTsKLQlpZiAoZXJyb3IgPCAwKQotCQlnb3RvIGVycm9yX2NsZWFudXBfbWNfYWxsb2NhdG9yOwotCi0JcmV0dXJuIDA7Ci0KLWVycm9yX2NsZWFudXBfbWNfYWxsb2NhdG9yOgotCWZzbF9tY19hbGxvY2F0b3JfZHJpdmVyX2V4aXQoKTsKLQotZXJyb3JfY2xlYW51cF9kcHJjX2RyaXZlcjoKLQlkcHJjX2RyaXZlcl9leGl0KCk7Ci0KLWVycm9yX2NsZWFudXBfZHJpdmVyOgotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZmc2xfbWNfYnVzX2RyaXZlcik7Ci0KLWVycm9yX2NsZWFudXBfYnVzOgotCWJ1c191bnJlZ2lzdGVyKCZmc2xfbWNfYnVzX3R5cGUpOwotCi1lcnJvcl9jbGVhbnVwX2NhY2hlOgotCWttZW1fY2FjaGVfZGVzdHJveShtY19kZXZfY2FjaGUpOwotCXJldHVybiBlcnJvcjsKLX0KLQotcG9zdGNvcmVfaW5pdGNhbGwoZnNsX21jX2J1c19kcml2ZXJfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBmc2xfbWNfYnVzX2RyaXZlcl9leGl0KHZvaWQpCi17Ci0JaWYgKFdBUk5fT04oIW1jX2Rldl9jYWNoZSkpCi0JCXJldHVybjsKLQotCWl0c19mc2xfbWNfbXNpX2NsZWFudXAoKTsKLQlmc2xfbWNfYWxsb2NhdG9yX2RyaXZlcl9leGl0KCk7Ci0JZHByY19kcml2ZXJfZXhpdCgpOwotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZmc2xfbWNfYnVzX2RyaXZlcik7Ci0JYnVzX3VucmVnaXN0ZXIoJmZzbF9tY19idXNfdHlwZSk7Ci0Ja21lbV9jYWNoZV9kZXN0cm95KG1jX2Rldl9jYWNoZSk7Ci0JcHJfaW5mbygiTUMgYnVzIHVucmVnaXN0ZXJlZFxuIik7Ci19Ci0KLW1vZHVsZV9leGl0KGZzbF9tY19idXNfZHJpdmVyX2V4aXQpOwotCi1NT0RVTEVfQVVUSE9SKCJGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkZyZWVzY2FsZSBNYW5hZ2VtZW50IENvbXBsZXggKE1DKSBidXMgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9tYy1pby5jIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvbWMtaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OThjOTY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvbWMtaW8uYwpAQCAtMCwwICsxLDMyMCBAQAorLyogQ29weXJpZ2h0IDIwMTMtMjAxNiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1idXMuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL21jLXN5cy5oIgorCisjaW5jbHVkZSAiZnNsLW1jLXByaXZhdGUuaCIKKyNpbmNsdWRlICJkcG1jcC5oIgorI2luY2x1ZGUgImRwbWNwLWNtZC5oIgorCitzdGF0aWMgaW50IGZzbF9tY19pb19zZXRfZHBtY3Aoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCQkgICAgICAgc3RydWN0IGZzbF9tY19kZXZpY2UgKmRwbWNwX2RldikKK3sKKwlpbnQgZXJyb3I7CisKKwlpZiAoV0FSTl9PTighZHBtY3BfZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoV0FSTl9PTihtY19pby0+ZHBtY3BfZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoV0FSTl9PTihkcG1jcF9kZXYtPm1jX2lvKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnJvciA9IGRwbWNwX29wZW4obWNfaW8sCisJCQkgICAwLAorCQkJICAgZHBtY3BfZGV2LT5vYmpfZGVzYy5pZCwKKwkJCSAgICZkcG1jcF9kZXYtPm1jX2hhbmRsZSk7CisJaWYgKGVycm9yIDwgMCkKKwkJcmV0dXJuIGVycm9yOworCisJbWNfaW8tPmRwbWNwX2RldiA9IGRwbWNwX2RldjsKKwlkcG1jcF9kZXYtPm1jX2lvID0gbWNfaW87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9tY19pb191bnNldF9kcG1jcChzdHJ1Y3QgZnNsX21jX2lvICptY19pbykKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKmRwbWNwX2RldiA9IG1jX2lvLT5kcG1jcF9kZXY7CisKKwlpZiAoV0FSTl9PTighZHBtY3BfZGV2KSkKKwkJcmV0dXJuOworCisJaWYgKFdBUk5fT04oZHBtY3BfZGV2LT5tY19pbyAhPSBtY19pbykpCisJCXJldHVybjsKKworCWVycm9yID0gZHBtY3BfY2xvc2UobWNfaW8sCisJCQkgICAgMCwKKwkJCSAgICBkcG1jcF9kZXYtPm1jX2hhbmRsZSk7CisJaWYgKGVycm9yIDwgMCkgeworCQlkZXZfZXJyKCZkcG1jcF9kZXYtPmRldiwgImRwbWNwX2Nsb3NlKCkgZmFpbGVkOiAlZFxuIiwKKwkJCWVycm9yKTsKKwl9CisKKwltY19pby0+ZHBtY3BfZGV2ID0gTlVMTDsKKwlkcG1jcF9kZXYtPm1jX2lvID0gTlVMTDsKK30KKworLyoqCisgKiBDcmVhdGVzIGFuIE1DIEkvTyBvYmplY3QKKyAqCisgKiBAZGV2OiBkZXZpY2UgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBNQyBJL08gb2JqZWN0CisgKiBAbWNfcG9ydGFsX3BoeXNfYWRkcjogcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgTUMgcG9ydGFsIHRvIHVzZQorICogQG1jX3BvcnRhbF9zaXplOiBzaXplIGluIGJ5dGVzIG9mIHRoZSBNQyBwb3J0YWwKKyAqIEBkcG1jcC1kZXY6IFBvaW50ZXIgdG8gdGhlIERQTUNQIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBNQyBJL08KKyAqIG9iamVjdCBvciBOVUxMIGlmIG5vbmUuCisgKiBAZmxhZ3M6IGZsYWdzIGZvciB0aGUgbmV3IE1DIEkvTyBvYmplY3QKKyAqIEBuZXdfbWNfaW86IEFyZWEgdG8gcmV0dXJuIHBvaW50ZXIgdG8gbmV3bHkgY3JlYXRlZCBNQyBJL08gb2JqZWN0CisgKgorICogUmV0dXJucyAnMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBfX211c3RfY2hlY2sgZnNsX2NyZWF0ZV9tY19pbyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICBwaHlzX2FkZHJfdCBtY19wb3J0YWxfcGh5c19hZGRyLAorCQkJCSAgdTMyIG1jX3BvcnRhbF9zaXplLAorCQkJCSAgc3RydWN0IGZzbF9tY19kZXZpY2UgKmRwbWNwX2RldiwKKwkJCQkgIHUzMiBmbGFncywgc3RydWN0IGZzbF9tY19pbyAqKm5ld19tY19pbykKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IGZzbF9tY19pbyAqbWNfaW87CisJdm9pZCBfX2lvbWVtICptY19wb3J0YWxfdmlydF9hZGRyOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJbWNfaW8gPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKm1jX2lvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtY19pbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltY19pby0+ZGV2ID0gZGV2OworCW1jX2lvLT5mbGFncyA9IGZsYWdzOworCW1jX2lvLT5wb3J0YWxfcGh5c19hZGRyID0gbWNfcG9ydGFsX3BoeXNfYWRkcjsKKwltY19pby0+cG9ydGFsX3NpemUgPSBtY19wb3J0YWxfc2l6ZTsKKwlpZiAoZmxhZ3MgJiBGU0xfTUNfSU9fQVRPTUlDX0NPTlRFWFRfUE9SVEFMKQorCQlzcGluX2xvY2tfaW5pdCgmbWNfaW8tPnNwaW5sb2NrKTsKKwllbHNlCisJCW11dGV4X2luaXQoJm1jX2lvLT5tdXRleCk7CisKKwlyZXMgPSBkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbihkZXYsCisJCQkJICAgICAgbWNfcG9ydGFsX3BoeXNfYWRkciwKKwkJCQkgICAgICBtY19wb3J0YWxfc2l6ZSwKKwkJCQkgICAgICAibWNfcG9ydGFsIik7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycihkZXYsCisJCQkiZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24gZmFpbGVkIGZvciBNQyBwb3J0YWwgJSNsbHhcbiIsCisJCQltY19wb3J0YWxfcGh5c19hZGRyKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwltY19wb3J0YWxfdmlydF9hZGRyID0gZGV2bV9pb3JlbWFwX25vY2FjaGUoZGV2LAorCQkJCQkJICAgbWNfcG9ydGFsX3BoeXNfYWRkciwKKwkJCQkJCSAgIG1jX3BvcnRhbF9zaXplKTsKKwlpZiAoIW1jX3BvcnRhbF92aXJ0X2FkZHIpIHsKKwkJZGV2X2VycihkZXYsCisJCQkiZGV2bV9pb3JlbWFwX25vY2FjaGUgZmFpbGVkIGZvciBNQyBwb3J0YWwgJSNsbHhcbiIsCisJCQltY19wb3J0YWxfcGh5c19hZGRyKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwltY19pby0+cG9ydGFsX3ZpcnRfYWRkciA9IG1jX3BvcnRhbF92aXJ0X2FkZHI7CisJaWYgKGRwbWNwX2RldikgeworCQllcnJvciA9IGZzbF9tY19pb19zZXRfZHBtY3AobWNfaW8sIGRwbWNwX2Rldik7CisJCWlmIChlcnJvciA8IDApCisJCQlnb3RvIGVycm9yX2Rlc3Ryb3lfbWNfaW87CisJfQorCisJKm5ld19tY19pbyA9IG1jX2lvOworCXJldHVybiAwOworCitlcnJvcl9kZXN0cm95X21jX2lvOgorCWZzbF9kZXN0cm95X21jX2lvKG1jX2lvKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogRGVzdHJveXMgYW4gTUMgSS9PIG9iamVjdAorICoKKyAqIEBtY19pbzogTUMgSS9PIG9iamVjdCB0byBkZXN0cm95CisgKi8KK3ZvaWQgZnNsX2Rlc3Ryb3lfbWNfaW8oc3RydWN0IGZzbF9tY19pbyAqbWNfaW8pCit7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKmRwbWNwX2RldiA9IG1jX2lvLT5kcG1jcF9kZXY7CisKKwlpZiAoZHBtY3BfZGV2KQorCQlmc2xfbWNfaW9fdW5zZXRfZHBtY3AobWNfaW8pOworCisJZGV2bV9pb3VubWFwKG1jX2lvLT5kZXYsIG1jX2lvLT5wb3J0YWxfdmlydF9hZGRyKTsKKwlkZXZtX3JlbGVhc2VfbWVtX3JlZ2lvbihtY19pby0+ZGV2LAorCQkJCW1jX2lvLT5wb3J0YWxfcGh5c19hZGRyLAorCQkJCW1jX2lvLT5wb3J0YWxfc2l6ZSk7CisKKwltY19pby0+cG9ydGFsX3ZpcnRfYWRkciA9IE5VTEw7CisJZGV2bV9rZnJlZShtY19pby0+ZGV2LCBtY19pbyk7Cit9CisKKy8qKgorICogZnNsX21jX3BvcnRhbF9hbGxvY2F0ZSAtIEFsbG9jYXRlcyBhbiBNQyBwb3J0YWwKKyAqCisgKiBAbWNfZGV2OiBNQyBkZXZpY2UgZm9yIHdoaWNoIHRoZSBNQyBwb3J0YWwgaXMgdG8gYmUgYWxsb2NhdGVkCisgKiBAbWNfaW9fZmxhZ3M6IEZsYWdzIGZvciB0aGUgZnNsX21jX2lvIG9iamVjdCB0aGF0IHdyYXBzIHRoZSBhbGxvY2F0ZWQKKyAqIE1DIHBvcnRhbC4KKyAqIEBuZXdfbWNfaW86IFBvaW50ZXIgdG8gYXJlYSB3aGVyZSB0aGUgcG9pbnRlciB0byB0aGUgZnNsX21jX2lvIG9iamVjdAorICogdGhhdCB3cmFwcyB0aGUgYWxsb2NhdGVkIE1DIHBvcnRhbCBpcyB0byBiZSByZXR1cm5lZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGFuIE1DIHBvcnRhbCBmcm9tIHRoZSBkZXZpY2UncyBwYXJlbnQgRFBSQywKKyAqIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgTUMgYnVzJyBwb29sIG9mIE1DIHBvcnRhbHMgYW5kIHdyYXBzCisgKiBpdCBpbiBhIG5ldyBmc2xfbWNfaW8gb2JqZWN0LiBJZiAnbWNfZGV2JyBpcyBhIERQUkMgaXRzZWxmLCB0aGUKKyAqIHBvcnRhbCBpcyBhbGxvY2F0ZWQgZnJvbSBpdHMgb3duIE1DIGJ1cy4KKyAqLworaW50IF9fbXVzdF9jaGVjayBmc2xfbWNfcG9ydGFsX2FsbG9jYXRlKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYsCisJCQkJCXUxNiBtY19pb19mbGFncywKKwkJCQkJc3RydWN0IGZzbF9tY19pbyAqKm5ld19tY19pbykKK3sKKwlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldjsKKwlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzOworCXBoeXNfYWRkcl90IG1jX3BvcnRhbF9waHlzX2FkZHI7CisJc2l6ZV90IG1jX3BvcnRhbF9zaXplOworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICpkcG1jcF9kZXY7CisJaW50IGVycm9yID0gLUVJTlZBTDsKKwlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlICpyZXNvdXJjZSA9IE5VTEw7CisJc3RydWN0IGZzbF9tY19pbyAqbWNfaW8gPSBOVUxMOworCisJaWYgKG1jX2Rldi0+ZmxhZ3MgJiBGU0xfTUNfSVNfRFBSQykgeworCQltY19idXNfZGV2ID0gbWNfZGV2OworCX0gZWxzZSB7CisJCWlmIChXQVJOX09OKCFkZXZfaXNfZnNsX21jKG1jX2Rldi0+ZGV2LnBhcmVudCkpKQorCQkJcmV0dXJuIGVycm9yOworCisJCW1jX2J1c19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKG1jX2Rldi0+ZGV2LnBhcmVudCk7CisJfQorCisJbWNfYnVzID0gdG9fZnNsX21jX2J1cyhtY19idXNfZGV2KTsKKwkqbmV3X21jX2lvID0gTlVMTDsKKwllcnJvciA9IGZzbF9tY19yZXNvdXJjZV9hbGxvY2F0ZShtY19idXMsIEZTTF9NQ19QT09MX0RQTUNQLCAmcmVzb3VyY2UpOworCWlmIChlcnJvciA8IDApCisJCXJldHVybiBlcnJvcjsKKworCWVycm9yID0gLUVJTlZBTDsKKwlkcG1jcF9kZXYgPSByZXNvdXJjZS0+ZGF0YTsKKwlpZiAoV0FSTl9PTighZHBtY3BfZGV2KSkKKwkJZ290byBlcnJvcl9jbGVhbnVwX3Jlc291cmNlOworCisJaWYgKGRwbWNwX2Rldi0+b2JqX2Rlc2MudmVyX21ham9yIDwgRFBNQ1BfTUlOX1ZFUl9NQUpPUiB8fAorCSAgICAoZHBtY3BfZGV2LT5vYmpfZGVzYy52ZXJfbWFqb3IgPT0gRFBNQ1BfTUlOX1ZFUl9NQUpPUiAmJgorCSAgICAgZHBtY3BfZGV2LT5vYmpfZGVzYy52ZXJfbWlub3IgPCBEUE1DUF9NSU5fVkVSX01JTk9SKSkgeworCQlkZXZfZXJyKCZkcG1jcF9kZXYtPmRldiwKKwkJCSJFUlJPUjogVmVyc2lvbiAlZC4lZCBvZiBEUE1DUCBub3Qgc3VwcG9ydGVkLlxuIiwKKwkJCWRwbWNwX2Rldi0+b2JqX2Rlc2MudmVyX21ham9yLAorCQkJZHBtY3BfZGV2LT5vYmpfZGVzYy52ZXJfbWlub3IpOworCQllcnJvciA9IC1FTk9UU1VQUDsKKwkJZ290byBlcnJvcl9jbGVhbnVwX3Jlc291cmNlOworCX0KKworCWlmIChXQVJOX09OKGRwbWNwX2Rldi0+b2JqX2Rlc2MucmVnaW9uX2NvdW50ID09IDApKQorCQlnb3RvIGVycm9yX2NsZWFudXBfcmVzb3VyY2U7CisKKwltY19wb3J0YWxfcGh5c19hZGRyID0gZHBtY3BfZGV2LT5yZWdpb25zWzBdLnN0YXJ0OworCW1jX3BvcnRhbF9zaXplID0gZHBtY3BfZGV2LT5yZWdpb25zWzBdLmVuZCAtCisJCQkgZHBtY3BfZGV2LT5yZWdpb25zWzBdLnN0YXJ0ICsgMTsKKworCWlmIChXQVJOX09OKG1jX3BvcnRhbF9zaXplICE9IG1jX2J1c19kZXYtPm1jX2lvLT5wb3J0YWxfc2l6ZSkpCisJCWdvdG8gZXJyb3JfY2xlYW51cF9yZXNvdXJjZTsKKworCWVycm9yID0gZnNsX2NyZWF0ZV9tY19pbygmbWNfYnVzX2Rldi0+ZGV2LAorCQkJCSBtY19wb3J0YWxfcGh5c19hZGRyLAorCQkJCSBtY19wb3J0YWxfc2l6ZSwgZHBtY3BfZGV2LAorCQkJCSBtY19pb19mbGFncywgJm1jX2lvKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIGVycm9yX2NsZWFudXBfcmVzb3VyY2U7CisKKwkqbmV3X21jX2lvID0gbWNfaW87CisJcmV0dXJuIDA7CisKK2Vycm9yX2NsZWFudXBfcmVzb3VyY2U6CisJZnNsX21jX3Jlc291cmNlX2ZyZWUocmVzb3VyY2UpOworCXJldHVybiBlcnJvcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19wb3J0YWxfYWxsb2NhdGUpOworCisvKioKKyAqIGZzbF9tY19wb3J0YWxfZnJlZSAtIFJldHVybnMgYW4gTUMgcG9ydGFsIHRvIHRoZSBwb29sIG9mIGZyZWUgTUMgcG9ydGFscworICogb2YgYSBnaXZlbiBNQyBidXMKKyAqCisgKiBAbWNfaW86IFBvaW50ZXIgdG8gdGhlIGZzbF9tY19pbyBvYmplY3QgdGhhdCB3cmFwcyB0aGUgTUMgcG9ydGFsIHRvIGZyZWUKKyAqLwordm9pZCBmc2xfbWNfcG9ydGFsX2ZyZWUoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8pCit7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKmRwbWNwX2RldjsKKwlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlICpyZXNvdXJjZTsKKworCS8qCisJICogRXZlcnkgbWNfaW8gb2J0YWluZWQgYnkgY2FsbGluZyBmc2xfbWNfcG9ydGFsX2FsbG9jYXRlKCkgaXMgc3VwcG9zZWQKKwkgKiB0byBoYXZlIGEgRFBNQ1Agb2JqZWN0IGFzc29jaWF0ZWQgd2l0aC4KKwkgKi8KKwlkcG1jcF9kZXYgPSBtY19pby0+ZHBtY3BfZGV2OworCWlmIChXQVJOX09OKCFkcG1jcF9kZXYpKQorCQlyZXR1cm47CisKKwlyZXNvdXJjZSA9IGRwbWNwX2Rldi0+cmVzb3VyY2U7CisJaWYgKFdBUk5fT04oIXJlc291cmNlIHx8IHJlc291cmNlLT50eXBlICE9IEZTTF9NQ19QT09MX0RQTUNQKSkKKwkJcmV0dXJuOworCisJaWYgKFdBUk5fT04ocmVzb3VyY2UtPmRhdGEgIT0gZHBtY3BfZGV2KSkKKwkJcmV0dXJuOworCisJZnNsX2Rlc3Ryb3lfbWNfaW8obWNfaW8pOworCWZzbF9tY19yZXNvdXJjZV9mcmVlKHJlc291cmNlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19wb3J0YWxfZnJlZSk7CisKKy8qKgorICogZnNsX21jX3BvcnRhbF9yZXNldCAtIFJlc2V0cyB0aGUgZHBtY3Agb2JqZWN0IGZvciBhIGdpdmVuIGZzbF9tY19pbyBvYmplY3QKKyAqCisgKiBAbWNfaW86IFBvaW50ZXIgdG8gdGhlIGZzbF9tY19pbyBvYmplY3QgdGhhdCB3cmFwcyB0aGUgTUMgcG9ydGFsIHRvIGZyZWUKKyAqLworaW50IGZzbF9tY19wb3J0YWxfcmVzZXQoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8pCit7CisJaW50IGVycm9yOworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICpkcG1jcF9kZXYgPSBtY19pby0+ZHBtY3BfZGV2OworCisJaWYgKFdBUk5fT04oIWRwbWNwX2RldikpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyb3IgPSBkcG1jcF9yZXNldChtY19pbywgMCwgZHBtY3BfZGV2LT5tY19oYW5kbGUpOworCWlmIChlcnJvciA8IDApIHsKKwkJZGV2X2VycigmZHBtY3BfZGV2LT5kZXYsICJkcG1jcF9yZXNldCgpIGZhaWxlZDogJWRcbiIsIGVycm9yKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX3BvcnRhbF9yZXNldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9tYy1tc2kuYyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL21jLW1zaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2JlMTU2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL21jLW1zaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLS8qCi0gKiBGcmVlc2NhbGUgTWFuYWdlbWVudCBDb21wbGV4IChNQykgYnVzIGRyaXZlciBNU0kgc3VwcG9ydAotICoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgotICogQXV0aG9yOiBHZXJtYW4gUml2ZXJhIDxHZXJtYW4uUml2ZXJhQGZyZWVzY2FsZS5jb20+Ci0gKgotICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKLSAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqLwotCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1wcml2YXRlLmgiCi0jaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAvYXJtLWdpYy12My5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgotI2luY2x1ZGUgPGxpbnV4L21zaS5oPgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtc3lzLmgiCi0jaW5jbHVkZSAiZHByYy1jbWQuaCIKLQotLyoKLSAqIEdlbmVyYXRlIGEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBpbnRlcnJ1cHQgKG9ubHkgdXNlZCB3aXRoaW4gdGhlIE1TSQotICogaXJxZG9tYWluLiAgQ29tYmluZSB0aGUgaWNpZCB3aXRoIHRoZSBpbnRlcnJ1cHQgaW5kZXguCi0gKi8KLXN0YXRpYyBpcnFfaHdfbnVtYmVyX3QgZnNsX21jX2RvbWFpbl9jYWxjX2h3aXJxKHN0cnVjdCBmc2xfbWNfZGV2aWNlICpkZXYsCi0JCQkJCQlzdHJ1Y3QgbXNpX2Rlc2MgKmRlc2MpCi17Ci0JLyoKLQkgKiBNYWtlIHRoZSBiYXNlIGh3aXJxIHZhbHVlIGZvciBJQ0lEKjEwMDAwIHNvIGl0IGlzIHJlYWRhYmxlCi0JICogYXMgYSBkZWNpbWFsIHZhbHVlIGluIC9wcm9jL2ludGVycnVwdHMuCi0JICovCi0JcmV0dXJuIChpcnFfaHdfbnVtYmVyX3QpKGRlc2MtPmZzbF9tYy5tc2lfaW5kZXggKyAoZGV2LT5pY2lkICogMTAwMDApKTsKLX0KLQotc3RhdGljIHZvaWQgZnNsX21jX21zaV9zZXRfZGVzYyhtc2lfYWxsb2NfaW5mb190ICphcmcsCi0JCQkJc3RydWN0IG1zaV9kZXNjICpkZXNjKQotewotCWFyZy0+ZGVzYyA9IGRlc2M7Ci0JYXJnLT5od2lycSA9IGZzbF9tY19kb21haW5fY2FsY19od2lycSh0b19mc2xfbWNfZGV2aWNlKGRlc2MtPmRldiksCi0JCQkJCSAgICAgIGRlc2MpOwotfQotCi1zdGF0aWMgdm9pZCBmc2xfbWNfbXNpX3VwZGF0ZV9kb21fb3BzKHN0cnVjdCBtc2lfZG9tYWluX2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IG1zaV9kb21haW5fb3BzICpvcHMgPSBpbmZvLT5vcHM7Ci0KLQlpZiAoV0FSTl9PTighb3BzKSkKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBzZXRfZGVzYyBzaG91bGQgbm90IGJlIHNldCBieSB0aGUgY2FsbGVyCi0JICovCi0JaWYgKG9wcy0+c2V0X2Rlc2MgPT0gTlVMTCkKLQkJb3BzLT5zZXRfZGVzYyA9IGZzbF9tY19tc2lfc2V0X2Rlc2M7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZnNsX21jX21zaV93cml0ZV9tc2coc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYsCi0JCQkJICAgc3RydWN0IGZzbF9tY19kZXZpY2VfaXJxICptY19kZXZfaXJxKQotewotCWludCBlcnJvcjsKLQlzdHJ1Y3QgZnNsX21jX2RldmljZSAqb3duZXJfbWNfZGV2ID0gbWNfZGV2X2lycS0+bWNfZGV2OwotCXN0cnVjdCBtc2lfZGVzYyAqbXNpX2Rlc2MgPSBtY19kZXZfaXJxLT5tc2lfZGVzYzsKLQlzdHJ1Y3QgZHByY19pcnFfY2ZnIGlycV9jZmc7Ci0KLQkvKgotCSAqIG1zaV9kZXNjLT5tc2cuYWRkcmVzcyBpcyAweDAgd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgaW4KLQkgKiB0aGUgZnJlZV9pcnEoKSBjb2RlIHBhdGguIEluIHRoaXMgY2FzZSwgZm9yIHRoZSBNQywgd2UgZG9uJ3QKLQkgKiByZWFsbHkgbmVlZCB0byAidW5wcm9ncmFtIiB0aGUgTVNJLCBzbyB3ZSBqdXN0IHJldHVybi4KLQkgKi8KLQlpZiAobXNpX2Rlc2MtPm1zZy5hZGRyZXNzX2xvID09IDB4MCAmJiBtc2lfZGVzYy0+bXNnLmFkZHJlc3NfaGkgPT0gMHgwKQotCQlyZXR1cm47Ci0KLQlpZiAoV0FSTl9PTighb3duZXJfbWNfZGV2KSkKLQkJcmV0dXJuOwotCi0JaXJxX2NmZy5wYWRkciA9ICgodTY0KW1zaV9kZXNjLT5tc2cuYWRkcmVzc19oaSA8PCAzMikgfAotCQkJbXNpX2Rlc2MtPm1zZy5hZGRyZXNzX2xvOwotCWlycV9jZmcudmFsID0gbXNpX2Rlc2MtPm1zZy5kYXRhOwotCWlycV9jZmcuaXJxX251bSA9IG1zaV9kZXNjLT5pcnE7Ci0KLQlpZiAob3duZXJfbWNfZGV2ID09IG1jX2J1c19kZXYpIHsKLQkJLyoKLQkJICogSVJRIGlzIGZvciB0aGUgbWNfYnVzX2RldidzIERQUkMgaXRzZWxmCi0JCSAqLwotCQllcnJvciA9IGRwcmNfc2V0X2lycShtY19idXNfZGV2LT5tY19pbywKLQkJCQkgICAgIE1DX0NNRF9GTEFHX0lOVFJfRElTIHwgTUNfQ01EX0ZMQUdfUFJJLAotCQkJCSAgICAgbWNfYnVzX2Rldi0+bWNfaGFuZGxlLAotCQkJCSAgICAgbWNfZGV2X2lycS0+ZGV2X2lycV9pbmRleCwKLQkJCQkgICAgICZpcnFfY2ZnKTsKLQkJaWYgKGVycm9yIDwgMCkgewotCQkJZGV2X2Vycigmb3duZXJfbWNfZGV2LT5kZXYsCi0JCQkJImRwcmNfc2V0X2lycSgpIGZhaWxlZDogJWRcbiIsIGVycm9yKTsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIElSUSBpcyBmb3IgZm9yIGEgY2hpbGQgZGV2aWNlIG9mIG1jX2J1c19kZXYKLQkJICovCi0JCWVycm9yID0gZHByY19zZXRfb2JqX2lycShtY19idXNfZGV2LT5tY19pbywKLQkJCQkJIE1DX0NNRF9GTEFHX0lOVFJfRElTIHwgTUNfQ01EX0ZMQUdfUFJJLAotCQkJCQkgbWNfYnVzX2Rldi0+bWNfaGFuZGxlLAotCQkJCQkgb3duZXJfbWNfZGV2LT5vYmpfZGVzYy50eXBlLAotCQkJCQkgb3duZXJfbWNfZGV2LT5vYmpfZGVzYy5pZCwKLQkJCQkJIG1jX2Rldl9pcnEtPmRldl9pcnFfaW5kZXgsCi0JCQkJCSAmaXJxX2NmZyk7Ci0JCWlmIChlcnJvciA8IDApIHsKLQkJCWRldl9lcnIoJm93bmVyX21jX2Rldi0+ZGV2LAotCQkJCSJkcHJjX29ial9zZXRfaXJxKCkgZmFpbGVkOiAlZFxuIiwgZXJyb3IpOwotCQl9Ci0JfQotfQotCi0vKgotICogTk9URTogVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZAotICovCi1zdGF0aWMgdm9pZCBmc2xfbWNfbXNpX3dyaXRlX21zZyhzdHJ1Y3QgaXJxX2RhdGEgKmlycV9kYXRhLAotCQkJCSBzdHJ1Y3QgbXNpX21zZyAqbXNnKQotewotCXN0cnVjdCBtc2lfZGVzYyAqbXNpX2Rlc2MgPSBpcnFfZGF0YV9nZXRfbXNpX2Rlc2MoaXJxX2RhdGEpOwotCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2ID0gdG9fZnNsX21jX2RldmljZShtc2lfZGVzYy0+ZGV2KTsKLQlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzID0gdG9fZnNsX21jX2J1cyhtY19idXNfZGV2KTsKLQlzdHJ1Y3QgZnNsX21jX2RldmljZV9pcnEgKm1jX2Rldl9pcnEgPQotCQkmbWNfYnVzLT5pcnFfcmVzb3VyY2VzW21zaV9kZXNjLT5mc2xfbWMubXNpX2luZGV4XTsKLQotCVdBUk5fT04obWNfZGV2X2lycS0+bXNpX2Rlc2MgIT0gbXNpX2Rlc2MpOwotCW1zaV9kZXNjLT5tc2cgPSAqbXNnOwotCi0JLyoKLQkgKiBQcm9ncmFtIHRoZSBNU0kgKHBhZGRyLCB2YWx1ZSkgcGFpciBpbiB0aGUgZGV2aWNlOgotCSAqLwotCV9fZnNsX21jX21zaV93cml0ZV9tc2cobWNfYnVzX2RldiwgbWNfZGV2X2lycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZzbF9tY19tc2lfdXBkYXRlX2NoaXBfb3BzKHN0cnVjdCBtc2lfZG9tYWluX2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IGlycV9jaGlwICpjaGlwID0gaW5mby0+Y2hpcDsKLQotCWlmIChXQVJOX09OKCghY2hpcCkpKQotCQlyZXR1cm47Ci0KLQkvKgotCSAqIGlycV93cml0ZV9tc2lfbXNnIHNob3VsZCBub3QgYmUgc2V0IGJ5IHRoZSBjYWxsZXIKLQkgKi8KLQlpZiAoY2hpcC0+aXJxX3dyaXRlX21zaV9tc2cgPT0gTlVMTCkKLQkJY2hpcC0+aXJxX3dyaXRlX21zaV9tc2cgPSBmc2xfbWNfbXNpX3dyaXRlX21zZzsKLX0KLQotLyoqCi0gKiBmc2xfbWNfbXNpX2NyZWF0ZV9pcnFfZG9tYWluIC0gQ3JlYXRlIGEgZnNsLW1jIE1TSSBpbnRlcnJ1cHQgZG9tYWluCi0gKiBAbnA6CQlPcHRpb25hbCBkZXZpY2UtdHJlZSBub2RlIG9mIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlcgotICogQGluZm86CU1TSSBkb21haW4gaW5mbwotICogQHBhcmVudDoJUGFyZW50IGlycSBkb21haW4KLSAqCi0gKiBVcGRhdGVzIHRoZSBkb21haW4gYW5kIGNoaXAgb3BzIGFuZCBjcmVhdGVzIGEgZnNsLW1jIE1TSQotICogaW50ZXJydXB0IGRvbWFpbi4KLSAqCi0gKiBSZXR1cm5zOgotICogQSBkb21haW4gcG9pbnRlciBvciBOVUxMIGluIGNhc2Ugb2YgZmFpbHVyZS4KLSAqLwotc3RydWN0IGlycV9kb21haW4gKmZzbF9tY19tc2lfY3JlYXRlX2lycV9kb21haW4oc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3bm9kZSwKLQkJCQkJCXN0cnVjdCBtc2lfZG9tYWluX2luZm8gKmluZm8sCi0JCQkJCQlzdHJ1Y3QgaXJxX2RvbWFpbiAqcGFyZW50KQotewotCXN0cnVjdCBpcnFfZG9tYWluICpkb21haW47Ci0KLQlpZiAoaW5mby0+ZmxhZ3MgJiBNU0lfRkxBR19VU0VfREVGX0RPTV9PUFMpCi0JCWZzbF9tY19tc2lfdXBkYXRlX2RvbV9vcHMoaW5mbyk7Ci0JaWYgKGluZm8tPmZsYWdzICYgTVNJX0ZMQUdfVVNFX0RFRl9DSElQX09QUykKLQkJZnNsX21jX21zaV91cGRhdGVfY2hpcF9vcHMoaW5mbyk7Ci0KLQlkb21haW4gPSBtc2lfY3JlYXRlX2lycV9kb21haW4oZndub2RlLCBpbmZvLCBwYXJlbnQpOwotCWlmIChkb21haW4pCi0JCWRvbWFpbi0+YnVzX3Rva2VuID0gRE9NQUlOX0JVU19GU0xfTUNfTVNJOwotCi0JcmV0dXJuIGRvbWFpbjsKLX0KLQotaW50IGZzbF9tY19maW5kX21zaV9kb21haW4oc3RydWN0IGRldmljZSAqbWNfcGxhdGZvcm1fZGV2LAotCQkJICAgc3RydWN0IGlycV9kb21haW4gKiptY19tc2lfZG9tYWluKQotewotCXN0cnVjdCBpcnFfZG9tYWluICptc2lfZG9tYWluOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbWNfb2Zfbm9kZSA9IG1jX3BsYXRmb3JtX2Rldi0+b2Zfbm9kZTsKLQotCW1zaV9kb21haW4gPSBvZl9tc2lfZ2V0X2RvbWFpbihtY19wbGF0Zm9ybV9kZXYsIG1jX29mX25vZGUsCi0JCQkJICAgICAgIERPTUFJTl9CVVNfRlNMX01DX01TSSk7Ci0JaWYgKCFtc2lfZG9tYWluKSB7Ci0JCXByX2VycigiVW5hYmxlIHRvIGZpbmQgZnNsLW1jIE1TSSBkb21haW4gZm9yICVzXG4iLAotCQkgICAgICAgbWNfb2Zfbm9kZS0+ZnVsbF9uYW1lKTsKLQotCQlyZXR1cm4gLUVOT0VOVDsKLQl9Ci0KLQkqbWNfbXNpX2RvbWFpbiA9IG1zaV9kb21haW47Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGZzbF9tY19tc2lfZnJlZV9kZXNjcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG1zaV9kZXNjICpkZXNjLCAqdG1wOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlc2MsIHRtcCwgZGV2X3RvX21zaV9saXN0KGRldiksIGxpc3QpIHsKLQkJbGlzdF9kZWwoJmRlc2MtPmxpc3QpOwotCQlmcmVlX21zaV9lbnRyeShkZXNjKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgZnNsX21jX21zaV9hbGxvY19kZXNjcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBpcnFfY291bnQpCi0KLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQlpbnQgZXJyb3I7Ci0Jc3RydWN0IG1zaV9kZXNjICptc2lfZGVzYzsKLQotCWZvciAoaSA9IDA7IGkgPCBpcnFfY291bnQ7IGkrKykgewotCQltc2lfZGVzYyA9IGFsbG9jX21zaV9lbnRyeShkZXYpOwotCQlpZiAoIW1zaV9kZXNjKSB7Ci0JCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtc2kgZW50cnlcbiIpOwotCQkJZXJyb3IgPSAtRU5PTUVNOwotCQkJZ290byBjbGVhbnVwX21zaV9kZXNjczsKLQkJfQotCi0JCW1zaV9kZXNjLT5mc2xfbWMubXNpX2luZGV4ID0gaTsKLQkJbXNpX2Rlc2MtPm52ZWNfdXNlZCA9IDE7Ci0JCUlOSVRfTElTVF9IRUFEKCZtc2lfZGVzYy0+bGlzdCk7Ci0JCWxpc3RfYWRkX3RhaWwoJm1zaV9kZXNjLT5saXN0LCBkZXZfdG9fbXNpX2xpc3QoZGV2KSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWNsZWFudXBfbXNpX2Rlc2NzOgotCWZzbF9tY19tc2lfZnJlZV9kZXNjcyhkZXYpOwotCXJldHVybiBlcnJvcjsKLX0KLQotaW50IGZzbF9tY19tc2lfZG9tYWluX2FsbG9jX2lycXMoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSB1bnNpZ25lZCBpbnQgaXJxX2NvdW50KQotewotCXN0cnVjdCBpcnFfZG9tYWluICptc2lfZG9tYWluOwotCWludCBlcnJvcjsKLQotCWlmIChXQVJOX09OKCFsaXN0X2VtcHR5KGRldl90b19tc2lfbGlzdChkZXYpKSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZXJyb3IgPSBmc2xfbWNfbXNpX2FsbG9jX2Rlc2NzKGRldiwgaXJxX2NvdW50KTsKLQlpZiAoZXJyb3IgPCAwKQotCQlyZXR1cm4gZXJyb3I7Ci0KLQltc2lfZG9tYWluID0gZGV2X2dldF9tc2lfZG9tYWluKGRldik7Ci0JaWYgKFdBUk5fT04oIW1zaV9kb21haW4pKSB7Ci0JCWVycm9yID0gLUVJTlZBTDsKLQkJZ290byBjbGVhbnVwX21zaV9kZXNjczsKLQl9Ci0KLQkvKgotCSAqIE5PVEU6IENhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIHRyaWdnZXIgdGhlIGludm9jYXRpb24gb2YgdGhlCi0JICogaXRzX2ZzbF9tY19tc2lfcHJlcGFyZSgpIGNhbGxiYWNrCi0JICovCi0JZXJyb3IgPSBtc2lfZG9tYWluX2FsbG9jX2lycXMobXNpX2RvbWFpbiwgZGV2LCBpcnFfY291bnQpOwotCi0JaWYgKGVycm9yKSB7Ci0JCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIElSUXNcbiIpOwotCQlnb3RvIGNsZWFudXBfbXNpX2Rlc2NzOwotCX0KLQotCXJldHVybiAwOwotCi1jbGVhbnVwX21zaV9kZXNjczoKLQlmc2xfbWNfbXNpX2ZyZWVfZGVzY3MoZGV2KTsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLXZvaWQgZnNsX21jX21zaV9kb21haW5fZnJlZV9pcnFzKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgaXJxX2RvbWFpbiAqbXNpX2RvbWFpbjsKLQotCW1zaV9kb21haW4gPSBkZXZfZ2V0X21zaV9kb21haW4oZGV2KTsKLQlpZiAoV0FSTl9PTighbXNpX2RvbWFpbikpCi0JCXJldHVybjsKLQotCW1zaV9kb21haW5fZnJlZV9pcnFzKG1zaV9kb21haW4sIGRldik7Ci0KLQlpZiAoV0FSTl9PTihsaXN0X2VtcHR5KGRldl90b19tc2lfbGlzdChkZXYpKSkpCi0JCXJldHVybjsKLQotCWZzbF9tY19tc2lfZnJlZV9kZXNjcyhkZXYpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvbWMtc3lzLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9tYy1zeXMuYwppbmRleCAwYzE4NWFiLi4yODU5MTdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9tYy1zeXMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9tYy1zeXMuYwpAQCAtMzIsMTMgKzMyLDE1IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwogCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1zeXMuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL21jLWNtZC5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMuaCIKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtc3lzLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1jbWQuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL21jLmgiCisKICNpbmNsdWRlICJkcG1jcC5oIgogCiAvKioKQEAgLTY4LDE1MyArNzAsNiBAQAogCXJldHVybiAoY21kX2lkICYgTUNfQ01EX0hEUl9DTURJRF9NQVNLKSA+PiBNQ19DTURfSERSX0NNRElEX1NISUZUOwogfQogCi0vKioKLSAqIENyZWF0ZXMgYW4gTUMgSS9PIG9iamVjdAotICoKLSAqIEBkZXY6IGRldmljZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIE1DIEkvTyBvYmplY3QKLSAqIEBtY19wb3J0YWxfcGh5c19hZGRyOiBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBNQyBwb3J0YWwgdG8gdXNlCi0gKiBAbWNfcG9ydGFsX3NpemU6IHNpemUgaW4gYnl0ZXMgb2YgdGhlIE1DIHBvcnRhbAotICogQGRwbWNwLWRldjogUG9pbnRlciB0byB0aGUgRFBNQ1Agb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIE1DIEkvTwotICogb2JqZWN0IG9yIE5VTEwgaWYgbm9uZS4KLSAqIEBmbGFnczogZmxhZ3MgZm9yIHRoZSBuZXcgTUMgSS9PIG9iamVjdAotICogQG5ld19tY19pbzogQXJlYSB0byByZXR1cm4gcG9pbnRlciB0byBuZXdseSBjcmVhdGVkIE1DIEkvTyBvYmplY3QKLSAqCi0gKiBSZXR1cm5zICcwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KLSAqLwotaW50IF9fbXVzdF9jaGVjayBmc2xfY3JlYXRlX21jX2lvKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgIHBoeXNfYWRkcl90IG1jX3BvcnRhbF9waHlzX2FkZHIsCi0JCQkJICB1MzIgbWNfcG9ydGFsX3NpemUsCi0JCQkJICBzdHJ1Y3QgZnNsX21jX2RldmljZSAqZHBtY3BfZGV2LAotCQkJCSAgdTMyIGZsYWdzLCBzdHJ1Y3QgZnNsX21jX2lvICoqbmV3X21jX2lvKQotewotCWludCBlcnJvcjsKLQlzdHJ1Y3QgZnNsX21jX2lvICptY19pbzsKLQl2b2lkIF9faW9tZW0gKm1jX3BvcnRhbF92aXJ0X2FkZHI7Ci0Jc3RydWN0IHJlc291cmNlICpyZXM7Ci0KLQltY19pbyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqbWNfaW8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1jX2lvKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW1jX2lvLT5kZXYgPSBkZXY7Ci0JbWNfaW8tPmZsYWdzID0gZmxhZ3M7Ci0JbWNfaW8tPnBvcnRhbF9waHlzX2FkZHIgPSBtY19wb3J0YWxfcGh5c19hZGRyOwotCW1jX2lvLT5wb3J0YWxfc2l6ZSA9IG1jX3BvcnRhbF9zaXplOwotCWlmIChmbGFncyAmIEZTTF9NQ19JT19BVE9NSUNfQ09OVEVYVF9QT1JUQUwpCi0JCXNwaW5fbG9ja19pbml0KCZtY19pby0+c3BpbmxvY2spOwotCWVsc2UKLQkJbXV0ZXhfaW5pdCgmbWNfaW8tPm11dGV4KTsKLQotCXJlcyA9IGRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKGRldiwKLQkJCQkgICAgICBtY19wb3J0YWxfcGh5c19hZGRyLAotCQkJCSAgICAgIG1jX3BvcnRhbF9zaXplLAotCQkJCSAgICAgICJtY19wb3J0YWwiKTsKLQlpZiAoIXJlcykgewotCQlkZXZfZXJyKGRldiwKLQkJCSJkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbiBmYWlsZWQgZm9yIE1DIHBvcnRhbCAlI2xseFxuIiwKLQkJCW1jX3BvcnRhbF9waHlzX2FkZHIpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCW1jX3BvcnRhbF92aXJ0X2FkZHIgPSBkZXZtX2lvcmVtYXBfbm9jYWNoZShkZXYsCi0JCQkJCQkgICBtY19wb3J0YWxfcGh5c19hZGRyLAotCQkJCQkJICAgbWNfcG9ydGFsX3NpemUpOwotCWlmICghbWNfcG9ydGFsX3ZpcnRfYWRkcikgewotCQlkZXZfZXJyKGRldiwKLQkJCSJkZXZtX2lvcmVtYXBfbm9jYWNoZSBmYWlsZWQgZm9yIE1DIHBvcnRhbCAlI2xseFxuIiwKLQkJCW1jX3BvcnRhbF9waHlzX2FkZHIpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQotCW1jX2lvLT5wb3J0YWxfdmlydF9hZGRyID0gbWNfcG9ydGFsX3ZpcnRfYWRkcjsKLQlpZiAoZHBtY3BfZGV2KSB7Ci0JCWVycm9yID0gZnNsX21jX2lvX3NldF9kcG1jcChtY19pbywgZHBtY3BfZGV2KTsKLQkJaWYgKGVycm9yIDwgMCkKLQkJCWdvdG8gZXJyb3JfZGVzdHJveV9tY19pbzsKLQl9Ci0KLQkqbmV3X21jX2lvID0gbWNfaW87Ci0JcmV0dXJuIDA7Ci0KLWVycm9yX2Rlc3Ryb3lfbWNfaW86Ci0JZnNsX2Rlc3Ryb3lfbWNfaW8obWNfaW8pOwotCXJldHVybiBlcnJvcjsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGZzbF9jcmVhdGVfbWNfaW8pOwotCi0vKioKLSAqIERlc3Ryb3lzIGFuIE1DIEkvTyBvYmplY3QKLSAqCi0gKiBAbWNfaW86IE1DIEkvTyBvYmplY3QgdG8gZGVzdHJveQotICovCi12b2lkIGZzbF9kZXN0cm95X21jX2lvKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvKQotewotCXN0cnVjdCBmc2xfbWNfZGV2aWNlICpkcG1jcF9kZXYgPSBtY19pby0+ZHBtY3BfZGV2OwotCi0JaWYgKGRwbWNwX2RldikKLQkJZnNsX21jX2lvX3Vuc2V0X2RwbWNwKG1jX2lvKTsKLQotCWRldm1faW91bm1hcChtY19pby0+ZGV2LCBtY19pby0+cG9ydGFsX3ZpcnRfYWRkcik7Ci0JZGV2bV9yZWxlYXNlX21lbV9yZWdpb24obWNfaW8tPmRldiwKLQkJCQltY19pby0+cG9ydGFsX3BoeXNfYWRkciwKLQkJCQltY19pby0+cG9ydGFsX3NpemUpOwotCi0JbWNfaW8tPnBvcnRhbF92aXJ0X2FkZHIgPSBOVUxMOwotCWRldm1fa2ZyZWUobWNfaW8tPmRldiwgbWNfaW8pOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZnNsX2Rlc3Ryb3lfbWNfaW8pOwotCi1pbnQgZnNsX21jX2lvX3NldF9kcG1jcChzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKLQkJCXN0cnVjdCBmc2xfbWNfZGV2aWNlICpkcG1jcF9kZXYpCi17Ci0JaW50IGVycm9yOwotCi0JaWYgKFdBUk5fT04oIWRwbWNwX2RldikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKFdBUk5fT04obWNfaW8tPmRwbWNwX2RldikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKFdBUk5fT04oZHBtY3BfZGV2LT5tY19pbykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZXJyb3IgPSBkcG1jcF9vcGVuKG1jX2lvLAotCQkJICAgMCwKLQkJCSAgIGRwbWNwX2Rldi0+b2JqX2Rlc2MuaWQsCi0JCQkgICAmZHBtY3BfZGV2LT5tY19oYW5kbGUpOwotCWlmIChlcnJvciA8IDApCi0JCXJldHVybiBlcnJvcjsKLQotCW1jX2lvLT5kcG1jcF9kZXYgPSBkcG1jcF9kZXY7Ci0JZHBtY3BfZGV2LT5tY19pbyA9IG1jX2lvOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX2lvX3NldF9kcG1jcCk7Ci0KLXZvaWQgZnNsX21jX2lvX3Vuc2V0X2RwbWNwKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvKQotewotCWludCBlcnJvcjsKLQlzdHJ1Y3QgZnNsX21jX2RldmljZSAqZHBtY3BfZGV2ID0gbWNfaW8tPmRwbWNwX2RldjsKLQotCWlmIChXQVJOX09OKCFkcG1jcF9kZXYpKQotCQlyZXR1cm47Ci0KLQlpZiAoV0FSTl9PTihkcG1jcF9kZXYtPm1jX2lvICE9IG1jX2lvKSkKLQkJcmV0dXJuOwotCi0JZXJyb3IgPSBkcG1jcF9jbG9zZShtY19pbywKLQkJCSAgICAwLAotCQkJICAgIGRwbWNwX2Rldi0+bWNfaGFuZGxlKTsKLQlpZiAoZXJyb3IgPCAwKSB7Ci0JCWRldl9lcnIoJmRwbWNwX2Rldi0+ZGV2LCAiZHBtY3BfY2xvc2UoKSBmYWlsZWQ6ICVkXG4iLAotCQkJZXJyb3IpOwotCX0KLQotCW1jX2lvLT5kcG1jcF9kZXYgPSBOVUxMOwotCWRwbWNwX2Rldi0+bWNfaW8gPSBOVUxMOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX2lvX3Vuc2V0X2RwbWNwKTsKLQogc3RhdGljIGludCBtY19zdGF0dXNfdG9fZXJyb3IoZW51bSBtY19jbWRfc3RhdHVzIHN0YXR1cykKIHsKIAlzdGF0aWMgY29uc3QgaW50IG1jX3N0YXR1c190b19lcnJvcl9tYXBbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvaW5jbHVkZS9kcGJwLWNtZC5oIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL2RwYnAtY21kLmgKaW5kZXggNDgyOGNjZC4uMjg2MDQxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL2RwYnAtY21kLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL2RwYnAtY21kLmgKQEAgLTEsMzQgKzEsMzQgQEAKIC8qIENvcHlyaWdodCAyMDEzLTIwMTYgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgotKgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0qICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZQotKiBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotKiBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSoKLSoKLSogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQotKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQotKiBsYXRlciB2ZXJzaW9uLgotKgotKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKLSogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRQotKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSovCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlCisgKiBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KICNpZm5kZWYgX0ZTTF9EUEJQX0NNRF9ICiAjZGVmaW5lIF9GU0xfRFBCUF9DTURfSAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvbWMtYnVzLmggYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvbWMtYnVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwNjg0YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvaW5jbHVkZS9tYy1idXMuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIEZyZWVzY2FsZSBNYW5hZ2VtZW50IENvbXBsZXggKE1DKSBidXMgZGVjbGFyYXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBBdXRob3I6IEdlcm1hbiBSaXZlcmEgPEdlcm1hbi5SaXZlcmFAZnJlZXNjYWxlLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisjaWZuZGVmIF9GU0xfTUNfTUNCVVNfSF8KKyNkZWZpbmUgX0ZTTF9NQ19NQ0JVU19IXworCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy5oIgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisKK3N0cnVjdCBpcnFfZG9tYWluOworc3RydWN0IG1zaV9kb21haW5faW5mbzsKKworLyoqCisgKiBNYXhpbXVtIG51bWJlciBvZiB0b3RhbCBJUlFzIHRoYXQgY2FuIGJlIHByZS1hbGxvY2F0ZWQgZm9yIGFuIE1DIGJ1cycKKyAqIElSUSBwb29sCisgKi8KKyNkZWZpbmUgRlNMX01DX0lSUV9QT09MX01BWF9UT1RBTF9JUlFTCTI1NgorCisjaWZkZWYgQ09ORklHX0ZTTF9NQ19CVVMKKyNkZWZpbmUgZGV2X2lzX2ZzbF9tYyhfZGV2KSAoKF9kZXYpLT5idXMgPT0gJmZzbF9tY19idXNfdHlwZSkKKyNlbHNlCisvKiBJZiBmc2wtbWMgYnVzIGlzIG5vdCBwcmVzZW50IGRldmljZSBjYW5ub3QgYmVsb25nIHRvIGZzbC1tYyBidXMgKi8KKyNkZWZpbmUgZGV2X2lzX2ZzbF9tYyhfZGV2KSAoMCkKKyNlbmRpZgorCisvKioKKyAqIHN0cnVjdCBmc2xfbWNfcmVzb3VyY2VfcG9vbCAtIFBvb2wgb2YgTUMgcmVzb3VyY2VzIG9mIGEgZ2l2ZW4KKyAqIHR5cGUKKyAqIEB0eXBlOiB0eXBlIG9mIHJlc291cmNlcyBpbiB0aGUgcG9vbAorICogQG1heF9jb3VudDogbWF4aW11bSBudW1iZXIgb2YgcmVzb3VyY2VzIGluIHRoZSBwb29sCisgKiBAZnJlZV9jb3VudDogbnVtYmVyIG9mIGZyZWUgcmVzb3VyY2VzIGluIHRoZSBwb29sCisgKiBAbXV0ZXg6IG11dGV4IHRvIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIHBvb2wncyBmcmVlIGxpc3QKKyAqIEBmcmVlX2xpc3Q6IGFuY2hvciBub2RlIG9mIGxpc3Qgb2YgZnJlZSByZXNvdXJjZXMgaW4gdGhlIHBvb2wKKyAqIEBtY19idXM6IHBvaW50ZXIgdG8gdGhlIE1DIGJ1cyB0aGF0IG93bnMgdGhpcyByZXNvdXJjZSBwb29sCisgKi8KK3N0cnVjdCBmc2xfbWNfcmVzb3VyY2VfcG9vbCB7CisJZW51bSBmc2xfbWNfcG9vbF90eXBlIHR5cGU7CisJaW50MTZfdCBtYXhfY291bnQ7CisJaW50MTZfdCBmcmVlX2NvdW50OworCXN0cnVjdCBtdXRleCBtdXRleDsJLyogc2VyaWFsaXplcyBhY2Nlc3MgdG8gZnJlZV9saXN0ICovCisJc3RydWN0IGxpc3RfaGVhZCBmcmVlX2xpc3Q7CisJc3RydWN0IGZzbF9tY19idXMgKm1jX2J1czsKK307CisKKy8qKgorICogc3RydWN0IGZzbF9tY19idXMgLSBsb2dpY2FsIGJ1cyB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgcGh5c2ljYWwgRFBSQworICogQG1jX2RldjogZnNsLW1jIGRldmljZSBmb3IgdGhlIGJ1cyBkZXZpY2UgaXRzZWxmLgorICogQHJlc291cmNlX3Bvb2xzOiBhcnJheSBvZiByZXNvdXJjZSBwb29scyAob25lIHBvb2wgcGVyIHJlc291cmNlIHR5cGUpCisgKiBmb3IgdGhpcyBNQyBidXMuIFRoZXNlIHJlc291cmNlcyByZXByZXNlbnQgYWxsb2NhdGFibGUgZW50aXRpZXMKKyAqIGZyb20gdGhlIHBoeXNpY2FsIERQUkMuCisgKiBAaXJxX3Jlc291cmNlczogUG9pbnRlciB0byBhcnJheSBvZiBJUlEgb2JqZWN0cyBmb3IgdGhlIElSUSBwb29sCisgKiBAc2Nhbl9tdXRleDogU2VyaWFsaXplcyBidXMgc2Nhbm5pbmcKKyAqIEBkcHJjX2F0dHI6IERQUkMgYXR0cmlidXRlcworICovCitzdHJ1Y3QgZnNsX21jX2J1cyB7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgbWNfZGV2OworCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2VfcG9vbCByZXNvdXJjZV9wb29sc1tGU0xfTUNfTlVNX1BPT0xfVFlQRVNdOworCXN0cnVjdCBmc2xfbWNfZGV2aWNlX2lycSAqaXJxX3Jlc291cmNlczsKKwlzdHJ1Y3QgbXV0ZXggc2Nhbl9tdXRleDsgICAgLyogc2VyaWFsaXplcyBidXMgc2Nhbm5pbmcgKi8KKwlzdHJ1Y3QgZHByY19hdHRyaWJ1dGVzIGRwcmNfYXR0cjsKK307CisKKyNkZWZpbmUgdG9fZnNsX21jX2J1cyhfbWNfZGV2KSBcCisJY29udGFpbmVyX29mKF9tY19kZXYsIHN0cnVjdCBmc2xfbWNfYnVzLCBtY19kZXYpCisKK2ludCBkcHJjX3NjYW5fY29udGFpbmVyKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2KTsKKworaW50IGRwcmNfc2Nhbl9vYmplY3RzKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2LAorCQkgICAgICB1bnNpZ25lZCBpbnQgKnRvdGFsX2lycV9jb3VudCk7CisKK2ludCBfX2luaXQgZHByY19kcml2ZXJfaW5pdCh2b2lkKTsKKwordm9pZCBkcHJjX2RyaXZlcl9leGl0KHZvaWQpOworCitpbnQgX19pbml0IGZzbF9tY19hbGxvY2F0b3JfZHJpdmVyX2luaXQodm9pZCk7CisKK3ZvaWQgZnNsX21jX2FsbG9jYXRvcl9kcml2ZXJfZXhpdCh2b2lkKTsKKworc3RydWN0IGlycV9kb21haW4gKmZzbF9tY19tc2lfY3JlYXRlX2lycV9kb21haW4oc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3bm9kZSwKKwkJCQkJCXN0cnVjdCBtc2lfZG9tYWluX2luZm8gKmluZm8sCisJCQkJCQlzdHJ1Y3QgaXJxX2RvbWFpbiAqcGFyZW50KTsKKworaW50IGZzbF9tY19maW5kX21zaV9kb21haW4oc3RydWN0IGRldmljZSAqbWNfcGxhdGZvcm1fZGV2LAorCQkJICAgc3RydWN0IGlycV9kb21haW4gKiptY19tc2lfZG9tYWluKTsKKworaW50IGZzbF9tY19wb3B1bGF0ZV9pcnFfcG9vbChzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzLAorCQkJICAgICB1bnNpZ25lZCBpbnQgaXJxX2NvdW50KTsKKwordm9pZCBmc2xfbWNfY2xlYW51cF9pcnFfcG9vbChzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzKTsKKwordm9pZCBmc2xfbWNfaW5pdF9hbGxfcmVzb3VyY2VfcG9vbHMoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYpOworCit2b2lkIGZzbF9tY19jbGVhbnVwX2FsbF9yZXNvdXJjZV9wb29scyhzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2Rldik7CisKK2Jvb2wgZnNsX21jX2J1c19leGlzdHModm9pZCk7CisKK3ZvaWQgZnNsX21jX2dldF9yb290X2RwcmMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgZGV2aWNlICoqcm9vdF9kcHJjX2Rldik7CisKK2Jvb2wgZnNsX21jX2lzX3Jvb3RfZHByYyhzdHJ1Y3QgZGV2aWNlICpkZXYpOworCitleHRlcm4gc3RydWN0IGJ1c190eXBlIGZzbF9tY19idXNfdHlwZTsKKworI2VuZGlmIC8qIF9GU0xfTUNfTUNCVVNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvaW5jbHVkZS9tYy1wcml2YXRlLmggYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvbWMtcHJpdmF0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWIxYWU5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvaW5jbHVkZS9tYy1wcml2YXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoKLSAqIEZyZWVzY2FsZSBNYW5hZ2VtZW50IENvbXBsZXggKE1DKSBidXMgcHJpdmF0ZSBkZWNsYXJhdGlvbnMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KLSAqIEF1dGhvcjogR2VybWFuIFJpdmVyYSA8R2VybWFuLlJpdmVyYUBmcmVlc2NhbGUuY29tPgotICoKLSAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55Ci0gKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKi8KLSNpZm5kZWYgX0ZTTF9NQ19QUklWQVRFX0hfCi0jZGVmaW5lIF9GU0xfTUNfUFJJVkFURV9IXwotCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy5oIgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+Ci0KLSNkZWZpbmUgRlNMX01DX0RQUkNfRFJJVkVSX05BTUUgICAgImZzbF9tY19kcHJjIgotCi0jZGVmaW5lIEZTTF9NQ19ERVZJQ0VfTUFUQ0goX21jX2RldiwgX29ial9kZXNjKSBcCi0JKHN0cmNtcCgoX21jX2RldiktPm9ial9kZXNjLnR5cGUsIChfb2JqX2Rlc2MpLT50eXBlKSA9PSAwICYmIFwKLQkgKF9tY19kZXYpLT5vYmpfZGVzYy5pZCA9PSAoX29ial9kZXNjKS0+aWQpCi0KLSNkZWZpbmUgRlNMX01DX0lTX0FMTE9DQVRBQkxFKF9vYmpfdHlwZSkgXAotCShzdHJjbXAoX29ial90eXBlLCAiZHBicCIpID09IDAgfHwgXAotCSBzdHJjbXAoX29ial90eXBlLCAiZHBtY3AiKSA9PSAwIHx8IFwKLQkgc3RyY21wKF9vYmpfdHlwZSwgImRwY29uIikgPT0gMCkKLQotc3RydWN0IGlycV9kb21haW47Ci1zdHJ1Y3QgbXNpX2RvbWFpbl9pbmZvOwotCi0vKioKLSAqIE1heGltdW0gbnVtYmVyIG9mIHRvdGFsIElSUXMgdGhhdCBjYW4gYmUgcHJlLWFsbG9jYXRlZCBmb3IgYW4gTUMgYnVzJwotICogSVJRIHBvb2wKLSAqLwotI2RlZmluZSBGU0xfTUNfSVJRX1BPT0xfTUFYX1RPVEFMX0lSUVMJMjU2Ci0KLXN0cnVjdCBkZXZpY2Vfbm9kZTsKLXN0cnVjdCBpcnFfZG9tYWluOwotc3RydWN0IG1zaV9kb21haW5faW5mbzsKLQotLyoqCi0gKiBzdHJ1Y3QgZnNsX21jIC0gUHJpdmF0ZSBkYXRhIG9mIGEgImZzbCxxb3JpcS1tYyIgcGxhdGZvcm0gZGV2aWNlCi0gKiBAcm9vdF9tY19idXNfZGV2OiBNQyBvYmplY3QgZGV2aWNlIHJlcHJlc2VudGluZyB0aGUgcm9vdCBEUFJDCi0gKiBAbnVtX3RyYW5zbGF0aW9uX3JhbmdlczogbnVtYmVyIG9mIGVudHJpZXMgaW4gYWRkcl90cmFuc2xhdGlvbl9yYW5nZXMKLSAqIEB0cmFuc2xhdGlvbl9yYW5nZXM6IGFycmF5IG9mIGJ1cyB0byBzeXN0ZW0gYWRkcmVzcyB0cmFuc2xhdGlvbiByYW5nZXMKLSAqLwotc3RydWN0IGZzbF9tYyB7Ci0Jc3RydWN0IGZzbF9tY19kZXZpY2UgKnJvb3RfbWNfYnVzX2RldjsKLQl1OCBudW1fdHJhbnNsYXRpb25fcmFuZ2VzOwotCXN0cnVjdCBmc2xfbWNfYWRkcl90cmFuc2xhdGlvbl9yYW5nZSAqdHJhbnNsYXRpb25fcmFuZ2VzOwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgZnNsX21jX2FkZHJfdHJhbnNsYXRpb25fcmFuZ2UgLSBidXMgdG8gc3lzdGVtIGFkZHJlc3MgdHJhbnNsYXRpb24KLSAqIHJhbmdlCi0gKiBAbWNfcmVnaW9uX3R5cGU6IFR5cGUgb2YgTUMgcmVnaW9uIGZvciB0aGUgcmFuZ2UgYmVpbmcgdHJhbnNsYXRlZAotICogQHN0YXJ0X21jX29mZnNldDogU3RhcnQgTUMgb2Zmc2V0IG9mIHRoZSByYW5nZSBiZWluZyB0cmFuc2xhdGVkCi0gKiBAZW5kX21jX29mZnNldDogTUMgb2Zmc2V0IG9mIHRoZSBmaXJzdCBieXRlIGFmdGVyIHRoZSByYW5nZSAobGFzdCBNQwotICogb2Zmc2V0IG9mIHRoZSByYW5nZSBpcyBlbmRfbWNfb2Zmc2V0IC0gMSkKLSAqIEBzdGFydF9waHlzX2FkZHI6IHN5c3RlbSBwaHlzaWNhbCBhZGRyZXNzIGNvcnJlc3BvbmRpbmcgdG8gc3RhcnRfbWNfYWRkcgotICovCi1zdHJ1Y3QgZnNsX21jX2FkZHJfdHJhbnNsYXRpb25fcmFuZ2UgewotCWVudW0gZHByY19yZWdpb25fdHlwZSBtY19yZWdpb25fdHlwZTsKLQl1NjQgc3RhcnRfbWNfb2Zmc2V0OwotCXU2NCBlbmRfbWNfb2Zmc2V0OwotCXBoeXNfYWRkcl90IHN0YXJ0X3BoeXNfYWRkcjsKLX07Ci0KLS8qKgotICogc3RydWN0IGZzbF9tY19yZXNvdXJjZV9wb29sIC0gUG9vbCBvZiBNQyByZXNvdXJjZXMgb2YgYSBnaXZlbgotICogdHlwZQotICogQHR5cGU6IHR5cGUgb2YgcmVzb3VyY2VzIGluIHRoZSBwb29sCi0gKiBAbWF4X2NvdW50OiBtYXhpbXVtIG51bWJlciBvZiByZXNvdXJjZXMgaW4gdGhlIHBvb2wKLSAqIEBmcmVlX2NvdW50OiBudW1iZXIgb2YgZnJlZSByZXNvdXJjZXMgaW4gdGhlIHBvb2wKLSAqIEBtdXRleDogbXV0ZXggdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcG9vbCdzIGZyZWUgbGlzdAotICogQGZyZWVfbGlzdDogYW5jaG9yIG5vZGUgb2YgbGlzdCBvZiBmcmVlIHJlc291cmNlcyBpbiB0aGUgcG9vbAotICogQG1jX2J1czogcG9pbnRlciB0byB0aGUgTUMgYnVzIHRoYXQgb3ducyB0aGlzIHJlc291cmNlIHBvb2wKLSAqLwotc3RydWN0IGZzbF9tY19yZXNvdXJjZV9wb29sIHsKLQllbnVtIGZzbF9tY19wb29sX3R5cGUgdHlwZTsKLQlpbnQxNl90IG1heF9jb3VudDsKLQlpbnQxNl90IGZyZWVfY291bnQ7Ci0Jc3RydWN0IG11dGV4IG11dGV4OwkvKiBzZXJpYWxpemVzIGFjY2VzcyB0byBmcmVlX2xpc3QgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfbGlzdDsKLQlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzOwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgZnNsX21jX2J1cyAtIGxvZ2ljYWwgYnVzIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBwaHlzaWNhbCBEUFJDCi0gKiBAbWNfZGV2OiBmc2wtbWMgZGV2aWNlIGZvciB0aGUgYnVzIGRldmljZSBpdHNlbGYuCi0gKiBAcmVzb3VyY2VfcG9vbHM6IGFycmF5IG9mIHJlc291cmNlIHBvb2xzIChvbmUgcG9vbCBwZXIgcmVzb3VyY2UgdHlwZSkKLSAqIGZvciB0aGlzIE1DIGJ1cy4gVGhlc2UgcmVzb3VyY2VzIHJlcHJlc2VudCBhbGxvY2F0YWJsZSBlbnRpdGllcwotICogZnJvbSB0aGUgcGh5c2ljYWwgRFBSQy4KLSAqIEBpcnFfcmVzb3VyY2VzOiBQb2ludGVyIHRvIGFycmF5IG9mIElSUSBvYmplY3RzIGZvciB0aGUgSVJRIHBvb2wKLSAqIEBzY2FuX211dGV4OiBTZXJpYWxpemVzIGJ1cyBzY2FubmluZwotICogQGRwcmNfYXR0cjogRFBSQyBhdHRyaWJ1dGVzCi0gKi8KLXN0cnVjdCBmc2xfbWNfYnVzIHsKLQlzdHJ1Y3QgZnNsX21jX2RldmljZSBtY19kZXY7Ci0Jc3RydWN0IGZzbF9tY19yZXNvdXJjZV9wb29sIHJlc291cmNlX3Bvb2xzW0ZTTF9NQ19OVU1fUE9PTF9UWVBFU107Ci0Jc3RydWN0IGZzbF9tY19kZXZpY2VfaXJxICppcnFfcmVzb3VyY2VzOwotCXN0cnVjdCBtdXRleCBzY2FuX211dGV4OyAgICAvKiBzZXJpYWxpemVzIGJ1cyBzY2FubmluZyAqLwotCXN0cnVjdCBkcHJjX2F0dHJpYnV0ZXMgZHByY19hdHRyOwotfTsKLQotI2RlZmluZSB0b19mc2xfbWNfYnVzKF9tY19kZXYpIFwKLQljb250YWluZXJfb2YoX21jX2Rldiwgc3RydWN0IGZzbF9tY19idXMsIG1jX2RldikKLQotaW50IF9fbXVzdF9jaGVjayBmc2xfbWNfZGV2aWNlX2FkZChzdHJ1Y3QgZHByY19vYmpfZGVzYyAqb2JqX2Rlc2MsCi0JCQkJICAgc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCi0JCQkJICAgc3RydWN0IGRldmljZSAqcGFyZW50X2RldiwKLQkJCQkgICBzdHJ1Y3QgZnNsX21jX2RldmljZSAqKm5ld19tY19kZXYpOwotCi12b2lkIGZzbF9tY19kZXZpY2VfcmVtb3ZlKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYpOwotCi1pbnQgZHByY19zY2FuX2NvbnRhaW5lcihzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2Rldik7Ci0KLWludCBkcHJjX3NjYW5fb2JqZWN0cyhzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldiwKLQkJICAgICAgdW5zaWduZWQgaW50ICp0b3RhbF9pcnFfY291bnQpOwotCi1pbnQgX19pbml0IGRwcmNfZHJpdmVyX2luaXQodm9pZCk7Ci0KLXZvaWQgZHByY19kcml2ZXJfZXhpdCh2b2lkKTsKLQotaW50IF9faW5pdCBmc2xfbWNfYWxsb2NhdG9yX2RyaXZlcl9pbml0KHZvaWQpOwotCi12b2lkIGZzbF9tY19hbGxvY2F0b3JfZHJpdmVyX2V4aXQodm9pZCk7Ci0KLWludCBfX211c3RfY2hlY2sgZnNsX21jX3Jlc291cmNlX2FsbG9jYXRlKHN0cnVjdCBmc2xfbWNfYnVzICptY19idXMsCi0JCQkJCSAgZW51bSBmc2xfbWNfcG9vbF90eXBlIHBvb2xfdHlwZSwKLQkJCQkJICBzdHJ1Y3QgZnNsX21jX3Jlc291cmNlCi0JCQkJCQkJICAqKm5ld19yZXNvdXJjZSk7Ci0KLXZvaWQgZnNsX21jX3Jlc291cmNlX2ZyZWUoc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqcmVzb3VyY2UpOwotCi1zdHJ1Y3QgaXJxX2RvbWFpbiAqZnNsX21jX21zaV9jcmVhdGVfaXJxX2RvbWFpbihzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlLAotCQkJCQkJc3RydWN0IG1zaV9kb21haW5faW5mbyAqaW5mbywKLQkJCQkJCXN0cnVjdCBpcnFfZG9tYWluICpwYXJlbnQpOwotCi1pbnQgZnNsX21jX2ZpbmRfbXNpX2RvbWFpbihzdHJ1Y3QgZGV2aWNlICptY19wbGF0Zm9ybV9kZXYsCi0JCQkgICBzdHJ1Y3QgaXJxX2RvbWFpbiAqKm1jX21zaV9kb21haW4pOwotCi1pbnQgZnNsX21jX21zaV9kb21haW5fYWxsb2NfaXJxcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJIHVuc2lnbmVkIGludCBpcnFfY291bnQpOwotCi12b2lkIGZzbF9tY19tc2lfZG9tYWluX2ZyZWVfaXJxcyhzdHJ1Y3QgZGV2aWNlICpkZXYpOwotCi1pbnQgX19pbml0IGl0c19mc2xfbWNfbXNpX2luaXQodm9pZCk7Ci0KLXZvaWQgaXRzX2ZzbF9tY19tc2lfY2xlYW51cCh2b2lkKTsKLQotaW50IGZzbF9tY19wb3B1bGF0ZV9pcnFfcG9vbChzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzLAotCQkJICAgICB1bnNpZ25lZCBpbnQgaXJxX2NvdW50KTsKLQotdm9pZCBmc2xfbWNfY2xlYW51cF9pcnFfcG9vbChzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzKTsKLQotI2VuZGlmIC8qIF9GU0xfTUNfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL21jLXN5cy5oIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL21jLXN5cy5oCmluZGV4IGM1MDM4Y2MuLjg5YWQwY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvaW5jbHVkZS9tYy1zeXMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvbWMtc3lzLmgKQEAgLTM3LDggKzM3LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCkBAIC05NSwxOSArOTMsNiBAQAogCX07CiB9OwogCi1pbnQgX19tdXN0X2NoZWNrIGZzbF9jcmVhdGVfbWNfaW8oc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgcGh5c19hZGRyX3QgbWNfcG9ydGFsX3BoeXNfYWRkciwKLQkJCQkgIHUzMiBtY19wb3J0YWxfc2l6ZSwKLQkJCQkgIHN0cnVjdCBmc2xfbWNfZGV2aWNlICpkcG1jcF9kZXYsCi0JCQkJICB1MzIgZmxhZ3MsIHN0cnVjdCBmc2xfbWNfaW8gKipuZXdfbWNfaW8pOwotCi12b2lkIGZzbF9kZXN0cm95X21jX2lvKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvKTsKLQotaW50IGZzbF9tY19pb19zZXRfZHBtY3Aoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCi0JCQlzdHJ1Y3QgZnNsX21jX2RldmljZSAqZHBtY3BfZGV2KTsKLQotdm9pZCBmc2xfbWNfaW9fdW5zZXRfZHBtY3Aoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8pOwotCiBpbnQgbWNfc2VuZF9jb21tYW5kKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLCBzdHJ1Y3QgbWNfY29tbWFuZCAqY21kKTsKIAogI2VuZGlmIC8qIF9GU0xfTUNfU1lTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvaW5jbHVkZS9tYy5oIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL21jLmgKaW5kZXggODUzY2JmMy4uZjZlNzIwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL21jLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL21jLmgKQEAgLTEzLDcgKzEzLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlICIuLi9pbmNsdWRlL2RwcmMuaCIKIApAQCAtMjEsNyArMjAsNiBAQAogCiBzdHJ1Y3QgZnNsX21jX2RldmljZTsKIHN0cnVjdCBmc2xfbWNfaW87Ci1zdHJ1Y3QgZnNsX21jX2J1czsKIAogLyoqCiAgKiBzdHJ1Y3QgZnNsX21jX2RyaXZlciAtIE1DIG9iamVjdCBkZXZpY2UgZHJpdmVyIG9iamVjdApAQCAtMTEyLDExICsxMTAsNiBAQAogI2RlZmluZSBGU0xfTUNfSVNfRFBSQwkweDAwMDEKIAogLyoqCi0gKiBEZWZhdWx0IERNQSBtYXNrIGZvciBkZXZpY2VzIG9uIGEgZnNsLW1jIGJ1cwotICovCi0jZGVmaW5lIEZTTF9NQ19ERUZBVUxUX0RNQV9NQVNLCSh+MFVMTCkKLQotLyoqCiAgKiBzdHJ1Y3QgZnNsX21jX2RldmljZSAtIE1DIG9iamVjdCBkZXZpY2Ugb2JqZWN0CiAgKiBAZGV2OiBMaW51eCBkcml2ZXIgbW9kZWwgZGV2aWNlIG9iamVjdAogICogQGRtYV9tYXNrOiBEZWZhdWx0IERNQSBtYXNrCkBAIC0xODcsOCArMTgwLDYgQEAKIAogdm9pZCBmc2xfbWNfZHJpdmVyX3VucmVnaXN0ZXIoc3RydWN0IGZzbF9tY19kcml2ZXIgKmRyaXZlcik7CiAKLWJvb2wgZnNsX21jX2J1c19leGlzdHModm9pZCk7Ci0KIGludCBfX211c3RfY2hlY2sgZnNsX21jX3BvcnRhbF9hbGxvY2F0ZShzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2LAogCQkJCQl1MTYgbWNfaW9fZmxhZ3MsCiAJCQkJCXN0cnVjdCBmc2xfbWNfaW8gKipuZXdfbWNfaW8pOwpAQCAtMjA3LDggKzE5OCw0IEBACiAKIHZvaWQgZnNsX21jX2ZyZWVfaXJxcyhzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2KTsKIAotYm9vbCBmc2xfbWNfaXNfcm9vdF9kcHJjKHN0cnVjdCBkZXZpY2UgKmRldik7Ci0KLWV4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgZnNsX21jX2J1c190eXBlOwotCiAjZW5kaWYgLyogX0ZTTF9NQ19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Z3c2VyaWFsL2Z3c2VyaWFsLmMgYi9kcml2ZXJzL3N0YWdpbmcvZndzZXJpYWwvZndzZXJpYWwuYwppbmRleCBjMjQxYzBhLi40OWM3MThiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZndzZXJpYWwvZndzZXJpYWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZndzZXJpYWwvZndzZXJpYWwuYwpAQCAtMzksOSArMzksOSBAQAogc3RhdGljIGJvb2wgYXV0b19jb25uZWN0ID0gdHJ1ZTsgICAgLyogdHJ5IHRvIFZJUlRfQ0FCTEUgdG8gZXZlcnkgcGVlciAgICAgICAgKi8KIHN0YXRpYyBib29sIGNyZWF0ZV9sb29wX2RldiA9IHRydWU7IC8qIGNyZWF0ZSBhIGxvb3BiYWNrIGRldmljZSBmb3IgZWFjaCBjYXJkICovCiAKLW1vZHVsZV9wYXJhbV9uYW1lZCh0dHlzLCBudW1fdHR5cywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7Ci1tb2R1bGVfcGFyYW1fbmFtZWQoYXV0bywgYXV0b19jb25uZWN0LCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7Ci1tb2R1bGVfcGFyYW1fbmFtZWQobG9vcCwgY3JlYXRlX2xvb3BfZGV2LCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW1fbmFtZWQodHR5cywgbnVtX3R0eXMsIGludCwgMDY0NCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoYXV0bywgYXV0b19jb25uZWN0LCBib29sLCAwNjQ0KTsKK21vZHVsZV9wYXJhbV9uYW1lZChsb29wLCBjcmVhdGVfbG9vcF9kZXYsIGJvb2wsIDA2NDQpOwogCiAvKgogICogVGhyZXNob2xkIGJlbG93IHdoaWNoIHRoZSB0dHkgaXMgd29rZW4gZm9yIHdyaXRpbmcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV9sdGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV9sdGUuYwppbmRleCBiYjU1MjE5Li5lNzJkZmE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fbHRlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX2x0ZS5jCkBAIC04MjgsNyArODI4LDcgQEAKIAkJCQlyeF9jb21wbGV0ZSwgcGh5X2RldiwgVVNCX0NPTVBMRVRFKTsKIH0KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX29wcyBnZG1fbmV0ZGV2X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgZ2RtX25ldGRldl9vcHMgPSB7CiAJLm5kb19vcGVuCQkJPSBnZG1fbHRlX29wZW4sCiAJLm5kb19zdG9wCQkJPSBnZG1fbHRlX2Nsb3NlLAogCS5uZG9fc2V0X2NvbmZpZwkJCT0gZ2RtX2x0ZV9zZXRfY29uZmlnLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX211eC5oIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX211eC5oCmluZGV4IDNkNTAzODMuLjA4NzFiOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV9tdXguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fbXV4LmgKQEAgLTI3LDggKzI3LDggQEAKIAogI2RlZmluZSBTVEFSVF9GTEFHIDB4QTUxMjQ4NUEKICNkZWZpbmUgTVVYX0hFQURFUl9TSVpFIDE0Ci0jZGVmaW5lIE1VWF9UWF9NQVhfU0laRSAoMTAyNCoxMCkKLSNkZWZpbmUgTVVYX1JYX01BWF9TSVpFICgxMDI0KjMwKQorI2RlZmluZSBNVVhfVFhfTUFYX1NJWkUgKDEwMjQgKiAxMCkKKyNkZWZpbmUgTVVYX1JYX01BWF9TSVpFICgxMDI0ICogMzApCiAjZGVmaW5lIEFUX1BLVF9UWVBFIDB4RjAxMQogI2RlZmluZSBETV9QS1RfVFlQRSAweEYwMTAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX3R0eS5jIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX3R0eS5jCmluZGV4IGViN2UyNTIuLmFlMzk2NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV90dHkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fdHR5LmMKQEAgLTIyNSw3ICsyMjUsNiBAQAogCWludCBqOwogCiAJZm9yIChpID0gMDsgaSA8IFRUWV9NQVhfQ09VTlQ7IGkrKykgewotCiAJCWdkbSA9IGttYWxsb2Moc2l6ZW9mKCpnZG0pLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFnZG0pCiAJCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV91c2IuYwppbmRleCBkNjUwZDc3Li4xNWE3ZTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fdXNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX3VzYi5jCkBAIC00MTUsMTAgKzQxNSwxMCBAQAogCQlzd2l0Y2ggKGNtZF9ldnQpIHsKIAkJY2FzZSBMVEVfR0VUX0lORk9STUFUSU9OX1JFU1VMVDoKIAkJCWlmIChzZXRfbWFjX2FkZHJlc3MoaGNpLT5kYXRhLCByLT5jYl9kYXRhKSA9PSAwKSB7Ci0JCQkJcmV0ID0gci0+Y2FsbGJhY2soci0+Y2JfZGF0YSwKLQkJCQkJCSAgci0+YnVmLAotCQkJCQkJICByLT51cmItPmFjdHVhbF9sZW5ndGgsCi0JCQkJCQkgIEtFUk5FTF9USFJFQUQpOworCQkJCXItPmNhbGxiYWNrKHItPmNiX2RhdGEsCisJCQkJCSAgICByLT5idWYsCisJCQkJCSAgICByLT51cmItPmFjdHVhbF9sZW5ndGgsCisJCQkJCSAgICBLRVJORUxfVEhSRUFEKTsKIAkJCX0KIAkJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fdXNiLmggYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fdXNiLmgKaW5kZXggZTY0ODZlNy4uZmZiM2Q5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX3VzYi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV91c2IuaApAQCAtMjYsMTAgKzI2LDEwIEBACiAjZGVmaW5lIFBNX1NVU1BFTkQgMQogI2RlZmluZSBBVVRPX1NVU1BFTkRfVElNRVIgNTAwMCAvKiBtcyAqLwogCi0jZGVmaW5lIFJYX0JVRl9TSVpFCQkoMTAyNCozMikKLSNkZWZpbmUgVFhfQlVGX1NJWkUJCSgxMDI0KjMyKQorI2RlZmluZSBSWF9CVUZfU0laRQkJKDEwMjQgKiAzMikKKyNkZWZpbmUgVFhfQlVGX1NJWkUJCSgxMDI0ICogMzIpCiAjZGVmaW5lIFNEVV9CVUZfU0laRQkyMDQ4Ci0jZGVmaW5lIE1BWF9TRFVfU0laRQkoMTAyNCozMCkKKyNkZWZpbmUgTUFYX1NEVV9TSVpFCSgxMDI0ICogMzApCiAjZGVmaW5lIE1BWF9QQUNLRVRfSU5fTVVMVElfU0RVCTI1NgogCiAjZGVmaW5lIFZJRF9HQ1QJCQkweDEwNzYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2hjaV9wYWNrZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2hjaV9wYWNrZXQuaAppbmRleCBkYmM0NDQ2Li40NjQ0Zjg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9oY2lfcGFja2V0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvaGNpX3BhY2tldC5oCkBAIC04OSw1ICs4OSw0IEBACiAJdTMyIGNvbm5lY3Q7CiB9IF9fcGFja2VkOwogCi0KICNlbmRpZiAvKiBfSENJX1BBQ0tFVF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvbmV0bGlua19rLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9uZXRsaW5rX2suYwppbmRleCBhMDIzMmU4Li5hYmUyNDI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9uZXRsaW5rX2suYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9uZXRsaW5rX2suYwpAQCAtMTQsNiArMTQsNyBAQAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CkBAIC0yMSwxMyArMjIsNyBAQAogCiAjaW5jbHVkZSAibmV0bGlua19rLmgiCiAKLSNpZiBkZWZpbmVkKERFRklORV9NVVRFWCkKIHN0YXRpYyBERUZJTkVfTVVURVgobmV0bGlua19tdXRleCk7Ci0jZWxzZQotc3RhdGljIHN0cnVjdCBzZW1hcGhvcmUgbmV0bGlua19tdXRleDsKLSNkZWZpbmUgbXV0ZXhfbG9jayh4KQkJZG93bih4KQotI2RlZmluZSBtdXRleF91bmxvY2soeCkJCXVwKHgpCi0jZW5kaWYKIAogI2RlZmluZSBORF9NQVhfR1JPVVAJCTMwCiAjZGVmaW5lIE5EX0lGSU5ERVhfTEVOCQlzaXplb2YoaW50KQpAQCAtOTYsMTAgKzkxLDYgQEAKIAkJLmlucHV0ICA9IG5ldGxpbmtfcmN2LAogCX07CiAKLSNpZiAhZGVmaW5lZChERUZJTkVfTVVURVgpCi0JaW5pdF9NVVRFWCgmbmV0bGlua19tdXRleCk7Ci0jZW5kaWYKLQogCXNvY2sgPSBuZXRsaW5rX2tlcm5lbF9jcmVhdGUoJmluaXRfbmV0LCB1bml0LCAmY2ZnKTsKIAogCWlmIChzb2NrKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvRG9jdW1lbnRhdGlvbi9maXJtd2FyZS9hdXRoZW50aWNhdGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL0RvY3VtZW50YXRpb24vZmlybXdhcmUvYXV0aGVudGljYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIwNjg4YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL0RvY3VtZW50YXRpb24vZmlybXdhcmUvYXV0aGVudGljYXRlLmMKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBTYW1wbGUgY29kZSB0byB0ZXN0IENBUCBwcm90b2NvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDE2IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQoYykgMjAxNiBMaW5hcm8gTHRkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAxNiBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0KGMpIDIwMTYgTGluYXJvIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICogICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBvciBMaW5hcm8gTHRkLiBub3IgdGhlIG5hbWVzIG9mCisgKiAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBHT09HTEUgSU5DLiBPUgorICogTElOQVJPIExURC4gQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSAiLi4vLi4vZ3JleWJ1c19hdXRoZW50aWNhdGlvbi5oIgorCitzdHJ1Y3QgY2FwX2lvY19nZXRfZW5kcG9pbnRfdWlkIHVpZDsKK3N0cnVjdCBjYXBfaW9jX2dldF9pbXNfY2VydGlmaWNhdGUgY2VydCA9IHsKKwkuY2VydGlmaWNhdGVfY2xhc3MgPSAwLAorCS5jZXJ0aWZpY2F0ZV9pZCA9IDAsCit9OworCitzdHJ1Y3QgY2FwX2lvY19hdXRoZW50aWNhdGUgYXV0aGVudGljYXRlID0geworCS5hdXRoX3R5cGUgPSAwLAorCS5jaGFsbGVuZ2UgPSB7MH0sCit9OworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gMTAwMDA7CisJY2hhciAqY2FwZGV2OworCWludCBmZCwgcmV0OworCisJLyogTWFrZSBzdXJlIGFyZ3VtZW50cyBhcmUgY29ycmVjdCAqLworCWlmIChhcmdjICE9IDIpIHsKKwkJcHJpbnRmKCJcblVzYWdlOiAuL2Zpcm13YXJlIDxQYXRoIG9mIHRoZSBnYi1jYXAtWCBkZXY+XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FwZGV2ID0gYXJndlsxXTsKKworCXByaW50ZigiT3BlbmluZyAlcyBhdXRoZW50aWNhdGlvbiBkZXZpY2VcbiIsIGNhcGRldik7CisKKwlmZCA9IG9wZW4oY2FwZGV2LCBPX1JEV1IpOworCWlmIChmZCA8IDApIHsKKwkJcHJpbnRmKCJGYWlsZWQgdG8gb3BlbjogJXNcbiIsIGNhcGRldik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBHZXQgVUlEICovCisJcHJpbnRmKCJHZXQgVUlEXG4iKTsKKworCXJldCA9IGlvY3RsKGZkLCBDQVBfSU9DX0dFVF9FTkRQT0lOVF9VSUQsICZ1aWQpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ZigiRmFpbGVkIHRvIGdldCBVSUQ6ICVzICglZClcbiIsIGNhcGRldiwgcmV0KTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gY2xvc2VfZmQ7CisJfQorCisJcHJpbnRmKCJVSUQgcmVjZWl2ZWQ6IDB4JWxseFxuIiwgKihsb25nIGxvbmcgdW5zaWduZWQgaW50ICopKHVpZC51aWQpKTsKKworCS8qIEdldCBjZXJ0aWZpY2F0ZSAqLworCXByaW50ZigiR2V0IElNUyBjZXJ0aWZpY2F0ZVxuIik7CisKKwlyZXQgPSBpb2N0bChmZCwgQ0FQX0lPQ19HRVRfSU1TX0NFUlRJRklDQVRFLCAmY2VydCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRmKCJGYWlsZWQgdG8gZ2V0IElNUyBjZXJ0aWZpY2F0ZTogJXMgKCVkKVxuIiwgY2FwZGV2LCByZXQpOworCQlyZXQgPSAtMTsKKwkJZ290byBjbG9zZV9mZDsKKwl9CisKKwlwcmludGYoIklNUyBDZXJ0aWZpY2F0ZSBzaXplOiAlZFxuIiwgY2VydC5jZXJ0X3NpemUpOworCisJLyogQXV0aGVudGljYXRlICovCisJcHJpbnRmKCJBdXRoZW50aWNhdGUgbW9kdWxlXG4iKTsKKworCW1lbWNweShhdXRoZW50aWNhdGUudWlkLCB1aWQudWlkLCA4KTsKKworCXJldCA9IGlvY3RsKGZkLCBDQVBfSU9DX0FVVEhFTlRJQ0FURSwgJmF1dGhlbnRpY2F0ZSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRmKCJGYWlsZWQgdG8gYXV0aGVudGljYXRlIG1vZHVsZTogJXMgKCVkKVxuIiwgY2FwZGV2LCByZXQpOworCQlyZXQgPSAtMTsKKwkJZ290byBjbG9zZV9mZDsKKwl9CisKKwlwcmludGYoIkF1dGhlbnRpY2F0ZWQsIHJlc3VsdCAoJTAyeCksIHNpZy1zaXplICglMDJ4KVxuIiwKKwkJYXV0aGVudGljYXRlLnJlc3VsdF9jb2RlLCBhdXRoZW50aWNhdGUuc2lnbmF0dXJlX3NpemUpOworCitjbG9zZV9mZDoKKwljbG9zZShmZCk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvRG9jdW1lbnRhdGlvbi9maXJtd2FyZS9maXJtd2FyZS1tYW5hZ2VtZW50IGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvRG9jdW1lbnRhdGlvbi9maXJtd2FyZS9maXJtd2FyZS1tYW5hZ2VtZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MTgyNTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9Eb2N1bWVudGF0aW9uL2Zpcm13YXJlL2Zpcm13YXJlLW1hbmFnZW1lbnQKQEAgLTAsMCArMSwzMzMgQEAKKworRmlybXdhcmUgTWFuYWdlbWVudAorLS0tLS0tLS0tLS0tLS0tLS0tLQorIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuCisgQ29weXJpZ2h0IDIwMTYgTGluYXJvIEx0ZC4KKworSW50ZXJmYWNlLU1hbmlmZXN0CistLS0tLS0tLS0tLS0tLS0tLS0KKworQWxsIGZpcm13YXJlIHBhY2thZ2VzIG9uIHRoZSBNb2R1bGVzIG9yIEludGVyZmFjZXMgYXJlIG1hbmFnZWQgYnkgYSBzcGVjaWFsCitGaXJtd2FyZSBNYW5hZ2VtZW50IFByb3RvY29sLiBUbyBzdXBwb3J0IEZpcm13YXJlIE1hbmFnZW1lbnQgYnkgdGhlIEFQLCB0aGUKK0ludGVyZmFjZSBNYW5pZmVzdCBzaGFsbCBhdCBsZWFzdCBjb250YWluIHRoZSBGaXJtd2FyZSBNYW5hZ2VtZW50IEJ1bmRsZSBhbmQgYQorRmlybXdhcmUgTWFuYWdlbWVudCBQcm90b2NvbCBDUG9ydCB3aXRoaW4gaXQuCisKK1RoZSBidW5kbGUgbWF5IGNvbnRhaW4gYWRkaXRpb25hbCBDUG9ydHMgYmFzZWQgb24gdGhlIGV4dHJhIGZ1bmN0aW9uYWxpdHkKK3JlcXVpcmVkIHRvIG1hbmFnZSBmaXJtd2FyZSBwYWNrYWdlcy4KKworRm9yIGV4YW1wbGUsIHRoaXMgaXMgaG93IHRoZSBGaXJtd2FyZSBNYW5hZ2VtZW50IHBhcnQgb2YgdGhlIEludGVyZmFjZSBNYW5pZmVzdAorbWF5IGxvb2sgbGlrZToKKworCTsgRmlybXdhcmUgTWFuYWdlbWVudCBCdW5kbGUgKEJ1bmRsZSAxKToKKwlbYnVuZGxlLWRlc2NyaXB0b3IgMV0KKwljbGFzcyA9IDB4MTYKKworCTsgKE1hbmRhdG9yeSkgRmlybXdhcmUgTWFuYWdlbWVudCBQcm90b2NvbCBvbiBDUG9ydCAxCisJW2Nwb3J0LWRlc2NyaXB0b3IgMl0KKwlidW5kbGUgPSAxCisJcHJvdG9jb2wgPSAweDE4CisKKwk7IChPcHRpb25hbCkgRmlybXdhcmUgRG93bmxvYWQgUHJvdG9jb2wgb24gQ1BvcnQgMgorCVtjcG9ydC1kZXNjcmlwdG9yIDFdCisJYnVuZGxlID0gMQorCXByb3RvY29sID0gMHgxNworCisJOyAoT3B0aW9uYWwpIFNQSSBwcm90b2NvbCBvbiBDUG9ydCAzCisJW2Nwb3J0LWRlc2NyaXB0b3IgM10KKwlidW5kbGUgPSAxCisJcHJvdG9jb2wgPSAweDBiCisKKwk7IChPcHRpb25hbCkgQ29tcG9uZW50IEF1dGhlbnRpY2F0aW9uIFByb3RvY29sIChDQVApIG9uIENQb3J0IDQKKwlbY3BvcnQtZGVzY3JpcHRvciA0XQorCWJ1bmRsZSA9IDEKKwlwcm90b2NvbCA9IDB4MTkKKworCitTeXNmcyBJbnRlcmZhY2VzIC0gRmlybXdhcmUgTWFuYWdlbWVudAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIEZpcm13YXJlIE1hbmFnZW1lbnQgUHJvdG9jb2wgaW50ZXJhY3RzIHdpdGggVXNlcnNwYWNlIHVzaW5nIHRoZSBjaGFyYWN0ZXIKK2RldmljZSBpbnRlcmZhY2UuIFRoZSBjaGFyYWN0ZXIgZGV2aWNlIHdpbGwgYmUgcHJlc2VudCBpbiAvZGV2LyBkaXJlY3RvcnkKK2FuZCB3aWxsIGJlIG5hbWVkIGdiLWZ3LW1nbXQtPE4+LiBUaGUgbnVtYmVyIDxOPiBpcyBhc3NpZ25lZCBhdCBydW50aW1lLgorCitJZGVudGlmeWluZyB0aGUgQ2hhcmFjdGVyIERldmljZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlcmUgY2FuIGJlIG11bHRpcGxlIGRldmljZXMgcHJlc2VudCBpbiAvZGV2LyBkaXJlY3Rvcnkgd2l0aCBuYW1lIGdiLWZ3LW1nbXQtTgorYW5kIHVzZXIgZmlyc3QgbmVlZHMgdG8gaWRlbnRpZnkgdGhlIGNoYXJhY3RlciBkZXZpY2UgdXNlZCBmb3IKK2Zpcm13YXJlLW1hbmFnZW1lbnQgZm9yIGEgcGFydGljdWxhciBpbnRlcmZhY2UuCisKK1RoZSBGaXJtd2FyZSBNYW5hZ2VtZW50IGNvcmUgY3JlYXRlcyBhIGRldmljZSBvZiBjbGFzcyAnZ2JfZndfbWdtdCcsIHdoaWNoIHNoYWxsCitiZSB1c2VkIGJ5IHRoZSB1c2VyIHRvIGlkZW50aWZ5IHRoZSByaWdodCBjaGFyYWN0ZXIgZGV2aWNlIGZvciBpdC4gVGhlIGNsYXNzCitkZXZpY2UgaXMgY3JlYXRlZCB3aXRoaW4gdGhlIEJ1bmRsZSBkaXJlY3RvcnkgZm9yIGEgcGFydGljdWxhciBJbnRlcmZhY2UuCisKK0ZvciBleGFtcGxlIHRoaXMgaXMgaG93IHRoZSBjbGFzcy1kZXZpY2UgY2FuIGJlIHByZXNlbnQ6CisKKy9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy8xLTEvMS0xLjEvMS0xLjEuMS9nYl9md19tZ210L2diLWZ3LW1nbXQtMAorCitUaGUgbGFzdCBuYW1lIGluIHRoaXMgcGF0aDogZ2ItZnctbWdtdC0wIGlzIHByZWNpc2VseSB0aGUgbmFtZSBvZiB0aGUgY2hhcgorZGV2aWNlIGFuZCBzbyB0aGUgZGV2aWNlIGluIHRoaXMgY2FzZSB3aWxsIGJlOgorCisvZGV2L2diLWZ3LW1nbXQtMC4KKworT3BlcmF0aW9ucyBvbiB0aGUgQ2hhciBkZXZpY2UKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBDaGFyYWN0ZXIgZGV2aWNlIChnYi1mdy1tZ210LTAgaW4gZXhhbXBsZSkgY2FuIGJlIG9wZW5lZCBieSB0aGUgdXNlcnNwYWNlCithcHBsaWNhdGlvbiBhbmQgaXQgY2FuIHBlcmZvcm0gdmFyaW91cyAnaW9jdGwnIG9wZXJhdGlvbnMgb24gdGhlIGRldmljZS4gVGhlCitkZXZpY2UgZG9lc24ndCBzdXBwb3J0IGFueSByZWFkL3dyaXRlIG9wZXJhdGlvbnMuCisKK0ZvbGxvd2luZyBhcmUgdGhlIElPQ1RMcyBhbmQgdGhlaXIgZGF0YSBzdHJ1Y3R1cmVzIGF2YWlsYWJsZSB0byB0aGUgdXNlcjoKKworLyogSU9DVEwgc3VwcG9ydCAqLworI2RlZmluZSBHQl9GV19MT0FEX01FVEhPRF9VTklQUk8JCTB4MDEKKyNkZWZpbmUgR0JfRldfTE9BRF9NRVRIT0RfSU5URVJOQUwJCTB4MDIKKworI2RlZmluZSBHQl9GV19MT0FEX1NUQVRVU19GQUlMRUQJCTB4MDAKKyNkZWZpbmUgR0JfRldfTE9BRF9TVEFUVVNfVU5WQUxJREFURUQJCTB4MDEKKyNkZWZpbmUgR0JfRldfTE9BRF9TVEFUVVNfVkFMSURBVEVECQkweDAyCisjZGVmaW5lIEdCX0ZXX0xPQURfU1RBVFVTX1ZBTElEQVRJT05fRkFJTEVECTB4MDMKKworI2RlZmluZSBHQl9GV19CQUNLRU5EX0ZXX1NUQVRVU19TVUNDRVNTCQkweDAxCisjZGVmaW5lIEdCX0ZXX0JBQ0tFTkRfRldfU1RBVFVTX0ZBSUxfRklORAkweDAyCisjZGVmaW5lIEdCX0ZXX0JBQ0tFTkRfRldfU1RBVFVTX0ZBSUxfRkVUQ0gJMHgwMworI2RlZmluZSBHQl9GV19CQUNLRU5EX0ZXX1NUQVRVU19GQUlMX1dSSVRFCTB4MDQKKyNkZWZpbmUgR0JfRldfQkFDS0VORF9GV19TVEFUVVNfSU5UCQkweDA1CisjZGVmaW5lIEdCX0ZXX0JBQ0tFTkRfRldfU1RBVFVTX1JFVFJZCQkweDA2CisjZGVmaW5lIEdCX0ZXX0JBQ0tFTkRfRldfU1RBVFVTX05PVF9TVVBQT1JURUQJMHgwNworCisjZGVmaW5lIEdCX0ZXX0JBQ0tFTkRfVkVSU0lPTl9TVEFUVVNfU1VDQ0VTUwkJMHgwMQorI2RlZmluZSBHQl9GV19CQUNLRU5EX1ZFUlNJT05fU1RBVFVTX05PVF9BVkFJTEFCTEUJMHgwMgorI2RlZmluZSBHQl9GV19CQUNLRU5EX1ZFUlNJT05fU1RBVFVTX05PVF9TVVBQT1JURUQJMHgwMworI2RlZmluZSBHQl9GV19CQUNLRU5EX1ZFUlNJT05fU1RBVFVTX1JFVFJZCQkweDA0CisjZGVmaW5lIEdCX0ZXX0JBQ0tFTkRfVkVSU0lPTl9TVEFUVVNfRkFJTF9JTlQJCTB4MDUKKworCitzdHJ1Y3QgZndfbWdtdF9pb2NfZ2V0X2ludGZfdmVyc2lvbiB7CisJX191OCBmaXJtd2FyZV90YWdbR0JfRklSTVdBUkVfVV9UQUdfTUFYX1NJWkVdOworCV9fdTE2IG1ham9yOworCV9fdTE2IG1pbm9yOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCitzdHJ1Y3QgZndfbWdtdF9pb2NfZ2V0X2JhY2tlbmRfdmVyc2lvbiB7CisJX191OCBmaXJtd2FyZV90YWdbR0JfRklSTVdBUkVfVV9UQUdfTUFYX1NJWkVdOworCV9fdTE2IG1ham9yOworCV9fdTE2IG1pbm9yOworCV9fdTggc3RhdHVzOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCitzdHJ1Y3QgZndfbWdtdF9pb2NfaW50Zl9sb2FkX2FuZF92YWxpZGF0ZSB7CisJX191OAkJCWZpcm13YXJlX3RhZ1tHQl9GSVJNV0FSRV9UQUdfTUFYX1NJWkVdOworCV9fdTgJCQlsb2FkX21ldGhvZDsKKwlfX3U4CQkJc3RhdHVzOworCV9fdTE2CQkJbWFqb3I7CisJX191MTYJCQltaW5vcjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBmd19tZ210X2lvY19iYWNrZW5kX2Z3X3VwZGF0ZSB7CisJX191OAkJCWZpcm13YXJlX3RhZ1tHQl9GSVJNV0FSRV9UQUdfTUFYX1NJWkVdOworCV9fdTgJCQlzdGF0dXM7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEZXX01HTVRfSU9DVExfQkFTRQkJCSdTJworI2RlZmluZSBGV19NR01UX0lPQ19HRVRfSU5URl9GVwkJCV9JT1IoRldfTUdNVF9JT0NUTF9CQVNFLCAwLCBzdHJ1Y3QgZndfbWdtdF9pb2NfZ2V0X2ludGZfdmVyc2lvbikKKyNkZWZpbmUgRldfTUdNVF9JT0NfR0VUX0JBQ0tFTkRfRlcJCV9JT1dSKEZXX01HTVRfSU9DVExfQkFTRSwgMSwgc3RydWN0IGZ3X21nbXRfaW9jX2dldF9iYWNrZW5kX3ZlcnNpb24pCisjZGVmaW5lIEZXX01HTVRfSU9DX0lOVEZfTE9BRF9BTkRfVkFMSURBVEUJX0lPV1IoRldfTUdNVF9JT0NUTF9CQVNFLCAyLCBzdHJ1Y3QgZndfbWdtdF9pb2NfaW50Zl9sb2FkX2FuZF92YWxpZGF0ZSkKKyNkZWZpbmUgRldfTUdNVF9JT0NfSU5URl9CQUNLRU5EX0ZXX1VQREFURQlfSU9XUihGV19NR01UX0lPQ1RMX0JBU0UsIDMsIHN0cnVjdCBmd19tZ210X2lvY19iYWNrZW5kX2Z3X3VwZGF0ZSkKKyNkZWZpbmUgRldfTUdNVF9JT0NfU0VUX1RJTUVPVVRfTVMJCV9JT1coRldfTUdNVF9JT0NUTF9CQVNFLCA0LCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIEZXX01HTVRfSU9DX01PREVfU1dJVENICQkJX0lPKEZXX01HTVRfSU9DVExfQkFTRSwgNSkKKworMS4gRldfTUdNVF9JT0NfR0VUX0lOVEZfRlc6CisKKyAgIFRoaXMgaW9jdGwgc2hhbGwgYmUgdXNlZCBieSB0aGUgdXNlciB0byBnZXQgdGhlIHZlcnNpb24gYW5kIGZpcm13YXJlLXRhZyBvZgorICAgdGhlIGN1cnJlbnRseSBydW5uaW5nIEludGVyZmFjZSBGaXJtd2FyZS4gQWxsIHRoZSBmaWVsZHMgb2YgdGhlICdzdHJ1Y3QKKyAgIGZ3X21nbXRfaW9jX2dldF9mdycgYXJlIGZpbGxlZCBieSB0aGUga2VybmVsLgorCisyLiBGV19NR01UX0lPQ19HRVRfQkFDS0VORF9GVzoKKworICAgVGhpcyBpb2N0bCBzaGFsbCBiZSB1c2VkIGJ5IHRoZSB1c2VyIHRvIGdldCB0aGUgdmVyc2lvbiBvZiBhIGN1cnJlbnRseQorICAgcnVubmluZyBCYWNrZW5kIEludGVyZmFjZSBGaXJtd2FyZSBpZGVudGlmaWVkIGJ5IGEgZmlybXdhcmUtdGFnLiBUaGUgdXNlciBpcworICAgcmVxdWlyZWQgdG8gZmlsbCB0aGUgJ2Zpcm13YXJlX3RhZycgZmllbGQgb2YgdGhlICdzdHJ1Y3QgZndfbWdtdF9pb2NfZ2V0X2Z3JworICAgaW4gdGhpcyBjYXNlLiBUaGUgJ21ham9yJyBhbmQgJ21pbm9yJyBmaWVsZHMgYXJlIHNldCBieSB0aGUga2VybmVsIGluCisgICByZXNwb25zZS4KKworMy4gRldfTUdNVF9JT0NfSU5URl9MT0FEX0FORF9WQUxJREFURToKKworICAgVGhpcyBpb2N0bCBzaGFsbCBiZSB1c2VkIGJ5IHRoZSB1c2VyIHRvIGxvYWQgYW4gSW50ZXJmYWNlIEZpcm13YXJlIHBhY2thZ2Ugb24KKyAgIGFuIEludGVyZmFjZS4gVGhlIHVzZXIgbmVlZHMgdG8gZmlsbCB0aGUgJ2Zpcm13YXJlX3RhZycgYW5kICdsb2FkX21ldGhvZCcKKyAgIGZpZWxkcyBvZiB0aGUgJ3N0cnVjdCBmd19tZ210X2lvY19pbnRmX2xvYWRfYW5kX3ZhbGlkYXRlJy4gVGhlICdzdGF0dXMnLAorICAgJ21ham9yJyBhbmQgJ21pbm9yJyBmaWVsZHMgYXJlIHNldCBieSB0aGUga2VybmVsIGluIHJlc3BvbnNlLgorCis0LiBGV19NR01UX0lPQ19JTlRGX0JBQ0tFTkRfRldfVVBEQVRFOgorCisgICBUaGlzIGlvY3RsIHNoYWxsIGJlIHVzZWQgYnkgdGhlIHVzZXIgdG8gcmVxdWVzdCBhbiBJbnRlcmZhY2UgdG8gdXBkYXRlIGEKKyAgIEJhY2tlbmQgSW50ZXJmYWNlIEZpcm13YXJlLiAgVGhlIHVzZXIgaXMgcmVxdWlyZWQgdG8gZmlsbCB0aGUgJ2Zpcm13YXJlX3RhZycKKyAgIGZpZWxkIG9mIHRoZSAnc3RydWN0IGZ3X21nbXRfaW9jX2dldF9mdycgaW4gdGhpcyBjYXNlLiBUaGUgJ3N0YXR1cycgZmllbGQgaXMKKyAgIHNldCBieSB0aGUga2VybmVsIGluIHJlc3BvbnNlLgorCis1LiBGV19NR01UX0lPQ19TRVRfVElNRU9VVF9NUzoKKworICAgVGhpcyBpb2N0bCBzaGFsbCBiZSB1c2VkIGJ5IHRoZSB1c2VyIHRvIGluY3JlYXNlIHRoZSB0aW1lb3V0IGludGVydmFsIHdpdGhpbgorICAgd2hpY2ggdGhlIGZpcm13YXJlIG11c3QgZ2V0IGxvYWRlZCBieSB0aGUgTW9kdWxlLiBUaGUgZGVmYXVsdCB0aW1lb3V0IGlzIDEKKyAgIHNlY29uZC4gVGhlIHVzZXIgbmVlZHMgdG8gcGFzcyB0aGUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuCisKKzYuIEZXX01HTVRfSU9DX01PREVfU1dJVENIOgorCisgICBUaGlzIGlvY3RsIHNoYWxsIGJlIHVzZWQgYnkgdGhlIHVzZXIgdG8gbW9kZS1zd2l0Y2ggdGhlIG1vZHVsZSB0byB0aGUKKyAgIHByZXZpb3VzbHkgbG9hZGVkIGludGVyZmFjZSBmaXJtd2FyZS4gSWYgdGhlIGludGVyZmFjZSBmaXJtd2FyZSBpc24ndCBsb2FkZWQKKyAgIHByZXZpb3VzbHksIG9yIGlmIGFub3RoZXIgdW5zdWNjZXNzZnVsIEZXX01HTVRfSU9DX0lOVEZfTE9BRF9BTkRfVkFMSURBVEUKKyAgIG9wZXJhdGlvbiBpcyBzdGFydGVkIGFmdGVyIGxvYWRpbmcgaW50ZXJmYWNlIGZpcm13YXJlLCB0aGVuIHRoZSBmaXJtd2FyZSBjb3JlCisgICB3b3VsZG4ndCBhbGxvdyBtb2RlLXN3aXRjaC4KKworCitTeXNmcyBJbnRlcmZhY2VzIC0gQXV0aGVudGljYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgQ29tcG9uZW50IEF1dGhlbnRpY2F0aW9uIFByb3RvY29sIGludGVyYWN0cyB3aXRoIFVzZXJzcGFjZSB1c2luZyB0aGUKK2NoYXJhY3RlciBkZXZpY2UgaW50ZXJmYWNlLiBUaGUgY2hhcmFjdGVyIGRldmljZSB3aWxsIGJlIHByZXNlbnQgaW4gL2Rldi8KK2RpcmVjdG9yeSBhbmQgd2lsbCBiZSBuYW1lZCBnYi1hdXRoZW50aWNhdGUtPE4+LiBUaGUgbnVtYmVyIDxOPiBpcyBhc3NpZ25lZCBhdAorcnVudGltZS4KKworSWRlbnRpZnlpbmcgdGhlIENoYXJhY3RlciBEZXZpY2UKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZXJlIGNhbiBiZSBtdWx0aXBsZSBkZXZpY2VzIHByZXNlbnQgaW4gL2Rldi8gZGlyZWN0b3J5IHdpdGggbmFtZQorZ2ItYXV0aGVudGljYXRlLU4gYW5kIHVzZXIgZmlyc3QgbmVlZHMgdG8gaWRlbnRpZnkgdGhlIGNoYXJhY3RlciBkZXZpY2UgdXNlZCBmb3IKK2F1dGhlbnRpY2F0aW9uIGEgb2YgcGFydGljdWxhciBpbnRlcmZhY2UuCisKK1RoZSBBdXRoZW50aWNhdGlvbiBjb3JlIGNyZWF0ZXMgYSBkZXZpY2Ugb2YgY2xhc3MgJ2diX2F1dGhlbnRpY2F0ZScsIHdoaWNoIHNoYWxsCitiZSB1c2VkIGJ5IHRoZSB1c2VyIHRvIGlkZW50aWZ5IHRoZSByaWdodCBjaGFyYWN0ZXIgZGV2aWNlIGZvciBpdC4gVGhlIGNsYXNzCitkZXZpY2UgaXMgY3JlYXRlZCB3aXRoaW4gdGhlIEJ1bmRsZSBkaXJlY3RvcnkgZm9yIGEgcGFydGljdWxhciBJbnRlcmZhY2UuCisKK0ZvciBleGFtcGxlIHRoaXMgaXMgaG93IHRoZSBjbGFzcy1kZXZpY2UgY2FuIGJlIHByZXNlbnQ6CisKKy9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy8xLTEvMS0xLjEvMS0xLjEuMS9nYl9hdXRoZW50aWNhdGUvZ2ItYXV0aGVudGljYXRlLTAKKworVGhlIGxhc3QgbmFtZSBpbiB0aGlzIHBhdGg6IGdiLWF1dGhlbnRpY2F0ZS0wIGlzIHByZWNpc2VseSB0aGUgbmFtZSBvZiB0aGUgY2hhcgorZGV2aWNlIGFuZCBzbyB0aGUgZGV2aWNlIGluIHRoaXMgY2FzZSB3aWxsIGJlOgorCisvZGV2L2diLWF1dGhlbnRpY2F0ZS0wLgorCitPcGVyYXRpb25zIG9uIHRoZSBDaGFyIGRldmljZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIENoYXJhY3RlciBkZXZpY2UgKC9kZXYvZ2ItYXV0aGVudGljYXRlLTAgaW4gYWJvdmUgZXhhbXBsZSkgY2FuIGJlIG9wZW5lZCBieQordGhlIHVzZXJzcGFjZSBhcHBsaWNhdGlvbiBhbmQgaXQgY2FuIHBlcmZvcm0gdmFyaW91cyAnaW9jdGwnIG9wZXJhdGlvbnMgb24gdGhlCitkZXZpY2UuIFRoZSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IGFueSByZWFkL3dyaXRlIG9wZXJhdGlvbnMuCisKK0ZvbGxvd2luZyBhcmUgdGhlIElPQ1RMcyBhbmQgdGhlaXIgZGF0YSBzdHJ1Y3R1cmVzIGF2YWlsYWJsZSB0byB0aGUgdXNlcjoKKworI2RlZmluZSBDQVBfQ0VSVElGSUNBVEVfTUFYX1NJWkUJMTYwMAorI2RlZmluZSBDQVBfU0lHTkFUVVJFX01BWF9TSVpFCQkzMjAKKworLyogQ2VydGlmaWNhdGUgY2xhc3MgdHlwZXMgKi8KKyNkZWZpbmUgQ0FQX0NFUlRfSU1TX0VBUEMJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQ0FQX0NFUlRfSU1TX0VBU0MJCTB4MDAwMDAwMDIKKyNkZWZpbmUgQ0FQX0NFUlRfSU1TX0VBUkMJCTB4MDAwMDAwMDMKKyNkZWZpbmUgQ0FQX0NFUlRfSU1TX0lBUEMJCTB4MDAwMDAwMDQKKyNkZWZpbmUgQ0FQX0NFUlRfSU1TX0lBU0MJCTB4MDAwMDAwMDUKKyNkZWZpbmUgQ0FQX0NFUlRfSU1TX0lBUkMJCTB4MDAwMDAwMDYKKworLyogSU1TIENlcnRpZmljYXRlIHJlc3BvbnNlIHJlc3VsdCBjb2RlcyAqLworI2RlZmluZSBDQVBfSU1TX1JFU1VMVF9DRVJUX0ZPVU5ECTB4MDAKKyNkZWZpbmUgQ0FQX0lNU19SRVNVTFRfQ0VSVF9DTEFTU19JTlZBTAkweDAxCisjZGVmaW5lIENBUF9JTVNfUkVTVUxUX0NFUlRfQ09SUlVQVAkweDAyCisjZGVmaW5lIENBUF9JTVNfUkVTVUxUX0NFUlRfTk9UX0ZPVU5ECTB4MDMKKworLyogQXV0aGVudGljYXRpb24gdHlwZXMgKi8KKyNkZWZpbmUgQ0FQX0FVVEhfSU1TX1BSSQkJMHgwMDAwMDAwMQorI2RlZmluZSBDQVBfQVVUSF9JTVNfU0VDCQkweDAwMDAwMDAyCisjZGVmaW5lIENBUF9BVVRIX0lNU19SU0EJCTB4MDAwMDAwMDMKKworLyogQXV0aGVudGljYXRlIHJlc3BvbnNlIHJlc3VsdCBjb2RlcyAqLworI2RlZmluZSBDQVBfQVVUSF9SRVNVTFRfQ1JfU1VDQ0VTUwkweDAwCisjZGVmaW5lIENBUF9BVVRIX1JFU1VMVF9DUl9CQURfVFlQRQkweDAxCisjZGVmaW5lIENBUF9BVVRIX1JFU1VMVF9DUl9XUk9OR19FUAkweDAyCisjZGVmaW5lIENBUF9BVVRIX1JFU1VMVF9DUl9OT19LRVkJMHgwMworI2RlZmluZSBDQVBfQVVUSF9SRVNVTFRfQ1JfU0lHX0ZBSUwJMHgwNAorCisKKy8qIElPQ1RMIHN1cHBvcnQgKi8KK3N0cnVjdCBjYXBfaW9jX2dldF9lbmRwb2ludF91aWQgeworCV9fdTgJCQl1aWRbOF07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBjYXBfaW9jX2dldF9pbXNfY2VydGlmaWNhdGUgeworCV9fdTMyCQkJY2VydGlmaWNhdGVfY2xhc3M7CisJX191MzIJCQljZXJ0aWZpY2F0ZV9pZDsKKworCV9fdTgJCQlyZXN1bHRfY29kZTsKKwlfX3UzMgkJCWNlcnRfc2l6ZTsKKwlfX3U4CQkJY2VydGlmaWNhdGVbQ0FQX0NFUlRJRklDQVRFX01BWF9TSVpFXTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGNhcF9pb2NfYXV0aGVudGljYXRlIHsKKwlfX3UzMgkJCWF1dGhfdHlwZTsKKwlfX3U4CQkJdWlkWzhdOworCV9fdTgJCQljaGFsbGVuZ2VbMzJdOworCisJX191OAkJCXJlc3VsdF9jb2RlOworCV9fdTgJCQlyZXNwb25zZVs2NF07CisJX191MzIJCQlzaWduYXR1cmVfc2l6ZTsKKwlfX3U4CQkJc2lnbmF0dXJlW0NBUF9TSUdOQVRVUkVfTUFYX1NJWkVdOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCisjZGVmaW5lIENBUF9JT0NUTF9CQVNFCQkJJ0MnCisjZGVmaW5lIENBUF9JT0NfR0VUX0VORFBPSU5UX1VJRAlfSU9SKENBUF9JT0NUTF9CQVNFLCAwLCBzdHJ1Y3QgY2FwX2lvY19nZXRfZW5kcG9pbnRfdWlkKQorI2RlZmluZSBDQVBfSU9DX0dFVF9JTVNfQ0VSVElGSUNBVEUJX0lPV1IoQ0FQX0lPQ1RMX0JBU0UsIDEsIHN0cnVjdCBjYXBfaW9jX2dldF9pbXNfY2VydGlmaWNhdGUpCisjZGVmaW5lIENBUF9JT0NfQVVUSEVOVElDQVRFCQlfSU9XUihDQVBfSU9DVExfQkFTRSwgMiwgc3RydWN0IGNhcF9pb2NfYXV0aGVudGljYXRlKQorCisKKzEuIENBUF9JT0NfR0VUX0VORFBPSU5UX1VJRDoKKworICAgVGhpcyBpb2N0bCBzaGFsbCBiZSB1c2VkIGJ5IHRoZSB1c2VyIHRvIGdldCB0aGUgZW5kcG9pbnQgVUlEIGFzc29jaWF0ZWQgd2l0aAorICAgdGhlIEludGVyZmFjZS4gIEFsbCB0aGUgZmllbGRzIG9mIHRoZSAnc3RydWN0IGNhcF9pb2NfZ2V0X2VuZHBvaW50X3VpZCcgYXJlCisgICBmaWxsZWQgYnkgdGhlIGtlcm5lbC4KKworMi4gQ0FQX0lPQ19HRVRfSU1TX0NFUlRJRklDQVRFOgorCisgICBUaGlzIGlvY3RsIHNoYWxsIGJlIHVzZWQgYnkgdGhlIHVzZXIgdG8gcmV0cmlldmUgb25lIG9mIHRoZSBhdmFpbGFibGUKKyAgIGNyeXB0b2dyYXBoaWMgY2VydGlmaWNhdGVzIGhlbGQgYnkgdGhlIEludGVyZmFjZSBmb3IgdXNlIGluIENvbXBvbmVudAorICAgQXV0aGVudGljYXRpb24uIFRoZSB1c2VyIGlzIHJlcXVpcmVkIHRvIGZpbGwgdGhlICdjZXJ0aWZpY2F0ZV9jbGFzcycgYW5kCisgICAnY2VydGlmaWNhdGVfaWQnIGZpZWxkIG9mIHRoZSAnc3RydWN0IGNhcF9pb2NfZ2V0X2ltc19jZXJ0aWZpY2F0ZScgaW4gdGhpcworICAgY2FzZS4gVGhlIG90aGVyIGZpZWxkcyB3aWxsIGJlIHNldCBieSB0aGUga2VybmVsIGluIHJlc3BvbnNlLiBUaGUgZmlyc3QKKyAgICdjZXJ0X3NpemUnIGJ5dGVzIG9mIHRoZSAnY2VydGlmaWNhdGUnIHNoYWxsIGJlIHJlYWQgYnkgdGhlIHVzZXIgYW5kIG90aGVycworICAgbXVzdCBiZSBkaXNjYXJkZWQuCisKKzMuIENBUF9JT0NfQVVUSEVOVElDQVRFOgorCisgICBUaGlzIGlvY3RsIHNoYWxsIGJlIHVzZWQgYnkgdGhlIHVzZXIgdG8gYXV0aGVudGljYXRlIHRoZSBNb2R1bGUgYXR0YWNoZWQgdG8KKyAgIGFuIEludGVyZmFjZS4gIFRoZSB1c2VyIG5lZWRzIHRvIGZpbGwgdGhlICdhdXRoX3R5cGUnLCAndWlkJywgYW5kICdjaGFsbGVuZ2UnCisgICBmaWVsZHMgb2YgdGhlICdzdHJ1Y3QgY2FwX2lvY19hdXRoZW50aWNhdGUnLiBUaGUgb3RoZXIgZmllbGRzIHdpbGwgYmUgc2V0IGJ5CisgICB0aGUga2VybmVsIGluIHJlc3BvbnNlLiAgVGhlIGZpcnN0ICdzaWduYXR1cmVfc2l6ZScgYnl0ZXMgb2YgdGhlICdzaWduYXR1cmUnCisgICBzaGFsbCBiZSByZWFkIGJ5IHRoZSB1c2VyIGFuZCBvdGhlcnMgbXVzdCBiZSBkaXNjYXJkZWQuCisKKworU3lzZnMgSW50ZXJmYWNlcyAtIEZpcm13YXJlIERvd25sb2FkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIEZpcm13YXJlIERvd25sb2FkIFByb3RvY29sIHVzZXMgdGhlIGV4aXN0aW5nIExpbnV4IEtlcm5lbCdzIEZpcm13YXJlIGNsYXNzCithbmQgdGhlIGludGVyZmFjZSBwcm92aWRlZCB0byB1c2Vyc3BhY2UgYXJlIGRlc2NyaWJlZCBpbjoKK0RvY3VtZW50YXRpb24vZmlybXdhcmVfY2xhc3MvLgorCisKK1N5c2ZzIEludGVyZmFjZXMgLSBTUEkgRmxhc2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIFNQSSBmbGFzaCBpcyBleHBvc2VkIGluIHVzZXJzcGFjZSBhcyBhIE1URCBkZXZpY2UgYW5kIGlzIGNyZWF0ZWQKK3dpdGhpbiB0aGUgQnVuZGxlIGRpcmVjdG9yeS4gRm9yIGV4YW1wbGUsIHRoaXMgaXMgaG93IHRoZSBwYXRoIG1heSBsb29rIGxpa2U6CisKKyQgbHMgL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMS8xLTEuMS8xLTEuMS4xL3NwaV9tYXN0ZXIvc3BpMzI3NjYvc3BpMzI3NjYuMC9tdGQKK210ZDAgICAgbXRkMHJvCisKKworU2FtcGxlIEFwcGxpY2F0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgY3VycmVudCBkaXJlY3RvcnkgYWxzbyBwcm92aWRlcyBhIGZpcm13YXJlLmMgdGVzdCBhcHBsaWNhdGlvbiwgd2hpY2ggY2FuIGJlCityZWZlcmVuY2VkIHdoaWxlIGRldmVsb3BpbmcgdXNlcnNwYWNlIGFwcGxpY2F0aW9uIHRvIHRhbGsgdG8gZmlybXdhcmUtbWFuYWdlbWVudAorcHJvdG9jb2wuCisKK1RoZSBjdXJyZW50IGRpcmVjdG9yeSBhbHNvIHByb3ZpZGVzIGEgYXV0aGVudGljYXRlLmMgdGVzdCBhcHBsaWNhdGlvbiwgd2hpY2ggY2FuCitiZSByZWZlcmVuY2VkIHdoaWxlIGRldmVsb3BpbmcgdXNlcnNwYWNlIGFwcGxpY2F0aW9uIHRvIHRhbGsgdG8KK2NvbXBvbmVudCBhdXRoZW50aWNhdGlvbiBwcm90b2NvbC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL0RvY3VtZW50YXRpb24vZmlybXdhcmUvZmlybXdhcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL0RvY3VtZW50YXRpb24vZmlybXdhcmUvZmlybXdhcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjkzODI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvRG9jdW1lbnRhdGlvbi9maXJtd2FyZS9maXJtd2FyZS5jCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogU2FtcGxlIGNvZGUgdG8gdGVzdCBmaXJtd2FyZS1tYW5hZ2VtZW50IHByb3RvY29sCisgKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMTYgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodChjKSAyMDE2IExpbmFybyBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDE2IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQoYykgMjAxNiBMaW5hcm8gTHRkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKiAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG9yIExpbmFybyBMdGQuIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEdPT0dMRSBJTkMuIE9SCisgKiBMSU5BUk8gTFRELiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICIuLi8uLi9ncmV5YnVzX2Zpcm13YXJlLmgiCisKKyNkZWZpbmUgRldfREVWX0RFRkFVTFQJCSIvZGV2L2diLWZ3LW1nbXQtMCIKKyNkZWZpbmUgRldfVEFHX0lOVF9ERUZBVUxUCSJzM2YiCisjZGVmaW5lIEZXX1RBR19CQ05EX0RFRkFVTFQJImJmXzAxIgorI2RlZmluZSBGV19VUERBVEVfVFlQRV9ERUZBVUxUCTAKKyNkZWZpbmUgRldfVElNRU9VVF9ERUZBVUxUCTEwMDAwOworCitzdGF0aWMgY29uc3QgY2hhciAqZmlybXdhcmVfdGFnOworc3RhdGljIGNvbnN0IGNoYXIgKmZ3ZGV2ID0gRldfREVWX0RFRkFVTFQ7CitzdGF0aWMgaW50IGZ3X3VwZGF0ZV90eXBlID0gRldfVVBEQVRFX1RZUEVfREVGQVVMVDsKK3N0YXRpYyBpbnQgZndfdGltZW91dCA9IEZXX1RJTUVPVVRfREVGQVVMVDsKKworc3RhdGljIHN0cnVjdCBmd19tZ210X2lvY19nZXRfaW50Zl92ZXJzaW9uIGludGZfZndfaW5mbzsKK3N0YXRpYyBzdHJ1Y3QgZndfbWdtdF9pb2NfZ2V0X2JhY2tlbmRfdmVyc2lvbiBiYWNrZW5kX2Z3X2luZm87CitzdGF0aWMgc3RydWN0IGZ3X21nbXRfaW9jX2ludGZfbG9hZF9hbmRfdmFsaWRhdGUgaW50Zl9sb2FkOworc3RhdGljIHN0cnVjdCBmd19tZ210X2lvY19iYWNrZW5kX2Z3X3VwZGF0ZSBiYWNrZW5kX3VwZGF0ZTsKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlwcmludGYoIlxuVXNhZ2U6IC4vZmlybXdhcmUgPGdiLWZ3LW1nbXQtWCAoZGVmYXVsdDogZ2ItZnctbWdtdC0wKT4gPGludGVyZmFjZTogMCwgYmFja2VuZDogMSAoZGVmYXVsdDogMCk+IDxmaXJtd2FyZS10YWc+IChkZWZhdWx0OiBcInMzZlwiL1wiYmZfMDFcIikgPHRpbWVvdXQgKGRlZmF1bHQ6IDEwMDAwIG1zKT5cbiIpOworfQorCitzdGF0aWMgaW50IHVwZGF0ZV9pbnRmX2Zpcm13YXJlKGludCBmZCkKK3sKKwlpbnQgcmV0OworCisJLyogR2V0IEludGVyZmFjZSBGaXJtd2FyZSBWZXJzaW9uICovCisJcHJpbnRmKCJHZXQgSW50ZXJmYWNlIEZpcm13YXJlIFZlcnNpb25cbiIpOworCisJcmV0ID0gaW9jdGwoZmQsIEZXX01HTVRfSU9DX0dFVF9JTlRGX0ZXLCAmaW50Zl9md19pbmZvKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGYoIkZhaWxlZCB0byBnZXQgaW50ZXJmYWNlIGZpcm13YXJlIHZlcnNpb246ICVzICglZClcbiIsCisJCQlmd2RldiwgcmV0KTsKKwkJcmV0dXJuIC0xOworCX0KKworCXByaW50ZigiSW50ZXJmYWNlIEZpcm13YXJlIHRhZyAoJXMpLCBtYWpvciAoJWQpLCBtaW5vciAoJWQpXG4iLAorCQlpbnRmX2Z3X2luZm8uZmlybXdhcmVfdGFnLCBpbnRmX2Z3X2luZm8ubWFqb3IsCisJCWludGZfZndfaW5mby5taW5vcik7CisKKwkvKiBUcnkgSW50ZXJmYWNlIEZpcm13YXJlIGxvYWQgb3ZlciBVbmlwcm8gKi8KKwlwcmludGYoIkxvYWRpbmcgSW50ZXJmYWNlIEZpcm13YXJlXG4iKTsKKworCWludGZfbG9hZC5sb2FkX21ldGhvZCA9IEdCX0ZXX1VfTE9BRF9NRVRIT0RfVU5JUFJPOworCWludGZfbG9hZC5zdGF0dXMgPSAwOworCWludGZfbG9hZC5tYWpvciA9IDA7CisJaW50Zl9sb2FkLm1pbm9yID0gMDsKKworCXN0cm5jcHkoKGNoYXIgKikmaW50Zl9sb2FkLmZpcm13YXJlX3RhZywgZmlybXdhcmVfdGFnLAorCQlHQl9GSVJNV0FSRV9VX1RBR19NQVhfU0laRSk7CisKKwlyZXQgPSBpb2N0bChmZCwgRldfTUdNVF9JT0NfSU5URl9MT0FEX0FORF9WQUxJREFURSwgJmludGZfbG9hZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRmKCJGYWlsZWQgdG8gbG9hZCBpbnRlcmZhY2UgZmlybXdhcmU6ICVzICglZClcbiIsIGZ3ZGV2LAorCQkJcmV0KTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChpbnRmX2xvYWQuc3RhdHVzICE9IEdCX0ZXX1VfTE9BRF9TVEFUVVNfVkFMSURBVEVEICYmCisJICAgIGludGZfbG9hZC5zdGF0dXMgIT0gR0JfRldfVV9MT0FEX1NUQVRVU19VTlZBTElEQVRFRCkgeworCQlwcmludGYoIkxvYWQgc3RhdHVzIHNheXMgbG9hZGluZyBmYWlsZWQ6ICVkXG4iLAorCQkJaW50Zl9sb2FkLnN0YXR1cyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwcmludGYoIkludGVyZmFjZSBGaXJtd2FyZSAoJXMpIExvYWQgZG9uZTogbWFqb3I6ICVkLCBtaW5vcjogJWQsIHN0YXR1czogJWRcbiIsCisJCWZpcm13YXJlX3RhZywgaW50Zl9sb2FkLm1ham9yLCBpbnRmX2xvYWQubWlub3IsCisJCWludGZfbG9hZC5zdGF0dXMpOworCisJLyogSW5pdGlhdGUgTW9kZS1zd2l0Y2ggdG8gdGhlIG5ld2x5IGxvYWRlZCBmaXJtd2FyZSAqLworCXByaW50ZigiSW5pdGlhdGUgTW9kZSBzd2l0Y2hcbiIpOworCisJcmV0ID0gaW9jdGwoZmQsIEZXX01HTVRfSU9DX01PREVfU1dJVENIKTsKKwlpZiAocmV0IDwgMCkKKwkJcHJpbnRmKCJGYWlsZWQgdG8gaW5pdGlhdGUgbW9kZS1zd2l0Y2ggKCVkKVxuIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX2JhY2tlbmRfZmlybXdhcmUoaW50IGZkKQoreworCWludCByZXQ7CisKKwkvKiBHZXQgQmFja2VuZCBGaXJtd2FyZSBWZXJzaW9uICovCisJcHJpbnRmKCJHZXR0aW5nIEJhY2tlbmQgRmlybXdhcmUgVmVyc2lvblxuIik7CisKKwlzdHJuY3B5KChjaGFyICopJmJhY2tlbmRfZndfaW5mby5maXJtd2FyZV90YWcsIGZpcm13YXJlX3RhZywKKwkJR0JfRklSTVdBUkVfVV9UQUdfTUFYX1NJWkUpOworCityZXRyeV9md192ZXJzaW9uOgorCXJldCA9IGlvY3RsKGZkLCBGV19NR01UX0lPQ19HRVRfQkFDS0VORF9GVywgJmJhY2tlbmRfZndfaW5mbyk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRmKCJGYWlsZWQgdG8gZ2V0IGJhY2tlbmQgZmlybXdhcmUgdmVyc2lvbjogJXMgKCVkKVxuIiwKKwkJCWZ3ZGV2LCByZXQpOworCQlyZXR1cm4gLTE7CisJfQorCisJcHJpbnRmKCJCYWNrZW5kIEZpcm13YXJlIHRhZyAoJXMpLCBtYWpvciAoJWQpLCBtaW5vciAoJWQpLCBzdGF0dXMgKCVkKVxuIiwKKwkJYmFja2VuZF9md19pbmZvLmZpcm13YXJlX3RhZywgYmFja2VuZF9md19pbmZvLm1ham9yLAorCQliYWNrZW5kX2Z3X2luZm8ubWlub3IsIGJhY2tlbmRfZndfaW5mby5zdGF0dXMpOworCisJaWYgKGJhY2tlbmRfZndfaW5mby5zdGF0dXMgPT0gR0JfRldfVV9CQUNLRU5EX1ZFUlNJT05fU1RBVFVTX1JFVFJZKQorCQlnb3RvIHJldHJ5X2Z3X3ZlcnNpb247CisKKwlpZiAoKGJhY2tlbmRfZndfaW5mby5zdGF0dXMgIT0gR0JfRldfVV9CQUNLRU5EX1ZFUlNJT05fU1RBVFVTX1NVQ0NFU1MpCisJICAgICYmIChiYWNrZW5kX2Z3X2luZm8uc3RhdHVzICE9IEdCX0ZXX1VfQkFDS0VORF9WRVJTSU9OX1NUQVRVU19OT1RfQVZBSUxBQkxFKSkgeworCQlwcmludGYoIkZhaWxlZCB0byBnZXQgYmFja2VuZCBmaXJtd2FyZSB2ZXJzaW9uOiAlcyAoJWQpXG4iLAorCQkJZndkZXYsIGJhY2tlbmRfZndfaW5mby5zdGF0dXMpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogVHJ5IEJhY2tlbmQgRmlybXdhcmUgVXBkYXRlIG92ZXIgVW5pcHJvICovCisJcHJpbnRmKCJVcGRhdGluZyBCYWNrZW5kIEZpcm13YXJlXG4iKTsKKworCXN0cm5jcHkoKGNoYXIgKikmYmFja2VuZF91cGRhdGUuZmlybXdhcmVfdGFnLCBmaXJtd2FyZV90YWcsCisJCUdCX0ZJUk1XQVJFX1VfVEFHX01BWF9TSVpFKTsKKworcmV0cnlfZndfdXBkYXRlOgorCWJhY2tlbmRfdXBkYXRlLnN0YXR1cyA9IDA7CisKKwlyZXQgPSBpb2N0bChmZCwgRldfTUdNVF9JT0NfSU5URl9CQUNLRU5EX0ZXX1VQREFURSwgJmJhY2tlbmRfdXBkYXRlKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGYoIkZhaWxlZCB0byBsb2FkIGJhY2tlbmQgZmlybXdhcmU6ICVzICglZClcbiIsIGZ3ZGV2LCByZXQpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGJhY2tlbmRfdXBkYXRlLnN0YXR1cyA9PSBHQl9GV19VX0JBQ0tFTkRfRldfU1RBVFVTX1JFVFJZKSB7CisJCXByaW50ZigiUmV0cnlpbmcgZmlybXdhcmUgdXBkYXRlOiAlZFxuIiwgYmFja2VuZF91cGRhdGUuc3RhdHVzKTsKKwkJZ290byByZXRyeV9md191cGRhdGU7CisJfQorCisJaWYgKGJhY2tlbmRfdXBkYXRlLnN0YXR1cyAhPSBHQl9GV19VX0JBQ0tFTkRfRldfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcHJpbnRmKCJMb2FkIHN0YXR1cyBzYXlzIGxvYWRpbmcgZmFpbGVkOiAlZFxuIiwKKwkJCWJhY2tlbmRfdXBkYXRlLnN0YXR1cyk7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJCYWNrZW5kIEZpcm13YXJlICglcykgTG9hZCBkb25lOiBzdGF0dXM6ICVkXG4iLAorCQkJCWZpcm13YXJlX3RhZywgYmFja2VuZF91cGRhdGUuc3RhdHVzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgZmQsIHJldDsKKworCWlmIChhcmdjID4gMSAmJgorCSAgICAoIXN0cmNtcChhcmd2WzFdLCAiLWgiKSB8fCAhc3RyY21wKGFyZ3ZbMV0sICItLWhlbHAiKSkpIHsKKwkJdXNhZ2UoKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChhcmdjID4gMSkKKwkJZndkZXYgPSBhcmd2WzFdOworCisJaWYgKGFyZ2MgPiAyKQorCQlzc2NhbmYoYXJndlsyXSwgIiV1IiwgJmZ3X3VwZGF0ZV90eXBlKTsKKworCWlmIChhcmdjID4gMykgeworCQlmaXJtd2FyZV90YWcgPSBhcmd2WzNdOworCX0gZWxzZSBpZiAoIWZ3X3VwZGF0ZV90eXBlKSB7CisJCWZpcm13YXJlX3RhZyA9IEZXX1RBR19JTlRfREVGQVVMVDsKKwl9IGVsc2UgeworCQlmaXJtd2FyZV90YWcgPSBGV19UQUdfQkNORF9ERUZBVUxUOworCX0KKworCWlmIChhcmdjID4gNCkKKwkJc3NjYW5mKGFyZ3ZbNF0sICIldSIsICZmd190aW1lb3V0KTsKKworCXByaW50ZigiVHJ5aW5nIEZpcm13YXJlIHVwZGF0ZTogZndkZXY6ICVzLCB0eXBlOiAlcywgdGFnOiAlcywgdGltZW91dDogJWRcbiIsCisJCWZ3ZGV2LCBmd191cGRhdGVfdHlwZSA9PSAwID8gImludGVyZmFjZSIgOiAiYmFja2VuZCIsCisJCWZpcm13YXJlX3RhZywgZndfdGltZW91dCk7CisKKwlwcmludGYoIk9wZW5pbmcgJXMgZmlybXdhcmUgbWFuYWdlbWVudCBkZXZpY2VcbiIsIGZ3ZGV2KTsKKworCWZkID0gb3Blbihmd2RldiwgT19SRFdSKTsKKwlpZiAoZmQgPCAwKSB7CisJCXByaW50ZigiRmFpbGVkIHRvIG9wZW46ICVzXG4iLCBmd2Rldik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBTZXQgVGltZW91dCAqLworCXByaW50ZigiU2V0dGluZyB0aW1lb3V0IHRvICV1IG1zXG4iLCBmd190aW1lb3V0KTsKKworCXJldCA9IGlvY3RsKGZkLCBGV19NR01UX0lPQ19TRVRfVElNRU9VVF9NUywgJmZ3X3RpbWVvdXQpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ZigiRmFpbGVkIHRvIHNldCB0aW1lb3V0OiAlcyAoJWQpXG4iLCBmd2RldiwgcmV0KTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gY2xvc2VfZmQ7CisJfQorCisJaWYgKCFmd191cGRhdGVfdHlwZSkKKwkJcmV0ID0gdXBkYXRlX2ludGZfZmlybXdhcmUoZmQpOworCWVsc2UKKwkJcmV0ID0gdXBkYXRlX2JhY2tlbmRfZmlybXdhcmUoZmQpOworCitjbG9zZV9mZDoKKwljbG9zZShmZCk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvRG9jdW1lbnRhdGlvbi9zeXNmcy1idXMtZ3JleWJ1cyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL0RvY3VtZW50YXRpb24vc3lzZnMtYnVzLWdyZXlidXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU5OTg5NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL0RvY3VtZW50YXRpb24vc3lzZnMtYnVzLWdyZXlidXMKQEAgLTAsMCArMSwyNzUgQEAKK1doYXQ6CQkvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvZ3JleWJ1c04KK0RhdGU6CQlPY3RvYmVyIDIwMTUKK0tlcm5lbFZlcnNpb246CTQuWFgKK0NvbnRhY3Q6CUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhlICJyb290IiBncmV5YnVzIGRldmljZSBmb3IgdGhlIEdyZXlidXMgZGV2aWNlIHRyZWUsIG9yIGJ1cywKKwkJd2hlcmUgTiBpcyBhIGR5bmFtaWNhbGx5IGFzc2lnbmVkIDEtYmFzZWQgaWQuCisKK1doYXQ6CQkvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvZ3JleWJ1c04vYnVzX2lkCitEYXRlOgkJQXByaWwgMjAxNgorS2VybmVsVmVyc2lvbjoJNC5YWAorQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGUgSUQgb2YgdGhlICJyb290IiBncmV5YnVzIGRldmljZSwgb3IgYnVzLgorCitXaGF0OgkJL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzL04tTQorRGF0ZToJCU1hcmNoIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuWFgKK0NvbnRhY3Q6CUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CitEZXNjcmlwdGlvbjoKKwkJQSBNb2R1bGUgTSBvbiB0aGUgYnVzIE4sIHdoZXJlIE0gaXMgdGhlIDEtYnl0ZSBpbnRlcmZhY2UKKwkJSUQgb2YgdGhlIG1vZHVsZSdzIHByaW1hcnkgaW50ZXJmYWNlLgorCitXaGF0OgkJL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzL04tTS9lamVjdAorRGF0ZToJCU1hcmNoIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuWFgKK0NvbnRhY3Q6CUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CitEZXNjcmlwdGlvbjoKKwkJV3JpdGluZyBhIG5vbi16ZXJvIGFyZ3VtZW50IHRvIHRoaXMgYXR0aWJ1dGUgZGlzYWJsZXMgdGhlCisJCW1vZHVsZSdzIGludGVyZmFjZXMgYmVmb3JlIHBoeXNpY2FsbHkgZWplY3RpbmcgaXQuCisKK1doYXQ6CQkvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvTi1NL21vZHVsZV9pZAorRGF0ZToJCU1hcmNoIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuWFgKK0NvbnRhY3Q6CUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhlIElEIG9mIGEgR3JleWJ1cyBtb2R1bGUsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIElEIG9mIGl0cworCQlwcmltYXJ5IGludGVyZmFjZS4KKworV2hhdDoJCS9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy9OLU0vbnVtX2ludGVyZmFjZXMKK0RhdGU6CQlNYXJjaCAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LlhYCitDb250YWN0OglHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorRGVzY3JpcHRpb246CisJCVRoZSBudW1iZXIgb2YgaW50ZXJmYWNlcyBvZiBhIG1vZHVsZS4KKworV2hhdDoJCS9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy9OLU0uSQorRGF0ZToJCU9jdG9iZXIgMjAxNQorS2VybmVsVmVyc2lvbjoJNC5YWAorQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlBbiBJbnRlcmZhY2UgSSBvbiB0aGUgYnVzIE4gYW5kIG1vZHVsZSBOLU0sIHdoZXJlIEkgaXMgdGhlCisJCTEtYnl0ZSBpbnRlcmZhY2UgSUQuCisKK1doYXQ6CQkvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvTi1NLkkvY3VycmVudF9ub3cKK0RhdGU6CQlNYXJjaCAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LlhYCitDb250YWN0OglHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorRGVzY3JpcHRpb246CisJCUN1cnJlbnQgbWVhc3VyZW1lbnQgb2YgdGhlIGludGVyZmFjZSBpbiBtaWNyb2FtcHMgKHVBKQorCitXaGF0OgkJL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzL04tTS5JL2RkYmwxX21hbnVmYWN0dXJlcl9pZAorRGF0ZToJCU9jdG9iZXIgMjAxNQorS2VybmVsVmVyc2lvbjoJNC5YWAorQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlVbmlwcm8gRGV2aWNlIERlc2NyaXB0b3IgQmxvY2sgTGV2ZWwgMSBtYW51ZmFjdHVyZXIgSUQgZm9yIHRoZQorCQlncmV5YnVzIEludGVyZmFjZS4KKworV2hhdDoJCS9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy9OLU0uSS9kZGJsMV9wcm9kdWN0X2lkCitEYXRlOgkJT2N0b2JlciAyMDE1CitLZXJuZWxWZXJzaW9uOgk0LlhYCitDb250YWN0OglHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorRGVzY3JpcHRpb246CisJCVVuaXBybyBEZXZpY2UgRGVzY3JpcHRvciBCbG9jayBMZXZlbCAxIHByb2R1Y3QgSUQgZm9yIHRoZQorCQlncmV5YnVzIEludGVyZmFjZS4KKworV2hhdDoJCS9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy9OLU0uSS9pbnRlcmZhY2VfaWQKK0RhdGU6CQlPY3RvYmVyIDIwMTUKK0tlcm5lbFZlcnNpb246CTQuWFgKK0NvbnRhY3Q6CUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhlIElEIG9mIGEgR3JleWJ1cyBpbnRlcmZhY2UuCisKK1doYXQ6CQkvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvTi1NLkkvaW50ZXJmYWNlX3R5cGUKK0RhdGU6CQlKdW5lIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuWFgKK0NvbnRhY3Q6CUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhlIHR5cGUgb2YgYSBHcmV5YnVzIGludGVyZmFjZTsgImR1bW15IiwgInVuaXBybyIsICJncmV5YnVzIiwKKwkJb3IgInVua25vd24iLgorCitXaGF0OgkJL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzL04tTS5JL3Bvd2VyX25vdworRGF0ZToJCU1hcmNoIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuWFgKK0NvbnRhY3Q6CUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CitEZXNjcmlwdGlvbjoKKwkJUG93ZXIgbWVhc3VyZW1lbnQgb2YgdGhlIGludGVyZmFjZSBpbiBtaWNyb3dhdHRzICh1VykKKworV2hhdDoJCS9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy9OLU0uSS9wb3dlcl9zdGF0ZQorRGF0ZToJCU1hcmNoIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuWFgKK0NvbnRhY3Q6CUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhpcyBmaWxlIHJlZmxlY3RzIHRoZSBwb3dlciBzdGF0ZSBvZiBhIEdyZXlidXMgaW50ZXJmYWNlLiBJZgorCQl0aGUgdmFsdWUgcmVhZCBmcm9tIGl0IGlzICJvbiIsIHRoZW4gcG93ZXIgaXMgY3VycmVudGx5CisJCXN1cHBsaWVkIHRvIHRoZSBpbnRlcmZhY2UuIE90aGVyd2lzZSBpdCB3aWxsIHJlYWQgIm9mZiIgYW5kCisJCXBvd2VyIGlzIGN1cnJlbnRseSBub3Qgc3VwcGxpZWQgdG8gdGhlIGludGVyZmFjZS4KKworCQlJZiB0aGUgdmFsdWUgcmVhZCBpcyAib2ZmIiwgdGhlbiB3cml0aW5nICJvbiIgKG9yICcxJywgJ3knLAorCQknWScpIHRvIHRoaXMgZmlsZSB3aWxsIGVuYWJsZSBwb3dlciB0byB0aGUgaW50ZXJmYWNlIGFuZCBhbgorCQlhdHRlbXB0IHRvIGJvb3QgYW5kIHBvc3NpYmx5IGVudW1lcmF0ZSBpdCB3aWxsIGJlIG1hZGUuIE5vdGUKKwkJdGhhdCBvbiBlcnJvcnMsIHRoZSBpbnRlcmZhY2Ugd2lsbCBhZ2FpbiBiZSBwb3dlcmVkIGRvd24uCisKKwkJSWYgdGhlIHZhbHVlIHJlYWQgaXMgIm9uIiwgdGhlbiB3cml0aW5nICJvZmYiIChvciAnMCcsICduJywKKwkJJ04nKSB0byB0aGlzIGZpbGUgd2lsbCBwb3dlciBkb3duIHRoZSBpbnRlcmZhY2UuCisKK1doYXQ6CQkvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvTi1NLkkvcHJvZHVjdF9pZAorRGF0ZToJCU9jdG9iZXIgMjAxNQorS2VybmVsVmVyc2lvbjoJNC5YWAorQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlQcm9kdWN0IElEIG9mIGEgR3JleWJ1cyBpbnRlcmZhY2UuCisKK1doYXQ6CQkvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvTi1NLkkvc2VyaWFsX251bWJlcgorRGF0ZToJCU9jdG9iZXIgMjAxNQorS2VybmVsVmVyc2lvbjoJNC5YWAorQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlTZXJpYWwgTnVtYmVyIG9mIHRoZSBHcmV5YnVzIGludGVyZmFjZSwgcmVwcmVzZW50ZWQgYnkgYSA2NCBiaXQKKwkJaGV4YWRlY2ltYWwgbnVtYmVyLgorCitXaGF0OgkJL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzL04tTS5JL3ZlbmRvcl9pZAorRGF0ZToJCU9jdG9iZXIgMjAxNQorS2VybmVsVmVyc2lvbjoJNC5YWAorQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlWZW5kb3IgSUQgb2YgYSBHcmV5YnVzIGludGVyZmFjZS4KKworV2hhdDoJCS9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy9OLU0uSS92b2x0YWdlX25vdworRGF0ZToJCU1hcmNoIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuWFgKK0NvbnRhY3Q6CUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVm9sdGFnZSBtZWFzdXJlbWVudCBvZiB0aGUgaW50ZXJmYWNlIGluIG1pY3Jvdm9sdHMgKHVWKQorCitXaGF0OgkJL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzL04tTS5JLmN0cmwKK0RhdGU6CQlPY3RvYmVyIDIwMTUKK0tlcm5lbFZlcnNpb246CTQuWFgKK0NvbnRhY3Q6CUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CitEZXNjcmlwdGlvbjoKKwkJQWJzdHJhY3QgY29udHJvbCBkZXZpY2UgZm9yIGludGVyZmFjZSBJIHRoYXQgcmVwcmVzZW50cyB0aGUKKwkJY3VycmVudCBtb2RlIG9mIGFuIGVudW1lcmF0ZWQgR3JleWJ1cyBpbnRlcmZhY2UuCisKK1doYXQ6CQkvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvTi1NLkkuY3RybC9wcm9kdWN0X3N0cmluZworRGF0ZToJCU9jdG9iZXIgMjAxNQorS2VybmVsVmVyc2lvbjoJNC5YWAorQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlQcm9kdWN0IElEIHN0cmluZyBvZiBhIEdyZXlidXMgaW50ZXJmYWNlLgorCitXaGF0OgkJL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzL04tTS5JLmN0cmwvdmVuZG9yX3N0cmluZworRGF0ZToJCU9jdG9iZXIgMjAxNQorS2VybmVsVmVyc2lvbjoJNC5YWAorQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlWZW5kb3IgSUQgc3RyaW5nIG9mIGEgR3JleWJ1cyBpbnRlcmZhY2UuCisKK1doYXQ6CQkvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvTi1NLkkuQgorRGF0ZToJCU9jdG9iZXIgMjAxNQorS2VybmVsVmVyc2lvbjoJNC5YWAorQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlBIGJ1bmRsZSBCIG9uIHRoZSBJbnRlcmZhY2UgSSwgQiBpcyByZXBsYWNlZCBieSBhIDEtYnl0ZQorCQludW1iZXIgcmVwcmVzZW50aW5nIHRoZSBidW5kbGUuCisKK1doYXQ6CQkvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvTi1NLkkuQi9idW5kbGVfY2xhc3MKK0RhdGU6CQlPY3RvYmVyIDIwMTUKK0tlcm5lbFZlcnNpb246CTQuWFgKK0NvbnRhY3Q6CUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhlIGdyZXlidXMgY2xhc3Mgb2YgdGhlIGJ1bmRsZSBCLgorCitXaGF0OgkJL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzL04tTS5JLkIvYnVuZGxlX2lkCitEYXRlOgkJT2N0b2JlciAyMDE1CitLZXJuZWxWZXJzaW9uOgk0LlhYCitDb250YWN0OglHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorRGVzY3JpcHRpb246CisJCVRoZSBpbnRlcmZhY2UtdW5pcXVlIGlkIG9mIHRoZSBidW5kbGUgQi4KKworV2hhdDoJCS9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy9OLU0uSS5CL2dwYlgKK0RhdGU6CQlBcHJpbCAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LlhYCitDb250YWN0OglHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorRGVzY3JpcHRpb246CisJCVRoZSBHZW5lcmFsIFB1cnBvc2UgQnJpZGdlZCBQSFkgZGV2aWNlIG9mIHRoZSBidW5kbGUgQiwKKwkJd2hlcmUgWCBpcyBhIGR5bmFtaWNhbGx5IGFzc2lnbmVkIDAtYmFzZWQgaWQuCisKK1doYXQ6CQkvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvTi1NLkkuQi9zdGF0ZQorRGF0ZToJCU9jdG9iZXIgMjAxNQorS2VybmVsVmVyc2lvbjoJNC5YWAorQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlBIGJ1bmRsZSBoYXMgYSBzdGF0ZSB0aGF0IGlzIG1hbmFnZWQgYnkgdGhlIHVzZXJzcGFjZQorCQlFbmRvIHByb2Nlc3MuICBUaGlzIGZpbGUgYWxsb3dzIHRoYXQgRW5kbyB0byBzaWduYWwKKwkJb3RoZXIgQW5kcm9pZCBIQUxzIHRoYXQgdGhlIHN0YXRlIG9mIHRoZSBidW5kbGUgaGFzCisJCWNoYW5nZWQgdG8gYSBzcGVjaWZpYyB2YWx1ZS4gIFdoZW4gd3JpdHRlbiB0bywgYW55CisJCXByb2Nlc3Mgd2F0Y2hpbmcgdGhlIGZpbGUgd2lsbCBiZSB3b2tlbiB1cCwgYW5kIHRoZSBuZXcKKwkJdmFsdWUgY2FuIGJlIHJlYWQuIEl0J3MgYSAicG9vci1tYW4ncyBJUEMiLCB5ZXMsIGJ1dAorCQlzaW1wbGlmaWVzIHRoZSBBbmRyb2lkIHVzZXJzcGFjZSBjb2RlIGltbWVuc2VseS4KKworV2hhdDoJCS9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy9OLXN2YworRGF0ZToJCU9jdG9iZXIgMjAxNQorS2VybmVsVmVyc2lvbjoJNC5YWAorQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGUgc2luZ2xldG9uIFNWQyBkZXZpY2Ugb2YgYnVzIE4uCisKK1doYXQ6CQkvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvTi1zdmMvYXBfaW50Zl9pZAorRGF0ZToJCU9jdG9iZXIgMjAxNQorS2VybmVsVmVyc2lvbjoJNC5YWAorQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGUgQVAgaW50ZXJmYWNlIElELCBhIDEtYnl0ZSBub24temVybyBpbnRlZ2VyIHdoaWNoCisJCWRlZmluZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBBUCBtb2R1bGUgb24gdGhlIGZyYW1lLgorCQlUaGUgaW50ZXJmYWNlIHBvc2l0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgR01QCisJCU1vZHVsZSBEZXZlbG9wZXIgS2l0LgorCitXaGF0OgkJL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzL04tc3ZjL2VuZG9faWQKK0RhdGU6CQlPY3RvYmVyIDIwMTUKK0tlcm5lbFZlcnNpb246CTQuWFgKK0NvbnRhY3Q6CUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhlIEVuZG8gSUQsIHdoaWNoIGlzIGEgMi1ieXRlIGhleGFkZWNpbWFsIHZhbHVlCisJCWRlZmluZWQgYnkgdGhlIEVuZG8gbGF5b3V0IHNjaGVtZSwgZG9jdW1lbnRlZCBpbgorCQl0aGUgR01QIE1vZHVsZSBEZXZlbG9wZXIgS2l0LgorCitXaGF0OgkJL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzL04tc3ZjL2ludGZfZWplY3QKK0RhdGU6CQlPY3RvYmVyIDIwMTUKK0tlcm5lbFZlcnNpb246CTQuWFgKK0NvbnRhY3Q6CUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CitEZXNjcmlwdGlvbjoKKwkJV3JpdGUgdGhlIG51bWJlciBvZiB0aGUgaW50ZXJmYWNlIHRoYXQgeW91IHdpc2ggdG8KKwkJZm9yY2libHkgZWplY3QgZnJvbSB0aGUgc3lzdGVtLgorCitXaGF0OgkJL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzL04tc3ZjL3ZlcnNpb24KK0RhdGU6CQlPY3RvYmVyIDIwMTUKK0tlcm5lbFZlcnNpb246CTQuWFgKK0NvbnRhY3Q6CUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBmaXJtd2FyZSBpbiB0aGUgU1ZDIGRldmljZS4KKworV2hhdDoJCS9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy9OLXN2Yy93YXRjaGRvZworRGF0ZToJCU9jdG9iZXIgMjAxNgorS2VybmVsVmVyc2lvbjoJNC5YWAorQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlJZiB0aGUgU1ZDIHdhdGNoZG9nIGlzIGVuYWJsZWQgb3Igbm90LiAgV3JpdGluZyAwIHRvIHRoaXMKKwkJZmlsZSB3aWxsIGRpc2FibGUgdGhlIHdhdGNoZG9nLCB3cml0aW5nIDEgd2lsbCBlbmFibGUgaXQuCisKK1doYXQ6CQkvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvTi1zdmMvd2F0Y2hkb2dfYWN0aW9uCitEYXRlOgkJSnVseSAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LlhYCitDb250YWN0OglHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorRGVzY3JpcHRpb246CisJCVRoaXMgYXR0cmlidXRlIGluZGljYXRlcyB0aGUgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZCB1cG9uIFNWQworCQl3YXRjaGRvZyBiaXRlLgorCisJCVRoZSBhY3Rpb24gY2FuIGJlIG9uZSBvZiB0aGUgInJlc2V0IiBvciAicGFuaWMiLiBXcml0aW5nIGVpdGhlcgorCQlvbmUgb2YgdGhlICJyZXNldCIgb3IgInBhbmljIiB3aWxsIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgU1ZDCisJCXdhdGNoZG9nIGJpdGUuIERlZmF1bHQgdmFsdWUgaXMgInJlc2V0Ii4KKworCQkicmVzZXQiIG1lYW5zIHRoZSBVbmlQcm8gc3Vic3lzdGVtIGlzIHRvIGJlIHJlc2V0LgorCisJCSJwYW5pYyIgbWVhbnMgU1ZDIHdhdGNoZG9nIGJpdGUgd2lsbCBjYXVzZSBrZXJuZWwgdG8gcGFuaWMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGRlMmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvS2NvbmZpZwpAQCAtMCwwICsxLDIxOSBAQAorbWVudWNvbmZpZyBHUkVZQlVTCisJdHJpc3RhdGUgIkdyZXlidXMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNZU0ZTCisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgR3JleWJ1cyBkcml2ZXIgY29yZS4gIEdyZXlidXMgaXMgYW4KKwkgIGhhcmR3YXJlIHByb3RvY29sIHRoYXQgd2FzIGRlc2lnbmVkIHRvIHByb3ZpZGUgVW5pcHJvIHdpdGggYQorCSAgc2FuZSBhcHBsaWNhdGlvbiBsYXllci4gIEl0IHdhcyBvcmlnaW5hbGx5IGRlc2lnbmVkIGZvciB0aGUKKwkgIEFSQSBwcm9qZWN0LCBhIG1vZHVsZSBwaG9uZSBzeXN0ZW0sIGJ1dCBoYXMgc2hvd24gdXAgaW4gb3RoZXIKKwkgIHBob25lcywgYW5kIGNhbiBiZSB0dW5uZWxlZCBvdmVyIG90aGVyIGJ1c3NlcyBpbiBvcmRlciB0bworCSAgY29udHJvbCBoYXJkd2FyZSBkZXZpY2VzLgorCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGVzZSB0eXBlcyBvZiBkcml2ZXJzLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBncmV5YnVzLmtvCisKK2lmIEdSRVlCVVMKKworY29uZmlnIEdSRVlCVVNfRVMyCisJdHJpc3RhdGUgIkdyZXlidXMgRVMzIFVTQiBob3N0IGNvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBVU0IKKwktLS1oZWxwLS0tCisJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBUb3NoaWJhIEVTMyBVU0IgZGV2aWNlIHRoYXQKKwkgIGFjdHMgYXMgYSBHcmV5YnVzICJob3N0IGNvbnRyb2xsZXIiLiAgVGhpcyBkZXZpY2UgaXMgYSBicmlkZ2UKKwkgIGZyb20gYSBVU0IgZGV2aWNlIHRvIGEgVW5pcHJvIG5ldHdvcmsuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGdiLWVzMi5rbworCitjb25maWcgR1JFWUJVU19BVURJTworCXRyaXN0YXRlICJHcmV5YnVzIEF1ZGlvIENsYXNzIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNPVU5ECisJLS0taGVscC0tLQorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgZGV2aWNlIHRoYXQgZm9sbG93cyB0aGUKKwkgIEdyZXlidXMgQXVkaW8gQ2xhc3Mgc3BlY2lmaWNhdGlvbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZ2ItYXVkaW8ua28KKworY29uZmlnIEdSRVlCVVNfQk9PVFJPTQorCXRyaXN0YXRlICJHcmV5YnVzIEJvb3Ryb20gQ2xhc3MgZHJpdmVyIgorCS0tLWhlbHAtLS0KKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBhIGRldmljZSB0aGF0IGZvbGxvd3MgdGhlCisJICBHcmV5YnVzIEJvb3Ryb20gQ2xhc3Mgc3BlY2lmaWNhdGlvbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZ2ItYm9vdHJvbS5rbworCitjb25maWcgR1JFWUJVU19DQU1FUkEKKwl0cmlzdGF0ZSAiR3JleWJ1cyBDYW1lcmEgQ2xhc3MgZHJpdmVyIgorCWRlcGVuZHMgb24gTUVESUFfU1VQUE9SVCAmJiBMRURTX0NMQVNTX0ZMQVNIICYmIEJST0tFTgorCS0tLWhlbHAtLS0KKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBhIGRldmljZSB0aGF0IGZvbGxvd3MgdGhlCisJICBHcmV5YnVzIENhbWVyYSBDbGFzcyBzcGVjaWZpY2F0aW9uLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBnYi1jYW1lcmEua28KKworY29uZmlnIEdSRVlCVVNfRklSTVdBUkUKKwl0cmlzdGF0ZSAiR3JleWJ1cyBGaXJtd2FyZSBEb3dubG9hZCBDbGFzcyBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwktLS1oZWxwLS0tCisJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBkZXZpY2UgdGhhdCBmb2xsb3dzIHRoZQorCSAgR3JleWJ1cyBGaXJtd2FyZSBEb3dubG9hZCBDbGFzcyBzcGVjaWZpY2F0aW9uLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBnYi1maXJtd2FyZS5rbworCitjb25maWcgR1JFWUJVU19ISUQKKwl0cmlzdGF0ZSAiR3JleWJ1cyBISUQgQ2xhc3MgZHJpdmVyIgorCWRlcGVuZHMgb24gSElEICYmIElOUFVUCisJLS0taGVscC0tLQorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgZGV2aWNlIHRoYXQgZm9sbG93cyB0aGUKKwkgIEdyZXlidXMgSElEIENsYXNzIHNwZWNpZmljYXRpb24uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGdiLWhpZC5rbworCitjb25maWcgR1JFWUJVU19MSUdIVAorCXRyaXN0YXRlICJHcmV5YnVzIExFRCBDbGFzcyBkcml2ZXIiCisJZGVwZW5kcyBvbiBMRURTX0NMQVNTCisJLS0taGVscC0tLQorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgZGV2aWNlIHRoYXQgZm9sbG93cyB0aGUKKwkgIEdyZXlidXMgTEVEIENsYXNzIHNwZWNpZmljYXRpb24uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGdiLWxpZ2h0LmtvCisKK2NvbmZpZyBHUkVZQlVTX0xPRworCXRyaXN0YXRlICJHcmV5YnVzIERlYnVnIExvZyBDbGFzcyBkcml2ZXIiCisJLS0taGVscC0tLQorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgZGV2aWNlIHRoYXQgZm9sbG93cyB0aGUKKwkgIEdyZXlidXMgRGVidWcgTG9nIENsYXNzIHNwZWNpZmljYXRpb24uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGdiLWxvZy5rbworCitjb25maWcgR1JFWUJVU19MT09QQkFDSworCXRyaXN0YXRlICJHcmV5YnVzIExvb3BiYWNrIENsYXNzIGRyaXZlciIKKwktLS1oZWxwLS0tCisJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBkZXZpY2UgdGhhdCBmb2xsb3dzIHRoZQorCSAgR3JleWJ1cyBEZWJ1ZyBMb2cgQ2xhc3Mgc3BlY2lmaWNhdGlvbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZ2ItbG9nLmtvCisKK2NvbmZpZyBHUkVZQlVTX1BPV0VSCisJdHJpc3RhdGUgIkdyZXlidXMgUG93ZXJzdXBwbHkgQ2xhc3MgZHJpdmVyIgorCWRlcGVuZHMgb24gUE9XRVJfU1VQUExZCisJLS0taGVscC0tLQorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgZGV2aWNlIHRoYXQgZm9sbG93cyB0aGUKKwkgIEdyZXlidXMgUG93ZXJzdXBwbHkgQ2xhc3Mgc3BlY2lmaWNhdGlvbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZ2ItcG93ZXItc3VwcGx5LmtvCisKK2NvbmZpZyBHUkVZQlVTX1JBVworCXRyaXN0YXRlICJHcmV5YnVzIFJhdyBDbGFzcyBkcml2ZXIiCisJLS0taGVscC0tLQorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgZGV2aWNlIHRoYXQgZm9sbG93cyB0aGUKKwkgIEdyZXlidXMgUmF3IENsYXNzIHNwZWNpZmljYXRpb24uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGdiLXJhdy5rbworCitjb25maWcgR1JFWUJVU19WSUJSQVRPUgorCXRyaXN0YXRlICJHcmV5YnVzIFZpYnJhdG9yIE1vdG9yIENsYXNzIGRyaXZlciIKKwktLS1oZWxwLS0tCisJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBkZXZpY2UgdGhhdCBmb2xsb3dzIHRoZQorCSAgR3JleWJ1cyBWaWJyYXRvciBNb3RvciBDbGFzcyBzcGVjaWZpY2F0aW9uLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBnYi12aWJyYXRvci5rbworCittZW51Y29uZmlnIEdSRVlCVVNfQlJJREdFRF9QSFkKKwl0cmlzdGF0ZSAiR3JleWJ1cyBCcmlkZ2VkIFBIWSBDbGFzcyBkcml2ZXJzIgorCS0tLWhlbHAtLS0KKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiB0byBwaWNrIGZyb20gYSB2YXJpZXR5IG9mIEdyZXlidXMgQnJpZGdlZAorCSAgUEhZIGNsYXNzIGRyaXZlcnMuICBUaGVzZSBkcml2ZXJzIGVtdWxhdGUgYSBudW1iZXIgb2YKKwkgIGRpZmZlcmVudCAidHJhZGl0aW9uYWwiIGJ1c3NlcyBieSB0dW5uZWxpbmcgdGhlbSBvdmVyIEdyZXlidXMuCisJICBFeGFtcGxlcyBvZiB0aGlzIGluY2x1ZGUgc2VyaWFsLCBTUEksIFVTQiwgYW5kIG90aGVycy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZ2ItcGh5LmtvCisKK2lmIEdSRVlCVVNfQlJJREdFRF9QSFkKKworY29uZmlnIEdSRVlCVVNfR1BJTworCXRyaXN0YXRlICJHcmV5YnVzIEdQSU8gQnJpZGdlZCBQSFkgZHJpdmVyIgorCWRlcGVuZHMgb24gR1BJT0xJQgorCS0tLWhlbHAtLS0KKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBhIGRldmljZSB0aGF0IGZvbGxvd3MgdGhlCisJICBHcmV5YnVzIEdQSU8gQnJpZGdlZCBQSFkgQ2xhc3Mgc3BlY2lmaWNhdGlvbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZ2ItZ3Bpby5rbworCitjb25maWcgR1JFWUJVU19JMkMKKwl0cmlzdGF0ZSAiR3JleWJ1cyBJMkMgQnJpZGdlZCBQSFkgZHJpdmVyIgorCWRlcGVuZHMgb24gSTJDCisJLS0taGVscC0tLQorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgZGV2aWNlIHRoYXQgZm9sbG93cyB0aGUKKwkgIEdyZXlidXMgSTJDIEJyaWRnZWQgUEhZIENsYXNzIHNwZWNpZmljYXRpb24uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGdiLWkyYy5rbworCitjb25maWcgR1JFWUJVU19QV00KKwl0cmlzdGF0ZSAiR3JleWJ1cyBQV00gQnJpZGdlZCBQSFkgZHJpdmVyIgorCWRlcGVuZHMgb24gUFdNCisJLS0taGVscC0tLQorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgZGV2aWNlIHRoYXQgZm9sbG93cyB0aGUKKwkgIEdyZXlidXMgUFdNIEJyaWRnZWQgUEhZIENsYXNzIHNwZWNpZmljYXRpb24uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGdiLXB3bS5rbworCitjb25maWcgR1JFWUJVU19TRElPCisJdHJpc3RhdGUgIkdyZXlidXMgU0RJTyBCcmlkZ2VkIFBIWSBkcml2ZXIiCisJZGVwZW5kcyBvbiBNTUMKKwktLS1oZWxwLS0tCisJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBkZXZpY2UgdGhhdCBmb2xsb3dzIHRoZQorCSAgR3JleWJ1cyBTRElPIEJyaWRnZWQgUEhZIENsYXNzIHNwZWNpZmljYXRpb24uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGdiLXNkaW8ua28KKworY29uZmlnIEdSRVlCVVNfU1BJCisJdHJpc3RhdGUgIkdyZXlidXMgU1BJIEJyaWRnZWQgUEhZIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCS0tLWhlbHAtLS0KKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBhIGRldmljZSB0aGF0IGZvbGxvd3MgdGhlCisJICBHcmV5YnVzIFNQSSBCcmlkZ2VkIFBIWSBDbGFzcyBzcGVjaWZpY2F0aW9uLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBnYi1zcGkua28KKworY29uZmlnIEdSRVlCVVNfVUFSVAorCXRyaXN0YXRlICJHcmV5YnVzIFVBUlQgQnJpZGdlZCBQSFkgZHJpdmVyIgorCWRlcGVuZHMgb24gVFRZCisJLS0taGVscC0tLQorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgZGV2aWNlIHRoYXQgZm9sbG93cyB0aGUKKwkgIEdyZXlidXMgVUFSVCBCcmlkZ2VkIFBIWSBDbGFzcyBzcGVjaWZpY2F0aW9uLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBnYi11YXJ0LmtvCisKK2NvbmZpZyBHUkVZQlVTX1VTQgorCXRyaXN0YXRlICJHcmV5YnVzIFVTQiBIb3N0IEJyaWRnZWQgUEhZIGRyaXZlciIKKwlkZXBlbmRzIG9uIFVTQgorCS0tLWhlbHAtLS0KKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBhIGRldmljZSB0aGF0IGZvbGxvd3MgdGhlCisJICBHcmV5YnVzIFVTQiBIb3N0IEJyaWRnZWQgUEhZIENsYXNzIHNwZWNpZmljYXRpb24uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGdiLXVzYi5rbworCitlbmRpZgkjIEdSRVlCVVNfQlJJREdFRF9QSFkKK2VuZGlmCSMgR1JFWUJVUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzM3YjdiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvTWFrZWZpbGUKQEAgLTAsMCArMSw5NiBAQAorIyBHcmV5YnVzIGNvcmUKK2dyZXlidXMteSA6PQljb3JlLm8JCVwKKwkJZGVidWdmcy5vCVwKKwkJaGQubwkJXAorCQltYW5pZmVzdC5vCVwKKwkJbW9kdWxlLm8JXAorCQlpbnRlcmZhY2UubwlcCisJCWJ1bmRsZS5vCVwKKwkJY29ubmVjdGlvbi5vCVwKKwkJY29udHJvbC5vCVwKKwkJc3ZjLm8JCVwKKwkJc3ZjX3dhdGNoZG9nLm8JXAorCQlvcGVyYXRpb24ubwlcCisJCXRpbWVzeW5jLm8JXAorCQl0aW1lc3luY19wbGF0Zm9ybS5vCisKK29iai0kKENPTkZJR19HUkVZQlVTKQkJKz0gZ3JleWJ1cy5vCisKKyMgbmVlZGVkIGZvciB0cmFjZSBldmVudHMKK2NjZmxhZ3MteSArPSAtSSQoc3JjKQorCisKKyMgR3JleWJ1cyBIb3N0IGNvbnRyb2xsZXIgZHJpdmVycworZ2ItZXMyLXkgOj0gZXMyLm8KKworb2JqLSQoQ09ORklHX0dSRVlCVVNfRVMyKQkrPSBnYi1lczIubworCisjIEdyZXlidXMgY2xhc3MgZHJpdmVycworZ2ItYm9vdHJvbS15CQk6PSBib290cm9tLm8KK2diLWNhbWVyYS15CQk6PSBjYW1lcmEubworZ2ItZmlybXdhcmUteQkJOj0gZnctY29yZS5vIGZ3LWRvd25sb2FkLm8gZnctbWFuYWdlbWVudC5vIGF1dGhlbnRpY2F0aW9uLm8KK2diLXNwaWxpYi15CQk6PSBzcGlsaWIubworZ2ItaGlkLXkJCTo9IGhpZC5vCitnYi1saWdodC15CQk6PSBsaWdodC5vCitnYi1sb2cteQkJOj0gbG9nLm8KK2diLWxvb3BiYWNrLXkJCTo9IGxvb3BiYWNrLm8KK2diLXBvd2VyLXN1cHBseS15CTo9IHBvd2VyX3N1cHBseS5vCitnYi1yYXcteQkJOj0gcmF3Lm8KK2diLXZpYnJhdG9yLXkJCTo9IHZpYnJhdG9yLm8KKworb2JqLSQoQ09ORklHX0dSRVlCVVNfQk9PVFJPTSkJKz0gZ2ItYm9vdHJvbS5vCitvYmotJChDT05GSUdfR1JFWUJVU19DQU1FUkEpCSs9IGdiLWNhbWVyYS5vCitvYmotJChDT05GSUdfR1JFWUJVU19GSVJNV0FSRSkJKz0gZ2ItZmlybXdhcmUubyBnYi1zcGlsaWIubworb2JqLSQoQ09ORklHX0dSRVlCVVNfSElEKQkrPSBnYi1oaWQubworb2JqLSQoQ09ORklHX0dSRVlCVVNfTElHSFQpCSs9IGdiLWxpZ2h0Lm8KK29iai0kKENPTkZJR19HUkVZQlVTX0xPRykJKz0gZ2ItbG9nLm8KK29iai0kKENPTkZJR19HUkVZQlVTX0xPT1BCQUNLKQkrPSBnYi1sb29wYmFjay5vCitvYmotJChDT05GSUdfR1JFWUJVU19QT1dFUikJKz0gZ2ItcG93ZXItc3VwcGx5Lm8KK29iai0kKENPTkZJR19HUkVZQlVTX1JBVykJKz0gZ2ItcmF3Lm8KK29iai0kKENPTkZJR19HUkVZQlVTX1ZJQlJBVE9SKQkrPSBnYi12aWJyYXRvci5vCisKKyMgR3JleWJ1cyBBdWRpbyBpcyBhIGJ1bmNoIG9mIG1vZHVsZXMKK2diLWF1ZGlvLW1vZHVsZS15CTo9IGF1ZGlvX21vZHVsZS5vIGF1ZGlvX3RvcG9sb2d5Lm8KK2diLWF1ZGlvLWNvZGVjLXkJOj0gYXVkaW9fY29kZWMubworZ2ItYXVkaW8tZ2IteQkJOj0gYXVkaW9fZ2IubworZ2ItYXVkaW8tYXBicmlkZ2VhLXkJOj0gYXVkaW9fYXBicmlkZ2VhLm8KK2diLWF1ZGlvLW1hbmFnZXIteQk6PSBhdWRpb19tYW5hZ2VyLm8gYXVkaW9fbWFuYWdlcl9tb2R1bGUubworCisjIEdyZXlidXMgQXVkaW8gc3lzZnMgaGVscGVycyBjYW4gYmUgdXNlZnVsIHdoZW4gZGVidWdnaW5nCisjR0JfQVVESU9fTUFOQUdFUl9TWVNGUyA/PSB0cnVlCisjaWZlcSAoJChHQl9BVURJT19NQU5BR0VSX1NZU0ZTKSx0cnVlKQorI2diLWF1ZGlvLW1hbmFnZXIteSArPSBhdWRpb19tYW5hZ2VyX3N5c2ZzLm8KKyNjY2ZsYWdzLXkgKz0gLURHQl9BVURJT19NQU5BR0VSX1NZU0ZTCisjZW5kaWYKKworb2JqLSQoQ09ORklHX0dSRVlCVVNfQVVESU9fTVNNODk5NCkJKz0gZ2ItYXVkaW8tY29kZWMubworb2JqLSQoQ09ORklHX0dSRVlCVVNfQVVESU9fTVNNODk5NCkJKz0gZ2ItYXVkaW8tbW9kdWxlLm8KK29iai0kKENPTkZJR19HUkVZQlVTX0FVRElPKQkJKz0gZ2ItYXVkaW8tZ2Iubworb2JqLSQoQ09ORklHX0dSRVlCVVNfQVVESU8pCQkrPSBnYi1hdWRpby1hcGJyaWRnZWEubworb2JqLSQoQ09ORklHX0dSRVlCVVNfQVVESU8pCQkrPSBnYi1hdWRpby1tYW5hZ2VyLm8KKworCisjIEdyZXlidXMgQnJpZGdlZCBQSFkgZHJpdmVycworZ2ItZ2JwaHkteSA6PSBnYnBoeS5vCitnYi1ncGlvLXkgOj0gZ3Bpby5vCitnYi1pMmMteSA6PSBpMmMubworZ2ItcHdtLXkgOj0gcHdtLm8KK2diLXNkaW8teSA6PSBzZGlvLm8KK2diLXNwaS15IDo9IHNwaS5vCitnYi11YXJ0LXkgOj0gdWFydC5vCitnYi11c2IteSA6PSB1c2IubworCitvYmotJChDT05GSUdfR1JFWUJVU19CUklER0VEX1BIWSkJKz0gZ2ItZ2JwaHkubworb2JqLSQoQ09ORklHX0dSRVlCVVNfR1BJTykJCSs9IGdiLWdwaW8ubworb2JqLSQoQ09ORklHX0dSRVlCVVNfSTJDKQkJKz0gZ2ItaTJjLm8KK29iai0kKENPTkZJR19HUkVZQlVTX1BXTSkJCSs9IGdiLXB3bS5vCitvYmotJChDT05GSUdfR1JFWUJVU19TRElPKQkJKz0gZ2Itc2Rpby5vCitvYmotJChDT05GSUdfR1JFWUJVU19TUEkpCQkrPSBnYi1zcGkubyBnYi1zcGlsaWIubworb2JqLSQoQ09ORklHX0dSRVlCVVNfVUFSVCkJCSs9IGdiLXVhcnQubworb2JqLSQoQ09ORklHX0dSRVlCVVNfVVNCKQkJKz0gZ2ItdXNiLm8KKworCisjIEdyZXlidXMgUGxhdGZvcm0gZHJpdmVyCitnYi1hcmNoZS15CTo9IGFyY2hlLXBsYXRmb3JtLm8gYXJjaGUtYXBiLWN0cmwubworCitvYmotJChDT05GSUdfVVNCX0hTSUNfVVNCMzYxMykJKz0gZ2ItYXJjaGUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXJjaGUtYXBiLWN0cmwuYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2FyY2hlLWFwYi1jdHJsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAzMjNhYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2FyY2hlLWFwYi1jdHJsLmMKQEAgLTAsMCArMSw1MjIgQEAKKy8qCisgKiBBcmNoZSBQbGF0Zm9ybSBkcml2ZXIgdG8gY29udHJvbCBBUEIuCisgKgorICogQ29weXJpZ2h0IDIwMTQtMjAxNSBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTQtMjAxNSBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlICJhcmNoZV9wbGF0Zm9ybS5oIgorCisKK3N0cnVjdCBhcmNoZV9hcGJfY3RybF9kcnZkYXRhIHsKKwkvKiBDb250cm9sIEdQSU8gc2lnbmFscyB0byBhbmQgZnJvbSBBUCA8PT4gQVAgQnJpZGdlcyAqLworCWludCByZXNldG5fZ3BpbzsKKwlpbnQgYm9vdF9yZXRfZ3BpbzsKKwlpbnQgcHdyb2ZmX2dwaW87CisJaW50IHdha2VfaW5fZ3BpbzsKKwlpbnQgd2FrZV9vdXRfZ3BpbzsKKwlpbnQgcHdyZG5fZ3BpbzsKKworCWVudW0gYXJjaGVfcGxhdGZvcm1fc3RhdGUgc3RhdGU7CisJYm9vbCBpbml0X2Rpc2FibGVkOworCisJc3RydWN0IHJlZ3VsYXRvciAqdmNvcmU7CisJc3RydWN0IHJlZ3VsYXRvciAqdmlvOworCisJaW50IGNsa19lbl9ncGlvOworCXN0cnVjdCBjbGsgKmNsazsKKworCXN0cnVjdCBwaW5jdHJsICpwaW5jdHJsOworCXN0cnVjdCBwaW5jdHJsX3N0YXRlICpwaW5fZGVmYXVsdDsKKworCS8qIFYyOiBTUEkgQnVzIGNvbnRyb2wgICovCisJaW50IHNwaV9lbl9ncGlvOworCWJvb2wgc3BpX2VuX3BvbGFyaXR5X2hpZ2g7Cit9OworCisvKgorICogTm90ZSB0aGF0IHRoZXNlIGxvdyBsZXZlbCBhcGkncyBhcmUgYWN0aXZlIGhpZ2gKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGRlYXNzZXJ0X3Jlc2V0KHVuc2lnbmVkIGludCBncGlvKQoreworCWdwaW9fc2V0X3ZhbHVlKGdwaW8sIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXNzZXJ0X3Jlc2V0KHVuc2lnbmVkIGludCBncGlvKQoreworCWdwaW9fc2V0X3ZhbHVlKGdwaW8sIDApOworfQorCisvKgorICogTm90ZTogUGxlYXNlIGRvIG5vdCBtb2RpZnkgdGhlIGJlbG93IHNlcXVlbmNlLCBhcyBpdCBpcyBhcyBwZXIgdGhlIHNwZWMKKyAqLworc3RhdGljIGludCBjb2xkYm9vdF9zZXEoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBhcmNoZV9hcGJfY3RybF9kcnZkYXRhICphcGIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgcmV0OworCisJaWYgKGFwYi0+aW5pdF9kaXNhYmxlZCB8fAorCQkJYXBiLT5zdGF0ZSA9PSBBUkNIRV9QTEFURk9STV9TVEFURV9BQ1RJVkUpCisJCXJldHVybiAwOworCisJLyogSG9sZCBBUEIgaW4gcmVzZXQgc3RhdGUgKi8KKwlhc3NlcnRfcmVzZXQoYXBiLT5yZXNldG5fZ3Bpbyk7CisKKwlpZiAoYXBiLT5zdGF0ZSA9PSBBUkNIRV9QTEFURk9STV9TVEFURV9GV19GTEFTSElORyAmJgorCQkJZ3Bpb19pc192YWxpZChhcGItPnNwaV9lbl9ncGlvKSkKKwkJZGV2bV9ncGlvX2ZyZWUoZGV2LCBhcGItPnNwaV9lbl9ncGlvKTsKKworCS8qIEVuYWJsZSBwb3dlciB0byBBUEIgKi8KKwlpZiAoIUlTX0VSUihhcGItPnZjb3JlKSkgeworCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKGFwYi0+dmNvcmUpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBlbmFibGUgY29yZSByZWd1bGF0b3JcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCWlmICghSVNfRVJSKGFwYi0+dmlvKSkgeworCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKGFwYi0+dmlvKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZW5hYmxlIElPIHJlZ3VsYXRvclxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJYXBiX2Jvb3RyZXRfZGVhc3NlcnQoZGV2KTsKKworCS8qIE9uIERCMyBjbG9jayB3YXMgbm90IG1hbmRhdG9yeSAqLworCWlmIChncGlvX2lzX3ZhbGlkKGFwYi0+Y2xrX2VuX2dwaW8pKQorCQlncGlvX3NldF92YWx1ZShhcGItPmNsa19lbl9ncGlvLCAxKTsKKworCXVzbGVlcF9yYW5nZSgxMDAsIDIwMCk7CisKKwkvKiBkZWFzc2VydCByZXNldCB0byBBUEIgOiBBY3RpdmUtbG93IHNpZ25hbCAqLworCWRlYXNzZXJ0X3Jlc2V0KGFwYi0+cmVzZXRuX2dwaW8pOworCisJYXBiLT5zdGF0ZSA9IEFSQ0hFX1BMQVRGT1JNX1NUQVRFX0FDVElWRTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZ3X2ZsYXNoaW5nX3NlcShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGFyY2hlX2FwYl9jdHJsX2RydmRhdGEgKmFwYiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCByZXQ7CisKKwlpZiAoYXBiLT5pbml0X2Rpc2FibGVkIHx8CisJCQlhcGItPnN0YXRlID09IEFSQ0hFX1BMQVRGT1JNX1NUQVRFX0ZXX0ZMQVNISU5HKQorCQlyZXR1cm4gMDsKKworCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoYXBiLT52Y29yZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBlbmFibGUgY29yZSByZWd1bGF0b3JcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoYXBiLT52aW8pOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZW5hYmxlIElPIHJlZ3VsYXRvclxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGdwaW9faXNfdmFsaWQoYXBiLT5zcGlfZW5fZ3BpbykpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlpZiAoYXBiLT5zcGlfZW5fcG9sYXJpdHlfaGlnaCkKKwkJCWZsYWdzID0gR1BJT0ZfT1VUX0lOSVRfSElHSDsKKwkJZWxzZQorCQkJZmxhZ3MgPSBHUElPRl9PVVRfSU5JVF9MT1c7CisKKwkJcmV0ID0gZGV2bV9ncGlvX3JlcXVlc3Rfb25lKGRldiwgYXBiLT5zcGlfZW5fZ3BpbywKKwkJCQlmbGFncywgImFwYl9zcGlfZW4iKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkZXYsICJGYWlsZWQgcmVxdWVzdGluZyBTUEkgYnVzIGVuIGdwaW8gJWRcbiIsCisJCQkJYXBiLT5zcGlfZW5fZ3Bpbyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJLyogZm9yIGZsYXNoaW5nIGRldmljZSBzaG91bGQgYmUgaW4gcmVzZXQgc3RhdGUgKi8KKwlhc3NlcnRfcmVzZXQoYXBiLT5yZXNldG5fZ3Bpbyk7CisJYXBiLT5zdGF0ZSA9IEFSQ0hFX1BMQVRGT1JNX1NUQVRFX0ZXX0ZMQVNISU5HOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RhbmRieV9ib290X3NlcShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGFyY2hlX2FwYl9jdHJsX2RydmRhdGEgKmFwYiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGFwYi0+aW5pdF9kaXNhYmxlZCkKKwkJcmV0dXJuIDA7CisKKwkvKiBFdmVuIGlmIGl0IGlzIGluIE9GRiBzdGF0ZSwgdGhlbiB3ZSBkbyBub3Qgd2FudCB0byBjaGFuZ2UgdGhlIHN0YXRlICovCisJaWYgKGFwYi0+c3RhdGUgPT0gQVJDSEVfUExBVEZPUk1fU1RBVEVfU1RBTkRCWSB8fAorCQkJYXBiLT5zdGF0ZSA9PSBBUkNIRV9QTEFURk9STV9TVEFURV9PRkYpCisJCXJldHVybiAwOworCisJaWYgKGFwYi0+c3RhdGUgPT0gQVJDSEVfUExBVEZPUk1fU1RBVEVfRldfRkxBU0hJTkcgJiYKKwkJCWdwaW9faXNfdmFsaWQoYXBiLT5zcGlfZW5fZ3BpbykpCisJCWRldm1fZ3Bpb19mcmVlKGRldiwgYXBiLT5zcGlfZW5fZ3Bpbyk7CisKKwkvKgorCSAqIEFzIHBlciBXRE0gc3BlYywgZG8gbm90aGluZworCSAqCisJICogUGFzdGVkIGZyb20gV0RNIHNwZWMsCisJICogIC0gQSBmYWxsaW5nIGVkZ2Ugb24gUE9XRVJPRkZfTCBpcyBkZXRlY3RlZCAoYSkKKwkgKiAgLSBXRE0gZW50ZXJzIHN0YW5kYnkgbW9kZSwgYnV0IG5vIG91dHB1dCBzaWduYWxzIGFyZSBjaGFuZ2VkCisJICogKi8KKworCS8qIFRPRE86IFBPV0VST0ZGX0wgaXMgaW5wdXQgdG8gV0RNIG1vZHVsZSAgKi8KKwlhcGItPnN0YXRlID0gQVJDSEVfUExBVEZPUk1fU1RBVEVfU1RBTkRCWTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcG93ZXJvZmZfc2VxKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgYXJjaGVfYXBiX2N0cmxfZHJ2ZGF0YSAqYXBiID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoYXBiLT5pbml0X2Rpc2FibGVkIHx8IGFwYi0+c3RhdGUgPT0gQVJDSEVfUExBVEZPUk1fU1RBVEVfT0ZGKQorCQlyZXR1cm47CisKKwlpZiAoYXBiLT5zdGF0ZSA9PSBBUkNIRV9QTEFURk9STV9TVEFURV9GV19GTEFTSElORyAmJgorCQkJZ3Bpb19pc192YWxpZChhcGItPnNwaV9lbl9ncGlvKSkKKwkJZGV2bV9ncGlvX2ZyZWUoZGV2LCBhcGItPnNwaV9lbl9ncGlvKTsKKworCS8qIGRpc2FibGUgdGhlIGNsb2NrICovCisJaWYgKGdwaW9faXNfdmFsaWQoYXBiLT5jbGtfZW5fZ3BpbykpCisJCWdwaW9fc2V0X3ZhbHVlKGFwYi0+Y2xrX2VuX2dwaW8sIDApOworCisJaWYgKCFJU19FUlIoYXBiLT52Y29yZSkgJiYgcmVndWxhdG9yX2lzX2VuYWJsZWQoYXBiLT52Y29yZSkgPiAwKQorCQlyZWd1bGF0b3JfZGlzYWJsZShhcGItPnZjb3JlKTsKKworCWlmICghSVNfRVJSKGFwYi0+dmlvKSAmJiByZWd1bGF0b3JfaXNfZW5hYmxlZChhcGItPnZpbykgPiAwKQorCQlyZWd1bGF0b3JfZGlzYWJsZShhcGItPnZpbyk7CisKKwkvKiBBcyBwYXJ0IG9mIGV4aXQsIHB1dCBBUEIgYmFjayBpbiByZXNldCBzdGF0ZSAqLworCWFzc2VydF9yZXNldChhcGItPnJlc2V0bl9ncGlvKTsKKwlhcGItPnN0YXRlID0gQVJDSEVfUExBVEZPUk1fU1RBVEVfT0ZGOworCisJLyogVE9ETzogTWF5IGhhdmUgdG8gc2VuZCBhbiBldmVudCB0byBTVkMgYWJvdXQgdGhpcyBleGl0ICovCit9CisKK3ZvaWQgYXBiX2Jvb3RyZXRfYXNzZXJ0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJjaGVfYXBiX2N0cmxfZHJ2ZGF0YSAqYXBiID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlncGlvX3NldF92YWx1ZShhcGItPmJvb3RfcmV0X2dwaW8sIDEpOworfQorCit2b2lkIGFwYl9ib290cmV0X2RlYXNzZXJ0KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYXJjaGVfYXBiX2N0cmxfZHJ2ZGF0YSAqYXBiID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlncGlvX3NldF92YWx1ZShhcGItPmJvb3RfcmV0X2dwaW8sIDApOworfQorCitpbnQgYXBiX2N0cmxfY29sZGJvb3Qoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBjb2xkYm9vdF9zZXEodG9fcGxhdGZvcm1fZGV2aWNlKGRldikpOworfQorCitpbnQgYXBiX2N0cmxfZndfZmxhc2hpbmcoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBmd19mbGFzaGluZ19zZXEodG9fcGxhdGZvcm1fZGV2aWNlKGRldikpOworfQorCitpbnQgYXBiX2N0cmxfc3RhbmRieV9ib290KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gc3RhbmRieV9ib290X3NlcSh0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSk7Cit9CisKK3ZvaWQgYXBiX2N0cmxfcG93ZXJvZmYoc3RydWN0IGRldmljZSAqZGV2KQoreworCXBvd2Vyb2ZmX3NlcSh0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0YXRlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgYXJjaGVfYXBiX2N0cmxfZHJ2ZGF0YSAqYXBiID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IHJldCA9IDA7CisJYm9vbCBpc19kaXNhYmxlZDsKKworCWlmIChzeXNmc19zdHJlcShidWYsICJvZmYiKSkgeworCQlpZiAoYXBiLT5zdGF0ZSA9PSBBUkNIRV9QTEFURk9STV9TVEFURV9PRkYpCisJCQlyZXR1cm4gY291bnQ7CisKKwkJcG93ZXJvZmZfc2VxKHBkZXYpOworCX0gZWxzZSBpZiAoc3lzZnNfc3RyZXEoYnVmLCAiYWN0aXZlIikpIHsKKwkJaWYgKGFwYi0+c3RhdGUgPT0gQVJDSEVfUExBVEZPUk1fU1RBVEVfQUNUSVZFKQorCQkJcmV0dXJuIGNvdW50OworCisJCXBvd2Vyb2ZmX3NlcShwZGV2KTsKKwkJaXNfZGlzYWJsZWQgPSBhcGItPmluaXRfZGlzYWJsZWQ7CisJCWFwYi0+aW5pdF9kaXNhYmxlZCA9IGZhbHNlOworCQlyZXQgPSBjb2xkYm9vdF9zZXEocGRldik7CisJCWlmIChyZXQpCisJCQlhcGItPmluaXRfZGlzYWJsZWQgPSBpc19kaXNhYmxlZDsKKwl9IGVsc2UgaWYgKHN5c2ZzX3N0cmVxKGJ1ZiwgInN0YW5kYnkiKSkgeworCQlpZiAoYXBiLT5zdGF0ZSA9PSBBUkNIRV9QTEFURk9STV9TVEFURV9TVEFOREJZKQorCQkJcmV0dXJuIGNvdW50OworCisJCXJldCA9IHN0YW5kYnlfYm9vdF9zZXEocGRldik7CisJfSBlbHNlIGlmIChzeXNmc19zdHJlcShidWYsICJmd19mbGFzaGluZyIpKSB7CisJCWlmIChhcGItPnN0YXRlID09IEFSQ0hFX1BMQVRGT1JNX1NUQVRFX0ZXX0ZMQVNISU5HKQorCQkJcmV0dXJuIGNvdW50OworCisJCS8qIEZpcnN0IHdlIHdhbnQgdG8gbWFrZSBzdXJlIHdlIHBvd2VyIG9mZiBldmVyeXRoaW5nCisJCSAqIGFuZCB0aGVuIGVudGVyIEZXIGZsYXNoaW5nIHN0YXRlICovCisJCXBvd2Vyb2ZmX3NlcShwZGV2KTsKKwkJcmV0ID0gZndfZmxhc2hpbmdfc2VxKHBkZXYpOworCX0gZWxzZSB7CisJCWRldl9lcnIoZGV2LCAidW5rbm93biBzdGF0ZVxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldCA/IHJldCA6IGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYXJjaGVfYXBiX2N0cmxfZHJ2ZGF0YSAqYXBiID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlzd2l0Y2ggKGFwYi0+c3RhdGUpIHsKKwljYXNlIEFSQ0hFX1BMQVRGT1JNX1NUQVRFX09GRjoKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAib2ZmJXNcbiIsCisJCQkJYXBiLT5pbml0X2Rpc2FibGVkID8gIixkaXNhYmxlZCIgOiAiIik7CisJY2FzZSBBUkNIRV9QTEFURk9STV9TVEFURV9BQ1RJVkU6CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgImFjdGl2ZVxuIik7CisJY2FzZSBBUkNIRV9QTEFURk9STV9TVEFURV9TVEFOREJZOgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJzdGFuZGJ5XG4iKTsKKwljYXNlIEFSQ0hFX1BMQVRGT1JNX1NUQVRFX0ZXX0ZMQVNISU5HOgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJmd19mbGFzaGluZ1xuIik7CisJZGVmYXVsdDoKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAidW5rbm93biBzdGF0ZVxuIik7CisJfQorfQorCitzdGF0aWMgREVWSUNFX0FUVFJfUlcoc3RhdGUpOworCitzdGF0aWMgaW50IGFwYl9jdHJsX2dldF9kZXZ0cmVlX2RhdGEoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJc3RydWN0IGFyY2hlX2FwYl9jdHJsX2RydmRhdGEgKmFwYikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CisJaW50IHJldDsKKworCWFwYi0+cmVzZXRuX2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhucCwgInJlc2V0LWdwaW9zIiwgMCk7CisJaWYgKGFwYi0+cmVzZXRuX2dwaW8gPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCByZXNldCBncGlvXG4iKTsKKwkJcmV0dXJuIGFwYi0+cmVzZXRuX2dwaW87CisJfQorCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZShkZXYsIGFwYi0+cmVzZXRuX2dwaW8sCisJCQlHUElPRl9PVVRfSU5JVF9MT1csICJhcGItcmVzZXQiKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHJlcXVlc3RpbmcgcmVzZXQgZ3BpbyAlZFxuIiwKKwkJCQlhcGItPnJlc2V0bl9ncGlvKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlhcGItPmJvb3RfcmV0X2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhucCwgImJvb3QtcmV0LWdwaW9zIiwgMCk7CisJaWYgKGFwYi0+Ym9vdF9yZXRfZ3BpbyA8IDApIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IGJvb3QgcmV0ZW50aW9uIGdwaW9cbiIpOworCQlyZXR1cm4gYXBiLT5ib290X3JldF9ncGlvOworCX0KKwlyZXQgPSBkZXZtX2dwaW9fcmVxdWVzdF9vbmUoZGV2LCBhcGItPmJvb3RfcmV0X2dwaW8sCisJCQlHUElPRl9PVVRfSU5JVF9MT1csICJib290IHJldGVudGlvbiIpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgcmVxdWVzdGluZyBib290cmV0IGdwaW8gJWRcbiIsCisJCQkJYXBiLT5ib290X3JldF9ncGlvKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBJdCdzIG5vdCBtYW5kYXRvcnkgdG8gc3VwcG9ydCBwb3dlciBtYW5hZ2VtZW50IGludGVyZmFjZSAqLworCWFwYi0+cHdyb2ZmX2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhucCwgInB3ci1vZmYtZ3Bpb3MiLCAwKTsKKwlpZiAoYXBiLT5wd3JvZmZfZ3BpbyA8IDApIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IHBvd2VyIG9mZiBncGlvXG4iKTsKKwkJcmV0dXJuIGFwYi0+cHdyb2ZmX2dwaW87CisJfQorCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZShkZXYsIGFwYi0+cHdyb2ZmX2dwaW8sCisJCQlHUElPRl9JTiwgInB3cm9mZl9uIik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCByZXF1ZXN0aW5nIHB3cm9mZl9uIGdwaW8gJWRcbiIsCisJCQkJYXBiLT5wd3JvZmZfZ3Bpbyk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogRG8gbm90IG1ha2UgY2xvY2sgbWFuZGF0b3J5IGFzIG9mIG5vdyAoZm9yIERCMykgKi8KKwlhcGItPmNsa19lbl9ncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW8obnAsICJjbG9jay1lbi1ncGlvIiwgMCk7CisJaWYgKGFwYi0+Y2xrX2VuX2dwaW8gPCAwKSB7CisJCWRldl93YXJuKGRldiwgImZhaWxlZCB0byBnZXQgY2xvY2sgZW4gZ3Bpb1xuIik7CisJfSBlbHNlIGlmIChncGlvX2lzX3ZhbGlkKGFwYi0+Y2xrX2VuX2dwaW8pKSB7CisJCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZShkZXYsIGFwYi0+Y2xrX2VuX2dwaW8sCisJCQkJR1BJT0ZfT1VUX0lOSVRfTE9XLCAiYXBiX2Nsa19lbiIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfd2FybihkZXYsICJGYWlsZWQgcmVxdWVzdGluZyBBUEIgY2xvY2sgZW4gZ3BpbyAlZFxuIiwKKwkJCQkJYXBiLT5jbGtfZW5fZ3Bpbyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJYXBiLT5wd3Jkbl9ncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW8obnAsICJwd3ItZG93bi1ncGlvcyIsIDApOworCWlmIChhcGItPnB3cmRuX2dwaW8gPCAwKQorCQlkZXZfd2FybihkZXYsICJmYWlsZWQgdG8gZ2V0IHBvd2VyIGRvd24gZ3Bpb1xuIik7CisKKwkvKiBSZWd1bGF0b3JzIGFyZSBvcHRpb25hbCwgYXMgd2UgbWF5IGhhdmUgZml4ZWQgc3VwcGx5IGNvbWluZyBpbiAqLworCWFwYi0+dmNvcmUgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoZGV2LCAidmNvcmUiKTsKKwlpZiAoSVNfRVJSKGFwYi0+dmNvcmUpKQorCQlkZXZfd2FybihkZXYsICJubyBjb3JlIHJlZ3VsYXRvciBmb3VuZFxuIik7CisKKwlhcGItPnZpbyA9IGRldm1fcmVndWxhdG9yX2dldChkZXYsICJ2aW8iKTsKKwlpZiAoSVNfRVJSKGFwYi0+dmlvKSkKKwkJZGV2X3dhcm4oZGV2LCAibm8gSU8gcmVndWxhdG9yIGZvdW5kXG4iKTsKKworCWFwYi0+cGluY3RybCA9IGRldm1fcGluY3RybF9nZXQoJnBkZXYtPmRldik7CisJaWYgKElTX0VSUihhcGItPnBpbmN0cmwpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBnZXQgcGluY3RybCBoYW5kbGVcbiIpOworCQlyZXR1cm4gUFRSX0VSUihhcGItPnBpbmN0cmwpOworCX0KKwlhcGItPnBpbl9kZWZhdWx0ID0gcGluY3RybF9sb29rdXBfc3RhdGUoYXBiLT5waW5jdHJsLCAiZGVmYXVsdCIpOworCWlmIChJU19FUlIoYXBiLT5waW5fZGVmYXVsdCkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IGdldCBkZWZhdWx0IHBpbiBzdGF0ZVxuIik7CisJCXJldHVybiBQVFJfRVJSKGFwYi0+cGluX2RlZmF1bHQpOworCX0KKworCS8qIE9ubHkgYXBwbGljYWJsZSBmb3IgcGxhdGZvcm0gPj0gVjIgKi8KKwlhcGItPnNwaV9lbl9ncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW8obnAsICJzcGktZW4tZ3BpbyIsIDApOworCWlmIChhcGItPnNwaV9lbl9ncGlvID49IDApIHsKKwkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJInNwaS1lbi1hY3RpdmUtaGlnaCIpKQorCQkJYXBiLT5zcGlfZW5fcG9sYXJpdHlfaGlnaCA9IHRydWU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXJjaGVfYXBiX2N0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhcmNoZV9hcGJfY3RybF9kcnZkYXRhICphcGI7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKworCWFwYiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmFwYiksIEdGUF9LRVJORUwpOworCWlmICghYXBiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IGFwYl9jdHJsX2dldF9kZXZ0cmVlX2RhdGEocGRldiwgYXBiKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBhcGIgZGV2aWNldHJlZSBkYXRhICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIEluaXRpYWxseSBzZXQgQVBCIHRvIE9GRiBzdGF0ZSAqLworCWFwYi0+c3RhdGUgPSBBUkNIRV9QTEFURk9STV9TVEFURV9PRkY7CisJLyogQ2hlY2sgd2hldGhlciBkZXZpY2UgbmVlZHMgdG8gYmUgZW5hYmxlZCBvbiBib290ICovCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChwZGV2LT5kZXYub2Zfbm9kZSwgImFyY2hlLGluaXQtZGlzYWJsZSIpKQorCQlhcGItPmluaXRfZGlzYWJsZWQgPSB0cnVlOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgYXBiKTsKKworCS8qIENyZWF0ZSBzeXNmcyBpbnRlcmZhY2UgdG8gYWxsb3cgdXNlciB0byBjaGFuZ2Ugc3RhdGUgZHluYW1pY2FsbHkgKi8KKwlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfc3RhdGUpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gY3JlYXRlIHN0YXRlIGZpbGUgaW4gc3lzZnNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJEZXZpY2UgcmVnaXN0ZXJlZCBzdWNjZXNzZnVsbHlcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFyY2hlX2FwYl9jdHJsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfc3RhdGUpOworCXBvd2Vyb2ZmX3NlcShwZGV2KTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFyY2hlX2FwYl9jdHJsX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCS8qCisJICogSWYgdGltaW5nIHByb2ZpbGUgcGVybWl0cywgd2UgbWF5IHNodXRkb3duIGJyaWRnZQorCSAqIGNvbXBsZXRlbHkKKwkgKgorCSAqIFRPRE86IHNlcXVlbmNlID8/CisJICoKKwkgKiBBbHNvLCBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBtZWV0IHByZWNvbmRpdGlvbiBmb3IgdW5pcHJvIHN1c3BlbmQKKwkgKiBQcmVjb25kaXRpb246IERlZmluaXRpb24gPz8/CisJICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXJjaGVfYXBiX2N0cmxfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwkvKgorCSAqIEF0bGVhc3QgZm9yIEVTMiB3ZSBoYXZlIHRvIG1lZXQgdGhlIGRlbGF5IHJlcXVpcmVtZW50IGJldHdlZW4KKwkgKiB1bmlwcm8gc3dpdGNoIGFuZCBBUCBicmlkZ2UgaW5pdCwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgYnJpZGdlIGlzIGluCisJICogT0ZGIHN0YXRlIG9yIHN0YW5kYnkgc3RhdGUuCisJICoKKwkgKiBCYXNlZCBvbiB3aGV0aGVyIGJyaWRnZSBpcyBpbiBzdGFuZGJ5IG9yIE9GRiBzdGF0ZSB3ZSBtYXkgaGF2ZSB0bworCSAqIGFzc2VydCBtdWx0aXBsZSBzaWduYWxzLiBQbGVhc2UgcmVmZXIgdG8gV0RNIHNwZWMsIGZvciBtb3JlIGluZm8uCisJICoKKwkgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXJjaGVfYXBiX2N0cmxfc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlhcGJfY3RybF9wb3dlcm9mZigmcGRldi0+ZGV2KTsKK30KKworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGFyY2hlX2FwYl9jdHJsX3BtX29wcywgYXJjaGVfYXBiX2N0cmxfc3VzcGVuZCwKKwkJCSBhcmNoZV9hcGJfY3RybF9yZXN1bWUpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhcmNoZV9hcGJfY3RybF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAidXNiZmZmZiwyIiwgfSwKKwl7IH0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhcmNoZV9hcGJfY3RybF9kZXZpY2VfZHJpdmVyID0geworCS5wcm9iZQkJPSBhcmNoZV9hcGJfY3RybF9wcm9iZSwKKwkucmVtb3ZlCQk9IGFyY2hlX2FwYl9jdHJsX3JlbW92ZSwKKwkuc2h1dGRvd24JPSBhcmNoZV9hcGJfY3RybF9zaHV0ZG93biwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiYXJjaGUtYXBiLWN0cmwiLAorCQkucG0JPSAmYXJjaGVfYXBiX2N0cmxfcG1fb3BzLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBhcmNoZV9hcGJfY3RybF9vZl9tYXRjaCwKKwl9Cit9OworCitpbnQgX19pbml0IGFyY2hlX2FwYl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXJjaGVfYXBiX2N0cmxfZGV2aWNlX2RyaXZlcik7Cit9CisKK3ZvaWQgX19leGl0IGFyY2hlX2FwYl9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFyY2hlX2FwYl9jdHJsX2RldmljZV9kcml2ZXIpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXJjaGUtcGxhdGZvcm0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2FyY2hlLXBsYXRmb3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM2ZWU5OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2FyY2hlLXBsYXRmb3JtLmMKQEAgLTAsMCArMSw4MjcgQEAKKy8qCisgKiBBcmNoZSBQbGF0Zm9ybSBkcml2ZXIgdG8gZW5hYmxlIFVuaXBybyBsaW5rLgorICoKKyAqIENvcHlyaWdodCAyMDE0LTIwMTUgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE0LTIwMTUgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSAiYXJjaGVfcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJncmV5YnVzLmgiCisKKyNpbmNsdWRlIDxsaW51eC91c2IvdXNiMzYxMy5oPgorCisjZGVmaW5lIFdEX0NPTERCT09UX1BVTFNFX1dJRFRIX01TCTMwCisKK2VudW0gc3ZjX3dha2VkZXRlY3Rfc3RhdGUgeworCVdEX1NUQVRFX0lETEUsCQkJLyogRGVmYXVsdCBzdGF0ZSA9IHB1bGxlZCBoaWdoL2xvdyAqLworCVdEX1NUQVRFX0JPT1RfSU5JVCwJCS8qIFdEID0gZmFsbGluZyBlZGdlIChsb3cpICovCisJV0RfU1RBVEVfQ09MREJPT1RfVFJJRywJCS8qIFdEID0gcmlzaW5nIGVkZ2UgKGhpZ2gpLCA+IDMwbXNlYyAqLworCVdEX1NUQVRFX1NUQU5EQllCT09UX1RSSUcsCS8qIEFzIG9mIG5vdyBub3QgdXNlZCA/PyAqLworCVdEX1NUQVRFX0NPTERCT09UX1NUQVJULAkvKiBDb2xkIGJvb3QgcHJvY2VzcyBzdGFydGVkICovCisJV0RfU1RBVEVfU1RBTkRCWUJPT1RfU1RBUlQsCS8qIE5vdCB1c2VkICovCisJV0RfU1RBVEVfVElNRVNZTkMsCit9OworCitzdHJ1Y3QgYXJjaGVfcGxhdGZvcm1fZHJ2ZGF0YSB7CisJLyogQ29udHJvbCBHUElPIHNpZ25hbHMgdG8gYW5kIGZyb20gQVAgPD0+IFNWQyAqLworCWludCBzdmNfcmVzZXRfZ3BpbzsKKwlib29sIGlzX3Jlc2V0X2FjdF9oaTsKKwlpbnQgc3ZjX3N5c2Jvb3RfZ3BpbzsKKwlpbnQgd2FrZV9kZXRlY3RfZ3BpbzsgLyogYmktZGlyLG1hcHMgdG8gV0FLRV9NT0QgJiBXQUtFX0ZSQU1FIHNpZ25hbHMgKi8KKworCWVudW0gYXJjaGVfcGxhdGZvcm1fc3RhdGUgc3RhdGU7CisKKwlpbnQgc3ZjX3JlZmNsa19yZXE7CisJc3RydWN0IGNsayAqc3ZjX3JlZl9jbGs7CisKKwlzdHJ1Y3QgcGluY3RybCAqcGluY3RybDsKKwlzdHJ1Y3QgcGluY3RybF9zdGF0ZSAqcGluX2RlZmF1bHQ7CisKKwlpbnQgbnVtX2FwYnM7CisKKwllbnVtIHN2Y193YWtlZGV0ZWN0X3N0YXRlIHdha2VfZGV0ZWN0X3N0YXRlOworCWludCB3YWtlX2RldGVjdF9pcnE7CisJc3BpbmxvY2tfdCB3YWtlX2xvY2s7CQkJLyogUHJvdGVjdCB3YWtlX2RldGVjdF9zdGF0ZSAqLworCXN0cnVjdCBtdXRleCBwbGF0Zm9ybV9zdGF0ZV9tdXRleDsJLyogUHJvdGVjdCBzdGF0ZSAqLworCXdhaXRfcXVldWVfaGVhZF90IHdxOwkJCS8qIFdRIGZvciBhcmNoZV9wZGF0YS0+c3RhdGUgKi8KKwl1bnNpZ25lZCBsb25nIHdha2VfZGV0ZWN0X3N0YXJ0OworCXN0cnVjdCBub3RpZmllcl9ibG9jayBwbV9ub3RpZmllcjsKKworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICp0aW1lc3luY19zdmNfcGRhdGE7Cit9OworCitzdGF0aWMgaW50IGFyY2hlX2FwYl9ib290cmV0X2Fzc2VydChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJYXBiX2Jvb3RyZXRfYXNzZXJ0KGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXJjaGVfYXBiX2Jvb3RyZXRfZGVhc3NlcnQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCWFwYl9ib290cmV0X2RlYXNzZXJ0KGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qIFJlcXVpcmVzIGNhbGxpbmcgY29udGV4dCB0byBob2xkIGFyY2hlX3BkYXRhLT5wbGF0Zm9ybV9zdGF0ZV9tdXRleCAqLworc3RhdGljIHZvaWQgYXJjaGVfcGxhdGZvcm1fc2V0X3N0YXRlKHN0cnVjdCBhcmNoZV9wbGF0Zm9ybV9kcnZkYXRhICphcmNoZV9wZGF0YSwKKwkJCQkgICAgIGVudW0gYXJjaGVfcGxhdGZvcm1fc3RhdGUgc3RhdGUpCit7CisJYXJjaGVfcGRhdGEtPnN0YXRlID0gc3RhdGU7Cit9CisKKy8qCisgKiBhcmNoZV9wbGF0Zm9ybV9jaGFuZ2Vfc3RhdGU6IENoYW5nZSB0aGUgb3BlcmF0aW9uYWwgc3RhdGUKKyAqCisgKiBUaGlzIGV4cG9ydGVkIGZ1bmN0aW9uIGFsbG93cyBleHRlcm5hbCBkcml2ZXJzIHRvIGNoYW5nZSB0aGUgc3RhdGUKKyAqIG9mIHRoZSBhcmNoZS1wbGF0Zm9ybSBkcml2ZXIuCisgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIHRyYW5zaXRpb25zIGJldHdlZW4gdHdvIHN0YXRlcworICogd2l0aCBsaW1pdGVkIGZ1bmN0aW9uYWxpdHkuCisgKgorICogIC0gQVJDSEVfUExBVEZPUk1fU1RBVEVfVElNRV9TWU5DOgorICogICAgT25jZSBzZXQsIGFsbG93cyB0aW1lc3luYyBvcGVyYXRpb25zIGJldHdlZW4gU1ZDIDw9PiBBUCBhbmQgbWFrZXMKKyAqICAgIHN1cmUgdGhhdCBhcmNoZS1wbGF0Zm9ybSBkcml2ZXIgaWdub3JlcyBhbnkgc3Vic2VxdWVudCBldmVudHMvcHVsc2VzCisgKiAgICBmcm9tIFNWQyBvdmVyIHdha2UvZGV0ZWN0LgorICoKKyAqICAtIEFSQ0hFX1BMQVRGT1JNX1NUQVRFX0FDVElWRToKKyAqICAgIFB1dHMgYmFjayBkcml2ZXIgdG8gYWN0aXZlIHN0YXRlLCB3aGVyZSBhbnkgcHVsc2UgZnJvbSBTVkMgb24gd2FrZS9kZXRlY3QKKyAqICAgIGxpbmUgd291bGQgdHJpZ2dlciBlaXRoZXIgY29sZC9zdGFuZGJ5IGJvb3QuCisgKiAgICBOb3RlOiBUcmFuc2l0aW9uIHJlcXVlc3QgZnJvbSB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHRyaWdnZXIgY29sZC9zdGFuZGJ5CisgKiAgICAgICAgICBib290LiBJdCBqdXN0IHB1dHMgYmFjayBkcml2ZXIgYm9vayBrZWVwaW5nIHZhcmlhYmxlIGJhY2sgdG8gQUNUSVZFCisgKiAgICAgICAgICBzdGF0ZSBhbmQgcmVzdG9yZXMgdGhlIGludGVycnVwdC4KKyAqCisgKiBSZXR1cm5zIC1FTk9ERVYgaWYgZGV2aWNlIG5vdCBmb3VuZCwgLUVBR0FJTiBpZiB0aGUgZHJpdmVyIGNhbm5vdCBjdXJyZW50bHkKKyAqIHNhdGlzZnkgdGhlIHJlcXVlc3RlZCBzdGF0ZS10cmFuc2l0aW9uIG9yIC1FSU5WQUwgZm9yIGFsbCBvdGhlcgorICogc3RhdGUtdHJhbnNpdGlvbiByZXF1ZXN0cy4KKyAqLworaW50IGFyY2hlX3BsYXRmb3JtX2NoYW5nZV9zdGF0ZShlbnVtIGFyY2hlX3BsYXRmb3JtX3N0YXRlIHN0YXRlLAorCQkJCXN0cnVjdCBnYl90aW1lc3luY19zdmMgKnRpbWVzeW5jX3N2Y19wZGF0YSkKK3sKKwlzdHJ1Y3QgYXJjaGVfcGxhdGZvcm1fZHJ2ZGF0YSAqYXJjaGVfcGRhdGE7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCWludCByZXQgPSAtRUFHQUlOOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJnb29nbGUsYXJjaGUtcGxhdGZvcm0iKTsKKwlpZiAoIW5wKSB7CisJCXByX2VycigiZ29vZ2xlLGFyY2hlLXBsYXRmb3JtIGRldmljZSBub2RlIG5vdCBmb3VuZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXBkZXYgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKG5wKTsKKwlpZiAoIXBkZXYpIHsKKwkJcHJfZXJyKCJhcmNoZS1wbGF0Zm9ybSBkZXZpY2Ugbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJYXJjaGVfcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCW11dGV4X2xvY2soJmFyY2hlX3BkYXRhLT5wbGF0Zm9ybV9zdGF0ZV9tdXRleCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmFyY2hlX3BkYXRhLT53YWtlX2xvY2ssIGZsYWdzKTsKKworCWlmIChhcmNoZV9wZGF0YS0+c3RhdGUgPT0gc3RhdGUpIHsKKwkJcmV0ID0gMDsKKwkJZ290byBleGl0OworCX0KKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIEFSQ0hFX1BMQVRGT1JNX1NUQVRFX1RJTUVfU1lOQzoKKwkJaWYgKGFyY2hlX3BkYXRhLT5zdGF0ZSAhPSBBUkNIRV9QTEFURk9STV9TVEFURV9BQ1RJVkUpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwkJaWYgKGFyY2hlX3BkYXRhLT53YWtlX2RldGVjdF9zdGF0ZSAhPSBXRF9TVEFURV9JRExFKSB7CisJCQlkZXZfZXJyKGFyY2hlX3BkYXRhLT5kZXYsCisJCQkJImRyaXZlciBidXN5IHdpdGggd2FrZS9kZXRlY3QgbGluZSBvcHNcbiIpOworCQkJZ290byAgZXhpdDsKKwkJfQorCQlkZXZpY2VfZm9yX2VhY2hfY2hpbGQoYXJjaGVfcGRhdGEtPmRldiwgTlVMTCwKKwkJCQkgICAgICBhcmNoZV9hcGJfYm9vdHJldF9hc3NlcnQpOworCQlhcmNoZV9wZGF0YS0+d2FrZV9kZXRlY3Rfc3RhdGUgPSBXRF9TVEFURV9USU1FU1lOQzsKKwkJYnJlYWs7CisJY2FzZSBBUkNIRV9QTEFURk9STV9TVEFURV9BQ1RJVkU6CisJCWlmIChhcmNoZV9wZGF0YS0+c3RhdGUgIT0gQVJDSEVfUExBVEZPUk1fU1RBVEVfVElNRV9TWU5DKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBleGl0OworCQl9CisJCWRldmljZV9mb3JfZWFjaF9jaGlsZChhcmNoZV9wZGF0YS0+ZGV2LCBOVUxMLAorCQkJCSAgICAgIGFyY2hlX2FwYl9ib290cmV0X2RlYXNzZXJ0KTsKKwkJYXJjaGVfcGRhdGEtPndha2VfZGV0ZWN0X3N0YXRlID0gV0RfU1RBVEVfSURMRTsKKwkJYnJlYWs7CisJY2FzZSBBUkNIRV9QTEFURk9STV9TVEFURV9PRkY6CisJY2FzZSBBUkNIRV9QTEFURk9STV9TVEFURV9TVEFOREJZOgorCWNhc2UgQVJDSEVfUExBVEZPUk1fU1RBVEVfRldfRkxBU0hJTkc6CisJCWRldl9lcnIoYXJjaGVfcGRhdGEtPmRldiwgImJ1c3ksIHJlcXVlc3QgdG8gcmV0cnkgbGF0ZXJcbiIpOworCQlnb3RvIGV4aXQ7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZGV2X2VycihhcmNoZV9wZGF0YS0+ZGV2LAorCQkJImludmFsaWQgc3RhdGUgdHJhbnNpdGlvbiByZXF1ZXN0XG4iKTsKKwkJZ290byBleGl0OworCX0KKwlhcmNoZV9wZGF0YS0+dGltZXN5bmNfc3ZjX3BkYXRhID0gdGltZXN5bmNfc3ZjX3BkYXRhOworCWFyY2hlX3BsYXRmb3JtX3NldF9zdGF0ZShhcmNoZV9wZGF0YSwgc3RhdGUpOworCWlmIChzdGF0ZSA9PSBBUkNIRV9QTEFURk9STV9TVEFURV9BQ1RJVkUpCisJCXdha2VfdXAoJmFyY2hlX3BkYXRhLT53cSk7CisKKwlyZXQgPSAwOworZXhpdDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcmNoZV9wZGF0YS0+d2FrZV9sb2NrLCBmbGFncyk7CisJbXV0ZXhfdW5sb2NrKCZhcmNoZV9wZGF0YS0+cGxhdGZvcm1fc3RhdGVfbXV0ZXgpOworCW9mX25vZGVfcHV0KG5wKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXJjaGVfcGxhdGZvcm1fY2hhbmdlX3N0YXRlKTsKKworLyogUmVxdWlyZXMgYXJjaGVfcGRhdGEtPndha2VfbG9jayBpcyBoZWxkIGJ5IGNhbGxpbmcgY29udGV4dCAqLworc3RhdGljIHZvaWQgYXJjaGVfcGxhdGZvcm1fc2V0X3dha2VfZGV0ZWN0X3N0YXRlKAorCQkJCXN0cnVjdCBhcmNoZV9wbGF0Zm9ybV9kcnZkYXRhICphcmNoZV9wZGF0YSwKKwkJCQllbnVtIHN2Y193YWtlZGV0ZWN0X3N0YXRlIHN0YXRlKQoreworCWFyY2hlX3BkYXRhLT53YWtlX2RldGVjdF9zdGF0ZSA9IHN0YXRlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3ZjX3Jlc2V0X29ub2ZmKHVuc2lnbmVkIGludCBncGlvLCBib29sIG9ub2ZmKQoreworCWdwaW9fc2V0X3ZhbHVlKGdwaW8sIG9ub2ZmKTsKK30KKworc3RhdGljIGludCBhcGJfY29sZF9ib290KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gYXBiX2N0cmxfY29sZGJvb3QoZGV2KTsKKwlpZiAocmV0KQorCQlkZXZfd2FybihkZXYsICJmYWlsZWQgdG8gY29sZGJvb3RcbiIpOworCisJLypDaGlsZCBub2RlcyBhcmUgaW5kZXBlbmRlbnQsIHNvIGRvIG5vdCBleGl0IGNvbGRib290IG9wZXJhdGlvbiAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFwYl9wb3dlcm9mZihzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJYXBiX2N0cmxfcG93ZXJvZmYoZGV2KTsKKworCS8qIEVuYWJsZSBIVUIzNjEzIGludG8gSFVCIG1vZGUuICovCisJaWYgKHVzYjM2MTNfaHViX21vZGVfY3RybChmYWxzZSkpCisJCWRldl93YXJuKGRldiwgImZhaWxlZCB0byBjb250cm9sIGh1YiBkZXZpY2VcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFyY2hlX3BsYXRmb3JtX3dkX2lycV9lbihzdHJ1Y3QgYXJjaGVfcGxhdGZvcm1fZHJ2ZGF0YSAqYXJjaGVfcGRhdGEpCit7CisJLyogRW5hYmxlIGludGVycnVwdCBoZXJlLCB0byByZWFkIGV2ZW50IGJhY2sgZnJvbSBTVkMgKi8KKwlncGlvX2RpcmVjdGlvbl9pbnB1dChhcmNoZV9wZGF0YS0+d2FrZV9kZXRlY3RfZ3Bpbyk7CisJZW5hYmxlX2lycShhcmNoZV9wZGF0YS0+d2FrZV9kZXRlY3RfaXJxKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGFyY2hlX3BsYXRmb3JtX3dkX2lycV90aHJlYWQoaW50IGlycSwgdm9pZCAqZGV2aWQpCit7CisJc3RydWN0IGFyY2hlX3BsYXRmb3JtX2RydmRhdGEgKmFyY2hlX3BkYXRhID0gZGV2aWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhcmNoZV9wZGF0YS0+d2FrZV9sb2NrLCBmbGFncyk7CisJaWYgKGFyY2hlX3BkYXRhLT53YWtlX2RldGVjdF9zdGF0ZSAhPSBXRF9TVEFURV9DT0xEQk9PVF9UUklHKSB7CisJCS8qIFNvbWV0aGluZyBpcyB3cm9uZyAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcmNoZV9wZGF0YS0+d2FrZV9sb2NrLCBmbGFncyk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlhcmNoZV9wbGF0Zm9ybV9zZXRfd2FrZV9kZXRlY3Rfc3RhdGUoYXJjaGVfcGRhdGEsCisJCQkJCSAgICAgV0RfU1RBVEVfQ09MREJPT1RfU1RBUlQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFyY2hlX3BkYXRhLT53YWtlX2xvY2ssIGZsYWdzKTsKKworCS8qIEl0IHNob3VsZCBjb21wbGV0ZSBwb3dlciBjeWNsZSwgc28gZmlyc3QgbWFrZSBzdXJlIGl0IGlzIHBvd2Vyb2ZmICovCisJZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKGFyY2hlX3BkYXRhLT5kZXYsIE5VTEwsIGFwYl9wb3dlcm9mZik7CisKKwkvKiBCcmluZyBBUEIgb3V0IG9mIHJlc2V0OiBjb2xkIGJvb3Qgc2VxdWVuY2UgKi8KKwlkZXZpY2VfZm9yX2VhY2hfY2hpbGQoYXJjaGVfcGRhdGEtPmRldiwgTlVMTCwgYXBiX2NvbGRfYm9vdCk7CisKKwkvKiBFbmFibGUgSFVCMzYxMyBpbnRvIEhVQiBtb2RlLiAqLworCWlmICh1c2IzNjEzX2h1Yl9tb2RlX2N0cmwodHJ1ZSkpCisJCWRldl93YXJuKGFyY2hlX3BkYXRhLT5kZXYsICJmYWlsZWQgdG8gY29udHJvbCBodWIgZGV2aWNlXG4iKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhcmNoZV9wZGF0YS0+d2FrZV9sb2NrLCBmbGFncyk7CisJYXJjaGVfcGxhdGZvcm1fc2V0X3dha2VfZGV0ZWN0X3N0YXRlKGFyY2hlX3BkYXRhLCBXRF9TVEFURV9JRExFKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcmNoZV9wZGF0YS0+d2FrZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhcmNoZV9wbGF0Zm9ybV93ZF9pcnEoaW50IGlycSwgdm9pZCAqZGV2aWQpCit7CisJc3RydWN0IGFyY2hlX3BsYXRmb3JtX2RydmRhdGEgKmFyY2hlX3BkYXRhID0gZGV2aWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhcmNoZV9wZGF0YS0+d2FrZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoYXJjaGVfcGRhdGEtPndha2VfZGV0ZWN0X3N0YXRlID09IFdEX1NUQVRFX1RJTUVTWU5DKSB7CisJCWdiX3RpbWVzeW5jX2lycShhcmNoZV9wZGF0YS0+dGltZXN5bmNfc3ZjX3BkYXRhKTsKKwkJZ290byBleGl0OworCX0KKworCWlmIChncGlvX2dldF92YWx1ZShhcmNoZV9wZGF0YS0+d2FrZV9kZXRlY3RfZ3BpbykpIHsKKwkJLyogd2FrZS9kZXRlY3QgcmlzaW5nICovCisKKwkJLyoKKwkJICogSWYgd2FrZS9kZXRlY3QgbGluZSBnb2VzIGhpZ2ggYWZ0ZXIgbG93LCB3aXRoaW4gbGVzcyB0aGFuCisJCSAqIDMwbXNlYywgdGhlbiBzdGFuZGJ5IGJvb3Qgc2VxdWVuY2UgaXMgaW5pdGlhdGVkLCB3aGljaCBpcyBub3QKKwkJICogc3VwcG9ydGVkL2ltcGxlbWVudGVkIGFzIG9mIG5vdy4gU28gaWdub3JlIGl0LgorCQkgKi8KKwkJaWYgKGFyY2hlX3BkYXRhLT53YWtlX2RldGVjdF9zdGF0ZSA9PSBXRF9TVEFURV9CT09UX0lOSVQpIHsKKwkJCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLAorCQkJCQlhcmNoZV9wZGF0YS0+d2FrZV9kZXRlY3Rfc3RhcnQgKworCQkJCQltc2Vjc190b19qaWZmaWVzKFdEX0NPTERCT09UX1BVTFNFX1dJRFRIX01TKSkpIHsKKwkJCQlhcmNoZV9wbGF0Zm9ybV9zZXRfd2FrZV9kZXRlY3Rfc3RhdGUoYXJjaGVfcGRhdGEsCisJCQkJCQkJCSAgICAgV0RfU1RBVEVfSURMRSk7CisJCQl9IGVsc2UgeworCQkJCS8qIENoZWNrIHdlIGFyZSBub3QgaW4gbWlkZGxlIG9mIGlycSB0aHJlYWQgYWxyZWFkeSAqLworCQkJCWlmIChhcmNoZV9wZGF0YS0+d2FrZV9kZXRlY3Rfc3RhdGUgIT0KKwkJCQkJCVdEX1NUQVRFX0NPTERCT09UX1NUQVJUKSB7CisJCQkJCWFyY2hlX3BsYXRmb3JtX3NldF93YWtlX2RldGVjdF9zdGF0ZShhcmNoZV9wZGF0YSwKKwkJCQkJCQkJCSAgICAgV0RfU1RBVEVfQ09MREJPT1RfVFJJRyk7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoCisJCQkJCQkmYXJjaGVfcGRhdGEtPndha2VfbG9jaywKKwkJCQkJCWZsYWdzKTsKKwkJCQkJcmV0dXJuIElSUV9XQUtFX1RIUkVBRDsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiB3YWtlL2RldGVjdCBmYWxsaW5nICovCisJCWlmIChhcmNoZV9wZGF0YS0+d2FrZV9kZXRlY3Rfc3RhdGUgPT0gV0RfU1RBVEVfSURMRSkgeworCQkJYXJjaGVfcGRhdGEtPndha2VfZGV0ZWN0X3N0YXJ0ID0gamlmZmllczsKKwkJCS8qCisJCQkgKiBJbiB0aGUgYmVnaW5pbmcsIHdoZW4gd2FrZS9kZXRlY3QgZ29lcyBsb3cgKGZpcnN0IHRpbWUpLCB3ZSBhc3N1bWUKKwkJCSAqIGl0IGlzIG1lYW50IGZvciBjb2xkYm9vdCBhbmQgc2V0IHRoZSBmbGFnLiBJZiB3YWtlL2RldGVjdCBsaW5lIHN0YXlzIGxvdworCQkJICogYmV5b25kIDMwbXNlYywgdGhlbiBpdCBpcyBjb2xkYm9vdCBlbHNlIGZhbGxiYWNrIHRvIHN0YW5kYnkgYm9vdC4KKwkJCSAqLworCQkJYXJjaGVfcGxhdGZvcm1fc2V0X3dha2VfZGV0ZWN0X3N0YXRlKGFyY2hlX3BkYXRhLAorCQkJCQkJCSAgICAgV0RfU1RBVEVfQk9PVF9JTklUKTsKKwkJfQorCX0KKworZXhpdDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcmNoZV9wZGF0YS0+d2FrZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBSZXF1aXJlcyBhcmNoZV9wZGF0YS0+cGxhdGZvcm1fc3RhdGVfbXV0ZXggdG8gYmUgaGVsZAorICovCitzdGF0aWMgaW50IGFyY2hlX3BsYXRmb3JtX2NvbGRib290X3NlcShzdHJ1Y3QgYXJjaGVfcGxhdGZvcm1fZHJ2ZGF0YSAqYXJjaGVfcGRhdGEpCit7CisJaW50IHJldDsKKworCWlmIChhcmNoZV9wZGF0YS0+c3RhdGUgPT0gQVJDSEVfUExBVEZPUk1fU1RBVEVfQUNUSVZFKQorCQlyZXR1cm4gMDsKKworCWRldl9pbmZvKGFyY2hlX3BkYXRhLT5kZXYsICJCb290aW5nIGZyb20gY29sZCBib290IHN0YXRlXG4iKTsKKworCXN2Y19yZXNldF9vbm9mZihhcmNoZV9wZGF0YS0+c3ZjX3Jlc2V0X2dwaW8sCisJCQlhcmNoZV9wZGF0YS0+aXNfcmVzZXRfYWN0X2hpKTsKKworCWdwaW9fc2V0X3ZhbHVlKGFyY2hlX3BkYXRhLT5zdmNfc3lzYm9vdF9ncGlvLCAwKTsKKwl1c2xlZXBfcmFuZ2UoMTAwLCAyMDApOworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGFyY2hlX3BkYXRhLT5zdmNfcmVmX2Nsayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGFyY2hlX3BkYXRhLT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIHN2Y19yZWZfY2xrOiAlZFxuIiwKKwkJCQlyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIGJyaW5nIFNWQyBvdXQgb2YgcmVzZXQgKi8KKwlzdmNfcmVzZXRfb25vZmYoYXJjaGVfcGRhdGEtPnN2Y19yZXNldF9ncGlvLAorCQkJIWFyY2hlX3BkYXRhLT5pc19yZXNldF9hY3RfaGkpOworCisJYXJjaGVfcGxhdGZvcm1fc2V0X3N0YXRlKGFyY2hlX3BkYXRhLCBBUkNIRV9QTEFURk9STV9TVEFURV9BQ1RJVkUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXF1aXJlcyBhcmNoZV9wZGF0YS0+cGxhdGZvcm1fc3RhdGVfbXV0ZXggdG8gYmUgaGVsZAorICovCitzdGF0aWMgaW50IGFyY2hlX3BsYXRmb3JtX2Z3X2ZsYXNoaW5nX3NlcShzdHJ1Y3QgYXJjaGVfcGxhdGZvcm1fZHJ2ZGF0YSAqYXJjaGVfcGRhdGEpCit7CisJaW50IHJldDsKKworCWlmIChhcmNoZV9wZGF0YS0+c3RhdGUgPT0gQVJDSEVfUExBVEZPUk1fU1RBVEVfRldfRkxBU0hJTkcpCisJCXJldHVybiAwOworCisJZGV2X2luZm8oYXJjaGVfcGRhdGEtPmRldiwgIlN3aXRjaGluZyB0byBGVyBmbGFzaGluZyBzdGF0ZVxuIik7CisKKwlzdmNfcmVzZXRfb25vZmYoYXJjaGVfcGRhdGEtPnN2Y19yZXNldF9ncGlvLAorCQkJYXJjaGVfcGRhdGEtPmlzX3Jlc2V0X2FjdF9oaSk7CisKKwlncGlvX3NldF92YWx1ZShhcmNoZV9wZGF0YS0+c3ZjX3N5c2Jvb3RfZ3BpbywgMSk7CisKKwl1c2xlZXBfcmFuZ2UoMTAwLCAyMDApOworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGFyY2hlX3BkYXRhLT5zdmNfcmVmX2Nsayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGFyY2hlX3BkYXRhLT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIHN2Y19yZWZfY2xrOiAlZFxuIiwKKwkJCQlyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXN2Y19yZXNldF9vbm9mZihhcmNoZV9wZGF0YS0+c3ZjX3Jlc2V0X2dwaW8sCisJCQkhYXJjaGVfcGRhdGEtPmlzX3Jlc2V0X2FjdF9oaSk7CisKKwlhcmNoZV9wbGF0Zm9ybV9zZXRfc3RhdGUoYXJjaGVfcGRhdGEsIEFSQ0hFX1BMQVRGT1JNX1NUQVRFX0ZXX0ZMQVNISU5HKTsKKworCXJldHVybiAwOworfQorCisvKgorICogUmVxdWlyZXMgYXJjaGVfcGRhdGEtPnBsYXRmb3JtX3N0YXRlX211dGV4IHRvIGJlIGhlbGQKKyAqLworc3RhdGljIHZvaWQgYXJjaGVfcGxhdGZvcm1fcG93ZXJvZmZfc2VxKHN0cnVjdCBhcmNoZV9wbGF0Zm9ybV9kcnZkYXRhICphcmNoZV9wZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGFyY2hlX3BkYXRhLT5zdGF0ZSA9PSBBUkNIRV9QTEFURk9STV9TVEFURV9PRkYpCisJCXJldHVybjsKKworCS8qIElmIGluIGZ3X2ZsYXNoaW5nIG1vZGUsIHRoZW4gbm8gbmVlZCB0byByZXBlYXRlIHRoaW5ncyBhZ2FpbiAqLworCWlmIChhcmNoZV9wZGF0YS0+c3RhdGUgIT0gQVJDSEVfUExBVEZPUk1fU1RBVEVfRldfRkxBU0hJTkcpIHsKKwkJZGlzYWJsZV9pcnEoYXJjaGVfcGRhdGEtPndha2VfZGV0ZWN0X2lycSk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFyY2hlX3BkYXRhLT53YWtlX2xvY2ssIGZsYWdzKTsKKwkJYXJjaGVfcGxhdGZvcm1fc2V0X3dha2VfZGV0ZWN0X3N0YXRlKGFyY2hlX3BkYXRhLAorCQkJCQkJICAgICBXRF9TVEFURV9JRExFKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXJjaGVfcGRhdGEtPndha2VfbG9jaywgZmxhZ3MpOworCX0KKworCWNsa19kaXNhYmxlX3VucHJlcGFyZShhcmNoZV9wZGF0YS0+c3ZjX3JlZl9jbGspOworCisJLyogQXMgcGFydCBvZiBleGl0LCBwdXQgQVBCIGJhY2sgaW4gcmVzZXQgc3RhdGUgKi8KKwlzdmNfcmVzZXRfb25vZmYoYXJjaGVfcGRhdGEtPnN2Y19yZXNldF9ncGlvLAorCQkJYXJjaGVfcGRhdGEtPmlzX3Jlc2V0X2FjdF9oaSk7CisKKwlhcmNoZV9wbGF0Zm9ybV9zZXRfc3RhdGUoYXJjaGVfcGRhdGEsIEFSQ0hFX1BMQVRGT1JNX1NUQVRFX09GRik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0YXRlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgYXJjaGVfcGxhdGZvcm1fZHJ2ZGF0YSAqYXJjaGVfcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworcmV0cnk6CisJbXV0ZXhfbG9jaygmYXJjaGVfcGRhdGEtPnBsYXRmb3JtX3N0YXRlX211dGV4KTsKKwlpZiAoYXJjaGVfcGRhdGEtPnN0YXRlID09IEFSQ0hFX1BMQVRGT1JNX1NUQVRFX1RJTUVfU1lOQykgeworCQltdXRleF91bmxvY2soJmFyY2hlX3BkYXRhLT5wbGF0Zm9ybV9zdGF0ZV9tdXRleCk7CisJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgKKwkJCWFyY2hlX3BkYXRhLT53cSwKKwkJCWFyY2hlX3BkYXRhLT5zdGF0ZSAhPSBBUkNIRV9QTEFURk9STV9TVEFURV9USU1FX1NZTkMpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJZ290byByZXRyeTsKKwl9CisKKwlpZiAoc3lzZnNfc3RyZXEoYnVmLCAib2ZmIikpIHsKKwkJaWYgKGFyY2hlX3BkYXRhLT5zdGF0ZSA9PSBBUkNIRV9QTEFURk9STV9TVEFURV9PRkYpCisJCQlnb3RvIGV4aXQ7CisKKwkJLyogIElmIFNWQyBnb2VzIGRvd24sIGJyaW5nIGRvd24gQVBCJ3MgYXMgd2VsbCAqLworCQlkZXZpY2VfZm9yX2VhY2hfY2hpbGQoYXJjaGVfcGRhdGEtPmRldiwgTlVMTCwgYXBiX3Bvd2Vyb2ZmKTsKKworCQlhcmNoZV9wbGF0Zm9ybV9wb3dlcm9mZl9zZXEoYXJjaGVfcGRhdGEpOworCisJfSBlbHNlIGlmIChzeXNmc19zdHJlcShidWYsICJhY3RpdmUiKSkgeworCQlpZiAoYXJjaGVfcGRhdGEtPnN0YXRlID09IEFSQ0hFX1BMQVRGT1JNX1NUQVRFX0FDVElWRSkKKwkJCWdvdG8gZXhpdDsKKworCQkvKiBGaXJzdCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBwb3dlciBvZmYgZXZlcnl0aGluZworCQkgKiBhbmQgdGhlbiBhY3RpdmF0ZSBiYWNrIGFnYWluICovCisJCWRldmljZV9mb3JfZWFjaF9jaGlsZChhcmNoZV9wZGF0YS0+ZGV2LCBOVUxMLCBhcGJfcG93ZXJvZmYpOworCQlhcmNoZV9wbGF0Zm9ybV9wb3dlcm9mZl9zZXEoYXJjaGVfcGRhdGEpOworCisJCWFyY2hlX3BsYXRmb3JtX3dkX2lycV9lbihhcmNoZV9wZGF0YSk7CisJCXJldCA9IGFyY2hlX3BsYXRmb3JtX2NvbGRib290X3NlcShhcmNoZV9wZGF0YSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGV4aXQ7CisKKwl9IGVsc2UgaWYgKHN5c2ZzX3N0cmVxKGJ1ZiwgInN0YW5kYnkiKSkgeworCQlpZiAoYXJjaGVfcGRhdGEtPnN0YXRlID09IEFSQ0hFX1BMQVRGT1JNX1NUQVRFX1NUQU5EQlkpCisJCQlnb3RvIGV4aXQ7CisKKwkJZGV2X3dhcm4oYXJjaGVfcGRhdGEtPmRldiwgInN0YW5kYnkgc3RhdGUgbm90IHN1cHBvcnRlZFxuIik7CisJfSBlbHNlIGlmIChzeXNmc19zdHJlcShidWYsICJmd19mbGFzaGluZyIpKSB7CisJCWlmIChhcmNoZV9wZGF0YS0+c3RhdGUgPT0gQVJDSEVfUExBVEZPUk1fU1RBVEVfRldfRkxBU0hJTkcpCisJCQlnb3RvIGV4aXQ7CisKKwkJLyoKKwkJICogSGVyZSB3ZSBvbmx5IGNvbnRyb2wgU1ZDLgorCQkgKgorCQkgKiBJbiBjYXNlIG9mIEZXX0ZMQVNISU5HIG1vZGUgd2UgZG8gbm90IHdhbnQgdG8gY29udHJvbAorCQkgKiBBUEJzLCBhcyBpbiBjYXNlIG9mIFYyLCBTUEkgYnVzIGlzIHNoYXJlZCBiZXR3ZWVuIGJvdGgKKwkJICogdGhlIEFQQnMuIFNvIGxldCB1c2VyIGNob3NlIHdoaWNoIEFQQiBoZSB3YW50cyB0byBmbGFzaC4KKwkJICovCisJCWFyY2hlX3BsYXRmb3JtX3Bvd2Vyb2ZmX3NlcShhcmNoZV9wZGF0YSk7CisKKwkJcmV0ID0gYXJjaGVfcGxhdGZvcm1fZndfZmxhc2hpbmdfc2VxKGFyY2hlX3BkYXRhKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXhpdDsKKwl9IGVsc2UgeworCQlkZXZfZXJyKGFyY2hlX3BkYXRhLT5kZXYsICJ1bmtub3duIHN0YXRlXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKK2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZhcmNoZV9wZGF0YS0+cGxhdGZvcm1fc3RhdGVfbXV0ZXgpOworCXJldHVybiByZXQgPyByZXQgOiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc3RhdGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGFyY2hlX3BsYXRmb3JtX2RydmRhdGEgKmFyY2hlX3BkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlzd2l0Y2ggKGFyY2hlX3BkYXRhLT5zdGF0ZSkgeworCWNhc2UgQVJDSEVfUExBVEZPUk1fU1RBVEVfT0ZGOgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJvZmZcbiIpOworCWNhc2UgQVJDSEVfUExBVEZPUk1fU1RBVEVfQUNUSVZFOgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJhY3RpdmVcbiIpOworCWNhc2UgQVJDSEVfUExBVEZPUk1fU1RBVEVfU1RBTkRCWToKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAic3RhbmRieVxuIik7CisJY2FzZSBBUkNIRV9QTEFURk9STV9TVEFURV9GV19GTEFTSElORzoKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiZndfZmxhc2hpbmdcbiIpOworCWNhc2UgQVJDSEVfUExBVEZPUk1fU1RBVEVfVElNRV9TWU5DOgorCQlyZXR1cm4gc3ByaW50ZihidWYsICJ0aW1lX3N5bmNcbiIpOworCWRlZmF1bHQ6CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgInVua25vd24gc3RhdGVcbiIpOworCX0KK30KKworc3RhdGljIERFVklDRV9BVFRSX1JXKHN0YXRlKTsKKworc3RhdGljIGludCBhcmNoZV9wbGF0Zm9ybV9wbV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5vdGlmaWVyLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgcG1fZXZlbnQsIHZvaWQgKnVudXNlZCkKK3sKKwlzdHJ1Y3QgYXJjaGVfcGxhdGZvcm1fZHJ2ZGF0YSAqYXJjaGVfcGRhdGEgPQorCQljb250YWluZXJfb2Yobm90aWZpZXIsIHN0cnVjdCBhcmNoZV9wbGF0Zm9ybV9kcnZkYXRhLAorCQkJICAgICBwbV9ub3RpZmllcik7CisJaW50IHJldCA9IE5PVElGWV9ET05FOworCisJbXV0ZXhfbG9jaygmYXJjaGVfcGRhdGEtPnBsYXRmb3JtX3N0YXRlX211dGV4KTsKKwlzd2l0Y2ggKHBtX2V2ZW50KSB7CisJY2FzZSBQTV9TVVNQRU5EX1BSRVBBUkU6CisJCWlmIChhcmNoZV9wZGF0YS0+c3RhdGUgIT0gQVJDSEVfUExBVEZPUk1fU1RBVEVfQUNUSVZFKSB7CisJCQlyZXQgPSBOT1RJRllfU1RPUDsKKwkJCWJyZWFrOworCQl9CisJCWRldmljZV9mb3JfZWFjaF9jaGlsZChhcmNoZV9wZGF0YS0+ZGV2LCBOVUxMLCBhcGJfcG93ZXJvZmYpOworCQlhcmNoZV9wbGF0Zm9ybV9wb3dlcm9mZl9zZXEoYXJjaGVfcGRhdGEpOworCQlicmVhazsKKwljYXNlIFBNX1BPU1RfU1VTUEVORDoKKwkJaWYgKGFyY2hlX3BkYXRhLT5zdGF0ZSAhPSBBUkNIRV9QTEFURk9STV9TVEFURV9PRkYpCisJCQlicmVhazsKKworCQlhcmNoZV9wbGF0Zm9ybV93ZF9pcnFfZW4oYXJjaGVfcGRhdGEpOworCQlhcmNoZV9wbGF0Zm9ybV9jb2xkYm9vdF9zZXEoYXJjaGVfcGRhdGEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJbXV0ZXhfdW5sb2NrKCZhcmNoZV9wZGF0YS0+cGxhdGZvcm1fc3RhdGVfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhcmNoZV9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhcmNoZV9wbGF0Zm9ybV9kcnZkYXRhICphcmNoZV9wZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CisJaW50IHJldDsKKworCWFyY2hlX3BkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqYXJjaGVfcGRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFyY2hlX3BkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIHNldHVwIHN2YyByZXNldCBncGlvICovCisJYXJjaGVfcGRhdGEtPmlzX3Jlc2V0X2FjdF9oaSA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwKKwkJCQkJInN2YyxyZXNldC1hY3RpdmUtaGlnaCIpOworCWFyY2hlX3BkYXRhLT5zdmNfcmVzZXRfZ3BpbyA9IG9mX2dldF9uYW1lZF9ncGlvKG5wLCAic3ZjLHJlc2V0LWdwaW8iLCAwKTsKKwlpZiAoYXJjaGVfcGRhdGEtPnN2Y19yZXNldF9ncGlvIDwgMCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgcmVzZXQtZ3Bpb1xuIik7CisJCXJldHVybiBhcmNoZV9wZGF0YS0+c3ZjX3Jlc2V0X2dwaW87CisJfQorCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0KGRldiwgYXJjaGVfcGRhdGEtPnN2Y19yZXNldF9ncGlvLCAic3ZjLXJlc2V0Iik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZXF1ZXN0IHN2Yy1yZXNldCBncGlvOiVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoYXJjaGVfcGRhdGEtPnN2Y19yZXNldF9ncGlvLAorCQkJCQlhcmNoZV9wZGF0YS0+aXNfcmVzZXRfYWN0X2hpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHNldCBzdmMtcmVzZXQgZ3BpbyBkaXI6JWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCWFyY2hlX3BsYXRmb3JtX3NldF9zdGF0ZShhcmNoZV9wZGF0YSwgQVJDSEVfUExBVEZPUk1fU1RBVEVfT0ZGKTsKKworCWFyY2hlX3BkYXRhLT5zdmNfc3lzYm9vdF9ncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW8obnAsCisJCQkJCSJzdmMsc3lzYm9vdC1ncGlvIiwgMCk7CisJaWYgKGFyY2hlX3BkYXRhLT5zdmNfc3lzYm9vdF9ncGlvIDwgMCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgc3lzYm9vdCBncGlvXG4iKTsKKwkJcmV0dXJuIGFyY2hlX3BkYXRhLT5zdmNfc3lzYm9vdF9ncGlvOworCX0KKwlyZXQgPSBkZXZtX2dwaW9fcmVxdWVzdChkZXYsIGFyY2hlX3BkYXRhLT5zdmNfc3lzYm9vdF9ncGlvLCAic3lzYm9vdDAiKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3Qgc3lzYm9vdDAgZ3BpbzolZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGFyY2hlX3BkYXRhLT5zdmNfc3lzYm9vdF9ncGlvLCAwKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHNldCBzdmMtcmVzZXQgZ3BpbyBkaXI6JWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogc2V0dXAgdGhlIGNsb2NrIHJlcXVlc3QgZ3BpbyBmaXJzdCAqLworCWFyY2hlX3BkYXRhLT5zdmNfcmVmY2xrX3JlcSA9IG9mX2dldF9uYW1lZF9ncGlvKG5wLAorCQkJCQkic3ZjLHJlZmNsay1yZXEtZ3BpbyIsIDApOworCWlmIChhcmNoZV9wZGF0YS0+c3ZjX3JlZmNsa19yZXEgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBzdmMgY2xvY2stcmVxIGdwaW9cbiIpOworCQlyZXR1cm4gYXJjaGVfcGRhdGEtPnN2Y19yZWZjbGtfcmVxOworCX0KKwlyZXQgPSBkZXZtX2dwaW9fcmVxdWVzdChkZXYsIGFyY2hlX3BkYXRhLT5zdmNfcmVmY2xrX3JlcSwgInN2Yy1jbGstcmVxIik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZXF1ZXN0IHN2Yy1jbGstcmVxIGdwaW86ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSBncGlvX2RpcmVjdGlvbl9pbnB1dChhcmNoZV9wZGF0YS0+c3ZjX3JlZmNsa19yZXEpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gc2V0IHN2Yy1jbGstcmVxIGdwaW8gZGlyIDolZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBzZXR1cCByZWZjbGsyIHRvIGZvbGxvdyB0aGUgcGluICovCisJYXJjaGVfcGRhdGEtPnN2Y19yZWZfY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgInN2Y19yZWZfY2xrIik7CisJaWYgKElTX0VSUihhcmNoZV9wZGF0YS0+c3ZjX3JlZl9jbGspKSB7CisJCXJldCA9IFBUUl9FUlIoYXJjaGVfcGRhdGEtPnN2Y19yZWZfY2xrKTsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IHN2Y19yZWZfY2xrOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBhcmNoZV9wZGF0YSk7CisKKwlhcmNoZV9wZGF0YS0+bnVtX2FwYnMgPSBvZl9nZXRfY2hpbGRfY291bnQobnApOworCWRldl9kYmcoZGV2LCAiTnVtYmVyIG9mIEFQQidzIGF2YWlsYWJsZSAtICVkXG4iLCBhcmNoZV9wZGF0YS0+bnVtX2FwYnMpOworCisJYXJjaGVfcGRhdGEtPndha2VfZGV0ZWN0X2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhucCwgInN2Yyx3YWtlLWRldGVjdC1ncGlvIiwgMCk7CisJaWYgKGFyY2hlX3BkYXRhLT53YWtlX2RldGVjdF9ncGlvIDwgMCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgd2FrZSBkZXRlY3QgZ3Bpb1xuIik7CisJCXJldHVybiBhcmNoZV9wZGF0YS0+d2FrZV9kZXRlY3RfZ3BpbzsKKwl9CisKKwlyZXQgPSBkZXZtX2dwaW9fcmVxdWVzdChkZXYsIGFyY2hlX3BkYXRhLT53YWtlX2RldGVjdF9ncGlvLCAid2FrZSBkZXRlY3QiKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHJlcXVlc3Rpbmcgd2FrZV9kZXRlY3QgZ3BpbyAlZFxuIiwKKwkJCQlhcmNoZV9wZGF0YS0+d2FrZV9kZXRlY3RfZ3Bpbyk7CisJCXJldHVybiByZXQ7CisJfQorCisJYXJjaGVfcGxhdGZvcm1fc2V0X3dha2VfZGV0ZWN0X3N0YXRlKGFyY2hlX3BkYXRhLCBXRF9TVEFURV9JRExFKTsKKworCWFyY2hlX3BkYXRhLT5kZXYgPSAmcGRldi0+ZGV2OworCisJc3Bpbl9sb2NrX2luaXQoJmFyY2hlX3BkYXRhLT53YWtlX2xvY2spOworCW11dGV4X2luaXQoJmFyY2hlX3BkYXRhLT5wbGF0Zm9ybV9zdGF0ZV9tdXRleCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYXJjaGVfcGRhdGEtPndxKTsKKwlhcmNoZV9wZGF0YS0+d2FrZV9kZXRlY3RfaXJxID0KKwkJZ3Bpb190b19pcnEoYXJjaGVfcGRhdGEtPndha2VfZGV0ZWN0X2dwaW8pOworCisJcmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycShkZXYsIGFyY2hlX3BkYXRhLT53YWtlX2RldGVjdF9pcnEsCisJCQlhcmNoZV9wbGF0Zm9ybV93ZF9pcnEsCisJCQlhcmNoZV9wbGF0Zm9ybV93ZF9pcnFfdGhyZWFkLAorCQkJSVJRRl9UUklHR0VSX0ZBTExJTkcgfCBJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9PTkVTSE9ULAorCQkJZGV2X25hbWUoZGV2KSwgYXJjaGVfcGRhdGEpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVxdWVzdCB3YWtlIGRldGVjdCBJUlEgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCWRpc2FibGVfaXJxKGFyY2hlX3BkYXRhLT53YWtlX2RldGVjdF9pcnEpOworCisJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3N0YXRlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBzdGF0ZSBmaWxlIGluIHN5c2ZzXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBvZl9wbGF0Zm9ybV9wb3B1bGF0ZShucCwgTlVMTCwgTlVMTCwgZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHBvcHVsYXRlIGNoaWxkIG5vZGVzICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9kZXZpY2VfcmVtb3ZlOworCX0KKworCWFyY2hlX3BkYXRhLT5wbV9ub3RpZmllci5ub3RpZmllcl9jYWxsID0gYXJjaGVfcGxhdGZvcm1fcG1fbm90aWZpZXI7CisJcmV0ID0gcmVnaXN0ZXJfcG1fbm90aWZpZXIoJmFyY2hlX3BkYXRhLT5wbV9ub3RpZmllcik7CisKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIHBtIG5vdGlmaWVyICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9kZXZpY2VfcmVtb3ZlOworCX0KKworCS8qIFJlZ2lzdGVyIGNhbGxiYWNrIHBvaW50ZXIgKi8KKwlhcmNoZV9wbGF0Zm9ybV9jaGFuZ2Vfc3RhdGVfY2IgPSBhcmNoZV9wbGF0Zm9ybV9jaGFuZ2Vfc3RhdGU7CisKKwkvKiBFeHBsaWNpdGx5IHBvd2VyIG9mZiBpZiByZXF1ZXN0ZWQgKi8KKwlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfYm9vbChwZGV2LT5kZXYub2Zfbm9kZSwgImFyY2hlLGluaXQtb2ZmIikpIHsKKwkJbXV0ZXhfbG9jaygmYXJjaGVfcGRhdGEtPnBsYXRmb3JtX3N0YXRlX211dGV4KTsKKwkJcmV0ID0gYXJjaGVfcGxhdGZvcm1fY29sZGJvb3Rfc2VxKGFyY2hlX3BkYXRhKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gY29sZCBib290IHN2YyAlZFxuIiwgcmV0KTsKKwkJCWdvdG8gZXJyX2NvbGRib290OworCQl9CisJCWFyY2hlX3BsYXRmb3JtX3dkX2lycV9lbihhcmNoZV9wZGF0YSk7CisJCW11dGV4X3VubG9jaygmYXJjaGVfcGRhdGEtPnBsYXRmb3JtX3N0YXRlX211dGV4KTsKKwl9CisKKwlkZXZfaW5mbyhkZXYsICJEZXZpY2UgcmVnaXN0ZXJlZCBzdWNjZXNzZnVsbHlcbiIpOworCXJldHVybiAwOworCitlcnJfY29sZGJvb3Q6CisJbXV0ZXhfdW5sb2NrKCZhcmNoZV9wZGF0YS0+cGxhdGZvcm1fc3RhdGVfbXV0ZXgpOworZXJyX2RldmljZV9yZW1vdmU6CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9zdGF0ZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhcmNoZV9yZW1vdmVfY2hpbGQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICp1bnVzZWQpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcmNoZV9wbGF0Zm9ybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYXJjaGVfcGxhdGZvcm1fZHJ2ZGF0YSAqYXJjaGVfcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXVucmVnaXN0ZXJfcG1fbm90aWZpZXIoJmFyY2hlX3BkYXRhLT5wbV9ub3RpZmllcik7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9zdGF0ZSk7CisJZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKCZwZGV2LT5kZXYsIE5VTEwsIGFyY2hlX3JlbW92ZV9jaGlsZCk7CisJYXJjaGVfcGxhdGZvcm1fcG93ZXJvZmZfc2VxKGFyY2hlX3BkYXRhKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCWlmICh1c2IzNjEzX2h1Yl9tb2RlX2N0cmwoZmFsc2UpKQorCQlkZXZfd2FybihhcmNoZV9wZGF0YS0+ZGV2LCAiZmFpbGVkIHRvIGNvbnRyb2wgaHViIGRldmljZVxuIik7CisJCS8qIFRPRE86IFNob3VsZCB3ZSBkbyBhbnl0aGluZyBtb3JlIGhlcmUgPz8gKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcmNoZV9wbGF0Zm9ybV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwkvKgorCSAqIElmIHRpbWluZyBwcm9maWxlIHByZW1pdHMsIHdlIG1heSBzaHV0ZG93biBicmlkZ2UKKwkgKiBjb21wbGV0ZWx5CisJICoKKwkgKiBUT0RPOiBzZXF1ZW5jZSA/PworCSAqCisJICogQWxzbywgbmVlZCB0byBtYWtlIHN1cmUgd2UgbWVldCBwcmVjb25kaXRpb24gZm9yIHVuaXBybyBzdXNwZW5kCisJICogUHJlY29uZGl0aW9uOiBEZWZpbml0aW9uID8/PworCSAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFyY2hlX3BsYXRmb3JtX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJLyoKKwkgKiBBdGxlYXN0IGZvciBFUzIgd2UgaGF2ZSB0byBtZWV0IHRoZSBkZWxheSByZXF1aXJlbWVudCBiZXR3ZWVuCisJICogdW5pcHJvIHN3aXRjaCBhbmQgQVAgYnJpZGdlIGluaXQsIGRlcGVuZGluZyBvbiB3aGV0aGVyIGJyaWRnZSBpcyBpbgorCSAqIE9GRiBzdGF0ZSBvciBzdGFuZGJ5IHN0YXRlLgorCSAqCisJICogQmFzZWQgb24gd2hldGhlciBicmlkZ2UgaXMgaW4gc3RhbmRieSBvciBPRkYgc3RhdGUgd2UgbWF5IGhhdmUgdG8KKwkgKiBhc3NlcnQgbXVsdGlwbGUgc2lnbmFscy4gUGxlYXNlIHJlZmVyIHRvIFdETSBzcGVjLCBmb3IgbW9yZSBpbmZvLgorCSAqCisJICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFyY2hlX3BsYXRmb3JtX3NodXRkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFyY2hlX3BsYXRmb3JtX2RydmRhdGEgKmFyY2hlX3BkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlhcmNoZV9wbGF0Zm9ybV9wb3dlcm9mZl9zZXEoYXJjaGVfcGRhdGEpOworCisJdXNiMzYxM19odWJfbW9kZV9jdHJsKGZhbHNlKTsKK30KKworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGFyY2hlX3BsYXRmb3JtX3BtX29wcywKKwkJCWFyY2hlX3BsYXRmb3JtX3N1c3BlbmQsCisJCQlhcmNoZV9wbGF0Zm9ybV9yZXN1bWUpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhcmNoZV9wbGF0Zm9ybV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiZ29vZ2xlLGFyY2hlLXBsYXRmb3JtIiwgfSwgLyogVXNlIFBJRC9WSUQgb2YgU1ZDIGRldmljZSAqLworCXsgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFyY2hlX2NvbWJpbmVkX2lkW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJnb29nbGUsYXJjaGUtcGxhdGZvcm0iLCB9LCAvKiBVc2UgUElEL1ZJRCBvZiBTVkMgZGV2aWNlICovCisJeyAuY29tcGF0aWJsZSA9ICJ1c2JmZmZmLDIiLCB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBhcmNoZV9jb21iaW5lZF9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFyY2hlX3BsYXRmb3JtX2RldmljZV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGFyY2hlX3BsYXRmb3JtX3Byb2JlLAorCS5yZW1vdmUJCT0gYXJjaGVfcGxhdGZvcm1fcmVtb3ZlLAorCS5zaHV0ZG93bgk9IGFyY2hlX3BsYXRmb3JtX3NodXRkb3duLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJhcmNoZS1wbGF0Zm9ybS1jdHJsIiwKKwkJLnBtCT0gJmFyY2hlX3BsYXRmb3JtX3BtX29wcywKKwkJLm9mX21hdGNoX3RhYmxlID0gYXJjaGVfcGxhdGZvcm1fb2ZfbWF0Y2gsCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgYXJjaGVfaW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFyY2hlX3BsYXRmb3JtX2RldmljZV9kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR2YWwgPSBhcmNoZV9hcGJfaW5pdCgpOworCWlmIChyZXR2YWwpCisJCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhcmNoZV9wbGF0Zm9ybV9kZXZpY2VfZHJpdmVyKTsKKworCXJldHVybiByZXR2YWw7Cit9Cittb2R1bGVfaW5pdChhcmNoZV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGFyY2hlX2V4aXQodm9pZCkKK3sKKwlhcmNoZV9hcGJfZXhpdCgpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhcmNoZV9wbGF0Zm9ybV9kZXZpY2VfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFyY2hlX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQVVUSE9SKCJWYWliaGF2IEhpcmVtYXRoIDx2YWliaGF2LmhpcmVtYXRoQGxpbmFyby5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFyY2hlIFBsYXRmb3JtIERyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXJjaGVfcGxhdGZvcm0uaCBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2FyY2hlX3BsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQxMjM0NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2FyY2hlX3BsYXRmb3JtLmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIEFyY2hlIFBsYXRmb3JtIGRyaXZlciB0byBlbmFibGUgVW5pcHJvIGxpbmsuCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpZm5kZWYgX19BUkNIRV9QTEFURk9STV9ICisjZGVmaW5lIF9fQVJDSEVfUExBVEZPUk1fSAorCisjaW5jbHVkZSAidGltZXN5bmMuaCIKKworZW51bSBhcmNoZV9wbGF0Zm9ybV9zdGF0ZSB7CisJQVJDSEVfUExBVEZPUk1fU1RBVEVfT0ZGLAorCUFSQ0hFX1BMQVRGT1JNX1NUQVRFX0FDVElWRSwKKwlBUkNIRV9QTEFURk9STV9TVEFURV9TVEFOREJZLAorCUFSQ0hFX1BMQVRGT1JNX1NUQVRFX0ZXX0ZMQVNISU5HLAorCUFSQ0hFX1BMQVRGT1JNX1NUQVRFX1RJTUVfU1lOQywKK307CisKK2ludCBhcmNoZV9wbGF0Zm9ybV9jaGFuZ2Vfc3RhdGUoZW51bSBhcmNoZV9wbGF0Zm9ybV9zdGF0ZSBzdGF0ZSwKKwkJCQlzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICpwZGF0YSk7CisKK2V4dGVybiBpbnQgKCphcmNoZV9wbGF0Zm9ybV9jaGFuZ2Vfc3RhdGVfY2IpKGVudW0gYXJjaGVfcGxhdGZvcm1fc3RhdGUgc3RhdGUsCisJCQkJCSAgICAgc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqcGRhdGEpOworaW50IF9faW5pdCBhcmNoZV9hcGJfaW5pdCh2b2lkKTsKK3ZvaWQgX19leGl0IGFyY2hlX2FwYl9leGl0KHZvaWQpOworCisvKiBPcGVyYXRpb25hbCBzdGF0ZXMgZm9yIHRoZSBBUEIgZGV2aWNlICovCitpbnQgYXBiX2N0cmxfY29sZGJvb3Qoc3RydWN0IGRldmljZSAqZGV2KTsKK2ludCBhcGJfY3RybF9md19mbGFzaGluZyhzdHJ1Y3QgZGV2aWNlICpkZXYpOworaW50IGFwYl9jdHJsX3N0YW5kYnlfYm9vdChzdHJ1Y3QgZGV2aWNlICpkZXYpOwordm9pZCBhcGJfY3RybF9wb3dlcm9mZihzdHJ1Y3QgZGV2aWNlICpkZXYpOwordm9pZCBhcGJfYm9vdHJldF9hc3NlcnQoc3RydWN0IGRldmljZSAqZGV2KTsKK3ZvaWQgYXBiX2Jvb3RyZXRfZGVhc3NlcnQoc3RydWN0IGRldmljZSAqZGV2KTsKKworI2VuZGlmCS8qIF9fQVJDSEVfUExBVEZPUk1fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXJwYy5oIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXJwYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYmRkZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hcnBjLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAxNiBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0KGMpIDIwMTYgTGluYXJvIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMTYgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodChjKSAyMDE2IExpbmFybyBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gb3IgTGluYXJvIEx0ZC4gbm9yIHRoZSBuYW1lcyBvZgorICogICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgR09PR0xFIElOQy4gT1IKKyAqIExJTkFSTyBMVEQuIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX19BUlBDX0gKKyNkZWZpbmUgX19BUlBDX0gKKworLyogQVBCcmlkZ2VBIFJQQyAoQVJQQykgKi8KKworZW51bSBhcnBjX3Jlc3VsdCB7CisJQVJQQ19TVUNDRVNTCQk9IDB4MDAsCisJQVJQQ19OT19NRU1PUlkJCT0gMHgwMSwKKwlBUlBDX0lOVkFMSUQJCT0gMHgwMiwKKwlBUlBDX1RJTUVPVVQJCT0gMHgwMywKKwlBUlBDX1VOS05PV05fRVJST1IJPSAweGZmLAorfTsKKworc3RydWN0IGFycGNfcmVxdWVzdF9tZXNzYWdlIHsKKwlfX2xlMTYJaWQ7CQkvKiBSUEMgdW5pcXVlIGlkICovCisJX19sZTE2CXNpemU7CQkvKiBTaXplIGluIGJ5dGVzIG9mIGhlYWRlciArIHBheWxvYWQgKi8KKwlfX3U4CXR5cGU7CQkvKiBSUEMgdHlwZSAqLworCV9fdTgJZGF0YVswXTsJLyogQVJQQyBkYXRhICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXJwY19yZXNwb25zZV9tZXNzYWdlIHsKKwlfX2xlMTYJaWQ7CQkvKiBSUEMgdW5pcXVlIGlkICovCisJX191OAlyZXN1bHQ7CQkvKiBSZXN1bHQgb2YgUlBDICovCit9IF9fcGFja2VkOworCisKKy8qIEFSUEMgcmVxdWVzdHMgKi8KKyNkZWZpbmUgQVJQQ19UWVBFX0NQT1JUX0NPTk5FQ1RFRAkJMHgwMQorI2RlZmluZSBBUlBDX1RZUEVfQ1BPUlRfUVVJRVNDRQkJCTB4MDIKKyNkZWZpbmUgQVJQQ19UWVBFX0NQT1JUX0NMRUFSCQkJMHgwMworI2RlZmluZSBBUlBDX1RZUEVfQ1BPUlRfRkxVU0gJCQkweDA0CisjZGVmaW5lIEFSUENfVFlQRV9DUE9SVF9TSFVURE9XTgkJMHgwNQorCitzdHJ1Y3QgYXJwY19jcG9ydF9jb25uZWN0ZWRfcmVxIHsKKwlfX2xlMTYgY3BvcnRfaWQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXJwY19jcG9ydF9xdWllc2NlX3JlcSB7CisJX19sZTE2IGNwb3J0X2lkOworCV9fbGUxNiBwZWVyX3NwYWNlOworCV9fbGUxNiB0aW1lb3V0OworfSBfX3BhY2tlZDsKKworc3RydWN0IGFycGNfY3BvcnRfY2xlYXJfcmVxIHsKKwlfX2xlMTYgY3BvcnRfaWQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXJwY19jcG9ydF9mbHVzaF9yZXEgeworCV9fbGUxNiBjcG9ydF9pZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhcnBjX2Nwb3J0X3NodXRkb3duX3JlcSB7CisJX19sZTE2IGNwb3J0X2lkOworCV9fbGUxNiB0aW1lb3V0OworCV9fdTggcGhhc2U7Cit9IF9fcGFja2VkOworCisjZW5kaWYJLyogX19BUlBDX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX2FwYnJpZGdlYS5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fYXBicmlkZ2VhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI0MjUyZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX2FwYnJpZGdlYS5jCkBAIC0wLDAgKzEsMjA3IEBACisvKgorICogR3JleWJ1cyBBdWRpbyBEZXZpY2UgQ2xhc3MgUHJvdG9jb2wgaGVscGVycworICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYgR29vZ2xlIEluYy4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorI2luY2x1ZGUgImdyZXlidXNfcHJvdG9jb2xzLmgiCisjaW5jbHVkZSAiYXVkaW9fYXBicmlkZ2VhLmgiCisjaW5jbHVkZSAiYXVkaW9fY29kZWMuaCIKKworaW50IGdiX2F1ZGlvX2FwYnJpZGdlYV9zZXRfY29uZmlnKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCSAgX191MTYgaTJzX3BvcnQsIF9fdTMyIGZvcm1hdCwgX191MzIgcmF0ZSwKKwkJCQkgIF9fdTMyIG1jbGtfZnJlcSkKK3sKKwlzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX3NldF9jb25maWdfcmVxdWVzdCByZXE7CisKKwlyZXEuaGRyLnR5cGUgPSBBVURJT19BUEJSSURHRUFfVFlQRV9TRVRfQ09ORklHOworCXJlcS5oZHIuaTJzX3BvcnQgPSBjcHVfdG9fbGUxNihpMnNfcG9ydCk7CisJcmVxLmZvcm1hdCA9IGNwdV90b19sZTMyKGZvcm1hdCk7CisJcmVxLnJhdGUgPSBjcHVfdG9fbGUzMihyYXRlKTsKKwlyZXEubWNsa19mcmVxID0gY3B1X3RvX2xlMzIobWNsa19mcmVxKTsKKworCXJldHVybiBnYl9oZF9vdXRwdXQoY29ubmVjdGlvbi0+aGQsICZyZXEsIHNpemVvZihyZXEpLAorCQkJICAgIEdCX0FQQl9SRVFVRVNUX0FVRElPX0NPTlRST0wsIHRydWUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfYXVkaW9fYXBicmlkZ2VhX3NldF9jb25maWcpOworCitpbnQgZ2JfYXVkaW9fYXBicmlkZ2VhX3JlZ2lzdGVyX2Nwb3J0KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCSAgICAgIF9fdTE2IGkyc19wb3J0LCBfX3UxNiBjcG9ydGlkLAorCQkJCSAgICAgIF9fdTggZGlyZWN0aW9uKQoreworCXN0cnVjdCBhdWRpb19hcGJyaWRnZWFfcmVnaXN0ZXJfY3BvcnRfcmVxdWVzdCByZXE7CisJaW50IHJldDsKKworCXJlcS5oZHIudHlwZSA9IEFVRElPX0FQQlJJREdFQV9UWVBFX1JFR0lTVEVSX0NQT1JUOworCXJlcS5oZHIuaTJzX3BvcnQgPSBjcHVfdG9fbGUxNihpMnNfcG9ydCk7CisJcmVxLmNwb3J0ID0gY3B1X3RvX2xlMTYoY3BvcnRpZCk7CisJcmVxLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKKworCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoY29ubmVjdGlvbi0+YnVuZGxlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGdiX2hkX291dHB1dChjb25uZWN0aW9uLT5oZCwgJnJlcSwgc2l6ZW9mKHJlcSksCisJCQkgICAgR0JfQVBCX1JFUVVFU1RfQVVESU9fQ09OVFJPTCwgdHJ1ZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9hdWRpb19hcGJyaWRnZWFfcmVnaXN0ZXJfY3BvcnQpOworCitpbnQgZ2JfYXVkaW9fYXBicmlkZ2VhX3VucmVnaXN0ZXJfY3BvcnQoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCV9fdTE2IGkyc19wb3J0LCBfX3UxNiBjcG9ydGlkLAorCQkJCQlfX3U4IGRpcmVjdGlvbikKK3sKKwlzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX3VucmVnaXN0ZXJfY3BvcnRfcmVxdWVzdCByZXE7CisJaW50IHJldDsKKworCXJlcS5oZHIudHlwZSA9IEFVRElPX0FQQlJJREdFQV9UWVBFX1VOUkVHSVNURVJfQ1BPUlQ7CisJcmVxLmhkci5pMnNfcG9ydCA9IGNwdV90b19sZTE2KGkyc19wb3J0KTsKKwlyZXEuY3BvcnQgPSBjcHVfdG9fbGUxNihjcG9ydGlkKTsKKwlyZXEuZGlyZWN0aW9uID0gZGlyZWN0aW9uOworCisJcmV0ID0gZ2JfaGRfb3V0cHV0KGNvbm5lY3Rpb24tPmhkLCAmcmVxLCBzaXplb2YocmVxKSwKKwkJCSAgIEdCX0FQQl9SRVFVRVNUX0FVRElPX0NPTlRST0wsIHRydWUpOworCisJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoY29ubmVjdGlvbi0+YnVuZGxlKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9hdWRpb19hcGJyaWRnZWFfdW5yZWdpc3Rlcl9jcG9ydCk7CisKK2ludCBnYl9hdWRpb19hcGJyaWRnZWFfc2V0X3R4X2RhdGFfc2l6ZShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJX191MTYgaTJzX3BvcnQsIF9fdTE2IHNpemUpCit7CisJc3RydWN0IGF1ZGlvX2FwYnJpZGdlYV9zZXRfdHhfZGF0YV9zaXplX3JlcXVlc3QgcmVxOworCisJcmVxLmhkci50eXBlID0gQVVESU9fQVBCUklER0VBX1RZUEVfU0VUX1RYX0RBVEFfU0laRTsKKwlyZXEuaGRyLmkyc19wb3J0ID0gY3B1X3RvX2xlMTYoaTJzX3BvcnQpOworCXJlcS5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZSk7CisKKwlyZXR1cm4gZ2JfaGRfb3V0cHV0KGNvbm5lY3Rpb24tPmhkLCAmcmVxLCBzaXplb2YocmVxKSwKKwkJCSAgICBHQl9BUEJfUkVRVUVTVF9BVURJT19DT05UUk9MLCB0cnVlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2F1ZGlvX2FwYnJpZGdlYV9zZXRfdHhfZGF0YV9zaXplKTsKKworaW50IGdiX2F1ZGlvX2FwYnJpZGdlYV9wcmVwYXJlX3R4KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCSAgX191MTYgaTJzX3BvcnQpCit7CisJc3RydWN0IGF1ZGlvX2FwYnJpZGdlYV9wcmVwYXJlX3R4X3JlcXVlc3QgcmVxOworCisJcmVxLmhkci50eXBlID0gQVVESU9fQVBCUklER0VBX1RZUEVfUFJFUEFSRV9UWDsKKwlyZXEuaGRyLmkyc19wb3J0ID0gY3B1X3RvX2xlMTYoaTJzX3BvcnQpOworCisJcmV0dXJuIGdiX2hkX291dHB1dChjb25uZWN0aW9uLT5oZCwgJnJlcSwgc2l6ZW9mKHJlcSksCisJCQkgICAgR0JfQVBCX1JFUVVFU1RfQVVESU9fQ09OVFJPTCwgdHJ1ZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9hdWRpb19hcGJyaWRnZWFfcHJlcGFyZV90eCk7CisKK2ludCBnYl9hdWRpb19hcGJyaWRnZWFfc3RhcnRfdHgoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJX191MTYgaTJzX3BvcnQsIF9fdTY0IHRpbWVzdGFtcCkKK3sKKwlzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX3N0YXJ0X3R4X3JlcXVlc3QgcmVxOworCisJcmVxLmhkci50eXBlID0gQVVESU9fQVBCUklER0VBX1RZUEVfU1RBUlRfVFg7CisJcmVxLmhkci5pMnNfcG9ydCA9IGNwdV90b19sZTE2KGkyc19wb3J0KTsKKwlyZXEudGltZXN0YW1wID0gY3B1X3RvX2xlNjQodGltZXN0YW1wKTsKKworCXJldHVybiBnYl9oZF9vdXRwdXQoY29ubmVjdGlvbi0+aGQsICZyZXEsIHNpemVvZihyZXEpLAorCQkJICAgIEdCX0FQQl9SRVFVRVNUX0FVRElPX0NPTlRST0wsIHRydWUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfYXVkaW9fYXBicmlkZ2VhX3N0YXJ0X3R4KTsKKworaW50IGdiX2F1ZGlvX2FwYnJpZGdlYV9zdG9wX3R4KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBfX3UxNiBpMnNfcG9ydCkKK3sKKwlzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX3N0b3BfdHhfcmVxdWVzdCByZXE7CisKKwlyZXEuaGRyLnR5cGUgPSBBVURJT19BUEJSSURHRUFfVFlQRV9TVE9QX1RYOworCXJlcS5oZHIuaTJzX3BvcnQgPSBjcHVfdG9fbGUxNihpMnNfcG9ydCk7CisKKwlyZXR1cm4gZ2JfaGRfb3V0cHV0KGNvbm5lY3Rpb24tPmhkLCAmcmVxLCBzaXplb2YocmVxKSwKKwkJCSAgICBHQl9BUEJfUkVRVUVTVF9BVURJT19DT05UUk9MLCB0cnVlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2F1ZGlvX2FwYnJpZGdlYV9zdG9wX3R4KTsKKworaW50IGdiX2F1ZGlvX2FwYnJpZGdlYV9zaHV0ZG93bl90eChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkgICBfX3UxNiBpMnNfcG9ydCkKK3sKKwlzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX3NodXRkb3duX3R4X3JlcXVlc3QgcmVxOworCisJcmVxLmhkci50eXBlID0gQVVESU9fQVBCUklER0VBX1RZUEVfU0hVVERPV05fVFg7CisJcmVxLmhkci5pMnNfcG9ydCA9IGNwdV90b19sZTE2KGkyc19wb3J0KTsKKworCXJldHVybiBnYl9oZF9vdXRwdXQoY29ubmVjdGlvbi0+aGQsICZyZXEsIHNpemVvZihyZXEpLAorCQkJICAgIEdCX0FQQl9SRVFVRVNUX0FVRElPX0NPTlRST0wsIHRydWUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfYXVkaW9fYXBicmlkZ2VhX3NodXRkb3duX3R4KTsKKworaW50IGdiX2F1ZGlvX2FwYnJpZGdlYV9zZXRfcnhfZGF0YV9zaXplKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCQlfX3UxNiBpMnNfcG9ydCwgX191MTYgc2l6ZSkKK3sKKwlzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX3NldF9yeF9kYXRhX3NpemVfcmVxdWVzdCByZXE7CisKKwlyZXEuaGRyLnR5cGUgPSBBVURJT19BUEJSSURHRUFfVFlQRV9TRVRfUlhfREFUQV9TSVpFOworCXJlcS5oZHIuaTJzX3BvcnQgPSBjcHVfdG9fbGUxNihpMnNfcG9ydCk7CisJcmVxLnNpemUgPSBjcHVfdG9fbGUxNihzaXplKTsKKworCXJldHVybiBnYl9oZF9vdXRwdXQoY29ubmVjdGlvbi0+aGQsICZyZXEsIHNpemVvZihyZXEpLAorCQkJICAgIEdCX0FQQl9SRVFVRVNUX0FVRElPX0NPTlRST0wsIHRydWUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfYXVkaW9fYXBicmlkZ2VhX3NldF9yeF9kYXRhX3NpemUpOworCitpbnQgZ2JfYXVkaW9fYXBicmlkZ2VhX3ByZXBhcmVfcngoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICBfX3UxNiBpMnNfcG9ydCkKK3sKKwlzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX3ByZXBhcmVfcnhfcmVxdWVzdCByZXE7CisKKwlyZXEuaGRyLnR5cGUgPSBBVURJT19BUEJSSURHRUFfVFlQRV9QUkVQQVJFX1JYOworCXJlcS5oZHIuaTJzX3BvcnQgPSBjcHVfdG9fbGUxNihpMnNfcG9ydCk7CisKKwlyZXR1cm4gZ2JfaGRfb3V0cHV0KGNvbm5lY3Rpb24tPmhkLCAmcmVxLCBzaXplb2YocmVxKSwKKwkJCSAgICBHQl9BUEJfUkVRVUVTVF9BVURJT19DT05UUk9MLCB0cnVlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2F1ZGlvX2FwYnJpZGdlYV9wcmVwYXJlX3J4KTsKKworaW50IGdiX2F1ZGlvX2FwYnJpZGdlYV9zdGFydF9yeChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQlfX3UxNiBpMnNfcG9ydCkKK3sKKwlzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX3N0YXJ0X3J4X3JlcXVlc3QgcmVxOworCisJcmVxLmhkci50eXBlID0gQVVESU9fQVBCUklER0VBX1RZUEVfU1RBUlRfUlg7CisJcmVxLmhkci5pMnNfcG9ydCA9IGNwdV90b19sZTE2KGkyc19wb3J0KTsKKworCXJldHVybiBnYl9oZF9vdXRwdXQoY29ubmVjdGlvbi0+aGQsICZyZXEsIHNpemVvZihyZXEpLAorCQkJICAgIEdCX0FQQl9SRVFVRVNUX0FVRElPX0NPTlRST0wsIHRydWUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfYXVkaW9fYXBicmlkZ2VhX3N0YXJ0X3J4KTsKKworaW50IGdiX2F1ZGlvX2FwYnJpZGdlYV9zdG9wX3J4KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBfX3UxNiBpMnNfcG9ydCkKK3sKKwlzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX3N0b3BfcnhfcmVxdWVzdCByZXE7CisKKwlyZXEuaGRyLnR5cGUgPSBBVURJT19BUEJSSURHRUFfVFlQRV9TVE9QX1JYOworCXJlcS5oZHIuaTJzX3BvcnQgPSBjcHVfdG9fbGUxNihpMnNfcG9ydCk7CisKKwlyZXR1cm4gZ2JfaGRfb3V0cHV0KGNvbm5lY3Rpb24tPmhkLCAmcmVxLCBzaXplb2YocmVxKSwKKwkJCSAgICBHQl9BUEJfUkVRVUVTVF9BVURJT19DT05UUk9MLCB0cnVlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2F1ZGlvX2FwYnJpZGdlYV9zdG9wX3J4KTsKKworaW50IGdiX2F1ZGlvX2FwYnJpZGdlYV9zaHV0ZG93bl9yeChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkgICBfX3UxNiBpMnNfcG9ydCkKK3sKKwlzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX3NodXRkb3duX3J4X3JlcXVlc3QgcmVxOworCisJcmVxLmhkci50eXBlID0gQVVESU9fQVBCUklER0VBX1RZUEVfU0hVVERPV05fUlg7CisJcmVxLmhkci5pMnNfcG9ydCA9IGNwdV90b19sZTE2KGkyc19wb3J0KTsKKworCXJldHVybiBnYl9oZF9vdXRwdXQoY29ubmVjdGlvbi0+aGQsICZyZXEsIHNpemVvZihyZXEpLAorCQkJICAgIEdCX0FQQl9SRVFVRVNUX0FVRElPX0NPTlRST0wsIHRydWUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfYXVkaW9fYXBicmlkZ2VhX3NodXRkb3duX3J4KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJncmV5YnVzOmF1ZGlvLWFwYnJpZGdlYSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJHcmV5YnVzIFNwZWNpYWwgQVBCcmlkZ2VBIEF1ZGlvIFByb3RvY29sIGxpYnJhcnkiKTsKK01PRFVMRV9BVVRIT1IoIk1hcmsgR3JlZXIgPG1ncmVlckBhbmltYWxjcmVlay5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19hcGJyaWRnZWEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX2FwYnJpZGdlYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NGNiMDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19hcGJyaWRnZWEuaApAQCAtMCwwICsxLDE1NiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBHb29nbGUgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcworICogc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOworICogT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorICogT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgorICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKy8qCisgKiBUaGlzIGlzIGEgc3BlY2lhbCBwcm90b2NvbCBmb3IgY29uZmlndXJpbmcgY29tbXVuaWNhdGlvbiBvdmVyIHRoZQorICogSTJTIGJ1cyBiZXR3ZWVuIHRoZSBEU1Agb24gdGhlIE1TTTg5OTQgYW5kIEFQQnJpZGdlQS4gIFRoZXJlZm9yZSwKKyAqIHdlIGNhbiBwcmVkZWZpbmUgc2V2ZXJhbCBsb3ctbGV2ZWwgYXR0cmlidXRlcyBvZiB0aGUgY29tbXVuaWNhdGlvbgorICogYmVjYXVzZSB3ZSBrbm93IHRoYXQgdGhleSBhcmUgc3VwcG9ydGVkLiAgSW4gcGFydGljdWxhciwgdGhlIGZvbGxvd2luZworICogYXNzdW1wdGlvbnMgYXJlIG1hZGU6CisgKgktIHRoZXJlIGFyZSB0d28gY2hhbm5lbHMgKGkuZS4sIHN0ZXJlbykKKyAqCS0gdGhlIGxvdy1sZXZlbCBwcm90b2NvbCBpcyBJMlMgYXMgZGVmaW5lZCBieSBQaGlsaXBzL05YUAorICoJLSB0aGUgRFNQIG9uIHRoZSBNU004OTk0IGlzIHRoZSBjbG9jayBtYXN0ZXIgZm9yIE1DTEssIEJDTEssIGFuZCBXQ0xLCisgKgktIFdDTEsgY2hhbmdlcyBvbiB0aGUgZmFsbGluZyBlZGdlIG9mIEJDTEsKKyAqCS0gV0NMSyBsb3cgZm9yIGxlZnQgY2hhbm5lbDsgaGlnaCBmb3IgcmlnaHQgY2hhbm5lbAorICoJLSBUWCBkYXRhIGlzIHNlbnQgb24gdGhlIGZhbGxpbmcgZWRnZSBvZiBCQ0xLCisgKgktIFJYIGRhdGEgaXMgcmVjZWl2ZWQvbGF0Y2hlZCBvbiB0aGUgcmlzaW5nIGVkZ2Ugb2YgQkNMSworICovCisKKyNpZm5kZWYgX19BVURJT19BUEJSSURHRUFfSAorI2RlZmluZSBfX0FVRElPX0FQQlJJREdFQV9ICisKKyNkZWZpbmUgQVVESU9fQVBCUklER0VBX1RZUEVfU0VUX0NPTkZJRwkJCTB4MDEKKyNkZWZpbmUgQVVESU9fQVBCUklER0VBX1RZUEVfUkVHSVNURVJfQ1BPUlQJCTB4MDIKKyNkZWZpbmUgQVVESU9fQVBCUklER0VBX1RZUEVfVU5SRUdJU1RFUl9DUE9SVAkJMHgwMworI2RlZmluZSBBVURJT19BUEJSSURHRUFfVFlQRV9TRVRfVFhfREFUQV9TSVpFCQkweDA0CisJCQkJCQkJLyogMHgwNSB1bnVzZWQgKi8KKyNkZWZpbmUgQVVESU9fQVBCUklER0VBX1RZUEVfUFJFUEFSRV9UWAkJCTB4MDYKKyNkZWZpbmUgQVVESU9fQVBCUklER0VBX1RZUEVfU1RBUlRfVFgJCQkweDA3CisjZGVmaW5lIEFVRElPX0FQQlJJREdFQV9UWVBFX1NUT1BfVFgJCQkweDA4CisjZGVmaW5lIEFVRElPX0FQQlJJREdFQV9UWVBFX1NIVVRET1dOX1RYCQkweDA5CisjZGVmaW5lIEFVRElPX0FQQlJJREdFQV9UWVBFX1NFVF9SWF9EQVRBX1NJWkUJCTB4MGEKKwkJCQkJCQkvKiAweDBiIHVudXNlZCAqLworI2RlZmluZSBBVURJT19BUEJSSURHRUFfVFlQRV9QUkVQQVJFX1JYCQkJMHgwYworI2RlZmluZSBBVURJT19BUEJSSURHRUFfVFlQRV9TVEFSVF9SWAkJCTB4MGQKKyNkZWZpbmUgQVVESU9fQVBCUklER0VBX1RZUEVfU1RPUF9SWAkJCTB4MGUKKyNkZWZpbmUgQVVESU9fQVBCUklER0VBX1RZUEVfU0hVVERPV05fUlgJCTB4MGYKKworI2RlZmluZSBBVURJT19BUEJSSURHRUFfUENNX0ZNVF84CQkJQklUKDApCisjZGVmaW5lIEFVRElPX0FQQlJJREdFQV9QQ01fRk1UXzE2CQkJQklUKDEpCisjZGVmaW5lIEFVRElPX0FQQlJJREdFQV9QQ01fRk1UXzI0CQkJQklUKDIpCisjZGVmaW5lIEFVRElPX0FQQlJJREdFQV9QQ01fRk1UXzMyCQkJQklUKDMpCisjZGVmaW5lIEFVRElPX0FQQlJJREdFQV9QQ01fRk1UXzY0CQkJQklUKDQpCisKKyNkZWZpbmUgQVVESU9fQVBCUklER0VBX1BDTV9SQVRFXzU1MTIJCQlCSVQoMCkKKyNkZWZpbmUgQVVESU9fQVBCUklER0VBX1BDTV9SQVRFXzgwMDAJCQlCSVQoMSkKKyNkZWZpbmUgQVVESU9fQVBCUklER0VBX1BDTV9SQVRFXzExMDI1CQkJQklUKDIpCisjZGVmaW5lIEFVRElPX0FQQlJJREdFQV9QQ01fUkFURV8xNjAwMAkJCUJJVCgzKQorI2RlZmluZSBBVURJT19BUEJSSURHRUFfUENNX1JBVEVfMjIwNTAJCQlCSVQoNCkKKyNkZWZpbmUgQVVESU9fQVBCUklER0VBX1BDTV9SQVRFXzMyMDAwCQkJQklUKDUpCisjZGVmaW5lIEFVRElPX0FQQlJJREdFQV9QQ01fUkFURV80NDEwMAkJCUJJVCg2KQorI2RlZmluZSBBVURJT19BUEJSSURHRUFfUENNX1JBVEVfNDgwMDAJCQlCSVQoNykKKyNkZWZpbmUgQVVESU9fQVBCUklER0VBX1BDTV9SQVRFXzY0MDAwCQkJQklUKDgpCisjZGVmaW5lIEFVRElPX0FQQlJJREdFQV9QQ01fUkFURV84ODIwMAkJCUJJVCg5KQorI2RlZmluZSBBVURJT19BUEJSSURHRUFfUENNX1JBVEVfOTYwMDAJCQlCSVQoMTApCisjZGVmaW5lIEFVRElPX0FQQlJJREdFQV9QQ01fUkFURV8xNzY0MDAJCQlCSVQoMTEpCisjZGVmaW5lIEFVRElPX0FQQlJJREdFQV9QQ01fUkFURV8xOTIwMDAJCQlCSVQoMTIpCisKKyNkZWZpbmUgQVVESU9fQVBCUklER0VBX0RJUkVDVElPTl9UWAkJCUJJVCgwKQorI2RlZmluZSBBVURJT19BUEJSSURHRUFfRElSRUNUSU9OX1JYCQkJQklUKDEpCisKKy8qIFRoZSBJMlMgcG9ydCBpcyBwYXNzZWQgaW4gdGhlICdpbmRleCcgcGFyYW1ldGVyIG9mIHRoZSBVU0IgcmVxdWVzdCAqLworLyogVGhlIENQb3J0IGlzIHBhc3NlZCBpbiB0aGUgJ3ZhbHVlJyBwYXJhbWV0ZXIgb2YgdGhlIFVTQiByZXF1ZXN0ICovCisKK3N0cnVjdCBhdWRpb19hcGJyaWRnZWFfaGRyIHsKKwlfX3U4CXR5cGU7CisJX19sZTE2CWkyc19wb3J0OworCV9fdTgJZGF0YVswXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhdWRpb19hcGJyaWRnZWFfc2V0X2NvbmZpZ19yZXF1ZXN0IHsKKwlzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX2hkcgloZHI7CisJX19sZTMyCQkJCWZvcm1hdDsJLyogQVVESU9fQVBCUklER0VBX1BDTV9GTVRfKiAqLworCV9fbGUzMgkJCQlyYXRlOwkvKiBBVURJT19BUEJSSURHRUFfUENNX1JBVEVfKiAqLworCV9fbGUzMgkJCQltY2xrX2ZyZXE7IC8qIFhYWCBSZW1vdmU/ICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX3JlZ2lzdGVyX2Nwb3J0X3JlcXVlc3QgeworCXN0cnVjdCBhdWRpb19hcGJyaWRnZWFfaGRyCWhkcjsKKwlfX2xlMTYJCQkJY3BvcnQ7CisJX191OAkJCQlkaXJlY3Rpb247Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX3VucmVnaXN0ZXJfY3BvcnRfcmVxdWVzdCB7CisJc3RydWN0IGF1ZGlvX2FwYnJpZGdlYV9oZHIJaGRyOworCV9fbGUxNgkJCQljcG9ydDsKKwlfX3U4CQkJCWRpcmVjdGlvbjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhdWRpb19hcGJyaWRnZWFfc2V0X3R4X2RhdGFfc2l6ZV9yZXF1ZXN0IHsKKwlzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX2hkcgloZHI7CisJX19sZTE2CQkJCXNpemU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX3ByZXBhcmVfdHhfcmVxdWVzdCB7CisJc3RydWN0IGF1ZGlvX2FwYnJpZGdlYV9oZHIJaGRyOworfSBfX3BhY2tlZDsKKworc3RydWN0IGF1ZGlvX2FwYnJpZGdlYV9zdGFydF90eF9yZXF1ZXN0IHsKKwlzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX2hkcgloZHI7CisJX19sZTY0CQkJCXRpbWVzdGFtcDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhdWRpb19hcGJyaWRnZWFfc3RvcF90eF9yZXF1ZXN0IHsKKwlzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX2hkcgloZHI7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX3NodXRkb3duX3R4X3JlcXVlc3QgeworCXN0cnVjdCBhdWRpb19hcGJyaWRnZWFfaGRyCWhkcjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhdWRpb19hcGJyaWRnZWFfc2V0X3J4X2RhdGFfc2l6ZV9yZXF1ZXN0IHsKKwlzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX2hkcgloZHI7CisJX19sZTE2CQkJCXNpemU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX3ByZXBhcmVfcnhfcmVxdWVzdCB7CisJc3RydWN0IGF1ZGlvX2FwYnJpZGdlYV9oZHIJaGRyOworfSBfX3BhY2tlZDsKKworc3RydWN0IGF1ZGlvX2FwYnJpZGdlYV9zdGFydF9yeF9yZXF1ZXN0IHsKKwlzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX2hkcgloZHI7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX3N0b3BfcnhfcmVxdWVzdCB7CisJc3RydWN0IGF1ZGlvX2FwYnJpZGdlYV9oZHIJaGRyOworfSBfX3BhY2tlZDsKKworc3RydWN0IGF1ZGlvX2FwYnJpZGdlYV9zaHV0ZG93bl9yeF9yZXF1ZXN0IHsKKwlzdHJ1Y3QgYXVkaW9fYXBicmlkZ2VhX2hkcgloZHI7Cit9IF9fcGFja2VkOworCisjZW5kaWYgLypfX0FVRElPX0FQQlJJREdFQV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19jb2RlYy5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fY29kZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTA3NDRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fY29kZWMuYwpAQCAtMCwwICsxLDExMzIgQEAKKy8qCisgKiBBUEJyaWRnZSBBTFNBIFNvQyBkdW1teSBjb2RlYyBkcml2ZXIKKyAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNiBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L2lucHV0Lmg+CisKKyNpbmNsdWRlICJhdWRpb19jb2RlYy5oIgorI2luY2x1ZGUgImF1ZGlvX2FwYnJpZGdlYS5oIgorI2luY2x1ZGUgImF1ZGlvX21hbmFnZXIuaCIKKworc3RhdGljIHN0cnVjdCBnYmF1ZGlvX2NvZGVjX2luZm8gKmdiY29kZWM7CisKK3N0YXRpYyBzdHJ1Y3QgZ2JhdWRpb19kYXRhX2Nvbm5lY3Rpb24gKgorZmluZF9kYXRhKHN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGUsIGludCBpZCkKK3sKKwlzdHJ1Y3QgZ2JhdWRpb19kYXRhX2Nvbm5lY3Rpb24gKmRhdGE7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRhdGEsICZtb2R1bGUtPmRhdGFfbGlzdCwgbGlzdCkgeworCQlpZiAoaWQgPT0gZGF0YS0+aWQpCisJCQlyZXR1cm4gZGF0YTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2JhdWRpb19zdHJlYW1fcGFyYW1zICoKK2ZpbmRfZGFpX3N0cmVhbV9wYXJhbXMoc3RydWN0IGdiYXVkaW9fY29kZWNfaW5mbyAqY29kZWMsIGludCBpZCwgaW50IHN0cmVhbSkKK3sKKwlzdHJ1Y3QgZ2JhdWRpb19jb2RlY19kYWkgKmRhaTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGFpLCAmY29kZWMtPmRhaV9saXN0LCBsaXN0KSB7CisJCWlmIChkYWktPmlkID09IGlkKQorCQkJcmV0dXJuICZkYWktPnBhcmFtc1tzdHJlYW1dOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBnYmF1ZGlvX21vZHVsZV9lbmFibGVfdHgoc3RydWN0IGdiYXVkaW9fY29kZWNfaW5mbyAqY29kZWMsCisJCQkJICAgIHN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGUsIGludCBpZCkKK3sKKwlpbnQgbW9kdWxlX3N0YXRlLCByZXQgPSAwOworCXUxNiBkYXRhX2Nwb3J0LCBpMnNfcG9ydCwgY3BvcnRpZDsKKwl1OCBzaWdfYml0cywgY2hhbm5lbHM7CisJdWludDMyX3QgZm9ybWF0LCByYXRlOworCXN0cnVjdCBnYmF1ZGlvX2RhdGFfY29ubmVjdGlvbiAqZGF0YTsKKwlzdHJ1Y3QgZ2JhdWRpb19zdHJlYW1fcGFyYW1zICpwYXJhbXM7CisKKwkvKiBmaW5kIHRoZSBkYWkgKi8KKwlkYXRhID0gZmluZF9kYXRhKG1vZHVsZSwgaWQpOworCWlmICghZGF0YSkgeworCQlkZXZfZXJyKG1vZHVsZS0+ZGV2LCAiJWQ6REFUQSBjb25uZWN0aW9uIG1pc3NpbmdcbiIsIGlkKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCW1vZHVsZV9zdGF0ZSA9IGRhdGEtPnN0YXRlW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdOworCisJcGFyYW1zID0gZmluZF9kYWlfc3RyZWFtX3BhcmFtcyhjb2RlYywgaWQsIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spOworCWlmICghcGFyYW1zKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBmZXRjaCBkYWlfc3RyZWFtIHBvaW50ZXJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiByZWdpc3RlciBjcG9ydCAqLworCWlmIChtb2R1bGVfc3RhdGUgPCBHQkFVRElPX0NPREVDX1NUQVJUVVApIHsKKwkJaTJzX3BvcnQgPSAwOwkvKiBmaXhlZCBmb3Igbm93ICovCisJCWNwb3J0aWQgPSBkYXRhLT5jb25uZWN0aW9uLT5oZF9jcG9ydF9pZDsKKwkJcmV0ID0gZ2JfYXVkaW9fYXBicmlkZ2VhX3JlZ2lzdGVyX2Nwb3J0KGRhdGEtPmNvbm5lY3Rpb24sCisJCQkJCQlpMnNfcG9ydCwgY3BvcnRpZCwKKwkJCQkJCUFVRElPX0FQQlJJREdFQV9ESVJFQ1RJT05fVFgpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyX3JhdGVsaW1pdGVkKG1vZHVsZS0+ZGV2LAorCQkJCQkgICAgInJlZ19jcG9ydCBmYWlsZWQ6JWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWRhdGEtPnN0YXRlW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdID0KKwkJCUdCQVVESU9fQ09ERUNfU1RBUlRVUDsKKwkJZGV2X2RiZyhtb2R1bGUtPmRldiwgIkR5bmFtaWMgUmVnaXN0ZXIgJWQgREFJXG4iLCBjcG9ydGlkKTsKKwl9CisKKwkvKiBod19wYXJhbXMgKi8KKwlpZiAobW9kdWxlX3N0YXRlIDwgR0JBVURJT19DT0RFQ19IV1BBUkFNUykgeworCQlmb3JtYXQgPSBwYXJhbXMtPmZvcm1hdDsKKwkJY2hhbm5lbHMgPSBwYXJhbXMtPmNoYW5uZWxzOworCQlyYXRlID0gcGFyYW1zLT5yYXRlOworCQlzaWdfYml0cyA9IHBhcmFtcy0+c2lnX2JpdHM7CisJCWRhdGFfY3BvcnQgPSBkYXRhLT5jb25uZWN0aW9uLT5pbnRmX2Nwb3J0X2lkOworCQlyZXQgPSBnYl9hdWRpb19nYl9zZXRfcGNtKG1vZHVsZS0+bWdtdF9jb25uZWN0aW9uLCBkYXRhX2Nwb3J0LAorCQkJCQkgIGZvcm1hdCwgcmF0ZSwgY2hhbm5lbHMsIHNpZ19iaXRzKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycl9yYXRlbGltaXRlZChtb2R1bGUtPmRldiwgInNldF9wY20gZmFpbGVkOiVkXG4iLAorCQkJCQkgICAgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJZGF0YS0+c3RhdGVbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10gPQorCQkJR0JBVURJT19DT0RFQ19IV1BBUkFNUzsKKwkJZGV2X2RiZyhtb2R1bGUtPmRldiwgIkR5bmFtaWMgaHdfcGFyYW1zICVkIERBSVxuIiwgZGF0YV9jcG9ydCk7CisJfQorCisJLyogcHJlcGFyZSAqLworCWlmIChtb2R1bGVfc3RhdGUgPCBHQkFVRElPX0NPREVDX1BSRVBBUkUpIHsKKwkJZGF0YV9jcG9ydCA9IGRhdGEtPmNvbm5lY3Rpb24tPmludGZfY3BvcnRfaWQ7CisJCXJldCA9IGdiX2F1ZGlvX2diX3NldF90eF9kYXRhX3NpemUobW9kdWxlLT5tZ210X2Nvbm5lY3Rpb24sCisJCQkJCQkgICBkYXRhX2Nwb3J0LCAxOTIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyX3JhdGVsaW1pdGVkKG1vZHVsZS0+ZGV2LAorCQkJCQkgICAgInNldF90eF9kYXRhX3NpemUgZmFpbGVkOiVkXG4iLAorCQkJCQkgICAgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcmV0ID0gZ2JfYXVkaW9fZ2JfYWN0aXZhdGVfdHgobW9kdWxlLT5tZ210X2Nvbm5lY3Rpb24sCisJCQkJCSAgICAgIGRhdGFfY3BvcnQpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyX3JhdGVsaW1pdGVkKG1vZHVsZS0+ZGV2LAorCQkJCQkgICAgImFjdGl2YXRlX3R4IGZhaWxlZDolZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJZGF0YS0+c3RhdGVbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10gPQorCQkJR0JBVURJT19DT0RFQ19QUkVQQVJFOworCQlkZXZfZGJnKG1vZHVsZS0+ZGV2LCAiRHluYW1pYyBwcmVwYXJlICVkIERBSVxuIiwgZGF0YV9jcG9ydCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JhdWRpb19tb2R1bGVfZGlzYWJsZV90eChzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlLCBpbnQgaWQpCit7CisJaW50IHJldDsKKwl1MTYgZGF0YV9jcG9ydCwgY3BvcnRpZCwgaTJzX3BvcnQ7CisJaW50IG1vZHVsZV9zdGF0ZTsKKwlzdHJ1Y3QgZ2JhdWRpb19kYXRhX2Nvbm5lY3Rpb24gKmRhdGE7CisKKwkvKiBmaW5kIHRoZSBkYWkgKi8KKwlkYXRhID0gZmluZF9kYXRhKG1vZHVsZSwgaWQpOworCWlmICghZGF0YSkgeworCQlkZXZfZXJyKG1vZHVsZS0+ZGV2LCAiJWQ6REFUQSBjb25uZWN0aW9uIG1pc3NpbmdcbiIsIGlkKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCW1vZHVsZV9zdGF0ZSA9IGRhdGEtPnN0YXRlW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdOworCisJaWYgKG1vZHVsZV9zdGF0ZSA+IEdCQVVESU9fQ09ERUNfSFdQQVJBTVMpIHsKKwkJZGF0YV9jcG9ydCA9IGRhdGEtPmNvbm5lY3Rpb24tPmludGZfY3BvcnRfaWQ7CisJCXJldCA9IGdiX2F1ZGlvX2diX2RlYWN0aXZhdGVfdHgobW9kdWxlLT5tZ210X2Nvbm5lY3Rpb24sCisJCQkJCQlkYXRhX2Nwb3J0KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycl9yYXRlbGltaXRlZChtb2R1bGUtPmRldiwKKwkJCQkJICAgICJkZWFjdGl2YXRlX3R4IGZhaWxlZDolZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJZGV2X2RiZyhtb2R1bGUtPmRldiwgIkR5bmFtaWMgZGVhY3RpdmF0ZSAlZCBEQUlcbiIsIGRhdGFfY3BvcnQpOworCQlkYXRhLT5zdGF0ZVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9CisJCQlHQkFVRElPX0NPREVDX0hXUEFSQU1TOworCX0KKworCWlmIChtb2R1bGVfc3RhdGUgPiBHQkFVRElPX0NPREVDX1NIVVRET1dOKSB7CisJCWkyc19wb3J0ID0gMDsJLyogZml4ZWQgZm9yIG5vdyAqLworCQljcG9ydGlkID0gZGF0YS0+Y29ubmVjdGlvbi0+aGRfY3BvcnRfaWQ7CisJCXJldCA9IGdiX2F1ZGlvX2FwYnJpZGdlYV91bnJlZ2lzdGVyX2Nwb3J0KGRhdGEtPmNvbm5lY3Rpb24sCisJCQkJCQlpMnNfcG9ydCwgY3BvcnRpZCwKKwkJCQkJCUFVRElPX0FQQlJJREdFQV9ESVJFQ1RJT05fVFgpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyX3JhdGVsaW1pdGVkKG1vZHVsZS0+ZGV2LAorCQkJCQkgICAgInVucmVnaXN0ZXJfY3BvcnQgZmFpbGVkOiVkXG4iLAorCQkJCQkgICAgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJZGV2X2RiZyhtb2R1bGUtPmRldiwgIkR5bmFtaWMgVW5yZWdpc3RlciAlZCBEQUlcbiIsIGNwb3J0aWQpOworCQlkYXRhLT5zdGF0ZVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9CisJCQlHQkFVRElPX0NPREVDX1NIVVRET1dOOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiYXVkaW9fbW9kdWxlX2VuYWJsZV9yeChzdHJ1Y3QgZ2JhdWRpb19jb2RlY19pbmZvICpjb2RlYywKKwkJCQkgICAgc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKm1vZHVsZSwgaW50IGlkKQoreworCWludCBtb2R1bGVfc3RhdGUsIHJldCA9IDA7CisJdTE2IGRhdGFfY3BvcnQsIGkyc19wb3J0LCBjcG9ydGlkOworCXU4IHNpZ19iaXRzLCBjaGFubmVsczsKKwl1aW50MzJfdCBmb3JtYXQsIHJhdGU7CisJc3RydWN0IGdiYXVkaW9fZGF0YV9jb25uZWN0aW9uICpkYXRhOworCXN0cnVjdCBnYmF1ZGlvX3N0cmVhbV9wYXJhbXMgKnBhcmFtczsKKworCS8qIGZpbmQgdGhlIGRhaSAqLworCWRhdGEgPSBmaW5kX2RhdGEobW9kdWxlLCBpZCk7CisJaWYgKCFkYXRhKSB7CisJCWRldl9lcnIobW9kdWxlLT5kZXYsICIlZDpEQVRBIGNvbm5lY3Rpb24gbWlzc2luZ1xuIiwgaWQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJbW9kdWxlX3N0YXRlID0gZGF0YS0+c3RhdGVbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXTsKKworCXBhcmFtcyA9IGZpbmRfZGFpX3N0cmVhbV9wYXJhbXMoY29kZWMsIGlkLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpOworCWlmICghcGFyYW1zKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBmZXRjaCBkYWlfc3RyZWFtIHBvaW50ZXJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiByZWdpc3RlciBjcG9ydCAqLworCWlmIChtb2R1bGVfc3RhdGUgPCBHQkFVRElPX0NPREVDX1NUQVJUVVApIHsKKwkJaTJzX3BvcnQgPSAwOwkvKiBmaXhlZCBmb3Igbm93ICovCisJCWNwb3J0aWQgPSBkYXRhLT5jb25uZWN0aW9uLT5oZF9jcG9ydF9pZDsKKwkJcmV0ID0gZ2JfYXVkaW9fYXBicmlkZ2VhX3JlZ2lzdGVyX2Nwb3J0KGRhdGEtPmNvbm5lY3Rpb24sCisJCQkJCQlpMnNfcG9ydCwgY3BvcnRpZCwKKwkJCQkJCUFVRElPX0FQQlJJREdFQV9ESVJFQ1RJT05fUlgpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyX3JhdGVsaW1pdGVkKG1vZHVsZS0+ZGV2LAorCQkJCQkgICAgInJlZ19jcG9ydCBmYWlsZWQ6JWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWRhdGEtPnN0YXRlW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0gPQorCQkJR0JBVURJT19DT0RFQ19TVEFSVFVQOworCQlkZXZfZGJnKG1vZHVsZS0+ZGV2LCAiRHluYW1pYyBSZWdpc3RlciAlZCBEQUlcbiIsIGNwb3J0aWQpOworCX0KKworCS8qIGh3X3BhcmFtcyAqLworCWlmIChtb2R1bGVfc3RhdGUgPCBHQkFVRElPX0NPREVDX0hXUEFSQU1TKSB7CisJCWZvcm1hdCA9IHBhcmFtcy0+Zm9ybWF0OworCQljaGFubmVscyA9IHBhcmFtcy0+Y2hhbm5lbHM7CisJCXJhdGUgPSBwYXJhbXMtPnJhdGU7CisJCXNpZ19iaXRzID0gcGFyYW1zLT5zaWdfYml0czsKKwkJZGF0YV9jcG9ydCA9IGRhdGEtPmNvbm5lY3Rpb24tPmludGZfY3BvcnRfaWQ7CisJCXJldCA9IGdiX2F1ZGlvX2diX3NldF9wY20obW9kdWxlLT5tZ210X2Nvbm5lY3Rpb24sIGRhdGFfY3BvcnQsCisJCQkJCSAgZm9ybWF0LCByYXRlLCBjaGFubmVscywgc2lnX2JpdHMpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyX3JhdGVsaW1pdGVkKG1vZHVsZS0+ZGV2LCAic2V0X3BjbSBmYWlsZWQ6JWRcbiIsCisJCQkJCSAgICByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlkYXRhLT5zdGF0ZVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdID0KKwkJCUdCQVVESU9fQ09ERUNfSFdQQVJBTVM7CisJCWRldl9kYmcobW9kdWxlLT5kZXYsICJEeW5hbWljIGh3X3BhcmFtcyAlZCBEQUlcbiIsIGRhdGFfY3BvcnQpOworCX0KKworCS8qIHByZXBhcmUgKi8KKwlpZiAobW9kdWxlX3N0YXRlIDwgR0JBVURJT19DT0RFQ19QUkVQQVJFKSB7CisJCWRhdGFfY3BvcnQgPSBkYXRhLT5jb25uZWN0aW9uLT5pbnRmX2Nwb3J0X2lkOworCQlyZXQgPSBnYl9hdWRpb19nYl9zZXRfcnhfZGF0YV9zaXplKG1vZHVsZS0+bWdtdF9jb25uZWN0aW9uLAorCQkJCQkJICAgZGF0YV9jcG9ydCwgMTkyKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycl9yYXRlbGltaXRlZChtb2R1bGUtPmRldiwKKwkJCQkJICAgICJzZXRfcnhfZGF0YV9zaXplIGZhaWxlZDolZFxuIiwKKwkJCQkJICAgIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXJldCA9IGdiX2F1ZGlvX2diX2FjdGl2YXRlX3J4KG1vZHVsZS0+bWdtdF9jb25uZWN0aW9uLAorCQkJCQkgICAgICBkYXRhX2Nwb3J0KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycl9yYXRlbGltaXRlZChtb2R1bGUtPmRldiwKKwkJCQkJICAgICJhY3RpdmF0ZV9yeCBmYWlsZWQ6JWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWRhdGEtPnN0YXRlW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0gPQorCQkJR0JBVURJT19DT0RFQ19QUkVQQVJFOworCQlkZXZfZGJnKG1vZHVsZS0+ZGV2LCAiRHluYW1pYyBwcmVwYXJlICVkIERBSVxuIiwgZGF0YV9jcG9ydCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JhdWRpb19tb2R1bGVfZGlzYWJsZV9yeChzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlLCBpbnQgaWQpCit7CisJaW50IHJldDsKKwl1MTYgZGF0YV9jcG9ydCwgY3BvcnRpZCwgaTJzX3BvcnQ7CisJaW50IG1vZHVsZV9zdGF0ZTsKKwlzdHJ1Y3QgZ2JhdWRpb19kYXRhX2Nvbm5lY3Rpb24gKmRhdGE7CisKKwkvKiBmaW5kIHRoZSBkYWkgKi8KKwlkYXRhID0gZmluZF9kYXRhKG1vZHVsZSwgaWQpOworCWlmICghZGF0YSkgeworCQlkZXZfZXJyKG1vZHVsZS0+ZGV2LCAiJWQ6REFUQSBjb25uZWN0aW9uIG1pc3NpbmdcbiIsIGlkKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCW1vZHVsZV9zdGF0ZSA9IGRhdGEtPnN0YXRlW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV07CisKKwlpZiAobW9kdWxlX3N0YXRlID4gR0JBVURJT19DT0RFQ19IV1BBUkFNUykgeworCQlkYXRhX2Nwb3J0ID0gZGF0YS0+Y29ubmVjdGlvbi0+aW50Zl9jcG9ydF9pZDsKKwkJcmV0ID0gZ2JfYXVkaW9fZ2JfZGVhY3RpdmF0ZV9yeChtb2R1bGUtPm1nbXRfY29ubmVjdGlvbiwKKwkJCQkJCWRhdGFfY3BvcnQpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyX3JhdGVsaW1pdGVkKG1vZHVsZS0+ZGV2LAorCQkJCQkgICAgImRlYWN0aXZhdGVfcnggZmFpbGVkOiVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlkZXZfZGJnKG1vZHVsZS0+ZGV2LCAiRHluYW1pYyBkZWFjdGl2YXRlICVkIERBSVxuIiwgZGF0YV9jcG9ydCk7CisJCWRhdGEtPnN0YXRlW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0gPQorCQkJR0JBVURJT19DT0RFQ19IV1BBUkFNUzsKKwl9CisKKwlpZiAobW9kdWxlX3N0YXRlID4gR0JBVURJT19DT0RFQ19TSFVURE9XTikgeworCQlpMnNfcG9ydCA9IDA7CS8qIGZpeGVkIGZvciBub3cgKi8KKwkJY3BvcnRpZCA9IGRhdGEtPmNvbm5lY3Rpb24tPmhkX2Nwb3J0X2lkOworCQlyZXQgPSBnYl9hdWRpb19hcGJyaWRnZWFfdW5yZWdpc3Rlcl9jcG9ydChkYXRhLT5jb25uZWN0aW9uLAorCQkJCQkJaTJzX3BvcnQsIGNwb3J0aWQsCisJCQkJCQlBVURJT19BUEJSSURHRUFfRElSRUNUSU9OX1JYKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycl9yYXRlbGltaXRlZChtb2R1bGUtPmRldiwKKwkJCQkJICAgICJ1bnJlZ2lzdGVyX2Nwb3J0IGZhaWxlZDolZFxuIiwKKwkJCQkJICAgIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWRldl9kYmcobW9kdWxlLT5kZXYsICJEeW5hbWljIFVucmVnaXN0ZXIgJWQgREFJXG4iLCBjcG9ydGlkKTsKKwkJZGF0YS0+c3RhdGVbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSA9CisJCQlHQkFVRElPX0NPREVDX1NIVVRET1dOOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgZ2JhdWRpb19tb2R1bGVfdXBkYXRlKHN0cnVjdCBnYmF1ZGlvX2NvZGVjX2luZm8gKmNvZGVjLAorCQkJICBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCSAgc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKm1vZHVsZSwgaW50IGVuYWJsZSkKK3sKKwlpbnQgZGFpX2lkLCByZXQ7CisJY2hhciBpbnRmX25hbWVbTkFNRV9TSVpFXSwgZGlyW05BTUVfU0laRV07CisKKwlkZXZfZGJnKG1vZHVsZS0+ZGV2LCAiJXM6TW9kdWxlIHVwZGF0ZSAlcyBzZXF1ZW5jZVxuIiwgdy0+bmFtZSwKKwkJZW5hYmxlID8gIkVuYWJsZSI6IkRpc2FibGUiKTsKKworCWlmICgody0+aWQgIT0gc25kX3NvY19kYXBtX2FpZl9pbikgJiYgKHctPmlkICE9IHNuZF9zb2NfZGFwbV9haWZfb3V0KSkgeworCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJObyBhY3Rpb24gcmVxdWlyZWQgZm9yICVzXG4iLCB3LT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogcGFyc2UgZGFpX2lkIGZyb20gQUlGIHdpZGdldCdzIHN0cmVhbV9uYW1lICovCisJcmV0ID0gc3NjYW5mKHctPnNuYW1lLCAiJXMgJWQgJXMiLCBpbnRmX25hbWUsICZkYWlfaWQsIGRpcik7CisJaWYgKHJldCA8IDMpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRXJyb3Igd2hpbGUgcGFyc2luZyBkYWlfaWQgZm9yICVzXG4iLAorCQkJdy0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW11dGV4X2xvY2soJmNvZGVjLT5sb2NrKTsKKwlpZiAody0+aWQgPT0gc25kX3NvY19kYXBtX2FpZl9pbikgeworCQlpZiAoZW5hYmxlKQorCQkJcmV0ID0gZ2JhdWRpb19tb2R1bGVfZW5hYmxlX3R4KGNvZGVjLCBtb2R1bGUsIGRhaV9pZCk7CisJCWVsc2UKKwkJCXJldCA9IGdiYXVkaW9fbW9kdWxlX2Rpc2FibGVfdHgobW9kdWxlLCBkYWlfaWQpOworCX0gZWxzZSBpZiAody0+aWQgPT0gc25kX3NvY19kYXBtX2FpZl9vdXQpIHsKKwkJaWYgKGVuYWJsZSkKKwkJCXJldCA9IGdiYXVkaW9fbW9kdWxlX2VuYWJsZV9yeChjb2RlYywgbW9kdWxlLCBkYWlfaWQpOworCQllbHNlCisJCQlyZXQgPSBnYmF1ZGlvX21vZHVsZV9kaXNhYmxlX3J4KG1vZHVsZSwgZGFpX2lkKTsKKwl9CisKKwltdXRleF91bmxvY2soJmNvZGVjLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGdiYXVkaW9fbW9kdWxlX3VwZGF0ZSk7CisKKy8qCisgKiBjb2RlYyBEQUkgb3BzCisgKi8KK3N0YXRpYyBpbnQgZ2Jjb2RlY19zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IGdiYXVkaW9fY29kZWNfaW5mbyAqY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOworCXN0cnVjdCBnYmF1ZGlvX3N0cmVhbV9wYXJhbXMgKnBhcmFtczsKKworCW11dGV4X2xvY2soJmNvZGVjLT5sb2NrKTsKKworCWlmIChsaXN0X2VtcHR5KCZjb2RlYy0+bW9kdWxlX2xpc3QpKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIk5vIGNvZGVjIG1vZHVsZSBhdmFpbGFibGVcbiIpOworCQltdXRleF91bmxvY2soJmNvZGVjLT5sb2NrKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcGFyYW1zID0gZmluZF9kYWlfc3RyZWFtX3BhcmFtcyhjb2RlYywgZGFpLT5pZCwgc3Vic3RyZWFtLT5zdHJlYW0pOworCWlmICghcGFyYW1zKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBmZXRjaCBkYWlfc3RyZWFtIHBvaW50ZXJcbiIpOworCQltdXRleF91bmxvY2soJmNvZGVjLT5sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBhcmFtcy0+c3RhdGUgPSBHQkFVRElPX0NPREVDX1NUQVJUVVA7CisJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bG9jayk7CisJLyogdG8gcHJldmVudCBzdXNwZW5kIGluIGNhc2Ugb2YgYWN0aXZlIGF1ZGlvICovCisJcG1fc3RheV9hd2FrZShkYWktPmRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2Jjb2RlY19zaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IGdiYXVkaW9fY29kZWNfaW5mbyAqY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOworCXN0cnVjdCBnYmF1ZGlvX3N0cmVhbV9wYXJhbXMgKnBhcmFtczsKKworCW11dGV4X2xvY2soJmNvZGVjLT5sb2NrKTsKKworCWlmIChsaXN0X2VtcHR5KCZjb2RlYy0+bW9kdWxlX2xpc3QpKQorCQlkZXZfaW5mbyhjb2RlYy0+ZGV2LCAiTm8gY29kZWMgbW9kdWxlIGF2YWlsYWJsZSBkdXJpbmcgc2h1dGRvd25cbiIpOworCisJcGFyYW1zID0gZmluZF9kYWlfc3RyZWFtX3BhcmFtcyhjb2RlYywgZGFpLT5pZCwgc3Vic3RyZWFtLT5zdHJlYW0pOworCWlmICghcGFyYW1zKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBmZXRjaCBkYWlfc3RyZWFtIHBvaW50ZXJcbiIpOworCQltdXRleF91bmxvY2soJmNvZGVjLT5sb2NrKTsKKwkJcmV0dXJuOworCX0KKwlwYXJhbXMtPnN0YXRlID0gR0JBVURJT19DT0RFQ19TSFVURE9XTjsKKwltdXRleF91bmxvY2soJmNvZGVjLT5sb2NrKTsKKwlwbV9yZWxheChkYWktPmRldik7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IGdiY29kZWNfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKmh3cGFyYW1zLAorCQkJICAgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlpbnQgcmV0OworCXU4IHNpZ19iaXRzLCBjaGFubmVsczsKKwl1aW50MzJfdCBmb3JtYXQsIHJhdGU7CisJc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKm1vZHVsZTsKKwlzdHJ1Y3QgZ2JhdWRpb19kYXRhX2Nvbm5lY3Rpb24gKmRhdGE7CisJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlOworCXN0cnVjdCBnYmF1ZGlvX2NvZGVjX2luZm8gKmNvZGVjID0gZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKKwlzdHJ1Y3QgZ2JhdWRpb19zdHJlYW1fcGFyYW1zICpwYXJhbXM7CisKKwltdXRleF9sb2NrKCZjb2RlYy0+bG9jayk7CisKKwlpZiAobGlzdF9lbXB0eSgmY29kZWMtPm1vZHVsZV9saXN0KSkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJObyBjb2RlYyBtb2R1bGUgYXZhaWxhYmxlXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bG9jayk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qCisJICogYXNzdW1pbmcsIGN1cnJlbnRseSBvbmx5IDQ4MDAwIEh6LCAxNkJJVF9MRSwgc3RlcmVvCisJICogaXMgc3VwcG9ydGVkLCB2YWxpZGF0ZSBwYXJhbXMgYmVmb3JlIGNvbmZpZ3VyaW5nIGNvZGVjCisJICovCisJaWYgKHBhcmFtc19jaGFubmVscyhod3BhcmFtcykgIT0gMikgeworCQlkZXZfZXJyKGRhaS0+ZGV2LCAiSW52YWxpZCBjaGFubmVsIGNvdW50OiVkXG4iLAorCQkJcGFyYW1zX2NoYW5uZWxzKGh3cGFyYW1zKSk7CisJCW11dGV4X3VubG9jaygmY29kZWMtPmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJY2hhbm5lbHMgPSBwYXJhbXNfY2hhbm5lbHMoaHdwYXJhbXMpOworCisJaWYgKHBhcmFtc19yYXRlKGh3cGFyYW1zKSAhPSA0ODAwMCkgeworCQlkZXZfZXJyKGRhaS0+ZGV2LCAiSW52YWxpZCBzYW1wbGluZyByYXRlOiVkXG4iLAorCQkJcGFyYW1zX3JhdGUoaHdwYXJhbXMpKTsKKwkJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyYXRlID0gR0JfQVVESU9fUENNX1JBVEVfNDgwMDA7CisKKwlpZiAocGFyYW1zX2Zvcm1hdChod3BhcmFtcykgIT0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUpIHsKKwkJZGV2X2VycihkYWktPmRldiwgIkludmFsaWQgZm9ybWF0OiVkXG4iLAorCQkJcGFyYW1zX2Zvcm1hdChod3BhcmFtcykpOworCQltdXRleF91bmxvY2soJmNvZGVjLT5sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWZvcm1hdCA9IEdCX0FVRElPX1BDTV9GTVRfUzE2X0xFOworCisJLyogZmluZCB0aGUgZGF0YSBjb25uZWN0aW9uICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2R1bGUsICZjb2RlYy0+bW9kdWxlX2xpc3QsIGxpc3QpIHsKKwkJZGF0YSA9IGZpbmRfZGF0YShtb2R1bGUsIGRhaS0+aWQpOworCQlpZiAoZGF0YSkKKwkJCWJyZWFrOworCX0KKworCWlmICghZGF0YSkgeworCQlkZXZfZXJyKGRhaS0+ZGV2LCAiREFUQSBjb25uZWN0aW9uIG1pc3NpbmdcbiIpOworCQltdXRleF91bmxvY2soJmNvZGVjLT5sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGFyYW1zID0gZmluZF9kYWlfc3RyZWFtX3BhcmFtcyhjb2RlYywgZGFpLT5pZCwgc3Vic3RyZWFtLT5zdHJlYW0pOworCWlmICghcGFyYW1zKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBmZXRjaCBkYWlfc3RyZWFtIHBvaW50ZXJcbiIpOworCQltdXRleF91bmxvY2soJmNvZGVjLT5sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYnVuZGxlID0gdG9fZ2JfYnVuZGxlKG1vZHVsZS0+ZGV2KTsKKwlyZXQgPSBnYl9wbV9ydW50aW1lX2dldF9zeW5jKGJ1bmRsZSk7CisJaWYgKHJldCkgeworCQltdXRleF91bmxvY2soJmNvZGVjLT5sb2NrKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBnYl9hdWRpb19hcGJyaWRnZWFfc2V0X2NvbmZpZyhkYXRhLT5jb25uZWN0aW9uLCAwLAorCQkJCQkgICAgQVVESU9fQVBCUklER0VBX1BDTV9GTVRfMTYsCisJCQkJCSAgICBBVURJT19BUEJSSURHRUFfUENNX1JBVEVfNDgwMDAsCisJCQkJCSAgICA2MTQ0MDAwKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoZGFpLT5kZXYsICIlZDogRXJyb3IgZHVyaW5nIHNldF9jb25maWdcbiIsCisJCQkJICAgIHJldCk7CisJCW11dGV4X3VubG9jaygmY29kZWMtPmxvY2spOworCQlyZXR1cm4gcmV0OworCX0KKworCWdiX3BtX3J1bnRpbWVfcHV0X25vaWRsZShidW5kbGUpOworCisJcGFyYW1zLT5zdGF0ZSA9IEdCQVVESU9fQ09ERUNfSFdQQVJBTVM7CisJcGFyYW1zLT5mb3JtYXQgPSBmb3JtYXQ7CisJcGFyYW1zLT5yYXRlID0gcmF0ZTsKKwlwYXJhbXMtPmNoYW5uZWxzID0gY2hhbm5lbHM7CisJcGFyYW1zLT5zaWdfYml0cyA9IHNpZ19iaXRzOworCisJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2Jjb2RlY19wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlOworCXN0cnVjdCBnYmF1ZGlvX2RhdGFfY29ubmVjdGlvbiAqZGF0YTsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGU7CisJc3RydWN0IGdiYXVkaW9fY29kZWNfaW5mbyAqY29kZWMgPSBkZXZfZ2V0X2RydmRhdGEoZGFpLT5kZXYpOworCXN0cnVjdCBnYmF1ZGlvX3N0cmVhbV9wYXJhbXMgKnBhcmFtczsKKworCW11dGV4X2xvY2soJmNvZGVjLT5sb2NrKTsKKworCWlmIChsaXN0X2VtcHR5KCZjb2RlYy0+bW9kdWxlX2xpc3QpKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIk5vIGNvZGVjIG1vZHVsZSBhdmFpbGFibGVcbiIpOworCQltdXRleF91bmxvY2soJmNvZGVjLT5sb2NrKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2R1bGUsICZjb2RlYy0+bW9kdWxlX2xpc3QsIGxpc3QpIHsKKwkJLyogZmluZCB0aGUgZGFpICovCisJCWRhdGEgPSBmaW5kX2RhdGEobW9kdWxlLCBkYWktPmlkKTsKKwkJaWYgKGRhdGEpCisJCQlicmVhazsKKwl9CisJaWYgKCFkYXRhKSB7CisJCWRldl9lcnIoZGFpLT5kZXYsICJEQVRBIGNvbm5lY3Rpb24gbWlzc2luZ1xuIik7CisJCW11dGV4X3VubG9jaygmY29kZWMtPmxvY2spOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwYXJhbXMgPSBmaW5kX2RhaV9zdHJlYW1fcGFyYW1zKGNvZGVjLCBkYWktPmlkLCBzdWJzdHJlYW0tPnN0cmVhbSk7CisJaWYgKCFwYXJhbXMpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGZldGNoIGRhaV9zdHJlYW0gcG9pbnRlclxuIik7CisJCW11dGV4X3VubG9jaygmY29kZWMtPmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlidW5kbGUgPSB0b19nYl9idW5kbGUobW9kdWxlLT5kZXYpOworCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoYnVuZGxlKTsKKwlpZiAocmV0KSB7CisJCW11dGV4X3VubG9jaygmY29kZWMtPmxvY2spOworCQlyZXR1cm4gcmV0OworCX0KKworCXN3aXRjaCAoc3Vic3RyZWFtLT5zdHJlYW0pIHsKKwljYXNlIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0s6CisJCXJldCA9IGdiX2F1ZGlvX2FwYnJpZGdlYV9zZXRfdHhfZGF0YV9zaXplKGRhdGEtPmNvbm5lY3Rpb24sIDAsCisJCQkJCQkJICAxOTIpOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRToKKwkJcmV0ID0gZ2JfYXVkaW9fYXBicmlkZ2VhX3NldF9yeF9kYXRhX3NpemUoZGF0YS0+Y29ubmVjdGlvbiwgMCwKKwkJCQkJCQkgIDE5Mik7CisJCWJyZWFrOworCX0KKwlpZiAocmV0KSB7CisJCW11dGV4X3VubG9jaygmY29kZWMtPmxvY2spOworCQlkZXZfZXJyX3JhdGVsaW1pdGVkKGRhaS0+ZGV2LCAic2V0X2RhdGFfc2l6ZSBmYWlsZWQ6JWRcbiIsCisJCQkJICAgICByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWdiX3BtX3J1bnRpbWVfcHV0X25vaWRsZShidW5kbGUpOworCisJcGFyYW1zLT5zdGF0ZSA9IEdCQVVESU9fQ09ERUNfUFJFUEFSRTsKKwltdXRleF91bmxvY2soJmNvZGVjLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYmNvZGVjX211dGVfc3RyZWFtKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBpbnQgbXV0ZSwgaW50IHN0cmVhbSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBnYmF1ZGlvX2RhdGFfY29ubmVjdGlvbiAqZGF0YTsKKwlzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlOworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZTsKKwlzdHJ1Y3QgZ2JhdWRpb19jb2RlY19pbmZvICpjb2RlYyA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7CisJc3RydWN0IGdiYXVkaW9fc3RyZWFtX3BhcmFtcyAqcGFyYW1zOworCisKKwlkZXZfZGJnKGRhaS0+ZGV2LCAiTXV0ZTolZCwgRGlyZWN0aW9uOiVzXG4iLCBtdXRlLAorCQlzdHJlYW0gPyAiQ0FQVFVSRSI6IlBMQVlCQUNLIik7CisKKwltdXRleF9sb2NrKCZjb2RlYy0+bG9jayk7CisKKwlwYXJhbXMgPSBmaW5kX2RhaV9zdHJlYW1fcGFyYW1zKGNvZGVjLCBkYWktPmlkLCBzdHJlYW0pOworCWlmICghcGFyYW1zKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBmZXRjaCBkYWlfc3RyZWFtIHBvaW50ZXJcbiIpOworCQltdXRleF91bmxvY2soJmNvZGVjLT5sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGxpc3RfZW1wdHkoJmNvZGVjLT5tb2R1bGVfbGlzdCkpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiTm8gY29kZWMgbW9kdWxlIGF2YWlsYWJsZVxuIik7CisJCWlmIChtdXRlKSB7CisJCQlwYXJhbXMtPnN0YXRlID0gR0JBVURJT19DT0RFQ19TVE9QOworCQkJcmV0ID0gMDsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IC1FTk9ERVY7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bG9jayk7CisJCXJldHVybiByZXQ7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2R1bGUsICZjb2RlYy0+bW9kdWxlX2xpc3QsIGxpc3QpIHsKKwkJLyogZmluZCB0aGUgZGFpICovCisJCWRhdGEgPSBmaW5kX2RhdGEobW9kdWxlLCBkYWktPmlkKTsKKwkJaWYgKGRhdGEpCisJCQlicmVhazsKKwl9CisJaWYgKCFkYXRhKSB7CisJCWRldl9lcnIoZGFpLT5kZXYsICIlczolcyBEQVRBIGNvbm5lY3Rpb24gbWlzc2luZ1xuIiwKKwkJCWRhaS0+bmFtZSwgbW9kdWxlLT5uYW1lKTsKKwkJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bG9jayk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWJ1bmRsZSA9IHRvX2diX2J1bmRsZShtb2R1bGUtPmRldik7CisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhidW5kbGUpOworCWlmIChyZXQpIHsKKwkJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+bG9jayk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKCFtdXRlICYmICFzdHJlYW0pIHsvKiBzdGFydCBwbGF5YmFjayAqLworCQlyZXQgPSBnYl9hdWRpb19hcGJyaWRnZWFfcHJlcGFyZV90eChkYXRhLT5jb25uZWN0aW9uLAorCQkJCQkJICAgIDApOworCQlpZiAoIXJldCkKKwkJCXJldCA9IGdiX2F1ZGlvX2FwYnJpZGdlYV9zdGFydF90eChkYXRhLT5jb25uZWN0aW9uLAorCQkJCQkJCSAgMCwgMCk7CisJCXBhcmFtcy0+c3RhdGUgPSBHQkFVRElPX0NPREVDX1NUQVJUOworCX0gZWxzZSBpZiAoIW11dGUgJiYgc3RyZWFtKSB7Lyogc3RhcnQgY2FwdHVyZSAqLworCQlyZXQgPSBnYl9hdWRpb19hcGJyaWRnZWFfcHJlcGFyZV9yeChkYXRhLT5jb25uZWN0aW9uLAorCQkJCQkJICAgIDApOworCQlpZiAoIXJldCkKKwkJCXJldCA9IGdiX2F1ZGlvX2FwYnJpZGdlYV9zdGFydF9yeChkYXRhLT5jb25uZWN0aW9uLAorCQkJCQkJCSAgMCk7CisJCXBhcmFtcy0+c3RhdGUgPSBHQkFVRElPX0NPREVDX1NUQVJUOworCX0gZWxzZSBpZiAobXV0ZSAmJiAhc3RyZWFtKSB7Lyogc3RvcCBwbGF5YmFjayAqLworCQlyZXQgPSBnYl9hdWRpb19hcGJyaWRnZWFfc3RvcF90eChkYXRhLT5jb25uZWN0aW9uLCAwKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBnYl9hdWRpb19hcGJyaWRnZWFfc2h1dGRvd25fdHgoZGF0YS0+Y29ubmVjdGlvbiwKKwkJCQkJCQkgICAgIDApOworCQlwYXJhbXMtPnN0YXRlID0gR0JBVURJT19DT0RFQ19TVE9QOworCX0gZWxzZSBpZiAobXV0ZSAmJiBzdHJlYW0pIHsvKiBzdG9wIGNhcHR1cmUgKi8KKwkJcmV0ID0gZ2JfYXVkaW9fYXBicmlkZ2VhX3N0b3BfcngoZGF0YS0+Y29ubmVjdGlvbiwgMCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gZ2JfYXVkaW9fYXBicmlkZ2VhX3NodXRkb3duX3J4KGRhdGEtPmNvbm5lY3Rpb24sCisJCQkJCQkJICAgICAwKTsKKwkJcGFyYW1zLT5zdGF0ZSA9IEdCQVVESU9fQ09ERUNfU1RPUDsKKwl9IGVsc2UKKwkJcmV0ID0gLUVJTlZBTDsKKwlpZiAocmV0KQorCQlkZXZfZXJyX3JhdGVsaW1pdGVkKGRhaS0+ZGV2LAorCQkJCSAgICAiJXM6RXJyb3IgZHVyaW5nICVzICVzIHN0cmVhbTolZFxuIiwKKwkJCQkgICAgbW9kdWxlLT5uYW1lLCBtdXRlID8gIk11dGUiIDogIlVubXV0ZSIsCisJCQkJICAgIHN0cmVhbSA/ICJDYXB0dXJlIiA6ICJQbGF5YmFjayIsIHJldCk7CisKKwlnYl9wbV9ydW50aW1lX3B1dF9ub2lkbGUoYnVuZGxlKTsKKwltdXRleF91bmxvY2soJmNvZGVjLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBnYmNvZGVjX2RhaV9vcHMgPSB7CisJLnN0YXJ0dXAgPSBnYmNvZGVjX3N0YXJ0dXAsCisJLnNodXRkb3duID0gZ2Jjb2RlY19zaHV0ZG93biwKKwkuaHdfcGFyYW1zID0gZ2Jjb2RlY19od19wYXJhbXMsCisJLnByZXBhcmUgPSBnYmNvZGVjX3ByZXBhcmUsCisJLm11dGVfc3RyZWFtID0gZ2Jjb2RlY19tdXRlX3N0cmVhbSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIGdiYXVkaW9fZGFpW10gPSB7CisJeworCQkubmFtZSA9ICJhcGItaTJzMCIsCisJCS5pZCA9IDAsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJJMlMgMCBQbGF5YmFjayIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJCS5yYXRlX21pbiA9IDQ4MDAwLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiSTJTIDAgQ2FwdHVyZSIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUsCisJCQkucmF0ZV9tYXggPSA0ODAwMCwKKwkJCS5yYXRlX21pbiA9IDQ4MDAwLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJfSwKKwkJLm9wcyA9ICZnYmNvZGVjX2RhaV9vcHMsCisJfSwKK307CisKK3N0YXRpYyBpbnQgZ2JhdWRpb19pbml0X2phY2soc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKm1vZHVsZSwKKwkJCSAgICAgc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWludCByZXQ7CisKKwlpZiAoIW1vZHVsZS0+amFja19tYXNrKQorCQlyZXR1cm4gMDsKKworCXNucHJpbnRmKG1vZHVsZS0+amFja19uYW1lLCBOQU1FX1NJWkUsICJHQiAlZCBIZWFkc2V0IEphY2siLAorCQkgbW9kdWxlLT5kZXZfaWQpOworCXJldCA9IHNuZF9zb2NfamFja19uZXcoY29kZWMsIG1vZHVsZS0+amFja19uYW1lLCBtb2R1bGUtPmphY2tfbWFzaywKKwkJCSAgICAgICAmbW9kdWxlLT5oZWFkc2V0X2phY2spOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycihtb2R1bGUtPmRldiwgIkZhaWxlZCB0byBjcmVhdGUgbmV3IGphY2tcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICghbW9kdWxlLT5idXR0b25fbWFzaykKKwkJcmV0dXJuIDA7CisKKwlzbnByaW50Zihtb2R1bGUtPmJ1dHRvbl9uYW1lLCBOQU1FX1NJWkUsICJHQiAlZCBCdXR0b24gSmFjayIsCisJCSBtb2R1bGUtPmRldl9pZCk7CisJcmV0ID0gc25kX3NvY19qYWNrX25ldyhjb2RlYywgbW9kdWxlLT5idXR0b25fbmFtZSwgbW9kdWxlLT5idXR0b25fbWFzaywKKwkJCSAgICAgICAmbW9kdWxlLT5idXR0b25famFjayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKG1vZHVsZS0+ZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBidXR0b24gamFja1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyoKKwkgKiBDdXJyZW50bHksIG1heCA0IGJ1dHRvbnMgYXJlIHN1cHBvcnRlZCB3aXRoIGZvbGxvd2luZyBrZXkgbWFwcGluZworCSAqIEJUTl8wID0gS0VZX01FRElBCisJICogQlROXzEgPSBLRVlfVk9JQ0VDT01NQU5ECisJICogQlROXzIgPSBLRVlfVk9MVU1FVVAKKwkgKiBCVE5fMyA9IEtFWV9WT0xVTUVET1dOCisJICovCisKKwlpZiAobW9kdWxlLT5idXR0b25fbWFzayAmIFNORF9KQUNLX0JUTl8wKSB7CisJCXJldCA9IHNuZF9qYWNrX3NldF9rZXkobW9kdWxlLT5idXR0b25famFjay5qYWNrLCBTTkRfSkFDS19CVE5fMCwKKwkJCQkgICAgICAgS0VZX01FRElBKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihtb2R1bGUtPmRldiwgIkZhaWxlZCB0byBzZXQgQlROXzBcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCWlmIChtb2R1bGUtPmJ1dHRvbl9tYXNrICYgU05EX0pBQ0tfQlROXzEpIHsKKwkJcmV0ID0gc25kX2phY2tfc2V0X2tleShtb2R1bGUtPmJ1dHRvbl9qYWNrLmphY2ssIFNORF9KQUNLX0JUTl8xLAorCQkJCSAgICAgICBLRVlfVk9JQ0VDT01NQU5EKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihtb2R1bGUtPmRldiwgIkZhaWxlZCB0byBzZXQgQlROXzFcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCWlmIChtb2R1bGUtPmJ1dHRvbl9tYXNrICYgU05EX0pBQ0tfQlROXzIpIHsKKwkJcmV0ID0gc25kX2phY2tfc2V0X2tleShtb2R1bGUtPmJ1dHRvbl9qYWNrLmphY2ssIFNORF9KQUNLX0JUTl8yLAorCQkJCSAgICAgICBLRVlfVk9MVU1FVVApOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKG1vZHVsZS0+ZGV2LCAiRmFpbGVkIHRvIHNldCBCVE5fMlxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJaWYgKG1vZHVsZS0+YnV0dG9uX21hc2sgJiBTTkRfSkFDS19CVE5fMykgeworCQlyZXQgPSBzbmRfamFja19zZXRfa2V5KG1vZHVsZS0+YnV0dG9uX2phY2suamFjaywgU05EX0pBQ0tfQlROXzMsCisJCQkJICAgICAgIEtFWV9WT0xVTUVET1dOKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihtb2R1bGUtPmRldiwgIkZhaWxlZCB0byBzZXQgQlROXzBcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCS8qIEZJWE1FCisJICogdmVyaWZ5IGlmIHRoaXMgaXMgcmVhbGx5IHJlcXVpcmVkCisJc2V0X2JpdChJTlBVVF9QUk9QX05PX0RVTU1ZX1JFTEVBU0UsCisJCW1vZHVsZS0+YnV0dG9uX2phY2suamFjay0+aW5wdXRfZGV2LT5wcm9wYml0KTsKKwkqLworCisJcmV0dXJuIDA7Cit9CisKK2ludCBnYmF1ZGlvX3JlZ2lzdGVyX21vZHVsZShzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlKQoreworCWludCByZXQ7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKKwlzdHJ1Y3Qgc25kX3NvY19qYWNrICpqYWNrID0gTlVMTDsKKworCWlmICghZ2Jjb2RlYykgeworCQlkZXZfZXJyKG1vZHVsZS0+ZGV2LCAiR0IgQ29kZWMgbm90IHlldCBwcm9iZWRcbiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwljb2RlYyA9IGdiY29kZWMtPmNvZGVjOworCWNhcmQgPSBjb2RlYy0+Y2FyZC0+c25kX2NhcmQ7CisKKwlkb3duX3dyaXRlKCZjYXJkLT5jb250cm9sc19yd3NlbSk7CisKKwlpZiAobW9kdWxlLT5udW1fZGFpcykgeworCQlkZXZfZXJyKGdiY29kZWMtPmRldiwKKwkJCSIlZDpEQUlzIG5vdCBzdXBwb3J0ZWQgdmlhIGdiY29kZWMgZHJpdmVyXG4iLAorCQkJbW9kdWxlLT5udW1fZGFpcyk7CisJCXVwX3dyaXRlKCZjYXJkLT5jb250cm9sc19yd3NlbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IGdiYXVkaW9faW5pdF9qYWNrKG1vZHVsZSwgY29kZWMpOworCWlmIChyZXQpIHsKKwkJdXBfd3JpdGUoJmNhcmQtPmNvbnRyb2xzX3J3c2VtKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAobW9kdWxlLT5kYXBtX3dpZGdldHMpCisJCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoJmNvZGVjLT5kYXBtLCBtb2R1bGUtPmRhcG1fd2lkZ2V0cywKKwkJCQkJICBtb2R1bGUtPm51bV9kYXBtX3dpZGdldHMpOworCWlmIChtb2R1bGUtPmNvbnRyb2xzKQorCQlzbmRfc29jX2FkZF9jb2RlY19jb250cm9scyhjb2RlYywgbW9kdWxlLT5jb250cm9scywKKwkJCQkgICAgIG1vZHVsZS0+bnVtX2NvbnRyb2xzKTsKKwlpZiAobW9kdWxlLT5kYXBtX3JvdXRlcykKKwkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoJmNvZGVjLT5kYXBtLCBtb2R1bGUtPmRhcG1fcm91dGVzLAorCQkJCQltb2R1bGUtPm51bV9kYXBtX3JvdXRlcyk7CisKKwkvKiBjYXJkIGFscmVhZHkgaW5zdGFudGlhdGVkLCBjcmVhdGUgd2lkZ2V0cyBoZXJlIG9ubHkgKi8KKwlpZiAoY29kZWMtPmNhcmQtPmluc3RhbnRpYXRlZCkgeworCQlzbmRfc29jX2RhcG1fbGlua19jb21wb25lbnRfZGFpX3dpZGdldHMoY29kZWMtPmNhcmQsCisJCQkJCQkJJmNvZGVjLT5kYXBtKTsKKyNpZmRlZiBDT05GSUdfU05EX0pBQ0sKKwkJLyogcmVnaXN0ZXIgamFjayBkZXZpY2VzIGZvciB0aGlzIG1vZHVsZSBmcm9tIGNvZGVjLT5qYWNrX2xpc3QgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShqYWNrLCAmY29kZWMtPmphY2tfbGlzdCwgbGlzdCkgeworCQkJaWYgKChqYWNrID09ICZtb2R1bGUtPmhlYWRzZXRfamFjaykKKwkJCSAgICB8fCAoamFjayA9PSAmbW9kdWxlLT5idXR0b25famFjaykpCisJCQkJc25kX2RldmljZV9yZWdpc3Rlcihjb2RlYy0+Y2FyZC0+c25kX2NhcmQsCisJCQkJCQkgICAgamFjay0+amFjayk7CisJCX0KKyNlbmRpZgorCX0KKworCW11dGV4X2xvY2soJmdiY29kZWMtPmxvY2spOworCWxpc3RfYWRkKCZtb2R1bGUtPmxpc3QsICZnYmNvZGVjLT5tb2R1bGVfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZnYmNvZGVjLT5sb2NrKTsKKworCWlmIChjb2RlYy0+Y2FyZC0+aW5zdGFudGlhdGVkKQorCQlyZXQgPSBzbmRfc29jX2RhcG1fbmV3X3dpZGdldHMoJmNvZGVjLT5kYXBtKTsKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICJSZWdpc3RlcmVkICVzIG1vZHVsZVxuIiwgbW9kdWxlLT5uYW1lKTsKKworCXVwX3dyaXRlKCZjYXJkLT5jb250cm9sc19yd3NlbSk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZ2JhdWRpb19yZWdpc3Rlcl9tb2R1bGUpOworCitzdGF0aWMgdm9pZCBnYmF1ZGlvX2NvZGVjX2NsZWFuX2RhdGFfdHgoc3RydWN0IGdiYXVkaW9fZGF0YV9jb25uZWN0aW9uICpkYXRhKQoreworCXUxNiBpMnNfcG9ydCwgY3BvcnRpZDsKKwlpbnQgcmV0OworCisJaWYgKGxpc3RfaXNfc2luZ3VsYXIoJmdiY29kZWMtPm1vZHVsZV9saXN0KSkgeworCQlyZXQgPSBnYl9hdWRpb19hcGJyaWRnZWFfc3RvcF90eChkYXRhLT5jb25uZWN0aW9uLCAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybjsKKwkJcmV0ID0gZ2JfYXVkaW9fYXBicmlkZ2VhX3NodXRkb3duX3R4KGRhdGEtPmNvbm5lY3Rpb24sCisJCQkJCQkgICAgIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuOworCX0KKwlpMnNfcG9ydCA9IDA7CS8qIGZpeGVkIGZvciBub3cgKi8KKwljcG9ydGlkID0gZGF0YS0+Y29ubmVjdGlvbi0+aGRfY3BvcnRfaWQ7CisJcmV0ID0gZ2JfYXVkaW9fYXBicmlkZ2VhX3VucmVnaXN0ZXJfY3BvcnQoZGF0YS0+Y29ubmVjdGlvbiwKKwkJCQkJCSAgaTJzX3BvcnQsIGNwb3J0aWQsCisJCQkJCQkgIEFVRElPX0FQQlJJREdFQV9ESVJFQ1RJT05fVFgpOworCWRhdGEtPnN0YXRlWzBdID0gR0JBVURJT19DT0RFQ19TSFVURE9XTjsKK30KKworc3RhdGljIHZvaWQgZ2JhdWRpb19jb2RlY19jbGVhbl9kYXRhX3J4KHN0cnVjdCBnYmF1ZGlvX2RhdGFfY29ubmVjdGlvbiAqZGF0YSkKK3sKKwl1MTYgaTJzX3BvcnQsIGNwb3J0aWQ7CisJaW50IHJldDsKKworCWlmIChsaXN0X2lzX3Npbmd1bGFyKCZnYmNvZGVjLT5tb2R1bGVfbGlzdCkpIHsKKwkJcmV0ID0gZ2JfYXVkaW9fYXBicmlkZ2VhX3N0b3BfcngoZGF0YS0+Y29ubmVjdGlvbiwgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm47CisJCXJldCA9IGdiX2F1ZGlvX2FwYnJpZGdlYV9zaHV0ZG93bl9yeChkYXRhLT5jb25uZWN0aW9uLAorCQkJCQkJICAgICAwKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybjsKKwl9CisJaTJzX3BvcnQgPSAwOwkvKiBmaXhlZCBmb3Igbm93ICovCisJY3BvcnRpZCA9IGRhdGEtPmNvbm5lY3Rpb24tPmhkX2Nwb3J0X2lkOworCXJldCA9IGdiX2F1ZGlvX2FwYnJpZGdlYV91bnJlZ2lzdGVyX2Nwb3J0KGRhdGEtPmNvbm5lY3Rpb24sCisJCQkJCQkgIGkyc19wb3J0LCBjcG9ydGlkLAorCQkJCQkJICBBVURJT19BUEJSSURHRUFfRElSRUNUSU9OX1JYKTsKKwlkYXRhLT5zdGF0ZVsxXSA9IEdCQVVESU9fQ09ERUNfU0hVVERPV047Cit9CisKKworc3RhdGljIHZvaWQgZ2JhdWRpb19jb2RlY19jbGVhbnVwKHN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGUpCit7CisJc3RydWN0IGdiYXVkaW9fZGF0YV9jb25uZWN0aW9uICpkYXRhOworCWludCBwYl9zdGF0ZSwgY2FwX3N0YXRlOworCisJZGV2X2RiZyhnYmNvZGVjLT5kZXYsICIlczogcmVtb3ZlZCwgY2xlYW51cCBBUEJyaWRnZVxuIiwgbW9kdWxlLT5uYW1lKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRhdGEsICZtb2R1bGUtPmRhdGFfbGlzdCwgbGlzdCkgeworCQlwYl9zdGF0ZSA9IGRhdGEtPnN0YXRlWzBdOworCQljYXBfc3RhdGUgPSBkYXRhLT5zdGF0ZVsxXTsKKworCQlpZiAocGJfc3RhdGUgPiBHQkFVRElPX0NPREVDX1NIVVRET1dOKQorCQkJZ2JhdWRpb19jb2RlY19jbGVhbl9kYXRhX3R4KGRhdGEpOworCisJCWlmIChjYXBfc3RhdGUgPiBHQkFVRElPX0NPREVDX1NIVVRET1dOKQorCQkJZ2JhdWRpb19jb2RlY19jbGVhbl9kYXRhX3J4KGRhdGEpOworCisJfQorfQorCit2b2lkIGdiYXVkaW9fdW5yZWdpc3Rlcl9tb2R1bGUoc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKm1vZHVsZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBnYmNvZGVjLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBjb2RlYy0+Y2FyZC0+c25kX2NhcmQ7CisJc3RydWN0IHNuZF9zb2NfamFjayAqamFjaywgKm5leHRfajsKKwlpbnQgbWFzazsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIlVucmVnaXN0ZXIgJXMgbW9kdWxlXG4iLCBtb2R1bGUtPm5hbWUpOworCisJZG93bl93cml0ZSgmY2FyZC0+Y29udHJvbHNfcndzZW0pOworCW11dGV4X2xvY2soJmdiY29kZWMtPmxvY2spOworCWdiYXVkaW9fY29kZWNfY2xlYW51cChtb2R1bGUpOworCWxpc3RfZGVsKCZtb2R1bGUtPmxpc3QpOworCWRldl9kYmcoY29kZWMtPmRldiwgIlByb2Nlc3MgVW5yZWdpc3RlciAlcyBtb2R1bGVcbiIsIG1vZHVsZS0+bmFtZSk7CisJbXV0ZXhfdW5sb2NrKCZnYmNvZGVjLT5sb2NrKTsKKworI2lmZGVmIENPTkZJR19TTkRfSkFDSworCS8qIGZyZWUgamFjayBkZXZpY2VzIGZvciB0aGlzIG1vZHVsZSBmcm9tIGNvZGVjLT5qYWNrX2xpc3QgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoamFjaywgbmV4dF9qLCAmY29kZWMtPmphY2tfbGlzdCwgbGlzdCkgeworCQlpZiAoamFjayA9PSAmbW9kdWxlLT5oZWFkc2V0X2phY2spCisJCQltYXNrID0gR0JDT0RFQ19KQUNLX01BU0s7CisJCWVsc2UgaWYgKGphY2sgPT0gJm1vZHVsZS0+YnV0dG9uX2phY2spCisJCQltYXNrID0gR0JDT0RFQ19KQUNLX0JVVFRPTl9NQVNLOworCQllbHNlCisJCQltYXNrID0gMDsKKwkJaWYgKG1hc2spIHsKKwkJCWRldl9kYmcobW9kdWxlLT5kZXYsICJSZXBvcnQgJXMgcmVtb3ZhbFxuIiwKKwkJCQlqYWNrLT5qYWNrLT5pZCk7CisJCQlzbmRfc29jX2phY2tfcmVwb3J0KGphY2ssIDAsIG1hc2spOworCQkJc25kX2RldmljZV9mcmVlKGNvZGVjLT5jYXJkLT5zbmRfY2FyZCwgamFjay0+amFjayk7CisJCQlsaXN0X2RlbCgmamFjay0+bGlzdCk7CisJCX0KKwl9CisjZW5kaWYKKworCWlmIChtb2R1bGUtPmRhcG1fcm91dGVzKSB7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIlJlbW92aW5nICVkIHJvdXRlc1xuIiwKKwkJCW1vZHVsZS0+bnVtX2RhcG1fcm91dGVzKTsKKwkJc25kX3NvY19kYXBtX2RlbF9yb3V0ZXMoJmNvZGVjLT5kYXBtLCBtb2R1bGUtPmRhcG1fcm91dGVzLAorCQkJCQltb2R1bGUtPm51bV9kYXBtX3JvdXRlcyk7CisJfQorCWlmIChtb2R1bGUtPmNvbnRyb2xzKSB7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIlJlbW92aW5nICVkIGNvbnRyb2xzXG4iLAorCQkJbW9kdWxlLT5udW1fY29udHJvbHMpOworCQlzbmRfc29jX3JlbW92ZV9jb2RlY19jb250cm9scyhjb2RlYywgbW9kdWxlLT5jb250cm9scywKKwkJCQkJICBtb2R1bGUtPm51bV9jb250cm9scyk7CisJfQorCWlmIChtb2R1bGUtPmRhcG1fd2lkZ2V0cykgeworCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJSZW1vdmluZyAlZCB3aWRnZXRzXG4iLAorCQkJbW9kdWxlLT5udW1fZGFwbV93aWRnZXRzKTsKKwkJc25kX3NvY19kYXBtX2ZyZWVfY29udHJvbHMoJmNvZGVjLT5kYXBtLCBtb2R1bGUtPmRhcG1fd2lkZ2V0cywKKwkJCQkJICAgbW9kdWxlLT5udW1fZGFwbV93aWRnZXRzKTsKKwl9CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICJVbnJlZ2lzdGVyZWQgJXMgbW9kdWxlXG4iLCBtb2R1bGUtPm5hbWUpOworCisJdXBfd3JpdGUoJmNhcmQtPmNvbnRyb2xzX3J3c2VtKTsKK30KK0VYUE9SVF9TWU1CT0woZ2JhdWRpb191bnJlZ2lzdGVyX21vZHVsZSk7CisKKy8qCisgKiBjb2RlYyBkcml2ZXIgb3BzCisgKi8KK3N0YXRpYyBpbnQgZ2Jjb2RlY19wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IGk7CisJc3RydWN0IGdiYXVkaW9fY29kZWNfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgZ2JhdWRpb19jb2RlY19kYWkgKmRhaTsKKworCWluZm8gPSBkZXZtX2t6YWxsb2MoY29kZWMtPmRldiwgc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWluZm8tPmRldiA9IGNvZGVjLT5kZXY7CisJSU5JVF9MSVNUX0hFQUQoJmluZm8tPm1vZHVsZV9saXN0KTsKKwltdXRleF9pbml0KCZpbmZvLT5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmaW5mby0+ZGFpX2xpc3QpOworCisJLyogaW5pdCBkYWlfbGlzdCB1c2VkIHRvIG1haW50YWluIHJ1bnRpbWUgc3RyZWFtIGluZm8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShnYmF1ZGlvX2RhaSk7IGkrKykgeworCQlkYWkgPSBkZXZtX2t6YWxsb2MoY29kZWMtPmRldiwgc2l6ZW9mKCpkYWkpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFkYWkpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJZGFpLT5pZCA9IGdiYXVkaW9fZGFpW2ldLmlkOworCQlsaXN0X2FkZCgmZGFpLT5saXN0LCAmaW5mby0+ZGFpX2xpc3QpOworCX0KKworCWluZm8tPmNvZGVjID0gY29kZWM7CisJc25kX3NvY19jb2RlY19zZXRfZHJ2ZGF0YShjb2RlYywgaW5mbyk7CisJZ2Jjb2RlYyA9IGluZm87CisKKwlkZXZpY2VfaW5pdF93YWtldXAoY29kZWMtPmRldiwgMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2Jjb2RlY19yZW1vdmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCS8qIEVtcHR5IGZ1bmN0aW9uIGZvciBub3cgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHU4IGdiY29kZWNfcmVnW0dCQ09ERUNfUkVHX0NPVU5UXSA9IHsKKwlbR0JDT0RFQ19DVExfUkVHXSA9IEdCQ09ERUNfQ1RMX1JFR19ERUZBVUxULAorCVtHQkNPREVDX01VVEVfUkVHXSA9IEdCQ09ERUNfTVVURV9SRUdfREVGQVVMVCwKKwlbR0JDT0RFQ19QQl9MVk9MX1JFR10gPSBHQkNPREVDX1BCX1ZPTF9SRUdfREVGQVVMVCwKKwlbR0JDT0RFQ19QQl9SVk9MX1JFR10gPSBHQkNPREVDX1BCX1ZPTF9SRUdfREVGQVVMVCwKKwlbR0JDT0RFQ19DQVBfTFZPTF9SRUddID0gR0JDT0RFQ19DQVBfVk9MX1JFR19ERUZBVUxULAorCVtHQkNPREVDX0NBUF9SVk9MX1JFR10gPSBHQkNPREVDX0NBUF9WT0xfUkVHX0RFRkFVTFQsCisJW0dCQ09ERUNfQVBCMV9NVVhfUkVHXSA9IEdCQ09ERUNfQVBCMV9NVVhfUkVHX0RFRkFVTFQsCisJW0dCQ09ERUNfQVBCMl9NVVhfUkVHXSA9IEdCQ09ERUNfQVBCMl9NVVhfUkVHX0RFRkFVTFQsCit9OworCitzdGF0aWMgaW50IGdiY29kZWNfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAorCQkJIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChyZWcgPT0gU05EX1NPQ19OT1BNKQorCQlyZXR1cm4gMDsKKworCUJVR19PTihyZWcgPj0gR0JDT0RFQ19SRUdfQ09VTlQpOworCisJZ2Jjb2RlY19yZWdbcmVnXSA9IHZhbHVlOworCWRldl9kYmcoY29kZWMtPmRldiwgInJlZ1slZF0gPSAweCV4XG4iLCByZWcsIHZhbHVlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2Jjb2RlY19yZWFkKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCQkgdW5zaWduZWQgaW50IHJlZykKK3sKKwl1bnNpZ25lZCBpbnQgdmFsID0gMDsKKworCWlmIChyZWcgPT0gU05EX1NPQ19OT1BNKQorCQlyZXR1cm4gMDsKKworCUJVR19PTihyZWcgPj0gR0JDT0RFQ19SRUdfQ09VTlQpOworCisJdmFsID0gZ2Jjb2RlY19yZWdbcmVnXTsKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICJyZWdbJWRdID0gMHgleFxuIiwgcmVnLCB2YWwpOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X2diYXVkaW8gPSB7CisJLnByb2JlCT0gZ2Jjb2RlY19wcm9iZSwKKwkucmVtb3ZlCT0gZ2Jjb2RlY19yZW1vdmUsCisKKwkucmVhZCA9IGdiY29kZWNfcmVhZCwKKwkud3JpdGUgPSBnYmNvZGVjX3dyaXRlLAorCisJLnJlZ19jYWNoZV9zaXplID0gR0JDT0RFQ19SRUdfQ09VTlQsCisJLnJlZ19jYWNoZV9kZWZhdWx0ID0gZ2Jjb2RlY19yZWdfZGVmYXVsdHMsCisJLnJlZ193b3JkX3NpemUgPSAxLAorCisJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAorCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorfTsKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBnYmF1ZGlvX2NvZGVjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWRldl9kYmcoZGV2LCAiJXM6IHN1c3BlbmRcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYmF1ZGlvX2NvZGVjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJZGV2X2RiZyhkZXYsICIlczogcmVzdW1lXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBnYmF1ZGlvX2NvZGVjX3BtX29wcyA9IHsKKwkuc3VzcGVuZAk9IGdiYXVkaW9fY29kZWNfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGdiYXVkaW9fY29kZWNfcmVzdW1lLAorfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IGdiYXVkaW9fY29kZWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmcGRldi0+ZGV2LCAmc29jX2NvZGVjX2Rldl9nYmF1ZGlvLAorCQkJZ2JhdWRpb19kYWksIEFSUkFZX1NJWkUoZ2JhdWRpb19kYWkpKTsKK30KKworc3RhdGljIGludCBnYmF1ZGlvX2NvZGVjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmcGRldi0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZ3JleWJ1c19hc29jX21hY2hpbmVfb2ZfbWF0Y2hbXSAgPSB7CisJeyAuY29tcGF0aWJsZSA9ICJ0b3NoaWJhLGFwYi1kdW1teS1jb2RlYyIsIH0sCisJe30sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBnYmF1ZGlvX2NvZGVjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhcGItZHVtbXktY29kZWMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKyNpZmRlZiBDT05GSUdfUE0KKwkJLnBtID0gJmdiYXVkaW9fY29kZWNfcG1fb3BzLAorI2VuZGlmCisJCS5vZl9tYXRjaF90YWJsZSA9IGdyZXlidXNfYXNvY19tYWNoaW5lX29mX21hdGNoLAorCX0sCisJLnByb2JlID0gZ2JhdWRpb19jb2RlY19wcm9iZSwKKwkucmVtb3ZlID0gZ2JhdWRpb19jb2RlY19yZW1vdmUsCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihnYmF1ZGlvX2NvZGVjX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVBCcmlkZ2UgQUxTQSBTb0MgZHVtbXkgY29kZWMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJWYWliaGF2IEFnYXJ3YWwgPHZhaWJoYXYuYWdhcndhbEBsaW5hcm8ub3JnPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTphcGItZHVtbXktY29kZWMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX2NvZGVjLmggYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19jb2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMDI3YmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19jb2RlYy5oCkBAIC0wLDAgKzEsMjgzIEBACisvKgorICogR3JleWJ1cyBhdWRpbyBkcml2ZXIKKyAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNSBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpZm5kZWYgX19MSU5VWF9HQkFVRElPX0NPREVDX0gKKyNkZWZpbmUgX19MSU5VWF9HQkFVRElPX0NPREVDX0gKKworI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KKworI2luY2x1ZGUgImdyZXlidXMuaCIKKyNpbmNsdWRlICJncmV5YnVzX3Byb3RvY29scy5oIgorCisjZGVmaW5lIE5BTUVfU0laRQkzMgorI2RlZmluZSBNQVhfREFJUwkyCS8qIEFQQjEsIEFQQjIgKi8KKworZW51bSB7CisJQVBCMV9QQ00gPSAwLAorCUFQQjJfUENNLAorCU5VTV9DT0RFQ19EQUlTLAorfTsKKworZW51bSBnYmNvZGVjX3JlZ19pbmRleCB7CisJR0JDT0RFQ19DVExfUkVHLAorCUdCQ09ERUNfTVVURV9SRUcsCisJR0JDT0RFQ19QQl9MVk9MX1JFRywKKwlHQkNPREVDX1BCX1JWT0xfUkVHLAorCUdCQ09ERUNfQ0FQX0xWT0xfUkVHLAorCUdCQ09ERUNfQ0FQX1JWT0xfUkVHLAorCUdCQ09ERUNfQVBCMV9NVVhfUkVHLAorCUdCQ09ERUNfQVBCMl9NVVhfUkVHLAorCUdCQ09ERUNfUkVHX0NPVU5UCit9OworCisvKiBkZXZpY2VfdHlwZSBzaG91bGQgYmUgc2FtZSBhcyBkZWZpbmVkIGluIGF1ZGlvLmggKEFuZHJvaWQgbWVkaWEgbGF5ZXIpICovCitlbnVtIHsKKwlHQkFVRElPX0RFVklDRV9OT05FICAgICAgICAgICAgICAgICAgICAgPSAweDAsCisJLyogcmVzZXJ2ZWQgYml0cyAqLworCUdCQVVESU9fREVWSUNFX0JJVF9JTiAgICAgICAgICAgICAgICAgICA9IDB4ODAwMDAwMDAsCisJR0JBVURJT19ERVZJQ0VfQklUX0RFRkFVTFQgICAgICAgICAgICAgID0gMHg0MDAwMDAwMCwKKwkvKiBvdXRwdXQgZGV2aWNlcyAqLworCUdCQVVESU9fREVWSUNFX09VVF9TUEVBS0VSICAgICAgICAgICAgICA9IDB4MiwKKwlHQkFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVCAgICAgICAgPSAweDQsCisJR0JBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSAgICAgID0gMHg4LAorCS8qIGlucHV0IGRldmljZXMgKi8KKwlHQkFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyAgICAgICAgICAgPSBHQkFVRElPX0RFVklDRV9CSVRfSU4gfCAweDQsCisJR0JBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCAgICAgICAgID0gR0JBVURJT19ERVZJQ0VfQklUX0lOIHwgMHgxMCwKK307CisKKy8qIGJpdCAwLVNQSywgMS1IUCwgMi1EQUMsCisgKiA0LU1JQywgNS1IU01JQywgNi1NSUMyCisgKi8KKyNkZWZpbmUgR0JDT0RFQ19DVExfUkVHX0RFRkFVTFQJCTB4MDAKKworLyogYml0IDAsMSAtIEFQQjEtUEItTC9SCisgKiBiaXQgMiwzIC0gQVBCMi1QQi1ML1IKKyAqIGJpdCA0LDUgLSBBUEIxLUNhcC1ML1IKKyAqIGJpdCA2LDcgLSBBUEIyLUNhcC1ML1IKKyAqLworI2RlZmluZQlHQkNPREVDX01VVEVfUkVHX0RFRkFVTFQJMHgwMAorCisvKiAwLTEyNyBzdGVwcyAqLworI2RlZmluZQlHQkNPREVDX1BCX1ZPTF9SRUdfREVGQVVMVAkweDAwCisjZGVmaW5lCUdCQ09ERUNfQ0FQX1ZPTF9SRUdfREVGQVVMVAkweDAwCisKKy8qIGJpdCAwLDEsMiAtIFBCIHN0ZXJlbywgbGVmdCwgcmlnaHQKKyAqIGJpdCA4LDksMTAgLSBDYXAgc3RlcmVvLCBsZWZ0LCByaWdodAorICovCisjZGVmaW5lIEdCQ09ERUNfQVBCMV9NVVhfUkVHX0RFRkFVTFQJMHgwMAorI2RlZmluZSBHQkNPREVDX0FQQjJfTVVYX1JFR19ERUZBVUxUCTB4MDAKKworI2RlZmluZSBHQkNPREVDX0pBQ0tfTUFTSwkJMHgwMDAwRkZGRgorI2RlZmluZSBHQkNPREVDX0pBQ0tfQlVUVE9OX01BU0sJMHhGRkZGMDAwMAorCitzdGF0aWMgY29uc3QgdTggZ2Jjb2RlY19yZWdfZGVmYXVsdHNbR0JDT0RFQ19SRUdfQ09VTlRdID0geworCUdCQ09ERUNfQ1RMX1JFR19ERUZBVUxULAorCUdCQ09ERUNfTVVURV9SRUdfREVGQVVMVCwKKwlHQkNPREVDX1BCX1ZPTF9SRUdfREVGQVVMVCwKKwlHQkNPREVDX1BCX1ZPTF9SRUdfREVGQVVMVCwKKwlHQkNPREVDX0NBUF9WT0xfUkVHX0RFRkFVTFQsCisJR0JDT0RFQ19DQVBfVk9MX1JFR19ERUZBVUxULAorCUdCQ09ERUNfQVBCMV9NVVhfUkVHX0RFRkFVTFQsCisJR0JDT0RFQ19BUEIyX01VWF9SRUdfREVGQVVMVCwKK307CisKK2VudW0gZ2JhdWRpb19jb2RlY19zdGF0ZSB7CisJR0JBVURJT19DT0RFQ19TSFVURE9XTiA9IDAsCisJR0JBVURJT19DT0RFQ19TVEFSVFVQLAorCUdCQVVESU9fQ09ERUNfSFdQQVJBTVMsCisJR0JBVURJT19DT0RFQ19QUkVQQVJFLAorCUdCQVVESU9fQ09ERUNfU1RBUlQsCisJR0JBVURJT19DT0RFQ19TVE9QLAorfTsKKworc3RydWN0IGdiYXVkaW9fc3RyZWFtX3BhcmFtcyB7CisJaW50IHN0YXRlOworCXU4IHNpZ19iaXRzLCBjaGFubmVsczsKKwl1aW50MzJfdCBmb3JtYXQsIHJhdGU7Cit9OworCitzdHJ1Y3QgZ2JhdWRpb19jb2RlY19kYWkgeworCWludCBpZDsKKwkvKiBydW50aW1lIHBhcmFtcyBmb3IgcGxheWJhY2svY2FwdHVyZSBzdHJlYW1zICovCisJc3RydWN0IGdiYXVkaW9fc3RyZWFtX3BhcmFtcyBwYXJhbXNbMl07CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworc3RydWN0IGdiYXVkaW9fY29kZWNfaW5mbyB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG1vZHVsZV9saXN0OworCS8qIHRvIG1haW50YWluIHJ1bnRpbWUgc3RyZWFtIHBhcmFtcyBmb3IgZWFjaCBEQUkgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGRhaV9saXN0OworCXN0cnVjdCBtdXRleCBsb2NrOworCXU4IHJlZ1tHQkNPREVDX1JFR19DT1VOVF07Cit9OworCitzdHJ1Y3QgZ2JhdWRpb193aWRnZXQgeworCV9fdTggaWQ7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitzdHJ1Y3QgZ2JhdWRpb19jb250cm9sIHsKKwlfX3U4IGlkOworCWNoYXIgKm5hbWU7CisJY2hhciAqd25hbWU7CisJY29uc3QgY2hhciAqIGNvbnN0ICp0ZXh0czsKKwlpbnQgaXRlbXM7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworc3RydWN0IGdiYXVkaW9fZGF0YV9jb25uZWN0aW9uIHsKKwlpbnQgaWQ7CisJX19sZTE2IGRhdGFfY3BvcnQ7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCS8qIG1haW50YWluIHJ1bnRpbWUgc3RhdGUgZm9yIHBsYXliYWNrL2NhcHR1cmUgc3RyZWFtICovCisJaW50IHN0YXRlWzJdOworfTsKKworLyogc3RyZWFtIGRpcmVjdGlvbiAqLworI2RlZmluZSBHQl9QTEFZQkFDSwlCSVQoMCkKKyNkZWZpbmUgR0JfQ0FQVFVSRQlCSVQoMSkKKworZW51bSBnYmF1ZGlvX21vZHVsZV9zdGF0ZSB7CisJR0JBVURJT19NT0RVTEVfT0ZGID0gMCwKKwlHQkFVRElPX01PRFVMRV9PTiwKK307CisKK3N0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvIHsKKwkvKiBtb2R1bGUgaW5mbyAqLworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlpbnQgZGV2X2lkOwkvKiBjaGVjayBpZiBpdCBzaG91bGQgYmUgYnVuZGxlX2lkL2hkX2Nwb3J0X2lkICovCisJaW50IHZpZDsKKwlpbnQgcGlkOworCWludCBzbG90OworCWludCB0eXBlOworCWludCBzZXRfdWV2ZW50OworCWNoYXIgdnN0cltOQU1FX1NJWkVdOworCWNoYXIgcHN0cltOQU1FX1NJWkVdOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwkvKiBuZWVkIHRvIHNoYXJlIHRoaXMgaW5mbyB0byBhYm92ZSB1c2VyIHNwYWNlICovCisJaW50IG1hbmFnZXJfaWQ7CisJY2hhciBuYW1lW05BTUVfU0laRV07CisJdW5zaWduZWQgaW50IGlwX2RldmljZXM7CisJdW5zaWduZWQgaW50IG9wX2RldmljZXM7CisKKwkvKiBqYWNrIHJlbGF0ZWQgKi8KKwljaGFyIGphY2tfbmFtZVtOQU1FX1NJWkVdOworCWNoYXIgYnV0dG9uX25hbWVbTkFNRV9TSVpFXTsKKwlpbnQgamFja190eXBlOworCWludCBqYWNrX21hc2s7CisJaW50IGJ1dHRvbl9tYXNrOworCWludCBidXR0b25fc3RhdHVzOworCXN0cnVjdCBzbmRfc29jX2phY2sgaGVhZHNldF9qYWNrOworCXN0cnVjdCBzbmRfc29jX2phY2sgYnV0dG9uX2phY2s7CisKKwkvKiBjb25uZWN0aW9uIGluZm8gKi8KKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqbWdtdF9jb25uZWN0aW9uOworCXNpemVfdCBudW1fZGF0YV9jb25uZWN0aW9uczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRhdGFfbGlzdDsKKworCS8qIHRvcG9sb2d5IHJlbGF0ZWQgKi8KKwlpbnQgbnVtX2RhaXM7CisJaW50IG51bV9jb250cm9sczsKKwlpbnQgbnVtX2RhcG1fd2lkZ2V0czsKKwlpbnQgbnVtX2RhcG1fcm91dGVzOworCXVuc2lnbmVkIGxvbmcgZGFpX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHdpZGdldF9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBjb250cm9sX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHJvdXRlX29mZnNldDsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqY29udHJvbHM7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKmRhcG1fd2lkZ2V0czsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlICpkYXBtX3JvdXRlczsKKwlzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyICpkYWlzOworCisJc3RydWN0IGxpc3RfaGVhZCB3aWRnZXRfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGN0bF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgd2lkZ2V0X2N0bF9saXN0OworCisJc3RydWN0IGdiX2F1ZGlvX3RvcG9sb2d5ICp0b3BvbG9neTsKK307CisKK2ludCBnYmF1ZGlvX3RwbGdfcGFyc2VfZGF0YShzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlLAorCQkJICAgICAgIHN0cnVjdCBnYl9hdWRpb190b3BvbG9neSAqdHBsZ19kYXRhKTsKK3ZvaWQgZ2JhdWRpb190cGxnX3JlbGVhc2Uoc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKm1vZHVsZSk7CisKK2ludCBnYmF1ZGlvX21vZHVsZV91cGRhdGUoc3RydWN0IGdiYXVkaW9fY29kZWNfaW5mbyAqY29kZWMsCisJCQkgIHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJICBzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlLAorCQkJICBpbnQgZW5hYmxlKTsKK2ludCBnYmF1ZGlvX3JlZ2lzdGVyX21vZHVsZShzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlKTsKK3ZvaWQgZ2JhdWRpb191bnJlZ2lzdGVyX21vZHVsZShzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlKTsKKworLyogcHJvdG9jb2wgcmVsYXRlZCAqLworZXh0ZXJuIGludCBnYl9hdWRpb19nYl9nZXRfdG9wb2xvZ3koc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICAgIHN0cnVjdCBnYl9hdWRpb190b3BvbG9neSAqKnRvcG9sb2d5KTsKK2V4dGVybiBpbnQgZ2JfYXVkaW9fZ2JfZ2V0X2NvbnRyb2woc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICAgdTggY29udHJvbF9pZCwgdTggaW5kZXgsCisJCQkJICAgc3RydWN0IGdiX2F1ZGlvX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSk7CitleHRlcm4gaW50IGdiX2F1ZGlvX2diX3NldF9jb250cm9sKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCSAgIHU4IGNvbnRyb2xfaWQsIHU4IGluZGV4LAorCQkJCSAgIHN0cnVjdCBnYl9hdWRpb19jdGxfZWxlbV92YWx1ZSAqdmFsdWUpOworZXh0ZXJuIGludCBnYl9hdWRpb19nYl9lbmFibGVfd2lkZ2V0KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCSAgICAgdTggd2lkZ2V0X2lkKTsKK2V4dGVybiBpbnQgZ2JfYXVkaW9fZ2JfZGlzYWJsZV93aWRnZXQoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICAgICAgdTggd2lkZ2V0X2lkKTsKK2V4dGVybiBpbnQgZ2JfYXVkaW9fZ2JfZ2V0X3BjbShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCSAgICAgICB1MTYgZGF0YV9jcG9ydCwgdWludDMyX3QgKmZvcm1hdCwKKwkJCSAgICAgICB1aW50MzJfdCAqcmF0ZSwgdTggKmNoYW5uZWxzLAorCQkJICAgICAgIHU4ICpzaWdfYml0cyk7CitleHRlcm4gaW50IGdiX2F1ZGlvX2diX3NldF9wY20oc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkgICAgICAgdTE2IGRhdGFfY3BvcnQsIHVpbnQzMl90IGZvcm1hdCwKKwkJCSAgICAgICB1aW50MzJfdCByYXRlLCB1OCBjaGFubmVscywKKwkJCSAgICAgICB1OCBzaWdfYml0cyk7CitleHRlcm4gaW50IGdiX2F1ZGlvX2diX3NldF90eF9kYXRhX3NpemUoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCXUxNiBkYXRhX2Nwb3J0LCB1MTYgc2l6ZSk7CitleHRlcm4gaW50IGdiX2F1ZGlvX2diX2FjdGl2YXRlX3R4KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCSAgIHUxNiBkYXRhX2Nwb3J0KTsKK2V4dGVybiBpbnQgZ2JfYXVkaW9fZ2JfZGVhY3RpdmF0ZV90eChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkgICAgIHUxNiBkYXRhX2Nwb3J0KTsKK2V4dGVybiBpbnQgZ2JfYXVkaW9fZ2Jfc2V0X3J4X2RhdGFfc2l6ZShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJdTE2IGRhdGFfY3BvcnQsIHUxNiBzaXplKTsKK2V4dGVybiBpbnQgZ2JfYXVkaW9fZ2JfYWN0aXZhdGVfcngoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICAgdTE2IGRhdGFfY3BvcnQpOworZXh0ZXJuIGludCBnYl9hdWRpb19nYl9kZWFjdGl2YXRlX3J4KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCSAgICAgdTE2IGRhdGFfY3BvcnQpOworZXh0ZXJuIGludCBnYl9hdWRpb19hcGJyaWRnZWFfc2V0X2NvbmZpZyhzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJIF9fdTE2IGkyc19wb3J0LCBfX3UzMiBmb3JtYXQsCisJCQkJCSBfX3UzMiByYXRlLCBfX3UzMiBtY2xrX2ZyZXEpOworZXh0ZXJuIGludCBnYl9hdWRpb19hcGJyaWRnZWFfcmVnaXN0ZXJfY3BvcnQoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCSAgICAgX191MTYgaTJzX3BvcnQsIF9fdTE2IGNwb3J0aWQsCisJCQkJCSAgICAgX191OCBkaXJlY3Rpb24pOworZXh0ZXJuIGludCBnYl9hdWRpb19hcGJyaWRnZWFfdW5yZWdpc3Rlcl9jcG9ydChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJICAgICAgIF9fdTE2IGkyc19wb3J0LCBfX3UxNiBjcG9ydGlkLAorCQkJCQkgICAgICAgX191OCBkaXJlY3Rpb24pOworZXh0ZXJuIGludCBnYl9hdWRpb19hcGJyaWRnZWFfc2V0X3R4X2RhdGFfc2l6ZShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkJICAgICAgIF9fdTE2IGkyc19wb3J0LCBfX3UxNiBzaXplKTsKK2V4dGVybiBpbnQgZ2JfYXVkaW9fYXBicmlkZ2VhX3ByZXBhcmVfdHgoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCSBfX3UxNiBpMnNfcG9ydCk7CitleHRlcm4gaW50IGdiX2F1ZGlvX2FwYnJpZGdlYV9zdGFydF90eChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQkgICAgICAgX191MTYgaTJzX3BvcnQsIF9fdTY0IHRpbWVzdGFtcCk7CitleHRlcm4gaW50IGdiX2F1ZGlvX2FwYnJpZGdlYV9zdG9wX3R4KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCSAgICAgIF9fdTE2IGkyc19wb3J0KTsKK2V4dGVybiBpbnQgZ2JfYXVkaW9fYXBicmlkZ2VhX3NodXRkb3duX3R4KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCQkgIF9fdTE2IGkyc19wb3J0KTsKK2V4dGVybiBpbnQgZ2JfYXVkaW9fYXBicmlkZ2VhX3NldF9yeF9kYXRhX3NpemUoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCSAgICAgICBfX3UxNiBpMnNfcG9ydCwgX191MTYgc2l6ZSk7CitleHRlcm4gaW50IGdiX2F1ZGlvX2FwYnJpZGdlYV9wcmVwYXJlX3J4KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCQkgX191MTYgaTJzX3BvcnQpOworZXh0ZXJuIGludCBnYl9hdWRpb19hcGJyaWRnZWFfc3RhcnRfcngoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICAgICAgIF9fdTE2IGkyc19wb3J0KTsKK2V4dGVybiBpbnQgZ2JfYXVkaW9fYXBicmlkZ2VhX3N0b3Bfcngoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJICAgICAgX191MTYgaTJzX3BvcnQpOworZXh0ZXJuIGludCBnYl9hdWRpb19hcGJyaWRnZWFfc2h1dGRvd25fcngoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCSAgX191MTYgaTJzX3BvcnQpOworCisjZW5kaWYgLyogX19MSU5VWF9HQkFVRElPX0NPREVDX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX2diLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19nYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZjI4N2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19nYi5jCkBAIC0wLDAgKzEsMjI4IEBACisvKgorICogR3JleWJ1cyBBdWRpbyBEZXZpY2UgQ2xhc3MgUHJvdG9jb2wgaGVscGVycworICoKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYgR29vZ2xlIEluYy4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorI2luY2x1ZGUgImdyZXlidXNfcHJvdG9jb2xzLmgiCisjaW5jbHVkZSAib3BlcmF0aW9uLmgiCisjaW5jbHVkZSAiYXVkaW9fY29kZWMuaCIKKworLyogVE9ETzogU3BsaXQgaW50byBzZXBhcmF0ZSBjYWxscyAqLworaW50IGdiX2F1ZGlvX2diX2dldF90b3BvbG9neShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCSAgICAgc3RydWN0IGdiX2F1ZGlvX3RvcG9sb2d5ICoqdG9wb2xvZ3kpCit7CisJc3RydWN0IGdiX2F1ZGlvX2dldF90b3BvbG9neV9zaXplX3Jlc3BvbnNlIHNpemVfcmVzcDsKKwlzdHJ1Y3QgZ2JfYXVkaW9fdG9wb2xvZ3kgKnRvcG87CisJdTE2IHNpemU7CisJaW50IHJldDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sIEdCX0FVRElPX1RZUEVfR0VUX1RPUE9MT0dZX1NJWkUsCisJCQkJTlVMTCwgMCwgJnNpemVfcmVzcCwgc2l6ZW9mKHNpemVfcmVzcCkpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzaXplID0gbGUxNl90b19jcHUoc2l6ZV9yZXNwLnNpemUpOworCWlmIChzaXplIDwgc2l6ZW9mKCp0b3BvKSkKKwkJcmV0dXJuIC1FTk9EQVRBOworCisJdG9wbyA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0b3BvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sIEdCX0FVRElPX1RZUEVfR0VUX1RPUE9MT0dZLCBOVUxMLCAwLAorCQkJCXRvcG8sIHNpemUpOworCWlmIChyZXQpIHsKKwkJa2ZyZWUodG9wbyk7CisJCXJldHVybiByZXQ7CisJfQorCisJKnRvcG9sb2d5ID0gdG9wbzsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfYXVkaW9fZ2JfZ2V0X3RvcG9sb2d5KTsKKworaW50IGdiX2F1ZGlvX2diX2dldF9jb250cm9sKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJICAgIHU4IGNvbnRyb2xfaWQsIHU4IGluZGV4LAorCQkJICAgIHN0cnVjdCBnYl9hdWRpb19jdGxfZWxlbV92YWx1ZSAqdmFsdWUpCit7CisJc3RydWN0IGdiX2F1ZGlvX2dldF9jb250cm9sX3JlcXVlc3QgcmVxOworCXN0cnVjdCBnYl9hdWRpb19nZXRfY29udHJvbF9yZXNwb25zZSByZXNwOworCWludCByZXQ7CisKKwlyZXEuY29udHJvbF9pZCA9IGNvbnRyb2xfaWQ7CisJcmVxLmluZGV4ID0gaW5kZXg7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLCBHQl9BVURJT19UWVBFX0dFVF9DT05UUk9MLAorCQkJCSZyZXEsIHNpemVvZihyZXEpLCAmcmVzcCwgc2l6ZW9mKHJlc3ApKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbWVtY3B5KHZhbHVlLCAmcmVzcC52YWx1ZSwgc2l6ZW9mKCp2YWx1ZSkpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9hdWRpb19nYl9nZXRfY29udHJvbCk7CisKK2ludCBnYl9hdWRpb19nYl9zZXRfY29udHJvbChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCSAgICB1OCBjb250cm9sX2lkLCB1OCBpbmRleCwKKwkJCSAgICBzdHJ1Y3QgZ2JfYXVkaW9fY3RsX2VsZW1fdmFsdWUgKnZhbHVlKQoreworCXN0cnVjdCBnYl9hdWRpb19zZXRfY29udHJvbF9yZXF1ZXN0IHJlcTsKKworCXJlcS5jb250cm9sX2lkID0gY29udHJvbF9pZDsKKwlyZXEuaW5kZXggPSBpbmRleDsKKwltZW1jcHkoJnJlcS52YWx1ZSwgdmFsdWUsIHNpemVvZihyZXEudmFsdWUpKTsKKworCXJldHVybiBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLCBHQl9BVURJT19UWVBFX1NFVF9DT05UUk9MLAorCQkJCSAmcmVxLCBzaXplb2YocmVxKSwgTlVMTCwgMCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9hdWRpb19nYl9zZXRfY29udHJvbCk7CisKK2ludCBnYl9hdWRpb19nYl9lbmFibGVfd2lkZ2V0KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJICAgICAgdTggd2lkZ2V0X2lkKQoreworCXN0cnVjdCBnYl9hdWRpb19lbmFibGVfd2lkZ2V0X3JlcXVlc3QgcmVxOworCisJcmVxLndpZGdldF9pZCA9IHdpZGdldF9pZDsKKworCXJldHVybiBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLCBHQl9BVURJT19UWVBFX0VOQUJMRV9XSURHRVQsCisJCQkJICZyZXEsIHNpemVvZihyZXEpLCBOVUxMLCAwKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2F1ZGlvX2diX2VuYWJsZV93aWRnZXQpOworCitpbnQgZ2JfYXVkaW9fZ2JfZGlzYWJsZV93aWRnZXQoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkgICAgICAgdTggd2lkZ2V0X2lkKQoreworCXN0cnVjdCBnYl9hdWRpb19kaXNhYmxlX3dpZGdldF9yZXF1ZXN0IHJlcTsKKworCXJlcS53aWRnZXRfaWQgPSB3aWRnZXRfaWQ7CisKKwlyZXR1cm4gZ2Jfb3BlcmF0aW9uX3N5bmMoY29ubmVjdGlvbiwgR0JfQVVESU9fVFlQRV9ESVNBQkxFX1dJREdFVCwKKwkJCQkgJnJlcSwgc2l6ZW9mKHJlcSksIE5VTEwsIDApOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfYXVkaW9fZ2JfZGlzYWJsZV93aWRnZXQpOworCitpbnQgZ2JfYXVkaW9fZ2JfZ2V0X3BjbShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdTE2IGRhdGFfY3BvcnQsCisJCQl1aW50MzJfdCAqZm9ybWF0LCB1aW50MzJfdCAqcmF0ZSwgdTggKmNoYW5uZWxzLAorCQkJdTggKnNpZ19iaXRzKQoreworCXN0cnVjdCBnYl9hdWRpb19nZXRfcGNtX3JlcXVlc3QgcmVxOworCXN0cnVjdCBnYl9hdWRpb19nZXRfcGNtX3Jlc3BvbnNlIHJlc3A7CisJaW50IHJldDsKKworCXJlcS5kYXRhX2Nwb3J0ID0gY3B1X3RvX2xlMTYoZGF0YV9jcG9ydCk7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLCBHQl9BVURJT19UWVBFX0dFVF9QQ00sCisJCQkJJnJlcSwgc2l6ZW9mKHJlcSksICZyZXNwLCBzaXplb2YocmVzcCkpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkqZm9ybWF0ID0gbGUzMl90b19jcHUocmVzcC5mb3JtYXQpOworCSpyYXRlID0gbGUzMl90b19jcHUocmVzcC5yYXRlKTsKKwkqY2hhbm5lbHMgPSByZXNwLmNoYW5uZWxzOworCSpzaWdfYml0cyA9IHJlc3Auc2lnX2JpdHM7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2F1ZGlvX2diX2dldF9wY20pOworCitpbnQgZ2JfYXVkaW9fZ2Jfc2V0X3BjbShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdTE2IGRhdGFfY3BvcnQsCisJCQl1aW50MzJfdCBmb3JtYXQsIHVpbnQzMl90IHJhdGUsIHU4IGNoYW5uZWxzLAorCQkJdTggc2lnX2JpdHMpCit7CisJc3RydWN0IGdiX2F1ZGlvX3NldF9wY21fcmVxdWVzdCByZXE7CisKKwlyZXEuZGF0YV9jcG9ydCA9IGNwdV90b19sZTE2KGRhdGFfY3BvcnQpOworCXJlcS5mb3JtYXQgPSBjcHVfdG9fbGUzMihmb3JtYXQpOworCXJlcS5yYXRlID0gY3B1X3RvX2xlMzIocmF0ZSk7CisJcmVxLmNoYW5uZWxzID0gY2hhbm5lbHM7CisJcmVxLnNpZ19iaXRzID0gc2lnX2JpdHM7CisKKwlyZXR1cm4gZ2Jfb3BlcmF0aW9uX3N5bmMoY29ubmVjdGlvbiwgR0JfQVVESU9fVFlQRV9TRVRfUENNLAorCQkJCSAmcmVxLCBzaXplb2YocmVxKSwgTlVMTCwgMCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9hdWRpb19nYl9zZXRfcGNtKTsKKworaW50IGdiX2F1ZGlvX2diX3NldF90eF9kYXRhX3NpemUoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJIHUxNiBkYXRhX2Nwb3J0LCB1MTYgc2l6ZSkKK3sKKwlzdHJ1Y3QgZ2JfYXVkaW9fc2V0X3R4X2RhdGFfc2l6ZV9yZXF1ZXN0IHJlcTsKKworCXJlcS5kYXRhX2Nwb3J0ID0gY3B1X3RvX2xlMTYoZGF0YV9jcG9ydCk7CisJcmVxLnNpemUgPSBjcHVfdG9fbGUxNihzaXplKTsKKworCXJldHVybiBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLCBHQl9BVURJT19UWVBFX1NFVF9UWF9EQVRBX1NJWkUsCisJCQkJICZyZXEsIHNpemVvZihyZXEpLCBOVUxMLCAwKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2F1ZGlvX2diX3NldF90eF9kYXRhX3NpemUpOworCitpbnQgZ2JfYXVkaW9fZ2JfYWN0aXZhdGVfdHgoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkgICAgdTE2IGRhdGFfY3BvcnQpCit7CisJc3RydWN0IGdiX2F1ZGlvX2FjdGl2YXRlX3R4X3JlcXVlc3QgcmVxOworCisJcmVxLmRhdGFfY3BvcnQgPSBjcHVfdG9fbGUxNihkYXRhX2Nwb3J0KTsKKworCXJldHVybiBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLCBHQl9BVURJT19UWVBFX0FDVElWQVRFX1RYLAorCQkJCSAmcmVxLCBzaXplb2YocmVxKSwgTlVMTCwgMCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9hdWRpb19nYl9hY3RpdmF0ZV90eCk7CisKK2ludCBnYl9hdWRpb19nYl9kZWFjdGl2YXRlX3R4KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJICAgICAgdTE2IGRhdGFfY3BvcnQpCit7CisJc3RydWN0IGdiX2F1ZGlvX2RlYWN0aXZhdGVfdHhfcmVxdWVzdCByZXE7CisKKwlyZXEuZGF0YV9jcG9ydCA9IGNwdV90b19sZTE2KGRhdGFfY3BvcnQpOworCisJcmV0dXJuIGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sIEdCX0FVRElPX1RZUEVfREVBQ1RJVkFURV9UWCwKKwkJCQkgJnJlcSwgc2l6ZW9mKHJlcSksIE5VTEwsIDApOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfYXVkaW9fZ2JfZGVhY3RpdmF0ZV90eCk7CisKK2ludCBnYl9hdWRpb19nYl9zZXRfcnhfZGF0YV9zaXplKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCSB1MTYgZGF0YV9jcG9ydCwgdTE2IHNpemUpCit7CisJc3RydWN0IGdiX2F1ZGlvX3NldF9yeF9kYXRhX3NpemVfcmVxdWVzdCByZXE7CisKKwlyZXEuZGF0YV9jcG9ydCA9IGNwdV90b19sZTE2KGRhdGFfY3BvcnQpOworCXJlcS5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZSk7CisKKwlyZXR1cm4gZ2Jfb3BlcmF0aW9uX3N5bmMoY29ubmVjdGlvbiwgR0JfQVVESU9fVFlQRV9TRVRfUlhfREFUQV9TSVpFLAorCQkJCSAmcmVxLCBzaXplb2YocmVxKSwgTlVMTCwgMCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9hdWRpb19nYl9zZXRfcnhfZGF0YV9zaXplKTsKKworaW50IGdiX2F1ZGlvX2diX2FjdGl2YXRlX3J4KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJICAgIHUxNiBkYXRhX2Nwb3J0KQoreworCXN0cnVjdCBnYl9hdWRpb19hY3RpdmF0ZV9yeF9yZXF1ZXN0IHJlcTsKKworCXJlcS5kYXRhX2Nwb3J0ID0gY3B1X3RvX2xlMTYoZGF0YV9jcG9ydCk7CisKKwlyZXR1cm4gZ2Jfb3BlcmF0aW9uX3N5bmMoY29ubmVjdGlvbiwgR0JfQVVESU9fVFlQRV9BQ1RJVkFURV9SWCwKKwkJCQkgJnJlcSwgc2l6ZW9mKHJlcSksIE5VTEwsIDApOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfYXVkaW9fZ2JfYWN0aXZhdGVfcngpOworCitpbnQgZ2JfYXVkaW9fZ2JfZGVhY3RpdmF0ZV9yeChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCSAgICAgIHUxNiBkYXRhX2Nwb3J0KQoreworCXN0cnVjdCBnYl9hdWRpb19kZWFjdGl2YXRlX3J4X3JlcXVlc3QgcmVxOworCisJcmVxLmRhdGFfY3BvcnQgPSBjcHVfdG9fbGUxNihkYXRhX2Nwb3J0KTsKKworCXJldHVybiBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLCBHQl9BVURJT19UWVBFX0RFQUNUSVZBVEVfUlgsCisJCQkJICZyZXEsIHNpemVvZihyZXEpLCBOVUxMLCAwKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2F1ZGlvX2diX2RlYWN0aXZhdGVfcngpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoImdyZXlidXM6YXVkaW8tZ2IiKTsKK01PRFVMRV9ERVNDUklQVElPTigiR3JleWJ1cyBBdWRpbyBEZXZpY2UgQ2xhc3MgUHJvdG9jb2wgbGlicmFyeSIpOworTU9EVUxFX0FVVEhPUigiTWFyayBHcmVlciA8bWdyZWVyQGFuaW1hbGNyZWVrLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX21hbmFnZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX21hbmFnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTY1MDhiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fbWFuYWdlci5jCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogR3JleWJ1cyBvcGVyYXRpb25zCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiBHb29nbGUgSW5jLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9yd2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKworI2luY2x1ZGUgImF1ZGlvX21hbmFnZXIuaCIKKyNpbmNsdWRlICJhdWRpb19tYW5hZ2VyX3ByaXZhdGUuaCIKKworc3RhdGljIHN0cnVjdCBrc2V0ICptYW5hZ2VyX2tzZXQ7CisKK3N0YXRpYyBMSVNUX0hFQUQobW9kdWxlc19saXN0KTsKK3N0YXRpYyBERUNMQVJFX1JXU0VNKG1vZHVsZXNfcndzZW0pOworc3RhdGljIERFRklORV9JREEobW9kdWxlX2lkKTsKKworLyogaGVscGVycyAqLworc3RhdGljIHN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZSAqZ2JfYXVkaW9fbWFuYWdlcl9nZXRfbG9ja2VkKGludCBpZCkKK3sKKwlzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGUgKm1vZHVsZTsKKworCWlmIChpZCA8IDApCisJCXJldHVybiBOVUxMOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2R1bGUsICZtb2R1bGVzX2xpc3QsIGxpc3QpIHsKKwkJaWYgKG1vZHVsZS0+aWQgPT0gaWQpCisJCQlyZXR1cm4gbW9kdWxlOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKiBwdWJsaWMgQVBJICovCitpbnQgZ2JfYXVkaW9fbWFuYWdlcl9hZGQoc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgKmRlc2MpCit7CisJc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlICptb2R1bGU7CisJaW50IGlkOworCWludCBlcnI7CisKKwlpZCA9IGlkYV9zaW1wbGVfZ2V0KCZtb2R1bGVfaWQsIDAsIDAsIEdGUF9LRVJORUwpOworCWVyciA9IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2NyZWF0ZSgmbW9kdWxlLCBtYW5hZ2VyX2tzZXQsCisJCQkJCSAgICAgaWQsIGRlc2MpOworCWlmIChlcnIpIHsKKwkJaWRhX3NpbXBsZV9yZW1vdmUoJm1vZHVsZV9pZCwgaWQpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIEFkZCBpdCB0byB0aGUgbGlzdCAqLworCWRvd25fd3JpdGUoJm1vZHVsZXNfcndzZW0pOworCWxpc3RfYWRkX3RhaWwoJm1vZHVsZS0+bGlzdCwgJm1vZHVsZXNfbGlzdCk7CisJdXBfd3JpdGUoJm1vZHVsZXNfcndzZW0pOworCisJcmV0dXJuIG1vZHVsZS0+aWQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9hdWRpb19tYW5hZ2VyX2FkZCk7CisKK2ludCBnYl9hdWRpb19tYW5hZ2VyX3JlbW92ZShpbnQgaWQpCit7CisJc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlICptb2R1bGU7CisKKwlkb3duX3dyaXRlKCZtb2R1bGVzX3J3c2VtKTsKKworCW1vZHVsZSA9IGdiX2F1ZGlvX21hbmFnZXJfZ2V0X2xvY2tlZChpZCk7CisJaWYgKCFtb2R1bGUpIHsKKwkJdXBfd3JpdGUoJm1vZHVsZXNfcndzZW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbGlzdF9kZWwoJm1vZHVsZS0+bGlzdCk7CisJa29iamVjdF9wdXQoJm1vZHVsZS0+a29iaik7CisJdXBfd3JpdGUoJm1vZHVsZXNfcndzZW0pOworCWlkYV9zaW1wbGVfcmVtb3ZlKCZtb2R1bGVfaWQsIGlkKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2F1ZGlvX21hbmFnZXJfcmVtb3ZlKTsKKwordm9pZCBnYl9hdWRpb19tYW5hZ2VyX3JlbW92ZV9hbGwodm9pZCkKK3sKKwlzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGUgKm1vZHVsZSwgKm5leHQ7CisJaW50IGlzX2VtcHR5ID0gMTsKKworCWRvd25fd3JpdGUoJm1vZHVsZXNfcndzZW0pOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1vZHVsZSwgbmV4dCwgJm1vZHVsZXNfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmbW9kdWxlLT5saXN0KTsKKwkJa29iamVjdF9wdXQoJm1vZHVsZS0+a29iaik7CisJCWlkYV9zaW1wbGVfcmVtb3ZlKCZtb2R1bGVfaWQsIG1vZHVsZS0+aWQpOworCX0KKworCWlzX2VtcHR5ID0gbGlzdF9lbXB0eSgmbW9kdWxlc19saXN0KTsKKworCXVwX3dyaXRlKCZtb2R1bGVzX3J3c2VtKTsKKworCWlmICghaXNfZW1wdHkpCisJCXByX3dhcm4oIk5vdCBhbGwgbm9kZXMgd2VyZSBkZWxldGVkXG4iKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2F1ZGlvX21hbmFnZXJfcmVtb3ZlX2FsbCk7CisKK3N0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZSAqZ2JfYXVkaW9fbWFuYWdlcl9nZXRfbW9kdWxlKGludCBpZCkKK3sKKwlzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGUgKm1vZHVsZTsKKworCWRvd25fcmVhZCgmbW9kdWxlc19yd3NlbSk7CisJbW9kdWxlID0gZ2JfYXVkaW9fbWFuYWdlcl9nZXRfbG9ja2VkKGlkKTsKKwlrb2JqZWN0X2dldCgmbW9kdWxlLT5rb2JqKTsKKwl1cF9yZWFkKCZtb2R1bGVzX3J3c2VtKTsKKwlyZXR1cm4gbW9kdWxlOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfYXVkaW9fbWFuYWdlcl9nZXRfbW9kdWxlKTsKKwordm9pZCBnYl9hdWRpb19tYW5hZ2VyX3B1dF9tb2R1bGUoc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlICptb2R1bGUpCit7CisJa29iamVjdF9wdXQoJm1vZHVsZS0+a29iaik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9hdWRpb19tYW5hZ2VyX3B1dF9tb2R1bGUpOworCitpbnQgZ2JfYXVkaW9fbWFuYWdlcl9kdW1wX21vZHVsZShpbnQgaWQpCit7CisJc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlICptb2R1bGU7CisKKwlkb3duX3JlYWQoJm1vZHVsZXNfcndzZW0pOworCW1vZHVsZSA9IGdiX2F1ZGlvX21hbmFnZXJfZ2V0X2xvY2tlZChpZCk7CisJdXBfcmVhZCgmbW9kdWxlc19yd3NlbSk7CisKKwlpZiAoIW1vZHVsZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlnYl9hdWRpb19tYW5hZ2VyX21vZHVsZV9kdW1wKG1vZHVsZSk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9hdWRpb19tYW5hZ2VyX2R1bXBfbW9kdWxlKTsKKwordm9pZCBnYl9hdWRpb19tYW5hZ2VyX2R1bXBfYWxsKHZvaWQpCit7CisJc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlICptb2R1bGU7CisJaW50IGNvdW50ID0gMDsKKworCWRvd25fcmVhZCgmbW9kdWxlc19yd3NlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2R1bGUsICZtb2R1bGVzX2xpc3QsIGxpc3QpIHsKKwkJZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGVfZHVtcChtb2R1bGUpOworCQljb3VudCsrOworCX0KKwl1cF9yZWFkKCZtb2R1bGVzX3J3c2VtKTsKKworCXByX2luZm8oIk51bWJlciBvZiBjb25uZWN0ZWQgbW9kdWxlczogJWRcbiIsIGNvdW50KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2F1ZGlvX21hbmFnZXJfZHVtcF9hbGwpOworCisvKgorICogbW9kdWxlIGluaXQvZGVpbml0CisgKi8KK3N0YXRpYyBpbnQgX19pbml0IG1hbmFnZXJfaW5pdCh2b2lkKQoreworCW1hbmFnZXJfa3NldCA9IGtzZXRfY3JlYXRlX2FuZF9hZGQoR0JfQVVESU9fTUFOQUdFUl9OQU1FLCBOVUxMLAorCQkJCQkgICBrZXJuZWxfa29iaik7CisJaWYgKCFtYW5hZ2VyX2tzZXQpCisJCXJldHVybiAtRU5PTUVNOworCisjaWZkZWYgR0JfQVVESU9fTUFOQUdFUl9TWVNGUworCWdiX2F1ZGlvX21hbmFnZXJfc3lzZnNfaW5pdCgmbWFuYWdlcl9rc2V0LT5rb2JqKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtYW5hZ2VyX2V4aXQodm9pZCkKK3sKKwlnYl9hdWRpb19tYW5hZ2VyX3JlbW92ZV9hbGwoKTsKKwlrc2V0X3VucmVnaXN0ZXIobWFuYWdlcl9rc2V0KTsKKwlpZGFfZGVzdHJveSgmbW9kdWxlX2lkKTsKK30KKworbW9kdWxlX2luaXQobWFuYWdlcl9pbml0KTsKK21vZHVsZV9leGl0KG1hbmFnZXJfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlN2ZXRsaW4gQW5rb3YgPGFua292X3N2ZXRsaW5AcHJvamVjdGFyYS5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19tYW5hZ2VyLmggYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19tYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRjYTA5NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX21hbmFnZXIuaApAQCAtMCwwICsxLDgzIEBACisvKgorICogR3JleWJ1cyBvcGVyYXRpb25zCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiBHb29nbGUgSW5jLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpZm5kZWYgX0dCX0FVRElPX01BTkFHRVJfSF8KKyNkZWZpbmUgX0dCX0FVRElPX01BTkFHRVJfSF8KKworI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNkZWZpbmUgR0JfQVVESU9fTUFOQUdFUl9OQU1FICJnYl9hdWRpb19tYW5hZ2VyIgorI2RlZmluZSBHQl9BVURJT19NQU5BR0VSX01PRFVMRV9OQU1FX0xFTiA2NAorI2RlZmluZSBHQl9BVURJT19NQU5BR0VSX01PRFVMRV9OQU1FX0xFTl9TU0NBTkYgIjYzIgorCitzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGVfZGVzY3JpcHRvciB7CisJY2hhciBuYW1lW0dCX0FVRElPX01BTkFHRVJfTU9EVUxFX05BTUVfTEVOXTsKKwlpbnQgc2xvdDsKKwlpbnQgdmlkOworCWludCBwaWQ7CisJaW50IGNwb3J0OworCXVuc2lnbmVkIGludCBpcF9kZXZpY2VzOworCXVuc2lnbmVkIGludCBvcF9kZXZpY2VzOworfTsKKworc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlIHsKKwlzdHJ1Y3Qga29iamVjdCBrb2JqOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlpbnQgaWQ7CisJc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgZGVzYzsKK307CisKKy8qCisgKiBDcmVhdGVzIGEgbmV3IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2Rlc2NyaXB0b3IsIHVzaW5nIHRoZSBzcGVjaWZpZWQKKyAqIGRlc2NyaXB0b3IuCisgKgorICogUmV0dXJucyBhIG5lZ2F0aXZlIHJlc3VsdCBvbiBlcnJvciwgb3IgdGhlIGlkIG9mIHRoZSBuZXdseSBjcmVhdGVkIG1vZHVsZS4KKyAqCisgKi8KK2ludCBnYl9hdWRpb19tYW5hZ2VyX2FkZChzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGVfZGVzY3JpcHRvciAqZGVzYyk7CisKKy8qCisgKiBSZW1vdmVzIGEgY29ubmVjdGVkIGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgZm9yIHRoZSBzcGVjaWZpZWQgSUQuCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IuCisgKi8KK2ludCBnYl9hdWRpb19tYW5hZ2VyX3JlbW92ZShpbnQgaWQpOworCisvKgorICogUmVtb3ZlcyBhbGwgY29ubmVjdGVkIGdiX2F1ZGlvX21vZHVsZXMKKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4KKyAqLwordm9pZCBnYl9hdWRpb19tYW5hZ2VyX3JlbW92ZV9hbGwodm9pZCk7CisKKy8qCisgKiBSZXRyaWV2ZXMgYSBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZV9kZXNjcmlwdG9yIGZvciB0aGUgc3BlY2lmaWVkIGlkLgorICogUmV0dXJucyB0aGUgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGVfZGVzY3JpcHRvciBzdHJ1Y3R1cmUsCisgKiBvciBOVUxMIGlmIHRoZXJlIGlzIG5vIG1vZHVsZSB3aXRoIHRoZSBzcGVjaWZpZWQgSUQuCisgKi8KK3N0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZSAqZ2JfYXVkaW9fbWFuYWdlcl9nZXRfbW9kdWxlKGludCBpZCk7CisKKy8qCisgKiBEZWNyZWFzZXMgdGhlIHJlZmNvdW50IG9mIHRoZSBtb2R1bGUsIG9idGFpbmVkIGJ5IHRoZSBnZXQgZnVuY3Rpb24uCisgKiBNb2R1bGVzIGFyZSByZW1vdmVkIHZpYSBnYl9hdWRpb19tYW5hZ2VyX3JlbW92ZQorICovCit2b2lkIGdiX2F1ZGlvX21hbmFnZXJfcHV0X21vZHVsZShzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGUgKm1vZHVsZSk7CisKKy8qCisgKiBEdW1wcyB0aGUgbW9kdWxlIGZvciB0aGUgc3BlY2lmaWVkIGlkCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzCisgKi8KK2ludCBnYl9hdWRpb19tYW5hZ2VyX2R1bXBfbW9kdWxlKGludCBpZCk7CisKKy8qCisgKiBEdW1wcyBhbGwgY29ubmVjdGVkIG1vZHVsZXMKKyAqLwordm9pZCBnYl9hdWRpb19tYW5hZ2VyX2R1bXBfYWxsKHZvaWQpOworCisjZW5kaWYgLyogX0dCX0FVRElPX01BTkFHRVJfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX21hbmFnZXJfbW9kdWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19tYW5hZ2VyX21vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMGU5NmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19tYW5hZ2VyX21vZHVsZS5jCkBAIC0wLDAgKzEsMjU4IEBACisvKgorICogR3JleWJ1cyBvcGVyYXRpb25zCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiBHb29nbGUgSW5jLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJhdWRpb19tYW5hZ2VyLmgiCisjaW5jbHVkZSAiYXVkaW9fbWFuYWdlcl9wcml2YXRlLmgiCisKKyNkZWZpbmUgdG9fZ2JfYXVkaW9fbW9kdWxlX2F0dHIoeCkJXAorCQljb250YWluZXJfb2YoeCwgc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2F0dHJpYnV0ZSwgYXR0cikKKyNkZWZpbmUgdG9fZ2JfYXVkaW9fbW9kdWxlKHgpCQlcCisJCWNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGUsIGtvYmopCisKK3N0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZV9hdHRyaWJ1dGUgeworCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKKwlzc2l6ZV90ICgqc2hvdykoc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlICptb2R1bGUsCisJCQlzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGVfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKTsKKwlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZSAqbW9kdWxlLAorCQkJIHN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOworfTsKKworc3RhdGljIHNzaXplX3QgZ2JfYXVkaW9fbW9kdWxlX2F0dHJfc2hvdygKKwlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZV9hdHRyaWJ1dGUgKmF0dHJpYnV0ZTsKKwlzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGUgKm1vZHVsZTsKKworCWF0dHJpYnV0ZSA9IHRvX2diX2F1ZGlvX21vZHVsZV9hdHRyKGF0dHIpOworCW1vZHVsZSA9IHRvX2diX2F1ZGlvX21vZHVsZShrb2JqKTsKKworCWlmICghYXR0cmlidXRlLT5zaG93KQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBhdHRyaWJ1dGUtPnNob3cobW9kdWxlLCBhdHRyaWJ1dGUsIGJ1Zik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGdiX2F1ZGlvX21vZHVsZV9hdHRyX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCQkgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZV9hdHRyaWJ1dGUgKmF0dHJpYnV0ZTsKKwlzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGUgKm1vZHVsZTsKKworCWF0dHJpYnV0ZSA9IHRvX2diX2F1ZGlvX21vZHVsZV9hdHRyKGF0dHIpOworCW1vZHVsZSA9IHRvX2diX2F1ZGlvX21vZHVsZShrb2JqKTsKKworCWlmICghYXR0cmlidXRlLT5zdG9yZSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gYXR0cmlidXRlLT5zdG9yZShtb2R1bGUsIGF0dHJpYnV0ZSwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHN5c2ZzX29wcyBnYl9hdWRpb19tb2R1bGVfc3lzZnNfb3BzID0geworCS5zaG93ID0gZ2JfYXVkaW9fbW9kdWxlX2F0dHJfc2hvdywKKwkuc3RvcmUgPSBnYl9hdWRpb19tb2R1bGVfYXR0cl9zdG9yZSwKK307CisKK3N0YXRpYyB2b2lkIGdiX2F1ZGlvX21vZHVsZV9yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCXN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZSAqbW9kdWxlID0gdG9fZ2JfYXVkaW9fbW9kdWxlKGtvYmopOworCisJcHJfaW5mbygiRGVzdHJveWluZyBhdWRpbyBtb2R1bGUgIyVkXG4iLCBtb2R1bGUtPmlkKTsKKwkvKiBUT0RPIC0+IGRlbGV0ZSBmcm9tIGxpc3QgKi8KKwlrZnJlZShtb2R1bGUpOworfQorCitzdGF0aWMgc3NpemVfdCBnYl9hdWRpb19tb2R1bGVfbmFtZV9zaG93KAorCXN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZSAqbW9kdWxlLAorCXN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlcyIsIG1vZHVsZS0+ZGVzYy5uYW1lKTsKK30KKworc3RhdGljIHN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZV9hdHRyaWJ1dGUgZ2JfYXVkaW9fbW9kdWxlX25hbWVfYXR0cmlidXRlID0KKwlfX0FUVFIobmFtZSwgMDY2NCwgZ2JfYXVkaW9fbW9kdWxlX25hbWVfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGdiX2F1ZGlvX21vZHVsZV9zbG90X3Nob3coCisJc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlICptb2R1bGUsCisJc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkIiwgbW9kdWxlLT5kZXNjLnNsb3QpOworfQorCitzdGF0aWMgc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2F0dHJpYnV0ZSBnYl9hdWRpb19tb2R1bGVfc2xvdF9hdHRyaWJ1dGUgPQorCV9fQVRUUihzbG90LCAwNjY0LCBnYl9hdWRpb19tb2R1bGVfc2xvdF9zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZ2JfYXVkaW9fbW9kdWxlX3ZpZF9zaG93KAorCXN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZSAqbW9kdWxlLAorCXN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZCIsIG1vZHVsZS0+ZGVzYy52aWQpOworfQorCitzdGF0aWMgc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2F0dHJpYnV0ZSBnYl9hdWRpb19tb2R1bGVfdmlkX2F0dHJpYnV0ZSA9CisJX19BVFRSKHZpZCwgMDY2NCwgZ2JfYXVkaW9fbW9kdWxlX3ZpZF9zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZ2JfYXVkaW9fbW9kdWxlX3BpZF9zaG93KAorCXN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZSAqbW9kdWxlLAorCXN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZCIsIG1vZHVsZS0+ZGVzYy5waWQpOworfQorCitzdGF0aWMgc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2F0dHJpYnV0ZSBnYl9hdWRpb19tb2R1bGVfcGlkX2F0dHJpYnV0ZSA9CisJX19BVFRSKHBpZCwgMDY2NCwgZ2JfYXVkaW9fbW9kdWxlX3BpZF9zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZ2JfYXVkaW9fbW9kdWxlX2Nwb3J0X3Nob3coCisJc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlICptb2R1bGUsCisJc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkIiwgbW9kdWxlLT5kZXNjLmNwb3J0KTsKK30KKworc3RhdGljIHN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZV9hdHRyaWJ1dGUKKwkJCQkJZ2JfYXVkaW9fbW9kdWxlX2Nwb3J0X2F0dHJpYnV0ZSA9CisJX19BVFRSKGNwb3J0LCAwNjY0LCBnYl9hdWRpb19tb2R1bGVfY3BvcnRfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGdiX2F1ZGlvX21vZHVsZV9pcF9kZXZpY2VzX3Nob3coCisJc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlICptb2R1bGUsCisJc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JVgiLCBtb2R1bGUtPmRlc2MuaXBfZGV2aWNlcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGVfYXR0cmlidXRlCisJCQkJCWdiX2F1ZGlvX21vZHVsZV9pcF9kZXZpY2VzX2F0dHJpYnV0ZSA9CisJX19BVFRSKGlwX2RldmljZXMsIDA2NjQsIGdiX2F1ZGlvX21vZHVsZV9pcF9kZXZpY2VzX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBnYl9hdWRpb19tb2R1bGVfb3BfZGV2aWNlc19zaG93KAorCXN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZSAqbW9kdWxlLAorCXN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCVYIiwgbW9kdWxlLT5kZXNjLm9wX2RldmljZXMpOworfQorCitzdGF0aWMgc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2F0dHJpYnV0ZQorCQkJCQlnYl9hdWRpb19tb2R1bGVfb3BfZGV2aWNlc19hdHRyaWJ1dGUgPQorCV9fQVRUUihvcF9kZXZpY2VzLCAwNjY0LCBnYl9hdWRpb19tb2R1bGVfb3BfZGV2aWNlc19zaG93LCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmdiX2F1ZGlvX21vZHVsZV9kZWZhdWx0X2F0dHJzW10gPSB7CisJJmdiX2F1ZGlvX21vZHVsZV9uYW1lX2F0dHJpYnV0ZS5hdHRyLAorCSZnYl9hdWRpb19tb2R1bGVfc2xvdF9hdHRyaWJ1dGUuYXR0ciwKKwkmZ2JfYXVkaW9fbW9kdWxlX3ZpZF9hdHRyaWJ1dGUuYXR0ciwKKwkmZ2JfYXVkaW9fbW9kdWxlX3BpZF9hdHRyaWJ1dGUuYXR0ciwKKwkmZ2JfYXVkaW9fbW9kdWxlX2Nwb3J0X2F0dHJpYnV0ZS5hdHRyLAorCSZnYl9hdWRpb19tb2R1bGVfaXBfZGV2aWNlc19hdHRyaWJ1dGUuYXR0ciwKKwkmZ2JfYXVkaW9fbW9kdWxlX29wX2RldmljZXNfYXR0cmlidXRlLmF0dHIsCisJTlVMTCwgICAvKiBuZWVkIHRvIE5VTEwgdGVybWluYXRlIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGdiX2F1ZGlvX21vZHVsZV90eXBlID0geworCS5zeXNmc19vcHMgPSAmZ2JfYXVkaW9fbW9kdWxlX3N5c2ZzX29wcywKKwkucmVsZWFzZSA9IGdiX2F1ZGlvX21vZHVsZV9yZWxlYXNlLAorCS5kZWZhdWx0X2F0dHJzID0gZ2JfYXVkaW9fbW9kdWxlX2RlZmF1bHRfYXR0cnMsCit9OworCitzdGF0aWMgdm9pZCBzZW5kX2FkZF91ZXZlbnQoc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlICptb2R1bGUpCit7CisJY2hhciBuYW1lX3N0cmluZ1sxMjhdOworCWNoYXIgc2xvdF9zdHJpbmdbNjRdOworCWNoYXIgdmlkX3N0cmluZ1s2NF07CisJY2hhciBwaWRfc3RyaW5nWzY0XTsKKwljaGFyIGNwb3J0X3N0cmluZ1s2NF07CisJY2hhciBpcF9kZXZpY2VzX3N0cmluZ1s2NF07CisJY2hhciBvcF9kZXZpY2VzX3N0cmluZ1s2NF07CisKKwljaGFyICplbnZwW10gPSB7CisJCW5hbWVfc3RyaW5nLAorCQlzbG90X3N0cmluZywKKwkJdmlkX3N0cmluZywKKwkJcGlkX3N0cmluZywKKwkJY3BvcnRfc3RyaW5nLAorCQlpcF9kZXZpY2VzX3N0cmluZywKKwkJb3BfZGV2aWNlc19zdHJpbmcsCisJCU5VTEwKKwl9OworCisJc25wcmludGYobmFtZV9zdHJpbmcsIDEyOCwgIk5BTUU9JXMiLCBtb2R1bGUtPmRlc2MubmFtZSk7CisJc25wcmludGYoc2xvdF9zdHJpbmcsIDY0LCAiU0xPVD0lZCIsIG1vZHVsZS0+ZGVzYy5zbG90KTsKKwlzbnByaW50Zih2aWRfc3RyaW5nLCA2NCwgIlZJRD0lZCIsIG1vZHVsZS0+ZGVzYy52aWQpOworCXNucHJpbnRmKHBpZF9zdHJpbmcsIDY0LCAiUElEPSVkIiwgbW9kdWxlLT5kZXNjLnBpZCk7CisJc25wcmludGYoY3BvcnRfc3RyaW5nLCA2NCwgIkNQT1JUPSVkIiwgbW9kdWxlLT5kZXNjLmNwb3J0KTsKKwlzbnByaW50ZihpcF9kZXZpY2VzX3N0cmluZywgNjQsICJJL1AgREVWSUNFUz0weCVYIiwKKwkJIG1vZHVsZS0+ZGVzYy5pcF9kZXZpY2VzKTsKKwlzbnByaW50ZihvcF9kZXZpY2VzX3N0cmluZywgNjQsICJPL1AgREVWSUNFUz0weCVYIiwKKwkJIG1vZHVsZS0+ZGVzYy5vcF9kZXZpY2VzKTsKKworCWtvYmplY3RfdWV2ZW50X2VudigmbW9kdWxlLT5rb2JqLCBLT0JKX0FERCwgZW52cCk7Cit9CisKK2ludCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZV9jcmVhdGUoCisJc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlICoqbW9kdWxlLAorCXN0cnVjdCBrc2V0ICptYW5hZ2VyX2tzZXQsCisJaW50IGlkLCBzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGVfZGVzY3JpcHRvciAqZGVzYykKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZSAqbTsKKworCW0gPSBremFsbG9jKHNpemVvZigqbSksIEdGUF9BVE9NSUMpOworCWlmICghbSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBJbml0aWFsaXplIHRoZSBub2RlICovCisJSU5JVF9MSVNUX0hFQUQoJm0tPmxpc3QpOworCisJLyogU2V0IHRoZSBtb2R1bGUgaWQgKi8KKwltLT5pZCA9IGlkOworCisJLyogQ29weSB0aGUgcHJvdmlkZWQgZGVzY3JpcHRvciAqLworCW1lbWNweSgmbS0+ZGVzYywgZGVzYywgc2l6ZW9mKCpkZXNjKSk7CisKKwkvKiBzZXQgdGhlIGtzZXQgKi8KKwltLT5rb2JqLmtzZXQgPSBtYW5hZ2VyX2tzZXQ7CisKKwkvKgorCSAqIEluaXRpYWxpemUgYW5kIGFkZCB0aGUga29iamVjdCB0byB0aGUga2VybmVsLiAgQWxsIHRoZSBkZWZhdWx0IGZpbGVzCisJICogd2lsbCBiZSBjcmVhdGVkIGhlcmUuICBBcyB3ZSBoYXZlIGFscmVhZHkgc3BlY2lmaWVkIGEga3NldCBmb3IgdGhpcworCSAqIGtvYmplY3QsIHdlIGRvbid0IGhhdmUgdG8gc2V0IGEgcGFyZW50IGZvciB0aGUga29iamVjdCwgdGhlIGtvYmplY3QKKwkgKiB3aWxsIGJlIHBsYWNlZCBiZW5lYXRoIHRoYXQga3NldCBhdXRvbWF0aWNhbGx5LgorCSAqLworCWVyciA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZtLT5rb2JqLCAmZ2JfYXVkaW9fbW9kdWxlX3R5cGUsIE5VTEwsICIlZCIsCisJCQkJICAgaWQpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJmYWlsZWQgaW5pdGlhbGl6aW5nIGtvYmplY3QgZm9yIGF1ZGlvIG1vZHVsZSAjJWRcbiIsCisJCSAgICAgICBpZCk7CisJCWtvYmplY3RfcHV0KCZtLT5rb2JqKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKgorCSAqIE5vdGlmeSB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkCisJICovCisJc2VuZF9hZGRfdWV2ZW50KG0pOworCisJKm1vZHVsZSA9IG07CisJcHJfaW5mbygiQ3JlYXRlZCBhdWRpbyBtb2R1bGUgIyVkXG4iLCBpZCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGVfZHVtcChzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGUgKm1vZHVsZSkKK3sKKwlwcl9pbmZvKCJhdWRpbyBtb2R1bGUgIyVkIG5hbWU9JXMgc2xvdD0lZCB2aWQ9JWQgcGlkPSVkIGNwb3J0PSVkIGkvcCBkZXZpY2VzPTB4JVggby9wIGRldmljZXM9MHglWFxuIiwKKwkJbW9kdWxlLT5pZCwKKwkJbW9kdWxlLT5kZXNjLm5hbWUsCisJCW1vZHVsZS0+ZGVzYy5zbG90LAorCQltb2R1bGUtPmRlc2MudmlkLAorCQltb2R1bGUtPmRlc2MucGlkLAorCQltb2R1bGUtPmRlc2MuY3BvcnQsCisJCW1vZHVsZS0+ZGVzYy5pcF9kZXZpY2VzLAorCQltb2R1bGUtPmRlc2Mub3BfZGV2aWNlcyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19tYW5hZ2VyX3ByaXZhdGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX21hbmFnZXJfcHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OWNlOTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19tYW5hZ2VyX3ByaXZhdGUuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogR3JleWJ1cyBvcGVyYXRpb25zCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiBHb29nbGUgSW5jLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpZm5kZWYgX0dCX0FVRElPX01BTkFHRVJfUFJJVkFURV9IXworI2RlZmluZSBfR0JfQVVESU9fTUFOQUdFUl9QUklWQVRFX0hfCisKKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisKKyNpbmNsdWRlICJhdWRpb19tYW5hZ2VyLmgiCisKK2ludCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZV9jcmVhdGUoCisJc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlICoqbW9kdWxlLAorCXN0cnVjdCBrc2V0ICptYW5hZ2VyX2tzZXQsCisJaW50IGlkLCBzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGVfZGVzY3JpcHRvciAqZGVzYyk7CisKKy8qIG1vZHVsZSBkZXN0cm95ZWQgdmlhIGtvYmplY3RfcHV0ICovCisKK3ZvaWQgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGVfZHVtcChzdHJ1Y3QgZ2JfYXVkaW9fbWFuYWdlcl9tb2R1bGUgKm1vZHVsZSk7CisKKy8qIHN5c2ZzIGNvbnRyb2wgKi8KK3ZvaWQgZ2JfYXVkaW9fbWFuYWdlcl9zeXNmc19pbml0KHN0cnVjdCBrb2JqZWN0ICprb2JqKTsKKworI2VuZGlmIC8qIF9HQl9BVURJT19NQU5BR0VSX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX21hbmFnZXJfc3lzZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX21hbmFnZXJfc3lzZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGJmODU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fbWFuYWdlcl9zeXNmcy5jCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogR3JleWJ1cyBvcGVyYXRpb25zCisgKgorICogQ29weXJpZ2h0IDIwMTUtMjAxNiBHb29nbGUgSW5jLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorCisjaW5jbHVkZSAiYXVkaW9fbWFuYWdlci5oIgorI2luY2x1ZGUgImF1ZGlvX21hbmFnZXJfcHJpdmF0ZS5oIgorCitzdGF0aWMgc3NpemVfdCBtYW5hZ2VyX3N5c2ZzX2FkZF9zdG9yZSgKKwlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBnYl9hdWRpb19tYW5hZ2VyX21vZHVsZV9kZXNjcmlwdG9yIGRlc2MgPSB7IHswfSB9OworCisJaW50IG51bSA9IHNzY2FuZihidWYsCisJCQkibmFtZT0lIiBHQl9BVURJT19NQU5BR0VSX01PRFVMRV9OQU1FX0xFTl9TU0NBTkYgInMgIgorCQkJInNsb3Q9JWQgdmlkPSVkIHBpZD0lZCBjcG9ydD0lZCBpL3AgZGV2aWNlcz0weCVYIgorCQkJIm8vcCBkZXZpY2VzPTB4JVgiLAorCQkJZGVzYy5uYW1lLCAmZGVzYy5zbG90LCAmZGVzYy52aWQsICZkZXNjLnBpZCwKKwkJCSZkZXNjLmNwb3J0LCAmZGVzYy5pcF9kZXZpY2VzLCAmZGVzYy5vcF9kZXZpY2VzKTsKKworCWlmIChudW0gIT0gNykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwludW0gPSBnYl9hdWRpb19tYW5hZ2VyX2FkZCgmZGVzYyk7CisJaWYgKG51bSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIG1hbmFnZXJfYWRkX2F0dHJpYnV0ZSA9CisJX19BVFRSKGFkZCwgMDY2NCwgTlVMTCwgbWFuYWdlcl9zeXNmc19hZGRfc3RvcmUpOworCitzdGF0aWMgc3NpemVfdCBtYW5hZ2VyX3N5c2ZzX3JlbW92ZV9zdG9yZSgKKwlzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCBpZDsKKworCWludCBudW0gPSBzc2NhbmYoYnVmLCAiJWQiLCAmaWQpOworCisJaWYgKG51bSAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW51bSA9IGdiX2F1ZGlvX21hbmFnZXJfcmVtb3ZlKGlkKTsKKwlpZiAobnVtKQorCQlyZXR1cm4gbnVtOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIG1hbmFnZXJfcmVtb3ZlX2F0dHJpYnV0ZSA9CisJX19BVFRSKHJlbW92ZSwgMDY2NCwgTlVMTCwgbWFuYWdlcl9zeXNmc19yZW1vdmVfc3RvcmUpOworCitzdGF0aWMgc3NpemVfdCBtYW5hZ2VyX3N5c2ZzX2R1bXBfc3RvcmUoCisJc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKKwljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgaWQ7CisKKwlpbnQgbnVtID0gc3NjYW5mKGJ1ZiwgIiVkIiwgJmlkKTsKKworCWlmIChudW0gPT0gMSkgeworCQludW0gPSBnYl9hdWRpb19tYW5hZ2VyX2R1bXBfbW9kdWxlKGlkKTsKKwkJaWYgKG51bSkKKwkJCXJldHVybiBudW07CisJfSBlbHNlIGlmICghc3RybmNtcCgiYWxsIiwgYnVmLCAzKSkKKwkJZ2JfYXVkaW9fbWFuYWdlcl9kdW1wX2FsbCgpOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgbWFuYWdlcl9kdW1wX2F0dHJpYnV0ZSA9CisJX19BVFRSKGR1bXAsIDA2NjQsIE5VTEwsIG1hbmFnZXJfc3lzZnNfZHVtcF9zdG9yZSk7CisKK3N0YXRpYyB2b2lkIG1hbmFnZXJfc3lzZnNfaW5pdF9hdHRyaWJ1dGUoCisJCXN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmthdHRyKQoreworCWludCBlcnI7CisKKwllcnIgPSBzeXNmc19jcmVhdGVfZmlsZShrb2JqLCAma2F0dHItPmF0dHIpOworCWlmIChlcnIpIHsKKwkJcHJfd2FybigiY3JlYXRpbmcgdGhlIHN5c2ZzIGVudHJ5IGZvciAlcyBmYWlsZWQ6ICVkXG4iLAorCQkJa2F0dHItPmF0dHIubmFtZSwgZXJyKTsKKwl9Cit9CisKK3ZvaWQgZ2JfYXVkaW9fbWFuYWdlcl9zeXNmc19pbml0KHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCW1hbmFnZXJfc3lzZnNfaW5pdF9hdHRyaWJ1dGUoa29iaiwgJm1hbmFnZXJfYWRkX2F0dHJpYnV0ZSk7CisJbWFuYWdlcl9zeXNmc19pbml0X2F0dHJpYnV0ZShrb2JqLCAmbWFuYWdlcl9yZW1vdmVfYXR0cmlidXRlKTsKKwltYW5hZ2VyX3N5c2ZzX2luaXRfYXR0cmlidXRlKGtvYmosICZtYW5hZ2VyX2R1bXBfYXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX21vZHVsZS5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fbW9kdWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUxYzBmYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX21vZHVsZS5jCkBAIC0wLDAgKzEsNDgyIEBACisvKgorICogR3JleWJ1cyBhdWRpbyBkcml2ZXIKKyAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNSBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorCisjaW5jbHVkZSAiYXVkaW9fY29kZWMuaCIKKyNpbmNsdWRlICJhdWRpb19hcGJyaWRnZWEuaCIKKyNpbmNsdWRlICJhdWRpb19tYW5hZ2VyLmgiCisKKy8qCisgKiBnYl9zbmQgbWFuYWdlbWVudCBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW50IGdiYXVkaW9fcmVxdWVzdF9qYWNrKHN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGUsCisJCQkJICBzdHJ1Y3QgZ2JfYXVkaW9famFja19ldmVudF9yZXF1ZXN0ICpyZXEpCit7CisJaW50IHJlcG9ydDsKKwlzdHJ1Y3Qgc25kX2phY2sgKmphY2sgPSBtb2R1bGUtPmhlYWRzZXRfamFjay5qYWNrOworCXN0cnVjdCBzbmRfamFjayAqYnRuX2phY2sgPSBtb2R1bGUtPmJ1dHRvbl9qYWNrLmphY2s7CisKKwlpZiAoIWphY2spIHsKKwkJZGV2X2Vycl9yYXRlbGltaXRlZChtb2R1bGUtPmRldiwKKwkJCSJJbnZhbGlkIGphY2sgZXZlbnQgcmVjZWl2ZWQ6dHlwZTogJXUsIGV2ZW50OiAldVxuIiwKKwkJCXJlcS0+amFja19hdHRyaWJ1dGUsIHJlcS0+ZXZlbnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfd2Fybl9yYXRlbGltaXRlZChtb2R1bGUtPmRldiwKKwkJCSAgICAgIkphY2sgRXZlbnQgcmVjZWl2ZWQ6IHR5cGU6ICV1LCBldmVudDogJXVcbiIsCisJCQkgICAgIHJlcS0+amFja19hdHRyaWJ1dGUsIHJlcS0+ZXZlbnQpOworCisJaWYgKHJlcS0+ZXZlbnQgPT0gR0JfQVVESU9fSkFDS19FVkVOVF9SRU1PVkFMKSB7CisJCW1vZHVsZS0+amFja190eXBlID0gMDsKKwkJaWYgKGJ0bl9qYWNrICYmIG1vZHVsZS0+YnV0dG9uX3N0YXR1cykgeworCQkJc25kX3NvY19qYWNrX3JlcG9ydCgmbW9kdWxlLT5idXR0b25famFjaywgMCwKKwkJCQkJICAgIG1vZHVsZS0+YnV0dG9uX21hc2spOworCQkJbW9kdWxlLT5idXR0b25fc3RhdHVzID0gMDsKKwkJfQorCQlzbmRfc29jX2phY2tfcmVwb3J0KCZtb2R1bGUtPmhlYWRzZXRfamFjaywgMCwKKwkJCQkgICAgbW9kdWxlLT5qYWNrX21hc2spOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXBvcnQgPSByZXEtPmphY2tfYXR0cmlidXRlICYgbW9kdWxlLT5qYWNrX21hc2s7CisJaWYgKCFyZXBvcnQpIHsKKwkJZGV2X2Vycl9yYXRlbGltaXRlZChtb2R1bGUtPmRldiwKKwkJCSJJbnZhbGlkIGphY2sgZXZlbnQgcmVjZWl2ZWQ6dHlwZTogJXUsIGV2ZW50OiAldVxuIiwKKwkJCXJlcS0+amFja19hdHRyaWJ1dGUsIHJlcS0+ZXZlbnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobW9kdWxlLT5qYWNrX3R5cGUpCisJCWRldl93YXJuX3JhdGVsaW1pdGVkKG1vZHVsZS0+ZGV2LAorCQkJCSAgICAgIk1vZGlmeWluZyBqYWNrIGZyb20gJWQgdG8gJWRcbiIsCisJCQkJICAgICBtb2R1bGUtPmphY2tfdHlwZSwgcmVwb3J0KTsKKworCW1vZHVsZS0+amFja190eXBlID0gcmVwb3J0OworCXNuZF9zb2NfamFja19yZXBvcnQoJm1vZHVsZS0+aGVhZHNldF9qYWNrLCByZXBvcnQsIG1vZHVsZS0+amFja19tYXNrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiYXVkaW9fcmVxdWVzdF9idXR0b24oc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKm1vZHVsZSwKKwkJCQkgIHN0cnVjdCBnYl9hdWRpb19idXR0b25fZXZlbnRfcmVxdWVzdCAqcmVxKQoreworCWludCBzb2NfYnV0dG9uX2lkLCByZXBvcnQ7CisJc3RydWN0IHNuZF9qYWNrICpidG5famFjayA9IG1vZHVsZS0+YnV0dG9uX2phY2suamFjazsKKworCWlmICghYnRuX2phY2spIHsKKwkJZGV2X2Vycl9yYXRlbGltaXRlZChtb2R1bGUtPmRldiwKKwkJCSJJbnZhbGlkIGJ1dHRvbiBldmVudCByZWNlaXZlZDp0eXBlOiAldSwgZXZlbnQ6ICV1XG4iLAorCQkJcmVxLT5idXR0b25faWQsIHJlcS0+ZXZlbnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfd2Fybl9yYXRlbGltaXRlZChtb2R1bGUtPmRldiwKKwkJCSAgICAgIkJ1dHRvbiBFdmVudCByZWNlaXZlZDogaWQ6ICV1LCBldmVudDogJXVcbiIsCisJCQkgICAgIHJlcS0+YnV0dG9uX2lkLCByZXEtPmV2ZW50KTsKKworCS8qIGN1cnJlbnRseSBzdXBwb3J0cyA0IGJ1dHRvbnMgb25seSAqLworCWlmICghbW9kdWxlLT5qYWNrX3R5cGUpIHsKKwkJZGV2X2Vycl9yYXRlbGltaXRlZChtb2R1bGUtPmRldiwKKwkJCQkgICAgIkphY2sgbm90IHByZXNlbnQuIEJvZ3VzIGV2ZW50ISFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXBvcnQgPSBtb2R1bGUtPmJ1dHRvbl9zdGF0dXMgJiBtb2R1bGUtPmJ1dHRvbl9tYXNrOworCXNvY19idXR0b25faWQgPSAwOworCisJc3dpdGNoIChyZXEtPmJ1dHRvbl9pZCkgeworCWNhc2UgMToKKwkJc29jX2J1dHRvbl9pZCA9IFNORF9KQUNLX0JUTl8wICYgbW9kdWxlLT5idXR0b25fbWFzazsKKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCXNvY19idXR0b25faWQgPSBTTkRfSkFDS19CVE5fMSAmIG1vZHVsZS0+YnV0dG9uX21hc2s7CisJCWJyZWFrOworCisJY2FzZSAzOgorCQlzb2NfYnV0dG9uX2lkID0gU05EX0pBQ0tfQlROXzIgJiBtb2R1bGUtPmJ1dHRvbl9tYXNrOworCQlicmVhazsKKworCWNhc2UgNDoKKwkJc29jX2J1dHRvbl9pZCA9IFNORF9KQUNLX0JUTl8zICYgbW9kdWxlLT5idXR0b25fbWFzazsKKwkJYnJlYWs7CisJfQorCisJaWYgKCFzb2NfYnV0dG9uX2lkKSB7CisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQobW9kdWxlLT5kZXYsCisJCQkJICAgICJJbnZhbGlkIGJ1dHRvbiByZXF1ZXN0IHJlY2VpdmVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHJlcS0+ZXZlbnQgPT0gR0JfQVVESU9fQlVUVE9OX0VWRU5UX1BSRVNTKQorCQlyZXBvcnQgPSByZXBvcnQgfCBzb2NfYnV0dG9uX2lkOworCWVsc2UKKwkJcmVwb3J0ID0gcmVwb3J0ICYgfnNvY19idXR0b25faWQ7CisKKwltb2R1bGUtPmJ1dHRvbl9zdGF0dXMgPSByZXBvcnQ7CisKKwlzbmRfc29jX2phY2tfcmVwb3J0KCZtb2R1bGUtPmJ1dHRvbl9qYWNrLCByZXBvcnQsIG1vZHVsZS0+YnV0dG9uX21hc2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JhdWRpb19yZXF1ZXN0X3N0cmVhbShzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlLAorCQkJCSAgc3RydWN0IGdiX2F1ZGlvX3N0cmVhbWluZ19ldmVudF9yZXF1ZXN0ICpyZXEpCit7CisJZGV2X3dhcm4obW9kdWxlLT5kZXYsICJBdWRpbyBFdmVudCByZWNlaXZlZDogY3BvcnQ6ICV1LCBldmVudDogJXVcbiIsCisJCSByZXEtPmRhdGFfY3BvcnQsIHJlcS0+ZXZlbnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JhdWRpb19jb2RlY19yZXF1ZXN0X2hhbmRsZXIoc3RydWN0IGdiX29wZXJhdGlvbiAqb3ApCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBvcC0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlID0KKwkJZ3JleWJ1c19nZXRfZHJ2ZGF0YShjb25uZWN0aW9uLT5idW5kbGUpOworCXN0cnVjdCBnYl9vcGVyYXRpb25fbXNnX2hkciAqaGVhZGVyID0gb3AtPnJlcXVlc3QtPmhlYWRlcjsKKwlzdHJ1Y3QgZ2JfYXVkaW9fc3RyZWFtaW5nX2V2ZW50X3JlcXVlc3QgKnN0cmVhbV9yZXE7CisJc3RydWN0IGdiX2F1ZGlvX2phY2tfZXZlbnRfcmVxdWVzdCAqamFja19yZXE7CisJc3RydWN0IGdiX2F1ZGlvX2J1dHRvbl9ldmVudF9yZXF1ZXN0ICpidXR0b25fcmVxOworCWludCByZXQ7CisKKwlzd2l0Y2ggKGhlYWRlci0+dHlwZSkgeworCWNhc2UgR0JfQVVESU9fVFlQRV9TVFJFQU1JTkdfRVZFTlQ6CisJCXN0cmVhbV9yZXEgPSBvcC0+cmVxdWVzdC0+cGF5bG9hZDsKKwkJcmV0ID0gZ2JhdWRpb19yZXF1ZXN0X3N0cmVhbShtb2R1bGUsIHN0cmVhbV9yZXEpOworCQlicmVhazsKKworCWNhc2UgR0JfQVVESU9fVFlQRV9KQUNLX0VWRU5UOgorCQlqYWNrX3JlcSA9IG9wLT5yZXF1ZXN0LT5wYXlsb2FkOworCQlyZXQgPSBnYmF1ZGlvX3JlcXVlc3RfamFjayhtb2R1bGUsIGphY2tfcmVxKTsKKwkJYnJlYWs7CisKKwljYXNlIEdCX0FVRElPX1RZUEVfQlVUVE9OX0VWRU5UOgorCQlidXR0b25fcmVxID0gb3AtPnJlcXVlc3QtPnBheWxvYWQ7CisJCXJldCA9IGdiYXVkaW9fcmVxdWVzdF9idXR0b24obW9kdWxlLCBidXR0b25fcmVxKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyX3JhdGVsaW1pdGVkKCZjb25uZWN0aW9uLT5idW5kbGUtPmRldiwKKwkJCQkgICAgIkludmFsaWQgQXVkaW8gRXZlbnQgcmVjZWl2ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX2F1ZGlvX2FkZF9tZ210X2Nvbm5lY3Rpb24oc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKmdibW9kdWxlLAorCQkJCXN0cnVjdCBncmV5YnVzX2Rlc2NyaXB0b3JfY3BvcnQgKmNwb3J0X2Rlc2MsCisJCQkJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCisJLyogTWFuYWdlbWVudCBDcG9ydCAqLworCWlmIChnYm1vZHVsZS0+bWdtdF9jb25uZWN0aW9uKSB7CisJCWRldl9lcnIoJmJ1bmRsZS0+ZGV2LAorCQkJIkNhbid0IGhhdmUgbXVsdGlwbGUgTWFuYWdlbWVudCBjb25uZWN0aW9uc1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWNvbm5lY3Rpb24gPSBnYl9jb25uZWN0aW9uX2NyZWF0ZShidW5kbGUsIGxlMTZfdG9fY3B1KGNwb3J0X2Rlc2MtPmlkKSwKKwkJCQkJICBnYmF1ZGlvX2NvZGVjX3JlcXVlc3RfaGFuZGxlcik7CisJaWYgKElTX0VSUihjb25uZWN0aW9uKSkKKwkJcmV0dXJuIFBUUl9FUlIoY29ubmVjdGlvbik7CisKKwlncmV5YnVzX3NldF9kcnZkYXRhKGJ1bmRsZSwgZ2Jtb2R1bGUpOworCWdibW9kdWxlLT5tZ210X2Nvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JfYXVkaW9fYWRkX2RhdGFfY29ubmVjdGlvbihzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqZ2Jtb2R1bGUsCisJCQkJc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcl9jcG9ydCAqY3BvcnRfZGVzYywKKwkJCQlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisJc3RydWN0IGdiYXVkaW9fZGF0YV9jb25uZWN0aW9uICpkYWk7CisKKwlkYWkgPSBkZXZtX2t6YWxsb2MoZ2Jtb2R1bGUtPmRldiwgc2l6ZW9mKCpkYWkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhaSkgeworCQlkZXZfZXJyKGdibW9kdWxlLT5kZXYsICJEQUkgTWFsbG9jIGZhaWx1cmVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljb25uZWN0aW9uID0gZ2JfY29ubmVjdGlvbl9jcmVhdGVfb2ZmbG9hZGVkKGJ1bmRsZSwKKwkJCQkJbGUxNl90b19jcHUoY3BvcnRfZGVzYy0+aWQpLAorCQkJCQlHQl9DT05ORUNUSU9OX0ZMQUdfQ1NEKTsKKwlpZiAoSVNfRVJSKGNvbm5lY3Rpb24pKSB7CisJCWRldm1fa2ZyZWUoZ2Jtb2R1bGUtPmRldiwgZGFpKTsKKwkJcmV0dXJuIFBUUl9FUlIoY29ubmVjdGlvbik7CisJfQorCisJZ3JleWJ1c19zZXRfZHJ2ZGF0YShidW5kbGUsIGdibW9kdWxlKTsKKwlkYWktPmlkID0gMDsKKwlkYWktPmRhdGFfY3BvcnQgPSBjb25uZWN0aW9uLT5pbnRmX2Nwb3J0X2lkOworCWRhaS0+Y29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisJbGlzdF9hZGQoJmRhaS0+bGlzdCwgJmdibW9kdWxlLT5kYXRhX2xpc3QpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBiYXNpYyBob29rIGdldCB0aGluZ3MgaW5pdGlhbGl6ZWQgYW5kIHJlZ2lzdGVyZWQgdy8gZ2IKKyAqLworCitzdGF0aWMgaW50IGdiX2F1ZGlvX3Byb2JlKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSwKKwkJCSAgY29uc3Qgc3RydWN0IGdyZXlidXNfYnVuZGxlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYnVuZGxlLT5kZXY7CisJc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKmdibW9kdWxlOworCXN0cnVjdCBncmV5YnVzX2Rlc2NyaXB0b3JfY3BvcnQgKmNwb3J0X2Rlc2M7CisJc3RydWN0IGdiX2F1ZGlvX21hbmFnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgZGVzYzsKKwlzdHJ1Y3QgZ2JhdWRpb19kYXRhX2Nvbm5lY3Rpb24gKmRhaSwgKl9kYWk7CisJaW50IHJldCwgaTsKKwlzdHJ1Y3QgZ2JfYXVkaW9fdG9wb2xvZ3kgKnRvcG9sb2d5OworCisJLyogVGhlcmUgc2hvdWxkIGJlIGF0IGxlYXN0IG9uZSBNYW5hZ2VtZW50IGFuZCBvbmUgRGF0YSBjcG9ydCAqLworCWlmIChidW5kbGUtPm51bV9jcG9ydHMgPCAyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qCisJICogVGhlcmUgY2FuIGJlIG9ubHkgb25lIE1hbmFnZW1lbnQgY29ubmVjdGlvbiBhbmQgYW55IG51bWJlciBvZiBkYXRhCisJICogY29ubmVjdGlvbnMuCisJICovCisJZ2Jtb2R1bGUgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmdibW9kdWxlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFnYm1vZHVsZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlnYm1vZHVsZS0+bnVtX2RhdGFfY29ubmVjdGlvbnMgPSBidW5kbGUtPm51bV9jcG9ydHMgLSAxOworCUlOSVRfTElTVF9IRUFEKCZnYm1vZHVsZS0+ZGF0YV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZ2Jtb2R1bGUtPndpZGdldF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZ2Jtb2R1bGUtPmN0bF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZ2Jtb2R1bGUtPndpZGdldF9jdGxfbGlzdCk7CisJZ2Jtb2R1bGUtPmRldiA9IGRldjsKKwlzbnByaW50ZihnYm1vZHVsZS0+bmFtZSwgTkFNRV9TSVpFLCAiJXMuJXMiLCBkZXYtPmRyaXZlci0+bmFtZSwKKwkJIGRldl9uYW1lKGRldikpOworCWdyZXlidXNfc2V0X2RydmRhdGEoYnVuZGxlLCBnYm1vZHVsZSk7CisKKwkvKiBDcmVhdGUgYWxsIGNvbm5lY3Rpb25zICovCisJZm9yIChpID0gMDsgaSA8IGJ1bmRsZS0+bnVtX2Nwb3J0czsgaSsrKSB7CisJCWNwb3J0X2Rlc2MgPSAmYnVuZGxlLT5jcG9ydF9kZXNjW2ldOworCisJCXN3aXRjaCAoY3BvcnRfZGVzYy0+cHJvdG9jb2xfaWQpIHsKKwkJY2FzZSBHUkVZQlVTX1BST1RPQ09MX0FVRElPX01HTVQ6CisJCQlyZXQgPSBnYl9hdWRpb19hZGRfbWdtdF9jb25uZWN0aW9uKGdibW9kdWxlLCBjcG9ydF9kZXNjLAorCQkJCQkJCSAgIGJ1bmRsZSk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZGVzdHJveV9jb25uZWN0aW9uczsKKwkJCWJyZWFrOworCQljYXNlIEdSRVlCVVNfUFJPVE9DT0xfQVVESU9fREFUQToKKwkJCXJldCA9IGdiX2F1ZGlvX2FkZF9kYXRhX2Nvbm5lY3Rpb24oZ2Jtb2R1bGUsIGNwb3J0X2Rlc2MsCisJCQkJCQkJICAgYnVuZGxlKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBkZXN0cm95X2Nvbm5lY3Rpb25zOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfZXJyKGRldiwgIlVuc3VwcG9ydGVkIHByb3RvY29sOiAweCUwMnhcbiIsCisJCQkJY3BvcnRfZGVzYy0+cHJvdG9jb2xfaWQpOworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCWdvdG8gZGVzdHJveV9jb25uZWN0aW9uczsKKwkJfQorCX0KKworCS8qIFRoZXJlIG11c3QgYmUgYSBtYW5hZ2VtZW50IGNwb3J0ICovCisJaWYgKCFnYm1vZHVsZS0+bWdtdF9jb25uZWN0aW9uKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWRldl9lcnIoZGV2LCAiTWlzc2luZyBtYW5hZ2VtZW50IGNvbm5lY3Rpb25cbiIpOworCQlnb3RvIGRlc3Ryb3lfY29ubmVjdGlvbnM7CisJfQorCisJLyogSW5pdGlhbGl6ZSBtYW5hZ2VtZW50IGNvbm5lY3Rpb24gKi8KKwlyZXQgPSBnYl9jb25uZWN0aW9uX2VuYWJsZShnYm1vZHVsZS0+bWdtdF9jb25uZWN0aW9uKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiJWQ6IEVycm9yIHdoaWxlIGVuYWJsaW5nIG1nbXQgY29ubmVjdGlvblxuIiwgcmV0KTsKKwkJZ290byBkZXN0cm95X2Nvbm5lY3Rpb25zOworCX0KKwlnYm1vZHVsZS0+ZGV2X2lkID0gZ2Jtb2R1bGUtPm1nbXRfY29ubmVjdGlvbi0+aW50Zi0+aW50ZXJmYWNlX2lkOworCisJLyoKKwkgKiBGSVhNRTogbWFsbG9jIGZvciB0b3BvbG9neSBoYXBwZW5zIHZpYSBhdWRpb19nYiBkcml2ZXIKKwkgKiBzaG91bGQgYmUgZG9uZSB3aXRoaW4gY29kZWMgZHJpdmVyIGl0c2VsZgorCSAqLworCXJldCA9IGdiX2F1ZGlvX2diX2dldF90b3BvbG9neShnYm1vZHVsZS0+bWdtdF9jb25uZWN0aW9uLCAmdG9wb2xvZ3kpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICIlZDpFcnJvciB3aGlsZSBmZXRjaGluZyB0b3BvbG9neVxuIiwgcmV0KTsKKwkJZ290byBkaXNhYmxlX2Nvbm5lY3Rpb247CisJfQorCisJLyogcHJvY2VzcyB0b3BvbG9neSBkYXRhICovCisJcmV0ID0gZ2JhdWRpb190cGxnX3BhcnNlX2RhdGEoZ2Jtb2R1bGUsIHRvcG9sb2d5KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiJWQ6RXJyb3Igd2hpbGUgcGFyc2luZyB0b3BvbG9neSBkYXRhXG4iLAorCQkJICByZXQpOworCQlnb3RvIGZyZWVfdG9wb2xvZ3k7CisJfQorCWdibW9kdWxlLT50b3BvbG9neSA9IHRvcG9sb2d5OworCisJLyogSW5pdGlhbGl6ZSBkYXRhIGNvbm5lY3Rpb25zICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkYWksICZnYm1vZHVsZS0+ZGF0YV9saXN0LCBsaXN0KSB7CisJCXJldCA9IGdiX2Nvbm5lY3Rpb25fZW5hYmxlKGRhaS0+Y29ubmVjdGlvbik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGV2LAorCQkJCSIlZDpFcnJvciB3aGlsZSBlbmFibGluZyAlZDpkYXRhIGNvbm5lY3Rpb25cbiIsCisJCQkJcmV0LCBkYWktPmRhdGFfY3BvcnQpOworCQkJZ290byBkaXNhYmxlX2RhdGFfY29ubmVjdGlvbjsKKwkJfQorCX0KKworCS8qIHJlZ2lzdGVyIG1vZHVsZSB3aXRoIGdiY29kZWMgKi8KKwlyZXQgPSBnYmF1ZGlvX3JlZ2lzdGVyX21vZHVsZShnYm1vZHVsZSk7CisJaWYgKHJldCkKKwkJZ290byBkaXNhYmxlX2RhdGFfY29ubmVjdGlvbjsKKworCS8qIGluZm9ybSBhYm92ZSBsYXllciBmb3IgdWV2ZW50ICovCisJZGV2X2RiZyhkZXYsICJJbmZvcm0gc2V0X2V2ZW50OiVkIHRvIGFib3ZlIGxheWVyXG4iLCAxKTsKKwkvKiBwcmVwYXJlIGZvciB0aGUgYXVkaW8gbWFuYWdlciAqLworCXN0cmxjcHkoZGVzYy5uYW1lLCBnYm1vZHVsZS0+bmFtZSwgR0JfQVVESU9fTUFOQUdFUl9NT0RVTEVfTkFNRV9MRU4pOworCWRlc2Muc2xvdCA9IDE7IC8qIHRvZG8gKi8KKwlkZXNjLnZpZCA9IDI7IC8qIHRvZG8gKi8KKwlkZXNjLnBpZCA9IDM7IC8qIHRvZG8gKi8KKwlkZXNjLmNwb3J0ID0gZ2Jtb2R1bGUtPmRldl9pZDsKKwlkZXNjLm9wX2RldmljZXMgPSBnYm1vZHVsZS0+b3BfZGV2aWNlczsKKwlkZXNjLmlwX2RldmljZXMgPSBnYm1vZHVsZS0+aXBfZGV2aWNlczsKKwlnYm1vZHVsZS0+bWFuYWdlcl9pZCA9IGdiX2F1ZGlvX21hbmFnZXJfYWRkKCZkZXNjKTsKKworCWRldl9kYmcoZGV2LCAiQWRkIEdCIEF1ZGlvIGRldmljZTolc1xuIiwgZ2Jtb2R1bGUtPm5hbWUpOworCisJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoYnVuZGxlKTsKKworCXJldHVybiAwOworCitkaXNhYmxlX2RhdGFfY29ubmVjdGlvbjoKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGFpLCBfZGFpLCAmZ2Jtb2R1bGUtPmRhdGFfbGlzdCwgbGlzdCkKKwkJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGRhaS0+Y29ubmVjdGlvbik7CisJZ2JhdWRpb190cGxnX3JlbGVhc2UoZ2Jtb2R1bGUpOworCWdibW9kdWxlLT50b3BvbG9neSA9IE5VTEw7CisKK2ZyZWVfdG9wb2xvZ3k6CisJa2ZyZWUodG9wb2xvZ3kpOworCitkaXNhYmxlX2Nvbm5lY3Rpb246CisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGdibW9kdWxlLT5tZ210X2Nvbm5lY3Rpb24pOworCitkZXN0cm95X2Nvbm5lY3Rpb25zOgorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkYWksIF9kYWksICZnYm1vZHVsZS0+ZGF0YV9saXN0LCBsaXN0KSB7CisJCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShkYWktPmNvbm5lY3Rpb24pOworCQlsaXN0X2RlbCgmZGFpLT5saXN0KTsKKwkJZGV2bV9rZnJlZShkZXYsIGRhaSk7CisJfQorCisJaWYgKGdibW9kdWxlLT5tZ210X2Nvbm5lY3Rpb24pCisJCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShnYm1vZHVsZS0+bWdtdF9jb25uZWN0aW9uKTsKKworCWRldm1fa2ZyZWUoZGV2LCBnYm1vZHVsZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBnYl9hdWRpb19kaXNjb25uZWN0KHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSkKK3sKKwlzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqZ2Jtb2R1bGUgPSBncmV5YnVzX2dldF9kcnZkYXRhKGJ1bmRsZSk7CisJc3RydWN0IGdiYXVkaW9fZGF0YV9jb25uZWN0aW9uICpkYWksICpfZGFpOworCisJZ2JfcG1fcnVudGltZV9nZXRfc3luYyhidW5kbGUpOworCisJLyogY2xlYW51cCBtb2R1bGUgcmVsYXRlZCByZXNvdXJjZXMgZmlyc3QgKi8KKwlnYmF1ZGlvX3VucmVnaXN0ZXJfbW9kdWxlKGdibW9kdWxlKTsKKworCS8qIGluZm9ybSB1ZXZlbnQgdG8gYWJvdmUgbGF5ZXJzICovCisJZ2JfYXVkaW9fbWFuYWdlcl9yZW1vdmUoZ2Jtb2R1bGUtPm1hbmFnZXJfaWQpOworCisJZ2JhdWRpb190cGxnX3JlbGVhc2UoZ2Jtb2R1bGUpOworCWtmcmVlKGdibW9kdWxlLT50b3BvbG9neSk7CisJZ2Jtb2R1bGUtPnRvcG9sb2d5ID0gTlVMTDsKKwlnYl9jb25uZWN0aW9uX2Rpc2FibGUoZ2Jtb2R1bGUtPm1nbXRfY29ubmVjdGlvbik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRhaSwgX2RhaSwgJmdibW9kdWxlLT5kYXRhX2xpc3QsIGxpc3QpIHsKKwkJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGRhaS0+Y29ubmVjdGlvbik7CisJCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShkYWktPmNvbm5lY3Rpb24pOworCQlsaXN0X2RlbCgmZGFpLT5saXN0KTsKKwkJZGV2bV9rZnJlZShnYm1vZHVsZS0+ZGV2LCBkYWkpOworCX0KKwlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koZ2Jtb2R1bGUtPm1nbXRfY29ubmVjdGlvbik7CisJZ2Jtb2R1bGUtPm1nbXRfY29ubmVjdGlvbiA9IE5VTEw7CisKKwlkZXZtX2tmcmVlKCZidW5kbGUtPmRldiwgZ2Jtb2R1bGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGdyZXlidXNfYnVuZGxlX2lkIGdiX2F1ZGlvX2lkX3RhYmxlW10gPSB7CisJeyBHUkVZQlVTX0RFVklDRV9DTEFTUyhHUkVZQlVTX0NMQVNTX0FVRElPKSB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoZ3JleWJ1cywgZ2JfYXVkaW9faWRfdGFibGUpOworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGdiX2F1ZGlvX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSA9IHRvX2diX2J1bmRsZShkZXYpOworCXN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICpnYm1vZHVsZSA9IGdyZXlidXNfZ2V0X2RydmRhdGEoYnVuZGxlKTsKKwlzdHJ1Y3QgZ2JhdWRpb19kYXRhX2Nvbm5lY3Rpb24gKmRhaTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGFpLCAmZ2Jtb2R1bGUtPmRhdGFfbGlzdCwgbGlzdCkKKwkJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGRhaS0+Y29ubmVjdGlvbik7CisKKwlnYl9jb25uZWN0aW9uX2Rpc2FibGUoZ2Jtb2R1bGUtPm1nbXRfY29ubmVjdGlvbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9hdWRpb19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSA9IHRvX2diX2J1bmRsZShkZXYpOworCXN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICpnYm1vZHVsZSA9IGdyZXlidXNfZ2V0X2RydmRhdGEoYnVuZGxlKTsKKwlzdHJ1Y3QgZ2JhdWRpb19kYXRhX2Nvbm5lY3Rpb24gKmRhaTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2JfY29ubmVjdGlvbl9lbmFibGUoZ2Jtb2R1bGUtPm1nbXRfY29ubmVjdGlvbik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIiVkOkVycm9yIHdoaWxlIGVuYWJsaW5nIG1nbXQgY29ubmVjdGlvblxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRhaSwgJmdibW9kdWxlLT5kYXRhX2xpc3QsIGxpc3QpIHsKKwkJcmV0ID0gZ2JfY29ubmVjdGlvbl9lbmFibGUoZGFpLT5jb25uZWN0aW9uKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkZXYsCisJCQkJIiVkOkVycm9yIHdoaWxlIGVuYWJsaW5nICVkOmRhdGEgY29ubmVjdGlvblxuIiwKKwkJCQlyZXQsIGRhaS0+ZGF0YV9jcG9ydCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGdiX2F1ZGlvX3BtX29wcyA9IHsKKwlTRVRfUlVOVElNRV9QTV9PUFMoZ2JfYXVkaW9fc3VzcGVuZCwgZ2JfYXVkaW9fcmVzdW1lLCBOVUxMKQorfTsKKworc3RhdGljIHN0cnVjdCBncmV5YnVzX2RyaXZlciBnYl9hdWRpb19kcml2ZXIgPSB7CisJLm5hbWUJCT0gImdiLWF1ZGlvIiwKKwkucHJvYmUJCT0gZ2JfYXVkaW9fcHJvYmUsCisJLmRpc2Nvbm5lY3QJPSBnYl9hdWRpb19kaXNjb25uZWN0LAorCS5pZF90YWJsZQk9IGdiX2F1ZGlvX2lkX3RhYmxlLAorCS5kcml2ZXIucG0JPSAmZ2JfYXVkaW9fcG1fb3BzLAorfTsKK21vZHVsZV9ncmV5YnVzX2RyaXZlcihnYl9hdWRpb19kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkdyZXlidXMgQXVkaW8gbW9kdWxlIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiVmFpYmhhdiBBZ2Fyd2FsIDx2YWliaGF2LmFnYXJ3YWxAbGluYXJvLm9yZz4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06Z2JhdWRpby1tb2R1bGUiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX3RvcG9sb2d5LmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb190b3BvbG9neS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MjUxNjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb190b3BvbG9neS5jCkBAIC0wLDAgKzEsMTQ0MyBAQAorLyoKKyAqIEdyZXlidXMgYXVkaW8gZHJpdmVyCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNS0yMDE2IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2luY2x1ZGUgImF1ZGlvX2NvZGVjLmgiCisjaW5jbHVkZSAiZ3JleWJ1c19wcm90b2NvbHMuaCIKKworI2RlZmluZSBHQkFVRElPX0lOVkFMSURfSUQJMHhGRgorCisvKiBtaXhlciBjb250cm9sICovCitzdHJ1Y3QgZ2JfbWl4ZXJfY29udHJvbCB7CisJaW50IG1pbiwgbWF4OworCXVuc2lnbmVkIGludCByZWcsIHJyZWcsIHNoaWZ0LCByc2hpZnQsIGludmVydDsKK307CisKK3N0cnVjdCBnYmF1ZGlvX2N0bF9wdnQgeworCXVuc2lnbmVkIGludCBjdGxfaWQ7CisJdW5zaWduZWQgaW50IGRhdGFfY3BvcnQ7CisJdW5zaWduZWQgaW50IGFjY2VzczsKKwl1bnNpZ25lZCBpbnQgdmNvdW50OworCXN0cnVjdCBnYl9hdWRpb19jdGxfZWxlbV9pbmZvICppbmZvOworfTsKKworc3RhdGljIHN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICpmaW5kX2diX21vZHVsZSgKKwkJCQkJc3RydWN0IGdiYXVkaW9fY29kZWNfaW5mbyAqY29kZWMsCisJCQkJCWNoYXIgY29uc3QgKm5hbWUpCit7CisJaW50IGRldl9pZCwgcmV0OworCWNoYXIgYmVnaW5bTkFNRV9TSVpFXTsKKwlzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlOworCisJaWYgKCFuYW1lKQorCQlyZXR1cm4gTlVMTDsKKworCXJldCA9IHNzY2FuZihuYW1lLCAiJXMgJWQiLCBiZWdpbiwgJmRldl9pZCk7CisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6RmluZCBtb2R1bGUjJWRcbiIsIF9fZnVuY19fLCBkZXZfaWQpOworCisJbXV0ZXhfbG9jaygmY29kZWMtPmxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkobW9kdWxlLCAmY29kZWMtPm1vZHVsZV9saXN0LCBsaXN0KSB7CisJCWlmIChtb2R1bGUtPmRldl9pZCA9PSBkZXZfaWQpIHsKKwkJCW11dGV4X3VubG9jaygmY29kZWMtPmxvY2spOworCQkJcmV0dXJuIG1vZHVsZTsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmNvZGVjLT5sb2NrKTsKKwlkZXZfd2Fybihjb2RlYy0+ZGV2LCAiJXM6IG1vZHVsZSMlZCBtaXNzaW5nIGluIGNvZGVjIGxpc3RcbiIsIG5hbWUsCisJCSBkZXZfaWQpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZ2JhdWRpb19tYXBfY29udHJvbGlkKHN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGUsCisJCQkJCSBfX3U4IGNvbnRyb2xfaWQsIF9fdTggaW5kZXgpCit7CisJc3RydWN0IGdiYXVkaW9fY29udHJvbCAqY29udHJvbDsKKworCWlmIChjb250cm9sX2lkID09IEdCQVVESU9fSU5WQUxJRF9JRCkKKwkJcmV0dXJuIE5VTEw7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbnRyb2wsICZtb2R1bGUtPmN0bF9saXN0LCBsaXN0KSB7CisJCWlmIChjb250cm9sLT5pZCA9PSBjb250cm9sX2lkKSB7CisJCQlpZiAoaW5kZXggPT0gR0JBVURJT19JTlZBTElEX0lEKQorCQkJCXJldHVybiBjb250cm9sLT5uYW1lOworCQkJaWYgKGluZGV4ID49IGNvbnRyb2wtPml0ZW1zKQorCQkJCXJldHVybiBOVUxMOworCQkJcmV0dXJuIGNvbnRyb2wtPnRleHRzW2luZGV4XTsKKwkJfQorCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbnRyb2wsICZtb2R1bGUtPndpZGdldF9jdGxfbGlzdCwgbGlzdCkgeworCQlpZiAoY29udHJvbC0+aWQgPT0gY29udHJvbF9pZCkgeworCQkJaWYgKGluZGV4ID09IEdCQVVESU9fSU5WQUxJRF9JRCkKKwkJCQlyZXR1cm4gY29udHJvbC0+bmFtZTsKKwkJCWlmIChpbmRleCA+PSBjb250cm9sLT5pdGVtcykKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCXJldHVybiBjb250cm9sLT50ZXh0c1tpbmRleF07CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZ2JhdWRpb19tYXBfY29udHJvbG5hbWUoc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKm1vZHVsZSwKKwkJCQkgICBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBnYmF1ZGlvX2NvbnRyb2wgKmNvbnRyb2w7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbnRyb2wsICZtb2R1bGUtPmN0bF9saXN0LCBsaXN0KSB7CisJCWlmICghc3RybmNtcChjb250cm9sLT5uYW1lLCBuYW1lLCBOQU1FX1NJWkUpKQorCQkJcmV0dXJuIGNvbnRyb2wtPmlkOworCX0KKworCWRldl93YXJuKG1vZHVsZS0+ZGV2LCAiJXM6IG1pc3NpbmcgaW4gbW9kdWxlcyBjb250cm9scyBsaXN0XG4iLCBuYW1lKTsKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGdiYXVkaW9fbWFwX3djb250cm9sbmFtZShzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlLAorCQkJCSAgICBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBnYmF1ZGlvX2NvbnRyb2wgKmNvbnRyb2w7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbnRyb2wsICZtb2R1bGUtPndpZGdldF9jdGxfbGlzdCwgbGlzdCkgeworCQlpZiAoIXN0cm5jbXAoY29udHJvbC0+d25hbWUsIG5hbWUsIE5BTUVfU0laRSkpCisJCQlyZXR1cm4gY29udHJvbC0+aWQ7CisJfQorCWRldl93YXJuKG1vZHVsZS0+ZGV2LCAiJXM6IG1pc3NpbmcgaW4gbW9kdWxlcyBjb250cm9scyBsaXN0XG4iLCBuYW1lKTsKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGdiYXVkaW9fbWFwX3dpZGdldG5hbWUoc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKm1vZHVsZSwKKwkJCQkgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGdiYXVkaW9fd2lkZ2V0ICp3aWRnZXQ7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3aWRnZXQsICZtb2R1bGUtPndpZGdldF9saXN0LCBsaXN0KSB7CisJCWlmICghc3RybmNtcCh3aWRnZXQtPm5hbWUsIG5hbWUsIE5BTUVfU0laRSkpCisJCQlyZXR1cm4gd2lkZ2V0LT5pZDsKKwl9CisJZGV2X3dhcm4obW9kdWxlLT5kZXYsICIlczogbWlzc2luZyBpbiBtb2R1bGVzIHdpZGdldHMgbGlzdFxuIiwgbmFtZSk7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmdiYXVkaW9fbWFwX3dpZGdldGlkKHN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGUsCisJCQkJCV9fdTggd2lkZ2V0X2lkKQoreworCXN0cnVjdCBnYmF1ZGlvX3dpZGdldCAqd2lkZ2V0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3aWRnZXQsICZtb2R1bGUtPndpZGdldF9saXN0LCBsaXN0KSB7CisJCWlmICh3aWRnZXQtPmlkID09IHdpZGdldF9pZCkKKwkJCXJldHVybiB3aWRnZXQtPm5hbWU7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqKmdiX2dlbmVyYXRlX2VudW1fc3RyaW5ncyhzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqZ2IsCisJCQkJCSAgICAgc3RydWN0IGdiX2F1ZGlvX2VudW1lcmF0ZWQgKmdiZW51bSkKK3sKKwljb25zdCBjaGFyICoqc3RyaW5nczsKKwlpbnQgaTsKKwlfX3U4ICpkYXRhOworCisJc3RyaW5ncyA9IGRldm1fa3phbGxvYyhnYi0+ZGV2LCBzaXplb2YoY2hhciAqKSAqIGdiZW51bS0+aXRlbXMsCisJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJZGF0YSA9IGdiZW51bS0+bmFtZXM7CisKKwlmb3IgKGkgPSAwOyBpIDwgZ2JlbnVtLT5pdGVtczsgaSsrKSB7CisJCXN0cmluZ3NbaV0gPSAoY29uc3QgY2hhciAqKWRhdGE7CisJCXdoaWxlICgqZGF0YSAhPSAnXDAnKQorCQkJZGF0YSsrOworCQlkYXRhKys7CisJfQorCisJcmV0dXJuIHN0cmluZ3M7Cit9CisKK3N0YXRpYyBpbnQgZ2Jjb2RlY19taXhlcl9jdGxfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXVuc2lnbmVkIGludCBtYXg7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgZ2JhdWRpb19jdGxfcHZ0ICpkYXRhOworCXN0cnVjdCBnYl9hdWRpb19jdGxfZWxlbV9pbmZvICppbmZvOworCXN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGU7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBnYmF1ZGlvX2NvZGVjX2luZm8gKmdiY29kZWMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIkVudGVyZWQgJXM6JXNcbiIsIF9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7CisJZGF0YSA9IChzdHJ1Y3QgZ2JhdWRpb19jdGxfcHZ0ICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJaW5mbyA9IChzdHJ1Y3QgZ2JfYXVkaW9fY3RsX2VsZW1faW5mbyAqKWRhdGEtPmluZm87CisKKwlpZiAoIWluZm8pIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiTlVMTCBpbmZvIGZvciAlc1xuIiwgdWluZm8tPmlkLm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiB1cGRhdGUgdWluZm8gKi8KKwl1aW5mby0+YWNjZXNzID0gZGF0YS0+YWNjZXNzOworCXVpbmZvLT5jb3VudCA9IGRhdGEtPnZjb3VudDsKKwl1aW5mby0+dHlwZSA9IChzbmRfY3RsX2VsZW1fdHlwZV90KWluZm8tPnR5cGU7CisKKwlzd2l0Y2ggKGluZm8tPnR5cGUpIHsKKwljYXNlIEdCX0FVRElPX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjoKKwljYXNlIEdCX0FVRElPX0NUTF9FTEVNX1RZUEVfSU5URUdFUjoKKwkJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gaW5mby0+dmFsdWUuaW50ZWdlci5taW47CisJCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IGluZm8tPnZhbHVlLmludGVnZXIubWF4OworCQlicmVhazsKKwljYXNlIEdCX0FVRElPX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDoKKwkJbWF4ID0gaW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtczsKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSBtYXg7CisJCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID4gbWF4IC0gMSkKKwkJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSBtYXggLSAxOworCQltb2R1bGUgPSBmaW5kX2diX21vZHVsZShnYmNvZGVjLCBrY29udHJvbC0+aWQubmFtZSk7CisJCWlmICghbW9kdWxlKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW5hbWUgPSBnYmF1ZGlvX21hcF9jb250cm9saWQobW9kdWxlLCBkYXRhLT5jdGxfaWQsCisJCQkJCSAgICAgdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSk7CisJCXN0cmxjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgbmFtZSwgTkFNRV9TSVpFKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSW52YWxpZCB0eXBlOiAlZCBmb3IgJXM6a2NvbnRyb2xcbiIsCisJCQlpbmZvLT50eXBlLCBrY29udHJvbC0+aWQubmFtZSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYmNvZGVjX21peGVyX2N0bF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZ2JfYXVkaW9fY3RsX2VsZW1faW5mbyAqaW5mbzsKKwlzdHJ1Y3QgZ2JhdWRpb19jdGxfcHZ0ICpkYXRhOworCXN0cnVjdCBnYl9hdWRpb19jdGxfZWxlbV92YWx1ZSBnYnZhbHVlOworCXN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGU7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBnYmF1ZGlvX2NvZGVjX2luZm8gKmdiID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiRW50ZXJlZCAlczolc1xuIiwgX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwltb2R1bGUgPSBmaW5kX2diX21vZHVsZShnYiwga2NvbnRyb2wtPmlkLm5hbWUpOworCWlmICghbW9kdWxlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRhdGEgPSAoc3RydWN0IGdiYXVkaW9fY3RsX3B2dCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCWluZm8gPSAoc3RydWN0IGdiX2F1ZGlvX2N0bF9lbGVtX2luZm8gKilkYXRhLT5pbmZvOworCWJ1bmRsZSA9IHRvX2diX2J1bmRsZShtb2R1bGUtPmRldik7CisKKwlyZXQgPSBnYl9wbV9ydW50aW1lX2dldF9zeW5jKGJ1bmRsZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGdiX2F1ZGlvX2diX2dldF9jb250cm9sKG1vZHVsZS0+bWdtdF9jb25uZWN0aW9uLCBkYXRhLT5jdGxfaWQsCisJCQkJICAgICAgR0JfQVVESU9fSU5WQUxJRF9JTkRFWCwgJmdidmFsdWUpOworCisJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoYnVuZGxlKTsKKworCWlmIChyZXQpIHsKKwkJZGV2X2Vycl9yYXRlbGltaXRlZChjb2RlYy0+ZGV2LCAiJWQ6RXJyb3IgaW4gJXMgZm9yICVzXG4iLCByZXQsCisJCQkJICAgIF9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogdXBkYXRlIHVjb250cm9sICovCisJc3dpdGNoIChpbmZvLT50eXBlKSB7CisJY2FzZSBHQl9BVURJT19DVExfRUxFTV9UWVBFX0JPT0xFQU46CisJY2FzZSBHQl9BVURJT19DVExfRUxFTV9UWVBFX0lOVEVHRVI6CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KKwkJCWdidmFsdWUudmFsdWUuaW50ZWdlcl92YWx1ZVswXTsKKwkJaWYgKGRhdGEtPnZjb3VudCA9PSAyKQorCQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPQorCQkJCWdidmFsdWUudmFsdWUuaW50ZWdlcl92YWx1ZVsxXTsKKwkJYnJlYWs7CisJY2FzZSBHQl9BVURJT19DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ6CisJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQorCQkJZ2J2YWx1ZS52YWx1ZS5lbnVtZXJhdGVkX2l0ZW1bMF07CisJCWlmIChkYXRhLT52Y291bnQgPT0gMikKKwkJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPQorCQkJCWdidmFsdWUudmFsdWUuZW51bWVyYXRlZF9pdGVtWzFdOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJJbnZhbGlkIHR5cGU6ICVkIGZvciAlczprY29udHJvbFxuIiwKKwkJCWluZm8tPnR5cGUsIGtjb250cm9sLT5pZC5uYW1lKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2Jjb2RlY19taXhlcl9jdGxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGdiX2F1ZGlvX2N0bF9lbGVtX2luZm8gKmluZm87CisJc3RydWN0IGdiYXVkaW9fY3RsX3B2dCAqZGF0YTsKKwlzdHJ1Y3QgZ2JfYXVkaW9fY3RsX2VsZW1fdmFsdWUgZ2J2YWx1ZTsKKwlzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3QgZ2JhdWRpb19jb2RlY19pbmZvICpnYiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIkVudGVyZWQgJXM6JXNcbiIsIF9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7CisJbW9kdWxlID0gZmluZF9nYl9tb2R1bGUoZ2IsIGtjb250cm9sLT5pZC5uYW1lKTsKKwlpZiAoIW1vZHVsZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkYXRhID0gKHN0cnVjdCBnYmF1ZGlvX2N0bF9wdnQgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlpbmZvID0gKHN0cnVjdCBnYl9hdWRpb19jdGxfZWxlbV9pbmZvICopZGF0YS0+aW5mbzsKKwlidW5kbGUgPSB0b19nYl9idW5kbGUobW9kdWxlLT5kZXYpOworCisJLyogdXBkYXRlIHVjb250cm9sICovCisJc3dpdGNoIChpbmZvLT50eXBlKSB7CisJY2FzZSBHQl9BVURJT19DVExfRUxFTV9UWVBFX0JPT0xFQU46CisJY2FzZSBHQl9BVURJT19DVExfRUxFTV9UWVBFX0lOVEVHRVI6CisJCWdidmFsdWUudmFsdWUuaW50ZWdlcl92YWx1ZVswXSA9CisJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwkJaWYgKGRhdGEtPnZjb3VudCA9PSAyKQorCQkJZ2J2YWx1ZS52YWx1ZS5pbnRlZ2VyX3ZhbHVlWzFdID0KKwkJCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKwkJYnJlYWs7CisJY2FzZSBHQl9BVURJT19DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ6CisJCWdidmFsdWUudmFsdWUuZW51bWVyYXRlZF9pdGVtWzBdID0KKwkJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisJCWlmIChkYXRhLT52Y291bnQgPT0gMikKKwkJCWdidmFsdWUudmFsdWUuZW51bWVyYXRlZF9pdGVtWzFdID0KKwkJCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJJbnZhbGlkIHR5cGU6ICVkIGZvciAlczprY29udHJvbFxuIiwKKwkJCWluZm8tPnR5cGUsIGtjb250cm9sLT5pZC5uYW1lKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoYnVuZGxlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZ2JfYXVkaW9fZ2Jfc2V0X2NvbnRyb2wobW9kdWxlLT5tZ210X2Nvbm5lY3Rpb24sIGRhdGEtPmN0bF9pZCwKKwkJCQkgICAgICBHQl9BVURJT19JTlZBTElEX0lOREVYLCAmZ2J2YWx1ZSk7CisKKwlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChidW5kbGUpOworCisJaWYgKHJldCkgeworCQlkZXZfZXJyX3JhdGVsaW1pdGVkKGNvZGVjLT5kZXYsICIlZDpFcnJvciBpbiAlcyBmb3IgJXNcbiIsIHJldCwKKwkJCQkgICAgX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFNPQ19NSVhFUl9HQih4bmFtZSwga2NvdW50LCBkYXRhKSBcCit7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCBcCisJLmNvdW50ID0ga2NvdW50LCAuaW5mbyA9IGdiY29kZWNfbWl4ZXJfY3RsX2luZm8sIFwKKwkuZ2V0ID0gZ2Jjb2RlY19taXhlcl9jdGxfZ2V0LCAucHV0ID0gZ2Jjb2RlY19taXhlcl9jdGxfcHV0LCBcCisJLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZylkYXRhIH0KKworLyoKKyAqIGFsdGhvdWdoIGJlbG93IGNhbGxiYWNrIGZ1bmN0aW9ucyBzZWVtcyByZWR1bmRhbnQgdG8gYWJvdmUgZnVuY3Rpb25zLgorICogc2FtZSBhcmUga2VwdCB0byBhbGxvdyBwcm92aXNpb24gZm9yIGRpZmZlcmVudCBoYW5kbGluZyBpbiBjYXNlCisgKiBvZiBEQVBNIHJlbGF0ZWQgc2VxdWVuY2luZywgZXRjLgorICovCitzdGF0aWMgaW50IGdiY29kZWNfbWl4ZXJfZGFwbV9jdGxfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCWludCBwbGF0Zm9ybV9tYXgsIHBsYXRmb3JtX21pbjsKKwlzdHJ1Y3QgZ2JhdWRpb19jdGxfcHZ0ICpkYXRhOworCXN0cnVjdCBnYl9hdWRpb19jdGxfZWxlbV9pbmZvICppbmZvOworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0X2xpc3QgKndsaXN0ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQgPSB3bGlzdC0+d2lkZ2V0c1swXTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3aWRnZXQtPmNvZGVjOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiRW50ZXJlZCAlczolc1xuIiwgX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwlkYXRhID0gKHN0cnVjdCBnYmF1ZGlvX2N0bF9wdnQgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlpbmZvID0gKHN0cnVjdCBnYl9hdWRpb19jdGxfZWxlbV9pbmZvICopZGF0YS0+aW5mbzsKKworCS8qIHVwZGF0ZSB1aW5mbyAqLworCXBsYXRmb3JtX21heCA9IGluZm8tPnZhbHVlLmludGVnZXIubWF4OworCXBsYXRmb3JtX21pbiA9IGluZm8tPnZhbHVlLmludGVnZXIubWluOworCisJaWYgKHBsYXRmb3JtX21heCA9PSAxICYmCisJICAgICFzdHJuc3RyKGtjb250cm9sLT5pZC5uYW1lLCAiIFZvbHVtZSIsIE5BTUVfU0laRSkpCisJCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9CT09MRUFOOworCWVsc2UKKwkJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisKKwl1aW5mby0+Y291bnQgPSBkYXRhLT52Y291bnQ7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwlpZiAoaW5mby0+dmFsdWUuaW50ZWdlci5taW4gPCAwICYmCisJICAgICh1aW5mby0+dHlwZSA9PSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVIpKQorCQl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBwbGF0Zm9ybV9tYXggLSBwbGF0Zm9ybV9taW47CisJZWxzZQorCQl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBwbGF0Zm9ybV9tYXg7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYmNvZGVjX21peGVyX2RhcG1fY3RsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBnYl9hdWRpb19jdGxfZWxlbV9pbmZvICppbmZvOworCXN0cnVjdCBnYmF1ZGlvX2N0bF9wdnQgKmRhdGE7CisJc3RydWN0IGdiX2F1ZGlvX2N0bF9lbGVtX3ZhbHVlIGdidmFsdWU7CisJc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKm1vZHVsZTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldF9saXN0ICp3bGlzdCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqd2lkZ2V0ID0gd2xpc3QtPndpZGdldHNbMF07CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gd2lkZ2V0LT5jb2RlYzsKKwlzdHJ1Y3QgZ2JhdWRpb19jb2RlY19pbmZvICpnYiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIkVudGVyZWQgJXM6JXNcbiIsIF9fZnVuY19fLCBrY29udHJvbC0+aWQubmFtZSk7CisJbW9kdWxlID0gZmluZF9nYl9tb2R1bGUoZ2IsIGtjb250cm9sLT5pZC5uYW1lKTsKKwlpZiAoIW1vZHVsZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkYXRhID0gKHN0cnVjdCBnYmF1ZGlvX2N0bF9wdnQgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlpbmZvID0gKHN0cnVjdCBnYl9hdWRpb19jdGxfZWxlbV9pbmZvICopZGF0YS0+aW5mbzsKKwlidW5kbGUgPSB0b19nYl9idW5kbGUobW9kdWxlLT5kZXYpOworCisJaWYgKGRhdGEtPnZjb3VudCA9PSAyKQorCQlkZXZfd2Fybih3aWRnZXQtPmRhcG0tPmRldiwKKwkJCSAiR0I6IENvbnRyb2wgJyVzJyBpcyBzdGVyZW8sIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkga2NvbnRyb2wtPmlkLm5hbWUpOworCisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhidW5kbGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBnYl9hdWRpb19nYl9nZXRfY29udHJvbChtb2R1bGUtPm1nbXRfY29ubmVjdGlvbiwgZGF0YS0+Y3RsX2lkLAorCQkJCSAgICAgIEdCX0FVRElPX0lOVkFMSURfSU5ERVgsICZnYnZhbHVlKTsKKworCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGJ1bmRsZSk7CisKKwlpZiAocmV0KSB7CisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoY29kZWMtPmRldiwgIiVkOkVycm9yIGluICVzIGZvciAlc1xuIiwgcmV0LAorCQkJCSAgICBfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCQlyZXR1cm4gcmV0OworCX0KKwkvKiB1cGRhdGUgdWNvbnRyb2wgKi8KKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGdidmFsdWUudmFsdWUuaW50ZWdlcl92YWx1ZVswXTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2Jjb2RlY19taXhlcl9kYXBtX2N0bF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgcmV0LCB3aSwgbWF4LCBjb25uZWN0OworCXVuc2lnbmVkIGludCBtYXNrLCB2YWw7CisJc3RydWN0IGdiX2F1ZGlvX2N0bF9lbGVtX2luZm8gKmluZm87CisJc3RydWN0IGdiYXVkaW9fY3RsX3B2dCAqZGF0YTsKKwlzdHJ1Y3QgZ2JfYXVkaW9fY3RsX2VsZW1fdmFsdWUgZ2J2YWx1ZTsKKwlzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlOworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0X2xpc3QgKndsaXN0ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQgPSB3bGlzdC0+d2lkZ2V0c1swXTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3aWRnZXQtPmNvZGVjOworCXN0cnVjdCBnYmF1ZGlvX2NvZGVjX2luZm8gKmdiID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiRW50ZXJlZCAlczolc1xuIiwgX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwltb2R1bGUgPSBmaW5kX2diX21vZHVsZShnYiwga2NvbnRyb2wtPmlkLm5hbWUpOworCWlmICghbW9kdWxlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRhdGEgPSAoc3RydWN0IGdiYXVkaW9fY3RsX3B2dCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCWluZm8gPSAoc3RydWN0IGdiX2F1ZGlvX2N0bF9lbGVtX2luZm8gKilkYXRhLT5pbmZvOworCWJ1bmRsZSA9IHRvX2diX2J1bmRsZShtb2R1bGUtPmRldik7CisKKwlpZiAoZGF0YS0+dmNvdW50ID09IDIpCisJCWRldl93YXJuKHdpZGdldC0+ZGFwbS0+ZGV2LAorCQkJICJHQjogQ29udHJvbCAnJXMnIGlzIHN0ZXJlbywgd2hpY2ggaXMgbm90IHN1cHBvcnRlZFxuIiwKKwkJCSBrY29udHJvbC0+aWQubmFtZSk7CisKKwltYXggPSBpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heDsKKwltYXNrID0gKDEgPDwgZmxzKG1heCkpIC0gMTsKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIG1hc2s7CisJY29ubmVjdCA9ICEhdmFsOworCisJLyogdXBkYXRlIHVjb250cm9sICovCisJaWYgKGdidmFsdWUudmFsdWUuaW50ZWdlcl92YWx1ZVswXSAhPSB2YWwpIHsKKwkJZm9yICh3aSA9IDA7IHdpIDwgd2xpc3QtPm51bV93aWRnZXRzOyB3aSsrKSB7CisJCQl3aWRnZXQgPSB3bGlzdC0+d2lkZ2V0c1t3aV07CisKKwkJCXdpZGdldC0+dmFsdWUgPSB2YWw7CisJCQl3aWRnZXQtPmRhcG0tPnVwZGF0ZSA9IE5VTEw7CisJCQlzbmRfc29jX2RhcG1fbWl4ZXJfdXBkYXRlX3Bvd2VyKHdpZGdldCwga2NvbnRyb2wsCisJCQkJCQkJY29ubmVjdCk7CisJCX0KKwkJZ2J2YWx1ZS52YWx1ZS5pbnRlZ2VyX3ZhbHVlWzBdID0KKwkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCisJCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoYnVuZGxlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gZ2JfYXVkaW9fZ2Jfc2V0X2NvbnRyb2wobW9kdWxlLT5tZ210X2Nvbm5lY3Rpb24sCisJCQkJCSAgICAgIGRhdGEtPmN0bF9pZCwKKwkJCQkJICAgICAgR0JfQVVESU9fSU5WQUxJRF9JTkRFWCwgJmdidmFsdWUpOworCisJCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGJ1bmRsZSk7CisKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycl9yYXRlbGltaXRlZChjb2RlYy0+ZGV2LAorCQkJCQkgICAgIiVkOkVycm9yIGluICVzIGZvciAlc1xuIiwgcmV0LAorCQkJCQkgICAgX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBTT0NfREFQTV9NSVhFUl9HQih4bmFtZSwga2NvdW50LCBkYXRhKSBcCit7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCBcCisJLmNvdW50ID0ga2NvdW50LCAuaW5mbyA9IGdiY29kZWNfbWl4ZXJfZGFwbV9jdGxfaW5mbywgXAorCS5nZXQgPSBnYmNvZGVjX21peGVyX2RhcG1fY3RsX2dldCwgLnB1dCA9IGdiY29kZWNfbWl4ZXJfZGFwbV9jdGxfcHV0LCBcCisJLnByaXZhdGVfdmFsdWUgPSAodW5zaWduZWQgbG9uZylkYXRhfQorCitzdGF0aWMgaW50IGdiY29kZWNfZXZlbnRfc3BrKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprLCBpbnQgZXZlbnQpCit7CisJLyogRW5zdXJlIEdCIHNwZWFrZXIgaXMgY29ubmVjdGVkICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYmNvZGVjX2V2ZW50X2hwKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprLCBpbnQgZXZlbnQpCit7CisJLyogRW5zdXJlIEdCIG1vZHVsZSBzdXBwb3J0cyBqYWNrIHNsb3QgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiY29kZWNfZXZlbnRfaW50X21pYyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQkJc3RydWN0IHNuZF9rY29udHJvbCAqaywgaW50IGV2ZW50KQoreworCS8qIEVuc3VyZSBHQiBtb2R1bGUgc3VwcG9ydHMgamFjayBzbG90ICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYmF1ZGlvX3ZhbGlkYXRlX2tjb250cm9sX2NvdW50KHN0cnVjdCBnYl9hdWRpb193aWRnZXQgKncpCit7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKHctPnR5cGUpIHsKKwljYXNlIHNuZF9zb2NfZGFwbV9zcGs6CisJY2FzZSBzbmRfc29jX2RhcG1faHA6CisJY2FzZSBzbmRfc29jX2RhcG1fbWljOgorCWNhc2Ugc25kX3NvY19kYXBtX291dHB1dDoKKwljYXNlIHNuZF9zb2NfZGFwbV9pbnB1dDoKKwkJaWYgKHctPm5jb250cm9scykKKwkJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2Ugc25kX3NvY19kYXBtX3N3aXRjaDoKKwljYXNlIHNuZF9zb2NfZGFwbV9tdXg6CisJCWlmICh3LT5uY29udHJvbHMgIT0gMSkKKwkJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2Jjb2RlY19lbnVtX2N0bF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHJldCwgY3RsX2lkOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJc3RydWN0IGdiX2F1ZGlvX2N0bF9lbGVtX3ZhbHVlIGdidmFsdWU7CisJc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKm1vZHVsZTsKKwlzdHJ1Y3QgZ2JhdWRpb19jb2RlY19pbmZvICpnYiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZTsKKworCW1vZHVsZSA9IGZpbmRfZ2JfbW9kdWxlKGdiLCBrY29udHJvbC0+aWQubmFtZSk7CisJaWYgKCFtb2R1bGUpCisJCXJldHVybiAtRUlOVkFMOworCisJY3RsX2lkID0gZ2JhdWRpb19tYXBfY29udHJvbG5hbWUobW9kdWxlLCBrY29udHJvbC0+aWQubmFtZSk7CisJaWYgKGN0bF9pZCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJYnVuZGxlID0gdG9fZ2JfYnVuZGxlKG1vZHVsZS0+ZGV2KTsKKworCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoYnVuZGxlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZ2JfYXVkaW9fZ2JfZ2V0X2NvbnRyb2wobW9kdWxlLT5tZ210X2Nvbm5lY3Rpb24sIGN0bF9pZCwKKwkJCQkgICAgICBHQl9BVURJT19JTlZBTElEX0lOREVYLCAmZ2J2YWx1ZSk7CisKKwlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChidW5kbGUpOworCisJaWYgKHJldCkgeworCQlkZXZfZXJyX3JhdGVsaW1pdGVkKGNvZGVjLT5kZXYsICIlZDpFcnJvciBpbiAlcyBmb3IgJXNcbiIsIHJldCwKKwkJCQkgICAgX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gZ2J2YWx1ZS52YWx1ZS5lbnVtZXJhdGVkX2l0ZW1bMF07CisJaWYgKGUtPnNoaWZ0X2wgIT0gZS0+c2hpZnRfcikKKwkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA9CisJCQlnYnZhbHVlLnZhbHVlLmVudW1lcmF0ZWRfaXRlbVsxXTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiY29kZWNfZW51bV9jdGxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCWludCByZXQsIGN0bF9pZDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNvY19lbnVtICplID0gKHN0cnVjdCBzb2NfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXN0cnVjdCBnYl9hdWRpb19jdGxfZWxlbV92YWx1ZSBnYnZhbHVlOworCXN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGU7CisJc3RydWN0IGdiYXVkaW9fY29kZWNfaW5mbyAqZ2IgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGU7CisKKwltb2R1bGUgPSBmaW5kX2diX21vZHVsZShnYiwga2NvbnRyb2wtPmlkLm5hbWUpOworCWlmICghbW9kdWxlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWN0bF9pZCA9IGdiYXVkaW9fbWFwX2NvbnRyb2xuYW1lKG1vZHVsZSwga2NvbnRyb2wtPmlkLm5hbWUpOworCWlmIChjdGxfaWQgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID4gZS0+bWF4IC0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZ2J2YWx1ZS52YWx1ZS5lbnVtZXJhdGVkX2l0ZW1bMF0gPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCisJaWYgKGUtPnNoaWZ0X2wgIT0gZS0+c2hpZnRfcikgeworCQlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA+IGUtPm1heCAtIDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZ2J2YWx1ZS52YWx1ZS5lbnVtZXJhdGVkX2l0ZW1bMV0gPQorCQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXTsKKwl9CisKKwlidW5kbGUgPSB0b19nYl9idW5kbGUobW9kdWxlLT5kZXYpOworCisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhidW5kbGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBnYl9hdWRpb19nYl9zZXRfY29udHJvbChtb2R1bGUtPm1nbXRfY29ubmVjdGlvbiwgY3RsX2lkLAorCQkJCSAgICAgIEdCX0FVRElPX0lOVkFMSURfSU5ERVgsICZnYnZhbHVlKTsKKworCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGJ1bmRsZSk7CisKKwlpZiAocmV0KSB7CisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoY29kZWMtPmRldiwgIiVkOkVycm9yIGluICVzIGZvciAlc1xuIiwgcmV0LAorCQkJCSAgICBfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JhdWRpb190cGxnX2NyZWF0ZV9lbnVtX2tjdGwoc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKmdiLAorCQkJCQkgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmtjdGwsCisJCQkJCSBzdHJ1Y3QgZ2JfYXVkaW9fY29udHJvbCAqY3RsKQoreworCXN0cnVjdCBzb2NfZW51bSAqZ2JlOworCXN0cnVjdCBnYl9hdWRpb19lbnVtZXJhdGVkICpnYl9lbnVtOworCWludCBpOworCisJZ2JlID0gZGV2bV9remFsbG9jKGdiLT5kZXYsIHNpemVvZigqZ2JlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFnYmUpCisJCXJldHVybiAtRU5PTUVNOworCisJZ2JfZW51bSA9ICZjdGwtPmluZm8udmFsdWUuZW51bWVyYXRlZDsKKworCS8qIHNpbmNlIGNvdW50PTEsIGFuZCByZWcgaXMgZHVtbXkgKi8KKwlnYmUtPm1heCA9IGdiX2VudW0tPml0ZW1zOworCWdiZS0+dGV4dHMgPSBnYl9nZW5lcmF0ZV9lbnVtX3N0cmluZ3MoZ2IsIGdiX2VudW0pOworCisJLyogZGVidWcgZW51bSBpbmZvICovCisJZGV2X2RiZyhnYi0+ZGV2LCAiTWF4OiVkLCBuYW1lX2xlbmd0aDolZFxuIiwgZ2JfZW51bS0+aXRlbXMsCisJCSBnYl9lbnVtLT5uYW1lc19sZW5ndGgpOworCWZvciAoaSA9IDA7IGkgPCBnYl9lbnVtLT5pdGVtczsgaSsrKQorCQlkZXZfZGJnKGdiLT5kZXYsICJzcmNbJWRdOiAlc1xuIiwgaSwgZ2JlLT50ZXh0c1tpXSk7CisKKwkqa2N0bCA9IChzdHJ1Y3Qgc25kX2tjb250cm9sX25ldykKKwkJU09DX0VOVU1fRVhUKGN0bC0+bmFtZSwgKmdiZSwgZ2Jjb2RlY19lbnVtX2N0bF9nZXQsCisJCQkgICAgIGdiY29kZWNfZW51bV9jdGxfcHV0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYmF1ZGlvX3RwbGdfY3JlYXRlX2tjb250cm9sKHN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICpnYiwKKwkJCQkJc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmtjdGwsCisJCQkJCXN0cnVjdCBnYl9hdWRpb19jb250cm9sICpjdGwpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGdiYXVkaW9fY3RsX3B2dCAqY3RsZGF0YTsKKworCXN3aXRjaCAoY3RsLT5pZmFjZSkgeworCWNhc2UgU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVI6CisJCXN3aXRjaCAoY3RsLT5pbmZvLnR5cGUpIHsKKwkJY2FzZSBHQl9BVURJT19DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ6CisJCQlyZXQgPSBnYmF1ZGlvX3RwbGdfY3JlYXRlX2VudW1fa2N0bChnYiwga2N0bCwgY3RsKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY3RsZGF0YSA9IGRldm1fa3phbGxvYyhnYi0+ZGV2LAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBnYmF1ZGlvX2N0bF9wdnQpLAorCQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWN0bGRhdGEpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQljdGxkYXRhLT5jdGxfaWQgPSBjdGwtPmlkOworCQkJY3RsZGF0YS0+ZGF0YV9jcG9ydCA9IGN0bC0+ZGF0YV9jcG9ydDsKKwkJCWN0bGRhdGEtPmFjY2VzcyA9IGN0bC0+YWNjZXNzOworCQkJY3RsZGF0YS0+dmNvdW50ID0gY3RsLT5jb3VudF92YWx1ZXM7CisJCQljdGxkYXRhLT5pbmZvID0gJmN0bC0+aW5mbzsKKwkJCSprY3RsID0gKHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3KQorCQkJCVNPQ19NSVhFUl9HQihjdGwtPm5hbWUsIGN0bC0+Y291bnQsIGN0bGRhdGEpOworCQkJY3RsZGF0YSA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfZGJnKGdiLT5kZXYsICIlczolZCBjb250cm9sIGNyZWF0ZWRcbiIsIGN0bC0+bmFtZSwgY3RsLT5pZCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYmNvZGVjX2VudW1fZGFwbV9jdGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJaW50IHJldCwgY3RsX2lkOworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0X2xpc3QgKndsaXN0ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQgPSB3bGlzdC0+d2lkZ2V0c1swXTsKKwlzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlOworCXN0cnVjdCBnYl9hdWRpb19jdGxfZWxlbV92YWx1ZSBnYnZhbHVlOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHdpZGdldC0+Y29kZWM7CisJc3RydWN0IGdiYXVkaW9fY29kZWNfaW5mbyAqZ2IgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlOworCisJbW9kdWxlID0gZmluZF9nYl9tb2R1bGUoZ2IsIGtjb250cm9sLT5pZC5uYW1lKTsKKwlpZiAoIW1vZHVsZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljdGxfaWQgPSBnYmF1ZGlvX21hcF93Y29udHJvbG5hbWUobW9kdWxlLCBrY29udHJvbC0+aWQubmFtZSk7CisJaWYgKGN0bF9pZCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJYnVuZGxlID0gdG9fZ2JfYnVuZGxlKG1vZHVsZS0+ZGV2KTsKKworCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoYnVuZGxlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZ2JfYXVkaW9fZ2JfZ2V0X2NvbnRyb2wobW9kdWxlLT5tZ210X2Nvbm5lY3Rpb24sIGN0bF9pZCwKKwkJCQkgICAgICBHQl9BVURJT19JTlZBTElEX0lOREVYLCAmZ2J2YWx1ZSk7CisKKwlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChidW5kbGUpOworCisJaWYgKHJldCkgeworCQlkZXZfZXJyX3JhdGVsaW1pdGVkKGNvZGVjLT5kZXYsICIlZDpFcnJvciBpbiAlcyBmb3IgJXNcbiIsIHJldCwKKwkJCQkgICAgX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gZ2J2YWx1ZS52YWx1ZS5lbnVtZXJhdGVkX2l0ZW1bMF07CisJaWYgKGUtPnNoaWZ0X2wgIT0gZS0+c2hpZnRfcikKKwkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA9CisJCQlnYnZhbHVlLnZhbHVlLmVudW1lcmF0ZWRfaXRlbVsxXTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiY29kZWNfZW51bV9kYXBtX2N0bF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlpbnQgcmV0LCB3aSwgY3RsX2lkOworCXVuc2lnbmVkIGludCB2YWwsIG11eCwgY2hhbmdlOworCXVuc2lnbmVkIGludCBtYXNrOworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0X2xpc3QgKndsaXN0ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3aWRnZXQgPSB3bGlzdC0+d2lkZ2V0c1swXTsKKwlzdHJ1Y3QgZ2JfYXVkaW9fY3RsX2VsZW1fdmFsdWUgZ2J2YWx1ZTsKKwlzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHdpZGdldC0+Y29kZWM7CisJc3RydWN0IGdiYXVkaW9fY29kZWNfaW5mbyAqZ2IgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgc29jX2VudW0gKmUgPSAoc3RydWN0IHNvY19lbnVtICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlOworCisJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPiBlLT5tYXggLSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1vZHVsZSA9IGZpbmRfZ2JfbW9kdWxlKGdiLCBrY29udHJvbC0+aWQubmFtZSk7CisJaWYgKCFtb2R1bGUpCisJCXJldHVybiAtRUlOVkFMOworCisJY3RsX2lkID0gZ2JhdWRpb19tYXBfd2NvbnRyb2xuYW1lKG1vZHVsZSwga2NvbnRyb2wtPmlkLm5hbWUpOworCWlmIChjdGxfaWQgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNoYW5nZSA9IDA7CisJYnVuZGxlID0gdG9fZ2JfYnVuZGxlKG1vZHVsZS0+ZGV2KTsKKworCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoYnVuZGxlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZ2JfYXVkaW9fZ2JfZ2V0X2NvbnRyb2wobW9kdWxlLT5tZ210X2Nvbm5lY3Rpb24sIGN0bF9pZCwKKwkJCQkgICAgICBHQl9BVURJT19JTlZBTElEX0lOREVYLCAmZ2J2YWx1ZSk7CisKKwlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChidW5kbGUpOworCisJaWYgKHJldCkgeworCQlkZXZfZXJyX3JhdGVsaW1pdGVkKGNvZGVjLT5kZXYsICIlZDpFcnJvciBpbiAlcyBmb3IgJXNcbiIsIHJldCwKKwkJCQkgICAgX19mdW5jX18sIGtjb250cm9sLT5pZC5uYW1lKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwltdXggPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCXZhbCA9IG11eCA8PCBlLT5zaGlmdF9sOworCW1hc2sgPSBlLT5tYXNrIDw8IGUtPnNoaWZ0X2w7CisKKwlpZiAoZ2J2YWx1ZS52YWx1ZS5lbnVtZXJhdGVkX2l0ZW1bMF0gIT0KKwkgICAgdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSkgeworCQljaGFuZ2UgPSAxOworCQlnYnZhbHVlLnZhbHVlLmVudW1lcmF0ZWRfaXRlbVswXSA9CisJCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCX0KKworCWlmIChlLT5zaGlmdF9sICE9IGUtPnNoaWZ0X3IpIHsKKwkJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPiBlLT5tYXggLSAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXZhbCB8PSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdIDw8IGUtPnNoaWZ0X3I7CisJCW1hc2sgfD0gZS0+bWFzayA8PCBlLT5zaGlmdF9yOworCQlpZiAoZ2J2YWx1ZS52YWx1ZS5lbnVtZXJhdGVkX2l0ZW1bMV0gIT0KKwkJICAgIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0pIHsKKwkJCWNoYW5nZSA9IDE7CisJCQlnYnZhbHVlLnZhbHVlLmVudW1lcmF0ZWRfaXRlbVsxXSA9CisJCQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXTsKKwkJfQorCX0KKworCWlmIChjaGFuZ2UpIHsKKwkJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhidW5kbGUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBnYl9hdWRpb19nYl9zZXRfY29udHJvbChtb2R1bGUtPm1nbXRfY29ubmVjdGlvbiwgY3RsX2lkLAorCQkJCQkgICAgICBHQl9BVURJT19JTlZBTElEX0lOREVYLCAmZ2J2YWx1ZSk7CisKKwkJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoYnVuZGxlKTsKKworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyX3JhdGVsaW1pdGVkKGNvZGVjLT5kZXYsCisJCQkJCSAgICAiJWQ6RXJyb3IgaW4gJXMgZm9yICVzXG4iLCByZXQsCisJCQkJCSAgICBfX2Z1bmNfXywga2NvbnRyb2wtPmlkLm5hbWUpOworCQl9CisJCWZvciAod2kgPSAwOyB3aSA8IHdsaXN0LT5udW1fd2lkZ2V0czsgd2krKykgeworCQkJd2lkZ2V0ID0gd2xpc3QtPndpZGdldHNbd2ldOworCisJCQl3aWRnZXQtPnZhbHVlID0gdmFsOworCQkJd2lkZ2V0LT5kYXBtLT51cGRhdGUgPSBOVUxMOworCQkJc25kX3NvY19kYXBtX211eF91cGRhdGVfcG93ZXIod2lkZ2V0LCBrY29udHJvbCwgbXV4LCBlKTsKKwkJfQorCX0KKworCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBpbnQgZ2JhdWRpb190cGxnX2NyZWF0ZV9lbnVtX2N0bChzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqZ2IsCisJCQkJCXN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICprY3RsLAorCQkJCQlzdHJ1Y3QgZ2JfYXVkaW9fY29udHJvbCAqY3RsKQoreworCXN0cnVjdCBzb2NfZW51bSAqZ2JlOworCXN0cnVjdCBnYl9hdWRpb19lbnVtZXJhdGVkICpnYl9lbnVtOworCWludCBpOworCisJZ2JlID0gZGV2bV9remFsbG9jKGdiLT5kZXYsIHNpemVvZigqZ2JlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFnYmUpCisJCXJldHVybiAtRU5PTUVNOworCisJZ2JfZW51bSA9ICZjdGwtPmluZm8udmFsdWUuZW51bWVyYXRlZDsKKworCS8qIHNpbmNlIGNvdW50PTEsIGFuZCByZWcgaXMgZHVtbXkgKi8KKwlnYmUtPm1heCA9IGdiX2VudW0tPml0ZW1zOworCWdiZS0+dGV4dHMgPSBnYl9nZW5lcmF0ZV9lbnVtX3N0cmluZ3MoZ2IsIGdiX2VudW0pOworCisJLyogZGVidWcgZW51bSBpbmZvICovCisJZGV2X2RiZyhnYi0+ZGV2LCAiTWF4OiVkLCBuYW1lX2xlbmd0aDolZFxuIiwgZ2JfZW51bS0+aXRlbXMsCisJCSBnYl9lbnVtLT5uYW1lc19sZW5ndGgpOworCWZvciAoaSA9IDA7IGkgPCBnYl9lbnVtLT5pdGVtczsgaSsrKQorCQlkZXZfZGJnKGdiLT5kZXYsICJzcmNbJWRdOiAlc1xuIiwgaSwgZ2JlLT50ZXh0c1tpXSk7CisKKwkqa2N0bCA9IChzdHJ1Y3Qgc25kX2tjb250cm9sX25ldykKKwkJU09DX0RBUE1fRU5VTV9FWFQoY3RsLT5uYW1lLCAqZ2JlLCBnYmNvZGVjX2VudW1fZGFwbV9jdGxfZ2V0LAorCQkJCSAgZ2Jjb2RlY19lbnVtX2RhcG1fY3RsX3B1dCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JhdWRpb190cGxnX2NyZWF0ZV9taXhlcl9jdGwoc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKmdiLAorCQkJCQkgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICprY3RsLAorCQkJCQkgICAgIHN0cnVjdCBnYl9hdWRpb19jb250cm9sICpjdGwpCit7CisJc3RydWN0IGdiYXVkaW9fY3RsX3B2dCAqY3RsZGF0YTsKKworCWN0bGRhdGEgPSBkZXZtX2t6YWxsb2MoZ2ItPmRldiwgc2l6ZW9mKHN0cnVjdCBnYmF1ZGlvX2N0bF9wdnQpLAorCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmICghY3RsZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisJY3RsZGF0YS0+Y3RsX2lkID0gY3RsLT5pZDsKKwljdGxkYXRhLT5kYXRhX2Nwb3J0ID0gY3RsLT5kYXRhX2Nwb3J0OworCWN0bGRhdGEtPmFjY2VzcyA9IGN0bC0+YWNjZXNzOworCWN0bGRhdGEtPnZjb3VudCA9IGN0bC0+Y291bnRfdmFsdWVzOworCWN0bGRhdGEtPmluZm8gPSAmY3RsLT5pbmZvOworCSprY3RsID0gKHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3KQorCQlTT0NfREFQTV9NSVhFUl9HQihjdGwtPm5hbWUsIGN0bC0+Y291bnQsIGN0bGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JhdWRpb190cGxnX2NyZWF0ZV93Y29udHJvbChzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqZ2IsCisJCQkJCSAgICAgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmtjdGwsCisJCQkJCSAgICAgc3RydWN0IGdiX2F1ZGlvX2NvbnRyb2wgKmN0bCkKK3sKKwlpbnQgcmV0OworCisJc3dpdGNoIChjdGwtPmlmYWNlKSB7CisJY2FzZSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUjoKKwkJc3dpdGNoIChjdGwtPmluZm8udHlwZSkgeworCQljYXNlIEdCX0FVRElPX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDoKKwkJCXJldCA9IGdiYXVkaW9fdHBsZ19jcmVhdGVfZW51bV9jdGwoZ2IsIGtjdGwsIGN0bCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IGdiYXVkaW9fdHBsZ19jcmVhdGVfbWl4ZXJfY3RsKGdiLCBrY3RsLCBjdGwpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl9CisKKwlkZXZfZGJnKGdiLT5kZXYsICIlczolZCBEQVBNIGNvbnRyb2wgY3JlYXRlZCwgcmV0OiVkXG4iLCBjdGwtPm5hbWUsCisJCWN0bC0+aWQsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYmF1ZGlvX3dpZGdldF9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCWludCB3aWQ7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSB3LT5jb2RlYzsKKwlzdHJ1Y3QgZ2JhdWRpb19jb2RlY19pbmZvICpnYmNvZGVjID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKm1vZHVsZTsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGU7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyAlcyAlZFxuIiwgX19mdW5jX18sIHctPm5hbWUsIGV2ZW50KTsKKworCS8qIEZpbmQgcmVsZXZhbnQgbW9kdWxlICovCisJbW9kdWxlID0gZmluZF9nYl9tb2R1bGUoZ2Jjb2RlYywgdy0+bmFtZSk7CisJaWYgKCFtb2R1bGUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogbWFwIG5hbWUgdG8gd2lkZ2V0IGlkICovCisJd2lkID0gZ2JhdWRpb19tYXBfd2lkZ2V0bmFtZShtb2R1bGUsIHctPm5hbWUpOworCWlmICh3aWQgPCAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkludmFsaWQgd2lkZ2V0IG5hbWU6JXNcbiIsIHctPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlidW5kbGUgPSB0b19nYl9idW5kbGUobW9kdWxlLT5kZXYpOworCisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhidW5kbGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJcmV0ID0gZ2JfYXVkaW9fZ2JfZW5hYmxlX3dpZGdldChtb2R1bGUtPm1nbXRfY29ubmVjdGlvbiwgd2lkKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBnYmF1ZGlvX21vZHVsZV91cGRhdGUoZ2Jjb2RlYywgdywgbW9kdWxlLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCXJldCA9IGdiX2F1ZGlvX2diX2Rpc2FibGVfd2lkZ2V0KG1vZHVsZS0+bWdtdF9jb25uZWN0aW9uLCB3aWQpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IGdiYXVkaW9fbW9kdWxlX3VwZGF0ZShnYmNvZGVjLCB3LCBtb2R1bGUsIDApOworCQlicmVhazsKKwl9CisJaWYgKHJldCkKKwkJZGV2X2Vycl9yYXRlbGltaXRlZChjb2RlYy0+ZGV2LAorCQkJCSAgICAiJWQ6IHdpZGdldCwgZXZlbnQ6JWQgZmFpbGVkOiVkXG4iLCB3aWQsCisJCQkJICAgIGV2ZW50LCByZXQpOworCisJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoYnVuZGxlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JhdWRpb190cGxnX2NyZWF0ZV93aWRnZXQoc3RydWN0IGdiYXVkaW9fbW9kdWxlX2luZm8gKm1vZHVsZSwKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqZHcsCisJCQkJICAgICAgc3RydWN0IGdiX2F1ZGlvX3dpZGdldCAqdywgaW50ICp3X3NpemUpCit7CisJaW50IGksIHJldCwgY3NpemU7CisJc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKndpZGdldF9rY3RsczsKKwlzdHJ1Y3QgZ2JfYXVkaW9fY29udHJvbCAqY3VycjsKKwlzdHJ1Y3QgZ2JhdWRpb19jb250cm9sICpjb250cm9sLCAqX2NvbnRyb2w7CisJc2l6ZV90IHNpemU7CisJY2hhciB0ZW1wX25hbWVbTkFNRV9TSVpFXTsKKworCXJldCA9IGdiYXVkaW9fdmFsaWRhdGVfa2NvbnRyb2xfY291bnQodyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKG1vZHVsZS0+ZGV2LCAiSW5hdmxpZCBrY29udHJvbCBjb3VudD0lZCBmb3IgJXNcbiIsCisJCQl3LT5uY29udHJvbHMsIHctPm5hbWUpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Iga2NvbnRyb2wgKi8KKwlpZiAody0+bmNvbnRyb2xzKSB7CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IHNuZF9rY29udHJvbF9uZXcpICogdy0+bmNvbnRyb2xzOworCQl3aWRnZXRfa2N0bHMgPSBkZXZtX2t6YWxsb2MobW9kdWxlLT5kZXYsIHNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIXdpZGdldF9rY3RscykKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCSp3X3NpemUgPSBzaXplb2Yoc3RydWN0IGdiX2F1ZGlvX3dpZGdldCk7CisKKwkvKiBjcmVhdGUgcmVsZXZhbnQga2NvbnRyb2xzICovCisJY3VyciA9IHctPmN0bDsKKwlmb3IgKGkgPSAwOyBpIDwgdy0+bmNvbnRyb2xzOyBpKyspIHsKKwkJcmV0ID0gZ2JhdWRpb190cGxnX2NyZWF0ZV93Y29udHJvbChtb2R1bGUsICZ3aWRnZXRfa2N0bHNbaV0sCisJCQkJCQkgICBjdXJyKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihtb2R1bGUtPmRldiwKKwkJCQkiJXM6JWQgdHlwZSB3aWRnZXRfY3RsIG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkJY3Vyci0+bmFtZSwgY3Vyci0+aWZhY2UpOworCQkJZ290byBlcnJvcjsKKwkJfQorCQljb250cm9sID0gZGV2bV9remFsbG9jKG1vZHVsZS0+ZGV2LAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGdiYXVkaW9fY29udHJvbCksCisJCQkJICAgICAgIEdGUF9LRVJORUwpOworCQlpZiAoIWNvbnRyb2wpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGVycm9yOworCQl9CisJCWNvbnRyb2wtPmlkID0gY3Vyci0+aWQ7CisJCWNvbnRyb2wtPm5hbWUgPSBjdXJyLT5uYW1lOworCQljb250cm9sLT53bmFtZSA9IHctPm5hbWU7CisKKwkJaWYgKGN1cnItPmluZm8udHlwZSA9PSBHQl9BVURJT19DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQpIHsKKwkJCXN0cnVjdCBnYl9hdWRpb19lbnVtZXJhdGVkICpnYmVudW0gPQorCQkJCSZjdXJyLT5pbmZvLnZhbHVlLmVudW1lcmF0ZWQ7CisKKwkJCWNzaXplID0gb2Zmc2V0b2Yoc3RydWN0IGdiX2F1ZGlvX2NvbnRyb2wsIGluZm8pOworCQkJY3NpemUgKz0gb2Zmc2V0b2Yoc3RydWN0IGdiX2F1ZGlvX2N0bF9lbGVtX2luZm8sIHZhbHVlKTsKKwkJCWNzaXplICs9IG9mZnNldG9mKHN0cnVjdCBnYl9hdWRpb19lbnVtZXJhdGVkLCBuYW1lcyk7CisJCQljc2l6ZSArPSBnYmVudW0tPm5hbWVzX2xlbmd0aDsKKwkJCWNvbnRyb2wtPnRleHRzID0gKGNvbnN0IGNoYXIgKiBjb25zdCAqKQorCQkJCWdiX2dlbmVyYXRlX2VudW1fc3RyaW5ncyhtb2R1bGUsIGdiZW51bSk7CisJCQljb250cm9sLT5pdGVtcyA9IGdiZW51bS0+aXRlbXM7CisJCX0gZWxzZQorCQkJY3NpemUgPSBzaXplb2Yoc3RydWN0IGdiX2F1ZGlvX2NvbnRyb2wpOworCQkqd19zaXplICs9IGNzaXplOworCQljdXJyID0gKHZvaWQgKiljdXJyICsgY3NpemU7CisJCWxpc3RfYWRkKCZjb250cm9sLT5saXN0LCAmbW9kdWxlLT53aWRnZXRfY3RsX2xpc3QpOworCQlkZXZfZGJnKG1vZHVsZS0+ZGV2LCAiJXM6IGNvbnRyb2wgb2YgdHlwZSAlZCBjcmVhdGVkXG4iLAorCQkJd2lkZ2V0X2tjdGxzW2ldLm5hbWUsIHdpZGdldF9rY3Rsc1tpXS5pZmFjZSk7CisJfQorCisJLyogUHJlZml4IGRldl9pZCB0byB3aWRnZXQgY29udHJvbF9uYW1lICovCisJc3RybGNweSh0ZW1wX25hbWUsIHctPm5hbWUsIE5BTUVfU0laRSk7CisJc25wcmludGYody0+bmFtZSwgTkFNRV9TSVpFLCAiR0IgJWQgJXMiLCBtb2R1bGUtPmRldl9pZCwgdGVtcF9uYW1lKTsKKworCXN3aXRjaCAody0+dHlwZSkgeworCWNhc2Ugc25kX3NvY19kYXBtX3NwazoKKwkJKmR3ID0gKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0KQorCQkJU05EX1NPQ19EQVBNX1NQSyh3LT5uYW1lLCBnYmNvZGVjX2V2ZW50X3Nwayk7CisJCW1vZHVsZS0+b3BfZGV2aWNlcyB8PSBHQkFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKwkJYnJlYWs7CisJY2FzZSBzbmRfc29jX2RhcG1faHA6CisJCSpkdyA9IChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCkKKwkJCVNORF9TT0NfREFQTV9IUCh3LT5uYW1lLCBnYmNvZGVjX2V2ZW50X2hwKTsKKwkJbW9kdWxlLT5vcF9kZXZpY2VzIHw9IChHQkFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVAorCQkJCQl8IEdCQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkUpOworCQltb2R1bGUtPmlwX2RldmljZXMgfD0gR0JBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVDsKKwkJYnJlYWs7CisJY2FzZSBzbmRfc29jX2RhcG1fbWljOgorCQkqZHcgPSAoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQpCisJCQlTTkRfU09DX0RBUE1fTUlDKHctPm5hbWUsIGdiY29kZWNfZXZlbnRfaW50X21pYyk7CisJCW1vZHVsZS0+aXBfZGV2aWNlcyB8PSBHQkFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQzsKKwkJYnJlYWs7CisJY2FzZSBzbmRfc29jX2RhcG1fb3V0cHV0OgorCQkqZHcgPSAoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQpU05EX1NPQ19EQVBNX09VVFBVVCh3LT5uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBzbmRfc29jX2RhcG1faW5wdXQ6CisJCSpkdyA9IChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldClTTkRfU09DX0RBUE1fSU5QVVQody0+bmFtZSk7CisJCWJyZWFrOworCWNhc2Ugc25kX3NvY19kYXBtX3N3aXRjaDoKKwkJKmR3ID0gKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0KQorCQkJU05EX1NPQ19EQVBNX1NXSVRDSF9FKHctPm5hbWUsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCQkJICAgIHdpZGdldF9rY3RscywgZ2JhdWRpb193aWRnZXRfZXZlbnQsCisJCQkJCSAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8CisJCQkJCSAgICBTTkRfU09DX0RBUE1fUE9TVF9QTUQpOworCQlicmVhazsKKwljYXNlIHNuZF9zb2NfZGFwbV9wZ2E6CisJCSpkdyA9IChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCkKKwkJCVNORF9TT0NfREFQTV9QR0FfRSh3LT5uYW1lLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDAsCisJCQkJCSAgIGdiYXVkaW9fd2lkZ2V0X2V2ZW50LAorCQkJCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8CisJCQkJCSAgIFNORF9TT0NfREFQTV9QT1NUX1BNRCk7CisJCWJyZWFrOworCWNhc2Ugc25kX3NvY19kYXBtX21peGVyOgorCQkqZHcgPSAoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQpCisJCQlTTkRfU09DX0RBUE1fTUlYRVJfRSh3LT5uYW1lLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsCisJCQkJCSAgIDAsIGdiYXVkaW9fd2lkZ2V0X2V2ZW50LAorCQkJCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8CisJCQkJCSAgIFNORF9TT0NfREFQTV9QT1NUX1BNRCk7CisJCWJyZWFrOworCWNhc2Ugc25kX3NvY19kYXBtX211eDoKKwkJKmR3ID0gKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0KQorCQkJU05EX1NPQ19EQVBNX01VWF9FKHctPm5hbWUsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCQkJIHdpZGdldF9rY3RscywgZ2JhdWRpb193aWRnZXRfZXZlbnQsCisJCQkJCSBTTkRfU09DX0RBUE1fUFJFX1BNVSB8CisJCQkJCSBTTkRfU09DX0RBUE1fUE9TVF9QTUQpOworCQlicmVhazsKKwljYXNlIHNuZF9zb2NfZGFwbV9haWZfaW46CisJCSpkdyA9IChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCkKKwkJCVNORF9TT0NfREFQTV9BSUZfSU5fRSh3LT5uYW1lLCB3LT5zbmFtZSwgMCwKKwkJCQkJICAgICAgU05EX1NPQ19OT1BNLAorCQkJCQkgICAgICAwLCAwLCBnYmF1ZGlvX3dpZGdldF9ldmVudCwKKwkJCQkJICAgICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAorCQkJCQkgICAgICBTTkRfU09DX0RBUE1fUE9TVF9QTUQpOworCQlicmVhazsKKwljYXNlIHNuZF9zb2NfZGFwbV9haWZfb3V0OgorCQkqZHcgPSAoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQpCisJCQlTTkRfU09DX0RBUE1fQUlGX09VVF9FKHctPm5hbWUsIHctPnNuYW1lLCAwLAorCQkJCQkgICAgICAgU05EX1NPQ19OT1BNLAorCQkJCQkgICAgICAgMCwgMCwgZ2JhdWRpb193aWRnZXRfZXZlbnQsCisJCQkJCSAgICAgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8CisJCQkJCSAgICAgICBTTkRfU09DX0RBUE1fUE9TVF9QTUQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKworCWRldl9kYmcobW9kdWxlLT5kZXYsICIlczogd2lkZ2V0IG9mIHR5cGUgJWQgY3JlYXRlZFxuIiwgZHctPm5hbWUsCisJCWR3LT5pZCk7CisJcmV0dXJuIDA7CitlcnJvcjoKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY29udHJvbCwgX2NvbnRyb2wsICZtb2R1bGUtPndpZGdldF9jdGxfbGlzdCwKKwkJCQkgbGlzdCkgeworCQlsaXN0X2RlbCgmY29udHJvbC0+bGlzdCk7CisJCWRldm1fa2ZyZWUobW9kdWxlLT5kZXYsIGNvbnRyb2wpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiYXVkaW9fdHBsZ19wcm9jZXNzX2tjb250cm9scyhzdHJ1Y3QgZ2JhdWRpb19tb2R1bGVfaW5mbyAqbW9kdWxlLAorCQkJCSAgIHN0cnVjdCBnYl9hdWRpb19jb250cm9sICpjb250cm9scykKK3sKKwlpbnQgaSwgY3NpemUsIHJldDsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqZGFwbV9rY3RsczsKKwlzdHJ1Y3QgZ2JfYXVkaW9fY29udHJvbCAqY3VycjsKKwlzdHJ1Y3QgZ2JhdWRpb19jb250cm9sICpjb250cm9sLCAqX2NvbnRyb2w7CisJc2l6ZV90IHNpemU7CisJY2hhciB0ZW1wX25hbWVbTkFNRV9TSVpFXTsKKworCXNpemUgPSBzaXplb2Yoc3RydWN0IHNuZF9rY29udHJvbF9uZXcpICogbW9kdWxlLT5udW1fY29udHJvbHM7CisJZGFwbV9rY3RscyA9IGRldm1fa3phbGxvYyhtb2R1bGUtPmRldiwgc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXBtX2tjdGxzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWN1cnIgPSBjb250cm9sczsKKwlmb3IgKGkgPSAwOyBpIDwgbW9kdWxlLT5udW1fY29udHJvbHM7IGkrKykgeworCQlyZXQgPSBnYmF1ZGlvX3RwbGdfY3JlYXRlX2tjb250cm9sKG1vZHVsZSwgJmRhcG1fa2N0bHNbaV0sCisJCQkJCQkgICBjdXJyKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihtb2R1bGUtPmRldiwgIiVzOiVkIHR5cGUgbm90IHN1cHBvcnRlZFxuIiwKKwkJCQljdXJyLT5uYW1lLCBjdXJyLT5pZmFjZSk7CisJCQlnb3RvIGVycm9yOworCQl9CisJCWNvbnRyb2wgPSBkZXZtX2t6YWxsb2MobW9kdWxlLT5kZXYsIHNpemVvZihzdHJ1Y3QKKwkJCQkJCQkgICBnYmF1ZGlvX2NvbnRyb2wpLAorCQkJCSAgICAgIEdGUF9LRVJORUwpOworCQlpZiAoIWNvbnRyb2wpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGVycm9yOworCQl9CisJCWNvbnRyb2wtPmlkID0gY3Vyci0+aWQ7CisJCS8qIFByZWZpeCBkZXZfaWQgdG8gd2lkZ2V0X25hbWUgKi8KKwkJc3RybGNweSh0ZW1wX25hbWUsIGN1cnItPm5hbWUsIE5BTUVfU0laRSk7CisJCXNucHJpbnRmKGN1cnItPm5hbWUsIE5BTUVfU0laRSwgIkdCICVkICVzIiwgbW9kdWxlLT5kZXZfaWQsCisJCQkgdGVtcF9uYW1lKTsKKwkJY29udHJvbC0+bmFtZSA9IGN1cnItPm5hbWU7CisJCWlmIChjdXJyLT5pbmZvLnR5cGUgPT0gR0JfQVVESU9fQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEKSB7CisJCQlzdHJ1Y3QgZ2JfYXVkaW9fZW51bWVyYXRlZCAqZ2JlbnVtID0KKwkJCQkmY3Vyci0+aW5mby52YWx1ZS5lbnVtZXJhdGVkOworCisJCQljc2l6ZSA9IG9mZnNldG9mKHN0cnVjdCBnYl9hdWRpb19jb250cm9sLCBpbmZvKTsKKwkJCWNzaXplICs9IG9mZnNldG9mKHN0cnVjdCBnYl9hdWRpb19jdGxfZWxlbV9pbmZvLCB2YWx1ZSk7CisJCQljc2l6ZSArPSBvZmZzZXRvZihzdHJ1Y3QgZ2JfYXVkaW9fZW51bWVyYXRlZCwgbmFtZXMpOworCQkJY3NpemUgKz0gZ2JlbnVtLT5uYW1lc19sZW5ndGg7CisJCQljb250cm9sLT50ZXh0cyA9IChjb25zdCBjaGFyICogY29uc3QgKikKKwkJCQlnYl9nZW5lcmF0ZV9lbnVtX3N0cmluZ3MobW9kdWxlLCBnYmVudW0pOworCQkJY29udHJvbC0+aXRlbXMgPSBnYmVudW0tPml0ZW1zOworCQl9IGVsc2UKKwkJCWNzaXplID0gc2l6ZW9mKHN0cnVjdCBnYl9hdWRpb19jb250cm9sKTsKKworCQlsaXN0X2FkZCgmY29udHJvbC0+bGlzdCwgJm1vZHVsZS0+Y3RsX2xpc3QpOworCQlkZXZfZGJnKG1vZHVsZS0+ZGV2LCAiJWQ6JXMgY3JlYXRlZCBvZiB0eXBlICVkXG4iLCBjdXJyLT5pZCwKKwkJCWN1cnItPm5hbWUsIGN1cnItPmluZm8udHlwZSk7CisJCWN1cnIgPSAodm9pZCAqKWN1cnIgKyBjc2l6ZTsKKwl9CisJbW9kdWxlLT5jb250cm9scyA9IGRhcG1fa2N0bHM7CisKKwlyZXR1cm4gMDsKK2Vycm9yOgorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjb250cm9sLCBfY29udHJvbCwgJm1vZHVsZS0+Y3RsX2xpc3QsCisJCQkJIGxpc3QpIHsKKwkJbGlzdF9kZWwoJmNvbnRyb2wtPmxpc3QpOworCQlkZXZtX2tmcmVlKG1vZHVsZS0+ZGV2LCBjb250cm9sKTsKKwl9CisJZGV2bV9rZnJlZShtb2R1bGUtPmRldiwgZGFwbV9rY3Rscyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYmF1ZGlvX3RwbGdfcHJvY2Vzc193aWRnZXRzKHN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGUsCisJCQkJICAgc3RydWN0IGdiX2F1ZGlvX3dpZGdldCAqd2lkZ2V0cykKK3sKKwlpbnQgaSwgcmV0LCB3X3NpemU7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKmRhcG1fd2lkZ2V0czsKKwlzdHJ1Y3QgZ2JfYXVkaW9fd2lkZ2V0ICpjdXJyOworCXN0cnVjdCBnYmF1ZGlvX3dpZGdldCAqd2lkZ2V0LCAqX3dpZGdldDsKKwlzaXplX3Qgc2l6ZTsKKworCXNpemUgPSBzaXplb2Yoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQpICogbW9kdWxlLT5udW1fZGFwbV93aWRnZXRzOworCWRhcG1fd2lkZ2V0cyA9IGRldm1fa3phbGxvYyhtb2R1bGUtPmRldiwgc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXBtX3dpZGdldHMpCisJCXJldHVybiAtRU5PTUVNOworCisJY3VyciA9IHdpZGdldHM7CisJZm9yIChpID0gMDsgaSA8IG1vZHVsZS0+bnVtX2RhcG1fd2lkZ2V0czsgaSsrKSB7CisJCXJldCA9IGdiYXVkaW9fdHBsZ19jcmVhdGVfd2lkZ2V0KG1vZHVsZSwgJmRhcG1fd2lkZ2V0c1tpXSwKKwkJCQkJCSBjdXJyLCAmd19zaXplKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihtb2R1bGUtPmRldiwgIiVzOiVkIHR5cGUgbm90IHN1cHBvcnRlZFxuIiwKKwkJCQljdXJyLT5uYW1lLCBjdXJyLT50eXBlKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJd2lkZ2V0ID0gZGV2bV9remFsbG9jKG1vZHVsZS0+ZGV2LCBzaXplb2Yoc3RydWN0CisJCQkJCQkJICAgZ2JhdWRpb193aWRnZXQpLAorCQkJCSAgICAgIEdGUF9LRVJORUwpOworCQlpZiAoIXdpZGdldCkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJd2lkZ2V0LT5pZCA9IGN1cnItPmlkOworCQl3aWRnZXQtPm5hbWUgPSBjdXJyLT5uYW1lOworCQlsaXN0X2FkZCgmd2lkZ2V0LT5saXN0LCAmbW9kdWxlLT53aWRnZXRfbGlzdCk7CisJCWN1cnIgPSAodm9pZCAqKWN1cnIgKyB3X3NpemU7CisJfQorCW1vZHVsZS0+ZGFwbV93aWRnZXRzID0gZGFwbV93aWRnZXRzOworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3aWRnZXQsIF93aWRnZXQsICZtb2R1bGUtPndpZGdldF9saXN0LAorCQkJCSBsaXN0KSB7CisJCWxpc3RfZGVsKCZ3aWRnZXQtPmxpc3QpOworCQlkZXZtX2tmcmVlKG1vZHVsZS0+ZGV2LCB3aWRnZXQpOworCX0KKwlkZXZtX2tmcmVlKG1vZHVsZS0+ZGV2LCBkYXBtX3dpZGdldHMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JhdWRpb190cGxnX3Byb2Nlc3Nfcm91dGVzKHN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGUsCisJCQkJICAgc3RydWN0IGdiX2F1ZGlvX3JvdXRlICpyb3V0ZXMpCit7CisJaW50IGksIHJldDsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlICpkYXBtX3JvdXRlczsKKwlzdHJ1Y3QgZ2JfYXVkaW9fcm91dGUgKmN1cnI7CisJc2l6ZV90IHNpemU7CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUpICogbW9kdWxlLT5udW1fZGFwbV9yb3V0ZXM7CisJZGFwbV9yb3V0ZXMgPSBkZXZtX2t6YWxsb2MobW9kdWxlLT5kZXYsIHNpemUsIEdGUF9LRVJORUwpOworCWlmICghZGFwbV9yb3V0ZXMpCisJCXJldHVybiAtRU5PTUVNOworCisJbW9kdWxlLT5kYXBtX3JvdXRlcyA9IGRhcG1fcm91dGVzOworCWN1cnIgPSByb3V0ZXM7CisKKwlmb3IgKGkgPSAwOyBpIDwgbW9kdWxlLT5udW1fZGFwbV9yb3V0ZXM7IGkrKykgeworCQlkYXBtX3JvdXRlcy0+c2luayA9CisJCQlnYmF1ZGlvX21hcF93aWRnZXRpZChtb2R1bGUsIGN1cnItPmRlc3RpbmF0aW9uX2lkKTsKKwkJaWYgKCFkYXBtX3JvdXRlcy0+c2luaykgeworCQkJZGV2X2Vycihtb2R1bGUtPmRldiwgIiVkOiVkOiVkOiVkIC0gSW52YWxpZCBzaW5rXG4iLAorCQkJCWN1cnItPnNvdXJjZV9pZCwgY3Vyci0+ZGVzdGluYXRpb25faWQsCisJCQkJY3Vyci0+Y29udHJvbF9pZCwgY3Vyci0+aW5kZXgpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJZGFwbV9yb3V0ZXMtPnNvdXJjZSA9CisJCQlnYmF1ZGlvX21hcF93aWRnZXRpZChtb2R1bGUsIGN1cnItPnNvdXJjZV9pZCk7CisJCWlmICghZGFwbV9yb3V0ZXMtPnNvdXJjZSkgeworCQkJZGV2X2Vycihtb2R1bGUtPmRldiwgIiVkOiVkOiVkOiVkIC0gSW52YWxpZCBzb3VyY2VcbiIsCisJCQkJY3Vyci0+c291cmNlX2lkLCBjdXJyLT5kZXN0aW5hdGlvbl9pZCwKKwkJCQljdXJyLT5jb250cm9sX2lkLCBjdXJyLT5pbmRleCk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlkYXBtX3JvdXRlcy0+Y29udHJvbCA9CisJCQlnYmF1ZGlvX21hcF9jb250cm9saWQobW9kdWxlLAorCQkJCQkJICAgICAgY3Vyci0+Y29udHJvbF9pZCwKKwkJCQkJCSAgICAgIGN1cnItPmluZGV4KTsKKwkJaWYgKChjdXJyLT5jb250cm9sX2lkICE9ICBHQkFVRElPX0lOVkFMSURfSUQpICYmCisJCSAgICAhZGFwbV9yb3V0ZXMtPmNvbnRyb2wpIHsKKwkJCWRldl9lcnIobW9kdWxlLT5kZXYsICIlZDolZDolZDolZCAtIEludmFsaWQgY29udHJvbFxuIiwKKwkJCQljdXJyLT5zb3VyY2VfaWQsIGN1cnItPmRlc3RpbmF0aW9uX2lkLAorCQkJCWN1cnItPmNvbnRyb2xfaWQsIGN1cnItPmluZGV4KTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycm9yOworCQl9CisJCWRldl9kYmcobW9kdWxlLT5kZXYsICJSb3V0ZSB7JXMsICVzLCAlc31cbiIsIGRhcG1fcm91dGVzLT5zaW5rLAorCQkJKGRhcG1fcm91dGVzLT5jb250cm9sKSA/IGRhcG1fcm91dGVzLT5jb250cm9sOiJOVUxMIiwKKwkJCWRhcG1fcm91dGVzLT5zb3VyY2UpOworCQlkYXBtX3JvdXRlcysrOworCQljdXJyKys7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCWRldm1fa2ZyZWUobW9kdWxlLT5kZXYsIG1vZHVsZS0+ZGFwbV9yb3V0ZXMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JhdWRpb190cGxnX3Byb2Nlc3NfaGVhZGVyKHN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGUsCisJCQkJIHN0cnVjdCBnYl9hdWRpb190b3BvbG9neSAqdHBsZ19kYXRhKQoreworCS8qIGZldGNoIG5vLiBvZiBrY29udHJvbHMsIHdpZGdldHMgJiByb3V0ZXMgKi8KKwltb2R1bGUtPm51bV9jb250cm9scyA9IHRwbGdfZGF0YS0+bnVtX2NvbnRyb2xzOworCW1vZHVsZS0+bnVtX2RhcG1fd2lkZ2V0cyA9IHRwbGdfZGF0YS0+bnVtX3dpZGdldHM7CisJbW9kdWxlLT5udW1fZGFwbV9yb3V0ZXMgPSB0cGxnX2RhdGEtPm51bV9yb3V0ZXM7CisKKwkvKiB1cGRhdGUgYmxvY2sgb2Zmc2V0ICovCisJbW9kdWxlLT5kYWlfb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpJnRwbGdfZGF0YS0+ZGF0YTsKKwltb2R1bGUtPmNvbnRyb2xfb2Zmc2V0ID0gbW9kdWxlLT5kYWlfb2Zmc2V0ICsgdHBsZ19kYXRhLT5zaXplX2RhaXM7CisJbW9kdWxlLT53aWRnZXRfb2Zmc2V0ID0gbW9kdWxlLT5jb250cm9sX29mZnNldCArCisJCXRwbGdfZGF0YS0+c2l6ZV9jb250cm9sczsKKwltb2R1bGUtPnJvdXRlX29mZnNldCA9IG1vZHVsZS0+d2lkZ2V0X29mZnNldCArCisJCXRwbGdfZGF0YS0+c2l6ZV93aWRnZXRzOworCisJZGV2X2RiZyhtb2R1bGUtPmRldiwgIkRBSSBvZmZzZXQgaXMgMHglbHhcbiIsIG1vZHVsZS0+ZGFpX29mZnNldCk7CisJZGV2X2RiZyhtb2R1bGUtPmRldiwgImNvbnRyb2wgb2Zmc2V0IGlzICVseFxuIiwKKwkJbW9kdWxlLT5jb250cm9sX29mZnNldCk7CisJZGV2X2RiZyhtb2R1bGUtPmRldiwgIndpZGdldCBvZmZzZXQgaXMgJWx4XG4iLCBtb2R1bGUtPndpZGdldF9vZmZzZXQpOworCWRldl9kYmcobW9kdWxlLT5kZXYsICJyb3V0ZSBvZmZzZXQgaXMgJWx4XG4iLCBtb2R1bGUtPnJvdXRlX29mZnNldCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGdiYXVkaW9fdHBsZ19wYXJzZV9kYXRhKHN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGUsCisJCQkgICAgICAgc3RydWN0IGdiX2F1ZGlvX3RvcG9sb2d5ICp0cGxnX2RhdGEpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZ2JfYXVkaW9fY29udHJvbCAqY29udHJvbHM7CisJc3RydWN0IGdiX2F1ZGlvX3dpZGdldCAqd2lkZ2V0czsKKwlzdHJ1Y3QgZ2JfYXVkaW9fcm91dGUgKnJvdXRlczsKKworCWlmICghdHBsZ19kYXRhKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IGdiYXVkaW9fdHBsZ19wcm9jZXNzX2hlYWRlcihtb2R1bGUsIHRwbGdfZGF0YSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKG1vZHVsZS0+ZGV2LCAiJWQ6IEVycm9yIGluIHBhcnNpbmcgdG9wb2xvZ3kgaGVhZGVyXG4iLAorCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBwcm9jZXNzIGNvbnRyb2wgKi8KKwljb250cm9scyA9IChzdHJ1Y3QgZ2JfYXVkaW9fY29udHJvbCAqKW1vZHVsZS0+Y29udHJvbF9vZmZzZXQ7CisJcmV0ID0gZ2JhdWRpb190cGxnX3Byb2Nlc3Nfa2NvbnRyb2xzKG1vZHVsZSwgY29udHJvbHMpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycihtb2R1bGUtPmRldiwKKwkJCSIlZDogRXJyb3IgaW4gcGFyc2luZyBjb250cm9scyBkYXRhXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlkZXZfZGJnKG1vZHVsZS0+ZGV2LCAiQ29udHJvbCBwYXJzaW5nIGZpbmlzaGVkXG4iKTsKKworCS8qIHByb2Nlc3Mgd2lkZ2V0cyAqLworCXdpZGdldHMgPSAoc3RydWN0IGdiX2F1ZGlvX3dpZGdldCAqKW1vZHVsZS0+d2lkZ2V0X29mZnNldDsKKwlyZXQgPSBnYmF1ZGlvX3RwbGdfcHJvY2Vzc193aWRnZXRzKG1vZHVsZSwgd2lkZ2V0cyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKG1vZHVsZS0+ZGV2LAorCQkJIiVkOiBFcnJvciBpbiBwYXJzaW5nIHdpZGdldHMgZGF0YVxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJZGV2X2RiZyhtb2R1bGUtPmRldiwgIldpZGdldCBwYXJzaW5nIGZpbmlzaGVkXG4iKTsKKworCS8qIHByb2Nlc3Mgcm91dGUgKi8KKwlyb3V0ZXMgPSAoc3RydWN0IGdiX2F1ZGlvX3JvdXRlICopbW9kdWxlLT5yb3V0ZV9vZmZzZXQ7CisJcmV0ID0gZ2JhdWRpb190cGxnX3Byb2Nlc3Nfcm91dGVzKG1vZHVsZSwgcm91dGVzKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIobW9kdWxlLT5kZXYsCisJCQkiJWQ6IEVycm9yIGluIHBhcnNpbmcgcm91dGVzIGRhdGFcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCWRldl9kYmcobW9kdWxlLT5kZXYsICJSb3V0ZSBwYXJzaW5nIGZpbmlzaGVkXG4iKTsKKworCS8qIHBhcnNlIGphY2sgY2FwYWJpbGl0aWVzICovCisJaWYgKHRwbGdfZGF0YS0+amFja190eXBlKSB7CisJCW1vZHVsZS0+amFja19tYXNrID0gdHBsZ19kYXRhLT5qYWNrX3R5cGUgJiBHQkNPREVDX0pBQ0tfTUFTSzsKKwkJbW9kdWxlLT5idXR0b25fbWFzayA9IHRwbGdfZGF0YS0+amFja190eXBlICYKKwkJCUdCQ09ERUNfSkFDS19CVVRUT05fTUFTSzsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGdiYXVkaW9fdHBsZ19yZWxlYXNlKHN0cnVjdCBnYmF1ZGlvX21vZHVsZV9pbmZvICptb2R1bGUpCit7CisJc3RydWN0IGdiYXVkaW9fY29udHJvbCAqY29udHJvbCwgKl9jb250cm9sOworCXN0cnVjdCBnYmF1ZGlvX3dpZGdldCAqd2lkZ2V0LCAqX3dpZGdldDsKKworCWlmICghbW9kdWxlLT50b3BvbG9neSkKKwkJcmV0dXJuOworCisJLyogcmVsZWFzZSBrY29udHJvbHMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY29udHJvbCwgX2NvbnRyb2wsICZtb2R1bGUtPmN0bF9saXN0LAorCQkJCSBsaXN0KSB7CisJCWxpc3RfZGVsKCZjb250cm9sLT5saXN0KTsKKwkJZGV2bV9rZnJlZShtb2R1bGUtPmRldiwgY29udHJvbCk7CisJfQorCWlmIChtb2R1bGUtPmNvbnRyb2xzKQorCQlkZXZtX2tmcmVlKG1vZHVsZS0+ZGV2LCBtb2R1bGUtPmNvbnRyb2xzKTsKKworCS8qIHJlbGVhc2Ugd2lkZ2V0IGNvbnRyb2xzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNvbnRyb2wsIF9jb250cm9sLCAmbW9kdWxlLT53aWRnZXRfY3RsX2xpc3QsCisJCQkJIGxpc3QpIHsKKwkJbGlzdF9kZWwoJmNvbnRyb2wtPmxpc3QpOworCQlkZXZtX2tmcmVlKG1vZHVsZS0+ZGV2LCBjb250cm9sKTsKKwl9CisKKwkvKiByZWxlYXNlIHdpZGdldHMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUod2lkZ2V0LCBfd2lkZ2V0LCAmbW9kdWxlLT53aWRnZXRfbGlzdCwKKwkJCQkgbGlzdCkgeworCQlsaXN0X2RlbCgmd2lkZ2V0LT5saXN0KTsKKwkJZGV2bV9rZnJlZShtb2R1bGUtPmRldiwgd2lkZ2V0KTsKKwl9CisJaWYgKG1vZHVsZS0+ZGFwbV93aWRnZXRzKQorCQlkZXZtX2tmcmVlKG1vZHVsZS0+ZGV2LCBtb2R1bGUtPmRhcG1fd2lkZ2V0cyk7CisKKwkvKiByZWxlYXNlIHJvdXRlcyAqLworCWlmIChtb2R1bGUtPmRhcG1fcm91dGVzKQorCQlkZXZtX2tmcmVlKG1vZHVsZS0+ZGV2LCBtb2R1bGUtPmRhcG1fcm91dGVzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1dGhlbnRpY2F0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdXRoZW50aWNhdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ODYyNmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdXRoZW50aWNhdGlvbi5jCkBAIC0wLDAgKzEsNDI5IEBACisvKgorICogR3JleWJ1cyBDb21wb25lbnQgQXV0aGVudGljYXRpb24gUHJvdG9jb2wgKENBUCkgRHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNiBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpbmNsdWRlICJncmV5YnVzLmgiCisKKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgImdyZXlidXNfYXV0aGVudGljYXRpb24uaCIKKyNpbmNsdWRlICJmaXJtd2FyZS5oIgorI2luY2x1ZGUgImdyZXlidXMuaCIKKworI2RlZmluZSBDQVBfVElNRU9VVF9NUwkJMTAwMAorCisvKgorICogTnVtYmVyIG9mIG1pbm9yIGRldmljZXMgdGhpcyBkcml2ZXIgc3VwcG9ydHMuCisgKiBUaGVyZSB3aWxsIGJlIGV4YWN0bHkgb25lIHJlcXVpcmVkIHBlciBJbnRlcmZhY2UuCisgKi8KKyNkZWZpbmUgTlVNX01JTk9SUwkJVThfTUFYCisKK3N0cnVjdCBnYl9jYXAgeworCXN0cnVjdCBkZXZpY2UJCSpwYXJlbnQ7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24JKmNvbm5lY3Rpb247CisJc3RydWN0IGtyZWYJCWtyZWY7CisJc3RydWN0IGxpc3RfaGVhZAlub2RlOworCWJvb2wJCQlkaXNhYmxlZDsgLyogY29ubmVjdGlvbiBnZXR0aW5nIGRpc2FibGVkICovCisKKwlzdHJ1Y3QgbXV0ZXgJCW11dGV4OworCXN0cnVjdCBjZGV2CQljZGV2OworCXN0cnVjdCBkZXZpY2UJCSpjbGFzc19kZXZpY2U7CisJZGV2X3QJCQlkZXZfbnVtOworfTsKKworc3RhdGljIHN0cnVjdCBjbGFzcyAqY2FwX2NsYXNzOworc3RhdGljIGRldl90IGNhcF9kZXZfbnVtOworc3RhdGljIERFRklORV9JREEoY2FwX21pbm9yc19tYXApOworc3RhdGljIExJU1RfSEVBRChjYXBfbGlzdCk7CitzdGF0aWMgREVGSU5FX01VVEVYKGxpc3RfbXV0ZXgpOworCitzdGF0aWMgdm9pZCBjYXBfa3JlZl9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBnYl9jYXAgKmNhcCA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgZ2JfY2FwLCBrcmVmKTsKKworCWtmcmVlKGNhcCk7Cit9CisKKy8qCisgKiBBbGwgdXNlcnMgb2YgY2FwIHRha2UgYSByZWZlcmVuY2UgKGZyb20gd2l0aGluIGxpc3RfbXV0ZXggbG9jayksIGJlZm9yZQorICogdGhleSBnZXQgYSBwb2ludGVyIHRvIHBsYXkgd2l0aC4gQW5kIHRoZSBzdHJ1Y3R1cmUgd2lsbCBiZSBmcmVlZCBvbmx5IGFmdGVyCisgKiB0aGUgbGFzdCB1c2VyIGhhcyBwdXQgdGhlIHJlZmVyZW5jZSB0byBpdC4KKyAqLworc3RhdGljIHZvaWQgcHV0X2NhcChzdHJ1Y3QgZ2JfY2FwICpjYXApCit7CisJa3JlZl9wdXQoJmNhcC0+a3JlZiwgY2FwX2tyZWZfcmVsZWFzZSk7Cit9CisKKy8qIENhbGxlciBtdXN0IGNhbGwgcHV0X2NhcCgpIGFmdGVyIHVzaW5nIHN0cnVjdCBnYl9jYXAgKi8KK3N0YXRpYyBzdHJ1Y3QgZ2JfY2FwICpnZXRfY2FwKHN0cnVjdCBjZGV2ICpjZGV2KQoreworCXN0cnVjdCBnYl9jYXAgKmNhcDsKKworCW11dGV4X2xvY2soJmxpc3RfbXV0ZXgpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjYXAsICZjYXBfbGlzdCwgbm9kZSkgeworCQlpZiAoJmNhcC0+Y2RldiA9PSBjZGV2KSB7CisJCQlrcmVmX2dldCgmY2FwLT5rcmVmKTsKKwkJCWdvdG8gdW5sb2NrOworCQl9CisJfQorCisJY2FwID0gTlVMTDsKKwordW5sb2NrOgorCW11dGV4X3VubG9jaygmbGlzdF9tdXRleCk7CisKKwlyZXR1cm4gY2FwOworfQorCitzdGF0aWMgaW50IGNhcF9nZXRfZW5kcG9pbnRfdWlkKHN0cnVjdCBnYl9jYXAgKmNhcCwgdTggKmV1aWQpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBjYXAtPmNvbm5lY3Rpb247CisJc3RydWN0IGdiX2NhcF9nZXRfZW5kcG9pbnRfdWlkX3Jlc3BvbnNlIHJlc3BvbnNlOworCWludCByZXQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLCBHQl9DQVBfVFlQRV9HRVRfRU5EUE9JTlRfVUlELCBOVUxMLAorCQkJCTAsICZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGNhcC0+cGFyZW50LCAiZmFpbGVkIHRvIGdldCBlbmRwb2ludCB1aWQgKCVkKVxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwltZW1jcHkoZXVpZCwgcmVzcG9uc2UudWlkLCBzaXplb2YocmVzcG9uc2UudWlkKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYXBfZ2V0X2ltc19jZXJ0aWZpY2F0ZShzdHJ1Y3QgZ2JfY2FwICpjYXAsIHUzMiBjbGFzcywgdTMyIGlkLAorCQkJCSAgIHU4ICpjZXJ0aWZpY2F0ZSwgdTMyICpzaXplLCB1OCAqcmVzdWx0KQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gY2FwLT5jb25uZWN0aW9uOworCXN0cnVjdCBnYl9jYXBfZ2V0X2ltc19jZXJ0aWZpY2F0ZV9yZXF1ZXN0ICpyZXF1ZXN0OworCXN0cnVjdCBnYl9jYXBfZ2V0X2ltc19jZXJ0aWZpY2F0ZV9yZXNwb25zZSAqcmVzcG9uc2U7CisJc2l6ZV90IG1heF9zaXplID0gZ2Jfb3BlcmF0aW9uX2dldF9wYXlsb2FkX3NpemVfbWF4KGNvbm5lY3Rpb24pOworCXN0cnVjdCBnYl9vcGVyYXRpb24gKm9wOworCWludCByZXQ7CisKKwlvcCA9IGdiX29wZXJhdGlvbl9jcmVhdGVfZmxhZ3MoY29ubmVjdGlvbiwKKwkJCQkgICAgICAgR0JfQ0FQX1RZUEVfR0VUX0lNU19DRVJUSUZJQ0FURSwKKwkJCQkgICAgICAgc2l6ZW9mKCpyZXF1ZXN0KSwgbWF4X3NpemUsCisJCQkJICAgICAgIEdCX09QRVJBVElPTl9GTEFHX1NIT1JUX1JFU1BPTlNFLAorCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIW9wKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcXVlc3QgPSBvcC0+cmVxdWVzdC0+cGF5bG9hZDsKKwlyZXF1ZXN0LT5jZXJ0aWZpY2F0ZV9jbGFzcyA9IGNwdV90b19sZTMyKGNsYXNzKTsKKwlyZXF1ZXN0LT5jZXJ0aWZpY2F0ZV9pZCA9IGNwdV90b19sZTMyKGlkKTsKKworCXJldCA9IGdiX29wZXJhdGlvbl9yZXF1ZXN0X3NlbmRfc3luYyhvcCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGNhcC0+cGFyZW50LCAiZmFpbGVkIHRvIGdldCBjZXJ0aWZpY2F0ZSAoJWQpXG4iLCByZXQpOworCQlnb3RvIGRvbmU7CisJfQorCisJcmVzcG9uc2UgPSBvcC0+cmVzcG9uc2UtPnBheWxvYWQ7CisJKnJlc3VsdCA9IHJlc3BvbnNlLT5yZXN1bHRfY29kZTsKKwkqc2l6ZSA9IG9wLT5yZXNwb25zZS0+cGF5bG9hZF9zaXplIC0gc2l6ZW9mKCpyZXNwb25zZSk7CisJbWVtY3B5KGNlcnRpZmljYXRlLCByZXNwb25zZS0+Y2VydGlmaWNhdGUsICpzaXplKTsKKworZG9uZToKKwlnYl9vcGVyYXRpb25fcHV0KG9wKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNhcF9hdXRoZW50aWNhdGUoc3RydWN0IGdiX2NhcCAqY2FwLCB1MzIgYXV0aF90eXBlLCB1OCAqdWlkLAorCQkJICAgIHU4ICpjaGFsbGVuZ2UsIHU4ICpyZXN1bHQsIHU4ICphdXRoX3Jlc3BvbnNlLAorCQkJICAgIHUzMiAqc2lnbmF0dXJlX3NpemUsIHU4ICpzaWduYXR1cmUpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBjYXAtPmNvbm5lY3Rpb247CisJc3RydWN0IGdiX2NhcF9hdXRoZW50aWNhdGVfcmVxdWVzdCAqcmVxdWVzdDsKKwlzdHJ1Y3QgZ2JfY2FwX2F1dGhlbnRpY2F0ZV9yZXNwb25zZSAqcmVzcG9uc2U7CisJc2l6ZV90IG1heF9zaXplID0gZ2Jfb3BlcmF0aW9uX2dldF9wYXlsb2FkX3NpemVfbWF4KGNvbm5lY3Rpb24pOworCXN0cnVjdCBnYl9vcGVyYXRpb24gKm9wOworCWludCByZXQ7CisKKwlvcCA9IGdiX29wZXJhdGlvbl9jcmVhdGVfZmxhZ3MoY29ubmVjdGlvbiwgR0JfQ0FQX1RZUEVfQVVUSEVOVElDQVRFLAorCQkJCSAgICAgICBzaXplb2YoKnJlcXVlc3QpLCBtYXhfc2l6ZSwKKwkJCQkgICAgICAgR0JfT1BFUkFUSU9OX0ZMQUdfU0hPUlRfUkVTUE9OU0UsCisJCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmICghb3ApCisJCXJldHVybiAtRU5PTUVNOworCisJcmVxdWVzdCA9IG9wLT5yZXF1ZXN0LT5wYXlsb2FkOworCXJlcXVlc3QtPmF1dGhfdHlwZSA9IGNwdV90b19sZTMyKGF1dGhfdHlwZSk7CisJbWVtY3B5KHJlcXVlc3QtPnVpZCwgdWlkLCBzaXplb2YocmVxdWVzdC0+dWlkKSk7CisJbWVtY3B5KHJlcXVlc3QtPmNoYWxsZW5nZSwgY2hhbGxlbmdlLCBzaXplb2YocmVxdWVzdC0+Y2hhbGxlbmdlKSk7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fcmVxdWVzdF9zZW5kX3N5bmMob3ApOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihjYXAtPnBhcmVudCwgImZhaWxlZCB0byBhdXRoZW50aWNhdGUgKCVkKVxuIiwgcmV0KTsKKwkJZ290byBkb25lOworCX0KKworCXJlc3BvbnNlID0gb3AtPnJlc3BvbnNlLT5wYXlsb2FkOworCSpyZXN1bHQgPSByZXNwb25zZS0+cmVzdWx0X2NvZGU7CisJKnNpZ25hdHVyZV9zaXplID0gb3AtPnJlc3BvbnNlLT5wYXlsb2FkX3NpemUgLSBzaXplb2YoKnJlc3BvbnNlKTsKKwltZW1jcHkoYXV0aF9yZXNwb25zZSwgcmVzcG9uc2UtPnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UtPnJlc3BvbnNlKSk7CisJbWVtY3B5KHNpZ25hdHVyZSwgcmVzcG9uc2UtPnNpZ25hdHVyZSwgKnNpZ25hdHVyZV9zaXplKTsKKworZG9uZToKKwlnYl9vcGVyYXRpb25fcHV0KG9wKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBDaGFyIGRldmljZSBmb3BzICovCisKK3N0YXRpYyBpbnQgY2FwX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGdiX2NhcCAqY2FwID0gZ2V0X2NhcChpbm9kZS0+aV9jZGV2KTsKKworCS8qIGNhcCBzdHJ1Y3R1cmUgY2FuJ3QgZ2V0IGZyZWVkIHVudGlsIGZpbGUgZGVzY3JpcHRvciBpcyBjbG9zZWQgKi8KKwlpZiAoY2FwKSB7CisJCWZpbGUtPnByaXZhdGVfZGF0YSA9IGNhcDsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgY2FwX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGdiX2NhcCAqY2FwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcHV0X2NhcChjYXApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhcF9pb2N0bChzdHJ1Y3QgZ2JfY2FwICpjYXAsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgdm9pZCBfX3VzZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgY2FwX2lvY19nZXRfZW5kcG9pbnRfdWlkIGVuZHBvaW50X3VpZDsKKwlzdHJ1Y3QgY2FwX2lvY19nZXRfaW1zX2NlcnRpZmljYXRlICppbXNfY2VydDsKKwlzdHJ1Y3QgY2FwX2lvY19hdXRoZW50aWNhdGUgKmF1dGhlbnRpY2F0ZTsKKwlzaXplX3Qgc2l6ZTsKKwlpbnQgcmV0OworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIENBUF9JT0NfR0VUX0VORFBPSU5UX1VJRDoKKwkJcmV0ID0gY2FwX2dldF9lbmRwb2ludF91aWQoY2FwLCBlbmRwb2ludF91aWQudWlkKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsICZlbmRwb2ludF91aWQsIHNpemVvZihlbmRwb2ludF91aWQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiAwOworCWNhc2UgQ0FQX0lPQ19HRVRfSU1TX0NFUlRJRklDQVRFOgorCQlzaXplID0gc2l6ZW9mKCppbXNfY2VydCk7CisJCWltc19jZXJ0ID0gbWVtZHVwX3VzZXIoYnVmLCBzaXplKTsKKwkJaWYgKElTX0VSUihpbXNfY2VydCkpCisJCQlyZXR1cm4gUFRSX0VSUihpbXNfY2VydCk7CisKKwkJcmV0ID0gY2FwX2dldF9pbXNfY2VydGlmaWNhdGUoY2FwLCBpbXNfY2VydC0+Y2VydGlmaWNhdGVfY2xhc3MsCisJCQkJCSAgICAgIGltc19jZXJ0LT5jZXJ0aWZpY2F0ZV9pZCwKKwkJCQkJICAgICAgaW1zX2NlcnQtPmNlcnRpZmljYXRlLAorCQkJCQkgICAgICAmaW1zX2NlcnQtPmNlcnRfc2l6ZSwKKwkJCQkJICAgICAgJmltc19jZXJ0LT5yZXN1bHRfY29kZSk7CisJCWlmICghcmV0ICYmIGNvcHlfdG9fdXNlcihidWYsIGltc19jZXJ0LCBzaXplKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCWtmcmVlKGltc19jZXJ0KTsKKworCQlyZXR1cm4gcmV0OworCWNhc2UgQ0FQX0lPQ19BVVRIRU5USUNBVEU6CisJCXNpemUgPSBzaXplb2YoKmF1dGhlbnRpY2F0ZSk7CisJCWF1dGhlbnRpY2F0ZSA9IG1lbWR1cF91c2VyKGJ1Ziwgc2l6ZSk7CisJCWlmIChJU19FUlIoYXV0aGVudGljYXRlKSkKKwkJCXJldHVybiBQVFJfRVJSKGF1dGhlbnRpY2F0ZSk7CisKKwkJcmV0ID0gY2FwX2F1dGhlbnRpY2F0ZShjYXAsIGF1dGhlbnRpY2F0ZS0+YXV0aF90eXBlLAorCQkJCSAgICAgICBhdXRoZW50aWNhdGUtPnVpZCwKKwkJCQkgICAgICAgYXV0aGVudGljYXRlLT5jaGFsbGVuZ2UsCisJCQkJICAgICAgICZhdXRoZW50aWNhdGUtPnJlc3VsdF9jb2RlLAorCQkJCSAgICAgICBhdXRoZW50aWNhdGUtPnJlc3BvbnNlLAorCQkJCSAgICAgICAmYXV0aGVudGljYXRlLT5zaWduYXR1cmVfc2l6ZSwKKwkJCQkgICAgICAgYXV0aGVudGljYXRlLT5zaWduYXR1cmUpOworCQlpZiAoIXJldCAmJiBjb3B5X3RvX3VzZXIoYnVmLCBhdXRoZW50aWNhdGUsIHNpemUpKQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJa2ZyZWUoYXV0aGVudGljYXRlKTsKKworCQlyZXR1cm4gcmV0OworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFRZOworCX0KK30KKworc3RhdGljIGxvbmcgY2FwX2lvY3RsX3VubG9ja2VkKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBnYl9jYXAgKmNhcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUgPSBjYXAtPmNvbm5lY3Rpb24tPmJ1bmRsZTsKKwlpbnQgcmV0ID0gLUVOT0RFVjsKKworCS8qCisJICogU2VyaWFsaXplIGlvY3Rscy4KKwkgKgorCSAqIFdlIGRvbid0IHdhbnQgdGhlIHVzZXIgdG8gZG8gbXVsdGlwbGUgYXV0aGVudGljYXRpb24gb3BlcmF0aW9ucyBpbgorCSAqIHBhcmFsbGVsLgorCSAqCisJICogVGhpcyBpcyBhbHNvIHVzZWQgdG8gcHJvdGVjdCAtPmRpc2FibGVkLCB3aGljaCBpcyB1c2VkIHRvIGNoZWNrIGlmCisJICogdGhlIGNvbm5lY3Rpb24gaXMgZ2V0dGluZyBkaXNjb25uZWN0ZWQsIHNvIHRoYXQgd2UgZG9uJ3Qgc3RhcnQgYW55CisJICogbmV3IG9wZXJhdGlvbnMuCisJICovCisJbXV0ZXhfbG9jaygmY2FwLT5tdXRleCk7CisJaWYgKCFjYXAtPmRpc2FibGVkKSB7CisJCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoYnVuZGxlKTsKKwkJaWYgKCFyZXQpIHsKKwkJCXJldCA9IGNhcF9pb2N0bChjYXAsIGNtZCwgKHZvaWQgX191c2VyICopYXJnKTsKKwkJCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGJ1bmRsZSk7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZjYXAtPm11dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNhcF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBjYXBfb3BlbiwKKwkucmVsZWFzZQk9IGNhcF9yZWxlYXNlLAorCS51bmxvY2tlZF9pb2N0bAk9IGNhcF9pb2N0bF91bmxvY2tlZCwKK307CisKK2ludCBnYl9jYXBfY29ubmVjdGlvbl9pbml0KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCXN0cnVjdCBnYl9jYXAgKmNhcDsKKwlpbnQgcmV0LCBtaW5vcjsKKworCWlmICghY29ubmVjdGlvbikKKwkJcmV0dXJuIDA7CisKKwljYXAgPSBremFsbG9jKHNpemVvZigqY2FwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjYXApCisJCXJldHVybiAtRU5PTUVNOworCisJY2FwLT5wYXJlbnQgPSAmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXY7CisJY2FwLT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKwltdXRleF9pbml0KCZjYXAtPm11dGV4KTsKKwlnYl9jb25uZWN0aW9uX3NldF9kYXRhKGNvbm5lY3Rpb24sIGNhcCk7CisJa3JlZl9pbml0KCZjYXAtPmtyZWYpOworCisJbXV0ZXhfbG9jaygmbGlzdF9tdXRleCk7CisJbGlzdF9hZGQoJmNhcC0+bm9kZSwgJmNhcF9saXN0KTsKKwltdXRleF91bmxvY2soJmxpc3RfbXV0ZXgpOworCisJcmV0ID0gZ2JfY29ubmVjdGlvbl9lbmFibGUoY29ubmVjdGlvbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfbGlzdF9kZWw7CisKKwltaW5vciA9IGlkYV9zaW1wbGVfZ2V0KCZjYXBfbWlub3JzX21hcCwgMCwgTlVNX01JTk9SUywgR0ZQX0tFUk5FTCk7CisJaWYgKG1pbm9yIDwgMCkgeworCQlyZXQgPSBtaW5vcjsKKwkJZ290byBlcnJfY29ubmVjdGlvbl9kaXNhYmxlOworCX0KKworCS8qIEFkZCBhIGNoYXIgZGV2aWNlIHRvIGFsbG93IHVzZXJzcGFjZSB0byBpbnRlcmFjdCB3aXRoIGNhcCAqLworCWNhcC0+ZGV2X251bSA9IE1LREVWKE1BSk9SKGNhcF9kZXZfbnVtKSwgbWlub3IpOworCWNkZXZfaW5pdCgmY2FwLT5jZGV2LCAmY2FwX2ZvcHMpOworCisJcmV0ID0gY2Rldl9hZGQoJmNhcC0+Y2RldiwgY2FwLT5kZXZfbnVtLCAxKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZW1vdmVfaWRhOworCisJLyogQWRkIGEgc29mdCBsaW5rIHRvIHRoZSBwcmV2aW91c2x5IGFkZGVkIGNoYXItZGV2IHdpdGhpbiB0aGUgYnVuZGxlICovCisJY2FwLT5jbGFzc19kZXZpY2UgPSBkZXZpY2VfY3JlYXRlKGNhcF9jbGFzcywgY2FwLT5wYXJlbnQsIGNhcC0+ZGV2X251bSwKKwkJCQkJICBOVUxMLCAiZ2ItYXV0aGVudGljYXRlLSVkIiwgbWlub3IpOworCWlmIChJU19FUlIoY2FwLT5jbGFzc19kZXZpY2UpKSB7CisJCXJldCA9IFBUUl9FUlIoY2FwLT5jbGFzc19kZXZpY2UpOworCQlnb3RvIGVycl9kZWxfY2RldjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2RlbF9jZGV2OgorCWNkZXZfZGVsKCZjYXAtPmNkZXYpOworZXJyX3JlbW92ZV9pZGE6CisJaWRhX3NpbXBsZV9yZW1vdmUoJmNhcF9taW5vcnNfbWFwLCBtaW5vcik7CitlcnJfY29ubmVjdGlvbl9kaXNhYmxlOgorCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShjb25uZWN0aW9uKTsKK2Vycl9saXN0X2RlbDoKKwltdXRleF9sb2NrKCZsaXN0X211dGV4KTsKKwlsaXN0X2RlbCgmY2FwLT5ub2RlKTsKKwltdXRleF91bmxvY2soJmxpc3RfbXV0ZXgpOworCisJcHV0X2NhcChjYXApOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBnYl9jYXBfY29ubmVjdGlvbl9leGl0KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCXN0cnVjdCBnYl9jYXAgKmNhcDsKKworCWlmICghY29ubmVjdGlvbikKKwkJcmV0dXJuOworCisJY2FwID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShjb25uZWN0aW9uKTsKKworCWRldmljZV9kZXN0cm95KGNhcF9jbGFzcywgY2FwLT5kZXZfbnVtKTsKKwljZGV2X2RlbCgmY2FwLT5jZGV2KTsKKwlpZGFfc2ltcGxlX3JlbW92ZSgmY2FwX21pbm9yc19tYXAsIE1JTk9SKGNhcC0+ZGV2X251bSkpOworCisJLyoKKwkgKiBEaXNhbGxvdyBhbnkgbmV3IGlvY3RsIG9wZXJhdGlvbnMgb24gdGhlIGNoYXIgZGV2aWNlIGFuZCB3YWl0IGZvcgorCSAqIGV4aXN0aW5nIG9uZXMgdG8gZmluaXNoLgorCSAqLworCW11dGV4X2xvY2soJmNhcC0+bXV0ZXgpOworCWNhcC0+ZGlzYWJsZWQgPSB0cnVlOworCW11dGV4X3VubG9jaygmY2FwLT5tdXRleCk7CisKKwkvKiBBbGwgcGVuZGluZyBncmV5YnVzIG9wZXJhdGlvbnMgc2hvdWxkIGhhdmUgZmluaXNoZWQgYnkgbm93ICovCisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGNhcC0+Y29ubmVjdGlvbik7CisKKwkvKiBEaXNhbGxvdyBuZXcgdXNlcnMgdG8gZ2V0IGFjY2VzcyB0byB0aGUgY2FwIHN0cnVjdHVyZSAqLworCW11dGV4X2xvY2soJmxpc3RfbXV0ZXgpOworCWxpc3RfZGVsKCZjYXAtPm5vZGUpOworCW11dGV4X3VubG9jaygmbGlzdF9tdXRleCk7CisKKwkvKgorCSAqIEFsbCBjdXJyZW50IHVzZXJzIG9mIGNhcCB3b3VsZCBoYXZlIHRha2VuIGEgcmVmZXJlbmNlIHRvIGl0IGJ5CisJICogbm93LCB3ZSBjYW4gZHJvcCBvdXIgcmVmZXJlbmNlIGFuZCB3YWl0IHRoZSBsYXN0IHVzZXIgd2lsbCBnZXQKKwkgKiBjYXAgZnJlZWQuCisJICovCisJcHV0X2NhcChjYXApOworfQorCitpbnQgY2FwX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJY2FwX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAiZ2JfYXV0aGVudGljYXRlIik7CisJaWYgKElTX0VSUihjYXBfY2xhc3MpKQorCQlyZXR1cm4gUFRSX0VSUihjYXBfY2xhc3MpOworCisJcmV0ID0gYWxsb2NfY2hyZGV2X3JlZ2lvbigmY2FwX2Rldl9udW0sIDAsIE5VTV9NSU5PUlMsCisJCQkJICAiZ2JfYXV0aGVudGljYXRlIik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcmVtb3ZlX2NsYXNzOworCisJcmV0dXJuIDA7CisKK2Vycl9yZW1vdmVfY2xhc3M6CisJY2xhc3NfZGVzdHJveShjYXBfY2xhc3MpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgY2FwX2V4aXQodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oY2FwX2Rldl9udW0sIE5VTV9NSU5PUlMpOworCWNsYXNzX2Rlc3Ryb3koY2FwX2NsYXNzKTsKKwlpZGFfZGVzdHJveSgmY2FwX21pbm9yc19tYXApOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYm9vdHJvbS5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYm9vdHJvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmOTA3MjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9ib290cm9tLmMKQEAgLTAsMCArMSw1MjQgQEAKKy8qCisgKiBCT09UUk9NIEdyZXlidXMgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNiBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorI2luY2x1ZGUgImZpcm13YXJlLmgiCisKKy8qIFRpbWVvdXQsIGluIGppZmZpZXMsIHdpdGhpbiB3aGljaCB0aGUgbmV4dCByZXF1ZXN0IG11c3QgYmUgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgTkVYVF9SRVFfVElNRU9VVF9NUwkxMDAwCisKKy8qCisgKiBGSVhNRTogUmVkdWNlIHRoaXMgdGltZW91dCBvbmNlIHN2YyBjb3JlIGhhbmRsZXMgcGFyYWxsZWwgcHJvY2Vzc2luZyBvZgorICogZXZlbnRzIGZyb20gdGhlIFNWQywgd2hpY2ggYXJlIGhhbmRsZWQgc2VxdWVudGlhbGx5IHRvZGF5LgorICovCisjZGVmaW5lIE1PREVfU1dJVENIX1RJTUVPVVRfTVMJMTAwMDAKKworZW51bSBuZXh0X3JlcXVlc3RfdHlwZSB7CisJTkVYVF9SRVFfRklSTVdBUkVfU0laRSwKKwlORVhUX1JFUV9HRVRfRklSTVdBUkUsCisJTkVYVF9SRVFfUkVBRFlfVE9fQk9PVCwKKwlORVhUX1JFUV9NT0RFX1NXSVRDSCwKK307CisKK3N0cnVjdCBnYl9ib290cm9tIHsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbgkqY29ubmVjdGlvbjsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUJKmZ3OworCXU4CQkJcHJvdG9jb2xfbWFqb3I7CisJdTgJCQlwcm90b2NvbF9taW5vcjsKKwllbnVtIG5leHRfcmVxdWVzdF90eXBlCW5leHRfcmVxdWVzdDsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCWR3b3JrOworCXN0cnVjdCBtdXRleAkJbXV0ZXg7IC8qIFByb3RlY3RzIGJvb3Ryb20tPmZ3ICovCit9OworCitzdGF0aWMgdm9pZCBmcmVlX2Zpcm13YXJlKHN0cnVjdCBnYl9ib290cm9tICpib290cm9tKQoreworCWlmICghYm9vdHJvbS0+ZncpCisJCXJldHVybjsKKworCXJlbGVhc2VfZmlybXdhcmUoYm9vdHJvbS0+ZncpOworCWJvb3Ryb20tPmZ3ID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZ2JfYm9vdHJvbV90aW1lZG91dChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSB0b19kZWxheWVkX3dvcmsod29yayk7CisJc3RydWN0IGdiX2Jvb3Ryb20gKmJvb3Ryb20gPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCBnYl9ib290cm9tLCBkd29yayk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmJvb3Ryb20tPmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2OworCWNvbnN0IGNoYXIgKnJlYXNvbjsKKworCXN3aXRjaCAoYm9vdHJvbS0+bmV4dF9yZXF1ZXN0KSB7CisJY2FzZSBORVhUX1JFUV9GSVJNV0FSRV9TSVpFOgorCQlyZWFzb24gPSAiRmlybXdhcmUgU2l6ZSBSZXF1ZXN0IjsKKwkJYnJlYWs7CisJY2FzZSBORVhUX1JFUV9HRVRfRklSTVdBUkU6CisJCXJlYXNvbiA9ICJHZXQgRmlybXdhcmUgUmVxdWVzdCI7CisJCWJyZWFrOworCWNhc2UgTkVYVF9SRVFfUkVBRFlfVE9fQk9PVDoKKwkJcmVhc29uID0gIlJlYWR5IHRvIEJvb3QgUmVxdWVzdCI7CisJCWJyZWFrOworCWNhc2UgTkVYVF9SRVFfTU9ERV9TV0lUQ0g6CisJCXJlYXNvbiA9ICJJbnRlcmZhY2UgTW9kZSBTd2l0Y2giOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZWFzb24gPSBOVUxMOworCQlkZXZfZXJyKGRldiwgIkludmFsaWQgbmV4dC1yZXF1ZXN0OiAldSIsIGJvb3Ryb20tPm5leHRfcmVxdWVzdCk7CisJCWJyZWFrOworCX0KKworCWRldl9lcnIoZGV2LCAiVGltZWQgb3V0IHdhaXRpbmcgZm9yICVzIGZyb20gdGhlIE1vZHVsZVxuIiwgcmVhc29uKTsKKworCW11dGV4X2xvY2soJmJvb3Ryb20tPm11dGV4KTsKKwlmcmVlX2Zpcm13YXJlKGJvb3Ryb20pOworCW11dGV4X3VubG9jaygmYm9vdHJvbS0+bXV0ZXgpOworCisJLyogVE9ETzogUG93ZXItb2ZmIE1vZHVsZSA/ICovCit9CisKK3N0YXRpYyB2b2lkIGdiX2Jvb3Ryb21fc2V0X3RpbWVvdXQoc3RydWN0IGdiX2Jvb3Ryb20gKmJvb3Ryb20sCisJCQllbnVtIG5leHRfcmVxdWVzdF90eXBlIG5leHQsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKwlib290cm9tLT5uZXh0X3JlcXVlc3QgPSBuZXh0OworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYm9vdHJvbS0+ZHdvcmssIG1zZWNzX3RvX2ppZmZpZXModGltZW91dCkpOworfQorCitzdGF0aWMgdm9pZCBnYl9ib290cm9tX2NhbmNlbF90aW1lb3V0KHN0cnVjdCBnYl9ib290cm9tICpib290cm9tKQoreworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYm9vdHJvbS0+ZHdvcmspOworfQorCisvKgorICogVGhlIGVzMiBjaGlwIGRvZXNuJ3QgaGF2ZSBWSUQvUElEIHByb2dyYW1tZWQgaW50byB0aGUgaGFyZHdhcmUgYW5kIHdlIG5lZWQgdG8KKyAqIGhhY2sgdGhhdCB1cCB0byBkaXN0aW5ndWlzaCBkaWZmZXJlbnQgbW9kdWxlcyBhbmQgdGhlaXIgZmlybXdhcmUgYmxvYnMuCisgKgorICogVGhpcyBmZXRjaGVzIFZJRC9QSUQgKG92ZXIgYm9vdHJvbSBwcm90b2NvbCkgZm9yIGVzMiBjaGlwIG9ubHksIHdoZW4gVklEL1BJRAorICogYWxyZWFkeSBzZW50IGR1cmluZyBob3RwbHVnIGFyZSAwLgorICoKKyAqIE90aGVyd2lzZSwgd2Uga2VlcCBpbnRmLT52ZW5kb3JfaWQvcHJvZHVjdF9pZCBzYW1lIGFzIHdoYXQncyBwYXNzZWQKKyAqIGR1cmluZyBob3RwbHVnLgorICovCitzdGF0aWMgdm9pZCBib290cm9tX2VzMl9maXh1cF92aWRfcGlkKHN0cnVjdCBnYl9ib290cm9tICpib290cm9tKQoreworCXN0cnVjdCBnYl9ib290cm9tX2dldF92aWRfcGlkX3Jlc3BvbnNlIHJlc3BvbnNlOworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gYm9vdHJvbS0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmID0gY29ubmVjdGlvbi0+YnVuZGxlLT5pbnRmOworCWludCByZXQ7CisKKwlpZiAoIShpbnRmLT5xdWlya3MgJiBHQl9JTlRFUkZBQ0VfUVVJUktfTk9fR01QX0lEUykpCisJCXJldHVybjsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sIEdCX0JPT1RST01fVFlQRV9HRVRfVklEX1BJRCwKKwkJCQlOVUxMLCAwLCAmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsCisJCQkiQm9vdHJvbSBnZXQgdmlkL3BpZCBvcGVyYXRpb24gZmFpbGVkICglZClcbiIsIHJldCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIE5PVEU6IFRoaXMgaXMgaGFja2VkLCBzbyB0aGF0IHRoZSBzYW1lIHZhbHVlcyBvZiBWSUQvUElEIGNhbiBiZSB1c2VkCisJICogYnkgbmV4dCBmaXJtd2FyZSBsZXZlbCBhcyB3ZWxsLiBUaGUgdWV2ZW50IGZvciBib290cm9tIHdpbGwgc3RpbGwKKwkgKiBoYXZlIFZJRC9QSUQgYXMgMCwgdGhvdWdoIGFmdGVyIHRoaXMgcG9pbnQgdGhlIHN5c2ZzIGZpbGVzIHdpbGwgc3RhcnQKKwkgKiBzaG93aW5nIHRoZSB1cGRhdGVkIHZhbHVlcy4gQnV0IHllYWgsIHRoYXQncyBhIGJpdCByYWN5IGFzIHRoZSBzYW1lCisJICogc3lzZnMgZmlsZXMgd291bGQgYmUgc2hvd2luZyAwIGJlZm9yZSB0aGlzIHBvaW50LgorCSAqLworCWludGYtPnZlbmRvcl9pZCA9IGxlMzJfdG9fY3B1KHJlc3BvbnNlLnZlbmRvcl9pZCk7CisJaW50Zi0+cHJvZHVjdF9pZCA9IGxlMzJfdG9fY3B1KHJlc3BvbnNlLnByb2R1Y3RfaWQpOworCisJZGV2X2RiZygmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsICJCb290cm9tIGdvdCB2aWQgKDB4JXgpL3BpZCAoMHgleClcbiIsCisJCWludGYtPnZlbmRvcl9pZCwgaW50Zi0+cHJvZHVjdF9pZCk7Cit9CisKKy8qIFRoaXMgcmV0dXJucyBwYXRoIG9mIHRoZSBmaXJtd2FyZSBibG9iIG9uIHRoZSBkaXNrICovCitzdGF0aWMgaW50IGZpbmRfZmlybXdhcmUoc3RydWN0IGdiX2Jvb3Ryb20gKmJvb3Ryb20sIHU4IHN0YWdlKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gYm9vdHJvbS0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmID0gY29ubmVjdGlvbi0+YnVuZGxlLT5pbnRmOworCWNoYXIgZmlybXdhcmVfbmFtZVs0OV07CisJaW50IHJjOworCisJLyogQWxyZWFkeSBoYXZlIGEgZmlybXdhcmUsIGZyZWUgaXQgKi8KKwlmcmVlX2Zpcm13YXJlKGJvb3Ryb20pOworCisJLyogQm9vdHJvbSBwcm90b2NvbCBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgbG9hZGluZyBTdGFnZSAyIGZpcm13YXJlICovCisJaWYgKHN0YWdlICE9IDIpIHsKKwkJZGV2X2VycigmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsICJJbnZhbGlkIGJvb3Qgc3RhZ2U6ICV1XG4iLAorCQkJc3RhZ2UpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIENyZWF0ZSBmaXJtd2FyZSBuYW1lCisJICoKKwkgKiBYWFggTmFtZSBpdCBwcm9wZXJseS4uCisJICovCisJc25wcmludGYoZmlybXdhcmVfbmFtZSwgc2l6ZW9mKGZpcm13YXJlX25hbWUpLAorCQkgRldfTkFNRV9QUkVGSVggIiUwOHhfJTA4eF8lMDh4XyUwOHhfczJsLnRmdGYiLAorCQkgaW50Zi0+ZGRibDFfbWFudWZhY3R1cmVyX2lkLCBpbnRmLT5kZGJsMV9wcm9kdWN0X2lkLAorCQkgaW50Zi0+dmVuZG9yX2lkLCBpbnRmLT5wcm9kdWN0X2lkKTsKKworCS8vIEZJWE1FOgorCS8vIFR1cm4gdG8gZGV2X2RiZyBsYXRlciBhZnRlciBldmVyeW9uZSBoYXMgdmFsaWQgYm9vdGxvYWRlcnMgd2l0aCBnb29kCisJLy8gaWRzLCBidXQgbGVhdmUgdGhpcyBhcyBkZXZfaW5mbyBmb3Igbm93IHRvIG1ha2UgaXQgZWFzaWVyIHRvIHRyYWNrCisJLy8gZG93biAiZW1wdHkiIHZpZC9waWQgbW9kdWxlcy4KKwlkZXZfaW5mbygmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsICJGaXJtd2FyZSBmaWxlICclcycgcmVxdWVzdGVkXG4iLAorCQkgZmlybXdhcmVfbmFtZSk7CisKKwlyYyA9IHJlcXVlc3RfZmlybXdhcmUoJmJvb3Ryb20tPmZ3LCBmaXJtd2FyZV9uYW1lLAorCQkmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXYpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZjb25uZWN0aW9uLT5idW5kbGUtPmRldiwKKwkJCSJmYWlsZWQgdG8gZmluZCAlcyBmaXJtd2FyZSAoJWQpXG4iLCBmaXJtd2FyZV9uYW1lLCByYyk7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGdiX2Jvb3Ryb21fZmlybXdhcmVfc2l6ZV9yZXF1ZXN0KHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wKQoreworCXN0cnVjdCBnYl9ib290cm9tICpib290cm9tID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShvcC0+Y29ubmVjdGlvbik7CisJc3RydWN0IGdiX2Jvb3Ryb21fZmlybXdhcmVfc2l6ZV9yZXF1ZXN0ICpzaXplX3JlcXVlc3QgPSBvcC0+cmVxdWVzdC0+cGF5bG9hZDsKKwlzdHJ1Y3QgZ2JfYm9vdHJvbV9maXJtd2FyZV9zaXplX3Jlc3BvbnNlICpzaXplX3Jlc3BvbnNlOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZvcC0+Y29ubmVjdGlvbi0+YnVuZGxlLT5kZXY7CisJaW50IHJldDsKKworCS8qIERpc2FibGUgdGltZW91dHMgKi8KKwlnYl9ib290cm9tX2NhbmNlbF90aW1lb3V0KGJvb3Ryb20pOworCisJaWYgKG9wLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUgIT0gc2l6ZW9mKCpzaXplX3JlcXVlc3QpKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IGlsbGVnYWwgc2l6ZSBvZiBmaXJtd2FyZSBzaXplIHJlcXVlc3QgKCV6dSAhPSAlenUpXG4iLAorCQkJX19mdW5jX18sIG9wLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUsCisJCQlzaXplb2YoKnNpemVfcmVxdWVzdCkpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIHF1ZXVlX3dvcms7CisJfQorCisJbXV0ZXhfbG9jaygmYm9vdHJvbS0+bXV0ZXgpOworCisJcmV0ID0gZmluZF9maXJtd2FyZShib290cm9tLCBzaXplX3JlcXVlc3QtPnN0YWdlKTsKKwlpZiAocmV0KQorCQlnb3RvIHVubG9jazsKKworCWlmICghZ2Jfb3BlcmF0aW9uX3Jlc3BvbnNlX2FsbG9jKG9wLCBzaXplb2YoKnNpemVfcmVzcG9uc2UpLAorCQkJCQkgR0ZQX0tFUk5FTCkpIHsKKwkJZGV2X2VycihkZXYsICIlczogZXJyb3IgYWxsb2NhdGluZyByZXNwb25zZVxuIiwgX19mdW5jX18pOworCQlmcmVlX2Zpcm13YXJlKGJvb3Ryb20pOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHVubG9jazsKKwl9CisKKwlzaXplX3Jlc3BvbnNlID0gb3AtPnJlc3BvbnNlLT5wYXlsb2FkOworCXNpemVfcmVzcG9uc2UtPnNpemUgPSBjcHVfdG9fbGUzMihib290cm9tLT5mdy0+c2l6ZSk7CisKKwlkZXZfZGJnKGRldiwgIiVzOiBmaXJtd2FyZSBzaXplICVkIGJ5dGVzXG4iLCBfX2Z1bmNfXywgc2l6ZV9yZXNwb25zZS0+c2l6ZSk7CisKK3VubG9jazoKKwltdXRleF91bmxvY2soJmJvb3Ryb20tPm11dGV4KTsKKworcXVldWVfd29yazoKKwlpZiAoIXJldCkgeworCQkvKiBSZWZyZXNoIHRpbWVvdXQgKi8KKwkJZ2JfYm9vdHJvbV9zZXRfdGltZW91dChib290cm9tLCBORVhUX1JFUV9HRVRfRklSTVdBUkUsCisJCQkJICAgICAgIE5FWFRfUkVRX1RJTUVPVVRfTVMpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfYm9vdHJvbV9nZXRfZmlybXdhcmUoc3RydWN0IGdiX29wZXJhdGlvbiAqb3ApCit7CisJc3RydWN0IGdiX2Jvb3Ryb20gKmJvb3Ryb20gPSBnYl9jb25uZWN0aW9uX2dldF9kYXRhKG9wLT5jb25uZWN0aW9uKTsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCXN0cnVjdCBnYl9ib290cm9tX2dldF9maXJtd2FyZV9yZXF1ZXN0ICpmaXJtd2FyZV9yZXF1ZXN0OworCXN0cnVjdCBnYl9ib290cm9tX2dldF9maXJtd2FyZV9yZXNwb25zZSAqZmlybXdhcmVfcmVzcG9uc2U7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJm9wLT5jb25uZWN0aW9uLT5idW5kbGUtPmRldjsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBzaXplOworCWVudW0gbmV4dF9yZXF1ZXN0X3R5cGUgbmV4dF9yZXF1ZXN0OworCWludCByZXQgPSAwOworCisJLyogRGlzYWJsZSB0aW1lb3V0cyAqLworCWdiX2Jvb3Ryb21fY2FuY2VsX3RpbWVvdXQoYm9vdHJvbSk7CisKKwlpZiAob3AtPnJlcXVlc3QtPnBheWxvYWRfc2l6ZSAhPSBzaXplb2YoKmZpcm13YXJlX3JlcXVlc3QpKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IElsbGVnYWwgc2l6ZSBvZiBnZXQgZmlybXdhcmUgcmVxdWVzdCAoJXp1ICV6dSlcbiIsCisJCQlfX2Z1bmNfXywgb3AtPnJlcXVlc3QtPnBheWxvYWRfc2l6ZSwKKwkJCXNpemVvZigqZmlybXdhcmVfcmVxdWVzdCkpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIHF1ZXVlX3dvcms7CisJfQorCisJbXV0ZXhfbG9jaygmYm9vdHJvbS0+bXV0ZXgpOworCisJZncgPSBib290cm9tLT5mdzsKKwlpZiAoIWZ3KSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IGZpcm13YXJlIG5vdCBhdmFpbGFibGVcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byB1bmxvY2s7CisJfQorCisJZmlybXdhcmVfcmVxdWVzdCA9IG9wLT5yZXF1ZXN0LT5wYXlsb2FkOworCW9mZnNldCA9IGxlMzJfdG9fY3B1KGZpcm13YXJlX3JlcXVlc3QtPm9mZnNldCk7CisJc2l6ZSA9IGxlMzJfdG9fY3B1KGZpcm13YXJlX3JlcXVlc3QtPnNpemUpOworCisJaWYgKG9mZnNldCA+PSBmdy0+c2l6ZSB8fCBzaXplID4gZnctPnNpemUgLSBvZmZzZXQpIHsKKwkJZGV2X3dhcm4oZGV2LCAiYmFkIGZpcm13YXJlIHJlcXVlc3QgKG9mZnMgPSAldSwgc2l6ZSA9ICV1KVxuIiwKKwkJCQlvZmZzZXQsIHNpemUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIHVubG9jazsKKwl9CisKKwlpZiAoIWdiX29wZXJhdGlvbl9yZXNwb25zZV9hbGxvYyhvcCwgc2l6ZW9mKCpmaXJtd2FyZV9yZXNwb25zZSkgKyBzaXplLAorCQkJCQkgR0ZQX0tFUk5FTCkpIHsKKwkJZGV2X2VycihkZXYsICIlczogZXJyb3IgYWxsb2NhdGluZyByZXNwb25zZVxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHVubG9jazsKKwl9CisKKwlmaXJtd2FyZV9yZXNwb25zZSA9IG9wLT5yZXNwb25zZS0+cGF5bG9hZDsKKwltZW1jcHkoZmlybXdhcmVfcmVzcG9uc2UtPmRhdGEsIGZ3LT5kYXRhICsgb2Zmc2V0LCBzaXplKTsKKworCWRldl9kYmcoZGV2LCAicmVzcG9uZGluZyB3aXRoIGZpcm13YXJlIChvZmZzID0gJXUsIHNpemUgPSAldSlcbiIsIG9mZnNldCwKKwkJc2l6ZSk7CisKK3VubG9jazoKKwltdXRleF91bmxvY2soJmJvb3Ryb20tPm11dGV4KTsKKworcXVldWVfd29yazoKKwkvKiBSZWZyZXNoIHRpbWVvdXQgKi8KKwlpZiAoIXJldCAmJiAob2Zmc2V0ICsgc2l6ZSA9PSBmdy0+c2l6ZSkpCisJCW5leHRfcmVxdWVzdCA9IE5FWFRfUkVRX1JFQURZX1RPX0JPT1Q7CisJZWxzZQorCQluZXh0X3JlcXVlc3QgPSBORVhUX1JFUV9HRVRfRklSTVdBUkU7CisKKwlnYl9ib290cm9tX3NldF90aW1lb3V0KGJvb3Ryb20sIG5leHRfcmVxdWVzdCwgTkVYVF9SRVFfVElNRU9VVF9NUyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX2Jvb3Ryb21fcmVhZHlfdG9fYm9vdChzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IG9wLT5jb25uZWN0aW9uOworCXN0cnVjdCBnYl9ib290cm9tICpib290cm9tID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShjb25uZWN0aW9uKTsKKwlzdHJ1Y3QgZ2JfYm9vdHJvbV9yZWFkeV90b19ib290X3JlcXVlc3QgKnJ0Yl9yZXF1ZXN0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjb25uZWN0aW9uLT5idW5kbGUtPmRldjsKKwl1OCBzdGF0dXM7CisJaW50IHJldCA9IDA7CisKKwkvKiBEaXNhYmxlIHRpbWVvdXRzICovCisJZ2JfYm9vdHJvbV9jYW5jZWxfdGltZW91dChib290cm9tKTsKKworCWlmIChvcC0+cmVxdWVzdC0+cGF5bG9hZF9zaXplICE9IHNpemVvZigqcnRiX3JlcXVlc3QpKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IElsbGVnYWwgc2l6ZSBvZiByZWFkeSB0byBib290IHJlcXVlc3QgKCV6dSAlenUpXG4iLAorCQkJX19mdW5jX18sIG9wLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUsCisJCQlzaXplb2YoKnJ0Yl9yZXF1ZXN0KSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gcXVldWVfd29yazsKKwl9CisKKwlydGJfcmVxdWVzdCA9IG9wLT5yZXF1ZXN0LT5wYXlsb2FkOworCXN0YXR1cyA9IHJ0Yl9yZXF1ZXN0LT5zdGF0dXM7CisKKwkvKiBSZXR1cm4gZXJyb3IgaWYgdGhlIGJsb2Igd2FzIGludmFsaWQgKi8KKwlpZiAoc3RhdHVzID09IEdCX0JPT1RST01fQk9PVF9TVEFUVVNfSU5WQUxJRCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIHF1ZXVlX3dvcms7CisJfQorCisJLyoKKwkgKiBYWFggU2hvdWxkIHdlIHJldHVybiBlcnJvciBmb3IgaW5zZWN1cmUgZmlybXdhcmU/CisJICovCisJZGV2X2RiZyhkZXYsICJyZWFkeSB0byBib290OiAweCV4LCAwXG4iLCBzdGF0dXMpOworCitxdWV1ZV93b3JrOgorCS8qCisJICogUmVmcmVzaCB0aW1lb3V0LCB0aGUgSW50ZXJmYWNlIHNoYWxsIGxvYWQgdGhlIG5ldyBwZXJzb25hbGl0eSBhbmQKKwkgKiBzZW5kIGEgbmV3IGhvdHBsdWcgcmVxdWVzdCwgd2hpY2ggc2hhbGwgZ2V0IHJpZCBvZiB0aGUgYm9vdHJvbQorCSAqIGNvbm5lY3Rpb24uIEFzIHRoYXQgY2FuIHRha2Ugc29tZSB0aW1lLCBpbmNyZWFzZSB0aGUgdGltZW91dCBhIGJpdC4KKwkgKi8KKwlnYl9ib290cm9tX3NldF90aW1lb3V0KGJvb3Ryb20sIE5FWFRfUkVRX01PREVfU1dJVENILAorCQkJICAgICAgIE1PREVfU1dJVENIX1RJTUVPVVRfTVMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9ib290cm9tX3JlcXVlc3RfaGFuZGxlcihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcCkKK3sKKwl1OCB0eXBlID0gb3AtPnR5cGU7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEdCX0JPT1RST01fVFlQRV9GSVJNV0FSRV9TSVpFOgorCQlyZXR1cm4gZ2JfYm9vdHJvbV9maXJtd2FyZV9zaXplX3JlcXVlc3Qob3ApOworCWNhc2UgR0JfQk9PVFJPTV9UWVBFX0dFVF9GSVJNV0FSRToKKwkJcmV0dXJuIGdiX2Jvb3Ryb21fZ2V0X2Zpcm13YXJlKG9wKTsKKwljYXNlIEdCX0JPT1RST01fVFlQRV9SRUFEWV9UT19CT09UOgorCQlyZXR1cm4gZ2JfYm9vdHJvbV9yZWFkeV90b19ib290KG9wKTsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZvcC0+Y29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsCisJCQkidW5zdXBwb3J0ZWQgcmVxdWVzdDogJXVcbiIsIHR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZ2JfYm9vdHJvbV9nZXRfdmVyc2lvbihzdHJ1Y3QgZ2JfYm9vdHJvbSAqYm9vdHJvbSkKK3sKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUgPSBib290cm9tLT5jb25uZWN0aW9uLT5idW5kbGU7CisJc3RydWN0IGdiX2Jvb3Ryb21fdmVyc2lvbl9yZXF1ZXN0IHJlcXVlc3Q7CisJc3RydWN0IGdiX2Jvb3Ryb21fdmVyc2lvbl9yZXNwb25zZSByZXNwb25zZTsKKwlpbnQgcmV0OworCisJcmVxdWVzdC5tYWpvciA9IEdCX0JPT1RST01fVkVSU0lPTl9NQUpPUjsKKwlyZXF1ZXN0Lm1pbm9yID0gR0JfQk9PVFJPTV9WRVJTSU9OX01JTk9SOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoYm9vdHJvbS0+Y29ubmVjdGlvbiwKKwkJCQlHQl9CT09UUk9NX1RZUEVfVkVSU0lPTiwKKwkJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLCAmcmVzcG9uc2UsCisJCQkJc2l6ZW9mKHJlc3BvbnNlKSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZidW5kbGUtPmRldiwKKwkJCQkiZmFpbGVkIHRvIGdldCBwcm90b2NvbCB2ZXJzaW9uOiAlZFxuIiwKKwkJCQlyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChyZXNwb25zZS5tYWpvciA+IHJlcXVlc3QubWFqb3IpIHsKKwkJZGV2X2VycigmYnVuZGxlLT5kZXYsCisJCQkJInVuc3VwcG9ydGVkIG1ham9yIHByb3RvY29sIHZlcnNpb24gKCV1ID4gJXUpXG4iLAorCQkJCXJlc3BvbnNlLm1ham9yLCByZXF1ZXN0Lm1ham9yKTsKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9CisKKwlib290cm9tLT5wcm90b2NvbF9tYWpvciA9IHJlc3BvbnNlLm1ham9yOworCWJvb3Ryb20tPnByb3RvY29sX21pbm9yID0gcmVzcG9uc2UubWlub3I7CisKKwlkZXZfZGJnKCZidW5kbGUtPmRldiwgIiVzIC0gJXUuJXVcbiIsIF9fZnVuY19fLCByZXNwb25zZS5tYWpvciwKKwkJCXJlc3BvbnNlLm1pbm9yKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX2Jvb3Ryb21fcHJvYmUoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlLAorCQkJCQljb25zdCBzdHJ1Y3QgZ3JleWJ1c19idW5kbGVfaWQgKmlkKQoreworCXN0cnVjdCBncmV5YnVzX2Rlc2NyaXB0b3JfY3BvcnQgKmNwb3J0X2Rlc2M7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisJc3RydWN0IGdiX2Jvb3Ryb20gKmJvb3Ryb207CisJaW50IHJldDsKKworCWlmIChidW5kbGUtPm51bV9jcG9ydHMgIT0gMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljcG9ydF9kZXNjID0gJmJ1bmRsZS0+Y3BvcnRfZGVzY1swXTsKKwlpZiAoY3BvcnRfZGVzYy0+cHJvdG9jb2xfaWQgIT0gR1JFWUJVU19QUk9UT0NPTF9CT09UUk9NKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWJvb3Ryb20gPSBremFsbG9jKHNpemVvZigqYm9vdHJvbSksIEdGUF9LRVJORUwpOworCWlmICghYm9vdHJvbSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljb25uZWN0aW9uID0gZ2JfY29ubmVjdGlvbl9jcmVhdGUoYnVuZGxlLAorCQkJCQkJbGUxNl90b19jcHUoY3BvcnRfZGVzYy0+aWQpLAorCQkJCQkJZ2JfYm9vdHJvbV9yZXF1ZXN0X2hhbmRsZXIpOworCWlmIChJU19FUlIoY29ubmVjdGlvbikpIHsKKwkJcmV0ID0gUFRSX0VSUihjb25uZWN0aW9uKTsKKwkJZ290byBlcnJfZnJlZV9ib290cm9tOworCX0KKworCWdiX2Nvbm5lY3Rpb25fc2V0X2RhdGEoY29ubmVjdGlvbiwgYm9vdHJvbSk7CisKKwlib290cm9tLT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKworCW11dGV4X2luaXQoJmJvb3Ryb20tPm11dGV4KTsKKwlJTklUX0RFTEFZRURfV09SSygmYm9vdHJvbS0+ZHdvcmssIGdiX2Jvb3Ryb21fdGltZWRvdXQpOworCWdyZXlidXNfc2V0X2RydmRhdGEoYnVuZGxlLCBib290cm9tKTsKKworCXJldCA9IGdiX2Nvbm5lY3Rpb25fZW5hYmxlX3R4KGNvbm5lY3Rpb24pOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2Nvbm5lY3Rpb25fZGVzdHJveTsKKworCXJldCA9IGdiX2Jvb3Ryb21fZ2V0X3ZlcnNpb24oYm9vdHJvbSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfY29ubmVjdGlvbl9kaXNhYmxlOworCisJYm9vdHJvbV9lczJfZml4dXBfdmlkX3BpZChib290cm9tKTsKKworCXJldCA9IGdiX2Nvbm5lY3Rpb25fZW5hYmxlKGNvbm5lY3Rpb24pOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2Nvbm5lY3Rpb25fZGlzYWJsZTsKKworCS8qIFJlZnJlc2ggdGltZW91dCAqLworCWdiX2Jvb3Ryb21fc2V0X3RpbWVvdXQoYm9vdHJvbSwgTkVYVF9SRVFfRklSTVdBUkVfU0laRSwKKwkJCSAgICAgICBORVhUX1JFUV9USU1FT1VUX01TKTsKKworCS8qIFRlbGwgYm9vdHJvbSB3ZSdyZSByZWFkeS4gKi8KKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLCBHQl9CT09UUk9NX1RZUEVfQVBfUkVBRFksIE5VTEwsIDAsCisJCQkJTlVMTCwgMCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjb25uZWN0aW9uLT5idW5kbGUtPmRldiwKKwkJCQkiZmFpbGVkIHRvIHNlbmQgQVAgUkVBRFk6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9jYW5jZWxfdGltZW91dDsKKwl9CisKKwlkZXZfZGJnKCZidW5kbGUtPmRldiwgIkFQX1JFQURZIHNlbnRcbiIpOworCisJcmV0dXJuIDA7CisKK2Vycl9jYW5jZWxfdGltZW91dDoKKwlnYl9ib290cm9tX2NhbmNlbF90aW1lb3V0KGJvb3Ryb20pOworZXJyX2Nvbm5lY3Rpb25fZGlzYWJsZToKKwlnYl9jb25uZWN0aW9uX2Rpc2FibGUoY29ubmVjdGlvbik7CitlcnJfY29ubmVjdGlvbl9kZXN0cm95OgorCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShjb25uZWN0aW9uKTsKK2Vycl9mcmVlX2Jvb3Ryb206CisJa2ZyZWUoYm9vdHJvbSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBnYl9ib290cm9tX2Rpc2Nvbm5lY3Qoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlKQoreworCXN0cnVjdCBnYl9ib290cm9tICpib290cm9tID0gZ3JleWJ1c19nZXRfZHJ2ZGF0YShidW5kbGUpOworCisJZGV2X2RiZygmYnVuZGxlLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGJvb3Ryb20tPmNvbm5lY3Rpb24pOworCisJLyogRGlzYWJsZSB0aW1lb3V0cyAqLworCWdiX2Jvb3Ryb21fY2FuY2VsX3RpbWVvdXQoYm9vdHJvbSk7CisKKwkvKgorCSAqIFJlbGVhc2UgZmlybXdhcmU6CisJICoKKwkgKiBBcyB0aGUgY29ubmVjdGlvbiBhbmQgdGhlIGRlbGF5ZWQgd29yayBhcmUgYWxyZWFkeSBkaXNhYmxlZCwgd2UgZG9uJ3QKKwkgKiBuZWVkIHRvIGxvY2sgYWNjZXNzIHRvIGJvb3Ryb20tPmZ3IGhlcmUuCisJICovCisJZnJlZV9maXJtd2FyZShib290cm9tKTsKKworCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShib290cm9tLT5jb25uZWN0aW9uKTsKKwlrZnJlZShib290cm9tKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBncmV5YnVzX2J1bmRsZV9pZCBnYl9ib290cm9tX2lkX3RhYmxlW10gPSB7CisJeyBHUkVZQlVTX0RFVklDRV9DTEFTUyhHUkVZQlVTX0NMQVNTX0JPT1RST00pIH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGdyZXlidXNfZHJpdmVyIGdiX2Jvb3Ryb21fZHJpdmVyID0geworCS5uYW1lCQk9ICJib290cm9tIiwKKwkucHJvYmUJCT0gZ2JfYm9vdHJvbV9wcm9iZSwKKwkuZGlzY29ubmVjdAk9IGdiX2Jvb3Ryb21fZGlzY29ubmVjdCwKKwkuaWRfdGFibGUJPSBnYl9ib290cm9tX2lkX3RhYmxlLAorfTsKKworbW9kdWxlX2dyZXlidXNfZHJpdmVyKGdiX2Jvb3Ryb21fZHJpdmVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYnVuZGxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9idW5kbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmVmNTdkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYnVuZGxlLmMKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiBHcmV5YnVzIGJ1bmRsZXMKKyAqCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE1IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE1IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2luY2x1ZGUgImdyZXlidXMuaCIKKyNpbmNsdWRlICJncmV5YnVzX3RyYWNlLmgiCisKK3N0YXRpYyBzc2l6ZV90IGJ1bmRsZV9jbGFzc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUgPSB0b19nYl9idW5kbGUoZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTAyeFxuIiwgYnVuZGxlLT5jbGFzcyk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFJfUk8oYnVuZGxlX2NsYXNzKTsKKworc3RhdGljIHNzaXplX3QgYnVuZGxlX2lkX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUgPSB0b19nYl9idW5kbGUoZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBidW5kbGUtPmlkKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhidW5kbGVfaWQpOworCitzdGF0aWMgc3NpemVfdCBzdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUgPSB0b19nYl9idW5kbGUoZGV2KTsKKworCWlmIChidW5kbGUtPnN0YXRlID09IE5VTEwpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIlxuIik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgYnVuZGxlLT5zdGF0ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0YXRlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSA9IHRvX2diX2J1bmRsZShkZXYpOworCisJa2ZyZWUoYnVuZGxlLT5zdGF0ZSk7CisJYnVuZGxlLT5zdGF0ZSA9IGtzdHJkdXAoYnVmLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1bmRsZS0+c3RhdGUpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogVGVsbCB1c2Vyc3BhY2UgdGhhdCB0aGUgZmlsZSBjb250ZW50cyBjaGFuZ2VkICovCisJc3lzZnNfbm90aWZ5KCZidW5kbGUtPmRldi5rb2JqLCBOVUxMLCAic3RhdGUiKTsKKworCXJldHVybiBzaXplOworfQorc3RhdGljIERFVklDRV9BVFRSX1JXKHN0YXRlKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmJ1bmRsZV9hdHRyc1tdID0geworCSZkZXZfYXR0cl9idW5kbGVfY2xhc3MuYXR0ciwKKwkmZGV2X2F0dHJfYnVuZGxlX2lkLmF0dHIsCisJJmRldl9hdHRyX3N0YXRlLmF0dHIsCisJTlVMTCwKK307CisKK0FUVFJJQlVURV9HUk9VUFMoYnVuZGxlKTsKKworc3RhdGljIHN0cnVjdCBnYl9idW5kbGUgKmdiX2J1bmRsZV9maW5kKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYsCisJCQkJCQkJdTggYnVuZGxlX2lkKQoreworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYnVuZGxlLCAmaW50Zi0+YnVuZGxlcywgbGlua3MpIHsKKwkJaWYgKGJ1bmRsZS0+aWQgPT0gYnVuZGxlX2lkKQorCQkJcmV0dXJuIGJ1bmRsZTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZ2JfYnVuZGxlX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSA9IHRvX2diX2J1bmRsZShkZXYpOworCisJdHJhY2VfZ2JfYnVuZGxlX3JlbGVhc2UoYnVuZGxlKTsKKworCWtmcmVlKGJ1bmRsZS0+c3RhdGUpOworCWtmcmVlKGJ1bmRsZS0+Y3BvcnRfZGVzYyk7CisJa2ZyZWUoYnVuZGxlKTsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIHZvaWQgZ2JfYnVuZGxlX2Rpc2FibGVfYWxsX2Nvbm5lY3Rpb25zKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdGlvbiwgJmJ1bmRsZS0+Y29ubmVjdGlvbnMsIGJ1bmRsZV9saW5rcykKKwkJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGNvbm5lY3Rpb24pOworfQorCitzdGF0aWMgdm9pZCBnYl9idW5kbGVfZW5hYmxlX2FsbF9jb25uZWN0aW9ucyhzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3Rpb24sICZidW5kbGUtPmNvbm5lY3Rpb25zLCBidW5kbGVfbGlua3MpCisJCWdiX2Nvbm5lY3Rpb25fZW5hYmxlKGNvbm5lY3Rpb24pOworfQorCitzdGF0aWMgaW50IGdiX2J1bmRsZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUgPSB0b19nYl9idW5kbGUoZGV2KTsKKwljb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyAqcG0gPSBkZXYtPmRyaXZlci0+cG07CisJaW50IHJldDsKKworCWlmIChwbSAmJiBwbS0+cnVudGltZV9zdXNwZW5kKSB7CisJCXJldCA9IHBtLT5ydW50aW1lX3N1c3BlbmQoJmJ1bmRsZS0+ZGV2KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKKwkJZ2JfYnVuZGxlX2Rpc2FibGVfYWxsX2Nvbm5lY3Rpb25zKGJ1bmRsZSk7CisJfQorCisJcmV0ID0gZ2JfY29udHJvbF9idW5kbGVfc3VzcGVuZChidW5kbGUtPmludGYtPmNvbnRyb2wsIGJ1bmRsZS0+aWQpOworCWlmIChyZXQpIHsKKwkJaWYgKHBtICYmIHBtLT5ydW50aW1lX3Jlc3VtZSkKKwkJCXJldCA9IHBtLT5ydW50aW1lX3Jlc3VtZShkZXYpOworCQllbHNlCisJCQlnYl9idW5kbGVfZW5hYmxlX2FsbF9jb25uZWN0aW9ucyhidW5kbGUpOworCisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JfYnVuZGxlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlID0gdG9fZ2JfYnVuZGxlKGRldik7CisJY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgKnBtID0gZGV2LT5kcml2ZXItPnBtOworCWludCByZXQ7CisKKwlyZXQgPSBnYl9jb250cm9sX2J1bmRsZV9yZXN1bWUoYnVuZGxlLT5pbnRmLT5jb250cm9sLCBidW5kbGUtPmlkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKHBtICYmIHBtLT5ydW50aW1lX3Jlc3VtZSkgeworCQlyZXQgPSBwbS0+cnVudGltZV9yZXN1bWUoZGV2KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKKwkJZ2JfYnVuZGxlX2VuYWJsZV9hbGxfY29ubmVjdGlvbnMoYnVuZGxlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9idW5kbGVfaWRsZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShkZXYpOworCXBtX3JlcXVlc3RfYXV0b3N1c3BlbmQoZGV2KTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBnYl9idW5kbGVfcG1fb3BzID0geworCVNFVF9SVU5USU1FX1BNX09QUyhnYl9idW5kbGVfc3VzcGVuZCwgZ2JfYnVuZGxlX3Jlc3VtZSwgZ2JfYnVuZGxlX2lkbGUpCit9OworCitzdHJ1Y3QgZGV2aWNlX3R5cGUgZ3JleWJ1c19idW5kbGVfdHlwZSA9IHsKKwkubmFtZSA9CQkiZ3JleWJ1c19idW5kbGUiLAorCS5yZWxlYXNlID0JZ2JfYnVuZGxlX3JlbGVhc2UsCisJLnBtID0JCSZnYl9idW5kbGVfcG1fb3BzLAorfTsKKworLyoKKyAqIENyZWF0ZSBhIGdiX2J1bmRsZSBzdHJ1Y3R1cmUgdG8gcmVwcmVzZW50IGEgZGlzY292ZXJlZAorICogYnVuZGxlLiAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG5ldyBidW5kbGUgb3IgYSBudWxsCisgKiBwb2ludGVyIGlmIGEgZmFpbHVyZSBvY2N1cnMgZHVlIHRvIG1lbW9yeSBleGhhdXN0aW9uLgorICovCitzdHJ1Y3QgZ2JfYnVuZGxlICpnYl9idW5kbGVfY3JlYXRlKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYsIHU4IGJ1bmRsZV9pZCwKKwkJCQkgICB1OCBjbGFzcykKK3sKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGU7CisKKwlpZiAoYnVuZGxlX2lkID09IEJVTkRMRV9JRF9OT05FKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgImNhbid0IHVzZSBidW5kbGUgaWQgJXVcbiIsIGJ1bmRsZV9pZCk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qCisJICogUmVqZWN0IGFueSBhdHRlbXB0IHRvIHJldXNlIGEgYnVuZGxlIGlkLiAgV2UgaW5pdGlhbGl6ZQorCSAqIHRoZXNlIHNlcmlhbGx5LCBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQga2VlcGluZworCSAqIHRoZSBpbnRlcmZhY2UgYnVuZGxlIGxpc3QgbG9ja2VkIGhlcmUuCisJICovCisJaWYgKGdiX2J1bmRsZV9maW5kKGludGYsIGJ1bmRsZV9pZCkpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiZHVwbGljYXRlIGJ1bmRsZSBpZCAldVxuIiwgYnVuZGxlX2lkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYnVuZGxlID0ga3phbGxvYyhzaXplb2YoKmJ1bmRsZSksIEdGUF9LRVJORUwpOworCWlmICghYnVuZGxlKQorCQlyZXR1cm4gTlVMTDsKKworCWJ1bmRsZS0+aW50ZiA9IGludGY7CisJYnVuZGxlLT5pZCA9IGJ1bmRsZV9pZDsKKwlidW5kbGUtPmNsYXNzID0gY2xhc3M7CisJSU5JVF9MSVNUX0hFQUQoJmJ1bmRsZS0+Y29ubmVjdGlvbnMpOworCisJYnVuZGxlLT5kZXYucGFyZW50ID0gJmludGYtPmRldjsKKwlidW5kbGUtPmRldi5idXMgPSAmZ3JleWJ1c19idXNfdHlwZTsKKwlidW5kbGUtPmRldi50eXBlID0gJmdyZXlidXNfYnVuZGxlX3R5cGU7CisJYnVuZGxlLT5kZXYuZ3JvdXBzID0gYnVuZGxlX2dyb3VwczsKKwlidW5kbGUtPmRldi5kbWFfbWFzayA9IGludGYtPmRldi5kbWFfbWFzazsKKwlkZXZpY2VfaW5pdGlhbGl6ZSgmYnVuZGxlLT5kZXYpOworCWRldl9zZXRfbmFtZSgmYnVuZGxlLT5kZXYsICIlcy4lZCIsIGRldl9uYW1lKCZpbnRmLT5kZXYpLCBidW5kbGVfaWQpOworCisJbGlzdF9hZGQoJmJ1bmRsZS0+bGlua3MsICZpbnRmLT5idW5kbGVzKTsKKworCXRyYWNlX2diX2J1bmRsZV9jcmVhdGUoYnVuZGxlKTsKKworCXJldHVybiBidW5kbGU7Cit9CisKK2ludCBnYl9idW5kbGVfYWRkKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZGV2aWNlX2FkZCgmYnVuZGxlLT5kZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmYnVuZGxlLT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgYnVuZGxlOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl0cmFjZV9nYl9idW5kbGVfYWRkKGJ1bmRsZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRlYXIgZG93biBhIHByZXZpb3VzbHkgc2V0IHVwIGJ1bmRsZS4KKyAqLwordm9pZCBnYl9idW5kbGVfZGVzdHJveShzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUpCit7CisJdHJhY2VfZ2JfYnVuZGxlX2Rlc3Ryb3koYnVuZGxlKTsKKworCWlmIChkZXZpY2VfaXNfcmVnaXN0ZXJlZCgmYnVuZGxlLT5kZXYpKQorCQlkZXZpY2VfZGVsKCZidW5kbGUtPmRldik7CisKKwlsaXN0X2RlbCgmYnVuZGxlLT5saW5rcyk7CisKKwlwdXRfZGV2aWNlKCZidW5kbGUtPmRldik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9idW5kbGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2J1bmRsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMzQ5MWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9idW5kbGUuaApAQCAtMCwwICsxLDkwIEBACisvKgorICogR3JleWJ1cyBidW5kbGVzCisgKgorICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE0IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2lmbmRlZiBfX0JVTkRMRV9ICisjZGVmaW5lIF9fQlVORExFX0gKKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2RlZmluZQlCVU5ETEVfSURfTk9ORQlVOF9NQVgKKworLyogR3JleWJ1cyAicHVibGljIiBkZWZpbml0aW9ucyIgKi8KK3N0cnVjdCBnYl9idW5kbGUgeworCXN0cnVjdCBkZXZpY2UJCWRldjsKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlCSppbnRmOworCisJdTgJCQlpZDsKKwl1OAkJCWNsYXNzOworCXU4CQkJY2xhc3NfbWFqb3I7CisJdTgJCQljbGFzc19taW5vcjsKKworCXNpemVfdAkJCW51bV9jcG9ydHM7CisJc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcl9jcG9ydCAqY3BvcnRfZGVzYzsKKworCXN0cnVjdCBsaXN0X2hlYWQJY29ubmVjdGlvbnM7CisJdTgJCQkqc3RhdGU7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpbmtzOwkvKiBpbnRlcmZhY2UtPmJ1bmRsZXMgKi8KK307CisjZGVmaW5lIHRvX2diX2J1bmRsZShkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IGdiX2J1bmRsZSwgZGV2KQorCisvKiBHcmV5YnVzICJwcml2YXRlIiBkZWZpbml0aW9ucyIgKi8KK3N0cnVjdCBnYl9idW5kbGUgKmdiX2J1bmRsZV9jcmVhdGUoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZiwgdTggYnVuZGxlX2lkLAorCQkJCSAgIHU4IGNsYXNzKTsKK2ludCBnYl9idW5kbGVfYWRkKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSk7Cit2b2lkIGdiX2J1bmRsZV9kZXN0cm95KHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSk7CisKKy8qIEJ1bmRsZSBSdW50aW1lIFBNIHdyYXBwZXJzICovCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW5saW5lIGludCBnYl9wbV9ydW50aW1lX2dldF9zeW5jKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gcG1fcnVudGltZV9nZXRfc3luYygmYnVuZGxlLT5kZXYpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCWRldl9lcnIoJmJ1bmRsZS0+ZGV2LAorCQkJInBtX3J1bnRpbWVfZ2V0X3N5bmMgZmFpbGVkOiAlZFxuIiwgcmV0dmFsKTsKKwkJcG1fcnVudGltZV9wdXRfbm9pZGxlKCZidW5kbGUtPmRldik7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSkKK3sKKwlpbnQgcmV0dmFsOworCisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeSgmYnVuZGxlLT5kZXYpOworCXJldHZhbCA9IHBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKCZidW5kbGUtPmRldik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2JfcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlKQoreworCXBtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKCZidW5kbGUtPmRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnYl9wbV9ydW50aW1lX3B1dF9ub2lkbGUoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlKQoreworCXBtX3J1bnRpbWVfcHV0X25vaWRsZSgmYnVuZGxlLT5kZXYpOworfQorCisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgZ2JfcG1fcnVudGltZV9nZXRfc3luYyhzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUpCit7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUpCit7IHJldHVybiAwOyB9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnYl9wbV9ydW50aW1lX2dldF9ub3Jlc3VtZShzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgZ2JfcG1fcnVudGltZV9wdXRfbm9pZGxlKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSkge30KKyNlbmRpZgorCisjZW5kaWYgLyogX19CVU5ETEVfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvY2FtZXJhLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9jYW1lcmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTFiZGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvY2FtZXJhLmMKQEAgLTAsMCArMSwxNDAwIEBACisvKgorICogR3JleWJ1cyBDYW1lcmEgcHJvdG9jb2wgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNSBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2luY2x1ZGUgImdiLWNhbWVyYS5oIgorI2luY2x1ZGUgImdyZXlidXMuaCIKKyNpbmNsdWRlICJncmV5YnVzX3Byb3RvY29scy5oIgorCitlbnVtIGdiX2NhbWVyYV9kZWJ1Z3NfYnVmZmVyX2lkIHsKKwlHQl9DQU1FUkFfREVCVUdGU19CVUZGRVJfQ0FQQUJJTElUSUVTLAorCUdCX0NBTUVSQV9ERUJVR0ZTX0JVRkZFUl9TVFJFQU1TLAorCUdCX0NBTUVSQV9ERUJVR0ZTX0JVRkZFUl9DQVBUVVJFLAorCUdCX0NBTUVSQV9ERUJVR0ZTX0JVRkZFUl9GTFVTSCwKKwlHQl9DQU1FUkFfREVCVUdGU19CVUZGRVJfTUFYLAorfTsKKworc3RydWN0IGdiX2NhbWVyYV9kZWJ1Z2ZzX2J1ZmZlciB7CisJY2hhciBkYXRhW1BBR0VfU0laRV07CisJc2l6ZV90IGxlbmd0aDsKK307CisKK2VudW0gZ2JfY2FtZXJhX3N0YXRlIHsKKwlHQl9DQU1FUkFfU1RBVEVfVU5DT05GSUdVUkVELAorCUdCX0NBTUVSQV9TVEFURV9DT05GSUdVUkVELAorfTsKKworLyoqCisgKiBzdHJ1Y3QgZ2JfY2FtZXJhIC0gQSBHcmV5YnVzIENhbWVyYSBEZXZpY2UKKyAqIEBjb25uZWN0aW9uOiB0aGUgZ3JleWJ1cyBjb25uZWN0aW9uIGZvciBjYW1lcmEgbWFuYWdlbWVudAorICogQGRhdGFfY29ubmVjdGlvbjogdGhlIGdyZXlidXMgY29ubmVjdGlvbiBmb3IgY2FtZXJhIGRhdGEKKyAqIEBkYXRhX2Nwb3J0X2lkOiB0aGUgZGF0YSBDUG9ydCBJRCBvbiB0aGUgbW9kdWxlIHNpZGUKKyAqIEBtdXRleDogcHJvdGVjdHMgdGhlIGNvbm5lY3Rpb24gYW5kIHN0YXRlIGZpZWxkcworICogQHN0YXRlOiB0aGUgY3VycmVudCBtb2R1bGUgc3RhdGUKKyAqIEBkZWJ1Z2ZzOiBkZWJ1Z2ZzIGVudHJpZXMgZm9yIGNhbWVyYSBwcm90b2NvbCBvcGVyYXRpb25zIHRlc3RpbmcKKyAqIEBtb2R1bGU6IEdyZXlidXMgY2FtZXJhIG1vZHVsZSByZWdpc3RlcmVkIHRvIEhPU1QgcHJvY2Vzc29yLgorICovCitzdHJ1Y3QgZ2JfY2FtZXJhIHsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGU7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmRhdGFfY29ubmVjdGlvbjsKKwl1MTYgZGF0YV9jcG9ydF9pZDsKKworCXN0cnVjdCBtdXRleCBtdXRleDsKKwllbnVtIGdiX2NhbWVyYV9zdGF0ZSBzdGF0ZTsKKworCXN0cnVjdCB7CisJCXN0cnVjdCBkZW50cnkgKnJvb3Q7CisJCXN0cnVjdCBnYl9jYW1lcmFfZGVidWdmc19idWZmZXIgKmJ1ZmZlcnM7CisJfSBkZWJ1Z2ZzOworCisJc3RydWN0IGdiX2NhbWVyYV9tb2R1bGUgbW9kdWxlOworfTsKKworc3RydWN0IGdiX2NhbWVyYV9zdHJlYW1fY29uZmlnIHsKKwl1bnNpZ25lZCBpbnQgd2lkdGg7CisJdW5zaWduZWQgaW50IGhlaWdodDsKKwl1bnNpZ25lZCBpbnQgZm9ybWF0OworCXVuc2lnbmVkIGludCB2YzsKKwl1bnNpZ25lZCBpbnQgZHRbMl07CisJdW5zaWduZWQgaW50IG1heF9zaXplOworfTsKKworc3RydWN0IGdiX2NhbWVyYV9mbXRfaW5mbyB7CisJZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIG1idXNfY29kZTsKKwl1bnNpZ25lZCBpbnQgZ2JfZm9ybWF0OworCXVuc2lnbmVkIGludCBicHA7Cit9OworCisvKiBHQiBmb3JtYXQgdG8gbWVkaWEgY29kZSBtYXAgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ2JfY2FtZXJhX2ZtdF9pbmZvIGdiX2ZtdF9pbmZvW10gPSB7CisJeworCQkubWJ1c19jb2RlID0gVjRMMl9NQlVTX0ZNVF9VWVZZOF8xWDE2LAorCQkuZ2JfZm9ybWF0ID0gMHgwMSwKKwkJLmJwcAkgICA9IDE2LAorCX0sCisJeworCQkubWJ1c19jb2RlID0gVjRMMl9NQlVTX0ZNVF9OVjEyXzF4OCwKKwkJLmdiX2Zvcm1hdCA9IDB4MTIsCisJCS5icHAJICAgPSAxMiwKKwl9LAorCXsKKwkJLm1idXNfY29kZSA9IFY0TDJfTUJVU19GTVRfTlYyMV8xeDgsCisJCS5nYl9mb3JtYXQgPSAweDEzLAorCQkuYnBwCSAgID0gMTIsCisJfSwKKwl7CisJCS5tYnVzX2NvZGUgPSBWNEwyX01CVVNfRk1UX1lVMTJfMXg4LAorCQkuZ2JfZm9ybWF0ID0gMHgxNiwKKwkJLmJwcAkgICA9IDEyLAorCX0sCisJeworCQkubWJ1c19jb2RlID0gVjRMMl9NQlVTX0ZNVF9ZVjEyXzF4OCwKKwkJLmdiX2Zvcm1hdCA9IDB4MTcsCisJCS5icHAJICAgPSAxMiwKKwl9LAorCXsKKwkJLm1idXNfY29kZSA9IFY0TDJfTUJVU19GTVRfSlBFR18xWDgsCisJCS5nYl9mb3JtYXQgPSAweDQwLAorCQkuYnBwCSAgID0gMCwKKwl9LAorCXsKKwkJLm1idXNfY29kZSA9IFY0TDJfTUJVU19GTVRfR0JfQ0FNX01FVEFEQVRBXzFYOCwKKwkJLmdiX2Zvcm1hdCA9IDB4NDEsCisJCS5icHAJICAgPSAwLAorCX0sCisJeworCQkubWJ1c19jb2RlID0gVjRMMl9NQlVTX0ZNVF9HQl9DQU1fREVCVUdfREFUQV8xWDgsCisJCS5nYl9mb3JtYXQgPSAweDQyLAorCQkuYnBwCSAgID0gMCwKKwl9LAorCXsKKwkJLm1idXNfY29kZSA9IFY0TDJfTUJVU19GTVRfU0JHR1IxMF8xWDEwLAorCQkuZ2JfZm9ybWF0ID0gMHg4MCwKKwkJLmJwcAkgICA9IDEwLAorCX0sCisJeworCQkubWJ1c19jb2RlID0gVjRMMl9NQlVTX0ZNVF9TR0JSRzEwXzFYMTAsCisJCS5nYl9mb3JtYXQgPSAweDgxLAorCQkuYnBwCSAgID0gMTAsCisJfSwKKwl7CisJCS5tYnVzX2NvZGUgPSBWNEwyX01CVVNfRk1UX1NHUkJHMTBfMVgxMCwKKwkJLmdiX2Zvcm1hdCA9IDB4ODIsCisJCS5icHAJICAgPSAxMCwKKwl9LAorCXsKKwkJLm1idXNfY29kZSA9IFY0TDJfTUJVU19GTVRfU1JHR0IxMF8xWDEwLAorCQkuZ2JfZm9ybWF0ID0gMHg4MywKKwkJLmJwcAkgICA9IDEwLAorCX0sCisJeworCQkubWJ1c19jb2RlID0gVjRMMl9NQlVTX0ZNVF9TQkdHUjEyXzFYMTIsCisJCS5nYl9mb3JtYXQgPSAweDg0LAorCQkuYnBwCSAgID0gMTIsCisJfSwKKwl7CisJCS5tYnVzX2NvZGUgPSBWNEwyX01CVVNfRk1UX1NHQlJHMTJfMVgxMiwKKwkJLmdiX2Zvcm1hdCA9IDB4ODUsCisJCS5icHAJICAgPSAxMiwKKwl9LAorCXsKKwkJLm1idXNfY29kZSA9IFY0TDJfTUJVU19GTVRfU0dSQkcxMl8xWDEyLAorCQkuZ2JfZm9ybWF0ID0gMHg4NiwKKwkJLmJwcAkgICA9IDEyLAorCX0sCisJeworCQkubWJ1c19jb2RlID0gVjRMMl9NQlVTX0ZNVF9TUkdHQjEyXzFYMTIsCisJCS5nYl9mb3JtYXQgPSAweDg3LAorCQkuYnBwCSAgID0gMTIsCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ2JfY2FtZXJhX2ZtdF9pbmZvICpnYl9jYW1lcmFfZ2V0X2Zvcm1hdF9pbmZvKHUxNiBnYl9mbXQpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShnYl9mbXRfaW5mbyk7IGkrKykgeworCQlpZiAoZ2JfZm10X2luZm9baV0uZ2JfZm9ybWF0ID09IGdiX2ZtdCkKKwkJCXJldHVybiAmZ2JfZm10X2luZm9baV07CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKyNkZWZpbmUgRVMyX0FQQl9DRFNJMF9DUE9SVAkJMTYKKyNkZWZpbmUgRVMyX0FQQl9DRFNJMV9DUE9SVAkJMTcKKworI2RlZmluZSBHQl9DQU1FUkFfTUFYX1NFVFRJTkdTX1NJWkUJODE5MgorCisjZGVmaW5lIGdjYW1fZGJnKGdjYW0sIGZvcm1hdC4uLikJZGV2X2RiZygmZ2NhbS0+YnVuZGxlLT5kZXYsIGZvcm1hdCkKKyNkZWZpbmUgZ2NhbV9pbmZvKGdjYW0sIGZvcm1hdC4uLikJZGV2X2luZm8oJmdjYW0tPmJ1bmRsZS0+ZGV2LCBmb3JtYXQpCisjZGVmaW5lIGdjYW1fZXJyKGdjYW0sIGZvcm1hdC4uLikJZGV2X2VycigmZ2NhbS0+YnVuZGxlLT5kZXYsIGZvcm1hdCkKKworc3RhdGljIGludCBnYl9jYW1lcmFfb3BlcmF0aW9uX3N5bmNfZmxhZ3Moc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCSAgaW50IHR5cGUsIHVuc2lnbmVkIGludCBmbGFncywKKwkJCQkJICB2b2lkICpyZXF1ZXN0LCBzaXplX3QgcmVxdWVzdF9zaXplLAorCQkJCQkgIHZvaWQgKnJlc3BvbnNlLCBzaXplX3QgKnJlc3BvbnNlX3NpemUpCit7CisJc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uOworCWludCByZXQ7CisKKwlvcGVyYXRpb24gPSBnYl9vcGVyYXRpb25fY3JlYXRlX2ZsYWdzKGNvbm5lY3Rpb24sIHR5cGUsIHJlcXVlc3Rfc2l6ZSwKKwkJCQkJICAgICAgKnJlc3BvbnNlX3NpemUsIGZsYWdzLAorCQkJCQkgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIW9wZXJhdGlvbikKKwkJcmV0dXJuICAtRU5PTUVNOworCisJaWYgKHJlcXVlc3Rfc2l6ZSkKKwkJbWVtY3B5KG9wZXJhdGlvbi0+cmVxdWVzdC0+cGF5bG9hZCwgcmVxdWVzdCwgcmVxdWVzdF9zaXplKTsKKworCXJldCA9IGdiX29wZXJhdGlvbl9yZXF1ZXN0X3NlbmRfc3luYyhvcGVyYXRpb24pOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmY29ubmVjdGlvbi0+aGQtPmRldiwKKwkJCSIlczogc3luY2hyb25vdXMgb3BlcmF0aW9uIG9mIHR5cGUgMHglMDJ4IGZhaWxlZDogJWRcbiIsCisJCQljb25uZWN0aW9uLT5uYW1lLCB0eXBlLCByZXQpOworCX0gZWxzZSB7CisJCSpyZXNwb25zZV9zaXplID0gb3BlcmF0aW9uLT5yZXNwb25zZS0+cGF5bG9hZF9zaXplOworCisJCWlmIChvcGVyYXRpb24tPnJlc3BvbnNlLT5wYXlsb2FkX3NpemUpCisJCQltZW1jcHkocmVzcG9uc2UsIG9wZXJhdGlvbi0+cmVzcG9uc2UtPnBheWxvYWQsCisJCQkgICAgICAgb3BlcmF0aW9uLT5yZXNwb25zZS0+cGF5bG9hZF9zaXplKTsKKwl9CisKKwlnYl9vcGVyYXRpb25fcHV0KG9wZXJhdGlvbik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX2NhbWVyYV9nZXRfbWF4X3BrdF9zaXplKHN0cnVjdCBnYl9jYW1lcmEgKmdjYW0sCisJCXN0cnVjdCBnYl9jYW1lcmFfY29uZmlndXJlX3N0cmVhbXNfcmVzcG9uc2UgKnJlc3ApCit7CisJdW5zaWduZWQgaW50IG1heF9wa3Rfc2l6ZSA9IDA7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVzcC0+bnVtX3N0cmVhbXM7IGkrKykgeworCQlzdHJ1Y3QgZ2JfY2FtZXJhX3N0cmVhbV9jb25maWdfcmVzcG9uc2UgKmNmZyA9ICZyZXNwLT5jb25maWdbaV07CisJCWNvbnN0IHN0cnVjdCBnYl9jYW1lcmFfZm10X2luZm8gKmZtdF9pbmZvOworCQl1bnNpZ25lZCBpbnQgcGt0X3NpemU7CisKKwkJZm10X2luZm8gPSBnYl9jYW1lcmFfZ2V0X2Zvcm1hdF9pbmZvKGNmZy0+Zm9ybWF0KTsKKwkJaWYgKCFmbXRfaW5mbykgeworCQkJZ2NhbV9lcnIoZ2NhbSwgInVuc3VwcG9ydGVkIGdyZXlidXMgaW1hZ2UgZm9ybWF0OiAlZFxuIiwKKwkJCQkgY2ZnLT5mb3JtYXQpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQlpZiAoZm10X2luZm8tPmJwcCA9PSAwKSB7CisJCQlwa3Rfc2l6ZSA9IGxlMzJfdG9fY3B1KGNmZy0+bWF4X3BrdF9zaXplKTsKKworCQkJaWYgKHBrdF9zaXplID09IDApIHsKKwkJCQlnY2FtX2VycihnY2FtLAorCQkJCQkgIlN0cmVhbSAldTogaW52YWxpZCB6ZXJvIG1heGltdW0gcGFja2V0IHNpemVcbiIsCisJCQkJCSBpKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXBrdF9zaXplID0gbGUxNl90b19jcHUoY2ZnLT53aWR0aCkgKiBmbXRfaW5mby0+YnBwIC8gODsKKworCQkJaWYgKHBrdF9zaXplICE9IGxlMzJfdG9fY3B1KGNmZy0+bWF4X3BrdF9zaXplKSkgeworCQkJCWdjYW1fZXJyKGdjYW0sCisJCQkJCSAiU3RyZWFtICV1OiBtYXhpbXVtIHBhY2tldCBzaXplIG1pc21hdGNoICgldS8ldSlcbiIsCisJCQkJCSBpLCBwa3Rfc2l6ZSwgY2ZnLT5tYXhfcGt0X3NpemUpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQl9CisKKwkJbWF4X3BrdF9zaXplID0gbWF4KHBrdF9zaXplLCBtYXhfcGt0X3NpemUpOworCX0KKworCXJldHVybiBtYXhfcGt0X3NpemU7Cit9CisKKy8qCisgKiBWYWxpZGF0ZSB0aGUgc3RyZWFtIGNvbmZpZ3VyYXRpb24gcmVzcG9uc2UgdmVyaWZ5aW5nIHBhZGRpbmcgaXMgY29ycmVjdGx5CisgKiBzZXQgYW5kIHRoZSByZXR1cm5lZCBudW1iZXIgb2Ygc3RyZWFtcyBpcyBzdXBwb3J0ZWQKKyAqLworc3RhdGljIGNvbnN0IGludCBnYl9jYW1lcmFfY29uZmlndXJlX3N0cmVhbXNfdmFsaWRhdGVfcmVzcG9uc2UoCisJCXN0cnVjdCBnYl9jYW1lcmEgKmdjYW0sCisJCXN0cnVjdCBnYl9jYW1lcmFfY29uZmlndXJlX3N0cmVhbXNfcmVzcG9uc2UgKnJlc3AsCisJCXVuc2lnbmVkIGludCBuc3RyZWFtcykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIFZhbGlkYXRlIHRoZSByZXR1cm5lZCByZXNwb25zZSBzdHJ1Y3R1cmUgKi8KKwlpZiAocmVzcC0+cGFkZGluZ1swXSB8fCByZXNwLT5wYWRkaW5nWzFdKSB7CisJCWdjYW1fZXJyKGdjYW0sICJyZXNwb25zZSBwYWRkaW5nICE9IDBcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAocmVzcC0+bnVtX3N0cmVhbXMgPiBuc3RyZWFtcykgeworCQlnY2FtX2VycihnY2FtLCAiZ290ICNzdHJlYW1zICV1ID4gcmVxdWVzdCAldVxuIiwKKwkJCSByZXNwLT5udW1fc3RyZWFtcywgbnN0cmVhbXMpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVzcC0+bnVtX3N0cmVhbXM7IGkrKykgeworCQlzdHJ1Y3QgZ2JfY2FtZXJhX3N0cmVhbV9jb25maWdfcmVzcG9uc2UgKmNmZyA9ICZyZXNwLT5jb25maWdbaV07CisJCWlmIChjZmctPnBhZGRpbmcpIHsKKwkJCWdjYW1fZXJyKGdjYW0sICJzdHJlYW0gIyV1IHBhZGRpbmcgIT0gMFxuIiwgaSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSGFyZHdhcmUgQ29uZmlndXJhdGlvbgorICovCisKK3N0YXRpYyBpbnQgZ2JfY2FtZXJhX3NldF9pbnRmX3Bvd2VyX21vZGUoc3RydWN0IGdiX2NhbWVyYSAqZ2NhbSwgdTggaW50Zl9pZCwKKwkJCQkJIGJvb2wgaHMpCit7CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gZ2NhbS0+Y29ubmVjdGlvbi0+aGQtPnN2YzsKKwlpbnQgcmV0OworCisJaWYgKGhzKQorCQlyZXQgPSBnYl9zdmNfaW50Zl9zZXRfcG93ZXJfbW9kZShzdmMsIGludGZfaWQsCisJCQkJCQkgR0JfU1ZDX1VOSVBST19IU19TRVJJRVNfQSwKKwkJCQkJCSBHQl9TVkNfVU5JUFJPX0ZBU1RfTU9ERSwgMiwgMiwKKwkJCQkJCSBHQl9TVkNfU01BTExfQU1QTElUVURFLAorCQkJCQkJIEdCX1NWQ19OT19ERV9FTVBIQVNJUywKKwkJCQkJCSBHQl9TVkNfVU5JUFJPX0ZBU1RfTU9ERSwgMiwgMiwKKwkJCQkJCSBHQl9TVkNfUFdSTV9SWFRFUk1JTkFUSU9OIHwKKwkJCQkJCSBHQl9TVkNfUFdSTV9UWFRFUk1JTkFUSU9OLCAwLAorCQkJCQkJIE5VTEwsIE5VTEwpOworCWVsc2UKKwkJcmV0ID0gZ2Jfc3ZjX2ludGZfc2V0X3Bvd2VyX21vZGUoc3ZjLCBpbnRmX2lkLAorCQkJCQkJIEdCX1NWQ19VTklQUk9fSFNfU0VSSUVTX0EsCisJCQkJCQkgR0JfU1ZDX1VOSVBST19TTE9XX0FVVE9fTU9ERSwKKwkJCQkJCSAyLCAxLAorCQkJCQkJIEdCX1NWQ19TTUFMTF9BTVBMSVRVREUsCisJCQkJCQkgR0JfU1ZDX05PX0RFX0VNUEhBU0lTLAorCQkJCQkJIEdCX1NWQ19VTklQUk9fU0xPV19BVVRPX01PREUsCisJCQkJCQkgMiwgMSwKKwkJCQkJCSAwLCAwLAorCQkJCQkJIE5VTEwsIE5VTEwpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9jYW1lcmFfc2V0X3Bvd2VyX21vZGUoc3RydWN0IGdiX2NhbWVyYSAqZ2NhbSwgYm9vbCBocykKK3sKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmID0gZ2NhbS0+Y29ubmVjdGlvbi0+aW50ZjsKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSBnY2FtLT5jb25uZWN0aW9uLT5oZC0+c3ZjOworCWludCByZXQ7CisKKwlyZXQgPSBnYl9jYW1lcmFfc2V0X2ludGZfcG93ZXJfbW9kZShnY2FtLCBpbnRmLT5pbnRlcmZhY2VfaWQsIGhzKTsKKwlpZiAocmV0IDwgMCkgeworCQlnY2FtX2VycihnY2FtLCAiZmFpbGVkIHRvIHNldCBtb2R1bGUgaW50ZXJmYWNlIHRvICVzICglZClcbiIsCisJCQkgaHMgPyAiSFMiIDogIlBXTSIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZ2JfY2FtZXJhX3NldF9pbnRmX3Bvd2VyX21vZGUoZ2NhbSwgc3ZjLT5hcF9pbnRmX2lkLCBocyk7CisJaWYgKHJldCA8IDApIHsKKwkJZ2JfY2FtZXJhX3NldF9pbnRmX3Bvd2VyX21vZGUoZ2NhbSwgaW50Zi0+aW50ZXJmYWNlX2lkLCAhaHMpOworCQlnY2FtX2VycihnY2FtLCAiZmFpbGVkIHRvIHNldCBBUCBpbnRlcmZhY2UgdG8gJXMgKCVkKVxuIiwKKwkJCSBocyA/ICJIUyIgOiAiUFdNIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGFwX2NzaV9jb25maWdfcmVxdWVzdCB7CisJX191OCBjc2lfaWQ7CisJX191OCBmbGFnczsKKyNkZWZpbmUgR0JfQ0FNRVJBX0NTSV9GTEFHX0NMT0NLX0NPTlRJTlVPVVMgMHgwMQorCV9fdTggbnVtX2xhbmVzOworCV9fdTggcGFkZGluZzsKKwlfX2xlMzIgY3NpX2Nsa19mcmVxOworCV9fbGUzMiBtYXhfcGt0X3NpemU7Cit9IF9fcGFja2VkOworCisvKgorICogVE9ETzogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGxhbmVzIGR5bmFtaWNhbGx5IGJhc2VkIG9uIGJhbmR3aWR0aAorICogcmVxdWlyZW1lbnRzLgorICovCisjZGVmaW5lIEdCX0NBTUVSQV9DU0lfTlVNX0RBVEFfTEFORVMJCTQKKworI2RlZmluZSBHQl9DQU1FUkFfQ1NJX0NMS19GUkVRX01BWAkJOTk5MDAwMDAwVQorI2RlZmluZSBHQl9DQU1FUkFfQ1NJX0NMS19GUkVRX01JTgkJMTAwMDAwMDAwVQorI2RlZmluZSBHQl9DQU1FUkFfQ1NJX0NMS19GUkVRX01BUkdJTgkJMTUwMDAwMDAwVQorCitzdGF0aWMgaW50IGdiX2NhbWVyYV9zZXR1cF9kYXRhX2Nvbm5lY3Rpb24oc3RydWN0IGdiX2NhbWVyYSAqZ2NhbSwKKwkJc3RydWN0IGdiX2NhbWVyYV9jb25maWd1cmVfc3RyZWFtc19yZXNwb25zZSAqcmVzcCwKKwkJc3RydWN0IGdiX2NhbWVyYV9jc2lfcGFyYW1zICpjc2lfcGFyYW1zKQoreworCXN0cnVjdCBhcF9jc2lfY29uZmlnX3JlcXVlc3QgY3NpX2NmZzsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubjsKKwl1bnNpZ25lZCBpbnQgY2xrX2ZyZXE7CisJaW50IHJldDsKKworCS8qCisJICogQ3JlYXRlIHRoZSBkYXRhIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGUgY2FtZXJhIG1vZHVsZSBkYXRhIENQb3J0IGFuZAorCSAqIEFQQiBDRFNJMS4gVGhlIENEU0kxIENQb3J0IElEIGlzIGhhcmRjb2RlZCBieSB0aGUgRVMyIGJyaWRnZS4KKwkgKi8KKwljb25uID0gZ2JfY29ubmVjdGlvbl9jcmVhdGVfb2ZmbG9hZGVkKGdjYW0tPmJ1bmRsZSwgZ2NhbS0+ZGF0YV9jcG9ydF9pZCwKKwkJCQkJICAgICAgR0JfQ09OTkVDVElPTl9GTEFHX05PX0ZMT1dDVFJMIHwKKwkJCQkJICAgICAgR0JfQ09OTkVDVElPTl9GTEFHX0NEU0kxKTsKKwlpZiAoSVNfRVJSKGNvbm4pKQorCQlyZXR1cm4gUFRSX0VSUihjb25uKTsKKworCWdjYW0tPmRhdGFfY29ubmVjdGlvbiA9IGNvbm47CisJZ2JfY29ubmVjdGlvbl9zZXRfZGF0YShjb25uLCBnY2FtKTsKKworCXJldCA9IGdiX2Nvbm5lY3Rpb25fZW5hYmxlKGNvbm4pOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfY29ubl9kZXN0cm95OworCisJLyogU2V0IHRoZSBVbmlQcm8gbGluayB0byBoaWdoIHNwZWVkIG1vZGUuICovCisJcmV0ID0gZ2JfY2FtZXJhX3NldF9wb3dlcl9tb2RlKGdjYW0sIHRydWUpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX2Nvbm5fZGlzYWJsZTsKKworCS8qCisJICogQ29uZmlndXJlIHRoZSBBUEItQSBDU0ktMiB0cmFuc21pdHRlci4KKwkgKgorCSAqIEhhcmRjb2RlIHRoZSBudW1iZXIgb2YgbGFuZXMgdG8gNCBhbmQgY29tcHV0ZSB0aGUgYnVzIGNsb2NrIGZyZXF1ZW5jeQorCSAqIGJhc2VkIG9uIHRoZSBtb2R1bGUgYmFuZHdpZHRoIHJlcXVpcmVtZW50cyB3aXRoIGEgc2FmZXR5IG1hcmdpbi4KKwkgKi8KKwltZW1zZXQoJmNzaV9jZmcsIDAsIHNpemVvZihjc2lfY2ZnKSk7CisJY3NpX2NmZy5jc2lfaWQgPSAxOworCWNzaV9jZmcuZmxhZ3MgPSAwOworCWNzaV9jZmcubnVtX2xhbmVzID0gR0JfQ0FNRVJBX0NTSV9OVU1fREFUQV9MQU5FUzsKKworCWNsa19mcmVxID0gcmVzcC0+ZGF0YV9yYXRlIC8gMiAvIEdCX0NBTUVSQV9DU0lfTlVNX0RBVEFfTEFORVM7CisJY2xrX2ZyZXEgPSBjbGFtcChjbGtfZnJlcSArIEdCX0NBTUVSQV9DU0lfQ0xLX0ZSRVFfTUFSR0lOLAorCQkJIEdCX0NBTUVSQV9DU0lfQ0xLX0ZSRVFfTUlOLAorCQkJIEdCX0NBTUVSQV9DU0lfQ0xLX0ZSRVFfTUFYKTsKKwljc2lfY2ZnLmNzaV9jbGtfZnJlcSA9IGNsa19mcmVxOworCisJcmV0ID0gZ2JfY2FtZXJhX2dldF9tYXhfcGt0X3NpemUoZ2NhbSwgcmVzcCk7CisJaWYgKHJldCA8IDApIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJvcl9wb3dlcjsKKwl9CisJY3NpX2NmZy5tYXhfcGt0X3NpemUgPSByZXQ7CisKKwlyZXQgPSBnYl9oZF9vdXRwdXQoZ2NhbS0+Y29ubmVjdGlvbi0+aGQsICZjc2lfY2ZnLAorCQkJICAgc2l6ZW9mKGNzaV9jZmcpLAorCQkJICAgR0JfQVBCX1JFUVVFU1RfQ1NJX1RYX0NPTlRST0wsIGZhbHNlKTsKKwlpZiAocmV0IDwgMCkgeworCQlnY2FtX2VycihnY2FtLCAiZmFpbGVkIHRvIHN0YXJ0IHRoZSBDU0kgdHJhbnNtaXR0ZXJcbiIpOworCQlnb3RvIGVycm9yX3Bvd2VyOworCX0KKworCWlmIChjc2lfcGFyYW1zKSB7CisJCWNzaV9wYXJhbXMtPmNsa19mcmVxID0gY3NpX2NmZy5jc2lfY2xrX2ZyZXE7CisJCWNzaV9wYXJhbXMtPm51bV9sYW5lcyA9IGNzaV9jZmcubnVtX2xhbmVzOworCX0KKworCXJldHVybiAwOworCitlcnJvcl9wb3dlcjoKKwlnYl9jYW1lcmFfc2V0X3Bvd2VyX21vZGUoZ2NhbSwgZmFsc2UpOworZXJyb3JfY29ubl9kaXNhYmxlOgorCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShnY2FtLT5kYXRhX2Nvbm5lY3Rpb24pOworZXJyb3JfY29ubl9kZXN0cm95OgorCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShnY2FtLT5kYXRhX2Nvbm5lY3Rpb24pOworCWdjYW0tPmRhdGFfY29ubmVjdGlvbiA9IE5VTEw7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZ2JfY2FtZXJhX3RlYXJkb3duX2RhdGFfY29ubmVjdGlvbihzdHJ1Y3QgZ2JfY2FtZXJhICpnY2FtKQoreworCXN0cnVjdCBhcF9jc2lfY29uZmlnX3JlcXVlc3QgY3NpX2NmZzsKKwlpbnQgcmV0OworCisJLyogU3RvcCB0aGUgQVBCMSBDU0kgdHJhbnNtaXR0ZXIuICovCisJbWVtc2V0KCZjc2lfY2ZnLCAwLCBzaXplb2YoY3NpX2NmZykpOworCWNzaV9jZmcuY3NpX2lkID0gMTsKKworCXJldCA9IGdiX2hkX291dHB1dChnY2FtLT5jb25uZWN0aW9uLT5oZCwgJmNzaV9jZmcsCisJCQkgICBzaXplb2YoY3NpX2NmZyksCisJCQkgICBHQl9BUEJfUkVRVUVTVF9DU0lfVFhfQ09OVFJPTCwgZmFsc2UpOworCisJaWYgKHJldCA8IDApCisJCWdjYW1fZXJyKGdjYW0sICJmYWlsZWQgdG8gc3RvcCB0aGUgQ1NJIHRyYW5zbWl0dGVyXG4iKTsKKworCS8qIFNldCB0aGUgVW5pUHJvIGxpbmsgdG8gbG93IHNwZWVkIG1vZGUuICovCisJZ2JfY2FtZXJhX3NldF9wb3dlcl9tb2RlKGdjYW0sIGZhbHNlKTsKKworCS8qIERlc3Ryb3kgdGhlIGRhdGEgY29ubmVjdGlvbi4gKi8KKwlnYl9jb25uZWN0aW9uX2Rpc2FibGUoZ2NhbS0+ZGF0YV9jb25uZWN0aW9uKTsKKwlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koZ2NhbS0+ZGF0YV9jb25uZWN0aW9uKTsKKwlnY2FtLT5kYXRhX2Nvbm5lY3Rpb24gPSBOVUxMOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ2FtZXJhIFByb3RvY29sIE9wZXJhdGlvbnMKKyAqLworCitzdGF0aWMgaW50IGdiX2NhbWVyYV9jYXBhYmlsaXRpZXMoc3RydWN0IGdiX2NhbWVyYSAqZ2NhbSwKKwkJCQkgIHU4ICpjYXBhYmlsaXRpZXMsIHNpemVfdCAqc2l6ZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhnY2FtLT5idW5kbGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltdXRleF9sb2NrKCZnY2FtLT5tdXRleCk7CisKKwlpZiAoIWdjYW0tPmNvbm5lY3Rpb24pIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCXJldCA9IGdiX2NhbWVyYV9vcGVyYXRpb25fc3luY19mbGFncyhnY2FtLT5jb25uZWN0aW9uLAorCQkJCQkgICAgIEdCX0NBTUVSQV9UWVBFX0NBUEFCSUxJVElFUywKKwkJCQkJICAgICBHQl9PUEVSQVRJT05fRkxBR19TSE9SVF9SRVNQT05TRSwKKwkJCQkJICAgICBOVUxMLCAwLAorCQkJCQkgICAgICh2b2lkICopY2FwYWJpbGl0aWVzLCBzaXplKTsKKwlpZiAocmV0KQorCQlnY2FtX2VycihnY2FtLCAiZmFpbGVkIHRvIHJldHJpZXZlIGNhcGFiaWxpdGllczogJWRcbiIsIHJldCk7CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZnY2FtLT5tdXRleCk7CisKKwlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChnY2FtLT5idW5kbGUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9jYW1lcmFfY29uZmlndXJlX3N0cmVhbXMoc3RydWN0IGdiX2NhbWVyYSAqZ2NhbSwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50ICpudW1fc3RyZWFtcywKKwkJCQkgICAgICAgdW5zaWduZWQgaW50ICpmbGFncywKKwkJCQkgICAgICAgc3RydWN0IGdiX2NhbWVyYV9zdHJlYW1fY29uZmlnICpzdHJlYW1zLAorCQkJCSAgICAgICBzdHJ1Y3QgZ2JfY2FtZXJhX2NzaV9wYXJhbXMgKmNzaV9wYXJhbXMpCit7CisJc3RydWN0IGdiX2NhbWVyYV9jb25maWd1cmVfc3RyZWFtc19yZXF1ZXN0ICpyZXE7CisJc3RydWN0IGdiX2NhbWVyYV9jb25maWd1cmVfc3RyZWFtc19yZXNwb25zZSAqcmVzcDsKKwl1bnNpZ25lZCBpbnQgbnN0cmVhbXMgPSAqbnVtX3N0cmVhbXM7CisJdW5zaWduZWQgaW50IGk7CisJc2l6ZV90IHJlcV9zaXplOworCXNpemVfdCByZXNwX3NpemU7CisJaW50IHJldDsKKworCWlmIChuc3RyZWFtcyA+IEdCX0NBTUVSQV9NQVhfU1RSRUFNUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXFfc2l6ZSA9IHNpemVvZigqcmVxKSArIG5zdHJlYW1zICogc2l6ZW9mKHJlcS0+Y29uZmlnWzBdKTsKKwlyZXNwX3NpemUgPSBzaXplb2YoKnJlc3ApICsgbnN0cmVhbXMgKiBzaXplb2YocmVzcC0+Y29uZmlnWzBdKTsKKworCXJlcSA9IGttYWxsb2MocmVxX3NpemUsIEdGUF9LRVJORUwpOworCXJlc3AgPSBrbWFsbG9jKHJlc3Bfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXEgfHwgIXJlc3ApIHsKKwkJa2ZyZWUocmVxKTsKKwkJa2ZyZWUocmVzcCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJlcS0+bnVtX3N0cmVhbXMgPSBuc3RyZWFtczsKKwlyZXEtPmZsYWdzID0gKmZsYWdzOworCXJlcS0+cGFkZGluZyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnN0cmVhbXM7ICsraSkgeworCQlzdHJ1Y3QgZ2JfY2FtZXJhX3N0cmVhbV9jb25maWdfcmVxdWVzdCAqY2ZnID0gJnJlcS0+Y29uZmlnW2ldOworCisJCWNmZy0+d2lkdGggPSBjcHVfdG9fbGUxNihzdHJlYW1zW2ldLndpZHRoKTsKKwkJY2ZnLT5oZWlnaHQgPSBjcHVfdG9fbGUxNihzdHJlYW1zW2ldLmhlaWdodCk7CisJCWNmZy0+Zm9ybWF0ID0gY3B1X3RvX2xlMTYoc3RyZWFtc1tpXS5mb3JtYXQpOworCQljZmctPnBhZGRpbmcgPSAwOworCX0KKworCW11dGV4X2xvY2soJmdjYW0tPm11dGV4KTsKKworCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoZ2NhbS0+YnVuZGxlKTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmVfc2tpcF9wbV9wdXQ7CisKKwlpZiAoIWdjYW0tPmNvbm5lY3Rpb24pIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCXJldCA9IGdiX2NhbWVyYV9vcGVyYXRpb25fc3luY19mbGFncyhnY2FtLT5jb25uZWN0aW9uLAorCQkJCQkgICAgIEdCX0NBTUVSQV9UWVBFX0NPTkZJR1VSRV9TVFJFQU1TLAorCQkJCQkgICAgIEdCX09QRVJBVElPTl9GTEFHX1NIT1JUX1JFU1BPTlNFLAorCQkJCQkgICAgIHJlcSwgcmVxX3NpemUsCisJCQkJCSAgICAgcmVzcCwgJnJlc3Bfc2l6ZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZG9uZTsKKworCXJldCA9IGdiX2NhbWVyYV9jb25maWd1cmVfc3RyZWFtc192YWxpZGF0ZV9yZXNwb25zZShnY2FtLCByZXNwLAorCQkJCQkJCSAgICBuc3RyZWFtcyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZG9uZTsKKworCSpmbGFncyA9IHJlc3AtPmZsYWdzOworCSpudW1fc3RyZWFtcyA9IHJlc3AtPm51bV9zdHJlYW1zOworCisJZm9yIChpID0gMDsgaSA8IHJlc3AtPm51bV9zdHJlYW1zOyArK2kpIHsKKwkJc3RydWN0IGdiX2NhbWVyYV9zdHJlYW1fY29uZmlnX3Jlc3BvbnNlICpjZmcgPSAmcmVzcC0+Y29uZmlnW2ldOworCisJCXN0cmVhbXNbaV0ud2lkdGggPSBsZTE2X3RvX2NwdShjZmctPndpZHRoKTsKKwkJc3RyZWFtc1tpXS5oZWlnaHQgPSBsZTE2X3RvX2NwdShjZmctPmhlaWdodCk7CisJCXN0cmVhbXNbaV0uZm9ybWF0ID0gbGUxNl90b19jcHUoY2ZnLT5mb3JtYXQpOworCQlzdHJlYW1zW2ldLnZjID0gY2ZnLT52aXJ0dWFsX2NoYW5uZWw7CisJCXN0cmVhbXNbaV0uZHRbMF0gPSBjZmctPmRhdGFfdHlwZVswXTsKKwkJc3RyZWFtc1tpXS5kdFsxXSA9IGNmZy0+ZGF0YV90eXBlWzFdOworCQlzdHJlYW1zW2ldLm1heF9zaXplID0gbGUzMl90b19jcHUoY2ZnLT5tYXhfc2l6ZSk7CisJfQorCisJaWYgKChyZXNwLT5mbGFncyAmIEdCX0NBTUVSQV9DT05GSUdVUkVfU1RSRUFNU19BREpVU1RFRCkgfHwKKwkgICAgKHJlcS0+ZmxhZ3MgJiBHQl9DQU1FUkFfQ09ORklHVVJFX1NUUkVBTVNfVEVTVF9PTkxZKSkKKwkJZ290byBkb25lOworCisJaWYgKGdjYW0tPnN0YXRlID09IEdCX0NBTUVSQV9TVEFURV9DT05GSUdVUkVEKSB7CisJCWdiX2NhbWVyYV90ZWFyZG93bl9kYXRhX2Nvbm5lY3Rpb24oZ2NhbSk7CisJCWdjYW0tPnN0YXRlID0gR0JfQ0FNRVJBX1NUQVRFX1VOQ09ORklHVVJFRDsKKworCQkvKgorCQkgKiBXaGVuIHVuY29uZmlndXJpbmcgc3RyZWFtcyByZWxlYXNlIHRoZSBQTSBydW50aW1lIHJlZmVyZW5jZQorCQkgKiB0aGF0IHdhcyBhY3F1aXJlZCB3aGVuIHN0cmVhbXMgd2VyZSBjb25maWd1cmVkLiBUaGUgYnVuZGxlCisJCSAqIHdvbid0IGJlIHN1c3BlbmRlZCB1bnRpbCB0aGUgUE0gcnVudGltZSByZWZlcmVuY2UgYWNxdWlyZWQgYXQKKwkJICogdGhlIGJlZ2lubmluZyBvZiB0aGlzIGZ1bmN0aW9uIGdldHMgcmVsZWFzZWQgcmlnaHQgYmVmb3JlCisJCSAqIHJldHVybmluZy4KKwkJICovCisJCWdiX3BtX3J1bnRpbWVfcHV0X25vaWRsZShnY2FtLT5idW5kbGUpOworCX0KKworCWlmIChyZXNwLT5udW1fc3RyZWFtcyA9PSAwKQorCQlnb3RvIGRvbmU7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgYnVuZGxlIHdvbid0IGJlIHN1c3BlbmRlZCB1bnRpbCBzdHJlYW1zIGdldAorCSAqIHVuY29uZmlndXJlZCBhZnRlciB0aGUgc3RyZWFtIGlzIGNvbmZpZ3VyZWQgc3VjY2Vzc2Z1bGx5CisJICovCisJZ2JfcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoZ2NhbS0+YnVuZGxlKTsKKworCS8qIFNldHVwIENTSS0yIGNvbm5lY3Rpb24gZnJvbSBBUEItQSB0byBBUCAqLworCXJldCA9IGdiX2NhbWVyYV9zZXR1cF9kYXRhX2Nvbm5lY3Rpb24oZ2NhbSwgcmVzcCwgY3NpX3BhcmFtcyk7CisJaWYgKHJldCA8IDApIHsKKwkJbWVtc2V0KHJlcSwgMCwgc2l6ZW9mKCpyZXEpKTsKKwkJZ2Jfb3BlcmF0aW9uX3N5bmMoZ2NhbS0+Y29ubmVjdGlvbiwKKwkJCQkgIEdCX0NBTUVSQV9UWVBFX0NPTkZJR1VSRV9TVFJFQU1TLAorCQkJCSAgcmVxLCBzaXplb2YoKnJlcSksCisJCQkJICByZXNwLCBzaXplb2YoKnJlc3ApKTsKKwkJKmZsYWdzID0gMDsKKwkJKm51bV9zdHJlYW1zID0gMDsKKwkJZ2JfcG1fcnVudGltZV9wdXRfbm9pZGxlKGdjYW0tPmJ1bmRsZSk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlnY2FtLT5zdGF0ZSA9IEdCX0NBTUVSQV9TVEFURV9DT05GSUdVUkVEOworCitkb25lOgorCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGdjYW0tPmJ1bmRsZSk7CisKK2RvbmVfc2tpcF9wbV9wdXQ6CisJbXV0ZXhfdW5sb2NrKCZnY2FtLT5tdXRleCk7CisJa2ZyZWUocmVxKTsKKwlrZnJlZShyZXNwKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX2NhbWVyYV9jYXB0dXJlKHN0cnVjdCBnYl9jYW1lcmEgKmdjYW0sIHUzMiByZXF1ZXN0X2lkLAorCQkJICAgICB1bnNpZ25lZCBpbnQgc3RyZWFtcywgdW5zaWduZWQgaW50IG51bV9mcmFtZXMsCisJCQkgICAgIHNpemVfdCBzZXR0aW5nc19zaXplLCBjb25zdCB2b2lkICpzZXR0aW5ncykKK3sKKwlzdHJ1Y3QgZ2JfY2FtZXJhX2NhcHR1cmVfcmVxdWVzdCAqcmVxOworCXNpemVfdCByZXFfc2l6ZTsKKwlpbnQgcmV0OworCisJaWYgKHNldHRpbmdzX3NpemUgPiBHQl9DQU1FUkFfTUFYX1NFVFRJTkdTX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJcmVxX3NpemUgPSBzaXplb2YoKnJlcSkgKyBzZXR0aW5nc19zaXplOworCXJlcSA9IGttYWxsb2MocmVxX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghcmVxKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcS0+cmVxdWVzdF9pZCA9IGNwdV90b19sZTMyKHJlcXVlc3RfaWQpOworCXJlcS0+c3RyZWFtcyA9IHN0cmVhbXM7CisJcmVxLT5wYWRkaW5nID0gMDsKKwlyZXEtPm51bV9mcmFtZXMgPSBjcHVfdG9fbGUxNihudW1fZnJhbWVzKTsKKwltZW1jcHkocmVxLT5zZXR0aW5ncywgc2V0dGluZ3MsIHNldHRpbmdzX3NpemUpOworCisJbXV0ZXhfbG9jaygmZ2NhbS0+bXV0ZXgpOworCisJaWYgKCFnY2FtLT5jb25uZWN0aW9uKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhnY2FtLT5jb25uZWN0aW9uLCBHQl9DQU1FUkFfVFlQRV9DQVBUVVJFLAorCQkJCXJlcSwgcmVxX3NpemUsIE5VTEwsIDApOworZG9uZToKKwltdXRleF91bmxvY2soJmdjYW0tPm11dGV4KTsKKworCWtmcmVlKHJlcSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX2NhbWVyYV9mbHVzaChzdHJ1Y3QgZ2JfY2FtZXJhICpnY2FtLCB1MzIgKnJlcXVlc3RfaWQpCit7CisJc3RydWN0IGdiX2NhbWVyYV9mbHVzaF9yZXNwb25zZSByZXNwOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZnY2FtLT5tdXRleCk7CisKKwlpZiAoIWdjYW0tPmNvbm5lY3Rpb24pIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGdjYW0tPmNvbm5lY3Rpb24sIEdCX0NBTUVSQV9UWVBFX0ZMVVNILCBOVUxMLCAwLAorCQkJCSZyZXNwLCBzaXplb2YocmVzcCkpOworCisJaWYgKHJldCA8IDApCisJCWdvdG8gZG9uZTsKKworCWlmIChyZXF1ZXN0X2lkKQorCQkqcmVxdWVzdF9pZCA9IGxlMzJfdG9fY3B1KHJlc3AucmVxdWVzdF9pZCk7CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZnY2FtLT5tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX2NhbWVyYV9yZXF1ZXN0X2hhbmRsZXIoc3RydWN0IGdiX29wZXJhdGlvbiAqb3ApCit7CisJc3RydWN0IGdiX2NhbWVyYSAqZ2NhbSA9IGdiX2Nvbm5lY3Rpb25fZ2V0X2RhdGEob3AtPmNvbm5lY3Rpb24pOworCXN0cnVjdCBnYl9jYW1lcmFfbWV0YWRhdGFfcmVxdWVzdCAqcGF5bG9hZDsKKwlzdHJ1Y3QgZ2JfbWVzc2FnZSAqcmVxdWVzdDsKKworCWlmIChvcC0+dHlwZSAhPSBHQl9DQU1FUkFfVFlQRV9NRVRBREFUQSkgeworCQlnY2FtX2VycihnY2FtLCAiVW5zdXBwb3J0ZWQgdW5zb2xpY2l0ZWQgZXZlbnQ6ICV1XG4iLCBvcC0+dHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlcXVlc3QgPSBvcC0+cmVxdWVzdDsKKworCWlmIChyZXF1ZXN0LT5wYXlsb2FkX3NpemUgPCBzaXplb2YoKnBheWxvYWQpKSB7CisJCWdjYW1fZXJyKGdjYW0sICJXcm9uZyBldmVudCBzaXplIHJlY2VpdmVkICglenUgPCAlenUpXG4iLAorCQkJIHJlcXVlc3QtPnBheWxvYWRfc2l6ZSwgc2l6ZW9mKCpwYXlsb2FkKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBheWxvYWQgPSByZXF1ZXN0LT5wYXlsb2FkOworCisJZ2NhbV9kYmcoZ2NhbSwgInJlY2VpdmVkIG1ldGFkYXRhIGZvciByZXF1ZXN0ICV1LCBmcmFtZSAldSwgc3RyZWFtICV1XG4iLAorCQkgcGF5bG9hZC0+cmVxdWVzdF9pZCwgcGF5bG9hZC0+ZnJhbWVfbnVtYmVyLCBwYXlsb2FkLT5zdHJlYW0pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbnRlcmZhY2Ugd2l0aCBIT1NUIGdtcCBjYW1lcmEuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2JfY2FtZXJhX21idXNfdG9fZ2IoZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIG1idXNfY29kZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGdiX2ZtdF9pbmZvKTsgaSsrKSB7CisJCWlmIChnYl9mbXRfaW5mb1tpXS5tYnVzX2NvZGUgPT0gbWJ1c19jb2RlKQorCQkJcmV0dXJuIGdiX2ZtdF9pbmZvW2ldLmdiX2Zvcm1hdDsKKwl9CisJcmV0dXJuIGdiX2ZtdF9pbmZvWzBdLmdiX2Zvcm1hdDsKK30KKworc3RhdGljIGVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBnYl9jYW1lcmFfZ2JfdG9fbWJ1cyh1MTYgZ2JfZm10KQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZ2JfZm10X2luZm8pOyBpKyspIHsKKwkJaWYgKGdiX2ZtdF9pbmZvW2ldLmdiX2Zvcm1hdCA9PSBnYl9mbXQpCisJCQlyZXR1cm4gZ2JfZm10X2luZm9baV0ubWJ1c19jb2RlOworCX0KKwlyZXR1cm4gZ2JfZm10X2luZm9bMF0ubWJ1c19jb2RlOworfQorCitzdGF0aWMgc3NpemVfdCBnYl9jYW1lcmFfb3BfY2FwYWJpbGl0aWVzKHZvaWQgKnByaXYsIGNoYXIgKmRhdGEsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGdiX2NhbWVyYSAqZ2NhbSA9IHByaXY7CisJc2l6ZV90IGNhcGFiaWxpdGllc19sZW4gPSBsZW47CisJaW50IHJldDsKKworCXJldCA9IGdiX2NhbWVyYV9jYXBhYmlsaXRpZXMoZ2NhbSwgZGF0YSwgJmNhcGFiaWxpdGllc19sZW4pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gY2FwYWJpbGl0aWVzX2xlbjsKK30KKworc3RhdGljIGludCBnYl9jYW1lcmFfb3BfY29uZmlndXJlX3N0cmVhbXModm9pZCAqcHJpdiwgdW5zaWduZWQgaW50ICpuc3RyZWFtcywKKwkJdW5zaWduZWQgaW50ICpmbGFncywgc3RydWN0IGdiX2NhbWVyYV9zdHJlYW0gKnN0cmVhbXMsCisJCXN0cnVjdCBnYl9jYW1lcmFfY3NpX3BhcmFtcyAqY3NpX3BhcmFtcykKK3sKKwlzdHJ1Y3QgZ2JfY2FtZXJhICpnY2FtID0gcHJpdjsKKwlzdHJ1Y3QgZ2JfY2FtZXJhX3N0cmVhbV9jb25maWcgKmdiX3N0cmVhbXM7CisJdW5zaWduZWQgaW50IGdiX2ZsYWdzID0gMDsKKwl1bnNpZ25lZCBpbnQgZ2JfbnN0cmVhbXMgPSAqbnN0cmVhbXM7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldDsKKworCWlmIChnYl9uc3RyZWFtcyA+IEdCX0NBTUVSQV9NQVhfU1RSRUFNUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlnYl9zdHJlYW1zID0ga3phbGxvYyhnYl9uc3RyZWFtcyAqIHNpemVvZigqZ2Jfc3RyZWFtcyksIEdGUF9LRVJORUwpOworCWlmICghZ2Jfc3RyZWFtcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgZ2JfbnN0cmVhbXM7IGkrKykgeworCQlnYl9zdHJlYW1zW2ldLndpZHRoID0gc3RyZWFtc1tpXS53aWR0aDsKKwkJZ2Jfc3RyZWFtc1tpXS5oZWlnaHQgPSBzdHJlYW1zW2ldLmhlaWdodDsKKwkJZ2Jfc3RyZWFtc1tpXS5mb3JtYXQgPQorCQkJZ2JfY2FtZXJhX21idXNfdG9fZ2Ioc3RyZWFtc1tpXS5waXhlbF9jb2RlKTsKKwl9CisKKwlpZiAoKmZsYWdzICYgR0JfQ0FNRVJBX0lOX0ZMQUdfVEVTVCkKKwkJZ2JfZmxhZ3MgfD0gR0JfQ0FNRVJBX0NPTkZJR1VSRV9TVFJFQU1TX1RFU1RfT05MWTsKKworCXJldCA9IGdiX2NhbWVyYV9jb25maWd1cmVfc3RyZWFtcyhnY2FtLCAmZ2JfbnN0cmVhbXMsCisJCQkJCSAgJmdiX2ZsYWdzLCBnYl9zdHJlYW1zLCBjc2lfcGFyYW1zKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBkb25lOworCWlmIChnYl9uc3RyZWFtcyA+ICpuc3RyZWFtcykgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJKmZsYWdzID0gMDsKKwlpZiAoZ2JfZmxhZ3MgJiBHQl9DQU1FUkFfQ09ORklHVVJFX1NUUkVBTVNfQURKVVNURUQpCisJCSpmbGFncyB8PSBHQl9DQU1FUkFfT1VUX0ZMQUdfQURKVVNURUQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgZ2JfbnN0cmVhbXM7IGkrKykgeworCQlzdHJlYW1zW2ldLndpZHRoID0gZ2Jfc3RyZWFtc1tpXS53aWR0aDsKKwkJc3RyZWFtc1tpXS5oZWlnaHQgPSBnYl9zdHJlYW1zW2ldLmhlaWdodDsKKwkJc3RyZWFtc1tpXS52YyA9IGdiX3N0cmVhbXNbaV0udmM7CisJCXN0cmVhbXNbaV0uZHRbMF0gPSBnYl9zdHJlYW1zW2ldLmR0WzBdOworCQlzdHJlYW1zW2ldLmR0WzFdID0gZ2Jfc3RyZWFtc1tpXS5kdFsxXTsKKwkJc3RyZWFtc1tpXS5tYXhfc2l6ZSA9IGdiX3N0cmVhbXNbaV0ubWF4X3NpemU7CisJCXN0cmVhbXNbaV0ucGl4ZWxfY29kZSA9CisJCQlnYl9jYW1lcmFfZ2JfdG9fbWJ1cyhnYl9zdHJlYW1zW2ldLmZvcm1hdCk7CisJfQorCSpuc3RyZWFtcyA9IGdiX25zdHJlYW1zOworCitkb25lOgorCWtmcmVlKGdiX3N0cmVhbXMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfY2FtZXJhX29wX2NhcHR1cmUodm9pZCAqcHJpdiwgdTMyIHJlcXVlc3RfaWQsCisJCXVuc2lnbmVkIGludCBzdHJlYW1zLCB1bnNpZ25lZCBpbnQgbnVtX2ZyYW1lcywKKwkJc2l6ZV90IHNldHRpbmdzX3NpemUsIGNvbnN0IHZvaWQgKnNldHRpbmdzKQoreworCXN0cnVjdCBnYl9jYW1lcmEgKmdjYW0gPSBwcml2OworCisJcmV0dXJuIGdiX2NhbWVyYV9jYXB0dXJlKGdjYW0sIHJlcXVlc3RfaWQsIHN0cmVhbXMsIG51bV9mcmFtZXMsCisJCQkJIHNldHRpbmdzX3NpemUsIHNldHRpbmdzKTsKK30KKworc3RhdGljIGludCBnYl9jYW1lcmFfb3BfZmx1c2godm9pZCAqcHJpdiwgdTMyICpyZXF1ZXN0X2lkKQoreworCXN0cnVjdCBnYl9jYW1lcmEgKmdjYW0gPSBwcml2OworCisJcmV0dXJuIGdiX2NhbWVyYV9mbHVzaChnY2FtLCByZXF1ZXN0X2lkKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBnYl9jYW1lcmFfb3BzIGdiX2NhbV9vcHMgPSB7CisJLmNhcGFiaWxpdGllcyA9IGdiX2NhbWVyYV9vcF9jYXBhYmlsaXRpZXMsCisJLmNvbmZpZ3VyZV9zdHJlYW1zID0gZ2JfY2FtZXJhX29wX2NvbmZpZ3VyZV9zdHJlYW1zLAorCS5jYXB0dXJlID0gZ2JfY2FtZXJhX29wX2NhcHR1cmUsCisJLmZsdXNoID0gZ2JfY2FtZXJhX29wX2ZsdXNoLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERlYnVnRlMKKyAqLworCitzdGF0aWMgc3NpemVfdCBnYl9jYW1lcmFfZGVidWdmc19jYXBhYmlsaXRpZXMoc3RydWN0IGdiX2NhbWVyYSAqZ2NhbSwKKwkJY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBnYl9jYW1lcmFfZGVidWdmc19idWZmZXIgKmJ1ZmZlciA9CisJCSZnY2FtLT5kZWJ1Z2ZzLmJ1ZmZlcnNbR0JfQ0FNRVJBX0RFQlVHRlNfQlVGRkVSX0NBUEFCSUxJVElFU107CisJc2l6ZV90IHNpemUgPSAxMDI0OworCXVuc2lnbmVkIGludCBpOworCXU4ICpjYXBzOworCWludCByZXQ7CisKKwljYXBzID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNhcHMpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gZ2JfY2FtZXJhX2NhcGFiaWxpdGllcyhnY2FtLCBjYXBzLCAmc2l6ZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZG9uZTsKKworCS8qCisJICogaGV4X2R1bXBfdG9fYnVmZmVyKCkgZG9lc24ndCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBkdW1wZWQgcHJpb3IKKwkgKiB0byB2NC4wLCB3ZSBuZWVkIG91ciBvd24gaW1wbGVtZW50YXRpb24gOi0oCisJICovCisJYnVmZmVyLT5sZW5ndGggPSAwOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gMTYpIHsKKwkJdW5zaWduZWQgaW50IG5ieXRlcyA9IG1pbl90KHVuc2lnbmVkIGludCwgc2l6ZSAtIGksIDE2KTsKKworCQlidWZmZXItPmxlbmd0aCArPSBzcHJpbnRmKGJ1ZmZlci0+ZGF0YSArIGJ1ZmZlci0+bGVuZ3RoLAorCQkJCQkgICIlKnBoXG4iLCBuYnl0ZXMsIGNhcHMgKyBpKTsKKwl9CisKK2RvbmU6CisJa2ZyZWUoY2Fwcyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgZ2JfY2FtZXJhX2RlYnVnZnNfY29uZmlndXJlX3N0cmVhbXMoc3RydWN0IGdiX2NhbWVyYSAqZ2NhbSwKKwkJY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBnYl9jYW1lcmFfZGVidWdmc19idWZmZXIgKmJ1ZmZlciA9CisJCSZnY2FtLT5kZWJ1Z2ZzLmJ1ZmZlcnNbR0JfQ0FNRVJBX0RFQlVHRlNfQlVGRkVSX1NUUkVBTVNdOworCXN0cnVjdCBnYl9jYW1lcmFfc3RyZWFtX2NvbmZpZyAqc3RyZWFtczsKKwl1bnNpZ25lZCBpbnQgbnN0cmVhbXM7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGludCBpOworCWNoYXIgKnRva2VuOworCWludCByZXQ7CisKKwkvKiBSZXRyaWV2ZSBudW1iZXIgb2Ygc3RyZWFtcyB0byBjb25maWd1cmUgKi8KKwl0b2tlbiA9IHN0cnNlcCgmYnVmLCAiOyIpOworCWlmICh0b2tlbiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IGtzdHJ0b3VpbnQodG9rZW4sIDEwLCAmbnN0cmVhbXMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKG5zdHJlYW1zID4gR0JfQ0FNRVJBX01BWF9TVFJFQU1TKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRva2VuID0gc3Ryc2VwKCZidWYsICI7Iik7CisJaWYgKHRva2VuID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0ga3N0cnRvdWludCh0b2tlbiwgMTAsICZmbGFncyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBGb3IgZWFjaCBzdHJlYW0gdG8gY29uZmlndXJlIHBhcnNlIHdpZHRoLCBoZWlnaHQgYW5kIGZvcm1hdCAqLworCXN0cmVhbXMgPSBremFsbG9jKG5zdHJlYW1zICogc2l6ZW9mKCpzdHJlYW1zKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdHJlYW1zKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBuc3RyZWFtczsgKytpKSB7CisJCXN0cnVjdCBnYl9jYW1lcmFfc3RyZWFtX2NvbmZpZyAqc3RyZWFtID0gJnN0cmVhbXNbaV07CisKKwkJLyogd2lkdGggKi8KKwkJdG9rZW4gPSBzdHJzZXAoJmJ1ZiwgIjsiKTsKKwkJaWYgKHRva2VuID09IE5VTEwpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJcmV0ID0ga3N0cnRvdWludCh0b2tlbiwgMTAsICZzdHJlYW0tPndpZHRoKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGRvbmU7CisKKwkJLyogaGVpZ2h0ICovCisJCXRva2VuID0gc3Ryc2VwKCZidWYsICI7Iik7CisJCWlmICh0b2tlbiA9PSBOVUxMKQorCQkJZ290byBkb25lOworCisJCXJldCA9IGtzdHJ0b3VpbnQodG9rZW4sIDEwLCAmc3RyZWFtLT5oZWlnaHQpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZG9uZTsKKworCQkvKiBJbWFnZSBmb3JtYXQgY29kZSAqLworCQl0b2tlbiA9IHN0cnNlcCgmYnVmLCAiOyIpOworCQlpZiAodG9rZW4gPT0gTlVMTCkKKwkJCWdvdG8gZG9uZTsKKworCQlyZXQgPSBrc3RydG91aW50KHRva2VuLCAxNiwgJnN0cmVhbS0+Zm9ybWF0KTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gZ2JfY2FtZXJhX2NvbmZpZ3VyZV9zdHJlYW1zKGdjYW0sICZuc3RyZWFtcywgJmZsYWdzLCBzdHJlYW1zLAorCQkJCQkgIE5VTEwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGRvbmU7CisKKwlidWZmZXItPmxlbmd0aCA9IHNwcmludGYoYnVmZmVyLT5kYXRhLCAiJXU7JXU7IiwgbnN0cmVhbXMsIGZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBuc3RyZWFtczsgKytpKSB7CisJCXN0cnVjdCBnYl9jYW1lcmFfc3RyZWFtX2NvbmZpZyAqc3RyZWFtID0gJnN0cmVhbXNbaV07CisKKwkJYnVmZmVyLT5sZW5ndGggKz0gc3ByaW50ZihidWZmZXItPmRhdGEgKyBidWZmZXItPmxlbmd0aCwKKwkJCQkJICAiJXU7JXU7JXU7JXU7JXU7JXU7JXU7IiwKKwkJCQkJICBzdHJlYW0tPndpZHRoLCBzdHJlYW0tPmhlaWdodCwKKwkJCQkJICBzdHJlYW0tPmZvcm1hdCwgc3RyZWFtLT52YywKKwkJCQkJICBzdHJlYW0tPmR0WzBdLCBzdHJlYW0tPmR0WzFdLAorCQkJCQkgIHN0cmVhbS0+bWF4X3NpemUpOworCX0KKworCXJldCA9IGxlbjsKKworZG9uZToKKwlrZnJlZShzdHJlYW1zKTsKKwlyZXR1cm4gcmV0OworfTsKKworc3RhdGljIHNzaXplX3QgZ2JfY2FtZXJhX2RlYnVnZnNfY2FwdHVyZShzdHJ1Y3QgZ2JfY2FtZXJhICpnY2FtLAorCQljaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJdW5zaWduZWQgaW50IHJlcXVlc3RfaWQ7CisJdW5zaWduZWQgaW50IHN0cmVhbXNfbWFzazsKKwl1bnNpZ25lZCBpbnQgbnVtX2ZyYW1lczsKKwljaGFyICp0b2tlbjsKKwlpbnQgcmV0OworCisJLyogUmVxdWVzdCBpZCAqLworCXRva2VuID0gc3Ryc2VwKCZidWYsICI7Iik7CisJaWYgKHRva2VuID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCXJldCA9IGtzdHJ0b3VpbnQodG9rZW4sIDEwLCAmcmVxdWVzdF9pZCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBTdHJlYW0gbWFzayAqLworCXRva2VuID0gc3Ryc2VwKCZidWYsICI7Iik7CisJaWYgKHRva2VuID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCXJldCA9IGtzdHJ0b3VpbnQodG9rZW4sIDE2LCAmc3RyZWFtc19tYXNrKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIG51bWJlciBvZiBmcmFtZXMgKi8KKwl0b2tlbiA9IHN0cnNlcCgmYnVmLCAiOyIpOworCWlmICh0b2tlbiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXQgPSBrc3RydG91aW50KHRva2VuLCAxMCwgJm51bV9mcmFtZXMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZ2JfY2FtZXJhX2NhcHR1cmUoZ2NhbSwgcmVxdWVzdF9pZCwgc3RyZWFtc19tYXNrLCBudW1fZnJhbWVzLCAwLAorCQkJCU5VTEwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgZ2JfY2FtZXJhX2RlYnVnZnNfZmx1c2goc3RydWN0IGdiX2NhbWVyYSAqZ2NhbSwKKwkJY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBnYl9jYW1lcmFfZGVidWdmc19idWZmZXIgKmJ1ZmZlciA9CisJCSZnY2FtLT5kZWJ1Z2ZzLmJ1ZmZlcnNbR0JfQ0FNRVJBX0RFQlVHRlNfQlVGRkVSX0ZMVVNIXTsKKwl1bnNpZ25lZCBpbnQgcmVxX2lkOworCWludCByZXQ7CisKKwlyZXQgPSBnYl9jYW1lcmFfZmx1c2goZ2NhbSwgJnJlcV9pZCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlidWZmZXItPmxlbmd0aCA9IHNwcmludGYoYnVmZmVyLT5kYXRhLCAiJXUiLCByZXFfaWQpOworCisJcmV0dXJuIGxlbjsKK30KKworc3RydWN0IGdiX2NhbWVyYV9kZWJ1Z2ZzX2VudHJ5IHsKKwljb25zdCBjaGFyICpuYW1lOworCXVuc2lnbmVkIGludCBtYXNrOworCXVuc2lnbmVkIGludCBidWZmZXI7CisJc3NpemVfdCAoKmV4ZWN1dGUpKHN0cnVjdCBnYl9jYW1lcmEgKmdjYW0sIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdiX2NhbWVyYV9kZWJ1Z2ZzX2VudHJ5IGdiX2NhbWVyYV9kZWJ1Z2ZzX2VudHJpZXNbXSA9IHsKKwl7CisJCS5uYW1lID0gImNhcGFiaWxpdGllcyIsCisJCS5tYXNrID0gU19JRlJFRyB8IFNfSVJVR08sCisJCS5idWZmZXIgPSBHQl9DQU1FUkFfREVCVUdGU19CVUZGRVJfQ0FQQUJJTElUSUVTLAorCQkuZXhlY3V0ZSA9IGdiX2NhbWVyYV9kZWJ1Z2ZzX2NhcGFiaWxpdGllcywKKwl9LCB7CisJCS5uYW1lID0gImNvbmZpZ3VyZV9zdHJlYW1zIiwKKwkJLm1hc2sgPSBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVR08sCisJCS5idWZmZXIgPSBHQl9DQU1FUkFfREVCVUdGU19CVUZGRVJfU1RSRUFNUywKKwkJLmV4ZWN1dGUgPSBnYl9jYW1lcmFfZGVidWdmc19jb25maWd1cmVfc3RyZWFtcywKKwl9LCB7CisJCS5uYW1lID0gImNhcHR1cmUiLAorCQkubWFzayA9IFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VHTywKKwkJLmJ1ZmZlciA9IEdCX0NBTUVSQV9ERUJVR0ZTX0JVRkZFUl9DQVBUVVJFLAorCQkuZXhlY3V0ZSA9IGdiX2NhbWVyYV9kZWJ1Z2ZzX2NhcHR1cmUsCisJfSwgeworCQkubmFtZSA9ICJmbHVzaCIsCisJCS5tYXNrID0gU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVUdPLAorCQkuYnVmZmVyID0gR0JfQ0FNRVJBX0RFQlVHRlNfQlVGRkVSX0ZMVVNILAorCQkuZXhlY3V0ZSA9IGdiX2NhbWVyYV9kZWJ1Z2ZzX2ZsdXNoLAorCX0sCit9OworCitzdGF0aWMgc3NpemVfdCBnYl9jYW1lcmFfZGVidWdmc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0KQoreworCWNvbnN0IHN0cnVjdCBnYl9jYW1lcmFfZGVidWdmc19lbnRyeSAqb3AgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGdiX2NhbWVyYSAqZ2NhbSA9IGZpbGUtPmZfaW5vZGUtPmlfcHJpdmF0ZTsKKwlzdHJ1Y3QgZ2JfY2FtZXJhX2RlYnVnZnNfYnVmZmVyICpidWZmZXI7CisJc3NpemVfdCByZXQ7CisKKwkvKiBGb3IgcmVhZC1vbmx5IGVudHJpZXMgdGhlIG9wZXJhdGlvbiBpcyB0cmlnZ2VyZWQgYnkgYSByZWFkLiAqLworCWlmICghKG9wLT5tYXNrICYgU19JV1VHTykpIHsKKwkJcmV0ID0gb3AtPmV4ZWN1dGUoZ2NhbSwgTlVMTCwgMCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlidWZmZXIgPSAmZ2NhbS0+ZGVidWdmcy5idWZmZXJzW29wLT5idWZmZXJdOworCisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgbGVuLCBvZmZzZXQsIGJ1ZmZlci0+ZGF0YSwKKwkJCQkgICAgICAgYnVmZmVyLT5sZW5ndGgpOworfQorCitzdGF0aWMgc3NpemVfdCBnYl9jYW1lcmFfZGVidWdmc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwKKwkJCQkgICAgICAgbG9mZl90ICpvZmZzZXQpCit7CisJY29uc3Qgc3RydWN0IGdiX2NhbWVyYV9kZWJ1Z2ZzX2VudHJ5ICpvcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZ2JfY2FtZXJhICpnY2FtID0gZmlsZS0+Zl9pbm9kZS0+aV9wcml2YXRlOworCXNzaXplX3QgcmV0OworCWNoYXIgKmtidWY7CisKKwlpZiAobGVuID4gMTAyNCkKKwkgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKwlrYnVmID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWtidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGtidWYsIGJ1ZiwgbGVuKSkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGRvbmU7CisJfQorCisJa2J1ZltsZW5dID0gJ1wwJzsKKworCXJldCA9IG9wLT5leGVjdXRlKGdjYW0sIGtidWYsIGxlbik7CisKK2RvbmU6CisJa2ZyZWUoa2J1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9jYW1lcmFfZGVidWdmc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZ2JfY2FtZXJhX2RlYnVnZnNfZW50cmllcyk7ICsraSkgeworCQljb25zdCBzdHJ1Y3QgZ2JfY2FtZXJhX2RlYnVnZnNfZW50cnkgKmVudHJ5ID0KKwkJCSZnYl9jYW1lcmFfZGVidWdmc19lbnRyaWVzW2ldOworCisJCWlmICghc3RyY21wKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5hbWUsIGVudHJ5LT5uYW1lKSkgeworCQkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKillbnRyeTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGdiX2NhbWVyYV9kZWJ1Z2ZzX29wcyA9IHsKKwkub3BlbiA9IGdiX2NhbWVyYV9kZWJ1Z2ZzX29wZW4sCisJLnJlYWQgPSBnYl9jYW1lcmFfZGVidWdmc19yZWFkLAorCS53cml0ZSA9IGdiX2NhbWVyYV9kZWJ1Z2ZzX3dyaXRlLAorfTsKKworc3RhdGljIGludCBnYl9jYW1lcmFfZGVidWdmc19pbml0KHN0cnVjdCBnYl9jYW1lcmEgKmdjYW0pCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBnY2FtLT5jb25uZWN0aW9uOworCWNoYXIgZGlybmFtZVsyN107CisJdW5zaWduZWQgaW50IGk7CisKKwkvKgorCSAqIENyZWF0ZSByb290IGRlYnVnZnMgZW50cnkgYW5kIGEgZmlsZSBlbnRyeSBmb3IgZWFjaCBjYW1lcmEgb3BlcmF0aW9uLgorCSAqLworCXNucHJpbnRmKGRpcm5hbWUsIDI3LCAiY2FtZXJhLSV1LiV1IiwgY29ubmVjdGlvbi0+aW50Zi0+aW50ZXJmYWNlX2lkLAorCQkgZ2NhbS0+YnVuZGxlLT5pZCk7CisKKwlnY2FtLT5kZWJ1Z2ZzLnJvb3QgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoZGlybmFtZSwgZ2JfZGVidWdmc19nZXQoKSk7CisJaWYgKElTX0VSUihnY2FtLT5kZWJ1Z2ZzLnJvb3QpKSB7CisJCWdjYW1fZXJyKGdjYW0sICJkZWJ1Z2ZzIHJvb3QgY3JlYXRlIGZhaWxlZCAoJWxkKVxuIiwKKwkJCSBQVFJfRVJSKGdjYW0tPmRlYnVnZnMucm9vdCkpOworCQlyZXR1cm4gUFRSX0VSUihnY2FtLT5kZWJ1Z2ZzLnJvb3QpOworCX0KKworCWdjYW0tPmRlYnVnZnMuYnVmZmVycyA9IHZtYWxsb2Moc2l6ZW9mKCpnY2FtLT5kZWJ1Z2ZzLmJ1ZmZlcnMpICoKKwkJCQkJR0JfQ0FNRVJBX0RFQlVHRlNfQlVGRkVSX01BWCk7CisJaWYgKCFnY2FtLT5kZWJ1Z2ZzLmJ1ZmZlcnMpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZ2JfY2FtZXJhX2RlYnVnZnNfZW50cmllcyk7ICsraSkgeworCQljb25zdCBzdHJ1Y3QgZ2JfY2FtZXJhX2RlYnVnZnNfZW50cnkgKmVudHJ5ID0KKwkJCSZnYl9jYW1lcmFfZGVidWdmc19lbnRyaWVzW2ldOworCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisKKwkJZ2NhbS0+ZGVidWdmcy5idWZmZXJzW2ldLmxlbmd0aCA9IDA7CisKKwkJZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShlbnRyeS0+bmFtZSwgZW50cnktPm1hc2ssCisJCQkJCSAgICAgZ2NhbS0+ZGVidWdmcy5yb290LCBnY2FtLAorCQkJCQkgICAgICZnYl9jYW1lcmFfZGVidWdmc19vcHMpOworCQlpZiAoSVNfRVJSKGRlbnRyeSkpIHsKKwkJCWdjYW1fZXJyKGdjYW0sCisJCQkJICJkZWJ1Z2ZzIG9wZXJhdGlvbiAlcyBjcmVhdGUgZmFpbGVkICglbGQpXG4iLAorCQkJCSBlbnRyeS0+bmFtZSwgUFRSX0VSUihkZW50cnkpKTsKKwkJCXJldHVybiBQVFJfRVJSKGRlbnRyeSk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2JfY2FtZXJhX2RlYnVnZnNfY2xlYW51cChzdHJ1Y3QgZ2JfY2FtZXJhICpnY2FtKQoreworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShnY2FtLT5kZWJ1Z2ZzLnJvb3QpOworCisJdmZyZWUoZ2NhbS0+ZGVidWdmcy5idWZmZXJzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluaXQgJiBDbGVhbnVwCisgKi8KKworc3RhdGljIHZvaWQgZ2JfY2FtZXJhX2NsZWFudXAoc3RydWN0IGdiX2NhbWVyYSAqZ2NhbSkKK3sKKwlnYl9jYW1lcmFfZGVidWdmc19jbGVhbnVwKGdjYW0pOworCisJbXV0ZXhfbG9jaygmZ2NhbS0+bXV0ZXgpOworCWlmIChnY2FtLT5kYXRhX2Nvbm5lY3Rpb24pIHsKKwkJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGdjYW0tPmRhdGFfY29ubmVjdGlvbik7CisJCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShnY2FtLT5kYXRhX2Nvbm5lY3Rpb24pOworCQlnY2FtLT5kYXRhX2Nvbm5lY3Rpb24gPSBOVUxMOworCX0KKworCWlmIChnY2FtLT5jb25uZWN0aW9uKSB7CisJCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShnY2FtLT5jb25uZWN0aW9uKTsKKwkJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGdjYW0tPmNvbm5lY3Rpb24pOworCQlnY2FtLT5jb25uZWN0aW9uID0gTlVMTDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZnY2FtLT5tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2NhbWVyYV9yZWxlYXNlX21vZHVsZShzdHJ1Y3Qga3JlZiAqcmVmKQoreworCXN0cnVjdCBnYl9jYW1lcmFfbW9kdWxlICpjYW1fbW9kID0KKwkJY29udGFpbmVyX29mKHJlZiwgc3RydWN0IGdiX2NhbWVyYV9tb2R1bGUsIHJlZmNvdW50KTsKKwlrZnJlZShjYW1fbW9kLT5wcml2KTsKK30KKworc3RhdGljIGludCBnYl9jYW1lcmFfcHJvYmUoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlLAorCQkJICAgY29uc3Qgc3RydWN0IGdyZXlidXNfYnVuZGxlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubjsKKwlzdHJ1Y3QgZ2JfY2FtZXJhICpnY2FtOworCXUxNiBtZ210X2Nwb3J0X2lkID0gMDsKKwl1MTYgZGF0YV9jcG9ydF9pZCA9IDA7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldDsKKworCS8qCisJICogVGhlIGNhbWVyYSBidW5kbGUgbXVzdCBjb250YWluIGV4YWN0bHkgdHdvIENQb3J0cywgb25lIGZvciB0aGUKKwkgKiBjYW1lcmEgbWFuYWdlbWVudCBwcm90b2NvbCBhbmQgb25lIGZvciB0aGUgY2FtZXJhIGRhdGEgcHJvdG9jb2wuCisJICovCisJaWYgKGJ1bmRsZS0+bnVtX2Nwb3J0cyAhPSAyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWZvciAoaSA9IDA7IGkgPCBidW5kbGUtPm51bV9jcG9ydHM7ICsraSkgeworCQlzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yX2Nwb3J0ICpkZXNjID0gJmJ1bmRsZS0+Y3BvcnRfZGVzY1tpXTsKKworCQlzd2l0Y2ggKGRlc2MtPnByb3RvY29sX2lkKSB7CisJCWNhc2UgR1JFWUJVU19QUk9UT0NPTF9DQU1FUkFfTUdNVDoKKwkJCW1nbXRfY3BvcnRfaWQgPSBsZTE2X3RvX2NwdShkZXNjLT5pZCk7CisJCQlicmVhazsKKwkJY2FzZSBHUkVZQlVTX1BST1RPQ09MX0NBTUVSQV9EQVRBOgorCQkJZGF0YV9jcG9ydF9pZCA9IGxlMTZfdG9fY3B1KGRlc2MtPmlkKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwlpZiAoIW1nbXRfY3BvcnRfaWQgfHwgIWRhdGFfY3BvcnRfaWQpCisJCXJldHVybiAtRU5PREVWOworCisJZ2NhbSA9IGt6YWxsb2Moc2l6ZW9mKCpnY2FtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFnY2FtKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW11dGV4X2luaXQoJmdjYW0tPm11dGV4KTsKKworCWdjYW0tPmJ1bmRsZSA9IGJ1bmRsZTsKKwlnY2FtLT5zdGF0ZSA9IEdCX0NBTUVSQV9TVEFURV9VTkNPTkZJR1VSRUQ7CisJZ2NhbS0+ZGF0YV9jcG9ydF9pZCA9IGRhdGFfY3BvcnRfaWQ7CisKKwljb25uID0gZ2JfY29ubmVjdGlvbl9jcmVhdGUoYnVuZGxlLCBtZ210X2Nwb3J0X2lkLAorCQkJCSAgICBnYl9jYW1lcmFfcmVxdWVzdF9oYW5kbGVyKTsKKwlpZiAoSVNfRVJSKGNvbm4pKSB7CisJCXJldCA9IFBUUl9FUlIoY29ubik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJZ2NhbS0+Y29ubmVjdGlvbiA9IGNvbm47CisJZ2JfY29ubmVjdGlvbl9zZXRfZGF0YShjb25uLCBnY2FtKTsKKworCXJldCA9IGdiX2Nvbm5lY3Rpb25fZW5hYmxlKGNvbm4pOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBnYl9jYW1lcmFfZGVidWdmc19pbml0KGdjYW0pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJZ2NhbS0+bW9kdWxlLnByaXYgPSBnY2FtOworCWdjYW0tPm1vZHVsZS5vcHMgPSAmZ2JfY2FtX29wczsKKwlnY2FtLT5tb2R1bGUuaW50ZXJmYWNlX2lkID0gZ2NhbS0+Y29ubmVjdGlvbi0+aW50Zi0+aW50ZXJmYWNlX2lkOworCWdjYW0tPm1vZHVsZS5yZWxlYXNlID0gZ2JfY2FtZXJhX3JlbGVhc2VfbW9kdWxlOworCXJldCA9IGdiX2NhbWVyYV9yZWdpc3RlcigmZ2NhbS0+bW9kdWxlKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCWdyZXlidXNfc2V0X2RydmRhdGEoYnVuZGxlLCBnY2FtKTsKKworCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGdjYW0tPmJ1bmRsZSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJZ2JfY2FtZXJhX2NsZWFudXAoZ2NhbSk7CisJa2ZyZWUoZ2NhbSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZ2JfY2FtZXJhX2Rpc2Nvbm5lY3Qoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlKQoreworCXN0cnVjdCBnYl9jYW1lcmEgKmdjYW0gPSBncmV5YnVzX2dldF9kcnZkYXRhKGJ1bmRsZSk7CisJaW50IHJldDsKKworCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoYnVuZGxlKTsKKwlpZiAocmV0KQorCQlnYl9wbV9ydW50aW1lX2dldF9ub3Jlc3VtZShidW5kbGUpOworCisJZ2JfY2FtZXJhX2NsZWFudXAoZ2NhbSk7CisJZ2JfY2FtZXJhX3VucmVnaXN0ZXIoJmdjYW0tPm1vZHVsZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3JleWJ1c19idW5kbGVfaWQgZ2JfY2FtZXJhX2lkX3RhYmxlW10gPSB7CisJeyBHUkVZQlVTX0RFVklDRV9DTEFTUyhHUkVZQlVTX0NMQVNTX0NBTUVSQSkgfSwKKwl7IH0sCit9OworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGdiX2NhbWVyYV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUgPSB0b19nYl9idW5kbGUoZGV2KTsKKwlzdHJ1Y3QgZ2JfY2FtZXJhICpnY2FtID0gZ3JleWJ1c19nZXRfZHJ2ZGF0YShidW5kbGUpOworCisJaWYgKGdjYW0tPmRhdGFfY29ubmVjdGlvbikKKwkJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGdjYW0tPmRhdGFfY29ubmVjdGlvbik7CisKKwlnYl9jb25uZWN0aW9uX2Rpc2FibGUoZ2NhbS0+Y29ubmVjdGlvbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9jYW1lcmFfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUgPSB0b19nYl9idW5kbGUoZGV2KTsKKwlzdHJ1Y3QgZ2JfY2FtZXJhICpnY2FtID0gZ3JleWJ1c19nZXRfZHJ2ZGF0YShidW5kbGUpOworCWludCByZXQ7CisKKwlyZXQgPSBnYl9jb25uZWN0aW9uX2VuYWJsZShnY2FtLT5jb25uZWN0aW9uKTsKKwlpZiAocmV0KSB7CisJCWdjYW1fZXJyKGdjYW0sICJmYWlsZWQgdG8gZW5hYmxlIGNvbm5lY3Rpb246ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChnY2FtLT5kYXRhX2Nvbm5lY3Rpb24pIHsKKwkJcmV0ID0gZ2JfY29ubmVjdGlvbl9lbmFibGUoZ2NhbS0+ZGF0YV9jb25uZWN0aW9uKTsKKwkJaWYgKHJldCkgeworCQkJZ2NhbV9lcnIoZ2NhbSwKKwkJCQkgImZhaWxlZCB0byBlbmFibGUgZGF0YSBjb25uZWN0aW9uOiAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgZ2JfY2FtZXJhX3BtX29wcyA9IHsKKwlTRVRfUlVOVElNRV9QTV9PUFMoZ2JfY2FtZXJhX3N1c3BlbmQsIGdiX2NhbWVyYV9yZXN1bWUsIE5VTEwpCit9OworCitzdGF0aWMgc3RydWN0IGdyZXlidXNfZHJpdmVyIGdiX2NhbWVyYV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImNhbWVyYSIsCisJLnByb2JlCQk9IGdiX2NhbWVyYV9wcm9iZSwKKwkuZGlzY29ubmVjdAk9IGdiX2NhbWVyYV9kaXNjb25uZWN0LAorCS5pZF90YWJsZQk9IGdiX2NhbWVyYV9pZF90YWJsZSwKKwkuZHJpdmVyLnBtCT0gJmdiX2NhbWVyYV9wbV9vcHMsCit9OworCittb2R1bGVfZ3JleWJ1c19kcml2ZXIoZ2JfY2FtZXJhX2RyaXZlcik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2Nvbm5lY3Rpb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2Nvbm5lY3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTcwNzUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvY29ubmVjdGlvbi5jCkBAIC0wLDAgKzEsOTM4IEBACisvKgorICogR3JleWJ1cyBjb25uZWN0aW9ucworICoKKyAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNCBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2luY2x1ZGUgImdyZXlidXMuaCIKKyNpbmNsdWRlICJncmV5YnVzX3RyYWNlLmgiCisKKworI2RlZmluZSBHQl9DT05ORUNUSU9OX0NQT1JUX1FVSUVTQ0VfVElNRU9VVAkxMDAwCisKKworc3RhdGljIHZvaWQgZ2JfY29ubmVjdGlvbl9rcmVmX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpOworCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZ2JfY29ubmVjdGlvbnNfbG9jayk7CitzdGF0aWMgREVGSU5FX01VVEVYKGdiX2Nvbm5lY3Rpb25fbXV0ZXgpOworCisKKy8qIENhbGxlciBob2xkcyBnYl9jb25uZWN0aW9uX211dGV4LiAqLworc3RhdGljIGJvb2wgZ2JfY29ubmVjdGlvbl9jcG9ydF9pbl91c2Uoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZiwgdTE2IGNwb3J0X2lkKQoreworCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQgPSBpbnRmLT5oZDsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdGlvbiwgJmhkLT5jb25uZWN0aW9ucywgaGRfbGlua3MpIHsKKwkJaWYgKGNvbm5lY3Rpb24tPmludGYgPT0gaW50ZiAmJgorCQkJCWNvbm5lY3Rpb24tPmludGZfY3BvcnRfaWQgPT0gY3BvcnRfaWQpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2Nvbm5lY3Rpb25fZ2V0KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCWtyZWZfZ2V0KCZjb25uZWN0aW9uLT5rcmVmKTsKKworCXRyYWNlX2diX2Nvbm5lY3Rpb25fZ2V0KGNvbm5lY3Rpb24pOworfQorCitzdGF0aWMgdm9pZCBnYl9jb25uZWN0aW9uX3B1dChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwl0cmFjZV9nYl9jb25uZWN0aW9uX3B1dChjb25uZWN0aW9uKTsKKworCWtyZWZfcHV0KCZjb25uZWN0aW9uLT5rcmVmLCBnYl9jb25uZWN0aW9uX2tyZWZfcmVsZWFzZSk7Cit9CisKKy8qCisgKiBSZXR1cm5zIGEgcmVmZXJlbmNlLWNvdW50ZWQgcG9pbnRlciB0byB0aGUgY29ubmVjdGlvbiBpZiBmb3VuZC4KKyAqLworc3RhdGljIHN0cnVjdCBnYl9jb25uZWN0aW9uICoKK2diX2Nvbm5lY3Rpb25faGRfZmluZChzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCB1MTYgY3BvcnRfaWQpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZnYl9jb25uZWN0aW9uc19sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0aW9uLCAmaGQtPmNvbm5lY3Rpb25zLCBoZF9saW5rcykKKwkJaWYgKGNvbm5lY3Rpb24tPmhkX2Nwb3J0X2lkID09IGNwb3J0X2lkKSB7CisJCQlnYl9jb25uZWN0aW9uX2dldChjb25uZWN0aW9uKTsKKwkJCWdvdG8gZm91bmQ7CisJCX0KKwljb25uZWN0aW9uID0gTlVMTDsKK2ZvdW5kOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdiX2Nvbm5lY3Rpb25zX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBjb25uZWN0aW9uOworfQorCisvKgorICogQ2FsbGJhY2sgZnJvbSB0aGUgaG9zdCBkcml2ZXIgdG8gbGV0IHVzIGtub3cgdGhhdCBkYXRhIGhhcyBiZWVuCisgKiByZWNlaXZlZCBvbiB0aGUgYnVuZGxlLgorICovCit2b2lkIGdyZXlidXNfZGF0YV9yY3ZkKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHUxNiBjcG9ydF9pZCwKKwkJCXU4ICpkYXRhLCBzaXplX3QgbGVuZ3RoKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCisJdHJhY2VfZ2JfaGRfaW4oaGQpOworCisJY29ubmVjdGlvbiA9IGdiX2Nvbm5lY3Rpb25faGRfZmluZChoZCwgY3BvcnRfaWQpOworCWlmICghY29ubmVjdGlvbikgeworCQlkZXZfZXJyKCZoZC0+ZGV2LAorCQkJIm5vbmV4aXN0ZW50IGNvbm5lY3Rpb24gKCV6dSBieXRlcyBkcm9wcGVkKVxuIiwgbGVuZ3RoKTsKKwkJcmV0dXJuOworCX0KKwlnYl9jb25uZWN0aW9uX3JlY3YoY29ubmVjdGlvbiwgZGF0YSwgbGVuZ3RoKTsKKwlnYl9jb25uZWN0aW9uX3B1dChjb25uZWN0aW9uKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdyZXlidXNfZGF0YV9yY3ZkKTsKKworc3RhdGljIHZvaWQgZ2JfY29ubmVjdGlvbl9rcmVmX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisKKwljb25uZWN0aW9uID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBnYl9jb25uZWN0aW9uLCBrcmVmKTsKKworCXRyYWNlX2diX2Nvbm5lY3Rpb25fcmVsZWFzZShjb25uZWN0aW9uKTsKKworCWtmcmVlKGNvbm5lY3Rpb24pOworfQorCitzdGF0aWMgdm9pZCBnYl9jb25uZWN0aW9uX2luaXRfbmFtZShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwl1MTYgaGRfY3BvcnRfaWQgPSBjb25uZWN0aW9uLT5oZF9jcG9ydF9pZDsKKwl1MTYgY3BvcnRfaWQgPSAwOworCXU4IGludGZfaWQgPSAwOworCisJaWYgKGNvbm5lY3Rpb24tPmludGYpIHsKKwkJaW50Zl9pZCA9IGNvbm5lY3Rpb24tPmludGYtPmludGVyZmFjZV9pZDsKKwkJY3BvcnRfaWQgPSBjb25uZWN0aW9uLT5pbnRmX2Nwb3J0X2lkOworCX0KKworCXNucHJpbnRmKGNvbm5lY3Rpb24tPm5hbWUsIHNpemVvZihjb25uZWN0aW9uLT5uYW1lKSwKKwkJCSIldS8ldToldSIsIGhkX2Nwb3J0X2lkLCBpbnRmX2lkLCBjcG9ydF9pZCk7Cit9CisKKy8qCisgKiBfZ2JfY29ubmVjdGlvbl9jcmVhdGUoKSAtIGNyZWF0ZSBhIEdyZXlidXMgY29ubmVjdGlvbgorICogQGhkOgkJCWhvc3QgZGV2aWNlIG9mIHRoZSBjb25uZWN0aW9uCisgKiBAaGRfY3BvcnRfaWQ6CWhvc3QtZGV2aWNlIGNwb3J0IGlkLCBvciAtMSBmb3IgZHluYW1pYyBhbGxvY2F0aW9uCisgKiBAaW50ZjoJCXJlbW90ZSBpbnRlcmZhY2UsIG9yIE5VTEwgZm9yIHN0YXRpYyBjb25uZWN0aW9ucworICogQGJ1bmRsZToJCXJlbW90ZS1pbnRlcmZhY2UgYnVuZGxlIChtYXkgYmUgTlVMTCkKKyAqIEBjcG9ydF9pZDoJCXJlbW90ZS1pbnRlcmZhY2UgY3BvcnQgaWQsIG9yIDAgZm9yIHN0YXRpYyBjb25uZWN0aW9ucworICogQGhhbmRsZXI6CQlyZXF1ZXN0IGhhbmRsZXIgKG1heSBiZSBOVUxMKQorICogQGZsYWdzOgkJY29ubmVjdGlvbiBmbGFncworICoKKyAqIENyZWF0ZSBhIEdyZXlidXMgY29ubmVjdGlvbiwgcmVwcmVzZW50aW5nIHRoZSBiaWRpcmVjdGlvbmFsIGxpbmsKKyAqIGJldHdlZW4gYSBDUG9ydCBvbiBhIChsb2NhbCkgR3JleWJ1cyBob3N0IGRldmljZSBhbmQgYSBDUG9ydCBvbgorICogYW5vdGhlciBHcmV5YnVzIGludGVyZmFjZS4KKyAqCisgKiBBIGNvbm5lY3Rpb24gYWxzbyBtYWludGFpbnMgdGhlIHN0YXRlIG9mIG9wZXJhdGlvbnMgc2VudCBvdmVyIHRoZQorICogY29ubmVjdGlvbi4KKyAqCisgKiBTZXJpYWxpc2VkIGFnYWluc3QgY29uY3VycmVudCBjcmVhdGUgYW5kIGRlc3Ryb3kgdXNpbmcgdGhlCisgKiBnYl9jb25uZWN0aW9uX211dGV4LgorICoKKyAqIFJldHVybjogQSBwb2ludGVyIHRvIHRoZSBuZXcgY29ubmVjdGlvbiBpZiBzdWNjZXNzZnVsLCBvciBhbiBFUlJfUFRSCisgKiBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqCitfZ2JfY29ubmVjdGlvbl9jcmVhdGUoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgaW50IGhkX2Nwb3J0X2lkLAorCQkJCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYsCisJCQkJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlLCBpbnQgY3BvcnRfaWQsCisJCQkJZ2JfcmVxdWVzdF9oYW5kbGVyX3QgaGFuZGxlciwKKwkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZnYl9jb25uZWN0aW9uX211dGV4KTsKKworCWlmIChpbnRmICYmIGdiX2Nvbm5lY3Rpb25fY3BvcnRfaW5fdXNlKGludGYsIGNwb3J0X2lkKSkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJjcG9ydCAldSBhbHJlYWR5IGluIHVzZVxuIiwgY3BvcnRfaWQpOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJyX3VubG9jazsKKwl9CisKKwlyZXQgPSBnYl9oZF9jcG9ydF9hbGxvY2F0ZShoZCwgaGRfY3BvcnRfaWQsIGZsYWdzKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZoZC0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGNwb3J0OiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfdW5sb2NrOworCX0KKwloZF9jcG9ydF9pZCA9IHJldDsKKworCWNvbm5lY3Rpb24gPSBremFsbG9jKHNpemVvZigqY29ubmVjdGlvbiksIEdGUF9LRVJORUwpOworCWlmICghY29ubmVjdGlvbikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9oZF9jcG9ydF9yZWxlYXNlOworCX0KKworCWNvbm5lY3Rpb24tPmhkX2Nwb3J0X2lkID0gaGRfY3BvcnRfaWQ7CisJY29ubmVjdGlvbi0+aW50Zl9jcG9ydF9pZCA9IGNwb3J0X2lkOworCWNvbm5lY3Rpb24tPmhkID0gaGQ7CisJY29ubmVjdGlvbi0+aW50ZiA9IGludGY7CisJY29ubmVjdGlvbi0+YnVuZGxlID0gYnVuZGxlOworCWNvbm5lY3Rpb24tPmhhbmRsZXIgPSBoYW5kbGVyOworCWNvbm5lY3Rpb24tPmZsYWdzID0gZmxhZ3M7CisJaWYgKGludGYgJiYgKGludGYtPnF1aXJrcyAmIEdCX0lOVEVSRkFDRV9RVUlSS19OT19DUE9SVF9GRUFUVVJFUykpCisJCWNvbm5lY3Rpb24tPmZsYWdzIHw9IEdCX0NPTk5FQ1RJT05fRkxBR19OT19GTE9XQ1RSTDsKKwljb25uZWN0aW9uLT5zdGF0ZSA9IEdCX0NPTk5FQ1RJT05fU1RBVEVfRElTQUJMRUQ7CisKKwlhdG9taWNfc2V0KCZjb25uZWN0aW9uLT5vcF9jeWNsZSwgMCk7CisJbXV0ZXhfaW5pdCgmY29ubmVjdGlvbi0+bXV0ZXgpOworCXNwaW5fbG9ja19pbml0KCZjb25uZWN0aW9uLT5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmY29ubmVjdGlvbi0+b3BlcmF0aW9ucyk7CisKKwljb25uZWN0aW9uLT53cSA9IGFsbG9jX3dvcmtxdWV1ZSgiJXM6JWQiLCBXUV9VTkJPVU5ELCAxLAorCQkJCQkgZGV2X25hbWUoJmhkLT5kZXYpLCBoZF9jcG9ydF9pZCk7CisJaWYgKCFjb25uZWN0aW9uLT53cSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlX2Nvbm5lY3Rpb247CisJfQorCisJa3JlZl9pbml0KCZjb25uZWN0aW9uLT5rcmVmKTsKKworCWdiX2Nvbm5lY3Rpb25faW5pdF9uYW1lKGNvbm5lY3Rpb24pOworCisJc3Bpbl9sb2NrX2lycSgmZ2JfY29ubmVjdGlvbnNfbG9jayk7CisJbGlzdF9hZGQoJmNvbm5lY3Rpb24tPmhkX2xpbmtzLCAmaGQtPmNvbm5lY3Rpb25zKTsKKworCWlmIChidW5kbGUpCisJCWxpc3RfYWRkKCZjb25uZWN0aW9uLT5idW5kbGVfbGlua3MsICZidW5kbGUtPmNvbm5lY3Rpb25zKTsKKwllbHNlCisJCUlOSVRfTElTVF9IRUFEKCZjb25uZWN0aW9uLT5idW5kbGVfbGlua3MpOworCisJc3Bpbl91bmxvY2tfaXJxKCZnYl9jb25uZWN0aW9uc19sb2NrKTsKKworCW11dGV4X3VubG9jaygmZ2JfY29ubmVjdGlvbl9tdXRleCk7CisKKwl0cmFjZV9nYl9jb25uZWN0aW9uX2NyZWF0ZShjb25uZWN0aW9uKTsKKworCXJldHVybiBjb25uZWN0aW9uOworCitlcnJfZnJlZV9jb25uZWN0aW9uOgorCWtmcmVlKGNvbm5lY3Rpb24pOworZXJyX2hkX2Nwb3J0X3JlbGVhc2U6CisJZ2JfaGRfY3BvcnRfcmVsZWFzZShoZCwgaGRfY3BvcnRfaWQpOworZXJyX3VubG9jazoKKwltdXRleF91bmxvY2soJmdiX2Nvbm5lY3Rpb25fbXV0ZXgpOworCisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KKworc3RydWN0IGdiX2Nvbm5lY3Rpb24gKgorZ2JfY29ubmVjdGlvbl9jcmVhdGVfc3RhdGljKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHUxNiBoZF9jcG9ydF9pZCwKKwkJCQkJZ2JfcmVxdWVzdF9oYW5kbGVyX3QgaGFuZGxlcikKK3sKKwlyZXR1cm4gX2diX2Nvbm5lY3Rpb25fY3JlYXRlKGhkLCBoZF9jcG9ydF9pZCwgTlVMTCwgTlVMTCwgMCwgaGFuZGxlciwKKwkJCQkJR0JfQ09OTkVDVElPTl9GTEFHX0hJR0hfUFJJTyk7Cit9CisKK3N0cnVjdCBnYl9jb25uZWN0aW9uICoKK2diX2Nvbm5lY3Rpb25fY3JlYXRlX2NvbnRyb2woc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlyZXR1cm4gX2diX2Nvbm5lY3Rpb25fY3JlYXRlKGludGYtPmhkLCAtMSwgaW50ZiwgTlVMTCwgMCwgTlVMTCwKKwkJCQkJR0JfQ09OTkVDVElPTl9GTEFHX0NPTlRST0wgfAorCQkJCQlHQl9DT05ORUNUSU9OX0ZMQUdfSElHSF9QUklPKTsKK30KKworc3RydWN0IGdiX2Nvbm5lY3Rpb24gKgorZ2JfY29ubmVjdGlvbl9jcmVhdGUoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlLCB1MTYgY3BvcnRfaWQsCisJCQkJCWdiX3JlcXVlc3RfaGFuZGxlcl90IGhhbmRsZXIpCit7CisJc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZiA9IGJ1bmRsZS0+aW50ZjsKKworCXJldHVybiBfZ2JfY29ubmVjdGlvbl9jcmVhdGUoaW50Zi0+aGQsIC0xLCBpbnRmLCBidW5kbGUsIGNwb3J0X2lkLAorCQkJCQloYW5kbGVyLCAwKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2Nvbm5lY3Rpb25fY3JlYXRlKTsKKworc3RydWN0IGdiX2Nvbm5lY3Rpb24gKgorZ2JfY29ubmVjdGlvbl9jcmVhdGVfZmxhZ3Moc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlLCB1MTYgY3BvcnRfaWQsCisJCQkJCWdiX3JlcXVlc3RfaGFuZGxlcl90IGhhbmRsZXIsCisJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZiA9IGJ1bmRsZS0+aW50ZjsKKworCWlmIChXQVJOX09OX09OQ0UoZmxhZ3MgJiBHQl9DT05ORUNUSU9OX0ZMQUdfQ09SRV9NQVNLKSkKKwkJZmxhZ3MgJj0gfkdCX0NPTk5FQ1RJT05fRkxBR19DT1JFX01BU0s7CisKKwlyZXR1cm4gX2diX2Nvbm5lY3Rpb25fY3JlYXRlKGludGYtPmhkLCAtMSwgaW50ZiwgYnVuZGxlLCBjcG9ydF9pZCwKKwkJCQkJaGFuZGxlciwgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfY29ubmVjdGlvbl9jcmVhdGVfZmxhZ3MpOworCitzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqCitnYl9jb25uZWN0aW9uX2NyZWF0ZV9vZmZsb2FkZWQoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlLCB1MTYgY3BvcnRfaWQsCisJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJZmxhZ3MgfD0gR0JfQ09OTkVDVElPTl9GTEFHX09GRkxPQURFRDsKKworCXJldHVybiBnYl9jb25uZWN0aW9uX2NyZWF0ZV9mbGFncyhidW5kbGUsIGNwb3J0X2lkLCBOVUxMLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9jb25uZWN0aW9uX2NyZWF0ZV9vZmZsb2FkZWQpOworCitzdGF0aWMgaW50IGdiX2Nvbm5lY3Rpb25faGRfY3BvcnRfZW5hYmxlKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQgPSBjb25uZWN0aW9uLT5oZDsKKwlpbnQgcmV0OworCisJaWYgKCFoZC0+ZHJpdmVyLT5jcG9ydF9lbmFibGUpCisJCXJldHVybiAwOworCisJcmV0ID0gaGQtPmRyaXZlci0+Y3BvcnRfZW5hYmxlKGhkLCBjb25uZWN0aW9uLT5oZF9jcG9ydF9pZCwKKwkJCQkJY29ubmVjdGlvbi0+ZmxhZ3MpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGQtPmRldiwgIiVzOiBmYWlsZWQgdG8gZW5hYmxlIGhvc3QgY3BvcnQ6ICVkXG4iLAorCQkJCWNvbm5lY3Rpb24tPm5hbWUsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2Nvbm5lY3Rpb25faGRfY3BvcnRfZGlzYWJsZShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkID0gY29ubmVjdGlvbi0+aGQ7CisJaW50IHJldDsKKworCWlmICghaGQtPmRyaXZlci0+Y3BvcnRfZGlzYWJsZSkKKwkJcmV0dXJuOworCisJcmV0ID0gaGQtPmRyaXZlci0+Y3BvcnRfZGlzYWJsZShoZCwgY29ubmVjdGlvbi0+aGRfY3BvcnRfaWQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGQtPmRldiwgIiVzOiBmYWlsZWQgdG8gZGlzYWJsZSBob3N0IGNwb3J0OiAlZFxuIiwKKwkJCQljb25uZWN0aW9uLT5uYW1lLCByZXQpOworCX0KK30KKworc3RhdGljIGludCBnYl9jb25uZWN0aW9uX2hkX2Nwb3J0X2Nvbm5lY3RlZChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkID0gY29ubmVjdGlvbi0+aGQ7CisJaW50IHJldDsKKworCWlmICghaGQtPmRyaXZlci0+Y3BvcnRfY29ubmVjdGVkKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGhkLT5kcml2ZXItPmNwb3J0X2Nvbm5lY3RlZChoZCwgY29ubmVjdGlvbi0+aGRfY3BvcnRfaWQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGQtPmRldiwgIiVzOiBmYWlsZWQgdG8gc2V0IGNvbm5lY3RlZCBzdGF0ZTogJWRcbiIsCisJCQkJY29ubmVjdGlvbi0+bmFtZSwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9jb25uZWN0aW9uX2hkX2Nwb3J0X2ZsdXNoKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQgPSBjb25uZWN0aW9uLT5oZDsKKwlpbnQgcmV0OworCisJaWYgKCFoZC0+ZHJpdmVyLT5jcG9ydF9mbHVzaCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBoZC0+ZHJpdmVyLT5jcG9ydF9mbHVzaChoZCwgY29ubmVjdGlvbi0+aGRfY3BvcnRfaWQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaGQtPmRldiwgIiVzOiBmYWlsZWQgdG8gZmx1c2ggaG9zdCBjcG9ydDogJWRcbiIsCisJCQkJY29ubmVjdGlvbi0+bmFtZSwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9jb25uZWN0aW9uX2hkX2Nwb3J0X3F1aWVzY2Uoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCA9IGNvbm5lY3Rpb24tPmhkOworCXNpemVfdCBwZWVyX3NwYWNlOworCWludCByZXQ7CisKKwlwZWVyX3NwYWNlID0gc2l6ZW9mKHN0cnVjdCBnYl9vcGVyYXRpb25fbXNnX2hkcikgKworCQkJc2l6ZW9mKHN0cnVjdCBnYl9jcG9ydF9zaHV0ZG93bl9yZXF1ZXN0KTsKKworCWlmIChjb25uZWN0aW9uLT5tb2RlX3N3aXRjaCkKKwkJcGVlcl9zcGFjZSArPSBzaXplb2Yoc3RydWN0IGdiX29wZXJhdGlvbl9tc2dfaGRyKTsKKworCXJldCA9IGhkLT5kcml2ZXItPmNwb3J0X3F1aWVzY2UoaGQsIGNvbm5lY3Rpb24tPmhkX2Nwb3J0X2lkLAorCQkJCQlwZWVyX3NwYWNlLAorCQkJCQlHQl9DT05ORUNUSU9OX0NQT1JUX1FVSUVTQ0VfVElNRU9VVCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZoZC0+ZGV2LCAiJXM6IGZhaWxlZCB0byBxdWllc2NlIGhvc3QgY3BvcnQ6ICVkXG4iLAorCQkJCWNvbm5lY3Rpb24tPm5hbWUsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JfY29ubmVjdGlvbl9oZF9jcG9ydF9jbGVhcihzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkID0gY29ubmVjdGlvbi0+aGQ7CisJaW50IHJldDsKKworCXJldCA9IGhkLT5kcml2ZXItPmNwb3J0X2NsZWFyKGhkLCBjb25uZWN0aW9uLT5oZF9jcG9ydF9pZCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZoZC0+ZGV2LCAiJXM6IGZhaWxlZCB0byBjbGVhciBob3N0IGNwb3J0OiAlZFxuIiwKKwkJCQljb25uZWN0aW9uLT5uYW1lLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogUmVxdWVzdCB0aGUgU1ZDIHRvIGNyZWF0ZSBhIGNvbm5lY3Rpb24gZnJvbSBBUCdzIGNwb3J0IHRvIGludGVyZmFjZSdzCisgKiBjcG9ydC4KKyAqLworc3RhdGljIGludAorZ2JfY29ubmVjdGlvbl9zdmNfY29ubmVjdGlvbl9jcmVhdGUoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCA9IGNvbm5lY3Rpb24tPmhkOworCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGY7CisJdTggY3BvcnRfZmxhZ3M7CisJaW50IHJldDsKKworCWlmIChnYl9jb25uZWN0aW9uX2lzX3N0YXRpYyhjb25uZWN0aW9uKSkKKwkJcmV0dXJuIDA7CisKKwlpbnRmID0gY29ubmVjdGlvbi0+aW50ZjsKKworCS8qCisJICogRW5hYmxlIGVpdGhlciBFMkVGQyBvciBDU0QsIHVubGVzcyBubyBmbG93IGNvbnRyb2wgaXMgcmVxdWVzdGVkLgorCSAqLworCWNwb3J0X2ZsYWdzID0gR0JfU1ZDX0NQT1JUX0ZMQUdfQ1NWX047CisJaWYgKGdiX2Nvbm5lY3Rpb25fZmxvd19jb250cm9sX2Rpc2FibGVkKGNvbm5lY3Rpb24pKSB7CisJCWNwb3J0X2ZsYWdzIHw9IEdCX1NWQ19DUE9SVF9GTEFHX0NTRF9OOworCX0gZWxzZSBpZiAoZ2JfY29ubmVjdGlvbl9lMmVmY19lbmFibGVkKGNvbm5lY3Rpb24pKSB7CisJCWNwb3J0X2ZsYWdzIHw9IEdCX1NWQ19DUE9SVF9GTEFHX0NTRF9OIHwKKwkJCQlHQl9TVkNfQ1BPUlRfRkxBR19FMkVGQzsKKwl9CisKKwlyZXQgPSBnYl9zdmNfY29ubmVjdGlvbl9jcmVhdGUoaGQtPnN2YywKKwkJCWhkLT5zdmMtPmFwX2ludGZfaWQsCisJCQljb25uZWN0aW9uLT5oZF9jcG9ydF9pZCwKKwkJCWludGYtPmludGVyZmFjZV9pZCwKKwkJCWNvbm5lY3Rpb24tPmludGZfY3BvcnRfaWQsCisJCQljcG9ydF9mbGFncyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjb25uZWN0aW9uLT5oZC0+ZGV2LAorCQkJIiVzOiBmYWlsZWQgdG8gY3JlYXRlIHN2YyBjb25uZWN0aW9uOiAlZFxuIiwKKwkJCWNvbm5lY3Rpb24tPm5hbWUsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitnYl9jb25uZWN0aW9uX3N2Y19jb25uZWN0aW9uX2Rlc3Ryb3koc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJaWYgKGdiX2Nvbm5lY3Rpb25faXNfc3RhdGljKGNvbm5lY3Rpb24pKQorCQlyZXR1cm47CisKKwlnYl9zdmNfY29ubmVjdGlvbl9kZXN0cm95KGNvbm5lY3Rpb24tPmhkLT5zdmMsCisJCQkJICBjb25uZWN0aW9uLT5oZC0+c3ZjLT5hcF9pbnRmX2lkLAorCQkJCSAgY29ubmVjdGlvbi0+aGRfY3BvcnRfaWQsCisJCQkJICBjb25uZWN0aW9uLT5pbnRmLT5pbnRlcmZhY2VfaWQsCisJCQkJICBjb25uZWN0aW9uLT5pbnRmX2Nwb3J0X2lkKTsKK30KKworLyogSW5mb3JtIEludGVyZmFjZSBhYm91dCBhY3RpdmUgQ1BvcnRzICovCitzdGF0aWMgaW50IGdiX2Nvbm5lY3Rpb25fY29udHJvbF9jb25uZWN0ZWQoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2w7CisJdTE2IGNwb3J0X2lkID0gY29ubmVjdGlvbi0+aW50Zl9jcG9ydF9pZDsKKwlpbnQgcmV0OworCisJaWYgKGdiX2Nvbm5lY3Rpb25faXNfc3RhdGljKGNvbm5lY3Rpb24pKQorCQlyZXR1cm4gMDsKKworCWlmIChnYl9jb25uZWN0aW9uX2lzX2NvbnRyb2woY29ubmVjdGlvbikpCisJCXJldHVybiAwOworCisJY29udHJvbCA9IGNvbm5lY3Rpb24tPmludGYtPmNvbnRyb2w7CisKKwlyZXQgPSBnYl9jb250cm9sX2Nvbm5lY3RlZF9vcGVyYXRpb24oY29udHJvbCwgY3BvcnRfaWQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsCisJCQkiZmFpbGVkIHRvIGNvbm5lY3QgY3BvcnQ6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorZ2JfY29ubmVjdGlvbl9jb250cm9sX2Rpc2Nvbm5lY3Rpbmcoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2w7CisJdTE2IGNwb3J0X2lkID0gY29ubmVjdGlvbi0+aW50Zl9jcG9ydF9pZDsKKwlpbnQgcmV0OworCisJaWYgKGdiX2Nvbm5lY3Rpb25faXNfc3RhdGljKGNvbm5lY3Rpb24pKQorCQlyZXR1cm47CisKKwljb250cm9sID0gY29ubmVjdGlvbi0+aW50Zi0+Y29udHJvbDsKKworCXJldCA9IGdiX2NvbnRyb2xfZGlzY29ubmVjdGluZ19vcGVyYXRpb24oY29udHJvbCwgY3BvcnRfaWQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmY29ubmVjdGlvbi0+aGQtPmRldiwKKwkJCQkiJXM6IGZhaWxlZCB0byBzZW5kIGRpc2Nvbm5lY3Rpbmc6ICVkXG4iLAorCQkJCWNvbm5lY3Rpb24tPm5hbWUsIHJldCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorZ2JfY29ubmVjdGlvbl9jb250cm9sX2Rpc2Nvbm5lY3RlZChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbDsKKwl1MTYgY3BvcnRfaWQgPSBjb25uZWN0aW9uLT5pbnRmX2Nwb3J0X2lkOworCWludCByZXQ7CisKKwlpZiAoZ2JfY29ubmVjdGlvbl9pc19zdGF0aWMoY29ubmVjdGlvbikpCisJCXJldHVybjsKKworCWNvbnRyb2wgPSBjb25uZWN0aW9uLT5pbnRmLT5jb250cm9sOworCisJaWYgKGdiX2Nvbm5lY3Rpb25faXNfY29udHJvbChjb25uZWN0aW9uKSkgeworCQlpZiAoY29ubmVjdGlvbi0+bW9kZV9zd2l0Y2gpIHsKKwkJCXJldCA9IGdiX2NvbnRyb2xfbW9kZV9zd2l0Y2hfb3BlcmF0aW9uKGNvbnRyb2wpOworCQkJaWYgKHJldCkgeworCQkJCS8qCisJCQkJICogQWxsb3cgbW9kZSBzd2l0Y2ggdG8gdGltZSBvdXQgd2FpdGluZyBmb3IKKwkJCQkgKiBtYWlsYm94IGV2ZW50LgorCQkJCSAqLworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJCXJldHVybjsKKwl9CisKKwlyZXQgPSBnYl9jb250cm9sX2Rpc2Nvbm5lY3RlZF9vcGVyYXRpb24oY29udHJvbCwgY3BvcnRfaWQpOworCWlmIChyZXQpIHsKKwkJZGV2X3dhcm4oJmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2LAorCQkJICJmYWlsZWQgdG8gZGlzY29ubmVjdCBjcG9ydDogJWRcbiIsIHJldCk7CisJfQorfQorCitzdGF0aWMgaW50IGdiX2Nvbm5lY3Rpb25fc2h1dGRvd25fb3BlcmF0aW9uKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCQkJdTggcGhhc2UpCit7CisJc3RydWN0IGdiX2Nwb3J0X3NodXRkb3duX3JlcXVlc3QgKnJlcTsKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb247CisJaW50IHJldDsKKworCW9wZXJhdGlvbiA9IGdiX29wZXJhdGlvbl9jcmVhdGVfY29yZShjb25uZWN0aW9uLAorCQkJCQkJR0JfUkVRVUVTVF9UWVBFX0NQT1JUX1NIVVRET1dOLAorCQkJCQkJc2l6ZW9mKCpyZXEpLCAwLCAwLAorCQkJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFvcGVyYXRpb24pCisJCXJldHVybiAtRU5PTUVNOworCisJcmVxID0gb3BlcmF0aW9uLT5yZXF1ZXN0LT5wYXlsb2FkOworCXJlcS0+cGhhc2UgPSBwaGFzZTsKKworCXJldCA9IGdiX29wZXJhdGlvbl9yZXF1ZXN0X3NlbmRfc3luYyhvcGVyYXRpb24pOworCisJZ2Jfb3BlcmF0aW9uX3B1dChvcGVyYXRpb24pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9jb25uZWN0aW9uX2Nwb3J0X3NodXRkb3duKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCQl1OCBwaGFzZSkKK3sKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkID0gY29ubmVjdGlvbi0+aGQ7CisJY29uc3Qgc3RydWN0IGdiX2hkX2RyaXZlciAqZHJ2ID0gaGQtPmRyaXZlcjsKKwlpbnQgcmV0OworCisJaWYgKGdiX2Nvbm5lY3Rpb25faXNfc3RhdGljKGNvbm5lY3Rpb24pKQorCQlyZXR1cm4gMDsKKworCWlmIChnYl9jb25uZWN0aW9uX2lzX29mZmxvYWRlZChjb25uZWN0aW9uKSkgeworCQlpZiAoIWRydi0+Y3BvcnRfc2h1dGRvd24pCisJCQlyZXR1cm4gMDsKKworCQlyZXQgPSBkcnYtPmNwb3J0X3NodXRkb3duKGhkLCBjb25uZWN0aW9uLT5oZF9jcG9ydF9pZCwgcGhhc2UsCisJCQkJCQlHQl9PUEVSQVRJT05fVElNRU9VVF9ERUZBVUxUKTsKKwl9IGVsc2UgeworCQlyZXQgPSBnYl9jb25uZWN0aW9uX3NodXRkb3duX29wZXJhdGlvbihjb25uZWN0aW9uLCBwaGFzZSk7CisJfQorCisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZoZC0+ZGV2LCAiJXM6IGZhaWxlZCB0byBzZW5kIGNwb3J0IHNodXRkb3duIChwaGFzZSAlZCk6ICVkXG4iLAorCQkJCWNvbm5lY3Rpb24tPm5hbWUsIHBoYXNlLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitnYl9jb25uZWN0aW9uX2Nwb3J0X3NodXRkb3duX3BoYXNlXzEoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJcmV0dXJuIGdiX2Nvbm5lY3Rpb25fY3BvcnRfc2h1dGRvd24oY29ubmVjdGlvbiwgMSk7Cit9CisKK3N0YXRpYyBpbnQKK2diX2Nvbm5lY3Rpb25fY3BvcnRfc2h1dGRvd25fcGhhc2VfMihzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlyZXR1cm4gZ2JfY29ubmVjdGlvbl9jcG9ydF9zaHV0ZG93bihjb25uZWN0aW9uLCAyKTsKK30KKworLyoKKyAqIENhbmNlbCBhbGwgYWN0aXZlIG9wZXJhdGlvbnMgb24gYSBjb25uZWN0aW9uLgorICoKKyAqIExvY2tpbmc6IENhbGxlZCB3aXRoIGNvbm5lY3Rpb24gbG9jayBoZWxkIGFuZCBzdGF0ZSBzZXQgdG8gRElTQUJMRUQgb3IKKyAqIERJU0NPTk5FQ1RJTkcuCisgKi8KK3N0YXRpYyB2b2lkIGdiX2Nvbm5lY3Rpb25fY2FuY2VsX29wZXJhdGlvbnMoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCQlpbnQgZXJybm8pCisJX19tdXN0X2hvbGQoJmNvbm5lY3Rpb24tPmxvY2spCit7CisJc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZjb25uZWN0aW9uLT5vcGVyYXRpb25zKSkgeworCQlvcGVyYXRpb24gPSBsaXN0X2xhc3RfZW50cnkoJmNvbm5lY3Rpb24tPm9wZXJhdGlvbnMsCisJCQkJCQlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uLCBsaW5rcyk7CisJCWdiX29wZXJhdGlvbl9nZXQob3BlcmF0aW9uKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjb25uZWN0aW9uLT5sb2NrKTsKKworCQlpZiAoZ2Jfb3BlcmF0aW9uX2lzX2luY29taW5nKG9wZXJhdGlvbikpCisJCQlnYl9vcGVyYXRpb25fY2FuY2VsX2luY29taW5nKG9wZXJhdGlvbiwgZXJybm8pOworCQllbHNlCisJCQlnYl9vcGVyYXRpb25fY2FuY2VsKG9wZXJhdGlvbiwgZXJybm8pOworCisJCWdiX29wZXJhdGlvbl9wdXQob3BlcmF0aW9uKTsKKworCQlzcGluX2xvY2tfaXJxKCZjb25uZWN0aW9uLT5sb2NrKTsKKwl9Cit9CisKKy8qCisgKiBDYW5jZWwgYWxsIGFjdGl2ZSBpbmNvbWluZyBvcGVyYXRpb25zIG9uIGEgY29ubmVjdGlvbi4KKyAqCisgKiBMb2NraW5nOiBDYWxsZWQgd2l0aCBjb25uZWN0aW9uIGxvY2sgaGVsZCBhbmQgc3RhdGUgc2V0IHRvIEVOQUJMRURfVFguCisgKi8KK3N0YXRpYyB2b2lkCitnYl9jb25uZWN0aW9uX2ZsdXNoX2luY29taW5nX29wZXJhdGlvbnMoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCQlpbnQgZXJybm8pCisJX19tdXN0X2hvbGQoJmNvbm5lY3Rpb24tPmxvY2spCit7CisJc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uOworCWJvb2wgaW5jb21pbmc7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmNvbm5lY3Rpb24tPm9wZXJhdGlvbnMpKSB7CisJCWluY29taW5nID0gZmFsc2U7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkob3BlcmF0aW9uLCAmY29ubmVjdGlvbi0+b3BlcmF0aW9ucywKKwkJCQkJCQkJbGlua3MpIHsKKwkJCWlmIChnYl9vcGVyYXRpb25faXNfaW5jb21pbmcob3BlcmF0aW9uKSkgeworCQkJCWdiX29wZXJhdGlvbl9nZXQob3BlcmF0aW9uKTsKKwkJCQlpbmNvbWluZyA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoIWluY29taW5nKQorCQkJYnJlYWs7CisKKwkJc3Bpbl91bmxvY2tfaXJxKCZjb25uZWN0aW9uLT5sb2NrKTsKKworCQkvKiBGSVhNRTogZmx1c2gsIG5vdCBjYW5jZWw/ICovCisJCWdiX29wZXJhdGlvbl9jYW5jZWxfaW5jb21pbmcob3BlcmF0aW9uLCBlcnJubyk7CisJCWdiX29wZXJhdGlvbl9wdXQob3BlcmF0aW9uKTsKKworCQlzcGluX2xvY2tfaXJxKCZjb25uZWN0aW9uLT5sb2NrKTsKKwl9Cit9CisKKy8qCisgKiBfZ2JfY29ubmVjdGlvbl9lbmFibGUoKSAtIGVuYWJsZSBhIGNvbm5lY3Rpb24KKyAqIEBjb25uZWN0aW9uOgkJY29ubmVjdGlvbiB0byBlbmFibGUKKyAqIEByeDoJCQl3aGV0aGVyIHRvIGVuYWJsZSBpbmNvbWluZyByZXF1ZXN0cworICoKKyAqIENvbm5lY3Rpb24tZW5hYmxlIGhlbHBlciBmb3IgRElTQUJMRUQtPkVOQUJMRUQsIERJU0FCTEVELT5FTkFCTEVEX1RYLCBhbmQKKyAqIEVOQUJMRURfVFgtPkVOQUJMRUQgc3RhdGUgdHJhbnNpdGlvbnMuCisgKgorICogTG9ja2luZzogQ2FsbGVyIGhvbGRzIGNvbm5lY3Rpb24tPm11dGV4LgorICovCitzdGF0aWMgaW50IF9nYl9jb25uZWN0aW9uX2VuYWJsZShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgYm9vbCByeCkKK3sKKwlpbnQgcmV0OworCisJLyogSGFuZGxlIEVOQUJMRURfVFggLT4gRU5BQkxFRCB0cmFuc2l0aW9ucy4gKi8KKwlpZiAoY29ubmVjdGlvbi0+c3RhdGUgPT0gR0JfQ09OTkVDVElPTl9TVEFURV9FTkFCTEVEX1RYKSB7CisJCWlmICghKGNvbm5lY3Rpb24tPmhhbmRsZXIgJiYgcngpKQorCQkJcmV0dXJuIDA7CisKKwkJc3Bpbl9sb2NrX2lycSgmY29ubmVjdGlvbi0+bG9jayk7CisJCWNvbm5lY3Rpb24tPnN0YXRlID0gR0JfQ09OTkVDVElPTl9TVEFURV9FTkFCTEVEOworCQlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPmxvY2spOworCisJCXJldHVybiAwOworCX0KKworCXJldCA9IGdiX2Nvbm5lY3Rpb25faGRfY3BvcnRfZW5hYmxlKGNvbm5lY3Rpb24pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBnYl9jb25uZWN0aW9uX3N2Y19jb25uZWN0aW9uX2NyZWF0ZShjb25uZWN0aW9uKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9oZF9jcG9ydF9jbGVhcjsKKworCXJldCA9IGdiX2Nvbm5lY3Rpb25faGRfY3BvcnRfY29ubmVjdGVkKGNvbm5lY3Rpb24pOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3N2Y19jb25uZWN0aW9uX2Rlc3Ryb3k7CisKKwlzcGluX2xvY2tfaXJxKCZjb25uZWN0aW9uLT5sb2NrKTsKKwlpZiAoY29ubmVjdGlvbi0+aGFuZGxlciAmJiByeCkKKwkJY29ubmVjdGlvbi0+c3RhdGUgPSBHQl9DT05ORUNUSU9OX1NUQVRFX0VOQUJMRUQ7CisJZWxzZQorCQljb25uZWN0aW9uLT5zdGF0ZSA9IEdCX0NPTk5FQ1RJT05fU1RBVEVfRU5BQkxFRF9UWDsKKwlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPmxvY2spOworCisJcmV0ID0gZ2JfY29ubmVjdGlvbl9jb250cm9sX2Nvbm5lY3RlZChjb25uZWN0aW9uKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9jb250cm9sX2Rpc2Nvbm5lY3Rpbmc7CisKKwlyZXR1cm4gMDsKKworZXJyX2NvbnRyb2xfZGlzY29ubmVjdGluZzoKKwlzcGluX2xvY2tfaXJxKCZjb25uZWN0aW9uLT5sb2NrKTsKKwljb25uZWN0aW9uLT5zdGF0ZSA9IEdCX0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVElORzsKKwlnYl9jb25uZWN0aW9uX2NhbmNlbF9vcGVyYXRpb25zKGNvbm5lY3Rpb24sIC1FU0hVVERPV04pOworCXNwaW5fdW5sb2NrX2lycSgmY29ubmVjdGlvbi0+bG9jayk7CisKKwkvKiBUcmFuc21pdCBxdWV1ZSBzaG91bGQgYWxyZWFkeSBiZSBlbXB0eS4gKi8KKwlnYl9jb25uZWN0aW9uX2hkX2Nwb3J0X2ZsdXNoKGNvbm5lY3Rpb24pOworCisJZ2JfY29ubmVjdGlvbl9jb250cm9sX2Rpc2Nvbm5lY3RpbmcoY29ubmVjdGlvbik7CisJZ2JfY29ubmVjdGlvbl9jcG9ydF9zaHV0ZG93bl9waGFzZV8xKGNvbm5lY3Rpb24pOworCWdiX2Nvbm5lY3Rpb25faGRfY3BvcnRfcXVpZXNjZShjb25uZWN0aW9uKTsKKwlnYl9jb25uZWN0aW9uX2Nwb3J0X3NodXRkb3duX3BoYXNlXzIoY29ubmVjdGlvbik7CisJZ2JfY29ubmVjdGlvbl9jb250cm9sX2Rpc2Nvbm5lY3RlZChjb25uZWN0aW9uKTsKKwljb25uZWN0aW9uLT5zdGF0ZSA9IEdCX0NPTk5FQ1RJT05fU1RBVEVfRElTQUJMRUQ7CitlcnJfc3ZjX2Nvbm5lY3Rpb25fZGVzdHJveToKKwlnYl9jb25uZWN0aW9uX3N2Y19jb25uZWN0aW9uX2Rlc3Ryb3koY29ubmVjdGlvbik7CitlcnJfaGRfY3BvcnRfY2xlYXI6CisJZ2JfY29ubmVjdGlvbl9oZF9jcG9ydF9jbGVhcihjb25uZWN0aW9uKTsKKworCWdiX2Nvbm5lY3Rpb25faGRfY3BvcnRfZGlzYWJsZShjb25uZWN0aW9uKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBnYl9jb25uZWN0aW9uX2VuYWJsZShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJmNvbm5lY3Rpb24tPm11dGV4KTsKKworCWlmIChjb25uZWN0aW9uLT5zdGF0ZSA9PSBHQl9DT05ORUNUSU9OX1NUQVRFX0VOQUJMRUQpCisJCWdvdG8gb3V0X3VubG9jazsKKworCXJldCA9IF9nYl9jb25uZWN0aW9uX2VuYWJsZShjb25uZWN0aW9uLCB0cnVlKTsKKwlpZiAoIXJldCkKKwkJdHJhY2VfZ2JfY29ubmVjdGlvbl9lbmFibGUoY29ubmVjdGlvbik7CisKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZjb25uZWN0aW9uLT5tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfY29ubmVjdGlvbl9lbmFibGUpOworCitpbnQgZ2JfY29ubmVjdGlvbl9lbmFibGVfdHgoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZjb25uZWN0aW9uLT5tdXRleCk7CisKKwlpZiAoY29ubmVjdGlvbi0+c3RhdGUgPT0gR0JfQ09OTkVDVElPTl9TVEFURV9FTkFCTEVEKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlpZiAoY29ubmVjdGlvbi0+c3RhdGUgPT0gR0JfQ09OTkVDVElPTl9TVEFURV9FTkFCTEVEX1RYKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlyZXQgPSBfZ2JfY29ubmVjdGlvbl9lbmFibGUoY29ubmVjdGlvbiwgZmFsc2UpOworCWlmICghcmV0KQorCQl0cmFjZV9nYl9jb25uZWN0aW9uX2VuYWJsZShjb25uZWN0aW9uKTsKKworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJmNvbm5lY3Rpb24tPm11dGV4KTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9jb25uZWN0aW9uX2VuYWJsZV90eCk7CisKK3ZvaWQgZ2JfY29ubmVjdGlvbl9kaXNhYmxlX3J4KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCW11dGV4X2xvY2soJmNvbm5lY3Rpb24tPm11dGV4KTsKKworCXNwaW5fbG9ja19pcnEoJmNvbm5lY3Rpb24tPmxvY2spOworCWlmIChjb25uZWN0aW9uLT5zdGF0ZSAhPSBHQl9DT05ORUNUSU9OX1NUQVRFX0VOQUJMRUQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjb25uZWN0aW9uLT5sb2NrKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwljb25uZWN0aW9uLT5zdGF0ZSA9IEdCX0NPTk5FQ1RJT05fU1RBVEVfRU5BQkxFRF9UWDsKKwlnYl9jb25uZWN0aW9uX2ZsdXNoX2luY29taW5nX29wZXJhdGlvbnMoY29ubmVjdGlvbiwgLUVTSFVURE9XTik7CisJc3Bpbl91bmxvY2tfaXJxKCZjb25uZWN0aW9uLT5sb2NrKTsKKworCXRyYWNlX2diX2Nvbm5lY3Rpb25fZGlzYWJsZShjb25uZWN0aW9uKTsKKworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJmNvbm5lY3Rpb24tPm11dGV4KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2Nvbm5lY3Rpb25fZGlzYWJsZV9yeCk7CisKK3ZvaWQgZ2JfY29ubmVjdGlvbl9tb2RlX3N3aXRjaF9wcmVwYXJlKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCWNvbm5lY3Rpb24tPm1vZGVfc3dpdGNoID0gdHJ1ZTsKK30KKwordm9pZCBnYl9jb25uZWN0aW9uX21vZGVfc3dpdGNoX2NvbXBsZXRlKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCWdiX2Nvbm5lY3Rpb25fc3ZjX2Nvbm5lY3Rpb25fZGVzdHJveShjb25uZWN0aW9uKTsKKwlnYl9jb25uZWN0aW9uX2hkX2Nwb3J0X2NsZWFyKGNvbm5lY3Rpb24pOworCisJZ2JfY29ubmVjdGlvbl9oZF9jcG9ydF9kaXNhYmxlKGNvbm5lY3Rpb24pOworCisJY29ubmVjdGlvbi0+bW9kZV9zd2l0Y2ggPSBmYWxzZTsKK30KKwordm9pZCBnYl9jb25uZWN0aW9uX2Rpc2FibGUoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJbXV0ZXhfbG9jaygmY29ubmVjdGlvbi0+bXV0ZXgpOworCisJaWYgKGNvbm5lY3Rpb24tPnN0YXRlID09IEdCX0NPTk5FQ1RJT05fU1RBVEVfRElTQUJMRUQpCisJCWdvdG8gb3V0X3VubG9jazsKKworCXRyYWNlX2diX2Nvbm5lY3Rpb25fZGlzYWJsZShjb25uZWN0aW9uKTsKKworCXNwaW5fbG9ja19pcnEoJmNvbm5lY3Rpb24tPmxvY2spOworCWNvbm5lY3Rpb24tPnN0YXRlID0gR0JfQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNUSU5HOworCWdiX2Nvbm5lY3Rpb25fY2FuY2VsX29wZXJhdGlvbnMoY29ubmVjdGlvbiwgLUVTSFVURE9XTik7CisJc3Bpbl91bmxvY2tfaXJxKCZjb25uZWN0aW9uLT5sb2NrKTsKKworCWdiX2Nvbm5lY3Rpb25faGRfY3BvcnRfZmx1c2goY29ubmVjdGlvbik7CisKKwlnYl9jb25uZWN0aW9uX2NvbnRyb2xfZGlzY29ubmVjdGluZyhjb25uZWN0aW9uKTsKKwlnYl9jb25uZWN0aW9uX2Nwb3J0X3NodXRkb3duX3BoYXNlXzEoY29ubmVjdGlvbik7CisJZ2JfY29ubmVjdGlvbl9oZF9jcG9ydF9xdWllc2NlKGNvbm5lY3Rpb24pOworCWdiX2Nvbm5lY3Rpb25fY3BvcnRfc2h1dGRvd25fcGhhc2VfMihjb25uZWN0aW9uKTsKKwlnYl9jb25uZWN0aW9uX2NvbnRyb2xfZGlzY29ubmVjdGVkKGNvbm5lY3Rpb24pOworCisJY29ubmVjdGlvbi0+c3RhdGUgPSBHQl9DT05ORUNUSU9OX1NUQVRFX0RJU0FCTEVEOworCisJLyogY29udHJvbC1jb25uZWN0aW9uIHRlYXIgZG93biBpcyBkZWZlcnJlZCB3aGVuIG1vZGUgc3dpdGNoaW5nICovCisJaWYgKCFjb25uZWN0aW9uLT5tb2RlX3N3aXRjaCkgeworCQlnYl9jb25uZWN0aW9uX3N2Y19jb25uZWN0aW9uX2Rlc3Ryb3koY29ubmVjdGlvbik7CisJCWdiX2Nvbm5lY3Rpb25faGRfY3BvcnRfY2xlYXIoY29ubmVjdGlvbik7CisKKwkJZ2JfY29ubmVjdGlvbl9oZF9jcG9ydF9kaXNhYmxlKGNvbm5lY3Rpb24pOworCX0KKworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJmNvbm5lY3Rpb24tPm11dGV4KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2Nvbm5lY3Rpb25fZGlzYWJsZSk7CisKKy8qIERpc2FibGUgYSBjb25uZWN0aW9uIHdpdGhvdXQgY29tbXVuaWNhdGluZyB3aXRoIHRoZSByZW1vdGUgZW5kLiAqLwordm9pZCBnYl9jb25uZWN0aW9uX2Rpc2FibGVfZm9yY2VkKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCW11dGV4X2xvY2soJmNvbm5lY3Rpb24tPm11dGV4KTsKKworCWlmIChjb25uZWN0aW9uLT5zdGF0ZSA9PSBHQl9DT05ORUNUSU9OX1NUQVRFX0RJU0FCTEVEKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwl0cmFjZV9nYl9jb25uZWN0aW9uX2Rpc2FibGUoY29ubmVjdGlvbik7CisKKwlzcGluX2xvY2tfaXJxKCZjb25uZWN0aW9uLT5sb2NrKTsKKwljb25uZWN0aW9uLT5zdGF0ZSA9IEdCX0NPTk5FQ1RJT05fU1RBVEVfRElTQUJMRUQ7CisJZ2JfY29ubmVjdGlvbl9jYW5jZWxfb3BlcmF0aW9ucyhjb25uZWN0aW9uLCAtRVNIVVRET1dOKTsKKwlzcGluX3VubG9ja19pcnEoJmNvbm5lY3Rpb24tPmxvY2spOworCisJZ2JfY29ubmVjdGlvbl9oZF9jcG9ydF9mbHVzaChjb25uZWN0aW9uKTsKKworCWdiX2Nvbm5lY3Rpb25fc3ZjX2Nvbm5lY3Rpb25fZGVzdHJveShjb25uZWN0aW9uKTsKKwlnYl9jb25uZWN0aW9uX2hkX2Nwb3J0X2NsZWFyKGNvbm5lY3Rpb24pOworCisJZ2JfY29ubmVjdGlvbl9oZF9jcG9ydF9kaXNhYmxlKGNvbm5lY3Rpb24pOworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJmNvbm5lY3Rpb24tPm11dGV4KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2Nvbm5lY3Rpb25fZGlzYWJsZV9mb3JjZWQpOworCisvKiBDYWxsZXIgbXVzdCBoYXZlIGRpc2FibGVkIHRoZSBjb25uZWN0aW9uIGJlZm9yZSBkZXN0cm95aW5nIGl0LiAqLwordm9pZCBnYl9jb25uZWN0aW9uX2Rlc3Ryb3koc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJaWYgKCFjb25uZWN0aW9uKQorCQlyZXR1cm47CisKKwlpZiAoV0FSTl9PTihjb25uZWN0aW9uLT5zdGF0ZSAhPSBHQl9DT05ORUNUSU9OX1NUQVRFX0RJU0FCTEVEKSkKKwkJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGNvbm5lY3Rpb24pOworCisJbXV0ZXhfbG9jaygmZ2JfY29ubmVjdGlvbl9tdXRleCk7CisKKwlzcGluX2xvY2tfaXJxKCZnYl9jb25uZWN0aW9uc19sb2NrKTsKKwlsaXN0X2RlbCgmY29ubmVjdGlvbi0+YnVuZGxlX2xpbmtzKTsKKwlsaXN0X2RlbCgmY29ubmVjdGlvbi0+aGRfbGlua3MpOworCXNwaW5fdW5sb2NrX2lycSgmZ2JfY29ubmVjdGlvbnNfbG9jayk7CisKKwlkZXN0cm95X3dvcmtxdWV1ZShjb25uZWN0aW9uLT53cSk7CisKKwlnYl9oZF9jcG9ydF9yZWxlYXNlKGNvbm5lY3Rpb24tPmhkLCBjb25uZWN0aW9uLT5oZF9jcG9ydF9pZCk7CisJY29ubmVjdGlvbi0+aGRfY3BvcnRfaWQgPSBDUE9SVF9JRF9CQUQ7CisKKwltdXRleF91bmxvY2soJmdiX2Nvbm5lY3Rpb25fbXV0ZXgpOworCisJZ2JfY29ubmVjdGlvbl9wdXQoY29ubmVjdGlvbik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9jb25uZWN0aW9uX2Rlc3Ryb3kpOworCit2b2lkIGdiX2Nvbm5lY3Rpb25fbGF0ZW5jeV90YWdfZW5hYmxlKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQgPSBjb25uZWN0aW9uLT5oZDsKKwlpbnQgcmV0OworCisJaWYgKCFoZC0+ZHJpdmVyLT5sYXRlbmN5X3RhZ19lbmFibGUpCisJCXJldHVybjsKKworCXJldCA9IGhkLT5kcml2ZXItPmxhdGVuY3lfdGFnX2VuYWJsZShoZCwgY29ubmVjdGlvbi0+aGRfY3BvcnRfaWQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmY29ubmVjdGlvbi0+aGQtPmRldiwKKwkJCSIlczogZmFpbGVkIHRvIGVuYWJsZSBsYXRlbmN5IHRhZzogJWRcbiIsCisJCQljb25uZWN0aW9uLT5uYW1lLCByZXQpOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2Nvbm5lY3Rpb25fbGF0ZW5jeV90YWdfZW5hYmxlKTsKKwordm9pZCBnYl9jb25uZWN0aW9uX2xhdGVuY3lfdGFnX2Rpc2FibGUoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCA9IGNvbm5lY3Rpb24tPmhkOworCWludCByZXQ7CisKKwlpZiAoIWhkLT5kcml2ZXItPmxhdGVuY3lfdGFnX2Rpc2FibGUpCisJCXJldHVybjsKKworCXJldCA9IGhkLT5kcml2ZXItPmxhdGVuY3lfdGFnX2Rpc2FibGUoaGQsIGNvbm5lY3Rpb24tPmhkX2Nwb3J0X2lkKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmNvbm5lY3Rpb24tPmhkLT5kZXYsCisJCQkiJXM6IGZhaWxlZCB0byBkaXNhYmxlIGxhdGVuY3kgdGFnOiAlZFxuIiwKKwkJCWNvbm5lY3Rpb24tPm5hbWUsIHJldCk7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfY29ubmVjdGlvbl9sYXRlbmN5X3RhZ19kaXNhYmxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2Nvbm5lY3Rpb24uaCBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2Nvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDlmNGM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvY29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogR3JleWJ1cyBjb25uZWN0aW9ucworICoKKyAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNCBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpZm5kZWYgX19DT05ORUNUSU9OX0gKKyNkZWZpbmUgX19DT05ORUNUSU9OX0gKKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgorCisjZGVmaW5lIEdCX0NPTk5FQ1RJT05fRkxBR19DU0QJCUJJVCgwKQorI2RlZmluZSBHQl9DT05ORUNUSU9OX0ZMQUdfTk9fRkxPV0NUUkwJQklUKDEpCisjZGVmaW5lIEdCX0NPTk5FQ1RJT05fRkxBR19PRkZMT0FERUQJQklUKDIpCisjZGVmaW5lIEdCX0NPTk5FQ1RJT05fRkxBR19DRFNJMQlCSVQoMykKKyNkZWZpbmUgR0JfQ09OTkVDVElPTl9GTEFHX0NPTlRST0wJQklUKDQpCisjZGVmaW5lIEdCX0NPTk5FQ1RJT05fRkxBR19ISUdIX1BSSU8JQklUKDUpCisKKyNkZWZpbmUgR0JfQ09OTkVDVElPTl9GTEFHX0NPUkVfTUFTSwlHQl9DT05ORUNUSU9OX0ZMQUdfQ09OVFJPTAorCitlbnVtIGdiX2Nvbm5lY3Rpb25fc3RhdGUgeworCUdCX0NPTk5FQ1RJT05fU1RBVEVfRElTQUJMRUQJCT0gMCwKKwlHQl9DT05ORUNUSU9OX1NUQVRFX0VOQUJMRURfVFgJCT0gMSwKKwlHQl9DT05ORUNUSU9OX1NUQVRFX0VOQUJMRUQJCT0gMiwKKwlHQl9DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RJTkcJPSAzLAorfTsKKworc3RydWN0IGdiX29wZXJhdGlvbjsKKwordHlwZWRlZiBpbnQgKCpnYl9yZXF1ZXN0X2hhbmRsZXJfdCkoc3RydWN0IGdiX29wZXJhdGlvbiAqKTsKKworc3RydWN0IGdiX2Nvbm5lY3Rpb24geworCXN0cnVjdCBnYl9ob3N0X2RldmljZQkJKmhkOworCXN0cnVjdCBnYl9pbnRlcmZhY2UJCSppbnRmOworCXN0cnVjdCBnYl9idW5kbGUJCSpidW5kbGU7CisJc3RydWN0IGtyZWYJCQlrcmVmOworCXUxNgkJCQloZF9jcG9ydF9pZDsKKwl1MTYJCQkJaW50Zl9jcG9ydF9pZDsKKworCXN0cnVjdCBsaXN0X2hlYWQJCWhkX2xpbmtzOworCXN0cnVjdCBsaXN0X2hlYWQJCWJ1bmRsZV9saW5rczsKKworCWdiX3JlcXVlc3RfaGFuZGxlcl90CQloYW5kbGVyOworCXVuc2lnbmVkIGxvbmcJCQlmbGFnczsKKworCXN0cnVjdCBtdXRleAkJCW11dGV4OworCXNwaW5sb2NrX3QJCQlsb2NrOworCWVudW0gZ2JfY29ubmVjdGlvbl9zdGF0ZQlzdGF0ZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlvcGVyYXRpb25zOworCisJY2hhcgkJCQluYW1lWzE2XTsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdAkJKndxOworCisJYXRvbWljX3QJCQlvcF9jeWNsZTsKKworCXZvaWQJCQkJKnByaXZhdGU7CisKKwlib29sCQkJCW1vZGVfc3dpdGNoOworfTsKKworc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmdiX2Nvbm5lY3Rpb25fY3JlYXRlX3N0YXRpYyhzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLAorCQkJCXUxNiBoZF9jcG9ydF9pZCwgZ2JfcmVxdWVzdF9oYW5kbGVyX3QgaGFuZGxlcik7CitzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqZ2JfY29ubmVjdGlvbl9jcmVhdGVfY29udHJvbChzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKTsKK3N0cnVjdCBnYl9jb25uZWN0aW9uICpnYl9jb25uZWN0aW9uX2NyZWF0ZShzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUsCisJCQkJdTE2IGNwb3J0X2lkLCBnYl9yZXF1ZXN0X2hhbmRsZXJfdCBoYW5kbGVyKTsKK3N0cnVjdCBnYl9jb25uZWN0aW9uICpnYl9jb25uZWN0aW9uX2NyZWF0ZV9mbGFncyhzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUsCisJCQkJdTE2IGNwb3J0X2lkLCBnYl9yZXF1ZXN0X2hhbmRsZXJfdCBoYW5kbGVyLAorCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpOworc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmdiX2Nvbm5lY3Rpb25fY3JlYXRlX29mZmxvYWRlZChzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUsCisJCQkJdTE2IGNwb3J0X2lkLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK3ZvaWQgZ2JfY29ubmVjdGlvbl9kZXN0cm95KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKKworc3RhdGljIGlubGluZSBib29sIGdiX2Nvbm5lY3Rpb25faXNfc3RhdGljKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCXJldHVybiAhY29ubmVjdGlvbi0+aW50ZjsKK30KKworaW50IGdiX2Nvbm5lY3Rpb25fZW5hYmxlKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK2ludCBnYl9jb25uZWN0aW9uX2VuYWJsZV90eChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7Cit2b2lkIGdiX2Nvbm5lY3Rpb25fZGlzYWJsZV9yeChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7Cit2b2lkIGdiX2Nvbm5lY3Rpb25fZGlzYWJsZShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7Cit2b2lkIGdiX2Nvbm5lY3Rpb25fZGlzYWJsZV9mb3JjZWQoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCit2b2lkIGdiX2Nvbm5lY3Rpb25fbW9kZV9zd2l0Y2hfcHJlcGFyZShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7Cit2b2lkIGdiX2Nvbm5lY3Rpb25fbW9kZV9zd2l0Y2hfY29tcGxldGUoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCit2b2lkIGdyZXlidXNfZGF0YV9yY3ZkKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHUxNiBjcG9ydF9pZCwKKwkJCXU4ICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKKwordm9pZCBnYl9jb25uZWN0aW9uX2xhdGVuY3lfdGFnX2VuYWJsZShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7Cit2b2lkIGdiX2Nvbm5lY3Rpb25fbGF0ZW5jeV90YWdfZGlzYWJsZShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBnYl9jb25uZWN0aW9uX2UyZWZjX2VuYWJsZWQoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJcmV0dXJuICEoY29ubmVjdGlvbi0+ZmxhZ3MgJiBHQl9DT05ORUNUSU9OX0ZMQUdfQ1NEKTsKK30KKworc3RhdGljIGlubGluZSBib29sCitnYl9jb25uZWN0aW9uX2Zsb3dfY29udHJvbF9kaXNhYmxlZChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlyZXR1cm4gY29ubmVjdGlvbi0+ZmxhZ3MgJiBHQl9DT05ORUNUSU9OX0ZMQUdfTk9fRkxPV0NUUkw7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBnYl9jb25uZWN0aW9uX2lzX29mZmxvYWRlZChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlyZXR1cm4gY29ubmVjdGlvbi0+ZmxhZ3MgJiBHQl9DT05ORUNUSU9OX0ZMQUdfT0ZGTE9BREVEOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgZ2JfY29ubmVjdGlvbl9pc19jb250cm9sKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCXJldHVybiBjb25uZWN0aW9uLT5mbGFncyAmIEdCX0NPTk5FQ1RJT05fRkxBR19DT05UUk9MOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmdiX2Nvbm5lY3Rpb25fZ2V0X2RhdGEoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJcmV0dXJuIGNvbm5lY3Rpb24tPnByaXZhdGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnYl9jb25uZWN0aW9uX3NldF9kYXRhKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCQkgIHZvaWQgKmRhdGEpCit7CisJY29ubmVjdGlvbi0+cHJpdmF0ZSA9IGRhdGE7Cit9CisKKyNlbmRpZiAvKiBfX0NPTk5FQ1RJT05fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvY29udHJvbC5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvY29udHJvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MTYxOTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9jb250cm9sLmMKQEAgLTAsMCArMSw2MzUgQEAKKy8qCisgKiBHcmV5YnVzIENQb3J0IGNvbnRyb2wgcHJvdG9jb2wuCisgKgorICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE1IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlICJncmV5YnVzLmgiCisKKy8qIEhpZ2hlc3QgY29udHJvbC1wcm90b2NvbCB2ZXJzaW9uIHN1cHBvcnRlZCAqLworI2RlZmluZSBHQl9DT05UUk9MX1ZFUlNJT05fTUFKT1IJMAorI2RlZmluZSBHQl9DT05UUk9MX1ZFUlNJT05fTUlOT1IJMQorCisKK3N0YXRpYyBpbnQgZ2JfY29udHJvbF9nZXRfdmVyc2lvbihzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCkKK3sKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmID0gY29udHJvbC0+Y29ubmVjdGlvbi0+aW50ZjsKKwlzdHJ1Y3QgZ2JfY29udHJvbF92ZXJzaW9uX3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZ2JfY29udHJvbF92ZXJzaW9uX3Jlc3BvbnNlIHJlc3BvbnNlOworCWludCByZXQ7CisKKwlyZXF1ZXN0Lm1ham9yID0gR0JfQ09OVFJPTF9WRVJTSU9OX01BSk9SOworCXJlcXVlc3QubWlub3IgPSBHQl9DT05UUk9MX1ZFUlNJT05fTUlOT1I7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhjb250cm9sLT5jb25uZWN0aW9uLAorCQkJCUdCX0NPTlRST0xfVFlQRV9WRVJTSU9OLAorCQkJCSZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksICZyZXNwb25zZSwKKwkJCQlzaXplb2YocmVzcG9uc2UpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCQkiZmFpbGVkIHRvIGdldCBjb250cm9sLXByb3RvY29sIHZlcnNpb246ICVkXG4iLAorCQkJCXJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHJlc3BvbnNlLm1ham9yID4gcmVxdWVzdC5tYWpvcikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsCisJCQkJInVuc3VwcG9ydGVkIG1ham9yIGNvbnRyb2wtcHJvdG9jb2wgdmVyc2lvbiAoJXUgPiAldSlcbiIsCisJCQkJcmVzcG9uc2UubWFqb3IsIHJlcXVlc3QubWFqb3IpOworCQlyZXR1cm4gLUVOT1RTVVBQOworCX0KKworCWNvbnRyb2wtPnByb3RvY29sX21ham9yID0gcmVzcG9uc2UubWFqb3I7CisJY29udHJvbC0+cHJvdG9jb2xfbWlub3IgPSByZXNwb25zZS5taW5vcjsKKworCWRldl9kYmcoJmludGYtPmRldiwgIiVzIC0gJXUuJXVcbiIsIF9fZnVuY19fLCByZXNwb25zZS5tYWpvciwKKwkJCXJlc3BvbnNlLm1pbm9yKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX2NvbnRyb2xfZ2V0X2J1bmRsZV92ZXJzaW9uKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sLAorCQkJCQkJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlKQoreworCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYgPSBjb250cm9sLT5jb25uZWN0aW9uLT5pbnRmOworCXN0cnVjdCBnYl9jb250cm9sX2J1bmRsZV92ZXJzaW9uX3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZ2JfY29udHJvbF9idW5kbGVfdmVyc2lvbl9yZXNwb25zZSByZXNwb25zZTsKKwlpbnQgcmV0OworCisJcmVxdWVzdC5idW5kbGVfaWQgPSBidW5kbGUtPmlkOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoY29udHJvbC0+Y29ubmVjdGlvbiwKKwkJCQlHQl9DT05UUk9MX1RZUEVfQlVORExFX1ZFUlNJT04sCisJCQkJJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwKKwkJCQkmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LAorCQkJCSJmYWlsZWQgdG8gZ2V0IGJ1bmRsZSAldSBjbGFzcyB2ZXJzaW9uOiAlZFxuIiwKKwkJCQlidW5kbGUtPmlkLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWJ1bmRsZS0+Y2xhc3NfbWFqb3IgPSByZXNwb25zZS5tYWpvcjsKKwlidW5kbGUtPmNsYXNzX21pbm9yID0gcmVzcG9uc2UubWlub3I7CisKKwlkZXZfZGJnKCZpbnRmLT5kZXYsICIlcyAtICV1OiAldS4ldVxuIiwgX19mdW5jX18sIGJ1bmRsZS0+aWQsCisJCQlyZXNwb25zZS5tYWpvciwgcmVzcG9uc2UubWlub3IpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBnYl9jb250cm9sX2dldF9idW5kbGVfdmVyc2lvbnMoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wpCit7CisJc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZiA9IGNvbnRyb2wtPmNvbm5lY3Rpb24tPmludGY7CisJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlOworCWludCByZXQ7CisKKwlpZiAoIWNvbnRyb2wtPmhhc19idW5kbGVfdmVyc2lvbikKKwkJcmV0dXJuIDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ1bmRsZSwgJmludGYtPmJ1bmRsZXMsIGxpbmtzKSB7CisJCXJldCA9IGdiX2NvbnRyb2xfZ2V0X2J1bmRsZV92ZXJzaW9uKGNvbnRyb2wsIGJ1bmRsZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCisvKiBHZXQgTWFuaWZlc3QncyBzaXplIGZyb20gdGhlIGludGVyZmFjZSAqLworaW50IGdiX2NvbnRyb2xfZ2V0X21hbmlmZXN0X3NpemVfb3BlcmF0aW9uKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IGdiX2NvbnRyb2xfZ2V0X21hbmlmZXN0X3NpemVfcmVzcG9uc2UgcmVzcG9uc2U7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBpbnRmLT5jb250cm9sLT5jb25uZWN0aW9uOworCWludCByZXQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLCBHQl9DT05UUk9MX1RZUEVfR0VUX01BTklGRVNUX1NJWkUsCisJCQkJTlVMTCwgMCwgJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmNvbm5lY3Rpb24tPmludGYtPmRldiwKKwkJCQkiZmFpbGVkIHRvIGdldCBtYW5pZmVzdCBzaXplOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gbGUxNl90b19jcHUocmVzcG9uc2Uuc2l6ZSk7Cit9CisKKy8qIFJlYWRzIE1hbmlmZXN0IGZyb20gdGhlIGludGVyZmFjZSAqLworaW50IGdiX2NvbnRyb2xfZ2V0X21hbmlmZXN0X29wZXJhdGlvbihzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmLCB2b2lkICptYW5pZmVzdCwKKwkJCQkgICAgICBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGludGYtPmNvbnRyb2wtPmNvbm5lY3Rpb247CisKKwlyZXR1cm4gZ2Jfb3BlcmF0aW9uX3N5bmMoY29ubmVjdGlvbiwgR0JfQ09OVFJPTF9UWVBFX0dFVF9NQU5JRkVTVCwKKwkJCQlOVUxMLCAwLCBtYW5pZmVzdCwgc2l6ZSk7Cit9CisKK2ludCBnYl9jb250cm9sX2Nvbm5lY3RlZF9vcGVyYXRpb24oc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wsIHUxNiBjcG9ydF9pZCkKK3sKKwlzdHJ1Y3QgZ2JfY29udHJvbF9jb25uZWN0ZWRfcmVxdWVzdCByZXF1ZXN0OworCisJcmVxdWVzdC5jcG9ydF9pZCA9IGNwdV90b19sZTE2KGNwb3J0X2lkKTsKKwlyZXR1cm4gZ2Jfb3BlcmF0aW9uX3N5bmMoY29udHJvbC0+Y29ubmVjdGlvbiwgR0JfQ09OVFJPTF9UWVBFX0NPTk5FQ1RFRCwKKwkJCQkgJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwgTlVMTCwgMCk7Cit9CisKK2ludCBnYl9jb250cm9sX2Rpc2Nvbm5lY3RlZF9vcGVyYXRpb24oc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wsIHUxNiBjcG9ydF9pZCkKK3sKKwlzdHJ1Y3QgZ2JfY29udHJvbF9kaXNjb25uZWN0ZWRfcmVxdWVzdCByZXF1ZXN0OworCisJcmVxdWVzdC5jcG9ydF9pZCA9IGNwdV90b19sZTE2KGNwb3J0X2lkKTsKKwlyZXR1cm4gZ2Jfb3BlcmF0aW9uX3N5bmMoY29udHJvbC0+Y29ubmVjdGlvbiwKKwkJCQkgR0JfQ09OVFJPTF9UWVBFX0RJU0NPTk5FQ1RFRCwgJnJlcXVlc3QsCisJCQkJIHNpemVvZihyZXF1ZXN0KSwgTlVMTCwgMCk7Cit9CisKK2ludCBnYl9jb250cm9sX2Rpc2Nvbm5lY3Rpbmdfb3BlcmF0aW9uKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sLAorCQkJCQl1MTYgY3BvcnRfaWQpCit7CisJc3RydWN0IGdiX2NvbnRyb2xfZGlzY29ubmVjdGluZ19yZXF1ZXN0ICpyZXF1ZXN0OworCXN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbjsKKwlpbnQgcmV0OworCisJb3BlcmF0aW9uID0gZ2Jfb3BlcmF0aW9uX2NyZWF0ZV9jb3JlKGNvbnRyb2wtPmNvbm5lY3Rpb24sCisJCQkJCUdCX0NPTlRST0xfVFlQRV9ESVNDT05ORUNUSU5HLAorCQkJCQlzaXplb2YoKnJlcXVlc3QpLCAwLCAwLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIW9wZXJhdGlvbikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXF1ZXN0ID0gb3BlcmF0aW9uLT5yZXF1ZXN0LT5wYXlsb2FkOworCXJlcXVlc3QtPmNwb3J0X2lkID0gY3B1X3RvX2xlMTYoY3BvcnRfaWQpOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3JlcXVlc3Rfc2VuZF9zeW5jKG9wZXJhdGlvbik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjb250cm9sLT5kZXYsICJmYWlsZWQgdG8gc2VuZCBkaXNjb25uZWN0aW5nOiAlZFxuIiwKKwkJCQlyZXQpOworCX0KKworCWdiX29wZXJhdGlvbl9wdXQob3BlcmF0aW9uKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBnYl9jb250cm9sX21vZGVfc3dpdGNoX29wZXJhdGlvbihzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCkKK3sKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb247CisJaW50IHJldDsKKworCW9wZXJhdGlvbiA9IGdiX29wZXJhdGlvbl9jcmVhdGVfY29yZShjb250cm9sLT5jb25uZWN0aW9uLAorCQkJCQlHQl9DT05UUk9MX1RZUEVfTU9ERV9TV0lUQ0gsCisJCQkJCTAsIDAsIEdCX09QRVJBVElPTl9GTEFHX1VOSURJUkVDVElPTkFMLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIW9wZXJhdGlvbikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fcmVxdWVzdF9zZW5kX3N5bmMob3BlcmF0aW9uKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKCZjb250cm9sLT5kZXYsICJmYWlsZWQgdG8gc2VuZCBtb2RlIHN3aXRjaDogJWRcbiIsIHJldCk7CisKKwlnYl9vcGVyYXRpb25fcHV0KG9wZXJhdGlvbik7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZ2JfY29udHJvbF90aW1lc3luY19lbmFibGUoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wsIHU4IGNvdW50LAorCQkJICAgICAgIHU2NCBmcmFtZV90aW1lLCB1MzIgc3Ryb2JlX2RlbGF5LCB1MzIgcmVmY2xrKQoreworCXN0cnVjdCBnYl9jb250cm9sX3RpbWVzeW5jX2VuYWJsZV9yZXF1ZXN0IHJlcXVlc3Q7CisKKwlyZXF1ZXN0LmNvdW50ID0gY291bnQ7CisJcmVxdWVzdC5mcmFtZV90aW1lID0gY3B1X3RvX2xlNjQoZnJhbWVfdGltZSk7CisJcmVxdWVzdC5zdHJvYmVfZGVsYXkgPSBjcHVfdG9fbGUzMihzdHJvYmVfZGVsYXkpOworCXJlcXVlc3QucmVmY2xrID0gY3B1X3RvX2xlMzIocmVmY2xrKTsKKwlyZXR1cm4gZ2Jfb3BlcmF0aW9uX3N5bmMoY29udHJvbC0+Y29ubmVjdGlvbiwKKwkJCQkgR0JfQ09OVFJPTF9UWVBFX1RJTUVTWU5DX0VOQUJMRSwgJnJlcXVlc3QsCisJCQkJIHNpemVvZihyZXF1ZXN0KSwgTlVMTCwgMCk7Cit9CisKK2ludCBnYl9jb250cm9sX3RpbWVzeW5jX2Rpc2FibGUoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wpCit7CisJcmV0dXJuIGdiX29wZXJhdGlvbl9zeW5jKGNvbnRyb2wtPmNvbm5lY3Rpb24sCisJCQkJIEdCX0NPTlRST0xfVFlQRV9USU1FU1lOQ19ESVNBQkxFLCBOVUxMLCAwLAorCQkJCSBOVUxMLCAwKTsKK30KKworaW50IGdiX2NvbnRyb2xfdGltZXN5bmNfZ2V0X2xhc3RfZXZlbnQoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wsCisJCQkJICAgICAgIHU2NCAqZnJhbWVfdGltZSkKK3sKKwlzdHJ1Y3QgZ2JfY29udHJvbF90aW1lc3luY19nZXRfbGFzdF9ldmVudF9yZXNwb25zZSByZXNwb25zZTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoY29udHJvbC0+Y29ubmVjdGlvbiwKKwkJCQlHQl9DT05UUk9MX1RZUEVfVElNRVNZTkNfR0VUX0xBU1RfRVZFTlQsCisJCQkJTlVMTCwgMCwgJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKTsKKwlpZiAoIXJldCkKKwkJKmZyYW1lX3RpbWUgPSBsZTY0X3RvX2NwdShyZXNwb25zZS5mcmFtZV90aW1lKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZ2JfY29udHJvbF90aW1lc3luY19hdXRob3JpdGF0aXZlKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sLAorCQkJCSAgICAgIHU2NCAqZnJhbWVfdGltZSkKK3sKKwlzdHJ1Y3QgZ2JfY29udHJvbF90aW1lc3luY19hdXRob3JpdGF0aXZlX3JlcXVlc3QgcmVxdWVzdDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBHQl9USU1FU1lOQ19NQVhfU1RST0JFUzsgaSsrKQorCQlyZXF1ZXN0LmZyYW1lX3RpbWVbaV0gPSBjcHVfdG9fbGU2NChmcmFtZV90aW1lW2ldKTsKKworCXJldHVybiBnYl9vcGVyYXRpb25fc3luYyhjb250cm9sLT5jb25uZWN0aW9uLAorCQkJCSBHQl9DT05UUk9MX1RZUEVfVElNRVNZTkNfQVVUSE9SSVRBVElWRSwKKwkJCQkgJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwKKwkJCQkgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgZ2JfY29udHJvbF9idW5kbGVfcG1fc3RhdHVzX21hcCh1OCBzdGF0dXMpCit7CisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIEdCX0NPTlRST0xfQlVORExFX1BNX0lOVkFMOgorCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIEdCX0NPTlRST0xfQlVORExFX1BNX0JVU1k6CisJCXJldHVybiAtRUJVU1k7CisJY2FzZSBHQl9DT05UUk9MX0JVTkRMRV9QTV9OQToKKwkJcmV0dXJuIC1FTk9NU0c7CisJY2FzZSBHQl9DT05UUk9MX0JVTkRMRV9QTV9GQUlMOgorCWRlZmF1bHQ6CisJCXJldHVybiAtRVJFTU9URUlPOworCX0KK30KKworaW50IGdiX2NvbnRyb2xfYnVuZGxlX3N1c3BlbmQoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wsIHU4IGJ1bmRsZV9pZCkKK3sKKwlzdHJ1Y3QgZ2JfY29udHJvbF9idW5kbGVfcG1fcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBnYl9jb250cm9sX2J1bmRsZV9wbV9yZXNwb25zZSByZXNwb25zZTsKKwlpbnQgcmV0OworCisJcmVxdWVzdC5idW5kbGVfaWQgPSBidW5kbGVfaWQ7CisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoY29udHJvbC0+Y29ubmVjdGlvbiwKKwkJCQlHQl9DT05UUk9MX1RZUEVfQlVORExFX1NVU1BFTkQsICZyZXF1ZXN0LAorCQkJCXNpemVvZihyZXF1ZXN0KSwgJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmNvbnRyb2wtPmRldiwgImZhaWxlZCB0byBzZW5kIGJ1bmRsZSAldSBzdXNwZW5kOiAlZFxuIiwKKwkJCWJ1bmRsZV9pZCwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAocmVzcG9uc2Uuc3RhdHVzICE9IEdCX0NPTlRST0xfQlVORExFX1BNX09LKSB7CisJCWRldl9lcnIoJmNvbnRyb2wtPmRldiwgImZhaWxlZCB0byBzdXNwZW5kIGJ1bmRsZSAldTogJWRcbiIsCisJCQlidW5kbGVfaWQsIHJlc3BvbnNlLnN0YXR1cyk7CisJCXJldHVybiBnYl9jb250cm9sX2J1bmRsZV9wbV9zdGF0dXNfbWFwKHJlc3BvbnNlLnN0YXR1cyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBnYl9jb250cm9sX2J1bmRsZV9yZXN1bWUoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wsIHU4IGJ1bmRsZV9pZCkKK3sKKwlzdHJ1Y3QgZ2JfY29udHJvbF9idW5kbGVfcG1fcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBnYl9jb250cm9sX2J1bmRsZV9wbV9yZXNwb25zZSByZXNwb25zZTsKKwlpbnQgcmV0OworCisJcmVxdWVzdC5idW5kbGVfaWQgPSBidW5kbGVfaWQ7CisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoY29udHJvbC0+Y29ubmVjdGlvbiwKKwkJCQlHQl9DT05UUk9MX1RZUEVfQlVORExFX1JFU1VNRSwgJnJlcXVlc3QsCisJCQkJc2l6ZW9mKHJlcXVlc3QpLCAmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmY29udHJvbC0+ZGV2LCAiZmFpbGVkIHRvIHNlbmQgYnVuZGxlICV1IHJlc3VtZTogJWRcbiIsCisJCQlidW5kbGVfaWQsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHJlc3BvbnNlLnN0YXR1cyAhPSBHQl9DT05UUk9MX0JVTkRMRV9QTV9PSykgeworCQlkZXZfZXJyKCZjb250cm9sLT5kZXYsICJmYWlsZWQgdG8gcmVzdW1lIGJ1bmRsZSAldTogJWRcbiIsCisJCQlidW5kbGVfaWQsIHJlc3BvbnNlLnN0YXR1cyk7CisJCXJldHVybiBnYl9jb250cm9sX2J1bmRsZV9wbV9zdGF0dXNfbWFwKHJlc3BvbnNlLnN0YXR1cyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBnYl9jb250cm9sX2J1bmRsZV9kZWFjdGl2YXRlKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sLCB1OCBidW5kbGVfaWQpCit7CisJc3RydWN0IGdiX2NvbnRyb2xfYnVuZGxlX3BtX3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZ2JfY29udHJvbF9idW5kbGVfcG1fcmVzcG9uc2UgcmVzcG9uc2U7CisJaW50IHJldDsKKworCXJlcXVlc3QuYnVuZGxlX2lkID0gYnVuZGxlX2lkOworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGNvbnRyb2wtPmNvbm5lY3Rpb24sCisJCQkJR0JfQ09OVFJPTF9UWVBFX0JVTkRMRV9ERUFDVElWQVRFLCAmcmVxdWVzdCwKKwkJCQlzaXplb2YocmVxdWVzdCksICZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjb250cm9sLT5kZXYsCisJCQkiZmFpbGVkIHRvIHNlbmQgYnVuZGxlICV1IGRlYWN0aXZhdGU6ICVkXG4iLCBidW5kbGVfaWQsCisJCQlyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChyZXNwb25zZS5zdGF0dXMgIT0gR0JfQ09OVFJPTF9CVU5ETEVfUE1fT0spIHsKKwkJZGV2X2VycigmY29udHJvbC0+ZGV2LCAiZmFpbGVkIHRvIGRlYWN0aXZhdGUgYnVuZGxlICV1OiAlZFxuIiwKKwkJCWJ1bmRsZV9pZCwgcmVzcG9uc2Uuc3RhdHVzKTsKKwkJcmV0dXJuIGdiX2NvbnRyb2xfYnVuZGxlX3BtX3N0YXR1c19tYXAocmVzcG9uc2Uuc3RhdHVzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGdiX2NvbnRyb2xfYnVuZGxlX2FjdGl2YXRlKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sLCB1OCBidW5kbGVfaWQpCit7CisJc3RydWN0IGdiX2NvbnRyb2xfYnVuZGxlX3BtX3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZ2JfY29udHJvbF9idW5kbGVfcG1fcmVzcG9uc2UgcmVzcG9uc2U7CisJaW50IHJldDsKKworCWlmICghY29udHJvbC0+aGFzX2J1bmRsZV9hY3RpdmF0ZSkKKwkJcmV0dXJuIDA7CisKKwlyZXF1ZXN0LmJ1bmRsZV9pZCA9IGJ1bmRsZV9pZDsKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhjb250cm9sLT5jb25uZWN0aW9uLAorCQkJCUdCX0NPTlRST0xfVFlQRV9CVU5ETEVfQUNUSVZBVEUsICZyZXF1ZXN0LAorCQkJCXNpemVvZihyZXF1ZXN0KSwgJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmNvbnRyb2wtPmRldiwKKwkJCSJmYWlsZWQgdG8gc2VuZCBidW5kbGUgJXUgYWN0aXZhdGU6ICVkXG4iLCBidW5kbGVfaWQsCisJCQlyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChyZXNwb25zZS5zdGF0dXMgIT0gR0JfQ09OVFJPTF9CVU5ETEVfUE1fT0spIHsKKwkJZGV2X2VycigmY29udHJvbC0+ZGV2LCAiZmFpbGVkIHRvIGFjdGl2YXRlIGJ1bmRsZSAldTogJWRcbiIsCisJCQlidW5kbGVfaWQsIHJlc3BvbnNlLnN0YXR1cyk7CisJCXJldHVybiBnYl9jb250cm9sX2J1bmRsZV9wbV9zdGF0dXNfbWFwKHJlc3BvbnNlLnN0YXR1cyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JfY29udHJvbF9pbnRlcmZhY2VfcG1fc3RhdHVzX21hcCh1OCBzdGF0dXMpCit7CisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIEdCX0NPTlRST0xfSU5URl9QTV9CVVNZOgorCQlyZXR1cm4gLUVCVVNZOworCWNhc2UgR0JfQ09OVFJPTF9JTlRGX1BNX05BOgorCQlyZXR1cm4gLUVOT01TRzsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwl9Cit9CisKK2ludCBnYl9jb250cm9sX2ludGVyZmFjZV9zdXNwZW5kX3ByZXBhcmUoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wpCit7CisJc3RydWN0IGdiX2NvbnRyb2xfaW50Zl9wbV9yZXNwb25zZSByZXNwb25zZTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoY29udHJvbC0+Y29ubmVjdGlvbiwKKwkJCQlHQl9DT05UUk9MX1RZUEVfSU5URl9TVVNQRU5EX1BSRVBBUkUsIE5VTEwsIDAsCisJCQkJJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmNvbnRyb2wtPmRldiwKKwkJCSJmYWlsZWQgdG8gc2VuZCBpbnRlcmZhY2Ugc3VzcGVuZCBwcmVwYXJlOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAocmVzcG9uc2Uuc3RhdHVzICE9IEdCX0NPTlRST0xfSU5URl9QTV9PSykgeworCQlkZXZfZXJyKCZjb250cm9sLT5kZXYsICJpbnRlcmZhY2UgZXJyb3Igd2hpbGUgcHJlcGFyaW5nIHN1c3BlbmQ6ICVkXG4iLAorCQkJcmVzcG9uc2Uuc3RhdHVzKTsKKwkJcmV0dXJuIGdiX2NvbnRyb2xfaW50ZXJmYWNlX3BtX3N0YXR1c19tYXAocmVzcG9uc2Uuc3RhdHVzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGdiX2NvbnRyb2xfaW50ZXJmYWNlX2RlYWN0aXZhdGVfcHJlcGFyZShzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCkKK3sKKwlzdHJ1Y3QgZ2JfY29udHJvbF9pbnRmX3BtX3Jlc3BvbnNlIHJlc3BvbnNlOworCWludCByZXQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhjb250cm9sLT5jb25uZWN0aW9uLAorCQkJCUdCX0NPTlRST0xfVFlQRV9JTlRGX0RFQUNUSVZBVEVfUFJFUEFSRSwgTlVMTCwKKwkJCQkwLCAmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmY29udHJvbC0+ZGV2LCAiZmFpbGVkIHRvIHNlbmQgaW50ZXJmYWNlIGRlYWN0aXZhdGUgcHJlcGFyZTogJWRcbiIsCisJCQlyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChyZXNwb25zZS5zdGF0dXMgIT0gR0JfQ09OVFJPTF9JTlRGX1BNX09LKSB7CisJCWRldl9lcnIoJmNvbnRyb2wtPmRldiwgImludGVyZmFjZSBlcnJvciB3aGlsZSBwcmVwYXJpbmcgZGVhY3RpdmF0ZTogJWRcbiIsCisJCQlyZXNwb25zZS5zdGF0dXMpOworCQlyZXR1cm4gZ2JfY29udHJvbF9pbnRlcmZhY2VfcG1fc3RhdHVzX21hcChyZXNwb25zZS5zdGF0dXMpOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgZ2JfY29udHJvbF9pbnRlcmZhY2VfaGliZXJuYXRlX2Fib3J0KHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sKQoreworCXN0cnVjdCBnYl9jb250cm9sX2ludGZfcG1fcmVzcG9uc2UgcmVzcG9uc2U7CisJaW50IHJldDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGNvbnRyb2wtPmNvbm5lY3Rpb24sCisJCQkJR0JfQ09OVFJPTF9UWVBFX0lOVEZfSElCRVJOQVRFX0FCT1JULCBOVUxMLCAwLAorCQkJCSZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjb250cm9sLT5kZXYsCisJCQkiZmFpbGVkIHRvIHNlbmQgaW50ZXJmYWNlIGFib3J0aW5nIGhpYmVybmF0ZTogJWRcbiIsCisJCQlyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChyZXNwb25zZS5zdGF0dXMgIT0gR0JfQ09OVFJPTF9JTlRGX1BNX09LKSB7CisJCWRldl9lcnIoJmNvbnRyb2wtPmRldiwgImludGVyZmFjZSBlcnJvciB3aGlsZSBhYm9ydGluZyBoaWJlcm5hdGU6ICVkXG4iLAorCQkJcmVzcG9uc2Uuc3RhdHVzKTsKKwkJcmV0dXJuIGdiX2NvbnRyb2xfaW50ZXJmYWNlX3BtX3N0YXR1c19tYXAocmVzcG9uc2Uuc3RhdHVzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgdmVuZG9yX3N0cmluZ19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wgPSB0b19nYl9jb250cm9sKGRldik7CisKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGNvbnRyb2wtPnZlbmRvcl9zdHJpbmcpOworfQorc3RhdGljIERFVklDRV9BVFRSX1JPKHZlbmRvcl9zdHJpbmcpOworCitzdGF0aWMgc3NpemVfdCBwcm9kdWN0X3N0cmluZ19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wgPSB0b19nYl9jb250cm9sKGRldik7CisKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGNvbnRyb2wtPnByb2R1Y3Rfc3RyaW5nKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhwcm9kdWN0X3N0cmluZyk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpjb250cm9sX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX3ZlbmRvcl9zdHJpbmcuYXR0ciwKKwkmZGV2X2F0dHJfcHJvZHVjdF9zdHJpbmcuYXR0ciwKKwlOVUxMLAorfTsKK0FUVFJJQlVURV9HUk9VUFMoY29udHJvbCk7CisKK3N0YXRpYyB2b2lkIGdiX2NvbnRyb2xfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wgPSB0b19nYl9jb250cm9sKGRldik7CisKKwlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koY29udHJvbC0+Y29ubmVjdGlvbik7CisKKwlrZnJlZShjb250cm9sLT52ZW5kb3Jfc3RyaW5nKTsKKwlrZnJlZShjb250cm9sLT5wcm9kdWN0X3N0cmluZyk7CisKKwlrZnJlZShjb250cm9sKTsKK30KKworc3RydWN0IGRldmljZV90eXBlIGdyZXlidXNfY29udHJvbF90eXBlID0geworCS5uYW1lID0JCSJncmV5YnVzX2NvbnRyb2wiLAorCS5yZWxlYXNlID0JZ2JfY29udHJvbF9yZWxlYXNlLAorfTsKKworc3RydWN0IGdiX2NvbnRyb2wgKmdiX2NvbnRyb2xfY3JlYXRlKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisJc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2w7CisKKwljb250cm9sID0ga3phbGxvYyhzaXplb2YoKmNvbnRyb2wpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNvbnRyb2wpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJY29udHJvbC0+aW50ZiA9IGludGY7CisKKwljb25uZWN0aW9uID0gZ2JfY29ubmVjdGlvbl9jcmVhdGVfY29udHJvbChpbnRmKTsKKwlpZiAoSVNfRVJSKGNvbm5lY3Rpb24pKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCQkiZmFpbGVkIHRvIGNyZWF0ZSBjb250cm9sIGNvbm5lY3Rpb246ICVsZFxuIiwKKwkJCQlQVFJfRVJSKGNvbm5lY3Rpb24pKTsKKwkJa2ZyZWUoY29udHJvbCk7CisJCXJldHVybiBFUlJfQ0FTVChjb25uZWN0aW9uKTsKKwl9CisKKwljb250cm9sLT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKworCWNvbnRyb2wtPmRldi5wYXJlbnQgPSAmaW50Zi0+ZGV2OworCWNvbnRyb2wtPmRldi5idXMgPSAmZ3JleWJ1c19idXNfdHlwZTsKKwljb250cm9sLT5kZXYudHlwZSA9ICZncmV5YnVzX2NvbnRyb2xfdHlwZTsKKwljb250cm9sLT5kZXYuZ3JvdXBzID0gY29udHJvbF9ncm91cHM7CisJY29udHJvbC0+ZGV2LmRtYV9tYXNrID0gaW50Zi0+ZGV2LmRtYV9tYXNrOworCWRldmljZV9pbml0aWFsaXplKCZjb250cm9sLT5kZXYpOworCWRldl9zZXRfbmFtZSgmY29udHJvbC0+ZGV2LCAiJXMuY3RybCIsIGRldl9uYW1lKCZpbnRmLT5kZXYpKTsKKworCWdiX2Nvbm5lY3Rpb25fc2V0X2RhdGEoY29udHJvbC0+Y29ubmVjdGlvbiwgY29udHJvbCk7CisKKwlyZXR1cm4gY29udHJvbDsKK30KKworaW50IGdiX2NvbnRyb2xfZW5hYmxlKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sKQoreworCWludCByZXQ7CisKKwlkZXZfZGJnKCZjb250cm9sLT5jb25uZWN0aW9uLT5pbnRmLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCisJcmV0ID0gZ2JfY29ubmVjdGlvbl9lbmFibGVfdHgoY29udHJvbC0+Y29ubmVjdGlvbik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjb250cm9sLT5jb25uZWN0aW9uLT5pbnRmLT5kZXYsCisJCQkJImZhaWxlZCB0byBlbmFibGUgY29udHJvbCBjb25uZWN0aW9uOiAlZFxuIiwKKwkJCQlyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGdiX2NvbnRyb2xfZ2V0X3ZlcnNpb24oY29udHJvbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZGlzYWJsZV9jb25uZWN0aW9uOworCisJaWYgKGNvbnRyb2wtPnByb3RvY29sX21ham9yID4gMCB8fCBjb250cm9sLT5wcm90b2NvbF9taW5vciA+IDEpCisJCWNvbnRyb2wtPmhhc19idW5kbGVfdmVyc2lvbiA9IHRydWU7CisKKwkvKiBGSVhNRTogdXNlIHByb3RvY29sIHZlcnNpb24gaW5zdGVhZCAqLworCWlmICghKGNvbnRyb2wtPmludGYtPnF1aXJrcyAmIEdCX0lOVEVSRkFDRV9RVUlSS19OT19CVU5ETEVfQUNUSVZBVEUpKQorCQljb250cm9sLT5oYXNfYnVuZGxlX2FjdGl2YXRlID0gdHJ1ZTsKKworCXJldHVybiAwOworCitlcnJfZGlzYWJsZV9jb25uZWN0aW9uOgorCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShjb250cm9sLT5jb25uZWN0aW9uKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgZ2JfY29udHJvbF9kaXNhYmxlKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sKQoreworCWRldl9kYmcoJmNvbnRyb2wtPmNvbm5lY3Rpb24tPmludGYtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoY29udHJvbC0+aW50Zi0+ZGlzY29ubmVjdGVkKQorCQlnYl9jb25uZWN0aW9uX2Rpc2FibGVfZm9yY2VkKGNvbnRyb2wtPmNvbm5lY3Rpb24pOworCWVsc2UKKwkJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGNvbnRyb2wtPmNvbm5lY3Rpb24pOworfQorCitpbnQgZ2JfY29udHJvbF9zdXNwZW5kKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sKQoreworCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShjb250cm9sLT5jb25uZWN0aW9uKTsKKworCXJldHVybiAwOworfQorCitpbnQgZ2JfY29udHJvbF9yZXN1bWUoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wpCit7CisJaW50IHJldDsKKworCXJldCA9IGdiX2Nvbm5lY3Rpb25fZW5hYmxlX3R4KGNvbnRyb2wtPmNvbm5lY3Rpb24pOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmY29udHJvbC0+Y29ubmVjdGlvbi0+aW50Zi0+ZGV2LAorCQkJImZhaWxlZCB0byBlbmFibGUgY29udHJvbCBjb25uZWN0aW9uOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGdiX2NvbnRyb2xfYWRkKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sKQoreworCWludCByZXQ7CisKKwlyZXQgPSBkZXZpY2VfYWRkKCZjb250cm9sLT5kZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmY29udHJvbC0+ZGV2LAorCQkJCSJmYWlsZWQgdG8gcmVnaXN0ZXIgY29udHJvbCBkZXZpY2U6ICVkXG4iLAorCQkJCXJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZ2JfY29udHJvbF9kZWwoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wpCit7CisJaWYgKGRldmljZV9pc19yZWdpc3RlcmVkKCZjb250cm9sLT5kZXYpKQorCQlkZXZpY2VfZGVsKCZjb250cm9sLT5kZXYpOworfQorCitzdHJ1Y3QgZ2JfY29udHJvbCAqZ2JfY29udHJvbF9nZXQoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wpCit7CisJZ2V0X2RldmljZSgmY29udHJvbC0+ZGV2KTsKKworCXJldHVybiBjb250cm9sOworfQorCit2b2lkIGdiX2NvbnRyb2xfcHV0KHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sKQoreworCXB1dF9kZXZpY2UoJmNvbnRyb2wtPmRldik7Cit9CisKK3ZvaWQgZ2JfY29udHJvbF9tb2RlX3N3aXRjaF9wcmVwYXJlKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sKQoreworCWdiX2Nvbm5lY3Rpb25fbW9kZV9zd2l0Y2hfcHJlcGFyZShjb250cm9sLT5jb25uZWN0aW9uKTsKK30KKwordm9pZCBnYl9jb250cm9sX21vZGVfc3dpdGNoX2NvbXBsZXRlKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sKQoreworCWdiX2Nvbm5lY3Rpb25fbW9kZV9zd2l0Y2hfY29tcGxldGUoY29udHJvbC0+Y29ubmVjdGlvbik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9jb250cm9sLmggYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9jb250cm9sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlhNjBkYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2NvbnRyb2wuaApAQCAtMCwwICsxLDY1IEBACisvKgorICogR3JleWJ1cyBDUG9ydCBjb250cm9sIHByb3RvY29sCisgKgorICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE1IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2lmbmRlZiBfX0NPTlRST0xfSAorI2RlZmluZSBfX0NPTlRST0xfSAorCitzdHJ1Y3QgZ2JfY29udHJvbCB7CisJc3RydWN0IGRldmljZSBkZXY7CisJc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZjsKKworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCisJdTggcHJvdG9jb2xfbWFqb3I7CisJdTggcHJvdG9jb2xfbWlub3I7CisKKwlib29sIGhhc19idW5kbGVfYWN0aXZhdGU7CisJYm9vbCBoYXNfYnVuZGxlX3ZlcnNpb247CisKKwljaGFyICp2ZW5kb3Jfc3RyaW5nOworCWNoYXIgKnByb2R1Y3Rfc3RyaW5nOworfTsKKyNkZWZpbmUgdG9fZ2JfY29udHJvbChkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IGdiX2NvbnRyb2wsIGRldikKKworc3RydWN0IGdiX2NvbnRyb2wgKmdiX2NvbnRyb2xfY3JlYXRlKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYpOworaW50IGdiX2NvbnRyb2xfZW5hYmxlKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sKTsKK3ZvaWQgZ2JfY29udHJvbF9kaXNhYmxlKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sKTsKK2ludCBnYl9jb250cm9sX3N1c3BlbmQoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wpOworaW50IGdiX2NvbnRyb2xfcmVzdW1lKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sKTsKK2ludCBnYl9jb250cm9sX2FkZChzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCk7Cit2b2lkIGdiX2NvbnRyb2xfZGVsKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sKTsKK3N0cnVjdCBnYl9jb250cm9sICpnYl9jb250cm9sX2dldChzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCk7Cit2b2lkIGdiX2NvbnRyb2xfcHV0KHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sKTsKKworaW50IGdiX2NvbnRyb2xfZ2V0X2J1bmRsZV92ZXJzaW9ucyhzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCk7CitpbnQgZ2JfY29udHJvbF9jb25uZWN0ZWRfb3BlcmF0aW9uKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sLCB1MTYgY3BvcnRfaWQpOworaW50IGdiX2NvbnRyb2xfZGlzY29ubmVjdGVkX29wZXJhdGlvbihzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCwgdTE2IGNwb3J0X2lkKTsKK2ludCBnYl9jb250cm9sX2Rpc2Nvbm5lY3Rpbmdfb3BlcmF0aW9uKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sLAorCQkJCQl1MTYgY3BvcnRfaWQpOworaW50IGdiX2NvbnRyb2xfbW9kZV9zd2l0Y2hfb3BlcmF0aW9uKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sKTsKK3ZvaWQgZ2JfY29udHJvbF9tb2RlX3N3aXRjaF9wcmVwYXJlKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sKTsKK3ZvaWQgZ2JfY29udHJvbF9tb2RlX3N3aXRjaF9jb21wbGV0ZShzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCk7CitpbnQgZ2JfY29udHJvbF9nZXRfbWFuaWZlc3Rfc2l6ZV9vcGVyYXRpb24oc3RydWN0IGdiX2ludGVyZmFjZSAqaW50Zik7CitpbnQgZ2JfY29udHJvbF9nZXRfbWFuaWZlc3Rfb3BlcmF0aW9uKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYsIHZvaWQgKm1hbmlmZXN0LAorCQkJCSAgICAgIHNpemVfdCBzaXplKTsKK2ludCBnYl9jb250cm9sX3RpbWVzeW5jX2VuYWJsZShzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCwgdTggY291bnQsCisJCQkgICAgICAgdTY0IGZyYW1lX3RpbWUsIHUzMiBzdHJvYmVfZGVsYXksIHUzMiByZWZjbGspOworaW50IGdiX2NvbnRyb2xfdGltZXN5bmNfZGlzYWJsZShzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCk7CitpbnQgZ2JfY29udHJvbF90aW1lc3luY19nZXRfbGFzdF9ldmVudChzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCwKKwkJCQkgICAgICAgdTY0ICpmcmFtZV90aW1lKTsKK2ludCBnYl9jb250cm9sX3RpbWVzeW5jX2F1dGhvcml0YXRpdmUoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wsCisJCQkJICAgICAgdTY0ICpmcmFtZV90aW1lKTsKK2ludCBnYl9jb250cm9sX2J1bmRsZV9zdXNwZW5kKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sLCB1OCBidW5kbGVfaWQpOworaW50IGdiX2NvbnRyb2xfYnVuZGxlX3Jlc3VtZShzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCwgdTggYnVuZGxlX2lkKTsKK2ludCBnYl9jb250cm9sX2J1bmRsZV9kZWFjdGl2YXRlKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sLCB1OCBidW5kbGVfaWQpOworaW50IGdiX2NvbnRyb2xfYnVuZGxlX2FjdGl2YXRlKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sLCB1OCBidW5kbGVfaWQpOworaW50IGdiX2NvbnRyb2xfaW50ZXJmYWNlX3N1c3BlbmRfcHJlcGFyZShzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCk7CitpbnQgZ2JfY29udHJvbF9pbnRlcmZhY2VfZGVhY3RpdmF0ZV9wcmVwYXJlKHN0cnVjdCBnYl9jb250cm9sICpjb250cm9sKTsKK2ludCBnYl9jb250cm9sX2ludGVyZmFjZV9oaWJlcm5hdGVfYWJvcnQoc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2wpOworI2VuZGlmIC8qIF9fQ09OVFJPTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA0OWU5YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2NvcmUuYwpAQCAtMCwwICsxLDM2MSBAQAorLyoKKyAqIEdyZXlidXMgIkNvcmUiCisgKgorICogQ29weXJpZ2h0IDIwMTQtMjAxNSBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTQtMjAxNSBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorI2luY2x1ZGUgImdyZXlidXNfdHJhY2UuaCIKKworI2RlZmluZSBHQl9CVU5ETEVfQVVUT1NVU1BFTkRfTVMJMzAwMAorCisvKiBBbGxvdyBncmV5YnVzIHRvIGJlIGRpc2FibGVkIGF0IGJvb3QgaWYgbmVlZGVkICovCitzdGF0aWMgYm9vbCBub2dyZXlidXM7CisjaWZkZWYgTU9EVUxFCittb2R1bGVfcGFyYW0obm9ncmV5YnVzLCBib29sLCAwNDQ0KTsKKyNlbHNlCitjb3JlX3BhcmFtKG5vZ3JleWJ1cywgbm9ncmV5YnVzLCBib29sLCAwNDQ0KTsKKyNlbmRpZgoraW50IGdyZXlidXNfZGlzYWJsZWQodm9pZCkKK3sKKwlyZXR1cm4gbm9ncmV5YnVzOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ3JleWJ1c19kaXNhYmxlZCk7CisKK3N0YXRpYyBib29sIGdyZXlidXNfbWF0Y2hfb25lX2lkKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBncmV5YnVzX2J1bmRsZV9pZCAqaWQpCit7CisJaWYgKChpZC0+bWF0Y2hfZmxhZ3MgJiBHUkVZQlVTX0lEX01BVENIX1ZFTkRPUikgJiYKKwkgICAgKGlkLT52ZW5kb3IgIT0gYnVuZGxlLT5pbnRmLT52ZW5kb3JfaWQpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoKGlkLT5tYXRjaF9mbGFncyAmIEdSRVlCVVNfSURfTUFUQ0hfUFJPRFVDVCkgJiYKKwkgICAgKGlkLT5wcm9kdWN0ICE9IGJ1bmRsZS0+aW50Zi0+cHJvZHVjdF9pZCkpCisJCXJldHVybiBmYWxzZTsKKworCWlmICgoaWQtPm1hdGNoX2ZsYWdzICYgR1JFWUJVU19JRF9NQVRDSF9DTEFTUykgJiYKKwkgICAgKGlkLT5jbGFzcyAhPSBidW5kbGUtPmNsYXNzKSkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3JleWJ1c19idW5kbGVfaWQgKgorZ3JleWJ1c19tYXRjaF9pZChzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUsIGNvbnN0IHN0cnVjdCBncmV5YnVzX2J1bmRsZV9pZCAqaWQpCit7CisJaWYgKGlkID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJZm9yICg7IGlkLT52ZW5kb3IgfHwgaWQtPnByb2R1Y3QgfHwgaWQtPmNsYXNzIHx8IGlkLT5kcml2ZXJfaW5mbzsKKwkJCQkJCQkJCWlkKyspIHsKKwkJaWYgKGdyZXlidXNfbWF0Y2hfb25lX2lkKGJ1bmRsZSwgaWQpKQorCQkJcmV0dXJuIGlkOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGdyZXlidXNfbWF0Y2hfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKK3sKKwlzdHJ1Y3QgZ3JleWJ1c19kcml2ZXIgKmRyaXZlciA9IHRvX2dyZXlidXNfZHJpdmVyKGRydik7CisJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlOworCWNvbnN0IHN0cnVjdCBncmV5YnVzX2J1bmRsZV9pZCAqaWQ7CisKKwlpZiAoIWlzX2diX2J1bmRsZShkZXYpKQorCQlyZXR1cm4gMDsKKworCWJ1bmRsZSA9IHRvX2diX2J1bmRsZShkZXYpOworCisJaWQgPSBncmV5YnVzX21hdGNoX2lkKGJ1bmRsZSwgZHJpdmVyLT5pZF90YWJsZSk7CisJaWYgKGlkKQorCQlyZXR1cm4gMTsKKwkvKiBGSVhNRSAtIER5bmFtaWMgaWRzPyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdyZXlidXNfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KQoreworCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQ7CisJc3RydWN0IGdiX21vZHVsZSAqbW9kdWxlID0gTlVMTDsKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmID0gTlVMTDsKKwlzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCA9IE5VTEw7CisJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlID0gTlVMTDsKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSBOVUxMOworCisJaWYgKGlzX2diX2hvc3RfZGV2aWNlKGRldikpIHsKKwkJaGQgPSB0b19nYl9ob3N0X2RldmljZShkZXYpOworCX0gZWxzZSBpZiAoaXNfZ2JfbW9kdWxlKGRldikpIHsKKwkJbW9kdWxlID0gdG9fZ2JfbW9kdWxlKGRldik7CisJCWhkID0gbW9kdWxlLT5oZDsKKwl9IGVsc2UgaWYgKGlzX2diX2ludGVyZmFjZShkZXYpKSB7CisJCWludGYgPSB0b19nYl9pbnRlcmZhY2UoZGV2KTsKKwkJbW9kdWxlID0gaW50Zi0+bW9kdWxlOworCQloZCA9IGludGYtPmhkOworCX0gZWxzZSBpZiAoaXNfZ2JfY29udHJvbChkZXYpKSB7CisJCWNvbnRyb2wgPSB0b19nYl9jb250cm9sKGRldik7CisJCWludGYgPSBjb250cm9sLT5pbnRmOworCQltb2R1bGUgPSBpbnRmLT5tb2R1bGU7CisJCWhkID0gaW50Zi0+aGQ7CisJfSBlbHNlIGlmIChpc19nYl9idW5kbGUoZGV2KSkgeworCQlidW5kbGUgPSB0b19nYl9idW5kbGUoZGV2KTsKKwkJaW50ZiA9IGJ1bmRsZS0+aW50ZjsKKwkJbW9kdWxlID0gaW50Zi0+bW9kdWxlOworCQloZCA9IGludGYtPmhkOworCX0gZWxzZSBpZiAoaXNfZ2Jfc3ZjKGRldikpIHsKKwkJc3ZjID0gdG9fZ2Jfc3ZjKGRldik7CisJCWhkID0gc3ZjLT5oZDsKKwl9IGVsc2UgeworCQlkZXZfV0FSTihkZXYsICJ1ZXZlbnQgZm9yIHVua25vd24gZ3JleWJ1cyBkZXZpY2UgXCJ0eXBlXCIhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGFkZF91ZXZlbnRfdmFyKGVudiwgIkJVUz0ldSIsIGhkLT5idXNfaWQpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChtb2R1bGUpIHsKKwkJaWYgKGFkZF91ZXZlbnRfdmFyKGVudiwgIk1PRFVMRT0ldSIsIG1vZHVsZS0+bW9kdWxlX2lkKSkKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChpbnRmKSB7CisJCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJJTlRFUkZBQ0U9JXUiLCBpbnRmLT5pbnRlcmZhY2VfaWQpKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJHUkVZQlVTX0lEPSUwOHgvJTA4eCIsCisJCQkJICAgaW50Zi0+dmVuZG9yX2lkLCBpbnRmLT5wcm9kdWN0X2lkKSkKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChidW5kbGUpIHsKKwkJLy8gRklYTUUKKwkJLy8gYWRkIGEgdWV2ZW50IHRoYXQgY2FuICJsb2FkIiBhIGJ1bmRsZSB0eXBlCisJCS8vIFRoaXMgaXMgd2hhdCB3ZSBuZWVkIHRvIGJpbmQgYSBkcml2ZXIgdG8gc28gdXNlIHRoZSBpbmZvCisJCS8vIGluIGdtb2QgaGVyZSBhcyB3ZWxsCisKKwkJaWYgKGFkZF91ZXZlbnRfdmFyKGVudiwgIkJVTkRMRT0ldSIsIGJ1bmRsZS0+aWQpKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJCVU5ETEVfQ0xBU1M9JTAyeCIsIGJ1bmRsZS0+Y2xhc3MpKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdyZXlidXNfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmIChpc19nYl9ob3N0X2RldmljZShkZXYpKSB7CisJCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQ7CisKKwkJaGQgPSB0b19nYl9ob3N0X2RldmljZShkZXYpOworCQlnYl9oZF9zaHV0ZG93bihoZCk7CisJfQorfQorCitzdHJ1Y3QgYnVzX3R5cGUgZ3JleWJ1c19idXNfdHlwZSA9IHsKKwkubmFtZSA9CQkiZ3JleWJ1cyIsCisJLm1hdGNoID0JZ3JleWJ1c19tYXRjaF9kZXZpY2UsCisJLnVldmVudCA9CWdyZXlidXNfdWV2ZW50LAorCS5zaHV0ZG93biA9CWdyZXlidXNfc2h1dGRvd24sCit9OworCitzdGF0aWMgaW50IGdyZXlidXNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBncmV5YnVzX2RyaXZlciAqZHJpdmVyID0gdG9fZ3JleWJ1c19kcml2ZXIoZGV2LT5kcml2ZXIpOworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSA9IHRvX2diX2J1bmRsZShkZXYpOworCWNvbnN0IHN0cnVjdCBncmV5YnVzX2J1bmRsZV9pZCAqaWQ7CisJaW50IHJldHZhbDsKKworCS8qIG1hdGNoIGlkICovCisJaWQgPSBncmV5YnVzX21hdGNoX2lkKGJ1bmRsZSwgZHJpdmVyLT5pZF90YWJsZSk7CisJaWYgKCFpZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR2YWwgPSBwbV9ydW50aW1lX2dldF9zeW5jKCZidW5kbGUtPmludGYtPmRldik7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJcG1fcnVudGltZV9wdXRfbm9pZGxlKCZidW5kbGUtPmludGYtPmRldik7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJcmV0dmFsID0gZ2JfY29udHJvbF9idW5kbGVfYWN0aXZhdGUoYnVuZGxlLT5pbnRmLT5jb250cm9sLCBidW5kbGUtPmlkKTsKKwlpZiAocmV0dmFsKSB7CisJCXBtX3J1bnRpbWVfcHV0KCZidW5kbGUtPmludGYtPmRldik7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJLyoKKwkgKiBVbmJvdW5kIGJ1bmRsZSBkZXZpY2VzIGFyZSBhbHdheXMgZGVhY3RpdmF0ZWQuIER1cmluZyBwcm9iZSwgdGhlCisJICogUnVudGltZSBQTSBpcyBzZXQgdG8gZW5hYmxlZCBhbmQgYWN0aXZlIGFuZCB0aGUgdXNhZ2UgY291bnQgaXMKKwkgKiBpbmNyZW1lbnRlZC4gSWYgdGhlIGRyaXZlciBzdXBwb3J0cyBydW50aW1lIFBNLCBpdCBzaG91bGQgY2FsbAorCSAqIHBtX3J1bnRpbWVfcHV0KCkgaW4gaXRzIHByb2JlIHJvdXRpbmUgYW5kIHBtX3J1bnRpbWVfZ2V0X3N5bmMoKQorCSAqIGluIHJlbW92ZSByb3V0aW5lLgorCSAqLworCXBtX3J1bnRpbWVfc2V0X2F1dG9zdXNwZW5kX2RlbGF5KGRldiwgR0JfQlVORExFX0FVVE9TVVNQRU5EX01TKTsKKwlwbV9ydW50aW1lX3VzZV9hdXRvc3VzcGVuZChkZXYpOworCXBtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKGRldik7CisJcG1fcnVudGltZV9zZXRfYWN0aXZlKGRldik7CisJcG1fcnVudGltZV9lbmFibGUoZGV2KTsKKworCXJldHZhbCA9IGRyaXZlci0+cHJvYmUoYnVuZGxlLCBpZCk7CisJaWYgKHJldHZhbCkgeworCQkvKgorCQkgKiBDYXRjaCBidWdneSBkcml2ZXJzIHRoYXQgZmFpbCB0byBkZXN0cm95IHRoZWlyIGNvbm5lY3Rpb25zLgorCQkgKi8KKwkJV0FSTl9PTighbGlzdF9lbXB0eSgmYnVuZGxlLT5jb25uZWN0aW9ucykpOworCisJCWdiX2NvbnRyb2xfYnVuZGxlX2RlYWN0aXZhdGUoYnVuZGxlLT5pbnRmLT5jb250cm9sLCBidW5kbGUtPmlkKTsKKworCQlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKKwkJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKGRldik7CisJCXBtX3J1bnRpbWVfcHV0X25vaWRsZShkZXYpOworCQlwbV9ydW50aW1lX2RvbnRfdXNlX2F1dG9zdXNwZW5kKGRldik7CisJCXBtX3J1bnRpbWVfcHV0KCZidW5kbGUtPmludGYtPmRldik7CisKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlnYl90aW1lc3luY19zY2hlZHVsZV9zeW5jaHJvbm91cyhidW5kbGUtPmludGYpOworCisJcG1fcnVudGltZV9wdXQoJmJ1bmRsZS0+aW50Zi0+ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdyZXlidXNfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ3JleWJ1c19kcml2ZXIgKmRyaXZlciA9IHRvX2dyZXlidXNfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUgPSB0b19nYl9idW5kbGUoZGV2KTsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gcG1fcnVudGltZV9nZXRfc3luYyhkZXYpOworCWlmIChyZXR2YWwgPCAwKQorCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZXN1bWUgYnVuZGxlOiAlZFxuIiwgcmV0dmFsKTsKKworCS8qCisJICogRGlzYWJsZSAobm9uLW9mZmxvYWRlZCkgY29ubmVjdGlvbnMgZWFybHkgaW4gY2FzZSB0aGUgaW50ZXJmYWNlIGlzCisJICogYWxyZWFkeSBnb25lIHRvIGF2b2lkIHVuY2VjY2Vzc2FyeSBvcGVyYXRpb24gdGltZW91dHMgZHVyaW5nCisJICogZHJpdmVyIGRpc2Nvbm5lY3QuIE90aGVyd2lzZSwgb25seSBkaXNhYmxlIGluY29taW5nIHJlcXVlc3RzLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdGlvbiwgJmJ1bmRsZS0+Y29ubmVjdGlvbnMsIGJ1bmRsZV9saW5rcykgeworCQlpZiAoZ2JfY29ubmVjdGlvbl9pc19vZmZsb2FkZWQoY29ubmVjdGlvbikpCisJCQljb250aW51ZTsKKworCQlpZiAoYnVuZGxlLT5pbnRmLT5kaXNjb25uZWN0ZWQpCisJCQlnYl9jb25uZWN0aW9uX2Rpc2FibGVfZm9yY2VkKGNvbm5lY3Rpb24pOworCQllbHNlCisJCQlnYl9jb25uZWN0aW9uX2Rpc2FibGVfcngoY29ubmVjdGlvbik7CisJfQorCisJZHJpdmVyLT5kaXNjb25uZWN0KGJ1bmRsZSk7CisKKwkvKiBDYXRjaCBidWdneSBkcml2ZXJzIHRoYXQgZmFpbCB0byBkZXN0cm95IHRoZWlyIGNvbm5lY3Rpb25zLiAqLworCVdBUk5fT04oIWxpc3RfZW1wdHkoJmJ1bmRsZS0+Y29ubmVjdGlvbnMpKTsKKworCWlmICghYnVuZGxlLT5pbnRmLT5kaXNjb25uZWN0ZWQpCisJCWdiX2NvbnRyb2xfYnVuZGxlX2RlYWN0aXZhdGUoYnVuZGxlLT5pbnRmLT5jb250cm9sLCBidW5kbGUtPmlkKTsKKworCXBtX3J1bnRpbWVfcHV0X25vaWRsZShkZXYpOworCXBtX3J1bnRpbWVfZGlzYWJsZShkZXYpOworCXBtX3J1bnRpbWVfc2V0X3N1c3BlbmRlZChkZXYpOworCXBtX3J1bnRpbWVfZG9udF91c2VfYXV0b3N1c3BlbmQoZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9ub2lkbGUoZGV2KTsKKworCXJldHVybiAwOworfQorCitpbnQgZ3JleWJ1c19yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGdyZXlidXNfZHJpdmVyICpkcml2ZXIsIHN0cnVjdCBtb2R1bGUgKm93bmVyLAorCQljb25zdCBjaGFyICptb2RfbmFtZSkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKGdyZXlidXNfZGlzYWJsZWQoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkcml2ZXItPmRyaXZlci5idXMgPSAmZ3JleWJ1c19idXNfdHlwZTsKKwlkcml2ZXItPmRyaXZlci5uYW1lID0gZHJpdmVyLT5uYW1lOworCWRyaXZlci0+ZHJpdmVyLnByb2JlID0gZ3JleWJ1c19wcm9iZTsKKwlkcml2ZXItPmRyaXZlci5yZW1vdmUgPSBncmV5YnVzX3JlbW92ZTsKKwlkcml2ZXItPmRyaXZlci5vd25lciA9IG93bmVyOworCWRyaXZlci0+ZHJpdmVyLm1vZF9uYW1lID0gbW9kX25hbWU7CisKKwlyZXR2YWwgPSBkcml2ZXJfcmVnaXN0ZXIoJmRyaXZlci0+ZHJpdmVyKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJcHJfaW5mbygicmVnaXN0ZXJlZCBuZXcgZHJpdmVyICVzXG4iLCBkcml2ZXItPm5hbWUpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ3JleWJ1c19yZWdpc3Rlcl9kcml2ZXIpOworCit2b2lkIGdyZXlidXNfZGVyZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGdyZXlidXNfZHJpdmVyICpkcml2ZXIpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlci0+ZHJpdmVyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdyZXlidXNfZGVyZWdpc3Rlcl9kcml2ZXIpOworCitzdGF0aWMgaW50IF9faW5pdCBnYl9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCWlmIChncmV5YnVzX2Rpc2FibGVkKCkpCisJCXJldHVybiAtRU5PREVWOworCisJQlVJTERfQlVHX09OKENQT1JUX0lEX01BWCA+PSAobG9uZylDUE9SVF9JRF9CQUQpOworCisJZ2JfZGVidWdmc19pbml0KCk7CisKKwlyZXR2YWwgPSBidXNfcmVnaXN0ZXIoJmdyZXlidXNfYnVzX3R5cGUpOworCWlmIChyZXR2YWwpIHsKKwkJcHJfZXJyKCJidXNfcmVnaXN0ZXIgZmFpbGVkICglZClcbiIsIHJldHZhbCk7CisJCWdvdG8gZXJyb3JfYnVzOworCX0KKworCXJldHZhbCA9IGdiX2hkX2luaXQoKTsKKwlpZiAocmV0dmFsKSB7CisJCXByX2VycigiZ2JfaGRfaW5pdCBmYWlsZWQgKCVkKVxuIiwgcmV0dmFsKTsKKwkJZ290byBlcnJvcl9oZDsKKwl9CisKKwlyZXR2YWwgPSBnYl9vcGVyYXRpb25faW5pdCgpOworCWlmIChyZXR2YWwpIHsKKwkJcHJfZXJyKCJnYl9vcGVyYXRpb25faW5pdCBmYWlsZWQgKCVkKVxuIiwgcmV0dmFsKTsKKwkJZ290byBlcnJvcl9vcGVyYXRpb247CisJfQorCisJcmV0dmFsID0gZ2JfdGltZXN5bmNfaW5pdCgpOworCWlmIChyZXR2YWwpIHsKKwkJcHJfZXJyKCJnYl90aW1lc3luY19pbml0IGZhaWxlZFxuIik7CisJCWdvdG8gZXJyb3JfdGltZXN5bmM7CisJfQorCXJldHVybiAwOwkvKiBTdWNjZXNzICovCisKK2Vycm9yX3RpbWVzeW5jOgorCWdiX29wZXJhdGlvbl9leGl0KCk7CitlcnJvcl9vcGVyYXRpb246CisJZ2JfaGRfZXhpdCgpOworZXJyb3JfaGQ6CisJYnVzX3VucmVnaXN0ZXIoJmdyZXlidXNfYnVzX3R5cGUpOworZXJyb3JfYnVzOgorCWdiX2RlYnVnZnNfY2xlYW51cCgpOworCisJcmV0dXJuIHJldHZhbDsKK30KK21vZHVsZV9pbml0KGdiX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgZ2JfZXhpdCh2b2lkKQoreworCWdiX3RpbWVzeW5jX2V4aXQoKTsKKwlnYl9vcGVyYXRpb25fZXhpdCgpOworCWdiX2hkX2V4aXQoKTsKKwlidXNfdW5yZWdpc3RlcigmZ3JleWJ1c19idXNfdHlwZSk7CisJZ2JfZGVidWdmc19jbGVhbnVwKCk7CisJdHJhY2Vwb2ludF9zeW5jaHJvbml6ZV91bnJlZ2lzdGVyKCk7Cit9Cittb2R1bGVfZXhpdChnYl9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BVVRIT1IoIkdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQGxpbnV4Zm91bmRhdGlvbi5vcmc+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9kZWJ1Z2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlkNGQzZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2RlYnVnZnMuYwpAQCAtMCwwICsxLDMxIEBACisvKgorICogR3JleWJ1cyBkZWJ1Z2ZzIGNvZGUKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTQgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZ2JfZGVidWdfcm9vdDsKKwordm9pZCBfX2luaXQgZ2JfZGVidWdmc19pbml0KHZvaWQpCit7CisJZ2JfZGVidWdfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcigiZ3JleWJ1cyIsIE5VTEwpOworfQorCit2b2lkIGdiX2RlYnVnZnNfY2xlYW51cCh2b2lkKQoreworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShnYl9kZWJ1Z19yb290KTsKKwlnYl9kZWJ1Z19yb290ID0gTlVMTDsKK30KKworc3RydWN0IGRlbnRyeSAqZ2JfZGVidWdmc19nZXQodm9pZCkKK3sKKwlyZXR1cm4gZ2JfZGVidWdfcm9vdDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2RlYnVnZnNfZ2V0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2VzMi5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZXMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcxYmIxYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2VzMi5jCkBAIC0wLDAgKzEsMTU5NyBAQAorLyoKKyAqIEdyZXlidXMgIkFQIiBVU0IgZHJpdmVyIGZvciAiRVMyIiBjb250cm9sbGVyIGNoaXBzCisgKgorICogQ29weXJpZ2h0IDIwMTQtMjAxNSBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTQtMjAxNSBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NpemVzLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworI2luY2x1ZGUgImFycGMuaCIKKyNpbmNsdWRlICJncmV5YnVzLmgiCisjaW5jbHVkZSAiZ3JleWJ1c190cmFjZS5oIgorI2luY2x1ZGUgImNvbm5lY3Rpb24uaCIKKworCisvKiBEZWZhdWx0IHRpbWVvdXQgZm9yIFVTQiB2ZW5kb3IgcmVxdWVzdHMuICovCisjZGVmaW5lIEVTMl9VU0JfQ1RSTF9USU1FT1VUCTUwMAorCisvKiBEZWZhdWx0IHRpbWVvdXQgZm9yIEFSUEMgQ1BvcnQgcmVxdWVzdHMgKi8KKyNkZWZpbmUgRVMyX0FSUENfQ1BPUlRfVElNRU9VVAk1MDAKKworLyogRml4ZWQgQ1BvcnQgbnVtYmVycyAqLworI2RlZmluZSBFUzJfQ1BPUlRfQ0RTSTAJCTE2CisjZGVmaW5lIEVTMl9DUE9SVF9DRFNJMQkJMTcKKworLyogTWVtb3J5IHNpemVzIGZvciB0aGUgYnVmZmVycyBzZW50IHRvL2Zyb20gdGhlIEVTMiBjb250cm9sbGVyICovCisjZGVmaW5lIEVTMl9HQlVGX01TR19TSVpFX01BWAkyMDQ4CisKKy8qIE1lbW9yeSBzaXplcyBmb3IgdGhlIEFSUEMgYnVmZmVycyAqLworI2RlZmluZSBBUlBDX09VVF9TSVpFX01BWAlVMTZfTUFYCisjZGVmaW5lIEFSUENfSU5fU0laRV9NQVgJMTI4CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZVtdID0geworCXsgVVNCX0RFVklDRSgweDE4ZDEsIDB4MWVhZikgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGlkX3RhYmxlKTsKKworI2RlZmluZSBBUEIxX0xPR19TSVpFCQlTWl8xNksKKworLyoKKyAqIE51bWJlciBvZiBDUG9ydCBJTiB1cmJzIGluIGZsaWdodCBhdCBhbnkgcG9pbnQgaW4gdGltZS4KKyAqIEFkanVzdCBpZiB3ZSBhcmUgaGF2aW5nIHN0YWxscyBpbiB0aGUgVVNCIGJ1ZmZlciBkdWUgdG8gbm90IGVub3VnaCB1cmJzIGluCisgKiBmbGlnaHQuCisgKi8KKyNkZWZpbmUgTlVNX0NQT1JUX0lOX1VSQgk0CisKKy8qIE51bWJlciBvZiBDUG9ydCBPVVQgdXJicyBpbiBmbGlnaHQgYXQgYW55IHBvaW50IGluIHRpbWUuCisgKiBBZGp1c3QgaWYgd2UgZ2V0IG1lc3NhZ2VzIHNheWluZyB3ZSBhcmUgb3V0IG9mIHVyYnMgaW4gdGhlIHN5c3RlbSBsb2cuCisgKi8KKyNkZWZpbmUgTlVNX0NQT1JUX09VVF9VUkIJOAorCisvKgorICogTnVtYmVyIG9mIEFSUEMgaW4gdXJicyBpbiBmbGlnaHQgYXQgYW55IHBvaW50IGluIHRpbWUuCisgKi8KKyNkZWZpbmUgTlVNX0FSUENfSU5fVVJCCQkyCisKKy8qCisgKiBAZW5kcG9pbnQ6IGJ1bGsgaW4gZW5kcG9pbnQgZm9yIENQb3J0IGRhdGEKKyAqIEB1cmI6IGFycmF5IG9mIHVyYnMgZm9yIHRoZSBDUG9ydCBpbiBtZXNzYWdlcworICogQGJ1ZmZlcjogYXJyYXkgb2YgYnVmZmVycyBmb3IgdGhlIEBjcG9ydF9pbl91cmIgdXJicworICovCitzdHJ1Y3QgZXMyX2Nwb3J0X2luIHsKKwlfX3U4IGVuZHBvaW50OworCXN0cnVjdCB1cmIgKnVyYltOVU1fQ1BPUlRfSU5fVVJCXTsKKwl1OCAqYnVmZmVyW05VTV9DUE9SVF9JTl9VUkJdOworfTsKKworLyoqCisgKiBlczJfYXBfZGV2IC0gRVMyIFVTQiBCcmlkZ2UgdG8gQVAgc3RydWN0dXJlCisgKiBAdXNiX2RldjogcG9pbnRlciB0byB0aGUgVVNCIGRldmljZSB3ZSBhcmUuCisgKiBAdXNiX2ludGY6IHBvaW50ZXIgdG8gdGhlIFVTQiBpbnRlcmZhY2Ugd2UgYXJlIGJvdW5kIHRvLgorICogQGhkOiBwb2ludGVyIHRvIG91ciBnYl9ob3N0X2RldmljZSBzdHJ1Y3R1cmUKKworICogQGNwb3J0X2luOiBlbmRwb2ludCwgdXJicyBhbmQgYnVmZmVyIGZvciBjcG9ydCBpbiBtZXNzYWdlcworICogQGNwb3J0X291dF9lbmRwb2ludDogZW5kcG9pbnQgZm9yIGZvciBjcG9ydCBvdXQgbWVzc2FnZXMKKyAqIEBjcG9ydF9vdXRfdXJiOiBhcnJheSBvZiB1cmJzIGZvciB0aGUgQ1BvcnQgb3V0IG1lc3NhZ2VzCisgKiBAY3BvcnRfb3V0X3VyYl9idXN5OiBhcnJheSBvZiBmbGFncyB0byBzZWUgaWYgdGhlIEBjcG9ydF9vdXRfdXJiIGlzIGJ1c3kgb3IKKyAqCQkJbm90LgorICogQGNwb3J0X291dF91cmJfY2FuY2VsbGVkOiBhcnJheSBvZiBmbGFncyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlCisgKgkJCWNvcnJlc3BvbmRpbmcgQGNwb3J0X291dF91cmIgaXMgYmVpbmcgY2FuY2VsbGVkCisgKiBAY3BvcnRfb3V0X3VyYl9sb2NrOiBsb2NrcyB0aGUgQGNwb3J0X291dF91cmJfYnVzeSAibGlzdCIKKyAqCisgKiBAYXBiX2xvZ190YXNrOiB0YXNrIHBvaW50ZXIgZm9yIGxvZ2dpbmcgdGhyZWFkCisgKiBAYXBiX2xvZ19kZW50cnk6IGZpbGUgc3lzdGVtIGVudHJ5IGZvciB0aGUgbG9nIGZpbGUgaW50ZXJmYWNlCisgKiBAYXBiX2xvZ19lbmFibGVfZGVudHJ5OiBmaWxlIHN5c3RlbSBlbnRyeSBmb3IgZW5hYmxpbmcgbG9nZ2luZworICogQGFwYl9sb2dfZmlmbzoga2VybmVsIEZJRk8gdG8gY2FycnkgbG9nZ2VkIGRhdGEKKyAqIEBhcnBjX3VyYjogYXJyYXkgb2YgdXJicyBmb3IgdGhlIEFSUEMgaW4gbWVzc2FnZXMKKyAqIEBhcnBjX2J1ZmZlcjogYXJyYXkgb2YgYnVmZmVycyBmb3IgdGhlIEBhcnBjX3VyYiB1cmJzCisgKiBAYXJwY19lbmRwb2ludF9pbjogYnVsayBpbiBlbmRwb2ludCBmb3IgQVBCcmlkZ2VBIFJQQworICogQGFycGNfaWRfY3ljbGU6IGdpdmVzIGFuIHVuaXF1ZSBpZCB0byBBUlBDCisgKiBAYXJwY19sb2NrOiBsb2NrcyBBUlBDIGxpc3QKKyAqIEBhcnBjczogbGlzdCBvZiBpbiBwcm9ncmVzcyBBUlBDcworICovCitzdHJ1Y3QgZXMyX2FwX2RldiB7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXY7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKnVzYl9pbnRmOworCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQ7CisKKwlzdHJ1Y3QgZXMyX2Nwb3J0X2luIGNwb3J0X2luOworCV9fdTggY3BvcnRfb3V0X2VuZHBvaW50OworCXN0cnVjdCB1cmIgKmNwb3J0X291dF91cmJbTlVNX0NQT1JUX09VVF9VUkJdOworCWJvb2wgY3BvcnRfb3V0X3VyYl9idXN5W05VTV9DUE9SVF9PVVRfVVJCXTsKKwlib29sIGNwb3J0X291dF91cmJfY2FuY2VsbGVkW05VTV9DUE9SVF9PVVRfVVJCXTsKKwlzcGlubG9ja190IGNwb3J0X291dF91cmJfbG9jazsKKworCWJvb2wgY2RzaTFfaW5fdXNlOworCisJc3RydWN0IHRhc2tfc3RydWN0ICphcGJfbG9nX3Rhc2s7CisJc3RydWN0IGRlbnRyeSAqYXBiX2xvZ19kZW50cnk7CisJc3RydWN0IGRlbnRyeSAqYXBiX2xvZ19lbmFibGVfZGVudHJ5OworCURFQ0xBUkVfS0ZJRk8oYXBiX2xvZ19maWZvLCBjaGFyLCBBUEIxX0xPR19TSVpFKTsKKworCV9fdTggYXJwY19lbmRwb2ludF9pbjsKKwlzdHJ1Y3QgdXJiICphcnBjX3VyYltOVU1fQVJQQ19JTl9VUkJdOworCXU4ICphcnBjX2J1ZmZlcltOVU1fQVJQQ19JTl9VUkJdOworCisJaW50IGFycGNfaWRfY3ljbGU7CisJc3BpbmxvY2tfdCBhcnBjX2xvY2s7CisJc3RydWN0IGxpc3RfaGVhZCBhcnBjczsKK307CisKKy8qKgorICogdGltZXN5bmNfZW5hYmxlX3JlcXVlc3QgLSBFbmFibGUgdGltZXN5bmMgaW4gYW4gQVBCcmlkZ2UKKyAqIEBjb3VudDogbnVtYmVyIG9mIFRpbWVTeW5jIFB1bHNlcyB0byBleHBlY3QKKyAqIEBmcmFtZV90aW1lOiB0aGUgaW5pdGlhbCBGcmFtZVRpbWUgYXQgdGhlIGZpcnN0IFRpbWVTeW5jIFB1bHNlCisgKiBAc3Ryb2JlX2RlbGF5OiB0aGUgZXhwZWN0ZWQgZGVsYXkgaW4gbWljcm9zZWNvbmRzIGJldHdlZW4gZWFjaCBUaW1lU3luYyBQdWxzZQorICogQHJlZmNsazogVGhlIEFQIG1hbmRhdGVkIHJlZmVyZW5jZSBjbG9jayB0byBydW4gRnJhbWVUaW1lIGF0CisgKi8KK3N0cnVjdCB0aW1lc3luY19lbmFibGVfcmVxdWVzdCB7CisJX191OAljb3VudDsKKwlfX2xlNjQJZnJhbWVfdGltZTsKKwlfX2xlMzIJc3Ryb2JlX2RlbGF5OworCV9fbGUzMglyZWZjbGs7Cit9IF9fcGFja2VkOworCisvKioKKyAqIHRpbWVzeW5jX2F1dGhvcml0YXRpdmVfcmVxdWVzdCAtIFRyYW5zbWl0IGF1dGhvcml0YXRpdmUgRnJhbWVUaW1lIHRvIEFQQnJpZGdlCisgKiBAZnJhbWVfdGltZTogQW4gYXJyYXkgb2YgYXV0aG9yaXRhdGl2ZSBGcmFtZVRpbWVzIHByb3ZpZGVkIGJ5IHRoZSBTVkMKKyAqICAgICAgICAgICAgICBhbmQgcmVsYXllZCB0byB0aGUgQVBCcmlkZ2UgYnkgdGhlIEFQCisgKi8KK3N0cnVjdCB0aW1lc3luY19hdXRob3JpdGF0aXZlX3JlcXVlc3QgeworCV9fbGU2NAlmcmFtZV90aW1lW0dCX1RJTUVTWU5DX01BWF9TVFJPQkVTXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhcnBjIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGFycGNfcmVxdWVzdF9tZXNzYWdlICpyZXE7CisJc3RydWN0IGFycGNfcmVzcG9uc2VfbWVzc2FnZSAqcmVzcDsKKwlzdHJ1Y3QgY29tcGxldGlvbiByZXNwb25zZV9yZWNlaXZlZDsKKwlib29sIGFjdGl2ZTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGVzMl9hcF9kZXYgKmhkX3RvX2VzMihzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkKQoreworCXJldHVybiAoc3RydWN0IGVzMl9hcF9kZXYgKikmaGQtPmhkX3ByaXY7Cit9CisKK3N0YXRpYyB2b2lkIGNwb3J0X291dF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpOworc3RhdGljIHZvaWQgdXNiX2xvZ19lbmFibGUoc3RydWN0IGVzMl9hcF9kZXYgKmVzMik7CitzdGF0aWMgdm9pZCB1c2JfbG9nX2Rpc2FibGUoc3RydWN0IGVzMl9hcF9kZXYgKmVzMik7CitzdGF0aWMgaW50IGFycGNfc3luYyhzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyLCB1OCB0eXBlLCB2b2lkICpwYXlsb2FkLAorCQkgICAgIHNpemVfdCBzaXplLCBpbnQgKnJlc3VsdCwgdW5zaWduZWQgaW50IHRpbWVvdXQpOworCitzdGF0aWMgaW50IG91dHB1dF9zeW5jKHN0cnVjdCBlczJfYXBfZGV2ICplczIsIHZvaWQgKnJlcSwgdTE2IHNpemUsIHU4IGNtZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGVzMi0+dXNiX2RldjsKKwl1OCAqZGF0YTsKKwlpbnQgcmV0dmFsOworCisJZGF0YSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1jcHkoZGF0YSwgcmVxLCBzaXplKTsKKworCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCisJCQkJIGNtZCwKKwkJCQkgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfAorCQkJCSBVU0JfUkVDSVBfSU5URVJGQUNFLAorCQkJCSAwLCAwLCBkYXRhLCBzaXplLCBFUzJfVVNCX0NUUkxfVElNRU9VVCk7CisJaWYgKHJldHZhbCA8IDApCisJCWRldl9lcnIoJnVkZXYtPmRldiwgIiVzOiByZXR1cm4gZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXR2YWwpOworCWVsc2UKKwkJcmV0dmFsID0gMDsKKworCWtmcmVlKGRhdGEpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGFwX3VyYl9jb21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqZHIgPSB1cmItPmNvbnRleHQ7CisKKwlrZnJlZShkcik7CisJdXNiX2ZyZWVfdXJiKHVyYik7Cit9CisKK3N0YXRpYyBpbnQgb3V0cHV0X2FzeW5jKHN0cnVjdCBlczJfYXBfZGV2ICplczIsIHZvaWQgKnJlcSwgdTE2IHNpemUsIHU4IGNtZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGVzMi0+dXNiX2RldjsKKwlzdHJ1Y3QgdXJiICp1cmI7CisJc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqZHI7CisJdTggKmJ1ZjsKKwlpbnQgcmV0dmFsOworCisJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXVyYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkciA9IGttYWxsb2Moc2l6ZW9mKCpkcikgKyBzaXplLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWRyKSB7CisJCXVzYl9mcmVlX3VyYih1cmIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlidWYgPSAodTggKilkciArIHNpemVvZigqZHIpOworCW1lbWNweShidWYsIHJlcSwgc2l6ZSk7CisKKwlkci0+YlJlcXVlc3QgPSBjbWQ7CisJZHItPmJSZXF1ZXN0VHlwZSA9IFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRTsKKwlkci0+d1ZhbHVlID0gMDsKKwlkci0+d0luZGV4ID0gMDsKKwlkci0+d0xlbmd0aCA9IGNwdV90b19sZTE2KHNpemUpOworCisJdXNiX2ZpbGxfY29udHJvbF91cmIodXJiLCB1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCisJCQkgICAgICh1bnNpZ25lZCBjaGFyICopZHIsIGJ1Ziwgc2l6ZSwKKwkJCSAgICAgYXBfdXJiX2NvbXBsZXRlLCBkcik7CisJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAocmV0dmFsKSB7CisJCXVzYl9mcmVlX3VyYih1cmIpOworCQlrZnJlZShkcik7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgb3V0cHV0KHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHZvaWQgKnJlcSwgdTE2IHNpemUsIHU4IGNtZCwKKwkJICAgICBib29sIGFzeW5jKQoreworCXN0cnVjdCBlczJfYXBfZGV2ICplczIgPSBoZF90b19lczIoaGQpOworCisJaWYgKGFzeW5jKQorCQlyZXR1cm4gb3V0cHV0X2FzeW5jKGVzMiwgcmVxLCBzaXplLCBjbWQpOworCisJcmV0dXJuIG91dHB1dF9zeW5jKGVzMiwgcmVxLCBzaXplLCBjbWQpOworfQorCitzdGF0aWMgaW50IGVzMl9jcG9ydF9pbl9lbmFibGUoc3RydWN0IGVzMl9hcF9kZXYgKmVzMiwKKwkJCQlzdHJ1Y3QgZXMyX2Nwb3J0X2luICpjcG9ydF9pbikKK3sKKwlzdHJ1Y3QgdXJiICp1cmI7CisJaW50IHJldDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fQ1BPUlRfSU5fVVJCOyArK2kpIHsKKwkJdXJiID0gY3BvcnRfaW4tPnVyYltpXTsKKworCQlyZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9LRVJORUwpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZlczItPnVzYl9kZXYtPmRldiwKKwkJCQkJImZhaWxlZCB0byBzdWJtaXQgaW4tdXJiOiAlZFxuIiwgcmV0KTsKKwkJCWdvdG8gZXJyX2tpbGxfdXJiczsKKwkJfQorCX0KKworCXJldHVybiAwOworCitlcnJfa2lsbF91cmJzOgorCWZvciAoLS1pOyBpID49IDA7IC0taSkgeworCQl1cmIgPSBjcG9ydF9pbi0+dXJiW2ldOworCQl1c2Jfa2lsbF91cmIodXJiKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBlczJfY3BvcnRfaW5fZGlzYWJsZShzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyLAorCQkJCXN0cnVjdCBlczJfY3BvcnRfaW4gKmNwb3J0X2luKQoreworCXN0cnVjdCB1cmIgKnVyYjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fQ1BPUlRfSU5fVVJCOyArK2kpIHsKKwkJdXJiID0gY3BvcnRfaW4tPnVyYltpXTsKKwkJdXNiX2tpbGxfdXJiKHVyYik7CisJfQorfQorCitzdGF0aWMgaW50IGVzMl9hcnBjX2luX2VuYWJsZShzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyKQoreworCXN0cnVjdCB1cmIgKnVyYjsKKwlpbnQgcmV0OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9BUlBDX0lOX1VSQjsgKytpKSB7CisJCXVyYiA9IGVzMi0+YXJwY191cmJbaV07CisKKwkJcmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmZXMyLT51c2JfZGV2LT5kZXYsCisJCQkJImZhaWxlZCB0byBzdWJtaXQgYXJwYyBpbi11cmI6ICVkXG4iLCByZXQpOworCQkJZ290byBlcnJfa2lsbF91cmJzOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9raWxsX3VyYnM6CisJZm9yICgtLWk7IGkgPj0gMDsgLS1pKSB7CisJCXVyYiA9IGVzMi0+YXJwY191cmJbaV07CisJCXVzYl9raWxsX3VyYih1cmIpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGVzMl9hcnBjX2luX2Rpc2FibGUoc3RydWN0IGVzMl9hcF9kZXYgKmVzMikKK3sKKwlzdHJ1Y3QgdXJiICp1cmI7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0FSUENfSU5fVVJCOyArK2kpIHsKKwkJdXJiID0gZXMyLT5hcnBjX3VyYltpXTsKKwkJdXNiX2tpbGxfdXJiKHVyYik7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHVyYiAqbmV4dF9mcmVlX3VyYihzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyLCBnZnBfdCBnZnBfbWFzaykKK3sKKwlzdHJ1Y3QgdXJiICp1cmIgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZXMyLT5jcG9ydF9vdXRfdXJiX2xvY2ssIGZsYWdzKTsKKworCS8qIExvb2sgaW4gb3VyIHBvb2wgb2YgYWxsb2NhdGVkIHVyYnMgZmlyc3QsIGFzIHRoYXQncyB0aGUgImZhc3Rlc3QiICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9DUE9SVF9PVVRfVVJCOyArK2kpIHsKKwkJaWYgKGVzMi0+Y3BvcnRfb3V0X3VyYl9idXN5W2ldID09IGZhbHNlICYmCisJCQkJZXMyLT5jcG9ydF9vdXRfdXJiX2NhbmNlbGxlZFtpXSA9PSBmYWxzZSkgeworCQkJZXMyLT5jcG9ydF9vdXRfdXJiX2J1c3lbaV0gPSB0cnVlOworCQkJdXJiID0gZXMyLT5jcG9ydF9vdXRfdXJiW2ldOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXMyLT5jcG9ydF9vdXRfdXJiX2xvY2ssIGZsYWdzKTsKKwlpZiAodXJiKQorCQlyZXR1cm4gdXJiOworCisJLyoKKwkgKiBDcmFwLCBwb29sIGlzIGVtcHR5LCBjb21wbGFpbiB0byB0aGUgc3lzbG9nIGFuZCBnbyBhbGxvY2F0ZSBvbmUKKwkgKiBkeW5hbWljYWxseSBhcyB3ZSBoYXZlIHRvIHN1Y2NlZWQuCisJICovCisJZGV2X2RiZygmZXMyLT51c2JfZGV2LT5kZXYsCisJCSJObyBmcmVlIENQb3J0IE9VVCB1cmJzLCBoYXZpbmcgdG8gZHluYW1pY2FsbHkgYWxsb2NhdGUgb25lIVxuIik7CisJcmV0dXJuIHVzYl9hbGxvY191cmIoMCwgZ2ZwX21hc2spOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3VyYihzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyLCBzdHJ1Y3QgdXJiICp1cmIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKwkvKgorCSAqIFNlZSBpZiB0aGlzIHdhcyBhbiB1cmIgaW4gb3VyIHBvb2wsIGlmIHNvIG1hcmsgaXQgImZyZWUiLCBvdGhlcndpc2UKKwkgKiB3ZSBuZWVkIHRvIGZyZWUgaXQgb3Vyc2VsdmVzLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZlczItPmNwb3J0X291dF91cmJfbG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBOVU1fQ1BPUlRfT1VUX1VSQjsgKytpKSB7CisJCWlmICh1cmIgPT0gZXMyLT5jcG9ydF9vdXRfdXJiW2ldKSB7CisJCQllczItPmNwb3J0X291dF91cmJfYnVzeVtpXSA9IGZhbHNlOworCQkJdXJiID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVzMi0+Y3BvcnRfb3V0X3VyYl9sb2NrLCBmbGFncyk7CisKKwkvKiBJZiB1cmIgaXMgbm90IE5VTEwsIHRoZW4gd2UgbmVlZCB0byBmcmVlIHRoaXMgdXJiICovCisJdXNiX2ZyZWVfdXJiKHVyYik7Cit9CisKKy8qCisgKiBXZSAoYWIpdXNlIHRoZSBvcGVyYXRpb24tbWVzc2FnZSBoZWFkZXIgcGFkIGJ5dGVzIHRvIHRyYW5zZmVyIHRoZQorICogY3BvcnQgaWQgaW4gb3JkZXIgdG8gbWluaW1pc2Ugb3ZlcmhlYWQuCisgKi8KK3N0YXRpYyB2b2lkCitnYl9tZXNzYWdlX2Nwb3J0X3BhY2soc3RydWN0IGdiX29wZXJhdGlvbl9tc2dfaGRyICpoZWFkZXIsIHUxNiBjcG9ydF9pZCkKK3sKKwloZWFkZXItPnBhZFswXSA9IGNwb3J0X2lkOworfQorCisvKiBDbGVhciB0aGUgcGFkIGJ5dGVzIHVzZWQgZm9yIHRoZSBDUG9ydCBpZCAqLworc3RhdGljIHZvaWQgZ2JfbWVzc2FnZV9jcG9ydF9jbGVhcihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uX21zZ19oZHIgKmhlYWRlcikKK3sKKwloZWFkZXItPnBhZFswXSA9IDA7Cit9CisKKy8qIEV4dHJhY3QgdGhlIENQb3J0IGlkIHBhY2tlZCBpbnRvIHRoZSBoZWFkZXIsIGFuZCBjbGVhciBpdCAqLworc3RhdGljIHUxNiBnYl9tZXNzYWdlX2Nwb3J0X3VucGFjayhzdHJ1Y3QgZ2Jfb3BlcmF0aW9uX21zZ19oZHIgKmhlYWRlcikKK3sKKwl1MTYgY3BvcnRfaWQgPSBoZWFkZXItPnBhZFswXTsKKworCWdiX21lc3NhZ2VfY3BvcnRfY2xlYXIoaGVhZGVyKTsKKworCXJldHVybiBjcG9ydF9pZDsKK30KKworLyoKKyAqIFJldHVybnMgemVybyBpZiB0aGUgbWVzc2FnZSB3YXMgc3VjY2Vzc2Z1bGx5IHF1ZXVlZCwgb3IgYSBuZWdhdGl2ZSBlcnJubworICogb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IG1lc3NhZ2Vfc2VuZChzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCB1MTYgY3BvcnRfaWQsCisJCQlzdHJ1Y3QgZ2JfbWVzc2FnZSAqbWVzc2FnZSwgZ2ZwX3QgZ2ZwX21hc2spCit7CisJc3RydWN0IGVzMl9hcF9kZXYgKmVzMiA9IGhkX3RvX2VzMihoZCk7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBlczItPnVzYl9kZXY7CisJc2l6ZV90IGJ1ZmZlcl9zaXplOworCWludCByZXR2YWw7CisJc3RydWN0IHVyYiAqdXJiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqIFRoZSBkYXRhIGFjdHVhbGx5IHRyYW5zZmVycmVkIHdpbGwgaW5jbHVkZSBhbiBpbmRpY2F0aW9uCisJICogb2Ygd2hlcmUgdGhlIGRhdGEgc2hvdWxkIGJlIHNlbnQuICBEbyBvbmUgbGFzdCBjaGVjayBvZgorCSAqIHRoZSB0YXJnZXQgQ1BvcnQgaWQgYmVmb3JlIGZpbGxpbmcgaXQgaW4uCisJICovCisJaWYgKCFjcG9ydF9pZF92YWxpZChoZCwgY3BvcnRfaWQpKSB7CisJCWRldl9lcnIoJnVkZXYtPmRldiwgImludmFsaWQgY3BvcnQgJXVcbiIsIGNwb3J0X2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogRmluZCBhIGZyZWUgdXJiICovCisJdXJiID0gbmV4dF9mcmVlX3VyYihlczIsIGdmcF9tYXNrKTsKKwlpZiAoIXVyYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZXMyLT5jcG9ydF9vdXRfdXJiX2xvY2ssIGZsYWdzKTsKKwltZXNzYWdlLT5oY3ByaXYgPSB1cmI7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXMyLT5jcG9ydF9vdXRfdXJiX2xvY2ssIGZsYWdzKTsKKworCS8qIFBhY2sgdGhlIGNwb3J0IGlkIGludG8gdGhlIG1lc3NhZ2UgaGVhZGVyICovCisJZ2JfbWVzc2FnZV9jcG9ydF9wYWNrKG1lc3NhZ2UtPmhlYWRlciwgY3BvcnRfaWQpOworCisJYnVmZmVyX3NpemUgPSBzaXplb2YoKm1lc3NhZ2UtPmhlYWRlcikgKyBtZXNzYWdlLT5wYXlsb2FkX3NpemU7CisKKwl1c2JfZmlsbF9idWxrX3VyYih1cmIsIHVkZXYsCisJCQkgIHVzYl9zbmRidWxrcGlwZSh1ZGV2LAorCQkJCQkgIGVzMi0+Y3BvcnRfb3V0X2VuZHBvaW50KSwKKwkJCSAgbWVzc2FnZS0+YnVmZmVyLCBidWZmZXJfc2l6ZSwKKwkJCSAgY3BvcnRfb3V0X2NhbGxiYWNrLCBtZXNzYWdlKTsKKwl1cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9aRVJPX1BBQ0tFVDsKKworCXRyYWNlX2diX21lc3NhZ2Vfc3VibWl0KG1lc3NhZ2UpOworCisJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIodXJiLCBnZnBfbWFzayk7CisJaWYgKHJldHZhbCkgeworCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJmYWlsZWQgdG8gc3VibWl0IG91dC11cmI6ICVkXG4iLCByZXR2YWwpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZlczItPmNwb3J0X291dF91cmJfbG9jaywgZmxhZ3MpOworCQltZXNzYWdlLT5oY3ByaXYgPSBOVUxMOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlczItPmNwb3J0X291dF91cmJfbG9jaywgZmxhZ3MpOworCisJCWZyZWVfdXJiKGVzMiwgdXJiKTsKKwkJZ2JfbWVzc2FnZV9jcG9ydF9jbGVhcihtZXNzYWdlLT5oZWFkZXIpOworCisJCXJldHVybiByZXR2YWw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDYW4gbm90IGJlIGNhbGxlZCBpbiBhdG9taWMgY29udGV4dC4KKyAqLworc3RhdGljIHZvaWQgbWVzc2FnZV9jYW5jZWwoc3RydWN0IGdiX21lc3NhZ2UgKm1lc3NhZ2UpCit7CisJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCA9IG1lc3NhZ2UtPm9wZXJhdGlvbi0+Y29ubmVjdGlvbi0+aGQ7CisJc3RydWN0IGVzMl9hcF9kZXYgKmVzMiA9IGhkX3RvX2VzMihoZCk7CisJc3RydWN0IHVyYiAqdXJiOworCWludCBpOworCisJbWlnaHRfc2xlZXAoKTsKKworCXNwaW5fbG9ja19pcnEoJmVzMi0+Y3BvcnRfb3V0X3VyYl9sb2NrKTsKKwl1cmIgPSBtZXNzYWdlLT5oY3ByaXY7CisKKwkvKiBQcmV2ZW50IGR5bmFtaWNhbGx5IGFsbG9jYXRlZCB1cmIgZnJvbSBiZWluZyBkZWFsbG9jYXRlZC4gKi8KKwl1c2JfZ2V0X3VyYih1cmIpOworCisJLyogUHJldmVudCBwcmUtYWxsb2NhdGVkIHVyYiBmcm9tIGJlaW5nIHJldXNlZC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0NQT1JUX09VVF9VUkI7ICsraSkgeworCQlpZiAodXJiID09IGVzMi0+Y3BvcnRfb3V0X3VyYltpXSkgeworCQkJZXMyLT5jcG9ydF9vdXRfdXJiX2NhbmNlbGxlZFtpXSA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnEoJmVzMi0+Y3BvcnRfb3V0X3VyYl9sb2NrKTsKKworCXVzYl9raWxsX3VyYih1cmIpOworCisJaWYgKGkgPCBOVU1fQ1BPUlRfT1VUX1VSQikgeworCQlzcGluX2xvY2tfaXJxKCZlczItPmNwb3J0X291dF91cmJfbG9jayk7CisJCWVzMi0+Y3BvcnRfb3V0X3VyYl9jYW5jZWxsZWRbaV0gPSBmYWxzZTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZlczItPmNwb3J0X291dF91cmJfbG9jayk7CisJfQorCisJdXNiX2ZyZWVfdXJiKHVyYik7Cit9CisKK3N0YXRpYyBpbnQgZXMyX2Nwb3J0X2FsbG9jYXRlKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIGludCBjcG9ydF9pZCwKKwkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBlczJfYXBfZGV2ICplczIgPSBoZF90b19lczIoaGQpOworCXN0cnVjdCBpZGEgKmlkX21hcCA9ICZoZC0+Y3BvcnRfaWRfbWFwOworCWludCBpZGFfc3RhcnQsIGlkYV9lbmQ7CisKKwlzd2l0Y2ggKGNwb3J0X2lkKSB7CisJY2FzZSBFUzJfQ1BPUlRfQ0RTSTA6CisJY2FzZSBFUzJfQ1BPUlRfQ0RTSTE6CisJCWRldl9lcnIoJmhkLT5kZXYsICJjcG9ydCAlZCBub3QgYXZhaWxhYmxlXG4iLCBjcG9ydF9pZCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKGZsYWdzICYgR0JfQ09OTkVDVElPTl9GTEFHX09GRkxPQURFRCAmJgorCQkJZmxhZ3MgJiBHQl9DT05ORUNUSU9OX0ZMQUdfQ0RTSTEpIHsKKwkJaWYgKGVzMi0+Y2RzaTFfaW5fdXNlKSB7CisJCQlkZXZfZXJyKCZoZC0+ZGV2LCAiQ0RTSTEgYWxyZWFkeSBpbiB1c2VcbiIpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCisJCWVzMi0+Y2RzaTFfaW5fdXNlID0gdHJ1ZTsKKworCQlyZXR1cm4gRVMyX0NQT1JUX0NEU0kxOworCX0KKworCWlmIChjcG9ydF9pZCA8IDApIHsKKwkJaWRhX3N0YXJ0ID0gMDsKKwkJaWRhX2VuZCA9IGhkLT5udW1fY3BvcnRzOworCX0gZWxzZSBpZiAoY3BvcnRfaWQgPCBoZC0+bnVtX2Nwb3J0cykgeworCQlpZGFfc3RhcnQgPSBjcG9ydF9pZDsKKwkJaWRhX2VuZCA9IGNwb3J0X2lkICsgMTsKKwl9IGVsc2UgeworCQlkZXZfZXJyKCZoZC0+ZGV2LCAiY3BvcnQgJWQgbm90IGF2YWlsYWJsZVxuIiwgY3BvcnRfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gaWRhX3NpbXBsZV9nZXQoaWRfbWFwLCBpZGFfc3RhcnQsIGlkYV9lbmQsIEdGUF9LRVJORUwpOworfQorCitzdGF0aWMgdm9pZCBlczJfY3BvcnRfcmVsZWFzZShzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCB1MTYgY3BvcnRfaWQpCit7CisJc3RydWN0IGVzMl9hcF9kZXYgKmVzMiA9IGhkX3RvX2VzMihoZCk7CisKKwlzd2l0Y2ggKGNwb3J0X2lkKSB7CisJY2FzZSBFUzJfQ1BPUlRfQ0RTSTE6CisJCWVzMi0+Y2RzaTFfaW5fdXNlID0gZmFsc2U7CisJCXJldHVybjsKKwl9CisKKwlpZGFfc2ltcGxlX3JlbW92ZSgmaGQtPmNwb3J0X2lkX21hcCwgY3BvcnRfaWQpOworfQorCitzdGF0aWMgaW50IGNwb3J0X2VuYWJsZShzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCB1MTYgY3BvcnRfaWQsCisJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBlczJfYXBfZGV2ICplczIgPSBoZF90b19lczIoaGQpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gZXMyLT51c2JfZGV2OworCXN0cnVjdCBnYl9hcGJfcmVxdWVzdF9jcG9ydF9mbGFncyAqcmVxOworCXUzMiBjb25uZWN0aW9uX2ZsYWdzOworCWludCByZXQ7CisKKwlyZXEgPSBremFsbG9jKHNpemVvZigqcmVxKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXEpCisJCXJldHVybiAtRU5PTUVNOworCisJY29ubmVjdGlvbl9mbGFncyA9IDA7CisJaWYgKGZsYWdzICYgR0JfQ09OTkVDVElPTl9GTEFHX0NPTlRST0wpCisJCWNvbm5lY3Rpb25fZmxhZ3MgfD0gR0JfQVBCX0NQT1JUX0ZMQUdfQ09OVFJPTDsKKwlpZiAoZmxhZ3MgJiBHQl9DT05ORUNUSU9OX0ZMQUdfSElHSF9QUklPKQorCQljb25uZWN0aW9uX2ZsYWdzIHw9IEdCX0FQQl9DUE9SVF9GTEFHX0hJR0hfUFJJTzsKKworCXJlcS0+ZmxhZ3MgPSBjcHVfdG9fbGUzMihjb25uZWN0aW9uX2ZsYWdzKTsKKworCWRldl9kYmcoJmhkLT5kZXYsICIlcyAtIGNwb3J0ID0gJXUsIGZsYWdzID0gJTAyeFxuIiwgX19mdW5jX18sCisJCQljcG9ydF9pZCwgY29ubmVjdGlvbl9mbGFncyk7CisKKwlyZXQgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAorCQkJCUdCX0FQQl9SRVFVRVNUX0NQT1JUX0ZMQUdTLAorCQkJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwKKwkJCQlVU0JfUkVDSVBfSU5URVJGQUNFLCBjcG9ydF9pZCwgMCwKKwkJCQlyZXEsIHNpemVvZigqcmVxKSwgRVMyX1VTQl9DVFJMX1RJTUVPVVQpOworCWlmIChyZXQgIT0gc2l6ZW9mKCpyZXEpKSB7CisJCWRldl9lcnIoJnVkZXYtPmRldiwgImZhaWxlZCB0byBzZXQgY3BvcnQgZmxhZ3MgZm9yIHBvcnQgJWRcbiIsCisJCQkJY3BvcnRfaWQpOworCQlpZiAocmV0ID49IDApCisJCQlyZXQgPSAtRUlPOworCisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IDA7CitvdXQ6CisJa2ZyZWUocmVxKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZXMyX2Nwb3J0X2Nvbm5lY3RlZChzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCB1MTYgY3BvcnRfaWQpCit7CisJc3RydWN0IGVzMl9hcF9kZXYgKmVzMiA9IGhkX3RvX2VzMihoZCk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmVzMi0+dXNiX2Rldi0+ZGV2OworCXN0cnVjdCBhcnBjX2Nwb3J0X2Nvbm5lY3RlZF9yZXEgcmVxOworCWludCByZXQ7CisKKwlyZXEuY3BvcnRfaWQgPSBjcHVfdG9fbGUxNihjcG9ydF9pZCk7CisJcmV0ID0gYXJwY19zeW5jKGVzMiwgQVJQQ19UWVBFX0NQT1JUX0NPTk5FQ1RFRCwgJnJlcSwgc2l6ZW9mKHJlcSksCisJCQlOVUxMLCBFUzJfQVJQQ19DUE9SVF9USU1FT1VUKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHNldCBjb25uZWN0ZWQgc3RhdGUgZm9yIGNwb3J0ICV1OiAlZFxuIiwKKwkJCQljcG9ydF9pZCwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlczJfY3BvcnRfZmx1c2goc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdTE2IGNwb3J0X2lkKQoreworCXN0cnVjdCBlczJfYXBfZGV2ICplczIgPSBoZF90b19lczIoaGQpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZlczItPnVzYl9kZXYtPmRldjsKKwlzdHJ1Y3QgYXJwY19jcG9ydF9mbHVzaF9yZXEgcmVxOworCWludCByZXQ7CisKKwlyZXEuY3BvcnRfaWQgPSBjcHVfdG9fbGUxNihjcG9ydF9pZCk7CisJcmV0ID0gYXJwY19zeW5jKGVzMiwgQVJQQ19UWVBFX0NQT1JUX0ZMVVNILCAmcmVxLCBzaXplb2YocmVxKSwKKwkJCU5VTEwsIEVTMl9BUlBDX0NQT1JUX1RJTUVPVVQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZmx1c2ggY3BvcnQgJXU6ICVkXG4iLCBjcG9ydF9pZCwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlczJfY3BvcnRfc2h1dGRvd24oc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdTE2IGNwb3J0X2lkLAorCQkJCXU4IHBoYXNlLCB1bnNpZ25lZCBpbnQgdGltZW91dCkKK3sKKwlzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyID0gaGRfdG9fZXMyKGhkKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZXMyLT51c2JfZGV2LT5kZXY7CisJc3RydWN0IGFycGNfY3BvcnRfc2h1dGRvd25fcmVxIHJlcTsKKwlpbnQgcmVzdWx0OworCWludCByZXQ7CisKKwlpZiAodGltZW91dCA+IFUxNl9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJcmVxLmNwb3J0X2lkID0gY3B1X3RvX2xlMTYoY3BvcnRfaWQpOworCXJlcS50aW1lb3V0ID0gY3B1X3RvX2xlMTYodGltZW91dCk7CisJcmVxLnBoYXNlID0gcGhhc2U7CisJcmV0ID0gYXJwY19zeW5jKGVzMiwgQVJQQ19UWVBFX0NQT1JUX1NIVVRET1dOLCAmcmVxLCBzaXplb2YocmVxKSwKKwkJCSZyZXN1bHQsIEVTMl9BUlBDX0NQT1JUX1RJTUVPVVQgKyB0aW1lb3V0KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHNlbmQgc2h1dGRvd24gb3ZlciBjcG9ydCAldTogJWQgKCVkKVxuIiwKKwkJCQljcG9ydF9pZCwgcmV0LCByZXN1bHQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVzMl9jcG9ydF9xdWllc2NlKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHUxNiBjcG9ydF9pZCwKKwkJCQlzaXplX3QgcGVlcl9zcGFjZSwgdW5zaWduZWQgaW50IHRpbWVvdXQpCit7CisJc3RydWN0IGVzMl9hcF9kZXYgKmVzMiA9IGhkX3RvX2VzMihoZCk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmVzMi0+dXNiX2Rldi0+ZGV2OworCXN0cnVjdCBhcnBjX2Nwb3J0X3F1aWVzY2VfcmVxIHJlcTsKKwlpbnQgcmVzdWx0OworCWludCByZXQ7CisKKwlpZiAocGVlcl9zcGFjZSA+IFUxNl9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRpbWVvdXQgPiBVMTZfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlcS5jcG9ydF9pZCA9IGNwdV90b19sZTE2KGNwb3J0X2lkKTsKKwlyZXEucGVlcl9zcGFjZSA9IGNwdV90b19sZTE2KHBlZXJfc3BhY2UpOworCXJlcS50aW1lb3V0ID0gY3B1X3RvX2xlMTYodGltZW91dCk7CisJcmV0ID0gYXJwY19zeW5jKGVzMiwgQVJQQ19UWVBFX0NQT1JUX1FVSUVTQ0UsICZyZXEsIHNpemVvZihyZXEpLAorCQkJJnJlc3VsdCwgRVMyX0FSUENfQ1BPUlRfVElNRU9VVCArIHRpbWVvdXQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcXVpZXNjZSBjcG9ydCAldTogJWQgKCVkKVxuIiwKKwkJCQljcG9ydF9pZCwgcmV0LCByZXN1bHQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVzMl9jcG9ydF9jbGVhcihzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCB1MTYgY3BvcnRfaWQpCit7CisJc3RydWN0IGVzMl9hcF9kZXYgKmVzMiA9IGhkX3RvX2VzMihoZCk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmVzMi0+dXNiX2Rldi0+ZGV2OworCXN0cnVjdCBhcnBjX2Nwb3J0X2NsZWFyX3JlcSByZXE7CisJaW50IHJldDsKKworCXJlcS5jcG9ydF9pZCA9IGNwdV90b19sZTE2KGNwb3J0X2lkKTsKKwlyZXQgPSBhcnBjX3N5bmMoZXMyLCBBUlBDX1RZUEVfQ1BPUlRfQ0xFQVIsICZyZXEsIHNpemVvZihyZXEpLAorCQkJTlVMTCwgRVMyX0FSUENfQ1BPUlRfVElNRU9VVCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBjbGVhciBjcG9ydCAldTogJWRcbiIsIGNwb3J0X2lkLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxhdGVuY3lfdGFnX2VuYWJsZShzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCB1MTYgY3BvcnRfaWQpCit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyID0gaGRfdG9fZXMyKGhkKTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGVzMi0+dXNiX2RldjsKKworCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCisJCQkJIEdCX0FQQl9SRVFVRVNUX0xBVEVOQ1lfVEFHX0VOLAorCQkJCSBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8CisJCQkJIFVTQl9SRUNJUF9JTlRFUkZBQ0UsIGNwb3J0X2lkLCAwLCBOVUxMLAorCQkJCSAwLCBFUzJfVVNCX0NUUkxfVElNRU9VVCk7CisKKwlpZiAocmV0dmFsIDwgMCkKKwkJZGV2X2VycigmdWRldi0+ZGV2LCAiQ2Fubm90IGVuYWJsZSBsYXRlbmN5IHRhZyBmb3IgY3BvcnQgJWRcbiIsCisJCQljcG9ydF9pZCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBsYXRlbmN5X3RhZ19kaXNhYmxlKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHUxNiBjcG9ydF9pZCkKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBlczJfYXBfZGV2ICplczIgPSBoZF90b19lczIoaGQpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gZXMyLT51c2JfZGV2OworCisJcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKKwkJCQkgR0JfQVBCX1JFUVVFU1RfTEFURU5DWV9UQUdfRElTLAorCQkJCSBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8CisJCQkJIFVTQl9SRUNJUF9JTlRFUkZBQ0UsIGNwb3J0X2lkLCAwLCBOVUxMLAorCQkJCSAwLCBFUzJfVVNCX0NUUkxfVElNRU9VVCk7CisKKwlpZiAocmV0dmFsIDwgMCkKKwkJZGV2X2VycigmdWRldi0+ZGV2LCAiQ2Fubm90IGRpc2FibGUgbGF0ZW5jeSB0YWcgZm9yIGNwb3J0ICVkXG4iLAorCQkJY3BvcnRfaWQpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgdGltZXN5bmNfZW5hYmxlKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHU4IGNvdW50LAorCQkJICAgdTY0IGZyYW1lX3RpbWUsIHUzMiBzdHJvYmVfZGVsYXksIHUzMiByZWZjbGspCit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyID0gaGRfdG9fZXMyKGhkKTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGVzMi0+dXNiX2RldjsKKwlzdHJ1Y3QgZ2JfY29udHJvbF90aW1lc3luY19lbmFibGVfcmVxdWVzdCAqcmVxdWVzdDsKKworCXJlcXVlc3QgPSBremFsbG9jKHNpemVvZigqcmVxdWVzdCksIEdGUF9LRVJORUwpOworCWlmICghcmVxdWVzdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXF1ZXN0LT5jb3VudCA9IGNvdW50OworCXJlcXVlc3QtPmZyYW1lX3RpbWUgPSBjcHVfdG9fbGU2NChmcmFtZV90aW1lKTsKKwlyZXF1ZXN0LT5zdHJvYmVfZGVsYXkgPSBjcHVfdG9fbGUzMihzdHJvYmVfZGVsYXkpOworCXJlcXVlc3QtPnJlZmNsayA9IGNwdV90b19sZTMyKHJlZmNsayk7CisJcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKKwkJCQkgR0JfQVBCX1JFUVVFU1RfVElNRVNZTkNfRU5BQkxFLAorCQkJCSBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8CisJCQkJIFVTQl9SRUNJUF9JTlRFUkZBQ0UsIDAsIDAsIHJlcXVlc3QsCisJCQkJIHNpemVvZigqcmVxdWVzdCksIEVTMl9VU0JfQ1RSTF9USU1FT1VUKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZGV2X2VycigmdWRldi0+ZGV2LCAiQ2Fubm90IGVuYWJsZSB0aW1lc3luYyAlZFxuIiwgcmV0dmFsKTsKKworCWtmcmVlKHJlcXVlc3QpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgdGltZXN5bmNfZGlzYWJsZShzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkKQoreworCWludCByZXR2YWw7CisJc3RydWN0IGVzMl9hcF9kZXYgKmVzMiA9IGhkX3RvX2VzMihoZCk7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBlczItPnVzYl9kZXY7CisKKwlyZXR2YWwgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAorCQkJCSBHQl9BUEJfUkVRVUVTVF9USU1FU1lOQ19ESVNBQkxFLAorCQkJCSBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8CisJCQkJIFVTQl9SRUNJUF9JTlRFUkZBQ0UsIDAsIDAsIE5VTEwsCisJCQkJIDAsIEVTMl9VU0JfQ1RSTF9USU1FT1VUKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZGV2X2VycigmdWRldi0+ZGV2LCAiQ2Fubm90IGRpc2FibGUgdGltZXN5bmMgJWRcbiIsIHJldHZhbCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHRpbWVzeW5jX2F1dGhvcml0YXRpdmUoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdTY0ICpmcmFtZV90aW1lKQoreworCWludCByZXR2YWwsIGk7CisJc3RydWN0IGVzMl9hcF9kZXYgKmVzMiA9IGhkX3RvX2VzMihoZCk7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBlczItPnVzYl9kZXY7CisJc3RydWN0IHRpbWVzeW5jX2F1dGhvcml0YXRpdmVfcmVxdWVzdCAqcmVxdWVzdDsKKworCXJlcXVlc3QgPSBremFsbG9jKHNpemVvZigqcmVxdWVzdCksIEdGUF9LRVJORUwpOworCWlmICghcmVxdWVzdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgR0JfVElNRVNZTkNfTUFYX1NUUk9CRVM7IGkrKykKKwkJcmVxdWVzdC0+ZnJhbWVfdGltZVtpXSA9IGNwdV90b19sZTY0KGZyYW1lX3RpbWVbaV0pOworCisJcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKKwkJCQkgR0JfQVBCX1JFUVVFU1RfVElNRVNZTkNfQVVUSE9SSVRBVElWRSwKKwkJCQkgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfAorCQkJCSBVU0JfUkVDSVBfSU5URVJGQUNFLCAwLCAwLCByZXF1ZXN0LAorCQkJCSBzaXplb2YoKnJlcXVlc3QpLCBFUzJfVVNCX0NUUkxfVElNRU9VVCk7CisJaWYgKHJldHZhbCA8IDApCisJCWRldl9lcnIoJnVkZXYtPmRldiwgIkNhbm5vdCB0aW1lc3luYyBhdXRob3JpdGF0aXZlIG91dCAlZFxuIiwgcmV0dmFsKTsKKworCWtmcmVlKHJlcXVlc3QpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgdGltZXN5bmNfZ2V0X2xhc3RfZXZlbnQoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdTY0ICpmcmFtZV90aW1lKQoreworCWludCByZXR2YWw7CisJc3RydWN0IGVzMl9hcF9kZXYgKmVzMiA9IGhkX3RvX2VzMihoZCk7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBlczItPnVzYl9kZXY7CisJX19sZTY0ICpyZXNwb25zZV9mcmFtZV90aW1lOworCisJcmVzcG9uc2VfZnJhbWVfdGltZSA9IGt6YWxsb2Moc2l6ZW9mKCpyZXNwb25zZV9mcmFtZV90aW1lKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXNwb25zZV9mcmFtZV90aW1lKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksCisJCQkJIEdCX0FQQl9SRVFVRVNUX1RJTUVTWU5DX0dFVF9MQVNUX0VWRU5ULAorCQkJCSBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwKKwkJCQkgVVNCX1JFQ0lQX0lOVEVSRkFDRSwgMCwgMCwgcmVzcG9uc2VfZnJhbWVfdGltZSwKKwkJCQkgc2l6ZW9mKCpyZXNwb25zZV9mcmFtZV90aW1lKSwKKwkJCQkgRVMyX1VTQl9DVFJMX1RJTUVPVVQpOworCisJaWYgKHJldHZhbCAhPSBzaXplb2YoKnJlc3BvbnNlX2ZyYW1lX3RpbWUpKSB7CisJCWRldl9lcnIoJnVkZXYtPmRldiwgIkNhbm5vdCBnZXQgbGFzdCBUaW1lU3luYyBldmVudDogJWRcbiIsCisJCQlyZXR2YWwpOworCisJCWlmIChyZXR2YWwgPj0gMCkKKwkJCXJldHZhbCA9IC1FSU87CisKKwkJZ290byBvdXQ7CisJfQorCSpmcmFtZV90aW1lID0gbGU2NF90b19jcHUoKnJlc3BvbnNlX2ZyYW1lX3RpbWUpOworCXJldHZhbCA9IDA7CitvdXQ6CisJa2ZyZWUocmVzcG9uc2VfZnJhbWVfdGltZSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHN0cnVjdCBnYl9oZF9kcml2ZXIgZXMyX2RyaXZlciA9IHsKKwkuaGRfcHJpdl9zaXplCQkJPSBzaXplb2Yoc3RydWN0IGVzMl9hcF9kZXYpLAorCS5tZXNzYWdlX3NlbmQJCQk9IG1lc3NhZ2Vfc2VuZCwKKwkubWVzc2FnZV9jYW5jZWwJCQk9IG1lc3NhZ2VfY2FuY2VsLAorCS5jcG9ydF9hbGxvY2F0ZQkJCT0gZXMyX2Nwb3J0X2FsbG9jYXRlLAorCS5jcG9ydF9yZWxlYXNlCQkJPSBlczJfY3BvcnRfcmVsZWFzZSwKKwkuY3BvcnRfZW5hYmxlCQkJPSBjcG9ydF9lbmFibGUsCisJLmNwb3J0X2Nvbm5lY3RlZAkJPSBlczJfY3BvcnRfY29ubmVjdGVkLAorCS5jcG9ydF9mbHVzaAkJCT0gZXMyX2Nwb3J0X2ZsdXNoLAorCS5jcG9ydF9zaHV0ZG93bgkJCT0gZXMyX2Nwb3J0X3NodXRkb3duLAorCS5jcG9ydF9xdWllc2NlCQkJPSBlczJfY3BvcnRfcXVpZXNjZSwKKwkuY3BvcnRfY2xlYXIJCQk9IGVzMl9jcG9ydF9jbGVhciwKKwkubGF0ZW5jeV90YWdfZW5hYmxlCQk9IGxhdGVuY3lfdGFnX2VuYWJsZSwKKwkubGF0ZW5jeV90YWdfZGlzYWJsZQkJPSBsYXRlbmN5X3RhZ19kaXNhYmxlLAorCS5vdXRwdXQJCQkJPSBvdXRwdXQsCisJLnRpbWVzeW5jX2VuYWJsZQkJPSB0aW1lc3luY19lbmFibGUsCisJLnRpbWVzeW5jX2Rpc2FibGUJCT0gdGltZXN5bmNfZGlzYWJsZSwKKwkudGltZXN5bmNfYXV0aG9yaXRhdGl2ZQkJPSB0aW1lc3luY19hdXRob3JpdGF0aXZlLAorCS50aW1lc3luY19nZXRfbGFzdF9ldmVudAk9IHRpbWVzeW5jX2dldF9sYXN0X2V2ZW50LAorfTsKKworLyogQ29tbW9uIGZ1bmN0aW9uIHRvIHJlcG9ydCBjb25zaXN0ZW50IHdhcm5pbmdzIGJhc2VkIG9uIFVSQiBzdGF0dXMgKi8KK3N0YXRpYyBpbnQgY2hlY2tfdXJiX3N0YXR1cyhzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnVyYi0+ZGV2LT5kZXY7CisJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOworCisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIDA6CisJCXJldHVybiAwOworCisJY2FzZSAtRU9WRVJGTE9XOgorCQlkZXZfZXJyKGRldiwgIiVzOiBvdmVyZmxvdyBhY3R1YWwgbGVuZ3RoIGlzICVkXG4iLAorCQkJX19mdW5jX18sIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJY2FzZSAtRUNPTk5SRVNFVDoKKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRVNIVVRET1dOOgorCWNhc2UgLUVJTFNFUToKKwljYXNlIC1FUFJPVE86CisJCS8qIGRldmljZSBpcyBnb25lLCBzdG9wIHNlbmRpbmcgKi8KKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJZGV2X2VycihkZXYsICIlczogdW5rbm93biBzdGF0dXMgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOworCisJcmV0dXJuIC1FQUdBSU47Cit9CisKK3N0YXRpYyB2b2lkIGVzMl9kZXN0cm95KHN0cnVjdCBlczJfYXBfZGV2ICplczIpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CisJc3RydWN0IHVyYiAqdXJiOworCWludCBpOworCisJZGVidWdmc19yZW1vdmUoZXMyLT5hcGJfbG9nX2VuYWJsZV9kZW50cnkpOworCXVzYl9sb2dfZGlzYWJsZShlczIpOworCisJLyogVGVhciBkb3duIGV2ZXJ5dGhpbmchICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9DUE9SVF9PVVRfVVJCOyArK2kpIHsKKwkJdXJiID0gZXMyLT5jcG9ydF9vdXRfdXJiW2ldOworCQl1c2Jfa2lsbF91cmIodXJiKTsKKwkJdXNiX2ZyZWVfdXJiKHVyYik7CisJCWVzMi0+Y3BvcnRfb3V0X3VyYltpXSA9IE5VTEw7CisJCWVzMi0+Y3BvcnRfb3V0X3VyYl9idXN5W2ldID0gZmFsc2U7CS8qIGp1c3QgdG8gYmUgYW5hbCAqLworCX0KKworCWZvciAoaSA9IDA7IGkgPCBOVU1fQVJQQ19JTl9VUkI7ICsraSkgeworCQl1c2JfZnJlZV91cmIoZXMyLT5hcnBjX3VyYltpXSk7CisJCWtmcmVlKGVzMi0+YXJwY19idWZmZXJbaV0pOworCQllczItPmFycGNfYnVmZmVyW2ldID0gTlVMTDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0NQT1JUX0lOX1VSQjsgKytpKSB7CisJCXVzYl9mcmVlX3VyYihlczItPmNwb3J0X2luLnVyYltpXSk7CisJCWtmcmVlKGVzMi0+Y3BvcnRfaW4uYnVmZmVyW2ldKTsKKwkJZXMyLT5jcG9ydF9pbi5idWZmZXJbaV0gPSBOVUxMOworCX0KKworCS8qIHJlbGVhc2UgcmVzZXJ2ZWQgQ0RTSTAgYW5kIENEU0kxIGNwb3J0cyAqLworCWdiX2hkX2Nwb3J0X3JlbGVhc2VfcmVzZXJ2ZWQoZXMyLT5oZCwgRVMyX0NQT1JUX0NEU0kxKTsKKwlnYl9oZF9jcG9ydF9yZWxlYXNlX3Jlc2VydmVkKGVzMi0+aGQsIEVTMl9DUE9SVF9DRFNJMCk7CisKKwl1ZGV2ID0gZXMyLT51c2JfZGV2OworCWdiX2hkX3B1dChlczItPmhkKTsKKworCXVzYl9wdXRfZGV2KHVkZXYpOworfQorCitzdGF0aWMgdm9pZCBjcG9ydF9pbl9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmdXJiLT5kZXYtPmRldjsKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uX21zZ19oZHIgKmhlYWRlcjsKKwlpbnQgc3RhdHVzID0gY2hlY2tfdXJiX3N0YXR1cyh1cmIpOworCWludCByZXR2YWw7CisJdTE2IGNwb3J0X2lkOworCisJaWYgKHN0YXR1cykgeworCQlpZiAoKHN0YXR1cyA9PSAtRUFHQUlOKSB8fCAoc3RhdHVzID09IC1FUFJPVE8pKQorCQkJZ290byBleGl0OworCisJCS8qIFRoZSB1cmIgaXMgYmVpbmcgdW5saW5rZWQgKi8KKwkJaWYgKHN0YXR1cyA9PSAtRU5PRU5UIHx8IHN0YXR1cyA9PSAtRVNIVVRET1dOKQorCQkJcmV0dXJuOworCisJCWRldl9lcnIoZGV2LCAidXJiIGNwb3J0IGluIGVycm9yICVkIChkcm9wcGVkKVxuIiwgc3RhdHVzKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPCBzaXplb2YoKmhlYWRlcikpIHsKKwkJZGV2X2VycihkZXYsICJzaG9ydCBtZXNzYWdlIHJlY2VpdmVkXG4iKTsKKwkJZ290byBleGl0OworCX0KKworCS8qIEV4dHJhY3QgdGhlIENQb3J0IGlkLCB3aGljaCBpcyBwYWNrZWQgaW4gdGhlIG1lc3NhZ2UgaGVhZGVyICovCisJaGVhZGVyID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJY3BvcnRfaWQgPSBnYl9tZXNzYWdlX2Nwb3J0X3VucGFjayhoZWFkZXIpOworCisJaWYgKGNwb3J0X2lkX3ZhbGlkKGhkLCBjcG9ydF9pZCkpIHsKKwkJZ3JleWJ1c19kYXRhX3JjdmQoaGQsIGNwb3J0X2lkLCB1cmItPnRyYW5zZmVyX2J1ZmZlciwKKwkJCQkJCQl1cmItPmFjdHVhbF9sZW5ndGgpOworCX0gZWxzZSB7CisJCWRldl9lcnIoZGV2LCAiaW52YWxpZCBjcG9ydCBpZCAldSByZWNlaXZlZFxuIiwgY3BvcnRfaWQpOworCX0KK2V4aXQ6CisJLyogcHV0IG91ciB1cmIgYmFjayBpbiB0aGUgcmVxdWVzdCBwb29sICovCisJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAocmV0dmFsKQorCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZXN1Ym1pdCBpbi11cmI6ICVkXG4iLCByZXR2YWwpOworfQorCitzdGF0aWMgdm9pZCBjcG9ydF9vdXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBnYl9tZXNzYWdlICptZXNzYWdlID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQgPSBtZXNzYWdlLT5vcGVyYXRpb24tPmNvbm5lY3Rpb24tPmhkOworCXN0cnVjdCBlczJfYXBfZGV2ICplczIgPSBoZF90b19lczIoaGQpOworCWludCBzdGF0dXMgPSBjaGVja191cmJfc3RhdHVzKHVyYik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWdiX21lc3NhZ2VfY3BvcnRfY2xlYXIobWVzc2FnZS0+aGVhZGVyKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlczItPmNwb3J0X291dF91cmJfbG9jaywgZmxhZ3MpOworCW1lc3NhZ2UtPmhjcHJpdiA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXMyLT5jcG9ydF9vdXRfdXJiX2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogVGVsbCB0aGUgc3VibWl0dGVyIHRoYXQgdGhlIG1lc3NhZ2Ugc2VuZCAoYXR0ZW1wdCkgaXMKKwkgKiBjb21wbGV0ZSwgYW5kIHJlcG9ydCB0aGUgc3RhdHVzLgorCSAqLworCWdyZXlidXNfbWVzc2FnZV9zZW50KGhkLCBtZXNzYWdlLCBzdGF0dXMpOworCisJZnJlZV91cmIoZXMyLCB1cmIpOworfQorCitzdGF0aWMgc3RydWN0IGFycGMgKmFycGNfYWxsb2Modm9pZCAqcGF5bG9hZCwgdTE2IHNpemUsIHU4IHR5cGUpCit7CisJc3RydWN0IGFycGMgKnJwYzsKKworCWlmIChzaXplICsgc2l6ZW9mKCpycGMtPnJlcSkgPiBBUlBDX09VVF9TSVpFX01BWCkKKwkJcmV0dXJuIE5VTEw7CisKKwlycGMgPSBremFsbG9jKHNpemVvZigqcnBjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFycGMpCisJCXJldHVybiBOVUxMOworCisJSU5JVF9MSVNUX0hFQUQoJnJwYy0+bGlzdCk7CisJcnBjLT5yZXEgPSBremFsbG9jKHNpemVvZigqcnBjLT5yZXEpICsgc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFycGMtPnJlcSkKKwkJZ290byBlcnJfZnJlZV9ycGM7CisKKwlycGMtPnJlc3AgPSBremFsbG9jKHNpemVvZigqcnBjLT5yZXNwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFycGMtPnJlc3ApCisJCWdvdG8gZXJyX2ZyZWVfcmVxOworCisJcnBjLT5yZXEtPnR5cGUgPSB0eXBlOworCXJwYy0+cmVxLT5zaXplID0gY3B1X3RvX2xlMTYoc2l6ZW9mKHJwYy0+cmVxKSArIHNpemUpOworCW1lbWNweShycGMtPnJlcS0+ZGF0YSwgcGF5bG9hZCwgc2l6ZSk7CisKKwlpbml0X2NvbXBsZXRpb24oJnJwYy0+cmVzcG9uc2VfcmVjZWl2ZWQpOworCisJcmV0dXJuIHJwYzsKKworZXJyX2ZyZWVfcmVxOgorCWtmcmVlKHJwYy0+cmVxKTsKK2Vycl9mcmVlX3JwYzoKKwlrZnJlZShycGMpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGFycGNfZnJlZShzdHJ1Y3QgYXJwYyAqcnBjKQoreworCWtmcmVlKHJwYy0+cmVxKTsKKwlrZnJlZShycGMtPnJlc3ApOworCWtmcmVlKHJwYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXJwYyAqYXJwY19maW5kKHN0cnVjdCBlczJfYXBfZGV2ICplczIsIF9fbGUxNiBpZCkKK3sKKwlzdHJ1Y3QgYXJwYyAqcnBjOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShycGMsICZlczItPmFycGNzLCBsaXN0KSB7CisJCWlmIChycGMtPnJlcS0+aWQgPT0gaWQpCisJCQlyZXR1cm4gcnBjOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBhcnBjX2FkZChzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyLCBzdHJ1Y3QgYXJwYyAqcnBjKQoreworCXJwYy0+YWN0aXZlID0gdHJ1ZTsKKwlycGMtPnJlcS0+aWQgPSBjcHVfdG9fbGUxNihlczItPmFycGNfaWRfY3ljbGUrKyk7CisJbGlzdF9hZGRfdGFpbCgmcnBjLT5saXN0LCAmZXMyLT5hcnBjcyk7Cit9CisKK3N0YXRpYyB2b2lkIGFycGNfZGVsKHN0cnVjdCBlczJfYXBfZGV2ICplczIsIHN0cnVjdCBhcnBjICpycGMpCit7CisJaWYgKHJwYy0+YWN0aXZlKSB7CisJCXJwYy0+YWN0aXZlID0gZmFsc2U7CisJCWxpc3RfZGVsKCZycGMtPmxpc3QpOworCX0KK30KKworc3RhdGljIGludCBhcnBjX3NlbmQoc3RydWN0IGVzMl9hcF9kZXYgKmVzMiwgc3RydWN0IGFycGMgKnJwYywgaW50IHRpbWVvdXQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBlczItPnVzYl9kZXY7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCisJCQkJIEdCX0FQQl9SRVFVRVNUX0FSUENfUlVOLAorCQkJCSBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8CisJCQkJIFVTQl9SRUNJUF9JTlRFUkZBQ0UsCisJCQkJIDAsIDAsCisJCQkJIHJwYy0+cmVxLCBsZTE2X3RvX2NwdShycGMtPnJlcS0+c2l6ZSksCisJCQkJIEVTMl9VU0JfQ1RSTF9USU1FT1VUKTsKKwlpZiAocmV0dmFsICE9IGxlMTZfdG9fY3B1KHJwYy0+cmVxLT5zaXplKSkgeworCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsCisJCQkiZmFpbGVkIHRvIHNlbmQgQVJQQyByZXF1ZXN0ICVkOiAlZFxuIiwKKwkJCXJwYy0+cmVxLT50eXBlLCByZXR2YWwpOworCQlpZiAocmV0dmFsID4gMCkKKwkJCXJldHZhbCA9IC1FSU87CisJCXJldHVybiByZXR2YWw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXJwY19zeW5jKHN0cnVjdCBlczJfYXBfZGV2ICplczIsIHU4IHR5cGUsIHZvaWQgKnBheWxvYWQsCisJCSAgICAgc2l6ZV90IHNpemUsIGludCAqcmVzdWx0LCB1bnNpZ25lZCBpbnQgdGltZW91dCkKK3sKKwlzdHJ1Y3QgYXJwYyAqcnBjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldHZhbDsKKworCWlmIChyZXN1bHQpCisJCSpyZXN1bHQgPSAwOworCisJcnBjID0gYXJwY19hbGxvYyhwYXlsb2FkLCBzaXplLCB0eXBlKTsKKwlpZiAoIXJwYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZXMyLT5hcnBjX2xvY2ssIGZsYWdzKTsKKwlhcnBjX2FkZChlczIsIHJwYyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXMyLT5hcnBjX2xvY2ssIGZsYWdzKTsKKworCXJldHZhbCA9IGFycGNfc2VuZChlczIsIHJwYywgdGltZW91dCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXRfYXJwY19kZWw7CisKKwlyZXR2YWwgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgKKwkJCQkJCSZycGMtPnJlc3BvbnNlX3JlY2VpdmVkLAorCQkJCQkJbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSk7CisJaWYgKHJldHZhbCA8PSAwKSB7CisJCWlmICghcmV0dmFsKQorCQkJcmV0dmFsID0gLUVUSU1FRE9VVDsKKwkJZ290byBvdXRfYXJwY19kZWw7CisJfQorCisJaWYgKHJwYy0+cmVzcC0+cmVzdWx0KSB7CisJCXJldHZhbCA9IC1FUkVNT1RFSU87CisJCWlmIChyZXN1bHQpCisJCQkqcmVzdWx0ID0gcnBjLT5yZXNwLT5yZXN1bHQ7CisJfSBlbHNlIHsKKwkJcmV0dmFsID0gMDsKKwl9CisKK291dF9hcnBjX2RlbDoKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZXMyLT5hcnBjX2xvY2ssIGZsYWdzKTsKKwlhcnBjX2RlbChlczIsIHJwYyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXMyLT5hcnBjX2xvY2ssIGZsYWdzKTsKKwlhcnBjX2ZyZWUocnBjKTsKKworCWlmIChyZXR2YWwgPCAwICYmIHJldHZhbCAhPSAtRVJFTU9URUlPKSB7CisJCWRldl9lcnIoJmVzMi0+dXNiX2Rldi0+ZGV2LAorCQkJImZhaWxlZCB0byBleGVjdXRlIEFSUEM6ICVkXG4iLCByZXR2YWwpOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGFycGNfaW5fY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBlczJfYXBfZGV2ICplczIgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnVyYi0+ZGV2LT5kZXY7CisJaW50IHN0YXR1cyA9IGNoZWNrX3VyYl9zdGF0dXModXJiKTsKKwlzdHJ1Y3QgYXJwYyAqcnBjOworCXN0cnVjdCBhcnBjX3Jlc3BvbnNlX21lc3NhZ2UgKnJlc3A7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0dmFsOworCisJaWYgKHN0YXR1cykgeworCQlpZiAoKHN0YXR1cyA9PSAtRUFHQUlOKSB8fCAoc3RhdHVzID09IC1FUFJPVE8pKQorCQkJZ290byBleGl0OworCisJCS8qIFRoZSB1cmIgaXMgYmVpbmcgdW5saW5rZWQgKi8KKwkJaWYgKHN0YXR1cyA9PSAtRU5PRU5UIHx8IHN0YXR1cyA9PSAtRVNIVVRET1dOKQorCQkJcmV0dXJuOworCisJCWRldl9lcnIoZGV2LCAiYXJwYyBpbi11cmIgZXJyb3IgJWQgKGRyb3BwZWQpXG4iLCBzdGF0dXMpOworCQlyZXR1cm47CisJfQorCisJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA8IHNpemVvZigqcmVzcCkpIHsKKwkJZGV2X2VycihkZXYsICJzaG9ydCBhcHJjIHJlc3BvbnNlIHJlY2VpdmVkXG4iKTsKKwkJZ290byBleGl0OworCX0KKworCXJlc3AgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZXMyLT5hcnBjX2xvY2ssIGZsYWdzKTsKKwlycGMgPSBhcnBjX2ZpbmQoZXMyLCByZXNwLT5pZCk7CisJaWYgKCFycGMpIHsKKwkJZGV2X2VycihkZXYsICJpbnZhbGlkIGFycGMgcmVzcG9uc2UgaWQgcmVjZWl2ZWQ6ICV1XG4iLAorCQkJbGUxNl90b19jcHUocmVzcC0+aWQpKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXMyLT5hcnBjX2xvY2ssIGZsYWdzKTsKKwkJZ290byBleGl0OworCX0KKworCWFycGNfZGVsKGVzMiwgcnBjKTsKKwltZW1jcHkocnBjLT5yZXNwLCByZXNwLCBzaXplb2YoKnJlc3ApKTsKKwljb21wbGV0ZSgmcnBjLT5yZXNwb25zZV9yZWNlaXZlZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXMyLT5hcnBjX2xvY2ssIGZsYWdzKTsKKworZXhpdDoKKwkvKiBwdXQgb3VyIHVyYiBiYWNrIGluIHRoZSByZXF1ZXN0IHBvb2wgKi8KKwlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCWlmIChyZXR2YWwpCisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlc3VibWl0IGFycGMgaW4tdXJiOiAlZFxuIiwgcmV0dmFsKTsKK30KKworI2RlZmluZSBBUEIxX0xPR19NU0dfU0laRQk2NAorc3RhdGljIHZvaWQgYXBiX2xvZ19nZXQoc3RydWN0IGVzMl9hcF9kZXYgKmVzMiwgY2hhciAqYnVmKQoreworCWludCByZXR2YWw7CisKKwlkbyB7CisJCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhlczItPnVzYl9kZXYsCisJCQkJCXVzYl9yY3ZjdHJscGlwZShlczItPnVzYl9kZXYsIDApLAorCQkJCQlHQl9BUEJfUkVRVUVTVF9MT0csCisJCQkJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfSU5URVJGQUNFLAorCQkJCQkweDAwLCAweDAwLAorCQkJCQlidWYsCisJCQkJCUFQQjFfTE9HX01TR19TSVpFLAorCQkJCQlFUzJfVVNCX0NUUkxfVElNRU9VVCk7CisJCWlmIChyZXR2YWwgPiAwKQorCQkJa2ZpZm9faW4oJmVzMi0+YXBiX2xvZ19maWZvLCBidWYsIHJldHZhbCk7CisJfSB3aGlsZSAocmV0dmFsID4gMCk7Cit9CisKK3N0YXRpYyBpbnQgYXBiX2xvZ19wb2xsKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGVzMl9hcF9kZXYgKmVzMiA9IGRhdGE7CisJY2hhciAqYnVmOworCisJYnVmID0ga21hbGxvYyhBUEIxX0xPR19NU0dfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJbXNsZWVwKDEwMDApOworCQlhcGJfbG9nX2dldChlczIsIGJ1Zik7CisJfQorCisJa2ZyZWUoYnVmKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBhcGJfbG9nX3JlYWQoc3RydWN0IGZpbGUgKmYsIGNoYXIgX191c2VyICpidWYsCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGVzMl9hcF9kZXYgKmVzMiA9IGYtPmZfaW5vZGUtPmlfcHJpdmF0ZTsKKwlzc2l6ZV90IHJldDsKKwlzaXplX3QgY29waWVkOworCWNoYXIgKnRtcF9idWY7CisKKwlpZiAoY291bnQgPiBBUEIxX0xPR19TSVpFKQorCQljb3VudCA9IEFQQjFfTE9HX1NJWkU7CisKKwl0bXBfYnVmID0ga21hbGxvYyhjb3VudCwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0bXBfYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvcGllZCA9IGtmaWZvX291dCgmZXMyLT5hcGJfbG9nX2ZpZm8sIHRtcF9idWYsIGNvdW50KTsKKwlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCBwcG9zLCB0bXBfYnVmLCBjb3BpZWQpOworCisJa2ZyZWUodG1wX2J1Zik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhcGJfbG9nX2ZvcHMgPSB7CisJLnJlYWQJPSBhcGJfbG9nX3JlYWQsCit9OworCitzdGF0aWMgdm9pZCB1c2JfbG9nX2VuYWJsZShzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyKQoreworCWlmICghSVNfRVJSX09SX05VTEwoZXMyLT5hcGJfbG9nX3Rhc2spKQorCQlyZXR1cm47CisKKwkvKiBnZXQgbG9nIGZyb20gQVBCMSAqLworCWVzMi0+YXBiX2xvZ190YXNrID0ga3RocmVhZF9ydW4oYXBiX2xvZ19wb2xsLCBlczIsICJhcGJfbG9nIik7CisJaWYgKElTX0VSUihlczItPmFwYl9sb2dfdGFzaykpCisJCXJldHVybjsKKwkvKiBYWFggV2Ugd2lsbCBuZWVkIHRvIHJlbmFtZSB0aGlzIHBlciBBUEIgKi8KKwllczItPmFwYl9sb2dfZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgiYXBiX2xvZyIsIFNfSVJVR08sCisJCQkJCQlnYl9kZWJ1Z2ZzX2dldCgpLCBlczIsCisJCQkJCQkmYXBiX2xvZ19mb3BzKTsKK30KKworc3RhdGljIHZvaWQgdXNiX2xvZ19kaXNhYmxlKHN0cnVjdCBlczJfYXBfZGV2ICplczIpCit7CisJaWYgKElTX0VSUl9PUl9OVUxMKGVzMi0+YXBiX2xvZ190YXNrKSkKKwkJcmV0dXJuOworCisJZGVidWdmc19yZW1vdmUoZXMyLT5hcGJfbG9nX2RlbnRyeSk7CisJZXMyLT5hcGJfbG9nX2RlbnRyeSA9IE5VTEw7CisKKwlrdGhyZWFkX3N0b3AoZXMyLT5hcGJfbG9nX3Rhc2spOworCWVzMi0+YXBiX2xvZ190YXNrID0gTlVMTDsKK30KKworc3RhdGljIHNzaXplX3QgYXBiX2xvZ19lbmFibGVfcmVhZChzdHJ1Y3QgZmlsZSAqZiwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyID0gZi0+Zl9pbm9kZS0+aV9wcml2YXRlOworCWludCBlbmFibGUgPSAhSVNfRVJSX09SX05VTEwoZXMyLT5hcGJfbG9nX3Rhc2spOworCWNoYXIgdG1wX2J1ZlszXTsKKworCXNwcmludGYodG1wX2J1ZiwgIiVkXG4iLCBlbmFibGUpOworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCBwcG9zLCB0bXBfYnVmLCAzKTsKK30KKworc3RhdGljIHNzaXplX3QgYXBiX2xvZ19lbmFibGVfd3JpdGUoc3RydWN0IGZpbGUgKmYsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IGVuYWJsZTsKKwlzc2l6ZV90IHJldHZhbDsKKwlzdHJ1Y3QgZXMyX2FwX2RldiAqZXMyID0gZi0+Zl9pbm9kZS0+aV9wcml2YXRlOworCisJcmV0dmFsID0ga3N0cnRvaW50X2Zyb21fdXNlcihidWYsIGNvdW50LCAxMCwgJmVuYWJsZSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWlmIChlbmFibGUpCisJCXVzYl9sb2dfZW5hYmxlKGVzMik7CisJZWxzZQorCQl1c2JfbG9nX2Rpc2FibGUoZXMyKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXBiX2xvZ19lbmFibGVfZm9wcyA9IHsKKwkucmVhZAk9IGFwYl9sb2dfZW5hYmxlX3JlYWQsCisJLndyaXRlCT0gYXBiX2xvZ19lbmFibGVfd3JpdGUsCit9OworCitzdGF0aWMgaW50IGFwYl9nZXRfY3BvcnRfY291bnQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCit7CisJaW50IHJldHZhbDsKKwlfX2xlMTYgKmNwb3J0X2NvdW50OworCisJY3BvcnRfY291bnQgPSBremFsbG9jKHNpemVvZigqY3BvcnRfY291bnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNwb3J0X2NvdW50KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksCisJCQkJIEdCX0FQQl9SRVFVRVNUX0NQT1JUX0NPVU5ULAorCQkJCSBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwKKwkJCQkgVVNCX1JFQ0lQX0lOVEVSRkFDRSwgMCwgMCwgY3BvcnRfY291bnQsCisJCQkJIHNpemVvZigqY3BvcnRfY291bnQpLCBFUzJfVVNCX0NUUkxfVElNRU9VVCk7CisJaWYgKHJldHZhbCAhPSBzaXplb2YoKmNwb3J0X2NvdW50KSkgeworCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJDYW5ub3QgcmV0cmlldmUgQ1BvcnQgY291bnQ6ICVkXG4iLAorCQkJcmV0dmFsKTsKKworCQlpZiAocmV0dmFsID49IDApCisJCQlyZXR2YWwgPSAtRUlPOworCisJCWdvdG8gb3V0OworCX0KKworCXJldHZhbCA9IGxlMTZfdG9fY3B1KCpjcG9ydF9jb3VudCk7CisKKwkvKiBXZSBuZWVkIHRvIGZpdCBhIENQb3J0IElEIGluIG9uZSBieXRlIG9mIGEgbWVzc2FnZSBoZWFkZXIgKi8KKwlpZiAocmV0dmFsID4gVThfTUFYKSB7CisJCXJldHZhbCA9IFU4X01BWDsKKwkJZGV2X3dhcm4oJnVkZXYtPmRldiwgIkxpbWl0aW5nIG51bWJlciBvZiBDUG9ydHMgdG8gVThfTUFYXG4iKTsKKwl9CisKK291dDoKKwlrZnJlZShjcG9ydF9jb3VudCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFRoZSBFUzIgVVNCIEJyaWRnZSBkZXZpY2UgaGFzIDE1IGVuZHBvaW50cworICogMSBDb250cm9sIC0gdXN1YWwgVVNCIHN0dWZmICsgQVAgLT4gQVBCcmlkZ2VBIG1lc3NhZ2VzCisgKiA3IEJ1bGsgSU4gLSBDUG9ydCBkYXRhIGluCisgKiA3IEJ1bGsgT1VUIC0gQ1BvcnQgZGF0YSBvdXQKKyAqLworc3RhdGljIGludCBhcF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAorCQkgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBlczJfYXBfZGV2ICplczI7CisJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9kZXNjOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJX191OCBlcF9hZGRyOworCWludCByZXR2YWw7CisJaW50IGk7CisJaW50IG51bV9jcG9ydHM7CisJYm9vbCBidWxrX291dF9mb3VuZCA9IGZhbHNlOworCWJvb2wgYnVsa19pbl9mb3VuZCA9IGZhbHNlOworCWJvb2wgYXJwY19pbl9mb3VuZCA9IGZhbHNlOworCisJdWRldiA9IHVzYl9nZXRfZGV2KGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSk7CisKKwludW1fY3BvcnRzID0gYXBiX2dldF9jcG9ydF9jb3VudCh1ZGV2KTsKKwlpZiAobnVtX2Nwb3J0cyA8IDApIHsKKwkJdXNiX3B1dF9kZXYodWRldik7CisJCWRldl9lcnIoJnVkZXYtPmRldiwgIkNhbm5vdCByZXRyaWV2ZSBDUG9ydCBjb3VudDogJWRcbiIsCisJCQludW1fY3BvcnRzKTsKKwkJcmV0dXJuIG51bV9jcG9ydHM7CisJfQorCisJaGQgPSBnYl9oZF9jcmVhdGUoJmVzMl9kcml2ZXIsICZ1ZGV2LT5kZXYsIEVTMl9HQlVGX01TR19TSVpFX01BWCwKKwkJCQludW1fY3BvcnRzKTsKKwlpZiAoSVNfRVJSKGhkKSkgeworCQl1c2JfcHV0X2Rldih1ZGV2KTsKKwkJcmV0dXJuIFBUUl9FUlIoaGQpOworCX0KKworCWVzMiA9IGhkX3RvX2VzMihoZCk7CisJZXMyLT5oZCA9IGhkOworCWVzMi0+dXNiX2ludGYgPSBpbnRlcmZhY2U7CisJZXMyLT51c2JfZGV2ID0gdWRldjsKKwlzcGluX2xvY2tfaW5pdCgmZXMyLT5jcG9ydF9vdXRfdXJiX2xvY2spOworCUlOSVRfS0ZJRk8oZXMyLT5hcGJfbG9nX2ZpZm8pOworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBlczIpOworCisJLyoKKwkgKiBSZXNlcnZlIHRoZSBDRFNJMCBhbmQgQ0RTSTEgQ1BvcnRzIHNvIHRoZXkgd29uJ3QgYmUgYWxsb2NhdGVkCisJICogZHluYW1pY2FsbHkuCisJICovCisJcmV0dmFsID0gZ2JfaGRfY3BvcnRfcmVzZXJ2ZShoZCwgRVMyX0NQT1JUX0NEU0kwKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm9yOworCXJldHZhbCA9IGdiX2hkX2Nwb3J0X3Jlc2VydmUoaGQsIEVTMl9DUE9SVF9DRFNJMSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvcjsKKworCS8qIGZpbmQgYWxsIGJ1bGsgZW5kcG9pbnRzICovCisJaWZhY2VfZGVzYyA9IGludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmc7CisJZm9yIChpID0gMDsgaSA8IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsgKytpKSB7CisJCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2M7CisJCWVwX2FkZHIgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKKworCQlpZiAodXNiX2VuZHBvaW50X2lzX2J1bGtfaW4oZW5kcG9pbnQpKSB7CisJCQlpZiAoIWJ1bGtfaW5fZm91bmQpIHsKKwkJCQllczItPmNwb3J0X2luLmVuZHBvaW50ID0gZXBfYWRkcjsKKwkJCQlidWxrX2luX2ZvdW5kID0gdHJ1ZTsKKwkJCX0gZWxzZSBpZiAoIWFycGNfaW5fZm91bmQpIHsKKwkJCQllczItPmFycGNfZW5kcG9pbnRfaW4gPSBlcF9hZGRyOworCQkJCWFycGNfaW5fZm91bmQgPSB0cnVlOworCQkJfSBlbHNlIHsKKwkJCQlkZXZfd2FybigmdWRldi0+ZGV2LAorCQkJCQkgIlVudXNlZCBidWxrIElOIGVuZHBvaW50IGZvdW5kOiAweCUwMnhcbiIsCisJCQkJCSBlcF9hZGRyKTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICh1c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQoZW5kcG9pbnQpKSB7CisJCQlpZiAoIWJ1bGtfb3V0X2ZvdW5kKSB7CisJCQkJZXMyLT5jcG9ydF9vdXRfZW5kcG9pbnQgPSBlcF9hZGRyOworCQkJCWJ1bGtfb3V0X2ZvdW5kID0gdHJ1ZTsKKwkJCX0gZWxzZSB7CisJCQkJZGV2X3dhcm4oJnVkZXYtPmRldiwKKwkJCQkJICJVbnVzZWQgYnVsayBPVVQgZW5kcG9pbnQgZm91bmQ6IDB4JTAyeFxuIiwKKwkJCQkJIGVwX2FkZHIpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJZGV2X3dhcm4oJnVkZXYtPmRldiwKKwkJCSAiVW5rbm93biBlbmRwb2ludCB0eXBlIGZvdW5kLCBhZGRyZXNzIDB4JTAyeFxuIiwKKwkJCSBlcF9hZGRyKTsKKwl9CisJaWYgKCFidWxrX2luX2ZvdW5kIHx8ICFhcnBjX2luX2ZvdW5kIHx8ICFidWxrX291dF9mb3VuZCkgeworCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJOb3QgZW5vdWdoIGVuZHBvaW50cyBmb3VuZCBpbiBkZXZpY2UsIGFib3J0aW5nIVxuIik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogQWxsb2NhdGUgYnVmZmVycyBmb3Igb3VyIGNwb3J0IGluIG1lc3NhZ2VzICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9DUE9SVF9JTl9VUkI7ICsraSkgeworCQlzdHJ1Y3QgdXJiICp1cmI7CisJCXU4ICpidWZmZXI7CisKKwkJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF1cmIpIHsKKwkJCXJldHZhbCA9IC1FTk9NRU07CisJCQlnb3RvIGVycm9yOworCQl9CisJCWVzMi0+Y3BvcnRfaW4udXJiW2ldID0gdXJiOworCisJCWJ1ZmZlciA9IGttYWxsb2MoRVMyX0dCVUZfTVNHX1NJWkVfTUFYLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFidWZmZXIpIHsKKwkJCXJldHZhbCA9IC1FTk9NRU07CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJdXNiX2ZpbGxfYnVsa191cmIodXJiLCB1ZGV2LAorCQkJCSAgdXNiX3JjdmJ1bGtwaXBlKHVkZXYsIGVzMi0+Y3BvcnRfaW4uZW5kcG9pbnQpLAorCQkJCSAgYnVmZmVyLCBFUzJfR0JVRl9NU0dfU0laRV9NQVgsCisJCQkJICBjcG9ydF9pbl9jYWxsYmFjaywgaGQpOworCisJCWVzMi0+Y3BvcnRfaW4uYnVmZmVyW2ldID0gYnVmZmVyOworCX0KKworCS8qIEFsbG9jYXRlIGJ1ZmZlcnMgZm9yIEFSUEMgaW4gbWVzc2FnZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0FSUENfSU5fVVJCOyArK2kpIHsKKwkJc3RydWN0IHVyYiAqdXJiOworCQl1OCAqYnVmZmVyOworCisJCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJCWlmICghdXJiKSB7CisJCQlyZXR2YWwgPSAtRU5PTUVNOworCQkJZ290byBlcnJvcjsKKwkJfQorCQllczItPmFycGNfdXJiW2ldID0gdXJiOworCisJCWJ1ZmZlciA9IGttYWxsb2MoQVJQQ19JTl9TSVpFX01BWCwgR0ZQX0tFUk5FTCk7CisJCWlmICghYnVmZmVyKSB7CisJCQlyZXR2YWwgPSAtRU5PTUVNOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgdWRldiwKKwkJCQkgIHVzYl9yY3ZidWxrcGlwZSh1ZGV2LAorCQkJCQkJICBlczItPmFycGNfZW5kcG9pbnRfaW4pLAorCQkJCSAgYnVmZmVyLCBBUlBDX0lOX1NJWkVfTUFYLAorCQkJCSAgYXJwY19pbl9jYWxsYmFjaywgZXMyKTsKKworCQllczItPmFycGNfYnVmZmVyW2ldID0gYnVmZmVyOworCX0KKworCS8qIEFsbG9jYXRlIHVyYnMgZm9yIG91ciBDUG9ydCBPVVQgbWVzc2FnZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0NQT1JUX09VVF9VUkI7ICsraSkgeworCQlzdHJ1Y3QgdXJiICp1cmI7CisKKwkJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF1cmIpIHsKKwkJCXJldHZhbCA9IC1FTk9NRU07CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJZXMyLT5jcG9ydF9vdXRfdXJiW2ldID0gdXJiOworCQllczItPmNwb3J0X291dF91cmJfYnVzeVtpXSA9IGZhbHNlOwkvKiBqdXN0IHRvIGJlIGFuYWwgKi8KKwl9CisKKwkvKiBYWFggV2Ugd2lsbCBuZWVkIHRvIHJlbmFtZSB0aGlzIHBlciBBUEIgKi8KKwllczItPmFwYl9sb2dfZW5hYmxlX2RlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImFwYl9sb2dfZW5hYmxlIiwKKwkJCQkJCQkoU19JV1VTUiB8IFNfSVJVR08pLAorCQkJCQkJCWdiX2RlYnVnZnNfZ2V0KCksIGVzMiwKKwkJCQkJCQkmYXBiX2xvZ19lbmFibGVfZm9wcyk7CisKKwlJTklUX0xJU1RfSEVBRCgmZXMyLT5hcnBjcyk7CisJc3Bpbl9sb2NrX2luaXQoJmVzMi0+YXJwY19sb2NrKTsKKworCWlmIChlczJfYXJwY19pbl9lbmFibGUoZXMyKSkKKwkJZ290byBlcnJvcjsKKworCXJldHZhbCA9IGdiX2hkX2FkZChoZCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJfZGlzYWJsZV9hcnBjX2luOworCisJcmV0dmFsID0gZXMyX2Nwb3J0X2luX2VuYWJsZShlczIsICZlczItPmNwb3J0X2luKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycl9oZF9kZWw7CisKKwlyZXR1cm4gMDsKKworZXJyX2hkX2RlbDoKKwlnYl9oZF9kZWwoaGQpOworZXJyX2Rpc2FibGVfYXJwY19pbjoKKwllczJfYXJwY19pbl9kaXNhYmxlKGVzMik7CitlcnJvcjoKKwllczJfZGVzdHJveShlczIpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgYXBfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCXN0cnVjdCBlczJfYXBfZGV2ICplczIgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisKKwlnYl9oZF9kZWwoZXMyLT5oZCk7CisKKwllczJfY3BvcnRfaW5fZGlzYWJsZShlczIsICZlczItPmNwb3J0X2luKTsKKwllczJfYXJwY19pbl9kaXNhYmxlKGVzMik7CisKKwllczJfZGVzdHJveShlczIpOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgZXMyX2FwX2RyaXZlciA9IHsKKwkubmFtZSA9CQkiZXMyX2FwX2RyaXZlciIsCisJLnByb2JlID0JYXBfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPQlhcF9kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9CWlkX3RhYmxlLAorCS5zb2Z0X3VuYmluZCA9CTEsCit9OworCittb2R1bGVfdXNiX2RyaXZlcihlczJfYXBfZHJpdmVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FVVEhPUigiR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAbGludXhmb3VuZGF0aW9uLm9yZz4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2Zpcm13YXJlLmggYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9maXJtd2FyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZjBkYjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9maXJtd2FyZS5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBHcmV5YnVzIEZpcm13YXJlIE1hbmFnZW1lbnQgSGVhZGVyCisgKgorICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE2IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2lmbmRlZiBfX0ZJUk1XQVJFX0gKKyNkZWZpbmUgX19GSVJNV0FSRV9ICisKKyNpbmNsdWRlICJncmV5YnVzLmgiCisKKyNkZWZpbmUgRldfTkFNRV9QUkVGSVgJImdtcF8iCisKKy8qCisgKiBMZW5ndGggb2YgdGhlIHN0cmluZyBpbiBmb3JtYXQ6ICJGV19OQU1FX1BSRUZJWCIiJTA4eF8lMDh4XyUwOHhfJTA4eF8lcy50ZnRmIgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMgKyAxICsgNCAqICg4ICsgMSkgKyAxMCArIDEgKyA0ICsgMSkKKyAqLworI2RlZmluZSBGV19OQU1FX1NJWkUJCTU2CisKKy8qIEZpcm13YXJlIE1hbmFnZW1lbnQgUHJvdG9jb2wgc3BlY2lmaWMgZnVuY3Rpb25zICovCitpbnQgZndfbWdtdF9pbml0KHZvaWQpOwordm9pZCBmd19tZ210X2V4aXQodm9pZCk7CitzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqdG9fZndfbWdtdF9jb25uZWN0aW9uKHN0cnVjdCBkZXZpY2UgKmRldik7CitpbnQgZ2JfZndfbWdtdF9yZXF1ZXN0X2hhbmRsZXIoc3RydWN0IGdiX29wZXJhdGlvbiAqb3ApOworaW50IGdiX2Z3X21nbXRfY29ubmVjdGlvbl9pbml0KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK3ZvaWQgZ2JfZndfbWdtdF9jb25uZWN0aW9uX2V4aXQoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCisvKiBGaXJtd2FyZSBEb3dubG9hZCBQcm90b2NvbCBzcGVjaWZpYyBmdW5jdGlvbnMgKi8KK2ludCBnYl9md19kb3dubG9hZF9yZXF1ZXN0X2hhbmRsZXIoc3RydWN0IGdiX29wZXJhdGlvbiAqb3ApOworaW50IGdiX2Z3X2Rvd25sb2FkX2Nvbm5lY3Rpb25faW5pdChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7Cit2b2lkIGdiX2Z3X2Rvd25sb2FkX2Nvbm5lY3Rpb25fZXhpdChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKKy8qIENBUCBQcm90b2NvbCBzcGVjaWZpYyBmdW5jdGlvbnMgKi8KK2ludCBjYXBfaW5pdCh2b2lkKTsKK3ZvaWQgY2FwX2V4aXQodm9pZCk7CitpbnQgZ2JfY2FwX2Nvbm5lY3Rpb25faW5pdChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7Cit2b2lkIGdiX2NhcF9jb25uZWN0aW9uX2V4aXQoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCisjZW5kaWYgLyogX19GSVJNV0FSRV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9mdy1jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9mdy1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU0YTk4OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2Z3LWNvcmUuYwpAQCAtMCwwICsxLDMxMiBAQAorLyoKKyAqIEdyZXlidXMgRmlybXdhcmUgQ29yZSBCdW5kbGUgRHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNiBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgImZpcm13YXJlLmgiCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorI2luY2x1ZGUgInNwaWxpYi5oIgorCitzdHJ1Y3QgZ2JfZndfY29yZSB7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24JKmRvd25sb2FkX2Nvbm5lY3Rpb247CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24JKm1nbXRfY29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbgkqc3BpX2Nvbm5lY3Rpb247CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24JKmNhcF9jb25uZWN0aW9uOworfTsKKworc3RhdGljIHN0cnVjdCBzcGlsaWJfb3BzICpzcGlsaWJfb3BzOworCitzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqdG9fZndfbWdtdF9jb25uZWN0aW9uKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2JfZndfY29yZSAqZndfY29yZSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0dXJuIGZ3X2NvcmUtPm1nbXRfY29ubmVjdGlvbjsKK30KKworc3RhdGljIGludCBnYl9md19zcGlfY29ubmVjdGlvbl9pbml0KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCWludCByZXQ7CisKKwlpZiAoIWNvbm5lY3Rpb24pCisJCXJldHVybiAwOworCisJcmV0ID0gZ2JfY29ubmVjdGlvbl9lbmFibGUoY29ubmVjdGlvbik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGdiX3NwaWxpYl9tYXN0ZXJfaW5pdChjb25uZWN0aW9uLCAmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsCisJCQkJICAgIHNwaWxpYl9vcHMpOworCWlmIChyZXQpIHsKKwkJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGNvbm5lY3Rpb24pOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnYl9md19zcGlfY29ubmVjdGlvbl9leGl0KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCWlmICghY29ubmVjdGlvbikKKwkJcmV0dXJuOworCisJZ2Jfc3BpbGliX21hc3Rlcl9leGl0KGNvbm5lY3Rpb24pOworCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShjb25uZWN0aW9uKTsKK30KKworc3RhdGljIGludCBnYl9md19jb3JlX3Byb2JlKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgZ3JleWJ1c19idW5kbGVfaWQgKmlkKQoreworCXN0cnVjdCBncmV5YnVzX2Rlc2NyaXB0b3JfY3BvcnQgKmNwb3J0X2Rlc2M7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisJc3RydWN0IGdiX2Z3X2NvcmUgKmZ3X2NvcmU7CisJaW50IHJldCwgaTsKKwl1MTYgY3BvcnRfaWQ7CisJdTggcHJvdG9jb2xfaWQ7CisKKwlmd19jb3JlID0ga3phbGxvYyhzaXplb2YoKmZ3X2NvcmUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZ3X2NvcmUpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogUGFyc2UgQ1BvcnRzIGFuZCBjcmVhdGUgY29ubmVjdGlvbnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYnVuZGxlLT5udW1fY3BvcnRzOyBpKyspIHsKKwkJY3BvcnRfZGVzYyA9ICZidW5kbGUtPmNwb3J0X2Rlc2NbaV07CisJCWNwb3J0X2lkID0gbGUxNl90b19jcHUoY3BvcnRfZGVzYy0+aWQpOworCQlwcm90b2NvbF9pZCA9IGNwb3J0X2Rlc2MtPnByb3RvY29sX2lkOworCisJCXN3aXRjaCAocHJvdG9jb2xfaWQpIHsKKwkJY2FzZSBHUkVZQlVTX1BST1RPQ09MX0ZXX01BTkFHRU1FTlQ6CisJCQkvKiBEaXNhbGxvdyBtdWx0aXBsZSBGaXJtd2FyZSBNYW5hZ2VtZW50IENQb3J0cyAqLworCQkJaWYgKGZ3X2NvcmUtPm1nbXRfY29ubmVjdGlvbikgeworCQkJCWRldl9lcnIoJmJ1bmRsZS0+ZGV2LAorCQkJCQkibXVsdGlwbGUgbWFuYWdlbWVudCBDUG9ydHMgZm91bmRcbiIpOworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJZ290byBlcnJfZGVzdHJveV9jb25uZWN0aW9uczsKKwkJCX0KKworCQkJY29ubmVjdGlvbiA9IGdiX2Nvbm5lY3Rpb25fY3JlYXRlKGJ1bmRsZSwgY3BvcnRfaWQsCisJCQkJCQlnYl9md19tZ210X3JlcXVlc3RfaGFuZGxlcik7CisJCQlpZiAoSVNfRVJSKGNvbm5lY3Rpb24pKSB7CisJCQkJcmV0ID0gUFRSX0VSUihjb25uZWN0aW9uKTsKKwkJCQlkZXZfZXJyKCZidW5kbGUtPmRldiwKKwkJCQkJImZhaWxlZCB0byBjcmVhdGUgbWFuYWdlbWVudCBjb25uZWN0aW9uICglZClcbiIsCisJCQkJCXJldCk7CisJCQkJZ290byBlcnJfZGVzdHJveV9jb25uZWN0aW9uczsKKwkJCX0KKworCQkJZndfY29yZS0+bWdtdF9jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKwkJCWJyZWFrOworCQljYXNlIEdSRVlCVVNfUFJPVE9DT0xfRldfRE9XTkxPQUQ6CisJCQkvKiBEaXNhbGxvdyBtdWx0aXBsZSBGaXJtd2FyZSBEb3dubG9hZCBDUG9ydHMgKi8KKwkJCWlmIChmd19jb3JlLT5kb3dubG9hZF9jb25uZWN0aW9uKSB7CisJCQkJZGV2X2VycigmYnVuZGxlLT5kZXYsCisJCQkJCSJtdWx0aXBsZSBkb3dubG9hZCBDUG9ydHMgZm91bmRcbiIpOworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJZ290byBlcnJfZGVzdHJveV9jb25uZWN0aW9uczsKKwkJCX0KKworCQkJY29ubmVjdGlvbiA9IGdiX2Nvbm5lY3Rpb25fY3JlYXRlKGJ1bmRsZSwgY3BvcnRfaWQsCisJCQkJCQlnYl9md19kb3dubG9hZF9yZXF1ZXN0X2hhbmRsZXIpOworCQkJaWYgKElTX0VSUihjb25uZWN0aW9uKSkgeworCQkJCWRldl9lcnIoJmJ1bmRsZS0+ZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBkb3dubG9hZCBjb25uZWN0aW9uICglbGQpXG4iLAorCQkJCQlQVFJfRVJSKGNvbm5lY3Rpb24pKTsKKwkJCX0gZWxzZSB7CisJCQkJZndfY29yZS0+ZG93bmxvYWRfY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisJCQl9CisKKwkJCWJyZWFrOworCQljYXNlIEdSRVlCVVNfUFJPVE9DT0xfU1BJOgorCQkJLyogRGlzYWxsb3cgbXVsdGlwbGUgU1BJIENQb3J0cyAqLworCQkJaWYgKGZ3X2NvcmUtPnNwaV9jb25uZWN0aW9uKSB7CisJCQkJZGV2X2VycigmYnVuZGxlLT5kZXYsCisJCQkJCSJtdWx0aXBsZSBTUEkgQ1BvcnRzIGZvdW5kXG4iKTsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWdvdG8gZXJyX2Rlc3Ryb3lfY29ubmVjdGlvbnM7CisJCQl9CisKKwkJCWNvbm5lY3Rpb24gPSBnYl9jb25uZWN0aW9uX2NyZWF0ZShidW5kbGUsIGNwb3J0X2lkLAorCQkJCQkJCSAgTlVMTCk7CisJCQlpZiAoSVNfRVJSKGNvbm5lY3Rpb24pKSB7CisJCQkJZGV2X2VycigmYnVuZGxlLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIFNQSSBjb25uZWN0aW9uICglbGQpXG4iLAorCQkJCQlQVFJfRVJSKGNvbm5lY3Rpb24pKTsKKwkJCX0gZWxzZSB7CisJCQkJZndfY29yZS0+c3BpX2Nvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCQkJfQorCisJCQlicmVhazsKKwkJY2FzZSBHUkVZQlVTX1BST1RPQ09MX0FVVEhFTlRJQ0FUSU9OOgorCQkJLyogRGlzYWxsb3cgbXVsdGlwbGUgQ0FQIENQb3J0cyAqLworCQkJaWYgKGZ3X2NvcmUtPmNhcF9jb25uZWN0aW9uKSB7CisJCQkJZGV2X2VycigmYnVuZGxlLT5kZXYsICJtdWx0aXBsZSBBdXRoZW50aWNhdGlvbiBDUG9ydHMgZm91bmRcbiIpOworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJZ290byBlcnJfZGVzdHJveV9jb25uZWN0aW9uczsKKwkJCX0KKworCQkJY29ubmVjdGlvbiA9IGdiX2Nvbm5lY3Rpb25fY3JlYXRlKGJ1bmRsZSwgY3BvcnRfaWQsCisJCQkJCQkJICBOVUxMKTsKKwkJCWlmIChJU19FUlIoY29ubmVjdGlvbikpIHsKKwkJCQlkZXZfZXJyKCZidW5kbGUtPmRldiwgImZhaWxlZCB0byBjcmVhdGUgQXV0aGVudGljYXRpb24gY29ubmVjdGlvbiAoJWxkKVxuIiwKKwkJCQkJUFRSX0VSUihjb25uZWN0aW9uKSk7CisJCQl9IGVsc2UgeworCQkJCWZ3X2NvcmUtPmNhcF9jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKwkJCX0KKworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfZXJyKCZidW5kbGUtPmRldiwgImludmFsaWQgcHJvdG9jb2wgaWQgKDB4JTAyeClcbiIsCisJCQkJcHJvdG9jb2xfaWQpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyX2Rlc3Ryb3lfY29ubmVjdGlvbnM7CisJCX0KKwl9CisKKwkvKiBGaXJtd2FyZSBNYW5hZ2VtZW50IGNvbm5lY3Rpb24gaXMgbWFuZGF0b3J5ICovCisJaWYgKCFmd19jb3JlLT5tZ210X2Nvbm5lY3Rpb24pIHsKKwkJZGV2X2VycigmYnVuZGxlLT5kZXYsICJtaXNzaW5nIG1hbmFnZW1lbnQgY29ubmVjdGlvblxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2Rlc3Ryb3lfY29ubmVjdGlvbnM7CisJfQorCisJcmV0ID0gZ2JfZndfZG93bmxvYWRfY29ubmVjdGlvbl9pbml0KGZ3X2NvcmUtPmRvd25sb2FkX2Nvbm5lY3Rpb24pOworCWlmIChyZXQpIHsKKwkJLyogV2UgbWF5IHN0aWxsIGJlIGFibGUgdG8gd29yayB3aXRoIHRoZSBJbnRlcmZhY2UgKi8KKwkJZGV2X2VycigmYnVuZGxlLT5kZXYsICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBmaXJtd2FyZSBkb3dubG9hZCBjb25uZWN0aW9uLCBkaXNhYmxlIGl0ICglZClcbiIsCisJCQlyZXQpOworCQlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koZndfY29yZS0+ZG93bmxvYWRfY29ubmVjdGlvbik7CisJCWZ3X2NvcmUtPmRvd25sb2FkX2Nvbm5lY3Rpb24gPSBOVUxMOworCX0KKworCXJldCA9IGdiX2Z3X3NwaV9jb25uZWN0aW9uX2luaXQoZndfY29yZS0+c3BpX2Nvbm5lY3Rpb24pOworCWlmIChyZXQpIHsKKwkJLyogV2UgbWF5IHN0aWxsIGJlIGFibGUgdG8gd29yayB3aXRoIHRoZSBJbnRlcmZhY2UgKi8KKwkJZGV2X2VycigmYnVuZGxlLT5kZXYsICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBTUEkgY29ubmVjdGlvbiwgZGlzYWJsZSBpdCAoJWQpXG4iLAorCQkJcmV0KTsKKwkJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGZ3X2NvcmUtPnNwaV9jb25uZWN0aW9uKTsKKwkJZndfY29yZS0+c3BpX2Nvbm5lY3Rpb24gPSBOVUxMOworCX0KKworCXJldCA9IGdiX2NhcF9jb25uZWN0aW9uX2luaXQoZndfY29yZS0+Y2FwX2Nvbm5lY3Rpb24pOworCWlmIChyZXQpIHsKKwkJLyogV2UgbWF5IHN0aWxsIGJlIGFibGUgdG8gd29yayB3aXRoIHRoZSBJbnRlcmZhY2UgKi8KKwkJZGV2X2VycigmYnVuZGxlLT5kZXYsICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBDQVAgY29ubmVjdGlvbiwgZGlzYWJsZSBpdCAoJWQpXG4iLAorCQkJcmV0KTsKKwkJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGZ3X2NvcmUtPmNhcF9jb25uZWN0aW9uKTsKKwkJZndfY29yZS0+Y2FwX2Nvbm5lY3Rpb24gPSBOVUxMOworCX0KKworCXJldCA9IGdiX2Z3X21nbXRfY29ubmVjdGlvbl9pbml0KGZ3X2NvcmUtPm1nbXRfY29ubmVjdGlvbik7CisJaWYgKHJldCkgeworCQkvKiBXZSBtYXkgc3RpbGwgYmUgYWJsZSB0byB3b3JrIHdpdGggdGhlIEludGVyZmFjZSAqLworCQlkZXZfZXJyKCZidW5kbGUtPmRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIGZpcm13YXJlIG1hbmFnZW1lbnQgY29ubmVjdGlvbiwgZGlzYWJsZSBpdCAoJWQpXG4iLAorCQkJcmV0KTsKKwkJZ290byBlcnJfZXhpdF9jb25uZWN0aW9uczsKKwl9CisKKwlncmV5YnVzX3NldF9kcnZkYXRhKGJ1bmRsZSwgZndfY29yZSk7CisKKwkvKiBGSVhNRTogUmVtb3ZlIHRoaXMgYWZ0ZXIgUzIgTG9hZGVyIGdldHMgcnVudGltZSBQTSBzdXBwb3J0ICovCisJaWYgKCEoYnVuZGxlLT5pbnRmLT5xdWlya3MgJiBHQl9JTlRFUkZBQ0VfUVVJUktfTk9fUE0pKQorCQlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChidW5kbGUpOworCisJcmV0dXJuIDA7CisKK2Vycl9leGl0X2Nvbm5lY3Rpb25zOgorCWdiX2NhcF9jb25uZWN0aW9uX2V4aXQoZndfY29yZS0+Y2FwX2Nvbm5lY3Rpb24pOworCWdiX2Z3X3NwaV9jb25uZWN0aW9uX2V4aXQoZndfY29yZS0+c3BpX2Nvbm5lY3Rpb24pOworCWdiX2Z3X2Rvd25sb2FkX2Nvbm5lY3Rpb25fZXhpdChmd19jb3JlLT5kb3dubG9hZF9jb25uZWN0aW9uKTsKK2Vycl9kZXN0cm95X2Nvbm5lY3Rpb25zOgorCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShmd19jb3JlLT5tZ210X2Nvbm5lY3Rpb24pOworCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShmd19jb3JlLT5jYXBfY29ubmVjdGlvbik7CisJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGZ3X2NvcmUtPnNwaV9jb25uZWN0aW9uKTsKKwlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koZndfY29yZS0+ZG93bmxvYWRfY29ubmVjdGlvbik7CisJa2ZyZWUoZndfY29yZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBnYl9md19jb3JlX2Rpc2Nvbm5lY3Qoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlKQoreworCXN0cnVjdCBnYl9md19jb3JlICpmd19jb3JlID0gZ3JleWJ1c19nZXRfZHJ2ZGF0YShidW5kbGUpOworCWludCByZXQ7CisKKwkvKiBGSVhNRTogUmVtb3ZlIHRoaXMgYWZ0ZXIgUzIgTG9hZGVyIGdldHMgcnVudGltZSBQTSBzdXBwb3J0ICovCisJaWYgKCEoYnVuZGxlLT5pbnRmLT5xdWlya3MgJiBHQl9JTlRFUkZBQ0VfUVVJUktfTk9fUE0pKSB7CisJCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoYnVuZGxlKTsKKwkJaWYgKHJldCkKKwkJCWdiX3BtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKGJ1bmRsZSk7CisJfQorCisJZ2JfZndfbWdtdF9jb25uZWN0aW9uX2V4aXQoZndfY29yZS0+bWdtdF9jb25uZWN0aW9uKTsKKwlnYl9jYXBfY29ubmVjdGlvbl9leGl0KGZ3X2NvcmUtPmNhcF9jb25uZWN0aW9uKTsKKwlnYl9md19zcGlfY29ubmVjdGlvbl9leGl0KGZ3X2NvcmUtPnNwaV9jb25uZWN0aW9uKTsKKwlnYl9md19kb3dubG9hZF9jb25uZWN0aW9uX2V4aXQoZndfY29yZS0+ZG93bmxvYWRfY29ubmVjdGlvbik7CisKKwlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koZndfY29yZS0+bWdtdF9jb25uZWN0aW9uKTsKKwlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koZndfY29yZS0+Y2FwX2Nvbm5lY3Rpb24pOworCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShmd19jb3JlLT5zcGlfY29ubmVjdGlvbik7CisJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGZ3X2NvcmUtPmRvd25sb2FkX2Nvbm5lY3Rpb24pOworCisJa2ZyZWUoZndfY29yZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3JleWJ1c19idW5kbGVfaWQgZ2JfZndfY29yZV9pZF90YWJsZVtdID0geworCXsgR1JFWUJVU19ERVZJQ0VfQ0xBU1MoR1JFWUJVU19DTEFTU19GV19NQU5BR0VNRU5UKSB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBncmV5YnVzX2RyaXZlciBnYl9md19jb3JlX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiZ2ItZmlybXdhcmUiLAorCS5wcm9iZQkJPSBnYl9md19jb3JlX3Byb2JlLAorCS5kaXNjb25uZWN0CT0gZ2JfZndfY29yZV9kaXNjb25uZWN0LAorCS5pZF90YWJsZQk9IGdiX2Z3X2NvcmVfaWRfdGFibGUsCit9OworCitzdGF0aWMgaW50IGZ3X2NvcmVfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBmd19tZ210X2luaXQoKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiRmFpbGVkIHRvIGluaXRpYWxpemUgZnctbWdtdCBjb3JlICglZClcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gY2FwX2luaXQoKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiRmFpbGVkIHRvIGluaXRpYWxpemUgY29tcG9uZW50IGF1dGhlbnRpY2F0aW9uIGNvcmUgKCVkKVxuIiwKKwkJICAgICAgIHJldCk7CisJCWdvdG8gZndfbWdtdF9leGl0OworCX0KKworCXJldCA9IGdyZXlidXNfcmVnaXN0ZXIoJmdiX2Z3X2NvcmVfZHJpdmVyKTsKKwlpZiAocmV0KQorCQlnb3RvIGNhcF9leGl0OworCisJcmV0dXJuIDA7CisKK2NhcF9leGl0OgorCWNhcF9leGl0KCk7Citmd19tZ210X2V4aXQ6CisJZndfbWdtdF9leGl0KCk7CisKKwlyZXR1cm4gcmV0OworfQorbW9kdWxlX2luaXQoZndfY29yZV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGZ3X2NvcmVfZXhpdCh2b2lkKQoreworCWdyZXlidXNfZGVyZWdpc3RlcigmZ2JfZndfY29yZV9kcml2ZXIpOworCWNhcF9leGl0KCk7CisJZndfbWdtdF9leGl0KCk7Cit9Cittb2R1bGVfZXhpdChmd19jb3JlX2V4aXQpOworCitNT0RVTEVfQUxJQVMoImdyZXlidXM6ZmlybXdhcmUiKTsKK01PRFVMRV9BVVRIT1IoIlZpcmVzaCBLdW1hciA8dmlyZXNoLmt1bWFyQGxpbmFyby5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkdyZXlidXMgRmlybXdhcmUgQnVuZGxlIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZnctZG93bmxvYWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2Z3LWRvd25sb2FkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ3MjQ2OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2Z3LWRvd25sb2FkLmMKQEAgLTAsMCArMSw0NjUgQEAKKy8qCisgKiBHcmV5YnVzIEZpcm13YXJlIERvd25sb2FkIFByb3RvY29sIERyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTYgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlICJmaXJtd2FyZS5oIgorI2luY2x1ZGUgImdyZXlidXMuaCIKKworLyogRXN0aW1hdGVkIG1pbmltdW0gYnVmZmVyIHNpemUsIGFjdHVhbCBzaXplIGNhbiBiZSBzbWFsbGVyIHRoYW4gdGhpcyAqLworI2RlZmluZSBNSU5fRkVUQ0hfU0laRQkJNTEyCisvKiBUaW1lb3V0LCBpbiBqaWZmaWVzLCB3aXRoaW4gd2hpY2ggZmV0Y2ggb3IgcmVsZWFzZSBmaXJtd2FyZSBtdXN0IGJlIGNhbGxlZCAqLworI2RlZmluZSBORVhUX1JFUV9USU1FT1VUX0oJbXNlY3NfdG9famlmZmllcygxMDAwKQorCitzdHJ1Y3QgZndfcmVxdWVzdCB7CisJdTgJCQlmaXJtd2FyZV9pZDsKKwlib29sCQkJZGlzYWJsZWQ7CisJYm9vbAkJCXRpbWVkb3V0OworCWNoYXIJCQluYW1lW0ZXX05BTUVfU0laRV07CisJY29uc3Qgc3RydWN0IGZpcm13YXJlCSpmdzsKKwlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7CisKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCWR3b3JrOworCS8qIFRpbWVvdXQsIGluIGppZmZpZXMsIHdpdGhpbiB3aGljaCB0aGUgZmlybXdhcmUgc2hhbGwgZG93bmxvYWQgKi8KKwl1bnNpZ25lZCBsb25nCQlyZWxlYXNlX3RpbWVvdXRfajsKKwlzdHJ1Y3Qga3JlZgkJa3JlZjsKKwlzdHJ1Y3QgZndfZG93bmxvYWQJKmZ3X2Rvd25sb2FkOworfTsKKworc3RydWN0IGZ3X2Rvd25sb2FkIHsKKwlzdHJ1Y3QgZGV2aWNlCQkqcGFyZW50OworCXN0cnVjdCBnYl9jb25uZWN0aW9uCSpjb25uZWN0aW9uOworCXN0cnVjdCBsaXN0X2hlYWQJZndfcmVxdWVzdHM7CisJc3RydWN0IGlkYQkJaWRfbWFwOworCXN0cnVjdCBtdXRleAkJbXV0ZXg7Cit9OworCitzdGF0aWMgdm9pZCBmd19yZXFfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgZndfcmVxdWVzdCAqZndfcmVxID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBmd19yZXF1ZXN0LCBrcmVmKTsKKworCWRldl9kYmcoZndfcmVxLT5md19kb3dubG9hZC0+cGFyZW50LCAiZmlybXdhcmUgJXMgcmVsZWFzZWRcbiIsCisJCWZ3X3JlcS0+bmFtZSk7CisKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3X3JlcS0+ZncpOworCisJLyoKKwkgKiBUaGUgcmVxdWVzdCB0aW1lZCBvdXQgYW5kIHRoZSBtb2R1bGUgbWF5IHNlbmQgYSBmZXRjaC1mdyBvcgorCSAqIHJlbGVhc2UtZncgcmVxdWVzdCBsYXRlci4gTGV0cyBibG9jayB0aGUgaWQgd2UgYWxsb2NhdGVkIGZvciB0aGlzCisJICogcmVxdWVzdCwgc28gdGhhdCB0aGUgQVAgZG9lc24ndCByZWZlciB0byBhIGxhdGVyIGZ3LXJlcXVlc3QgKHdpdGgKKwkgKiBzYW1lIGZpcm13YXJlX2lkKSBmb3IgdGhlIG9sZCB0aW1lZG91dCBmdy1yZXF1ZXN0LgorCSAqCisJICogTk9URToKKwkgKgorCSAqIFRoaXMgYWxzbyBtZWFucyB0aGF0IGFmdGVyIDI1NSB0aW1lb3V0cyB3ZSB3aWxsIGZhaWwgdG8gc2VydmljZSBuZXcKKwkgKiBmaXJtd2FyZSBkb3dubG9hZHMuIEJ1dCB3aGF0IGVsc2UgY2FuIHdlIGRvIGluIHRoYXQgY2FzZSBhbnl3YXk/IExldHMKKwkgKiBqdXN0IGhvcGUgdGhhdCBpdCBuZXZlciBoYXBwZW5zLgorCSAqLworCWlmICghZndfcmVxLT50aW1lZG91dCkKKwkJaWRhX3NpbXBsZV9yZW1vdmUoJmZ3X3JlcS0+ZndfZG93bmxvYWQtPmlkX21hcCwKKwkJCQkgIGZ3X3JlcS0+ZmlybXdhcmVfaWQpOworCisJa2ZyZWUoZndfcmVxKTsKK30KKworLyoKKyAqIEluY29taW5nIHJlcXVlc3RzIGFyZSBzZXJpYWxpemVkIGZvciBhIGNvbm5lY3Rpb24sIGFuZCB0aGUgb25seSByYWNlIHBvc3NpYmxlCisgKiBpcyBiZXR3ZWVuIHRoZSB0aW1lb3V0IGhhbmRsZXIgZnJlZWluZyB0aGlzIGFuZCBhbiBpbmNvbWluZyByZXF1ZXN0LgorICoKKyAqIFRoZSBvcGVyYXRpb25zIG9uIHRoZSBmdy1yZXF1ZXN0IGxpc3QgYXJlIHByb3RlY3RlZCBieSB0aGUgbXV0ZXggYW5kCisgKiBnZXRfZndfcmVxKCkgaW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IGJlZm9yZSByZXR1cm5pbmcgYSBmd19yZXEgcG9pbnRlcgorICogdG8gdGhlIHVzZXJzLgorICoKKyAqIGZyZWVfZmlybXdhcmUoKSBhbHNvIHRha2VzIHRoZSBtdXRleCB3aGlsZSByZW1vdmluZyBhbiBlbnRyeSBmcm9tIHRoZSBsaXN0LAorICogaXQgZ3VhcmFudGVlcyB0aGF0IGV2ZXJ5IHVzZXIgb2YgZndfcmVxIGhhcyB0YWtlbiBhIGtyZWYtcmVmZXJlbmNlIGJ5IG5vdyBhbmQKKyAqIHdlIHdvdWxkbid0IGhhdmUgYW55IG5ldyB1c2Vycy4KKyAqCisgKiBPbmNlIHRoZSBsYXN0IHVzZXIgZHJvcHMgdGhlIHJlZmVyZW5jZSwgdGhlIGZ3X3JlcSBzdHJ1Y3R1cmUgaXMgZnJlZWQuCisgKi8KK3N0YXRpYyB2b2lkIHB1dF9md19yZXEoc3RydWN0IGZ3X3JlcXVlc3QgKmZ3X3JlcSkKK3sKKwlrcmVmX3B1dCgmZndfcmVxLT5rcmVmLCBmd19yZXFfcmVsZWFzZSk7Cit9CisKKy8qIENhbGxlciBtdXN0IGNhbGwgcHV0X2Z3X3JlcSgpIGFmdGVyIHVzaW5nIHN0cnVjdCBmd19yZXF1ZXN0ICovCitzdGF0aWMgc3RydWN0IGZ3X3JlcXVlc3QgKmdldF9md19yZXEoc3RydWN0IGZ3X2Rvd25sb2FkICpmd19kb3dubG9hZCwKKwkJCQkgICAgIHU4IGZpcm13YXJlX2lkKQoreworCXN0cnVjdCBmd19yZXF1ZXN0ICpmd19yZXE7CisKKwltdXRleF9sb2NrKCZmd19kb3dubG9hZC0+bXV0ZXgpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmd19yZXEsICZmd19kb3dubG9hZC0+ZndfcmVxdWVzdHMsIG5vZGUpIHsKKwkJaWYgKGZ3X3JlcS0+ZmlybXdhcmVfaWQgPT0gZmlybXdhcmVfaWQpIHsKKwkJCWtyZWZfZ2V0KCZmd19yZXEtPmtyZWYpOworCQkJZ290byB1bmxvY2s7CisJCX0KKwl9CisKKwlmd19yZXEgPSBOVUxMOworCit1bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZmd19kb3dubG9hZC0+bXV0ZXgpOworCisJcmV0dXJuIGZ3X3JlcTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9maXJtd2FyZShzdHJ1Y3QgZndfZG93bmxvYWQgKmZ3X2Rvd25sb2FkLAorCQkJICBzdHJ1Y3QgZndfcmVxdWVzdCAqZndfcmVxKQoreworCS8qIEFscmVhZHkgZGlzYWJsZWQgZnJvbSB0aW1lb3V0IGhhbmRsZXJzICovCisJaWYgKGZ3X3JlcS0+ZGlzYWJsZWQpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmZ3X2Rvd25sb2FkLT5tdXRleCk7CisJbGlzdF9kZWwoJmZ3X3JlcS0+bm9kZSk7CisJbXV0ZXhfdW5sb2NrKCZmd19kb3dubG9hZC0+bXV0ZXgpOworCisJZndfcmVxLT5kaXNhYmxlZCA9IHRydWU7CisJcHV0X2Z3X3JlcShmd19yZXEpOworfQorCitzdGF0aWMgdm9pZCBmd19yZXF1ZXN0X3RpbWVkb3V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IHRvX2RlbGF5ZWRfd29yayh3b3JrKTsKKwlzdHJ1Y3QgZndfcmVxdWVzdCAqZndfcmVxID0gY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3QgZndfcmVxdWVzdCwgZHdvcmspOworCXN0cnVjdCBmd19kb3dubG9hZCAqZndfZG93bmxvYWQgPSBmd19yZXEtPmZ3X2Rvd25sb2FkOworCisJZGV2X2Vycihmd19kb3dubG9hZC0+cGFyZW50LAorCQkiVGltZWQgb3V0IHdhaXRpbmcgZm9yIGZldGNoIC8gcmVsZWFzZSBmaXJtd2FyZSByZXF1ZXN0czogJXVcbiIsCisJCWZ3X3JlcS0+ZmlybXdhcmVfaWQpOworCisJZndfcmVxLT50aW1lZG91dCA9IHRydWU7CisJZnJlZV9maXJtd2FyZShmd19kb3dubG9hZCwgZndfcmVxKTsKK30KKworc3RhdGljIGludCBleGNlZWRzX3JlbGVhc2VfdGltZW91dChzdHJ1Y3QgZndfcmVxdWVzdCAqZndfcmVxKQoreworCXN0cnVjdCBmd19kb3dubG9hZCAqZndfZG93bmxvYWQgPSBmd19yZXEtPmZ3X2Rvd25sb2FkOworCisJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGZ3X3JlcS0+cmVsZWFzZV90aW1lb3V0X2opKQorCQlyZXR1cm4gMDsKKworCWRldl9lcnIoZndfZG93bmxvYWQtPnBhcmVudCwKKwkJIkZpcm13YXJlIGRvd25sb2FkIGRpZG4ndCBmaW5pc2ggaW4gdGltZSwgYWJvcnQ6ICVkXG4iLAorCQlmd19yZXEtPmZpcm13YXJlX2lkKTsKKworCWZ3X3JlcS0+dGltZWRvdXQgPSB0cnVlOworCWZyZWVfZmlybXdhcmUoZndfZG93bmxvYWQsIGZ3X3JlcSk7CisKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworLyogVGhpcyByZXR1cm5zIHBhdGggb2YgdGhlIGZpcm13YXJlIGJsb2Igb24gdGhlIGRpc2sgKi8KK3N0YXRpYyBzdHJ1Y3QgZndfcmVxdWVzdCAqZmluZF9maXJtd2FyZShzdHJ1Y3QgZndfZG93bmxvYWQgKmZ3X2Rvd25sb2FkLAorCQkJCQljb25zdCBjaGFyICp0YWcpCit7CisJc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZiA9IGZ3X2Rvd25sb2FkLT5jb25uZWN0aW9uLT5idW5kbGUtPmludGY7CisJc3RydWN0IGZ3X3JlcXVlc3QgKmZ3X3JlcTsKKwlpbnQgcmV0LCByZXFfY291bnQ7CisKKwlmd19yZXEgPSBremFsbG9jKHNpemVvZigqZndfcmVxKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmd19yZXEpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJLyogQWxsb2NhdGUgaWRzIGZyb20gMSB0byAyNTUgKHU4LW1heCksIDAgaXMgYW4gaW52YWxpZCBpZCAqLworCXJldCA9IGlkYV9zaW1wbGVfZ2V0KCZmd19kb3dubG9hZC0+aWRfbWFwLCAxLCAyNTYsIEdGUF9LRVJORUwpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZndfZG93bmxvYWQtPnBhcmVudCwKKwkJCSJmYWlsZWQgdG8gYWxsb2NhdGUgZmlybXdhcmUgaWQgKCVkKVxuIiwgcmV0KTsKKwkJZ290byBlcnJfZnJlZV9yZXE7CisJfQorCWZ3X3JlcS0+ZmlybXdhcmVfaWQgPSByZXQ7CisKKwlzbnByaW50Zihmd19yZXEtPm5hbWUsIHNpemVvZihmd19yZXEtPm5hbWUpLAorCQkgRldfTkFNRV9QUkVGSVggIiUwOHhfJTA4eF8lMDh4XyUwOHhfJXMudGZ0ZiIsCisJCSBpbnRmLT5kZGJsMV9tYW51ZmFjdHVyZXJfaWQsIGludGYtPmRkYmwxX3Byb2R1Y3RfaWQsCisJCSBpbnRmLT52ZW5kb3JfaWQsIGludGYtPnByb2R1Y3RfaWQsIHRhZyk7CisKKwlkZXZfaW5mbyhmd19kb3dubG9hZC0+cGFyZW50LCAiUmVxdWVzdGVkIGZpcm13YXJlIHBhY2thZ2UgJyVzJ1xuIiwKKwkJIGZ3X3JlcS0+bmFtZSk7CisKKwlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmd19yZXEtPmZ3LCBmd19yZXEtPm5hbWUsIGZ3X2Rvd25sb2FkLT5wYXJlbnQpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycihmd19kb3dubG9hZC0+cGFyZW50LAorCQkJImZpcm13YXJlIHJlcXVlc3QgZmFpbGVkIGZvciAlcyAoJWQpXG4iLCBmd19yZXEtPm5hbWUsCisJCQlyZXQpOworCQlnb3RvIGVycl9mcmVlX2lkOworCX0KKworCWZ3X3JlcS0+ZndfZG93bmxvYWQgPSBmd19kb3dubG9hZDsKKwlrcmVmX2luaXQoJmZ3X3JlcS0+a3JlZik7CisKKwltdXRleF9sb2NrKCZmd19kb3dubG9hZC0+bXV0ZXgpOworCWxpc3RfYWRkKCZmd19yZXEtPm5vZGUsICZmd19kb3dubG9hZC0+ZndfcmVxdWVzdHMpOworCW11dGV4X3VubG9jaygmZndfZG93bmxvYWQtPm11dGV4KTsKKworCS8qIFRpbWVvdXQsIGluIGppZmZpZXMsIHdpdGhpbiB3aGljaCBmaXJtd2FyZSBzaG91bGQgZ2V0IGxvYWRlZCAqLworCXJlcV9jb3VudCA9IERJVl9ST1VORF9VUChmd19yZXEtPmZ3LT5zaXplLCBNSU5fRkVUQ0hfU0laRSk7CisJZndfcmVxLT5yZWxlYXNlX3RpbWVvdXRfaiA9IGppZmZpZXMgKyByZXFfY291bnQgKiBORVhUX1JFUV9USU1FT1VUX0o7CisKKwlJTklUX0RFTEFZRURfV09SSygmZndfcmVxLT5kd29yaywgZndfcmVxdWVzdF90aW1lZG91dCk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZmd19yZXEtPmR3b3JrLCBORVhUX1JFUV9USU1FT1VUX0opOworCisJcmV0dXJuIGZ3X3JlcTsKKworZXJyX2ZyZWVfaWQ6CisJaWRhX3NpbXBsZV9yZW1vdmUoJmZ3X2Rvd25sb2FkLT5pZF9tYXAsIGZ3X3JlcS0+ZmlybXdhcmVfaWQpOworZXJyX2ZyZWVfcmVxOgorCWtmcmVlKGZ3X3JlcSk7CisKKwlyZXR1cm4gRVJSX1BUUihyZXQpOworfQorCitzdGF0aWMgaW50IGZ3X2Rvd25sb2FkX2ZpbmRfZmlybXdhcmUoc3RydWN0IGdiX29wZXJhdGlvbiAqb3ApCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBvcC0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZndfZG93bmxvYWQgKmZ3X2Rvd25sb2FkID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShjb25uZWN0aW9uKTsKKwlzdHJ1Y3QgZ2JfZndfZG93bmxvYWRfZmluZF9maXJtd2FyZV9yZXF1ZXN0ICpyZXF1ZXN0OworCXN0cnVjdCBnYl9md19kb3dubG9hZF9maW5kX2Zpcm13YXJlX3Jlc3BvbnNlICpyZXNwb25zZTsKKwlzdHJ1Y3QgZndfcmVxdWVzdCAqZndfcmVxOworCWNvbnN0IGNoYXIgKnRhZzsKKworCWlmIChvcC0+cmVxdWVzdC0+cGF5bG9hZF9zaXplICE9IHNpemVvZigqcmVxdWVzdCkpIHsKKwkJZGV2X2Vycihmd19kb3dubG9hZC0+cGFyZW50LAorCQkJImlsbGVnYWwgc2l6ZSBvZiBmaW5kIGZpcm13YXJlIHJlcXVlc3QgKCV6dSAhPSAlenUpXG4iLAorCQkJb3AtPnJlcXVlc3QtPnBheWxvYWRfc2l6ZSwgc2l6ZW9mKCpyZXF1ZXN0KSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlcXVlc3QgPSBvcC0+cmVxdWVzdC0+cGF5bG9hZDsKKwl0YWcgPSAoY29uc3QgY2hhciAqKXJlcXVlc3QtPmZpcm13YXJlX3RhZzsKKworCS8qIGZpcm13YXJlX3RhZyBtdXN0IGJlIG51bGwtdGVybWluYXRlZCAqLworCWlmIChzdHJubGVuKHRhZywgR0JfRklSTVdBUkVfVEFHX01BWF9TSVpFKSA9PSBHQl9GSVJNV0FSRV9UQUdfTUFYX1NJWkUpIHsKKwkJZGV2X2Vycihmd19kb3dubG9hZC0+cGFyZW50LAorCQkJImZpcm13YXJlLXRhZyBpcyBub3QgbnVsbC10ZXJtaW5hdGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZndfcmVxID0gZmluZF9maXJtd2FyZShmd19kb3dubG9hZCwgdGFnKTsKKwlpZiAoSVNfRVJSKGZ3X3JlcSkpCisJCXJldHVybiBQVFJfRVJSKGZ3X3JlcSk7CisKKwlpZiAoIWdiX29wZXJhdGlvbl9yZXNwb25zZV9hbGxvYyhvcCwgc2l6ZW9mKCpyZXNwb25zZSksIEdGUF9LRVJORUwpKSB7CisJCWRldl9lcnIoZndfZG93bmxvYWQtPnBhcmVudCwgImVycm9yIGFsbG9jYXRpbmcgcmVzcG9uc2VcbiIpOworCQlmcmVlX2Zpcm13YXJlKGZ3X2Rvd25sb2FkLCBmd19yZXEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXNwb25zZSA9IG9wLT5yZXNwb25zZS0+cGF5bG9hZDsKKwlyZXNwb25zZS0+ZmlybXdhcmVfaWQgPSBmd19yZXEtPmZpcm13YXJlX2lkOworCXJlc3BvbnNlLT5zaXplID0gY3B1X3RvX2xlMzIoZndfcmVxLT5mdy0+c2l6ZSk7CisKKwlkZXZfZGJnKGZ3X2Rvd25sb2FkLT5wYXJlbnQsCisJCSJmaXJtd2FyZSBzaXplIGlzICV6dSBieXRlc1xuIiwgZndfcmVxLT5mdy0+c2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmd19kb3dubG9hZF9mZXRjaF9maXJtd2FyZShzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IG9wLT5jb25uZWN0aW9uOworCXN0cnVjdCBmd19kb3dubG9hZCAqZndfZG93bmxvYWQgPSBnYl9jb25uZWN0aW9uX2dldF9kYXRhKGNvbm5lY3Rpb24pOworCXN0cnVjdCBnYl9md19kb3dubG9hZF9mZXRjaF9maXJtd2FyZV9yZXF1ZXN0ICpyZXF1ZXN0OworCXN0cnVjdCBnYl9md19kb3dubG9hZF9mZXRjaF9maXJtd2FyZV9yZXNwb25zZSAqcmVzcG9uc2U7CisJc3RydWN0IGZ3X3JlcXVlc3QgKmZ3X3JlcTsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCXVuc2lnbmVkIGludCBvZmZzZXQsIHNpemU7CisJdTggZmlybXdhcmVfaWQ7CisJaW50IHJldCA9IDA7CisKKwlpZiAob3AtPnJlcXVlc3QtPnBheWxvYWRfc2l6ZSAhPSBzaXplb2YoKnJlcXVlc3QpKSB7CisJCWRldl9lcnIoZndfZG93bmxvYWQtPnBhcmVudCwKKwkJCSJJbGxlZ2FsIHNpemUgb2YgZmV0Y2ggZmlybXdhcmUgcmVxdWVzdCAoJXp1ICV6dSlcbiIsCisJCQlvcC0+cmVxdWVzdC0+cGF5bG9hZF9zaXplLCBzaXplb2YoKnJlcXVlc3QpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVxdWVzdCA9IG9wLT5yZXF1ZXN0LT5wYXlsb2FkOworCW9mZnNldCA9IGxlMzJfdG9fY3B1KHJlcXVlc3QtPm9mZnNldCk7CisJc2l6ZSA9IGxlMzJfdG9fY3B1KHJlcXVlc3QtPnNpemUpOworCWZpcm13YXJlX2lkID0gcmVxdWVzdC0+ZmlybXdhcmVfaWQ7CisKKwlmd19yZXEgPSBnZXRfZndfcmVxKGZ3X2Rvd25sb2FkLCBmaXJtd2FyZV9pZCk7CisJaWYgKCFmd19yZXEpIHsKKwkJZGV2X2Vycihmd19kb3dubG9hZC0+cGFyZW50LAorCQkJImZpcm13YXJlIG5vdCBhdmFpbGFibGUgZm9yIGlkOiAlMDJ1XG4iLCBmaXJtd2FyZV9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIE1ha2Ugc3VyZSB3b3JrIGhhbmRsZXIgaXNuJ3QgcnVubmluZyBpbiBwYXJhbGxlbCAqLworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZndfcmVxLT5kd29yayk7CisKKwkvKiBXZSB0aW1lZC1vdXQgYmVmb3JlIHJlYWNoaW5nIGhlcmUgPyAqLworCWlmIChmd19yZXEtPmRpc2FibGVkKSB7CisJCXJldCA9IC1FVElNRURPVVQ7CisJCWdvdG8gcHV0X2Z3OworCX0KKworCS8qCisJICogRmlybXdhcmUgZG93bmxvYWQgbXVzdCBmaW5pc2ggd2l0aGluIGEgbGltaXRlZCB0aW1lIGludGVydmFsLiBJZiBpdAorCSAqIGRvZXNuJ3QsIHRoZW4gd2UgbWlnaHQgaGF2ZSBhIGJ1Z2d5IE1vZHVsZSBvbiB0aGUgb3RoZXIgc2lkZS4gQWJvcnQKKwkgKiBkb3dubG9hZC4KKwkgKi8KKwlyZXQgPSBleGNlZWRzX3JlbGVhc2VfdGltZW91dChmd19yZXEpOworCWlmIChyZXQpCisJCWdvdG8gcHV0X2Z3OworCisJZncgPSBmd19yZXEtPmZ3OworCisJaWYgKG9mZnNldCA+PSBmdy0+c2l6ZSB8fCBzaXplID4gZnctPnNpemUgLSBvZmZzZXQpIHsKKwkJZGV2X2Vycihmd19kb3dubG9hZC0+cGFyZW50LAorCQkJImJhZCBmZXRjaCBmaXJtd2FyZSByZXF1ZXN0IChvZmZzID0gJXUsIHNpemUgPSAldSlcbiIsCisJCQlvZmZzZXQsIHNpemUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIHB1dF9mdzsKKwl9CisKKwlpZiAoIWdiX29wZXJhdGlvbl9yZXNwb25zZV9hbGxvYyhvcCwgc2l6ZW9mKCpyZXNwb25zZSkgKyBzaXplLAorCQkJCQkgR0ZQX0tFUk5FTCkpIHsKKwkJZGV2X2Vycihmd19kb3dubG9hZC0+cGFyZW50LAorCQkJImVycm9yIGFsbG9jYXRpbmcgZmV0Y2ggZmlybXdhcmUgcmVzcG9uc2VcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHB1dF9mdzsKKwl9CisKKwlyZXNwb25zZSA9IG9wLT5yZXNwb25zZS0+cGF5bG9hZDsKKwltZW1jcHkocmVzcG9uc2UtPmRhdGEsIGZ3LT5kYXRhICsgb2Zmc2V0LCBzaXplKTsKKworCWRldl9kYmcoZndfZG93bmxvYWQtPnBhcmVudCwKKwkJInJlc3BvbmRpbmcgd2l0aCBmaXJtd2FyZSAob2ZmcyA9ICV1LCBzaXplID0gJXUpXG4iLCBvZmZzZXQsCisJCXNpemUpOworCisJLyogUmVmcmVzaCB0aW1lb3V0ICovCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZmd19yZXEtPmR3b3JrLCBORVhUX1JFUV9USU1FT1VUX0opOworCitwdXRfZnc6CisJcHV0X2Z3X3JlcShmd19yZXEpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmd19kb3dubG9hZF9yZWxlYXNlX2Zpcm13YXJlKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gb3AtPmNvbm5lY3Rpb247CisJc3RydWN0IGZ3X2Rvd25sb2FkICpmd19kb3dubG9hZCA9IGdiX2Nvbm5lY3Rpb25fZ2V0X2RhdGEoY29ubmVjdGlvbik7CisJc3RydWN0IGdiX2Z3X2Rvd25sb2FkX3JlbGVhc2VfZmlybXdhcmVfcmVxdWVzdCAqcmVxdWVzdDsKKwlzdHJ1Y3QgZndfcmVxdWVzdCAqZndfcmVxOworCXU4IGZpcm13YXJlX2lkOworCisJaWYgKG9wLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUgIT0gc2l6ZW9mKCpyZXF1ZXN0KSkgeworCQlkZXZfZXJyKGZ3X2Rvd25sb2FkLT5wYXJlbnQsCisJCQkiSWxsZWdhbCBzaXplIG9mIHJlbGVhc2UgZmlybXdhcmUgcmVxdWVzdCAoJXp1ICV6dSlcbiIsCisJCQlvcC0+cmVxdWVzdC0+cGF5bG9hZF9zaXplLCBzaXplb2YoKnJlcXVlc3QpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVxdWVzdCA9IG9wLT5yZXF1ZXN0LT5wYXlsb2FkOworCWZpcm13YXJlX2lkID0gcmVxdWVzdC0+ZmlybXdhcmVfaWQ7CisKKwlmd19yZXEgPSBnZXRfZndfcmVxKGZ3X2Rvd25sb2FkLCBmaXJtd2FyZV9pZCk7CisJaWYgKCFmd19yZXEpIHsKKwkJZGV2X2Vycihmd19kb3dubG9hZC0+cGFyZW50LAorCQkJImZpcm13YXJlIG5vdCBhdmFpbGFibGUgZm9yIGlkOiAlMDJ1XG4iLCBmaXJtd2FyZV9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZndfcmVxLT5kd29yayk7CisKKwlmcmVlX2Zpcm13YXJlKGZ3X2Rvd25sb2FkLCBmd19yZXEpOworCXB1dF9md19yZXEoZndfcmVxKTsKKworCWRldl9kYmcoZndfZG93bmxvYWQtPnBhcmVudCwgInJlbGVhc2UgZmlybXdhcmVcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBnYl9md19kb3dubG9hZF9yZXF1ZXN0X2hhbmRsZXIoc3RydWN0IGdiX29wZXJhdGlvbiAqb3ApCit7CisJdTggdHlwZSA9IG9wLT50eXBlOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBHQl9GV19ET1dOTE9BRF9UWVBFX0ZJTkRfRklSTVdBUkU6CisJCXJldHVybiBmd19kb3dubG9hZF9maW5kX2Zpcm13YXJlKG9wKTsKKwljYXNlIEdCX0ZXX0RPV05MT0FEX1RZUEVfRkVUQ0hfRklSTVdBUkU6CisJCXJldHVybiBmd19kb3dubG9hZF9mZXRjaF9maXJtd2FyZShvcCk7CisJY2FzZSBHQl9GV19ET1dOTE9BRF9UWVBFX1JFTEVBU0VfRklSTVdBUkU6CisJCXJldHVybiBmd19kb3dubG9hZF9yZWxlYXNlX2Zpcm13YXJlKG9wKTsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZvcC0+Y29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsCisJCQkidW5zdXBwb3J0ZWQgcmVxdWVzdDogJXVcbiIsIHR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK2ludCBnYl9md19kb3dubG9hZF9jb25uZWN0aW9uX2luaXQoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJc3RydWN0IGZ3X2Rvd25sb2FkICpmd19kb3dubG9hZDsKKwlpbnQgcmV0OworCisJaWYgKCFjb25uZWN0aW9uKQorCQlyZXR1cm4gMDsKKworCWZ3X2Rvd25sb2FkID0ga3phbGxvYyhzaXplb2YoKmZ3X2Rvd25sb2FkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmd19kb3dubG9hZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmd19kb3dubG9hZC0+cGFyZW50ID0gJmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2OworCUlOSVRfTElTVF9IRUFEKCZmd19kb3dubG9hZC0+ZndfcmVxdWVzdHMpOworCWlkYV9pbml0KCZmd19kb3dubG9hZC0+aWRfbWFwKTsKKwlnYl9jb25uZWN0aW9uX3NldF9kYXRhKGNvbm5lY3Rpb24sIGZ3X2Rvd25sb2FkKTsKKwlmd19kb3dubG9hZC0+Y29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisJbXV0ZXhfaW5pdCgmZndfZG93bmxvYWQtPm11dGV4KTsKKworCXJldCA9IGdiX2Nvbm5lY3Rpb25fZW5hYmxlKGNvbm5lY3Rpb24pOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2Rlc3Ryb3lfaWRfbWFwOworCisJcmV0dXJuIDA7CisKK2Vycl9kZXN0cm95X2lkX21hcDoKKwlpZGFfZGVzdHJveSgmZndfZG93bmxvYWQtPmlkX21hcCk7CisJa2ZyZWUoZndfZG93bmxvYWQpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBnYl9md19kb3dubG9hZF9jb25uZWN0aW9uX2V4aXQoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJc3RydWN0IGZ3X2Rvd25sb2FkICpmd19kb3dubG9hZDsKKwlzdHJ1Y3QgZndfcmVxdWVzdCAqZndfcmVxLCAqdG1wOworCisJaWYgKCFjb25uZWN0aW9uKQorCQlyZXR1cm47CisKKwlmd19kb3dubG9hZCA9IGdiX2Nvbm5lY3Rpb25fZ2V0X2RhdGEoY29ubmVjdGlvbik7CisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGZ3X2Rvd25sb2FkLT5jb25uZWN0aW9uKTsKKworCS8qCisJICogTWFrZSBzdXJlIHdlIGhhdmUgYSByZWZlcmVuY2UgdG8gdGhlIHBlbmRpbmcgcmVxdWVzdHMsIGJlZm9yZSB0aGV5CisJICogYXJlIGZyZWVkIGZyb20gdGhlIHRpbWVvdXQgaGFuZGxlci4KKwkgKi8KKwltdXRleF9sb2NrKCZmd19kb3dubG9hZC0+bXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZndfcmVxLCAmZndfZG93bmxvYWQtPmZ3X3JlcXVlc3RzLCBub2RlKQorCQlrcmVmX2dldCgmZndfcmVxLT5rcmVmKTsKKwltdXRleF91bmxvY2soJmZ3X2Rvd25sb2FkLT5tdXRleCk7CisKKwkvKiBSZWxlYXNlIHBlbmRpbmcgZmlybXdhcmUgcGFja2FnZXMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZndfcmVxLCB0bXAsICZmd19kb3dubG9hZC0+ZndfcmVxdWVzdHMsIG5vZGUpIHsKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZmd19yZXEtPmR3b3JrKTsKKwkJZnJlZV9maXJtd2FyZShmd19kb3dubG9hZCwgZndfcmVxKTsKKwkJcHV0X2Z3X3JlcShmd19yZXEpOworCX0KKworCWlkYV9kZXN0cm95KCZmd19kb3dubG9hZC0+aWRfbWFwKTsKKwlrZnJlZShmd19kb3dubG9hZCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9mdy1tYW5hZ2VtZW50LmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9mdy1tYW5hZ2VtZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NkNmNmMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2Z3LW1hbmFnZW1lbnQuYwpAQCAtMCwwICsxLDcyMSBAQAorLyoKKyAqIEdyZXlidXMgRmlybXdhcmUgTWFuYWdlbWVudCBQcm90b2NvbCBEcml2ZXIuCisgKgorICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE2IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiZmlybXdhcmUuaCIKKyNpbmNsdWRlICJncmV5YnVzX2Zpcm13YXJlLmgiCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorCisjZGVmaW5lIEZXX01HTVRfVElNRU9VVF9NUwkJMTAwMAorCitzdHJ1Y3QgZndfbWdtdCB7CisJc3RydWN0IGRldmljZQkJKnBhcmVudDsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbgkqY29ubmVjdGlvbjsKKwlzdHJ1Y3Qga3JlZgkJa3JlZjsKKwlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7CisKKwkvKiBDb21tb24gaWQtbWFwIGZvciBpbnRlcmZhY2UgYW5kIGJhY2tlbmQgZmlybXdhcmUgcmVxdWVzdHMgKi8KKwlzdHJ1Y3QgaWRhCQlpZF9tYXA7CisJc3RydWN0IG11dGV4CQltdXRleDsKKwlzdHJ1Y3QgY29tcGxldGlvbgljb21wbGV0aW9uOworCXN0cnVjdCBjZGV2CQljZGV2OworCXN0cnVjdCBkZXZpY2UJCSpjbGFzc19kZXZpY2U7CisJZGV2X3QJCQlkZXZfbnVtOworCXVuc2lnbmVkIGludAkJdGltZW91dF9qaWZmaWVzOworCWJvb2wJCQlkaXNhYmxlZDsgLyogY29ubmVjdGlvbiBnZXR0aW5nIGRpc2FibGVkICovCisKKwkvKiBJbnRlcmZhY2UgRmlybXdhcmUgc3BlY2lmaWMgZmllbGRzICovCisJYm9vbAkJCW1vZGVfc3dpdGNoX3N0YXJ0ZWQ7CisJYm9vbAkJCWludGZfZndfbG9hZGVkOworCXU4CQkJaW50Zl9md19yZXF1ZXN0X2lkOworCXU4CQkJaW50Zl9md19zdGF0dXM7CisJdTE2CQkJaW50Zl9md19tYWpvcjsKKwl1MTYJCQlpbnRmX2Z3X21pbm9yOworCisJLyogQmFja2VuZCBGaXJtd2FyZSBzcGVjaWZpYyBmaWVsZHMgKi8KKwl1OAkJCWJhY2tlbmRfZndfcmVxdWVzdF9pZDsKKwl1OAkJCWJhY2tlbmRfZndfc3RhdHVzOworfTsKKworLyoKKyAqIE51bWJlciBvZiBtaW5vciBkZXZpY2VzIHRoaXMgZHJpdmVyIHN1cHBvcnRzLgorICogVGhlcmUgd2lsbCBiZSBleGFjdGx5IG9uZSByZXF1aXJlZCBwZXIgSW50ZXJmYWNlLgorICovCisjZGVmaW5lIE5VTV9NSU5PUlMJCVU4X01BWAorCitzdGF0aWMgc3RydWN0IGNsYXNzICpmd19tZ210X2NsYXNzOworc3RhdGljIGRldl90IGZ3X21nbXRfZGV2X251bTsKK3N0YXRpYyBERUZJTkVfSURBKGZ3X21nbXRfbWlub3JzX21hcCk7CitzdGF0aWMgTElTVF9IRUFEKGZ3X21nbXRfbGlzdCk7CitzdGF0aWMgREVGSU5FX01VVEVYKGxpc3RfbXV0ZXgpOworCitzdGF0aWMgdm9pZCBmd19tZ210X2tyZWZfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgZndfbWdtdCAqZndfbWdtdCA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgZndfbWdtdCwga3JlZik7CisKKwlpZGFfZGVzdHJveSgmZndfbWdtdC0+aWRfbWFwKTsKKwlrZnJlZShmd19tZ210KTsKK30KKworLyoKKyAqIEFsbCB1c2VycyBvZiBmd19tZ210IHRha2UgYSByZWZlcmVuY2UgKGZyb20gd2l0aGluIGxpc3RfbXV0ZXggbG9jayksIGJlZm9yZQorICogdGhleSBnZXQgYSBwb2ludGVyIHRvIHBsYXkgd2l0aC4gQW5kIHRoZSBzdHJ1Y3R1cmUgd2lsbCBiZSBmcmVlZCBvbmx5IGFmdGVyCisgKiB0aGUgbGFzdCB1c2VyIGhhcyBwdXQgdGhlIHJlZmVyZW5jZSB0byBpdC4KKyAqLworc3RhdGljIHZvaWQgcHV0X2Z3X21nbXQoc3RydWN0IGZ3X21nbXQgKmZ3X21nbXQpCit7CisJa3JlZl9wdXQoJmZ3X21nbXQtPmtyZWYsIGZ3X21nbXRfa3JlZl9yZWxlYXNlKTsKK30KKworLyogQ2FsbGVyIG11c3QgY2FsbCBwdXRfZndfbWdtdCgpIGFmdGVyIHVzaW5nIHN0cnVjdCBmd19tZ210ICovCitzdGF0aWMgc3RydWN0IGZ3X21nbXQgKmdldF9md19tZ210KHN0cnVjdCBjZGV2ICpjZGV2KQoreworCXN0cnVjdCBmd19tZ210ICpmd19tZ210OworCisJbXV0ZXhfbG9jaygmbGlzdF9tdXRleCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZ3X21nbXQsICZmd19tZ210X2xpc3QsIG5vZGUpIHsKKwkJaWYgKCZmd19tZ210LT5jZGV2ID09IGNkZXYpIHsKKwkJCWtyZWZfZ2V0KCZmd19tZ210LT5rcmVmKTsKKwkJCWdvdG8gdW5sb2NrOworCQl9CisJfQorCisJZndfbWdtdCA9IE5VTEw7CisKK3VubG9jazoKKwltdXRleF91bmxvY2soJmxpc3RfbXV0ZXgpOworCisJcmV0dXJuIGZ3X21nbXQ7Cit9CisKK3N0YXRpYyBpbnQgZndfbWdtdF9pbnRlcmZhY2VfZndfdmVyc2lvbl9vcGVyYXRpb24oc3RydWN0IGZ3X21nbXQgKmZ3X21nbXQsCisJCXN0cnVjdCBmd19tZ210X2lvY19nZXRfaW50Zl92ZXJzaW9uICpmd19pbmZvKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZndfbWdtdC0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfZndfbWdtdF9pbnRlcmZhY2VfZndfdmVyc2lvbl9yZXNwb25zZSByZXNwb25zZTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoY29ubmVjdGlvbiwKKwkJCQlHQl9GV19NR01UX1RZUEVfSU5URVJGQUNFX0ZXX1ZFUlNJT04sIE5VTEwsIDAsCisJCQkJJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZndfbWdtdC0+cGFyZW50LAorCQkJImZhaWxlZCB0byBnZXQgaW50ZXJmYWNlIGZpcm13YXJlIHZlcnNpb24gKCVkKVxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlmd19pbmZvLT5tYWpvciA9IGxlMTZfdG9fY3B1KHJlc3BvbnNlLm1ham9yKTsKKwlmd19pbmZvLT5taW5vciA9IGxlMTZfdG9fY3B1KHJlc3BvbnNlLm1pbm9yKTsKKworCXN0cm5jcHkoZndfaW5mby0+ZmlybXdhcmVfdGFnLCByZXNwb25zZS5maXJtd2FyZV90YWcsCisJCUdCX0ZJUk1XQVJFX1RBR19NQVhfU0laRSk7CisKKwkvKgorCSAqIFRoZSBmaXJtd2FyZS10YWcgc2hvdWxkIGJlIE5VTEwgdGVybWluYXRlZCwgb3RoZXJ3aXNlIHRocm93IGVycm9yIGJ1dAorCSAqIGRvbid0IGZhaWwuCisJICovCisJaWYgKGZ3X2luZm8tPmZpcm13YXJlX3RhZ1tHQl9GSVJNV0FSRV9UQUdfTUFYX1NJWkUgLSAxXSAhPSAnXDAnKSB7CisJCWRldl9lcnIoZndfbWdtdC0+cGFyZW50LAorCQkJImZ3LXZlcnNpb246IGZpcm13YXJlLXRhZyBpcyBub3QgTlVMTCB0ZXJtaW5hdGVkXG4iKTsKKwkJZndfaW5mby0+ZmlybXdhcmVfdGFnW0dCX0ZJUk1XQVJFX1RBR19NQVhfU0laRSAtIDFdID0gJ1wwJzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmd19tZ210X2xvYWRfYW5kX3ZhbGlkYXRlX29wZXJhdGlvbihzdHJ1Y3QgZndfbWdtdCAqZndfbWdtdCwKKwkJCQkJICAgICAgIHU4IGxvYWRfbWV0aG9kLCBjb25zdCBjaGFyICp0YWcpCit7CisJc3RydWN0IGdiX2Z3X21nbXRfbG9hZF9hbmRfdmFsaWRhdGVfZndfcmVxdWVzdCByZXF1ZXN0OworCWludCByZXQ7CisKKwlpZiAobG9hZF9tZXRob2QgIT0gR0JfRldfTE9BRF9NRVRIT0RfVU5JUFJPICYmCisJICAgIGxvYWRfbWV0aG9kICE9IEdCX0ZXX0xPQURfTUVUSE9EX0lOVEVSTkFMKSB7CisJCWRldl9lcnIoZndfbWdtdC0+cGFyZW50LAorCQkJImludmFsaWQgbG9hZC1tZXRob2QgKCVkKVxuIiwgbG9hZF9tZXRob2QpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXF1ZXN0LmxvYWRfbWV0aG9kID0gbG9hZF9tZXRob2Q7CisJc3RybmNweShyZXF1ZXN0LmZpcm13YXJlX3RhZywgdGFnLCBHQl9GSVJNV0FSRV9UQUdfTUFYX1NJWkUpOworCisJLyoKKwkgKiBUaGUgZmlybXdhcmUtdGFnIHNob3VsZCBiZSBOVUxMIHRlcm1pbmF0ZWQsIG90aGVyd2lzZSB0aHJvdyBlcnJvciBhbmQKKwkgKiBmYWlsLgorCSAqLworCWlmIChyZXF1ZXN0LmZpcm13YXJlX3RhZ1tHQl9GSVJNV0FSRV9UQUdfTUFYX1NJWkUgLSAxXSAhPSAnXDAnKSB7CisJCWRldl9lcnIoZndfbWdtdC0+cGFyZW50LCAibG9hZC1hbmQtdmFsaWRhdGU6IGZpcm13YXJlLXRhZyBpcyBub3QgTlVMTCB0ZXJtaW5hdGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQWxsb2NhdGUgaWRzIGZyb20gMSB0byAyNTUgKHU4LW1heCksIDAgaXMgYW4gaW52YWxpZCBpZCAqLworCXJldCA9IGlkYV9zaW1wbGVfZ2V0KCZmd19tZ210LT5pZF9tYXAsIDEsIDI1NiwgR0ZQX0tFUk5FTCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihmd19tZ210LT5wYXJlbnQsICJmYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWVzdCBpZCAoJWQpXG4iLAorCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlmd19tZ210LT5pbnRmX2Z3X3JlcXVlc3RfaWQgPSByZXQ7CisJZndfbWdtdC0+aW50Zl9md19sb2FkZWQgPSBmYWxzZTsKKwlyZXF1ZXN0LnJlcXVlc3RfaWQgPSByZXQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhmd19tZ210LT5jb25uZWN0aW9uLAorCQkJCUdCX0ZXX01HTVRfVFlQRV9MT0FEX0FORF9WQUxJREFURV9GVywgJnJlcXVlc3QsCisJCQkJc2l6ZW9mKHJlcXVlc3QpLCBOVUxMLCAwKTsKKwlpZiAocmV0KSB7CisJCWlkYV9zaW1wbGVfcmVtb3ZlKCZmd19tZ210LT5pZF9tYXAsCisJCQkJICBmd19tZ210LT5pbnRmX2Z3X3JlcXVlc3RfaWQpOworCQlmd19tZ210LT5pbnRmX2Z3X3JlcXVlc3RfaWQgPSAwOworCQlkZXZfZXJyKGZ3X21nbXQtPnBhcmVudCwKKwkJCSJsb2FkIGFuZCB2YWxpZGF0ZSBmaXJtd2FyZSByZXF1ZXN0IGZhaWxlZCAoJWQpXG4iLAorCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmd19tZ210X2ludGVyZmFjZV9md19sb2FkZWRfb3BlcmF0aW9uKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gb3AtPmNvbm5lY3Rpb247CisJc3RydWN0IGZ3X21nbXQgKmZ3X21nbXQgPSBnYl9jb25uZWN0aW9uX2dldF9kYXRhKGNvbm5lY3Rpb24pOworCXN0cnVjdCBnYl9md19tZ210X2xvYWRlZF9md19yZXF1ZXN0ICpyZXF1ZXN0OworCisJLyogTm8gcGVuZGluZyBsb2FkIGFuZCB2YWxpZGF0ZSByZXF1ZXN0ID8gKi8KKwlpZiAoIWZ3X21nbXQtPmludGZfZndfcmVxdWVzdF9pZCkgeworCQlkZXZfZXJyKGZ3X21nbXQtPnBhcmVudCwKKwkJCSJ1bmV4cGVjdGVkIGZpcm13YXJlIGxvYWRlZCByZXF1ZXN0IHJlY2VpdmVkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKG9wLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUgIT0gc2l6ZW9mKCpyZXF1ZXN0KSkgeworCQlkZXZfZXJyKGZ3X21nbXQtPnBhcmVudCwgImlsbGVnYWwgc2l6ZSBvZiBmaXJtd2FyZSBsb2FkZWQgcmVxdWVzdCAoJXp1ICE9ICV6dSlcbiIsCisJCQlvcC0+cmVxdWVzdC0+cGF5bG9hZF9zaXplLCBzaXplb2YoKnJlcXVlc3QpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVxdWVzdCA9IG9wLT5yZXF1ZXN0LT5wYXlsb2FkOworCisJLyogSW52YWxpZCByZXF1ZXN0LWlkID8gKi8KKwlpZiAocmVxdWVzdC0+cmVxdWVzdF9pZCAhPSBmd19tZ210LT5pbnRmX2Z3X3JlcXVlc3RfaWQpIHsKKwkJZGV2X2Vycihmd19tZ210LT5wYXJlbnQsICJpbnZhbGlkIHJlcXVlc3QgaWQgZm9yIGZpcm13YXJlIGxvYWRlZCByZXF1ZXN0ICglMDJ1ICE9ICUwMnUpXG4iLAorCQkJZndfbWdtdC0+aW50Zl9md19yZXF1ZXN0X2lkLCByZXF1ZXN0LT5yZXF1ZXN0X2lkKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWRhX3NpbXBsZV9yZW1vdmUoJmZ3X21nbXQtPmlkX21hcCwgZndfbWdtdC0+aW50Zl9md19yZXF1ZXN0X2lkKTsKKwlmd19tZ210LT5pbnRmX2Z3X3JlcXVlc3RfaWQgPSAwOworCWZ3X21nbXQtPmludGZfZndfc3RhdHVzID0gcmVxdWVzdC0+c3RhdHVzOworCWZ3X21nbXQtPmludGZfZndfbWFqb3IgPSBsZTE2X3RvX2NwdShyZXF1ZXN0LT5tYWpvcik7CisJZndfbWdtdC0+aW50Zl9md19taW5vciA9IGxlMTZfdG9fY3B1KHJlcXVlc3QtPm1pbm9yKTsKKworCWlmIChmd19tZ210LT5pbnRmX2Z3X3N0YXR1cyA9PSBHQl9GV19MT0FEX1NUQVRVU19GQUlMRUQpCisJCWRldl9lcnIoZndfbWdtdC0+cGFyZW50LAorCQkJImZhaWxlZCB0byBsb2FkIGludGVyZmFjZSBmaXJtd2FyZSwgc3RhdHVzOiUwMnhcbiIsCisJCQlmd19tZ210LT5pbnRmX2Z3X3N0YXR1cyk7CisJZWxzZSBpZiAoZndfbWdtdC0+aW50Zl9md19zdGF0dXMgPT0gR0JfRldfTE9BRF9TVEFUVVNfVkFMSURBVElPTl9GQUlMRUQpCisJCWRldl9lcnIoZndfbWdtdC0+cGFyZW50LAorCQkJImZhaWxlZCB0byB2YWxpZGF0ZSBpbnRlcmZhY2UgZmlybXdhcmUsIHN0YXR1czolMDJ4XG4iLAorCQkJZndfbWdtdC0+aW50Zl9md19zdGF0dXMpOworCWVsc2UKKwkJZndfbWdtdC0+aW50Zl9md19sb2FkZWQgPSB0cnVlOworCisJY29tcGxldGUoJmZ3X21nbXQtPmNvbXBsZXRpb24pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZndfbWdtdF9iYWNrZW5kX2Z3X3ZlcnNpb25fb3BlcmF0aW9uKHN0cnVjdCBmd19tZ210ICpmd19tZ210LAorCQlzdHJ1Y3QgZndfbWdtdF9pb2NfZ2V0X2JhY2tlbmRfdmVyc2lvbiAqZndfaW5mbykKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGZ3X21nbXQtPmNvbm5lY3Rpb247CisJc3RydWN0IGdiX2Z3X21nbXRfYmFja2VuZF9md192ZXJzaW9uX3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZ2JfZndfbWdtdF9iYWNrZW5kX2Z3X3ZlcnNpb25fcmVzcG9uc2UgcmVzcG9uc2U7CisJaW50IHJldDsKKworCXN0cm5jcHkocmVxdWVzdC5maXJtd2FyZV90YWcsIGZ3X2luZm8tPmZpcm13YXJlX3RhZywKKwkJR0JfRklSTVdBUkVfVEFHX01BWF9TSVpFKTsKKworCS8qCisJICogVGhlIGZpcm13YXJlLXRhZyBzaG91bGQgYmUgTlVMTCB0ZXJtaW5hdGVkLCBvdGhlcndpc2UgdGhyb3cgZXJyb3IgYW5kCisJICogZmFpbC4KKwkgKi8KKwlpZiAocmVxdWVzdC5maXJtd2FyZV90YWdbR0JfRklSTVdBUkVfVEFHX01BWF9TSVpFIC0gMV0gIT0gJ1wwJykgeworCQlkZXZfZXJyKGZ3X21nbXQtPnBhcmVudCwgImJhY2tlbmQtdmVyc2lvbjogZmlybXdhcmUtdGFnIGlzIG5vdCBOVUxMIHRlcm1pbmF0ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLAorCQkJCUdCX0ZXX01HTVRfVFlQRV9CQUNLRU5EX0ZXX1ZFUlNJT04sICZyZXF1ZXN0LAorCQkJCXNpemVvZihyZXF1ZXN0KSwgJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZndfbWdtdC0+cGFyZW50LCAiZmFpbGVkIHRvIGdldCB2ZXJzaW9uIG9mICVzIGJhY2tlbmQgZmlybXdhcmUgKCVkKVxuIiwKKwkJCWZ3X2luZm8tPmZpcm13YXJlX3RhZywgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlmd19pbmZvLT5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7CisKKwkvKiBSZXNldCB2ZXJzaW9uIGFzIHRoYXQgc2hvdWxkIGJlIG5vbi16ZXJvIG9ubHkgZm9yIHN1Y2Nlc3MgY2FzZSAqLworCWZ3X2luZm8tPm1ham9yID0gMDsKKwlmd19pbmZvLT5taW5vciA9IDA7CisKKwlzd2l0Y2ggKGZ3X2luZm8tPnN0YXR1cykgeworCWNhc2UgR0JfRldfQkFDS0VORF9WRVJTSU9OX1NUQVRVU19TVUNDRVNTOgorCQlmd19pbmZvLT5tYWpvciA9IGxlMTZfdG9fY3B1KHJlc3BvbnNlLm1ham9yKTsKKwkJZndfaW5mby0+bWlub3IgPSBsZTE2X3RvX2NwdShyZXNwb25zZS5taW5vcik7CisJCWJyZWFrOworCWNhc2UgR0JfRldfQkFDS0VORF9WRVJTSU9OX1NUQVRVU19OT1RfQVZBSUxBQkxFOgorCWNhc2UgR0JfRldfQkFDS0VORF9WRVJTSU9OX1NUQVRVU19SRVRSWToKKwkJYnJlYWs7CisJY2FzZSBHQl9GV19CQUNLRU5EX1ZFUlNJT05fU1RBVFVTX05PVF9TVVBQT1JURUQ6CisJCWRldl9lcnIoZndfbWdtdC0+cGFyZW50LAorCQkJIkZpcm13YXJlIHdpdGggdGFnICVzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgSW50ZXJmYWNlXG4iLAorCQkJZndfaW5mby0+ZmlybXdhcmVfdGFnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihmd19tZ210LT5wYXJlbnQsICJJbnZhbGlkIHN0YXR1cyByZWNlaXZlZDogJXVcbiIsCisJCQlmd19pbmZvLT5zdGF0dXMpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZ3X21nbXRfYmFja2VuZF9md191cGRhdGVfb3BlcmF0aW9uKHN0cnVjdCBmd19tZ210ICpmd19tZ210LAorCQkJCQkgICAgICAgY2hhciAqdGFnKQoreworCXN0cnVjdCBnYl9md19tZ210X2JhY2tlbmRfZndfdXBkYXRlX3JlcXVlc3QgcmVxdWVzdDsKKwlpbnQgcmV0OworCisJc3RybmNweShyZXF1ZXN0LmZpcm13YXJlX3RhZywgdGFnLCBHQl9GSVJNV0FSRV9UQUdfTUFYX1NJWkUpOworCisJLyoKKwkgKiBUaGUgZmlybXdhcmUtdGFnIHNob3VsZCBiZSBOVUxMIHRlcm1pbmF0ZWQsIG90aGVyd2lzZSB0aHJvdyBlcnJvciBhbmQKKwkgKiBmYWlsLgorCSAqLworCWlmIChyZXF1ZXN0LmZpcm13YXJlX3RhZ1tHQl9GSVJNV0FSRV9UQUdfTUFYX1NJWkUgLSAxXSAhPSAnXDAnKSB7CisJCWRldl9lcnIoZndfbWdtdC0+cGFyZW50LCAiYmFja2VuZC11cGRhdGU6IGZpcm13YXJlLXRhZyBpcyBub3QgTlVMTCB0ZXJtaW5hdGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQWxsb2NhdGUgaWRzIGZyb20gMSB0byAyNTUgKHU4LW1heCksIDAgaXMgYW4gaW52YWxpZCBpZCAqLworCXJldCA9IGlkYV9zaW1wbGVfZ2V0KCZmd19tZ210LT5pZF9tYXAsIDEsIDI1NiwgR0ZQX0tFUk5FTCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihmd19tZ210LT5wYXJlbnQsICJmYWlsZWQgdG8gYWxsb2NhdGUgcmVxdWVzdCBpZCAoJWQpXG4iLAorCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlmd19tZ210LT5iYWNrZW5kX2Z3X3JlcXVlc3RfaWQgPSByZXQ7CisJcmVxdWVzdC5yZXF1ZXN0X2lkID0gcmV0OworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoZndfbWdtdC0+Y29ubmVjdGlvbiwKKwkJCQlHQl9GV19NR01UX1RZUEVfQkFDS0VORF9GV19VUERBVEUsICZyZXF1ZXN0LAorCQkJCXNpemVvZihyZXF1ZXN0KSwgTlVMTCwgMCk7CisJaWYgKHJldCkgeworCQlpZGFfc2ltcGxlX3JlbW92ZSgmZndfbWdtdC0+aWRfbWFwLAorCQkJCSAgZndfbWdtdC0+YmFja2VuZF9md19yZXF1ZXN0X2lkKTsKKwkJZndfbWdtdC0+YmFja2VuZF9md19yZXF1ZXN0X2lkID0gMDsKKwkJZGV2X2Vycihmd19tZ210LT5wYXJlbnQsCisJCQkiYmFja2VuZCAlcyBmaXJtd2FyZSB1cGRhdGUgcmVxdWVzdCBmYWlsZWQgKCVkKVxuIiwgdGFnLAorCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmd19tZ210X2JhY2tlbmRfZndfdXBkYXRlZF9vcGVyYXRpb24oc3RydWN0IGdiX29wZXJhdGlvbiAqb3ApCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBvcC0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZndfbWdtdCAqZndfbWdtdCA9IGdiX2Nvbm5lY3Rpb25fZ2V0X2RhdGEoY29ubmVjdGlvbik7CisJc3RydWN0IGdiX2Z3X21nbXRfYmFja2VuZF9md191cGRhdGVkX3JlcXVlc3QgKnJlcXVlc3Q7CisKKwkvKiBObyBwZW5kaW5nIGxvYWQgYW5kIHZhbGlkYXRlIHJlcXVlc3QgPyAqLworCWlmICghZndfbWdtdC0+YmFja2VuZF9md19yZXF1ZXN0X2lkKSB7CisJCWRldl9lcnIoZndfbWdtdC0+cGFyZW50LCAidW5leHBlY3RlZCBiYWNrZW5kIGZpcm13YXJlIHVwZGF0ZWQgcmVxdWVzdCByZWNlaXZlZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChvcC0+cmVxdWVzdC0+cGF5bG9hZF9zaXplICE9IHNpemVvZigqcmVxdWVzdCkpIHsKKwkJZGV2X2Vycihmd19tZ210LT5wYXJlbnQsICJpbGxlZ2FsIHNpemUgb2YgYmFja2VuZCBmaXJtd2FyZSB1cGRhdGVkIHJlcXVlc3QgKCV6dSAhPSAlenUpXG4iLAorCQkJb3AtPnJlcXVlc3QtPnBheWxvYWRfc2l6ZSwgc2l6ZW9mKCpyZXF1ZXN0KSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlcXVlc3QgPSBvcC0+cmVxdWVzdC0+cGF5bG9hZDsKKworCS8qIEludmFsaWQgcmVxdWVzdC1pZCA/ICovCisJaWYgKHJlcXVlc3QtPnJlcXVlc3RfaWQgIT0gZndfbWdtdC0+YmFja2VuZF9md19yZXF1ZXN0X2lkKSB7CisJCWRldl9lcnIoZndfbWdtdC0+cGFyZW50LCAiaW52YWxpZCByZXF1ZXN0IGlkIGZvciBiYWNrZW5kIGZpcm13YXJlIHVwZGF0ZWQgcmVxdWVzdCAoJTAydSAhPSAlMDJ1KVxuIiwKKwkJCWZ3X21nbXQtPmJhY2tlbmRfZndfcmVxdWVzdF9pZCwgcmVxdWVzdC0+cmVxdWVzdF9pZCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlkYV9zaW1wbGVfcmVtb3ZlKCZmd19tZ210LT5pZF9tYXAsIGZ3X21nbXQtPmJhY2tlbmRfZndfcmVxdWVzdF9pZCk7CisJZndfbWdtdC0+YmFja2VuZF9md19yZXF1ZXN0X2lkID0gMDsKKwlmd19tZ210LT5iYWNrZW5kX2Z3X3N0YXR1cyA9IHJlcXVlc3QtPnN0YXR1czsKKworCWlmICgoZndfbWdtdC0+YmFja2VuZF9md19zdGF0dXMgIT0gR0JfRldfQkFDS0VORF9GV19TVEFUVVNfU1VDQ0VTUykgJiYKKwkgICAgKGZ3X21nbXQtPmJhY2tlbmRfZndfc3RhdHVzICE9IEdCX0ZXX0JBQ0tFTkRfRldfU1RBVFVTX1JFVFJZKSkKKwkJZGV2X2Vycihmd19tZ210LT5wYXJlbnQsCisJCQkiZmFpbGVkIHRvIGxvYWQgYmFja2VuZCBmaXJtd2FyZTogJTAyeFxuIiwKKwkJCWZ3X21nbXQtPmJhY2tlbmRfZndfc3RhdHVzKTsKKworCWNvbXBsZXRlKCZmd19tZ210LT5jb21wbGV0aW9uKTsKKworCXJldHVybiAwOworfQorCisvKiBDaGFyIGRldmljZSBmb3BzICovCisKK3N0YXRpYyBpbnQgZndfbWdtdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBmd19tZ210ICpmd19tZ210ID0gZ2V0X2Z3X21nbXQoaW5vZGUtPmlfY2Rldik7CisKKwkvKiBmd19tZ210IHN0cnVjdHVyZSBjYW4ndCBnZXQgZnJlZWQgdW50aWwgZmlsZSBkZXNjcmlwdG9yIGlzIGNsb3NlZCAqLworCWlmIChmd19tZ210KSB7CisJCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZ3X21nbXQ7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IGZ3X21nbXRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZndfbWdtdCAqZndfbWdtdCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXB1dF9md19tZ210KGZ3X21nbXQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZ3X21nbXRfaW9jdGwoc3RydWN0IGZ3X21nbXQgKmZ3X21nbXQsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgdm9pZCBfX3VzZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZndfbWdtdF9pb2NfZ2V0X2ludGZfdmVyc2lvbiBpbnRmX2Z3X2luZm87CisJc3RydWN0IGZ3X21nbXRfaW9jX2dldF9iYWNrZW5kX3ZlcnNpb24gYmFja2VuZF9md19pbmZvOworCXN0cnVjdCBmd19tZ210X2lvY19pbnRmX2xvYWRfYW5kX3ZhbGlkYXRlIGludGZfbG9hZDsKKwlzdHJ1Y3QgZndfbWdtdF9pb2NfYmFja2VuZF9md191cGRhdGUgYmFja2VuZF91cGRhdGU7CisJdW5zaWduZWQgaW50IHRpbWVvdXQ7CisJaW50IHJldDsKKworCS8qIFJlamVjdCBhbnkgb3BlcmF0aW9ucyBhZnRlciBtb2RlLXN3aXRjaCBoYXMgc3RhcnRlZCAqLworCWlmIChmd19tZ210LT5tb2RlX3N3aXRjaF9zdGFydGVkKQorCQlyZXR1cm4gLUVCVVNZOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEZXX01HTVRfSU9DX0dFVF9JTlRGX0ZXOgorCQlyZXQgPSBmd19tZ210X2ludGVyZmFjZV9md192ZXJzaW9uX29wZXJhdGlvbihmd19tZ210LAorCQkJCQkJCSAgICAgJmludGZfZndfaW5mbyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmaW50Zl9md19pbmZvLCBzaXplb2YoaW50Zl9md19pbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlyZXR1cm4gMDsKKwljYXNlIEZXX01HTVRfSU9DX0dFVF9CQUNLRU5EX0ZXOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJmJhY2tlbmRfZndfaW5mbywgYnVmLAorCQkJCSAgIHNpemVvZihiYWNrZW5kX2Z3X2luZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldCA9IGZ3X21nbXRfYmFja2VuZF9md192ZXJzaW9uX29wZXJhdGlvbihmd19tZ210LAorCQkJCQkJCSAgICZiYWNrZW5kX2Z3X2luZm8pOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlpZiAoY29weV90b191c2VyKGJ1ZiwgJmJhY2tlbmRfZndfaW5mbywKKwkJCQkgc2l6ZW9mKGJhY2tlbmRfZndfaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dXJuIDA7CisJY2FzZSBGV19NR01UX0lPQ19JTlRGX0xPQURfQU5EX1ZBTElEQVRFOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJmludGZfbG9hZCwgYnVmLCBzaXplb2YoaW50Zl9sb2FkKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlyZXQgPSBmd19tZ210X2xvYWRfYW5kX3ZhbGlkYXRlX29wZXJhdGlvbihmd19tZ210LAorCQkJCWludGZfbG9hZC5sb2FkX21ldGhvZCwgaW50Zl9sb2FkLmZpcm13YXJlX3RhZyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZmd19tZ210LT5jb21wbGV0aW9uLAorCQkJCQkJIGZ3X21nbXQtPnRpbWVvdXRfamlmZmllcykpIHsKKwkJCWRldl9lcnIoZndfbWdtdC0+cGFyZW50LCAidGltZWQgb3V0IHdhaXRpbmcgZm9yIGZpcm13YXJlIGxvYWQgYW5kIHZhbGlkYXRpb24gdG8gZmluaXNoXG4iKTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisKKwkJaW50Zl9sb2FkLnN0YXR1cyA9IGZ3X21nbXQtPmludGZfZndfc3RhdHVzOworCQlpbnRmX2xvYWQubWFqb3IgPSBmd19tZ210LT5pbnRmX2Z3X21ham9yOworCQlpbnRmX2xvYWQubWlub3IgPSBmd19tZ210LT5pbnRmX2Z3X21pbm9yOworCisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmaW50Zl9sb2FkLCBzaXplb2YoaW50Zl9sb2FkKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlyZXR1cm4gMDsKKwljYXNlIEZXX01HTVRfSU9DX0lOVEZfQkFDS0VORF9GV19VUERBVEU6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmYmFja2VuZF91cGRhdGUsIGJ1ZiwKKwkJCQkgICBzaXplb2YoYmFja2VuZF91cGRhdGUpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldCA9IGZ3X21nbXRfYmFja2VuZF9md191cGRhdGVfb3BlcmF0aW9uKGZ3X21nbXQsCisJCQkJYmFja2VuZF91cGRhdGUuZmlybXdhcmVfdGFnKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmZ3X21nbXQtPmNvbXBsZXRpb24sCisJCQkJCQkgZndfbWdtdC0+dGltZW91dF9qaWZmaWVzKSkgeworCQkJZGV2X2Vycihmd19tZ210LT5wYXJlbnQsICJ0aW1lZCBvdXQgd2FpdGluZyBmb3IgYmFja2VuZCBmaXJtd2FyZSB1cGRhdGUgdG8gZmluaXNoXG4iKTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisKKwkJYmFja2VuZF91cGRhdGUuc3RhdHVzID0gZndfbWdtdC0+YmFja2VuZF9md19zdGF0dXM7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsICZiYWNrZW5kX3VwZGF0ZSwgc2l6ZW9mKGJhY2tlbmRfdXBkYXRlKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlyZXR1cm4gMDsKKwljYXNlIEZXX01HTVRfSU9DX1NFVF9USU1FT1VUX01TOgorCQlpZiAoZ2V0X3VzZXIodGltZW91dCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilidWYpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKCF0aW1lb3V0KSB7CisJCQlkZXZfZXJyKGZ3X21nbXQtPnBhcmVudCwgInRpbWVvdXQgY2FuJ3QgYmUgemVyb1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWZ3X21nbXQtPnRpbWVvdXRfamlmZmllcyA9IG1zZWNzX3RvX2ppZmZpZXModGltZW91dCk7CisKKwkJcmV0dXJuIDA7CisJY2FzZSBGV19NR01UX0lPQ19NT0RFX1NXSVRDSDoKKwkJaWYgKCFmd19tZ210LT5pbnRmX2Z3X2xvYWRlZCkgeworCQkJZGV2X2Vycihmd19tZ210LT5wYXJlbnQsCisJCQkJIkZpcm13YXJlIG5vdCBsb2FkZWQgZm9yIG1vZGUtc3dpdGNoXG4iKTsKKwkJCXJldHVybiAtRVBFUk07CisJCX0KKworCQkvKgorCQkgKiBEaXNhbGxvdyBuZXcgaW9jdGxzIGFzIHRoZSBmdy1jb3JlIGJ1bmRsZSBkcml2ZXIgaXMgZ29pbmcgdG8KKwkJICogZ2V0IGRpc2Nvbm5lY3RlZCBzb29uIGFuZCB0aGUgY2hhcmFjdGVyIGRldmljZSB3aWxsIGdldAorCQkgKiByZW1vdmVkLgorCQkgKi8KKwkJZndfbWdtdC0+bW9kZV9zd2l0Y2hfc3RhcnRlZCA9IHRydWU7CisKKwkJcmV0ID0gZ2JfaW50ZXJmYWNlX3JlcXVlc3RfbW9kZV9zd2l0Y2goZndfbWdtdC0+Y29ubmVjdGlvbi0+aW50Zik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZndfbWdtdC0+cGFyZW50LCAiTW9kZS1zd2l0Y2ggZmFpbGVkOiAlZFxuIiwKKwkJCQlyZXQpOworCQkJZndfbWdtdC0+bW9kZV9zd2l0Y2hfc3RhcnRlZCA9IGZhbHNlOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFRZOworCX0KK30KKworc3RhdGljIGxvbmcgZndfbWdtdF9pb2N0bF91bmxvY2tlZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZndfbWdtdCAqZndfbWdtdCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUgPSBmd19tZ210LT5jb25uZWN0aW9uLT5idW5kbGU7CisJaW50IHJldCA9IC1FTk9ERVY7CisKKwkvKgorCSAqIFNlcmlhbGl6ZSBpb2N0bHMuCisJICoKKwkgKiBXZSBkb24ndCB3YW50IHRoZSB1c2VyIHRvIGRvIGZldyBvcGVyYXRpb25zIGluIHBhcmFsbGVsLiBGb3IgZXhhbXBsZSwKKwkgKiB1cGRhdGluZyBJbnRlcmZhY2UgZmlybXdhcmUgaW4gcGFyYWxsZWwgZm9yIHRoZSBzYW1lIEludGVyZmFjZS4gVGhlcmUKKwkgKiBpcyBubyBuZWVkIHRvIGRvIHRoaW5ncyBpbiBwYXJhbGxlbCBmb3Igc3BlZWQgYW5kIHdlIGNhbiBhdm9pZCBoYXZpbmcKKwkgKiBjb21wbGljYXRlZCBjb2RlIGZvciBub3cuCisJICoKKwkgKiBUaGlzIGlzIGFsc28gdXNlZCB0byBwcm90ZWN0IC0+ZGlzYWJsZWQsIHdoaWNoIGlzIHVzZWQgdG8gY2hlY2sgaWYKKwkgKiB0aGUgY29ubmVjdGlvbiBpcyBnZXR0aW5nIGRpc2Nvbm5lY3RlZCwgc28gdGhhdCB3ZSBkb24ndCBzdGFydCBhbnkKKwkgKiBuZXcgb3BlcmF0aW9ucy4KKwkgKi8KKwltdXRleF9sb2NrKCZmd19tZ210LT5tdXRleCk7CisJaWYgKCFmd19tZ210LT5kaXNhYmxlZCkgeworCQlyZXQgPSBnYl9wbV9ydW50aW1lX2dldF9zeW5jKGJ1bmRsZSk7CisJCWlmICghcmV0KSB7CisJCQlyZXQgPSBmd19tZ210X2lvY3RsKGZ3X21nbXQsIGNtZCwgKHZvaWQgX191c2VyICopYXJnKTsKKwkJCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGJ1bmRsZSk7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZmd19tZ210LT5tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmd19tZ210X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IGZ3X21nbXRfb3BlbiwKKwkucmVsZWFzZQk9IGZ3X21nbXRfcmVsZWFzZSwKKwkudW5sb2NrZWRfaW9jdGwJPSBmd19tZ210X2lvY3RsX3VubG9ja2VkLAorfTsKKworaW50IGdiX2Z3X21nbXRfcmVxdWVzdF9oYW5kbGVyKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wKQoreworCXU4IHR5cGUgPSBvcC0+dHlwZTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgR0JfRldfTUdNVF9UWVBFX0xPQURFRF9GVzoKKwkJcmV0dXJuIGZ3X21nbXRfaW50ZXJmYWNlX2Z3X2xvYWRlZF9vcGVyYXRpb24ob3ApOworCWNhc2UgR0JfRldfTUdNVF9UWVBFX0JBQ0tFTkRfRldfVVBEQVRFRDoKKwkJcmV0dXJuIGZ3X21nbXRfYmFja2VuZF9md191cGRhdGVkX29wZXJhdGlvbihvcCk7CisJZGVmYXVsdDoKKwkJZGV2X2Vycigmb3AtPmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2LAorCQkJInVuc3VwcG9ydGVkIHJlcXVlc3Q6ICV1XG4iLCB0eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitpbnQgZ2JfZndfbWdtdF9jb25uZWN0aW9uX2luaXQoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJc3RydWN0IGZ3X21nbXQgKmZ3X21nbXQ7CisJaW50IHJldCwgbWlub3I7CisKKwlpZiAoIWNvbm5lY3Rpb24pCisJCXJldHVybiAwOworCisJZndfbWdtdCA9IGt6YWxsb2Moc2l6ZW9mKCpmd19tZ210KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmd19tZ210KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZ3X21nbXQtPnBhcmVudCA9ICZjb25uZWN0aW9uLT5idW5kbGUtPmRldjsKKwlmd19tZ210LT50aW1lb3V0X2ppZmZpZXMgPSBtc2Vjc190b19qaWZmaWVzKEZXX01HTVRfVElNRU9VVF9NUyk7CisJZndfbWdtdC0+Y29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisKKwlnYl9jb25uZWN0aW9uX3NldF9kYXRhKGNvbm5lY3Rpb24sIGZ3X21nbXQpOworCWluaXRfY29tcGxldGlvbigmZndfbWdtdC0+Y29tcGxldGlvbik7CisJaWRhX2luaXQoJmZ3X21nbXQtPmlkX21hcCk7CisJbXV0ZXhfaW5pdCgmZndfbWdtdC0+bXV0ZXgpOworCWtyZWZfaW5pdCgmZndfbWdtdC0+a3JlZik7CisKKwltdXRleF9sb2NrKCZsaXN0X211dGV4KTsKKwlsaXN0X2FkZCgmZndfbWdtdC0+bm9kZSwgJmZ3X21nbXRfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZsaXN0X211dGV4KTsKKworCXJldCA9IGdiX2Nvbm5lY3Rpb25fZW5hYmxlKGNvbm5lY3Rpb24pOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2xpc3RfZGVsOworCisJbWlub3IgPSBpZGFfc2ltcGxlX2dldCgmZndfbWdtdF9taW5vcnNfbWFwLCAwLCBOVU1fTUlOT1JTLCBHRlBfS0VSTkVMKTsKKwlpZiAobWlub3IgPCAwKSB7CisJCXJldCA9IG1pbm9yOworCQlnb3RvIGVycl9jb25uZWN0aW9uX2Rpc2FibGU7CisJfQorCisJLyogQWRkIGEgY2hhciBkZXZpY2UgdG8gYWxsb3cgdXNlcnNwYWNlIHRvIGludGVyYWN0IHdpdGggZnctbWdtdCAqLworCWZ3X21nbXQtPmRldl9udW0gPSBNS0RFVihNQUpPUihmd19tZ210X2Rldl9udW0pLCBtaW5vcik7CisJY2Rldl9pbml0KCZmd19tZ210LT5jZGV2LCAmZndfbWdtdF9mb3BzKTsKKworCXJldCA9IGNkZXZfYWRkKCZmd19tZ210LT5jZGV2LCBmd19tZ210LT5kZXZfbnVtLCAxKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZW1vdmVfaWRhOworCisJLyogQWRkIGEgc29mdCBsaW5rIHRvIHRoZSBwcmV2aW91c2x5IGFkZGVkIGNoYXItZGV2IHdpdGhpbiB0aGUgYnVuZGxlICovCisJZndfbWdtdC0+Y2xhc3NfZGV2aWNlID0gZGV2aWNlX2NyZWF0ZShmd19tZ210X2NsYXNzLCBmd19tZ210LT5wYXJlbnQsCisJCQkJCSAgICAgIGZ3X21nbXQtPmRldl9udW0sIE5VTEwsCisJCQkJCSAgICAgICJnYi1mdy1tZ210LSVkIiwgbWlub3IpOworCWlmIChJU19FUlIoZndfbWdtdC0+Y2xhc3NfZGV2aWNlKSkgeworCQlyZXQgPSBQVFJfRVJSKGZ3X21nbXQtPmNsYXNzX2RldmljZSk7CisJCWdvdG8gZXJyX2RlbF9jZGV2OworCX0KKworCXJldHVybiAwOworCitlcnJfZGVsX2NkZXY6CisJY2Rldl9kZWwoJmZ3X21nbXQtPmNkZXYpOworZXJyX3JlbW92ZV9pZGE6CisJaWRhX3NpbXBsZV9yZW1vdmUoJmZ3X21nbXRfbWlub3JzX21hcCwgbWlub3IpOworZXJyX2Nvbm5lY3Rpb25fZGlzYWJsZToKKwlnYl9jb25uZWN0aW9uX2Rpc2FibGUoY29ubmVjdGlvbik7CitlcnJfbGlzdF9kZWw6CisJbXV0ZXhfbG9jaygmbGlzdF9tdXRleCk7CisJbGlzdF9kZWwoJmZ3X21nbXQtPm5vZGUpOworCW11dGV4X3VubG9jaygmbGlzdF9tdXRleCk7CisKKwlwdXRfZndfbWdtdChmd19tZ210KTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgZ2JfZndfbWdtdF9jb25uZWN0aW9uX2V4aXQoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJc3RydWN0IGZ3X21nbXQgKmZ3X21nbXQ7CisKKwlpZiAoIWNvbm5lY3Rpb24pCisJCXJldHVybjsKKworCWZ3X21nbXQgPSBnYl9jb25uZWN0aW9uX2dldF9kYXRhKGNvbm5lY3Rpb24pOworCisJZGV2aWNlX2Rlc3Ryb3koZndfbWdtdF9jbGFzcywgZndfbWdtdC0+ZGV2X251bSk7CisJY2Rldl9kZWwoJmZ3X21nbXQtPmNkZXYpOworCWlkYV9zaW1wbGVfcmVtb3ZlKCZmd19tZ210X21pbm9yc19tYXAsIE1JTk9SKGZ3X21nbXQtPmRldl9udW0pKTsKKworCS8qCisJICogRGlzYWxsb3cgYW55IG5ldyBpb2N0bCBvcGVyYXRpb25zIG9uIHRoZSBjaGFyIGRldmljZSBhbmQgd2FpdCBmb3IKKwkgKiBleGlzdGluZyBvbmVzIHRvIGZpbmlzaC4KKwkgKi8KKwltdXRleF9sb2NrKCZmd19tZ210LT5tdXRleCk7CisJZndfbWdtdC0+ZGlzYWJsZWQgPSB0cnVlOworCW11dGV4X3VubG9jaygmZndfbWdtdC0+bXV0ZXgpOworCisJLyogQWxsIHBlbmRpbmcgZ3JleWJ1cyBvcGVyYXRpb25zIHNob3VsZCBoYXZlIGZpbmlzaGVkIGJ5IG5vdyAqLworCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShmd19tZ210LT5jb25uZWN0aW9uKTsKKworCS8qIERpc2FsbG93IG5ldyB1c2VycyB0byBnZXQgYWNjZXNzIHRvIHRoZSBmd19tZ210IHN0cnVjdHVyZSAqLworCW11dGV4X2xvY2soJmxpc3RfbXV0ZXgpOworCWxpc3RfZGVsKCZmd19tZ210LT5ub2RlKTsKKwltdXRleF91bmxvY2soJmxpc3RfbXV0ZXgpOworCisJLyoKKwkgKiBBbGwgY3VycmVudCB1c2VycyBvZiBmd19tZ210IHdvdWxkIGhhdmUgdGFrZW4gYSByZWZlcmVuY2UgdG8gaXQgYnkKKwkgKiBub3csIHdlIGNhbiBkcm9wIG91ciByZWZlcmVuY2UgYW5kIHdhaXQgdGhlIGxhc3QgdXNlciB3aWxsIGdldAorCSAqIGZ3X21nbXQgZnJlZWQuCisJICovCisJcHV0X2Z3X21nbXQoZndfbWdtdCk7Cit9CisKK2ludCBmd19tZ210X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJZndfbWdtdF9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgImdiX2Z3X21nbXQiKTsKKwlpZiAoSVNfRVJSKGZ3X21nbXRfY2xhc3MpKQorCQlyZXR1cm4gUFRSX0VSUihmd19tZ210X2NsYXNzKTsKKworCXJldCA9IGFsbG9jX2NocmRldl9yZWdpb24oJmZ3X21nbXRfZGV2X251bSwgMCwgTlVNX01JTk9SUywKKwkJCQkgICJnYl9md19tZ210Iik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcmVtb3ZlX2NsYXNzOworCisJcmV0dXJuIDA7CisKK2Vycl9yZW1vdmVfY2xhc3M6CisJY2xhc3NfZGVzdHJveShmd19tZ210X2NsYXNzKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGZ3X21nbXRfZXhpdCh2b2lkKQoreworCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihmd19tZ210X2Rldl9udW0sIE5VTV9NSU5PUlMpOworCWNsYXNzX2Rlc3Ryb3koZndfbWdtdF9jbGFzcyk7CisJaWRhX2Rlc3Ryb3koJmZ3X21nbXRfbWlub3JzX21hcCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9nYi1jYW1lcmEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2diLWNhbWVyYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NWRhYmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9nYi1jYW1lcmEuaApAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIEdyZXlidXMgQ2FtZXJhIHByb3RvY29sIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisjaWZuZGVmIF9fR0JfQ0FNRVJBX0gKKyNkZWZpbmUgX19HQl9DQU1FUkFfSAorCisjaW5jbHVkZSA8bGludXgvdjRsMi1tZWRpYWJ1cy5oPgorCisvKiBJbnB1dCBmbGFncyBuZWVkIHRvIGJlIHNldCBmcm9tIHRoZSBjYWxsZXIgKi8KKyNkZWZpbmUgR0JfQ0FNRVJBX0lOX0ZMQUdfVEVTVAkJKDEgPDwgMCkKKy8qIE91dHB1dCBmbGFncyByZXR1cm5lZCAqLworI2RlZmluZSBHQl9DQU1FUkFfT1VUX0ZMQUdfQURKVVNURUQJKDEgPDwgMCkKKworLyoqCisgKiBzdHJ1Y3QgZ2JfY2FtZXJhX3N0cmVhbSAtIFJlcHJlc2VudHMgZ3JleWJ1cyBjYW1lcmEgc3RyZWFtLgorICogQHdpZHRoOiBTdHJlYW0gd2lkdGggaW4gcGl4ZWxzLgorICogQGhlaWdodDogU3RyZWFtIGhlaWdodCBpbiBwaXhlbHMuCisgKiBAcGl4ZWxfY29kZTogTWVkaWEgYnVzIHBpeGVsIGNvZGUuCisgKiBAdmM6IE1JUEkgQ1NJIHZpcnR1YWwgY2hhbm5lbC4KKyAqIEBkdDogTUlQSSBDU0kgZGF0YSB0eXBlcy4gTW9zdCBmb3JtYXRzIHVzZSBhIHNpbmdsZSBkYXRhIHR5cGUsIGluIHdoaWNoIGNhc2UKKyAqICAgICAgdGhlIHNlY29uZCBlbGVtZW50IHdpbGwgYmUgaWdub3JlZC4KKyAqIEBtYXhfc2l6ZTogTWF4aW11bSBzaXplIG9mIGEgZnJhbWUgaW4gYnl0ZXMuIFRoZSBjYW1lcmEgbW9kdWxlIGd1YXJhbnRlZXMKKyAqICAgICAgICAgICAgdGhhdCBhbGwgZGF0YSBiZXR3ZWVuIHRoZSBGcmFtZSBTdGFydCBhbmQgRnJhbWUgRW5kIHBhY2tldCBmb3IKKyAqICAgICAgICAgICAgdGhlIGFzc29jaWF0ZWQgdmlydHVhbCBjaGFubmVsIGFuZCBkYXRhIHR5cGUocykgd2lsbCBub3QgZXhjZWVkCisgKiAgICAgICAgICAgIHRoaXMgc2l6ZS4KKyAqLworc3RydWN0IGdiX2NhbWVyYV9zdHJlYW0geworCXVuc2lnbmVkIGludCB3aWR0aDsKKwl1bnNpZ25lZCBpbnQgaGVpZ2h0OworCWVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBwaXhlbF9jb2RlOworCXVuc2lnbmVkIGludCB2YzsKKwl1bnNpZ25lZCBpbnQgZHRbMl07CisJdW5zaWduZWQgaW50IG1heF9zaXplOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZ2JfY2FtZXJhX2NzaV9wYXJhbXMgLSBDU0kgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgKiBAbnVtX2xhbmVzOiBudW1iZXIgb2YgQ1NJIGRhdGEgbGFuZXMKKyAqIEBjbGtfZnJlcTogQ1NJIGNsb2NrIGZyZXF1ZW5jeSBpbiBIegorICovCitzdHJ1Y3QgZ2JfY2FtZXJhX2NzaV9wYXJhbXMgeworCXVuc2lnbmVkIGludCBudW1fbGFuZXM7CisJdW5zaWduZWQgaW50IGNsa19mcmVxOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZ2JfY2FtZXJhX29wcyAtIEdyZXlidXMgY2FtZXJhIG9wZXJhdGlvbnMsIHVzZWQgYnkgdGhlIEdyZXlidXMgY2FtZXJhCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlciB0byBleHBvc2Ugb3BlcmF0aW9ucyB0byB0aGUgaG9zdCBjYW1lcmEgZHJpdmVyLgorICogQGNhcGFiaWxpdGllczogUmV0cmlldmUgY2FtZXJhIGNhcGFiaWxpdGllcyBhbmQgc3RvcmUgdGhlbSBpbiB0aGUgYnVmZmVyCisgKiAgICAgICAgICAgICAgICAnYnVmJyBjYXBhYmlsaXRpZXMuIFRoZSBidWZmZXIgbWF4aW11bSBzaXplIGlzIHNwZWNpZmllZCBieQorICogICAgICAgICAgICAgICAgdGhlIGNhbGxlciBpbiB0aGUgJ3NpemUnIHBhcmFtZXRlciwgYW5kIHRoZSBlZmZlY3RpdmUKKyAqICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllcyBzaXplIGlzIHJldHVybmVkIGZyb20gdGhlIGZ1bmN0aW9uLiBJZiB0aGUgYnVmZmVyCisgKiAgICAgICAgICAgICAgICBzaXplIGlzIHRvbyBzbWFsbCB0byBob2xkIHRoZSBjYXBhYmlsaXRpZXMgYW4gZXJyb3IgaXMKKyAqICAgICAgICAgICAgICAgIHJldHVybmVkIGFuZCB0aGUgYnVmZmVyIGlzIGxlZnQgdW50b3VjaGVkLgorICoKKyAqIEBjb25maWd1cmVfc3RyZWFtczogTmVnb3RpYXRlIGNvbmZpZ3VyYXRpb24gYW5kIHByZXBhcmUgdGhlIG1vZHVsZSBmb3IgdmlkZW8KKyAqICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZS4gVGhlIGNhbGxlciBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzdHJlYW1zIGl0CisgKiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzIGluIHRoZSAnbnN0cmVhbXMnIGFyZ3VtZW50IGFuZCB0aGUgYXNzb2NpYXRlZAorICogICAgICAgICAgICAgICAgICAgICBzdHJlYW1zIGNvbmZpZ3VyYXRpb25zIGluIHRoZSAnc3RyZWFtcycgYXJndW1lbnQuIFRoZQorICogICAgICAgICAgICAgICAgICAgICBHQl9DQU1FUkFfSU5fRkxBR19URVNUICdmbGFnJyBjYW4gYmUgc2V0IHRvIHRlc3QgYQorICogICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIHdpdGhvdXQgYXBwbHlpbmcgaXQsIG90aGVyd2lzZSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBpcyBhcHBsaWVkIGJ5IHRoZSBtb2R1bGUuIFRoZSBtb2R1bGUgY2FuCisgKiAgICAgICAgICAgICAgICAgICAgIGRlY2lkZSB0byBtb2RpZnkgdGhlIHJlcXVlc3RlZCBjb25maWd1cmF0aW9uLCBpbmNsdWRpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgdXNpbmcgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIHN0cmVhbXMuIEluIHRoYXQgY2FzZSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgY29uZmlndXJhdGlvbiB3b24ndCBiZSBhcHBsaWVkLCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgR0JfQ0FNRVJBX09VVF9GTEFHX0FESlVTVEVEICdmbGFnJyB3aWxsIGJlIHNldCB1cG9uCisgKiAgICAgICAgICAgICAgICAgICAgIHJldHVybiwgYW5kIHRoZSBtb2RpZmllZCBjb25maWd1cmF0aW9uIGFuZCBudW1iZXIgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgc3RyZWFtcyBzdG9yZWQgaW4gJ3N0cmVhbXMnIGFuZCAnYXJyYXknLiBUaGUgbW9kdWxlCisgKiAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgaXRzIENTSS0yIGJ1cyBwYXJhbWV0ZXJzIGluIHRoZSAnY3NpX3BhcmFtcycKKyAqICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIGluIGFsbCBjYXNlcy4KKyAqCisgKiBAY2FwdHVyZTogU3VibWl0IGEgY2FwdHVyZSByZXF1ZXN0LiBUaGUgc3VwcGxpZWQgJ3JlcXVlc3RfaWQnIG11c3QgYmUgdW5pcXVlCisgKiAgICAgICAgICAgYW5kIGhpZ2hlciB0aGFuIHRoZSBJRHMgb2YgYWxsIHRoZSBwcmV2aW91c2x5IHN1Ym1pdHRlZCByZXF1ZXN0cy4KKyAqICAgICAgICAgICBUaGUgJ3N0cmVhbXMnIGFyZ3VtZW50IHNwZWNpZmllcyB3aGljaCBzdHJlYW1zIGFyZSBhZmZlY3RlZCBieSB0aGUKKyAqICAgICAgICAgICByZXF1ZXN0IGluIHRoZSBmb3JtIG9mIGEgYml0bWFzaywgd2l0aCBiaXRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgKiAgICAgICAgICAgY29uZmlndXJlZCBzdHJlYW1zIGluZGV4ZXMuIElmIHRoZSByZXF1ZXN0IGNvbnRhaW5zIHNldHRpbmdzLCB0aGUKKyAqICAgICAgICAgICAnc2V0dGluZ3MnIGFyZ3VtZW50IHBvaW50cyB0byB0aGUgc2V0dGluZ3MgYnVmZmVyIGFuZCBpdHMgc2l6ZSBpcworICogICAgICAgICAgIHNwZWNpZmllZCBieSB0aGUgJ3NldHRpbmdzX3NpemUnIGFyZ3VtZW50LiBPdGhlcndpc2UgdGhlICdzZXR0aW5ncycKKyAqICAgICAgICAgICBhcmd1bWVudCBzaG91bGQgYmUgc2V0IHRvIE5VTEwgYW5kICdzZXR0aW5nc19zaXplJyB0byAwLgorICoKKyAqIEBmbHVzaDogRmx1c2ggdGhlIGNhcHR1cmUgcmVxdWVzdHMgcXVldWUuIFJldHVybiB0aGUgSUQgb2YgdGhlIGxhc3QgcmVxdWVzdAorICogICAgICAgICB0aGF0IHdpbGwgcHJvY2Vzc2VkIGJ5IHRoZSBkZXZpY2UgYmVmb3JlIGl0IHN0b3BzIHRyYW5zbWl0dGluZyB2aWRlbworICogICAgICAgICBmcmFtZXMuIEFsbCBxdWV1ZWQgY2FwdHVyZSByZXF1ZXN0cyB3aXRoIElEcyBoaWdoZXIgdGhhbiB0aGUgcmV0dXJuZWQKKyAqICAgICAgICAgSUQgd2lsbCBiZSBkcm9wcGVkIHdpdGhvdXQgYmVpbmcgcHJvY2Vzc2VkLgorICovCitzdHJ1Y3QgZ2JfY2FtZXJhX29wcyB7CisJc3NpemVfdCAoKmNhcGFiaWxpdGllcykodm9pZCAqcHJpdiwgY2hhciAqYnVmLCBzaXplX3QgbGVuKTsKKwlpbnQgKCpjb25maWd1cmVfc3RyZWFtcykodm9pZCAqcHJpdiwgdW5zaWduZWQgaW50ICpuc3RyZWFtcywKKwkJCXVuc2lnbmVkIGludCAqZmxhZ3MsIHN0cnVjdCBnYl9jYW1lcmFfc3RyZWFtICpzdHJlYW1zLAorCQkJc3RydWN0IGdiX2NhbWVyYV9jc2lfcGFyYW1zICpjc2lfcGFyYW1zKTsKKwlpbnQgKCpjYXB0dXJlKSh2b2lkICpwcml2LCB1MzIgcmVxdWVzdF9pZCwKKwkJCXVuc2lnbmVkIGludCBzdHJlYW1zLCB1bnNpZ25lZCBpbnQgbnVtX2ZyYW1lcywKKwkJCXNpemVfdCBzZXR0aW5nc19zaXplLCBjb25zdCB2b2lkICpzZXR0aW5ncyk7CisJaW50ICgqZmx1c2gpKHZvaWQgKnByaXYsIHUzMiAqcmVxdWVzdF9pZCk7Cit9OworCisvKioKKyAqIHN0cnVjdCBnYl9jYW1lcmFfbW9kdWxlIC0gUmVwcmVzZW50cyBncmV5YnVzIGNhbWVyYSBtb2R1bGUuCisgKiBAcHJpdjogTW9kdWxlIHByaXZhdGUgZGF0YSwgcGFzc2VkIHRvIGFsbCBjYW1lcmEgb3BlcmF0aW9ucy4KKyAqIEBvcHM6IEdyZXlidXMgY2FtZXJhIG9wZXJhdGlvbiBjYWxsYmFja3MuCisgKiBAaW50ZXJmYWNlX2lkOiBJbnRlcmZhY2UgaWQgb2YgdGhlIG1vZHVsZS4KKyAqIEByZWZjb3VudDogUmVmZXJlbmNlIGNvdW50aW5nIG9iamVjdC4KKyAqIEByZWxlYXNlOiBNb2R1bGUgcmVsZWFzZSBmdW5jdGlvbi4KKyAqIEBsaXN0OiBMaXN0IGVudHJ5IGluIHRoZSBjYW1lcmEgbW9kdWxlcyBsaXN0LgorICovCitzdHJ1Y3QgZ2JfY2FtZXJhX21vZHVsZSB7CisJdm9pZCAqcHJpdjsKKwljb25zdCBzdHJ1Y3QgZ2JfY2FtZXJhX29wcyAqb3BzOworCisJdW5zaWduZWQgaW50IGludGVyZmFjZV9pZDsKKwlzdHJ1Y3Qga3JlZiByZWZjb3VudDsKKwl2b2lkICgqcmVsZWFzZSkoc3RydWN0IGtyZWYgKmtyZWYpOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsgLyogR2xvYmFsIGxpc3QgKi8KK307CisKKyNkZWZpbmUgZ2JfY2FtZXJhX2NhbGwoZiwgb3AsIGFyZ3MuLi4pICAgICAgXAorCSghKGYpID8gLUVOT0RFViA6ICgoKGYpLT5vcHMtPm9wKSA/ICBcCisJKGYpLT5vcHMtPm9wKChmKS0+cHJpdiwgIyNhcmdzKSA6IC1FTk9JT0NUTENNRCkpCisKK2ludCBnYl9jYW1lcmFfcmVnaXN0ZXIoc3RydWN0IGdiX2NhbWVyYV9tb2R1bGUgKm1vZHVsZSk7CitpbnQgZ2JfY2FtZXJhX3VucmVnaXN0ZXIoc3RydWN0IGdiX2NhbWVyYV9tb2R1bGUgKm1vZHVsZSk7CisKKyNlbmRpZiAvKiBfX0dCX0NBTUVSQV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9nYnBoeS5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZ2JwaHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2RlN2M5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZ2JwaHkuYwpAQCAtMCwwICsxLDM2MCBAQAorLyoKKyAqIEdyZXlidXMgQnJpZGdlZC1QaHkgQnVzIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNCBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNpbmNsdWRlICJncmV5YnVzLmgiCisjaW5jbHVkZSAiZ2JwaHkuaCIKKworI2RlZmluZSBHQl9HQlBIWV9BVVRPU1VTUEVORF9NUwkzMDAwCisKK3N0cnVjdCBnYnBoeV9ob3N0IHsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGU7CisJc3RydWN0IGxpc3RfaGVhZCBkZXZpY2VzOworfTsKKworc3RhdGljIERFRklORV9JREEoZ2JwaHlfaWQpOworCitzdGF0aWMgc3NpemVfdCBwcm90b2NvbF9pZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXYgPSB0b19nYnBoeV9kZXYoZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTAyeFxuIiwgZ2JwaHlfZGV2LT5jcG9ydF9kZXNjLT5wcm90b2NvbF9pZCk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFJfUk8ocHJvdG9jb2xfaWQpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZ2JwaHlfZGV2X2F0dHJzW10gPSB7CisJJmRldl9hdHRyX3Byb3RvY29sX2lkLmF0dHIsCisJTlVMTCwKK307CisKK0FUVFJJQlVURV9HUk9VUFMoZ2JwaHlfZGV2KTsKKworc3RhdGljIHZvaWQgZ2JwaHlfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldiA9IHRvX2dicGh5X2RldihkZXYpOworCisJaWRhX3NpbXBsZV9yZW1vdmUoJmdicGh5X2lkLCBnYnBoeV9kZXYtPmlkKTsKKwlrZnJlZShnYnBoeV9kZXYpOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGdiX2dicGh5X2lkbGUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koZGV2KTsKKwlwbV9yZXF1ZXN0X2F1dG9zdXNwZW5kKGRldik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGdiX2dicGh5X3BtX29wcyA9IHsKKwlTRVRfUlVOVElNRV9QTV9PUFMocG1fZ2VuZXJpY19ydW50aW1lX3N1c3BlbmQsCisJCQkgICBwbV9nZW5lcmljX3J1bnRpbWVfcmVzdW1lLAorCQkJICAgZ2JfZ2JwaHlfaWRsZSkKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX3R5cGUgZ3JleWJ1c19nYnBoeV9kZXZfdHlwZSA9IHsKKwkubmFtZQkgPQkiZ2JwaHlfZGV2aWNlIiwKKwkucmVsZWFzZSA9CWdicGh5X2Rldl9yZWxlYXNlLAorCS5wbQk9CSZnYl9nYnBoeV9wbV9vcHMsCit9OworCitzdGF0aWMgaW50IGdicGh5X2Rldl91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpCit7CisJc3RydWN0IGdicGh5X2RldmljZSAqZ2JwaHlfZGV2ID0gdG9fZ2JwaHlfZGV2KGRldik7CisJc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcl9jcG9ydCAqY3BvcnRfZGVzYyA9IGdicGh5X2Rldi0+Y3BvcnRfZGVzYzsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUgPSBnYnBoeV9kZXYtPmJ1bmRsZTsKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmID0gYnVuZGxlLT5pbnRmOworCXN0cnVjdCBnYl9tb2R1bGUgKm1vZHVsZSA9IGludGYtPm1vZHVsZTsKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkID0gaW50Zi0+aGQ7CisKKwlpZiAoYWRkX3VldmVudF92YXIoZW52LCAiQlVTPSV1IiwgaGQtPmJ1c19pZCkpCisJCXJldHVybiAtRU5PTUVNOworCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJNT0RVTEU9JXUiLCBtb2R1bGUtPm1vZHVsZV9pZCkpCisJCXJldHVybiAtRU5PTUVNOworCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJJTlRFUkZBQ0U9JXUiLCBpbnRmLT5pbnRlcmZhY2VfaWQpKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoYWRkX3VldmVudF92YXIoZW52LCAiR1JFWUJVU19JRD0lMDh4LyUwOHgiLAorCQkJICAgaW50Zi0+dmVuZG9yX2lkLCBpbnRmLT5wcm9kdWN0X2lkKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGFkZF91ZXZlbnRfdmFyKGVudiwgIkJVTkRMRT0ldSIsIGdicGh5X2Rldi0+YnVuZGxlLT5pZCkpCisJCXJldHVybiAtRU5PTUVNOworCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJCVU5ETEVfQ0xBU1M9JTAyeCIsIGJ1bmRsZS0+Y2xhc3MpKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoYWRkX3VldmVudF92YXIoZW52LCAiR0JQSFk9JXUiLCBnYnBoeV9kZXYtPmlkKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGFkZF91ZXZlbnRfdmFyKGVudiwgIlBST1RPQ09MX0lEPSUwMngiLCBjcG9ydF9kZXNjLT5wcm90b2NvbF9pZCkpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ2JwaHlfZGV2aWNlX2lkICoKK2dicGh5X2Rldl9tYXRjaF9pZChzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXYsIHN0cnVjdCBnYnBoeV9kcml2ZXIgKmdicGh5X2RydikKK3sKKwljb25zdCBzdHJ1Y3QgZ2JwaHlfZGV2aWNlX2lkICppZCA9IGdicGh5X2Rydi0+aWRfdGFibGU7CisKKwlpZiAoIWlkKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoOyBpZC0+cHJvdG9jb2xfaWQ7IGlkKyspCisJCWlmIChpZC0+cHJvdG9jb2xfaWQgPT0gZ2JwaHlfZGV2LT5jcG9ydF9kZXNjLT5wcm90b2NvbF9pZCkKKwkJCXJldHVybiBpZDsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGdicGh5X2Rldl9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCit7CisJc3RydWN0IGdicGh5X2RyaXZlciAqZ2JwaHlfZHJ2ID0gdG9fZ2JwaHlfZHJpdmVyKGRydik7CisJc3RydWN0IGdicGh5X2RldmljZSAqZ2JwaHlfZGV2ID0gdG9fZ2JwaHlfZGV2KGRldik7CisJY29uc3Qgc3RydWN0IGdicGh5X2RldmljZV9pZCAqaWQ7CisKKwlpZCA9IGdicGh5X2Rldl9tYXRjaF9pZChnYnBoeV9kZXYsIGdicGh5X2Rydik7CisJaWYgKGlkKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdicGh5X2Rldl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdicGh5X2RyaXZlciAqZ2JwaHlfZHJ2ID0gdG9fZ2JwaHlfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXYgPSB0b19nYnBoeV9kZXYoZGV2KTsKKwljb25zdCBzdHJ1Y3QgZ2JwaHlfZGV2aWNlX2lkICppZDsKKwlpbnQgcmV0OworCisJaWQgPSBnYnBoeV9kZXZfbWF0Y2hfaWQoZ2JwaHlfZGV2LCBnYnBoeV9kcnYpOworCWlmICghaWQpCisJCXJldHVybiAtRU5PREVWOworCisJLyogZm9yIG9sZCBrZXJuZWxzIHdlIG5lZWQgZ2V0X3N5bmMgdG8gcmVzdW1lIHBhcmVudCBkZXZpY2VzICovCisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhnYnBoeV9kZXYtPmJ1bmRsZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlwbV9ydW50aW1lX3NldF9hdXRvc3VzcGVuZF9kZWxheShkZXYsIEdCX0dCUEhZX0FVVE9TVVNQRU5EX01TKTsKKwlwbV9ydW50aW1lX3VzZV9hdXRvc3VzcGVuZChkZXYpOworCXBtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKGRldik7CisJcG1fcnVudGltZV9zZXRfYWN0aXZlKGRldik7CisJcG1fcnVudGltZV9lbmFibGUoZGV2KTsKKworCS8qCisJICogRHJpdmVycyBzaG91bGQgY2FsbCBwdXQgb24gdGhlIGdicGh5IGRldiBiZWZvcmUgcmV0dXJuaW5nCisJICogZnJvbSBwcm9iZSBpZiB0aGV5IHN1cHBvcnQgcnVudGltZSBwbS4KKwkgKi8KKwlyZXQgPSBnYnBoeV9kcnYtPnByb2JlKGdicGh5X2RldiwgaWQpOworCWlmIChyZXQpIHsKKwkJcG1fcnVudGltZV9kaXNhYmxlKGRldik7CisJCXBtX3J1bnRpbWVfc2V0X3N1c3BlbmRlZChkZXYpOworCQlwbV9ydW50aW1lX3B1dF9ub2lkbGUoZGV2KTsKKwkJcG1fcnVudGltZV9kb250X3VzZV9hdXRvc3VzcGVuZChkZXYpOworCX0KKworCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGdicGh5X2Rldi0+YnVuZGxlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JwaHlfZGV2X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdicGh5X2RyaXZlciAqZ2JwaHlfZHJ2ID0gdG9fZ2JwaHlfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXYgPSB0b19nYnBoeV9kZXYoZGV2KTsKKworCWdicGh5X2Rydi0+cmVtb3ZlKGdicGh5X2Rldik7CisKKwlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKKwlwbV9ydW50aW1lX3NldF9zdXNwZW5kZWQoZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9ub2lkbGUoZGV2KTsKKwlwbV9ydW50aW1lX2RvbnRfdXNlX2F1dG9zdXNwZW5kKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBidXNfdHlwZSBnYnBoeV9idXNfdHlwZSA9IHsKKwkubmFtZSA9CQkiZ2JwaHkiLAorCS5tYXRjaCA9CWdicGh5X2Rldl9tYXRjaCwKKwkucHJvYmUgPQlnYnBoeV9kZXZfcHJvYmUsCisJLnJlbW92ZSA9CWdicGh5X2Rldl9yZW1vdmUsCisJLnVldmVudCA9CWdicGh5X2Rldl91ZXZlbnQsCit9OworCitpbnQgZ2JfZ2JwaHlfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBnYnBoeV9kcml2ZXIgKmRyaXZlciwKKwkJCSAgICAgc3RydWN0IG1vZHVsZSAqb3duZXIsIGNvbnN0IGNoYXIgKm1vZF9uYW1lKQoreworCWludCByZXR2YWw7CisKKwlpZiAoZ3JleWJ1c19kaXNhYmxlZCgpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRyaXZlci0+ZHJpdmVyLmJ1cyA9ICZnYnBoeV9idXNfdHlwZTsKKwlkcml2ZXItPmRyaXZlci5uYW1lID0gZHJpdmVyLT5uYW1lOworCWRyaXZlci0+ZHJpdmVyLm93bmVyID0gb3duZXI7CisJZHJpdmVyLT5kcml2ZXIubW9kX25hbWUgPSBtb2RfbmFtZTsKKworCXJldHZhbCA9IGRyaXZlcl9yZWdpc3RlcigmZHJpdmVyLT5kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlwcl9pbmZvKCJyZWdpc3RlcmVkIG5ldyBkcml2ZXIgJXNcbiIsIGRyaXZlci0+bmFtZSk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9nYnBoeV9yZWdpc3Rlcl9kcml2ZXIpOworCit2b2lkIGdiX2dicGh5X2RlcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBnYnBoeV9kcml2ZXIgKmRyaXZlcikKK3sKKwlkcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyLT5kcml2ZXIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfZ2JwaHlfZGVyZWdpc3Rlcl9kcml2ZXIpOworCitzdGF0aWMgc3RydWN0IGdicGh5X2RldmljZSAqZ2JfZ2JwaHlfY3JlYXRlX2RldihzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUsCisJCQkJc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcl9jcG9ydCAqY3BvcnRfZGVzYykKK3sKKwlzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXY7CisJaW50IHJldHZhbDsKKwlpbnQgaWQ7CisKKwlpZCA9IGlkYV9zaW1wbGVfZ2V0KCZnYnBoeV9pZCwgMSwgMCwgR0ZQX0tFUk5FTCk7CisJaWYgKGlkIDwgMCkKKwkJcmV0dXJuIEVSUl9QVFIoaWQpOworCisJZ2JwaHlfZGV2ID0ga3phbGxvYyhzaXplb2YoKmdicGh5X2RldiksIEdGUF9LRVJORUwpOworCWlmICghZ2JwaHlfZGV2KSB7CisJCWlkYV9zaW1wbGVfcmVtb3ZlKCZnYnBoeV9pZCwgaWQpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlnYnBoeV9kZXYtPmlkID0gaWQ7CisJZ2JwaHlfZGV2LT5idW5kbGUgPSBidW5kbGU7CisJZ2JwaHlfZGV2LT5jcG9ydF9kZXNjID0gY3BvcnRfZGVzYzsKKwlnYnBoeV9kZXYtPmRldi5wYXJlbnQgPSAmYnVuZGxlLT5kZXY7CisJZ2JwaHlfZGV2LT5kZXYuYnVzID0gJmdicGh5X2J1c190eXBlOworCWdicGh5X2Rldi0+ZGV2LnR5cGUgPSAmZ3JleWJ1c19nYnBoeV9kZXZfdHlwZTsKKwlnYnBoeV9kZXYtPmRldi5ncm91cHMgPSBnYnBoeV9kZXZfZ3JvdXBzOworCWdicGh5X2Rldi0+ZGV2LmRtYV9tYXNrID0gYnVuZGxlLT5kZXYuZG1hX21hc2s7CisJZGV2X3NldF9uYW1lKCZnYnBoeV9kZXYtPmRldiwgImdicGh5JWQiLCBpZCk7CisKKwlyZXR2YWwgPSBkZXZpY2VfcmVnaXN0ZXIoJmdicGh5X2Rldi0+ZGV2KTsKKwlpZiAocmV0dmFsKSB7CisJCXB1dF9kZXZpY2UoJmdicGh5X2Rldi0+ZGV2KTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0dmFsKTsKKwl9CisKKwlyZXR1cm4gZ2JwaHlfZGV2OworfQorCitzdGF0aWMgdm9pZCBnYl9nYnBoeV9kaXNjb25uZWN0KHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSkKK3sKKwlzdHJ1Y3QgZ2JwaHlfaG9zdCAqZ2JwaHlfaG9zdCA9IGdyZXlidXNfZ2V0X2RydmRhdGEoYnVuZGxlKTsKKwlzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXYsICp0ZW1wOworCWludCByZXQ7CisKKwlyZXQgPSBnYl9wbV9ydW50aW1lX2dldF9zeW5jKGJ1bmRsZSk7CisJaWYgKHJldCA8IDApCisJCWdiX3BtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKGJ1bmRsZSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZ2JwaHlfZGV2LCB0ZW1wLCAmZ2JwaHlfaG9zdC0+ZGV2aWNlcywgbGlzdCkgeworCQlsaXN0X2RlbCgmZ2JwaHlfZGV2LT5saXN0KTsKKwkJZGV2aWNlX3VucmVnaXN0ZXIoJmdicGh5X2Rldi0+ZGV2KTsKKwl9CisKKwlrZnJlZShnYnBoeV9ob3N0KTsKK30KKworc3RhdGljIGludCBnYl9nYnBoeV9wcm9iZShzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUsCisJCQkgIGNvbnN0IHN0cnVjdCBncmV5YnVzX2J1bmRsZV9pZCAqaWQpCit7CisJc3RydWN0IGdicGh5X2hvc3QgKmdicGh5X2hvc3Q7CisJc3RydWN0IGdicGh5X2RldmljZSAqZ2JwaHlfZGV2OworCWludCBpOworCisJaWYgKGJ1bmRsZS0+bnVtX2Nwb3J0cyA9PSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWdicGh5X2hvc3QgPSBremFsbG9jKHNpemVvZigqZ2JwaHlfaG9zdCksIEdGUF9LRVJORUwpOworCWlmICghZ2JwaHlfaG9zdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlnYnBoeV9ob3N0LT5idW5kbGUgPSBidW5kbGU7CisJSU5JVF9MSVNUX0hFQUQoJmdicGh5X2hvc3QtPmRldmljZXMpOworCWdyZXlidXNfc2V0X2RydmRhdGEoYnVuZGxlLCBnYnBoeV9ob3N0KTsKKworCS8qCisJICogQ3JlYXRlIGEgYnVuY2ggb2YgY2hpbGRyZW4gZGV2aWNlcywgb25lIHBlciBjcG9ydCwgYW5kIGJpbmQgdGhlCisJICogYnJpZGdlZCBwaHkgZHJpdmVycyB0byB0aGVtLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBidW5kbGUtPm51bV9jcG9ydHM7ICsraSkgeworCQlnYnBoeV9kZXYgPSBnYl9nYnBoeV9jcmVhdGVfZGV2KGJ1bmRsZSwgJmJ1bmRsZS0+Y3BvcnRfZGVzY1tpXSk7CisJCWlmIChJU19FUlIoZ2JwaHlfZGV2KSkgeworCQkJZ2JfZ2JwaHlfZGlzY29ubmVjdChidW5kbGUpOworCQkJcmV0dXJuIFBUUl9FUlIoZ2JwaHlfZGV2KTsKKwkJfQorCQlsaXN0X2FkZCgmZ2JwaHlfZGV2LT5saXN0LCAmZ2JwaHlfaG9zdC0+ZGV2aWNlcyk7CisJfQorCisJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoYnVuZGxlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGdyZXlidXNfYnVuZGxlX2lkIGdiX2dicGh5X2lkX3RhYmxlW10gPSB7CisJeyBHUkVZQlVTX0RFVklDRV9DTEFTUyhHUkVZQlVTX0NMQVNTX0JSSURHRURfUEhZKSB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGdyZXlidXMsIGdiX2dicGh5X2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBncmV5YnVzX2RyaXZlciBnYl9nYnBoeV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImdicGh5IiwKKwkucHJvYmUJCT0gZ2JfZ2JwaHlfcHJvYmUsCisJLmRpc2Nvbm5lY3QJPSBnYl9nYnBoeV9kaXNjb25uZWN0LAorCS5pZF90YWJsZQk9IGdiX2dicGh5X2lkX3RhYmxlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZ2JwaHlfaW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBidXNfcmVnaXN0ZXIoJmdicGh5X2J1c190eXBlKTsKKwlpZiAocmV0dmFsKSB7CisJCXByX2VycigiZ2JwaHkgYnVzIHJlZ2lzdGVyIGZhaWxlZCAoJWQpXG4iLCByZXR2YWwpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCXJldHZhbCA9IGdyZXlidXNfcmVnaXN0ZXIoJmdiX2dicGh5X2RyaXZlcik7CisJaWYgKHJldHZhbCkgeworCQlwcl9lcnIoImVycm9yIHJlZ2lzdGVyaW5nIGdyZXlidXMgZHJpdmVyXG4iKTsKKwkJZ290byBlcnJvcl9nYnBoeTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZ2JwaHk6CisJYnVzX3VucmVnaXN0ZXIoJmdicGh5X2J1c190eXBlKTsKKwlpZGFfZGVzdHJveSgmZ2JwaHlfaWQpOworCXJldHVybiByZXR2YWw7Cit9Cittb2R1bGVfaW5pdChnYnBoeV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGdicGh5X2V4aXQodm9pZCkKK3sKKwlncmV5YnVzX2RlcmVnaXN0ZXIoJmdiX2dicGh5X2RyaXZlcik7CisJYnVzX3VucmVnaXN0ZXIoJmdicGh5X2J1c190eXBlKTsKKwlpZGFfZGVzdHJveSgmZ2JwaHlfaWQpOworfQorbW9kdWxlX2V4aXQoZ2JwaHlfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2dicGh5LmggYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9nYnBoeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZTY4MDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9nYnBoeS5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogR3JleWJ1cyBCcmlkZ2VkLVBoeSBCdXMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaWZuZGVmIF9fR0JQSFlfSAorI2RlZmluZSBfX0dCUEhZX0gKKworc3RydWN0IGdicGh5X2RldmljZSB7CisJdTMyIGlkOworCXN0cnVjdCBncmV5YnVzX2Rlc2NyaXB0b3JfY3BvcnQgKmNwb3J0X2Rlc2M7CisJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgZGV2aWNlIGRldjsKK307CisjZGVmaW5lIHRvX2dicGh5X2RldihkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IGdicGh5X2RldmljZSwgZGV2KQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmdiX2dicGh5X2dldF9kYXRhKHN0cnVjdCBnYnBoeV9kZXZpY2UgKmdkZXYpCit7CisJcmV0dXJuIGRldl9nZXRfZHJ2ZGF0YSgmZ2Rldi0+ZGV2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdiX2dicGh5X3NldF9kYXRhKHN0cnVjdCBnYnBoeV9kZXZpY2UgKmdkZXYsIHZvaWQgKmRhdGEpCit7CisJZGV2X3NldF9kcnZkYXRhKCZnZGV2LT5kZXYsIGRhdGEpOworfQorCitzdHJ1Y3QgZ2JwaHlfZGV2aWNlX2lkIHsKKwlfX3U4IHByb3RvY29sX2lkOworfTsKKworI2RlZmluZSBHQlBIWV9QUk9UT0NPTChwKQkJXAorCS5wcm90b2NvbF9pZAk9IChwKSwKKworc3RydWN0IGdicGh5X2RyaXZlciB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKCpwcm9iZSkoc3RydWN0IGdicGh5X2RldmljZSAqLAorCQkgICAgIGNvbnN0IHN0cnVjdCBnYnBoeV9kZXZpY2VfaWQgKmlkKTsKKwl2b2lkICgqcmVtb3ZlKShzdHJ1Y3QgZ2JwaHlfZGV2aWNlICopOworCWNvbnN0IHN0cnVjdCBnYnBoeV9kZXZpY2VfaWQgKmlkX3RhYmxlOworCisJc3RydWN0IGRldmljZV9kcml2ZXIgZHJpdmVyOworfTsKKyNkZWZpbmUgdG9fZ2JwaHlfZHJpdmVyKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgZ2JwaHlfZHJpdmVyLCBkcml2ZXIpCisKK2ludCBnYl9nYnBoeV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGdicGh5X2RyaXZlciAqZHJpdmVyLAorCQkJICAgICBzdHJ1Y3QgbW9kdWxlICpvd25lciwgY29uc3QgY2hhciAqbW9kX25hbWUpOwordm9pZCBnYl9nYnBoeV9kZXJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgZ2JwaHlfZHJpdmVyICpkcml2ZXIpOworCisjZGVmaW5lIGdiX2dicGh5X3JlZ2lzdGVyKGRyaXZlcikgXAorCWdiX2dicGh5X3JlZ2lzdGVyX2RyaXZlcihkcml2ZXIsIFRISVNfTU9EVUxFLCBLQlVJTERfTU9ETkFNRSkKKyNkZWZpbmUgZ2JfZ2JwaHlfZGVyZWdpc3Rlcihkcml2ZXIpIFwKKwlnYl9nYnBoeV9kZXJlZ2lzdGVyX2RyaXZlcihkcml2ZXIpCisKKy8qKgorICogbW9kdWxlX2dicGh5X2RyaXZlcigpIC0gSGVscGVyIG1hY3JvIGZvciByZWdpc3RlcmluZyBhIGdicGh5IGRyaXZlcgorICogQF9fZ2JwaHlfZHJpdmVyOiBnYnBoeV9kcml2ZXIgc3RydWN0dXJlCisgKgorICogSGVscGVyIG1hY3JvIGZvciBnYnBoeSBkcml2ZXJzIHRvIHNldCB1cCBwcm9wZXIgbW9kdWxlIGluaXQgLyBleGl0CisgKiBmdW5jdGlvbnMuICBSZXBsYWNlcyBtb2R1bGVfaW5pdCgpIGFuZCBtb2R1bGVfZXhpdCgpIGFuZCBrZWVwcyBwZW9wbGUgZnJvbQorICogcHJpbnRpbmcgcG9pbnRsZXNzIHRoaW5ncyB0byB0aGUga2VybmVsIGxvZyB3aGVuIHRoZWlyIGRyaXZlciBpcyBsb2FkZWQuCisgKi8KKyNkZWZpbmUgbW9kdWxlX2dicGh5X2RyaXZlcihfX2dicGh5X2RyaXZlcikJXAorCW1vZHVsZV9kcml2ZXIoX19nYnBoeV9kcml2ZXIsIGdiX2dicGh5X3JlZ2lzdGVyLCBnYl9nYnBoeV9kZXJlZ2lzdGVyKQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW5saW5lIGludCBnYnBoeV9ydW50aW1lX2dldF9zeW5jKHN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZ2JwaHlfZGV2LT5kZXY7CisJaW50IHJldDsKKworCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgInBtX3J1bnRpbWVfZ2V0X3N5bmMgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJcG1fcnVudGltZV9wdXRfbm9pZGxlKGRldik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnYnBoeV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmdicGh5X2Rldi0+ZGV2OworCisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShkZXYpOworCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnYnBoeV9ydW50aW1lX2dldF9ub3Jlc3VtZShzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXYpCit7CisJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoJmdicGh5X2Rldi0+ZGV2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdicGh5X3J1bnRpbWVfcHV0X25vaWRsZShzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXYpCit7CisJcG1fcnVudGltZV9wdXRfbm9pZGxlKCZnYnBoeV9kZXYtPmRldik7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgZ2JwaHlfcnVudGltZV9nZXRfc3luYyhzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXYpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBnYnBoeV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXYpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgZ2JwaHlfcnVudGltZV9nZXRfbm9yZXN1bWUoc3RydWN0IGdicGh5X2RldmljZSAqZ2JwaHlfZGV2KSB7fQorc3RhdGljIGlubGluZSB2b2lkIGdicGh5X3J1bnRpbWVfcHV0X25vaWRsZShzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXYpIHt9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fR0JQSFlfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9ncGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUwNmU0MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2dwaW8uYwpAQCAtMCwwICsxLDc2NiBAQAorLyoKKyAqIEdQSU8gR3JleWJ1cyBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE0IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKworI2luY2x1ZGUgImdyZXlidXMuaCIKKyNpbmNsdWRlICJnYnBoeS5oIgorCitzdHJ1Y3QgZ2JfZ3Bpb19saW5lIHsKKwkvKiBUaGUgZm9sbG93aW5nIGhhcyB0byBiZSBhbiBhcnJheSBvZiBsaW5lX21heCBlbnRyaWVzICovCisJLyogLS0+IG1ha2UgdGhlbSBqdXN0IGEgZmxhZ3MgZmllbGQgKi8KKwl1OAkJCWFjdGl2ZTogICAgMSwKKwkJCQlkaXJlY3Rpb246IDEsCS8qIDAgPSBvdXRwdXQsIDEgPSBpbnB1dCAqLworCQkJCXZhbHVlOiAgICAgMTsJLyogMCA9IGxvdywgMSA9IGhpZ2ggKi8KKwl1MTYJCQlkZWJvdW5jZV91c2VjOworCisJdTgJCQlpcnFfdHlwZTsKKwlib29sCQkJaXJxX3R5cGVfcGVuZGluZzsKKwlib29sCQkJbWFza2VkOworCWJvb2wJCQltYXNrZWRfcGVuZGluZzsKK307CisKK3N0cnVjdCBnYl9ncGlvX2NvbnRyb2xsZXIgeworCXN0cnVjdCBnYnBoeV9kZXZpY2UJKmdicGh5X2RldjsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbgkqY29ubmVjdGlvbjsKKwl1OAkJCWxpbmVfbWF4OwkvKiBtYXggbGluZSBudW1iZXIgKi8KKwlzdHJ1Y3QgZ2JfZ3Bpb19saW5lCSpsaW5lczsKKworCXN0cnVjdCBncGlvX2NoaXAJY2hpcDsKKwlzdHJ1Y3QgaXJxX2NoaXAJCWlycWM7CisJc3RydWN0IGlycV9jaGlwCQkqaXJxY2hpcDsKKwlzdHJ1Y3QgaXJxX2RvbWFpbgkqaXJxZG9tYWluOworCXVuc2lnbmVkIGludAkJaXJxX2Jhc2U7CisJaXJxX2Zsb3dfaGFuZGxlcl90CWlycV9oYW5kbGVyOworCXVuc2lnbmVkIGludAkJaXJxX2RlZmF1bHRfdHlwZTsKKwlzdHJ1Y3QgbXV0ZXgJCWlycV9sb2NrOworfTsKKyNkZWZpbmUgZ3Bpb19jaGlwX3RvX2diX2dwaW9fY29udHJvbGxlcihjaGlwKSBcCisJY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBnYl9ncGlvX2NvbnRyb2xsZXIsIGNoaXApCisjZGVmaW5lIGlycV9kYXRhX3RvX2dwaW9fY2hpcChkKSAoZC0+ZG9tYWluLT5ob3N0X2RhdGEpCisKK3N0YXRpYyBpbnQgZ2JfZ3Bpb19saW5lX2NvdW50X29wZXJhdGlvbihzdHJ1Y3QgZ2JfZ3Bpb19jb250cm9sbGVyICpnZ2MpCit7CisJc3RydWN0IGdiX2dwaW9fbGluZV9jb3VudF9yZXNwb25zZSByZXNwb25zZTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoZ2djLT5jb25uZWN0aW9uLCBHQl9HUElPX1RZUEVfTElORV9DT1VOVCwKKwkJCQlOVUxMLCAwLCAmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpOworCWlmICghcmV0KQorCQlnZ2MtPmxpbmVfbWF4ID0gcmVzcG9uc2UuY291bnQ7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9ncGlvX2FjdGl2YXRlX29wZXJhdGlvbihzdHJ1Y3QgZ2JfZ3Bpb19jb250cm9sbGVyICpnZ2MsIHU4IHdoaWNoKQoreworCXN0cnVjdCBnYl9ncGlvX2FjdGl2YXRlX3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXYgPSBnZ2MtPmdicGh5X2RldjsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2JwaHlfcnVudGltZV9nZXRfc3luYyhnYnBoeV9kZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXF1ZXN0LndoaWNoID0gd2hpY2g7CisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoZ2djLT5jb25uZWN0aW9uLCBHQl9HUElPX1RZUEVfQUNUSVZBVEUsCisJCQkJICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksIE5VTEwsIDApOworCWlmIChyZXQpIHsKKwkJZ2JwaHlfcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoZ2JwaHlfZGV2KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlnZ2MtPmxpbmVzW3doaWNoXS5hY3RpdmUgPSB0cnVlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2dwaW9fZGVhY3RpdmF0ZV9vcGVyYXRpb24oc3RydWN0IGdiX2dwaW9fY29udHJvbGxlciAqZ2djLAorCQkJCQl1OCB3aGljaCkKK3sKKwlzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXYgPSBnZ2MtPmdicGh5X2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZ2JwaHlfZGV2LT5kZXY7CisJc3RydWN0IGdiX2dwaW9fZGVhY3RpdmF0ZV9yZXF1ZXN0IHJlcXVlc3Q7CisJaW50IHJldDsKKworCXJlcXVlc3Qud2hpY2ggPSB3aGljaDsKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhnZ2MtPmNvbm5lY3Rpb24sIEdCX0dQSU9fVFlQRV9ERUFDVElWQVRFLAorCQkJCSAmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLCBOVUxMLCAwKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGRlYWN0aXZhdGUgZ3BpbyAldVxuIiwgd2hpY2gpOworCQlnb3RvIG91dF9wbV9wdXQ7CisJfQorCisJZ2djLT5saW5lc1t3aGljaF0uYWN0aXZlID0gZmFsc2U7CisKK291dF9wbV9wdXQ6CisJZ2JwaHlfcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoZ2JwaHlfZGV2KTsKK30KKworc3RhdGljIGludCBnYl9ncGlvX2dldF9kaXJlY3Rpb25fb3BlcmF0aW9uKHN0cnVjdCBnYl9ncGlvX2NvbnRyb2xsZXIgKmdnYywKKwkJCQkJdTggd2hpY2gpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmdnYy0+Z2JwaHlfZGV2LT5kZXY7CisJc3RydWN0IGdiX2dwaW9fZ2V0X2RpcmVjdGlvbl9yZXF1ZXN0IHJlcXVlc3Q7CisJc3RydWN0IGdiX2dwaW9fZ2V0X2RpcmVjdGlvbl9yZXNwb25zZSByZXNwb25zZTsKKwlpbnQgcmV0OworCXU4IGRpcmVjdGlvbjsKKworCXJlcXVlc3Qud2hpY2ggPSB3aGljaDsKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhnZ2MtPmNvbm5lY3Rpb24sIEdCX0dQSU9fVFlQRV9HRVRfRElSRUNUSU9OLAorCQkJCSZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksCisJCQkJJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZGlyZWN0aW9uID0gcmVzcG9uc2UuZGlyZWN0aW9uOworCWlmIChkaXJlY3Rpb24gJiYgZGlyZWN0aW9uICE9IDEpIHsKKwkJZGV2X3dhcm4oZGV2LCAiZ3BpbyAldSBkaXJlY3Rpb24gd2FzICV1IChzaG91bGQgYmUgMCBvciAxKVxuIiwKKwkJCSB3aGljaCwgZGlyZWN0aW9uKTsKKwl9CisJZ2djLT5saW5lc1t3aGljaF0uZGlyZWN0aW9uID0gZGlyZWN0aW9uID8gMSA6IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JfZ3Bpb19kaXJlY3Rpb25faW5fb3BlcmF0aW9uKHN0cnVjdCBnYl9ncGlvX2NvbnRyb2xsZXIgKmdnYywKKwkJCQkJdTggd2hpY2gpCit7CisJc3RydWN0IGdiX2dwaW9fZGlyZWN0aW9uX2luX3JlcXVlc3QgcmVxdWVzdDsKKwlpbnQgcmV0OworCisJcmVxdWVzdC53aGljaCA9IHdoaWNoOworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGdnYy0+Y29ubmVjdGlvbiwgR0JfR1BJT19UWVBFX0RJUkVDVElPTl9JTiwKKwkJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLCBOVUxMLCAwKTsKKwlpZiAoIXJldCkKKwkJZ2djLT5saW5lc1t3aGljaF0uZGlyZWN0aW9uID0gMTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX2dwaW9fZGlyZWN0aW9uX291dF9vcGVyYXRpb24oc3RydWN0IGdiX2dwaW9fY29udHJvbGxlciAqZ2djLAorCQkJCQl1OCB3aGljaCwgYm9vbCB2YWx1ZV9oaWdoKQoreworCXN0cnVjdCBnYl9ncGlvX2RpcmVjdGlvbl9vdXRfcmVxdWVzdCByZXF1ZXN0OworCWludCByZXQ7CisKKwlyZXF1ZXN0LndoaWNoID0gd2hpY2g7CisJcmVxdWVzdC52YWx1ZSA9IHZhbHVlX2hpZ2ggPyAxIDogMDsKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhnZ2MtPmNvbm5lY3Rpb24sIEdCX0dQSU9fVFlQRV9ESVJFQ1RJT05fT1VULAorCQkJCSZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksIE5VTEwsIDApOworCWlmICghcmV0KQorCQlnZ2MtPmxpbmVzW3doaWNoXS5kaXJlY3Rpb24gPSAwOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfZ3Bpb19nZXRfdmFsdWVfb3BlcmF0aW9uKHN0cnVjdCBnYl9ncGlvX2NvbnRyb2xsZXIgKmdnYywKKwkJCQkJdTggd2hpY2gpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmdnYy0+Z2JwaHlfZGV2LT5kZXY7CisJc3RydWN0IGdiX2dwaW9fZ2V0X3ZhbHVlX3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZ2JfZ3Bpb19nZXRfdmFsdWVfcmVzcG9uc2UgcmVzcG9uc2U7CisJaW50IHJldDsKKwl1OCB2YWx1ZTsKKworCXJlcXVlc3Qud2hpY2ggPSB3aGljaDsKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhnZ2MtPmNvbm5lY3Rpb24sIEdCX0dQSU9fVFlQRV9HRVRfVkFMVUUsCisJCQkJJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwKKwkJCQkmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IHZhbHVlIG9mIGdwaW8gJXVcbiIsIHdoaWNoKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl2YWx1ZSA9IHJlc3BvbnNlLnZhbHVlOworCWlmICh2YWx1ZSAmJiB2YWx1ZSAhPSAxKSB7CisJCWRldl93YXJuKGRldiwgImdwaW8gJXUgdmFsdWUgd2FzICV1IChzaG91bGQgYmUgMCBvciAxKVxuIiwKKwkJCSB3aGljaCwgdmFsdWUpOworCX0KKwlnZ2MtPmxpbmVzW3doaWNoXS52YWx1ZSA9IHZhbHVlID8gMSA6IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2dwaW9fc2V0X3ZhbHVlX29wZXJhdGlvbihzdHJ1Y3QgZ2JfZ3Bpb19jb250cm9sbGVyICpnZ2MsCisJCQkJCXU4IHdoaWNoLCBib29sIHZhbHVlX2hpZ2gpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmdnYy0+Z2JwaHlfZGV2LT5kZXY7CisJc3RydWN0IGdiX2dwaW9fc2V0X3ZhbHVlX3JlcXVlc3QgcmVxdWVzdDsKKwlpbnQgcmV0OworCisJaWYgKGdnYy0+bGluZXNbd2hpY2hdLmRpcmVjdGlvbiA9PSAxKSB7CisJCWRldl93YXJuKGRldiwgInJlZnVzaW5nIHRvIHNldCB2YWx1ZSBvZiBpbnB1dCBncGlvICV1XG4iLAorCQkJIHdoaWNoKTsKKwkJcmV0dXJuOworCX0KKworCXJlcXVlc3Qud2hpY2ggPSB3aGljaDsKKwlyZXF1ZXN0LnZhbHVlID0gdmFsdWVfaGlnaCA/IDEgOiAwOworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGdnYy0+Y29ubmVjdGlvbiwgR0JfR1BJT19UWVBFX1NFVF9WQUxVRSwKKwkJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLCBOVUxMLCAwKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHNldCB2YWx1ZSBvZiBncGlvICV1XG4iLCB3aGljaCk7CisJCXJldHVybjsKKwl9CisKKwlnZ2MtPmxpbmVzW3doaWNoXS52YWx1ZSA9IHJlcXVlc3QudmFsdWU7Cit9CisKK3N0YXRpYyBpbnQgZ2JfZ3Bpb19zZXRfZGVib3VuY2Vfb3BlcmF0aW9uKHN0cnVjdCBnYl9ncGlvX2NvbnRyb2xsZXIgKmdnYywKKwkJCQkJdTggd2hpY2gsIHUxNiBkZWJvdW5jZV91c2VjKQoreworCXN0cnVjdCBnYl9ncGlvX3NldF9kZWJvdW5jZV9yZXF1ZXN0IHJlcXVlc3Q7CisJaW50IHJldDsKKworCXJlcXVlc3Qud2hpY2ggPSB3aGljaDsKKwlyZXF1ZXN0LnVzZWMgPSBjcHVfdG9fbGUxNihkZWJvdW5jZV91c2VjKTsKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhnZ2MtPmNvbm5lY3Rpb24sIEdCX0dQSU9fVFlQRV9TRVRfREVCT1VOQ0UsCisJCQkJJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwgTlVMTCwgMCk7CisJaWYgKCFyZXQpCisJCWdnYy0+bGluZXNbd2hpY2hdLmRlYm91bmNlX3VzZWMgPSBkZWJvdW5jZV91c2VjOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9nYl9ncGlvX2lycV9tYXNrKHN0cnVjdCBnYl9ncGlvX2NvbnRyb2xsZXIgKmdnYywgdTggaHdpcnEpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmdnYy0+Z2JwaHlfZGV2LT5kZXY7CisJc3RydWN0IGdiX2dwaW9faXJxX21hc2tfcmVxdWVzdCByZXF1ZXN0OworCWludCByZXQ7CisKKwlyZXF1ZXN0LndoaWNoID0gaHdpcnE7CisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoZ2djLT5jb25uZWN0aW9uLAorCQkJCUdCX0dQSU9fVFlQRV9JUlFfTUFTSywKKwkJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLCBOVUxMLCAwKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBtYXNrIGlycTogJWRcbiIsIHJldCk7Cit9CisKK3N0YXRpYyB2b2lkIF9nYl9ncGlvX2lycV91bm1hc2soc3RydWN0IGdiX2dwaW9fY29udHJvbGxlciAqZ2djLCB1OCBod2lycSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZ2djLT5nYnBoeV9kZXYtPmRldjsKKwlzdHJ1Y3QgZ2JfZ3Bpb19pcnFfdW5tYXNrX3JlcXVlc3QgcmVxdWVzdDsKKwlpbnQgcmV0OworCisJcmVxdWVzdC53aGljaCA9IGh3aXJxOworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGdnYy0+Y29ubmVjdGlvbiwKKwkJCQlHQl9HUElPX1RZUEVfSVJRX1VOTUFTSywKKwkJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLCBOVUxMLCAwKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byB1bm1hc2sgaXJxOiAlZFxuIiwgcmV0KTsKK30KKworc3RhdGljIHZvaWQgX2diX2dwaW9faXJxX3NldF90eXBlKHN0cnVjdCBnYl9ncGlvX2NvbnRyb2xsZXIgKmdnYywKKwkJCQkJdTggaHdpcnEsIHU4IHR5cGUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmdnYy0+Z2JwaHlfZGV2LT5kZXY7CisJc3RydWN0IGdiX2dwaW9faXJxX3R5cGVfcmVxdWVzdCByZXF1ZXN0OworCWludCByZXQ7CisKKwlyZXF1ZXN0LndoaWNoID0gaHdpcnE7CisJcmVxdWVzdC50eXBlID0gdHlwZTsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGdnYy0+Y29ubmVjdGlvbiwKKwkJCQlHQl9HUElPX1RZUEVfSVJRX1RZUEUsCisJCQkJJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwgTlVMTCwgMCk7CisJaWYgKHJldCkKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gc2V0IGlycSB0eXBlOiAlZFxuIiwgcmV0KTsKK30KKworc3RhdGljIHZvaWQgZ2JfZ3Bpb19pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IGdwaW9fY2hpcCAqY2hpcCA9IGlycV9kYXRhX3RvX2dwaW9fY2hpcChkKTsKKwlzdHJ1Y3QgZ2JfZ3Bpb19jb250cm9sbGVyICpnZ2MgPSBncGlvX2NoaXBfdG9fZ2JfZ3Bpb19jb250cm9sbGVyKGNoaXApOworCXN0cnVjdCBnYl9ncGlvX2xpbmUgKmxpbmUgPSAmZ2djLT5saW5lc1tkLT5od2lycV07CisKKwlsaW5lLT5tYXNrZWQgPSB0cnVlOworCWxpbmUtPm1hc2tlZF9wZW5kaW5nID0gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgZ2JfZ3Bpb19pcnFfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwID0gaXJxX2RhdGFfdG9fZ3Bpb19jaGlwKGQpOworCXN0cnVjdCBnYl9ncGlvX2NvbnRyb2xsZXIgKmdnYyA9IGdwaW9fY2hpcF90b19nYl9ncGlvX2NvbnRyb2xsZXIoY2hpcCk7CisJc3RydWN0IGdiX2dwaW9fbGluZSAqbGluZSA9ICZnZ2MtPmxpbmVzW2QtPmh3aXJxXTsKKworCWxpbmUtPm1hc2tlZCA9IGZhbHNlOworCWxpbmUtPm1hc2tlZF9wZW5kaW5nID0gdHJ1ZTsKK30KKworc3RhdGljIGludCBnYl9ncGlvX2lycV9zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCB0eXBlKQoreworCXN0cnVjdCBncGlvX2NoaXAgKmNoaXAgPSBpcnFfZGF0YV90b19ncGlvX2NoaXAoZCk7CisJc3RydWN0IGdiX2dwaW9fY29udHJvbGxlciAqZ2djID0gZ3Bpb19jaGlwX3RvX2diX2dwaW9fY29udHJvbGxlcihjaGlwKTsKKwlzdHJ1Y3QgZ2JfZ3Bpb19saW5lICpsaW5lID0gJmdnYy0+bGluZXNbZC0+aHdpcnFdOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZnZ2MtPmdicGh5X2Rldi0+ZGV2OworCXU4IGlycV90eXBlOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJUlFfVFlQRV9OT05FOgorCQlpcnFfdHlwZSA9IEdCX0dQSU9fSVJRX1RZUEVfTk9ORTsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9FREdFX1JJU0lORzoKKwkJaXJxX3R5cGUgPSBHQl9HUElPX0lSUV9UWVBFX0VER0VfUklTSU5HOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0VER0VfRkFMTElORzoKKwkJaXJxX3R5cGUgPSBHQl9HUElPX0lSUV9UWVBFX0VER0VfRkFMTElORzsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9FREdFX0JPVEg6CisJCWlycV90eXBlID0gR0JfR1BJT19JUlFfVFlQRV9FREdFX0JPVEg7CisJCWJyZWFrOworCWNhc2UgSVJRX1RZUEVfTEVWRUxfTE9XOgorCQlpcnFfdHlwZSA9IEdCX0dQSU9fSVJRX1RZUEVfTEVWRUxfTE9XOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0xFVkVMX0hJR0g6CisJCWlycV90eXBlID0gR0JfR1BJT19JUlFfVFlQRV9MRVZFTF9ISUdIOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgInVuc3VwcG9ydGVkIGlycSB0eXBlOiAldVxuIiwgdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWxpbmUtPmlycV90eXBlID0gaXJxX3R5cGU7CisJbGluZS0+aXJxX3R5cGVfcGVuZGluZyA9IHRydWU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2JfZ3Bpb19pcnFfYnVzX2xvY2soc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBncGlvX2NoaXAgKmNoaXAgPSBpcnFfZGF0YV90b19ncGlvX2NoaXAoZCk7CisJc3RydWN0IGdiX2dwaW9fY29udHJvbGxlciAqZ2djID0gZ3Bpb19jaGlwX3RvX2diX2dwaW9fY29udHJvbGxlcihjaGlwKTsKKworCW11dGV4X2xvY2soJmdnYy0+aXJxX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBnYl9ncGlvX2lycV9idXNfc3luY191bmxvY2soc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBncGlvX2NoaXAgKmNoaXAgPSBpcnFfZGF0YV90b19ncGlvX2NoaXAoZCk7CisJc3RydWN0IGdiX2dwaW9fY29udHJvbGxlciAqZ2djID0gZ3Bpb19jaGlwX3RvX2diX2dwaW9fY29udHJvbGxlcihjaGlwKTsKKwlzdHJ1Y3QgZ2JfZ3Bpb19saW5lICpsaW5lID0gJmdnYy0+bGluZXNbZC0+aHdpcnFdOworCisJaWYgKGxpbmUtPmlycV90eXBlX3BlbmRpbmcpIHsKKwkJX2diX2dwaW9faXJxX3NldF90eXBlKGdnYywgZC0+aHdpcnEsIGxpbmUtPmlycV90eXBlKTsKKwkJbGluZS0+aXJxX3R5cGVfcGVuZGluZyA9IGZhbHNlOworCX0KKworCWlmIChsaW5lLT5tYXNrZWRfcGVuZGluZykgeworCQlpZiAobGluZS0+bWFza2VkKQorCQkJX2diX2dwaW9faXJxX21hc2soZ2djLCBkLT5od2lycSk7CisJCWVsc2UKKwkJCV9nYl9ncGlvX2lycV91bm1hc2soZ2djLCBkLT5od2lycSk7CisJCWxpbmUtPm1hc2tlZF9wZW5kaW5nID0gZmFsc2U7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZnZ2MtPmlycV9sb2NrKTsKK30KKworc3RhdGljIGludCBnYl9ncGlvX3JlcXVlc3RfaGFuZGxlcihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IG9wLT5jb25uZWN0aW9uOworCXN0cnVjdCBnYl9ncGlvX2NvbnRyb2xsZXIgKmdnYyA9IGdiX2Nvbm5lY3Rpb25fZ2V0X2RhdGEoY29ubmVjdGlvbik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmdnYy0+Z2JwaHlfZGV2LT5kZXY7CisJc3RydWN0IGdiX21lc3NhZ2UgKnJlcXVlc3Q7CisJc3RydWN0IGdiX2dwaW9faXJxX2V2ZW50X3JlcXVlc3QgKmV2ZW50OworCXU4IHR5cGUgPSBvcC0+dHlwZTsKKwlpbnQgaXJxOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKKworCWlmICh0eXBlICE9IEdCX0dQSU9fVFlQRV9JUlFfRVZFTlQpIHsKKwkJZGV2X2VycihkZXYsICJ1bnN1cHBvcnRlZCB1bnNvbGljaXRlZCByZXF1ZXN0OiAldVxuIiwgdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlcXVlc3QgPSBvcC0+cmVxdWVzdDsKKworCWlmIChyZXF1ZXN0LT5wYXlsb2FkX3NpemUgPCBzaXplb2YoKmV2ZW50KSkgeworCQlkZXZfZXJyKGRldiwgInNob3J0IGV2ZW50IHJlY2VpdmVkICglenUgPCAlenUpXG4iLAorCQkJcmVxdWVzdC0+cGF5bG9hZF9zaXplLCBzaXplb2YoKmV2ZW50KSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWV2ZW50ID0gcmVxdWVzdC0+cGF5bG9hZDsKKwlpZiAoZXZlbnQtPndoaWNoID4gZ2djLT5saW5lX21heCkgeworCQlkZXZfZXJyKGRldiwgImludmFsaWQgaHcgaXJxOiAlZFxuIiwgZXZlbnQtPndoaWNoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaXJxID0gaXJxX2ZpbmRfbWFwcGluZyhnZ2MtPmlycWRvbWFpbiwgZXZlbnQtPndoaWNoKTsKKwlpZiAoIWlycSkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBmaW5kIElSUVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKKwlpZiAoIWRlc2MpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gbG9vayB1cCBpcnFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWdlbmVyaWNfaGFuZGxlX2lycV9kZXNjKGRlc2MpOworCWxvY2FsX2lycV9lbmFibGUoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX2dwaW9fcmVxdWVzdChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IGdiX2dwaW9fY29udHJvbGxlciAqZ2djID0gZ3Bpb19jaGlwX3RvX2diX2dwaW9fY29udHJvbGxlcihjaGlwKTsKKworCXJldHVybiBnYl9ncGlvX2FjdGl2YXRlX29wZXJhdGlvbihnZ2MsICh1OClvZmZzZXQpOworfQorCitzdGF0aWMgdm9pZCBnYl9ncGlvX2ZyZWUoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBnYl9ncGlvX2NvbnRyb2xsZXIgKmdnYyA9IGdwaW9fY2hpcF90b19nYl9ncGlvX2NvbnRyb2xsZXIoY2hpcCk7CisKKwlnYl9ncGlvX2RlYWN0aXZhdGVfb3BlcmF0aW9uKGdnYywgKHU4KW9mZnNldCk7Cit9CisKK3N0YXRpYyBpbnQgZ2JfZ3Bpb19nZXRfZGlyZWN0aW9uKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgZ2JfZ3Bpb19jb250cm9sbGVyICpnZ2MgPSBncGlvX2NoaXBfdG9fZ2JfZ3Bpb19jb250cm9sbGVyKGNoaXApOworCXU4IHdoaWNoOworCWludCByZXQ7CisKKwl3aGljaCA9ICh1OClvZmZzZXQ7CisJcmV0ID0gZ2JfZ3Bpb19nZXRfZGlyZWN0aW9uX29wZXJhdGlvbihnZ2MsIHdoaWNoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGdnYy0+bGluZXNbd2hpY2hdLmRpcmVjdGlvbiA/IDEgOiAwOworfQorCitzdGF0aWMgaW50IGdiX2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgZ2JfZ3Bpb19jb250cm9sbGVyICpnZ2MgPSBncGlvX2NoaXBfdG9fZ2JfZ3Bpb19jb250cm9sbGVyKGNoaXApOworCisJcmV0dXJuIGdiX2dwaW9fZGlyZWN0aW9uX2luX29wZXJhdGlvbihnZ2MsICh1OClvZmZzZXQpOworfQorCitzdGF0aWMgaW50IGdiX2dwaW9fZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsCisJCQkJCWludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZ2JfZ3Bpb19jb250cm9sbGVyICpnZ2MgPSBncGlvX2NoaXBfdG9fZ2JfZ3Bpb19jb250cm9sbGVyKGNoaXApOworCisJcmV0dXJuIGdiX2dwaW9fZGlyZWN0aW9uX291dF9vcGVyYXRpb24oZ2djLCAodTgpb2Zmc2V0LCAhIXZhbHVlKTsKK30KKworc3RhdGljIGludCBnYl9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IGdiX2dwaW9fY29udHJvbGxlciAqZ2djID0gZ3Bpb19jaGlwX3RvX2diX2dwaW9fY29udHJvbGxlcihjaGlwKTsKKwl1OCB3aGljaDsKKwlpbnQgcmV0OworCisJd2hpY2ggPSAodTgpb2Zmc2V0OworCXJldCA9IGdiX2dwaW9fZ2V0X3ZhbHVlX29wZXJhdGlvbihnZ2MsIHdoaWNoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGdnYy0+bGluZXNbd2hpY2hdLnZhbHVlOworfQorCitzdGF0aWMgdm9pZCBnYl9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZ2JfZ3Bpb19jb250cm9sbGVyICpnZ2MgPSBncGlvX2NoaXBfdG9fZ2JfZ3Bpb19jb250cm9sbGVyKGNoaXApOworCisJZ2JfZ3Bpb19zZXRfdmFsdWVfb3BlcmF0aW9uKGdnYywgKHU4KW9mZnNldCwgISF2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgZ2JfZ3Bpb19zZXRfZGVib3VuY2Uoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LAorCQkJCQl1bnNpZ25lZCBkZWJvdW5jZSkKK3sKKwlzdHJ1Y3QgZ2JfZ3Bpb19jb250cm9sbGVyICpnZ2MgPSBncGlvX2NoaXBfdG9fZ2JfZ3Bpb19jb250cm9sbGVyKGNoaXApOworCXUxNiB1c2VjOworCisJaWYgKGRlYm91bmNlID4gVTE2X01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJdXNlYyA9ICh1MTYpZGVib3VuY2U7CisKKwlyZXR1cm4gZ2JfZ3Bpb19zZXRfZGVib3VuY2Vfb3BlcmF0aW9uKGdnYywgKHU4KW9mZnNldCwgdXNlYyk7Cit9CisKK3N0YXRpYyBpbnQgZ2JfZ3Bpb19jb250cm9sbGVyX3NldHVwKHN0cnVjdCBnYl9ncGlvX2NvbnRyb2xsZXIgKmdnYykKK3sKKwlpbnQgcmV0OworCisJLyogTm93IGZpbmQgb3V0IGhvdyBtYW55IGxpbmVzIHRoZXJlIGFyZSAqLworCXJldCA9IGdiX2dwaW9fbGluZV9jb3VudF9vcGVyYXRpb24oZ2djKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZ2djLT5saW5lcyA9IGtjYWxsb2MoZ2djLT5saW5lX21heCArIDEsIHNpemVvZigqZ2djLT5saW5lcyksCisJCQkgICAgIEdGUF9LRVJORUwpOworCWlmICghZ2djLT5saW5lcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGdiX2dwaW9faXJxX21hcCgpIC0gbWFwcyBhbiBJUlEgaW50byBhIEdCIGdwaW8gaXJxY2hpcAorICogQGQ6IHRoZSBpcnFkb21haW4gdXNlZCBieSB0aGlzIGlycWNoaXAKKyAqIEBpcnE6IHRoZSBnbG9iYWwgaXJxIG51bWJlciB1c2VkIGJ5IHRoaXMgR0IgZ3BpbyBpcnFjaGlwIGlycQorICogQGh3aXJxOiB0aGUgbG9jYWwgSVJRL0dQSU8gbGluZSBvZmZzZXQgb24gdGhpcyBHQiBncGlvCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHNldCB1cCB0aGUgbWFwcGluZyBmb3IgYSBjZXJ0YWluIElSUSBsaW5lIG9uIGEKKyAqIEdCIGdwaW8gYnkgYXNzaWduaW5nIHRoZSBHQiBncGlvIGFzIGNoaXAgZGF0YSwgYW5kIHVzaW5nIHRoZSBpcnFjaGlwCisgKiBzdG9yZWQgaW5zaWRlIHRoZSBHQiBncGlvLgorICovCitzdGF0aWMgaW50IGdiX2dwaW9faXJxX21hcChzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluLCB1bnNpZ25lZCBpbnQgaXJxLAorCQkJICAgaXJxX2h3X251bWJlcl90IGh3aXJxKQoreworCXN0cnVjdCBncGlvX2NoaXAgKmNoaXAgPSBkb21haW4tPmhvc3RfZGF0YTsKKwlzdHJ1Y3QgZ2JfZ3Bpb19jb250cm9sbGVyICpnZ2MgPSBncGlvX2NoaXBfdG9fZ2JfZ3Bpb19jb250cm9sbGVyKGNoaXApOworCisJaXJxX3NldF9jaGlwX2RhdGEoaXJxLCBnZ2MpOworCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpcnEsIGdnYy0+aXJxY2hpcCwgZ2djLT5pcnFfaGFuZGxlcik7CisJaXJxX3NldF9ub3Byb2JlKGlycSk7CisJLyoKKwkgKiBObyBzZXQtdXAgb2YgdGhlIGhhcmR3YXJlIHdpbGwgaGFwcGVuIGlmIElSUV9UWVBFX05PTkUKKwkgKiBpcyBwYXNzZWQgYXMgZGVmYXVsdCB0eXBlLgorCSAqLworCWlmIChnZ2MtPmlycV9kZWZhdWx0X3R5cGUgIT0gSVJRX1RZUEVfTk9ORSkKKwkJaXJxX3NldF9pcnFfdHlwZShpcnEsIGdnYy0+aXJxX2RlZmF1bHRfdHlwZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2JfZ3Bpb19pcnFfdW5tYXAoc3RydWN0IGlycV9kb21haW4gKmQsIHVuc2lnbmVkIGludCBpcnEpCit7CisJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGlycSwgTlVMTCwgTlVMTCk7CisJaXJxX3NldF9jaGlwX2RhdGEoaXJxLCBOVUxMKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpcnFfZG9tYWluX29wcyBnYl9ncGlvX2RvbWFpbl9vcHMgPSB7CisJLm1hcAk9IGdiX2dwaW9faXJxX21hcCwKKwkudW5tYXAJPSBnYl9ncGlvX2lycV91bm1hcCwKK307CisKKy8qKgorICogZ2JfZ3Bpb19pcnFjaGlwX3JlbW92ZSgpIC0gcmVtb3ZlcyBhbiBpcnFjaGlwIGFkZGVkIHRvIGEgZ2JfZ3Bpb19jb250cm9sbGVyCisgKiBAZ2djOiB0aGUgZ2JfZ3Bpb19jb250cm9sbGVyIHRvIHJlbW92ZSB0aGUgaXJxY2hpcCBmcm9tCisgKgorICogVGhpcyBpcyBjYWxsZWQgb25seSBmcm9tIGdiX2dwaW9fcmVtb3ZlKCkKKyAqLworc3RhdGljIHZvaWQgZ2JfZ3Bpb19pcnFjaGlwX3JlbW92ZShzdHJ1Y3QgZ2JfZ3Bpb19jb250cm9sbGVyICpnZ2MpCit7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKworCS8qIFJlbW92ZSBhbGwgSVJRIG1hcHBpbmdzIGFuZCBkZWxldGUgdGhlIGRvbWFpbiAqLworCWlmIChnZ2MtPmlycWRvbWFpbikgeworCQlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IChnZ2MtPmxpbmVfbWF4ICsgMSk7IG9mZnNldCsrKQorCQkJaXJxX2Rpc3Bvc2VfbWFwcGluZyhpcnFfZmluZF9tYXBwaW5nKGdnYy0+aXJxZG9tYWluLCBvZmZzZXQpKTsKKwkJaXJxX2RvbWFpbl9yZW1vdmUoZ2djLT5pcnFkb21haW4pOworCX0KKworCWlmIChnZ2MtPmlycWNoaXApCisJCWdnYy0+aXJxY2hpcCA9IE5VTEw7Cit9CisKKy8qKgorICogZ2JfZ3Bpb19pcnFjaGlwX2FkZCgpIC0gYWRkcyBhbiBpcnFjaGlwIHRvIGEgZ3BpbyBjaGlwCisgKiBAY2hpcDogdGhlIGdwaW8gY2hpcCB0byBhZGQgdGhlIGlycWNoaXAgdG8KKyAqIEBpcnFjaGlwOiB0aGUgaXJxY2hpcCB0byBhZGQgdG8gdGhlIGFkYXB0ZXIKKyAqIEBmaXJzdF9pcnE6IGlmIG5vdCBkeW5hbWljYWxseSBhc3NpZ25lZCwgdGhlIGJhc2UgKGZpcnN0KSBJUlEgdG8KKyAqIGFsbG9jYXRlIGdwaW8gaXJxcyBmcm9tCisgKiBAaGFuZGxlcjogdGhlIGlycSBoYW5kbGVyIHRvIHVzZSAob2Z0ZW4gYSBwcmVkZWZpbmVkIGlycSBjb3JlIGZ1bmN0aW9uKQorICogQHR5cGU6IHRoZSBkZWZhdWx0IHR5cGUgZm9yIElSUXMgb24gdGhpcyBpcnFjaGlwLCBwYXNzIElSUV9UWVBFX05PTkUKKyAqIHRvIGhhdmUgdGhlIGNvcmUgYXZvaWQgc2V0dGluZyB1cCBhbnkgZGVmYXVsdCB0eXBlIGluIHRoZSBoYXJkd2FyZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNsb3NlbHkgYXNzb2NpYXRlcyBhIGNlcnRhaW4gaXJxY2hpcCB3aXRoIGEgY2VydGFpbgorICogZ3BpbyBjaGlwLCBwcm92aWRpbmcgYW4gaXJxIGRvbWFpbiB0byB0cmFuc2xhdGUgdGhlIGxvY2FsIElSUXMgdG8KKyAqIGdsb2JhbCBpcnFzLCBhbmQgbWFraW5nIHN1cmUgdGhhdCB0aGUgZ3BpbyBjaGlwCisgKiBpcyBwYXNzZWQgYXMgY2hpcCBkYXRhIHRvIGFsbCByZWxhdGVkIGZ1bmN0aW9ucy4gRHJpdmVyIGNhbGxiYWNrcworICogbmVlZCB0byB1c2UgY29udGFpbmVyX29mKCkgdG8gZ2V0IHRoZWlyIGxvY2FsIHN0YXRlIGNvbnRhaW5lcnMgYmFjaworICogZnJvbSB0aGUgZ3BpbyBjaGlwIHBhc3NlZCBhcyBjaGlwIGRhdGEuIEFuIGlycWRvbWFpbiB3aWxsIGJlIHN0b3JlZAorICogaW4gdGhlIGdwaW8gY2hpcCB0aGF0IHNoYWxsIGJlIHVzZWQgYnkgdGhlIGRyaXZlciB0byBoYW5kbGUgSVJRIG51bWJlcgorICogdHJhbnNsYXRpb24uIFRoZSBncGlvIGNoaXAgd2lsbCBuZWVkIHRvIGJlIGluaXRpYWxpemVkIGFuZCByZWdpc3RlcmVkCisgKiBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgaW50IGdiX2dwaW9faXJxY2hpcF9hZGQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwkJCSBzdHJ1Y3QgaXJxX2NoaXAgKmlycWNoaXAsCisJCQkgdW5zaWduZWQgaW50IGZpcnN0X2lycSwKKwkJCSBpcnFfZmxvd19oYW5kbGVyX3QgaGFuZGxlciwKKwkJCSB1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgZ2JfZ3Bpb19jb250cm9sbGVyICpnZ2M7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwl1bnNpZ25lZCBpcnFfYmFzZTsKKworCWlmICghY2hpcCB8fCAhaXJxY2hpcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlnZ2MgPSBncGlvX2NoaXBfdG9fZ2JfZ3Bpb19jb250cm9sbGVyKGNoaXApOworCisJZ2djLT5pcnFjaGlwID0gaXJxY2hpcDsKKwlnZ2MtPmlycV9oYW5kbGVyID0gaGFuZGxlcjsKKwlnZ2MtPmlycV9kZWZhdWx0X3R5cGUgPSB0eXBlOworCWdnYy0+aXJxZG9tYWluID0gaXJxX2RvbWFpbl9hZGRfc2ltcGxlKE5VTEwsCisJCQkJCWdnYy0+bGluZV9tYXggKyAxLCBmaXJzdF9pcnEsCisJCQkJCSZnYl9ncGlvX2RvbWFpbl9vcHMsIGNoaXApOworCWlmICghZ2djLT5pcnFkb21haW4pIHsKKwkJZ2djLT5pcnFjaGlwID0gTlVMTDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBQcmVwYXJlIHRoZSBtYXBwaW5nIHNpbmNlIHRoZSBpcnFjaGlwIHNoYWxsIGJlIG9ydGhvZ29uYWwgdG8KKwkgKiBhbnkgZ3BpbyBjYWxscy4gSWYgdGhlIGZpcnN0X2lycSB3YXMgemVybywgdGhpcyBpcworCSAqIG5lY2Vzc2FyeSB0byBhbGxvY2F0ZSBkZXNjcmlwdG9ycyBmb3IgYWxsIElSUXMuCisJICovCisJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCAoZ2djLT5saW5lX21heCArIDEpOyBvZmZzZXQrKykgeworCQlpcnFfYmFzZSA9IGlycV9jcmVhdGVfbWFwcGluZyhnZ2MtPmlycWRvbWFpbiwgb2Zmc2V0KTsKKwkJaWYgKG9mZnNldCA9PSAwKQorCQkJZ2djLT5pcnFfYmFzZSA9IGlycV9iYXNlOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgZ2JfZ3Bpb19jb250cm9sbGVyICpnZ2MgPSBncGlvX2NoaXBfdG9fZ2JfZ3Bpb19jb250cm9sbGVyKGNoaXApOworCisJcmV0dXJuIGlycV9maW5kX21hcHBpbmcoZ2djLT5pcnFkb21haW4sIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbnQgZ2JfZ3Bpb19wcm9iZShzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXYsCisJCQkgY29uc3Qgc3RydWN0IGdicGh5X2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisJc3RydWN0IGdiX2dwaW9fY29udHJvbGxlciAqZ2djOworCXN0cnVjdCBncGlvX2NoaXAgKmdwaW87CisJc3RydWN0IGlycV9jaGlwICppcnFjOworCWludCByZXQ7CisKKwlnZ2MgPSBremFsbG9jKHNpemVvZigqZ2djKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFnZ2MpCisJCXJldHVybiAtRU5PTUVNOworCisJY29ubmVjdGlvbiA9IGdiX2Nvbm5lY3Rpb25fY3JlYXRlKGdicGh5X2Rldi0+YnVuZGxlLAorCQkJCQkgIGxlMTZfdG9fY3B1KGdicGh5X2Rldi0+Y3BvcnRfZGVzYy0+aWQpLAorCQkJCQkgIGdiX2dwaW9fcmVxdWVzdF9oYW5kbGVyKTsKKwlpZiAoSVNfRVJSKGNvbm5lY3Rpb24pKSB7CisJCXJldCA9IFBUUl9FUlIoY29ubmVjdGlvbik7CisJCWdvdG8gZXhpdF9nZ2NfZnJlZTsKKwl9CisKKwlnZ2MtPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCWdiX2Nvbm5lY3Rpb25fc2V0X2RhdGEoY29ubmVjdGlvbiwgZ2djKTsKKwlnZ2MtPmdicGh5X2RldiA9IGdicGh5X2RldjsKKwlnYl9nYnBoeV9zZXRfZGF0YShnYnBoeV9kZXYsIGdnYyk7CisKKwlyZXQgPSBnYl9jb25uZWN0aW9uX2VuYWJsZV90eChjb25uZWN0aW9uKTsKKwlpZiAocmV0KQorCQlnb3RvIGV4aXRfY29ubmVjdGlvbl9kZXN0cm95OworCisJcmV0ID0gZ2JfZ3Bpb19jb250cm9sbGVyX3NldHVwKGdnYyk7CisJaWYgKHJldCkKKwkJZ290byBleGl0X2Nvbm5lY3Rpb25fZGlzYWJsZTsKKworCWlycWMgPSAmZ2djLT5pcnFjOworCWlycWMtPmlycV9tYXNrID0gZ2JfZ3Bpb19pcnFfbWFzazsKKwlpcnFjLT5pcnFfdW5tYXNrID0gZ2JfZ3Bpb19pcnFfdW5tYXNrOworCWlycWMtPmlycV9zZXRfdHlwZSA9IGdiX2dwaW9faXJxX3NldF90eXBlOworCWlycWMtPmlycV9idXNfbG9jayA9IGdiX2dwaW9faXJxX2J1c19sb2NrOworCWlycWMtPmlycV9idXNfc3luY191bmxvY2sgPSBnYl9ncGlvX2lycV9idXNfc3luY191bmxvY2s7CisJaXJxYy0+bmFtZSA9ICJncmV5YnVzX2dwaW8iOworCisJbXV0ZXhfaW5pdCgmZ2djLT5pcnFfbG9jayk7CisKKwlncGlvID0gJmdnYy0+Y2hpcDsKKworCWdwaW8tPmxhYmVsID0gImdyZXlidXNfZ3BpbyI7CisJZ3Bpby0+cGFyZW50ID0gJmdicGh5X2Rldi0+ZGV2OworCWdwaW8tPm93bmVyID0gVEhJU19NT0RVTEU7CisKKwlncGlvLT5yZXF1ZXN0ID0gZ2JfZ3Bpb19yZXF1ZXN0OworCWdwaW8tPmZyZWUgPSBnYl9ncGlvX2ZyZWU7CisJZ3Bpby0+Z2V0X2RpcmVjdGlvbiA9IGdiX2dwaW9fZ2V0X2RpcmVjdGlvbjsKKwlncGlvLT5kaXJlY3Rpb25faW5wdXQgPSBnYl9ncGlvX2RpcmVjdGlvbl9pbnB1dDsKKwlncGlvLT5kaXJlY3Rpb25fb3V0cHV0ID0gZ2JfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0OworCWdwaW8tPmdldCA9IGdiX2dwaW9fZ2V0OworCWdwaW8tPnNldCA9IGdiX2dwaW9fc2V0OworCWdwaW8tPnNldF9kZWJvdW5jZSA9IGdiX2dwaW9fc2V0X2RlYm91bmNlOworCWdwaW8tPnRvX2lycSA9IGdiX2dwaW9fdG9faXJxOworCWdwaW8tPmJhc2UgPSAtMTsJCS8qIEFsbG9jYXRlIGJhc2UgZHluYW1pY2FsbHkgKi8KKwlncGlvLT5uZ3BpbyA9IGdnYy0+bGluZV9tYXggKyAxOworCWdwaW8tPmNhbl9zbGVlcCA9IHRydWU7CisKKwlyZXQgPSBnYl9jb25uZWN0aW9uX2VuYWJsZShjb25uZWN0aW9uKTsKKwlpZiAocmV0KQorCQlnb3RvIGV4aXRfbGluZV9mcmVlOworCisJcmV0ID0gZ2JfZ3Bpb19pcnFjaGlwX2FkZChncGlvLCBpcnFjLCAwLAorCQkJCSAgIGhhbmRsZV9sZXZlbF9pcnEsIElSUV9UWVBFX05PTkUpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsCisJCQkiZmFpbGVkIHRvIGFkZCBpcnEgY2hpcDogJWRcbiIsIHJldCk7CisJCWdvdG8gZXhpdF9saW5lX2ZyZWU7CisJfQorCisJcmV0ID0gZ3Bpb2NoaXBfYWRkKGdwaW8pOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsCisJCQkiZmFpbGVkIHRvIGFkZCBncGlvIGNoaXA6ICVkXG4iLCByZXQpOworCQlnb3RvIGV4aXRfZ3Bpb19pcnFjaGlwX3JlbW92ZTsKKwl9CisKKwlnYnBoeV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChnYnBoeV9kZXYpOworCXJldHVybiAwOworCitleGl0X2dwaW9faXJxY2hpcF9yZW1vdmU6CisJZ2JfZ3Bpb19pcnFjaGlwX3JlbW92ZShnZ2MpOworZXhpdF9saW5lX2ZyZWU6CisJa2ZyZWUoZ2djLT5saW5lcyk7CitleGl0X2Nvbm5lY3Rpb25fZGlzYWJsZToKKwlnYl9jb25uZWN0aW9uX2Rpc2FibGUoY29ubmVjdGlvbik7CitleGl0X2Nvbm5lY3Rpb25fZGVzdHJveToKKwlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koY29ubmVjdGlvbik7CitleGl0X2dnY19mcmVlOgorCWtmcmVlKGdnYyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZ2JfZ3Bpb19yZW1vdmUoc3RydWN0IGdicGh5X2RldmljZSAqZ2JwaHlfZGV2KQoreworCXN0cnVjdCBnYl9ncGlvX2NvbnRyb2xsZXIgKmdnYyA9IGdiX2dicGh5X2dldF9kYXRhKGdicGh5X2Rldik7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBnZ2MtPmNvbm5lY3Rpb247CisJaW50IHJldDsKKworCXJldCA9IGdicGh5X3J1bnRpbWVfZ2V0X3N5bmMoZ2JwaHlfZGV2KTsKKwlpZiAocmV0KQorCQlnYnBoeV9ydW50aW1lX2dldF9ub3Jlc3VtZShnYnBoeV9kZXYpOworCisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlX3J4KGNvbm5lY3Rpb24pOworCWdwaW9jaGlwX3JlbW92ZSgmZ2djLT5jaGlwKTsKKwlnYl9ncGlvX2lycWNoaXBfcmVtb3ZlKGdnYyk7CisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGNvbm5lY3Rpb24pOworCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShjb25uZWN0aW9uKTsKKwlrZnJlZShnZ2MtPmxpbmVzKTsKKwlrZnJlZShnZ2MpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGdicGh5X2RldmljZV9pZCBnYl9ncGlvX2lkX3RhYmxlW10gPSB7CisJeyBHQlBIWV9QUk9UT0NPTChHUkVZQlVTX1BST1RPQ09MX0dQSU8pIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoZ2JwaHksIGdiX2dwaW9faWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGdicGh5X2RyaXZlciBncGlvX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiZ3BpbyIsCisJLnByb2JlCQk9IGdiX2dwaW9fcHJvYmUsCisJLnJlbW92ZQkJPSBnYl9ncGlvX3JlbW92ZSwKKwkuaWRfdGFibGUJPSBnYl9ncGlvX2lkX3RhYmxlLAorfTsKKworbW9kdWxlX2dicGh5X2RyaXZlcihncGlvX2RyaXZlcik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9ncmV5YnVzLmggYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9ncmV5YnVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI1MjY4OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2dyZXlidXMuaApAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIEdyZXlidXMgZHJpdmVyIGFuZCBkZXZpY2UgQVBJCisgKgorICogQ29weXJpZ2h0IDIwMTQtMjAxNSBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTQtMjAxNSBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpZm5kZWYgX19MSU5VWF9HUkVZQlVTX0gKKyNkZWZpbmUgX19MSU5VWF9HUkVZQlVTX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CisKKyNpbmNsdWRlICJncmV5YnVzX2lkLmgiCisjaW5jbHVkZSAiZ3JleWJ1c19tYW5pZmVzdC5oIgorI2luY2x1ZGUgImdyZXlidXNfcHJvdG9jb2xzLmgiCisjaW5jbHVkZSAibWFuaWZlc3QuaCIKKyNpbmNsdWRlICJoZC5oIgorI2luY2x1ZGUgInN2Yy5oIgorI2luY2x1ZGUgImNvbnRyb2wuaCIKKyNpbmNsdWRlICJtb2R1bGUuaCIKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJidW5kbGUuaCIKKyNpbmNsdWRlICJjb25uZWN0aW9uLmgiCisjaW5jbHVkZSAib3BlcmF0aW9uLmgiCisjaW5jbHVkZSAidGltZXN5bmMuaCIKKworLyogTWF0Y2hlcyB1cCB3aXRoIHRoZSBHcmV5YnVzIFByb3RvY29sIHNwZWNpZmljYXRpb24gZG9jdW1lbnQgKi8KKyNkZWZpbmUgR1JFWUJVU19WRVJTSU9OX01BSk9SCTB4MDAKKyNkZWZpbmUgR1JFWUJVU19WRVJTSU9OX01JTk9SCTB4MDEKKworI2RlZmluZSBHUkVZQlVTX0lEX01BVENIX0RFVklDRSBcCisJKEdSRVlCVVNfSURfTUFUQ0hfVkVORE9SIHwgR1JFWUJVU19JRF9NQVRDSF9QUk9EVUNUKQorCisjZGVmaW5lIEdSRVlCVVNfREVWSUNFKHYsIHApCQkJCQlcCisJLm1hdGNoX2ZsYWdzCT0gR1JFWUJVU19JRF9NQVRDSF9ERVZJQ0UsCQlcCisJLnZlbmRvcgkJPSAodiksCQkJCQlcCisJLnByb2R1Y3QJPSAocCksCisKKyNkZWZpbmUgR1JFWUJVU19ERVZJQ0VfQ0xBU1MoYykJCQkJCVwKKwkubWF0Y2hfZmxhZ3MJPSBHUkVZQlVTX0lEX01BVENIX0NMQVNTLAkJXAorCS5jbGFzcwkJPSAoYyksCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIENQb3J0cyAqLworI2RlZmluZSBDUE9SVF9JRF9NQVgJNDA5NQkJLyogVW5pUHJvIG1heCBpZCBpcyA0MDk1ICovCisjZGVmaW5lIENQT1JUX0lEX0JBRAlVMTZfTUFYCisKK3N0cnVjdCBncmV5YnVzX2RyaXZlciB7CisJY29uc3QgY2hhciAqbmFtZTsKKworCWludCAoKnByb2JlKShzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUsCisJCSAgICAgY29uc3Qgc3RydWN0IGdyZXlidXNfYnVuZGxlX2lkICppZCk7CisJdm9pZCAoKmRpc2Nvbm5lY3QpKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSk7CisKKwljb25zdCBzdHJ1Y3QgZ3JleWJ1c19idW5kbGVfaWQgKmlkX3RhYmxlOworCisJc3RydWN0IGRldmljZV9kcml2ZXIgZHJpdmVyOworfTsKKyNkZWZpbmUgdG9fZ3JleWJ1c19kcml2ZXIoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBncmV5YnVzX2RyaXZlciwgZHJpdmVyKQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ3JleWJ1c19zZXRfZHJ2ZGF0YShzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUsIHZvaWQgKmRhdGEpCit7CisJZGV2X3NldF9kcnZkYXRhKCZidW5kbGUtPmRldiwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqZ3JleWJ1c19nZXRfZHJ2ZGF0YShzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUpCit7CisJcmV0dXJuIGRldl9nZXRfZHJ2ZGF0YSgmYnVuZGxlLT5kZXYpOworfQorCisvKiBEb24ndCBjYWxsIHRoZXNlIGRpcmVjdGx5LCB1c2UgdGhlIG1vZHVsZV9ncmV5YnVzX2RyaXZlcigpIG1hY3JvIGluc3RlYWQgKi8KK2ludCBncmV5YnVzX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgZ3JleWJ1c19kcml2ZXIgKmRyaXZlciwKKwkJCSAgICBzdHJ1Y3QgbW9kdWxlICptb2R1bGUsIGNvbnN0IGNoYXIgKm1vZF9uYW1lKTsKK3ZvaWQgZ3JleWJ1c19kZXJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgZ3JleWJ1c19kcml2ZXIgKmRyaXZlcik7CisKKy8qIGRlZmluZSB0byBnZXQgcHJvcGVyIFRISVNfTU9EVUxFIGFuZCBLQlVJTERfTU9ETkFNRSB2YWx1ZXMgKi8KKyNkZWZpbmUgZ3JleWJ1c19yZWdpc3Rlcihkcml2ZXIpIFwKKwlncmV5YnVzX3JlZ2lzdGVyX2RyaXZlcihkcml2ZXIsIFRISVNfTU9EVUxFLCBLQlVJTERfTU9ETkFNRSkKKyNkZWZpbmUgZ3JleWJ1c19kZXJlZ2lzdGVyKGRyaXZlcikgXAorCWdyZXlidXNfZGVyZWdpc3Rlcl9kcml2ZXIoZHJpdmVyKQorCisvKioKKyAqIG1vZHVsZV9ncmV5YnVzX2RyaXZlcigpIC0gSGVscGVyIG1hY3JvIGZvciByZWdpc3RlcmluZyBhIEdyZXlidXMgZHJpdmVyCisgKiBAX19ncmV5YnVzX2RyaXZlcjogZ3JleWJ1c19kcml2ZXIgc3RydWN0dXJlCisgKgorICogSGVscGVyIG1hY3JvIGZvciBHcmV5YnVzIGRyaXZlcnMgdG8gc2V0IHVwIHByb3BlciBtb2R1bGUgaW5pdCAvIGV4aXQKKyAqIGZ1bmN0aW9ucy4gIFJlcGxhY2VzIG1vZHVsZV9pbml0KCkgYW5kIG1vZHVsZV9leGl0KCkgYW5kIGtlZXBzIHBlb3BsZSBmcm9tCisgKiBwcmludGluZyBwb2ludGxlc3MgdGhpbmdzIHRvIHRoZSBrZXJuZWwgbG9nIHdoZW4gdGhlaXIgZHJpdmVyIGlzIGxvYWRlZC4KKyAqLworI2RlZmluZSBtb2R1bGVfZ3JleWJ1c19kcml2ZXIoX19ncmV5YnVzX2RyaXZlcikJXAorCW1vZHVsZV9kcml2ZXIoX19ncmV5YnVzX2RyaXZlciwgZ3JleWJ1c19yZWdpc3RlciwgZ3JleWJ1c19kZXJlZ2lzdGVyKQorCitpbnQgZ3JleWJ1c19kaXNhYmxlZCh2b2lkKTsKKwordm9pZCBnYl9kZWJ1Z2ZzX2luaXQodm9pZCk7Cit2b2lkIGdiX2RlYnVnZnNfY2xlYW51cCh2b2lkKTsKK3N0cnVjdCBkZW50cnkgKmdiX2RlYnVnZnNfZ2V0KHZvaWQpOworCitleHRlcm4gc3RydWN0IGJ1c190eXBlIGdyZXlidXNfYnVzX3R5cGU7CisKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX3R5cGUgZ3JleWJ1c19oZF90eXBlOworZXh0ZXJuIHN0cnVjdCBkZXZpY2VfdHlwZSBncmV5YnVzX21vZHVsZV90eXBlOworZXh0ZXJuIHN0cnVjdCBkZXZpY2VfdHlwZSBncmV5YnVzX2ludGVyZmFjZV90eXBlOworZXh0ZXJuIHN0cnVjdCBkZXZpY2VfdHlwZSBncmV5YnVzX2NvbnRyb2xfdHlwZTsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX3R5cGUgZ3JleWJ1c19idW5kbGVfdHlwZTsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX3R5cGUgZ3JleWJ1c19zdmNfdHlwZTsKKworc3RhdGljIGlubGluZSBpbnQgaXNfZ2JfaG9zdF9kZXZpY2UoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBkZXYtPnR5cGUgPT0gJmdyZXlidXNfaGRfdHlwZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfZ2JfbW9kdWxlKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGV2LT50eXBlID09ICZncmV5YnVzX21vZHVsZV90eXBlOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19nYl9pbnRlcmZhY2UoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBkZXYtPnR5cGUgPT0gJmdyZXlidXNfaW50ZXJmYWNlX3R5cGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2diX2NvbnRyb2woY29uc3Qgc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBkZXYtPnR5cGUgPT0gJmdyZXlidXNfY29udHJvbF90eXBlOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19nYl9idW5kbGUoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBkZXYtPnR5cGUgPT0gJmdyZXlidXNfYnVuZGxlX3R5cGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2diX3N2Yyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldi0+dHlwZSA9PSAmZ3JleWJ1c19zdmNfdHlwZTsKK30KKworc3RhdGljIGlubGluZSBib29sIGNwb3J0X2lkX3ZhbGlkKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHUxNiBjcG9ydF9pZCkKK3sKKwlyZXR1cm4gY3BvcnRfaWQgIT0gQ1BPUlRfSURfQkFEICYmIGNwb3J0X2lkIDwgaGQtPm51bV9jcG9ydHM7Cit9CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX19MSU5VWF9HUkVZQlVTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2dyZXlidXNfYXV0aGVudGljYXRpb24uaCBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2dyZXlidXNfYXV0aGVudGljYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Nzg0ZWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZ3JleWJ1c19hdXRoZW50aWNhdGlvbi5oCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogR3JleWJ1cyBDb21wb25lbnQgQXV0aGVudGljYXRpb24gVXNlciBIZWFkZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAxNiBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0KGMpIDIwMTYgTGluYXJvIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0KGMpIDIwMTYgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodChjKSAyMDE2IExpbmFybyBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gb3IgTGluYXJvIEx0ZC4gbm9yIHRoZSBuYW1lcyBvZgorICogICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgR09PR0xFIElOQy4gT1IKKyAqIExJTkFSTyBMVEQuIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX19HUkVZQlVTX0FVVEhFTlRJQ0FUSU9OX1VTRVJfSAorI2RlZmluZSBfX0dSRVlCVVNfQVVUSEVOVElDQVRJT05fVVNFUl9ICisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgQ0FQX0NFUlRJRklDQVRFX01BWF9TSVpFCTE2MDAKKyNkZWZpbmUgQ0FQX1NJR05BVFVSRV9NQVhfU0laRQkJMzIwCisKKy8qIENlcnRpZmljYXRlIGNsYXNzIHR5cGVzICovCisjZGVmaW5lIENBUF9DRVJUX0lNU19FQVBDCQkweDAwMDAwMDAxCisjZGVmaW5lIENBUF9DRVJUX0lNU19FQVNDCQkweDAwMDAwMDAyCisjZGVmaW5lIENBUF9DRVJUX0lNU19FQVJDCQkweDAwMDAwMDAzCisjZGVmaW5lIENBUF9DRVJUX0lNU19JQVBDCQkweDAwMDAwMDA0CisjZGVmaW5lIENBUF9DRVJUX0lNU19JQVNDCQkweDAwMDAwMDA1CisjZGVmaW5lIENBUF9DRVJUX0lNU19JQVJDCQkweDAwMDAwMDA2CisKKy8qIElNUyBDZXJ0aWZpY2F0ZSByZXNwb25zZSByZXN1bHQgY29kZXMgKi8KKyNkZWZpbmUgQ0FQX0lNU19SRVNVTFRfQ0VSVF9GT1VORAkweDAwCisjZGVmaW5lIENBUF9JTVNfUkVTVUxUX0NFUlRfQ0xBU1NfSU5WQUwJMHgwMQorI2RlZmluZSBDQVBfSU1TX1JFU1VMVF9DRVJUX0NPUlJVUFQJMHgwMgorI2RlZmluZSBDQVBfSU1TX1JFU1VMVF9DRVJUX05PVF9GT1VORAkweDAzCisKKy8qIEF1dGhlbnRpY2F0aW9uIHR5cGVzICovCisjZGVmaW5lIENBUF9BVVRIX0lNU19QUkkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQ0FQX0FVVEhfSU1TX1NFQwkJMHgwMDAwMDAwMgorI2RlZmluZSBDQVBfQVVUSF9JTVNfUlNBCQkweDAwMDAwMDAzCisKKy8qIEF1dGhlbnRpY2F0ZSByZXNwb25zZSByZXN1bHQgY29kZXMgKi8KKyNkZWZpbmUgQ0FQX0FVVEhfUkVTVUxUX0NSX1NVQ0NFU1MJMHgwMAorI2RlZmluZSBDQVBfQVVUSF9SRVNVTFRfQ1JfQkFEX1RZUEUJMHgwMQorI2RlZmluZSBDQVBfQVVUSF9SRVNVTFRfQ1JfV1JPTkdfRVAJMHgwMgorI2RlZmluZSBDQVBfQVVUSF9SRVNVTFRfQ1JfTk9fS0VZCTB4MDMKKyNkZWZpbmUgQ0FQX0FVVEhfUkVTVUxUX0NSX1NJR19GQUlMCTB4MDQKKworCisvKiBJT0NUTCBzdXBwb3J0ICovCitzdHJ1Y3QgY2FwX2lvY19nZXRfZW5kcG9pbnRfdWlkIHsKKwlfX3U4CQkJdWlkWzhdOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCitzdHJ1Y3QgY2FwX2lvY19nZXRfaW1zX2NlcnRpZmljYXRlIHsKKwlfX3UzMgkJCWNlcnRpZmljYXRlX2NsYXNzOworCV9fdTMyCQkJY2VydGlmaWNhdGVfaWQ7CisKKwlfX3U4CQkJcmVzdWx0X2NvZGU7CisJX191MzIJCQljZXJ0X3NpemU7CisJX191OAkJCWNlcnRpZmljYXRlW0NBUF9DRVJUSUZJQ0FURV9NQVhfU0laRV07Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBjYXBfaW9jX2F1dGhlbnRpY2F0ZSB7CisJX191MzIJCQlhdXRoX3R5cGU7CisJX191OAkJCXVpZFs4XTsKKwlfX3U4CQkJY2hhbGxlbmdlWzMyXTsKKworCV9fdTgJCQlyZXN1bHRfY29kZTsKKwlfX3U4CQkJcmVzcG9uc2VbNjRdOworCV9fdTMyCQkJc2lnbmF0dXJlX3NpemU7CisJX191OAkJCXNpZ25hdHVyZVtDQVBfU0lHTkFUVVJFX01BWF9TSVpFXTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworI2RlZmluZSBDQVBfSU9DVExfQkFTRQkJCSdDJworI2RlZmluZSBDQVBfSU9DX0dFVF9FTkRQT0lOVF9VSUQJX0lPUihDQVBfSU9DVExfQkFTRSwgMCwgc3RydWN0IGNhcF9pb2NfZ2V0X2VuZHBvaW50X3VpZCkKKyNkZWZpbmUgQ0FQX0lPQ19HRVRfSU1TX0NFUlRJRklDQVRFCV9JT1dSKENBUF9JT0NUTF9CQVNFLCAxLCBzdHJ1Y3QgY2FwX2lvY19nZXRfaW1zX2NlcnRpZmljYXRlKQorI2RlZmluZSBDQVBfSU9DX0FVVEhFTlRJQ0FURQkJX0lPV1IoQ0FQX0lPQ1RMX0JBU0UsIDIsIHN0cnVjdCBjYXBfaW9jX2F1dGhlbnRpY2F0ZSkKKworI2VuZGlmIC8qIF9fR1JFWUJVU19BVVRIRU5USUNBVElPTl9VU0VSX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2dyZXlidXNfZmlybXdhcmUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2dyZXlidXNfZmlybXdhcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzdhMmFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZ3JleWJ1c19maXJtd2FyZS5oCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogR3JleWJ1cyBGaXJtd2FyZSBNYW5hZ2VtZW50IFVzZXIgSGVhZGVyCisgKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMTYgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodChjKSAyMDE2IExpbmFybyBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDE2IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQoYykgMjAxNiBMaW5hcm8gTHRkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKiAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG9yIExpbmFybyBMdGQuIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEdPT0dMRSBJTkMuIE9SCisgKiBMSU5BUk8gTFRELiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9fR1JFWUJVU19GSVJNV0FSRV9VU0VSX0gKKyNkZWZpbmUgX19HUkVZQlVTX0ZJUk1XQVJFX1VTRVJfSAorCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIEdCX0ZJUk1XQVJFX1VfVEFHX01BWF9TSVpFCQkxMAorCisjZGVmaW5lIEdCX0ZXX1VfTE9BRF9NRVRIT0RfVU5JUFJPCQkweDAxCisjZGVmaW5lIEdCX0ZXX1VfTE9BRF9NRVRIT0RfSU5URVJOQUwJCTB4MDIKKworI2RlZmluZSBHQl9GV19VX0xPQURfU1RBVFVTX0ZBSUxFRAkJMHgwMAorI2RlZmluZSBHQl9GV19VX0xPQURfU1RBVFVTX1VOVkFMSURBVEVECQkweDAxCisjZGVmaW5lIEdCX0ZXX1VfTE9BRF9TVEFUVVNfVkFMSURBVEVECQkweDAyCisjZGVmaW5lIEdCX0ZXX1VfTE9BRF9TVEFUVVNfVkFMSURBVElPTl9GQUlMRUQJMHgwMworCisjZGVmaW5lIEdCX0ZXX1VfQkFDS0VORF9GV19TVEFUVVNfU1VDQ0VTUwkweDAxCisjZGVmaW5lIEdCX0ZXX1VfQkFDS0VORF9GV19TVEFUVVNfRkFJTF9GSU5ECTB4MDIKKyNkZWZpbmUgR0JfRldfVV9CQUNLRU5EX0ZXX1NUQVRVU19GQUlMX0ZFVENICTB4MDMKKyNkZWZpbmUgR0JfRldfVV9CQUNLRU5EX0ZXX1NUQVRVU19GQUlMX1dSSVRFCTB4MDQKKyNkZWZpbmUgR0JfRldfVV9CQUNLRU5EX0ZXX1NUQVRVU19JTlQJCTB4MDUKKyNkZWZpbmUgR0JfRldfVV9CQUNLRU5EX0ZXX1NUQVRVU19SRVRSWQkJMHgwNgorI2RlZmluZSBHQl9GV19VX0JBQ0tFTkRfRldfU1RBVFVTX05PVF9TVVBQT1JURUQJMHgwNworCisjZGVmaW5lIEdCX0ZXX1VfQkFDS0VORF9WRVJTSU9OX1NUQVRVU19TVUNDRVNTCQkweDAxCisjZGVmaW5lIEdCX0ZXX1VfQkFDS0VORF9WRVJTSU9OX1NUQVRVU19OT1RfQVZBSUxBQkxFCTB4MDIKKyNkZWZpbmUgR0JfRldfVV9CQUNLRU5EX1ZFUlNJT05fU1RBVFVTX05PVF9TVVBQT1JURUQJMHgwMworI2RlZmluZSBHQl9GV19VX0JBQ0tFTkRfVkVSU0lPTl9TVEFUVVNfUkVUUlkJCTB4MDQKKyNkZWZpbmUgR0JfRldfVV9CQUNLRU5EX1ZFUlNJT05fU1RBVFVTX0ZBSUxfSU5UCQkweDA1CisKKy8qIElPQ1RMIHN1cHBvcnQgKi8KK3N0cnVjdCBmd19tZ210X2lvY19nZXRfaW50Zl92ZXJzaW9uIHsKKwlfX3U4IGZpcm13YXJlX3RhZ1tHQl9GSVJNV0FSRV9VX1RBR19NQVhfU0laRV07CisJX191MTYgbWFqb3I7CisJX191MTYgbWlub3I7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBmd19tZ210X2lvY19nZXRfYmFja2VuZF92ZXJzaW9uIHsKKwlfX3U4IGZpcm13YXJlX3RhZ1tHQl9GSVJNV0FSRV9VX1RBR19NQVhfU0laRV07CisJX191MTYgbWFqb3I7CisJX191MTYgbWlub3I7CisJX191OCBzdGF0dXM7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBmd19tZ210X2lvY19pbnRmX2xvYWRfYW5kX3ZhbGlkYXRlIHsKKwlfX3U4IGZpcm13YXJlX3RhZ1tHQl9GSVJNV0FSRV9VX1RBR19NQVhfU0laRV07CisJX191OCBsb2FkX21ldGhvZDsKKwlfX3U4IHN0YXR1czsKKwlfX3UxNiBtYWpvcjsKKwlfX3UxNiBtaW5vcjsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKworc3RydWN0IGZ3X21nbXRfaW9jX2JhY2tlbmRfZndfdXBkYXRlIHsKKwlfX3U4IGZpcm13YXJlX3RhZ1tHQl9GSVJNV0FSRV9VX1RBR19NQVhfU0laRV07CisJX191OCBzdGF0dXM7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKKyNkZWZpbmUgRldfTUdNVF9JT0NUTF9CQVNFCQkJJ0YnCisjZGVmaW5lIEZXX01HTVRfSU9DX0dFVF9JTlRGX0ZXCQkJX0lPUihGV19NR01UX0lPQ1RMX0JBU0UsIDAsIHN0cnVjdCBmd19tZ210X2lvY19nZXRfaW50Zl92ZXJzaW9uKQorI2RlZmluZSBGV19NR01UX0lPQ19HRVRfQkFDS0VORF9GVwkJX0lPV1IoRldfTUdNVF9JT0NUTF9CQVNFLCAxLCBzdHJ1Y3QgZndfbWdtdF9pb2NfZ2V0X2JhY2tlbmRfdmVyc2lvbikKKyNkZWZpbmUgRldfTUdNVF9JT0NfSU5URl9MT0FEX0FORF9WQUxJREFURQlfSU9XUihGV19NR01UX0lPQ1RMX0JBU0UsIDIsIHN0cnVjdCBmd19tZ210X2lvY19pbnRmX2xvYWRfYW5kX3ZhbGlkYXRlKQorI2RlZmluZSBGV19NR01UX0lPQ19JTlRGX0JBQ0tFTkRfRldfVVBEQVRFCV9JT1dSKEZXX01HTVRfSU9DVExfQkFTRSwgMywgc3RydWN0IGZ3X21nbXRfaW9jX2JhY2tlbmRfZndfdXBkYXRlKQorI2RlZmluZSBGV19NR01UX0lPQ19TRVRfVElNRU9VVF9NUwkJX0lPVyhGV19NR01UX0lPQ1RMX0JBU0UsIDQsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgRldfTUdNVF9JT0NfTU9ERV9TV0lUQ0gJCQlfSU8oRldfTUdNVF9JT0NUTF9CQVNFLCA1KQorCisjZW5kaWYgLyogX19HUkVZQlVTX0ZJUk1XQVJFX1VTRVJfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9ncmV5YnVzX2lkLmggYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9ncmV5YnVzX2lkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJiMWZjMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2dyZXlidXNfaWQuaApAQCAtMCwwICsxLDI2IEBACisvKiBGSVhNRQorICogbW92ZSB0aGlzIHRvIGluY2x1ZGUvbGludXgvbW9kX2RldmljZXRhYmxlLmggd2hlbiBtZXJnaW5nCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX0dSRVlCVVNfSURfSAorI2RlZmluZSBfX0xJTlVYX0dSRVlCVVNfSURfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KKworCitzdHJ1Y3QgZ3JleWJ1c19idW5kbGVfaWQgeworCV9fdTE2CW1hdGNoX2ZsYWdzOworCV9fdTMyCXZlbmRvcjsKKwlfX3UzMglwcm9kdWN0OworCV9fdTgJY2xhc3M7CisKKwlrZXJuZWxfdWxvbmdfdAlkcml2ZXJfaW5mbyBfX2FsaWduZWQoc2l6ZW9mKGtlcm5lbF91bG9uZ190KSk7Cit9OworCisvKiBVc2VkIHRvIG1hdGNoIHRoZSBncmV5YnVzX2J1bmRsZV9pZCAqLworI2RlZmluZSBHUkVZQlVTX0lEX01BVENIX1ZFTkRPUgkJQklUKDApCisjZGVmaW5lIEdSRVlCVVNfSURfTUFUQ0hfUFJPRFVDVAlCSVQoMSkKKyNkZWZpbmUgR1JFWUJVU19JRF9NQVRDSF9DTEFTUwkJQklUKDIpCisKKyNlbmRpZiAvKiBfX0xJTlVYX0dSRVlCVVNfSURfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZ3JleWJ1c19tYW5pZmVzdC5oIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZ3JleWJ1c19tYW5pZmVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMzU5NDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9ncmV5YnVzX21hbmlmZXN0LmgKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBHcmV5YnVzIG1hbmlmZXN0IGRlZmluaXRpb24KKyAqCisgKiBTZWUgIkdyZXlidXMgQXBwbGljYXRpb24gUHJvdG9jb2wiIGRvY3VtZW50ICh2ZXJzaW9uIDAuMSkgZm9yCisgKiBkZXRhaWxzIG9uIHRoZXNlIHZhbHVlcyBhbmQgc3RydWN0dXJlcy4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE1IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE1IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIGFuZCBCU0QgbGljZW5zZXMuCisgKi8KKworI2lmbmRlZiBfX0dSRVlCVVNfTUFOSUZFU1RfSAorI2RlZmluZSBfX0dSRVlCVVNfTUFOSUZFU1RfSAorCitlbnVtIGdyZXlidXNfZGVzY3JpcHRvcl90eXBlIHsKKwlHUkVZQlVTX1RZUEVfSU5WQUxJRAkJPSAweDAwLAorCUdSRVlCVVNfVFlQRV9JTlRFUkZBQ0UJCT0gMHgwMSwKKwlHUkVZQlVTX1RZUEVfU1RSSU5HCQk9IDB4MDIsCisJR1JFWUJVU19UWVBFX0JVTkRMRQkJPSAweDAzLAorCUdSRVlCVVNfVFlQRV9DUE9SVAkJPSAweDA0LAorfTsKKworZW51bSBncmV5YnVzX3Byb3RvY29sIHsKKwlHUkVZQlVTX1BST1RPQ09MX0NPTlRST0wJPSAweDAwLAorCS8qIDB4MDEgaXMgdW51c2VkICovCisJR1JFWUJVU19QUk9UT0NPTF9HUElPCQk9IDB4MDIsCisJR1JFWUJVU19QUk9UT0NPTF9JMkMJCT0gMHgwMywKKwlHUkVZQlVTX1BST1RPQ09MX1VBUlQJCT0gMHgwNCwKKwlHUkVZQlVTX1BST1RPQ09MX0hJRAkJPSAweDA1LAorCUdSRVlCVVNfUFJPVE9DT0xfVVNCCQk9IDB4MDYsCisJR1JFWUJVU19QUk9UT0NPTF9TRElPCQk9IDB4MDcsCisJR1JFWUJVU19QUk9UT0NPTF9QT1dFUl9TVVBQTFkJPSAweDA4LAorCUdSRVlCVVNfUFJPVE9DT0xfUFdNCQk9IDB4MDksCisJLyogMHgwYSBpcyB1bnVzZWQgKi8KKwlHUkVZQlVTX1BST1RPQ09MX1NQSQkJPSAweDBiLAorCUdSRVlCVVNfUFJPVE9DT0xfRElTUExBWQk9IDB4MGMsCisJR1JFWUJVU19QUk9UT0NPTF9DQU1FUkFfTUdNVAk9IDB4MGQsCisJR1JFWUJVU19QUk9UT0NPTF9TRU5TT1IJCT0gMHgwZSwKKwlHUkVZQlVTX1BST1RPQ09MX0xJR0hUUwkJPSAweDBmLAorCUdSRVlCVVNfUFJPVE9DT0xfVklCUkFUT1IJPSAweDEwLAorCUdSRVlCVVNfUFJPVE9DT0xfTE9PUEJBQ0sJPSAweDExLAorCUdSRVlCVVNfUFJPVE9DT0xfQVVESU9fTUdNVAk9IDB4MTIsCisJR1JFWUJVU19QUk9UT0NPTF9BVURJT19EQVRBCT0gMHgxMywKKwlHUkVZQlVTX1BST1RPQ09MX1NWQyAgICAgICAgICAgID0gMHgxNCwKKwlHUkVZQlVTX1BST1RPQ09MX0JPT1RST00JPSAweDE1LAorCUdSRVlCVVNfUFJPVE9DT0xfQ0FNRVJBX0RBVEEJPSAweDE2LAorCUdSRVlCVVNfUFJPVE9DT0xfRldfRE9XTkxPQUQJPSAweDE3LAorCUdSRVlCVVNfUFJPVE9DT0xfRldfTUFOQUdFTUVOVAk9IDB4MTgsCisJR1JFWUJVU19QUk9UT0NPTF9BVVRIRU5USUNBVElPTgk9IDB4MTksCisJR1JFWUJVU19QUk9UT0NPTF9MT0cJCT0gMHgxYSwKKwkJLyogLi4uICovCisJR1JFWUJVU19QUk9UT0NPTF9SQVcJCT0gMHhmZSwKKwlHUkVZQlVTX1BST1RPQ09MX1ZFTkRPUgkJPSAweGZmLAorfTsKKworZW51bSBncmV5YnVzX2NsYXNzX3R5cGUgeworCUdSRVlCVVNfQ0xBU1NfQ09OVFJPTAkJPSAweDAwLAorCS8qIDB4MDEgaXMgdW51c2VkICovCisJLyogMHgwMiBpcyB1bnVzZWQgKi8KKwkvKiAweDAzIGlzIHVudXNlZCAqLworCS8qIDB4MDQgaXMgdW51c2VkICovCisJR1JFWUJVU19DTEFTU19ISUQJCT0gMHgwNSwKKwkvKiAweDA2IGlzIHVudXNlZCAqLworCS8qIDB4MDcgaXMgdW51c2VkICovCisJR1JFWUJVU19DTEFTU19QT1dFUl9TVVBQTFkJPSAweDA4LAorCS8qIDB4MDkgaXMgdW51c2VkICovCisJR1JFWUJVU19DTEFTU19CUklER0VEX1BIWQk9IDB4MGEsCisJLyogMHgwYiBpcyB1bnVzZWQgKi8KKwlHUkVZQlVTX0NMQVNTX0RJU1BMQVkJCT0gMHgwYywKKwlHUkVZQlVTX0NMQVNTX0NBTUVSQQkJPSAweDBkLAorCUdSRVlCVVNfQ0xBU1NfU0VOU09SCQk9IDB4MGUsCisJR1JFWUJVU19DTEFTU19MSUdIVFMJCT0gMHgwZiwKKwlHUkVZQlVTX0NMQVNTX1ZJQlJBVE9SCQk9IDB4MTAsCisJR1JFWUJVU19DTEFTU19MT09QQkFDSwkJPSAweDExLAorCUdSRVlCVVNfQ0xBU1NfQVVESU8JCT0gMHgxMiwKKwkvKiAweDEzIGlzIHVudXNlZCAqLworCS8qIDB4MTQgaXMgdW51c2VkICovCisJR1JFWUJVU19DTEFTU19CT09UUk9NCQk9IDB4MTUsCisJR1JFWUJVU19DTEFTU19GV19NQU5BR0VNRU5UCT0gMHgxNiwKKwlHUkVZQlVTX0NMQVNTX0xPRwkJPSAweDE3LAorCQkvKiAuLi4gKi8KKwlHUkVZQlVTX0NMQVNTX1JBVwkJPSAweGZlLAorCUdSRVlCVVNfQ0xBU1NfVkVORE9SCQk9IDB4ZmYsCit9OworCitlbnVtIHsKKwlHUkVZQlVTX0lOVEVSRkFDRV9GRUFUVVJFX1RJTUVTWU5DID0gQklUKDApLAorfTsKKworLyoKKyAqIFRoZSBzdHJpbmcgaW4gYSBzdHJpbmcgZGVzY3JpcHRvciBpcyBub3QgTlVMLXRlcm1pbmF0ZWQuICBUaGUKKyAqIHNpemUgb2YgdGhlIGRlc2NyaXB0b3Igd2lsbCBiZSByb3VuZGVkIHVwIHRvIGEgbXVsdGlwbGUgb2YgNAorICogYnl0ZXMsIGJ5IHBhZGRpbmcgdGhlIHN0cmluZyB3aXRoIDB4MDAgYnl0ZXMgaWYgbmVjZXNzYXJ5LgorICovCitzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yX3N0cmluZyB7CisJX191OAlsZW5ndGg7CisJX191OAlpZDsKKwlfX3U4CXN0cmluZ1swXTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBBbiBpbnRlcmZhY2UgZGVzY3JpcHRvciBkZXNjcmliZXMgaW5mb3JtYXRpb24gYWJvdXQgYW4gaW50ZXJmYWNlIGFzIGEgd2hvbGUsCisgKiAqbm90KiB0aGUgZnVuY3Rpb25zIHdpdGhpbiBpdC4KKyAqLworc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcl9pbnRlcmZhY2UgeworCV9fdTgJdmVuZG9yX3N0cmluZ2lkOworCV9fdTgJcHJvZHVjdF9zdHJpbmdpZDsKKwlfX3U4CWZlYXR1cmVzOworCV9fdTgJcGFkOworfSBfX3BhY2tlZDsKKworLyoKKyAqIEFuIGJ1bmRsZSBkZXNjcmlwdG9yIGRlZmluZXMgYW4gaWRlbnRpZmljYXRpb24gbnVtYmVyIGFuZCBhIGNsYXNzIGZvcgorICogZWFjaCBidW5kbGUuCisgKgorICogQGlkOiBVbmlxdWVseSBpZGVudGlmaWVzIGEgYnVuZGxlIHdpdGhpbiBhIGludGVyZmFjZSwgaXRzIHNvbGUgcHVycG9zZSBpcyB0bworICogYWxsb3cgQ1BvcnQgZGVzY3JpcHRvcnMgdG8gc3BlY2lmeSB3aGljaCBidW5kbGUgdGhleSBhcmUgYXNzb2NpYXRlZCB3aXRoLgorICogVGhlIGZpcnN0IGJ1bmRsZSB3aWxsIGhhdmUgaWQgMCwgc2Vjb25kIHdpbGwgaGF2ZSAxIGFuZCBzbyBvbi4KKyAqCisgKiBUaGUgbGFyZ2VzdCBDUG9ydCBpZCBhc3NvY2lhdGVkIHdpdGggYW4gYnVuZGxlIChkZWZpbmVkIGJ5IGEKKyAqIENQb3J0IGRlc2NyaXB0b3IgaW4gdGhlIG1hbmlmZXN0KSBpcyB1c2VkIHRvIGRldGVybWluZSBob3cgdG8KKyAqIGVuY29kZSB0aGUgZGV2aWNlIGlkIGFuZCBtb2R1bGUgbnVtYmVyIGluIFVuaVBybyBwYWNrZXRzCisgKiB0aGF0IHVzZSB0aGUgYnVuZGxlLgorICoKKyAqIEBjbGFzczogSXQgaXMgdXNlZCBieSBrZXJuZWwgdG8ga25vdyB0aGUgZnVuY3Rpb25hbGl0eSBwcm92aWRlZCBieSB0aGUKKyAqIGJ1bmRsZSBhbmQgd2lsbCBiZSBtYXRjaGVkIGFnYWluc3QgZHJpdmVycyBmdW5jdGluYWxpdHkgd2hpbGUgcHJvYmluZyBncmV5YnVzCisgKiBkcml2ZXIuIEl0IHNob3VsZCBjb250YWluIG9uZSBvZiB0aGUgdmFsdWVzIGRlZmluZWQgaW4KKyAqICdlbnVtIGdyZXlidXNfY2xhc3NfdHlwZScuCisgKgorICovCitzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yX2J1bmRsZSB7CisJX191OAlpZDsJLyogaW50ZXJmYWNlLXJlbGF0aXZlIGlkICgwLi4pICovCisJX191OAljbGFzczsKKwlfX3U4CXBhZFsyXTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBBIENQb3J0IGRlc2NyaXB0b3IgaW5kaWNhdGVzIHRoZSBpZCBvZiB0aGUgYnVuZGxlIHdpdGhpbiB0aGUKKyAqIG1vZHVsZSBpdCdzIGFzc29jaWF0ZWQgd2l0aCwgYWxvbmcgd2l0aCB0aGUgQ1BvcnQgaWQgdXNlZCB0bworICogYWRkcmVzcyB0aGUgQ1BvcnQuICBUaGUgcHJvdG9jb2wgaWQgZGVmaW5lcyB0aGUgZm9ybWF0IG9mIG1lc3NhZ2VzCisgKiBleGNoYW5nZWQgdXNpbmcgdGhlIENQb3J0LgorICovCitzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yX2Nwb3J0IHsKKwlfX2xlMTYJaWQ7CisJX191OAlidW5kbGU7CisJX191OAlwcm90b2NvbF9pZDsJLyogZW51bSBncmV5YnVzX3Byb3RvY29sICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yX2hlYWRlciB7CisJX19sZTE2CXNpemU7CisJX191OAl0eXBlOwkJLyogZW51bSBncmV5YnVzX2Rlc2NyaXB0b3JfdHlwZSAqLworCV9fdTgJcGFkOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvciB7CisJc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcl9oZWFkZXIJCWhlYWRlcjsKKwl1bmlvbiB7CisJCXN0cnVjdCBncmV5YnVzX2Rlc2NyaXB0b3Jfc3RyaW5nCXN0cmluZzsKKwkJc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcl9pbnRlcmZhY2UJaW50ZXJmYWNlOworCQlzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yX2J1bmRsZQlidW5kbGU7CisJCXN0cnVjdCBncmV5YnVzX2Rlc2NyaXB0b3JfY3BvcnQJCWNwb3J0OworCX07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ3JleWJ1c19tYW5pZmVzdF9oZWFkZXIgeworCV9fbGUxNglzaXplOworCV9fdTgJdmVyc2lvbl9tYWpvcjsKKwlfX3U4CXZlcnNpb25fbWlub3I7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ3JleWJ1c19tYW5pZmVzdCB7CisJc3RydWN0IGdyZXlidXNfbWFuaWZlc3RfaGVhZGVyCQloZWFkZXI7CisJc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcgkJZGVzY3JpcHRvcnNbMF07Cit9IF9fcGFja2VkOworCisjZW5kaWYgLyogX19HUkVZQlVTX01BTklGRVNUX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2dyZXlidXNfcHJvdG9jb2xzLmggYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9ncmV5YnVzX3Byb3RvY29scy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzOTU3ODMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9ncmV5YnVzX3Byb3RvY29scy5oCkBAIC0wLDAgKzEsMjI2OCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodChjKSAyMDE0IC0gMjAxNSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0KGMpIDIwMTQgLSAyMDE1IExpbmFybyBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDE0IC0gMjAxNSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0KGMpIDIwMTQgLSAyMDE1IExpbmFybyBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gb3IgTGluYXJvIEx0ZC4gbm9yIHRoZSBuYW1lcyBvZgorICogICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgR09PR0xFIElOQy4gT1IKKyAqIExJTkFSTyBMVEQuIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX19HUkVZQlVTX1BST1RPQ09MU19ICisjZGVmaW5lIF9fR1JFWUJVU19QUk9UT0NPTFNfSAorCisvKiBGaXhlZCBJRHMgZm9yIGNvbnRyb2wvc3ZjIHByb3RvY29scyAqLworCisvKiBTVkMgc3dpdGNoLXBvcnQgZGV2aWNlIGlkcyAqLworI2RlZmluZSBHQl9TVkNfREVWSUNFX0lEX1NWQwkJCTAKKyNkZWZpbmUgR0JfU1ZDX0RFVklDRV9JRF9BUAkJCTEKKyNkZWZpbmUgR0JfU1ZDX0RFVklDRV9JRF9NSU4JCQkyCisjZGVmaW5lIEdCX1NWQ19ERVZJQ0VfSURfTUFYCQkJMzEKKworI2RlZmluZSBHQl9TVkNfQ1BPUlRfSUQJCQkJMAorI2RlZmluZSBHQl9DT05UUk9MX0JVTkRMRV9JRAkJCTAKKyNkZWZpbmUgR0JfQ09OVFJPTF9DUE9SVF9JRAkJCTAKKworCisvKgorICogQWxsIG9wZXJhdGlvbiBtZXNzYWdlcyAoYm90aCByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzKSBiZWdpbiB3aXRoCisgKiBhIGhlYWRlciB0aGF0IGVuY29kZXMgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UgKGhlYWRlciBpbmNsdWRlZCkuCisgKiBUaGlzIGhlYWRlciBhbHNvIGNvbnRhaW5zIGEgdW5pcXVlIGlkZW50aWZpZXIsIHRoYXQgYXNzb2NpYXRlcyBhCisgKiByZXNwb25zZSBtZXNzYWdlIHdpdGggaXRzIG9wZXJhdGlvbi4gIFRoZSBoZWFkZXIgY29udGFpbnMgYW4KKyAqIG9wZXJhdGlvbiB0eXBlIGZpZWxkLCB3aG9zZSBpbnRlcnByZXRhdGlvbiBpcyBkZXBlbmRlbnQgb24gd2hhdAorICogdHlwZSBvZiBwcm90b2NvbCBpcyB1c2VkIG92ZXIgdGhlIGNvbm5lY3Rpb24uICBUaGUgaGlnaCBiaXQKKyAqICgweDgwKSBvZiB0aGUgb3BlcmF0aW9uIHR5cGUgZmllbGQgaXMgdXNlZCB0byBpbmRpY2F0ZSB3aGV0aGVyCisgKiB0aGUgbWVzc2FnZSBpcyBhIHJlcXVlc3QgKGNsZWFyKSBvciBhIHJlc3BvbnNlIChzZXQpLgorICoKKyAqIFJlc3BvbnNlIG1lc3NhZ2VzIGluY2x1ZGUgYW4gYWRkaXRpb25hbCByZXN1bHQgYnl0ZSwgd2hpY2gKKyAqIGNvbW11bmljYXRlcyB0aGUgcmVzdWx0IG9mIHRoZSBjb3JyZXNwb25kaW5nIHJlcXVlc3QuICBBIHplcm8KKyAqIHJlc3VsdCB2YWx1ZSBtZWFucyB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuICBBbnkKKyAqIG90aGVyIHZhbHVlIGluZGljYXRlcyBhbiBlcnJvcjsgaW4gdGhpcyBjYXNlLCB0aGUgcGF5bG9hZCBvZiB0aGUKKyAqIHJlc3BvbnNlIG1lc3NhZ2UgKGlmIGFueSkgaXMgaWdub3JlZC4gIFRoZSByZXN1bHQgYnl0ZSBtdXN0IGJlCisgKiB6ZXJvIGluIHRoZSBoZWFkZXIgZm9yIGEgcmVxdWVzdCBtZXNzYWdlLgorICoKKyAqIFRoZSB3aXJlIGZvcm1hdCBmb3IgYWxsIG51bWVyaWMgZmllbGRzIGluIHRoZSBoZWFkZXIgaXMgbGl0dGxlCisgKiBlbmRpYW4uICBBbnkgb3BlcmF0aW9uLXNwZWNpZmljIGRhdGEgYmVnaW5zIGltbWVkaWF0ZWx5IGFmdGVyIHRoZQorICogaGVhZGVyLgorICovCitzdHJ1Y3QgZ2Jfb3BlcmF0aW9uX21zZ19oZHIgeworCV9fbGUxNglzaXplOwkJLyogU2l6ZSBpbiBieXRlcyBvZiBoZWFkZXIgKyBwYXlsb2FkICovCisJX19sZTE2CW9wZXJhdGlvbl9pZDsJLyogT3BlcmF0aW9uIHVuaXF1ZSBpZCAqLworCV9fdTgJdHlwZTsJCS8qIEUuZyBHQl9JMkNfVFlQRV8qIG9yIEdCX0dQSU9fVFlQRV8qICovCisJX191OAlyZXN1bHQ7CQkvKiBSZXN1bHQgb2YgcmVxdWVzdCAoaW4gcmVzcG9uc2VzIG9ubHkpICovCisJX191OAlwYWRbMl07CQkvKiBtdXN0IGJlIHplcm8gKGlnbm9yZSB3aGVuIHJlYWQpICovCit9IF9fcGFja2VkOworCisKKy8qIEdlbmVyaWMgcmVxdWVzdCB0eXBlcyAqLworI2RlZmluZSBHQl9SRVFVRVNUX1RZUEVfQ1BPUlRfU0hVVERPV04JCTB4MDAKKyNkZWZpbmUgR0JfUkVRVUVTVF9UWVBFX0lOVkFMSUQJCQkweDdmCisKK3N0cnVjdCBnYl9jcG9ydF9zaHV0ZG93bl9yZXF1ZXN0IHsKKwlfX3U4IHBoYXNlOworfSBfX3BhY2tlZDsKKworCisvKiBDb250cm9sIFByb3RvY29sICovCisKKy8qIEdyZXlidXMgY29udHJvbCByZXF1ZXN0IHR5cGVzICovCisjZGVmaW5lIEdCX0NPTlRST0xfVFlQRV9WRVJTSU9OCQkJMHgwMQorI2RlZmluZSBHQl9DT05UUk9MX1RZUEVfUFJPQkVfQVAJCTB4MDIKKyNkZWZpbmUgR0JfQ09OVFJPTF9UWVBFX0dFVF9NQU5JRkVTVF9TSVpFCTB4MDMKKyNkZWZpbmUgR0JfQ09OVFJPTF9UWVBFX0dFVF9NQU5JRkVTVAkJMHgwNAorI2RlZmluZSBHQl9DT05UUk9MX1RZUEVfQ09OTkVDVEVECQkweDA1CisjZGVmaW5lIEdCX0NPTlRST0xfVFlQRV9ESVNDT05ORUNURUQJCTB4MDYKKyNkZWZpbmUgR0JfQ09OVFJPTF9UWVBFX1RJTUVTWU5DX0VOQUJMRQkJMHgwNworI2RlZmluZSBHQl9DT05UUk9MX1RZUEVfVElNRVNZTkNfRElTQUJMRQkweDA4CisjZGVmaW5lIEdCX0NPTlRST0xfVFlQRV9USU1FU1lOQ19BVVRIT1JJVEFUSVZFCTB4MDkKKy8qCVVudXNlZAkJCQkJMHgwYSAqLworI2RlZmluZSBHQl9DT05UUk9MX1RZUEVfQlVORExFX1ZFUlNJT04JCTB4MGIKKyNkZWZpbmUgR0JfQ09OVFJPTF9UWVBFX0RJU0NPTk5FQ1RJTkcJCTB4MGMKKyNkZWZpbmUgR0JfQ09OVFJPTF9UWVBFX1RJTUVTWU5DX0dFVF9MQVNUX0VWRU5UCTB4MGQKKyNkZWZpbmUgR0JfQ09OVFJPTF9UWVBFX01PREVfU1dJVENICQkweDBlCisjZGVmaW5lIEdCX0NPTlRST0xfVFlQRV9CVU5ETEVfU1VTUEVORAkJMHgwZgorI2RlZmluZSBHQl9DT05UUk9MX1RZUEVfQlVORExFX1JFU1VNRQkJMHgxMAorI2RlZmluZSBHQl9DT05UUk9MX1RZUEVfQlVORExFX0RFQUNUSVZBVEUJMHgxMQorI2RlZmluZSBHQl9DT05UUk9MX1RZUEVfQlVORExFX0FDVElWQVRFCQkweDEyCisjZGVmaW5lIEdCX0NPTlRST0xfVFlQRV9JTlRGX1NVU1BFTkRfUFJFUEFSRQkJMHgxMworI2RlZmluZSBHQl9DT05UUk9MX1RZUEVfSU5URl9ERUFDVElWQVRFX1BSRVBBUkUJMHgxNAorI2RlZmluZSBHQl9DT05UUk9MX1RZUEVfSU5URl9ISUJFUk5BVEVfQUJPUlQJMHgxNQorCitzdHJ1Y3QgZ2JfY29udHJvbF92ZXJzaW9uX3JlcXVlc3QgeworCV9fdTgJbWFqb3I7CisJX191OAltaW5vcjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9jb250cm9sX3ZlcnNpb25fcmVzcG9uc2UgeworCV9fdTgJbWFqb3I7CisJX191OAltaW5vcjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9jb250cm9sX2J1bmRsZV92ZXJzaW9uX3JlcXVlc3QgeworCV9fdTgJYnVuZGxlX2lkOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2NvbnRyb2xfYnVuZGxlX3ZlcnNpb25fcmVzcG9uc2UgeworCV9fdTgJbWFqb3I7CisJX191OAltaW5vcjsKK30gX19wYWNrZWQ7CisKKy8qIENvbnRyb2wgcHJvdG9jb2wgbWFuaWZlc3QgZ2V0IHNpemUgcmVxdWVzdCBoYXMgbm8gcGF5bG9hZCovCitzdHJ1Y3QgZ2JfY29udHJvbF9nZXRfbWFuaWZlc3Rfc2l6ZV9yZXNwb25zZSB7CisJX19sZTE2CQkJc2l6ZTsKK30gX19wYWNrZWQ7CisKKy8qIENvbnRyb2wgcHJvdG9jb2wgbWFuaWZlc3QgZ2V0IHJlcXVlc3QgaGFzIG5vIHBheWxvYWQgKi8KK3N0cnVjdCBnYl9jb250cm9sX2dldF9tYW5pZmVzdF9yZXNwb25zZSB7CisJX191OAkJCWRhdGFbMF07Cit9IF9fcGFja2VkOworCisvKiBDb250cm9sIHByb3RvY29sIFtkaXNdY29ubmVjdGVkIHJlcXVlc3QgKi8KK3N0cnVjdCBnYl9jb250cm9sX2Nvbm5lY3RlZF9yZXF1ZXN0IHsKKwlfX2xlMTYJCQljcG9ydF9pZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9jb250cm9sX2Rpc2Nvbm5lY3RpbmdfcmVxdWVzdCB7CisJX19sZTE2CQkJY3BvcnRfaWQ7Cit9IF9fcGFja2VkOworLyogZGlzY29ubmVjdGluZyByZXNwb25zZSBoYXMgbm8gcGF5bG9hZCAqLworCitzdHJ1Y3QgZ2JfY29udHJvbF9kaXNjb25uZWN0ZWRfcmVxdWVzdCB7CisJX19sZTE2CQkJY3BvcnRfaWQ7Cit9IF9fcGFja2VkOworLyogQ29udHJvbCBwcm90b2NvbCBbZGlzXWNvbm5lY3RlZCByZXNwb25zZSBoYXMgbm8gcGF5bG9hZCAqLworCisjZGVmaW5lIEdCX1RJTUVTWU5DX01BWF9TVFJPQkVTCQkJMHgwNAorCitzdHJ1Y3QgZ2JfY29udHJvbF90aW1lc3luY19lbmFibGVfcmVxdWVzdCB7CisJX191OAljb3VudDsKKwlfX2xlNjQJZnJhbWVfdGltZTsKKwlfX2xlMzIJc3Ryb2JlX2RlbGF5OworCV9fbGUzMglyZWZjbGs7Cit9IF9fcGFja2VkOworLyogdGltZXN5bmMgZW5hYmxlIHJlc3BvbnNlIGhhcyBubyBwYXlsb2FkICovCisKK3N0cnVjdCBnYl9jb250cm9sX3RpbWVzeW5jX2F1dGhvcml0YXRpdmVfcmVxdWVzdCB7CisJX19sZTY0CWZyYW1lX3RpbWVbR0JfVElNRVNZTkNfTUFYX1NUUk9CRVNdOworfSBfX3BhY2tlZDsKKy8qIHRpbWVzeW5jIGF1dGhvcml0YXRpdmUgcmVzcG9uc2UgaGFzIG5vIHBheWxvYWQgKi8KKworLyogdGltZXN5bmMgZ2V0X2xhc3RfZXZlbnRfcmVxdWVzdCBoYXMgbm8gcGF5bG9hZCAqLworc3RydWN0IGdiX2NvbnRyb2xfdGltZXN5bmNfZ2V0X2xhc3RfZXZlbnRfcmVzcG9uc2UgeworCV9fbGU2NAlmcmFtZV90aW1lOworfSBfX3BhY2tlZDsKKworLyoKKyAqIEFsbCBCdW5kbGUgcG93ZXIgbWFuYWdlbWVudCBvcGVyYXRpb25zIHVzZSB0aGUgc2FtZSByZXF1ZXN0IGFuZCByZXNwb25zZQorICogbGF5b3V0IGFuZCBzdGF0dXMgY29kZXMuCisgKi8KKworI2RlZmluZSBHQl9DT05UUk9MX0JVTkRMRV9QTV9PSwkJMHgwMAorI2RlZmluZSBHQl9DT05UUk9MX0JVTkRMRV9QTV9JTlZBTAkweDAxCisjZGVmaW5lIEdCX0NPTlRST0xfQlVORExFX1BNX0JVU1kJMHgwMgorI2RlZmluZSBHQl9DT05UUk9MX0JVTkRMRV9QTV9GQUlMCTB4MDMKKyNkZWZpbmUgR0JfQ09OVFJPTF9CVU5ETEVfUE1fTkEJCTB4MDQKKworc3RydWN0IGdiX2NvbnRyb2xfYnVuZGxlX3BtX3JlcXVlc3QgeworCV9fdTgJYnVuZGxlX2lkOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2NvbnRyb2xfYnVuZGxlX3BtX3Jlc3BvbnNlIHsKKwlfX3U4CXN0YXR1czsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBJbnRlcmZhY2UgU3VzcGVuZCBQcmVwYXJlIGFuZCBEZWFjdGl2YXRlIFByZXBhcmUgb3BlcmF0aW9ucyB1c2UgdGhlIHNhbWUKKyAqIHJlc3BvbnNlIGxheW91dCBhbmQgZXJyb3IgY29kZXMuIERlZmluZSBhIHNpbmdsZSByZXNwb25zZSBzdHJ1Y3R1cmUgYW5kIHJldXNlCisgKiBpdC4gQm90aCBvcGVyYXRpb25zIGhhdmUgbm8gcGF5bG9hZC4KKyAqLworCisjZGVmaW5lIEdCX0NPTlRST0xfSU5URl9QTV9PSwkJMHgwMAorI2RlZmluZSBHQl9DT05UUk9MX0lOVEZfUE1fQlVTWQkJMHgwMQorI2RlZmluZSBHQl9DT05UUk9MX0lOVEZfUE1fTkEJCTB4MDIKKworc3RydWN0IGdiX2NvbnRyb2xfaW50Zl9wbV9yZXNwb25zZSB7CisJX191OAlzdGF0dXM7Cit9IF9fcGFja2VkOworCisvKiBBUEJyaWRnZSBwcm90b2NvbCAqLworCisvKiByZXF1ZXN0IEFQQjEgbG9nICovCisjZGVmaW5lIEdCX0FQQl9SRVFVRVNUX0xPRwkJCTB4MDIKKworLyogcmVxdWVzdCB0byBtYXAgYSBjcG9ydCB0byBidWxrIGluIGFuZCBidWxrIG91dCBlbmRwb2ludHMgKi8KKyNkZWZpbmUgR0JfQVBCX1JFUVVFU1RfRVBfTUFQUElORwkJMHgwMworCisvKiByZXF1ZXN0IHRvIGdldCB0aGUgbnVtYmVyIG9mIGNwb3J0cyBhdmFpbGFibGUgKi8KKyNkZWZpbmUgR0JfQVBCX1JFUVVFU1RfQ1BPUlRfQ09VTlQJCTB4MDQKKworLyogcmVxdWVzdCB0byByZXNldCBhIGNwb3J0IHN0YXRlICovCisjZGVmaW5lIEdCX0FQQl9SRVFVRVNUX1JFU0VUX0NQT1JUCQkweDA1CisKKy8qIHJlcXVlc3QgdG8gdGltZSB0aGUgbGF0ZW5jeSBvZiBtZXNzYWdlcyBvbiBhIGdpdmVuIGNwb3J0ICovCisjZGVmaW5lIEdCX0FQQl9SRVFVRVNUX0xBVEVOQ1lfVEFHX0VOCQkweDA2CisjZGVmaW5lIEdCX0FQQl9SRVFVRVNUX0xBVEVOQ1lfVEFHX0RJUwkJMHgwNworCisvKiByZXF1ZXN0IHRvIGNvbnRyb2wgdGhlIENTSSB0cmFuc21pdHRlciAqLworI2RlZmluZSBHQl9BUEJfUkVRVUVTVF9DU0lfVFhfQ09OVFJPTAkJMHgwOAorCisvKiByZXF1ZXN0IHRvIGNvbnRyb2wgYXVkaW8gc3RyZWFtaW5nICovCisjZGVmaW5lIEdCX0FQQl9SRVFVRVNUX0FVRElPX0NPTlRST0wJCTB4MDkKKworLyogVGltZVN5bmMgcmVxdWVzdHMgKi8KKyNkZWZpbmUgR0JfQVBCX1JFUVVFU1RfVElNRVNZTkNfRU5BQkxFCQkweDBkCisjZGVmaW5lIEdCX0FQQl9SRVFVRVNUX1RJTUVTWU5DX0RJU0FCTEUJCTB4MGUKKyNkZWZpbmUgR0JfQVBCX1JFUVVFU1RfVElNRVNZTkNfQVVUSE9SSVRBVElWRQkweDBmCisjZGVmaW5lIEdCX0FQQl9SRVFVRVNUX1RJTUVTWU5DX0dFVF9MQVNUX0VWRU5UCTB4MTAKKworLyogcmVxdWVzdHMgdG8gc2V0IEdyZXlidXMgQ1BvcnQgZmxhZ3MgKi8KKyNkZWZpbmUgR0JfQVBCX1JFUVVFU1RfQ1BPUlRfRkxBR1MJCTB4MTEKKworLyogQVJQQyByZXF1ZXN0ICovCisjZGVmaW5lIEdCX0FQQl9SRVFVRVNUX0FSUENfUlVOCQkJMHgxMgorCitzdHJ1Y3QgZ2JfYXBiX3JlcXVlc3RfY3BvcnRfZmxhZ3MgeworCV9fbGUzMglmbGFnczsKKyNkZWZpbmUgR0JfQVBCX0NQT1JUX0ZMQUdfQ09OVFJPTAkJMHgwMQorI2RlZmluZSBHQl9BUEJfQ1BPUlRfRkxBR19ISUdIX1BSSU8JCTB4MDIKK30gX19wYWNrZWQ7CisKKworLyogRmlybXdhcmUgRG93bmxvYWQgUHJvdG9jb2wgKi8KKworLyogUmVxdWVzdCBUeXBlcyAqLworI2RlZmluZSBHQl9GV19ET1dOTE9BRF9UWVBFX0ZJTkRfRklSTVdBUkUJMHgwMQorI2RlZmluZSBHQl9GV19ET1dOTE9BRF9UWVBFX0ZFVENIX0ZJUk1XQVJFCTB4MDIKKyNkZWZpbmUgR0JfRldfRE9XTkxPQURfVFlQRV9SRUxFQVNFX0ZJUk1XQVJFCTB4MDMKKworI2RlZmluZSBHQl9GSVJNV0FSRV9UQUdfTUFYX1NJWkUJCTEwCisKKy8qIGZpcm13YXJlIGRvd25sb2FkIGZpbmQgZmlybXdhcmUgcmVxdWVzdC9yZXNwb25zZSAqLworc3RydWN0IGdiX2Z3X2Rvd25sb2FkX2ZpbmRfZmlybXdhcmVfcmVxdWVzdCB7CisJX191OAkJCWZpcm13YXJlX3RhZ1tHQl9GSVJNV0FSRV9UQUdfTUFYX1NJWkVdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2Z3X2Rvd25sb2FkX2ZpbmRfZmlybXdhcmVfcmVzcG9uc2UgeworCV9fdTgJCQlmaXJtd2FyZV9pZDsKKwlfX2xlMzIJCQlzaXplOworfSBfX3BhY2tlZDsKKworLyogZmlybXdhcmUgZG93bmxvYWQgZmV0Y2ggZmlybXdhcmUgcmVxdWVzdC9yZXNwb25zZSAqLworc3RydWN0IGdiX2Z3X2Rvd25sb2FkX2ZldGNoX2Zpcm13YXJlX3JlcXVlc3QgeworCV9fdTgJCQlmaXJtd2FyZV9pZDsKKwlfX2xlMzIJCQlvZmZzZXQ7CisJX19sZTMyCQkJc2l6ZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9md19kb3dubG9hZF9mZXRjaF9maXJtd2FyZV9yZXNwb25zZSB7CisJX191OAkJCWRhdGFbMF07Cit9IF9fcGFja2VkOworCisvKiBmaXJtd2FyZSBkb3dubG9hZCByZWxlYXNlIGZpcm13YXJlIHJlcXVlc3QgKi8KK3N0cnVjdCBnYl9md19kb3dubG9hZF9yZWxlYXNlX2Zpcm13YXJlX3JlcXVlc3QgeworCV9fdTgJCQlmaXJtd2FyZV9pZDsKK30gX19wYWNrZWQ7CisvKiBmaXJtd2FyZSBkb3dubG9hZCByZWxlYXNlIGZpcm13YXJlIHJlc3BvbnNlIGhhcyBubyBwYXlsb2FkICovCisKKworLyogRmlybXdhcmUgTWFuYWdlbWVudCBQcm90b2NvbCAqLworCisvKiBSZXF1ZXN0IFR5cGVzICovCisjZGVmaW5lIEdCX0ZXX01HTVRfVFlQRV9JTlRFUkZBQ0VfRldfVkVSU0lPTgkweDAxCisjZGVmaW5lIEdCX0ZXX01HTVRfVFlQRV9MT0FEX0FORF9WQUxJREFURV9GVwkweDAyCisjZGVmaW5lIEdCX0ZXX01HTVRfVFlQRV9MT0FERURfRlcJCTB4MDMKKyNkZWZpbmUgR0JfRldfTUdNVF9UWVBFX0JBQ0tFTkRfRldfVkVSU0lPTgkweDA0CisjZGVmaW5lIEdCX0ZXX01HTVRfVFlQRV9CQUNLRU5EX0ZXX1VQREFURQkweDA1CisjZGVmaW5lIEdCX0ZXX01HTVRfVFlQRV9CQUNLRU5EX0ZXX1VQREFURUQJMHgwNgorCisjZGVmaW5lIEdCX0ZXX0xPQURfTUVUSE9EX1VOSVBSTwkJMHgwMQorI2RlZmluZSBHQl9GV19MT0FEX01FVEhPRF9JTlRFUk5BTAkJMHgwMgorCisjZGVmaW5lIEdCX0ZXX0xPQURfU1RBVFVTX0ZBSUxFRAkJMHgwMAorI2RlZmluZSBHQl9GV19MT0FEX1NUQVRVU19VTlZBTElEQVRFRAkJMHgwMQorI2RlZmluZSBHQl9GV19MT0FEX1NUQVRVU19WQUxJREFURUQJCTB4MDIKKyNkZWZpbmUgR0JfRldfTE9BRF9TVEFUVVNfVkFMSURBVElPTl9GQUlMRUQJMHgwMworCisjZGVmaW5lIEdCX0ZXX0JBQ0tFTkRfRldfU1RBVFVTX1NVQ0NFU1MJCTB4MDEKKyNkZWZpbmUgR0JfRldfQkFDS0VORF9GV19TVEFUVVNfRkFJTF9GSU5ECTB4MDIKKyNkZWZpbmUgR0JfRldfQkFDS0VORF9GV19TVEFUVVNfRkFJTF9GRVRDSAkweDAzCisjZGVmaW5lIEdCX0ZXX0JBQ0tFTkRfRldfU1RBVFVTX0ZBSUxfV1JJVEUJMHgwNAorI2RlZmluZSBHQl9GV19CQUNLRU5EX0ZXX1NUQVRVU19JTlQJCTB4MDUKKyNkZWZpbmUgR0JfRldfQkFDS0VORF9GV19TVEFUVVNfUkVUUlkJCTB4MDYKKyNkZWZpbmUgR0JfRldfQkFDS0VORF9GV19TVEFUVVNfTk9UX1NVUFBPUlRFRAkweDA3CisKKyNkZWZpbmUgR0JfRldfQkFDS0VORF9WRVJTSU9OX1NUQVRVU19TVUNDRVNTCQkweDAxCisjZGVmaW5lIEdCX0ZXX0JBQ0tFTkRfVkVSU0lPTl9TVEFUVVNfTk9UX0FWQUlMQUJMRQkweDAyCisjZGVmaW5lIEdCX0ZXX0JBQ0tFTkRfVkVSU0lPTl9TVEFUVVNfTk9UX1NVUFBPUlRFRAkweDAzCisjZGVmaW5lIEdCX0ZXX0JBQ0tFTkRfVkVSU0lPTl9TVEFUVVNfUkVUUlkJCTB4MDQKKyNkZWZpbmUgR0JfRldfQkFDS0VORF9WRVJTSU9OX1NUQVRVU19GQUlMX0lOVAkJMHgwNQorCisvKiBmaXJtd2FyZSBtYW5hZ2VtZW50IGludGVyZmFjZSBmaXJtd2FyZSB2ZXJzaW9uIHJlcXVlc3QgaGFzIG5vIHBheWxvYWQgKi8KK3N0cnVjdCBnYl9md19tZ210X2ludGVyZmFjZV9md192ZXJzaW9uX3Jlc3BvbnNlIHsKKwlfX3U4CQkJZmlybXdhcmVfdGFnW0dCX0ZJUk1XQVJFX1RBR19NQVhfU0laRV07CisJX19sZTE2CQkJbWFqb3I7CisJX19sZTE2CQkJbWlub3I7Cit9IF9fcGFja2VkOworCisvKiBmaXJtd2FyZSBtYW5hZ2VtZW50IGxvYWQgYW5kIHZhbGlkYXRlIGZpcm13YXJlIHJlcXVlc3QvcmVzcG9uc2UgKi8KK3N0cnVjdCBnYl9md19tZ210X2xvYWRfYW5kX3ZhbGlkYXRlX2Z3X3JlcXVlc3QgeworCV9fdTgJCQlyZXF1ZXN0X2lkOworCV9fdTgJCQlsb2FkX21ldGhvZDsKKwlfX3U4CQkJZmlybXdhcmVfdGFnW0dCX0ZJUk1XQVJFX1RBR19NQVhfU0laRV07Cit9IF9fcGFja2VkOworLyogZmlybXdhcmUgbWFuYWdlbWVudCBsb2FkIGFuZCB2YWxpZGF0ZSBmaXJtd2FyZSByZXNwb25zZSBoYXMgbm8gcGF5bG9hZCovCisKKy8qIGZpcm13YXJlIG1hbmFnZW1lbnQgbG9hZGVkIGZpcm13YXJlIHJlcXVlc3QgKi8KK3N0cnVjdCBnYl9md19tZ210X2xvYWRlZF9md19yZXF1ZXN0IHsKKwlfX3U4CQkJcmVxdWVzdF9pZDsKKwlfX3U4CQkJc3RhdHVzOworCV9fbGUxNgkJCW1ham9yOworCV9fbGUxNgkJCW1pbm9yOworfSBfX3BhY2tlZDsKKy8qIGZpcm13YXJlIG1hbmFnZW1lbnQgbG9hZGVkIGZpcm13YXJlIHJlc3BvbnNlIGhhcyBubyBwYXlsb2FkICovCisKKy8qIGZpcm13YXJlIG1hbmFnZW1lbnQgYmFja2VuZCBmaXJtd2FyZSB2ZXJzaW9uIHJlcXVlc3QvcmVzcG9uc2UgKi8KK3N0cnVjdCBnYl9md19tZ210X2JhY2tlbmRfZndfdmVyc2lvbl9yZXF1ZXN0IHsKKwlfX3U4CQkJZmlybXdhcmVfdGFnW0dCX0ZJUk1XQVJFX1RBR19NQVhfU0laRV07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfZndfbWdtdF9iYWNrZW5kX2Z3X3ZlcnNpb25fcmVzcG9uc2UgeworCV9fbGUxNgkJCW1ham9yOworCV9fbGUxNgkJCW1pbm9yOworCV9fdTgJCQlzdGF0dXM7Cit9IF9fcGFja2VkOworCisvKiBmaXJtd2FyZSBtYW5hZ2VtZW50IGJhY2tlbmQgZmlybXdhcmUgdXBkYXRlIHJlcXVlc3QgKi8KK3N0cnVjdCBnYl9md19tZ210X2JhY2tlbmRfZndfdXBkYXRlX3JlcXVlc3QgeworCV9fdTgJCQlyZXF1ZXN0X2lkOworCV9fdTgJCQlmaXJtd2FyZV90YWdbR0JfRklSTVdBUkVfVEFHX01BWF9TSVpFXTsKK30gX19wYWNrZWQ7CisvKiBmaXJtd2FyZSBtYW5hZ2VtZW50IGJhY2tlbmQgZmlybXdhcmUgdXBkYXRlIHJlc3BvbnNlIGhhcyBubyBwYXlsb2FkICovCisKKy8qIGZpcm13YXJlIG1hbmFnZW1lbnQgYmFja2VuZCBmaXJtd2FyZSB1cGRhdGVkIHJlcXVlc3QgKi8KK3N0cnVjdCBnYl9md19tZ210X2JhY2tlbmRfZndfdXBkYXRlZF9yZXF1ZXN0IHsKKwlfX3U4CQkJcmVxdWVzdF9pZDsKKwlfX3U4CQkJc3RhdHVzOworfSBfX3BhY2tlZDsKKy8qIGZpcm13YXJlIG1hbmFnZW1lbnQgYmFja2VuZCBmaXJtd2FyZSB1cGRhdGVkIHJlc3BvbnNlIGhhcyBubyBwYXlsb2FkICovCisKKworLyogQ29tcG9uZW50IEF1dGhlbnRpY2F0aW9uIFByb3RvY29sIChDQVApICovCisKKy8qIFJlcXVlc3QgVHlwZXMgKi8KKyNkZWZpbmUgR0JfQ0FQX1RZUEVfR0VUX0VORFBPSU5UX1VJRAkweDAxCisjZGVmaW5lIEdCX0NBUF9UWVBFX0dFVF9JTVNfQ0VSVElGSUNBVEUJMHgwMgorI2RlZmluZSBHQl9DQVBfVFlQRV9BVVRIRU5USUNBVEUJMHgwMworCisvKiBDQVAgZ2V0IGVuZHBvaW50IHVpZCByZXF1ZXN0IGhhcyBubyBwYXlsb2FkICovCitzdHJ1Y3QgZ2JfY2FwX2dldF9lbmRwb2ludF91aWRfcmVzcG9uc2UgeworCV9fdTgJCQl1aWRbOF07Cit9IF9fcGFja2VkOworCisvKiBDQVAgZ2V0IGVuZHBvaW50IGltcyBjZXJ0aWZpY2F0ZSByZXF1ZXN0L3Jlc3BvbnNlICovCitzdHJ1Y3QgZ2JfY2FwX2dldF9pbXNfY2VydGlmaWNhdGVfcmVxdWVzdCB7CisJX19sZTMyCQkJY2VydGlmaWNhdGVfY2xhc3M7CisJX19sZTMyCQkJY2VydGlmaWNhdGVfaWQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfY2FwX2dldF9pbXNfY2VydGlmaWNhdGVfcmVzcG9uc2UgeworCV9fdTgJCQlyZXN1bHRfY29kZTsKKwlfX3U4CQkJY2VydGlmaWNhdGVbMF07Cit9IF9fcGFja2VkOworCisvKiBDQVAgYXV0aGVudGljYXRlIHJlcXVlc3QvcmVzcG9uc2UgKi8KK3N0cnVjdCBnYl9jYXBfYXV0aGVudGljYXRlX3JlcXVlc3QgeworCV9fbGUzMgkJCWF1dGhfdHlwZTsKKwlfX3U4CQkJdWlkWzhdOworCV9fdTgJCQljaGFsbGVuZ2VbMzJdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2NhcF9hdXRoZW50aWNhdGVfcmVzcG9uc2UgeworCV9fdTgJCQlyZXN1bHRfY29kZTsKKwlfX3U4CQkJcmVzcG9uc2VbNjRdOworCV9fdTgJCQlzaWduYXR1cmVbMF07Cit9IF9fcGFja2VkOworCisKKy8qIEJvb3Ryb20gUHJvdG9jb2wgKi8KKworLyogVmVyc2lvbiBvZiB0aGUgR3JleWJ1cyBib290cm9tIHByb3RvY29sIHdlIHN1cHBvcnQgKi8KKyNkZWZpbmUgR0JfQk9PVFJPTV9WRVJTSU9OX01BSk9SCQkweDAwCisjZGVmaW5lIEdCX0JPT1RST01fVkVSU0lPTl9NSU5PUgkJMHgwMQorCisvKiBHcmV5YnVzIGJvb3Ryb20gcmVxdWVzdCB0eXBlcyAqLworI2RlZmluZSBHQl9CT09UUk9NX1RZUEVfVkVSU0lPTgkJCTB4MDEKKyNkZWZpbmUgR0JfQk9PVFJPTV9UWVBFX0ZJUk1XQVJFX1NJWkUJCTB4MDIKKyNkZWZpbmUgR0JfQk9PVFJPTV9UWVBFX0dFVF9GSVJNV0FSRQkJMHgwMworI2RlZmluZSBHQl9CT09UUk9NX1RZUEVfUkVBRFlfVE9fQk9PVAkJMHgwNAorI2RlZmluZSBHQl9CT09UUk9NX1RZUEVfQVBfUkVBRFkJCTB4MDUJLyogUmVxdWVzdCB3aXRoIG5vLXBheWxvYWQgKi8KKyNkZWZpbmUgR0JfQk9PVFJPTV9UWVBFX0dFVF9WSURfUElECQkweDA2CS8qIFJlcXVlc3Qgd2l0aCBuby1wYXlsb2FkICovCisKKy8qIEdyZXlidXMgYm9vdHJvbSBib290IHN0YWdlcyAqLworI2RlZmluZSBHQl9CT09UUk9NX0JPT1RfU1RBR0VfT05FCQkweDAxIC8qIFJlc2VydmVkIGZvciB0aGUgYm9vdCBST00gKi8KKyNkZWZpbmUgR0JfQk9PVFJPTV9CT09UX1NUQUdFX1RXTwkJMHgwMiAvKiBCb290cm9tIHBhY2thZ2UgdG8gYmUgbG9hZGVkIGJ5IHRoZSBib290IFJPTSAqLworI2RlZmluZSBHQl9CT09UUk9NX0JPT1RfU1RBR0VfVEhSRUUJCTB4MDMgLyogTW9kdWxlIHBlcnNvbmFsaXR5IHBhY2thZ2UgbG9hZGVkIGJ5IFN0YWdlIDIgZmlybXdhcmUgKi8KKworLyogR3JleWJ1cyBib290cm9tIHJlYWR5IHRvIGJvb3Qgc3RhdHVzICovCisjZGVmaW5lIEdCX0JPT1RST01fQk9PVF9TVEFUVVNfSU5WQUxJRAkJMHgwMCAvKiBGaXJtd2FyZSBibG9iIGNvdWxkIG5vdCBiZSB2YWxpZGF0ZWQgKi8KKyNkZWZpbmUgR0JfQk9PVFJPTV9CT09UX1NUQVRVU19JTlNFQ1VSRQkJMHgwMSAvKiBGaXJtd2FyZSBibG9iIGlzIHZhbGlkIGJ1dCBpbnNlY3VyZSAqLworI2RlZmluZSBHQl9CT09UUk9NX0JPT1RfU1RBVFVTX1NFQ1VSRQkJMHgwMiAvKiBGaXJtd2FyZSBibG9iIGlzIHZhbGlkIGFuZCBzZWN1cmUgKi8KKworLyogTWF4IGJvb3Ryb20gZGF0YSBmZXRjaCBzaXplIGluIGJ5dGVzICovCisjZGVmaW5lIEdCX0JPT1RST01fRkVUQ0hfTUFYCQkJMjAwMAorCitzdHJ1Y3QgZ2JfYm9vdHJvbV92ZXJzaW9uX3JlcXVlc3QgeworCV9fdTgJbWFqb3I7CisJX191OAltaW5vcjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9ib290cm9tX3ZlcnNpb25fcmVzcG9uc2UgeworCV9fdTgJbWFqb3I7CisJX191OAltaW5vcjsKK30gX19wYWNrZWQ7CisKKy8qIEJvb3Ryb20gcHJvdG9jb2wgZmlybXdhcmUgc2l6ZSByZXF1ZXN0L3Jlc3BvbnNlICovCitzdHJ1Y3QgZ2JfYm9vdHJvbV9maXJtd2FyZV9zaXplX3JlcXVlc3QgeworCV9fdTgJCQlzdGFnZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9ib290cm9tX2Zpcm13YXJlX3NpemVfcmVzcG9uc2UgeworCV9fbGUzMgkJCXNpemU7Cit9IF9fcGFja2VkOworCisvKiBCb290cm9tIHByb3RvY29sIGdldCBmaXJtd2FyZSByZXF1ZXN0L3Jlc3BvbnNlICovCitzdHJ1Y3QgZ2JfYm9vdHJvbV9nZXRfZmlybXdhcmVfcmVxdWVzdCB7CisJX19sZTMyCQkJb2Zmc2V0OworCV9fbGUzMgkJCXNpemU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfYm9vdHJvbV9nZXRfZmlybXdhcmVfcmVzcG9uc2UgeworCV9fdTgJCQlkYXRhWzBdOworfSBfX3BhY2tlZDsKKworLyogQm9vdHJvbSBwcm90b2NvbCBSZWFkeSB0byBib290IHJlcXVlc3QgKi8KK3N0cnVjdCBnYl9ib290cm9tX3JlYWR5X3RvX2Jvb3RfcmVxdWVzdCB7CisJX191OAkJCXN0YXR1czsKK30gX19wYWNrZWQ7CisvKiBCb290cm9tIHByb3RvY29sIFJlYWR5IHRvIGJvb3QgcmVzcG9uc2UgaGFzIG5vIHBheWxvYWQgKi8KKworLyogQm9vdHJvbSBwcm90b2NvbCBnZXQgVklEL1BJRCByZXF1ZXN0IGhhcyBubyBwYXlsb2FkICovCitzdHJ1Y3QgZ2JfYm9vdHJvbV9nZXRfdmlkX3BpZF9yZXNwb25zZSB7CisJX19sZTMyCQkJdmVuZG9yX2lkOworCV9fbGUzMgkJCXByb2R1Y3RfaWQ7Cit9IF9fcGFja2VkOworCisKKy8qIFBvd2VyIFN1cHBseSAqLworCisvKiBHcmV5YnVzIHBvd2VyIHN1cHBseSByZXF1ZXN0IHR5cGVzICovCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9UWVBFX0dFVF9TVVBQTElFUwkJMHgwMgorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfVFlQRV9HRVRfREVTQ1JJUFRJT04JCTB4MDMKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1RZUEVfR0VUX1BST1BfREVTQ1JJUFRPUlMJMHgwNAorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfVFlQRV9HRVRfUFJPUEVSVFkJCTB4MDUKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1RZUEVfU0VUX1BST1BFUlRZCQkweDA2CisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9UWVBFX0VWRU5UCQkJMHgwNworCisvKiBHcmV5YnVzIHBvd2VyIHN1cHBseSBiYXR0ZXJ5IHRlY2hub2xvZ2llcyB0eXBlcyAqLworI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfVEVDSF9VTktOT1dOCQkJMHgwMDAwCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9URUNIX05pTUgJCQkweDAwMDEKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1RFQ0hfTElPTgkJCTB4MDAwMgorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfVEVDSF9MSVBPCQkJMHgwMDAzCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9URUNIX0xpRmUJCQkweDAwMDQKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1RFQ0hfTmlDZAkJCTB4MDAwNQorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfVEVDSF9MaU1uCQkJMHgwMDA2CisKKy8qIEdyZXlidXMgcG93ZXIgc3VwcGx5IHR5cGVzICovCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9VTktOT1dOX1RZUEUJCQkweDAwMDAKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX0JBVFRFUllfVFlQRQkJCTB4MDAwMQorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfVVBTX1RZUEUJCQkweDAwMDIKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX01BSU5TX1RZUEUJCQkweDAwMDMKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1VTQl9UWVBFCQkJMHgwMDA0CisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9VU0JfRENQX1RZUEUJCQkweDAwMDUKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1VTQl9DRFBfVFlQRQkJCTB4MDAwNgorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfVVNCX0FDQV9UWVBFCQkJMHgwMDA3CisKKy8qIEdyZXlidXMgcG93ZXIgc3VwcGx5IGhlYWx0aCB2YWx1ZXMgKi8KKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX0hFQUxUSF9VTktOT1dOCQkJMHgwMDAwCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9IRUFMVEhfR09PRAkJCTB4MDAwMQorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJIRUFUCQkJMHgwMDAyCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9IRUFMVEhfREVBRAkJCTB4MDAwMworI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJWT0xUQUdFCQkweDAwMDQKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX0hFQUxUSF9VTlNQRUNfRkFJTFVSRQkJMHgwMDA1CisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9IRUFMVEhfQ09MRAkJCTB4MDAwNgorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfSEVBTFRIX1dBVENIRE9HX1RJTUVSX0VYUElSRQkweDAwMDcKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX0hFQUxUSF9TQUZFVFlfVElNRVJfRVhQSVJFCTB4MDAwOAorCisvKiBHcmV5YnVzIHBvd2VyIHN1cHBseSBzdGF0dXMgdmFsdWVzICovCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9TVEFUVVNfVU5LTk9XTgkJCTB4MDAwMAorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HCQkJMHgwMDAxCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkcJCTB4MDAwMgorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfU1RBVFVTX05PVF9DSEFSR0lORwkJMHgwMDAzCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTAkJCTB4MDAwNAorCisvKiBHcmV5YnVzIHBvd2VyIHN1cHBseSBjYXBhY2l0eSBsZXZlbCB2YWx1ZXMgKi8KKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX1VOS05PV04JCTB4MDAwMAorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfQ0FQQUNJVFlfTEVWRUxfQ1JJVElDQUwJCTB4MDAwMQorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfQ0FQQUNJVFlfTEVWRUxfTE9XCQkweDAwMDIKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX05PUk1BTAkJMHgwMDAzCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9DQVBBQ0lUWV9MRVZFTF9ISUdICQkweDAwMDQKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX0ZVTEwJCTB4MDAwNQorCisvKiBHcmV5YnVzIHBvd2VyIHN1cHBseSBzY29wZSB2YWx1ZXMgKi8KKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1NDT1BFX1VOS05PV04JCQkweDAwMDAKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1NDT1BFX1NZU1RFTQkJCTB4MDAwMQorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfU0NPUEVfREVWSUNFCQkJMHgwMDAyCisKK3N0cnVjdCBnYl9wb3dlcl9zdXBwbHlfZ2V0X3N1cHBsaWVzX3Jlc3BvbnNlIHsKKwlfX3U4CXN1cHBsaWVzX2NvdW50OworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3Bvd2VyX3N1cHBseV9nZXRfZGVzY3JpcHRpb25fcmVxdWVzdCB7CisJX191OAlwc3lfaWQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5X2dldF9kZXNjcmlwdGlvbl9yZXNwb25zZSB7CisJX191OAltYW51ZmFjdHVyZXJbMzJdOworCV9fdTgJbW9kZWxbMzJdOworCV9fdTgJc2VyaWFsX251bWJlclszMl07CisJX19sZTE2CXR5cGU7CisJX191OAlwcm9wZXJ0aWVzX2NvdW50OworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3Bvd2VyX3N1cHBseV9wcm9wc19kZXNjIHsKKwlfX3U4CXByb3BlcnR5OworI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMJCQkJMHgwMAorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfVFlQRQkJCTB4MDEKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfSEVBTFRICQkJCTB4MDIKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVAkJCQkweDAzCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX09OTElORQkJCQkweDA0CisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0FVVEhFTlRJQwkJCQkweDA1CisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1kJCQkJMHgwNgorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DWUNMRV9DT1VOVAkJCTB4MDcKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NQVgJCQkweDA4CisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOCQkJMHgwOQorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWF9ERVNJR04JCQkweDBBCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOX0RFU0lHTgkJCTB4MEIKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1cJCQkweDBDCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfQVZHCQkJMHgwRAorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX09DVgkJCTB4MEUKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9CT09UCQkJMHgwRgorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX01BWAkJCTB4MTAKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1cJCQkweDExCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfQVZHCQkJMHgxMgorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX0JPT1QJCQkweDEzCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1BPV0VSX05PVwkJCQkweDE0CisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1BPV0VSX0FWRwkJCQkweDE1CisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMX0RFU0lHTgkJCTB4MTYKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0VNUFRZX0RFU0lHTgkJMHgxNworI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTAkJCTB4MTgKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0VNUFRZCQkJMHgxOQorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XCQkJCTB4MUEKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0FWRwkJCQkweDFCCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9DT1VOVEVSCQkJMHgxQworI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfQ1VSUkVOVAkJMHgxRAorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfQ1VSUkVOVF9NQVgJMHgxRQorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfVk9MVEFHRQkJMHgxRgorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfVk9MVEFHRV9NQVgJMHgyMAorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfQ09OVFJPTF9MSU1JVAkJMHgyMQorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfQ09OVFJPTF9MSU1JVF9NQVgJCTB4MjIKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfSU5QVVRfQ1VSUkVOVF9MSU1JVAkJMHgyMworI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfRlVMTF9ERVNJR04JCQkweDI0CisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9FTVBUWV9ERVNJR04JCTB4MjUKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX0ZVTEwJCQkweDI2CisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9FTVBUWQkJCTB4MjcKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX05PVwkJCQkweDI4CisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9BVkcJCQkJMHgyOQorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWQkJCQkweDJBCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZX0FMRVJUX01JTgkJCTB4MkIKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFlfQUxFUlRfTUFYCQkJMHgyQworI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWV9MRVZFTAkJCTB4MkQKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfVEVNUAkJCQkweDJFCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1RFTVBfTUFYCQkJCTB4MkYKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfVEVNUF9NSU4JCQkJMHgzMAorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9URU1QX0FMRVJUX01JTgkJCTB4MzEKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTEVSVF9NQVgJCQkweDMyCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQU1CSUVOVAkJCTB4MzMKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTUJJRU5UX0FMRVJUX01JTgkJMHgzNAorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9URU1QX0FNQklFTlRfQUxFUlRfTUFYCQkweDM1CisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRU1QVFlfTk9XCQkJMHgzNgorI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0VNUFRZX0FWRwkJCTB4MzcKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19GVUxMX05PVwkJCTB4MzgKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19GVUxMX0FWRwkJCTB4MzkKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfVFlQRQkJCQkweDNBCisjZGVmaW5lIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1NDT1BFCQkJCTB4M0IKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX1RFUk1fQ1VSUkVOVAkJMHgzQworI2RlZmluZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DQUxJQlJBVEUJCQkJMHgzRAorCV9fdTgJaXNfd3JpdGVhYmxlOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3Bvd2VyX3N1cHBseV9nZXRfcHJvcGVydHlfZGVzY3JpcHRvcnNfcmVxdWVzdCB7CisJX191OAlwc3lfaWQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5X2dldF9wcm9wZXJ0eV9kZXNjcmlwdG9yc19yZXNwb25zZSB7CisJX191OAlwcm9wZXJ0aWVzX2NvdW50OworCXN0cnVjdCBnYl9wb3dlcl9zdXBwbHlfcHJvcHNfZGVzYyBwcm9wc1tdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3Bvd2VyX3N1cHBseV9nZXRfcHJvcGVydHlfcmVxdWVzdCB7CisJX191OAlwc3lfaWQ7CisJX191OAlwcm9wZXJ0eTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9wb3dlcl9zdXBwbHlfZ2V0X3Byb3BlcnR5X3Jlc3BvbnNlIHsKKwlfX2xlMzIJcHJvcF92YWw7Cit9OworCitzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5X3NldF9wcm9wZXJ0eV9yZXF1ZXN0IHsKKwlfX3U4CXBzeV9pZDsKKwlfX3U4CXByb3BlcnR5OworCV9fbGUzMglwcm9wX3ZhbDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9wb3dlcl9zdXBwbHlfZXZlbnRfcmVxdWVzdCB7CisJX191OAlwc3lfaWQ7CisJX191OAlldmVudDsKKyNkZWZpbmUgR0JfUE9XRVJfU1VQUExZX1VQREFURQkJMHgwMQorfSBfX3BhY2tlZDsKKworCisvKiBISUQgKi8KKworLyogR3JleWJ1cyBISUQgb3BlcmF0aW9uIHR5cGVzICovCisjZGVmaW5lIEdCX0hJRF9UWVBFX0dFVF9ERVNDCQkweDAyCisjZGVmaW5lIEdCX0hJRF9UWVBFX0dFVF9SRVBPUlRfREVTQwkweDAzCisjZGVmaW5lIEdCX0hJRF9UWVBFX1BXUl9PTgkJMHgwNAorI2RlZmluZSBHQl9ISURfVFlQRV9QV1JfT0ZGCQkweDA1CisjZGVmaW5lIEdCX0hJRF9UWVBFX0dFVF9SRVBPUlQJCTB4MDYKKyNkZWZpbmUgR0JfSElEX1RZUEVfU0VUX1JFUE9SVAkJMHgwNworI2RlZmluZSBHQl9ISURfVFlQRV9JUlFfRVZFTlQJCTB4MDgKKworLyogUmVwb3J0IHR5cGUgKi8KKyNkZWZpbmUgR0JfSElEX0lOUFVUX1JFUE9SVAkJMAorI2RlZmluZSBHQl9ISURfT1VUUFVUX1JFUE9SVAkJMQorI2RlZmluZSBHQl9ISURfRkVBVFVSRV9SRVBPUlQJCTIKKworLyogRGlmZmVyZW50IHJlcXVlc3QvcmVzcG9uc2Ugc3RydWN0dXJlcyAqLworLyogSElEIGdldCBkZXNjcmlwdG9yIHJlc3BvbnNlICovCitzdHJ1Y3QgZ2JfaGlkX2Rlc2NfcmVzcG9uc2UgeworCV9fdTgJCQkJYkxlbmd0aDsKKwlfX2xlMTYJCQkJd1JlcG9ydERlc2NMZW5ndGg7CisJX19sZTE2CQkJCWJjZEhJRDsKKwlfX2xlMTYJCQkJd1Byb2R1Y3RJRDsKKwlfX2xlMTYJCQkJd1ZlbmRvcklEOworCV9fdTgJCQkJYkNvdW50cnlDb2RlOworfSBfX3BhY2tlZDsKKworLyogSElEIGdldCByZXBvcnQgcmVxdWVzdC9yZXNwb25zZSAqLworc3RydWN0IGdiX2hpZF9nZXRfcmVwb3J0X3JlcXVlc3QgeworCV9fdTgJCQkJcmVwb3J0X3R5cGU7CisJX191OAkJCQlyZXBvcnRfaWQ7Cit9IF9fcGFja2VkOworCisvKiBISUQgc2V0IHJlcG9ydCByZXF1ZXN0ICovCitzdHJ1Y3QgZ2JfaGlkX3NldF9yZXBvcnRfcmVxdWVzdCB7CisJX191OAkJCQlyZXBvcnRfdHlwZTsKKwlfX3U4CQkJCXJlcG9ydF9pZDsKKwlfX3U4CQkJCXJlcG9ydFswXTsKK30gX19wYWNrZWQ7CisKKy8qIEhJRCBpbnB1dCByZXBvcnQgcmVxdWVzdCwgdmlhIGludGVycnVwdCBwaXBlICovCitzdHJ1Y3QgZ2JfaGlkX2lucHV0X3JlcG9ydF9yZXF1ZXN0IHsKKwlfX3U4CQkJCXJlcG9ydFswXTsKK30gX19wYWNrZWQ7CisKKworLyogSTJDICovCisKKy8qIEdyZXlidXMgaTJjIHJlcXVlc3QgdHlwZXMgKi8KKyNkZWZpbmUgR0JfSTJDX1RZUEVfRlVOQ1RJT05BTElUWQkweDAyCisjZGVmaW5lIEdCX0kyQ19UWVBFX1RSQU5TRkVSCQkweDA1CisKKy8qIGZ1bmN0aW9uYWxpdHkgcmVxdWVzdCBoYXMgbm8gcGF5bG9hZCAqLworc3RydWN0IGdiX2kyY19mdW5jdGlvbmFsaXR5X3Jlc3BvbnNlIHsKKwlfX2xlMzIJZnVuY3Rpb25hbGl0eTsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBPdXRnb2luZyBkYXRhIGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlIG9wIGNvdW50IGFuZCBvcHMgYXJyYXkuCisgKiBUaGUgZGF0YSBmb3IgZWFjaCB3cml0ZSAobWFzdGVyIC0+IHNsYXZlKSBvcCBpbiB0aGUgYXJyYXkgaXMgc2VudAorICogaW4gb3JkZXIsIHdpdGggbm8gKGUuZy4gcGFkKSBieXRlcyBzZXBhcmF0aW5nIHRoZW0uCisgKgorICogU2hvcnQgcmVhZHMgY2F1c2UgdGhlIGVudGlyZSB0cmFuc2ZlciByZXF1ZXN0IHRvIGZhaWwgU28gcmVzcG9uc2UKKyAqIHBheWxvYWQgY29uc2lzdHMgb25seSBvZiBieXRlcyByZWFkLCBhbmQgdGhlIG51bWJlciBvZiBieXRlcyBpcworICogZXhhY3RseSB3aGF0IHdhcyBzcGVjaWZpZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgb3AuICBMaWtlCisgKiBvdXRnb2luZyBkYXRhLCB0aGUgaW5jb21pbmcgZGF0YSBpcyBpbiBvcmRlciBhbmQgY29udGlndW91cy4KKyAqLworc3RydWN0IGdiX2kyY190cmFuc2Zlcl9vcCB7CisJX19sZTE2CWFkZHI7CisJX19sZTE2CWZsYWdzOworCV9fbGUxNglzaXplOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2kyY190cmFuc2Zlcl9yZXF1ZXN0IHsKKwlfX2xlMTYJCQkJb3BfY291bnQ7CisJc3RydWN0IGdiX2kyY190cmFuc2Zlcl9vcAlvcHNbMF07CQkvKiBvcF9jb3VudCBvZiB0aGVzZSAqLworfSBfX3BhY2tlZDsKK3N0cnVjdCBnYl9pMmNfdHJhbnNmZXJfcmVzcG9uc2UgeworCV9fdTgJCQkJZGF0YVswXTsJLyogaW5ib3VuZCBkYXRhICovCit9IF9fcGFja2VkOworCisKKy8qIEdQSU8gKi8KKworLyogR3JleWJ1cyBHUElPIHJlcXVlc3QgdHlwZXMgKi8KKyNkZWZpbmUgR0JfR1BJT19UWVBFX0xJTkVfQ09VTlQJCTB4MDIKKyNkZWZpbmUgR0JfR1BJT19UWVBFX0FDVElWQVRFCQkweDAzCisjZGVmaW5lIEdCX0dQSU9fVFlQRV9ERUFDVElWQVRFCQkweDA0CisjZGVmaW5lIEdCX0dQSU9fVFlQRV9HRVRfRElSRUNUSU9OCTB4MDUKKyNkZWZpbmUgR0JfR1BJT19UWVBFX0RJUkVDVElPTl9JTgkweDA2CisjZGVmaW5lIEdCX0dQSU9fVFlQRV9ESVJFQ1RJT05fT1VUCTB4MDcKKyNkZWZpbmUgR0JfR1BJT19UWVBFX0dFVF9WQUxVRQkJMHgwOAorI2RlZmluZSBHQl9HUElPX1RZUEVfU0VUX1ZBTFVFCQkweDA5CisjZGVmaW5lIEdCX0dQSU9fVFlQRV9TRVRfREVCT1VOQ0UJMHgwYQorI2RlZmluZSBHQl9HUElPX1RZUEVfSVJRX1RZUEUJCTB4MGIKKyNkZWZpbmUgR0JfR1BJT19UWVBFX0lSUV9NQVNLCQkweDBjCisjZGVmaW5lIEdCX0dQSU9fVFlQRV9JUlFfVU5NQVNLCQkweDBkCisjZGVmaW5lIEdCX0dQSU9fVFlQRV9JUlFfRVZFTlQJCTB4MGUKKworI2RlZmluZSBHQl9HUElPX0lSUV9UWVBFX05PTkUJCTB4MDAKKyNkZWZpbmUgR0JfR1BJT19JUlFfVFlQRV9FREdFX1JJU0lORwkweDAxCisjZGVmaW5lIEdCX0dQSU9fSVJRX1RZUEVfRURHRV9GQUxMSU5HCTB4MDIKKyNkZWZpbmUgR0JfR1BJT19JUlFfVFlQRV9FREdFX0JPVEgJMHgwMworI2RlZmluZSBHQl9HUElPX0lSUV9UWVBFX0xFVkVMX0hJR0gJMHgwNAorI2RlZmluZSBHQl9HUElPX0lSUV9UWVBFX0xFVkVMX0xPVwkweDA4CisKKy8qIGxpbmUgY291bnQgcmVxdWVzdCBoYXMgbm8gcGF5bG9hZCAqLworc3RydWN0IGdiX2dwaW9fbGluZV9jb3VudF9yZXNwb25zZSB7CisJX191OAljb3VudDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9ncGlvX2FjdGl2YXRlX3JlcXVlc3QgeworCV9fdTgJd2hpY2g7Cit9IF9fcGFja2VkOworLyogYWN0aXZhdGUgcmVzcG9uc2UgaGFzIG5vIHBheWxvYWQgKi8KKworc3RydWN0IGdiX2dwaW9fZGVhY3RpdmF0ZV9yZXF1ZXN0IHsKKwlfX3U4CXdoaWNoOworfSBfX3BhY2tlZDsKKy8qIGRlYWN0aXZhdGUgcmVzcG9uc2UgaGFzIG5vIHBheWxvYWQgKi8KKworc3RydWN0IGdiX2dwaW9fZ2V0X2RpcmVjdGlvbl9yZXF1ZXN0IHsKKwlfX3U4CXdoaWNoOworfSBfX3BhY2tlZDsKK3N0cnVjdCBnYl9ncGlvX2dldF9kaXJlY3Rpb25fcmVzcG9uc2UgeworCV9fdTgJZGlyZWN0aW9uOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2dwaW9fZGlyZWN0aW9uX2luX3JlcXVlc3QgeworCV9fdTgJd2hpY2g7Cit9IF9fcGFja2VkOworLyogZGlyZWN0aW9uIGluIHJlc3BvbnNlIGhhcyBubyBwYXlsb2FkICovCisKK3N0cnVjdCBnYl9ncGlvX2RpcmVjdGlvbl9vdXRfcmVxdWVzdCB7CisJX191OAl3aGljaDsKKwlfX3U4CXZhbHVlOworfSBfX3BhY2tlZDsKKy8qIGRpcmVjdGlvbiBvdXQgcmVzcG9uc2UgaGFzIG5vIHBheWxvYWQgKi8KKworc3RydWN0IGdiX2dwaW9fZ2V0X3ZhbHVlX3JlcXVlc3QgeworCV9fdTgJd2hpY2g7Cit9IF9fcGFja2VkOworc3RydWN0IGdiX2dwaW9fZ2V0X3ZhbHVlX3Jlc3BvbnNlIHsKKwlfX3U4CXZhbHVlOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2dwaW9fc2V0X3ZhbHVlX3JlcXVlc3QgeworCV9fdTgJd2hpY2g7CisJX191OAl2YWx1ZTsKK30gX19wYWNrZWQ7CisvKiBzZXQgdmFsdWUgcmVzcG9uc2UgaGFzIG5vIHBheWxvYWQgKi8KKworc3RydWN0IGdiX2dwaW9fc2V0X2RlYm91bmNlX3JlcXVlc3QgeworCV9fdTgJd2hpY2g7CisJX19sZTE2CXVzZWM7Cit9IF9fcGFja2VkOworLyogZGVib3VuY2UgcmVzcG9uc2UgaGFzIG5vIHBheWxvYWQgKi8KKworc3RydWN0IGdiX2dwaW9faXJxX3R5cGVfcmVxdWVzdCB7CisJX191OAl3aGljaDsKKwlfX3U4CXR5cGU7Cit9IF9fcGFja2VkOworLyogaXJxIHR5cGUgcmVzcG9uc2UgaGFzIG5vIHBheWxvYWQgKi8KKworc3RydWN0IGdiX2dwaW9faXJxX21hc2tfcmVxdWVzdCB7CisJX191OAl3aGljaDsKK30gX19wYWNrZWQ7CisvKiBpcnEgbWFzayByZXNwb25zZSBoYXMgbm8gcGF5bG9hZCAqLworCitzdHJ1Y3QgZ2JfZ3Bpb19pcnFfdW5tYXNrX3JlcXVlc3QgeworCV9fdTgJd2hpY2g7Cit9IF9fcGFja2VkOworLyogaXJxIHVubWFzayByZXNwb25zZSBoYXMgbm8gcGF5bG9hZCAqLworCisvKiBpcnEgZXZlbnQgcmVxdWVzdHMgb3JpZ2luYXRlIG9uIGFub3RoZXIgbW9kdWxlIGFuZCBhcmUgaGFuZGxlZCBvbiB0aGUgQVAgKi8KK3N0cnVjdCBnYl9ncGlvX2lycV9ldmVudF9yZXF1ZXN0IHsKKwlfX3U4CXdoaWNoOworfSBfX3BhY2tlZDsKKy8qIGlycSBldmVudCBoYXMgbm8gcmVzcG9uc2UgKi8KKworCisvKiBQV00gKi8KKworLyogR3JleWJ1cyBQV00gb3BlcmF0aW9uIHR5cGVzICovCisjZGVmaW5lIEdCX1BXTV9UWVBFX1BXTV9DT1VOVAkJMHgwMgorI2RlZmluZSBHQl9QV01fVFlQRV9BQ1RJVkFURQkJMHgwMworI2RlZmluZSBHQl9QV01fVFlQRV9ERUFDVElWQVRFCQkweDA0CisjZGVmaW5lIEdCX1BXTV9UWVBFX0NPTkZJRwkJMHgwNQorI2RlZmluZSBHQl9QV01fVFlQRV9QT0xBUklUWQkJMHgwNgorI2RlZmluZSBHQl9QV01fVFlQRV9FTkFCTEUJCTB4MDcKKyNkZWZpbmUgR0JfUFdNX1RZUEVfRElTQUJMRQkJMHgwOAorCisvKiBwd20gY291bnQgcmVxdWVzdCBoYXMgbm8gcGF5bG9hZCAqLworc3RydWN0IGdiX3B3bV9jb3VudF9yZXNwb25zZSB7CisJX191OAljb3VudDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9wd21fYWN0aXZhdGVfcmVxdWVzdCB7CisJX191OAl3aGljaDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9wd21fZGVhY3RpdmF0ZV9yZXF1ZXN0IHsKKwlfX3U4CXdoaWNoOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3B3bV9jb25maWdfcmVxdWVzdCB7CisJX191OAl3aGljaDsKKwlfX2xlMzIJZHV0eTsKKwlfX2xlMzIJcGVyaW9kOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3B3bV9wb2xhcml0eV9yZXF1ZXN0IHsKKwlfX3U4CXdoaWNoOworCV9fdTgJcG9sYXJpdHk7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfcHdtX2VuYWJsZV9yZXF1ZXN0IHsKKwlfX3U4CXdoaWNoOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3B3bV9kaXNhYmxlX3JlcXVlc3QgeworCV9fdTgJd2hpY2g7Cit9IF9fcGFja2VkOworCisvKiBTUEkgKi8KKworLyogU2hvdWxkIG1hdGNoIHVwIHdpdGggbW9kZXMgaW4gbGludXgvc3BpL3NwaS5oICovCisjZGVmaW5lIEdCX1NQSV9NT0RFX0NQSEEJCTB4MDEJCS8qIGNsb2NrIHBoYXNlICovCisjZGVmaW5lIEdCX1NQSV9NT0RFX0NQT0wJCTB4MDIJCS8qIGNsb2NrIHBvbGFyaXR5ICovCisjZGVmaW5lIEdCX1NQSV9NT0RFX01PREVfMAkJKDB8MCkJCS8qIChvcmlnaW5hbCBNaWNyb1dpcmUpICovCisjZGVmaW5lIEdCX1NQSV9NT0RFX01PREVfMQkJKDB8R0JfU1BJX01PREVfQ1BIQSkKKyNkZWZpbmUgR0JfU1BJX01PREVfTU9ERV8yCQkoR0JfU1BJX01PREVfQ1BPTHwwKQorI2RlZmluZSBHQl9TUElfTU9ERV9NT0RFXzMJCShHQl9TUElfTU9ERV9DUE9MfEdCX1NQSV9NT0RFX0NQSEEpCisjZGVmaW5lIEdCX1NQSV9NT0RFX0NTX0hJR0gJCTB4MDQJCS8qIGNoaXBzZWxlY3QgYWN0aXZlIGhpZ2g/ICovCisjZGVmaW5lIEdCX1NQSV9NT0RFX0xTQl9GSVJTVAkJMHgwOAkJLyogcGVyLXdvcmQgYml0cy1vbi13aXJlICovCisjZGVmaW5lIEdCX1NQSV9NT0RFXzNXSVJFCQkweDEwCQkvKiBTSS9TTyBzaWduYWxzIHNoYXJlZCAqLworI2RlZmluZSBHQl9TUElfTU9ERV9MT09QCQkweDIwCQkvKiBsb29wYmFjayBtb2RlICovCisjZGVmaW5lIEdCX1NQSV9NT0RFX05PX0NTCQkweDQwCQkvKiAxIGRldi9idXMsIG5vIGNoaXBzZWxlY3QgKi8KKyNkZWZpbmUgR0JfU1BJX01PREVfUkVBRFkJCTB4ODAJCS8qIHNsYXZlIHB1bGxzIGxvdyB0byBwYXVzZSAqLworCisvKiBTaG91bGQgbWF0Y2ggdXAgd2l0aCBmbGFncyBpbiBsaW51eC9zcGkvc3BpLmggKi8KKyNkZWZpbmUgR0JfU1BJX0ZMQUdfSEFMRl9EVVBMRVgJCUJJVCgwKQkJLyogY2FuJ3QgZG8gZnVsbCBkdXBsZXggKi8KKyNkZWZpbmUgR0JfU1BJX0ZMQUdfTk9fUlgJCUJJVCgxKQkJLyogY2FuJ3QgZG8gYnVmZmVyIHJlYWQgKi8KKyNkZWZpbmUgR0JfU1BJX0ZMQUdfTk9fVFgJCUJJVCgyKQkJLyogY2FuJ3QgZG8gYnVmZmVyIHdyaXRlICovCisKKy8qIEdyZXlidXMgc3BpIG9wZXJhdGlvbiB0eXBlcyAqLworI2RlZmluZSBHQl9TUElfVFlQRV9NQVNURVJfQ09ORklHCTB4MDIKKyNkZWZpbmUgR0JfU1BJX1RZUEVfREVWSUNFX0NPTkZJRwkweDAzCisjZGVmaW5lIEdCX1NQSV9UWVBFX1RSQU5TRkVSCQkweDA0CisKKy8qIG1vZGUgcmVxdWVzdCBoYXMgbm8gcGF5bG9hZCAqLworc3RydWN0IGdiX3NwaV9tYXN0ZXJfY29uZmlnX3Jlc3BvbnNlIHsKKwlfX2xlMzIJYml0c19wZXJfd29yZF9tYXNrOworCV9fbGUzMgltaW5fc3BlZWRfaHo7CisJX19sZTMyCW1heF9zcGVlZF9oejsKKwlfX2xlMTYJbW9kZTsKKwlfX2xlMTYJZmxhZ3M7CisJX191OAludW1fY2hpcHNlbGVjdDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9zcGlfZGV2aWNlX2NvbmZpZ19yZXF1ZXN0IHsKKwlfX3U4CWNoaXBfc2VsZWN0OworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3NwaV9kZXZpY2VfY29uZmlnX3Jlc3BvbnNlIHsKKwlfX2xlMTYJbW9kZTsKKwlfX3U4CWJpdHNfcGVyX3dvcmQ7CisJX19sZTMyCW1heF9zcGVlZF9oejsKKwlfX3U4CWRldmljZV90eXBlOworI2RlZmluZSBHQl9TUElfU1BJX0RFVgkJMHgwMAorI2RlZmluZSBHQl9TUElfU1BJX05PUgkJMHgwMQorI2RlZmluZSBHQl9TUElfU1BJX01PREFMSUFTCTB4MDIKKwlfX3U4CW5hbWVbMzJdOworfSBfX3BhY2tlZDsKKworLyoqCisgKiBzdHJ1Y3QgZ2Jfc3BpX3RyYW5zZmVyIC0gYSByZWFkL3dyaXRlIGJ1ZmZlciBwYWlyCisgKiBAc3BlZWRfaHo6IFNlbGVjdCBhIHNwZWVkIG90aGVyIHRoYW4gdGhlIGRldmljZSBkZWZhdWx0IGZvciB0aGlzIHRyYW5zZmVyLiBJZgorICoJMCB0aGUgZGVmYXVsdCAoZnJvbSBAc3BpX2RldmljZSkgaXMgdXNlZC4KKyAqIEBsZW46IHNpemUgb2YgcnggYW5kIHR4IGJ1ZmZlcnMgKGluIGJ5dGVzKQorICogQGRlbGF5X3VzZWNzOiBtaWNyb3NlY29uZHMgdG8gZGVsYXkgYWZ0ZXIgdGhpcyB0cmFuc2ZlciBiZWZvcmUgKG9wdGlvbmFsbHkpCisgKiAJY2hhbmdpbmcgdGhlIGNoaXBzZWxlY3Qgc3RhdHVzLCB0aGVuIHN0YXJ0aW5nIHRoZSBuZXh0IHRyYW5zZmVyIG9yCisgKiAJY29tcGxldGluZyB0aGlzIHNwaV9tZXNzYWdlLgorICogQGNzX2NoYW5nZTogYWZmZWN0cyBjaGlwc2VsZWN0IGFmdGVyIHRoaXMgdHJhbnNmZXIgY29tcGxldGVzCisgKiBAYml0c19wZXJfd29yZDogc2VsZWN0IGEgYml0c19wZXJfd29yZCBvdGhlciB0aGFuIHRoZSBkZXZpY2UgZGVmYXVsdCBmb3IgdGhpcworICoJdHJhbnNmZXIuIElmIDAgdGhlIGRlZmF1bHQgKGZyb20gQHNwaV9kZXZpY2UpIGlzIHVzZWQuCisgKi8KK3N0cnVjdCBnYl9zcGlfdHJhbnNmZXIgeworCV9fbGUzMgkJc3BlZWRfaHo7CisJX19sZTMyCQlsZW47CisJX19sZTE2CQlkZWxheV91c2VjczsKKwlfX3U4CQljc19jaGFuZ2U7CisJX191OAkJYml0c19wZXJfd29yZDsKKwlfX3U4CQl4ZmVyX2ZsYWdzOworI2RlZmluZSBHQl9TUElfWEZFUl9SRUFECTB4MDEKKyNkZWZpbmUgR0JfU1BJX1hGRVJfV1JJVEUJMHgwMgorI2RlZmluZSBHQl9TUElfWEZFUl9JTlBST0dSRVNTCTB4MDQKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9zcGlfdHJhbnNmZXJfcmVxdWVzdCB7CisJX191OAkJCWNoaXBfc2VsZWN0OwkvKiBvZiB0aGUgc3BpIGRldmljZSAqLworCV9fdTgJCQltb2RlOwkJLyogb2YgdGhlIHNwaSBkZXZpY2UgKi8KKwlfX2xlMTYJCQljb3VudDsKKwlzdHJ1Y3QgZ2Jfc3BpX3RyYW5zZmVyCXRyYW5zZmVyc1swXTsJLyogY291bnQgb2YgdGhlc2UgKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9zcGlfdHJhbnNmZXJfcmVzcG9uc2UgeworCV9fdTgJCQlkYXRhWzBdOwkvKiBpbmJvdW5kIGRhdGEgKi8KK30gX19wYWNrZWQ7CisKKy8qIFZlcnNpb24gb2YgdGhlIEdyZXlidXMgU1ZDIHByb3RvY29sIHdlIHN1cHBvcnQgKi8KKyNkZWZpbmUgR0JfU1ZDX1ZFUlNJT05fTUFKT1IJCTB4MDAKKyNkZWZpbmUgR0JfU1ZDX1ZFUlNJT05fTUlOT1IJCTB4MDEKKworLyogR3JleWJ1cyBTVkMgcmVxdWVzdCB0eXBlcyAqLworI2RlZmluZSBHQl9TVkNfVFlQRV9QUk9UT0NPTF9WRVJTSU9OCQkweDAxCisjZGVmaW5lIEdCX1NWQ19UWVBFX1NWQ19IRUxMTwkJCTB4MDIKKyNkZWZpbmUgR0JfU1ZDX1RZUEVfSU5URl9ERVZJQ0VfSUQJCTB4MDMKKyNkZWZpbmUgR0JfU1ZDX1RZUEVfSU5URl9SRVNFVAkJCTB4MDYKKyNkZWZpbmUgR0JfU1ZDX1RZUEVfQ09OTl9DUkVBVEUJCQkweDA3CisjZGVmaW5lIEdCX1NWQ19UWVBFX0NPTk5fREVTVFJPWQkJMHgwOAorI2RlZmluZSBHQl9TVkNfVFlQRV9ETUVfUEVFUl9HRVQJCTB4MDkKKyNkZWZpbmUgR0JfU1ZDX1RZUEVfRE1FX1BFRVJfU0VUCQkweDBhCisjZGVmaW5lIEdCX1NWQ19UWVBFX1JPVVRFX0NSRUFURQkJMHgwYgorI2RlZmluZSBHQl9TVkNfVFlQRV9ST1VURV9ERVNUUk9ZCQkweDBjCisjZGVmaW5lIEdCX1NWQ19UWVBFX1RJTUVTWU5DX0VOQUJMRQkJMHgwZAorI2RlZmluZSBHQl9TVkNfVFlQRV9USU1FU1lOQ19ESVNBQkxFCQkweDBlCisjZGVmaW5lIEdCX1NWQ19UWVBFX1RJTUVTWU5DX0FVVEhPUklUQVRJVkUJMHgwZgorI2RlZmluZSBHQl9TVkNfVFlQRV9JTlRGX1NFVF9QV1JNCQkweDEwCisjZGVmaW5lIEdCX1NWQ19UWVBFX0lOVEZfRUpFQ1QJCQkweDExCisjZGVmaW5lIEdCX1NWQ19UWVBFX1BJTkcJCQkweDEzCisjZGVmaW5lIEdCX1NWQ19UWVBFX1BXUk1PTl9SQUlMX0NPVU5UX0dFVAkweDE0CisjZGVmaW5lIEdCX1NWQ19UWVBFX1BXUk1PTl9SQUlMX05BTUVTX0dFVAkweDE1CisjZGVmaW5lIEdCX1NWQ19UWVBFX1BXUk1PTl9TQU1QTEVfR0VUCQkweDE2CisjZGVmaW5lIEdCX1NWQ19UWVBFX1BXUk1PTl9JTlRGX1NBTVBMRV9HRVQJMHgxNworI2RlZmluZSBHQl9TVkNfVFlQRV9USU1FU1lOQ19XQUtFX1BJTlNfQUNRVUlSRQkweDE4CisjZGVmaW5lIEdCX1NWQ19UWVBFX1RJTUVTWU5DX1dBS0VfUElOU19SRUxFQVNFCTB4MTkKKyNkZWZpbmUgR0JfU1ZDX1RZUEVfVElNRVNZTkNfUElORwkJMHgxYQorI2RlZmluZSBHQl9TVkNfVFlQRV9NT0RVTEVfSU5TRVJURUQJCTB4MWYKKyNkZWZpbmUgR0JfU1ZDX1RZUEVfTU9EVUxFX1JFTU9WRUQJCTB4MjAKKyNkZWZpbmUgR0JfU1ZDX1RZUEVfSU5URl9WU1lTX0VOQUJMRQkJMHgyMQorI2RlZmluZSBHQl9TVkNfVFlQRV9JTlRGX1ZTWVNfRElTQUJMRQkJMHgyMgorI2RlZmluZSBHQl9TVkNfVFlQRV9JTlRGX1JFRkNMS19FTkFCTEUJCTB4MjMKKyNkZWZpbmUgR0JfU1ZDX1RZUEVfSU5URl9SRUZDTEtfRElTQUJMRQkJMHgyNAorI2RlZmluZSBHQl9TVkNfVFlQRV9JTlRGX1VOSVBST19FTkFCTEUJCTB4MjUKKyNkZWZpbmUgR0JfU1ZDX1RZUEVfSU5URl9VTklQUk9fRElTQUJMRQkJMHgyNgorI2RlZmluZSBHQl9TVkNfVFlQRV9JTlRGX0FDVElWQVRFCQkweDI3CisjZGVmaW5lIEdCX1NWQ19UWVBFX0lOVEZfUkVTVU1FCQkJMHgyOAorI2RlZmluZSBHQl9TVkNfVFlQRV9JTlRGX01BSUxCT1hfRVZFTlQJCTB4MjkKKyNkZWZpbmUgR0JfU1ZDX1RZUEVfSU5URl9PT1BTCQkJMHgyYQorCisvKiBHcmV5YnVzIFNWQyBwcm90b2NvbCBzdGF0dXMgdmFsdWVzICovCisjZGVmaW5lIEdCX1NWQ19PUF9TVUNDRVNTCQkJMHgwMAorI2RlZmluZSBHQl9TVkNfT1BfVU5LTk9XTl9FUlJPUgkJCTB4MDEKKyNkZWZpbmUgR0JfU1ZDX0lOVEZfTk9UX0RFVEVDVEVECQkweDAyCisjZGVmaW5lIEdCX1NWQ19JTlRGX05PX1VQUk9fTElOSwkJMHgwMworI2RlZmluZSBHQl9TVkNfSU5URl9VUFJPX05PVF9ET1dOCQkweDA0CisjZGVmaW5lIEdCX1NWQ19JTlRGX1VQUk9fTk9UX0hJQkVSTkFURUQJCTB4MDUKKyNkZWZpbmUgR0JfU1ZDX0lOVEZfTk9fVl9TWVMJCQkweDA2CisjZGVmaW5lIEdCX1NWQ19JTlRGX1ZfQ0hHCQkJMHgwNworI2RlZmluZSBHQl9TVkNfSU5URl9XQUtFX0JVU1kJCQkweDA4CisjZGVmaW5lIEdCX1NWQ19JTlRGX05PX1JFRkNMSwkJCTB4MDkKKyNkZWZpbmUgR0JfU1ZDX0lOVEZfUkVMRUFTSU5HCQkJMHgwYQorI2RlZmluZSBHQl9TVkNfSU5URl9OT19PUkRFUgkJCTB4MGIKKyNkZWZpbmUgR0JfU1ZDX0lOVEZfTUJPWF9TRVQJCQkweDBjCisjZGVmaW5lIEdCX1NWQ19JTlRGX0JBRF9NQk9YCQkJMHgwZAorI2RlZmluZSBHQl9TVkNfSU5URl9PUF9USU1FT1VUCQkJMHgwZQorI2RlZmluZSBHQl9TVkNfUFdSTU9OX09QX05PVF9QUkVTRU5UCQkweDBmCisKK3N0cnVjdCBnYl9zdmNfdmVyc2lvbl9yZXF1ZXN0IHsKKwlfX3U4CW1ham9yOworCV9fdTgJbWlub3I7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2Jfc3ZjX3ZlcnNpb25fcmVzcG9uc2UgeworCV9fdTgJbWFqb3I7CisJX191OAltaW5vcjsKK30gX19wYWNrZWQ7CisKKy8qIFNWQyBwcm90b2NvbCBoZWxsbyByZXF1ZXN0ICovCitzdHJ1Y3QgZ2Jfc3ZjX2hlbGxvX3JlcXVlc3QgeworCV9fbGUxNgkJCWVuZG9faWQ7CisJX191OAkJCWludGVyZmFjZV9pZDsKK30gX19wYWNrZWQ7CisvKiBoZWxsbyByZXNwb25zZSBoYXMgbm8gcGF5bG9hZCAqLworCitzdHJ1Y3QgZ2Jfc3ZjX2ludGZfZGV2aWNlX2lkX3JlcXVlc3QgeworCV9fdTgJaW50Zl9pZDsKKwlfX3U4CWRldmljZV9pZDsKK30gX19wYWNrZWQ7CisvKiBkZXZpY2UgaWQgcmVzcG9uc2UgaGFzIG5vIHBheWxvYWQgKi8KKworc3RydWN0IGdiX3N2Y19pbnRmX3Jlc2V0X3JlcXVlc3QgeworCV9fdTgJaW50Zl9pZDsKK30gX19wYWNrZWQ7CisvKiBpbnRlcmZhY2UgcmVzZXQgcmVzcG9uc2UgaGFzIG5vIHBheWxvYWQgKi8KKworc3RydWN0IGdiX3N2Y19pbnRmX2VqZWN0X3JlcXVlc3QgeworCV9fdTgJaW50Zl9pZDsKK30gX19wYWNrZWQ7CisvKiBpbnRlcmZhY2UgZWplY3QgcmVzcG9uc2UgaGFzIG5vIHBheWxvYWQgKi8KKworc3RydWN0IGdiX3N2Y19jb25uX2NyZWF0ZV9yZXF1ZXN0IHsKKwlfX3U4CWludGYxX2lkOworCV9fbGUxNgljcG9ydDFfaWQ7CisJX191OAlpbnRmMl9pZDsKKwlfX2xlMTYJY3BvcnQyX2lkOworCV9fdTgJdGM7CisJX191OAlmbGFnczsKK30gX19wYWNrZWQ7CisvKiBjb25uZWN0aW9uIGNyZWF0ZSByZXNwb25zZSBoYXMgbm8gcGF5bG9hZCAqLworCitzdHJ1Y3QgZ2Jfc3ZjX2Nvbm5fZGVzdHJveV9yZXF1ZXN0IHsKKwlfX3U4CWludGYxX2lkOworCV9fbGUxNgljcG9ydDFfaWQ7CisJX191OAlpbnRmMl9pZDsKKwlfX2xlMTYJY3BvcnQyX2lkOworfSBfX3BhY2tlZDsKKy8qIGNvbm5lY3Rpb24gZGVzdHJveSByZXNwb25zZSBoYXMgbm8gcGF5bG9hZCAqLworCitzdHJ1Y3QgZ2Jfc3ZjX2RtZV9wZWVyX2dldF9yZXF1ZXN0IHsKKwlfX3U4CWludGZfaWQ7CisJX19sZTE2CWF0dHI7CisJX19sZTE2CXNlbGVjdG9yOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3N2Y19kbWVfcGVlcl9nZXRfcmVzcG9uc2UgeworCV9fbGUxNglyZXN1bHRfY29kZTsKKwlfX2xlMzIJYXR0cl92YWx1ZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9zdmNfZG1lX3BlZXJfc2V0X3JlcXVlc3QgeworCV9fdTgJaW50Zl9pZDsKKwlfX2xlMTYJYXR0cjsKKwlfX2xlMTYJc2VsZWN0b3I7CisJX19sZTMyCXZhbHVlOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3N2Y19kbWVfcGVlcl9zZXRfcmVzcG9uc2UgeworCV9fbGUxNglyZXN1bHRfY29kZTsKK30gX19wYWNrZWQ7CisKKy8qIEdyZXlidXMgaW5pdC1zdGF0dXMgdmFsdWVzLCBjdXJyZW50bHkgcmV0cmlldmVkIHVzaW5nIERNRSBwZWVyIGdldHMuICovCisjZGVmaW5lIEdCX0lOSVRfU1BJX0JPT1RfU1RBUlRFRAkJCTB4MDIKKyNkZWZpbmUgR0JfSU5JVF9UUlVTVEVEX1NQSV9CT09UX0ZJTklTSEVECQkweDAzCisjZGVmaW5lIEdCX0lOSVRfVU5UUlVTVEVEX1NQSV9CT09UX0ZJTklTSEVECQkweDA0CisjZGVmaW5lIEdCX0lOSVRfQk9PVFJPTV9VTklQUk9fQk9PVF9TVEFSVEVECQkweDA2CisjZGVmaW5lIEdCX0lOSVRfQk9PVFJPTV9GQUxMQkFDS19VTklQUk9fQk9PVF9TVEFSVEVECTB4MDkKKyNkZWZpbmUgR0JfSU5JVF9TMl9MT0FERVJfQk9PVF9TVEFSVEVECQkJMHgwRAorCitzdHJ1Y3QgZ2Jfc3ZjX3JvdXRlX2NyZWF0ZV9yZXF1ZXN0IHsKKwlfX3U4CWludGYxX2lkOworCV9fdTgJZGV2MV9pZDsKKwlfX3U4CWludGYyX2lkOworCV9fdTgJZGV2Ml9pZDsKK30gX19wYWNrZWQ7CisvKiByb3V0ZSBjcmVhdGUgcmVzcG9uc2UgaGFzIG5vIHBheWxvYWQgKi8KKworc3RydWN0IGdiX3N2Y19yb3V0ZV9kZXN0cm95X3JlcXVlc3QgeworCV9fdTgJaW50ZjFfaWQ7CisJX191OAlpbnRmMl9pZDsKK30gX19wYWNrZWQ7CisvKiByb3V0ZSBkZXN0cm95IHJlc3BvbnNlIGhhcyBubyBwYXlsb2FkICovCisKKy8qIHVzZWQgZm9yIHN2Y19pbnRmX3ZzeXNfe2VuYWJsZSxkaXNhYmxlfSAqLworc3RydWN0IGdiX3N2Y19pbnRmX3ZzeXNfcmVxdWVzdCB7CisJX191OAlpbnRmX2lkOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3N2Y19pbnRmX3ZzeXNfcmVzcG9uc2UgeworCV9fdTgJcmVzdWx0X2NvZGU7CisjZGVmaW5lIEdCX1NWQ19JTlRGX1ZTWVNfT0sJCQkJMHgwMAorCS8qIDB4MDEgaXMgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgR0JfU1ZDX0lOVEZfVlNZU19GQUlMCQkJCTB4MDIKK30gX19wYWNrZWQ7CisKKy8qIHVzZWQgZm9yIHN2Y19pbnRmX3JlZmNsa197ZW5hYmxlLGRpc2FibGV9ICovCitzdHJ1Y3QgZ2Jfc3ZjX2ludGZfcmVmY2xrX3JlcXVlc3QgeworCV9fdTgJaW50Zl9pZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9zdmNfaW50Zl9yZWZjbGtfcmVzcG9uc2UgeworCV9fdTgJcmVzdWx0X2NvZGU7CisjZGVmaW5lIEdCX1NWQ19JTlRGX1JFRkNMS19PSwkJCQkweDAwCisJLyogMHgwMSBpcyByZXNlcnZlZCAqLworI2RlZmluZSBHQl9TVkNfSU5URl9SRUZDTEtfRkFJTAkJCQkweDAyCit9IF9fcGFja2VkOworCisvKiB1c2VkIGZvciBzdmNfaW50Zl91bmlwcm9fe2VuYWJsZSxkaXNhYmxlfSAqLworc3RydWN0IGdiX3N2Y19pbnRmX3VuaXByb19yZXF1ZXN0IHsKKwlfX3U4CWludGZfaWQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2Jfc3ZjX2ludGZfdW5pcHJvX3Jlc3BvbnNlIHsKKwlfX3U4CXJlc3VsdF9jb2RlOworI2RlZmluZSBHQl9TVkNfSU5URl9VTklQUk9fT0sJCQkJMHgwMAorCS8qIDB4MDEgaXMgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgR0JfU1ZDX0lOVEZfVU5JUFJPX0ZBSUwJCQkJMHgwMgorI2RlZmluZSBHQl9TVkNfSU5URl9VTklQUk9fTk9UX09GRgkJCTB4MDMKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9zdmNfdGltZXN5bmNfZW5hYmxlX3JlcXVlc3QgeworCV9fdTgJY291bnQ7CisJX19sZTY0CWZyYW1lX3RpbWU7CisJX19sZTMyCXN0cm9iZV9kZWxheTsKKwlfX2xlMzIJcmVmY2xrOworfSBfX3BhY2tlZDsKKy8qIHRpbWVzeW5jIGVuYWJsZSByZXNwb25zZSBoYXMgbm8gcGF5bG9hZCAqLworCisvKiB0aW1lc3luYyBhdXRob3JpdGF0aXZlIHJlcXVlc3QgaGFzIG5vIHBheWxvYWQgKi8KK3N0cnVjdCBnYl9zdmNfdGltZXN5bmNfYXV0aG9yaXRhdGl2ZV9yZXNwb25zZSB7CisJX19sZTY0CWZyYW1lX3RpbWVbR0JfVElNRVNZTkNfTUFYX1NUUk9CRVNdOworfTsKKworc3RydWN0IGdiX3N2Y190aW1lc3luY193YWtlX3BpbnNfYWNxdWlyZV9yZXF1ZXN0IHsKKwlfX2xlMzIJc3Ryb2JlX21hc2s7Cit9OworCisvKiB0aW1lc3luYyB3YWtlIHBpbnMgYWNxdWlyZSByZXNwb25zZSBoYXMgbm8gcGF5bG9hZCAqLworCisvKiB0aW1lc3luYyB3YWtlIHBpbnMgcmVsZWFzZSByZXF1ZXN0IGhhcyBubyBwYXlsb2FkICovCisvKiB0aW1lc3luYyB3YWtlIHBpbnMgcmVsZWFzZSByZXNwb25zZSBoYXMgbm8gcGF5bG9hZCAqLworCisvKiB0aW1lc3luYyBzdmMgcGluZyByZXF1ZXN0IGhhcyBubyBwYXlsb2FkICovCitzdHJ1Y3QgZ2Jfc3ZjX3RpbWVzeW5jX3BpbmdfcmVzcG9uc2UgeworCV9fbGU2NAlmcmFtZV90aW1lOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBHQl9TVkNfVU5JUFJPX0ZBU1RfTU9ERQkJCTB4MDEKKyNkZWZpbmUgR0JfU1ZDX1VOSVBST19TTE9XX01PREUJCQkweDAyCisjZGVmaW5lIEdCX1NWQ19VTklQUk9fRkFTVF9BVVRPX01PREUJCTB4MDQKKyNkZWZpbmUgR0JfU1ZDX1VOSVBST19TTE9XX0FVVE9fTU9ERQkJMHgwNQorI2RlZmluZSBHQl9TVkNfVU5JUFJPX01PREVfVU5DSEFOR0VECQkweDA3CisjZGVmaW5lIEdCX1NWQ19VTklQUk9fSElCRVJOQVRFX01PREUJCTB4MTEKKyNkZWZpbmUgR0JfU1ZDX1VOSVBST19PRkZfTU9ERQkJCTB4MTIKKworI2RlZmluZSBHQl9TVkNfU01BTExfQU1QTElUVURFICAgICAgICAgIDB4MDEKKyNkZWZpbmUgR0JfU1ZDX0xBUkdFX0FNUExJVFVERSAgICAgICAgICAweDAyCisKKyNkZWZpbmUgR0JfU1ZDX05PX0RFX0VNUEhBU0lTICAgICAgICAgICAweDAwCisjZGVmaW5lIEdCX1NWQ19TTUFMTF9ERV9FTVBIQVNJUyAgICAgICAgMHgwMQorI2RlZmluZSBHQl9TVkNfTEFSR0VfREVfRU1QSEFTSVMgICAgICAgIDB4MDIKKworI2RlZmluZSBHQl9TVkNfUFdSTV9SWFRFUk1JTkFUSU9OCQkweDAxCisjZGVmaW5lIEdCX1NWQ19QV1JNX1RYVEVSTUlOQVRJT04JCTB4MDIKKyNkZWZpbmUgR0JfU1ZDX1BXUk1fTElORV9SRVNFVAkJCTB4MDQKKyNkZWZpbmUgR0JfU1ZDX1BXUk1fU0NSQU1CTElORwkJCTB4MjAKKworI2RlZmluZSBHQl9TVkNfUFdSTV9RVUlSS19IU1NFUgkJCTB4MDAwMDAwMDEKKworI2RlZmluZSBHQl9TVkNfVU5JUFJPX0hTX1NFUklFU19BCQkweDAxCisjZGVmaW5lIEdCX1NWQ19VTklQUk9fSFNfU0VSSUVTX0IJCTB4MDIKKworI2RlZmluZSBHQl9TVkNfU0VUUFdSTV9QV1JfT0sgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgR0JfU1ZDX1NFVFBXUk1fUFdSX0xPQ0FMICAgICAgICAweDAxCisjZGVmaW5lIEdCX1NWQ19TRVRQV1JNX1BXUl9SRU1PVEUgICAgICAgMHgwMgorI2RlZmluZSBHQl9TVkNfU0VUUFdSTV9QV1JfQlVTWSAgICAgICAgIDB4MDMKKyNkZWZpbmUgR0JfU1ZDX1NFVFBXUk1fUFdSX0VSUk9SX0NBUCAgICAweDA0CisjZGVmaW5lIEdCX1NWQ19TRVRQV1JNX1BXUl9GQVRBTF9FUlJPUiAgMHgwNQorCitzdHJ1Y3QgZ2Jfc3ZjX2wyX3RpbWVyX2NmZyB7CisJX19sZTE2IHRzYl9mYzBfcHJvdGVjdGlvbl90aW1lb3V0OworCV9fbGUxNiB0c2JfdGMwX3JlcGxheV90aW1lb3V0OworCV9fbGUxNiB0c2JfYWZjMF9yZXFfdGltZW91dDsKKwlfX2xlMTYgdHNiX2ZjMV9wcm90ZWN0aW9uX3RpbWVvdXQ7CisJX19sZTE2IHRzYl90YzFfcmVwbGF5X3RpbWVvdXQ7CisJX19sZTE2IHRzYl9hZmMxX3JlcV90aW1lb3V0OworCV9fbGUxNiByZXNlcnZlZF9mb3JfdGMyWzNdOworCV9fbGUxNiByZXNlcnZlZF9mb3JfdGMzWzNdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3N2Y19pbnRmX3NldF9wd3JtX3JlcXVlc3QgeworCV9fdTgJaW50Zl9pZDsKKwlfX3U4CWhzX3NlcmllczsKKwlfX3U4CXR4X21vZGU7CisJX191OAl0eF9nZWFyOworCV9fdTgJdHhfbmxhbmVzOworCV9fdTgJdHhfYW1wbGl0dWRlOworCV9fdTgJdHhfaHNfZXF1YWxpemVyOworCV9fdTgJcnhfbW9kZTsKKwlfX3U4CXJ4X2dlYXI7CisJX191OAlyeF9ubGFuZXM7CisJX191OAlmbGFnczsKKwlfX2xlMzIJcXVpcmtzOworCXN0cnVjdCBnYl9zdmNfbDJfdGltZXJfY2ZnIGxvY2FsX2wydGltZXJkYXRhLCByZW1vdGVfbDJ0aW1lcmRhdGE7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2Jfc3ZjX2ludGZfc2V0X3B3cm1fcmVzcG9uc2UgeworCV9fdTgJcmVzdWx0X2NvZGU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2Jfc3ZjX2tleV9ldmVudF9yZXF1ZXN0IHsKKwlfX2xlMTYgIGtleV9jb2RlOworI2RlZmluZSBHQl9LRVlDT0RFX0FSQSAgICAgICAgIDB4MDAKKworCV9fdTggICAga2V5X2V2ZW50OworI2RlZmluZSBHQl9TVkNfS0VZX1JFTEVBU0VEICAgIDB4MDAKKyNkZWZpbmUgR0JfU1ZDX0tFWV9QUkVTU0VEICAgICAweDAxCit9IF9fcGFja2VkOworCisjZGVmaW5lIEdCX1NWQ19QV1JNT05fTUFYX1JBSUxfQ09VTlQJCTI1NAorCitzdHJ1Y3QgZ2Jfc3ZjX3B3cm1vbl9yYWlsX2NvdW50X2dldF9yZXNwb25zZSB7CisJX191OAlyYWlsX2NvdW50OworfSBfX3BhY2tlZDsKKworI2RlZmluZSBHQl9TVkNfUFdSTU9OX1JBSUxfTkFNRV9CVUZTSVpFCQkzMgorCitzdHJ1Y3QgZ2Jfc3ZjX3B3cm1vbl9yYWlsX25hbWVzX2dldF9yZXNwb25zZSB7CisJX191OAlzdGF0dXM7CisJX191OAluYW1lWzBdW0dCX1NWQ19QV1JNT05fUkFJTF9OQU1FX0JVRlNJWkVdOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBHQl9TVkNfUFdSTU9OX1RZUEVfQ1VSUgkJCTB4MDEKKyNkZWZpbmUgR0JfU1ZDX1BXUk1PTl9UWVBFX1ZPTAkJCTB4MDIKKyNkZWZpbmUgR0JfU1ZDX1BXUk1PTl9UWVBFX1BXUgkJCTB4MDMKKworI2RlZmluZSBHQl9TVkNfUFdSTU9OX0dFVF9TQU1QTEVfT0sJCTB4MDAKKyNkZWZpbmUgR0JfU1ZDX1BXUk1PTl9HRVRfU0FNUExFX0lOVkFMCQkweDAxCisjZGVmaW5lIEdCX1NWQ19QV1JNT05fR0VUX1NBTVBMRV9OT1NVUFAJCTB4MDIKKyNkZWZpbmUgR0JfU1ZDX1BXUk1PTl9HRVRfU0FNUExFX0hXRVJSCQkweDAzCisKK3N0cnVjdCBnYl9zdmNfcHdybW9uX3NhbXBsZV9nZXRfcmVxdWVzdCB7CisJX191OAlyYWlsX2lkOworCV9fdTgJbWVhc3VyZW1lbnRfdHlwZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9zdmNfcHdybW9uX3NhbXBsZV9nZXRfcmVzcG9uc2UgeworCV9fdTgJcmVzdWx0OworCV9fbGUzMgltZWFzdXJlbWVudDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9zdmNfcHdybW9uX2ludGZfc2FtcGxlX2dldF9yZXF1ZXN0IHsKKwlfX3U4CWludGZfaWQ7CisJX191OAltZWFzdXJlbWVudF90eXBlOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3N2Y19wd3Jtb25faW50Zl9zYW1wbGVfZ2V0X3Jlc3BvbnNlIHsKKwlfX3U4CXJlc3VsdDsKKwlfX2xlMzIJbWVhc3VyZW1lbnQ7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEdCX1NWQ19NT0RVTEVfSU5TRVJURURfRkxBR19OT19QUklNQVJZCTB4MDAwMQorCitzdHJ1Y3QgZ2Jfc3ZjX21vZHVsZV9pbnNlcnRlZF9yZXF1ZXN0IHsKKwlfX3U4CXByaW1hcnlfaW50Zl9pZDsKKwlfX3U4CWludGZfY291bnQ7CisJX19sZTE2CWZsYWdzOworfSBfX3BhY2tlZDsKKy8qIG1vZHVsZV9pbnNlcnRlZCByZXNwb25zZSBoYXMgbm8gcGF5bG9hZCAqLworCitzdHJ1Y3QgZ2Jfc3ZjX21vZHVsZV9yZW1vdmVkX3JlcXVlc3QgeworCV9fdTgJcHJpbWFyeV9pbnRmX2lkOworfSBfX3BhY2tlZDsKKy8qIG1vZHVsZV9yZW1vdmVkIHJlc3BvbnNlIGhhcyBubyBwYXlsb2FkICovCisKK3N0cnVjdCBnYl9zdmNfaW50Zl9hY3RpdmF0ZV9yZXF1ZXN0IHsKKwlfX3U4CWludGZfaWQ7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEdCX1NWQ19JTlRGX1RZUEVfVU5LTk9XTgkJMHgwMAorI2RlZmluZSBHQl9TVkNfSU5URl9UWVBFX0RVTU1ZCQkJMHgwMQorI2RlZmluZSBHQl9TVkNfSU5URl9UWVBFX1VOSVBSTwkJCTB4MDIKKyNkZWZpbmUgR0JfU1ZDX0lOVEZfVFlQRV9HUkVZQlVTCQkweDAzCisKK3N0cnVjdCBnYl9zdmNfaW50Zl9hY3RpdmF0ZV9yZXNwb25zZSB7CisJX191OAlzdGF0dXM7CisJX191OAlpbnRmX3R5cGU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2Jfc3ZjX2ludGZfcmVzdW1lX3JlcXVlc3QgeworCV9fdTgJaW50Zl9pZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9zdmNfaW50Zl9yZXN1bWVfcmVzcG9uc2UgeworCV9fdTgJc3RhdHVzOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBHQl9TVkNfSU5URl9NQUlMQk9YX05PTkUJCTB4MDAKKyNkZWZpbmUgR0JfU1ZDX0lOVEZfTUFJTEJPWF9BUAkJCTB4MDEKKyNkZWZpbmUgR0JfU1ZDX0lOVEZfTUFJTEJPWF9HUkVZQlVTCQkweDAyCisKK3N0cnVjdCBnYl9zdmNfaW50Zl9tYWlsYm94X2V2ZW50X3JlcXVlc3QgeworCV9fdTgJaW50Zl9pZDsKKwlfX2xlMTYJcmVzdWx0X2NvZGU7CisJX19sZTMyCW1haWxib3g7Cit9IF9fcGFja2VkOworLyogaW50Zl9tYWlsYm94X2V2ZW50IHJlc3BvbnNlIGhhcyBubyBwYXlsb2FkICovCisKK3N0cnVjdCBnYl9zdmNfaW50Zl9vb3BzX3JlcXVlc3QgeworCV9fdTgJaW50Zl9pZDsKKwlfX3U4CXJlYXNvbjsKK30gX19wYWNrZWQ7CisvKiBpbnRmX29vcHMgcmVzcG9uc2UgaGFzIG5vIHBheWxvYWQgKi8KKworCisvKiBSQVcgKi8KKworLyogR3JleWJ1cyByYXcgcmVxdWVzdCB0eXBlcyAqLworI2RlZmluZQlHQl9SQVdfVFlQRV9TRU5ECQkJMHgwMgorCitzdHJ1Y3QgZ2JfcmF3X3NlbmRfcmVxdWVzdCB7CisJX19sZTMyCWxlbjsKKwlfX3U4CWRhdGFbMF07Cit9IF9fcGFja2VkOworCisKKy8qIFVBUlQgKi8KKworLyogR3JleWJ1cyBVQVJUIG9wZXJhdGlvbiB0eXBlcyAqLworI2RlZmluZSBHQl9VQVJUX1RZUEVfU0VORF9EQVRBCQkJMHgwMgorI2RlZmluZSBHQl9VQVJUX1RZUEVfUkVDRUlWRV9EQVRBCQkweDAzCS8qIFVuc29saWNpdGVkIGRhdGEgKi8KKyNkZWZpbmUgR0JfVUFSVF9UWVBFX1NFVF9MSU5FX0NPRElORwkJMHgwNAorI2RlZmluZSBHQl9VQVJUX1RZUEVfU0VUX0NPTlRST0xfTElORV9TVEFURQkweDA1CisjZGVmaW5lIEdCX1VBUlRfVFlQRV9TRU5EX0JSRUFLCQkJMHgwNgorI2RlZmluZSBHQl9VQVJUX1RZUEVfU0VSSUFMX1NUQVRFCQkweDA3CS8qIFVuc29saWNpdGVkIGRhdGEgKi8KKyNkZWZpbmUgR0JfVUFSVF9UWVBFX1JFQ0VJVkVfQ1JFRElUUwkJMHgwOAorI2RlZmluZSBHQl9VQVJUX1RZUEVfRkxVU0hfRklGT1MJCTB4MDkKKworLyogUmVwcmVzZW50cyBkYXRhIGZyb20gQVAgLT4gTW9kdWxlICovCitzdHJ1Y3QgZ2JfdWFydF9zZW5kX2RhdGFfcmVxdWVzdCB7CisJX19sZTE2CXNpemU7CisJX191OAlkYXRhWzBdOworfSBfX3BhY2tlZDsKKworLyogcmVjdi1kYXRhLXJlcXVlc3QgZmxhZ3MgKi8KKyNkZWZpbmUgR0JfVUFSVF9SRUNWX0ZMQUdfRlJBTUlORwkJMHgwMQkvKiBGcmFtaW5nIGVycm9yICovCisjZGVmaW5lIEdCX1VBUlRfUkVDVl9GTEFHX1BBUklUWQkJMHgwMgkvKiBQYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgR0JfVUFSVF9SRUNWX0ZMQUdfT1ZFUlJVTgkJMHgwNAkvKiBPdmVycnVuIGVycm9yICovCisjZGVmaW5lIEdCX1VBUlRfUkVDVl9GTEFHX0JSRUFLCQkJMHgwOAkvKiBCcmVhayAqLworCisvKiBSZXByZXNlbnRzIGRhdGEgZnJvbSBNb2R1bGUgLT4gQVAgKi8KK3N0cnVjdCBnYl91YXJ0X3JlY3ZfZGF0YV9yZXF1ZXN0IHsKKwlfX2xlMTYJc2l6ZTsKKwlfX3U4CWZsYWdzOworCV9fdTgJZGF0YVswXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl91YXJ0X3JlY2VpdmVfY3JlZGl0c19yZXF1ZXN0IHsKKwlfX2xlMTYgIGNvdW50OworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3VhcnRfc2V0X2xpbmVfY29kaW5nX3JlcXVlc3QgeworCV9fbGUzMglyYXRlOworCV9fdTgJZm9ybWF0OworI2RlZmluZSBHQl9TRVJJQUxfMV9TVE9QX0JJVFMJCQkwCisjZGVmaW5lIEdCX1NFUklBTF8xXzVfU1RPUF9CSVRTCQkJMQorI2RlZmluZSBHQl9TRVJJQUxfMl9TVE9QX0JJVFMJCQkyCisKKwlfX3U4CXBhcml0eTsKKyNkZWZpbmUgR0JfU0VSSUFMX05PX1BBUklUWQkJCTAKKyNkZWZpbmUgR0JfU0VSSUFMX09ERF9QQVJJVFkJCQkxCisjZGVmaW5lIEdCX1NFUklBTF9FVkVOX1BBUklUWQkJCTIKKyNkZWZpbmUgR0JfU0VSSUFMX01BUktfUEFSSVRZCQkJMworI2RlZmluZSBHQl9TRVJJQUxfU1BBQ0VfUEFSSVRZCQkJNAorCisJX191OAlkYXRhX2JpdHM7CisKKwlfX3U4CWZsb3dfY29udHJvbDsKKyNkZWZpbmUgR0JfU0VSSUFMX0FVVE9fUlRTQ1RTX0VOCQkweDEKK30gX19wYWNrZWQ7CisKKy8qIG91dHB1dCBjb250cm9sIGxpbmVzICovCisjZGVmaW5lIEdCX1VBUlRfQ1RSTF9EVFIJCQkweDAxCisjZGVmaW5lIEdCX1VBUlRfQ1RSTF9SVFMJCQkweDAyCisKK3N0cnVjdCBnYl91YXJ0X3NldF9jb250cm9sX2xpbmVfc3RhdGVfcmVxdWVzdCB7CisJX191OAljb250cm9sOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3VhcnRfc2V0X2JyZWFrX3JlcXVlc3QgeworCV9fdTgJc3RhdGU7Cit9IF9fcGFja2VkOworCisvKiBpbnB1dCBjb250cm9sIGxpbmVzIGFuZCBsaW5lIGVycm9ycyAqLworI2RlZmluZSBHQl9VQVJUX0NUUkxfRENECQkJMHgwMQorI2RlZmluZSBHQl9VQVJUX0NUUkxfRFNSCQkJMHgwMgorI2RlZmluZSBHQl9VQVJUX0NUUkxfUkkJCQkJMHgwNAorCitzdHJ1Y3QgZ2JfdWFydF9zZXJpYWxfc3RhdGVfcmVxdWVzdCB7CisJX191OAljb250cm9sOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3VhcnRfc2VyaWFsX2ZsdXNoX3JlcXVlc3QgeworCV9fdTggICAgZmxhZ3M7CisjZGVmaW5lIEdCX1NFUklBTF9GTEFHX0ZMVVNIX1RSQU5TTUlUVEVSCTB4MDEKKyNkZWZpbmUgR0JfU0VSSUFMX0ZMQUdfRkxVU0hfUkVDRUlWRVIJCTB4MDIKK30gX19wYWNrZWQ7CisKKy8qIExvb3BiYWNrICovCisKKy8qIEdyZXlidXMgbG9vcGJhY2sgcmVxdWVzdCB0eXBlcyAqLworI2RlZmluZSBHQl9MT09QQkFDS19UWVBFX1BJTkcJCQkweDAyCisjZGVmaW5lIEdCX0xPT1BCQUNLX1RZUEVfVFJBTlNGRVIJCTB4MDMKKyNkZWZpbmUgR0JfTE9PUEJBQ0tfVFlQRV9TSU5LCQkJMHgwNAorCisvKgorICogTG9vcGJhY2sgcmVxdWVzdC9yZXNwb25zZSBoZWFkZXIgZm9ybWF0IHNob3VsZCBiZSBpZGVudGljYWwKKyAqIHRvIHNpbXBsaWZ5IGJhbmR3aWR0aCBhbmQgZGF0YSBtb3ZlbWVudCBhbmFseXNpcy4KKyAqLworc3RydWN0IGdiX2xvb3BiYWNrX3RyYW5zZmVyX3JlcXVlc3QgeworCV9fbGUzMglsZW47CisJX19sZTMyICByZXNlcnZlZDA7CisJX19sZTMyICByZXNlcnZlZDE7CisJX191OAlkYXRhWzBdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2xvb3BiYWNrX3RyYW5zZmVyX3Jlc3BvbnNlIHsKKwlfX2xlMzIJbGVuOworCV9fbGUzMglyZXNlcnZlZDA7CisJX19sZTMyCXJlc2VydmVkMTsKKwlfX3U4CWRhdGFbMF07Cit9IF9fcGFja2VkOworCisvKiBTRElPICovCisvKiBHcmV5YnVzIFNESU8gb3BlcmF0aW9uIHR5cGVzICovCisjZGVmaW5lIEdCX1NESU9fVFlQRV9HRVRfQ0FQQUJJTElUSUVTCQkweDAyCisjZGVmaW5lIEdCX1NESU9fVFlQRV9TRVRfSU9TCQkJMHgwMworI2RlZmluZSBHQl9TRElPX1RZUEVfQ09NTUFORAkJCTB4MDQKKyNkZWZpbmUgR0JfU0RJT19UWVBFX1RSQU5TRkVSCQkJMHgwNQorI2RlZmluZSBHQl9TRElPX1RZUEVfRVZFTlQJCQkweDA2CisKKy8qIGdldCBjYXBzIHJlc3BvbnNlOiByZXF1ZXN0IGhhcyBubyBwYXlsb2FkICovCitzdHJ1Y3QgZ2Jfc2Rpb19nZXRfY2Fwc19yZXNwb25zZSB7CisJX19sZTMyCWNhcHM7CisjZGVmaW5lIEdCX1NESU9fQ0FQX05PTlJFTU9WQUJMRQkweDAwMDAwMDAxCisjZGVmaW5lIEdCX1NESU9fQ0FQXzRfQklUX0RBVEEJCTB4MDAwMDAwMDIKKyNkZWZpbmUgR0JfU0RJT19DQVBfOF9CSVRfREFUQQkJMHgwMDAwMDAwNAorI2RlZmluZSBHQl9TRElPX0NBUF9NTUNfSFMJCTB4MDAwMDAwMDgKKyNkZWZpbmUgR0JfU0RJT19DQVBfU0RfSFMJCTB4MDAwMDAwMTAKKyNkZWZpbmUgR0JfU0RJT19DQVBfRVJBU0UJCTB4MDAwMDAwMjAKKyNkZWZpbmUgR0JfU0RJT19DQVBfMV8yVl9ERFIJCTB4MDAwMDAwNDAKKyNkZWZpbmUgR0JfU0RJT19DQVBfMV84Vl9ERFIJCTB4MDAwMDAwODAKKyNkZWZpbmUgR0JfU0RJT19DQVBfUE9XRVJfT0ZGX0NBUkQJMHgwMDAwMDEwMAorI2RlZmluZSBHQl9TRElPX0NBUF9VSFNfU0RSMTIJCTB4MDAwMDAyMDAKKyNkZWZpbmUgR0JfU0RJT19DQVBfVUhTX1NEUjI1CQkweDAwMDAwNDAwCisjZGVmaW5lIEdCX1NESU9fQ0FQX1VIU19TRFI1MAkJMHgwMDAwMDgwMAorI2RlZmluZSBHQl9TRElPX0NBUF9VSFNfU0RSMTA0CQkweDAwMDAxMDAwCisjZGVmaW5lIEdCX1NESU9fQ0FQX1VIU19ERFI1MAkJMHgwMDAwMjAwMAorI2RlZmluZSBHQl9TRElPX0NBUF9EUklWRVJfVFlQRV9BCTB4MDAwMDQwMDAKKyNkZWZpbmUgR0JfU0RJT19DQVBfRFJJVkVSX1RZUEVfQwkweDAwMDA4MDAwCisjZGVmaW5lIEdCX1NESU9fQ0FQX0RSSVZFUl9UWVBFX0QJMHgwMDAxMDAwMAorI2RlZmluZSBHQl9TRElPX0NBUF9IUzIwMF8xXzJWCQkweDAwMDIwMDAwCisjZGVmaW5lIEdCX1NESU9fQ0FQX0hTMjAwXzFfOFYJCTB4MDAwNDAwMDAKKyNkZWZpbmUgR0JfU0RJT19DQVBfSFM0MDBfMV8yVgkJMHgwMDA4MDAwMAorI2RlZmluZSBHQl9TRElPX0NBUF9IUzQwMF8xXzhWCQkweDAwMTAwMDAwCisKKwkvKiBzZWUgcG9zc2libGUgdmFsdWVzIGJlbG93IGF0IHZkZCAqLworCV9fbGUzMiBvY3I7CisJX19sZTMyIGZfbWluOworCV9fbGUzMiBmX21heDsKKwlfX2xlMTYgbWF4X2Jsa19jb3VudDsKKwlfX2xlMTYgbWF4X2Jsa19zaXplOworfSBfX3BhY2tlZDsKKworLyogc2V0IGlvcyByZXF1ZXN0OiByZXNwb25zZSBoYXMgbm8gcGF5bG9hZCAqLworc3RydWN0IGdiX3NkaW9fc2V0X2lvc19yZXF1ZXN0IHsKKwlfX2xlMzIJY2xvY2s7CisJX19sZTMyCXZkZDsKKyNkZWZpbmUgR0JfU0RJT19WRERfMTY1XzE5NQkweDAwMDAwMDAxCisjZGVmaW5lIEdCX1NESU9fVkREXzIwXzIxCTB4MDAwMDAwMDIKKyNkZWZpbmUgR0JfU0RJT19WRERfMjFfMjIJMHgwMDAwMDAwNAorI2RlZmluZSBHQl9TRElPX1ZERF8yMl8yMwkweDAwMDAwMDA4CisjZGVmaW5lIEdCX1NESU9fVkREXzIzXzI0CTB4MDAwMDAwMTAKKyNkZWZpbmUgR0JfU0RJT19WRERfMjRfMjUJMHgwMDAwMDAyMAorI2RlZmluZSBHQl9TRElPX1ZERF8yNV8yNgkweDAwMDAwMDQwCisjZGVmaW5lIEdCX1NESU9fVkREXzI2XzI3CTB4MDAwMDAwODAKKyNkZWZpbmUgR0JfU0RJT19WRERfMjdfMjgJMHgwMDAwMDEwMAorI2RlZmluZSBHQl9TRElPX1ZERF8yOF8yOQkweDAwMDAwMjAwCisjZGVmaW5lIEdCX1NESU9fVkREXzI5XzMwCTB4MDAwMDA0MDAKKyNkZWZpbmUgR0JfU0RJT19WRERfMzBfMzEJMHgwMDAwMDgwMAorI2RlZmluZSBHQl9TRElPX1ZERF8zMV8zMgkweDAwMDAxMDAwCisjZGVmaW5lIEdCX1NESU9fVkREXzMyXzMzCTB4MDAwMDIwMDAKKyNkZWZpbmUgR0JfU0RJT19WRERfMzNfMzQJMHgwMDAwNDAwMAorI2RlZmluZSBHQl9TRElPX1ZERF8zNF8zNQkweDAwMDA4MDAwCisjZGVmaW5lIEdCX1NESU9fVkREXzM1XzM2CTB4MDAwMTAwMDAKKworCV9fdTgJYnVzX21vZGU7CisjZGVmaW5lIEdCX1NESU9fQlVTTU9ERV9PUEVORFJBSU4JMHgwMAorI2RlZmluZSBHQl9TRElPX0JVU01PREVfUFVTSFBVTEwJMHgwMQorCisJX191OAlwb3dlcl9tb2RlOworI2RlZmluZSBHQl9TRElPX1BPV0VSX09GRgkweDAwCisjZGVmaW5lIEdCX1NESU9fUE9XRVJfVVAJMHgwMQorI2RlZmluZSBHQl9TRElPX1BPV0VSX09OCTB4MDIKKyNkZWZpbmUgR0JfU0RJT19QT1dFUl9VTkRFRklORUQJMHgwMworCisJX191OAlidXNfd2lkdGg7CisjZGVmaW5lIEdCX1NESU9fQlVTX1dJRFRIXzEJMHgwMAorI2RlZmluZSBHQl9TRElPX0JVU19XSURUSF80CTB4MDIKKyNkZWZpbmUgR0JfU0RJT19CVVNfV0lEVEhfOAkweDAzCisKKwlfX3U4CXRpbWluZzsKKyNkZWZpbmUgR0JfU0RJT19USU1JTkdfTEVHQUNZCQkweDAwCisjZGVmaW5lIEdCX1NESU9fVElNSU5HX01NQ19IUwkJMHgwMQorI2RlZmluZSBHQl9TRElPX1RJTUlOR19TRF9IUwkJMHgwMgorI2RlZmluZSBHQl9TRElPX1RJTUlOR19VSFNfU0RSMTIJMHgwMworI2RlZmluZSBHQl9TRElPX1RJTUlOR19VSFNfU0RSMjUJMHgwNAorI2RlZmluZSBHQl9TRElPX1RJTUlOR19VSFNfU0RSNTAJMHgwNQorI2RlZmluZSBHQl9TRElPX1RJTUlOR19VSFNfU0RSMTA0CTB4MDYKKyNkZWZpbmUgR0JfU0RJT19USU1JTkdfVUhTX0REUjUwCTB4MDcKKyNkZWZpbmUgR0JfU0RJT19USU1JTkdfTU1DX0REUjUyCTB4MDgKKyNkZWZpbmUgR0JfU0RJT19USU1JTkdfTU1DX0hTMjAwCTB4MDkKKyNkZWZpbmUgR0JfU0RJT19USU1JTkdfTU1DX0hTNDAwCTB4MEEKKworCV9fdTgJc2lnbmFsX3ZvbHRhZ2U7CisjZGVmaW5lIEdCX1NESU9fU0lHTkFMX1ZPTFRBR0VfMzMwCTB4MDAKKyNkZWZpbmUgR0JfU0RJT19TSUdOQUxfVk9MVEFHRV8xODAJMHgwMQorI2RlZmluZSBHQl9TRElPX1NJR05BTF9WT0xUQUdFXzEyMAkweDAyCisKKwlfX3U4CWRydl90eXBlOworI2RlZmluZSBHQl9TRElPX1NFVF9EUklWRVJfVFlQRV9CCTB4MDAKKyNkZWZpbmUgR0JfU0RJT19TRVRfRFJJVkVSX1RZUEVfQQkweDAxCisjZGVmaW5lIEdCX1NESU9fU0VUX0RSSVZFUl9UWVBFX0MJMHgwMgorI2RlZmluZSBHQl9TRElPX1NFVF9EUklWRVJfVFlQRV9ECTB4MDMKK30gX19wYWNrZWQ7CisKKy8qIGNvbW1hbmQgcmVxdWVzdCAqLworc3RydWN0IGdiX3NkaW9fY29tbWFuZF9yZXF1ZXN0IHsKKwlfX3U4CWNtZDsKKwlfX3U4CWNtZF9mbGFnczsKKyNkZWZpbmUgR0JfU0RJT19SU1BfTk9ORQkJMHgwMAorI2RlZmluZSBHQl9TRElPX1JTUF9QUkVTRU5UCQkweDAxCisjZGVmaW5lIEdCX1NESU9fUlNQXzEzNgkJCTB4MDIKKyNkZWZpbmUgR0JfU0RJT19SU1BfQ1JDCQkJMHgwNAorI2RlZmluZSBHQl9TRElPX1JTUF9CVVNZCQkweDA4CisjZGVmaW5lIEdCX1NESU9fUlNQX09QQ09ERQkJMHgxMAorCisJX191OAljbWRfdHlwZTsKKyNkZWZpbmUgR0JfU0RJT19DTURfQUMJCTB4MDAKKyNkZWZpbmUgR0JfU0RJT19DTURfQURUQwkweDAxCisjZGVmaW5lIEdCX1NESU9fQ01EX0JDCQkweDAyCisjZGVmaW5lIEdCX1NESU9fQ01EX0JDUgkJMHgwMworCisJX19sZTMyCWNtZF9hcmc7CisJX19sZTE2CWRhdGFfYmxvY2tzOworCV9fbGUxNglkYXRhX2Jsa3N6OworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3NkaW9fY29tbWFuZF9yZXNwb25zZSB7CisJX19sZTMyCXJlc3BbNF07Cit9IF9fcGFja2VkOworCisvKiB0cmFuc2ZlciByZXF1ZXN0ICovCitzdHJ1Y3QgZ2Jfc2Rpb190cmFuc2Zlcl9yZXF1ZXN0IHsKKwlfX3U4CWRhdGFfZmxhZ3M7CisjZGVmaW5lIEdCX1NESU9fREFUQV9XUklURQkweDAxCisjZGVmaW5lIEdCX1NESU9fREFUQV9SRUFECTB4MDIKKyNkZWZpbmUgR0JfU0RJT19EQVRBX1NUUkVBTQkweDA0CisKKwlfX2xlMTYJZGF0YV9ibG9ja3M7CisJX19sZTE2CWRhdGFfYmxrc3o7CisJX191OAlkYXRhWzBdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX3NkaW9fdHJhbnNmZXJfcmVzcG9uc2UgeworCV9fbGUxNglkYXRhX2Jsb2NrczsKKwlfX2xlMTYJZGF0YV9ibGtzejsKKwlfX3U4CWRhdGFbMF07Cit9IF9fcGFja2VkOworCisvKiBldmVudCByZXF1ZXN0OiBnZW5lcmF0ZWQgYnkgbW9kdWxlIGFuZCBpcyBkZWZpbmVkIGFzIHVuaWRpcmVjdGlvbmFsICovCitzdHJ1Y3QgZ2Jfc2Rpb19ldmVudF9yZXF1ZXN0IHsKKwlfX3U4CWV2ZW50OworI2RlZmluZSBHQl9TRElPX0NBUkRfSU5TRVJURUQJMHgwMQorI2RlZmluZSBHQl9TRElPX0NBUkRfUkVNT1ZFRAkweDAyCisjZGVmaW5lIEdCX1NESU9fV1AJCTB4MDQKK30gX19wYWNrZWQ7CisKKy8qIENhbWVyYSAqLworCisvKiBHcmV5YnVzIENhbWVyYSByZXF1ZXN0IHR5cGVzICovCisjZGVmaW5lIEdCX0NBTUVSQV9UWVBFX0NBUEFCSUxJVElFUwkJMHgwMgorI2RlZmluZSBHQl9DQU1FUkFfVFlQRV9DT05GSUdVUkVfU1RSRUFNUwkweDAzCisjZGVmaW5lIEdCX0NBTUVSQV9UWVBFX0NBUFRVUkUJCQkweDA0CisjZGVmaW5lIEdCX0NBTUVSQV9UWVBFX0ZMVVNICQkJMHgwNQorI2RlZmluZSBHQl9DQU1FUkFfVFlQRV9NRVRBREFUQQkJCTB4MDYKKworI2RlZmluZSBHQl9DQU1FUkFfTUFYX1NUUkVBTVMJCQk0CisjZGVmaW5lIEdCX0NBTUVSQV9NQVhfU0VUVElOR1NfU0laRQkJODE5MgorCisvKiBHcmV5YnVzIENhbWVyYSBDb25maWd1cmUgU3RyZWFtcyByZXF1ZXN0IHBheWxvYWQgKi8KK3N0cnVjdCBnYl9jYW1lcmFfc3RyZWFtX2NvbmZpZ19yZXF1ZXN0IHsKKwlfX2xlMTYgd2lkdGg7CisJX19sZTE2IGhlaWdodDsKKwlfX2xlMTYgZm9ybWF0OworCV9fbGUxNiBwYWRkaW5nOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2NhbWVyYV9jb25maWd1cmVfc3RyZWFtc19yZXF1ZXN0IHsKKwlfX3U4IG51bV9zdHJlYW1zOworCV9fdTggZmxhZ3M7CisjZGVmaW5lIEdCX0NBTUVSQV9DT05GSUdVUkVfU1RSRUFNU19URVNUX09OTFkJMHgwMQorCV9fbGUxNiBwYWRkaW5nOworCXN0cnVjdCBnYl9jYW1lcmFfc3RyZWFtX2NvbmZpZ19yZXF1ZXN0IGNvbmZpZ1swXTsKK30gX19wYWNrZWQ7CisKKy8qIEdyZXlidXMgQ2FtZXJhIENvbmZpZ3VyZSBTdHJlYW1zIHJlc3BvbnNlIHBheWxvYWQgKi8KK3N0cnVjdCBnYl9jYW1lcmFfc3RyZWFtX2NvbmZpZ19yZXNwb25zZSB7CisJX19sZTE2IHdpZHRoOworCV9fbGUxNiBoZWlnaHQ7CisJX19sZTE2IGZvcm1hdDsKKwlfX3U4IHZpcnR1YWxfY2hhbm5lbDsKKwlfX3U4IGRhdGFfdHlwZVsyXTsKKwlfX2xlMTYgbWF4X3BrdF9zaXplOworCV9fdTggcGFkZGluZzsKKwlfX2xlMzIgbWF4X3NpemU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfY2FtZXJhX2NvbmZpZ3VyZV9zdHJlYW1zX3Jlc3BvbnNlIHsKKwlfX3U4IG51bV9zdHJlYW1zOworI2RlZmluZSBHQl9DQU1FUkFfQ09ORklHVVJFX1NUUkVBTVNfQURKVVNURUQJMHgwMQorCV9fdTggZmxhZ3M7CisJX191OCBwYWRkaW5nWzJdOworCV9fbGUzMiBkYXRhX3JhdGU7CisJc3RydWN0IGdiX2NhbWVyYV9zdHJlYW1fY29uZmlnX3Jlc3BvbnNlIGNvbmZpZ1swXTsKK307CisKKy8qIEdyZXlidXMgQ2FtZXJhIENhcHR1cmUgcmVxdWVzdCBwYXlsb2FkIC0gcmVzcG9uc2UgaGFzIG5vIHBheWxvYWQgKi8KK3N0cnVjdCBnYl9jYW1lcmFfY2FwdHVyZV9yZXF1ZXN0IHsKKwlfX2xlMzIgcmVxdWVzdF9pZDsKKwlfX3U4IHN0cmVhbXM7CisJX191OCBwYWRkaW5nOworCV9fbGUxNiBudW1fZnJhbWVzOworCV9fdTggc2V0dGluZ3NbMF07Cit9IF9fcGFja2VkOworCisvKiBHcmV5YnVzIENhbWVyYSBGbHVzaCByZXNwb25zZSBwYXlsb2FkIC0gcmVxdWVzdCBoYXMgbm8gcGF5bG9hZCAqLworc3RydWN0IGdiX2NhbWVyYV9mbHVzaF9yZXNwb25zZSB7CisJX19sZTMyIHJlcXVlc3RfaWQ7Cit9IF9fcGFja2VkOworCisvKiBHcmV5YnVzIENhbWVyYSBNZXRhZGF0YSByZXF1ZXN0IHBheWxvYWQgLSBvcGVyYXRpb24gaGFzIG5vIHJlc3BvbnNlICovCitzdHJ1Y3QgZ2JfY2FtZXJhX21ldGFkYXRhX3JlcXVlc3QgeworCV9fbGUzMiByZXF1ZXN0X2lkOworCV9fbGUxNiBmcmFtZV9udW1iZXI7CisJX191OCBzdHJlYW07CisJX191OCBwYWRkaW5nOworCV9fdTggbWV0YWRhdGFbMF07Cit9IF9fcGFja2VkOworCisvKiBMaWdodHMgKi8KKworLyogR3JleWJ1cyBMaWdodHMgcmVxdWVzdCB0eXBlcyAqLworI2RlZmluZSBHQl9MSUdIVFNfVFlQRV9HRVRfTElHSFRTCQkweDAyCisjZGVmaW5lIEdCX0xJR0hUU19UWVBFX0dFVF9MSUdIVF9DT05GSUcJCTB4MDMKKyNkZWZpbmUgR0JfTElHSFRTX1RZUEVfR0VUX0NIQU5ORUxfQ09ORklHCTB4MDQKKyNkZWZpbmUgR0JfTElHSFRTX1RZUEVfR0VUX0NIQU5ORUxfRkxBU0hfQ09ORklHCTB4MDUKKyNkZWZpbmUgR0JfTElHSFRTX1RZUEVfU0VUX0JSSUdIVE5FU1MJCTB4MDYKKyNkZWZpbmUgR0JfTElHSFRTX1RZUEVfU0VUX0JMSU5LCQkweDA3CisjZGVmaW5lIEdCX0xJR0hUU19UWVBFX1NFVF9DT0xPUgkJMHgwOAorI2RlZmluZSBHQl9MSUdIVFNfVFlQRV9TRVRfRkFERQkJCTB4MDkKKyNkZWZpbmUgR0JfTElHSFRTX1RZUEVfRVZFTlQJCQkweDBBCisjZGVmaW5lIEdCX0xJR0hUU19UWVBFX1NFVF9GTEFTSF9JTlRFTlNJVFkJMHgwQgorI2RlZmluZSBHQl9MSUdIVFNfVFlQRV9TRVRfRkxBU0hfU1RST0JFCQkweDBDCisjZGVmaW5lIEdCX0xJR0hUU19UWVBFX1NFVF9GTEFTSF9USU1FT1VUCTB4MEQKKyNkZWZpbmUgR0JfTElHSFRTX1RZUEVfR0VUX0ZMQVNIX0ZBVUxUCQkweDBFCisKKy8qIEdyZXlidXMgTGlnaHQgbW9kZXMgKi8KKworLyoKKyAqIGlmIHlvdSBhZGQgYW55IHNwZWNpZmljIG1vZGUgYmVsb3csIHVwZGF0ZSBhbHNvIHRoZQorICogR0JfQ0hBTk5FTF9NT0RFX0RFRklORURfUkFOR0UgdmFsdWUgYWNjb3JkaW5nbHkKKyAqLworI2RlZmluZSBHQl9DSEFOTkVMX01PREVfTk9ORQkJMHgwMDAwMDAwMAorI2RlZmluZSBHQl9DSEFOTkVMX01PREVfQkFUVEVSWQkJMHgwMDAwMDAwMQorI2RlZmluZSBHQl9DSEFOTkVMX01PREVfUE9XRVIJCTB4MDAwMDAwMDIKKyNkZWZpbmUgR0JfQ0hBTk5FTF9NT0RFX1dJUkVMRVNTCTB4MDAwMDAwMDQKKyNkZWZpbmUgR0JfQ0hBTk5FTF9NT0RFX0JMVUVUT09USAkweDAwMDAwMDA4CisjZGVmaW5lIEdCX0NIQU5ORUxfTU9ERV9LRVlCT0FSRAkweDAwMDAwMDEwCisjZGVmaW5lIEdCX0NIQU5ORUxfTU9ERV9CVVRUT05TCQkweDAwMDAwMDIwCisjZGVmaW5lIEdCX0NIQU5ORUxfTU9ERV9OT1RJRklDQVRJT04JMHgwMDAwMDA0MAorI2RlZmluZSBHQl9DSEFOTkVMX01PREVfQVRURU5USU9OCTB4MDAwMDAwODAKKyNkZWZpbmUgR0JfQ0hBTk5FTF9NT0RFX0ZMQVNICQkweDAwMDAwMTAwCisjZGVmaW5lIEdCX0NIQU5ORUxfTU9ERV9UT1JDSAkJMHgwMDAwMDIwMAorI2RlZmluZSBHQl9DSEFOTkVMX01PREVfSU5ESUNBVE9SCTB4MDAwMDA0MDAKKworLyogTGlnaHRzIE1vZGUgdmFsaWQgYml0IHZhbHVlcyAqLworI2RlZmluZSBHQl9DSEFOTkVMX01PREVfREVGSU5FRF9SQU5HRQkweDAwMDAwNEZGCisjZGVmaW5lIEdCX0NIQU5ORUxfTU9ERV9WRU5ET1JfUkFOR0UJMHgwMEYwMDAwMAorCisvKiBHcmV5YnVzIExpZ2h0IENoYW5uZWxzIEZsYWdzICovCisjZGVmaW5lIEdCX0xJR0hUX0NIQU5ORUxfTVVMVElDT0xPUgkweDAwMDAwMDAxCisjZGVmaW5lIEdCX0xJR0hUX0NIQU5ORUxfRkFERVIJCTB4MDAwMDAwMDIKKyNkZWZpbmUgR0JfTElHSFRfQ0hBTk5FTF9CTElOSwkJMHgwMDAwMDAwNAorCisvKiBnZXQgY291bnQgb2YgbGlnaHRzIGluIG1vZHVsZSAqLworc3RydWN0IGdiX2xpZ2h0c19nZXRfbGlnaHRzX3Jlc3BvbnNlIHsKKwlfX3U4CWxpZ2h0c19jb3VudDsKK30gX19wYWNrZWQ7CisKKy8qIGxpZ2h0IGNvbmZpZyByZXF1ZXN0IHBheWxvYWQgKi8KK3N0cnVjdCBnYl9saWdodHNfZ2V0X2xpZ2h0X2NvbmZpZ19yZXF1ZXN0IHsKKwlfX3U4CWlkOworfSBfX3BhY2tlZDsKKworLyogbGlnaHQgY29uZmlnIHJlc3BvbnNlIHBheWxvYWQgKi8KK3N0cnVjdCBnYl9saWdodHNfZ2V0X2xpZ2h0X2NvbmZpZ19yZXNwb25zZSB7CisJX191OAljaGFubmVsX2NvdW50OworCV9fdTgJbmFtZVszMl07Cit9IF9fcGFja2VkOworCisvKiBjaGFubmVsIGNvbmZpZyByZXF1ZXN0IHBheWxvYWQgKi8KK3N0cnVjdCBnYl9saWdodHNfZ2V0X2NoYW5uZWxfY29uZmlnX3JlcXVlc3QgeworCV9fdTgJbGlnaHRfaWQ7CisJX191OAljaGFubmVsX2lkOworfSBfX3BhY2tlZDsKKworLyogY2hhbm5lbCBmbGFzaCBjb25maWcgcmVxdWVzdCBwYXlsb2FkICovCitzdHJ1Y3QgZ2JfbGlnaHRzX2dldF9jaGFubmVsX2ZsYXNoX2NvbmZpZ19yZXF1ZXN0IHsKKwlfX3U4CWxpZ2h0X2lkOworCV9fdTgJY2hhbm5lbF9pZDsKK30gX19wYWNrZWQ7CisKKy8qIGNoYW5uZWwgY29uZmlnIHJlc3BvbnNlIHBheWxvYWQgKi8KK3N0cnVjdCBnYl9saWdodHNfZ2V0X2NoYW5uZWxfY29uZmlnX3Jlc3BvbnNlIHsKKwlfX3U4CW1heF9icmlnaHRuZXNzOworCV9fbGUzMglmbGFnczsKKwlfX2xlMzIJY29sb3I7CisJX191OAljb2xvcl9uYW1lWzMyXTsKKwlfX2xlMzIJbW9kZTsKKwlfX3U4CW1vZGVfbmFtZVszMl07Cit9IF9fcGFja2VkOworCisvKiBjaGFubmVsIGZsYXNoIGNvbmZpZyByZXNwb25zZSBwYXlsb2FkICovCitzdHJ1Y3QgZ2JfbGlnaHRzX2dldF9jaGFubmVsX2ZsYXNoX2NvbmZpZ19yZXNwb25zZSB7CisJX19sZTMyCWludGVuc2l0eV9taW5fdUE7CisJX19sZTMyCWludGVuc2l0eV9tYXhfdUE7CisJX19sZTMyCWludGVuc2l0eV9zdGVwX3VBOworCV9fbGUzMgl0aW1lb3V0X21pbl91czsKKwlfX2xlMzIJdGltZW91dF9tYXhfdXM7CisJX19sZTMyCXRpbWVvdXRfc3RlcF91czsKK30gX19wYWNrZWQ7CisKKy8qIGJsaW5rIHJlcXVlc3QgcGF5bG9hZDogcmVzcG9uc2UgaGF2ZSBubyBwYXlsb2FkICovCitzdHJ1Y3QgZ2JfbGlnaHRzX2JsaW5rX3JlcXVlc3QgeworCV9fdTgJbGlnaHRfaWQ7CisJX191OAljaGFubmVsX2lkOworCV9fbGUxNgl0aW1lX29uX21zOworCV9fbGUxNgl0aW1lX29mZl9tczsKK30gX19wYWNrZWQ7CisKKy8qIHNldCBicmlnaHRuZXNzIHJlcXVlc3QgcGF5bG9hZDogcmVzcG9uc2UgaGF2ZSBubyBwYXlsb2FkICovCitzdHJ1Y3QgZ2JfbGlnaHRzX3NldF9icmlnaHRuZXNzX3JlcXVlc3QgeworCV9fdTgJbGlnaHRfaWQ7CisJX191OAljaGFubmVsX2lkOworCV9fdTgJYnJpZ2h0bmVzczsKK30gX19wYWNrZWQ7CisKKy8qIHNldCBjb2xvciByZXF1ZXN0IHBheWxvYWQ6IHJlc3BvbnNlIGhhdmUgbm8gcGF5bG9hZCAqLworc3RydWN0IGdiX2xpZ2h0c19zZXRfY29sb3JfcmVxdWVzdCB7CisJX191OAlsaWdodF9pZDsKKwlfX3U4CWNoYW5uZWxfaWQ7CisJX19sZTMyCWNvbG9yOworfSBfX3BhY2tlZDsKKworLyogc2V0IGZhZGUgcmVxdWVzdCBwYXlsb2FkOiByZXNwb25zZSBoYXZlIG5vIHBheWxvYWQgKi8KK3N0cnVjdCBnYl9saWdodHNfc2V0X2ZhZGVfcmVxdWVzdCB7CisJX191OAlsaWdodF9pZDsKKwlfX3U4CWNoYW5uZWxfaWQ7CisJX191OAlmYWRlX2luOworCV9fdTgJZmFkZV9vdXQ7Cit9IF9fcGFja2VkOworCisvKiBldmVudCByZXF1ZXN0OiBnZW5lcmF0ZWQgYnkgbW9kdWxlICovCitzdHJ1Y3QgZ2JfbGlnaHRzX2V2ZW50X3JlcXVlc3QgeworCV9fdTgJbGlnaHRfaWQ7CisJX191OAlldmVudDsKKyNkZWZpbmUgR0JfTElHSFRTX0xJR0hUX0NPTkZJRwkJMHgwMQorfSBfX3BhY2tlZDsKKworLyogc2V0IGZsYXNoIGludGVuc2l0eSByZXF1ZXN0IHBheWxvYWQ6IHJlc3BvbnNlIGhhdmUgbm8gcGF5bG9hZCAqLworc3RydWN0IGdiX2xpZ2h0c19zZXRfZmxhc2hfaW50ZW5zaXR5X3JlcXVlc3QgeworCV9fdTgJbGlnaHRfaWQ7CisJX191OAljaGFubmVsX2lkOworCV9fbGUzMglpbnRlbnNpdHlfdUE7Cit9IF9fcGFja2VkOworCisvKiBzZXQgZmxhc2ggc3Ryb2JlIHN0YXRlIHJlcXVlc3QgcGF5bG9hZDogcmVzcG9uc2UgaGF2ZSBubyBwYXlsb2FkICovCitzdHJ1Y3QgZ2JfbGlnaHRzX3NldF9mbGFzaF9zdHJvYmVfcmVxdWVzdCB7CisJX191OAlsaWdodF9pZDsKKwlfX3U4CWNoYW5uZWxfaWQ7CisJX191OAlzdGF0ZTsKK30gX19wYWNrZWQ7CisKKy8qIHNldCBmbGFzaCB0aW1lb3V0IHJlcXVlc3QgcGF5bG9hZDogcmVzcG9uc2UgaGF2ZSBubyBwYXlsb2FkICovCitzdHJ1Y3QgZ2JfbGlnaHRzX3NldF9mbGFzaF90aW1lb3V0X3JlcXVlc3QgeworCV9fdTgJbGlnaHRfaWQ7CisJX191OAljaGFubmVsX2lkOworCV9fbGUzMgl0aW1lb3V0X3VzOworfSBfX3BhY2tlZDsKKworLyogZ2V0IGZsYXNoIGZhdWx0IHJlcXVlc3QgcGF5bG9hZCAqLworc3RydWN0IGdiX2xpZ2h0c19nZXRfZmxhc2hfZmF1bHRfcmVxdWVzdCB7CisJX191OAlsaWdodF9pZDsKKwlfX3U4CWNoYW5uZWxfaWQ7Cit9IF9fcGFja2VkOworCisvKiBnZXQgZmxhc2ggZmF1bHQgcmVzcG9uc2UgcGF5bG9hZCAqLworc3RydWN0IGdiX2xpZ2h0c19nZXRfZmxhc2hfZmF1bHRfcmVzcG9uc2UgeworCV9fbGUzMglmYXVsdDsKKyNkZWZpbmUgR0JfTElHSFRTX0ZMQVNIX0ZBVUxUX09WRVJfVk9MVEFHRQkJMHgwMDAwMDAwMAorI2RlZmluZSBHQl9MSUdIVFNfRkxBU0hfRkFVTFRfVElNRU9VVAkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgR0JfTElHSFRTX0ZMQVNIX0ZBVUxUX09WRVJfVEVNUEVSQVRVUkUJCTB4MDAwMDAwMDIKKyNkZWZpbmUgR0JfTElHSFRTX0ZMQVNIX0ZBVUxUX1NIT1JUX0NJUkNVSVQJCTB4MDAwMDAwMDQKKyNkZWZpbmUgR0JfTElHSFRTX0ZMQVNIX0ZBVUxUX09WRVJfQ1VSUkVOVAkJMHgwMDAwMDAwOAorI2RlZmluZSBHQl9MSUdIVFNfRkxBU0hfRkFVTFRfSU5ESUNBVE9SCQkJMHgwMDAwMDAxMAorI2RlZmluZSBHQl9MSUdIVFNfRkxBU0hfRkFVTFRfVU5ERVJfVk9MVEFHRQkJMHgwMDAwMDAyMAorI2RlZmluZSBHQl9MSUdIVFNfRkxBU0hfRkFVTFRfSU5QVVRfVk9MVEFHRQkJMHgwMDAwMDA0MAorI2RlZmluZSBHQl9MSUdIVFNfRkxBU0hfRkFVTFRfTEVEX09WRVJfVEVNUEVSQVRVUkUJMHgwMDAwMDA4MAorfSBfX3BhY2tlZDsKKworLyogQXVkaW8gKi8KKworI2RlZmluZSBHQl9BVURJT19UWVBFX0dFVF9UT1BPTE9HWV9TSVpFCQkweDAyCisjZGVmaW5lIEdCX0FVRElPX1RZUEVfR0VUX1RPUE9MT0dZCQkweDAzCisjZGVmaW5lIEdCX0FVRElPX1RZUEVfR0VUX0NPTlRST0wJCTB4MDQKKyNkZWZpbmUgR0JfQVVESU9fVFlQRV9TRVRfQ09OVFJPTAkJMHgwNQorI2RlZmluZSBHQl9BVURJT19UWVBFX0VOQUJMRV9XSURHRVQJCTB4MDYKKyNkZWZpbmUgR0JfQVVESU9fVFlQRV9ESVNBQkxFX1dJREdFVAkJMHgwNworI2RlZmluZSBHQl9BVURJT19UWVBFX0dFVF9QQ00JCQkweDA4CisjZGVmaW5lIEdCX0FVRElPX1RZUEVfU0VUX1BDTQkJCTB4MDkKKyNkZWZpbmUgR0JfQVVESU9fVFlQRV9TRVRfVFhfREFUQV9TSVpFCQkweDBhCisJCQkJCQkvKiAweDBiIHVudXNlZCAqLworI2RlZmluZSBHQl9BVURJT19UWVBFX0FDVElWQVRFX1RYCQkweDBjCisjZGVmaW5lIEdCX0FVRElPX1RZUEVfREVBQ1RJVkFURV9UWAkJMHgwZAorI2RlZmluZSBHQl9BVURJT19UWVBFX1NFVF9SWF9EQVRBX1NJWkUJCTB4MGUKKwkJCQkJCS8qIDB4MGYgdW51c2VkICovCisjZGVmaW5lIEdCX0FVRElPX1RZUEVfQUNUSVZBVEVfUlgJCTB4MTAKKyNkZWZpbmUgR0JfQVVESU9fVFlQRV9ERUFDVElWQVRFX1JYCQkweDExCisjZGVmaW5lIEdCX0FVRElPX1RZUEVfSkFDS19FVkVOVAkJMHgxMgorI2RlZmluZSBHQl9BVURJT19UWVBFX0JVVFRPTl9FVkVOVAkJMHgxMworI2RlZmluZSBHQl9BVURJT19UWVBFX1NUUkVBTUlOR19FVkVOVAkJMHgxNAorI2RlZmluZSBHQl9BVURJT19UWVBFX1NFTkRfREFUQQkJCTB4MTUKKworLyogTW9kdWxlIG11c3QgYmUgYWJsZSB0byBidWZmZXIgMTBtcyBvZiBhdWRpbyBkYXRhLCBtaW5pbXVtICovCisjZGVmaW5lIEdCX0FVRElPX1NBTVBMRV9CVUZGRVJfTUlOX1VTCQkxMDAwMAorCisjZGVmaW5lIEdCX0FVRElPX1BDTV9OQU1FX01BWAkJCTMyCisjZGVmaW5lIEFVRElPX0RBSV9OQU1FX01BWAkJCTMyCisjZGVmaW5lIEFVRElPX0NPTlRST0xfTkFNRV9NQVgJCQkzMgorI2RlZmluZSBBVURJT19DVExfRUxFTV9OQU1FX01BWAkJCTQ0CisjZGVmaW5lIEFVRElPX0VOVU1fTkFNRV9NQVgJCQk2NAorI2RlZmluZSBBVURJT19XSURHRVRfTkFNRV9NQVgJCQkzMgorCisvKiBTZWUgU05EUlZfUENNX0ZNVEJJVF8qIGluIExpbnV4IHNvdXJjZSAqLworI2RlZmluZSBHQl9BVURJT19QQ01fRk1UX1M4CQkJQklUKDApCisjZGVmaW5lIEdCX0FVRElPX1BDTV9GTVRfVTgJCQlCSVQoMSkKKyNkZWZpbmUgR0JfQVVESU9fUENNX0ZNVF9TMTZfTEUJCQlCSVQoMikKKyNkZWZpbmUgR0JfQVVESU9fUENNX0ZNVF9TMTZfQkUJCQlCSVQoMykKKyNkZWZpbmUgR0JfQVVESU9fUENNX0ZNVF9VMTZfTEUJCQlCSVQoNCkKKyNkZWZpbmUgR0JfQVVESU9fUENNX0ZNVF9VMTZfQkUJCQlCSVQoNSkKKyNkZWZpbmUgR0JfQVVESU9fUENNX0ZNVF9TMjRfTEUJCQlCSVQoNikKKyNkZWZpbmUgR0JfQVVESU9fUENNX0ZNVF9TMjRfQkUJCQlCSVQoNykKKyNkZWZpbmUgR0JfQVVESU9fUENNX0ZNVF9VMjRfTEUJCQlCSVQoOCkKKyNkZWZpbmUgR0JfQVVESU9fUENNX0ZNVF9VMjRfQkUJCQlCSVQoOSkKKyNkZWZpbmUgR0JfQVVESU9fUENNX0ZNVF9TMzJfTEUJCQlCSVQoMTApCisjZGVmaW5lIEdCX0FVRElPX1BDTV9GTVRfUzMyX0JFCQkJQklUKDExKQorI2RlZmluZSBHQl9BVURJT19QQ01fRk1UX1UzMl9MRQkJCUJJVCgxMikKKyNkZWZpbmUgR0JfQVVESU9fUENNX0ZNVF9VMzJfQkUJCQlCSVQoMTMpCisKKy8qIFNlZSBTTkRSVl9QQ01fUkFURV8qIGluIExpbnV4IHNvdXJjZSAqLworI2RlZmluZSBHQl9BVURJT19QQ01fUkFURV81NTEyCQkJQklUKDApCisjZGVmaW5lIEdCX0FVRElPX1BDTV9SQVRFXzgwMDAJCQlCSVQoMSkKKyNkZWZpbmUgR0JfQVVESU9fUENNX1JBVEVfMTEwMjUJCQlCSVQoMikKKyNkZWZpbmUgR0JfQVVESU9fUENNX1JBVEVfMTYwMDAJCQlCSVQoMykKKyNkZWZpbmUgR0JfQVVESU9fUENNX1JBVEVfMjIwNTAJCQlCSVQoNCkKKyNkZWZpbmUgR0JfQVVESU9fUENNX1JBVEVfMzIwMDAJCQlCSVQoNSkKKyNkZWZpbmUgR0JfQVVESU9fUENNX1JBVEVfNDQxMDAJCQlCSVQoNikKKyNkZWZpbmUgR0JfQVVESU9fUENNX1JBVEVfNDgwMDAJCQlCSVQoNykKKyNkZWZpbmUgR0JfQVVESU9fUENNX1JBVEVfNjQwMDAJCQlCSVQoOCkKKyNkZWZpbmUgR0JfQVVESU9fUENNX1JBVEVfODgyMDAJCQlCSVQoOSkKKyNkZWZpbmUgR0JfQVVESU9fUENNX1JBVEVfOTYwMDAJCQlCSVQoMTApCisjZGVmaW5lIEdCX0FVRElPX1BDTV9SQVRFXzE3NjQwMAkJQklUKDExKQorI2RlZmluZSBHQl9BVURJT19QQ01fUkFURV8xOTIwMDAJCUJJVCgxMikKKworI2RlZmluZSBHQl9BVURJT19TVFJFQU1fVFlQRV9DQVBUVVJFCQkweDEKKyNkZWZpbmUgR0JfQVVESU9fU1RSRUFNX1RZUEVfUExBWUJBQ0sJCTB4MgorCisjZGVmaW5lIEdCX0FVRElPX0NUTF9FTEVNX0FDQ0VTU19SRUFECQlCSVQoMCkKKyNkZWZpbmUgR0JfQVVESU9fQ1RMX0VMRU1fQUNDRVNTX1dSSVRFCQlCSVQoMSkKKworLyogU2VlIFNORFJWX0NUTF9FTEVNX1RZUEVfKiBpbiBMaW51eCBzb3VyY2UgKi8KKyNkZWZpbmUgR0JfQVVESU9fQ1RMX0VMRU1fVFlQRV9CT09MRUFOCQkweDAxCisjZGVmaW5lIEdCX0FVRElPX0NUTF9FTEVNX1RZUEVfSU5URUdFUgkJMHgwMgorI2RlZmluZSBHQl9BVURJT19DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQJMHgwMworI2RlZmluZSBHQl9BVURJT19DVExfRUxFTV9UWVBFX0lOVEVHRVI2NAkweDA2CisKKy8qIFNlZSBTTkRSVl9DVExfRUxFTV9JRkFDRV8qIGluIExpbnV4IHNvdXJjZSAqLworI2RlZmluZSBHQl9BVURJT19DVExfRUxFTV9JRkFDRV9DQVJECQkweDAwCisjZGVmaW5lIEdCX0FVRElPX0NUTF9FTEVNX0lGQUNFX0hXREVQCQkweDAxCisjZGVmaW5lIEdCX0FVRElPX0NUTF9FTEVNX0lGQUNFX01JWEVSCQkweDAyCisjZGVmaW5lIEdCX0FVRElPX0NUTF9FTEVNX0lGQUNFX1BDTQkJMHgwMworI2RlZmluZSBHQl9BVURJT19DVExfRUxFTV9JRkFDRV9SQVdNSURJCQkweDA0CisjZGVmaW5lIEdCX0FVRElPX0NUTF9FTEVNX0lGQUNFX1RJTUVSCQkweDA1CisjZGVmaW5lIEdCX0FVRElPX0NUTF9FTEVNX0lGQUNFX1NFUVVFTkNFUgkweDA2CisKKy8qIFNORFJWX0NUTF9FTEVNX0FDQ0VTU18qIGluIExpbnV4IHNvdXJjZSAqLworI2RlZmluZSBHQl9BVURJT19BQ0NFU1NfUkVBRAkJCUJJVCgwKQorI2RlZmluZSBHQl9BVURJT19BQ0NFU1NfV1JJVEUJCQlCSVQoMSkKKyNkZWZpbmUgR0JfQVVESU9fQUNDRVNTX1ZPTEFUSUxFCQlCSVQoMikKKyNkZWZpbmUgR0JfQVVESU9fQUNDRVNTX1RJTUVTVEFNUAkJQklUKDMpCisjZGVmaW5lIEdCX0FVRElPX0FDQ0VTU19UTFZfUkVBRAkJQklUKDQpCisjZGVmaW5lIEdCX0FVRElPX0FDQ0VTU19UTFZfV1JJVEUJCUJJVCg1KQorI2RlZmluZSBHQl9BVURJT19BQ0NFU1NfVExWX0NPTU1BTkQJCUJJVCg2KQorI2RlZmluZSBHQl9BVURJT19BQ0NFU1NfSU5BQ1RJVkUJCUJJVCg3KQorI2RlZmluZSBHQl9BVURJT19BQ0NFU1NfTE9DSwkJCUJJVCg4KQorI2RlZmluZSBHQl9BVURJT19BQ0NFU1NfT1dORVIJCQlCSVQoOSkKKworLyogZW51bSBzbmRfc29jX2RhcG1fdHlwZSAqLworI2RlZmluZSBHQl9BVURJT19XSURHRVRfVFlQRV9JTlBVVAkJMHgwCisjZGVmaW5lIEdCX0FVRElPX1dJREdFVF9UWVBFX09VVFBVVAkJMHgxCisjZGVmaW5lIEdCX0FVRElPX1dJREdFVF9UWVBFX01VWAkJMHgyCisjZGVmaW5lIEdCX0FVRElPX1dJREdFVF9UWVBFX1ZJUlRfTVVYCQkweDMKKyNkZWZpbmUgR0JfQVVESU9fV0lER0VUX1RZUEVfVkFMVUVfTVVYCQkweDQKKyNkZWZpbmUgR0JfQVVESU9fV0lER0VUX1RZUEVfTUlYRVIJCTB4NQorI2RlZmluZSBHQl9BVURJT19XSURHRVRfVFlQRV9NSVhFUl9OQU1FRF9DVEwJMHg2CisjZGVmaW5lIEdCX0FVRElPX1dJREdFVF9UWVBFX1BHQQkJMHg3CisjZGVmaW5lIEdCX0FVRElPX1dJREdFVF9UWVBFX09VVF9EUlYJCTB4OAorI2RlZmluZSBHQl9BVURJT19XSURHRVRfVFlQRV9BREMJCTB4OQorI2RlZmluZSBHQl9BVURJT19XSURHRVRfVFlQRV9EQUMJCTB4YQorI2RlZmluZSBHQl9BVURJT19XSURHRVRfVFlQRV9NSUNCSUFTCQkweGIKKyNkZWZpbmUgR0JfQVVESU9fV0lER0VUX1RZUEVfTUlDCQkweGMKKyNkZWZpbmUgR0JfQVVESU9fV0lER0VUX1RZUEVfSFAJCQkweGQKKyNkZWZpbmUgR0JfQVVESU9fV0lER0VUX1RZUEVfU1BLCQkweGUKKyNkZWZpbmUgR0JfQVVESU9fV0lER0VUX1RZUEVfTElORQkJMHhmCisjZGVmaW5lIEdCX0FVRElPX1dJREdFVF9UWVBFX1NXSVRDSAkJMHgxMAorI2RlZmluZSBHQl9BVURJT19XSURHRVRfVFlQRV9WTUlECQkweDExCisjZGVmaW5lIEdCX0FVRElPX1dJREdFVF9UWVBFX1BSRQkJMHgxMgorI2RlZmluZSBHQl9BVURJT19XSURHRVRfVFlQRV9QT1NUCQkweDEzCisjZGVmaW5lIEdCX0FVRElPX1dJREdFVF9UWVBFX1NVUFBMWQkJMHgxNAorI2RlZmluZSBHQl9BVURJT19XSURHRVRfVFlQRV9SRUdVTEFUT1JfU1VQUExZCTB4MTUKKyNkZWZpbmUgR0JfQVVESU9fV0lER0VUX1RZUEVfQ0xPQ0tfU1VQUExZCTB4MTYKKyNkZWZpbmUgR0JfQVVESU9fV0lER0VUX1RZUEVfQUlGX0lOCQkweDE3CisjZGVmaW5lIEdCX0FVRElPX1dJREdFVF9UWVBFX0FJRl9PVVQJCTB4MTgKKyNkZWZpbmUgR0JfQVVESU9fV0lER0VUX1RZUEVfU0lHR0VOCQkweDE5CisjZGVmaW5lIEdCX0FVRElPX1dJREdFVF9UWVBFX0RBSV9JTgkJMHgxYQorI2RlZmluZSBHQl9BVURJT19XSURHRVRfVFlQRV9EQUlfT1VUCQkweDFiCisjZGVmaW5lIEdCX0FVRElPX1dJREdFVF9UWVBFX0RBSV9MSU5LCQkweDFjCisKKyNkZWZpbmUgR0JfQVVESU9fV0lER0VUX1NUQVRFX0RJU0FCTEVECQkweDAxCisjZGVmaW5lIEdCX0FVRElPX1dJREdFVF9TVEFURV9FTkFBQkxFRAkJMHgwMgorCisjZGVmaW5lIEdCX0FVRElPX0pBQ0tfRVZFTlRfSU5TRVJUSU9OCQkweDEKKyNkZWZpbmUgR0JfQVVESU9fSkFDS19FVkVOVF9SRU1PVkFMCQkweDIKKworI2RlZmluZSBHQl9BVURJT19CVVRUT05fRVZFTlRfUFJFU1MJCTB4MQorI2RlZmluZSBHQl9BVURJT19CVVRUT05fRVZFTlRfUkVMRUFTRQkJMHgyCisKKyNkZWZpbmUgR0JfQVVESU9fU1RSRUFNSU5HX0VWRU5UX1VOU1BFQ0lGSUVECTB4MQorI2RlZmluZSBHQl9BVURJT19TVFJFQU1JTkdfRVZFTlRfSEFMVAkJMHgyCisjZGVmaW5lIEdCX0FVRElPX1NUUkVBTUlOR19FVkVOVF9JTlRFUk5BTF9FUlJPUgkweDMKKyNkZWZpbmUgR0JfQVVESU9fU1RSRUFNSU5HX0VWRU5UX1BST1RPQ09MX0VSUk9SCTB4NAorI2RlZmluZSBHQl9BVURJT19TVFJFQU1JTkdfRVZFTlRfRkFJTFVSRQkweDUKKyNkZWZpbmUgR0JfQVVESU9fU1RSRUFNSU5HX0VWRU5UX1VOREVSUlVOCTB4NgorI2RlZmluZSBHQl9BVURJT19TVFJFQU1JTkdfRVZFTlRfT1ZFUlJVTgkweDcKKyNkZWZpbmUgR0JfQVVESU9fU1RSRUFNSU5HX0VWRU5UX0NMT0NLSU5HCTB4OAorI2RlZmluZSBHQl9BVURJT19TVFJFQU1JTkdfRVZFTlRfREFUQV9MRU4JMHg5CisKKyNkZWZpbmUgR0JfQVVESU9fSU5WQUxJRF9JTkRFWAkJCTB4ZmYKKworLyogZW51bSBzbmRfamFja190eXBlcyAqLworI2RlZmluZSBHQl9BVURJT19KQUNLX0hFQURQSE9ORQkJCTB4MDAwMDAwMQorI2RlZmluZSBHQl9BVURJT19KQUNLX01JQ1JPUEhPTkUJCTB4MDAwMDAwMgorI2RlZmluZSBHQl9BVURJT19KQUNLX0hFQURTRVQJCQkoR0JfQVVESU9fSkFDS19IRUFEUEhPTkUgfCBcCisJCQkJCQkgR0JfQVVESU9fSkFDS19NSUNST1BIT05FKQorI2RlZmluZSBHQl9BVURJT19KQUNLX0xJTkVPVVQJCQkweDAwMDAwMDQKKyNkZWZpbmUgR0JfQVVESU9fSkFDS19NRUNIQU5JQ0FMCQkweDAwMDAwMDgKKyNkZWZpbmUgR0JfQVVESU9fSkFDS19WSURFT09VVAkJCTB4MDAwMDAxMAorI2RlZmluZSBHQl9BVURJT19KQUNLX0FWT1VUCQkJKEdCX0FVRElPX0pBQ0tfTElORU9VVCB8IFwKKwkJCQkJCSBHQl9BVURJT19KQUNLX1ZJREVPT1VUKQorI2RlZmluZSBHQl9BVURJT19KQUNLX0xJTkVJTgkJCTB4MDAwMDAyMAorI2RlZmluZSBHQl9BVURJT19KQUNLX09DX0hQSEwJCQkweDAwMDAwNDAKKyNkZWZpbmUgR0JfQVVESU9fSkFDS19PQ19IUEhSCQkJMHgwMDAwMDgwCisjZGVmaW5lIEdCX0FVRElPX0pBQ0tfTUlDUk9QSE9ORTIJCTB4MDAwMDIwMAorI2RlZmluZSBHQl9BVURJT19KQUNLX0FOQ19IRUFEUEhPTkUJCShHQl9BVURJT19KQUNLX0hFQURQSE9ORSB8IFwKKwkJCQkJCSBHQl9BVURJT19KQUNLX01JQ1JPUEhPTkUgfCBcCisJCQkJCQkgR0JfQVVESU9fSkFDS19NSUNST1BIT05FMikKKy8qIEtlcHQgc2VwYXJhdGUgZnJvbSBzd2l0Y2hlcyB0byBmYWNpbGl0YXRlIGltcGxlbWVudGF0aW9uICovCisjZGVmaW5lIEdCX0FVRElPX0pBQ0tfQlROXzAJCQkweDQwMDAwMDAKKyNkZWZpbmUgR0JfQVVESU9fSkFDS19CVE5fMQkJCTB4MjAwMDAwMAorI2RlZmluZSBHQl9BVURJT19KQUNLX0JUTl8yCQkJMHgxMDAwMDAwCisjZGVmaW5lIEdCX0FVRElPX0pBQ0tfQlROXzMJCQkweDA4MDAwMDAKKworc3RydWN0IGdiX2F1ZGlvX3BjbSB7CisJX191OAlzdHJlYW1fbmFtZVtHQl9BVURJT19QQ01fTkFNRV9NQVhdOworCV9fbGUzMglmb3JtYXRzOwkvKiBHQl9BVURJT19QQ01fRk1UXyogKi8KKwlfX2xlMzIJcmF0ZXM7CQkvKiBHQl9BVURJT19QQ01fUkFURV8qICovCisJX191OAljaGFuX21pbjsKKwlfX3U4CWNoYW5fbWF4OworCV9fdTgJc2lnX2JpdHM7CS8qIG51bWJlciBvZiBiaXRzIG9mIGNvbnRlbnQgKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9hdWRpb19kYWkgeworCV9fdTgJCQluYW1lW0FVRElPX0RBSV9OQU1FX01BWF07CisJX19sZTE2CQkJZGF0YV9jcG9ydDsKKwlzdHJ1Y3QgZ2JfYXVkaW9fcGNtCWNhcHR1cmU7CisJc3RydWN0IGdiX2F1ZGlvX3BjbQlwbGF5YmFjazsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9hdWRpb19pbnRlZ2VyIHsKKwlfX2xlMzIJbWluOworCV9fbGUzMgltYXg7CisJX19sZTMyCXN0ZXA7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfYXVkaW9faW50ZWdlcjY0IHsKKwlfX2xlNjQJbWluOworCV9fbGU2NAltYXg7CisJX19sZTY0CXN0ZXA7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfYXVkaW9fZW51bWVyYXRlZCB7CisJX19sZTMyCWl0ZW1zOworCV9fbGUxNgluYW1lc19sZW5ndGg7CisJX191OAluYW1lc1swXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9hdWRpb19jdGxfZWxlbV9pbmZvIHsgLyogU2VlIHNuZF9jdGxfZWxlbV9pbmZvIGluIExpbnV4IHNvdXJjZSAqLworCV9fdTgJCXR5cGU7CQkvKiBHQl9BVURJT19DVExfRUxFTV9UWVBFXyogKi8KKwlfX2xlMTYJCWRpbWVuWzRdOworCXVuaW9uIHsKKwkJc3RydWN0IGdiX2F1ZGlvX2ludGVnZXIJCWludGVnZXI7CisJCXN0cnVjdCBnYl9hdWRpb19pbnRlZ2VyNjQJaW50ZWdlcjY0OworCQlzdHJ1Y3QgZ2JfYXVkaW9fZW51bWVyYXRlZAllbnVtZXJhdGVkOworCX0gdmFsdWU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfYXVkaW9fY3RsX2VsZW1fdmFsdWUgeyAvKiBTZWUgc25kX2N0bF9lbGVtX3ZhbHVlIGluIExpbnV4IHNvdXJjZSAqLworCV9fbGU2NAkJCQl0aW1lc3RhbXA7IC8qIFhYWCBuZWVkZWQ/ICovCisJdW5pb24geworCQlfX2xlMzIJaW50ZWdlcl92YWx1ZVsyXTsJLyogY29uc2lkZXIgQ1RMX0RPVUJMRV94eHggKi8KKwkJX19sZTY0CWludGVnZXI2NF92YWx1ZVsyXTsKKwkJX19sZTMyCWVudW1lcmF0ZWRfaXRlbVsyXTsKKwl9IHZhbHVlOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2F1ZGlvX2NvbnRyb2wgeworCV9fdTgJbmFtZVtBVURJT19DT05UUk9MX05BTUVfTUFYXTsKKwlfX3U4CWlkOwkJLyogMC02MyAqLworCV9fdTgJaWZhY2U7CQkvKiBHQl9BVURJT19JRkFDRV8qICovCisJX19sZTE2CWRhdGFfY3BvcnQ7CisJX19sZTMyCWFjY2VzczsJCS8qIEdCX0FVRElPX0FDQ0VTU18qICovCisJX191OCAgICBjb3VudDsJCS8qIGNvdW50IG9mIHNhbWUgZWxlbWVudHMgKi8KKwlfX3U4CWNvdW50X3ZhbHVlczsJLyogY291bnQgb2YgdmFsdWVzLCBtYXg9MiBmb3IgQ1RMX0RPVUJMRV94eHggKi8KKwlzdHJ1Y3QgZ2JfYXVkaW9fY3RsX2VsZW1faW5mbwlpbmZvOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2F1ZGlvX3dpZGdldCB7CisJX191OAluYW1lW0FVRElPX1dJREdFVF9OQU1FX01BWF07CisJX191OAlzbmFtZVtBVURJT19XSURHRVRfTkFNRV9NQVhdOworCV9fdTgJaWQ7CisJX191OAl0eXBlOwkJLyogR0JfQVVESU9fV0lER0VUX1RZUEVfKiAqLworCV9fdTgJc3RhdGU7CQkvKiBHQl9BVURJT19XSURHRVRfU1RBVEVfKiAqLworCV9fdTgJbmNvbnRyb2xzOworCXN0cnVjdCBnYl9hdWRpb19jb250cm9sCWN0bFswXTsJLyogJ25jb250cm9scycgZW50cmllcyAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2F1ZGlvX3JvdXRlIHsKKwlfX3U4CXNvdXJjZV9pZDsJLyogd2lkZ2V0IGlkICovCisJX191OAlkZXN0aW5hdGlvbl9pZDsJLyogd2lkZ2V0IGlkICovCisJX191OAljb250cm9sX2lkOwkvKiAwLTYzICovCisJX191OAlpbmRleDsJCS8qIFNlbGVjdGlvbiB3aXRoaW4gdGhlIGNvbnRyb2wgKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9hdWRpb190b3BvbG9neSB7CisJX191OAludW1fZGFpczsKKwlfX3U4CW51bV9jb250cm9sczsKKwlfX3U4CW51bV93aWRnZXRzOworCV9fdTgJbnVtX3JvdXRlczsKKwlfX2xlMzIJc2l6ZV9kYWlzOworCV9fbGUzMglzaXplX2NvbnRyb2xzOworCV9fbGUzMglzaXplX3dpZGdldHM7CisJX19sZTMyCXNpemVfcm91dGVzOworCV9fbGUzMglqYWNrX3R5cGU7CisJLyoKKwkgKiBzdHJ1Y3QgZ2JfYXVkaW9fZGFpCQlkYWlbbnVtX2RhaXNdOworCSAqIHN0cnVjdCBnYl9hdWRpb19jb250cm9sCWNvbnRyb2xzW251bV9jb250cm9sc107CisJICogc3RydWN0IGdiX2F1ZGlvX3dpZGdldAl3aWRnZXRzW251bV93aWRnZXRzXTsKKwkgKiBzdHJ1Y3QgZ2JfYXVkaW9fcm91dGUJcm91dGVzW251bV9yb3V0ZXNdOworCSAqLworCV9fdTgJZGF0YVswXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9hdWRpb19nZXRfdG9wb2xvZ3lfc2l6ZV9yZXNwb25zZSB7CisJX19sZTE2CXNpemU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfYXVkaW9fZ2V0X3RvcG9sb2d5X3Jlc3BvbnNlIHsKKwlzdHJ1Y3QgZ2JfYXVkaW9fdG9wb2xvZ3kJdG9wb2xvZ3k7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfYXVkaW9fZ2V0X2NvbnRyb2xfcmVxdWVzdCB7CisJX191OAljb250cm9sX2lkOworCV9fdTgJaW5kZXg7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfYXVkaW9fZ2V0X2NvbnRyb2xfcmVzcG9uc2UgeworCXN0cnVjdCBnYl9hdWRpb19jdGxfZWxlbV92YWx1ZQl2YWx1ZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9hdWRpb19zZXRfY29udHJvbF9yZXF1ZXN0IHsKKwlfX3U4CWNvbnRyb2xfaWQ7CisJX191OAlpbmRleDsKKwlzdHJ1Y3QgZ2JfYXVkaW9fY3RsX2VsZW1fdmFsdWUJdmFsdWU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfYXVkaW9fZW5hYmxlX3dpZGdldF9yZXF1ZXN0IHsKKwlfX3U4CXdpZGdldF9pZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9hdWRpb19kaXNhYmxlX3dpZGdldF9yZXF1ZXN0IHsKKwlfX3U4CXdpZGdldF9pZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9hdWRpb19nZXRfcGNtX3JlcXVlc3QgeworCV9fbGUxNglkYXRhX2Nwb3J0OworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2F1ZGlvX2dldF9wY21fcmVzcG9uc2UgeworCV9fbGUzMglmb3JtYXQ7CisJX19sZTMyCXJhdGU7CisJX191OAljaGFubmVsczsKKwlfX3U4CXNpZ19iaXRzOworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2F1ZGlvX3NldF9wY21fcmVxdWVzdCB7CisJX19sZTE2CWRhdGFfY3BvcnQ7CisJX19sZTMyCWZvcm1hdDsKKwlfX2xlMzIJcmF0ZTsKKwlfX3U4CWNoYW5uZWxzOworCV9fdTgJc2lnX2JpdHM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfYXVkaW9fc2V0X3R4X2RhdGFfc2l6ZV9yZXF1ZXN0IHsKKwlfX2xlMTYJZGF0YV9jcG9ydDsKKwlfX2xlMTYJc2l6ZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9hdWRpb19hY3RpdmF0ZV90eF9yZXF1ZXN0IHsKKwlfX2xlMTYJZGF0YV9jcG9ydDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9hdWRpb19kZWFjdGl2YXRlX3R4X3JlcXVlc3QgeworCV9fbGUxNglkYXRhX2Nwb3J0OworfSBfX3BhY2tlZDsKKworc3RydWN0IGdiX2F1ZGlvX3NldF9yeF9kYXRhX3NpemVfcmVxdWVzdCB7CisJX19sZTE2CWRhdGFfY3BvcnQ7CisJX19sZTE2CXNpemU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfYXVkaW9fYWN0aXZhdGVfcnhfcmVxdWVzdCB7CisJX19sZTE2CWRhdGFfY3BvcnQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZ2JfYXVkaW9fZGVhY3RpdmF0ZV9yeF9yZXF1ZXN0IHsKKwlfX2xlMTYJZGF0YV9jcG9ydDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9hdWRpb19qYWNrX2V2ZW50X3JlcXVlc3QgeworCV9fdTgJd2lkZ2V0X2lkOworCV9fdTgJamFja19hdHRyaWJ1dGU7CisJX191OAlldmVudDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9hdWRpb19idXR0b25fZXZlbnRfcmVxdWVzdCB7CisJX191OAl3aWRnZXRfaWQ7CisJX191OAlidXR0b25faWQ7CisJX191OAlldmVudDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9hdWRpb19zdHJlYW1pbmdfZXZlbnRfcmVxdWVzdCB7CisJX19sZTE2CWRhdGFfY3BvcnQ7CisJX191OAlldmVudDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBnYl9hdWRpb19zZW5kX2RhdGFfcmVxdWVzdCB7CisJX19sZTY0CXRpbWVzdGFtcDsKKwlfX3U4CWRhdGFbMF07Cit9IF9fcGFja2VkOworCisKKy8qIExvZyAqLworCisvKiBvcGVyYXRpb25zICovCisjZGVmaW5lIEdCX0xPR19UWVBFX1NFTkRfTE9HCTB4MDIKKworLyogbGVuZ3RoICovCisjZGVmaW5lIEdCX0xPR19NQVhfTEVOCQkxMDI0CisKK3N0cnVjdCBnYl9sb2dfc2VuZF9sb2dfcmVxdWVzdCB7CisJX19sZTE2CWxlbjsKKwlfX3U4ICAgIG1zZ1swXTsKK30gX19wYWNrZWQ7CisKKyNlbmRpZiAvKiBfX0dSRVlCVVNfUFJPVE9DT0xTX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZ3JleWJ1c190cmFjZS5oIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZ3JleWJ1c190cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmODY5MmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9ncmV5YnVzX3RyYWNlLmgKQEAgLTAsMCArMSw1MzEgQEAKKy8qCisgKiBHcmV5YnVzIGRyaXZlciBhbmQgZGV2aWNlIEFQSQorICoKKyAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNSBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisjdW5kZWYgVFJBQ0VfU1lTVEVNCisjZGVmaW5lIFRSQUNFX1NZU1RFTSBncmV5YnVzCisKKyNpZiAhZGVmaW5lZChfVFJBQ0VfR1JFWUJVU19IKSB8fCBkZWZpbmVkKFRSQUNFX0hFQURFUl9NVUxUSV9SRUFEKQorI2RlZmluZSBfVFJBQ0VfR1JFWUJVU19ICisKKyNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CisKK3N0cnVjdCBnYl9tZXNzYWdlOworc3RydWN0IGdiX29wZXJhdGlvbjsKK3N0cnVjdCBnYl9jb25uZWN0aW9uOworc3RydWN0IGdiX2J1bmRsZTsKK3N0cnVjdCBnYl9ob3N0X2RldmljZTsKKworREVDTEFSRV9FVkVOVF9DTEFTUyhnYl9tZXNzYWdlLAorCisJVFBfUFJPVE8oc3RydWN0IGdiX21lc3NhZ2UgKm1lc3NhZ2UpLAorCisJVFBfQVJHUyhtZXNzYWdlKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQodTE2LCBzaXplKQorCQlfX2ZpZWxkKHUxNiwgb3BlcmF0aW9uX2lkKQorCQlfX2ZpZWxkKHU4LCB0eXBlKQorCQlfX2ZpZWxkKHU4LCByZXN1bHQpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5zaXplID0gbGUxNl90b19jcHUobWVzc2FnZS0+aGVhZGVyLT5zaXplKTsKKwkJX19lbnRyeS0+b3BlcmF0aW9uX2lkID0KKwkJCWxlMTZfdG9fY3B1KG1lc3NhZ2UtPmhlYWRlci0+b3BlcmF0aW9uX2lkKTsKKwkJX19lbnRyeS0+dHlwZSA9IG1lc3NhZ2UtPmhlYWRlci0+dHlwZTsKKwkJX19lbnRyeS0+cmVzdWx0ID0gbWVzc2FnZS0+aGVhZGVyLT5yZXN1bHQ7CisJKSwKKworCVRQX3ByaW50aygic2l6ZT0laHUgb3BlcmF0aW9uX2lkPTB4JTA0eCB0eXBlPTB4JTAyeCByZXN1bHQ9MHglMDJ4IiwKKwkJICBfX2VudHJ5LT5zaXplLCBfX2VudHJ5LT5vcGVyYXRpb25faWQsCisJCSAgX19lbnRyeS0+dHlwZSwgX19lbnRyeS0+cmVzdWx0KQorKTsKKworI2RlZmluZSBERUZJTkVfTUVTU0FHRV9FVkVOVChuYW1lKQkJCQkJXAorCQlERUZJTkVfRVZFTlQoZ2JfbWVzc2FnZSwgbmFtZSwJCQkJXAorCQkJCVRQX1BST1RPKHN0cnVjdCBnYl9tZXNzYWdlICptZXNzYWdlKSwJXAorCQkJCVRQX0FSR1MobWVzc2FnZSkpCisKKy8qCisgKiBPY2N1cnMgaW1tZWRpYXRlbHkgYmVmb3JlIGNhbGxpbmcgYSBob3N0IGRldmljZSdzIG1lc3NhZ2Vfc2VuZCgpCisgKiBtZXRob2QuCisgKi8KK0RFRklORV9NRVNTQUdFX0VWRU5UKGdiX21lc3NhZ2Vfc2VuZCk7CisKKy8qCisgKiBPY2N1cnMgYWZ0ZXIgYW4gaW5jb21pbmcgcmVxdWVzdCBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkCisgKi8KK0RFRklORV9NRVNTQUdFX0VWRU5UKGdiX21lc3NhZ2VfcmVjdl9yZXF1ZXN0KTsKKworLyoKKyAqIE9jY3VycyBhZnRlciBhbiBpbmNvbWluZyByZXNwb25zZSBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkLAorICogYWZ0ZXIgaXRzIG1hdGNoaW5nIHJlcXVlc3QgaGFzIGJlZW4gZm91bmQuCisgKi8KK0RFRklORV9NRVNTQUdFX0VWRU5UKGdiX21lc3NhZ2VfcmVjdl9yZXNwb25zZSk7CisKKy8qCisgKiBPY2N1cnMgYWZ0ZXIgYW4gb3BlcmF0aW9uIGhhcyBiZWVuIGNhbmNlbGVkLCBwb3NzaWJseSBiZWZvcmUgdGhlCisgKiBjYW5jZWxsYXRpb24gaXMgY29tcGxldGUuCisgKi8KK0RFRklORV9NRVNTQUdFX0VWRU5UKGdiX21lc3NhZ2VfY2FuY2VsX291dGdvaW5nKTsKKworLyoKKyAqIE9jY3VycyB3aGVuIGFuIGluY29taW5nIHJlcXVlc3QgaXMgY2FuY2VsbGVkOyBpZiB0aGUgcmVzcG9uc2UgaGFzCisgKiBiZWVuIHF1ZXVlZCBmb3Igc2VuZGluZywgdGhpcyBvY2N1cnMgYWZ0ZXIgaXQgaXMgc2VudC4KKyAqLworREVGSU5FX01FU1NBR0VfRVZFTlQoZ2JfbWVzc2FnZV9jYW5jZWxfaW5jb21pbmcpOworCisvKgorICogT2NjdXJzIGluIHRoZSBob3N0IGRyaXZlciBtZXNzYWdlX3NlbmQoKSBmdW5jdGlvbiBqdXN0IHByaW9yIHRvCisgKiBoYW5kaW5nIG9mZiB0aGUgZGF0YSB0byBiZSBwcm9jZXNzZWQgYnkgaGFyZHdhcmUuCisgKi8KK0RFRklORV9NRVNTQUdFX0VWRU5UKGdiX21lc3NhZ2Vfc3VibWl0KTsKKworI3VuZGVmIERFRklORV9NRVNTQUdFX0VWRU5UCisKK0RFQ0xBUkVfRVZFTlRfQ0xBU1MoZ2Jfb3BlcmF0aW9uLAorCisJVFBfUFJPVE8oc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uKSwKKworCVRQX0FSR1Mob3BlcmF0aW9uKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQodTE2LCBjcG9ydF9pZCkJLyogQ1BvcnQgb2YgSEQgc2lkZSBvZiBjb25uZWN0aW9uICovCisJCV9fZmllbGQodTE2LCBpZCkJLyogT3BlcmF0aW9uIElEICovCisJCV9fZmllbGQodTgsIHR5cGUpCisJCV9fZmllbGQodW5zaWduZWQgbG9uZywgZmxhZ3MpCisJCV9fZmllbGQoaW50LCBhY3RpdmUpCisJCV9fZmllbGQoaW50LCB3YWl0ZXJzKQorCQlfX2ZpZWxkKGludCwgZXJybm8pCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5jcG9ydF9pZCA9IG9wZXJhdGlvbi0+Y29ubmVjdGlvbi0+aGRfY3BvcnRfaWQ7CisJCV9fZW50cnktPmlkID0gb3BlcmF0aW9uLT5pZDsKKwkJX19lbnRyeS0+dHlwZSA9IG9wZXJhdGlvbi0+dHlwZTsKKwkJX19lbnRyeS0+ZmxhZ3MgPSBvcGVyYXRpb24tPmZsYWdzOworCQlfX2VudHJ5LT5hY3RpdmUgPSBvcGVyYXRpb24tPmFjdGl2ZTsKKwkJX19lbnRyeS0+d2FpdGVycyA9IGF0b21pY19yZWFkKCZvcGVyYXRpb24tPndhaXRlcnMpOworCQlfX2VudHJ5LT5lcnJubyA9IG9wZXJhdGlvbi0+ZXJybm87CisJKSwKKworCVRQX3ByaW50aygiaWQ9JTA0eCB0eXBlPTB4JTAyeCBjcG9ydF9pZD0lMDR4IGZsYWdzPTB4JWx4IGFjdGl2ZT0lZCB3YWl0ZXJzPSVkIGVycm5vPSVkIiwKKwkJICBfX2VudHJ5LT5pZCwgX19lbnRyeS0+Y3BvcnRfaWQsIF9fZW50cnktPnR5cGUsIF9fZW50cnktPmZsYWdzLAorCQkgIF9fZW50cnktPmFjdGl2ZSwgX19lbnRyeS0+d2FpdGVycywgX19lbnRyeS0+ZXJybm8pCispOworCisjZGVmaW5lIERFRklORV9PUEVSQVRJT05fRVZFTlQobmFtZSkJCQkJCVwKKwkJREVGSU5FX0VWRU5UKGdiX29wZXJhdGlvbiwgbmFtZSwJCQlcCisJCQkJVFBfUFJPVE8oc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uKSwgXAorCQkJCVRQX0FSR1Mob3BlcmF0aW9uKSkKKworLyoKKyAqIE9jY3VycyBhZnRlciBhIG5ldyBvcGVyYXRpb24gaXMgY3JlYXRlZCBmb3IgYW4gb3V0Z29pbmcgcmVxdWVzdAorICogaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuCisgKi8KK0RFRklORV9PUEVSQVRJT05fRVZFTlQoZ2Jfb3BlcmF0aW9uX2NyZWF0ZSk7CisKKy8qCisgKiBPY2N1cnMgYWZ0ZXIgYSBuZXcgY29yZSBvcGVyYXRpb24gaGFzIGJlZW4gY3JlYXRlZC4KKyAqLworREVGSU5FX09QRVJBVElPTl9FVkVOVChnYl9vcGVyYXRpb25fY3JlYXRlX2NvcmUpOworCisvKgorICogT2NjdXJzIGFmdGVyIGEgbmV3IG9wZXJhdGlvbiBoYXMgYmVlbiBjcmVhdGVkIGZvciBhbiBpbmNvbWluZworICogcmVxdWVzdCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWQuCisgKi8KK0RFRklORV9PUEVSQVRJT05fRVZFTlQoZ2Jfb3BlcmF0aW9uX2NyZWF0ZV9pbmNvbWluZyk7CisKKy8qCisgKiBPY2N1cnMgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UgdG8gYW4gb3BlcmF0aW9uIGhhcyBiZWVuIGRyb3BwZWQsCisgKiBwcmlvciB0byBmcmVlaW5nIHJlc291cmNlcy4KKyAqLworREVGSU5FX09QRVJBVElPTl9FVkVOVChnYl9vcGVyYXRpb25fZGVzdHJveSk7CisKKy8qCisgKiBPY2N1cnMgd2hlbiBhbiBvcGVyYXRpb24gaGFzIGJlZW4gbWFya2VkIGFjdGl2ZSwgYWZ0ZXIgdXBkYXRpbmcKKyAqIGl0cyBhY3RpdmUgY291bnQuCisgKi8KK0RFRklORV9PUEVSQVRJT05fRVZFTlQoZ2Jfb3BlcmF0aW9uX2dldF9hY3RpdmUpOworCisvKgorICogT2NjdXJzIHdoZW4gYW4gb3BlcmF0aW9uIGhhcyBiZWVuIG1hcmtlZCBhY3RpdmUsIGJlZm9yZSB1cGRhdGluZworICogaXRzIGFjdGl2ZSBjb3VudC4KKyAqLworREVGSU5FX09QRVJBVElPTl9FVkVOVChnYl9vcGVyYXRpb25fcHV0X2FjdGl2ZSk7CisKKyN1bmRlZiBERUZJTkVfT1BFUkFUSU9OX0VWRU5UCisKK0RFQ0xBUkVfRVZFTlRfQ0xBU1MoZ2JfY29ubmVjdGlvbiwKKworCVRQX1BST1RPKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uKSwKKworCVRQX0FSR1MoY29ubmVjdGlvbiksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKGludCwgaGRfYnVzX2lkKQorCQlfX2ZpZWxkKHU4LCBidW5kbGVfaWQpCisJCS8qIG5hbWUgY29udGFpbnMgImhkX2Nwb3J0X2lkL2ludGZfaWQ6Y3BvcnRfaWQiICovCisJCV9fZHluYW1pY19hcnJheShjaGFyLCBuYW1lLCBzaXplb2YoY29ubmVjdGlvbi0+bmFtZSkpCisJCV9fZmllbGQoZW51bSBnYl9jb25uZWN0aW9uX3N0YXRlLCBzdGF0ZSkKKwkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBmbGFncykKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmhkX2J1c19pZCA9IGNvbm5lY3Rpb24tPmhkLT5idXNfaWQ7CisJCV9fZW50cnktPmJ1bmRsZV9pZCA9IGNvbm5lY3Rpb24tPmJ1bmRsZSA/CisJCQkJY29ubmVjdGlvbi0+YnVuZGxlLT5pZCA6IEJVTkRMRV9JRF9OT05FOworCQltZW1jcHkoX19nZXRfc3RyKG5hbWUpLCBjb25uZWN0aW9uLT5uYW1lLAorCQkJCQlzaXplb2YoY29ubmVjdGlvbi0+bmFtZSkpOworCQlfX2VudHJ5LT5zdGF0ZSA9IGNvbm5lY3Rpb24tPnN0YXRlOworCQlfX2VudHJ5LT5mbGFncyA9IGNvbm5lY3Rpb24tPmZsYWdzOworCSksCisKKwlUUF9wcmludGsoImhkX2J1c19pZD0lZCBidW5kbGVfaWQ9MHglMDJ4IG5hbWU9XCIlc1wiIHN0YXRlPSV1IGZsYWdzPTB4JWx4IiwKKwkJICBfX2VudHJ5LT5oZF9idXNfaWQsIF9fZW50cnktPmJ1bmRsZV9pZCwgX19nZXRfc3RyKG5hbWUpLAorCQkgICh1bnNpZ25lZCBpbnQpX19lbnRyeS0+c3RhdGUsIF9fZW50cnktPmZsYWdzKQorKTsKKworI2RlZmluZSBERUZJTkVfQ09OTkVDVElPTl9FVkVOVChuYW1lKQkJCQkJXAorCQlERUZJTkVfRVZFTlQoZ2JfY29ubmVjdGlvbiwgbmFtZSwJCQlcCisJCQkJVFBfUFJPVE8oc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pLCBcCisJCQkJVFBfQVJHUyhjb25uZWN0aW9uKSkKKworLyoKKyAqIE9jY3VycyBhZnRlciBhIG5ldyBjb25uZWN0aW9uIGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLgorICovCitERUZJTkVfQ09OTkVDVElPTl9FVkVOVChnYl9jb25uZWN0aW9uX2NyZWF0ZSk7CisKKy8qCisgKiBPY2N1cnMgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UgdG8gYSBjb25uZWN0aW9uIGhhcyBiZWVuIGRyb3BwZWQsCisgKiBiZWZvcmUgaXRzIHJlc291cmNlcyBhcmUgZnJlZWQuCisgKi8KK0RFRklORV9DT05ORUNUSU9OX0VWRU5UKGdiX2Nvbm5lY3Rpb25fcmVsZWFzZSk7CisKKy8qCisgKiBPY2N1cnMgd2hlbiBhIG5ldyByZWZlcmVuY2UgdG8gY29ubmVjdGlvbiBpcyBhZGRlZCwgY3VycmVudGx5CisgKiBvbmx5IHdoZW4gYSBtZXNzYWdlIG92ZXIgdGhlIGNvbm5lY3Rpb24gaXMgcmVjZWl2ZWQuCisgKi8KK0RFRklORV9DT05ORUNUSU9OX0VWRU5UKGdiX2Nvbm5lY3Rpb25fZ2V0KTsKKworLyoKKyAqIE9jY3VycyB3aGVuIGEgbmV3IHJlZmVyZW5jZSB0byBjb25uZWN0aW9uIGlzIGRyb3BwZWQsIGFmdGVyIGEKKyAqIGEgcmVjZWl2ZWQgbWVzc2FnZSBpcyBoYW5kbGVkLCBvciB3aGVuIHRoZSBjb25uZWN0aW9uIGlzCisgKiBkZXN0cm95ZWQuCisgKi8KK0RFRklORV9DT05ORUNUSU9OX0VWRU5UKGdiX2Nvbm5lY3Rpb25fcHV0KTsKKworLyoKKyAqIE9jY3VycyB3aGVuIGEgcmVxdWVzdCB0byBlbmFibGUgYSBjb25uZWN0aW9uIGlzIG1hZGUsIGVpdGhlciBmb3IKKyAqIHRyYW5zbWl0IG9ubHksIG9yIGZvciBib3RoIHRyYW5zbWl0IGFuZCByZWNlaXZlLgorICovCitERUZJTkVfQ09OTkVDVElPTl9FVkVOVChnYl9jb25uZWN0aW9uX2VuYWJsZSk7CisKKy8qCisgKiBPY2N1cnMgd2hlbiBhIHJlcXVlc3QgdG8gZGlzYWJsZSBhIGNvbm5lY3Rpb24gaXMgbWFkZSwgZWl0aGVyIGZvcgorICogcmVjZWl2ZSBvbmx5LCBvciBmb3IgYm90aCB0cmFuc21pdCBhbmQgcmVjZWl2ZS4gIEFsc28gb2NjdXJzIHdoZW4KKyAqIGEgcmVxdWVzdCB0byBmb3JjZWZ1bGx5IGRpc2FibGUgYSBjb25uZWN0aW9uIGlzIG1hZGUuCisgKi8KK0RFRklORV9DT05ORUNUSU9OX0VWRU5UKGdiX2Nvbm5lY3Rpb25fZGlzYWJsZSk7CisKKyN1bmRlZiBERUZJTkVfQ09OTkVDVElPTl9FVkVOVAorCitERUNMQVJFX0VWRU5UX0NMQVNTKGdiX2J1bmRsZSwKKworCVRQX1BST1RPKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSksCisKKwlUUF9BUkdTKGJ1bmRsZSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKHU4LCBpbnRmX2lkKQorCQlfX2ZpZWxkKHU4LCBpZCkKKwkJX19maWVsZCh1OCwgY2xhc3MpCisJCV9fZmllbGQoc2l6ZV90LCBudW1fY3BvcnRzKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aW50Zl9pZCA9IGJ1bmRsZS0+aW50Zi0+aW50ZXJmYWNlX2lkOworCQlfX2VudHJ5LT5pZCA9IGJ1bmRsZS0+aWQ7CisJCV9fZW50cnktPmNsYXNzID0gYnVuZGxlLT5jbGFzczsKKwkJX19lbnRyeS0+bnVtX2Nwb3J0cyA9IGJ1bmRsZS0+bnVtX2Nwb3J0czsKKwkpLAorCisJVFBfcHJpbnRrKCJpbnRmX2lkPTB4JTAyeCBpZD0lMDJ4IGNsYXNzPTB4JTAyeCBudW1fY3BvcnRzPSV6dSIsCisJCSAgX19lbnRyeS0+aW50Zl9pZCwgX19lbnRyeS0+aWQsIF9fZW50cnktPmNsYXNzLAorCQkgIF9fZW50cnktPm51bV9jcG9ydHMpCispOworCisjZGVmaW5lIERFRklORV9CVU5ETEVfRVZFTlQobmFtZSkJCQkJCVwKKwkJREVGSU5FX0VWRU5UKGdiX2J1bmRsZSwgbmFtZSwJCQlcCisJCQkJVFBfUFJPVE8oc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlKSwgXAorCQkJCVRQX0FSR1MoYnVuZGxlKSkKKworLyoKKyAqIE9jY3VycyBhZnRlciBhIG5ldyBidW5kbGUgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuCisgKi8KK0RFRklORV9CVU5ETEVfRVZFTlQoZ2JfYnVuZGxlX2NyZWF0ZSk7CisKKy8qCisgKiBPY2N1cnMgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UgdG8gYSBidW5kbGUgaGFzIGJlZW4gZHJvcHBlZCwKKyAqIGJlZm9yZSBpdHMgcmVzb3VyY2VzIGFyZSBmcmVlZC4KKyAqLworREVGSU5FX0JVTkRMRV9FVkVOVChnYl9idW5kbGVfcmVsZWFzZSk7CisKKy8qCisgKiBPY2N1cnMgd2hlbiBhIGJ1bmRsZSBpcyBhZGRlZCB0byBhbiBpbnRlcmZhY2Ugd2hlbiB0aGUgaW50ZXJmYWNlCisgKiBpcyBlbmFibGVkLgorICovCitERUZJTkVfQlVORExFX0VWRU5UKGdiX2J1bmRsZV9hZGQpOworCisvKgorICogT2NjdXJzIHdoZW4gYSByZWdpc3RlcmVkIGJ1bmRsZSBnZXRzIGRlc3Ryb3llZCwgbm9ybWFsbHkgYXQgdGhlCisgKiB0aW1lIGFuIGludGVyZmFjZSBpcyBkaXNhYmxlZC4KKyAqLworREVGSU5FX0JVTkRMRV9FVkVOVChnYl9idW5kbGVfZGVzdHJveSk7CisKKyN1bmRlZiBERUZJTkVfQlVORExFX0VWRU5UCisKK0RFQ0xBUkVfRVZFTlRfQ0xBU1MoZ2JfaW50ZXJmYWNlLAorCisJVFBfUFJPVE8oc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZiksCisKKwlUUF9BUkdTKGludGYpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCh1OCwgbW9kdWxlX2lkKQorCQlfX2ZpZWxkKHU4LCBpZCkJCS8qIEludGVyZmFjZSBpZCAqLworCQlfX2ZpZWxkKHU4LCBkZXZpY2VfaWQpCisJCV9fZmllbGQoaW50LCBkaXNjb25uZWN0ZWQpCS8qIGJvb2wgKi8KKwkJX19maWVsZChpbnQsIGVqZWN0ZWQpCQkvKiBib29sICovCisJCV9fZmllbGQoaW50LCBhY3RpdmUpCQkvKiBib29sICovCisJCV9fZmllbGQoaW50LCBlbmFibGVkKQkJLyogYm9vbCAqLworCQlfX2ZpZWxkKGludCwgbW9kZV9zd2l0Y2gpCS8qIGJvb2wgKi8KKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPm1vZHVsZV9pZCA9IGludGYtPm1vZHVsZS0+bW9kdWxlX2lkOworCQlfX2VudHJ5LT5pZCA9IGludGYtPmludGVyZmFjZV9pZDsKKwkJX19lbnRyeS0+ZGV2aWNlX2lkID0gaW50Zi0+ZGV2aWNlX2lkOworCQlfX2VudHJ5LT5kaXNjb25uZWN0ZWQgPSBpbnRmLT5kaXNjb25uZWN0ZWQ7CisJCV9fZW50cnktPmVqZWN0ZWQgPSBpbnRmLT5lamVjdGVkOworCQlfX2VudHJ5LT5hY3RpdmUgPSBpbnRmLT5hY3RpdmU7CisJCV9fZW50cnktPmVuYWJsZWQgPSBpbnRmLT5lbmFibGVkOworCQlfX2VudHJ5LT5tb2RlX3N3aXRjaCA9IGludGYtPm1vZGVfc3dpdGNoOworCSksCisKKwlUUF9wcmludGsoImludGZfaWQ9JWhodSBkZXZpY2VfaWQ9JWhodSBtb2R1bGVfaWQ9JWhodSBEPSVkIEo9JWQgQT0lZCBFPSVkIE09JWQiLAorCQlfX2VudHJ5LT5pZCwgX19lbnRyeS0+ZGV2aWNlX2lkLCBfX2VudHJ5LT5tb2R1bGVfaWQsCisJCV9fZW50cnktPmRpc2Nvbm5lY3RlZCwgX19lbnRyeS0+ZWplY3RlZCwgX19lbnRyeS0+YWN0aXZlLAorCQlfX2VudHJ5LT5lbmFibGVkLCBfX2VudHJ5LT5tb2RlX3N3aXRjaCkKKyk7CisKKyNkZWZpbmUgREVGSU5FX0lOVEVSRkFDRV9FVkVOVChuYW1lKQkJCQkJXAorCQlERUZJTkVfRVZFTlQoZ2JfaW50ZXJmYWNlLCBuYW1lLAkJCVwKKwkJCQlUUF9QUk9UTyhzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKSwJXAorCQkJCVRQX0FSR1MoaW50ZikpCisKKy8qCisgKiBPY2N1cnMgYWZ0ZXIgYSBuZXcgaW50ZXJmYWNlIGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLgorICovCitERUZJTkVfSU5URVJGQUNFX0VWRU5UKGdiX2ludGVyZmFjZV9jcmVhdGUpOworCisvKgorICogT2NjdXJzIGFmdGVyIHRoZSBsYXN0IHJlZmVyZW5jZSB0byBhbiBpbnRlcmZhY2UgaGFzIGJlZW4gZHJvcHBlZC4KKyAqLworREVGSU5FX0lOVEVSRkFDRV9FVkVOVChnYl9pbnRlcmZhY2VfcmVsZWFzZSk7CisKKy8qCisgKiBPY2N1cnMgYWZ0ZXIgYW4gaW50ZXJmYWNlIGJlZW4gcmVnaXN0ZXJkLgorICovCitERUZJTkVfSU5URVJGQUNFX0VWRU5UKGdiX2ludGVyZmFjZV9hZGQpOworCisvKgorICogT2NjdXJzIHdoZW4gYSByZWdpc3RlcmVkIGludGVyZmFjZSBnZXRzIGRlcmVnaXN0ZXJkLgorICovCitERUZJTkVfSU5URVJGQUNFX0VWRU5UKGdiX2ludGVyZmFjZV9kZWwpOworCisvKgorICogT2NjdXJzIHdoZW4gYSByZWdpc3RlcmVkIGludGVyZmFjZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkKKyAqIGFjdGl2YXRlZC4KKyAqLworREVGSU5FX0lOVEVSRkFDRV9FVkVOVChnYl9pbnRlcmZhY2VfYWN0aXZhdGUpOworCisvKgorICogT2NjdXJzIHdoZW4gYW4gYWN0aXZhdGVkIGludGVyZmFjZSBpcyBiZWluZyBkZWFjdGl2YXRlZC4KKyAqLworREVGSU5FX0lOVEVSRkFDRV9FVkVOVChnYl9pbnRlcmZhY2VfZGVhY3RpdmF0ZSk7CisKKy8qCisgKiBPY2N1cnMgd2hlbiBhbiBpbnRlcmZhY2UgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGVuYWJsZWQuCisgKi8KK0RFRklORV9JTlRFUkZBQ0VfRVZFTlQoZ2JfaW50ZXJmYWNlX2VuYWJsZSk7CisKKy8qCisgKiBPY2N1cnMgd2hlbiBhbiBlbmFibGVkIGludGVyZmFjZSBpcyBiZWluZyBkaXNhYmxlZC4KKyAqLworREVGSU5FX0lOVEVSRkFDRV9FVkVOVChnYl9pbnRlcmZhY2VfZGlzYWJsZSk7CisKKyN1bmRlZiBERUZJTkVfSU5URVJGQUNFX0VWRU5UCisKK0RFQ0xBUkVfRVZFTlRfQ0xBU1MoZ2JfbW9kdWxlLAorCisJVFBfUFJPVE8oc3RydWN0IGdiX21vZHVsZSAqbW9kdWxlKSwKKworCVRQX0FSR1MobW9kdWxlKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoaW50LCBoZF9idXNfaWQpCisJCV9fZmllbGQodTgsIG1vZHVsZV9pZCkKKwkJX19maWVsZChzaXplX3QsIG51bV9pbnRlcmZhY2VzKQorCQlfX2ZpZWxkKGludCwgZGlzY29ubmVjdGVkKQkvKiBib29sICovCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5oZF9idXNfaWQgPSBtb2R1bGUtPmhkLT5idXNfaWQ7CisJCV9fZW50cnktPm1vZHVsZV9pZCA9IG1vZHVsZS0+bW9kdWxlX2lkOworCQlfX2VudHJ5LT5udW1faW50ZXJmYWNlcyA9IG1vZHVsZS0+bnVtX2ludGVyZmFjZXM7CisJCV9fZW50cnktPmRpc2Nvbm5lY3RlZCA9IG1vZHVsZS0+ZGlzY29ubmVjdGVkOworCSksCisKKwlUUF9wcmludGsoImhkX2J1c19pZD0lZCBtb2R1bGVfaWQ9JWhodSBudW1faW50ZXJmYWNlcz0lenUgZGlzY29ubmVjdGVkPSVkIiwKKwkJX19lbnRyeS0+aGRfYnVzX2lkLCBfX2VudHJ5LT5tb2R1bGVfaWQsCisJCV9fZW50cnktPm51bV9pbnRlcmZhY2VzLCBfX2VudHJ5LT5kaXNjb25uZWN0ZWQpCispOworCisjZGVmaW5lIERFRklORV9NT0RVTEVfRVZFTlQobmFtZSkJCQkJCVwKKwkJREVGSU5FX0VWRU5UKGdiX21vZHVsZSwgbmFtZSwJCQkJXAorCQkJCVRQX1BST1RPKHN0cnVjdCBnYl9tb2R1bGUgKm1vZHVsZSksCVwKKwkJCQlUUF9BUkdTKG1vZHVsZSkpCisKKy8qCisgKiBPY2N1cnMgYWZ0ZXIgYSBuZXcgbW9kdWxlIGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLCBiZWZvcmUKKyAqIGNyZWF0aW5nIGFueSBvZiBpdHMgaW50ZXJmYWNlcy4KKyAqLworREVGSU5FX01PRFVMRV9FVkVOVChnYl9tb2R1bGVfY3JlYXRlKTsKKworLyoKKyAqIE9jY3VycyBhZnRlciB0aGUgbGFzdCByZWZlcmVuY2UgdG8gYSBtb2R1bGUgaGFzIGJlZW4gZHJvcHBlZC4KKyAqLworREVGSU5FX01PRFVMRV9FVkVOVChnYl9tb2R1bGVfcmVsZWFzZSk7CisKKy8qCisgKiBPY2N1cnMgYWZ0ZXIgYSBtb2R1bGUgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQsIGJlZm9yZSByZWdpc3RlcmluZworICogYW55IG9mIGl0cyBpbnRlcmZhY2VzLgorICovCitERUZJTkVfTU9EVUxFX0VWRU5UKGdiX21vZHVsZV9hZGQpOworCisvKgorICogT2NjdXJzIHdoZW4gYSBtb2R1bGUgaXMgZGVsZXRlZCwgYmVmb3JlIGRlcmVnaXN0ZXJpbmcgaXRzCisgKiBpbnRlcmZhY2VzLgorICovCitERUZJTkVfTU9EVUxFX0VWRU5UKGdiX21vZHVsZV9kZWwpOworCisjdW5kZWYgREVGSU5FX01PRFVMRV9FVkVOVAorCitERUNMQVJFX0VWRU5UX0NMQVNTKGdiX2hvc3RfZGV2aWNlLAorCisJVFBfUFJPVE8oc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCksCisKKwlUUF9BUkdTKGhkKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoaW50LCBidXNfaWQpCisJCV9fZmllbGQoc2l6ZV90LCBudW1fY3BvcnRzKQorCQlfX2ZpZWxkKHNpemVfdCwgYnVmZmVyX3NpemVfbWF4KQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+YnVzX2lkID0gaGQtPmJ1c19pZDsKKwkJX19lbnRyeS0+bnVtX2Nwb3J0cyA9IGhkLT5udW1fY3BvcnRzOworCQlfX2VudHJ5LT5idWZmZXJfc2l6ZV9tYXggPSBoZC0+YnVmZmVyX3NpemVfbWF4OworCSksCisKKwlUUF9wcmludGsoImJ1c19pZD0lZCBudW1fY3BvcnRzPSV6dSBtdHU9JXp1IiwKKwkJX19lbnRyeS0+YnVzX2lkLCBfX2VudHJ5LT5udW1fY3BvcnRzLAorCQlfX2VudHJ5LT5idWZmZXJfc2l6ZV9tYXgpCispOworCisjZGVmaW5lIERFRklORV9IRF9FVkVOVChuYW1lKQkJCQkJCVwKKwkJREVGSU5FX0VWRU5UKGdiX2hvc3RfZGV2aWNlLCBuYW1lLAkJCVwKKwkJCQlUUF9QUk9UTyhzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkKSwJXAorCQkJCVRQX0FSR1MoaGQpKQorCisvKgorICogT2NjdXJzIGFmdGVyIGEgbmV3IGhvc3QgZGV2aWNlIGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLCBiZWZvcmUKKyAqIGl0cyBTVkMgaGFzIGJlZW4gc2V0IHVwLgorICovCitERUZJTkVfSERfRVZFTlQoZ2JfaGRfY3JlYXRlKTsKKworLyoKKyAqIE9jY3VycyBhZnRlciB0aGUgbGFzdCByZWZlcmVuY2UgdG8gYSBob3N0IGRldmljZSBoYXMgYmVlbgorICogZHJvcHBlZC4KKyAqLworREVGSU5FX0hEX0VWRU5UKGdiX2hkX3JlbGVhc2UpOworCisvKgorICogT2NjdXJzIGFmdGVyIGEgbmV3IGhvc3QgZGV2aWNlIGhhcyBiZWVuIGFkZGVkLCBhZnRlciB0aGUKKyAqIGNvbm5lY3Rpb24gdG8gaXRzIFNWQyBoYXMgYmVlbiBlbmFibGVkLgorICovCitERUZJTkVfSERfRVZFTlQoZ2JfaGRfYWRkKTsKKworLyoKKyAqIE9jY3VycyB3aGVuIGEgaG9zdCBkZXZpY2UgaXMgYmVpbmcgZGlzY29ubmVjdGVkIGZyb20gdGhlIEFQIFVTQgorICogaG9zdCBjb250cm9sbGVyLgorICovCitERUZJTkVfSERfRVZFTlQoZ2JfaGRfZGVsKTsKKworLyoKKyAqIE9jY3VycyB3aGVuIGEgaG9zdCBkZXZpY2UgaGFzIHBhc3NlZCByZWNlaXZlZCBkYXRhIHRvIHRoZSBHcmV5YnVzCisgKiBjb3JlLCBhZnRlciBpdCBoYXMgYmVlbiBkZXRlcm1pbmVkIGl0IGlzIGRlc3RpbmVkIGZvciBhIHZhbGlkCisgKiBDUG9ydC4KKyAqLworREVGSU5FX0hEX0VWRU5UKGdiX2hkX2luKTsKKworI3VuZGVmIERFRklORV9IRF9FVkVOVAorCisvKgorICogT2NjdXJzIG9uIGEgVGltZVN5bmMgc3luY2hyb25pemF0aW9uIGV2ZW50IG9yIGEgVGltZVN5bmMgcGluZyBldmVudC4KKyAqLworVFJBQ0VfRVZFTlQoZ2JfdGltZXN5bmNfaXJxLAorCisJVFBfUFJPVE8odTggcGluZywgdTggc3Ryb2JlLCB1OCBjb3VudCwgdTY0IGZyYW1lX3RpbWUpLAorCisJVFBfQVJHUyhwaW5nLCBzdHJvYmUsIGNvdW50LCBmcmFtZV90aW1lKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQodTgsIHBpbmcpCisJCV9fZmllbGQodTgsIHN0cm9iZSkKKwkJX19maWVsZCh1OCwgY291bnQpCisJCV9fZmllbGQodTY0LCBmcmFtZV90aW1lKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+cGluZyA9IHBpbmc7CisJCV9fZW50cnktPnN0cm9iZSA9IHN0cm9iZTsKKwkJX19lbnRyeS0+Y291bnQgPSBjb3VudDsKKwkJX19lbnRyeS0+ZnJhbWVfdGltZSA9IGZyYW1lX3RpbWU7CisJKSwKKworCVRQX3ByaW50aygiJXMgJWQvJWQgZnJhbWUtdGltZSAlbGx1XG4iLAorCQkgIF9fZW50cnktPnBpbmcgPyAicGluZyIgOiAic3Ryb2JlIiwgX19lbnRyeS0+c3Ryb2JlLAorCQkgIF9fZW50cnktPmNvdW50LCBfX2VudHJ5LT5mcmFtZV90aW1lKQorKTsKKworI2VuZGlmIC8qIF9UUkFDRV9HUkVZQlVTX0ggKi8KKworLyogVGhpcyBwYXJ0IG11c3QgYmUgb3V0c2lkZSBwcm90ZWN0aW9uICovCisjdW5kZWYgVFJBQ0VfSU5DTFVERV9QQVRICisjZGVmaW5lIFRSQUNFX0lOQ0xVREVfUEFUSCAuCisKKy8qCisgKiBUUkFDRV9JTkNMVURFX0ZJTEUgaXMgbm90IG5lZWRlZCBpZiB0aGUgZmlsZW5hbWUgYW5kIFRSQUNFX1NZU1RFTSBhcmUgZXF1YWwKKyAqLworI3VuZGVmIFRSQUNFX0lOQ0xVREVfRklMRQorI2RlZmluZSBUUkFDRV9JTkNMVURFX0ZJTEUgZ3JleWJ1c190cmFjZQorI2luY2x1ZGUgPHRyYWNlL2RlZmluZV90cmFjZS5oPgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9oZC5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvaGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODVhZTNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvaGQuYwpAQCAtMCwwICsxLDI1NyBAQAorLyoKKyAqIEdyZXlidXMgSG9zdCBEZXZpY2UKKyAqCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE1IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE1IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgImdyZXlidXMuaCIKKyNpbmNsdWRlICJncmV5YnVzX3RyYWNlLmgiCisKK0VYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTF9HUEwoZ2JfaGRfY3JlYXRlKTsKK0VYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTF9HUEwoZ2JfaGRfcmVsZWFzZSk7CitFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0xfR1BMKGdiX2hkX2FkZCk7CitFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0xfR1BMKGdiX2hkX2RlbCk7CitFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0xfR1BMKGdiX2hkX2luKTsKK0VYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTF9HUEwoZ2JfbWVzc2FnZV9zdWJtaXQpOworCitzdGF0aWMgc3RydWN0IGlkYSBnYl9oZF9idXNfaWRfbWFwOworCitpbnQgZ2JfaGRfb3V0cHV0KHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHZvaWQgKnJlcSwgdTE2IHNpemUsIHU4IGNtZCwKKwkJIGJvb2wgYXN5bmMpCit7CisJaWYgKCFoZCB8fCAhaGQtPmRyaXZlciB8fCAhaGQtPmRyaXZlci0+b3V0cHV0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gaGQtPmRyaXZlci0+b3V0cHV0KGhkLCByZXEsIHNpemUsIGNtZCwgYXN5bmMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfaGRfb3V0cHV0KTsKKworc3RhdGljIHNzaXplX3QgYnVzX2lkX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCA9IHRvX2diX2hvc3RfZGV2aWNlKGRldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgaGQtPmJ1c19pZCk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFJfUk8oYnVzX2lkKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmJ1c19hdHRyc1tdID0geworCSZkZXZfYXR0cl9idXNfaWQuYXR0ciwKKwlOVUxMCit9OworQVRUUklCVVRFX0dST1VQUyhidXMpOworCitpbnQgZ2JfaGRfY3BvcnRfcmVzZXJ2ZShzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCB1MTYgY3BvcnRfaWQpCit7CisJc3RydWN0IGlkYSAqaWRfbWFwID0gJmhkLT5jcG9ydF9pZF9tYXA7CisJaW50IHJldDsKKworCXJldCA9IGlkYV9zaW1wbGVfZ2V0KGlkX21hcCwgY3BvcnRfaWQsIGNwb3J0X2lkICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmaGQtPmRldiwgImZhaWxlZCB0byByZXNlcnZlIGNwb3J0ICV1XG4iLCBjcG9ydF9pZCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9oZF9jcG9ydF9yZXNlcnZlKTsKKwordm9pZCBnYl9oZF9jcG9ydF9yZWxlYXNlX3Jlc2VydmVkKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHUxNiBjcG9ydF9pZCkKK3sKKwlzdHJ1Y3QgaWRhICppZF9tYXAgPSAmaGQtPmNwb3J0X2lkX21hcDsKKworCWlkYV9zaW1wbGVfcmVtb3ZlKGlkX21hcCwgY3BvcnRfaWQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfaGRfY3BvcnRfcmVsZWFzZV9yZXNlcnZlZCk7CisKKy8qIExvY2tpbmc6IENhbGxlciBndWFyYW50ZWVzIHNlcmlhbGlzYXRpb24gKi8KK2ludCBnYl9oZF9jcG9ydF9hbGxvY2F0ZShzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCBpbnQgY3BvcnRfaWQsCisJCQkJdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgaWRhICppZF9tYXAgPSAmaGQtPmNwb3J0X2lkX21hcDsKKwlpbnQgaWRhX3N0YXJ0LCBpZGFfZW5kOworCisJaWYgKGhkLT5kcml2ZXItPmNwb3J0X2FsbG9jYXRlKQorCQlyZXR1cm4gaGQtPmRyaXZlci0+Y3BvcnRfYWxsb2NhdGUoaGQsIGNwb3J0X2lkLCBmbGFncyk7CisKKwlpZiAoY3BvcnRfaWQgPCAwKSB7CisJCWlkYV9zdGFydCA9IDA7CisJCWlkYV9lbmQgPSBoZC0+bnVtX2Nwb3J0czsKKwl9IGVsc2UgaWYgKGNwb3J0X2lkIDwgaGQtPm51bV9jcG9ydHMpIHsKKwkJaWRhX3N0YXJ0ID0gY3BvcnRfaWQ7CisJCWlkYV9lbmQgPSBjcG9ydF9pZCArIDE7CisJfSBlbHNlIHsKKwkJZGV2X2VycigmaGQtPmRldiwgImNwb3J0ICVkIG5vdCBhdmFpbGFibGVcbiIsIGNwb3J0X2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGlkYV9zaW1wbGVfZ2V0KGlkX21hcCwgaWRhX3N0YXJ0LCBpZGFfZW5kLCBHRlBfS0VSTkVMKTsKK30KKworLyogTG9ja2luZzogQ2FsbGVyIGd1YXJhbnRlZXMgc2VyaWFsaXNhdGlvbiAqLwordm9pZCBnYl9oZF9jcG9ydF9yZWxlYXNlKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHUxNiBjcG9ydF9pZCkKK3sKKwlpZiAoaGQtPmRyaXZlci0+Y3BvcnRfcmVsZWFzZSkgeworCQloZC0+ZHJpdmVyLT5jcG9ydF9yZWxlYXNlKGhkLCBjcG9ydF9pZCk7CisJCXJldHVybjsKKwl9CisKKwlpZGFfc2ltcGxlX3JlbW92ZSgmaGQtPmNwb3J0X2lkX21hcCwgY3BvcnRfaWQpOworfQorCitzdGF0aWMgdm9pZCBnYl9oZF9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkID0gdG9fZ2JfaG9zdF9kZXZpY2UoZGV2KTsKKworCXRyYWNlX2diX2hkX3JlbGVhc2UoaGQpOworCisJaWYgKGhkLT5zdmMpCisJCWdiX3N2Y19wdXQoaGQtPnN2Yyk7CisJaWRhX3NpbXBsZV9yZW1vdmUoJmdiX2hkX2J1c19pZF9tYXAsIGhkLT5idXNfaWQpOworCWlkYV9kZXN0cm95KCZoZC0+Y3BvcnRfaWRfbWFwKTsKKwlrZnJlZShoZCk7Cit9CisKK3N0cnVjdCBkZXZpY2VfdHlwZSBncmV5YnVzX2hkX3R5cGUgPSB7CisJLm5hbWUJCT0gImdyZXlidXNfaG9zdF9kZXZpY2UiLAorCS5yZWxlYXNlCT0gZ2JfaGRfcmVsZWFzZSwKK307CisKK3N0cnVjdCBnYl9ob3N0X2RldmljZSAqZ2JfaGRfY3JlYXRlKHN0cnVjdCBnYl9oZF9kcml2ZXIgKmRyaXZlciwKKwkJCQkJc3RydWN0IGRldmljZSAqcGFyZW50LAorCQkJCQlzaXplX3QgYnVmZmVyX3NpemVfbWF4LAorCQkJCQlzaXplX3QgbnVtX2Nwb3J0cykKK3sKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkOworCWludCByZXQ7CisKKwkvKgorCSAqIFZhbGlkYXRlIHRoYXQgdGhlIGRyaXZlciBpbXBsZW1lbnRzIGFsbCBvZiB0aGUgY2FsbGJhY2tzCisJICogc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGV2ZXJ5IHRpbWUgd2UgbWFrZSB0aGVtLgorCSAqLworCWlmICgoIWRyaXZlci0+bWVzc2FnZV9zZW5kKSB8fCAoIWRyaXZlci0+bWVzc2FnZV9jYW5jZWwpKSB7CisJCWRldl9lcnIocGFyZW50LCAibWFuZGF0b3J5IGhkLWNhbGxiYWNrcyBtaXNzaW5nXG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJaWYgKGJ1ZmZlcl9zaXplX21heCA8IEdCX09QRVJBVElPTl9NRVNTQUdFX1NJWkVfTUlOKSB7CisJCWRldl9lcnIocGFyZW50LCAiZ3JleWJ1cyBob3N0LWRldmljZSBidWZmZXJzIHRvbyBzbWFsbFxuIik7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKworCWlmIChudW1fY3BvcnRzID09IDAgfHwgbnVtX2Nwb3J0cyA+IENQT1JUX0lEX01BWCArIDEpIHsKKwkJZGV2X2VycihwYXJlbnQsICJJbnZhbGlkIG51bWJlciBvZiBDUG9ydHM6ICV6dVxuIiwgbnVtX2Nwb3J0cyk7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKworCS8qCisJICogTWFrZSBzdXJlIHRvIG5ldmVyIGFsbG9jYXRlIG1lc3NhZ2VzIGxhcmdlciB0aGFuIHdoYXQgdGhlIEdyZXlidXMKKwkgKiBwcm90b2NvbCBzdXBwb3J0cy4KKwkgKi8KKwlpZiAoYnVmZmVyX3NpemVfbWF4ID4gR0JfT1BFUkFUSU9OX01FU1NBR0VfU0laRV9NQVgpIHsKKwkJZGV2X3dhcm4ocGFyZW50LCAibGltaXRpbmcgYnVmZmVyIHNpemUgdG8gJXVcbiIsCisJCQkgR0JfT1BFUkFUSU9OX01FU1NBR0VfU0laRV9NQVgpOworCQlidWZmZXJfc2l6ZV9tYXggPSBHQl9PUEVSQVRJT05fTUVTU0FHRV9TSVpFX01BWDsKKwl9CisKKwloZCA9IGt6YWxsb2Moc2l6ZW9mKCpoZCkgKyBkcml2ZXItPmhkX3ByaXZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoZCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlyZXQgPSBpZGFfc2ltcGxlX2dldCgmZ2JfaGRfYnVzX2lkX21hcCwgMSwgMCwgR0ZQX0tFUk5FTCk7CisJaWYgKHJldCA8IDApIHsKKwkJa2ZyZWUoaGQpOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKwloZC0+YnVzX2lkID0gcmV0OworCisJaGQtPmRyaXZlciA9IGRyaXZlcjsKKwlJTklUX0xJU1RfSEVBRCgmaGQtPm1vZHVsZXMpOworCUlOSVRfTElTVF9IRUFEKCZoZC0+Y29ubmVjdGlvbnMpOworCWlkYV9pbml0KCZoZC0+Y3BvcnRfaWRfbWFwKTsKKwloZC0+YnVmZmVyX3NpemVfbWF4ID0gYnVmZmVyX3NpemVfbWF4OworCWhkLT5udW1fY3BvcnRzID0gbnVtX2Nwb3J0czsKKworCWhkLT5kZXYucGFyZW50ID0gcGFyZW50OworCWhkLT5kZXYuYnVzID0gJmdyZXlidXNfYnVzX3R5cGU7CisJaGQtPmRldi50eXBlID0gJmdyZXlidXNfaGRfdHlwZTsKKwloZC0+ZGV2Lmdyb3VwcyA9IGJ1c19ncm91cHM7CisJaGQtPmRldi5kbWFfbWFzayA9IGhkLT5kZXYucGFyZW50LT5kbWFfbWFzazsKKwlkZXZpY2VfaW5pdGlhbGl6ZSgmaGQtPmRldik7CisJZGV2X3NldF9uYW1lKCZoZC0+ZGV2LCAiZ3JleWJ1cyVkIiwgaGQtPmJ1c19pZCk7CisKKwl0cmFjZV9nYl9oZF9jcmVhdGUoaGQpOworCisJaGQtPnN2YyA9IGdiX3N2Y19jcmVhdGUoaGQpOworCWlmICghaGQtPnN2YykgeworCQlkZXZfZXJyKCZoZC0+ZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBzdmNcbiIpOworCQlwdXRfZGV2aWNlKCZoZC0+ZGV2KTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJcmV0dXJuIGhkOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfaGRfY3JlYXRlKTsKKworaW50IGdiX2hkX2FkZChzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBkZXZpY2VfYWRkKCZoZC0+ZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZ2Jfc3ZjX2FkZChoZC0+c3ZjKTsKKwlpZiAocmV0KSB7CisJCWRldmljZV9kZWwoJmhkLT5kZXYpOworCQlyZXR1cm4gcmV0OworCX0KKworCXRyYWNlX2diX2hkX2FkZChoZCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2hkX2FkZCk7CisKK3ZvaWQgZ2JfaGRfZGVsKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQpCit7CisJdHJhY2VfZ2JfaGRfZGVsKGhkKTsKKworCS8qCisJICogVGVhciBkb3duIHRoZSBzdmMgYW5kIGZsdXNoIGFueSBvbi1nb2luZyBob3RwbHVnIHByb2Nlc3NpbmcgYmVmb3JlCisJICogcmVtb3ZpbmcgdGhlIHJlbWFpbmluZyBpbnRlcmZhY2VzLgorCSAqLworCWdiX3N2Y19kZWwoaGQtPnN2Yyk7CisKKwlkZXZpY2VfZGVsKCZoZC0+ZGV2KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX2hkX2RlbCk7CisKK3ZvaWQgZ2JfaGRfc2h1dGRvd24oc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCkKK3sKKwlnYl9zdmNfZGVsKGhkLT5zdmMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfaGRfc2h1dGRvd24pOworCit2b2lkIGdiX2hkX3B1dChzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkKQoreworCXB1dF9kZXZpY2UoJmhkLT5kZXYpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfaGRfcHV0KTsKKworaW50IF9faW5pdCBnYl9oZF9pbml0KHZvaWQpCit7CisJaWRhX2luaXQoJmdiX2hkX2J1c19pZF9tYXApOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZ2JfaGRfZXhpdCh2b2lkKQoreworCWlkYV9kZXN0cm95KCZnYl9oZF9idXNfaWRfbWFwKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2hkLmggYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9oZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MjUwY2ZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvaGQuaApAQCAtMCwwICsxLDkwIEBACisvKgorICogR3JleWJ1cyBIb3N0IERldmljZQorICoKKyAqIENvcHlyaWdodCAyMDE0LTIwMTUgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE0LTIwMTUgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaWZuZGVmIF9fSERfSAorI2RlZmluZSBfX0hEX0gKKworc3RydWN0IGdiX2hvc3RfZGV2aWNlOworc3RydWN0IGdiX21lc3NhZ2U7CisKK3N0cnVjdCBnYl9oZF9kcml2ZXIgeworCXNpemVfdAloZF9wcml2X3NpemU7CisKKwlpbnQgKCpjcG9ydF9hbGxvY2F0ZSkoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgaW50IGNwb3J0X2lkLAorCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCXZvaWQgKCpjcG9ydF9yZWxlYXNlKShzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCB1MTYgY3BvcnRfaWQpOworCWludCAoKmNwb3J0X2VuYWJsZSkoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdTE2IGNwb3J0X2lkLAorCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCWludCAoKmNwb3J0X2Rpc2FibGUpKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHUxNiBjcG9ydF9pZCk7CisJaW50ICgqY3BvcnRfY29ubmVjdGVkKShzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCB1MTYgY3BvcnRfaWQpOworCWludCAoKmNwb3J0X2ZsdXNoKShzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCB1MTYgY3BvcnRfaWQpOworCWludCAoKmNwb3J0X3NodXRkb3duKShzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCB1MTYgY3BvcnRfaWQsCisJCQkJdTggcGhhc2UsIHVuc2lnbmVkIGludCB0aW1lb3V0KTsKKwlpbnQgKCpjcG9ydF9xdWllc2NlKShzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCB1MTYgY3BvcnRfaWQsCisJCQkJc2l6ZV90IHBlZXJfc3BhY2UsIHVuc2lnbmVkIGludCB0aW1lb3V0KTsKKwlpbnQgKCpjcG9ydF9jbGVhcikoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdTE2IGNwb3J0X2lkKTsKKworCWludCAoKm1lc3NhZ2Vfc2VuZCkoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdTE2IGRlc3RfY3BvcnRfaWQsCisJCQlzdHJ1Y3QgZ2JfbWVzc2FnZSAqbWVzc2FnZSwgZ2ZwX3QgZ2ZwX21hc2spOworCXZvaWQgKCptZXNzYWdlX2NhbmNlbCkoc3RydWN0IGdiX21lc3NhZ2UgKm1lc3NhZ2UpOworCWludCAoKmxhdGVuY3lfdGFnX2VuYWJsZSkoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdTE2IGNwb3J0X2lkKTsKKwlpbnQgKCpsYXRlbmN5X3RhZ19kaXNhYmxlKShzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCB1MTYgY3BvcnRfaWQpOworCWludCAoKm91dHB1dCkoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdm9pZCAqcmVxLCB1MTYgc2l6ZSwgdTggY21kLAorCQkgICAgICBib29sIGFzeW5jKTsKKwlpbnQgKCp0aW1lc3luY19lbmFibGUpKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHU4IGNvdW50LAorCQkJICAgICAgIHU2NCBmcmFtZV90aW1lLCB1MzIgc3Ryb2JlX2RlbGF5LCB1MzIgcmVmY2xrKTsKKwlpbnQgKCp0aW1lc3luY19kaXNhYmxlKShzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkKTsKKwlpbnQgKCp0aW1lc3luY19hdXRob3JpdGF0aXZlKShzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLAorCQkJCSAgICAgIHU2NCAqZnJhbWVfdGltZSk7CisJaW50ICgqdGltZXN5bmNfZ2V0X2xhc3RfZXZlbnQpKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsCisJCQkJICAgICAgIHU2NCAqZnJhbWVfdGltZSk7Cit9OworCitzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgeworCXN0cnVjdCBkZXZpY2UgZGV2OworCWludCBidXNfaWQ7CisJY29uc3Qgc3RydWN0IGdiX2hkX2RyaXZlciAqZHJpdmVyOworCisJc3RydWN0IGxpc3RfaGVhZCBtb2R1bGVzOworCXN0cnVjdCBsaXN0X2hlYWQgY29ubmVjdGlvbnM7CisJc3RydWN0IGlkYSBjcG9ydF9pZF9tYXA7CisKKwkvKiBOdW1iZXIgb2YgQ1BvcnRzIHN1cHBvcnRlZCBieSB0aGUgVW5pUHJvIElQICovCisJc2l6ZV90IG51bV9jcG9ydHM7CisKKwkvKiBIb3N0IGRldmljZSBidWZmZXIgY29uc3RyYWludHMgKi8KKwlzaXplX3QgYnVmZmVyX3NpemVfbWF4OworCisJc3RydWN0IGdiX3N2YyAqc3ZjOworCS8qIFByaXZhdGUgZGF0YSBmb3IgdGhlIGhvc3QgZHJpdmVyICovCisJdW5zaWduZWQgbG9uZyBoZF9wcml2WzBdIF9fYWxpZ25lZChzaXplb2YoczY0KSk7Cit9OworI2RlZmluZSB0b19nYl9ob3N0X2RldmljZShkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IGdiX2hvc3RfZGV2aWNlLCBkZXYpCisKK2ludCBnYl9oZF9jcG9ydF9yZXNlcnZlKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHUxNiBjcG9ydF9pZCk7Cit2b2lkIGdiX2hkX2Nwb3J0X3JlbGVhc2VfcmVzZXJ2ZWQoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdTE2IGNwb3J0X2lkKTsKK2ludCBnYl9oZF9jcG9ydF9hbGxvY2F0ZShzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLCBpbnQgY3BvcnRfaWQsCisJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpOwordm9pZCBnYl9oZF9jcG9ydF9yZWxlYXNlKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHUxNiBjcG9ydF9pZCk7CisKK3N0cnVjdCBnYl9ob3N0X2RldmljZSAqZ2JfaGRfY3JlYXRlKHN0cnVjdCBnYl9oZF9kcml2ZXIgKmRyaXZlciwKKwkJCQkJc3RydWN0IGRldmljZSAqcGFyZW50LAorCQkJCQlzaXplX3QgYnVmZmVyX3NpemVfbWF4LAorCQkJCQlzaXplX3QgbnVtX2Nwb3J0cyk7CitpbnQgZ2JfaGRfYWRkKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQpOwordm9pZCBnYl9oZF9kZWwoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCk7Cit2b2lkIGdiX2hkX3NodXRkb3duKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQpOwordm9pZCBnYl9oZF9wdXQoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCk7CitpbnQgZ2JfaGRfb3V0cHV0KHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHZvaWQgKnJlcSwgdTE2IHNpemUsIHU4IGNtZCwKKwkJIGJvb2wgaW5faXJxKTsKKworaW50IGdiX2hkX2luaXQodm9pZCk7Cit2b2lkIGdiX2hkX2V4aXQodm9pZCk7CisKKyNlbmRpZgkvKiBfX0hEX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2hpZC5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvaGlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMwZDc0NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2hpZC5jCkBAIC0wLDAgKzEsNTM2IEBACisvKgorICogSElEIGNsYXNzIGRyaXZlciBmb3IgdGhlIEdyZXlidXMuCisgKgorICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE0IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorCisvKiBHcmV5YnVzIEhJRCBkZXZpY2UncyBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBnYl9oaWQgeworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZTsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbgkJKmNvbm5lY3Rpb247CisKKwlzdHJ1Y3QgaGlkX2RldmljZQkJKmhpZDsKKwlzdHJ1Y3QgZ2JfaGlkX2Rlc2NfcmVzcG9uc2UJaGRlc2M7CisKKwl1bnNpZ25lZCBsb25nCQkJZmxhZ3M7CisjZGVmaW5lIEdCX0hJRF9TVEFSVEVECQkJMHgwMQorI2RlZmluZSBHQl9ISURfUkVBRF9QRU5ESU5HCQkweDA0CisKKwl1bnNpZ25lZCBpbnQJCQlidWZzaXplOworCWNoYXIJCQkJKmluYnVmOworfTsKKworc3RhdGljIERFRklORV9NVVRFWChnYl9oaWRfb3Blbl9tdXRleCk7CisKKy8qIFJvdXRpbmVzIHRvIGdldCBjb250cm9sbGVyJ3MgaW5mb3JtYXRpb24gb3ZlciBncmV5YnVzICovCisKKy8qIE9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIGdyZXlidXMgKi8KK3N0YXRpYyBpbnQgZ2JfaGlkX2dldF9kZXNjKHN0cnVjdCBnYl9oaWQgKmdoaWQpCit7CisJcmV0dXJuIGdiX29wZXJhdGlvbl9zeW5jKGdoaWQtPmNvbm5lY3Rpb24sIEdCX0hJRF9UWVBFX0dFVF9ERVNDLCBOVUxMLAorCQkJCSAwLCAmZ2hpZC0+aGRlc2MsIHNpemVvZihnaGlkLT5oZGVzYykpOworfQorCitzdGF0aWMgaW50IGdiX2hpZF9nZXRfcmVwb3J0X2Rlc2Moc3RydWN0IGdiX2hpZCAqZ2hpZCwgY2hhciAqcmRlc2MpCit7CisJaW50IHJldDsKKworCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoZ2hpZC0+YnVuZGxlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoZ2hpZC0+Y29ubmVjdGlvbiwgR0JfSElEX1RZUEVfR0VUX1JFUE9SVF9ERVNDLAorCQkJCSBOVUxMLCAwLCByZGVzYywKKwkJCQkgbGUxNl90b19jcHUoZ2hpZC0+aGRlc2Mud1JlcG9ydERlc2NMZW5ndGgpKTsKKworCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGdoaWQtPmJ1bmRsZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX2hpZF9zZXRfcG93ZXIoc3RydWN0IGdiX2hpZCAqZ2hpZCwgaW50IHR5cGUpCit7CisJaW50IHJldDsKKworCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoZ2hpZC0+YnVuZGxlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoZ2hpZC0+Y29ubmVjdGlvbiwgdHlwZSwgTlVMTCwgMCwgTlVMTCwgMCk7CisKKwlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChnaGlkLT5idW5kbGUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9oaWRfZ2V0X3JlcG9ydChzdHJ1Y3QgZ2JfaGlkICpnaGlkLCB1OCByZXBvcnRfdHlwZSwgdTggcmVwb3J0X2lkLAorCQkJICAgICB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGdiX2hpZF9nZXRfcmVwb3J0X3JlcXVlc3QgcmVxdWVzdDsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhnaGlkLT5idW5kbGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXF1ZXN0LnJlcG9ydF90eXBlID0gcmVwb3J0X3R5cGU7CisJcmVxdWVzdC5yZXBvcnRfaWQgPSByZXBvcnRfaWQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhnaGlkLT5jb25uZWN0aW9uLCBHQl9ISURfVFlQRV9HRVRfUkVQT1JULAorCQkJCSAmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLCBidWYsIGxlbik7CisKKwlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChnaGlkLT5idW5kbGUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9oaWRfc2V0X3JlcG9ydChzdHJ1Y3QgZ2JfaGlkICpnaGlkLCB1OCByZXBvcnRfdHlwZSwgdTggcmVwb3J0X2lkLAorCQkJICAgICB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGdiX2hpZF9zZXRfcmVwb3J0X3JlcXVlc3QgKnJlcXVlc3Q7CisJc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uOworCWludCByZXQsIHNpemUgPSBzaXplb2YoKnJlcXVlc3QpICsgbGVuIC0gMTsKKworCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoZ2hpZC0+YnVuZGxlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJb3BlcmF0aW9uID0gZ2Jfb3BlcmF0aW9uX2NyZWF0ZShnaGlkLT5jb25uZWN0aW9uLAorCQkJCQlHQl9ISURfVFlQRV9TRVRfUkVQT1JULCBzaXplLCAwLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIW9wZXJhdGlvbikgeworCQlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChnaGlkLT5idW5kbGUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXF1ZXN0ID0gb3BlcmF0aW9uLT5yZXF1ZXN0LT5wYXlsb2FkOworCXJlcXVlc3QtPnJlcG9ydF90eXBlID0gcmVwb3J0X3R5cGU7CisJcmVxdWVzdC0+cmVwb3J0X2lkID0gcmVwb3J0X2lkOworCW1lbWNweShyZXF1ZXN0LT5yZXBvcnQsIGJ1ZiwgbGVuKTsKKworCXJldCA9IGdiX29wZXJhdGlvbl9yZXF1ZXN0X3NlbmRfc3luYyhvcGVyYXRpb24pOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmb3BlcmF0aW9uLT5jb25uZWN0aW9uLT5idW5kbGUtPmRldiwKKwkJCSJmYWlsZWQgdG8gc2V0IHJlcG9ydDogJWRcbiIsIHJldCk7CisJfSBlbHNlIHsKKwkJcmV0ID0gbGVuOworCX0KKworCWdiX29wZXJhdGlvbl9wdXQob3BlcmF0aW9uKTsKKwlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChnaGlkLT5idW5kbGUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9oaWRfcmVxdWVzdF9oYW5kbGVyKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gb3AtPmNvbm5lY3Rpb247CisJc3RydWN0IGdiX2hpZCAqZ2hpZCA9IGdiX2Nvbm5lY3Rpb25fZ2V0X2RhdGEoY29ubmVjdGlvbik7CisJc3RydWN0IGdiX2hpZF9pbnB1dF9yZXBvcnRfcmVxdWVzdCAqcmVxdWVzdCA9IG9wLT5yZXF1ZXN0LT5wYXlsb2FkOworCisJaWYgKG9wLT50eXBlICE9IEdCX0hJRF9UWVBFX0lSUV9FVkVOVCkgeworCQlkZXZfZXJyKCZjb25uZWN0aW9uLT5idW5kbGUtPmRldiwKKwkJCSJ1bnN1cHBvcnRlZCB1bnNvbGljaXRlZCByZXF1ZXN0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHRlc3RfYml0KEdCX0hJRF9TVEFSVEVELCAmZ2hpZC0+ZmxhZ3MpKQorCQloaWRfaW5wdXRfcmVwb3J0KGdoaWQtPmhpZCwgSElEX0lOUFVUX1JFUE9SVCwKKwkJCQkgcmVxdWVzdC0+cmVwb3J0LCBvcC0+cmVxdWVzdC0+cGF5bG9hZF9zaXplLCAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX2hpZF9yZXBvcnRfbGVuKHN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQpCit7CisJcmV0dXJuICgocmVwb3J0LT5zaXplIC0gMSkgPj4gMykgKyAxICsKKwkJcmVwb3J0LT5kZXZpY2UtPnJlcG9ydF9lbnVtW3JlcG9ydC0+dHlwZV0ubnVtYmVyZWQ7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2hpZF9maW5kX21heF9yZXBvcnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgdW5zaWduZWQgaW50IHR5cGUsCisJCQkJICAgdW5zaWduZWQgaW50ICptYXgpCit7CisJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVwb3J0LCAmaGlkLT5yZXBvcnRfZW51bVt0eXBlXS5yZXBvcnRfbGlzdCwgbGlzdCkgeworCQlzaXplID0gZ2JfaGlkX3JlcG9ydF9sZW4ocmVwb3J0KTsKKwkJaWYgKCptYXggPCBzaXplKQorCQkJKm1heCA9IHNpemU7CisJfQorfQorCitzdGF0aWMgdm9pZCBnYl9oaWRfZnJlZV9idWZmZXJzKHN0cnVjdCBnYl9oaWQgKmdoaWQpCit7CisJa2ZyZWUoZ2hpZC0+aW5idWYpOworCWdoaWQtPmluYnVmID0gTlVMTDsKKwlnaGlkLT5idWZzaXplID0gMDsKK30KKworc3RhdGljIGludCBnYl9oaWRfYWxsb2NfYnVmZmVycyhzdHJ1Y3QgZ2JfaGlkICpnaGlkLCBzaXplX3QgYnVmc2l6ZSkKK3sKKwlnaGlkLT5pbmJ1ZiA9IGt6YWxsb2MoYnVmc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFnaGlkLT5pbmJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlnaGlkLT5idWZzaXplID0gYnVmc2l6ZTsKKworCXJldHVybiAwOworfQorCisvKiBSb3V0aW5lcyBkZWFsaW5nIHdpdGggcmVwb3J0cyAqLworc3RhdGljIHZvaWQgZ2JfaGlkX2luaXRfcmVwb3J0KHN0cnVjdCBnYl9oaWQgKmdoaWQsIHN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQpCit7CisJdW5zaWduZWQgaW50IHNpemU7CisKKwlzaXplID0gZ2JfaGlkX3JlcG9ydF9sZW4ocmVwb3J0KTsKKwlpZiAoZ2JfaGlkX2dldF9yZXBvcnQoZ2hpZCwgcmVwb3J0LT50eXBlLCByZXBvcnQtPmlkLCBnaGlkLT5pbmJ1ZiwKKwkJCSAgICAgIHNpemUpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIGhpZC0+ZHJpdmVyX2xvY2sgaXMgaGVsZCBhcyB3ZSBhcmUgaW4gcHJvYmUgZnVuY3Rpb24sCisJICogd2UganVzdCBuZWVkIHRvIHNldHVwIHRoZSBpbnB1dCBmaWVsZHMsIHNvIHVzaW5nCisJICogaGlkX3JlcG9ydF9yYXdfZXZlbnQgaXMgc2FmZS4KKwkgKi8KKwloaWRfcmVwb3J0X3Jhd19ldmVudChnaGlkLT5oaWQsIHJlcG9ydC0+dHlwZSwgZ2hpZC0+aW5idWYsIHNpemUsIDEpOworfQorCitzdGF0aWMgdm9pZCBnYl9oaWRfaW5pdF9yZXBvcnRzKHN0cnVjdCBnYl9oaWQgKmdoaWQpCit7CisJc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IGdoaWQtPmhpZDsKKwlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXBvcnQsCisJCSZoaWQtPnJlcG9ydF9lbnVtW0hJRF9JTlBVVF9SRVBPUlRdLnJlcG9ydF9saXN0LCBsaXN0KQorCQlnYl9oaWRfaW5pdF9yZXBvcnQoZ2hpZCwgcmVwb3J0KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVwb3J0LAorCQkmaGlkLT5yZXBvcnRfZW51bVtISURfRkVBVFVSRV9SRVBPUlRdLnJlcG9ydF9saXN0LCBsaXN0KQorCQlnYl9oaWRfaW5pdF9yZXBvcnQoZ2hpZCwgcmVwb3J0KTsKK30KKworc3RhdGljIGludCBfX2diX2hpZF9nZXRfcmF3X3JlcG9ydChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLAorCQl1bnNpZ25lZCBjaGFyIHJlcG9ydF9udW1iZXIsIF9fdTggKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQl1bnNpZ25lZCBjaGFyIHJlcG9ydF90eXBlKQoreworCXN0cnVjdCBnYl9oaWQgKmdoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOworCWludCByZXQ7CisKKwlpZiAocmVwb3J0X3R5cGUgPT0gSElEX09VVFBVVF9SRVBPUlQpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gZ2JfaGlkX2dldF9yZXBvcnQoZ2hpZCwgcmVwb3J0X3R5cGUsIHJlcG9ydF9udW1iZXIsIGJ1ZiwgY291bnQpOworCWlmICghcmV0KQorCQlyZXQgPSBjb3VudDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19nYl9oaWRfb3V0cHV0X3Jhd19yZXBvcnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgX191OCAqYnVmLAorCQkJCSAgICAgIHNpemVfdCBsZW4sIHVuc2lnbmVkIGNoYXIgcmVwb3J0X3R5cGUpCit7CisJc3RydWN0IGdiX2hpZCAqZ2hpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CisJaW50IHJlcG9ydF9pZCA9IGJ1ZlswXTsKKwlpbnQgcmV0OworCisJaWYgKHJlcG9ydF90eXBlID09IEhJRF9JTlBVVF9SRVBPUlQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHJlcG9ydF9pZCkgeworCQlidWYrKzsKKwkJbGVuLS07CisJfQorCisJcmV0ID0gZ2JfaGlkX3NldF9yZXBvcnQoZ2hpZCwgcmVwb3J0X3R5cGUsIHJlcG9ydF9pZCwgYnVmLCBsZW4pOworCWlmIChyZXBvcnRfaWQgJiYgcmV0ID49IDApCisJCXJldCsrOyAvKiBhZGQgcmVwb3J0X2lkIHRvIHRoZSBudW1iZXIgb2YgdHJhbnNmZXJlZCBieXRlcyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JfaGlkX3Jhd19yZXF1ZXN0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHVuc2lnbmVkIGNoYXIgcmVwb3J0bnVtLAorCQkJICAgICAgIF9fdTggKmJ1Ziwgc2l6ZV90IGxlbiwgdW5zaWduZWQgY2hhciBydHlwZSwKKwkJCSAgICAgICBpbnQgcmVxdHlwZSkKK3sKKwlzd2l0Y2ggKHJlcXR5cGUpIHsKKwljYXNlIEhJRF9SRVFfR0VUX1JFUE9SVDoKKwkJcmV0dXJuIF9fZ2JfaGlkX2dldF9yYXdfcmVwb3J0KGhpZCwgcmVwb3J0bnVtLCBidWYsIGxlbiwgcnR5cGUpOworCWNhc2UgSElEX1JFUV9TRVRfUkVQT1JUOgorCQlpZiAoYnVmWzBdICE9IHJlcG9ydG51bSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gX19nYl9oaWRfb3V0cHV0X3Jhd19yZXBvcnQoaGlkLCBidWYsIGxlbiwgcnR5cGUpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlPOworCX0KK30KKworLyogSElEIENhbGxiYWNrcyAqLworc3RhdGljIGludCBnYl9oaWRfcGFyc2Uoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKK3sKKwlzdHJ1Y3QgZ2JfaGlkICpnaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBpbnQgcnNpemU7CisJY2hhciAqcmRlc2M7CisJaW50IHJldDsKKworCXJzaXplID0gbGUxNl90b19jcHUoZ2hpZC0+aGRlc2Mud1JlcG9ydERlc2NMZW5ndGgpOworCWlmICghcnNpemUgfHwgcnNpemUgPiBISURfTUFYX0RFU0NSSVBUT1JfU0laRSkgeworCQlkYmdfaGlkKCJ3ZWlyZCBzaXplIG9mIHJlcG9ydCBkZXNjcmlwdG9yICgldSlcbiIsIHJzaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmRlc2MgPSBremFsbG9jKHJzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJkZXNjKSB7CisJCWRiZ19oaWQoImNvdWxkbid0IGFsbG9jYXRlIHJkZXNjIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldCA9IGdiX2hpZF9nZXRfcmVwb3J0X2Rlc2MoZ2hpZCwgcmRlc2MpOworCWlmIChyZXQpIHsKKwkJaGlkX2VycihoaWQsICJyZWFkaW5nIHJlcG9ydCBkZXNjcmlwdG9yIGZhaWxlZFxuIik7CisJCWdvdG8gZnJlZV9yZGVzYzsKKwl9CisKKwlyZXQgPSBoaWRfcGFyc2VfcmVwb3J0KGhpZCwgcmRlc2MsIHJzaXplKTsKKwlpZiAocmV0KQorCQlkYmdfaGlkKCJwYXJzaW5nIHJlcG9ydCBkZXNjcmlwdG9yIGZhaWxlZFxuIik7CisKK2ZyZWVfcmRlc2M6CisJa2ZyZWUocmRlc2MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9oaWRfc3RhcnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKK3sKKwlzdHJ1Y3QgZ2JfaGlkICpnaGlkID0gaGlkLT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBpbnQgYnVmc2l6ZSA9IEhJRF9NSU5fQlVGRkVSX1NJWkU7CisJaW50IHJldDsKKworCWdiX2hpZF9maW5kX21heF9yZXBvcnQoaGlkLCBISURfSU5QVVRfUkVQT1JULCAmYnVmc2l6ZSk7CisJZ2JfaGlkX2ZpbmRfbWF4X3JlcG9ydChoaWQsIEhJRF9PVVRQVVRfUkVQT1JULCAmYnVmc2l6ZSk7CisJZ2JfaGlkX2ZpbmRfbWF4X3JlcG9ydChoaWQsIEhJRF9GRUFUVVJFX1JFUE9SVCwgJmJ1ZnNpemUpOworCisJaWYgKGJ1ZnNpemUgPiBISURfTUFYX0JVRkZFUl9TSVpFKQorCQlidWZzaXplID0gSElEX01BWF9CVUZGRVJfU0laRTsKKworCXJldCA9IGdiX2hpZF9hbGxvY19idWZmZXJzKGdoaWQsIGJ1ZnNpemUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoIShoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS19OT19JTklUX1JFUE9SVFMpKQorCQlnYl9oaWRfaW5pdF9yZXBvcnRzKGdoaWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2hpZF9zdG9wKHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCit7CisJc3RydWN0IGdiX2hpZCAqZ2hpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CisKKwlnYl9oaWRfZnJlZV9idWZmZXJzKGdoaWQpOworfQorCitzdGF0aWMgaW50IGdiX2hpZF9vcGVuKHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCit7CisJc3RydWN0IGdiX2hpZCAqZ2hpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZnYl9oaWRfb3Blbl9tdXRleCk7CisJaWYgKCFoaWQtPm9wZW4rKykgeworCQlyZXQgPSBnYl9oaWRfc2V0X3Bvd2VyKGdoaWQsIEdCX0hJRF9UWVBFX1BXUl9PTik7CisJCWlmIChyZXQgPCAwKQorCQkJaGlkLT5vcGVuLS07CisJCWVsc2UKKwkJCXNldF9iaXQoR0JfSElEX1NUQVJURUQsICZnaGlkLT5mbGFncyk7CisJfQorCW11dGV4X3VubG9jaygmZ2JfaGlkX29wZW5fbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZ2JfaGlkX2Nsb3NlKHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCit7CisJc3RydWN0IGdiX2hpZCAqZ2hpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CisJaW50IHJldDsKKworCS8qCisJICogUHJvdGVjdGluZyBoaWQtPm9wZW4gdG8gbWFrZSBzdXJlIHdlIGRvbid0IHJlc3RhcnQgZGF0YSBhY3F1aXN0aW9uCisJICogZHVlIHRvIGEgcmVzdW1wdGlvbiB3ZSBubyBsb25nZXIgY2FyZSBhYm91dC4uCisJICovCisJbXV0ZXhfbG9jaygmZ2JfaGlkX29wZW5fbXV0ZXgpOworCWlmICghLS1oaWQtPm9wZW4pIHsKKwkJY2xlYXJfYml0KEdCX0hJRF9TVEFSVEVELCAmZ2hpZC0+ZmxhZ3MpOworCisJCS8qIFNhdmUgc29tZSBwb3dlciAqLworCQlyZXQgPSBnYl9oaWRfc2V0X3Bvd2VyKGdoaWQsIEdCX0hJRF9UWVBFX1BXUl9PRkYpOworCQlpZiAocmV0KQorCQkJZGV2X2VycigmZ2hpZC0+Y29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsCisJCQkJImZhaWxlZCB0byBwb3dlciBvZmYgKCVkKVxuIiwgcmV0KTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZnYl9oaWRfb3Blbl9tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgZ2JfaGlkX3Bvd2VyKHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIGludCBsdmwpCit7CisJc3RydWN0IGdiX2hpZCAqZ2hpZCA9IGhpZC0+ZHJpdmVyX2RhdGE7CisKKwlzd2l0Y2ggKGx2bCkgeworCWNhc2UgUE1fSElOVF9GVUxMT046CisJCXJldHVybiBnYl9oaWRfc2V0X3Bvd2VyKGdoaWQsIEdCX0hJRF9UWVBFX1BXUl9PTik7CisJY2FzZSBQTV9ISU5UX05PUk1BTDoKKwkJcmV0dXJuIGdiX2hpZF9zZXRfcG93ZXIoZ2hpZCwgR0JfSElEX1RZUEVfUFdSX09GRik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIEhJRCBzdHJ1Y3R1cmUgdG8gcGFzcyBjYWxsYmFja3MgKi8KK3N0YXRpYyBzdHJ1Y3QgaGlkX2xsX2RyaXZlciBnYl9oaWRfbGxfZHJpdmVyID0geworCS5wYXJzZSA9IGdiX2hpZF9wYXJzZSwKKwkuc3RhcnQgPSBnYl9oaWRfc3RhcnQsCisJLnN0b3AgPSBnYl9oaWRfc3RvcCwKKwkub3BlbiA9IGdiX2hpZF9vcGVuLAorCS5jbG9zZSA9IGdiX2hpZF9jbG9zZSwKKwkucG93ZXIgPSBnYl9oaWRfcG93ZXIsCisJLnJhd19yZXF1ZXN0ID0gZ2JfaGlkX3Jhd19yZXF1ZXN0LAorfTsKKworc3RhdGljIGludCBnYl9oaWRfaW5pdChzdHJ1Y3QgZ2JfaGlkICpnaGlkKQoreworCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSBnaGlkLT5oaWQ7CisJaW50IHJldDsKKworCXJldCA9IGdiX2hpZF9nZXRfZGVzYyhnaGlkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaGlkLT52ZXJzaW9uID0gbGUxNl90b19jcHUoZ2hpZC0+aGRlc2MuYmNkSElEKTsKKwloaWQtPnZlbmRvciA9IGxlMTZfdG9fY3B1KGdoaWQtPmhkZXNjLndWZW5kb3JJRCk7CisJaGlkLT5wcm9kdWN0ID0gbGUxNl90b19jcHUoZ2hpZC0+aGRlc2Mud1Byb2R1Y3RJRCk7CisJaGlkLT5jb3VudHJ5ID0gZ2hpZC0+aGRlc2MuYkNvdW50cnlDb2RlOworCisJaGlkLT5kcml2ZXJfZGF0YSA9IGdoaWQ7CisJaGlkLT5sbF9kcml2ZXIgPSAmZ2JfaGlkX2xsX2RyaXZlcjsKKwloaWQtPmRldi5wYXJlbnQgPSAmZ2hpZC0+Y29ubmVjdGlvbi0+YnVuZGxlLT5kZXY7CisvLwloaWQtPmJ1cyA9IEJVU19HUkVZQlVTOyAvKiBOZWVkIGEgYnVzdHlwZSBmb3IgR1JFWUJVUyBpbiA8bGludXgvaW5wdXQuaD4gKi8KKworCS8qIFNldCBISUQgZGV2aWNlJ3MgbmFtZSAqLworCXNucHJpbnRmKGhpZC0+bmFtZSwgc2l6ZW9mKGhpZC0+bmFtZSksICIlcyAlMDRYOiUwNFgiLAorCQkgZGV2X25hbWUoJmdoaWQtPmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2KSwKKwkJIGhpZC0+dmVuZG9yLCBoaWQtPnByb2R1Y3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JfaGlkX3Byb2JlKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSwKKwkJCWNvbnN0IHN0cnVjdCBncmV5YnVzX2J1bmRsZV9pZCAqaWQpCit7CisJc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcl9jcG9ydCAqY3BvcnRfZGVzYzsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKwlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkOworCXN0cnVjdCBnYl9oaWQgKmdoaWQ7CisJaW50IHJldDsKKworCWlmIChidW5kbGUtPm51bV9jcG9ydHMgIT0gMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljcG9ydF9kZXNjID0gJmJ1bmRsZS0+Y3BvcnRfZGVzY1swXTsKKwlpZiAoY3BvcnRfZGVzYy0+cHJvdG9jb2xfaWQgIT0gR1JFWUJVU19QUk9UT0NPTF9ISUQpCisJCXJldHVybiAtRU5PREVWOworCisJZ2hpZCA9IGt6YWxsb2Moc2l6ZW9mKCpnaGlkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFnaGlkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvbm5lY3Rpb24gPSBnYl9jb25uZWN0aW9uX2NyZWF0ZShidW5kbGUsIGxlMTZfdG9fY3B1KGNwb3J0X2Rlc2MtPmlkKSwKKwkJCQkJCWdiX2hpZF9yZXF1ZXN0X2hhbmRsZXIpOworCWlmIChJU19FUlIoY29ubmVjdGlvbikpIHsKKwkJcmV0ID0gUFRSX0VSUihjb25uZWN0aW9uKTsKKwkJZ290byBlcnJfZnJlZV9naGlkOworCX0KKworCWdiX2Nvbm5lY3Rpb25fc2V0X2RhdGEoY29ubmVjdGlvbiwgZ2hpZCk7CisJZ2hpZC0+Y29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisKKwloaWQgPSBoaWRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKElTX0VSUihoaWQpKSB7CisJCXJldCA9IFBUUl9FUlIoaGlkKTsKKwkJZ290byBlcnJfY29ubmVjdGlvbl9kZXN0cm95OworCX0KKworCWdoaWQtPmhpZCA9IGhpZDsKKwlnaGlkLT5idW5kbGUgPSBidW5kbGU7CisKKwlncmV5YnVzX3NldF9kcnZkYXRhKGJ1bmRsZSwgZ2hpZCk7CisKKwlyZXQgPSBnYl9jb25uZWN0aW9uX2VuYWJsZShjb25uZWN0aW9uKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9kZXN0cm95X2hpZDsKKworCXJldCA9IGdiX2hpZF9pbml0KGdoaWQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2Nvbm5lY3Rpb25fZGlzYWJsZTsKKworCXJldCA9IGhpZF9hZGRfZGV2aWNlKGhpZCk7CisJaWYgKHJldCkgeworCQloaWRfZXJyKGhpZCwgImNhbid0IGFkZCBoaWQgZGV2aWNlOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfY29ubmVjdGlvbl9kaXNhYmxlOworCX0KKworCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGJ1bmRsZSk7CisKKwlyZXR1cm4gMDsKKworZXJyX2Nvbm5lY3Rpb25fZGlzYWJsZToKKwlnYl9jb25uZWN0aW9uX2Rpc2FibGUoY29ubmVjdGlvbik7CitlcnJfZGVzdHJveV9oaWQ6CisJaGlkX2Rlc3Ryb3lfZGV2aWNlKGhpZCk7CitlcnJfY29ubmVjdGlvbl9kZXN0cm95OgorCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShjb25uZWN0aW9uKTsKK2Vycl9mcmVlX2doaWQ6CisJa2ZyZWUoZ2hpZCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBnYl9oaWRfZGlzY29ubmVjdChzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUpCit7CisJc3RydWN0IGdiX2hpZCAqZ2hpZCA9IGdyZXlidXNfZ2V0X2RydmRhdGEoYnVuZGxlKTsKKworCWlmIChnYl9wbV9ydW50aW1lX2dldF9zeW5jKGJ1bmRsZSkpCisJCWdiX3BtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKGJ1bmRsZSk7CisKKwloaWRfZGVzdHJveV9kZXZpY2UoZ2hpZC0+aGlkKTsKKwlnYl9jb25uZWN0aW9uX2Rpc2FibGUoZ2hpZC0+Y29ubmVjdGlvbik7CisJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGdoaWQtPmNvbm5lY3Rpb24pOworCWtmcmVlKGdoaWQpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGdyZXlidXNfYnVuZGxlX2lkIGdiX2hpZF9pZF90YWJsZVtdID0geworCXsgR1JFWUJVU19ERVZJQ0VfQ0xBU1MoR1JFWUJVU19DTEFTU19ISUQpIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShncmV5YnVzLCBnYl9oaWRfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGdyZXlidXNfZHJpdmVyIGdiX2hpZF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImhpZCIsCisJLnByb2JlCQk9IGdiX2hpZF9wcm9iZSwKKwkuZGlzY29ubmVjdAk9IGdiX2hpZF9kaXNjb25uZWN0LAorCS5pZF90YWJsZQk9IGdiX2hpZF9pZF90YWJsZSwKK307Cittb2R1bGVfZ3JleWJ1c19kcml2ZXIoZ2JfaGlkX2RyaXZlcik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2kyYy5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvaTJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJhNTAwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2kyYy5jCkBAIC0wLDAgKzEsMzQzIEBACisvKgorICogSTJDIGJyaWRnZSBkcml2ZXIgZm9yIHRoZSBHcmV5YnVzICJnZW5lcmljIiBJMkMgbW9kdWxlLgorICoKKyAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNCBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisKKyNpbmNsdWRlICJncmV5YnVzLmgiCisjaW5jbHVkZSAiZ2JwaHkuaCIKKworc3RydWN0IGdiX2kyY19kZXZpY2UgeworCXN0cnVjdCBnYl9jb25uZWN0aW9uCSpjb25uZWN0aW9uOworCXN0cnVjdCBnYnBoeV9kZXZpY2UJKmdicGh5X2RldjsKKworCXUzMgkJCWZ1bmN0aW9uYWxpdHk7CisKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIJYWRhcHRlcjsKK307CisKKy8qCisgKiBNYXAgR3JleWJ1cyBpMmMgZnVuY3Rpb25hbGl0eSBiaXRzIGludG8gTGludXggb25lcworICovCitzdGF0aWMgdTMyIGdiX2kyY19mdW5jdGlvbmFsaXR5X21hcCh1MzIgZ2JfaTJjX2Z1bmN0aW9uYWxpdHkpCit7CisJcmV0dXJuIGdiX2kyY19mdW5jdGlvbmFsaXR5OwkvKiBBbGwgYml0cyB0aGUgc2FtZSBmb3Igbm93ICovCit9CisKK3N0YXRpYyBpbnQgZ2JfaTJjX2Z1bmN0aW9uYWxpdHlfb3BlcmF0aW9uKHN0cnVjdCBnYl9pMmNfZGV2aWNlICpnYl9pMmNfZGV2KQoreworCXN0cnVjdCBnYl9pMmNfZnVuY3Rpb25hbGl0eV9yZXNwb25zZSByZXNwb25zZTsKKwl1MzIgZnVuY3Rpb25hbGl0eTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoZ2JfaTJjX2Rldi0+Y29ubmVjdGlvbiwKKwkJCQlHQl9JMkNfVFlQRV9GVU5DVElPTkFMSVRZLAorCQkJCU5VTEwsIDAsICZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWZ1bmN0aW9uYWxpdHkgPSBsZTMyX3RvX2NwdShyZXNwb25zZS5mdW5jdGlvbmFsaXR5KTsKKwlnYl9pMmNfZGV2LT5mdW5jdGlvbmFsaXR5ID0gZ2JfaTJjX2Z1bmN0aW9uYWxpdHlfbWFwKGZ1bmN0aW9uYWxpdHkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBNYXAgTGludXggaTJjX21zZyBmbGFncyBpbnRvIEdyZXlidXMgaTJjIHRyYW5zZmVyIG9wIGZsYWdzLgorICovCitzdGF0aWMgdTE2IGdiX2kyY190cmFuc2Zlcl9vcF9mbGFnc19tYXAodTE2IGZsYWdzKQoreworCXJldHVybiBmbGFnczsJLyogQWxsIGZsYWdzIHRoZSBzYW1lIGZvciBub3cgKi8KK30KKworc3RhdGljIHZvaWQKK2diX2kyY19maWxsX3RyYW5zZmVyX29wKHN0cnVjdCBnYl9pMmNfdHJhbnNmZXJfb3AgKm9wLCBzdHJ1Y3QgaTJjX21zZyAqbXNnKQoreworCXUxNiBmbGFncyA9IGdiX2kyY190cmFuc2Zlcl9vcF9mbGFnc19tYXAobXNnLT5mbGFncyk7CisKKwlvcC0+YWRkciA9IGNwdV90b19sZTE2KG1zZy0+YWRkcik7CisJb3AtPmZsYWdzID0gY3B1X3RvX2xlMTYoZmxhZ3MpOworCW9wLT5zaXplID0gY3B1X3RvX2xlMTYobXNnLT5sZW4pOworfQorCitzdGF0aWMgc3RydWN0IGdiX29wZXJhdGlvbiAqCitnYl9pMmNfb3BlcmF0aW9uX2NyZWF0ZShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCXN0cnVjdCBpMmNfbXNnICptc2dzLCB1MzIgbXNnX2NvdW50KQoreworCXN0cnVjdCBnYl9pMmNfZGV2aWNlICpnYl9pMmNfZGV2ID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShjb25uZWN0aW9uKTsKKwlzdHJ1Y3QgZ2JfaTJjX3RyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3Q7CisJc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uOworCXN0cnVjdCBnYl9pMmNfdHJhbnNmZXJfb3AgKm9wOworCXN0cnVjdCBpMmNfbXNnICptc2c7CisJdTMyIGRhdGFfb3V0X3NpemUgPSAwOworCXUzMiBkYXRhX2luX3NpemUgPSAwOworCXNpemVfdCByZXF1ZXN0X3NpemU7CisJdm9pZCAqZGF0YTsKKwl1MTYgb3BfY291bnQ7CisJdTMyIGk7CisKKwlpZiAobXNnX2NvdW50ID4gKHUzMilVMTZfTUFYKSB7CisJCWRldl9lcnIoJmdiX2kyY19kZXYtPmdicGh5X2Rldi0+ZGV2LCAibXNnX2NvdW50ICgldSkgdG9vIGJpZ1xuIiwKKwkJCW1zZ19jb3VudCk7CisJCXJldHVybiBOVUxMOworCX0KKwlvcF9jb3VudCA9ICh1MTYpbXNnX2NvdW50OworCisJLyoKKwkgKiBJbiBhZGRpdGlvbiB0byBzcGFjZSBmb3IgYWxsIG1lc3NhZ2UgZGVzY3JpcHRvcnMgd2UgbmVlZAorCSAqIHRvIGhhdmUgZW5vdWdoIHRvIGhvbGQgYWxsIG91dGJvdW5kIG1lc3NhZ2UgZGF0YS4KKwkgKi8KKwltc2cgPSBtc2dzOworCWZvciAoaSA9IDA7IGkgPCBtc2dfY291bnQ7IGkrKywgbXNnKyspCisJCWlmIChtc2ctPmZsYWdzICYgSTJDX01fUkQpCisJCQlkYXRhX2luX3NpemUgKz0gKHUzMiltc2ctPmxlbjsKKwkJZWxzZQorCQkJZGF0YV9vdXRfc2l6ZSArPSAodTMyKW1zZy0+bGVuOworCisJcmVxdWVzdF9zaXplID0gc2l6ZW9mKCpyZXF1ZXN0KTsKKwlyZXF1ZXN0X3NpemUgKz0gbXNnX2NvdW50ICogc2l6ZW9mKCpvcCk7CisJcmVxdWVzdF9zaXplICs9IGRhdGFfb3V0X3NpemU7CisKKwkvKiBSZXNwb25zZSBjb25zaXN0cyBvbmx5IG9mIGluY29taW5nIGRhdGEgKi8KKwlvcGVyYXRpb24gPSBnYl9vcGVyYXRpb25fY3JlYXRlKGNvbm5lY3Rpb24sIEdCX0kyQ19UWVBFX1RSQU5TRkVSLAorCQkJCXJlcXVlc3Rfc2l6ZSwgZGF0YV9pbl9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9wZXJhdGlvbikKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXF1ZXN0ID0gb3BlcmF0aW9uLT5yZXF1ZXN0LT5wYXlsb2FkOworCXJlcXVlc3QtPm9wX2NvdW50ID0gY3B1X3RvX2xlMTYob3BfY291bnQpOworCS8qIEZpbGwgaW4gdGhlIG9wcyBhcnJheSAqLworCW9wID0gJnJlcXVlc3QtPm9wc1swXTsKKwltc2cgPSBtc2dzOworCWZvciAoaSA9IDA7IGkgPCBtc2dfY291bnQ7IGkrKykKKwkJZ2JfaTJjX2ZpbGxfdHJhbnNmZXJfb3Aob3ArKywgbXNnKyspOworCisJaWYgKCFkYXRhX291dF9zaXplKQorCQlyZXR1cm4gb3BlcmF0aW9uOworCisJLyogQ29weSBvdmVyIHRoZSBvdXRnb2luZyBkYXRhOyBpdCBzdGFydHMgYWZ0ZXIgdGhlIGxhc3Qgb3AgKi8KKwlkYXRhID0gb3A7CisJbXNnID0gbXNnczsKKwlmb3IgKGkgPSAwOyBpIDwgbXNnX2NvdW50OyBpKyspIHsKKwkJaWYgKCEobXNnLT5mbGFncyAmIEkyQ19NX1JEKSkgeworCQkJbWVtY3B5KGRhdGEsIG1zZy0+YnVmLCBtc2ctPmxlbik7CisJCQlkYXRhICs9IG1zZy0+bGVuOworCQl9CisJCW1zZysrOworCX0KKworCXJldHVybiBvcGVyYXRpb247Cit9CisKK3N0YXRpYyB2b2lkIGdiX2kyY19kZWNvZGVfcmVzcG9uc2Uoc3RydWN0IGkyY19tc2cgKm1zZ3MsIHUzMiBtc2dfY291bnQsCisJCQkJc3RydWN0IGdiX2kyY190cmFuc2Zlcl9yZXNwb25zZSAqcmVzcG9uc2UpCit7CisJc3RydWN0IGkyY19tc2cgKm1zZyA9IG1zZ3M7CisJdTggKmRhdGE7CisJdTMyIGk7CisKKwlpZiAoIXJlc3BvbnNlKQorCQlyZXR1cm47CisJZGF0YSA9IHJlc3BvbnNlLT5kYXRhOworCWZvciAoaSA9IDA7IGkgPCBtc2dfY291bnQ7IGkrKykgeworCQlpZiAobXNnLT5mbGFncyAmIEkyQ19NX1JEKSB7CisJCQltZW1jcHkobXNnLT5idWYsIGRhdGEsIG1zZy0+bGVuKTsKKwkJCWRhdGEgKz0gbXNnLT5sZW47CisJCX0KKwkJbXNnKys7CisJfQorfQorCisvKgorICogU29tZSBpMmMgdHJhbnNmZXIgb3BlcmF0aW9ucyByZXR1cm4gcmVzdWx0cyB0aGF0IGFyZSBleHBlY3RlZC4KKyAqLworc3RhdGljIGJvb2wgZ2JfaTJjX2V4cGVjdGVkX3RyYW5zZmVyX2Vycm9yKGludCBlcnJubykKK3sKKwlyZXR1cm4gZXJybm8gPT0gLUVBR0FJTiB8fCBlcnJubyA9PSAtRU5PREVWOworfQorCitzdGF0aWMgaW50IGdiX2kyY190cmFuc2Zlcl9vcGVyYXRpb24oc3RydWN0IGdiX2kyY19kZXZpY2UgKmdiX2kyY19kZXYsCisJCQkJCXN0cnVjdCBpMmNfbXNnICptc2dzLCB1MzIgbXNnX2NvdW50KQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZ2JfaTJjX2Rldi0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZ2JfaTJjX2Rldi0+Z2JwaHlfZGV2LT5kZXY7CisJc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uOworCWludCByZXQ7CisKKwlvcGVyYXRpb24gPSBnYl9pMmNfb3BlcmF0aW9uX2NyZWF0ZShjb25uZWN0aW9uLCBtc2dzLCBtc2dfY291bnQpOworCWlmICghb3BlcmF0aW9uKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IGdicGh5X3J1bnRpbWVfZ2V0X3N5bmMoZ2JfaTJjX2Rldi0+Z2JwaHlfZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGV4aXRfb3BlcmF0aW9uX3B1dDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9yZXF1ZXN0X3NlbmRfc3luYyhvcGVyYXRpb24pOworCWlmICghcmV0KSB7CisJCXN0cnVjdCBnYl9pMmNfdHJhbnNmZXJfcmVzcG9uc2UgKnJlc3BvbnNlOworCisJCXJlc3BvbnNlID0gb3BlcmF0aW9uLT5yZXNwb25zZS0+cGF5bG9hZDsKKwkJZ2JfaTJjX2RlY29kZV9yZXNwb25zZShtc2dzLCBtc2dfY291bnQsIHJlc3BvbnNlKTsKKwkJcmV0ID0gbXNnX2NvdW50OworCX0gZWxzZSBpZiAoIWdiX2kyY19leHBlY3RlZF90cmFuc2Zlcl9lcnJvcihyZXQpKSB7CisJCWRldl9lcnIoZGV2LCAidHJhbnNmZXIgb3BlcmF0aW9uIGZhaWxlZCAoJWQpXG4iLCByZXQpOworCX0KKworCWdicGh5X3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGdiX2kyY19kZXYtPmdicGh5X2Rldik7CisKK2V4aXRfb3BlcmF0aW9uX3B1dDoKKwlnYl9vcGVyYXRpb25fcHV0KG9wZXJhdGlvbik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX2kyY19tYXN0ZXJfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHN0cnVjdCBpMmNfbXNnICptc2dzLAorCQlpbnQgbXNnX2NvdW50KQoreworCXN0cnVjdCBnYl9pMmNfZGV2aWNlICpnYl9pMmNfZGV2OworCisJZ2JfaTJjX2RldiA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CisKKwlyZXR1cm4gZ2JfaTJjX3RyYW5zZmVyX29wZXJhdGlvbihnYl9pMmNfZGV2LCBtc2dzLCBtc2dfY291bnQpOworfQorCisjaWYgMAorLyogTGF0ZXIgKi8KK3N0YXRpYyBpbnQgZ2JfaTJjX3NtYnVzX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLAorCQkJdTE2IGFkZHIsIHVuc2lnbmVkIHNob3J0IGZsYWdzLCBjaGFyIHJlYWRfd3JpdGUsCisJCQl1OCBjb21tYW5kLCBpbnQgc2l6ZSwgdW5pb24gaTJjX3NtYnVzX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGdiX2kyY19kZXZpY2UgKmdiX2kyY19kZXY7CisKKwlnYl9pMmNfZGV2ID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyB1MzIgZ2JfaTJjX2Z1bmN0aW9uYWxpdHkoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXN0cnVjdCBnYl9pMmNfZGV2aWNlICpnYl9pMmNfZGV2ID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKKworCXJldHVybiBnYl9pMmNfZGV2LT5mdW5jdGlvbmFsaXR5OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19hbGdvcml0aG0gZ2JfaTJjX2FsZ29yaXRobSA9IHsKKwkubWFzdGVyX3hmZXIJPSBnYl9pMmNfbWFzdGVyX3hmZXIsCisJLyogLnNtYnVzX3hmZXIJPSBnYl9pMmNfc21idXNfeGZlciwgKi8KKwkuZnVuY3Rpb25hbGl0eQk9IGdiX2kyY19mdW5jdGlvbmFsaXR5LAorfTsKKworLyoKKyAqIERvIGluaXRpYWwgc2V0dXAgb2YgdGhlIGkyYyBkZXZpY2UuICBUaGlzIGluY2x1ZGVzIHZlcmlmeWluZyB3ZQorICogY2FuIHN1cHBvcnQgaXQgKGJhc2VkIG9uIHRoZSBwcm90b2NvbCB2ZXJzaW9uIGl0IGFkdmVydGlzZXMpLgorICogSWYgdGhhdCdzIE9LLCB3ZSBnZXQgYW5kIGNhY2hlZCBpdHMgZnVuY3Rpb25hbGl0eSBiaXRzLgorICoKKyAqIE5vdGU6IGdiX2kyY19kZXYtPmNvbm5lY3Rpb24gaXMgYXNzdW1lZCB0byBoYXZlIGJlZW4gdmFsaWQuCisgKi8KK3N0YXRpYyBpbnQgZ2JfaTJjX2RldmljZV9zZXR1cChzdHJ1Y3QgZ2JfaTJjX2RldmljZSAqZ2JfaTJjX2RldikKK3sKKwkvKiBBc3N1bWUgdGhlIGZ1bmN0aW9uYWxpdHkgbmV2ZXIgY2hhbmdlcywganVzdCBnZXQgaXQgb25jZSAqLworCXJldHVybiBnYl9pMmNfZnVuY3Rpb25hbGl0eV9vcGVyYXRpb24oZ2JfaTJjX2Rldik7Cit9CisKK3N0YXRpYyBpbnQgZ2JfaTJjX3Byb2JlKHN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldiwKKwkJCSBjb25zdCBzdHJ1Y3QgZ2JwaHlfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfaTJjX2RldmljZSAqZ2JfaTJjX2RldjsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXI7CisJaW50IHJldDsKKworCWdiX2kyY19kZXYgPSBremFsbG9jKHNpemVvZigqZ2JfaTJjX2RldiksIEdGUF9LRVJORUwpOworCWlmICghZ2JfaTJjX2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljb25uZWN0aW9uID0gZ2JfY29ubmVjdGlvbl9jcmVhdGUoZ2JwaHlfZGV2LT5idW5kbGUsCisJCQkJCSAgbGUxNl90b19jcHUoZ2JwaHlfZGV2LT5jcG9ydF9kZXNjLT5pZCksCisJCQkJCSAgTlVMTCk7CisJaWYgKElTX0VSUihjb25uZWN0aW9uKSkgeworCQlyZXQgPSBQVFJfRVJSKGNvbm5lY3Rpb24pOworCQlnb3RvIGV4aXRfaTJjZGV2X2ZyZWU7CisJfQorCisJZ2JfaTJjX2Rldi0+Y29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisJZ2JfY29ubmVjdGlvbl9zZXRfZGF0YShjb25uZWN0aW9uLCBnYl9pMmNfZGV2KTsKKwlnYl9pMmNfZGV2LT5nYnBoeV9kZXYgPSBnYnBoeV9kZXY7CisJZ2JfZ2JwaHlfc2V0X2RhdGEoZ2JwaHlfZGV2LCBnYl9pMmNfZGV2KTsKKworCXJldCA9IGdiX2Nvbm5lY3Rpb25fZW5hYmxlKGNvbm5lY3Rpb24pOworCWlmIChyZXQpCisJCWdvdG8gZXhpdF9jb25uZWN0aW9uX2Rlc3Ryb3k7CisKKwlyZXQgPSBnYl9pMmNfZGV2aWNlX3NldHVwKGdiX2kyY19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXhpdF9jb25uZWN0aW9uX2Rpc2FibGU7CisKKwkvKiBMb29rcyBnb29kOyB1cCBvdXIgaTJjIGFkYXB0ZXIgKi8KKwlhZGFwdGVyID0gJmdiX2kyY19kZXYtPmFkYXB0ZXI7CisJYWRhcHRlci0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlhZGFwdGVyLT5jbGFzcyA9IEkyQ19DTEFTU19IV01PTiB8IEkyQ19DTEFTU19TUEQ7CisJYWRhcHRlci0+YWxnbyA9ICZnYl9pMmNfYWxnb3JpdGhtOworCS8qIGFkYXB0ZXItPmFsZ29fZGF0YSA9IHdoYXQ/ICovCisKKwlhZGFwdGVyLT5kZXYucGFyZW50ID0gJmdicGh5X2Rldi0+ZGV2OworCXNucHJpbnRmKGFkYXB0ZXItPm5hbWUsIHNpemVvZihhZGFwdGVyLT5uYW1lKSwgIkdyZXlidXMgaTJjIGFkYXB0ZXIiKTsKKwlpMmNfc2V0X2FkYXBkYXRhKGFkYXB0ZXIsIGdiX2kyY19kZXYpOworCisJcmV0ID0gaTJjX2FkZF9hZGFwdGVyKGFkYXB0ZXIpOworCWlmIChyZXQpCisJCWdvdG8gZXhpdF9jb25uZWN0aW9uX2Rpc2FibGU7CisKKwlnYnBoeV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChnYnBoeV9kZXYpOworCXJldHVybiAwOworCitleGl0X2Nvbm5lY3Rpb25fZGlzYWJsZToKKwlnYl9jb25uZWN0aW9uX2Rpc2FibGUoY29ubmVjdGlvbik7CitleGl0X2Nvbm5lY3Rpb25fZGVzdHJveToKKwlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koY29ubmVjdGlvbik7CitleGl0X2kyY2Rldl9mcmVlOgorCWtmcmVlKGdiX2kyY19kZXYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZ2JfaTJjX3JlbW92ZShzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXYpCit7CisJc3RydWN0IGdiX2kyY19kZXZpY2UgKmdiX2kyY19kZXYgPSBnYl9nYnBoeV9nZXRfZGF0YShnYnBoeV9kZXYpOworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZ2JfaTJjX2Rldi0+Y29ubmVjdGlvbjsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2JwaHlfcnVudGltZV9nZXRfc3luYyhnYnBoeV9kZXYpOworCWlmIChyZXQpCisJCWdicGh5X3J1bnRpbWVfZ2V0X25vcmVzdW1lKGdicGh5X2Rldik7CisKKwlpMmNfZGVsX2FkYXB0ZXIoJmdiX2kyY19kZXYtPmFkYXB0ZXIpOworCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShjb25uZWN0aW9uKTsKKwlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koY29ubmVjdGlvbik7CisJa2ZyZWUoZ2JfaTJjX2Rldik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ2JwaHlfZGV2aWNlX2lkIGdiX2kyY19pZF90YWJsZVtdID0geworCXsgR0JQSFlfUFJPVE9DT0woR1JFWUJVU19QUk9UT0NPTF9JMkMpIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoZ2JwaHksIGdiX2kyY19pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZ2JwaHlfZHJpdmVyIGkyY19kcml2ZXIgPSB7CisJLm5hbWUJCT0gImkyYyIsCisJLnByb2JlCQk9IGdiX2kyY19wcm9iZSwKKwkucmVtb3ZlCQk9IGdiX2kyY19yZW1vdmUsCisJLmlkX3RhYmxlCT0gZ2JfaTJjX2lkX3RhYmxlLAorfTsKKworbW9kdWxlX2dicGh5X2RyaXZlcihpMmNfZHJpdmVyKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2ludGVyZmFjZS5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvaW50ZXJmYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ2YjA5MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2ludGVyZmFjZS5jCkBAIC0wLDAgKzEsMTMxNiBAQAorLyoKKyAqIEdyZXlidXMgaW50ZXJmYWNlIGNvZGUKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTQgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgImdyZXlidXMuaCIKKyNpbmNsdWRlICJncmV5YnVzX3RyYWNlLmgiCisKKyNkZWZpbmUgR0JfSU5URVJGQUNFX01PREVfU1dJVENIX1RJTUVPVVQJMjAwMAorCisjZGVmaW5lIEdCX0lOVEVSRkFDRV9ERVZJQ0VfSURfQkFECTB4ZmYKKworI2RlZmluZSBHQl9JTlRFUkZBQ0VfQVVUT1NVU1BFTkRfTVMJCQkzMDAwCisKKy8qIFRpbWUgcmVxdWlyZWQgZm9yIGludGVyZmFjZSB0byBlbnRlciBzdGFuZGJ5IGJlZm9yZSBkaXNhYmxpbmcgUkVGQ0xLICovCisjZGVmaW5lIEdCX0lOVEVSRkFDRV9TVVNQRU5EX0hJQkVSTkFURV9ERUxBWV9NUwkJCTIwCisKKy8qIERvbid0LWNhcmUgc2VsZWN0b3IgaW5kZXggKi8KKyNkZWZpbmUgRE1FX1NFTEVDVE9SX0lOREVYX05VTEwJCTAKKworLyogRE1FIGF0dHJpYnV0ZXMgKi8KKy8qIEZJWE1FOiByZW1vdmUgRVMyIHN1cHBvcnQgYW5kIERNRV9UX1RTVF9TUkNfSU5DUkVNRU5UICovCisjZGVmaW5lIERNRV9UX1RTVF9TUkNfSU5DUkVNRU5UCQkweDQwODMKKworI2RlZmluZSBETUVfRERCTDFfTUFOVUZBQ1RVUkVSSUQJMHg1MDAzCisjZGVmaW5lIERNRV9EREJMMV9QUk9EVUNUSUQJCTB4NTAwNAorCisjZGVmaW5lIERNRV9UT1NISUJBX0dNUF9WSUQJCTB4NjAwMAorI2RlZmluZSBETUVfVE9TSElCQV9HTVBfUElECQkweDYwMDEKKyNkZWZpbmUgRE1FX1RPU0hJQkFfR01QX1NOMAkJMHg2MDAyCisjZGVmaW5lIERNRV9UT1NISUJBX0dNUF9TTjEJCTB4NjAwMworI2RlZmluZSBETUVfVE9TSElCQV9HTVBfSU5JVF9TVEFUVVMJMHg2MTAxCisKKy8qIEREQkwxIE1hbnVmYWN0dXJlciBhbmQgUHJvZHVjdCBpZHMgKi8KKyNkZWZpbmUgVE9TSElCQV9ETUlECQkJMHgwMTI2CisjZGVmaW5lIFRPU0hJQkFfRVMyX0JSSURHRV9EUElECQkweDEwMDAKKyNkZWZpbmUgVE9TSElCQV9FUzNfQVBCUklER0VfRFBJRAkweDEwMDEKKyNkZWZpbmUgVE9TSElCQV9FUzNfR0JQSFlfRFBJRAkweDEwMDIKKworc3RhdGljIGludCBnYl9pbnRlcmZhY2VfaGliZXJuYXRlX2xpbmsoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50Zik7CitzdGF0aWMgaW50IGdiX2ludGVyZmFjZV9yZWZjbGtfc2V0KHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYsIGJvb2wgZW5hYmxlKTsKKworc3RhdGljIGludCBnYl9pbnRlcmZhY2VfZG1lX2F0dHJfZ2V0KHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYsCisJCQkJCQkJdTE2IGF0dHIsIHUzMiAqdmFsKQoreworCXJldHVybiBnYl9zdmNfZG1lX3BlZXJfZ2V0KGludGYtPmhkLT5zdmMsIGludGYtPmludGVyZmFjZV9pZCwKKwkJCQkJYXR0ciwgRE1FX1NFTEVDVE9SX0lOREVYX05VTEwsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgZ2JfaW50ZXJmYWNlX3JlYWRfYXJhX2RtZShzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKQoreworCXUzMiBzbjAsIHNuMTsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBVbmxlc3MgdGhpcyBpcyBhIFRvc2hpYmEgYnJpZGdlLCBiYWlsIG91dCB1bnRpbCB3ZSBoYXZlIGRlZmluZWQKKwkgKiBzdGFuZGFyZCBHTVAgYXR0cmlidXRlcy4KKwkgKi8KKwlpZiAoaW50Zi0+ZGRibDFfbWFudWZhY3R1cmVyX2lkICE9IFRPU0hJQkFfRE1JRCkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJ1bmtub3duIG1hbnVmYWN0dXJlciAlMDh4XG4iLAorCQkJCWludGYtPmRkYmwxX21hbnVmYWN0dXJlcl9pZCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldCA9IGdiX2ludGVyZmFjZV9kbWVfYXR0cl9nZXQoaW50ZiwgRE1FX1RPU0hJQkFfR01QX1ZJRCwKKwkJCQkJJmludGYtPnZlbmRvcl9pZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGdiX2ludGVyZmFjZV9kbWVfYXR0cl9nZXQoaW50ZiwgRE1FX1RPU0hJQkFfR01QX1BJRCwKKwkJCQkJJmludGYtPnByb2R1Y3RfaWQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBnYl9pbnRlcmZhY2VfZG1lX2F0dHJfZ2V0KGludGYsIERNRV9UT1NISUJBX0dNUF9TTjAsICZzbjApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBnYl9pbnRlcmZhY2VfZG1lX2F0dHJfZ2V0KGludGYsIERNRV9UT1NISUJBX0dNUF9TTjEsICZzbjEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpbnRmLT5zZXJpYWxfbnVtYmVyID0gKHU2NClzbjEgPDwgMzIgfCBzbjA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9pbnRlcmZhY2VfcmVhZF9kbWUoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlpbnQgcmV0OworCisJLyogRE1FIGF0dHJpYnV0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gcmVhZCAqLworCWlmIChpbnRmLT5kbWVfcmVhZCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBnYl9pbnRlcmZhY2VfZG1lX2F0dHJfZ2V0KGludGYsIERNRV9EREJMMV9NQU5VRkFDVFVSRVJJRCwKKwkJCQkJJmludGYtPmRkYmwxX21hbnVmYWN0dXJlcl9pZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGdiX2ludGVyZmFjZV9kbWVfYXR0cl9nZXQoaW50ZiwgRE1FX0REQkwxX1BST0RVQ1RJRCwKKwkJCQkJJmludGYtPmRkYmwxX3Byb2R1Y3RfaWQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoaW50Zi0+ZGRibDFfbWFudWZhY3R1cmVyX2lkID09IFRPU0hJQkFfRE1JRCAmJgorCQkJaW50Zi0+ZGRibDFfcHJvZHVjdF9pZCA9PSBUT1NISUJBX0VTMl9CUklER0VfRFBJRCkgeworCQlpbnRmLT5xdWlya3MgfD0gR0JfSU5URVJGQUNFX1FVSVJLX05PX0dNUF9JRFM7CisJCWludGYtPnF1aXJrcyB8PSBHQl9JTlRFUkZBQ0VfUVVJUktfTk9fSU5JVF9TVEFUVVM7CisJfQorCisJcmV0ID0gZ2JfaW50ZXJmYWNlX3JlYWRfYXJhX2RtZShpbnRmKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaW50Zi0+ZG1lX3JlYWQgPSB0cnVlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JfaW50ZXJmYWNlX3JvdXRlX2NyZWF0ZShzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBnYl9zdmMgKnN2YyA9IGludGYtPmhkLT5zdmM7CisJdTggaW50Zl9pZCA9IGludGYtPmludGVyZmFjZV9pZDsKKwl1OCBkZXZpY2VfaWQ7CisJaW50IHJldDsKKworCS8qIEFsbG9jYXRlIGFuIGludGVyZmFjZSBkZXZpY2UgaWQuICovCisJcmV0ID0gaWRhX3NpbXBsZV9nZXQoJnN2Yy0+ZGV2aWNlX2lkX21hcCwKKwkJCSAgICAgR0JfU1ZDX0RFVklDRV9JRF9NSU4sIEdCX1NWQ19ERVZJQ0VfSURfTUFYICsgMSwKKwkJCSAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGRldmljZSBpZDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCWRldmljZV9pZCA9IHJldDsKKworCXJldCA9IGdiX3N2Y19pbnRmX2RldmljZV9pZChzdmMsIGludGZfaWQsIGRldmljZV9pZCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJmYWlsZWQgdG8gc2V0IGRldmljZSBpZCAldTogJWRcbiIsCisJCQkJZGV2aWNlX2lkLCByZXQpOworCQlnb3RvIGVycl9pZGFfcmVtb3ZlOworCX0KKworCS8qIEZJWE1FOiBIYXJkLWNvZGVkIEFQIGRldmljZSBpZC4gKi8KKwlyZXQgPSBnYl9zdmNfcm91dGVfY3JlYXRlKHN2Yywgc3ZjLT5hcF9pbnRmX2lkLCBHQl9TVkNfREVWSUNFX0lEX0FQLAorCQkJCSAgaW50Zl9pZCwgZGV2aWNlX2lkKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgImZhaWxlZCB0byBjcmVhdGUgcm91dGU6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9zdmNfaWRfZnJlZTsKKwl9CisKKwlpbnRmLT5kZXZpY2VfaWQgPSBkZXZpY2VfaWQ7CisKKwlyZXR1cm4gMDsKKworZXJyX3N2Y19pZF9mcmVlOgorCS8qCisJICogWFhYIFNob3VsZCB3ZSB0ZWxsIFNWQyB0aGF0IHRoaXMgaWQgZG9lc24ndCBiZWxvbmcgdG8gaW50ZXJmYWNlCisJICogWFhYIGFueW1vcmUuCisJICovCitlcnJfaWRhX3JlbW92ZToKKwlpZGFfc2ltcGxlX3JlbW92ZSgmc3ZjLT5kZXZpY2VfaWRfbWFwLCBkZXZpY2VfaWQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZ2JfaW50ZXJmYWNlX3JvdXRlX2Rlc3Ryb3koc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSBpbnRmLT5oZC0+c3ZjOworCisJaWYgKGludGYtPmRldmljZV9pZCA9PSBHQl9JTlRFUkZBQ0VfREVWSUNFX0lEX0JBRCkKKwkJcmV0dXJuOworCisJZ2Jfc3ZjX3JvdXRlX2Rlc3Ryb3koc3ZjLCBzdmMtPmFwX2ludGZfaWQsIGludGYtPmludGVyZmFjZV9pZCk7CisJaWRhX3NpbXBsZV9yZW1vdmUoJnN2Yy0+ZGV2aWNlX2lkX21hcCwgaW50Zi0+ZGV2aWNlX2lkKTsKKwlpbnRmLT5kZXZpY2VfaWQgPSBHQl9JTlRFUkZBQ0VfREVWSUNFX0lEX0JBRDsKK30KKworLyogTG9ja2luZzogQ2FsbGVyIGhvbGRzIHRoZSBpbnRlcmZhY2UgbXV0ZXguICovCitzdGF0aWMgaW50IGdiX2ludGVyZmFjZV9sZWdhY3lfbW9kZV9zd2l0Y2goc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlpbnQgcmV0OworCisJZGV2X2luZm8oJmludGYtPmRldiwgImxlZ2FjeSBtb2RlIHN3aXRjaCBkZXRlY3RlZFxuIik7CisKKwkvKiBNYXJrIGFzIGRpc2Nvbm5lY3RlZCB0byBwcmV2ZW50IEkvTyBkdXJpbmcgZGlzYWJsZS4gKi8KKwlpbnRmLT5kaXNjb25uZWN0ZWQgPSB0cnVlOworCWdiX2ludGVyZmFjZV9kaXNhYmxlKGludGYpOworCWludGYtPmRpc2Nvbm5lY3RlZCA9IGZhbHNlOworCisJcmV0ID0gZ2JfaW50ZXJmYWNlX2VuYWJsZShpbnRmKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgImZhaWxlZCB0byByZS1lbmFibGUgaW50ZXJmYWNlOiAlZFxuIiwgcmV0KTsKKwkJZ2JfaW50ZXJmYWNlX2RlYWN0aXZhdGUoaW50Zik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBnYl9pbnRlcmZhY2VfbWFpbGJveF9ldmVudChzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmLCB1MTYgcmVzdWx0LAorCQkJCQkJCQl1MzIgbWFpbGJveCkKK3sKKwltdXRleF9sb2NrKCZpbnRmLT5tdXRleCk7CisKKwlpZiAocmVzdWx0KSB7CisJCWRldl93YXJuKCZpbnRmLT5kZXYsCisJCQkJIm1haWxib3ggZXZlbnQgd2l0aCBVbmlQcm8gZXJyb3I6IDB4JTA0eFxuIiwKKwkJCQlyZXN1bHQpOworCQlnb3RvIGVycl9kaXNhYmxlOworCX0KKworCWlmIChtYWlsYm94ICE9IEdCX1NWQ19JTlRGX01BSUxCT1hfR1JFWUJVUykgeworCQlkZXZfd2FybigmaW50Zi0+ZGV2LAorCQkJCSJtYWlsYm94IGV2ZW50IHdpdGggdW5leHBlY3RlZCB2YWx1ZTogMHglMDh4XG4iLAorCQkJCW1haWxib3gpOworCQlnb3RvIGVycl9kaXNhYmxlOworCX0KKworCWlmIChpbnRmLT5xdWlya3MgJiBHQl9JTlRFUkZBQ0VfUVVJUktfTEVHQUNZX01PREVfU1dJVENIKSB7CisJCWdiX2ludGVyZmFjZV9sZWdhY3lfbW9kZV9zd2l0Y2goaW50Zik7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlpZiAoIWludGYtPm1vZGVfc3dpdGNoKSB7CisJCWRldl93YXJuKCZpbnRmLT5kZXYsICJ1bmV4cGVjdGVkIG1haWxib3ggZXZlbnQ6IDB4JTA4eFxuIiwKKwkJCQltYWlsYm94KTsKKwkJZ290byBlcnJfZGlzYWJsZTsKKwl9CisKKwlkZXZfaW5mbygmaW50Zi0+ZGV2LCAibW9kZSBzd2l0Y2ggZGV0ZWN0ZWRcbiIpOworCisJY29tcGxldGUoJmludGYtPm1vZGVfc3dpdGNoX2NvbXBsZXRpb24pOworCitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmaW50Zi0+bXV0ZXgpOworCisJcmV0dXJuOworCitlcnJfZGlzYWJsZToKKwlnYl9pbnRlcmZhY2VfZGlzYWJsZShpbnRmKTsKKwlnYl9pbnRlcmZhY2VfZGVhY3RpdmF0ZShpbnRmKTsKKwltdXRleF91bmxvY2soJmludGYtPm11dGV4KTsKK30KKworc3RhdGljIHZvaWQgZ2JfaW50ZXJmYWNlX21vZGVfc3dpdGNoX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGY7CisJc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2w7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCByZXQ7CisKKwlpbnRmID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBnYl9pbnRlcmZhY2UsIG1vZGVfc3dpdGNoX3dvcmspOworCisJbXV0ZXhfbG9jaygmaW50Zi0+bXV0ZXgpOworCS8qIE1ha2Ugc3VyZSBpbnRlcmZhY2UgaXMgc3RpbGwgZW5hYmxlZC4gKi8KKwlpZiAoIWludGYtPmVuYWJsZWQpIHsKKwkJZGV2X2RiZygmaW50Zi0+ZGV2LCAibW9kZSBzd2l0Y2ggYWJvcnRlZFxuIik7CisJCWludGYtPm1vZGVfc3dpdGNoID0gZmFsc2U7CisJCW11dGV4X3VubG9jaygmaW50Zi0+bXV0ZXgpOworCQlnb3RvIG91dF9pbnRlcmZhY2VfcHV0OworCX0KKworCS8qCisJICogUHJlcGFyZSB0aGUgY29udHJvbCBkZXZpY2UgZm9yIG1vZGUgc3dpdGNoIGFuZCBtYWtlIHN1cmUgdG8gZ2V0IGFuCisJICogZXh0cmEgcmVmZXJlbmNlIGJlZm9yZSBpdCBnb2VzIGF3YXkgZHVyaW5nIGludGVyZmFjZSBkaXNhYmxlLgorCSAqLworCWNvbnRyb2wgPSBnYl9jb250cm9sX2dldChpbnRmLT5jb250cm9sKTsKKwlnYl9jb250cm9sX21vZGVfc3dpdGNoX3ByZXBhcmUoY29udHJvbCk7CisJZ2JfaW50ZXJmYWNlX2Rpc2FibGUoaW50Zik7CisJbXV0ZXhfdW5sb2NrKCZpbnRmLT5tdXRleCk7CisKKwl0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyhHQl9JTlRFUkZBQ0VfTU9ERV9TV0lUQ0hfVElNRU9VVCk7CisJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCisJCQkmaW50Zi0+bW9kZV9zd2l0Y2hfY29tcGxldGlvbiwgdGltZW91dCk7CisKKwkvKiBGaW5hbGlzZSBjb250cm9sLWNvbm5lY3Rpb24gbW9kZSBzd2l0Y2guICovCisJZ2JfY29udHJvbF9tb2RlX3N3aXRjaF9jb21wbGV0ZShjb250cm9sKTsKKwlnYl9jb250cm9sX3B1dChjb250cm9sKTsKKworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIm1vZGUgc3dpdGNoIGludGVycnVwdGVkXG4iKTsKKwkJZ290byBlcnJfZGVhY3RpdmF0ZTsKKwl9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIm1vZGUgc3dpdGNoIHRpbWVkIG91dFxuIik7CisJCWdvdG8gZXJyX2RlYWN0aXZhdGU7CisJfQorCisJLyogUmUtZW5hYmxlIChyZS1lbnVtZXJhdGUpIGludGVyZmFjZSBpZiBzdGlsbCBhY3RpdmUuICovCisJbXV0ZXhfbG9jaygmaW50Zi0+bXV0ZXgpOworCWludGYtPm1vZGVfc3dpdGNoID0gZmFsc2U7CisJaWYgKGludGYtPmFjdGl2ZSkgeworCQlyZXQgPSBnYl9pbnRlcmZhY2VfZW5hYmxlKGludGYpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJmYWlsZWQgdG8gcmUtZW5hYmxlIGludGVyZmFjZTogJWRcbiIsCisJCQkJCXJldCk7CisJCQlnYl9pbnRlcmZhY2VfZGVhY3RpdmF0ZShpbnRmKTsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmludGYtPm11dGV4KTsKKworb3V0X2ludGVyZmFjZV9wdXQ6CisJZ2JfaW50ZXJmYWNlX3B1dChpbnRmKTsKKworCXJldHVybjsKKworZXJyX2RlYWN0aXZhdGU6CisJbXV0ZXhfbG9jaygmaW50Zi0+bXV0ZXgpOworCWludGYtPm1vZGVfc3dpdGNoID0gZmFsc2U7CisJZ2JfaW50ZXJmYWNlX2RlYWN0aXZhdGUoaW50Zik7CisJbXV0ZXhfdW5sb2NrKCZpbnRmLT5tdXRleCk7CisKKwlnYl9pbnRlcmZhY2VfcHV0KGludGYpOworfQorCitpbnQgZ2JfaW50ZXJmYWNlX3JlcXVlc3RfbW9kZV9zd2l0Y2goc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJmludGYtPm11dGV4KTsKKwlpZiAoaW50Zi0+bW9kZV9zd2l0Y2gpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJaW50Zi0+bW9kZV9zd2l0Y2ggPSB0cnVlOworCXJlaW5pdF9jb21wbGV0aW9uKCZpbnRmLT5tb2RlX3N3aXRjaF9jb21wbGV0aW9uKTsKKworCS8qCisJICogR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBpbnRlcmZhY2UgZGV2aWNlLCB3aGljaCB3aWxsIGJlIHB1dCBvbmNlIHRoZQorCSAqIG1vZGUgc3dpdGNoIGlzIGNvbXBsZXRlLgorCSAqLworCWdldF9kZXZpY2UoJmludGYtPmRldik7CisKKwlpZiAoIXF1ZXVlX3dvcmsoc3lzdGVtX2xvbmdfd3EsICZpbnRmLT5tb2RlX3N3aXRjaF93b3JrKSkgeworCQlwdXRfZGV2aWNlKCZpbnRmLT5kZXYpOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZpbnRmLT5tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfaW50ZXJmYWNlX3JlcXVlc3RfbW9kZV9zd2l0Y2gpOworCisvKgorICogVF9Uc3RTcmNJbmNyZW1lbnQgaXMgd3JpdHRlbiBieSB0aGUgbW9kdWxlIG9uIEVTMiBhcyBhIHN0YW5kLWluIGZvciB0aGUKKyAqIGluaXQtc3RhdHVzIGF0dHJpYnV0ZSBETUVfVE9TSElCQV9JTklUX1NUQVRVUy4gVGhlIEFQIG5lZWRzIHRvIHJlYWQgYW5kCisgKiBjbGVhciBpdCBhZnRlciByZWFkaW5nIGEgbm9uLXplcm8gdmFsdWUgZnJvbSBpdC4KKyAqCisgKiBGSVhNRTogVGhpcyBpcyBtb2R1bGUtaGFyZHdhcmUgZGVwZW5kZW50IGFuZCBuZWVkcyB0byBiZSBleHRlbmRlZCBmb3IgZXZlcnkKKyAqIHR5cGUgb2YgbW9kdWxlIHdlIHdhbnQgdG8gc3VwcG9ydC4KKyAqLworc3RhdGljIGludCBnYl9pbnRlcmZhY2VfcmVhZF9hbmRfY2xlYXJfaW5pdF9zdGF0dXMoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkID0gaW50Zi0+aGQ7CisJdW5zaWduZWQgbG9uZyBib290cm9tX3F1aXJrczsKKwl1bnNpZ25lZCBsb25nIHMybF9xdWlya3M7CisJaW50IHJldDsKKwl1MzIgdmFsdWU7CisJdTE2IGF0dHI7CisJdTggaW5pdF9zdGF0dXM7CisKKwkvKgorCSAqIEVTMiBicmlkZ2VzIHVzZSBUX1RzdFNyY0luY3JlbWVudCBmb3IgdGhlIGluaXQgc3RhdHVzLgorCSAqCisJICogRklYTUU6IFJlbW92ZSBFUzIgc3VwcG9ydAorCSAqLworCWlmIChpbnRmLT5xdWlya3MgJiBHQl9JTlRFUkZBQ0VfUVVJUktfTk9fSU5JVF9TVEFUVVMpCisJCWF0dHIgPSBETUVfVF9UU1RfU1JDX0lOQ1JFTUVOVDsKKwllbHNlCisJCWF0dHIgPSBETUVfVE9TSElCQV9HTVBfSU5JVF9TVEFUVVM7CisKKwlyZXQgPSBnYl9zdmNfZG1lX3BlZXJfZ2V0KGhkLT5zdmMsIGludGYtPmludGVyZmFjZV9pZCwgYXR0ciwKKwkJCQkgIERNRV9TRUxFQ1RPUl9JTkRFWF9OVUxMLCAmdmFsdWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIEEgbm9uemVybyBpbml0IHN0YXR1cyBpbmRpY2F0ZXMgdGhlIG1vZHVsZSBoYXMgZmluaXNoZWQKKwkgKiBpbml0aWFsaXppbmcuCisJICovCisJaWYgKCF2YWx1ZSkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJpbnZhbGlkIGluaXQgc3RhdHVzXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyoKKwkgKiBFeHRyYWN0IHRoZSBpbml0IHN0YXR1cy4KKwkgKgorCSAqIEZvciBFUzI6IFdlIG5lZWQgdG8gY2hlY2sgbG93ZXN0IDggYml0cyBvZiAndmFsdWUnLgorCSAqIEZvciBFUzM6IFdlIG5lZWQgdG8gY2hlY2sgaGlnaGVzdCA4IGJpdHMgb3V0IG9mIDMyIG9mICd2YWx1ZScuCisJICoKKwkgKiBGSVhNRTogUmVtb3ZlIEVTMiBzdXBwb3J0CisJICovCisJaWYgKGludGYtPnF1aXJrcyAmIEdCX0lOVEVSRkFDRV9RVUlSS19OT19JTklUX1NUQVRVUykKKwkJaW5pdF9zdGF0dXMgPSB2YWx1ZSAmIDB4ZmY7CisJZWxzZQorCQlpbml0X3N0YXR1cyA9IHZhbHVlID4+IDI0OworCisJLyoKKwkgKiBDaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGV4ZWN1dGluZyB0aGUgcXVpcmt5IEVTMyBib290cm9tIHRoYXQsCisJICogZm9yIGV4YW1wbGUsIHJlcXVpcmVzIEUyRUZDLCBDU0QgYW5kIENTViB0byBiZSBkaXNhYmxlZC4KKwkgKi8KKwlib290cm9tX3F1aXJrcyA9IEdCX0lOVEVSRkFDRV9RVUlSS19OT19DUE9SVF9GRUFUVVJFUyB8CisJCQkJR0JfSU5URVJGQUNFX1FVSVJLX0ZPUkNFRF9ESVNBQkxFIHwKKwkJCQlHQl9JTlRFUkZBQ0VfUVVJUktfTEVHQUNZX01PREVfU1dJVENIIHwKKwkJCQlHQl9JTlRFUkZBQ0VfUVVJUktfTk9fQlVORExFX0FDVElWQVRFOworCisJczJsX3F1aXJrcyA9IEdCX0lOVEVSRkFDRV9RVUlSS19OT19QTTsKKworCXN3aXRjaCAoaW5pdF9zdGF0dXMpIHsKKwljYXNlIEdCX0lOSVRfQk9PVFJPTV9VTklQUk9fQk9PVF9TVEFSVEVEOgorCWNhc2UgR0JfSU5JVF9CT09UUk9NX0ZBTExCQUNLX1VOSVBST19CT09UX1NUQVJURUQ6CisJCWludGYtPnF1aXJrcyB8PSBib290cm9tX3F1aXJrczsKKwkJYnJlYWs7CisJY2FzZSBHQl9JTklUX1MyX0xPQURFUl9CT09UX1NUQVJURUQ6CisJCS8qIFMyIExvYWRlciBkb2Vzbid0IHN1cHBvcnQgcnVudGltZSBQTSAqLworCQlpbnRmLT5xdWlya3MgJj0gfmJvb3Ryb21fcXVpcmtzOworCQlpbnRmLT5xdWlya3MgfD0gczJsX3F1aXJrczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaW50Zi0+cXVpcmtzICY9IH5ib290cm9tX3F1aXJrczsKKwkJaW50Zi0+cXVpcmtzICY9IH5zMmxfcXVpcmtzOworCX0KKworCS8qIENsZWFyIHRoZSBpbml0IHN0YXR1cy4gKi8KKwlyZXR1cm4gZ2Jfc3ZjX2RtZV9wZWVyX3NldChoZC0+c3ZjLCBpbnRmLT5pbnRlcmZhY2VfaWQsIGF0dHIsCisJCQkJICAgRE1FX1NFTEVDVE9SX0lOREVYX05VTEwsIDApOworfQorCisvKiBpbnRlcmZhY2Ugc3lzZnMgYXR0cmlidXRlcyAqLworI2RlZmluZSBnYl9pbnRlcmZhY2VfYXR0cihmaWVsZCwgdHlwZSkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IGZpZWxkIyNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJCVwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJCVwKKwkJCSAgICBjaGFyICpidWYpCQkJCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYgPSB0b19nYl9pbnRlcmZhY2UoZGV2KTsJCVwKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCB0eXBlIlxuIiwgaW50Zi0+ZmllbGQpOwlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSX1JPKGZpZWxkKQorCitnYl9pbnRlcmZhY2VfYXR0cihkZGJsMV9tYW51ZmFjdHVyZXJfaWQsICIweCUwOHgiKTsKK2diX2ludGVyZmFjZV9hdHRyKGRkYmwxX3Byb2R1Y3RfaWQsICIweCUwOHgiKTsKK2diX2ludGVyZmFjZV9hdHRyKGludGVyZmFjZV9pZCwgIiV1Iik7CitnYl9pbnRlcmZhY2VfYXR0cih2ZW5kb3JfaWQsICIweCUwOHgiKTsKK2diX2ludGVyZmFjZV9hdHRyKHByb2R1Y3RfaWQsICIweCUwOHgiKTsKK2diX2ludGVyZmFjZV9hdHRyKHNlcmlhbF9udW1iZXIsICIweCUwMTZsbHgiKTsKKworc3RhdGljIHNzaXplX3Qgdm9sdGFnZV9ub3dfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmID0gdG9fZ2JfaW50ZXJmYWNlKGRldik7CisJaW50IHJldDsKKwl1MzIgbWVhc3VyZW1lbnQ7CisKKwlyZXQgPSBnYl9zdmNfcHdybW9uX2ludGZfc2FtcGxlX2dldChpbnRmLT5oZC0+c3ZjLCBpbnRmLT5pbnRlcmZhY2VfaWQsCisJCQkJCSAgICBHQl9TVkNfUFdSTU9OX1RZUEVfVk9MLAorCQkJCQkgICAgJm1lYXN1cmVtZW50KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgImZhaWxlZCB0byBnZXQgdm9sdGFnZSBzYW1wbGUgKCVkKVxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgbWVhc3VyZW1lbnQpOworfQorc3RhdGljIERFVklDRV9BVFRSX1JPKHZvbHRhZ2Vfbm93KTsKKworc3RhdGljIHNzaXplX3QgY3VycmVudF9ub3dfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmID0gdG9fZ2JfaW50ZXJmYWNlKGRldik7CisJaW50IHJldDsKKwl1MzIgbWVhc3VyZW1lbnQ7CisKKwlyZXQgPSBnYl9zdmNfcHdybW9uX2ludGZfc2FtcGxlX2dldChpbnRmLT5oZC0+c3ZjLCBpbnRmLT5pbnRlcmZhY2VfaWQsCisJCQkJCSAgICBHQl9TVkNfUFdSTU9OX1RZUEVfQ1VSUiwKKwkJCQkJICAgICZtZWFzdXJlbWVudCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJmYWlsZWQgdG8gZ2V0IGN1cnJlbnQgc2FtcGxlICglZClcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIG1lYXN1cmVtZW50KTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhjdXJyZW50X25vdyk7CisKK3N0YXRpYyBzc2l6ZV90IHBvd2VyX25vd19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZiA9IHRvX2diX2ludGVyZmFjZShkZXYpOworCWludCByZXQ7CisJdTMyIG1lYXN1cmVtZW50OworCisJcmV0ID0gZ2Jfc3ZjX3B3cm1vbl9pbnRmX3NhbXBsZV9nZXQoaW50Zi0+aGQtPnN2YywgaW50Zi0+aW50ZXJmYWNlX2lkLAorCQkJCQkgICAgR0JfU1ZDX1BXUk1PTl9UWVBFX1BXUiwKKwkJCQkJICAgICZtZWFzdXJlbWVudCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJmYWlsZWQgdG8gZ2V0IHBvd2VyIHNhbXBsZSAoJWQpXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBtZWFzdXJlbWVudCk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFJfUk8ocG93ZXJfbm93KTsKKworc3RhdGljIHNzaXplX3QgcG93ZXJfc3RhdGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmID0gdG9fZ2JfaW50ZXJmYWNlKGRldik7CisKKwlpZiAoaW50Zi0+YWN0aXZlKQorCQlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAib25cbiIpOworCWVsc2UKKwkJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIm9mZlxuIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBvd2VyX3N0YXRlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmID0gdG9fZ2JfaW50ZXJmYWNlKGRldik7CisJYm9vbCBhY3RpdmF0ZTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChrc3RydG9ib29sKGJ1ZiwgJmFjdGl2YXRlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZpbnRmLT5tdXRleCk7CisKKwlpZiAoYWN0aXZhdGUgPT0gaW50Zi0+YWN0aXZlKQorCQlnb3RvIHVubG9jazsKKworCWlmIChhY3RpdmF0ZSkgeworCQlyZXQgPSBnYl9pbnRlcmZhY2VfYWN0aXZhdGUoaW50Zik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCQkiZmFpbGVkIHRvIGFjdGl2YXRlIGludGVyZmFjZTogJWRcbiIsIHJldCk7CisJCQlnb3RvIHVubG9jazsKKwkJfQorCisJCXJldCA9IGdiX2ludGVyZmFjZV9lbmFibGUoaW50Zik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCQkiZmFpbGVkIHRvIGVuYWJsZSBpbnRlcmZhY2U6ICVkXG4iLCByZXQpOworCQkJZ2JfaW50ZXJmYWNlX2RlYWN0aXZhdGUoaW50Zik7CisJCQlnb3RvIHVubG9jazsKKwkJfQorCX0gZWxzZSB7CisJCWdiX2ludGVyZmFjZV9kaXNhYmxlKGludGYpOworCQlnYl9pbnRlcmZhY2VfZGVhY3RpdmF0ZShpbnRmKTsKKwl9CisKK3VubG9jazoKKwltdXRleF91bmxvY2soJmludGYtPm11dGV4KTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gbGVuOworfQorc3RhdGljIERFVklDRV9BVFRSX1JXKHBvd2VyX3N0YXRlKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmdiX2ludGVyZmFjZV90eXBlX3N0cmluZyhzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdHlwZXNbXSA9IHsKKwkJW0dCX0lOVEVSRkFDRV9UWVBFX0lOVkFMSURdID0gImludmFsaWQiLAorCQlbR0JfSU5URVJGQUNFX1RZUEVfVU5LTk9XTl0gPSAidW5rbm93biIsCisJCVtHQl9JTlRFUkZBQ0VfVFlQRV9EVU1NWV0gPSAiZHVtbXkiLAorCQlbR0JfSU5URVJGQUNFX1RZUEVfVU5JUFJPXSA9ICJ1bmlwcm8iLAorCQlbR0JfSU5URVJGQUNFX1RZUEVfR1JFWUJVU10gPSAiZ3JleWJ1cyIsCisJfTsKKworCXJldHVybiB0eXBlc1tpbnRmLT50eXBlXTsKK30KKworc3RhdGljIHNzaXplX3QgaW50ZXJmYWNlX3R5cGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmID0gdG9fZ2JfaW50ZXJmYWNlKGRldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgZ2JfaW50ZXJmYWNlX3R5cGVfc3RyaW5nKGludGYpKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhpbnRlcmZhY2VfdHlwZSk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICppbnRlcmZhY2VfdW5pcHJvX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2RkYmwxX21hbnVmYWN0dXJlcl9pZC5hdHRyLAorCSZkZXZfYXR0cl9kZGJsMV9wcm9kdWN0X2lkLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmludGVyZmFjZV9ncmV5YnVzX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX3ZlbmRvcl9pZC5hdHRyLAorCSZkZXZfYXR0cl9wcm9kdWN0X2lkLmF0dHIsCisJJmRldl9hdHRyX3NlcmlhbF9udW1iZXIuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaW50ZXJmYWNlX3Bvd2VyX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX3ZvbHRhZ2Vfbm93LmF0dHIsCisJJmRldl9hdHRyX2N1cnJlbnRfbm93LmF0dHIsCisJJmRldl9hdHRyX3Bvd2VyX25vdy5hdHRyLAorCSZkZXZfYXR0cl9wb3dlcl9zdGF0ZS5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICppbnRlcmZhY2VfY29tbW9uX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2ludGVyZmFjZV9pZC5hdHRyLAorCSZkZXZfYXR0cl9pbnRlcmZhY2VfdHlwZS5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyB1bW9kZV90IGludGVyZmFjZV91bmlwcm9faXNfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkJCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGludCBuKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmID0gdG9fZ2JfaW50ZXJmYWNlKGRldik7CisKKwlzd2l0Y2ggKGludGYtPnR5cGUpIHsKKwljYXNlIEdCX0lOVEVSRkFDRV9UWVBFX1VOSVBSTzoKKwljYXNlIEdCX0lOVEVSRkFDRV9UWVBFX0dSRVlCVVM6CisJCXJldHVybiBhdHRyLT5tb2RlOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIHVtb2RlX3QgaW50ZXJmYWNlX2dyZXlidXNfaXNfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkJCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGludCBuKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmID0gdG9fZ2JfaW50ZXJmYWNlKGRldik7CisKKwlzd2l0Y2ggKGludGYtPnR5cGUpIHsKKwljYXNlIEdCX0lOVEVSRkFDRV9UWVBFX0dSRVlCVVM6CisJCXJldHVybiBhdHRyLT5tb2RlOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIHVtb2RlX3QgaW50ZXJmYWNlX3Bvd2VyX2lzX3Zpc2libGUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJCQlzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBpbnQgbikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZiA9IHRvX2diX2ludGVyZmFjZShkZXYpOworCisJc3dpdGNoIChpbnRmLT50eXBlKSB7CisJY2FzZSBHQl9JTlRFUkZBQ0VfVFlQRV9VTklQUk86CisJY2FzZSBHQl9JTlRFUkZBQ0VfVFlQRV9HUkVZQlVTOgorCQlyZXR1cm4gYXR0ci0+bW9kZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGludGVyZmFjZV91bmlwcm9fZ3JvdXAgPSB7CisJLmlzX3Zpc2libGUJPSBpbnRlcmZhY2VfdW5pcHJvX2lzX3Zpc2libGUsCisJLmF0dHJzCQk9IGludGVyZmFjZV91bmlwcm9fYXR0cnMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpbnRlcmZhY2VfZ3JleWJ1c19ncm91cCA9IHsKKwkuaXNfdmlzaWJsZQk9IGludGVyZmFjZV9ncmV5YnVzX2lzX3Zpc2libGUsCisJLmF0dHJzCQk9IGludGVyZmFjZV9ncmV5YnVzX2F0dHJzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaW50ZXJmYWNlX3Bvd2VyX2dyb3VwID0geworCS5pc192aXNpYmxlCT0gaW50ZXJmYWNlX3Bvd2VyX2lzX3Zpc2libGUsCisJLmF0dHJzCQk9IGludGVyZmFjZV9wb3dlcl9hdHRycywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGludGVyZmFjZV9jb21tb25fZ3JvdXAgPSB7CisJLmF0dHJzCQk9IGludGVyZmFjZV9jb21tb25fYXR0cnMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqaW50ZXJmYWNlX2dyb3Vwc1tdID0geworCSZpbnRlcmZhY2VfdW5pcHJvX2dyb3VwLAorCSZpbnRlcmZhY2VfZ3JleWJ1c19ncm91cCwKKwkmaW50ZXJmYWNlX3Bvd2VyX2dyb3VwLAorCSZpbnRlcmZhY2VfY29tbW9uX2dyb3VwLAorCU5VTEwKK307CisKK3N0YXRpYyB2b2lkIGdiX2ludGVyZmFjZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmID0gdG9fZ2JfaW50ZXJmYWNlKGRldik7CisKKwl0cmFjZV9nYl9pbnRlcmZhY2VfcmVsZWFzZShpbnRmKTsKKworCWtmcmVlKGludGYpOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGdiX2ludGVyZmFjZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmID0gdG9fZ2JfaW50ZXJmYWNlKGRldik7CisJaW50IHJldCwgdGltZXN5bmNfcmV0OworCisJcmV0ID0gZ2JfY29udHJvbF9pbnRlcmZhY2Vfc3VzcGVuZF9wcmVwYXJlKGludGYtPmNvbnRyb2wpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlnYl90aW1lc3luY19pbnRlcmZhY2VfcmVtb3ZlKGludGYpOworCisJcmV0ID0gZ2JfY29udHJvbF9zdXNwZW5kKGludGYtPmNvbnRyb2wpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2hpYmVybmF0ZV9hYm9ydDsKKworCXJldCA9IGdiX2ludGVyZmFjZV9oaWJlcm5hdGVfbGluayhpbnRmKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogRGVsYXkgdG8gYWxsb3cgaW50ZXJmYWNlIHRvIGVudGVyIHN0YW5kYnkgYmVmb3JlIGRpc2FibGluZyByZWZjbGsgKi8KKwltc2xlZXAoR0JfSU5URVJGQUNFX1NVU1BFTkRfSElCRVJOQVRFX0RFTEFZX01TKTsKKworCXJldCA9IGdiX2ludGVyZmFjZV9yZWZjbGtfc2V0KGludGYsIGZhbHNlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7CisKK2Vycl9oaWJlcm5hdGVfYWJvcnQ6CisJZ2JfY29udHJvbF9pbnRlcmZhY2VfaGliZXJuYXRlX2Fib3J0KGludGYtPmNvbnRyb2wpOworCisJdGltZXN5bmNfcmV0ID0gZ2JfdGltZXN5bmNfaW50ZXJmYWNlX2FkZChpbnRmKTsKKwlpZiAodGltZXN5bmNfcmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGFkZCB0byB0aW1lc3luYzogJWRcbiIsIHRpbWVzeW5jX3JldCk7CisJCXJldHVybiB0aW1lc3luY19yZXQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9pbnRlcmZhY2VfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmID0gdG9fZ2JfaW50ZXJmYWNlKGRldik7CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gaW50Zi0+aGQtPnN2YzsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2JfaW50ZXJmYWNlX3JlZmNsa19zZXQoaW50ZiwgdHJ1ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGdiX3N2Y19pbnRmX3Jlc3VtZShzdmMsIGludGYtPmludGVyZmFjZV9pZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGdiX2NvbnRyb2xfcmVzdW1lKGludGYtPmNvbnRyb2wpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBnYl90aW1lc3luY19pbnRlcmZhY2VfYWRkKGludGYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gYWRkIHRvIHRpbWVzeW5jOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBnYl90aW1lc3luY19zY2hlZHVsZV9zeW5jaHJvbm91cyhpbnRmKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHN5bmNocm9uaXplIEZyYW1lVGltZTogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JfaW50ZXJmYWNlX3J1bnRpbWVfaWRsZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShkZXYpOworCXBtX3JlcXVlc3RfYXV0b3N1c3BlbmQoZGV2KTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBnYl9pbnRlcmZhY2VfcG1fb3BzID0geworCVNFVF9SVU5USU1FX1BNX09QUyhnYl9pbnRlcmZhY2Vfc3VzcGVuZCwgZ2JfaW50ZXJmYWNlX3Jlc3VtZSwKKwkJCSAgIGdiX2ludGVyZmFjZV9ydW50aW1lX2lkbGUpCit9OworCitzdHJ1Y3QgZGV2aWNlX3R5cGUgZ3JleWJ1c19pbnRlcmZhY2VfdHlwZSA9IHsKKwkubmFtZSA9CQkiZ3JleWJ1c19pbnRlcmZhY2UiLAorCS5yZWxlYXNlID0JZ2JfaW50ZXJmYWNlX3JlbGVhc2UsCisJLnBtID0JCSZnYl9pbnRlcmZhY2VfcG1fb3BzLAorfTsKKworLyoKKyAqIEEgR3JleWJ1cyBtb2R1bGUgcmVwcmVzZW50cyBhIHVzZXItcmVwbGFjZWFibGUgY29tcG9uZW50IG9uIGEgR01QCisgKiBwaG9uZS4gIEFuIGludGVyZmFjZSBpcyB0aGUgcGh5c2ljYWwgY29ubmVjdGlvbiBvbiB0aGF0IG1vZHVsZS4gIEEKKyAqIG1vZHVsZSBtYXkgaGF2ZSBtb3JlIHRoYW4gb25lIGludGVyZmFjZS4KKyAqCisgKiBDcmVhdGUgYSBnYl9pbnRlcmZhY2Ugc3RydWN0dXJlIHRvIHJlcHJlc2VudCBhIGRpc2NvdmVyZWQgaW50ZXJmYWNlLgorICogVGhlIHBvc2l0aW9uIG9mIGludGVyZmFjZSB3aXRoaW4gdGhlIEVuZG8gaXMgZW5jb2RlZCBpbiAiaW50ZXJmYWNlX2lkIgorICogYXJndW1lbnQuCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG5ldyBpbnRlcmZjZSBvciBhIG51bGwgcG9pbnRlciBpZiBhCisgKiBmYWlsdXJlIG9jY3VycyBkdWUgdG8gbWVtb3J5IGV4aGF1c3Rpb24uCisgKi8KK3N0cnVjdCBnYl9pbnRlcmZhY2UgKmdiX2ludGVyZmFjZV9jcmVhdGUoc3RydWN0IGdiX21vZHVsZSAqbW9kdWxlLAorCQkJCQkgdTggaW50ZXJmYWNlX2lkKQoreworCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQgPSBtb2R1bGUtPmhkOworCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGY7CisKKwlpbnRmID0ga3phbGxvYyhzaXplb2YoKmludGYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWludGYpCisJCXJldHVybiBOVUxMOworCisJaW50Zi0+aGQgPSBoZDsJCS8qIFhYWCByZWZjb3VudD8gKi8KKwlpbnRmLT5tb2R1bGUgPSBtb2R1bGU7CisJaW50Zi0+aW50ZXJmYWNlX2lkID0gaW50ZXJmYWNlX2lkOworCUlOSVRfTElTVF9IRUFEKCZpbnRmLT5idW5kbGVzKTsKKwlJTklUX0xJU1RfSEVBRCgmaW50Zi0+bWFuaWZlc3RfZGVzY3MpOworCW11dGV4X2luaXQoJmludGYtPm11dGV4KTsKKwlJTklUX1dPUksoJmludGYtPm1vZGVfc3dpdGNoX3dvcmssIGdiX2ludGVyZmFjZV9tb2RlX3N3aXRjaF93b3JrKTsKKwlpbml0X2NvbXBsZXRpb24oJmludGYtPm1vZGVfc3dpdGNoX2NvbXBsZXRpb24pOworCisJLyogSW52YWxpZCBkZXZpY2UgaWQgdG8gc3RhcnQgd2l0aCAqLworCWludGYtPmRldmljZV9pZCA9IEdCX0lOVEVSRkFDRV9ERVZJQ0VfSURfQkFEOworCisJaW50Zi0+ZGV2LnBhcmVudCA9ICZtb2R1bGUtPmRldjsKKwlpbnRmLT5kZXYuYnVzID0gJmdyZXlidXNfYnVzX3R5cGU7CisJaW50Zi0+ZGV2LnR5cGUgPSAmZ3JleWJ1c19pbnRlcmZhY2VfdHlwZTsKKwlpbnRmLT5kZXYuZ3JvdXBzID0gaW50ZXJmYWNlX2dyb3VwczsKKwlpbnRmLT5kZXYuZG1hX21hc2sgPSBtb2R1bGUtPmRldi5kbWFfbWFzazsKKwlkZXZpY2VfaW5pdGlhbGl6ZSgmaW50Zi0+ZGV2KTsKKwlkZXZfc2V0X25hbWUoJmludGYtPmRldiwgIiVzLiV1IiwgZGV2X25hbWUoJm1vZHVsZS0+ZGV2KSwKKwkJCWludGVyZmFjZV9pZCk7CisKKwlwbV9ydW50aW1lX3NldF9hdXRvc3VzcGVuZF9kZWxheSgmaW50Zi0+ZGV2LAorCQkJCQkgR0JfSU5URVJGQUNFX0FVVE9TVVNQRU5EX01TKTsKKworCXRyYWNlX2diX2ludGVyZmFjZV9jcmVhdGUoaW50Zik7CisKKwlyZXR1cm4gaW50ZjsKK30KKworc3RhdGljIGludCBnYl9pbnRlcmZhY2VfdnN5c19zZXQoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZiwgYm9vbCBlbmFibGUpCit7CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gaW50Zi0+aGQtPnN2YzsKKwlpbnQgcmV0OworCisJZGV2X2RiZygmaW50Zi0+ZGV2LCAiJXMgLSAlZFxuIiwgX19mdW5jX18sIGVuYWJsZSk7CisKKwlyZXQgPSBnYl9zdmNfaW50Zl92c3lzX3NldChzdmMsIGludGYtPmludGVyZmFjZV9pZCwgZW5hYmxlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgImZhaWxlZCB0byBzZXQgdl9zeXM6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX2ludGVyZmFjZV9yZWZjbGtfc2V0KHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYsIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBnYl9zdmMgKnN2YyA9IGludGYtPmhkLT5zdmM7CisJaW50IHJldDsKKworCWRldl9kYmcoJmludGYtPmRldiwgIiVzIC0gJWRcbiIsIF9fZnVuY19fLCBlbmFibGUpOworCisJcmV0ID0gZ2Jfc3ZjX2ludGZfcmVmY2xrX3NldChzdmMsIGludGYtPmludGVyZmFjZV9pZCwgZW5hYmxlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgImZhaWxlZCB0byBzZXQgcmVmY2xrOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9pbnRlcmZhY2VfdW5pcHJvX3NldChzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmLCBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSBpbnRmLT5oZC0+c3ZjOworCWludCByZXQ7CisKKwlkZXZfZGJnKCZpbnRmLT5kZXYsICIlcyAtICVkXG4iLCBfX2Z1bmNfXywgZW5hYmxlKTsKKworCXJldCA9IGdiX3N2Y19pbnRmX3VuaXByb19zZXQoc3ZjLCBpbnRmLT5pbnRlcmZhY2VfaWQsIGVuYWJsZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJmYWlsZWQgdG8gc2V0IFVuaVBybzogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JfaW50ZXJmYWNlX2FjdGl2YXRlX29wZXJhdGlvbihzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmLAorCQkJCQkgICBlbnVtIGdiX2ludGVyZmFjZV90eXBlICppbnRmX3R5cGUpCit7CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gaW50Zi0+aGQtPnN2YzsKKwl1OCB0eXBlOworCWludCByZXQ7CisKKwlkZXZfZGJnKCZpbnRmLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCisJcmV0ID0gZ2Jfc3ZjX2ludGZfYWN0aXZhdGUoc3ZjLCBpbnRmLT5pbnRlcmZhY2VfaWQsICZ0eXBlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgImZhaWxlZCB0byBhY3RpdmF0ZTogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBHQl9TVkNfSU5URl9UWVBFX0RVTU1ZOgorCQkqaW50Zl90eXBlID0gR0JfSU5URVJGQUNFX1RZUEVfRFVNTVk7CisJCS8qIEZJWE1FOiBoYW5kbGUgYXMgYW4gZXJyb3IgZm9yIG5vdyAqLworCQlyZXR1cm4gLUVOT0RFVjsKKwljYXNlIEdCX1NWQ19JTlRGX1RZUEVfVU5JUFJPOgorCQkqaW50Zl90eXBlID0gR0JfSU5URVJGQUNFX1RZUEVfVU5JUFJPOworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJpbnRlcmZhY2UgdHlwZSBVbmlQcm8gbm90IHN1cHBvcnRlZFxuIik7CisJCS8qIEZJWE1FOiBoYW5kbGUgYXMgYW4gZXJyb3IgZm9yIG5vdyAqLworCQlyZXR1cm4gLUVOT0RFVjsKKwljYXNlIEdCX1NWQ19JTlRGX1RZUEVfR1JFWUJVUzoKKwkJKmludGZfdHlwZSA9IEdCX0lOVEVSRkFDRV9UWVBFX0dSRVlCVVM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJmludGYtPmRldiwgInVua25vd24gaW50ZXJmYWNlIHR5cGU6ICV1XG4iLCB0eXBlKTsKKwkJKmludGZfdHlwZSA9IEdCX0lOVEVSRkFDRV9UWVBFX1VOS05PV047CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX2ludGVyZmFjZV9oaWJlcm5hdGVfbGluayhzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBnYl9zdmMgKnN2YyA9IGludGYtPmhkLT5zdmM7CisKKwlyZXR1cm4gZ2Jfc3ZjX2ludGZfc2V0X3Bvd2VyX21vZGVfaGliZXJuYXRlKHN2YywgaW50Zi0+aW50ZXJmYWNlX2lkKTsKK30KKworc3RhdGljIGludCBfZ2JfaW50ZXJmYWNlX2FjdGl2YXRlKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYsCisJCQkJICBlbnVtIGdiX2ludGVyZmFjZV90eXBlICp0eXBlKQoreworCWludCByZXQ7CisKKwkqdHlwZSA9IEdCX0lOVEVSRkFDRV9UWVBFX1VOS05PV047CisKKwlpZiAoaW50Zi0+ZWplY3RlZCB8fCBpbnRmLT5yZW1vdmVkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldCA9IGdiX2ludGVyZmFjZV92c3lzX3NldChpbnRmLCB0cnVlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZ2JfaW50ZXJmYWNlX3JlZmNsa19zZXQoaW50ZiwgdHJ1ZSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfdnN5c19kaXNhYmxlOworCisJcmV0ID0gZ2JfaW50ZXJmYWNlX3VuaXByb19zZXQoaW50ZiwgdHJ1ZSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcmVmY2xrX2Rpc2FibGU7CisKKwlyZXQgPSBnYl9pbnRlcmZhY2VfYWN0aXZhdGVfb3BlcmF0aW9uKGludGYsIHR5cGUpOworCWlmIChyZXQpIHsKKwkJc3dpdGNoICgqdHlwZSkgeworCQljYXNlIEdCX0lOVEVSRkFDRV9UWVBFX1VOSVBSTzoKKwkJY2FzZSBHQl9JTlRFUkZBQ0VfVFlQRV9HUkVZQlVTOgorCQkJZ290byBlcnJfaGliZXJuYXRlX2xpbms7CisJCWRlZmF1bHQ6CisJCQlnb3RvIGVycl91bmlwcm9fZGlzYWJsZTsKKwkJfQorCX0KKworCXJldCA9IGdiX2ludGVyZmFjZV9yZWFkX2RtZShpbnRmKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9oaWJlcm5hdGVfbGluazsKKworCXJldCA9IGdiX2ludGVyZmFjZV9yb3V0ZV9jcmVhdGUoaW50Zik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfaGliZXJuYXRlX2xpbms7CisKKwlpbnRmLT5hY3RpdmUgPSB0cnVlOworCisJdHJhY2VfZ2JfaW50ZXJmYWNlX2FjdGl2YXRlKGludGYpOworCisJcmV0dXJuIDA7CisKK2Vycl9oaWJlcm5hdGVfbGluazoKKwlnYl9pbnRlcmZhY2VfaGliZXJuYXRlX2xpbmsoaW50Zik7CitlcnJfdW5pcHJvX2Rpc2FibGU6CisJZ2JfaW50ZXJmYWNlX3VuaXByb19zZXQoaW50ZiwgZmFsc2UpOworZXJyX3JlZmNsa19kaXNhYmxlOgorCWdiX2ludGVyZmFjZV9yZWZjbGtfc2V0KGludGYsIGZhbHNlKTsKK2Vycl92c3lzX2Rpc2FibGU6CisJZ2JfaW50ZXJmYWNlX3ZzeXNfc2V0KGludGYsIGZhbHNlKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBBdCBwcmVzZW50LCB3ZSBhc3N1bWUgYSBVbmlQcm8tb25seSBtb2R1bGUgdG8gYmUgYSBHcmV5YnVzIG1vZHVsZSB0aGF0CisgKiBmYWlsZWQgdG8gc2VuZCBpdHMgbWFpbGJveCBwb2tlLiBUaGVyZSBpcyBzb21lIHJlYXNvbiB0byBiZWxpZXZlIHRoYXQgdGhpcworICogaXMgYmVjYXVzZSBvZiBhIGJ1ZyBpbiB0aGUgRVMzIGJvb3Ryb20uCisgKgorICogRklYTUU6IENoZWNrIGlmIHRoaXMgaXMgYSBUb3NoaWJhIGJyaWRnZSBiZWZvcmUgcmV0cnlpbmc/CisgKi8KK3N0YXRpYyBpbnQgX2diX2ludGVyZmFjZV9hY3RpdmF0ZV9lczNfaGFjayhzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmLAorCQkJCQkgICBlbnVtIGdiX2ludGVyZmFjZV90eXBlICp0eXBlKQoreworCWludCByZXRyaWVzID0gMzsKKwlpbnQgcmV0OworCisJd2hpbGUgKHJldHJpZXMtLSkgeworCQlyZXQgPSBfZ2JfaW50ZXJmYWNlX2FjdGl2YXRlKGludGYsIHR5cGUpOworCQlpZiAocmV0ID09IC1FTk9ERVYgJiYgKnR5cGUgPT0gR0JfSU5URVJGQUNFX1RZUEVfVU5JUFJPKQorCQkJY29udGludWU7CisKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEFjdGl2YXRlIGFuIGludGVyZmFjZS4KKyAqCisgKiBMb2NraW5nOiBDYWxsZXIgaG9sZHMgdGhlIGludGVyZmFjZSBtdXRleC4KKyAqLworaW50IGdiX2ludGVyZmFjZV9hY3RpdmF0ZShzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKQoreworCWVudW0gZ2JfaW50ZXJmYWNlX3R5cGUgdHlwZTsKKwlpbnQgcmV0OworCisJc3dpdGNoIChpbnRmLT50eXBlKSB7CisJY2FzZSBHQl9JTlRFUkZBQ0VfVFlQRV9JTlZBTElEOgorCWNhc2UgR0JfSU5URVJGQUNFX1RZUEVfR1JFWUJVUzoKKwkJcmV0ID0gX2diX2ludGVyZmFjZV9hY3RpdmF0ZV9lczNfaGFjayhpbnRmLCAmdHlwZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IF9nYl9pbnRlcmZhY2VfYWN0aXZhdGUoaW50ZiwgJnR5cGUpOworCX0KKworCS8qIE1ha2Ugc3VyZSB0eXBlIGlzIGRldGVjdGVkIGNvcnJlY3RseSBkdXJpbmcgcmVhY3RpdmF0aW9uLiAqLworCWlmIChpbnRmLT50eXBlICE9IEdCX0lOVEVSRkFDRV9UWVBFX0lOVkFMSUQpIHsKKwkJaWYgKHR5cGUgIT0gaW50Zi0+dHlwZSkgeworCQkJZGV2X2VycigmaW50Zi0+ZGV2LCAiZmFpbGVkIHRvIGRldGVjdCBpbnRlcmZhY2UgdHlwZVxuIik7CisKKwkJCWlmICghcmV0KQorCQkJCWdiX2ludGVyZmFjZV9kZWFjdGl2YXRlKGludGYpOworCisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0gZWxzZSB7CisJCWludGYtPnR5cGUgPSB0eXBlOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBEZWFjdGl2YXRlIGFuIGludGVyZmFjZS4KKyAqCisgKiBMb2NraW5nOiBDYWxsZXIgaG9sZHMgdGhlIGludGVyZmFjZSBtdXRleC4KKyAqLwordm9pZCBnYl9pbnRlcmZhY2VfZGVhY3RpdmF0ZShzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKQoreworCWlmICghaW50Zi0+YWN0aXZlKQorCQlyZXR1cm47CisKKwl0cmFjZV9nYl9pbnRlcmZhY2VfZGVhY3RpdmF0ZShpbnRmKTsKKworCS8qIEFib3J0IGFueSBvbmdvaW5nIG1vZGUgc3dpdGNoLiAqLworCWlmIChpbnRmLT5tb2RlX3N3aXRjaCkKKwkJY29tcGxldGUoJmludGYtPm1vZGVfc3dpdGNoX2NvbXBsZXRpb24pOworCisJZ2JfaW50ZXJmYWNlX3JvdXRlX2Rlc3Ryb3koaW50Zik7CisJZ2JfaW50ZXJmYWNlX2hpYmVybmF0ZV9saW5rKGludGYpOworCWdiX2ludGVyZmFjZV91bmlwcm9fc2V0KGludGYsIGZhbHNlKTsKKwlnYl9pbnRlcmZhY2VfcmVmY2xrX3NldChpbnRmLCBmYWxzZSk7CisJZ2JfaW50ZXJmYWNlX3ZzeXNfc2V0KGludGYsIGZhbHNlKTsKKworCWludGYtPmFjdGl2ZSA9IGZhbHNlOworfQorCisvKgorICogRW5hYmxlIGFuIGludGVyZmFjZSBieSBlbmFibGluZyBpdHMgY29udHJvbCBjb25uZWN0aW9uLCBmZXRjaGluZyB0aGUKKyAqIG1hbmlmZXN0IGFuZCBvdGhlciBpbmZvcm1hdGlvbiBvdmVyIGl0LCBhbmQgZmluYWxseSByZWdpc3RlcmluZyBpdHMgY2hpbGQKKyAqIGRldmljZXMuCisgKgorICogTG9ja2luZzogQ2FsbGVyIGhvbGRzIHRoZSBpbnRlcmZhY2UgbXV0ZXguCisgKi8KK2ludCBnYl9pbnRlcmZhY2VfZW5hYmxlKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2w7CisJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlLCAqdG1wOworCWludCByZXQsIHNpemU7CisJdm9pZCAqbWFuaWZlc3Q7CisKKwlyZXQgPSBnYl9pbnRlcmZhY2VfcmVhZF9hbmRfY2xlYXJfaW5pdF9zdGF0dXMoaW50Zik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJmYWlsZWQgdG8gY2xlYXIgaW5pdCBzdGF0dXM6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIEVzdGFibGlzaCBjb250cm9sIGNvbm5lY3Rpb24gKi8KKwljb250cm9sID0gZ2JfY29udHJvbF9jcmVhdGUoaW50Zik7CisJaWYgKElTX0VSUihjb250cm9sKSkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIGNvbnRyb2wgZGV2aWNlOiAlbGRcbiIsCisJCQkJUFRSX0VSUihjb250cm9sKSk7CisJCXJldHVybiBQVFJfRVJSKGNvbnRyb2wpOworCX0KKwlpbnRmLT5jb250cm9sID0gY29udHJvbDsKKworCXJldCA9IGdiX2NvbnRyb2xfZW5hYmxlKGludGYtPmNvbnRyb2wpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3B1dF9jb250cm9sOworCisJLyogR2V0IG1hbmlmZXN0IHNpemUgdXNpbmcgY29udHJvbCBwcm90b2NvbCBvbiBDUG9ydCAqLworCXNpemUgPSBnYl9jb250cm9sX2dldF9tYW5pZmVzdF9zaXplX29wZXJhdGlvbihpbnRmKTsKKwlpZiAoc2l6ZSA8PSAwKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgImZhaWxlZCB0byBnZXQgbWFuaWZlc3Qgc2l6ZTogJWRcbiIsIHNpemUpOworCisJCWlmIChzaXplKQorCQkJcmV0ID0gc2l6ZTsKKwkJZWxzZQorCQkJcmV0ID0gIC1FSU5WQUw7CisKKwkJZ290byBlcnJfZGlzYWJsZV9jb250cm9sOworCX0KKworCW1hbmlmZXN0ID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1hbmlmZXN0KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2Rpc2FibGVfY29udHJvbDsKKwl9CisKKwkvKiBHZXQgbWFuaWZlc3QgdXNpbmcgY29udHJvbCBwcm90b2NvbCBvbiBDUG9ydCAqLworCXJldCA9IGdiX2NvbnRyb2xfZ2V0X21hbmlmZXN0X29wZXJhdGlvbihpbnRmLCBtYW5pZmVzdCwgc2l6ZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJmYWlsZWQgdG8gZ2V0IG1hbmlmZXN0OiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfZnJlZV9tYW5pZmVzdDsKKwl9CisKKwkvKgorCSAqIFBhcnNlIHRoZSBtYW5pZmVzdCBhbmQgYnVpbGQgdXAgb3VyIGRhdGEgc3RydWN0dXJlcyByZXByZXNlbnRpbmcKKwkgKiB3aGF0J3MgaW4gaXQuCisJICovCisJaWYgKCFnYl9tYW5pZmVzdF9wYXJzZShpbnRmLCBtYW5pZmVzdCwgc2l6ZSkpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiZmFpbGVkIHRvIHBhcnNlIG1hbmlmZXN0XG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfZGVzdHJveV9idW5kbGVzOworCX0KKworCXJldCA9IGdiX2NvbnRyb2xfZ2V0X2J1bmRsZV92ZXJzaW9ucyhpbnRmLT5jb250cm9sKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9kZXN0cm95X2J1bmRsZXM7CisKKwlyZXQgPSBnYl90aW1lc3luY19pbnRlcmZhY2VfYWRkKGludGYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiZmFpbGVkIHRvIGFkZCB0byB0aW1lc3luYzogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX2Rlc3Ryb3lfYnVuZGxlczsKKwl9CisKKwkvKiBSZWdpc3RlciB0aGUgY29udHJvbCBkZXZpY2UgYW5kIGFueSBidW5kbGVzICovCisJcmV0ID0gZ2JfY29udHJvbF9hZGQoaW50Zi0+Y29udHJvbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcmVtb3ZlX3RpbWVzeW5jOworCisJcG1fcnVudGltZV91c2VfYXV0b3N1c3BlbmQoJmludGYtPmRldik7CisJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoJmludGYtPmRldik7CisJcG1fcnVudGltZV9zZXRfYWN0aXZlKCZpbnRmLT5kZXYpOworCXBtX3J1bnRpbWVfZW5hYmxlKCZpbnRmLT5kZXYpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UoYnVuZGxlLCB0bXAsICZpbnRmLT5idW5kbGVzLCBsaW5rcykgeworCQlyZXQgPSBnYl9idW5kbGVfYWRkKGJ1bmRsZSk7CisJCWlmIChyZXQpIHsKKwkJCWdiX2J1bmRsZV9kZXN0cm95KGJ1bmRsZSk7CisJCQljb250aW51ZTsKKwkJfQorCX0KKworCWtmcmVlKG1hbmlmZXN0KTsKKworCWludGYtPmVuYWJsZWQgPSB0cnVlOworCisJcG1fcnVudGltZV9wdXQoJmludGYtPmRldik7CisKKwl0cmFjZV9nYl9pbnRlcmZhY2VfZW5hYmxlKGludGYpOworCisJcmV0dXJuIDA7CisKK2Vycl9yZW1vdmVfdGltZXN5bmM6CisJZ2JfdGltZXN5bmNfaW50ZXJmYWNlX3JlbW92ZShpbnRmKTsKK2Vycl9kZXN0cm95X2J1bmRsZXM6CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJ1bmRsZSwgdG1wLCAmaW50Zi0+YnVuZGxlcywgbGlua3MpCisJCWdiX2J1bmRsZV9kZXN0cm95KGJ1bmRsZSk7CitlcnJfZnJlZV9tYW5pZmVzdDoKKwlrZnJlZShtYW5pZmVzdCk7CitlcnJfZGlzYWJsZV9jb250cm9sOgorCWdiX2NvbnRyb2xfZGlzYWJsZShpbnRmLT5jb250cm9sKTsKK2Vycl9wdXRfY29udHJvbDoKKwlnYl9jb250cm9sX3B1dChpbnRmLT5jb250cm9sKTsKKwlpbnRmLT5jb250cm9sID0gTlVMTDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBEaXNhYmxlIGFuIGludGVyZmFjZSBhbmQgZGVzdHJveSBpdHMgYnVuZGxlcy4KKyAqCisgKiBMb2NraW5nOiBDYWxsZXIgaG9sZHMgdGhlIGludGVyZmFjZSBtdXRleC4KKyAqLwordm9pZCBnYl9pbnRlcmZhY2VfZGlzYWJsZShzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZTsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpuZXh0OworCisJaWYgKCFpbnRmLT5lbmFibGVkKQorCQlyZXR1cm47CisKKwl0cmFjZV9nYl9pbnRlcmZhY2VfZGlzYWJsZShpbnRmKTsKKworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJmludGYtPmRldik7CisKKwkvKiBTZXQgZGlzY29ubmVjdGVkIGZsYWcgdG8gYXZvaWQgSS9PIGR1cmluZyBjb25uZWN0aW9uIHRlYXIgZG93bi4gKi8KKwlpZiAoaW50Zi0+cXVpcmtzICYgR0JfSU5URVJGQUNFX1FVSVJLX0ZPUkNFRF9ESVNBQkxFKQorCQlpbnRmLT5kaXNjb25uZWN0ZWQgPSB0cnVlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJ1bmRsZSwgbmV4dCwgJmludGYtPmJ1bmRsZXMsIGxpbmtzKQorCQlnYl9idW5kbGVfZGVzdHJveShidW5kbGUpOworCisJaWYgKCFpbnRmLT5tb2RlX3N3aXRjaCAmJiAhaW50Zi0+ZGlzY29ubmVjdGVkKQorCQlnYl9jb250cm9sX2ludGVyZmFjZV9kZWFjdGl2YXRlX3ByZXBhcmUoaW50Zi0+Y29udHJvbCk7CisKKwlnYl9jb250cm9sX2RlbChpbnRmLT5jb250cm9sKTsKKwlnYl90aW1lc3luY19pbnRlcmZhY2VfcmVtb3ZlKGludGYpOworCWdiX2NvbnRyb2xfZGlzYWJsZShpbnRmLT5jb250cm9sKTsKKwlnYl9jb250cm9sX3B1dChpbnRmLT5jb250cm9sKTsKKwlpbnRmLT5jb250cm9sID0gTlVMTDsKKworCWludGYtPmVuYWJsZWQgPSBmYWxzZTsKKworCXBtX3J1bnRpbWVfZGlzYWJsZSgmaW50Zi0+ZGV2KTsKKwlwbV9ydW50aW1lX3NldF9zdXNwZW5kZWQoJmludGYtPmRldik7CisJcG1fcnVudGltZV9kb250X3VzZV9hdXRvc3VzcGVuZCgmaW50Zi0+ZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9ub2lkbGUoJmludGYtPmRldik7Cit9CisKKy8qIEVuYWJsZSBUaW1lU3luYyBvbiBhbiBJbnRlcmZhY2UgY29udHJvbCBjb25uZWN0aW9uLiAqLworaW50IGdiX2ludGVyZmFjZV90aW1lc3luY19lbmFibGUoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZiwgdTggY291bnQsCisJCQkJIHU2NCBmcmFtZV90aW1lLCB1MzIgc3Ryb2JlX2RlbGF5LCB1MzIgcmVmY2xrKQoreworCXJldHVybiBnYl9jb250cm9sX3RpbWVzeW5jX2VuYWJsZShpbnRmLT5jb250cm9sLCBjb3VudCwKKwkJCQkJICBmcmFtZV90aW1lLCBzdHJvYmVfZGVsYXksCisJCQkJCSAgcmVmY2xrKTsKK30KKworLyogRGlzYWJsZSBUaW1lU3luYyBvbiBhbiBJbnRlcmZhY2UgY29udHJvbCBjb25uZWN0aW9uLiAqLworaW50IGdiX2ludGVyZmFjZV90aW1lc3luY19kaXNhYmxlKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYpCit7CisJcmV0dXJuIGdiX2NvbnRyb2xfdGltZXN5bmNfZGlzYWJsZShpbnRmLT5jb250cm9sKTsKK30KKworLyogVHJhbnNtaXQgdGhlIEF1dGhvcml0YXRpdmUgRnJhbWVUaW1lIHZpYSBhbiBJbnRlcmZhY2UgY29udHJvbCBjb25uZWN0aW9uLiAqLworaW50IGdiX2ludGVyZmFjZV90aW1lc3luY19hdXRob3JpdGF0aXZlKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYsCisJCQkJCXU2NCAqZnJhbWVfdGltZSkKK3sKKwlyZXR1cm4gZ2JfY29udHJvbF90aW1lc3luY19hdXRob3JpdGF0aXZlKGludGYtPmNvbnRyb2wsCisJCQkJCQlmcmFtZV90aW1lKTsKK30KKworLyogUmVnaXN0ZXIgYW4gaW50ZXJmYWNlLiAqLworaW50IGdiX2ludGVyZmFjZV9hZGQoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZGV2aWNlX2FkZCgmaW50Zi0+ZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBpbnRlcmZhY2U6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXRyYWNlX2diX2ludGVyZmFjZV9hZGQoaW50Zik7CisKKwlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiSW50ZXJmYWNlIGFkZGVkICglcylcbiIsCisJCQlnYl9pbnRlcmZhY2VfdHlwZV9zdHJpbmcoaW50ZikpOworCisJc3dpdGNoIChpbnRmLT50eXBlKSB7CisJY2FzZSBHQl9JTlRFUkZBQ0VfVFlQRV9HUkVZQlVTOgorCQlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiR01QIFZJRD0weCUwOHgsIFBJRD0weCUwOHhcbiIsCisJCQkJaW50Zi0+dmVuZG9yX2lkLCBpbnRmLT5wcm9kdWN0X2lkKTsKKwkJLyogZmFsbC10aHJvdWdoICovCisJY2FzZSBHQl9JTlRFUkZBQ0VfVFlQRV9VTklQUk86CisJCWRldl9pbmZvKCZpbnRmLT5kZXYsICJEREJMMSBNYW51ZmFjdHVyZXI9MHglMDh4LCBQcm9kdWN0PTB4JTA4eFxuIiwKKwkJCQlpbnRmLT5kZGJsMV9tYW51ZmFjdHVyZXJfaWQsCisJCQkJaW50Zi0+ZGRibDFfcHJvZHVjdF9pZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisvKiBEZXJlZ2lzdGVyIGFuIGludGVyZmFjZS4gKi8KK3ZvaWQgZ2JfaW50ZXJmYWNlX2RlbChzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKQoreworCWlmIChkZXZpY2VfaXNfcmVnaXN0ZXJlZCgmaW50Zi0+ZGV2KSkgeworCQl0cmFjZV9nYl9pbnRlcmZhY2VfZGVsKGludGYpOworCisJCWRldmljZV9kZWwoJmludGYtPmRldik7CisJCWRldl9pbmZvKCZpbnRmLT5kZXYsICJJbnRlcmZhY2UgcmVtb3ZlZFxuIik7CisJfQorfQorCit2b2lkIGdiX2ludGVyZmFjZV9wdXQoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlwdXRfZGV2aWNlKCZpbnRmLT5kZXYpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvaW50ZXJmYWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzI5OWQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIEdyZXlidXMgSW50ZXJmYWNlIEJsb2NrIGNvZGUKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTQgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaWZuZGVmIF9fSU5URVJGQUNFX0gKKyNkZWZpbmUgX19JTlRFUkZBQ0VfSAorCitlbnVtIGdiX2ludGVyZmFjZV90eXBlIHsKKwlHQl9JTlRFUkZBQ0VfVFlQRV9JTlZBTElEID0gMCwKKwlHQl9JTlRFUkZBQ0VfVFlQRV9VTktOT1dOLAorCUdCX0lOVEVSRkFDRV9UWVBFX0RVTU1ZLAorCUdCX0lOVEVSRkFDRV9UWVBFX1VOSVBSTywKKwlHQl9JTlRFUkZBQ0VfVFlQRV9HUkVZQlVTLAorfTsKKworI2RlZmluZSBHQl9JTlRFUkZBQ0VfUVVJUktfTk9fQ1BPUlRfRkVBVFVSRVMJCUJJVCgwKQorI2RlZmluZSBHQl9JTlRFUkZBQ0VfUVVJUktfTk9fSU5JVF9TVEFUVVMJCUJJVCgxKQorI2RlZmluZSBHQl9JTlRFUkZBQ0VfUVVJUktfTk9fR01QX0lEUwkJCUJJVCgyKQorI2RlZmluZSBHQl9JTlRFUkZBQ0VfUVVJUktfRk9SQ0VEX0RJU0FCTEUJCUJJVCgzKQorI2RlZmluZSBHQl9JTlRFUkZBQ0VfUVVJUktfTEVHQUNZX01PREVfU1dJVENICQlCSVQoNCkKKyNkZWZpbmUgR0JfSU5URVJGQUNFX1FVSVJLX05PX0JVTkRMRV9BQ1RJVkFURQkJQklUKDUpCisjZGVmaW5lIEdCX0lOVEVSRkFDRV9RVUlSS19OT19QTQkJCUJJVCg2KQorCitzdHJ1Y3QgZ2JfaW50ZXJmYWNlIHsKKwlzdHJ1Y3QgZGV2aWNlIGRldjsKKwlzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbDsKKworCXN0cnVjdCBsaXN0X2hlYWQgYnVuZGxlczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG1vZHVsZV9ub2RlOworCXN0cnVjdCBsaXN0X2hlYWQgbWFuaWZlc3RfZGVzY3M7CisJdTggaW50ZXJmYWNlX2lkOwkvKiBQaHlzaWNhbCBsb2NhdGlvbiB3aXRoaW4gdGhlIEVuZG8gKi8KKwl1OCBkZXZpY2VfaWQ7CisJdTggZmVhdHVyZXM7CQkvKiBGZWF0dXJlIGZsYWdzIHNldCBpbiB0aGUgbWFuaWZlc3QgKi8KKworCWVudW0gZ2JfaW50ZXJmYWNlX3R5cGUgdHlwZTsKKworCXUzMiBkZGJsMV9tYW51ZmFjdHVyZXJfaWQ7CisJdTMyIGRkYmwxX3Byb2R1Y3RfaWQ7CisJdTMyIHZlbmRvcl9pZDsKKwl1MzIgcHJvZHVjdF9pZDsKKwl1NjQgc2VyaWFsX251bWJlcjsKKworCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQ7CisJc3RydWN0IGdiX21vZHVsZSAqbW9kdWxlOworCisJdW5zaWduZWQgbG9uZyBxdWlya3M7CisKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisKKwlib29sIGRpc2Nvbm5lY3RlZDsKKworCWJvb2wgZWplY3RlZDsKKwlib29sIHJlbW92ZWQ7CisJYm9vbCBhY3RpdmU7CisJYm9vbCBlbmFibGVkOworCWJvb2wgbW9kZV9zd2l0Y2g7CisJYm9vbCBkbWVfcmVhZDsKKworCXN0cnVjdCB3b3JrX3N0cnVjdCBtb2RlX3N3aXRjaF93b3JrOworCXN0cnVjdCBjb21wbGV0aW9uIG1vZGVfc3dpdGNoX2NvbXBsZXRpb247Cit9OworI2RlZmluZSB0b19nYl9pbnRlcmZhY2UoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBnYl9pbnRlcmZhY2UsIGRldikKKworc3RydWN0IGdiX2ludGVyZmFjZSAqZ2JfaW50ZXJmYWNlX2NyZWF0ZShzdHJ1Y3QgZ2JfbW9kdWxlICptb2R1bGUsCisJCQkJCSB1OCBpbnRlcmZhY2VfaWQpOworaW50IGdiX2ludGVyZmFjZV9hY3RpdmF0ZShzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKTsKK3ZvaWQgZ2JfaW50ZXJmYWNlX2RlYWN0aXZhdGUoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50Zik7CitpbnQgZ2JfaW50ZXJmYWNlX2VuYWJsZShzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKTsKK3ZvaWQgZ2JfaW50ZXJmYWNlX2Rpc2FibGUoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50Zik7CitpbnQgZ2JfaW50ZXJmYWNlX3RpbWVzeW5jX2VuYWJsZShzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmLCB1OCBjb3VudCwKKwkJCQkgdTY0IGZyYW1lX3RpbWUsIHUzMiBzdHJvYmVfZGVsYXksIHUzMiByZWZjbGspOworaW50IGdiX2ludGVyZmFjZV90aW1lc3luY19hdXRob3JpdGF0aXZlKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYsCisJCQkJCXU2NCAqZnJhbWVfdGltZSk7CitpbnQgZ2JfaW50ZXJmYWNlX3RpbWVzeW5jX2Rpc2FibGUoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50Zik7CitpbnQgZ2JfaW50ZXJmYWNlX2FkZChzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKTsKK3ZvaWQgZ2JfaW50ZXJmYWNlX2RlbChzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKTsKK3ZvaWQgZ2JfaW50ZXJmYWNlX3B1dChzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKTsKK3ZvaWQgZ2JfaW50ZXJmYWNlX21haWxib3hfZXZlbnQoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZiwgdTE2IHJlc3VsdCwKKwkJCQkJCQkJdTMyIG1haWxib3gpOworCitpbnQgZ2JfaW50ZXJmYWNlX3JlcXVlc3RfbW9kZV9zd2l0Y2goc3RydWN0IGdiX2ludGVyZmFjZSAqaW50Zik7CisKKyNlbmRpZiAvKiBfX0lOVEVSRkFDRV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9saWdodC5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvbGlnaHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGZmZDhhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvbGlnaHQuYwpAQCAtMCwwICsxLDEzNjEgQEAKKy8qCisgKiBHcmV5YnVzIExpZ2h0cyBwcm90b2NvbCBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE1IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9sZWQtY2xhc3MtZmxhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZmxhc2gtbGVkLWNsYXNzLmg+CisKKyNpbmNsdWRlICJncmV5YnVzLmgiCisjaW5jbHVkZSAiZ3JleWJ1c19wcm90b2NvbHMuaCIKKworI2RlZmluZSBOQU1FU19NQVgJMzIKKworc3RydWN0IGdiX2NoYW5uZWwgeworCXU4CQkJCWlkOworCXUzMgkJCQlmbGFnczsKKwl1MzIJCQkJY29sb3I7CisJY2hhcgkJCQkqY29sb3JfbmFtZTsKKwl1OAkJCQlmYWRlX2luOworCXU4CQkJCWZhZGVfb3V0OworCXUzMgkJCQltb2RlOworCWNoYXIJCQkJKm1vZGVfbmFtZTsKKwlzdHJ1Y3QgYXR0cmlidXRlCQkqKmF0dHJzOworCXN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAJCSphdHRyX2dyb3VwOworCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAJKiphdHRyX2dyb3VwczsKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2CQkqbGVkOworI2lmIElTX1JFQUNIQUJMRShDT05GSUdfTEVEU19DTEFTU19GTEFTSCkKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2X2ZsYXNoCWZsZWQ7CisJc3RydWN0IGxlZF9mbGFzaF9zZXR0aW5nCWludGVuc2l0eV91QTsKKwlzdHJ1Y3QgbGVkX2ZsYXNoX3NldHRpbmcJdGltZW91dF91czsKKyNlbHNlCisJc3RydWN0IGxlZF9jbGFzc2RldgkJY2xlZDsKKyNlbmRpZgorCXN0cnVjdCBnYl9saWdodAkJCSpsaWdodDsKKwlib29sCQkJCWlzX3JlZ2lzdGVyZWQ7CisJYm9vbAkJCQlyZWxlYXNpbmc7CisJYm9vbAkJCQlzdHJvYmVfc3RhdGU7CisJYm9vbAkJCQlhY3RpdmU7CisJc3RydWN0IG11dGV4CQkJbG9jazsKK307CisKK3N0cnVjdCBnYl9saWdodCB7CisJdTgJCQlpZDsKKwljaGFyCQkJKm5hbWU7CisJc3RydWN0IGdiX2xpZ2h0cwkqZ2xpZ2h0czsKKwl1MzIJCQlmbGFnczsKKwl1OAkJCWNoYW5uZWxzX2NvdW50OworCXN0cnVjdCBnYl9jaGFubmVsCSpjaGFubmVsczsKKwlib29sCQkJaGFzX2ZsYXNoOworCWJvb2wJCQlyZWFkeTsKKyNpZiBJU19SRUFDSEFCTEUoQ09ORklHX1Y0TDJfRkxBU0hfTEVEX0NMQVNTKQorCXN0cnVjdCB2NGwyX2ZsYXNoCSp2NGwyX2ZsYXNoOworI2VuZGlmCit9OworCitzdHJ1Y3QgZ2JfbGlnaHRzIHsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbgkqY29ubmVjdGlvbjsKKwl1OAkJCWxpZ2h0c19jb3VudDsKKwlzdHJ1Y3QgZ2JfbGlnaHQJCSpsaWdodHM7CisJc3RydWN0IG11dGV4CQlsaWdodHNfbG9jazsKK307CisKK3N0YXRpYyB2b2lkIGdiX2xpZ2h0c19jaGFubmVsX2ZyZWUoc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwpOworCitzdGF0aWMgc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmdldF9jb25uX2Zyb21fY2hhbm5lbChzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlyZXR1cm4gY2hhbm5lbC0+bGlnaHQtPmdsaWdodHMtPmNvbm5lY3Rpb247Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqZ2V0X2Nvbm5fZnJvbV9saWdodChzdHJ1Y3QgZ2JfbGlnaHQgKmxpZ2h0KQoreworCXJldHVybiBsaWdodC0+Z2xpZ2h0cy0+Y29ubmVjdGlvbjsKK30KKworc3RhdGljIGJvb2wgaXNfY2hhbm5lbF9mbGFzaChzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlyZXR1cm4gISEoY2hhbm5lbC0+bW9kZSAmIChHQl9DSEFOTkVMX01PREVfRkxBU0ggfCBHQl9DSEFOTkVMX01PREVfVE9SQ0gKKwkJCQkgICB8IEdCX0NIQU5ORUxfTU9ERV9JTkRJQ0FUT1IpKTsKK30KKworI2lmIElTX1JFQUNIQUJMRShDT05GSUdfTEVEU19DTEFTU19GTEFTSCkKK3N0YXRpYyBzdHJ1Y3QgZ2JfY2hhbm5lbCAqZ2V0X2NoYW5uZWxfZnJvbV9jZGV2KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmNkZXYpCit7CisJc3RydWN0IGxlZF9jbGFzc2Rldl9mbGFzaCAqZmxlZF9jZGV2ID0gbGNkZXZfdG9fZmxjZGV2KGNkZXYpOworCisJcmV0dXJuIGNvbnRhaW5lcl9vZihmbGVkX2NkZXYsIHN0cnVjdCBnYl9jaGFubmVsLCBmbGVkKTsKK30KKworc3RhdGljIHN0cnVjdCBsZWRfY2xhc3NkZXYgKmdldF9jaGFubmVsX2NkZXYoc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJcmV0dXJuICZjaGFubmVsLT5mbGVkLmxlZF9jZGV2OworfQorCitzdGF0aWMgc3RydWN0IGdiX2NoYW5uZWwgKmdldF9jaGFubmVsX2Zyb21fbW9kZShzdHJ1Y3QgZ2JfbGlnaHQgKmxpZ2h0LAorCQkJCQkJdTMyIG1vZGUpCit7CisJc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwgPSBOVUxMOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGxpZ2h0LT5jaGFubmVsc19jb3VudDsgaSsrKSB7CisJCWNoYW5uZWwgPSAmbGlnaHQtPmNoYW5uZWxzW2ldOworCQlpZiAoY2hhbm5lbCAmJiBjaGFubmVsLT5tb2RlID09IG1vZGUpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGNoYW5uZWw7Cit9CisKK3N0YXRpYyBpbnQgX19nYl9saWdodHNfZmxhc2hfaW50ZW5zaXR5X3NldChzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCwKKwkJCQkJICAgdTMyIGludGVuc2l0eSkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGdldF9jb25uX2Zyb21fY2hhbm5lbChjaGFubmVsKTsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUgPSBjb25uZWN0aW9uLT5idW5kbGU7CisJc3RydWN0IGdiX2xpZ2h0c19zZXRfZmxhc2hfaW50ZW5zaXR5X3JlcXVlc3QgcmVxOworCWludCByZXQ7CisKKwlpZiAoY2hhbm5lbC0+cmVsZWFzaW5nKQorCQlyZXR1cm4gLUVTSFVURE9XTjsKKworCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoYnVuZGxlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJlcS5saWdodF9pZCA9IGNoYW5uZWwtPmxpZ2h0LT5pZDsKKwlyZXEuY2hhbm5lbF9pZCA9IGNoYW5uZWwtPmlkOworCXJlcS5pbnRlbnNpdHlfdUEgPSBjcHVfdG9fbGUzMihpbnRlbnNpdHkpOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoY29ubmVjdGlvbiwgR0JfTElHSFRTX1RZUEVfU0VUX0ZMQVNIX0lOVEVOU0lUWSwKKwkJCQkmcmVxLCBzaXplb2YocmVxKSwgTlVMTCwgMCk7CisKKwlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChidW5kbGUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2diX2xpZ2h0c19mbGFzaF9icmlnaHRuZXNzX3NldChzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwl1MzIgaW50ZW5zaXR5OworCisJLyogSWYgdGhlIGNoYW5uZWwgaXMgZmxhc2ggd2UgbmVlZCB0byBnZXQgdGhlIGF0dGFjaGVkIHRvcmNoIGNoYW5uZWwgKi8KKwlpZiAoY2hhbm5lbC0+bW9kZSAmIEdCX0NIQU5ORUxfTU9ERV9GTEFTSCkKKwkJY2hhbm5lbCA9IGdldF9jaGFubmVsX2Zyb21fbW9kZShjaGFubmVsLT5saWdodCwKKwkJCQkJCUdCX0NIQU5ORUxfTU9ERV9UT1JDSCk7CisKKwkvKiBGb3Igbm90IGZsYXNoIHdlIG5lZWQgdG8gY29udmVydCBicmlnaHRuZXNzIHRvIGludGVuc2l0eSAqLworCWludGVuc2l0eSA9IGNoYW5uZWwtPmludGVuc2l0eV91QS5taW4gKworCQkJKGNoYW5uZWwtPmludGVuc2l0eV91QS5zdGVwICogY2hhbm5lbC0+bGVkLT5icmlnaHRuZXNzKTsKKworCXJldHVybiBfX2diX2xpZ2h0c19mbGFzaF9pbnRlbnNpdHlfc2V0KGNoYW5uZWwsIGludGVuc2l0eSk7Cit9CisjZWxzZQorc3RhdGljIHN0cnVjdCBnYl9jaGFubmVsICpnZXRfY2hhbm5lbF9mcm9tX2NkZXYoc3RydWN0IGxlZF9jbGFzc2RldiAqY2RldikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGNkZXYsIHN0cnVjdCBnYl9jaGFubmVsLCBjbGVkKTsKK30KKworc3RhdGljIHN0cnVjdCBsZWRfY2xhc3NkZXYgKmdldF9jaGFubmVsX2NkZXYoc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJcmV0dXJuICZjaGFubmVsLT5jbGVkOworfQorCitzdGF0aWMgaW50IF9fZ2JfbGlnaHRzX2ZsYXNoX2JyaWdodG5lc3Nfc2V0KHN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsKQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZ2JfbGlnaHRzX2NvbG9yX3NldChzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCwgdTMyIGNvbG9yKTsKK3N0YXRpYyBpbnQgZ2JfbGlnaHRzX2ZhZGVfc2V0KHN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsKTsKKworc3RhdGljIHZvaWQgbGVkX2xvY2soc3RydWN0IGxlZF9jbGFzc2RldiAqY2RldikKK3sKKwltdXRleF9sb2NrKCZjZGV2LT5sZWRfYWNjZXNzKTsKK30KKworc3RhdGljIHZvaWQgbGVkX3VubG9jayhzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpjZGV2KQoreworCW11dGV4X3VubG9jaygmY2Rldi0+bGVkX2FjY2Vzcyk7Cit9CisKKyNkZWZpbmUgZ2JfbGlnaHRzX2ZhZGVfYXR0cihfX2RpcikJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IGZhZGVfIyNfX2RpciMjX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAkJCVwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAorCQkJCSAgIGNoYXIgKmJ1ZikJCQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpjZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CQlcCisJc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwgPSBnZXRfY2hhbm5lbF9mcm9tX2NkZXYoY2Rldik7CVwKKwkJCQkJCQkJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgY2hhbm5lbC0+ZmFkZV8jI19fZGlyKTsJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBmYWRlXyMjX19kaXIjI19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAorCQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBsZWRfY2xhc3NkZXYgKmNkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCVwKKwlzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCA9IGdldF9jaGFubmVsX2Zyb21fY2RldihjZGV2KTsJXAorCXU4IGZhZGU7CQkJCQkJCVwKKwlpbnQgcmV0OwkJCQkJCQlcCisJCQkJCQkJCQlcCisJbGVkX2xvY2soY2Rldik7CQkJCQkJCVwKKwlpZiAobGVkX3N5c2ZzX2lzX2Rpc2FibGVkKGNkZXYpKSB7CQkJCVwKKwkJcmV0ID0gLUVCVVNZOwkJCQkJCVwKKwkJZ290byB1bmxvY2s7CQkJCQkJXAorCX0JCQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlyZXQgPSBrc3RydG91OChidWYsIDAsICZmYWRlKTsJCQkJCVwKKwlpZiAocmV0IDwgMCkgewkJCQkJCQlcCisJCWRldl9lcnIoZGV2LCAiY291bGQgbm90IHBhcnNlIGZhZGUgdmFsdWUgJWRcbiIsIHJldCk7CVwKKwkJZ290byB1bmxvY2s7CQkJCQkJXAorCX0JCQkJCQkJCVwKKwlpZiAoY2hhbm5lbC0+ZmFkZV8jI19fZGlyID09IGZhZGUpCQkJCVwKKwkJZ290byB1bmxvY2s7CQkJCQkJXAorCWNoYW5uZWwtPmZhZGVfIyNfX2RpciA9IGZhZGU7CQkJCQlcCisJCQkJCQkJCQlcCisJcmV0ID0gZ2JfbGlnaHRzX2ZhZGVfc2V0KGNoYW5uZWwpOwkJCQlcCisJaWYgKHJldCA8IDApCQkJCQkJCVwKKwkJZ290byB1bmxvY2s7CQkJCQkJXAorCQkJCQkJCQkJXAorCXJldCA9IHNpemU7CQkJCQkJCVwKK3VubG9jazoJCQkJCQkJCQlcCisJbGVkX3VubG9jayhjZGV2KTsJCQkJCQlcCisJcmV0dXJuIHJldDsJCQkJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUl9SVyhmYWRlXyMjX19kaXIpCisKK2diX2xpZ2h0c19mYWRlX2F0dHIoaW4pOworZ2JfbGlnaHRzX2ZhZGVfYXR0cihvdXQpOworCitzdGF0aWMgc3NpemVfdCBjb2xvcl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpjZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwgPSBnZXRfY2hhbm5lbF9mcm9tX2NkZXYoY2Rldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwOHhcbiIsIGNoYW5uZWwtPmNvbG9yKTsKK30KKworc3RhdGljIHNzaXplX3QgY29sb3Jfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGxlZF9jbGFzc2RldiAqY2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsID0gZ2V0X2NoYW5uZWxfZnJvbV9jZGV2KGNkZXYpOworCXUzMiBjb2xvcjsKKwlpbnQgcmV0OworCisJbGVkX2xvY2soY2Rldik7CisJaWYgKGxlZF9zeXNmc19pc19kaXNhYmxlZChjZGV2KSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gdW5sb2NrOworCX0KKwlyZXQgPSBrc3RydG91MzIoYnVmLCAwLCAmY29sb3IpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiY291bGQgbm90IHBhcnNlIGNvbG9yIHZhbHVlICVkXG4iLCByZXQpOworCQlnb3RvIHVubG9jazsKKwl9CisKKwlyZXQgPSBnYl9saWdodHNfY29sb3Jfc2V0KGNoYW5uZWwsIGNvbG9yKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byB1bmxvY2s7CisKKwljaGFubmVsLT5jb2xvciA9IGNvbG9yOworCXJldCA9IHNpemU7Cit1bmxvY2s6CisJbGVkX3VubG9jayhjZGV2KTsKKwlyZXR1cm4gcmV0OworfQorc3RhdGljIERFVklDRV9BVFRSX1JXKGNvbG9yKTsKKworc3RhdGljIGludCBjaGFubmVsX2F0dHJfZ3JvdXBzX3NldChzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCwKKwkJCQkgICBzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpjZGV2KQoreworCWludCBhdHRyID0gMDsKKwlpbnQgc2l6ZSA9IDA7CisKKwlpZiAoY2hhbm5lbC0+ZmxhZ3MgJiBHQl9MSUdIVF9DSEFOTkVMX01VTFRJQ09MT1IpCisJCXNpemUrKzsKKwlpZiAoY2hhbm5lbC0+ZmxhZ3MgJiBHQl9MSUdIVF9DSEFOTkVMX0ZBREVSKQorCQlzaXplICs9IDI7CisKKwlpZiAoIXNpemUpCisJCXJldHVybiAwOworCisJLyogU2V0IGF0dHJpYnV0ZXMgYmFzZWQgaW4gdGhlIGNoYW5uZWwgZmxhZ3MgKi8KKwljaGFubmVsLT5hdHRycyA9IGtjYWxsb2Moc2l6ZSArIDEsIHNpemVvZigqY2hhbm5lbC0+YXR0cnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoYW5uZWwtPmF0dHJzKQorCQlyZXR1cm4gLUVOT01FTTsKKwljaGFubmVsLT5hdHRyX2dyb3VwID0ga2NhbGxvYygxLCBzaXplb2YoKmNoYW5uZWwtPmF0dHJfZ3JvdXApLAorCQkJCSAgICAgIEdGUF9LRVJORUwpOworCWlmICghY2hhbm5lbC0+YXR0cl9ncm91cCkKKwkJcmV0dXJuIC1FTk9NRU07CisJY2hhbm5lbC0+YXR0cl9ncm91cHMgPSBrY2FsbG9jKDIsIHNpemVvZigqY2hhbm5lbC0+YXR0cl9ncm91cHMpLAorCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoYW5uZWwtPmF0dHJfZ3JvdXBzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChjaGFubmVsLT5mbGFncyAmIEdCX0xJR0hUX0NIQU5ORUxfTVVMVElDT0xPUikKKwkJY2hhbm5lbC0+YXR0cnNbYXR0cisrXSA9ICZkZXZfYXR0cl9jb2xvci5hdHRyOworCWlmIChjaGFubmVsLT5mbGFncyAmIEdCX0xJR0hUX0NIQU5ORUxfRkFERVIpIHsKKwkJY2hhbm5lbC0+YXR0cnNbYXR0cisrXSA9ICZkZXZfYXR0cl9mYWRlX2luLmF0dHI7CisJCWNoYW5uZWwtPmF0dHJzW2F0dHIrK10gPSAmZGV2X2F0dHJfZmFkZV9vdXQuYXR0cjsKKwl9CisKKwljaGFubmVsLT5hdHRyX2dyb3VwLT5hdHRycyA9IGNoYW5uZWwtPmF0dHJzOworCisJY2hhbm5lbC0+YXR0cl9ncm91cHNbMF0gPSBjaGFubmVsLT5hdHRyX2dyb3VwOworCisJY2Rldi0+Z3JvdXBzID0gY2hhbm5lbC0+YXR0cl9ncm91cHM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9saWdodHNfZmFkZV9zZXQoc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBnZXRfY29ubl9mcm9tX2NoYW5uZWwoY2hhbm5lbCk7CisJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlID0gY29ubmVjdGlvbi0+YnVuZGxlOworCXN0cnVjdCBnYl9saWdodHNfc2V0X2ZhZGVfcmVxdWVzdCByZXE7CisJaW50IHJldDsKKworCWlmIChjaGFubmVsLT5yZWxlYXNpbmcpCisJCXJldHVybiAtRVNIVVRET1dOOworCisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhidW5kbGUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmVxLmxpZ2h0X2lkID0gY2hhbm5lbC0+bGlnaHQtPmlkOworCXJlcS5jaGFubmVsX2lkID0gY2hhbm5lbC0+aWQ7CisJcmVxLmZhZGVfaW4gPSBjaGFubmVsLT5mYWRlX2luOworCXJlcS5mYWRlX291dCA9IGNoYW5uZWwtPmZhZGVfb3V0OworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sIEdCX0xJR0hUU19UWVBFX1NFVF9GQURFLAorCQkJCSZyZXEsIHNpemVvZihyZXEpLCBOVUxMLCAwKTsKKworCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGJ1bmRsZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX2xpZ2h0c19jb2xvcl9zZXQoc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwsIHUzMiBjb2xvcikKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGdldF9jb25uX2Zyb21fY2hhbm5lbChjaGFubmVsKTsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUgPSBjb25uZWN0aW9uLT5idW5kbGU7CisJc3RydWN0IGdiX2xpZ2h0c19zZXRfY29sb3JfcmVxdWVzdCByZXE7CisJaW50IHJldDsKKworCWlmIChjaGFubmVsLT5yZWxlYXNpbmcpCisJCXJldHVybiAtRVNIVVRET1dOOworCisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhidW5kbGUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmVxLmxpZ2h0X2lkID0gY2hhbm5lbC0+bGlnaHQtPmlkOworCXJlcS5jaGFubmVsX2lkID0gY2hhbm5lbC0+aWQ7CisJcmVxLmNvbG9yID0gY3B1X3RvX2xlMzIoY29sb3IpOworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sIEdCX0xJR0hUU19UWVBFX1NFVF9DT0xPUiwKKwkJCQkmcmVxLCBzaXplb2YocmVxKSwgTlVMTCwgMCk7CisKKwlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChidW5kbGUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2diX2xpZ2h0c19sZWRfYnJpZ2h0bmVzc19zZXQoc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IGdiX2xpZ2h0c19zZXRfYnJpZ2h0bmVzc19yZXF1ZXN0IHJlcTsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGdldF9jb25uX2Zyb21fY2hhbm5lbChjaGFubmVsKTsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUgPSBjb25uZWN0aW9uLT5idW5kbGU7CisJYm9vbCBvbGRfYWN0aXZlOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjaGFubmVsLT5sb2NrKTsKKwlyZXQgPSBnYl9wbV9ydW50aW1lX2dldF9zeW5jKGJ1bmRsZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0X3VubG9jazsKKworCW9sZF9hY3RpdmUgPSBjaGFubmVsLT5hY3RpdmU7CisKKwlyZXEubGlnaHRfaWQgPSBjaGFubmVsLT5saWdodC0+aWQ7CisJcmVxLmNoYW5uZWxfaWQgPSBjaGFubmVsLT5pZDsKKwlyZXEuYnJpZ2h0bmVzcyA9ICh1OCljaGFubmVsLT5sZWQtPmJyaWdodG5lc3M7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLCBHQl9MSUdIVFNfVFlQRV9TRVRfQlJJR0hUTkVTUywKKwkJCQkmcmVxLCBzaXplb2YocmVxKSwgTlVMTCwgMCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0X3BtX3B1dDsKKworCWlmIChjaGFubmVsLT5sZWQtPmJyaWdodG5lc3MpCisJCWNoYW5uZWwtPmFjdGl2ZSA9IHRydWU7CisJZWxzZQorCQljaGFubmVsLT5hY3RpdmUgPSBmYWxzZTsKKworCS8qIHdlIG5lZWQgdG8ga2VlcCBtb2R1bGUgYWxpdmUgd2hlbiB0dXJuaW5nIHRvIGFjdGl2ZSBzdGF0ZSAqLworCWlmICghb2xkX2FjdGl2ZSAmJiBjaGFubmVsLT5hY3RpdmUpCisJCWdvdG8gb3V0X3VubG9jazsKKworCS8qCisJICogb24gdGhlIG90aGVyIGhhbmQgaWYgZ29pbmcgdG8gaW5hY3RpdmUgd2Ugc3RpbGwgaG9sZCBhIHJlZmVyZW5jZSBhbmQKKwkgKiBuZWVkIHRvIHB1dCBpdCwgc28gd2UgY291bGQgZ28gdG8gc3VzcGVuZC4KKwkgKi8KKwlpZiAob2xkX2FjdGl2ZSAmJiAhY2hhbm5lbC0+YWN0aXZlKQorCQlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChidW5kbGUpOworCitvdXRfcG1fcHV0OgorCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGJ1bmRsZSk7CitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmY2hhbm5lbC0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZ2JfbGlnaHRzX2JyaWdodG5lc3Nfc2V0KHN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsKQoreworCWludCByZXQ7CisKKwlpZiAoY2hhbm5lbC0+cmVsZWFzaW5nKQorCQlyZXR1cm4gMDsKKworCWlmIChpc19jaGFubmVsX2ZsYXNoKGNoYW5uZWwpKQorCQlyZXQgPSBfX2diX2xpZ2h0c19mbGFzaF9icmlnaHRuZXNzX3NldChjaGFubmVsKTsKKwllbHNlCisJCXJldCA9IF9fZ2JfbGlnaHRzX2xlZF9icmlnaHRuZXNzX3NldChjaGFubmVsKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfYnJpZ2h0bmVzc19zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqY2RldiwKKwkJCSAgICAgZW51bSBsZWRfYnJpZ2h0bmVzcyB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCA9IGdldF9jaGFubmVsX2Zyb21fY2RldihjZGV2KTsKKworCWNoYW5uZWwtPmxlZC0+YnJpZ2h0bmVzcyA9IHZhbHVlOworCisJcmV0dXJuIF9fZ2JfbGlnaHRzX2JyaWdodG5lc3Nfc2V0KGNoYW5uZWwpOworfQorCitzdGF0aWMgZW51bSBsZWRfYnJpZ2h0bmVzcyBnYl9icmlnaHRuZXNzX2dldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpjZGV2KQorCit7CisJc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwgPSBnZXRfY2hhbm5lbF9mcm9tX2NkZXYoY2Rldik7CisKKwlyZXR1cm4gY2hhbm5lbC0+bGVkLT5icmlnaHRuZXNzOworfQorCitzdGF0aWMgaW50IGdiX2JsaW5rX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpjZGV2LCB1bnNpZ25lZCBsb25nICpkZWxheV9vbiwKKwkJCXVuc2lnbmVkIGxvbmcgKmRlbGF5X29mZikKK3sKKwlzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCA9IGdldF9jaGFubmVsX2Zyb21fY2RldihjZGV2KTsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGdldF9jb25uX2Zyb21fY2hhbm5lbChjaGFubmVsKTsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUgPSBjb25uZWN0aW9uLT5idW5kbGU7CisJc3RydWN0IGdiX2xpZ2h0c19ibGlua19yZXF1ZXN0IHJlcTsKKwlib29sIG9sZF9hY3RpdmU7CisJaW50IHJldDsKKworCWlmIChjaGFubmVsLT5yZWxlYXNpbmcpCisJCXJldHVybiAtRVNIVVRET1dOOworCisJaWYgKCFkZWxheV9vbiB8fCAhZGVsYXlfb2ZmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmNoYW5uZWwtPmxvY2spOworCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoYnVuZGxlKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXRfdW5sb2NrOworCisJb2xkX2FjdGl2ZSA9IGNoYW5uZWwtPmFjdGl2ZTsKKworCXJlcS5saWdodF9pZCA9IGNoYW5uZWwtPmxpZ2h0LT5pZDsKKwlyZXEuY2hhbm5lbF9pZCA9IGNoYW5uZWwtPmlkOworCXJlcS50aW1lX29uX21zID0gY3B1X3RvX2xlMTYoKmRlbGF5X29uKTsKKwlyZXEudGltZV9vZmZfbXMgPSBjcHVfdG9fbGUxNigqZGVsYXlfb2ZmKTsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sIEdCX0xJR0hUU19UWVBFX1NFVF9CTElOSywgJnJlcSwKKwkJCQlzaXplb2YocmVxKSwgTlVMTCwgMCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0X3BtX3B1dDsKKworCWlmICgqZGVsYXlfb24pCisJCWNoYW5uZWwtPmFjdGl2ZSA9IHRydWU7CisJZWxzZQorCQljaGFubmVsLT5hY3RpdmUgPSBmYWxzZTsKKworCS8qIHdlIG5lZWQgdG8ga2VlcCBtb2R1bGUgYWxpdmUgd2hlbiB0dXJuaW5nIHRvIGFjdGl2ZSBzdGF0ZSAqLworCWlmICghb2xkX2FjdGl2ZSAmJiBjaGFubmVsLT5hY3RpdmUpCisJCWdvdG8gb3V0X3VubG9jazsKKworCS8qCisJICogb24gdGhlIG90aGVyIGhhbmQgaWYgZ29pbmcgdG8gaW5hY3RpdmUgd2Ugc3RpbGwgaG9sZCBhIHJlZmVyZW5jZSBhbmQKKwkgKiBuZWVkIHRvIHB1dCBpdCwgc28gd2UgY291bGQgZ28gdG8gc3VzcGVuZC4KKwkgKi8KKwlpZiAob2xkX2FjdGl2ZSAmJiAhY2hhbm5lbC0+YWN0aXZlKQorCQlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChidW5kbGUpOworCitvdXRfcG1fcHV0OgorCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGJ1bmRsZSk7CitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmY2hhbm5lbC0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBnYl9saWdodHNfbGVkX29wZXJhdGlvbnNfc2V0KHN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsLAorCQkJCQkgc3RydWN0IGxlZF9jbGFzc2RldiAqY2RldikKK3sKKwljZGV2LT5icmlnaHRuZXNzX2dldCA9IGdiX2JyaWdodG5lc3NfZ2V0OworCWNkZXYtPmJyaWdodG5lc3Nfc2V0X2Jsb2NraW5nID0gZ2JfYnJpZ2h0bmVzc19zZXQ7CisKKwlpZiAoY2hhbm5lbC0+ZmxhZ3MgJiBHQl9MSUdIVF9DSEFOTkVMX0JMSU5LKQorCQljZGV2LT5ibGlua19zZXQgPSBnYl9ibGlua19zZXQ7Cit9CisKKyNpZiBJU19SRUFDSEFCTEUoQ09ORklHX1Y0TDJfRkxBU0hfTEVEX0NMQVNTKQorLyogVjRMMiBzcGVjaWZpYyBoZWxwZXJzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmxhc2hfb3BzIHY0bDJfZmxhc2hfb3BzOworCitzdGF0aWMgdm9pZCBfX2diX2xpZ2h0c19jaGFubmVsX3Y0bDJfY29uZmlnKHN0cnVjdCBsZWRfZmxhc2hfc2V0dGluZyAqY2hhbm5lbF9zLAorCQkJCQkgICAgc3RydWN0IGxlZF9mbGFzaF9zZXR0aW5nICp2NGwyX3MpCit7CisJdjRsMl9zLT5taW4gPSBjaGFubmVsX3MtPm1pbjsKKwl2NGwyX3MtPm1heCA9IGNoYW5uZWxfcy0+bWF4OworCXY0bDJfcy0+c3RlcCA9IGNoYW5uZWxfcy0+c3RlcDsKKwkvKiBGb3IgdjRsMiB2YWwgaXMgdGhlIGRlZmF1bHQgdmFsdWUgKi8KKwl2NGwyX3MtPnZhbCA9IGNoYW5uZWxfcy0+bWF4OworfQorCitzdGF0aWMgaW50IGdiX2xpZ2h0c19saWdodF92NGwyX3JlZ2lzdGVyKHN0cnVjdCBnYl9saWdodCAqbGlnaHQpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBnZXRfY29ubl9mcm9tX2xpZ2h0KGxpZ2h0KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXY7CisJc3RydWN0IHY0bDJfZmxhc2hfY29uZmlnICpzZF9jZmc7CisJc3RydWN0IGxlZF9jbGFzc2Rldl9mbGFzaCAqZmxlZDsKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2X2ZsYXNoICppbGVkID0gTlVMTDsKKwlzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbF90b3JjaCwgKmNoYW5uZWxfaW5kLCAqY2hhbm5lbF9mbGFzaDsKKwlpbnQgcmV0ID0gMDsKKworCXNkX2NmZyA9IGtjYWxsb2MoMSwgc2l6ZW9mKCpzZF9jZmcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNkX2NmZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljaGFubmVsX3RvcmNoID0gZ2V0X2NoYW5uZWxfZnJvbV9tb2RlKGxpZ2h0LCBHQl9DSEFOTkVMX01PREVfVE9SQ0gpOworCWlmIChjaGFubmVsX3RvcmNoKQorCQlfX2diX2xpZ2h0c19jaGFubmVsX3Y0bDJfY29uZmlnKCZjaGFubmVsX3RvcmNoLT5pbnRlbnNpdHlfdUEsCisJCQkJCQkmc2RfY2ZnLT50b3JjaF9pbnRlbnNpdHkpOworCisJY2hhbm5lbF9pbmQgPSBnZXRfY2hhbm5lbF9mcm9tX21vZGUobGlnaHQsIEdCX0NIQU5ORUxfTU9ERV9JTkRJQ0FUT1IpOworCWlmIChjaGFubmVsX2luZCkgeworCQlfX2diX2xpZ2h0c19jaGFubmVsX3Y0bDJfY29uZmlnKCZjaGFubmVsX2luZC0+aW50ZW5zaXR5X3VBLAorCQkJCQkJJnNkX2NmZy0+aW5kaWNhdG9yX2ludGVuc2l0eSk7CisJCWlsZWQgPSAmY2hhbm5lbF9pbmQtPmZsZWQ7CisJfQorCisJY2hhbm5lbF9mbGFzaCA9IGdldF9jaGFubmVsX2Zyb21fbW9kZShsaWdodCwgR0JfQ0hBTk5FTF9NT0RFX0ZMQVNIKTsKKwlXQVJOX09OKCFjaGFubmVsX2ZsYXNoKTsKKworCWZsZWQgPSAmY2hhbm5lbF9mbGFzaC0+ZmxlZDsKKworCXNucHJpbnRmKHNkX2NmZy0+ZGV2X25hbWUsIHNpemVvZihzZF9jZmctPmRldl9uYW1lKSwgIiVzIiwgbGlnaHQtPm5hbWUpOworCisJLyogU2V0IHRoZSBwb3NzaWJsZSB2YWx1ZXMgdG8gZmF1bHRzLCBpbiBvdXIgY2FzZSBhbGwgZmF1bHRzICovCisJc2RfY2ZnLT5mbGFzaF9mYXVsdHMgPSBMRURfRkFVTFRfT1ZFUl9WT0xUQUdFIHwgTEVEX0ZBVUxUX1RJTUVPVVQgfAorCQlMRURfRkFVTFRfT1ZFUl9URU1QRVJBVFVSRSB8IExFRF9GQVVMVF9TSE9SVF9DSVJDVUlUIHwKKwkJTEVEX0ZBVUxUX09WRVJfQ1VSUkVOVCB8IExFRF9GQVVMVF9JTkRJQ0FUT1IgfAorCQlMRURfRkFVTFRfVU5ERVJfVk9MVEFHRSB8IExFRF9GQVVMVF9JTlBVVF9WT0xUQUdFIHwKKwkJTEVEX0ZBVUxUX0xFRF9PVkVSX1RFTVBFUkFUVVJFOworCisJbGlnaHQtPnY0bDJfZmxhc2ggPSB2NGwyX2ZsYXNoX2luaXQoZGV2LCBOVUxMLCBmbGVkLCBpbGVkLAorCQkJCQkgICAgJnY0bDJfZmxhc2hfb3BzLCBzZF9jZmcpOworCWlmIChJU19FUlJfT1JfTlVMTChsaWdodC0+djRsMl9mbGFzaCkpIHsKKwkJcmV0ID0gUFRSX0VSUihsaWdodC0+djRsMl9mbGFzaCk7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJcmV0dXJuIHJldDsKKworb3V0X2ZyZWU6CisJa2ZyZWUoc2RfY2ZnKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBnYl9saWdodHNfbGlnaHRfdjRsMl91bnJlZ2lzdGVyKHN0cnVjdCBnYl9saWdodCAqbGlnaHQpCit7CisJdjRsMl9mbGFzaF9yZWxlYXNlKGxpZ2h0LT52NGwyX2ZsYXNoKTsKK30KKyNlbHNlCitzdGF0aWMgaW50IGdiX2xpZ2h0c19saWdodF92NGwyX3JlZ2lzdGVyKHN0cnVjdCBnYl9saWdodCAqbGlnaHQpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBnZXRfY29ubl9mcm9tX2xpZ2h0KGxpZ2h0KTsKKworCWRldl9lcnIoJmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2LCAibm8gc3VwcG9ydCBmb3IgdjRsMiBzdWJkZXZpY2VzXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2JfbGlnaHRzX2xpZ2h0X3Y0bDJfdW5yZWdpc3RlcihzdHJ1Y3QgZ2JfbGlnaHQgKmxpZ2h0KQoreworfQorI2VuZGlmCisKKyNpZiBJU19SRUFDSEFCTEUoQ09ORklHX0xFRFNfQ0xBU1NfRkxBU0gpCisvKiBGbGFzaCBzcGVjaWZpYyBvcGVyYXRpb25zICovCitzdGF0aWMgaW50IGdiX2xpZ2h0c19mbGFzaF9pbnRlbnNpdHlfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXZfZmxhc2ggKmZjZGV2LAorCQkJCQkgdTMyIGJyaWdodG5lc3MpCit7CisJc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwgPSBjb250YWluZXJfb2YoZmNkZXYsIHN0cnVjdCBnYl9jaGFubmVsLAorCQkJCQkJICBmbGVkKTsKKwlpbnQgcmV0OworCisJcmV0ID0gX19nYl9saWdodHNfZmxhc2hfaW50ZW5zaXR5X3NldChjaGFubmVsLCBicmlnaHRuZXNzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWZjZGV2LT5icmlnaHRuZXNzLnZhbCA9IGJyaWdodG5lc3M7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9saWdodHNfZmxhc2hfaW50ZW5zaXR5X2dldChzdHJ1Y3QgbGVkX2NsYXNzZGV2X2ZsYXNoICpmY2RldiwKKwkJCQkJIHUzMiAqYnJpZ2h0bmVzcykKK3sKKwkqYnJpZ2h0bmVzcyA9IGZjZGV2LT5icmlnaHRuZXNzLnZhbDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX2xpZ2h0c19mbGFzaF9zdHJvYmVfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXZfZmxhc2ggKmZjZGV2LAorCQkJCSAgICAgIGJvb2wgc3RhdGUpCit7CisJc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwgPSBjb250YWluZXJfb2YoZmNkZXYsIHN0cnVjdCBnYl9jaGFubmVsLAorCQkJCQkJICBmbGVkKTsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGdldF9jb25uX2Zyb21fY2hhbm5lbChjaGFubmVsKTsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUgPSBjb25uZWN0aW9uLT5idW5kbGU7CisJc3RydWN0IGdiX2xpZ2h0c19zZXRfZmxhc2hfc3Ryb2JlX3JlcXVlc3QgcmVxOworCWludCByZXQ7CisKKwlpZiAoY2hhbm5lbC0+cmVsZWFzaW5nKQorCQlyZXR1cm4gLUVTSFVURE9XTjsKKworCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoYnVuZGxlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJlcS5saWdodF9pZCA9IGNoYW5uZWwtPmxpZ2h0LT5pZDsKKwlyZXEuY2hhbm5lbF9pZCA9IGNoYW5uZWwtPmlkOworCXJlcS5zdGF0ZSA9IHN0YXRlID8gMSA6IDA7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLCBHQl9MSUdIVFNfVFlQRV9TRVRfRkxBU0hfU1RST0JFLAorCQkJCSZyZXEsIHNpemVvZihyZXEpLCBOVUxMLCAwKTsKKwlpZiAoIXJldCkKKwkJY2hhbm5lbC0+c3Ryb2JlX3N0YXRlID0gc3RhdGU7CisKKwlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChidW5kbGUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9saWdodHNfZmxhc2hfc3Ryb2JlX2dldChzdHJ1Y3QgbGVkX2NsYXNzZGV2X2ZsYXNoICpmY2RldiwKKwkJCQkgICAgICBib29sICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCA9IGNvbnRhaW5lcl9vZihmY2Rldiwgc3RydWN0IGdiX2NoYW5uZWwsCisJCQkJCQkgIGZsZWQpOworCisJKnN0YXRlID0gY2hhbm5lbC0+c3Ryb2JlX3N0YXRlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX2xpZ2h0c19mbGFzaF90aW1lb3V0X3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2X2ZsYXNoICpmY2RldiwKKwkJCQkgICAgICAgdTMyIHRpbWVvdXQpCit7CisJc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwgPSBjb250YWluZXJfb2YoZmNkZXYsIHN0cnVjdCBnYl9jaGFubmVsLAorCQkJCQkJICBmbGVkKTsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGdldF9jb25uX2Zyb21fY2hhbm5lbChjaGFubmVsKTsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUgPSBjb25uZWN0aW9uLT5idW5kbGU7CisJc3RydWN0IGdiX2xpZ2h0c19zZXRfZmxhc2hfdGltZW91dF9yZXF1ZXN0IHJlcTsKKwlpbnQgcmV0OworCisJaWYgKGNoYW5uZWwtPnJlbGVhc2luZykKKwkJcmV0dXJuIC1FU0hVVERPV047CisKKwlyZXQgPSBnYl9wbV9ydW50aW1lX2dldF9zeW5jKGJ1bmRsZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXEubGlnaHRfaWQgPSBjaGFubmVsLT5saWdodC0+aWQ7CisJcmVxLmNoYW5uZWxfaWQgPSBjaGFubmVsLT5pZDsKKwlyZXEudGltZW91dF91cyA9IGNwdV90b19sZTMyKHRpbWVvdXQpOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoY29ubmVjdGlvbiwgR0JfTElHSFRTX1RZUEVfU0VUX0ZMQVNIX1RJTUVPVVQsCisJCQkJJnJlcSwgc2l6ZW9mKHJlcSksIE5VTEwsIDApOworCWlmICghcmV0KQorCQlmY2Rldi0+dGltZW91dC52YWwgPSB0aW1lb3V0OworCisJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoYnVuZGxlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfbGlnaHRzX2ZsYXNoX2ZhdWx0X2dldChzdHJ1Y3QgbGVkX2NsYXNzZGV2X2ZsYXNoICpmY2RldiwKKwkJCQkgICAgIHUzMiAqZmF1bHQpCit7CisJc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwgPSBjb250YWluZXJfb2YoZmNkZXYsIHN0cnVjdCBnYl9jaGFubmVsLAorCQkJCQkJICBmbGVkKTsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGdldF9jb25uX2Zyb21fY2hhbm5lbChjaGFubmVsKTsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUgPSBjb25uZWN0aW9uLT5idW5kbGU7CisJc3RydWN0IGdiX2xpZ2h0c19nZXRfZmxhc2hfZmF1bHRfcmVxdWVzdCByZXE7CisJc3RydWN0IGdiX2xpZ2h0c19nZXRfZmxhc2hfZmF1bHRfcmVzcG9uc2UgcmVzcDsKKwlpbnQgcmV0OworCisJaWYgKGNoYW5uZWwtPnJlbGVhc2luZykKKwkJcmV0dXJuIC1FU0hVVERPV047CisKKwlyZXQgPSBnYl9wbV9ydW50aW1lX2dldF9zeW5jKGJ1bmRsZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXEubGlnaHRfaWQgPSBjaGFubmVsLT5saWdodC0+aWQ7CisJcmVxLmNoYW5uZWxfaWQgPSBjaGFubmVsLT5pZDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sIEdCX0xJR0hUU19UWVBFX0dFVF9GTEFTSF9GQVVMVCwKKwkJCQkmcmVxLCBzaXplb2YocmVxKSwgJnJlc3AsIHNpemVvZihyZXNwKSk7CisJaWYgKCFyZXQpCisJCSpmYXVsdCA9IGxlMzJfdG9fY3B1KHJlc3AuZmF1bHQpOworCisJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoYnVuZGxlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbGVkX2ZsYXNoX29wcyBnYl9saWdodHNfZmxhc2hfb3BzID0geworCS5mbGFzaF9icmlnaHRuZXNzX3NldAk9IGdiX2xpZ2h0c19mbGFzaF9pbnRlbnNpdHlfc2V0LAorCS5mbGFzaF9icmlnaHRuZXNzX2dldAk9IGdiX2xpZ2h0c19mbGFzaF9pbnRlbnNpdHlfZ2V0LAorCS5zdHJvYmVfc2V0CQk9IGdiX2xpZ2h0c19mbGFzaF9zdHJvYmVfc2V0LAorCS5zdHJvYmVfZ2V0CQk9IGdiX2xpZ2h0c19mbGFzaF9zdHJvYmVfZ2V0LAorCS50aW1lb3V0X3NldAkJPSBnYl9saWdodHNfZmxhc2hfdGltZW91dF9zZXQsCisJLmZhdWx0X2dldAkJPSBnYl9saWdodHNfZmxhc2hfZmF1bHRfZ2V0LAorfTsKKworc3RhdGljIGludCBfX2diX2xpZ2h0c19jaGFubmVsX3RvcmNoX2F0dGFjaChzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCwKKwkJCQkJICAgIHN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsX3RvcmNoKQoreworCWNoYXIgKm5hbWU7CisKKwkvKiB3ZSBjYW4gb25seSBhdHRhY2ggdG9yY2ggdG8gYSBmbGFzaCBjaGFubmVsICovCisJaWYgKCEoY2hhbm5lbC0+bW9kZSAmIEdCX0NIQU5ORUxfTU9ERV9GTEFTSCkpCisJCXJldHVybiAwOworCisJLyogTW92ZSB0b3JjaCBicmlnaHRuZXNzIHRvIHRoZSBkZXN0aW5hdGlvbiAqLworCWNoYW5uZWwtPmxlZC0+bWF4X2JyaWdodG5lc3MgPSBjaGFubmVsX3RvcmNoLT5sZWQtPm1heF9icmlnaHRuZXNzOworCisJLyogYXBwZW5kIG1vZGUgbmFtZSB0byBmbGFzaCBuYW1lICovCisJbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXNfJXMiLCBjaGFubmVsLT5sZWQtPm5hbWUsCisJCQkgY2hhbm5lbF90b3JjaC0+bW9kZV9uYW1lKTsKKwlpZiAoIW5hbWUpCisJCXJldHVybiAtRU5PTUVNOworCWtmcmVlKGNoYW5uZWwtPmxlZC0+bmFtZSk7CisJY2hhbm5lbC0+bGVkLT5uYW1lID0gbmFtZTsKKworCWNoYW5uZWxfdG9yY2gtPmxlZCA9IGNoYW5uZWwtPmxlZDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZ2JfbGlnaHRzX2ZsYXNoX2xlZF9yZWdpc3RlcihzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGdldF9jb25uX2Zyb21fY2hhbm5lbChjaGFubmVsKTsKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2X2ZsYXNoICpmbGVkID0gJmNoYW5uZWwtPmZsZWQ7CisJc3RydWN0IGxlZF9mbGFzaF9zZXR0aW5nICpmc2V0OworCXN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsX3RvcmNoOworCWludCByZXQ7CisKKwlmbGVkLT5vcHMgPSAmZ2JfbGlnaHRzX2ZsYXNoX29wczsKKworCWZsZWQtPmxlZF9jZGV2LmZsYWdzIHw9IExFRF9ERVZfQ0FQX0ZMQVNIOworCisJZnNldCA9ICZmbGVkLT5icmlnaHRuZXNzOworCWZzZXQtPm1pbiA9IGNoYW5uZWwtPmludGVuc2l0eV91QS5taW47CisJZnNldC0+bWF4ID0gY2hhbm5lbC0+aW50ZW5zaXR5X3VBLm1heDsKKwlmc2V0LT5zdGVwID0gY2hhbm5lbC0+aW50ZW5zaXR5X3VBLnN0ZXA7CisJZnNldC0+dmFsID0gY2hhbm5lbC0+aW50ZW5zaXR5X3VBLm1heDsKKworCS8qIE9ubHkgdGhlIGZsYXNoIG1vZGUgaGF2ZSB0aGUgdGltZW91dCBjb25zdHJhaW50cyBzZXR0aW5ncyAqLworCWlmIChjaGFubmVsLT5tb2RlICYgR0JfQ0hBTk5FTF9NT0RFX0ZMQVNIKSB7CisJCWZzZXQgPSAmZmxlZC0+dGltZW91dDsKKwkJZnNldC0+bWluID0gY2hhbm5lbC0+dGltZW91dF91cy5taW47CisJCWZzZXQtPm1heCA9IGNoYW5uZWwtPnRpbWVvdXRfdXMubWF4OworCQlmc2V0LT5zdGVwID0gY2hhbm5lbC0+dGltZW91dF91cy5zdGVwOworCQlmc2V0LT52YWwgPSBjaGFubmVsLT50aW1lb3V0X3VzLm1heDsKKwl9CisKKwkvKgorCSAqIElmIGxpZ2h0IGhhdmUgdG9yY2ggbW9kZSBjaGFubmVsLCB0aGlzIGNoYW5uZWwgd2lsbCBiZSB0aGUgbGVkCisJICogY2xhc3NkZXYgb2YgdGhlIHJlZ2lzdGVyZWQgYWJvdmUgZmxhc2ggY2xhc3NkZXYKKwkgKi8KKwljaGFubmVsX3RvcmNoID0gZ2V0X2NoYW5uZWxfZnJvbV9tb2RlKGNoYW5uZWwtPmxpZ2h0LAorCQkJCQkgICAgICBHQl9DSEFOTkVMX01PREVfVE9SQ0gpOworCWlmIChjaGFubmVsX3RvcmNoKSB7CisJCXJldCA9IF9fZ2JfbGlnaHRzX2NoYW5uZWxfdG9yY2hfYXR0YWNoKGNoYW5uZWwsIGNoYW5uZWxfdG9yY2gpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXQgPSBsZWRfY2xhc3NkZXZfZmxhc2hfcmVnaXN0ZXIoJmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2LCBmbGVkKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBmYWlsOworCisJY2hhbm5lbC0+aXNfcmVnaXN0ZXJlZCA9IHRydWU7CisJcmV0dXJuIDA7CitmYWlsOgorCWNoYW5uZWwtPmxlZCA9IE5VTEw7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19nYl9saWdodHNfZmxhc2hfbGVkX3VucmVnaXN0ZXIoc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJaWYgKCFjaGFubmVsLT5pc19yZWdpc3RlcmVkKQorCQlyZXR1cm47CisKKwlsZWRfY2xhc3NkZXZfZmxhc2hfdW5yZWdpc3RlcigmY2hhbm5lbC0+ZmxlZCk7Cit9CisKK3N0YXRpYyBpbnQgZ2JfbGlnaHRzX2NoYW5uZWxfZmxhc2hfY29uZmlnKHN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZ2V0X2Nvbm5fZnJvbV9jaGFubmVsKGNoYW5uZWwpOworCXN0cnVjdCBnYl9saWdodHNfZ2V0X2NoYW5uZWxfZmxhc2hfY29uZmlnX3JlcXVlc3QgcmVxOworCXN0cnVjdCBnYl9saWdodHNfZ2V0X2NoYW5uZWxfZmxhc2hfY29uZmlnX3Jlc3BvbnNlIGNvbmY7CisJc3RydWN0IGxlZF9mbGFzaF9zZXR0aW5nICpmc2V0OworCWludCByZXQ7CisKKwlyZXEubGlnaHRfaWQgPSBjaGFubmVsLT5saWdodC0+aWQ7CisJcmVxLmNoYW5uZWxfaWQgPSBjaGFubmVsLT5pZDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sCisJCQkJR0JfTElHSFRTX1RZUEVfR0VUX0NIQU5ORUxfRkxBU0hfQ09ORklHLAorCQkJCSZyZXEsIHNpemVvZihyZXEpLCAmY29uZiwgc2l6ZW9mKGNvbmYpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogSW50ZW5zaXR5IGNvbnN0cmFpbnRzIGZvciBmbGFzaCByZWxhdGVkIG1vZGVzOiBmbGFzaCwgdG9yY2gsCisJICogaW5kaWNhdG9yLiAgVGhleSB3aWxsIGJlIG5lZWRlZCBmb3IgdjRsMiByZWdpc3RyYXRpb24uCisJICovCisJZnNldCA9ICZjaGFubmVsLT5pbnRlbnNpdHlfdUE7CisJZnNldC0+bWluID0gbGUzMl90b19jcHUoY29uZi5pbnRlbnNpdHlfbWluX3VBKTsKKwlmc2V0LT5tYXggPSBsZTMyX3RvX2NwdShjb25mLmludGVuc2l0eV9tYXhfdUEpOworCWZzZXQtPnN0ZXAgPSBsZTMyX3RvX2NwdShjb25mLmludGVuc2l0eV9zdGVwX3VBKTsKKworCS8qCisJICogT24gZmxhc2ggdHlwZSwgbWF4IGJyaWdodG5lc3MgaXMgc2V0IGFzIHRoZSBudW1iZXIgb2YgaW50ZW5zaXR5IHN0ZXBzCisJICogYXZhaWxhYmxlLgorCSAqLworCWNoYW5uZWwtPmxlZC0+bWF4X2JyaWdodG5lc3MgPSAoZnNldC0+bWF4IC0gZnNldC0+bWluKSAvIGZzZXQtPnN0ZXA7CisKKwkvKiBPbmx5IHRoZSBmbGFzaCBtb2RlIGhhdmUgdGhlIHRpbWVvdXQgY29uc3RyYWludHMgc2V0dGluZ3MgKi8KKwlpZiAoY2hhbm5lbC0+bW9kZSAmIEdCX0NIQU5ORUxfTU9ERV9GTEFTSCkgeworCQlmc2V0ID0gJmNoYW5uZWwtPnRpbWVvdXRfdXM7CisJCWZzZXQtPm1pbiA9IGxlMzJfdG9fY3B1KGNvbmYudGltZW91dF9taW5fdXMpOworCQlmc2V0LT5tYXggPSBsZTMyX3RvX2NwdShjb25mLnRpbWVvdXRfbWF4X3VzKTsKKwkJZnNldC0+c3RlcCA9IGxlMzJfdG9fY3B1KGNvbmYudGltZW91dF9zdGVwX3VzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW50IGdiX2xpZ2h0c19jaGFubmVsX2ZsYXNoX2NvbmZpZyhzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGdldF9jb25uX2Zyb21fY2hhbm5lbChjaGFubmVsKTsKKworCWRldl9lcnIoJmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2LCAibm8gc3VwcG9ydCBmb3IgZmxhc2ggZGV2aWNlc1xuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19nYl9saWdodHNfZmxhc2hfbGVkX3JlZ2lzdGVyKHN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2diX2xpZ2h0c19mbGFzaF9sZWRfdW5yZWdpc3RlcihzdHJ1Y3QgZ2JfY2hhbm5lbCAqY2hhbm5lbCkKK3sKK30KKworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19nYl9saWdodHNfbGVkX3JlZ2lzdGVyKHN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZ2V0X2Nvbm5fZnJvbV9jaGFubmVsKGNoYW5uZWwpOworCXN0cnVjdCBsZWRfY2xhc3NkZXYgKmNkZXYgPSBnZXRfY2hhbm5lbF9jZGV2KGNoYW5uZWwpOworCWludCByZXQ7CisKKwlyZXQgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2LCBjZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJY2hhbm5lbC0+bGVkID0gTlVMTDsKKwllbHNlCisJCWNoYW5uZWwtPmlzX3JlZ2lzdGVyZWQgPSB0cnVlOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfbGlnaHRzX2NoYW5uZWxfcmVnaXN0ZXIoc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJLyogTm9ybWFsIExFRCBjaGFubmVsLCBqdXN0IHJlZ2lzdGVyIGluIGxlZCBjbGFzc2RldiBhbmQgd2UgYXJlIGRvbmUgKi8KKwlpZiAoIWlzX2NoYW5uZWxfZmxhc2goY2hhbm5lbCkpCisJCXJldHVybiBfX2diX2xpZ2h0c19sZWRfcmVnaXN0ZXIoY2hhbm5lbCk7CisKKwkvKgorCSAqIEZsYXNoIFR5cGUgbmVlZCBtb3JlIHdvcmssIHJlZ2lzdGVyIGZsYXNoIGNsYXNzZGV2LCBpbmRpY2F0b3IgYXMKKwkgKiBmbGFzaCBjbGFzc2RldiwgdG9yY2ggd2lsbCBiZSBsZWQgY2xhc3NkZXYgb2YgdGhlIGZsYXNoIGNsYXNzZGV2LgorCSAqLworCWlmICghKGNoYW5uZWwtPm1vZGUgJiBHQl9DSEFOTkVMX01PREVfVE9SQ0gpKQorCQlyZXR1cm4gX19nYl9saWdodHNfZmxhc2hfbGVkX3JlZ2lzdGVyKGNoYW5uZWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZ2JfbGlnaHRzX2xlZF91bnJlZ2lzdGVyKHN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBsZWRfY2xhc3NkZXYgKmNkZXYgPSBnZXRfY2hhbm5lbF9jZGV2KGNoYW5uZWwpOworCisJaWYgKCFjaGFubmVsLT5pc19yZWdpc3RlcmVkKQorCQlyZXR1cm47CisKKwlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcihjZGV2KTsKKwljaGFubmVsLT5sZWQgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBnYl9saWdodHNfY2hhbm5lbF91bnJlZ2lzdGVyKHN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsKQoreworCS8qIFRoZSBzYW1lIGFzIHJlZ2lzdGVyLCBoYW5kbGUgY2hhbm5lbHMgZGlmZmVyZW50bHkgKi8KKwlpZiAoIWlzX2NoYW5uZWxfZmxhc2goY2hhbm5lbCkpIHsKKwkJX19nYl9saWdodHNfbGVkX3VucmVnaXN0ZXIoY2hhbm5lbCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoY2hhbm5lbC0+bW9kZSAmIEdCX0NIQU5ORUxfTU9ERV9UT1JDSCkKKwkJX19nYl9saWdodHNfbGVkX3VucmVnaXN0ZXIoY2hhbm5lbCk7CisJZWxzZQorCQlfX2diX2xpZ2h0c19mbGFzaF9sZWRfdW5yZWdpc3RlcihjaGFubmVsKTsKK30KKworc3RhdGljIGludCBnYl9saWdodHNfY2hhbm5lbF9jb25maWcoc3RydWN0IGdiX2xpZ2h0ICpsaWdodCwKKwkJCQkgICAgc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IGdiX2xpZ2h0c19nZXRfY2hhbm5lbF9jb25maWdfcmVzcG9uc2UgY29uZjsKKwlzdHJ1Y3QgZ2JfbGlnaHRzX2dldF9jaGFubmVsX2NvbmZpZ19yZXF1ZXN0IHJlcTsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGdldF9jb25uX2Zyb21fbGlnaHQobGlnaHQpOworCXN0cnVjdCBsZWRfY2xhc3NkZXYgKmNkZXYgPSBnZXRfY2hhbm5lbF9jZGV2KGNoYW5uZWwpOworCWNoYXIgKm5hbWU7CisJaW50IHJldDsKKworCXJlcS5saWdodF9pZCA9IGxpZ2h0LT5pZDsKKwlyZXEuY2hhbm5lbF9pZCA9IGNoYW5uZWwtPmlkOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoY29ubmVjdGlvbiwgR0JfTElHSFRTX1RZUEVfR0VUX0NIQU5ORUxfQ09ORklHLAorCQkJCSZyZXEsIHNpemVvZihyZXEpLCAmY29uZiwgc2l6ZW9mKGNvbmYpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWNoYW5uZWwtPmxpZ2h0ID0gbGlnaHQ7CisJY2hhbm5lbC0+bW9kZSA9IGxlMzJfdG9fY3B1KGNvbmYubW9kZSk7CisJY2hhbm5lbC0+ZmxhZ3MgPSBsZTMyX3RvX2NwdShjb25mLmZsYWdzKTsKKwljaGFubmVsLT5jb2xvciA9IGxlMzJfdG9fY3B1KGNvbmYuY29sb3IpOworCWNoYW5uZWwtPmNvbG9yX25hbWUgPSBrc3RybmR1cChjb25mLmNvbG9yX25hbWUsIE5BTUVTX01BWCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaGFubmVsLT5jb2xvcl9uYW1lKQorCQlyZXR1cm4gLUVOT01FTTsKKwljaGFubmVsLT5tb2RlX25hbWUgPSBrc3RybmR1cChjb25mLm1vZGVfbmFtZSwgTkFNRVNfTUFYLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoYW5uZWwtPm1vZGVfbmFtZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljaGFubmVsLT5sZWQgPSBjZGV2OworCisJbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXM6JXM6JXMiLCBsaWdodC0+bmFtZSwKKwkJCSBjaGFubmVsLT5jb2xvcl9uYW1lLCBjaGFubmVsLT5tb2RlX25hbWUpOworCWlmICghbmFtZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljZGV2LT5uYW1lID0gbmFtZTsKKworCWNkZXYtPm1heF9icmlnaHRuZXNzID0gY29uZi5tYXhfYnJpZ2h0bmVzczsKKworCXJldCA9IGNoYW5uZWxfYXR0cl9ncm91cHNfc2V0KGNoYW5uZWwsIGNkZXYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZ2JfbGlnaHRzX2xlZF9vcGVyYXRpb25zX3NldChjaGFubmVsLCBjZGV2KTsKKworCS8qCisJICogSWYgaXQgaXMgbm90IGEgZmxhc2ggcmVsYXRlZCBjaGFubmVsIChmbGFzaCwgdG9yY2ggb3IgaW5kaWNhdG9yKSB3ZQorCSAqIGFyZSBkb25lIGhlcmUuIElmIG5vdCwgY29udGludWUgYW5kIGZldGNoIGZsYXNoIHJlbGF0ZWQKKwkgKiBjb25maWd1cmF0aW9ucy4KKwkgKi8KKwlpZiAoIWlzX2NoYW5uZWxfZmxhc2goY2hhbm5lbCkpCisJCXJldHVybiByZXQ7CisKKwlsaWdodC0+aGFzX2ZsYXNoID0gdHJ1ZTsKKworCXJldCA9IGdiX2xpZ2h0c19jaGFubmVsX2ZsYXNoX2NvbmZpZyhjaGFubmVsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfbGlnaHRzX2xpZ2h0X2NvbmZpZyhzdHJ1Y3QgZ2JfbGlnaHRzICpnbGlnaHRzLCB1OCBpZCkKK3sKKwlzdHJ1Y3QgZ2JfbGlnaHQgKmxpZ2h0ID0gJmdsaWdodHMtPmxpZ2h0c1tpZF07CisJc3RydWN0IGdiX2xpZ2h0c19nZXRfbGlnaHRfY29uZmlnX3JlcXVlc3QgcmVxOworCXN0cnVjdCBnYl9saWdodHNfZ2V0X2xpZ2h0X2NvbmZpZ19yZXNwb25zZSBjb25mOworCWludCByZXQ7CisJaW50IGk7CisKKwlsaWdodC0+Z2xpZ2h0cyA9IGdsaWdodHM7CisJbGlnaHQtPmlkID0gaWQ7CisKKwlyZXEuaWQgPSBpZDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGdsaWdodHMtPmNvbm5lY3Rpb24sCisJCQkJR0JfTElHSFRTX1RZUEVfR0VUX0xJR0hUX0NPTkZJRywKKwkJCQkmcmVxLCBzaXplb2YocmVxKSwgJmNvbmYsIHNpemVvZihjb25mKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoIWNvbmYuY2hhbm5lbF9jb3VudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFzdHJsZW4oY29uZi5uYW1lKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsaWdodC0+Y2hhbm5lbHNfY291bnQgPSBjb25mLmNoYW5uZWxfY291bnQ7CisJbGlnaHQtPm5hbWUgPSBrc3RybmR1cChjb25mLm5hbWUsIE5BTUVTX01BWCwgR0ZQX0tFUk5FTCk7CisKKwlsaWdodC0+Y2hhbm5lbHMgPSBremFsbG9jKGxpZ2h0LT5jaGFubmVsc19jb3VudCAqCisJCQkJICBzaXplb2Yoc3RydWN0IGdiX2NoYW5uZWwpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxpZ2h0LT5jaGFubmVscykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBGaXJzdCB3ZSBjb2xsZWN0IGFsbCB0aGUgY29uZmlndXJhdGlvbnMgZm9yIGFsbCBjaGFubmVscyAqLworCWZvciAoaSA9IDA7IGkgPCBsaWdodC0+Y2hhbm5lbHNfY291bnQ7IGkrKykgeworCQlsaWdodC0+Y2hhbm5lbHNbaV0uaWQgPSBpOworCQlyZXQgPSBnYl9saWdodHNfY2hhbm5lbF9jb25maWcobGlnaHQsICZsaWdodC0+Y2hhbm5lbHNbaV0pOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JfbGlnaHRzX2xpZ2h0X3JlZ2lzdGVyKHN0cnVjdCBnYl9saWdodCAqbGlnaHQpCit7CisJaW50IHJldDsKKwlpbnQgaTsKKworCS8qCisJICogVGhlbiwgaWYgZXZlcnl0aGluZyB3ZW50IG9rIGluIGdldHRpbmcgY29uZmlndXJhdGlvbnMsIHdlIHJlZ2lzdGVyCisJICogdGhlIGNsYXNzZGV2LCBmbGFzaCBjbGFzc2RldiBhbmQgdjRsMiBzdWJzeXN0ZW0sIGlmIGEgZmxhc2ggZGV2aWNlIGlzCisJICogZm91bmQuCisJICovCisJZm9yIChpID0gMDsgaSA8IGxpZ2h0LT5jaGFubmVsc19jb3VudDsgaSsrKSB7CisJCXJldCA9IGdiX2xpZ2h0c19jaGFubmVsX3JlZ2lzdGVyKCZsaWdodC0+Y2hhbm5lbHNbaV0pOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJbXV0ZXhfaW5pdCgmbGlnaHQtPmNoYW5uZWxzW2ldLmxvY2spOworCX0KKworCWxpZ2h0LT5yZWFkeSA9IHRydWU7CisKKwlpZiAobGlnaHQtPmhhc19mbGFzaCkgeworCQlyZXQgPSBnYl9saWdodHNfbGlnaHRfdjRsMl9yZWdpc3RlcihsaWdodCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlsaWdodC0+aGFzX2ZsYXNoID0gZmFsc2U7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2xpZ2h0c19jaGFubmVsX2ZyZWUoc3RydWN0IGdiX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJa2ZyZWUoY2hhbm5lbC0+YXR0cnMpOworCWtmcmVlKGNoYW5uZWwtPmF0dHJfZ3JvdXApOworCWtmcmVlKGNoYW5uZWwtPmF0dHJfZ3JvdXBzKTsKKwlrZnJlZShjaGFubmVsLT5jb2xvcl9uYW1lKTsKKwlrZnJlZShjaGFubmVsLT5tb2RlX25hbWUpOworCW11dGV4X2Rlc3Ryb3koJmNoYW5uZWwtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBnYl9saWdodHNfY2hhbm5lbF9yZWxlYXNlKHN0cnVjdCBnYl9jaGFubmVsICpjaGFubmVsKQoreworCWNoYW5uZWwtPnJlbGVhc2luZyA9IHRydWU7CisKKwlnYl9saWdodHNfY2hhbm5lbF91bnJlZ2lzdGVyKGNoYW5uZWwpOworCisJZ2JfbGlnaHRzX2NoYW5uZWxfZnJlZShjaGFubmVsKTsKK30KKworc3RhdGljIHZvaWQgZ2JfbGlnaHRzX2xpZ2h0X3JlbGVhc2Uoc3RydWN0IGdiX2xpZ2h0ICpsaWdodCkKK3sKKwlpbnQgaTsKKwlpbnQgY291bnQ7CisKKwlsaWdodC0+cmVhZHkgPSBmYWxzZTsKKworCWNvdW50ID0gbGlnaHQtPmNoYW5uZWxzX2NvdW50OworCisJaWYgKGxpZ2h0LT5oYXNfZmxhc2gpCisJCWdiX2xpZ2h0c19saWdodF92NGwyX3VucmVnaXN0ZXIobGlnaHQpOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJZ2JfbGlnaHRzX2NoYW5uZWxfcmVsZWFzZSgmbGlnaHQtPmNoYW5uZWxzW2ldKTsKKwkJbGlnaHQtPmNoYW5uZWxzX2NvdW50LS07CisJfQorCWtmcmVlKGxpZ2h0LT5jaGFubmVscyk7CisJa2ZyZWUobGlnaHQtPm5hbWUpOworfQorCitzdGF0aWMgdm9pZCBnYl9saWdodHNfcmVsZWFzZShzdHJ1Y3QgZ2JfbGlnaHRzICpnbGlnaHRzKQoreworCWludCBpOworCisJaWYgKCFnbGlnaHRzKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZnbGlnaHRzLT5saWdodHNfbG9jayk7CisJaWYgKCFnbGlnaHRzLT5saWdodHMpCisJCWdvdG8gZnJlZV9nbGlnaHRzOworCisJZm9yIChpID0gMDsgaSA8IGdsaWdodHMtPmxpZ2h0c19jb3VudDsgaSsrKQorCQlnYl9saWdodHNfbGlnaHRfcmVsZWFzZSgmZ2xpZ2h0cy0+bGlnaHRzW2ldKTsKKworCWtmcmVlKGdsaWdodHMtPmxpZ2h0cyk7CisKK2ZyZWVfZ2xpZ2h0czoKKwltdXRleF91bmxvY2soJmdsaWdodHMtPmxpZ2h0c19sb2NrKTsKKwltdXRleF9kZXN0cm95KCZnbGlnaHRzLT5saWdodHNfbG9jayk7CisJa2ZyZWUoZ2xpZ2h0cyk7Cit9CisKK3N0YXRpYyBpbnQgZ2JfbGlnaHRzX2dldF9jb3VudChzdHJ1Y3QgZ2JfbGlnaHRzICpnbGlnaHRzKQoreworCXN0cnVjdCBnYl9saWdodHNfZ2V0X2xpZ2h0c19yZXNwb25zZSByZXNwOworCWludCByZXQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhnbGlnaHRzLT5jb25uZWN0aW9uLCBHQl9MSUdIVFNfVFlQRV9HRVRfTElHSFRTLAorCQkJCU5VTEwsIDAsICZyZXNwLCBzaXplb2YocmVzcCkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKCFyZXNwLmxpZ2h0c19jb3VudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlnbGlnaHRzLT5saWdodHNfY291bnQgPSByZXNwLmxpZ2h0c19jb3VudDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX2xpZ2h0c19jcmVhdGVfYWxsKHN0cnVjdCBnYl9saWdodHMgKmdsaWdodHMpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBnbGlnaHRzLT5jb25uZWN0aW9uOworCWludCByZXQ7CisJaW50IGk7CisKKwltdXRleF9sb2NrKCZnbGlnaHRzLT5saWdodHNfbG9jayk7CisJcmV0ID0gZ2JfbGlnaHRzX2dldF9jb3VudChnbGlnaHRzKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlnbGlnaHRzLT5saWdodHMgPSBremFsbG9jKGdsaWdodHMtPmxpZ2h0c19jb3VudCAqCisJCQkJICBzaXplb2Yoc3RydWN0IGdiX2xpZ2h0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFnbGlnaHRzLT5saWdodHMpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGdsaWdodHMtPmxpZ2h0c19jb3VudDsgaSsrKSB7CisJCXJldCA9IGdiX2xpZ2h0c19saWdodF9jb25maWcoZ2xpZ2h0cywgaSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZjb25uZWN0aW9uLT5idW5kbGUtPmRldiwKKwkJCQkiRmFpbCB0byBjb25maWd1cmUgbGlnaHRzIGRldmljZVxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworb3V0OgorCW11dGV4X3VubG9jaygmZ2xpZ2h0cy0+bGlnaHRzX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfbGlnaHRzX3JlZ2lzdGVyX2FsbChzdHJ1Y3QgZ2JfbGlnaHRzICpnbGlnaHRzKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZ2xpZ2h0cy0+Y29ubmVjdGlvbjsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJmdsaWdodHMtPmxpZ2h0c19sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgZ2xpZ2h0cy0+bGlnaHRzX2NvdW50OyBpKyspIHsKKwkJcmV0ID0gZ2JfbGlnaHRzX2xpZ2h0X3JlZ2lzdGVyKCZnbGlnaHRzLT5saWdodHNbaV0pOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycigmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsCisJCQkJIkZhaWwgdG8gZW5hYmxlIGxpZ2h0cyBkZXZpY2VcbiIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwltdXRleF91bmxvY2soJmdsaWdodHMtPmxpZ2h0c19sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX2xpZ2h0c19yZXF1ZXN0X2hhbmRsZXIoc3RydWN0IGdiX29wZXJhdGlvbiAqb3ApCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBvcC0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXY7CisJc3RydWN0IGdiX2xpZ2h0cyAqZ2xpZ2h0cyA9IGdiX2Nvbm5lY3Rpb25fZ2V0X2RhdGEoY29ubmVjdGlvbik7CisJc3RydWN0IGdiX2xpZ2h0ICpsaWdodDsKKwlzdHJ1Y3QgZ2JfbWVzc2FnZSAqcmVxdWVzdDsKKwlzdHJ1Y3QgZ2JfbGlnaHRzX2V2ZW50X3JlcXVlc3QgKnBheWxvYWQ7CisJaW50IHJldCA9ICAwOworCXU4IGxpZ2h0X2lkOworCXU4IGV2ZW50OworCisJaWYgKG9wLT50eXBlICE9IEdCX0xJR0hUU19UWVBFX0VWRU5UKSB7CisJCWRldl9lcnIoZGV2LCAiVW5zdXBwb3J0ZWQgdW5zb2xpY2l0ZWQgZXZlbnQ6ICV1XG4iLCBvcC0+dHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlcXVlc3QgPSBvcC0+cmVxdWVzdDsKKworCWlmIChyZXF1ZXN0LT5wYXlsb2FkX3NpemUgPCBzaXplb2YoKnBheWxvYWQpKSB7CisJCWRldl9lcnIoZGV2LCAiV3JvbmcgZXZlbnQgc2l6ZSByZWNlaXZlZCAoJXp1IDwgJXp1KVxuIiwKKwkJCXJlcXVlc3QtPnBheWxvYWRfc2l6ZSwgc2l6ZW9mKCpwYXlsb2FkKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBheWxvYWQgPSByZXF1ZXN0LT5wYXlsb2FkOworCWxpZ2h0X2lkID0gcGF5bG9hZC0+bGlnaHRfaWQ7CisKKwlpZiAobGlnaHRfaWQgPj0gZ2xpZ2h0cy0+bGlnaHRzX2NvdW50IHx8CisJICAgICFnbGlnaHRzLT5saWdodHNbbGlnaHRfaWRdLnJlYWR5KSB7CisJCWRldl9lcnIoZGV2LCAiRXZlbnQgcmVjZWl2ZWQgZm9yIHVuY29uZmlndXJlZCBsaWdodCBpZDogJWRcbiIsCisJCQlsaWdodF9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWV2ZW50ID0gcGF5bG9hZC0+ZXZlbnQ7CisKKwlpZiAoZXZlbnQgJiBHQl9MSUdIVFNfTElHSFRfQ09ORklHKSB7CisJCWxpZ2h0ID0gJmdsaWdodHMtPmxpZ2h0c1tsaWdodF9pZF07CisKKwkJbXV0ZXhfbG9jaygmZ2xpZ2h0cy0+bGlnaHRzX2xvY2spOworCQlnYl9saWdodHNfbGlnaHRfcmVsZWFzZShsaWdodCk7CisJCXJldCA9IGdiX2xpZ2h0c19saWdodF9jb25maWcoZ2xpZ2h0cywgbGlnaHRfaWQpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IGdiX2xpZ2h0c19saWdodF9yZWdpc3RlcihsaWdodCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ2JfbGlnaHRzX2xpZ2h0X3JlbGVhc2UobGlnaHQpOworCQltdXRleF91bmxvY2soJmdsaWdodHMtPmxpZ2h0c19sb2NrKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX2xpZ2h0c19wcm9iZShzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUsCisJCQkgICBjb25zdCBzdHJ1Y3QgZ3JleWJ1c19idW5kbGVfaWQgKmlkKQoreworCXN0cnVjdCBncmV5YnVzX2Rlc2NyaXB0b3JfY3BvcnQgKmNwb3J0X2Rlc2M7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisJc3RydWN0IGdiX2xpZ2h0cyAqZ2xpZ2h0czsKKwlpbnQgcmV0OworCisJaWYgKGJ1bmRsZS0+bnVtX2Nwb3J0cyAhPSAxKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWNwb3J0X2Rlc2MgPSAmYnVuZGxlLT5jcG9ydF9kZXNjWzBdOworCWlmIChjcG9ydF9kZXNjLT5wcm90b2NvbF9pZCAhPSBHUkVZQlVTX1BST1RPQ09MX0xJR0hUUykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlnbGlnaHRzID0ga3phbGxvYyhzaXplb2YoKmdsaWdodHMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdsaWdodHMpCisJCXJldHVybiAtRU5PTUVNOworCisJbXV0ZXhfaW5pdCgmZ2xpZ2h0cy0+bGlnaHRzX2xvY2spOworCisJY29ubmVjdGlvbiA9IGdiX2Nvbm5lY3Rpb25fY3JlYXRlKGJ1bmRsZSwgbGUxNl90b19jcHUoY3BvcnRfZGVzYy0+aWQpLAorCQkJCQkgIGdiX2xpZ2h0c19yZXF1ZXN0X2hhbmRsZXIpOworCWlmIChJU19FUlIoY29ubmVjdGlvbikpIHsKKwkJcmV0ID0gUFRSX0VSUihjb25uZWN0aW9uKTsKKwkJZ290byBvdXQ7CisJfQorCisJZ2xpZ2h0cy0+Y29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisJZ2JfY29ubmVjdGlvbl9zZXRfZGF0YShjb25uZWN0aW9uLCBnbGlnaHRzKTsKKworCWdyZXlidXNfc2V0X2RydmRhdGEoYnVuZGxlLCBnbGlnaHRzKTsKKworCS8qIFdlIGFyZW4ndCByZWFkeSB0byByZWNlaXZlIGFuIGluY29taW5nIHJlcXVlc3QgeWV0ICovCisJcmV0ID0gZ2JfY29ubmVjdGlvbl9lbmFibGVfdHgoY29ubmVjdGlvbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9jb25uZWN0aW9uX2Rlc3Ryb3k7CisKKwkvKgorCSAqIFNldHVwIGFsbCB0aGUgbGlnaHRzIGRldmljZXMgb3ZlciB0aGlzIGNvbm5lY3Rpb24sIGlmIGFueXRoaW5nIGdvZXMKKwkgKiB3cm9uZyB0ZWFyIGRvd24gYWxsIGxpZ2h0cworCSAqLworCXJldCA9IGdiX2xpZ2h0c19jcmVhdGVfYWxsKGdsaWdodHMpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX2Nvbm5lY3Rpb25fZGlzYWJsZTsKKworCS8qIFdlIGFyZSByZWFkeSB0byByZWNlaXZlIGFuIGluY29taW5nIHJlcXVlc3Qgbm93LCBlbmFibGUgUlggYXMgd2VsbCAqLworCXJldCA9IGdiX2Nvbm5lY3Rpb25fZW5hYmxlKGNvbm5lY3Rpb24pOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfY29ubmVjdGlvbl9kaXNhYmxlOworCisJLyogRW5hYmxlICYgcmVnaXN0ZXIgbGlnaHRzICovCisJcmV0ID0gZ2JfbGlnaHRzX3JlZ2lzdGVyX2FsbChnbGlnaHRzKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcl9jb25uZWN0aW9uX2Rpc2FibGU7CisKKwlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChidW5kbGUpOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2Nvbm5lY3Rpb25fZGlzYWJsZToKKwlnYl9jb25uZWN0aW9uX2Rpc2FibGUoY29ubmVjdGlvbik7CitlcnJvcl9jb25uZWN0aW9uX2Rlc3Ryb3k6CisJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGNvbm5lY3Rpb24pOworb3V0OgorCWdiX2xpZ2h0c19yZWxlYXNlKGdsaWdodHMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2xpZ2h0c19kaXNjb25uZWN0KHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSkKK3sKKwlzdHJ1Y3QgZ2JfbGlnaHRzICpnbGlnaHRzID0gZ3JleWJ1c19nZXRfZHJ2ZGF0YShidW5kbGUpOworCisJaWYgKGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoYnVuZGxlKSkKKwkJZ2JfcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoYnVuZGxlKTsKKworCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShnbGlnaHRzLT5jb25uZWN0aW9uKTsKKwlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koZ2xpZ2h0cy0+Y29ubmVjdGlvbik7CisKKwlnYl9saWdodHNfcmVsZWFzZShnbGlnaHRzKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBncmV5YnVzX2J1bmRsZV9pZCBnYl9saWdodHNfaWRfdGFibGVbXSA9IHsKKwl7IEdSRVlCVVNfREVWSUNFX0NMQVNTKEdSRVlCVVNfQ0xBU1NfTElHSFRTKSB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoZ3JleWJ1cywgZ2JfbGlnaHRzX2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBncmV5YnVzX2RyaXZlciBnYl9saWdodHNfZHJpdmVyID0geworCS5uYW1lCQk9ICJsaWdodHMiLAorCS5wcm9iZQkJPSBnYl9saWdodHNfcHJvYmUsCisJLmRpc2Nvbm5lY3QJPSBnYl9saWdodHNfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUJPSBnYl9saWdodHNfaWRfdGFibGUsCit9OworbW9kdWxlX2dyZXlidXNfZHJpdmVyKGdiX2xpZ2h0c19kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9sb2cuYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2xvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZGQ5ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9sb2cuYwpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIEdyZXlidXMgZHJpdmVyIGZvciB0aGUgbG9nIHByb3RvY29sCisgKgorICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zaXplcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgImdyZXlidXMuaCIKKworc3RydWN0IGdiX2xvZyB7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247Cit9OworCitzdGF0aWMgaW50IGdiX2xvZ19yZXF1ZXN0X2hhbmRsZXIoc3RydWN0IGdiX29wZXJhdGlvbiAqb3ApCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBvcC0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXY7CisJc3RydWN0IGdiX2xvZ19zZW5kX2xvZ19yZXF1ZXN0ICpyZWNlaXZlOworCXUxNiBsZW47CisKKwlpZiAob3AtPnR5cGUgIT0gR0JfTE9HX1RZUEVfU0VORF9MT0cpIHsKKwkJZGV2X2VycihkZXYsICJ1bmtub3duIHJlcXVlc3QgdHlwZSAweCUwMnhcbiIsIG9wLT50eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogVmVyaWZ5IHNpemUgb2YgcGF5bG9hZCAqLworCWlmIChvcC0+cmVxdWVzdC0+cGF5bG9hZF9zaXplIDwgc2l6ZW9mKCpyZWNlaXZlKSkgeworCQlkZXZfZXJyKGRldiwgImxvZyByZXF1ZXN0IHRvbyBzbWFsbCAoJXp1IDwgJXp1KVxuIiwKKwkJCQlvcC0+cmVxdWVzdC0+cGF5bG9hZF9zaXplLCBzaXplb2YoKnJlY2VpdmUpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJlY2VpdmUgPSBvcC0+cmVxdWVzdC0+cGF5bG9hZDsKKwlsZW4gPSBsZTE2X3RvX2NwdShyZWNlaXZlLT5sZW4pOworCWlmIChsZW4gIT0gKGludCkob3AtPnJlcXVlc3QtPnBheWxvYWRfc2l6ZSAtIHNpemVvZigqcmVjZWl2ZSkpKSB7CisJCWRldl9lcnIoZGV2LCAibG9nIHJlcXVlc3Qgd3Jvbmcgc2l6ZSAlZCB2cyAlZFxuIiwgbGVuLAorCQkJCShpbnQpKG9wLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUgLSBzaXplb2YoKnJlY2VpdmUpKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAobGVuID09IDApIHsKKwkJZGV2X2VycihkZXYsICJsb2cgcmVxdWVzdCBvZiAwIGJ5dGVzP1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChsZW4gPiBHQl9MT0dfTUFYX0xFTikgeworCQlkZXZfZXJyKGRldiwgImxvZyByZXF1ZXN0IHRvbyBiaWc6ICVkXG4iLCBsZW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBFbnN1cmUgdGhlIGJ1ZmZlciBpcyAwIHRlcm1pbmF0ZWQgKi8KKwlyZWNlaXZlLT5tc2dbbGVuIC0gMV0gPSAnXDAnOworCisJLyogUHJpbnQgd2l0aCBkZXZfZGJnKCkgc28gdGhhdCBpdCBjYW4gYmUgZWFzaWx5IHR1cm5lZCBvZmYgdXNpbmcKKwkgKiBkeW5hbWljIGRlYnVnZ2luZyAoYW5kIHByZXZlbnQgYW55IERvUykgKi8KKwlkZXZfZGJnKGRldiwgIiVzIiwgcmVjZWl2ZS0+bXNnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX2xvZ19wcm9iZShzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUsCisJCQljb25zdCBzdHJ1Y3QgZ3JleWJ1c19idW5kbGVfaWQgKmlkKQoreworCXN0cnVjdCBncmV5YnVzX2Rlc2NyaXB0b3JfY3BvcnQgKmNwb3J0X2Rlc2M7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisJc3RydWN0IGdiX2xvZyAqbG9nOworCWludCByZXR2YWw7CisKKwlpZiAoYnVuZGxlLT5udW1fY3BvcnRzICE9IDEpCisJCXJldHVybiAtRU5PREVWOworCisJY3BvcnRfZGVzYyA9ICZidW5kbGUtPmNwb3J0X2Rlc2NbMF07CisJaWYgKGNwb3J0X2Rlc2MtPnByb3RvY29sX2lkICE9IEdSRVlCVVNfUFJPVE9DT0xfTE9HKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWxvZyA9IGt6YWxsb2Moc2l6ZW9mKCpsb2cpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxvZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljb25uZWN0aW9uID0gZ2JfY29ubmVjdGlvbl9jcmVhdGUoYnVuZGxlLCBsZTE2X3RvX2NwdShjcG9ydF9kZXNjLT5pZCksCisJCQlnYl9sb2dfcmVxdWVzdF9oYW5kbGVyKTsKKwlpZiAoSVNfRVJSKGNvbm5lY3Rpb24pKSB7CisJCXJldHZhbCA9IFBUUl9FUlIoY29ubmVjdGlvbik7CisJCWdvdG8gZXJyb3JfZnJlZTsKKwl9CisKKwlsb2ctPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCWdyZXlidXNfc2V0X2RydmRhdGEoYnVuZGxlLCBsb2cpOworCisJcmV0dmFsID0gZ2JfY29ubmVjdGlvbl9lbmFibGUoY29ubmVjdGlvbik7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvcl9jb25uZWN0aW9uX2Rlc3Ryb3k7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfY29ubmVjdGlvbl9kZXN0cm95OgorCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShjb25uZWN0aW9uKTsKK2Vycm9yX2ZyZWU6CisJa2ZyZWUobG9nKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBnYl9sb2dfZGlzY29ubmVjdChzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUpCit7CisJc3RydWN0IGdiX2xvZyAqbG9nID0gZ3JleWJ1c19nZXRfZHJ2ZGF0YShidW5kbGUpOworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gbG9nLT5jb25uZWN0aW9uOworCisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGNvbm5lY3Rpb24pOworCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShjb25uZWN0aW9uKTsKKworCWtmcmVlKGxvZyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3JleWJ1c19idW5kbGVfaWQgZ2JfbG9nX2lkX3RhYmxlW10gPSB7CisJeyBHUkVZQlVTX0RFVklDRV9DTEFTUyhHUkVZQlVTX0NMQVNTX0xPRykgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGdyZXlidXMsIGdiX2xvZ19pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZ3JleWJ1c19kcml2ZXIgZ2JfbG9nX2RyaXZlciA9IHsKKwkubmFtZSAgICAgICAgICAgPSAibG9nIiwKKwkucHJvYmUgICAgICAgICAgPSBnYl9sb2dfcHJvYmUsCisJLmRpc2Nvbm5lY3QgICAgID0gZ2JfbG9nX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlICAgICAgID0gZ2JfbG9nX2lkX3RhYmxlLAorfTsKK21vZHVsZV9ncmV5YnVzX2RyaXZlcihnYl9sb2dfZHJpdmVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvbG9vcGJhY2suYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2xvb3BiYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg4MjMwNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2xvb3BiYWNrLmMKQEAgLTAsMCArMSwxMzY0IEBACisvKgorICogTG9vcGJhY2sgYnJpZGdlIGRyaXZlciBmb3IgdGhlIEdyZXlidXMgbG9vcGJhY2sgbW9kdWxlLgorICoKKyAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNCBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpemVzLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdF9zb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisKKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKworI2luY2x1ZGUgImdyZXlidXMuaCIKKyNpbmNsdWRlICJjb25uZWN0aW9uLmgiCisKKyNkZWZpbmUgTlNFQ19QRVJfREFZIDg2NDAwMDAwMDAwMDAwVUxMCisKK3N0cnVjdCBnYl9sb29wYmFja19zdGF0cyB7CisJdTMyIG1pbjsKKwl1MzIgbWF4OworCXU2NCBzdW07CisJdTMyIGNvdW50OworfTsKKworc3RydWN0IGdiX2xvb3BiYWNrX2RldmljZSB7CisJc3RydWN0IGRlbnRyeSAqcm9vdDsKKwl1MzIgY291bnQ7CisJc2l6ZV90IHNpemVfbWF4OworCisJLyogV2UgbmVlZCB0byB0YWtlIGEgbG9jayBpbiBhdG9taWMgY29udGV4dCAqLworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0X29wX2FzeW5jOworCXdhaXRfcXVldWVfaGVhZF90IHdxOworfTsKKworc3RhdGljIHN0cnVjdCBnYl9sb29wYmFja19kZXZpY2UgZ2JfZGV2OworCitzdHJ1Y3QgZ2JfbG9vcGJhY2tfYXN5bmNfb3BlcmF0aW9uIHsKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2sgKmdiOworCXN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbjsKKwlzdHJ1Y3QgdGltZXZhbCB0czsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJ5OworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXN0cnVjdCBrcmVmIGtyZWY7CisJYm9vbCBwZW5kaW5nOworCWludCAoKmNvbXBsZXRpb24pKHN0cnVjdCBnYl9sb29wYmFja19hc3luY19vcGVyYXRpb24gKm9wX2FzeW5jKTsKK307CisKK3N0cnVjdCBnYl9sb29wYmFjayB7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisKKwlzdHJ1Y3QgZGVudHJ5ICpmaWxlOworCXN0cnVjdCBrZmlmbyBrZmlmb19sYXQ7CisJc3RydWN0IGtmaWZvIGtmaWZvX3RzOworCXN0cnVjdCBtdXRleCBtdXRleDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisJc3RydWN0IGxpc3RfaGVhZCBlbnRyeTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd3E7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd3FfY29tcGxldGlvbjsKKwlhdG9taWNfdCBvdXRzdGFuZGluZ19vcGVyYXRpb25zOworCisJLyogUGVyIGNvbm5lY3Rpb24gc3RhdHMgKi8KKwlzdHJ1Y3QgdGltZXZhbCB0czsKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2tfc3RhdHMgbGF0ZW5jeTsKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2tfc3RhdHMgdGhyb3VnaHB1dDsKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2tfc3RhdHMgcmVxdWVzdHNfcGVyX3NlY29uZDsKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2tfc3RhdHMgYXBicmlkZ2VfdW5pcHJvX2xhdGVuY3k7CisJc3RydWN0IGdiX2xvb3BiYWNrX3N0YXRzIGdicGh5X2Zpcm13YXJlX2xhdGVuY3k7CisKKwlpbnQgdHlwZTsKKwlpbnQgYXN5bmM7CisJaW50IGlkOworCXUzMiBzaXplOworCXUzMiBpdGVyYXRpb25fbWF4OworCXUzMiBpdGVyYXRpb25fY291bnQ7CisJaW50IHVzX3dhaXQ7CisJdTMyIGVycm9yOworCXUzMiByZXF1ZXN0c19jb21wbGV0ZWQ7CisJdTMyIHJlcXVlc3RzX3RpbWVkb3V0OworCXUzMiB0aW1lb3V0OworCXUzMiBqaWZmeV90aW1lb3V0OworCXUzMiB0aW1lb3V0X21pbjsKKwl1MzIgdGltZW91dF9tYXg7CisJdTMyIG91dHN0YW5kaW5nX29wZXJhdGlvbnNfbWF4OworCXUzMiBsYmlkOworCXU2NCBlbGFwc2VkX25zZWNzOworCXUzMiBhcGJyaWRnZV9sYXRlbmN5X3RzOworCXUzMiBnYnBoeV9sYXRlbmN5X3RzOworCisJdTMyIHNlbmRfY291bnQ7Cit9OworCitzdGF0aWMgc3RydWN0IGNsYXNzIGxvb3BiYWNrX2NsYXNzID0geworCS5uYW1lCQk9ICJnYl9sb29wYmFjayIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKK3N0YXRpYyBERUZJTkVfSURBKGxvb3BiYWNrX2lkYSk7CisKKy8qIE1pbi9tYXggdmFsdWVzIGluIGppZmZpZXMgKi8KKyNkZWZpbmUgR0JfTE9PUEJBQ0tfVElNRU9VVF9NSU4JCQkJMQorI2RlZmluZSBHQl9MT09QQkFDS19USU1FT1VUX01BWAkJCQkxMDAwMAorCisjZGVmaW5lIEdCX0xPT1BCQUNLX0ZJRk9fREVGQVVMVAkJCTgxOTIKKworc3RhdGljIHVuc2lnbmVkIGtmaWZvX2RlcHRoID0gR0JfTE9PUEJBQ0tfRklGT19ERUZBVUxUOworbW9kdWxlX3BhcmFtKGtmaWZvX2RlcHRoLCB1aW50LCAwNDQ0KTsKKworLyogTWF4aW11bSBzaXplIG9mIGFueSBvbmUgc2VuZCBkYXRhIGJ1ZmZlciB3ZSBzdXBwb3J0ICovCisjZGVmaW5lIE1BWF9QQUNLRVRfU0laRSAoUEFHRV9TSVpFICogMikKKworI2RlZmluZSBHQl9MT09QQkFDS19VU19XQUlUX01BWAkJCQkxMDAwMDAwCisKKy8qIGludGVyZmFjZSBzeXNmcyBhdHRyaWJ1dGVzICovCisjZGVmaW5lIGdiX2xvb3BiYWNrX3JvX2F0dHIoZmllbGQpCQkJCVwKK3N0YXRpYyBzc2l6ZV90IGZpZWxkIyNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAkJXAorCQkJICAgIGNoYXIgKmJ1ZikJCQkJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IGdiX2xvb3BiYWNrICpnYiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZ2ItPmZpZWxkKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSX1JPKGZpZWxkKQorCisjZGVmaW5lIGdiX2xvb3BiYWNrX3JvX3N0YXRzX2F0dHIobmFtZSwgZmllbGQsIHR5cGUpCQlcCitzdGF0aWMgc3NpemVfdCBuYW1lIyNfIyNmaWVsZCMjX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAlcCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCQlcCisJCQkgICAgY2hhciAqYnVmKQkJCQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2sgKmdiID0gZGV2X2dldF9kcnZkYXRhKGRldik7CQkJXAorCS8qIFJlcG9ydCAwIGZvciBtaW4gYW5kIG1heCBpZiBubyB0cmFuc2ZlciBzdWNjZXNzZWQgKi8JCVwKKwlpZiAoIWdiLT5yZXF1ZXN0c19jb21wbGV0ZWQpCQkJCQlcCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjBcbiIpOwkJCQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJSIjdHlwZSJcbiIsIGdiLT5uYW1lLmZpZWxkKTsJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhuYW1lIyNfIyNmaWVsZCkKKworI2RlZmluZSBnYl9sb29wYmFja19yb19hdmdfYXR0cihuYW1lKQkJCVwKK3N0YXRpYyBzc2l6ZV90IG5hbWUjI19hdmdfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCQlcCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCQlcCisJCQkgICAgY2hhciAqYnVmKQkJCQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2tfc3RhdHMgKnN0YXRzOwkJCQlcCisJc3RydWN0IGdiX2xvb3BiYWNrICpnYjsJCQkJCQlcCisJdTY0IGF2ZywgcmVtOwkJCQkJCQlcCisJdTMyIGNvdW50OwkJCQkJCQlcCisJZ2IgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCQlcCisJc3RhdHMgPSAmZ2ItPm5hbWU7CQkJCQlcCisJY291bnQgPSBzdGF0cy0+Y291bnQgPyBzdGF0cy0+Y291bnQgOiAxOwkJCVwKKwlhdmcgPSBzdGF0cy0+c3VtICsgY291bnQgLyAyMDAwMDAwOyAvKiByb3VuZCBjbG9zZXN0ICovCQlcCisJcmVtID0gZG9fZGl2KGF2ZywgY291bnQpOwkJCQkJXAorCXJlbSAqPSAxMDAwMDAwOwkJCQkJCQlcCisJZG9fZGl2KHJlbSwgY291bnQpOwkJCQkJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbGx1LiUwNnVcbiIsIGF2ZywgKHUzMilyZW0pOwkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhuYW1lIyNfYXZnKQorCisjZGVmaW5lIGdiX2xvb3BiYWNrX3N0YXRzX2F0dHJzKGZpZWxkKQkJCQlcCisJZ2JfbG9vcGJhY2tfcm9fc3RhdHNfYXR0cihmaWVsZCwgbWluLCB1KTsJCVwKKwlnYl9sb29wYmFja19yb19zdGF0c19hdHRyKGZpZWxkLCBtYXgsIHUpOwkJXAorCWdiX2xvb3BiYWNrX3JvX2F2Z19hdHRyKGZpZWxkKQorCisjZGVmaW5lIGdiX2xvb3BiYWNrX2F0dHIoZmllbGQsIHR5cGUpCQkJCQlcCitzdGF0aWMgc3NpemVfdCBmaWVsZCMjX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAkJCQlcCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCQlcCisJCQkgICAgY2hhciAqYnVmKQkJCQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2sgKmdiID0gZGV2X2dldF9kcnZkYXRhKGRldik7CQkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiUiI3R5cGUiXG4iLCBnYi0+ZmllbGQpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBmaWVsZCMjX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwJCQlcCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCQlcCisJCQkgICAgY29uc3QgY2hhciAqYnVmLAkJCQlcCisJCQkgICAgc2l6ZV90IGxlbikJCQkJCVwKK3sJCQkJCQkJCQlcCisJaW50IHJldDsJCQkJCQkJXAorCXN0cnVjdCBnYl9sb29wYmFjayAqZ2IgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCQlcCisJbXV0ZXhfbG9jaygmZ2ItPm11dGV4KTsJCQkJCQlcCisJcmV0ID0gc3NjYW5mKGJ1ZiwgIiUiI3R5cGUsICZnYi0+ZmllbGQpOwkJCVwKKwlpZiAocmV0ICE9IDEpCQkJCQkJCVwKKwkJbGVuID0gLUVJTlZBTDsJCQkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQlnYl9sb29wYmFja19jaGVja19hdHRyKGdiLCBidW5kbGUpOwkJCVwKKwltdXRleF91bmxvY2soJmdiLT5tdXRleCk7CQkJCQlcCisJcmV0dXJuIGxlbjsJCQkJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBERVZJQ0VfQVRUUl9SVyhmaWVsZCkKKworI2RlZmluZSBnYl9kZXZfbG9vcGJhY2tfcm9fYXR0cihmaWVsZCwgY29ubikJCQkJXAorc3RhdGljIHNzaXplX3QgZmllbGQjI19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwJCVwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJCVwKKwkJCSAgICBjaGFyICpidWYpCQkJCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBnYl9sb29wYmFjayAqZ2IgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGdiLT5maWVsZCk7CQkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFJfUk8oZmllbGQpCisKKyNkZWZpbmUgZ2JfZGV2X2xvb3BiYWNrX3J3X2F0dHIoZmllbGQsIHR5cGUpCQkJCVwKK3N0YXRpYyBzc2l6ZV90IGZpZWxkIyNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJCVwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJCVwKKwkJCSAgICBjaGFyICpidWYpCQkJCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBnYl9sb29wYmFjayAqZ2IgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJSIjdHlwZSJcbiIsIGdiLT5maWVsZCk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IGZpZWxkIyNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAkJCVwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJCVwKKwkJCSAgICBjb25zdCBjaGFyICpidWYsCQkJCVwKKwkJCSAgICBzaXplX3QgbGVuKQkJCQkJXAorewkJCQkJCQkJCVwKKwlpbnQgcmV0OwkJCQkJCQlcCisJc3RydWN0IGdiX2xvb3BiYWNrICpnYiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJCVwKKwltdXRleF9sb2NrKCZnYi0+bXV0ZXgpOwkJCQkJCVwKKwlyZXQgPSBzc2NhbmYoYnVmLCAiJSIjdHlwZSwgJmdiLT5maWVsZCk7CQkJXAorCWlmIChyZXQgIT0gMSkJCQkJCQkJXAorCQlsZW4gPSAtRUlOVkFMOwkJCQkJCVwKKwllbHNlCQkJCQkJCQlcCisJCWdiX2xvb3BiYWNrX2NoZWNrX2F0dHIoZ2IpOwkJXAorCW11dGV4X3VubG9jaygmZ2ItPm11dGV4KTsJCQkJCVwKKwlyZXR1cm4gbGVuOwkJCQkJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSX1JXKGZpZWxkKQorCitzdGF0aWMgdm9pZCBnYl9sb29wYmFja19yZXNldF9zdGF0cyhzdHJ1Y3QgZ2JfbG9vcGJhY2sgKmdiKTsKK3N0YXRpYyB2b2lkIGdiX2xvb3BiYWNrX2NoZWNrX2F0dHIoc3RydWN0IGdiX2xvb3BiYWNrICpnYikKK3sKKwlpZiAoZ2ItPnVzX3dhaXQgPiBHQl9MT09QQkFDS19VU19XQUlUX01BWCkKKwkJZ2ItPnVzX3dhaXQgPSBHQl9MT09QQkFDS19VU19XQUlUX01BWDsKKwlpZiAoZ2ItPnNpemUgPiBnYl9kZXYuc2l6ZV9tYXgpCisJCWdiLT5zaXplID0gZ2JfZGV2LnNpemVfbWF4OworCWdiLT5yZXF1ZXN0c190aW1lZG91dCA9IDA7CisJZ2ItPnJlcXVlc3RzX2NvbXBsZXRlZCA9IDA7CisJZ2ItPml0ZXJhdGlvbl9jb3VudCA9IDA7CisJZ2ItPnNlbmRfY291bnQgPSAwOworCWdiLT5lcnJvciA9IDA7CisKKwlpZiAoa2ZpZm9fZGVwdGggPCBnYi0+aXRlcmF0aW9uX21heCkgeworCQlkZXZfd2FybihnYi0+ZGV2LAorCQkJICJjYW5ub3QgbG9nIGJ5dGVzICV1IGtmaWZvX2RlcHRoICV1XG4iLAorCQkJIGdiLT5pdGVyYXRpb25fbWF4LCBrZmlmb19kZXB0aCk7CisJfQorCWtmaWZvX3Jlc2V0X291dCgmZ2ItPmtmaWZvX2xhdCk7CisJa2ZpZm9fcmVzZXRfb3V0KCZnYi0+a2ZpZm9fdHMpOworCisJc3dpdGNoIChnYi0+dHlwZSkgeworCWNhc2UgR0JfTE9PUEJBQ0tfVFlQRV9QSU5HOgorCWNhc2UgR0JfTE9PUEJBQ0tfVFlQRV9UUkFOU0ZFUjoKKwljYXNlIEdCX0xPT1BCQUNLX1RZUEVfU0lOSzoKKwkJZ2ItPmppZmZ5X3RpbWVvdXQgPSB1c2Vjc190b19qaWZmaWVzKGdiLT50aW1lb3V0KTsKKwkJaWYgKCFnYi0+amlmZnlfdGltZW91dCkKKwkJCWdiLT5qaWZmeV90aW1lb3V0ID0gR0JfTE9PUEJBQ0tfVElNRU9VVF9NSU47CisJCWVsc2UgaWYgKGdiLT5qaWZmeV90aW1lb3V0ID4gR0JfTE9PUEJBQ0tfVElNRU9VVF9NQVgpCisJCQlnYi0+amlmZnlfdGltZW91dCA9IEdCX0xPT1BCQUNLX1RJTUVPVVRfTUFYOworCQlnYl9sb29wYmFja19yZXNldF9zdGF0cyhnYik7CisJCXdha2VfdXAoJmdiLT53cSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdiLT50eXBlID0gMDsKKwkJYnJlYWs7CisJfQorfQorCisvKiBUaW1lIHRvIHNlbmQgYW5kIHJlY2VpdmUgb25lIG1lc3NhZ2UgKi8KK2diX2xvb3BiYWNrX3N0YXRzX2F0dHJzKGxhdGVuY3kpOworLyogTnVtYmVyIG9mIHJlcXVlc3RzIHNlbnQgcGVyIHNlY29uZCBvbiB0aGlzIGNwb3J0ICovCitnYl9sb29wYmFja19zdGF0c19hdHRycyhyZXF1ZXN0c19wZXJfc2Vjb25kKTsKKy8qIFF1YW50aXR5IG9mIGRhdGEgc2VudCBhbmQgcmVjZWl2ZWQgb24gdGhpcyBjcG9ydCAqLworZ2JfbG9vcGJhY2tfc3RhdHNfYXR0cnModGhyb3VnaHB1dCk7CisvKiBMYXRlbmN5IGFjcm9zcyB0aGUgVW5pUHJvIGxpbmsgZnJvbSBBUEJyaWRnZSdzIHBlcnNwZWN0aXZlICovCitnYl9sb29wYmFja19zdGF0c19hdHRycyhhcGJyaWRnZV91bmlwcm9fbGF0ZW5jeSk7CisvKiBGaXJtd2FyZSBpbmR1Y2VkIG92ZXJoZWFkIGluIHRoZSBHUEJyaWRnZSAqLworZ2JfbG9vcGJhY2tfc3RhdHNfYXR0cnMoZ2JwaHlfZmlybXdhcmVfbGF0ZW5jeSk7CisKKy8qIE51bWJlciBvZiBlcnJvcnMgZW5jb3VudGVyZWQgZHVyaW5nIGxvb3AgKi8KK2diX2xvb3BiYWNrX3JvX2F0dHIoZXJyb3IpOworLyogTnVtYmVyIG9mIHJlcXVlc3RzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgYXN5bmMgKi8KK2diX2xvb3BiYWNrX3JvX2F0dHIocmVxdWVzdHNfY29tcGxldGVkKTsKKy8qIE51bWJlciBvZiByZXF1ZXN0cyB0aW1lZCBvdXQgYXN5bmMgKi8KK2diX2xvb3BiYWNrX3JvX2F0dHIocmVxdWVzdHNfdGltZWRvdXQpOworLyogVGltZW91dCBtaW5pbXVtIGluIHVzZWNvbmRzICovCitnYl9sb29wYmFja19yb19hdHRyKHRpbWVvdXRfbWluKTsKKy8qIFRpbWVvdXQgbWluaW11bSBpbiB1c2Vjb25kcyAqLworZ2JfbG9vcGJhY2tfcm9fYXR0cih0aW1lb3V0X21heCk7CisKKy8qCisgKiBUeXBlIG9mIGxvb3BiYWNrIG1lc3NhZ2UgdG8gc2VuZCBiYXNlZCBvbiBwcm90b2NvbCB0eXBlIGRlZmluaXRpb25zCisgKiAwID0+IERvbid0IHNlbmQgbWVzc2FnZQorICogMiA9PiBTZW5kIHBpbmcgbWVzc2FnZSBjb250aW51b3VzbHkgKG1lc3NhZ2Ugd2l0aG91dCBwYXlsb2FkKQorICogMyA9PiBTZW5kIHRyYW5zZmVyIG1lc3NhZ2UgY29udGludW91c2x5IChtZXNzYWdlIHdpdGggcGF5bG9hZCwKKyAqCQkJCQkgICBwYXlsb2FkIHJldHVybmVkIGluIHJlc3BvbnNlKQorICogNCA9PiBTZW5kIGEgc2luayBtZXNzYWdlIChtZXNzYWdlIHdpdGggcGF5bG9hZCwgbm8gcGF5bG9hZCBpbiByZXNwb25zZSkKKyAqLworZ2JfZGV2X2xvb3BiYWNrX3J3X2F0dHIodHlwZSwgZCk7CisvKiBTaXplIG9mIHRyYW5zZmVyIG1lc3NhZ2UgcGF5bG9hZDogMC00MDk2IGJ5dGVzICovCitnYl9kZXZfbG9vcGJhY2tfcndfYXR0cihzaXplLCB1KTsKKy8qIFRpbWUgdG8gd2FpdCBiZXR3ZWVuIHR3byBtZXNzYWdlczogMC0xMDAwIG1zICovCitnYl9kZXZfbG9vcGJhY2tfcndfYXR0cih1c193YWl0LCBkKTsKKy8qIE1heGltdW0gaXRlcmF0aW9ucyBmb3IgYSBnaXZlbiBvcGVyYXRpb246IDEtKDJeMzItMSksIDAgaW1wbGllcyBpbmZpbml0ZSAqLworZ2JfZGV2X2xvb3BiYWNrX3J3X2F0dHIoaXRlcmF0aW9uX21heCwgdSk7CisvKiBUaGUgY3VycmVudCBpbmRleCBvZiB0aGUgZm9yIChpID0gMDsgaSA8IGl0ZXJhdGlvbl9tYXg7IGkrKykgbG9vcCAqLworZ2JfZGV2X2xvb3BiYWNrX3JvX2F0dHIoaXRlcmF0aW9uX2NvdW50LCBmYWxzZSk7CisvKiBBIGZsYWcgdG8gaW5kaWNhdGUgc3luY2hyb25vdXMgb3IgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgKi8KK2diX2Rldl9sb29wYmFja19yd19hdHRyKGFzeW5jLCB1KTsKKy8qIFRpbWVvdXQgb2YgYW4gaW5kaXZpZHVhbCBhc3luY2hyb25vdXMgcmVxdWVzdCAqLworZ2JfZGV2X2xvb3BiYWNrX3J3X2F0dHIodGltZW91dCwgdSk7CisvKiBNYXhpbXVtIG51bWJlciBvZiBpbi1mbGlnaHQgb3BlcmF0aW9ucyBiZWZvcmUgYmFjay1vZmYgKi8KK2diX2Rldl9sb29wYmFja19yd19hdHRyKG91dHN0YW5kaW5nX29wZXJhdGlvbnNfbWF4LCB1KTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmxvb3BiYWNrX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2xhdGVuY3lfbWluLmF0dHIsCisJJmRldl9hdHRyX2xhdGVuY3lfbWF4LmF0dHIsCisJJmRldl9hdHRyX2xhdGVuY3lfYXZnLmF0dHIsCisJJmRldl9hdHRyX3JlcXVlc3RzX3Blcl9zZWNvbmRfbWluLmF0dHIsCisJJmRldl9hdHRyX3JlcXVlc3RzX3Blcl9zZWNvbmRfbWF4LmF0dHIsCisJJmRldl9hdHRyX3JlcXVlc3RzX3Blcl9zZWNvbmRfYXZnLmF0dHIsCisJJmRldl9hdHRyX3Rocm91Z2hwdXRfbWluLmF0dHIsCisJJmRldl9hdHRyX3Rocm91Z2hwdXRfbWF4LmF0dHIsCisJJmRldl9hdHRyX3Rocm91Z2hwdXRfYXZnLmF0dHIsCisJJmRldl9hdHRyX2FwYnJpZGdlX3VuaXByb19sYXRlbmN5X21pbi5hdHRyLAorCSZkZXZfYXR0cl9hcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9tYXguYXR0ciwKKwkmZGV2X2F0dHJfYXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfYXZnLmF0dHIsCisJJmRldl9hdHRyX2dicGh5X2Zpcm13YXJlX2xhdGVuY3lfbWluLmF0dHIsCisJJmRldl9hdHRyX2dicGh5X2Zpcm13YXJlX2xhdGVuY3lfbWF4LmF0dHIsCisJJmRldl9hdHRyX2dicGh5X2Zpcm13YXJlX2xhdGVuY3lfYXZnLmF0dHIsCisJJmRldl9hdHRyX3R5cGUuYXR0ciwKKwkmZGV2X2F0dHJfc2l6ZS5hdHRyLAorCSZkZXZfYXR0cl91c193YWl0LmF0dHIsCisJJmRldl9hdHRyX2l0ZXJhdGlvbl9jb3VudC5hdHRyLAorCSZkZXZfYXR0cl9pdGVyYXRpb25fbWF4LmF0dHIsCisJJmRldl9hdHRyX2FzeW5jLmF0dHIsCisJJmRldl9hdHRyX2Vycm9yLmF0dHIsCisJJmRldl9hdHRyX3JlcXVlc3RzX2NvbXBsZXRlZC5hdHRyLAorCSZkZXZfYXR0cl9yZXF1ZXN0c190aW1lZG91dC5hdHRyLAorCSZkZXZfYXR0cl90aW1lb3V0LmF0dHIsCisJJmRldl9hdHRyX291dHN0YW5kaW5nX29wZXJhdGlvbnNfbWF4LmF0dHIsCisJJmRldl9hdHRyX3RpbWVvdXRfbWluLmF0dHIsCisJJmRldl9hdHRyX3RpbWVvdXRfbWF4LmF0dHIsCisJTlVMTCwKK307CitBVFRSSUJVVEVfR1JPVVBTKGxvb3BiYWNrKTsKKworc3RhdGljIHZvaWQgZ2JfbG9vcGJhY2tfY2FsY3VsYXRlX3N0YXRzKHN0cnVjdCBnYl9sb29wYmFjayAqZ2IsIGJvb2wgZXJyb3IpOworCitzdGF0aWMgdTMyIGdiX2xvb3BiYWNrX25zZWNfdG9fdXNlY19sYXRlbmN5KHU2NCBlbGFwc2VkX25zZWNzKQoreworCXUzMiBsYXQ7CisKKwlkb19kaXYoZWxhcHNlZF9uc2VjcywgTlNFQ19QRVJfVVNFQyk7CisJbGF0ID0gZWxhcHNlZF9uc2VjczsKKwlyZXR1cm4gbGF0OworfQorCitzdGF0aWMgdTY0IF9fZ2JfbG9vcGJhY2tfY2FsY19sYXRlbmN5KHU2NCB0MSwgdTY0IHQyKQoreworCWlmICh0MiA+IHQxKQorCQlyZXR1cm4gdDIgLSB0MTsKKwllbHNlCisJCXJldHVybiBOU0VDX1BFUl9EQVkgLSB0MiArIHQxOworfQorCitzdGF0aWMgdTY0IGdiX2xvb3BiYWNrX2NhbGNfbGF0ZW5jeShzdHJ1Y3QgdGltZXZhbCAqdHMsIHN0cnVjdCB0aW1ldmFsICp0ZSkKK3sKKwl1NjQgdDEsIHQyOworCisJdDEgPSB0aW1ldmFsX3RvX25zKHRzKTsKKwl0MiA9IHRpbWV2YWxfdG9fbnModGUpOworCisJcmV0dXJuIF9fZ2JfbG9vcGJhY2tfY2FsY19sYXRlbmN5KHQxLCB0Mik7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2xvb3BiYWNrX3B1c2hfbGF0ZW5jeV90cyhzdHJ1Y3QgZ2JfbG9vcGJhY2sgKmdiLAorCQkJCQlzdHJ1Y3QgdGltZXZhbCAqdHMsIHN0cnVjdCB0aW1ldmFsICp0ZSkKK3sKKwlrZmlmb19pbigmZ2ItPmtmaWZvX3RzLCAodW5zaWduZWQgY2hhciAqKXRzLCBzaXplb2YoKnRzKSk7CisJa2ZpZm9faW4oJmdiLT5rZmlmb190cywgKHVuc2lnbmVkIGNoYXIgKil0ZSwgc2l6ZW9mKCp0ZSkpOworfQorCitzdGF0aWMgaW50IGdiX2xvb3BiYWNrX29wZXJhdGlvbl9zeW5jKHN0cnVjdCBnYl9sb29wYmFjayAqZ2IsIGludCB0eXBlLAorCQkJCSAgICAgIHZvaWQgKnJlcXVlc3QsIGludCByZXF1ZXN0X3NpemUsCisJCQkJICAgICAgdm9pZCAqcmVzcG9uc2UsIGludCByZXNwb25zZV9zaXplKQoreworCXN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbjsKKwlzdHJ1Y3QgdGltZXZhbCB0cywgdGU7CisJaW50IHJldDsKKworCWRvX2dldHRpbWVvZmRheSgmdHMpOworCW9wZXJhdGlvbiA9IGdiX29wZXJhdGlvbl9jcmVhdGUoZ2ItPmNvbm5lY3Rpb24sIHR5cGUsIHJlcXVlc3Rfc2l6ZSwKKwkJCQkJcmVzcG9uc2Vfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvcGVyYXRpb24pCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKHJlcXVlc3Rfc2l6ZSkKKwkJbWVtY3B5KG9wZXJhdGlvbi0+cmVxdWVzdC0+cGF5bG9hZCwgcmVxdWVzdCwgcmVxdWVzdF9zaXplKTsKKworCXJldCA9IGdiX29wZXJhdGlvbl9yZXF1ZXN0X3NlbmRfc3luYyhvcGVyYXRpb24pOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmZ2ItPmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2LAorCQkJInN5bmNocm9ub3VzIG9wZXJhdGlvbiBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlnb3RvIG91dF9wdXRfb3BlcmF0aW9uOworCX0gZWxzZSB7CisJCWlmIChyZXNwb25zZV9zaXplID09IG9wZXJhdGlvbi0+cmVzcG9uc2UtPnBheWxvYWRfc2l6ZSkgeworCQkJbWVtY3B5KHJlc3BvbnNlLCBvcGVyYXRpb24tPnJlc3BvbnNlLT5wYXlsb2FkLAorCQkJICAgICAgIHJlc3BvbnNlX3NpemUpOworCQl9IGVsc2UgeworCQkJZGV2X2VycigmZ2ItPmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2LAorCQkJCSJyZXNwb25zZSBzaXplICV6dSBleHBlY3RlZCAlZFxuIiwKKwkJCQlvcGVyYXRpb24tPnJlc3BvbnNlLT5wYXlsb2FkX3NpemUsCisJCQkJcmVzcG9uc2Vfc2l6ZSk7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXRfcHV0X29wZXJhdGlvbjsKKwkJfQorCX0KKworCWRvX2dldHRpbWVvZmRheSgmdGUpOworCisJLyogQ2FsY3VsYXRlIHRoZSB0b3RhbCB0aW1lIHRoZSBtZXNzYWdlIHRvb2sgKi8KKwlnYl9sb29wYmFja19wdXNoX2xhdGVuY3lfdHMoZ2IsICZ0cywgJnRlKTsKKwlnYi0+ZWxhcHNlZF9uc2VjcyA9IGdiX2xvb3BiYWNrX2NhbGNfbGF0ZW5jeSgmdHMsICZ0ZSk7CisKK291dF9wdXRfb3BlcmF0aW9uOgorCWdiX29wZXJhdGlvbl9wdXQob3BlcmF0aW9uKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZ2JfbG9vcGJhY2tfYXN5bmNfb3BlcmF0aW9uX2Rlc3Ryb3koc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IGdiX2xvb3BiYWNrX2FzeW5jX29wZXJhdGlvbiAqb3BfYXN5bmM7CisKKwlvcF9hc3luYyA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgZ2JfbG9vcGJhY2tfYXN5bmNfb3BlcmF0aW9uLCBrcmVmKTsKKworCWxpc3RfZGVsKCZvcF9hc3luYy0+ZW50cnkpOworCWlmIChvcF9hc3luYy0+b3BlcmF0aW9uKQorCQlnYl9vcGVyYXRpb25fcHV0KG9wX2FzeW5jLT5vcGVyYXRpb24pOworCWF0b21pY19kZWMoJm9wX2FzeW5jLT5nYi0+b3V0c3RhbmRpbmdfb3BlcmF0aW9ucyk7CisJd2FrZV91cCgmb3BfYXN5bmMtPmdiLT53cV9jb21wbGV0aW9uKTsKKwlrZnJlZShvcF9hc3luYyk7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2xvb3BiYWNrX2FzeW5jX29wZXJhdGlvbl9nZXQoc3RydWN0IGdiX2xvb3BiYWNrX2FzeW5jX29wZXJhdGlvbgorCQkJCQkgICAgKm9wX2FzeW5jKQoreworCWtyZWZfZ2V0KCZvcF9hc3luYy0+a3JlZik7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2xvb3BiYWNrX2FzeW5jX29wZXJhdGlvbl9wdXQoc3RydWN0IGdiX2xvb3BiYWNrX2FzeW5jX29wZXJhdGlvbgorCQkJCQkgICAgKm9wX2FzeW5jKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ2JfZGV2LmxvY2ssIGZsYWdzKTsKKwlrcmVmX3B1dCgmb3BfYXN5bmMtPmtyZWYsIF9fZ2JfbG9vcGJhY2tfYXN5bmNfb3BlcmF0aW9uX2Rlc3Ryb3kpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdiX2Rldi5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2JfbG9vcGJhY2tfYXN5bmNfb3BlcmF0aW9uICoKKwlnYl9sb29wYmFja19vcGVyYXRpb25fZmluZCh1MTYgaWQpCit7CisJc3RydWN0IGdiX2xvb3BiYWNrX2FzeW5jX29wZXJhdGlvbiAqb3BfYXN5bmM7CisJYm9vbCBmb3VuZCA9IGZhbHNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ2JfZGV2LmxvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9wX2FzeW5jLCAmZ2JfZGV2Lmxpc3Rfb3BfYXN5bmMsIGVudHJ5KSB7CisJCWlmIChvcF9hc3luYy0+b3BlcmF0aW9uLT5pZCA9PSBpZCkgeworCQkJZ2JfbG9vcGJhY2tfYXN5bmNfb3BlcmF0aW9uX2dldChvcF9hc3luYyk7CisJCQlmb3VuZCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnYl9kZXYubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGZvdW5kID8gb3BfYXN5bmMgOiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBnYl9sb29wYmFja19hc3luY193YWl0X2FsbChzdHJ1Y3QgZ2JfbG9vcGJhY2sgKmdiKQoreworCXdhaXRfZXZlbnQoZ2ItPndxX2NvbXBsZXRpb24sCisJCSAgICFhdG9taWNfcmVhZCgmZ2ItPm91dHN0YW5kaW5nX29wZXJhdGlvbnMpKTsKK30KKworc3RhdGljIHZvaWQgZ2JfbG9vcGJhY2tfYXN5bmNfb3BlcmF0aW9uX2NhbGxiYWNrKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbikKK3sKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2tfYXN5bmNfb3BlcmF0aW9uICpvcF9hc3luYzsKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2sgKmdiOworCXN0cnVjdCB0aW1ldmFsIHRlOworCWJvb2wgZXJyID0gZmFsc2U7CisKKwlkb19nZXR0aW1lb2ZkYXkoJnRlKTsKKwlvcF9hc3luYyA9IGdiX2xvb3BiYWNrX29wZXJhdGlvbl9maW5kKG9wZXJhdGlvbi0+aWQpOworCWlmICghb3BfYXN5bmMpCisJCXJldHVybjsKKworCWdiID0gb3BfYXN5bmMtPmdiOworCW11dGV4X2xvY2soJmdiLT5tdXRleCk7CisKKwlpZiAoIW9wX2FzeW5jLT5wZW5kaW5nIHx8IGdiX29wZXJhdGlvbl9yZXN1bHQob3BlcmF0aW9uKSkgeworCQllcnIgPSB0cnVlOworCX0gZWxzZSB7CisJCWlmIChvcF9hc3luYy0+Y29tcGxldGlvbikKKwkJCWlmIChvcF9hc3luYy0+Y29tcGxldGlvbihvcF9hc3luYykpCisJCQkJZXJyID0gdHJ1ZTsKKwl9CisKKwlpZiAoIWVycikgeworCQlnYl9sb29wYmFja19wdXNoX2xhdGVuY3lfdHMoZ2IsICZvcF9hc3luYy0+dHMsICZ0ZSk7CisJCWdiLT5lbGFwc2VkX25zZWNzID0gZ2JfbG9vcGJhY2tfY2FsY19sYXRlbmN5KCZvcF9hc3luYy0+dHMsCisJCQkJCQkJICAgICAmdGUpOworCX0KKworCWlmIChvcF9hc3luYy0+cGVuZGluZykgeworCQlpZiAoZXJyKQorCQkJZ2ItPmVycm9yKys7CisJCWdiLT5pdGVyYXRpb25fY291bnQrKzsKKwkJb3BfYXN5bmMtPnBlbmRpbmcgPSBmYWxzZTsKKwkJZGVsX3RpbWVyX3N5bmMoJm9wX2FzeW5jLT50aW1lcik7CisJCWdiX2xvb3BiYWNrX2FzeW5jX29wZXJhdGlvbl9wdXQob3BfYXN5bmMpOworCQlnYl9sb29wYmFja19jYWxjdWxhdGVfc3RhdHMoZ2IsIGVycik7CisJfQorCW11dGV4X3VubG9jaygmZ2ItPm11dGV4KTsKKworCWRldl9kYmcoJmdiLT5jb25uZWN0aW9uLT5idW5kbGUtPmRldiwgImNvbXBsZXRlIG9wZXJhdGlvbiAlZFxuIiwKKwkJb3BlcmF0aW9uLT5pZCk7CisKKwlnYl9sb29wYmFja19hc3luY19vcGVyYXRpb25fcHV0KG9wX2FzeW5jKTsKK30KKworc3RhdGljIHZvaWQgZ2JfbG9vcGJhY2tfYXN5bmNfb3BlcmF0aW9uX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBnYl9sb29wYmFjayAqZ2I7CisJc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uOworCXN0cnVjdCBnYl9sb29wYmFja19hc3luY19vcGVyYXRpb24gKm9wX2FzeW5jOworCisJb3BfYXN5bmMgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGdiX2xvb3BiYWNrX2FzeW5jX29wZXJhdGlvbiwgd29yayk7CisJZ2IgPSBvcF9hc3luYy0+Z2I7CisJb3BlcmF0aW9uID0gb3BfYXN5bmMtPm9wZXJhdGlvbjsKKworCW11dGV4X2xvY2soJmdiLT5tdXRleCk7CisJaWYgKG9wX2FzeW5jLT5wZW5kaW5nKSB7CisJCWdiLT5yZXF1ZXN0c190aW1lZG91dCsrOworCQlnYi0+ZXJyb3IrKzsKKwkJZ2ItPml0ZXJhdGlvbl9jb3VudCsrOworCQlvcF9hc3luYy0+cGVuZGluZyA9IGZhbHNlOworCQlnYl9sb29wYmFja19hc3luY19vcGVyYXRpb25fcHV0KG9wX2FzeW5jKTsKKwkJZ2JfbG9vcGJhY2tfY2FsY3VsYXRlX3N0YXRzKGdiLCB0cnVlKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZnYi0+bXV0ZXgpOworCisJZGV2X2RiZygmZ2ItPmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2LCAidGltZW91dCBvcGVyYXRpb24gJWRcbiIsCisJCW9wZXJhdGlvbi0+aWQpOworCisJZ2Jfb3BlcmF0aW9uX2NhbmNlbChvcGVyYXRpb24sIC1FVElNRURPVVQpOworCWdiX2xvb3BiYWNrX2FzeW5jX29wZXJhdGlvbl9wdXQob3BfYXN5bmMpOworfQorCitzdGF0aWMgdm9pZCBnYl9sb29wYmFja19hc3luY19vcGVyYXRpb25fdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGdiX2xvb3BiYWNrX2FzeW5jX29wZXJhdGlvbiAqb3BfYXN5bmM7CisJdTE2IGlkID0gZGF0YTsKKworCW9wX2FzeW5jID0gZ2JfbG9vcGJhY2tfb3BlcmF0aW9uX2ZpbmQoaWQpOworCWlmICghb3BfYXN5bmMpIHsKKwkJcHJfZXJyKCJvcGVyYXRpb24gJWQgbm90IGZvdW5kIC0gdGltZSBvdXQgP1xuIiwgaWQpOworCQlyZXR1cm47CisJfQorCXNjaGVkdWxlX3dvcmsoJm9wX2FzeW5jLT53b3JrKTsKK30KKworc3RhdGljIGludCBnYl9sb29wYmFja19hc3luY19vcGVyYXRpb24oc3RydWN0IGdiX2xvb3BiYWNrICpnYiwgaW50IHR5cGUsCisJCQkJICAgICAgIHZvaWQgKnJlcXVlc3QsIGludCByZXF1ZXN0X3NpemUsCisJCQkJICAgICAgIGludCByZXNwb25zZV9zaXplLAorCQkJCSAgICAgICB2b2lkICpjb21wbGV0aW9uKQoreworCXN0cnVjdCBnYl9sb29wYmFja19hc3luY19vcGVyYXRpb24gKm9wX2FzeW5jOworCXN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbjsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlvcF9hc3luYyA9IGt6YWxsb2Moc2l6ZW9mKCpvcF9hc3luYyksIEdGUF9LRVJORUwpOworCWlmICghb3BfYXN5bmMpCisJCXJldHVybiAtRU5PTUVNOworCisJSU5JVF9XT1JLKCZvcF9hc3luYy0+d29yaywgZ2JfbG9vcGJhY2tfYXN5bmNfb3BlcmF0aW9uX3dvcmspOworCWtyZWZfaW5pdCgmb3BfYXN5bmMtPmtyZWYpOworCisJb3BlcmF0aW9uID0gZ2Jfb3BlcmF0aW9uX2NyZWF0ZShnYi0+Y29ubmVjdGlvbiwgdHlwZSwgcmVxdWVzdF9zaXplLAorCQkJCQlyZXNwb25zZV9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9wZXJhdGlvbikgeworCQlrZnJlZShvcF9hc3luYyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChyZXF1ZXN0X3NpemUpCisJCW1lbWNweShvcGVyYXRpb24tPnJlcXVlc3QtPnBheWxvYWQsIHJlcXVlc3QsIHJlcXVlc3Rfc2l6ZSk7CisKKwlvcF9hc3luYy0+Z2IgPSBnYjsKKwlvcF9hc3luYy0+b3BlcmF0aW9uID0gb3BlcmF0aW9uOworCW9wX2FzeW5jLT5jb21wbGV0aW9uID0gY29tcGxldGlvbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZnYl9kZXYubG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJm9wX2FzeW5jLT5lbnRyeSwgJmdiX2Rldi5saXN0X29wX2FzeW5jKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnYl9kZXYubG9jaywgZmxhZ3MpOworCisJZG9fZ2V0dGltZW9mZGF5KCZvcF9hc3luYy0+dHMpOworCW9wX2FzeW5jLT5wZW5kaW5nID0gdHJ1ZTsKKwlhdG9taWNfaW5jKCZnYi0+b3V0c3RhbmRpbmdfb3BlcmF0aW9ucyk7CisJbXV0ZXhfbG9jaygmZ2ItPm11dGV4KTsKKwlyZXQgPSBnYl9vcGVyYXRpb25fcmVxdWVzdF9zZW5kKG9wZXJhdGlvbiwKKwkJCQkJZ2JfbG9vcGJhY2tfYXN5bmNfb3BlcmF0aW9uX2NhbGxiYWNrLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJc2V0dXBfdGltZXIoJm9wX2FzeW5jLT50aW1lciwgZ2JfbG9vcGJhY2tfYXN5bmNfb3BlcmF0aW9uX3RpbWVvdXQsCisJCQkodW5zaWduZWQgbG9uZylvcGVyYXRpb24tPmlkKTsKKwlvcF9hc3luYy0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBnYi0+amlmZnlfdGltZW91dDsKKwlhZGRfdGltZXIoJm9wX2FzeW5jLT50aW1lcik7CisKKwlnb3RvIGRvbmU7CitlcnJvcjoKKwlnYl9sb29wYmFja19hc3luY19vcGVyYXRpb25fcHV0KG9wX2FzeW5jKTsKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZnYi0+bXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfbG9vcGJhY2tfc3luY19zaW5rKHN0cnVjdCBnYl9sb29wYmFjayAqZ2IsIHUzMiBsZW4pCit7CisJc3RydWN0IGdiX2xvb3BiYWNrX3RyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3Q7CisJaW50IHJldHZhbDsKKworCXJlcXVlc3QgPSBrbWFsbG9jKGxlbiArIHNpemVvZigqcmVxdWVzdCksIEdGUF9LRVJORUwpOworCWlmICghcmVxdWVzdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXF1ZXN0LT5sZW4gPSBjcHVfdG9fbGUzMihsZW4pOworCXJldHZhbCA9IGdiX2xvb3BiYWNrX29wZXJhdGlvbl9zeW5jKGdiLCBHQl9MT09QQkFDS19UWVBFX1NJTkssCisJCQkJCSAgICByZXF1ZXN0LCBsZW4gKyBzaXplb2YoKnJlcXVlc3QpLAorCQkJCQkgICAgTlVMTCwgMCk7CisJa2ZyZWUocmVxdWVzdCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBnYl9sb29wYmFja19zeW5jX3RyYW5zZmVyKHN0cnVjdCBnYl9sb29wYmFjayAqZ2IsIHUzMiBsZW4pCit7CisJc3RydWN0IGdiX2xvb3BiYWNrX3RyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3Q7CisJc3RydWN0IGdiX2xvb3BiYWNrX3RyYW5zZmVyX3Jlc3BvbnNlICpyZXNwb25zZTsKKwlpbnQgcmV0dmFsOworCisJZ2ItPmFwYnJpZGdlX2xhdGVuY3lfdHMgPSAwOworCWdiLT5nYnBoeV9sYXRlbmN5X3RzID0gMDsKKworCXJlcXVlc3QgPSBrbWFsbG9jKGxlbiArIHNpemVvZigqcmVxdWVzdCksIEdGUF9LRVJORUwpOworCWlmICghcmVxdWVzdCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmVzcG9uc2UgPSBrbWFsbG9jKGxlbiArIHNpemVvZigqcmVzcG9uc2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlc3BvbnNlKSB7CisJCWtmcmVlKHJlcXVlc3QpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQocmVxdWVzdC0+ZGF0YSwgMHg1QSwgbGVuKTsKKworCXJlcXVlc3QtPmxlbiA9IGNwdV90b19sZTMyKGxlbik7CisJcmV0dmFsID0gZ2JfbG9vcGJhY2tfb3BlcmF0aW9uX3N5bmMoZ2IsIEdCX0xPT1BCQUNLX1RZUEVfVFJBTlNGRVIsCisJCQkJCSAgICByZXF1ZXN0LCBsZW4gKyBzaXplb2YoKnJlcXVlc3QpLAorCQkJCQkgICAgcmVzcG9uc2UsIGxlbiArIHNpemVvZigqcmVzcG9uc2UpKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGdiX2Vycm9yOworCisJaWYgKG1lbWNtcChyZXF1ZXN0LT5kYXRhLCByZXNwb25zZS0+ZGF0YSwgbGVuKSkgeworCQlkZXZfZXJyKCZnYi0+Y29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsCisJCQkiTG9vcGJhY2sgRGF0YSBkb2Vzbid0IG1hdGNoXG4iKTsKKwkJcmV0dmFsID0gLUVSRU1PVEVJTzsKKwl9CisJZ2ItPmFwYnJpZGdlX2xhdGVuY3lfdHMgPSAodTMyKV9fbGUzMl90b19jcHUocmVzcG9uc2UtPnJlc2VydmVkMCk7CisJZ2ItPmdicGh5X2xhdGVuY3lfdHMgPSAodTMyKV9fbGUzMl90b19jcHUocmVzcG9uc2UtPnJlc2VydmVkMSk7CisKK2diX2Vycm9yOgorCWtmcmVlKHJlcXVlc3QpOworCWtmcmVlKHJlc3BvbnNlKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZ2JfbG9vcGJhY2tfc3luY19waW5nKHN0cnVjdCBnYl9sb29wYmFjayAqZ2IpCit7CisJcmV0dXJuIGdiX2xvb3BiYWNrX29wZXJhdGlvbl9zeW5jKGdiLCBHQl9MT09QQkFDS19UWVBFX1BJTkcsCisJCQkJCSAgTlVMTCwgMCwgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgZ2JfbG9vcGJhY2tfYXN5bmNfc2luayhzdHJ1Y3QgZ2JfbG9vcGJhY2sgKmdiLCB1MzIgbGVuKQoreworCXN0cnVjdCBnYl9sb29wYmFja190cmFuc2Zlcl9yZXF1ZXN0ICpyZXF1ZXN0OworCWludCByZXR2YWw7CisKKwlyZXF1ZXN0ID0ga21hbGxvYyhsZW4gKyBzaXplb2YoKnJlcXVlc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlcXVlc3QpCisJCXJldHVybiAtRU5PTUVNOworCisJcmVxdWVzdC0+bGVuID0gY3B1X3RvX2xlMzIobGVuKTsKKwlyZXR2YWwgPSBnYl9sb29wYmFja19hc3luY19vcGVyYXRpb24oZ2IsIEdCX0xPT1BCQUNLX1RZUEVfU0lOSywKKwkJCQkJICAgICByZXF1ZXN0LCBsZW4gKyBzaXplb2YoKnJlcXVlc3QpLAorCQkJCQkgICAgIDAsIE5VTEwpOworCWtmcmVlKHJlcXVlc3QpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZ2JfbG9vcGJhY2tfYXN5bmNfdHJhbnNmZXJfY29tcGxldGUoCisJCQkJc3RydWN0IGdiX2xvb3BiYWNrX2FzeW5jX29wZXJhdGlvbiAqb3BfYXN5bmMpCit7CisJc3RydWN0IGdiX2xvb3BiYWNrICpnYjsKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb247CisJc3RydWN0IGdiX2xvb3BiYWNrX3RyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3Q7CisJc3RydWN0IGdiX2xvb3BiYWNrX3RyYW5zZmVyX3Jlc3BvbnNlICpyZXNwb25zZTsKKwlzaXplX3QgbGVuOworCWludCByZXR2YWwgPSAwOworCisJZ2IgPSBvcF9hc3luYy0+Z2I7CisJb3BlcmF0aW9uID0gb3BfYXN5bmMtPm9wZXJhdGlvbjsKKwlyZXF1ZXN0ID0gb3BlcmF0aW9uLT5yZXF1ZXN0LT5wYXlsb2FkOworCXJlc3BvbnNlID0gb3BlcmF0aW9uLT5yZXNwb25zZS0+cGF5bG9hZDsKKwlsZW4gPSBsZTMyX3RvX2NwdShyZXF1ZXN0LT5sZW4pOworCisJaWYgKG1lbWNtcChyZXF1ZXN0LT5kYXRhLCByZXNwb25zZS0+ZGF0YSwgbGVuKSkgeworCQlkZXZfZXJyKCZnYi0+Y29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsCisJCQkiTG9vcGJhY2sgRGF0YSBkb2Vzbid0IG1hdGNoIG9wZXJhdGlvbiBpZCAlZFxuIiwKKwkJCW9wZXJhdGlvbi0+aWQpOworCQlyZXR2YWwgPSAtRVJFTU9URUlPOworCX0gZWxzZSB7CisJCWdiLT5hcGJyaWRnZV9sYXRlbmN5X3RzID0KKwkJCSh1MzIpX19sZTMyX3RvX2NwdShyZXNwb25zZS0+cmVzZXJ2ZWQwKTsKKwkJZ2ItPmdicGh5X2xhdGVuY3lfdHMgPQorCQkJKHUzMilfX2xlMzJfdG9fY3B1KHJlc3BvbnNlLT5yZXNlcnZlZDEpOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZ2JfbG9vcGJhY2tfYXN5bmNfdHJhbnNmZXIoc3RydWN0IGdiX2xvb3BiYWNrICpnYiwgdTMyIGxlbikKK3sKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2tfdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdDsKKwlpbnQgcmV0dmFsLCByZXNwb25zZV9sZW47CisKKwlyZXF1ZXN0ID0ga21hbGxvYyhsZW4gKyBzaXplb2YoKnJlcXVlc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlcXVlc3QpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KHJlcXVlc3QtPmRhdGEsIDB4NUEsIGxlbik7CisKKwlyZXF1ZXN0LT5sZW4gPSBjcHVfdG9fbGUzMihsZW4pOworCXJlc3BvbnNlX2xlbiA9IHNpemVvZihzdHJ1Y3QgZ2JfbG9vcGJhY2tfdHJhbnNmZXJfcmVzcG9uc2UpOworCXJldHZhbCA9IGdiX2xvb3BiYWNrX2FzeW5jX29wZXJhdGlvbihnYiwgR0JfTE9PUEJBQ0tfVFlQRV9UUkFOU0ZFUiwKKwkJCQkJICAgICByZXF1ZXN0LCBsZW4gKyBzaXplb2YoKnJlcXVlc3QpLAorCQkJCQkgICAgIGxlbiArIHJlc3BvbnNlX2xlbiwKKwkJCQkJICAgICBnYl9sb29wYmFja19hc3luY190cmFuc2Zlcl9jb21wbGV0ZSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBnYl9lcnJvcjsKKworZ2JfZXJyb3I6CisJa2ZyZWUocmVxdWVzdCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBnYl9sb29wYmFja19hc3luY19waW5nKHN0cnVjdCBnYl9sb29wYmFjayAqZ2IpCit7CisJcmV0dXJuIGdiX2xvb3BiYWNrX2FzeW5jX29wZXJhdGlvbihnYiwgR0JfTE9PUEJBQ0tfVFlQRV9QSU5HLAorCQkJCQkgICBOVUxMLCAwLCAwLCBOVUxMKTsKK30KKworc3RhdGljIGludCBnYl9sb29wYmFja19yZXF1ZXN0X2hhbmRsZXIoc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gb3BlcmF0aW9uLT5jb25uZWN0aW9uOworCXN0cnVjdCBnYl9sb29wYmFja190cmFuc2Zlcl9yZXF1ZXN0ICpyZXF1ZXN0OworCXN0cnVjdCBnYl9sb29wYmFja190cmFuc2Zlcl9yZXNwb25zZSAqcmVzcG9uc2U7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2OworCXNpemVfdCBsZW47CisKKwkvKiBCeSBjb252ZW50aW9uLCB0aGUgQVAgaW5pdGlhdGVzIHRoZSB2ZXJzaW9uIG9wZXJhdGlvbiAqLworCXN3aXRjaCAob3BlcmF0aW9uLT50eXBlKSB7CisJY2FzZSBHQl9MT09QQkFDS19UWVBFX1BJTkc6CisJY2FzZSBHQl9MT09QQkFDS19UWVBFX1NJTks6CisJCXJldHVybiAwOworCWNhc2UgR0JfTE9PUEJBQ0tfVFlQRV9UUkFOU0ZFUjoKKwkJaWYgKG9wZXJhdGlvbi0+cmVxdWVzdC0+cGF5bG9hZF9zaXplIDwgc2l6ZW9mKCpyZXF1ZXN0KSkgeworCQkJZGV2X2VycihkZXYsICJ0cmFuc2ZlciByZXF1ZXN0IHRvbyBzbWFsbCAoJXp1IDwgJXp1KVxuIiwKKwkJCQlvcGVyYXRpb24tPnJlcXVlc3QtPnBheWxvYWRfc2l6ZSwKKwkJCQlzaXplb2YoKnJlcXVlc3QpKTsKKwkJCXJldHVybiAtRUlOVkFMOwkvKiAtRU1TR1NJWkUgKi8KKwkJfQorCQlyZXF1ZXN0ID0gb3BlcmF0aW9uLT5yZXF1ZXN0LT5wYXlsb2FkOworCQlsZW4gPSBsZTMyX3RvX2NwdShyZXF1ZXN0LT5sZW4pOworCQlpZiAobGVuID4gZ2JfZGV2LnNpemVfbWF4KSB7CisJCQlkZXZfZXJyKGRldiwgInRyYW5zZmVyIHJlcXVlc3QgdG9vIGxhcmdlICglenUgPiAlenUpXG4iLAorCQkJCWxlbiwgZ2JfZGV2LnNpemVfbWF4KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKCFnYl9vcGVyYXRpb25fcmVzcG9uc2VfYWxsb2Mob3BlcmF0aW9uLAorCQkJCWxlbiArIHNpemVvZigqcmVzcG9uc2UpLCBHRlBfS0VSTkVMKSkgeworCQkJZGV2X2VycihkZXYsICJlcnJvciBhbGxvY2F0aW5nIHJlc3BvbnNlXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXJlc3BvbnNlID0gb3BlcmF0aW9uLT5yZXNwb25zZS0+cGF5bG9hZDsKKwkJcmVzcG9uc2UtPmxlbiA9IGNwdV90b19sZTMyKGxlbik7CisJCWlmIChsZW4pCisJCQltZW1jcHkocmVzcG9uc2UtPmRhdGEsIHJlcXVlc3QtPmRhdGEsIGxlbik7CisKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICJ1bnN1cHBvcnRlZCByZXF1ZXN0OiAldVxuIiwgb3BlcmF0aW9uLT50eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgdm9pZCBnYl9sb29wYmFja19yZXNldF9zdGF0cyhzdHJ1Y3QgZ2JfbG9vcGJhY2sgKmdiKQoreworCXN0cnVjdCBnYl9sb29wYmFja19zdGF0cyByZXNldCA9IHsKKwkJLm1pbiA9IFUzMl9NQVgsCisJfTsKKworCS8qIFJlc2V0IHBlci1jb25uZWN0aW9uIHN0YXRzICovCisJbWVtY3B5KCZnYi0+bGF0ZW5jeSwgJnJlc2V0LAorCSAgICAgICBzaXplb2Yoc3RydWN0IGdiX2xvb3BiYWNrX3N0YXRzKSk7CisJbWVtY3B5KCZnYi0+dGhyb3VnaHB1dCwgJnJlc2V0LAorCSAgICAgICBzaXplb2Yoc3RydWN0IGdiX2xvb3BiYWNrX3N0YXRzKSk7CisJbWVtY3B5KCZnYi0+cmVxdWVzdHNfcGVyX3NlY29uZCwgJnJlc2V0LAorCSAgICAgICBzaXplb2Yoc3RydWN0IGdiX2xvb3BiYWNrX3N0YXRzKSk7CisJbWVtY3B5KCZnYi0+YXBicmlkZ2VfdW5pcHJvX2xhdGVuY3ksICZyZXNldCwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBnYl9sb29wYmFja19zdGF0cykpOworCW1lbWNweSgmZ2ItPmdicGh5X2Zpcm13YXJlX2xhdGVuY3ksICZyZXNldCwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBnYl9sb29wYmFja19zdGF0cykpOworCisJLyogU2hvdWxkIGJlIGluaXRpYWxpemVkIGF0IGxlYXN0IG9uY2UgcGVyIHRyYW5zYWN0aW9uIHNldCAqLworCWdiLT5hcGJyaWRnZV9sYXRlbmN5X3RzID0gMDsKKwlnYi0+Z2JwaHlfbGF0ZW5jeV90cyA9IDA7CisJbWVtc2V0KCZnYi0+dHMsIDAsIHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpOworfQorCitzdGF0aWMgdm9pZCBnYl9sb29wYmFja191cGRhdGVfc3RhdHMoc3RydWN0IGdiX2xvb3BiYWNrX3N0YXRzICpzdGF0cywgdTMyIHZhbCkKK3sKKwlpZiAoc3RhdHMtPm1pbiA+IHZhbCkKKwkJc3RhdHMtPm1pbiA9IHZhbDsKKwlpZiAoc3RhdHMtPm1heCA8IHZhbCkKKwkJc3RhdHMtPm1heCA9IHZhbDsKKwlzdGF0cy0+c3VtICs9IHZhbDsKKwlzdGF0cy0+Y291bnQrKzsKK30KKworc3RhdGljIHZvaWQgZ2JfbG9vcGJhY2tfdXBkYXRlX3N0YXRzX3dpbmRvdyhzdHJ1Y3QgZ2JfbG9vcGJhY2tfc3RhdHMgKnN0YXRzLAorCQkJCQkgICAgdTY0IHZhbCwgdTMyIGNvdW50KQoreworCXN0YXRzLT5zdW0gKz0gdmFsOworCXN0YXRzLT5jb3VudCArPSBjb3VudDsKKworCWRvX2Rpdih2YWwsIGNvdW50KTsKKwlpZiAoc3RhdHMtPm1pbiA+IHZhbCkKKwkJc3RhdHMtPm1pbiA9IHZhbDsKKwlpZiAoc3RhdHMtPm1heCA8IHZhbCkKKwkJc3RhdHMtPm1heCA9IHZhbDsKK30KKworc3RhdGljIHZvaWQgZ2JfbG9vcGJhY2tfcmVxdWVzdHNfdXBkYXRlKHN0cnVjdCBnYl9sb29wYmFjayAqZ2IsIHUzMiBsYXRlbmN5KQoreworCXU2NCByZXEgPSBnYi0+cmVxdWVzdHNfY29tcGxldGVkICogVVNFQ19QRVJfU0VDOworCisJZ2JfbG9vcGJhY2tfdXBkYXRlX3N0YXRzX3dpbmRvdygmZ2ItPnJlcXVlc3RzX3Blcl9zZWNvbmQsIHJlcSwgbGF0ZW5jeSk7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2xvb3BiYWNrX3Rocm91Z2hwdXRfdXBkYXRlKHN0cnVjdCBnYl9sb29wYmFjayAqZ2IsIHUzMiBsYXRlbmN5KQoreworCXU2NCBhZ2dyZWdhdGVfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uX21zZ19oZHIpICogMjsKKworCXN3aXRjaCAoZ2ItPnR5cGUpIHsKKwljYXNlIEdCX0xPT1BCQUNLX1RZUEVfUElORzoKKwkJYnJlYWs7CisJY2FzZSBHQl9MT09QQkFDS19UWVBFX1NJTks6CisJCWFnZ3JlZ2F0ZV9zaXplICs9IHNpemVvZihzdHJ1Y3QgZ2JfbG9vcGJhY2tfdHJhbnNmZXJfcmVxdWVzdCkgKworCQkJCSAgZ2ItPnNpemU7CisJCWJyZWFrOworCWNhc2UgR0JfTE9PUEJBQ0tfVFlQRV9UUkFOU0ZFUjoKKwkJYWdncmVnYXRlX3NpemUgKz0gc2l6ZW9mKHN0cnVjdCBnYl9sb29wYmFja190cmFuc2Zlcl9yZXF1ZXN0KSArCisJCQkJICBzaXplb2Yoc3RydWN0IGdiX2xvb3BiYWNrX3RyYW5zZmVyX3Jlc3BvbnNlKSArCisJCQkJICBnYi0+c2l6ZSAqIDI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisKKwlhZ2dyZWdhdGVfc2l6ZSAqPSBnYi0+cmVxdWVzdHNfY29tcGxldGVkOworCWFnZ3JlZ2F0ZV9zaXplICo9IFVTRUNfUEVSX1NFQzsKKwlnYl9sb29wYmFja191cGRhdGVfc3RhdHNfd2luZG93KCZnYi0+dGhyb3VnaHB1dCwgYWdncmVnYXRlX3NpemUsCisJCQkJCWxhdGVuY3kpOworfQorCitzdGF0aWMgdm9pZCBnYl9sb29wYmFja19jYWxjdWxhdGVfbGF0ZW5jeV9zdGF0cyhzdHJ1Y3QgZ2JfbG9vcGJhY2sgKmdiKQoreworCXUzMiBsYXQ7CisKKwkvKiBFeHByZXNzIGxhdGVuY3kgaW4gdGVybXMgb2YgbWljcm9zZWNvbmRzICovCisJbGF0ID0gZ2JfbG9vcGJhY2tfbnNlY190b191c2VjX2xhdGVuY3koZ2ItPmVsYXBzZWRfbnNlY3MpOworCisJLyogTG9nIGxhdGVuY3kgc3Rhc3RpYyAqLworCWdiX2xvb3BiYWNrX3VwZGF0ZV9zdGF0cygmZ2ItPmxhdGVuY3ksIGxhdCk7CisKKwkvKiBSYXcgbGF0ZW5jeSBsb2cgb24gYSBwZXIgdGhyZWFkIGJhc2lzICovCisJa2ZpZm9faW4oJmdiLT5rZmlmb19sYXQsICh1bnNpZ25lZCBjaGFyICopJmxhdCwgc2l6ZW9mKGxhdCkpOworCisJLyogTG9nIHRoZSBmaXJtd2FyZSBzdXBwbGllZCBsYXRlbmN5IHZhbHVlcyAqLworCWdiX2xvb3BiYWNrX3VwZGF0ZV9zdGF0cygmZ2ItPmFwYnJpZGdlX3VuaXByb19sYXRlbmN5LAorCQkJCSBnYi0+YXBicmlkZ2VfbGF0ZW5jeV90cyk7CisJZ2JfbG9vcGJhY2tfdXBkYXRlX3N0YXRzKCZnYi0+Z2JwaHlfZmlybXdhcmVfbGF0ZW5jeSwKKwkJCQkgZ2ItPmdicGh5X2xhdGVuY3lfdHMpOworfQorCitzdGF0aWMgdm9pZCBnYl9sb29wYmFja19jYWxjdWxhdGVfc3RhdHMoc3RydWN0IGdiX2xvb3BiYWNrICpnYiwgYm9vbCBlcnJvcikKK3sKKwl1NjQgbmxhdDsKKwl1MzIgbGF0OworCXN0cnVjdCB0aW1ldmFsIHRlOworCisJaWYgKCFlcnJvcikgeworCQlnYi0+cmVxdWVzdHNfY29tcGxldGVkKys7CisJCWdiX2xvb3BiYWNrX2NhbGN1bGF0ZV9sYXRlbmN5X3N0YXRzKGdiKTsKKwl9CisKKwlkb19nZXR0aW1lb2ZkYXkoJnRlKTsKKwlubGF0ID0gZ2JfbG9vcGJhY2tfY2FsY19sYXRlbmN5KCZnYi0+dHMsICZ0ZSk7CisJaWYgKG5sYXQgPj0gTlNFQ19QRVJfU0VDIHx8IGdiLT5pdGVyYXRpb25fY291bnQgPT0gZ2ItPml0ZXJhdGlvbl9tYXgpIHsKKwkJbGF0ID0gZ2JfbG9vcGJhY2tfbnNlY190b191c2VjX2xhdGVuY3kobmxhdCk7CisKKwkJZ2JfbG9vcGJhY2tfdGhyb3VnaHB1dF91cGRhdGUoZ2IsIGxhdCk7CisJCWdiX2xvb3BiYWNrX3JlcXVlc3RzX3VwZGF0ZShnYiwgbGF0KTsKKworCQlpZiAoZ2ItPml0ZXJhdGlvbl9jb3VudCAhPSBnYi0+aXRlcmF0aW9uX21heCkgeworCQkJZ2ItPnRzID0gdGU7CisJCQlnYi0+cmVxdWVzdHNfY29tcGxldGVkID0gMDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZ2JfbG9vcGJhY2tfYXN5bmNfd2FpdF90b19zZW5kKHN0cnVjdCBnYl9sb29wYmFjayAqZ2IpCit7CisJaWYgKCEoZ2ItPmFzeW5jICYmIGdiLT5vdXRzdGFuZGluZ19vcGVyYXRpb25zX21heCkpCisJCXJldHVybjsKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZ2ItPndxX2NvbXBsZXRpb24sCisJCQkJIChhdG9taWNfcmVhZCgmZ2ItPm91dHN0YW5kaW5nX29wZXJhdGlvbnMpIDwKKwkJCQkgIGdiLT5vdXRzdGFuZGluZ19vcGVyYXRpb25zX21heCkgfHwKKwkJCQkgIGt0aHJlYWRfc2hvdWxkX3N0b3AoKSk7Cit9CisKK3N0YXRpYyBpbnQgZ2JfbG9vcGJhY2tfZm4odm9pZCAqZGF0YSkKK3sKKwlpbnQgZXJyb3IgPSAwOworCWludCB1c193YWl0ID0gMDsKKwlpbnQgdHlwZTsKKwlpbnQgcmV0OworCXUzMiBzaXplOworCisJc3RydWN0IGdiX2xvb3BiYWNrICpnYiA9IGRhdGE7CisJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlID0gZ2ItPmNvbm5lY3Rpb24tPmJ1bmRsZTsKKworCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoYnVuZGxlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJd2hpbGUgKDEpIHsKKwkJaWYgKCFnYi0+dHlwZSkgeworCQkJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoYnVuZGxlKTsKKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShnYi0+d3EsIGdiLT50eXBlIHx8CisJCQkJCQkga3RocmVhZF9zaG91bGRfc3RvcCgpKTsKKwkJCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoYnVuZGxlKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCisJCQlicmVhazsKKworCQkvKiBMaW1pdCB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW4tZmxpZ2h0IGFzeW5jIG9wZXJhdGlvbnMgKi8KKwkJZ2JfbG9vcGJhY2tfYXN5bmNfd2FpdF90b19zZW5kKGdiKTsKKwkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKKwkJCWJyZWFrOworCisJCW11dGV4X2xvY2soJmdiLT5tdXRleCk7CisKKwkJLyogT3B0aW9uYWxseSB0ZXJtaW5hdGUgKi8KKwkJaWYgKGdiLT5zZW5kX2NvdW50ID09IGdiLT5pdGVyYXRpb25fbWF4KSB7CisJCQlpZiAoZ2ItPml0ZXJhdGlvbl9jb3VudCA9PSBnYi0+aXRlcmF0aW9uX21heCkgeworCQkJCWdiLT50eXBlID0gMDsKKwkJCQlnYi0+c2VuZF9jb3VudCA9IDA7CisJCQkJc3lzZnNfbm90aWZ5KCZnYi0+ZGV2LT5rb2JqLCAgTlVMTCwKKwkJCQkJCSJpdGVyYXRpb25fY291bnQiKTsKKwkJCX0KKwkJCW11dGV4X3VubG9jaygmZ2ItPm11dGV4KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXNpemUgPSBnYi0+c2l6ZTsKKwkJdXNfd2FpdCA9IGdiLT51c193YWl0OworCQl0eXBlID0gZ2ItPnR5cGU7CisJCWlmIChnYi0+dHMudHZfdXNlYyA9PSAwICYmIGdiLT50cy50dl9zZWMgPT0gMCkKKwkJCWRvX2dldHRpbWVvZmRheSgmZ2ItPnRzKTsKKwkJbXV0ZXhfdW5sb2NrKCZnYi0+bXV0ZXgpOworCisJCS8qIEVsc2Ugb3BlcmF0aW9ucyB0byBwZXJmb3JtICovCisJCWlmIChnYi0+YXN5bmMpIHsKKwkJCWlmICh0eXBlID09IEdCX0xPT1BCQUNLX1RZUEVfUElORykgeworCQkJCWVycm9yID0gZ2JfbG9vcGJhY2tfYXN5bmNfcGluZyhnYik7CisJCQl9IGVsc2UgaWYgKHR5cGUgPT0gR0JfTE9PUEJBQ0tfVFlQRV9UUkFOU0ZFUikgeworCQkJCWVycm9yID0gZ2JfbG9vcGJhY2tfYXN5bmNfdHJhbnNmZXIoZ2IsIHNpemUpOworCQkJfSBlbHNlIGlmICh0eXBlID09IEdCX0xPT1BCQUNLX1RZUEVfU0lOSykgeworCQkJCWVycm9yID0gZ2JfbG9vcGJhY2tfYXN5bmNfc2luayhnYiwgc2l6ZSk7CisJCQl9CisKKwkJCWlmIChlcnJvcikKKwkJCQlnYi0+ZXJyb3IrKzsKKwkJfSBlbHNlIHsKKwkJCS8qIFdlIGFyZSBlZmZlY3RpdmVseSBzaW5nbGUgdGhyZWFkZWQgaGVyZSAqLworCQkJaWYgKHR5cGUgPT0gR0JfTE9PUEJBQ0tfVFlQRV9QSU5HKQorCQkJCWVycm9yID0gZ2JfbG9vcGJhY2tfc3luY19waW5nKGdiKTsKKwkJCWVsc2UgaWYgKHR5cGUgPT0gR0JfTE9PUEJBQ0tfVFlQRV9UUkFOU0ZFUikKKwkJCQllcnJvciA9IGdiX2xvb3BiYWNrX3N5bmNfdHJhbnNmZXIoZ2IsIHNpemUpOworCQkJZWxzZSBpZiAodHlwZSA9PSBHQl9MT09QQkFDS19UWVBFX1NJTkspCisJCQkJZXJyb3IgPSBnYl9sb29wYmFja19zeW5jX3NpbmsoZ2IsIHNpemUpOworCisJCQlpZiAoZXJyb3IpCisJCQkJZ2ItPmVycm9yKys7CisJCQlnYi0+aXRlcmF0aW9uX2NvdW50Kys7CisJCQlnYl9sb29wYmFja19jYWxjdWxhdGVfc3RhdHMoZ2IsICEhZXJyb3IpOworCQl9CisJCWdiLT5zZW5kX2NvdW50Kys7CisJCWlmICh1c193YWl0KQorCQkJdWRlbGF5KHVzX3dhaXQpOworCX0KKworCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGJ1bmRsZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9sb29wYmFja19kYmdmc19sYXRlbmN5X3Nob3dfY29tbW9uKHN0cnVjdCBzZXFfZmlsZSAqcywKKwkJCQkJCSBzdHJ1Y3Qga2ZpZm8gKmtmaWZvLAorCQkJCQkJIHN0cnVjdCBtdXRleCAqbXV0ZXgpCit7CisJdTMyIGxhdGVuY3k7CisJaW50IHJldHZhbDsKKworCWlmIChrZmlmb19sZW4oa2ZpZm8pID09IDApIHsKKwkJcmV0dmFsID0gLUVBR0FJTjsKKwkJZ290byBkb25lOworCX0KKworCW11dGV4X2xvY2sobXV0ZXgpOworCXJldHZhbCA9IGtmaWZvX291dChrZmlmbywgJmxhdGVuY3ksIHNpemVvZihsYXRlbmN5KSk7CisJaWYgKHJldHZhbCA+IDApIHsKKwkJc2VxX3ByaW50ZihzLCAiJXUiLCBsYXRlbmN5KTsKKwkJcmV0dmFsID0gMDsKKwl9CisJbXV0ZXhfdW5sb2NrKG11dGV4KTsKK2RvbmU6CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBnYl9sb29wYmFja19kYmdmc19sYXRlbmN5X3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp1bnVzZWQpCit7CisJc3RydWN0IGdiX2xvb3BiYWNrICpnYiA9IHMtPnByaXZhdGU7CisKKwlyZXR1cm4gZ2JfbG9vcGJhY2tfZGJnZnNfbGF0ZW5jeV9zaG93X2NvbW1vbihzLCAmZ2ItPmtmaWZvX2xhdCwKKwkJCQkJCSAgICAgJmdiLT5tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgZ2JfbG9vcGJhY2tfbGF0ZW5jeV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBnYl9sb29wYmFja19kYmdmc19sYXRlbmN5X3Nob3csCisJCQkgICBpbm9kZS0+aV9wcml2YXRlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ2JfbG9vcGJhY2tfZGVidWdmc19sYXRlbmN5X29wcyA9IHsKKwkub3BlbgkJPSBnYl9sb29wYmFja19sYXRlbmN5X29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgZ2JfbG9vcGJhY2tfYnVzX2lkX2NvbXBhcmUodm9pZCAqcHJpdiwgc3RydWN0IGxpc3RfaGVhZCAqbGhhLAorCQkJCSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxoYikKK3sKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2sgKmEgPSBsaXN0X2VudHJ5KGxoYSwgc3RydWN0IGdiX2xvb3BiYWNrLCBlbnRyeSk7CisJc3RydWN0IGdiX2xvb3BiYWNrICpiID0gbGlzdF9lbnRyeShsaGIsIHN0cnVjdCBnYl9sb29wYmFjaywgZW50cnkpOworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjYSA9IGEtPmNvbm5lY3Rpb247CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNiID0gYi0+Y29ubmVjdGlvbjsKKworCWlmIChjYS0+YnVuZGxlLT5pbnRmLT5pbnRlcmZhY2VfaWQgPCBjYi0+YnVuZGxlLT5pbnRmLT5pbnRlcmZhY2VfaWQpCisJCXJldHVybiAtMTsKKwlpZiAoY2ItPmJ1bmRsZS0+aW50Zi0+aW50ZXJmYWNlX2lkIDwgY2EtPmJ1bmRsZS0+aW50Zi0+aW50ZXJmYWNlX2lkKQorCQlyZXR1cm4gMTsKKwlpZiAoY2EtPmJ1bmRsZS0+aWQgPCBjYi0+YnVuZGxlLT5pZCkKKwkJcmV0dXJuIC0xOworCWlmIChjYi0+YnVuZGxlLT5pZCA8IGNhLT5idW5kbGUtPmlkKQorCQlyZXR1cm4gMTsKKwlpZiAoY2EtPmludGZfY3BvcnRfaWQgPCBjYi0+aW50Zl9jcG9ydF9pZCkKKwkJcmV0dXJuIC0xOworCWVsc2UgaWYgKGNiLT5pbnRmX2Nwb3J0X2lkIDwgY2EtPmludGZfY3BvcnRfaWQpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdiX2xvb3BiYWNrX2luc2VydF9pZChzdHJ1Y3QgZ2JfbG9vcGJhY2sgKmdiKQoreworCXN0cnVjdCBnYl9sb29wYmFjayAqZ2JfbGlzdDsKKwl1MzIgbmV3X2xiaWQgPSAwOworCisJLyogcGVyZm9ybSBhbiBpbnNlcnRpb24gc29ydCAqLworCWxpc3RfYWRkX3RhaWwoJmdiLT5lbnRyeSwgJmdiX2Rldi5saXN0KTsKKwlsaXN0X3NvcnQoTlVMTCwgJmdiX2Rldi5saXN0LCBnYl9sb29wYmFja19idXNfaWRfY29tcGFyZSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShnYl9saXN0LCAmZ2JfZGV2Lmxpc3QsIGVudHJ5KSB7CisJCWdiX2xpc3QtPmxiaWQgPSAxIDw8IG5ld19sYmlkOworCQluZXdfbGJpZCsrOworCX0KK30KKworI2RlZmluZSBERUJVR0ZTX05BTUVMRU4gMzIKKworc3RhdGljIGludCBnYl9sb29wYmFja19wcm9iZShzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBncmV5YnVzX2J1bmRsZV9pZCAqaWQpCit7CisJc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcl9jcG9ydCAqY3BvcnRfZGVzYzsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2sgKmdiOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlpbnQgcmV0dmFsOworCWNoYXIgbmFtZVtERUJVR0ZTX05BTUVMRU5dOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoYnVuZGxlLT5udW1fY3BvcnRzICE9IDEpCisJCXJldHVybiAtRU5PREVWOworCisJY3BvcnRfZGVzYyA9ICZidW5kbGUtPmNwb3J0X2Rlc2NbMF07CisJaWYgKGNwb3J0X2Rlc2MtPnByb3RvY29sX2lkICE9IEdSRVlCVVNfUFJPVE9DT0xfTE9PUEJBQ0spCisJCXJldHVybiAtRU5PREVWOworCisJZ2IgPSBremFsbG9jKHNpemVvZigqZ2IpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvbm5lY3Rpb24gPSBnYl9jb25uZWN0aW9uX2NyZWF0ZShidW5kbGUsIGxlMTZfdG9fY3B1KGNwb3J0X2Rlc2MtPmlkKSwKKwkJCQkJICBnYl9sb29wYmFja19yZXF1ZXN0X2hhbmRsZXIpOworCWlmIChJU19FUlIoY29ubmVjdGlvbikpIHsKKwkJcmV0dmFsID0gUFRSX0VSUihjb25uZWN0aW9uKTsKKwkJZ290byBvdXRfa3phbGxvYzsKKwl9CisKKwlnYi0+Y29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisJZ3JleWJ1c19zZXRfZHJ2ZGF0YShidW5kbGUsIGdiKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmdiLT53cSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZ2ItPndxX2NvbXBsZXRpb24pOworCWF0b21pY19zZXQoJmdiLT5vdXRzdGFuZGluZ19vcGVyYXRpb25zLCAwKTsKKwlnYl9sb29wYmFja19yZXNldF9zdGF0cyhnYik7CisKKwkvKiBSZXBvcnRlZCB2YWx1ZXMgdG8gdXNlci1zcGFjZSBmb3IgbWluL21heCB0aW1lb3V0cyAqLworCWdiLT50aW1lb3V0X21pbiA9IGppZmZpZXNfdG9fdXNlY3MoR0JfTE9PUEJBQ0tfVElNRU9VVF9NSU4pOworCWdiLT50aW1lb3V0X21heCA9IGppZmZpZXNfdG9fdXNlY3MoR0JfTE9PUEJBQ0tfVElNRU9VVF9NQVgpOworCisJaWYgKCFnYl9kZXYuY291bnQpIHsKKwkJLyogQ2FsY3VsYXRlIG1heGltdW0gcGF5bG9hZCAqLworCQlnYl9kZXYuc2l6ZV9tYXggPSBnYl9vcGVyYXRpb25fZ2V0X3BheWxvYWRfc2l6ZV9tYXgoY29ubmVjdGlvbik7CisJCWlmIChnYl9kZXYuc2l6ZV9tYXggPD0KKwkJCXNpemVvZihzdHJ1Y3QgZ2JfbG9vcGJhY2tfdHJhbnNmZXJfcmVxdWVzdCkpIHsKKwkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9jb25uZWN0aW9uX2Rlc3Ryb3k7CisJCX0KKwkJZ2JfZGV2LnNpemVfbWF4IC09IHNpemVvZihzdHJ1Y3QgZ2JfbG9vcGJhY2tfdHJhbnNmZXJfcmVxdWVzdCk7CisJfQorCisJLyogQ3JlYXRlIHBlci1jb25uZWN0aW9uIHN5c2ZzIGFuZCBkZWJ1Z2ZzIGRhdGEtcG9pbnRzICovCisJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAicmF3X2xhdGVuY3lfJXMiLAorCQkgZGV2X25hbWUoJmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2KSk7CisJZ2ItPmZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIFNfSUZSRUcgfCBTX0lSVUdPLCBnYl9kZXYucm9vdCwgZ2IsCisJCQkJICAgICAgICZnYl9sb29wYmFja19kZWJ1Z2ZzX2xhdGVuY3lfb3BzKTsKKworCWdiLT5pZCA9IGlkYV9zaW1wbGVfZ2V0KCZsb29wYmFja19pZGEsIDAsIDAsIEdGUF9LRVJORUwpOworCWlmIChnYi0+aWQgPCAwKSB7CisJCXJldHZhbCA9IGdiLT5pZDsKKwkJZ290byBvdXRfZGVidWdmc19yZW1vdmU7CisJfQorCisJcmV0dmFsID0gZ2JfY29ubmVjdGlvbl9lbmFibGUoY29ubmVjdGlvbik7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXRfaWRhX3JlbW92ZTsKKworCWRldiA9IGRldmljZV9jcmVhdGVfd2l0aF9ncm91cHMoJmxvb3BiYWNrX2NsYXNzLAorCQkJCQkmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsCisJCQkJCU1LREVWKDAsIDApLCBnYiwgbG9vcGJhY2tfZ3JvdXBzLAorCQkJCQkiZ2JfbG9vcGJhY2slZCIsIGdiLT5pZCk7CisJaWYgKElTX0VSUihkZXYpKSB7CisJCXJldHZhbCA9IFBUUl9FUlIoZGV2KTsKKwkJZ290byBvdXRfY29ubmVjdGlvbl9kaXNhYmxlOworCX0KKwlnYi0+ZGV2ID0gZGV2OworCisJLyogQWxsb2NhdGUga2ZpZm8gKi8KKwlpZiAoa2ZpZm9fYWxsb2MoJmdiLT5rZmlmb19sYXQsIGtmaWZvX2RlcHRoICogc2l6ZW9mKHUzMiksCisJCQkgIEdGUF9LRVJORUwpKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2Nvbm47CisJfQorCWlmIChrZmlmb19hbGxvYygmZ2ItPmtmaWZvX3RzLCBrZmlmb19kZXB0aCAqIHNpemVvZihzdHJ1Y3QgdGltZXZhbCkgKiAyLAorCQkJICBHRlBfS0VSTkVMKSkgeworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIG91dF9rZmlmbzA7CisJfQorCisJLyogRm9yayB3b3JrZXIgdGhyZWFkICovCisJbXV0ZXhfaW5pdCgmZ2ItPm11dGV4KTsKKwlnYi0+dGFzayA9IGt0aHJlYWRfcnVuKGdiX2xvb3BiYWNrX2ZuLCBnYiwgImdiX2xvb3BiYWNrIik7CisJaWYgKElTX0VSUihnYi0+dGFzaykpIHsKKwkJcmV0dmFsID0gUFRSX0VSUihnYi0+dGFzayk7CisJCWdvdG8gb3V0X2tmaWZvMTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ2JfZGV2LmxvY2ssIGZsYWdzKTsKKwlnYl9sb29wYmFja19pbnNlcnRfaWQoZ2IpOworCWdiX2Rldi5jb3VudCsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdiX2Rldi5sb2NrLCBmbGFncyk7CisKKwlnYl9jb25uZWN0aW9uX2xhdGVuY3lfdGFnX2VuYWJsZShjb25uZWN0aW9uKTsKKworCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGJ1bmRsZSk7CisKKwlyZXR1cm4gMDsKKworb3V0X2tmaWZvMToKKwlrZmlmb19mcmVlKCZnYi0+a2ZpZm9fdHMpOworb3V0X2tmaWZvMDoKKwlrZmlmb19mcmVlKCZnYi0+a2ZpZm9fbGF0KTsKK291dF9jb25uOgorCWRldmljZV91bnJlZ2lzdGVyKGRldik7CitvdXRfY29ubmVjdGlvbl9kaXNhYmxlOgorCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShjb25uZWN0aW9uKTsKK291dF9pZGFfcmVtb3ZlOgorCWlkYV9zaW1wbGVfcmVtb3ZlKCZsb29wYmFja19pZGEsIGdiLT5pZCk7CitvdXRfZGVidWdmc19yZW1vdmU6CisJZGVidWdmc19yZW1vdmUoZ2ItPmZpbGUpOworb3V0X2Nvbm5lY3Rpb25fZGVzdHJveToKKwlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koY29ubmVjdGlvbik7CitvdXRfa3phbGxvYzoKKwlrZnJlZShnYik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBnYl9sb29wYmFja19kaXNjb25uZWN0KHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSkKK3sKKwlzdHJ1Y3QgZ2JfbG9vcGJhY2sgKmdiID0gZ3JleWJ1c19nZXRfZHJ2ZGF0YShidW5kbGUpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoYnVuZGxlKTsKKwlpZiAocmV0KQorCQlnYl9wbV9ydW50aW1lX2dldF9ub3Jlc3VtZShidW5kbGUpOworCisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGdiLT5jb25uZWN0aW9uKTsKKworCWlmICghSVNfRVJSX09SX05VTEwoZ2ItPnRhc2spKQorCQlrdGhyZWFkX3N0b3AoZ2ItPnRhc2spOworCisJa2ZpZm9fZnJlZSgmZ2ItPmtmaWZvX2xhdCk7CisJa2ZpZm9fZnJlZSgmZ2ItPmtmaWZvX3RzKTsKKwlnYl9jb25uZWN0aW9uX2xhdGVuY3lfdGFnX2Rpc2FibGUoZ2ItPmNvbm5lY3Rpb24pOworCWRlYnVnZnNfcmVtb3ZlKGdiLT5maWxlKTsKKworCS8qCisJICogRklYTUU6IGdiX2xvb3BiYWNrX2FzeW5jX3dhaXRfYWxsKCkgaXMgcmVkdW5kYW50IG5vdywgYXMgY29ubmVjdGlvbgorCSAqIGlzIGRpc2FibGVkIGF0IHRoZSBiZWdpbm5pbmcgYW5kIHNvIHdlIGNhbid0IGhhdmUgYW55IG1vcmUKKwkgKiBpbmNvbWluZy9vdXRnb2luZyByZXF1ZXN0cy4KKwkgKi8KKwlnYl9sb29wYmFja19hc3luY193YWl0X2FsbChnYik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ2JfZGV2LmxvY2ssIGZsYWdzKTsKKwlnYl9kZXYuY291bnQtLTsKKwlsaXN0X2RlbCgmZ2ItPmVudHJ5KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnYl9kZXYubG9jaywgZmxhZ3MpOworCisJZGV2aWNlX3VucmVnaXN0ZXIoZ2ItPmRldik7CisJaWRhX3NpbXBsZV9yZW1vdmUoJmxvb3BiYWNrX2lkYSwgZ2ItPmlkKTsKKworCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShnYi0+Y29ubmVjdGlvbik7CisJa2ZyZWUoZ2IpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGdyZXlidXNfYnVuZGxlX2lkIGdiX2xvb3BiYWNrX2lkX3RhYmxlW10gPSB7CisJeyBHUkVZQlVTX0RFVklDRV9DTEFTUyhHUkVZQlVTX0NMQVNTX0xPT1BCQUNLKSB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoZ3JleWJ1cywgZ2JfbG9vcGJhY2tfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGdyZXlidXNfZHJpdmVyIGdiX2xvb3BiYWNrX2RyaXZlciA9IHsKKwkubmFtZQkJPSAibG9vcGJhY2siLAorCS5wcm9iZQkJPSBnYl9sb29wYmFja19wcm9iZSwKKwkuZGlzY29ubmVjdAk9IGdiX2xvb3BiYWNrX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlCT0gZ2JfbG9vcGJhY2tfaWRfdGFibGUsCit9OworCitzdGF0aWMgaW50IGxvb3BiYWNrX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJSU5JVF9MSVNUX0hFQUQoJmdiX2Rldi5saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZ2JfZGV2Lmxpc3Rfb3BfYXN5bmMpOworCXNwaW5fbG9ja19pbml0KCZnYl9kZXYubG9jayk7CisJZ2JfZGV2LnJvb3QgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImdiX2xvb3BiYWNrIiwgTlVMTCk7CisKKwlyZXR2YWwgPSBjbGFzc19yZWdpc3RlcigmbG9vcGJhY2tfY2xhc3MpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyOworCisJcmV0dmFsID0gZ3JleWJ1c19yZWdpc3RlcigmZ2JfbG9vcGJhY2tfZHJpdmVyKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycl91bnJlZ2lzdGVyOworCisJcmV0dXJuIDA7CisKK2Vycl91bnJlZ2lzdGVyOgorCWNsYXNzX3VucmVnaXN0ZXIoJmxvb3BiYWNrX2NsYXNzKTsKK2VycjoKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZ2JfZGV2LnJvb3QpOworCXJldHVybiByZXR2YWw7Cit9Cittb2R1bGVfaW5pdChsb29wYmFja19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGxvb3BiYWNrX2V4aXQodm9pZCkKK3sKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZ2JfZGV2LnJvb3QpOworCWdyZXlidXNfZGVyZWdpc3RlcigmZ2JfbG9vcGJhY2tfZHJpdmVyKTsKKwljbGFzc191bnJlZ2lzdGVyKCZsb29wYmFja19jbGFzcyk7CisJaWRhX2Rlc3Ryb3koJmxvb3BiYWNrX2lkYSk7Cit9Cittb2R1bGVfZXhpdChsb29wYmFja19leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvbWFuaWZlc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL21hbmlmZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I5MDM3NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL21hbmlmZXN0LmMKQEAgLTAsMCArMSw1MzUgQEAKKy8qCisgKiBHcmV5YnVzIG1hbmlmZXN0IHBhcnNpbmcKKyAqCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE1IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE1IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2luY2x1ZGUgImdyZXlidXMuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKmdldF9kZXNjcmlwdG9yX3R5cGVfc3RyaW5nKHU4IHR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBHUkVZQlVTX1RZUEVfSU5WQUxJRDoKKwkJcmV0dXJuICJpbnZhbGlkIjsKKwljYXNlIEdSRVlCVVNfVFlQRV9TVFJJTkc6CisJCXJldHVybiAic3RyaW5nIjsKKwljYXNlIEdSRVlCVVNfVFlQRV9JTlRFUkZBQ0U6CisJCXJldHVybiAiaW50ZXJmYWNlIjsKKwljYXNlIEdSRVlCVVNfVFlQRV9DUE9SVDoKKwkJcmV0dXJuICJjcG9ydCI7CisJY2FzZSBHUkVZQlVTX1RZUEVfQlVORExFOgorCQlyZXR1cm4gImJ1bmRsZSI7CisJZGVmYXVsdDoKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuICJ1bmtub3duIjsKKwl9Cit9CisKKy8qCisgKiBXZSBzY2FuIHRoZSBtYW5pZmVzdCBvbmNlIHRvIGlkZW50aWZ5IHdoZXJlIGFsbCB0aGUgZGVzY3JpcHRvcnMKKyAqIGFyZS4gIFRoZSByZXN1bHQgaXMgYSBsaXN0IG9mIHRoZXNlIG1hbmlmZXN0X2Rlc2Mgc3RydWN0dXJlcy4gIFdlCisgKiB0aGVuIHBpY2sgdGhyb3VnaCB0aGVtIGZvciB3aGF0IHdlJ3JlIGxvb2tpbmcgZm9yIChzdGFydGluZyB3aXRoCisgKiB0aGUgaW50ZXJmYWNlIGRlc2NyaXB0b3IpLiAgQXMgZWFjaCBpcyBwcm9jZXNzZWQgd2UgcmVtb3ZlIGl0IGZyb20KKyAqIHRoZSBsaXN0LiAgV2hlbiB3ZSdyZSBkb25lIHRoZSBsaXN0IHNob3VsZCAocHJvYmFibHkpIGJlIGVtcHR5LgorICovCitzdHJ1Y3QgbWFuaWZlc3RfZGVzYyB7CisJc3RydWN0IGxpc3RfaGVhZAkJbGlua3M7CisKKwlzaXplX3QJCQkJc2l6ZTsKKwl2b2lkCQkJCSpkYXRhOworCWVudW0gZ3JleWJ1c19kZXNjcmlwdG9yX3R5cGUJdHlwZTsKK307CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfbWFuaWZlc3RfZGVzY3JpcHRvcihzdHJ1Y3QgbWFuaWZlc3RfZGVzYyAqZGVzY3JpcHRvcikKK3sKKwlsaXN0X2RlbCgmZGVzY3JpcHRvci0+bGlua3MpOworCWtmcmVlKGRlc2NyaXB0b3IpOworfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX21hbmlmZXN0X2Rlc2NyaXB0b3JzKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IG1hbmlmZXN0X2Rlc2MgKmRlc2NyaXB0b3I7CisJc3RydWN0IG1hbmlmZXN0X2Rlc2MgKm5leHQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVzY3JpcHRvciwgbmV4dCwgJmludGYtPm1hbmlmZXN0X2Rlc2NzLCBsaW5rcykKKwkJcmVsZWFzZV9tYW5pZmVzdF9kZXNjcmlwdG9yKGRlc2NyaXB0b3IpOworfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX2Nwb3J0X2Rlc2NyaXB0b3JzKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHU4IGJ1bmRsZV9pZCkKK3sKKwlzdHJ1Y3QgbWFuaWZlc3RfZGVzYyAqZGVzYywgKnRtcDsKKwlzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yX2Nwb3J0ICpkZXNjX2Nwb3J0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlc2MsIHRtcCwgaGVhZCwgbGlua3MpIHsKKwkJZGVzY19jcG9ydCA9IGRlc2MtPmRhdGE7CisKKwkJaWYgKGRlc2MtPnR5cGUgIT0gR1JFWUJVU19UWVBFX0NQT1JUKQorCQkJY29udGludWU7CisKKwkJaWYgKGRlc2NfY3BvcnQtPmJ1bmRsZSA9PSBidW5kbGVfaWQpCisJCQlyZWxlYXNlX21hbmlmZXN0X2Rlc2NyaXB0b3IoZGVzYyk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IG1hbmlmZXN0X2Rlc2MgKmdldF9uZXh0X2J1bmRsZV9kZXNjKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IG1hbmlmZXN0X2Rlc2MgKmRlc2NyaXB0b3I7CisJc3RydWN0IG1hbmlmZXN0X2Rlc2MgKm5leHQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVzY3JpcHRvciwgbmV4dCwgJmludGYtPm1hbmlmZXN0X2Rlc2NzLCBsaW5rcykKKwkJaWYgKGRlc2NyaXB0b3ItPnR5cGUgPT0gR1JFWUJVU19UWVBFX0JVTkRMRSkKKwkJCXJldHVybiBkZXNjcmlwdG9yOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gZGVzY3JpcHRvci4gIEl0cyByZXBvcnRlZCBzaXplIG11c3QgZml0IHdpdGhpbgorICogdGhlIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcsIGFuZCBpdCBtdXN0IGhhdmUgYSByZWNvZ25pemVkCisgKiB0eXBlLiAgQ2hlY2sgdGhhdCB0aGUgcmVwb3J0ZWQgc2l6ZSBpcyBhdCBsZWFzdCBhcyBiaWcgYXMgd2hhdAorICogd2UgZXhwZWN0IHRvIHNlZS4gIChJdCBjb3VsZCBiZSBiaWdnZXIsIHBlcmhhcHMgZm9yIGEgbmV3IHZlcnNpb24KKyAqIG9mIHRoZSBmb3JtYXQuKQorICoKKyAqIFJldHVybnMgdGhlIChub24temVybykgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGJ5IHRoZSBkZXNjcmlwdG9yLAorICogb3IgYSBuZWdhdGl2ZSBlcnJuby4KKyAqLworc3RhdGljIGludCBpZGVudGlmeV9kZXNjcmlwdG9yKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYsCisJCQkgICAgICAgc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvciAqZGVzYywgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcl9oZWFkZXIgKmRlc2NfaGVhZGVyID0gJmRlc2MtPmhlYWRlcjsKKwlzdHJ1Y3QgbWFuaWZlc3RfZGVzYyAqZGVzY3JpcHRvcjsKKwlzaXplX3QgZGVzY19zaXplOworCXNpemVfdCBleHBlY3RlZF9zaXplOworCisJaWYgKHNpemUgPCBzaXplb2YoKmRlc2NfaGVhZGVyKSkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJtYW5pZmVzdCB0b28gc21hbGwgKCV6dSA8ICV6dSlcbiIsCisJCQkJc2l6ZSwgc2l6ZW9mKCpkZXNjX2hlYWRlcikpOworCQlyZXR1cm4gLUVJTlZBTDsJCS8qIE11c3QgYXQgbGVhc3QgaGF2ZSBoZWFkZXIgKi8KKwl9CisKKwlkZXNjX3NpemUgPSBsZTE2X3RvX2NwdShkZXNjX2hlYWRlci0+c2l6ZSk7CisJaWYgKGRlc2Nfc2l6ZSA+IHNpemUpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiZGVzY3JpcHRvciB0b28gYmlnICglenUgPiAlenUpXG4iLAorCQkJCWRlc2Nfc2l6ZSwgc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIERlc2NyaXB0b3IgbmVlZHMgdG8gYXQgbGVhc3QgaGF2ZSBhIGhlYWRlciAqLworCWV4cGVjdGVkX3NpemUgPSBzaXplb2YoKmRlc2NfaGVhZGVyKTsKKworCXN3aXRjaCAoZGVzY19oZWFkZXItPnR5cGUpIHsKKwljYXNlIEdSRVlCVVNfVFlQRV9TVFJJTkc6CisJCWV4cGVjdGVkX3NpemUgKz0gc2l6ZW9mKHN0cnVjdCBncmV5YnVzX2Rlc2NyaXB0b3Jfc3RyaW5nKTsKKwkJZXhwZWN0ZWRfc2l6ZSArPSBkZXNjLT5zdHJpbmcubGVuZ3RoOworCisJCS8qIFN0cmluZyBkZXNjcmlwdG9ycyBhcmUgcGFkZGVkIHRvIDQgYnl0ZSBib3VuZGFyaWVzICovCisJCWV4cGVjdGVkX3NpemUgPSBBTElHTihleHBlY3RlZF9zaXplLCA0KTsKKwkJYnJlYWs7CisJY2FzZSBHUkVZQlVTX1RZUEVfSU5URVJGQUNFOgorCQlleHBlY3RlZF9zaXplICs9IHNpemVvZihzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yX2ludGVyZmFjZSk7CisJCWJyZWFrOworCWNhc2UgR1JFWUJVU19UWVBFX0JVTkRMRToKKwkJZXhwZWN0ZWRfc2l6ZSArPSBzaXplb2Yoc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcl9idW5kbGUpOworCQlicmVhazsKKwljYXNlIEdSRVlCVVNfVFlQRV9DUE9SVDoKKwkJZXhwZWN0ZWRfc2l6ZSArPSBzaXplb2Yoc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcl9jcG9ydCk7CisJCWJyZWFrOworCWNhc2UgR1JFWUJVU19UWVBFX0lOVkFMSUQ6CisJZGVmYXVsdDoKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiaW52YWxpZCBkZXNjcmlwdG9yIHR5cGUgKCV1KVxuIiwKKwkJCQlkZXNjX2hlYWRlci0+dHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChkZXNjX3NpemUgPCBleHBlY3RlZF9zaXplKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIiVzIGRlc2NyaXB0b3IgdG9vIHNtYWxsICglenUgPCAlenUpXG4iLAorCQkJCWdldF9kZXNjcmlwdG9yX3R5cGVfc3RyaW5nKGRlc2NfaGVhZGVyLT50eXBlKSwKKwkJCQlkZXNjX3NpemUsIGV4cGVjdGVkX3NpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBEZXNjcmlwdG9yIGJpZ2dlciB0aGFuIHdoYXQgd2UgZXhwZWN0ICovCisJaWYgKGRlc2Nfc2l6ZSA+IGV4cGVjdGVkX3NpemUpIHsKKwkJZGV2X3dhcm4oJmludGYtPmRldiwgIiVzIGRlc2NyaXB0b3Igc2l6ZSBtaXNtYXRjaCAod2FudCAlenUgZ290ICV6dSlcbiIsCisJCQkJZ2V0X2Rlc2NyaXB0b3JfdHlwZV9zdHJpbmcoZGVzY19oZWFkZXItPnR5cGUpLAorCQkJCWV4cGVjdGVkX3NpemUsIGRlc2Nfc2l6ZSk7CisJfQorCisJZGVzY3JpcHRvciA9IGt6YWxsb2Moc2l6ZW9mKCpkZXNjcmlwdG9yKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXNjcmlwdG9yKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRlc2NyaXB0b3ItPnNpemUgPSBkZXNjX3NpemU7CisJZGVzY3JpcHRvci0+ZGF0YSA9IChjaGFyICopZGVzYyArIHNpemVvZigqZGVzY19oZWFkZXIpOworCWRlc2NyaXB0b3ItPnR5cGUgPSBkZXNjX2hlYWRlci0+dHlwZTsKKwlsaXN0X2FkZF90YWlsKCZkZXNjcmlwdG9yLT5saW5rcywgJmludGYtPm1hbmlmZXN0X2Rlc2NzKTsKKworCS8qIGRlc2Nfc2l6ZSBpcyBwb3NpdGl2ZSBhbmQgaXMga25vd24gdG8gZml0IGluIGEgc2lnbmVkIGludCAqLworCisJcmV0dXJuIGRlc2Nfc2l6ZTsKK30KKworLyoKKyAqIEZpbmQgdGhlIHN0cmluZyBkZXNjcmlwdG9yIGhhdmluZyB0aGUgZ2l2ZW4gaWQsIHZhbGlkYXRlIGl0LCBhbmQKKyAqIGFsbG9jYXRlIGEgZHVwbGljYXRlIGNvcHkgb2YgaXQuICBUaGUgZHVwbGljYXRlIGhhcyBhbiBleHRyYSBieXRlCisgKiB3aGljaCBndWFyYW50ZWVzIHRoZSByZXR1cm5lZCBzdHJpbmcgaXMgTlVMLXRlcm1pbmF0ZWQuCisgKgorICogU3RyaW5nIGluZGV4IDAgaXMgdmFsaWQgKGl0IHJlcHJlc2VudHMgIm5vIHN0cmluZyIpLCBhbmQgZm9yCisgKiB0aGF0IGEgbnVsbCBwb2ludGVyIGlzIHJldHVybmVkLgorICoKKyAqIE90aGVyd2lzZSByZXR1cm5zIGEgcG9pbnRlciB0byBhIG5ld2x5LWFsbG9jYXRlZCBjb3B5IG9mIHRoZQorICogZGVzY3JpcHRvciBzdHJpbmcsIG9yIGFuIGVycm9yLWNvZGVkIHBvaW50ZXIgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGNoYXIgKmdiX3N0cmluZ19nZXQoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZiwgdTggc3RyaW5nX2lkKQoreworCXN0cnVjdCBncmV5YnVzX2Rlc2NyaXB0b3Jfc3RyaW5nICpkZXNjX3N0cmluZzsKKwlzdHJ1Y3QgbWFuaWZlc3RfZGVzYyAqZGVzY3JpcHRvcjsKKwlib29sIGZvdW5kID0gZmFsc2U7CisJY2hhciAqc3RyaW5nOworCisJLyogQSB6ZXJvIHN0cmluZyBpZCBtZWFucyBubyBzdHJpbmcgKGJ1dCBubyBlcnJvcikgKi8KKwlpZiAoIXN0cmluZ19pZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRlc2NyaXB0b3IsICZpbnRmLT5tYW5pZmVzdF9kZXNjcywgbGlua3MpIHsKKwkJaWYgKGRlc2NyaXB0b3ItPnR5cGUgIT0gR1JFWUJVU19UWVBFX1NUUklORykKKwkJCWNvbnRpbnVlOworCisJCWRlc2Nfc3RyaW5nID0gZGVzY3JpcHRvci0+ZGF0YTsKKwkJaWYgKGRlc2Nfc3RyaW5nLT5pZCA9PSBzdHJpbmdfaWQpIHsKKwkJCWZvdW5kID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghZm91bmQpCisJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCisJLyogQWxsb2NhdGUgYW4gZXh0cmEgYnl0ZSBzbyB3ZSBjYW4gZ3VhcmFudGVlIGl0J3MgTlVMLXRlcm1pbmF0ZWQgKi8KKwlzdHJpbmcgPSBrbWVtZHVwKCZkZXNjX3N0cmluZy0+c3RyaW5nLCBkZXNjX3N0cmluZy0+bGVuZ3RoICsgMSwKKwkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXN0cmluZykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJc3RyaW5nW2Rlc2Nfc3RyaW5nLT5sZW5ndGhdID0gJ1wwJzsKKworCS8qIE9rIHdlJ3ZlIHVzZWQgdGhpcyBzdHJpbmcsIHNvIHdlJ3JlIGRvbmUgd2l0aCBpdCAqLworCXJlbGVhc2VfbWFuaWZlc3RfZGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKKworCXJldHVybiBzdHJpbmc7Cit9CisKKy8qCisgKiBGaW5kIGNwb3J0IGRlc2NyaXB0b3JzIGluIHRoZSBtYW5pZmVzdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuCisgKiBidW5kbGUsIGFuZCBzZXQgdXAgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGUgZnVuY3Rpb25zIHRoYXQgdXNlCisgKiB0aGVtLiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNwb3J0cyBzZXQgdXAgZm9yIHRoZSBidW5kbGUsIG9yIDAKKyAqIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICovCitzdGF0aWMgdTMyIGdiX21hbmlmZXN0X3BhcnNlX2Nwb3J0cyhzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUpCit7CisJc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZiA9IGJ1bmRsZS0+aW50ZjsKKwlzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yX2Nwb3J0ICpkZXNjX2Nwb3J0OworCXN0cnVjdCBtYW5pZmVzdF9kZXNjICpkZXNjLCAqbmV4dCwgKnRtcDsKKwlMSVNUX0hFQUQobGlzdCk7CisJdTggYnVuZGxlX2lkID0gYnVuZGxlLT5pZDsKKwl1MTYgY3BvcnRfaWQ7CisJdTMyIGNvdW50ID0gMDsKKwlpbnQgaTsKKworCS8qIFNldCB1cCBhbGwgY3BvcnQgZGVzY3JpcHRvcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYnVuZGxlICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlc2MsIG5leHQsICZpbnRmLT5tYW5pZmVzdF9kZXNjcywgbGlua3MpIHsKKwkJaWYgKGRlc2MtPnR5cGUgIT0gR1JFWUJVU19UWVBFX0NQT1JUKQorCQkJY29udGludWU7CisKKwkJZGVzY19jcG9ydCA9IGRlc2MtPmRhdGE7CisJCWlmIChkZXNjX2Nwb3J0LT5idW5kbGUgIT0gYnVuZGxlX2lkKQorCQkJY29udGludWU7CisKKwkJY3BvcnRfaWQgPSBsZTE2X3RvX2NwdShkZXNjX2Nwb3J0LT5pZCk7CisJCWlmIChjcG9ydF9pZCA+IENQT1JUX0lEX01BWCkKKwkJCWdvdG8gZXhpdDsKKworCQkvKiBOb3RoaW5nIGVsc2Ugc2hvdWxkIGhhdmUgaXRzIGNwb3J0X2lkIGFzIGNvbnRyb2wgY3BvcnQgaWQgKi8KKwkJaWYgKGNwb3J0X2lkID09IEdCX0NPTlRST0xfQ1BPUlRfSUQpIHsKKwkJCWRldl9lcnIoJmJ1bmRsZS0+ZGV2LCAiaW52YWxpZCBjcG9ydCBpZCBmb3VuZCAoJTAydSlcbiIsCisJCQkJY3BvcnRfaWQpOworCQkJZ290byBleGl0OworCQl9CisKKwkJLyoKKwkJICogRm91bmQgb25lLCBtb3ZlIGl0IHRvIG91ciB0ZW1wb3JhcnkgbGlzdCBhZnRlciBjaGVja2luZyBmb3IKKwkJICogZHVwbGljYXRlcy4KKwkJICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmbGlzdCwgbGlua3MpIHsKKwkJCWRlc2NfY3BvcnQgPSB0bXAtPmRhdGE7CisJCQlpZiAoY3BvcnRfaWQgPT0gbGUxNl90b19jcHUoZGVzY19jcG9ydC0+aWQpKSB7CisJCQkJZGV2X2VycigmYnVuZGxlLT5kZXYsCisJCQkJCQkiZHVwbGljYXRlIENQb3J0ICV1IGZvdW5kXG4iLAorCQkJCQkJY3BvcnRfaWQpOworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKwkJfQorCQlsaXN0X21vdmVfdGFpbCgmZGVzYy0+bGlua3MsICZsaXN0KTsKKwkJY291bnQrKzsKKwl9CisKKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gMDsKKworCWJ1bmRsZS0+Y3BvcnRfZGVzYyA9IGtjYWxsb2MoY291bnQsIHNpemVvZigqYnVuZGxlLT5jcG9ydF9kZXNjKSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFidW5kbGUtPmNwb3J0X2Rlc2MpCisJCWdvdG8gZXhpdDsKKworCWJ1bmRsZS0+bnVtX2Nwb3J0cyA9IGNvdW50OworCisJaSA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlc2MsIG5leHQsICZsaXN0LCBsaW5rcykgeworCQlkZXNjX2Nwb3J0ID0gZGVzYy0+ZGF0YTsKKwkJbWVtY3B5KCZidW5kbGUtPmNwb3J0X2Rlc2NbaSsrXSwgZGVzY19jcG9ydCwKKwkJCQlzaXplb2YoKmRlc2NfY3BvcnQpKTsKKworCQkvKiBSZWxlYXNlIHRoZSBjcG9ydCBkZXNjcmlwdG9yICovCisJCXJlbGVhc2VfbWFuaWZlc3RfZGVzY3JpcHRvcihkZXNjKTsKKwl9CisKKwlyZXR1cm4gY291bnQ7CitleGl0OgorCXJlbGVhc2VfY3BvcnRfZGVzY3JpcHRvcnMoJmxpc3QsIGJ1bmRsZV9pZCk7CisJLyoKKwkgKiBGcmVlIGFsbCBjcG9ydHMgZm9yIHRoaXMgYnVuZGxlIHRvIGF2b2lkICdleGNlc3MgZGVzY3JpcHRvcnMnCisJICogd2FybmluZ3MuCisJICovCisJcmVsZWFzZV9jcG9ydF9kZXNjcmlwdG9ycygmaW50Zi0+bWFuaWZlc3RfZGVzY3MsIGJ1bmRsZV9pZCk7CisKKwlyZXR1cm4gMDsJLyogRXJyb3I7IGNvdW50IHNob3VsZCBhbHNvIGJlIDAgKi8KK30KKworLyoKKyAqIEZpbmQgYnVuZGxlIGRlc2NyaXB0b3JzIGluIHRoZSBtYW5pZmVzdCBhbmQgc2V0IHVwIHRoZWlyIGRhdGEKKyAqIHN0cnVjdHVyZXMuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnVuZGxlcyBzZXQgdXAgZm9yIHRoZQorICogZ2l2ZW4gaW50ZXJmYWNlLgorICovCitzdGF0aWMgdTMyIGdiX21hbmlmZXN0X3BhcnNlX2J1bmRsZXMoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgbWFuaWZlc3RfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGU7CisJc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlX25leHQ7CisJdTMyIGNvdW50ID0gMDsKKwl1OCBidW5kbGVfaWQ7CisJdTggY2xhc3M7CisKKwl3aGlsZSAoKGRlc2MgPSBnZXRfbmV4dF9idW5kbGVfZGVzYyhpbnRmKSkpIHsKKwkJc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcl9idW5kbGUgKmRlc2NfYnVuZGxlOworCisJCS8qIEZvdW5kIG9uZS4gIFNldCB1cCBpdHMgYnVuZGxlIHN0cnVjdHVyZSovCisJCWRlc2NfYnVuZGxlID0gZGVzYy0+ZGF0YTsKKwkJYnVuZGxlX2lkID0gZGVzY19idW5kbGUtPmlkOworCQljbGFzcyA9IGRlc2NfYnVuZGxlLT5jbGFzczsKKworCQkvKiBEb25lIHdpdGggdGhpcyBidW5kbGUgZGVzY3JpcHRvciAqLworCQlyZWxlYXNlX21hbmlmZXN0X2Rlc2NyaXB0b3IoZGVzYyk7CisKKwkJLyogSWdub3JlIGFueSBsZWdhY3kgY29udHJvbCBidW5kbGVzICovCisJCWlmIChidW5kbGVfaWQgPT0gR0JfQ09OVFJPTF9CVU5ETEVfSUQpIHsKKwkJCWRldl9kYmcoJmludGYtPmRldiwgIiVzIC0gaWdub3JpbmcgY29udHJvbCBidW5kbGVcbiIsCisJCQkJCV9fZnVuY19fKTsKKwkJCXJlbGVhc2VfY3BvcnRfZGVzY3JpcHRvcnMoJmludGYtPm1hbmlmZXN0X2Rlc2NzLAorCQkJCQkJCQlidW5kbGVfaWQpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBOb3RoaW5nIGVsc2Ugc2hvdWxkIGhhdmUgaXRzIGNsYXNzIHNldCB0byBjb250cm9sIGNsYXNzICovCisJCWlmIChjbGFzcyA9PSBHUkVZQlVTX0NMQVNTX0NPTlRST0wpIHsKKwkJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCQkiYnVuZGxlICV1IGNhbm5vdCB1c2UgY29udHJvbCBjbGFzc1xuIiwKKwkJCQlidW5kbGVfaWQpOworCQkJZ290byBjbGVhbnVwOworCQl9CisKKwkJYnVuZGxlID0gZ2JfYnVuZGxlX2NyZWF0ZShpbnRmLCBidW5kbGVfaWQsIGNsYXNzKTsKKwkJaWYgKCFidW5kbGUpCisJCQlnb3RvIGNsZWFudXA7CisKKwkJLyoKKwkJICogTm93IGdvIHNldCB1cCB0aGlzIGJ1bmRsZSdzIGZ1bmN0aW9ucyBhbmQgY3BvcnRzLgorCQkgKgorCQkgKiBBICdidW5kbGUnIHJlcHJlc2VudHMgYSBkZXZpY2UgaW4gZ3JleWJ1cy4gSXQgbWF5IHJlcXVpcmUKKwkJICogbXVsdGlwbGUgY3BvcnRzIGZvciBpdHMgZnVuY3Rpb25pbmcuIElmIHdlIGZhaWwgdG8gc2V0dXAgYW55CisJCSAqIGNwb3J0IG9mIGEgYnVuZGxlLCB3ZSBiZXR0ZXIgcmVqZWN0IHRoZSBjb21wbGV0ZSBidW5kbGUgYXMKKwkJICogdGhlIGRldmljZSBtYXkgbm90IGJlIGFibGUgdG8gZnVuY3Rpb24gcHJvcGVybHkgdGhlbi4KKwkJICoKKwkJICogQnV0LCBmYWlsaW5nIHRvIHNldHVwIGEgY3BvcnQgb2YgYnVuZGxlIFggZG9lc24ndCBtZWFuIHRoYXQKKwkJICogdGhlIGRldmljZSBjb3JyZXNwb25kaW5nIHRvIGJ1bmRsZSBZIHdpbGwgbm90IHdvcmsgcHJvcGVybHkuCisJCSAqIEJ1bmRsZXMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgc2VwYXJhdGUgaW5kZXBlbmRlbnQgZGV2aWNlcy4KKwkJICoKKwkJICogV2hpbGUgcGFyc2luZyBtYW5pZmVzdCBmb3IgYW4gaW50ZXJmYWNlLCB0cmVhdCBidW5kbGVzIGFzCisJCSAqIHNlcGFyYXRlIGVudGl0aWVzIGFuZCBkb24ndCByZWplY3QgZW50aXJlIGludGVyZmFjZSBhbmQgaXRzCisJCSAqIGJ1bmRsZXMgb24gZmFpbGluZyB0byBpbml0aWFsaXplIGEgY3BvcnQuIEJ1dCBtYWtlIHN1cmUgdGhlCisJCSAqIGJ1bmRsZSB3aGljaCBuZWVkcyB0aGUgY3BvcnQsIGdldHMgZGVzdHJveWVkIHByb3Blcmx5LgorCQkgKi8KKwkJaWYgKCFnYl9tYW5pZmVzdF9wYXJzZV9jcG9ydHMoYnVuZGxlKSkgeworCQkJZ2JfYnVuZGxlX2Rlc3Ryb3koYnVuZGxlKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJY291bnQrKzsKKwl9CisKKwlyZXR1cm4gY291bnQ7CitjbGVhbnVwOgorCS8qIEFuIGVycm9yIG9jY3VycmVkOyB1bmRvIGFueSBjaGFuZ2VzIHdlJ3ZlIG1hZGUgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYnVuZGxlLCBidW5kbGVfbmV4dCwgJmludGYtPmJ1bmRsZXMsIGxpbmtzKSB7CisJCWdiX2J1bmRsZV9kZXN0cm95KGJ1bmRsZSk7CisJCWNvdW50LS07CisJfQorCXJldHVybiAwOwkvKiBFcnJvcjsgY291bnQgc2hvdWxkIGFsc28gYmUgMCAqLworfQorCitzdGF0aWMgYm9vbCBnYl9tYW5pZmVzdF9wYXJzZV9pbnRlcmZhY2Uoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZiwKKwkJCQkJc3RydWN0IG1hbmlmZXN0X2Rlc2MgKmludGVyZmFjZV9kZXNjKQoreworCXN0cnVjdCBncmV5YnVzX2Rlc2NyaXB0b3JfaW50ZXJmYWNlICpkZXNjX2ludGYgPSBpbnRlcmZhY2VfZGVzYy0+ZGF0YTsKKwlzdHJ1Y3QgZ2JfY29udHJvbCAqY29udHJvbCA9IGludGYtPmNvbnRyb2w7CisJY2hhciAqc3RyOworCisJLyogSGFuZGxlIHRoZSBzdHJpbmdzIGZpcnN0LS10aGV5IGNhbiBmYWlsICovCisJc3RyID0gZ2Jfc3RyaW5nX2dldChpbnRmLCBkZXNjX2ludGYtPnZlbmRvcl9zdHJpbmdpZCk7CisJaWYgKElTX0VSUihzdHIpKQorCQlyZXR1cm4gZmFsc2U7CisJY29udHJvbC0+dmVuZG9yX3N0cmluZyA9IHN0cjsKKworCXN0ciA9IGdiX3N0cmluZ19nZXQoaW50ZiwgZGVzY19pbnRmLT5wcm9kdWN0X3N0cmluZ2lkKTsKKwlpZiAoSVNfRVJSKHN0cikpCisJCWdvdG8gb3V0X2ZyZWVfdmVuZG9yX3N0cmluZzsKKwljb250cm9sLT5wcm9kdWN0X3N0cmluZyA9IHN0cjsKKworCS8qIEFzc2lnbiBmZWF0dXJlIGZsYWdzIGNvbW11bmljYXRlZCB2aWEgbWFuaWZlc3QgKi8KKwlpbnRmLT5mZWF0dXJlcyA9IGRlc2NfaW50Zi0+ZmVhdHVyZXM7CisKKwkvKiBSZWxlYXNlIHRoZSBpbnRlcmZhY2UgZGVzY3JpcHRvciwgbm93IHRoYXQgd2UncmUgZG9uZSB3aXRoIGl0ICovCisJcmVsZWFzZV9tYW5pZmVzdF9kZXNjcmlwdG9yKGludGVyZmFjZV9kZXNjKTsKKworCS8qIEFuIGludGVyZmFjZSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGJ1bmRsZSBkZXNjcmlwdG9yICovCisJaWYgKCFnYl9tYW5pZmVzdF9wYXJzZV9idW5kbGVzKGludGYpKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIm1hbmlmZXN0IGJ1bmRsZSBkZXNjcmlwdG9ycyBub3QgdmFsaWRcbiIpOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJcmV0dXJuIHRydWU7CitvdXRfZXJyOgorCWtmcmVlKGNvbnRyb2wtPnByb2R1Y3Rfc3RyaW5nKTsKKwljb250cm9sLT5wcm9kdWN0X3N0cmluZyA9IE5VTEw7CitvdXRfZnJlZV92ZW5kb3Jfc3RyaW5nOgorCWtmcmVlKGNvbnRyb2wtPnZlbmRvcl9zdHJpbmcpOworCWNvbnRyb2wtPnZlbmRvcl9zdHJpbmcgPSBOVUxMOworCisJcmV0dXJuIGZhbHNlOworfQorCisvKgorICogUGFyc2UgYSBidWZmZXIgY29udGFpbmluZyBhbiBpbnRlcmZhY2UgbWFuaWZlc3QuCisgKgorICogSWYgd2UgZmluZCBhbnl0aGluZyB3cm9uZyB3aXRoIHRoZSBjb250ZW50L2Zvcm1hdCBvZiB0aGUgYnVmZmVyCisgKiB3ZSByZWplY3QgaXQuCisgKgorICogVGhlIGZpcnN0IHJlcXVpcmVtZW50IGlzIHRoYXQgdGhlIG1hbmlmZXN0J3MgdmVyc2lvbiBpcworICogb25lIHdlIGNhbiBwYXJzZS4KKyAqCisgKiBXZSBtYWtlIGFuIGluaXRpYWwgcGFzcyB0aHJvdWdoIHRoZSBidWZmZXIgYW5kIGlkZW50aWZ5IGFsbCBvZgorICogdGhlIGRlc2NyaXB0b3JzIGl0IGNvbnRhaW5zLCBrZWVwaW5nIHRyYWNrIGZvciBlYWNoIGl0cyB0eXBlCisgKiBhbmQgdGhlIGxvY2F0aW9uIHNpemUgb2YgaXRzIGRhdGEgaW4gdGhlIGJ1ZmZlci4KKyAqCisgKiBOZXh0IHdlIHNjYW4gdGhlIGRlc2NyaXB0b3JzLCBsb29raW5nIGZvciBhbiBpbnRlcmZhY2UgZGVzY3JpcHRvcjsKKyAqIHRoZXJlIG11c3QgYmUgZXhhY3RseSBvbmUgb2YgdGhvc2UuICBXaGVuIGZvdW5kLCB3ZSByZWNvcmQgdGhlCisgKiBpbmZvcm1hdGlvbiBpdCBjb250YWlucywgYW5kIHRoZW4gcmVtb3ZlIHRoYXQgZGVzY3JpcHRvciAoYW5kIGFueQorICogc3RyaW5nIGRlc2NyaXB0b3JzIGl0IHJlZmVycyB0bykgZnJvbSBmdXJ0aGVyIGNvbnNpZGVyYXRpb24uCisgKgorICogQWZ0ZXIgdGhhdCB3ZSBsb29rIGZvciB0aGUgaW50ZXJmYWNlJ3MgYnVuZGxlcy0tdGhlcmUgbXVzdCBiZSBhdAorICogbGVhc3Qgb25lIG9mIHRob3NlLgorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiBwYXJzaW5nIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK2Jvb2wgZ2JfbWFuaWZlc3RfcGFyc2Uoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50Ziwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGdyZXlidXNfbWFuaWZlc3QgKm1hbmlmZXN0OworCXN0cnVjdCBncmV5YnVzX21hbmlmZXN0X2hlYWRlciAqaGVhZGVyOworCXN0cnVjdCBncmV5YnVzX2Rlc2NyaXB0b3IgKmRlc2M7CisJc3RydWN0IG1hbmlmZXN0X2Rlc2MgKmRlc2NyaXB0b3I7CisJc3RydWN0IG1hbmlmZXN0X2Rlc2MgKmludGVyZmFjZV9kZXNjID0gTlVMTDsKKwl1MTYgbWFuaWZlc3Rfc2l6ZTsKKwl1MzIgZm91bmQgPSAwOworCWJvb2wgcmVzdWx0OworCisJLyogTWFuaWZlc3QgZGVzY3JpcHRvciBsaXN0IHNob3VsZCBiZSBlbXB0eSBoZXJlICovCisJaWYgKFdBUk5fT04oIWxpc3RfZW1wdHkoJmludGYtPm1hbmlmZXN0X2Rlc2NzKSkpCisJCXJldHVybiBmYWxzZTsKKworCS8qIHdlIGhhdmUgdG8gaGF2ZSBhdCBfbGVhc3RfIHRoZSBtYW5pZmVzdCBoZWFkZXIgKi8KKwlpZiAoc2l6ZSA8IHNpemVvZigqaGVhZGVyKSkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJzaG9ydCBtYW5pZmVzdCAoJXp1IDwgJXp1KVxuIiwKKwkJCQlzaXplLCBzaXplb2YoKmhlYWRlcikpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyogTWFrZSBzdXJlIHRoZSBzaXplIGlzIHJpZ2h0ICovCisJbWFuaWZlc3QgPSBkYXRhOworCWhlYWRlciA9ICZtYW5pZmVzdC0+aGVhZGVyOworCW1hbmlmZXN0X3NpemUgPSBsZTE2X3RvX2NwdShoZWFkZXItPnNpemUpOworCWlmIChtYW5pZmVzdF9zaXplICE9IHNpemUpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAibWFuaWZlc3Qgc2l6ZSBtaXNtYXRjaCAoJXp1ICE9ICV1KVxuIiwKKwkJCQlzaXplLCBtYW5pZmVzdF9zaXplKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qIFZhbGlkYXRlIG1ham9yL21pbm9yIG51bWJlciAqLworCWlmIChoZWFkZXItPnZlcnNpb25fbWFqb3IgPiBHUkVZQlVTX1ZFUlNJT05fTUFKT1IpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAibWFuaWZlc3QgdmVyc2lvbiB0b28gbmV3ICgldS4ldSA+ICV1LiV1KVxuIiwKKwkJCQloZWFkZXItPnZlcnNpb25fbWFqb3IsIGhlYWRlci0+dmVyc2lvbl9taW5vciwKKwkJCQlHUkVZQlVTX1ZFUlNJT05fTUFKT1IsIEdSRVlCVVNfVkVSU0lPTl9NSU5PUik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKiBPSywgZmluZCBhbGwgdGhlIGRlc2NyaXB0b3JzICovCisJZGVzYyA9IG1hbmlmZXN0LT5kZXNjcmlwdG9yczsKKwlzaXplIC09IHNpemVvZigqaGVhZGVyKTsKKwl3aGlsZSAoc2l6ZSkgeworCQlpbnQgZGVzY19zaXplOworCisJCWRlc2Nfc2l6ZSA9IGlkZW50aWZ5X2Rlc2NyaXB0b3IoaW50ZiwgZGVzYywgc2l6ZSk7CisJCWlmIChkZXNjX3NpemUgPCAwKSB7CisJCQlyZXN1bHQgPSBmYWxzZTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWRlc2MgPSAoc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvciAqKSgoY2hhciAqKWRlc2MgKyBkZXNjX3NpemUpOworCQlzaXplIC09IGRlc2Nfc2l6ZTsKKwl9CisKKwkvKiBUaGVyZSBtdXN0IGJlIGEgc2luZ2xlIGludGVyZmFjZSBkZXNjcmlwdG9yICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXNjcmlwdG9yLCAmaW50Zi0+bWFuaWZlc3RfZGVzY3MsIGxpbmtzKSB7CisJCWlmIChkZXNjcmlwdG9yLT50eXBlID09IEdSRVlCVVNfVFlQRV9JTlRFUkZBQ0UpCisJCQlpZiAoIWZvdW5kKyspCisJCQkJaW50ZXJmYWNlX2Rlc2MgPSBkZXNjcmlwdG9yOworCX0KKwlpZiAoZm91bmQgIT0gMSkgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJtYW5pZmVzdCBtdXN0IGhhdmUgMSBpbnRlcmZhY2UgZGVzY3JpcHRvciAoJXUgZm91bmQpXG4iLAorCQkJCWZvdW5kKTsKKwkJcmVzdWx0ID0gZmFsc2U7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFBhcnNlIHRoZSBtYW5pZmVzdCwgc3RhcnRpbmcgd2l0aCB0aGUgaW50ZXJmYWNlIGRlc2NyaXB0b3IgKi8KKwlyZXN1bHQgPSBnYl9tYW5pZmVzdF9wYXJzZV9pbnRlcmZhY2UoaW50ZiwgaW50ZXJmYWNlX2Rlc2MpOworCisJLyoKKwkgKiBXZSByZWFsbHkgc2hvdWxkIGhhdmUgbm8gcmVtYWluaW5nIGRlc2NyaXB0b3JzLCBidXQgd2UKKwkgKiBkb24ndCBrbm93IHdoYXQgbmV3ZXIgZm9ybWF0IG1hbmlmZXN0cyBtaWdodCBsZWF2ZS4KKwkgKi8KKwlpZiAocmVzdWx0ICYmICFsaXN0X2VtcHR5KCZpbnRmLT5tYW5pZmVzdF9kZXNjcykpCisJCWRldl9pbmZvKCZpbnRmLT5kZXYsICJleGNlc3MgZGVzY3JpcHRvcnMgaW4gaW50ZXJmYWNlIG1hbmlmZXN0XG4iKTsKK291dDoKKwlyZWxlYXNlX21hbmlmZXN0X2Rlc2NyaXB0b3JzKGludGYpOworCisJcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL21hbmlmZXN0LmggYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9tYW5pZmVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NjQyODQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9tYW5pZmVzdC5oCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisgKiBHcmV5YnVzIG1hbmlmZXN0IHBhcnNpbmcKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTQgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaWZuZGVmIF9fTUFOSUZFU1RfSAorI2RlZmluZSBfX01BTklGRVNUX0gKKworc3RydWN0IGdiX2ludGVyZmFjZTsKK2Jvb2wgZ2JfbWFuaWZlc3RfcGFyc2Uoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50Ziwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisjZW5kaWYgLyogX19NQU5JRkVTVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9tb2R1bGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL21vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZjY3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9tb2R1bGUuYwpAQCAtMCwwICsxLDIzOCBAQAorLyoKKyAqIEdyZXlidXMgTW9kdWxlIGNvZGUKKyAqCisgKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTYgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorI2luY2x1ZGUgImdyZXlidXNfdHJhY2UuaCIKKworCitzdGF0aWMgc3NpemVfdCBlamVjdF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBnYl9tb2R1bGUgKm1vZHVsZSA9IHRvX2diX21vZHVsZShkZXYpOworCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGY7CisJc2l6ZV90IGk7CisJbG9uZyB2YWw7CisJaW50IHJldDsKKworCXJldCA9IGtzdHJ0b2woYnVmLCAwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKCF2YWwpCisJCXJldHVybiBsZW47CisKKwlmb3IgKGkgPSAwOyBpIDwgbW9kdWxlLT5udW1faW50ZXJmYWNlczsgKytpKSB7CisJCWludGYgPSBtb2R1bGUtPmludGVyZmFjZXNbaV07CisKKwkJbXV0ZXhfbG9jaygmaW50Zi0+bXV0ZXgpOworCQkvKiBTZXQgZmxhZyB0byBwcmV2ZW50IGNvbmN1cnJlbnQgYWN0aXZhdGlvbi4gKi8KKwkJaW50Zi0+ZWplY3RlZCA9IHRydWU7CisJCWdiX2ludGVyZmFjZV9kaXNhYmxlKGludGYpOworCQlnYl9pbnRlcmZhY2VfZGVhY3RpdmF0ZShpbnRmKTsKKwkJbXV0ZXhfdW5sb2NrKCZpbnRmLT5tdXRleCk7CisJfQorCisJLyogVGVsbCB0aGUgU1ZDIHRvIGVqZWN0IHRoZSBwcmltYXJ5IGludGVyZmFjZS4gKi8KKwlyZXQgPSBnYl9zdmNfaW50Zl9lamVjdChtb2R1bGUtPmhkLT5zdmMsIG1vZHVsZS0+bW9kdWxlX2lkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGxlbjsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9XTyhlamVjdCk7CisKK3N0YXRpYyBzc2l6ZV90IG1vZHVsZV9pZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBnYl9tb2R1bGUgKm1vZHVsZSA9IHRvX2diX21vZHVsZShkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIG1vZHVsZS0+bW9kdWxlX2lkKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhtb2R1bGVfaWQpOworCitzdGF0aWMgc3NpemVfdCBudW1faW50ZXJmYWNlc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBnYl9tb2R1bGUgKm1vZHVsZSA9IHRvX2diX21vZHVsZShkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXp1XG4iLCBtb2R1bGUtPm51bV9pbnRlcmZhY2VzKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhudW1faW50ZXJmYWNlcyk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICptb2R1bGVfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfZWplY3QuYXR0ciwKKwkmZGV2X2F0dHJfbW9kdWxlX2lkLmF0dHIsCisJJmRldl9hdHRyX251bV9pbnRlcmZhY2VzLmF0dHIsCisJTlVMTCwKK307CitBVFRSSUJVVEVfR1JPVVBTKG1vZHVsZSk7CisKK3N0YXRpYyB2b2lkIGdiX21vZHVsZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2JfbW9kdWxlICptb2R1bGUgPSB0b19nYl9tb2R1bGUoZGV2KTsKKworCXRyYWNlX2diX21vZHVsZV9yZWxlYXNlKG1vZHVsZSk7CisKKwlrZnJlZShtb2R1bGUpOworfQorCitzdHJ1Y3QgZGV2aWNlX3R5cGUgZ3JleWJ1c19tb2R1bGVfdHlwZSA9IHsKKwkubmFtZQkJPSAiZ3JleWJ1c19tb2R1bGUiLAorCS5yZWxlYXNlCT0gZ2JfbW9kdWxlX3JlbGVhc2UsCit9OworCitzdHJ1Y3QgZ2JfbW9kdWxlICpnYl9tb2R1bGVfY3JlYXRlKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQsIHU4IG1vZHVsZV9pZCwKKwkJCQkJc2l6ZV90IG51bV9pbnRlcmZhY2VzKQoreworCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGY7CisJc3RydWN0IGdiX21vZHVsZSAqbW9kdWxlOworCWludCBpOworCisJbW9kdWxlID0ga3phbGxvYyhzaXplb2YoKm1vZHVsZSkgKyBudW1faW50ZXJmYWNlcyAqIHNpemVvZihpbnRmKSwKKwkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIW1vZHVsZSkKKwkJcmV0dXJuIE5VTEw7CisKKwltb2R1bGUtPmhkID0gaGQ7CisJbW9kdWxlLT5tb2R1bGVfaWQgPSBtb2R1bGVfaWQ7CisJbW9kdWxlLT5udW1faW50ZXJmYWNlcyA9IG51bV9pbnRlcmZhY2VzOworCisJbW9kdWxlLT5kZXYucGFyZW50ID0gJmhkLT5kZXY7CisJbW9kdWxlLT5kZXYuYnVzID0gJmdyZXlidXNfYnVzX3R5cGU7CisJbW9kdWxlLT5kZXYudHlwZSA9ICZncmV5YnVzX21vZHVsZV90eXBlOworCW1vZHVsZS0+ZGV2Lmdyb3VwcyA9IG1vZHVsZV9ncm91cHM7CisJbW9kdWxlLT5kZXYuZG1hX21hc2sgPSBoZC0+ZGV2LmRtYV9tYXNrOworCWRldmljZV9pbml0aWFsaXplKCZtb2R1bGUtPmRldik7CisJZGV2X3NldF9uYW1lKCZtb2R1bGUtPmRldiwgIiVkLSV1IiwgaGQtPmJ1c19pZCwgbW9kdWxlX2lkKTsKKworCXRyYWNlX2diX21vZHVsZV9jcmVhdGUobW9kdWxlKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1faW50ZXJmYWNlczsgKytpKSB7CisJCWludGYgPSBnYl9pbnRlcmZhY2VfY3JlYXRlKG1vZHVsZSwgbW9kdWxlX2lkICsgaSk7CisJCWlmICghaW50ZikgeworCQkJZGV2X2VycigmbW9kdWxlLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIGludGVyZmFjZSAldVxuIiwKKwkJCQkJbW9kdWxlX2lkICsgaSk7CisJCQlnb3RvIGVycl9wdXRfaW50ZXJmYWNlczsKKwkJfQorCQltb2R1bGUtPmludGVyZmFjZXNbaV0gPSBpbnRmOworCX0KKworCXJldHVybiBtb2R1bGU7CisKK2Vycl9wdXRfaW50ZXJmYWNlczoKKwlmb3IgKC0taTsgaSA+IDA7IC0taSkKKwkJZ2JfaW50ZXJmYWNlX3B1dChtb2R1bGUtPmludGVyZmFjZXNbaV0pOworCisJcHV0X2RldmljZSgmbW9kdWxlLT5kZXYpOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBSZWdpc3RlciBhbmQgZW5hYmxlIGFuIGludGVyZmFjZSBhZnRlciBmaXJzdCBhdHRlbXB0aW5nIHRvIGFjdGl2YXRlIGl0LgorICovCitzdGF0aWMgdm9pZCBnYl9tb2R1bGVfcmVnaXN0ZXJfaW50ZXJmYWNlKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IGdiX21vZHVsZSAqbW9kdWxlID0gaW50Zi0+bW9kdWxlOworCXU4IGludGZfaWQgPSBpbnRmLT5pbnRlcmZhY2VfaWQ7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmludGYtPm11dGV4KTsKKworCXJldCA9IGdiX2ludGVyZmFjZV9hY3RpdmF0ZShpbnRmKTsKKwlpZiAocmV0KSB7CisJCWlmIChpbnRmLT50eXBlICE9IEdCX0lOVEVSRkFDRV9UWVBFX0RVTU1ZKSB7CisJCQlkZXZfZXJyKCZtb2R1bGUtPmRldiwKKwkJCQkJImZhaWxlZCB0byBhY3RpdmF0ZSBpbnRlcmZhY2UgJXU6ICVkXG4iLAorCQkJCQlpbnRmX2lkLCByZXQpOworCQl9CisKKwkJZ2JfaW50ZXJmYWNlX2FkZChpbnRmKTsKKwkJZ290byBlcnJfdW5sb2NrOworCX0KKworCXJldCA9IGdiX2ludGVyZmFjZV9hZGQoaW50Zik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfaW50ZXJmYWNlX2RlYWN0aXZhdGU7CisKKwlyZXQgPSBnYl9pbnRlcmZhY2VfZW5hYmxlKGludGYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmbW9kdWxlLT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIGludGVyZmFjZSAldTogJWRcbiIsCisJCQkJaW50Zl9pZCwgcmV0KTsKKwkJZ290byBlcnJfaW50ZXJmYWNlX2RlYWN0aXZhdGU7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZpbnRmLT5tdXRleCk7CisKKwlyZXR1cm47CisKK2Vycl9pbnRlcmZhY2VfZGVhY3RpdmF0ZToKKwlnYl9pbnRlcmZhY2VfZGVhY3RpdmF0ZShpbnRmKTsKK2Vycl91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZpbnRmLT5tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIGdiX21vZHVsZV9kZXJlZ2lzdGVyX2ludGVyZmFjZShzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRmKQoreworCS8qIE1hcmsgYXMgZGlzY29ubmVjdGVkIHRvIHByZXZlbnQgSS9PIGR1cmluZyBkaXNhYmxlLiAqLworCWlmIChpbnRmLT5tb2R1bGUtPmRpc2Nvbm5lY3RlZCkKKwkJaW50Zi0+ZGlzY29ubmVjdGVkID0gdHJ1ZTsKKworCW11dGV4X2xvY2soJmludGYtPm11dGV4KTsKKwlpbnRmLT5yZW1vdmVkID0gdHJ1ZTsKKwlnYl9pbnRlcmZhY2VfZGlzYWJsZShpbnRmKTsKKwlnYl9pbnRlcmZhY2VfZGVhY3RpdmF0ZShpbnRmKTsKKwltdXRleF91bmxvY2soJmludGYtPm11dGV4KTsKKworCWdiX2ludGVyZmFjZV9kZWwoaW50Zik7Cit9CisKKy8qIFJlZ2lzdGVyIGEgbW9kdWxlIGFuZCBpdHMgaW50ZXJmYWNlcy4gKi8KK2ludCBnYl9tb2R1bGVfYWRkKHN0cnVjdCBnYl9tb2R1bGUgKm1vZHVsZSkKK3sKKwlzaXplX3QgaTsKKwlpbnQgcmV0OworCisJcmV0ID0gZGV2aWNlX2FkZCgmbW9kdWxlLT5kZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmbW9kdWxlLT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgbW9kdWxlOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl0cmFjZV9nYl9tb2R1bGVfYWRkKG1vZHVsZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbW9kdWxlLT5udW1faW50ZXJmYWNlczsgKytpKQorCQlnYl9tb2R1bGVfcmVnaXN0ZXJfaW50ZXJmYWNlKG1vZHVsZS0+aW50ZXJmYWNlc1tpXSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogRGVyZWdpc3RlciBhIG1vZHVsZSBhbmQgaXRzIGludGVyZmFjZXMuICovCit2b2lkIGdiX21vZHVsZV9kZWwoc3RydWN0IGdiX21vZHVsZSAqbW9kdWxlKQoreworCXNpemVfdCBpOworCisJZm9yIChpID0gMDsgaSA8IG1vZHVsZS0+bnVtX2ludGVyZmFjZXM7ICsraSkKKwkJZ2JfbW9kdWxlX2RlcmVnaXN0ZXJfaW50ZXJmYWNlKG1vZHVsZS0+aW50ZXJmYWNlc1tpXSk7CisKKwl0cmFjZV9nYl9tb2R1bGVfZGVsKG1vZHVsZSk7CisKKwlkZXZpY2VfZGVsKCZtb2R1bGUtPmRldik7Cit9CisKK3ZvaWQgZ2JfbW9kdWxlX3B1dChzdHJ1Y3QgZ2JfbW9kdWxlICptb2R1bGUpCit7CisJc2l6ZV90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbW9kdWxlLT5udW1faW50ZXJmYWNlczsgKytpKQorCQlnYl9pbnRlcmZhY2VfcHV0KG1vZHVsZS0+aW50ZXJmYWNlc1tpXSk7CisKKwlwdXRfZGV2aWNlKCZtb2R1bGUtPmRldik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9tb2R1bGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL21vZHVsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YTk3Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9tb2R1bGUuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogR3JleWJ1cyBNb2R1bGUgY29kZQorICoKKyAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNiBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpZm5kZWYgX19NT0RVTEVfSAorI2RlZmluZSBfX01PRFVMRV9ICisKK3N0cnVjdCBnYl9tb2R1bGUgeworCXN0cnVjdCBkZXZpY2UgZGV2OworCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQ7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhkX25vZGU7CisKKwl1OCBtb2R1bGVfaWQ7CisJc2l6ZV90IG51bV9pbnRlcmZhY2VzOworCisJYm9vbCBkaXNjb25uZWN0ZWQ7CisKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRlcmZhY2VzWzBdOworfTsKKyNkZWZpbmUgdG9fZ2JfbW9kdWxlKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgZ2JfbW9kdWxlLCBkZXYpCisKK3N0cnVjdCBnYl9tb2R1bGUgKmdiX21vZHVsZV9jcmVhdGUoc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdTggbW9kdWxlX2lkLAorCQkJCSAgIHNpemVfdCBudW1faW50ZXJmYWNlcyk7CitpbnQgZ2JfbW9kdWxlX2FkZChzdHJ1Y3QgZ2JfbW9kdWxlICptb2R1bGUpOwordm9pZCBnYl9tb2R1bGVfZGVsKHN0cnVjdCBnYl9tb2R1bGUgKm1vZHVsZSk7Cit2b2lkIGdiX21vZHVsZV9wdXQoc3RydWN0IGdiX21vZHVsZSAqbW9kdWxlKTsKKworI2VuZGlmIC8qIF9fTU9EVUxFX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL29wZXJhdGlvbi5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvb3BlcmF0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEyMzEwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL29wZXJhdGlvbi5jCkBAIC0wLDAgKzEsMTIzOSBAQAorLyoKKyAqIEdyZXlidXMgb3BlcmF0aW9ucworICoKKyAqIENvcHlyaWdodCAyMDE0LTIwMTUgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE0LTIwMTUgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSAiZ3JleWJ1cy5oIgorI2luY2x1ZGUgImdyZXlidXNfdHJhY2UuaCIKKworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpnYl9vcGVyYXRpb25fY2FjaGU7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmdiX21lc3NhZ2VfY2FjaGU7CisKKy8qIFdvcmtxdWV1ZSB0byBoYW5kbGUgR3JleWJ1cyBvcGVyYXRpb24gY29tcGxldGlvbnMuICovCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmdiX29wZXJhdGlvbl9jb21wbGV0aW9uX3dxOworCisvKiBXYWl0IHF1ZXVlIGZvciBzeW5jaHJvbm91cyBjYW5jZWxsYXRpb25zLiAqLworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGdiX29wZXJhdGlvbl9jYW5jZWxsYXRpb25fcXVldWUpOworCisvKgorICogUHJvdGVjdHMgdXBkYXRlcyB0byBvcGVyYXRpb24tPmVycm5vLgorICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGdiX29wZXJhdGlvbnNfbG9jayk7CisKK3N0YXRpYyBpbnQgZ2Jfb3BlcmF0aW9uX3Jlc3BvbnNlX3NlbmQoc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uLAorCQkJCQlpbnQgZXJybm8pOworCisvKgorICogSW5jcmVtZW50IG9wZXJhdGlvbiBhY3RpdmUgY291bnQgYW5kIGFkZCB0byBjb25uZWN0aW9uIGxpc3QgdW5sZXNzIHRoZQorICogY29ubmVjdGlvbiBpcyBnb2luZyBhd2F5LgorICoKKyAqIENhbGxlciBob2xkcyBvcGVyYXRpb24gcmVmZXJlbmNlLgorICovCitzdGF0aWMgaW50IGdiX29wZXJhdGlvbl9nZXRfYWN0aXZlKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbikKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IG9wZXJhdGlvbi0+Y29ubmVjdGlvbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbm5lY3Rpb24tPmxvY2ssIGZsYWdzKTsKKwlzd2l0Y2ggKGNvbm5lY3Rpb24tPnN0YXRlKSB7CisJY2FzZSBHQl9DT05ORUNUSU9OX1NUQVRFX0VOQUJMRUQ6CisJCWJyZWFrOworCWNhc2UgR0JfQ09OTkVDVElPTl9TVEFURV9FTkFCTEVEX1RYOgorCQlpZiAoZ2Jfb3BlcmF0aW9uX2lzX2luY29taW5nKG9wZXJhdGlvbikpCisJCQlnb3RvIGVycl91bmxvY2s7CisJCWJyZWFrOworCWNhc2UgR0JfQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNUSU5HOgorCQlpZiAoIWdiX29wZXJhdGlvbl9pc19jb3JlKG9wZXJhdGlvbikpCisJCQlnb3RvIGVycl91bmxvY2s7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gZXJyX3VubG9jazsKKwl9CisKKwlpZiAob3BlcmF0aW9uLT5hY3RpdmUrKyA9PSAwKQorCQlsaXN0X2FkZF90YWlsKCZvcGVyYXRpb24tPmxpbmtzLCAmY29ubmVjdGlvbi0+b3BlcmF0aW9ucyk7CisKKwl0cmFjZV9nYl9vcGVyYXRpb25fZ2V0X2FjdGl2ZShvcGVyYXRpb24pOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29ubmVjdGlvbi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7CisKK2Vycl91bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29ubmVjdGlvbi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIC1FTk9UQ09OTjsKK30KKworLyogQ2FsbGVyIGhvbGRzIG9wZXJhdGlvbiByZWZlcmVuY2UuICovCitzdGF0aWMgdm9pZCBnYl9vcGVyYXRpb25fcHV0X2FjdGl2ZShzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb24pCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBvcGVyYXRpb24tPmNvbm5lY3Rpb247CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb25uZWN0aW9uLT5sb2NrLCBmbGFncyk7CisKKwl0cmFjZV9nYl9vcGVyYXRpb25fcHV0X2FjdGl2ZShvcGVyYXRpb24pOworCisJaWYgKC0tb3BlcmF0aW9uLT5hY3RpdmUgPT0gMCkgeworCQlsaXN0X2RlbCgmb3BlcmF0aW9uLT5saW5rcyk7CisJCWlmIChhdG9taWNfcmVhZCgmb3BlcmF0aW9uLT53YWl0ZXJzKSkKKwkJCXdha2VfdXAoJmdiX29wZXJhdGlvbl9jYW5jZWxsYXRpb25fcXVldWUpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25uZWN0aW9uLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBib29sIGdiX29wZXJhdGlvbl9pc19hY3RpdmUoc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gb3BlcmF0aW9uLT5jb25uZWN0aW9uOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYm9vbCByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29ubmVjdGlvbi0+bG9jaywgZmxhZ3MpOworCXJldCA9IG9wZXJhdGlvbi0+YWN0aXZlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbm5lY3Rpb24tPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBTZXQgYW4gb3BlcmF0aW9uJ3MgcmVzdWx0LgorICoKKyAqIEluaXRpYWxseSBhbiBvdXRnb2luZyBvcGVyYXRpb24ncyBlcnJubyB2YWx1ZSBpcyAtRUJBRFIuCisgKiBJZiBubyBlcnJvciBvY2N1cnMgYmVmb3JlIHNlbmRpbmcgdGhlIHJlcXVlc3QgbWVzc2FnZSB0aGUgb25seQorICogdmFsaWQgdmFsdWUgb3BlcmF0aW9uLT5lcnJubyBjYW4gYmUgc2V0IHRvIGlzIC1FSU5QUk9HUkVTUywKKyAqIGluZGljYXRpbmcgdGhlIHJlcXVlc3QgaGFzIGJlZW4gKG9yIHJhdGhlciBpcyBhYm91dCB0byBiZSkgc2VudC4KKyAqIEF0IHRoYXQgcG9pbnQgbm9ib2R5IHNob3VsZCBiZSBsb29raW5nIGF0IHRoZSByZXN1bHQgdW50aWwgdGhlCisgKiByZXNwb25zZSBhcnJpdmVzLgorICoKKyAqIFRoZSBmaXJzdCB0aW1lIHRoZSByZXN1bHQgZ2V0cyBzZXQgYWZ0ZXIgdGhlIHJlcXVlc3QgaGFzIGJlZW4KKyAqIHNlbnQsIHRoYXQgcmVzdWx0ICJzdGlja3MuIiAgVGhhdCBpcywgaWYgdHdvIGNvbmN1cnJlbnQgdGhyZWFkcworICogcmFjZSB0byBzZXQgdGhlIHJlc3VsdCwgdGhlIGZpcnN0IG9uZSB3aW5zLiAgVGhlIHJldHVybiB2YWx1ZQorICogdGVsbHMgdGhlIGNhbGxlciB3aGV0aGVyIGl0cyByZXN1bHQgd2FzIHJlY29yZGVkOyBpZiBub3QgdGhlCisgKiBjYWxsZXIgaGFzIG5vdGhpbmcgbW9yZSB0byBkby4KKyAqCisgKiBUaGUgcmVzdWx0IHZhbHVlIC1FSUxTRVEgaXMgcmVzZXJ2ZWQgdG8gc2lnbmFsIGFuIGltcGxlbWVudGF0aW9uCisgKiBlcnJvcjsgaWYgaXQncyBldmVyIG9ic2VydmVkLCB0aGUgY29kZSBwZXJmb3JtaW5nIHRoZSByZXF1ZXN0IGhhcworICogZG9uZSBzb21ldGhpbmcgZnVuZGFtZW50YWxseSB3cm9uZy4gIEl0IGlzIGFuIGVycm9yIHRvIHRyeSB0byBzZXQKKyAqIHRoZSByZXN1bHQgdG8gLUVCQURSLCBhbmQgYXR0ZW1wdHMgdG8gZG8gc28gcmVzdWx0IGluIGEgd2FybmluZywKKyAqIGFuZCAtRUlMU0VRIGlzIHVzZWQgaW5zdGVhZC4gIFNpbWlsYXJseSwgdGhlIG9ubHkgdmFsaWQgcmVzdWx0CisgKiB2YWx1ZSB0byBzZXQgZm9yIGFuIG9wZXJhdGlvbiBpbiBpbml0aWFsIHN0YXRlIGlzIC1FSU5QUk9HUkVTUy4KKyAqIEF0dGVtcHRzIHRvIGRvIG90aGVyd2lzZSB3aWxsIGFsc28gcmVjb3JkIGEgKHN1Y2Nlc3NmdWwpIC1FSUxTRVEKKyAqIG9wZXJhdGlvbiByZXN1bHQuCisgKi8KK3N0YXRpYyBib29sIGdiX29wZXJhdGlvbl9yZXN1bHRfc2V0KHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbiwgaW50IHJlc3VsdCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBwcmV2OworCisJaWYgKHJlc3VsdCA9PSAtRUlOUFJPR1JFU1MpIHsKKwkJLyoKKwkJICogLUVJTlBST0dSRVNTIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIHJlcXVlc3QgaXMKKwkJICogaW4gZmxpZ2h0LiAgSXQgc2hvdWxkIGJlIHRoZSBmaXJzdCByZXN1bHQgdmFsdWUKKwkJICogc2V0IGFmdGVyIHRoZSBpbml0aWFsIC1FQkFEUi4gIElzc3VlIGEgd2FybmluZworCQkgKiBhbmQgcmVjb3JkIGFuIGltcGxlbWVudGF0aW9uIGVycm9yIGlmIGl0J3MKKwkJICogc2V0IGF0IGFueSBvdGhlciB0aW1lLgorCQkgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmdiX29wZXJhdGlvbnNfbG9jaywgZmxhZ3MpOworCQlwcmV2ID0gb3BlcmF0aW9uLT5lcnJubzsKKwkJaWYgKHByZXYgPT0gLUVCQURSKQorCQkJb3BlcmF0aW9uLT5lcnJubyA9IHJlc3VsdDsKKwkJZWxzZQorCQkJb3BlcmF0aW9uLT5lcnJubyA9IC1FSUxTRVE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdiX29wZXJhdGlvbnNfbG9jaywgZmxhZ3MpOworCQlXQVJOX09OKHByZXYgIT0gLUVCQURSKTsKKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKgorCSAqIFRoZSBmaXJzdCByZXN1bHQgdmFsdWUgc2V0IGFmdGVyIGEgcmVxdWVzdCBoYXMgYmVlbiBzZW50CisJICogd2lsbCBiZSB0aGUgZmluYWwgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uICBTdWJzZXF1ZW50CisJICogYXR0ZW1wdHMgdG8gc2V0IHRoZSByZXN1bHQgYXJlIGlnbm9yZWQuCisJICoKKwkgKiBOb3RlIHRoYXQgLUVCQURSIGlzIGEgcmVzZXJ2ZWQgImluaXRpYWwgc3RhdGUiIHJlc3VsdAorCSAqIHZhbHVlLiAgQXR0ZW1wdHMgdG8gc2V0IHRoaXMgdmFsdWUgcmVzdWx0IGluIGEgd2FybmluZywKKwkgKiBhbmQgdGhlIHJlc3VsdCBjb2RlIGlzIHNldCB0byAtRUlMU0VRIGluc3RlYWQuCisJICovCisJaWYgKFdBUk5fT04ocmVzdWx0ID09IC1FQkFEUikpCisJCXJlc3VsdCA9IC1FSUxTRVE7IC8qIE5vYm9keSBzaG91bGQgYmUgc2V0dGluZyAtRUJBRFIgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZnYl9vcGVyYXRpb25zX2xvY2ssIGZsYWdzKTsKKwlwcmV2ID0gb3BlcmF0aW9uLT5lcnJubzsKKwlpZiAocHJldiA9PSAtRUlOUFJPR1JFU1MpCisJCW9wZXJhdGlvbi0+ZXJybm8gPSByZXN1bHQ7CS8qIEZpcnN0IGFuZCBmaW5hbCByZXN1bHQgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnYl9vcGVyYXRpb25zX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBwcmV2ID09IC1FSU5QUk9HUkVTUzsKK30KKworaW50IGdiX29wZXJhdGlvbl9yZXN1bHQoc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uKQoreworCWludCByZXN1bHQgPSBvcGVyYXRpb24tPmVycm5vOworCisJV0FSTl9PTihyZXN1bHQgPT0gLUVCQURSKTsKKwlXQVJOX09OKHJlc3VsdCA9PSAtRUlOUFJPR1JFU1MpOworCisJcmV0dXJuIHJlc3VsdDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX29wZXJhdGlvbl9yZXN1bHQpOworCisvKgorICogTG9va3MgdXAgYW4gb3V0Z29pbmcgb3BlcmF0aW9uIG9uIGEgY29ubmVjdGlvbiBhbmQgcmV0dXJucyBhIHJlZmNvdW50ZWQKKyAqIHBvaW50ZXIgaWYgZm91bmQsIG9yIE5VTEwgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgc3RydWN0IGdiX29wZXJhdGlvbiAqCitnYl9vcGVyYXRpb25fZmluZF9vdXRnb2luZyhzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgdTE2IG9wZXJhdGlvbl9pZCkKK3sKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb247CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlib29sIGZvdW5kID0gZmFsc2U7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29ubmVjdGlvbi0+bG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkob3BlcmF0aW9uLCAmY29ubmVjdGlvbi0+b3BlcmF0aW9ucywgbGlua3MpCisJCWlmIChvcGVyYXRpb24tPmlkID09IG9wZXJhdGlvbl9pZCAmJgorCQkJCSFnYl9vcGVyYXRpb25faXNfaW5jb21pbmcob3BlcmF0aW9uKSkgeworCQkJZ2Jfb3BlcmF0aW9uX2dldChvcGVyYXRpb24pOworCQkJZm91bmQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb25uZWN0aW9uLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZm91bmQgPyBvcGVyYXRpb24gOiBOVUxMOworfQorCitzdGF0aWMgaW50IGdiX21lc3NhZ2Vfc2VuZChzdHJ1Y3QgZ2JfbWVzc2FnZSAqbWVzc2FnZSwgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gbWVzc2FnZS0+b3BlcmF0aW9uLT5jb25uZWN0aW9uOworCisJdHJhY2VfZ2JfbWVzc2FnZV9zZW5kKG1lc3NhZ2UpOworCXJldHVybiBjb25uZWN0aW9uLT5oZC0+ZHJpdmVyLT5tZXNzYWdlX3NlbmQoY29ubmVjdGlvbi0+aGQsCisJCQkJCWNvbm5lY3Rpb24tPmhkX2Nwb3J0X2lkLAorCQkJCQltZXNzYWdlLAorCQkJCQlnZnApOworfQorCisvKgorICogQ2FuY2VsIGEgbWVzc2FnZSB3ZSBoYXZlIHBhc3NlZCB0byB0aGUgaG9zdCBkZXZpY2UgbGF5ZXIgdG8gYmUgc2VudC4KKyAqLworc3RhdGljIHZvaWQgZ2JfbWVzc2FnZV9jYW5jZWwoc3RydWN0IGdiX21lc3NhZ2UgKm1lc3NhZ2UpCit7CisJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCA9IG1lc3NhZ2UtPm9wZXJhdGlvbi0+Y29ubmVjdGlvbi0+aGQ7CisKKwloZC0+ZHJpdmVyLT5tZXNzYWdlX2NhbmNlbChtZXNzYWdlKTsKK30KKworc3RhdGljIHZvaWQgZ2Jfb3BlcmF0aW9uX3JlcXVlc3RfaGFuZGxlKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbikKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IG9wZXJhdGlvbi0+Y29ubmVjdGlvbjsKKwlpbnQgc3RhdHVzOworCWludCByZXQ7CisKKwlpZiAoY29ubmVjdGlvbi0+aGFuZGxlcikgeworCQlzdGF0dXMgPSBjb25uZWN0aW9uLT5oYW5kbGVyKG9wZXJhdGlvbik7CisJfSBlbHNlIHsKKwkJZGV2X2VycigmY29ubmVjdGlvbi0+aGQtPmRldiwKKwkJCSIlczogdW5leHBlY3RlZCBpbmNvbWluZyByZXF1ZXN0IG9mIHR5cGUgMHglMDJ4XG4iLAorCQkJY29ubmVjdGlvbi0+bmFtZSwgb3BlcmF0aW9uLT50eXBlKTsKKworCQlzdGF0dXMgPSAtRVBST1RPTk9TVVBQT1JUOworCX0KKworCXJldCA9IGdiX29wZXJhdGlvbl9yZXNwb25zZV9zZW5kKG9wZXJhdGlvbiwgc3RhdHVzKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmNvbm5lY3Rpb24tPmhkLT5kZXYsCisJCQkiJXM6IGZhaWxlZCB0byBzZW5kIHJlc3BvbnNlICVkIGZvciB0eXBlIDB4JTAyeDogJWRcbiIsCisJCQljb25uZWN0aW9uLT5uYW1lLCBzdGF0dXMsIG9wZXJhdGlvbi0+dHlwZSwgcmV0KTsKKwkJcmV0dXJuOworCX0KK30KKworLyoKKyAqIFByb2Nlc3Mgb3BlcmF0aW9uIHdvcmsuCisgKgorICogRm9yIGluY29taW5nIHJlcXVlc3RzLCBjYWxsIHRoZSBwcm90b2NvbCByZXF1ZXN0IGhhbmRsZXIuIFRoZSBvcGVyYXRpb24KKyAqIHJlc3VsdCBzaG91bGQgYmUgLUVJTlBST0dSRVNTIGF0IHRoaXMgcG9pbnQuCisgKgorICogRm9yIG91dGdvaW5nIHJlcXVlc3RzLCB0aGUgb3BlcmF0aW9uIHJlc3VsdCB2YWx1ZSBzaG91bGQgaGF2ZQorICogYmVlbiBzZXQgYmVmb3JlIHF1ZXVlaW5nIHRoaXMuICBUaGUgb3BlcmF0aW9uIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiBhbGxvd3MgdGhlIG9yaWdpbmFsIHJlcXVlc3RlciB0byBrbm93IHRoZSByZXF1ZXN0IGhhcyBjb21wbGV0ZWQKKyAqIGFuZCBpdHMgcmVzdWx0IGlzIGF2YWlsYWJsZS4KKyAqLworc3RhdGljIHZvaWQgZ2Jfb3BlcmF0aW9uX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbjsKKworCW9wZXJhdGlvbiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZ2Jfb3BlcmF0aW9uLCB3b3JrKTsKKworCWlmIChnYl9vcGVyYXRpb25faXNfaW5jb21pbmcob3BlcmF0aW9uKSkKKwkJZ2Jfb3BlcmF0aW9uX3JlcXVlc3RfaGFuZGxlKG9wZXJhdGlvbik7CisJZWxzZQorCQlvcGVyYXRpb24tPmNhbGxiYWNrKG9wZXJhdGlvbik7CisKKwlnYl9vcGVyYXRpb25fcHV0X2FjdGl2ZShvcGVyYXRpb24pOworCWdiX29wZXJhdGlvbl9wdXQob3BlcmF0aW9uKTsKK30KKworc3RhdGljIHZvaWQgZ2Jfb3BlcmF0aW9uX21lc3NhZ2VfaW5pdChzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLAorCQkJCXN0cnVjdCBnYl9tZXNzYWdlICptZXNzYWdlLCB1MTYgb3BlcmF0aW9uX2lkLAorCQkJCXNpemVfdCBwYXlsb2FkX3NpemUsIHU4IHR5cGUpCit7CisJc3RydWN0IGdiX29wZXJhdGlvbl9tc2dfaGRyICpoZWFkZXI7CisKKwloZWFkZXIgPSBtZXNzYWdlLT5idWZmZXI7CisKKwltZXNzYWdlLT5oZWFkZXIgPSBoZWFkZXI7CisJbWVzc2FnZS0+cGF5bG9hZCA9IHBheWxvYWRfc2l6ZSA/IGhlYWRlciArIDEgOiBOVUxMOworCW1lc3NhZ2UtPnBheWxvYWRfc2l6ZSA9IHBheWxvYWRfc2l6ZTsKKworCS8qCisJICogVGhlIHR5cGUgc3VwcGxpZWQgZm9yIGluY29taW5nIG1lc3NhZ2UgYnVmZmVycyB3aWxsIGJlCisJICogR0JfUkVRVUVTVF9UWVBFX0lOVkFMSUQuIFN1Y2ggYnVmZmVycyB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5CisJICogYXJyaXZpbmcgZGF0YSBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgbWVzc2FnZSBoZWFkZXIuCisJICovCisJaWYgKHR5cGUgIT0gR0JfUkVRVUVTVF9UWVBFX0lOVkFMSUQpIHsKKwkJdTE2IG1lc3NhZ2Vfc2l6ZSA9ICh1MTYpKHNpemVvZigqaGVhZGVyKSArIHBheWxvYWRfc2l6ZSk7CisKKwkJLyoKKwkJICogRm9yIGEgcmVxdWVzdCwgdGhlIG9wZXJhdGlvbiBpZCBnZXRzIGZpbGxlZCBpbgorCQkgKiB3aGVuIHRoZSBtZXNzYWdlIGlzIHNlbnQuICBGb3IgYSByZXNwb25zZSwgaXQKKwkJICogd2lsbCBiZSBjb3BpZWQgZnJvbSB0aGUgcmVxdWVzdCBieSB0aGUgY2FsbGVyLgorCQkgKgorCQkgKiBUaGUgcmVzdWx0IGZpZWxkIGluIGEgcmVxdWVzdCBtZXNzYWdlIG11c3QgYmUKKwkJICogemVyby4gIEl0IHdpbGwgYmUgc2V0IGp1c3QgcHJpb3IgdG8gc2VuZGluZyBmb3IKKwkJICogYSByZXNwb25zZS4KKwkJICovCisJCWhlYWRlci0+c2l6ZSA9IGNwdV90b19sZTE2KG1lc3NhZ2Vfc2l6ZSk7CisJCWhlYWRlci0+b3BlcmF0aW9uX2lkID0gMDsKKwkJaGVhZGVyLT50eXBlID0gdHlwZTsKKwkJaGVhZGVyLT5yZXN1bHQgPSAwOworCX0KK30KKworLyoKKyAqIEFsbG9jYXRlIGEgbWVzc2FnZSB0byBiZSB1c2VkIGZvciBhbiBvcGVyYXRpb24gcmVxdWVzdCBvciByZXNwb25zZS4KKyAqIEJvdGggdHlwZXMgb2YgbWVzc2FnZSBjb250YWluIGEgY29tbW9uIGhlYWRlci4gIFRoZSByZXF1ZXN0IG1lc3NhZ2UKKyAqIGZvciBhbiBvdXRnb2luZyBvcGVyYXRpb24gaXMgb3V0Ym91bmQsIGFzIGlzIHRoZSByZXNwb25zZSBtZXNzYWdlCisgKiBmb3IgYW4gaW5jb21pbmcgb3BlcmF0aW9uLiAgVGhlIG1lc3NhZ2UgaGVhZGVyIGZvciBhbiBvdXRib3VuZAorICogbWVzc2FnZSBpcyBwYXJ0aWFsbHkgaW5pdGlhbGl6ZWQgaGVyZS4KKyAqCisgKiBUaGUgaGVhZGVycyBmb3IgaW5ib3VuZCBtZXNzYWdlcyBkb24ndCBuZWVkIHRvIGJlIGluaXRpYWxpemVkOworICogdGhleSdsbCBiZSBmaWxsZWQgaW4gYnkgYXJyaXZpbmcgZGF0YS4KKyAqCisgKiBPdXIgbWVzc2FnZSBidWZmZXJzIGhhdmUgdGhlIGZvbGxvd2luZyBsYXlvdXQ6CisgKgltZXNzYWdlIGhlYWRlciAgXF8gdGhlc2UgY29tYmluZWQgYXJlCisgKgltZXNzYWdlIHBheWxvYWQgLyAgdGhlIG1lc3NhZ2Ugc2l6ZQorICovCitzdGF0aWMgc3RydWN0IGdiX21lc3NhZ2UgKgorZ2Jfb3BlcmF0aW9uX21lc3NhZ2VfYWxsb2Moc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCwgdTggdHlwZSwKKwkJCQlzaXplX3QgcGF5bG9hZF9zaXplLCBnZnBfdCBnZnBfZmxhZ3MpCit7CisJc3RydWN0IGdiX21lc3NhZ2UgKm1lc3NhZ2U7CisJc3RydWN0IGdiX29wZXJhdGlvbl9tc2dfaGRyICpoZWFkZXI7CisJc2l6ZV90IG1lc3NhZ2Vfc2l6ZSA9IHBheWxvYWRfc2l6ZSArIHNpemVvZigqaGVhZGVyKTsKKworCWlmIChtZXNzYWdlX3NpemUgPiBoZC0+YnVmZmVyX3NpemVfbWF4KSB7CisJCWRldl93YXJuKCZoZC0+ZGV2LCAicmVxdWVzdGVkIG1lc3NhZ2Ugc2l6ZSB0b28gYmlnICglenUgPiAlenUpXG4iLAorCQkJCW1lc3NhZ2Vfc2l6ZSwgaGQtPmJ1ZmZlcl9zaXplX21heCk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIEFsbG9jYXRlIHRoZSBtZXNzYWdlIHN0cnVjdHVyZSBhbmQgYnVmZmVyLiAqLworCW1lc3NhZ2UgPSBrbWVtX2NhY2hlX3phbGxvYyhnYl9tZXNzYWdlX2NhY2hlLCBnZnBfZmxhZ3MpOworCWlmICghbWVzc2FnZSkKKwkJcmV0dXJuIE5VTEw7CisKKwltZXNzYWdlLT5idWZmZXIgPSBremFsbG9jKG1lc3NhZ2Vfc2l6ZSwgZ2ZwX2ZsYWdzKTsKKwlpZiAoIW1lc3NhZ2UtPmJ1ZmZlcikKKwkJZ290byBlcnJfZnJlZV9tZXNzYWdlOworCisJLyogSW5pdGlhbGl6ZSB0aGUgbWVzc2FnZS4gIE9wZXJhdGlvbiBpZCBpcyBmaWxsZWQgaW4gbGF0ZXIuICovCisJZ2Jfb3BlcmF0aW9uX21lc3NhZ2VfaW5pdChoZCwgbWVzc2FnZSwgMCwgcGF5bG9hZF9zaXplLCB0eXBlKTsKKworCXJldHVybiBtZXNzYWdlOworCitlcnJfZnJlZV9tZXNzYWdlOgorCWttZW1fY2FjaGVfZnJlZShnYl9tZXNzYWdlX2NhY2hlLCBtZXNzYWdlKTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBnYl9vcGVyYXRpb25fbWVzc2FnZV9mcmVlKHN0cnVjdCBnYl9tZXNzYWdlICptZXNzYWdlKQoreworCWtmcmVlKG1lc3NhZ2UtPmJ1ZmZlcik7CisJa21lbV9jYWNoZV9mcmVlKGdiX21lc3NhZ2VfY2FjaGUsIG1lc3NhZ2UpOworfQorCisvKgorICogTWFwIGFuIGVudW0gZ2Jfb3BlcmF0aW9uX3N0YXR1cyB2YWx1ZSAod2hpY2ggaXMgcmVwcmVzZW50ZWQgaW4gYQorICogbWVzc2FnZSBhcyBhIHNpbmdsZSBieXRlKSB0byBhbiBhcHByb3ByaWF0ZSBMaW51eCBuZWdhdGl2ZSBlcnJuby4KKyAqLworc3RhdGljIGludCBnYl9vcGVyYXRpb25fc3RhdHVzX21hcCh1OCBzdGF0dXMpCit7CisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIEdCX09QX1NVQ0NFU1M6CisJCXJldHVybiAwOworCWNhc2UgR0JfT1BfSU5URVJSVVBURUQ6CisJCXJldHVybiAtRUlOVFI7CisJY2FzZSBHQl9PUF9USU1FT1VUOgorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwljYXNlIEdCX09QX05PX01FTU9SWToKKwkJcmV0dXJuIC1FTk9NRU07CisJY2FzZSBHQl9PUF9QUk9UT0NPTF9CQUQ6CisJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOworCWNhc2UgR0JfT1BfT1ZFUkZMT1c6CisJCXJldHVybiAtRU1TR1NJWkU7CisJY2FzZSBHQl9PUF9JTlZBTElEOgorCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIEdCX09QX1JFVFJZOgorCQlyZXR1cm4gLUVBR0FJTjsKKwljYXNlIEdCX09QX05PTkVYSVNURU5UOgorCQlyZXR1cm4gLUVOT0RFVjsKKwljYXNlIEdCX09QX01BTEZVTkNUSU9OOgorCQlyZXR1cm4gLUVJTFNFUTsKKwljYXNlIEdCX09QX1VOS05PV05fRVJST1I6CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU87CisJfQorfQorCisvKgorICogTWFwIGEgTGludXggZXJybm8gdmFsdWUgKGZyb20gb3BlcmF0aW9uLT5lcnJubykgaW50byB0aGUgdmFsdWUKKyAqIHRoYXQgc2hvdWxkIHJlcHJlc2VudCBpdCBpbiBhIHJlc3BvbnNlIG1lc3NhZ2Ugc3RhdHVzIHNlbnQKKyAqIG92ZXIgdGhlIHdpcmUuICBSZXR1cm5zIGFuIGVudW0gZ2Jfb3BlcmF0aW9uX3N0YXR1cyB2YWx1ZSAod2hpY2gKKyAqIGlzIHJlcHJlc2VudGVkIGluIGEgbWVzc2FnZSBhcyBhIHNpbmdsZSBieXRlKS4KKyAqLworc3RhdGljIHU4IGdiX29wZXJhdGlvbl9lcnJub19tYXAoaW50IGVycm5vKQoreworCXN3aXRjaCAoZXJybm8pIHsKKwljYXNlIDA6CisJCXJldHVybiBHQl9PUF9TVUNDRVNTOworCWNhc2UgLUVJTlRSOgorCQlyZXR1cm4gR0JfT1BfSU5URVJSVVBURUQ7CisJY2FzZSAtRVRJTUVET1VUOgorCQlyZXR1cm4gR0JfT1BfVElNRU9VVDsKKwljYXNlIC1FTk9NRU06CisJCXJldHVybiBHQl9PUF9OT19NRU1PUlk7CisJY2FzZSAtRVBST1RPTk9TVVBQT1JUOgorCQlyZXR1cm4gR0JfT1BfUFJPVE9DT0xfQkFEOworCWNhc2UgLUVNU0dTSVpFOgorCQlyZXR1cm4gR0JfT1BfT1ZFUkZMT1c7CS8qIENvdWxkIGJlIHVuZGVyZmxvdyB0b28gKi8KKwljYXNlIC1FSU5WQUw6CisJCXJldHVybiBHQl9PUF9JTlZBTElEOworCWNhc2UgLUVBR0FJTjoKKwkJcmV0dXJuIEdCX09QX1JFVFJZOworCWNhc2UgLUVJTFNFUToKKwkJcmV0dXJuIEdCX09QX01BTEZVTkNUSU9OOworCWNhc2UgLUVOT0RFVjoKKwkJcmV0dXJuIEdCX09QX05PTkVYSVNURU5UOworCWNhc2UgLUVJTzoKKwlkZWZhdWx0OgorCQlyZXR1cm4gR0JfT1BfVU5LTk9XTl9FUlJPUjsKKwl9Cit9CisKK2Jvb2wgZ2Jfb3BlcmF0aW9uX3Jlc3BvbnNlX2FsbG9jKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbiwKKwkJCQkJc2l6ZV90IHJlc3BvbnNlX3NpemUsIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkID0gb3BlcmF0aW9uLT5jb25uZWN0aW9uLT5oZDsKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uX21zZ19oZHIgKnJlcXVlc3RfaGVhZGVyOworCXN0cnVjdCBnYl9tZXNzYWdlICpyZXNwb25zZTsKKwl1OCB0eXBlOworCisJdHlwZSA9IG9wZXJhdGlvbi0+dHlwZSB8IEdCX01FU1NBR0VfVFlQRV9SRVNQT05TRTsKKwlyZXNwb25zZSA9IGdiX29wZXJhdGlvbl9tZXNzYWdlX2FsbG9jKGhkLCB0eXBlLCByZXNwb25zZV9zaXplLCBnZnApOworCWlmICghcmVzcG9uc2UpCisJCXJldHVybiBmYWxzZTsKKwlyZXNwb25zZS0+b3BlcmF0aW9uID0gb3BlcmF0aW9uOworCisJLyoKKwkgKiBTaXplIGFuZCB0eXBlIGdldCBpbml0aWFsaXplZCB3aGVuIHRoZSBtZXNzYWdlIGlzCisJICogYWxsb2NhdGVkLiAgVGhlIGVycm5vIHdpbGwgYmUgc2V0IGJlZm9yZSBzZW5kaW5nLiAgQWxsCisJICogdGhhdCdzIGxlZnQgaXMgdGhlIG9wZXJhdGlvbiBpZCwgd2hpY2ggd2UgY29weSBmcm9tIHRoZQorCSAqIHJlcXVlc3QgbWVzc2FnZSBoZWFkZXIgKGFzLWlzLCBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyKS4KKwkgKi8KKwlyZXF1ZXN0X2hlYWRlciA9IG9wZXJhdGlvbi0+cmVxdWVzdC0+aGVhZGVyOworCXJlc3BvbnNlLT5oZWFkZXItPm9wZXJhdGlvbl9pZCA9IHJlcXVlc3RfaGVhZGVyLT5vcGVyYXRpb25faWQ7CisJb3BlcmF0aW9uLT5yZXNwb25zZSA9IHJlc3BvbnNlOworCisJcmV0dXJuIHRydWU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9vcGVyYXRpb25fcmVzcG9uc2VfYWxsb2MpOworCisvKgorICogQ3JlYXRlIGEgR3JleWJ1cyBvcGVyYXRpb24gdG8gYmUgc2VudCBvdmVyIHRoZSBnaXZlbiBjb25uZWN0aW9uLgorICogVGhlIHJlcXVlc3QgYnVmZmVyIHdpbGwgYmUgYmlnIGVub3VnaCBmb3IgYSBwYXlsb2FkIG9mIHRoZSBnaXZlbgorICogc2l6ZS4KKyAqCisgKiBGb3Igb3V0Z29pbmcgcmVxdWVzdHMsIHRoZSByZXF1ZXN0IG1lc3NhZ2UncyBoZWFkZXIgd2lsbCBiZQorICogaW5pdGlhbGl6ZWQgd2l0aCB0aGUgdHlwZSBvZiB0aGUgcmVxdWVzdCBhbmQgdGhlIG1lc3NhZ2Ugc2l6ZS4KKyAqIE91dGdvaW5nIG9wZXJhdGlvbnMgbXVzdCBhbHNvIHNwZWNpZnkgdGhlIHJlc3BvbnNlIGJ1ZmZlciBzaXplLAorICogd2hpY2ggbXVzdCBiZSBzdWZmaWNpZW50IHRvIGhvbGQgYWxsIGV4cGVjdGVkIHJlc3BvbnNlIGRhdGEuICBUaGUKKyAqIHJlc3BvbnNlIG1lc3NhZ2UgaGVhZGVyIHdpbGwgZXZlbnR1YWxseSBiZSBvdmVyd3JpdHRlbiwgc28gdGhlcmUncworICogbm8gbmVlZCB0byBpbml0aWFsaXplIGl0IGhlcmUuCisgKgorICogUmVxdWVzdCBtZXNzYWdlcyBmb3IgaW5jb21pbmcgb3BlcmF0aW9ucyBjYW4gYXJyaXZlIGluIGludGVycnVwdAorICogY29udGV4dCwgc28gdGhleSBtdXN0IGJlIGFsbG9jYXRlZCB3aXRoIEdGUF9BVE9NSUMuICBJbiB0aGlzIGNhc2UKKyAqIHRoZSByZXF1ZXN0IGJ1ZmZlciB3aWxsIGJlIGltbWVkaWF0ZWx5IG92ZXJ3cml0dGVuLCBzbyB0aGVyZSBpcworICogbm8gbmVlZCB0byBpbml0aWFsaXplIHRoZSBtZXNzYWdlIGhlYWRlci4gIFJlc3BvbnNpYmlsaXR5IGZvcgorICogYWxsb2NhdGluZyBhIHJlc3BvbnNlIGJ1ZmZlciBsaWVzIHdpdGggdGhlIGluY29taW5nIHJlcXVlc3QKKyAqIGhhbmRsZXIgZm9yIGEgcHJvdG9jb2wuICBTbyB3ZSBkb24ndCBhbGxvY2F0ZSB0aGF0IGhlcmUuCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG5ldyBvcGVyYXRpb24gb3IgYSBudWxsIHBvaW50ZXIgaWYgYW4KKyAqIGVycm9yIG9jY3Vycy4KKyAqLworc3RhdGljIHN0cnVjdCBnYl9vcGVyYXRpb24gKgorZ2Jfb3BlcmF0aW9uX2NyZWF0ZV9jb21tb24oc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHU4IHR5cGUsCisJCQkJc2l6ZV90IHJlcXVlc3Rfc2l6ZSwgc2l6ZV90IHJlc3BvbnNlX3NpemUsCisJCQkJdW5zaWduZWQgbG9uZyBvcF9mbGFncywgZ2ZwX3QgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQgPSBjb25uZWN0aW9uLT5oZDsKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb247CisKKwlvcGVyYXRpb24gPSBrbWVtX2NhY2hlX3phbGxvYyhnYl9vcGVyYXRpb25fY2FjaGUsIGdmcF9mbGFncyk7CisJaWYgKCFvcGVyYXRpb24pCisJCXJldHVybiBOVUxMOworCW9wZXJhdGlvbi0+Y29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisKKwlvcGVyYXRpb24tPnJlcXVlc3QgPSBnYl9vcGVyYXRpb25fbWVzc2FnZV9hbGxvYyhoZCwgdHlwZSwgcmVxdWVzdF9zaXplLAorCQkJCQkJCWdmcF9mbGFncyk7CisJaWYgKCFvcGVyYXRpb24tPnJlcXVlc3QpCisJCWdvdG8gZXJyX2NhY2hlOworCW9wZXJhdGlvbi0+cmVxdWVzdC0+b3BlcmF0aW9uID0gb3BlcmF0aW9uOworCisJLyogQWxsb2NhdGUgdGhlIHJlc3BvbnNlIGJ1ZmZlciBmb3Igb3V0Z29pbmcgb3BlcmF0aW9ucyAqLworCWlmICghKG9wX2ZsYWdzICYgR0JfT1BFUkFUSU9OX0ZMQUdfSU5DT01JTkcpKSB7CisJCWlmICghZ2Jfb3BlcmF0aW9uX3Jlc3BvbnNlX2FsbG9jKG9wZXJhdGlvbiwgcmVzcG9uc2Vfc2l6ZSwKKwkJCQkJCSBnZnBfZmxhZ3MpKSB7CisJCQlnb3RvIGVycl9yZXF1ZXN0OworCQl9CisJfQorCisJb3BlcmF0aW9uLT5mbGFncyA9IG9wX2ZsYWdzOworCW9wZXJhdGlvbi0+dHlwZSA9IHR5cGU7CisJb3BlcmF0aW9uLT5lcnJubyA9IC1FQkFEUjsgIC8qIEluaXRpYWwgdmFsdWUtLW1lYW5zICJuZXZlciBzZXQiICovCisKKwlJTklUX1dPUksoJm9wZXJhdGlvbi0+d29yaywgZ2Jfb3BlcmF0aW9uX3dvcmspOworCWluaXRfY29tcGxldGlvbigmb3BlcmF0aW9uLT5jb21wbGV0aW9uKTsKKwlrcmVmX2luaXQoJm9wZXJhdGlvbi0+a3JlZik7CisJYXRvbWljX3NldCgmb3BlcmF0aW9uLT53YWl0ZXJzLCAwKTsKKworCXJldHVybiBvcGVyYXRpb247CisKK2Vycl9yZXF1ZXN0OgorCWdiX29wZXJhdGlvbl9tZXNzYWdlX2ZyZWUob3BlcmF0aW9uLT5yZXF1ZXN0KTsKK2Vycl9jYWNoZToKKwlrbWVtX2NhY2hlX2ZyZWUoZ2Jfb3BlcmF0aW9uX2NhY2hlLCBvcGVyYXRpb24pOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBDcmVhdGUgYSBuZXcgb3BlcmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29ubmVjdGlvbi4gIFRoZQorICogcmVxdWVzdCBhbmQgcmVzcG9uc2Ugc2l6ZXMgcHJvdmlkZWQgYXJlIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAqIHJlcXVpcmVkIHRvIGhvbGQgdGhlIHJlcXVlc3QvcmVzcG9uc2UgcGF5bG9hZCBvbmx5LiAgQm90aCBvZgorICogdGhlc2UgYXJlIGFsbG93ZWQgdG8gYmUgMC4gIE5vdGUgdGhhdCAweDAwIGlzIHJlc2VydmVkIGFzIGFuCisgKiBpbnZhbGlkIG9wZXJhdGlvbiB0eXBlIGZvciBhbGwgcHJvdG9jb2xzLCBhbmQgdGhpcyBpcyBlbmZvcmNlZAorICogaGVyZS4KKyAqLworc3RydWN0IGdiX29wZXJhdGlvbiAqCitnYl9vcGVyYXRpb25fY3JlYXRlX2ZsYWdzKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCXU4IHR5cGUsIHNpemVfdCByZXF1ZXN0X3NpemUsCisJCQkJc2l6ZV90IHJlc3BvbnNlX3NpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCQkJZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbjsKKworCWlmIChXQVJOX09OX09OQ0UodHlwZSA9PSBHQl9SRVFVRVNUX1RZUEVfSU5WQUxJRCkpCisJCXJldHVybiBOVUxMOworCWlmIChXQVJOX09OX09OQ0UodHlwZSAmIEdCX01FU1NBR0VfVFlQRV9SRVNQT05TRSkpCisJCXR5cGUgJj0gfkdCX01FU1NBR0VfVFlQRV9SRVNQT05TRTsKKworCWlmIChXQVJOX09OX09OQ0UoZmxhZ3MgJiB+R0JfT1BFUkFUSU9OX0ZMQUdfVVNFUl9NQVNLKSkKKwkJZmxhZ3MgJj0gR0JfT1BFUkFUSU9OX0ZMQUdfVVNFUl9NQVNLOworCisJb3BlcmF0aW9uID0gZ2Jfb3BlcmF0aW9uX2NyZWF0ZV9jb21tb24oY29ubmVjdGlvbiwgdHlwZSwKKwkJCQkJCXJlcXVlc3Rfc2l6ZSwgcmVzcG9uc2Vfc2l6ZSwKKwkJCQkJCWZsYWdzLCBnZnApOworCWlmIChvcGVyYXRpb24pCisJCXRyYWNlX2diX29wZXJhdGlvbl9jcmVhdGUob3BlcmF0aW9uKTsKKworCXJldHVybiBvcGVyYXRpb247Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9vcGVyYXRpb25fY3JlYXRlX2ZsYWdzKTsKKworc3RydWN0IGdiX29wZXJhdGlvbiAqCitnYl9vcGVyYXRpb25fY3JlYXRlX2NvcmUoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJdTggdHlwZSwgc2l6ZV90IHJlcXVlc3Rfc2l6ZSwKKwkJCQlzaXplX3QgcmVzcG9uc2Vfc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncywKKwkJCQlnZnBfdCBnZnApCit7CisJc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uOworCisJZmxhZ3MgfD0gR0JfT1BFUkFUSU9OX0ZMQUdfQ09SRTsKKworCW9wZXJhdGlvbiA9IGdiX29wZXJhdGlvbl9jcmVhdGVfY29tbW9uKGNvbm5lY3Rpb24sIHR5cGUsCisJCQkJCQlyZXF1ZXN0X3NpemUsIHJlc3BvbnNlX3NpemUsCisJCQkJCQlmbGFncywgZ2ZwKTsKKwlpZiAob3BlcmF0aW9uKQorCQl0cmFjZV9nYl9vcGVyYXRpb25fY3JlYXRlX2NvcmUob3BlcmF0aW9uKTsKKworCXJldHVybiBvcGVyYXRpb247Cit9CisvKiBEbyBub3QgZXhwb3J0IHRoaXMgZnVuY3Rpb24uICovCisKK3NpemVfdCBnYl9vcGVyYXRpb25fZ2V0X3BheWxvYWRfc2l6ZV9tYXgoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCA9IGNvbm5lY3Rpb24tPmhkOworCisJcmV0dXJuIGhkLT5idWZmZXJfc2l6ZV9tYXggLSBzaXplb2Yoc3RydWN0IGdiX29wZXJhdGlvbl9tc2dfaGRyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX29wZXJhdGlvbl9nZXRfcGF5bG9hZF9zaXplX21heCk7CisKK3N0YXRpYyBzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICoKK2diX29wZXJhdGlvbl9jcmVhdGVfaW5jb21pbmcoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHUxNiBpZCwKKwkJCQl1OCB0eXBlLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb247CisJc2l6ZV90IHJlcXVlc3Rfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gR0JfT1BFUkFUSU9OX0ZMQUdfSU5DT01JTkc7CisKKwkvKiBDYWxsZXIgaGFzIG1hZGUgc3VyZSB3ZSBhdCBsZWFzdCBoYXZlIGEgbWVzc2FnZSBoZWFkZXIuICovCisJcmVxdWVzdF9zaXplID0gc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uX21zZ19oZHIpOworCisJaWYgKCFpZCkKKwkJZmxhZ3MgfD0gR0JfT1BFUkFUSU9OX0ZMQUdfVU5JRElSRUNUSU9OQUw7CisKKwlvcGVyYXRpb24gPSBnYl9vcGVyYXRpb25fY3JlYXRlX2NvbW1vbihjb25uZWN0aW9uLCB0eXBlLAorCQkJCQkJcmVxdWVzdF9zaXplLAorCQkJCQkJR0JfUkVRVUVTVF9UWVBFX0lOVkFMSUQsCisJCQkJCQlmbGFncywgR0ZQX0FUT01JQyk7CisJaWYgKCFvcGVyYXRpb24pCisJCXJldHVybiBOVUxMOworCisJb3BlcmF0aW9uLT5pZCA9IGlkOworCW1lbWNweShvcGVyYXRpb24tPnJlcXVlc3QtPmhlYWRlciwgZGF0YSwgc2l6ZSk7CisJdHJhY2VfZ2Jfb3BlcmF0aW9uX2NyZWF0ZV9pbmNvbWluZyhvcGVyYXRpb24pOworCisJcmV0dXJuIG9wZXJhdGlvbjsKK30KKworLyoKKyAqIEdldCBhbiBhZGRpdGlvbmFsIHJlZmVyZW5jZSBvbiBhbiBvcGVyYXRpb24uCisgKi8KK3ZvaWQgZ2Jfb3BlcmF0aW9uX2dldChzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb24pCit7CisJa3JlZl9nZXQoJm9wZXJhdGlvbi0+a3JlZik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9vcGVyYXRpb25fZ2V0KTsKKworLyoKKyAqIERlc3Ryb3kgYSBwcmV2aW91c2x5IGNyZWF0ZWQgb3BlcmF0aW9uLgorICovCitzdGF0aWMgdm9pZCBfZ2Jfb3BlcmF0aW9uX2Rlc3Ryb3koc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uOworCisJb3BlcmF0aW9uID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBnYl9vcGVyYXRpb24sIGtyZWYpOworCisJdHJhY2VfZ2Jfb3BlcmF0aW9uX2Rlc3Ryb3kob3BlcmF0aW9uKTsKKworCWlmIChvcGVyYXRpb24tPnJlc3BvbnNlKQorCQlnYl9vcGVyYXRpb25fbWVzc2FnZV9mcmVlKG9wZXJhdGlvbi0+cmVzcG9uc2UpOworCWdiX29wZXJhdGlvbl9tZXNzYWdlX2ZyZWUob3BlcmF0aW9uLT5yZXF1ZXN0KTsKKworCWttZW1fY2FjaGVfZnJlZShnYl9vcGVyYXRpb25fY2FjaGUsIG9wZXJhdGlvbik7Cit9CisKKy8qCisgKiBEcm9wIGEgcmVmZXJlbmNlIG9uIGFuIG9wZXJhdGlvbiwgYW5kIGRlc3Ryb3kgaXQgd2hlbiB0aGUgbGFzdAorICogb25lIGlzIGdvbmUuCisgKi8KK3ZvaWQgZ2Jfb3BlcmF0aW9uX3B1dChzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb24pCit7CisJaWYgKFdBUk5fT04oIW9wZXJhdGlvbikpCisJCXJldHVybjsKKworCWtyZWZfcHV0KCZvcGVyYXRpb24tPmtyZWYsIF9nYl9vcGVyYXRpb25fZGVzdHJveSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9vcGVyYXRpb25fcHV0KTsKKworLyogVGVsbCB0aGUgcmVxdWVzdGVyIHdlJ3JlIGRvbmUgKi8KK3N0YXRpYyB2b2lkIGdiX29wZXJhdGlvbl9zeW5jX2NhbGxiYWNrKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbikKK3sKKwljb21wbGV0ZSgmb3BlcmF0aW9uLT5jb21wbGV0aW9uKTsKK30KKworLyoqCisgKiBnYl9vcGVyYXRpb25fcmVxdWVzdF9zZW5kKCkgLSBzZW5kIGFuIG9wZXJhdGlvbiByZXF1ZXN0IG1lc3NhZ2UKKyAqIEBvcGVyYXRpb246CXRoZSBvcGVyYXRpb24gdG8gaW5pdGlhdGUKKyAqIEBjYWxsYmFjazoJdGhlIG9wZXJhdGlvbiBjb21wbGV0aW9uIGNhbGxiYWNrCisgKiBAZ2ZwOgl0aGUgbWVtb3J5IGZsYWdzIHRvIHVzZSBmb3IgYW55IGFsbG9jYXRpb25zCisgKgorICogVGhlIGNhbGxlciBoYXMgZmlsbGVkIGluIGFueSBwYXlsb2FkIHNvIHRoZSByZXF1ZXN0IG1lc3NhZ2UgaXMgcmVhZHkgdG8gZ28uCisgKiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gc3VwcGxpZWQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgcmVzcG9uc2UgbWVzc2FnZSBoYXMKKyAqIGFycml2ZWQsIGEgdW5pZGlyZWN0aW9uYWwgcmVxdWVzdCBoYXMgYmVlbiBzZW50LCBvciB0aGUgb3BlcmF0aW9uIGlzCisgKiBjYW5jZWxsZWQsIGluZGljYXRpbmcgdGhhdCB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24KKyAqIGNhbiBmZXRjaCB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gdXNpbmcgZ2Jfb3BlcmF0aW9uX3Jlc3VsdCgpIGlmCisgKiBkZXNpcmVkLgorICoKKyAqIFJldHVybjogMCBpZiB0aGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHF1ZXVlZCBpbiB0aGUgaG9zdC1kcml2ZXIgcXVldWVzLAorICogb3IgYSBuZWdhdGl2ZSBlcnJuby4KKyAqLworaW50IGdiX29wZXJhdGlvbl9yZXF1ZXN0X3NlbmQoc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uLAorCQkJCWdiX29wZXJhdGlvbl9jYWxsYmFjayBjYWxsYmFjaywKKwkJCQlnZnBfdCBnZnApCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBvcGVyYXRpb24tPmNvbm5lY3Rpb247CisJc3RydWN0IGdiX29wZXJhdGlvbl9tc2dfaGRyICpoZWFkZXI7CisJdW5zaWduZWQgaW50IGN5Y2xlOworCWludCByZXQ7CisKKwlpZiAoZ2JfY29ubmVjdGlvbl9pc19vZmZsb2FkZWQoY29ubmVjdGlvbikpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoIWNhbGxiYWNrKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogUmVjb3JkIHRoZSBjYWxsYmFjayBmdW5jdGlvbiwgd2hpY2ggaXMgZXhlY3V0ZWQgaW4KKwkgKiBub24tYXRvbWljICh3b3JrcXVldWUpIGNvbnRleHQgd2hlbiB0aGUgZmluYWwgcmVzdWx0CisJICogb2YgYW4gb3BlcmF0aW9uIGhhcyBiZWVuIHNldC4KKwkgKi8KKwlvcGVyYXRpb24tPmNhbGxiYWNrID0gY2FsbGJhY2s7CisKKwkvKgorCSAqIEFzc2lnbiB0aGUgb3BlcmF0aW9uJ3MgaWQsIGFuZCBzdG9yZSBpdCBpbiB0aGUgcmVxdWVzdCBoZWFkZXIuCisJICogWmVybyBpcyBhIHJlc2VydmVkIG9wZXJhdGlvbiBpZCBmb3IgdW5pZGlyZWN0aW9uYWwgb3BlcmF0aW9ucy4KKwkgKi8KKwlpZiAoZ2Jfb3BlcmF0aW9uX2lzX3VuaWRpcmVjdGlvbmFsKG9wZXJhdGlvbikpIHsKKwkJb3BlcmF0aW9uLT5pZCA9IDA7CisJfSBlbHNlIHsKKwkJY3ljbGUgPSAodW5zaWduZWQgaW50KWF0b21pY19pbmNfcmV0dXJuKCZjb25uZWN0aW9uLT5vcF9jeWNsZSk7CisJCW9wZXJhdGlvbi0+aWQgPSAodTE2KShjeWNsZSAlIFUxNl9NQVggKyAxKTsKKwl9CisKKwloZWFkZXIgPSBvcGVyYXRpb24tPnJlcXVlc3QtPmhlYWRlcjsKKwloZWFkZXItPm9wZXJhdGlvbl9pZCA9IGNwdV90b19sZTE2KG9wZXJhdGlvbi0+aWQpOworCisJZ2Jfb3BlcmF0aW9uX3Jlc3VsdF9zZXQob3BlcmF0aW9uLCAtRUlOUFJPR1JFU1MpOworCisJLyoKKwkgKiBHZXQgYW4gZXh0cmEgcmVmZXJlbmNlIG9uIHRoZSBvcGVyYXRpb24uIEl0J2xsIGJlIGRyb3BwZWQgd2hlbiB0aGUKKwkgKiBvcGVyYXRpb24gY29tcGxldGVzLgorCSAqLworCWdiX29wZXJhdGlvbl9nZXQob3BlcmF0aW9uKTsKKwlyZXQgPSBnYl9vcGVyYXRpb25fZ2V0X2FjdGl2ZShvcGVyYXRpb24pOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3B1dDsKKworCXJldCA9IGdiX21lc3NhZ2Vfc2VuZChvcGVyYXRpb24tPnJlcXVlc3QsIGdmcCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcHV0X2FjdGl2ZTsKKworCXJldHVybiAwOworCitlcnJfcHV0X2FjdGl2ZToKKwlnYl9vcGVyYXRpb25fcHV0X2FjdGl2ZShvcGVyYXRpb24pOworZXJyX3B1dDoKKwlnYl9vcGVyYXRpb25fcHV0KG9wZXJhdGlvbik7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2Jfb3BlcmF0aW9uX3JlcXVlc3Rfc2VuZCk7CisKKy8qCisgKiBTZW5kIGEgc3luY2hyb25vdXMgb3BlcmF0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBleHBlY3RlZCB0bworICogYmxvY2ssIHJldHVybmluZyBvbmx5IHdoZW4gdGhlIHJlc3BvbnNlIGhhcyBhcnJpdmVkLCAob3Igd2hlbiBhbgorICogZXJyb3IgaXMgZGV0ZWN0ZWQuICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSByZXN1bHQgb2YgdGhlCisgKiBvcGVyYXRpb24uCisgKi8KK2ludCBnYl9vcGVyYXRpb25fcmVxdWVzdF9zZW5kX3N5bmNfdGltZW91dChzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb24sCisJCQkJCQl1bnNpZ25lZCBpbnQgdGltZW91dCkKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgdGltZW91dF9qaWZmaWVzOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3JlcXVlc3Rfc2VuZChvcGVyYXRpb24sIGdiX29wZXJhdGlvbl9zeW5jX2NhbGxiYWNrLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKHRpbWVvdXQpCisJCXRpbWVvdXRfamlmZmllcyA9IG1zZWNzX3RvX2ppZmZpZXModGltZW91dCk7CisJZWxzZQorCQl0aW1lb3V0X2ppZmZpZXMgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKKworCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZvcGVyYXRpb24tPmNvbXBsZXRpb24sCisJCQkJCQkJdGltZW91dF9qaWZmaWVzKTsKKwlpZiAocmV0IDwgMCkgeworCQkvKiBDYW5jZWwgdGhlIG9wZXJhdGlvbiBpZiBpbnRlcnJ1cHRlZCAqLworCQlnYl9vcGVyYXRpb25fY2FuY2VsKG9wZXJhdGlvbiwgLUVDQU5DRUxFRCk7CisJfSBlbHNlIGlmIChyZXQgPT0gMCkgeworCQkvKiBDYW5jZWwgdGhlIG9wZXJhdGlvbiBpZiBvcCB0aW1lZCBvdXQgKi8KKwkJZ2Jfb3BlcmF0aW9uX2NhbmNlbChvcGVyYXRpb24sIC1FVElNRURPVVQpOworCX0KKworCXJldHVybiBnYl9vcGVyYXRpb25fcmVzdWx0KG9wZXJhdGlvbik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9vcGVyYXRpb25fcmVxdWVzdF9zZW5kX3N5bmNfdGltZW91dCk7CisKKy8qCisgKiBTZW5kIGEgcmVzcG9uc2UgZm9yIGFuIGluY29taW5nIG9wZXJhdGlvbiByZXF1ZXN0LiAgQSBub24temVybworICogZXJybm8gaW5kaWNhdGVzIGEgZmFpbGVkIG9wZXJhdGlvbi4KKyAqCisgKiBJZiB0aGVyZSBpcyBhbnkgcmVzcG9uc2UgcGF5bG9hZCwgdGhlIGluY29taW5nIHJlcXVlc3QgaGFuZGxlciBpcworICogcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcgdGhlIHJlc3BvbnNlIG1lc3NhZ2UuICBPdGhlcndpc2UgdGhlCisgKiBpdCBjYW4gc2ltcGx5IHN1cHBseSB0aGUgcmVzdWx0IGVycm5vOyB0aGlzIGZ1bmN0aW9uIHdpbGwKKyAqIGFsbG9jYXRlIHRoZSByZXNwb25zZSBtZXNzYWdlIGlmIG5lY2Vzc2FyeS4KKyAqLworc3RhdGljIGludCBnYl9vcGVyYXRpb25fcmVzcG9uc2Vfc2VuZChzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb24sCisJCQkJCWludCBlcnJubykKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IG9wZXJhdGlvbi0+Y29ubmVjdGlvbjsKKwlpbnQgcmV0OworCisJaWYgKCFvcGVyYXRpb24tPnJlc3BvbnNlICYmCisJCQkhZ2Jfb3BlcmF0aW9uX2lzX3VuaWRpcmVjdGlvbmFsKG9wZXJhdGlvbikpIHsKKwkJaWYgKCFnYl9vcGVyYXRpb25fcmVzcG9uc2VfYWxsb2Mob3BlcmF0aW9uLCAwLCBHRlBfS0VSTkVMKSkKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIFJlY29yZCB0aGUgcmVzdWx0ICovCisJaWYgKCFnYl9vcGVyYXRpb25fcmVzdWx0X3NldChvcGVyYXRpb24sIGVycm5vKSkgeworCQlkZXZfZXJyKCZjb25uZWN0aW9uLT5oZC0+ZGV2LCAicmVxdWVzdCByZXN1bHQgYWxyZWFkeSBzZXRcbiIpOworCQlyZXR1cm4gLUVJTzsJLyogU2hvdWxkbid0IGhhcHBlbiAqLworCX0KKworCS8qIFNlbmRlciBvZiByZXF1ZXN0IGRvZXMgbm90IGNhcmUgYWJvdXQgcmVzcG9uc2UuICovCisJaWYgKGdiX29wZXJhdGlvbl9pc191bmlkaXJlY3Rpb25hbChvcGVyYXRpb24pKQorCQlyZXR1cm4gMDsKKworCS8qIFJlZmVyZW5jZSB3aWxsIGJlIGRyb3BwZWQgd2hlbiBtZXNzYWdlIGhhcyBiZWVuIHNlbnQuICovCisJZ2Jfb3BlcmF0aW9uX2dldChvcGVyYXRpb24pOworCXJldCA9IGdiX29wZXJhdGlvbl9nZXRfYWN0aXZlKG9wZXJhdGlvbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcHV0OworCisJLyogRmlsbCBpbiB0aGUgcmVzcG9uc2UgaGVhZGVyIGFuZCBzZW5kIGl0ICovCisJb3BlcmF0aW9uLT5yZXNwb25zZS0+aGVhZGVyLT5yZXN1bHQgPSBnYl9vcGVyYXRpb25fZXJybm9fbWFwKGVycm5vKTsKKworCXJldCA9IGdiX21lc3NhZ2Vfc2VuZChvcGVyYXRpb24tPnJlc3BvbnNlLCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9wdXRfYWN0aXZlOworCisJcmV0dXJuIDA7CisKK2Vycl9wdXRfYWN0aXZlOgorCWdiX29wZXJhdGlvbl9wdXRfYWN0aXZlKG9wZXJhdGlvbik7CitlcnJfcHV0OgorCWdiX29wZXJhdGlvbl9wdXQob3BlcmF0aW9uKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgbWVzc2FnZSBzZW5kIHJlcXVlc3QgaGFzIGNvbXBsZXRlZC4KKyAqLwordm9pZCBncmV5YnVzX21lc3NhZ2Vfc2VudChzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLAorCQkJCQlzdHJ1Y3QgZ2JfbWVzc2FnZSAqbWVzc2FnZSwgaW50IHN0YXR1cykKK3sKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb24gPSBtZXNzYWdlLT5vcGVyYXRpb247CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBvcGVyYXRpb24tPmNvbm5lY3Rpb247CisKKwkvKgorCSAqIElmIHRoZSBtZXNzYWdlIHdhcyBhIHJlc3BvbnNlLCB3ZSBqdXN0IG5lZWQgdG8gZHJvcCBvdXIKKwkgKiByZWZlcmVuY2UgdG8gdGhlIG9wZXJhdGlvbi4gIElmIGFuIGVycm9yIG9jY3VycmVkLCByZXBvcnQKKwkgKiBpdC4KKwkgKgorCSAqIEZvciByZXF1ZXN0cywgaWYgdGhlcmUncyBubyBlcnJvciBhbmQgdGhlIG9wZXJhdGlvbiBpbiBub3QKKwkgKiB1bmlkaXJlY3Rpb25hbCwgdGhlcmUncyBub3RoaW5nIG1vcmUgdG8gZG8gdW50aWwgdGhlIHJlc3BvbnNlCisJICogYXJyaXZlcy4gSWYgYW4gZXJyb3Igb2NjdXJyZWQgYXR0ZW1wdGluZyB0byBzZW5kIGl0LCBvciBpZiB0aGUKKwkgKiBvcGVyYXRpb24gaXMgdW5pZHJlY3Rpb25hbCwgcmVjb3JkIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiBhbmQKKwkgKiBzY2hlZHVsZSBpdHMgY29tcGxldGlvbi4KKwkgKi8KKwlpZiAobWVzc2FnZSA9PSBvcGVyYXRpb24tPnJlc3BvbnNlKSB7CisJCWlmIChzdGF0dXMpIHsKKwkJCWRldl9lcnIoJmNvbm5lY3Rpb24tPmhkLT5kZXYsCisJCQkJIiVzOiBlcnJvciBzZW5kaW5nIHJlc3BvbnNlIDB4JTAyeDogJWRcbiIsCisJCQkJY29ubmVjdGlvbi0+bmFtZSwgb3BlcmF0aW9uLT50eXBlLCBzdGF0dXMpOworCQl9CisKKwkJZ2Jfb3BlcmF0aW9uX3B1dF9hY3RpdmUob3BlcmF0aW9uKTsKKwkJZ2Jfb3BlcmF0aW9uX3B1dChvcGVyYXRpb24pOworCX0gZWxzZSBpZiAoc3RhdHVzIHx8IGdiX29wZXJhdGlvbl9pc191bmlkaXJlY3Rpb25hbChvcGVyYXRpb24pKSB7CisJCWlmIChnYl9vcGVyYXRpb25fcmVzdWx0X3NldChvcGVyYXRpb24sIHN0YXR1cykpIHsKKwkJCXF1ZXVlX3dvcmsoZ2Jfb3BlcmF0aW9uX2NvbXBsZXRpb25fd3EsCisJCQkJCSZvcGVyYXRpb24tPndvcmspOworCQl9CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoZ3JleWJ1c19tZXNzYWdlX3NlbnQpOworCisvKgorICogV2UndmUgcmVjZWl2ZWQgZGF0YSBvbiBhIGNvbm5lY3Rpb24sIGFuZCBpdCBkb2Vzbid0IGxvb2sgbGlrZSBhCisgKiByZXNwb25zZSwgc28gd2UgYXNzdW1lIGl0J3MgYSByZXF1ZXN0LgorICoKKyAqIFRoaXMgaXMgY2FsbGVkIGluIGludGVycnVwdCBjb250ZXh0LCBzbyBqdXN0IGNvcHkgdGhlIGluY29taW5nCisgKiBkYXRhIGludG8gdGhlIHJlcXVlc3QgYnVmZmVyIGFuZCBoYW5kbGUgdGhlIHJlc3QgdmlhIHdvcmtxdWV1ZS4KKyAqLworc3RhdGljIHZvaWQgZ2JfY29ubmVjdGlvbl9yZWN2X3JlcXVlc3Qoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJY29uc3Qgc3RydWN0IGdiX29wZXJhdGlvbl9tc2dfaGRyICpoZWFkZXIsCisJCQkJdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uOworCXUxNiBvcGVyYXRpb25faWQ7CisJdTggdHlwZTsKKwlpbnQgcmV0OworCisJb3BlcmF0aW9uX2lkID0gbGUxNl90b19jcHUoaGVhZGVyLT5vcGVyYXRpb25faWQpOworCXR5cGUgPSBoZWFkZXItPnR5cGU7CisKKwlvcGVyYXRpb24gPSBnYl9vcGVyYXRpb25fY3JlYXRlX2luY29taW5nKGNvbm5lY3Rpb24sIG9wZXJhdGlvbl9pZCwKKwkJCQkJCXR5cGUsIGRhdGEsIHNpemUpOworCWlmICghb3BlcmF0aW9uKSB7CisJCWRldl9lcnIoJmNvbm5lY3Rpb24tPmhkLT5kZXYsCisJCQkiJXM6IGNhbid0IGNyZWF0ZSBpbmNvbWluZyBvcGVyYXRpb25cbiIsCisJCQljb25uZWN0aW9uLT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCXJldCA9IGdiX29wZXJhdGlvbl9nZXRfYWN0aXZlKG9wZXJhdGlvbik7CisJaWYgKHJldCkgeworCQlnYl9vcGVyYXRpb25fcHV0KG9wZXJhdGlvbik7CisJCXJldHVybjsKKwl9CisJdHJhY2VfZ2JfbWVzc2FnZV9yZWN2X3JlcXVlc3Qob3BlcmF0aW9uLT5yZXF1ZXN0KTsKKworCS8qCisJICogVGhlIGluaXRpYWwgcmVmZXJlbmNlIHRvIHRoZSBvcGVyYXRpb24gd2lsbCBiZSBkcm9wcGVkIHdoZW4gdGhlCisJICogcmVxdWVzdCBoYW5kbGVyIHJldHVybnMuCisJICovCisJaWYgKGdiX29wZXJhdGlvbl9yZXN1bHRfc2V0KG9wZXJhdGlvbiwgLUVJTlBST0dSRVNTKSkKKwkJcXVldWVfd29yayhjb25uZWN0aW9uLT53cSwgJm9wZXJhdGlvbi0+d29yayk7Cit9CisKKy8qCisgKiBXZSd2ZSByZWNlaXZlZCBkYXRhIHRoYXQgYXBwZWFycyB0byBiZSBhbiBvcGVyYXRpb24gcmVzcG9uc2UKKyAqIG1lc3NhZ2UuICBMb29rIHVwIHRoZSBvcGVyYXRpb24sIGFuZCByZWNvcmQgdGhhdCB3ZSd2ZSByZWNlaXZlZAorICogaXRzIHJlc3BvbnNlLgorICoKKyAqIFRoaXMgaXMgY2FsbGVkIGluIGludGVycnVwdCBjb250ZXh0LCBzbyBqdXN0IGNvcHkgdGhlIGluY29taW5nCisgKiBkYXRhIGludG8gdGhlIHJlc3BvbnNlIGJ1ZmZlciBhbmQgaGFuZGxlIHRoZSByZXN0IHZpYSB3b3JrcXVldWUuCisgKi8KK3N0YXRpYyB2b2lkIGdiX2Nvbm5lY3Rpb25fcmVjdl9yZXNwb25zZShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQljb25zdCBzdHJ1Y3QgZ2Jfb3BlcmF0aW9uX21zZ19oZHIgKmhlYWRlciwKKwkJCQl2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb247CisJc3RydWN0IGdiX21lc3NhZ2UgKm1lc3NhZ2U7CisJc2l6ZV90IG1lc3NhZ2Vfc2l6ZTsKKwl1MTYgb3BlcmF0aW9uX2lkOworCWludCBlcnJubzsKKworCW9wZXJhdGlvbl9pZCA9IGxlMTZfdG9fY3B1KGhlYWRlci0+b3BlcmF0aW9uX2lkKTsKKworCWlmICghb3BlcmF0aW9uX2lkKSB7CisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoJmNvbm5lY3Rpb24tPmhkLT5kZXYsCisJCQkJIiVzOiBpbnZhbGlkIHJlc3BvbnNlIGlkIDAgcmVjZWl2ZWRcbiIsCisJCQkJY29ubmVjdGlvbi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwlvcGVyYXRpb24gPSBnYl9vcGVyYXRpb25fZmluZF9vdXRnb2luZyhjb25uZWN0aW9uLCBvcGVyYXRpb25faWQpOworCWlmICghb3BlcmF0aW9uKSB7CisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoJmNvbm5lY3Rpb24tPmhkLT5kZXYsCisJCQkJIiVzOiB1bmV4cGVjdGVkIHJlc3BvbnNlIGlkIDB4JTA0eCByZWNlaXZlZFxuIiwKKwkJCQljb25uZWN0aW9uLT5uYW1lLCBvcGVyYXRpb25faWQpOworCQlyZXR1cm47CisJfQorCisJZXJybm8gPSBnYl9vcGVyYXRpb25fc3RhdHVzX21hcChoZWFkZXItPnJlc3VsdCk7CisJbWVzc2FnZSA9IG9wZXJhdGlvbi0+cmVzcG9uc2U7CisJbWVzc2FnZV9zaXplID0gc2l6ZW9mKCpoZWFkZXIpICsgbWVzc2FnZS0+cGF5bG9hZF9zaXplOworCWlmICghZXJybm8gJiYgc2l6ZSA+IG1lc3NhZ2Vfc2l6ZSkgeworCQlkZXZfZXJyX3JhdGVsaW1pdGVkKCZjb25uZWN0aW9uLT5oZC0+ZGV2LAorCQkJCSIlczogbWFsZm9ybWVkIHJlc3BvbnNlIDB4JTAyeCByZWNlaXZlZCAoJXp1ID4gJXp1KVxuIiwKKwkJCQljb25uZWN0aW9uLT5uYW1lLCBoZWFkZXItPnR5cGUsCisJCQkJc2l6ZSwgbWVzc2FnZV9zaXplKTsKKwkJZXJybm8gPSAtRU1TR1NJWkU7CisJfSBlbHNlIGlmICghZXJybm8gJiYgc2l6ZSA8IG1lc3NhZ2Vfc2l6ZSkgeworCQlpZiAoZ2Jfb3BlcmF0aW9uX3Nob3J0X3Jlc3BvbnNlX2FsbG93ZWQob3BlcmF0aW9uKSkgeworCQkJbWVzc2FnZS0+cGF5bG9hZF9zaXplID0gc2l6ZSAtIHNpemVvZigqaGVhZGVyKTsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoJmNvbm5lY3Rpb24tPmhkLT5kZXYsCisJCQkJCSIlczogc2hvcnQgcmVzcG9uc2UgMHglMDJ4IHJlY2VpdmVkICglenUgPCAlenUpXG4iLAorCQkJCQljb25uZWN0aW9uLT5uYW1lLCBoZWFkZXItPnR5cGUsCisJCQkJCXNpemUsIG1lc3NhZ2Vfc2l6ZSk7CisJCQllcnJubyA9IC1FTVNHU0laRTsKKwkJfQorCX0KKworCS8qIFdlIG11c3QgaWdub3JlIHRoZSBwYXlsb2FkIGlmIGEgYmFkIHN0YXR1cyBpcyByZXR1cm5lZCAqLworCWlmIChlcnJubykKKwkJc2l6ZSA9IHNpemVvZigqaGVhZGVyKTsKKworCS8qIFRoZSByZXN0IHdpbGwgYmUgaGFuZGxlZCBpbiB3b3JrIHF1ZXVlIGNvbnRleHQgKi8KKwlpZiAoZ2Jfb3BlcmF0aW9uX3Jlc3VsdF9zZXQob3BlcmF0aW9uLCBlcnJubykpIHsKKwkJbWVtY3B5KG1lc3NhZ2UtPmJ1ZmZlciwgZGF0YSwgc2l6ZSk7CisKKwkJdHJhY2VfZ2JfbWVzc2FnZV9yZWN2X3Jlc3BvbnNlKG1lc3NhZ2UpOworCisJCXF1ZXVlX3dvcmsoZ2Jfb3BlcmF0aW9uX2NvbXBsZXRpb25fd3EsICZvcGVyYXRpb24tPndvcmspOworCX0KKworCWdiX29wZXJhdGlvbl9wdXQob3BlcmF0aW9uKTsKK30KKworLyoKKyAqIEhhbmRsZSBkYXRhIGFycml2aW5nIG9uIGEgY29ubmVjdGlvbi4gIEFzIHNvb24gYXMgd2UgcmV0dXJuIHRoZQorICogc3VwcGxpZWQgZGF0YSBidWZmZXIgd2lsbCBiZSByZXVzZWQgKHNvIHVubGVzcyB3ZSBkbyBzb21ldGhpbmcKKyAqIHdpdGgsIGl0J3MgZWZmZWN0aXZlbHkgZHJvcHBlZCkuCisgKi8KK3ZvaWQgZ2JfY29ubmVjdGlvbl9yZWN2KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCXZvaWQgKmRhdGEsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBnYl9vcGVyYXRpb25fbXNnX2hkciBoZWFkZXI7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmNvbm5lY3Rpb24tPmhkLT5kZXY7CisJc2l6ZV90IG1zZ19zaXplOworCisJaWYgKGNvbm5lY3Rpb24tPnN0YXRlID09IEdCX0NPTk5FQ1RJT05fU1RBVEVfRElTQUJMRUQgfHwKKwkJCWdiX2Nvbm5lY3Rpb25faXNfb2ZmbG9hZGVkKGNvbm5lY3Rpb24pKSB7CisJCWRldl93YXJuX3JhdGVsaW1pdGVkKGRldiwgIiVzOiBkcm9wcGluZyAlenUgcmVjZWl2ZWQgYnl0ZXNcbiIsCisJCQkJY29ubmVjdGlvbi0+bmFtZSwgc2l6ZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc2l6ZSA8IHNpemVvZihoZWFkZXIpKSB7CisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoZGV2LCAiJXM6IHNob3J0IG1lc3NhZ2UgcmVjZWl2ZWRcbiIsCisJCQkJY29ubmVjdGlvbi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBVc2UgbWVtY3B5IGFzIGRhdGEgbWF5IGJlIHVuYWxpZ25lZCAqLworCW1lbWNweSgmaGVhZGVyLCBkYXRhLCBzaXplb2YoaGVhZGVyKSk7CisJbXNnX3NpemUgPSBsZTE2X3RvX2NwdShoZWFkZXIuc2l6ZSk7CisJaWYgKHNpemUgPCBtc2dfc2l6ZSkgeworCQlkZXZfZXJyX3JhdGVsaW1pdGVkKGRldiwKKwkJCQkiJXM6IGluY29tcGxldGUgbWVzc2FnZSAweCUwNHggb2YgdHlwZSAweCUwMnggcmVjZWl2ZWQgKCV6dSA8ICV6dSlcbiIsCisJCQkJY29ubmVjdGlvbi0+bmFtZSwKKwkJCQlsZTE2X3RvX2NwdShoZWFkZXIub3BlcmF0aW9uX2lkKSwKKwkJCQloZWFkZXIudHlwZSwgc2l6ZSwgbXNnX3NpemUpOworCQlyZXR1cm47CQkvKiBYWFggU2hvdWxkIHN0aWxsIGNvbXBsZXRlIG9wZXJhdGlvbiAqLworCX0KKworCWlmIChoZWFkZXIudHlwZSAmIEdCX01FU1NBR0VfVFlQRV9SRVNQT05TRSkgeworCQlnYl9jb25uZWN0aW9uX3JlY3ZfcmVzcG9uc2UoY29ubmVjdGlvbiwJJmhlYWRlciwgZGF0YSwKKwkJCQkJCW1zZ19zaXplKTsKKwl9IGVsc2UgeworCQlnYl9jb25uZWN0aW9uX3JlY3ZfcmVxdWVzdChjb25uZWN0aW9uLCAmaGVhZGVyLCBkYXRhLAorCQkJCQkJbXNnX3NpemUpOworCX0KK30KKworLyoKKyAqIENhbmNlbCBhbiBvdXRnb2luZyBvcGVyYXRpb24gc3luY2hyb25vdXNseSwgYW5kIHJlY29yZCB0aGUgZ2l2ZW4gZXJyb3IgdG8KKyAqIGluZGljYXRlIHdoeS4KKyAqLwordm9pZCBnYl9vcGVyYXRpb25fY2FuY2VsKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbiwgaW50IGVycm5vKQoreworCWlmIChXQVJOX09OKGdiX29wZXJhdGlvbl9pc19pbmNvbWluZyhvcGVyYXRpb24pKSkKKwkJcmV0dXJuOworCisJaWYgKGdiX29wZXJhdGlvbl9yZXN1bHRfc2V0KG9wZXJhdGlvbiwgZXJybm8pKSB7CisJCWdiX21lc3NhZ2VfY2FuY2VsKG9wZXJhdGlvbi0+cmVxdWVzdCk7CisJCXF1ZXVlX3dvcmsoZ2Jfb3BlcmF0aW9uX2NvbXBsZXRpb25fd3EsICZvcGVyYXRpb24tPndvcmspOworCX0KKwl0cmFjZV9nYl9tZXNzYWdlX2NhbmNlbF9vdXRnb2luZyhvcGVyYXRpb24tPnJlcXVlc3QpOworCisJYXRvbWljX2luYygmb3BlcmF0aW9uLT53YWl0ZXJzKTsKKwl3YWl0X2V2ZW50KGdiX29wZXJhdGlvbl9jYW5jZWxsYXRpb25fcXVldWUsCisJCQkhZ2Jfb3BlcmF0aW9uX2lzX2FjdGl2ZShvcGVyYXRpb24pKTsKKwlhdG9taWNfZGVjKCZvcGVyYXRpb24tPndhaXRlcnMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2Jfb3BlcmF0aW9uX2NhbmNlbCk7CisKKy8qCisgKiBDYW5jZWwgYW4gaW5jb21pbmcgb3BlcmF0aW9uIHN5bmNocm9ub3VzbHkuIENhbGxlZCBkdXJpbmcgY29ubmVjdGlvbiB0ZWFyCisgKiBkb3duLgorICovCit2b2lkIGdiX29wZXJhdGlvbl9jYW5jZWxfaW5jb21pbmcoc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uLCBpbnQgZXJybm8pCit7CisJaWYgKFdBUk5fT04oIWdiX29wZXJhdGlvbl9pc19pbmNvbWluZyhvcGVyYXRpb24pKSkKKwkJcmV0dXJuOworCisJaWYgKCFnYl9vcGVyYXRpb25faXNfdW5pZGlyZWN0aW9uYWwob3BlcmF0aW9uKSkgeworCQkvKgorCQkgKiBNYWtlIHN1cmUgdGhlIHJlcXVlc3QgaGFuZGxlciBoYXMgc3VibWl0dGVkIHRoZSByZXNwb25zZQorCQkgKiBiZWZvcmUgY2FuY2VsbGluZyBpdC4KKwkJICovCisJCWZsdXNoX3dvcmsoJm9wZXJhdGlvbi0+d29yayk7CisJCWlmICghZ2Jfb3BlcmF0aW9uX3Jlc3VsdF9zZXQob3BlcmF0aW9uLCBlcnJubykpCisJCQlnYl9tZXNzYWdlX2NhbmNlbChvcGVyYXRpb24tPnJlc3BvbnNlKTsKKwl9CisJdHJhY2VfZ2JfbWVzc2FnZV9jYW5jZWxfaW5jb21pbmcob3BlcmF0aW9uLT5yZXNwb25zZSk7CisKKwlhdG9taWNfaW5jKCZvcGVyYXRpb24tPndhaXRlcnMpOworCXdhaXRfZXZlbnQoZ2Jfb3BlcmF0aW9uX2NhbmNlbGxhdGlvbl9xdWV1ZSwKKwkJCSFnYl9vcGVyYXRpb25faXNfYWN0aXZlKG9wZXJhdGlvbikpOworCWF0b21pY19kZWMoJm9wZXJhdGlvbi0+d2FpdGVycyk7Cit9CisKKy8qKgorICogZ2Jfb3BlcmF0aW9uX3N5bmNfdGltZW91dCgpIC0gaW1wbGVtZW50IGEgInNpbXBsZSIgc3luY2hyb25vdXMgb3BlcmF0aW9uCisgKiBAY29ubmVjdGlvbjogdGhlIEdyZXlidXMgY29ubmVjdGlvbiB0byBzZW5kIHRoaXMgdG8KKyAqIEB0eXBlOiB0aGUgdHlwZSBvZiBvcGVyYXRpb24gdG8gc2VuZAorICogQHJlcXVlc3Q6IHBvaW50ZXIgdG8gYSBtZW1vcnkgYnVmZmVyIHRvIGNvcHkgdGhlIHJlcXVlc3QgZnJvbQorICogQHJlcXVlc3Rfc2l6ZTogc2l6ZSBvZiBAcmVxdWVzdAorICogQHJlc3BvbnNlOiBwb2ludGVyIHRvIGEgbWVtb3J5IGJ1ZmZlciB0byBjb3B5IHRoZSByZXNwb25zZSB0bworICogQHJlc3BvbnNlX3NpemU6IHRoZSBzaXplIG9mIEByZXNwb25zZS4KKyAqIEB0aW1lb3V0OiBvcGVyYXRpb24gdGltZW91dCBpbiBtaWxsaXNlY29uZHMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgYSBzaW1wbGUgc3luY2hyb25vdXMgR3JleWJ1cyBvcGVyYXRpb24uICBJdCBzZW5kcworICogdGhlIHByb3ZpZGVkIG9wZXJhdGlvbiByZXF1ZXN0IGFuZCB3YWl0cyAoc2xlZXBzKSB1bnRpbCB0aGUgY29ycmVzcG9uZGluZworICogb3BlcmF0aW9uIHJlc3BvbnNlIG1lc3NhZ2UgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlY2VpdmVkLCBvciBhbiBlcnJvcgorICogb2NjdXJzLiAgQHJlcXVlc3QgYW5kIEByZXNwb25zZSBhcmUgYnVmZmVycyB0byBob2xkIHRoZSByZXF1ZXN0IGFuZCByZXNwb25zZQorICogZGF0YSByZXNwZWN0aXZlbHksIGFuZCBpZiB0aGV5IGFyZSBub3QgTlVMTCwgdGhlaXIgc2l6ZSBtdXN0IGJlIHNwZWNpZmllZCBpbgorICogQHJlcXVlc3Rfc2l6ZSBhbmQgQHJlc3BvbnNlX3NpemUuCisgKgorICogSWYgYSByZXNwb25zZSBwYXlsb2FkIGlzIHRvIGNvbWUgYmFjaywgYW5kIEByZXNwb25zZSBpcyBub3QgTlVMTCwKKyAqIEByZXNwb25zZV9zaXplIG51bWJlciBvZiBieXRlcyB3aWxsIGJlIGNvcGllZCBpbnRvIEByZXNwb25zZSBpZiB0aGUgb3BlcmF0aW9uCisgKiBpcyBzdWNjZXNzZnVsLgorICoKKyAqIElmIHRoZXJlIGlzIGFuIGVycm9yLCB0aGUgcmVzcG9uc2UgYnVmZmVyIGlzIGxlZnQgYWxvbmUuCisgKi8KK2ludCBnYl9vcGVyYXRpb25fc3luY190aW1lb3V0KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBpbnQgdHlwZSwKKwkJCQl2b2lkICpyZXF1ZXN0LCBpbnQgcmVxdWVzdF9zaXplLAorCQkJCXZvaWQgKnJlc3BvbnNlLCBpbnQgcmVzcG9uc2Vfc2l6ZSwKKwkJCQl1bnNpZ25lZCBpbnQgdGltZW91dCkKK3sKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb247CisJaW50IHJldDsKKworCWlmICgocmVzcG9uc2Vfc2l6ZSAmJiAhcmVzcG9uc2UpIHx8CisJICAgIChyZXF1ZXN0X3NpemUgJiYgIXJlcXVlc3QpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9wZXJhdGlvbiA9IGdiX29wZXJhdGlvbl9jcmVhdGUoY29ubmVjdGlvbiwgdHlwZSwKKwkJCQkJcmVxdWVzdF9zaXplLCByZXNwb25zZV9zaXplLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIW9wZXJhdGlvbikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAocmVxdWVzdF9zaXplKQorCQltZW1jcHkob3BlcmF0aW9uLT5yZXF1ZXN0LT5wYXlsb2FkLCByZXF1ZXN0LCByZXF1ZXN0X3NpemUpOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3JlcXVlc3Rfc2VuZF9zeW5jX3RpbWVvdXQob3BlcmF0aW9uLCB0aW1lb3V0KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmNvbm5lY3Rpb24tPmhkLT5kZXYsCisJCQkiJXM6IHN5bmNocm9ub3VzIG9wZXJhdGlvbiBpZCAweCUwNHggb2YgdHlwZSAweCUwMnggZmFpbGVkOiAlZFxuIiwKKwkJCWNvbm5lY3Rpb24tPm5hbWUsIG9wZXJhdGlvbi0+aWQsIHR5cGUsIHJldCk7CisJfSBlbHNlIHsKKwkJaWYgKHJlc3BvbnNlX3NpemUpIHsKKwkJCW1lbWNweShyZXNwb25zZSwgb3BlcmF0aW9uLT5yZXNwb25zZS0+cGF5bG9hZCwKKwkJCSAgICAgICByZXNwb25zZV9zaXplKTsKKwkJfQorCX0KKworCWdiX29wZXJhdGlvbl9wdXQob3BlcmF0aW9uKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9vcGVyYXRpb25fc3luY190aW1lb3V0KTsKKworLyoqCisgKiBnYl9vcGVyYXRpb25fdW5pZGlyZWN0aW9uYWxfdGltZW91dCgpIC0gaW5pdGlhdGUgYSB1bmlkaXJlY3Rpb25hbCBvcGVyYXRpb24KKyAqIEBjb25uZWN0aW9uOgkJY29ubmVjdGlvbiB0byB1c2UKKyAqIEB0eXBlOgkJdHlwZSBvZiBvcGVyYXRpb24gdG8gc2VuZAorICogQHJlcXVlc3Q6CQltZW1vcnkgYnVmZmVyIHRvIGNvcHkgdGhlIHJlcXVlc3QgZnJvbQorICogQHJlcXVlc3Rfc2l6ZToJc2l6ZSBvZiBAcmVxdWVzdAorICogQHRpbWVvdXQ6CQlzZW5kIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzCisgKgorICogSW5pdGlhdGUgYSB1bmlkaXJlY3Rpb25hbCBvcGVyYXRpb24gYnkgc2VuZGluZyBhIHJlcXVlc3QgbWVzc2FnZSBhbmQKKyAqIHdhaXRpbmcgZm9yIGl0IHRvIGJlIGFja25vd2xlZGdlZCBhcyBzZW50IGJ5IHRoZSBob3N0IGRldmljZS4KKyAqCisgKiBOb3RlIHRoYXQgc3VjY2Vzc2Z1bCBzZW5kIG9mIGEgdW5pZGlyZWN0aW9uYWwgb3BlcmF0aW9uIGRvZXMgbm90IGltcGx5IHRoYXQKKyAqIHRoZSByZXF1ZXN0IGFzIGFjdHVhbGx5IHJlYWNoZWQgdGhlIHJlbW90ZSBlbmQgb2YgdGhlIGNvbm5lY3Rpb24uCisgKi8KK2ludCBnYl9vcGVyYXRpb25fdW5pZGlyZWN0aW9uYWxfdGltZW91dChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQlpbnQgdHlwZSwgdm9pZCAqcmVxdWVzdCwgaW50IHJlcXVlc3Rfc2l6ZSwKKwkJCQl1bnNpZ25lZCBpbnQgdGltZW91dCkKK3sKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb247CisJaW50IHJldDsKKworCWlmIChyZXF1ZXN0X3NpemUgJiYgIXJlcXVlc3QpCisJCXJldHVybiAtRUlOVkFMOworCisJb3BlcmF0aW9uID0gZ2Jfb3BlcmF0aW9uX2NyZWF0ZV9mbGFncyhjb25uZWN0aW9uLCB0eXBlLAorCQkJCQlyZXF1ZXN0X3NpemUsIDAsCisJCQkJCUdCX09QRVJBVElPTl9GTEFHX1VOSURJUkVDVElPTkFMLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIW9wZXJhdGlvbikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAocmVxdWVzdF9zaXplKQorCQltZW1jcHkob3BlcmF0aW9uLT5yZXF1ZXN0LT5wYXlsb2FkLCByZXF1ZXN0LCByZXF1ZXN0X3NpemUpOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3JlcXVlc3Rfc2VuZF9zeW5jX3RpbWVvdXQob3BlcmF0aW9uLCB0aW1lb3V0KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmNvbm5lY3Rpb24tPmhkLT5kZXYsCisJCQkiJXM6IHVuaWRpcmVjdGlvbmFsIG9wZXJhdGlvbiBvZiB0eXBlIDB4JTAyeCBmYWlsZWQ6ICVkXG4iLAorCQkJY29ubmVjdGlvbi0+bmFtZSwgdHlwZSwgcmV0KTsKKwl9CisKKwlnYl9vcGVyYXRpb25fcHV0KG9wZXJhdGlvbik7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2Jfb3BlcmF0aW9uX3VuaWRpcmVjdGlvbmFsX3RpbWVvdXQpOworCitpbnQgX19pbml0IGdiX29wZXJhdGlvbl9pbml0KHZvaWQpCit7CisJZ2JfbWVzc2FnZV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJnYl9tZXNzYWdlX2NhY2hlIiwKKwkJCQlzaXplb2Yoc3RydWN0IGdiX21lc3NhZ2UpLCAwLCAwLCBOVUxMKTsKKwlpZiAoIWdiX21lc3NhZ2VfY2FjaGUpCisJCXJldHVybiAtRU5PTUVNOworCisJZ2Jfb3BlcmF0aW9uX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImdiX29wZXJhdGlvbl9jYWNoZSIsCisJCQkJc2l6ZW9mKHN0cnVjdCBnYl9vcGVyYXRpb24pLCAwLCAwLCBOVUxMKTsKKwlpZiAoIWdiX29wZXJhdGlvbl9jYWNoZSkKKwkJZ290byBlcnJfZGVzdHJveV9tZXNzYWdlX2NhY2hlOworCisJZ2Jfb3BlcmF0aW9uX2NvbXBsZXRpb25fd3EgPSBhbGxvY193b3JrcXVldWUoImdyZXlidXNfY29tcGxldGlvbiIsCisJCQkJMCwgMCk7CisJaWYgKCFnYl9vcGVyYXRpb25fY29tcGxldGlvbl93cSkKKwkJZ290byBlcnJfZGVzdHJveV9vcGVyYXRpb25fY2FjaGU7CisKKwlyZXR1cm4gMDsKKworZXJyX2Rlc3Ryb3lfb3BlcmF0aW9uX2NhY2hlOgorCWttZW1fY2FjaGVfZGVzdHJveShnYl9vcGVyYXRpb25fY2FjaGUpOworCWdiX29wZXJhdGlvbl9jYWNoZSA9IE5VTEw7CitlcnJfZGVzdHJveV9tZXNzYWdlX2NhY2hlOgorCWttZW1fY2FjaGVfZGVzdHJveShnYl9tZXNzYWdlX2NhY2hlKTsKKwlnYl9tZXNzYWdlX2NhY2hlID0gTlVMTDsKKworCXJldHVybiAtRU5PTUVNOworfQorCit2b2lkIGdiX29wZXJhdGlvbl9leGl0KHZvaWQpCit7CisJZGVzdHJveV93b3JrcXVldWUoZ2Jfb3BlcmF0aW9uX2NvbXBsZXRpb25fd3EpOworCWdiX29wZXJhdGlvbl9jb21wbGV0aW9uX3dxID0gTlVMTDsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koZ2Jfb3BlcmF0aW9uX2NhY2hlKTsKKwlnYl9vcGVyYXRpb25fY2FjaGUgPSBOVUxMOworCWttZW1fY2FjaGVfZGVzdHJveShnYl9tZXNzYWdlX2NhY2hlKTsKKwlnYl9tZXNzYWdlX2NhY2hlID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL29wZXJhdGlvbi5oIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvb3BlcmF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUwOWEyYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL29wZXJhdGlvbi5oCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogR3JleWJ1cyBvcGVyYXRpb25zCisgKgorICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE0IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2lmbmRlZiBfX09QRVJBVElPTl9ICisjZGVmaW5lIF9fT1BFUkFUSU9OX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKworc3RydWN0IGdiX29wZXJhdGlvbjsKKworLyogVGhlIGRlZmF1bHQgYW1vdW50IG9mIHRpbWUgYSByZXF1ZXN0IGlzIGdpdmVuIHRvIGNvbXBsZXRlICovCisjZGVmaW5lIEdCX09QRVJBVElPTl9USU1FT1VUX0RFRkFVTFQJMTAwMAkvKiBtaWxsaXNlY29uZHMgKi8KKworLyoKKyAqIFRoZSB0b3AgYml0IG9mIHRoZSB0eXBlIGluIGFuIG9wZXJhdGlvbiBtZXNzYWdlIGhlYWRlciBpbmRpY2F0ZXMKKyAqIHdoZXRoZXIgdGhlIG1lc3NhZ2UgaXMgYSByZXF1ZXN0IChiaXQgY2xlYXIpIG9yIHJlc3BvbnNlIChiaXQgc2V0KQorICovCisjZGVmaW5lIEdCX01FU1NBR0VfVFlQRV9SRVNQT05TRQkoKHU4KTB4ODApCisKK2VudW0gZ2Jfb3BlcmF0aW9uX3Jlc3VsdCB7CisJR0JfT1BfU1VDQ0VTUwkJPSAweDAwLAorCUdCX09QX0lOVEVSUlVQVEVECT0gMHgwMSwKKwlHQl9PUF9USU1FT1VUCQk9IDB4MDIsCisJR0JfT1BfTk9fTUVNT1JZCQk9IDB4MDMsCisJR0JfT1BfUFJPVE9DT0xfQkFECT0gMHgwNCwKKwlHQl9PUF9PVkVSRkxPVwkJPSAweDA1LAorCUdCX09QX0lOVkFMSUQJCT0gMHgwNiwKKwlHQl9PUF9SRVRSWQkJPSAweDA3LAorCUdCX09QX05PTkVYSVNURU5UCT0gMHgwOCwKKwlHQl9PUF9VTktOT1dOX0VSUk9SCT0gMHhmZSwKKwlHQl9PUF9NQUxGVU5DVElPTgk9IDB4ZmYsCit9OworCisjZGVmaW5lIEdCX09QRVJBVElPTl9NRVNTQUdFX1NJWkVfTUlOCXNpemVvZihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uX21zZ19oZHIpCisjZGVmaW5lIEdCX09QRVJBVElPTl9NRVNTQUdFX1NJWkVfTUFYCVUxNl9NQVgKKworLyoKKyAqIFByb3RvY29sIGNvZGUgc2hvdWxkIG9ubHkgZXhhbWluZSB0aGUgcGF5bG9hZCBhbmQgcGF5bG9hZF9zaXplIGZpZWxkcywgYW5kCisgKiBob3N0LWNvbnRyb2xsZXIgZHJpdmVycyBtYXkgdXNlIHRoZSBoY3ByaXYgZmllbGQuIEFsbCBvdGhlciBmaWVsZHMgYXJlCisgKiBpbnRlbmRlZCB0byBiZSBwcml2YXRlIHRvIHRoZSBvcGVyYXRpb25zIGNvcmUgY29kZS4KKyAqLworc3RydWN0IGdiX21lc3NhZ2UgeworCXN0cnVjdCBnYl9vcGVyYXRpb24JCSpvcGVyYXRpb247CisJc3RydWN0IGdiX29wZXJhdGlvbl9tc2dfaGRyCSpoZWFkZXI7CisKKwl2b2lkCQkJCSpwYXlsb2FkOworCXNpemVfdAkJCQlwYXlsb2FkX3NpemU7CisKKwl2b2lkCQkJCSpidWZmZXI7CisKKwl2b2lkCQkJCSpoY3ByaXY7Cit9OworCisjZGVmaW5lIEdCX09QRVJBVElPTl9GTEFHX0lOQ09NSU5HCQlCSVQoMCkKKyNkZWZpbmUgR0JfT1BFUkFUSU9OX0ZMQUdfVU5JRElSRUNUSU9OQUwJQklUKDEpCisjZGVmaW5lIEdCX09QRVJBVElPTl9GTEFHX1NIT1JUX1JFU1BPTlNFCUJJVCgyKQorI2RlZmluZSBHQl9PUEVSQVRJT05fRkxBR19DT1JFCQkJQklUKDMpCisKKyNkZWZpbmUgR0JfT1BFUkFUSU9OX0ZMQUdfVVNFUl9NQVNLCShHQl9PUEVSQVRJT05fRkxBR19TSE9SVF9SRVNQT05TRSB8IFwKKwkJCQkJIEdCX09QRVJBVElPTl9GTEFHX1VOSURJUkVDVElPTkFMKQorCisvKgorICogQSBHcmV5YnVzIG9wZXJhdGlvbiBpcyBhIHJlbW90ZSBwcm9jZWR1cmUgY2FsbCBwZXJmb3JtZWQgb3ZlciBhCisgKiBjb25uZWN0aW9uIGJldHdlZW4gdHdvIFVuaVBybyBpbnRlcmZhY2VzLgorICoKKyAqIEV2ZXJ5IG9wZXJhdGlvbiBjb25zaXN0cyBvZiBhIHJlcXVlc3QgbWVzc2FnZSBzZW50IHRvIHRoZSBvdGhlcgorICogZW5kIG9mIHRoZSBjb25uZWN0aW9uIGNvdXBsZWQgd2l0aCBhIHJlcGx5IG1lc3NhZ2UgcmV0dXJuZWQgdG8KKyAqIHRoZSBzZW5kZXIuICBFdmVyeSBvcGVyYXRpb24gaGFzIGEgdHlwZSwgd2hvc2UgaW50ZXJwcmV0YXRpb24gaXMKKyAqIGRlcGVuZGVudCBvbiB0aGUgcHJvdG9jb2wgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb25uZWN0aW9uLgorICoKKyAqIE9ubHkgZm91ciB0aGluZ3MgaW4gYW4gb3BlcmF0aW9uIHN0cnVjdHVyZSBhcmUgaW50ZW5kZWQgdG8gYmUKKyAqIGRpcmVjdGx5IHVzYWJsZSBieSBwcm90b2NvbCBoYW5kbGVyczogIHRoZSBvcGVyYXRpb24ncyBjb25uZWN0aW9uCisgKiBwb2ludGVyOyB0aGUgb3BlcmF0aW9uIHR5cGU7IHRoZSByZXF1ZXN0IG1lc3NhZ2UgcGF5bG9hZCAoYW5kCisgKiBzaXplKTsgYW5kIHRoZSByZXNwb25zZSBtZXNzYWdlIHBheWxvYWQgKGFuZCBzaXplKS4gIE5vdGUgdGhhdCBhCisgKiBtZXNzYWdlIHdpdGggYSAwLWJ5dGUgcGF5bG9hZCBoYXMgYSBudWxsIG1lc3NhZ2UgcGF5bG9hZCBwb2ludGVyLgorICoKKyAqIEluIGFkZGl0aW9uLCBldmVyeSBvcGVyYXRpb24gaGFzIGEgcmVzdWx0LCB3aGljaCBpcyBhbiBlcnJubworICogdmFsdWUuICBQcm90b2NvbCBoYW5kbGVycyBhY2Nlc3MgdGhlIG9wZXJhdGlvbiByZXN1bHQgdXNpbmcKKyAqIGdiX29wZXJhdGlvbl9yZXN1bHQoKS4KKyAqLwordHlwZWRlZiB2b2lkICgqZ2Jfb3BlcmF0aW9uX2NhbGxiYWNrKShzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICopOworc3RydWN0IGdiX29wZXJhdGlvbiB7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24JKmNvbm5lY3Rpb247CisJc3RydWN0IGdiX21lc3NhZ2UJKnJlcXVlc3Q7CisJc3RydWN0IGdiX21lc3NhZ2UJKnJlc3BvbnNlOworCisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJdTgJCQl0eXBlOworCXUxNgkJCWlkOworCWludAkJCWVycm5vOwkJLyogT3BlcmF0aW9uIHJlc3VsdCAqLworCisJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CisJZ2Jfb3BlcmF0aW9uX2NhbGxiYWNrCWNhbGxiYWNrOworCXN0cnVjdCBjb21wbGV0aW9uCWNvbXBsZXRpb247CisKKwlzdHJ1Y3Qga3JlZgkJa3JlZjsKKwlhdG9taWNfdAkJd2FpdGVyczsKKworCWludAkJCWFjdGl2ZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpbmtzOwkJLyogY29ubmVjdGlvbi0+b3BlcmF0aW9ucyAqLworfTsKKworc3RhdGljIGlubGluZSBib29sCitnYl9vcGVyYXRpb25faXNfaW5jb21pbmcoc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uKQoreworCXJldHVybiBvcGVyYXRpb24tPmZsYWdzICYgR0JfT1BFUkFUSU9OX0ZMQUdfSU5DT01JTkc7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAorZ2Jfb3BlcmF0aW9uX2lzX3VuaWRpcmVjdGlvbmFsKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbikKK3sKKwlyZXR1cm4gb3BlcmF0aW9uLT5mbGFncyAmIEdCX09QRVJBVElPTl9GTEFHX1VOSURJUkVDVElPTkFMOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK2diX29wZXJhdGlvbl9zaG9ydF9yZXNwb25zZV9hbGxvd2VkKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbikKK3sKKwlyZXR1cm4gb3BlcmF0aW9uLT5mbGFncyAmIEdCX09QRVJBVElPTl9GTEFHX1NIT1JUX1JFU1BPTlNFOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgZ2Jfb3BlcmF0aW9uX2lzX2NvcmUoc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uKQoreworCXJldHVybiBvcGVyYXRpb24tPmZsYWdzICYgR0JfT1BFUkFUSU9OX0ZMQUdfQ09SRTsKK30KKwordm9pZCBnYl9jb25uZWN0aW9uX3JlY3Yoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCXZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworaW50IGdiX29wZXJhdGlvbl9yZXN1bHQoc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uKTsKKworc2l6ZV90IGdiX29wZXJhdGlvbl9nZXRfcGF5bG9hZF9zaXplX21heChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICoKK2diX29wZXJhdGlvbl9jcmVhdGVfZmxhZ3Moc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJdTggdHlwZSwgc2l6ZV90IHJlcXVlc3Rfc2l6ZSwKKwkJCQlzaXplX3QgcmVzcG9uc2Vfc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncywKKwkJCQlnZnBfdCBnZnApOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBnYl9vcGVyYXRpb24gKgorZ2Jfb3BlcmF0aW9uX2NyZWF0ZShzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQl1OCB0eXBlLCBzaXplX3QgcmVxdWVzdF9zaXplLAorCQkJCXNpemVfdCByZXNwb25zZV9zaXplLCBnZnBfdCBnZnApCit7CisJcmV0dXJuIGdiX29wZXJhdGlvbl9jcmVhdGVfZmxhZ3MoY29ubmVjdGlvbiwgdHlwZSwgcmVxdWVzdF9zaXplLAorCQkJCQkJcmVzcG9uc2Vfc2l6ZSwgMCwgZ2ZwKTsKK30KKworc3RydWN0IGdiX29wZXJhdGlvbiAqCitnYl9vcGVyYXRpb25fY3JlYXRlX2NvcmUoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJdTggdHlwZSwgc2l6ZV90IHJlcXVlc3Rfc2l6ZSwKKwkJCQlzaXplX3QgcmVzcG9uc2Vfc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncywKKwkJCQlnZnBfdCBnZnApOworCit2b2lkIGdiX29wZXJhdGlvbl9nZXQoc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uKTsKK3ZvaWQgZ2Jfb3BlcmF0aW9uX3B1dChzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb24pOworCitib29sIGdiX29wZXJhdGlvbl9yZXNwb25zZV9hbGxvYyhzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb24sCisJCQkJCXNpemVfdCByZXNwb25zZV9zaXplLCBnZnBfdCBnZnApOworCitpbnQgZ2Jfb3BlcmF0aW9uX3JlcXVlc3Rfc2VuZChzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb24sCisJCQkJZ2Jfb3BlcmF0aW9uX2NhbGxiYWNrIGNhbGxiYWNrLAorCQkJCWdmcF90IGdmcCk7CitpbnQgZ2Jfb3BlcmF0aW9uX3JlcXVlc3Rfc2VuZF9zeW5jX3RpbWVvdXQoc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uLAorCQkJCQkJdW5zaWduZWQgaW50IHRpbWVvdXQpOworc3RhdGljIGlubGluZSBpbnQKK2diX29wZXJhdGlvbl9yZXF1ZXN0X3NlbmRfc3luYyhzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb24pCit7CisJcmV0dXJuIGdiX29wZXJhdGlvbl9yZXF1ZXN0X3NlbmRfc3luY190aW1lb3V0KG9wZXJhdGlvbiwKKwkJCUdCX09QRVJBVElPTl9USU1FT1VUX0RFRkFVTFQpOworfQorCit2b2lkIGdiX29wZXJhdGlvbl9jYW5jZWwoc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uLCBpbnQgZXJybm8pOwordm9pZCBnYl9vcGVyYXRpb25fY2FuY2VsX2luY29taW5nKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbiwgaW50IGVycm5vKTsKKwordm9pZCBncmV5YnVzX21lc3NhZ2Vfc2VudChzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkLAorCQkJCXN0cnVjdCBnYl9tZXNzYWdlICptZXNzYWdlLCBpbnQgc3RhdHVzKTsKKworaW50IGdiX29wZXJhdGlvbl9zeW5jX3RpbWVvdXQoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGludCB0eXBlLAorCQkJCXZvaWQgKnJlcXVlc3QsIGludCByZXF1ZXN0X3NpemUsCisJCQkJdm9pZCAqcmVzcG9uc2UsIGludCByZXNwb25zZV9zaXplLAorCQkJCXVuc2lnbmVkIGludCB0aW1lb3V0KTsKK2ludCBnYl9vcGVyYXRpb25fdW5pZGlyZWN0aW9uYWxfdGltZW91dChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQlpbnQgdHlwZSwgdm9pZCAqcmVxdWVzdCwgaW50IHJlcXVlc3Rfc2l6ZSwKKwkJCQl1bnNpZ25lZCBpbnQgdGltZW91dCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IGdiX29wZXJhdGlvbl9zeW5jKHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBpbnQgdHlwZSwKKwkJICAgICAgdm9pZCAqcmVxdWVzdCwgaW50IHJlcXVlc3Rfc2l6ZSwKKwkJICAgICAgdm9pZCAqcmVzcG9uc2UsIGludCByZXNwb25zZV9zaXplKQoreworCXJldHVybiBnYl9vcGVyYXRpb25fc3luY190aW1lb3V0KGNvbm5lY3Rpb24sIHR5cGUsCisJCQlyZXF1ZXN0LCByZXF1ZXN0X3NpemUsIHJlc3BvbnNlLCByZXNwb25zZV9zaXplLAorCQkJR0JfT1BFUkFUSU9OX1RJTUVPVVRfREVGQVVMVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdiX29wZXJhdGlvbl91bmlkaXJlY3Rpb25hbChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwKKwkJCQlpbnQgdHlwZSwgdm9pZCAqcmVxdWVzdCwgaW50IHJlcXVlc3Rfc2l6ZSkKK3sKKwlyZXR1cm4gZ2Jfb3BlcmF0aW9uX3VuaWRpcmVjdGlvbmFsX3RpbWVvdXQoY29ubmVjdGlvbiwgdHlwZSwKKwkJCXJlcXVlc3QsIHJlcXVlc3Rfc2l6ZSwgR0JfT1BFUkFUSU9OX1RJTUVPVVRfREVGQVVMVCk7Cit9CisKK2ludCBnYl9vcGVyYXRpb25faW5pdCh2b2lkKTsKK3ZvaWQgZ2Jfb3BlcmF0aW9uX2V4aXQodm9pZCk7CisKKyNlbmRpZiAvKiAhX19PUEVSQVRJT05fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvcG93ZXJfc3VwcGx5LmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9wb3dlcl9zdXBwbHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODVjOTg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvcG93ZXJfc3VwcGx5LmMKQEAgLTAsMCArMSwxMTQxIEBACisvKgorICogUG93ZXIgU3VwcGx5IGRyaXZlciBmb3IgYSBHcmV5YnVzIG1vZHVsZS4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE1IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE1IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgImdyZXlidXMuaCIKKworI2RlZmluZSBQUk9QX01BWCAzMgorCitzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5X3Byb3AgeworCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5CXByb3A7CisJdTgJCQkJZ2JfcHJvcDsKKwlpbnQJCQkJdmFsOworCWludAkJCQlwcmV2aW91c192YWw7CisJYm9vbAkJCQlpc193cml0ZWFibGU7Cit9OworCitzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5IHsKKwl1OAkJCQlpZDsKKwlib29sCQkJCXJlZ2lzdGVyZWQ7CisJc3RydWN0IHBvd2VyX3N1cHBseQkJKnBzeTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MJZGVzYzsKKwljaGFyCQkJCW5hbWVbNjRdOworCXN0cnVjdCBnYl9wb3dlcl9zdXBwbGllcwkqc3VwcGxpZXM7CisJc3RydWN0IGRlbGF5ZWRfd29yawkJd29yazsKKwljaGFyCQkJCSptYW51ZmFjdHVyZXI7CisJY2hhcgkJCQkqbW9kZWxfbmFtZTsKKwljaGFyCQkJCSpzZXJpYWxfbnVtYmVyOworCXU4CQkJCXR5cGU7CisJdTgJCQkJcHJvcGVydGllc19jb3VudDsKKwl1OAkJCQlwcm9wZXJ0aWVzX2NvdW50X3N0cjsKKwl1bnNpZ25lZCBsb25nCQkJbGFzdF91cGRhdGU7CisJdTgJCQkJY2FjaGVfaW52YWxpZDsKKwl1bnNpZ25lZCBpbnQJCQl1cGRhdGVfaW50ZXJ2YWw7CisJYm9vbAkJCQljaGFuZ2VkOworCXN0cnVjdCBnYl9wb3dlcl9zdXBwbHlfcHJvcAkqcHJvcHM7CisJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkJKnByb3BzX3JhdzsKKwlib29sCQkJCXBtX2FjcXVpcmVkOworCXN0cnVjdCBtdXRleAkJCXN1cHBseV9sb2NrOworfTsKKworc3RydWN0IGdiX3Bvd2VyX3N1cHBsaWVzIHsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbgkqY29ubmVjdGlvbjsKKwl1OAkJCXN1cHBsaWVzX2NvdW50OworCXN0cnVjdCBnYl9wb3dlcl9zdXBwbHkJKnN1cHBseTsKKwlzdHJ1Y3QgbXV0ZXgJCXN1cHBsaWVzX2xvY2s7Cit9OworCisjZGVmaW5lIHRvX2diX3Bvd2VyX3N1cHBseSh4KSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEoeCkKKworLyoKKyAqIEdlbmVyYWwgcG93ZXIgc3VwcGx5IHByb3BlcnRpZXMgdGhhdCBjb3VsZCBiZSBhYnNlbnQgZnJvbSB2YXJpb3VzIHJlYXNvbnMsCisgKiBsaWtlIGtlcm5lbCB2ZXJzaW9ucyBvciB2ZW5kb3Igc3BlY2lmaWMgdmVyc2lvbnMKKyAqLworI2lmbmRlZiBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX0JPT1QKKwkjZGVmaW5lIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfQk9PVAktMQorI2VuZGlmCisjaWZuZGVmIFBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfQk9PVAorCSNkZWZpbmUgUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9CT09UCS0xCisjZW5kaWYKKyNpZm5kZWYgUE9XRVJfU1VQUExZX1BST1BfQ0FMSUJSQVRFCisJI2RlZmluZSBQT1dFUl9TVVBQTFlfUFJPUF9DQUxJQlJBVEUJLTEKKyNlbmRpZgorCisvKiBjYWNoZSB0aW1lIGluIG1pbGxpc2Vjb25kcywgaWYgY2FjaGVfdGltZSBpcyBzZXQgdG8gMCBjYWNoZSBpcyBkaXNhYmxlICovCitzdGF0aWMgdW5zaWduZWQgaW50IGNhY2hlX3RpbWUgPSAxMDAwOworLyoKKyAqIHVwZGF0ZSBpbnRlcnZhbCBpbml0aWFsIGFuZCBtYXhpbXVtIHZhbHVlLCBiZXR3ZWVuIHRoZSB0d28gd2lsbAorICogYmFjay1vZmYgZXhwb25lbnRpYWwKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCB1cGRhdGVfaW50ZXJ2YWxfaW5pdCA9IDEgKiBIWjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdXBkYXRlX2ludGVydmFsX21heCA9IDMwICogSFo7CisKK3N0cnVjdCBnYl9wb3dlcl9zdXBwbHlfY2hhbmdlcyB7CisJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkJcHJvcDsKKwl1MzIJCQkJdG9sZXJhbmNlX2NoYW5nZTsKKwl2b2lkICgqcHJvcF9jaGFuZ2VkKShzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5ICpnYnBzeSwKKwkJCSAgICAgc3RydWN0IGdiX3Bvd2VyX3N1cHBseV9wcm9wICpwcm9wKTsKK307CisKK3N0YXRpYyB2b2lkIGdiX3Bvd2VyX3N1cHBseV9zdGF0ZV9jaGFuZ2Uoc3RydWN0IGdiX3Bvd2VyX3N1cHBseSAqZ2Jwc3ksCisJCQkJCSBzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5X3Byb3AgKnByb3ApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdiX3Bvd2VyX3N1cHBseV9jaGFuZ2VzIHBzeV9wcm9wc19jaGFuZ2VzW10gPSB7CisJewkucHJvcAkJCT0gR0JfUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAorCQkudG9sZXJhbmNlX2NoYW5nZQk9IDAsCisJCS5wcm9wX2NoYW5nZWQJCT0gZ2JfcG93ZXJfc3VwcGx5X3N0YXRlX2NoYW5nZSwKKwl9LAorCXsJLnByb3AJCQk9IEdCX1BPV0VSX1NVUFBMWV9QUk9QX1RFTVAsCisJCS50b2xlcmFuY2VfY2hhbmdlCT0gNTAwLAorCQkucHJvcF9jaGFuZ2VkCQk9IE5VTEwsCisJfSwKKwl7CS5wcm9wCQkJPSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUsCisJCS50b2xlcmFuY2VfY2hhbmdlCT0gMCwKKwkJLnByb3BfY2hhbmdlZAkJPSBOVUxMLAorCX0sCit9OworCitzdGF0aWMgaW50IGdldF9wc3BfZnJvbV9nYl9wcm9wKGludCBnYl9wcm9wLCBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSAqcHNwKQoreworCWludCBwcm9wOworCisJc3dpdGNoIChnYl9wcm9wKSB7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX1RZUEU6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfVFlQRTsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEg6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEg7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfT05MSU5FOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfT05MSU5FOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0FVVEhFTlRJQzoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0FVVEhFTlRJQzsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWTsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DWUNMRV9DT1VOVDoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0NZQ0xFX0NPVU5UOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NQVg7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU46CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTjsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWF9ERVNJR046CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWF9ERVNJR047CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU5fREVTSUdOOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU5fREVTSUdOOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9BVkc6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX0FWRzsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX09DVjoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfT0NWOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfQk9PVDoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfQk9PVDsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX01BWDoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTUFYOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1c7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9BVkc6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX0FWRzsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX0JPT1Q6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX0JPT1Q7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfUE9XRVJfTk9XOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfUE9XRVJfTk9XOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1BPV0VSX0FWRzoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX1BPV0VSX0FWRzsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTF9ERVNJR046CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTF9ERVNJR047CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0VNUFRZX0RFU0lHTjoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9FTVBUWV9ERVNJR047CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTEw6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTDsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRU1QVFk6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRU1QVFk7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVzoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9OT1c7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0FWRzoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9BVkc7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0NPVU5URVI6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfQ09VTlRFUjsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfQ1VSUkVOVDoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9DVVJSRU5UOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9DVVJSRU5UX01BWDoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9DVVJSRU5UX01BWDsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfVk9MVEFHRToKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9WT0xUQUdFOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9WT0xUQUdFX01BWDoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9WT0xUQUdFX01BWDsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfQ09OVFJPTF9MSU1JVDoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9DT05UUk9MX0xJTUlUOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9DT05UUk9MX0xJTUlUX01BWDoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9DT05UUk9MX0xJTUlUX01BWDsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9JTlBVVF9DVVJSRU5UX0xJTUlUOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfSU5QVVRfQ1VSUkVOVF9MSU1JVDsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfRlVMTF9ERVNJR046CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfRlVMTF9ERVNJR047CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX0VNUFRZX0RFU0lHTjoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9FTVBUWV9ERVNJR047CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX0ZVTEw6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfRlVMTDsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfRU1QVFk6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfRU1QVFk7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX05PVzoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9OT1c7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX0FWRzoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9BVkc7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFk6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWTsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWV9BTEVSVF9NSU46CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWV9BTEVSVF9NSU47CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFlfQUxFUlRfTUFYOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFlfQUxFUlRfTUFYOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZX0xFVkVMOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFlfTEVWRUw7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfVEVNUDoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX1RFTVA7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfVEVNUF9NQVg6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QX01BWDsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9URU1QX01JTjoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfTUlOOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQUxFUlRfTUlOOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTEVSVF9NSU47CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTEVSVF9NQVg6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QX0FMRVJUX01BWDsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9URU1QX0FNQklFTlQ6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QX0FNQklFTlQ7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTUJJRU5UX0FMRVJUX01JTjoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQU1CSUVOVF9BTEVSVF9NSU47CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTUJJRU5UX0FMRVJUX01BWDoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQU1CSUVOVF9BTEVSVF9NQVg7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19FTVBUWV9OT1c6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0VNUFRZX05PVzsKKwkJYnJlYWs7CisJY2FzZSBHQl9QT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0VNUFRZX0FWRzoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRU1QVFlfQVZHOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRlVMTF9OT1c6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0ZVTExfTk9XOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRlVMTF9BVkc6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0ZVTExfQVZHOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1RZUEU6CisJCXByb3AgPSBQT1dFUl9TVVBQTFlfUFJPUF9UWVBFOworCQlicmVhazsKKwljYXNlIEdCX1BPV0VSX1NVUFBMWV9QUk9QX1NDT1BFOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfU0NPUEU7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX1RFUk1fQ1VSUkVOVDoKKwkJcHJvcCA9IFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9URVJNX0NVUlJFTlQ7CisJCWJyZWFrOworCWNhc2UgR0JfUE9XRVJfU1VQUExZX1BST1BfQ0FMSUJSQVRFOgorCQlwcm9wID0gUE9XRVJfU1VQUExZX1BST1BfQ0FMSUJSQVRFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcm9wID0gLTE7CisJCWJyZWFrOworCX0KKworCWlmIChwcm9wIDwgMCkKKwkJcmV0dXJuIHByb3A7CisKKwkqcHNwID0gKGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5KXByb3A7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBnYl9jb25uZWN0aW9uICpnZXRfY29ubl9mcm9tX3BzeShzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5ICpnYnBzeSkKK3sKKwlyZXR1cm4gZ2Jwc3ktPnN1cHBsaWVzLT5jb25uZWN0aW9uOworfQorCitzdGF0aWMgc3RydWN0IGdiX3Bvd2VyX3N1cHBseV9wcm9wICpnZXRfcHN5X3Byb3Aoc3RydWN0IGdiX3Bvd2VyX3N1cHBseSAqZ2Jwc3ksCisJCQkJCQkgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGdicHN5LT5wcm9wZXJ0aWVzX2NvdW50OyBpKyspCisJCWlmIChnYnBzeS0+cHJvcHNbaV0ucHJvcCA9PSBwc3ApCisJCQlyZXR1cm4gJmdicHN5LT5wcm9wc1tpXTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBpc19wc3lfcHJvcF93cml0ZWFibGUoc3RydWN0IGdiX3Bvd2VyX3N1cHBseSAqZ2Jwc3ksCisJCQkJICAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3ApCit7CisJc3RydWN0IGdiX3Bvd2VyX3N1cHBseV9wcm9wICpwcm9wOworCisJcHJvcCA9IGdldF9wc3lfcHJvcChnYnBzeSwgcHNwKTsKKwlpZiAoIXByb3ApCisJCXJldHVybiAtRU5PRU5UOworCXJldHVybiBwcm9wLT5pc193cml0ZWFibGUgPyAxIDogMDsKK30KKworc3RhdGljIGludCBpc19wcm9wX3ZhbGludChlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3ApCit7CisJcmV0dXJuICgocHNwIDwgUE9XRVJfU1VQUExZX1BST1BfTU9ERUxfTkFNRSkgPyAxIDogMCk7Cit9CisKK3N0YXRpYyB2b2lkIG5leHRfaW50ZXJ2YWwoc3RydWN0IGdiX3Bvd2VyX3N1cHBseSAqZ2Jwc3kpCit7CisJaWYgKGdicHN5LT51cGRhdGVfaW50ZXJ2YWwgPT0gdXBkYXRlX2ludGVydmFsX21heCkKKwkJcmV0dXJuOworCisJLyogZG8gc29tZSBleHBvbmVudGlhbCBiYWNrLW9mZiBpbiB0aGUgdXBkYXRlIGludGVydmFsICovCisJZ2Jwc3ktPnVwZGF0ZV9pbnRlcnZhbCAqPSAyOworCWlmIChnYnBzeS0+dXBkYXRlX2ludGVydmFsID4gdXBkYXRlX2ludGVydmFsX21heCkKKwkJZ2Jwc3ktPnVwZGF0ZV9pbnRlcnZhbCA9IHVwZGF0ZV9pbnRlcnZhbF9tYXg7Cit9CisKK3N0YXRpYyB2b2lkIF9fZ2JfcG93ZXJfc3VwcGx5X2NoYW5nZWQoc3RydWN0IGdiX3Bvd2VyX3N1cHBseSAqZ2Jwc3kpCit7CisJcG93ZXJfc3VwcGx5X2NoYW5nZWQoZ2Jwc3ktPnBzeSk7Cit9CisKK3N0YXRpYyB2b2lkIGdiX3Bvd2VyX3N1cHBseV9zdGF0ZV9jaGFuZ2Uoc3RydWN0IGdiX3Bvd2VyX3N1cHBseSAqZ2Jwc3ksCisJCQkJCSBzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5X3Byb3AgKnByb3ApCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBnZXRfY29ubl9mcm9tX3BzeShnYnBzeSk7CisJaW50IHJldDsKKworCS8qCisJICogQ2hlY2sgZ2Jwc3ktPnBtX2FjcXVpcmVkIHRvIG1ha2Ugc3VyZSBvbmx5IG9uZSBwYWlyIG9mICdnZXRfc3luYycKKwkgKiBhbmQgJ3B1dF9hdXRvc3VzcGVuZCcgcnVudGltZSBwbSBjYWxsIGZvciBzdGF0ZSBwcm9wZXJ0eSBjaGFuZ2UuCisJICovCisJbXV0ZXhfbG9jaygmZ2Jwc3ktPnN1cHBseV9sb2NrKTsKKworCWlmICgocHJvcC0+dmFsID09IEdCX1BPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkcpICYmCisJICAgICFnYnBzeS0+cG1fYWNxdWlyZWQpIHsKKwkJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhjb25uZWN0aW9uLT5idW5kbGUpOworCQlpZiAocmV0KQorCQkJZGV2X2VycigmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsCisJCQkJIkZhaWwgdG8gc2V0IHdha2UgbG9jayBmb3IgY2hhcmdpbmcgc3RhdGVcbiIpOworCQllbHNlCisJCQlnYnBzeS0+cG1fYWNxdWlyZWQgPSB0cnVlOworCX0gZWxzZSB7CisJCWlmIChnYnBzeS0+cG1fYWNxdWlyZWQpIHsKKwkJCXJldCA9IGdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGNvbm5lY3Rpb24tPmJ1bmRsZSk7CisJCQlpZiAocmV0KQorCQkJCWRldl9lcnIoJmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2LAorCQkJCQkiRmFpbCB0byBzZXQgd2FrZSB1bmxvY2sgZm9yIG5vbmUgY2hhcmdpbmdcbiIpOworCQkJZWxzZQorCQkJCWdicHN5LT5wbV9hY3F1aXJlZCA9IGZhbHNlOworCQl9CisJfQorCisJbXV0ZXhfdW5sb2NrKCZnYnBzeS0+c3VwcGx5X2xvY2spOworfQorCitzdGF0aWMgdm9pZCBjaGVja19jaGFuZ2VkKHN0cnVjdCBnYl9wb3dlcl9zdXBwbHkgKmdicHN5LAorCQkJICBzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5X3Byb3AgKnByb3ApCit7CisJY29uc3Qgc3RydWN0IGdiX3Bvd2VyX3N1cHBseV9jaGFuZ2VzICpwc3ljOworCWludCB2YWwgPSBwcm9wLT52YWw7CisJaW50IHByZXZfdmFsID0gcHJvcC0+cHJldmlvdXNfdmFsOworCWJvb2wgY2hhbmdlZCA9IGZhbHNlOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocHN5X3Byb3BzX2NoYW5nZXMpOyBpKyspIHsKKwkJcHN5YyA9ICZwc3lfcHJvcHNfY2hhbmdlc1tpXTsKKwkJaWYgKHByb3AtPnByb3AgPT0gcHN5Yy0+cHJvcCkgeworCQkJaWYgKCFwc3ljLT50b2xlcmFuY2VfY2hhbmdlKQorCQkJCWNoYW5nZWQgPSB0cnVlOworCQkJZWxzZSBpZiAodmFsIDwgcHJldl92YWwgJiYKKwkJCQkgcHJldl92YWwgLSB2YWwgPiBwc3ljLT50b2xlcmFuY2VfY2hhbmdlKQorCQkJCWNoYW5nZWQgPSB0cnVlOworCQkJZWxzZSBpZiAodmFsID4gcHJldl92YWwgJiYKKwkJCQkgdmFsIC0gcHJldl92YWwgPiBwc3ljLT50b2xlcmFuY2VfY2hhbmdlKQorCQkJCWNoYW5nZWQgPSB0cnVlOworCisJCQlpZiAoY2hhbmdlZCAmJiBwc3ljLT5wcm9wX2NoYW5nZWQpCisJCQkJcHN5Yy0+cHJvcF9jaGFuZ2VkKGdicHN5LCBwcm9wKTsKKworCQkJaWYgKGNoYW5nZWQpCisJCQkJZ2Jwc3ktPmNoYW5nZWQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgdG90YWxfcHJvcHMoc3RydWN0IGdiX3Bvd2VyX3N1cHBseSAqZ2Jwc3kpCit7CisJLyogdGhpcyByZXR1cm4gdGhlIGludHZhbCBwbHVzIHRoZSBzdHJ2YWwgcHJvcGVydGllcyAqLworCXJldHVybiAoZ2Jwc3ktPnByb3BlcnRpZXNfY291bnQgKyBnYnBzeS0+cHJvcGVydGllc19jb3VudF9zdHIpOworfQorCitzdGF0aWMgdm9pZCBwcm9wX2FwcGVuZChzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5ICpnYnBzeSwKKwkJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHByb3ApCit7CisJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgKm5ld19wcm9wc19yYXc7CisKKwlnYnBzeS0+cHJvcGVydGllc19jb3VudF9zdHIrKzsKKwluZXdfcHJvcHNfcmF3ID0ga3JlYWxsb2MoZ2Jwc3ktPnByb3BzX3JhdywgdG90YWxfcHJvcHMoZ2Jwc3kpICoKKwkJCQkgc2l6ZW9mKGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5KSwKKwkJCQkgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXdfcHJvcHNfcmF3KQorCQlyZXR1cm47CisJZ2Jwc3ktPnByb3BzX3JhdyA9IG5ld19wcm9wc19yYXc7CisJZ2Jwc3ktPnByb3BzX3Jhd1t0b3RhbF9wcm9wcyhnYnBzeSkgLSAxXSA9IHByb3A7Cit9CisKK3N0YXRpYyBpbnQgX19nYl9wb3dlcl9zdXBwbHlfc2V0X25hbWUoY2hhciAqaW5pdF9uYW1lLCBjaGFyICpuYW1lLCBzaXplX3QgbGVuKQoreworCXVuc2lnbmVkIGludCBpID0gMDsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3k7CisKKwlpZiAoIXN0cmxlbihpbml0X25hbWUpKQorCQlpbml0X25hbWUgPSAiZ2JfcG93ZXJfc3VwcGx5IjsKKwlzdHJsY3B5KG5hbWUsIGluaXRfbmFtZSwgbGVuKTsKKworCXdoaWxlICgocmV0IDwgbGVuKSAmJiAocHN5ID0gcG93ZXJfc3VwcGx5X2dldF9ieV9uYW1lKG5hbWUpKSkgeworCQlwb3dlcl9zdXBwbHlfcHV0KHBzeSk7CisKKwkJcmV0ID0gc25wcmludGYobmFtZSwgbGVuLCAiJXNfJXUiLCBpbml0X25hbWUsICsraSk7CisJfQorCWlmIChyZXQgPj0gbGVuKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHZvaWQgX2diX3Bvd2VyX3N1cHBseV9hcHBlbmRfcHJvcHMoc3RydWN0IGdiX3Bvd2VyX3N1cHBseSAqZ2Jwc3kpCit7CisJaWYgKHN0cmxlbihnYnBzeS0+bWFudWZhY3R1cmVyKSkKKwkJcHJvcF9hcHBlbmQoZ2Jwc3ksIFBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUik7CisJaWYgKHN0cmxlbihnYnBzeS0+bW9kZWxfbmFtZSkpCisJCXByb3BfYXBwZW5kKGdicHN5LCBQT1dFUl9TVVBQTFlfUFJPUF9NT0RFTF9OQU1FKTsKKwlpZiAoc3RybGVuKGdicHN5LT5zZXJpYWxfbnVtYmVyKSkKKwkJcHJvcF9hcHBlbmQoZ2Jwc3ksIFBPV0VSX1NVUFBMWV9QUk9QX1NFUklBTF9OVU1CRVIpOworfQorCitzdGF0aWMgaW50IGdiX3Bvd2VyX3N1cHBseV9kZXNjcmlwdGlvbl9nZXQoc3RydWN0IGdiX3Bvd2VyX3N1cHBseSAqZ2Jwc3kpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBnZXRfY29ubl9mcm9tX3BzeShnYnBzeSk7CisJc3RydWN0IGdiX3Bvd2VyX3N1cHBseV9nZXRfZGVzY3JpcHRpb25fcmVxdWVzdCByZXE7CisJc3RydWN0IGdiX3Bvd2VyX3N1cHBseV9nZXRfZGVzY3JpcHRpb25fcmVzcG9uc2UgcmVzcDsKKwlpbnQgcmV0OworCisJcmVxLnBzeV9pZCA9IGdicHN5LT5pZDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sCisJCQkJR0JfUE9XRVJfU1VQUExZX1RZUEVfR0VUX0RFU0NSSVBUSU9OLAorCQkJCSZyZXEsIHNpemVvZihyZXEpLCAmcmVzcCwgc2l6ZW9mKHJlc3ApKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWdicHN5LT5tYW51ZmFjdHVyZXIgPSBrc3RybmR1cChyZXNwLm1hbnVmYWN0dXJlciwgUFJPUF9NQVgsIEdGUF9LRVJORUwpOworCWlmICghZ2Jwc3ktPm1hbnVmYWN0dXJlcikKKwkJcmV0dXJuIC1FTk9NRU07CisJZ2Jwc3ktPm1vZGVsX25hbWUgPSBrc3RybmR1cChyZXNwLm1vZGVsLCBQUk9QX01BWCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFnYnBzeS0+bW9kZWxfbmFtZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJZ2Jwc3ktPnNlcmlhbF9udW1iZXIgPSBrc3RybmR1cChyZXNwLnNlcmlhbF9udW1iZXIsIFBST1BfTUFYLAorCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWdicHN5LT5zZXJpYWxfbnVtYmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWdicHN5LT50eXBlID0gbGUxNl90b19jcHUocmVzcC50eXBlKTsKKwlnYnBzeS0+cHJvcGVydGllc19jb3VudCA9IHJlc3AucHJvcGVydGllc19jb3VudDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX3Bvd2VyX3N1cHBseV9wcm9wX2Rlc2NyaXB0b3JzX2dldChzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5ICpnYnBzeSkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGdldF9jb25uX2Zyb21fcHN5KGdicHN5KTsKKwlzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5X2dldF9wcm9wZXJ0eV9kZXNjcmlwdG9yc19yZXF1ZXN0ICpyZXE7CisJc3RydWN0IGdiX3Bvd2VyX3N1cHBseV9nZXRfcHJvcGVydHlfZGVzY3JpcHRvcnNfcmVzcG9uc2UgKnJlc3A7CisJc3RydWN0IGdiX29wZXJhdGlvbiAqb3A7CisJdTggcHJvcHNfY291bnQgPSBnYnBzeS0+cHJvcGVydGllc19jb3VudDsKKwllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3A7CisJaW50IHJldDsKKwlpbnQgaSwgciA9IDA7CisKKwlpZiAocHJvcHNfY291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlvcCA9IGdiX29wZXJhdGlvbl9jcmVhdGUoY29ubmVjdGlvbiwKKwkJCQkgR0JfUE9XRVJfU1VQUExZX1RZUEVfR0VUX1BST1BfREVTQ1JJUFRPUlMsCisJCQkJIHNpemVvZihyZXEpLCBzaXplb2YoKnJlc3ApICsgcHJvcHNfY291bnQgKgorCQkJCSBzaXplb2Yoc3RydWN0IGdiX3Bvd2VyX3N1cHBseV9wcm9wc19kZXNjKSwKKwkJCQkgR0ZQX0tFUk5FTCk7CisJaWYgKCFvcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXEgPSBvcC0+cmVxdWVzdC0+cGF5bG9hZDsKKwlyZXEtPnBzeV9pZCA9IGdicHN5LT5pZDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9yZXF1ZXN0X3NlbmRfc3luYyhvcCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0X3B1dF9vcGVyYXRpb247CisKKwlyZXNwID0gb3AtPnJlc3BvbnNlLT5wYXlsb2FkOworCisJLyogdmFsaWRhdGUgcmVjZWl2ZWQgcHJvcGVydGllcyAqLworCWZvciAoaSA9IDA7IGkgPCBwcm9wc19jb3VudDsgaSsrKSB7CisJCXJldCA9IGdldF9wc3BfZnJvbV9nYl9wcm9wKHJlc3AtPnByb3BzW2ldLnByb3BlcnR5LCAmcHNwKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl93YXJuKCZjb25uZWN0aW9uLT5idW5kbGUtPmRldiwKKwkJCQkgImdyZXlidXMgcHJvcGVydHkgJXUgaXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGtlcm5lbCwgZHJvcHBlZFxuIiwKKwkJCQkgcmVzcC0+cHJvcHNbaV0ucHJvcGVydHkpOworCQkJZ2Jwc3ktPnByb3BlcnRpZXNfY291bnQtLTsKKwkJfQorCX0KKworCWdicHN5LT5wcm9wcyA9IGtjYWxsb2MoZ2Jwc3ktPnByb3BlcnRpZXNfY291bnQsIHNpemVvZigqZ2Jwc3ktPnByb3BzKSwKKwkJCSAgICAgIEdGUF9LRVJORUwpOworCWlmICghZ2Jwc3ktPnByb3BzKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3B1dF9vcGVyYXRpb247CisJfQorCisJZ2Jwc3ktPnByb3BzX3JhdyA9IGtjYWxsb2MoZ2Jwc3ktPnByb3BlcnRpZXNfY291bnQsCisJCQkJICAgc2l6ZW9mKCpnYnBzeS0+cHJvcHNfcmF3KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFnYnBzeS0+cHJvcHNfcmF3KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3B1dF9vcGVyYXRpb247CisJfQorCisJLyogU3RvcmUgYXZhaWxhYmxlIHByb3BlcnRpZXMsIHNraXAgdGhlIG9uZXMgd2UgZG8gbm90IHN1cHBvcnQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcHJvcHNfY291bnQ7IGkrKykgeworCQlyZXQgPSBnZXRfcHNwX2Zyb21fZ2JfcHJvcChyZXNwLT5wcm9wc1tpXS5wcm9wZXJ0eSwgJnBzcCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlyKys7CisJCQljb250aW51ZTsKKwkJfQorCQlnYnBzeS0+cHJvcHNbaSAtIHJdLnByb3AgPSBwc3A7CisJCWdicHN5LT5wcm9wc1tpIC0gcl0uZ2JfcHJvcCA9IHJlc3AtPnByb3BzW2ldLnByb3BlcnR5OworCQlnYnBzeS0+cHJvcHNfcmF3W2kgLSByXSA9IHBzcDsKKwkJaWYgKHJlc3AtPnByb3BzW2ldLmlzX3dyaXRlYWJsZSkKKwkJCWdicHN5LT5wcm9wc1tpIC0gcl0uaXNfd3JpdGVhYmxlID0gdHJ1ZTsKKwl9CisKKwkvKgorCSAqIG5vdyBhcHBlbmQgdGhlIHByb3BlcnRpZXMgdGhhdCB3ZSBhbHJlYWR5IGdvdCBpbmZvcm1hdGlvbiBpbiB0aGUKKwkgKiBnZXRfZGVzY3JpcHRpb24gb3BlcmF0aW9uLiAoY2hhciAqIG9uZXMpCisJICovCisJX2diX3Bvd2VyX3N1cHBseV9hcHBlbmRfcHJvcHMoZ2Jwc3kpOworCisJcmV0ID0gMDsKK291dF9wdXRfb3BlcmF0aW9uOgorCWdiX29wZXJhdGlvbl9wdXQob3ApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2diX3Bvd2VyX3N1cHBseV9wcm9wZXJ0eV91cGRhdGUoc3RydWN0IGdiX3Bvd2VyX3N1cHBseSAqZ2Jwc3ksCisJCQkJCSAgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZ2V0X2Nvbm5fZnJvbV9wc3koZ2Jwc3kpOworCXN0cnVjdCBnYl9wb3dlcl9zdXBwbHlfcHJvcCAqcHJvcDsKKwlzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5X2dldF9wcm9wZXJ0eV9yZXF1ZXN0IHJlcTsKKwlzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5X2dldF9wcm9wZXJ0eV9yZXNwb25zZSByZXNwOworCWludCB2YWw7CisJaW50IHJldDsKKworCXByb3AgPSBnZXRfcHN5X3Byb3AoZ2Jwc3ksIHBzcCk7CisJaWYgKCFwcm9wKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXEucHN5X2lkID0gZ2Jwc3ktPmlkOworCXJlcS5wcm9wZXJ0eSA9IHByb3AtPmdiX3Byb3A7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLCBHQl9QT1dFUl9TVVBQTFlfVFlQRV9HRVRfUFJPUEVSVFksCisJCQkJJnJlcSwgc2l6ZW9mKHJlcSksICZyZXNwLCBzaXplb2YocmVzcCkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJdmFsID0gbGUzMl90b19jcHUocmVzcC5wcm9wX3ZhbCk7CisJaWYgKHZhbCA9PSBwcm9wLT52YWwpCisJCXJldHVybiAwOworCisJcHJvcC0+cHJldmlvdXNfdmFsID0gcHJvcC0+dmFsOworCXByb3AtPnZhbCA9IHZhbDsKKworCWNoZWNrX2NoYW5nZWQoZ2Jwc3ksIHByb3ApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19nYl9wb3dlcl9zdXBwbHlfcHJvcGVydHlfZ2V0KHN0cnVjdCBnYl9wb3dlcl9zdXBwbHkgKmdicHN5LAorCQkJCQkgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwkJCQkJICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXN0cnVjdCBnYl9wb3dlcl9zdXBwbHlfcHJvcCAqcHJvcDsKKworCXByb3AgPSBnZXRfcHN5X3Byb3AoZ2Jwc3ksIHBzcCk7CisJaWYgKCFwcm9wKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZhbC0+aW50dmFsID0gcHJvcC0+dmFsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZ2JfcG93ZXJfc3VwcGx5X3Byb3BlcnR5X3N0cnZhbF9nZXQoc3RydWN0IGdiX3Bvd2VyX3N1cHBseSAqZ2Jwc3ksCisJCQkJCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCisJCQkJCQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXN3aXRjaCAocHNwKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9NT0RFTF9OQU1FOgorCQl2YWwtPnN0cnZhbCA9IGdicHN5LT5tb2RlbF9uYW1lOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUjoKKwkJdmFsLT5zdHJ2YWwgPSBnYnBzeS0+bWFudWZhY3R1cmVyOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NFUklBTF9OVU1CRVI6CisJCXZhbC0+c3RydmFsID0gZ2Jwc3ktPnNlcmlhbF9udW1iZXI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9nYl9wb3dlcl9zdXBwbHlfcHJvcGVydHlfZ2V0KHN0cnVjdCBnYl9wb3dlcl9zdXBwbHkgKmdicHN5LAorCQkJCQkgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCQkJCQkgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGdldF9jb25uX2Zyb21fcHN5KGdicHN5KTsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBQcm9wZXJ0aWVzIG9mIHR5cGUgY29uc3QgY2hhciAqLCB3ZXJlIGFscmVhZHkgZmV0Y2hlZCBvbgorCSAqIGdldF9kZXNjcmlwdGlvbiBvcGVyYXRpb24gYW5kIHNob3VsZCBiZSBjYWNoZWQgaW4gZ2IKKwkgKi8KKwlpZiAoaXNfcHJvcF92YWxpbnQocHNwKSkKKwkJcmV0ID0gX19nYl9wb3dlcl9zdXBwbHlfcHJvcGVydHlfZ2V0KGdicHN5LCBwc3AsIHZhbCk7CisJZWxzZQorCQlyZXQgPSBfX2diX3Bvd2VyX3N1cHBseV9wcm9wZXJ0eV9zdHJ2YWxfZ2V0KGdicHN5LCBwc3AsIHZhbCk7CisKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycigmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsICJnZXQgcHJvcGVydHkgJXVcbiIsIHBzcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc19jYWNoZV92YWxpZChzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5ICpnYnBzeSkKK3sKKwkvKiBjaGVjayBpZiBjYWNoZSBpcyBnb29kIGVub3VnaCBvciBpdCBoYXMgZXhwaXJlZCAqLworCWlmIChnYnBzeS0+Y2FjaGVfaW52YWxpZCkgeworCQlnYnBzeS0+Y2FjaGVfaW52YWxpZCA9IDA7CisJCXJldHVybiAwOworCX0KKworCWlmIChnYnBzeS0+bGFzdF91cGRhdGUgJiYKKwkgICAgdGltZV9pc19hZnRlcl9qaWZmaWVzKGdicHN5LT5sYXN0X3VwZGF0ZSArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKGNhY2hlX3RpbWUpKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9wb3dlcl9zdXBwbHlfc3RhdHVzX2dldChzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5ICpnYnBzeSkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGdldF9jb25uX2Zyb21fcHN5KGdicHN5KTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaTsKKworCWlmIChpc19jYWNoZV92YWxpZChnYnBzeSkpCisJCXJldHVybiAwOworCisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhjb25uZWN0aW9uLT5idW5kbGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgZ2Jwc3ktPnByb3BlcnRpZXNfY291bnQ7IGkrKykgeworCQlyZXQgPSBfX2diX3Bvd2VyX3N1cHBseV9wcm9wZXJ0eV91cGRhdGUoZ2Jwc3ksCisJCQkJCQkJZ2Jwc3ktPnByb3BzW2ldLnByb3ApOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCX0KKworCWlmIChyZXQgPT0gMCkKKwkJZ2Jwc3ktPmxhc3RfdXBkYXRlID0gamlmZmllczsKKworCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGNvbm5lY3Rpb24tPmJ1bmRsZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZ2JfcG93ZXJfc3VwcGx5X3N0YXR1c191cGRhdGUoc3RydWN0IGdiX3Bvd2VyX3N1cHBseSAqZ2Jwc3kpCit7CisJLyogY2hlY2sgaWYgdGhlcmUgYSBjaGFuZ2UgdGhhdCBuZWVkIHRvIGJlIHJlcG9ydGVkICovCisJZ2JfcG93ZXJfc3VwcGx5X3N0YXR1c19nZXQoZ2Jwc3kpOworCisJaWYgKCFnYnBzeS0+Y2hhbmdlZCkKKwkJcmV0dXJuOworCisJZ2Jwc3ktPnVwZGF0ZV9pbnRlcnZhbCA9IHVwZGF0ZV9pbnRlcnZhbF9pbml0OworCV9fZ2JfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZ2Jwc3kpOworCWdicHN5LT5jaGFuZ2VkID0gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIGdiX3Bvd2VyX3N1cHBseV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5ICpnYnBzeSA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQkJCQkJICAgICBzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5LAorCQkJCQkJICAgICB3b3JrLndvcmspOworCisJLyoKKwkgKiBpZiB0aGUgcG9sbCBpbnRlcnZhbCBpcyBub3Qgc2V0LCBkaXNhYmxlIHBvbGxpbmcsIHRoaXMgaXMgaGVscGZ1bAorCSAqIHNwZWNpYWxseSBhdCB1bnJlZ2lzdGVyIHRpbWUuCisJICovCisJaWYgKCFnYnBzeS0+dXBkYXRlX2ludGVydmFsKQorCQlyZXR1cm47CisKKwlnYl9wb3dlcl9zdXBwbHlfc3RhdHVzX3VwZGF0ZShnYnBzeSk7CisJbmV4dF9pbnRlcnZhbChnYnBzeSk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZnYnBzeS0+d29yaywgZ2Jwc3ktPnVwZGF0ZV9pbnRlcnZhbCk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKmIsCisJCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCisJCQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXN0cnVjdCBnYl9wb3dlcl9zdXBwbHkgKmdicHN5ID0gdG9fZ2JfcG93ZXJfc3VwcGx5KGIpOworCisJZ2JfcG93ZXJfc3VwcGx5X3N0YXR1c19nZXQoZ2Jwc3kpOworCisJcmV0dXJuIF9nYl9wb3dlcl9zdXBwbHlfcHJvcGVydHlfZ2V0KGdicHN5LCBwc3AsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgZ2JfcG93ZXJfc3VwcGx5X3Byb3BlcnR5X3NldChzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5ICpnYnBzeSwKKwkJCQkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCQkJCQlpbnQgdmFsKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZ2V0X2Nvbm5fZnJvbV9wc3koZ2Jwc3kpOworCXN0cnVjdCBnYl9wb3dlcl9zdXBwbHlfcHJvcCAqcHJvcDsKKwlzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5X3NldF9wcm9wZXJ0eV9yZXF1ZXN0IHJlcTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2JfcG1fcnVudGltZV9nZXRfc3luYyhjb25uZWN0aW9uLT5idW5kbGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlwcm9wID0gZ2V0X3BzeV9wcm9wKGdicHN5LCBwc3ApOworCWlmICghcHJvcCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXEucHN5X2lkID0gZ2Jwc3ktPmlkOworCXJlcS5wcm9wZXJ0eSA9IHByb3AtPmdiX3Byb3A7CisJcmVxLnByb3BfdmFsID0gY3B1X3RvX2xlMzIoKHMzMil2YWwpOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoY29ubmVjdGlvbiwgR0JfUE9XRVJfU1VQUExZX1RZUEVfU0VUX1BST1BFUlRZLAorCQkJCSZyZXEsIHNpemVvZihyZXEpLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBjYWNoZSBpbW1lZGlhdGVseSB0aGUgbmV3IHZhbHVlICovCisJcHJvcC0+dmFsID0gdmFsOworCitvdXQ6CisJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoY29ubmVjdGlvbi0+YnVuZGxlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiLAorCQkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCQkJY29uc3QgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5ICpnYnBzeSA9IHRvX2diX3Bvd2VyX3N1cHBseShiKTsKKworCXJldHVybiBnYl9wb3dlcl9zdXBwbHlfcHJvcGVydHlfc2V0KGdicHN5LCBwc3AsIHZhbC0+aW50dmFsKTsKK30KKworc3RhdGljIGludCBwcm9wZXJ0eV9pc193cml0ZWFibGUoc3RydWN0IHBvd2VyX3N1cHBseSAqYiwKKwkJCQkgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwKQoreworCXN0cnVjdCBnYl9wb3dlcl9zdXBwbHkgKmdicHN5ID0gdG9fZ2JfcG93ZXJfc3VwcGx5KGIpOworCisJcmV0dXJuIGlzX3BzeV9wcm9wX3dyaXRlYWJsZShnYnBzeSwgcHNwKTsKK30KKworc3RhdGljIGludCBnYl9wb3dlcl9zdXBwbHlfcmVnaXN0ZXIoc3RydWN0IGdiX3Bvd2VyX3N1cHBseSAqZ2Jwc3kpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBnZXRfY29ubl9mcm9tX3BzeShnYnBzeSk7CisJc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgY2ZnID0ge307CisKKwljZmcuZHJ2X2RhdGEgPSBnYnBzeTsKKworCWdicHN5LT5kZXNjLm5hbWUJCT0gZ2Jwc3ktPm5hbWU7CisJZ2Jwc3ktPmRlc2MudHlwZQkJPSBnYnBzeS0+dHlwZTsKKwlnYnBzeS0+ZGVzYy5wcm9wZXJ0aWVzCQk9IGdicHN5LT5wcm9wc19yYXc7CisJZ2Jwc3ktPmRlc2MubnVtX3Byb3BlcnRpZXMJPSB0b3RhbF9wcm9wcyhnYnBzeSk7CisJZ2Jwc3ktPmRlc2MuZ2V0X3Byb3BlcnR5CT0gZ2V0X3Byb3BlcnR5OworCWdicHN5LT5kZXNjLnNldF9wcm9wZXJ0eQk9IHNldF9wcm9wZXJ0eTsKKwlnYnBzeS0+ZGVzYy5wcm9wZXJ0eV9pc193cml0ZWFibGUgPSBwcm9wZXJ0eV9pc193cml0ZWFibGU7CisKKwlnYnBzeS0+cHN5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZjb25uZWN0aW9uLT5idW5kbGUtPmRldiwKKwkJCQkJICAgJmdicHN5LT5kZXNjLCAmY2ZnKTsKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGdicHN5LT5wc3kpOworfQorCitzdGF0aWMgdm9pZCBfZ2JfcG93ZXJfc3VwcGx5X2ZyZWUoc3RydWN0IGdiX3Bvd2VyX3N1cHBseSAqZ2Jwc3kpCit7CisJa2ZyZWUoZ2Jwc3ktPnNlcmlhbF9udW1iZXIpOworCWtmcmVlKGdicHN5LT5tb2RlbF9uYW1lKTsKKwlrZnJlZShnYnBzeS0+bWFudWZhY3R1cmVyKTsKKwlrZnJlZShnYnBzeS0+cHJvcHNfcmF3KTsKKwlrZnJlZShnYnBzeS0+cHJvcHMpOworfQorCitzdGF0aWMgdm9pZCBfZ2JfcG93ZXJfc3VwcGx5X3JlbGVhc2Uoc3RydWN0IGdiX3Bvd2VyX3N1cHBseSAqZ2Jwc3kpCit7CisJZ2Jwc3ktPnVwZGF0ZV9pbnRlcnZhbCA9IDA7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmdicHN5LT53b3JrKTsKKworCWlmIChnYnBzeS0+cmVnaXN0ZXJlZCkKKwkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoZ2Jwc3ktPnBzeSk7CisKKwlfZ2JfcG93ZXJfc3VwcGx5X2ZyZWUoZ2Jwc3kpOworfQorCitzdGF0aWMgdm9pZCBfZ2JfcG93ZXJfc3VwcGxpZXNfcmVsZWFzZShzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGxpZXMgKnN1cHBsaWVzKQoreworCWludCBpOworCisJaWYgKCFzdXBwbGllcy0+c3VwcGx5KQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZzdXBwbGllcy0+c3VwcGxpZXNfbG9jayk7CisJZm9yIChpID0gMDsgaSA8IHN1cHBsaWVzLT5zdXBwbGllc19jb3VudDsgaSsrKQorCQlfZ2JfcG93ZXJfc3VwcGx5X3JlbGVhc2UoJnN1cHBsaWVzLT5zdXBwbHlbaV0pOworCWtmcmVlKHN1cHBsaWVzLT5zdXBwbHkpOworCW11dGV4X3VubG9jaygmc3VwcGxpZXMtPnN1cHBsaWVzX2xvY2spOworCWtmcmVlKHN1cHBsaWVzKTsKK30KKworc3RhdGljIGludCBnYl9wb3dlcl9zdXBwbGllc19nZXRfY291bnQoc3RydWN0IGdiX3Bvd2VyX3N1cHBsaWVzICpzdXBwbGllcykKK3sKKwlzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5X2dldF9zdXBwbGllc19yZXNwb25zZSByZXNwOworCWludCByZXQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhzdXBwbGllcy0+Y29ubmVjdGlvbiwKKwkJCQlHQl9QT1dFUl9TVVBQTFlfVFlQRV9HRVRfU1VQUExJRVMsCisJCQkJTlVMTCwgMCwgJnJlc3AsIHNpemVvZihyZXNwKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAgKCFyZXNwLnN1cHBsaWVzX2NvdW50KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN1cHBsaWVzLT5zdXBwbGllc19jb3VudCA9IHJlc3Auc3VwcGxpZXNfY291bnQ7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX3Bvd2VyX3N1cHBseV9jb25maWcoc3RydWN0IGdiX3Bvd2VyX3N1cHBsaWVzICpzdXBwbGllcywgaW50IGlkKQoreworCXN0cnVjdCBnYl9wb3dlcl9zdXBwbHkgKmdicHN5ID0gJnN1cHBsaWVzLT5zdXBwbHlbaWRdOworCWludCByZXQ7CisKKwlnYnBzeS0+c3VwcGxpZXMgPSBzdXBwbGllczsKKwlnYnBzeS0+aWQgPSBpZDsKKworCXJldCA9IGdiX3Bvd2VyX3N1cHBseV9kZXNjcmlwdGlvbl9nZXQoZ2Jwc3kpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGdiX3Bvd2VyX3N1cHBseV9wcm9wX2Rlc2NyaXB0b3JzX2dldChnYnBzeSk7Cit9CisKK3N0YXRpYyBpbnQgZ2JfcG93ZXJfc3VwcGx5X2VuYWJsZShzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5ICpnYnBzeSkKK3sKKwlpbnQgcmV0OworCisJLyogZ3VhcmFudGVlIHRoYXQgd2UgaGF2ZSBhbiB1bmlxdWUgbmFtZSwgYmVmb3JlIHJlZ2lzdGVyICovCisJcmV0ID0gIF9fZ2JfcG93ZXJfc3VwcGx5X3NldF9uYW1lKGdicHN5LT5tb2RlbF9uYW1lLCBnYnBzeS0+bmFtZSwKKwkJCQkJICBzaXplb2YoZ2Jwc3ktPm5hbWUpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW11dGV4X2luaXQoJmdicHN5LT5zdXBwbHlfbG9jayk7CisKKwlyZXQgPSBnYl9wb3dlcl9zdXBwbHlfcmVnaXN0ZXIoZ2Jwc3kpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZ2Jwc3ktPnVwZGF0ZV9pbnRlcnZhbCA9IHVwZGF0ZV9pbnRlcnZhbF9pbml0OworCUlOSVRfREVMQVlFRF9XT1JLKCZnYnBzeS0+d29yaywgZ2JfcG93ZXJfc3VwcGx5X3dvcmspOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZ2Jwc3ktPndvcmssIDApOworCisJLyogZXZlcnl0aGluZyB3ZW50IGZpbmUsIG1hcmsgaXQgZm9yIHJlbGVhc2UgY29kZSB0byBrbm93ICovCisJZ2Jwc3ktPnJlZ2lzdGVyZWQgPSB0cnVlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2JfcG93ZXJfc3VwcGxpZXNfc2V0dXAoc3RydWN0IGdiX3Bvd2VyX3N1cHBsaWVzICpzdXBwbGllcykKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IHN1cHBsaWVzLT5jb25uZWN0aW9uOworCWludCByZXQ7CisJaW50IGk7CisKKwltdXRleF9sb2NrKCZzdXBwbGllcy0+c3VwcGxpZXNfbG9jayk7CisKKwlyZXQgPSBnYl9wb3dlcl9zdXBwbGllc19nZXRfY291bnQoc3VwcGxpZXMpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXN1cHBsaWVzLT5zdXBwbHkgPSBremFsbG9jKHN1cHBsaWVzLT5zdXBwbGllc19jb3VudCAqCisJCQkJICAgICBzaXplb2Yoc3RydWN0IGdiX3Bvd2VyX3N1cHBseSksCisJCQkJICAgICBHRlBfS0VSTkVMKTsKKworCWlmICghc3VwcGxpZXMtPnN1cHBseSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgc3VwcGxpZXMtPnN1cHBsaWVzX2NvdW50OyBpKyspIHsKKwkJcmV0ID0gZ2JfcG93ZXJfc3VwcGx5X2NvbmZpZyhzdXBwbGllcywgaSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZjb25uZWN0aW9uLT5idW5kbGUtPmRldiwKKwkJCQkiRmFpbCB0byBjb25maWd1cmUgc3VwcGxpZXMgZGV2aWNlc1xuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KK291dDoKKwltdXRleF91bmxvY2soJnN1cHBsaWVzLT5zdXBwbGllc19sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX3Bvd2VyX3N1cHBsaWVzX3JlZ2lzdGVyKHN0cnVjdCBnYl9wb3dlcl9zdXBwbGllcyAqc3VwcGxpZXMpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBzdXBwbGllcy0+Y29ubmVjdGlvbjsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJnN1cHBsaWVzLT5zdXBwbGllc19sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBzdXBwbGllcy0+c3VwcGxpZXNfY291bnQ7IGkrKykgeworCQlyZXQgPSBnYl9wb3dlcl9zdXBwbHlfZW5hYmxlKCZzdXBwbGllcy0+c3VwcGx5W2ldKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2LAorCQkJCSJGYWlsIHRvIGVuYWJsZSBzdXBwbGllcyBkZXZpY2VzXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJbXV0ZXhfdW5sb2NrKCZzdXBwbGllcy0+c3VwcGxpZXNfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9zdXBwbGllc19yZXF1ZXN0X2hhbmRsZXIoc3RydWN0IGdiX29wZXJhdGlvbiAqb3ApCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBvcC0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGxpZXMgKnN1cHBsaWVzID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShjb25uZWN0aW9uKTsKKwlzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5ICpnYnBzeTsKKwlzdHJ1Y3QgZ2JfbWVzc2FnZSAqcmVxdWVzdDsKKwlzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGx5X2V2ZW50X3JlcXVlc3QgKnBheWxvYWQ7CisJdTggcHN5X2lkOworCXU4IGV2ZW50OworCWludCByZXQgPSAwOworCisJaWYgKG9wLT50eXBlICE9IEdCX1BPV0VSX1NVUFBMWV9UWVBFX0VWRU5UKSB7CisJCWRldl9lcnIoJmNvbm5lY3Rpb24tPmJ1bmRsZS0+ZGV2LAorCQkJIlVuc3VwcG9ydGVkIHVuc29saWNpdGVkIGV2ZW50OiAldVxuIiwgb3AtPnR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXF1ZXN0ID0gb3AtPnJlcXVlc3Q7CisKKwlpZiAocmVxdWVzdC0+cGF5bG9hZF9zaXplIDwgc2l6ZW9mKCpwYXlsb2FkKSkgeworCQlkZXZfZXJyKCZjb25uZWN0aW9uLT5idW5kbGUtPmRldiwKKwkJCSJXcm9uZyBldmVudCBzaXplIHJlY2VpdmVkICglenUgPCAlenUpXG4iLAorCQkJcmVxdWVzdC0+cGF5bG9hZF9zaXplLCBzaXplb2YoKnBheWxvYWQpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGF5bG9hZCA9IHJlcXVlc3QtPnBheWxvYWQ7CisJcHN5X2lkID0gcGF5bG9hZC0+cHN5X2lkOworCW11dGV4X2xvY2soJnN1cHBsaWVzLT5zdXBwbGllc19sb2NrKTsKKwlpZiAocHN5X2lkID49IHN1cHBsaWVzLT5zdXBwbGllc19jb3VudCB8fAorCSAgICAhc3VwcGxpZXMtPnN1cHBseVtwc3lfaWRdLnJlZ2lzdGVyZWQpIHsKKwkJZGV2X2VycigmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXYsCisJCQkiRXZlbnQgcmVjZWl2ZWQgZm9yIHVuY29uZmlndXJlZCBwb3dlcl9zdXBwbHkgaWQ6ICVkXG4iLAorCQkJcHN5X2lkKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWV2ZW50ID0gcGF5bG9hZC0+ZXZlbnQ7CisJLyoKKwkgKiB3ZSB3aWxsIG9ubHkgaGFuZGxlIGV2ZW50cyBhZnRlciBzZXR1cCBpcyBkb25lIGFuZCBiZWZvcmUgcmVsZWFzZSBpcworCSAqIHJ1bm5pbmcuIEZvciB0aGF0IGp1c3QgY2hlY2sgdXBkYXRlX2ludGVydmFsLgorCSAqLworCWdicHN5ID0gJnN1cHBsaWVzLT5zdXBwbHlbcHN5X2lkXTsKKwlpZiAoIWdicHN5LT51cGRhdGVfaW50ZXJ2YWwpIHsKKwkJcmV0ID0gLUVTSFVURE9XTjsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWlmIChldmVudCAmIEdCX1BPV0VSX1NVUFBMWV9VUERBVEUpIHsKKwkJLyoKKwkJICogd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgaW52YWxpZGF0ZSBjYWNoZSwgaWYgbm90IG5vIG5ldworCQkgKiB2YWx1ZXMgZm9yIHRoZSBwcm9wZXJ0aWVzIHdpbGwgYmUgZmV0Y2ggYW5kIHRoZSBhbGwgcHJvcG9zZQorCQkgKiBvZiB0aGlzIGV2ZW50IGlzIG1pc3NlZAorCQkgKi8KKwkJZ2Jwc3ktPmNhY2hlX2ludmFsaWQgPSAxOworCQlnYl9wb3dlcl9zdXBwbHlfc3RhdHVzX3VwZGF0ZShnYnBzeSk7CisJfQorCitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmc3VwcGxpZXMtPnN1cHBsaWVzX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfcG93ZXJfc3VwcGx5X3Byb2JlKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSwKKwkJCQkgY29uc3Qgc3RydWN0IGdyZXlidXNfYnVuZGxlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZ3JleWJ1c19kZXNjcmlwdG9yX2Nwb3J0ICpjcG9ydF9kZXNjOworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCXN0cnVjdCBnYl9wb3dlcl9zdXBwbGllcyAqc3VwcGxpZXM7CisJaW50IHJldDsKKworCWlmIChidW5kbGUtPm51bV9jcG9ydHMgIT0gMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljcG9ydF9kZXNjID0gJmJ1bmRsZS0+Y3BvcnRfZGVzY1swXTsKKwlpZiAoY3BvcnRfZGVzYy0+cHJvdG9jb2xfaWQgIT0gR1JFWUJVU19QUk9UT0NPTF9QT1dFUl9TVVBQTFkpCisJCXJldHVybiAtRU5PREVWOworCisJc3VwcGxpZXMgPSBremFsbG9jKHNpemVvZigqc3VwcGxpZXMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN1cHBsaWVzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvbm5lY3Rpb24gPSBnYl9jb25uZWN0aW9uX2NyZWF0ZShidW5kbGUsIGxlMTZfdG9fY3B1KGNwb3J0X2Rlc2MtPmlkKSwKKwkJCQkJICBnYl9zdXBwbGllc19yZXF1ZXN0X2hhbmRsZXIpOworCWlmIChJU19FUlIoY29ubmVjdGlvbikpIHsKKwkJcmV0ID0gUFRSX0VSUihjb25uZWN0aW9uKTsKKwkJZ290byBvdXQ7CisJfQorCisJc3VwcGxpZXMtPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCWdiX2Nvbm5lY3Rpb25fc2V0X2RhdGEoY29ubmVjdGlvbiwgc3VwcGxpZXMpOworCisJbXV0ZXhfaW5pdCgmc3VwcGxpZXMtPnN1cHBsaWVzX2xvY2spOworCisJZ3JleWJ1c19zZXRfZHJ2ZGF0YShidW5kbGUsIHN1cHBsaWVzKTsKKworCS8qIFdlIGFyZW4ndCByZWFkeSB0byByZWNlaXZlIGFuIGluY29taW5nIHJlcXVlc3QgeWV0ICovCisJcmV0ID0gZ2JfY29ubmVjdGlvbl9lbmFibGVfdHgoY29ubmVjdGlvbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9jb25uZWN0aW9uX2Rlc3Ryb3k7CisKKwlyZXQgPSBnYl9wb3dlcl9zdXBwbGllc19zZXR1cChzdXBwbGllcyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3JfY29ubmVjdGlvbl9kaXNhYmxlOworCisJLyogV2UgYXJlIHJlYWR5IHRvIHJlY2VpdmUgYW4gaW5jb21pbmcgcmVxdWVzdCBub3csIGVuYWJsZSBSWCBhcyB3ZWxsICovCisJcmV0ID0gZ2JfY29ubmVjdGlvbl9lbmFibGUoY29ubmVjdGlvbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9jb25uZWN0aW9uX2Rpc2FibGU7CisKKwlyZXQgPSBnYl9wb3dlcl9zdXBwbGllc19yZWdpc3RlcihzdXBwbGllcyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3JfY29ubmVjdGlvbl9kaXNhYmxlOworCisJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoYnVuZGxlKTsKKwlyZXR1cm4gMDsKKworZXJyb3JfY29ubmVjdGlvbl9kaXNhYmxlOgorCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShjb25uZWN0aW9uKTsKK2Vycm9yX2Nvbm5lY3Rpb25fZGVzdHJveToKKwlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koY29ubmVjdGlvbik7CitvdXQ6CisJX2diX3Bvd2VyX3N1cHBsaWVzX3JlbGVhc2Uoc3VwcGxpZXMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGdiX3Bvd2VyX3N1cHBseV9kaXNjb25uZWN0KHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSkKK3sKKwlzdHJ1Y3QgZ2JfcG93ZXJfc3VwcGxpZXMgKnN1cHBsaWVzID0gZ3JleWJ1c19nZXRfZHJ2ZGF0YShidW5kbGUpOworCisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKHN1cHBsaWVzLT5jb25uZWN0aW9uKTsKKwlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koc3VwcGxpZXMtPmNvbm5lY3Rpb24pOworCisJX2diX3Bvd2VyX3N1cHBsaWVzX3JlbGVhc2Uoc3VwcGxpZXMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGdyZXlidXNfYnVuZGxlX2lkIGdiX3Bvd2VyX3N1cHBseV9pZF90YWJsZVtdID0geworCXsgR1JFWUJVU19ERVZJQ0VfQ0xBU1MoR1JFWUJVU19DTEFTU19QT1dFUl9TVVBQTFkpIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShncmV5YnVzLCBnYl9wb3dlcl9zdXBwbHlfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGdyZXlidXNfZHJpdmVyIGdiX3Bvd2VyX3N1cHBseV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInBvd2VyX3N1cHBseSIsCisJLnByb2JlCQk9IGdiX3Bvd2VyX3N1cHBseV9wcm9iZSwKKwkuZGlzY29ubmVjdAk9IGdiX3Bvd2VyX3N1cHBseV9kaXNjb25uZWN0LAorCS5pZF90YWJsZQk9IGdiX3Bvd2VyX3N1cHBseV9pZF90YWJsZSwKK307Cittb2R1bGVfZ3JleWJ1c19kcml2ZXIoZ2JfcG93ZXJfc3VwcGx5X2RyaXZlcik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3B3bS5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvcHdtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRiZjMyOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3B3bS5jCkBAIC0wLDAgKzEsMzM4IEBACisvKgorICogUFdNIEdyZXlidXMgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNCBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcHdtLmg+CisKKyNpbmNsdWRlICJncmV5YnVzLmgiCisjaW5jbHVkZSAiZ2JwaHkuaCIKKworc3RydWN0IGdiX3B3bV9jaGlwIHsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbgkqY29ubmVjdGlvbjsKKwl1OAkJCXB3bV9tYXg7CS8qIG1heCBwd20gbnVtYmVyICovCisKKwlzdHJ1Y3QgcHdtX2NoaXAJCWNoaXA7CisJc3RydWN0IHB3bV9jaGlwCQkqcHdtOworfTsKKyNkZWZpbmUgcHdtX2NoaXBfdG9fZ2JfcHdtX2NoaXAoY2hpcCkgXAorCWNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgZ2JfcHdtX2NoaXAsIGNoaXApCisKKworc3RhdGljIGludCBnYl9wd21fY291bnRfb3BlcmF0aW9uKHN0cnVjdCBnYl9wd21fY2hpcCAqcHdtYykKK3sKKwlzdHJ1Y3QgZ2JfcHdtX2NvdW50X3Jlc3BvbnNlIHJlc3BvbnNlOworCWludCByZXQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhwd21jLT5jb25uZWN0aW9uLCBHQl9QV01fVFlQRV9QV01fQ09VTlQsCisJCQkJTlVMTCwgMCwgJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXB3bWMtPnB3bV9tYXggPSByZXNwb25zZS5jb3VudDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9wd21fYWN0aXZhdGVfb3BlcmF0aW9uKHN0cnVjdCBnYl9wd21fY2hpcCAqcHdtYywKKwkJCQkgICAgIHU4IHdoaWNoKQoreworCXN0cnVjdCBnYl9wd21fYWN0aXZhdGVfcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldjsKKwlpbnQgcmV0OworCisJaWYgKHdoaWNoID4gcHdtYy0+cHdtX21heCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXF1ZXN0LndoaWNoID0gd2hpY2g7CisKKwlnYnBoeV9kZXYgPSB0b19nYnBoeV9kZXYocHdtYy0+Y2hpcC5kZXYpOworCXJldCA9IGdicGh5X3J1bnRpbWVfZ2V0X3N5bmMoZ2JwaHlfZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMocHdtYy0+Y29ubmVjdGlvbiwgR0JfUFdNX1RZUEVfQUNUSVZBVEUsCisJCQkJJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwgTlVMTCwgMCk7CisKKwlnYnBoeV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChnYnBoeV9kZXYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9wd21fZGVhY3RpdmF0ZV9vcGVyYXRpb24oc3RydWN0IGdiX3B3bV9jaGlwICpwd21jLAorCQkJCSAgICAgICB1OCB3aGljaCkKK3sKKwlzdHJ1Y3QgZ2JfcHdtX2RlYWN0aXZhdGVfcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldjsKKwlpbnQgcmV0OworCisJaWYgKHdoaWNoID4gcHdtYy0+cHdtX21heCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXF1ZXN0LndoaWNoID0gd2hpY2g7CisKKwlnYnBoeV9kZXYgPSB0b19nYnBoeV9kZXYocHdtYy0+Y2hpcC5kZXYpOworCXJldCA9IGdicGh5X3J1bnRpbWVfZ2V0X3N5bmMoZ2JwaHlfZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMocHdtYy0+Y29ubmVjdGlvbiwgR0JfUFdNX1RZUEVfREVBQ1RJVkFURSwKKwkJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLCBOVUxMLCAwKTsKKworCWdicGh5X3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGdicGh5X2Rldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX3B3bV9jb25maWdfb3BlcmF0aW9uKHN0cnVjdCBnYl9wd21fY2hpcCAqcHdtYywKKwkJCQkgICB1OCB3aGljaCwgdTMyIGR1dHksIHUzMiBwZXJpb2QpCit7CisJc3RydWN0IGdiX3B3bV9jb25maWdfcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldjsKKwlpbnQgcmV0OworCisJaWYgKHdoaWNoID4gcHdtYy0+cHdtX21heCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXF1ZXN0LndoaWNoID0gd2hpY2g7CisJcmVxdWVzdC5kdXR5ID0gY3B1X3RvX2xlMzIoZHV0eSk7CisJcmVxdWVzdC5wZXJpb2QgPSBjcHVfdG9fbGUzMihwZXJpb2QpOworCisJZ2JwaHlfZGV2ID0gdG9fZ2JwaHlfZGV2KHB3bWMtPmNoaXAuZGV2KTsKKwlyZXQgPSBnYnBoeV9ydW50aW1lX2dldF9zeW5jKGdicGh5X2Rldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKHB3bWMtPmNvbm5lY3Rpb24sIEdCX1BXTV9UWVBFX0NPTkZJRywKKwkJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLCBOVUxMLCAwKTsKKworCWdicGh5X3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGdicGh5X2Rldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX3B3bV9zZXRfcG9sYXJpdHlfb3BlcmF0aW9uKHN0cnVjdCBnYl9wd21fY2hpcCAqcHdtYywKKwkJCQkJIHU4IHdoaWNoLCB1OCBwb2xhcml0eSkKK3sKKwlzdHJ1Y3QgZ2JfcHdtX3BvbGFyaXR5X3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXY7CisJaW50IHJldDsKKworCWlmICh3aGljaCA+IHB3bWMtPnB3bV9tYXgpCisJCXJldHVybiAtRUlOVkFMOworCisJcmVxdWVzdC53aGljaCA9IHdoaWNoOworCXJlcXVlc3QucG9sYXJpdHkgPSBwb2xhcml0eTsKKworCWdicGh5X2RldiA9IHRvX2dicGh5X2Rldihwd21jLT5jaGlwLmRldik7CisJcmV0ID0gZ2JwaHlfcnVudGltZV9nZXRfc3luYyhnYnBoeV9kZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhwd21jLT5jb25uZWN0aW9uLCBHQl9QV01fVFlQRV9QT0xBUklUWSwKKwkJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLCBOVUxMLCAwKTsKKworCWdicGh5X3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGdicGh5X2Rldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX3B3bV9lbmFibGVfb3BlcmF0aW9uKHN0cnVjdCBnYl9wd21fY2hpcCAqcHdtYywKKwkJCQkgICB1OCB3aGljaCkKK3sKKwlzdHJ1Y3QgZ2JfcHdtX2VuYWJsZV9yZXF1ZXN0IHJlcXVlc3Q7CisJc3RydWN0IGdicGh5X2RldmljZSAqZ2JwaHlfZGV2OworCWludCByZXQ7CisKKwlpZiAod2hpY2ggPiBwd21jLT5wd21fbWF4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlcXVlc3Qud2hpY2ggPSB3aGljaDsKKworCWdicGh5X2RldiA9IHRvX2dicGh5X2Rldihwd21jLT5jaGlwLmRldik7CisJcmV0ID0gZ2JwaHlfcnVudGltZV9nZXRfc3luYyhnYnBoeV9kZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhwd21jLT5jb25uZWN0aW9uLCBHQl9QV01fVFlQRV9FTkFCTEUsCisJCQkJJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwgTlVMTCwgMCk7CisJaWYgKHJldCkKKwkJZ2JwaHlfcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoZ2JwaHlfZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfcHdtX2Rpc2FibGVfb3BlcmF0aW9uKHN0cnVjdCBnYl9wd21fY2hpcCAqcHdtYywKKwkJCQkgICAgdTggd2hpY2gpCit7CisJc3RydWN0IGdiX3B3bV9kaXNhYmxlX3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXY7CisJaW50IHJldDsKKworCWlmICh3aGljaCA+IHB3bWMtPnB3bV9tYXgpCisJCXJldHVybiAtRUlOVkFMOworCisJcmVxdWVzdC53aGljaCA9IHdoaWNoOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMocHdtYy0+Y29ubmVjdGlvbiwgR0JfUFdNX1RZUEVfRElTQUJMRSwKKwkJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLCBOVUxMLCAwKTsKKworCWdicGh5X2RldiA9IHRvX2dicGh5X2Rldihwd21jLT5jaGlwLmRldik7CisJZ2JwaHlfcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoZ2JwaHlfZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2JfcHdtX3JlcXVlc3Qoc3RydWN0IHB3bV9jaGlwICpjaGlwLCBzdHJ1Y3QgcHdtX2RldmljZSAqcHdtKQoreworCXN0cnVjdCBnYl9wd21fY2hpcCAqcHdtYyA9IHB3bV9jaGlwX3RvX2diX3B3bV9jaGlwKGNoaXApOworCisJcmV0dXJuIGdiX3B3bV9hY3RpdmF0ZV9vcGVyYXRpb24ocHdtYywgcHdtLT5od3B3bSk7Cit9OworCitzdGF0aWMgdm9pZCBnYl9wd21fZnJlZShzdHJ1Y3QgcHdtX2NoaXAgKmNoaXAsIHN0cnVjdCBwd21fZGV2aWNlICpwd20pCit7CisJc3RydWN0IGdiX3B3bV9jaGlwICpwd21jID0gcHdtX2NoaXBfdG9fZ2JfcHdtX2NoaXAoY2hpcCk7CisKKwlpZiAocHdtX2lzX2VuYWJsZWQocHdtKSkKKwkJZGV2X3dhcm4oY2hpcC0+ZGV2LCAiZnJlZWluZyBQV00gZGV2aWNlIHdpdGhvdXQgZGlzYWJsaW5nXG4iKTsKKworCWdiX3B3bV9kZWFjdGl2YXRlX29wZXJhdGlvbihwd21jLCBwd20tPmh3cHdtKTsKK30KKworc3RhdGljIGludCBnYl9wd21fY29uZmlnKHN0cnVjdCBwd21fY2hpcCAqY2hpcCwgc3RydWN0IHB3bV9kZXZpY2UgKnB3bSwKKwkJCSBpbnQgZHV0eV9ucywgaW50IHBlcmlvZF9ucykKK3sKKwlzdHJ1Y3QgZ2JfcHdtX2NoaXAgKnB3bWMgPSBwd21fY2hpcF90b19nYl9wd21fY2hpcChjaGlwKTsKKworCXJldHVybiBnYl9wd21fY29uZmlnX29wZXJhdGlvbihwd21jLCBwd20tPmh3cHdtLCBkdXR5X25zLCBwZXJpb2RfbnMpOworfTsKKworc3RhdGljIGludCBnYl9wd21fc2V0X3BvbGFyaXR5KHN0cnVjdCBwd21fY2hpcCAqY2hpcCwgc3RydWN0IHB3bV9kZXZpY2UgKnB3bSwKKwkJCSAgICAgICBlbnVtIHB3bV9wb2xhcml0eSBwb2xhcml0eSkKK3sKKwlzdHJ1Y3QgZ2JfcHdtX2NoaXAgKnB3bWMgPSBwd21fY2hpcF90b19nYl9wd21fY2hpcChjaGlwKTsKKworCXJldHVybiBnYl9wd21fc2V0X3BvbGFyaXR5X29wZXJhdGlvbihwd21jLCBwd20tPmh3cHdtLCBwb2xhcml0eSk7Cit9OworCitzdGF0aWMgaW50IGdiX3B3bV9lbmFibGUoc3RydWN0IHB3bV9jaGlwICpjaGlwLCBzdHJ1Y3QgcHdtX2RldmljZSAqcHdtKQoreworCXN0cnVjdCBnYl9wd21fY2hpcCAqcHdtYyA9IHB3bV9jaGlwX3RvX2diX3B3bV9jaGlwKGNoaXApOworCisJcmV0dXJuIGdiX3B3bV9lbmFibGVfb3BlcmF0aW9uKHB3bWMsIHB3bS0+aHdwd20pOworfTsKKworc3RhdGljIHZvaWQgZ2JfcHdtX2Rpc2FibGUoc3RydWN0IHB3bV9jaGlwICpjaGlwLCBzdHJ1Y3QgcHdtX2RldmljZSAqcHdtKQoreworCXN0cnVjdCBnYl9wd21fY2hpcCAqcHdtYyA9IHB3bV9jaGlwX3RvX2diX3B3bV9jaGlwKGNoaXApOworCisJZ2JfcHdtX2Rpc2FibGVfb3BlcmF0aW9uKHB3bWMsIHB3bS0+aHdwd20pOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwd21fb3BzIGdiX3B3bV9vcHMgPSB7CisJLnJlcXVlc3QgPSBnYl9wd21fcmVxdWVzdCwKKwkuZnJlZSA9IGdiX3B3bV9mcmVlLAorCS5jb25maWcgPSBnYl9wd21fY29uZmlnLAorCS5zZXRfcG9sYXJpdHkgPSBnYl9wd21fc2V0X3BvbGFyaXR5LAorCS5lbmFibGUgPSBnYl9wd21fZW5hYmxlLAorCS5kaXNhYmxlID0gZ2JfcHdtX2Rpc2FibGUsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IGdiX3B3bV9wcm9iZShzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXYsCisJCQljb25zdCBzdHJ1Y3QgZ2JwaHlfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfcHdtX2NoaXAgKnB3bWM7CisJc3RydWN0IHB3bV9jaGlwICpwd207CisJaW50IHJldDsKKworCXB3bWMgPSBremFsbG9jKHNpemVvZigqcHdtYyksIEdGUF9LRVJORUwpOworCWlmICghcHdtYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljb25uZWN0aW9uID0gZ2JfY29ubmVjdGlvbl9jcmVhdGUoZ2JwaHlfZGV2LT5idW5kbGUsCisJCQkJCSAgbGUxNl90b19jcHUoZ2JwaHlfZGV2LT5jcG9ydF9kZXNjLT5pZCksCisJCQkJCSAgTlVMTCk7CisJaWYgKElTX0VSUihjb25uZWN0aW9uKSkgeworCQlyZXQgPSBQVFJfRVJSKGNvbm5lY3Rpb24pOworCQlnb3RvIGV4aXRfcHdtY19mcmVlOworCX0KKworCXB3bWMtPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCWdiX2Nvbm5lY3Rpb25fc2V0X2RhdGEoY29ubmVjdGlvbiwgcHdtYyk7CisJZ2JfZ2JwaHlfc2V0X2RhdGEoZ2JwaHlfZGV2LCBwd21jKTsKKworCXJldCA9IGdiX2Nvbm5lY3Rpb25fZW5hYmxlKGNvbm5lY3Rpb24pOworCWlmIChyZXQpCisJCWdvdG8gZXhpdF9jb25uZWN0aW9uX2Rlc3Ryb3k7CisKKwkvKiBRdWVyeSBudW1iZXIgb2YgcHdtcyBwcmVzZW50ICovCisJcmV0ID0gZ2JfcHdtX2NvdW50X29wZXJhdGlvbihwd21jKTsKKwlpZiAocmV0KQorCQlnb3RvIGV4aXRfY29ubmVjdGlvbl9kaXNhYmxlOworCisJcHdtID0gJnB3bWMtPmNoaXA7CisKKwlwd20tPmRldiA9ICZnYnBoeV9kZXYtPmRldjsKKwlwd20tPm9wcyA9ICZnYl9wd21fb3BzOworCXB3bS0+YmFzZSA9IC0xOwkJCS8qIEFsbG9jYXRlIGJhc2UgZHluYW1pY2FsbHkgKi8KKwlwd20tPm5wd20gPSBwd21jLT5wd21fbWF4ICsgMTsKKwlwd20tPmNhbl9zbGVlcCA9IHRydWU7CQkvKiBGSVhNRSAqLworCisJcmV0ID0gcHdtY2hpcF9hZGQocHdtKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmdicGh5X2Rldi0+ZGV2LAorCQkJImZhaWxlZCB0byByZWdpc3RlciBQV006ICVkXG4iLCByZXQpOworCQlnb3RvIGV4aXRfY29ubmVjdGlvbl9kaXNhYmxlOworCX0KKworCWdicGh5X3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGdicGh5X2Rldik7CisJcmV0dXJuIDA7CisKK2V4aXRfY29ubmVjdGlvbl9kaXNhYmxlOgorCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShjb25uZWN0aW9uKTsKK2V4aXRfY29ubmVjdGlvbl9kZXN0cm95OgorCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShjb25uZWN0aW9uKTsKK2V4aXRfcHdtY19mcmVlOgorCWtmcmVlKHB3bWMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGdiX3B3bV9yZW1vdmUoc3RydWN0IGdicGh5X2RldmljZSAqZ2JwaHlfZGV2KQoreworCXN0cnVjdCBnYl9wd21fY2hpcCAqcHdtYyA9IGdiX2dicGh5X2dldF9kYXRhKGdicGh5X2Rldik7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBwd21jLT5jb25uZWN0aW9uOworCWludCByZXQ7CisKKwlyZXQgPSBnYnBoeV9ydW50aW1lX2dldF9zeW5jKGdicGh5X2Rldik7CisJaWYgKHJldCkKKwkJZ2JwaHlfcnVudGltZV9nZXRfbm9yZXN1bWUoZ2JwaHlfZGV2KTsKKworCXB3bWNoaXBfcmVtb3ZlKCZwd21jLT5jaGlwKTsKKwlnYl9jb25uZWN0aW9uX2Rpc2FibGUoY29ubmVjdGlvbik7CisJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGNvbm5lY3Rpb24pOworCWtmcmVlKHB3bWMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGdicGh5X2RldmljZV9pZCBnYl9wd21faWRfdGFibGVbXSA9IHsKKwl7IEdCUEhZX1BST1RPQ09MKEdSRVlCVVNfUFJPVE9DT0xfUFdNKSB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGdicGh5LCBnYl9wd21faWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGdicGh5X2RyaXZlciBwd21fZHJpdmVyID0geworCS5uYW1lCQk9ICJwd20iLAorCS5wcm9iZQkJPSBnYl9wd21fcHJvYmUsCisJLnJlbW92ZQkJPSBnYl9wd21fcmVtb3ZlLAorCS5pZF90YWJsZQk9IGdiX3B3bV9pZF90YWJsZSwKK307CisKK21vZHVsZV9nYnBoeV9kcml2ZXIocHdtX2RyaXZlcik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9yYXcuYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3Jhdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyOWQyNTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9yYXcuYwpAQCAtMCwwICsxLDM4MSBAQAorLyoKKyAqIEdyZXlidXMgZHJpdmVyIGZvciB0aGUgUmF3IHByb3RvY29sCisgKgorICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE1IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2l6ZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJncmV5YnVzLmgiCisKK3N0cnVjdCBnYl9yYXcgeworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWludCBsaXN0X2RhdGE7CisJc3RydWN0IG11dGV4IGxpc3RfbG9jazsKKwlkZXZfdCBkZXY7CisJc3RydWN0IGNkZXYgY2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXZpY2U7Cit9OworCitzdHJ1Y3QgcmF3X2RhdGEgeworCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CisJdTMyIGxlbjsKKwl1OCBkYXRhWzBdOworfTsKKworc3RhdGljIHN0cnVjdCBjbGFzcyAqcmF3X2NsYXNzOworc3RhdGljIGludCByYXdfbWFqb3I7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByYXdfZm9wczsKK3N0YXRpYyBERUZJTkVfSURBKG1pbm9ycyk7CisKKy8qIE51bWJlciBvZiBtaW5vciBkZXZpY2VzIHRoaXMgZHJpdmVyIHN1cHBvcnRzICovCisjZGVmaW5lIE5VTV9NSU5PUlMJMjU2CisKKy8qIE1heGltdW0gc2l6ZSBvZiBhbnkgb25lIHNlbmQgZGF0YSBidWZmZXIgd2Ugc3VwcG9ydCAqLworI2RlZmluZSBNQVhfUEFDS0VUX1NJWkUJKFBBR0VfU0laRSAqIDIpCisKKy8qCisgKiBNYXhpbXVtIHNpemUgb2YgdGhlIGRhdGEgaW4gdGhlIHJlY2VpdmUgYnVmZmVyIHdlIGFsbG93IGJlZm9yZSB3ZSBzdGFydCB0bworICogZHJvcCBtZXNzYWdlcyBvbiB0aGUgZmxvb3IKKyAqLworI2RlZmluZSBNQVhfREFUQV9TSVpFCShNQVhfUEFDS0VUX1NJWkUgKiA4KQorCisvKgorICogQWRkIHRoZSByYXcgZGF0YSBtZXNzYWdlIHRvIHRoZSBsaXN0IG9mIHJlY2VpdmVkIG1lc3NhZ2VzLgorICovCitzdGF0aWMgaW50IHJlY2VpdmVfZGF0YShzdHJ1Y3QgZ2JfcmF3ICpyYXcsIHUzMiBsZW4sIHU4ICpkYXRhKQoreworCXN0cnVjdCByYXdfZGF0YSAqcmF3X2RhdGE7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnJhdy0+Y29ubmVjdGlvbi0+YnVuZGxlLT5kZXY7CisJaW50IHJldHZhbCA9IDA7CisKKwlpZiAobGVuID4gTUFYX1BBQ0tFVF9TSVpFKSB7CisJCWRldl9lcnIoZGV2LCAiVG9vIGJpZyBvZiBhIGRhdGEgcGFja2V0LCByZWplY3RlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW11dGV4X2xvY2soJnJhdy0+bGlzdF9sb2NrKTsKKwlpZiAoKHJhdy0+bGlzdF9kYXRhICsgbGVuKSA+IE1BWF9EQVRBX1NJWkUpIHsKKwkJZGV2X2VycihkZXYsICJUb28gbXVjaCBkYXRhIGluIHJlY2VpdmUgYnVmZmVyLCBub3cgZHJvcHBpbmcgcGFja2V0c1xuIik7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlyYXdfZGF0YSA9IGttYWxsb2Moc2l6ZW9mKCpyYXdfZGF0YSkgKyBsZW4sIEdGUF9LRVJORUwpOworCWlmICghcmF3X2RhdGEpIHsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKworCXJhdy0+bGlzdF9kYXRhICs9IGxlbjsKKwlyYXdfZGF0YS0+bGVuID0gbGVuOworCW1lbWNweSgmcmF3X2RhdGEtPmRhdGFbMF0sIGRhdGEsIGxlbik7CisKKwlsaXN0X2FkZF90YWlsKCZyYXdfZGF0YS0+ZW50cnksICZyYXctPmxpc3QpOworZXhpdDoKKwltdXRleF91bmxvY2soJnJhdy0+bGlzdF9sb2NrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGdiX3Jhd19yZXF1ZXN0X2hhbmRsZXIoc3RydWN0IGdiX29wZXJhdGlvbiAqb3ApCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBvcC0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY29ubmVjdGlvbi0+YnVuZGxlLT5kZXY7CisJc3RydWN0IGdiX3JhdyAqcmF3ID0gZ3JleWJ1c19nZXRfZHJ2ZGF0YShjb25uZWN0aW9uLT5idW5kbGUpOworCXN0cnVjdCBnYl9yYXdfc2VuZF9yZXF1ZXN0ICpyZWNlaXZlOworCXUzMiBsZW47CisKKwlpZiAob3AtPnR5cGUgIT0gR0JfUkFXX1RZUEVfU0VORCkgeworCQlkZXZfZXJyKGRldiwgInVua25vd24gcmVxdWVzdCB0eXBlIDB4JTAyeFxuIiwgb3AtPnR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBWZXJpZnkgc2l6ZSBvZiBwYXlsb2FkICovCisJaWYgKG9wLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUgPCBzaXplb2YoKnJlY2VpdmUpKSB7CisJCWRldl9lcnIoZGV2LCAicmF3IHJlY2VpdmUgcmVxdWVzdCB0b28gc21hbGwgKCV6dSA8ICV6dSlcbiIsCisJCQlvcC0+cmVxdWVzdC0+cGF5bG9hZF9zaXplLCBzaXplb2YoKnJlY2VpdmUpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJlY2VpdmUgPSBvcC0+cmVxdWVzdC0+cGF5bG9hZDsKKwlsZW4gPSBsZTMyX3RvX2NwdShyZWNlaXZlLT5sZW4pOworCWlmIChsZW4gIT0gKGludCkob3AtPnJlcXVlc3QtPnBheWxvYWRfc2l6ZSAtIHNpemVvZihfX2xlMzIpKSkgeworCQlkZXZfZXJyKGRldiwgInJhdyByZWNlaXZlIHJlcXVlc3Qgd3Jvbmcgc2l6ZSAlZCB2cyAlZFxuIiwgbGVuLAorCQkJKGludCkob3AtPnJlcXVlc3QtPnBheWxvYWRfc2l6ZSAtIHNpemVvZihfX2xlMzIpKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAobGVuID09IDApIHsKKwkJZGV2X2VycihkZXYsICJyYXcgcmVjZWl2ZSByZXF1ZXN0IG9mIDAgYnl0ZXM/XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJlY2VpdmVfZGF0YShyYXcsIGxlbiwgcmVjZWl2ZS0+ZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgZ2JfcmF3X3NlbmQoc3RydWN0IGdiX3JhdyAqcmF3LCB1MzIgbGVuLCBjb25zdCBjaGFyIF9fdXNlciAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IHJhdy0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfcmF3X3NlbmRfcmVxdWVzdCAqcmVxdWVzdDsKKwlpbnQgcmV0dmFsOworCisJcmVxdWVzdCA9IGttYWxsb2MobGVuICsgc2l6ZW9mKCpyZXF1ZXN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXF1ZXN0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxdWVzdC0+ZGF0YVswXSwgZGF0YSwgbGVuKSkgeworCQlrZnJlZShyZXF1ZXN0KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmVxdWVzdC0+bGVuID0gY3B1X3RvX2xlMzIobGVuKTsKKworCXJldHZhbCA9IGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sIEdCX1JBV19UWVBFX1NFTkQsCisJCQkJICAgcmVxdWVzdCwgbGVuICsgc2l6ZW9mKCpyZXF1ZXN0KSwKKwkJCQkgICBOVUxMLCAwKTsKKworCWtmcmVlKHJlcXVlc3QpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZ2JfcmF3X3Byb2JlKHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSwKKwkJCWNvbnN0IHN0cnVjdCBncmV5YnVzX2J1bmRsZV9pZCAqaWQpCit7CisJc3RydWN0IGdyZXlidXNfZGVzY3JpcHRvcl9jcG9ydCAqY3BvcnRfZGVzYzsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfcmF3ICpyYXc7CisJaW50IHJldHZhbDsKKwlpbnQgbWlub3I7CisKKwlpZiAoYnVuZGxlLT5udW1fY3BvcnRzICE9IDEpCisJCXJldHVybiAtRU5PREVWOworCisJY3BvcnRfZGVzYyA9ICZidW5kbGUtPmNwb3J0X2Rlc2NbMF07CisJaWYgKGNwb3J0X2Rlc2MtPnByb3RvY29sX2lkICE9IEdSRVlCVVNfUFJPVE9DT0xfUkFXKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJhdyA9IGt6YWxsb2Moc2l6ZW9mKCpyYXcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJhdykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljb25uZWN0aW9uID0gZ2JfY29ubmVjdGlvbl9jcmVhdGUoYnVuZGxlLCBsZTE2X3RvX2NwdShjcG9ydF9kZXNjLT5pZCksCisJCQkJCSAgZ2JfcmF3X3JlcXVlc3RfaGFuZGxlcik7CisJaWYgKElTX0VSUihjb25uZWN0aW9uKSkgeworCQlyZXR2YWwgPSBQVFJfRVJSKGNvbm5lY3Rpb24pOworCQlnb3RvIGVycm9yX2ZyZWU7CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJnJhdy0+bGlzdCk7CisJbXV0ZXhfaW5pdCgmcmF3LT5saXN0X2xvY2spOworCisJcmF3LT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKwlncmV5YnVzX3NldF9kcnZkYXRhKGJ1bmRsZSwgcmF3KTsKKworCW1pbm9yID0gaWRhX3NpbXBsZV9nZXQoJm1pbm9ycywgMCwgMCwgR0ZQX0tFUk5FTCk7CisJaWYgKG1pbm9yIDwgMCkgeworCQlyZXR2YWwgPSBtaW5vcjsKKwkJZ290byBlcnJvcl9jb25uZWN0aW9uX2Rlc3Ryb3k7CisJfQorCisJcmF3LT5kZXYgPSBNS0RFVihyYXdfbWFqb3IsIG1pbm9yKTsKKwljZGV2X2luaXQoJnJhdy0+Y2RldiwgJnJhd19mb3BzKTsKKworCXJldHZhbCA9IGdiX2Nvbm5lY3Rpb25fZW5hYmxlKGNvbm5lY3Rpb24pOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3JfcmVtb3ZlX2lkYTsKKworCXJldHZhbCA9IGNkZXZfYWRkKCZyYXctPmNkZXYsIHJhdy0+ZGV2LCAxKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm9yX2Nvbm5lY3Rpb25fZGlzYWJsZTsKKworCXJhdy0+ZGV2aWNlID0gZGV2aWNlX2NyZWF0ZShyYXdfY2xhc3MsICZjb25uZWN0aW9uLT5idW5kbGUtPmRldiwKKwkJCQkgICAgcmF3LT5kZXYsIHJhdywgImdiIXJhdyVkIiwgbWlub3IpOworCWlmIChJU19FUlIocmF3LT5kZXZpY2UpKSB7CisJCXJldHZhbCA9IFBUUl9FUlIocmF3LT5kZXZpY2UpOworCQlnb3RvIGVycm9yX2RlbF9jZGV2OworCX0KKworCXJldHVybiAwOworCitlcnJvcl9kZWxfY2RldjoKKwljZGV2X2RlbCgmcmF3LT5jZGV2KTsKKworZXJyb3JfY29ubmVjdGlvbl9kaXNhYmxlOgorCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShjb25uZWN0aW9uKTsKKworZXJyb3JfcmVtb3ZlX2lkYToKKwlpZGFfc2ltcGxlX3JlbW92ZSgmbWlub3JzLCBtaW5vcik7CisKK2Vycm9yX2Nvbm5lY3Rpb25fZGVzdHJveToKKwlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koY29ubmVjdGlvbik7CisKK2Vycm9yX2ZyZWU6CisJa2ZyZWUocmF3KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBnYl9yYXdfZGlzY29ubmVjdChzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUpCit7CisJc3RydWN0IGdiX3JhdyAqcmF3ID0gZ3JleWJ1c19nZXRfZHJ2ZGF0YShidW5kbGUpOworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gcmF3LT5jb25uZWN0aW9uOworCXN0cnVjdCByYXdfZGF0YSAqcmF3X2RhdGE7CisJc3RydWN0IHJhd19kYXRhICp0ZW1wOworCisJLy8gRklYTUUgLSBoYW5kbGUgcmVtb3ZpbmcgYSBjb25uZWN0aW9uIHdoZW4gdGhlIGNoYXIgZGV2aWNlIG5vZGUgaXMgb3Blbi4KKwlkZXZpY2VfZGVzdHJveShyYXdfY2xhc3MsIHJhdy0+ZGV2KTsKKwljZGV2X2RlbCgmcmF3LT5jZGV2KTsKKwlnYl9jb25uZWN0aW9uX2Rpc2FibGUoY29ubmVjdGlvbik7CisJaWRhX3NpbXBsZV9yZW1vdmUoJm1pbm9ycywgTUlOT1IocmF3LT5kZXYpKTsKKwlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koY29ubmVjdGlvbik7CisKKwltdXRleF9sb2NrKCZyYXctPmxpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJhd19kYXRhLCB0ZW1wLCAmcmF3LT5saXN0LCBlbnRyeSkgeworCQlsaXN0X2RlbCgmcmF3X2RhdGEtPmVudHJ5KTsKKwkJa2ZyZWUocmF3X2RhdGEpOworCX0KKwltdXRleF91bmxvY2soJnJhdy0+bGlzdF9sb2NrKTsKKworCWtmcmVlKHJhdyk7Cit9CisKKy8qCisgKiBDaGFyYWN0ZXIgZGV2aWNlIG5vZGUgaW50ZXJmYWNlcy4KKyAqCisgKiBOb3RlLCB3ZSBhcmUgdXNpbmcgcmVhZC93cml0ZSB0byBvbmx5IGFsbG93IGEgc2luZ2xlIHJlYWQvd3JpdGUgcGVyIG1lc3NhZ2UuCisgKiBUaGlzIG1lYW5zIGZvciByZWFkKCksIHlvdSBoYXZlIHRvIHByb3ZpZGUgYSBiaWcgZW5vdWdoIGJ1ZmZlciBmb3IgdGhlIGZ1bGwKKyAqIG1lc3NhZ2UgdG8gYmUgY29waWVkIGludG8uICBJZiB0aGUgYnVmZmVyIGlzbid0IGJpZyBlbm91Z2gsIHRoZSByZWFkKCkgd2lsbAorICogZmFpbCB3aXRoIC1FTk9TUEMuCisgKi8KKworc3RhdGljIGludCByYXdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgY2RldiAqY2RldiA9IGlub2RlLT5pX2NkZXY7CisJc3RydWN0IGdiX3JhdyAqcmF3ID0gY29udGFpbmVyX29mKGNkZXYsIHN0cnVjdCBnYl9yYXcsIGNkZXYpOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gcmF3OworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCByYXdfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGdiX3JhdyAqcmF3ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXR2YWw7CisKKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gMDsKKworCWlmIChjb3VudCA+IE1BWF9QQUNLRVRfU0laRSkKKwkJcmV0dXJuIC1FMkJJRzsKKworCXJldHZhbCA9IGdiX3Jhd19zZW5kKHJhdywgY291bnQsIGJ1Zik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgcmF3X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKKwkJCWxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZ2JfcmF3ICpyYXcgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IHJhd19kYXRhICpyYXdfZGF0YTsKKworCW11dGV4X2xvY2soJnJhdy0+bGlzdF9sb2NrKTsKKwlpZiAobGlzdF9lbXB0eSgmcmF3LT5saXN0KSkKKwkJZ290byBleGl0OworCisJcmF3X2RhdGEgPSBsaXN0X2ZpcnN0X2VudHJ5KCZyYXctPmxpc3QsIHN0cnVjdCByYXdfZGF0YSwgZW50cnkpOworCWlmIChyYXdfZGF0YS0+bGVuID4gY291bnQpIHsKKwkJcmV0dmFsID0gLUVOT1NQQzsKKwkJZ290byBleGl0OworCX0KKworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmcmF3X2RhdGEtPmRhdGFbMF0sIHJhd19kYXRhLT5sZW4pKSB7CisJCXJldHZhbCA9IC1FRkFVTFQ7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlsaXN0X2RlbCgmcmF3X2RhdGEtPmVudHJ5KTsKKwlyYXctPmxpc3RfZGF0YSAtPSByYXdfZGF0YS0+bGVuOworCXJldHZhbCA9IHJhd19kYXRhLT5sZW47CisJa2ZyZWUocmF3X2RhdGEpOworCitleGl0OgorCW11dGV4X3VubG9jaygmcmF3LT5saXN0X2xvY2spOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJhd19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkud3JpdGUJCT0gcmF3X3dyaXRlLAorCS5yZWFkCQk9IHJhd19yZWFkLAorCS5vcGVuCQk9IHJhd19vcGVuLAorCS5sbHNlZWsJCT0gbm9vcF9sbHNlZWssCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGdyZXlidXNfYnVuZGxlX2lkIGdiX3Jhd19pZF90YWJsZVtdID0geworCXsgR1JFWUJVU19ERVZJQ0VfQ0xBU1MoR1JFWUJVU19DTEFTU19SQVcpIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShncmV5YnVzLCBnYl9yYXdfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGdyZXlidXNfZHJpdmVyIGdiX3Jhd19kcml2ZXIgPSB7CisJLm5hbWUJCT0gInJhdyIsCisJLnByb2JlCQk9IGdiX3Jhd19wcm9iZSwKKwkuZGlzY29ubmVjdAk9IGdiX3Jhd19kaXNjb25uZWN0LAorCS5pZF90YWJsZQk9IGdiX3Jhd19pZF90YWJsZSwKK307CisKK3N0YXRpYyBpbnQgcmF3X2luaXQodm9pZCkKK3sKKwlkZXZfdCBkZXY7CisJaW50IHJldHZhbDsKKworCXJhd19jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgImdiX3JhdyIpOworCWlmIChJU19FUlIocmF3X2NsYXNzKSkgeworCQlyZXR2YWwgPSBQVFJfRVJSKHJhd19jbGFzcyk7CisJCWdvdG8gZXJyb3JfY2xhc3M7CisJfQorCisJcmV0dmFsID0gYWxsb2NfY2hyZGV2X3JlZ2lvbigmZGV2LCAwLCBOVU1fTUlOT1JTLCAiZ2JfcmF3Iik7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gZXJyb3JfY2hyZGV2OworCisJcmF3X21ham9yID0gTUFKT1IoZGV2KTsKKworCXJldHZhbCA9IGdyZXlidXNfcmVnaXN0ZXIoJmdiX3Jhd19kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3JfZ2I7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfZ2I6CisJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGRldiwgTlVNX01JTk9SUyk7CitlcnJvcl9jaHJkZXY6CisJY2xhc3NfZGVzdHJveShyYXdfY2xhc3MpOworZXJyb3JfY2xhc3M6CisJcmV0dXJuIHJldHZhbDsKK30KK21vZHVsZV9pbml0KHJhd19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHJhd19leGl0KHZvaWQpCit7CisJZ3JleWJ1c19kZXJlZ2lzdGVyKCZnYl9yYXdfZHJpdmVyKTsKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYocmF3X21ham9yLCAwKSwgTlVNX01JTk9SUyk7CisJY2xhc3NfZGVzdHJveShyYXdfY2xhc3MpOworCWlkYV9kZXN0cm95KCZtaW5vcnMpOworfQorbW9kdWxlX2V4aXQocmF3X2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9zZGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9zZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY0OWVmMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3NkaW8uYwpAQCAtMCwwICsxLDg4NCBAQAorLyoKKyAqIFNEL01NQyBHcmV5YnVzIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE1IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNC0yMDE1IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tbWMvbW1jLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2luY2x1ZGUgImdyZXlidXMuaCIKKyNpbmNsdWRlICJnYnBoeS5oIgorCitzdHJ1Y3QgZ2Jfc2Rpb19ob3N0IHsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbgkqY29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JwaHlfZGV2aWNlCSpnYnBoeV9kZXY7CisJc3RydWN0IG1tY19ob3N0CQkqbW1jOworCXN0cnVjdCBtbWNfcmVxdWVzdAkqbXJxOworCXN0cnVjdCBtdXRleAkJbG9jazsJLyogbG9jayBmb3IgdGhpcyBob3N0ICovCisJc2l6ZV90CQkJZGF0YV9tYXg7CisJc3BpbmxvY2tfdAkJeGZlcjsJLyogbG9jayB0byBjYW5jZWwgb25nb2luZyB0cmFuc2ZlciAqLworCWJvb2wJCQl4ZmVyX3N0b3A7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJKm1ycV93b3JrcXVldWU7CisJc3RydWN0IHdvcmtfc3RydWN0CW1ycXdvcms7CisJdTgJCQlxdWV1ZWRfZXZlbnRzOworCWJvb2wJCQlyZW1vdmVkOworCWJvb2wJCQljYXJkX3ByZXNlbnQ7CisJYm9vbAkJCXJlYWRfb25seTsKK307CisKKworI2RlZmluZSBHQl9TRElPX1JTUF9SMV9SNV9SNl9SNwkoR0JfU0RJT19SU1BfUFJFU0VOVCB8IEdCX1NESU9fUlNQX0NSQyB8IFwKKwkJCQkgR0JfU0RJT19SU1BfT1BDT0RFKQorI2RlZmluZSBHQl9TRElPX1JTUF9SM19SNAkoR0JfU0RJT19SU1BfUFJFU0VOVCkKKyNkZWZpbmUgR0JfU0RJT19SU1BfUjIJCShHQl9TRElPX1JTUF9QUkVTRU5UIHwgR0JfU0RJT19SU1BfQ1JDIHwgXAorCQkJCSBHQl9TRElPX1JTUF8xMzYpCisjZGVmaW5lIEdCX1NESU9fUlNQX1IxQgkJKEdCX1NESU9fUlNQX1BSRVNFTlQgfCBHQl9TRElPX1JTUF9DUkMgfCBcCisJCQkJIEdCX1NESU9fUlNQX09QQ09ERSB8IEdCX1NESU9fUlNQX0JVU1kpCisKKy8qIGtlcm5lbCB2ZGQgc3RhcnRzIGF0IDB4ODAgYW5kIHdlIG5lZWQgdG8gdHJhbnNsYXRlIHRvIGdyZXlidXMgb25lcyAweDAxICovCisjZGVmaW5lIEdCX1NESU9fVkREX1NISUZUCTgKKworI2lmbmRlZiBNTUNfQ0FQMl9DT1JFX1JVTlRJTUVfUE0KKyNkZWZpbmUgTU1DX0NBUDJfQ09SRV9SVU5USU1FX1BNCTAKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGJvb2wgc2luZ2xlX29wKHN0cnVjdCBtbWNfY29tbWFuZCAqY21kKQoreworCXVpbnQzMl90IG9wY29kZSA9IGNtZC0+b3Bjb2RlOworCisJcmV0dXJuIG9wY29kZSA9PSBNTUNfV1JJVEVfQkxPQ0sgfHwKKwkgICAgICAgb3Bjb2RlID09IE1NQ19SRUFEX1NJTkdMRV9CTE9DSzsKK30KKworc3RhdGljIHZvaWQgX2diX3NkaW9fc2V0X2hvc3RfY2FwcyhzdHJ1Y3QgZ2Jfc2Rpb19ob3N0ICpob3N0LCB1MzIgcikKK3sKKwl1MzIgY2FwcyA9IDA7CisJdTMyIGNhcHMyID0gMDsKKworCWNhcHMgPSAoKHIgJiBHQl9TRElPX0NBUF9OT05SRU1PVkFCTEUpID8gTU1DX0NBUF9OT05SRU1PVkFCTEUgOiAwKSB8CisJCSgociAmIEdCX1NESU9fQ0FQXzRfQklUX0RBVEEpID8gTU1DX0NBUF80X0JJVF9EQVRBIDogMCkgfAorCQkoKHIgJiBHQl9TRElPX0NBUF84X0JJVF9EQVRBKSA/IE1NQ19DQVBfOF9CSVRfREFUQSA6IDApIHwKKwkJKChyICYgR0JfU0RJT19DQVBfTU1DX0hTKSA/IE1NQ19DQVBfTU1DX0hJR0hTUEVFRCA6IDApIHwKKwkJKChyICYgR0JfU0RJT19DQVBfU0RfSFMpID8gTU1DX0NBUF9TRF9ISUdIU1BFRUQgOiAwKSB8CisJCSgociAmIEdCX1NESU9fQ0FQX0VSQVNFKSA/IE1NQ19DQVBfRVJBU0UgOiAwKSB8CisJCSgociAmIEdCX1NESU9fQ0FQXzFfMlZfRERSKSA/IE1NQ19DQVBfMV8yVl9ERFIgOiAwKSB8CisJCSgociAmIEdCX1NESU9fQ0FQXzFfOFZfRERSKSA/IE1NQ19DQVBfMV84Vl9ERFIgOiAwKSB8CisJCSgociAmIEdCX1NESU9fQ0FQX1BPV0VSX09GRl9DQVJEKSA/IE1NQ19DQVBfUE9XRVJfT0ZGX0NBUkQgOiAwKSB8CisJCSgociAmIEdCX1NESU9fQ0FQX1VIU19TRFIxMikgPyBNTUNfQ0FQX1VIU19TRFIxMiA6IDApIHwKKwkJKChyICYgR0JfU0RJT19DQVBfVUhTX1NEUjI1KSA/IE1NQ19DQVBfVUhTX1NEUjI1IDogMCkgfAorCQkoKHIgJiBHQl9TRElPX0NBUF9VSFNfU0RSNTApID8gTU1DX0NBUF9VSFNfU0RSNTAgOiAwKSB8CisJCSgociAmIEdCX1NESU9fQ0FQX1VIU19TRFIxMDQpID8gTU1DX0NBUF9VSFNfU0RSMTA0IDogMCkgfAorCQkoKHIgJiBHQl9TRElPX0NBUF9VSFNfRERSNTApID8gTU1DX0NBUF9VSFNfRERSNTAgOiAwKSB8CisJCSgociAmIEdCX1NESU9fQ0FQX0RSSVZFUl9UWVBFX0EpID8gTU1DX0NBUF9EUklWRVJfVFlQRV9BIDogMCkgfAorCQkoKHIgJiBHQl9TRElPX0NBUF9EUklWRVJfVFlQRV9DKSA/IE1NQ19DQVBfRFJJVkVSX1RZUEVfQyA6IDApIHwKKwkJKChyICYgR0JfU0RJT19DQVBfRFJJVkVSX1RZUEVfRCkgPyBNTUNfQ0FQX0RSSVZFUl9UWVBFX0QgOiAwKTsKKworCWNhcHMyID0gKChyICYgR0JfU0RJT19DQVBfSFMyMDBfMV8yVikgPyBNTUNfQ0FQMl9IUzIwMF8xXzJWX1NEUiA6IDApIHwKKwkJKChyICYgR0JfU0RJT19DQVBfSFM0MDBfMV8yVikgPyBNTUNfQ0FQMl9IUzQwMF8xXzJWIDogMCkgfAorCQkoKHIgJiBHQl9TRElPX0NBUF9IUzQwMF8xXzhWKSA/IE1NQ19DQVAyX0hTNDAwXzFfOFYgOiAwKSB8CisJCSgociAmIEdCX1NESU9fQ0FQX0hTMjAwXzFfOFYpID8gTU1DX0NBUDJfSFMyMDBfMV84Vl9TRFIgOiAwKTsKKworCWhvc3QtPm1tYy0+Y2FwcyA9IGNhcHM7CisJaG9zdC0+bW1jLT5jYXBzMiA9IGNhcHMyIHwgTU1DX0NBUDJfQ09SRV9SVU5USU1FX1BNOworCisJaWYgKGNhcHMgJiBNTUNfQ0FQX05PTlJFTU9WQUJMRSkKKwkJaG9zdC0+Y2FyZF9wcmVzZW50ID0gdHJ1ZTsKK30KKworc3RhdGljIHUzMiBfZ2Jfc2Rpb19nZXRfaG9zdF9vY3IodTMyIG9jcikKK3sKKwlyZXR1cm4gKCgob2NyICYgR0JfU0RJT19WRERfMTY1XzE5NSkgPyBNTUNfVkREXzE2NV8xOTUgOiAwKSB8CisJCSgob2NyICYgR0JfU0RJT19WRERfMjBfMjEpID8gTU1DX1ZERF8yMF8yMSA6IDApIHwKKwkJKChvY3IgJiBHQl9TRElPX1ZERF8yMV8yMikgPyBNTUNfVkREXzIxXzIyIDogMCkgfAorCQkoKG9jciAmIEdCX1NESU9fVkREXzIyXzIzKSA/IE1NQ19WRERfMjJfMjMgOiAwKSB8CisJCSgob2NyICYgR0JfU0RJT19WRERfMjNfMjQpID8gTU1DX1ZERF8yM18yNCA6IDApIHwKKwkJKChvY3IgJiBHQl9TRElPX1ZERF8yNF8yNSkgPyBNTUNfVkREXzI0XzI1IDogMCkgfAorCQkoKG9jciAmIEdCX1NESU9fVkREXzI1XzI2KSA/IE1NQ19WRERfMjVfMjYgOiAwKSB8CisJCSgob2NyICYgR0JfU0RJT19WRERfMjZfMjcpID8gTU1DX1ZERF8yNl8yNyA6IDApIHwKKwkJKChvY3IgJiBHQl9TRElPX1ZERF8yN18yOCkgPyBNTUNfVkREXzI3XzI4IDogMCkgfAorCQkoKG9jciAmIEdCX1NESU9fVkREXzI4XzI5KSA/IE1NQ19WRERfMjhfMjkgOiAwKSB8CisJCSgob2NyICYgR0JfU0RJT19WRERfMjlfMzApID8gTU1DX1ZERF8yOV8zMCA6IDApIHwKKwkJKChvY3IgJiBHQl9TRElPX1ZERF8zMF8zMSkgPyBNTUNfVkREXzMwXzMxIDogMCkgfAorCQkoKG9jciAmIEdCX1NESU9fVkREXzMxXzMyKSA/IE1NQ19WRERfMzFfMzIgOiAwKSB8CisJCSgob2NyICYgR0JfU0RJT19WRERfMzJfMzMpID8gTU1DX1ZERF8zMl8zMyA6IDApIHwKKwkJKChvY3IgJiBHQl9TRElPX1ZERF8zM18zNCkgPyBNTUNfVkREXzMzXzM0IDogMCkgfAorCQkoKG9jciAmIEdCX1NESU9fVkREXzM0XzM1KSA/IE1NQ19WRERfMzRfMzUgOiAwKSB8CisJCSgob2NyICYgR0JfU0RJT19WRERfMzVfMzYpID8gTU1DX1ZERF8zNV8zNiA6IDApCisJCSk7Cit9CisKK3N0YXRpYyBpbnQgZ2Jfc2Rpb19nZXRfY2FwcyhzdHJ1Y3QgZ2Jfc2Rpb19ob3N0ICpob3N0KQoreworCXN0cnVjdCBnYl9zZGlvX2dldF9jYXBzX3Jlc3BvbnNlIHJlc3BvbnNlOworCXN0cnVjdCBtbWNfaG9zdCAqbW1jID0gaG9zdC0+bW1jOworCXUxNiBkYXRhX21heDsKKwl1MzIgYmxrc3o7CisJdTMyIG9jcjsKKwl1MzIgcjsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoaG9zdC0+Y29ubmVjdGlvbiwgR0JfU0RJT19UWVBFX0dFVF9DQVBBQklMSVRJRVMsCisJCQkJTlVMTCwgMCwgJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyID0gbGUzMl90b19jcHUocmVzcG9uc2UuY2Fwcyk7CisKKwlfZ2Jfc2Rpb19zZXRfaG9zdF9jYXBzKGhvc3QsIHIpOworCisJLyogZ2V0IHRoZSBtYXggYmxvY2sgc2l6ZSB0aGF0IGNvdWxkIGZpdCBvdXIgcGF5bG9hZCAqLworCWRhdGFfbWF4ID0gZ2Jfb3BlcmF0aW9uX2dldF9wYXlsb2FkX3NpemVfbWF4KGhvc3QtPmNvbm5lY3Rpb24pOworCWRhdGFfbWF4ID0gbWluKGRhdGFfbWF4IC0gc2l6ZW9mKHN0cnVjdCBnYl9zZGlvX3RyYW5zZmVyX3JlcXVlc3QpLAorCQkgICAgICAgZGF0YV9tYXggLSBzaXplb2Yoc3RydWN0IGdiX3NkaW9fdHJhbnNmZXJfcmVzcG9uc2UpKTsKKworCWJsa3N6ID0gbWluX3QodTE2LCBsZTE2X3RvX2NwdShyZXNwb25zZS5tYXhfYmxrX3NpemUpLCBkYXRhX21heCk7CisJYmxrc3ogPSBtYXhfdCh1MzIsIDUxMiwgYmxrc3opOworCisJbW1jLT5tYXhfYmxrX3NpemUgPSByb3VuZGRvd25fcG93X29mX3R3byhibGtzeik7CisJbW1jLT5tYXhfYmxrX2NvdW50ID0gbGUxNl90b19jcHUocmVzcG9uc2UubWF4X2Jsa19jb3VudCk7CisJaG9zdC0+ZGF0YV9tYXggPSBkYXRhX21heDsKKworCS8qIGdldCBvY3Igc3VwcG9ydGVkIHZhbHVlcyAqLworCW9jciA9IF9nYl9zZGlvX2dldF9ob3N0X29jcihsZTMyX3RvX2NwdShyZXNwb25zZS5vY3IpKTsKKwltbWMtPm9jcl9hdmFpbCA9IG9jcjsKKwltbWMtPm9jcl9hdmFpbF9zZGlvID0gbW1jLT5vY3JfYXZhaWw7CisJbW1jLT5vY3JfYXZhaWxfc2QgPSBtbWMtPm9jcl9hdmFpbDsKKwltbWMtPm9jcl9hdmFpbF9tbWMgPSBtbWMtPm9jcl9hdmFpbDsKKworCS8qIGdldCBmcmVxdWVuY3kgcmFuZ2UgdmFsdWVzICovCisJbW1jLT5mX21pbiA9IGxlMzJfdG9fY3B1KHJlc3BvbnNlLmZfbWluKTsKKwltbWMtPmZfbWF4ID0gbGUzMl90b19jcHUocmVzcG9uc2UuZl9tYXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9nYl9xdWV1ZV9ldmVudChzdHJ1Y3QgZ2Jfc2Rpb19ob3N0ICpob3N0LCB1OCBldmVudCkKK3sKKwlpZiAoZXZlbnQgJiBHQl9TRElPX0NBUkRfSU5TRVJURUQpCisJCWhvc3QtPnF1ZXVlZF9ldmVudHMgJj0gfkdCX1NESU9fQ0FSRF9SRU1PVkVEOworCWVsc2UgaWYgKGV2ZW50ICYgR0JfU0RJT19DQVJEX1JFTU9WRUQpCisJCWhvc3QtPnF1ZXVlZF9ldmVudHMgJj0gfkdCX1NESU9fQ0FSRF9JTlNFUlRFRDsKKworCWhvc3QtPnF1ZXVlZF9ldmVudHMgfD0gZXZlbnQ7Cit9CisKK3N0YXRpYyBpbnQgX2diX3NkaW9fcHJvY2Vzc19ldmVudHMoc3RydWN0IGdiX3NkaW9faG9zdCAqaG9zdCwgdTggZXZlbnQpCit7CisJdTggc3RhdGVfY2hhbmdlZCA9IDA7CisKKwlpZiAoZXZlbnQgJiBHQl9TRElPX0NBUkRfSU5TRVJURUQpIHsKKwkJaWYgKGhvc3QtPm1tYy0+Y2FwcyAmIE1NQ19DQVBfTk9OUkVNT1ZBQkxFKQorCQkJcmV0dXJuIDA7CisJCWlmIChob3N0LT5jYXJkX3ByZXNlbnQpCisJCQlyZXR1cm4gMDsKKwkJaG9zdC0+Y2FyZF9wcmVzZW50ID0gdHJ1ZTsKKwkJc3RhdGVfY2hhbmdlZCA9IDE7CisJfQorCisJaWYgKGV2ZW50ICYgR0JfU0RJT19DQVJEX1JFTU9WRUQpIHsKKwkJaWYgKGhvc3QtPm1tYy0+Y2FwcyAmIE1NQ19DQVBfTk9OUkVNT1ZBQkxFKQorCQkJcmV0dXJuIDA7CisJCWlmICghKGhvc3QtPmNhcmRfcHJlc2VudCkpCisJCQlyZXR1cm4gMDsKKwkJaG9zdC0+Y2FyZF9wcmVzZW50ID0gZmFsc2U7CisJCXN0YXRlX2NoYW5nZWQgPSAxOworCX0KKworCWlmIChldmVudCAmIEdCX1NESU9fV1ApIHsKKwkJaG9zdC0+cmVhZF9vbmx5ID0gdHJ1ZTsKKwl9CisKKwlpZiAoc3RhdGVfY2hhbmdlZCkgeworCQlkZXZfaW5mbyhtbWNfZGV2KGhvc3QtPm1tYyksICJjYXJkICVzIG5vdyBldmVudFxuIiwKKwkJCSAoaG9zdC0+Y2FyZF9wcmVzZW50ID8gICJpbnNlcnRlZCIgOiAicmVtb3ZlZCIpKTsKKwkJbW1jX2RldGVjdF9jaGFuZ2UoaG9zdC0+bW1jLCAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9zZGlvX3JlcXVlc3RfaGFuZGxlcihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcCkKK3sKKwlzdHJ1Y3QgZ2Jfc2Rpb19ob3N0ICpob3N0ID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShvcC0+Y29ubmVjdGlvbik7CisJc3RydWN0IGdiX21lc3NhZ2UgKnJlcXVlc3Q7CisJc3RydWN0IGdiX3NkaW9fZXZlbnRfcmVxdWVzdCAqcGF5bG9hZDsKKwl1OCB0eXBlID0gb3AtPnR5cGU7CisJaW50IHJldCA9ICAwOworCXU4IGV2ZW50OworCisJaWYgKHR5cGUgIT0gR0JfU0RJT19UWVBFX0VWRU5UKSB7CisJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLAorCQkJInVuc3VwcG9ydGVkIHVuc29saWNpdGVkIGV2ZW50OiAldVxuIiwgdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlcXVlc3QgPSBvcC0+cmVxdWVzdDsKKworCWlmIChyZXF1ZXN0LT5wYXlsb2FkX3NpemUgPCBzaXplb2YoKnBheWxvYWQpKSB7CisJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLCAid3JvbmcgZXZlbnQgc2l6ZSByZWNlaXZlZCAoJXp1IDwgJXp1KVxuIiwKKwkJCXJlcXVlc3QtPnBheWxvYWRfc2l6ZSwgc2l6ZW9mKCpwYXlsb2FkKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBheWxvYWQgPSByZXF1ZXN0LT5wYXlsb2FkOworCWV2ZW50ID0gcGF5bG9hZC0+ZXZlbnQ7CisKKwlpZiAoaG9zdC0+cmVtb3ZlZCkKKwkJX2diX3F1ZXVlX2V2ZW50KGhvc3QsIGV2ZW50KTsKKwllbHNlCisJCXJldCA9IF9nYl9zZGlvX3Byb2Nlc3NfZXZlbnRzKGhvc3QsIGV2ZW50KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2Jfc2Rpb19zZXRfaW9zKHN0cnVjdCBnYl9zZGlvX2hvc3QgKmhvc3QsCisJCQkgICBzdHJ1Y3QgZ2Jfc2Rpb19zZXRfaW9zX3JlcXVlc3QgKnJlcXVlc3QpCit7CisJaW50IHJldDsKKworCXJldCA9IGdicGh5X3J1bnRpbWVfZ2V0X3N5bmMoaG9zdC0+Z2JwaHlfZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoaG9zdC0+Y29ubmVjdGlvbiwgR0JfU0RJT19UWVBFX1NFVF9JT1MsIHJlcXVlc3QsCisJCQkJc2l6ZW9mKCpyZXF1ZXN0KSwgTlVMTCwgMCk7CisKKwlnYnBoeV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChob3N0LT5nYnBoeV9kZXYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfZ2Jfc2Rpb19zZW5kKHN0cnVjdCBnYl9zZGlvX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSwKKwkJCSBzaXplX3QgbGVuLCB1MTYgbmJsb2Nrcywgb2ZmX3Qgc2tpcCkKK3sKKwlzdHJ1Y3QgZ2Jfc2Rpb190cmFuc2Zlcl9yZXF1ZXN0ICpyZXF1ZXN0OworCXN0cnVjdCBnYl9zZGlvX3RyYW5zZmVyX3Jlc3BvbnNlICpyZXNwb25zZTsKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb247CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IGRhdGEtPnNnOworCXVuc2lnbmVkIGludCBzZ19sZW4gPSBkYXRhLT5zZ19sZW47CisJc2l6ZV90IGNvcGllZDsKKwl1MTYgc2VuZF9ibGtzejsKKwl1MTYgc2VuZF9ibG9ja3M7CisJaW50IHJldDsKKworCVdBUk5fT04obGVuID4gaG9zdC0+ZGF0YV9tYXgpOworCisJb3BlcmF0aW9uID0gZ2Jfb3BlcmF0aW9uX2NyZWF0ZShob3N0LT5jb25uZWN0aW9uLCBHQl9TRElPX1RZUEVfVFJBTlNGRVIsCisJCQkJCWxlbiArIHNpemVvZigqcmVxdWVzdCksCisJCQkJCXNpemVvZigqcmVzcG9uc2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9wZXJhdGlvbikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXF1ZXN0ID0gb3BlcmF0aW9uLT5yZXF1ZXN0LT5wYXlsb2FkOworCXJlcXVlc3QtPmRhdGFfZmxhZ3MgPSAoZGF0YS0+ZmxhZ3MgPj4gOCk7CisJcmVxdWVzdC0+ZGF0YV9ibG9ja3MgPSBjcHVfdG9fbGUxNihuYmxvY2tzKTsKKwlyZXF1ZXN0LT5kYXRhX2Jsa3N6ID0gY3B1X3RvX2xlMTYoZGF0YS0+Ymxrc3opOworCisJY29waWVkID0gc2dfcGNvcHlfdG9fYnVmZmVyKHNnLCBzZ19sZW4sICZyZXF1ZXN0LT5kYXRhWzBdLCBsZW4sIHNraXApOworCisJaWYgKGNvcGllZCAhPSBsZW4pIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfcHV0X29wZXJhdGlvbjsKKwl9CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fcmVxdWVzdF9zZW5kX3N5bmMob3BlcmF0aW9uKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfcHV0X29wZXJhdGlvbjsKKworCXJlc3BvbnNlID0gb3BlcmF0aW9uLT5yZXNwb25zZS0+cGF5bG9hZDsKKworCXNlbmRfYmxvY2tzID0gbGUxNl90b19jcHUocmVzcG9uc2UtPmRhdGFfYmxvY2tzKTsKKwlzZW5kX2Jsa3N6ID0gbGUxNl90b19jcHUocmVzcG9uc2UtPmRhdGFfYmxrc3opOworCisJaWYgKGxlbiAhPSBzZW5kX2Jsa3N6ICogc2VuZF9ibG9ja3MpIHsKKwkJZGV2X2VycihtbWNfZGV2KGhvc3QtPm1tYyksICJzZW5kOiBzaXplIHJlY2VpdmVkOiAlenUgIT0gJWRcbiIsCisJCQlsZW4sIHNlbmRfYmxrc3ogKiBzZW5kX2Jsb2Nrcyk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCitlcnJfcHV0X29wZXJhdGlvbjoKKwlnYl9vcGVyYXRpb25fcHV0KG9wZXJhdGlvbik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9nYl9zZGlvX3JlY3Yoc3RydWN0IGdiX3NkaW9faG9zdCAqaG9zdCwgc3RydWN0IG1tY19kYXRhICpkYXRhLAorCQkJIHNpemVfdCBsZW4sIHUxNiBuYmxvY2tzLCBvZmZfdCBza2lwKQoreworCXN0cnVjdCBnYl9zZGlvX3RyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3Q7CisJc3RydWN0IGdiX3NkaW9fdHJhbnNmZXJfcmVzcG9uc2UgKnJlc3BvbnNlOworCXN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gZGF0YS0+c2c7CisJdW5zaWduZWQgaW50IHNnX2xlbiA9IGRhdGEtPnNnX2xlbjsKKwlzaXplX3QgY29waWVkOworCXUxNiByZWN2X2Jsa3N6OworCXUxNiByZWN2X2Jsb2NrczsKKwlpbnQgcmV0OworCisJV0FSTl9PTihsZW4gPiBob3N0LT5kYXRhX21heCk7CisKKwlvcGVyYXRpb24gPSBnYl9vcGVyYXRpb25fY3JlYXRlKGhvc3QtPmNvbm5lY3Rpb24sIEdCX1NESU9fVFlQRV9UUkFOU0ZFUiwKKwkJCQkJc2l6ZW9mKCpyZXF1ZXN0KSwKKwkJCQkJbGVuICsgc2l6ZW9mKCpyZXNwb25zZSksIEdGUF9LRVJORUwpOworCWlmICghb3BlcmF0aW9uKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcXVlc3QgPSBvcGVyYXRpb24tPnJlcXVlc3QtPnBheWxvYWQ7CisJcmVxdWVzdC0+ZGF0YV9mbGFncyA9IChkYXRhLT5mbGFncyA+PiA4KTsKKwlyZXF1ZXN0LT5kYXRhX2Jsb2NrcyA9IGNwdV90b19sZTE2KG5ibG9ja3MpOworCXJlcXVlc3QtPmRhdGFfYmxrc3ogPSBjcHVfdG9fbGUxNihkYXRhLT5ibGtzeik7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fcmVxdWVzdF9zZW5kX3N5bmMob3BlcmF0aW9uKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfcHV0X29wZXJhdGlvbjsKKworCXJlc3BvbnNlID0gb3BlcmF0aW9uLT5yZXNwb25zZS0+cGF5bG9hZDsKKwlyZWN2X2Jsb2NrcyA9IGxlMTZfdG9fY3B1KHJlc3BvbnNlLT5kYXRhX2Jsb2Nrcyk7CisJcmVjdl9ibGtzeiA9IGxlMTZfdG9fY3B1KHJlc3BvbnNlLT5kYXRhX2Jsa3N6KTsKKworCWlmIChsZW4gIT0gcmVjdl9ibGtzeiAqIHJlY3ZfYmxvY2tzKSB7CisJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLCAicmVjdjogc2l6ZSByZWNlaXZlZDogJWQgIT0gJXp1XG4iLAorCQkJcmVjdl9ibGtzeiAqIHJlY3ZfYmxvY2tzLCBsZW4pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9wdXRfb3BlcmF0aW9uOworCX0KKworCWNvcGllZCA9IHNnX3Bjb3B5X2Zyb21fYnVmZmVyKHNnLCBzZ19sZW4sICZyZXNwb25zZS0+ZGF0YVswXSwgbGVuLAorCQkJCSAgICAgIHNraXApOworCWlmIChjb3BpZWQgIT0gbGVuKQorCQlyZXQgPSAtRUlOVkFMOworCitlcnJfcHV0X29wZXJhdGlvbjoKKwlnYl9vcGVyYXRpb25fcHV0KG9wZXJhdGlvbik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX3NkaW9fdHJhbnNmZXIoc3RydWN0IGdiX3NkaW9faG9zdCAqaG9zdCwgc3RydWN0IG1tY19kYXRhICpkYXRhKQoreworCXNpemVfdCBsZWZ0LCBsZW47CisJb2ZmX3Qgc2tpcCA9IDA7CisJaW50IHJldCA9IDA7CisJdTE2IG5ibG9ja3M7CisKKwlpZiAoc2luZ2xlX29wKGRhdGEtPm1ycS0+Y21kKSAmJiBkYXRhLT5ibG9ja3MgPiAxKSB7CisJCXJldCA9IC1FVElNRURPVVQ7CisJCWdvdG8gb3V0OworCX0KKworCWxlZnQgPSBkYXRhLT5ibGtzeiAqIGRhdGEtPmJsb2NrczsKKworCXdoaWxlIChsZWZ0KSB7CisJCS8qIGNoZWNrIGlzIGEgc3RvcCB0cmFuc21pc3Npb24gaXMgcGVuZGluZyAqLworCQlzcGluX2xvY2soJmhvc3QtPnhmZXIpOworCQlpZiAoaG9zdC0+eGZlcl9zdG9wKSB7CisJCQlob3N0LT54ZmVyX3N0b3AgPSBmYWxzZTsKKwkJCXNwaW5fdW5sb2NrKCZob3N0LT54ZmVyKTsKKwkJCXJldCA9IC1FSU5UUjsKKwkJCWdvdG8gb3V0OworCQl9CisJCXNwaW5fdW5sb2NrKCZob3N0LT54ZmVyKTsKKwkJbGVuID0gbWluKGxlZnQsIGhvc3QtPmRhdGFfbWF4KTsKKwkJbmJsb2NrcyA9IGxlbiAvIGRhdGEtPmJsa3N6OworCQlsZW4gPSBuYmxvY2tzICogZGF0YS0+Ymxrc3o7CisKKwkJaWYgKGRhdGEtPmZsYWdzICYgTU1DX0RBVEFfUkVBRCkgeworCQkJcmV0ID0gX2diX3NkaW9fcmVjdihob3N0LCBkYXRhLCBsZW4sIG5ibG9ja3MsIHNraXApOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBvdXQ7CisJCX0gZWxzZSB7CisJCQlyZXQgPSBfZ2Jfc2Rpb19zZW5kKGhvc3QsIGRhdGEsIGxlbiwgbmJsb2Nrcywgc2tpcCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJfQorCQlkYXRhLT5ieXRlc194ZmVyZWQgKz0gbGVuOworCQlsZWZ0IC09IGxlbjsKKwkJc2tpcCArPSBsZW47CisJfQorCitvdXQ6CisJZGF0YS0+ZXJyb3IgPSByZXQ7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9zZGlvX2NvbW1hbmQoc3RydWN0IGdiX3NkaW9faG9zdCAqaG9zdCwgc3RydWN0IG1tY19jb21tYW5kICpjbWQpCit7CisJc3RydWN0IGdiX3NkaW9fY29tbWFuZF9yZXF1ZXN0IHJlcXVlc3QgPSB7MH07CisJc3RydWN0IGdiX3NkaW9fY29tbWFuZF9yZXNwb25zZSByZXNwb25zZTsKKwlzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEgPSBob3N0LT5tcnEtPmRhdGE7CisJdTggY21kX2ZsYWdzOworCXU4IGNtZF90eXBlOworCWludCBpOworCWludCByZXQ7CisKKwlzd2l0Y2ggKG1tY19yZXNwX3R5cGUoY21kKSkgeworCWNhc2UgTU1DX1JTUF9OT05FOgorCQljbWRfZmxhZ3MgPSBHQl9TRElPX1JTUF9OT05FOworCQlicmVhazsKKwljYXNlIE1NQ19SU1BfUjE6CisJCWNtZF9mbGFncyA9IEdCX1NESU9fUlNQX1IxX1I1X1I2X1I3OworCQlicmVhazsKKwljYXNlIE1NQ19SU1BfUjFCOgorCQljbWRfZmxhZ3MgPSBHQl9TRElPX1JTUF9SMUI7CisJCWJyZWFrOworCWNhc2UgTU1DX1JTUF9SMjoKKwkJY21kX2ZsYWdzID0gR0JfU0RJT19SU1BfUjI7CisJCWJyZWFrOworCWNhc2UgTU1DX1JTUF9SMzoKKwkJY21kX2ZsYWdzID0gR0JfU0RJT19SU1BfUjNfUjQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLCAiY21kIGZsYWcgaW52YWxpZCAweCUwNHhcbiIsCisJCQltbWNfcmVzcF90eXBlKGNtZCkpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlzd2l0Y2ggKG1tY19jbWRfdHlwZShjbWQpKSB7CisJY2FzZSBNTUNfQ01EX0JDOgorCQljbWRfdHlwZSA9IEdCX1NESU9fQ01EX0JDOworCQlicmVhazsKKwljYXNlIE1NQ19DTURfQkNSOgorCQljbWRfdHlwZSA9IEdCX1NESU9fQ01EX0JDUjsKKwkJYnJlYWs7CisJY2FzZSBNTUNfQ01EX0FDOgorCQljbWRfdHlwZSA9IEdCX1NESU9fQ01EX0FDOworCQlicmVhazsKKwljYXNlIE1NQ19DTURfQURUQzoKKwkJY21kX3R5cGUgPSBHQl9TRElPX0NNRF9BRFRDOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKG1tY19kZXYoaG9zdC0+bW1jKSwgImNtZCB0eXBlIGludmFsaWQgMHglMDR4XG4iLAorCQkJbW1jX2NtZF90eXBlKGNtZCkpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXF1ZXN0LmNtZCA9IGNtZC0+b3Bjb2RlOworCXJlcXVlc3QuY21kX2ZsYWdzID0gY21kX2ZsYWdzOworCXJlcXVlc3QuY21kX3R5cGUgPSBjbWRfdHlwZTsKKwlyZXF1ZXN0LmNtZF9hcmcgPSBjcHVfdG9fbGUzMihjbWQtPmFyZyk7CisJLyogc29tZSBjb250cm9sbGVycyBuZWVkIHRvIGtub3cgYXQgY29tbWFuZCB0aW1lIGRhdGEgZGV0YWlscyAqLworCWlmIChkYXRhKSB7CisJCXJlcXVlc3QuZGF0YV9ibG9ja3MgPSBjcHVfdG9fbGUxNihkYXRhLT5ibG9ja3MpOworCQlyZXF1ZXN0LmRhdGFfYmxrc3ogPSBjcHVfdG9fbGUxNihkYXRhLT5ibGtzeik7CisJfQorCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoaG9zdC0+Y29ubmVjdGlvbiwgR0JfU0RJT19UWVBFX0NPTU1BTkQsCisJCQkJJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwgJnJlc3BvbnNlLAorCQkJCXNpemVvZihyZXNwb25zZSkpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIG5vIHJlc3BvbnNlIGV4cGVjdGVkICovCisJaWYgKGNtZF9mbGFncyA9PSBHQl9TRElPX1JTUF9OT05FKQorCQlnb3RvIG91dDsKKworCS8qIGxvbmcgcmVzcG9uc2UgZXhwZWN0ZWQgKi8KKwlpZiAoY21kX2ZsYWdzICYgR0JfU0RJT19SU1BfUjIpCisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCQljbWQtPnJlc3BbaV0gPSBsZTMyX3RvX2NwdShyZXNwb25zZS5yZXNwW2ldKTsKKwllbHNlCisJCWNtZC0+cmVzcFswXSA9IGxlMzJfdG9fY3B1KHJlc3BvbnNlLnJlc3BbMF0pOworCitvdXQ6CisJY21kLT5lcnJvciA9IHJldDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBnYl9zZGlvX21ycV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZ2Jfc2Rpb19ob3N0ICpob3N0OworCXN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxOworCWludCByZXQ7CisKKwlob3N0ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBnYl9zZGlvX2hvc3QsIG1ycXdvcmspOworCisJcmV0ID0gZ2JwaHlfcnVudGltZV9nZXRfc3luYyhob3N0LT5nYnBoeV9kZXYpOworCWlmIChyZXQpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmhvc3QtPmxvY2spOworCW1ycSA9IGhvc3QtPm1ycTsKKwlpZiAoIW1ycSkgeworCQltdXRleF91bmxvY2soJmhvc3QtPmxvY2spOworCQlnYnBoeV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChob3N0LT5nYnBoeV9kZXYpOworCQlkZXZfZXJyKG1tY19kZXYoaG9zdC0+bW1jKSwgIm1tYyByZXF1ZXN0IGlzIE5VTEwiKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChob3N0LT5yZW1vdmVkKSB7CisJCW1ycS0+Y21kLT5lcnJvciA9IC1FU0hVVERPV047CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAobXJxLT5zYmMpIHsKKwkJcmV0ID0gZ2Jfc2Rpb19jb21tYW5kKGhvc3QsIG1ycS0+c2JjKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gZ2Jfc2Rpb19jb21tYW5kKGhvc3QsIG1ycS0+Y21kKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBkb25lOworCisJaWYgKG1ycS0+ZGF0YSkgeworCQlyZXQgPSBnYl9zZGlvX3RyYW5zZmVyKGhvc3QsIG1ycS0+ZGF0YSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBkb25lOworCX0KKworCWlmIChtcnEtPnN0b3ApIHsKKwkJcmV0ID0gZ2Jfc2Rpb19jb21tYW5kKGhvc3QsIG1ycS0+c3RvcCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBkb25lOworCX0KKworZG9uZToKKwlob3N0LT5tcnEgPSBOVUxMOworCW11dGV4X3VubG9jaygmaG9zdC0+bG9jayk7CisJbW1jX3JlcXVlc3RfZG9uZShob3N0LT5tbWMsIG1ycSk7CisJZ2JwaHlfcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoaG9zdC0+Z2JwaHlfZGV2KTsKK30KKworc3RhdGljIHZvaWQgZ2JfbW1jX3JlcXVlc3Qoc3RydWN0IG1tY19ob3N0ICptbWMsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQoreworCXN0cnVjdCBnYl9zZGlvX2hvc3QgKmhvc3QgPSBtbWNfcHJpdihtbWMpOworCXN0cnVjdCBtbWNfY29tbWFuZCAqY21kID0gbXJxLT5jbWQ7CisKKwkvKiBDaGVjayBpZiBpdCBpcyBhIGNhbmNlbCB0byBvbmdvaW5nIHRyYW5zZmVyICovCisJaWYgKGNtZC0+b3Bjb2RlID09IE1NQ19TVE9QX1RSQU5TTUlTU0lPTikgeworCQlzcGluX2xvY2soJmhvc3QtPnhmZXIpOworCQlob3N0LT54ZmVyX3N0b3AgPSB0cnVlOworCQlzcGluX3VubG9jaygmaG9zdC0+eGZlcik7CisJfQorCisJbXV0ZXhfbG9jaygmaG9zdC0+bG9jayk7CisKKwlXQVJOX09OKGhvc3QtPm1ycSk7CisJaG9zdC0+bXJxID0gbXJxOworCisJaWYgKGhvc3QtPnJlbW92ZWQpIHsKKwkJbXJxLT5jbWQtPmVycm9yID0gLUVTSFVURE9XTjsKKwkJZ290byBvdXQ7CisJfQorCWlmICghaG9zdC0+Y2FyZF9wcmVzZW50KSB7CisJCW1ycS0+Y21kLT5lcnJvciA9IC1FTk9NRURJVU07CisJCWdvdG8gb3V0OworCX0KKworCXF1ZXVlX3dvcmsoaG9zdC0+bXJxX3dvcmtxdWV1ZSwgJmhvc3QtPm1ycXdvcmspOworCisJbXV0ZXhfdW5sb2NrKCZob3N0LT5sb2NrKTsKKwlyZXR1cm47CisKK291dDoKKwlob3N0LT5tcnEgPSBOVUxMOworCW11dGV4X3VubG9jaygmaG9zdC0+bG9jayk7CisJbW1jX3JlcXVlc3RfZG9uZShtbWMsIG1ycSk7Cit9CisKK3N0YXRpYyB2b2lkIGdiX21tY19zZXRfaW9zKHN0cnVjdCBtbWNfaG9zdCAqbW1jLCBzdHJ1Y3QgbW1jX2lvcyAqaW9zKQoreworCXN0cnVjdCBnYl9zZGlvX2hvc3QgKmhvc3QgPSBtbWNfcHJpdihtbWMpOworCXN0cnVjdCBnYl9zZGlvX3NldF9pb3NfcmVxdWVzdCByZXF1ZXN0OworCWludCByZXQ7CisJdTggcG93ZXJfbW9kZTsKKwl1OCBidXNfd2lkdGg7CisJdTggdGltaW5nOworCXU4IHNpZ25hbF92b2x0YWdlOworCXU4IGRydl90eXBlOworCXUzMiB2ZGQgPSAwOworCisJbXV0ZXhfbG9jaygmaG9zdC0+bG9jayk7CisJcmVxdWVzdC5jbG9jayA9IGNwdV90b19sZTMyKGlvcy0+Y2xvY2spOworCisJaWYgKGlvcy0+dmRkKQorCQl2ZGQgPSAxIDw8IChpb3MtPnZkZCAtIEdCX1NESU9fVkREX1NISUZUKTsKKwlyZXF1ZXN0LnZkZCA9IGNwdV90b19sZTMyKHZkZCk7CisKKwlyZXF1ZXN0LmJ1c19tb2RlID0gKGlvcy0+YnVzX21vZGUgPT0gTU1DX0JVU01PREVfT1BFTkRSQUlOID8KKwkJCSAgICBHQl9TRElPX0JVU01PREVfT1BFTkRSQUlOIDoKKwkJCSAgICBHQl9TRElPX0JVU01PREVfUFVTSFBVTEwpOworCisJc3dpdGNoIChpb3MtPnBvd2VyX21vZGUpIHsKKwljYXNlIE1NQ19QT1dFUl9PRkY6CisJZGVmYXVsdDoKKwkJcG93ZXJfbW9kZSA9IEdCX1NESU9fUE9XRVJfT0ZGOworCQlicmVhazsKKwljYXNlIE1NQ19QT1dFUl9VUDoKKwkJcG93ZXJfbW9kZSA9IEdCX1NESU9fUE9XRVJfVVA7CisJCWJyZWFrOworCWNhc2UgTU1DX1BPV0VSX09OOgorCQlwb3dlcl9tb2RlID0gR0JfU0RJT19QT1dFUl9PTjsKKwkJYnJlYWs7CisJY2FzZSBNTUNfUE9XRVJfVU5ERUZJTkVEOgorCQlwb3dlcl9tb2RlID0gR0JfU0RJT19QT1dFUl9VTkRFRklORUQ7CisJCWJyZWFrOworCX0KKwlyZXF1ZXN0LnBvd2VyX21vZGUgPSBwb3dlcl9tb2RlOworCisJc3dpdGNoIChpb3MtPmJ1c193aWR0aCkgeworCWNhc2UgTU1DX0JVU19XSURUSF8xOgorCQlidXNfd2lkdGggPSBHQl9TRElPX0JVU19XSURUSF8xOworCQlicmVhazsKKwljYXNlIE1NQ19CVVNfV0lEVEhfNDoKKwlkZWZhdWx0OgorCQlidXNfd2lkdGggPSBHQl9TRElPX0JVU19XSURUSF80OworCQlicmVhazsKKwljYXNlIE1NQ19CVVNfV0lEVEhfODoKKwkJYnVzX3dpZHRoID0gR0JfU0RJT19CVVNfV0lEVEhfODsKKwkJYnJlYWs7CisJfQorCXJlcXVlc3QuYnVzX3dpZHRoID0gYnVzX3dpZHRoOworCisJc3dpdGNoIChpb3MtPnRpbWluZykgeworCWNhc2UgTU1DX1RJTUlOR19MRUdBQ1k6CisJZGVmYXVsdDoKKwkJdGltaW5nID0gR0JfU0RJT19USU1JTkdfTEVHQUNZOworCQlicmVhazsKKwljYXNlIE1NQ19USU1JTkdfTU1DX0hTOgorCQl0aW1pbmcgPSBHQl9TRElPX1RJTUlOR19NTUNfSFM7CisJCWJyZWFrOworCWNhc2UgTU1DX1RJTUlOR19TRF9IUzoKKwkJdGltaW5nID0gR0JfU0RJT19USU1JTkdfU0RfSFM7CisJCWJyZWFrOworCWNhc2UgTU1DX1RJTUlOR19VSFNfU0RSMTI6CisJCXRpbWluZyA9IEdCX1NESU9fVElNSU5HX1VIU19TRFIxMjsKKwkJYnJlYWs7CisJY2FzZSBNTUNfVElNSU5HX1VIU19TRFIyNToKKwkJdGltaW5nID0gR0JfU0RJT19USU1JTkdfVUhTX1NEUjI1OworCQlicmVhazsKKwljYXNlIE1NQ19USU1JTkdfVUhTX1NEUjUwOgorCQl0aW1pbmcgPSBHQl9TRElPX1RJTUlOR19VSFNfU0RSNTA7CisJCWJyZWFrOworCWNhc2UgTU1DX1RJTUlOR19VSFNfU0RSMTA0OgorCQl0aW1pbmcgPSBHQl9TRElPX1RJTUlOR19VSFNfU0RSMTA0OworCQlicmVhazsKKwljYXNlIE1NQ19USU1JTkdfVUhTX0REUjUwOgorCQl0aW1pbmcgPSBHQl9TRElPX1RJTUlOR19VSFNfRERSNTA7CisJCWJyZWFrOworCWNhc2UgTU1DX1RJTUlOR19NTUNfRERSNTI6CisJCXRpbWluZyA9IEdCX1NESU9fVElNSU5HX01NQ19ERFI1MjsKKwkJYnJlYWs7CisJY2FzZSBNTUNfVElNSU5HX01NQ19IUzIwMDoKKwkJdGltaW5nID0gR0JfU0RJT19USU1JTkdfTU1DX0hTMjAwOworCQlicmVhazsKKwljYXNlIE1NQ19USU1JTkdfTU1DX0hTNDAwOgorCQl0aW1pbmcgPSBHQl9TRElPX1RJTUlOR19NTUNfSFM0MDA7CisJCWJyZWFrOworCX0KKwlyZXF1ZXN0LnRpbWluZyA9IHRpbWluZzsKKworCXN3aXRjaCAoaW9zLT5zaWduYWxfdm9sdGFnZSkgeworCWNhc2UgTU1DX1NJR05BTF9WT0xUQUdFXzMzMDoKKwkJc2lnbmFsX3ZvbHRhZ2UgPSBHQl9TRElPX1NJR05BTF9WT0xUQUdFXzMzMDsKKwkJYnJlYWs7CisJY2FzZSBNTUNfU0lHTkFMX1ZPTFRBR0VfMTgwOgorCWRlZmF1bHQ6CisJCXNpZ25hbF92b2x0YWdlID0gR0JfU0RJT19TSUdOQUxfVk9MVEFHRV8xODA7CisJCWJyZWFrOworCWNhc2UgTU1DX1NJR05BTF9WT0xUQUdFXzEyMDoKKwkJc2lnbmFsX3ZvbHRhZ2UgPSBHQl9TRElPX1NJR05BTF9WT0xUQUdFXzEyMDsKKwkJYnJlYWs7CisJfQorCXJlcXVlc3Quc2lnbmFsX3ZvbHRhZ2UgPSBzaWduYWxfdm9sdGFnZTsKKworCXN3aXRjaCAoaW9zLT5kcnZfdHlwZSkgeworCWNhc2UgTU1DX1NFVF9EUklWRVJfVFlQRV9BOgorCQlkcnZfdHlwZSA9IEdCX1NESU9fU0VUX0RSSVZFUl9UWVBFX0E7CisJCWJyZWFrOworCWNhc2UgTU1DX1NFVF9EUklWRVJfVFlQRV9DOgorCQlkcnZfdHlwZSA9IEdCX1NESU9fU0VUX0RSSVZFUl9UWVBFX0M7CisJCWJyZWFrOworCWNhc2UgTU1DX1NFVF9EUklWRVJfVFlQRV9EOgorCQlkcnZfdHlwZSA9IEdCX1NESU9fU0VUX0RSSVZFUl9UWVBFX0Q7CisJCWJyZWFrOworCWNhc2UgTU1DX1NFVF9EUklWRVJfVFlQRV9COgorCWRlZmF1bHQ6CisJCWRydl90eXBlID0gR0JfU0RJT19TRVRfRFJJVkVSX1RZUEVfQjsKKwkJYnJlYWs7CisJfQorCXJlcXVlc3QuZHJ2X3R5cGUgPSBkcnZfdHlwZTsKKworCXJldCA9IGdiX3NkaW9fc2V0X2lvcyhob3N0LCAmcmVxdWVzdCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJbWVtY3B5KCZtbWMtPmlvcywgaW9zLCBzaXplb2YobW1jLT5pb3MpKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmaG9zdC0+bG9jayk7Cit9CisKK3N0YXRpYyBpbnQgZ2JfbW1jX2dldF9ybyhzdHJ1Y3QgbW1jX2hvc3QgKm1tYykKK3sKKwlzdHJ1Y3QgZ2Jfc2Rpb19ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKKworCW11dGV4X2xvY2soJmhvc3QtPmxvY2spOworCWlmIChob3N0LT5yZW1vdmVkKSB7CisJCW11dGV4X3VubG9jaygmaG9zdC0+bG9jayk7CisJCXJldHVybiAtRVNIVVRET1dOOworCX0KKwltdXRleF91bmxvY2soJmhvc3QtPmxvY2spOworCisJcmV0dXJuIGhvc3QtPnJlYWRfb25seTsKK30KKworc3RhdGljIGludCBnYl9tbWNfZ2V0X2NkKHN0cnVjdCBtbWNfaG9zdCAqbW1jKQoreworCXN0cnVjdCBnYl9zZGlvX2hvc3QgKmhvc3QgPSBtbWNfcHJpdihtbWMpOworCisJbXV0ZXhfbG9jaygmaG9zdC0+bG9jayk7CisJaWYgKGhvc3QtPnJlbW92ZWQpIHsKKwkJbXV0ZXhfdW5sb2NrKCZob3N0LT5sb2NrKTsKKwkJcmV0dXJuIC1FU0hVVERPV047CisJfQorCW11dGV4X3VubG9jaygmaG9zdC0+bG9jayk7CisKKwlyZXR1cm4gaG9zdC0+Y2FyZF9wcmVzZW50OworfQorCitzdGF0aWMgaW50IGdiX21tY19zd2l0Y2hfdm9sdGFnZShzdHJ1Y3QgbW1jX2hvc3QgKm1tYywgc3RydWN0IG1tY19pb3MgKmlvcykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBtbWNfaG9zdF9vcHMgZ2Jfc2Rpb19vcHMgPSB7CisJLnJlcXVlc3QJPSBnYl9tbWNfcmVxdWVzdCwKKwkuc2V0X2lvcwk9IGdiX21tY19zZXRfaW9zLAorCS5nZXRfcm8JCT0gZ2JfbW1jX2dldF9ybywKKwkuZ2V0X2NkCQk9IGdiX21tY19nZXRfY2QsCisJLnN0YXJ0X3NpZ25hbF92b2x0YWdlX3N3aXRjaAk9IGdiX21tY19zd2l0Y2hfdm9sdGFnZSwKK307CisKK3N0YXRpYyBpbnQgZ2Jfc2Rpb19wcm9iZShzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXYsCisJCQkgY29uc3Qgc3RydWN0IGdicGh5X2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisJc3RydWN0IG1tY19ob3N0ICptbWM7CisJc3RydWN0IGdiX3NkaW9faG9zdCAqaG9zdDsKKwlpbnQgcmV0ID0gMDsKKworCW1tYyA9IG1tY19hbGxvY19ob3N0KHNpemVvZigqaG9zdCksICZnYnBoeV9kZXYtPmRldik7CisJaWYgKCFtbWMpCisJCXJldHVybiAtRU5PTUVNOworCisJY29ubmVjdGlvbiA9IGdiX2Nvbm5lY3Rpb25fY3JlYXRlKGdicGh5X2Rldi0+YnVuZGxlLAorCQkJCQkgIGxlMTZfdG9fY3B1KGdicGh5X2Rldi0+Y3BvcnRfZGVzYy0+aWQpLAorCQkJCQkgIGdiX3NkaW9fcmVxdWVzdF9oYW5kbGVyKTsKKwlpZiAoSVNfRVJSKGNvbm5lY3Rpb24pKSB7CisJCXJldCA9IFBUUl9FUlIoY29ubmVjdGlvbik7CisJCWdvdG8gZXhpdF9tbWNfZnJlZTsKKwl9CisKKwlob3N0ID0gbW1jX3ByaXYobW1jKTsKKwlob3N0LT5tbWMgPSBtbWM7CisJaG9zdC0+cmVtb3ZlZCA9IHRydWU7CisKKwlob3N0LT5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKwlnYl9jb25uZWN0aW9uX3NldF9kYXRhKGNvbm5lY3Rpb24sIGhvc3QpOworCWhvc3QtPmdicGh5X2RldiA9IGdicGh5X2RldjsKKwlnYl9nYnBoeV9zZXRfZGF0YShnYnBoeV9kZXYsIGhvc3QpOworCisJcmV0ID0gZ2JfY29ubmVjdGlvbl9lbmFibGVfdHgoY29ubmVjdGlvbik7CisJaWYgKHJldCkKKwkJZ290byBleGl0X2Nvbm5lY3Rpb25fZGVzdHJveTsKKworCXJldCA9IGdiX3NkaW9fZ2V0X2NhcHMoaG9zdCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXhpdF9jb25uZWN0aW9uX2Rpc2FibGU7CisKKwltbWMtPm9wcyA9ICZnYl9zZGlvX29wczsKKworCW1tYy0+bWF4X3NlZ3MgPSBob3N0LT5tbWMtPm1heF9ibGtfY291bnQ7CisKKwkvKiBmb3Igbm93IHdlIG1ha2UgYSBtYXAgMToxIGJldHdlZW4gbWF4IHJlcXVlc3QgYW5kIHNlZ21lbnQgc2l6ZSAqLworCW1tYy0+bWF4X3JlcV9zaXplID0gbW1jLT5tYXhfYmxrX3NpemUgKiBtbWMtPm1heF9ibGtfY291bnQ7CisJbW1jLT5tYXhfc2VnX3NpemUgPSBtbWMtPm1heF9yZXFfc2l6ZTsKKworCW11dGV4X2luaXQoJmhvc3QtPmxvY2spOworCXNwaW5fbG9ja19pbml0KCZob3N0LT54ZmVyKTsKKwlob3N0LT5tcnFfd29ya3F1ZXVlID0gYWxsb2Nfd29ya3F1ZXVlKCJtbWMtJXMiLCAwLCAxLAorCQkJCQkgICAgICBkZXZfbmFtZSgmZ2JwaHlfZGV2LT5kZXYpKTsKKwlpZiAoIWhvc3QtPm1ycV93b3JrcXVldWUpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBleGl0X2Nvbm5lY3Rpb25fZGlzYWJsZTsKKwl9CisJSU5JVF9XT1JLKCZob3N0LT5tcnF3b3JrLCBnYl9zZGlvX21ycV93b3JrKTsKKworCXJldCA9IGdiX2Nvbm5lY3Rpb25fZW5hYmxlKGNvbm5lY3Rpb24pOworCWlmIChyZXQpCisJCWdvdG8gZXhpdF93cV9kZXN0cm95OworCisJcmV0ID0gbW1jX2FkZF9ob3N0KG1tYyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXhpdF93cV9kZXN0cm95OworCWhvc3QtPnJlbW92ZWQgPSBmYWxzZTsKKwlyZXQgPSBfZ2Jfc2Rpb19wcm9jZXNzX2V2ZW50cyhob3N0LCBob3N0LT5xdWV1ZWRfZXZlbnRzKTsKKwlob3N0LT5xdWV1ZWRfZXZlbnRzID0gMDsKKworCWdicGh5X3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGdicGh5X2Rldik7CisKKwlyZXR1cm4gcmV0OworCitleGl0X3dxX2Rlc3Ryb3k6CisJZGVzdHJveV93b3JrcXVldWUoaG9zdC0+bXJxX3dvcmtxdWV1ZSk7CitleGl0X2Nvbm5lY3Rpb25fZGlzYWJsZToKKwlnYl9jb25uZWN0aW9uX2Rpc2FibGUoY29ubmVjdGlvbik7CitleGl0X2Nvbm5lY3Rpb25fZGVzdHJveToKKwlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koY29ubmVjdGlvbik7CitleGl0X21tY19mcmVlOgorCW1tY19mcmVlX2hvc3QobW1jKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGdiX3NkaW9fcmVtb3ZlKHN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldikKK3sKKwlzdHJ1Y3QgZ2Jfc2Rpb19ob3N0ICpob3N0ID0gZ2JfZ2JwaHlfZ2V0X2RhdGEoZ2JwaHlfZGV2KTsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGhvc3QtPmNvbm5lY3Rpb247CisJc3RydWN0IG1tY19ob3N0ICptbWM7CisJaW50IHJldDsKKworCXJldCA9IGdicGh5X3J1bnRpbWVfZ2V0X3N5bmMoZ2JwaHlfZGV2KTsKKwlpZiAocmV0KQorCQlnYnBoeV9ydW50aW1lX2dldF9ub3Jlc3VtZShnYnBoeV9kZXYpOworCisJbXV0ZXhfbG9jaygmaG9zdC0+bG9jayk7CisJaG9zdC0+cmVtb3ZlZCA9IHRydWU7CisJbW1jID0gaG9zdC0+bW1jOworCWdiX2Nvbm5lY3Rpb25fc2V0X2RhdGEoY29ubmVjdGlvbiwgTlVMTCk7CisJbXV0ZXhfdW5sb2NrKCZob3N0LT5sb2NrKTsKKworCWZsdXNoX3dvcmtxdWV1ZShob3N0LT5tcnFfd29ya3F1ZXVlKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShob3N0LT5tcnFfd29ya3F1ZXVlKTsKKwlnYl9jb25uZWN0aW9uX2Rpc2FibGVfcngoY29ubmVjdGlvbik7CisJbW1jX3JlbW92ZV9ob3N0KG1tYyk7CisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGNvbm5lY3Rpb24pOworCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShjb25uZWN0aW9uKTsKKwltbWNfZnJlZV9ob3N0KG1tYyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ2JwaHlfZGV2aWNlX2lkIGdiX3NkaW9faWRfdGFibGVbXSA9IHsKKwl7IEdCUEhZX1BST1RPQ09MKEdSRVlCVVNfUFJPVE9DT0xfU0RJTykgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShnYnBoeSwgZ2Jfc2Rpb19pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZ2JwaHlfZHJpdmVyIHNkaW9fZHJpdmVyID0geworCS5uYW1lCQk9ICJzZGlvIiwKKwkucHJvYmUJCT0gZ2Jfc2Rpb19wcm9iZSwKKwkucmVtb3ZlCQk9IGdiX3NkaW9fcmVtb3ZlLAorCS5pZF90YWJsZQk9IGdiX3NkaW9faWRfdGFibGUsCit9OworCittb2R1bGVfZ2JwaHlfZHJpdmVyKHNkaW9fZHJpdmVyKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3NwaS5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg5MzU1MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3NwaS5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBTUEkgYnJpZGdlIFBIWSBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IDIwMTQtMjAxNiBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTQtMjAxNiBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgImdyZXlidXMuaCIKKyNpbmNsdWRlICJnYnBoeS5oIgorI2luY2x1ZGUgInNwaWxpYi5oIgorCitzdGF0aWMgc3RydWN0IHNwaWxpYl9vcHMgKnNwaWxpYl9vcHM7CisKK3N0YXRpYyBpbnQgZ2Jfc3BpX3Byb2JlKHN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldiwKKwkJCWNvbnN0IHN0cnVjdCBnYnBoeV9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCWludCByZXQ7CisKKwljb25uZWN0aW9uID0gZ2JfY29ubmVjdGlvbl9jcmVhdGUoZ2JwaHlfZGV2LT5idW5kbGUsCisJCQkJCSAgbGUxNl90b19jcHUoZ2JwaHlfZGV2LT5jcG9ydF9kZXNjLT5pZCksCisJCQkJCSAgTlVMTCk7CisJaWYgKElTX0VSUihjb25uZWN0aW9uKSkKKwkJcmV0dXJuIFBUUl9FUlIoY29ubmVjdGlvbik7CisKKwlyZXQgPSBnYl9jb25uZWN0aW9uX2VuYWJsZShjb25uZWN0aW9uKTsKKwlpZiAocmV0KQorCQlnb3RvIGV4aXRfY29ubmVjdGlvbl9kZXN0cm95OworCisJcmV0ID0gZ2Jfc3BpbGliX21hc3Rlcl9pbml0KGNvbm5lY3Rpb24sICZnYnBoeV9kZXYtPmRldiwgc3BpbGliX29wcyk7CisJaWYgKHJldCkKKwkJZ290byBleGl0X2Nvbm5lY3Rpb25fZGlzYWJsZTsKKworCWdiX2dicGh5X3NldF9kYXRhKGdicGh5X2RldiwgY29ubmVjdGlvbik7CisKKwlnYnBoeV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChnYnBoeV9kZXYpOworCXJldHVybiAwOworCitleGl0X2Nvbm5lY3Rpb25fZGlzYWJsZToKKwlnYl9jb25uZWN0aW9uX2Rpc2FibGUoY29ubmVjdGlvbik7CitleGl0X2Nvbm5lY3Rpb25fZGVzdHJveToKKwlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koY29ubmVjdGlvbik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBnYl9zcGlfcmVtb3ZlKHN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldikKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IGdiX2dicGh5X2dldF9kYXRhKGdicGh5X2Rldik7CisJaW50IHJldDsKKworCXJldCA9IGdicGh5X3J1bnRpbWVfZ2V0X3N5bmMoZ2JwaHlfZGV2KTsKKwlpZiAocmV0KQorCQlnYnBoeV9ydW50aW1lX2dldF9ub3Jlc3VtZShnYnBoeV9kZXYpOworCisJZ2Jfc3BpbGliX21hc3Rlcl9leGl0KGNvbm5lY3Rpb24pOworCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShjb25uZWN0aW9uKTsKKwlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koY29ubmVjdGlvbik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ2JwaHlfZGV2aWNlX2lkIGdiX3NwaV9pZF90YWJsZVtdID0geworCXsgR0JQSFlfUFJPVE9DT0woR1JFWUJVU19QUk9UT0NPTF9TUEkpIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoZ2JwaHksIGdiX3NwaV9pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZ2JwaHlfZHJpdmVyIHNwaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInNwaSIsCisJLnByb2JlCQk9IGdiX3NwaV9wcm9iZSwKKwkucmVtb3ZlCQk9IGdiX3NwaV9yZW1vdmUsCisJLmlkX3RhYmxlCT0gZ2Jfc3BpX2lkX3RhYmxlLAorfTsKKworbW9kdWxlX2dicGh5X2RyaXZlcihzcGlfZHJpdmVyKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3NwaWxpYi5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvc3BpbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk3YjE5MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3NwaWxpYi5jCkBAIC0wLDAgKzEsNTY1IEBACisvKgorICogR3JleWJ1cyBTUEkgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAyMDE0LTIwMTYgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE0LTIwMTYgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKworI2luY2x1ZGUgImdyZXlidXMuaCIKKyNpbmNsdWRlICJzcGlsaWIuaCIKKworc3RydWN0IGdiX3NwaWxpYiB7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24JKmNvbm5lY3Rpb247CisJc3RydWN0IGRldmljZQkJKnBhcmVudDsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCSpmaXJzdF94ZmVyOworCXN0cnVjdCBzcGlfdHJhbnNmZXIJKmxhc3RfeGZlcjsKKwlzdHJ1Y3Qgc3BpbGliX29wcwkqb3BzOworCXUzMgkJCXJ4X3hmZXJfb2Zmc2V0OworCXUzMgkJCXR4X3hmZXJfb2Zmc2V0OworCXUzMgkJCWxhc3RfeGZlcl9zaXplOworCXVuc2lnbmVkIGludAkJb3BfdGltZW91dDsKKwl1MTYJCQltb2RlOworCXUxNgkJCWZsYWdzOworCXUzMgkJCWJpdHNfcGVyX3dvcmRfbWFzazsKKwl1OAkJCW51bV9jaGlwc2VsZWN0OworCXUzMgkJCW1pbl9zcGVlZF9oejsKKwl1MzIJCQltYXhfc3BlZWRfaHo7Cit9OworCisjZGVmaW5lIEdCX1NQSV9TVEFURV9NU0dfRE9ORQkJKCh2b2lkICopMCkKKyNkZWZpbmUgR0JfU1BJX1NUQVRFX01TR19JRExFCQkoKHZvaWQgKikxKQorI2RlZmluZSBHQl9TUElfU1RBVEVfTVNHX1JVTk5JTkcJKCh2b2lkICopMikKKyNkZWZpbmUgR0JfU1BJX1NUQVRFX09QX1JFQURZCQkoKHZvaWQgKikzKQorI2RlZmluZSBHQl9TUElfU1RBVEVfT1BfRE9ORQkJKCh2b2lkICopNCkKKyNkZWZpbmUgR0JfU1BJX1NUQVRFX01TR19FUlJPUgkJKCh2b2lkICopLTEpCisKKyNkZWZpbmUgWEZFUl9USU1FT1VUX1RPTEVSQU5DRQkJMjAwCisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX21hc3RlciAqZ2V0X21hc3Rlcl9mcm9tX3NwaShzdHJ1Y3QgZ2Jfc3BpbGliICpzcGkpCit7CisJcmV0dXJuIGdiX2Nvbm5lY3Rpb25fZ2V0X2RhdGEoc3BpLT5jb25uZWN0aW9uKTsKK30KKworc3RhdGljIGludCB0eF9oZWFkZXJfZml0X29wZXJhdGlvbih1MzIgdHhfc2l6ZSwgdTMyIGNvdW50LCBzaXplX3QgZGF0YV9tYXgpCit7CisJc2l6ZV90IGhlYWRlcnNfc2l6ZTsKKworCWRhdGFfbWF4IC09IHNpemVvZihzdHJ1Y3QgZ2Jfc3BpX3RyYW5zZmVyX3JlcXVlc3QpOworCWhlYWRlcnNfc2l6ZSA9IChjb3VudCArIDEpICogc2l6ZW9mKHN0cnVjdCBnYl9zcGlfdHJhbnNmZXIpOworCisJcmV0dXJuIHR4X3NpemUgKyBoZWFkZXJzX3NpemUgPiBkYXRhX21heCA/IDAgOiAxOworfQorCitzdGF0aWMgc2l6ZV90IGNhbGNfcnhfeGZlcl9zaXplKHUzMiByeF9zaXplLCB1MzIgKnR4X3hmZXJfc2l6ZSwgdTMyIGxlbiwKKwkJCQlzaXplX3QgZGF0YV9tYXgpCit7CisJc2l6ZV90IHJ4X3hmZXJfc2l6ZTsKKworCWRhdGFfbWF4IC09IHNpemVvZihzdHJ1Y3QgZ2Jfc3BpX3RyYW5zZmVyX3Jlc3BvbnNlKTsKKworCWlmIChyeF9zaXplICsgbGVuID4gZGF0YV9tYXgpCisJCXJ4X3hmZXJfc2l6ZSA9IGRhdGFfbWF4IC0gcnhfc2l6ZTsKKwllbHNlCisJCXJ4X3hmZXJfc2l6ZSA9IGxlbjsKKworCS8qIGlmIHRoaXMgaXMgYSB3cml0ZV9yZWFkLCBmb3Igc3ltbWV0cnkgcmVhZCB0aGUgc2FtZSBhcyB3cml0ZSAqLworCWlmICgqdHhfeGZlcl9zaXplICYmIHJ4X3hmZXJfc2l6ZSA+ICp0eF94ZmVyX3NpemUpCisJCXJ4X3hmZXJfc2l6ZSA9ICp0eF94ZmVyX3NpemU7CisJaWYgKCp0eF94ZmVyX3NpemUgJiYgcnhfeGZlcl9zaXplIDwgKnR4X3hmZXJfc2l6ZSkKKwkJKnR4X3hmZXJfc2l6ZSA9IHJ4X3hmZXJfc2l6ZTsKKworCXJldHVybiByeF94ZmVyX3NpemU7Cit9CisKK3N0YXRpYyBzaXplX3QgY2FsY190eF94ZmVyX3NpemUodTMyIHR4X3NpemUsIHUzMiBjb3VudCwgc2l6ZV90IGxlbiwKKwkJCQlzaXplX3QgZGF0YV9tYXgpCit7CisJc2l6ZV90IGhlYWRlcnNfc2l6ZTsKKworCWRhdGFfbWF4IC09IHNpemVvZihzdHJ1Y3QgZ2Jfc3BpX3RyYW5zZmVyX3JlcXVlc3QpOworCWhlYWRlcnNfc2l6ZSA9IChjb3VudCArIDEpICogc2l6ZW9mKHN0cnVjdCBnYl9zcGlfdHJhbnNmZXIpOworCisJaWYgKHR4X3NpemUgKyBoZWFkZXJzX3NpemUgKyBsZW4gPiBkYXRhX21heCkKKwkJcmV0dXJuIGRhdGFfbWF4IC0gKHR4X3NpemUgKyBzaXplb2Yoc3RydWN0IGdiX3NwaV90cmFuc2ZlcikpOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHZvaWQgY2xlYW5feGZlcl9zdGF0ZShzdHJ1Y3QgZ2Jfc3BpbGliICpzcGkpCit7CisJc3BpLT5maXJzdF94ZmVyID0gTlVMTDsKKwlzcGktPmxhc3RfeGZlciA9IE5VTEw7CisJc3BpLT5yeF94ZmVyX29mZnNldCA9IDA7CisJc3BpLT50eF94ZmVyX29mZnNldCA9IDA7CisJc3BpLT5sYXN0X3hmZXJfc2l6ZSA9IDA7CisJc3BpLT5vcF90aW1lb3V0ID0gMDsKK30KKworc3RhdGljIGJvb2wgaXNfbGFzdF94ZmVyX2RvbmUoc3RydWN0IGdiX3NwaWxpYiAqc3BpKQoreworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKmxhc3RfeGZlciA9IHNwaS0+bGFzdF94ZmVyOworCisJaWYgKChzcGktPnR4X3hmZXJfb2Zmc2V0ICsgc3BpLT5sYXN0X3hmZXJfc2l6ZSA9PSBsYXN0X3hmZXItPmxlbikgfHwKKwkgICAgKHNwaS0+cnhfeGZlcl9vZmZzZXQgKyBzcGktPmxhc3RfeGZlcl9zaXplID09IGxhc3RfeGZlci0+bGVuKSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgc2V0dXBfbmV4dF94ZmVyKHN0cnVjdCBnYl9zcGlsaWIgKnNwaSwgc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCit7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqbGFzdF94ZmVyID0gc3BpLT5sYXN0X3hmZXI7CisKKwlpZiAobXNnLT5zdGF0ZSAhPSBHQl9TUElfU1RBVEVfT1BfRE9ORSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIGlmIHdlIHRyYW5zZmVycmVkIGFsbCBjb250ZW50IG9mIHRoZSBsYXN0IHRyYW5zZmVyLCByZXNldCB2YWx1ZXMgYW5kCisJICogY2hlY2sgaWYgdGhpcyB3YXMgdGhlIGxhc3QgdHJhbnNmZXIgaW4gdGhlIG1lc3NhZ2UKKwkgKi8KKwlpZiAoaXNfbGFzdF94ZmVyX2RvbmUoc3BpKSkgeworCQlzcGktPnR4X3hmZXJfb2Zmc2V0ID0gMDsKKwkJc3BpLT5yeF94ZmVyX29mZnNldCA9IDA7CisJCXNwaS0+b3BfdGltZW91dCA9IDA7CisJCWlmIChsYXN0X3hmZXIgPT0gbGlzdF9sYXN0X2VudHJ5KCZtc2ctPnRyYW5zZmVycywKKwkJCQkJCSBzdHJ1Y3Qgc3BpX3RyYW5zZmVyLAorCQkJCQkJIHRyYW5zZmVyX2xpc3QpKQorCQkJbXNnLT5zdGF0ZSA9IEdCX1NQSV9TVEFURV9NU0dfRE9ORTsKKwkJZWxzZQorCQkJc3BpLT5maXJzdF94ZmVyID0gbGlzdF9uZXh0X2VudHJ5KGxhc3RfeGZlciwKKwkJCQkJCQkgIHRyYW5zZmVyX2xpc3QpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzcGktPmZpcnN0X3hmZXIgPSBsYXN0X3hmZXI7CisJaWYgKGxhc3RfeGZlci0+dHhfYnVmKQorCQlzcGktPnR4X3hmZXJfb2Zmc2V0ICs9IHNwaS0+bGFzdF94ZmVyX3NpemU7CisKKwlpZiAobGFzdF94ZmVyLT5yeF9idWYpCisJCXNwaS0+cnhfeGZlcl9vZmZzZXQgKz0gc3BpLT5sYXN0X3hmZXJfc2l6ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV90cmFuc2ZlciAqZ2V0X25leHRfeGZlcihzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyLAorCQkJCQkgIHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQoreworCWlmICh4ZmVyID09IGxpc3RfbGFzdF9lbnRyeSgmbXNnLT50cmFuc2ZlcnMsIHN0cnVjdCBzcGlfdHJhbnNmZXIsCisJCQkJICAgIHRyYW5zZmVyX2xpc3QpKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBsaXN0X25leHRfZW50cnkoeGZlciwgdHJhbnNmZXJfbGlzdCk7Cit9CisKKy8qIFJvdXRpbmVzIHRvIHRyYW5zZmVyIGRhdGEgKi8KK3N0YXRpYyBzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpnYl9zcGlfb3BlcmF0aW9uX2NyZWF0ZShzdHJ1Y3QgZ2Jfc3BpbGliICpzcGksCisJCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZykKK3sKKwlzdHJ1Y3QgZ2Jfc3BpX3RyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3Q7CisJc3RydWN0IHNwaV9kZXZpY2UgKmRldiA9IG1zZy0+c3BpOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXI7CisJc3RydWN0IGdiX3NwaV90cmFuc2ZlciAqZ2JfeGZlcjsKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb247CisJdTMyIHR4X3NpemUgPSAwLCByeF9zaXplID0gMCwgY291bnQgPSAwLCB4ZmVyX2xlbiA9IDAsIHJlcXVlc3Rfc2l6ZTsKKwl1MzIgdHhfeGZlcl9zaXplID0gMCwgcnhfeGZlcl9zaXplID0gMCwgbGVuOworCXUzMiB0b3RhbF9sZW4gPSAwOworCXVuc2lnbmVkIGludCB4ZmVyX3RpbWVvdXQ7CisJc2l6ZV90IGRhdGFfbWF4OworCXZvaWQgKnR4X2RhdGE7CisKKwlkYXRhX21heCA9IGdiX29wZXJhdGlvbl9nZXRfcGF5bG9hZF9zaXplX21heChjb25uZWN0aW9uKTsKKwl4ZmVyID0gc3BpLT5maXJzdF94ZmVyOworCisJLyogRmluZCBudW1iZXIgb2YgdHJhbnNmZXJzIHF1ZXVlZCBhbmQgdHgvcnggbGVuZ3RoIGluIHRoZSBtZXNzYWdlICovCisKKwl3aGlsZSAobXNnLT5zdGF0ZSAhPSBHQl9TUElfU1RBVEVfT1BfUkVBRFkpIHsKKwkJbXNnLT5zdGF0ZSA9IEdCX1NQSV9TVEFURV9NU0dfUlVOTklORzsKKwkJc3BpLT5sYXN0X3hmZXIgPSB4ZmVyOworCisJCWlmICgheGZlci0+dHhfYnVmICYmICF4ZmVyLT5yeF9idWYpIHsKKwkJCWRldl9lcnIoc3BpLT5wYXJlbnQsCisJCQkJImJ1ZmZlcmxlc3MgdHJhbnNmZXIsIGxlbmd0aCAldVxuIiwgeGZlci0+bGVuKTsKKwkJCW1zZy0+c3RhdGUgPSBHQl9TUElfU1RBVEVfTVNHX0VSUk9SOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQl0eF94ZmVyX3NpemUgPSAwOworCQlyeF94ZmVyX3NpemUgPSAwOworCisJCWlmICh4ZmVyLT50eF9idWYpIHsKKwkJCWxlbiA9IHhmZXItPmxlbiAtIHNwaS0+dHhfeGZlcl9vZmZzZXQ7CisJCQlpZiAoIXR4X2hlYWRlcl9maXRfb3BlcmF0aW9uKHR4X3NpemUsIGNvdW50LCBkYXRhX21heCkpCisJCQkJYnJlYWs7CisJCQl0eF94ZmVyX3NpemUgPSBjYWxjX3R4X3hmZXJfc2l6ZSh0eF9zaXplLCBjb3VudCwKKwkJCQkJCQkgbGVuLCBkYXRhX21heCk7CisJCQlzcGktPmxhc3RfeGZlcl9zaXplID0gdHhfeGZlcl9zaXplOworCQl9CisKKwkJaWYgKHhmZXItPnJ4X2J1ZikgeworCQkJbGVuID0geGZlci0+bGVuIC0gc3BpLT5yeF94ZmVyX29mZnNldDsKKwkJCXJ4X3hmZXJfc2l6ZSA9IGNhbGNfcnhfeGZlcl9zaXplKHJ4X3NpemUsICZ0eF94ZmVyX3NpemUsCisJCQkJCQkJIGxlbiwgZGF0YV9tYXgpOworCQkJc3BpLT5sYXN0X3hmZXJfc2l6ZSA9IHJ4X3hmZXJfc2l6ZTsKKwkJfQorCisJCXR4X3NpemUgKz0gdHhfeGZlcl9zaXplOworCQlyeF9zaXplICs9IHJ4X3hmZXJfc2l6ZTsKKworCQl0b3RhbF9sZW4gKz0gc3BpLT5sYXN0X3hmZXJfc2l6ZTsKKwkJY291bnQrKzsKKworCQl4ZmVyID0gZ2V0X25leHRfeGZlcih4ZmVyLCBtc2cpOworCQlpZiAoIXhmZXIgfHwgdG90YWxfbGVuID49IGRhdGFfbWF4KQorCQkJbXNnLT5zdGF0ZSA9IEdCX1NQSV9TVEFURV9PUF9SRUFEWTsKKwl9CisKKwkvKgorCSAqIEluIGFkZGl0aW9uIHRvIHNwYWNlIGZvciBhbGwgbWVzc2FnZSBkZXNjcmlwdG9ycyB3ZSBuZWVkCisJICogdG8gaGF2ZSBlbm91Z2ggdG8gaG9sZCBhbGwgdHggZGF0YS4KKwkgKi8KKwlyZXF1ZXN0X3NpemUgPSBzaXplb2YoKnJlcXVlc3QpOworCXJlcXVlc3Rfc2l6ZSArPSBjb3VudCAqIHNpemVvZigqZ2JfeGZlcik7CisJcmVxdWVzdF9zaXplICs9IHR4X3NpemU7CisKKwkvKiBSZXNwb25zZSBjb25zaXN0cyBvbmx5IG9mIGluY29taW5nIGRhdGEgKi8KKwlvcGVyYXRpb24gPSBnYl9vcGVyYXRpb25fY3JlYXRlKGNvbm5lY3Rpb24sIEdCX1NQSV9UWVBFX1RSQU5TRkVSLAorCQkJCQlyZXF1ZXN0X3NpemUsIHJ4X3NpemUsIEdGUF9LRVJORUwpOworCWlmICghb3BlcmF0aW9uKQorCQlyZXR1cm4gTlVMTDsKKworCXJlcXVlc3QgPSBvcGVyYXRpb24tPnJlcXVlc3QtPnBheWxvYWQ7CisJcmVxdWVzdC0+Y291bnQgPSBjcHVfdG9fbGUxNihjb3VudCk7CisJcmVxdWVzdC0+bW9kZSA9IGRldi0+bW9kZTsKKwlyZXF1ZXN0LT5jaGlwX3NlbGVjdCA9IGRldi0+Y2hpcF9zZWxlY3Q7CisKKwlnYl94ZmVyID0gJnJlcXVlc3QtPnRyYW5zZmVyc1swXTsKKwl0eF9kYXRhID0gZ2JfeGZlciArIGNvdW50OwkvKiBwbGFjZSB0eCBkYXRhIGFmdGVyIGxhc3QgZ2JfeGZlciAqLworCisJLyogRmlsbCBpbiB0aGUgdHJhbnNmZXJzIGFycmF5ICovCisJeGZlciA9IHNwaS0+Zmlyc3RfeGZlcjsKKwl3aGlsZSAobXNnLT5zdGF0ZSAhPSBHQl9TUElfU1RBVEVfT1BfRE9ORSkgeworCQlpZiAoeGZlciA9PSBzcGktPmxhc3RfeGZlcikKKwkJCXhmZXJfbGVuID0gc3BpLT5sYXN0X3hmZXJfc2l6ZTsKKwkJZWxzZQorCQkJeGZlcl9sZW4gPSB4ZmVyLT5sZW47CisKKwkJLyogbWFrZSBzdXJlIHdlIGRvIG5vdCB0aW1lb3V0IGluIGEgc2xvdyB0cmFuc2ZlciAqLworCQl4ZmVyX3RpbWVvdXQgPSB4ZmVyX2xlbiAqIDggKiBNU0VDX1BFUl9TRUMgLyB4ZmVyLT5zcGVlZF9oejsKKwkJeGZlcl90aW1lb3V0ICs9IEdCX09QRVJBVElPTl9USU1FT1VUX0RFRkFVTFQ7CisKKwkJaWYgKHhmZXJfdGltZW91dCA+IHNwaS0+b3BfdGltZW91dCkKKwkJCXNwaS0+b3BfdGltZW91dCA9IHhmZXJfdGltZW91dDsKKworCQlnYl94ZmVyLT5zcGVlZF9oeiA9IGNwdV90b19sZTMyKHhmZXItPnNwZWVkX2h6KTsKKwkJZ2JfeGZlci0+bGVuID0gY3B1X3RvX2xlMzIoeGZlcl9sZW4pOworCQlnYl94ZmVyLT5kZWxheV91c2VjcyA9IGNwdV90b19sZTE2KHhmZXItPmRlbGF5X3VzZWNzKTsKKwkJZ2JfeGZlci0+Y3NfY2hhbmdlID0geGZlci0+Y3NfY2hhbmdlOworCQlnYl94ZmVyLT5iaXRzX3Blcl93b3JkID0geGZlci0+Yml0c19wZXJfd29yZDsKKworCQkvKiBDb3B5IHR4IGRhdGEgKi8KKwkJaWYgKHhmZXItPnR4X2J1ZikgeworCQkJZ2JfeGZlci0+eGZlcl9mbGFncyB8PSBHQl9TUElfWEZFUl9XUklURTsKKwkJCW1lbWNweSh0eF9kYXRhLCB4ZmVyLT50eF9idWYgKyBzcGktPnR4X3hmZXJfb2Zmc2V0LAorCQkJICAgICAgIHhmZXJfbGVuKTsKKwkJCXR4X2RhdGEgKz0geGZlcl9sZW47CisJCX0KKworCQlpZiAoeGZlci0+cnhfYnVmKQorCQkJZ2JfeGZlci0+eGZlcl9mbGFncyB8PSBHQl9TUElfWEZFUl9SRUFEOworCisJCWlmICh4ZmVyID09IHNwaS0+bGFzdF94ZmVyKSB7CisJCQlpZiAoIWlzX2xhc3RfeGZlcl9kb25lKHNwaSkpCisJCQkJZ2JfeGZlci0+eGZlcl9mbGFncyB8PSBHQl9TUElfWEZFUl9JTlBST0dSRVNTOworCQkJbXNnLT5zdGF0ZSA9IEdCX1NQSV9TVEFURV9PUF9ET05FOworCQkJY29udGludWU7CisJCX0KKworCQlnYl94ZmVyKys7CisJCXhmZXIgPSBnZXRfbmV4dF94ZmVyKHhmZXIsIG1zZyk7CisJfQorCisJbXNnLT5hY3R1YWxfbGVuZ3RoICs9IHRvdGFsX2xlbjsKKworCXJldHVybiBvcGVyYXRpb247Cit9CisKK3N0YXRpYyB2b2lkIGdiX3NwaV9kZWNvZGVfcmVzcG9uc2Uoc3RydWN0IGdiX3NwaWxpYiAqc3BpLAorCQkJCSAgIHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnLAorCQkJCSAgIHN0cnVjdCBnYl9zcGlfdHJhbnNmZXJfcmVzcG9uc2UgKnJlc3BvbnNlKQoreworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIgPSBzcGktPmZpcnN0X3hmZXI7CisJdm9pZCAqcnhfZGF0YSA9IHJlc3BvbnNlLT5kYXRhOworCXUzMiB4ZmVyX2xlbjsKKworCXdoaWxlICh4ZmVyKSB7CisJCS8qIENvcHkgcnggZGF0YSAqLworCQlpZiAoeGZlci0+cnhfYnVmKSB7CisJCQlpZiAoeGZlciA9PSBzcGktPmZpcnN0X3hmZXIpCisJCQkJeGZlcl9sZW4gPSB4ZmVyLT5sZW4gLSBzcGktPnJ4X3hmZXJfb2Zmc2V0OworCQkJZWxzZSBpZiAoeGZlciA9PSBzcGktPmxhc3RfeGZlcikKKwkJCQl4ZmVyX2xlbiA9IHNwaS0+bGFzdF94ZmVyX3NpemU7CisJCQllbHNlCisJCQkJeGZlcl9sZW4gPSB4ZmVyLT5sZW47CisKKwkJCW1lbWNweSh4ZmVyLT5yeF9idWYgKyBzcGktPnJ4X3hmZXJfb2Zmc2V0LCByeF9kYXRhLAorCQkJICAgICAgIHhmZXJfbGVuKTsKKwkJCXJ4X2RhdGEgKz0geGZlcl9sZW47CisJCX0KKworCQlpZiAoeGZlciA9PSBzcGktPmxhc3RfeGZlcikKKwkJCWJyZWFrOworCisJCXhmZXIgPSBsaXN0X25leHRfZW50cnkoeGZlciwgdHJhbnNmZXJfbGlzdCk7CisJfQorfQorCitzdGF0aWMgaW50IGdiX3NwaV90cmFuc2Zlcl9vbmVfbWVzc2FnZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAorCQkJCSAgICAgICBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZykKK3sKKwlzdHJ1Y3QgZ2Jfc3BpbGliICpzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBzcGktPmNvbm5lY3Rpb247CisJc3RydWN0IGdiX3NwaV90cmFuc2Zlcl9yZXNwb25zZSAqcmVzcG9uc2U7CisJc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uOworCWludCByZXQgPSAwOworCisJc3BpLT5maXJzdF94ZmVyID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZtc2ctPnRyYW5zZmVycywKKwkJCQkJCSAgIHN0cnVjdCBzcGlfdHJhbnNmZXIsCisJCQkJCQkgICB0cmFuc2Zlcl9saXN0KTsKKwlpZiAoIXNwaS0+Zmlyc3RfeGZlcikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwltc2ctPnN0YXRlID0gR0JfU1BJX1NUQVRFX01TR19JRExFOworCisJd2hpbGUgKG1zZy0+c3RhdGUgIT0gR0JfU1BJX1NUQVRFX01TR19ET05FICYmCisJICAgICAgIG1zZy0+c3RhdGUgIT0gR0JfU1BJX1NUQVRFX01TR19FUlJPUikgeworCQlvcGVyYXRpb24gPSBnYl9zcGlfb3BlcmF0aW9uX2NyZWF0ZShzcGksIGNvbm5lY3Rpb24sIG1zZyk7CisJCWlmICghb3BlcmF0aW9uKSB7CisJCQltc2ctPnN0YXRlID0gR0JfU1BJX1NUQVRFX01TR19FUlJPUjsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJldCA9IGdiX29wZXJhdGlvbl9yZXF1ZXN0X3NlbmRfc3luY190aW1lb3V0KG9wZXJhdGlvbiwKKwkJCQkJCQkgICAgIHNwaS0+b3BfdGltZW91dCk7CisJCWlmICghcmV0KSB7CisJCQlyZXNwb25zZSA9IG9wZXJhdGlvbi0+cmVzcG9uc2UtPnBheWxvYWQ7CisJCQlpZiAocmVzcG9uc2UpCisJCQkJZ2Jfc3BpX2RlY29kZV9yZXNwb25zZShzcGksIG1zZywgcmVzcG9uc2UpOworCQl9IGVsc2UgeworCQkJZGV2X2VycihzcGktPnBhcmVudCwKKwkJCQkidHJhbnNmZXIgb3BlcmF0aW9uIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCQltc2ctPnN0YXRlID0gR0JfU1BJX1NUQVRFX01TR19FUlJPUjsKKwkJfQorCisJCWdiX29wZXJhdGlvbl9wdXQob3BlcmF0aW9uKTsKKwkJc2V0dXBfbmV4dF94ZmVyKHNwaSwgbXNnKTsKKwl9CisKK291dDoKKwltc2ctPnN0YXR1cyA9IHJldDsKKwljbGVhbl94ZmVyX3N0YXRlKHNwaSk7CisJc3BpX2ZpbmFsaXplX2N1cnJlbnRfbWVzc2FnZShtYXN0ZXIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnYl9zcGlfcHJlcGFyZV90cmFuc2Zlcl9oYXJkd2FyZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQoreworCXN0cnVjdCBnYl9zcGlsaWIgKnNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCXJldHVybiBzcGktPm9wcy0+cHJlcGFyZV90cmFuc2Zlcl9oYXJkd2FyZShzcGktPnBhcmVudCk7Cit9CisKK3N0YXRpYyBpbnQgZ2Jfc3BpX3VucHJlcGFyZV90cmFuc2Zlcl9oYXJkd2FyZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQoreworCXN0cnVjdCBnYl9zcGlsaWIgKnNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCXNwaS0+b3BzLT51bnByZXBhcmVfdHJhbnNmZXJfaGFyZHdhcmUoc3BpLT5wYXJlbnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2Jfc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJLyogTm90aGluZyB0byBkbyBmb3Igbm93ICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdiX3NwaV9jbGVhbnVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJLyogTm90aGluZyB0byBkbyBmb3Igbm93ICovCit9CisKKy8qIFJvdXRpbmVzIHRvIGdldCBjb250cm9sbGVyIGluZm9ybWF0aW9uICovCisKKy8qCisgKiBNYXAgR3JleWJ1cyBzcGkgbW9kZSBiaXRzL2ZsYWdzL2JwdyBpbnRvIExpbnV4IG9uZXMuCisgKiBBbGwgYml0cyBhcmUgc2FtZSBmb3Igbm93IGFuZCBzbyB0aGVzZSBtYWNybydzIHJldHVybiBzYW1lIHZhbHVlcy4KKyAqLworI2RlZmluZSBnYl9zcGlfbW9kZV9tYXAobW9kZSkgbW9kZQorI2RlZmluZSBnYl9zcGlfZmxhZ3NfbWFwKGZsYWdzKSBmbGFncworCitzdGF0aWMgaW50IGdiX3NwaV9nZXRfbWFzdGVyX2NvbmZpZyhzdHJ1Y3QgZ2Jfc3BpbGliICpzcGkpCit7CisJc3RydWN0IGdiX3NwaV9tYXN0ZXJfY29uZmlnX3Jlc3BvbnNlIHJlc3BvbnNlOworCXUxNiBtb2RlLCBmbGFnczsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoc3BpLT5jb25uZWN0aW9uLCBHQl9TUElfVFlQRV9NQVNURVJfQ09ORklHLAorCQkJCU5VTEwsIDAsICZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwltb2RlID0gbGUxNl90b19jcHUocmVzcG9uc2UubW9kZSk7CisJc3BpLT5tb2RlID0gZ2Jfc3BpX21vZGVfbWFwKG1vZGUpOworCisJZmxhZ3MgPSBsZTE2X3RvX2NwdShyZXNwb25zZS5mbGFncyk7CisJc3BpLT5mbGFncyA9IGdiX3NwaV9mbGFnc19tYXAoZmxhZ3MpOworCisJc3BpLT5iaXRzX3Blcl93b3JkX21hc2sgPSBsZTMyX3RvX2NwdShyZXNwb25zZS5iaXRzX3Blcl93b3JkX21hc2spOworCXNwaS0+bnVtX2NoaXBzZWxlY3QgPSByZXNwb25zZS5udW1fY2hpcHNlbGVjdDsKKworCXNwaS0+bWluX3NwZWVkX2h6ID0gbGUzMl90b19jcHUocmVzcG9uc2UubWluX3NwZWVkX2h6KTsKKwlzcGktPm1heF9zcGVlZF9oeiA9IGxlMzJfdG9fY3B1KHJlc3BvbnNlLm1heF9zcGVlZF9oeik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9zcGlfc2V0dXBfZGV2aWNlKHN0cnVjdCBnYl9zcGlsaWIgKnNwaSwgdTggY3MpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IGdldF9tYXN0ZXJfZnJvbV9zcGkoc3BpKTsKKwlzdHJ1Y3QgZ2Jfc3BpX2RldmljZV9jb25maWdfcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBnYl9zcGlfZGV2aWNlX2NvbmZpZ19yZXNwb25zZSByZXNwb25zZTsKKwlzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gc3BpX2JvYXJkID0geyB7MH0gfTsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpZGV2OworCWludCByZXQ7CisJdTggZGV2X3R5cGU7CisKKwlyZXF1ZXN0LmNoaXBfc2VsZWN0ID0gY3M7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhzcGktPmNvbm5lY3Rpb24sIEdCX1NQSV9UWVBFX0RFVklDRV9DT05GSUcsCisJCQkJJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwKKwkJCQkmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZGV2X3R5cGUgPSByZXNwb25zZS5kZXZpY2VfdHlwZTsKKworCWlmIChkZXZfdHlwZSA9PSBHQl9TUElfU1BJX0RFVikKKwkJc3RybGNweShzcGlfYm9hcmQubW9kYWxpYXMsICJzcGlkZXYiLAorCQkJc2l6ZW9mKHNwaV9ib2FyZC5tb2RhbGlhcykpOworCWVsc2UgaWYgKGRldl90eXBlID09IEdCX1NQSV9TUElfTk9SKQorCQlzdHJsY3B5KHNwaV9ib2FyZC5tb2RhbGlhcywgInNwaS1ub3IiLAorCQkJc2l6ZW9mKHNwaV9ib2FyZC5tb2RhbGlhcykpOworCWVsc2UgaWYgKGRldl90eXBlID09IEdCX1NQSV9TUElfTU9EQUxJQVMpCisJCW1lbWNweShzcGlfYm9hcmQubW9kYWxpYXMsIHJlc3BvbnNlLm5hbWUsCisJCSAgICAgICBzaXplb2Yoc3BpX2JvYXJkLm1vZGFsaWFzKSk7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaV9ib2FyZC5tb2RlCQk9IGxlMTZfdG9fY3B1KHJlc3BvbnNlLm1vZGUpOworCXNwaV9ib2FyZC5idXNfbnVtCT0gbWFzdGVyLT5idXNfbnVtOworCXNwaV9ib2FyZC5jaGlwX3NlbGVjdAk9IGNzOworCXNwaV9ib2FyZC5tYXhfc3BlZWRfaHoJPSBsZTMyX3RvX2NwdShyZXNwb25zZS5tYXhfc3BlZWRfaHopOworCisJc3BpZGV2ID0gc3BpX25ld19kZXZpY2UobWFzdGVyLCAmc3BpX2JvYXJkKTsKKwlpZiAoIXNwaWRldikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGdiX3NwaWxpYl9tYXN0ZXJfaW5pdChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IGRldmljZSAqZGV2LAorCQkJICBzdHJ1Y3Qgc3BpbGliX29wcyAqb3BzKQoreworCXN0cnVjdCBnYl9zcGlsaWIgKnNwaTsKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworCWludCByZXQ7CisJdTggaTsKKworCS8qIEFsbG9jYXRlIG1hc3RlciB3aXRoIHNwYWNlIGZvciBkYXRhICovCisJbWFzdGVyID0gc3BpX2FsbG9jX21hc3RlcihkZXYsIHNpemVvZigqc3BpKSk7CisJaWYgKCFtYXN0ZXIpIHsKKwkJZGV2X2VycihkZXYsICJjYW5ub3QgYWxsb2MgU1BJIG1hc3RlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlzcGktPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCWdiX2Nvbm5lY3Rpb25fc2V0X2RhdGEoY29ubmVjdGlvbiwgbWFzdGVyKTsKKwlzcGktPnBhcmVudCA9IGRldjsKKwlzcGktPm9wcyA9IG9wczsKKworCS8qIGdldCBtYXN0ZXIgY29uZmlndXJhdGlvbiAqLworCXJldCA9IGdiX3NwaV9nZXRfbWFzdGVyX2NvbmZpZyhzcGkpOworCWlmIChyZXQpCisJCWdvdG8gZXhpdF9zcGlfcHV0OworCisJbWFzdGVyLT5idXNfbnVtID0gLTE7IC8qIEFsbG93IHNwaS1jb3JlIHRvIGFsbG9jYXRlIGl0IGR5bmFtaWNhbGx5ICovCisJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IHNwaS0+bnVtX2NoaXBzZWxlY3Q7CisJbWFzdGVyLT5tb2RlX2JpdHMgPSBzcGktPm1vZGU7CisJbWFzdGVyLT5mbGFncyA9IHNwaS0+ZmxhZ3M7CisJbWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2sgPSBzcGktPmJpdHNfcGVyX3dvcmRfbWFzazsKKworCS8qIEF0dGFjaCBtZXRob2RzICovCisJbWFzdGVyLT5jbGVhbnVwID0gZ2Jfc3BpX2NsZWFudXA7CisJbWFzdGVyLT5zZXR1cCA9IGdiX3NwaV9zZXR1cDsKKwltYXN0ZXItPnRyYW5zZmVyX29uZV9tZXNzYWdlID0gZ2Jfc3BpX3RyYW5zZmVyX29uZV9tZXNzYWdlOworCisJaWYgKG9wcyAmJiBvcHMtPnByZXBhcmVfdHJhbnNmZXJfaGFyZHdhcmUpIHsKKwkJbWFzdGVyLT5wcmVwYXJlX3RyYW5zZmVyX2hhcmR3YXJlID0KKwkJCWdiX3NwaV9wcmVwYXJlX3RyYW5zZmVyX2hhcmR3YXJlOworCX0KKworCWlmIChvcHMgJiYgb3BzLT51bnByZXBhcmVfdHJhbnNmZXJfaGFyZHdhcmUpIHsKKwkJbWFzdGVyLT51bnByZXBhcmVfdHJhbnNmZXJfaGFyZHdhcmUgPQorCQkJZ2Jfc3BpX3VucHJlcGFyZV90cmFuc2Zlcl9oYXJkd2FyZTsKKwl9CisKKwltYXN0ZXItPmF1dG9fcnVudGltZV9wbSA9IHRydWU7CisKKwlyZXQgPSBzcGlfcmVnaXN0ZXJfbWFzdGVyKG1hc3Rlcik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXhpdF9zcGlfcHV0OworCisJLyogbm93LCBmZXRjaCB0aGUgZGV2aWNlcyBjb25maWd1cmF0aW9uICovCisJZm9yIChpID0gMDsgaSA8IHNwaS0+bnVtX2NoaXBzZWxlY3Q7IGkrKykgeworCQlyZXQgPSBnYl9zcGlfc2V0dXBfZGV2aWNlKHNwaSwgaSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBzcGkgZGV2aWNlICVkOiAlZFxuIiwKKwkJCQlpLCByZXQpOworCQkJZ290byBleGl0X3NwaV91bnJlZ2lzdGVyOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKK2V4aXRfc3BpX3VucmVnaXN0ZXI6CisJc3BpX3VucmVnaXN0ZXJfbWFzdGVyKG1hc3Rlcik7CitleGl0X3NwaV9wdXQ6CisJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9zcGlsaWJfbWFzdGVyX2luaXQpOworCit2b2lkIGdiX3NwaWxpYl9tYXN0ZXJfZXhpdChzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShjb25uZWN0aW9uKTsKKworCXNwaV91bnJlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOworCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl9zcGlsaWJfbWFzdGVyX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9zcGlsaWIuaCBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3NwaWxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NmQwZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9zcGlsaWIuaApAQCAtMCwwICsxLDI0IEBACisvKgorICogR3JleWJ1cyBTUEkgbGlicmFyeSBoZWFkZXIKKyAqCisgKiBjb3B5cmlnaHQgMjAxNiBnb29nbGUgaW5jLgorICogY29weXJpZ2h0IDIwMTYgbGluYXJvIGx0ZC4KKyAqCisgKiByZWxlYXNlZCB1bmRlciB0aGUgZ3BsdjIgb25seS4KKyAqLworCisjaWZuZGVmIF9fU1BJTElCX0gKKyNkZWZpbmUgX19TUElMSUJfSAorCitzdHJ1Y3QgZGV2aWNlOworc3RydWN0IGdiX2Nvbm5lY3Rpb247CisKK3N0cnVjdCBzcGlsaWJfb3BzIHsKKwlpbnQgKCpwcmVwYXJlX3RyYW5zZmVyX2hhcmR3YXJlKShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCXZvaWQgKCp1bnByZXBhcmVfdHJhbnNmZXJfaGFyZHdhcmUpKHN0cnVjdCBkZXZpY2UgKmRldik7Cit9OworCitpbnQgZ2Jfc3BpbGliX21hc3Rlcl9pbml0KHN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzcGlsaWJfb3BzICpvcHMpOwordm9pZCBnYl9zcGlsaWJfbWFzdGVyX2V4aXQoc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pOworCisjZW5kaWYgLyogX19TUElMSUJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvc3ZjLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9zdmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTAwNTVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvc3ZjLmMKQEAgLTAsMCArMSwxNDg2IEBACisvKgorICogU1ZDIEdyZXlidXMgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNSBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNpbmNsdWRlICJncmV5YnVzLmgiCisKKyNkZWZpbmUgU1ZDX0lOVEZfRUpFQ1RfVElNRU9VVAkJOTAwMAorI2RlZmluZSBTVkNfSU5URl9BQ1RJVkFURV9USU1FT1VUCTYwMDAKKyNkZWZpbmUgU1ZDX0lOVEZfUkVTVU1FX1RJTUVPVVQJCTMwMDAKKworc3RydWN0IGdiX3N2Y19kZWZlcnJlZF9yZXF1ZXN0IHsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb247Cit9OworCisKK3N0YXRpYyBpbnQgZ2Jfc3ZjX3F1ZXVlX2RlZmVycmVkX3JlcXVlc3Qoc3RydWN0IGdiX29wZXJhdGlvbiAqb3BlcmF0aW9uKTsKKworc3RhdGljIHNzaXplX3QgZW5kb19pZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gdG9fZ2Jfc3ZjKGRldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwNHhcbiIsIHN2Yy0+ZW5kb19pZCk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFJfUk8oZW5kb19pZCk7CisKK3N0YXRpYyBzc2l6ZV90IGFwX2ludGZfaWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBnYl9zdmMgKnN2YyA9IHRvX2diX3N2YyhkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHN2Yy0+YXBfaW50Zl9pZCk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFJfUk8oYXBfaW50Zl9pZCk7CisKKy8vIEZJWE1FCisvLyBUaGlzIGlzIGEgaGFjaywgd2UgbmVlZCB0byBkbyB0aGlzICJyaWdodCIgYW5kIGNsZWFuIHRoZSBpbnRlcmZhY2UgdXAKKy8vIHByb3Blcmx5LCBub3QganVzdCBmb3JjaWJseSB5YW5rIHRoZSB0aGluZyBvdXQgb2YgdGhlIHN5c3RlbSBhbmQgaG9wZSBmb3IgdGhlCisvLyBiZXN0LiAgQnV0IGZvciBub3csIHBlb3BsZSB3YW50IHRoZWlyIG1vZHVsZXMgdG8gY29tZSBvdXQgd2l0aG91dCBoYXZpbmcgdG8KKy8vIHRocm93IHRoZSB0aGluZyB0byB0aGUgZ3JvdW5kIG9yIGdldCBvdXQgYSBzY3Jld2RyaXZlci4KK3N0YXRpYyBzc2l6ZV90IGludGZfZWplY3Rfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCisJCQkJc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSB0b19nYl9zdmMoZGV2KTsKKwl1bnNpZ25lZCBzaG9ydCBpbnRmX2lkOworCWludCByZXQ7CisKKwlyZXQgPSBrc3RydG91MTYoYnVmLCAxMCwgJmludGZfaWQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZGV2X3dhcm4oZGV2LCAiRm9yY2libHkgdHJ5aW5nIHRvIGVqZWN0IGludGVyZmFjZSAlZFxuIiwgaW50Zl9pZCk7CisKKwlyZXQgPSBnYl9zdmNfaW50Zl9lamVjdChzdmMsIGludGZfaWQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGxlbjsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9XTyhpbnRmX2VqZWN0KTsKKworc3RhdGljIHNzaXplX3Qgd2F0Y2hkb2dfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gdG9fZ2Jfc3ZjKGRldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwKKwkJICAgICAgIGdiX3N2Y193YXRjaGRvZ19lbmFibGVkKHN2YykgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKK30KKworc3RhdGljIHNzaXplX3Qgd2F0Y2hkb2dfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCSAgICAgIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gdG9fZ2Jfc3ZjKGRldik7CisJaW50IHJldHZhbDsKKwlib29sIHVzZXJfcmVxdWVzdDsKKworCXJldHZhbCA9IHN0cnRvYm9vbChidWYsICZ1c2VyX3JlcXVlc3QpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlpZiAodXNlcl9yZXF1ZXN0KQorCQlyZXR2YWwgPSBnYl9zdmNfd2F0Y2hkb2dfZW5hYmxlKHN2Yyk7CisJZWxzZQorCQlyZXR2YWwgPSBnYl9zdmNfd2F0Y2hkb2dfZGlzYWJsZShzdmMpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcmV0dXJuIGxlbjsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9SVyh3YXRjaGRvZyk7CisKK3N0YXRpYyBzc2l6ZV90IHdhdGNoZG9nX2FjdGlvbl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSB0b19nYl9zdmMoZGV2KTsKKworCWlmIChzdmMtPmFjdGlvbiA9PSBHQl9TVkNfV0FUQ0hET0dfQklURV9QQU5JQ19LRVJORUwpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgInBhbmljXG4iKTsKKwllbHNlIGlmIChzdmMtPmFjdGlvbiA9PSBHQl9TVkNfV0FUQ0hET0dfQklURV9SRVNFVF9VTklQUk8pCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgInJlc2V0XG4iKTsKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgc3NpemVfdCB3YXRjaGRvZ19hY3Rpb25fc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gdG9fZ2Jfc3ZjKGRldik7CisKKwlpZiAoc3lzZnNfc3RyZXEoYnVmLCAicGFuaWMiKSkKKwkJc3ZjLT5hY3Rpb24gPSBHQl9TVkNfV0FUQ0hET0dfQklURV9QQU5JQ19LRVJORUw7CisJZWxzZSBpZiAoc3lzZnNfc3RyZXEoYnVmLCAicmVzZXQiKSkKKwkJc3ZjLT5hY3Rpb24gPSBHQl9TVkNfV0FUQ0hET0dfQklURV9SRVNFVF9VTklQUk87CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBsZW47Cit9CitzdGF0aWMgREVWSUNFX0FUVFJfUlcod2F0Y2hkb2dfYWN0aW9uKTsKKworc3RhdGljIGludCBnYl9zdmNfcHdybW9uX3JhaWxfY291bnRfZ2V0KHN0cnVjdCBnYl9zdmMgKnN2YywgdTggKnZhbHVlKQoreworCXN0cnVjdCBnYl9zdmNfcHdybW9uX3JhaWxfY291bnRfZ2V0X3Jlc3BvbnNlIHJlc3BvbnNlOworCWludCByZXQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhzdmMtPmNvbm5lY3Rpb24sCisJCQkJR0JfU1ZDX1RZUEVfUFdSTU9OX1JBSUxfQ09VTlRfR0VULCBOVUxMLCAwLAorCQkJCSZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdmMtPmRldiwgImZhaWxlZCB0byBnZXQgcmFpbCBjb3VudDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJKnZhbHVlID0gcmVzcG9uc2UucmFpbF9jb3VudDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX3N2Y19wd3Jtb25fcmFpbF9uYW1lc19nZXQoc3RydWN0IGdiX3N2YyAqc3ZjLAorCQlzdHJ1Y3QgZ2Jfc3ZjX3B3cm1vbl9yYWlsX25hbWVzX2dldF9yZXNwb25zZSAqcmVzcG9uc2UsCisJCXNpemVfdCBidWZzaXplKQoreworCWludCByZXQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhzdmMtPmNvbm5lY3Rpb24sCisJCQkJR0JfU1ZDX1RZUEVfUFdSTU9OX1JBSUxfTkFNRVNfR0VULCBOVUxMLCAwLAorCQkJCXJlc3BvbnNlLCBidWZzaXplKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnN2Yy0+ZGV2LCAiZmFpbGVkIHRvIGdldCByYWlsIG5hbWVzOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAocmVzcG9uc2UtPnN0YXR1cyAhPSBHQl9TVkNfT1BfU1VDQ0VTUykgeworCQlkZXZfZXJyKCZzdmMtPmRldiwKKwkJCSJTVkMgZXJyb3Igd2hpbGUgZ2V0dGluZyByYWlsIG5hbWVzOiAldVxuIiwKKwkJCXJlc3BvbnNlLT5zdGF0dXMpOworCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9zdmNfcHdybW9uX3NhbXBsZV9nZXQoc3RydWN0IGdiX3N2YyAqc3ZjLCB1OCByYWlsX2lkLAorCQkJCSAgICB1OCBtZWFzdXJlbWVudF90eXBlLCB1MzIgKnZhbHVlKQoreworCXN0cnVjdCBnYl9zdmNfcHdybW9uX3NhbXBsZV9nZXRfcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBnYl9zdmNfcHdybW9uX3NhbXBsZV9nZXRfcmVzcG9uc2UgcmVzcG9uc2U7CisJaW50IHJldDsKKworCXJlcXVlc3QucmFpbF9pZCA9IHJhaWxfaWQ7CisJcmVxdWVzdC5tZWFzdXJlbWVudF90eXBlID0gbWVhc3VyZW1lbnRfdHlwZTsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKHN2Yy0+Y29ubmVjdGlvbiwgR0JfU1ZDX1RZUEVfUFdSTU9OX1NBTVBMRV9HRVQsCisJCQkJJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwKKwkJCQkmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3ZjLT5kZXYsICJmYWlsZWQgdG8gZ2V0IHJhaWwgc2FtcGxlOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAocmVzcG9uc2UucmVzdWx0KSB7CisJCWRldl9lcnIoJnN2Yy0+ZGV2LAorCQkJIlVuaVBybyBlcnJvciB3aGlsZSBnZXR0aW5nIHJhaWwgcG93ZXIgc2FtcGxlICglZCAlZCk6ICVkXG4iLAorCQkJcmFpbF9pZCwgbWVhc3VyZW1lbnRfdHlwZSwgcmVzcG9uc2UucmVzdWx0KTsKKwkJc3dpdGNoIChyZXNwb25zZS5yZXN1bHQpIHsKKwkJY2FzZSBHQl9TVkNfUFdSTU9OX0dFVF9TQU1QTEVfSU5WQUw6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY2FzZSBHQl9TVkNfUFdSTU9OX0dFVF9TQU1QTEVfTk9TVVBQOgorCQkJcmV0dXJuIC1FTk9NU0c7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJfQorCX0KKworCSp2YWx1ZSA9IGxlMzJfdG9fY3B1KHJlc3BvbnNlLm1lYXN1cmVtZW50KTsKKworCXJldHVybiAwOworfQorCitpbnQgZ2Jfc3ZjX3B3cm1vbl9pbnRmX3NhbXBsZV9nZXQoc3RydWN0IGdiX3N2YyAqc3ZjLCB1OCBpbnRmX2lkLAorCQkJCSAgdTggbWVhc3VyZW1lbnRfdHlwZSwgdTMyICp2YWx1ZSkKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjX3B3cm1vbl9pbnRmX3NhbXBsZV9nZXRfcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBnYl9zdmNfcHdybW9uX2ludGZfc2FtcGxlX2dldF9yZXNwb25zZSByZXNwb25zZTsKKwlpbnQgcmV0OworCisJcmVxdWVzdC5pbnRmX2lkID0gaW50Zl9pZDsKKwlyZXF1ZXN0Lm1lYXN1cmVtZW50X3R5cGUgPSBtZWFzdXJlbWVudF90eXBlOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoc3ZjLT5jb25uZWN0aW9uLAorCQkJCUdCX1NWQ19UWVBFX1BXUk1PTl9JTlRGX1NBTVBMRV9HRVQsCisJCQkJJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwKKwkJCQkmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3ZjLT5kZXYsICJmYWlsZWQgdG8gZ2V0IGludGYgc2FtcGxlOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAocmVzcG9uc2UucmVzdWx0KSB7CisJCWRldl9lcnIoJnN2Yy0+ZGV2LAorCQkJIlVuaVBybyBlcnJvciB3aGlsZSBnZXR0aW5nIGludGYgcG93ZXIgc2FtcGxlICglZCAlZCk6ICVkXG4iLAorCQkJaW50Zl9pZCwgbWVhc3VyZW1lbnRfdHlwZSwgcmVzcG9uc2UucmVzdWx0KTsKKwkJc3dpdGNoIChyZXNwb25zZS5yZXN1bHQpIHsKKwkJY2FzZSBHQl9TVkNfUFdSTU9OX0dFVF9TQU1QTEVfSU5WQUw6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY2FzZSBHQl9TVkNfUFdSTU9OX0dFVF9TQU1QTEVfTk9TVVBQOgorCQkJcmV0dXJuIC1FTk9NU0c7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJfQorCX0KKworCSp2YWx1ZSA9IGxlMzJfdG9fY3B1KHJlc3BvbnNlLm1lYXN1cmVtZW50KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqc3ZjX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2VuZG9faWQuYXR0ciwKKwkmZGV2X2F0dHJfYXBfaW50Zl9pZC5hdHRyLAorCSZkZXZfYXR0cl9pbnRmX2VqZWN0LmF0dHIsCisJJmRldl9hdHRyX3dhdGNoZG9nLmF0dHIsCisJJmRldl9hdHRyX3dhdGNoZG9nX2FjdGlvbi5hdHRyLAorCU5VTEwsCit9OworQVRUUklCVVRFX0dST1VQUyhzdmMpOworCitpbnQgZ2Jfc3ZjX2ludGZfZGV2aWNlX2lkKHN0cnVjdCBnYl9zdmMgKnN2YywgdTggaW50Zl9pZCwgdTggZGV2aWNlX2lkKQoreworCXN0cnVjdCBnYl9zdmNfaW50Zl9kZXZpY2VfaWRfcmVxdWVzdCByZXF1ZXN0OworCisJcmVxdWVzdC5pbnRmX2lkID0gaW50Zl9pZDsKKwlyZXF1ZXN0LmRldmljZV9pZCA9IGRldmljZV9pZDsKKworCXJldHVybiBnYl9vcGVyYXRpb25fc3luYyhzdmMtPmNvbm5lY3Rpb24sIEdCX1NWQ19UWVBFX0lOVEZfREVWSUNFX0lELAorCQkJCSAmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLCBOVUxMLCAwKTsKK30KKworaW50IGdiX3N2Y19pbnRmX2VqZWN0KHN0cnVjdCBnYl9zdmMgKnN2YywgdTggaW50Zl9pZCkKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjX2ludGZfZWplY3RfcmVxdWVzdCByZXF1ZXN0OworCWludCByZXQ7CisKKwlyZXF1ZXN0LmludGZfaWQgPSBpbnRmX2lkOworCisJLyoKKwkgKiBUaGUgcHVsc2Ugd2lkdGggZm9yIG1vZHVsZSByZWxlYXNlIGluIHN2YyBpcyBsb25nIHNvIHdlIG5lZWQgdG8KKwkgKiBpbmNyZWFzZSB0aGUgdGltZW91dCBzbyB0aGUgb3BlcmF0aW9uIHdpbGwgbm90IHJldHVybiB0byBzb29uLgorCSAqLworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jX3RpbWVvdXQoc3ZjLT5jb25uZWN0aW9uLAorCQkJCQlHQl9TVkNfVFlQRV9JTlRGX0VKRUNULCAmcmVxdWVzdCwKKwkJCQkJc2l6ZW9mKHJlcXVlc3QpLCBOVUxMLCAwLAorCQkJCQlTVkNfSU5URl9FSkVDVF9USU1FT1VUKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnN2Yy0+ZGV2LCAiZmFpbGVkIHRvIGVqZWN0IGludGVyZmFjZSAldVxuIiwgaW50Zl9pZCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBnYl9zdmNfaW50Zl92c3lzX3NldChzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU4IGludGZfaWQsIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBnYl9zdmNfaW50Zl92c3lzX3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZ2Jfc3ZjX2ludGZfdnN5c19yZXNwb25zZSByZXNwb25zZTsKKwlpbnQgdHlwZSwgcmV0OworCisJcmVxdWVzdC5pbnRmX2lkID0gaW50Zl9pZDsKKworCWlmIChlbmFibGUpCisJCXR5cGUgPSBHQl9TVkNfVFlQRV9JTlRGX1ZTWVNfRU5BQkxFOworCWVsc2UKKwkJdHlwZSA9IEdCX1NWQ19UWVBFX0lOVEZfVlNZU19ESVNBQkxFOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoc3ZjLT5jb25uZWN0aW9uLCB0eXBlLAorCQkJJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwKKwkJCSZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJaWYgKHJlc3BvbnNlLnJlc3VsdF9jb2RlICE9IEdCX1NWQ19JTlRGX1ZTWVNfT0spCisJCXJldHVybiAtRVJFTU9URUlPOworCXJldHVybiAwOworfQorCitpbnQgZ2Jfc3ZjX2ludGZfcmVmY2xrX3NldChzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU4IGludGZfaWQsIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBnYl9zdmNfaW50Zl9yZWZjbGtfcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBnYl9zdmNfaW50Zl9yZWZjbGtfcmVzcG9uc2UgcmVzcG9uc2U7CisJaW50IHR5cGUsIHJldDsKKworCXJlcXVlc3QuaW50Zl9pZCA9IGludGZfaWQ7CisKKwlpZiAoZW5hYmxlKQorCQl0eXBlID0gR0JfU1ZDX1RZUEVfSU5URl9SRUZDTEtfRU5BQkxFOworCWVsc2UKKwkJdHlwZSA9IEdCX1NWQ19UWVBFX0lOVEZfUkVGQ0xLX0RJU0FCTEU7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhzdmMtPmNvbm5lY3Rpb24sIHR5cGUsCisJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLAorCQkJJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAocmVzcG9uc2UucmVzdWx0X2NvZGUgIT0gR0JfU1ZDX0lOVEZfUkVGQ0xLX09LKQorCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwlyZXR1cm4gMDsKK30KKworaW50IGdiX3N2Y19pbnRmX3VuaXByb19zZXQoc3RydWN0IGdiX3N2YyAqc3ZjLCB1OCBpbnRmX2lkLCBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjX2ludGZfdW5pcHJvX3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZ2Jfc3ZjX2ludGZfdW5pcHJvX3Jlc3BvbnNlIHJlc3BvbnNlOworCWludCB0eXBlLCByZXQ7CisKKwlyZXF1ZXN0LmludGZfaWQgPSBpbnRmX2lkOworCisJaWYgKGVuYWJsZSkKKwkJdHlwZSA9IEdCX1NWQ19UWVBFX0lOVEZfVU5JUFJPX0VOQUJMRTsKKwllbHNlCisJCXR5cGUgPSBHQl9TVkNfVFlQRV9JTlRGX1VOSVBST19ESVNBQkxFOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoc3ZjLT5jb25uZWN0aW9uLCB0eXBlLAorCQkJJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwKKwkJCSZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJaWYgKHJlc3BvbnNlLnJlc3VsdF9jb2RlICE9IEdCX1NWQ19JTlRGX1VOSVBST19PSykKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisJcmV0dXJuIDA7Cit9CisKK2ludCBnYl9zdmNfaW50Zl9hY3RpdmF0ZShzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU4IGludGZfaWQsIHU4ICppbnRmX3R5cGUpCit7CisJc3RydWN0IGdiX3N2Y19pbnRmX2FjdGl2YXRlX3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZ2Jfc3ZjX2ludGZfYWN0aXZhdGVfcmVzcG9uc2UgcmVzcG9uc2U7CisJaW50IHJldDsKKworCXJlcXVlc3QuaW50Zl9pZCA9IGludGZfaWQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luY190aW1lb3V0KHN2Yy0+Y29ubmVjdGlvbiwKKwkJCUdCX1NWQ19UWVBFX0lOVEZfQUNUSVZBVEUsCisJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLAorCQkJJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpLAorCQkJU1ZDX0lOVEZfQUNUSVZBVEVfVElNRU9VVCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJaWYgKHJlc3BvbnNlLnN0YXR1cyAhPSBHQl9TVkNfT1BfU1VDQ0VTUykgeworCQlkZXZfZXJyKCZzdmMtPmRldiwgImZhaWxlZCB0byBhY3RpdmF0ZSBpbnRlcmZhY2UgJXU6ICV1XG4iLAorCQkJCWludGZfaWQsIHJlc3BvbnNlLnN0YXR1cyk7CisJCXJldHVybiAtRVJFTU9URUlPOworCX0KKworCSppbnRmX3R5cGUgPSByZXNwb25zZS5pbnRmX3R5cGU7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGdiX3N2Y19pbnRmX3Jlc3VtZShzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU4IGludGZfaWQpCit7CisJc3RydWN0IGdiX3N2Y19pbnRmX3Jlc3VtZV9yZXF1ZXN0IHJlcXVlc3Q7CisJc3RydWN0IGdiX3N2Y19pbnRmX3Jlc3VtZV9yZXNwb25zZSByZXNwb25zZTsKKwlpbnQgcmV0OworCisJcmVxdWVzdC5pbnRmX2lkID0gaW50Zl9pZDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jX3RpbWVvdXQoc3ZjLT5jb25uZWN0aW9uLAorCQkJCQlHQl9TVkNfVFlQRV9JTlRGX1JFU1VNRSwKKwkJCQkJJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwKKwkJCQkJJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpLAorCQkJCQlTVkNfSU5URl9SRVNVTUVfVElNRU9VVCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycigmc3ZjLT5kZXYsICJmYWlsZWQgdG8gc2VuZCBpbnRlcmZhY2UgcmVzdW1lICV1OiAlZFxuIiwKKwkJCWludGZfaWQsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHJlc3BvbnNlLnN0YXR1cyAhPSBHQl9TVkNfT1BfU1VDQ0VTUykgeworCQlkZXZfZXJyKCZzdmMtPmRldiwgImZhaWxlZCB0byByZXN1bWUgaW50ZXJmYWNlICV1OiAldVxuIiwKKwkJCWludGZfaWQsIHJlc3BvbnNlLnN0YXR1cyk7CisJCXJldHVybiAtRVJFTU9URUlPOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgZ2Jfc3ZjX2RtZV9wZWVyX2dldChzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU4IGludGZfaWQsIHUxNiBhdHRyLCB1MTYgc2VsZWN0b3IsCisJCQl1MzIgKnZhbHVlKQoreworCXN0cnVjdCBnYl9zdmNfZG1lX3BlZXJfZ2V0X3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZ2Jfc3ZjX2RtZV9wZWVyX2dldF9yZXNwb25zZSByZXNwb25zZTsKKwl1MTYgcmVzdWx0OworCWludCByZXQ7CisKKwlyZXF1ZXN0LmludGZfaWQgPSBpbnRmX2lkOworCXJlcXVlc3QuYXR0ciA9IGNwdV90b19sZTE2KGF0dHIpOworCXJlcXVlc3Quc2VsZWN0b3IgPSBjcHVfdG9fbGUxNihzZWxlY3Rvcik7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhzdmMtPmNvbm5lY3Rpb24sIEdCX1NWQ19UWVBFX0RNRV9QRUVSX0dFVCwKKwkJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLAorCQkJCSZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdmMtPmRldiwgImZhaWxlZCB0byBnZXQgRE1FIGF0dHJpYnV0ZSAoJXUgMHglMDR4ICV1KTogJWRcbiIsCisJCQkJaW50Zl9pZCwgYXR0ciwgc2VsZWN0b3IsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmVzdWx0ID0gbGUxNl90b19jcHUocmVzcG9uc2UucmVzdWx0X2NvZGUpOworCWlmIChyZXN1bHQpIHsKKwkJZGV2X2Vycigmc3ZjLT5kZXYsICJVbmlQcm8gZXJyb3Igd2hpbGUgZ2V0dGluZyBETUUgYXR0cmlidXRlICgldSAweCUwNHggJXUpOiAldVxuIiwKKwkJCQlpbnRmX2lkLCBhdHRyLCBzZWxlY3RvciwgcmVzdWx0KTsKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisJfQorCisJaWYgKHZhbHVlKQorCQkqdmFsdWUgPSBsZTMyX3RvX2NwdShyZXNwb25zZS5hdHRyX3ZhbHVlKTsKKworCXJldHVybiAwOworfQorCitpbnQgZ2Jfc3ZjX2RtZV9wZWVyX3NldChzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU4IGludGZfaWQsIHUxNiBhdHRyLCB1MTYgc2VsZWN0b3IsCisJCQl1MzIgdmFsdWUpCit7CisJc3RydWN0IGdiX3N2Y19kbWVfcGVlcl9zZXRfcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBnYl9zdmNfZG1lX3BlZXJfc2V0X3Jlc3BvbnNlIHJlc3BvbnNlOworCXUxNiByZXN1bHQ7CisJaW50IHJldDsKKworCXJlcXVlc3QuaW50Zl9pZCA9IGludGZfaWQ7CisJcmVxdWVzdC5hdHRyID0gY3B1X3RvX2xlMTYoYXR0cik7CisJcmVxdWVzdC5zZWxlY3RvciA9IGNwdV90b19sZTE2KHNlbGVjdG9yKTsKKwlyZXF1ZXN0LnZhbHVlID0gY3B1X3RvX2xlMzIodmFsdWUpOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoc3ZjLT5jb25uZWN0aW9uLCBHQl9TVkNfVFlQRV9ETUVfUEVFUl9TRVQsCisJCQkJJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwKKwkJCQkmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3ZjLT5kZXYsICJmYWlsZWQgdG8gc2V0IERNRSBhdHRyaWJ1dGUgKCV1IDB4JTA0eCAldSAldSk6ICVkXG4iLAorCQkJCWludGZfaWQsIGF0dHIsIHNlbGVjdG9yLCB2YWx1ZSwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXN1bHQgPSBsZTE2X3RvX2NwdShyZXNwb25zZS5yZXN1bHRfY29kZSk7CisJaWYgKHJlc3VsdCkgeworCQlkZXZfZXJyKCZzdmMtPmRldiwgIlVuaVBybyBlcnJvciB3aGlsZSBzZXR0aW5nIERNRSBhdHRyaWJ1dGUgKCV1IDB4JTA0eCAldSAldSk6ICV1XG4iLAorCQkJCWludGZfaWQsIGF0dHIsIHNlbGVjdG9yLCB2YWx1ZSwgcmVzdWx0KTsKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBnYl9zdmNfY29ubmVjdGlvbl9jcmVhdGUoc3RydWN0IGdiX3N2YyAqc3ZjLAorCQkJCXU4IGludGYxX2lkLCB1MTYgY3BvcnQxX2lkLAorCQkJCXU4IGludGYyX2lkLCB1MTYgY3BvcnQyX2lkLAorCQkJCXU4IGNwb3J0X2ZsYWdzKQoreworCXN0cnVjdCBnYl9zdmNfY29ubl9jcmVhdGVfcmVxdWVzdCByZXF1ZXN0OworCisJcmVxdWVzdC5pbnRmMV9pZCA9IGludGYxX2lkOworCXJlcXVlc3QuY3BvcnQxX2lkID0gY3B1X3RvX2xlMTYoY3BvcnQxX2lkKTsKKwlyZXF1ZXN0LmludGYyX2lkID0gaW50ZjJfaWQ7CisJcmVxdWVzdC5jcG9ydDJfaWQgPSBjcHVfdG9fbGUxNihjcG9ydDJfaWQpOworCXJlcXVlc3QudGMgPSAwOwkJLyogVEMwICovCisJcmVxdWVzdC5mbGFncyA9IGNwb3J0X2ZsYWdzOworCisJcmV0dXJuIGdiX29wZXJhdGlvbl9zeW5jKHN2Yy0+Y29ubmVjdGlvbiwgR0JfU1ZDX1RZUEVfQ09OTl9DUkVBVEUsCisJCQkJICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksIE5VTEwsIDApOworfQorCit2b2lkIGdiX3N2Y19jb25uZWN0aW9uX2Rlc3Ryb3koc3RydWN0IGdiX3N2YyAqc3ZjLCB1OCBpbnRmMV9pZCwgdTE2IGNwb3J0MV9pZCwKKwkJCSAgICAgICB1OCBpbnRmMl9pZCwgdTE2IGNwb3J0Ml9pZCkKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjX2Nvbm5fZGVzdHJveV9yZXF1ZXN0IHJlcXVlc3Q7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBzdmMtPmNvbm5lY3Rpb247CisJaW50IHJldDsKKworCXJlcXVlc3QuaW50ZjFfaWQgPSBpbnRmMV9pZDsKKwlyZXF1ZXN0LmNwb3J0MV9pZCA9IGNwdV90b19sZTE2KGNwb3J0MV9pZCk7CisJcmVxdWVzdC5pbnRmMl9pZCA9IGludGYyX2lkOworCXJlcXVlc3QuY3BvcnQyX2lkID0gY3B1X3RvX2xlMTYoY3BvcnQyX2lkKTsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sIEdCX1NWQ19UWVBFX0NPTk5fREVTVFJPWSwKKwkJCQkmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLCBOVUxMLCAwKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnN2Yy0+ZGV2LCAiZmFpbGVkIHRvIGRlc3Ryb3kgY29ubmVjdGlvbiAoJXU6JXUgJXU6JXUpOiAlZFxuIiwKKwkJCQlpbnRmMV9pZCwgY3BvcnQxX2lkLCBpbnRmMl9pZCwgY3BvcnQyX2lkLCByZXQpOworCX0KK30KKworaW50IGdiX3N2Y190aW1lc3luY19lbmFibGUoc3RydWN0IGdiX3N2YyAqc3ZjLCB1OCBjb3VudCwgdTY0IGZyYW1lX3RpbWUsCisJCQkgICB1MzIgc3Ryb2JlX2RlbGF5LCB1MzIgcmVmY2xrKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gc3ZjLT5jb25uZWN0aW9uOworCXN0cnVjdCBnYl9zdmNfdGltZXN5bmNfZW5hYmxlX3JlcXVlc3QgcmVxdWVzdDsKKworCXJlcXVlc3QuY291bnQgPSBjb3VudDsKKwlyZXF1ZXN0LmZyYW1lX3RpbWUgPSBjcHVfdG9fbGU2NChmcmFtZV90aW1lKTsKKwlyZXF1ZXN0LnN0cm9iZV9kZWxheSA9IGNwdV90b19sZTMyKHN0cm9iZV9kZWxheSk7CisJcmVxdWVzdC5yZWZjbGsgPSBjcHVfdG9fbGUzMihyZWZjbGspOworCXJldHVybiBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLAorCQkJCSBHQl9TVkNfVFlQRV9USU1FU1lOQ19FTkFCTEUsCisJCQkJICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksIE5VTEwsIDApOworfQorCitpbnQgZ2Jfc3ZjX3RpbWVzeW5jX2Rpc2FibGUoc3RydWN0IGdiX3N2YyAqc3ZjKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gc3ZjLT5jb25uZWN0aW9uOworCisJcmV0dXJuIGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sCisJCQkJIEdCX1NWQ19UWVBFX1RJTUVTWU5DX0RJU0FCTEUsCisJCQkJIE5VTEwsIDAsIE5VTEwsIDApOworfQorCitpbnQgZ2Jfc3ZjX3RpbWVzeW5jX2F1dGhvcml0YXRpdmUoc3RydWN0IGdiX3N2YyAqc3ZjLCB1NjQgKmZyYW1lX3RpbWUpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBzdmMtPmNvbm5lY3Rpb247CisJc3RydWN0IGdiX3N2Y190aW1lc3luY19hdXRob3JpdGF0aXZlX3Jlc3BvbnNlIHJlc3BvbnNlOworCWludCByZXQsIGk7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLAorCQkJCUdCX1NWQ19UWVBFX1RJTUVTWU5DX0FVVEhPUklUQVRJVkUsIE5VTEwsIDAsCisJCQkJJnJlc3BvbnNlLCBzaXplb2YocmVzcG9uc2UpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBHQl9USU1FU1lOQ19NQVhfU1RST0JFUzsgaSsrKQorCQlmcmFtZV90aW1lW2ldID0gbGU2NF90b19jcHUocmVzcG9uc2UuZnJhbWVfdGltZVtpXSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBnYl9zdmNfdGltZXN5bmNfcGluZyhzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU2NCAqZnJhbWVfdGltZSkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IHN2Yy0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2Jfc3ZjX3RpbWVzeW5jX3BpbmdfcmVzcG9uc2UgcmVzcG9uc2U7CisJaW50IHJldDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGNvbm5lY3Rpb24sCisJCQkJR0JfU1ZDX1RZUEVfVElNRVNZTkNfUElORywKKwkJCQlOVUxMLCAwLAorCQkJCSZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkqZnJhbWVfdGltZSA9IGxlNjRfdG9fY3B1KHJlc3BvbnNlLmZyYW1lX3RpbWUpOworCXJldHVybiAwOworfQorCitpbnQgZ2Jfc3ZjX3RpbWVzeW5jX3dha2VfcGluc19hY3F1aXJlKHN0cnVjdCBnYl9zdmMgKnN2YywgdTMyIHN0cm9iZV9tYXNrKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gc3ZjLT5jb25uZWN0aW9uOworCXN0cnVjdCBnYl9zdmNfdGltZXN5bmNfd2FrZV9waW5zX2FjcXVpcmVfcmVxdWVzdCByZXF1ZXN0OworCisJcmVxdWVzdC5zdHJvYmVfbWFzayA9IGNwdV90b19sZTMyKHN0cm9iZV9tYXNrKTsKKwlyZXR1cm4gZ2Jfb3BlcmF0aW9uX3N5bmMoY29ubmVjdGlvbiwKKwkJCQkgR0JfU1ZDX1RZUEVfVElNRVNZTkNfV0FLRV9QSU5TX0FDUVVJUkUsCisJCQkJICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksCisJCQkJIE5VTEwsIDApOworfQorCitpbnQgZ2Jfc3ZjX3RpbWVzeW5jX3dha2VfcGluc19yZWxlYXNlKHN0cnVjdCBnYl9zdmMgKnN2YykKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IHN2Yy0+Y29ubmVjdGlvbjsKKworCXJldHVybiBnYl9vcGVyYXRpb25fc3luYyhjb25uZWN0aW9uLAorCQkJCSBHQl9TVkNfVFlQRV9USU1FU1lOQ19XQUtFX1BJTlNfUkVMRUFTRSwKKwkJCQkgTlVMTCwgMCwgTlVMTCwgMCk7Cit9CisKKy8qIENyZWF0ZXMgYmktZGlyZWN0aW9uYWwgcm91dGVzIGJldHdlZW4gdGhlIGRldmljZXMgKi8KK2ludCBnYl9zdmNfcm91dGVfY3JlYXRlKHN0cnVjdCBnYl9zdmMgKnN2YywgdTggaW50ZjFfaWQsIHU4IGRldjFfaWQsCisJCQkgICAgICAgdTggaW50ZjJfaWQsIHU4IGRldjJfaWQpCit7CisJc3RydWN0IGdiX3N2Y19yb3V0ZV9jcmVhdGVfcmVxdWVzdCByZXF1ZXN0OworCisJcmVxdWVzdC5pbnRmMV9pZCA9IGludGYxX2lkOworCXJlcXVlc3QuZGV2MV9pZCA9IGRldjFfaWQ7CisJcmVxdWVzdC5pbnRmMl9pZCA9IGludGYyX2lkOworCXJlcXVlc3QuZGV2Ml9pZCA9IGRldjJfaWQ7CisKKwlyZXR1cm4gZ2Jfb3BlcmF0aW9uX3N5bmMoc3ZjLT5jb25uZWN0aW9uLCBHQl9TVkNfVFlQRV9ST1VURV9DUkVBVEUsCisJCQkJICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksIE5VTEwsIDApOworfQorCisvKiBEZXN0cm95cyBiaS1kaXJlY3Rpb25hbCByb3V0ZXMgYmV0d2VlbiB0aGUgZGV2aWNlcyAqLwordm9pZCBnYl9zdmNfcm91dGVfZGVzdHJveShzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU4IGludGYxX2lkLCB1OCBpbnRmMl9pZCkKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjX3JvdXRlX2Rlc3Ryb3lfcmVxdWVzdCByZXF1ZXN0OworCWludCByZXQ7CisKKwlyZXF1ZXN0LmludGYxX2lkID0gaW50ZjFfaWQ7CisJcmVxdWVzdC5pbnRmMl9pZCA9IGludGYyX2lkOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmMoc3ZjLT5jb25uZWN0aW9uLCBHQl9TVkNfVFlQRV9ST1VURV9ERVNUUk9ZLAorCQkJCSZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksIE5VTEwsIDApOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3ZjLT5kZXYsICJmYWlsZWQgdG8gZGVzdHJveSByb3V0ZSAoJXUgJXUpOiAlZFxuIiwKKwkJCQlpbnRmMV9pZCwgaW50ZjJfaWQsIHJldCk7CisJfQorfQorCitpbnQgZ2Jfc3ZjX2ludGZfc2V0X3Bvd2VyX21vZGUoc3RydWN0IGdiX3N2YyAqc3ZjLCB1OCBpbnRmX2lkLCB1OCBoc19zZXJpZXMsCisJCQkgICAgICAgdTggdHhfbW9kZSwgdTggdHhfZ2VhciwgdTggdHhfbmxhbmVzLAorCQkJICAgICAgIHU4IHR4X2FtcGxpdHVkZSwgdTggdHhfaHNfZXF1YWxpemVyLAorCQkJICAgICAgIHU4IHJ4X21vZGUsIHU4IHJ4X2dlYXIsIHU4IHJ4X25sYW5lcywKKwkJCSAgICAgICB1OCBmbGFncywgdTMyIHF1aXJrcywKKwkJCSAgICAgICBzdHJ1Y3QgZ2Jfc3ZjX2wyX3RpbWVyX2NmZyAqbG9jYWwsCisJCQkgICAgICAgc3RydWN0IGdiX3N2Y19sMl90aW1lcl9jZmcgKnJlbW90ZSkKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjX2ludGZfc2V0X3B3cm1fcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBnYl9zdmNfaW50Zl9zZXRfcHdybV9yZXNwb25zZSByZXNwb25zZTsKKwlpbnQgcmV0OworCXUxNiByZXN1bHRfY29kZTsKKworCW1lbXNldCgmcmVxdWVzdCwgMCwgc2l6ZW9mKHJlcXVlc3QpKTsKKworCXJlcXVlc3QuaW50Zl9pZCA9IGludGZfaWQ7CisJcmVxdWVzdC5oc19zZXJpZXMgPSBoc19zZXJpZXM7CisJcmVxdWVzdC50eF9tb2RlID0gdHhfbW9kZTsKKwlyZXF1ZXN0LnR4X2dlYXIgPSB0eF9nZWFyOworCXJlcXVlc3QudHhfbmxhbmVzID0gdHhfbmxhbmVzOworCXJlcXVlc3QudHhfYW1wbGl0dWRlID0gdHhfYW1wbGl0dWRlOworCXJlcXVlc3QudHhfaHNfZXF1YWxpemVyID0gdHhfaHNfZXF1YWxpemVyOworCXJlcXVlc3QucnhfbW9kZSA9IHJ4X21vZGU7CisJcmVxdWVzdC5yeF9nZWFyID0gcnhfZ2VhcjsKKwlyZXF1ZXN0LnJ4X25sYW5lcyA9IHJ4X25sYW5lczsKKwlyZXF1ZXN0LmZsYWdzID0gZmxhZ3M7CisJcmVxdWVzdC5xdWlya3MgPSBjcHVfdG9fbGUzMihxdWlya3MpOworCWlmIChsb2NhbCkKKwkJcmVxdWVzdC5sb2NhbF9sMnRpbWVyZGF0YSA9ICpsb2NhbDsKKwlpZiAocmVtb3RlKQorCQlyZXF1ZXN0LnJlbW90ZV9sMnRpbWVyZGF0YSA9ICpyZW1vdGU7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhzdmMtPmNvbm5lY3Rpb24sIEdCX1NWQ19UWVBFX0lOVEZfU0VUX1BXUk0sCisJCQkJJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwKKwkJCQkmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmVzdWx0X2NvZGUgPSByZXNwb25zZS5yZXN1bHRfY29kZTsKKwlpZiAocmVzdWx0X2NvZGUgIT0gR0JfU1ZDX1NFVFBXUk1fUFdSX0xPQ0FMKSB7CisJCWRldl9lcnIoJnN2Yy0+ZGV2LCAic2V0IHBvd2VyIG1vZGUgPSAlZFxuIiwgcmVzdWx0X2NvZGUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX3N2Y19pbnRmX3NldF9wb3dlcl9tb2RlKTsKKworaW50IGdiX3N2Y19pbnRmX3NldF9wb3dlcl9tb2RlX2hpYmVybmF0ZShzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU4IGludGZfaWQpCit7CisJc3RydWN0IGdiX3N2Y19pbnRmX3NldF9wd3JtX3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgZ2Jfc3ZjX2ludGZfc2V0X3B3cm1fcmVzcG9uc2UgcmVzcG9uc2U7CisJaW50IHJldDsKKwl1MTYgcmVzdWx0X2NvZGU7CisKKwltZW1zZXQoJnJlcXVlc3QsIDAsIHNpemVvZihyZXF1ZXN0KSk7CisKKwlyZXF1ZXN0LmludGZfaWQgPSBpbnRmX2lkOworCXJlcXVlc3QuaHNfc2VyaWVzID0gR0JfU1ZDX1VOSVBST19IU19TRVJJRVNfQTsKKwlyZXF1ZXN0LnR4X21vZGUgPSBHQl9TVkNfVU5JUFJPX0hJQkVSTkFURV9NT0RFOworCXJlcXVlc3QucnhfbW9kZSA9IEdCX1NWQ19VTklQUk9fSElCRVJOQVRFX01PREU7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhzdmMtPmNvbm5lY3Rpb24sIEdCX1NWQ19UWVBFX0lOVEZfU0VUX1BXUk0sCisJCQkJJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwKKwkJCQkmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnN2Yy0+ZGV2LAorCQkJImZhaWxlZCB0byBzZW5kIHNldCBwb3dlciBtb2RlIG9wZXJhdGlvbiB0byBpbnRlcmZhY2UgJXU6ICVkXG4iLAorCQkJaW50Zl9pZCwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXN1bHRfY29kZSA9IHJlc3BvbnNlLnJlc3VsdF9jb2RlOworCWlmIChyZXN1bHRfY29kZSAhPSBHQl9TVkNfU0VUUFdSTV9QV1JfT0spIHsKKwkJZGV2X2Vycigmc3ZjLT5kZXYsCisJCQkiZmFpbGVkIHRvIGhpYmVybmF0ZSB0aGUgbGluayBmb3IgaW50ZXJmYWNlICV1OiAldVxuIiwKKwkJCWludGZfaWQsIHJlc3VsdF9jb2RlKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBnYl9zdmNfcGluZyhzdHJ1Y3QgZ2Jfc3ZjICpzdmMpCit7CisJcmV0dXJuIGdiX29wZXJhdGlvbl9zeW5jX3RpbWVvdXQoc3ZjLT5jb25uZWN0aW9uLCBHQl9TVkNfVFlQRV9QSU5HLAorCQkJCQkgTlVMTCwgMCwgTlVMTCwgMCwKKwkJCQkJIEdCX09QRVJBVElPTl9USU1FT1VUX0RFRkFVTFQgKiAyKTsKK30KKworc3RhdGljIGludCBnYl9zdmNfdmVyc2lvbl9yZXF1ZXN0KHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gb3AtPmNvbm5lY3Rpb247CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShjb25uZWN0aW9uKTsKKwlzdHJ1Y3QgZ2Jfc3ZjX3ZlcnNpb25fcmVxdWVzdCAqcmVxdWVzdDsKKwlzdHJ1Y3QgZ2Jfc3ZjX3ZlcnNpb25fcmVzcG9uc2UgKnJlc3BvbnNlOworCisJaWYgKG9wLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUgPCBzaXplb2YoKnJlcXVlc3QpKSB7CisJCWRldl9lcnIoJnN2Yy0+ZGV2LCAic2hvcnQgdmVyc2lvbiByZXF1ZXN0ICglenUgPCAlenUpXG4iLAorCQkJCW9wLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUsCisJCQkJc2l6ZW9mKCpyZXF1ZXN0KSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlcXVlc3QgPSBvcC0+cmVxdWVzdC0+cGF5bG9hZDsKKworCWlmIChyZXF1ZXN0LT5tYWpvciA+IEdCX1NWQ19WRVJTSU9OX01BSk9SKSB7CisJCWRldl93YXJuKCZzdmMtPmRldiwgInVuc3VwcG9ydGVkIG1ham9yIHZlcnNpb24gKCV1ID4gJXUpXG4iLAorCQkJCXJlcXVlc3QtPm1ham9yLCBHQl9TVkNfVkVSU0lPTl9NQUpPUik7CisJCXJldHVybiAtRU5PVFNVUFA7CisJfQorCisJc3ZjLT5wcm90b2NvbF9tYWpvciA9IHJlcXVlc3QtPm1ham9yOworCXN2Yy0+cHJvdG9jb2xfbWlub3IgPSByZXF1ZXN0LT5taW5vcjsKKworCWlmICghZ2Jfb3BlcmF0aW9uX3Jlc3BvbnNlX2FsbG9jKG9wLCBzaXplb2YoKnJlc3BvbnNlKSwgR0ZQX0tFUk5FTCkpCisJCXJldHVybiAtRU5PTUVNOworCisJcmVzcG9uc2UgPSBvcC0+cmVzcG9uc2UtPnBheWxvYWQ7CisJcmVzcG9uc2UtPm1ham9yID0gc3ZjLT5wcm90b2NvbF9tYWpvcjsKKwlyZXNwb25zZS0+bWlub3IgPSBzdmMtPnByb3RvY29sX21pbm9yOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHB3cl9kZWJ1Z2ZzX3ZvbHRhZ2VfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkJc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpCit7CisJc3RydWN0IHN2Y19kZWJ1Z2ZzX3B3cm1vbl9yYWlsICpwd3Jtb25fcmFpbHMgPSBmaWxlLT5mX2lub2RlLT5pX3ByaXZhdGU7CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gcHdybW9uX3JhaWxzLT5zdmM7CisJaW50IHJldCwgZGVzYzsKKwl1MzIgdmFsdWU7CisJY2hhciBidWZmWzE2XTsKKworCXJldCA9IGdiX3N2Y19wd3Jtb25fc2FtcGxlX2dldChzdmMsIHB3cm1vbl9yYWlscy0+aWQsCisJCQkJICAgICAgIEdCX1NWQ19QV1JNT05fVFlQRV9WT0wsICZ2YWx1ZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdmMtPmRldiwKKwkJCSJmYWlsZWQgdG8gZ2V0IHZvbHRhZ2Ugc2FtcGxlICV1OiAlZFxuIiwKKwkJCXB3cm1vbl9yYWlscy0+aWQsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZGVzYyA9IHNjbnByaW50ZihidWZmLCBzaXplb2YoYnVmZiksICIldVxuIiwgdmFsdWUpOworCisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgbGVuLCBvZmZzZXQsIGJ1ZmYsIGRlc2MpOworfQorCitzdGF0aWMgc3NpemVfdCBwd3JfZGVidWdmc19jdXJyZW50X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJCXNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0KQoreworCXN0cnVjdCBzdmNfZGVidWdmc19wd3Jtb25fcmFpbCAqcHdybW9uX3JhaWxzID0gZmlsZS0+Zl9pbm9kZS0+aV9wcml2YXRlOworCXN0cnVjdCBnYl9zdmMgKnN2YyA9IHB3cm1vbl9yYWlscy0+c3ZjOworCWludCByZXQsIGRlc2M7CisJdTMyIHZhbHVlOworCWNoYXIgYnVmZlsxNl07CisKKwlyZXQgPSBnYl9zdmNfcHdybW9uX3NhbXBsZV9nZXQoc3ZjLCBwd3Jtb25fcmFpbHMtPmlkLAorCQkJCSAgICAgICBHQl9TVkNfUFdSTU9OX1RZUEVfQ1VSUiwgJnZhbHVlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnN2Yy0+ZGV2LAorCQkJImZhaWxlZCB0byBnZXQgY3VycmVudCBzYW1wbGUgJXU6ICVkXG4iLAorCQkJcHdybW9uX3JhaWxzLT5pZCwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkZXNjID0gc2NucHJpbnRmKGJ1ZmYsIHNpemVvZihidWZmKSwgIiV1XG4iLCB2YWx1ZSk7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBsZW4sIG9mZnNldCwgYnVmZiwgZGVzYyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHB3cl9kZWJ1Z2ZzX3Bvd2VyX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJICAgICAgc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpCit7CisJc3RydWN0IHN2Y19kZWJ1Z2ZzX3B3cm1vbl9yYWlsICpwd3Jtb25fcmFpbHMgPSBmaWxlLT5mX2lub2RlLT5pX3ByaXZhdGU7CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gcHdybW9uX3JhaWxzLT5zdmM7CisJaW50IHJldCwgZGVzYzsKKwl1MzIgdmFsdWU7CisJY2hhciBidWZmWzE2XTsKKworCXJldCA9IGdiX3N2Y19wd3Jtb25fc2FtcGxlX2dldChzdmMsIHB3cm1vbl9yYWlscy0+aWQsCisJCQkJICAgICAgIEdCX1NWQ19QV1JNT05fVFlQRV9QV1IsICZ2YWx1ZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdmMtPmRldiwgImZhaWxlZCB0byBnZXQgcG93ZXIgc2FtcGxlICV1OiAlZFxuIiwKKwkJCXB3cm1vbl9yYWlscy0+aWQsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZGVzYyA9IHNjbnByaW50ZihidWZmLCBzaXplb2YoYnVmZiksICIldVxuIiwgdmFsdWUpOworCisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgbGVuLCBvZmZzZXQsIGJ1ZmYsIGRlc2MpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwd3Jtb25fZGVidWdmc192b2x0YWdlX2ZvcHMgPSB7CisJLnJlYWQJCT0gcHdyX2RlYnVnZnNfdm9sdGFnZV9yZWFkLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHdybW9uX2RlYnVnZnNfY3VycmVudF9mb3BzID0geworCS5yZWFkCQk9IHB3cl9kZWJ1Z2ZzX2N1cnJlbnRfcmVhZCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHB3cm1vbl9kZWJ1Z2ZzX3Bvd2VyX2ZvcHMgPSB7CisJLnJlYWQJCT0gcHdyX2RlYnVnZnNfcG93ZXJfcmVhZCwKK307CisKK3N0YXRpYyB2b2lkIGdiX3N2Y19wd3Jtb25fZGVidWdmc19pbml0KHN0cnVjdCBnYl9zdmMgKnN2YykKK3sKKwlpbnQgaTsKKwlzaXplX3QgYnVmc2l6ZTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50OworCXN0cnVjdCBnYl9zdmNfcHdybW9uX3JhaWxfbmFtZXNfZ2V0X3Jlc3BvbnNlICpyYWlsX25hbWVzOworCXU4IHJhaWxfY291bnQ7CisKKwlkZW50ID0gZGVidWdmc19jcmVhdGVfZGlyKCJwd3Jtb24iLCBzdmMtPmRlYnVnZnNfZGVudHJ5KTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZGVudCkpCisJCXJldHVybjsKKworCWlmIChnYl9zdmNfcHdybW9uX3JhaWxfY291bnRfZ2V0KHN2YywgJnJhaWxfY291bnQpKQorCQlnb3RvIGVycl9wd3Jtb25fZGVidWdmczsKKworCWlmICghcmFpbF9jb3VudCB8fCByYWlsX2NvdW50ID4gR0JfU1ZDX1BXUk1PTl9NQVhfUkFJTF9DT1VOVCkKKwkJZ290byBlcnJfcHdybW9uX2RlYnVnZnM7CisKKwlidWZzaXplID0gc2l6ZW9mKCpyYWlsX25hbWVzKSArCisJCUdCX1NWQ19QV1JNT05fUkFJTF9OQU1FX0JVRlNJWkUgKiByYWlsX2NvdW50OworCisJcmFpbF9uYW1lcyA9IGt6YWxsb2MoYnVmc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyYWlsX25hbWVzKQorCQlnb3RvIGVycl9wd3Jtb25fZGVidWdmczsKKworCXN2Yy0+cHdybW9uX3JhaWxzID0ga2NhbGxvYyhyYWlsX2NvdW50LCBzaXplb2YoKnN2Yy0+cHdybW9uX3JhaWxzKSwKKwkJCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdmMtPnB3cm1vbl9yYWlscykKKwkJZ290byBlcnJfcHdybW9uX2RlYnVnZnNfZnJlZTsKKworCWlmIChnYl9zdmNfcHdybW9uX3JhaWxfbmFtZXNfZ2V0KHN2YywgcmFpbF9uYW1lcywgYnVmc2l6ZSkpCisJCWdvdG8gZXJyX3B3cm1vbl9kZWJ1Z2ZzX2ZyZWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmFpbF9jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBkZW50cnkgKmRpcjsKKwkJc3RydWN0IHN2Y19kZWJ1Z2ZzX3B3cm1vbl9yYWlsICpyYWlsID0gJnN2Yy0+cHdybW9uX3JhaWxzW2ldOworCQljaGFyIGZuYW1lW0dCX1NWQ19QV1JNT05fUkFJTF9OQU1FX0JVRlNJWkVdOworCisJCXNucHJpbnRmKGZuYW1lLCBzaXplb2YoZm5hbWUpLCAiJXMiLAorCQkJIChjaGFyICopJnJhaWxfbmFtZXMtPm5hbWVbaV0pOworCisJCXJhaWwtPmlkID0gaTsKKwkJcmFpbC0+c3ZjID0gc3ZjOworCisJCWRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihmbmFtZSwgZGVudCk7CisJCWRlYnVnZnNfY3JlYXRlX2ZpbGUoInZvbHRhZ2Vfbm93IiwgU19JUlVHTywgZGlyLCByYWlsLAorCQkJCSAgICAmcHdybW9uX2RlYnVnZnNfdm9sdGFnZV9mb3BzKTsKKwkJZGVidWdmc19jcmVhdGVfZmlsZSgiY3VycmVudF9ub3ciLCBTX0lSVUdPLCBkaXIsIHJhaWwsCisJCQkJICAgICZwd3Jtb25fZGVidWdmc19jdXJyZW50X2ZvcHMpOworCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJwb3dlcl9ub3ciLCBTX0lSVUdPLCBkaXIsIHJhaWwsCisJCQkJICAgICZwd3Jtb25fZGVidWdmc19wb3dlcl9mb3BzKTsKKwl9CisKKwlrZnJlZShyYWlsX25hbWVzKTsKKwlyZXR1cm47CisKK2Vycl9wd3Jtb25fZGVidWdmc19mcmVlOgorCWtmcmVlKHJhaWxfbmFtZXMpOworCWtmcmVlKHN2Yy0+cHdybW9uX3JhaWxzKTsKKwlzdmMtPnB3cm1vbl9yYWlscyA9IE5VTEw7CisKK2Vycl9wd3Jtb25fZGVidWdmczoKKwlkZWJ1Z2ZzX3JlbW92ZShkZW50KTsKK30KKworc3RhdGljIHZvaWQgZ2Jfc3ZjX2RlYnVnZnNfaW5pdChzdHJ1Y3QgZ2Jfc3ZjICpzdmMpCit7CisJc3ZjLT5kZWJ1Z2ZzX2RlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2RpcihkZXZfbmFtZSgmc3ZjLT5kZXYpLAorCQkJCQkJIGdiX2RlYnVnZnNfZ2V0KCkpOworCWdiX3N2Y19wd3Jtb25fZGVidWdmc19pbml0KHN2Yyk7Cit9CisKK3N0YXRpYyB2b2lkIGdiX3N2Y19kZWJ1Z2ZzX2V4aXQoc3RydWN0IGdiX3N2YyAqc3ZjKQoreworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShzdmMtPmRlYnVnZnNfZGVudHJ5KTsKKwlrZnJlZShzdmMtPnB3cm1vbl9yYWlscyk7CisJc3ZjLT5wd3Jtb25fcmFpbHMgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGdiX3N2Y19oZWxsbyhzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IG9wLT5jb25uZWN0aW9uOworCXN0cnVjdCBnYl9zdmMgKnN2YyA9IGdiX2Nvbm5lY3Rpb25fZ2V0X2RhdGEoY29ubmVjdGlvbik7CisJc3RydWN0IGdiX3N2Y19oZWxsb19yZXF1ZXN0ICpoZWxsb19yZXF1ZXN0OworCWludCByZXQ7CisKKwlpZiAob3AtPnJlcXVlc3QtPnBheWxvYWRfc2l6ZSA8IHNpemVvZigqaGVsbG9fcmVxdWVzdCkpIHsKKwkJZGV2X3dhcm4oJnN2Yy0+ZGV2LCAic2hvcnQgaGVsbG8gcmVxdWVzdCAoJXp1IDwgJXp1KVxuIiwKKwkJCQlvcC0+cmVxdWVzdC0+cGF5bG9hZF9zaXplLAorCQkJCXNpemVvZigqaGVsbG9fcmVxdWVzdCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwloZWxsb19yZXF1ZXN0ID0gb3AtPnJlcXVlc3QtPnBheWxvYWQ7CisJc3ZjLT5lbmRvX2lkID0gbGUxNl90b19jcHUoaGVsbG9fcmVxdWVzdC0+ZW5kb19pZCk7CisJc3ZjLT5hcF9pbnRmX2lkID0gaGVsbG9fcmVxdWVzdC0+aW50ZXJmYWNlX2lkOworCisJcmV0ID0gZGV2aWNlX2FkZCgmc3ZjLT5kZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3ZjLT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgc3ZjIGRldmljZTogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZ2Jfc3ZjX3dhdGNoZG9nX2NyZWF0ZShzdmMpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3ZjLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIHdhdGNoZG9nOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfdW5yZWdpc3Rlcl9kZXZpY2U7CisJfQorCisJZ2Jfc3ZjX2RlYnVnZnNfaW5pdChzdmMpOworCisJcmV0ID0gZ2JfdGltZXN5bmNfc3ZjX2FkZChzdmMpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3ZjLT5kZXYsICJmYWlsZWQgdG8gYWRkIFNWQyB0byB0aW1lc3luYzogJWRcbiIsIHJldCk7CisJCWdiX3N2Y19kZWJ1Z2ZzX2V4aXQoc3ZjKTsKKwkJZ290byBlcnJfdW5yZWdpc3Rlcl9kZXZpY2U7CisJfQorCisJcmV0dXJuIGdiX3N2Y19xdWV1ZV9kZWZlcnJlZF9yZXF1ZXN0KG9wKTsKKworZXJyX3VucmVnaXN0ZXJfZGV2aWNlOgorCWdiX3N2Y193YXRjaGRvZ19kZXN0cm95KHN2Yyk7CisJZGV2aWNlX2RlbCgmc3ZjLT5kZXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2JfaW50ZXJmYWNlICpnYl9zdmNfaW50ZXJmYWNlX2xvb2t1cChzdHJ1Y3QgZ2Jfc3ZjICpzdmMsCisJCQkJCQkJdTggaW50Zl9pZCkKK3sKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkID0gc3ZjLT5oZDsKKwlzdHJ1Y3QgZ2JfbW9kdWxlICptb2R1bGU7CisJc2l6ZV90IG51bV9pbnRlcmZhY2VzOworCXU4IG1vZHVsZV9pZDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobW9kdWxlLCAmaGQtPm1vZHVsZXMsIGhkX25vZGUpIHsKKwkJbW9kdWxlX2lkID0gbW9kdWxlLT5tb2R1bGVfaWQ7CisJCW51bV9pbnRlcmZhY2VzID0gbW9kdWxlLT5udW1faW50ZXJmYWNlczsKKworCQlpZiAoaW50Zl9pZCA+PSBtb2R1bGVfaWQgJiYKKwkJCQlpbnRmX2lkIDwgbW9kdWxlX2lkICsgbnVtX2ludGVyZmFjZXMpIHsKKwkJCXJldHVybiBtb2R1bGUtPmludGVyZmFjZXNbaW50Zl9pZCAtIG1vZHVsZV9pZF07CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBnYl9tb2R1bGUgKmdiX3N2Y19tb2R1bGVfbG9va3VwKHN0cnVjdCBnYl9zdmMgKnN2YywgdTggbW9kdWxlX2lkKQoreworCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQgPSBzdmMtPmhkOworCXN0cnVjdCBnYl9tb2R1bGUgKm1vZHVsZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobW9kdWxlLCAmaGQtPm1vZHVsZXMsIGhkX25vZGUpIHsKKwkJaWYgKG1vZHVsZS0+bW9kdWxlX2lkID09IG1vZHVsZV9pZCkKKwkJCXJldHVybiBtb2R1bGU7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGdiX3N2Y19wcm9jZXNzX2hlbGxvX2RlZmVycmVkKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbikKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IG9wZXJhdGlvbi0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSBnYl9jb25uZWN0aW9uX2dldF9kYXRhKGNvbm5lY3Rpb24pOworCWludCByZXQ7CisKKwkvKgorCSAqIFhYWCBUaGlzIGlzIGEgaGFjay93b3JrLWFyb3VuZCB0byByZWNvbmZpZ3VyZSB0aGUgQVBCcmlkZ2VBLVN3aXRjaAorCSAqIGxpbmsgdG8gUFdNIEcyLCAxIExhbmUsIFNsb3cgQXV0bywgc28gdGhhdCBpdCBoYXMgc3VmZmljaWVudAorCSAqIGJhbmR3aWR0aCBmb3IgMyBhdWRpbyBzdHJlYW1zIHBsdXMgYm9vdC1vdmVyLVVuaVBybyBvZiBhIGhvdC1wbHVnZ2VkCisJICogbW9kdWxlLgorCSAqCisJICogVGhlIGNvZGUgc2hvdWxkIGJlIHJlbW92ZWQgb25jZSBTVy0yMjE3LCBIZXVyaXN0aWMgZm9yIFVuaVBybworCSAqIFBvd2VyIE1vZGUgQ2hhbmdlcyBpcyByZXNvbHZlZC4KKwkgKi8KKwlyZXQgPSBnYl9zdmNfaW50Zl9zZXRfcG93ZXJfbW9kZShzdmMsIHN2Yy0+YXBfaW50Zl9pZCwKKwkJCQkJR0JfU1ZDX1VOSVBST19IU19TRVJJRVNfQSwKKwkJCQkJR0JfU1ZDX1VOSVBST19TTE9XX0FVVE9fTU9ERSwKKwkJCQkJMiwgMSwKKwkJCQkJR0JfU1ZDX1NNQUxMX0FNUExJVFVERSwgR0JfU1ZDX05PX0RFX0VNUEhBU0lTLAorCQkJCQlHQl9TVkNfVU5JUFJPX1NMT1dfQVVUT19NT0RFLAorCQkJCQkyLCAxLAorCQkJCQkwLCAwLAorCQkJCQlOVUxMLCBOVUxMKTsKKworCWlmIChyZXQpCisJCWRldl93YXJuKCZzdmMtPmRldiwKKwkJCSJwb3dlciBtb2RlIGNoYW5nZSBmYWlsZWQgb24gQVAgdG8gc3dpdGNoIGxpbms6ICVkXG4iLAorCQkJcmV0KTsKK30KKworc3RhdGljIHZvaWQgZ2Jfc3ZjX3Byb2Nlc3NfbW9kdWxlX2luc2VydGVkKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbikKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjX21vZHVsZV9pbnNlcnRlZF9yZXF1ZXN0ICpyZXF1ZXN0OworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gb3BlcmF0aW9uLT5jb25uZWN0aW9uOworCXN0cnVjdCBnYl9zdmMgKnN2YyA9IGdiX2Nvbm5lY3Rpb25fZ2V0X2RhdGEoY29ubmVjdGlvbik7CisJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZCA9IHN2Yy0+aGQ7CisJc3RydWN0IGdiX21vZHVsZSAqbW9kdWxlOworCXNpemVfdCBudW1faW50ZXJmYWNlczsKKwl1OCBtb2R1bGVfaWQ7CisJdTE2IGZsYWdzOworCWludCByZXQ7CisKKwkvKiBUaGUgcmVxdWVzdCBtZXNzYWdlIHNpemUgaGFzIGFscmVhZHkgYmVlbiB2ZXJpZmllZC4gKi8KKwlyZXF1ZXN0ID0gb3BlcmF0aW9uLT5yZXF1ZXN0LT5wYXlsb2FkOworCW1vZHVsZV9pZCA9IHJlcXVlc3QtPnByaW1hcnlfaW50Zl9pZDsKKwludW1faW50ZXJmYWNlcyA9IHJlcXVlc3QtPmludGZfY291bnQ7CisJZmxhZ3MgPSBsZTE2X3RvX2NwdShyZXF1ZXN0LT5mbGFncyk7CisKKwlkZXZfZGJnKCZzdmMtPmRldiwgIiVzIC0gaWQgPSAldSwgbnVtX2ludGVyZmFjZXMgPSAlenUsIGZsYWdzID0gMHglMDR4XG4iLAorCQkJX19mdW5jX18sIG1vZHVsZV9pZCwgbnVtX2ludGVyZmFjZXMsIGZsYWdzKTsKKworCWlmIChmbGFncyAmIEdCX1NWQ19NT0RVTEVfSU5TRVJURURfRkxBR19OT19QUklNQVJZKSB7CisJCWRldl93YXJuKCZzdmMtPmRldiwgIm5vIHByaW1hcnkgaW50ZXJmYWNlIGRldGVjdGVkIG9uIG1vZHVsZSAldVxuIiwKKwkJCQltb2R1bGVfaWQpOworCX0KKworCW1vZHVsZSA9IGdiX3N2Y19tb2R1bGVfbG9va3VwKHN2YywgbW9kdWxlX2lkKTsKKwlpZiAobW9kdWxlKSB7CisJCWRldl93YXJuKCZzdmMtPmRldiwgInVuZXhwZWN0ZWQgbW9kdWxlLWluc2VydGVkIGV2ZW50ICV1XG4iLAorCQkJCW1vZHVsZV9pZCk7CisJCXJldHVybjsKKwl9CisKKwltb2R1bGUgPSBnYl9tb2R1bGVfY3JlYXRlKGhkLCBtb2R1bGVfaWQsIG51bV9pbnRlcmZhY2VzKTsKKwlpZiAoIW1vZHVsZSkgeworCQlkZXZfZXJyKCZzdmMtPmRldiwgImZhaWxlZCB0byBjcmVhdGUgbW9kdWxlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXJldCA9IGdiX21vZHVsZV9hZGQobW9kdWxlKTsKKwlpZiAocmV0KSB7CisJCWdiX21vZHVsZV9wdXQobW9kdWxlKTsKKwkJcmV0dXJuOworCX0KKworCWxpc3RfYWRkKCZtb2R1bGUtPmhkX25vZGUsICZoZC0+bW9kdWxlcyk7Cit9CisKK3N0YXRpYyB2b2lkIGdiX3N2Y19wcm9jZXNzX21vZHVsZV9yZW1vdmVkKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbikKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjX21vZHVsZV9yZW1vdmVkX3JlcXVlc3QgKnJlcXVlc3Q7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBvcGVyYXRpb24tPmNvbm5lY3Rpb247CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShjb25uZWN0aW9uKTsKKwlzdHJ1Y3QgZ2JfbW9kdWxlICptb2R1bGU7CisJdTggbW9kdWxlX2lkOworCisJLyogVGhlIHJlcXVlc3QgbWVzc2FnZSBzaXplIGhhcyBhbHJlYWR5IGJlZW4gdmVyaWZpZWQuICovCisJcmVxdWVzdCA9IG9wZXJhdGlvbi0+cmVxdWVzdC0+cGF5bG9hZDsKKwltb2R1bGVfaWQgPSByZXF1ZXN0LT5wcmltYXJ5X2ludGZfaWQ7CisKKwlkZXZfZGJnKCZzdmMtPmRldiwgIiVzIC0gaWQgPSAldVxuIiwgX19mdW5jX18sIG1vZHVsZV9pZCk7CisKKwltb2R1bGUgPSBnYl9zdmNfbW9kdWxlX2xvb2t1cChzdmMsIG1vZHVsZV9pZCk7CisJaWYgKCFtb2R1bGUpIHsKKwkJZGV2X3dhcm4oJnN2Yy0+ZGV2LCAidW5leHBlY3RlZCBtb2R1bGUtcmVtb3ZlZCBldmVudCAldVxuIiwKKwkJCQltb2R1bGVfaWQpOworCQlyZXR1cm47CisJfQorCisJbW9kdWxlLT5kaXNjb25uZWN0ZWQgPSB0cnVlOworCisJZ2JfbW9kdWxlX2RlbChtb2R1bGUpOworCWxpc3RfZGVsKCZtb2R1bGUtPmhkX25vZGUpOworCWdiX21vZHVsZV9wdXQobW9kdWxlKTsKK30KKworc3RhdGljIHZvaWQgZ2Jfc3ZjX3Byb2Nlc3NfaW50Zl9vb3BzKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbikKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjX2ludGZfb29wc19yZXF1ZXN0ICpyZXF1ZXN0OworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gb3BlcmF0aW9uLT5jb25uZWN0aW9uOworCXN0cnVjdCBnYl9zdmMgKnN2YyA9IGdiX2Nvbm5lY3Rpb25fZ2V0X2RhdGEoY29ubmVjdGlvbik7CisJc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZjsKKwl1OCBpbnRmX2lkOworCXU4IHJlYXNvbjsKKworCS8qIFRoZSByZXF1ZXN0IG1lc3NhZ2Ugc2l6ZSBoYXMgYWxyZWFkeSBiZWVuIHZlcmlmaWVkLiAqLworCXJlcXVlc3QgPSBvcGVyYXRpb24tPnJlcXVlc3QtPnBheWxvYWQ7CisJaW50Zl9pZCA9IHJlcXVlc3QtPmludGZfaWQ7CisJcmVhc29uID0gcmVxdWVzdC0+cmVhc29uOworCisJaW50ZiA9IGdiX3N2Y19pbnRlcmZhY2VfbG9va3VwKHN2YywgaW50Zl9pZCk7CisJaWYgKCFpbnRmKSB7CisJCWRldl93YXJuKCZzdmMtPmRldiwgInVuZXhwZWN0ZWQgaW50ZXJmYWNlLW9vcHMgZXZlbnQgJXVcbiIsCisJCQkgaW50Zl9pZCk7CisJCXJldHVybjsKKwl9CisKKwlkZXZfaW5mbygmc3ZjLT5kZXYsICJEZWFjdGl2YXRpbmcgaW50ZXJmYWNlICV1LCBpbnRlcmZhY2Ugb29wcyByZWFzb24gPSAldVxuIiwKKwkJIGludGZfaWQsIHJlYXNvbik7CisKKwltdXRleF9sb2NrKCZpbnRmLT5tdXRleCk7CisJaW50Zi0+ZGlzY29ubmVjdGVkID0gdHJ1ZTsKKwlnYl9pbnRlcmZhY2VfZGlzYWJsZShpbnRmKTsKKwlnYl9pbnRlcmZhY2VfZGVhY3RpdmF0ZShpbnRmKTsKKwltdXRleF91bmxvY2soJmludGYtPm11dGV4KTsKK30KKworc3RhdGljIHZvaWQgZ2Jfc3ZjX3Byb2Nlc3NfaW50Zl9tYWlsYm94X2V2ZW50KHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbikKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjX2ludGZfbWFpbGJveF9ldmVudF9yZXF1ZXN0ICpyZXF1ZXN0OworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gb3BlcmF0aW9uLT5jb25uZWN0aW9uOworCXN0cnVjdCBnYl9zdmMgKnN2YyA9IGdiX2Nvbm5lY3Rpb25fZ2V0X2RhdGEoY29ubmVjdGlvbik7CisJc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZjsKKwl1OCBpbnRmX2lkOworCXUxNiByZXN1bHRfY29kZTsKKwl1MzIgbWFpbGJveDsKKworCS8qIFRoZSByZXF1ZXN0IG1lc3NhZ2Ugc2l6ZSBoYXMgYWxyZWFkeSBiZWVuIHZlcmlmaWVkLiAqLworCXJlcXVlc3QgPSBvcGVyYXRpb24tPnJlcXVlc3QtPnBheWxvYWQ7CisJaW50Zl9pZCA9IHJlcXVlc3QtPmludGZfaWQ7CisJcmVzdWx0X2NvZGUgPSBsZTE2X3RvX2NwdShyZXF1ZXN0LT5yZXN1bHRfY29kZSk7CisJbWFpbGJveCA9IGxlMzJfdG9fY3B1KHJlcXVlc3QtPm1haWxib3gpOworCisJZGV2X2RiZygmc3ZjLT5kZXYsICIlcyAtIGlkID0gJXUsIHJlc3VsdCA9IDB4JTA0eCwgbWFpbGJveCA9IDB4JTA4eFxuIiwKKwkJCV9fZnVuY19fLCBpbnRmX2lkLCByZXN1bHRfY29kZSwgbWFpbGJveCk7CisKKwlpbnRmID0gZ2Jfc3ZjX2ludGVyZmFjZV9sb29rdXAoc3ZjLCBpbnRmX2lkKTsKKwlpZiAoIWludGYpIHsKKwkJZGV2X3dhcm4oJnN2Yy0+ZGV2LCAidW5leHBlY3RlZCBtYWlsYm94IGV2ZW50ICV1XG4iLCBpbnRmX2lkKTsKKwkJcmV0dXJuOworCX0KKworCWdiX2ludGVyZmFjZV9tYWlsYm94X2V2ZW50KGludGYsIHJlc3VsdF9jb2RlLCBtYWlsYm94KTsKK30KKworc3RhdGljIHZvaWQgZ2Jfc3ZjX3Byb2Nlc3NfZGVmZXJyZWRfcmVxdWVzdChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGdiX3N2Y19kZWZlcnJlZF9yZXF1ZXN0ICpkcjsKKwlzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb247CisJc3RydWN0IGdiX3N2YyAqc3ZjOworCXU4IHR5cGU7CisKKwlkciA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZ2Jfc3ZjX2RlZmVycmVkX3JlcXVlc3QsIHdvcmspOworCW9wZXJhdGlvbiA9IGRyLT5vcGVyYXRpb247CisJc3ZjID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShvcGVyYXRpb24tPmNvbm5lY3Rpb24pOworCXR5cGUgPSBvcGVyYXRpb24tPnJlcXVlc3QtPmhlYWRlci0+dHlwZTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgR0JfU1ZDX1RZUEVfU1ZDX0hFTExPOgorCQlnYl9zdmNfcHJvY2Vzc19oZWxsb19kZWZlcnJlZChvcGVyYXRpb24pOworCQlicmVhazsKKwljYXNlIEdCX1NWQ19UWVBFX01PRFVMRV9JTlNFUlRFRDoKKwkJZ2Jfc3ZjX3Byb2Nlc3NfbW9kdWxlX2luc2VydGVkKG9wZXJhdGlvbik7CisJCWJyZWFrOworCWNhc2UgR0JfU1ZDX1RZUEVfTU9EVUxFX1JFTU9WRUQ6CisJCWdiX3N2Y19wcm9jZXNzX21vZHVsZV9yZW1vdmVkKG9wZXJhdGlvbik7CisJCWJyZWFrOworCWNhc2UgR0JfU1ZDX1RZUEVfSU5URl9NQUlMQk9YX0VWRU5UOgorCQlnYl9zdmNfcHJvY2Vzc19pbnRmX21haWxib3hfZXZlbnQob3BlcmF0aW9uKTsKKwkJYnJlYWs7CisJY2FzZSBHQl9TVkNfVFlQRV9JTlRGX09PUFM6CisJCWdiX3N2Y19wcm9jZXNzX2ludGZfb29wcyhvcGVyYXRpb24pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZzdmMtPmRldiwgImJhZCBkZWZlcnJlZCByZXF1ZXN0IHR5cGU6IDB4JTAyeFxuIiwgdHlwZSk7CisJfQorCisJZ2Jfb3BlcmF0aW9uX3B1dChvcGVyYXRpb24pOworCWtmcmVlKGRyKTsKK30KKworc3RhdGljIGludCBnYl9zdmNfcXVldWVfZGVmZXJyZWRfcmVxdWVzdChzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcGVyYXRpb24pCit7CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShvcGVyYXRpb24tPmNvbm5lY3Rpb24pOworCXN0cnVjdCBnYl9zdmNfZGVmZXJyZWRfcmVxdWVzdCAqZHI7CisKKwlkciA9IGttYWxsb2Moc2l6ZW9mKCpkciksIEdGUF9LRVJORUwpOworCWlmICghZHIpCisJCXJldHVybiAtRU5PTUVNOworCisJZ2Jfb3BlcmF0aW9uX2dldChvcGVyYXRpb24pOworCisJZHItPm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKKwlJTklUX1dPUksoJmRyLT53b3JrLCBnYl9zdmNfcHJvY2Vzc19kZWZlcnJlZF9yZXF1ZXN0KTsKKworCXF1ZXVlX3dvcmsoc3ZjLT53cSwgJmRyLT53b3JrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX3N2Y19pbnRmX3Jlc2V0X3JlY3Yoc3RydWN0IGdiX29wZXJhdGlvbiAqb3ApCit7CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShvcC0+Y29ubmVjdGlvbik7CisJc3RydWN0IGdiX21lc3NhZ2UgKnJlcXVlc3QgPSBvcC0+cmVxdWVzdDsKKwlzdHJ1Y3QgZ2Jfc3ZjX2ludGZfcmVzZXRfcmVxdWVzdCAqcmVzZXQ7CisJdTggaW50Zl9pZDsKKworCWlmIChyZXF1ZXN0LT5wYXlsb2FkX3NpemUgPCBzaXplb2YoKnJlc2V0KSkgeworCQlkZXZfd2Fybigmc3ZjLT5kZXYsICJzaG9ydCByZXNldCByZXF1ZXN0IHJlY2VpdmVkICglenUgPCAlenUpXG4iLAorCQkJCXJlcXVlc3QtPnBheWxvYWRfc2l6ZSwgc2l6ZW9mKCpyZXNldCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmVzZXQgPSByZXF1ZXN0LT5wYXlsb2FkOworCisJaW50Zl9pZCA9IHJlc2V0LT5pbnRmX2lkOworCisJLyogRklYTUUgUmVzZXQgdGhlIGludGVyZmFjZSBoZXJlICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl9zdmNfbW9kdWxlX2luc2VydGVkX3JlY3Yoc3RydWN0IGdiX29wZXJhdGlvbiAqb3ApCit7CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShvcC0+Y29ubmVjdGlvbik7CisJc3RydWN0IGdiX3N2Y19tb2R1bGVfaW5zZXJ0ZWRfcmVxdWVzdCAqcmVxdWVzdDsKKworCWlmIChvcC0+cmVxdWVzdC0+cGF5bG9hZF9zaXplIDwgc2l6ZW9mKCpyZXF1ZXN0KSkgeworCQlkZXZfd2Fybigmc3ZjLT5kZXYsICJzaG9ydCBtb2R1bGUtaW5zZXJ0ZWQgcmVxdWVzdCByZWNlaXZlZCAoJXp1IDwgJXp1KVxuIiwKKwkJCQlvcC0+cmVxdWVzdC0+cGF5bG9hZF9zaXplLCBzaXplb2YoKnJlcXVlc3QpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVxdWVzdCA9IG9wLT5yZXF1ZXN0LT5wYXlsb2FkOworCisJZGV2X2RiZygmc3ZjLT5kZXYsICIlcyAtIGlkID0gJXVcbiIsIF9fZnVuY19fLAorCQkJcmVxdWVzdC0+cHJpbWFyeV9pbnRmX2lkKTsKKworCXJldHVybiBnYl9zdmNfcXVldWVfZGVmZXJyZWRfcmVxdWVzdChvcCk7Cit9CisKK3N0YXRpYyBpbnQgZ2Jfc3ZjX21vZHVsZV9yZW1vdmVkX3JlY3Yoc3RydWN0IGdiX29wZXJhdGlvbiAqb3ApCit7CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShvcC0+Y29ubmVjdGlvbik7CisJc3RydWN0IGdiX3N2Y19tb2R1bGVfcmVtb3ZlZF9yZXF1ZXN0ICpyZXF1ZXN0OworCisJaWYgKG9wLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUgPCBzaXplb2YoKnJlcXVlc3QpKSB7CisJCWRldl93YXJuKCZzdmMtPmRldiwgInNob3J0IG1vZHVsZS1yZW1vdmVkIHJlcXVlc3QgcmVjZWl2ZWQgKCV6dSA8ICV6dSlcbiIsCisJCQkJb3AtPnJlcXVlc3QtPnBheWxvYWRfc2l6ZSwgc2l6ZW9mKCpyZXF1ZXN0KSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlcXVlc3QgPSBvcC0+cmVxdWVzdC0+cGF5bG9hZDsKKworCWRldl9kYmcoJnN2Yy0+ZGV2LCAiJXMgLSBpZCA9ICV1XG4iLCBfX2Z1bmNfXywKKwkJCXJlcXVlc3QtPnByaW1hcnlfaW50Zl9pZCk7CisKKwlyZXR1cm4gZ2Jfc3ZjX3F1ZXVlX2RlZmVycmVkX3JlcXVlc3Qob3ApOworfQorCitzdGF0aWMgaW50IGdiX3N2Y19pbnRmX29vcHNfcmVjdihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcCkKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSBnYl9jb25uZWN0aW9uX2dldF9kYXRhKG9wLT5jb25uZWN0aW9uKTsKKwlzdHJ1Y3QgZ2Jfc3ZjX2ludGZfb29wc19yZXF1ZXN0ICpyZXF1ZXN0OworCisJaWYgKG9wLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUgPCBzaXplb2YoKnJlcXVlc3QpKSB7CisJCWRldl93YXJuKCZzdmMtPmRldiwgInNob3J0IGludGYtb29wcyByZXF1ZXN0IHJlY2VpdmVkICglenUgPCAlenUpXG4iLAorCQkJIG9wLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUsIHNpemVvZigqcmVxdWVzdCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gZ2Jfc3ZjX3F1ZXVlX2RlZmVycmVkX3JlcXVlc3Qob3ApOworfQorCitzdGF0aWMgaW50IGdiX3N2Y19pbnRmX21haWxib3hfZXZlbnRfcmVjdihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcCkKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSBnYl9jb25uZWN0aW9uX2dldF9kYXRhKG9wLT5jb25uZWN0aW9uKTsKKwlzdHJ1Y3QgZ2Jfc3ZjX2ludGZfbWFpbGJveF9ldmVudF9yZXF1ZXN0ICpyZXF1ZXN0OworCisJaWYgKG9wLT5yZXF1ZXN0LT5wYXlsb2FkX3NpemUgPCBzaXplb2YoKnJlcXVlc3QpKSB7CisJCWRldl93YXJuKCZzdmMtPmRldiwgInNob3J0IG1haWxib3ggcmVxdWVzdCByZWNlaXZlZCAoJXp1IDwgJXp1KVxuIiwKKwkJCQlvcC0+cmVxdWVzdC0+cGF5bG9hZF9zaXplLCBzaXplb2YoKnJlcXVlc3QpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVxdWVzdCA9IG9wLT5yZXF1ZXN0LT5wYXlsb2FkOworCisJZGV2X2RiZygmc3ZjLT5kZXYsICIlcyAtIGlkID0gJXVcbiIsIF9fZnVuY19fLCByZXF1ZXN0LT5pbnRmX2lkKTsKKworCXJldHVybiBnYl9zdmNfcXVldWVfZGVmZXJyZWRfcmVxdWVzdChvcCk7Cit9CisKK3N0YXRpYyBpbnQgZ2Jfc3ZjX3JlcXVlc3RfaGFuZGxlcihzdHJ1Y3QgZ2Jfb3BlcmF0aW9uICpvcCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbiA9IG9wLT5jb25uZWN0aW9uOworCXN0cnVjdCBnYl9zdmMgKnN2YyA9IGdiX2Nvbm5lY3Rpb25fZ2V0X2RhdGEoY29ubmVjdGlvbik7CisJdTggdHlwZSA9IG9wLT50eXBlOworCWludCByZXQgPSAwOworCisJLyoKKwkgKiBTVkMgcmVxdWVzdHMgbmVlZCB0byBmb2xsb3cgYSBzcGVjaWZpYyBvcmRlciAoYXQgbGVhc3QgaW5pdGlhbGx5KSBhbmQKKwkgKiBiZWxvdyBjb2RlIHRha2VzIGNhcmUgb2YgZW5mb3JjaW5nIHRoYXQuIFRoZSBleHBlY3RlZCBvcmRlciBpczoKKwkgKiAtIFBST1RPQ09MX1ZFUlNJT04KKwkgKiAtIFNWQ19IRUxMTworCSAqIC0gQW55IG90aGVyIHJlcXVlc3QsIGJ1dCB0aGUgZWFybGllciB0d28uCisJICoKKwkgKiBJbmNvbWluZyByZXF1ZXN0cyBhcmUgZ3VhcmFudGVlZCB0byBiZSBzZXJpYWxpemVkIGFuZCBzbyB3ZSBkb24ndAorCSAqIG5lZWQgdG8gcHJvdGVjdCAnc3RhdGUnIGZvciBhbnkgcmFjZXMuCisJICovCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBHQl9TVkNfVFlQRV9QUk9UT0NPTF9WRVJTSU9OOgorCQlpZiAoc3ZjLT5zdGF0ZSAhPSBHQl9TVkNfU1RBVEVfUkVTRVQpCisJCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIEdCX1NWQ19UWVBFX1NWQ19IRUxMTzoKKwkJaWYgKHN2Yy0+c3RhdGUgIT0gR0JfU1ZDX1NUQVRFX1BST1RPQ09MX1ZFUlNJT04pCisJCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoc3ZjLT5zdGF0ZSAhPSBHQl9TVkNfU1RBVEVfU1ZDX0hFTExPKQorCQkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJaWYgKHJldCkgeworCQlkZXZfd2Fybigmc3ZjLT5kZXYsICJ1bmV4cGVjdGVkIHJlcXVlc3QgMHglMDJ4IHJlY2VpdmVkIChzdGF0ZSAldSlcbiIsCisJCQkJdHlwZSwgc3ZjLT5zdGF0ZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBHQl9TVkNfVFlQRV9QUk9UT0NPTF9WRVJTSU9OOgorCQlyZXQgPSBnYl9zdmNfdmVyc2lvbl9yZXF1ZXN0KG9wKTsKKwkJaWYgKCFyZXQpCisJCQlzdmMtPnN0YXRlID0gR0JfU1ZDX1NUQVRFX1BST1RPQ09MX1ZFUlNJT047CisJCXJldHVybiByZXQ7CisJY2FzZSBHQl9TVkNfVFlQRV9TVkNfSEVMTE86CisJCXJldCA9IGdiX3N2Y19oZWxsbyhvcCk7CisJCWlmICghcmV0KQorCQkJc3ZjLT5zdGF0ZSA9IEdCX1NWQ19TVEFURV9TVkNfSEVMTE87CisJCXJldHVybiByZXQ7CisJY2FzZSBHQl9TVkNfVFlQRV9JTlRGX1JFU0VUOgorCQlyZXR1cm4gZ2Jfc3ZjX2ludGZfcmVzZXRfcmVjdihvcCk7CisJY2FzZSBHQl9TVkNfVFlQRV9NT0RVTEVfSU5TRVJURUQ6CisJCXJldHVybiBnYl9zdmNfbW9kdWxlX2luc2VydGVkX3JlY3Yob3ApOworCWNhc2UgR0JfU1ZDX1RZUEVfTU9EVUxFX1JFTU9WRUQ6CisJCXJldHVybiBnYl9zdmNfbW9kdWxlX3JlbW92ZWRfcmVjdihvcCk7CisJY2FzZSBHQl9TVkNfVFlQRV9JTlRGX01BSUxCT1hfRVZFTlQ6CisJCXJldHVybiBnYl9zdmNfaW50Zl9tYWlsYm94X2V2ZW50X3JlY3Yob3ApOworCWNhc2UgR0JfU1ZDX1RZUEVfSU5URl9PT1BTOgorCQlyZXR1cm4gZ2Jfc3ZjX2ludGZfb29wc19yZWN2KG9wKTsKKwlkZWZhdWx0OgorCQlkZXZfd2Fybigmc3ZjLT5kZXYsICJ1bnN1cHBvcnRlZCByZXF1ZXN0IDB4JTAyeFxuIiwgdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIHZvaWQgZ2Jfc3ZjX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBnYl9zdmMgKnN2YyA9IHRvX2diX3N2YyhkZXYpOworCisJaWYgKHN2Yy0+Y29ubmVjdGlvbikKKwkJZ2JfY29ubmVjdGlvbl9kZXN0cm95KHN2Yy0+Y29ubmVjdGlvbik7CisJaWRhX2Rlc3Ryb3koJnN2Yy0+ZGV2aWNlX2lkX21hcCk7CisJZGVzdHJveV93b3JrcXVldWUoc3ZjLT53cSk7CisJa2ZyZWUoc3ZjKTsKK30KKworc3RydWN0IGRldmljZV90eXBlIGdyZXlidXNfc3ZjX3R5cGUgPSB7CisJLm5hbWUJCT0gImdyZXlidXNfc3ZjIiwKKwkucmVsZWFzZQk9IGdiX3N2Y19yZWxlYXNlLAorfTsKKworc3RydWN0IGdiX3N2YyAqZ2Jfc3ZjX2NyZWF0ZShzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkKQoreworCXN0cnVjdCBnYl9zdmMgKnN2YzsKKworCXN2YyA9IGt6YWxsb2Moc2l6ZW9mKCpzdmMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN2YykKKwkJcmV0dXJuIE5VTEw7CisKKwlzdmMtPndxID0gYWxsb2Nfd29ya3F1ZXVlKCIlczpzdmMiLCBXUV9VTkJPVU5ELCAxLCBkZXZfbmFtZSgmaGQtPmRldikpOworCWlmICghc3ZjLT53cSkgeworCQlrZnJlZShzdmMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzdmMtPmRldi5wYXJlbnQgPSAmaGQtPmRldjsKKwlzdmMtPmRldi5idXMgPSAmZ3JleWJ1c19idXNfdHlwZTsKKwlzdmMtPmRldi50eXBlID0gJmdyZXlidXNfc3ZjX3R5cGU7CisJc3ZjLT5kZXYuZ3JvdXBzID0gc3ZjX2dyb3VwczsKKwlzdmMtPmRldi5kbWFfbWFzayA9IHN2Yy0+ZGV2LnBhcmVudC0+ZG1hX21hc2s7CisJZGV2aWNlX2luaXRpYWxpemUoJnN2Yy0+ZGV2KTsKKworCWRldl9zZXRfbmFtZSgmc3ZjLT5kZXYsICIlZC1zdmMiLCBoZC0+YnVzX2lkKTsKKworCWlkYV9pbml0KCZzdmMtPmRldmljZV9pZF9tYXApOworCXN2Yy0+c3RhdGUgPSBHQl9TVkNfU1RBVEVfUkVTRVQ7CisJc3ZjLT5oZCA9IGhkOworCisJc3ZjLT5jb25uZWN0aW9uID0gZ2JfY29ubmVjdGlvbl9jcmVhdGVfc3RhdGljKGhkLCBHQl9TVkNfQ1BPUlRfSUQsCisJCQkJCQlnYl9zdmNfcmVxdWVzdF9oYW5kbGVyKTsKKwlpZiAoSVNfRVJSKHN2Yy0+Y29ubmVjdGlvbikpIHsKKwkJZGV2X2Vycigmc3ZjLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIGNvbm5lY3Rpb246ICVsZFxuIiwKKwkJCQlQVFJfRVJSKHN2Yy0+Y29ubmVjdGlvbikpOworCQlnb3RvIGVycl9wdXRfZGV2aWNlOworCX0KKworCWdiX2Nvbm5lY3Rpb25fc2V0X2RhdGEoc3ZjLT5jb25uZWN0aW9uLCBzdmMpOworCisJcmV0dXJuIHN2YzsKKworZXJyX3B1dF9kZXZpY2U6CisJcHV0X2RldmljZSgmc3ZjLT5kZXYpOworCXJldHVybiBOVUxMOworfQorCitpbnQgZ2Jfc3ZjX2FkZChzdHJ1Y3QgZ2Jfc3ZjICpzdmMpCit7CisJaW50IHJldDsKKworCS8qCisJICogVGhlIFNWQyBwcm90b2NvbCBpcyBjdXJyZW50bHkgZHJpdmVuIGJ5IHRoZSBTVkMsIHNvIHRoZSBTVkMgZGV2aWNlCisJICogaXMgYWRkZWQgZnJvbSB0aGUgY29ubmVjdGlvbiByZXF1ZXN0IGhhbmRsZXIgd2hlbiBlbm91Z2gKKwkgKiBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZWNlaXZlZC4KKwkgKi8KKwlyZXQgPSBnYl9jb25uZWN0aW9uX2VuYWJsZShzdmMtPmNvbm5lY3Rpb24pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2Jfc3ZjX3JlbW92ZV9tb2R1bGVzKHN0cnVjdCBnYl9zdmMgKnN2YykKK3sKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkID0gc3ZjLT5oZDsKKwlzdHJ1Y3QgZ2JfbW9kdWxlICptb2R1bGUsICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobW9kdWxlLCB0bXAsICZoZC0+bW9kdWxlcywgaGRfbm9kZSkgeworCQlnYl9tb2R1bGVfZGVsKG1vZHVsZSk7CisJCWxpc3RfZGVsKCZtb2R1bGUtPmhkX25vZGUpOworCQlnYl9tb2R1bGVfcHV0KG1vZHVsZSk7CisJfQorfQorCit2b2lkIGdiX3N2Y19kZWwoc3RydWN0IGdiX3N2YyAqc3ZjKQoreworCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZV9yeChzdmMtPmNvbm5lY3Rpb24pOworCisJLyoKKwkgKiBUaGUgU1ZDIGRldmljZSBtYXkgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQgZnJvbSB0aGUgcmVxdWVzdCBoYW5kbGVyLgorCSAqLworCWlmIChkZXZpY2VfaXNfcmVnaXN0ZXJlZCgmc3ZjLT5kZXYpKSB7CisJCWdiX3RpbWVzeW5jX3N2Y19yZW1vdmUoc3ZjKTsKKwkJZ2Jfc3ZjX2RlYnVnZnNfZXhpdChzdmMpOworCQlnYl9zdmNfd2F0Y2hkb2dfZGVzdHJveShzdmMpOworCQlkZXZpY2VfZGVsKCZzdmMtPmRldik7CisJfQorCisJZmx1c2hfd29ya3F1ZXVlKHN2Yy0+d3EpOworCisJZ2Jfc3ZjX3JlbW92ZV9tb2R1bGVzKHN2Yyk7CisKKwlnYl9jb25uZWN0aW9uX2Rpc2FibGUoc3ZjLT5jb25uZWN0aW9uKTsKK30KKwordm9pZCBnYl9zdmNfcHV0KHN0cnVjdCBnYl9zdmMgKnN2YykKK3sKKwlwdXRfZGV2aWNlKCZzdmMtPmRldik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9zdmMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3N2Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZDdlZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9zdmMuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIEdyZXlidXMgU1ZDIGNvZGUKKyAqCisgKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTUgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaWZuZGVmIF9fU1ZDX0gKKyNkZWZpbmUgX19TVkNfSAorCisjZGVmaW5lIEdCX1NWQ19DUE9SVF9GTEFHX0UyRUZDCQlCSVQoMCkKKyNkZWZpbmUgR0JfU1ZDX0NQT1JUX0ZMQUdfQ1NEX04JCUJJVCgxKQorI2RlZmluZSBHQl9TVkNfQ1BPUlRfRkxBR19DU1ZfTgkJQklUKDIpCisKK2VudW0gZ2Jfc3ZjX3N0YXRlIHsKKwlHQl9TVkNfU1RBVEVfUkVTRVQsCisJR0JfU1ZDX1NUQVRFX1BST1RPQ09MX1ZFUlNJT04sCisJR0JfU1ZDX1NUQVRFX1NWQ19IRUxMTywKK307CisKK2VudW0gZ2Jfc3ZjX3dhdGNoZG9nX2JpdGUgeworCUdCX1NWQ19XQVRDSERPR19CSVRFX1JFU0VUX1VOSVBSTyA9IDAsCisJR0JfU1ZDX1dBVENIRE9HX0JJVEVfUEFOSUNfS0VSTkVMLAorfTsKKworc3RydWN0IGdiX3N2Y193YXRjaGRvZzsKKworc3RydWN0IHN2Y19kZWJ1Z2ZzX3B3cm1vbl9yYWlsIHsKKwl1OCBpZDsKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmM7Cit9OworCitzdHJ1Y3QgZ2Jfc3ZjIHsKKwlzdHJ1Y3QgZGV2aWNlCQlkZXY7CisKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UJKmhkOworCXN0cnVjdCBnYl9jb25uZWN0aW9uCSpjb25uZWN0aW9uOworCWVudW0gZ2Jfc3ZjX3N0YXRlCXN0YXRlOworCXN0cnVjdCBpZGEJCWRldmljZV9pZF9tYXA7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJKndxOworCisJdTE2IGVuZG9faWQ7CisJdTggYXBfaW50Zl9pZDsKKworCXU4IHByb3RvY29sX21ham9yOworCXU4IHByb3RvY29sX21pbm9yOworCisJc3RydWN0IGdiX3N2Y193YXRjaGRvZwkqd2F0Y2hkb2c7CisJZW51bSBnYl9zdmNfd2F0Y2hkb2dfYml0ZSBhY3Rpb247CisKKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2RlbnRyeTsKKwlzdHJ1Y3Qgc3ZjX2RlYnVnZnNfcHdybW9uX3JhaWwgKnB3cm1vbl9yYWlsczsKK307CisjZGVmaW5lIHRvX2diX3N2YyhkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IGdiX3N2YywgZGV2KQorCitzdHJ1Y3QgZ2Jfc3ZjICpnYl9zdmNfY3JlYXRlKHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQpOworaW50IGdiX3N2Y19hZGQoc3RydWN0IGdiX3N2YyAqc3ZjKTsKK3ZvaWQgZ2Jfc3ZjX2RlbChzdHJ1Y3QgZ2Jfc3ZjICpzdmMpOwordm9pZCBnYl9zdmNfcHV0KHN0cnVjdCBnYl9zdmMgKnN2Yyk7CisKK2ludCBnYl9zdmNfcHdybW9uX2ludGZfc2FtcGxlX2dldChzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU4IGludGZfaWQsCisJCQkJICB1OCBtZWFzdXJlbWVudF90eXBlLCB1MzIgKnZhbHVlKTsKK2ludCBnYl9zdmNfaW50Zl9kZXZpY2VfaWQoc3RydWN0IGdiX3N2YyAqc3ZjLCB1OCBpbnRmX2lkLCB1OCBkZXZpY2VfaWQpOworaW50IGdiX3N2Y19yb3V0ZV9jcmVhdGUoc3RydWN0IGdiX3N2YyAqc3ZjLCB1OCBpbnRmMV9pZCwgdTggZGV2MV9pZCwKKwkJCSAgICAgICB1OCBpbnRmMl9pZCwgdTggZGV2Ml9pZCk7Cit2b2lkIGdiX3N2Y19yb3V0ZV9kZXN0cm95KHN0cnVjdCBnYl9zdmMgKnN2YywgdTggaW50ZjFfaWQsIHU4IGludGYyX2lkKTsKK2ludCBnYl9zdmNfY29ubmVjdGlvbl9jcmVhdGUoc3RydWN0IGdiX3N2YyAqc3ZjLCB1OCBpbnRmMV9pZCwgdTE2IGNwb3J0MV9pZCwKKwkJCSAgICAgdTggaW50ZjJfaWQsIHUxNiBjcG9ydDJfaWQsIHU4IGNwb3J0X2ZsYWdzKTsKK3ZvaWQgZ2Jfc3ZjX2Nvbm5lY3Rpb25fZGVzdHJveShzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU4IGludGYxX2lkLCB1MTYgY3BvcnQxX2lkLAorCQkJICAgICAgIHU4IGludGYyX2lkLCB1MTYgY3BvcnQyX2lkKTsKK2ludCBnYl9zdmNfaW50Zl9lamVjdChzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU4IGludGZfaWQpOworaW50IGdiX3N2Y19pbnRmX3ZzeXNfc2V0KHN0cnVjdCBnYl9zdmMgKnN2YywgdTggaW50Zl9pZCwgYm9vbCBlbmFibGUpOworaW50IGdiX3N2Y19pbnRmX3JlZmNsa19zZXQoc3RydWN0IGdiX3N2YyAqc3ZjLCB1OCBpbnRmX2lkLCBib29sIGVuYWJsZSk7CitpbnQgZ2Jfc3ZjX2ludGZfdW5pcHJvX3NldChzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU4IGludGZfaWQsIGJvb2wgZW5hYmxlKTsKK2ludCBnYl9zdmNfaW50Zl9hY3RpdmF0ZShzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU4IGludGZfaWQsIHU4ICppbnRmX3R5cGUpOworaW50IGdiX3N2Y19pbnRmX3Jlc3VtZShzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU4IGludGZfaWQpOworCitpbnQgZ2Jfc3ZjX2RtZV9wZWVyX2dldChzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU4IGludGZfaWQsIHUxNiBhdHRyLCB1MTYgc2VsZWN0b3IsCisJCQl1MzIgKnZhbHVlKTsKK2ludCBnYl9zdmNfZG1lX3BlZXJfc2V0KHN0cnVjdCBnYl9zdmMgKnN2YywgdTggaW50Zl9pZCwgdTE2IGF0dHIsIHUxNiBzZWxlY3RvciwKKwkJCXUzMiB2YWx1ZSk7CitpbnQgZ2Jfc3ZjX2ludGZfc2V0X3Bvd2VyX21vZGUoc3RydWN0IGdiX3N2YyAqc3ZjLCB1OCBpbnRmX2lkLCB1OCBoc19zZXJpZXMsCisJCQkgICAgICAgdTggdHhfbW9kZSwgdTggdHhfZ2VhciwgdTggdHhfbmxhbmVzLAorCQkJICAgICAgIHU4IHR4X2FtcGxpdHVkZSwgdTggdHhfaHNfZXF1YWxpemVyLAorCQkJICAgICAgIHU4IHJ4X21vZGUsIHU4IHJ4X2dlYXIsIHU4IHJ4X25sYW5lcywKKwkJCSAgICAgICB1OCBmbGFncywgdTMyIHF1aXJrcywKKwkJCSAgICAgICBzdHJ1Y3QgZ2Jfc3ZjX2wyX3RpbWVyX2NmZyAqbG9jYWwsCisJCQkgICAgICAgc3RydWN0IGdiX3N2Y19sMl90aW1lcl9jZmcgKnJlbW90ZSk7CitpbnQgZ2Jfc3ZjX2ludGZfc2V0X3Bvd2VyX21vZGVfaGliZXJuYXRlKHN0cnVjdCBnYl9zdmMgKnN2YywgdTggaW50Zl9pZCk7CitpbnQgZ2Jfc3ZjX3Bpbmcoc3RydWN0IGdiX3N2YyAqc3ZjKTsKK2ludCBnYl9zdmNfd2F0Y2hkb2dfY3JlYXRlKHN0cnVjdCBnYl9zdmMgKnN2Yyk7Cit2b2lkIGdiX3N2Y193YXRjaGRvZ19kZXN0cm95KHN0cnVjdCBnYl9zdmMgKnN2Yyk7Citib29sIGdiX3N2Y193YXRjaGRvZ19lbmFibGVkKHN0cnVjdCBnYl9zdmMgKnN2Yyk7CitpbnQgZ2Jfc3ZjX3dhdGNoZG9nX2VuYWJsZShzdHJ1Y3QgZ2Jfc3ZjICpzdmMpOworaW50IGdiX3N2Y193YXRjaGRvZ19kaXNhYmxlKHN0cnVjdCBnYl9zdmMgKnN2Yyk7CitpbnQgZ2Jfc3ZjX3RpbWVzeW5jX2VuYWJsZShzdHJ1Y3QgZ2Jfc3ZjICpzdmMsIHU4IGNvdW50LCB1NjQgZnJhbWVfdGltZSwKKwkJCSAgIHUzMiBzdHJvYmVfZGVsYXksIHUzMiByZWZjbGspOworaW50IGdiX3N2Y190aW1lc3luY19kaXNhYmxlKHN0cnVjdCBnYl9zdmMgKnN2Yyk7CitpbnQgZ2Jfc3ZjX3RpbWVzeW5jX2F1dGhvcml0YXRpdmUoc3RydWN0IGdiX3N2YyAqc3ZjLCB1NjQgKmZyYW1lX3RpbWUpOworaW50IGdiX3N2Y190aW1lc3luY19waW5nKHN0cnVjdCBnYl9zdmMgKnN2YywgdTY0ICpmcmFtZV90aW1lKTsKK2ludCBnYl9zdmNfdGltZXN5bmNfd2FrZV9waW5zX2FjcXVpcmUoc3RydWN0IGdiX3N2YyAqc3ZjLCB1MzIgc3Ryb2JlX21hc2spOworaW50IGdiX3N2Y190aW1lc3luY193YWtlX3BpbnNfcmVsZWFzZShzdHJ1Y3QgZ2Jfc3ZjICpzdmMpOworCitpbnQgZ2Jfc3ZjX3Byb3RvY29sX2luaXQodm9pZCk7Cit2b2lkIGdiX3N2Y19wcm90b2NvbF9leGl0KHZvaWQpOworCisjZW5kaWYgLyogX19TVkNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvc3ZjX3dhdGNoZG9nLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9zdmNfd2F0Y2hkb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzI5NDYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvc3ZjX3dhdGNoZG9nLmMKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiBTVkMgR3JleWJ1cyAid2F0Y2hkb2ciIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlICJncmV5YnVzLmgiCisKKyNkZWZpbmUgU1ZDX1dBVENIRE9HX1BFUklPRAkoMipIWikKKworc3RydWN0IGdiX3N2Y193YXRjaGRvZyB7CisJc3RydWN0IGRlbGF5ZWRfd29yawl3b3JrOworCXN0cnVjdCBnYl9zdmMJCSpzdmM7CisJYm9vbAkJCWVuYWJsZWQ7CisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHBtX25vdGlmaWVyOworfTsKKworc3RhdGljIHN0cnVjdCBkZWxheWVkX3dvcmsgcmVzZXRfd29yazsKKworc3RhdGljIGludCBzdmNfd2F0Y2hkb2dfcG1fbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpub3RpZmllciwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBwbV9ldmVudCwgdm9pZCAqdW51c2VkKQoreworCXN0cnVjdCBnYl9zdmNfd2F0Y2hkb2cgKndhdGNoZG9nID0KKwkJY29udGFpbmVyX29mKG5vdGlmaWVyLCBzdHJ1Y3QgZ2Jfc3ZjX3dhdGNoZG9nLCBwbV9ub3RpZmllcik7CisKKwlzd2l0Y2ggKHBtX2V2ZW50KSB7CisJY2FzZSBQTV9TVVNQRU5EX1BSRVBBUkU6CisJCWdiX3N2Y193YXRjaGRvZ19kaXNhYmxlKHdhdGNoZG9nLT5zdmMpOworCQlicmVhazsKKwljYXNlIFBNX1BPU1RfU1VTUEVORDoKKwkJZ2Jfc3ZjX3dhdGNoZG9nX2VuYWJsZSh3YXRjaGRvZy0+c3ZjKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgdm9pZCBncmV5YnVzX3Jlc2V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdGF0aWMgY2hhciBzdGFydF9wYXRoWzI1Nl0gPSAiL3N5c3RlbS9iaW4vc3RhcnQiOworCXN0YXRpYyBjaGFyICplbnZwW10gPSB7CisJCSJIT01FPS8iLAorCQkiUEFUSD0vc2JpbjovdmVuZG9yL2Jpbjovc3lzdGVtL3NiaW46L3N5c3RlbS9iaW46L3N5c3RlbS94YmluIiwKKwkJTlVMTCwKKwl9OworCXN0YXRpYyBjaGFyICphcmd2W10gPSB7CisJCXN0YXJ0X3BhdGgsCisJCSJ1bmlwcm9fcmVzZXQiLAorCQlOVUxMLAorCX07CisKKwlwcmludGsoS0VSTl9FUlIgInN2Y193YXRjaGRvZzogY2FsbGluZyBcIiVzICVzXCIgdG8gcmVzZXQgZ3JleWJ1cyBuZXR3b3JrIVxuIiwKKwkgICAgICAgYXJndlswXSwgYXJndlsxXSk7CisJY2FsbF91c2VybW9kZWhlbHBlcihzdGFydF9wYXRoLCBhcmd2LCBlbnZwLCBVTUhfV0FJVF9FWEVDKTsKK30KKworc3RhdGljIHZvaWQgZG9fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGdiX3N2Y193YXRjaGRvZyAqd2F0Y2hkb2c7CisJc3RydWN0IGdiX3N2YyAqc3ZjOworCWludCByZXR2YWw7CisKKwl3YXRjaGRvZyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZ2Jfc3ZjX3dhdGNoZG9nLCB3b3JrLndvcmspOworCXN2YyA9IHdhdGNoZG9nLT5zdmM7CisKKwlkZXZfZGJnKCZzdmMtPmRldiwgIiVzOiBwaW5nLlxuIiwgX19mdW5jX18pOworCXJldHZhbCA9IGdiX3N2Y19waW5nKHN2Yyk7CisJaWYgKHJldHZhbCkgeworCQkvKgorCQkgKiBTb21ldGhpbmcgd2VudCByZWFsbHkgd3JvbmcsIGxldCdzIHdhcm4gdXNlcnNwYWNlIGFuZCB0aGVuCisJCSAqIHB1bGwgdGhlIHBsdWcgYW5kIHJlc2V0IHRoZSB3aG9sZSBncmV5YnVzIG5ldHdvcmsuCisJCSAqIFdlIG5lZWQgdG8gZG8gdGhpcyBvdXRzaWRlIG9mIHRoaXMgd29ya3F1ZXVlIGFzIHdlIHdpbGwgYmUKKwkJICogdGVhcmluZyBkb3duIHRoZSBzdmMgZGV2aWNlIGl0c2VsZi4gIFNvIHF1ZXVlIHVwCisJCSAqIHlldC1hbm90aGVyLWNhbGxiYWNrIHRvIGRvIHRoYXQuCisJCSAqLworCQlkZXZfZXJyKCZzdmMtPmRldiwKKwkJCSJTVkMgcGluZyBoYXMgcmV0dXJuZWQgJWQsIHNvbWV0aGluZyBpcyB3cm9uZyEhIVxuIiwKKwkJCXJldHZhbCk7CisKKwkJaWYgKHN2Yy0+YWN0aW9uID09IEdCX1NWQ19XQVRDSERPR19CSVRFX1BBTklDX0tFUk5FTCkgeworCQkJcGFuaWMoIlNWQyBpcyBub3QgcmVzcG9uZGluZ1xuIik7CisJCX0gZWxzZSBpZiAoc3ZjLT5hY3Rpb24gPT0gR0JfU1ZDX1dBVENIRE9HX0JJVEVfUkVTRVRfVU5JUFJPKSB7CisJCQlkZXZfZXJyKCZzdmMtPmRldiwgIlJlc2V0dGluZyB0aGUgZ3JleWJ1cyBuZXR3b3JrLCB3YXRjaCBvdXQhISFcbiIpOworCisJCQlJTklUX0RFTEFZRURfV09SSygmcmVzZXRfd29yaywgZ3JleWJ1c19yZXNldCk7CisJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnJlc2V0X3dvcmssIEhaIC8gMik7CisKKwkJCS8qCisJCQkgKiBEaXNhYmxlIG91cnNlbHZlcywgd2UgZG9uJ3Qgd2FudCB0byB0cmlwIGFnYWluIHVubGVzcworCQkJICogdXNlcnNwYWNlIHdhbnRzIHVzIHRvLgorCQkJICovCisJCQl3YXRjaGRvZy0+ZW5hYmxlZCA9IGZhbHNlOworCQl9CisJfQorCisJLyogcmVzdWJtaXQgb3VyIHdvcmsgdG8gaGFwcGVuIGFnYWluLCBpZiB3ZSBhcmUgc3RpbGwgImFsaXZlIiAqLworCWlmICh3YXRjaGRvZy0+ZW5hYmxlZCkKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ3YXRjaGRvZy0+d29yaywgU1ZDX1dBVENIRE9HX1BFUklPRCk7Cit9CisKK2ludCBnYl9zdmNfd2F0Y2hkb2dfY3JlYXRlKHN0cnVjdCBnYl9zdmMgKnN2YykKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjX3dhdGNoZG9nICp3YXRjaGRvZzsKKwlpbnQgcmV0dmFsOworCisJaWYgKHN2Yy0+d2F0Y2hkb2cpCisJCXJldHVybiAwOworCisJd2F0Y2hkb2cgPSBrbWFsbG9jKHNpemVvZigqd2F0Y2hkb2cpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXdhdGNoZG9nKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdhdGNoZG9nLT5lbmFibGVkID0gZmFsc2U7CisJd2F0Y2hkb2ctPnN2YyA9IHN2YzsKKwlJTklUX0RFTEFZRURfV09SSygmd2F0Y2hkb2ctPndvcmssIGRvX3dvcmspOworCXN2Yy0+d2F0Y2hkb2cgPSB3YXRjaGRvZzsKKworCXdhdGNoZG9nLT5wbV9ub3RpZmllci5ub3RpZmllcl9jYWxsID0gc3ZjX3dhdGNoZG9nX3BtX25vdGlmaWVyOworCXJldHZhbCA9IHJlZ2lzdGVyX3BtX25vdGlmaWVyKCZ3YXRjaGRvZy0+cG1fbm90aWZpZXIpOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2Vycigmc3ZjLT5kZXYsICJlcnJvciByZWdpc3RlcmluZyBwbSBub3RpZmllciglZClcbiIsCisJCQlyZXR2YWwpOworCQlnb3RvIHN2Y193YXRjaGRvZ19jcmVhdGVfZXJyOworCX0KKworCXJldHZhbCA9IGdiX3N2Y193YXRjaGRvZ19lbmFibGUoc3ZjKTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIoJnN2Yy0+ZGV2LCAiZXJyb3IgZW5hYmxpbmcgd2F0Y2hkb2cgKCVkKVxuIiwgcmV0dmFsKTsKKwkJdW5yZWdpc3Rlcl9wbV9ub3RpZmllcigmd2F0Y2hkb2ctPnBtX25vdGlmaWVyKTsKKwkJZ290byBzdmNfd2F0Y2hkb2dfY3JlYXRlX2VycjsKKwl9CisJcmV0dXJuIHJldHZhbDsKKworc3ZjX3dhdGNoZG9nX2NyZWF0ZV9lcnI6CisJc3ZjLT53YXRjaGRvZyA9IE5VTEw7CisJa2ZyZWUod2F0Y2hkb2cpOworCisJcmV0dXJuIHJldHZhbDsKK30KKwordm9pZCBnYl9zdmNfd2F0Y2hkb2dfZGVzdHJveShzdHJ1Y3QgZ2Jfc3ZjICpzdmMpCit7CisJc3RydWN0IGdiX3N2Y193YXRjaGRvZyAqd2F0Y2hkb2cgPSBzdmMtPndhdGNoZG9nOworCisJaWYgKCF3YXRjaGRvZykKKwkJcmV0dXJuOworCisJdW5yZWdpc3Rlcl9wbV9ub3RpZmllcigmd2F0Y2hkb2ctPnBtX25vdGlmaWVyKTsKKwlnYl9zdmNfd2F0Y2hkb2dfZGlzYWJsZShzdmMpOworCXN2Yy0+d2F0Y2hkb2cgPSBOVUxMOworCWtmcmVlKHdhdGNoZG9nKTsKK30KKworYm9vbCBnYl9zdmNfd2F0Y2hkb2dfZW5hYmxlZChzdHJ1Y3QgZ2Jfc3ZjICpzdmMpCit7CisJaWYgKCFzdmMgfHwgIXN2Yy0+d2F0Y2hkb2cpCisJCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gc3ZjLT53YXRjaGRvZy0+ZW5hYmxlZDsKK30KKworaW50IGdiX3N2Y193YXRjaGRvZ19lbmFibGUoc3RydWN0IGdiX3N2YyAqc3ZjKQoreworCXN0cnVjdCBnYl9zdmNfd2F0Y2hkb2cgKndhdGNoZG9nOworCisJaWYgKCFzdmMtPndhdGNoZG9nKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXdhdGNoZG9nID0gc3ZjLT53YXRjaGRvZzsKKwlpZiAod2F0Y2hkb2ctPmVuYWJsZWQpCisJCXJldHVybiAwOworCisJd2F0Y2hkb2ctPmVuYWJsZWQgPSB0cnVlOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmd2F0Y2hkb2ctPndvcmssIFNWQ19XQVRDSERPR19QRVJJT0QpOworCXJldHVybiAwOworfQorCitpbnQgZ2Jfc3ZjX3dhdGNoZG9nX2Rpc2FibGUoc3RydWN0IGdiX3N2YyAqc3ZjKQoreworCXN0cnVjdCBnYl9zdmNfd2F0Y2hkb2cgKndhdGNoZG9nOworCisJaWYgKCFzdmMtPndhdGNoZG9nKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXdhdGNoZG9nID0gc3ZjLT53YXRjaGRvZzsKKwlpZiAoIXdhdGNoZG9nLT5lbmFibGVkKQorCQlyZXR1cm4gMDsKKworCXdhdGNoZG9nLT5lbmFibGVkID0gZmFsc2U7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ3YXRjaGRvZy0+d29yayk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy90aW1lc3luYy5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvdGltZXN5bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTY4YWY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvdGltZXN5bmMuYwpAQCAtMCwwICsxLDEzNTcgQEAKKy8qCisgKiBUaW1lU3luYyBBUEkgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNiBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICovCisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KKyNpbmNsdWRlICJncmV5YnVzLmgiCisjaW5jbHVkZSAidGltZXN5bmMuaCIKKyNpbmNsdWRlICJncmV5YnVzX3RyYWNlLmgiCisKKy8qCisgKiBNaW5pbXVtIGludGVyLXN0cm9iZSB2YWx1ZSBvZiBvbmUgbWlsbGlzZWNvbmQgaXMgY2hvc2VuIGJlY2F1c2UgaXQKKyAqIGp1c3QtYWJvdXQgZml0cyB0aGUgY29tbW9uIGRlZmluaXRpb24gb2YgYSBqaWZmeS4KKyAqCisgKiBNYXhpbXVtIHZhbHVlIE9UT0ggaXMgY29uc3RyYWluZWQgYnkgdGhlIG51bWJlciBvZiBiaXRzIHRoZSBTVkMgY2FuIGZpdAorICogaW50byBhIDE2IGJpdCB1cC1jb3VudGVyLiBUaGUgU1ZDIGNvbmZpZ3VyZXMgdGhlIHRpbWVyIGluIG1pY3Jvc2Vjb25kcworICogc28gdGhlIG1heGltdW0gYWxsb3dhYmxlIHZhbHVlIGlzIDY1NTM1IG1pY3Jvc2Vjb25kcy4gV2UgY2xpcCB0aGF0IHZhbHVlCisgKiB0byAxMDAwMCBtaWNyb3NlY29uZHMgZm9yIHRoZSBzYWtlIG9mIHVzaW5nIG5pY2Ugcm91bmQgYmFzZSAxMCBudW1iZXJzCisgKiBhbmQgc2luY2UgcmlnaHQtbm93IHRoZXJlJ3Mgbm8gaW1hZ2luYWJsZSB1c2UtY2FzZSByZXF1aXJpbmcgYW55dGhpbmcKKyAqIG90aGVyIHRoYW4gYSBvbmUgbWlsbGlzZWNvbmQgaW50ZXItc3Ryb2JlIHRpbWUsIGxldCBhbG9uZSBzb21ldGhpbmcKKyAqIGhpZ2hlciB0aGFuIHRlbiBtaWxsaXNlY29uZHMuCisgKi8KKyNkZWZpbmUgR0JfVElNRVNZTkNfU1RST0JFX0RFTEFZX1VTCQkxMDAwCisjZGVmaW5lIEdCX1RJTUVTWU5DX0RFRkFVTFRfT0ZGU0VUX1VTCQkxMDAwCisKKy8qIFdvcmsgcXVldWUgdGltZXJzIGxvbmcsIHNob3J0IGFuZCBTVkMgc3Ryb2JlIHRpbWVvdXQgKi8KKyNkZWZpbmUgR0JfVElNRVNZTkNfREVMQVlFRF9XT1JLX0xPTkcJCW1zZWNzX3RvX2ppZmZpZXMoMTApCisjZGVmaW5lIEdCX1RJTUVTWU5DX0RFTEFZRURfV09SS19TSE9SVAkJbXNlY3NfdG9famlmZmllcygxKQorI2RlZmluZSBHQl9USU1FU1lOQ19NQVhfV0FJVF9TVkMJCW1zZWNzX3RvX2ppZmZpZXMoNTAwMCkKKyNkZWZpbmUgR0JfVElNRVNZTkNfS1RJTUVfVVBEQVRFCQltc2Vjc190b19qaWZmaWVzKDEwMDApCisjZGVmaW5lIEdCX1RJTUVTWU5DX01BWF9LVElNRV9DT05WRVJTSU9OCTE1CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHdlJ2xsIHJldHJ5IGEgZmFpbGVkIHN5bmNocm9ub3VzIHN5bmMgKi8KKyNkZWZpbmUgR0JfVElNRVNZTkNfTUFYX1JFVFJJRVMJCQk1CisKKy8qIFJlcG9ydGVkIG5hbm9zZWNvbmRzL2ZlbXRvc2Vjb25kcyBwZXIgY2xvY2sgKi8KK3N0YXRpYyB1NjQgZ2JfdGltZXN5bmNfbnNfcGVyX2Nsb2NrOworc3RhdGljIHU2NCBnYl90aW1lc3luY19mc19wZXJfY2xvY2s7CisKKy8qIE1heGltdW0gZGlmZmVyZW5jZSB3ZSB3aWxsIGFjY2VwdCBjb252ZXJ0aW5nIEZyYW1lVGltZSB0byBrdGltZSAqLworc3RhdGljIHUzMiBnYl90aW1lc3luY19tYXhfa3RpbWVfZGlmZjsKKworLyogUmVwb3J0ZWQgY2xvY2sgcmF0ZSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2JfdGltZXN5bmNfY2xvY2tfcmF0ZTsKKworLyogV29ya3F1ZXVlICovCitzdGF0aWMgdm9pZCBnYl90aW1lc3luY193b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKworLyogTGlzdCBvZiBTVkNzIHdpdGggb25lIEZyYW1lVGltZSBwZXIgU1ZDICovCitzdGF0aWMgTElTVF9IRUFEKGdiX3RpbWVzeW5jX3N2Y19saXN0KTsKKworLyogU3luY2hyb25pemUgcGFyYWxsZWwgY29udGV4dHMgYWNjZXNzaW5nIGEgdmFsaWQgdGltZXN5bmNfc3ZjIHBvaW50ZXIgKi8KK3N0YXRpYyBERUZJTkVfTVVURVgoZ2JfdGltZXN5bmNfc3ZjX2xpc3RfbXV0ZXgpOworCisvKiBTdHJ1Y3R1cmUgdG8gY29udmVydCBmcm9tIEZyYW1lVGltZSB0byB0aW1lc3BlYy9rdGltZSAqLworc3RydWN0IGdiX3RpbWVzeW5jX2ZyYW1lX3RpbWVfZGF0YSB7CisJdTY0IGZyYW1lX3RpbWU7CisJc3RydWN0IHRpbWVzcGVjIHRzOworfTsKKworc3RydWN0IGdiX3RpbWVzeW5jX3N2YyB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBsaXN0X2hlYWQgaW50ZXJmYWNlX2xpc3Q7CisJc3RydWN0IGdiX3N2YyAqc3ZjOworCXN0cnVjdCBnYl90aW1lc3luY19ob3N0X2RldmljZSAqdGltZXN5bmNfaGQ7CisKKwlzcGlubG9ja190IHNwaW5sb2NrOwkvKiBQZXIgU1ZDIHNwaW5sb2NrIHRvIHN5bmMgd2l0aCBJU1IgKi8KKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CS8qIFBlciBTVkMgbXV0ZXggZm9yIHJlZ3VsYXIgc3luY2hyb25pemF0aW9uICovCisKKwlzdHJ1Y3QgZGVudHJ5ICpmcmFtZV90aW1lX2RlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICpmcmFtZV9rdGltZV9kZW50cnk7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtfcXVldWU7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9xdWV1ZTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGRlbGF5ZWRfd29yazsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBrdGltZV90aW1lcjsKKworCS8qIFRoZSBjdXJyZW50IGxvY2FsIEZyYW1lVGltZSAqLworCXU2NCBmcmFtZV90aW1lX29mZnNldDsKKwlzdHJ1Y3QgZ2JfdGltZXN5bmNfZnJhbWVfdGltZV9kYXRhIHN0cm9iZV9kYXRhW0dCX1RJTUVTWU5DX01BWF9TVFJPQkVTXTsKKwlzdHJ1Y3QgZ2JfdGltZXN5bmNfZnJhbWVfdGltZV9kYXRhIGt0aW1lX2RhdGE7CisKKwkvKiBUaGUgU1ZDIEZyYW1lVGltZSBhbmQgcmVsYXRpdmUgQVAgRnJhbWVUaW1lIEAgbGFzdCBUSU1FU1lOQ19QSU5HICovCisJdTY0IHN2Y19waW5nX2ZyYW1lX3RpbWU7CisJdTY0IGFwX3BpbmdfZnJhbWVfdGltZTsKKworCS8qIFRyYW5zaXRvcnkgc2V0dGluZ3MgKi8KKwl1MzIgc3Ryb2JlX21hc2s7CisJYm9vbCBvZmZzZXRfZG93bjsKKwlib29sIHByaW50X3Bpbmc7CisJYm9vbCBjYXB0dXJlX3Bpbmc7CisJaW50IHN0cm9iZTsKKworCS8qIEN1cnJlbnQgc3RhdGUgKi8KKwlpbnQgc3RhdGU7Cit9OworCitzdHJ1Y3QgZ2JfdGltZXN5bmNfaG9zdF9kZXZpY2UgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkOworCXU2NCBwaW5nX2ZyYW1lX3RpbWU7Cit9OworCitzdHJ1Y3QgZ2JfdGltZXN5bmNfaW50ZXJmYWNlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZXJmYWNlOworCXU2NCBwaW5nX2ZyYW1lX3RpbWU7Cit9OworCitlbnVtIGdiX3RpbWVzeW5jX3N0YXRlIHsKKwlHQl9USU1FU1lOQ19TVEFURV9JTlZBTElECQk9IDAsCisJR0JfVElNRVNZTkNfU1RBVEVfSU5BQ1RJVkUJCT0gMSwKKwlHQl9USU1FU1lOQ19TVEFURV9JTklUCQkJPSAyLAorCUdCX1RJTUVTWU5DX1NUQVRFX1dBSVRfU1ZDCQk9IDMsCisJR0JfVElNRVNZTkNfU1RBVEVfQVVUSE9SSVRBVElWRQkJPSA0LAorCUdCX1RJTUVTWU5DX1NUQVRFX1BJTkcJCQk9IDUsCisJR0JfVElNRVNZTkNfU1RBVEVfQUNUSVZFCQk9IDYsCit9OworCitzdGF0aWMgdm9pZCBnYl90aW1lc3luY19rdGltZV90aW1lcl9mbih1bnNpZ25lZCBsb25nIGRhdGEpOworCitzdGF0aWMgdTY0IGdiX3RpbWVzeW5jX2FkanVzdF9jb3VudChzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICp0aW1lc3luY19zdmMsCisJCQkJICAgIHU2NCBjb3VudHMpCit7CisJaWYgKHRpbWVzeW5jX3N2Yy0+b2Zmc2V0X2Rvd24pCisJCXJldHVybiBjb3VudHMgLSB0aW1lc3luY19zdmMtPmZyYW1lX3RpbWVfb2Zmc2V0OworCWVsc2UKKwkJcmV0dXJuIGNvdW50cyArIHRpbWVzeW5jX3N2Yy0+ZnJhbWVfdGltZV9vZmZzZXQ7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIHRoZSBhdXRob3JpdGF0aXZlIEZyYW1lVGltZSB0byBhIGNhbGxpbmcgZnVuY3Rpb24uIEl0CisgKiBpcyBkZXNpZ25lZCB0byBiZSBsb2NrbGVzcyBhbmQgc2hvdWxkIHJlbWFpbiB0aGF0IHdheSB0aGUgY2FsbGVyIGlzIGFzc3VtZWQKKyAqIHRvIGJlIHN0YXRlLWF3YXJlLgorICovCitzdGF0aWMgdTY0IF9fZ2JfdGltZXN5bmNfZ2V0X2ZyYW1lX3RpbWUoc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqdGltZXN5bmNfc3ZjKQoreworCXU2NCBjbG9ja3MgPSBnYl90aW1lc3luY19wbGF0Zm9ybV9nZXRfY291bnRlcigpOworCisJcmV0dXJuIGdiX3RpbWVzeW5jX2FkanVzdF9jb3VudCh0aW1lc3luY19zdmMsIGNsb2Nrcyk7Cit9CisKK3N0YXRpYyB2b2lkIGdiX3RpbWVzeW5jX3NjaGVkdWxlX3N2Y190aW1lb3V0KHN0cnVjdCBnYl90aW1lc3luY19zdmMKKwkJCQkJICAgICAqdGltZXN5bmNfc3ZjKQoreworCXF1ZXVlX2RlbGF5ZWRfd29yayh0aW1lc3luY19zdmMtPndvcmtfcXVldWUsCisJCQkgICAmdGltZXN5bmNfc3ZjLT5kZWxheWVkX3dvcmssCisJCQkgICBHQl9USU1FU1lOQ19NQVhfV0FJVF9TVkMpOworfQorCitzdGF0aWMgdm9pZCBnYl90aW1lc3luY19zZXRfc3RhdGUoc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqdGltZXN5bmNfc3ZjLAorCQkJCSAgaW50IHN0YXRlKQoreworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIEdCX1RJTUVTWU5DX1NUQVRFX0lOVkFMSUQ6CisJCXRpbWVzeW5jX3N2Yy0+c3RhdGUgPSBzdGF0ZTsKKwkJd2FrZV91cCgmdGltZXN5bmNfc3ZjLT53YWl0X3F1ZXVlKTsKKwkJYnJlYWs7CisJY2FzZSBHQl9USU1FU1lOQ19TVEFURV9JTkFDVElWRToKKwkJdGltZXN5bmNfc3ZjLT5zdGF0ZSA9IHN0YXRlOworCQl3YWtlX3VwKCZ0aW1lc3luY19zdmMtPndhaXRfcXVldWUpOworCQlicmVhazsKKwljYXNlIEdCX1RJTUVTWU5DX1NUQVRFX0lOSVQ6CisJCWlmICh0aW1lc3luY19zdmMtPnN0YXRlICE9IEdCX1RJTUVTWU5DX1NUQVRFX0lOVkFMSUQpIHsKKwkJCXRpbWVzeW5jX3N2Yy0+c3Ryb2JlID0gMDsKKwkJCXRpbWVzeW5jX3N2Yy0+ZnJhbWVfdGltZV9vZmZzZXQgPSAwOworCQkJdGltZXN5bmNfc3ZjLT5zdGF0ZSA9IHN0YXRlOworCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmdGltZXN5bmNfc3ZjLT5kZWxheWVkX3dvcmspOworCQkJcXVldWVfZGVsYXllZF93b3JrKHRpbWVzeW5jX3N2Yy0+d29ya19xdWV1ZSwKKwkJCQkJICAgJnRpbWVzeW5jX3N2Yy0+ZGVsYXllZF93b3JrLAorCQkJCQkgICBHQl9USU1FU1lOQ19ERUxBWUVEX1dPUktfTE9ORyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHQl9USU1FU1lOQ19TVEFURV9XQUlUX1NWQzoKKwkJaWYgKHRpbWVzeW5jX3N2Yy0+c3RhdGUgPT0gR0JfVElNRVNZTkNfU1RBVEVfSU5JVCkKKwkJCXRpbWVzeW5jX3N2Yy0+c3RhdGUgPSBzdGF0ZTsKKwkJYnJlYWs7CisJY2FzZSBHQl9USU1FU1lOQ19TVEFURV9BVVRIT1JJVEFUSVZFOgorCQlpZiAodGltZXN5bmNfc3ZjLT5zdGF0ZSA9PSBHQl9USU1FU1lOQ19TVEFURV9XQUlUX1NWQykgeworCQkJdGltZXN5bmNfc3ZjLT5zdGF0ZSA9IHN0YXRlOworCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmdGltZXN5bmNfc3ZjLT5kZWxheWVkX3dvcmspOworCQkJcXVldWVfZGVsYXllZF93b3JrKHRpbWVzeW5jX3N2Yy0+d29ya19xdWV1ZSwKKwkJCQkJICAgJnRpbWVzeW5jX3N2Yy0+ZGVsYXllZF93b3JrLCAwKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEdCX1RJTUVTWU5DX1NUQVRFX1BJTkc6CisJCWlmICh0aW1lc3luY19zdmMtPnN0YXRlID09IEdCX1RJTUVTWU5DX1NUQVRFX0FDVElWRSkgeworCQkJdGltZXN5bmNfc3ZjLT5zdGF0ZSA9IHN0YXRlOworCQkJcXVldWVfZGVsYXllZF93b3JrKHRpbWVzeW5jX3N2Yy0+d29ya19xdWV1ZSwKKwkJCQkJICAgJnRpbWVzeW5jX3N2Yy0+ZGVsYXllZF93b3JrLAorCQkJCQkgICBHQl9USU1FU1lOQ19ERUxBWUVEX1dPUktfU0hPUlQpOworCQl9CisJCWJyZWFrOworCWNhc2UgR0JfVElNRVNZTkNfU1RBVEVfQUNUSVZFOgorCQlpZiAodGltZXN5bmNfc3ZjLT5zdGF0ZSA9PSBHQl9USU1FU1lOQ19TVEFURV9BVVRIT1JJVEFUSVZFIHx8CisJCSAgICB0aW1lc3luY19zdmMtPnN0YXRlID09IEdCX1RJTUVTWU5DX1NUQVRFX1BJTkcpIHsKKwkJCXRpbWVzeW5jX3N2Yy0+c3RhdGUgPSBzdGF0ZTsKKwkJCXdha2VfdXAoJnRpbWVzeW5jX3N2Yy0+d2FpdF9xdWV1ZSk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJaWYgKFdBUk5fT04odGltZXN5bmNfc3ZjLT5zdGF0ZSAhPSBzdGF0ZSkpIHsKKwkJcHJfZXJyKCJJbnZhbGlkIHN0YXRlIHRyYW5zaXRpb24gJWQ9PiVkXG4iLAorCQkgICAgICAgdGltZXN5bmNfc3ZjLT5zdGF0ZSwgc3RhdGUpOworCX0KK30KKworc3RhdGljIHZvaWQgZ2JfdGltZXN5bmNfc2V0X3N0YXRlX2F0b21pYyhzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICp0aW1lc3luY19zdmMsCisJCQkJCSBpbnQgc3RhdGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0aW1lc3luY19zdmMtPnNwaW5sb2NrLCBmbGFncyk7CisJZ2JfdGltZXN5bmNfc2V0X3N0YXRlKHRpbWVzeW5jX3N2Yywgc3RhdGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpbWVzeW5jX3N2Yy0+c3BpbmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHU2NCBnYl90aW1lc3luY19kaWZmKHU2NCB4LCB1NjQgeSkKK3sKKwlpZiAoeCA+IHkpCisJCXJldHVybiB4IC0geTsKKwllbHNlCisJCXJldHVybiB5IC0geDsKK30KKworc3RhdGljIHZvaWQgZ2JfdGltZXN5bmNfYWRqdXN0X3RvX3N2YyhzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICpzdmMsCisJCQkJICAgICAgdTY0IHN2Y19mcmFtZV90aW1lLCB1NjQgYXBfZnJhbWVfdGltZSkKK3sKKwlpZiAoc3ZjX2ZyYW1lX3RpbWUgPiBhcF9mcmFtZV90aW1lKSB7CisJCXN2Yy0+ZnJhbWVfdGltZV9vZmZzZXQgPSBzdmNfZnJhbWVfdGltZSAtIGFwX2ZyYW1lX3RpbWU7CisJCXN2Yy0+b2Zmc2V0X2Rvd24gPSBmYWxzZTsKKwl9IGVsc2UgeworCQlzdmMtPmZyYW1lX3RpbWVfb2Zmc2V0ID0gYXBfZnJhbWVfdGltZSAtIHN2Y19mcmFtZV90aW1lOworCQlzdmMtPm9mZnNldF9kb3duID0gdHJ1ZTsKKwl9Cit9CisKKy8qCisgKiBBc3NvY2lhdGUgYSBGcmFtZVRpbWUgd2l0aCBhIGt0aW1lIHRpbWVzdGFtcCByZXByZXNlbnRlZCBhcyBzdHJ1Y3QgdGltZXNwZWMKKyAqIFJlcXVpcmVzIHRoZSBjYWxsaW5nIGNvbnRleHQgdG8gaG9sZCB0aW1lc3luY19zdmMtPm11dGV4CisgKi8KK3N0YXRpYyB2b2lkIGdiX3RpbWVzeW5jX3N0b3JlX2t0aW1lKHN0cnVjdCBnYl90aW1lc3luY19zdmMgKnRpbWVzeW5jX3N2YywKKwkJCQkgICAgc3RydWN0IHRpbWVzcGVjIHRzLCB1NjQgZnJhbWVfdGltZSkKK3sKKwl0aW1lc3luY19zdmMtPmt0aW1lX2RhdGEudHMgPSB0czsKKwl0aW1lc3luY19zdmMtPmt0aW1lX2RhdGEuZnJhbWVfdGltZSA9IGZyYW1lX3RpbWU7Cit9CisKKy8qCisgKiBGaW5kIHRoZSB0d28gcHVsc2VzIHRoYXQgYmVzdC1tYXRjaCBvdXIgZXhwZWN0ZWQgaW50ZXItc3Ryb2JlIGdhcCBhbmQKKyAqIHRoZW4gY2FsY3VsYXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIFNWQyB0aW1lIGF0IHRoZSBzZWNvbmQgcHVsc2UKKyAqIHRvIHRoZSBsb2NhbCB0aW1lIGF0IHRoZSBzZWNvbmQgcHVsc2UuCisgKi8KK3N0YXRpYyB2b2lkIGdiX3RpbWVzeW5jX2NvbGxhdGVfZnJhbWVfdGltZShzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICp0aW1lc3luY19zdmMsCisJCQkJCSAgIHU2NCAqZnJhbWVfdGltZSkKK3sKKwlpbnQgaSA9IDA7CisJdTY0IGRlbHRhLCBhcF9mcmFtZV90aW1lOworCXU2NCBzdHJvYmVfZGVsYXlfbnMgPSBHQl9USU1FU1lOQ19TVFJPQkVfREVMQVlfVVMgKiBOU0VDX1BFUl9VU0VDOworCXU2NCBsZWFzdCA9IDA7CisKKwlmb3IgKGkgPSAxOyBpIDwgR0JfVElNRVNZTkNfTUFYX1NUUk9CRVM7IGkrKykgeworCQlkZWx0YSA9IHRpbWVzeW5jX3N2Yy0+c3Ryb2JlX2RhdGFbaV0uZnJhbWVfdGltZSAtCisJCQl0aW1lc3luY19zdmMtPnN0cm9iZV9kYXRhW2kgLSAxXS5mcmFtZV90aW1lOworCQlkZWx0YSAqPSBnYl90aW1lc3luY19uc19wZXJfY2xvY2s7CisJCWRlbHRhID0gZ2JfdGltZXN5bmNfZGlmZihkZWx0YSwgc3Ryb2JlX2RlbGF5X25zKTsKKworCQlpZiAoIWxlYXN0IHx8IGRlbHRhIDwgbGVhc3QpIHsKKwkJCWxlYXN0ID0gZGVsdGE7CisJCQlnYl90aW1lc3luY19hZGp1c3RfdG9fc3ZjKHRpbWVzeW5jX3N2YywgZnJhbWVfdGltZVtpXSwKKwkJCQkJCSAgdGltZXN5bmNfc3ZjLT5zdHJvYmVfZGF0YVtpXS5mcmFtZV90aW1lKTsKKworCQkJYXBfZnJhbWVfdGltZSA9IHRpbWVzeW5jX3N2Yy0+c3Ryb2JlX2RhdGFbaV0uZnJhbWVfdGltZTsKKwkJCWFwX2ZyYW1lX3RpbWUgPSBnYl90aW1lc3luY19hZGp1c3RfY291bnQodGltZXN5bmNfc3ZjLAorCQkJCQkJCQkgYXBfZnJhbWVfdGltZSk7CisJCQlnYl90aW1lc3luY19zdG9yZV9rdGltZSh0aW1lc3luY19zdmMsCisJCQkJCQl0aW1lc3luY19zdmMtPnN0cm9iZV9kYXRhW2ldLnRzLAorCQkJCQkJYXBfZnJhbWVfdGltZSk7CisKKwkJCXByX2RlYnVnKCJhZGp1c3QgJXMgbG9jYWwgJWxsdSBzdmMgJWxsdSBkZWx0YSAlbGx1XG4iLAorCQkJCSB0aW1lc3luY19zdmMtPm9mZnNldF9kb3duID8gImRvd24iIDogInVwIiwKKwkJCQkgdGltZXN5bmNfc3ZjLT5zdHJvYmVfZGF0YVtpXS5mcmFtZV90aW1lLAorCQkJCSBmcmFtZV90aW1lW2ldLCBkZWx0YSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGdiX3RpbWVzeW5jX3RlYXJkb3duKHN0cnVjdCBnYl90aW1lc3luY19zdmMgKnRpbWVzeW5jX3N2YykKK3sKKwlzdHJ1Y3QgZ2JfdGltZXN5bmNfaW50ZXJmYWNlICp0aW1lc3luY19pbnRlcmZhY2U7CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gdGltZXN5bmNfc3ZjLT5zdmM7CisJc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZXJmYWNlOworCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQ7CisJaW50IHJldDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodGltZXN5bmNfaW50ZXJmYWNlLAorCQkJICAgICZ0aW1lc3luY19zdmMtPmludGVyZmFjZV9saXN0LCBsaXN0KSB7CisJCWludGVyZmFjZSA9IHRpbWVzeW5jX2ludGVyZmFjZS0+aW50ZXJmYWNlOworCQlyZXQgPSBnYl9pbnRlcmZhY2VfdGltZXN5bmNfZGlzYWJsZShpbnRlcmZhY2UpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwKKwkJCQkiaW50ZXJmYWNlIHRpbWVzeW5jX2Rpc2FibGUgJWRcbiIsIHJldCk7CisJCX0KKwl9CisKKwloZCA9IHRpbWVzeW5jX3N2Yy0+dGltZXN5bmNfaGQtPmhkOworCXJldCA9IGhkLT5kcml2ZXItPnRpbWVzeW5jX2Rpc2FibGUoaGQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmhkLT5kZXYsICJob3N0IHRpbWVzeW5jX2Rpc2FibGUgJWRcbiIsCisJCQlyZXQpOworCX0KKworCWdiX3N2Y190aW1lc3luY193YWtlX3BpbnNfcmVsZWFzZShzdmMpOworCWdiX3N2Y190aW1lc3luY19kaXNhYmxlKHN2Yyk7CisJZ2JfdGltZXN5bmNfcGxhdGZvcm1fdW5sb2NrX2J1cygpOworCisJZ2JfdGltZXN5bmNfc2V0X3N0YXRlX2F0b21pYyh0aW1lc3luY19zdmMsIEdCX1RJTUVTWU5DX1NUQVRFX0lOQUNUSVZFKTsKK30KKworc3RhdGljIHZvaWQgZ2JfdGltZXN5bmNfcGxhdGZvcm1fbG9ja19idXNfZmFpbChzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjCisJCQkJCQkqdGltZXN5bmNfc3ZjLCBpbnQgcmV0KQoreworCWlmIChyZXQgPT0gLUVBR0FJTikgeworCQlnYl90aW1lc3luY19zZXRfc3RhdGUodGltZXN5bmNfc3ZjLCB0aW1lc3luY19zdmMtPnN0YXRlKTsKKwl9IGVsc2UgeworCQlwcl9lcnIoIkZhaWxlZCB0byBsb2NrIHRpbWVzeW5jIGJ1cyAlZFxuIiwgcmV0KTsKKwkJZ2JfdGltZXN5bmNfc2V0X3N0YXRlKHRpbWVzeW5jX3N2YywgR0JfVElNRVNZTkNfU1RBVEVfSU5BQ1RJVkUpOworCX0KK30KKworc3RhdGljIHZvaWQgZ2JfdGltZXN5bmNfZW5hYmxlKHN0cnVjdCBnYl90aW1lc3luY19zdmMgKnRpbWVzeW5jX3N2YykKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSB0aW1lc3luY19zdmMtPnN2YzsKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkOworCXN0cnVjdCBnYl90aW1lc3luY19pbnRlcmZhY2UgKnRpbWVzeW5jX2ludGVyZmFjZTsKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRlcmZhY2U7CisJdTY0IGluaXRfZnJhbWVfdGltZTsKKwl1bnNpZ25lZCBsb25nIGNsb2NrX3JhdGUgPSBnYl90aW1lc3luY19jbG9ja19yYXRlOworCWludCByZXQ7CisKKwkvKgorCSAqIEdldCBhY2Nlc3MgdG8gdGhlIHdha2UgcGlucyBpbiB0aGUgQVAgYW5kIFNWQworCSAqIFJlbGVhc2UgdGhlc2UgcGlucyBlaXRoZXIgaW4gZ2JfdGltZXN5bmNfdGVhcmRvd24oKSBvciBpbgorCSAqIGdiX3RpbWVzeW5jX2F1dGhvcml0YXRpdmUoKQorCSAqLworCXJldCA9IGdiX3RpbWVzeW5jX3BsYXRmb3JtX2xvY2tfYnVzKHRpbWVzeW5jX3N2Yyk7CisJaWYgKHJldCA8IDApIHsKKwkJZ2JfdGltZXN5bmNfcGxhdGZvcm1fbG9ja19idXNfZmFpbCh0aW1lc3luY19zdmMsIHJldCk7CisJCXJldHVybjsKKwl9CisJcmV0ID0gZ2Jfc3ZjX3RpbWVzeW5jX3dha2VfcGluc19hY3F1aXJlKHN2YywgdGltZXN5bmNfc3ZjLT5zdHJvYmVfbWFzayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdmMtPmRldiwKKwkJCSJnYl9zdmNfdGltZXN5bmNfd2FrZV9waW5zX2FjcXVpcmUgJWRcbiIsIHJldCk7CisJCWdiX3RpbWVzeW5jX3RlYXJkb3duKHRpbWVzeW5jX3N2Yyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBDaG9vc2UgYW4gaW5pdGlhbCB0aW1lIGluIHRoZSBmdXR1cmUgKi8KKwlpbml0X2ZyYW1lX3RpbWUgPSBfX2diX3RpbWVzeW5jX2dldF9mcmFtZV90aW1lKHRpbWVzeW5jX3N2YykgKyAxMDAwMDBVTDsKKworCS8qIFNlbmQgZW5hYmxlIGNvbW1hbmQgdG8gYWxsIHJlbGV2YW50IHBhcnRpY2lwYW50cyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkodGltZXN5bmNfaW50ZXJmYWNlLCAmdGltZXN5bmNfc3ZjLT5pbnRlcmZhY2VfbGlzdCwKKwkJCSAgICBsaXN0KSB7CisJCWludGVyZmFjZSA9IHRpbWVzeW5jX2ludGVyZmFjZS0+aW50ZXJmYWNlOworCQlyZXQgPSBnYl9pbnRlcmZhY2VfdGltZXN5bmNfZW5hYmxlKGludGVyZmFjZSwKKwkJCQkJCSAgIEdCX1RJTUVTWU5DX01BWF9TVFJPQkVTLAorCQkJCQkJICAgaW5pdF9mcmFtZV90aW1lLAorCQkJCQkJICAgR0JfVElNRVNZTkNfU1RST0JFX0RFTEFZX1VTLAorCQkJCQkJICAgY2xvY2tfcmF0ZSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LAorCQkJCSJpbnRlcmZhY2UgdGltZXN5bmNfZW5hYmxlICVkXG4iLCByZXQpOworCQl9CisJfQorCisJaGQgPSB0aW1lc3luY19zdmMtPnRpbWVzeW5jX2hkLT5oZDsKKwlyZXQgPSBoZC0+ZHJpdmVyLT50aW1lc3luY19lbmFibGUoaGQsIEdCX1RJTUVTWU5DX01BWF9TVFJPQkVTLAorCQkJCQkgIGluaXRfZnJhbWVfdGltZSwKKwkJCQkJICBHQl9USU1FU1lOQ19TVFJPQkVfREVMQVlfVVMsCisJCQkJCSAgY2xvY2tfcmF0ZSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmaGQtPmRldiwgImhvc3QgdGltZXN5bmNfZW5hYmxlICVkXG4iLAorCQkJcmV0KTsKKwl9CisKKwlnYl90aW1lc3luY19zZXRfc3RhdGVfYXRvbWljKHRpbWVzeW5jX3N2YywgR0JfVElNRVNZTkNfU1RBVEVfV0FJVF9TVkMpOworCXJldCA9IGdiX3N2Y190aW1lc3luY19lbmFibGUoc3ZjLCBHQl9USU1FU1lOQ19NQVhfU1RST0JFUywKKwkJCQkgICAgIGluaXRfZnJhbWVfdGltZSwKKwkJCQkgICAgIEdCX1RJTUVTWU5DX1NUUk9CRV9ERUxBWV9VUywKKwkJCQkgICAgIGNsb2NrX3JhdGUpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3ZjLT5kZXYsCisJCQkiZ2Jfc3ZjX3RpbWVzeW5jX2VuYWJsZSAlZFxuIiwgcmV0KTsKKwkJZ2JfdGltZXN5bmNfdGVhcmRvd24odGltZXN5bmNfc3ZjKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFNjaGVkdWxlIGEgdGltZW91dCB3YWl0aW5nIGZvciBTVkMgdG8gY29tcGxldGUgc3Ryb2JpbmcgKi8KKwlnYl90aW1lc3luY19zY2hlZHVsZV9zdmNfdGltZW91dCh0aW1lc3luY19zdmMpOworfQorCitzdGF0aWMgdm9pZCBnYl90aW1lc3luY19hdXRob3JpdGF0aXZlKHN0cnVjdCBnYl90aW1lc3luY19zdmMgKnRpbWVzeW5jX3N2YykKK3sKKwlzdHJ1Y3QgZ2Jfc3ZjICpzdmMgPSB0aW1lc3luY19zdmMtPnN2YzsKKwlzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkOworCXN0cnVjdCBnYl90aW1lc3luY19pbnRlcmZhY2UgKnRpbWVzeW5jX2ludGVyZmFjZTsKKwlzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRlcmZhY2U7CisJdTY0IHN2Y19mcmFtZV90aW1lW0dCX1RJTUVTWU5DX01BWF9TVFJPQkVTXTsKKwlpbnQgcmV0OworCisJLyogR2V0IGF1dGhvcml0YXRpdmUgdGltZSBmcm9tIFNWQyBhbmQgYWRqdXN0IGxvY2FsIGNsb2NrICovCisJcmV0ID0gZ2Jfc3ZjX3RpbWVzeW5jX2F1dGhvcml0YXRpdmUoc3ZjLCBzdmNfZnJhbWVfdGltZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdmMtPmRldiwKKwkJCSJnYl9zdmNfdGltZXN5bmNfYXV0aG9yaXRhdGl2ZSAlZFxuIiwgcmV0KTsKKwkJZ2JfdGltZXN5bmNfdGVhcmRvd24odGltZXN5bmNfc3ZjKTsKKwkJcmV0dXJuOworCX0KKwlnYl90aW1lc3luY19jb2xsYXRlX2ZyYW1lX3RpbWUodGltZXN5bmNfc3ZjLCBzdmNfZnJhbWVfdGltZSk7CisKKwkvKiBUcmFuc21pdCBhdXRob3JpdGF0aXZlIHRpbWUgdG8gZG93bnN0cmVhbSBzbGF2ZXMgKi8KKwloZCA9IHRpbWVzeW5jX3N2Yy0+dGltZXN5bmNfaGQtPmhkOworCXJldCA9IGhkLT5kcml2ZXItPnRpbWVzeW5jX2F1dGhvcml0YXRpdmUoaGQsIHN2Y19mcmFtZV90aW1lKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycigmaGQtPmRldiwgImhvc3QgdGltZXN5bmNfYXV0aG9yaXRhdGl2ZSAlZFxuIiwgcmV0KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodGltZXN5bmNfaW50ZXJmYWNlLAorCQkJICAgICZ0aW1lc3luY19zdmMtPmludGVyZmFjZV9saXN0LCBsaXN0KSB7CisJCWludGVyZmFjZSA9IHRpbWVzeW5jX2ludGVyZmFjZS0+aW50ZXJmYWNlOworCQlyZXQgPSBnYl9pbnRlcmZhY2VfdGltZXN5bmNfYXV0aG9yaXRhdGl2ZSgKKwkJCQkJCWludGVyZmFjZSwKKwkJCQkJCXN2Y19mcmFtZV90aW1lKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsCisJCQkJImludGVyZmFjZSB0aW1lc3luY19hdXRob3JpdGF0aXZlICVkXG4iLCByZXQpOworCQl9CisJfQorCisJLyogUmVsZWFzZSB3YWtlIHBpbnMgKi8KKwlnYl9zdmNfdGltZXN5bmNfd2FrZV9waW5zX3JlbGVhc2Uoc3ZjKTsKKwlnYl90aW1lc3luY19wbGF0Zm9ybV91bmxvY2tfYnVzKCk7CisKKwkvKiBUcmFuc2l0aW9uIHRvIHN0YXRlIEFDVElWRSAqLworCWdiX3RpbWVzeW5jX3NldF9zdGF0ZV9hdG9taWModGltZXN5bmNfc3ZjLCBHQl9USU1FU1lOQ19TVEFURV9BQ1RJVkUpOworCisJLyogU2NoZWR1bGUgYSBwaW5nIHRvIHZlcmlmeSB0aGUgc3luY2hyb25pemVkIHN5c3RlbSB0aW1lICovCisJdGltZXN5bmNfc3ZjLT5wcmludF9waW5nID0gdHJ1ZTsKKwlnYl90aW1lc3luY19zZXRfc3RhdGVfYXRvbWljKHRpbWVzeW5jX3N2YywgR0JfVElNRVNZTkNfU1RBVEVfUElORyk7Cit9CisKK3N0YXRpYyBpbnQgX19nYl90aW1lc3luY19nZXRfc3RhdHVzKHN0cnVjdCBnYl90aW1lc3luY19zdmMgKnRpbWVzeW5jX3N2YykKK3sKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCXN3aXRjaCAodGltZXN5bmNfc3ZjLT5zdGF0ZSkgeworCWNhc2UgR0JfVElNRVNZTkNfU1RBVEVfSU5WQUxJRDoKKwljYXNlIEdCX1RJTUVTWU5DX1NUQVRFX0lOQUNUSVZFOgorCQlyZXQgPSAtRU5PREVWOworCQlicmVhazsKKwljYXNlIEdCX1RJTUVTWU5DX1NUQVRFX0lOSVQ6CisJY2FzZSBHQl9USU1FU1lOQ19TVEFURV9XQUlUX1NWQzoKKwljYXNlIEdCX1RJTUVTWU5DX1NUQVRFX0FVVEhPUklUQVRJVkU6CisJCXJldCA9IC1FQUdBSU47CisJCWJyZWFrOworCWNhc2UgR0JfVElNRVNZTkNfU1RBVEVfUElORzoKKwljYXNlIEdCX1RJTUVTWU5DX1NUQVRFX0FDVElWRToKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgdGFrZXMgYSBGcmFtZVRpbWUgYW5kIGRlcml2ZXMgdGhlIGRpZmZlcmVuY2Ugd2l0aC1yZXNwZWN0CisgKiB0byBhIHJlZmVyZW5jZSBGcmFtZVRpbWUva3RpbWUgcGFpci4gSXQgdGhlbiByZXR1cm5zIHRoZSBjYWxjdWxhdGVkCisgKiBrdGltZSBiYXNlZCBvbiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzdXBwbGllZCBGcmFtZVRpbWUgYW5kCisgKiB0aGUgcmVmZXJlbmNlIEZyYW1lVGltZS4KKyAqCisgKiBUaGUgdGltZSBkaWZmZXJlbmNlIGlzIGNhbGN1bGF0ZWQgdG8gc2l4IGRlY2ltYWwgcGxhY2VzLiBUYWtpbmcgMTkuMk1IegorICogYXMgYW4gZXhhbXBsZSB0aGlzIG1lYW5zIHdlIGhhdmUgNTIuMDgzMzMzfiBuYW5vc2Vjb25kcyBwZXIgY2xvY2sgb3IKKyAqIDUyMDgzMzMzfiBmZW10b3NlY29uZHMgcGVyIGNsb2NrLgorICoKKyAqIE5haXZlbHkgdGFraW5nIHRoZSBjb3VudCBkaWZmZXJlbmNlIGFuZCBjb252ZXJ0aW5nIHRvCisgKiBzZWNvbmRzL25hbm9zZWNvbmRzIHdvdWxkIHF1aWNrbHkgc2VlIHRoZSAwLjA4MzMgY29tcG9uZW50IHByb2R1Y2UKKyAqIG5vdGljZWFibGUgZXJyb3JzLiBGb3IgZXhhbXBsZSBhIHRpbWUgZGlmZmVyZW5jZSBvZiBvbmUgc2Vjb25kIHdvdWxkCisgKiBsb29zZSAxOTIwMDAwMCAqIDAuMDgzMzN4IG5hbm9zZWNvbmRzIG9yIDEuNTkgc2Vjb25kcy4KKyAqCisgKiBJbiBjb250cmFzdCBjYWxjdWxhdGluZyBpbiBmZW10b3NlY29uZHMgdGhlIHNhbWUgZXhhbXBsZSBvZiAxOTIwMDAwMCAqCisgKiAwLjAwMDAwMDA4MzMzM3ggbmFub3NlY29uZHMgcGVyIGNvdW50IG9mIGVycm9yIGlzIGp1c3QgMS41OSBuYW5vc2Vjb25kcyEKKyAqCisgKiBDb250aW51aW5nIHRoZSBleGFtcGxlIG9mIDE5LjIgTUh6IHdlIGNhcCB0aGUgbWF4aW11bSBlcnJvciBkaWZmZXJlbmNlCisgKiBhdCBhIHdvcnN0LWNhc2UgMC4zIG1pY3Jvc2Vjb25kcyBvdmVyIGEgcG90ZW50aWFsIGNhbGN1bGF0aW9uIHdpbmRvdyBvZgorICogYWJvdW50IDE1IHNlY29uZHMsIG1lYW5pbmcgeW91IGNhbiBjb252ZXJ0IGEgRnJhbWVUaW1lIHRoYXQgaXMgPD0gMTUKKyAqIHNlY29uZHMgb2xkZXIveW91bmdlciB0aGFuIHRoZSByZWZlcmVuY2UgdGltZSB3aXRoIGEgbWF4aW11bSBlcnJvciBvZgorICogMC4yMzg1IHVzZWNvbmRzLiBOb3RlIDE5LjJNSHogaXMgYW4gZXhhbXBsZSBmcmVxdWVuY3kgbm90IGEgcmVxdWlyZW1lbnQuCisgKi8KK3N0YXRpYyBpbnQgZ2JfdGltZXN5bmNfdG9fdGltZXNwZWMoc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqdGltZXN5bmNfc3ZjLAorCQkJCSAgIHU2NCBmcmFtZV90aW1lLCBzdHJ1Y3QgdGltZXNwZWMgKnRzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTY0IGRlbHRhX2ZzLCBjb3VudHMsIHNlYywgbnNlYzsKKwlib29sIGFkZDsKKwlpbnQgcmV0ID0gMDsKKworCW1lbXNldCh0cywgMHgwMCwgc2l6ZW9mKCp0cykpOworCW11dGV4X2xvY2soJnRpbWVzeW5jX3N2Yy0+bXV0ZXgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZ0aW1lc3luY19zdmMtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXQgPSBfX2diX3RpbWVzeW5jX2dldF9zdGF0dXModGltZXN5bmNfc3ZjKTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisKKwkvKiBTdXBwb3J0IGNhbGN1bGF0aW5nIGt0aW1lIHVwd2FyZHMgb3IgZG93bndhcmRzIGZyb20gdGhlIHJlZmVyZW5jZSAqLworCWlmIChmcmFtZV90aW1lIDwgdGltZXN5bmNfc3ZjLT5rdGltZV9kYXRhLmZyYW1lX3RpbWUpIHsKKwkJYWRkID0gZmFsc2U7CisJCWNvdW50cyA9IHRpbWVzeW5jX3N2Yy0+a3RpbWVfZGF0YS5mcmFtZV90aW1lIC0gZnJhbWVfdGltZTsKKwl9IGVsc2UgeworCQlhZGQgPSB0cnVlOworCQljb3VudHMgPSBmcmFtZV90aW1lIC0gdGltZXN5bmNfc3ZjLT5rdGltZV9kYXRhLmZyYW1lX3RpbWU7CisJfQorCisJLyogRW5mb3JjZSB0aGUgLjIzIG9mIGEgdXNlY29uZCBib3VuZGFyeSBAIDE5LjJNSHogKi8KKwlpZiAoY291bnRzID4gZ2JfdGltZXN5bmNfbWF4X2t0aW1lX2RpZmYpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCS8qIERldGVybWluZSB0aGUgdGltZSBkaWZmZXJlbmNlIGluIGZlbXRvc2Vjb25kcyAqLworCWRlbHRhX2ZzID0gY291bnRzICogZ2JfdGltZXN5bmNfZnNfcGVyX2Nsb2NrOworCisJLyogQ29udmVydCB0byBzZWNvbmRzICovCisJc2VjID0gZGVsdGFfZnM7CisJZG9fZGl2KHNlYywgTlNFQ19QRVJfU0VDKTsKKwlkb19kaXYoc2VjLCAxMDAwMDAwVUwpOworCisJLyogR2V0IHRoZSBuYW5vc2Vjb25kIHJlbWFpbmRlciAqLworCW5zZWMgPSBkb19kaXYoZGVsdGFfZnMsIHNlYyk7CisJZG9fZGl2KG5zZWMsIDEwMDAwMDBVTCk7CisKKwlpZiAoYWRkKSB7CisJCS8qIEFkZCB0aGUgY2FsY3VsYXRlZCBvZmZzZXQgLSBvdmVyZmxvdyBuYW5vc2Vjb25kcyB1cHdhcmRzICovCisJCXRzLT50dl9zZWMgPSB0aW1lc3luY19zdmMtPmt0aW1lX2RhdGEudHMudHZfc2VjICsgc2VjOworCQl0cy0+dHZfbnNlYyA9IHRpbWVzeW5jX3N2Yy0+a3RpbWVfZGF0YS50cy50dl9uc2VjICsgbnNlYzsKKwkJaWYgKHRzLT50dl9uc2VjID49IE5TRUNfUEVSX1NFQykgeworCQkJdHMtPnR2X3NlYysrOworCQkJdHMtPnR2X25zZWMgLT0gTlNFQ19QRVJfU0VDOworCQl9CisJfSBlbHNlIHsKKwkJLyogU3VidHJhY3QgdGhlIGRpZmZlcmVuY2Ugb3Zlci91bmRlcmZsb3cgYXMgbmVjZXNzYXJ5ICovCisJCWlmIChuc2VjID4gdGltZXN5bmNfc3ZjLT5rdGltZV9kYXRhLnRzLnR2X25zZWMpIHsKKwkJCXNlYysrOworCQkJbnNlYyA9IG5zZWMgKyB0aW1lc3luY19zdmMtPmt0aW1lX2RhdGEudHMudHZfbnNlYzsKKwkJCW5zZWMgPSBkb19kaXYobnNlYywgTlNFQ19QRVJfU0VDKTsKKwkJfSBlbHNlIHsKKwkJCW5zZWMgPSB0aW1lc3luY19zdmMtPmt0aW1lX2RhdGEudHMudHZfbnNlYyAtIG5zZWM7CisJCX0KKwkJLyogQ2Fubm90IHJldHVybiBhIG5lZ2F0aXZlIHNlY29uZCB2YWx1ZSAqLworCQlpZiAoc2VjID4gdGltZXN5bmNfc3ZjLT5rdGltZV9kYXRhLnRzLnR2X3NlYykgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQl0cy0+dHZfc2VjID0gdGltZXN5bmNfc3ZjLT5rdGltZV9kYXRhLnRzLnR2X3NlYyAtIHNlYzsKKwkJdHMtPnR2X25zZWMgPSBuc2VjOworCX0KK2RvbmU6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGltZXN5bmNfc3ZjLT5zcGlubG9jaywgZmxhZ3MpOworCW11dGV4X3VubG9jaygmdGltZXN5bmNfc3ZjLT5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNpemVfdCBnYl90aW1lc3luY19sb2dfZnJhbWVfdGltZShzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICp0aW1lc3luY19zdmMsCisJCQkJCSBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pCit7CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gdGltZXN5bmNfc3ZjLT5zdmM7CisJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZDsKKwlzdHJ1Y3QgZ2JfdGltZXN5bmNfaW50ZXJmYWNlICp0aW1lc3luY19pbnRlcmZhY2U7CisJc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZXJmYWNlOworCXVuc2lnbmVkIGludCBsZW47CisJc2l6ZV90IG9mZjsKKworCS8qIEFQL1NWQyAqLworCW9mZiA9IHNucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJXMgZnJhbWV0aW1lOiBhcD0lbGx1ICVzPSVsbHUgIiwKKwkJICAgICAgIGdyZXlidXNfYnVzX3R5cGUubmFtZSwKKwkJICAgICAgIHRpbWVzeW5jX3N2Yy0+YXBfcGluZ19mcmFtZV90aW1lLCBkZXZfbmFtZSgmc3ZjLT5kZXYpLAorCQkgICAgICAgdGltZXN5bmNfc3ZjLT5zdmNfcGluZ19mcmFtZV90aW1lKTsKKwlsZW4gPSBidWZsZW4gLSBvZmY7CisKKwkvKiBBUEIvR1BCICovCisJaWYgKGxlbiA8IGJ1ZmxlbikgeworCQloZCA9IHRpbWVzeW5jX3N2Yy0+dGltZXN5bmNfaGQtPmhkOworCQlvZmYgKz0gc25wcmludGYoJmJ1ZltvZmZdLCBsZW4sICIlcz0lbGx1ICIsIGRldl9uYW1lKCZoZC0+ZGV2KSwKKwkJCQl0aW1lc3luY19zdmMtPnRpbWVzeW5jX2hkLT5waW5nX2ZyYW1lX3RpbWUpOworCQlsZW4gPSBidWZsZW4gLSBvZmY7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0aW1lc3luY19pbnRlcmZhY2UsCisJCQkgICAgJnRpbWVzeW5jX3N2Yy0+aW50ZXJmYWNlX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGxlbiA8IGJ1ZmxlbikgeworCQkJaW50ZXJmYWNlID0gdGltZXN5bmNfaW50ZXJmYWNlLT5pbnRlcmZhY2U7CisJCQlvZmYgKz0gc25wcmludGYoJmJ1ZltvZmZdLCBsZW4sICIlcz0lbGx1ICIsCisJCQkJCWRldl9uYW1lKCZpbnRlcmZhY2UtPmRldiksCisJCQkJCXRpbWVzeW5jX2ludGVyZmFjZS0+cGluZ19mcmFtZV90aW1lKTsKKwkJCWxlbiA9IGJ1ZmxlbiAtIG9mZjsKKwkJfQorCX0KKwlpZiAobGVuIDwgYnVmbGVuKQorCQlvZmYgKz0gc25wcmludGYoJmJ1ZltvZmZdLCBsZW4sICJcbiIpOworCXJldHVybiBvZmY7Cit9CisKK3N0YXRpYyBzaXplX3QgZ2JfdGltZXN5bmNfbG9nX2ZyYW1lX2t0aW1lKHN0cnVjdCBnYl90aW1lc3luY19zdmMgKnRpbWVzeW5jX3N2YywKKwkJCQkJICBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pCit7CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gdGltZXN5bmNfc3ZjLT5zdmM7CisJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZDsKKwlzdHJ1Y3QgZ2JfdGltZXN5bmNfaW50ZXJmYWNlICp0aW1lc3luY19pbnRlcmZhY2U7CisJc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZXJmYWNlOworCXN0cnVjdCB0aW1lc3BlYyB0czsKKwl1bnNpZ25lZCBpbnQgbGVuOworCXNpemVfdCBvZmY7CisKKwkvKiBBUCAqLworCWdiX3RpbWVzeW5jX3RvX3RpbWVzcGVjKHRpbWVzeW5jX3N2YywgdGltZXN5bmNfc3ZjLT5hcF9waW5nX2ZyYW1lX3RpbWUsCisJCQkJJnRzKTsKKwlvZmYgPSBzbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVzIGZyYW1ldGltZTogYXA9JWx1LiVsdSAiLAorCQkgICAgICAgZ3JleWJ1c19idXNfdHlwZS5uYW1lLCB0cy50dl9zZWMsIHRzLnR2X25zZWMpOworCWxlbiA9IGJ1ZmxlbiAtIG9mZjsKKwlpZiAobGVuID49IGJ1ZmxlbikKKwkJZ290byBkb25lOworCisJLyogU1ZDICovCisJZ2JfdGltZXN5bmNfdG9fdGltZXNwZWModGltZXN5bmNfc3ZjLCB0aW1lc3luY19zdmMtPnN2Y19waW5nX2ZyYW1lX3RpbWUsCisJCQkJJnRzKTsKKwlvZmYgKz0gc25wcmludGYoJmJ1ZltvZmZdLCBsZW4sICIlcz0lbHUuJWx1ICIsIGRldl9uYW1lKCZzdmMtPmRldiksCisJCQl0cy50dl9zZWMsIHRzLnR2X25zZWMpOworCWxlbiA9IGJ1ZmxlbiAtIG9mZjsKKwlpZiAobGVuID49IGJ1ZmxlbikKKwkJZ290byBkb25lOworCisJLyogQVBCL0dQQiAqLworCWhkID0gdGltZXN5bmNfc3ZjLT50aW1lc3luY19oZC0+aGQ7CisJZ2JfdGltZXN5bmNfdG9fdGltZXNwZWModGltZXN5bmNfc3ZjLAorCQkJCXRpbWVzeW5jX3N2Yy0+dGltZXN5bmNfaGQtPnBpbmdfZnJhbWVfdGltZSwKKwkJCQkmdHMpOworCW9mZiArPSBzbnByaW50ZigmYnVmW29mZl0sIGxlbiwgIiVzPSVsdS4lbHUgIiwKKwkJCWRldl9uYW1lKCZoZC0+ZGV2KSwKKwkJCXRzLnR2X3NlYywgdHMudHZfbnNlYyk7CisJbGVuID0gYnVmbGVuIC0gb2ZmOworCWlmIChsZW4gPj0gYnVmbGVuKQorCQlnb3RvIGRvbmU7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRpbWVzeW5jX2ludGVyZmFjZSwKKwkJCSAgICAmdGltZXN5bmNfc3ZjLT5pbnRlcmZhY2VfbGlzdCwgbGlzdCkgeworCQlpbnRlcmZhY2UgPSB0aW1lc3luY19pbnRlcmZhY2UtPmludGVyZmFjZTsKKwkJZ2JfdGltZXN5bmNfdG9fdGltZXNwZWModGltZXN5bmNfc3ZjLAorCQkJCQl0aW1lc3luY19pbnRlcmZhY2UtPnBpbmdfZnJhbWVfdGltZSwKKwkJCQkJJnRzKTsKKwkJb2ZmICs9IHNucHJpbnRmKCZidWZbb2ZmXSwgbGVuLCAiJXM9JWx1LiVsdSAiLAorCQkJCWRldl9uYW1lKCZpbnRlcmZhY2UtPmRldiksCisJCQkJdHMudHZfc2VjLCB0cy50dl9uc2VjKTsKKwkJbGVuID0gYnVmbGVuIC0gb2ZmOworCQlpZiAobGVuID49IGJ1ZmxlbikKKwkJCWdvdG8gZG9uZTsKKwl9CisJb2ZmICs9IHNucHJpbnRmKCZidWZbb2ZmXSwgbGVuLCAiXG4iKTsKK2RvbmU6CisJcmV0dXJuIG9mZjsKK30KKworLyoKKyAqIFNlbmQgYW4gU1ZDIGluaXRpYXRlZCB3YWtlICdwaW5nJyB0byBlYWNoIFRpbWVTeW5jIHBhcnRpY2lwYW50LgorICogR2V0IHRoZSBGcmFtZVRpbWUgZnJvbSBlYWNoIHBhcnRpY2lwYW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgd2FrZQorICogcGluZy4KKyAqLworc3RhdGljIHZvaWQgZ2JfdGltZXN5bmNfcGluZyhzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICp0aW1lc3luY19zdmMpCit7CisJc3RydWN0IGdiX3N2YyAqc3ZjID0gdGltZXN5bmNfc3ZjLT5zdmM7CisJc3RydWN0IGdiX2hvc3RfZGV2aWNlICpoZDsKKwlzdHJ1Y3QgZ2JfdGltZXN5bmNfaW50ZXJmYWNlICp0aW1lc3luY19pbnRlcmZhY2U7CisJc3RydWN0IGdiX2NvbnRyb2wgKmNvbnRyb2w7CisJdTY0ICpwaW5nX2ZyYW1lX3RpbWU7CisJaW50IHJldDsKKworCS8qIEdldCBhY2Nlc3MgdG8gdGhlIHdha2UgcGlucyBpbiB0aGUgQVAgYW5kIFNWQyAqLworCXJldCA9IGdiX3RpbWVzeW5jX3BsYXRmb3JtX2xvY2tfYnVzKHRpbWVzeW5jX3N2Yyk7CisJaWYgKHJldCA8IDApIHsKKwkJZ2JfdGltZXN5bmNfcGxhdGZvcm1fbG9ja19idXNfZmFpbCh0aW1lc3luY19zdmMsIHJldCk7CisJCXJldHVybjsKKwl9CisJcmV0ID0gZ2Jfc3ZjX3RpbWVzeW5jX3dha2VfcGluc19hY3F1aXJlKHN2YywgdGltZXN5bmNfc3ZjLT5zdHJvYmVfbWFzayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdmMtPmRldiwKKwkJCSJnYl9zdmNfdGltZXN5bmNfd2FrZV9waW5zX2FjcXVpcmUgJWRcbiIsIHJldCk7CisJCWdiX3RpbWVzeW5jX3RlYXJkb3duKHRpbWVzeW5jX3N2Yyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBIYXZlIFNWQyBnZW5lcmF0ZSBhIHRpbWVzeW5jIHBpbmcgKi8KKwl0aW1lc3luY19zdmMtPmNhcHR1cmVfcGluZyA9IHRydWU7CisJdGltZXN5bmNfc3ZjLT5zdmNfcGluZ19mcmFtZV90aW1lID0gMDsKKwlyZXQgPSBnYl9zdmNfdGltZXN5bmNfcGluZyhzdmMsICZ0aW1lc3luY19zdmMtPnN2Y19waW5nX2ZyYW1lX3RpbWUpOworCXRpbWVzeW5jX3N2Yy0+Y2FwdHVyZV9waW5nID0gZmFsc2U7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdmMtPmRldiwKKwkJCSJnYl9zdmNfdGltZXN5bmNfcGluZyAlZFxuIiwgcmV0KTsKKwkJZ2JfdGltZXN5bmNfdGVhcmRvd24odGltZXN5bmNfc3ZjKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEdldCB0aGUgcGluZyBGcmFtZVRpbWUgZnJvbSBlYWNoIEFQQi9HUEIgKi8KKwloZCA9IHRpbWVzeW5jX3N2Yy0+dGltZXN5bmNfaGQtPmhkOworCXRpbWVzeW5jX3N2Yy0+dGltZXN5bmNfaGQtPnBpbmdfZnJhbWVfdGltZSA9IDA7CisJcmV0ID0gaGQtPmRyaXZlci0+dGltZXN5bmNfZ2V0X2xhc3RfZXZlbnQoaGQsCisJCSZ0aW1lc3luY19zdmMtPnRpbWVzeW5jX2hkLT5waW5nX2ZyYW1lX3RpbWUpOworCWlmIChyZXQpCisJCWRldl9lcnIoJmhkLT5kZXYsICJob3N0IHRpbWVzeW5jX2dldF9sYXN0X2V2ZW50ICVkXG4iLCByZXQpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0aW1lc3luY19pbnRlcmZhY2UsCisJCQkgICAgJnRpbWVzeW5jX3N2Yy0+aW50ZXJmYWNlX2xpc3QsIGxpc3QpIHsKKwkJY29udHJvbCA9IHRpbWVzeW5jX2ludGVyZmFjZS0+aW50ZXJmYWNlLT5jb250cm9sOworCQl0aW1lc3luY19pbnRlcmZhY2UtPnBpbmdfZnJhbWVfdGltZSA9IDA7CisJCXBpbmdfZnJhbWVfdGltZSA9ICZ0aW1lc3luY19pbnRlcmZhY2UtPnBpbmdfZnJhbWVfdGltZTsKKwkJcmV0ID0gZ2JfY29udHJvbF90aW1lc3luY19nZXRfbGFzdF9ldmVudChjb250cm9sLAorCQkJCQkJCSBwaW5nX2ZyYW1lX3RpbWUpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZ0aW1lc3luY19pbnRlcmZhY2UtPmludGVyZmFjZS0+ZGV2LAorCQkJCSJnYl9jb250cm9sX3RpbWVzeW5jX2dldF9sYXN0X2V2ZW50ICVkXG4iLCByZXQpOworCQl9CisJfQorCisJLyogUGluZyBzdWNjZXNzIC0gbW92ZSB0byB0aW1lc3luYyBhY3RpdmUgKi8KKwlnYl9zdmNfdGltZXN5bmNfd2FrZV9waW5zX3JlbGVhc2Uoc3ZjKTsKKwlnYl90aW1lc3luY19wbGF0Zm9ybV91bmxvY2tfYnVzKCk7CisJZ2JfdGltZXN5bmNfc2V0X3N0YXRlX2F0b21pYyh0aW1lc3luY19zdmMsIEdCX1RJTUVTWU5DX1NUQVRFX0FDVElWRSk7Cit9CisKK3N0YXRpYyB2b2lkIGdiX3RpbWVzeW5jX2xvZ19waW5nX3RpbWUoc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqdGltZXN5bmNfc3ZjKQoreworCWNoYXIgKmJ1ZjsKKworCWlmICghdGltZXN5bmNfc3ZjLT5wcmludF9waW5nKQorCQlyZXR1cm47CisKKwlidWYgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1ZikgeworCQlnYl90aW1lc3luY19sb2dfZnJhbWVfdGltZSh0aW1lc3luY19zdmMsIGJ1ZiwgUEFHRV9TSVpFKTsKKwkJZGV2X2RiZygmdGltZXN5bmNfc3ZjLT5zdmMtPmRldiwgIiVzIiwgYnVmKTsKKwkJa2ZyZWUoYnVmKTsKKwl9Cit9CisKKy8qCisgKiBQZXJmb3JtIHRoZSBhY3R1YWwgd29yayBvZiBzY2hlZHVsZWQgVGltZVN5bmMgbG9naWMuCisgKi8KK3N0YXRpYyB2b2lkIGdiX3RpbWVzeW5jX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZGVsYXllZF93b3JrID0gdG9fZGVsYXllZF93b3JrKHdvcmspOworCXN0cnVjdCBnYl90aW1lc3luY19zdmMgKnRpbWVzeW5jX3N2YyA9CisJCWNvbnRhaW5lcl9vZihkZWxheWVkX3dvcmssIHN0cnVjdCBnYl90aW1lc3luY19zdmMsIGRlbGF5ZWRfd29yayk7CisKKwltdXRleF9sb2NrKCZ0aW1lc3luY19zdmMtPm11dGV4KTsKKworCXN3aXRjaCAodGltZXN5bmNfc3ZjLT5zdGF0ZSkgeworCWNhc2UgR0JfVElNRVNZTkNfU1RBVEVfSU5JVDoKKwkJZ2JfdGltZXN5bmNfZW5hYmxlKHRpbWVzeW5jX3N2Yyk7CisJCWJyZWFrOworCisJY2FzZSBHQl9USU1FU1lOQ19TVEFURV9XQUlUX1NWQzoKKwkJZGV2X2VycigmdGltZXN5bmNfc3ZjLT5zdmMtPmRldiwKKwkJCSJ0aW1lb3V0IFNWQyBzdHJvYmUgY29tcGxldGlvbiAlZC8lZFxuIiwKKwkJCXRpbWVzeW5jX3N2Yy0+c3Ryb2JlLCBHQl9USU1FU1lOQ19NQVhfU1RST0JFUyk7CisJCWdiX3RpbWVzeW5jX3RlYXJkb3duKHRpbWVzeW5jX3N2Yyk7CisJCWJyZWFrOworCisJY2FzZSBHQl9USU1FU1lOQ19TVEFURV9BVVRIT1JJVEFUSVZFOgorCQlnYl90aW1lc3luY19hdXRob3JpdGF0aXZlKHRpbWVzeW5jX3N2Yyk7CisJCWJyZWFrOworCisJY2FzZSBHQl9USU1FU1lOQ19TVEFURV9QSU5HOgorCQlnYl90aW1lc3luY19waW5nKHRpbWVzeW5jX3N2Yyk7CisJCWdiX3RpbWVzeW5jX2xvZ19waW5nX3RpbWUodGltZXN5bmNfc3ZjKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcl9lcnIoIkludmFsaWQgc3RhdGUgJWQgZm9yIGRlbGF5ZWQgd29ya1xuIiwKKwkJICAgICAgIHRpbWVzeW5jX3N2Yy0+c3RhdGUpOworCQlicmVhazsKKwl9CisKKwltdXRleF91bmxvY2soJnRpbWVzeW5jX3N2Yy0+bXV0ZXgpOworfQorCisvKgorICogU2NoZWR1bGUgYSBuZXcgVGltZVN5bmMgSU5JVCBvciBQSU5HIG9wZXJhdGlvbiBzZXJpYWxpemVkIHcvciB0bworICogZ2JfdGltZXN5bmNfd29ya2VyKCkuCisgKi8KK3N0YXRpYyBpbnQgZ2JfdGltZXN5bmNfc2NoZWR1bGUoc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqdGltZXN5bmNfc3ZjLCBpbnQgc3RhdGUpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoc3RhdGUgIT0gR0JfVElNRVNZTkNfU1RBVEVfSU5JVCAmJiBzdGF0ZSAhPSBHQl9USU1FU1lOQ19TVEFURV9QSU5HKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJnRpbWVzeW5jX3N2Yy0+bXV0ZXgpOworCWlmICh0aW1lc3luY19zdmMtPnN0YXRlICE9ICBHQl9USU1FU1lOQ19TVEFURV9JTlZBTElEKSB7CisJCWdiX3RpbWVzeW5jX3NldF9zdGF0ZV9hdG9taWModGltZXN5bmNfc3ZjLCBzdGF0ZSk7CisJfSBlbHNlIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ0aW1lc3luY19zdmMtPm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZ2JfdGltZXN5bmNfc2NoZWR1bGVfc3luY2hyb25vdXMoCisJc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqdGltZXN5bmNfc3ZjLCBpbnQgc3RhdGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2JfdGltZXN5bmNfc2NoZWR1bGUodGltZXN5bmNfc3ZjLCBzdGF0ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh0aW1lc3luY19zdmMtPndhaXRfcXVldWUsCisJCQkodGltZXN5bmNfc3ZjLT5zdGF0ZSA9PSBHQl9USU1FU1lOQ19TVEFURV9BQ1RJVkUgfHwKKwkJCSB0aW1lc3luY19zdmMtPnN0YXRlID09IEdCX1RJTUVTWU5DX1NUQVRFX0lOQUNUSVZFIHx8CisJCQkgdGltZXN5bmNfc3ZjLT5zdGF0ZSA9PSBHQl9USU1FU1lOQ19TVEFURV9JTlZBTElEKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW11dGV4X2xvY2soJnRpbWVzeW5jX3N2Yy0+bXV0ZXgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZ0aW1lc3luY19zdmMtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXQgPSBfX2diX3RpbWVzeW5jX2dldF9zdGF0dXModGltZXN5bmNfc3ZjKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpbWVzeW5jX3N2Yy0+c3BpbmxvY2ssIGZsYWdzKTsKKwltdXRleF91bmxvY2soJnRpbWVzeW5jX3N2Yy0+bXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBnYl90aW1lc3luY19zdmMgKmdiX3RpbWVzeW5jX2ZpbmRfdGltZXN5bmNfc3ZjKAorCXN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQpCit7CisJc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqdGltZXN5bmNfc3ZjOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0aW1lc3luY19zdmMsICZnYl90aW1lc3luY19zdmNfbGlzdCwgbGlzdCkgeworCQlpZiAodGltZXN5bmNfc3ZjLT5zdmMgPT0gaGQtPnN2YykKKwkJCXJldHVybiB0aW1lc3luY19zdmM7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGdiX3RpbWVzeW5jX2ludGVyZmFjZSAqZ2JfdGltZXN5bmNfZmluZF90aW1lc3luY19pbnRlcmZhY2UoCisJc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqdGltZXN5bmNfc3ZjLAorCXN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKwlzdHJ1Y3QgZ2JfdGltZXN5bmNfaW50ZXJmYWNlICp0aW1lc3luY19pbnRlcmZhY2U7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRpbWVzeW5jX2ludGVyZmFjZSwgJnRpbWVzeW5jX3N2Yy0+aW50ZXJmYWNlX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHRpbWVzeW5jX2ludGVyZmFjZS0+aW50ZXJmYWNlID09IGludGVyZmFjZSkKKwkJCXJldHVybiB0aW1lc3luY19pbnRlcmZhY2U7CisJfQorCXJldHVybiBOVUxMOworfQorCitpbnQgZ2JfdGltZXN5bmNfc2NoZWR1bGVfc3luY2hyb25vdXMoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCWludCByZXQ7CisJc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqdGltZXN5bmNfc3ZjOworCWludCByZXRyaWVzOworCisJaWYgKCEoaW50ZXJmYWNlLT5mZWF0dXJlcyAmIEdSRVlCVVNfSU5URVJGQUNFX0ZFQVRVUkVfVElNRVNZTkMpKQorCQlyZXR1cm4gMDsKKworCW11dGV4X2xvY2soJmdiX3RpbWVzeW5jX3N2Y19saXN0X211dGV4KTsKKwlmb3IgKHJldHJpZXMgPSAwOyByZXRyaWVzIDwgR0JfVElNRVNZTkNfTUFYX1JFVFJJRVM7IHJldHJpZXMrKykgeworCQl0aW1lc3luY19zdmMgPSBnYl90aW1lc3luY19maW5kX3RpbWVzeW5jX3N2YyhpbnRlcmZhY2UtPmhkKTsKKwkJaWYgKCF0aW1lc3luY19zdmMpIHsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQlyZXQgPSBfX2diX3RpbWVzeW5jX3NjaGVkdWxlX3N5bmNocm9ub3VzKHRpbWVzeW5jX3N2YywKKwkJCQkJCSBHQl9USU1FU1lOQ19TVEFURV9JTklUKTsKKwkJaWYgKCFyZXQpCisJCQlicmVhazsKKwl9CisJaWYgKHJldCAmJiByZXRyaWVzID09IEdCX1RJTUVTWU5DX01BWF9SRVRSSUVTKQorCQlyZXQgPSAtRVRJTUVET1VUOworZG9uZToKKwltdXRleF91bmxvY2soJmdiX3RpbWVzeW5jX3N2Y19saXN0X211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfdGltZXN5bmNfc2NoZWR1bGVfc3luY2hyb25vdXMpOworCit2b2lkIGdiX3RpbWVzeW5jX3NjaGVkdWxlX2FzeW5jaHJvbm91cyhzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqdGltZXN5bmNfc3ZjOworCisJaWYgKCEoaW50ZXJmYWNlLT5mZWF0dXJlcyAmIEdSRVlCVVNfSU5URVJGQUNFX0ZFQVRVUkVfVElNRVNZTkMpKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZnYl90aW1lc3luY19zdmNfbGlzdF9tdXRleCk7CisJdGltZXN5bmNfc3ZjID0gZ2JfdGltZXN5bmNfZmluZF90aW1lc3luY19zdmMoaW50ZXJmYWNlLT5oZCk7CisJaWYgKCF0aW1lc3luY19zdmMpCisJCWdvdG8gZG9uZTsKKworCWdiX3RpbWVzeW5jX3NjaGVkdWxlKHRpbWVzeW5jX3N2YywgR0JfVElNRVNZTkNfU1RBVEVfSU5JVCk7Citkb25lOgorCW11dGV4X3VubG9jaygmZ2JfdGltZXN5bmNfc3ZjX2xpc3RfbXV0ZXgpOworCXJldHVybjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX3RpbWVzeW5jX3NjaGVkdWxlX2FzeW5jaHJvbm91cyk7CisKK3N0YXRpYyBzc2l6ZV90IGdiX3RpbWVzeW5jX3BpbmdfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVidWYsCisJCQkJICAgICBzaXplX3QgbGVuLCBsb2ZmX3QgKm9mZnNldCwgYm9vbCBrdGltZSkKK3sKKwlzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICp0aW1lc3luY19zdmMgPSBmaWxlLT5mX2lub2RlLT5pX3ByaXZhdGU7CisJY2hhciAqYnVmOworCXNzaXplX3QgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJmdiX3RpbWVzeW5jX3N2Y19saXN0X211dGV4KTsKKwltdXRleF9sb2NrKCZ0aW1lc3luY19zdmMtPm11dGV4KTsKKwlpZiAobGlzdF9lbXB0eSgmdGltZXN5bmNfc3ZjLT5pbnRlcmZhY2VfbGlzdCkpCisJCXJldCA9IC1FTk9ERVY7CisJdGltZXN5bmNfc3ZjLT5wcmludF9waW5nID0gZmFsc2U7CisJbXV0ZXhfdW5sb2NrKCZ0aW1lc3luY19zdmMtPm11dGV4KTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisKKwlyZXQgPSBfX2diX3RpbWVzeW5jX3NjaGVkdWxlX3N5bmNocm9ub3VzKHRpbWVzeW5jX3N2YywKKwkJCQkJCSBHQl9USU1FU1lOQ19TVEFURV9QSU5HKTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisKKwlidWYgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBkb25lOworCX0KKworCWlmIChrdGltZSkKKwkJcmV0ID0gZ2JfdGltZXN5bmNfbG9nX2ZyYW1lX2t0aW1lKHRpbWVzeW5jX3N2YywgYnVmLCBQQUdFX1NJWkUpOworCWVsc2UKKwkJcmV0ID0gZ2JfdGltZXN5bmNfbG9nX2ZyYW1lX3RpbWUodGltZXN5bmNfc3ZjLCBidWYsIFBBR0VfU0laRSk7CisJaWYgKHJldCA+IDApCisJCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVidWYsIGxlbiwgb2Zmc2V0LCBidWYsIHJldCk7CisJa2ZyZWUoYnVmKTsKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZnYl90aW1lc3luY19zdmNfbGlzdF9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgZ2JfdGltZXN5bmNfcGluZ19yZWFkX2ZyYW1lX3RpbWUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCQljaGFyIF9fdXNlciAqYnVmLAorCQkJCQkJc2l6ZV90IGxlbiwgbG9mZl90ICpvZmZzZXQpCit7CisJcmV0dXJuIGdiX3RpbWVzeW5jX3BpbmdfcmVhZChmaWxlLCBidWYsIGxlbiwgb2Zmc2V0LCBmYWxzZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGdiX3RpbWVzeW5jX3BpbmdfcmVhZF9mcmFtZV9rdGltZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJCSBjaGFyIF9fdXNlciAqYnVmLAorCQkJCQkJIHNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0KQoreworCXJldHVybiBnYl90aW1lc3luY19waW5nX3JlYWQoZmlsZSwgYnVmLCBsZW4sIG9mZnNldCwgdHJ1ZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGdiX3RpbWVzeW5jX2RlYnVnZnNfZnJhbWVfdGltZV9vcHMgPSB7CisJLnJlYWQJCT0gZ2JfdGltZXN5bmNfcGluZ19yZWFkX2ZyYW1lX3RpbWUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBnYl90aW1lc3luY19kZWJ1Z2ZzX2ZyYW1lX2t0aW1lX29wcyA9IHsKKwkucmVhZAkJPSBnYl90aW1lc3luY19waW5nX3JlYWRfZnJhbWVfa3RpbWUsCit9OworCitzdGF0aWMgaW50IGdiX3RpbWVzeW5jX2hkX2FkZChzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICp0aW1lc3luY19zdmMsCisJCQkgICAgICBzdHJ1Y3QgZ2JfaG9zdF9kZXZpY2UgKmhkKQoreworCXN0cnVjdCBnYl90aW1lc3luY19ob3N0X2RldmljZSAqdGltZXN5bmNfaGQ7CisKKwl0aW1lc3luY19oZCA9IGt6YWxsb2Moc2l6ZW9mKCp0aW1lc3luY19oZCksIEdGUF9LRVJORUwpOworCWlmICghdGltZXN5bmNfaGQpCisJCXJldHVybiAtRU5PTUVNOworCisJV0FSTl9PTih0aW1lc3luY19zdmMtPnRpbWVzeW5jX2hkKTsKKwl0aW1lc3luY19oZC0+aGQgPSBoZDsKKwl0aW1lc3luY19zdmMtPnRpbWVzeW5jX2hkID0gdGltZXN5bmNfaGQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2JfdGltZXN5bmNfaGRfcmVtb3ZlKHN0cnVjdCBnYl90aW1lc3luY19zdmMgKnRpbWVzeW5jX3N2YywKKwkJCQkgIHN0cnVjdCBnYl9ob3N0X2RldmljZSAqaGQpCit7CisJaWYgKHRpbWVzeW5jX3N2Yy0+dGltZXN5bmNfaGQtPmhkID09IGhkKSB7CisJCWtmcmVlKHRpbWVzeW5jX3N2Yy0+dGltZXN5bmNfaGQpOworCQl0aW1lc3luY19zdmMtPnRpbWVzeW5jX2hkID0gTlVMTDsKKwkJcmV0dXJuOworCX0KKwlXQVJOX09OKDEpOworfQorCitpbnQgZ2JfdGltZXN5bmNfc3ZjX2FkZChzdHJ1Y3QgZ2Jfc3ZjICpzdmMpCit7CisJc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqdGltZXN5bmNfc3ZjOworCWludCByZXQ7CisKKwl0aW1lc3luY19zdmMgPSBremFsbG9jKHNpemVvZigqdGltZXN5bmNfc3ZjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0aW1lc3luY19zdmMpCisJCXJldHVybiAtRU5PTUVNOworCisJdGltZXN5bmNfc3ZjLT53b3JrX3F1ZXVlID0KKwkJY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImdiLXRpbWVzeW5jLXdvcmtfcXVldWUiKTsKKworCWlmICghdGltZXN5bmNfc3ZjLT53b3JrX3F1ZXVlKSB7CisJCWtmcmVlKHRpbWVzeW5jX3N2Yyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW11dGV4X2xvY2soJmdiX3RpbWVzeW5jX3N2Y19saXN0X211dGV4KTsKKwlJTklUX0xJU1RfSEVBRCgmdGltZXN5bmNfc3ZjLT5pbnRlcmZhY2VfbGlzdCk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnRpbWVzeW5jX3N2Yy0+ZGVsYXllZF93b3JrLCBnYl90aW1lc3luY193b3JrZXIpOworCW11dGV4X2luaXQoJnRpbWVzeW5jX3N2Yy0+bXV0ZXgpOworCXNwaW5fbG9ja19pbml0KCZ0aW1lc3luY19zdmMtPnNwaW5sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0aW1lc3luY19zdmMtPndhaXRfcXVldWUpOworCisJdGltZXN5bmNfc3ZjLT5zdmMgPSBzdmM7CisJdGltZXN5bmNfc3ZjLT5mcmFtZV90aW1lX29mZnNldCA9IDA7CisJdGltZXN5bmNfc3ZjLT5jYXB0dXJlX3BpbmcgPSBmYWxzZTsKKwlnYl90aW1lc3luY19zZXRfc3RhdGVfYXRvbWljKHRpbWVzeW5jX3N2YywgR0JfVElNRVNZTkNfU1RBVEVfSU5BQ1RJVkUpOworCisJdGltZXN5bmNfc3ZjLT5mcmFtZV90aW1lX2RlbnRyeSA9CisJCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImZyYW1lLXRpbWUiLCBTX0lSVUdPLCBzdmMtPmRlYnVnZnNfZGVudHJ5LAorCQkJCSAgICB0aW1lc3luY19zdmMsCisJCQkJICAgICZnYl90aW1lc3luY19kZWJ1Z2ZzX2ZyYW1lX3RpbWVfb3BzKTsKKwl0aW1lc3luY19zdmMtPmZyYW1lX2t0aW1lX2RlbnRyeSA9CisJCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImZyYW1lLWt0aW1lIiwgU19JUlVHTywgc3ZjLT5kZWJ1Z2ZzX2RlbnRyeSwKKwkJCQkgICAgdGltZXN5bmNfc3ZjLAorCQkJCSAgICAmZ2JfdGltZXN5bmNfZGVidWdmc19mcmFtZV9rdGltZV9vcHMpOworCisJbGlzdF9hZGQoJnRpbWVzeW5jX3N2Yy0+bGlzdCwgJmdiX3RpbWVzeW5jX3N2Y19saXN0KTsKKwlyZXQgPSBnYl90aW1lc3luY19oZF9hZGQodGltZXN5bmNfc3ZjLCBzdmMtPmhkKTsKKwlpZiAocmV0KSB7CisJCWxpc3RfZGVsKCZ0aW1lc3luY19zdmMtPmxpc3QpOworCQlkZWJ1Z2ZzX3JlbW92ZSh0aW1lc3luY19zdmMtPmZyYW1lX2t0aW1lX2RlbnRyeSk7CisJCWRlYnVnZnNfcmVtb3ZlKHRpbWVzeW5jX3N2Yy0+ZnJhbWVfdGltZV9kZW50cnkpOworCQlkZXN0cm95X3dvcmtxdWV1ZSh0aW1lc3luY19zdmMtPndvcmtfcXVldWUpOworCQlrZnJlZSh0aW1lc3luY19zdmMpOworCQlnb3RvIGRvbmU7CisJfQorCisJaW5pdF90aW1lcigmdGltZXN5bmNfc3ZjLT5rdGltZV90aW1lcik7CisJdGltZXN5bmNfc3ZjLT5rdGltZV90aW1lci5mdW5jdGlvbiA9IGdiX3RpbWVzeW5jX2t0aW1lX3RpbWVyX2ZuOworCXRpbWVzeW5jX3N2Yy0+a3RpbWVfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBHQl9USU1FU1lOQ19LVElNRV9VUERBVEU7CisJdGltZXN5bmNfc3ZjLT5rdGltZV90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpdGltZXN5bmNfc3ZjOworCWFkZF90aW1lcigmdGltZXN5bmNfc3ZjLT5rdGltZV90aW1lcik7Citkb25lOgorCW11dGV4X3VubG9jaygmZ2JfdGltZXN5bmNfc3ZjX2xpc3RfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl90aW1lc3luY19zdmNfYWRkKTsKKwordm9pZCBnYl90aW1lc3luY19zdmNfcmVtb3ZlKHN0cnVjdCBnYl9zdmMgKnN2YykKK3sKKwlzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICp0aW1lc3luY19zdmM7CisJc3RydWN0IGdiX3RpbWVzeW5jX2ludGVyZmFjZSAqdGltZXN5bmNfaW50ZXJmYWNlOworCXN0cnVjdCBnYl90aW1lc3luY19pbnRlcmZhY2UgKm5leHQ7CisKKwltdXRleF9sb2NrKCZnYl90aW1lc3luY19zdmNfbGlzdF9tdXRleCk7CisJdGltZXN5bmNfc3ZjID0gZ2JfdGltZXN5bmNfZmluZF90aW1lc3luY19zdmMoc3ZjLT5oZCk7CisJaWYgKCF0aW1lc3luY19zdmMpCisJCWdvdG8gZG9uZTsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmdGltZXN5bmNfc3ZjLT5kZWxheWVkX3dvcmspOworCisJbXV0ZXhfbG9jaygmdGltZXN5bmNfc3ZjLT5tdXRleCk7CisKKwlnYl90aW1lc3luY19zZXRfc3RhdGVfYXRvbWljKHRpbWVzeW5jX3N2YywgR0JfVElNRVNZTkNfU1RBVEVfSU5WQUxJRCk7CisJZGVsX3RpbWVyX3N5bmMoJnRpbWVzeW5jX3N2Yy0+a3RpbWVfdGltZXIpOworCWdiX3RpbWVzeW5jX3RlYXJkb3duKHRpbWVzeW5jX3N2Yyk7CisKKwlnYl90aW1lc3luY19oZF9yZW1vdmUodGltZXN5bmNfc3ZjLCBzdmMtPmhkKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodGltZXN5bmNfaW50ZXJmYWNlLCBuZXh0LAorCQkJCSAmdGltZXN5bmNfc3ZjLT5pbnRlcmZhY2VfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmdGltZXN5bmNfaW50ZXJmYWNlLT5saXN0KTsKKwkJa2ZyZWUodGltZXN5bmNfaW50ZXJmYWNlKTsKKwl9CisJZGVidWdmc19yZW1vdmUodGltZXN5bmNfc3ZjLT5mcmFtZV9rdGltZV9kZW50cnkpOworCWRlYnVnZnNfcmVtb3ZlKHRpbWVzeW5jX3N2Yy0+ZnJhbWVfdGltZV9kZW50cnkpOworCWRlc3Ryb3lfd29ya3F1ZXVlKHRpbWVzeW5jX3N2Yy0+d29ya19xdWV1ZSk7CisJbGlzdF9kZWwoJnRpbWVzeW5jX3N2Yy0+bGlzdCk7CisKKwltdXRleF91bmxvY2soJnRpbWVzeW5jX3N2Yy0+bXV0ZXgpOworCisJa2ZyZWUodGltZXN5bmNfc3ZjKTsKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZnYl90aW1lc3luY19zdmNfbGlzdF9tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnYl90aW1lc3luY19zdmNfcmVtb3ZlKTsKKworLyoKKyAqIEFkZCBhIEdyZXlidXMgSW50ZXJmYWNlIHRvIHRoZSBzZXQgb2YgVGltZVN5bmMgSW50ZXJmYWNlcy4KKyAqLworaW50IGdiX3RpbWVzeW5jX2ludGVyZmFjZV9hZGQoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCXN0cnVjdCBnYl90aW1lc3luY19zdmMgKnRpbWVzeW5jX3N2YzsKKwlzdHJ1Y3QgZ2JfdGltZXN5bmNfaW50ZXJmYWNlICp0aW1lc3luY19pbnRlcmZhY2U7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIShpbnRlcmZhY2UtPmZlYXR1cmVzICYgR1JFWUJVU19JTlRFUkZBQ0VfRkVBVFVSRV9USU1FU1lOQykpCisJCXJldHVybiAwOworCisJbXV0ZXhfbG9jaygmZ2JfdGltZXN5bmNfc3ZjX2xpc3RfbXV0ZXgpOworCXRpbWVzeW5jX3N2YyA9IGdiX3RpbWVzeW5jX2ZpbmRfdGltZXN5bmNfc3ZjKGludGVyZmFjZS0+aGQpOworCWlmICghdGltZXN5bmNfc3ZjKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl0aW1lc3luY19pbnRlcmZhY2UgPSBremFsbG9jKHNpemVvZigqdGltZXN5bmNfaW50ZXJmYWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0aW1lc3luY19pbnRlcmZhY2UpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBkb25lOworCX0KKworCW11dGV4X2xvY2soJnRpbWVzeW5jX3N2Yy0+bXV0ZXgpOworCXRpbWVzeW5jX2ludGVyZmFjZS0+aW50ZXJmYWNlID0gaW50ZXJmYWNlOworCWxpc3RfYWRkKCZ0aW1lc3luY19pbnRlcmZhY2UtPmxpc3QsICZ0aW1lc3luY19zdmMtPmludGVyZmFjZV9saXN0KTsKKwl0aW1lc3luY19zdmMtPnN0cm9iZV9tYXNrIHw9IDEgPDwgaW50ZXJmYWNlLT5pbnRlcmZhY2VfaWQ7CisJbXV0ZXhfdW5sb2NrKCZ0aW1lc3luY19zdmMtPm11dGV4KTsKKworZG9uZToKKwltdXRleF91bmxvY2soJmdiX3RpbWVzeW5jX3N2Y19saXN0X211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfdGltZXN5bmNfaW50ZXJmYWNlX2FkZCk7CisKKy8qCisgKiBSZW1vdmUgYSBHcmV5YnVzIEludGVyZmFjZSBmcm9tIHRoZSBzZXQgb2YgVGltZVN5bmMgSW50ZXJmYWNlcy4KKyAqLwordm9pZCBnYl90aW1lc3luY19pbnRlcmZhY2VfcmVtb3ZlKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKwlzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICp0aW1lc3luY19zdmM7CisJc3RydWN0IGdiX3RpbWVzeW5jX2ludGVyZmFjZSAqdGltZXN5bmNfaW50ZXJmYWNlOworCisJaWYgKCEoaW50ZXJmYWNlLT5mZWF0dXJlcyAmIEdSRVlCVVNfSU5URVJGQUNFX0ZFQVRVUkVfVElNRVNZTkMpKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZnYl90aW1lc3luY19zdmNfbGlzdF9tdXRleCk7CisJdGltZXN5bmNfc3ZjID0gZ2JfdGltZXN5bmNfZmluZF90aW1lc3luY19zdmMoaW50ZXJmYWNlLT5oZCk7CisJaWYgKCF0aW1lc3luY19zdmMpCisJCWdvdG8gZG9uZTsKKworCXRpbWVzeW5jX2ludGVyZmFjZSA9IGdiX3RpbWVzeW5jX2ZpbmRfdGltZXN5bmNfaW50ZXJmYWNlKHRpbWVzeW5jX3N2YywKKwkJCQkJCQkJIGludGVyZmFjZSk7CisJaWYgKCF0aW1lc3luY19pbnRlcmZhY2UpCisJCWdvdG8gZG9uZTsKKworCW11dGV4X2xvY2soJnRpbWVzeW5jX3N2Yy0+bXV0ZXgpOworCXRpbWVzeW5jX3N2Yy0+c3Ryb2JlX21hc2sgJj0gfigxIDw8IGludGVyZmFjZS0+aW50ZXJmYWNlX2lkKTsKKwlsaXN0X2RlbCgmdGltZXN5bmNfaW50ZXJmYWNlLT5saXN0KTsKKwlrZnJlZSh0aW1lc3luY19pbnRlcmZhY2UpOworCW11dGV4X3VubG9jaygmdGltZXN5bmNfc3ZjLT5tdXRleCk7Citkb25lOgorCW11dGV4X3VubG9jaygmZ2JfdGltZXN5bmNfc3ZjX2xpc3RfbXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZ2JfdGltZXN5bmNfaW50ZXJmYWNlX3JlbW92ZSk7CisKKy8qCisgKiBHaXZlIHRoZSBhdXRob3JpdGF0aXZlIEZyYW1lVGltZSB0byB0aGUgY2FsbGluZyBmdW5jdGlvbi4gUmV0dXJucyB6ZXJvIGlmIHdlCisgKiBhcmUgbm90IGluIEdCX1RJTUVTWU5DX1NUQVRFX0FDVElWRS4KKyAqLworc3RhdGljIHU2NCBnYl90aW1lc3luY19nZXRfZnJhbWVfdGltZShzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICp0aW1lc3luY19zdmMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1NjQgcmV0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRpbWVzeW5jX3N2Yy0+c3BpbmxvY2ssIGZsYWdzKTsKKwlpZiAodGltZXN5bmNfc3ZjLT5zdGF0ZSA9PSBHQl9USU1FU1lOQ19TVEFURV9BQ1RJVkUpCisJCXJldCA9IF9fZ2JfdGltZXN5bmNfZ2V0X2ZyYW1lX3RpbWUodGltZXN5bmNfc3ZjKTsKKwllbHNlCisJCXJldCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGltZXN5bmNfc3ZjLT5zcGlubG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKK3U2NCBnYl90aW1lc3luY19nZXRfZnJhbWVfdGltZV9ieV9pbnRlcmZhY2Uoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCXN0cnVjdCBnYl90aW1lc3luY19zdmMgKnRpbWVzeW5jX3N2YzsKKwl1NjQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJmdiX3RpbWVzeW5jX3N2Y19saXN0X211dGV4KTsKKwl0aW1lc3luY19zdmMgPSBnYl90aW1lc3luY19maW5kX3RpbWVzeW5jX3N2YyhpbnRlcmZhY2UtPmhkKTsKKwlpZiAoIXRpbWVzeW5jX3N2YykKKwkJZ290byBkb25lOworCisJcmV0ID0gZ2JfdGltZXN5bmNfZ2V0X2ZyYW1lX3RpbWUodGltZXN5bmNfc3ZjKTsKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZnYl90aW1lc3luY19zdmNfbGlzdF9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX3RpbWVzeW5jX2dldF9mcmFtZV90aW1lX2J5X2ludGVyZmFjZSk7CisKK3U2NCBnYl90aW1lc3luY19nZXRfZnJhbWVfdGltZV9ieV9zdmMoc3RydWN0IGdiX3N2YyAqc3ZjKQoreworCXN0cnVjdCBnYl90aW1lc3luY19zdmMgKnRpbWVzeW5jX3N2YzsKKwl1NjQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJmdiX3RpbWVzeW5jX3N2Y19saXN0X211dGV4KTsKKwl0aW1lc3luY19zdmMgPSBnYl90aW1lc3luY19maW5kX3RpbWVzeW5jX3N2YyhzdmMtPmhkKTsKKwlpZiAoIXRpbWVzeW5jX3N2YykKKwkJZ290byBkb25lOworCisJcmV0ID0gZ2JfdGltZXN5bmNfZ2V0X2ZyYW1lX3RpbWUodGltZXN5bmNfc3ZjKTsKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZnYl90aW1lc3luY19zdmNfbGlzdF9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX3RpbWVzeW5jX2dldF9mcmFtZV90aW1lX2J5X3N2Yyk7CisKKy8qIEluY3JlbWVudGFsbHkgdXBkYXRlcyB0aGUgY29udmVyc2lvbiBiYXNlIGZyb20gRnJhbWVUaW1lIHRvIGt0aW1lICovCitzdGF0aWMgdm9pZCBnYl90aW1lc3luY19rdGltZV90aW1lcl9mbih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqdGltZXN5bmNfc3ZjID0KKwkJKHN0cnVjdCBnYl90aW1lc3luY19zdmMgKilkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTY0IGZyYW1lX3RpbWU7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRpbWVzeW5jX3N2Yy0+c3BpbmxvY2ssIGZsYWdzKTsKKworCWlmICh0aW1lc3luY19zdmMtPnN0YXRlICE9IEdCX1RJTUVTWU5DX1NUQVRFX0FDVElWRSkKKwkJZ290byBkb25lOworCisJa3RpbWVfZ2V0X3RzKCZ0cyk7CisJZnJhbWVfdGltZSA9IF9fZ2JfdGltZXN5bmNfZ2V0X2ZyYW1lX3RpbWUodGltZXN5bmNfc3ZjKTsKKwlnYl90aW1lc3luY19zdG9yZV9rdGltZSh0aW1lc3luY19zdmMsIHRzLCBmcmFtZV90aW1lKTsKKworZG9uZToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aW1lc3luY19zdmMtPnNwaW5sb2NrLCBmbGFncyk7CisJbW9kX3RpbWVyKCZ0aW1lc3luY19zdmMtPmt0aW1lX3RpbWVyLAorCQkgIGppZmZpZXMgKyBHQl9USU1FU1lOQ19LVElNRV9VUERBVEUpOworfQorCitpbnQgZ2JfdGltZXN5bmNfdG9fdGltZXNwZWNfYnlfc3ZjKHN0cnVjdCBnYl9zdmMgKnN2YywgdTY0IGZyYW1lX3RpbWUsCisJCQkJICAgc3RydWN0IHRpbWVzcGVjICp0cykKK3sKKwlzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICp0aW1lc3luY19zdmM7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZnYl90aW1lc3luY19zdmNfbGlzdF9tdXRleCk7CisJdGltZXN5bmNfc3ZjID0gZ2JfdGltZXN5bmNfZmluZF90aW1lc3luY19zdmMoc3ZjLT5oZCk7CisJaWYgKCF0aW1lc3luY19zdmMpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBkb25lOworCX0KKwlyZXQgPSBnYl90aW1lc3luY190b190aW1lc3BlYyh0aW1lc3luY19zdmMsIGZyYW1lX3RpbWUsIHRzKTsKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZnYl90aW1lc3luY19zdmNfbGlzdF9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX3RpbWVzeW5jX3RvX3RpbWVzcGVjX2J5X3N2Yyk7CisKK2ludCBnYl90aW1lc3luY190b190aW1lc3BlY19ieV9pbnRlcmZhY2Uoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAorCQkJCQkgdTY0IGZyYW1lX3RpbWUsIHN0cnVjdCB0aW1lc3BlYyAqdHMpCit7CisJc3RydWN0IGdiX3RpbWVzeW5jX3N2YyAqdGltZXN5bmNfc3ZjOworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmZ2JfdGltZXN5bmNfc3ZjX2xpc3RfbXV0ZXgpOworCXRpbWVzeW5jX3N2YyA9IGdiX3RpbWVzeW5jX2ZpbmRfdGltZXN5bmNfc3ZjKGludGVyZmFjZS0+aGQpOworCWlmICghdGltZXN5bmNfc3ZjKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlyZXQgPSBnYl90aW1lc3luY190b190aW1lc3BlYyh0aW1lc3luY19zdmMsIGZyYW1lX3RpbWUsIHRzKTsKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZnYl90aW1lc3luY19zdmNfbGlzdF9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdiX3RpbWVzeW5jX3RvX3RpbWVzcGVjX2J5X2ludGVyZmFjZSk7CisKK3ZvaWQgZ2JfdGltZXN5bmNfaXJxKHN0cnVjdCBnYl90aW1lc3luY19zdmMgKnRpbWVzeW5jX3N2YykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU2NCBzdHJvYmVfdGltZTsKKwlib29sIHN0cm9iZV9pc19waW5nID0gdHJ1ZTsKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisKKwlrdGltZV9nZXRfdHMoJnRzKTsKKwlzdHJvYmVfdGltZSA9IF9fZ2JfdGltZXN5bmNfZ2V0X2ZyYW1lX3RpbWUodGltZXN5bmNfc3ZjKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0aW1lc3luY19zdmMtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlpZiAodGltZXN5bmNfc3ZjLT5zdGF0ZSA9PSBHQl9USU1FU1lOQ19TVEFURV9QSU5HKSB7CisJCWlmICghdGltZXN5bmNfc3ZjLT5jYXB0dXJlX3BpbmcpCisJCQlnb3RvIGRvbmVfbm9sb2c7CisJCXRpbWVzeW5jX3N2Yy0+YXBfcGluZ19mcmFtZV90aW1lID0gc3Ryb2JlX3RpbWU7CisJCWdvdG8gZG9uZV9sb2c7CisJfSBlbHNlIGlmICh0aW1lc3luY19zdmMtPnN0YXRlICE9IEdCX1RJTUVTWU5DX1NUQVRFX1dBSVRfU1ZDKSB7CisJCWdvdG8gZG9uZV9ub2xvZzsKKwl9CisKKwl0aW1lc3luY19zdmMtPnN0cm9iZV9kYXRhW3RpbWVzeW5jX3N2Yy0+c3Ryb2JlXS5mcmFtZV90aW1lID0gc3Ryb2JlX3RpbWU7CisJdGltZXN5bmNfc3ZjLT5zdHJvYmVfZGF0YVt0aW1lc3luY19zdmMtPnN0cm9iZV0udHMgPSB0czsKKworCWlmICgrK3RpbWVzeW5jX3N2Yy0+c3Ryb2JlID09IEdCX1RJTUVTWU5DX01BWF9TVFJPQkVTKSB7CisJCWdiX3RpbWVzeW5jX3NldF9zdGF0ZSh0aW1lc3luY19zdmMsCisJCQkJICAgICAgR0JfVElNRVNZTkNfU1RBVEVfQVVUSE9SSVRBVElWRSk7CisJfQorCXN0cm9iZV9pc19waW5nID0gZmFsc2U7Citkb25lX2xvZzoKKwl0cmFjZV9nYl90aW1lc3luY19pcnEoc3Ryb2JlX2lzX3BpbmcsIHRpbWVzeW5jX3N2Yy0+c3Ryb2JlLAorCQkJICAgICAgR0JfVElNRVNZTkNfTUFYX1NUUk9CRVMsIHN0cm9iZV90aW1lKTsKK2RvbmVfbm9sb2c6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGltZXN5bmNfc3ZjLT5zcGlubG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChnYl90aW1lc3luY19pcnEpOworCitpbnQgX19pbml0IGdiX3RpbWVzeW5jX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGdiX3RpbWVzeW5jX3BsYXRmb3JtX2luaXQoKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigidGltZXN5bmMgcGxhdGZvcm0gaW5pdCBmYWlsIVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJZ2JfdGltZXN5bmNfY2xvY2tfcmF0ZSA9IGdiX3RpbWVzeW5jX3BsYXRmb3JtX2dldF9jbG9ja19yYXRlKCk7CisKKwkvKiBDYWxjdWxhdGUgbmFub3NlY29uZHMgYW5kIGZlbXRvc2Vjb25kcyBwZXIgY2xvY2sgKi8KKwlnYl90aW1lc3luY19mc19wZXJfY2xvY2sgPSBGU0VDX1BFUl9TRUM7CisJZG9fZGl2KGdiX3RpbWVzeW5jX2ZzX3Blcl9jbG9jaywgZ2JfdGltZXN5bmNfY2xvY2tfcmF0ZSk7CisJZ2JfdGltZXN5bmNfbnNfcGVyX2Nsb2NrID0gTlNFQ19QRVJfU0VDOworCWRvX2RpdihnYl90aW1lc3luY19uc19wZXJfY2xvY2ssIGdiX3RpbWVzeW5jX2Nsb2NrX3JhdGUpOworCisJLyogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjbG9ja3Mgd2Ugd2lsbCBjb252ZXJ0IHRvIGt0aW1lICovCisJZ2JfdGltZXN5bmNfbWF4X2t0aW1lX2RpZmYgPQorCQlHQl9USU1FU1lOQ19NQVhfS1RJTUVfQ09OVkVSU0lPTiAqIGdiX3RpbWVzeW5jX2Nsb2NrX3JhdGU7CisKKwlwcl9pbmZvKCJUaW1lLVN5bmMgQCAlbHUgSHogbWF4IGt0aW1lIGNvbnZlcnNpb24gKy8tICVkIHNlY29uZHNcbiIsCisJCWdiX3RpbWVzeW5jX2Nsb2NrX3JhdGUsIEdCX1RJTUVTWU5DX01BWF9LVElNRV9DT05WRVJTSU9OKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBnYl90aW1lc3luY19leGl0KHZvaWQpCit7CisJZ2JfdGltZXN5bmNfcGxhdGZvcm1fZXhpdCgpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvdGltZXN5bmMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3RpbWVzeW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJmYzlhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3RpbWVzeW5jLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIFRpbWVTeW5jIEFQSSBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE2IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKi8KKworI2lmbmRlZiBfX1RJTUVTWU5DX0gKKyNkZWZpbmUgX19USU1FU1lOQ19ICisKK3N0cnVjdCBnYl9zdmM7CitzdHJ1Y3QgZ2JfaW50ZXJmYWNlOworc3RydWN0IGdiX3RpbWVzeW5jX3N2YzsKKworLyogUGxhdGZvcm0gKi8KK3U2NCBnYl90aW1lc3luY19wbGF0Zm9ybV9nZXRfY291bnRlcih2b2lkKTsKK3UzMiBnYl90aW1lc3luY19wbGF0Zm9ybV9nZXRfY2xvY2tfcmF0ZSh2b2lkKTsKK2ludCBnYl90aW1lc3luY19wbGF0Zm9ybV9sb2NrX2J1cyhzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICpwZGF0YSk7Cit2b2lkIGdiX3RpbWVzeW5jX3BsYXRmb3JtX3VubG9ja19idXModm9pZCk7CisKK2ludCBnYl90aW1lc3luY19wbGF0Zm9ybV9pbml0KHZvaWQpOwordm9pZCBnYl90aW1lc3luY19wbGF0Zm9ybV9leGl0KHZvaWQpOworCisvKiBDb3JlIEFQSSAqLworaW50IGdiX3RpbWVzeW5jX2ludGVyZmFjZV9hZGQoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50ZXJmYWNlKTsKK3ZvaWQgZ2JfdGltZXN5bmNfaW50ZXJmYWNlX3JlbW92ZShzdHJ1Y3QgZ2JfaW50ZXJmYWNlICppbnRlcmZhY2UpOworaW50IGdiX3RpbWVzeW5jX3N2Y19hZGQoc3RydWN0IGdiX3N2YyAqc3ZjKTsKK3ZvaWQgZ2JfdGltZXN5bmNfc3ZjX3JlbW92ZShzdHJ1Y3QgZ2Jfc3ZjICpzdmMpOworCit1NjQgZ2JfdGltZXN5bmNfZ2V0X2ZyYW1lX3RpbWVfYnlfaW50ZXJmYWNlKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGVyZmFjZSk7Cit1NjQgZ2JfdGltZXN5bmNfZ2V0X2ZyYW1lX3RpbWVfYnlfc3ZjKHN0cnVjdCBnYl9zdmMgKnN2Yyk7CitpbnQgZ2JfdGltZXN5bmNfdG9fdGltZXNwZWNfYnlfc3ZjKHN0cnVjdCBnYl9zdmMgKnN2YywgdTY0IGZyYW1lX3RpbWUsCisJCQkJICAgc3RydWN0IHRpbWVzcGVjICp0cyk7CitpbnQgZ2JfdGltZXN5bmNfdG9fdGltZXNwZWNfYnlfaW50ZXJmYWNlKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGVyZmFjZSwKKwkJCQkJIHU2NCBmcmFtZV90aW1lLCBzdHJ1Y3QgdGltZXNwZWMgKnRzKTsKKworaW50IGdiX3RpbWVzeW5jX3NjaGVkdWxlX3N5bmNocm9ub3VzKHN0cnVjdCBnYl9pbnRlcmZhY2UgKmludGYpOwordm9pZCBnYl90aW1lc3luY19zY2hlZHVsZV9hc3luY2hyb25vdXMoc3RydWN0IGdiX2ludGVyZmFjZSAqaW50Zik7Cit2b2lkIGdiX3RpbWVzeW5jX2lycShzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICp0aW1lc3luY19zdmMpOworaW50IGdiX3RpbWVzeW5jX2luaXQodm9pZCk7Cit2b2lkIGdiX3RpbWVzeW5jX2V4aXQodm9pZCk7CisKKyNlbmRpZiAvKiBfX1RJTUVTWU5DX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3RpbWVzeW5jX3BsYXRmb3JtLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy90aW1lc3luY19wbGF0Zm9ybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExM2YzZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy90aW1lc3luY19wbGF0Zm9ybS5jCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBUaW1lU3luYyBBUEkgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNiBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICoKKyAqIFRoaXMgY29kZSByZWFkcyBkaXJlY3RseSBmcm9tIGFuIEFSTXY3IG1lbW9yeS1tYXBwZWQgdGltZXIgdGhhdCBsaXZlcyBpbgorICogTU1JTyBzcGFjZS4gU2luY2UgdGhpcyBjb3VudGVyIGxpdmVzIGluc2lkZSBvZiBNTUlPIHNwYWNlIGl0cyBzaGFyZWQgYmV0d2VlbgorICogY29yZXMgYW5kIHRoYXQgbWVhbnMgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBpc3N1ZXMgbGlrZSBUU0Mgb24geDg2CisgKiB3aGVyZSBlYWNoIHRpbWUtc3RhbXAtY291bnRlciAoVFNDKSBpcyBsb2NhbCB0byBhIHBhcnRpY3VsYXIgY29yZS4KKyAqCisgKiBSZWdpc3Rlci1sZXZlbCBhY2Nlc3MgY29kZSBpcyBiYXNlZCBvbgorICogZHJpdmVycy9jbG9ja3NvdXJjZS9hcm1fYXJjaF90aW1lci5jCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKworI2luY2x1ZGUgImdyZXlidXMuaCIKKyNpbmNsdWRlICJhcmNoZV9wbGF0Zm9ybS5oIgorCisjZGVmaW5lIERFRkFVTFRfRlJBTUVUSU1FX0NMT0NLX0haIDE5MjAwMDAwCisKK3N0YXRpYyB1MzIgZ2JfdGltZXN5bmNfY2xvY2tfZnJlcXVlbmN5OworaW50ICgqYXJjaGVfcGxhdGZvcm1fY2hhbmdlX3N0YXRlX2NiKShlbnVtIGFyY2hlX3BsYXRmb3JtX3N0YXRlIHN0YXRlLAorCQkJCSAgICAgIHN0cnVjdCBnYl90aW1lc3luY19zdmMgKnBkYXRhKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGFyY2hlX3BsYXRmb3JtX2NoYW5nZV9zdGF0ZV9jYik7CisKK3U2NCBnYl90aW1lc3luY19wbGF0Zm9ybV9nZXRfY291bnRlcih2b2lkKQoreworCXJldHVybiAodTY0KWdldF9jeWNsZXMoKTsKK30KKwordTMyIGdiX3RpbWVzeW5jX3BsYXRmb3JtX2dldF9jbG9ja19yYXRlKHZvaWQpCit7CisJaWYgKHVubGlrZWx5KCFnYl90aW1lc3luY19jbG9ja19mcmVxdWVuY3kpKSB7CisJCWdiX3RpbWVzeW5jX2Nsb2NrX2ZyZXF1ZW5jeSA9IGNwdWZyZXFfZ2V0KDApOworCQlpZiAoIWdiX3RpbWVzeW5jX2Nsb2NrX2ZyZXF1ZW5jeSkKKwkJCWdiX3RpbWVzeW5jX2Nsb2NrX2ZyZXF1ZW5jeSA9IERFRkFVTFRfRlJBTUVUSU1FX0NMT0NLX0haOworCX0KKworCXJldHVybiBnYl90aW1lc3luY19jbG9ja19mcmVxdWVuY3k7Cit9CisKK2ludCBnYl90aW1lc3luY19wbGF0Zm9ybV9sb2NrX2J1cyhzdHJ1Y3QgZ2JfdGltZXN5bmNfc3ZjICpwZGF0YSkKK3sKKwlyZXR1cm4gYXJjaGVfcGxhdGZvcm1fY2hhbmdlX3N0YXRlX2NiKEFSQ0hFX1BMQVRGT1JNX1NUQVRFX1RJTUVfU1lOQywKKwkJCQkJICAgICAgcGRhdGEpOworfQorCit2b2lkIGdiX3RpbWVzeW5jX3BsYXRmb3JtX3VubG9ja19idXModm9pZCkKK3sKKwlhcmNoZV9wbGF0Zm9ybV9jaGFuZ2Vfc3RhdGVfY2IoQVJDSEVfUExBVEZPUk1fU1RBVEVfQUNUSVZFLCBOVUxMKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYXJjaF90aW1lcl9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgICA9ICJnb29nbGUsZ3JleWJ1cy1mcmFtZS10aW1lLWNvdW50ZXIiLCB9LAorCXt9LAorfTsKKworaW50IF9faW5pdCBnYl90aW1lc3luY19wbGF0Zm9ybV9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKworCW5wID0gb2ZfZmluZF9tYXRjaGluZ19ub2RlKE5VTEwsIGFyY2hfdGltZXJfb2ZfbWF0Y2gpOworCWlmICghbnApIHsKKwkJLyogVG9sZXJhdGUgbm90IGZpbmRpbmcgdG8gYWxsb3cgQkJCIGV0YyB0byBjb250aW51ZSAqLworCQlwcl93YXJuKCJVbmFibGUgdG8gZmluZCBhIGNvbXBhdGlibGUgQVJNdjcgdGltZXJcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJjbG9jay1mcmVxdWVuY3kiLAorCQkJCSAmZ2JfdGltZXN5bmNfY2xvY2tfZnJlcXVlbmN5KSkgeworCQlwcl9lcnIoIlVuYWJsZSB0byBmaW5kIHRpbWVyIGNsb2NrLWZyZXF1ZW5jeVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIGdiX3RpbWVzeW5jX3BsYXRmb3JtX2V4aXQodm9pZCkge30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3Rvb2xzLy5naXRpZ25vcmUgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy90b29scy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMzY1NGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy90b29scy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKK2xvb3BiYWNrX3Rlc3QKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3Rvb2xzL0FuZHJvaWQubWsgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy90b29scy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYWRiZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy90b29scy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTAgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gbG9vcGJhY2tfdGVzdC5jCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFIDo9IGdiX2xvb3BiYWNrX3Rlc3QKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3Rvb2xzL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvdG9vbHMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUyYjEyYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3Rvb2xzL01ha2VmaWxlCkBAIC0wLDAgKzEsMzEgQEAKK2lmZXEgKCQoc3RyaXAgJChWKSksIDEpCisgIFEgPQorZWxzZQorICBRID0gQAorZW5kaWYKKworQ0ZMQUdTCSs9IC1zdGQ9Z251OTkgLVdhbGwgLVdleHRyYSAtZyBcCisJICAgIC1EX0dOVV9TT1VSQ0UgXAorCSAgICAtV25vLXVudXNlZC1wYXJhbWV0ZXIgXAorCSAgICAtV21heWJlLXVuaW5pdGlhbGl6ZWQgXAorCSAgICAtV3JlZHVuZGFudC1kZWNscyBcCisJICAgIC1XY2FzdC1hbGlnbiBcCisJICAgIC1Xc2lnbi1jb21wYXJlIFwKKwkgICAgLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycworCitDQwk6PSAkKENST1NTX0NPTVBJTEUpZ2NjCisKK1RPT0xTID0gbG9vcGJhY2tfdGVzdAorCithbGw6ICQoVE9PTFMpCisKKyUubzogJS5jIC4uL2dyZXlidXNfcHJvdG9jb2xzLmgKKwlAZWNobyAnICBUQVJHRVRfQ0MgJEAnCisJJChRKSQoQ0MpICQoQ0ZMQUdTKSAtYyAkPCAtbyAkQAorCitsb29wYmFja18lOiBsb29wYmFja18lLm8KKwlAZWNobyAnICBUQVJHRVRfTEQgJEAnCisJJChRKSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpICReIC1vICRACisKK2NsZWFuOjoKKwlybSAtZiAqLm8gJChUT09MUykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3Rvb2xzL1JFQURNRS5sb29wYmFjayBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3Rvb2xzL1JFQURNRS5sb29wYmFjawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDViMDhkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvdG9vbHMvUkVBRE1FLmxvb3BiYWNrCkBAIC0wLDAgKzEsMTk4IEBACisKKworICAgICAgICAxIC0gTE9PUEJBQ0sgRFJJVkVSCisKK1RoZSBkcml2ZXIgaW1wbGVtZW50cyB0aGUgbWFpbiBsb2dpYyBvZiB0aGUgbG9vcGJhY2sgdGVzdCBhbmQgcHJvdmlkZXMKK3N5c2ZzIGZpbGVzIHRvIGNvbmZpZ3VyZSB0aGUgdGVzdCBhbmQgcmV0cmlldmUgdGhlIHJlc3VsdHMuCitBIHVzZXIgY291bGQgcnVuIGEgdGVzdCB3aXRob3V0IHRoZSBuZWVkIG9mIHRoZSB0ZXN0IGFwcGxpY2F0aW9uIGdpdmVuCit0aGF0IGhlIHVuZGVyc3RhbmRzIHRoZSBzeXNmcyBpbnRlcmZhY2Ugb2YgdGhlIGxvb3BiYWNrIGRyaXZlci4KKworVGhlIGxvb3BiYWNrIGtlcm5lbCBkcml2ZXIgbmVlZHMgdG8gYmUgbG9hZGVkIGFuZCBhdCBsZWFzdCBvbmUgbW9kdWxlCit3aXRoIHRoZSBsb29wYmFjayBmZWF0dXJlIGVuYWJsZWQgbXVzdCBiZSBwcmVzZW50IGZvciB0aGUgc3lzZnMgZmlsZXMgdG8gYmUKK2NyZWF0ZWQgYW5kIGZvciB0aGUgbG9vcGJhY2sgdGVzdCBhcHBsaWNhdGlvbiB0byBiZSBhYmxlIHRvIHJ1bi4KKworVG8gbG9hZCB0aGUgbW9kdWxlOgorIyBtb2Rwcm9iZSBnYi1sb29wYmFjaworCisKK1doZW4gdGhlIG1vZHVsZSBpcyBwcm9iZWQsICBOZXcgZmlsZXMgYXJlIGF2YWlsYWJsZSBvbiB0aGUgc3lzZnMKK2RpcmVjdG9yeSBvZiB0aGUgZGV0ZWN0ZWQgbG9vcGJhY2sgZGV2aWNlLgorKHR5cGljYWxseSB1bmRlciAiL3N5cy9idXMvZ3JheWJ1cy9kZXZpY2VzIikuCisKK0hlcmUgaXMgYSBzaG9ydCBzdW1tYXJ5IG9mIHRoZSBzeXNmcyBpbnRlcmZhY2UgZmlsZXMgdGhhdCBzaG91bGQgYmUgdmlzaWJsZToKKworKiBMb29wYmFjayBDb25maWd1cmF0aW9uIEZpbGVzOgorICAgIGFzeW5jIC0gVXNlIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLgorICAgIGl0ZXJhdGlvbl9tYXggLSBOdW1iZXIgb2YgdGVzdHMgaXRlcmF0aW9ucyB0byBwZXJmb3JtLgorICAgIHNpemUgLSBwYXlsb2FkIHNpemUgb2YgdGhlIHRyYW5zZmVyLgorICAgIHRpbWVvdXQgLSBUaGUgbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcyB0byBnaXZlIGFuIGluZGl2aWR1YWwKKyAgICAgICAgICAgICAgYXN5bmNocm9ub3VzIHJlcXVlc3QgYmVmb3JlIHRpbWluZyBvdXQuCisgICAgdXNfd2FpdCAtIFRpbWUgdG8gd2FpdCBiZXR3ZWVuIDIgbWVzc2FnZXMKKyAgICB0eXBlIC0gQnkgd3JpdGluZyB0aGUgdGVzdCB0eXBlIHRvIHRoaXMgZmlsZSwgdGhlIHRlc3Qgc3RhcnRzLgorICAgICAgICAgICBWYWxpZCB0ZXN0cyBhcmU6CisgICAgICAgICAgICAgMCBzdG9wIHRoZSB0ZXN0CisgICAgICAgICAgICAgMiAtIHBpbmcKKyAgICAgICAgICAgICAzIC0gdHJhbnNmZXIKKyAgICAgICAgICAgICA0IC0gc2luaworCisqIExvb3BiYWNrIGZlZWRiYWNrIGZpbGVzOgorICAgIGVycm9yIC0gbnVtYmVyIG9mIGVycm9ycyB0aGF0IGhhdmUgb2NjdXJyZWQuCisgICAgaXRlcmF0aW9uX2NvdW50IC0gTnVtYmVyIG9mIGl0ZXJhdGlvbnMgcGVyZm9ybWVkLgorICAgIHJlcXVlc3RzX2NvbXBsZXRlZCAtIE51bWJlciBvZiByZXF1ZXN0cyBzdWNjZXNzZnVsbHkgY29tcGxldGVkLgorICAgIHJlcXVlc3RzX3RpbWVkb3V0IC0gTnVtYmVyIG9mIHJlcXVlc3RzIHRoYXQgaGF2ZSB0aW1lZCBvdXQuCisgICAgdGltZW91dF9tYXggLSBNYXggYWxsb3dlZCB0aW1lb3V0CisgICAgdGltZW91dF9taW4gLSBNaW4gYWxsb3dlZCB0aW1lb3V0LgorCisqIExvb3BiYWNrIHJlc3VsdCBmaWxlczoKKyAgICBhcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9hdmcKKyAgICBhcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9tYXgKKyAgICBhcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9taW4KKyAgICBncGJyaWRnZV9maXJtd2FyZV9sYXRlbmN5X2F2ZworICAgIGdwYnJpZGdlX2Zpcm13YXJlX2xhdGVuY3lfbWF4CisgICAgZ3BicmlkZ2VfZmlybXdhcmVfbGF0ZW5jeV9taW4KKyAgICByZXF1ZXN0c19wZXJfc2Vjb25kX2F2ZworICAgIHJlcXVlc3RzX3Blcl9zZWNvbmRfbWF4CisgICAgcmVxdWVzdHNfcGVyX3NlY29uZF9taW4KKyAgICBsYXRlbmN5X2F2ZworICAgIGxhdGVuY3lfbWF4CisgICAgbGF0ZW5jeV9taW4KKyAgICB0aHJvdWdocHV0X2F2ZworICAgIHRocm91Z2hwdXRfbWF4CisgICAgdGhyb3VnaHB1dF9taW4KKworCisKKyAgICAgICAgICAgIDIgLSBMT09QQkFDSyBURVNUIEFQUExJQ0FUSU9OCisKK1RoZSBsb29wYmFjayB0ZXN0IGFwcGxpY2F0aW9uIG1hbmFnZXMgYW5kIGZvcm1hdHMgdGhlIHJlc3VsdHMgcHJvdmlkZWQgYnkKK3RoZSBsb29wYmFjayBrZXJuZWwgbW9kdWxlLiBUaGUgcHVycG9zZSBvZiB0aGlzIGFwcGxpY2F0aW9uCitpcyB0bzoKKyAgICAtIFN0YXJ0IGFuZCBtYW5hZ2UgbXVsdGlwbGUgbG9vcGJhY2sgZGV2aWNlIHRlc3RzIGNvbmN1cnJlbnRseS4KKyAgICAtIENhbGN1bGF0ZSB0aGUgYWdncmVnYXRlIHJlc3VsdHMgZm9yIG11bHRpcGxlIGRldmljZXMuCisgICAgLSBHYXRoZXIgYW5kIGZvcm1hdCB0ZXN0IHJlc3VsdHMgKGNzdiBvciBodW1hbiByZWFkYWJsZSkuCisKK1RoZSBiZXN0IHdheSB0byBnZXQgdXAgdG8gZGF0ZSB1c2FnZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGFwcGxpY2F0aW9uIGlzCit1c3VhbGx5IHRvIHBhc3MgdGhlICItaCIgcGFyYW1ldGVyLgorSGVyZSBpcyB0aGUgc3VtbWFyeSBvZiB0aGUgYXZhaWxhYmxlIG9wdGlvbnM6CisKKyBNYW5kYXRvcnkgYXJndW1lbnRzCisgICAtdCAgICAgbXVzdCBiZSBvbmUgb2YgdGhlIHRlc3QgbmFtZXMgLSBzaW5rLCB0cmFuc2ZlciBvciBwaW5nCisgICAtaSAgICAgaXRlcmF0aW9uIGNvdW50IC0gdGhlIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIHJ1biB0aGUgdGVzdCBvdmVyCisgT3B0aW9uYWwgYXJndW1lbnRzCisgICAtUyAgICAgc3lzZnMgbG9jYXRpb24gLSBsb2NhdGlvbiBmb3IgZ3JleWJ1cyAnZW5kbycgZW50aXJlcyBkZWZhdWx0IC9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy8KKyAgIC1EICAgICBkZWJ1Z2ZzIGxvY2F0aW9uIC0gbG9jYXRpb24gZm9yIGxvb3BiYWNrIGRlYnVnZnMgZW50cmllcyBkZWZhdWx0IC9zeXMva2VybmVsL2RlYnVnL2diX2xvb3BiYWNrLworICAgLXMgICAgIHNpemUgb2YgZGF0YSBwYWNrZXQgdG8gc2VuZCBkdXJpbmcgdGVzdCAtIGRlZmF1bHRzIHRvIHplcm8KKyAgIC1tICAgICBtYXNrIC0gYSBiaXQgbWFzayBvZiBjb25uZWN0aW9ucyB0byBpbmNsdWRlIGV4YW1wbGU6IC1tIDggPSA0dGggY29ubmVjdGlvbiAtbSA5ID0gMXN0IGFuZCA0dGggY29ubmVjdGlvbiBldGMKKyAgICAgICAgICAgICAgICAgZGVmYXVsdCBpcyB6ZXJvIHdoaWNoIG1lYW5zIGJyb2FkY2FzdCB0byBhbGwgY29ubmVjdGlvbnMKKyAgIC12ICAgICB2ZXJib3NlIG91dHB1dAorICAgLWQgICAgIGRlYnVnIG91dHB1dAorICAgLXIgICAgIHJhdyBkYXRhIG91dHB1dCAtIHdoZW4gc3BlY2lmaWVkIHRoZSBmdWxsIGxpc3Qgb2YgbGF0ZW5jeSB2YWx1ZXMgYXJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgQ1NWCisgICAtcCAgICAgcG9yY2VsYWluIC0gd2hlbiBzcGVjaWZpZWQgcHJpbnRvdXQgaXMgaW4gYSB1c2VyLWZyaWVuZGx5IG5vbi1DU1YgZm9ybWF0LiBUaGlzIG9wdGlvbiBzdXBwcmVzc2VzIHdyaXRpbmcgdG8gQ1NWIGZpbGUKKyAgIC1hICAgICBhZ2dyZWdhdGUgLSBzaG93IGFnZ3JlZ2F0aW9uIG9mIGFsbCBlbmFibGVkIGRldmllcworICAgLWwgICAgIGxpc3QgZm91bmQgbG9vcGJhY2sgZGV2aWNlcyBhbmQgZXhpdC4KKyAgIC14ICAgICBBc3luYyAtIEVuYWJsZSBhc3luYyB0cmFuc2ZlcnMuCisgICAtbyAgICAgVGltZW91dCAtIFRpbWVvdXQgaW4gbWljcm9zZWNvbmRzIGZvciBhc3luYyBvcGVyYXRpb25zLgorCisKKworICAgICAgICAgICAgIDMgLSBSRUFMIFdPUkxEIEVYQU1QTEUgVVNBR0VTCisKKyAzLjEgLSBVc2luZyB0aGUgZHJpdmVyIHN5c2ZzIGZpbGVzIHRvIHJ1biBhIHRlc3Qgb24gYSBzaW5nbGUgZGV2aWNlOgorCisqIFJ1biBhIDEwMDAgdHJhbnNmZXJzIG9mIGEgMTAwIGJ5dGUgcGFja2V0LiBFYWNoIHRyYW5zZmVyIGlzIHN0YXJ0ZWQgb25seQorYWZ0ZXIgdGhlIHByZXZpb3VzIG9uZSBmaW5pc2hlZCBzdWNjZXNzZnVsbHk6CisgICAgZWNobyAwID4gL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMi4xNy90eXBlCisgICAgZWNobyAwID4gL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMi4xNy9hc3luYworICAgIGVjaG8gMjAwMCA+IC9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy8xLTIuMTcvdXNfd2FpdAorICAgIGVjaG8gMTAwID4gL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMi4xNy9zaXplCisgICAgZWNobyAxMDAwID4gL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMi4xNy9pdGVyYXRpb25fbWF4CisgICAgZWNobyAwID4gL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMi4xNy9tYXNrCisgICAgZWNobyAyMDAwMDAgPiAvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvMS0yLjE3L3RpbWVvdXQKKyAgICBlY2hvIDMgPiAvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvMS0yLjE3L3R5cGUKKworKiBSdW4gYSAxMDAwIHRyYW5zZmVycyBvZiBhIDEwMCBieXRlIHBhY2tldC4gVHJhbnNmZXJzIGFyZSBzdGFydGVkIHdpdGhvdXQKK3dhaXRpbmcgZm9yIHRoZSBwcmV2aW91cyBvbmUgdG8gZmluaXNoOgorICAgIGVjaG8gMCA+IC9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy8xLTIuMTcvdHlwZQorICAgIGVjaG8gMyA+IC9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy8xLTIuMTcvYXN5bmMKKyAgICBlY2hvIDAgPiAvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvMS0yLjE3L3VzX3dhaXQKKyAgICBlY2hvIDEwMCA+IC9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy8xLTIuMTcvc2l6ZQorICAgIGVjaG8gMTAwMCA+IC9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy8xLTIuMTcvaXRlcmF0aW9uX21heAorICAgIGVjaG8gMCA+IC9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy8xLTIuMTcvbWFzaworICAgIGVjaG8gMjAwMDAwID4gL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMi4xNy90aW1lb3V0CisgICAgZWNobyAzID4gL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMi4xNy90eXBlCisKKyogUmVhZCB0aGUgcmVzdWx0cyBmcm9tIHN5c2ZzOgorICAgIGNhdCAvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvMS0yLjE3L3JlcXVlc3RzX3Blcl9zZWNvbmRfbWluCisgICAgY2F0IC9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy8xLTIuMTcvcmVxdWVzdHNfcGVyX3NlY29uZF9tYXgKKyAgICBjYXQgL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMi4xNy9yZXF1ZXN0c19wZXJfc2Vjb25kX2F2ZworCisgICAgY2F0IC9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy8xLTIuMTcvbGF0ZW5jeV9taW4KKyAgICBjYXQgL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMi4xNy9sYXRlbmN5X21heAorICAgIGNhdCAvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvMS0yLjE3L2xhdGVuY3lfYXZnCisKKyAgICBjYXQgL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMi4xNy9hcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9taW4KKyAgICBjYXQgL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMi4xNy9hcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9tYXgKKyAgICBjYXQgL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMi4xNy9hcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9hdmcKKworICAgIGNhdCAvc3lzL2J1cy9ncmV5YnVzL2RldmljZXMvMS0yLjE3L2dwYnJpZGdlX2Zpcm13YXJlX2xhdGVuY3lfbWluCisgICAgY2F0IC9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy8xLTIuMTcvZ3BicmlkZ2VfZmlybXdhcmVfbGF0ZW5jeV9tYXgKKyAgICBjYXQgL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMi4xNy9ncGJyaWRnZV9maXJtd2FyZV9sYXRlbmN5X2F2ZworCisgICAgY2F0IC9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy8xLTIuMTcvZXJyb3IKKyAgICBjYXQgL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMi4xNy9yZXF1ZXN0c19jb21wbGV0ZWQKKyAgICBjYXQgL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLzEtMi4xNy9yZXF1ZXN0c190aW1lZG91dAorCisKKzMuMiAtIHVzaW5nIHRoZSB0ZXN0IGFwcGxpY2F0aW9uOgorCisqIFJ1biBhIHRyYW5zZmVyIHRlc3QgMTAgaXRlcmF0aW9ucyBvZiBzaXplIDEwMCBieXRlcyBvbiBhbGwgYXZhaWxhYmxlIGRldmljZXMKKyAgICAjL2xvb3BiYWNrX3Rlc3QgLXQgdHJhbnNmZXIgLWkgMTAgLXMgMTAwCisgICAgMTk3MC0xLTEgMDoxMDo3LHRyYW5zZmVyLDEtNC4xNywxMDAsMTAsMCw0NDMsNTA5LDQ3MS43MDAwMTIsNjYsMTk2MywyMjU2LDIxMjQuNjAwMDk4LDI5MywxMDI3NzYsMTE4MDg4LDEwOTMxOC44OTg0MzgsMTUzMTIsMTYyMCwxOTk4LDE4OTQuMDk5OTc2LDM3OCw1Niw1Nyw1Ni43OTk5OTksMQorICAgIDE5NzAtMS0xIDA6MTA6Nyx0cmFuc2ZlciwxLTUuMTcsMTAwLDEwLDAsMzk5LDU0Miw0NjMuMzk5OTk0LDE0MywxODQ1LDI1MDUsMjE3NS44MDAwNDksNjYwLDkyNTY4LDEyNTc0NCwxMDczOTMuMjk2ODc1LDMzMTc2LDE0NjksMjMwNSwxODA2LjUwMDAwMCw4MzYsNTYsNTcsNTYuNzk5OTk5LDEKKworCisqIFNob3cgdGhlIGFnZ3JlZ2F0ZSByZXN1bHRzIG9mIGJvdGggZGV2aWNlcy4gKCItYSIpCisgICAgIy9sb29wYmFja190ZXN0IC10IHRyYW5zZmVyIC1pIDEwIC1zIDEwMCAgLWEKKyAgICAxOTcwLTEtMSAwOjEwOjM1LHRyYW5zZmVyLDEtNC4xNywxMDAsMTAsMCw0NDgsNTgwLDQ5NC4xMDAwMDYsMTMyLDE3MjIsMjIzMCwyMDM5LjQwMDAyNCw1MDgsMTAzOTM2LDEzNDU2MCwxMTQ1MTUuNzAzMTI1LDMwNjI0LDE1MTMsMTk4MCwxODA2LjkwMDAyNCw0NjcsNTYsNTcsNTcuMjk5OTk5LDEKKyAgICAxOTcwLTEtMSAwOjEwOjM1LHRyYW5zZmVyLDEtNS4xNywxMDAsMTAsMCwzODMsNTU4LDQ3OC42MDAwMDYsMTc1LDE3OTEsMjYwNiwyMTE1LjE5OTk1MSw4MTUsODg4NTYsMTI5NDU2LDExMDkxOS43MDMxMjUsNDA2MDAsMTQ1NywyMjQ2LDE3NzMuNTk5OTc2LDc4OSw1Niw1Nyw1Ny4wOTk5OTgsMQorICAgIDE5NzAtMS0xIDA6MTA6MzUsdHJhbnNmZXIsYWdncmVnYXRlLDEwMCwxMCwwLDM4Myw1ODAsNDg2LjAwMDAwMCwxOTcsMTcyMiwyNjA2LDIwNzcuMDAwMDAwLDg4NCw4ODg1NiwxMzQ1NjAsMTEyNzE3LjAwMDAwMCw0NTcwNCwxNDU3LDIyNDYsMTc4OS4wMDAwMDAsNzg5LDU2LDU3LDU3LjAwMDAwMCwxCisKKyogRXhhbXBsZSB1c2FnZSBvZiB0aGUgbWFzayBvcHRpb24gdG8gc2VsZWN0IHdoaWNoIGRldmljZXMgd2lsbAorICBydW4gdGhlIHRlc3QgKDFzdCwgMm5kLCBvciBib3RoIGRldmljZXMpOgorICAgICMgL2xvb3BiYWNrX3Rlc3QgLXQgdHJhbnNmZXIgLWkgMTAgLXMgMTAwIC1tIDEKKyAgICAxOTcwLTEtMSAwOjExOjU2LHRyYW5zZmVyLDEtNC4xNywxMDAsMTAsMCw1MTQsNTU4LDU0NC45MDAwMjQsNDQsMTc5MSwxOTQzLDE4MzYuNTk5OTc2LDE1MiwxMTkyNDgsMTI5NDU2LDEyNjMwMS4yOTY4NzUsMTAyMDgsMTYwMCwxMDAxNjA5LDEwMTYxMy42MDE1NjIsMTAwMDAwOSw1Niw1Nyw1Ni45MDAwMDIsMQorICAgICMgL2xvb3BiYWNrX3Rlc3QgLXQgdHJhbnNmZXIgLWkgMTAgLXMgMTAwIC1tIDIKKyAgICAxOTcwLTEtMSAwOjEyOjAsdHJhbnNmZXIsMS01LjE3LDEwMCwxMCwwLDQ2OCw1NTQsNTM5LjAwMDAwMCw4NiwxODA0LDIxMzQsMTg1OS41MDAwMDAsMzMwLDEwODU3NiwxMjg1MjgsMTI0OTMyLjUwMDAwMCwxOTk1MiwxNjA2LDE2MjYsMTYxOS4zMDAwNDksMjAsNTYsNTcsNTcuNDAwMDAyLDEKKyAgICAjIC9sb29wYmFja190ZXN0IC10IHRyYW5zZmVyIC1pIDEwIC1zIDEwMCAtbSAzCisgICAgMTk3MC0xLTEgMDoxMjozLHRyYW5zZmVyLDEtNC4xNywxMDAsMTAsMCw0MzIsNTEwLDQ2OS4zOTk5OTQsNzgsMTk1OSwyMzEzLDIxMzUuODAwMDQ5LDM1NCwxMDAyMjQsMTE4MzIwLDEwODc4NS4yOTY4NzUsMTgwOTYsMTYxMCwyMDI0LDE4OTMuNTAwMDAwLDQxNCw1Niw1Nyw1Ny4yMDAwMDEsMQorICAgIDE5NzAtMS0xIDA6MTI6Myx0cmFuc2ZlciwxLTUuMTcsMTAwLDEwLDAsNDA0LDU0Miw0NjguNzk5OTg4LDEzOCwxODQzLDI0NzIsMjE1Mi41MDAwMDAsNjI5LDkzNzI4LDEyNTc0NCwxMDg2NDYuMTAxNTYyLDMyMDE2LDE1MDQsMjI0NywxODUzLjA5OTk3Niw3NDMsNTYsNTcsNTcuMDk5OTk4LDEKKworKiBTaG93IG91dHB1dCBpbiBodW1hbiByZWFkYWJsZSBmb3JtYXQgKCItcCIpCisgICAgIyAvbG9vcGJhY2tfdGVzdCAtdCB0cmFuc2ZlciAtaSAxMCAtcyAxMDAgLW0gMyAtcAorCisgICAgMTk3MC0xLTEgMDoxMjozNworICAgIHRlc3Q6ICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlcgorICAgIHBhdGg6ICAgICAgICAgICAgICAgICAgICAgICAxLTQuMTcKKyAgICBzaXplOiAgICAgICAgICAgICAgICAgICAgICAgMTAwCisgICAgaXRlcmF0aW9uczogICAgICAgICAgICAgICAgIDEwCisgICAgZXJyb3JzOiAgICAgICAgICAgICAgICAgICAgIDAKKyAgICBhc3luYzogICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZWQKKyAgICByZXF1ZXN0cyBwZXItc2VjOiAgICAgICAgICAgbWluPTM5MCwgbWF4PTU0NywgYXZlcmFnZT00NjkuMjk5OTg4LCBqaXR0ZXI9MTU3CisgICAgYXAtdGhyb3VnaHB1dCBCL3M6ICAgICAgICAgIG1pbj05MDQ4MCBtYXg9MTI2OTA0IGF2ZXJhZ2U9MTA4NzYyLjEwMTU2MiBqaXR0ZXI9MzY0MjQKKyAgICBhcC1sYXRlbmN5IHVzZWM6ICAgICAgICAgICAgbWluPTE4MjYgbWF4PTI1NjAgYXZlcmFnZT0yMTQ2LjAwMDAwMCBqaXR0ZXI9NzM0CisgICAgYXBicmlkZ2UtbGF0ZW5jeSB1c2VjOiAgICAgIG1pbj0xNjIwIG1heD0xOTgyIGF2ZXJhZ2U9MTg4Mi4wOTk5NzYgaml0dGVyPTM2MgorICAgIGdwYnJpZGdlLWxhdGVuY3kgdXNlYzogICAgICBtaW49NTYgbWF4PTU3IGF2ZXJhZ2U9NTcuMDk5OTk4IGppdHRlcj0xCisKKworICAgIDE5NzAtMS0xIDA6MTI6MzcKKyAgICB0ZXN0OiAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXIKKyAgICBwYXRoOiAgICAgICAgICAgICAgICAgICAgICAgMS01LjE3CisgICAgc2l6ZTogICAgICAgICAgICAgICAgICAgICAgIDEwMAorICAgIGl0ZXJhdGlvbnM6ICAgICAgICAgICAgICAgICAxMAorICAgIGVycm9yczogICAgICAgICAgICAgICAgICAgICAwCisgICAgYXN5bmM6ICAgICAgICAgICAgICAgICAgICAgIERpc2FibGVkCisgICAgcmVxdWVzdHMgcGVyLXNlYzogICAgICAgICAgIG1pbj0zOTcsIG1heD01MzgsIGF2ZXJhZ2U9NDYxLjcwMDAxMiwgaml0dGVyPTE0MQorICAgIGFwLXRocm91Z2hwdXQgQi9zOiAgICAgICAgICBtaW49OTIxMDQgbWF4PTEyNDgxNiBhdmVyYWdlPTEwNjk5OC44OTg0Mzggaml0dGVyPTMyNzEyCisgICAgYXAtbGF0ZW5jeSB1c2VjOiAgICAgICAgICAgIG1pbj0xODU2IG1heD0yNTE0IGF2ZXJhZ2U9MjE4NS42OTk5NTEgaml0dGVyPTY1OAorICAgIGFwYnJpZGdlLWxhdGVuY3kgdXNlYzogICAgICBtaW49MTQ2MCBtYXg9MjI5NiBhdmVyYWdlPTE4MjguNTk5OTc2IGppdHRlcj04MzYKKyAgICBncGJyaWRnZS1sYXRlbmN5IHVzZWM6ICAgICAgbWluPTU2IG1heD01NyBhdmVyYWdlPTU3LjA5OTk5OCBqaXR0ZXI9MQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvdG9vbHMvbGJ0ZXN0IGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvdG9vbHMvbGJ0ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ3MzUzZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy90b29scy9sYnRlc3QKQEAgLTAsMCArMSwxNjggQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCisjIENvcHlyaWdodCAoYykgMjAxNSBHb29nbGUsIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE1IExpbmFybywgTHRkLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyMgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorIyB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisjIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vciB0aGUgbmFtZXMgb2YgaXRzCisjIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKKyMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorIyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyMgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorIyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyMgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorIyBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKKyMgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisjIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCisjIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKKyMgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2ltcG9ydCBjc3YKK2ltcG9ydCBkYXRldGltZQoraW1wb3J0IHN5cworaW1wb3J0IHRpbWUKKworZGljdCA9IHsncGluZyc6ICcyJywgJ3RyYW5zZmVyJzogJzMnLCAnc2luayc6ICc0J30KK3ZlcmJvc2UgPSAxCisKK2RlZiBhYm9ydCgpOgorCXN5cy5leGl0KDEpCisKK2RlZiB1c2FnZSgpOgorCXByaW50KCdVc2FnZTogbG9vcHRlc3QgVEVTVCBTSVpFIElURVJBVElPTlMgUEFUSFxuXG4nCisJJyAgUnVuIFRFU1QgZm9yIGEgbnVtYmVyIG9mIElURVJBVElPTlMgd2l0aCBvcGVyYXRpb24gZGF0YSBTSVpFIGJ5dGVzXG4nCisJJyAgVEVTVCBtYXkgYmUgXCdwaW5nXCcgXCd0cmFuc2ZlclwnIG9yIFwnc2lua1wnXG4nCisJJyAgU0laRSBpbmRpY2F0ZXMgdGhlIHNpemUgb2YgdHJhbnNmZXIgPD0gZ3JleWJ1cyBtYXggcGF5bG9hZCBieXRlc1xuJworCScgIElURVJBVElPTlMgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgdGltZXMgdG8gZXhlY3V0ZSBURVNUIGF0IFNJWkUgYnl0ZXNcbicKKwknICAgICAgICAgICAgIE5vdGUgaWYgSVRFUkFUSU9OUyBpcyBzZXQgdG8gemVybyB0aGVuIHRoaXMgdXRpbGl0eSB3aWxsXG4nCisJJyAgICAgICAgICAgICBpbml0aWF0ZSBhbiBpbmZpbml0ZSAobm9uIHRlcm1pbmF0aW5nKSB0ZXN0IGFuZCBleGl0XG4nCisJJyAgICAgICAgICAgICB3aXRob3V0IGxvZ2dpbmcgYW55IG1ldHJpY3MgZGF0YVxuJworCScgIFBBVEggaW5kaWNhdGVzIHRoZSBzeXNmcyBwYXRoIGZvciB0aGUgbG9vcGJhY2sgZ3JleWJ1cyBlbnRyaWVzIGUuZy5cbicKKwknICAgICAgICAgICAgIC9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy9lbmRvMDoxOjE6MToxL1xuJworCSdFeGFtcGxlczpcbicKKwknICBsb29wdGVzdCB0cmFuc2ZlciAxMjggMTAwMDBcbicKKwknICBsb29wdGVzdCBwaW5nIDAgMTI4XG4nCisJJyAgbG9vcHRlc3Qgc2luayAyMDMwIDMyNzY4XG4nCisJLmZvcm1hdChzeXMuYXJndlswXSksIGZpbGU9c3lzLnN0ZGVycikKKworCWFib3J0KCkKKworZGVmIHJlYWRfc3lzZnNfaW50KHBhdGgpOgorCXRyeToKKwkJZiA9IG9wZW4ocGF0aCwgInIiKTsKKwkJdmFsID0gZi5yZWFkKCk7CisJCWYuY2xvc2UoKQorCQlyZXR1cm4gaW50KHZhbCkKKwlleGNlcHQgSU9FcnJvciBhcyBlOgorCQlwcmludCgiSS9PIGVycm9yKHswfSk6IHsxfSIuZm9ybWF0KGUuZXJybm8sIGUuc3RyZXJyb3IpKQorCQlwcmludCgiSW52YWxpZCBwYXRoICVzIiAlIHBhdGgpCisKK2RlZiB3cml0ZV9zeXNmc192YWwocGF0aCwgdmFsKToKKwl0cnk6CisJCWYgPSBvcGVuKHBhdGgsICJyKyIpCisJCWYud3JpdGUodmFsKQorCQlmLmNsb3NlKCkKKwlleGNlcHQgSU9FcnJvciBhcyBlOgorCQlwcmludCgiSS9PIGVycm9yKHswfSk6IHsxfSIuZm9ybWF0KGUuZXJybm8sIGUuc3RyZXJyb3IpKQorCQlwcmludCgiSW52YWxpZCBwYXRoICVzIiAlIHBhdGgpCisKK2RlZiBsb2dfY3N2KHRlc3RfbmFtZSwgc2l6ZSwgaXRlcmF0aW9uX21heCwgc3lzX3BmeCk6CisJIyBmaWxlIG5hbWUgd2lsbCB0ZXN0X25hbWVfc2l6ZV9pdGVyYXRpb25fbWF4LmNzdgorCSMgZXZlcnkgdGltZSB0aGUgc2FtZSB0ZXN0IHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycyBpcyBydW4gd2Ugd2lsbCB0aGVuCisJIyBhcHBlbmQgdG8gdGhlIHNhbWUgQ1NWIHdpdGggZGF0ZXN0YW1wIC0gcmVwcmVzZW50aW5nIGVhY2ggdGVzdCBkYXRhc2V0CisJZm5hbWUgPSB0ZXN0X25hbWUgKyAnXycgKyBzaXplICsgJ18nICsgc3RyKGl0ZXJhdGlvbl9tYXgpICsgJy5jc3YnCisKKwl0cnk6CisJCSMgZ2F0aGVyIGRhdGEgc2V0CisJCWRhdGUgPSBzdHIoZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkpCisJCWVycm9yID0gcmVhZF9zeXNmc19pbnQoc3lzX3BmeCArICdlcnJvcicpCisJCXJlcXVlc3RfbWluID0gcmVhZF9zeXNmc19pbnQoc3lzX3BmeCArICdyZXF1ZXN0c19wZXJfc2Vjb25kX21pbicpCisJCXJlcXVlc3RfbWF4ID0gcmVhZF9zeXNmc19pbnQoc3lzX3BmeCArICdyZXF1ZXN0c19wZXJfc2Vjb25kX21heCcpCisJCXJlcXVlc3RfYXZnID0gcmVhZF9zeXNmc19pbnQoc3lzX3BmeCArICdyZXF1ZXN0c19wZXJfc2Vjb25kX2F2ZycpCisJCWxhdGVuY3lfbWluID0gcmVhZF9zeXNmc19pbnQoc3lzX3BmeCArICdsYXRlbmN5X21pbicpCisJCWxhdGVuY3lfbWF4ID0gcmVhZF9zeXNmc19pbnQoc3lzX3BmeCArICdsYXRlbmN5X21heCcpCisJCWxhdGVuY3lfYXZnID0gcmVhZF9zeXNmc19pbnQoc3lzX3BmeCArICdsYXRlbmN5X2F2ZycpCisJCXRocm91Z2hwdXRfbWluID0gcmVhZF9zeXNmc19pbnQoc3lzX3BmeCArICd0aHJvdWdocHV0X21pbicpCisJCXRocm91Z2hwdXRfbWF4ID0gcmVhZF9zeXNmc19pbnQoc3lzX3BmeCArICd0aHJvdWdocHV0X21heCcpCisJCXRocm91Z2hwdXRfYXZnID0gcmVhZF9zeXNmc19pbnQoc3lzX3BmeCArICd0aHJvdWdocHV0X2F2ZycpCisKKwkJIyBkZXJpdmUgaml0dGVyCisJCXJlcXVlc3Rfaml0dGVyID0gcmVxdWVzdF9tYXggLSByZXF1ZXN0X21pbgorCQlsYXRlbmN5X2ppdHRlciA9IGxhdGVuY3lfbWF4IC0gbGF0ZW5jeV9taW4KKwkJdGhyb3VnaHB1dF9qaXR0ZXIgPSB0aHJvdWdocHV0X21heCAtIHRocm91Z2hwdXRfbWluCisKKwkJIyBhcHBlbmQgZGF0YSBzZXQgdG8gZmlsZQorCQl3aXRoIG9wZW4oZm5hbWUsICdhJykgYXMgY3N2ZjoKKwkJCXJvdyA9IGNzdi53cml0ZXIoY3N2ZiwgZGVsaW1pdGVyPSIsIiwgcXVvdGVjaGFyPSInIiwKKwkJCQkJcXVvdGluZz1jc3YuUVVPVEVfTUlOSU1BTCkKKwkJCXJvdy53cml0ZXJvdyhbZGF0ZSwgdGVzdF9uYW1lLCBzaXplLCBpdGVyYXRpb25fbWF4LCBlcnJvciwKKwkJCQkJcmVxdWVzdF9taW4sIHJlcXVlc3RfbWF4LCByZXF1ZXN0X2F2ZywgcmVxdWVzdF9qaXR0ZXIsCisJCQkJCWxhdGVuY3lfbWluLCBsYXRlbmN5X21heCwgbGF0ZW5jeV9hdmcsIGxhdGVuY3lfaml0dGVyLAorCQkJCQl0aHJvdWdocHV0X21pbiwgdGhyb3VnaHB1dF9tYXgsIHRocm91Z2hwdXRfYXZnLCB0aHJvdWdocHV0X2ppdHRlcl0pCisJZXhjZXB0IElPRXJyb3IgYXMgZToKKwkJcHJpbnQoIkkvTyBlcnJvcih7MH0pOiB7MX0iLmZvcm1hdChlLmVycm5vLCBlLnN0cmVycm9yKSkKKworZGVmIGxvb3BiYWNrX3J1bih0ZXN0X25hbWUsIHNpemUsIGl0ZXJhdGlvbl9tYXgsIHN5c19wZngpOgorCXRlc3RfaWQgPSBkaWN0W3Rlc3RfbmFtZV0KKwl0cnk6CisJCSMgVGVybWluYXRlIGFueSBjdXJyZW50bHkgcnVubmluZyB0ZXN0CisJCXdyaXRlX3N5c2ZzX3ZhbChzeXNfcGZ4ICsgJ3R5cGUnLCAnMCcpCisJCSMgU2V0IHBhcmFtZXRlciBmb3Igbm8gd2FpdCBiZXR3ZWVuIG1lc3NhZ2VzCisJCXdyaXRlX3N5c2ZzX3ZhbChzeXNfcGZ4ICsgJ21zX3dhaXQnLCAnMCcpCisJCSMgU2V0IG9wZXJhdGlvbiBzaXplCisJCXdyaXRlX3N5c2ZzX3ZhbChzeXNfcGZ4ICsgJ3NpemUnLCBzaXplKQorCQkjIFNldCBpdGVyYXRpb25zCisJCXdyaXRlX3N5c2ZzX3ZhbChzeXNfcGZ4ICsgJ2l0ZXJhdGlvbl9tYXgnLCBzdHIoaXRlcmF0aW9uX21heCkpCisJCSMgSW5pdGlhdGUgYnkgc2V0dGluZyBsb29wYmFjayBvcGVyYXRpb24gdHlwZQorCQl3cml0ZV9zeXNmc192YWwoc3lzX3BmeCArICd0eXBlJywgdGVzdF9pZCkKKwkJdGltZS5zbGVlcCgxKQorCisJCWlmIGl0ZXJhdGlvbl9tYXggPT0gMDoKKwkJCXByaW50ICgiSW5maW5pdGUgdGVzdCBpbml0aWF0ZWQgQ1NWIHdvbid0IGJlIGxvZ2dlZFxuIikKKwkJCXJldHVybgorCisJCXByZXZpb3VzID0gMAorCQllcnIgPSAwCisJCXdoaWxlIFRydWU6CisJCQkjIGdldCBjdXJyZW50IGNvdW50IGJhaWwgb3V0IGlmIGl0IGhhc24ndCBjaGFuZ2VkCisJCQlpdGVyYXRpb25fY291bnQgPSByZWFkX3N5c2ZzX2ludChzeXNfcGZ4ICsgJ2l0ZXJhdGlvbl9jb3VudCcpCisJCQlpZiBwcmV2aW91cyA9PSBpdGVyYXRpb25fY291bnQ6CisJCQkJZXJyID0gMQorCQkJCWJyZWFrCisJCQllbGlmIGl0ZXJhdGlvbl9jb3VudCA9PSBpdGVyYXRpb25fbWF4OgorCQkJCWJyZWFrCisJCQlwcmV2aW91cyA9IGl0ZXJhdGlvbl9jb3VudAorCQkJaWYgdmVyYm9zZToKKwkJCQlwcmludCgnJTAyZCUlIGNvbXBsZXRlICVkIG9mICVkICcgJQorCQkJCQkoMTAwICogaXRlcmF0aW9uX2NvdW50IC8gaXRlcmF0aW9uX21heCwKKwkJCQkJaXRlcmF0aW9uX2NvdW50LCBpdGVyYXRpb25fbWF4KSkKKwkJCXRpbWUuc2xlZXAoMSkKKwkJaWYgZXJyOgorCQkJcHJpbnQgKCdcbkVycm9yIGV4ZWN1dGluZyB0ZXN0XG4nKQorCQllbHNlOgorCQkJbG9nX2Nzdih0ZXN0X25hbWUsIHNpemUsIGl0ZXJhdGlvbl9tYXgsIHN5c19wZngpCisJZXhjZXB0IFZhbHVlRXJyb3IgYXMgdmU6CisJCXByaW50KCJFcnJvcjogJXMgIiAlIGZvcm1hdChlLnN0cmVycm9yKSwgZmlsZT1zeXMuc3RkZXJyKQorCQlhYm9ydCgpCisKK2RlZiBtYWluKCk6CisJaWYgbGVuKHN5cy5hcmd2KSA8IDU6CisJCXVzYWdlKCkKKworCWlmIHN5cy5hcmd2WzFdIGluIGRpY3Qua2V5cygpOgorCQlsb29wYmFja19ydW4oc3lzLmFyZ3ZbMV0sIHN5cy5hcmd2WzJdLCBpbnQoc3lzLmFyZ3ZbM10pLCBzeXMuYXJndls0XSkKKwllbHNlOgorCQl1c2FnZSgpCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorCW1haW4oKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvdG9vbHMvbG9vcGJhY2tfdGVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvdG9vbHMvbG9vcGJhY2tfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZjRjZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy90b29scy9sb29wYmFja190ZXN0LmMKQEAgLTAsMCArMSwxMDAwIEBACisvKgorICogTG9vcGJhY2sgdGVzdCBhcHBsaWNhdGlvbgorICoKKyAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNSBMaW5hcm8gTHRkLgorICoKKyAqIFByb3ZpZGVkIHVuZGVyIHRoZSB0aHJlZSBjbGF1c2UgQlNEIGxpY2Vuc2UgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKyAqLworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHBvbGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNkZWZpbmUgTUFYX05VTV9ERVZJQ0VTIDEwCisjZGVmaW5lIE1BWF9TWVNGU19QQVRICTB4MjAwCisjZGVmaW5lIENTVl9NQVhfTElORQkweDEwMDAKKyNkZWZpbmUgU1lTRlNfTUFYX0lOVAkweDIwCisjZGVmaW5lIE1BWF9TVFJfTEVOCTI1NQorI2RlZmluZSBERUZBVUxUX0FTWU5DX1RJTUVPVVQgMjAwMDAwCisKK3N0cnVjdCBkaWN0IHsKKwljaGFyICpuYW1lOworCWludCB0eXBlOworfTsKKworc3RhdGljIHN0cnVjdCBkaWN0IGRpY3RbXSA9IHsKKwl7InBpbmciLCAyfSwKKwl7InRyYW5zZmVyIiwgM30sCisJeyJzaW5rIiwgNH0sCisJe05VTEwsfQkJLyogbGlzdCB0ZXJtaW5hdGlvbiAqLworfTsKKworc3RydWN0IGxvb3BiYWNrX3Jlc3VsdHMgeworCWZsb2F0IGxhdGVuY3lfYXZnOworCXVpbnQzMl90IGxhdGVuY3lfbWF4OworCXVpbnQzMl90IGxhdGVuY3lfbWluOworCXVpbnQzMl90IGxhdGVuY3lfaml0dGVyOworCisJZmxvYXQgcmVxdWVzdF9hdmc7CisJdWludDMyX3QgcmVxdWVzdF9tYXg7CisJdWludDMyX3QgcmVxdWVzdF9taW47CisJdWludDMyX3QgcmVxdWVzdF9qaXR0ZXI7CisKKwlmbG9hdCB0aHJvdWdocHV0X2F2ZzsKKwl1aW50MzJfdCB0aHJvdWdocHV0X21heDsKKwl1aW50MzJfdCB0aHJvdWdocHV0X21pbjsKKwl1aW50MzJfdCB0aHJvdWdocHV0X2ppdHRlcjsKKworCWZsb2F0IGFwYnJpZGdlX3VuaXByb19sYXRlbmN5X2F2ZzsKKwl1aW50MzJfdCBhcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9tYXg7CisJdWludDMyX3QgYXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfbWluOworCXVpbnQzMl90IGFwYnJpZGdlX3VuaXByb19sYXRlbmN5X2ppdHRlcjsKKworCWZsb2F0IGdicGh5X2Zpcm13YXJlX2xhdGVuY3lfYXZnOworCXVpbnQzMl90IGdicGh5X2Zpcm13YXJlX2xhdGVuY3lfbWF4OworCXVpbnQzMl90IGdicGh5X2Zpcm13YXJlX2xhdGVuY3lfbWluOworCXVpbnQzMl90IGdicGh5X2Zpcm13YXJlX2xhdGVuY3lfaml0dGVyOworCisJdWludDMyX3QgZXJyb3I7Cit9OworCitzdHJ1Y3QgbG9vcGJhY2tfZGV2aWNlIHsKKwljaGFyIG5hbWVbTUFYX1NZU0ZTX1BBVEhdOworCWNoYXIgc3lzZnNfZW50cnlbTUFYX1NZU0ZTX1BBVEhdOworCWNoYXIgZGVidWdmc19lbnRyeVtNQVhfU1lTRlNfUEFUSF07CisJc3RydWN0IGxvb3BiYWNrX3Jlc3VsdHMgcmVzdWx0czsKK307CisKK3N0cnVjdCBsb29wYmFja190ZXN0IHsKKwlpbnQgdmVyYm9zZTsKKwlpbnQgZGVidWc7CisJaW50IHJhd19kYXRhX2R1bXA7CisJaW50IHBvcmNlbGFpbjsKKwlpbnQgbWFzazsKKwlpbnQgc2l6ZTsKKwlpbnQgaXRlcmF0aW9uX21heDsKKwlpbnQgYWdncmVnYXRlX291dHB1dDsKKwlpbnQgdGVzdF9pZDsKKwlpbnQgZGV2aWNlX2NvdW50OworCWludCBsaXN0X2RldmljZXM7CisJaW50IHVzZV9hc3luYzsKKwlpbnQgYXN5bmNfdGltZW91dDsKKwlpbnQgYXN5bmNfb3V0c3RhbmRpbmdfb3BlcmF0aW9uczsKKwlpbnQgdXNfd2FpdDsKKwlpbnQgZmlsZV9vdXRwdXQ7CisJaW50IHN0b3BfYWxsOworCWludCBwb2xsX2NvdW50OworCWNoYXIgdGVzdF9uYW1lW01BWF9TVFJfTEVOXTsKKwljaGFyIHN5c2ZzX3ByZWZpeFtNQVhfU1lTRlNfUEFUSF07CisJY2hhciBkZWJ1Z2ZzX3ByZWZpeFtNQVhfU1lTRlNfUEFUSF07CisJc3RydWN0IHRpbWVzcGVjIHBvbGxfdGltZW91dDsKKwlzdHJ1Y3QgbG9vcGJhY2tfZGV2aWNlIGRldmljZXNbTUFYX05VTV9ERVZJQ0VTXTsKKwlzdHJ1Y3QgbG9vcGJhY2tfcmVzdWx0cyBhZ2dyZWdhdGVfcmVzdWx0czsKKwlzdHJ1Y3QgcG9sbGZkIGZkc1tNQVhfTlVNX0RFVklDRVNdOworfTsKKworc3RydWN0IGxvb3BiYWNrX3Rlc3QgdDsKKworLyogSGVscGVyIG1hY3JvcyB0byBjYWxjdWxhdGUgdGhlIGFnZ3JlZ2F0ZSByZXN1bHRzIGZvciBhbGwgZGV2aWNlcyAqLworc3RhdGljIGlubGluZSBpbnQgZGV2aWNlX2VuYWJsZWQoc3RydWN0IGxvb3BiYWNrX3Rlc3QgKnQsIGludCBkZXZfaWR4KTsKKworI2RlZmluZSBHRVRfTUFYKGZpZWxkKQkJCQkJCQlcCitzdGF0aWMgaW50IGdldF8jI2ZpZWxkIyNfYWdncmVnYXRlKHN0cnVjdCBsb29wYmFja190ZXN0ICp0KQkJXAorewkJCQkJCQkJCVwKKwl1aW50MzJfdCBtYXggPSAwOwkJCQkJCVwKKwlpbnQgaTsJCQkJCQkJCVwKKwlmb3IgKGkgPSAwOyBpIDwgdC0+ZGV2aWNlX2NvdW50OyBpKyspIHsJCQkJXAorCQlpZiAoIWRldmljZV9lbmFibGVkKHQsIGkpKQkJCQlcCisJCQljb250aW51ZTsJCQkJCVwKKwkJaWYgKHQtPmRldmljZXNbaV0ucmVzdWx0cy5maWVsZCA+IG1heCkJCQlcCisJCQltYXggPSB0LT5kZXZpY2VzW2ldLnJlc3VsdHMuZmllbGQ7CQlcCisJfQkJCQkJCQkJXAorCXJldHVybiBtYXg7CQkJCQkJCVwKK30JCQkJCQkJCQlcCisKKyNkZWZpbmUgR0VUX01JTihmaWVsZCkJCQkJCQkJXAorc3RhdGljIGludCBnZXRfIyNmaWVsZCMjX2FnZ3JlZ2F0ZShzdHJ1Y3QgbG9vcGJhY2tfdGVzdCAqdCkJCVwKK3sJCQkJCQkJCQlcCisJdWludDMyX3QgbWluID0gfjA7CQkJCQkJXAorCWludCBpOwkJCQkJCQkJXAorCWZvciAoaSA9IDA7IGkgPCB0LT5kZXZpY2VfY291bnQ7IGkrKykgewkJCQlcCisJCWlmICghZGV2aWNlX2VuYWJsZWQodCwgaSkpCQkJCVwKKwkJCWNvbnRpbnVlOwkJCQkJXAorCQlpZiAodC0+ZGV2aWNlc1tpXS5yZXN1bHRzLmZpZWxkIDwgbWluKQkJCVwKKwkJCW1pbiA9IHQtPmRldmljZXNbaV0ucmVzdWx0cy5maWVsZDsJCVwKKwl9CQkJCQkJCQlcCisJcmV0dXJuIG1pbjsJCQkJCQkJXAorfQkJCQkJCQkJCVwKKworI2RlZmluZSBHRVRfQVZHKGZpZWxkKQkJCQkJCQlcCitzdGF0aWMgaW50IGdldF8jI2ZpZWxkIyNfYWdncmVnYXRlKHN0cnVjdCBsb29wYmFja190ZXN0ICp0KQkJXAorewkJCQkJCQkJCVwKKwl1aW50MzJfdCB2YWwgPSAwOwkJCQkJCVwKKwl1aW50MzJfdCBjb3VudCA9IDA7CQkJCQkJXAorCWludCBpOwkJCQkJCQkJXAorCWZvciAoaSA9IDA7IGkgPCB0LT5kZXZpY2VfY291bnQ7IGkrKykgewkJCQlcCisJCWlmICghZGV2aWNlX2VuYWJsZWQodCwgaSkpCQkJCVwKKwkJCWNvbnRpbnVlOwkJCQkJXAorCQljb3VudCsrOwkJCQkJCVwKKwkJdmFsICs9IHQtPmRldmljZXNbaV0ucmVzdWx0cy5maWVsZDsJCQlcCisJfQkJCQkJCQkJXAorCWlmIChjb3VudCkJCQkJCQkJXAorCQl2YWwgLz0gY291bnQ7CQkJCQkJXAorCXJldHVybiB2YWw7CQkJCQkJCVwKK30JCQkJCQkJCQlcCisKK0dFVF9NQVgodGhyb3VnaHB1dF9tYXgpOworR0VUX01BWChyZXF1ZXN0X21heCk7CitHRVRfTUFYKGxhdGVuY3lfbWF4KTsKK0dFVF9NQVgoYXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfbWF4KTsKK0dFVF9NQVgoZ2JwaHlfZmlybXdhcmVfbGF0ZW5jeV9tYXgpOworR0VUX01JTih0aHJvdWdocHV0X21pbik7CitHRVRfTUlOKHJlcXVlc3RfbWluKTsKK0dFVF9NSU4obGF0ZW5jeV9taW4pOworR0VUX01JTihhcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9taW4pOworR0VUX01JTihnYnBoeV9maXJtd2FyZV9sYXRlbmN5X21pbik7CitHRVRfQVZHKHRocm91Z2hwdXRfYXZnKTsKK0dFVF9BVkcocmVxdWVzdF9hdmcpOworR0VUX0FWRyhsYXRlbmN5X2F2Zyk7CitHRVRfQVZHKGFwYnJpZGdlX3VuaXByb19sYXRlbmN5X2F2Zyk7CitHRVRfQVZHKGdicGh5X2Zpcm13YXJlX2xhdGVuY3lfYXZnKTsKKwordm9pZCBhYm9ydCgpCit7CisJX2V4aXQoMSk7Cit9CisKK3ZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBsb29wYmFja190ZXN0IFRFU1QgW1NJWkVdIElURVJBVElPTlMgW1NZU1BBVEhdIFtEQkdQQVRIXVxuXG4iCisJIiAgUnVuIFRFU1QgZm9yIGEgbnVtYmVyIG9mIElURVJBVElPTlMgd2l0aCBvcGVyYXRpb24gZGF0YSBTSVpFIGJ5dGVzXG4iCisJIiAgVEVTVCBtYXkgYmUgXCdwaW5nXCcgXCd0cmFuc2ZlclwnIG9yIFwnc2lua1wnXG4iCisJIiAgU0laRSBpbmRpY2F0ZXMgdGhlIHNpemUgb2YgdHJhbnNmZXIgPD0gZ3JleWJ1cyBtYXggcGF5bG9hZCBieXRlc1xuIgorCSIgIElURVJBVElPTlMgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgdGltZXMgdG8gZXhlY3V0ZSBURVNUIGF0IFNJWkUgYnl0ZXNcbiIKKwkiICAgICAgICAgICAgIE5vdGUgaWYgSVRFUkFUSU9OUyBpcyBzZXQgdG8gemVybyB0aGVuIHRoaXMgdXRpbGl0eSB3aWxsXG4iCisJIiAgICAgICAgICAgICBpbml0aWF0ZSBhbiBpbmZpbml0ZSAobm9uIHRlcm1pbmF0aW5nKSB0ZXN0IGFuZCBleGl0XG4iCisJIiAgICAgICAgICAgICB3aXRob3V0IGxvZ2dpbmcgYW55IG1ldHJpY3MgZGF0YVxuIgorCSIgIFNZU1BBVEggaW5kaWNhdGVzIHRoZSBzeXNmcyBwYXRoIGZvciB0aGUgbG9vcGJhY2sgZ3JleWJ1cyBlbnRyaWVzIGUuZy5cbiIKKwkiICAgICAgICAgIC9zeXMvYnVzL2dyZXlidXMvZGV2aWNlc1xuIgorCSIgIERCR1BBVEggaW5kaWNhdGVzIHRoZSBkZWJ1Z2ZzIHBhdGggZm9yIHRoZSBsb29wYmFjayBncmV5YnVzIGVudHJpZXMgZS5nLlxuIgorCSIgICAgICAgICAgL3N5cy9rZXJuZWwvZGVidWcvZ2JfbG9vcGJhY2svXG4iCisJIiBNYW5kYXRvcnkgYXJndW1lbnRzXG4iCisJIiAgIC10ICAgICBtdXN0IGJlIG9uZSBvZiB0aGUgdGVzdCBuYW1lcyAtIHNpbmssIHRyYW5zZmVyIG9yIHBpbmdcbiIKKwkiICAgLWkgICAgIGl0ZXJhdGlvbiBjb3VudCAtIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBydW4gdGhlIHRlc3Qgb3ZlclxuIgorCSIgT3B0aW9uYWwgYXJndW1lbnRzXG4iCisJIiAgIC1TICAgICBzeXNmcyBsb2NhdGlvbiAtIGxvY2F0aW9uIGZvciBncmV5YnVzICdlbmRvJyBlbnRpcmVzIGRlZmF1bHQgL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzL1xuIgorCSIgICAtRCAgICAgZGVidWdmcyBsb2NhdGlvbiAtIGxvY2F0aW9uIGZvciBsb29wYmFjayBkZWJ1Z2ZzIGVudHJpZXMgZGVmYXVsdCAvc3lzL2tlcm5lbC9kZWJ1Zy9nYl9sb29wYmFjay9cbiIKKwkiICAgLXMgICAgIHNpemUgb2YgZGF0YSBwYWNrZXQgdG8gc2VuZCBkdXJpbmcgdGVzdCAtIGRlZmF1bHRzIHRvIHplcm9cbiIKKwkiICAgLW0gICAgIG1hc2sgLSBhIGJpdCBtYXNrIG9mIGNvbm5lY3Rpb25zIHRvIGluY2x1ZGUgZXhhbXBsZTogLW0gOCA9IDR0aCBjb25uZWN0aW9uIC1tIDkgPSAxc3QgYW5kIDR0aCBjb25uZWN0aW9uIGV0Y1xuIgorCSIgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgemVybyB3aGljaCBtZWFucyBicm9hZGNhc3QgdG8gYWxsIGNvbm5lY3Rpb25zXG4iCisJIiAgIC12ICAgICB2ZXJib3NlIG91dHB1dFxuIgorCSIgICAtZCAgICAgZGVidWcgb3V0cHV0XG4iCisJIiAgIC1yICAgICByYXcgZGF0YSBvdXRwdXQgLSB3aGVuIHNwZWNpZmllZCB0aGUgZnVsbCBsaXN0IG9mIGxhdGVuY3kgdmFsdWVzIGFyZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IENTVlxuIgorCSIgICAtcCAgICAgcG9yY2VsYWluIC0gd2hlbiBzcGVjaWZpZWQgcHJpbnRvdXQgaXMgaW4gYSB1c2VyLWZyaWVuZGx5IG5vbi1DU1YgZm9ybWF0LiBUaGlzIG9wdGlvbiBzdXBwcmVzc2VzIHdyaXRpbmcgdG8gQ1NWIGZpbGVcbiIKKwkiICAgLWEgICAgIGFnZ3JlZ2F0ZSAtIHNob3cgYWdncmVnYXRpb24gb2YgYWxsIGVuYWJsZWQgZGV2aWNlc1xuIgorCSIgICAtbCAgICAgbGlzdCBmb3VuZCBsb29wYmFjayBkZXZpY2VzIGFuZCBleGl0XG4iCisJIiAgIC14ICAgICBBc3luYyAtIEVuYWJsZSBhc3luYyB0cmFuc2ZlcnNcbiIKKwkiICAgLW8gICAgIEFzeW5jIFRpbWVvdXQgLSBUaW1lb3V0IGluIHVTZWMgZm9yIGFzeW5jIG9wZXJhdGlvbnNcbiIKKwkiICAgLU8gICAgIFBvbGwgbG9vcCB0aW1lIG91dCBpbiBzZWNvbmRzKG1heCB0aW1lIGEgdGVzdCBpcyBleHBlY3RlZCB0byBsYXN0LCBkZWZhdWx0OiAzMHNlYylcbiIKKwkiICAgLWMgICAgIE1heCBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgb3BlcmF0aW9ucyBmb3IgYXN5bmMgb3BlcmF0aW9uc1xuIgorCSIgICAtdyAgICAgV2FpdCBpbiB1U2VjIGJldHdlZW4gb3BlcmF0aW9uc1xuIgorCSIgICAteiAgICAgRW5hYmxlIG91dHB1dCB0byBhIENTViBmaWxlIChpbmNvbXBhdGlibGUgd2l0aCAtcClcbiIKKwkiICAgLWYgICAgIFdoZW4gc3RhcnRpbmcgbmV3IGxvb3BiYWNrIHRlc3QsIHN0b3AgY3VycmVudGx5IHJ1bm5pbmcgdGVzdHMgb24gYWxsIGRldmljZXNcbiIKKwkiRXhhbXBsZXM6XG4iCisJIiAgU2VuZCAxMDAwMCB0cmFuc2ZlcnMgd2l0aCBhIHBhY2tldCBzaXplIG9mIDEyOCBieXRlcyB0byBhbGwgYWN0aXZlIGNvbm5lY3Rpb25zXG4iCisJIiAgbG9vcGJhY2tfdGVzdCAtdCB0cmFuc2ZlciAtcyAxMjggLWkgMTAwMDAgLVMgL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLyAtRCAvc3lzL2tlcm5lbC9kZWJ1Zy9nYl9sb29wYmFjay9cbiIKKwkiICBsb29wYmFja190ZXN0IC10IHRyYW5zZmVyIC1zIDEyOCAtaSAxMDAwMCAtbSAwXG4iCisJIiAgU2VuZCAxMDAwMCB0cmFuc2ZlcnMgd2l0aCBhIHBhY2tldCBzaXplIG9mIDEyOCBieXRlcyB0byBjb25uZWN0aW9uIDEgYW5kIDRcbiIKKwkiICBsb29wYmFja190ZXN0IC10IHRyYW5zZmVyIC1zIDEyOCAtaSAxMDAwMCAtbSA5XG4iCisJIiAgbG9vcGJhY2tfdGVzdCAtdCBwaW5nIC1zIDAgMTI4IC1pIC1TIC9zeXMvYnVzL2dyZXlidXMvZGV2aWNlcy8gLUQgL3N5cy9rZXJuZWwvZGVidWcvZ2JfbG9vcGJhY2svXG4iCisJIiAgbG9vcGJhY2tfdGVzdCAtdCBzaW5rIC1zIDIwMzAgLWkgMzI3NjggLVMgL3N5cy9idXMvZ3JleWJ1cy9kZXZpY2VzLyAtRCAvc3lzL2tlcm5lbC9kZWJ1Zy9nYl9sb29wYmFjay9cbiIpOworCWFib3J0KCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRldmljZV9lbmFibGVkKHN0cnVjdCBsb29wYmFja190ZXN0ICp0LCBpbnQgZGV2X2lkeCkKK3sKKwlpZiAoIXQtPm1hc2sgfHwgKHQtPm1hc2sgJiAoMSA8PCBkZXZfaWR4KSkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfbG9vcGJhY2tfZGV2aWNlcyhzdHJ1Y3QgbG9vcGJhY2tfdGVzdCAqdCkKK3sKKwlpbnQgaTsKKworCWlmICh0LT5kZXZpY2VfY291bnQgPT0gMCkgeworCQlwcmludGYoIk5vIGxvb3BiYWNrIGRldmljZXMuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCB0LT5kZXZpY2VfY291bnQ7IGkrKykKKwkJcHJpbnRmKCJkZXZpY2VbJWRdID0gJXNcbiIsIGksIHQtPmRldmljZXNbaV0ubmFtZSk7CisKK30KKworaW50IG9wZW5fc3lzZnMoY29uc3QgY2hhciAqc3lzX3BmeCwgY29uc3QgY2hhciAqbm9kZSwgaW50IGZsYWdzKQoreworCWludCBmZDsKKwljaGFyIHBhdGhbTUFYX1NZU0ZTX1BBVEhdOworCisJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAiJXMlcyIsIHN5c19wZngsIG5vZGUpOworCWZkID0gb3BlbihwYXRoLCBmbGFncyk7CisJaWYgKGZkIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInVuYWJsZSB0byBvcGVuICVzXG4iLCBwYXRoKTsKKwkJYWJvcnQoKTsKKwl9CisJcmV0dXJuIGZkOworfQorCitpbnQgcmVhZF9zeXNmc19pbnRfZmQoaW50IGZkLCBjb25zdCBjaGFyICpzeXNfcGZ4LCBjb25zdCBjaGFyICpub2RlKQoreworCWNoYXIgYnVmW1NZU0ZTX01BWF9JTlRdOworCisJaWYgKHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInVuYWJsZSB0byByZWFkIGZyb20gJXMlcyAlc1xuIiwgc3lzX3BmeCwgbm9kZSwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKGZkKTsKKwkJYWJvcnQoKTsKKwl9CisJcmV0dXJuIGF0b2koYnVmKTsKK30KKworZmxvYXQgcmVhZF9zeXNmc19mbG9hdF9mZChpbnQgZmQsIGNvbnN0IGNoYXIgKnN5c19wZngsIGNvbnN0IGNoYXIgKm5vZGUpCit7CisJY2hhciBidWZbU1lTRlNfTUFYX0lOVF07CisKKwlpZiAocmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSkgPCAwKSB7CisKKwkJZnByaW50ZihzdGRlcnIsICJ1bmFibGUgdG8gcmVhZCBmcm9tICVzJXMgJXNcbiIsIHN5c19wZngsIG5vZGUsCisJCQlzdHJlcnJvcihlcnJubykpOworCQljbG9zZShmZCk7CisJCWFib3J0KCk7CisJfQorCXJldHVybiBhdG9mKGJ1Zik7Cit9CisKK2ludCByZWFkX3N5c2ZzX2ludChjb25zdCBjaGFyICpzeXNfcGZ4LCBjb25zdCBjaGFyICpub2RlKQoreworCWludCBmZCwgdmFsOworCisJZmQgPSBvcGVuX3N5c2ZzKHN5c19wZngsIG5vZGUsIE9fUkRPTkxZKTsKKwl2YWwgPSByZWFkX3N5c2ZzX2ludF9mZChmZCwgc3lzX3BmeCwgbm9kZSk7CisJY2xvc2UoZmQpOworCXJldHVybiB2YWw7Cit9CisKK2Zsb2F0IHJlYWRfc3lzZnNfZmxvYXQoY29uc3QgY2hhciAqc3lzX3BmeCwgY29uc3QgY2hhciAqbm9kZSkKK3sKKwlpbnQgZmQ7CisJZmxvYXQgdmFsOworCisJZmQgPSBvcGVuX3N5c2ZzKHN5c19wZngsIG5vZGUsIE9fUkRPTkxZKTsKKwl2YWwgPSByZWFkX3N5c2ZzX2Zsb2F0X2ZkKGZkLCBzeXNfcGZ4LCBub2RlKTsKKwljbG9zZShmZCk7CisJcmV0dXJuIHZhbDsKK30KKwordm9pZCB3cml0ZV9zeXNmc192YWwoY29uc3QgY2hhciAqc3lzX3BmeCwgY29uc3QgY2hhciAqbm9kZSwgaW50IHZhbCkKK3sKKwlpbnQgZmQsIGxlbjsKKwljaGFyIGJ1ZltTWVNGU19NQVhfSU5UXTsKKworCWZkID0gb3Blbl9zeXNmcyhzeXNfcGZ4LCBub2RlLCBPX1JEV1IpOworCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZCIsIHZhbCk7CisJaWYgKHdyaXRlKGZkLCBidWYsIGxlbikgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIHdyaXRlIHRvICVzJXMgJXNcbiIsIHN5c19wZngsIG5vZGUsCisJCQlzdHJlcnJvcihlcnJubykpOworCQljbG9zZShmZCk7CisJCWFib3J0KCk7CisJfQorCWNsb3NlKGZkKTsKK30KKworc3RhdGljIGludCBnZXRfcmVzdWx0cyhzdHJ1Y3QgbG9vcGJhY2tfdGVzdCAqdCkKK3sKKwlzdHJ1Y3QgbG9vcGJhY2tfZGV2aWNlICpkOworCXN0cnVjdCBsb29wYmFja19yZXN1bHRzICpyOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHQtPmRldmljZV9jb3VudDsgaSsrKSB7CisJCWlmICghZGV2aWNlX2VuYWJsZWQodCwgaSkpCisJCQljb250aW51ZTsKKworCQlkID0gJnQtPmRldmljZXNbaV07CisJCXIgPSAmZC0+cmVzdWx0czsKKworCQlyLT5lcnJvciA9IHJlYWRfc3lzZnNfaW50KGQtPnN5c2ZzX2VudHJ5LCAiZXJyb3IiKTsKKwkJci0+cmVxdWVzdF9taW4gPSByZWFkX3N5c2ZzX2ludChkLT5zeXNmc19lbnRyeSwgInJlcXVlc3RzX3Blcl9zZWNvbmRfbWluIik7CisJCXItPnJlcXVlc3RfbWF4ID0gcmVhZF9zeXNmc19pbnQoZC0+c3lzZnNfZW50cnksICJyZXF1ZXN0c19wZXJfc2Vjb25kX21heCIpOworCQlyLT5yZXF1ZXN0X2F2ZyA9IHJlYWRfc3lzZnNfZmxvYXQoZC0+c3lzZnNfZW50cnksICJyZXF1ZXN0c19wZXJfc2Vjb25kX2F2ZyIpOworCisJCXItPmxhdGVuY3lfbWluID0gcmVhZF9zeXNmc19pbnQoZC0+c3lzZnNfZW50cnksICJsYXRlbmN5X21pbiIpOworCQlyLT5sYXRlbmN5X21heCA9IHJlYWRfc3lzZnNfaW50KGQtPnN5c2ZzX2VudHJ5LCAibGF0ZW5jeV9tYXgiKTsKKwkJci0+bGF0ZW5jeV9hdmcgPSByZWFkX3N5c2ZzX2Zsb2F0KGQtPnN5c2ZzX2VudHJ5LCAibGF0ZW5jeV9hdmciKTsKKworCQlyLT50aHJvdWdocHV0X21pbiA9IHJlYWRfc3lzZnNfaW50KGQtPnN5c2ZzX2VudHJ5LCAidGhyb3VnaHB1dF9taW4iKTsKKwkJci0+dGhyb3VnaHB1dF9tYXggPSByZWFkX3N5c2ZzX2ludChkLT5zeXNmc19lbnRyeSwgInRocm91Z2hwdXRfbWF4Iik7CisJCXItPnRocm91Z2hwdXRfYXZnID0gcmVhZF9zeXNmc19mbG9hdChkLT5zeXNmc19lbnRyeSwgInRocm91Z2hwdXRfYXZnIik7CisKKwkJci0+YXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfbWluID0KKwkJCXJlYWRfc3lzZnNfaW50KGQtPnN5c2ZzX2VudHJ5LCAiYXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfbWluIik7CisJCXItPmFwYnJpZGdlX3VuaXByb19sYXRlbmN5X21heCA9CisJCQlyZWFkX3N5c2ZzX2ludChkLT5zeXNmc19lbnRyeSwgImFwYnJpZGdlX3VuaXByb19sYXRlbmN5X21heCIpOworCQlyLT5hcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9hdmcgPQorCQkJcmVhZF9zeXNmc19mbG9hdChkLT5zeXNmc19lbnRyeSwgImFwYnJpZGdlX3VuaXByb19sYXRlbmN5X2F2ZyIpOworCisJCXItPmdicGh5X2Zpcm13YXJlX2xhdGVuY3lfbWluID0KKwkJCXJlYWRfc3lzZnNfaW50KGQtPnN5c2ZzX2VudHJ5LCAiZ2JwaHlfZmlybXdhcmVfbGF0ZW5jeV9taW4iKTsKKwkJci0+Z2JwaHlfZmlybXdhcmVfbGF0ZW5jeV9tYXggPQorCQkJcmVhZF9zeXNmc19pbnQoZC0+c3lzZnNfZW50cnksICJnYnBoeV9maXJtd2FyZV9sYXRlbmN5X21heCIpOworCQlyLT5nYnBoeV9maXJtd2FyZV9sYXRlbmN5X2F2ZyA9CisJCQlyZWFkX3N5c2ZzX2Zsb2F0KGQtPnN5c2ZzX2VudHJ5LCAiZ2JwaHlfZmlybXdhcmVfbGF0ZW5jeV9hdmciKTsKKworCQlyLT5yZXF1ZXN0X2ppdHRlciA9IHItPnJlcXVlc3RfbWF4IC0gci0+cmVxdWVzdF9taW47CisJCXItPmxhdGVuY3lfaml0dGVyID0gci0+bGF0ZW5jeV9tYXggLSByLT5sYXRlbmN5X21pbjsKKwkJci0+dGhyb3VnaHB1dF9qaXR0ZXIgPSByLT50aHJvdWdocHV0X21heCAtIHItPnRocm91Z2hwdXRfbWluOworCQlyLT5hcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9qaXR0ZXIgPQorCQkJci0+YXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfbWF4IC0gci0+YXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfbWluOworCQlyLT5nYnBoeV9maXJtd2FyZV9sYXRlbmN5X2ppdHRlciA9CisJCQlyLT5nYnBoeV9maXJtd2FyZV9sYXRlbmN5X21heCAtIHItPmdicGh5X2Zpcm13YXJlX2xhdGVuY3lfbWluOworCisJfQorCisJLypjYWxjdWxhdGUgdGhlIGFnZ3JlZ2F0ZSByZXN1bHRzIG9mIGFsbCBlbmFibGVkIGRldmljZXMgKi8KKwlpZiAodC0+YWdncmVnYXRlX291dHB1dCkgeworCQlyID0gJnQtPmFnZ3JlZ2F0ZV9yZXN1bHRzOworCisJCXItPnJlcXVlc3RfbWluID0gZ2V0X3JlcXVlc3RfbWluX2FnZ3JlZ2F0ZSh0KTsKKwkJci0+cmVxdWVzdF9tYXggPSBnZXRfcmVxdWVzdF9tYXhfYWdncmVnYXRlKHQpOworCQlyLT5yZXF1ZXN0X2F2ZyA9IGdldF9yZXF1ZXN0X2F2Z19hZ2dyZWdhdGUodCk7CisKKwkJci0+bGF0ZW5jeV9taW4gPSBnZXRfbGF0ZW5jeV9taW5fYWdncmVnYXRlKHQpOworCQlyLT5sYXRlbmN5X21heCA9IGdldF9sYXRlbmN5X21heF9hZ2dyZWdhdGUodCk7CisJCXItPmxhdGVuY3lfYXZnID0gZ2V0X2xhdGVuY3lfYXZnX2FnZ3JlZ2F0ZSh0KTsKKworCQlyLT50aHJvdWdocHV0X21pbiA9IGdldF90aHJvdWdocHV0X21pbl9hZ2dyZWdhdGUodCk7CisJCXItPnRocm91Z2hwdXRfbWF4ID0gZ2V0X3Rocm91Z2hwdXRfbWF4X2FnZ3JlZ2F0ZSh0KTsKKwkJci0+dGhyb3VnaHB1dF9hdmcgPSBnZXRfdGhyb3VnaHB1dF9hdmdfYWdncmVnYXRlKHQpOworCisJCXItPmFwYnJpZGdlX3VuaXByb19sYXRlbmN5X21pbiA9CisJCQlnZXRfYXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfbWluX2FnZ3JlZ2F0ZSh0KTsKKwkJci0+YXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfbWF4ID0KKwkJCWdldF9hcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9tYXhfYWdncmVnYXRlKHQpOworCQlyLT5hcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9hdmcgPQorCQkJZ2V0X2FwYnJpZGdlX3VuaXByb19sYXRlbmN5X2F2Z19hZ2dyZWdhdGUodCk7CisKKwkJci0+Z2JwaHlfZmlybXdhcmVfbGF0ZW5jeV9taW4gPQorCQkJZ2V0X2dicGh5X2Zpcm13YXJlX2xhdGVuY3lfbWluX2FnZ3JlZ2F0ZSh0KTsKKwkJci0+Z2JwaHlfZmlybXdhcmVfbGF0ZW5jeV9tYXggPQorCQkJZ2V0X2dicGh5X2Zpcm13YXJlX2xhdGVuY3lfbWF4X2FnZ3JlZ2F0ZSh0KTsKKwkJci0+Z2JwaHlfZmlybXdhcmVfbGF0ZW5jeV9hdmcgPQorCQkJZ2V0X2dicGh5X2Zpcm13YXJlX2xhdGVuY3lfYXZnX2FnZ3JlZ2F0ZSh0KTsKKworCQlyLT5yZXF1ZXN0X2ppdHRlciA9IHItPnJlcXVlc3RfbWF4IC0gci0+cmVxdWVzdF9taW47CisJCXItPmxhdGVuY3lfaml0dGVyID0gci0+bGF0ZW5jeV9tYXggLSByLT5sYXRlbmN5X21pbjsKKwkJci0+dGhyb3VnaHB1dF9qaXR0ZXIgPSByLT50aHJvdWdocHV0X21heCAtIHItPnRocm91Z2hwdXRfbWluOworCQlyLT5hcGJyaWRnZV91bmlwcm9fbGF0ZW5jeV9qaXR0ZXIgPQorCQkJci0+YXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfbWF4IC0gci0+YXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfbWluOworCQlyLT5nYnBoeV9maXJtd2FyZV9sYXRlbmN5X2ppdHRlciA9CisJCQlyLT5nYnBoeV9maXJtd2FyZV9sYXRlbmN5X21heCAtIHItPmdicGh5X2Zpcm13YXJlX2xhdGVuY3lfbWluOworCisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbG9nX2Nzdl9lcnJvcihpbnQgbGVuLCBpbnQgZXJyKQoreworCWZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIHdyaXRlICVkIGJ5dGVzIHRvIGNzdiAlc1xuIiwgbGVuLAorCQlzdHJlcnJvcihlcnIpKTsKK30KKworaW50IGZvcm1hdF9vdXRwdXQoc3RydWN0IGxvb3BiYWNrX3Rlc3QgKnQsCisJCQlzdHJ1Y3QgbG9vcGJhY2tfcmVzdWx0cyAqciwKKwkJCWNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJY2hhciAqYnVmLCBpbnQgYnVmX2xlbiwKKwkJCXN0cnVjdCB0bSAqdG0pCit7CisJaW50IGxlbiA9IDA7CisKKwltZW1zZXQoYnVmLCAweDAwLCBidWZfbGVuKTsKKwlsZW4gPSBzbnByaW50ZihidWYsIGJ1Zl9sZW4sICIldS0ldS0ldSAldToldToldSIsCisJCSAgICAgICB0bS0+dG1feWVhciArIDE5MDAsIHRtLT50bV9tb24gKyAxLCB0bS0+dG1fbWRheSwKKwkJICAgICAgIHRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKKworCWlmICh0LT5wb3JjZWxhaW4pIHsKKwkJbGVuICs9IHNucHJpbnRmKCZidWZbbGVuXSwgYnVmX2xlbiAtIGxlbiwKKwkJCSJcbiB0ZXN0Olx0XHRcdCVzXG4gcGF0aDpcdFx0XHQlc1xuIHNpemU6XHRcdFx0JXVcbiBpdGVyYXRpb25zOlx0XHQldVxuIGVycm9yczpcdFx0JXVcbiBhc3luYzpcdFx0XHQlc1xuIiwKKwkJCXQtPnRlc3RfbmFtZSwKKwkJCWRldl9uYW1lLAorCQkJdC0+c2l6ZSwKKwkJCXQtPml0ZXJhdGlvbl9tYXgsCisJCQlyLT5lcnJvciwKKwkJCXQtPnVzZV9hc3luYyA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOworCisJCWxlbiArPSBzbnByaW50ZigmYnVmW2xlbl0sIGJ1Zl9sZW4gLSBsZW4sCisJCQkiIHJlcXVlc3RzIHBlci1zZWM6XHRtaW49JXUsIG1heD0ldSwgYXZlcmFnZT0lZiwgaml0dGVyPSV1XG4iLAorCQkJci0+cmVxdWVzdF9taW4sCisJCQlyLT5yZXF1ZXN0X21heCwKKwkJCXItPnJlcXVlc3RfYXZnLAorCQkJci0+cmVxdWVzdF9qaXR0ZXIpOworCisJCWxlbiArPSBzbnByaW50ZigmYnVmW2xlbl0sIGJ1Zl9sZW4gLSBsZW4sCisJCQkiIGFwLXRocm91Z2hwdXQgQi9zOlx0bWluPSV1IG1heD0ldSBhdmVyYWdlPSVmIGppdHRlcj0ldVxuIiwKKwkJCXItPnRocm91Z2hwdXRfbWluLAorCQkJci0+dGhyb3VnaHB1dF9tYXgsCisJCQlyLT50aHJvdWdocHV0X2F2ZywKKwkJCXItPnRocm91Z2hwdXRfaml0dGVyKTsKKwkJbGVuICs9IHNucHJpbnRmKCZidWZbbGVuXSwgYnVmX2xlbiAtIGxlbiwKKwkJCSIgYXAtbGF0ZW5jeSB1c2VjOlx0bWluPSV1IG1heD0ldSBhdmVyYWdlPSVmIGppdHRlcj0ldVxuIiwKKwkJCXItPmxhdGVuY3lfbWluLAorCQkJci0+bGF0ZW5jeV9tYXgsCisJCQlyLT5sYXRlbmN5X2F2ZywKKwkJCXItPmxhdGVuY3lfaml0dGVyKTsKKwkJbGVuICs9IHNucHJpbnRmKCZidWZbbGVuXSwgYnVmX2xlbiAtIGxlbiwKKwkJCSIgYXBicmlkZ2UtbGF0ZW5jeSB1c2VjOlx0bWluPSV1IG1heD0ldSBhdmVyYWdlPSVmIGppdHRlcj0ldVxuIiwKKwkJCXItPmFwYnJpZGdlX3VuaXByb19sYXRlbmN5X21pbiwKKwkJCXItPmFwYnJpZGdlX3VuaXByb19sYXRlbmN5X21heCwKKwkJCXItPmFwYnJpZGdlX3VuaXByb19sYXRlbmN5X2F2ZywKKwkJCXItPmFwYnJpZGdlX3VuaXByb19sYXRlbmN5X2ppdHRlcik7CisKKwkJbGVuICs9IHNucHJpbnRmKCZidWZbbGVuXSwgYnVmX2xlbiAtIGxlbiwKKwkJCSIgZ2JwaHktbGF0ZW5jeSB1c2VjOlx0bWluPSV1IG1heD0ldSBhdmVyYWdlPSVmIGppdHRlcj0ldVxuIiwKKwkJCXItPmdicGh5X2Zpcm13YXJlX2xhdGVuY3lfbWluLAorCQkJci0+Z2JwaHlfZmlybXdhcmVfbGF0ZW5jeV9tYXgsCisJCQlyLT5nYnBoeV9maXJtd2FyZV9sYXRlbmN5X2F2ZywKKwkJCXItPmdicGh5X2Zpcm13YXJlX2xhdGVuY3lfaml0dGVyKTsKKworCX0gZWxzZSB7CisJCWxlbiArPSBzbnByaW50ZigmYnVmW2xlbl0sIGJ1Zl9sZW4tIGxlbiwgIiwlcywlcywldSwldSwldSIsCisJCQl0LT50ZXN0X25hbWUsIGRldl9uYW1lLCB0LT5zaXplLCB0LT5pdGVyYXRpb25fbWF4LAorCQkJci0+ZXJyb3IpOworCisJCWxlbiArPSBzbnByaW50ZigmYnVmW2xlbl0sIGJ1Zl9sZW4gLSBsZW4sICIsJXUsJXUsJWYsJXUiLAorCQkJci0+cmVxdWVzdF9taW4sCisJCQlyLT5yZXF1ZXN0X21heCwKKwkJCXItPnJlcXVlc3RfYXZnLAorCQkJci0+cmVxdWVzdF9qaXR0ZXIpOworCisJCWxlbiArPSBzbnByaW50ZigmYnVmW2xlbl0sIGJ1Zl9sZW4gLSBsZW4sICIsJXUsJXUsJWYsJXUiLAorCQkJci0+bGF0ZW5jeV9taW4sCisJCQlyLT5sYXRlbmN5X21heCwKKwkJCXItPmxhdGVuY3lfYXZnLAorCQkJci0+bGF0ZW5jeV9qaXR0ZXIpOworCisJCWxlbiArPSBzbnByaW50ZigmYnVmW2xlbl0sIGJ1Zl9sZW4gLSBsZW4sICIsJXUsJXUsJWYsJXUiLAorCQkJci0+dGhyb3VnaHB1dF9taW4sCisJCQlyLT50aHJvdWdocHV0X21heCwKKwkJCXItPnRocm91Z2hwdXRfYXZnLAorCQkJci0+dGhyb3VnaHB1dF9qaXR0ZXIpOworCisJCWxlbiArPSBzbnByaW50ZigmYnVmW2xlbl0sIGJ1Zl9sZW4gLSBsZW4sICIsJXUsJXUsJWYsJXUiLAorCQkJci0+YXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfbWluLAorCQkJci0+YXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfbWF4LAorCQkJci0+YXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfYXZnLAorCQkJci0+YXBicmlkZ2VfdW5pcHJvX2xhdGVuY3lfaml0dGVyKTsKKworCQlsZW4gKz0gc25wcmludGYoJmJ1ZltsZW5dLCBidWZfbGVuIC0gbGVuLCAiLCV1LCV1LCVmLCV1IiwKKwkJCXItPmdicGh5X2Zpcm13YXJlX2xhdGVuY3lfbWluLAorCQkJci0+Z2JwaHlfZmlybXdhcmVfbGF0ZW5jeV9tYXgsCisJCQlyLT5nYnBoeV9maXJtd2FyZV9sYXRlbmN5X2F2ZywKKwkJCXItPmdicGh5X2Zpcm13YXJlX2xhdGVuY3lfaml0dGVyKTsKKwl9CisKKwlwcmludGYoIlxuJXNcbiIsIGJ1Zik7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGxvZ19yZXN1bHRzKHN0cnVjdCBsb29wYmFja190ZXN0ICp0KQoreworCWludCBmZCwgaSwgbGVuLCByZXQ7CisJc3RydWN0IHRtIHRtOworCXRpbWVfdCBsb2NhbF90aW1lOworCW1vZGVfdCBtb2RlID0gU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USDsKKwljaGFyIGZpbGVfbmFtZVtNQVhfU1lTRlNfUEFUSF07CisJY2hhciBkYXRhW0NTVl9NQVhfTElORV07CisKKwlsb2NhbF90aW1lID0gdGltZShOVUxMKTsKKwl0bSA9ICpsb2NhbHRpbWUoJmxvY2FsX3RpbWUpOworCisJLyoKKwkqIGZpbGUgbmFtZSB3aWxsIHRlc3RfbmFtZV9zaXplX2l0ZXJhdGlvbl9tYXguY3N2CisJKiBldmVyeSB0aW1lIHRoZSBzYW1lIHRlc3Qgd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzIGlzIHJ1biB3ZSB3aWxsIHRoZW4KKwkqIGFwcGVuZCB0byB0aGUgc2FtZSBDU1Ygd2l0aCBkYXRlc3RhbXAgLSByZXByZXNlbnRpbmcgZWFjaCB0ZXN0CisJKiBkYXRhc2V0LgorCSovCisJaWYgKHQtPmZpbGVfb3V0cHV0ICYmICF0LT5wb3JjZWxhaW4pIHsKKwkJc25wcmludGYoZmlsZV9uYW1lLCBzaXplb2YoZmlsZV9uYW1lKSwgIiVzXyVkXyVkLmNzdiIsCisJCQl0LT50ZXN0X25hbWUsIHQtPnNpemUsIHQtPml0ZXJhdGlvbl9tYXgpOworCisJCWZkID0gb3BlbihmaWxlX25hbWUsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fQVBQRU5ELCBtb2RlKTsKKwkJaWYgKGZkIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJ1bmFibGUgdG8gb3BlbiAlcyBmb3IgYXBwZW5kYXRpb25cbiIsIGZpbGVfbmFtZSk7CisJCQlhYm9ydCgpOworCQl9CisKKwl9CisJZm9yIChpID0gMDsgaSA8IHQtPmRldmljZV9jb3VudDsgaSsrKSB7CisJCWlmICghZGV2aWNlX2VuYWJsZWQodCwgaSkpCisJCQljb250aW51ZTsKKworCQlsZW4gPSBmb3JtYXRfb3V0cHV0KHQsICZ0LT5kZXZpY2VzW2ldLnJlc3VsdHMsCisJCQkJCXQtPmRldmljZXNbaV0ubmFtZSwKKwkJCQkJZGF0YSwgc2l6ZW9mKGRhdGEpLCAmdG0pOworCQlpZiAodC0+ZmlsZV9vdXRwdXQgJiYgIXQtPnBvcmNlbGFpbikgeworCQkJcmV0ID0gd3JpdGUoZmQsIGRhdGEsIGxlbik7CisJCQlpZiAocmV0ID09IC0xKQorCQkJCWZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIHdyaXRlICVkIGJ5dGVzIHRvIGNzdi5cbiIsIGxlbik7CisJCX0KKworCX0KKworCisJaWYgKHQtPmFnZ3JlZ2F0ZV9vdXRwdXQpIHsKKwkJbGVuID0gZm9ybWF0X291dHB1dCh0LCAmdC0+YWdncmVnYXRlX3Jlc3VsdHMsICJhZ2dyZWdhdGUiLAorCQkJCQlkYXRhLCBzaXplb2YoZGF0YSksICZ0bSk7CisJCWlmICh0LT5maWxlX291dHB1dCAmJiAhdC0+cG9yY2VsYWluKSB7CisJCQlyZXQgPSB3cml0ZShmZCwgZGF0YSwgbGVuKTsKKwkJCWlmIChyZXQgPT0gLTEpCisJCQkJZnByaW50ZihzdGRlcnIsICJ1bmFibGUgdG8gd3JpdGUgJWQgYnl0ZXMgdG8gY3N2LlxuIiwgbGVuKTsKKwkJfQorCX0KKworCWlmICh0LT5maWxlX291dHB1dCAmJiAhdC0+cG9yY2VsYWluKQorCQljbG9zZShmZCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGlzX2xvb3BiYWNrX2RldmljZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpub2RlKQoreworCWNoYXIgZmlsZVtNQVhfU1lTRlNfUEFUSF07CisKKwlzbnByaW50ZihmaWxlLCBNQVhfU1lTRlNfUEFUSCwgIiVzJXMvaXRlcmF0aW9uX2NvdW50IiwgcGF0aCwgbm9kZSk7CisJaWYgKGFjY2VzcyhmaWxlLCBGX09LKSA9PSAwKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworaW50IGZpbmRfbG9vcGJhY2tfZGV2aWNlcyhzdHJ1Y3QgbG9vcGJhY2tfdGVzdCAqdCkKK3sKKwlzdHJ1Y3QgZGlyZW50ICoqbmFtZWxpc3Q7CisJaW50IGksIG4sIHJldDsKKwl1bnNpZ25lZCBpbnQgZGV2X2lkOworCXN0cnVjdCBsb29wYmFja19kZXZpY2UgKmQ7CisKKwluID0gc2NhbmRpcih0LT5zeXNmc19wcmVmaXgsICZuYW1lbGlzdCwgTlVMTCwgYWxwaGFzb3J0KTsKKwlpZiAobiA8IDApIHsKKwkJcGVycm9yKCJzY2FuZGlyIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gYmFkZGlyOworCX0KKworCS8qIERvbid0IGluY2x1ZGUgJy4nIGFuZCAnLi4nICovCisJaWYgKG4gPD0gMikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGRvbmU7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQlyZXQgPSBzc2NhbmYobmFtZWxpc3RbaV0tPmRfbmFtZSwgImdiX2xvb3BiYWNrJXUiLCAmZGV2X2lkKTsKKwkJaWYgKHJldCAhPSAxKQorCQkJY29udGludWU7CisKKwkJaWYgKCFpc19sb29wYmFja19kZXZpY2UodC0+c3lzZnNfcHJlZml4LCBuYW1lbGlzdFtpXS0+ZF9uYW1lKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICh0LT5kZXZpY2VfY291bnQgPT0gTUFYX05VTV9ERVZJQ0VTKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIm1heCBudW1iZXIgb2YgZGV2aWNlcyByZWFjaGVkIVxuIik7CisJCQlicmVhazsKKwkJfQorCisJCWQgPSAmdC0+ZGV2aWNlc1t0LT5kZXZpY2VfY291bnQrK107CisJCXNucHJpbnRmKGQtPm5hbWUsIE1BWF9TVFJfTEVOLCAiZ2JfbG9vcGJhY2sldSIsIGRldl9pZCk7CisKKwkJc25wcmludGYoZC0+c3lzZnNfZW50cnksIE1BWF9TWVNGU19QQVRILCAiJXMlcy8iLAorCQkJdC0+c3lzZnNfcHJlZml4LCBkLT5uYW1lKTsKKworCQlzbnByaW50ZihkLT5kZWJ1Z2ZzX2VudHJ5LCBNQVhfU1lTRlNfUEFUSCwgIiVzcmF3X2xhdGVuY3lfJXMiLAorCQkJdC0+ZGVidWdmc19wcmVmaXgsIGQtPm5hbWUpOworCisJCWlmICh0LT5kZWJ1ZykKKwkJCXByaW50ZigiYWRkICVzICVzXG4iLCBkLT5zeXNmc19lbnRyeSwKKwkJCQlkLT5kZWJ1Z2ZzX2VudHJ5KTsKKwl9CisKKwlyZXQgPSAwOworZG9uZToKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQlmcmVlKG5hbWVsaXN0W25dKTsKKwlmcmVlKG5hbWVsaXN0KTsKK2JhZGRpcjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9wZW5fcG9sbF9maWxlcyhzdHJ1Y3QgbG9vcGJhY2tfdGVzdCAqdCkKK3sKKwlzdHJ1Y3QgbG9vcGJhY2tfZGV2aWNlICpkZXY7CisJY2hhciBidWZbTUFYX1NUUl9MRU5dOworCWNoYXIgZHVtbXk7CisJaW50IGZkc19pZHggPSAwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHQtPmRldmljZV9jb3VudDsgaSsrKSB7CisJCWRldiA9ICZ0LT5kZXZpY2VzW2ldOworCisJCWlmICghZGV2aWNlX2VuYWJsZWQodCwgaSkpCisJCQljb250aW51ZTsKKworCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMlcyIsIGRldi0+c3lzZnNfZW50cnksICJpdGVyYXRpb25fY291bnQiKTsKKwkJdC0+ZmRzW2Zkc19pZHhdLmZkID0gb3BlbihidWYsIE9fUkRPTkxZKTsKKwkJaWYgKHQtPmZkc1tmZHNfaWR4XS5mZCA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiRXJyb3Igb3BlbmluZyBwb2xsIGZpbGUhXG4iKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCXJlYWQodC0+ZmRzW2Zkc19pZHhdLmZkLCAmZHVtbXksIDEpOworCQl0LT5mZHNbZmRzX2lkeF0uZXZlbnRzID0gUE9MTEVSUnxQT0xMUFJJOworCQl0LT5mZHNbZmRzX2lkeF0ucmV2ZW50cyA9IDA7CisJCWZkc19pZHgrKzsKKwl9CisKKwl0LT5wb2xsX2NvdW50ID0gZmRzX2lkeDsKKworCXJldHVybiAwOworCitlcnI6CisJZm9yIChpID0gMDsgaSA8IGZkc19pZHg7IGkrKykKKwkJY2xvc2UodC0+ZmRzW2Zkc19pZHhdLmZkKTsKKworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBjbG9zZV9wb2xsX2ZpbGVzKHN0cnVjdCBsb29wYmFja190ZXN0ICp0KQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCB0LT5wb2xsX2NvdW50OyBpKyspCisJCWNsb3NlKHQtPmZkc1tpXS5mZCk7CisKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgaXNfY29tcGxldGUoc3RydWN0IGxvb3BiYWNrX3Rlc3QgKnQpCit7CisJaW50IGl0ZXJhdGlvbl9jb3VudDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB0LT5kZXZpY2VfY291bnQ7IGkrKykgeworCQlpZiAoIWRldmljZV9lbmFibGVkKHQsIGkpKQorCQkJY29udGludWU7CisKKwkJaXRlcmF0aW9uX2NvdW50ID0gcmVhZF9zeXNmc19pbnQodC0+ZGV2aWNlc1tpXS5zeXNmc19lbnRyeSwKKwkJCQkJCSAiaXRlcmF0aW9uX2NvdW50Iik7CisKKwkJLyogYXQgbGVhc3Qgb25lIGRldmljZSBkaWQgbm90IGZpbmlzaCB5ZXQgKi8KKwkJaWYgKGl0ZXJhdGlvbl9jb3VudCAhPSB0LT5pdGVyYXRpb25fbWF4KQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHN0b3BfdGVzdHMoc3RydWN0IGxvb3BiYWNrX3Rlc3QgKnQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdC0+ZGV2aWNlX2NvdW50OyBpKyspIHsKKwkJaWYgKCFkZXZpY2VfZW5hYmxlZCh0LCBpKSkKKwkJCWNvbnRpbnVlOworCQl3cml0ZV9zeXNmc192YWwodC0+ZGV2aWNlc1tpXS5zeXNmc19lbnRyeSwgInR5cGUiLCAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZXIoaW50IHNpZykgeyAvKiBkbyBub3RoaW5nICovICB9CisKK3N0YXRpYyBpbnQgd2FpdF9mb3JfY29tcGxldGUoc3RydWN0IGxvb3BiYWNrX3Rlc3QgKnQpCit7CisJaW50IG51bWJlcl9vZl9ldmVudHMgPSAwOworCWNoYXIgZHVtbXk7CisJaW50IHJldDsKKwlpbnQgaTsKKwlzdHJ1Y3QgdGltZXNwZWMgKnRzID0gTlVMTDsKKwlzdHJ1Y3Qgc2lnYWN0aW9uIHNhOworCXNpZ3NldF90IG1hc2tfb2xkLCBtYXNrOworCisJc2lnZW1wdHlzZXQoJm1hc2spOworCXNpZ2VtcHR5c2V0KCZtYXNrX29sZCk7CisJc2lnYWRkc2V0KCZtYXNrLCBTSUdJTlQpOworCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJm1hc2ssICZtYXNrX29sZCk7CisKKwlzYS5zYV9oYW5kbGVyID0gaGFuZGxlcjsKKwlzYS5zYV9mbGFncyA9IDA7CisJc2lnZW1wdHlzZXQoJnNhLnNhX21hc2spOworCWlmIChzaWdhY3Rpb24oU0lHSU5ULCAmc2EsIE5VTEwpID09IC0xKSB7CisJCWZwcmludGYoc3RkZXJyLCAic2lnYWN0aW9uIGVycm9yXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICh0LT5wb2xsX3RpbWVvdXQudHZfc2VjICE9IDApCisJCXRzID0gJnQtPnBvbGxfdGltZW91dDsKKworCXdoaWxlICgxKSB7CisKKwkJcmV0ID0gcHBvbGwodC0+ZmRzLCB0LT5wb2xsX2NvdW50LCB0cywgJm1hc2tfb2xkKTsKKwkJaWYgKHJldCA8PSAwKSB7CisJCQlzdG9wX3Rlc3RzKHQpOworCQkJZnByaW50ZihzdGRlcnIsICJQb2xsIGV4aXQgd2l0aCBlcnJubyAlZFxuIiwgZXJybm8pOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IHQtPnBvbGxfY291bnQ7IGkrKykgeworCQkJaWYgKHQtPmZkc1tpXS5yZXZlbnRzICYgUE9MTFBSSSkgeworCQkJCS8qIER1bW15IHJlYWQgdG8gY2xlYXIgdGhlIGV2ZW50ICovCisJCQkJcmVhZCh0LT5mZHNbaV0uZmQsICZkdW1teSwgMSk7CisJCQkJbnVtYmVyX29mX2V2ZW50cysrOworCQkJfQorCQl9CisKKwkJaWYgKG51bWJlcl9vZl9ldmVudHMgPT0gdC0+cG9sbF9jb3VudCkKKwkJCWJyZWFrOworCX0KKworCWlmICghaXNfY29tcGxldGUodCkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJJdGVyYXRpb24gY291bnQgZGlkIG5vdCBmaW5pc2ghXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcmVwYXJlX2RldmljZXMoc3RydWN0IGxvb3BiYWNrX3Rlc3QgKnQpCit7CisJaW50IGk7CisKKwkvKiBDYW5jZWwgYW55IHJ1bm5pbmcgdGVzdHMgb24gZW5hYmxlZCBkZXZpY2VzLiBJZgorCSAqIHN0b3BfYWxsIG9wdGlvbiBpcyBnaXZlbiwgc3RvcCB0ZXN0IG9uIGFsbCBkZXZpY2VzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCB0LT5kZXZpY2VfY291bnQ7IGkrKykKKwkJaWYgKHQtPnN0b3BfYWxsIHx8IGRldmljZV9lbmFibGVkKHQsIGkpKQorCQkJd3JpdGVfc3lzZnNfdmFsKHQtPmRldmljZXNbaV0uc3lzZnNfZW50cnksICJ0eXBlIiwgMCk7CisKKworCWZvciAoaSA9IDA7IGkgPCB0LT5kZXZpY2VfY291bnQ7IGkrKykgeworCQlpZiAoIWRldmljZV9lbmFibGVkKHQsIGkpKQorCQkJY29udGludWU7CisKKwkJd3JpdGVfc3lzZnNfdmFsKHQtPmRldmljZXNbaV0uc3lzZnNfZW50cnksICJ1c193YWl0IiwKKwkJCQl0LT51c193YWl0KTsKKworCQkvKiBTZXQgb3BlcmF0aW9uIHNpemUgKi8KKwkJd3JpdGVfc3lzZnNfdmFsKHQtPmRldmljZXNbaV0uc3lzZnNfZW50cnksICJzaXplIiwgdC0+c2l6ZSk7CisKKwkJLyogU2V0IGl0ZXJhdGlvbnMgKi8KKwkJd3JpdGVfc3lzZnNfdmFsKHQtPmRldmljZXNbaV0uc3lzZnNfZW50cnksICJpdGVyYXRpb25fbWF4IiwKKwkJCQl0LT5pdGVyYXRpb25fbWF4KTsKKworCQlpZiAodC0+dXNlX2FzeW5jKSB7CisJCQl3cml0ZV9zeXNmc192YWwodC0+ZGV2aWNlc1tpXS5zeXNmc19lbnRyeSwKKwkJCQkiYXN5bmMiLCAxKTsKKwkJCXdyaXRlX3N5c2ZzX3ZhbCh0LT5kZXZpY2VzW2ldLnN5c2ZzX2VudHJ5LAorCQkJCSJ0aW1lb3V0IiwgdC0+YXN5bmNfdGltZW91dCk7CisJCQl3cml0ZV9zeXNmc192YWwodC0+ZGV2aWNlc1tpXS5zeXNmc19lbnRyeSwKKwkJCQkib3V0c3RhbmRpbmdfb3BlcmF0aW9uc19tYXgiLAorCQkJCXQtPmFzeW5jX291dHN0YW5kaW5nX29wZXJhdGlvbnMpOworCQl9IGVsc2UKKwkJCXdyaXRlX3N5c2ZzX3ZhbCh0LT5kZXZpY2VzW2ldLnN5c2ZzX2VudHJ5LAorCQkJCSJhc3luYyIsIDApOworCX0KK30KKworc3RhdGljIGludCBzdGFydChzdHJ1Y3QgbG9vcGJhY2tfdGVzdCAqdCkKK3sKKwlpbnQgaTsKKworCS8qIHRoZSB0ZXN0IHN0YXJ0cyBieSB3cml0aW5nIHRlc3RfaWQgdG8gdGhlIHR5cGUgZmlsZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgdC0+ZGV2aWNlX2NvdW50OyBpKyspIHsKKwkJaWYgKCFkZXZpY2VfZW5hYmxlZCh0LCBpKSkKKwkJCWNvbnRpbnVlOworCisJCXdyaXRlX3N5c2ZzX3ZhbCh0LT5kZXZpY2VzW2ldLnN5c2ZzX2VudHJ5LCAidHlwZSIsIHQtPnRlc3RfaWQpOworCX0KKworCXJldHVybiAwOworfQorCisKK3ZvaWQgbG9vcGJhY2tfcnVuKHN0cnVjdCBsb29wYmFja190ZXN0ICp0KQoreworCWludCBpOworCWludCByZXQ7CisKKwlmb3IgKGkgPSAwOyBkaWN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7CisJCWlmIChzdHJzdHIoZGljdFtpXS5uYW1lLCB0LT50ZXN0X25hbWUpKQorCQkJdC0+dGVzdF9pZCA9IGRpY3RbaV0udHlwZTsKKwl9CisJaWYgKCF0LT50ZXN0X2lkKSB7CisJCWZwcmludGYoc3RkZXJyLCAiaW52YWxpZCB0ZXN0ICVzXG4iLCB0LT50ZXN0X25hbWUpOworCQl1c2FnZSgpOworCQlyZXR1cm47CisJfQorCisJcHJlcGFyZV9kZXZpY2VzKHQpOworCisJcmV0ID0gb3Blbl9wb2xsX2ZpbGVzKHQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJc3RhcnQodCk7CisKKwlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0ZSh0KTsKKwljbG9zZV9wb2xsX2ZpbGVzKHQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisKKwlnZXRfcmVzdWx0cyh0KTsKKworCWxvZ19yZXN1bHRzKHQpOworCisJcmV0dXJuOworCitlcnI6CisJcHJpbnRmKCJFcnJvciBydW5uaW5nIHRlc3RcbiIpOworCXJldHVybjsKK30KKworc3RhdGljIGludCBzYW5pdHlfY2hlY2soc3RydWN0IGxvb3BiYWNrX3Rlc3QgKnQpCit7CisJaW50IGk7CisKKwlpZiAodC0+ZGV2aWNlX2NvdW50ID09IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJObyBsb29wYmFjayBkZXZpY2VzIGZvdW5kXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX0RFVklDRVM7IGkrKykgeworCQlpZiAoIWRldmljZV9lbmFibGVkKHQsIGkpKQorCQkJY29udGludWU7CisKKwkJaWYgKHQtPm1hc2sgJiYgIXN0cmNtcCh0LT5kZXZpY2VzW2ldLm5hbWUsICIiKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJCYWQgZGV2aWNlIG1hc2sgJXhcbiIsICgxIDw8IGkpKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJfQorCisKKwlyZXR1cm4gMDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgbywgcmV0OworCWNoYXIgKnN5c2ZzX3ByZWZpeCA9ICIvc3lzL2NsYXNzL2diX2xvb3BiYWNrLyI7CisJY2hhciAqZGVidWdmc19wcmVmaXggPSAiL3N5cy9rZXJuZWwvZGVidWcvZ2JfbG9vcGJhY2svIjsKKworCW1lbXNldCgmdCwgMCwgc2l6ZW9mKHQpKTsKKworCXdoaWxlICgobyA9IGdldG9wdChhcmdjLCBhcmd2LAorCQkJICAgInQ6czppOlM6RDptOnY6OmQ6OnI6OnA6OmE6Omw6Ong6Om86TzpjOnc6ejo6Zjo6IikpICE9IC0xKSB7CisJCXN3aXRjaCAobykgeworCQljYXNlICd0JzoKKwkJCXNucHJpbnRmKHQudGVzdF9uYW1lLCBNQVhfU1RSX0xFTiwgIiVzIiwgb3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdzJzoKKwkJCXQuc2l6ZSA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdpJzoKKwkJCXQuaXRlcmF0aW9uX21heCA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdTJzoKKwkJCXNucHJpbnRmKHQuc3lzZnNfcHJlZml4LCBNQVhfU1lTRlNfUEFUSCwgIiVzIiwgb3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdEJzoKKwkJCXNucHJpbnRmKHQuZGVidWdmc19wcmVmaXgsIE1BWF9TWVNGU19QQVRILCAiJXMiLCBvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ20nOgorCQkJdC5tYXNrID0gYXRvbChvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ3YnOgorCQkJdC52ZXJib3NlID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCXQuZGVidWcgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJdC5yYXdfZGF0YV9kdW1wID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdwJzoKKwkJCXQucG9yY2VsYWluID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdhJzoKKwkJCXQuYWdncmVnYXRlX291dHB1dCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQl0Lmxpc3RfZGV2aWNlcyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAneCc6CisJCQl0LnVzZV9hc3luYyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnbyc6CisJCQl0LmFzeW5jX3RpbWVvdXQgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnTyc6CisJCQl0LnBvbGxfdGltZW91dC50dl9zZWMgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnYyc6CisJCQl0LmFzeW5jX291dHN0YW5kaW5nX29wZXJhdGlvbnMgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAndyc6CisJCQl0LnVzX3dhaXQgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAneic6CisJCQl0LmZpbGVfb3V0cHV0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdmJzoKKwkJCXQuc3RvcF9hbGwgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl1c2FnZSgpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlpZiAoIXN0cmNtcCh0LnN5c2ZzX3ByZWZpeCwgIiIpKQorCQlzbnByaW50Zih0LnN5c2ZzX3ByZWZpeCwgTUFYX1NZU0ZTX1BBVEgsICIlcyIsIHN5c2ZzX3ByZWZpeCk7CisKKwlpZiAoIXN0cmNtcCh0LmRlYnVnZnNfcHJlZml4LCAiIikpCisJCXNucHJpbnRmKHQuZGVidWdmc19wcmVmaXgsIE1BWF9TWVNGU19QQVRILCAiJXMiLCBkZWJ1Z2ZzX3ByZWZpeCk7CisKKwlyZXQgPSBmaW5kX2xvb3BiYWNrX2RldmljZXMoJnQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gc2FuaXR5X2NoZWNrKCZ0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKHQubGlzdF9kZXZpY2VzKSB7CisJCXNob3dfbG9vcGJhY2tfZGV2aWNlcygmdCk7CisJCXJldHVybiAwOworCX0KKworCWlmICh0LnRlc3RfbmFtZVswXSA9PSAnXDAnIHx8IHQuaXRlcmF0aW9uX21heCA9PSAwKQorCQl1c2FnZSgpOworCisJaWYgKHQuYXN5bmNfdGltZW91dCA9PSAwKQorCQl0LmFzeW5jX3RpbWVvdXQgPSBERUZBVUxUX0FTWU5DX1RJTUVPVVQ7CisKKwlsb29wYmFja19ydW4oJnQpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy91YXJ0LmMgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy91YXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVlNzk1NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3VhcnQuYwpAQCAtMCwwICsxLDEwNzUgQEAKKy8qCisgKiBVQVJUIGRyaXZlciBmb3IgdGhlIEdyZXlidXMgImdlbmVyaWMiIFVBUlQgbW9kdWxlLgorICoKKyAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgMjAxNCBMaW5hcm8gTHRkLgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MiBvbmx5LgorICoKKyAqIEhlYXZpbHkgYmFzZWQgb24gZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jIGFuZAorICogZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYy4KKyAqLworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKworI2luY2x1ZGUgImdyZXlidXMuaCIKKyNpbmNsdWRlICJnYnBoeS5oIgorCisjZGVmaW5lIEdCX05VTV9NSU5PUlMJMTYJLyogMTYgaXMgaXMgbW9yZSB0aGFuIGVub3VnaCAqLworI2RlZmluZSBHQl9OQU1FCQkidHR5R0IiCisKKyNkZWZpbmUgR0JfVUFSVF9XUklURV9GSUZPX1NJWkUJCVBBR0VfU0laRQorI2RlZmluZSBHQl9VQVJUX1dSSVRFX1JPT01fTUFSR0lOCTEJLyogbGVhdmUgc29tZSBzcGFjZSBpbiBmaWZvICovCisjZGVmaW5lIEdCX1VBUlRfRklSTVdBUkVfQ1JFRElUUwk0MDk2CisjZGVmaW5lIEdCX1VBUlRfQ1JFRElUX1dBSVRfVElNRU9VVF9NU0VDCTEwMDAwCisKK3N0cnVjdCBnYl90dHlfbGluZV9jb2RpbmcgeworCV9fbGUzMglyYXRlOworCV9fdTgJZm9ybWF0OworCV9fdTgJcGFyaXR5OworCV9fdTgJZGF0YV9iaXRzOworCV9fdTgJZmxvd19jb250cm9sOworfTsKKworc3RydWN0IGdiX3R0eSB7CisJc3RydWN0IGdicGh5X2RldmljZSAqZ2JwaHlfZGV2OworCXN0cnVjdCB0dHlfcG9ydCBwb3J0OworCXZvaWQgKmJ1ZmZlcjsKKwlzaXplX3QgYnVmZmVyX3BheWxvYWRfbWF4OworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCXUxNiBjcG9ydF9pZDsKKwl1bnNpZ25lZCBpbnQgbWlub3I7CisJdW5zaWduZWQgY2hhciBjbG9jYWw7CisJYm9vbCBkaXNjb25uZWN0ZWQ7CisJc3BpbmxvY2tfdCByZWFkX2xvY2s7CisJc3BpbmxvY2tfdCB3cml0ZV9sb2NrOworCXN0cnVjdCBhc3luY19pY291bnQgaW9jb3VudDsKKwlzdHJ1Y3QgYXN5bmNfaWNvdW50IG9sZGNvdW50OworCXdhaXRfcXVldWVfaGVhZF90IHdpb2N0bDsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJdTggY3RybGluOwkvKiBpbnB1dCBjb250cm9sIGxpbmVzICovCisJdTggY3RybG91dDsJLyogb3V0cHV0IGNvbnRyb2wgbGluZXMgKi8KKwlzdHJ1Y3QgZ2JfdHR5X2xpbmVfY29kaW5nIGxpbmVfY29kaW5nOworCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF93b3JrOworCXN0cnVjdCBrZmlmbyB3cml0ZV9maWZvOworCWJvb2wgY2xvc2VfcGVuZGluZzsKKwl1bnNpZ25lZCBpbnQgY3JlZGl0czsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjcmVkaXRzX2NvbXBsZXRlOworfTsKKworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpnYl90dHlfZHJpdmVyOworc3RhdGljIERFRklORV9JRFIodHR5X21pbm9ycyk7CitzdGF0aWMgREVGSU5FX01VVEVYKHRhYmxlX2xvY2spOworCitzdGF0aWMgaW50IGdiX3VhcnRfcmVjZWl2ZV9kYXRhX2hhbmRsZXIoc3RydWN0IGdiX29wZXJhdGlvbiAqb3ApCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBvcC0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfdHR5ICpnYl90dHkgPSBnYl9jb25uZWN0aW9uX2dldF9kYXRhKGNvbm5lY3Rpb24pOworCXN0cnVjdCB0dHlfcG9ydCAqcG9ydCA9ICZnYl90dHktPnBvcnQ7CisJc3RydWN0IGdiX21lc3NhZ2UgKnJlcXVlc3QgPSBvcC0+cmVxdWVzdDsKKwlzdHJ1Y3QgZ2JfdWFydF9yZWN2X2RhdGFfcmVxdWVzdCAqcmVjZWl2ZV9kYXRhOworCXUxNiByZWN2X2RhdGFfc2l6ZTsKKwlpbnQgY291bnQ7CisJdW5zaWduZWQgbG9uZyB0dHlfZmxhZ3MgPSBUVFlfTk9STUFMOworCisJaWYgKHJlcXVlc3QtPnBheWxvYWRfc2l6ZSA8IHNpemVvZigqcmVjZWl2ZV9kYXRhKSkgeworCQlkZXZfZXJyKCZnYl90dHktPmdicGh5X2Rldi0+ZGV2LAorCQkJInNob3J0IHJlY2VpdmUtZGF0YSByZXF1ZXN0IHJlY2VpdmVkICglenUgPCAlenUpXG4iLAorCQkJcmVxdWVzdC0+cGF5bG9hZF9zaXplLCBzaXplb2YoKnJlY2VpdmVfZGF0YSkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZWNlaXZlX2RhdGEgPSBvcC0+cmVxdWVzdC0+cGF5bG9hZDsKKwlyZWN2X2RhdGFfc2l6ZSA9IGxlMTZfdG9fY3B1KHJlY2VpdmVfZGF0YS0+c2l6ZSk7CisKKwlpZiAocmVjdl9kYXRhX3NpemUgIT0gcmVxdWVzdC0+cGF5bG9hZF9zaXplIC0gc2l6ZW9mKCpyZWNlaXZlX2RhdGEpKSB7CisJCWRldl9lcnIoJmdiX3R0eS0+Z2JwaHlfZGV2LT5kZXYsCisJCQkibWFsZm9ybWVkIHJlY2VpdmUtZGF0YSByZXF1ZXN0IHJlY2VpdmVkICgldSAhPSAlenUpXG4iLAorCQkJcmVjdl9kYXRhX3NpemUsCisJCQlyZXF1ZXN0LT5wYXlsb2FkX3NpemUgLSBzaXplb2YoKnJlY2VpdmVfZGF0YSkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXJlY3ZfZGF0YV9zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChyZWNlaXZlX2RhdGEtPmZsYWdzKSB7CisJCWlmIChyZWNlaXZlX2RhdGEtPmZsYWdzICYgR0JfVUFSVF9SRUNWX0ZMQUdfQlJFQUspCisJCQl0dHlfZmxhZ3MgPSBUVFlfQlJFQUs7CisJCWVsc2UgaWYgKHJlY2VpdmVfZGF0YS0+ZmxhZ3MgJiBHQl9VQVJUX1JFQ1ZfRkxBR19QQVJJVFkpCisJCQl0dHlfZmxhZ3MgPSBUVFlfUEFSSVRZOworCQllbHNlIGlmIChyZWNlaXZlX2RhdGEtPmZsYWdzICYgR0JfVUFSVF9SRUNWX0ZMQUdfRlJBTUlORykKKwkJCXR0eV9mbGFncyA9IFRUWV9GUkFNRTsKKworCQkvKiBvdmVycnVuIGlzIHNwZWNpYWwsIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBjaGFyICovCisJCWlmIChyZWNlaXZlX2RhdGEtPmZsYWdzICYgR0JfVUFSVF9SRUNWX0ZMQUdfT1ZFUlJVTikKKwkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHBvcnQsIDAsIFRUWV9PVkVSUlVOKTsKKwl9CisJY291bnQgPSB0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nX2ZpeGVkX2ZsYWcocG9ydCwgcmVjZWl2ZV9kYXRhLT5kYXRhLAorCQkJCQkJICB0dHlfZmxhZ3MsIHJlY3ZfZGF0YV9zaXplKTsKKwlpZiAoY291bnQgIT0gcmVjdl9kYXRhX3NpemUpIHsKKwkJZGV2X2VycigmZ2JfdHR5LT5nYnBoeV9kZXYtPmRldiwKKwkJCSJVQVJUOiBSWCAweCUwOHggYnl0ZXMgb25seSB3cm90ZSAweCUwOHhcbiIsCisJCQlyZWN2X2RhdGFfc2l6ZSwgY291bnQpOworCX0KKwlpZiAoY291bnQpCisJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHBvcnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdiX3VhcnRfc2VyaWFsX3N0YXRlX2hhbmRsZXIoc3RydWN0IGdiX29wZXJhdGlvbiAqb3ApCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBvcC0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JfdHR5ICpnYl90dHkgPSBnYl9jb25uZWN0aW9uX2dldF9kYXRhKGNvbm5lY3Rpb24pOworCXN0cnVjdCBnYl9tZXNzYWdlICpyZXF1ZXN0ID0gb3AtPnJlcXVlc3Q7CisJc3RydWN0IGdiX3VhcnRfc2VyaWFsX3N0YXRlX3JlcXVlc3QgKnNlcmlhbF9zdGF0ZTsKKworCWlmIChyZXF1ZXN0LT5wYXlsb2FkX3NpemUgPCBzaXplb2YoKnNlcmlhbF9zdGF0ZSkpIHsKKwkJZGV2X2VycigmZ2JfdHR5LT5nYnBoeV9kZXYtPmRldiwKKwkJCSJzaG9ydCBzZXJpYWwtc3RhdGUgZXZlbnQgcmVjZWl2ZWQgKCV6dSA8ICV6dSlcbiIsCisJCQlyZXF1ZXN0LT5wYXlsb2FkX3NpemUsIHNpemVvZigqc2VyaWFsX3N0YXRlKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNlcmlhbF9zdGF0ZSA9IHJlcXVlc3QtPnBheWxvYWQ7CisJZ2JfdHR5LT5jdHJsaW4gPSBzZXJpYWxfc3RhdGUtPmNvbnRyb2w7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl91YXJ0X3JlY2VpdmVfY3JlZGl0c19oYW5kbGVyKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gb3AtPmNvbm5lY3Rpb247CisJc3RydWN0IGdiX3R0eSAqZ2JfdHR5ID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShjb25uZWN0aW9uKTsKKwlzdHJ1Y3QgZ2JfbWVzc2FnZSAqcmVxdWVzdCA9IG9wLT5yZXF1ZXN0OworCXN0cnVjdCBnYl91YXJ0X3JlY2VpdmVfY3JlZGl0c19yZXF1ZXN0ICpjcmVkaXRfcmVxdWVzdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBpbmNvbWluZ19jcmVkaXRzOworCWludCByZXQgPSAwOworCisJaWYgKHJlcXVlc3QtPnBheWxvYWRfc2l6ZSA8IHNpemVvZigqY3JlZGl0X3JlcXVlc3QpKSB7CisJCWRldl9lcnIoJmdiX3R0eS0+Z2JwaHlfZGV2LT5kZXYsCisJCQkic2hvcnQgcmVjZWl2ZV9jcmVkaXRzIGV2ZW50IHJlY2VpdmVkICglenUgPCAlenUpXG4iLAorCQkJcmVxdWVzdC0+cGF5bG9hZF9zaXplLAorCQkJc2l6ZW9mKCpjcmVkaXRfcmVxdWVzdCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljcmVkaXRfcmVxdWVzdCA9IHJlcXVlc3QtPnBheWxvYWQ7CisJaW5jb21pbmdfY3JlZGl0cyA9IGxlMTZfdG9fY3B1KGNyZWRpdF9yZXF1ZXN0LT5jb3VudCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ2JfdHR5LT53cml0ZV9sb2NrLCBmbGFncyk7CisJZ2JfdHR5LT5jcmVkaXRzICs9IGluY29taW5nX2NyZWRpdHM7CisJaWYgKGdiX3R0eS0+Y3JlZGl0cyA+IEdCX1VBUlRfRklSTVdBUkVfQ1JFRElUUykgeworCQlnYl90dHktPmNyZWRpdHMgLT0gaW5jb21pbmdfY3JlZGl0czsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2JfdHR5LT53cml0ZV9sb2NrLCBmbGFncyk7CisKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmdiX3R0eS0+Z2JwaHlfZGV2LT5kZXYsCisJCQkiaW52YWxpZCBudW1iZXIgb2YgaW5jb21pbmcgY3JlZGl0czogJWRcbiIsCisJCQlpbmNvbWluZ19jcmVkaXRzKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoIWdiX3R0eS0+Y2xvc2VfcGVuZGluZykKKwkJc2NoZWR1bGVfd29yaygmZ2JfdHR5LT50eF93b3JrKTsKKworCS8qCisJICogdGhlIHBvcnQgdGhlIHR0eSBsYXllciBtYXkgYmUgd2FpdGluZyBmb3IgY3JlZGl0cworCSAqLworCXR0eV9wb3J0X3R0eV93YWtldXAoJmdiX3R0eS0+cG9ydCk7CisKKwlpZiAoZ2JfdHR5LT5jcmVkaXRzID09IEdCX1VBUlRfRklSTVdBUkVfQ1JFRElUUykKKwkJY29tcGxldGUoJmdiX3R0eS0+Y3JlZGl0c19jb21wbGV0ZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdiX3VhcnRfcmVxdWVzdF9oYW5kbGVyKHN0cnVjdCBnYl9vcGVyYXRpb24gKm9wKQoreworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gb3AtPmNvbm5lY3Rpb247CisJc3RydWN0IGdiX3R0eSAqZ2JfdHR5ID0gZ2JfY29ubmVjdGlvbl9nZXRfZGF0YShjb25uZWN0aW9uKTsKKwlpbnQgdHlwZSA9IG9wLT50eXBlOworCWludCByZXQ7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEdCX1VBUlRfVFlQRV9SRUNFSVZFX0RBVEE6CisJCXJldCA9IGdiX3VhcnRfcmVjZWl2ZV9kYXRhX2hhbmRsZXIob3ApOworCQlicmVhazsKKwljYXNlIEdCX1VBUlRfVFlQRV9TRVJJQUxfU1RBVEU6CisJCXJldCA9IGdiX3VhcnRfc2VyaWFsX3N0YXRlX2hhbmRsZXIob3ApOworCQlicmVhazsKKwljYXNlIEdCX1VBUlRfVFlQRV9SRUNFSVZFX0NSRURJVFM6CisJCXJldCA9IGdiX3VhcnRfcmVjZWl2ZV9jcmVkaXRzX2hhbmRsZXIob3ApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZnYl90dHktPmdicGh5X2Rldi0+ZGV2LAorCQkJInVuc3VwcG9ydGVkIHVuc29saWNpdGVkIHJlcXVlc3Q6IDB4JTAyeFxuIiwgdHlwZSk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgIGdiX3VhcnRfdHhfd3JpdGVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGdiX3VhcnRfc2VuZF9kYXRhX3JlcXVlc3QgKnJlcXVlc3Q7CisJc3RydWN0IGdiX3R0eSAqZ2JfdHR5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHNlbmRfc2l6ZTsKKwlpbnQgcmV0OworCisJZ2JfdHR5ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBnYl90dHksIHR4X3dvcmspOworCXJlcXVlc3QgPSBnYl90dHktPmJ1ZmZlcjsKKworCXdoaWxlICgxKSB7CisJCWlmIChnYl90dHktPmNsb3NlX3BlbmRpbmcpCisJCQlicmVhazsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ2JfdHR5LT53cml0ZV9sb2NrLCBmbGFncyk7CisJCXNlbmRfc2l6ZSA9IGdiX3R0eS0+YnVmZmVyX3BheWxvYWRfbWF4OworCQlpZiAoc2VuZF9zaXplID4gZ2JfdHR5LT5jcmVkaXRzKQorCQkJc2VuZF9zaXplID0gZ2JfdHR5LT5jcmVkaXRzOworCisJCXNlbmRfc2l6ZSA9IGtmaWZvX291dF9wZWVrKCZnYl90dHktPndyaXRlX2ZpZm8sCisJCQkJCSAgICZyZXF1ZXN0LT5kYXRhWzBdLAorCQkJCQkgICBzZW5kX3NpemUpOworCQlpZiAoIXNlbmRfc2l6ZSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2JfdHR5LT53cml0ZV9sb2NrLCBmbGFncyk7CisJCQlicmVhazsKKwkJfQorCisJCWdiX3R0eS0+Y3JlZGl0cyAtPSBzZW5kX3NpemU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdiX3R0eS0+d3JpdGVfbG9jaywgZmxhZ3MpOworCisJCXJlcXVlc3QtPnNpemUgPSBjcHVfdG9fbGUxNihzZW5kX3NpemUpOworCQlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhnYl90dHktPmNvbm5lY3Rpb24sCisJCQkJCUdCX1VBUlRfVFlQRV9TRU5EX0RBVEEsCisJCQkJCXJlcXVlc3QsIHNpemVvZigqcmVxdWVzdCkgKyBzZW5kX3NpemUsCisJCQkJCU5VTEwsIDApOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZnYl90dHktPmdicGh5X2Rldi0+ZGV2LAorCQkJCSJzZW5kIGRhdGEgZXJyb3I6ICVkXG4iLCByZXQpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmdiX3R0eS0+d3JpdGVfbG9jaywgZmxhZ3MpOworCQkJZ2JfdHR5LT5jcmVkaXRzICs9IHNlbmRfc2l6ZTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdiX3R0eS0+d3JpdGVfbG9jaywgZmxhZ3MpOworCQkJaWYgKCFnYl90dHktPmNsb3NlX3BlbmRpbmcpCisJCQkJc2NoZWR1bGVfd29yayh3b3JrKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZnYl90dHktPndyaXRlX2xvY2ssIGZsYWdzKTsKKwkJcmV0ID0ga2ZpZm9fb3V0KCZnYl90dHktPndyaXRlX2ZpZm8sICZyZXF1ZXN0LT5kYXRhWzBdLAorCQkJCXNlbmRfc2l6ZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdiX3R0eS0+d3JpdGVfbG9jaywgZmxhZ3MpOworCisJCXR0eV9wb3J0X3R0eV93YWtldXAoJmdiX3R0eS0+cG9ydCk7CisJfQorfQorCitzdGF0aWMgaW50IHNlbmRfbGluZV9jb2Rpbmcoc3RydWN0IGdiX3R0eSAqdHR5KQoreworCXN0cnVjdCBnYl91YXJ0X3NldF9saW5lX2NvZGluZ19yZXF1ZXN0IHJlcXVlc3Q7CisKKwltZW1jcHkoJnJlcXVlc3QsICZ0dHktPmxpbmVfY29kaW5nLAorCSAgICAgICBzaXplb2YodHR5LT5saW5lX2NvZGluZykpOworCXJldHVybiBnYl9vcGVyYXRpb25fc3luYyh0dHktPmNvbm5lY3Rpb24sIEdCX1VBUlRfVFlQRV9TRVRfTElORV9DT0RJTkcsCisJCQkJICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksIE5VTEwsIDApOworfQorCitzdGF0aWMgaW50IHNlbmRfY29udHJvbChzdHJ1Y3QgZ2JfdHR5ICpnYl90dHksIHU4IGNvbnRyb2wpCit7CisJc3RydWN0IGdiX3VhcnRfc2V0X2NvbnRyb2xfbGluZV9zdGF0ZV9yZXF1ZXN0IHJlcXVlc3Q7CisKKwlyZXF1ZXN0LmNvbnRyb2wgPSBjb250cm9sOworCXJldHVybiBnYl9vcGVyYXRpb25fc3luYyhnYl90dHktPmNvbm5lY3Rpb24sCisJCQkJIEdCX1VBUlRfVFlQRV9TRVRfQ09OVFJPTF9MSU5FX1NUQVRFLAorCQkJCSAmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLCBOVUxMLCAwKTsKK30KKworc3RhdGljIGludCBzZW5kX2JyZWFrKHN0cnVjdCBnYl90dHkgKmdiX3R0eSwgdTggc3RhdGUpCit7CisJc3RydWN0IGdiX3VhcnRfc2V0X2JyZWFrX3JlcXVlc3QgcmVxdWVzdDsKKworCWlmICgoc3RhdGUgIT0gMCkgJiYgKHN0YXRlICE9IDEpKSB7CisJCWRldl9lcnIoJmdiX3R0eS0+Z2JwaHlfZGV2LT5kZXYsCisJCQkiaW52YWxpZCBicmVhayBzdGF0ZSBvZiAlZFxuIiwgc3RhdGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXF1ZXN0LnN0YXRlID0gc3RhdGU7CisJcmV0dXJuIGdiX29wZXJhdGlvbl9zeW5jKGdiX3R0eS0+Y29ubmVjdGlvbiwgR0JfVUFSVF9UWVBFX1NFTkRfQlJFQUssCisJCQkJICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksIE5VTEwsIDApOworfQorCitzdGF0aWMgaW50IGdiX3VhcnRfd2FpdF9mb3JfYWxsX2NyZWRpdHMoc3RydWN0IGdiX3R0eSAqZ2JfdHR5KQoreworCWludCByZXQ7CisKKwlpZiAoZ2JfdHR5LT5jcmVkaXRzID09IEdCX1VBUlRfRklSTVdBUkVfQ1JFRElUUykKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmdiX3R0eS0+Y3JlZGl0c19jb21wbGV0ZSwKKwkJCW1zZWNzX3RvX2ppZmZpZXMoR0JfVUFSVF9DUkVESVRfV0FJVF9USU1FT1VUX01TRUMpKTsKKwlpZiAoIXJldCkgeworCQlkZXZfZXJyKCZnYl90dHktPmdicGh5X2Rldi0+ZGV2LAorCQkJInRpbWUgb3V0IHdhaXRpbmcgZm9yIGNyZWRpdHNcbiIpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnYl91YXJ0X2ZsdXNoKHN0cnVjdCBnYl90dHkgKmdiX3R0eSwgdTggZmxhZ3MpCit7CisJc3RydWN0IGdiX3VhcnRfc2VyaWFsX2ZsdXNoX3JlcXVlc3QgcmVxdWVzdDsKKworCXJlcXVlc3QuZmxhZ3MgPSBmbGFnczsKKwlyZXR1cm4gZ2Jfb3BlcmF0aW9uX3N5bmMoZ2JfdHR5LT5jb25uZWN0aW9uLCBHQl9VQVJUX1RZUEVfRkxVU0hfRklGT1MsCisJCQkJICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCksIE5VTEwsIDApOworfQorCitzdGF0aWMgc3RydWN0IGdiX3R0eSAqZ2V0X2diX2J5X21pbm9yKHVuc2lnbmVkIGludCBtaW5vcikKK3sKKwlzdHJ1Y3QgZ2JfdHR5ICpnYl90dHk7CisKKwltdXRleF9sb2NrKCZ0YWJsZV9sb2NrKTsKKwlnYl90dHkgPSBpZHJfZmluZCgmdHR5X21pbm9ycywgbWlub3IpOworCWlmIChnYl90dHkpIHsKKwkJbXV0ZXhfbG9jaygmZ2JfdHR5LT5tdXRleCk7CisJCWlmIChnYl90dHktPmRpc2Nvbm5lY3RlZCkgeworCQkJbXV0ZXhfdW5sb2NrKCZnYl90dHktPm11dGV4KTsKKwkJCWdiX3R0eSA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQl0dHlfcG9ydF9nZXQoJmdiX3R0eS0+cG9ydCk7CisJCQltdXRleF91bmxvY2soJmdiX3R0eS0+bXV0ZXgpOworCQl9CisJfQorCW11dGV4X3VubG9jaygmdGFibGVfbG9jayk7CisJcmV0dXJuIGdiX3R0eTsKK30KKworc3RhdGljIGludCBhbGxvY19taW5vcihzdHJ1Y3QgZ2JfdHR5ICpnYl90dHkpCit7CisJaW50IG1pbm9yOworCisJbXV0ZXhfbG9jaygmdGFibGVfbG9jayk7CisJbWlub3IgPSBpZHJfYWxsb2MoJnR0eV9taW5vcnMsIGdiX3R0eSwgMCwgR0JfTlVNX01JTk9SUywgR0ZQX0tFUk5FTCk7CisJbXV0ZXhfdW5sb2NrKCZ0YWJsZV9sb2NrKTsKKwlpZiAobWlub3IgPj0gMCkKKwkJZ2JfdHR5LT5taW5vciA9IG1pbm9yOworCXJldHVybiBtaW5vcjsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9taW5vcihzdHJ1Y3QgZ2JfdHR5ICpnYl90dHkpCit7CisJaW50IG1pbm9yID0gZ2JfdHR5LT5taW5vcjsKKworCWdiX3R0eS0+bWlub3IgPSAwOwkvKiBNYXliZSBzaG91bGQgdXNlIGFuIGludmFsaWQgdmFsdWUgaW5zdGVhZCAqLworCW11dGV4X2xvY2soJnRhYmxlX2xvY2spOworCWlkcl9yZW1vdmUoJnR0eV9taW5vcnMsIG1pbm9yKTsKKwltdXRleF91bmxvY2soJnRhYmxlX2xvY2spOworfQorCitzdGF0aWMgaW50IGdiX3R0eV9pbnN0YWxsKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGdiX3R0eSAqZ2JfdHR5OworCWludCByZXR2YWw7CisKKwlnYl90dHkgPSBnZXRfZ2JfYnlfbWlub3IodHR5LT5pbmRleCk7CisJaWYgKCFnYl90dHkpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dmFsID0gdHR5X3N0YW5kYXJkX2luc3RhbGwoZHJpdmVyLCB0dHkpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3I7CisKKwl0dHktPmRyaXZlcl9kYXRhID0gZ2JfdHR5OworCXJldHVybiAwOworZXJyb3I6CisJdHR5X3BvcnRfcHV0KCZnYl90dHktPnBvcnQpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZ2JfdHR5X29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGdiX3R0eSAqZ2JfdHR5ID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCXJldHVybiB0dHlfcG9ydF9vcGVuKCZnYl90dHktPnBvcnQsIHR0eSwgZmlsZSk7Cit9CisKK3N0YXRpYyB2b2lkIGdiX3R0eV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZ2JfdHR5ICpnYl90dHkgPSB0dHktPmRyaXZlcl9kYXRhOworCisJdHR5X3BvcnRfY2xvc2UoJmdiX3R0eS0+cG9ydCwgdHR5LCBmaWxlKTsKK30KKworc3RhdGljIHZvaWQgZ2JfdHR5X2NsZWFudXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgZ2JfdHR5ICpnYl90dHkgPSB0dHktPmRyaXZlcl9kYXRhOworCisJdHR5X3BvcnRfcHV0KCZnYl90dHktPnBvcnQpOworfQorCitzdGF0aWMgdm9pZCBnYl90dHlfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGdiX3R0eSAqZ2JfdHR5ID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCXR0eV9wb3J0X2hhbmd1cCgmZ2JfdHR5LT5wb3J0KTsKK30KKworc3RhdGljIGludCBnYl90dHlfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJaW50IGNvdW50KQoreworCXN0cnVjdCBnYl90dHkgKmdiX3R0eSA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwljb3VudCA9ICBrZmlmb19pbl9zcGlubG9ja2VkKCZnYl90dHktPndyaXRlX2ZpZm8sIGJ1ZiwgY291bnQsCisJCQkJICAgICAmZ2JfdHR5LT53cml0ZV9sb2NrKTsKKwlpZiAoY291bnQgJiYgIWdiX3R0eS0+Y2xvc2VfcGVuZGluZykKKwkJc2NoZWR1bGVfd29yaygmZ2JfdHR5LT50eF93b3JrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBnYl90dHlfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBnYl90dHkgKmdiX3R0eSA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcm9vbTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZnYl90dHktPndyaXRlX2xvY2ssIGZsYWdzKTsKKwlyb29tID0ga2ZpZm9fYXZhaWwoJmdiX3R0eS0+d3JpdGVfZmlmbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2JfdHR5LT53cml0ZV9sb2NrLCBmbGFncyk7CisKKwlyb29tIC09IEdCX1VBUlRfV1JJVEVfUk9PTV9NQVJHSU47CisJaWYgKHJvb20gPCAwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiByb29tOworfQorCitzdGF0aWMgaW50IGdiX3R0eV9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgZ2JfdHR5ICpnYl90dHkgPSB0dHktPmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNoYXJzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdiX3R0eS0+d3JpdGVfbG9jaywgZmxhZ3MpOworCWNoYXJzID0ga2ZpZm9fbGVuKCZnYl90dHktPndyaXRlX2ZpZm8pOworCWlmIChnYl90dHktPmNyZWRpdHMgPCBHQl9VQVJUX0ZJUk1XQVJFX0NSRURJVFMpCisJCWNoYXJzICs9IEdCX1VBUlRfRklSTVdBUkVfQ1JFRElUUyAtIGdiX3R0eS0+Y3JlZGl0czsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnYl90dHktPndyaXRlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBjaGFyczsKK30KKworc3RhdGljIGludCBnYl90dHlfYnJlYWtfY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgZ2JfdHR5ICpnYl90dHkgPSB0dHktPmRyaXZlcl9kYXRhOworCisJcmV0dXJuIHNlbmRfYnJlYWsoZ2JfdHR5LCBzdGF0ZSA/IDEgOiAwKTsKK30KKworc3RhdGljIHZvaWQgZ2JfdHR5X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCQkgICAgICAgc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zX29sZCkKK3sKKwlzdHJ1Y3QgZ2JfdHR5ICpnYl90dHkgPSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBrdGVybWlvcyAqdGVybWlvcyA9ICZ0dHktPnRlcm1pb3M7CisJc3RydWN0IGdiX3R0eV9saW5lX2NvZGluZyBuZXdsaW5lOworCXU4IG5ld2N0cmwgPSBnYl90dHktPmN0cmxvdXQ7CisKKwluZXdsaW5lLnJhdGUgPSBjcHVfdG9fbGUzMih0dHlfZ2V0X2JhdWRfcmF0ZSh0dHkpKTsKKwluZXdsaW5lLmZvcm1hdCA9IHRlcm1pb3MtPmNfY2ZsYWcgJiBDU1RPUEIgPworCQkJCUdCX1NFUklBTF8yX1NUT1BfQklUUyA6IEdCX1NFUklBTF8xX1NUT1BfQklUUzsKKwluZXdsaW5lLnBhcml0eSA9IHRlcm1pb3MtPmNfY2ZsYWcgJiBQQVJFTkIgPworCQkJCSh0ZXJtaW9zLT5jX2NmbGFnICYgUEFST0REID8gMSA6IDIpICsKKwkJCQkodGVybWlvcy0+Y19jZmxhZyAmIENNU1BBUiA/IDIgOiAwKSA6IDA7CisKKwlzd2l0Y2ggKHRlcm1pb3MtPmNfY2ZsYWcgJiBDU0laRSkgeworCWNhc2UgQ1M1OgorCQluZXdsaW5lLmRhdGFfYml0cyA9IDU7CisJCWJyZWFrOworCWNhc2UgQ1M2OgorCQluZXdsaW5lLmRhdGFfYml0cyA9IDY7CisJCWJyZWFrOworCWNhc2UgQ1M3OgorCQluZXdsaW5lLmRhdGFfYml0cyA9IDc7CisJCWJyZWFrOworCWNhc2UgQ1M4OgorCWRlZmF1bHQ6CisJCW5ld2xpbmUuZGF0YV9iaXRzID0gODsKKwkJYnJlYWs7CisJfQorCisJLyogRklYTUU6IG5lZWRzIHRvIGNsZWFyIHVuc3VwcG9ydGVkIGJpdHMgaW4gdGhlIHRlcm1pb3MgKi8KKwlnYl90dHktPmNsb2NhbCA9ICgodGVybWlvcy0+Y19jZmxhZyAmIENMT0NBTCkgIT0gMCk7CisKKwlpZiAoQ19CQVVEKHR0eSkgPT0gQjApIHsKKwkJbmV3bGluZS5yYXRlID0gZ2JfdHR5LT5saW5lX2NvZGluZy5yYXRlOworCQluZXdjdHJsICY9IH4oR0JfVUFSVF9DVFJMX0RUUiB8IEdCX1VBUlRfQ1RSTF9SVFMpOworCX0gZWxzZSBpZiAodGVybWlvc19vbGQgJiYgKHRlcm1pb3Nfb2xkLT5jX2NmbGFnICYgQ0JBVUQpID09IEIwKSB7CisJCW5ld2N0cmwgfD0gKEdCX1VBUlRfQ1RSTF9EVFIgfCBHQl9VQVJUX0NUUkxfUlRTKTsKKwl9CisKKwlpZiAobmV3Y3RybCAhPSBnYl90dHktPmN0cmxvdXQpIHsKKwkJZ2JfdHR5LT5jdHJsb3V0ID0gbmV3Y3RybDsKKwkJc2VuZF9jb250cm9sKGdiX3R0eSwgbmV3Y3RybCk7CisJfQorCisJaWYgKENfQ1JUU0NUUyh0dHkpICYmIENfQkFVRCh0dHkpICE9IEIwKQorCQluZXdsaW5lLmZsb3dfY29udHJvbCB8PSBHQl9TRVJJQUxfQVVUT19SVFNDVFNfRU47CisJZWxzZQorCQluZXdsaW5lLmZsb3dfY29udHJvbCAmPSB+R0JfU0VSSUFMX0FVVE9fUlRTQ1RTX0VOOworCisJaWYgKG1lbWNtcCgmZ2JfdHR5LT5saW5lX2NvZGluZywgJm5ld2xpbmUsIHNpemVvZihuZXdsaW5lKSkpIHsKKwkJbWVtY3B5KCZnYl90dHktPmxpbmVfY29kaW5nLCAmbmV3bGluZSwgc2l6ZW9mKG5ld2xpbmUpKTsKKwkJc2VuZF9saW5lX2NvZGluZyhnYl90dHkpOworCX0KK30KKworc3RhdGljIGludCBnYl90dHlfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgZ2JfdHR5ICpnYl90dHkgPSB0dHktPmRyaXZlcl9kYXRhOworCisJcmV0dXJuIChnYl90dHktPmN0cmxvdXQgJiBHQl9VQVJUX0NUUkxfRFRSID8gVElPQ01fRFRSIDogMCkgfAorCSAgICAgICAoZ2JfdHR5LT5jdHJsb3V0ICYgR0JfVUFSVF9DVFJMX1JUUyA/IFRJT0NNX1JUUyA6IDApIHwKKwkgICAgICAgKGdiX3R0eS0+Y3RybGluICAmIEdCX1VBUlRfQ1RSTF9EU1IgPyBUSU9DTV9EU1IgOiAwKSB8CisJICAgICAgIChnYl90dHktPmN0cmxpbiAgJiBHQl9VQVJUX0NUUkxfUkkgID8gVElPQ01fUkkgIDogMCkgfAorCSAgICAgICAoZ2JfdHR5LT5jdHJsaW4gICYgR0JfVUFSVF9DVFJMX0RDRCA/IFRJT0NNX0NEICA6IDApIHwKKwkgICAgICAgVElPQ01fQ1RTOworfQorCitzdGF0aWMgaW50IGdiX3R0eV90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBpbnQgc2V0LAorCQkJICAgdW5zaWduZWQgaW50IGNsZWFyKQoreworCXN0cnVjdCBnYl90dHkgKmdiX3R0eSA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJdTggbmV3Y3RybCA9IGdiX3R0eS0+Y3RybG91dDsKKworCXNldCA9IChzZXQgJiBUSU9DTV9EVFIgPyBHQl9VQVJUX0NUUkxfRFRSIDogMCkgfAorCSAgICAgIChzZXQgJiBUSU9DTV9SVFMgPyBHQl9VQVJUX0NUUkxfUlRTIDogMCk7CisJY2xlYXIgPSAoY2xlYXIgJiBUSU9DTV9EVFIgPyBHQl9VQVJUX0NUUkxfRFRSIDogMCkgfAorCQkoY2xlYXIgJiBUSU9DTV9SVFMgPyBHQl9VQVJUX0NUUkxfUlRTIDogMCk7CisKKwluZXdjdHJsID0gKG5ld2N0cmwgJiB+Y2xlYXIpIHwgc2V0OworCWlmIChnYl90dHktPmN0cmxvdXQgPT0gbmV3Y3RybCkKKwkJcmV0dXJuIDA7CisKKwlnYl90dHktPmN0cmxvdXQgPSBuZXdjdHJsOworCXJldHVybiBzZW5kX2NvbnRyb2woZ2JfdHR5LCBuZXdjdHJsKTsKK30KKworc3RhdGljIHZvaWQgZ2JfdHR5X3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGdiX3R0eSAqZ2JfdHR5ID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBjaGFyIHN0b3BfY2hhcjsKKwlpbnQgcmV0dmFsOworCisJaWYgKElfSVhPRkYodHR5KSkgeworCQlzdG9wX2NoYXIgPSBTVE9QX0NIQVIodHR5KTsKKwkJcmV0dmFsID0gZ2JfdHR5X3dyaXRlKHR0eSwgJnN0b3BfY2hhciwgMSk7CisJCWlmIChyZXR2YWwgPD0gMCkKKwkJCXJldHVybjsKKwl9CisKKwlpZiAodHR5LT50ZXJtaW9zLmNfY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCWdiX3R0eS0+Y3RybG91dCAmPSB+R0JfVUFSVF9DVFJMX1JUUzsKKwkJcmV0dmFsID0gc2VuZF9jb250cm9sKGdiX3R0eSwgZ2JfdHR5LT5jdHJsb3V0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGdiX3R0eV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGdiX3R0eSAqZ2JfdHR5ID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBjaGFyIHN0YXJ0X2NoYXI7CisJaW50IHJldHZhbDsKKworCWlmIChJX0lYT0ZGKHR0eSkpIHsKKwkJc3RhcnRfY2hhciA9IFNUQVJUX0NIQVIodHR5KTsKKwkJcmV0dmFsID0gZ2JfdHR5X3dyaXRlKHR0eSwgJnN0YXJ0X2NoYXIsIDEpOworCQlpZiAocmV0dmFsIDw9IDApCisJCQlyZXR1cm47CisJfQorCisJaWYgKHR0eS0+dGVybWlvcy5jX2NmbGFnICYgQ1JUU0NUUykgeworCQlnYl90dHktPmN0cmxvdXQgfD0gR0JfVUFSVF9DVFJMX1JUUzsKKwkJcmV0dmFsID0gc2VuZF9jb250cm9sKGdiX3R0eSwgZ2JfdHR5LT5jdHJsb3V0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBnYl90dHkgKmdiX3R0eSwKKwkJCSAgIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqaW5mbykKK3sKKwlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCB0bXA7CisKKwlpZiAoIWluZm8pCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKKwl0bXAuZmxhZ3MgPSBBU1lOQ19MT1dfTEFURU5DWSB8IEFTWU5DX1NLSVBfVEVTVDsKKwl0bXAudHlwZSA9IFBPUlRfMTY1NTBBOworCXRtcC5saW5lID0gZ2JfdHR5LT5taW5vcjsKKwl0bXAueG1pdF9maWZvX3NpemUgPSAxNjsKKwl0bXAuYmF1ZF9iYXNlID0gOTYwMDsKKwl0bXAuY2xvc2VfZGVsYXkgPSBnYl90dHktPnBvcnQuY2xvc2VfZGVsYXkgLyAxMDsKKwl0bXAuY2xvc2luZ193YWl0ID0gZ2JfdHR5LT5wb3J0LmNsb3Npbmdfd2FpdCA9PSBBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORSA/CisJCQkJQVNZTkNfQ0xPU0lOR19XQUlUX05PTkUgOiBnYl90dHktPnBvcnQuY2xvc2luZ193YWl0IC8gMTA7CisKKwlpZiAoY29weV90b191c2VyKGluZm8sICZ0bXAsIHNpemVvZih0bXApKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBnYl90dHkgKmdiX3R0eSwKKwkJCSAgIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqbmV3aW5mbykKK3sKKwlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBuZXdfc2VyaWFsOworCXVuc2lnbmVkIGludCBjbG9zaW5nX3dhaXQ7CisJdW5zaWduZWQgaW50IGNsb3NlX2RlbGF5OworCWludCByZXR2YWwgPSAwOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfc2VyaWFsLCBuZXdpbmZvLCBzaXplb2YobmV3X3NlcmlhbCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWNsb3NlX2RlbGF5ID0gbmV3X3NlcmlhbC5jbG9zZV9kZWxheSAqIDEwOworCWNsb3Npbmdfd2FpdCA9IG5ld19zZXJpYWwuY2xvc2luZ193YWl0ID09IEFTWU5DX0NMT1NJTkdfV0FJVF9OT05FID8KKwkJCUFTWU5DX0NMT1NJTkdfV0FJVF9OT05FIDogbmV3X3NlcmlhbC5jbG9zaW5nX3dhaXQgKiAxMDsKKworCW11dGV4X2xvY2soJmdiX3R0eS0+cG9ydC5tdXRleCk7CisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CisJCWlmICgoY2xvc2VfZGVsYXkgIT0gZ2JfdHR5LT5wb3J0LmNsb3NlX2RlbGF5KSB8fAorCQkgICAgKGNsb3Npbmdfd2FpdCAhPSBnYl90dHktPnBvcnQuY2xvc2luZ193YWl0KSkKKwkJCXJldHZhbCA9IC1FUEVSTTsKKwkJZWxzZQorCQkJcmV0dmFsID0gLUVPUE5PVFNVUFA7CisJfSBlbHNlIHsKKwkJZ2JfdHR5LT5wb3J0LmNsb3NlX2RlbGF5ID0gY2xvc2VfZGVsYXk7CisJCWdiX3R0eS0+cG9ydC5jbG9zaW5nX3dhaXQgPSBjbG9zaW5nX3dhaXQ7CisJfQorCW11dGV4X3VubG9jaygmZ2JfdHR5LT5wb3J0Lm11dGV4KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHdhaXRfc2VyaWFsX2NoYW5nZShzdHJ1Y3QgZ2JfdHR5ICpnYl90dHksIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByZXR2YWwgPSAwOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXN0cnVjdCBhc3luY19pY291bnQgb2xkOworCXN0cnVjdCBhc3luY19pY291bnQgbmV3OworCisJaWYgKCEoYXJnICYgKFRJT0NNX0RTUiB8IFRJT0NNX1JJIHwgVElPQ01fQ0QpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkbyB7CisJCXNwaW5fbG9ja19pcnEoJmdiX3R0eS0+cmVhZF9sb2NrKTsKKwkJb2xkID0gZ2JfdHR5LT5vbGRjb3VudDsKKwkJbmV3ID0gZ2JfdHR5LT5pb2NvdW50OworCQlnYl90dHktPm9sZGNvdW50ID0gbmV3OworCQlzcGluX3VubG9ja19pcnEoJmdiX3R0eS0+cmVhZF9sb2NrKTsKKworCQlpZiAoKGFyZyAmIFRJT0NNX0RTUikgJiYgKG9sZC5kc3IgIT0gbmV3LmRzcikpCisJCQlicmVhazsKKwkJaWYgKChhcmcgJiBUSU9DTV9DRCkgJiYgKG9sZC5kY2QgIT0gbmV3LmRjZCkpCisJCQlicmVhazsKKwkJaWYgKChhcmcgJiBUSU9DTV9SSSkgJiYgKG9sZC5ybmcgIT0gbmV3LnJuZykpCisJCQlicmVhazsKKworCQlhZGRfd2FpdF9xdWV1ZSgmZ2JfdHR5LT53aW9jdGwsICZ3YWl0KTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGUoKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJmdiX3R0eS0+d2lvY3RsLCAmd2FpdCk7CisJCWlmIChnYl90dHktPmRpc2Nvbm5lY3RlZCkgeworCQkJaWYgKGFyZyAmIFRJT0NNX0NEKQorCQkJCWJyZWFrOworCQkJcmV0dmFsID0gLUVOT0RFVjsKKwkJfSBlbHNlIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQl9CisJfSB3aGlsZSAoIXJldHZhbCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGdldF9zZXJpYWxfdXNhZ2Uoc3RydWN0IGdiX3R0eSAqZ2JfdHR5LAorCQkJICAgIHN0cnVjdCBzZXJpYWxfaWNvdW50ZXJfc3RydWN0IF9fdXNlciAqY291bnQpCit7CisJc3RydWN0IHNlcmlhbF9pY291bnRlcl9zdHJ1Y3QgaWNvdW50OworCWludCByZXR2YWwgPSAwOworCisJbWVtc2V0KCZpY291bnQsIDAsIHNpemVvZihpY291bnQpKTsKKwlpY291bnQuZHNyID0gZ2JfdHR5LT5pb2NvdW50LmRzcjsKKwlpY291bnQucm5nID0gZ2JfdHR5LT5pb2NvdW50LnJuZzsKKwlpY291bnQuZGNkID0gZ2JfdHR5LT5pb2NvdW50LmRjZDsKKwlpY291bnQuZnJhbWUgPSBnYl90dHktPmlvY291bnQuZnJhbWU7CisJaWNvdW50Lm92ZXJydW4gPSBnYl90dHktPmlvY291bnQub3ZlcnJ1bjsKKwlpY291bnQucGFyaXR5ID0gZ2JfdHR5LT5pb2NvdW50LnBhcml0eTsKKwlpY291bnQuYnJrID0gZ2JfdHR5LT5pb2NvdW50LmJyazsKKworCWlmIChjb3B5X3RvX3VzZXIoY291bnQsICZpY291bnQsIHNpemVvZihpY291bnQpKSA+IDApCisJCXJldHZhbCA9IC1FRkFVTFQ7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGdiX3R0eV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBpbnQgY21kLAorCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGdiX3R0eSAqZ2JfdHR5ID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUSU9DR1NFUklBTDoKKwkJcmV0dXJuIGdldF9zZXJpYWxfaW5mbyhnYl90dHksCisJCQkJICAgICAgIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKilhcmcpOworCWNhc2UgVElPQ1NTRVJJQUw6CisJCXJldHVybiBzZXRfc2VyaWFsX2luZm8oZ2JfdHR5LAorCQkJCSAgICAgICAoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICopYXJnKTsKKwljYXNlIFRJT0NNSVdBSVQ6CisJCXJldHVybiB3YWl0X3NlcmlhbF9jaGFuZ2UoZ2JfdHR5LCBhcmcpOworCWNhc2UgVElPQ0dJQ09VTlQ6CisJCXJldHVybiBnZXRfc2VyaWFsX3VzYWdlKGdiX3R0eSwKKwkJCQkJKHN0cnVjdCBzZXJpYWxfaWNvdW50ZXJfc3RydWN0IF9fdXNlciAqKWFyZyk7CisJfQorCisJcmV0dXJuIC1FTk9JT0NUTENNRDsKK30KKworc3RhdGljIHZvaWQgZ2JfdHR5X2R0cl9ydHMoc3RydWN0IHR0eV9wb3J0ICpwb3J0LCBpbnQgb24pCit7CisJc3RydWN0IGdiX3R0eSAqZ2JfdHR5OworCXU4IG5ld2N0cmw7CisKKwlnYl90dHkgPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IGdiX3R0eSwgcG9ydCk7CisJbmV3Y3RybCA9IGdiX3R0eS0+Y3RybG91dDsKKworCWlmIChvbikKKwkJbmV3Y3RybCB8PSAoR0JfVUFSVF9DVFJMX0RUUiB8IEdCX1VBUlRfQ1RSTF9SVFMpOworCWVsc2UKKwkJbmV3Y3RybCAmPSB+KEdCX1VBUlRfQ1RSTF9EVFIgfCBHQl9VQVJUX0NUUkxfUlRTKTsKKworCWdiX3R0eS0+Y3RybG91dCA9IG5ld2N0cmw7CisJc2VuZF9jb250cm9sKGdiX3R0eSwgbmV3Y3RybCk7Cit9CisKK3N0YXRpYyBpbnQgZ2JfdHR5X3BvcnRfYWN0aXZhdGUoc3RydWN0IHR0eV9wb3J0ICpwb3J0LAorCQkJCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGdiX3R0eSAqZ2JfdHR5OworCisJZ2JfdHR5ID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBnYl90dHksIHBvcnQpOworCisJcmV0dXJuIGdicGh5X3J1bnRpbWVfZ2V0X3N5bmMoZ2JfdHR5LT5nYnBoeV9kZXYpOworfQorCitzdGF0aWMgdm9pZCBnYl90dHlfcG9ydF9zaHV0ZG93bihzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IGdiX3R0eSAqZ2JfdHR5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCWdiX3R0eSA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3QgZ2JfdHR5LCBwb3J0KTsKKworCWdiX3R0eS0+Y2xvc2VfcGVuZGluZyA9IHRydWU7CisKKwljYW5jZWxfd29ya19zeW5jKCZnYl90dHktPnR4X3dvcmspOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdiX3R0eS0+d3JpdGVfbG9jaywgZmxhZ3MpOworCWtmaWZvX3Jlc2V0X291dCgmZ2JfdHR5LT53cml0ZV9maWZvKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnYl90dHktPndyaXRlX2xvY2ssIGZsYWdzKTsKKworCWlmIChnYl90dHktPmNyZWRpdHMgPT0gR0JfVUFSVF9GSVJNV0FSRV9DUkVESVRTKQorCQlnb3RvIG91dDsKKworCXJldCA9IGdiX3VhcnRfZmx1c2goZ2JfdHR5LCBHQl9TRVJJQUxfRkxBR19GTFVTSF9UUkFOU01JVFRFUik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZnYl90dHktPmdicGh5X2Rldi0+ZGV2LAorCQkJImVycm9yIGZsdXNoaW5nIHRyYW5zbWl0dGVyOiAlZFxuIiwgcmV0KTsKKwl9CisKKwlnYl91YXJ0X3dhaXRfZm9yX2FsbF9jcmVkaXRzKGdiX3R0eSk7CisKK291dDoKKwlnYl90dHktPmNsb3NlX3BlbmRpbmcgPSBmYWxzZTsKKworCWdicGh5X3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGdiX3R0eS0+Z2JwaHlfZGV2KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBnYl9vcHMgPSB7CisJLmluc3RhbGwgPQkJZ2JfdHR5X2luc3RhbGwsCisJLm9wZW4gPQkJCWdiX3R0eV9vcGVuLAorCS5jbG9zZSA9CQlnYl90dHlfY2xvc2UsCisJLmNsZWFudXAgPQkJZ2JfdHR5X2NsZWFudXAsCisJLmhhbmd1cCA9CQlnYl90dHlfaGFuZ3VwLAorCS53cml0ZSA9CQlnYl90dHlfd3JpdGUsCisJLndyaXRlX3Jvb20gPQkJZ2JfdHR5X3dyaXRlX3Jvb20sCisJLmlvY3RsID0JCWdiX3R0eV9pb2N0bCwKKwkudGhyb3R0bGUgPQkJZ2JfdHR5X3Rocm90dGxlLAorCS51bnRocm90dGxlID0JCWdiX3R0eV91bnRocm90dGxlLAorCS5jaGFyc19pbl9idWZmZXIgPQlnYl90dHlfY2hhcnNfaW5fYnVmZmVyLAorCS5icmVha19jdGwgPQkJZ2JfdHR5X2JyZWFrX2N0bCwKKwkuc2V0X3Rlcm1pb3MgPQkJZ2JfdHR5X3NldF90ZXJtaW9zLAorCS50aW9jbWdldCA9CQlnYl90dHlfdGlvY21nZXQsCisJLnRpb2Ntc2V0ID0JCWdiX3R0eV90aW9jbXNldCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X3BvcnRfb3BlcmF0aW9ucyBnYl9wb3J0X29wcyA9IHsKKwkuZHRyX3J0cyA9CQlnYl90dHlfZHRyX3J0cywKKwkuYWN0aXZhdGUgPQkJZ2JfdHR5X3BvcnRfYWN0aXZhdGUsCisJLnNodXRkb3duID0JCWdiX3R0eV9wb3J0X3NodXRkb3duLAorfTsKKworc3RhdGljIGludCBnYl91YXJ0X3Byb2JlKHN0cnVjdCBnYnBoeV9kZXZpY2UgKmdicGh5X2RldiwKKwkJCSBjb25zdCBzdHJ1Y3QgZ2JwaHlfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKwlzaXplX3QgbWF4X3BheWxvYWQ7CisJc3RydWN0IGdiX3R0eSAqZ2JfdHR5OworCXN0cnVjdCBkZXZpY2UgKnR0eV9kZXY7CisJaW50IHJldHZhbDsKKwlpbnQgbWlub3I7CisKKwlnYl90dHkgPSBremFsbG9jKHNpemVvZigqZ2JfdHR5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFnYl90dHkpCisJCXJldHVybiAtRU5PTUVNOworCisJY29ubmVjdGlvbiA9IGdiX2Nvbm5lY3Rpb25fY3JlYXRlKGdicGh5X2Rldi0+YnVuZGxlLAorCQkJCQkgIGxlMTZfdG9fY3B1KGdicGh5X2Rldi0+Y3BvcnRfZGVzYy0+aWQpLAorCQkJCQkgIGdiX3VhcnRfcmVxdWVzdF9oYW5kbGVyKTsKKwlpZiAoSVNfRVJSKGNvbm5lY3Rpb24pKSB7CisJCXJldHZhbCA9IFBUUl9FUlIoY29ubmVjdGlvbik7CisJCWdvdG8gZXhpdF90dHlfZnJlZTsKKwl9CisKKwltYXhfcGF5bG9hZCA9IGdiX29wZXJhdGlvbl9nZXRfcGF5bG9hZF9zaXplX21heChjb25uZWN0aW9uKTsKKwlpZiAobWF4X3BheWxvYWQgPCBzaXplb2Yoc3RydWN0IGdiX3VhcnRfc2VuZF9kYXRhX3JlcXVlc3QpKSB7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdF9jb25uZWN0aW9uX2Rlc3Ryb3k7CisJfQorCisJZ2JfdHR5LT5idWZmZXJfcGF5bG9hZF9tYXggPSBtYXhfcGF5bG9hZCAtCisJCQlzaXplb2Yoc3RydWN0IGdiX3VhcnRfc2VuZF9kYXRhX3JlcXVlc3QpOworCisJZ2JfdHR5LT5idWZmZXIgPSBremFsbG9jKGdiX3R0eS0+YnVmZmVyX3BheWxvYWRfbWF4LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdiX3R0eS0+YnVmZmVyKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXhpdF9jb25uZWN0aW9uX2Rlc3Ryb3k7CisJfQorCisJSU5JVF9XT1JLKCZnYl90dHktPnR4X3dvcmssIGdiX3VhcnRfdHhfd3JpdGVfd29yayk7CisKKwlyZXR2YWwgPSBrZmlmb19hbGxvYygmZ2JfdHR5LT53cml0ZV9maWZvLCBHQl9VQVJUX1dSSVRFX0ZJRk9fU0laRSwKKwkJCSAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBleGl0X2J1Zl9mcmVlOworCisJZ2JfdHR5LT5jcmVkaXRzID0gR0JfVUFSVF9GSVJNV0FSRV9DUkVESVRTOworCWluaXRfY29tcGxldGlvbigmZ2JfdHR5LT5jcmVkaXRzX2NvbXBsZXRlKTsKKworCW1pbm9yID0gYWxsb2NfbWlub3IoZ2JfdHR5KTsKKwlpZiAobWlub3IgPCAwKSB7CisJCWlmIChtaW5vciA9PSAtRU5PU1BDKSB7CisJCQlkZXZfZXJyKCZjb25uZWN0aW9uLT5idW5kbGUtPmRldiwKKwkJCQkibm8gbW9yZSBmcmVlIG1pbm9yIG51bWJlcnNcbiIpOworCQkJcmV0dmFsID0gLUVOT0RFVjsKKwkJfSBlbHNlIHsKKwkJCXJldHZhbCA9IG1pbm9yOworCQl9CisJCWdvdG8gZXhpdF9rZmlmb19mcmVlOworCX0KKworCWdiX3R0eS0+bWlub3IgPSBtaW5vcjsKKwlzcGluX2xvY2tfaW5pdCgmZ2JfdHR5LT53cml0ZV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZ2JfdHR5LT5yZWFkX2xvY2spOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmdiX3R0eS0+d2lvY3RsKTsKKwltdXRleF9pbml0KCZnYl90dHktPm11dGV4KTsKKworCXR0eV9wb3J0X2luaXQoJmdiX3R0eS0+cG9ydCk7CisJZ2JfdHR5LT5wb3J0Lm9wcyA9ICZnYl9wb3J0X29wczsKKworCWdiX3R0eS0+Y29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisJZ2JfdHR5LT5nYnBoeV9kZXYgPSBnYnBoeV9kZXY7CisJZ2JfY29ubmVjdGlvbl9zZXRfZGF0YShjb25uZWN0aW9uLCBnYl90dHkpOworCWdiX2dicGh5X3NldF9kYXRhKGdicGh5X2RldiwgZ2JfdHR5KTsKKworCXJldHZhbCA9IGdiX2Nvbm5lY3Rpb25fZW5hYmxlX3R4KGNvbm5lY3Rpb24pOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXhpdF9yZWxlYXNlX21pbm9yOworCisJc2VuZF9jb250cm9sKGdiX3R0eSwgZ2JfdHR5LT5jdHJsb3V0KTsKKworCS8qIGluaXRpYWxpemUgdGhlIHVhcnQgdG8gYmUgOTYwMG44MSAqLworCWdiX3R0eS0+bGluZV9jb2RpbmcucmF0ZSA9IGNwdV90b19sZTMyKDk2MDApOworCWdiX3R0eS0+bGluZV9jb2RpbmcuZm9ybWF0ID0gR0JfU0VSSUFMXzFfU1RPUF9CSVRTOworCWdiX3R0eS0+bGluZV9jb2RpbmcucGFyaXR5ID0gR0JfU0VSSUFMX05PX1BBUklUWTsKKwlnYl90dHktPmxpbmVfY29kaW5nLmRhdGFfYml0cyA9IDg7CisJc2VuZF9saW5lX2NvZGluZyhnYl90dHkpOworCisJcmV0dmFsID0gZ2JfY29ubmVjdGlvbl9lbmFibGUoY29ubmVjdGlvbik7CisJaWYgKHJldHZhbCkKKwkJZ290byBleGl0X2Nvbm5lY3Rpb25fZGlzYWJsZTsKKworCXR0eV9kZXYgPSB0dHlfcG9ydF9yZWdpc3Rlcl9kZXZpY2UoJmdiX3R0eS0+cG9ydCwgZ2JfdHR5X2RyaXZlciwgbWlub3IsCisJCQkJCSAgICZnYnBoeV9kZXYtPmRldik7CisJaWYgKElTX0VSUih0dHlfZGV2KSkgeworCQlyZXR2YWwgPSBQVFJfRVJSKHR0eV9kZXYpOworCQlnb3RvIGV4aXRfY29ubmVjdGlvbl9kaXNhYmxlOworCX0KKworCWdicGh5X3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGdicGh5X2Rldik7CisJcmV0dXJuIDA7CisKK2V4aXRfY29ubmVjdGlvbl9kaXNhYmxlOgorCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShjb25uZWN0aW9uKTsKK2V4aXRfcmVsZWFzZV9taW5vcjoKKwlyZWxlYXNlX21pbm9yKGdiX3R0eSk7CitleGl0X2tmaWZvX2ZyZWU6CisJa2ZpZm9fZnJlZSgmZ2JfdHR5LT53cml0ZV9maWZvKTsKK2V4aXRfYnVmX2ZyZWU6CisJa2ZyZWUoZ2JfdHR5LT5idWZmZXIpOworZXhpdF9jb25uZWN0aW9uX2Rlc3Ryb3k6CisJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGNvbm5lY3Rpb24pOworZXhpdF90dHlfZnJlZToKKwlrZnJlZShnYl90dHkpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgZ2JfdWFydF9yZW1vdmUoc3RydWN0IGdicGh5X2RldmljZSAqZ2JwaHlfZGV2KQoreworCXN0cnVjdCBnYl90dHkgKmdiX3R0eSA9IGdiX2dicGh5X2dldF9kYXRhKGdicGh5X2Rldik7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24gPSBnYl90dHktPmNvbm5lY3Rpb247CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2JwaHlfcnVudGltZV9nZXRfc3luYyhnYnBoeV9kZXYpOworCWlmIChyZXQpCisJCWdicGh5X3J1bnRpbWVfZ2V0X25vcmVzdW1lKGdicGh5X2Rldik7CisKKwltdXRleF9sb2NrKCZnYl90dHktPm11dGV4KTsKKwlnYl90dHktPmRpc2Nvbm5lY3RlZCA9IHRydWU7CisKKwl3YWtlX3VwX2FsbCgmZ2JfdHR5LT53aW9jdGwpOworCW11dGV4X3VubG9jaygmZ2JfdHR5LT5tdXRleCk7CisKKwl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZnYl90dHktPnBvcnQpOworCWlmICh0dHkpIHsKKwkJdHR5X3ZoYW5ndXAodHR5KTsKKwkJdHR5X2tyZWZfcHV0KHR0eSk7CisJfQorCisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlX3J4KGNvbm5lY3Rpb24pOworCXR0eV91bnJlZ2lzdGVyX2RldmljZShnYl90dHlfZHJpdmVyLCBnYl90dHktPm1pbm9yKTsKKworCS8qIEZJWE1FIC0gZnJlZSB0cmFuc21pdCAvIHJlY2VpdmUgYnVmZmVycyAqLworCisJZ2JfY29ubmVjdGlvbl9kaXNhYmxlKGNvbm5lY3Rpb24pOworCXR0eV9wb3J0X2Rlc3Ryb3koJmdiX3R0eS0+cG9ydCk7CisJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGNvbm5lY3Rpb24pOworCXJlbGVhc2VfbWlub3IoZ2JfdHR5KTsKKwlrZmlmb19mcmVlKCZnYl90dHktPndyaXRlX2ZpZm8pOworCWtmcmVlKGdiX3R0eS0+YnVmZmVyKTsKKwlrZnJlZShnYl90dHkpOworfQorCitzdGF0aWMgaW50IGdiX3R0eV9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbCA9IDA7CisKKwlnYl90dHlfZHJpdmVyID0gdHR5X2FsbG9jX2RyaXZlcihHQl9OVU1fTUlOT1JTLCAwKTsKKwlpZiAoSVNfRVJSKGdiX3R0eV9kcml2ZXIpKSB7CisJCXByX2VycigiQ2FuIG5vdCBhbGxvY2F0ZSB0dHkgZHJpdmVyXG4iKTsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBmYWlsX3VucmVnaXN0ZXJfZGV2OworCX0KKworCWdiX3R0eV9kcml2ZXItPmRyaXZlcl9uYW1lID0gImdiIjsKKwlnYl90dHlfZHJpdmVyLT5uYW1lID0gR0JfTkFNRTsKKwlnYl90dHlfZHJpdmVyLT5tYWpvciA9IDA7CisJZ2JfdHR5X2RyaXZlci0+bWlub3Jfc3RhcnQgPSAwOworCWdiX3R0eV9kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOworCWdiX3R0eV9kcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7CisJZ2JfdHR5X2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJVkVSX1JFQUxfUkFXIHwgVFRZX0RSSVZFUl9EWU5BTUlDX0RFVjsKKwlnYl90dHlfZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJZ2JfdHR5X2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPSBCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7CisJdHR5X3NldF9vcGVyYXRpb25zKGdiX3R0eV9kcml2ZXIsICZnYl9vcHMpOworCisJcmV0dmFsID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihnYl90dHlfZHJpdmVyKTsKKwlpZiAocmV0dmFsKSB7CisJCXByX2VycigiQ2FuIG5vdCByZWdpc3RlciB0dHkgZHJpdmVyOiAlZFxuIiwgcmV0dmFsKTsKKwkJZ290byBmYWlsX3B1dF9nYl90dHk7CisJfQorCisJcmV0dXJuIDA7CisKK2ZhaWxfcHV0X2diX3R0eToKKwlwdXRfdHR5X2RyaXZlcihnYl90dHlfZHJpdmVyKTsKK2ZhaWxfdW5yZWdpc3Rlcl9kZXY6CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgZ2JfdHR5X2V4aXQodm9pZCkKK3sKKwl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoZ2JfdHR5X2RyaXZlcik7CisJcHV0X3R0eV9kcml2ZXIoZ2JfdHR5X2RyaXZlcik7CisJaWRyX2Rlc3Ryb3koJnR0eV9taW5vcnMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGdicGh5X2RldmljZV9pZCBnYl91YXJ0X2lkX3RhYmxlW10gPSB7CisJeyBHQlBIWV9QUk9UT0NPTChHUkVZQlVTX1BST1RPQ09MX1VBUlQpIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoZ2JwaHksIGdiX3VhcnRfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGdicGh5X2RyaXZlciB1YXJ0X2RyaXZlciA9IHsKKwkubmFtZQkJPSAidWFydCIsCisJLnByb2JlCQk9IGdiX3VhcnRfcHJvYmUsCisJLnJlbW92ZQkJPSBnYl91YXJ0X3JlbW92ZSwKKwkuaWRfdGFibGUJPSBnYl91YXJ0X2lkX3RhYmxlLAorfTsKKworc3RhdGljIGludCBnYl91YXJ0X2RyaXZlcl9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGdiX3R0eV9pbml0KCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGdiX2dicGh5X3JlZ2lzdGVyKCZ1YXJ0X2RyaXZlcik7CisJaWYgKHJldCkgeworCQlnYl90dHlfZXhpdCgpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQoZ2JfdWFydF9kcml2ZXJfaW5pdCk7CisKK3N0YXRpYyB2b2lkIGdiX3VhcnRfZHJpdmVyX2V4aXQodm9pZCkKK3sKKwlnYl9nYnBoeV9kZXJlZ2lzdGVyKCZ1YXJ0X2RyaXZlcik7CisJZ2JfdHR5X2V4aXQoKTsKK30KKworbW9kdWxlX2V4aXQoZ2JfdWFydF9kcml2ZXJfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3VzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYWRkYTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy91c2IuYwpAQCAtMCwwICsxLDI0NyBAQAorLyoKKyAqIFVTQiBob3N0IGRyaXZlciBmb3IgdGhlIEdyZXlidXMgImdlbmVyaWMiIFVTQiBtb2R1bGUuCisgKgorICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAyMDE0IExpbmFybyBMdGQuCisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyIG9ubHkuCisgKgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9oY2QuaD4KKworI2luY2x1ZGUgImdyZXlidXMuaCIKKyNpbmNsdWRlICJnYnBoeS5oIgorCisvKiBHcmV5YnVzIFVTQiByZXF1ZXN0IHR5cGVzICovCisjZGVmaW5lIEdCX1VTQl9UWVBFX0hDRF9TVEFSVAkJMHgwMgorI2RlZmluZSBHQl9VU0JfVFlQRV9IQ0RfU1RPUAkJMHgwMworI2RlZmluZSBHQl9VU0JfVFlQRV9IVUJfQ09OVFJPTAkJMHgwNAorCitzdHJ1Y3QgZ2JfdXNiX2h1Yl9jb250cm9sX3JlcXVlc3QgeworCV9fbGUxNiB0eXBlUmVxOworCV9fbGUxNiB3VmFsdWU7CisJX19sZTE2IHdJbmRleDsKKwlfX2xlMTYgd0xlbmd0aDsKK307CisKK3N0cnVjdCBnYl91c2JfaHViX2NvbnRyb2xfcmVzcG9uc2UgeworCXU4IGJ1ZlswXTsKK307CisKK3N0cnVjdCBnYl91c2JfZGV2aWNlIHsKKwlzdHJ1Y3QgZ2JfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKwlzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXY7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBnYl91c2JfZGV2aWNlICp0b19nYl91c2JfZGV2aWNlKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJcmV0dXJuIChzdHJ1Y3QgZ2JfdXNiX2RldmljZSAqKWhjZC0+aGNkX3ByaXY7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHVzYl9oY2QgKmdiX3VzYl9kZXZpY2VfdG9faGNkKHN0cnVjdCBnYl91c2JfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZigodm9pZCAqKWRldiwgc3RydWN0IHVzYl9oY2QsIGhjZF9wcml2KTsKK30KKworc3RhdGljIHZvaWQgaGNkX3N0b3Aoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3QgZ2JfdXNiX2RldmljZSAqZGV2ID0gdG9fZ2JfdXNiX2RldmljZShoY2QpOworCWludCByZXQ7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fc3luYyhkZXYtPmNvbm5lY3Rpb24sIEdCX1VTQl9UWVBFX0hDRF9TVE9QLAorCQkJCU5VTEwsIDAsIE5VTEwsIDApOworCWlmIChyZXQpCisJCWRldl9lcnIoJmRldi0+Z2JwaHlfZGV2LT5kZXYsICJIQ0Qgc3RvcCBmYWlsZWQgJyVkJ1xuIiwgcmV0KTsKK30KKworc3RhdGljIGludCBoY2Rfc3RhcnQoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3QgdXNiX2J1cyAqYnVzID0gaGNkX3RvX2J1cyhoY2QpOworCXN0cnVjdCBnYl91c2JfZGV2aWNlICpkZXYgPSB0b19nYl91c2JfZGV2aWNlKGhjZCk7CisJaW50IHJldDsKKworCXJldCA9IGdiX29wZXJhdGlvbl9zeW5jKGRldi0+Y29ubmVjdGlvbiwgR0JfVVNCX1RZUEVfSENEX1NUQVJULAorCQkJCU5VTEwsIDAsIE5VTEwsIDApOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmZGV2LT5nYnBoeV9kZXYtPmRldiwgIkhDRCBzdGFydCBmYWlsZWQgJyVkJ1xuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwloY2QtPnN0YXRlID0gSENfU1RBVEVfUlVOTklORzsKKwlpZiAoYnVzLT5yb290X2h1YikKKwkJdXNiX2hjZF9yZXN1bWVfcm9vdF9odWIoaGNkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1cmJfZW5xdWV1ZShzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgdXJiICp1cmIsIGdmcF90IG1lbV9mbGFncykKK3sKKwlyZXR1cm4gLUVOWElPOworfQorCitzdGF0aWMgaW50IHVyYl9kZXF1ZXVlKHN0cnVjdCB1c2JfaGNkICpoY2QsIHN0cnVjdCB1cmIgKnVyYiwgaW50IHN0YXR1cykKK3sKKwlyZXR1cm4gLUVOWElPOworfQorCitzdGF0aWMgaW50IGdldF9mcmFtZV9udW1iZXIoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBodWJfc3RhdHVzX2RhdGEoc3RydWN0IHVzYl9oY2QgKmhjZCwgY2hhciAqYnVmKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGh1Yl9jb250cm9sKHN0cnVjdCB1c2JfaGNkICpoY2QsIHUxNiB0eXBlUmVxLCB1MTYgd1ZhbHVlLCB1MTYgd0luZGV4LAorCQkgICAgICAgY2hhciAqYnVmLCB1MTYgd0xlbmd0aCkKK3sKKwlzdHJ1Y3QgZ2JfdXNiX2RldmljZSAqZGV2ID0gdG9fZ2JfdXNiX2RldmljZShoY2QpOworCXN0cnVjdCBnYl9vcGVyYXRpb24gKm9wZXJhdGlvbjsKKwlzdHJ1Y3QgZ2JfdXNiX2h1Yl9jb250cm9sX3JlcXVlc3QgKnJlcXVlc3Q7CisJc3RydWN0IGdiX3VzYl9odWJfY29udHJvbF9yZXNwb25zZSAqcmVzcG9uc2U7CisJc2l6ZV90IHJlc3BvbnNlX3NpemU7CisJaW50IHJldDsKKworCS8qIEZJWE1FOiBoYW5kbGUgdW5zcGVjaWZpZWQgbGVuZ3RocyAqLworCXJlc3BvbnNlX3NpemUgPSBzaXplb2YoKnJlc3BvbnNlKSArIHdMZW5ndGg7CisKKwlvcGVyYXRpb24gPSBnYl9vcGVyYXRpb25fY3JlYXRlKGRldi0+Y29ubmVjdGlvbiwKKwkJCQkJR0JfVVNCX1RZUEVfSFVCX0NPTlRST0wsCisJCQkJCXNpemVvZigqcmVxdWVzdCksCisJCQkJCXJlc3BvbnNlX3NpemUsCisJCQkJCUdGUF9LRVJORUwpOworCWlmICghb3BlcmF0aW9uKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcXVlc3QgPSBvcGVyYXRpb24tPnJlcXVlc3QtPnBheWxvYWQ7CisJcmVxdWVzdC0+dHlwZVJlcSA9IGNwdV90b19sZTE2KHR5cGVSZXEpOworCXJlcXVlc3QtPndWYWx1ZSA9IGNwdV90b19sZTE2KHdWYWx1ZSk7CisJcmVxdWVzdC0+d0luZGV4ID0gY3B1X3RvX2xlMTYod0luZGV4KTsKKwlyZXF1ZXN0LT53TGVuZ3RoID0gY3B1X3RvX2xlMTYod0xlbmd0aCk7CisKKwlyZXQgPSBnYl9vcGVyYXRpb25fcmVxdWVzdF9zZW5kX3N5bmMob3BlcmF0aW9uKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWlmICh3TGVuZ3RoKSB7CisJCS8qIEdyZXlidXMgY29yZSBoYXMgdmVyaWZpZWQgcmVzcG9uc2Ugc2l6ZSAqLworCQlyZXNwb25zZSA9IG9wZXJhdGlvbi0+cmVzcG9uc2UtPnBheWxvYWQ7CisJCW1lbWNweShidWYsIHJlc3BvbnNlLT5idWYsIHdMZW5ndGgpOworCX0KK291dDoKKwlnYl9vcGVyYXRpb25fcHV0KG9wZXJhdGlvbik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGhjX2RyaXZlciB1c2JfZ2JfaGNfZHJpdmVyID0geworCS5kZXNjcmlwdGlvbiA9ICJncmV5YnVzLWhjZCIsCisJLnByb2R1Y3RfZGVzYyA9ICJHcmV5YnVzIFVTQiBIb3N0IENvbnRyb2xsZXIiLAorCS5oY2RfcHJpdl9zaXplID0gc2l6ZW9mKHN0cnVjdCBnYl91c2JfZGV2aWNlKSwKKworCS5mbGFncyA9IEhDRF9VU0IyLAorCisJLnN0YXJ0ID0gaGNkX3N0YXJ0LAorCS5zdG9wID0gaGNkX3N0b3AsCisKKwkudXJiX2VucXVldWUgPSB1cmJfZW5xdWV1ZSwKKwkudXJiX2RlcXVldWUgPSB1cmJfZGVxdWV1ZSwKKworCS5nZXRfZnJhbWVfbnVtYmVyID0gZ2V0X2ZyYW1lX251bWJlciwKKwkuaHViX3N0YXR1c19kYXRhID0gaHViX3N0YXR1c19kYXRhLAorCS5odWJfY29udHJvbCA9IGh1Yl9jb250cm9sLAorfTsKKworc3RhdGljIGludCBnYl91c2JfcHJvYmUoc3RydWN0IGdicGh5X2RldmljZSAqZ2JwaHlfZGV2LAorCQkJY29uc3Qgc3RydWN0IGdicGh5X2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmdicGh5X2Rldi0+ZGV2OworCXN0cnVjdCBnYl91c2JfZGV2aWNlICpnYl91c2JfZGV2OworCXN0cnVjdCB1c2JfaGNkICpoY2Q7CisJaW50IHJldHZhbDsKKworCWhjZCA9IHVzYl9jcmVhdGVfaGNkKCZ1c2JfZ2JfaGNfZHJpdmVyLCBkZXYsIGRldl9uYW1lKGRldikpOworCWlmICghaGNkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvbm5lY3Rpb24gPSBnYl9jb25uZWN0aW9uX2NyZWF0ZShnYnBoeV9kZXYtPmJ1bmRsZSwKKwkJCQkJICBsZTE2X3RvX2NwdShnYnBoeV9kZXYtPmNwb3J0X2Rlc2MtPmlkKSwKKwkJCQkJICBOVUxMKTsKKwlpZiAoSVNfRVJSKGNvbm5lY3Rpb24pKSB7CisJCXJldHZhbCA9IFBUUl9FUlIoY29ubmVjdGlvbik7CisJCWdvdG8gZXhpdF91c2JfcHV0OworCX0KKworCWdiX3VzYl9kZXYgPSB0b19nYl91c2JfZGV2aWNlKGhjZCk7CisJZ2JfdXNiX2Rldi0+Y29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisJZ2JfY29ubmVjdGlvbl9zZXRfZGF0YShjb25uZWN0aW9uLCBnYl91c2JfZGV2KTsKKwlnYl91c2JfZGV2LT5nYnBoeV9kZXYgPSBnYnBoeV9kZXY7CisJZ2JfZ2JwaHlfc2V0X2RhdGEoZ2JwaHlfZGV2LCBnYl91c2JfZGV2KTsKKworCWhjZC0+aGFzX3R0ID0gMTsKKworCXJldHZhbCA9IGdiX2Nvbm5lY3Rpb25fZW5hYmxlKGNvbm5lY3Rpb24pOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXhpdF9jb25uZWN0aW9uX2Rlc3Ryb3k7CisKKwkvKgorCSAqIEZJWE1FOiBUaGUgVVNCIGJyaWRnZWQtUEhZIHByb3RvY29sIGRyaXZlciBkZXBlbmRzIG9uIGNoYW5nZXMgdG8KKwkgKiAgICAgICAgVVNCIGNvcmUgd2hpY2ggYXJlIG5vdCB5ZXQgdXBzdHJlYW0uCisJICoKKwkgKiAgICAgICAgRGlzYWJsZSBmb3Igbm93LgorCSAqLworCWlmICgxKSB7CisJCWRldl93YXJuKGRldiwgIlVTQiBwcm90b2NvbCBkaXNhYmxlZFxuIik7CisJCXJldHZhbCA9IC1FUFJPVE9OT1NVUFBPUlQ7CisJCWdvdG8gZXhpdF9jb25uZWN0aW9uX2Rpc2FibGU7CisJfQorCisJcmV0dmFsID0gdXNiX2FkZF9oY2QoaGNkLCAwLCAwKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGV4aXRfY29ubmVjdGlvbl9kaXNhYmxlOworCisJcmV0dXJuIDA7CisKK2V4aXRfY29ubmVjdGlvbl9kaXNhYmxlOgorCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShjb25uZWN0aW9uKTsKK2V4aXRfY29ubmVjdGlvbl9kZXN0cm95OgorCWdiX2Nvbm5lY3Rpb25fZGVzdHJveShjb25uZWN0aW9uKTsKK2V4aXRfdXNiX3B1dDoKKwl1c2JfcHV0X2hjZChoY2QpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgZ2JfdXNiX3JlbW92ZShzdHJ1Y3QgZ2JwaHlfZGV2aWNlICpnYnBoeV9kZXYpCit7CisJc3RydWN0IGdiX3VzYl9kZXZpY2UgKmdiX3VzYl9kZXYgPSBnYl9nYnBoeV9nZXRfZGF0YShnYnBoeV9kZXYpOworCXN0cnVjdCBnYl9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gZ2JfdXNiX2Rldi0+Y29ubmVjdGlvbjsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gZ2JfdXNiX2RldmljZV90b19oY2QoZ2JfdXNiX2Rldik7CisKKwl1c2JfcmVtb3ZlX2hjZChoY2QpOworCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShjb25uZWN0aW9uKTsKKwlnYl9jb25uZWN0aW9uX2Rlc3Ryb3koY29ubmVjdGlvbik7CisJdXNiX3B1dF9oY2QoaGNkKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBnYnBoeV9kZXZpY2VfaWQgZ2JfdXNiX2lkX3RhYmxlW10gPSB7CisJeyBHQlBIWV9QUk9UT0NPTChHUkVZQlVTX1BST1RPQ09MX1VTQikgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShnYnBoeSwgZ2JfdXNiX2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBnYnBoeV9kcml2ZXIgdXNiX2RyaXZlciA9IHsKKwkubmFtZQkJPSAidXNiIiwKKwkucHJvYmUJCT0gZ2JfdXNiX3Byb2JlLAorCS5yZW1vdmUJCT0gZ2JfdXNiX3JlbW92ZSwKKwkuaWRfdGFibGUJPSBnYl91c2JfaWRfdGFibGUsCit9OworCittb2R1bGVfZ2JwaHlfZHJpdmVyKHVzYl9kcml2ZXIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvdmlicmF0b3IuYyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3ZpYnJhdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJhMGUxNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3ZpYnJhdG9yLmMKQEAgLTAsMCArMSwyNDkgQEAKKy8qCisgKiBHcmV5YnVzIFZpYnJhdG9yIHByb3RvY29sIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLgorICogQ29weXJpZ2h0IDIwMTQgTGluYXJvIEx0ZC4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIgb25seS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKworI2luY2x1ZGUgImdyZXlidXMuaCIKKworc3RydWN0IGdiX3ZpYnJhdG9yX2RldmljZSB7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24JKmNvbm5lY3Rpb247CisJc3RydWN0IGRldmljZQkJKmRldjsKKwlpbnQJCQltaW5vcjsJCS8qIHZpYnJhdG9yIG1pbm9yIG51bWJlciAqLworCXN0cnVjdCBkZWxheWVkX3dvcmsgICAgIGRlbGF5ZWRfd29yazsKK307CisKKy8qIEdyZXlidXMgVmlicmF0b3Igb3BlcmF0aW9uIHR5cGVzICovCisjZGVmaW5lCUdCX1ZJQlJBVE9SX1RZUEVfT04JCQkweDAyCisjZGVmaW5lCUdCX1ZJQlJBVE9SX1RZUEVfT0ZGCQkJMHgwMworCitzdGF0aWMgaW50IHR1cm5fb2ZmKHN0cnVjdCBnYl92aWJyYXRvcl9kZXZpY2UgKnZpYikKK3sKKwlzdHJ1Y3QgZ2JfYnVuZGxlICpidW5kbGUgPSB2aWItPmNvbm5lY3Rpb24tPmJ1bmRsZTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmModmliLT5jb25uZWN0aW9uLCBHQl9WSUJSQVRPUl9UWVBFX09GRiwKKwkJCU5VTEwsIDAsIE5VTEwsIDApOworCisJZ2JfcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoYnVuZGxlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdHVybl9vbihzdHJ1Y3QgZ2JfdmlicmF0b3JfZGV2aWNlICp2aWIsIHUxNiB0aW1lb3V0X21zKQoreworCXN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSA9IHZpYi0+Y29ubmVjdGlvbi0+YnVuZGxlOworCWludCByZXQ7CisKKwlyZXQgPSBnYl9wbV9ydW50aW1lX2dldF9zeW5jKGJ1bmRsZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFZpYnJhdG9yIHdhcyBzd2l0Y2hlZCBPTiBlYXJsaWVyICovCisJaWYgKGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmdmliLT5kZWxheWVkX3dvcmspKQorCQl0dXJuX29mZih2aWIpOworCisJcmV0ID0gZ2Jfb3BlcmF0aW9uX3N5bmModmliLT5jb25uZWN0aW9uLCBHQl9WSUJSQVRPUl9UWVBFX09OLAorCQkJTlVMTCwgMCwgTlVMTCwgMCk7CisJaWYgKHJldCkgeworCQlnYl9wbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChidW5kbGUpOworCQlyZXR1cm4gcmV0OworCX0KKworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdmliLT5kZWxheWVkX3dvcmssIG1zZWNzX3RvX2ppZmZpZXModGltZW91dF9tcykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdiX3ZpYnJhdG9yX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZGVsYXllZF93b3JrID0gdG9fZGVsYXllZF93b3JrKHdvcmspOworCXN0cnVjdCBnYl92aWJyYXRvcl9kZXZpY2UgKnZpYiA9CisJCWNvbnRhaW5lcl9vZihkZWxheWVkX3dvcmssIHN0cnVjdCBnYl92aWJyYXRvcl9kZXZpY2UsIGRlbGF5ZWRfd29yayk7CisKKwl0dXJuX29mZih2aWIpOworfQorCitzdGF0aWMgc3NpemVfdCB0aW1lb3V0X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBnYl92aWJyYXRvcl9kZXZpY2UgKnZpYiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBrc3RydG91bChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlkZXZfZXJyKGRldiwgImNvdWxkIG5vdCBwYXJzZSB0aW1lb3V0IHZhbHVlICVkXG4iLCByZXR2YWwpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWlmICh2YWwpCisJCXJldHZhbCA9IHR1cm5fb24odmliLCAodTE2KXZhbCk7CisJZWxzZQorCQlyZXR2YWwgPSB0dXJuX29mZih2aWIpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFJfV08odGltZW91dCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp2aWJyYXRvcl9hdHRyc1tdID0geworCSZkZXZfYXR0cl90aW1lb3V0LmF0dHIsCisJTlVMTCwKK307CitBVFRSSUJVVEVfR1JPVVBTKHZpYnJhdG9yKTsKKworc3RhdGljIHN0cnVjdCBjbGFzcyB2aWJyYXRvcl9jbGFzcyA9IHsKKwkubmFtZQkJPSAidmlicmF0b3IiLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZGV2X2dyb3Vwcwk9IHZpYnJhdG9yX2dyb3VwcywKK307CisKK3N0YXRpYyBERUZJTkVfSURBKG1pbm9ycyk7CisKK3N0YXRpYyBpbnQgZ2JfdmlicmF0b3JfcHJvYmUoc3RydWN0IGdiX2J1bmRsZSAqYnVuZGxlLAorCQkJCQljb25zdCBzdHJ1Y3QgZ3JleWJ1c19idW5kbGVfaWQgKmlkKQoreworCXN0cnVjdCBncmV5YnVzX2Rlc2NyaXB0b3JfY3BvcnQgKmNwb3J0X2Rlc2M7CisJc3RydWN0IGdiX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisJc3RydWN0IGdiX3ZpYnJhdG9yX2RldmljZSAqdmliOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlpbnQgcmV0dmFsOworCisJaWYgKGJ1bmRsZS0+bnVtX2Nwb3J0cyAhPSAxKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWNwb3J0X2Rlc2MgPSAmYnVuZGxlLT5jcG9ydF9kZXNjWzBdOworCWlmIChjcG9ydF9kZXNjLT5wcm90b2NvbF9pZCAhPSBHUkVZQlVTX1BST1RPQ09MX1ZJQlJBVE9SKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXZpYiA9IGt6YWxsb2Moc2l6ZW9mKCp2aWIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZpYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljb25uZWN0aW9uID0gZ2JfY29ubmVjdGlvbl9jcmVhdGUoYnVuZGxlLCBsZTE2X3RvX2NwdShjcG9ydF9kZXNjLT5pZCksCisJCQkJCQlOVUxMKTsKKwlpZiAoSVNfRVJSKGNvbm5lY3Rpb24pKSB7CisJCXJldHZhbCA9IFBUUl9FUlIoY29ubmVjdGlvbik7CisJCWdvdG8gZXJyX2ZyZWVfdmliOworCX0KKwlnYl9jb25uZWN0aW9uX3NldF9kYXRhKGNvbm5lY3Rpb24sIHZpYik7CisKKwl2aWItPmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworCisJZ3JleWJ1c19zZXRfZHJ2ZGF0YShidW5kbGUsIHZpYik7CisKKwlyZXR2YWwgPSBnYl9jb25uZWN0aW9uX2VuYWJsZShjb25uZWN0aW9uKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycl9jb25uZWN0aW9uX2Rlc3Ryb3k7CisKKwkvKgorCSAqIEZvciBub3cgd2UgY3JlYXRlIGEgZGV2aWNlIGluIHN5c2ZzIGZvciB0aGUgdmlicmF0b3IsIGJ1dCBvZGRzIGFyZQorCSAqIHRoZXJlIGlzIGEgInJlYWwiIGRldmljZSBzb21ld2hlcmUgaW4gdGhlIGtlcm5lbCBmb3IgdGhpcywgYnV0IEkKKwkgKiBjYW4ndCBmaW5kIGl0IGF0IHRoZSBtb21lbnQuLi4KKwkgKi8KKwl2aWItPm1pbm9yID0gaWRhX3NpbXBsZV9nZXQoJm1pbm9ycywgMCwgMCwgR0ZQX0tFUk5FTCk7CisJaWYgKHZpYi0+bWlub3IgPCAwKSB7CisJCXJldHZhbCA9IHZpYi0+bWlub3I7CisJCWdvdG8gZXJyX2Nvbm5lY3Rpb25fZGlzYWJsZTsKKwl9CisJZGV2ID0gZGV2aWNlX2NyZWF0ZSgmdmlicmF0b3JfY2xhc3MsICZidW5kbGUtPmRldiwKKwkJCSAgICBNS0RFVigwLCAwKSwgdmliLCAidmlicmF0b3IlZCIsIHZpYi0+bWlub3IpOworCWlmIChJU19FUlIoZGV2KSkgeworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIGVycl9pZGFfcmVtb3ZlOworCX0KKwl2aWItPmRldiA9IGRldjsKKworCUlOSVRfREVMQVlFRF9XT1JLKCZ2aWItPmRlbGF5ZWRfd29yaywgZ2JfdmlicmF0b3Jfd29ya2VyKTsKKworCWdiX3BtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGJ1bmRsZSk7CisKKwlyZXR1cm4gMDsKKworZXJyX2lkYV9yZW1vdmU6CisJaWRhX3NpbXBsZV9yZW1vdmUoJm1pbm9ycywgdmliLT5taW5vcik7CitlcnJfY29ubmVjdGlvbl9kaXNhYmxlOgorCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZShjb25uZWN0aW9uKTsKK2Vycl9jb25uZWN0aW9uX2Rlc3Ryb3k6CisJZ2JfY29ubmVjdGlvbl9kZXN0cm95KGNvbm5lY3Rpb24pOworZXJyX2ZyZWVfdmliOgorCWtmcmVlKHZpYik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBnYl92aWJyYXRvcl9kaXNjb25uZWN0KHN0cnVjdCBnYl9idW5kbGUgKmJ1bmRsZSkKK3sKKwlzdHJ1Y3QgZ2JfdmlicmF0b3JfZGV2aWNlICp2aWIgPSBncmV5YnVzX2dldF9kcnZkYXRhKGJ1bmRsZSk7CisJaW50IHJldDsKKworCXJldCA9IGdiX3BtX3J1bnRpbWVfZ2V0X3N5bmMoYnVuZGxlKTsKKwlpZiAocmV0KQorCQlnYl9wbV9ydW50aW1lX2dldF9ub3Jlc3VtZShidW5kbGUpOworCisJaWYgKGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmdmliLT5kZWxheWVkX3dvcmspKQorCQl0dXJuX29mZih2aWIpOworCisJZGV2aWNlX3VucmVnaXN0ZXIodmliLT5kZXYpOworCWlkYV9zaW1wbGVfcmVtb3ZlKCZtaW5vcnMsIHZpYi0+bWlub3IpOworCWdiX2Nvbm5lY3Rpb25fZGlzYWJsZSh2aWItPmNvbm5lY3Rpb24pOworCWdiX2Nvbm5lY3Rpb25fZGVzdHJveSh2aWItPmNvbm5lY3Rpb24pOworCWtmcmVlKHZpYik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3JleWJ1c19idW5kbGVfaWQgZ2JfdmlicmF0b3JfaWRfdGFibGVbXSA9IHsKKwl7IEdSRVlCVVNfREVWSUNFX0NMQVNTKEdSRVlCVVNfQ0xBU1NfVklCUkFUT1IpIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShncmV5YnVzLCBnYl92aWJyYXRvcl9pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZ3JleWJ1c19kcml2ZXIgZ2JfdmlicmF0b3JfZHJpdmVyID0geworCS5uYW1lCQk9ICJ2aWJyYXRvciIsCisJLnByb2JlCQk9IGdiX3ZpYnJhdG9yX3Byb2JlLAorCS5kaXNjb25uZWN0CT0gZ2JfdmlicmF0b3JfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUJPSBnYl92aWJyYXRvcl9pZF90YWJsZSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGdiX3ZpYnJhdG9yX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gY2xhc3NfcmVnaXN0ZXIoJnZpYnJhdG9yX2NsYXNzKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dmFsID0gZ3JleWJ1c19yZWdpc3RlcigmZ2JfdmlicmF0b3JfZHJpdmVyKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycl9jbGFzc191bnJlZ2lzdGVyOworCisJcmV0dXJuIDA7CisKK2Vycl9jbGFzc191bnJlZ2lzdGVyOgorCWNsYXNzX3VucmVnaXN0ZXIoJnZpYnJhdG9yX2NsYXNzKTsKKworCXJldHVybiByZXR2YWw7Cit9Cittb2R1bGVfaW5pdChnYl92aWJyYXRvcl9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGdiX3ZpYnJhdG9yX2V4aXQodm9pZCkKK3sKKwlncmV5YnVzX2RlcmVnaXN0ZXIoJmdiX3ZpYnJhdG9yX2RyaXZlcik7CisJY2xhc3NfdW5yZWdpc3RlcigmdmlicmF0b3JfY2xhc3MpOworCWlkYV9kZXN0cm95KCZtaW5vcnMpOworfQorbW9kdWxlX2V4aXQoZ2JfdmlicmF0b3JfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9nc19mcGdhYm9vdC5jIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L2dzX2ZwZ2Fib290LmMKaW5kZXggYTIyMWYyNi4uOGVkNGQzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L2dzX2ZwZ2Fib290LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dzX2ZwZ2Fib290L2dzX2ZwZ2Fib290LmMKQEAgLTgsMTAgKzgsNiBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvZ3NfZnBnYWJvb3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9nc19mcGdhYm9vdC5oCmluZGV4IDhjYzMyNTUuLjdiOGNjM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9nc19mcGdhYm9vdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9nc19mcGdhYm9vdC5oCkBAIC03LDEyICs3LDcgQEAKICAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvaW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9pby5oCmluZGV4IDdiNDZhYzIuLjVlODM5YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9pby5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9pby5oCkBAIC02NiwxMCArNjYsOCBAQAogCWJ1c18yYnl0ZQk9IDIsCiB9OwogCi0KICNkZWZpbmUgTUFYX1dBSVRfRE9ORQkxMDAwMAogCi0KIHN0cnVjdCBncGlvYnVzIHsKIAlpbnQJbmdwaW87CiAJdm9pZCBfX2lvbWVtICpyWzRdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2k0bC9hY3QyMDAwL2FjdDIwMDBfaXNhLmMgYi9kcml2ZXJzL3N0YWdpbmcvaTRsL2FjdDIwMDAvYWN0MjAwMF9pc2EuYwppbmRleCBmMGViODQ0Li5hZDdhMDM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaTRsL2FjdDIwMDAvYWN0MjAwMF9pc2EuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaTRsL2FjdDIwMDAvYWN0MjAwMF9pc2EuYwpAQCAtMTM0LDkgKzEzNCw5IEBACiB7CiAJaW50IG9sZF9pcnE7CiAKLQlpZiAoY2FyZC0+ZmxhZ3MgJiBBQ1QyMDAwX0ZMQUdTX0lWQUxJRCkgeworCWlmIChjYXJkLT5mbGFncyAmIEFDVDIwMDBfRkxBR1NfSVZBTElEKQogCQlmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOwotCX0KKwogCWNhcmQtPmZsYWdzICY9IH5BQ1QyMDAwX0ZMQUdTX0lWQUxJRDsKIAlvdXRiKElTQV9DT1JfSVJRT0ZGLCBJU0FfUE9SVF9DT1IpOwogCWlmICghaXJxKQpAQCAtMTY2LDcgKzE2Niw3IEBACiAJCXJlbGVhc2VfcmVnaW9uKGNhcmQtPnBvcnQsIElTQV9SRUdJT04pOwogCQljYXJkLT5mbGFncyAmPSB+QUNUMjAwMF9GTEFHU19QVkFMSUQ7CiAJfQotCWlmIChyZXF1ZXN0X3JlZ2lvbihwb3J0YmFzZSwgQUNUMjAwMF9QT1JUTEVOLCBjYXJkLT5yZWduYW1lKSA9PSBOVUxMKQorCWlmICghcmVxdWVzdF9yZWdpb24ocG9ydGJhc2UsIEFDVDIwMDBfUE9SVExFTiwgY2FyZC0+cmVnbmFtZSkpCiAJCXJldHVybiAtRUJVU1k7CiAJZWxzZSB7CiAJCWNhcmQtPnBvcnQgPSBwb3J0YmFzZTsKQEAgLTE3Niw3ICsxNzYsNyBAQAogfQogCiAvKgotICogUmVsZWFzZSByZXNzb3VyY2VzLCB1c2VkIGJ5IGFuIGFkYXB0b3IuCisgKiBSZWxlYXNlIHJlc291cmNlcywgdXNlZCBieSBhbiBhZGFwdG9yLgogICovCiB2b2lkCiBhY3QyMDAwX2lzYV9yZWxlYXNlKGFjdDIwMDBfY2FyZCAqY2FyZCkKQEAgLTI0NCw3ICsyNDQsNyBAQAogCQkJCWlmICh2YWxpZCkgewogCQkJCQljYXJkLT5pZGF0LmlzYS5yY3ZsZW4gPSAoKGFjdGNhcGlfbXNnaGRyICopJmNhcmQtPmlkYXQuaXNhLnJjdmhkciktPmxlbjsKIAkJCQkJY2FyZC0+aWRhdC5pc2EucmN2c2tiID0gZGV2X2FsbG9jX3NrYihjYXJkLT5pZGF0LmlzYS5yY3ZsZW4pOwotCQkJCQlpZiAoY2FyZC0+aWRhdC5pc2EucmN2c2tiID09IE5VTEwpIHsKKwkJCQkJaWYgKCFjYXJkLT5pZGF0LmlzYS5yY3Zza2IpIHsKIAkJCQkJCWNhcmQtPmlkYXQuaXNhLnJjdmlnbm9yZSA9IDE7CiAJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCQkJCQkgICAgICAgImFjdDIwMDBfaXNhX3JlY2VpdmU6IG5vIG1lbW9yeVxuIik7CkBAIC0zOTksNyArMzk5LDYgQEAKIAl1bnNpZ25lZCBpbnQgbGVuZ3RoOwogCWludCBsOwogCWludCBjOwotCWxvbmcgdGltZW91dDsKIAl1X2NoYXIgKmI7CiAJdV9jaGFyIF9fdXNlciAqcDsKIAl1X2NoYXIgKmJ1ZjsKQEAgLTQxNyw3ICs0MTYsNiBAQAogCWJ1ZiA9IGttYWxsb2MoMTAyNCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWYpCiAJCXJldHVybiAtRU5PTUVNOwotCXRpbWVvdXQgPSAwOwogCXdoaWxlIChsZW5ndGgpIHsKIAkJbCA9IChsZW5ndGggPiAxMDI0KSA/IDEwMjQgOiBsZW5ndGg7CiAJCWMgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2k0bC9hY3QyMDAwL2NhcGkuYyBiL2RyaXZlcnMvc3RhZ2luZy9pNGwvYWN0MjAwMC9jYXBpLmMKaW5kZXggM2Y2NmNhMi4uNjJmNTYyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2k0bC9hY3QyMDAwL2NhcGkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaTRsL2FjdDIwMDAvY2FwaS5jCkBAIC0xMTMsNyArMTEzLDkgQEAKIAkJCW0tPmhkci5jbWQuY21kID0gYzsJCQlcCiAJCQltLT5oZHIuY21kLnN1YmNtZCA9IHM7CQkJXAogCQkJbS0+aGRyLm1zZ251bSA9IGFjdGNhcGlfbmV4dHNtc2coY2FyZCk7IFwKLQkJfSBlbHNlIG0gPSBOVUxMOwkJCQlcCisJCX0gZWxzZSB7CQkJCQlcCisJCQltID0gTlVMTDsJCQkJXAorCQl9CQkJCQkJXAogCX0KIAogI2RlZmluZSBBQ1RDQVBJX0NIS1NLQiBpZiAoIXNrYikgewkJCQkJXApAQCAtNTQ3LDEyICs1NDksMTEgQEAKIGFjdGNhcGlfZGF0YV9iM19pbmQoYWN0MjAwMF9jYXJkICpjYXJkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSB7CiAJX191MTYgcGxjaTsKIAlfX3UxNiBuY2NpOwotCV9fdTE2IGNvbnRyb2xsZXI7CiAJX191OCAgYmxvY2tucjsKIAlpbnQgY2hhbjsKIAlhY3RjYXBpX21zZyAqbXNnID0gKGFjdGNhcGlfbXNnICopc2tiLT5kYXRhOwogCi0JRVZBTF9OQ0NJKG1zZy0+bXNnLmRhdGFfYjNfaW5kLmZha2VuY2NpLCBwbGNpLCBjb250cm9sbGVyLCBuY2NpKTsKKwlFVkFMX05DQ0kobXNnLT5tc2cuZGF0YV9iM19pbmQuZmFrZW5jY2ksIHBsY2ksIG5jY2kpOwogCWNoYW4gPSBmaW5kX25jY2koY2FyZCwgbmNjaSk7CiAJaWYgKGNoYW4gPCAwKQogCQlyZXR1cm4gMDsKQEAgLTYxNyw3ICs2MTgsNyBAQAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwogCQl0bXAgPSBza2JfcGVlaygoc3RydWN0IHNrX2J1ZmZfaGVhZCAqKXRtcCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKCh0bXAgPT0gc2tiKSB8fCAodG1wID09IE5VTEwpKSB7CisJCWlmICgodG1wID09IHNrYikgfHwgIXRtcCkgewogCQkJLyogcmVhY2hlZCBlbmQgb2YgcXVldWUgKi8KIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFjdDIwMDA6IGhhbmRsZV9hY2sgbm90aGluZyBmb3VuZCFcbiIpOwogCQkJcmV0dXJuIDA7CkBAIC05OTAsNyArOTkxLDggQEAKIH0KIAogI2lmZGVmIERFQlVHX0RVTVBfU0tCCi1zdGF0aWMgdm9pZCBkdW1wX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSB7CitzdGF0aWMgdm9pZCBkdW1wX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorewogCWNoYXIgdG1wWzgwXTsKIAljaGFyICpwID0gc2tiLT5kYXRhOwogCWNoYXIgKnQgPSB0bXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaTRsL2FjdDIwMDAvY2FwaS5oIGIvZHJpdmVycy9zdGFnaW5nL2k0bC9hY3QyMDAwL2NhcGkuaAppbmRleCAwMWNjZGVjLi4zNDg4NGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaTRsL2FjdDIwMDAvY2FwaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pNGwvYWN0MjAwMC9jYXBpLmgKQEAgLTExNCw5ICsxMTQsOCBAQAogI2RlZmluZSBNQUtFX05DQ0kocGxjaSwgY29udHIsIG5jY2kpCQkJCQlcCiAJKChwbGNpICYgMHgxZikgfCAoKGNvbnRyICYgMHg3KSA8PCA1KSB8ICgobmNjaSAmIDB4ZmYpIDw8IDgpKQogCi0jZGVmaW5lIEVWQUxfTkNDSShmYWtlbmNjaSwgcGxjaSwgY29udHIsIG5jY2kpIHsJXAorI2RlZmluZSBFVkFMX05DQ0koZmFrZW5jY2ksIHBsY2ksIG5jY2kpIHsJXAogCQlwbGNpICA9IGZha2VuY2NpICYgMHgxZjsJCVwKLQkJY29udHIgPSAoZmFrZW5jY2kgPj4gNSkgJiAweDc7CQlcCiAJCW5jY2kgID0gKGZha2VuY2NpID4+IDgpICYgMHhmZjsJCVwKIAl9CiAKQEAgLTEyOCwxMyArMTI3LDYgQEAKICAqIEJpdCA1LTcgID0gQ29udHJvbGxlcgogICogQml0IDgtMTUgPSByZXNlcnZlZCAobXVzdCBiZSAwKQogICovCi0jZGVmaW5lIE1BS0VfUExDSShwbGNpLCBjb250cikJCQlcCi0JKChwbGNpICYgMHgxZikgfCAoKGNvbnRyICYgMHg3KSA8PCA1KSkKLQotI2RlZmluZSBFVkFMX1BMQ0koZmFrZXBsY2ksIHBsY2ksIGNvbnRyKSB7CVwKLQkJcGxjaSAgPSBmYWtlcGxjaSAmIDB4MWY7CVwKLQkJY29udHIgPSAoZmFrZXBsY2kgPj4gNSkgJiAweDc7CVwKLQl9CiAKIHR5cGVkZWYgc3RydWN0IGFjdGNhcGlfbXNnIHsKIAlhY3RjYXBpX21zZ2hkciBoZHI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaTRsL2FjdDIwMDAvbW9kdWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaTRsL2FjdDIwMDAvbW9kdWxlLmMKaW5kZXggNjgwNzNkMC4uOTljOWMwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2k0bC9hY3QyMDAwL21vZHVsZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pNGwvYWN0MjAwMC9tb2R1bGUuYwpAQCAtMjgsNyArMjgsNyBAQAogc3RhdGljIGFjdDIwMDBfY2FyZCAqY2FyZHMgPSAoYWN0MjAwMF9jYXJkICopIE5VTEw7CiAKIC8qIFBhcmFtZXRlcnMgdG8gYmUgc2V0IGJ5IGluc21vZCAqLwotc3RhdGljIGludCAgIGFjdF9idXMgID0gIDA7CitzdGF0aWMgaW50ICAgYWN0X2J1czsKIHN0YXRpYyBpbnQgICBhY3RfcG9ydCA9IC0xOyAgLyogLTEgPSBBdXRvcHJvYmUgICovCiBzdGF0aWMgaW50ICAgYWN0X2lycSAgPSAtMTsKIHN0YXRpYyBjaGFyICphY3RfaWQgICA9ICJcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMCI7CkBAIC0yODksNyArMjg5LDggQEAKIAkJCWlmIChjb3B5X2Zyb21fdXNlcih0bXAsIGFyZywKIAkJCQkJICAgc2l6ZW9mKHRtcCkpKQogCQkJCXJldHVybiAtRUZBVUxUOwotCQkJaWYgKChyZXQgPSBhY3QyMDAwX3NldF9tc24oY2FyZCwgdG1wKSkpCisJCQlyZXQgPSBhY3QyMDAwX3NldF9tc24oY2FyZCwgdG1wKTsKKwkJCWlmIChyZXQpCiAJCQkJcmV0dXJuIHJldDsKIAkJCWlmIChjYXJkLT5mbGFncyAmIEFDVDIwMDBfRkxBR1NfUlVOTklORykKIAkJCQlyZXR1cm4gKGFjdGNhcGlfbWFudWZhY3R1cmVyX3JlcV9tc24oY2FyZCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2k0bC9pY24vaWNuLmMgYi9kcml2ZXJzL3N0YWdpbmcvaTRsL2ljbi9pY24uYwppbmRleCA0NmQ5NTdjLi41MTRiZmMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaTRsL2ljbi9pY24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaTRsL2ljbi9pY24uYwpAQCAtNjIsNyArNjIsOCBAQAogCXNrYl9xdWV1ZV9wdXJnZShxdWV1ZSk7CiAJY2FyZC0+eGxlbltjaGFubmVsXSA9IDA7CiAJY2FyZC0+c25kY291bnRbY2hhbm5lbF0gPSAwOwotCWlmICgoc2tiID0gY2FyZC0+eHNrYltjaGFubmVsXSkpIHsKKwlza2IgPSBjYXJkLT54c2tiW2NoYW5uZWxdOworCWlmIChza2IpIHsKIAkJY2FyZC0+eHNrYltjaGFubmVsXSA9IE5VTEw7CiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAl9CkBAIC04MSwxMiArODIsMTEgQEAKIAkgICAgIGludCBmaXJzdGJpdCwKIAkgICAgIGludCBiaXRjb3VudCkKIHsKLQogCXJlZ2lzdGVyIHVfY2hhciBzOwogCXJlZ2lzdGVyIHVfY2hhciBjOwogCiAJZm9yIChzID0gZmlyc3RiaXQsIGMgPSBiaXRjb3VudDsgYyA+IDA7IHMtLSwgYy0tKQotCQlPVVRCX1AoKHVfY2hhcikgKCh2YWwgPj4gcykgJiAxKSA/IDB4ZmYgOiAwLCBwb3J0KTsKKwkJT1VUQl9QKCh1X2NoYXIpKCh2YWwgPj4gcykgJiAxKSA/IDB4ZmYgOiAwLCBwb3J0KTsKIH0KIAogLyoKQEAgLTI3Miw4ICsyNzIsMTAgQEAKIAkJCXJibmV4dDsKIAkJCWljbl9tYXByZWxlYXNlX2NoYW5uZWwoY2FyZCwgbWNoICYgMik7CiAJCQlpZiAoIWVmbGFnKSB7Ci0JCQkJaWYgKChjbnQgPSBjYXJkLT5yY3ZpZHhbY2hhbm5lbF0pKSB7Ci0JCQkJCWlmICghKHNrYiA9IGRldl9hbGxvY19za2IoY250KSkpIHsKKwkJCQljbnQgPSBjYXJkLT5yY3ZpZHhbY2hhbm5lbF07CisJCQkJaWYgKGNudCkgeworCQkJCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGNudCk7CisJCQkJCWlmICghc2tiKSB7CiAJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJpY246IHJlY2VpdmUgb3V0IG9mIG1lbW9yeVxuIik7CiAJCQkJCQlicmVhazsKIAkJCQkJfQpAQCAtMzgyLDcgKzM4NCw3IEBACiBzdGF0aWMgdm9pZAogaWNuX3BvbGxiY2hhbih1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0JaWNuX2NhcmQgKmNhcmQgPSAoaWNuX2NhcmQgKikgZGF0YTsKKwlpY25fY2FyZCAqY2FyZCA9IChpY25fY2FyZCAqKWRhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChjYXJkLT5mbGFncyAmIElDTl9GTEFHU19CMUFDVElWRSkgewpAQCAtNDcyLDcgKzQ3NCw2IEBACiAKIAkJaWYgKGNhcmQtPmZsYWdzICYKIAkJICAgICgoY2hhbm5lbCkgPyBJQ05fRkxBR1NfQjJBQ1RJVkUgOiBJQ05fRkxBR1NfQjFBQ1RJVkUpKSB7Ci0KIAkJCWlzZG5fY3RybCBuY21kOwogCiAJCQljYXJkLT5mbGFncyAmPSB+KChjaGFubmVsKSA/CkBAIC01NDQsNyArNTQ1LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSA2OgogCQlzbnByaW50ZihjbWQucGFybS5udW0sIHNpemVvZihjbWQucGFybS5udW0pLCAiJWQiLAotCQkJIChpbnQpIHNpbXBsZV9zdHJ0b3VsKHN0YXR1cyArIDcsIE5VTEwsIDE2KSk7CisJCQkgKGludClzaW1wbGVfc3RydG91bChzdGF0dXMgKyA3LCBOVUxMLCAxNikpOwogCQlicmVhazsKIAljYXNlIDc6CiAJCXN0YXR1cyArPSAzOwpAQCAtNjA0LDcgKzYwNSw3IEBACiBzdGF0aWMgdm9pZAogaWNuX3BvbGxkY2hhbih1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0JaWNuX2NhcmQgKmNhcmQgPSAoaWNuX2NhcmQgKikgZGF0YTsKKwlpY25fY2FyZCAqY2FyZCA9IChpY25fY2FyZCAqKWRhdGE7CiAJaW50IG1jaCA9IGNhcmQtPnNlY29uZGhhbGYgPyAyIDogMDsKIAlpbnQgYXZhaWwgPSAwOwogCWludCBsZWZ0OwpAQCAtNjU2LDkgKzY1Nyw4IEBACiAJCQkJCQkqcSA9ICdcMCc7CiAJCQkJCQlzdHJjYXQodnN0ciwgIjAwMCIpOwogCQkJCQkJdnN0clszXSA9ICdcMCc7Ci0JCQkJCQljYXJkLT5md19yZXYgPSAoaW50KSBzaW1wbGVfc3RydG91bCh2c3RyLCBOVUxMLCAxMCk7CisJCQkJCQljYXJkLT5md19yZXYgPSAoaW50KXNpbXBsZV9zdHJ0b3VsKHZzdHIsIE5VTEwsIDEwKTsKIAkJCQkJCWNvbnRpbnVlOwotCiAJCQkJCX0KIAkJCQl9CiAJCQl9IGVsc2UgewpAQCAtNjgzLDcgKzY4Myw3IEBACiAJCQljYXJkLT5mbGFncyB8PSBJQ05fRkxBR1NfUkJUSU1FUjsKIAkJCWRlbF90aW1lcigmY2FyZC0+cmJfdGltZXIpOwogCQkJY2FyZC0+cmJfdGltZXIuZnVuY3Rpb24gPSBpY25fcG9sbGJjaGFuOwotCQkJY2FyZC0+cmJfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBjYXJkOworCQkJY2FyZC0+cmJfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWNhcmQ7CiAJCQljYXJkLT5yYl90aW1lci5leHBpcmVzID0gamlmZmllcyArIElDTl9USU1FUl9CQ1JFQUQ7CiAJCQlhZGRfdGltZXIoJmNhcmQtPnJiX3RpbWVyKTsKIAkJfQpAQCAtODA1LDE3ICs4MDUsMTIgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAjaWZkZWYgQk9PVF9ERUJVRwotCXByaW50ayhLRVJOX0RFQlVHICJpY25fbG9hZGJvb3QgY2FsbGVkLCBidWZmYWRkcj0lMDhseFxuIiwgKHVsb25nKSBidWZmZXIpOworCXByaW50ayhLRVJOX0RFQlVHICJpY25fbG9hZGJvb3QgY2FsbGVkLCBidWZmYWRkcj0lMDhseFxuIiwgKHVsb25nKWJ1ZmZlcik7CiAjZW5kaWYKLQlpZiAoIShjb2RlYnVmID0ga21hbGxvYyhJQ05fQ09ERV9TVEFHRTEsIEdGUF9LRVJORUwpKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJpY246IENvdWxkIG5vdCBhbGxvY2F0ZSBjb2RlIGJ1ZmZlclxuIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQlpZiAoY29weV9mcm9tX3VzZXIoY29kZWJ1ZiwgYnVmZmVyLCBJQ05fQ09ERV9TVEFHRTEpKSB7Ci0JCXJldCA9IC1FRkFVTFQ7Ci0JCWdvdG8gb3V0X2tmcmVlOwotCX0KKwljb2RlYnVmID0gbWVtZHVwX3VzZXIoYnVmZmVyLCBJQ05fQ09ERV9TVEFHRTEpOworCWlmIChJU19FUlIoY29kZWJ1ZikpCisJCXJldHVybiBQVFJfRVJSKGNvZGVidWYpOworCiAJaWYgKCFjYXJkLT5ydmFsaWQpIHsKIAkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihjYXJkLT5wb3J0LCBJQ05fUE9SVExFTiwgY2FyZC0+cmVnbmFtZSkpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKQEAgLTg3OCw5ICs4NzMsOSBAQAogCX0KIAlTTEVFUCgxKTsKIAlPVVRCX1AoMHhmZiwgSUNOX1JVTik7ICAvKiBTdGFydCBCb290LUNvZGUgKi8KLQlpZiAoKHJldCA9IGljbl9jaGVja19sb2FkZXIoY2FyZC0+ZG91YmxlUzAgPyAyIDogMSkpKSB7CisJcmV0ID0gaWNuX2NoZWNrX2xvYWRlcihjYXJkLT5kb3VibGVTMCA/IDIgOiAxKTsKKwlpZiAocmV0KQogCQlnb3RvIG91dF9rZnJlZTsKLQl9CiAJaWYgKCFjYXJkLT5kb3VibGVTMCkgewogCQlyZXQgPSAwOwogCQlnb3RvIG91dF9rZnJlZTsKQEAgLTg5OCw3ICs4OTMsNiBAQAogCiBvdXRfa2ZyZWU6CiAJa2ZyZWUoY29kZWJ1Zik7Ci1vdXQ6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtOTgwLDE4ICs5NzQsMTcgQEAKIAkJCQkgICAgICAgY2FyZC0+c2Vjb25kaGFsZik7CiAjZW5kaWYKIAkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwotCQkJCWluaXRfdGltZXIoJmNhcmQtPnN0X3RpbWVyKTsKLQkJCQljYXJkLT5zdF90aW1lci5leHBpcmVzID0gamlmZmllcyArIElDTl9USU1FUl9EQ1JFQUQ7Ci0JCQkJY2FyZC0+c3RfdGltZXIuZnVuY3Rpb24gPSBpY25fcG9sbGRjaGFuOwotCQkJCWNhcmQtPnN0X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgY2FyZDsKLQkJCQlhZGRfdGltZXIoJmNhcmQtPnN0X3RpbWVyKTsKKwkJCQlzZXR1cF90aW1lcigmY2FyZC0+c3RfdGltZXIsIGljbl9wb2xsZGNoYW4sCisJCQkJCSAgICAodW5zaWduZWQgbG9uZyljYXJkKTsKKwkJCQltb2RfdGltZXIoJmNhcmQtPnN0X3RpbWVyLAorCQkJCQkgIGppZmZpZXMgKyBJQ05fVElNRVJfRENSRUFEKTsKIAkJCQljYXJkLT5mbGFncyB8PSBJQ05fRkxBR1NfUlVOTklORzsKIAkJCQlpZiAoY2FyZC0+ZG91YmxlUzApIHsKLQkJCQkJaW5pdF90aW1lcigmY2FyZC0+b3RoZXItPnN0X3RpbWVyKTsKLQkJCQkJY2FyZC0+b3RoZXItPnN0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSUNOX1RJTUVSX0RDUkVBRDsKLQkJCQkJY2FyZC0+b3RoZXItPnN0X3RpbWVyLmZ1bmN0aW9uID0gaWNuX3BvbGxkY2hhbjsKLQkJCQkJY2FyZC0+b3RoZXItPnN0X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgY2FyZC0+b3RoZXI7Ci0JCQkJCWFkZF90aW1lcigmY2FyZC0+b3RoZXItPnN0X3RpbWVyKTsKKwkJCQkJc2V0dXBfdGltZXIoJmNhcmQtPm90aGVyLT5zdF90aW1lciwKKwkJCQkJCSAgICBpY25fcG9sbGRjaGFuLAorCQkJCQkJICAgICh1bnNpZ25lZCBsb25nKWNhcmQtPm90aGVyKTsKKwkJCQkJbW9kX3RpbWVyKCZjYXJkLT5vdGhlci0+c3RfdGltZXIsCisJCQkJCQkgIGppZmZpZXMgKyBJQ05fVElNRVJfRENSRUFEKTsKIAkJCQkJY2FyZC0+b3RoZXItPmZsYWdzIHw9IElDTl9GTEFHU19SVU5OSU5HOwogCQkJCX0KIAkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CkBAIC0xMDIyLDcgKzEwMTUsOCBAQAogCiAvKiBQdXQgY29tbWFuZC1zdHJpbmdzIGludG8gdGhlIGNvbW1hbmQtcXVldWUgb2YgdGhlIEludGVyZmFjZSAqLwogc3RhdGljIGludAotaWNuX3dyaXRlY21kKGNvbnN0IHVfY2hhciAqYnVmLCBpbnQgbGVuLCBpbnQgdXNlciwgaWNuX2NhcmQgKmNhcmQpCitpY25fd3JpdGVjbWQoY29uc3QgdV9jaGFyIF9fdXNlciAqdWJ1ZiwgY29uc3QgdV9jaGFyICprYnVmLCBpbnQgbGVuLAorCSAgICAgaW50IHVzZXIsIGljbl9jYXJkICpjYXJkKQogewogCWludCBtY2ggPSBjYXJkLT5zZWNvbmRoYWxmID8gMiA6IDA7CiAJaW50IHBwOwpAQCAtMTA0NSwxMCArMTAzOSwxMCBAQAogCQlpZiAoY291bnQgPiBsZW4pCiAJCQljb3VudCA9IGxlbjsKIAkJaWYgKHVzZXIpIHsKLQkJCWlmIChjb3B5X2Zyb21fdXNlcihtc2csIGJ1ZiwgY291bnQpKQorCQkJaWYgKGNvcHlfZnJvbV91c2VyKG1zZywgdWJ1ZiwgY291bnQpKQogCQkJCXJldHVybiAtRUZBVUxUOwogCQl9IGVsc2UKLQkJCW1lbWNweShtc2csIGJ1ZiwgY291bnQpOworCQkJbWVtY3B5KG1zZywga2J1ZiwgY291bnQpOwogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYuZGV2bG9jaywgZmxhZ3MpOwogCQlsYXN0bWFwX2NhcmQgPSBkZXYubWNhcmQ7CkBAIC0xMTkwLDI4ICsxMTg0LDI4IEBACiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBJQ05fSU9DVExfR0VUTU1JTzoKLQkJCXJldHVybiAobG9uZykgZGV2Lm1lbWFkZHI7CisJCQlyZXR1cm4gKGxvbmcpZGV2Lm1lbWFkZHI7CiAJCWNhc2UgSUNOX0lPQ1RMX1NFVFBPUlQ6CiAJCQlpZiAoYSA9PSAweDMwMCB8fCBhID09IDB4MzEwIHx8IGEgPT0gMHgzMjAgfHwgYSA9PSAweDMzMAogCQkJICAgIHx8IGEgPT0gMHgzNDAgfHwgYSA9PSAweDM1MCB8fCBhID09IDB4MzYwIHx8CiAJCQkgICAgYSA9PSAweDMwOCB8fCBhID09IDB4MzE4IHx8IGEgPT0gMHgzMjggfHwgYSA9PSAweDMzOAogCQkJICAgIHx8IGEgPT0gMHgzNDggfHwgYSA9PSAweDM1OCB8fCBhID09IDB4MzY4KSB7Ci0JCQkJaWYgKGNhcmQtPnBvcnQgIT0gKHVuc2lnbmVkIHNob3J0KSBhKSB7Ci0JCQkJCWlmICghcmVxdWVzdF9yZWdpb24oKHVuc2lnbmVkIHNob3J0KSBhLCBJQ05fUE9SVExFTiwgImljbi1pc2RuIikpIHsKKwkJCQlpZiAoY2FyZC0+cG9ydCAhPSAodW5zaWduZWQgc2hvcnQpYSkgeworCQkJCQlpZiAoIXJlcXVlc3RfcmVnaW9uKCh1bnNpZ25lZCBzaG9ydClhLCBJQ05fUE9SVExFTiwgImljbi1pc2RuIikpIHsKIAkJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCQkJCSAgICAgICAiaWNuOiAoJXMpIHBvcnRzIDB4JTAzeC0weCUwM3ggaW4gdXNlLlxuIiwKLQkJCQkJCSAgICAgICBDSUQsIChpbnQpIGEsIChpbnQpIGEgKyBJQ05fUE9SVExFTik7CisJCQkJCQkgICAgICAgQ0lELCAoaW50KWEsIChpbnQpYSArIElDTl9QT1JUTEVOKTsKIAkJCQkJCXJldHVybiAtRUlOVkFMOwogCQkJCQl9Ci0JCQkJCXJlbGVhc2VfcmVnaW9uKCh1bnNpZ25lZCBzaG9ydCkgYSwgSUNOX1BPUlRMRU4pOworCQkJCQlyZWxlYXNlX3JlZ2lvbigodW5zaWduZWQgc2hvcnQpYSwgSUNOX1BPUlRMRU4pOwogCQkJCQlpY25fc3RvcGNhcmQoY2FyZCk7CiAJCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CiAJCQkJCWlmIChjYXJkLT5ydmFsaWQpCiAJCQkJCQlyZWxlYXNlX3JlZ2lvbihjYXJkLT5wb3J0LCBJQ05fUE9SVExFTik7Ci0JCQkJCWNhcmQtPnBvcnQgPSAodW5zaWduZWQgc2hvcnQpIGE7CisJCQkJCWNhcmQtPnBvcnQgPSAodW5zaWduZWQgc2hvcnQpYTsKIAkJCQkJY2FyZC0+cnZhbGlkID0gMDsKIAkJCQkJaWYgKGNhcmQtPmRvdWJsZVMwKSB7Ci0JCQkJCQljYXJkLT5vdGhlci0+cG9ydCA9ICh1bnNpZ25lZCBzaG9ydCkgYTsKKwkJCQkJCWNhcmQtPm90aGVyLT5wb3J0ID0gKHVuc2lnbmVkIHNob3J0KWE7CiAJCQkJCQljYXJkLT5vdGhlci0+cnZhbGlkID0gMDsKIAkJCQkJfQogCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CkBAIC0xMjIzLDkgKzEyMTcsOSBAQAogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJYnJlYWs7CiAJCWNhc2UgSUNOX0lPQ1RMX0dFVFBPUlQ6Ci0JCQlyZXR1cm4gKGludCkgY2FyZC0+cG9ydDsKKwkJCXJldHVybiAoaW50KWNhcmQtPnBvcnQ7CiAJCWNhc2UgSUNOX0lPQ1RMX0dFVERPVUJMRToKLQkJCXJldHVybiAoaW50KSBjYXJkLT5kb3VibGVTMDsKKwkJCXJldHVybiAoaW50KWNhcmQtPmRvdWJsZVMwOwogCQljYXNlIElDTl9JT0NUTF9ERUJVR1ZBUjoKIAkJCWlmIChjb3B5X3RvX3VzZXIoYXJnLAogCQkJCQkgJmNhcmQsCkBAIC0xMjQ2LDEwICsxMjQwLDExIEBACiAJCQkJZGV2LmZpcnN0bG9hZCA9IDA7CiAJCQl9CiAJCQlpY25fc3RvcGNhcmQoY2FyZCk7Ci0JCQlyZXR1cm4gKGljbl9sb2FkYm9vdChhcmcsIGNhcmQpKTsKKwkJCXJldHVybiBpY25fbG9hZGJvb3QoYXJnLCBjYXJkKTsKIAkJY2FzZSBJQ05fSU9DVExfTE9BRFBST1RPOgogCQkJaWNuX3N0b3BjYXJkKGNhcmQpOwotCQkJaWYgKChpID0gKGljbl9sb2FkcHJvdG8oYXJnLCBjYXJkKSkpKQorCQkJaSA9IChpY25fbG9hZHByb3RvKGFyZywgY2FyZCkpOworCQkJaWYgKGkpCiAJCQkJcmV0dXJuIGk7CiAJCQlpZiAoY2FyZC0+ZG91YmxlUzApCiAJCQkJaSA9IGljbl9sb2FkcHJvdG8oYXJnICsgSUNOX0NPREVfU1RBR0UyLCBjYXJkLT5vdGhlcik7CkBAIC0xMjYyLDE5ICsxMjU3LDIwIEBACiAJCQkJCSAgIGFyZywKIAkJCQkJICAgc2l6ZW9mKGNkZWYpKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXJldHVybiAoaWNuX2FkZGNhcmQoY2RlZi5wb3J0LCBjZGVmLmlkMSwgY2RlZi5pZDIpKTsKKwkJCXJldHVybiBpY25fYWRkY2FyZChjZGVmLnBvcnQsIGNkZWYuaWQxLCBjZGVmLmlkMik7CiAJCQlicmVhazsKIAkJY2FzZSBJQ05fSU9DVExfTEVBU0VEQ0ZHOgogCQkJaWYgKGEpIHsKIAkJCQlpZiAoIWNhcmQtPmxlYXNlZCkgewogCQkJCQljYXJkLT5sZWFzZWQgPSAxOwotCQkJCQl3aGlsZSAoY2FyZC0+cHR5cGUgPT0gSVNETl9QVFlQRV9VTktOT1dOKSB7CisJCQkJCXdoaWxlIChjYXJkLT5wdHlwZSA9PSBJU0ROX1BUWVBFX1VOS05PV04pCiAJCQkJCQltc2xlZXBfaW50ZXJydXB0aWJsZShJQ05fQk9PVF9USU1FT1VUMSk7Ci0JCQkJCX0KIAkJCQkJbXNsZWVwX2ludGVycnVwdGlibGUoSUNOX0JPT1RfVElNRU9VVDEpOwogCQkJCQlzcHJpbnRmKGNidWYsICIwMDtGVjJPTlxuMDE7RUFaJWNcbjAyO0VBWiVjXG4iLAogCQkJCQkJKGEgJiAxKSA/ICcxJyA6ICdDJywgKGEgJiAyKSA/ICcyJyA6ICdDJyk7Ci0JCQkJCWkgPSBpY25fd3JpdGVjbWQoY2J1Ziwgc3RybGVuKGNidWYpLCAwLCBjYXJkKTsKKwkJCQkJaSA9IGljbl93cml0ZWNtZChOVUxMLCBjYnVmLAorCQkJCQkJCSBzdHJsZW4oY2J1ZiksCisJCQkJCQkJIDAsIGNhcmQpOwogCQkJCQlwcmludGsoS0VSTl9JTkZPCiAJCQkJCSAgICAgICAiaWNuOiAoJXMpIExlYXNlZC1saW5lIG1vZGUgZW5hYmxlZFxuIiwKIAkJCQkJICAgICAgIENJRCk7CkBAIC0xMjg3LDcgKzEyODMsOSBAQAogCQkJCWlmIChjYXJkLT5sZWFzZWQpIHsKIAkJCQkJY2FyZC0+bGVhc2VkID0gMDsKIAkJCQkJc3ByaW50ZihjYnVmLCAiMDA7RlYyT0ZGXG4iKTsKLQkJCQkJaSA9IGljbl93cml0ZWNtZChjYnVmLCBzdHJsZW4oY2J1ZiksIDAsIGNhcmQpOworCQkJCQlpID0gaWNuX3dyaXRlY21kKE5VTEwsIGNidWYsCisJCQkJCQkJIHN0cmxlbihjYnVmKSwKKwkJCQkJCQkgMCwgY2FyZCk7CiAJCQkJCXByaW50ayhLRVJOX0lORk8KIAkJCQkJICAgICAgICJpY246ICglcykgTGVhc2VkLWxpbmUgbW9kZSBkaXNhYmxlZFxuIiwKIAkJCQkJICAgICAgIENJRCk7CkBAIC0xMzIxLDEwICsxMzE5LDEwIEBACiAJCQkJLyogTm9ybWFsIERpYWwgKi8KIAkJCQlzdHJjcHkoZGNvZGUsICJDQUwiKTsKIAkJCXNucHJpbnRmKGNidWYsIHNpemVvZihjYnVmKSwKLQkJCQkgIiUwMmQ7RCVzX1IlcywlMDJkLCUwMmQsJXNcbiIsIChpbnQpIChhICsgMSksCisJCQkJICIlMDJkO0Qlc19SJXMsJTAyZCwlMDJkLCVzXG4iLCAoaW50KShhICsgMSksCiAJCQkJIGRjb2RlLCBwLCBjLT5wYXJtLnNldHVwLnNpMSwKIAkJCQkgYy0+cGFybS5zZXR1cC5zaTIsIGMtPnBhcm0uc2V0dXAuZWF6bXNuKTsKLQkJCWkgPSBpY25fd3JpdGVjbWQoY2J1Ziwgc3RybGVuKGNidWYpLCAwLCBjYXJkKTsKKwkJCWkgPSBpY25fd3JpdGVjbWQoTlVMTCwgY2J1Ziwgc3RybGVuKGNidWYpLCAwLCBjYXJkKTsKIAkJfQogCQlicmVhazsKIAljYXNlIElTRE5fQ01EX0FDQ0VQVEQ6CkBAIC0xMzM1LDE2ICsxMzMzLDE4IEBACiAJCQlpZiAoY2FyZC0+ZndfcmV2ID49IDMwMCkgewogCQkJCXN3aXRjaCAoY2FyZC0+bDJfcHJvdG9bYSAtIDFdKSB7CiAJCQkJY2FzZSBJU0ROX1BST1RPX0wyX1g3NUk6Ci0JCQkJCXNwcmludGYoY2J1ZiwgIiUwMmQ7Qlg3NVxuIiwgKGludCkgYSk7CisJCQkJCXNwcmludGYoY2J1ZiwgIiUwMmQ7Qlg3NVxuIiwgKGludClhKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBJU0ROX1BST1RPX0wyX0hETEM6Ci0JCQkJCXNwcmludGYoY2J1ZiwgIiUwMmQ7QlRSQVxuIiwgKGludCkgYSk7CisJCQkJCXNwcmludGYoY2J1ZiwgIiUwMmQ7QlRSQVxuIiwgKGludClhKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQotCQkJCWkgPSBpY25fd3JpdGVjbWQoY2J1Ziwgc3RybGVuKGNidWYpLCAwLCBjYXJkKTsKKwkJCQlpID0gaWNuX3dyaXRlY21kKE5VTEwsIGNidWYsCisJCQkJCQkgc3RybGVuKGNidWYpLCAwLAorCQkJCQkJIGNhcmQpOwogCQkJfQotCQkJc3ByaW50ZihjYnVmLCAiJTAyZDtEQ09OX1JcbiIsIChpbnQpIGEpOwotCQkJaSA9IGljbl93cml0ZWNtZChjYnVmLCBzdHJsZW4oY2J1ZiksIDAsIGNhcmQpOworCQkJc3ByaW50ZihjYnVmLCAiJTAyZDtEQ09OX1JcbiIsIChpbnQpYSk7CisJCQlpID0gaWNuX3dyaXRlY21kKE5VTEwsIGNidWYsIHN0cmxlbihjYnVmKSwgMCwgY2FyZCk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBJU0ROX0NNRF9BQ0NFUFRCOgpAQCAtMTM1NSwxNCArMTM1NSwxNCBAQAogCQkJaWYgKGNhcmQtPmZ3X3JldiA+PSAzMDApCiAJCQkJc3dpdGNoIChjYXJkLT5sMl9wcm90b1thIC0gMV0pIHsKIAkJCQljYXNlIElTRE5fUFJPVE9fTDJfWDc1SToKLQkJCQkJc3ByaW50ZihjYnVmLCAiJTAyZDtCQ09OX1IsQlg3NVxuIiwgKGludCkgYSk7CisJCQkJCXNwcmludGYoY2J1ZiwgIiUwMmQ7QkNPTl9SLEJYNzVcbiIsIChpbnQpYSk7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgSVNETl9QUk9UT19MMl9IRExDOgotCQkJCQlzcHJpbnRmKGNidWYsICIlMDJkO0JDT05fUixCVFJBXG4iLCAoaW50KSBhKTsKKwkJCQkJc3ByaW50ZihjYnVmLCAiJTAyZDtCQ09OX1IsQlRSQVxuIiwgKGludClhKTsKIAkJCQkJYnJlYWs7CiAJCQkJfSBlbHNlCi0JCQkJc3ByaW50ZihjYnVmLCAiJTAyZDtCQ09OX1JcbiIsIChpbnQpIGEpOwotCQkJaSA9IGljbl93cml0ZWNtZChjYnVmLCBzdHJsZW4oY2J1ZiksIDAsIGNhcmQpOworCQkJCXNwcmludGYoY2J1ZiwgIiUwMmQ7QkNPTl9SXG4iLCAoaW50KWEpOworCQkJaSA9IGljbl93cml0ZWNtZChOVUxMLCBjYnVmLCBzdHJsZW4oY2J1ZiksIDAsIGNhcmQpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgSVNETl9DTURfSEFOR1VQOgpAQCAtMTM3MCw4ICsxMzcwLDggQEAKIAkJCXJldHVybiAtRU5PREVWOwogCQlpZiAoYy0+YXJnIDwgSUNOX0JDSCkgewogCQkJYSA9IGMtPmFyZyArIDE7Ci0JCQlzcHJpbnRmKGNidWYsICIlMDJkO0JESVNfUlxuJTAyZDtERElTX1JcbiIsIChpbnQpIGEsIChpbnQpIGEpOwotCQkJaSA9IGljbl93cml0ZWNtZChjYnVmLCBzdHJsZW4oY2J1ZiksIDAsIGNhcmQpOworCQkJc3ByaW50ZihjYnVmLCAiJTAyZDtCRElTX1JcbiUwMmQ7RERJU19SXG4iLCAoaW50KWEsIChpbnQpYSk7CisJCQlpID0gaWNuX3dyaXRlY21kKE5VTEwsIGNidWYsIHN0cmxlbihjYnVmKSwgMCwgY2FyZCk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBJU0ROX0NNRF9TRVRFQVo6CkBAIC0xMzgyLDEyICsxMzgyLDEyIEBACiAJCWlmIChjLT5hcmcgPCBJQ05fQkNIKSB7CiAJCQlhID0gYy0+YXJnICsgMTsKIAkJCWlmIChjYXJkLT5wdHlwZSA9PSBJU0ROX1BUWVBFX0VVUk8pIHsKLQkJCQlzcHJpbnRmKGNidWYsICIlMDJkO01TJXMlc1xuIiwgKGludCkgYSwKKwkJCQlzcHJpbnRmKGNidWYsICIlMDJkO01TJXMlc1xuIiwgKGludClhLAogCQkJCQljLT5wYXJtLm51bVswXSA/ICJOIiA6ICJBTEwiLCBjLT5wYXJtLm51bSk7CiAJCQl9IGVsc2UKLQkJCQlzcHJpbnRmKGNidWYsICIlMDJkO0VBWiVzXG4iLCAoaW50KSBhLAorCQkJCXNwcmludGYoY2J1ZiwgIiUwMmQ7RUFaJXNcbiIsIChpbnQpYSwKIAkJCQkJYy0+cGFybS5udW1bMF0gPyAoY2hhciAqKShjLT5wYXJtLm51bSkgOiAiMDEyMzQ1Njc4OSIpOwotCQkJaSA9IGljbl93cml0ZWNtZChjYnVmLCBzdHJsZW4oY2J1ZiksIDAsIGNhcmQpOworCQkJaSA9IGljbl93cml0ZWNtZChOVUxMLCBjYnVmLCBzdHJsZW4oY2J1ZiksIDAsIGNhcmQpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgSVNETl9DTURfQ0xSRUFaOgpAQCAtMTM5OCwxMCArMTM5OCwxMCBAQAogCQlpZiAoYy0+YXJnIDwgSUNOX0JDSCkgewogCQkJYSA9IGMtPmFyZyArIDE7CiAJCQlpZiAoY2FyZC0+cHR5cGUgPT0gSVNETl9QVFlQRV9FVVJPKQotCQkJCXNwcmludGYoY2J1ZiwgIiUwMmQ7TVNOQ1xuIiwgKGludCkgYSk7CisJCQkJc3ByaW50ZihjYnVmLCAiJTAyZDtNU05DXG4iLCAoaW50KWEpOwogCQkJZWxzZQotCQkJCXNwcmludGYoY2J1ZiwgIiUwMmQ7RUFaQ1xuIiwgKGludCkgYSk7Ci0JCQlpID0gaWNuX3dyaXRlY21kKGNidWYsIHN0cmxlbihjYnVmKSwgMCwgY2FyZCk7CisJCQkJc3ByaW50ZihjYnVmLCAiJTAyZDtFQVpDXG4iLCAoaW50KWEpOworCQkJaSA9IGljbl93cml0ZWNtZChOVUxMLCBjYnVmLCBzdHJsZW4oY2J1ZiksIDAsIGNhcmQpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgSVNETl9DTURfU0VUTDI6CkBAIC0xNDExLDE1ICsxNDExLDE1IEBACiAJCQlhID0gYy0+YXJnOwogCQkJc3dpdGNoIChhID4+IDgpIHsKIAkJCWNhc2UgSVNETl9QUk9UT19MMl9YNzVJOgotCQkJCXNwcmludGYoY2J1ZiwgIiUwMmQ7Qlg3NVxuIiwgKGludCkgKGEgJiAyNTUpICsgMSk7CisJCQkJc3ByaW50ZihjYnVmLCAiJTAyZDtCWDc1XG4iLCAoaW50KShhICYgMjU1KSArIDEpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBJU0ROX1BST1RPX0wyX0hETEM6Ci0JCQkJc3ByaW50ZihjYnVmLCAiJTAyZDtCVFJBXG4iLCAoaW50KSAoYSAmIDI1NSkgKyAxKTsKKwkJCQlzcHJpbnRmKGNidWYsICIlMDJkO0JUUkFcbiIsIChpbnQpKGEgJiAyNTUpICsgMSk7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQotCQkJaSA9IGljbl93cml0ZWNtZChjYnVmLCBzdHJsZW4oY2J1ZiksIDAsIGNhcmQpOworCQkJaSA9IGljbl93cml0ZWNtZChOVUxMLCBjYnVmLCBzdHJsZW4oY2J1ZiksIDAsIGNhcmQpOwogCQkJY2FyZC0+bDJfcHJvdG9bYSAmIDI1NV0gPSAoYSA+PiA4KTsKIAkJfQogCQlicmVhazsKQEAgLTE0NDYsNyArMTQ0Niw3IEBACiAJCQlyZXR1cm4gcDsKIAkJcCA9IHAtPm5leHQ7CiAJfQotCXJldHVybiAoaWNuX2NhcmQgKikgMDsKKwlyZXR1cm4gKGljbl9jYXJkICopMDsKIH0KIAogLyoKQEAgLTE0NTgsNyArMTQ1OCw3IEBACiAJaWNuX2NhcmQgKmNhcmQgPSBpY25fZmluZGNhcmQoYy0+ZHJpdmVyKTsKIAogCWlmIChjYXJkKQotCQlyZXR1cm4gKGljbl9jb21tYW5kKGMsIGNhcmQpKTsKKwkJcmV0dXJuIGljbl9jb21tYW5kKGMsIGNhcmQpOwogCXByaW50ayhLRVJOX0VSUgogCSAgICAgICAiaWNuOiBpZl9jb21tYW5kICVkIGNhbGxlZCB3aXRoIGludmFsaWQgZHJpdmVySWQgJWQhXG4iLAogCSAgICAgICBjLT5jb21tYW5kLCBjLT5kcml2ZXIpOwpAQCAtMTQ3Myw3ICsxNDczLDcgQEAKIAlpZiAoY2FyZCkgewogCQlpZiAoIShjYXJkLT5mbGFncyAmIElDTl9GTEFHU19SVU5OSU5HKSkKIAkJCXJldHVybiAtRU5PREVWOwotCQlyZXR1cm4gKGljbl93cml0ZWNtZChidWYsIGxlbiwgMSwgY2FyZCkpOworCQlyZXR1cm4gaWNuX3dyaXRlY21kKGJ1ZiwgTlVMTCwgbGVuLCAxLCBjYXJkKTsKIAl9CiAJcHJpbnRrKEtFUk5fRVJSCiAJICAgICAgICJpY246IGlmX3dyaXRlY21kIGNhbGxlZCB3aXRoIGludmFsaWQgZHJpdmVySWQhXG4iKTsKQEAgLTE0ODgsNyArMTQ4OCw3IEBACiAJaWYgKGNhcmQpIHsKIAkJaWYgKCEoY2FyZC0+ZmxhZ3MgJiBJQ05fRkxBR1NfUlVOTklORykpCiAJCQlyZXR1cm4gLUVOT0RFVjsKLQkJcmV0dXJuIChpY25fcmVhZHN0YXR1cyhidWYsIGxlbiwgY2FyZCkpOworCQlyZXR1cm4gaWNuX3JlYWRzdGF0dXMoYnVmLCBsZW4sIGNhcmQpOwogCX0KIAlwcmludGsoS0VSTl9FUlIKIAkgICAgICAgImljbjogaWZfcmVhZHN0YXR1cyBjYWxsZWQgd2l0aCBpbnZhbGlkIGRyaXZlcklkIVxuIik7CkBAIC0xNTAzLDcgKzE1MDMsNyBAQAogCWlmIChjYXJkKSB7CiAJCWlmICghKGNhcmQtPmZsYWdzICYgSUNOX0ZMQUdTX1JVTk5JTkcpKQogCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCXJldHVybiAoaWNuX3NlbmRidWYoY2hhbm5lbCwgYWNrLCBza2IsIGNhcmQpKTsKKwkJcmV0dXJuIGljbl9zZW5kYnVmKGNoYW5uZWwsIGFjaywgc2tiLCBjYXJkKTsKIAl9CiAJcHJpbnRrKEtFUk5fRVJSCiAJICAgICAgICJpY246IGlmX3NlbmRidWYgY2FsbGVkIHdpdGggaW52YWxpZCBkcml2ZXJJZCFcbiIpOwpAQCAtMTUyMCwxMCArMTUyMCwxMSBAQAogCWljbl9jYXJkICpjYXJkOwogCWludCBpOwogCi0JaWYgKCEoY2FyZCA9IGt6YWxsb2Moc2l6ZW9mKGljbl9jYXJkKSwgR0ZQX0tFUk5FTCkpKSB7CisJY2FyZCA9IGt6YWxsb2Moc2l6ZW9mKGljbl9jYXJkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjYXJkKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICJpY246ICglcykgQ291bGQgbm90IGFsbG9jYXRlIGNhcmQtc3RydWN0LlxuIiwgaWQpOwotCQlyZXR1cm4gKGljbl9jYXJkICopIDA7CisJCXJldHVybiAoaWNuX2NhcmQgKikwOwogCX0KIAlzcGluX2xvY2tfaW5pdCgmY2FyZC0+bG9jayk7CiAJY2FyZC0+cG9ydCA9IHBvcnQ7CkBAIC0xNTU1LDcgKzE1NTYsNyBAQAogCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCSAgICAgICAiaWNuOiBVbmFibGUgdG8gcmVnaXN0ZXIgJXNcbiIsIGlkKTsKIAkJa2ZyZWUoY2FyZCk7Ci0JCXJldHVybiAoaWNuX2NhcmQgKikgMDsKKwkJcmV0dXJuIChpY25fY2FyZCAqKTA7CiAJfQogCWNhcmQtPm15aWQgPSBjYXJkLT5pbnRlcmZhY2UuY2hhbm5lbHM7CiAJc3ByaW50ZihjYXJkLT5yZWduYW1lLCAiaWNuLWlzZG4gKCVzKSIsIGNhcmQtPmludGVyZmFjZS5pZCk7CkBAIC0xNTY4LDE2ICsxNTY5LDE3IEBACiAJaWNuX2NhcmQgKmNhcmQ7CiAJaWNuX2NhcmQgKmNhcmQyOwogCi0JaWYgKCEoY2FyZCA9IGljbl9pbml0Y2FyZChwb3J0LCBpZDEpKSkgeworCWNhcmQgPSBpY25faW5pdGNhcmQocG9ydCwgaWQxKTsKKwlpZiAoIWNhcmQpCiAJCXJldHVybiAtRUlPOwotCX0KIAlpZiAoIXN0cmxlbihpZDIpKSB7CiAJCXByaW50ayhLRVJOX0lORk8KIAkJICAgICAgICJpY246ICglcykgSUNOLTJCLCBwb3J0IDB4JXggYWRkZWRcbiIsCiAJCSAgICAgICBjYXJkLT5pbnRlcmZhY2UuaWQsIHBvcnQpOwogCQlyZXR1cm4gMDsKIAl9Ci0JaWYgKCEoY2FyZDIgPSBpY25faW5pdGNhcmQocG9ydCwgaWQyKSkpIHsKKwljYXJkMiA9IGljbl9pbml0Y2FyZChwb3J0LCBpZDIpOworCWlmICghY2FyZDIpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTwogCQkgICAgICAgImljbjogKCVzKSBoYWxmIElDTi00QiwgcG9ydCAweCV4IGFkZGVkXG4iLCBpZDIsIHBvcnQpOwogCQlyZXR1cm4gMDsKQEAgLTE2MTEsMTMgKzE2MTMsMTQgQEAKIAlpZiAoc3RyICYmICpzdHIpIHsKIAkJc3RybGNweShzaWQsIHN0ciwgc2l6ZW9mKHNpZCkpOwogCQlpY25faWQgPSBzaWQ7Ci0JCWlmICgocCA9IHN0cmNocihzaWQsICcsJykpKSB7CisJCXAgPSBzdHJjaHIoc2lkLCAnLCcpOworCQlpZiAocCkgewogCQkJKnArKyA9IDA7CiAJCQlzdHJjcHkoc2lkMiwgcCk7CiAJCQlpY25faWQyID0gc2lkMjsKIAkJfQogCX0KLQlyZXR1cm4gKDEpOworCXJldHVybiAxOwogfQogX19zZXR1cCgiaWNuPSIsIGljbl9zZXR1cCk7CiAjZW5kaWYgLyogTU9EVUxFICovCkBAIC0xNjM0LDcgKzE2MzcsOCBAQAogCWRldi5maXJzdGxvYWQgPSAxOwogCXNwaW5fbG9ja19pbml0KCZkZXYuZGV2bG9jayk7CiAKLQlpZiAoKHAgPSBzdHJjaHIocmV2aXNpb24sICc6JykpKSB7CisJcCA9IHN0cmNocihyZXZpc2lvbiwgJzonKTsKKwlpZiAocCkgewogCQlzdHJuY3B5KHJldiwgcCArIDEsIDIwKTsKIAkJcmV2WzIwXSA9ICdcMCc7CiAJCXAgPSBzdHJjaHIocmV2LCAnJCcpOwpAQCAtMTY0NCw3ICsxNjQ4LDcgQEAKIAkJc3RyY3B5KHJldiwgIiA/Pz8gIik7CiAJcHJpbnRrKEtFUk5fTk9USUNFICJJQ04tSVNETi1kcml2ZXIgUmV2JXNtZW09MHglMDhseFxuIiwgcmV2LAogCSAgICAgICBkZXYubWVtYWRkcik7Ci0JcmV0dXJuIChpY25fYWRkY2FyZChwb3J0YmFzZSwgaWNuX2lkLCBpY25faWQyKSk7CisJcmV0dXJuIGljbl9hZGRjYXJkKHBvcnRiYXNlLCBpY25faWQsIGljbl9pZDIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaWNuX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pNGwvcGNiaXQvY2FwaS5jIGIvZHJpdmVycy9zdGFnaW5nL2k0bC9wY2JpdC9jYXBpLmMKaW5kZXggNGUzY2JmOC4uMzczZjkwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2k0bC9wY2JpdC9jYXBpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2k0bC9wY2JpdC9jYXBpLmMKQEAgLTkyLDkgKzkyLDcgQEAKIAkJKihza2JfcHV0KCpza2IsIDEpKSA9IDB4ODA7ICAgICAvKiBTcGVlY2gJCSovCiAJCSooc2tiX3B1dCgqc2tiLCAxKSkgPSAweDEwOyAgICAgLyogQ2lyY3VpdCBNb2RlCQkqLwogCQkqKHNrYl9wdXQoKnNrYiwgMSkpID0gMHgyMzsgICAgIC8qIEEtbGF3CQkqLwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCS8qIEJlYXJlciBDYXBhYmlsaXR5IC0gTWFuZGF0b3J5Ki8KIAkJKihza2JfcHV0KCpza2IsIDEpKSA9IDI7ICAgICAgICAvKiBCQzAuTGVuZ3RoCQkqLwogCQkqKHNrYl9wdXQoKnNrYiwgMSkpID0gMHg4ODsgICAgIC8qIERpZ2l0YWwgSW5mb3JtYXRpb24JKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pNGwvcGNiaXQvZHJ2LmMgYi9kcml2ZXJzL3N0YWdpbmcvaTRsL3BjYml0L2Rydi5jCmluZGV4IGM1MjcwZTIuLmQ0MTdkZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pNGwvcGNiaXQvZHJ2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2k0bC9wY2JpdC9kcnYuYwpAQCAtMzU5LDExICszNTksOSBAQAogCQkgKi8KICNpZmRlZiBCTE9DS19USU1FUgogCQlpZiAoY2hhbi0+YmxvY2tfdGltZXIuZnVuY3Rpb24gPT0gTlVMTCkgewotCQkJaW5pdF90aW1lcigmY2hhbi0+YmxvY2tfdGltZXIpOwotCQkJY2hhbi0+YmxvY2tfdGltZXIuZnVuY3Rpb24gPSAgJnBjYml0X2Jsb2NrX3RpbWVyOwotCQkJY2hhbi0+YmxvY2tfdGltZXIuZGF0YSA9IChsb25nKSBjaGFuOwotCQkJY2hhbi0+YmxvY2tfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAxICogSFo7Ci0JCQlhZGRfdGltZXIoJmNoYW4tPmJsb2NrX3RpbWVyKTsKKwkJCXNldHVwX3RpbWVyKCZjaGFuLT5ibG9ja190aW1lciwgJnBjYml0X2Jsb2NrX3RpbWVyLAorCQkJCSAgICAobG9uZyljaGFuKTsKKwkJCW1vZF90aW1lcigmY2hhbi0+YmxvY2tfdGltZXIsIGppZmZpZXMgKyAxICogSFopOwogCQl9CiAjZW5kaWYKIAkJcmV0dXJuIDA7CkBAIC04MDQsMTEgKzgwMiw3IEBACiB7CiAJaXNkbl9jdHJsIGN0bDsKIAotCWluaXRfdGltZXIoJmRldi0+c2V0X3J1bm5pbmdfdGltZXIpOwotCi0JZGV2LT5zZXRfcnVubmluZ190aW1lci5mdW5jdGlvbiA9ICZzZXRfcnVubmluZ190aW1lb3V0OwotCWRldi0+c2V0X3J1bm5pbmdfdGltZXIuZGF0YSA9ICh1bG9uZykgZGV2OwotCWRldi0+c2V0X3J1bm5pbmdfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBTRVRfUlVOX1RJTUVPVVQ7CisJc2V0dXBfdGltZXIoJmRldi0+c2V0X3J1bm5pbmdfdGltZXIsICZzZXRfcnVubmluZ190aW1lb3V0LCAodWxvbmcpZGV2KTsKIAogCS8qIGtpY2sgaXQgKi8KIApAQCAtODE3LDcgKzgxMSw3IEBACiAJd3JpdGViKCgweDgwVSB8ICgoZGV2LT5yY3Zfc2VxICYgMHgwNykgPDwgMykgfCAoZGV2LT5zZW5kX3NlcSAmIDB4MDcpKSwKIAkgICAgICAgZGV2LT5zaF9tZW0gKyBCQU5LNCk7CiAKLQlhZGRfdGltZXIoJmRldi0+c2V0X3J1bm5pbmdfdGltZXIpOworCW1vZF90aW1lcigmZGV2LT5zZXRfcnVubmluZ190aW1lciwgamlmZmllcyArIFNFVF9SVU5fVElNRU9VVCk7CiAKIAl3YWl0X2V2ZW50KGRldi0+c2V0X3J1bm5pbmdfd3EsIGRldi0+bDJfc3RhdGUgPT0gTDJfUlVOTklORyB8fAogCQkJCQlkZXYtPmwyX3N0YXRlID09IEwyX0RPV04pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2k0bC9wY2JpdC9lZHNzMS5jIGIvZHJpdmVycy9zdGFnaW5nL2k0bC9wY2JpdC9lZHNzMS5jCmluZGV4IGU3MmMxNjQuLjZkMjkxZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pNGwvcGNiaXQvZWRzczEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaTRsL3BjYml0L2Vkc3MxLmMKQEAgLTI5OCwxMSArMjk4LDggQEAKIAkJCWJyZWFrOwogCiAJaWYgKHRlbnRyeS0+aW5pdCAhPSAweGZmKSB7Ci0JCWluaXRfdGltZXIoJmNoYW4tPmZzbV90aW1lcik7Ci0JCWNoYW4tPmZzbV90aW1lci5mdW5jdGlvbiA9ICZwY2JpdF9mc21fdGltZXI7Ci0JCWNoYW4tPmZzbV90aW1lci5kYXRhID0gKHVsb25nKSBjaGFuOwotCQljaGFuLT5mc21fdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyB0ZW50cnktPnRpbWVvdXQgKiBIWjsKLQkJYWRkX3RpbWVyKCZjaGFuLT5mc21fdGltZXIpOworCQlzZXR1cF90aW1lcigmY2hhbi0+ZnNtX3RpbWVyLCAmcGNiaXRfZnNtX3RpbWVyLCAodWxvbmcpY2hhbik7CisJCW1vZF90aW1lcigmY2hhbi0+ZnNtX3RpbWVyLCBqaWZmaWVzICsgdGVudHJ5LT50aW1lb3V0ICogSFopOwogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2k0bC9wY2JpdC9sYXllcjIuYyBiL2RyaXZlcnMvc3RhZ2luZy9pNGwvcGNiaXQvbGF5ZXIyLmMKaW5kZXggNDZlMTI0MC4uYTEzNmM3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2k0bC9wY2JpdC9sYXllcjIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaTRsL3BjYml0L2xheWVyMi5jCkBAIC02NDUsMTEgKzY0NSw5IEBACiAKIAkJZGV2LT5sMl9zdGF0ZSA9IEwyX0RPV047CiAKLQkJaW5pdF90aW1lcigmZGV2LT5lcnJvcl9yZWNvdmVyX3RpbWVyKTsKLQkJZGV2LT5lcnJvcl9yZWNvdmVyX3RpbWVyLmZ1bmN0aW9uID0gJnBjYml0X2wyX2Vycl9yZWNvdmVyOwotCQlkZXYtPmVycm9yX3JlY292ZXJfdGltZXIuZGF0YSA9ICh1bG9uZykgZGV2OwotCQlkZXYtPmVycm9yX3JlY292ZXJfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBFUlJUSU1FOwotCQlhZGRfdGltZXIoJmRldi0+ZXJyb3JfcmVjb3Zlcl90aW1lcik7CisJCXNldHVwX3RpbWVyKCZkZXYtPmVycm9yX3JlY292ZXJfdGltZXIsICZwY2JpdF9sMl9lcnJfcmVjb3ZlciwKKwkJCSAgICAodWxvbmcpZGV2KTsKKwkJbW9kX3RpbWVyKCZkZXYtPmVycm9yX3JlY292ZXJfdGltZXIsIGppZmZpZXMgKyBFUlJUSU1FKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwLmgKaW5kZXggOWM4YTk1OC4uNGRjYzg1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwLmgKQEAgLTExMyw2ICsxMTMsNyBAQAogI2RlZmluZSBTQ0EzMDAwX09VVF9DVFJMX0JVRl9YX0VOCQkweDEwCiAjZGVmaW5lIFNDQTMwMDBfT1VUX0NUUkxfQlVGX1lfRU4JCTB4MDgKICNkZWZpbmUgU0NBMzAwMF9PVVRfQ1RSTF9CVUZfWl9FTgkJMHgwNAorI2RlZmluZSBTQ0EzMDAwX09VVF9DVFJMX0JVRl9ESVZfTUFTSwkJMHgwMwogI2RlZmluZSBTQ0EzMDAwX09VVF9DVFJMX0JVRl9ESVZfNAkJMHgwMgogI2RlZmluZSBTQ0EzMDAwX09VVF9DVFJMX0JVRl9ESVZfMgkJMHgwMQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDBfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwX2NvcmUuYwppbmRleCBiNTYyNWY1Li5kNjI2MTI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDBfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMF9jb3JlLmMKQEAgLTQwMiw2ICs0MDIsNyBAQAogCQkuY2hhbm5lbDIgPSBtb2QsCQkJCVwKIAkJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVyksCVwKIAkJLmluZm9fbWFza19zaGFyZWRfYnlfdHlwZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSxcCisJCS5pbmZvX21hc2tfc2hhcmVkX2J5X2FsbCA9IEJJVChJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUSksXAogCQkuYWRkcmVzcyA9IGluZGV4LAkJCQlcCiAJCS5zY2FuX2luZGV4ID0gaW5kZXgsCQkJCVwKIAkJLnNjYW5fdHlwZSA9IHsJCQkJCVwKQEAgLTQxMiw3ICs0MTMsNyBAQAogCQl9LAkJCQkJCVwKIAkJLmV2ZW50X3NwZWMgPSAmc2NhMzAwMF9ldmVudCwJCQlcCiAJCS5udW1fZXZlbnRfc3BlY3MgPSAxLAkJCQlcCi0JIH0KKwl9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBzY2EzMDAwX2NoYW5uZWxzW10gPSB7CiAJU0NBMzAwMF9DSEFOKDAsIElJT19NT0RfWCksCkBAIC00NDMsNiArNDQ0LDk3IEBACiAJICAgICAgIFNDQTMwMDBfTURfQ1RSTF9PUl9afSwKIH07CiAKKy8qKgorICogX19zY2EzMDAwX2dldF9iYXNlX2ZyZXEoKSBvYnRhaW4gbW9kZSBzcGVjaWZpYyBiYXNlIGZyZXF1ZW5jeQorICoKKyAqIGxvY2sgbXVzdCBiZSBoZWxkCisgKiovCitzdGF0aWMgaW5saW5lIGludCBfX3NjYTMwMDBfZ2V0X2Jhc2VfZnJlcShzdHJ1Y3Qgc2NhMzAwMF9zdGF0ZSAqc3QsCisJCQkJCSAgY29uc3Qgc3RydWN0IHNjYTMwMDBfY2hpcF9pbmZvICppbmZvLAorCQkJCQkgIGludCAqYmFzZV9mcmVxKQoreworCWludCByZXQ7CisKKwlyZXQgPSBzY2EzMDAwX3JlYWRfZGF0YV9zaG9ydChzdCwgU0NBMzAwMF9SRUdfQUREUl9NT0RFLCAxKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKwlzd2l0Y2ggKDB4MDMgJiBzdC0+cnhbMF0pIHsKKwljYXNlIFNDQTMwMDBfTUVBU19NT0RFX05PUk1BTDoKKwkJKmJhc2VfZnJlcSA9IGluZm8tPm1lYXN1cmVtZW50X21vZGVfZnJlcTsKKwkJYnJlYWs7CisJY2FzZSBTQ0EzMDAwX01FQVNfTU9ERV9PUF8xOgorCQkqYmFzZV9mcmVxID0gaW5mby0+b3B0aW9uX21vZGVfMV9mcmVxOworCQlicmVhazsKKwljYXNlIFNDQTMwMDBfTUVBU19NT0RFX09QXzI6CisJCSpiYXNlX2ZyZXEgPSBpbmZvLT5vcHRpb25fbW9kZV8yX2ZyZXE7CisJCWJyZWFrOworCX0KK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHJlYWRfcmF3IGhhbmRsZXIgZm9yIElJT19DSEFOX0lORk9fU0FNUF9GUkVRCisgKgorICogbG9jayBtdXN0IGJlIGhlbGQKKyAqKi8KK3N0YXRpYyBpbnQgcmVhZF9yYXdfc2FtcF9mcmVxKHN0cnVjdCBzY2EzMDAwX3N0YXRlICpzdCwgaW50ICp2YWwpCit7CisJaW50IHJldDsKKworCXJldCA9IF9fc2NhMzAwMF9nZXRfYmFzZV9mcmVxKHN0LCBzdC0+aW5mbywgdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gc2NhMzAwMF9yZWFkX2N0cmxfcmVnKHN0LCBTQ0EzMDAwX1JFR19DVFJMX1NFTF9PVVRfQ1RSTCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoKnZhbCA+IDApIHsKKwkJcmV0ICY9IFNDQTMwMDBfT1VUX0NUUkxfQlVGX0RJVl9NQVNLOworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIFNDQTMwMDBfT1VUX0NUUkxfQlVGX0RJVl8yOgorCQkJKnZhbCAvPSAyOworCQkJYnJlYWs7CisJCWNhc2UgU0NBMzAwMF9PVVRfQ1RSTF9CVUZfRElWXzQ6CisJCQkqdmFsIC89IDQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHdyaXRlX3JhdyBoYW5kbGVyIGZvciBJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUQorICoKKyAqIGxvY2sgbXVzdCBiZSBoZWxkCisgKiovCitzdGF0aWMgaW50IHdyaXRlX3Jhd19zYW1wX2ZyZXEoc3RydWN0IHNjYTMwMDBfc3RhdGUgKnN0LCBpbnQgdmFsKQoreworCWludCByZXQsIGJhc2VfZnJlcSwgY3RybHZhbDsKKworCXJldCA9IF9fc2NhMzAwMF9nZXRfYmFzZV9mcmVxKHN0LCBzdC0+aW5mbywgJmJhc2VfZnJlcSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNjYTMwMDBfcmVhZF9jdHJsX3JlZyhzdCwgU0NBMzAwMF9SRUdfQ1RSTF9TRUxfT1VUX0NUUkwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJY3RybHZhbCA9IHJldCAmIH5TQ0EzMDAwX09VVF9DVFJMX0JVRl9ESVZfTUFTSzsKKworCWlmICh2YWwgPT0gYmFzZV9mcmVxIC8gMikKKwkJY3RybHZhbCB8PSBTQ0EzMDAwX09VVF9DVFJMX0JVRl9ESVZfMjsKKwlpZiAodmFsID09IGJhc2VfZnJlcSAvIDQpCisJCWN0cmx2YWwgfD0gU0NBMzAwMF9PVVRfQ1RSTF9CVUZfRElWXzQ7CisJZWxzZSBpZiAodmFsICE9IGJhc2VfZnJlcSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gc2NhMzAwMF93cml0ZV9jdHJsX3JlZyhzdCwgU0NBMzAwMF9SRUdfQ1RSTF9TRUxfT1VUX0NUUkwsCisJCQkJICAgICBjdHJsdmFsKTsKK30KKwogc3RhdGljIGludCBzY2EzMDAwX3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCiAJCQkgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCiAJCQkgICAgaW50ICp2YWwsCkBAIC00OTUsMTEgKzU4NywzOCBAQAogCQkqdmFsID0gLTIxNDsKIAkJKnZhbDIgPSA2MDAwMDA7CiAJCXJldHVybiBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCWNhc2UgSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVE6CisJCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKwkJcmV0ID0gcmVhZF9yYXdfc2FtcF9mcmVxKHN0LCB2YWwpOworCQltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKwkJcmV0dXJuIHJldCA/IHJldCA6IElJT19WQUxfSU5UOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIH0KIAorc3RhdGljIGludCBzY2EzMDAwX3dyaXRlX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCSAgICAgaW50IHZhbCwgaW50IHZhbDIsIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3Qgc2NhMzAwMF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQ7CisKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIElJT19DSEFOX0lORk9fU0FNUF9GUkVROgorCQlpZiAodmFsMikKKwkJCXJldHVybiAtRUlOVkFMOworCQltdXRleF9sb2NrKCZzdC0+bG9jayk7CisJCXJldCA9IHdyaXRlX3Jhd19zYW1wX2ZyZXEoc3QsIHZhbCk7CisJCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCQlyZXR1cm4gcmV0OworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKIC8qKgogICogc2NhMzAwMF9yZWFkX2F2X2ZyZXEoKSBzeXNmcyBmdW5jdGlvbiB0byBnZXQgYXZhaWxhYmxlIGZyZXF1ZW5jaWVzCiAgKgpAQCAtNTQ4LDEzMyArNjY3LDEyIEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyoqCi0gKiBfX3NjYTMwMDBfZ2V0X2Jhc2VfZnJlcSgpIG9idGFpbiBtb2RlIHNwZWNpZmljIGJhc2UgZnJlcXVlbmN5Ci0gKgotICogbG9jayBtdXN0IGJlIGhlbGQKLSAqKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9fc2NhMzAwMF9nZXRfYmFzZV9mcmVxKHN0cnVjdCBzY2EzMDAwX3N0YXRlICpzdCwKLQkJCQkJICBjb25zdCBzdHJ1Y3Qgc2NhMzAwMF9jaGlwX2luZm8gKmluZm8sCi0JCQkJCSAgaW50ICpiYXNlX2ZyZXEpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IHNjYTMwMDBfcmVhZF9kYXRhX3Nob3J0KHN0LCBTQ0EzMDAwX1JFR19BRERSX01PREUsIDEpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfcmV0OwotCXN3aXRjaCAoMHgwMyAmIHN0LT5yeFswXSkgewotCWNhc2UgU0NBMzAwMF9NRUFTX01PREVfTk9STUFMOgotCQkqYmFzZV9mcmVxID0gaW5mby0+bWVhc3VyZW1lbnRfbW9kZV9mcmVxOwotCQlicmVhazsKLQljYXNlIFNDQTMwMDBfTUVBU19NT0RFX09QXzE6Ci0JCSpiYXNlX2ZyZXEgPSBpbmZvLT5vcHRpb25fbW9kZV8xX2ZyZXE7Ci0JCWJyZWFrOwotCWNhc2UgU0NBMzAwMF9NRUFTX01PREVfT1BfMjoKLQkJKmJhc2VfZnJlcSA9IGluZm8tPm9wdGlvbl9tb2RlXzJfZnJlcTsKLQkJYnJlYWs7Ci0JfQotZXJyb3JfcmV0OgotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogc2NhMzAwMF9yZWFkX2ZyZXF1ZW5jeSgpIHN5c2ZzIGludGVyZmFjZSB0byBnZXQgdGhlIGN1cnJlbnQgZnJlcXVlbmN5Ci0gKiovCi1zdGF0aWMgc3NpemVfdCBzY2EzMDAwX3JlYWRfZnJlcXVlbmN5KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICAgICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGRldik7Ci0Jc3RydWN0IHNjYTMwMDBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKLQlpbnQgcmV0LCBsZW4gPSAwLCBiYXNlX2ZyZXEgPSAwLCB2YWw7Ci0KLQltdXRleF9sb2NrKCZzdC0+bG9jayk7Ci0JcmV0ID0gX19zY2EzMDAwX2dldF9iYXNlX2ZyZXEoc3QsIHN0LT5pbmZvLCAmYmFzZV9mcmVxKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yX3JldF9tdXQ7Ci0JcmV0ID0gc2NhMzAwMF9yZWFkX2N0cmxfcmVnKHN0LCBTQ0EzMDAwX1JFR19DVFJMX1NFTF9PVVRfQ1RSTCk7Ci0JbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3JfcmV0OwotCXZhbCA9IHJldDsKLQlpZiAoYmFzZV9mcmVxID4gMCkKLQkJc3dpdGNoICh2YWwgJiAweDAzKSB7Ci0JCWNhc2UgMHgwMDoKLQkJY2FzZSAweDAzOgotCQkJbGVuID0gc3ByaW50ZihidWYsICIlZFxuIiwgYmFzZV9mcmVxKTsKLQkJCWJyZWFrOwotCQljYXNlIDB4MDE6Ci0JCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBiYXNlX2ZyZXEgLyAyKTsKLQkJCWJyZWFrOwotCQljYXNlIDB4MDI6Ci0JCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBiYXNlX2ZyZXEgLyA0KTsKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybiBsZW47Ci1lcnJvcl9yZXRfbXV0OgotCW11dGV4X3VubG9jaygmc3QtPmxvY2spOwotZXJyb3JfcmV0OgotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogc2NhMzAwMF9zZXRfZnJlcXVlbmN5KCkgc3lzZnMgaW50ZXJmYWNlIHRvIHNldCB0aGUgY3VycmVudCBmcmVxdWVuY3kKLSAqKi8KLXN0YXRpYyBzc2l6ZV90IHNjYTMwMDBfc2V0X2ZyZXF1ZW5jeShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCQkgICAgIHNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGRldik7Ci0Jc3RydWN0IHNjYTMwMDBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKLQlpbnQgcmV0LCBiYXNlX2ZyZXEgPSAwOwotCWludCBjdHJsdmFsOwotCWludCB2YWw7Ci0KLQlyZXQgPSBrc3RydG9pbnQoYnVmLCAxMCwgJnZhbCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKLQkvKiBXaGF0IG1vZGUgYXJlIHdlIGluPyAqLwotCXJldCA9IF9fc2NhMzAwMF9nZXRfYmFzZV9mcmVxKHN0LCBzdC0+aW5mbywgJmJhc2VfZnJlcSk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcl9mcmVlX2xvY2s7Ci0KLQlyZXQgPSBzY2EzMDAwX3JlYWRfY3RybF9yZWcoc3QsIFNDQTMwMDBfUkVHX0NUUkxfU0VMX09VVF9DVFJMKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcl9mcmVlX2xvY2s7Ci0JY3RybHZhbCA9IHJldDsKLQkvKiBjbGVhciB0aGUgYml0cyAqLwotCWN0cmx2YWwgJj0gfjB4MDM7Ci0KLQlpZiAodmFsID09IGJhc2VfZnJlcSAvIDIpIHsKLQkJY3RybHZhbCB8PSBTQ0EzMDAwX09VVF9DVFJMX0JVRl9ESVZfMjsKLQl9IGVsc2UgaWYgKHZhbCA9PSBiYXNlX2ZyZXEgLyA0KSB7Ci0JCWN0cmx2YWwgfD0gU0NBMzAwMF9PVVRfQ1RSTF9CVUZfRElWXzQ7Ci0JfSBlbHNlIGlmICh2YWwgIT0gYmFzZV9mcmVxKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyb3JfZnJlZV9sb2NrOwotCX0KLQlyZXQgPSBzY2EzMDAwX3dyaXRlX2N0cmxfcmVnKHN0LCBTQ0EzMDAwX1JFR19DVFJMX1NFTF9PVVRfQ1RSTCwKLQkJCQkgICAgIGN0cmx2YWwpOwotZXJyb3JfZnJlZV9sb2NrOgotCW11dGV4X3VubG9jaygmc3QtPmxvY2spOwotCi0JcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKLX0KLQogLyoKICAqIFNob3VsZCBvbmx5IHJlYWxseSBiZSByZWdpc3RlcmVkIGlmIHJpbmcgYnVmZmVyIHN1cHBvcnQgaXMgY29tcGlsZWQgaW4uCiAgKiBEb2VzIG5vIGhhcm0gaG93ZXZlciBhbmQgZG9pbmcgaXQgcmlnaHQgd291bGQgYWRkIGEgZmFpciBiaXQgb2YgY29tcGxleGl0eQogICovCiBzdGF0aWMgSUlPX0RFVl9BVFRSX1NBTVBfRlJFUV9BVkFJTChzY2EzMDAwX3JlYWRfYXZfZnJlcSk7CiAKLXN0YXRpYyBJSU9fREVWX0FUVFJfU0FNUF9GUkVRKFNfSVdVU1IgfCBTX0lSVUdPLAotCQkJICAgICAgc2NhMzAwMF9yZWFkX2ZyZXF1ZW5jeSwKLQkJCSAgICAgIHNjYTMwMDBfc2V0X2ZyZXF1ZW5jeSk7Ci0KIC8qKgogICogc2NhMzAwMF9yZWFkX3RocmVzaCgpIC0gcXVlcnkgb2YgYSB0aHJlc2hvbGQKICAqKi8KQEAgLTc1MSw3ICs3NDksNiBAQAogCSZpaW9fZGV2X2F0dHJfbWVhc3VyZW1lbnRfbW9kZV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKIAkmaWlvX2Rldl9hdHRyX21lYXN1cmVtZW50X21vZGUuZGV2X2F0dHIuYXR0ciwKIAkmaWlvX2Rldl9hdHRyX3NhbXBsaW5nX2ZyZXF1ZW5jeV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX3NhbXBsaW5nX2ZyZXF1ZW5jeS5kZXZfYXR0ci5hdHRyLAogCU5VTEwsCiB9OwogCkBAIC0xMDg2LDYgKzEwODMsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBzY2EzMDAwX2luZm8gPSB7CiAJLmF0dHJzID0gJnNjYTMwMDBfYXR0cmlidXRlX2dyb3VwLAogCS5yZWFkX3JhdyA9ICZzY2EzMDAwX3JlYWRfcmF3LAorCS53cml0ZV9yYXcgPSAmc2NhMzAwMF93cml0ZV9yYXcsCiAJLmV2ZW50X2F0dHJzID0gJnNjYTMwMDBfZXZlbnRfYXR0cmlidXRlX2dyb3VwLAogCS5yZWFkX2V2ZW50X3ZhbHVlID0gJnNjYTMwMDBfcmVhZF90aHJlc2gsCiAJLndyaXRlX2V2ZW50X3ZhbHVlID0gJnNjYTMwMDBfd3JpdGVfdGhyZXNoLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MjgwYS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MjgwYS5jCmluZGV4IDIxNzdmMWQuLmI0NjBkZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzI4MGEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcyODBhLmMKQEAgLTQ3OCw3ICs0NzgsNyBAQAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkNzI4MF9hdHRyaWJ1dGVzW0FENzI4MEFfTUFYX0NIQUlOICoKIAkJCQkJICAgQUQ3MjgwQV9DRUxMU19QRVJfREVWICogMiArIDFdOwogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDcyODBfYXR0cnNfZ3JvdXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDcyODBfYXR0cnNfZ3JvdXAgPSB7CiAJLmF0dHJzID0gYWQ3MjgwX2F0dHJpYnV0ZXMsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltcGVkYW5jZS1hbmFseXplci9hZDU5MzMuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW1wZWRhbmNlLWFuYWx5emVyL2FkNTkzMy5jCmluZGV4IDE3MGFjOTguLjVlZWNmMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW1wZWRhbmNlLWFuYWx5emVyL2FkNTkzMy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW1wZWRhbmNlLWFuYWx5emVyL2FkNTkzMy5jCkBAIC0xNTYsOCArMTU2LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIGludCBhZDU5MzNfaTJjX3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkgICAgICB1OCByZWcsIHU4IGxlbiwgdTggKmRhdGEpCitzdGF0aWMgaW50IGFkNTkzM19pMmNfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCBsZW4sIHU4ICpkYXRhKQogewogCWludCByZXQ7CiAKQEAgLTE3MSw4ICsxNzAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGFkNTkzM19pMmNfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJICAgICAgdTggcmVnLCB1OCBsZW4sIHU4ICpkYXRhKQorc3RhdGljIGludCBhZDU5MzNfaTJjX3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCBsZW4sIHU4ICpkYXRhKQogewogCWludCByZXQ7CiAKQEAgLTI2OSw3ICsyNjcsOCBAQAogCWRhdCA9IGNwdV90b19iZTE2KHN0LT5zZXR0bGluZ19jeWNsZXMpOwogCiAJcmV0ID0gYWQ1OTMzX2kyY193cml0ZShzdC0+Y2xpZW50LAotCQkJQUQ1OTMzX1JFR19TRVRUTElOR19DWUNMRVMsIDIsICh1OCAqKSZkYXQpOworCQkJICAgICAgIEFENTkzM19SRUdfU0VUVExJTkdfQ1lDTEVTLAorCQkJICAgICAgIDIsICh1OCAqKSZkYXQpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0yOTQsOCArMjkzLDggQEAKICAqLwogCiBzdGF0aWMgc3NpemVfdCBhZDU5MzNfc2hvd19mcmVxdWVuY3koc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkJY2hhciAqYnVmKQorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjaGFyICpidWYpCiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGRldik7CiAJc3RydWN0IGFkNTkzM19zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpAQCAtMzIyLDkgKzMyMSw5IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFkNTkzM19zdG9yZV9mcmVxdWVuY3koc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCSBjb25zdCBjaGFyICpidWYsCi0JCQkJCSBzaXplX3QgbGVuKQorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkgICAgICBzaXplX3QgbGVuKQogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfdG9faWlvX2RldihkZXYpOwogCXN0cnVjdCBhZDU5MzNfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKQEAgLTM1Nyw4ICszNTYsOCBAQAogCQkJQUQ1OTMzX1JFR19GUkVRX0lOQyk7CiAKIHN0YXRpYyBzc2l6ZV90IGFkNTkzM19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCWNoYXIgKmJ1ZikKKwkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY2hhciAqYnVmKQogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfdG9faWlvX2RldihkZXYpOwogCXN0cnVjdCBhZDU5MzNfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKQEAgLTM5OSw5ICszOTgsOSBAQAogfQogCiBzdGF0aWMgc3NpemVfdCBhZDU5MzNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCSBjb25zdCBjaGFyICpidWYsCi0JCQkJCSBzaXplX3QgbGVuKQorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCSAgICBzaXplX3QgbGVuKQogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfdG9faWlvX2RldihkZXYpOwogCXN0cnVjdCBhZDU5MzNfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKQEAgLTQxOSw2ICs0MTgsNyBAQAogCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOwogCXN3aXRjaCAoKHUzMil0aGlzX2F0dHItPmFkZHJlc3MpIHsKIAljYXNlIEFENTkzM19PVVRfUkFOR0U6CisJCXJldCA9IC1FSU5WQUw7CiAJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCiAJCQlpZiAodmFsID09IHN0LT5yYW5nZV9hdmFpbFtpXSkgewogCQkJCXN0LT5jdHJsX2hiICY9IH5BRDU5MzNfQ1RSTF9SQU5HRSgweDMpOwpAQCAtNDI2LDcgKzQyNiw2IEBACiAJCQkJcmV0ID0gYWQ1OTMzX2NtZChzdCwgMCk7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCXJldCA9IC1FSU5WQUw7CiAJCWJyZWFrOwogCWNhc2UgQUQ1OTMzX0lOX1BHQV9HQUlOOgogCQlpZiAoc3lzZnNfc3RyZXEoYnVmLCAiMSIpKSB7CkBAIC00NTEsNyArNDUwLDggQEAKIAogCQlkYXQgPSBjcHVfdG9fYmUxNih2YWwpOwogCQlyZXQgPSBhZDU5MzNfaTJjX3dyaXRlKHN0LT5jbGllbnQsCi0JCQkJQUQ1OTMzX1JFR19TRVRUTElOR19DWUNMRVMsIDIsICh1OCAqKSZkYXQpOworCQkJCSAgICAgICBBRDU5MzNfUkVHX1NFVFRMSU5HX0NZQ0xFUywKKwkJCQkgICAgICAgMiwgKHU4ICopJmRhdCk7CiAJCWJyZWFrOwogCWNhc2UgQUQ1OTMzX0ZSRVFfUE9JTlRTOgogCQl2YWwgPSBjbGFtcCh2YWwsICh1MTYpMCwgKHUxNik1MTEpOwpAQCAtNTQ1LDggKzU0NSw4IEBACiAJCQlnb3RvIG91dDsKIAogCQlyZXQgPSBhZDU5MzNfaTJjX3JlYWQoc3QtPmNsaWVudCwKLQkJCQlBRDU5MzNfUkVHX1RFTVBfREFUQSwgMiwKLQkJCQkodTggKikmZGF0KTsKKwkJCQkgICAgICBBRDU5MzNfUkVHX1RFTVBfREFUQSwKKwkJCQkgICAgICAyLCAodTggKikmZGF0KTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dDsKIAkJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKQEAgLTcwNSw3ICs3MDUsNyBAQAogfQogCiBzdGF0aWMgaW50IGFkNTkzM19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJCSAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKKwkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlpbnQgcmV0LCB2b2x0YWdlX3V2ID0gMDsKIAlzdHJ1Y3QgYWQ1OTMzX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmY2xpZW50LT5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC9pc2wyOTAxOC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC9pc2wyOTAxOC5jCmluZGV4IDc2ZDlmNzQuLmE3NjdhNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvaXNsMjkwMTguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L2lzbDI5MDE4LmMKQEAgLTE1LDEwICsxNSw2IEBACiAgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKICAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEJMDIxMTAtMTMwMSwgVVNBLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTMyLDI1ICsyOCwyNSBAQAogI2luY2x1ZGUgPGxpbnV4L2lpby9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KIAotI2RlZmluZSBDT05WRVJTSU9OX1RJTUVfTVMJCTEwMAorI2RlZmluZSBJU0wyOTAxOF9DT05WX1RJTUVfTVMJCTEwMAogCiAjZGVmaW5lIElTTDI5MDE4X1JFR19BRERfQ09NTUFORDEJMHgwMAotI2RlZmluZSBDT01NTUFORDFfT1BNT0RFX1NISUZUCQk1Ci0jZGVmaW5lIENPTU1NQU5EMV9PUE1PREVfTUFTSwkJKDcgPDwgQ09NTU1BTkQxX09QTU9ERV9TSElGVCkKLSNkZWZpbmUgQ09NTU1BTkQxX09QTU9ERV9QT1dFUl9ET1dOCTAKLSNkZWZpbmUgQ09NTU1BTkQxX09QTU9ERV9BTFNfT05DRQkxCi0jZGVmaW5lIENPTU1NQU5EMV9PUE1PREVfSVJfT05DRQkyCi0jZGVmaW5lIENPTU1NQU5EMV9PUE1PREVfUFJPWF9PTkNFCTMKKyNkZWZpbmUgSVNMMjkwMThfQ01EMV9PUE1PREVfU0hJRlQJNQorI2RlZmluZSBJU0wyOTAxOF9DTUQxX09QTU9ERV9NQVNLCSg3IDw8IElTTDI5MDE4X0NNRDFfT1BNT0RFX1NISUZUKQorI2RlZmluZSBJU0wyOTAxOF9DTUQxX09QTU9ERV9QT1dFUl9ET1dOCTAKKyNkZWZpbmUgSVNMMjkwMThfQ01EMV9PUE1PREVfQUxTX09OQ0UJMQorI2RlZmluZSBJU0wyOTAxOF9DTUQxX09QTU9ERV9JUl9PTkNFCTIKKyNkZWZpbmUgSVNMMjkwMThfQ01EMV9PUE1PREVfUFJPWF9PTkNFCTMKIAotI2RlZmluZSBJU0wyOTAxOF9SRUdfQUREX0NPTU1BTkRJSQkweDAxCi0jZGVmaW5lIENPTU1BTkRJSV9SRVNPTFVUSU9OX1NISUZUCTIKLSNkZWZpbmUgQ09NTUFORElJX1JFU09MVVRJT05fTUFTSwkoMHgzIDw8IENPTU1BTkRJSV9SRVNPTFVUSU9OX1NISUZUKQorI2RlZmluZSBJU0wyOTAxOF9SRUdfQUREX0NPTU1BTkQyCTB4MDEKKyNkZWZpbmUgSVNMMjkwMThfQ01EMl9SRVNPTFVUSU9OX1NISUZUCTIKKyNkZWZpbmUgSVNMMjkwMThfQ01EMl9SRVNPTFVUSU9OX01BU0sJKDB4MyA8PCBJU0wyOTAxOF9DTUQyX1JFU09MVVRJT05fU0hJRlQpCiAKLSNkZWZpbmUgQ09NTUFORElJX1JBTkdFX1NISUZUCQkwCi0jZGVmaW5lIENPTU1BTkRJSV9SQU5HRV9NQVNLCQkoMHgzIDw8IENPTU1BTkRJSV9SQU5HRV9TSElGVCkKKyNkZWZpbmUgSVNMMjkwMThfQ01EMl9SQU5HRV9TSElGVAkwCisjZGVmaW5lIElTTDI5MDE4X0NNRDJfUkFOR0VfTUFTSwkoMHgzIDw8IElTTDI5MDE4X0NNRDJfUkFOR0VfU0hJRlQpCiAKLSNkZWZpbmUgQ09NTUFORElJX1NDSEVNRV9TSElGVAkJNwotI2RlZmluZSBDT01NQU5ESUlfU0NIRU1FX01BU0sJCSgweDEgPDwgQ09NTUFORElJX1NDSEVNRV9TSElGVCkKKyNkZWZpbmUgSVNMMjkwMThfQ01EMl9TQ0hFTUVfU0hJRlQJNworI2RlZmluZSBJU0wyOTAxOF9DTUQyX1NDSEVNRV9NQVNLCSgweDEgPDwgSVNMMjkwMThfQ01EMl9TQ0hFTUVfU0hJRlQpCiAKICNkZWZpbmUgSVNMMjkwMThfUkVHX0FERF9EQVRBX0xTQgkweDAyCiAjZGVmaW5lIElTTDI5MDE4X1JFR19BRERfREFUQV9NU0IJMHgwMwpAQCAtMTI3LDEzICsxMjMsMTMgQEAKIAlpZiAoaSA+PSBBUlJBWV9TSVpFKGlzbDI5MDE4X2ludF91dGltZXNbY2hpcC0+dHlwZV0pKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhjaGlwLT5yZWdtYXAsIElTTDI5MDE4X1JFR19BRERfQ09NTUFORElJLAotCQkJCSBDT01NQU5ESUlfUkVTT0xVVElPTl9NQVNLLAotCQkJCSBpIDw8IENPTU1BTkRJSV9SRVNPTFVUSU9OX1NISUZUKTsKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoY2hpcC0+cmVnbWFwLCBJU0wyOTAxOF9SRUdfQUREX0NPTU1BTkQyLAorCQkJCSBJU0wyOTAxOF9DTUQyX1JFU09MVVRJT05fTUFTSywKKwkJCQkgaSA8PCBJU0wyOTAxOF9DTUQyX1JFU09MVVRJT05fU0hJRlQpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JLyoga2VlcCB0aGUgc2FtZSByYW5nZSB3aGVuIGludGVncmF0aW9uIHRpbWUgY2hhbmdlcyAqLworCS8qIEtlZXAgdGhlIHNhbWUgcmFuZ2Ugd2hlbiBpbnRlZ3JhdGlvbiB0aW1lIGNoYW5nZXMgKi8KIAlpbnRfdGltZSA9IGNoaXAtPmludF90aW1lOwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlzbDI5MDE4X3NjYWxlc1tpbnRfdGltZV0pOyArK2kpIHsKIAkJaWYgKGNoaXAtPnNjYWxlLnNjYWxlID09IGlzbDI5MDE4X3NjYWxlc1tpbnRfdGltZV1baV0uc2NhbGUgJiYKQEAgLTE2Myw5ICsxNTksOSBAQAogCWlmIChpID49IEFSUkFZX1NJWkUoaXNsMjkwMThfc2NhbGVzW2NoaXAtPmludF90aW1lXSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGNoaXAtPnJlZ21hcCwgSVNMMjkwMThfUkVHX0FERF9DT01NQU5ESUksCi0JCQkJIENPTU1BTkRJSV9SQU5HRV9NQVNLLAotCQkJCSBpIDw8IENPTU1BTkRJSV9SQU5HRV9TSElGVCk7CisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGNoaXAtPnJlZ21hcCwgSVNMMjkwMThfUkVHX0FERF9DT01NQU5EMiwKKwkJCQkgSVNMMjkwMThfQ01EMl9SQU5HRV9NQVNLLAorCQkJCSBpIDw8IElTTDI5MDE4X0NNRDJfUkFOR0VfU0hJRlQpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0xODMsMTMgKzE3OSwxMyBAQAogCiAJLyogU2V0IG1vZGUgKi8KIAlzdGF0dXMgPSByZWdtYXBfd3JpdGUoY2hpcC0+cmVnbWFwLCBJU0wyOTAxOF9SRUdfQUREX0NPTU1BTkQxLAotCQkJICAgICAgbW9kZSA8PCBDT01NTUFORDFfT1BNT0RFX1NISUZUKTsKKwkJCSAgICAgIG1vZGUgPDwgSVNMMjkwMThfQ01EMV9PUE1PREVfU0hJRlQpOwogCWlmIChzdGF0dXMpIHsKIAkJZGV2X2VycihkZXYsCiAJCQkiRXJyb3IgaW4gc2V0dGluZyBvcGVyYXRpbmcgbW9kZSBlcnIgJWRcbiIsIHN0YXR1cyk7CiAJCXJldHVybiBzdGF0dXM7CiAJfQotCW1zbGVlcChDT05WRVJTSU9OX1RJTUVfTVMpOworCW1zbGVlcChJU0wyOTAxOF9DT05WX1RJTUVfTVMpOwogCXN0YXR1cyA9IHJlZ21hcF9yZWFkKGNoaXAtPnJlZ21hcCwgSVNMMjkwMThfUkVHX0FERF9EQVRBX0xTQiwgJmxzYik7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJZGV2X2VycihkZXYsCkBAIC0yMTMsOCArMjA5LDggQEAKIAlpbnQgbHV4X2RhdGE7CiAJdW5zaWduZWQgaW50IGRhdGFfeF9yYW5nZTsKIAotCWx1eF9kYXRhID0gaXNsMjkwMThfcmVhZF9zZW5zb3JfaW5wdXQoY2hpcCwgQ09NTU1BTkQxX09QTU9ERV9BTFNfT05DRSk7Ci0KKwlsdXhfZGF0YSA9IGlzbDI5MDE4X3JlYWRfc2Vuc29yX2lucHV0KGNoaXAsCisJCQkJCSAgICAgIElTTDI5MDE4X0NNRDFfT1BNT0RFX0FMU19PTkNFKTsKIAlpZiAobHV4X2RhdGEgPCAwKQogCQlyZXR1cm4gbHV4X2RhdGE7CiAKQEAgLTIzMCw4ICsyMjYsOCBAQAogewogCWludCBpcl9kYXRhOwogCi0JaXJfZGF0YSA9IGlzbDI5MDE4X3JlYWRfc2Vuc29yX2lucHV0KGNoaXAsIENPTU1NQU5EMV9PUE1PREVfSVJfT05DRSk7Ci0KKwlpcl9kYXRhID0gaXNsMjkwMThfcmVhZF9zZW5zb3JfaW5wdXQoY2hpcCwKKwkJCQkJICAgICBJU0wyOTAxOF9DTUQxX09QTU9ERV9JUl9PTkNFKTsKIAlpZiAoaXJfZGF0YSA8IDApCiAJCXJldHVybiBpcl9kYXRhOwogCkBAIC0yNDksMTYgKzI0NSwxNiBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJlZ21hcF9nZXRfZGV2aWNlKGNoaXAtPnJlZ21hcCk7CiAKIAkvKiBEbyBwcm94aW1pdHkgc2Vuc2luZyB3aXRoIHJlcXVpcmVkIHNjaGVtZSAqLwotCXN0YXR1cyA9IHJlZ21hcF91cGRhdGVfYml0cyhjaGlwLT5yZWdtYXAsIElTTDI5MDE4X1JFR19BRERfQ09NTUFORElJLAotCQkJCSAgICBDT01NQU5ESUlfU0NIRU1FX01BU0ssCi0JCQkJICAgIHNjaGVtZSA8PCBDT01NQU5ESUlfU0NIRU1FX1NISUZUKTsKKwlzdGF0dXMgPSByZWdtYXBfdXBkYXRlX2JpdHMoY2hpcC0+cmVnbWFwLCBJU0wyOTAxOF9SRUdfQUREX0NPTU1BTkQyLAorCQkJCSAgICBJU0wyOTAxOF9DTUQyX1NDSEVNRV9NQVNLLAorCQkJCSAgICBzY2hlbWUgPDwgSVNMMjkwMThfQ01EMl9TQ0hFTUVfU0hJRlQpOwogCWlmIChzdGF0dXMpIHsKIAkJZGV2X2VycihkZXYsICJFcnJvciBpbiBzZXR0aW5nIG9wZXJhdGluZyBtb2RlXG4iKTsKIAkJcmV0dXJuIHN0YXR1czsKIAl9CiAKIAlwcm94X2RhdGEgPSBpc2wyOTAxOF9yZWFkX3NlbnNvcl9pbnB1dChjaGlwLAotCQkJCQkgICAgICAgQ09NTU1BTkQxX09QTU9ERV9QUk9YX09OQ0UpOworCQkJCQkgICAgICAgSVNMMjkwMThfQ01EMV9PUE1PREVfUFJPWF9PTkNFKTsKIAlpZiAocHJveF9kYXRhIDwgMCkKIAkJcmV0dXJuIHByb3hfZGF0YTsKIApAQCAtMjY3LDggKzI2Myw4IEBACiAJCXJldHVybiAwOwogCX0KIAotCWlyX2RhdGEgPSBpc2wyOTAxOF9yZWFkX3NlbnNvcl9pbnB1dChjaGlwLCBDT01NTUFORDFfT1BNT0RFX0lSX09OQ0UpOwotCisJaXJfZGF0YSA9IGlzbDI5MDE4X3JlYWRfc2Vuc29yX2lucHV0KGNoaXAsCisJCQkJCSAgICAgSVNMMjkwMThfQ01EMV9PUE1PREVfSVJfT05DRSk7CiAJaWYgKGlyX2RhdGEgPCAwKQogCQlyZXR1cm4gaXJfZGF0YTsKIApAQCAtMjgwLDcgKzI3Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfc2NhbGVfYXZhaWxhYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwKK3N0YXRpYyBzc2l6ZV90IGlzbDI5MDE4X3Nob3dfc2NhbGVfYXZhaWxhYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKQEAgLTI5Nyw3ICsyOTMsNyBAQAogCXJldHVybiBsZW47CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfaW50X3RpbWVfYXZhaWxhYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwKK3N0YXRpYyBzc2l6ZV90IGlzbDI5MDE4X3Nob3dfaW50X3RpbWVfYXZhaWxhYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKQEAgLTMxMyw4ICszMDksNyBAQAogCXJldHVybiBsZW47CiB9CiAKLS8qIHByb3hpbWl0eSBzY2hlbWUgKi8KLXN0YXRpYyBzc2l6ZV90IHNob3dfcHJveF9pbmZyYXJlZF9zdXBwcmVzc2lvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCitzdGF0aWMgc3NpemVfdCBpc2wyOTAxOF9zaG93X3Byb3hfaW5mcmFyZWRfc3VwcHJlc3Npb24oc3RydWN0IGRldmljZSAqZGV2LAogCQkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkJICAgICAgY2hhciAqYnVmKQogewpAQCAtMzIyLDEzICszMTcsMTMgQEAKIAlzdHJ1Y3QgaXNsMjkwMThfY2hpcCAqY2hpcCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAKIAkvKgotCSAqIHJldHVybiB0aGUgInByb3hpbWl0eSBzY2hlbWUiIGkuZS4gaWYgdGhlIGNoaXAgZG9lcyBvbiBjaGlwCisJICogUmV0dXJuIHRoZSAicHJveGltaXR5IHNjaGVtZSIgaS5lLiBpZiB0aGUgY2hpcCBkb2VzIG9uIGNoaXAKIAkgKiBpbmZyYXJlZCBzdXBwcmVzc2lvbiAoMSBtZWFucyBwZXJmb3JtIG9uIGNoaXAgc3VwcHJlc3Npb24pCiAJICovCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNoaXAtPnByb3hfc2NoZW1lKTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfcHJveF9pbmZyYXJlZF9zdXBwcmVzc2lvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCitzdGF0aWMgc3NpemVfdCBpc2wyOTAxOF9zdG9yZV9wcm94X2luZnJhcmVkX3N1cHByZXNzaW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CkBAIC0zMzgsMTMgKzMzMywxMSBAQAogCiAJaWYgKGtzdHJ0b2ludChidWYsIDEwLCAmdmFsKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKCEodmFsID09IDAgfHwgdmFsID09IDEpKSB7Ci0JCWRldl9lcnIoZGV2LCAiVGhlIG1vZGUgaXMgbm90IHN1cHBvcnRlZFxuIik7CisJaWYgKCEodmFsID09IDAgfHwgdmFsID09IDEpKQogCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAKIAkvKgotCSAqIGdldCB0aGUgICJwcm94aW1pdHkgc2NoZW1lIiBpLmUuIGlmIHRoZSBjaGlwIGRvZXMgb24gY2hpcAorCSAqIEdldCB0aGUgInByb3hpbWl0eSBzY2hlbWUiIGkuZS4gaWYgdGhlIGNoaXAgZG9lcyBvbiBjaGlwCiAJICogaW5mcmFyZWQgc3VwcHJlc3Npb24gKDEgbWVhbnMgcGVyZm9ybSBvbiBjaGlwIHN1cHByZXNzaW9uKQogCSAqLwogCW11dGV4X2xvY2soJmNoaXAtPmxvY2spOwpAQCAtMzU0LDcgKzM0Nyw2IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi0vKiBDaGFubmVsIElPICovCiBzdGF0aWMgaW50IGlzbDI5MDE4X3dyaXRlX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAogCQkJICAgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCiAJCQkgICAgICBpbnQgdmFsLApAQCAtNDkxLDEzICs0ODMsMTMgQEAKIH07CiAKIHN0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW5faWxsdW1pbmFuY2VfaW50ZWdyYXRpb25fdGltZV9hdmFpbGFibGUsIFNfSVJVR08sCi0JCSAgICAgICBzaG93X2ludF90aW1lX2F2YWlsYWJsZSwgTlVMTCwgMCk7CisJCSAgICAgICBpc2wyOTAxOF9zaG93X2ludF90aW1lX2F2YWlsYWJsZSwgTlVMTCwgMCk7CiBzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluX2lsbHVtaW5hbmNlX3NjYWxlX2F2YWlsYWJsZSwgU19JUlVHTywKLQkJICAgICAgc2hvd19zY2FsZV9hdmFpbGFibGUsIE5VTEwsIDApOworCQkgICAgICBpc2wyOTAxOF9zaG93X3NjYWxlX2F2YWlsYWJsZSwgTlVMTCwgMCk7CiBzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHByb3hpbWl0eV9vbl9jaGlwX2FtYmllbnRfaW5mcmFyZWRfc3VwcHJlc3Npb24sCiAJCQkJCVNfSVJVR08gfCBTX0lXVVNSLAotCQkJCQlzaG93X3Byb3hfaW5mcmFyZWRfc3VwcHJlc3Npb24sCi0JCQkJCXN0b3JlX3Byb3hfaW5mcmFyZWRfc3VwcHJlc3Npb24sIDApOworCQkJCQlpc2wyOTAxOF9zaG93X3Byb3hfaW5mcmFyZWRfc3VwcHJlc3Npb24sCisJCQkJCWlzbDI5MDE4X3N0b3JlX3Byb3hfaW5mcmFyZWRfc3VwcHJlc3Npb24sIDApOwogCiAjZGVmaW5lIElTTDI5MDE4X0RFVl9BVFRSKG5hbWUpICgmaWlvX2Rldl9hdHRyXyMjbmFtZS5kZXZfYXR0ci5hdHRyKQogCkBAIC01NDEsNyArNTMzLDcgQEAKIAlpZiAoaWQgIT0gSVNMMjkwMzVfREVWSUNFX0lEKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCS8qIGNsZWFyIG91dCBicm93bm91dCBiaXQgKi8KKwkvKiBDbGVhciBicm93bm91dCBiaXQgKi8KIAlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGNoaXAtPnJlZ21hcCwgSVNMMjkwMzVfUkVHX0RFVklDRV9JRCwKIAkJCQkgIElTTDI5MDM1X0JPVVRfTUFTSywgMCk7CiB9CkBAIC01NzQsNyArNTY2LDcgQEAKIAkgKiBjb252ZXJzaW9ucywgY2xlYXIgdGhlIHRlc3QgcmVnaXN0ZXJzLCBhbmQgdGhlbiByZXdyaXRlIGFsbAogCSAqIHJlZ2lzdGVycyB0byB0aGUgZGVzaXJlZCB2YWx1ZXMuCiAJICogLi4uCi0JICogRk9SIElTTDI5MDExLCBJU0wyOTAxOCwgSVNMMjkwMjEsIElTTDI5MDIzCisJICogRm9yIElTTDI5MDExLCBJU0wyOTAxOCwgSVNMMjkwMjEsIElTTDI5MDIzCiAJICogMS4gV3JpdGUgMHgwMCB0byByZWdpc3RlciAweDA4IChURVNUKQogCSAqIDIuIFdyaXRlIDB4MDAgdG8gcmVnaXN0ZXIgMHgwMCAoQ01EMSkKIAkgKiAzLiBSZXdyaXRlIGFsbCByZWdpc3RlcnMgdG8gdGhlIGRlc2lyZWQgdmFsdWVzCkBAIC02MDMsNyArNTk1LDcgQEAKIAogCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsJLyogcGVyIGRhdGEgc2hlZXQsIHBhZ2UgMTAgKi8KIAotCS8qIHNldCBkZWZhdWx0cyAqLworCS8qIFNldCBkZWZhdWx0cyAqLwogCXN0YXR1cyA9IGlzbDI5MDE4X3NldF9zY2FsZShjaGlwLCBjaGlwLT5zY2FsZS5zY2FsZSwKIAkJCQkgICAgY2hpcC0+c2NhbGUudXNjYWxlKTsKIAlpZiAoc3RhdHVzIDwgMCkgewpAQCAtNjM1LDcgKzYyNyw3IEBACiAJLndyaXRlX3JhdyA9IGlzbDI5MDE4X3dyaXRlX3JhdywKIH07CiAKLXN0YXRpYyBib29sIGlzX3ZvbGF0aWxlX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCitzdGF0aWMgYm9vbCBpc2wyOTAxOF9pc192b2xhdGlsZV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQogewogCXN3aXRjaCAocmVnKSB7CiAJY2FzZSBJU0wyOTAxOF9SRUdfQUREX0RBVEFfTFNCOgpAQCAtNjQ5LDM3ICs2NDEsMzIgQEAKIAl9CiB9CiAKLS8qCi0gKiBpc2wyOTAxOF9yZWdtYXBfY29uZmlnOiByZWdtYXAgY29uZmlndXJhdGlvbi4KLSAqIFVzZSBSQlRSRUUgbWVjaGFuaXNtIGZvciBjYWNoaW5nLgotICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgaXNsMjkwMThfcmVnbWFwX2NvbmZpZyA9IHsKIAkucmVnX2JpdHMgPSA4LAogCS52YWxfYml0cyA9IDgsCi0JLnZvbGF0aWxlX3JlZyA9IGlzX3ZvbGF0aWxlX3JlZywKKwkudm9sYXRpbGVfcmVnID0gaXNsMjkwMThfaXNfdm9sYXRpbGVfcmVnLAogCS5tYXhfcmVnaXN0ZXIgPSBJU0wyOTAxOF9SRUdfVEVTVCwKIAkubnVtX3JlZ19kZWZhdWx0c19yYXcgPSBJU0wyOTAxOF9SRUdfVEVTVCArIDEsCiAJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCiB9OwogCi0vKiBpc2wyOTAzNV9yZWdtYXBfY29uZmlnOiByZWdtYXAgY29uZmlndXJhdGlvbiBmb3IgSVNMMjkwMzUgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBpc2wyOTAzNV9yZWdtYXBfY29uZmlnID0gewogCS5yZWdfYml0cyA9IDgsCiAJLnZhbF9iaXRzID0gOCwKLQkudm9sYXRpbGVfcmVnID0gaXNfdm9sYXRpbGVfcmVnLAorCS52b2xhdGlsZV9yZWcgPSBpc2wyOTAxOF9pc192b2xhdGlsZV9yZWcsCiAJLm1heF9yZWdpc3RlciA9IElTTDI5MDM1X1JFR19ERVZJQ0VfSUQsCiAJLm51bV9yZWdfZGVmYXVsdHNfcmF3ID0gSVNMMjkwMzVfUkVHX0RFVklDRV9JRCArIDEsCiAJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCiB9OwogCi1zdHJ1Y3QgY2hpcF9pbmZvIHsKK3N0cnVjdCBpc2wyOTAxOF9jaGlwX2luZm8gewogCWNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFubmVsczsKIAlpbnQgbnVtX2NoYW5uZWxzOwogCWNvbnN0IHN0cnVjdCBpaW9faW5mbyAqaW5kaW9faW5mbzsKIAljb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyAqcmVnbWFwX2NmZzsKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2hpcF9pbmZvIGNoaXBfaW5mb190YmxbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXNsMjkwMThfY2hpcF9pbmZvIGlzbDI5MDE4X2NoaXBfaW5mb190YmxbXSA9IHsKIAlbaXNsMjkwMThdID0gewogCQkuY2hhbm5lbHMgPSBpc2wyOTAxOF9jaGFubmVscywKIAkJLm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUoaXNsMjkwMThfY2hhbm5lbHMpLApAQCAtNzI0LDEwICs3MTEsOCBAQAogCWludCBkZXZfaWQgPSAwOwogCiAJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKCpjaGlwKSk7Ci0JaWYgKCFpbmRpb19kZXYpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJpaW8gYWxsb2NhdGlvbiBmYWlsc1xuIik7CisJaWYgKCFpbmRpb19kZXYpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAljaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGluZGlvX2Rldik7CkBAIC03NTAsNyArNzM1LDcgQEAKIAljaGlwLT5zdXNwZW5kZWQgPSBmYWxzZTsKIAogCWNoaXAtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGNsaWVudCwKLQkJCQljaGlwX2luZm9fdGJsW2Rldl9pZF0ucmVnbWFwX2NmZyk7CisJCQkJaXNsMjkwMThfY2hpcF9pbmZvX3RibFtkZXZfaWRdLnJlZ21hcF9jZmcpOwogCWlmIChJU19FUlIoY2hpcC0+cmVnbWFwKSkgewogCQllcnIgPSBQVFJfRVJSKGNoaXAtPnJlZ21hcCk7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAicmVnbWFwIGluaXRpYWxpemF0aW9uIGZhaWxzOiAlZFxuIiwgZXJyKTsKQEAgLTc2MSwxOSArNzQ2LDEzIEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWluZGlvX2Rldi0+aW5mbyA9IGNoaXBfaW5mb190YmxbZGV2X2lkXS5pbmRpb19pbmZvOwotCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBjaGlwX2luZm9fdGJsW2Rldl9pZF0uY2hhbm5lbHM7Ci0JaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBjaGlwX2luZm9fdGJsW2Rldl9pZF0ubnVtX2NoYW5uZWxzOworCWluZGlvX2Rldi0+aW5mbyA9IGlzbDI5MDE4X2NoaXBfaW5mb190YmxbZGV2X2lkXS5pbmRpb19pbmZvOworCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBpc2wyOTAxOF9jaGlwX2luZm9fdGJsW2Rldl9pZF0uY2hhbm5lbHM7CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBpc2wyOTAxOF9jaGlwX2luZm9fdGJsW2Rldl9pZF0ubnVtX2NoYW5uZWxzOwogCWluZGlvX2Rldi0+bmFtZSA9IG5hbWU7CiAJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OwogCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKLQllcnIgPSBkZXZtX2lpb19kZXZpY2VfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCBpbmRpb19kZXYpOwotCWlmIChlcnIpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJpaW8gcmVnaXN0cmF0aW9uIGZhaWxzXG4iKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gZGV2bV9paW9fZGV2aWNlX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgaW5kaW9fZGV2KTsKIH0KIAogI2lmZGVmIENPTkZJR19QTV9TTEVFUApAQCAtODQwLDcgKzgxOSw2IEBACiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBpc2wyOTAxOF9vZl9tYXRjaCk7CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpc2wyOTAxOF9kcml2ZXIgPSB7Ci0JLmNsYXNzCT0gSTJDX0NMQVNTX0hXTU9OLAogCS5kcml2ZXIJID0gewogCQkJLm5hbWUgPSAiaXNsMjkwMTgiLAogCQkJLmFjcGlfbWF0Y2hfdGFibGUgPSBBQ1BJX1BUUihpc2wyOTAxOF9hY3BpX21hdGNoKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvaXNsMjkwMjguYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvaXNsMjkwMjguYwppbmRleCAyZTNiMWQ2Li5hYTQxM2U1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L2lzbDI5MDI4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC9pc2wyOTAyOC5jCkBAIC0yNywyOSArMjcsMjcgQEAKICNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CiAjaW5jbHVkZSA8bGludXgvaWlvL3N5c2ZzLmg+CiAKLSNkZWZpbmUgQ09OVkVSU0lPTl9USU1FX01TCQkxMDAKKyNkZWZpbmUgSVNMMjkwMjhfQ09OVl9USU1FX01TCQkxMDAKIAogI2RlZmluZSBJU0wyOTAyOF9SRUdfQ09ORklHVVJFCQkweDAxCiAKLSNkZWZpbmUgQ09ORklHVVJFX0FMU19JUl9NT0RFX0FMUwkwCi0jZGVmaW5lIENPTkZJR1VSRV9BTFNfSVJfTU9ERV9JUglCSVQoMCkKLSNkZWZpbmUgQ09ORklHVVJFX0FMU19JUl9NT0RFX01BU0sJQklUKDApCisjZGVmaW5lIElTTDI5MDI4X0NPTkZfQUxTX0lSX01PREVfQUxTCTAKKyNkZWZpbmUgSVNMMjkwMjhfQ09ORl9BTFNfSVJfTU9ERV9JUglCSVQoMCkKKyNkZWZpbmUgSVNMMjkwMjhfQ09ORl9BTFNfSVJfTU9ERV9NQVNLCUJJVCgwKQogCi0jZGVmaW5lIENPTkZJR1VSRV9BTFNfUkFOR0VfTE9XX0xVWAkwCi0jZGVmaW5lIENPTkZJR1VSRV9BTFNfUkFOR0VfSElHSF9MVVgJQklUKDEpCi0jZGVmaW5lIENPTkZJR1VSRV9BTFNfUkFOR0VfTUFTSwlCSVQoMSkKKyNkZWZpbmUgSVNMMjkwMjhfQ09ORl9BTFNfUkFOR0VfTE9XX0xVWAkwCisjZGVmaW5lIElTTDI5MDI4X0NPTkZfQUxTX1JBTkdFX0hJR0hfTFVYCUJJVCgxKQorI2RlZmluZSBJU0wyOTAyOF9DT05GX0FMU19SQU5HRV9NQVNLCUJJVCgxKQogCi0jZGVmaW5lIENPTkZJR1VSRV9BTFNfRElTCQkwCi0jZGVmaW5lIENPTkZJR1VSRV9BTFNfRU4JCUJJVCgyKQotI2RlZmluZSBDT05GSUdVUkVfQUxTX0VOX01BU0sJCUJJVCgyKQorI2RlZmluZSBJU0wyOTAyOF9DT05GX0FMU19ESVMJCTAKKyNkZWZpbmUgSVNMMjkwMjhfQ09ORl9BTFNfRU4JCUJJVCgyKQorI2RlZmluZSBJU0wyOTAyOF9DT05GX0FMU19FTl9NQVNLCUJJVCgyKQogCi0jZGVmaW5lIENPTkZJR1VSRV9QUk9YX0RSSVZFCQlCSVQoMykKKyNkZWZpbmUgSVNMMjkwMjhfQ09ORl9QUk9YX1NMUF9TSAk0CisjZGVmaW5lIElTTDI5MDI4X0NPTkZfUFJPWF9TTFBfTUFTSwkoNyA8PCBJU0wyOTAyOF9DT05GX1BST1hfU0xQX1NIKQogCi0jZGVmaW5lIENPTkZJR1VSRV9QUk9YX1NMUF9TSAkJNAotI2RlZmluZSBDT05GSUdVUkVfUFJPWF9TTFBfTUFTSwkJKDcgPDwgQ09ORklHVVJFX1BST1hfU0xQX1NIKQotCi0jZGVmaW5lIENPTkZJR1VSRV9QUk9YX0VOCQlCSVQoNykKLSNkZWZpbmUgQ09ORklHVVJFX1BST1hfRU5fTUFTSwkJQklUKDcpCisjZGVmaW5lIElTTDI5MDI4X0NPTkZfUFJPWF9FTgkJQklUKDcpCisjZGVmaW5lIElTTDI5MDI4X0NPTkZfUFJPWF9FTl9NQVNLCUJJVCg3KQogCiAjZGVmaW5lIElTTDI5MDI4X1JFR19JTlRFUlJVUFQJCTB4MDIKIApAQCAtNjIsMTAgKzYwLDEwIEBACiAKICNkZWZpbmUgSVNMMjkwMjhfTlVNX1JFR1MJCShJU0wyOTAyOF9SRUdfVEVTVDJfTU9ERSArIDEpCiAKLWVudW0gYWxzX2lyX21vZGUgewotCU1PREVfTk9ORSA9IDAsCi0JTU9ERV9BTFMsCi0JTU9ERV9JUgorZW51bSBpc2wyOTAyOF9hbHNfaXJfbW9kZSB7CisJSVNMMjkwMjhfTU9ERV9OT05FID0gMCwKKwlJU0wyOTAyOF9NT0RFX0FMUywKKwlJU0wyOTAyOF9NT0RFX0lSLAogfTsKIAogc3RydWN0IGlzbDI5MDI4X2NoaXAgewpAQCAtNzYsNyArNzQsNyBAQAogCWJvb2wJCQllbmFibGVfcHJveDsKIAogCWludAkJCWx1eF9zY2FsZTsKLQlpbnQJCQlhbHNfaXJfbW9kZTsKKwllbnVtIGlzbDI5MDI4X2Fsc19pcl9tb2RlCWFsc19pcl9tb2RlOwogfTsKIAogc3RhdGljIGludCBpc2wyOTAyOF9zZXRfcHJveGltX3NhbXBsaW5nKHN0cnVjdCBpc2wyOTAyOF9jaGlwICpjaGlwLApAQCAtOTEsNyArODksOCBAQAogCQkJYnJlYWs7CiAJfQogCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoY2hpcC0+cmVnbWFwLCBJU0wyOTAyOF9SRUdfQ09ORklHVVJFLAotCQkJQ09ORklHVVJFX1BST1hfU0xQX01BU0ssIHNlbCA8PCBDT05GSUdVUkVfUFJPWF9TTFBfU0gpOworCQkJCSAgSVNMMjkwMjhfQ09ORl9QUk9YX1NMUF9NQVNLLAorCQkJCSAgc2VsIDw8IElTTDI5MDI4X0NPTkZfUFJPWF9TTFBfU0gpOwogfQogCiBzdGF0aWMgaW50IGlzbDI5MDI4X2VuYWJsZV9wcm94aW1pdHkoc3RydWN0IGlzbDI5MDI4X2NoaXAgKmNoaXAsIGJvb2wgZW5hYmxlKQpAQCAtMTAwLDkgKzk5LDkgQEAKIAlpbnQgdmFsID0gMDsKIAogCWlmIChlbmFibGUpCi0JCXZhbCA9IENPTkZJR1VSRV9QUk9YX0VOOworCQl2YWwgPSBJU0wyOTAyOF9DT05GX1BST1hfRU47CiAJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGNoaXAtPnJlZ21hcCwgSVNMMjkwMjhfUkVHX0NPTkZJR1VSRSwKLQkJCQkgQ09ORklHVVJFX1BST1hfRU5fTUFTSywgdmFsKTsKKwkJCQkgSVNMMjkwMjhfQ09ORl9QUk9YX0VOX01BU0ssIHZhbCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTExMyw0MCArMTEyLDQwIEBACiAKIHN0YXRpYyBpbnQgaXNsMjkwMjhfc2V0X2Fsc19zY2FsZShzdHJ1Y3QgaXNsMjkwMjhfY2hpcCAqY2hpcCwgaW50IGx1eF9zY2FsZSkKIHsKLQlpbnQgdmFsID0gKGx1eF9zY2FsZSA9PSAyMDAwKSA/IENPTkZJR1VSRV9BTFNfUkFOR0VfSElHSF9MVVggOgotCQkJCQlDT05GSUdVUkVfQUxTX1JBTkdFX0xPV19MVVg7CisJaW50IHZhbCA9IChsdXhfc2NhbGUgPT0gMjAwMCkgPyBJU0wyOTAyOF9DT05GX0FMU19SQU5HRV9ISUdIX0xVWCA6CisJCQkJCUlTTDI5MDI4X0NPTkZfQUxTX1JBTkdFX0xPV19MVVg7CiAKIAlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGNoaXAtPnJlZ21hcCwgSVNMMjkwMjhfUkVHX0NPTkZJR1VSRSwKLQkJQ09ORklHVVJFX0FMU19SQU5HRV9NQVNLLCB2YWwpOworCQlJU0wyOTAyOF9DT05GX0FMU19SQU5HRV9NQVNLLCB2YWwpOwogfQogCiBzdGF0aWMgaW50IGlzbDI5MDI4X3NldF9hbHNfaXJfbW9kZShzdHJ1Y3QgaXNsMjkwMjhfY2hpcCAqY2hpcCwKLQkJCQkgICAgZW51bSBhbHNfaXJfbW9kZSBtb2RlKQorCQkJCSAgICBlbnVtIGlzbDI5MDI4X2Fsc19pcl9tb2RlIG1vZGUpCiB7CiAJaW50IHJldCA9IDA7CiAKIAlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIE1PREVfQUxTOgorCWNhc2UgSVNMMjkwMjhfTU9ERV9BTFM6CiAJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhjaGlwLT5yZWdtYXAsIElTTDI5MDI4X1JFR19DT05GSUdVUkUsCi0JCQkJCSBDT05GSUdVUkVfQUxTX0lSX01PREVfTUFTSywKLQkJCQkJIENPTkZJR1VSRV9BTFNfSVJfTU9ERV9BTFMpOworCQkJCQkgSVNMMjkwMjhfQ09ORl9BTFNfSVJfTU9ERV9NQVNLLAorCQkJCQkgSVNMMjkwMjhfQ09ORl9BTFNfSVJfTU9ERV9BTFMpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAKIAkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGNoaXAtPnJlZ21hcCwgSVNMMjkwMjhfUkVHX0NPTkZJR1VSRSwKLQkJCQkJIENPTkZJR1VSRV9BTFNfUkFOR0VfTUFTSywKLQkJCQkJIENPTkZJR1VSRV9BTFNfUkFOR0VfSElHSF9MVVgpOworCQkJCQkgSVNMMjkwMjhfQ09ORl9BTFNfUkFOR0VfTUFTSywKKwkJCQkJIElTTDI5MDI4X0NPTkZfQUxTX1JBTkdFX0hJR0hfTFVYKTsKIAkJYnJlYWs7CiAKLQljYXNlIE1PREVfSVI6CisJY2FzZSBJU0wyOTAyOF9NT0RFX0lSOgogCQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoY2hpcC0+cmVnbWFwLCBJU0wyOTAyOF9SRUdfQ09ORklHVVJFLAotCQkJCQkgQ09ORklHVVJFX0FMU19JUl9NT0RFX01BU0ssCi0JCQkJCSBDT05GSUdVUkVfQUxTX0lSX01PREVfSVIpOworCQkJCQkgSVNMMjkwMjhfQ09ORl9BTFNfSVJfTU9ERV9NQVNLLAorCQkJCQkgSVNMMjkwMjhfQ09ORl9BTFNfSVJfTU9ERV9JUik7CiAJCWJyZWFrOwogCi0JY2FzZSBNT0RFX05PTkU6CisJY2FzZSBJU0wyOTAyOF9NT0RFX05PTkU6CiAJCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoY2hpcC0+cmVnbWFwLCBJU0wyOTAyOF9SRUdfQ09ORklHVVJFLAotCQkJQ09ORklHVVJFX0FMU19FTl9NQVNLLCBDT05GSUdVUkVfQUxTX0RJUyk7CisJCQlJU0wyOTAyOF9DT05GX0FMU19FTl9NQVNLLCBJU0wyOTAyOF9DT05GX0FMU19ESVMpOwogCX0KIAogCWlmIChyZXQgPCAwKQpAQCAtMTU0LDEyICsxNTMsMTMgQEAKIAogCS8qIEVuYWJsZSB0aGUgQUxTL0lSICovCiAJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGNoaXAtPnJlZ21hcCwgSVNMMjkwMjhfUkVHX0NPTkZJR1VSRSwKLQkJCQkgQ09ORklHVVJFX0FMU19FTl9NQVNLLCBDT05GSUdVUkVfQUxTX0VOKTsKKwkJCQkgSVNMMjkwMjhfQ09ORl9BTFNfRU5fTUFTSywKKwkJCQkgSVNMMjkwMjhfQ09ORl9BTFNfRU4pOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCiAJLyogTmVlZCB0byB3YWl0IGZvciBjb252ZXJzaW9uIHRpbWUgaWYgQUxTL0lSIG1vZGUgZW5hYmxlZCAqLwotCW1kZWxheShDT05WRVJTSU9OX1RJTUVfTVMpOworCW1kZWxheShJU0wyOTAyOF9DT05WX1RJTUVfTVMpOwogCXJldHVybiAwOwogfQogCkBAIC0yMjMsMTQgKzIyMywxNCBAQAogCWludCByZXQ7CiAJaW50IGFsc19pcl9kYXRhOwogCi0JaWYgKGNoaXAtPmFsc19pcl9tb2RlICE9IE1PREVfQUxTKSB7Ci0JCXJldCA9IGlzbDI5MDI4X3NldF9hbHNfaXJfbW9kZShjaGlwLCBNT0RFX0FMUyk7CisJaWYgKGNoaXAtPmFsc19pcl9tb2RlICE9IElTTDI5MDI4X01PREVfQUxTKSB7CisJCXJldCA9IGlzbDI5MDI4X3NldF9hbHNfaXJfbW9kZShjaGlwLCBJU0wyOTAyOF9NT0RFX0FMUyk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlkZXZfZXJyKGRldiwKIAkJCQkiRXJyb3IgaW4gZW5hYmxpbmcgQUxTIG1vZGUgZXJyICVkXG4iLCByZXQpOwogCQkJcmV0dXJuIHJldDsKIAkJfQotCQljaGlwLT5hbHNfaXJfbW9kZSA9IE1PREVfQUxTOworCQljaGlwLT5hbHNfaXJfbW9kZSA9IElTTDI5MDI4X01PREVfQUxTOwogCX0KIAogCXJldCA9IGlzbDI5MDI4X3JlYWRfYWxzX2lyKGNoaXAsICZhbHNfaXJfZGF0YSk7CkBAIC0yNTYsMTQgKzI1NiwxNCBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJlZ21hcF9nZXRfZGV2aWNlKGNoaXAtPnJlZ21hcCk7CiAJaW50IHJldDsKIAotCWlmIChjaGlwLT5hbHNfaXJfbW9kZSAhPSBNT0RFX0lSKSB7Ci0JCXJldCA9IGlzbDI5MDI4X3NldF9hbHNfaXJfbW9kZShjaGlwLCBNT0RFX0lSKTsKKwlpZiAoY2hpcC0+YWxzX2lyX21vZGUgIT0gSVNMMjkwMjhfTU9ERV9JUikgeworCQlyZXQgPSBpc2wyOTAyOF9zZXRfYWxzX2lyX21vZGUoY2hpcCwgSVNMMjkwMjhfTU9ERV9JUik7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlkZXZfZXJyKGRldiwKIAkJCQkiRXJyb3IgaW4gZW5hYmxpbmcgSVIgbW9kZSBlcnIgJWRcbiIsIHJldCk7CiAJCQlyZXR1cm4gcmV0OwogCQl9Ci0JCWNoaXAtPmFsc19pcl9tb2RlID0gTU9ERV9JUjsKKwkJY2hpcC0+YWxzX2lyX21vZGUgPSBJU0wyOTAyOF9NT0RFX0lSOwogCX0KIAlyZXR1cm4gaXNsMjkwMjhfcmVhZF9hbHNfaXIoY2hpcCwgaXJfZGF0YSk7CiB9CkBAIC0zODMsOCArMzgzLDggQEAKIH0KIAogc3RhdGljIElJT19DT05TVF9BVFRSKGluX3Byb3hpbWl0eV9zYW1wbGluZ19mcmVxdWVuY3lfYXZhaWxhYmxlLAotCQkJCSIxLCAzLCA1LCAxMCwgMTMsIDIwLCA4MywgMTAwIik7Ci1zdGF0aWMgSUlPX0NPTlNUX0FUVFIoaW5faWxsdW1pbmFuY2Vfc2NhbGVfYXZhaWxhYmxlLCAiMTI1LCAyMDAwIik7CisJCQkJIjEgMyA1IDEwIDEzIDIwIDgzIDEwMCIpOworc3RhdGljIElJT19DT05TVF9BVFRSKGluX2lsbHVtaW5hbmNlX3NjYWxlX2F2YWlsYWJsZSwgIjEyNSAyMDAwIik7CiAKICNkZWZpbmUgSVNMMjkwMjhfREVWX0FUVFIobmFtZSkgKCZpaW9fZGV2X2F0dHJfIyNuYW1lLmRldl9hdHRyLmF0dHIpCiAjZGVmaW5lIElTTDI5MDI4X0NPTlNUX0FUVFIobmFtZSkgKCZpaW9fY29uc3RfYXR0cl8jI25hbWUuZGV2X2F0dHIuYXR0cikKQEAgLTQyOCw3ICs0MjgsNyBAQAogCWNoaXAtPmVuYWJsZV9wcm94ICA9IGZhbHNlOwogCWNoaXAtPnByb3hfc2FtcGxpbmcgPSAyMDsKIAljaGlwLT5sdXhfc2NhbGUgPSAyMDAwOwotCWNoaXAtPmFsc19pcl9tb2RlID0gTU9ERV9OT05FOworCWNoaXAtPmFsc19pcl9tb2RlID0gSVNMMjkwMjhfTU9ERV9OT05FOwogCiAJcmV0ID0gcmVnbWFwX3dyaXRlKGNoaXAtPnJlZ21hcCwgSVNMMjkwMjhfUkVHX1RFU1QxX01PREUsIDB4MCk7CiAJaWYgKHJldCA8IDApIHsKQEAgLTQ2Miw3ICs0NjIsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBib29sIGlzX3ZvbGF0aWxlX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCitzdGF0aWMgYm9vbCBpc2wyOTAyOF9pc192b2xhdGlsZV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQogewogCXN3aXRjaCAocmVnKSB7CiAJY2FzZSBJU0wyOTAyOF9SRUdfSU5URVJSVVBUOgpAQCAtNDc4LDcgKzQ3OCw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgaXNsMjkwMjhfcmVnbWFwX2NvbmZpZyA9IHsKIAkucmVnX2JpdHMgPSA4LAogCS52YWxfYml0cyA9IDgsCi0JLnZvbGF0aWxlX3JlZyA9IGlzX3ZvbGF0aWxlX3JlZywKKwkudm9sYXRpbGVfcmVnID0gaXNsMjkwMjhfaXNfdm9sYXRpbGVfcmVnLAogCS5tYXhfcmVnaXN0ZXIgPSBJU0wyOTAyOF9OVU1fUkVHUyAtIDEsCiAJLm51bV9yZWdfZGVmYXVsdHNfcmF3ID0gSVNMMjkwMjhfTlVNX1JFR1MsCiAJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCkBAIC01NDYsNyArNTQ2LDYgQEAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGlzbDI5MDI4X29mX21hdGNoKTsKIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGlzbDI5MDI4X2RyaXZlciA9IHsKLQkuY2xhc3MJPSBJMkNfQ0xBU1NfSFdNT04sCiAJLmRyaXZlciAgPSB7CiAJCS5uYW1lID0gImlzbDI5MDI4IiwKIAkJLm9mX21hdGNoX3RhYmxlID0gaXNsMjkwMjhfb2ZfbWF0Y2gsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1ODMuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvdHNsMjU4My5jCmluZGV4IDA1YjRhZDQuLjA4ZjE1ODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvdHNsMjU4My5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvdHNsMjU4My5jCkBAIC04MDMsNyArODAzLDcgQEAKIAlOVUxMCiB9OwogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCB0c2wyNTgzX2F0dHJpYnV0ZV9ncm91cCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHRzbDI1ODNfYXR0cmlidXRlX2dyb3VwID0gewogCS5hdHRycyA9IHN5c2ZzX2F0dHJzX2N0cmwsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTQuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1NC5jCmluZGV4IGM0NmJlZjY0Li4xNzMwOTU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTQuYwpAQCAtMjMsOSArMjMsNyBAQAogI2luY2x1ZGUgIm1ldGVyLmgiCiAjaW5jbHVkZSAiYWRlNzc1NC5oIgogCi1zdGF0aWMgaW50IGFkZTc3NTRfc3BpX3dyaXRlX3JlZ184KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJdTggcmVnX2FkZHJlc3MsCi0JCXU4IHZhbCkKK3N0YXRpYyBpbnQgYWRlNzc1NF9zcGlfd3JpdGVfcmVnXzgoc3RydWN0IGRldmljZSAqZGV2LCB1OCByZWdfYWRkcmVzcywgdTggdmFsKQogewogCWludCByZXQ7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGRldik7CkBAIC00Miw4ICs0MCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgYWRlNzc1NF9zcGlfd3JpdGVfcmVnXzE2KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJdTggcmVnX2FkZHJlc3MsCi0JCXUxNiB2YWx1ZSkKKwkJCQkgICAgdTggcmVnX2FkZHJlc3MsIHUxNiB2YWx1ZSkKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfdG9faWlvX2RldihkZXYpOwpAQCAtNTksOSArNTYsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgYWRlNzc1NF9zcGlfcmVhZF9yZWdfOChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXU4IHJlZ19hZGRyZXNzLAotCQl1OCAqdmFsKQorc3RhdGljIGludCBhZGU3NzU0X3NwaV9yZWFkX3JlZ184KHN0cnVjdCBkZXZpY2UgKmRldiwgdTggcmVnX2FkZHJlc3MsIHU4ICp2YWwpCiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGRldik7CiAJc3RydWN0IGFkZTc3NTRfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKQEAgLTcwLDcgKzY1LDcgQEAKIAlyZXQgPSBzcGlfdzhyOChzdC0+dXMsIEFERTc3NTRfUkVBRF9SRUcocmVnX2FkZHJlc3MpKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hlbiByZWFkaW5nIDggYml0IHJlZ2lzdGVyIDB4JTAyWCIsCi0JCQkJcmVnX2FkZHJlc3MpOworCQkJcmVnX2FkZHJlc3MpOwogCQlyZXR1cm4gcmV0OwogCX0KIAkqdmFsID0gcmV0OwpAQCAtNzksOCArNzQsNyBAQAogfQogCiBzdGF0aWMgaW50IGFkZTc3NTRfc3BpX3JlYWRfcmVnXzE2KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJdTggcmVnX2FkZHJlc3MsCi0JCXUxNiAqdmFsKQorCQkJCSAgIHU4IHJlZ19hZGRyZXNzLCB1MTYgKnZhbCkKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKIAlzdHJ1Y3QgYWRlNzc1NF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpAQCAtOTksOCArOTMsNyBAQAogfQogCiBzdGF0aWMgaW50IGFkZTc3NTRfc3BpX3JlYWRfcmVnXzI0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJdTggcmVnX2FkZHJlc3MsCi0JCXUzMiAqdmFsKQorCQkJCSAgIHU4IHJlZ19hZGRyZXNzLCB1MzIgKnZhbCkKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKIAlzdHJ1Y3QgYWRlNzc1NF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpAQCAtMTIzLDcgKzExNiw3IEBACiAJcmV0ID0gc3BpX3N5bmNfdHJhbnNmZXIoc3QtPnVzLCB4ZmVycywgQVJSQVlfU0laRSh4ZmVycykpOwogCWlmIChyZXQpIHsKIAkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoZW4gcmVhZGluZyAyNCBiaXQgcmVnaXN0ZXIgMHglMDJYIiwKLQkJCQlyZWdfYWRkcmVzcyk7CisJCQlyZWdfYWRkcmVzcyk7CiAJCWdvdG8gZXJyb3JfcmV0OwogCX0KIAkqdmFsID0gKHN0LT5yeFsxXSA8PCAxNikgfCAoc3QtPnJ4WzJdIDw8IDgpIHwgc3QtPnJ4WzNdOwpAQCAtMTM0LDggKzEyNyw4IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFkZTc3NTRfcmVhZF84Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJIGNoYXIgKmJ1ZikKIHsKIAlpbnQgcmV0OwogCXU4IHZhbCA9IDA7CkBAIC0xNDksOCArMTQyLDggQEAKIH0KIAogc3RhdGljIHNzaXplX3QgYWRlNzc1NF9yZWFkXzE2Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgY2hhciAqYnVmKQogewogCWludCByZXQ7CiAJdTE2IHZhbCA9IDA7CkBAIC0xNjQsOCArMTU3LDggQEAKIH0KIAogc3RhdGljIHNzaXplX3QgYWRlNzc1NF9yZWFkXzI0Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgY2hhciAqYnVmKQogewogCWludCByZXQ7CiAJdTMyIHZhbCA9IDA7CkBAIC0xNzksOSArMTcyLDkgQEAKIH0KIAogc3RhdGljIHNzaXplX3QgYWRlNzc1NF93cml0ZV84Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1ZiwKLQkJc2l6ZV90IGxlbikKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgY29uc3QgY2hhciAqYnVmLAorCQkJCSAgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CiAJaW50IHJldDsKQEAgLTE5Nyw5ICsxOTAsOSBAQAogfQogCiBzdGF0aWMgc3NpemVfdCBhZGU3NzU0X3dyaXRlXzE2Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1ZiwKLQkJc2l6ZV90IGxlbikKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICBjb25zdCBjaGFyICpidWYsCisJCQkJICAgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CiAJaW50IHJldDsKQEAgLTQwMywxNiArMzk2LDE0IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFkZTc3NTRfcmVhZF9mcmVxdWVuY3koc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNoYXIgKmJ1ZikKIHsKIAlpbnQgcmV0OwogCXU4IHQ7CiAJaW50IHNwczsKIAotCXJldCA9IGFkZTc3NTRfc3BpX3JlYWRfcmVnXzgoZGV2LAotCQkJQURFNzc1NF9XQVZNT0RFLAotCQkJJnQpOworCXJldCA9IGFkZTc3NTRfc3BpX3JlYWRfcmVnXzgoZGV2LCBBREU3NzU0X1dBVk1PREUsICZ0KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC00MjMsOSArNDE0LDkgQEAKIH0KIAogc3RhdGljIHNzaXplX3QgYWRlNzc1NF93cml0ZV9mcmVxdWVuY3koc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLAotCQlzaXplX3QgbGVuKQorCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLAorCQkJCSAgICAgICBzaXplX3QgbGVuKQogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfdG9faWlvX2RldihkZXYpOwogCXN0cnVjdCBhZGU3NzU0X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X3JpbmcuYwppbmRleCBhNmI3NmQ0Li41N2MyMTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfcmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OF9yaW5nLmMKQEAgLTM4LDE4ICszOCwxNCBAQAogCWludCByZXQ7CiAJdTggcmVnOwogCi0JcmV0ID0gYWRlNzc1OF9zcGlfcmVhZF9yZWdfOChkZXYsCi0JCQlBREU3NzU4X1dBVk1PREUsCi0JCQkmcmVnKTsKKwlyZXQgPSBhZGU3NzU4X3NwaV9yZWFkX3JlZ184KGRldiwgQURFNzc1OF9XQVZNT0RFLCAmcmVnKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAogCXJlZyAmPSB+MHgxRjsKIAlyZWcgfD0gdHlwZSAmIDB4MUY7CiAKLQlyZXQgPSBhZGU3NzU4X3NwaV93cml0ZV9yZWdfOChkZXYsCi0JCQlBREU3NzU4X1dBVk1PREUsCi0JCQlyZWcpOworCXJldCA9IGFkZTc3NThfc3BpX3dyaXRlX3JlZ184KGRldiwgQURFNzc1OF9XQVZNT0RFLCByZWcpOwogb3V0OgogCXJldHVybiByZXQ7CiB9CkBAIC05NCw3ICs5MCw3IEBACiAJCQkJIGluZGlvX2Rldi0+bWFza2xlbmd0aCk7CiAKIAlhZGU3NzU4X3dyaXRlX3dhdmVmb3JtX3R5cGUoJmluZGlvX2Rldi0+ZGV2LAotCQlpbmRpb19kZXYtPmNoYW5uZWxzW2NoYW5uZWxdLmFkZHJlc3MpOworCQkJCSAgICBpbmRpb19kZXYtPmNoYW5uZWxzW2NoYW5uZWxdLmFkZHJlc3MpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc4NTQuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzg1NC5jCmluZGV4IDc1ZTg2ODUuLjI0ZWRiYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzg1NC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzg1NC5jCkBAIC0yMyw4ICsyMyw4IEBACiAjaW5jbHVkZSAiYWRlNzg1NC5oIgogCiBzdGF0aWMgc3NpemVfdCBhZGU3ODU0X3JlYWRfOGJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYpCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSBjaGFyICpidWYpCiB7CiAJaW50IHJldDsKIAl1OCB2YWwgPSAwOwpAQCAtNDAsOCArNDAsOCBAQAogfQogCiBzdGF0aWMgc3NpemVfdCBhZGU3ODU0X3JlYWRfMTZiaXQoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjaGFyICpidWYpCiB7CiAJaW50IHJldDsKIAl1MTYgdmFsID0gMDsKQEAgLTU3LDggKzU3LDggQEAKIH0KIAogc3RhdGljIHNzaXplX3QgYWRlNzg1NF9yZWFkXzI0Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgY2hhciAqYnVmKQogewogCWludCByZXQ7CiAJdTMyIHZhbDsKQEAgLTc0LDggKzc0LDggQEAKIH0KIAogc3RhdGljIHNzaXplX3QgYWRlNzg1NF9yZWFkXzMyYml0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgY2hhciAqYnVmKQogewogCWludCByZXQ7CiAJdTMyIHZhbCA9IDA7CkBAIC05MSw5ICs5MSw5IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFkZTc4NTRfd3JpdGVfOGJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljb25zdCBjaGFyICpidWYsCi0JCXNpemVfdCBsZW4pCisJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkgIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOwogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfdG9faWlvX2RldihkZXYpOwpAQCAtMTEyLDkgKzExMiw5IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFkZTc4NTRfd3JpdGVfMTZiaXQoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLAotCQlzaXplX3QgbGVuKQorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkgICBzaXplX3QgbGVuKQogewogCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKQEAgLTEzMyw5ICsxMzMsOSBAQAogfQogCiBzdGF0aWMgc3NpemVfdCBhZGU3ODU0X3dyaXRlXzI0Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1ZiwKLQkJc2l6ZV90IGxlbikKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICBjb25zdCBjaGFyICpidWYsCisJCQkJICAgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGRldik7CkBAIC0xNTQsOSArMTU0LDkgQEAKIH0KIAogc3RhdGljIHNzaXplX3QgYWRlNzg1NF93cml0ZV8zMmJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljb25zdCBjaGFyICpidWYsCi0JCXNpemVfdCBsZW4pCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgY29uc3QgY2hhciAqYnVmLAorCQkJCSAgIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOwogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfdG9faWlvX2RldihkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2tzNzAxMC9lYXBfcGFja2V0LmggYi9kcml2ZXJzL3N0YWdpbmcva3M3MDEwL2VhcF9wYWNrZXQuaAppbmRleCAxNmEzOTJhLi5kZjdmNzYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva3M3MDEwL2VhcF9wYWNrZXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcva3M3MDEwL2VhcF9wYWNrZXQuaApAQCAtMSw2ICsxLDggQEAKICNpZm5kZWYgRUFQX1BBQ0tFVF9ICiAjZGVmaW5lIEVBUF9QQUNLRVRfSAogCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKwogI2RlZmluZSBXQklUKG4pICgxIDw8IChuKSkKIAogI2lmbmRlZiBFVEhfQUxFTgpAQCAtMTksMTQgKzIxLDE0IEBACiAjZGVmaW5lIEVUSEVSX1BST1RPQ09MX1RZUEVfSVAJCTB4MDgwMAogI2RlZmluZSBFVEhFUl9QUk9UT0NPTF9UWVBFX0FSUAkJMHgwODA2CiAJLyogZm9sbG93ZWQgYnkgbGVuZ3RoIG9jdGV0cyBvZiBkYXRhICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpZWVlODAyXzF4X2hkciB7CiAJdW5zaWduZWQgY2hhciB2ZXJzaW9uOwogCXVuc2lnbmVkIGNoYXIgdHlwZTsKIAl1bnNpZ25lZCBzaG9ydCBsZW5ndGg7CiAJLyogZm9sbG93ZWQgYnkgbGVuZ3RoIG9jdGV0cyBvZiBkYXRhICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgRUFQT0xfVkVSU0lPTiAyCiAKQEAgLTUxLDI1ICs1MywzMyBAQAogc3RydWN0IGllZWU4MDJfMXhfZWFwb2xfa2V5IHsKIAl1bnNpZ25lZCBjaGFyIHR5cGU7CiAJdW5zaWduZWQgc2hvcnQga2V5X2xlbmd0aDsKLQkvKiBkb2VzIG5vdCByZXBlYXQgd2l0aGluIHRoZSBsaWZlIG9mIHRoZSBrZXlpbmcgbWF0ZXJpYWwgdXNlZCB0bwotCSAqIGVuY3J5cHQgdGhlIEtleSBmaWVsZDsgNjQtYml0IE5UUCB0aW1lc3RhbXAgTUFZIGJlIHVzZWQgaGVyZSAqLworCS8qCisJICogZG9lcyBub3QgcmVwZWF0IHdpdGhpbiB0aGUgbGlmZSBvZiB0aGUga2V5aW5nIG1hdGVyaWFsIHVzZWQgdG8KKwkgKiBlbmNyeXB0IHRoZSBLZXkgZmllbGQ7IDY0LWJpdCBOVFAgdGltZXN0YW1wIE1BWSBiZSB1c2VkIGhlcmUKKwkgKi8KIAl1bnNpZ25lZCBjaGFyIHJlcGxheV9jb3VudGVyW0lFRUU4MDIxWF9SRVBMQVlfQ09VTlRFUl9MRU5dOwogCXVuc2lnbmVkIGNoYXIga2V5X2l2W0lFRUU4MDIxWF9LRVlfSVZfTEVOXTsJLyogY3J5cHRvZ3JhcGhpY2FsbHkgcmFuZG9tIG51bWJlciAqLwotCXVuc2lnbmVkIGNoYXIga2V5X2luZGV4OwkvKiBrZXkgZmxhZyBpbiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQ6CisJdW5zaWduZWQgY2hhciBrZXlfaW5kZXg7CS8qCisJCQkJCSAqIGtleSBmbGFnIGluIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdDoKIAkJCQkJICogMCA9IGJyb2FkY2FzdCAoZGVmYXVsdCBrZXkpLAogCQkJCQkgKiAxID0gdW5pY2FzdCAoa2V5IG1hcHBpbmcga2V5KTsga2V5IGluZGV4IGlzIGluIHRoZQotCQkJCQkgKiA3IGxlYXN0IHNpZ25pZmljYW50IGJpdHMgKi8KLQkvKiBITUFDLU1ENSBtZXNzYWdlIGludGVncml0eSBjaGVjayBjb21wdXRlZCB3aXRoIE1TLU1QUEUtU2VuZC1LZXkgYXMKLQkgKiB0aGUga2V5ICovCisJCQkJCSAqIDcgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cworCQkJCQkgKi8KKwkvKgorCSAqIEhNQUMtTUQ1IG1lc3NhZ2UgaW50ZWdyaXR5IGNoZWNrIGNvbXB1dGVkIHdpdGggTVMtTVBQRS1TZW5kLUtleSBhcworCSAqIHRoZSBrZXkKKwkgKi8KIAl1bnNpZ25lZCBjaGFyIGtleV9zaWduYXR1cmVbSUVFRTgwMjFYX0tFWV9TSUdOX0xFTl07CiAKLQkvKiBmb2xsb3dlZCBieSBrZXk6IGlmIHBhY2tldCBib2R5IGxlbmd0aCA9IDQ0ICsga2V5IGxlbmd0aCwgdGhlbiB0aGUKKwkvKgorCSAqIGZvbGxvd2VkIGJ5IGtleTogaWYgcGFja2V0IGJvZHkgbGVuZ3RoID0gNDQgKyBrZXkgbGVuZ3RoLCB0aGVuIHRoZQogCSAqIGtleSBmaWVsZCAob2Yga2V5X2xlbmd0aCBieXRlcykgY29udGFpbnMgdGhlIGtleSBpbiBlbmNyeXB0ZWQgZm9ybTsKIAkgKiBpZiBwYWNrZXQgYm9keSBsZW5ndGggPSA0NCwga2V5IGZpZWxkIGlzIGFic2VudCBhbmQga2V5X2xlbmd0aAogCSAqIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBsZWFzdCBzaWduaWZpY2FudCBvY3RldHMgZnJvbQogCSAqIE1TLU1QUEUtU2VuZC1LZXkgYXR0cmlidXRlIHRvIGJlIHVzZWQgYXMgdGhlIGtleWluZyBtYXRlcmlhbDsKLQkgKiBSQzQga2V5IHVzZWQgaW4gZW5jcnlwdGlvbiA9IEtleS1JViArIE1TLU1QUEUtUmVjdi1LZXkgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCSAqIFJDNCBrZXkgdXNlZCBpbiBlbmNyeXB0aW9uID0gS2V5LUlWICsgTVMtTVBQRS1SZWN2LUtleQorCSAqLworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBXUEFfTk9OQ0VfTEVOIDMyCiAjZGVmaW5lIFdQQV9SRVBMQVlfQ09VTlRFUl9MRU4gOApAQCAtODYsNyArOTYsNyBAQAogCXVuc2lnbmVkIGNoYXIga2V5X21pY1sxNl07CiAJdW5zaWduZWQgc2hvcnQga2V5X2RhdGFfbGVuZ3RoOwogCS8qIGZvbGxvd2VkIGJ5IGtleV9kYXRhX2xlbmd0aCBieXRlcyBvZiBrZXlfZGF0YSAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIFdQQV9LRVlfSU5GT19UWVBFX01BU0sgKFdCSVQoMCkgfCBXQklUKDEpIHwgV0JJVCgyKSkKICNkZWZpbmUgV1BBX0tFWV9JTkZPX1RZUEVfSE1BQ19NRDVfUkM0IFdCSVQoMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9rczcwMTAva3M3MDEwX3NkaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9rczcwMTAva3M3MDEwX3NkaW8uYwppbmRleCBiNzMzN2ZkLi44MWM0NmY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva3M3MDEwL2tzNzAxMF9zZGlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2tzNzAxMC9rczcwMTBfc2Rpby5jCkBAIC0xNCw3ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpb19mdW5jLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgogCiAjaW5jbHVkZSAia3Nfd2xhbi5oIgogI2luY2x1ZGUgImtzX3dsYW5faW9jdGwuaCIKQEAgLTM1LDE4ICszNSwxOCBAQAogLyogbWFjcm8gKi8KIAogI2RlZmluZSBpbmNfdHhxaGVhZChwcml2KSBcCi0gICAgICAgICggcHJpdi0+dHhfZGV2LnFoZWFkID0gKHByaXYtPnR4X2Rldi5xaGVhZCArIDEpICUgVFhfREVWSUNFX0JVRkZfU0laRSApCisgICAgICAgIChwcml2LT50eF9kZXYucWhlYWQgPSAocHJpdi0+dHhfZGV2LnFoZWFkICsgMSkgJSBUWF9ERVZJQ0VfQlVGRl9TSVpFKQogI2RlZmluZSBpbmNfdHhxdGFpbChwcml2KSBcCi0gICAgICAgICggcHJpdi0+dHhfZGV2LnF0YWlsID0gKHByaXYtPnR4X2Rldi5xdGFpbCArIDEpICUgVFhfREVWSUNFX0JVRkZfU0laRSApCisgICAgICAgIChwcml2LT50eF9kZXYucXRhaWwgPSAocHJpdi0+dHhfZGV2LnF0YWlsICsgMSkgJSBUWF9ERVZJQ0VfQlVGRl9TSVpFKQogI2RlZmluZSBjbnRfdHhxYm9keShwcml2KSBcCi0gICAgICAgICgoKHByaXYtPnR4X2Rldi5xdGFpbCArIFRYX0RFVklDRV9CVUZGX1NJWkUpIC0gKHByaXYtPnR4X2Rldi5xaGVhZCkpICUgVFhfREVWSUNFX0JVRkZfU0laRSApCisgICAgICAgICgoKHByaXYtPnR4X2Rldi5xdGFpbCArIFRYX0RFVklDRV9CVUZGX1NJWkUpIC0gKHByaXYtPnR4X2Rldi5xaGVhZCkpICUgVFhfREVWSUNFX0JVRkZfU0laRSkKIAogI2RlZmluZSBpbmNfcnhxaGVhZChwcml2KSBcCi0gICAgICAgICggcHJpdi0+cnhfZGV2LnFoZWFkID0gKHByaXYtPnJ4X2Rldi5xaGVhZCArIDEpICUgUlhfREVWSUNFX0JVRkZfU0laRSApCisgICAgICAgIChwcml2LT5yeF9kZXYucWhlYWQgPSAocHJpdi0+cnhfZGV2LnFoZWFkICsgMSkgJSBSWF9ERVZJQ0VfQlVGRl9TSVpFKQogI2RlZmluZSBpbmNfcnhxdGFpbChwcml2KSBcCi0gICAgICAgICggcHJpdi0+cnhfZGV2LnF0YWlsID0gKHByaXYtPnJ4X2Rldi5xdGFpbCArIDEpICUgUlhfREVWSUNFX0JVRkZfU0laRSApCisgICAgICAgIChwcml2LT5yeF9kZXYucXRhaWwgPSAocHJpdi0+cnhfZGV2LnF0YWlsICsgMSkgJSBSWF9ERVZJQ0VfQlVGRl9TSVpFKQogI2RlZmluZSBjbnRfcnhxYm9keShwcml2KSBcCi0gICAgICAgICgoKHByaXYtPnJ4X2Rldi5xdGFpbCArIFJYX0RFVklDRV9CVUZGX1NJWkUpIC0gKHByaXYtPnJ4X2Rldi5xaGVhZCkpICUgUlhfREVWSUNFX0JVRkZfU0laRSApCisgICAgICAgICgoKHByaXYtPnJ4X2Rldi5xdGFpbCArIFJYX0RFVklDRV9CVUZGX1NJWkUpIC0gKHByaXYtPnJ4X2Rldi5xaGVhZCkpICUgUlhfREVWSUNFX0JVRkZfU0laRSkKIAogc3RhdGljIGludCBrczcwMTBfc2Rpb19yZWFkKHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYsIHVuc2lnbmVkIGludCBhZGRyZXNzLAogCQkJICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCkKQEAgLTg3LDcgKzg3LDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXZvaWQga3Nfd2xhbl9od19zbGVlcF9kb3plX3JlcXVlc3Qoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdikKK3N0YXRpYyB2b2lkIGtzX3dsYW5faHdfc2xlZXBfZG96ZV9yZXF1ZXN0KHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYpCiB7CiAJdW5zaWduZWQgY2hhciByd19kYXRhOwogCWludCByZXR2YWw7CkBAIC0xMTUsMTAgKzExNSw5IEBACiAKICBvdXQ6CiAJcHJpdi0+c2xlZXBfbW9kZSA9IGF0b21pY19yZWFkKCZwcml2LT5zbGVlcHN0YXR1cy5zdGF0dXMpOwotCXJldHVybjsKIH0KIAotdm9pZCBrc193bGFuX2h3X3NsZWVwX3dha2V1cF9yZXF1ZXN0KHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYpCitzdGF0aWMgdm9pZCBrc193bGFuX2h3X3NsZWVwX3dha2V1cF9yZXF1ZXN0KHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYpCiB7CiAJdW5zaWduZWQgY2hhciByd19kYXRhOwogCWludCByZXR2YWw7CkBAIC0xNDYsNyArMTQ1LDYgQEAKIAogIG91dDoKIAlwcml2LT5zbGVlcF9tb2RlID0gYXRvbWljX3JlYWQoJnByaXYtPnNsZWVwc3RhdHVzLnN0YXR1cyk7Ci0JcmV0dXJuOwogfQogCiB2b2lkIGtzX3dsYW5faHdfd2FrZXVwX3JlcXVlc3Qoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdikKQEAgLTE1OSw5ICsxNTcsOSBAQAogCQlyd19kYXRhID0gV0FLRVVQX1JFUTsKIAkJcmV0dmFsID0KIAkJICAgIGtzNzAxMF9zZGlvX3dyaXRlKHByaXYsIFdBS0VVUCwgJnJ3X2RhdGEsIHNpemVvZihyd19kYXRhKSk7Ci0JCWlmIChyZXR2YWwpIHsKKwkJaWYgKHJldHZhbCkKIAkJCURQUklOVEsoMSwgIiBlcnJvciA6IFdBS0VVUD0lMDJYXG4iLCByd19kYXRhKTsKLQkJfQorCiAJCURQUklOVEsoNCwgIndha2UgdXAgOiBXQUtFVVA9JTAyWFxuIiwgcndfZGF0YSk7CiAJCXByaXYtPmxhc3Rfd2FrZXVwID0gamlmZmllczsKIAkJKytwcml2LT53YWtldXBfY291bnQ7CkBAIC0xNzEsMTkgKzE2OSwxNiBAQAogCX0KIH0KIAotaW50IF9rc193bGFuX2h3X3Bvd2VyX3NhdmUoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdikKK3N0YXRpYyBpbnQgX2tzX3dsYW5faHdfcG93ZXJfc2F2ZShzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2KQogewotCWludCByYyA9IDA7CiAJdW5zaWduZWQgY2hhciByd19kYXRhOwogCWludCByZXR2YWw7CiAKIAlpZiAocHJpdi0+cmVnLnBvd2VybWd0ID09IFBPV01HVF9BQ1RJVkVfTU9ERSkKLQkJcmV0dXJuIHJjOworCQlyZXR1cm4gMDsKIAogCWlmIChwcml2LT5yZWcub3BlcmF0aW9uX21vZGUgPT0gTU9ERV9JTkZSQVNUUlVDVFVSRSAmJgogCSAgICAocHJpdi0+Y29ubmVjdF9zdGF0dXMgJiBDT05ORUNUX1NUQVRVU19NQVNLKSA9PSBDT05ORUNUX1NUQVRVUykgewotCi0JCS8vRFBSSU5USygxLCJwc3N0YXR1cy5zdGF0dXM9JWRcbiIsYXRvbWljX3JlYWQoJnByaXYtPnBzc3RhdHVzLnN0YXR1cykpOwogCQlpZiAocHJpdi0+ZGV2X3N0YXRlID09IERFVklDRV9TVEFURV9TTEVFUCkgewogCQkJc3dpdGNoIChhdG9taWNfcmVhZCgmcHJpdi0+cHNzdGF0dXMuc3RhdHVzKSkgewogCQkJY2FzZSBQU19TTk9PWkU6CS8qIDQgKi8KQEAgLTI0NiwxMCArMjQxLDkgQEAKIAkJCQlicmVhazsKIAkJCX0KIAkJfQotCiAJfQogCi0JcmV0dXJuIHJjOworCXJldHVybiAwOwogfQogCiBpbnQga3Nfd2xhbl9od19wb3dlcl9zYXZlKHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYpCkBAIC0yNjgsNyArMjYyLDcgQEAKIAogCWlmIChwcml2LT5kZXZfc3RhdGUgPCBERVZJQ0VfU1RBVEVfQk9PVCkgewogCQlrZnJlZShwKTsKLQkJaWYgKGNvbXBsZXRlX2hhbmRsZXIgIT0gTlVMTCkKKwkJaWYgKGNvbXBsZXRlX2hhbmRsZXIpCiAJCQkoKmNvbXBsZXRlX2hhbmRsZXIpIChhcmcxLCBhcmcyKTsKIAkJcmV0dXJuIDE7CiAJfQpAQCAtMjc3LDcgKzI3MSw3IEBACiAJCS8qIGluIGNhc2Ugb2YgYnVmZmVyIG92ZXJmbG93ICovCiAJCURQUklOVEsoMSwgInR4IGJ1ZmZlciBvdmVyZmxvd1xuIik7CiAJCWtmcmVlKHApOwotCQlpZiAoY29tcGxldGVfaGFuZGxlciAhPSBOVUxMKQorCQlpZiAoY29tcGxldGVfaGFuZGxlcikKIAkJCSgqY29tcGxldGVfaGFuZGxlcikgKGFyZzEsIGFyZzIpOwogCQlyZXR1cm4gMTsKIAl9CkBAIC0yOTcsMTEgKzI5MSwxMCBAQAogc3RhdGljIGludCB3cml0ZV90b19kZXZpY2Uoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdiwgdW5zaWduZWQgY2hhciAqYnVmZmVyLAogCQkJICAgdW5zaWduZWQgbG9uZyBzaXplKQogewotCWludCByYywgcmV0dmFsOworCWludCByZXR2YWw7CiAJdW5zaWduZWQgY2hhciByd19kYXRhOwogCXN0cnVjdCBob3N0aWZfaGRyICpoZHI7CiAJaGRyID0gKHN0cnVjdCBob3N0aWZfaGRyICopYnVmZmVyOwotCXJjID0gMDsKIAogCURQUklOVEsoNCwgInNpemU9JWRcbiIsIGhkci0+c2l6ZSk7CiAJaWYgKGhkci0+ZXZlbnQgPCBISUZfREFUQV9SRVEgfHwgSElGX1JFUV9NQVggPCBoZHItPmV2ZW50KSB7CkBAIC0zNDYsMTAgKzMzOSw5IEBACiAJCQkJCQkgICAmcHJpdi0+a3Nfd2xhbl9ody5yd193cSwgMSk7CiAJCQkJcmV0dXJuOwogCQkJfQotCiAJCX0KIAkJa2ZyZWUoc3AtPnNlbmRwKTsJLyogYWxsb2NhdGVkIG1lbW9yeSBmcmVlICovCi0JCWlmIChzcC0+Y29tcGxldGVfaGFuZGxlciAhPSBOVUxMKQkvKiBUWCBDb21wbGV0ZSAqLworCQlpZiAoc3AtPmNvbXBsZXRlX2hhbmRsZXIpCS8qIFRYIENvbXBsZXRlICovCiAJCQkoKnNwLT5jb21wbGV0ZV9oYW5kbGVyKSAoc3AtPmFyZzEsIHNwLT5hcmcyKTsKIAkJaW5jX3R4cWhlYWQocHJpdik7CiAKQEAgLTM1OCw3ICszNTAsNiBAQAogCQkJCQkgICAmcHJpdi0+a3Nfd2xhbl9ody5yd193cSwgMCk7CiAJCX0KIAl9Ci0JcmV0dXJuOwogfQogCiBpbnQga3Nfd2xhbl9od190eChzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2LCB2b2lkICpwLCB1bnNpZ25lZCBsb25nIHNpemUsCkBAIC00MDIsMTIgKzM5Myw5IEBACiAJCWhvc3RpZl9yZWNlaXZlKHByaXYsIHJwLT5kYXRhLCBycC0+c2l6ZSk7CiAJCWluY19yeHFoZWFkKHByaXYpOwogCi0JCWlmIChjbnRfcnhxYm9keShwcml2KSA+IDApIHsKKwkJaWYgKGNudF9yeHFib2R5KHByaXYpID4gMCkKIAkJCXRhc2tsZXRfc2NoZWR1bGUoJnByaXYtPmtzX3dsYW5faHcucnhfYmhfdGFzayk7Ci0JCX0KIAl9Ci0KLQlyZXR1cm47CiB9CiAKIHN0YXRpYyB2b2lkIGtzX3dsYW5faHdfcngodm9pZCAqZGV2LCB1aW50MTZfdCBzaXplKQpAQCAtNDMyLDkgKzQyMCw4IEBACiAJcmV0dmFsID0KIAkgICAga3M3MDEwX3NkaW9fcmVhZChwcml2LCBEQVRBX1dJTkRPVywgJnJ4X2J1ZmZlci0+ZGF0YVswXSwKIAkJCSAgICAgaGlmX2FsaWduX3NpemUoc2l6ZSkpOwotCWlmIChyZXR2YWwpIHsKKwlpZiAocmV0dmFsKQogCQlnb3RvIGVycm9yX291dDsKLQl9CiAKIAkvKiBsZW5ndGggY2hlY2sgKi8KIAlpZiAoc2l6ZSA+IDIwNDYgfHwgc2l6ZSA9PSAwKSB7CkBAIC00NDksOSArNDM2LDkgQEAKIAkJcmV0dmFsID0KIAkJICAgIGtzNzAxMF9zZGlvX3dyaXRlKHByaXYsIFJFQURfU1RBVFVTLCAmcmVhZF9zdGF0dXMsCiAJCQkJICAgICAgc2l6ZW9mKHJlYWRfc3RhdHVzKSk7Ci0JCWlmIChyZXR2YWwpIHsKKwkJaWYgKHJldHZhbCkKIAkJCURQUklOVEsoMSwgIiBlcnJvciA6IFJFQURfU1RBVFVTPSUwMlhcbiIsIHJlYWRfc3RhdHVzKTsKLQkJfQorCiAJCWdvdG8gZXJyb3Jfb3V0OwogCX0KIApAQCAtNDY1LDkgKzQ1Miw5IEBACiAJcmV0dmFsID0KIAkgICAga3M3MDEwX3NkaW9fd3JpdGUocHJpdiwgUkVBRF9TVEFUVVMsICZyZWFkX3N0YXR1cywKIAkJCSAgICAgIHNpemVvZihyZWFkX3N0YXR1cykpOwotCWlmIChyZXR2YWwpIHsKKwlpZiAocmV0dmFsKQogCQlEUFJJTlRLKDEsICIgZXJyb3IgOiBSRUFEX1NUQVRVUz0lMDJYXG4iLCByZWFkX3N0YXR1cyk7Ci0JfQorCiAJRFBSSU5USyg0LCAiUkVBRF9TVEFUVVM9JTAyWFxuIiwgcmVhZF9zdGF0dXMpOwogCiAJaWYgKGF0b21pY19yZWFkKCZwcml2LT5wc3N0YXR1cy5jb25maXJtX3dhaXQpKSB7CkBAIC00OTgsNyArNDg1LDcgQEAKIAogCS8qIHdpYXQgYWZ0ZXIgRE9aRSAqLwogCWlmICh0aW1lX2FmdGVyKHByaXYtPmxhc3RfZG96ZSArICgoMzAgKiBIWikgLyAxMDAwKSwgamlmZmllcykpIHsKLQkJRFBSSU5USyg0LCAid2FpdCBhZnRlciBET1pFIFxuIik7CisJCURQUklOVEsoNCwgIndhaXQgYWZ0ZXIgRE9aRVxuIik7CiAJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT5rc193bGFuX2h3LmtzNzAxMHNkaW9fd3EsCiAJCQkJICAgJnByaXYtPmtzX3dsYW5faHcucndfd3EsIDEpOwogCQlyZXR1cm47CkBAIC01MDYsMTEgKzQ5MywxMyBAQAogCiAJLyogd2lhdCBhZnRlciBXQUtFVVAgKi8KIAl3aGlsZSAodGltZV9hZnRlcihwcml2LT5sYXN0X3dha2V1cCArICgoMzAgKiBIWikgLyAxMDAwKSwgamlmZmllcykpIHsKLQkJRFBSSU5USyg0LCAid2FpdCBhZnRlciBXQUtFVVAgXG4iKTsKKwkJRFBSSU5USyg0LCAid2FpdCBhZnRlciBXQUtFVVBcbiIpOwogLyoJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT5rc193bGFuX2h3LmtzNzAxMHNkaW9fd3EsJnByaXYtPmtzX3dsYW5faHcucndfd3EsCiAJCShwcml2LT5sYXN0X3dha2V1cCArICgoMzAqSFopLzEwMDApIC0gamlmZmllcykpOyovCi0JCXByaW50aygid2FrZTogJWx1ICVsdVxuIiwgcHJpdi0+bGFzdF93YWtldXAgKyAoMzAgKiBIWikgLyAxMDAwLAotCQkgICAgICAgamlmZmllcyk7CisJCWRldl9pbmZvKCZwcml2LT5rc193bGFuX2h3LnNkaW9fY2FyZC0+ZnVuYy0+ZGV2LAorCQkJICJ3YWtlOiAlbHUgJWx1XG4iLAorCQkJIHByaXYtPmxhc3Rfd2FrZXVwICsgKDMwICogSFopIC8gMTAwMCwKKwkJCQlqaWZmaWVzKTsKIAkJbXNsZWVwKDMwKTsKIAl9CiAKQEAgLTU0OSwxNyArNTM4LDE1IEBACiAKIAlpZiAocndfZGF0YSAmIFJTSVpFX01BU0spIHsJLyogUmVhZCBzY2hlZHVsZSAqLwogCQlrc193bGFuX2h3X3J4KCh2b2lkICopcHJpdiwKLQkJCSAgICAgICh1aW50MTZfdCkgKCgocndfZGF0YSAmIFJTSVpFX01BU0spIDw8IDQpKSk7CisJCQkgICAgICAodWludDE2X3QpKChyd19kYXRhICYgUlNJWkVfTUFTSykgPDwgNCkpOwogCX0KLQlpZiAoKHJ3X2RhdGEgJiBXU1RBVFVTX01BU0spKSB7CisJaWYgKChyd19kYXRhICYgV1NUQVRVU19NQVNLKSkKIAkJdHhfZGV2aWNlX3Rhc2soKHZvaWQgKilwcml2KTsKLQl9CisKIAlfa3Nfd2xhbl9od19wb3dlcl9zYXZlKHByaXYpOwogCiAgZXJyX291dDoKIAlzZGlvX3JlbGVhc2VfaG9zdChwcml2LT5rc193bGFuX2h3LnNkaW9fY2FyZC0+ZnVuYyk7Ci0KLQlyZXR1cm47CiB9CiAKIHN0YXRpYyB2b2lkIGtzX3NkaW9faW50ZXJydXB0KHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMpCkBAIC02MDcsNyArNTk0LDYgQEAKIAkJCQl9CiAJCQkJY29tcGxldGUoJnByaXYtPnBzc3RhdHVzLndha2V1cF93YWl0KTsKIAkJCX0KLQogCQl9CiAKIAkJZG8gewpAQCAtNjI0LDcgKzYxMCw3IEBACiAJCQlyc2l6ZSA9IHJ3X2RhdGEgJiBSU0laRV9NQVNLOwogCQkJaWYgKHJzaXplKSB7CS8qIFJlYWQgc2NoZWR1bGUgKi8KIAkJCQlrc193bGFuX2h3X3J4KCh2b2lkICopcHJpdiwKLQkJCQkJICAgICAgKHVpbnQxNl90KSAoKChyc2l6ZSkgPDwgNCkpKTsKKwkJCQkJICAgICAgKHVpbnQxNl90KShyc2l6ZSA8PCA0KSk7CiAJCQl9CiAJCQlpZiAocndfZGF0YSAmIFdTVEFUVVNfTUFTSykgewogI2lmIDAKQEAgLTY2Nyw3ICs2NTMsNiBAQAogIGludHJfb3V0OgogCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT5rc193bGFuX2h3LmtzNzAxMHNkaW9fd3EsCiAJCQkgICAmcHJpdi0+a3Nfd2xhbl9ody5yd193cSwgMCk7Ci0JcmV0dXJuOwogfQogCiBzdGF0aWMgaW50IHRyeF9kZXZpY2VfaW5pdChzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2KQpAQCAtNjk2LDE0ICs2ODEsMTIgQEAKIAl3aGlsZSAoY250X3R4cWJvZHkocHJpdikgPiAwKSB7CiAJCXNwID0gJnByaXYtPnR4X2Rldi50eF9kZXZfYnVmZltwcml2LT50eF9kZXYucWhlYWRdOwogCQlrZnJlZShzcC0+c2VuZHApOwkvKiBhbGxvY2F0ZWQgbWVtb3J5IGZyZWUgKi8KLQkJaWYgKHNwLT5jb21wbGV0ZV9oYW5kbGVyICE9IE5VTEwpCS8qIFRYIENvbXBsZXRlICovCisJCWlmIChzcC0+Y29tcGxldGVfaGFuZGxlcikJLyogVFggQ29tcGxldGUgKi8KIAkJCSgqc3AtPmNvbXBsZXRlX2hhbmRsZXIpIChzcC0+YXJnMSwgc3AtPmFyZzIpOwogCQlpbmNfdHhxaGVhZChwcml2KTsKIAl9CiAKIAl0YXNrbGV0X2tpbGwoJnByaXYtPmtzX3dsYW5faHcucnhfYmhfdGFzayk7Ci0KLQlyZXR1cm47CiB9CiAKIHN0YXRpYyBpbnQga3M3MDEwX3NkaW9fdXBkYXRlX2luZGV4KHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYsIHUzMiBpbmRleCkKQEAgLTcxMSw3ICs2OTQsNiBAQAogCWludCByYyA9IDA7CiAJaW50IHJldHZhbDsKIAl1bnNpZ25lZCBjaGFyICpkYXRhX2J1ZjsKLQlkYXRhX2J1ZiA9IE5VTEw7CiAKIAlkYXRhX2J1ZiA9IGttYWxsb2Moc2l6ZW9mKHUzMiksIEdGUF9LRVJORUwpOwogCWlmICghZGF0YV9idWYpIHsKQEAgLTczMiw4ICs3MTQsNyBAQAogCQlnb3RvIGVycm9yX291dDsKIAl9CiAgZXJyb3Jfb3V0OgotCWlmIChkYXRhX2J1ZikKLQkJa2ZyZWUoZGF0YV9idWYpOworCWtmcmVlKGRhdGFfYnVmKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTc0NCw3ICs3MjUsNyBAQAogCWludCByYyA9IDA7CiAJaW50IHJldHZhbDsKIAl1bnNpZ25lZCBjaGFyICpyZWFkX2J1ZjsKLQlyZWFkX2J1ZiA9IE5VTEw7CisKIAlyZWFkX2J1ZiA9IGttYWxsb2MoUk9NX0JVRkZfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyZWFkX2J1ZikgewogCQlyYyA9IDE7CkBAIC03NTgsMTMgKzczOSwxMiBAQAogCXJldHZhbCA9IG1lbWNtcChkYXRhLCByZWFkX2J1Ziwgc2l6ZSk7CiAKIAlpZiAocmV0dmFsKSB7Ci0JCURQUklOVEsoMCwgImRhdGEgY29tcGFyZSBlcnJvciAoJWQpIFxuIiwgcmV0dmFsKTsKKwkJRFBSSU5USygwLCAiZGF0YSBjb21wYXJlIGVycm9yICglZClcbiIsIHJldHZhbCk7CiAJCXJjID0gMzsKIAkJZ290byBlcnJvcl9vdXQ7CiAJfQogIGVycm9yX291dDoKLQlpZiAocmVhZF9idWYpCi0JCWtmcmVlKHJlYWRfYnVmKTsKKwlrZnJlZShyZWFkX2J1Zik7CiAJcmV0dXJuIHJjOwogfQogCkBAIC03NzgsMTQgKzc1OCwxMCBAQAogCWludCBsZW5ndGg7CiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmd19lbnRyeSA9IE5VTEw7CiAKLQlyb21fYnVmID0gTlVMTDsKLQogCS8qIGJ1ZmZlciBhbGxvY2F0ZSAqLwogCXJvbV9idWYgPSBrbWFsbG9jKFJPTV9CVUZGX1NJWkUsIEdGUF9LRVJORUwpOwotCWlmICghcm9tX2J1ZikgewotCQlyYyA9IDM7Ci0JCWdvdG8gZXJyb3Jfb3V0MDsKLQl9CisJaWYgKCFyb21fYnVmKQorCQlyZXR1cm4gMzsKIAogCXNkaW9fY2xhaW1faG9zdChjYXJkLT5mdW5jKTsKIApAQCAtNzk5LDcgKzc3NSw3IEBACiAKIAlyZXR2YWwgPSByZXF1ZXN0X2Zpcm13YXJlKCZmd19lbnRyeSwgUk9NX0ZJTEUsICZwcml2LT5rc193bGFuX2h3LnNkaW9fY2FyZC0+ZnVuYy0+ZGV2KTsKIAlpZiAocmV0dmFsKQotCQlyZXR1cm4gcmV0dmFsOworCQlnb3RvIGVycm9yX291dDA7CiAKIAlsZW5ndGggPSBmd19lbnRyeS0+c2l6ZTsKIApAQCAtODc5LDggKzg1NSw3IEBACiAJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CiAgZXJyb3Jfb3V0MDoKIAlzZGlvX3JlbGVhc2VfaG9zdChjYXJkLT5mdW5jKTsKLQlpZiAocm9tX2J1ZikKLQkJa2ZyZWUocm9tX2J1Zik7CisJa2ZyZWUocm9tX2J1Zik7CiAJcmV0dXJuIHJjOwogfQogCkBAIC05MDMsOSArODc4LDkgQEAKIAkJRFBSSU5USygxLCAid2FpdCB0aW1lIG91dCEhIFNNRV9TVEFSVFxuIik7CiAJfQogCi0JaWYgKHByaXYtPm1hY19hZGRyZXNzX3ZhbGlkICYmIHByaXYtPnZlcnNpb25fc2l6ZSkgeworCWlmIChwcml2LT5tYWNfYWRkcmVzc192YWxpZCAmJiBwcml2LT52ZXJzaW9uX3NpemUpCiAJCXByaXYtPmRldl9zdGF0ZSA9IERFVklDRV9TVEFURV9QUkVJTklUOwotCX0KKwogCiAJaG9zdGlmX3NtZV9lbnF1ZXVlKHByaXYsIFNNRV9HRVRfRUVQUk9NX0NLU1VNKTsKIApAQCAtOTgxLDcgKzk1Niw3IEBACiAJbmV0ZGV2ID0gTlVMTDsKIAogCS8qIGluaXRpbGl6ZSBrc19zZGlvX2NhcmQgKi8KLQljYXJkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGtzX3NkaW9fY2FyZCksIEdGUF9LRVJORUwpOworCWNhcmQgPSBremFsbG9jKHNpemVvZigqY2FyZCksIEdGUF9LRVJORUwpOwogCWlmICghY2FyZCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTEwMjksMTIgKzEwMDQsMTMgQEAKIAogCS8qIHByaXZhdGUgbWVtb3J5IGFsbG9jYXRlICovCiAJbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKCpwcml2KSk7Ci0JaWYgKG5ldGRldiA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAia3M3MDEwIDogVW5hYmxlIHRvIGFsbG9jIG5ldyBuZXQgZGV2aWNlXG4iKTsKKwlpZiAoIW5ldGRldikgeworCQlkZXZfZXJyKCZjYXJkLT5mdW5jLT5kZXYsICJrczcwMTAgOiBVbmFibGUgdG8gYWxsb2MgbmV3IG5ldCBkZXZpY2VcbiIpOwogCQlnb3RvIGVycm9yX3JlbGVhc2VfaXJxOwogCX0KIAlpZiAoZGV2X2FsbG9jX25hbWUobmV0ZGV2LCAid2xhbiVkIikgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAia3M3MDEwIDogIENvdWxkbid0IGdldCBuYW1lIVxuIik7CisJCWRldl9lcnIoJmNhcmQtPmZ1bmMtPmRldiwKKwkJCSJrczcwMTAgOiAgQ291bGRuJ3QgZ2V0IG5hbWUhXG4iKTsKIAkJZ290byBlcnJvcl9mcmVlX25ldGRldjsKIAl9CiAKQEAgLTEwNDgsOSArMTAyNCw5IEBACiAJaW5pdF9jb21wbGV0aW9uKCZwcml2LT5rc193bGFuX2h3LmtzNzAxMF9zZGlvX3dhaXQpOwogCXByaXYtPmtzX3dsYW5faHcucmVhZF9idWYgPSBOVUxMOwogCXByaXYtPmtzX3dsYW5faHcucmVhZF9idWYgPSBrbWFsbG9jKFJYX0RBVEFfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcml2LT5rc193bGFuX2h3LnJlYWRfYnVmKSB7CisJaWYgKCFwcml2LT5rc193bGFuX2h3LnJlYWRfYnVmKQogCQlnb3RvIGVycm9yX2ZyZWVfbmV0ZGV2OwotCX0KKwogCXByaXYtPmRldl9zdGF0ZSA9IERFVklDRV9TVEFURV9QUkVCT09UOwogCXByaXYtPm5ldF9kZXYgPSBuZXRkZXY7CiAJcHJpdi0+ZmlybXdhcmVfdmVyc2lvblswXSA9ICdcMCc7CkBAIC0xMDc0LDkgKzEwNTAsOSBAQAogCS8qIFVwbG9hZCBmaXJtd2FyZSAqLwogCXJldCA9IGtzNzAxMF91cGxvYWRfZmlybXdhcmUocHJpdiwgY2FyZCk7CS8qIGZpcm13YXJlIGxvYWQgKi8KIAlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImtzNzAxMDogZmlybXdhcmUgbG9hZCBmYWlsZWQgISEgcmV0ZXJuIGNvZGUgPSAlZFxuIiwKLQkJICAgICAgIHJldCk7CisJCWRldl9lcnIoJmNhcmQtPmZ1bmMtPmRldiwKKwkJCSJrczcwMTA6IGZpcm13YXJlIGxvYWQgZmFpbGVkICEhIHJldHVybiBjb2RlID0gJWRcbiIsCisJCQkgcmV0KTsKIAkJZ290byBlcnJvcl9mcmVlX3JlYWRfYnVmOwogCX0KIApAQCAtMTA4Niw5ICsxMDYyLDkgQEAKIAlzZGlvX2NsYWltX2hvc3QoZnVuYyk7CiAJcmV0ID0ga3M3MDEwX3NkaW9fd3JpdGUocHJpdiwgSU5UX1BFTkRJTkcsICZyd19kYXRhLCBzaXplb2YocndfZGF0YSkpOwogCXNkaW9fcmVsZWFzZV9ob3N0KGZ1bmMpOwotCWlmIChyZXQpIHsKKwlpZiAocmV0KQogCQlEUFJJTlRLKDEsICIgZXJyb3IgOiBJTlRfUEVORElORz0lMDJYXG4iLCByd19kYXRhKTsKLQl9CisKIAlEUFJJTlRLKDQsICIgY2xlYXIgSW50ZXJydXB0IDogSU5UX1BFTkRJTkc9JTAyWFxuIiwgcndfZGF0YSk7CiAKIAkvKiBlbmFibGUga3M3MDEwc2RpbyBpbnRlcnJ1cHQgKElOVF9HQ1JfQnxJTlRfUkVBRF9TVEFUVVN8SU5UX1dSSVRFX1NUQVRVUykgKi8KQEAgLTEwOTYsOSArMTA3Miw5IEBACiAJc2Rpb19jbGFpbV9ob3N0KGZ1bmMpOwogCXJldCA9IGtzNzAxMF9zZGlvX3dyaXRlKHByaXYsIElOVF9FTkFCTEUsICZyd19kYXRhLCBzaXplb2YocndfZGF0YSkpOwogCXNkaW9fcmVsZWFzZV9ob3N0KGZ1bmMpOwotCWlmIChyZXQpIHsKKwlpZiAocmV0KQogCQlEUFJJTlRLKDEsICIgZXJyb3IgOiBJTlRfRU5BQkxFPSUwMlhcbiIsIHJ3X2RhdGEpOwotCX0KKwogCURQUklOVEsoNCwgIiBlbmFibGUgSW50ZXJydXB0IDogSU5UX0VOQUJMRT0lMDJYXG4iLCByd19kYXRhKTsKIAlwcml2LT5kZXZfc3RhdGUgPSBERVZJQ0VfU1RBVEVfQk9PVDsKIApAQCAtMTE0MSwxOCArMTExNywxOCBAQAogCWludCByZXQ7CiAJc3RydWN0IGtzX3NkaW9fY2FyZCAqY2FyZDsKIAlzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2OwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CiAJRFBSSU5USygxLCAia3M3MDEwX3NkaW9fcmVtb3ZlKClcbiIpOwogCiAJY2FyZCA9IHNkaW9fZ2V0X2RydmRhdGEoZnVuYyk7CiAKLQlpZiAoY2FyZCA9PSBOVUxMKQorCWlmICghY2FyZCkKIAkJcmV0dXJuOwogCiAJRFBSSU5USygxLCAicHJpdiA9IGNhcmQtPnByaXZcbiIpOwogCXByaXYgPSBjYXJkLT5wcml2OwotCW5ldGRldiA9IHByaXYtPm5ldF9kZXY7CiAJaWYgKHByaXYpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHByaXYtPm5ldF9kZXY7CisKIAkJa3Nfd2xhbl9uZXRfc3RvcChuZXRkZXYpOwogCQlEUFJJTlRLKDEsICJrc193bGFuX25ldF9zdG9wXG4iKTsKIApAQCAtMTE2Niw5ICsxMTQyLDggQEAKIAkJLyogc2VuZCBzdG9wIHJlcXVlc3QgdG8gTUFDICovCiAJCXsKIAkJCXN0cnVjdCBob3N0aWZfc3RvcF9yZXF1ZXN0X3QgKnBwOwotCQkJcHAgPSAoc3RydWN0IGhvc3RpZl9zdG9wX3JlcXVlc3RfdCAqKQotCQkJICAgIGt6YWxsb2MoaGlmX2FsaWduX3NpemUoc2l6ZW9mKCpwcCkpLCBHRlBfS0VSTkVMKTsKLQkJCWlmIChwcCA9PSBOVUxMKSB7CisJCQlwcCA9IGt6YWxsb2MoaGlmX2FsaWduX3NpemUoc2l6ZW9mKCpwcCkpLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghcHApIHsKIAkJCQlEUFJJTlRLKDMsICJhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkLi5cbiIpOwogCQkJCXJldHVybjsJLyogdG8gZG8gZ290byBuaSBzdXJ1ICovCiAJCQl9CkBAIC0xMTc2LDcgKzExNTEsNyBAQAogCQkJICAgIGNwdV90b19sZTE2KCh1aW50MTZfdCkKIAkJCQkJKHNpemVvZigqcHApIC0KIAkJCQkJIHNpemVvZihwcC0+aGVhZGVyLnNpemUpKSk7Ci0JCQlwcC0+aGVhZGVyLmV2ZW50ID0gY3B1X3RvX2xlMTYoKHVpbnQxNl90KSBISUZfU1RPUF9SRVEpOworCQkJcHAtPmhlYWRlci5ldmVudCA9IGNwdV90b19sZTE2KCh1aW50MTZfdClISUZfU1RPUF9SRVEpOwogCiAJCQlzZGlvX2NsYWltX2hvc3QoZnVuYyk7CiAJCQl3cml0ZV90b19kZXZpY2UocHJpdiwgKHVuc2lnbmVkIGNoYXIgKilwcCwKQEAgLTExOTksOSArMTE3NCw3IEBACiAJCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CiAKIAkJdHJ4X2RldmljZV9leGl0KHByaXYpOwotCQlpZiAocHJpdi0+a3Nfd2xhbl9ody5yZWFkX2J1ZikgewotCQkJa2ZyZWUocHJpdi0+a3Nfd2xhbl9ody5yZWFkX2J1Zik7Ci0JCX0KKwkJa2ZyZWUocHJpdi0+a3Nfd2xhbl9ody5yZWFkX2J1Zik7CiAJCWZyZWVfbmV0ZGV2KHByaXYtPm5ldF9kZXYpOwogCQljYXJkLT5wcml2ID0gTlVMTDsKIAl9CkBAIC0xMjE5LDcgKzExOTIsNiBAQAogCURQUklOVEsoMSwgImtmcmVlKClcbiIpOwogCiAJRFBSSU5USyg1LCAiIEJ5ZSAhIVxuIik7Ci0JcmV0dXJuOwogfQogCiBzdGF0aWMgc3RydWN0IHNkaW9fZHJpdmVyIGtzNzAxMF9zZGlvX2RyaXZlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9rczcwMTAva3NfaG9zdGlmLmMgYi9kcml2ZXJzL3N0YWdpbmcva3M3MDEwL2tzX2hvc3RpZi5jCmluZGV4IGE4ODIyZmUuLmM1N2NhNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9rczcwMTAva3NfaG9zdGlmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2tzNzAxMC9rc19ob3N0aWYuYwpAQCAtMTQsMjEgKzE0LDEzIEBACiAjaW5jbHVkZSAiZWFwX3BhY2tldC5oIgogI2luY2x1ZGUgIm1pY2hhZWxfbWljLmgiCiAKKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAKIC8qIEluY2x1ZGUgV2lyZWxlc3MgRXh0ZW5zaW9uIGRlZmluaXRpb24gYW5kIGNoZWNrIHZlcnNpb24gKi8KICNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgkvKiBOZXcgZHJpdmVyIEFQSSAqLwogCi1leHRlcm4gaW50IGtzX3dsYW5faHdfdHgoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdiwgdm9pZCAqcCwKLQkJCSB1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkgdm9pZCAoKmNvbXBsZXRlX2hhbmRsZXIpICh2b2lkICphcmcxLCB2b2lkICphcmcyKSwKLQkJCSB2b2lkICphcmcxLCB2b2lkICphcmcyKTsKLWV4dGVybiB2b2lkIHNlbmRfcGFja2V0X2NvbXBsZXRlKHZvaWQgKiwgdm9pZCAqKTsKLQotZXh0ZXJuIHZvaWQga3Nfd2xhbl9od193YWtldXBfcmVxdWVzdChzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2KTsKLWV4dGVybiBpbnQga3Nfd2xhbl9od19wb3dlcl9zYXZlKHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYpOwotCiAvKiBtYWNybyAqLwogI2RlZmluZSBpbmNfc21lcWhlYWQocHJpdikgXAogICAgICAgICAoIHByaXYtPnNtZV9pLnFoZWFkID0gKHByaXYtPnNtZV9pLnFoZWFkICsgMSkgJSBTTUVfRVZFTlRfQlVGRl9TSVpFICkKQEAgLTQzLDYgKzM1LDcgQEAKIGlubGluZSB1OCBnZXRfQllURShzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2KQogewogCXU4IGRhdGE7CisKIAlkYXRhID0gKihwcml2LT5yeHApKys7CiAJLyogbGVuZ3RoIGNoZWNrIGluIGFkdmFuY2UgISAqLwogCS0tKHByaXYtPnJ4X3NpemUpOwpAQCAtNTMsNiArNDYsNyBAQAogaW5saW5lIHUxNiBnZXRfV09SRChzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2KQogewogCXUxNiBkYXRhOworCiAJZGF0YSA9IChnZXRfQllURShwcml2KSAmIDB4ZmYpOwogCWRhdGEgfD0gKChnZXRfQllURShwcml2KSA8PCA4KSAmIDB4ZmYwMCk7CiAJcmV0dXJuIGRhdGE7CkBAIC02Miw2ICs1Niw3IEBACiBpbmxpbmUgdTMyIGdldF9EV09SRChzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2KQogewogCXUzMiBkYXRhOworCiAJZGF0YSA9IChnZXRfQllURShwcml2KSAmIDB4ZmYpOwogCWRhdGEgfD0gKChnZXRfQllURShwcml2KSA8PCA4KSAmIDB4MDAwMGZmMDApOwogCWRhdGEgfD0gKChnZXRfQllURShwcml2KSA8PCAxNikgJiAweDAwZmYwMDAwKTsKQEAgLTY5LDE2ICs2NCwyMCBAQAogCXJldHVybiBkYXRhOwogfQogCi12b2lkIGtzX3dsYW5faHdfd2FrZXVwX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQga3Nfd2xhbl9od193YWtldXBfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdiA9CiAJICAgIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlLCBrc193bGFuX3dha2V1cF90YXNrKTsKIAlpbnQgcHNfc3RhdHVzID0gYXRvbWljX3JlYWQoJnByaXYtPnBzc3RhdHVzLnN0YXR1cyk7CisJbG9uZyB0aW1lX2xlZnQ7CiAKIAlpZiAocHNfc3RhdHVzID09IFBTX1NOT09aRSkgewogCQlrc193bGFuX2h3X3dha2V1cF9yZXF1ZXN0KHByaXYpOwotCQlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZwcml2LT5wc3N0YXR1cy53YWtldXBfd2FpdCwgSFogLyA1MCkpIHsJLyogMjBtcyB0aW1lb3V0ICovCi0JCQlEUFJJTlRLKDEsICJ3YWtlIHVwIHRpbWVvdXQgISEhXG4iKTsKKwkJdGltZV9sZWZ0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCisJCQkJJnByaXYtPnBzc3RhdHVzLndha2V1cF93YWl0LAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoMjApKTsKKwkJaWYgKHRpbWVfbGVmdCA8PSAwKSB7CisJCQlEUFJJTlRLKDEsICJ3YWtlIHVwIHRpbWVvdXQgb3IgaW50ZXJydXB0ZWQgISEhXG4iKTsKIAkJCXNjaGVkdWxlX3dvcmsoJnByaXYtPmtzX3dsYW5fd2FrZXVwX3Rhc2spOwogCQkJcmV0dXJuOwogCQl9CkBAIC05Niw4ICs5NSw2IEBACiBzdGF0aWMKIGludCBrc193bGFuX2RvX3Bvd2VyX3NhdmUoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdikKIHsKLQlpbnQgcmMgPSAwOwotCiAJRFBSSU5USyg0LCAicHNzdGF0dXMuc3RhdHVzPSVkXG4iLCBhdG9taWNfcmVhZCgmcHJpdi0+cHNzdGF0dXMuc3RhdHVzKSk7CiAKIAlpZiAoKHByaXYtPmNvbm5lY3Rfc3RhdHVzICYgQ09OTkVDVF9TVEFUVVNfTUFTSykgPT0gQ09OTkVDVF9TVEFUVVMpIHsKQEAgLTEwNSw3ICsxMDIsNyBAQAogCX0gZWxzZSB7CiAJCXByaXYtPmRldl9zdGF0ZSA9IERFVklDRV9TVEFURV9SRUFEWTsKIAl9Ci0JcmV0dXJuIHJjOworCXJldHVybiAwOwogfQogCiBzdGF0aWMKQEAgLTIxNyw3ICsyMTQsNiBAQAogewogCXVuc2lnbmVkIGNoYXIgKmJwOwogCWludCBic2l6ZSwgb2Zmc2V0OwotCWludCByYyA9IDA7CiAKIAlEUFJJTlRLKDMsICJcbiIpOwogCW1lbXNldChhcCwgMCwgc2l6ZW9mKHN0cnVjdCBsb2NhbF9hcF90KSk7CkBAIC0yNDAsMTMgKzIzNiwxMyBAQAogCW9mZnNldCA9IDA7CiAKIAl3aGlsZSAoYnNpemUgPiBvZmZzZXQpIHsKLQkJLyogRFBSSU5USyg0LCAiRWxlbWVudCBJRD0lZCBcbiIsKmJwKTsgKi8KKwkJLyogRFBSSU5USyg0LCAiRWxlbWVudCBJRD0lZFxuIiwqYnApOyAqLwogCQlzd2l0Y2ggKCpicCkgewogCQljYXNlIDA6CS8qIHNzaWQgKi8KIAkJCWlmICgqKGJwICsgMSkgPD0gU1NJRF9NQVhfU0laRSkgewogCQkJCWFwLT5zc2lkLnNpemUgPSAqKGJwICsgMSk7CiAJCQl9IGVsc2UgewotCQkJCURQUklOVEsoMSwgInNpemUgb3ZlciA6OiBzc2lkIHNpemU9JWQgXG4iLAorCQkJCURQUklOVEsoMSwgInNpemUgb3ZlciA6OiBzc2lkIHNpemU9JWRcbiIsCiAJCQkJCSooYnAgKyAxKSk7CiAJCQkJYXAtPnNzaWQuc2l6ZSA9IFNTSURfTUFYX1NJWkU7CiAJCQl9CkBAIC0yNjAsNyArMjU2LDcgQEAKIAkJCQkgICAgICAgYnAgKyAyLCAqKGJwICsgMSkpOwogCQkJCWFwLT5yYXRlX3NldC5zaXplICs9ICooYnAgKyAxKTsKIAkJCX0gZWxzZSB7Ci0JCQkJRFBSSU5USygxLCAic2l6ZSBvdmVyIDo6IHJhdGUgc2l6ZT0lZCBcbiIsCisJCQkJRFBSSU5USygxLCAic2l6ZSBvdmVyIDo6IHJhdGUgc2l6ZT0lZFxuIiwKIAkJCQkJKCooYnAgKyAxKSArIGFwLT5yYXRlX3NldC5zaXplKSk7CiAJCQkJbWVtY3B5KCYoYXAtPnJhdGVfc2V0LmJvZHlbYXAtPnJhdGVfc2V0LnNpemVdKSwKIAkJCQkgICAgICAgYnAgKyAyLApAQCAtMjc2LDcgKzI3Miw3IEBACiAJCQlpZiAoKihicCArIDEpIDw9IFJTTl9JRV9CT0RZX01BWCkgewogCQkJCWFwLT5yc25faWUuc2l6ZSA9ICooYnAgKyAxKTsKIAkJCX0gZWxzZSB7Ci0JCQkJRFBSSU5USygxLCAic2l6ZSBvdmVyIDo6IHJzbiBzaXplPSVkIFxuIiwKKwkJCQlEUFJJTlRLKDEsICJzaXplIG92ZXIgOjogcnNuIHNpemU9JWRcbiIsCiAJCQkJCSooYnAgKyAxKSk7CiAJCQkJYXAtPnJzbl9pZS5zaXplID0gUlNOX0lFX0JPRFlfTUFYOwogCQkJfQpAQCAtMjg5LDcgKzI4NSw3IEBACiAJCQkJCWFwLT53cGFfaWUuc2l6ZSA9ICooYnAgKyAxKTsKIAkJCQl9IGVsc2UgewogCQkJCQlEUFJJTlRLKDEsCi0JCQkJCQkic2l6ZSBvdmVyIDo6IHdwYSBzaXplPSVkIFxuIiwKKwkJCQkJCSJzaXplIG92ZXIgOjogd3BhIHNpemU9JWRcbiIsCiAJCQkJCQkqKGJwICsgMSkpOwogCQkJCQlhcC0+d3BhX2llLnNpemUgPSBSU05fSUVfQk9EWV9NQVg7CiAJCQkJfQpAQCAtMzA3LDcgKzMwMyw3IEBACiAJCWNhc2UgNDc6CS8qIFJlc2VydmUgSUQgNDcgQnJvYWRjb20gQVAgKi8KIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJRFBSSU5USyg0LCAidW5rbm93biBFbGVtZW50IElEPSVkIFxuIiwgKmJwKTsKKwkJCURQUklOVEsoNCwgInVua25vd24gRWxlbWVudCBJRD0lZFxuIiwgKmJwKTsKIAkJCWJyZWFrOwogCQl9CiAJCW9mZnNldCArPSAyOwkvKiBpZCAmIHNpemUgZmllbGQgKi8KQEAgLTMxNSw3ICszMTEsNyBAQAogCQlicCArPSAoKihicCArIDEpICsgMik7CS8qIHBvaW50ZXIgdXBkYXRlICovCiAJfQogCi0JcmV0dXJuIHJjOworCXJldHVybiAwOwogfQogCiBzdGF0aWMKQEAgLTQwNCw3ICs0MDAsNyBAQAogCQkJCQkgICAgSFogPj0gNjApIHsKIAkJCQkJCW1pY19mYWlsdXJlLT5mYWlsdXJlID0gMDsKIAkJCQkJfQotCQkJCQlEUFJJTlRLKDQsICJNSUMgRkFJTFVSRSBcbiIpOworCQkJCQlEUFJJTlRLKDQsICJNSUMgRkFJTFVSRVxuIik7CiAJCQkJCWlmIChtaWNfZmFpbHVyZS0+ZmFpbHVyZSA9PSAwKSB7CiAJCQkJCQltaWNfZmFpbHVyZS0+ZmFpbHVyZSA9IDE7CiAJCQkJCQltaWNfZmFpbHVyZS0+Y291bnRlciA9IDA7CkBAIC00ODEsOCArNDc3LDcgQEAKIAkJCW5ldGlmX3J4KHNrYik7CiAJCX0gZWxzZSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgICAgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwKLQkJCSAgICAgICBza2ItPmRldi0+bmFtZSk7CisJCQkgICAgICAgImtzX3dsYW46IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iKTsKIAkJCXByaXYtPm5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCX0KIAkJYnJlYWs7CkBAIC01MTcsOCArNTEyLDcgQEAKIAkJCW5ldGlmX3J4KHNrYik7CiAJCX0gZWxzZSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgICAgIiVzOiBNZW1vcnkgc3F1ZWV6ZSwgZHJvcHBpbmcgcGFja2V0LlxuIiwKLQkJCSAgICAgICBza2ItPmRldi0+bmFtZSk7CisJCQkgICAgICAgImtzX3dsYW46IE1lbW9yeSBzcXVlZXplLCBkcm9wcGluZyBwYWNrZXQuXG4iKTsKIAkJCXByaXYtPm5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCX0KIAkJYnJlYWs7CkBAIC03NzgsNyArNzcyLDcgQEAKIAl3cnF1LmRhdGEuZmxhZ3MgPSAwOwogCXdycXUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CiAJaWYgKChwcml2LT5jb25uZWN0X3N0YXR1cyAmIENPTk5FQ1RfU1RBVFVTX01BU0spID09IENPTk5FQ1RfU1RBVFVTKSB7Ci0JCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgJ1wwJywgRVRIX0FMRU4pOworCQlldGhfemVyb19hZGRyKHdycXUuYXBfYWRkci5zYV9kYXRhKTsKIAkJRFBSSU5USygzLCAiSVdFVkVOVDogZGlzY29ubmVjdFxuIik7CiAJCXdpcmVsZXNzX3NlbmRfZXZlbnQocHJpdi0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CiAJfQpAQCAtODM2LDcgKzgzMCw3IEBACiAJd3JxdTAuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CiAJaWYgKChwcml2LT5jb25uZWN0X3N0YXR1cyAmIENPTk5FQ1RfU1RBVFVTX01BU0spID09IERJU0NPTk5FQ1RfU1RBVFVTICYmCiAJICAgIChvbGRfc3RhdHVzICYgQ09OTkVDVF9TVEFUVVNfTUFTSykgPT0gQ09OTkVDVF9TVEFUVVMpIHsKLQkJbWVtc2V0KHdycXUwLmFwX2FkZHIuc2FfZGF0YSwgJ1wwJywgRVRIX0FMRU4pOworCQlldGhfemVyb19hZGRyKHdycXUwLmFwX2FkZHIuc2FfZGF0YSk7CiAJCURQUklOVEsoMywgIklXRVZFTlQ6IGRpc2Nvbm5lY3RcbiIpOwogCQlEUFJJTlRLKDMsICJkaXNjb25uZWN0IDo6IHNjYW5faW5kX2NvdW50PSVkXG4iLAogCQkJcHJpdi0+c2Nhbl9pbmRfY291bnQpOwpAQCAtOTA4LDcgKzkwMiw3IEBACiAJCWlmICgocHJpdi0+Y29ubmVjdF9zdGF0dXMgJiBDT05ORUNUX1NUQVRVU19NQVNLKSA9PQogCQkgICAgRElTQ09OTkVDVF9TVEFUVVMKIAkJICAgICYmIChvbGRfc3RhdHVzICYgQ09OTkVDVF9TVEFUVVNfTUFTSykgPT0gQ09OTkVDVF9TVEFUVVMpIHsKLQkJCW1lbXNldCh3cnF1MC5hcF9hZGRyLnNhX2RhdGEsICdcMCcsIEVUSF9BTEVOKTsKKwkJCWV0aF96ZXJvX2FkZHIod3JxdTAuYXBfYWRkci5zYV9kYXRhKTsKIAkJCURQUklOVEsoMywgIklXRVZFTlQ6IGRpc2Nvbm5lY3RcbiIpOwogCQkJcHJpbnRrKCJJV0VWRU5UOiBkaXNjb25uZWN0XG4iKTsKIAkJCURQUklOVEsoMywgImRpc2Nvbm5lY3QgOjogc2Nhbl9pbmRfY291bnQ9JWRcbiIsCkBAIC0xMTQ4LDcgKzExNDIsNyBAQAogCiAJcGFja2V0X2xlbiA9IHBhY2tldC0+bGVuOwogCWlmIChwYWNrZXRfbGVuID4gRVRIX0ZSQU1FX0xFTikgewotCQlEUFJJTlRLKDEsICJiYWQgbGVuZ3RoIHBhY2tldF9sZW49JWQgXG4iLCBwYWNrZXRfbGVuKTsKKwkJRFBSSU5USygxLCAiYmFkIGxlbmd0aCBwYWNrZXRfbGVuPSVkXG4iLCBwYWNrZXRfbGVuKTsKIAkJZGV2X2tmcmVlX3NrYihwYWNrZXQpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMTE3MiwxMSArMTE2NiwxMCBAQAogCX0KIAogCURQUklOVEsoNCwgInNrYl9idWZmIGxlbmd0aD0lZFxuIiwgcGFja2V0X2xlbik7Ci0JcHAgPSAoc3RydWN0IGhvc3RpZl9kYXRhX3JlcXVlc3RfdCAqKQotCSAgICBrbWFsbG9jKGhpZl9hbGlnbl9zaXplKHNpemVvZigqcHApICsgNiArIHBhY2tldF9sZW4gKyA4KSwKLQkJICAgIEtTX1dMQU5fTUVNX0ZMQUcpOworCXBwID0ga21hbGxvYyhoaWZfYWxpZ25fc2l6ZShzaXplb2YoKnBwKSArIDYgKyBwYWNrZXRfbGVuICsgOCksCisJCSAgICAgS1NfV0xBTl9NRU1fRkxBRyk7CiAKLQlpZiAocHAgPT0gTlVMTCkgeworCWlmICghcHApIHsKIAkJRFBSSU5USygzLCAiYWxsb2NhdGUgbWVtb3J5IGZhaWxlZC4uXG4iKTsKIAkJZGV2X2tmcmVlX3NrYihwYWNrZXQpOwogCQlyZXR1cm4gLTI7CkBAIC0xMTk0LDYgKzExODcsOCBAQAogCQlEUFJJTlRLKDEsICJldGhlcm5ldC0+aF9zb3VyY2U9JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlhcbiIsCiAJCQlldGgtPmhfc291cmNlWzBdLCBldGgtPmhfc291cmNlWzFdLCBldGgtPmhfc291cmNlWzJdLAogCQkJZXRoLT5oX3NvdXJjZVszXSwgZXRoLT5oX3NvdXJjZVs0XSwgZXRoLT5oX3NvdXJjZVs1XSk7CisJCWRldl9rZnJlZV9za2IocGFja2V0KTsKKwkJa2ZyZWUocHApOwogCQlyZXR1cm4gLTM7CiAJfQogCkBAIC0xMjMxLDcgKzEyMjYsNyBAQAogCWV0aF9oZHIgPSAoc3RydWN0IGV0aGVyX2hkciAqKSZwcC0+ZGF0YVswXTsKIAlldGhfcHJvdG8gPSBudG9ocyhldGhfaGRyLT5oX3Byb3RvKTsKIAotCS8qIGZvciBNSUMgRkFJTFVFUiBSRVBPUlQgY2hlY2sgKi8KKwkvKiBmb3IgTUlDIEZBSUxVUkUgUkVQT1JUIGNoZWNrICovCiAJaWYgKGV0aF9wcm90byA9PSBFVEhFUl9QUk9UT0NPTF9UWVBFX0VBUAogCSAgICAmJiBwcml2LT53cGEubWljX2ZhaWx1cmUuZmFpbHVyZSA+IDApIHsKIAkJYWExeF9oZHIgPSAoc3RydWN0IGllZWU4MDJfMXhfaGRyICopKGV0aF9oZHIgKyAxKTsKQEAgLTEyODQsNyArMTI3OSw3IEBACiAJCQkgICh2b2lkICopc2VuZF9wYWNrZXRfY29tcGxldGUsICh2b2lkICopcHJpdiwKIAkJCSAgKHZvaWQgKilwYWNrZXQpOwogCi0JLyogTUlDIEZBSUxVRVIgUkVQT1JUIGNoZWNrICovCisJLyogTUlDIEZBSUxVUkUgUkVQT1JUIGNoZWNrICovCiAJaWYgKGV0aF9wcm90byA9PSBFVEhFUl9QUk9UT0NPTF9UWVBFX0VBUAogCSAgICAmJiBwcml2LT53cGEubWljX2ZhaWx1cmUuZmFpbHVyZSA+IDApIHsKIAkJaWYgKGtleWluZm8gJiBXUEFfS0VZX0lORk9fRVJST1IKQEAgLTEzMTMsOSArMTMwOCw4IEBACiAJRFBSSU5USygzLCAiXG4iKTsKIAogCS8qIG1ha2UgcHJpbWl0aXZlICovCi0JcHAgPSAoc3RydWN0IGhvc3RpZl9taWJfZ2V0X3JlcXVlc3RfdCAqKQotCSAgICBrbWFsbG9jKGhpZl9hbGlnbl9zaXplKHNpemVvZigqcHApKSwgS1NfV0xBTl9NRU1fRkxBRyk7Ci0JaWYgKHBwID09IE5VTEwpIHsKKwlwcCA9IGttYWxsb2MoaGlmX2FsaWduX3NpemUoc2l6ZW9mKCpwcCkpLCBLU19XTEFOX01FTV9GTEFHKTsKKwlpZiAoIXBwKSB7CiAJCURQUklOVEsoMywgImFsbG9jYXRlIG1lbW9yeSBmYWlsZWQuLlxuIik7CiAJCXJldHVybjsKIAl9CkBAIC0xMzQ0LDkgKzEzMzgsOCBAQAogCX0KIAogCS8qIG1ha2UgcHJpbWl0aXZlICovCi0JcHAgPSAoc3RydWN0IGhvc3RpZl9taWJfc2V0X3JlcXVlc3RfdCAqKQotCSAgICBrbWFsbG9jKGhpZl9hbGlnbl9zaXplKHNpemVvZigqcHApICsgc2l6ZSksIEtTX1dMQU5fTUVNX0ZMQUcpOwotCWlmIChwcCA9PSBOVUxMKSB7CisJcHAgPSBrbWFsbG9jKGhpZl9hbGlnbl9zaXplKHNpemVvZigqcHApICsgc2l6ZSksIEtTX1dMQU5fTUVNX0ZMQUcpOworCWlmICghcHApIHsKIAkJRFBSSU5USygzLCAiYWxsb2NhdGUgbWVtb3J5IGZhaWxlZC4uXG4iKTsKIAkJcmV0dXJuOwogCX0KQEAgLTEzNzQsOSArMTM2Nyw4IEBACiAJRFBSSU5USygzLCAiXG4iKTsKIAogCS8qIG1ha2UgcHJpbWl0aXZlICovCi0JcHAgPSAoc3RydWN0IGhvc3RpZl9zdGFydF9yZXF1ZXN0X3QgKikKLQkgICAga21hbGxvYyhoaWZfYWxpZ25fc2l6ZShzaXplb2YoKnBwKSksIEtTX1dMQU5fTUVNX0ZMQUcpOwotCWlmIChwcCA9PSBOVUxMKSB7CisJcHAgPSBrbWFsbG9jKGhpZl9hbGlnbl9zaXplKHNpemVvZigqcHApKSwgS1NfV0xBTl9NRU1fRkxBRyk7CisJaWYgKCFwcCkgewogCQlEUFJJTlRLKDMsICJhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkLi5cbiIpOwogCQlyZXR1cm47CiAJfQpAQCAtMTQwMiw5ICsxMzk0LDggQEAKIAlEUFJJTlRLKDMsICJcbiIpOwogCiAJLyogbWFrZSBwcmltaXRpdmUgKi8KLQlwcCA9IChzdHJ1Y3QgaG9zdGlmX3BzX2FkaG9jX3NldF9yZXF1ZXN0X3QgKikKLQkgICAga21hbGxvYyhoaWZfYWxpZ25fc2l6ZShzaXplb2YoKnBwKSksIEtTX1dMQU5fTUVNX0ZMQUcpOwotCWlmIChwcCA9PSBOVUxMKSB7CisJcHAgPSBrbWFsbG9jKGhpZl9hbGlnbl9zaXplKHNpemVvZigqcHApKSwgS1NfV0xBTl9NRU1fRkxBRyk7CisJaWYgKCFwcCkgewogCQlEUFJJTlRLKDMsICJhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkLi5cbiIpOwogCQlyZXR1cm47CiAJfQpAQCAtMTQ0MywxMiArMTQzNCwxMSBAQAogCXN0cnVjdCBob3N0aWZfaW5mcmFzdHJ1Y3R1cmVfc2V0X3JlcXVlc3RfdCAqcHA7CiAJdWludDE2X3QgY2FwYWJpbGl0eTsKIAotCURQUklOVEsoMywgInNzaWQuc2l6ZT0lZCBcbiIsIHByaXYtPnJlZy5zc2lkLnNpemUpOworCURQUklOVEsoMywgInNzaWQuc2l6ZT0lZFxuIiwgcHJpdi0+cmVnLnNzaWQuc2l6ZSk7CiAKIAkvKiBtYWtlIHByaW1pdGl2ZSAqLwotCXBwID0gKHN0cnVjdCBob3N0aWZfaW5mcmFzdHJ1Y3R1cmVfc2V0X3JlcXVlc3RfdCAqKQotCSAgICBrbWFsbG9jKGhpZl9hbGlnbl9zaXplKHNpemVvZigqcHApKSwgS1NfV0xBTl9NRU1fRkxBRyk7Ci0JaWYgKHBwID09IE5VTEwpIHsKKwlwcCA9IGttYWxsb2MoaGlmX2FsaWduX3NpemUoc2l6ZW9mKCpwcCkpLCBLU19XTEFOX01FTV9GTEFHKTsKKwlpZiAoIXBwKSB7CiAJCURQUklOVEsoMywgImFsbG9jYXRlIG1lbW9yeSBmYWlsZWQuLlxuIik7CiAJCXJldHVybjsKIAl9CkBAIC0xNTA1LDE3ICsxNDk1LDE2IEBACiAJa3Nfd2xhbl9od190eChwcml2LCBwcCwgaGlmX2FsaWduX3NpemUoc2l6ZW9mKCpwcCkpLCBOVUxMLCBOVUxMLCBOVUxMKTsKIH0KIAotdm9pZCBob3N0aWZfaW5mcmFzdHJ1Y3R1cmVfc2V0Ml9yZXF1ZXN0KHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYpCitzdGF0aWMgdm9pZCBob3N0aWZfaW5mcmFzdHJ1Y3R1cmVfc2V0Ml9yZXF1ZXN0KHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYpCiB7CiAJc3RydWN0IGhvc3RpZl9pbmZyYXN0cnVjdHVyZV9zZXQyX3JlcXVlc3RfdCAqcHA7CiAJdWludDE2X3QgY2FwYWJpbGl0eTsKIAotCURQUklOVEsoMiwgInNzaWQuc2l6ZT0lZCBcbiIsIHByaXYtPnJlZy5zc2lkLnNpemUpOworCURQUklOVEsoMiwgInNzaWQuc2l6ZT0lZFxuIiwgcHJpdi0+cmVnLnNzaWQuc2l6ZSk7CiAKIAkvKiBtYWtlIHByaW1pdGl2ZSAqLwotCXBwID0gKHN0cnVjdCBob3N0aWZfaW5mcmFzdHJ1Y3R1cmVfc2V0Ml9yZXF1ZXN0X3QgKikKLQkgICAga21hbGxvYyhoaWZfYWxpZ25fc2l6ZShzaXplb2YoKnBwKSksIEtTX1dMQU5fTUVNX0ZMQUcpOwotCWlmIChwcCA9PSBOVUxMKSB7CisJcHAgPSBrbWFsbG9jKGhpZl9hbGlnbl9zaXplKHNpemVvZigqcHApKSwgS1NfV0xBTl9NRU1fRkxBRyk7CisJaWYgKCFwcCkgewogCQlEUFJJTlRLKDMsICJhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkLi5cbiIpOwogCQlyZXR1cm47CiAJfQpAQCAtMTU4Myw5ICsxNTcyLDggQEAKIAlEUFJJTlRLKDMsICJcbiIpOwogCiAJLyogbWFrZSBwcmltaXRpdmUgKi8KLQlwcCA9IChzdHJ1Y3QgaG9zdGlmX2FkaG9jX3NldF9yZXF1ZXN0X3QgKikKLQkgICAga21hbGxvYyhoaWZfYWxpZ25fc2l6ZShzaXplb2YoKnBwKSksIEtTX1dMQU5fTUVNX0ZMQUcpOwotCWlmIChwcCA9PSBOVUxMKSB7CisJcHAgPSBrbWFsbG9jKGhpZl9hbGlnbl9zaXplKHNpemVvZigqcHApKSwgS1NfV0xBTl9NRU1fRkxBRyk7CisJaWYgKCFwcCkgewogCQlEUFJJTlRLKDMsICJhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkLi5cbiIpOwogCQlyZXR1cm47CiAJfQpAQCAtMTYyOSw5ICsxNjE3LDggQEAKIAlEUFJJTlRLKDMsICJcbiIpOwogCiAJLyogbWFrZSBwcmltaXRpdmUgKi8KLQlwcCA9IChzdHJ1Y3QgaG9zdGlmX2FkaG9jX3NldDJfcmVxdWVzdF90ICopCi0JICAgIGttYWxsb2MoaGlmX2FsaWduX3NpemUoc2l6ZW9mKCpwcCkpLCBLU19XTEFOX01FTV9GTEFHKTsKLQlpZiAocHAgPT0gTlVMTCkgeworCXBwID0ga21hbGxvYyhoaWZfYWxpZ25fc2l6ZShzaXplb2YoKnBwKSksIEtTX1dMQU5fTUVNX0ZMQUcpOworCWlmICghcHApIHsKIAkJRFBSSU5USygzLCAiYWxsb2NhdGUgbWVtb3J5IGZhaWxlZC4uXG4iKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE2NzcsOSArMTY2NCw4IEBACiAJRFBSSU5USygzLCAiXG4iKTsKIAogCS8qIG1ha2UgcHJpbWl0aXZlICovCi0JcHAgPSAoc3RydWN0IGhvc3RpZl9zdG9wX3JlcXVlc3RfdCAqKQotCSAgICBrbWFsbG9jKGhpZl9hbGlnbl9zaXplKHNpemVvZigqcHApKSwgS1NfV0xBTl9NRU1fRkxBRyk7Ci0JaWYgKHBwID09IE5VTEwpIHsKKwlwcCA9IGttYWxsb2MoaGlmX2FsaWduX3NpemUoc2l6ZW9mKCpwcCkpLCBLU19XTEFOX01FTV9GTEFHKTsKKwlpZiAoIXBwKSB7CiAJCURQUklOVEsoMywgImFsbG9jYXRlIG1lbW9yeSBmYWlsZWQuLlxuIik7CiAJCXJldHVybjsKIAl9CkBAIC0xNzAwLDkgKzE2ODYsOCBAQAogCURQUklOVEsoMywgIlxuIik7CiAKIAkvKiBtYWtlIHByaW1pdGl2ZSAqLwotCXBwID0gKHN0cnVjdCBob3N0aWZfcGh5X2luZm9ybWF0aW9uX3JlcXVlc3RfdCAqKQotCSAgICBrbWFsbG9jKGhpZl9hbGlnbl9zaXplKHNpemVvZigqcHApKSwgS1NfV0xBTl9NRU1fRkxBRyk7Ci0JaWYgKHBwID09IE5VTEwpIHsKKwlwcCA9IGttYWxsb2MoaGlmX2FsaWduX3NpemUoc2l6ZW9mKCpwcCkpLCBLU19XTEFOX01FTV9GTEFHKTsKKwlpZiAoIXBwKSB7CiAJCURQUklOVEsoMywgImFsbG9jYXRlIG1lbW9yeSBmYWlsZWQuLlxuIik7CiAJCXJldHVybjsKIAl9CkBAIC0xNzMyLDkgKzE3MTcsOCBAQAogCURQUklOVEsoMywgIm1vZGU9JWx1IHdha2VfdXA9JWx1IHJlY2VpdmVEVElNcz0lbHVcbiIsIG1vZGUsIHdha2VfdXAsCiAJCXJlY2VpdmVEVElNcyk7CiAJLyogbWFrZSBwcmltaXRpdmUgKi8KLQlwcCA9IChzdHJ1Y3QgaG9zdGlmX3Bvd2VyX21uZ210X3JlcXVlc3RfdCAqKQotCSAgICBrbWFsbG9jKGhpZl9hbGlnbl9zaXplKHNpemVvZigqcHApKSwgS1NfV0xBTl9NRU1fRkxBRyk7Ci0JaWYgKHBwID09IE5VTEwpIHsKKwlwcCA9IGttYWxsb2MoaGlmX2FsaWduX3NpemUoc2l6ZW9mKCpwcCkpLCBLU19XTEFOX01FTV9GTEFHKTsKKwlpZiAoIXBwKSB7CiAJCURQUklOVEsoMywgImFsbG9jYXRlIG1lbW9yeSBmYWlsZWQuLlxuIik7CiAJCXJldHVybjsKIAl9CkBAIC0xNzU1LDEzICsxNzM5LDEyIEBACiB7CiAJc3RydWN0IGhvc3RpZl9zbGVlcF9yZXF1ZXN0X3QgKnBwOwogCi0JRFBSSU5USygzLCAibW9kZT0lbHUgXG4iLCBtb2RlKTsKKwlEUFJJTlRLKDMsICJtb2RlPSVsdVxuIiwgbW9kZSk7CiAKIAlpZiAobW9kZSA9PSBTTFBfU0xFRVApIHsKIAkJLyogbWFrZSBwcmltaXRpdmUgKi8KLQkJcHAgPSAoc3RydWN0IGhvc3RpZl9zbGVlcF9yZXF1ZXN0X3QgKikKLQkJICAgIGttYWxsb2MoaGlmX2FsaWduX3NpemUoc2l6ZW9mKCpwcCkpLCBLU19XTEFOX01FTV9GTEFHKTsKLQkJaWYgKHBwID09IE5VTEwpIHsKKwkJcHAgPSBrbWFsbG9jKGhpZl9hbGlnbl9zaXplKHNpemVvZigqcHApKSwgS1NfV0xBTl9NRU1fRkxBRyk7CisJCWlmICghcHApIHsKIAkJCURQUklOVEsoMywgImFsbG9jYXRlIG1lbW9yeSBmYWlsZWQuLlxuIik7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTE3NzksMjMgKzE3NjIsMjIgQEAKIAkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPmtzX3dsYW5faHcua3M3MDEwc2Rpb193cSwKIAkJCQkgICAmcHJpdi0+a3Nfd2xhbl9ody5yd193cSwgMSk7CiAJfSBlbHNlIHsKLQkJRFBSSU5USygzLCAiaW52YWxpZCBtb2RlICVsZCBcbiIsIG1vZGUpOworCQlEUFJJTlRLKDMsICJpbnZhbGlkIG1vZGUgJWxkXG4iLCBtb2RlKTsKIAkJcmV0dXJuOwogCX0KIH0KIAogc3RhdGljCiB2b2lkIGhvc3RpZl9ic3Nfc2Nhbl9yZXF1ZXN0KHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYsCi0JCQkgICAgIHVuc2lnbmVkIGxvbmcgc2Nhbl90eXBlLCB1aW50OF90ICogc2Nhbl9zc2lkLAorCQkJICAgICB1bnNpZ25lZCBsb25nIHNjYW5fdHlwZSwgdWludDhfdCAqc2Nhbl9zc2lkLAogCQkJICAgICB1aW50OF90IHNjYW5fc3NpZF9sZW4pCiB7CiAJc3RydWN0IGhvc3RpZl9ic3Nfc2Nhbl9yZXF1ZXN0X3QgKnBwOwogCiAJRFBSSU5USygyLCAiXG4iKTsKIAkvKiBtYWtlIHByaW1pdGl2ZSAqLwotCXBwID0gKHN0cnVjdCBob3N0aWZfYnNzX3NjYW5fcmVxdWVzdF90ICopCi0JICAgIGttYWxsb2MoaGlmX2FsaWduX3NpemUoc2l6ZW9mKCpwcCkpLCBLU19XTEFOX01FTV9GTEFHKTsKLQlpZiAocHAgPT0gTlVMTCkgeworCXBwID0ga21hbGxvYyhoaWZfYWxpZ25fc2l6ZShzaXplb2YoKnBwKSksIEtTX1dMQU5fTUVNX0ZMQUcpOworCWlmICghcHApIHsKIAkJRFBSSU5USygzLCAiYWxsb2NhdGUgbWVtb3J5IGZhaWxlZC4uXG4iKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE4NTAsOSArMTgzMiw4IEBACiAKIAlEUFJJTlRLKDMsICJjb3VudD0lZCA6OiB0aW1lcj0lZFxuIiwgZmFpbHVyZV9jb3VudCwgdGltZXIpOwogCS8qIG1ha2UgcHJpbWl0aXZlICovCi0JcHAgPSAoc3RydWN0IGhvc3RpZl9taWNfZmFpbHVyZV9yZXF1ZXN0X3QgKikKLQkgICAga21hbGxvYyhoaWZfYWxpZ25fc2l6ZShzaXplb2YoKnBwKSksIEtTX1dMQU5fTUVNX0ZMQUcpOwotCWlmIChwcCA9PSBOVUxMKSB7CisJcHAgPSBrbWFsbG9jKGhpZl9hbGlnbl9zaXplKHNpemVvZigqcHApKSwgS1NfV0xBTl9NRU1fRkxBRyk7CisJaWYgKCFwcCkgewogCQlEUFJJTlRLKDMsICJhbGxvY2F0ZSBtZW1vcnkgZmFpbGVkLi5cbiIpOwogCQlyZXR1cm47CiAJfQpAQCAtMTg2Nyw3ICsxODQ4LDcgQEAKIAlrc193bGFuX2h3X3R4KHByaXYsIHBwLCBoaWZfYWxpZ25fc2l6ZShzaXplb2YoKnBwKSksIE5VTEwsIE5VTEwsIE5VTEwpOwogfQogCi0vKiBEZXZpY2UgSS9PIFJlY2lldmUgaW5kaWNhdGUgKi8KKy8qIERldmljZSBJL08gUmVjZWl2ZSBpbmRpY2F0ZSAqLwogc3RhdGljIHZvaWQgZGV2aW9fcmVjX2luZChzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2LCB1bnNpZ25lZCBjaGFyICpwLAogCQkJICB1bnNpZ25lZCBpbnQgc2l6ZSkKIHsKQEAgLTI3MDAsNyArMjY4MSw2IEBACiAKIGludCBob3N0aWZfaW5pdChzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2KQogewotCWludCByYyA9IDA7CiAJaW50IGk7CiAKIAlEUFJJTlRLKDMsICJcbiIpOwpAQCAtMjc1MCw3ICsyNzMwLDcgQEAKIAogCXRhc2tsZXRfaW5pdCgmcHJpdi0+c21lX3Rhc2ssIGhvc3RpZl9zbWVfdGFzaywgKHVuc2lnbmVkIGxvbmcpcHJpdik7CiAKLQlyZXR1cm4gcmM7CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgaG9zdGlmX2V4aXQoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9rczcwMTAva3NfaG9zdGlmLmggYi9kcml2ZXJzL3N0YWdpbmcva3M3MDEwL2tzX2hvc3RpZi5oCmluZGV4IGRjODA2YjViLi43NDNmMzFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva3M3MDEwL2tzX2hvc3RpZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9rczcwMTAva3NfaG9zdGlmLmgKQEAgLTExLDYgKzExLDkgQEAKIAogI2lmbmRlZiBfS1NfSE9TVElGX0hfCiAjZGVmaW5lIF9LU19IT1NUSUZfSF8KKworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisKIC8qCiAgKiBIT1NULU1BQyBJL0YgZXZlbnRzCiAgKi8KQEAgLTYxLDcgKzY0LDcgQEAKIHN0cnVjdCBob3N0aWZfaGRyIHsKIAl1aW50MTZfdCBzaXplOwogCXVpbnQxNl90IGV2ZW50OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaG9zdGlmX2RhdGFfcmVxdWVzdF90IHsKIAlzdHJ1Y3QgaG9zdGlmX2hkciBoZWFkZXI7CkBAIC03MCw3ICs3Myw3IEBACiAjZGVmaW5lIFRZUEVfQVVUSCAweDAwMDEKIAl1aW50MTZfdCByZXNlcnZlZDsKIAl1aW50OF90IGRhdGFbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBob3N0aWZfZGF0YV9pbmRpY2F0aW9uX3QgewogCXN0cnVjdCBob3N0aWZfaGRyIGhlYWRlcjsKQEAgLTgxLDE0ICs4NCwxNCBAQAogI2RlZmluZSBUWVBFX0dNSzIgMHgwMDAzCiAJdWludDE2X3QgcmVzZXJ2ZWQ7CiAJdWludDhfdCBkYXRhWzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIENIQU5ORUxfTElTVF9NQVhfU0laRSAxNAogc3RydWN0IGNoYW5uZWxfbGlzdF90IHsKIAl1aW50OF90IHNpemU7CiAJdWludDhfdCBib2R5W0NIQU5ORUxfTElTVF9NQVhfU0laRV07CiAJdWludDhfdCBwYWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIE1JQiBBdHRyaWJ1dGUgKi8KICNkZWZpbmUgRE9UMTFfTUFDX0FERFJFU1MgICAgICAgICAgICAgICAgIDB4MjEwMTAxMDAJLyogTUFDIEFkZHJlc3MgKFIpICovCkBAIC0xNDEsNyArMTQ0LDcgQEAKIHN0cnVjdCBob3N0aWZfbWliX2dldF9yZXF1ZXN0X3QgewogCXN0cnVjdCBob3N0aWZfaGRyIGhlYWRlcjsKIAl1aW50MzJfdCBtaWJfYXR0cmlidXRlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaG9zdGlmX21pYl92YWx1ZV90IHsKIAl1aW50MTZfdCBzaXplOwpAQCAtMTUyLDcgKzE1NSw3IEBACiAjZGVmaW5lIE1JQl9WQUxVRV9UWVBFX0NPVU5UMzIgIDMKICNkZWZpbmUgTUlCX1ZBTFVFX1RZUEVfT1NUUklORyAgNAogCXVpbnQ4X3QgYm9keVswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGhvc3RpZl9taWJfZ2V0X2NvbmZpcm1fdCB7CiAJc3RydWN0IGhvc3RpZl9oZHIgaGVhZGVyOwpAQCAtMTYzLDE5ICsxNjYsMTkgQEAKICNkZWZpbmUgTUlCX1dSSVRFX09OTFkgMwogCXVpbnQzMl90IG1pYl9hdHRyaWJ1dGU7CiAJc3RydWN0IGhvc3RpZl9taWJfdmFsdWVfdCBtaWJfdmFsdWU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBob3N0aWZfbWliX3NldF9yZXF1ZXN0X3QgewogCXN0cnVjdCBob3N0aWZfaGRyIGhlYWRlcjsKIAl1aW50MzJfdCBtaWJfYXR0cmlidXRlOwogCXN0cnVjdCBob3N0aWZfbWliX3ZhbHVlX3QgbWliX3ZhbHVlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaG9zdGlmX21pYl9zZXRfY29uZmlybV90IHsKIAlzdHJ1Y3QgaG9zdGlmX2hkciBoZWFkZXI7CiAJdWludDMyX3QgbWliX3N0YXR1czsKIAl1aW50MzJfdCBtaWJfYXR0cmlidXRlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaG9zdGlmX3Bvd2VyX21uZ210X3JlcXVlc3RfdCB7CiAJc3RydWN0IGhvc3RpZl9oZHIgaGVhZGVyOwpAQCAtMTg4LDcgKzE5MSw3IEBACiAJdWludDMyX3QgcmVjZWl2ZURUSU1zOwogI2RlZmluZSBEVElNX0ZBTFNFIDAKICNkZWZpbmUgRFRJTV9UUlVFICAxCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIC8qIHBvd2VyIG1hbmFnZW1lbnQgbW9kZSAqLwogZW51bSB7CkBAIC0yMDYsNyArMjA5LDcgQEAKIHN0cnVjdCBob3N0aWZfcG93ZXJfbW5nbXRfY29uZmlybV90IHsKIAlzdHJ1Y3QgaG9zdGlmX2hkciBoZWFkZXI7CiAJdWludDE2X3QgcmVzdWx0X2NvZGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBob3N0aWZfc3RhcnRfcmVxdWVzdF90IHsKIAlzdHJ1Y3QgaG9zdGlmX2hkciBoZWFkZXI7CkBAIC0yMTUsNjQgKzIxOCw2NCBAQAogI2RlZmluZSBNT0RFX0lORlJBU1RSVUNUVVJFIDEKICNkZWZpbmUgTU9ERV9BUCAgICAgICAgICAgICAyCS8qIG5vdCB1c2VkICovCiAjZGVmaW5lIE1PREVfQURIT0MgICAgICAgICAgMwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaG9zdGlmX3N0YXJ0X2NvbmZpcm1fdCB7CiAJc3RydWN0IGhvc3RpZl9oZHIgaGVhZGVyOwogCXVpbnQxNl90IHJlc3VsdF9jb2RlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIFNTSURfTUFYX1NJWkUgMzIKIHN0cnVjdCBzc2lkX3QgewogCXVpbnQ4X3Qgc2l6ZTsKIAl1aW50OF90IGJvZHlbU1NJRF9NQVhfU0laRV07CiAJdWludDhfdCBzc2lkX3BhZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBSQVRFX1NFVF9NQVhfU0laRSAxNgogc3RydWN0IHJhdGVfc2V0OF90IHsKIAl1aW50OF90IHNpemU7CiAJdWludDhfdCBib2R5WzhdOwogCXVpbnQ4X3QgcmF0ZV9wYWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBGaFBhcm1zX3QgewogCXVpbnQxNl90IGR3ZWxsVGltZTsKIAl1aW50OF90IGhvcFNldDsKIAl1aW50OF90IGhvcFBhdHRlcm47CiAJdWludDhfdCBob3BJbmRleDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IERzUGFybXNfdCB7CiAJdWludDhfdCBjaGFubmVsOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgQ2ZQYXJtc190IHsKIAl1aW50OF90IGNvdW50OwogCXVpbnQ4X3QgcGVyaW9kOwogCXVpbnQxNl90IG1heER1cmF0aW9uOwogCXVpbnQxNl90IGR1clJlbWFpbmluZzsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IElic3NQYXJtc190IHsKIAl1aW50MTZfdCBhdGltV2luZG93OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgcnNuX3QgewogCXVpbnQ4X3Qgc2l6ZTsKICNkZWZpbmUgUlNOX0JPRFlfU0laRSA2NAogCXVpbnQ4X3QgYm9keVtSU05fQk9EWV9TSVpFXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IEVycFBhcmFtc190IHsKIAl1aW50OF90IGVycF9pbmZvOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgcmF0ZV9zZXQxNl90IHsKIAl1aW50OF90IHNpemU7CiAJdWludDhfdCBib2R5WzE2XTsKIAl1aW50OF90IHJhdGVfcGFkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgYXBfaW5mb190IHsKIAl1aW50OF90IGJzc2lkWzZdOwkvKiArMDAgKi8KQEAgLTI5OSw3ICszMDIsNyBAQAogCXVpbnQxNl90IGJvZHlfc2l6ZTsJLyogKzE2ICovCiAJdWludDhfdCBib2R5WzEwMjRdOwkvKiArMTggKi8KIAkvKiArMTAzMiAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbGlua19hcF9pbmZvX3QgewogCXVpbnQ4X3QgYnNzaWRbNl07CS8qICswMCAqLwpAQCAtMzI1LDggKzMyOCw4IEBACiAJc3RydWN0IHsKIAkJdWludDhfdCBzaXplOwkvKiArNTIgKi8KIAkJdWludDhfdCBib2R5WzEyOF07CS8qICs1MyAqLwotCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHJzbjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCX0gX19wYWNrZWQgcnNuOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGhvc3RpZl9jb25uZWN0X2luZGljYXRpb25fdCB7CiAJc3RydWN0IGhvc3RpZl9oZHIgaGVhZGVyOwpAQCAtMzM0LDE2ICszMzcsMTYgQEAKICNkZWZpbmUgUkVTVUxUX0NPTk5FQ1QgICAgMAogI2RlZmluZSBSRVNVTFRfRElTQ09OTkVDVCAxCiAJc3RydWN0IGxpbmtfYXBfaW5mb190IGxpbmtfYXBfaW5mbzsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGhvc3RpZl9zdG9wX3JlcXVlc3RfdCB7CiAJc3RydWN0IGhvc3RpZl9oZHIgaGVhZGVyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaG9zdGlmX3N0b3BfY29uZmlybV90IHsKIAlzdHJ1Y3QgaG9zdGlmX2hkciBoZWFkZXI7CiAJdWludDE2X3QgcmVzdWx0X2NvZGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBob3N0aWZfcHNfYWRob2Nfc2V0X3JlcXVlc3RfdCB7CiAJc3RydWN0IGhvc3RpZl9oZHIgaGVhZGVyOwpAQCAtMzYwLDEyICszNjMsMTIgQEAKIAl1aW50MTZfdCBjYXBhYmlsaXR5OwkvKiBiaXQ1OnByZWFtYmxlIGJpdDY6cGJjYyBwYmNjIG5vdCBzdXBwb3J0ZWQgYWx3YXlzIDAgCiAJCQkJICogYml0MTA6U2hvcnRTbG90VGltZSBiaXQxMzpEU1NTLU9GRE0gRFNTUy1PRkRNIG5vdCBzdXBwb3J0ZWQgYWx3YXlzIDAgKi8KIAl1aW50MTZfdCBzY2FuX3R5cGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBob3N0aWZfcHNfYWRob2Nfc2V0X2NvbmZpcm1fdCB7CiAJc3RydWN0IGhvc3RpZl9oZHIgaGVhZGVyOwogCXVpbnQxNl90IHJlc3VsdF9jb2RlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaG9zdGlmX2luZnJhc3RydWN0dXJlX3NldF9yZXF1ZXN0X3QgewogCXN0cnVjdCBob3N0aWZfaGRyIGhlYWRlcjsKQEAgLTM4MSw3ICszODQsNyBAQAogI2RlZmluZSBBVVRIX1RZUEVfU0hBUkVEX0tFWSAgMQogCXN0cnVjdCBjaGFubmVsX2xpc3RfdCBjaGFubmVsX2xpc3Q7CiAJdWludDE2X3Qgc2Nhbl90eXBlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaG9zdGlmX2luZnJhc3RydWN0dXJlX3NldDJfcmVxdWVzdF90IHsKIAlzdHJ1Y3QgaG9zdGlmX2hkciBoZWFkZXI7CkBAIC0zOTgsMTIgKzQwMSwxMiBAQAogCXN0cnVjdCBjaGFubmVsX2xpc3RfdCBjaGFubmVsX2xpc3Q7CiAJdWludDE2X3Qgc2Nhbl90eXBlOwogCXVpbnQ4X3QgYnNzaWRbRVRIX0FMRU5dOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaG9zdGlmX2luZnJhc3RydWN0dXJlX3NldF9jb25maXJtX3QgewogCXN0cnVjdCBob3N0aWZfaGRyIGhlYWRlcjsKIAl1aW50MTZfdCByZXN1bHRfY29kZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGhvc3RpZl9hZGhvY19zZXRfcmVxdWVzdF90IHsKIAlzdHJ1Y3QgaG9zdGlmX2hkciBoZWFkZXI7CkBAIC00MTUsNyArNDE4LDcgQEAKIAl1aW50MTZfdCBjYXBhYmlsaXR5OwkvKiBiaXQ1OnByZWFtYmxlIGJpdDY6cGJjYyBwYmNjIG5vdCBzdXBwb3J0ZWQgYWx3YXlzIDAgCiAJCQkJICogYml0MTA6U2hvcnRTbG90VGltZSBiaXQxMzpEU1NTLU9GRE0gRFNTUy1PRkRNIG5vdCBzdXBwb3J0ZWQgYWx3YXlzIDAgKi8KIAl1aW50MTZfdCBzY2FuX3R5cGU7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBob3N0aWZfYWRob2Nfc2V0Ml9yZXF1ZXN0X3QgewogCXN0cnVjdCBob3N0aWZfaGRyIGhlYWRlcjsKQEAgLTQyOSwxNyArNDMyLDE3IEBACiAJdWludDE2X3Qgc2Nhbl90eXBlOwogCXN0cnVjdCBjaGFubmVsX2xpc3RfdCBjaGFubmVsX2xpc3Q7CiAJdWludDhfdCBic3NpZFtFVEhfQUxFTl07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBob3N0aWZfYWRob2Nfc2V0X2NvbmZpcm1fdCB7CiAJc3RydWN0IGhvc3RpZl9oZHIgaGVhZGVyOwogCXVpbnQxNl90IHJlc3VsdF9jb2RlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbGFzdF9hc3NvY2lhdGVfdCB7CiAJdWludDhfdCB0eXBlOwogCXVpbnQ4X3Qgc3RhdHVzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgYXNzb2NpYXRpb25fcmVxdWVzdF90IHsKIAl1aW50OF90IHR5cGU7CkBAIC00NTAsNyArNDUzLDcgQEAKIAl1aW50MTZfdCBsaXN0ZW5faW50ZXJ2YWw7CiAJdWludDhfdCBhcF9hZGRyZXNzWzZdOwogCXVpbnQxNl90IHJlcUlFc19zaXplOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgYXNzb2NpYXRpb25fcmVzcG9uc2VfdCB7CiAJdWludDhfdCB0eXBlOwpAQCAtNDYxLDcgKzQ2NCw3IEBACiAJdWludDE2X3Qgc3RhdHVzOwogCXVpbnQxNl90IGFzc29jaWF0aW9uX2lkOwogCXVpbnQxNl90IHJlc3BJRXNfc2l6ZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGhvc3RpZl9hc3NvY2lhdGVfaW5kaWNhdGlvbl90IHsKIAlzdHJ1Y3QgaG9zdGlmX2hkciBoZWFkZXI7CkBAIC00NjksNyArNDcyLDcgQEAKIAlzdHJ1Y3QgYXNzb2NpYXRpb25fcmVzcG9uc2VfdCBhc3NvY19yZXNwOwogCS8qIGZvbGxvd2VkIGJ5IChyZXFJRXNfc2l6ZSArIHJlc3BJRXNfc2l6ZSkgb2N0ZXRzIG9mIGRhdGEgKi8KIAkvKiByZXFJRXMgZGF0YSAqLy8qIHJlc3BJRXMgZGF0YSAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaG9zdGlmX2Jzc19zY2FuX3JlcXVlc3RfdCB7CiAJc3RydWN0IGhvc3RpZl9oZHIgaGVhZGVyOwpAQCAtNDgxLDEzICs0ODQsMTMgQEAKIAl1aW50MzJfdCBjaF90aW1lX21heDsKIAlzdHJ1Y3QgY2hhbm5lbF9saXN0X3QgY2hhbm5lbF9saXN0OwogCXN0cnVjdCBzc2lkX3Qgc3NpZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGhvc3RpZl9ic3Nfc2Nhbl9jb25maXJtX3QgewogCXN0cnVjdCBob3N0aWZfaGRyIGhlYWRlcjsKIAl1aW50MTZfdCByZXN1bHRfY29kZTsKIAl1aW50MTZfdCByZXNlcnZlZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGhvc3RpZl9waHlfaW5mb3JtYXRpb25fcmVxdWVzdF90IHsKIAlzdHJ1Y3QgaG9zdGlmX2hkciBoZWFkZXI7CkBAIC00OTUsNyArNDk4LDcgQEAKICNkZWZpbmUgTk9STUFMX1RZUEUJMAogI2RlZmluZSBUSU1FX1RZUEUJMQogCXVpbnQxNl90IHRpbWU7CS8qIHVuaXQgMTAwbXMgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGhvc3RpZl9waHlfaW5mb3JtYXRpb25fY29uZmlybV90IHsKIAlzdHJ1Y3QgaG9zdGlmX2hkciBoZWFkZXI7CkBAIC01MDcsMzAgKzUxMCwzMCBAQAogCXVpbnQzMl90IHJ4X2ZyYW1lOwogCXVpbnQzMl90IHR4X2Vycm9yOwogCXVpbnQzMl90IHJ4X2Vycm9yOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBzbGVlcCBtb2RlICovCiAjZGVmaW5lIFNMUF9BQ1RJVkUgIDAKICNkZWZpbmUgU0xQX1NMRUVQICAgMQogc3RydWN0IGhvc3RpZl9zbGVlcF9yZXF1ZXN0X3QgewogCXN0cnVjdCBob3N0aWZfaGRyIGhlYWRlcjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGhvc3RpZl9zbGVlcF9jb25maXJtX3QgewogCXN0cnVjdCBob3N0aWZfaGRyIGhlYWRlcjsKIAl1aW50MTZfdCByZXN1bHRfY29kZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGhvc3RpZl9taWNfZmFpbHVyZV9yZXF1ZXN0X3QgewogCXN0cnVjdCBob3N0aWZfaGRyIGhlYWRlcjsKIAl1aW50MTZfdCBmYWlsdXJlX2NvdW50OwogCXVpbnQxNl90IHRpbWVyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaG9zdGlmX21pY19mYWlsdXJlX2NvbmZpcm1fdCB7CiAJc3RydWN0IGhvc3RpZl9oZHIgaGVhZGVyOwogCXVpbnQxNl90IHJlc3VsdF9jb2RlOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEJBU0lDX1JBVEUJMHg4MAogI2RlZmluZSBSQVRFX01BU0sJMHg3RgpAQCAtNjE2LDEzICs2MTksMjEgQEAKICNpbmNsdWRlICJrc193bGFuLmgiCiAKIC8qIGZ1bmN0aW9uIHByb3RvdHlwZSAqLwotZXh0ZXJuIGludCBob3N0aWZfZGF0YV9yZXF1ZXN0KHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYsCi0JCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnBhY2tldCk7Ci1leHRlcm4gdm9pZCBob3N0aWZfcmVjZWl2ZShzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2LCB1bnNpZ25lZCBjaGFyICpwLAotCQkJICAgdW5zaWduZWQgaW50IHNpemUpOwotZXh0ZXJuIHZvaWQgaG9zdGlmX3NtZV9lbnF1ZXVlKHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYsIHVpbnQxNl90IGV2ZW50KTsKLWV4dGVybiBpbnQgaG9zdGlmX2luaXQoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdik7Ci1leHRlcm4gdm9pZCBob3N0aWZfZXhpdChzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2KTsKK2ludCBob3N0aWZfZGF0YV9yZXF1ZXN0KHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYsCisJCQkgc3RydWN0IHNrX2J1ZmYgKnBhY2tldCk7Cit2b2lkIGhvc3RpZl9yZWNlaXZlKHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYsIHVuc2lnbmVkIGNoYXIgKnAsCisJICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaXplKTsKK3ZvaWQgaG9zdGlmX3NtZV9lbnF1ZXVlKHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYsIHVpbnQxNl90IGV2ZW50KTsKK2ludCBob3N0aWZfaW5pdChzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2KTsKK3ZvaWQgaG9zdGlmX2V4aXQoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdik7CitpbnQga3Nfd2xhbl9od190eChzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2LCB2b2lkICpwLAorCQkgICB1bnNpZ25lZCBsb25nIHNpemUsCisJCSAgIHZvaWQgKCpjb21wbGV0ZV9oYW5kbGVyKSAodm9pZCAqYXJnMSwgdm9pZCAqYXJnMiksCisJCSAgIHZvaWQgKmFyZzEsIHZvaWQgKmFyZzIpOwordm9pZCBzZW5kX3BhY2tldF9jb21wbGV0ZSh2b2lkICosIHZvaWQgKik7CisKK3ZvaWQga3Nfd2xhbl9od193YWtldXBfcmVxdWVzdChzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2KTsKK2ludCBrc193bGFuX2h3X3Bvd2VyX3NhdmUoc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdik7CiAKIHN0YXRpYwogaW5saW5lIGludCBoaWZfYWxpZ25fc2l6ZShpbnQgc2l6ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9rczcwMTAva3Nfd2xhbi5oIGIvZHJpdmVycy9zdGFnaW5nL2tzNzAxMC9rc193bGFuLmgKaW5kZXggZjA1ZGMwMS4uYzJjYzI4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2tzNzAxMC9rc193bGFuLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2tzNzAxMC9rc193bGFuLmgKQEAgLTIxOSw3ICsyMTksNyBAQAogCXVpbnQ4X3QgaWQ7CS8qIDB4ZGQgPSBXUEEgb3IgMHgzMCA9IFJTTiAqLwogCXVpbnQ4X3Qgc2l6ZTsJLyogbWF4ID8gMjU1ID8gKi8KIAl1aW50OF90IGJvZHlbUlNOX0lFX0JPRFlfTUFYXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2lmZGVmIFdQUwogI2RlZmluZSBXUFNfSUVfQk9EWV9NQVggMjU1CkBAIC0yMjcsNyArMjI3LDcgQEAKIAl1aW50OF90IGlkOwkvKiAyMjEgJ2RkIDxsZW4+IDAwIDUwIEYyIDA0JyAqLwogCXVpbnQ4X3Qgc2l6ZTsJLyogbWF4ID8gMjU1ID8gKi8KIAl1aW50OF90IGJvZHlbV1BTX0lFX0JPRFlfTUFYXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKICNlbmRpZiAvKiBXUFMgKi8KIAogc3RydWN0IGxvY2FsX2FwX3QgewpAQCAtNDk5LDcgKzQ5OSw3IEBACiAJdWludCB3YWtldXBfY291bnQ7CS8qIGZvciBkZXRlY3Qgd2FrZXVwIGxvb3AgKi8KIH07CiAKLWV4dGVybiBpbnQga3Nfd2xhbl9uZXRfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1leHRlcm4gaW50IGtzX3dsYW5fbmV0X3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQga3Nfd2xhbl9uZXRfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQga3Nfd2xhbl9uZXRfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAogI2VuZGlmIC8qIF9LU19XTEFOX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9rczcwMTAva3Nfd2xhbl9pb2N0bC5oIGIvZHJpdmVycy9zdGFnaW5nL2tzNzAxMC9rc193bGFuX2lvY3RsLmgKaW5kZXggNDkzNjllNC4uODQ1NTRiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2tzNzAxMC9rc193bGFuX2lvY3RsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2tzNzAxMC9rc193bGFuX2lvY3RsLmgKQEAgLTU4LDkgKzU4LDkgQEAKICNpbmNsdWRlICJrc193bGFuLmgiCiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAKLWV4dGVybiBpbnQga3Nfd2xhbl9yZWFkX2NvbmZpZ19maWxlKHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYpOwotZXh0ZXJuIGludCBrc193bGFuX3NldHVwX3BhcmFtZXRlcihzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2LAotCQkJCSAgIHVuc2lnbmVkIGludCBjb21taXRfZmxhZyk7CitpbnQga3Nfd2xhbl9yZWFkX2NvbmZpZ19maWxlKHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYpOworaW50IGtzX3dsYW5fc2V0dXBfcGFyYW1ldGVyKHN0cnVjdCBrc193bGFuX3ByaXZhdGUgKnByaXYsCisJCSAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY29tbWl0X2ZsYWcpOwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcva3M3MDEwL2tzX3dsYW5fbmV0LmMgYi9kcml2ZXJzL3N0YWdpbmcva3M3MDEwL2tzX3dsYW5fbmV0LmMKaW5kZXggMWUyMWViMS4uYjJiNGZhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2tzNzAxMC9rc193bGFuX25ldC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9rczcwMTAva3Nfd2xhbl9uZXQuYwpAQCAtOSw3ICs5LDYgQEAKICAqICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgpAQCAtNzAsMTAgKzY5LDYgQEAKIC8qCiAgKglmdW5jdGlvbiBwcm90b3R5cGVzCiAgKi8KLWV4dGVybiBpbnQga3Nfd2xhbl9od190eChzdHJ1Y3Qga3Nfd2xhbl9wcml2YXRlICpwcml2LCB2b2lkICpwLAotCQkJIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJCSB2b2lkICgqY29tcGxldGVfaGFuZGxlcikgKHZvaWQgKmFyZzEsIHZvaWQgKmFyZzIpLAotCQkJIHZvaWQgKmFyZzEsIHZvaWQgKmFyZzIpOwogc3RhdGljIGludCBrc193bGFuX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCBrc193bGFuX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50IGtzX3dsYW5fc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKQEAgLTIzOCw5ICsyMzMsOSBAQAogCQkvKiBXZSBzaG91bGQgZG8gYSBiZXR0ZXIgY2hlY2sgdGhhbiB0aGF0LAogCQkgKiBiYXNlZCBvbiB0aGUgY2FyZCBjYXBhYmlsaXR5ICEhISAqLwogCQlpZiAoKGNoYW5uZWwgPCAxKSB8fCAoY2hhbm5lbCA+IDE0KSkgewotCQkJcHJpbnRrKEtFUk5fREVCVUcKLQkJCSAgICAgICAiJXM6IE5ldyBjaGFubmVsIHZhbHVlIG9mICVkIGlzIGludmFsaWQhXG4iLAotCQkJICAgICAgIGRldi0+bmFtZSwgZndycS0+bSk7CisJCQluZXRkZXZfZGJnKGRldiwKKwkJCQkgICAiJXM6IE5ldyBjaGFubmVsIHZhbHVlIG9mICVkIGlzIGludmFsaWQhXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgZndycS0+bSk7CiAJCQlyYyA9IC1FSU5WQUw7CiAJCX0gZWxzZSB7CiAJCQkvKiBZZXMgISBXZSBjYW4gc2V0IGl0ICEhISAqLwpAQCAtNDAyLDcgKzM5Nyw3IEBACiAJCQlwcml2LT5uZWVkX2NvbW1pdCB8PSBTTUVfTU9ERV9TRVQ7CiAJCX0KIAl9IGVsc2UgewotCQltZW1zZXQocHJpdi0+cmVnLmJzc2lkLCAweDAsIEVUSF9BTEVOKTsKKwkJZXRoX3plcm9fYWRkcihwcml2LT5yZWcuYnNzaWQpOwogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCkBAIC00MzMsNyArNDI4LDcgQEAKIAlpZiAoKHByaXYtPmNvbm5lY3Rfc3RhdHVzICYgQ09OTkVDVF9TVEFUVVNfTUFTSykgPT0gQ09OTkVDVF9TVEFUVVMpIHsKIAkJbWVtY3B5KGF3cnEtPnNhX2RhdGEsICYocHJpdi0+Y3VycmVudF9hcC5ic3NpZFswXSksIEVUSF9BTEVOKTsKIAl9IGVsc2UgewotCQltZW1zZXQoYXdycS0+c2FfZGF0YSwgMCwgRVRIX0FMRU4pOworCQlldGhfemVyb19hZGRyKGF3cnEtPnNhX2RhdGEpOwogCX0KIAogCWF3cnEtPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKQEAgLTIwOTIsNyArMjA4Nyw3IEBACiAJCQlsaXN0X2Zvcl9lYWNoKHB0ciwgJnByaXYtPnBta2xpc3QuaGVhZCkgewogCQkJCXBtayA9IGxpc3RfZW50cnkocHRyLCBzdHJ1Y3QgcG1rX3QsIGxpc3QpOwogCQkJCWlmICghbWVtY21wKHBta3NhLT5ic3NpZC5zYV9kYXRhLCBwbWstPmJzc2lkLCBFVEhfQUxFTikpIHsJLyogbWF0Y2ggYWRkcmVzcyEgbGlzdCBkZWwuICovCi0JCQkJCW1lbXNldChwbWstPmJzc2lkLCAwLCBFVEhfQUxFTik7CisJCQkJCWV0aF96ZXJvX2FkZHIocG1rLT5ic3NpZCk7CiAJCQkJCW1lbXNldChwbWstPnBta2lkLCAwLCBJV19QTUtJRF9MRU4pOwogCQkJCQlsaXN0X2RlbF9pbml0KCZwbWstPmxpc3QpOwogCQkJCQlicmVhazsKQEAgLTI2NzYsMTcgKzI2NzEsMTcgQEAKIAogCWlmICgqdXdycSA9PSBTTFBfU0xFRVApIHsKIAkJcHJpdi0+c2xlZXBfbW9kZSA9ICp1d3JxOwotCQlwcmludGsoIlNFVF9TTEVFUF9NT0RFICVkXG4iLCBwcml2LT5zbGVlcF9tb2RlKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiU0VUX1NMRUVQX01PREUgJWRcbiIsIHByaXYtPnNsZWVwX21vZGUpOwogCiAJCWhvc3RpZl9zbWVfZW5xdWV1ZShwcml2LCBTTUVfU1RPUF9SRVFVRVNUKTsKIAkJaG9zdGlmX3NtZV9lbnF1ZXVlKHByaXYsIFNNRV9TTEVFUF9SRVFVRVNUKTsKIAogCX0gZWxzZSBpZiAoKnV3cnEgPT0gU0xQX0FDVElWRSkgewogCQlwcml2LT5zbGVlcF9tb2RlID0gKnV3cnE7Ci0JCXByaW50aygiU0VUX1NMRUVQX01PREUgJWRcbiIsIHByaXYtPnNsZWVwX21vZGUpOworCQluZXRkZXZfaW5mbyhkZXYsICJTRVRfU0xFRVBfTU9ERSAlZFxuIiwgcHJpdi0+c2xlZXBfbW9kZSk7CiAJCWhvc3RpZl9zbWVfZW5xdWV1ZShwcml2LCBTTUVfU0xFRVBfUkVRVUVTVCk7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKCJTRVRfU0xFRVBfTU9ERSAlZCBlcnJyb3JcbiIsICp1d3JxKTsKKwkJbmV0ZGV2X2VycihkZXYsICJTRVRfU0xFRVBfTU9ERSAlZCBlcnJyb3JcbiIsICp1d3JxKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yNzg4LDcgKzI3ODMsNyBAQAogCX0KIAkvKiBmb3IgU0xFRVAgTU9ERSAqLwogCSp1d3JxID0gcHJpdi0+d3BzLndwc19lbmFibGVkOwotCXByaW50aygicmV0dXJuPSVkXG4iLCAqdXdycSk7CisJbmV0ZGV2X2luZm8oZGV2LCAicmV0dXJuPSVkXG4iLCAqdXdycSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI5NzgsMTE3ICsyOTczLDExNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBwcmludF9oaWZfZXZlbnQoaW50IGV2ZW50KQorc3RhdGljIHZvaWQgcHJpbnRfaGlmX2V2ZW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBldmVudCkKIHsKIAogCXN3aXRjaCAoZXZlbnQpIHsKIAljYXNlIEhJRl9EQVRBX1JFUToKLQkJcHJpbnRrKCJISUZfREFUQV9SRVFcbiIpOworCQluZXRkZXZfaW5mbyhkZXYsICJISUZfREFUQV9SRVFcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9EQVRBX0lORDoKLQkJcHJpbnRrKCJISUZfREFUQV9JTkRcbiIpOworCQluZXRkZXZfaW5mbyhkZXYsICJISUZfREFUQV9JTkRcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9NSUJfR0VUX1JFUToKLQkJcHJpbnRrKCJISUZfTUlCX0dFVF9SRVFcbiIpOworCQluZXRkZXZfaW5mbyhkZXYsICJISUZfTUlCX0dFVF9SRVFcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9NSUJfR0VUX0NPTkY6Ci0JCXByaW50aygiSElGX01JQl9HRVRfQ09ORlxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9NSUJfR0VUX0NPTkZcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9NSUJfU0VUX1JFUToKLQkJcHJpbnRrKCJISUZfTUlCX1NFVF9SRVFcbiIpOworCQluZXRkZXZfaW5mbyhkZXYsICJISUZfTUlCX1NFVF9SRVFcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9NSUJfU0VUX0NPTkY6Ci0JCXByaW50aygiSElGX01JQl9TRVRfQ09ORlxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9NSUJfU0VUX0NPTkZcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9QT1dFUk1HVF9SRVE6Ci0JCXByaW50aygiSElGX1BPV0VSTUdUX1JFUVxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9QT1dFUk1HVF9SRVFcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9QT1dFUk1HVF9DT05GOgotCQlwcmludGsoIkhJRl9QT1dFUk1HVF9DT05GXG4iKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiSElGX1BPV0VSTUdUX0NPTkZcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9TVEFSVF9SRVE6Ci0JCXByaW50aygiSElGX1NUQVJUX1JFUVxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9TVEFSVF9SRVFcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9TVEFSVF9DT05GOgotCQlwcmludGsoIkhJRl9TVEFSVF9DT05GXG4iKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiSElGX1NUQVJUX0NPTkZcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9DT05ORUNUX0lORDoKLQkJcHJpbnRrKCJISUZfQ09OTkVDVF9JTkRcbiIpOworCQluZXRkZXZfaW5mbyhkZXYsICJISUZfQ09OTkVDVF9JTkRcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9TVE9QX1JFUToKLQkJcHJpbnRrKCJISUZfU1RPUF9SRVFcbiIpOworCQluZXRkZXZfaW5mbyhkZXYsICJISUZfU1RPUF9SRVFcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9TVE9QX0NPTkY6Ci0JCXByaW50aygiSElGX1NUT1BfQ09ORlxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9TVE9QX0NPTkZcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9QU19BREhfU0VUX1JFUToKLQkJcHJpbnRrKCJISUZfUFNfQURIX1NFVF9SRVFcbiIpOworCQluZXRkZXZfaW5mbyhkZXYsICJISUZfUFNfQURIX1NFVF9SRVFcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9QU19BREhfU0VUX0NPTkY6Ci0JCXByaW50aygiSElGX1BTX0FESF9TRVRfQ09ORlxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9QU19BREhfU0VUX0NPTkZcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9JTkZSQV9TRVRfUkVROgotCQlwcmludGsoIkhJRl9JTkZSQV9TRVRfUkVRXG4iKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiSElGX0lORlJBX1NFVF9SRVFcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9JTkZSQV9TRVRfQ09ORjoKLQkJcHJpbnRrKCJISUZfSU5GUkFfU0VUX0NPTkZcbiIpOworCQluZXRkZXZfaW5mbyhkZXYsICJISUZfSU5GUkFfU0VUX0NPTkZcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9BREhfU0VUX1JFUToKLQkJcHJpbnRrKCJISUZfQURIX1NFVF9SRVFcbiIpOworCQluZXRkZXZfaW5mbyhkZXYsICJISUZfQURIX1NFVF9SRVFcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9BREhfU0VUX0NPTkY6Ci0JCXByaW50aygiSElGX0FESF9TRVRfQ09ORlxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9BREhfU0VUX0NPTkZcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9BUF9TRVRfUkVROgotCQlwcmludGsoIkhJRl9BUF9TRVRfUkVRXG4iKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiSElGX0FQX1NFVF9SRVFcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9BUF9TRVRfQ09ORjoKLQkJcHJpbnRrKCJISUZfQVBfU0VUX0NPTkZcbiIpOworCQluZXRkZXZfaW5mbyhkZXYsICJISUZfQVBfU0VUX0NPTkZcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9BU1NPQ19JTkZPX0lORDoKLQkJcHJpbnRrKCJISUZfQVNTT0NfSU5GT19JTkRcbiIpOworCQluZXRkZXZfaW5mbyhkZXYsICJISUZfQVNTT0NfSU5GT19JTkRcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9NSUNfRkFJTFVSRV9SRVE6Ci0JCXByaW50aygiSElGX01JQ19GQUlMVVJFX1JFUVxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9NSUNfRkFJTFVSRV9SRVFcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9NSUNfRkFJTFVSRV9DT05GOgotCQlwcmludGsoIkhJRl9NSUNfRkFJTFVSRV9DT05GXG4iKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiSElGX01JQ19GQUlMVVJFX0NPTkZcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9TQ0FOX1JFUToKLQkJcHJpbnRrKCJISUZfU0NBTl9SRVFcbiIpOworCQluZXRkZXZfaW5mbyhkZXYsICJISUZfU0NBTl9SRVFcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9TQ0FOX0NPTkY6Ci0JCXByaW50aygiSElGX1NDQU5fQ09ORlxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9TQ0FOX0NPTkZcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9QSFlfSU5GT19SRVE6Ci0JCXByaW50aygiSElGX1BIWV9JTkZPX1JFUVxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9QSFlfSU5GT19SRVFcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9QSFlfSU5GT19DT05GOgotCQlwcmludGsoIkhJRl9QSFlfSU5GT19DT05GXG4iKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiSElGX1BIWV9JTkZPX0NPTkZcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9TTEVFUF9SRVE6Ci0JCXByaW50aygiSElGX1NMRUVQX1JFUVxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9TTEVFUF9SRVFcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9TTEVFUF9DT05GOgotCQlwcmludGsoIkhJRl9TTEVFUF9DT05GXG4iKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiSElGX1NMRUVQX0NPTkZcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9QSFlfSU5GT19JTkQ6Ci0JCXByaW50aygiSElGX1BIWV9JTkZPX0lORFxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9QSFlfSU5GT19JTkRcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9TQ0FOX0lORDoKLQkJcHJpbnRrKCJISUZfU0NBTl9JTkRcbiIpOworCQluZXRkZXZfaW5mbyhkZXYsICJISUZfU0NBTl9JTkRcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9JTkZSQV9TRVQyX1JFUToKLQkJcHJpbnRrKCJISUZfSU5GUkFfU0VUMl9SRVFcbiIpOworCQluZXRkZXZfaW5mbyhkZXYsICJISUZfSU5GUkFfU0VUMl9SRVFcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9JTkZSQV9TRVQyX0NPTkY6Ci0JCXByaW50aygiSElGX0lORlJBX1NFVDJfQ09ORlxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9JTkZSQV9TRVQyX0NPTkZcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9BREhfU0VUMl9SRVE6Ci0JCXByaW50aygiSElGX0FESF9TRVQyX1JFUVxuIik7CisJCW5ldGRldl9pbmZvKGRldiwgIkhJRl9BREhfU0VUMl9SRVFcbiIpOwogCQlicmVhazsKIAljYXNlIEhJRl9BREhfU0VUMl9DT05GOgotCQlwcmludGsoIkhJRl9BREhfU0VUMl9DT05GXG4iKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiSElGX0FESF9TRVQyX0NPTkZcbiIpOwogCX0KIH0KIApAQCAtMzEwNSw3ICszMTAwLDcgQEAKIAkJZXZlbnQgPQogCQkgICAgcHJpdi0+aG9zdHQuYnVmZlsocHJpdi0+aG9zdHQucXRhaWwgLSAxIC0gaSkgJQogCQkJCSAgICAgU01FX0VWRU5UX0JVRkZfU0laRV07Ci0JCXByaW50X2hpZl9ldmVudChldmVudCk7CisJCXByaW50X2hpZl9ldmVudChkZXYsIGV2ZW50KTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0zMzM1LDcgKzMzMzAsNyBAQAogCiAJcHJpdi0+bWFjX2FkZHJlc3NfdmFsaWQgPSAwOwogCWhvc3RpZl9zbWVfZW5xdWV1ZShwcml2LCBTTUVfTUFDQUREUkVTU19TRVRfUkVRVUVTVCk7Ci0JcHJpbnRrKEtFUk5fSU5GTworCW5ldGRldl9pbmZvKGRldiwKIAkgICAgICAgImtzX3dsYW46IE1BQyBBRERSRVNTID0gJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCiAJICAgICAgIHByaXYtPmV0aF9hZGRyWzBdLCBwcml2LT5ldGhfYWRkclsxXSwgcHJpdi0+ZXRoX2FkZHJbMl0sCiAJICAgICAgIHByaXYtPmV0aF9hZGRyWzNdLCBwcml2LT5ldGhfYWRkcls0XSwgcHJpdi0+ZXRoX2FkZHJbNV0pOwpAQCAtMzM1NCw4ICszMzQ5LDYgQEAKIAl9CiAJcHJpdi0+bnN0YXRzLnR4X2Vycm9ycysrOwogCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKLQotCXJldHVybjsKIH0KIAogc3RhdGljCkBAIC0zMzY2LDggKzMzNTksOCBAQAogCiAJRFBSSU5USygzLCAiaW5faW50ZXJydXB0KCk9JWxkXG4iLCBpbl9pbnRlcnJ1cHQoKSk7CiAKLQlpZiAoc2tiID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJrc193bGFuOiAgc2tiID09IE5VTEwhISFcbiIpOworCWlmICghc2tiKSB7CisJCW5ldGRldl9lcnIoZGV2LCAia3Nfd2xhbjogIHNrYiA9PSBOVUxMISEhXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCWlmIChwcml2LT5kZXZfc3RhdGUgPCBERVZJQ0VfU1RBVEVfUkVBRFkpIHsKQEAgLTMzOTYsMTMgKzMzODksMTMgQEAKIAogCURQUklOVEsoMywgIlxuIik7CiAKLQlwcml2LT5uc3RhdHMudHhfYnl0ZXMgKz0gcGFja2V0LT5sZW47CiAJcHJpdi0+bnN0YXRzLnR4X3BhY2tldHMrKzsKIAogCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKHByaXYtPm5ldF9kZXYpKQogCQluZXRpZl93YWtlX3F1ZXVlKHByaXYtPm5ldF9kZXYpOwogCiAJaWYgKHBhY2tldCkgeworCQlwcml2LT5uc3RhdHMudHhfYnl0ZXMgKz0gcGFja2V0LT5sZW47CiAJCWRldl9rZnJlZV9za2IocGFja2V0KTsKIAkJcGFja2V0ID0gTlVMTDsKIAl9CkBAIC0zNDIxLDggKzM0MTQsNiBAQAogCQlyZXR1cm47CS8qIG5vdCBmaW5pc2hlZCBpbml0aWFsaXplICovCiAJfQogCWhvc3RpZl9zbWVfZW5xdWV1ZShwcml2LCBTTUVfTVVMVElDQVNUX1JFUVVFU1QpOwotCi0JcmV0dXJuOwogfQogCiBzdGF0aWMKQEAgLTM0MzMsNyArMzQyNCw3IEBACiAJcHJpdi0+Y3VyX3J4ID0gMDsKIAogCWlmICghcHJpdi0+bWFjX2FkZHJlc3NfdmFsaWQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJrc193bGFuIDogJXMgTm90IFJFQURZICEhXG4iLCBkZXYtPm5hbWUpOworCQluZXRkZXZfZXJyKGRldiwgImtzX3dsYW4gOiAlcyBOb3QgUkVBRFkgISFcbiIsIGRldi0+bmFtZSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfSBlbHNlCiAJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CkBAIC0zNTEyLDE3ICszNTAzLDExIEBACiB7CiAJc3RydWN0IGtzX3dsYW5fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAKLQlpbnQgcmV0ID0gMDsKIAlwcml2LT5kZXZpY2Vfb3Blbl9zdGF0dXMgPSAwOwogCWRlbF90aW1lcl9zeW5jKCZ1cGRhdGVfcGh5aW5mb190aW1lcik7CiAKIAlpZiAobmV0aWZfcnVubmluZyhkZXYpKQogCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQga3Nfd2xhbl9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2tzNzAxMC9taWNoYWVsX21pYy5jIGIvZHJpdmVycy9zdGFnaW5nL2tzNzAxMC9taWNoYWVsX21pYy5jCmluZGV4IGUxNGMxMDkuLjc4YWUyYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9rczcwMTAvbWljaGFlbF9taWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcva3M3MDEwL21pY2hhZWxfbWljLmMKQEAgLTIwLDE4ICsyMCwyNCBAQAogI2RlZmluZSBnZXRVSW50MzIoIEEsIEIgKSAJKHVpbnQzMl90KShBW0IrMF0gPDwgMCkgKyAoQVtCKzFdIDw8IDgpICsgKEFbQisyXSA8PCAxNikgKyAoQVtCKzNdIDw8IDI0KQogCiAvLyBDb252ZXJ0IGZyb20gVUludDMyIHRvIEJ5dGVbXSBpbiBhIHBvcnRhYmxlIHdheQotI2RlZmluZSBwdXRVSW50MzIoIEEsIEIsIEMgKSAJQVtCKzBdID0gKHVpbnQ4X3QpIChDICYgMHhmZik7CQlcCi0JCQkJQVtCKzFdID0gKHVpbnQ4X3QpICgoQz4+OCkgJiAweGZmKTsJXAotCQkJCUFbQisyXSA9ICh1aW50OF90KSAoKEM+PjE2KSAmIDB4ZmYpOwlcCi0JCQkJQVtCKzNdID0gKHVpbnQ4X3QpICgoQz4+MjQpICYgMHhmZikKKyNkZWZpbmUgcHV0VUludDMyKEEsIEIsIEMpCQkJCQlcCitkbyB7CQkJCQkJCQlcCisJQVtCICsgMF0gPSAodWludDhfdCkoQyAmIDB4ZmYpOwkJCQlcCisJQVtCICsgMV0gPSAodWludDhfdCkoKEMgPj4gOCkgJiAweGZmKTsJCQlcCisJQVtCICsgMl0gPSAodWludDhfdCkoKEMgPj4gMTYpICYgMHhmZik7CQkJXAorCUFbQiArIDNdID0gKHVpbnQ4X3QpKChDID4+IDI0KSAmIDB4ZmYpOwkJCVwKK30gd2hpbGUgKDApCiAKIC8vIFJlc2V0IHRoZSBzdGF0ZSB0byB0aGUgZW1wdHkgbWVzc2FnZS4KLSNkZWZpbmUgTWljaGFlbENsZWFyKCBBICkgCUEtPkwgPSBBLT5LMDsgXAotCQkJCUEtPlIgPSBBLT5LMTsgXAotCQkJCUEtPm5CeXRlc0luTSA9IDA7CisjZGVmaW5lIE1pY2hhZWxDbGVhcihBKQkJCVwKK2RvIHsJCQkJCVwKKwlBLT5MID0gQS0+SzA7CQkJXAorCUEtPlIgPSBBLT5LMTsJCQlcCisJQS0+bkJ5dGVzSW5NID0gMDsJCVwKK30gd2hpbGUgKDApCiAKIHN0YXRpYwotdm9pZCBNaWNoYWVsSW5pdGlhbGl6ZUZ1bmN0aW9uKHN0cnVjdCBtaWNoZWxfbWljX3QgKk1pYywgdWludDhfdCAqIGtleSkKK3ZvaWQgTWljaGFlbEluaXRpYWxpemVGdW5jdGlvbihzdHJ1Y3QgbWljaGVsX21pY190ICpNaWMsIHVpbnQ4X3QgKmtleSkKIHsKIAkvLyBTZXQgdGhlIGtleQogCU1pYy0+SzAgPSBnZXRVSW50MzIoa2V5LCAwKTsKQEAgLTU0LDcgKzYwLDcgQEAKIH13aGlsZSgwKQogCiBzdGF0aWMKLXZvaWQgTWljaGFlbEFwcGVuZChzdHJ1Y3QgbWljaGVsX21pY190ICpNaWMsIHVpbnQ4X3QgKiBzcmMsIGludCBuQnl0ZXMpCit2b2lkIE1pY2hhZWxBcHBlbmQoc3RydWN0IG1pY2hlbF9taWNfdCAqTWljLCB1aW50OF90ICpzcmMsIGludCBuQnl0ZXMpCiB7CiAJaW50IGFkZGxlbjsKIAlpZiAoTWljLT5uQnl0ZXNJbk0pIHsKQEAgLTg4LDcgKzk0LDcgQEAKIH0KIAogc3RhdGljCi12b2lkIE1pY2hhZWxHZXRNSUMoc3RydWN0IG1pY2hlbF9taWNfdCAqTWljLCB1aW50OF90ICogZHN0KQordm9pZCBNaWNoYWVsR2V0TUlDKHN0cnVjdCBtaWNoZWxfbWljX3QgKk1pYywgdWludDhfdCAqZHN0KQogewogCXVpbnQ4X3QgKmRhdGEgPSBNaWMtPk07CiAJc3dpdGNoIChNaWMtPm5CeXRlc0luTSkgewpAQCAtMTE2LDkgKzEyMiw5IEBACiAJTWljaGFlbENsZWFyKE1pYyk7CiB9CiAKLXZvaWQgTWljaGFlbE1JQ0Z1bmN0aW9uKHN0cnVjdCBtaWNoZWxfbWljX3QgKk1pYywgdWludDhfdCAqIEtleSwKLQkJCXVpbnQ4X3QgKiBEYXRhLCBpbnQgTGVuLCB1aW50OF90IHByaW9yaXR5LAotCQkJdWludDhfdCAqIFJlc3VsdCkKK3ZvaWQgTWljaGFlbE1JQ0Z1bmN0aW9uKHN0cnVjdCBtaWNoZWxfbWljX3QgKk1pYywgdWludDhfdCAqS2V5LAorCQkJdWludDhfdCAqRGF0YSwgaW50IExlbiwgdWludDhfdCBwcmlvcml0eSwKKwkJCXVpbnQ4X3QgKlJlc3VsdCkKIHsKIAl1aW50OF90IHBhZF9kYXRhWzRdID0geyBwcmlvcml0eSwgMCwgMCwgMCB9OwogCS8vIENvbXB1dGUgdGhlIE1JQyB2YWx1ZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2tzNzAxMC9taWNoYWVsX21pYy5oIGIvZHJpdmVycy9zdGFnaW5nL2tzNzAxMC9taWNoYWVsX21pYy5oCmluZGV4IGM3ZTRlYjIuLmVmYWEyMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9rczcwMTAvbWljaGFlbF9taWMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcva3M3MDEwL21pY2hhZWxfbWljLmgKQEAgLTIwLDcgKzIwLDYgQEAKIAl1aW50OF90IFJlc3VsdFs4XTsKIH07CiAKLWV4dGVybgotdm9pZCBNaWNoYWVsTUlDRnVuY3Rpb24oc3RydWN0IG1pY2hlbF9taWNfdCAqTWljLCB1aW50OF90ICogS2V5LAotCQkJdWludDhfdCAqIERhdGEsIGludCBMZW4sIHVpbnQ4X3QgcHJpb3JpdHksCi0JCQl1aW50OF90ICogUmVzdWx0KTsKK3ZvaWQgTWljaGFlbE1JQ0Z1bmN0aW9uKHN0cnVjdCBtaWNoZWxfbWljX3QgKk1pYywgdWludDhfdCAqS2V5LAorCQkJdWludDhfdCAqRGF0YSwgaW50IExlbiwgdWludDhfdCBwcmlvcml0eSwKKwkJCXVpbnQ4X3QgKlJlc3VsdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmcy5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnMuaAppbmRleCAzZjY0NDdjLi4zYjkyZDM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzLmgKQEAgLTEzOCw4ICsxMzgsOCBAQAogdm9pZCBsdXN0cmVfaW5zZXJ0X2RlYnVnZnMoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsCiAJCQkgICBjb25zdCBzdHJ1Y3QgbG5ldF9kZWJ1Z2ZzX3N5bWxpbmtfZGVmICpzeW1saW5rcyk7CiBpbnQgbHByb2Nmc19jYWxsX2hhbmRsZXIodm9pZCAqZGF0YSwgaW50IHdyaXRlLCBsb2ZmX3QgKnBwb3MsCi0JCQkgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKLQkJCSAgaW50ICgqaGFuZGxlcikodm9pZCAqZGF0YSwgaW50IHdyaXRlLAotCQkJICBsb2ZmX3QgcG9zLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBpbnQgbGVuKSk7CisJCQkgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAorCQkJIGludCAoKmhhbmRsZXIpKHZvaWQgKmRhdGEsIGludCB3cml0ZSwgbG9mZl90IHBvcywKKwkJCQkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgaW50IGxlbikpOwogCiAjZW5kaWYgLyogX0xJQkNGU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19kZWJ1Zy5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfZGVidWcuaAppbmRleCAyNWFkYWIxLi5iN2JkNmU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19kZWJ1Zy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX2RlYnVnLmgKQEAgLTI0NywxOSArMjQ3LDE5IEBACiAjZGVmaW5lIExDT05TT0xFX0VNRVJHKGZvcm1hdCwgLi4uKSBDREVCVUcoRF9DT05TT0xFIHwgRF9FTUVSRywgZm9ybWF0LCAjIyBfX1ZBX0FSR1NfXykKIAogaW50IGxpYmNmc19kZWJ1Z19tc2coc3RydWN0IGxpYmNmc19kZWJ1Z19tc2dfZGF0YSAqbXNnZGF0YSwKLQkJCSAgICBjb25zdCBjaGFyICpmb3JtYXQxLCAuLi4pCisJCSAgICAgY29uc3QgY2hhciAqZm9ybWF0MSwgLi4uKQogCV9fcHJpbnRmKDIsIDMpOwogCiBpbnQgbGliY2ZzX2RlYnVnX3Ztc2cyKHN0cnVjdCBsaWJjZnNfZGVidWdfbXNnX2RhdGEgKm1zZ2RhdGEsCi0JCQkgICAgICBjb25zdCBjaGFyICpmb3JtYXQxLAotCQkJICAgICAgdmFfbGlzdCBhcmdzLCBjb25zdCBjaGFyICpmb3JtYXQyLCAuLi4pCisJCSAgICAgICBjb25zdCBjaGFyICpmb3JtYXQxLAorCQkgICAgICAgdmFfbGlzdCBhcmdzLCBjb25zdCBjaGFyICpmb3JtYXQyLCAuLi4pCiAJX19wcmludGYoNCwgNSk7CiAKIC8qIG90aGVyIGV4dGVybmFsIHN5bWJvbHMgdGhhdCB0cmFjZWZpbGUgcHJvdmlkZXM6ICovCiBpbnQgY2ZzX3RyYWNlX2NvcHlpbl9zdHJpbmcoY2hhciAqa25sX2J1ZmZlciwgaW50IGtubF9idWZmZXJfbm9iLAotCQljb25zdCBjaGFyIF9fdXNlciAqdXNyX2J1ZmZlciwgaW50IHVzcl9idWZmZXJfbm9iKTsKKwkJCSAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNyX2J1ZmZlciwgaW50IHVzcl9idWZmZXJfbm9iKTsKIGludCBjZnNfdHJhY2VfY29weW91dF9zdHJpbmcoY2hhciBfX3VzZXIgKnVzcl9idWZmZXIsIGludCB1c3JfYnVmZmVyX25vYiwKLQkJY29uc3QgY2hhciAqa25sX2J1ZmZlciwgY2hhciAqYXBwZW5kKTsKKwkJCSAgICAgY29uc3QgY2hhciAqa25sX2J1ZmZlciwgY2hhciAqYXBwZW5kKTsKIAogI2RlZmluZSBMSUJDRlNfREVCVUdfRklMRV9QQVRIX0RFRkFVTFQgIi90bXAvbHVzdHJlLWxvZyIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfZmFpbC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfZmFpbC5oCmluZGV4IGQzZjlhNjAuLmJkYmJlOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX2ZhaWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19mYWlsLmgKQEAgLTE0Myw2ICsxNDMsOSBAQAogI2RlZmluZSBDRlNfRkFJTF9USU1FT1VUX09SU0VUKGlkLCB2YWx1ZSwgc2VjcykgXAogCWNmc19mYWlsX3RpbWVvdXRfc2V0KGlkLCB2YWx1ZSwgc2VjcyAqIDEwMDAsIENGU19GQUlMX0xPQ19PUlNFVCkKIAorI2RlZmluZSBDRlNfRkFJTF9USU1FT1VUX1JFU0VUKGlkLCB2YWx1ZSwgc2VjcykgXAorCWNmc19mYWlsX3RpbWVvdXRfc2V0KGlkLCB2YWx1ZSwgc2VjcyAqIDEwMDAsIENGU19GQUlMX0xPQ19SRVNFVCkKKwogI2RlZmluZSBDRlNfRkFJTF9USU1FT1VUX01TX09SU0VUKGlkLCB2YWx1ZSwgbXMpIFwKIAljZnNfZmFpbF90aW1lb3V0X3NldChpZCwgdmFsdWUsIG1zLCBDRlNfRkFJTF9MT0NfT1JTRVQpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX3ByaXZhdGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX3ByaXZhdGUuaAppbmRleCA0ZGFhMzgyLi5lMGUxYTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19wcml2YXRlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfcHJpdmF0ZS5oCkBAIC0zMTAsMTMgKzMxMCwxMyBAQAogCiAjZGVmaW5lIE1LU1RSKHB0cikgKChwdHIpKSA/IChwdHIpIDogIiIKIAotc3RhdGljIGlubGluZSBpbnQgY2ZzX3NpemVfcm91bmQ0KGludCB2YWwpCitzdGF0aWMgaW5saW5lIHNpemVfdCBjZnNfc2l6ZV9yb3VuZDQoaW50IHZhbCkKIHsKIAlyZXR1cm4gKHZhbCArIDMpICYgKH4weDMpOwogfQogCiAjaWZuZGVmIEhBVkVfQ0ZTX1NJWkVfUk9VTkQKLXN0YXRpYyBpbmxpbmUgaW50IGNmc19zaXplX3JvdW5kKGludCB2YWwpCitzdGF0aWMgaW5saW5lIHNpemVfdCBjZnNfc2l6ZV9yb3VuZChpbnQgdmFsKQogewogCXJldHVybiAodmFsICsgNykgJiAofjB4Nyk7CiB9CkBAIC0zMjQsMTcgKzMyNCwxNyBAQAogI2RlZmluZSBIQVZFX0NGU19TSVpFX1JPVU5ECiAjZW5kaWYKIAotc3RhdGljIGlubGluZSBpbnQgY2ZzX3NpemVfcm91bmQxNihpbnQgdmFsKQorc3RhdGljIGlubGluZSBzaXplX3QgY2ZzX3NpemVfcm91bmQxNihpbnQgdmFsKQogewogCXJldHVybiAodmFsICsgMHhmKSAmICh+MHhmKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgY2ZzX3NpemVfcm91bmQzMihpbnQgdmFsKQorc3RhdGljIGlubGluZSBzaXplX3QgY2ZzX3NpemVfcm91bmQzMihpbnQgdmFsKQogewogCXJldHVybiAodmFsICsgMHgxZikgJiAofjB4MWYpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBjZnNfc2l6ZV9yb3VuZDAoaW50IHZhbCkKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGNmc19zaXplX3JvdW5kMChpbnQgdmFsKQogewogCWlmICghdmFsKQogCQlyZXR1cm4gMDsKQEAgLTM0Myw3ICszNDMsNyBAQAogCiBzdGF0aWMgaW5saW5lIHNpemVfdCBjZnNfcm91bmRfc3RybGVuKGNoYXIgKmZzZXQpCiB7Ci0JcmV0dXJuIChzaXplX3QpY2ZzX3NpemVfcm91bmQoKGludClzdHJsZW4oZnNldCkgKyAxKTsKKwlyZXR1cm4gY2ZzX3NpemVfcm91bmQoKGludClzdHJsZW4oZnNldCkgKyAxKTsKIH0KIAogI2RlZmluZSBMT0dMKHZhciwgbGVuLCBwdHIpCQkJCSAgICAgICBcCkBAIC0zNjAsMTMgKzM2MCw0IEBACiAJcHRyICs9IGNmc19zaXplX3JvdW5kKGxlbik7CQkJICAgICBcCiB9IHdoaWxlICgwKQogCi0jZGVmaW5lIExPR0wwKHZhciwgbGVuLCBwdHIpCQkJICAgICAgXAotZG8gewkJCQkJCSAgICBcCi0JaWYgKCFsZW4pCQkJCSAgICAgICBcCi0JCWJyZWFrOwkJCQkgIFwKLQltZW1jcHkoKGNoYXIgKilwdHIsIChjb25zdCBjaGFyICopdmFyLCBsZW4pOyAgICBcCi0JKigoY2hhciAqKShwdHIpICsgbGVuKSA9IDA7CQkgICAgIFwKLQlwdHIgKz0gY2ZzX3NpemVfcm91bmQobGVuICsgMSk7CQkgXAotfSB3aGlsZSAoMCkKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbG5ldC9saWItbG5ldC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xuZXQvbGliLWxuZXQuaAppbmRleCA1MTNhODIyLi5hNTljNWU5OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9sbmV0L2xpYi1sbmV0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xuZXQvbGliLWxuZXQuaApAQCAtNjA1LDczICs2MDUsMjAgQEAKIAogdW5zaWduZWQgaW50IGxuZXRfaW92X25vYih1bnNpZ25lZCBpbnQgbmlvdiwgc3RydWN0IGt2ZWMgKmlvdik7CiBpbnQgbG5ldF9leHRyYWN0X2lvdihpbnQgZHN0X25pb3YsIHN0cnVjdCBrdmVjICpkc3QsCi0JCSAgICAgaW50IHNyY19uaW92LCBzdHJ1Y3Qga3ZlYyAqc3JjLAorCQkgICAgIGludCBzcmNfbmlvdiwgY29uc3Qgc3RydWN0IGt2ZWMgKnNyYywKIAkJICAgICAgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGxlbik7CiAKIHVuc2lnbmVkIGludCBsbmV0X2tpb3Zfbm9iKHVuc2lnbmVkIGludCBuaW92LCBsbmV0X2tpb3ZfdCAqaW92KTsKIGludCBsbmV0X2V4dHJhY3Rfa2lvdihpbnQgZHN0X25pb3YsIGxuZXRfa2lvdl90ICpkc3QsCi0JCSAgICAgIGludCBzcmNfbmlvdiwgbG5ldF9raW92X3QgKnNyYywKKwkJICAgICAgaW50IHNyY19uaW92LCBjb25zdCBsbmV0X2tpb3ZfdCAqc3JjLAogCQkgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuKTsKIAotdm9pZCBsbmV0X2NvcHlfaW92Mmlvdih1bnNpZ25lZCBpbnQgbmRpb3YsIHN0cnVjdCBrdmVjICpkaW92LAotCQkgICAgICAgdW5zaWduZWQgaW50IGRvZmZzZXQsCi0JCQl1bnNpZ25lZCBpbnQgbnNpb3YsIHN0cnVjdCBrdmVjICpzaW92LAordm9pZCBsbmV0X2NvcHlfaW92Mml0ZXIoc3RydWN0IGlvdl9pdGVyICp0bywKKwkJCXVuc2lnbmVkIGludCBuc2lvdiwgY29uc3Qgc3RydWN0IGt2ZWMgKnNpb3YsCiAJCQl1bnNpZ25lZCBpbnQgc29mZnNldCwgdW5zaWduZWQgaW50IG5vYik7Ci12b2lkIGxuZXRfY29weV9raW92Mmlvdih1bnNpZ25lZCBpbnQgbmlvdiwgc3RydWN0IGt2ZWMgKmlvdiwKLQkJCXVuc2lnbmVkIGludCBpb3ZvZmZzZXQsCi0JCQkgdW5zaWduZWQgaW50IG5raW92LCBsbmV0X2tpb3ZfdCAqa2lvdiwKK3ZvaWQgbG5ldF9jb3B5X2tpb3YyaXRlcihzdHJ1Y3QgaW92X2l0ZXIgKnRvLAorCQkJIHVuc2lnbmVkIGludCBua2lvdiwgY29uc3QgbG5ldF9raW92X3QgKmtpb3YsCiAJCQkgdW5zaWduZWQgaW50IGtpb3ZvZmZzZXQsIHVuc2lnbmVkIGludCBub2IpOwotdm9pZCBsbmV0X2NvcHlfaW92Mmtpb3YodW5zaWduZWQgaW50IG5raW92LCBsbmV0X2tpb3ZfdCAqa2lvdiwKLQkJCXVuc2lnbmVkIGludCBraW92b2Zmc2V0LAotCQkJIHVuc2lnbmVkIGludCBuaW92LCBzdHJ1Y3Qga3ZlYyAqaW92LAotCQkJIHVuc2lnbmVkIGludCBpb3ZvZmZzZXQsIHVuc2lnbmVkIGludCBub2IpOwotdm9pZCBsbmV0X2NvcHlfa2lvdjJraW92KHVuc2lnbmVkIGludCBuZGtpb3YsIGxuZXRfa2lvdl90ICpka2lvdiwKLQkJCSB1bnNpZ25lZCBpbnQgZG9mZnNldCwKLQkJCSAgdW5zaWduZWQgaW50IG5za2lvdiwgbG5ldF9raW92X3QgKnNraW92LAotCQkJICB1bnNpZ25lZCBpbnQgc29mZnNldCwgdW5zaWduZWQgaW50IG5vYik7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotbG5ldF9jb3B5X2lvdjJmbGF0KGludCBkbGVuLCB2b2lkICpkZXN0LCB1bnNpZ25lZCBpbnQgZG9mZnNldCwKLQkJICAgdW5zaWduZWQgaW50IG5zaW92LCBzdHJ1Y3Qga3ZlYyAqc2lvdiwgdW5zaWduZWQgaW50IHNvZmZzZXQsCi0JCSAgIHVuc2lnbmVkIGludCBub2IpCi17Ci0Jc3RydWN0IGt2ZWMgZGlvdiA9IHsvKi5pb3ZfYmFzZSA9ICovIGRlc3QsIC8qLmlvdl9sZW4gPSAqLyBkbGVufTsKLQotCWxuZXRfY29weV9pb3YyaW92KDEsICZkaW92LCBkb2Zmc2V0LAotCQkJICBuc2lvdiwgc2lvdiwgc29mZnNldCwgbm9iKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1sbmV0X2NvcHlfa2lvdjJmbGF0KGludCBkbGVuLCB2b2lkICpkZXN0LCB1bnNpZ25lZCBpbnQgZG9mZnNldCwKLQkJICAgIHVuc2lnbmVkIGludCBuc2lvdiwgbG5ldF9raW92X3QgKnNraW92LAotCQkgICAgdW5zaWduZWQgaW50IHNvZmZzZXQsIHVuc2lnbmVkIGludCBub2IpCi17Ci0Jc3RydWN0IGt2ZWMgZGlvdiA9IHsvKiAuaW92X2Jhc2UgPSAqLyBkZXN0LCAvKiAuaW92X2xlbiA9ICovIGRsZW59OwotCi0JbG5ldF9jb3B5X2tpb3YyaW92KDEsICZkaW92LCBkb2Zmc2V0LAotCQkJICAgbnNpb3YsIHNraW92LCBzb2Zmc2V0LCBub2IpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWxuZXRfY29weV9mbGF0Mmlvdih1bnNpZ25lZCBpbnQgbmRpb3YsIHN0cnVjdCBrdmVjICpkaW92LCB1bnNpZ25lZCBpbnQgZG9mZnNldCwKLQkJICAgaW50IHNsZW4sIHZvaWQgKnNyYywgdW5zaWduZWQgaW50IHNvZmZzZXQsIHVuc2lnbmVkIGludCBub2IpCi17Ci0Jc3RydWN0IGt2ZWMgc2lvdiA9IHsvKi5pb3ZfYmFzZSA9ICovIHNyYywgLyouaW92X2xlbiA9ICovc2xlbn07Ci0KLQlsbmV0X2NvcHlfaW92MmlvdihuZGlvdiwgZGlvdiwgZG9mZnNldCwKLQkJCSAgMSwgJnNpb3YsIHNvZmZzZXQsIG5vYik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotbG5ldF9jb3B5X2ZsYXQya2lvdih1bnNpZ25lZCBpbnQgbmRpb3YsIGxuZXRfa2lvdl90ICpka2lvdiwKLQkJICAgIHVuc2lnbmVkIGludCBkb2Zmc2V0LCBpbnQgc2xlbiwgdm9pZCAqc3JjLAotCQkgICAgdW5zaWduZWQgaW50IHNvZmZzZXQsIHVuc2lnbmVkIGludCBub2IpCi17Ci0Jc3RydWN0IGt2ZWMgc2lvdiA9IHsvKiAuaW92X2Jhc2UgPSAqLyBzcmMsIC8qIC5pb3ZfbGVuID0gKi8gc2xlbn07Ci0KLQlsbmV0X2NvcHlfaW92Mmtpb3YobmRpb3YsIGRraW92LCBkb2Zmc2V0LAotCQkJICAgMSwgJnNpb3YsIHNvZmZzZXQsIG5vYik7Ci19CiAKIHZvaWQgbG5ldF9tZV91bmxpbmsobG5ldF9tZV90ICptZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9sbmV0L2xpYi10eXBlcy5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xuZXQvbGliLXR5cGVzLmgKaW5kZXggNzk2N2IwMS4uYjg0YTViYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xuZXQvbGliLXR5cGVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xuZXQvbGliLXR5cGVzLmgKQEAgLTIyMCwxMCArMjIwLDcgQEAKIAkgKiBjcmVkaXQgaWYgdGhlIExORCBkb2VzIGZsb3cgY29udHJvbC4KIAkgKi8KIAlpbnQgKCpsbmRfcmVjdikoc3RydWN0IGxuZXRfbmkgKm5pLCB2b2lkICpwcml2YXRlLCBsbmV0X21zZ190ICptc2csCi0JCQlpbnQgZGVsYXllZCwgdW5zaWduZWQgaW50IG5pb3YsCi0JCQlzdHJ1Y3Qga3ZlYyAqaW92LCBsbmV0X2tpb3ZfdCAqa2lvdiwKLQkJCXVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBtbGVuLAotCQkJdW5zaWduZWQgaW50IHJsZW4pOworCQkJaW50IGRlbGF5ZWQsIHN0cnVjdCBpb3ZfaXRlciAqdG8sIHVuc2lnbmVkIGludCBybGVuKTsKIAogCS8qCiAJICogbG5ldF9wYXJzZSgpIGhhcyBoYWQgdG8gZGVsYXkgcHJvY2Vzc2luZyBvZiB0aGlzIG1lc3NhZ2UKQEAgLTI3OCw2ICsyNzUsOCBAQAogCXN0cnVjdCBsbmV0X2lvY3RsX2NvbmZpZ19sbmRfdHVuYWJsZXMgKm5pX2xuZF90dW5hYmxlczsKIAkvKiBlcXVpdmFsZW50IGludGVyZmFjZXMgdG8gdXNlICovCiAJY2hhcgkJCSAqbmlfaW50ZXJmYWNlc1tMTkVUX01BWF9JTlRFUkZBQ0VTXTsKKwkvKiBvcmlnaW5hbCBuZXQgbmFtZXNwYWNlICovCisJc3RydWN0IG5ldAkJICpuaV9uZXRfbnM7CiB9IGxuZXRfbmlfdDsKIAogI2RlZmluZSBMTkVUX1BST1RPX1BJTkdfTUFUQ0hCSVRTCTB4ODAwMDAwMDAwMDAwMDAwMExMCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbG5ldC90eXBlcy5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xuZXQvdHlwZXMuaAppbmRleCBlMDk4YjZjLi5mOGJlMGUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbG5ldC90eXBlcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9sbmV0L3R5cGVzLmgKQEAgLTUwMywyMSArNTAzLDcgQEAKIC8qIE5CIGx1c3RyZSBwb3J0YWxzIHVzZXMgc3RydWN0IGlvdmVjIGludGVybmFsbHkhICovCiB0eXBlZGVmIHN0cnVjdCBpb3ZlYyBsbmV0X21kX2lvdmVjX3Q7CiAKLS8qKgotICogQSBwYWdlLWJhc2VkIGZyYWdtZW50IG9mIGEgTUQuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQkvKiogUG9pbnRlciB0byB0aGUgcGFnZSB3aGVyZSB0aGUgZnJhZ21lbnQgcmVzaWRlcyAqLwotCXN0cnVjdCBwYWdlCSpraW92X3BhZ2U7Ci0JLyoqIExlbmd0aCBpbiBieXRlcyBvZiB0aGUgZnJhZ21lbnQgKi8KLQl1bnNpZ25lZCBpbnQJIGtpb3ZfbGVuOwotCS8qKgotCSAqIFN0YXJ0aW5nIG9mZnNldCBvZiB0aGUgZnJhZ21lbnQgd2l0aGluIHRoZSBwYWdlLiBOb3RlIHRoYXQgdGhlCi0JICogZW5kIG9mIHRoZSBmcmFnbWVudCBtdXN0IG5vdCBwYXNzIHRoZSBlbmQgb2YgdGhlIHBhZ2U7IGkuZS4sCi0JICoga2lvdl9sZW4gKyBraW92X29mZnNldCA8PSBQQUdFX1NJWkUuCi0JICovCi0JdW5zaWduZWQgaW50CSBraW92X29mZnNldDsKLX0gbG5ldF9raW92X3Q7Cit0eXBlZGVmIHN0cnVjdCBiaW9fdmVjIGxuZXRfa2lvdl90OwogLyoqIEB9IGxuZXRfbWQgKi8KIAogLyoqIFxhZGR0b2dyb3VwIGxuZXRfZXEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmQuYwppbmRleCA0ZjU5NzhiLi5jN2E1ZDQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvbzJpYmxuZC9vMmlibG5kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL28yaWJsbmQvbzJpYmxuZC5jCkBAIC0xMjgsNiArMTI4LDcgQEAKIHN0YXRpYyBpbnQga2libG5kX3VucGFja19yZChzdHJ1Y3Qga2liX21zZyAqbXNnLCBpbnQgZmxpcCkKIHsKIAlzdHJ1Y3Qga2liX3JkbWFfZGVzYyAqcmQ7CisJaW50IG1zZ19zaXplOwogCWludCBub2I7CiAJaW50IG47CiAJaW50IGk7CkBAIC0xNDYsMTIgKzE0Nyw2IEBACiAKIAluID0gcmQtPnJkX25mcmFnczsKIAotCWlmIChuIDw9IDAgfHwgbiA+IElCTE5EX01BWF9SRE1BX0ZSQUdTKSB7Ci0JCUNFUlJPUigiQmFkIG5mcmFnczogJWQsIHNob3VsZCBiZSAwIDwgbiA8PSAlZFxuIiwKLQkJICAgICAgIG4sIElCTE5EX01BWF9SRE1BX0ZSQUdTKTsKLQkJcmV0dXJuIDE7Ci0JfQotCiAJbm9iID0gb2Zmc2V0b2Yoc3RydWN0IGtpYl9tc2csIGlibV91KSArCiAJICAgICAga2libG5kX3JkX21zZ19zaXplKHJkLCBtc2ctPmlibV90eXBlLCBuKTsKIApAQCAtMTYxLDYgKzE1NiwxMyBAQAogCQlyZXR1cm4gMTsKIAl9CiAKKwltc2dfc2l6ZSA9IGtpYmxuZF9yZF9zaXplKHJkKTsKKwlpZiAobXNnX3NpemUgPD0gMCB8fCBtc2dfc2l6ZSA+IExORVRfTUFYX1BBWUxPQUQpIHsKKwkJQ0VSUk9SKCJCYWQgbXNnX3NpemU6ICVkLCBzaG91bGQgYmUgMCA8IG4gPD0gJWRcbiIsCisJCSAgICAgICBtc2dfc2l6ZSwgTE5FVF9NQVhfUEFZTE9BRCk7CisJCXJldHVybiAxOworCX0KKwogCWlmICghZmxpcCkKIAkJcmV0dXJuIDA7CiAKQEAgLTYxOCw3ICs2MjAsNyBAQAogfQogCiBzdHJ1Y3Qga2liX2Nvbm4gKmtpYmxuZF9jcmVhdGVfY29ubihzdHJ1Y3Qga2liX3BlZXIgKnBlZXIsIHN0cnVjdCByZG1hX2NtX2lkICpjbWlkLAotCQkJICAgICAgIGludCBzdGF0ZSwgaW50IHZlcnNpb24pCisJCQkJICAgIGludCBzdGF0ZSwgaW50IHZlcnNpb24pCiB7CiAJLyoKIAkgKiBDQVZFQVQgRU1QVE9SOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL28yaWJsbmQvbzJpYmxuZC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL28yaWJsbmQvbzJpYmxuZC5oCmluZGV4IDA3OGEwYzMuLjE0NTc2OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvbzJpYmxuZC9vMmlibG5kLmgKQEAgLTExMyw4ICsxMTMsOSBAQAogI2RlZmluZSBJQkxORF9PT0JfQ0FQQUJMRSh2KSAgICAgICAoKHYpICE9IElCTE5EX01TR19WRVJTSU9OXzEpCiAjZGVmaW5lIElCTE5EX09PQl9NU0dTKHYpCSAgIChJQkxORF9PT0JfQ0FQQUJMRSh2KSA/IDIgOiAwKQogCi0jZGVmaW5lIElCTE5EX01TR19TSVpFCQkoNCA8PCAxMCkJIC8qIG1heCBzaXplIG9mIHF1ZXVlZCBtZXNzYWdlcyAoaW5jIGhkcikgKi8KLSNkZWZpbmUgSUJMTkRfTUFYX1JETUFfRlJBR1MJIExORVRfTUFYX0lPVgkgICAvKiBtYXggIyBvZiBmcmFnbWVudHMgc3VwcG9ydGVkICovCisjZGVmaW5lIElCTE5EX0ZSQUdfU0hJRlQJKFBBR0VfU0hJRlQgLSAxMikJLyogZnJhZyBzaXplIG9uIHdpcmUgaXMgaW4gNEsgdW5pdHMgKi8KKyNkZWZpbmUgSUJMTkRfTVNHX1NJWkUJCSg0IDw8IDEwKQkJLyogbWF4IHNpemUgb2YgcXVldWVkIG1lc3NhZ2VzIChpbmMgaGRyKSAqLworI2RlZmluZSBJQkxORF9NQVhfUkRNQV9GUkFHUwkoTE5FVF9NQVhfUEFZTE9BRCA+PiAxMikvKiBtYXggIyBvZiBmcmFnbWVudHMgc3VwcG9ydGVkIGluIDRLIHNpemUgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIGRlcml2ZWQgY29uc3RhbnRzLi4uICovCkBAIC0xMzMsOCArMTM0LDggQEAKIC8qIFdScyBhbmQgQ1FFcyAocGVyIGNvbm5lY3Rpb24pICovCiAjZGVmaW5lIElCTE5EX1JFQ1ZfV1JTKGMpCUlCTE5EX1JYX01TR1MoYykKICNkZWZpbmUgSUJMTkRfU0VORF9XUlMoYykJXAotCSgoYy0+aWJjX21heF9mcmFncyArIDEpICoga2libG5kX2NvbmN1cnJlbnRfc2VuZHMoYy0+aWJjX3ZlcnNpb24sIFwKLQkJCQkJCQkgIGMtPmliY19wZWVyLT5pYnBfbmkpKQorCSgoKGMtPmliY19tYXhfZnJhZ3MgKyAxKSA8PCBJQkxORF9GUkFHX1NISUZUKSAqIFwKKwkgIGtpYmxuZF9jb25jdXJyZW50X3NlbmRzKGMtPmliY192ZXJzaW9uLCBjLT5pYmNfcGVlci0+aWJwX25pKSkKICNkZWZpbmUgSUJMTkRfQ1FfRU5UUklFUyhjKQkoSUJMTkRfUkVDVl9XUlMoYykgKyBJQkxORF9TRU5EX1dSUyhjKSkKIAogc3RydWN0IGtpYl9oY2FfZGV2OwpAQCAtNTgyLDYgKzU4Myw4IEBACiAJdW5zaWduZWQgc2hvcnQJCWlicF9jb25uZWN0aW5nOwogCS8qIHJlY29ubmVjdCB0aGlzIHBlZXIgbGF0ZXIgKi8KIAl1bnNpZ25lZCBzaG9ydAkJaWJwX3JlY29ubmVjdGluZzoxOworCS8qIGNvdW50ZXIgb2YgaG93IG1hbnkgdGltZXMgd2UgdHJpZ2dlcmVkIGEgY29ubiByYWNlICovCisJdW5zaWduZWQgY2hhcgkJaWJwX3JhY2VzOwogCS8qICMgY29uc2VjdXRpdmUgcmVjb25uZWN0aW9uIGF0dGVtcHRzIHRvIHRoaXMgcGVlciAqLwogCXVuc2lnbmVkIGludAkJaWJwX3JlY29ubmVjdGVkOwogCS8qIGVycm5vIG9uIGNsb3NpbmcgdGhpcyBwZWVyICovCkBAIC02MDcsMTQgKzYxMCwxNCBAQAogCiAJdHVuYWJsZXMgPSAmbmktPm5pX2xuZF90dW5hYmxlcy0+bHRfdHVuX3UubHRfbzJpYjsKIAltb2QgPSB0dW5hYmxlcy0+bG5kX21hcF9vbl9kZW1hbmQ7Ci0JcmV0dXJuIG1vZCA/IG1vZCA6IElCTE5EX01BWF9SRE1BX0ZSQUdTOworCXJldHVybiBtb2QgPyBtb2QgOiBJQkxORF9NQVhfUkRNQV9GUkFHUyA+PiBJQkxORF9GUkFHX1NISUZUOwogfQogCiBzdGF0aWMgaW5saW5lIGludAoga2libG5kX3JkbWFfZnJhZ3MoaW50IHZlcnNpb24sIHN0cnVjdCBsbmV0X25pICpuaSkKIHsKIAlyZXR1cm4gdmVyc2lvbiA9PSBJQkxORF9NU0dfVkVSU0lPTl8xID8KLQkJCSAgSUJMTkRfTUFYX1JETUFfRlJBR1MgOgorCQkJICAoSUJMTkRfTUFYX1JETUFfRlJBR1MgPj4gSUJMTkRfRlJBR19TSElGVCkgOgogCQkJICBraWJsbmRfY2ZnX3JkbWFfZnJhZ3MobmkpOwogfQogCkBAIC0xMDM0LDUgKzEwMzcsNCBAQAogCiBpbnQgIGtpYmxuZF9zZW5kKGxuZXRfbmlfdCAqbmksIHZvaWQgKnByaXZhdGUsIGxuZXRfbXNnX3QgKmxudG1zZyk7CiBpbnQgIGtpYmxuZF9yZWN2KGxuZXRfbmlfdCAqbmksIHZvaWQgKnByaXZhdGUsIGxuZXRfbXNnX3QgKmxudG1zZywgaW50IGRlbGF5ZWQsCi0JCSB1bnNpZ25lZCBpbnQgbmlvdiwgc3RydWN0IGt2ZWMgKmlvdiwgbG5ldF9raW92X3QgKmtpb3YsCi0JCSB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbWxlbiwgdW5zaWduZWQgaW50IHJsZW4pOworCQkgc3RydWN0IGlvdl9pdGVyICp0bywgdW5zaWduZWQgaW50IHJsZW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL28yaWJsbmQvbzJpYmxuZF9jYi5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL28yaWJsbmQvbzJpYmxuZF9jYi5jCmluZGV4IDU5NmE2OTcuLmIyN2RlODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmRfY2IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvbzJpYmxuZC9vMmlibG5kX2NiLmMKQEAgLTM2LDE2ICszNiwxOSBAQAogCiAjaW5jbHVkZSAibzJpYmxuZC5oIgogCisjZGVmaW5lIE1BWF9DT05OX1JBQ0VTX0JFRk9SRV9BQk9SVCAyMAorCiBzdGF0aWMgdm9pZCBraWJsbmRfcGVlcl9hbGl2ZShzdHJ1Y3Qga2liX3BlZXIgKnBlZXIpOwogc3RhdGljIHZvaWQga2libG5kX3BlZXJfY29ubmVjdF9mYWlsZWQoc3RydWN0IGtpYl9wZWVyICpwZWVyLCBpbnQgYWN0aXZlLCBpbnQgZXJyb3IpOwotc3RhdGljIHZvaWQga2libG5kX2NoZWNrX3NlbmRzKHN0cnVjdCBraWJfY29ubiAqY29ubik7CiBzdGF0aWMgdm9pZCBraWJsbmRfaW5pdF90eF9tc2cobG5ldF9uaV90ICpuaSwgc3RydWN0IGtpYl90eCAqdHgsCi0JCQkJaW50IHR5cGUsIGludCBib2R5X25vYik7CisJCQkgICAgICAgaW50IHR5cGUsIGludCBib2R5X25vYik7CiBzdGF0aWMgaW50IGtpYmxuZF9pbml0X3JkbWEoc3RydWN0IGtpYl9jb25uICpjb25uLCBzdHJ1Y3Qga2liX3R4ICp0eCwgaW50IHR5cGUsCi0JCQkgICAgIGludCByZXNpZCwgc3RydWN0IGtpYl9yZG1hX2Rlc2MgKmRzdHJkLCBfX3U2NCBkc3Rjb29raWUpOworCQkJICAgIGludCByZXNpZCwgc3RydWN0IGtpYl9yZG1hX2Rlc2MgKmRzdHJkLAorCQkJICAgIF9fdTY0IGRzdGNvb2tpZSk7CiBzdGF0aWMgdm9pZCBraWJsbmRfcXVldWVfdHhfbG9ja2VkKHN0cnVjdCBraWJfdHggKnR4LCBzdHJ1Y3Qga2liX2Nvbm4gKmNvbm4pOwogc3RhdGljIHZvaWQga2libG5kX3F1ZXVlX3R4KHN0cnVjdCBraWJfdHggKnR4LCBzdHJ1Y3Qga2liX2Nvbm4gKmNvbm4pOwogc3RhdGljIHZvaWQga2libG5kX3VubWFwX3R4KGxuZXRfbmlfdCAqbmksIHN0cnVjdCBraWJfdHggKnR4KTsKK3N0YXRpYyB2b2lkIGtpYmxuZF9jaGVja19zZW5kc19sb2NrZWQoc3RydWN0IGtpYl9jb25uICpjb25uKTsKIAogc3RhdGljIHZvaWQKIGtpYmxuZF90eF9kb25lKGxuZXRfbmlfdCAqbmksIHN0cnVjdCBraWJfdHggKnR4KQpAQCAtMjExLDkgKzIxNCw5IEBACiAJCWNvbm4tPmliY19vdXRzdGFuZGluZ19jcmVkaXRzKys7CiAJZWxzZQogCQljb25uLT5pYmNfcmVzZXJ2ZWRfY3JlZGl0cysrOworCWtpYmxuZF9jaGVja19zZW5kc19sb2NrZWQoY29ubik7CiAJc3Bpbl91bmxvY2soJmNvbm4tPmliY19sb2NrKTsKIAotCWtpYmxuZF9jaGVja19zZW5kcyhjb25uKTsKIG91dDoKIAlraWJsbmRfY29ubl9kZWNyZWYoY29ubik7CiAJcmV0dXJuIHJjOwpAQCAtMzQ0LDggKzM0Nyw4IEBACiAJCSAgICAhSUJMTkRfT09CX0NBUEFCTEUoY29ubi0+aWJjX3ZlcnNpb24pKSAvKiB2MSBvbmx5ICovCiAJCQljb25uLT5pYmNfb3V0c3RhbmRpbmdfY3JlZGl0cysrOwogCisJCWtpYmxuZF9jaGVja19zZW5kc19sb2NrZWQoY29ubik7CiAJCXNwaW5fdW5sb2NrKCZjb25uLT5pYmNfbG9jayk7Ci0JCWtpYmxuZF9jaGVja19zZW5kcyhjb25uKTsKIAl9CiAKIAlzd2l0Y2ggKG1zZy0+aWJtX3R5cGUpIHsKQEAgLTY0OCw3ICs2NTEsNyBAQAogCiBzdGF0aWMgaW50CiBraWJsbmRfc2V0dXBfcmRfaW92KGxuZXRfbmlfdCAqbmksIHN0cnVjdCBraWJfdHggKnR4LCBzdHJ1Y3Qga2liX3JkbWFfZGVzYyAqcmQsCi0JCSAgICB1bnNpZ25lZCBpbnQgbmlvdiwgc3RydWN0IGt2ZWMgKmlvdiwgaW50IG9mZnNldCwgaW50IG5vYikKKwkJICAgIHVuc2lnbmVkIGludCBuaW92LCBjb25zdCBzdHJ1Y3Qga3ZlYyAqaW92LCBpbnQgb2Zmc2V0LCBpbnQgbm9iKQogewogCXN0cnVjdCBraWJfbmV0ICpuZXQgPSBuaS0+bmlfZGF0YTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKQEAgLTcwNSw3ICs3MDgsNyBAQAogCiBzdGF0aWMgaW50CiBraWJsbmRfc2V0dXBfcmRfa2lvdihsbmV0X25pX3QgKm5pLCBzdHJ1Y3Qga2liX3R4ICp0eCwgc3RydWN0IGtpYl9yZG1hX2Rlc2MgKnJkLAotCQkgICAgIGludCBua2lvdiwgbG5ldF9raW92X3QgKmtpb3YsIGludCBvZmZzZXQsIGludCBub2IpCisJCSAgICAgaW50IG5raW92LCBjb25zdCBsbmV0X2tpb3ZfdCAqa2lvdiwgaW50IG9mZnNldCwgaW50IG5vYikKIHsKIAlzdHJ1Y3Qga2liX25ldCAqbmV0ID0gbmktPm5pX2RhdGE7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKQEAgLTcxNyw4ICs3MjAsOCBAQAogCUxBU1NFUlQobmtpb3YgPiAwKTsKIAlMQVNTRVJUKG5ldCk7CiAKLQl3aGlsZSAob2Zmc2V0ID49IGtpb3YtPmtpb3ZfbGVuKSB7Ci0JCW9mZnNldCAtPSBraW92LT5raW92X2xlbjsKKwl3aGlsZSAob2Zmc2V0ID49IGtpb3YtPmJ2X2xlbikgeworCQlvZmZzZXQgLT0ga2lvdi0+YnZfbGVuOwogCQlua2lvdi0tOwogCQlraW92Kys7CiAJCUxBU1NFUlQobmtpb3YgPiAwKTsKQEAgLTcyOCwxMCArNzMxLDEwIEBACiAJZG8gewogCQlMQVNTRVJUKG5raW92ID4gMCk7CiAKLQkJZnJhZ25vYiA9IG1pbigoaW50KShraW92LT5raW92X2xlbiAtIG9mZnNldCksIG5vYik7CisJCWZyYWdub2IgPSBtaW4oKGludCkoa2lvdi0+YnZfbGVuIC0gb2Zmc2V0KSwgbm9iKTsKIAotCQlzZ19zZXRfcGFnZShzZywga2lvdi0+a2lvdl9wYWdlLCBmcmFnbm9iLAotCQkJICAgIGtpb3YtPmtpb3Zfb2Zmc2V0ICsgb2Zmc2V0KTsKKwkJc2dfc2V0X3BhZ2Uoc2csIGtpb3YtPmJ2X3BhZ2UsIGZyYWdub2IsCisJCQkgICAga2lvdi0+YnZfb2Zmc2V0ICsgb2Zmc2V0KTsKIAkJc2cgPSBzZ19uZXh0KHNnKTsKIAkJaWYgKCFzZykgewogCQkJQ0VSUk9SKCJsYWNraW5nIGVub3VnaCBzZyBlbnRyaWVzIHRvIG1hcCB0eFxuIik7CkBAIC03NjEsNyArNzY0LDYgQEAKIAlMQVNTRVJUKHR4LT50eF9xdWV1ZWQpOwogCS8qIFdlIHJlbHkgb24gdGhpcyBmb3IgUVAgc2l6aW5nICovCiAJTEFTU0VSVCh0eC0+dHhfbndycSA+IDApOwotCUxBU1NFUlQodHgtPnR4X253cnEgPD0gMSArIGNvbm4tPmliY19tYXhfZnJhZ3MpOwogCiAJTEFTU0VSVCghY3JlZGl0IHx8IGNyZWRpdCA9PSAxKTsKIAlMQVNTRVJUKGNvbm4tPmliY19vdXRzdGFuZGluZ19jcmVkaXRzID49IDApOwpAQCAtODAwLDcgKzgwMiw3IEBACiAJICAgICAgY29ubi0+aWJjX25vb3BzX3Bvc3RlZCA9PSBJQkxORF9PT0JfTVNHUyh2ZXIpKSkpIHsKIAkJLyoKIAkJICogT0sgdG8gZHJvcCB3aGVuIHBvc3RlZCBlbm91Z2ggTk9PUHMsIHNpbmNlCi0JCSAqIGtpYmxuZF9jaGVja19zZW5kcyB3aWxsIHF1ZXVlIE5PT1AgYWdhaW4gd2hlbgorCQkgKiBraWJsbmRfY2hlY2tfc2VuZHNfbG9ja2VkIHdpbGwgcXVldWUgTk9PUCBhZ2FpbiB3aGVuCiAJCSAqIHBvc3RlZCBOT09QcyBjb21wbGV0ZQogCQkgKi8KIAkJc3Bpbl91bmxvY2soJmNvbm4tPmliY19sb2NrKTsKQEAgLTkwNSw3ICs5MDcsNyBAQAogfQogCiBzdGF0aWMgdm9pZAota2libG5kX2NoZWNrX3NlbmRzKHN0cnVjdCBraWJfY29ubiAqY29ubikKK2tpYmxuZF9jaGVja19zZW5kc19sb2NrZWQoc3RydWN0IGtpYl9jb25uICpjb25uKQogewogCWludCB2ZXIgPSBjb25uLT5pYmNfdmVyc2lvbjsKIAlsbmV0X25pX3QgKm5pID0gY29ubi0+aWJjX3BlZXItPmlicF9uaTsKQEAgLTkxOCw4ICs5MjAsNiBAQAogCQlyZXR1cm47CiAJfQogCi0Jc3Bpbl9sb2NrKCZjb25uLT5pYmNfbG9jayk7Ci0KIAlMQVNTRVJUKGNvbm4tPmliY19uc2VuZHNfcG9zdGVkIDw9IGtpYmxuZF9jb25jdXJyZW50X3NlbmRzKHZlciwgbmkpKTsKIAlMQVNTRVJUKCFJQkxORF9PT0JfQ0FQQUJMRSh2ZXIpIHx8CiAJCWNvbm4tPmliY19ub29wc19wb3N0ZWQgPD0gSUJMTkRfT09CX01TR1ModmVyKSk7CkBAIC05NjksOCArOTY5LDYgQEAKIAkJaWYgKGtpYmxuZF9wb3N0X3R4X2xvY2tlZChjb25uLCB0eCwgY3JlZGl0KSkKIAkJCWJyZWFrOwogCX0KLQotCXNwaW5fdW5sb2NrKCZjb25uLT5pYmNfbG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xMDE2LDE2ICsxMDE0LDExIEBACiAJaWYgKGlkbGUpCiAJCWxpc3RfZGVsKCZ0eC0+dHhfbGlzdCk7CiAKLQlraWJsbmRfY29ubl9hZGRyZWYoY29ubik7CSAgICAgICAvKiAxIHJlZiBmb3IgbWUuLi4uICovCi0KKwlraWJsbmRfY2hlY2tfc2VuZHNfbG9ja2VkKGNvbm4pOwogCXNwaW5fdW5sb2NrKCZjb25uLT5pYmNfbG9jayk7CiAKIAlpZiAoaWRsZSkKIAkJa2libG5kX3R4X2RvbmUoY29ubi0+aWJjX3BlZXItPmlicF9uaSwgdHgpOwotCi0Ja2libG5kX2NoZWNrX3NlbmRzKGNvbm4pOwotCi0Ja2libG5kX2Nvbm5fZGVjcmVmKGNvbm4pOwkgICAgICAgLyogLi4udW50aWwgaGVyZSAqLwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTA3OCw2ICsxMDcxLDE1IEBACiAJTEFTU0VSVCh0eXBlID09IElCTE5EX01TR19HRVRfRE9ORSB8fAogCQl0eXBlID09IElCTE5EX01TR19QVVRfRE9ORSk7CiAKKwlpZiAoa2libG5kX3JkX3NpemUoc3JjcmQpID4gY29ubi0+aWJjX21heF9mcmFncyA8PCBQQUdFX1NISUZUKSB7CisJCUNFUlJPUigiUkRNQSBpcyB0b28gbGFyZ2UgZm9yIHBlZXIgJXMgKCVkKSwgc3JjIHNpemU6ICVkIGRzdCBzaXplOiAlZFxuIiwKKwkJICAgICAgIGxpYmNmc19uaWQyc3RyKGNvbm4tPmliY19wZWVyLT5pYnBfbmlkKSwKKwkJICAgICAgIGNvbm4tPmliY19tYXhfZnJhZ3MgPDwgUEFHRV9TSElGVCwKKwkJICAgICAgIGtpYmxuZF9yZF9zaXplKHNyY3JkKSwga2libG5kX3JkX3NpemUoZHN0cmQpKTsKKwkJcmMgPSAtRU1TR1NJWkU7CisJCWdvdG8gdG9vX2JpZzsKKwl9CisKIAl3aGlsZSAocmVzaWQgPiAwKSB7CiAJCWlmIChzcmNpZHggPj0gc3JjcmQtPnJkX25mcmFncykgewogCQkJQ0VSUk9SKCJTcmMgYnVmZmVyIGV4aGF1c3RlZDogJWQgZnJhZ3NcbiIsIHNyY2lkeCk7CkBAIC0xMDkxLDEwICsxMDkzLDEwIEBACiAJCQlicmVhazsKIAkJfQogCi0JCWlmICh0eC0+dHhfbndycSA+PSBjb25uLT5pYmNfbWF4X2ZyYWdzKSB7CisJCWlmICh0eC0+dHhfbndycSA+PSBJQkxORF9NQVhfUkRNQV9GUkFHUykgewogCQkJQ0VSUk9SKCJSRE1BIGhhcyB0b28gbWFueSBmcmFnbWVudHMgZm9yIHBlZXIgJXMgKCVkKSwgc3JjIGlkeC9mcmFnczogJWQvJWQgZHN0IGlkeC9mcmFnczogJWQvJWRcbiIsCiAJCQkgICAgICAgbGliY2ZzX25pZDJzdHIoY29ubi0+aWJjX3BlZXItPmlicF9uaWQpLAotCQkJICAgICAgIGNvbm4tPmliY19tYXhfZnJhZ3MsCisJCQkgICAgICAgSUJMTkRfTUFYX1JETUFfRlJBR1MsCiAJCQkgICAgICAgc3JjaWR4LCBzcmNyZC0+cmRfbmZyYWdzLAogCQkJICAgICAgIGRzdGlkeCwgZHN0cmQtPnJkX25mcmFncyk7CiAJCQlyYyA9IC1FTVNHU0laRTsKQEAgLTExMzIsNyArMTEzNCw3IEBACiAJCXdycSsrOwogCQlzZ2UrKzsKIAl9Ci0KK3Rvb19iaWc6CiAJaWYgKHJjIDwgMCkJCQkgICAgIC8qIG5vIFJETUEgaWYgY29tcGxldGluZyB3aXRoIGZhaWx1cmUgKi8KIAkJdHgtPnR4X253cnEgPSAwOwogCkBAIC0xMjA0LDkgKzEyMDYsOCBAQAogewogCXNwaW5fbG9jaygmY29ubi0+aWJjX2xvY2spOwogCWtpYmxuZF9xdWV1ZV90eF9sb2NrZWQodHgsIGNvbm4pOworCWtpYmxuZF9jaGVja19zZW5kc19sb2NrZWQoY29ubik7CiAJc3Bpbl91bmxvY2soJmNvbm4tPmliY19sb2NrKTsKLQotCWtpYmxuZF9jaGVja19zZW5kcyhjb25uKTsKIH0KIAogc3RhdGljIGludCBraWJsbmRfcmVzb2x2ZV9hZGRyKHN0cnVjdCByZG1hX2NtX2lkICpjbWlkLApAQCAtMTQ5OSw2ICsxNTAwLDcgQEAKIAlsbmV0X2tpb3ZfdCAqcGF5bG9hZF9raW92ID0gbG50bXNnLT5tc2dfa2lvdjsKIAl1bnNpZ25lZCBpbnQgcGF5bG9hZF9vZmZzZXQgPSBsbnRtc2ctPm1zZ19vZmZzZXQ7CiAJdW5zaWduZWQgaW50IHBheWxvYWRfbm9iID0gbG50bXNnLT5tc2dfbGVuOworCXN0cnVjdCBpb3ZfaXRlciBmcm9tOwogCXN0cnVjdCBraWJfbXNnICppYm1zZzsKIAlzdHJ1Y3Qga2liX3JkbWFfZGVzYyAgKnJkOwogCXN0cnVjdCBraWJfdHggKnR4OwpAQCAtMTUxOCw2ICsxNTIwLDE3IEBACiAJLyogcGF5bG9hZCBpcyBlaXRoZXIgYWxsIHZhZGRycyBvciBhbGwgcGFnZXMgKi8KIAlMQVNTRVJUKCEocGF5bG9hZF9raW92ICYmIHBheWxvYWRfaW92KSk7CiAKKwlpZiAocGF5bG9hZF9raW92KQorCQlpb3ZfaXRlcl9idmVjKCZmcm9tLCBJVEVSX0JWRUMgfCBXUklURSwKKwkJCSAgICAgIHBheWxvYWRfa2lvdiwgcGF5bG9hZF9uaW92LAorCQkJICAgICAgcGF5bG9hZF9ub2IgKyBwYXlsb2FkX29mZnNldCk7CisJZWxzZQorCQlpb3ZfaXRlcl9rdmVjKCZmcm9tLCBJVEVSX0tWRUMgfCBXUklURSwKKwkJCSAgICAgIHBheWxvYWRfaW92LCBwYXlsb2FkX25pb3YsCisJCQkgICAgICBwYXlsb2FkX25vYiArIHBheWxvYWRfb2Zmc2V0KTsKKworCWlvdl9pdGVyX2FkdmFuY2UoJmZyb20sIHBheWxvYWRfb2Zmc2V0KTsKKwogCXN3aXRjaCAodHlwZSkgewogCWRlZmF1bHQ6CiAJCUxCVUcoKTsKQEAgLTE2MzcsMTcgKzE2NTAsOCBAQAogCWlibXNnID0gdHgtPnR4X21zZzsKIAlpYm1zZy0+aWJtX3UuaW1tZWRpYXRlLmliaW1faGRyID0gKmhkcjsKIAotCWlmIChwYXlsb2FkX2tpb3YpCi0JCWxuZXRfY29weV9raW92MmZsYXQoSUJMTkRfTVNHX1NJWkUsIGlibXNnLAotCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3Qga2liX21zZywgaWJtX3UuaW1tZWRpYXRlLmliaW1fcGF5bG9hZCksCi0JCQkJICAgIHBheWxvYWRfbmlvdiwgcGF5bG9hZF9raW92LAotCQkJCSAgICBwYXlsb2FkX29mZnNldCwgcGF5bG9hZF9ub2IpOwotCWVsc2UKLQkJbG5ldF9jb3B5X2lvdjJmbGF0KElCTE5EX01TR19TSVpFLCBpYm1zZywKLQkJCQkgICBvZmZzZXRvZihzdHJ1Y3Qga2liX21zZywgaWJtX3UuaW1tZWRpYXRlLmliaW1fcGF5bG9hZCksCi0JCQkJICAgcGF5bG9hZF9uaW92LCBwYXlsb2FkX2lvdiwKLQkJCQkgICBwYXlsb2FkX29mZnNldCwgcGF5bG9hZF9ub2IpOwotCisJY29weV9mcm9tX2l0ZXIoJmlibXNnLT5pYm1fdS5pbW1lZGlhdGUuaWJpbV9wYXlsb2FkLCBJQkxORF9NU0dfU0laRSwKKwkJICAgICAgICZmcm9tKTsKIAlub2IgPSBvZmZzZXRvZihzdHJ1Y3Qga2liX2ltbWVkaWF0ZV9tc2csIGliaW1fcGF5bG9hZFtwYXlsb2FkX25vYl0pOwogCWtpYmxuZF9pbml0X3R4X21zZyhuaSwgdHgsIElCTE5EX01TR19JTU1FRElBVEUsIG5vYik7CiAKQEAgLTE3MTksOCArMTcyMyw3IEBACiAKIGludAoga2libG5kX3JlY3YobG5ldF9uaV90ICpuaSwgdm9pZCAqcHJpdmF0ZSwgbG5ldF9tc2dfdCAqbG50bXNnLCBpbnQgZGVsYXllZCwKLQkgICAgdW5zaWduZWQgaW50IG5pb3YsIHN0cnVjdCBrdmVjICppb3YsIGxuZXRfa2lvdl90ICpraW92LAotCSAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbWxlbiwgdW5zaWduZWQgaW50IHJsZW4pCisJICAgIHN0cnVjdCBpb3ZfaXRlciAqdG8sIHVuc2lnbmVkIGludCBybGVuKQogewogCXN0cnVjdCBraWJfcnggKnJ4ID0gcHJpdmF0ZTsKIAlzdHJ1Y3Qga2liX21zZyAqcnhtc2cgPSByeC0+cnhfbXNnOwpAQCAtMTczMCwxMCArMTczMyw5IEBACiAJaW50IHBvc3RfY3JlZGl0ID0gSUJMTkRfUE9TVFJYX1BFRVJfQ1JFRElUOwogCWludCByYyA9IDA7CiAKLQlMQVNTRVJUKG1sZW4gPD0gcmxlbik7CisJTEFTU0VSVChpb3ZfaXRlcl9jb3VudCh0bykgPD0gcmxlbik7CiAJTEFTU0VSVCghaW5faW50ZXJydXB0KCkpOwogCS8qIEVpdGhlciBhbGwgcGFnZXMgb3IgYWxsIHZhZGRycyAqLwotCUxBU1NFUlQoIShraW92ICYmIGlvdikpOwogCiAJc3dpdGNoIChyeG1zZy0+aWJtX3R5cGUpIHsKIAlkZWZhdWx0OgpAQCAtMTc0OSwxNiArMTc1MSw4IEBACiAJCQlicmVhazsKIAkJfQogCi0JCWlmIChraW92KQotCQkJbG5ldF9jb3B5X2ZsYXQya2lvdihuaW92LCBraW92LCBvZmZzZXQsCi0JCQkJCSAgICBJQkxORF9NU0dfU0laRSwgcnhtc2csCi0JCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3Qga2liX21zZywgaWJtX3UuaW1tZWRpYXRlLmliaW1fcGF5bG9hZCksCi0JCQkJCSAgICBtbGVuKTsKLQkJZWxzZQotCQkJbG5ldF9jb3B5X2ZsYXQyaW92KG5pb3YsIGlvdiwgb2Zmc2V0LAotCQkJCQkgICBJQkxORF9NU0dfU0laRSwgcnhtc2csCi0JCQkJCSAgIG9mZnNldG9mKHN0cnVjdCBraWJfbXNnLCBpYm1fdS5pbW1lZGlhdGUuaWJpbV9wYXlsb2FkKSwKLQkJCQkJICAgbWxlbik7CisJCWNvcHlfdG9faXRlcigmcnhtc2ctPmlibV91LmltbWVkaWF0ZS5pYmltX3BheWxvYWQsCisJCQkgICAgIElCTE5EX01TR19TSVpFLCB0byk7CiAJCWxuZXRfZmluYWxpemUobmksIGxudG1zZywgMCk7CiAJCWJyZWFrOwogCkBAIC0xNzY2LDcgKzE3NjAsNyBAQAogCQlzdHJ1Y3Qga2liX21zZwkqdHhtc2c7CiAJCXN0cnVjdCBraWJfcmRtYV9kZXNjICpyZDsKIAotCQlpZiAoIW1sZW4pIHsKKwkJaWYgKCFpb3ZfaXRlcl9jb3VudCh0bykpIHsKIAkJCWxuZXRfZmluYWxpemUobmksIGxudG1zZywgMCk7CiAJCQlraWJsbmRfc2VuZF9jb21wbGV0aW9uKHJ4LT5yeF9jb25uLCBJQkxORF9NU0dfUFVUX05BSywgMCwKIAkJCQkJICAgICAgIHJ4bXNnLT5pYm1fdS5wdXRyZXEuaWJwcm1fY29va2llKTsKQEAgLTE3ODQsMTIgKzE3NzgsMTYgQEAKIAogCQl0eG1zZyA9IHR4LT50eF9tc2c7CiAJCXJkID0gJnR4bXNnLT5pYm1fdS5wdXRhY2suaWJwYW1fcmQ7Ci0JCWlmICgha2lvdikKKwkJaWYgKCEodG8tPnR5cGUgJiBJVEVSX0JWRUMpKQogCQkJcmMgPSBraWJsbmRfc2V0dXBfcmRfaW92KG5pLCB0eCwgcmQsCi0JCQkJCQkgbmlvdiwgaW92LCBvZmZzZXQsIG1sZW4pOworCQkJCQkJIHRvLT5ucl9zZWdzLCB0by0+a3ZlYywKKwkJCQkJCSB0by0+aW92X29mZnNldCwKKwkJCQkJCSBpb3ZfaXRlcl9jb3VudCh0bykpOwogCQllbHNlCiAJCQlyYyA9IGtpYmxuZF9zZXR1cF9yZF9raW92KG5pLCB0eCwgcmQsCi0JCQkJCQkgIG5pb3YsIGtpb3YsIG9mZnNldCwgbWxlbik7CisJCQkJCQkgIHRvLT5ucl9zZWdzLCB0by0+YnZlYywKKwkJCQkJCSAgdG8tPmlvdl9vZmZzZXQsCisJCQkJCQkgIGlvdl9pdGVyX2NvdW50KHRvKSk7CiAJCWlmIChyYykgewogCQkJQ0VSUk9SKCJDYW4ndCBzZXR1cCBQVVQgc2luayBmb3IgJXM6ICVkXG4iLAogCQkJICAgICAgIGxpYmNmc19uaWQyc3RyKGNvbm4tPmliY19wZWVyLT5pYnBfbmlkKSwgcmMpOwpAQCAtMjE4MywxNCArMjE4MSwxMSBAQAogCQlyZXR1cm47CiAJfQogCi0JLyoqCi0JICogcmVmY291bnQgdGFrZW4gYnkgY21pZCBpcyBub3QgcmVsaWFibGUgYWZ0ZXIgSSByZWxlYXNlZCB0aGUgZ2xvY2sKLQkgKiBiZWNhdXNlIHRoaXMgY29ubmVjdGlvbiBpcyB2aXNpYmxlIHRvIG90aGVyIHRocmVhZHMgbm93LCBhbm90aGVyCi0JICogdGhyZWFkIGNhbiBmaW5kIGFuZCBjbG9zZSB0aGlzIGNvbm5lY3Rpb24gcmlnaHQgYWZ0ZXIgSSByZWxlYXNlZAotCSAqIHRoZSBnbG9jaywgaWYga2libG5kX2NtX2NhbGxiYWNrIGZvciBSRE1BX0NNX0VWRU5UX0RJU0NPTk5FQ1RFRCBpcwotCSAqIGNhbGxlZCwgaXQgY2FuIHJlbGVhc2UgdGhlIGNvbm5lY3Rpb24gcmVmY291bnQgdGFrZW4gYnkgY21pZC4KLQkgKiBJdCBtZWFucyB0aGUgY29ubmVjdGlvbiBjb3VsZCBiZSBkZXN0cm95ZWQgYmVmb3JlIEkgZmluaXNoIG15Ci0JICogb3BlcmF0aW9ucyBvbiBpdC4KKwkvKgorCSAqICsxIHJlZiBmb3IgbXlzZWxmLCB0aGlzIGNvbm5lY3Rpb24gaXMgdmlzaWJsZSB0byBvdGhlciB0aHJlYWRzCisJICogbm93LCByZWZjb3VudCBvZiBwZWVyOmlicF9jb25ucyBjYW4gYmUgcmVsZWFzZWQgYnkgY29ubmVjdGlvbgorCSAqIGNsb3NlIGZyb20gZWl0aGVyIGEgZGlmZmVyZW50IHRocmVhZCwgb3IgdGhlIGNhbGxpbmcgb2YKKwkgKiBraWJsbmRfY2hlY2tfc2VuZHNfbG9ja2VkKCkgYmVsb3cuIFNlZSBiejIxOTExIGZvciBkZXRhaWxzLgogCSAqLwogCWtpYmxuZF9jb25uX2FkZHJlZihjb25uKTsKIAl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgma2libG5kX2RhdGEua2liX2dsb2JhbF9sb2NrLCBmbGFncyk7CkBAIC0yMjAyLDEwICsyMTk3LDkgQEAKIAogCQlraWJsbmRfcXVldWVfdHhfbG9ja2VkKHR4LCBjb25uKTsKIAl9CisJa2libG5kX2NoZWNrX3NlbmRzX2xvY2tlZChjb25uKTsKIAlzcGluX3VubG9jaygmY29ubi0+aWJjX2xvY2spOwogCi0Ja2libG5kX2NoZWNrX3NlbmRzKGNvbm4pOwotCiAJLyogc2NoZWR1bGUgYmxvY2tlZCByeHMgKi8KIAlraWJsbmRfaGFuZGxlX2Vhcmx5X3J4cyhjb25uKTsKIApAQCAtMjI0MCw2ICsyMjM0LDcgQEAKIAlzdHJ1Y3Qga2liX3JlaiByZWo7CiAJaW50IHZlcnNpb24gPSBJQkxORF9NU0dfVkVSU0lPTjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBtYXhfZnJhZ3M7CiAJaW50IHJjOwogCXN0cnVjdCBzb2NrYWRkcl9pbiAqcGVlcl9hZGRyOwogCkBAIC0yMzQ2LDIyICsyMzQxLDIwIEBACiAJCWdvdG8gZmFpbGVkOwogCX0KIAotCWlmIChyZXFtc2ctPmlibV91LmNvbm5wYXJhbXMuaWJjcF9tYXhfZnJhZ3MgPgotCSAgICBraWJsbmRfcmRtYV9mcmFncyh2ZXJzaW9uLCBuaSkpIHsKLQkJQ1dBUk4oIkNhbid0IGFjY2VwdCBjb25uIGZyb20gJXMgKHZlcnNpb24gJXgpOiBtYXhfZnJhZ3MgJWQgdG9vIGxhcmdlICglZCB3YW50ZWQpXG4iLAotCQkgICAgICBsaWJjZnNfbmlkMnN0cihuaWQpLCB2ZXJzaW9uLAotCQkgICAgICByZXFtc2ctPmlibV91LmNvbm5wYXJhbXMuaWJjcF9tYXhfZnJhZ3MsCisJbWF4X2ZyYWdzID0gcmVxbXNnLT5pYm1fdS5jb25ucGFyYW1zLmliY3BfbWF4X2ZyYWdzID4+IElCTE5EX0ZSQUdfU0hJRlQ7CisJaWYgKG1heF9mcmFncyA+IGtpYmxuZF9yZG1hX2ZyYWdzKHZlcnNpb24sIG5pKSkgeworCQlDV0FSTigiQ2FuJ3QgYWNjZXB0IGNvbm4gZnJvbSAlcyAodmVyc2lvbiAleCk6IG1heCBtZXNzYWdlIHNpemUgJWQgaXMgdG9vIGxhcmdlICglZCB3YW50ZWQpXG4iLAorCQkgICAgICBsaWJjZnNfbmlkMnN0cihuaWQpLCB2ZXJzaW9uLCBtYXhfZnJhZ3MsCiAJCSAgICAgIGtpYmxuZF9yZG1hX2ZyYWdzKHZlcnNpb24sIG5pKSk7CiAKIAkJaWYgKHZlcnNpb24gPj0gSUJMTkRfTVNHX1ZFUlNJT04pCiAJCQlyZWouaWJyX3doeSA9IElCTE5EX1JFSkVDVF9SRE1BX0ZSQUdTOwogCiAJCWdvdG8gZmFpbGVkOwotCX0gZWxzZSBpZiAocmVxbXNnLT5pYm1fdS5jb25ucGFyYW1zLmliY3BfbWF4X2ZyYWdzIDwKLQkJICAga2libG5kX3JkbWFfZnJhZ3ModmVyc2lvbiwgbmkpICYmICFuZXQtPmlibl9mbXJfcHMpIHsKLQkJQ1dBUk4oIkNhbid0IGFjY2VwdCBjb25uIGZyb20gJXMgKHZlcnNpb24gJXgpOiBtYXhfZnJhZ3MgJWQgaW5jb21wYXRpYmxlIHdpdGhvdXQgRk1SIHBvb2wgKCVkIHdhbnRlZClcbiIsCi0JCSAgICAgIGxpYmNmc19uaWQyc3RyKG5pZCksIHZlcnNpb24sCi0JCSAgICAgIHJlcW1zZy0+aWJtX3UuY29ubnBhcmFtcy5pYmNwX21heF9mcmFncywKKwl9IGVsc2UgaWYgKG1heF9mcmFncyA8IGtpYmxuZF9yZG1hX2ZyYWdzKHZlcnNpb24sIG5pKSAmJgorCQkgICAhbmV0LT5pYm5fZm1yX3BzKSB7CisJCUNXQVJOKCJDYW4ndCBhY2NlcHQgY29ubiBmcm9tICVzICh2ZXJzaW9uICV4KTogbWF4IG1lc3NhZ2Ugc2l6ZSAlZCBpbmNvbXBhdGlibGUgd2l0aG91dCBGTVIgcG9vbCAoJWQgd2FudGVkKVxuIiwKKwkJICAgICAgbGliY2ZzX25pZDJzdHIobmlkKSwgdmVyc2lvbiwgbWF4X2ZyYWdzLAogCQkgICAgICBraWJsbmRfcmRtYV9mcmFncyh2ZXJzaW9uLCBuaSkpOwogCiAJCWlmICh2ZXJzaW9uID09IElCTE5EX01TR19WRVJTSU9OKQpAQCAtMjM4Nyw3ICsyMzgwLDcgQEAKIAl9CiAKIAkvKiBXZSBoYXZlIHZhbGlkYXRlZCB0aGUgcGVlcidzIHBhcmFtZXRlcnMgc28gdXNlIHRob3NlICovCi0JcGVlci0+aWJwX21heF9mcmFncyA9IHJlcW1zZy0+aWJtX3UuY29ubnBhcmFtcy5pYmNwX21heF9mcmFnczsKKwlwZWVyLT5pYnBfbWF4X2ZyYWdzID0gbWF4X2ZyYWdzOwogCXBlZXItPmlicF9xdWV1ZV9kZXB0aCA9IHJlcW1zZy0+aWJtX3UuY29ubnBhcmFtcy5pYmNwX3F1ZXVlX2RlcHRoOwogCiAJd3JpdGVfbG9ja19pcnFzYXZlKGdfbG9jaywgZmxhZ3MpOwpAQCAtMjQxOSwyMyArMjQxMiwzNyBAQAogCQkJZ290byBmYWlsZWQ7CiAJCX0KIAotCQkvKiB0aWUtYnJlYWsgY29ubmVjdGlvbiByYWNlIGluIGZhdm91ciBvZiB0aGUgaGlnaGVyIE5JRCAqLworCQkvKgorCQkgKiBUaWUtYnJlYWsgY29ubmVjdGlvbiByYWNlIGluIGZhdm91ciBvZiB0aGUgaGlnaGVyIE5JRC4KKwkJICogSWYgd2Uga2VlcCBydW5uaW5nIGludG8gYSByYWNlIGNvbmRpdGlvbiBtdWx0aXBsZSB0aW1lcywKKwkJICogd2UgaGF2ZSB0byBhc3N1bWUgdGhhdCB0aGUgY29ubmVjdGlvbiBhdHRlbXB0IHdpdGggdGhlCisJCSAqIGhpZ2hlciBOSUQgaXMgc3R1Y2sgaW4gYSBjb25uZWN0aW5nIHN0YXRlIGFuZCB3aWxsIG5ldmVyCisJCSAqIHJlY292ZXIuICBBcyBzdWNoLCB3ZSBwYXNzIHRocm91Z2ggdGhpcyBpZi1ibG9jayBhbmQgbGV0CisJCSAqIHRoZSBsb3dlciBOSUQgY29ubmVjdGlvbiB3aW4gc28gd2UgY2FuIG1vdmUgZm9yd2FyZC4KKwkJICovCiAJCWlmIChwZWVyMi0+aWJwX2Nvbm5lY3RpbmcgJiYKLQkJICAgIG5pZCA8IG5pLT5uaV9uaWQpIHsKKwkJICAgIG5pZCA8IG5pLT5uaV9uaWQgJiYgcGVlcjItPmlicF9yYWNlcyA8CisJCSAgICBNQVhfQ09OTl9SQUNFU19CRUZPUkVfQUJPUlQpIHsKKwkJCXBlZXIyLT5pYnBfcmFjZXMrKzsKIAkJCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKGdfbG9jaywgZmxhZ3MpOwogCi0JCQlDV0FSTigiQ29ubiByYWNlICVzXG4iLCBsaWJjZnNfbmlkMnN0cihwZWVyMi0+aWJwX25pZCkpOworCQkJQ0RFQlVHKERfTkVULCAiQ29ubiByYWNlICVzXG4iLAorCQkJICAgICAgIGxpYmNmc19uaWQyc3RyKHBlZXIyLT5pYnBfbmlkKSk7CiAKIAkJCWtpYmxuZF9wZWVyX2RlY3JlZihwZWVyKTsKIAkJCXJlai5pYnJfd2h5ID0gSUJMTkRfUkVKRUNUX0NPTk5fUkFDRTsKIAkJCWdvdG8gZmFpbGVkOwogCQl9Ci0KKwkJaWYgKHBlZXIyLT5pYnBfcmFjZXMgPj0gTUFYX0NPTk5fUkFDRVNfQkVGT1JFX0FCT1JUKQorCQkJQ05FVEVSUigiQ29ubiByYWNlICVzOiB1bnJlc29sdmVkIGFmdGVyICVkIGF0dGVtcHRzLCBsZXR0aW5nIGxvd2VyIE5JRCB3aW5cbiIsCisJCQkJbGliY2ZzX25pZDJzdHIocGVlcjItPmlicF9uaWQpLAorCQkJCU1BWF9DT05OX1JBQ0VTX0JFRk9SRV9BQk9SVCk7CiAJCS8qKgogCQkgKiBwYXNzaXZlIGNvbm5lY3Rpb24gaXMgYWxsb3dlZCBldmVuIHRoaXMgcGVlciBpcyB3YWl0aW5nIGZvcgogCQkgKiByZWNvbm5lY3Rpb24uCiAJCSAqLwogCQlwZWVyMi0+aWJwX3JlY29ubmVjdGluZyA9IDA7CisJCXBlZXIyLT5pYnBfcmFjZXMgPSAwOwogCQlwZWVyMi0+aWJwX2FjY2VwdGluZysrOwogCQlraWJsbmRfcGVlcl9hZGRyZWYocGVlcjIpOwogCkBAIC0yNDk0LDcgKzI1MDEsNyBAQAogCWtpYmxuZF9pbml0X21zZyhhY2ttc2csIElCTE5EX01TR19DT05OQUNLLAogCQkJc2l6ZW9mKGFja21zZy0+aWJtX3UuY29ubnBhcmFtcykpOwogCWFja21zZy0+aWJtX3UuY29ubnBhcmFtcy5pYmNwX3F1ZXVlX2RlcHRoID0gY29ubi0+aWJjX3F1ZXVlX2RlcHRoOwotCWFja21zZy0+aWJtX3UuY29ubnBhcmFtcy5pYmNwX21heF9mcmFncyA9IGNvbm4tPmliY19tYXhfZnJhZ3M7CisJYWNrbXNnLT5pYm1fdS5jb25ucGFyYW1zLmliY3BfbWF4X2ZyYWdzID0gY29ubi0+aWJjX21heF9mcmFncyA8PCBJQkxORF9GUkFHX1NISUZUOwogCWFja21zZy0+aWJtX3UuY29ubnBhcmFtcy5pYmNwX21heF9tc2dfc2l6ZSA9IElCTE5EX01TR19TSVpFOwogCiAJa2libG5kX3BhY2tfbXNnKG5pLCBhY2ttc2csIHZlcnNpb24sIDAsIG5pZCwgcmVxbXNnLT5pYm1fc3Jjc3RhbXApOwpAQCAtMjUyNiw5ICsyNTMzLDkgQEAKIAogIGZhaWxlZDoKIAlpZiAobmkpIHsKLQkJbG5ldF9uaV9kZWNyZWYobmkpOwogCQlyZWouaWJyX2NwLmliY3BfcXVldWVfZGVwdGggPSBraWJsbmRfbXNnX3F1ZXVlX3NpemUodmVyc2lvbiwgbmkpOwogCQlyZWouaWJyX2NwLmliY3BfbWF4X2ZyYWdzID0ga2libG5kX3JkbWFfZnJhZ3ModmVyc2lvbiwgbmkpOworCQlsbmV0X25pX2RlY3JlZihuaSk7CiAJfQogCiAJcmVqLmlicl92ZXJzaW9uICAgICAgICAgICAgID0gdmVyc2lvbjsKQEAgLTI1NTYsNyArMjU2Myw3IEBACiAKIAlpZiAoY3ApIHsKIAkJbXNnX3NpemUgPSBjcC0+aWJjcF9tYXhfbXNnX3NpemU7Ci0JCWZyYWdfbnVtID0gY3AtPmliY3BfbWF4X2ZyYWdzOworCQlmcmFnX251bQk9IGNwLT5pYmNwX21heF9mcmFncyA8PCBJQkxORF9GUkFHX1NISUZUOwogCQlxdWV1ZV9kZXAgPSBjcC0+aWJjcF9xdWV1ZV9kZXB0aDsKIAl9CiAKQEAgLTI4MjEsMTEgKzI4MjgsMTEgQEAKIAkJZ290byBmYWlsZWQ7CiAJfQogCi0JaWYgKG1zZy0+aWJtX3UuY29ubnBhcmFtcy5pYmNwX21heF9mcmFncyA+CisJaWYgKChtc2ctPmlibV91LmNvbm5wYXJhbXMuaWJjcF9tYXhfZnJhZ3MgPj4gSUJMTkRfRlJBR19TSElGVCkgPgogCSAgICBjb25uLT5pYmNfbWF4X2ZyYWdzKSB7CiAJCUNFUlJPUigiJXMgaGFzIGluY29tcGF0aWJsZSBtYXhfZnJhZ3MgJWQgKDw9JWQgd2FudGVkKVxuIiwKIAkJICAgICAgIGxpYmNmc19uaWQyc3RyKHBlZXItPmlicF9uaWQpLAotCQkgICAgICAgbXNnLT5pYm1fdS5jb25ucGFyYW1zLmliY3BfbWF4X2ZyYWdzLAorCQkgICAgICAgbXNnLT5pYm1fdS5jb25ucGFyYW1zLmliY3BfbWF4X2ZyYWdzID4+IElCTE5EX0ZSQUdfU0hJRlQsCiAJCSAgICAgICBjb25uLT5pYmNfbWF4X2ZyYWdzKTsKIAkJcmMgPSAtRVBST1RPOwogCQlnb3RvIGZhaWxlZDsKQEAgLTI4NTksNyArMjg2Niw3IEBACiAJY29ubi0+aWJjX2NyZWRpdHMgPSBtc2ctPmlibV91LmNvbm5wYXJhbXMuaWJjcF9xdWV1ZV9kZXB0aDsKIAljb25uLT5pYmNfcmVzZXJ2ZWRfY3JlZGl0cyA9IG1zZy0+aWJtX3UuY29ubnBhcmFtcy5pYmNwX3F1ZXVlX2RlcHRoOwogCWNvbm4tPmliY19xdWV1ZV9kZXB0aCA9IG1zZy0+aWJtX3UuY29ubnBhcmFtcy5pYmNwX3F1ZXVlX2RlcHRoOwotCWNvbm4tPmliY19tYXhfZnJhZ3MgPSBtc2ctPmlibV91LmNvbm5wYXJhbXMuaWJjcF9tYXhfZnJhZ3M7CisJY29ubi0+aWJjX21heF9mcmFncyA9IG1zZy0+aWJtX3UuY29ubnBhcmFtcy5pYmNwX21heF9mcmFncyA+PiBJQkxORF9GUkFHX1NISUZUOwogCUxBU1NFUlQoY29ubi0+aWJjX2NyZWRpdHMgKyBjb25uLT5pYmNfcmVzZXJ2ZWRfY3JlZGl0cyArCiAJCUlCTE5EX09PQl9NU0dTKHZlcikgPD0gSUJMTkRfUlhfTVNHUyhjb25uKSk7CiAKQEAgLTI5MTYsNyArMjkyMyw3IEBACiAJbWVtc2V0KG1zZywgMCwgc2l6ZW9mKCptc2cpKTsKIAlraWJsbmRfaW5pdF9tc2cobXNnLCBJQkxORF9NU0dfQ09OTlJFUSwgc2l6ZW9mKG1zZy0+aWJtX3UuY29ubnBhcmFtcykpOwogCW1zZy0+aWJtX3UuY29ubnBhcmFtcy5pYmNwX3F1ZXVlX2RlcHRoID0gY29ubi0+aWJjX3F1ZXVlX2RlcHRoOwotCW1zZy0+aWJtX3UuY29ubnBhcmFtcy5pYmNwX21heF9mcmFncyA9IGNvbm4tPmliY19tYXhfZnJhZ3M7CisJbXNnLT5pYm1fdS5jb25ucGFyYW1zLmliY3BfbWF4X2ZyYWdzID0gY29ubi0+aWJjX21heF9mcmFncyA8PCBJQkxORF9GUkFHX1NISUZUOwogCW1zZy0+aWJtX3UuY29ubnBhcmFtcy5pYmNwX21heF9tc2dfc2l6ZSA9IElCTE5EX01TR19TSVpFOwogCiAJa2libG5kX3BhY2tfbXNnKHBlZXItPmlicF9uaSwgbXNnLCB2ZXJzaW9uLApAQCAtMzIzMyw3ICszMjQwLDExIEBACiAJICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNvbm4sIHRlbXAsICZjaGVja3NlbmRzLCBpYmNfY29ubmRfbGlzdCkgewogCQlsaXN0X2RlbCgmY29ubi0+aWJjX2Nvbm5kX2xpc3QpOwotCQlraWJsbmRfY2hlY2tfc2VuZHMoY29ubik7CisKKwkJc3Bpbl9sb2NrKCZjb25uLT5pYmNfbG9jayk7CisJCWtpYmxuZF9jaGVja19zZW5kc19sb2NrZWQoY29ubik7CisJCXNwaW5fdW5sb2NrKCZjb25uLT5pYmNfbG9jayk7CisKIAkJa2libG5kX2Nvbm5fZGVjcmVmKGNvbm4pOwogCX0KIH0KQEAgLTM0MTksNiArMzQzMCwxMiBAQAogCWNhc2UgSUJfRVZFTlRfQ09NTV9FU1Q6CiAJCUNERUJVRyhEX05FVCwgIiVzIGVzdGFibGlzaGVkXG4iLAogCQkgICAgICAgbGliY2ZzX25pZDJzdHIoY29ubi0+aWJjX3BlZXItPmlicF9uaWQpKTsKKwkJLyoKKwkJICogV2UgcmVjZWl2ZWQgYSBwYWNrZXQgYnV0IGNvbm5lY3Rpb24gaXNuJ3QgZXN0YWJsaXNoZWQKKwkJICogcHJvYmFibHkgaGFuZHNoYWtlIHBhY2tldCB3YXMgbG9zdCwgc28gZnJlZSB0bworCQkgKiBmb3JjZSBtYWtlIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQKKwkJICovCisJCXJkbWFfbm90aWZ5KGNvbm4tPmliY19jbWlkLCBJQl9FVkVOVF9DT01NX0VTVCk7CiAJCXJldHVybjsKIAogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kLmMKaW5kZXggMDdlYzU0MC4uY2JjOWE5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmQuYwpAQCAtMTQ2OCwxMSArMTQ2OCw2IEBACiAKIAkJY29ubi0+a3NuY19yb3V0ZSA9IE5VTEw7CiAKLSNpZiAwCSAgIC8qIGlycmVsZXZhbnQgd2l0aCBvbmx5IGVhZ2VyIHJvdXRlcyAqLwotCQkvKiBtYWtlIHJvdXRlIGxlYXN0IGZhdm91cml0ZSAqLwotCQlsaXN0X2RlbCgmcm91dGUtPmtzbnJfbGlzdCk7Ci0JCWxpc3RfYWRkX3RhaWwoJnJvdXRlLT5rc25yX2xpc3QsICZwZWVyLT5rc25wX3JvdXRlcyk7Ci0jZW5kaWYKIAkJa3NvY2tuYWxfcm91dGVfZGVjcmVmKHJvdXRlKTsgICAgIC8qIGRyb3AgY29ubidzIHJlZiBvbiByb3V0ZSAqLwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZC5oCmluZGV4IGE1NjYzMmIuLmU2Y2EwY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kLmgKQEAgLTg2LDggKzg2LDYgQEAKIAlpbnQgICAgICAgICAgICAgICAgICAgICBrc3NfbmNvbm5zOyAgICAgLyogIyBjb25uZWN0aW9ucyBhc3NpZ25lZCB0bwogCQkJCQkJICogdGhpcyBzY2hlZHVsZXIgKi8KIAlzdHJ1Y3Qga3NvY2tfc2NoZWRfaW5mbyAqa3NzX2luZm87CS8qIG93bmVyIG9mIGl0ICovCi0Jc3RydWN0IHBhZ2UgICAgICAgICAgICAgKmtzc19yeF9zY3JhdGNoX3Bnc1tMTkVUX01BWF9JT1ZdOwotCXN0cnVjdCBrdmVjICAgICAgICAgICAgIGtzc19zY3JhdGNoX2lvdltMTkVUX01BWF9JT1ZdOwogfTsKIAogc3RydWN0IGtzb2NrX3NjaGVkX2luZm8gewpAQCAtNjE2LDkgKzYxNCw3IEBACiBpbnQga3NvY2tuYWxfY3RsKGxuZXRfbmlfdCAqbmksIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7CiBpbnQga3NvY2tuYWxfc2VuZChsbmV0X25pX3QgKm5pLCB2b2lkICpwcml2YXRlLCBsbmV0X21zZ190ICpsbnRtc2cpOwogaW50IGtzb2NrbmFsX3JlY3YobG5ldF9uaV90ICpuaSwgdm9pZCAqcHJpdmF0ZSwgbG5ldF9tc2dfdCAqbG50bXNnLAotCQkgIGludCBkZWxheWVkLCB1bnNpZ25lZCBpbnQgbmlvdiwKLQkJICBzdHJ1Y3Qga3ZlYyAqaW92LCBsbmV0X2tpb3ZfdCAqa2lvdiwKLQkJICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbWxlbiwgdW5zaWduZWQgaW50IHJsZW4pOworCQkgIGludCBkZWxheWVkLCBzdHJ1Y3QgaW92X2l0ZXIgKnRvLCB1bnNpZ25lZCBpbnQgcmxlbik7CiBpbnQga3NvY2tuYWxfYWNjZXB0KGxuZXRfbmlfdCAqbmksIHN0cnVjdCBzb2NrZXQgKnNvY2spOwogCiBpbnQga3NvY2tuYWxfYWRkX3BlZXIobG5ldF9uaV90ICpuaSwgbG5ldF9wcm9jZXNzX2lkX3QgaWQsIF9fdTMyIGlwLCBpbnQgcG9ydCk7CkBAIC02MzUsNyArNjMxLDcgQEAKIGludCBrc29ja25hbF9jbG9zZV9jb25uX2FuZF9zaWJsaW5ncyhzdHJ1Y3Qga3NvY2tfY29ubiAqY29ubiwgaW50IHdoeSk7CiBpbnQga3NvY2tuYWxfY2xvc2VfbWF0Y2hpbmdfY29ubnMobG5ldF9wcm9jZXNzX2lkX3QgaWQsIF9fdTMyIGlwYWRkcik7CiBzdHJ1Y3Qga3NvY2tfY29ubiAqa3NvY2tuYWxfZmluZF9jb25uX2xvY2tlZChzdHJ1Y3Qga3NvY2tfcGVlciAqcGVlciwKLQkJCQkJc3RydWN0IGtzb2NrX3R4ICp0eCwgaW50IG5vbmJsayk7CisJCQkJCSAgICAgc3RydWN0IGtzb2NrX3R4ICp0eCwgaW50IG5vbmJsayk7CiAKIGludCAga3NvY2tuYWxfbGF1bmNoX3BhY2tldChsbmV0X25pX3QgKm5pLCBzdHJ1Y3Qga3NvY2tfdHggKnR4LAogCQkJICAgIGxuZXRfcHJvY2Vzc19pZF90IGlkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfY2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfY2IuYwppbmRleCAzMDM1NzZkLi5jMWM2ZjYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX2NiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9jYi5jCkBAIC0zNSw4ICszNSw4IEBACiAJCXNwaW5fbG9jaygma3NvY2tuYWxfZGF0YS5rc25kX3R4X2xvY2spOwogCiAJCWlmICghbGlzdF9lbXB0eSgma3NvY2tuYWxfZGF0YS5rc25kX2lkbGVfbm9vcF90eHMpKSB7Ci0JCQl0eCA9IGxpc3RfZW50cnkoa3NvY2tuYWxfZGF0YS5rc25kX2lkbGVfbm9vcF90eHMuIFwKLQkJCQkJICAgIG5leHQsIHN0cnVjdCBrc29ja190eCwgdHhfbGlzdCk7CisJCQl0eCA9IGxpc3RfZW50cnkoa3NvY2tuYWxfZGF0YS5rc25kX2lkbGVfbm9vcF90eHMubmV4dCwKKwkJCQkJc3RydWN0IGtzb2NrX3R4LCB0eF9saXN0KTsKIAkJCUxBU1NFUlQodHgtPnR4X2Rlc2Nfc2l6ZSA9PSBzaXplKTsKIAkJCWxpc3RfZGVsKCZ0eC0+dHhfbGlzdCk7CiAJCX0KQEAgLTE2NCwxMyArMTY0LDEzIEBACiAJZG8gewogCQlMQVNTRVJUKHR4LT50eF9ua2lvdiA+IDApOwogCi0JCWlmIChub2IgPCAoaW50KWtpb3YtPmtpb3ZfbGVuKSB7Ci0JCQlraW92LT5raW92X29mZnNldCArPSBub2I7Ci0JCQlraW92LT5raW92X2xlbiAtPSBub2I7CisJCWlmIChub2IgPCAoaW50KWtpb3YtPmJ2X2xlbikgeworCQkJa2lvdi0+YnZfb2Zmc2V0ICs9IG5vYjsKKwkJCWtpb3YtPmJ2X2xlbiAtPSBub2I7CiAJCQlyZXR1cm4gcmM7CiAJCX0KIAotCQlub2IgLT0gKGludClraW92LT5raW92X2xlbjsKKwkJbm9iIC09IChpbnQpa2lvdi0+YnZfbGVuOwogCQl0eC0+dHhfa2lvdiA9ICsra2lvdjsKIAkJdHgtPnR4X25raW92LS07CiAJfSB3aGlsZSAobm9iKTsKQEAgLTMyNiwxMyArMzI2LDEzIEBACiAJZG8gewogCQlMQVNTRVJUKGNvbm4tPmtzbmNfcnhfbmtpb3YgPiAwKTsKIAotCQlpZiAobm9iIDwgKGludClraW92LT5raW92X2xlbikgewotCQkJa2lvdi0+a2lvdl9vZmZzZXQgKz0gbm9iOwotCQkJa2lvdi0+a2lvdl9sZW4gLT0gbm9iOworCQlpZiAobm9iIDwgKGludClraW92LT5idl9sZW4pIHsKKwkJCWtpb3YtPmJ2X29mZnNldCArPSBub2I7CisJCQlraW92LT5idl9sZW4gLT0gbm9iOwogCQkJcmV0dXJuIC1FQUdBSU47CiAJCX0KIAotCQlub2IgLT0ga2lvdi0+a2lvdl9sZW47CisJCW5vYiAtPSBraW92LT5idl9sZW47CiAJCWNvbm4tPmtzbmNfcnhfa2lvdiA9ICsra2lvdjsKIAkJY29ubi0+a3NuY19yeF9ua2lvdi0tOwogCX0gd2hpbGUgKG5vYik7CkBAIC0xMzI1LDM5ICsxMzI1LDM2IEBACiAKIGludAoga3NvY2tuYWxfcmVjdihsbmV0X25pX3QgKm5pLCB2b2lkICpwcml2YXRlLCBsbmV0X21zZ190ICptc2csIGludCBkZWxheWVkLAotCSAgICAgIHVuc2lnbmVkIGludCBuaW92LCBzdHJ1Y3Qga3ZlYyAqaW92LCBsbmV0X2tpb3ZfdCAqa2lvdiwKLQkgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbWxlbiwgdW5zaWduZWQgaW50IHJsZW4pCisJICAgICAgc3RydWN0IGlvdl9pdGVyICp0bywgdW5zaWduZWQgaW50IHJsZW4pCiB7CiAJc3RydWN0IGtzb2NrX2Nvbm4gKmNvbm4gPSBwcml2YXRlOwogCXN0cnVjdCBrc29ja19zY2hlZCAqc2NoZWQgPSBjb25uLT5rc25jX3NjaGVkdWxlcjsKIAotCUxBU1NFUlQobWxlbiA8PSBybGVuKTsKLQlMQVNTRVJUKG5pb3YgPD0gTE5FVF9NQVhfSU9WKTsKKwlMQVNTRVJUKGlvdl9pdGVyX2NvdW50KHRvKSA8PSBybGVuKTsKKwlMQVNTRVJUKHRvLT5ucl9zZWdzIDw9IExORVRfTUFYX0lPVik7CiAKIAljb25uLT5rc25jX2Nvb2tpZSA9IG1zZzsKLQljb25uLT5rc25jX3J4X25vYl93YW50ZWQgPSBtbGVuOworCWNvbm4tPmtzbmNfcnhfbm9iX3dhbnRlZCA9IGlvdl9pdGVyX2NvdW50KHRvKTsKIAljb25uLT5rc25jX3J4X25vYl9sZWZ0ID0gcmxlbjsKIAotCWlmICghbWxlbiB8fCBpb3YpIHsKKwlpZiAodG8tPnR5cGUgJiBJVEVSX0tWRUMpIHsKIAkJY29ubi0+a3NuY19yeF9ua2lvdiA9IDA7CiAJCWNvbm4tPmtzbmNfcnhfa2lvdiA9IE5VTEw7CiAJCWNvbm4tPmtzbmNfcnhfaW92ID0gY29ubi0+a3NuY19yeF9pb3Zfc3BhY2UuaW92OwogCQljb25uLT5rc25jX3J4X25pb3YgPQogCQkJbG5ldF9leHRyYWN0X2lvdihMTkVUX01BWF9JT1YsIGNvbm4tPmtzbmNfcnhfaW92LAotCQkJCQkgbmlvdiwgaW92LCBvZmZzZXQsIG1sZW4pOworCQkJCQkgdG8tPm5yX3NlZ3MsIHRvLT5rdmVjLAorCQkJCQkgdG8tPmlvdl9vZmZzZXQsIGlvdl9pdGVyX2NvdW50KHRvKSk7CiAJfSBlbHNlIHsKIAkJY29ubi0+a3NuY19yeF9uaW92ID0gMDsKIAkJY29ubi0+a3NuY19yeF9pb3YgPSBOVUxMOwogCQljb25uLT5rc25jX3J4X2tpb3YgPSBjb25uLT5rc25jX3J4X2lvdl9zcGFjZS5raW92OwogCQljb25uLT5rc25jX3J4X25raW92ID0KIAkJCWxuZXRfZXh0cmFjdF9raW92KExORVRfTUFYX0lPViwgY29ubi0+a3NuY19yeF9raW92LAotCQkJCQkgIG5pb3YsIGtpb3YsIG9mZnNldCwgbWxlbik7CisJCQkJCSB0by0+bnJfc2VncywgdG8tPmJ2ZWMsCisJCQkJCSB0by0+aW92X29mZnNldCwgaW92X2l0ZXJfY291bnQodG8pKTsKIAl9CiAKLQlMQVNTRVJUKG1sZW4gPT0KLQkJbG5ldF9pb3Zfbm9iKGNvbm4tPmtzbmNfcnhfbmlvdiwgY29ubi0+a3NuY19yeF9pb3YpICsKLQkJbG5ldF9raW92X25vYihjb25uLT5rc25jX3J4X25raW92LCBjb25uLT5rc25jX3J4X2tpb3YpKTsKLQogCUxBU1NFUlQoY29ubi0+a3NuY19yeF9zY2hlZHVsZWQpOwogCiAJc3Bpbl9sb2NrX2JoKCZzY2hlZC0+a3NzX2xvY2spOwpAQCAtMjAwOCwxMyArMjAwNSw2IEBACiAJCWxpc3Rfc3BsaWNlX2luaXQoJnBlZXItPmtzbnBfdHhfcXVldWUsICZ6b21iaWVzKTsKIAl9CiAKLSNpZiAwCSAgIC8qIGlycmVsZXZhbnQgd2l0aCBvbmx5IGVhZ2VyIHJvdXRlcyAqLwotCWlmICghcm91dGUtPmtzbnJfZGVsZXRlZCkgewotCQkvKiBtYWtlIHRoaXMgcm91dGUgbGVhc3QtZmF2b3VyaXRlIGZvciByZS1zZWxlY3Rpb24gKi8KLQkJbGlzdF9kZWwoJnJvdXRlLT5rc25yX2xpc3QpOwotCQlsaXN0X2FkZF90YWlsKCZyb3V0ZS0+a3Nucl9saXN0LCAmcGVlci0+a3NucF9yb3V0ZXMpOwotCX0KLSNlbmRpZgogCXdyaXRlX3VubG9ja19iaCgma3NvY2tuYWxfZGF0YS5rc25kX2dsb2JhbF9sb2NrKTsKIAogCWtzb2NrbmFsX3BlZXJfZmFpbGVkKHBlZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9saWIuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfbGliLmMKaW5kZXggNmExNzc1Ny4uNmM5NWU5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9saWIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX2xpYi5jCkBAIC03Myw5ICs3Myw5IEBACiBpbnQKIGtzb2NrbmFsX2xpYl9zZW5kX2lvdihzdHJ1Y3Qga3NvY2tfY29ubiAqY29ubiwgc3RydWN0IGtzb2NrX3R4ICp0eCkKIHsKKwlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsubXNnX2ZsYWdzID0gTVNHX0RPTlRXQUlUfTsKIAlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gY29ubi0+a3NuY19zb2NrOwotCWludCBub2I7Ci0JaW50IHJjOworCWludCBub2IsIGk7CiAKIAlpZiAoKmtzb2NrbmFsX3R1bmFibGVzLmtzbmRfZW5hYmxlX2NzdW0JJiYgLyogY2hlY2tzdW0gZW5hYmxlZCAqLwogCSAgICBjb25uLT5rc25jX3Byb3RvID09ICZrc29ja25hbF9wcm90b2NvbF92MnggJiYgLyogVjIueCBjb25uZWN0aW9uICAqLwpAQCAtODMsMzQgKzgzLDE2IEBACiAJICAgICF0eC0+dHhfbXNnLmtzbV9jc3VtKQkJICAgICAvKiBub3QgY2hlY2tzdW1tZWQgICovCiAJCWtzb2NrbmFsX2xpYl9jc3VtX3R4KHR4KTsKIAotCS8qCi0JICogTkIgd2UgY2FuJ3QgdHJ1c3Qgc29ja2V0IG9wcyB0byBlaXRoZXIgY29uc3VtZSBvdXIgaW92cwotCSAqIG9yIGxlYXZlIHRoZW0gYWxvbmUuCi0JICovCi0JewotI2lmIFNPQ0tOQUxfU0lOR0xFX0ZSQUdfVFgKLQkJc3RydWN0IGt2ZWMgc2NyYXRjaDsKLQkJc3RydWN0IGt2ZWMgKnNjcmF0Y2hpb3YgPSAmc2NyYXRjaDsKLQkJdW5zaWduZWQgaW50IG5pb3YgPSAxOwotI2Vsc2UKLQkJc3RydWN0IGt2ZWMgKnNjcmF0Y2hpb3YgPSBjb25uLT5rc25jX3NjaGVkdWxlci0+a3NzX3NjcmF0Y2hfaW92OwotCQl1bnNpZ25lZCBpbnQgbmlvdiA9IHR4LT50eF9uaW92OwotI2VuZGlmCi0JCXN0cnVjdCBtc2doZHIgbXNnID0gey5tc2dfZmxhZ3MgPSBNU0dfRE9OVFdBSVR9OwotCQlpbnQgaTsKKwlmb3IgKG5vYiA9IGkgPSAwOyBpIDwgdHgtPnR4X25pb3Y7IGkrKykKKwkJbm9iICs9IHR4LT50eF9pb3ZbaV0uaW92X2xlbjsKIAotCQlmb3IgKG5vYiA9IGkgPSAwOyBpIDwgbmlvdjsgaSsrKSB7Ci0JCQlzY3JhdGNoaW92W2ldID0gdHgtPnR4X2lvdltpXTsKLQkJCW5vYiArPSBzY3JhdGNoaW92W2ldLmlvdl9sZW47Ci0JCX0KKwlpZiAoIWxpc3RfZW1wdHkoJmNvbm4tPmtzbmNfdHhfcXVldWUpIHx8CisJICAgIG5vYiA8IHR4LT50eF9yZXNpZCkKKwkJbXNnLm1zZ19mbGFncyB8PSBNU0dfTU9SRTsKIAotCQlpZiAoIWxpc3RfZW1wdHkoJmNvbm4tPmtzbmNfdHhfcXVldWUpIHx8Ci0JCSAgICBub2IgPCB0eC0+dHhfcmVzaWQpCi0JCQltc2cubXNnX2ZsYWdzIHw9IE1TR19NT1JFOwotCi0JCXJjID0ga2VybmVsX3NlbmRtc2coc29jaywgJm1zZywgc2NyYXRjaGlvdiwgbmlvdiwgbm9iKTsKLQl9Ci0JcmV0dXJuIHJjOworCWlvdl9pdGVyX2t2ZWMoJm1zZy5tc2dfaXRlciwgV1JJVEUgfCBJVEVSX0tWRUMsCisJCSAgICAgIHR4LT50eF9pb3YsIHR4LT50eF9uaW92LCBub2IpOworCXJldHVybiBzb2NrX3NlbmRtc2coc29jaywgJm1zZyk7CiB9CiAKIGludApAQCAtMTI0LDIwICsxMDYsMTYgQEAKIAkvKiBOb3QgTk9PUCBtZXNzYWdlICovCiAJTEFTU0VSVCh0eC0+dHhfbG5ldG1zZyk7CiAKLQkvKgotCSAqIE5CIHdlIGNhbid0IHRydXN0IHNvY2tldCBvcHMgdG8gZWl0aGVyIGNvbnN1bWUgb3VyIGlvdnMKLQkgKiBvciBsZWF2ZSB0aGVtIGFsb25lLgotCSAqLwogCWlmICh0eC0+dHhfbXNnLmtzbV96Y19jb29raWVzWzBdKSB7CiAJCS8qIFplcm8gY29weSBpcyBlbmFibGVkICovCiAJCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwotCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGtpb3YtPmtpb3ZfcGFnZTsKLQkJaW50IG9mZnNldCA9IGtpb3YtPmtpb3Zfb2Zmc2V0OwotCQlpbnQgZnJhZ3NpemUgPSBraW92LT5raW92X2xlbjsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBraW92LT5idl9wYWdlOworCQlpbnQgb2Zmc2V0ID0ga2lvdi0+YnZfb2Zmc2V0OworCQlpbnQgZnJhZ3NpemUgPSBraW92LT5idl9sZW47CiAJCWludCBtc2dmbGcgPSBNU0dfRE9OVFdBSVQ7CiAKIAkJQ0RFQlVHKERfTkVULCAicGFnZSAlcCArIG9mZnNldCAleCBmb3IgJWRcbiIsCi0JCSAgICAgICBwYWdlLCBvZmZzZXQsIGtpb3YtPmtpb3ZfbGVuKTsKKwkJICAgICAgIHBhZ2UsIG9mZnNldCwga2lvdi0+YnZfbGVuKTsKIAogCQlpZiAoIWxpc3RfZW1wdHkoJmNvbm4tPmtzbmNfdHhfcXVldWUpIHx8CiAJCSAgICBmcmFnc2l6ZSA8IHR4LT50eF9yZXNpZCkKQEAgLTE1MCwzNCArMTI4LDE5IEBACiAJCQlyYyA9IHRjcF9zZW5kcGFnZShzaywgcGFnZSwgb2Zmc2V0LCBmcmFnc2l6ZSwgbXNnZmxnKTsKIAkJfQogCX0gZWxzZSB7Ci0jaWYgU09DS05BTF9TSU5HTEVfRlJBR19UWCB8fCAhU09DS05BTF9SSVNLX0tNQVBfREVBRExPQ0sKLQkJc3RydWN0IGt2ZWMgc2NyYXRjaDsKLQkJc3RydWN0IGt2ZWMgKnNjcmF0Y2hpb3YgPSAmc2NyYXRjaDsKLQkJdW5zaWduZWQgaW50IG5pb3YgPSAxOwotI2Vsc2UKLSNpZmRlZiBDT05GSUdfSElHSE1FTQotI3dhcm5pbmcgIlhYWCByaXNrIG9mIGttYXAgZGVhZGxvY2sgb24gbXVsdGlwbGUgZnJhZ3MuLi4iCi0jZW5kaWYKLQkJc3RydWN0IGt2ZWMgKnNjcmF0Y2hpb3YgPSBjb25uLT5rc25jX3NjaGVkdWxlci0+a3NzX3NjcmF0Y2hfaW92OwotCQl1bnNpZ25lZCBpbnQgbmlvdiA9IHR4LT50eF9ua2lvdjsKLSNlbmRpZgogCQlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsubXNnX2ZsYWdzID0gTVNHX0RPTlRXQUlUfTsKIAkJaW50IGk7CiAKLQkJZm9yIChub2IgPSBpID0gMDsgaSA8IG5pb3Y7IGkrKykgewotCQkJc2NyYXRjaGlvdltpXS5pb3ZfYmFzZSA9IGttYXAoa2lvdltpXS5raW92X3BhZ2UpICsKLQkJCQkJCSBraW92W2ldLmtpb3Zfb2Zmc2V0OwotCQkJbm9iICs9IHNjcmF0Y2hpb3ZbaV0uaW92X2xlbiA9IGtpb3ZbaV0ua2lvdl9sZW47Ci0JCX0KKwkJZm9yIChub2IgPSBpID0gMDsgaSA8IHR4LT50eF9ua2lvdjsgaSsrKQorCQkJbm9iICs9IGtpb3ZbaV0uYnZfbGVuOwogCiAJCWlmICghbGlzdF9lbXB0eSgmY29ubi0+a3NuY190eF9xdWV1ZSkgfHwKIAkJICAgIG5vYiA8IHR4LT50eF9yZXNpZCkKIAkJCW1zZy5tc2dfZmxhZ3MgfD0gTVNHX01PUkU7CiAKLQkJcmMgPSBrZXJuZWxfc2VuZG1zZyhzb2NrLCAmbXNnLCAoc3RydWN0IGt2ZWMgKilzY3JhdGNoaW92LCBuaW92LCBub2IpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBuaW92OyBpKyspCi0JCQlrdW5tYXAoa2lvdltpXS5raW92X3BhZ2UpOworCQlpb3ZfaXRlcl9idmVjKCZtc2cubXNnX2l0ZXIsIFdSSVRFIHwgSVRFUl9CVkVDLAorCQkJICAgICAga2lvdiwgdHgtPnR4X25raW92LCBub2IpOworCQlyYyA9IHNvY2tfc2VuZG1zZyhzb2NrLCAmbXNnKTsKIAl9CiAJcmV0dXJuIHJjOwogfQpAQCAtMjAxLDE0ICsxNjQsNyBAQAogaW50CiBrc29ja25hbF9saWJfcmVjdl9pb3Yoc3RydWN0IGtzb2NrX2Nvbm4gKmNvbm4pCiB7Ci0jaWYgU09DS05BTF9TSU5HTEVfRlJBR19SWAotCXN0cnVjdCBrdmVjIHNjcmF0Y2g7Ci0Jc3RydWN0IGt2ZWMgKnNjcmF0Y2hpb3YgPSAmc2NyYXRjaDsKLQl1bnNpZ25lZCBpbnQgbmlvdiA9IDE7Ci0jZWxzZQotCXN0cnVjdCBrdmVjICpzY3JhdGNoaW92ID0gY29ubi0+a3NuY19zY2hlZHVsZXItPmtzc19zY3JhdGNoX2lvdjsKIAl1bnNpZ25lZCBpbnQgbmlvdiA9IGNvbm4tPmtzbmNfcnhfbmlvdjsKLSNlbmRpZgogCXN0cnVjdCBrdmVjICppb3YgPSBjb25uLT5rc25jX3J4X2lvdjsKIAlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsKIAkJLm1zZ19mbGFncyA9IDAKQEAgLTIyMCwyMCArMTc2LDE1IEBACiAJaW50IHN1bTsKIAlfX3UzMiBzYXZlZF9jc3VtOwogCi0JLyoKLQkgKiBOQiB3ZSBjYW4ndCB0cnVzdCBzb2NrZXQgb3BzIHRvIGVpdGhlciBjb25zdW1lIG91ciBpb3ZzCi0JICogb3IgbGVhdmUgdGhlbSBhbG9uZS4KLQkgKi8KIAlMQVNTRVJUKG5pb3YgPiAwKTsKIAotCWZvciAobm9iID0gaSA9IDA7IGkgPCBuaW92OyBpKyspIHsKLQkJc2NyYXRjaGlvdltpXSA9IGlvdltpXTsKLQkJbm9iICs9IHNjcmF0Y2hpb3ZbaV0uaW92X2xlbjsKLQl9CisJZm9yIChub2IgPSBpID0gMDsgaSA8IG5pb3Y7IGkrKykKKwkJbm9iICs9IGlvdltpXS5pb3ZfbGVuOworCiAJTEFTU0VSVChub2IgPD0gY29ubi0+a3NuY19yeF9ub2Jfd2FudGVkKTsKIAotCXJjID0ga2VybmVsX3JlY3Ztc2coY29ubi0+a3NuY19zb2NrLCAmbXNnLCBzY3JhdGNoaW92LCBuaW92LCBub2IsCi0JCQkgICAgTVNHX0RPTlRXQUlUKTsKKwlpb3ZfaXRlcl9rdmVjKCZtc2cubXNnX2l0ZXIsIFJFQUQgfCBJVEVSX0tWRUMsIGlvdiwgbmlvdiwgbm9iKTsKKwlyYyA9IHNvY2tfcmVjdm1zZyhjb25uLT5rc25jX3NvY2ssICZtc2csIE1TR19ET05UV0FJVCk7CiAKIAlzYXZlZF9jc3VtID0gMDsKIAlpZiAoY29ubi0+a3NuY19wcm90byA9PSAma3NvY2tuYWxfcHJvdG9jb2xfdjJ4KSB7CkBAIC0yNTksNjcgKzIxMCwxMCBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIHZvaWQKLWtzb2NrbmFsX2xpYl9raW92X3Z1bm1hcCh2b2lkICphZGRyKQotewotCWlmICghYWRkcikKLQkJcmV0dXJuOwotCi0JdnVubWFwKGFkZHIpOwotfQotCi1zdGF0aWMgdm9pZCAqCi1rc29ja25hbF9saWJfa2lvdl92bWFwKGxuZXRfa2lvdl90ICpraW92LCBpbnQgbmlvdiwKLQkJICAgICAgIHN0cnVjdCBrdmVjICppb3YsIHN0cnVjdCBwYWdlICoqcGFnZXMpCi17Ci0Jdm9pZCAqYWRkcjsKLQlpbnQgbm9iOwotCWludCBpOwotCi0JaWYgKCEqa3NvY2tuYWxfdHVuYWJsZXMua3NuZF96Y19yZWN2IHx8ICFwYWdlcykKLQkJcmV0dXJuIE5VTEw7Ci0KLQlMQVNTRVJUKG5pb3YgPD0gTE5FVF9NQVhfSU9WKTsKLQotCWlmIChuaW92IDwgMiB8fAotCSAgICBuaW92IDwgKmtzb2NrbmFsX3R1bmFibGVzLmtzbmRfemNfcmVjdl9taW5fbmZyYWdzKQotCQlyZXR1cm4gTlVMTDsKLQotCWZvciAobm9iID0gaSA9IDA7IGkgPCBuaW92OyBpKyspIHsKLQkJaWYgKChraW92W2ldLmtpb3Zfb2Zmc2V0ICYmIGkgPiAwKSB8fAotCQkgICAgKGtpb3ZbaV0ua2lvdl9vZmZzZXQgKyBraW92W2ldLmtpb3ZfbGVuICE9IFBBR0VfU0laRSAmJiBpIDwgbmlvdiAtIDEpKQotCQkJcmV0dXJuIE5VTEw7Ci0KLQkJcGFnZXNbaV0gPSBraW92W2ldLmtpb3ZfcGFnZTsKLQkJbm9iICs9IGtpb3ZbaV0ua2lvdl9sZW47Ci0JfQotCi0JYWRkciA9IHZtYXAocGFnZXMsIG5pb3YsIFZNX01BUCwgUEFHRV9LRVJORUwpOwotCWlmICghYWRkcikKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpb3YtPmlvdl9iYXNlID0gYWRkciArIGtpb3ZbMF0ua2lvdl9vZmZzZXQ7Ci0JaW92LT5pb3ZfbGVuID0gbm9iOwotCi0JcmV0dXJuIGFkZHI7Ci19Ci0KIGludAoga3NvY2tuYWxfbGliX3JlY3Zfa2lvdihzdHJ1Y3Qga3NvY2tfY29ubiAqY29ubikKIHsKLSNpZiBTT0NLTkFMX1NJTkdMRV9GUkFHX1JYIHx8ICFTT0NLTkFMX1JJU0tfS01BUF9ERUFETE9DSwotCXN0cnVjdCBrdmVjIHNjcmF0Y2g7Ci0Jc3RydWN0IGt2ZWMgKnNjcmF0Y2hpb3YgPSAmc2NyYXRjaDsKLQlzdHJ1Y3QgcGFnZSAqKnBhZ2VzID0gTlVMTDsKLQl1bnNpZ25lZCBpbnQgbmlvdiA9IDE7Ci0jZWxzZQotI2lmZGVmIENPTkZJR19ISUdITUVNCi0jd2FybmluZyAiWFhYIHJpc2sgb2Yga21hcCBkZWFkbG9jayBvbiBtdWx0aXBsZSBmcmFncy4uLiIKLSNlbmRpZgotCXN0cnVjdCBrdmVjICpzY3JhdGNoaW92ID0gY29ubi0+a3NuY19zY2hlZHVsZXItPmtzc19zY3JhdGNoX2lvdjsKLQlzdHJ1Y3QgcGFnZSAqKnBhZ2VzID0gY29ubi0+a3NuY19zY2hlZHVsZXItPmtzc19yeF9zY3JhdGNoX3BnczsKIAl1bnNpZ25lZCBpbnQgbmlvdiA9IGNvbm4tPmtzbmNfcnhfbmtpb3Y7Ci0jZW5kaWYKIAlsbmV0X2tpb3ZfdCAgICpraW92ID0gY29ubi0+a3NuY19yeF9raW92OwogCXN0cnVjdCBtc2doZHIgbXNnID0gewogCQkubXNnX2ZsYWdzID0gMApAQCAtMzI4LDYzICsyMjIsMzIgQEAKIAlpbnQgaTsKIAlpbnQgcmM7CiAJdm9pZCAqYmFzZTsKLQl2b2lkICphZGRyOwogCWludCBzdW07CiAJaW50IGZyYWdub2I7Ci0JaW50IG47CiAKLQkvKgotCSAqIE5CIHdlIGNhbid0IHRydXN0IHNvY2tldCBvcHMgdG8gZWl0aGVyIGNvbnN1bWUgb3VyIGlvdnMKLQkgKiBvciBsZWF2ZSB0aGVtIGFsb25lLgotCSAqLwotCWFkZHIgPSBrc29ja25hbF9saWJfa2lvdl92bWFwKGtpb3YsIG5pb3YsIHNjcmF0Y2hpb3YsIHBhZ2VzKTsKLQlpZiAoYWRkcikgewotCQlub2IgPSBzY3JhdGNoaW92WzBdLmlvdl9sZW47Ci0JCW4gPSAxOwotCi0JfSBlbHNlIHsKLQkJZm9yIChub2IgPSBpID0gMDsgaSA8IG5pb3Y7IGkrKykgewotCQkJbm9iICs9IHNjcmF0Y2hpb3ZbaV0uaW92X2xlbiA9IGtpb3ZbaV0ua2lvdl9sZW47Ci0JCQlzY3JhdGNoaW92W2ldLmlvdl9iYXNlID0ga21hcChraW92W2ldLmtpb3ZfcGFnZSkgKwotCQkJCQkJIGtpb3ZbaV0ua2lvdl9vZmZzZXQ7Ci0JCX0KLQkJbiA9IG5pb3Y7Ci0JfQorCWZvciAobm9iID0gaSA9IDA7IGkgPCBuaW92OyBpKyspCisJCW5vYiArPSBraW92W2ldLmJ2X2xlbjsKIAogCUxBU1NFUlQobm9iIDw9IGNvbm4tPmtzbmNfcnhfbm9iX3dhbnRlZCk7CiAKLQlyYyA9IGtlcm5lbF9yZWN2bXNnKGNvbm4tPmtzbmNfc29jaywgJm1zZywgKHN0cnVjdCBrdmVjICopc2NyYXRjaGlvdiwKLQkJCSAgICBuLCBub2IsIE1TR19ET05UV0FJVCk7CisJaW92X2l0ZXJfYnZlYygmbXNnLm1zZ19pdGVyLCBSRUFEIHwgSVRFUl9CVkVDLCBraW92LCBuaW92LCBub2IpOworCXJjID0gc29ja19yZWN2bXNnKGNvbm4tPmtzbmNfc29jaywgJm1zZywgTVNHX0RPTlRXQUlUKTsKIAogCWlmIChjb25uLT5rc25jX21zZy5rc21fY3N1bSkgewogCQlmb3IgKGkgPSAwLCBzdW0gPSByYzsgc3VtID4gMDsgaSsrLCBzdW0gLT0gZnJhZ25vYikgewogCQkJTEFTU0VSVChpIDwgbmlvdik7CiAKLQkJCS8qCi0JCQkgKiBEYW5nISBoYXZlIHRvIGttYXAgYWdhaW4gYmVjYXVzZSBJIGhhdmUgbm93aGVyZSB0bwotCQkJICogc3Rhc2ggdGhlIG1hcHBlZCBhZGRyZXNzLiAgQnV0IGJ5IGRvaW5nIGl0IHdoaWxlIHRoZQotCQkJICogcGFnZSBpcyBzdGlsbCBtYXBwZWQsIHRoZSBrZXJuZWwganVzdCBidW1wcyB0aGUgbWFwCi0JCQkgKiBjb3VudCBhbmQgcmV0dXJucyBtZSB0aGUgYWRkcmVzcyBpdCBzdGFzaGVkLgotCQkJICovCi0JCQliYXNlID0ga21hcChraW92W2ldLmtpb3ZfcGFnZSkgKyBraW92W2ldLmtpb3Zfb2Zmc2V0OwotCQkJZnJhZ25vYiA9IGtpb3ZbaV0ua2lvdl9sZW47CisJCQliYXNlID0ga21hcChraW92W2ldLmJ2X3BhZ2UpICsga2lvdltpXS5idl9vZmZzZXQ7CisJCQlmcmFnbm9iID0ga2lvdltpXS5idl9sZW47CiAJCQlpZiAoZnJhZ25vYiA+IHN1bSkKIAkJCQlmcmFnbm9iID0gc3VtOwogCiAJCQljb25uLT5rc25jX3J4X2NzdW0gPSBrc29ja25hbF9jc3VtKGNvbm4tPmtzbmNfcnhfY3N1bSwKIAkJCQkJCQkgICBiYXNlLCBmcmFnbm9iKTsKIAotCQkJa3VubWFwKGtpb3ZbaV0ua2lvdl9wYWdlKTsKKwkJCWt1bm1hcChraW92W2ldLmJ2X3BhZ2UpOwogCQl9CiAJfQotCi0JaWYgKGFkZHIpIHsKLQkJa3NvY2tuYWxfbGliX2tpb3ZfdnVubWFwKGFkZHIpOwotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBuaW92OyBpKyspCi0JCQlrdW5tYXAoa2lvdltpXS5raW92X3BhZ2UpOwotCX0KLQogCXJldHVybiByYzsKIH0KIApAQCAtNDA2LDEyICsyNjksMTIgQEAKIAogCWlmICh0eC0+dHhfa2lvdikgewogCQlmb3IgKGkgPSAwOyBpIDwgdHgtPnR4X25raW92OyBpKyspIHsKLQkJCWJhc2UgPSBrbWFwKHR4LT50eF9raW92W2ldLmtpb3ZfcGFnZSkgKwotCQkJICAgICAgIHR4LT50eF9raW92W2ldLmtpb3Zfb2Zmc2V0OworCQkJYmFzZSA9IGttYXAodHgtPnR4X2tpb3ZbaV0uYnZfcGFnZSkgKworCQkJICAgICAgIHR4LT50eF9raW92W2ldLmJ2X29mZnNldDsKIAotCQkJY3N1bSA9IGtzb2NrbmFsX2NzdW0oY3N1bSwgYmFzZSwgdHgtPnR4X2tpb3ZbaV0ua2lvdl9sZW4pOworCQkJY3N1bSA9IGtzb2NrbmFsX2NzdW0oY3N1bSwgYmFzZSwgdHgtPnR4X2tpb3ZbaV0uYnZfbGVuKTsKIAotCQkJa3VubWFwKHR4LT50eF9raW92W2ldLmtpb3ZfcGFnZSk7CisJCQlrdW5tYXAodHgtPnR4X2tpb3ZbaV0uYnZfcGFnZSk7CiAJCX0KIAl9IGVsc2UgewogCQlmb3IgKGkgPSAxOyBpIDwgdHgtPnR4X25pb3Y7IGkrKykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9saWJjZnMvZGVidWcuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9saWJjZnMvZGVidWcuYwppbmRleCA0MmIxNWE3Li4yM2IzNmI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbGliY2ZzL2RlYnVnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xpYmNmcy9kZWJ1Zy5jCkBAIC0zMjgsMTUgKzMyOCwyMCBAQAogICovCiB2b2lkIGxpYmNmc19kZWJ1Z19kdW1wbG9nX2ludGVybmFsKHZvaWQgKmFyZykKIHsKKwlzdGF0aWMgdGltZTY0X3QgbGFzdF9kdW1wX3RpbWU7CisJdGltZTY0X3QgY3VycmVudF90aW1lOwogCXZvaWQgKmpvdXJuYWxfaW5mbzsKIAogCWpvdXJuYWxfaW5mbyA9IGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKIAljdXJyZW50LT5qb3VybmFsX2luZm8gPSBOVUxMOworCWN1cnJlbnRfdGltZSA9IGt0aW1lX2dldF9yZWFsX3NlY29uZHMoKTsKIAotCWlmIChzdHJuY21wKGxpYmNmc19kZWJ1Z19maWxlX3BhdGhfYXJyLCAiTk9ORSIsIDQpICE9IDApIHsKKwlpZiAoc3RybmNtcChsaWJjZnNfZGVidWdfZmlsZV9wYXRoX2FyciwgIk5PTkUiLCA0KSAmJgorCSAgICBjdXJyZW50X3RpbWUgPiBsYXN0X2R1bXBfdGltZSkgeworCQlsYXN0X2R1bXBfdGltZSA9IGN1cnJlbnRfdGltZTsKIAkJc25wcmludGYoZGVidWdfZmlsZV9uYW1lLCBzaXplb2YoZGVidWdfZmlsZV9uYW1lKSAtIDEsCiAJCQkgIiVzLiVsbGQuJWxkIiwgbGliY2ZzX2RlYnVnX2ZpbGVfcGF0aF9hcnIsCi0JCQkgKHM2NClrdGltZV9nZXRfcmVhbF9zZWNvbmRzKCksIChsb25nX3B0cl90KWFyZyk7CisJCQkgKHM2NCljdXJyZW50X3RpbWUsIChsb25nX3B0cl90KWFyZyk7CiAJCXByX2FsZXJ0KCJMdXN0cmVFcnJvcjogZHVtcGluZyBsb2cgdG8gJXNcbiIsIGRlYnVnX2ZpbGVfbmFtZSk7CiAJCWNmc190cmFjZWZpbGVfZHVtcF9hbGxfcGFnZXMoZGVidWdfZmlsZV9uYW1lKTsKIAkJbGliY2ZzX3J1bl9kZWJ1Z19sb2dfdXBjYWxsKGRlYnVnX2ZpbGVfbmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbGliY2ZzL2ZhaWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9saWJjZnMvZmFpbC5jCmluZGV4IDkyODhlZTAuLmU0YjFhMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9saWJjZnMvZmFpbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9saWJjZnMvZmFpbC5jCkBAIC05MCw4ICs5MCwxMCBAQAogCQl9CiAJfQogCi0JaWYgKChzZXQgPT0gQ0ZTX0ZBSUxfTE9DX09SU0VUIHx8IHNldCA9PSBDRlNfRkFJTF9MT0NfUkVTRVQpICYmCi0JICAgICh2YWx1ZSAmIENGU19GQUlMX09OQ0UpKQorCS8qIFRha2UgaW50byBhY2NvdW50IHRoZSBjdXJyZW50IGNhbGwgZm9yIEZBSUxfT05DRSBmb3IgT1JTRVQgb25seSwKKwkgKiBhcyBSRVNFVCBpcyBhIG5ldyBmYWlsX2xvYywgaXQgZG9lcyBub3QgY2hhbmdlIHRoZSBjdXJyZW50IGNhbGwKKwkgKi8KKwlpZiAoKHNldCA9PSBDRlNfRkFJTF9MT0NfT1JTRVQpICYmICh2YWx1ZSAmIENGU19GQUlMX09OQ0UpKQogCQlzZXRfYml0KENGU19GQUlMX09OQ0VfQklULCAmY2ZzX2ZhaWxfbG9jKTsKIAkvKiBMb3N0IHJhY2UgdG8gc2V0IENGU19GQUlMRURfQklULiAqLwogCWlmICh0ZXN0X2FuZF9zZXRfYml0KENGU19GQUlMRURfQklULCAmY2ZzX2ZhaWxfbG9jKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xpYmNmcy9saWJjZnNfc3RyaW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbGliY2ZzL2xpYmNmc19zdHJpbmcuYwppbmRleCBmYzY5N2NkLi41NmE2MTRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbGliY2ZzL2xpYmNmc19zdHJpbmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbGliY2ZzL2xpYmNmc19zdHJpbmcuYwpAQCAtMjI5LDggKzIyOSw2IEBACiAJY2hhciAqZW5kcCwgY2FjaGU7CiAJaW50IHJjOwogCi0Jc3RyID0gY2ZzX3RyaW13aGl0ZShzdHIpOwotCiAJLyoqCiAJICoga3N0cm91aW50IGNhbiBvbmx5IGhhbmRsZSBzdHJpbmdzIGNvbXBvc2VkCiAJICogb2Ygb25seSBudW1iZXJzLiBXZSBuZWVkIHRvIHNjYW4gdGhlIHN0cmluZwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xpYmNmcy9saW51eC9saW51eC1jcHUuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9saWJjZnMvbGludXgvbGludXgtY3B1LmMKaW5kZXggYjUyNTE4YzUuLmU4YjFhNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9saWJjZnMvbGludXgvbGludXgtY3B1LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xpYmNmcy9saW51eC9saW51eC1jcHUuYwpAQCAtNzQsNiArNzQsMTcgQEAKIAogc3RhdGljIHN0cnVjdCBjZnNfY3B0X2RhdGEJY3B0X2RhdGE7CiAKK3N0YXRpYyB2b2lkCitjZnNfbm9kZV90b19jcHVtYXNrKGludCBub2RlLCBjcHVtYXNrX3QgKm1hc2spCit7CisJY29uc3QgY3B1bWFza190ICp0bXAgPSBjcHVtYXNrX29mX25vZGUobm9kZSk7CisKKwlpZiAodG1wKQorCQljcHVtYXNrX2NvcHkobWFzaywgdG1wKTsKKwllbHNlCisJCWNwdW1hc2tfY2xlYXIobWFzayk7Cit9CisKIHZvaWQKIGNmc19jcHRfdGFibGVfZnJlZShzdHJ1Y3QgY2ZzX2NwdF90YWJsZSAqY3B0YWIpCiB7CkBAIC00MDMsNyArNDE0LDcgQEAKIAltdXRleF9sb2NrKCZjcHRfZGF0YS5jcHRfbXV0ZXgpOwogCiAJbWFzayA9IGNwdF9kYXRhLmNwdF9jcHVtYXNrOwotCWNwdW1hc2tfY29weShtYXNrLCBjcHVtYXNrX29mX25vZGUobm9kZSkpOworCWNmc19ub2RlX3RvX2NwdW1hc2sobm9kZSwgbWFzayk7CiAKIAlyYyA9IGNmc19jcHRfc2V0X2NwdW1hc2soY3B0YWIsIGNwdCwgbWFzayk7CiAKQEAgLTQyNyw3ICs0MzgsNyBAQAogCW11dGV4X2xvY2soJmNwdF9kYXRhLmNwdF9tdXRleCk7CiAKIAltYXNrID0gY3B0X2RhdGEuY3B0X2NwdW1hc2s7Ci0JY3B1bWFza19jb3B5KG1hc2ssIGNwdW1hc2tfb2Zfbm9kZShub2RlKSk7CisJY2ZzX25vZGVfdG9fY3B1bWFzayhub2RlLCBtYXNrKTsKIAogCWNmc19jcHRfdW5zZXRfY3B1bWFzayhjcHRhYiwgY3B0LCBtYXNrKTsKIApAQCAtNzQ5LDcgKzc2MCw3IEBACiAJfQogCiAJZm9yX2VhY2hfb25saW5lX25vZGUoaSkgewotCQljcHVtYXNrX2NvcHkobWFzaywgY3B1bWFza19vZl9ub2RlKGkpKTsKKwkJY2ZzX25vZGVfdG9fY3B1bWFzayhpLCBtYXNrKTsKIAogCQl3aGlsZSAoIWNwdW1hc2tfZW1wdHkobWFzaykpIHsKIAkJCXN0cnVjdCBjZnNfY3B1X3BhcnRpdGlvbiAqcGFydDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9saWJjZnMvbGludXgvbGludXgtY3J5cHRvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbGliY2ZzL2xpbnV4L2xpbnV4LWNyeXB0by5jCmluZGV4IDVjMDExNmEuLjdmNTZkMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9saWJjZnMvbGludXgvbGludXgtY3J5cHRvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xpYmNmcy9saW51eC9saW51eC1jcnlwdG8uYwpAQCAtOTUsOCArOTUsOCBAQAogCQllcnIgPSBjcnlwdG9fYWhhc2hfc2V0a2V5KHRmbSwga2V5LCBrZXlfbGVuKTsKIAllbHNlIGlmICgoKnR5cGUpLT5jaHRfa2V5ICE9IDApCiAJCWVyciA9IGNyeXB0b19haGFzaF9zZXRrZXkodGZtLAotCQkJCQkgKHVuc2lnbmVkIGNoYXIgKikmKCgqdHlwZSktPmNodF9rZXkpLAotCQkJCQkgKCp0eXBlKS0+Y2h0X3NpemUpOworCQkJCQkgICh1bnNpZ25lZCBjaGFyICopJigoKnR5cGUpLT5jaHRfa2V5KSwKKwkJCQkJICAoKnR5cGUpLT5jaHRfc2l6ZSk7CiAKIAlpZiAoZXJyICE9IDApIHsKIAkJYWhhc2hfcmVxdWVzdF9mcmVlKCpyZXEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvYXBpLW5pLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9hcGktbmkuYwppbmRleCAzNDZkYjg5Li40ZGFmODI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9hcGktbmkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9hcGktbmkuYwpAQCAtMTI4Niw2ICsxMjg2LDI1IEBACiAJCSAgICAgICBzaXplb2YoKm5pLT5uaV9sbmRfdHVuYWJsZXMpKTsKIAl9CiAKKwkvKgorCSAqIElmIGdpdmVuIHNvbWUgTE5EIHR1bmFibGUgcGFyYW1ldGVycywgcGFyc2UgdGhvc2Ugbm93IHRvCisJICogb3ZlcnJpZGUgdGhlIHZhbHVlcyBpbiB0aGUgTkkgc3RydWN0dXJlLgorCSAqLworCWlmIChjb25mKSB7CisJCWlmIChjb25mLT5jZmdfY29uZmlnX3UuY2ZnX25ldC5uZXRfcGVlcl9ydHJfY3JlZGl0cyA+PSAwKQorCQkJbmktPm5pX3BlZXJydHJjcmVkaXRzID0KKwkJCQljb25mLT5jZmdfY29uZmlnX3UuY2ZnX25ldC5uZXRfcGVlcl9ydHJfY3JlZGl0czsKKwkJaWYgKGNvbmYtPmNmZ19jb25maWdfdS5jZmdfbmV0Lm5ldF9wZWVyX3RpbWVvdXQgPj0gMCkKKwkJCW5pLT5uaV9wZWVydGltZW91dCA9CisJCQkJY29uZi0+Y2ZnX2NvbmZpZ191LmNmZ19uZXQubmV0X3BlZXJfdGltZW91dDsKKwkJaWYgKGNvbmYtPmNmZ19jb25maWdfdS5jZmdfbmV0Lm5ldF9wZWVyX3R4X2NyZWRpdHMgIT0gLTEpCisJCQluaS0+bmlfcGVlcnR4Y3JlZGl0cyA9CisJCQkJY29uZi0+Y2ZnX2NvbmZpZ191LmNmZ19uZXQubmV0X3BlZXJfdHhfY3JlZGl0czsKKwkJaWYgKGNvbmYtPmNmZ19jb25maWdfdS5jZmdfbmV0Lm5ldF9tYXhfdHhfY3JlZGl0cyA+PSAwKQorCQkJbmktPm5pX21heHR4Y3JlZGl0cyA9CisJCQkJY29uZi0+Y2ZnX2NvbmZpZ191LmNmZ19uZXQubmV0X21heF90eF9jcmVkaXRzOworCX0KKwogCXJjID0gbG5kLT5sbmRfc3RhcnR1cChuaSk7CiAKIAltdXRleF91bmxvY2soJnRoZV9sbmV0LmxuX2xuZF9tdXRleCk7CkBAIC0xMjk5LDMzICsxMzE4LDYgQEAKIAkJZ290byBmYWlsZWQwOwogCX0KIAotCS8qCi0JICogSWYgZ2l2ZW4gc29tZSBMTkQgdHVuYWJsZSBwYXJhbWV0ZXJzLCBwYXJzZSB0aG9zZSBub3cgdG8KLQkgKiBvdmVycmlkZSB0aGUgdmFsdWVzIGluIHRoZSBOSSBzdHJ1Y3R1cmUuCi0JICovCi0JaWYgKGNvbmYgJiYgY29uZi0+Y2ZnX2NvbmZpZ191LmNmZ19uZXQubmV0X3BlZXJfcnRyX2NyZWRpdHMgPj0gMCkgewotCQluaS0+bmlfcGVlcnJ0cmNyZWRpdHMgPQotCQkJY29uZi0+Y2ZnX2NvbmZpZ191LmNmZ19uZXQubmV0X3BlZXJfcnRyX2NyZWRpdHM7Ci0JfQotCWlmIChjb25mICYmIGNvbmYtPmNmZ19jb25maWdfdS5jZmdfbmV0Lm5ldF9wZWVyX3RpbWVvdXQgPj0gMCkgewotCQluaS0+bmlfcGVlcnRpbWVvdXQgPQotCQkJY29uZi0+Y2ZnX2NvbmZpZ191LmNmZ19uZXQubmV0X3BlZXJfdGltZW91dDsKLQl9Ci0JLyoKLQkgKiBUT0RPCi0JICogTm90ZTogRm9yIG5vdywgZG9uJ3QgYWxsb3cgdGhlIHVzZXIgdG8gY2hhbmdlCi0JICogcGVlcnR4Y3JlZGl0cyBhcyB0aGlzIG51bWJlciBpcyB1c2VkIGluIHRoZQotCSAqIElCIExORCB0byBjb250cm9sIHF1ZXVlIGRlcHRoLgotCSAqCi0JICogaWYgKGNvbmYgJiYgY29uZi0+Y2ZnX2NvbmZpZ191LmNmZ19uZXQubmV0X3BlZXJfdHhfY3JlZGl0cyAhPSAtMSkKLQkgKgluaS0+bmlfcGVlcnR4Y3JlZGl0cyA9Ci0JICoJCWNvbmYtPmNmZ19jb25maWdfdS5jZmdfbmV0Lm5ldF9wZWVyX3R4X2NyZWRpdHM7Ci0JICovCi0JaWYgKGNvbmYgJiYgY29uZi0+Y2ZnX2NvbmZpZ191LmNmZ19uZXQubmV0X21heF90eF9jcmVkaXRzID49IDApIHsKLQkJbmktPm5pX21heHR4Y3JlZGl0cyA9Ci0JCQljb25mLT5jZmdfY29uZmlnX3UuY2ZnX25ldC5uZXRfbWF4X3R4X2NyZWRpdHM7Ci0JfQotCiAJTEFTU0VSVChuaS0+bmlfcGVlcnRpbWVvdXQgPD0gMCB8fCBsbmQtPmxuZF9xdWVyeSk7CiAKIAlsbmV0X25ldF9sb2NrKExORVRfTE9DS19FWCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9jb25maWcuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2NvbmZpZy5jCmluZGV4IGE3MmFmZGYuLjllMjE4M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2NvbmZpZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2NvbmZpZy5jCkBAIC0zMSw2ICszMSw4IEBACiAgKi8KIAogI2RlZmluZSBERUJVR19TVUJTWVNURU0gU19MTkVUCisjaW5jbHVkZSA8bGludXgvbnNwcm94eS5oPgorI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9saW51eC9sbmV0L2xpYi1sbmV0LmgiCiAKIHN0cnVjdCBsbmV0X3RleHRfYnVmIHsJICAgIC8qIHRtcCBzdHJ1Y3QgZm9yIHBhcnNpbmcgcm91dGVzICovCkBAIC0xMTAsNiArMTEyLDExIEBACiAJCUxJQkNGU19GUkVFKG5pLT5uaV9pbnRlcmZhY2VzW2ldLAogCQkJICAgIHN0cmxlbihuaS0+bmlfaW50ZXJmYWNlc1tpXSkgKyAxKTsKIAl9CisKKwkvKiByZWxlYXNlIHJlZmVyZW5jZSB0byBuZXQgbmFtZXNwYWNlICovCisJaWYgKG5pLT5uaV9uZXRfbnMpCisJCXB1dF9uZXQobmktPm5pX25ldF9ucyk7CisKIAlMSUJDRlNfRlJFRShuaSwgc2l6ZW9mKCpuaSkpOwogfQogCkBAIC0xNzEsNiArMTc4LDEzIEBACiAKIAkvKiBMTkQgd2lsbCBmaWxsIGluIHRoZSBhZGRyZXNzIHBhcnQgb2YgdGhlIE5JRCAqLwogCW5pLT5uaV9uaWQgPSBMTkVUX01LTklEKG5ldCwgMCk7CisKKwkvKiBTdG9yZSBuZXQgbmFtZXNwYWNlIGluIHdoaWNoIGN1cnJlbnQgbmkgaXMgYmVpbmcgY3JlYXRlZCAqLworCWlmIChjdXJyZW50LT5uc3Byb3h5LT5uZXRfbnMpCisJCW5pLT5uaV9uZXRfbnMgPSBnZXRfbmV0KGN1cnJlbnQtPm5zcHJveHktPm5ldF9ucyk7CisJZWxzZQorCQluaS0+bmlfbmV0X25zID0gTlVMTDsKKwogCW5pLT5uaV9sYXN0X2FsaXZlID0ga3RpbWVfZ2V0X3JlYWxfc2Vjb25kcygpOwogCWxpc3RfYWRkX3RhaWwoJm5pLT5uaV9saXN0LCBuaWxpc3QpOwogCXJldHVybiBuaTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2xpYi1tZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLW1kLmMKaW5kZXggMTgzNGJmNy4uZWFiNTNjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLW1kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLW1kLmMKQEAgLTEzNCwxMSArMTM0LDExIEBACiAKIAkJZm9yIChpID0gMDsgaSA8IChpbnQpbmlvdjsgaSsrKSB7CiAJCQkvKiBXZSB0YWtlIHRoZSBwYWdlIHBvaW50ZXIgb24gdHJ1c3QgKi8KLQkJCWlmIChsbWQtPm1kX2lvdi5raW92W2ldLmtpb3Zfb2Zmc2V0ICsKLQkJCSAgICBsbWQtPm1kX2lvdi5raW92W2ldLmtpb3ZfbGVuID4gUEFHRV9TSVpFKQorCQkJaWYgKGxtZC0+bWRfaW92Lmtpb3ZbaV0uYnZfb2Zmc2V0ICsKKwkJCSAgICBsbWQtPm1kX2lvdi5raW92W2ldLmJ2X2xlbiA+IFBBR0VfU0laRSkKIAkJCQlyZXR1cm4gLUVJTlZBTDsgLyogaW52YWxpZCBsZW5ndGggKi8KIAotCQkJdG90YWxfbGVuZ3RoICs9IGxtZC0+bWRfaW92Lmtpb3ZbaV0ua2lvdl9sZW47CisJCQl0b3RhbF9sZW5ndGggKz0gbG1kLT5tZF9pb3Yua2lvdltpXS5idl9sZW47CiAJCX0KIAogCQlsbWQtPm1kX2xlbmd0aCA9IHRvdGFsX2xlbmd0aDsKQEAgLTI5MiwxMSArMjkyLDEyIEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJcmMgPSBsbmV0X21kX2J1aWxkKG1kLCAmdW1kLCB1bmxpbmspOworCWlmIChyYykKKwkJZ290byBvdXRfZnJlZTsKKwogCWNwdCA9IGxuZXRfY3B0X29mX2Nvb2tpZShtZWguY29va2llKTsKIAogCWxuZXRfcmVzX2xvY2soY3B0KTsKLQlpZiAocmMpCi0JCWdvdG8gZmFpbGVkOwogCiAJbWUgPSBsbmV0X2hhbmRsZTJtZSgmbWVoKTsKIAlpZiAoIW1lKQpAQCAtMzA3LDcgKzMwOCw3IEBACiAJCXJjID0gbG5ldF9tZF9saW5rKG1kLCB1bWQuZXFfaGFuZGxlLCBjcHQpOwogCiAJaWYgKHJjKQotCQlnb3RvIGZhaWxlZDsKKwkJZ290byBvdXRfdW5sb2NrOwogCiAJLyoKIAkgKiBhdHRhY2ggdGhpcyBNRCB0byBwb3J0YWwgb2YgTUUgYW5kIGNoZWNrIGlmIGl0IG1hdGNoZXMgYW55CkBAIC0zMjQsMTAgKzMyNSwxMCBAQAogCiAJcmV0dXJuIDA7CiAKLSBmYWlsZWQ6Ci0JbG5ldF9tZF9mcmVlKG1kKTsKLQorb3V0X3VubG9jazoKIAlsbmV0X3Jlc191bmxvY2soY3B0KTsKK291dF9mcmVlOgorCWxuZXRfbWRfZnJlZShtZCk7CiAJcmV0dXJuIHJjOwogfQogRVhQT1JUX1NZTUJPTChMTmV0TURBdHRhY2gpOwpAQCAtMzcwLDI0ICszNzEsMjUgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlyYyA9IGxuZXRfbWRfYnVpbGQobWQsICZ1bWQsIHVubGluayk7CisJaWYgKHJjKQorCQlnb3RvIG91dF9mcmVlOwogCiAJY3B0ID0gbG5ldF9yZXNfbG9ja19jdXJyZW50KCk7Ci0JaWYgKHJjKQotCQlnb3RvIGZhaWxlZDsKIAogCXJjID0gbG5ldF9tZF9saW5rKG1kLCB1bWQuZXFfaGFuZGxlLCBjcHQpOwogCWlmIChyYykKLQkJZ290byBmYWlsZWQ7CisJCWdvdG8gb3V0X3VubG9jazsKIAogCWxuZXRfbWQyaGFuZGxlKGhhbmRsZSwgbWQpOwogCiAJbG5ldF9yZXNfdW5sb2NrKGNwdCk7CiAJcmV0dXJuIDA7CiAKLSBmYWlsZWQ6CitvdXRfdW5sb2NrOgorCWxuZXRfcmVzX3VubG9jayhjcHQpOworb3V0X2ZyZWU6CiAJbG5ldF9tZF9mcmVlKG1kKTsKIAotCWxuZXRfcmVzX3VubG9jayhjcHQpOwogCXJldHVybiByYzsKIH0KIEVYUE9SVF9TWU1CT0woTE5ldE1EQmluZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9saWItbW92ZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLW1vdmUuYwppbmRleCBlNmQzYjgwLi40OGU2ZjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9saWItbW92ZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2xpYi1tb3ZlLmMKQEAgLTM3LDYgKzM3LDggQEAKICNkZWZpbmUgREVCVUdfU1VCU1lTVEVNIFNfTE5FVAogCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9saW51eC9sbmV0L2xpYi1sbmV0LmgiCisjaW5jbHVkZSA8bGludXgvbnNwcm94eS5oPgorI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAKIHN0YXRpYyBpbnQgbG9jYWxfbmlkX2Rpc3RfemVybyA9IDE7CiBtb2R1bGVfcGFyYW0obG9jYWxfbmlkX2Rpc3RfemVybywgaW50LCAwNDQ0KTsKQEAgLTE2NiwyNSArMTY4LDE3IEBACiBFWFBPUlRfU1lNQk9MKGxuZXRfaW92X25vYik7CiAKIHZvaWQKLWxuZXRfY29weV9pb3YyaW92KHVuc2lnbmVkIGludCBuZGlvdiwgc3RydWN0IGt2ZWMgKmRpb3YsIHVuc2lnbmVkIGludCBkb2Zmc2V0LAotCQkgIHVuc2lnbmVkIGludCBuc2lvdiwgc3RydWN0IGt2ZWMgKnNpb3YsIHVuc2lnbmVkIGludCBzb2Zmc2V0LAotCQkgIHVuc2lnbmVkIGludCBub2IpCitsbmV0X2NvcHlfaW92Mml0ZXIoc3RydWN0IGlvdl9pdGVyICp0bywKKwkJICAgdW5zaWduZWQgaW50IG5zaW92LCBjb25zdCBzdHJ1Y3Qga3ZlYyAqc2lvdiwKKwkJICAgdW5zaWduZWQgaW50IHNvZmZzZXQsIHVuc2lnbmVkIGludCBub2IpCiB7CiAJLyogTkIgZGlvdiwgc2lvdiBhcmUgUkVBRC1PTkxZICovCi0JdW5zaWduZWQgaW50IHRoaXNfbm9iOworCWNvbnN0IGNoYXIgKnM7CisJc2l6ZV90IGxlZnQ7CiAKIAlpZiAoIW5vYikKIAkJcmV0dXJuOwogCi0JLyogc2tpcCBjb21wbGV0ZSBmcmFncyBiZWZvcmUgJ2RvZmZzZXQnICovCi0JTEFTU0VSVChuZGlvdiA+IDApOwotCXdoaWxlIChkb2Zmc2V0ID49IGRpb3YtPmlvdl9sZW4pIHsKLQkJZG9mZnNldCAtPSBkaW92LT5pb3ZfbGVuOwotCQlkaW92Kys7Ci0JCW5kaW92LS07Ci0JCUxBU1NFUlQobmRpb3YgPiAwKTsKLQl9Ci0KIAkvKiBza2lwIGNvbXBsZXRlIGZyYWdzIGJlZm9yZSAnc29mZnNldCcgKi8KIAlMQVNTRVJUKG5zaW92ID4gMCk7CiAJd2hpbGUgKHNvZmZzZXQgPj0gc2lvdi0+aW92X2xlbikgewpAQCAtMTk0LDM5ICsxODgsNjggQEAKIAkJTEFTU0VSVChuc2lvdiA+IDApOwogCX0KIAorCXMgPSAoY2hhciAqKXNpb3YtPmlvdl9iYXNlICsgc29mZnNldDsKKwlsZWZ0ID0gc2lvdi0+aW92X2xlbiAtIHNvZmZzZXQ7CiAJZG8gewotCQlMQVNTRVJUKG5kaW92ID4gMCk7CisJCXNpemVfdCBuLCBjb3B5ID0gbGVmdDsKIAkJTEFTU0VSVChuc2lvdiA+IDApOwotCQl0aGlzX25vYiA9IG1pbihkaW92LT5pb3ZfbGVuIC0gZG9mZnNldCwKLQkJCSAgICAgICBzaW92LT5pb3ZfbGVuIC0gc29mZnNldCk7Ci0JCXRoaXNfbm9iID0gbWluKHRoaXNfbm9iLCBub2IpOwogCi0JCW1lbWNweSgoY2hhciAqKWRpb3YtPmlvdl9iYXNlICsgZG9mZnNldCwKLQkJICAgICAgIChjaGFyICopc2lvdi0+aW92X2Jhc2UgKyBzb2Zmc2V0LCB0aGlzX25vYik7Ci0JCW5vYiAtPSB0aGlzX25vYjsKKwkJaWYgKGNvcHkgPiBub2IpCisJCQljb3B5ID0gbm9iOworCQluID0gY29weV90b19pdGVyKHMsIGNvcHksIHRvKTsKKwkJaWYgKG4gIT0gY29weSkKKwkJCXJldHVybjsKKwkJbm9iIC09IG47CiAKLQkJaWYgKGRpb3YtPmlvdl9sZW4gPiBkb2Zmc2V0ICsgdGhpc19ub2IpIHsKLQkJCWRvZmZzZXQgKz0gdGhpc19ub2I7Ci0JCX0gZWxzZSB7Ci0JCQlkaW92Kys7Ci0JCQluZGlvdi0tOwotCQkJZG9mZnNldCA9IDA7Ci0JCX0KLQotCQlpZiAoc2lvdi0+aW92X2xlbiA+IHNvZmZzZXQgKyB0aGlzX25vYikgewotCQkJc29mZnNldCArPSB0aGlzX25vYjsKLQkJfSBlbHNlIHsKLQkJCXNpb3YrKzsKLQkJCW5zaW92LS07Ci0JCQlzb2Zmc2V0ID0gMDsKLQkJfQorCQlzaW92Kys7CisJCXMgPSAoY2hhciAqKXNpb3YtPmlvdl9iYXNlOworCQlsZWZ0ID0gc2lvdi0+aW92X2xlbjsKKwkJbnNpb3YtLTsKIAl9IHdoaWxlIChub2IgPiAwKTsKIH0KLUVYUE9SVF9TWU1CT0wobG5ldF9jb3B5X2lvdjJpb3YpOworRVhQT1JUX1NZTUJPTChsbmV0X2NvcHlfaW92Mml0ZXIpOworCit2b2lkCitsbmV0X2NvcHlfa2lvdjJpdGVyKHN0cnVjdCBpb3ZfaXRlciAqdG8sCisJCSAgICB1bnNpZ25lZCBpbnQgbnNpb3YsIGNvbnN0IGxuZXRfa2lvdl90ICpzaW92LAorCQkgICAgdW5zaWduZWQgaW50IHNvZmZzZXQsIHVuc2lnbmVkIGludCBub2IpCit7CisJaWYgKCFub2IpCisJCXJldHVybjsKKworCUxBU1NFUlQoIWluX2ludGVycnVwdCgpKTsKKworCUxBU1NFUlQobnNpb3YgPiAwKTsKKwl3aGlsZSAoc29mZnNldCA+PSBzaW92LT5idl9sZW4pIHsKKwkJc29mZnNldCAtPSBzaW92LT5idl9sZW47CisJCXNpb3YrKzsKKwkJbnNpb3YtLTsKKwkJTEFTU0VSVChuc2lvdiA+IDApOworCX0KKworCWRvIHsKKwkJc2l6ZV90IGNvcHkgPSBzaW92LT5idl9sZW4gLSBzb2Zmc2V0LCBuOworCisJCUxBU1NFUlQobnNpb3YgPiAwKTsKKworCQlpZiAoY29weSA+IG5vYikKKwkJCWNvcHkgPSBub2I7CisJCW4gPSBjb3B5X3BhZ2VfdG9faXRlcihzaW92LT5idl9wYWdlLAorCQkJCSAgICAgIHNpb3YtPmJ2X29mZnNldCArIHNvZmZzZXQsCisJCQkJICAgICAgY29weSwgdG8pOworCQlpZiAobiAhPSBjb3B5KQorCQkJcmV0dXJuOworCQlub2IgLT0gbjsKKwkJc2lvdisrOworCQluc2lvdi0tOworCQlzb2Zmc2V0ID0gMDsKKwl9IHdoaWxlIChub2IgPiAwKTsKK30KK0VYUE9SVF9TWU1CT0wobG5ldF9jb3B5X2tpb3YyaXRlcik7CiAKIGludAogbG5ldF9leHRyYWN0X2lvdihpbnQgZHN0X25pb3YsIHN0cnVjdCBrdmVjICpkc3QsCi0JCSBpbnQgc3JjX25pb3YsIHN0cnVjdCBrdmVjICpzcmMsCisJCSBpbnQgc3JjX25pb3YsIGNvbnN0IHN0cnVjdCBrdmVjICpzcmMsCiAJCSB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuKQogewogCS8qCkBAIC0yODAsMjM4ICszMDMsMTUgQEAKIAogCUxBU1NFUlQoIW5pb3YgfHwga2lvdik7CiAJd2hpbGUgKG5pb3YtLSA+IDApCi0JCW5vYiArPSAoa2lvdisrKS0+a2lvdl9sZW47CisJCW5vYiArPSAoa2lvdisrKS0+YnZfbGVuOwogCiAJcmV0dXJuIG5vYjsKIH0KIEVYUE9SVF9TWU1CT0wobG5ldF9raW92X25vYik7CiAKLXZvaWQKLWxuZXRfY29weV9raW92Mmtpb3YodW5zaWduZWQgaW50IG5kaW92LCBsbmV0X2tpb3ZfdCAqZGlvdiwgdW5zaWduZWQgaW50IGRvZmZzZXQsCi0JCSAgICB1bnNpZ25lZCBpbnQgbnNpb3YsIGxuZXRfa2lvdl90ICpzaW92LCB1bnNpZ25lZCBpbnQgc29mZnNldCwKLQkJICAgIHVuc2lnbmVkIGludCBub2IpCi17Ci0JLyogTkIgZGlvdiwgc2lvdiBhcmUgUkVBRC1PTkxZICovCi0JdW5zaWduZWQgaW50IHRoaXNfbm9iOwotCWNoYXIgKmRhZGRyID0gTlVMTDsKLQljaGFyICpzYWRkciA9IE5VTEw7Ci0KLQlpZiAoIW5vYikKLQkJcmV0dXJuOwotCi0JTEFTU0VSVCghaW5faW50ZXJydXB0KCkpOwotCi0JTEFTU0VSVChuZGlvdiA+IDApOwotCXdoaWxlIChkb2Zmc2V0ID49IGRpb3YtPmtpb3ZfbGVuKSB7Ci0JCWRvZmZzZXQgLT0gZGlvdi0+a2lvdl9sZW47Ci0JCWRpb3YrKzsKLQkJbmRpb3YtLTsKLQkJTEFTU0VSVChuZGlvdiA+IDApOwotCX0KLQotCUxBU1NFUlQobnNpb3YgPiAwKTsKLQl3aGlsZSAoc29mZnNldCA+PSBzaW92LT5raW92X2xlbikgewotCQlzb2Zmc2V0IC09IHNpb3YtPmtpb3ZfbGVuOwotCQlzaW92Kys7Ci0JCW5zaW92LS07Ci0JCUxBU1NFUlQobnNpb3YgPiAwKTsKLQl9Ci0KLQlkbyB7Ci0JCUxBU1NFUlQobmRpb3YgPiAwKTsKLQkJTEFTU0VSVChuc2lvdiA+IDApOwotCQl0aGlzX25vYiA9IG1pbihkaW92LT5raW92X2xlbiAtIGRvZmZzZXQsCi0JCQkgICAgICAgc2lvdi0+a2lvdl9sZW4gLSBzb2Zmc2V0KTsKLQkJdGhpc19ub2IgPSBtaW4odGhpc19ub2IsIG5vYik7Ci0KLQkJaWYgKCFkYWRkcikKLQkJCWRhZGRyID0gKChjaGFyICopa21hcChkaW92LT5raW92X3BhZ2UpKSArCi0JCQkJZGlvdi0+a2lvdl9vZmZzZXQgKyBkb2Zmc2V0OwotCQlpZiAoIXNhZGRyKQotCQkJc2FkZHIgPSAoKGNoYXIgKilrbWFwKHNpb3YtPmtpb3ZfcGFnZSkpICsKLQkJCQlzaW92LT5raW92X29mZnNldCArIHNvZmZzZXQ7Ci0KLQkJLyoKLQkJICogVmFuaXNoaW5nIHJpc2sgb2Yga21hcCBkZWFkbG9jayB3aGVuIG1hcHBpbmcgMiBwYWdlcy4KLQkJICogSG93ZXZlciBpbiBwcmFjdGljZSBhdCBsZWFzdCBvbmUgb2YgdGhlIGtpb3ZzIHdpbGwgYmUgbWFwcGVkCi0JCSAqIGtlcm5lbCBwYWdlcyBhbmQgdGhlIG1hcC91bm1hcCB3aWxsIGJlIE5PT1BzCi0JCSAqLwotCQltZW1jcHkoZGFkZHIsIHNhZGRyLCB0aGlzX25vYik7Ci0JCW5vYiAtPSB0aGlzX25vYjsKLQotCQlpZiAoZGlvdi0+a2lvdl9sZW4gPiBkb2Zmc2V0ICsgdGhpc19ub2IpIHsKLQkJCWRhZGRyICs9IHRoaXNfbm9iOwotCQkJZG9mZnNldCArPSB0aGlzX25vYjsKLQkJfSBlbHNlIHsKLQkJCWt1bm1hcChkaW92LT5raW92X3BhZ2UpOwotCQkJZGFkZHIgPSBOVUxMOwotCQkJZGlvdisrOwotCQkJbmRpb3YtLTsKLQkJCWRvZmZzZXQgPSAwOwotCQl9Ci0KLQkJaWYgKHNpb3YtPmtpb3ZfbGVuID4gc29mZnNldCArIHRoaXNfbm9iKSB7Ci0JCQlzYWRkciArPSB0aGlzX25vYjsKLQkJCXNvZmZzZXQgKz0gdGhpc19ub2I7Ci0JCX0gZWxzZSB7Ci0JCQlrdW5tYXAoc2lvdi0+a2lvdl9wYWdlKTsKLQkJCXNhZGRyID0gTlVMTDsKLQkJCXNpb3YrKzsKLQkJCW5zaW92LS07Ci0JCQlzb2Zmc2V0ID0gMDsKLQkJfQotCX0gd2hpbGUgKG5vYiA+IDApOwotCi0JaWYgKGRhZGRyKQotCQlrdW5tYXAoZGlvdi0+a2lvdl9wYWdlKTsKLQlpZiAoc2FkZHIpCi0JCWt1bm1hcChzaW92LT5raW92X3BhZ2UpOwotfQotRVhQT1JUX1NZTUJPTChsbmV0X2NvcHlfa2lvdjJraW92KTsKLQotdm9pZAotbG5ldF9jb3B5X2tpb3YyaW92KHVuc2lnbmVkIGludCBuaW92LCBzdHJ1Y3Qga3ZlYyAqaW92LCB1bnNpZ25lZCBpbnQgaW92b2Zmc2V0LAotCQkgICB1bnNpZ25lZCBpbnQgbmtpb3YsIGxuZXRfa2lvdl90ICpraW92LAotCQkgICB1bnNpZ25lZCBpbnQga2lvdm9mZnNldCwgdW5zaWduZWQgaW50IG5vYikKLXsKLQkvKiBOQiBpb3YsIGtpb3YgYXJlIFJFQUQtT05MWSAqLwotCXVuc2lnbmVkIGludCB0aGlzX25vYjsKLQljaGFyICphZGRyID0gTlVMTDsKLQotCWlmICghbm9iKQotCQlyZXR1cm47Ci0KLQlMQVNTRVJUKCFpbl9pbnRlcnJ1cHQoKSk7Ci0KLQlMQVNTRVJUKG5pb3YgPiAwKTsKLQl3aGlsZSAoaW92b2Zmc2V0ID49IGlvdi0+aW92X2xlbikgewotCQlpb3ZvZmZzZXQgLT0gaW92LT5pb3ZfbGVuOwotCQlpb3YrKzsKLQkJbmlvdi0tOwotCQlMQVNTRVJUKG5pb3YgPiAwKTsKLQl9Ci0KLQlMQVNTRVJUKG5raW92ID4gMCk7Ci0Jd2hpbGUgKGtpb3ZvZmZzZXQgPj0ga2lvdi0+a2lvdl9sZW4pIHsKLQkJa2lvdm9mZnNldCAtPSBraW92LT5raW92X2xlbjsKLQkJa2lvdisrOwotCQlua2lvdi0tOwotCQlMQVNTRVJUKG5raW92ID4gMCk7Ci0JfQotCi0JZG8gewotCQlMQVNTRVJUKG5pb3YgPiAwKTsKLQkJTEFTU0VSVChua2lvdiA+IDApOwotCQl0aGlzX25vYiA9IG1pbihpb3YtPmlvdl9sZW4gLSBpb3ZvZmZzZXQsCi0JCQkgICAgICAgKF9fa2VybmVsX3NpemVfdClraW92LT5raW92X2xlbiAtIGtpb3ZvZmZzZXQpOwotCQl0aGlzX25vYiA9IG1pbih0aGlzX25vYiwgbm9iKTsKLQotCQlpZiAoIWFkZHIpCi0JCQlhZGRyID0gKChjaGFyICopa21hcChraW92LT5raW92X3BhZ2UpKSArCi0JCQkJa2lvdi0+a2lvdl9vZmZzZXQgKyBraW92b2Zmc2V0OwotCi0JCW1lbWNweSgoY2hhciAqKWlvdi0+aW92X2Jhc2UgKyBpb3ZvZmZzZXQsIGFkZHIsIHRoaXNfbm9iKTsKLQkJbm9iIC09IHRoaXNfbm9iOwotCi0JCWlmIChpb3YtPmlvdl9sZW4gPiBpb3ZvZmZzZXQgKyB0aGlzX25vYikgewotCQkJaW92b2Zmc2V0ICs9IHRoaXNfbm9iOwotCQl9IGVsc2UgewotCQkJaW92Kys7Ci0JCQluaW92LS07Ci0JCQlpb3ZvZmZzZXQgPSAwOwotCQl9Ci0KLQkJaWYgKGtpb3YtPmtpb3ZfbGVuID4ga2lvdm9mZnNldCArIHRoaXNfbm9iKSB7Ci0JCQlhZGRyICs9IHRoaXNfbm9iOwotCQkJa2lvdm9mZnNldCArPSB0aGlzX25vYjsKLQkJfSBlbHNlIHsKLQkJCWt1bm1hcChraW92LT5raW92X3BhZ2UpOwotCQkJYWRkciA9IE5VTEw7Ci0JCQlraW92Kys7Ci0JCQlua2lvdi0tOwotCQkJa2lvdm9mZnNldCA9IDA7Ci0JCX0KLQotCX0gd2hpbGUgKG5vYiA+IDApOwotCi0JaWYgKGFkZHIpCi0JCWt1bm1hcChraW92LT5raW92X3BhZ2UpOwotfQotRVhQT1JUX1NZTUJPTChsbmV0X2NvcHlfa2lvdjJpb3YpOwotCi12b2lkCi1sbmV0X2NvcHlfaW92Mmtpb3YodW5zaWduZWQgaW50IG5raW92LCBsbmV0X2tpb3ZfdCAqa2lvdiwKLQkJICAgdW5zaWduZWQgaW50IGtpb3ZvZmZzZXQsIHVuc2lnbmVkIGludCBuaW92LAotCQkgICBzdHJ1Y3Qga3ZlYyAqaW92LCB1bnNpZ25lZCBpbnQgaW92b2Zmc2V0LAotCQkgICB1bnNpZ25lZCBpbnQgbm9iKQotewotCS8qIE5CIGtpb3YsIGlvdiBhcmUgUkVBRC1PTkxZICovCi0JdW5zaWduZWQgaW50IHRoaXNfbm9iOwotCWNoYXIgKmFkZHIgPSBOVUxMOwotCi0JaWYgKCFub2IpCi0JCXJldHVybjsKLQotCUxBU1NFUlQoIWluX2ludGVycnVwdCgpKTsKLQotCUxBU1NFUlQobmtpb3YgPiAwKTsKLQl3aGlsZSAoa2lvdm9mZnNldCA+PSBraW92LT5raW92X2xlbikgewotCQlraW92b2Zmc2V0IC09IGtpb3YtPmtpb3ZfbGVuOwotCQlraW92Kys7Ci0JCW5raW92LS07Ci0JCUxBU1NFUlQobmtpb3YgPiAwKTsKLQl9Ci0KLQlMQVNTRVJUKG5pb3YgPiAwKTsKLQl3aGlsZSAoaW92b2Zmc2V0ID49IGlvdi0+aW92X2xlbikgewotCQlpb3ZvZmZzZXQgLT0gaW92LT5pb3ZfbGVuOwotCQlpb3YrKzsKLQkJbmlvdi0tOwotCQlMQVNTRVJUKG5pb3YgPiAwKTsKLQl9Ci0KLQlkbyB7Ci0JCUxBU1NFUlQobmtpb3YgPiAwKTsKLQkJTEFTU0VSVChuaW92ID4gMCk7Ci0JCXRoaXNfbm9iID0gbWluKChfX2tlcm5lbF9zaXplX3Qpa2lvdi0+a2lvdl9sZW4gLSBraW92b2Zmc2V0LAotCQkJICAgICAgIGlvdi0+aW92X2xlbiAtIGlvdm9mZnNldCk7Ci0JCXRoaXNfbm9iID0gbWluKHRoaXNfbm9iLCBub2IpOwotCi0JCWlmICghYWRkcikKLQkJCWFkZHIgPSAoKGNoYXIgKilrbWFwKGtpb3YtPmtpb3ZfcGFnZSkpICsKLQkJCQlraW92LT5raW92X29mZnNldCArIGtpb3ZvZmZzZXQ7Ci0KLQkJbWVtY3B5KGFkZHIsIChjaGFyICopaW92LT5pb3ZfYmFzZSArIGlvdm9mZnNldCwgdGhpc19ub2IpOwotCQlub2IgLT0gdGhpc19ub2I7Ci0KLQkJaWYgKGtpb3YtPmtpb3ZfbGVuID4ga2lvdm9mZnNldCArIHRoaXNfbm9iKSB7Ci0JCQlhZGRyICs9IHRoaXNfbm9iOwotCQkJa2lvdm9mZnNldCArPSB0aGlzX25vYjsKLQkJfSBlbHNlIHsKLQkJCWt1bm1hcChraW92LT5raW92X3BhZ2UpOwotCQkJYWRkciA9IE5VTEw7Ci0JCQlraW92Kys7Ci0JCQlua2lvdi0tOwotCQkJa2lvdm9mZnNldCA9IDA7Ci0JCX0KLQotCQlpZiAoaW92LT5pb3ZfbGVuID4gaW92b2Zmc2V0ICsgdGhpc19ub2IpIHsKLQkJCWlvdm9mZnNldCArPSB0aGlzX25vYjsKLQkJfSBlbHNlIHsKLQkJCWlvdisrOwotCQkJbmlvdi0tOwotCQkJaW92b2Zmc2V0ID0gMDsKLQkJfQotCX0gd2hpbGUgKG5vYiA+IDApOwotCi0JaWYgKGFkZHIpCi0JCWt1bm1hcChraW92LT5raW92X3BhZ2UpOwotfQotRVhQT1JUX1NZTUJPTChsbmV0X2NvcHlfaW92Mmtpb3YpOwotCiBpbnQKIGxuZXRfZXh0cmFjdF9raW92KGludCBkc3RfbmlvdiwgbG5ldF9raW92X3QgKmRzdCwKLQkJICBpbnQgc3JjX25pb3YsIGxuZXRfa2lvdl90ICpzcmMsCisJCSAgaW50IHNyY19uaW92LCBjb25zdCBsbmV0X2tpb3ZfdCAqc3JjLAogCQkgIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJLyoKQEAgLTUyNiw4ICszMjYsOCBAQAogCQlyZXR1cm4gMDsJCSAgICAgLyogbm8gZnJhZ3MgKi8KIAogCUxBU1NFUlQoc3JjX25pb3YgPiAwKTsKLQl3aGlsZSAob2Zmc2V0ID49IHNyYy0+a2lvdl9sZW4pIHsgICAgICAvKiBza2lwIGluaXRpYWwgZnJhZ3MgKi8KLQkJb2Zmc2V0IC09IHNyYy0+a2lvdl9sZW47CisJd2hpbGUgKG9mZnNldCA+PSBzcmMtPmJ2X2xlbikgeyAgICAgIC8qIHNraXAgaW5pdGlhbCBmcmFncyAqLworCQlvZmZzZXQgLT0gc3JjLT5idl9sZW47CiAJCXNyY19uaW92LS07CiAJCXNyYysrOwogCQlMQVNTRVJUKHNyY19uaW92ID4gMCk7CkBAIC01MzgsMTkgKzMzOCwxOSBAQAogCQlMQVNTRVJUKHNyY19uaW92ID4gMCk7CiAJCUxBU1NFUlQoKGludCluaW92IDw9IGRzdF9uaW92KTsKIAotCQlmcmFnX2xlbiA9IHNyYy0+a2lvdl9sZW4gLSBvZmZzZXQ7Ci0JCWRzdC0+a2lvdl9wYWdlID0gc3JjLT5raW92X3BhZ2U7Ci0JCWRzdC0+a2lvdl9vZmZzZXQgPSBzcmMtPmtpb3Zfb2Zmc2V0ICsgb2Zmc2V0OworCQlmcmFnX2xlbiA9IHNyYy0+YnZfbGVuIC0gb2Zmc2V0OworCQlkc3QtPmJ2X3BhZ2UgPSBzcmMtPmJ2X3BhZ2U7CisJCWRzdC0+YnZfb2Zmc2V0ID0gc3JjLT5idl9vZmZzZXQgKyBvZmZzZXQ7CiAKIAkJaWYgKGxlbiA8PSBmcmFnX2xlbikgewotCQkJZHN0LT5raW92X2xlbiA9IGxlbjsKLQkJCUxBU1NFUlQoZHN0LT5raW92X29mZnNldCArIGRzdC0+a2lvdl9sZW4KKwkJCWRzdC0+YnZfbGVuID0gbGVuOworCQkJTEFTU0VSVChkc3QtPmJ2X29mZnNldCArIGRzdC0+YnZfbGVuCiAJCQkJCTw9IFBBR0VfU0laRSk7CiAJCQlyZXR1cm4gbmlvdjsKIAkJfQogCi0JCWRzdC0+a2lvdl9sZW4gPSBmcmFnX2xlbjsKLQkJTEFTU0VSVChkc3QtPmtpb3Zfb2Zmc2V0ICsgZHN0LT5raW92X2xlbiA8PSBQQUdFX1NJWkUpOworCQlkc3QtPmJ2X2xlbiA9IGZyYWdfbGVuOworCQlMQVNTRVJUKGRzdC0+YnZfb2Zmc2V0ICsgZHN0LT5idl9sZW4gPD0gUEFHRV9TSVpFKTsKIAogCQlsZW4gLT0gZnJhZ19sZW47CiAJCWRzdCsrOwpAQCAtNTY5LDYgKzM2OSw3IEBACiAJdW5zaWduZWQgaW50IG5pb3YgPSAwOwogCXN0cnVjdCBrdmVjICppb3YgPSBOVUxMOwogCWxuZXRfa2lvdl90ICpraW92ID0gTlVMTDsKKwlzdHJ1Y3QgaW92X2l0ZXIgdG87CiAJaW50IHJjOwogCiAJTEFTU0VSVCghaW5faW50ZXJydXB0KCkpOwpAQCAtNTk0LDggKzM5NSwxNCBAQAogCQl9CiAJfQogCi0JcmMgPSBuaS0+bmlfbG5kLT5sbmRfcmVjdihuaSwgcHJpdmF0ZSwgbXNnLCBkZWxheWVkLAotCQkJCSAgbmlvdiwgaW92LCBraW92LCBvZmZzZXQsIG1sZW4sIHJsZW4pOworCWlmIChpb3YpIHsKKwkJaW92X2l0ZXJfa3ZlYygmdG8sIElURVJfS1ZFQyB8IFJFQUQsIGlvdiwgbmlvdiwgbWxlbiArIG9mZnNldCk7CisJCWlvdl9pdGVyX2FkdmFuY2UoJnRvLCBvZmZzZXQpOworCX0gZWxzZSB7CisJCWlvdl9pdGVyX2J2ZWMoJnRvLCBJVEVSX0JWRUMgfCBSRUFELCBraW92LCBuaW92LCBtbGVuICsgb2Zmc2V0KTsKKwkJaW92X2l0ZXJfYWR2YW5jZSgmdG8sIG9mZnNldCk7CisJfQorCXJjID0gbmktPm5pX2xuZC0+bG5kX3JlY3YobmksIHByaXZhdGUsIG1zZywgZGVsYXllZCwgJnRvLCBybGVuKTsKIAlpZiAocmMgPCAwKQogCQlsbmV0X2ZpbmFsaXplKG5pLCBtc2csIHJjKTsKIH0KQEAgLTIwMDIsNiArMTgwOSw5IEBACiAJCSAgICAgICBsaWJjZnNfbmlkMnN0cihmcm9tX25pZCksIGxpYmNmc19uaWQyc3RyKHNyY19uaWQpLAogCQkgICAgICAgbG5ldF9tc2d0eXAyc3RyKHR5cGUpLCByYyk7CiAJCWxuZXRfbXNnX2ZyZWUobXNnKTsKKwkJaWYgKHJjID09IC1FU0hVVERPV04pCisJCQkvKiBXZSBhcmUgc2h1dHRpbmcgZG93bi4gRG9uJ3QgZG8gYW55dGhpbmcgbW9yZSAqLworCQkJcmV0dXJuIDA7CiAJCWdvdG8gZHJvcDsKIAl9CiAKQEAgLTI1MTIsNiArMjMyMiwxNSBAQAogCQl9CiAKIAkJaWYgKExORVRfTklETkVUKG5pLT5uaV9uaWQpID09IGRzdG5ldCkgeworCQkJLyoKKwkJCSAqIENoZWNrIGlmIG5pIHdhcyBvcmlnaW5hbGx5IGNyZWF0ZWQgaW4KKwkJCSAqIGN1cnJlbnQgbmV0IG5hbWVzcGFjZS4KKwkJCSAqIElmIG5vdCwgYXNzaWduIG9yZGVyIGFib3ZlIDB4ZmZmZjAwMDAsCisJCQkgKiB0byBtYWtlIHRoaXMgbmkgbm90IGEgcHJpb3JpdHkuCisJCQkgKi8KKwkJCWlmICghbmV0X2VxKG5pLT5uaV9uZXRfbnMsIGN1cnJlbnQtPm5zcHJveHktPm5ldF9ucykpCisJCQkJb3JkZXIgKz0gMHhmZmZmMDAwMDsKKwogCQkJaWYgKHNyY25pZHApCiAJCQkJKnNyY25pZHAgPSBuaS0+bmlfbmlkOwogCQkJaWYgKG9yZGVycCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2xpYi1tc2cuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2xpYi1tc2cuYwppbmRleCA5MTBlMTA2Li4wODk3ZTU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9saWItbXNnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLW1zZy5jCkBAIC00NDksMjMgKzQ0OSw3IEBACiAKIAlpZiAoIW1zZykKIAkJcmV0dXJuOwotI2lmIDAKLQlDREVCVUcoRF9XQVJOSU5HLCAiJXMgbXNnLT4lcyBGbGFnczolcyVzJXMlcyVzJXMlcyVzJXMlcyVzIHR4cCAlcyByeHAgJXNcbiIsCi0JICAgICAgIGxuZXRfbXNndHlwMnN0cihtc2ctPm1zZ190eXBlKSwgbGliY2ZzX2lkMnN0cihtc2ctPm1zZ190YXJnZXQpLAotCSAgICAgICBtc2ctPm1zZ190YXJnZXRfaXNfcm91dGVyID8gInQiIDogIiIsCi0JICAgICAgIG1zZy0+bXNnX3JvdXRpbmcgPyAiWCIgOiAiIiwKLQkgICAgICAgbXNnLT5tc2dfYWNrID8gIkEiIDogIiIsCi0JICAgICAgIG1zZy0+bXNnX3NlbmRpbmcgPyAiUyIgOiAiIiwKLQkgICAgICAgbXNnLT5tc2dfcmVjZWl2aW5nID8gIlIiIDogIiIsCi0JICAgICAgIG1zZy0+bXNnX2RlbGF5ZWQgPyAiZCIgOiAiIiwKLQkgICAgICAgbXNnLT5tc2dfdHhjcmVkaXQgPyAiQyIgOiAiIiwKLQkgICAgICAgbXNnLT5tc2dfcGVlcnR4Y3JlZGl0ID8gImMiIDogIiIsCi0JICAgICAgIG1zZy0+bXNnX3J0cmNyZWRpdCA/ICJGIiA6ICIiLAotCSAgICAgICBtc2ctPm1zZ19wZWVycnRyY3JlZGl0ID8gImYiIDogIiIsCi0JICAgICAgIG1zZy0+bXNnX29uYWN0aXZlbGlzdCA/ICIhIiA6ICIiLAotCSAgICAgICAhbXNnLT5tc2dfdHhwZWVyID8gIjxub25lPiIgOiBsaWJjZnNfbmlkMnN0cihtc2ctPm1zZ190eHBlZXItPmxwX25pZCksCi0JICAgICAgICFtc2ctPm1zZ19yeHBlZXIgPyAiPG5vbmU+IiA6IGxpYmNmc19uaWQyc3RyKG1zZy0+bXNnX3J4cGVlci0+bHBfbmlkKSk7Ci0jZW5kaWYKKwogCW1zZy0+bXNnX2V2LnN0YXR1cyA9IHN0YXR1czsKIAogCWlmIChtc2ctPm1zZ19tZCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLXNvY2tldC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLXNvY2tldC5jCmluZGV4IDg5MWZkNTkuLjRlNmRkNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2xpYi1zb2NrZXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9saWItc29ja2V0LmMKQEAgLTI2NSwyMSArMjY1LDE3IEBACiAJbG9uZyBqaWZmaWVzX2xlZnQgPSB0aW1lb3V0ICogbXNlY3NfdG9famlmZmllcyhNU0VDX1BFUl9TRUMpOwogCXVuc2lnbmVkIGxvbmcgdGhlbjsKIAlzdHJ1Y3QgdGltZXZhbCB0djsKKwlzdHJ1Y3Qga3ZlYyAgaW92ID0geyAuaW92X2Jhc2UgPSBidWZmZXIsIC5pb3ZfbGVuICA9IG5vYiB9OworCXN0cnVjdCBtc2doZHIgbXNnID0ge05VTEwsfTsKIAogCUxBU1NFUlQobm9iID4gMCk7CiAJLyoKIAkgKiBDYWxsZXIgbWF5IHBhc3MgYSB6ZXJvIHRpbWVvdXQgaWYgc2hlIHRoaW5rcyB0aGUgc29ja2V0IGJ1ZmZlciBpcwogCSAqIGVtcHR5IGVub3VnaCB0byB0YWtlIHRoZSB3aG9sZSBtZXNzYWdlIGltbWVkaWF0ZWx5CiAJICovCisJaW92X2l0ZXJfa3ZlYygmbXNnLm1zZ19pdGVyLCBXUklURSB8IElURVJfS1ZFQywgJmlvdiwgMSwgbm9iKTsKIAlmb3IgKDs7KSB7Ci0JCXN0cnVjdCBrdmVjICBpb3YgPSB7Ci0JCQkuaW92X2Jhc2UgPSBidWZmZXIsCi0JCQkuaW92X2xlbiAgPSBub2IKLQkJfTsKLQkJc3RydWN0IG1zZ2hkciBtc2cgPSB7Ci0JCQkubXNnX2ZsYWdzICAgICAgPSAhdGltZW91dCA/IE1TR19ET05UV0FJVCA6IDAKLQkJfTsKLQorCQltc2cubXNnX2ZsYWdzID0gIXRpbWVvdXQgPyBNU0dfRE9OVFdBSVQgOiAwOwogCQlpZiAodGltZW91dCkgewogCQkJLyogU2V0IHNlbmQgdGltZW91dCB0byByZW1haW5pbmcgdGltZSAqLwogCQkJamlmZmllc190b190aW1ldmFsKGppZmZpZXNfbGVmdCwgJnR2KTsKQEAgLTI5Niw5ICsyOTIsNiBAQAogCQlyYyA9IGtlcm5lbF9zZW5kbXNnKHNvY2ssICZtc2csICZpb3YsIDEsIG5vYik7CiAJCWppZmZpZXNfbGVmdCAtPSBqaWZmaWVzIC0gdGhlbjsKIAotCQlpZiAocmMgPT0gbm9iKQotCQkJcmV0dXJuIDA7Ci0KIAkJaWYgKHJjIDwgMCkKIAkJCXJldHVybiByYzsKIApAQCAtMzA3LDExICszMDAsMTEgQEAKIAkJCXJldHVybiAtRUNPTk5BQk9SVEVEOwogCQl9CiAKKwkJaWYgKCFtc2dfZGF0YV9sZWZ0KCZtc2cpKQorCQkJYnJlYWs7CisKIAkJaWYgKGppZmZpZXNfbGVmdCA8PSAwKQogCQkJcmV0dXJuIC1FQUdBSU47Ci0KLQkJYnVmZmVyID0gKChjaGFyICopYnVmZmVyKSArIHJjOwotCQlub2IgLT0gcmM7CiAJfQogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbG8uYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2xvLmMKaW5kZXggMDg0MDI3MTIuLmNiMjEzYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2xvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbG8uYwpAQCAtNDIsMzYgKzQyLDIzIEBACiAKIHN0YXRpYyBpbnQKIGxvbG5kX3JlY3YobG5ldF9uaV90ICpuaSwgdm9pZCAqcHJpdmF0ZSwgbG5ldF9tc2dfdCAqbG50bXNnLAotCSAgIGludCBkZWxheWVkLCB1bnNpZ25lZCBpbnQgbmlvdiwKLQkgICBzdHJ1Y3Qga3ZlYyAqaW92LCBsbmV0X2tpb3ZfdCAqa2lvdiwKLQkgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbWxlbiwgdW5zaWduZWQgaW50IHJsZW4pCisJICAgaW50IGRlbGF5ZWQsIHN0cnVjdCBpb3ZfaXRlciAqdG8sIHVuc2lnbmVkIGludCBybGVuKQogewogCWxuZXRfbXNnX3QgKnNlbmRtc2cgPSBwcml2YXRlOwogCiAJaWYgKGxudG1zZykgewkJICAgLyogbm90IGRpc2NhcmRpbmcgKi8KLQkJaWYgKHNlbmRtc2ctPm1zZ19pb3YpIHsKLQkJCWlmIChpb3YpCi0JCQkJbG5ldF9jb3B5X2lvdjJpb3YobmlvdiwgaW92LCBvZmZzZXQsCi0JCQkJCQkgIHNlbmRtc2ctPm1zZ19uaW92LAotCQkJCQkJICBzZW5kbXNnLT5tc2dfaW92LAotCQkJCQkJICBzZW5kbXNnLT5tc2dfb2Zmc2V0LCBtbGVuKTsKLQkJCWVsc2UKLQkJCQlsbmV0X2NvcHlfaW92Mmtpb3Yobmlvdiwga2lvdiwgb2Zmc2V0LAotCQkJCQkJICAgc2VuZG1zZy0+bXNnX25pb3YsCi0JCQkJCQkgICBzZW5kbXNnLT5tc2dfaW92LAotCQkJCQkJICAgc2VuZG1zZy0+bXNnX29mZnNldCwgbWxlbik7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoaW92KQotCQkJCWxuZXRfY29weV9raW92MmlvdihuaW92LCBpb3YsIG9mZnNldCwKLQkJCQkJCSAgIHNlbmRtc2ctPm1zZ19uaW92LAotCQkJCQkJICAgc2VuZG1zZy0+bXNnX2tpb3YsCi0JCQkJCQkgICBzZW5kbXNnLT5tc2dfb2Zmc2V0LCBtbGVuKTsKLQkJCWVsc2UKLQkJCQlsbmV0X2NvcHlfa2lvdjJraW92KG5pb3YsIGtpb3YsIG9mZnNldCwKLQkJCQkJCSAgICBzZW5kbXNnLT5tc2dfbmlvdiwKLQkJCQkJCSAgICBzZW5kbXNnLT5tc2dfa2lvdiwKLQkJCQkJCSAgICBzZW5kbXNnLT5tc2dfb2Zmc2V0LCBtbGVuKTsKLQkJfQorCQlpZiAoc2VuZG1zZy0+bXNnX2lvdikKKwkJCWxuZXRfY29weV9pb3YyaXRlcih0bywKKwkJCQkJICAgc2VuZG1zZy0+bXNnX25pb3YsCisJCQkJCSAgIHNlbmRtc2ctPm1zZ19pb3YsCisJCQkJCSAgIHNlbmRtc2ctPm1zZ19vZmZzZXQsCisJCQkJCSAgIGlvdl9pdGVyX2NvdW50KHRvKSk7CisJCWVsc2UKKwkJCWxuZXRfY29weV9raW92Mml0ZXIodG8sCisJCQkJCSAgICBzZW5kbXNnLT5tc2dfbmlvdiwKKwkJCQkJICAgIHNlbmRtc2ctPm1zZ19raW92LAorCQkJCQkgICAgc2VuZG1zZy0+bXNnX29mZnNldCwKKwkJCQkJICAgIGlvdl9pdGVyX2NvdW50KHRvKSk7CiAKIAkJbG5ldF9maW5hbGl6ZShuaSwgbG50bXNnLCAwKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9yb3V0ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L3JvdXRlci5jCmluZGV4IDA2MzU0MzIuLjA2M2FkNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L3JvdXRlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L3JvdXRlci5jCkBAIC0xMzA3LDcgKzEzMDcsNyBAQAogCWludCBzeiA9IG9mZnNldG9mKGxuZXRfcnRyYnVmX3QsIHJiX2tpb3ZbbnBhZ2VzXSk7CiAKIAl3aGlsZSAoLS1ucGFnZXMgPj0gMCkKLQkJX19mcmVlX3BhZ2UocmItPnJiX2tpb3ZbbnBhZ2VzXS5raW92X3BhZ2UpOworCQlfX2ZyZWVfcGFnZShyYi0+cmJfa2lvdltucGFnZXNdLmJ2X3BhZ2UpOwogCiAJTElCQ0ZTX0ZSRUUocmIsIHN6KTsKIH0KQEAgLTEzMzMsMTUgKzEzMzMsMTUgQEAKIAkJCQlHRlBfS0VSTkVMIHwgX19HRlBfWkVSTywgMCk7CiAJCWlmICghcGFnZSkgewogCQkJd2hpbGUgKC0taSA+PSAwKQotCQkJCV9fZnJlZV9wYWdlKHJiLT5yYl9raW92W2ldLmtpb3ZfcGFnZSk7CisJCQkJX19mcmVlX3BhZ2UocmItPnJiX2tpb3ZbaV0uYnZfcGFnZSk7CiAKIAkJCUxJQkNGU19GUkVFKHJiLCBzeik7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCi0JCXJiLT5yYl9raW92W2ldLmtpb3ZfbGVuID0gUEFHRV9TSVpFOwotCQlyYi0+cmJfa2lvdltpXS5raW92X29mZnNldCA9IDA7Ci0JCXJiLT5yYl9raW92W2ldLmtpb3ZfcGFnZSA9IHBhZ2U7CisJCXJiLT5yYl9raW92W2ldLmJ2X2xlbiA9IFBBR0VfU0laRTsKKwkJcmItPnJiX2tpb3ZbaV0uYnZfb2Zmc2V0ID0gMDsKKwkJcmItPnJiX2tpb3ZbaV0uYnZfcGFnZSA9IHBhZ2U7CiAJfQogCiAJcmV0dXJuIHJiOwpAQCAtMTY5Myw3ICsxNjkzLDcgQEAKIGludAogbG5ldF9ydHJwb29sc19lbmFibGUodm9pZCkKIHsKLQlpbnQgcmM7CisJaW50IHJjID0gMDsKIAogCWlmICh0aGVfbG5ldC5sbl9yb3V0aW5nKQogCQlyZXR1cm4gMDsKQEAgLTE3MDYsOSArMTcwNiw5IEBACiAJCSAqIGlmIHdlIGFyZSBqdXN0IGNvbmZpZ3VyaW5nIHRoaXMgZm9yIHRoZSBmaXJzdAogCQkgKiB0aW1lLgogCQkgKi8KLQkJcmV0dXJuIGxuZXRfcnRycG9vbHNfYWxsb2MoMSk7Ci0KLQlyYyA9IGxuZXRfcnRycG9vbHNfYWRqdXN0X2hlbHBlcigwLCAwLCAwKTsKKwkJcmMgPSBsbmV0X3J0cnBvb2xzX2FsbG9jKDEpOworCWVsc2UKKwkJcmMgPSBsbmV0X3J0cnBvb2xzX2FkanVzdF9oZWxwZXIoMCwgMCwgMCk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKQEAgLTE3MTgsNyArMTcxOCw3IEBACiAJdGhlX2xuZXQubG5fcGluZ19pbmZvLT5waV9mZWF0dXJlcyAmPSB+TE5FVF9QSU5HX0ZFQVRfUlRFX0RJU0FCTEVEOwogCWxuZXRfbmV0X3VubG9jayhMTkVUX0xPQ0tfRVgpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJjOwogfQogCiB2b2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvYnJ3X3Rlc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9icndfdGVzdC5jCmluZGV4IDEzZDA0NTQuLmIyMGM1ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9icndfdGVzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9icndfdGVzdC5jCkBAIC0yMjYsNyArMjI2LDcgQEAKIAlzdHJ1Y3QgcGFnZSAqcGc7CiAKIAlmb3IgKGkgPSAwOyBpIDwgYmstPmJrX25pb3Y7IGkrKykgewotCQlwZyA9IGJrLT5ia19pb3ZzW2ldLmtpb3ZfcGFnZTsKKwkJcGcgPSBiay0+YmtfaW92c1tpXS5idl9wYWdlOwogCQlicndfZmlsbF9wYWdlKHBnLCBwYXR0ZXJuLCBtYWdpYyk7CiAJfQogfQpAQCAtMjM4LDcgKzIzOCw3IEBACiAJc3RydWN0IHBhZ2UgKnBnOwogCiAJZm9yIChpID0gMDsgaSA8IGJrLT5ia19uaW92OyBpKyspIHsKLQkJcGcgPSBiay0+YmtfaW92c1tpXS5raW92X3BhZ2U7CisJCXBnID0gYmstPmJrX2lvdnNbaV0uYnZfcGFnZTsKIAkJaWYgKGJyd19jaGVja19wYWdlKHBnLCBwYXR0ZXJuLCBtYWdpYykpIHsKIAkJCUNFUlJPUigiQnVsayBwYWdlICVwICglZC8lZCkgaXMgY29ycnVwdGVkIVxuIiwKIAkJCSAgICAgICBwZywgaSwgYmstPmJrX25pb3YpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2NvbnJwYy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2NvbnJwYy5jCmluZGV4IDFiZTNjYWQuLjU1YWZiNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9jb25ycGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvY29ucnBjLmMKQEAgLTE1MiwxMCArMTUyLDEwIEBACiAJTEFTU0VSVChsaXN0X2VtcHR5KCZjcnBjLT5jcnBfbGluaykpOwogCiAJZm9yIChpID0gMDsgaSA8IGJ1bGstPmJrX25pb3Y7IGkrKykgewotCQlpZiAoIWJ1bGstPmJrX2lvdnNbaV0ua2lvdl9wYWdlKQorCQlpZiAoIWJ1bGstPmJrX2lvdnNbaV0uYnZfcGFnZSkKIAkJCWNvbnRpbnVlOwogCi0JCV9fZnJlZV9wYWdlKGJ1bGstPmJrX2lvdnNbaV0ua2lvdl9wYWdlKTsKKwkJX19mcmVlX3BhZ2UoYnVsay0+YmtfaW92c1tpXS5idl9wYWdlKTsKIAl9CiAKIAlzcnBjX2NsaWVudF9ycGNfZGVjcmVmKGNycGMtPmNycF9ycGMpOwpAQCAtNzA1LDcgKzcwNSw3IEBACiAKIAlMQVNTRVJUKGkgPCBua2lvdik7CiAKLQlwaWQgPSAobG5ldF9wcm9jZXNzX2lkX3BhY2tlZF90ICopcGFnZV9hZGRyZXNzKGtpb3ZbaV0ua2lvdl9wYWdlKTsKKwlwaWQgPSAobG5ldF9wcm9jZXNzX2lkX3BhY2tlZF90ICopcGFnZV9hZGRyZXNzKGtpb3ZbaV0uYnZfcGFnZSk7CiAKIAlyZXR1cm4gJnBpZFtpZHggJSBTRldfSURfUEVSX1BBR0VdOwogfQpAQCAtODQ5LDEyICs4NDksMTEgQEAKIAkJCSAgICAgIG1pbl90KGludCwgbm9iLCBQQUdFX1NJWkUpOwogCQkJbm9iIC09IGxlbjsKIAotCQkJYnVsay0+YmtfaW92c1tpXS5raW92X29mZnNldCA9IDA7Ci0JCQlidWxrLT5ia19pb3ZzW2ldLmtpb3ZfbGVuID0gbGVuOwotCQkJYnVsay0+YmtfaW92c1tpXS5raW92X3BhZ2UgPQotCQkJCWFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCQlidWxrLT5ia19pb3ZzW2ldLmJ2X29mZnNldCA9IDA7CisJCQlidWxrLT5ia19pb3ZzW2ldLmJ2X2xlbiA9IGxlbjsKKwkJCWJ1bGstPmJrX2lvdnNbaV0uYnZfcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CiAKLQkJCWlmICghYnVsay0+YmtfaW92c1tpXS5raW92X3BhZ2UpIHsKKwkJCWlmICghYnVsay0+YmtfaW92c1tpXS5idl9wYWdlKSB7CiAJCQkJbHN0Y29uX3JwY19wdXQoKmNycGMpOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2NvbnNvbGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9jb25zb2xlLmMKaW5kZXggNGMzMzYyMS4uYTBmY2JmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2NvbnNvbGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvY29uc29sZS5jCkBAIC0xOTkzLDggKzE5OTMsNiBAQAogCWxzdGNvbl9hY2NlcHRvcl9zZXJ2aWNlLnN2X3dpX3RvdGFsID0gU0ZXX0ZSV0tfV0lfTUFYOwogfQogCi1leHRlcm4gaW50IGxzdGNvbl9pb2N0bF9lbnRyeSh1bnNpZ25lZCBpbnQgY21kLCBzdHJ1Y3QgbGliY2ZzX2lvY3RsX2hkciAqaGRyKTsKLQogc3RhdGljIERFQ0xBUkVfSU9DVExfSEFORExFUihsc3Rjb25faW9jdGxfaGFuZGxlciwgbHN0Y29uX2lvY3RsX2VudHJ5KTsKIAogLyogaW5pdGlhbGl6ZSBjb25zb2xlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvY29uc29sZS5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2NvbnNvbGUuaAppbmRleCA3OGIxNDc3Li43ODM4OGE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvY29uc29sZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9jb25zb2xlLmgKQEAgLTE4NCw2ICsxODQsNyBAQAogCXJldHVybiAmaGFzaFtpZHhdOwogfQogCitpbnQgbHN0Y29uX2lvY3RsX2VudHJ5KHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBsaWJjZnNfaW9jdGxfaGRyICpoZHIpOwogaW50IGxzdGNvbl9jb25zb2xlX2luaXQodm9pZCk7CiBpbnQgbHN0Y29uX2NvbnNvbGVfZmluaSh2b2lkKTsKIGludCBsc3Rjb25fc2Vzc2lvbl9tYXRjaChsc3Rfc2lkX3Qgc2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9mcmFtZXdvcmsuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9mcmFtZXdvcmsuYwppbmRleCBjMmYxMjFmLi5hYmJkNjI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvZnJhbWV3b3JrLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2ZyYW1ld29yay5jCkBAIC03ODQsOCArNzg0LDggQEAKIAkJbG5ldF9wcm9jZXNzX2lkX3BhY2tlZF90IGlkOwogCQlpbnQgajsKIAotCQlkZXN0cyA9IHBhZ2VfYWRkcmVzcyhiay0+YmtfaW92c1tpIC8gU0ZXX0lEX1BFUl9QQUdFXS5raW92X3BhZ2UpOwotCQlMQVNTRVJUKGRlc3RzKTsJCS8qIG15IHBhZ2VzIGFyZSB3aXRoaW4gS1ZNIGFsd2F5cyAqLworCQlkZXN0cyA9IHBhZ2VfYWRkcmVzcyhiay0+YmtfaW92c1tpIC8gU0ZXX0lEX1BFUl9QQUdFXS5idl9wYWdlKTsKKwkJTEFTU0VSVChkZXN0cyk7ICAvKiBteSBwYWdlcyBhcmUgd2l0aGluIEtWTSBhbHdheXMgKi8KIAkJaWQgPSBkZXN0c1tpICUgU0ZXX0lEX1BFUl9QQUdFXTsKIAkJaWYgKG1zZy0+bXNnX21hZ2ljICE9IFNSUENfTVNHX01BR0lDKQogCQkJc2Z3X3VucGFja19pZChpZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvcnBjLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvcnBjLmMKaW5kZXggM2IyNmQ2ZS4uZjU2MTlkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L3JwYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9ycGMuYwpAQCAtOTEsOSArOTEsOSBAQAogCUxBU1NFUlQobm9iID4gMCk7CiAJTEFTU0VSVChpID49IDAgJiYgaSA8IGJrLT5ia19uaW92KTsKIAotCWJrLT5ia19pb3ZzW2ldLmtpb3Zfb2Zmc2V0ID0gMDsKLQliay0+YmtfaW92c1tpXS5raW92X3BhZ2UgPSBwZzsKLQliay0+YmtfaW92c1tpXS5raW92X2xlbiA9IG5vYjsKKwliay0+YmtfaW92c1tpXS5idl9vZmZzZXQgPSAwOworCWJrLT5ia19pb3ZzW2ldLmJ2X3BhZ2UgPSBwZzsKKwliay0+YmtfaW92c1tpXS5idl9sZW4gPSBub2I7CiAJcmV0dXJuIG5vYjsKIH0KIApAQCAtMTA2LDcgKzEwNiw3IEBACiAJTEFTU0VSVChiayk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgYmstPmJrX25pb3Y7IGkrKykgewotCQlwZyA9IGJrLT5ia19pb3ZzW2ldLmtpb3ZfcGFnZTsKKwkJcGcgPSBiay0+YmtfaW92c1tpXS5idl9wYWdlOwogCQlpZiAoIXBnKQogCQkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZpZC9maWRfbGliLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9maWQvZmlkX2xpYi5jCmluZGV4IDk5YWU3ZWIuLjRlNDljYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZpZC9maWRfbGliLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmlkL2ZpZF9saWIuYwpAQCAtNjMsMTQgKzYzLDEyIEBACiAJRklEX1NFUV9OT1JNQUwsCiAJKF9fdTY0KX4wVUxMCiB9OwotRVhQT1JUX1NZTUJPTChMVVNUUkVfU0VRX1NQQUNFX1JBTkdFKTsKIAogLyogWmVybyByYW5nZSwgdXNlZCBmb3IgaW5pdCBhbmQgb3RoZXIgcHVycG9zZXMuICovCiBjb25zdCBzdHJ1Y3QgbHVfc2VxX3JhbmdlIExVU1RSRV9TRVFfWkVST19SQU5HRSA9IHsKIAkwLAogCTAKIH07Ci1FWFBPUlRfU1lNQk9MKExVU1RSRV9TRVFfWkVST19SQU5HRSk7CiAKIC8qIEx1c3RyZSBCaWcgRnMgTG9jayBmaWQuICovCiBjb25zdCBzdHJ1Y3QgbHVfZmlkIExVU1RSRV9CRkxfRklEID0geyAuZl9zZXEgPSBGSURfU0VRX1NQRUNJQUwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9maWQvZmlkX3JlcXVlc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZpZC9maWRfcmVxdWVzdC5jCmluZGV4IDQ1NDc0NGQuLmVkZDcyYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZpZC9maWRfcmVxdWVzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZpZC9maWRfcmVxdWVzdC5jCkBAIC0xMjUsMTkgKzEyNSwxOSBAQAogCiAJaWYgKCFyYW5nZV9pc19zYW5lKG91dHB1dCkpIHsKIAkJQ0VSUk9SKCIlczogSW52YWxpZCByYW5nZSByZWNlaXZlZCBmcm9tIHNlcnZlcjogIgotCQkgICAgICAgRFJBTkdFIlxuIiwgc2VxLT5sY3NfbmFtZSwgUFJBTkdFKG91dHB1dCkpOworCQkgICAgICAgRFJBTkdFICJcbiIsIHNlcS0+bGNzX25hbWUsIFBSQU5HRShvdXRwdXQpKTsKIAkJcmMgPSAtRUlOVkFMOwogCQlnb3RvIG91dF9yZXE7CiAJfQogCiAJaWYgKHJhbmdlX2lzX2V4aGF1c3RlZChvdXRwdXQpKSB7CiAJCUNFUlJPUigiJXM6IFJhbmdlIHJlY2VpdmVkIGZyb20gc2VydmVyIGlzIGV4aGF1c3RlZDogIgotCQkgICAgICAgRFJBTkdFIl1cbiIsIHNlcS0+bGNzX25hbWUsIFBSQU5HRShvdXRwdXQpKTsKKwkJICAgICAgIERSQU5HRSAiXVxuIiwgc2VxLT5sY3NfbmFtZSwgUFJBTkdFKG91dHB1dCkpOwogCQlyYyA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0X3JlcTsKIAl9CiAKLQlDREVCVUdfTElNSVQoZGVidWdfbWFzaywgIiVzOiBBbGxvY2F0ZWQgJXMtc2VxdWVuY2UgIkRSQU5HRSJdXG4iLAorCUNERUJVR19MSU1JVChkZWJ1Z19tYXNrLCAiJXM6IEFsbG9jYXRlZCAlcy1zZXF1ZW5jZSAiIERSQU5HRSAiXVxuIiwKIAkJICAgICBzZXEtPmxjc19uYW1lLCBvcGNuYW1lLCBQUkFOR0Uob3V0cHV0KSk7CiAKIG91dF9yZXE6CkBAIC0xNzksNyArMTc5LDcgQEAKIAkJCSAgICAgICBzZXEtPmxjc19uYW1lLCByYyk7CiAJCQlyZXR1cm4gcmM7CiAJCX0KLQkJQ0RFQlVHKERfSU5GTywgIiVzOiBOZXcgcmFuZ2UgLSAiRFJBTkdFIlxuIiwKKwkJQ0RFQlVHKERfSU5GTywgIiVzOiBOZXcgcmFuZ2UgLSAiIERSQU5HRSAiXG4iLAogCQkgICAgICAgc2VxLT5sY3NfbmFtZSwgUFJBTkdFKCZzZXEtPmxjc19zcGFjZSkpOwogCX0gZWxzZSB7CiAJCXJjID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZpZC9scHJvY19maWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZpZC9scHJvY19maWQuYwppbmRleCA4MWI3Y2E5Li4zZWQzMmQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9maWQvbHByb2NfZmlkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmlkL2xwcm9jX2ZpZC5jCkBAIC0xMDUsNyArMTA1LDcgQEAKIAlyYyA9IGxkZWJ1Z2ZzX2ZpZF93cml0ZV9jb21tb24oYnVmZmVyLCBjb3VudCwgJnNlcS0+bGNzX3NwYWNlKTsKIAogCWlmIChyYyA9PSAwKSB7Ci0JCUNERUJVRyhEX0lORk8sICIlczogU3BhY2U6ICJEUkFOR0UiXG4iLAorCQlDREVCVUcoRF9JTkZPLCAiJXM6IFNwYWNlOiAiIERSQU5HRSAiXG4iLAogCQkgICAgICAgc2VxLT5sY3NfbmFtZSwgUFJBTkdFKCZzZXEtPmxjc19zcGFjZSkpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2ZsZF9pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2ZsZF9pbnRlcm5hbC5oCmluZGV4IGYwZWZlNWIuLjA4ZWFlYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9mbGRfaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9mbGQvZmxkX2ludGVybmFsLmgKQEAgLTMxLDYgKzMxLDI1IEBACiAgKgogICogbHVzdHJlL2ZsZC9mbGRfaW50ZXJuYWwuaAogICoKKyAqIFN1YnN5c3RlbSBEZXNjcmlwdGlvbjoKKyAqIEZMRCBpcyBGSUQgTG9jYXRpb24gRGF0YWJhc2UsIHdoaWNoIHN0b3JlcyB3aGVyZSAoSUUsIG9uIHdoaWNoIE1EVCkKKyAqIEZJRHMgYXJlIGxvY2F0ZWQuCisgKiBUaGUgZGF0YWJhc2UgaXMgYmFzaWNhbGx5IGEgcmVjb3JkIGZpbGUsIGVhY2ggcmVjb3JkIGNvbnNpc3RzIG9mIGEgRklECisgKiBzZXF1ZW5jZSByYW5nZSwgTURUL09TVCBpbmRleCwgYW5kIGZsYWdzLiBUaGUgRkxEIGZvciB0aGUgd2hvbGUgRlMKKyAqIGlzIG9ubHkgc3RvcmVkIG9uIHRoZSBzZXF1ZW5jZSBjb250cm9sbGVyKE1EVDApIHJpZ2h0IG5vdywgYnV0IGVhY2ggdGFyZ2V0CisgKiBhbHNvIGhhcyBpdHMgbG9jYWwgRkxELCB3aGljaCBvbmx5IHN0b3JlcyB0aGUgbG9jYWwgc2VxdWVuY2UuCisgKgorICogVGhlIEZMRCBzdWJzeXN0ZW0gdXN1YWxseSBoYXMgdHdvIHRhc2tzOgorICogMS4gbWFpbnRhaW4gdGhlIGRhdGFiYXNlLCBpLmUuIHdoZW4gdGhlIHNlcXVlbmNlIGNvbnRyb2xsZXIgYWxsb2NhdGVzCisgKiBuZXcgc2VxdWVuY2UgcmFuZ2VzIHRvIHNvbWUgbm9kZXMsIGl0IHdpbGwgY2FsbCB0aGUgRkxEIEFQSSB0byBpbnNlcnQgdGhlCisgKiBsb2NhdGlvbiBpbmZvcm1hdGlvbiA8c2VxdWVuY2VfcmFuZ2UsIG5vZGVfaW5kZXg+IGluIEZMREIuCisgKgorICogMi4gSGFuZGxlIHJlcXVlc3RzIGZyb20gb3RoZXIgbm9kZXMsIGkuZS4gaWYgY2xpZW50IG5lZWRzIHRvIGtub3cgd2hlcmUKKyAqIHRoZSBGSUQgaXMgbG9jYXRlZCwgaWYgaXQgY2FuIG5vdCBmaW5kIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgbG9jYWwgY2FjaGUsCisgKiBpdCB3aWxsIHNlbmQgYSBGTEQgbG9va3VwIFJQQyB0byB0aGUgRkxEIHNlcnZpY2UsIGFuZCB0aGUgRkxEIHNlcnZpY2Ugd2lsbAorICogbG9vayB1cCB0aGUgRkxEQiBlbnRyeSBhbmQgcmV0dXJuIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byBjbGllbnQuCisgKgorICoKICAqIEF1dGhvcjogWXVyeSBVbWFuZXRzIDx1bWthQGNsdXN0ZXJmcy5jb20+CiAgKiBBdXRob3I6IFRvbSBXYW5nRGkgPHdhbmdkaUBjbHVzdGVyZnMuY29tPgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9mbGQvZmxkX3JlcXVlc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9mbGRfcmVxdWVzdC5jCmluZGV4IGU1OWQ2MjYuLjBkZTcyYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9mbGRfcmVxdWVzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9mbGRfcmVxdWVzdC5jCkBAIC01Myw1NyArNTMsNiBAQAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX21kYy5oIgogI2luY2x1ZGUgImZsZF9pbnRlcm5hbC5oIgogCi0vKiBUT0RPOiB0aGVzZSAzIGZ1bmN0aW9ucyBhcmUgY29waWVzIG9mIGZsb3ctY29udHJvbCBjb2RlIGZyb20gbWRjX2xpYi5jCi0gKiBJdCBzaG91bGQgYmUgY29tbW9uIHRoaW5nLiBUaGUgc2FtZSBhYm91dCBtZGMgUlBDIGxvY2sKLSAqLwotc3RhdGljIGludCBmbGRfcmVxX2F2YWlsKHN0cnVjdCBjbGllbnRfb2JkICpjbGksIHN0cnVjdCBtZGNfY2FjaGVfd2FpdGVyICptY3cpCi17Ci0JaW50IHJjOwotCi0Jc3Bpbl9sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCXJjID0gbGlzdF9lbXB0eSgmbWN3LT5tY3dfZW50cnkpOwotCXNwaW5fdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCXJldHVybiByYzsKLX07Ci0KLXN0YXRpYyB2b2lkIGZsZF9lbnRlcl9yZXF1ZXN0KHN0cnVjdCBjbGllbnRfb2JkICpjbGkpCi17Ci0Jc3RydWN0IG1kY19jYWNoZV93YWl0ZXIgbWN3OwotCXN0cnVjdCBsX3dhaXRfaW5mbyBsd2kgPSB7IDAgfTsKLQotCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQlpZiAoY2xpLT5jbF9yX2luX2ZsaWdodCA+PSBjbGktPmNsX21heF9ycGNzX2luX2ZsaWdodCkgewotCQlsaXN0X2FkZF90YWlsKCZtY3cubWN3X2VudHJ5LCAmY2xpLT5jbF9jYWNoZV93YWl0ZXJzKTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmbWN3Lm1jd193YWl0cSk7Ci0JCXNwaW5fdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCQlsX3dhaXRfZXZlbnQobWN3Lm1jd193YWl0cSwgZmxkX3JlcV9hdmFpbChjbGksICZtY3cpLCAmbHdpKTsKLQl9IGVsc2UgewotCQljbGktPmNsX3JfaW5fZmxpZ2h0Kys7Ci0JCXNwaW5fdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCX0KLX0KLQotc3RhdGljIHZvaWQgZmxkX2V4aXRfcmVxdWVzdChzdHJ1Y3QgY2xpZW50X29iZCAqY2xpKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKmwsICp0bXA7Ci0Jc3RydWN0IG1kY19jYWNoZV93YWl0ZXIgKm1jdzsKLQotCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQljbGktPmNsX3JfaW5fZmxpZ2h0LS07Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKGwsIHRtcCwgJmNsaS0+Y2xfY2FjaGVfd2FpdGVycykgewotCQlpZiAoY2xpLT5jbF9yX2luX2ZsaWdodCA+PSBjbGktPmNsX21heF9ycGNzX2luX2ZsaWdodCkgewotCQkJLyogTm8gZnJlZSByZXF1ZXN0IHNsb3RzIGFueW1vcmUgKi8KLQkJCWJyZWFrOwotCQl9Ci0KLQkJbWN3ID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgbWRjX2NhY2hlX3dhaXRlciwgbWN3X2VudHJ5KTsKLQkJbGlzdF9kZWxfaW5pdCgmbWN3LT5tY3dfZW50cnkpOwotCQljbGktPmNsX3JfaW5fZmxpZ2h0Kys7Ci0JCXdha2VfdXAoJm1jdy0+bWN3X3dhaXRxKTsKLQl9Ci0Jc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Ci19Ci0KIHN0YXRpYyBpbnQgZmxkX3JyYl9oYXNoKHN0cnVjdCBsdV9jbGllbnRfZmxkICpmbGQsIHU2NCBzZXEpCiB7CiAJTEFTU0VSVChmbGQtPmxjZl9jb3VudCA+IDApOwpAQCAtMjcwLDcgKzIxOSw2IEBACiAJc3Bpbl91bmxvY2soJmZsZC0+bGNmX2xvY2spOwogCXJldHVybiAtRU5PRU5UOwogfQotRVhQT1JUX1NZTUJPTChmbGRfY2xpZW50X2RlbF90YXJnZXQpOwogCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqZmxkX2RlYnVnZnNfZGlyOwogCkBAIC00MzksOSArMzg3LDkgQEAKIAlyZXEtPnJxX3JlcGx5X3BvcnRhbCA9IE1EQ19SRVBMWV9QT1JUQUw7CiAJcHRscnBjX2F0X3NldF9yZXFfdGltZW91dChyZXEpOwogCi0JZmxkX2VudGVyX3JlcXVlc3QoJmV4cC0+ZXhwX29iZC0+dS5jbGkpOworCW9iZF9nZXRfcmVxdWVzdF9zbG90KCZleHAtPmV4cF9vYmQtPnUuY2xpKTsKIAlyYyA9IHB0bHJwY19xdWV1ZV93YWl0KHJlcSk7Ci0JZmxkX2V4aXRfcmVxdWVzdCgmZXhwLT5leHBfb2JkLT51LmNsaSk7CisJb2JkX3B1dF9yZXF1ZXN0X3Nsb3QoJmV4cC0+ZXhwX29iZC0+dS5jbGkpOwogCWlmIChyYykKIAkJZ290byBvdXRfcmVxOwogCkBAIC01MDUsNyArNDUzLDYgQEAKIHsKIAlmbGRfY2FjaGVfZmx1c2goZmxkLT5sY2ZfY2FjaGUpOwogfQotRVhQT1JUX1NZTUJPTChmbGRfY2xpZW50X2ZsdXNoKTsKIAogc3RhdGljIGludCBfX2luaXQgZmxkX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvY2xfb2JqZWN0LmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2NsX29iamVjdC5oCmluZGV4IDNjZDRhMjUuLjg5MjkyYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvY2xfb2JqZWN0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9jbF9vYmplY3QuaApAQCAtOTMsOCArOTMsOCBAQAogICogc3VwZXItY2xhc3MgZGVmaW5pdGlvbnMuCiAgKi8KICNpbmNsdWRlICJsdV9vYmplY3QuaCIKKyNpbmNsdWRlICJsdXN0cmVfY29tcGF0LmgiCiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+Ci0jaW5jbHVkZSAibGludXgvbHVzdHJlX2NvbXBhdDI1LmgiCiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9yYWRpeC10cmVlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KQEAgLTE5MSw2ICsxOTEsOSBAQAogCSAqIEdyb3VwIGlkZW50aWZpZXIgZm9yIHF1b3RhIHB1cnBvc2VzLgogCSAqLwogCWdpZF90ICBjYXRfZ2lkOworCisJLyogbmxpbmsgb2YgdGhlIGRpcmVjdG9yeSAqLworCV9fdTY0ICBjYXRfbmxpbms7CiB9OwogCiAvKioKQEAgLTMyMCw3ICszMjMsNyBAQAogCSAqCSB0byBiZSB1c2VkIGluc3RlYWQgb2YgbmV3bHkgY3JlYXRlZC4KIAkgKi8KIAlpbnQgICgqY29vX3BhZ2VfaW5pdCkoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmosCi0JCQkJc3RydWN0IGNsX3BhZ2UgKnBhZ2UsIHBnb2ZmX3QgaW5kZXgpOworCQkJICAgICAgc3RydWN0IGNsX3BhZ2UgKnBhZ2UsIHBnb2ZmX3QgaW5kZXgpOwogCS8qKgogCSAqIEluaXRpYWxpemUgbG9jayBzbGljZSBmb3IgdGhpcyBsYXllci4gQ2FsbGVkIHRvcC10by1ib3R0b20gdGhyb3VnaAogCSAqIGV2ZXJ5IG9iamVjdCBsYXllciB3aGVuIGEgbmV3IGNsX2xvY2sgaXMgaW5zdGFudGlhdGVkLiBMYXllcgpAQCAtMzY2LDggKzM2OSw4IEBACiAJICogXHJldHVybiB0aGUgc2FtZSBjb252ZW50aW9uIGFzIGZvcgogCSAqIGNsX29iamVjdF9vcGVyYXRpb25zOjpjb29fYXR0cl9nZXQoKSBpcyB1c2VkLgogCSAqLwotCWludCAoKmNvb19hdHRyX3NldCkoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmosCi0JCQkgICAgY29uc3Qgc3RydWN0IGNsX2F0dHIgKmF0dHIsIHVuc2lnbmVkIHZhbGlkKTsKKwlpbnQgKCpjb29fYXR0cl91cGRhdGUpKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsX29iamVjdCAqb2JqLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBjbF9hdHRyICphdHRyLCB1bnNpZ25lZCBpbnQgdmFsaWQpOwogCS8qKgogCSAqIFVwZGF0ZSBvYmplY3QgY29uZmlndXJhdGlvbi4gQ2FsbGVkIHRvcC10by1ib3R0b20gdG8gbW9kaWZ5IG9iamVjdAogCSAqIGNvbmZpZ3VyYXRpb24uCkBAIC0zOTIsNiArMzk1LDExIEBACiAJICogbWFpbmx5IHBhZ2VzIGFuZCBsb2Nrcy4KIAkgKi8KIAlpbnQgKCpjb29fcHJ1bmUpKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsX29iamVjdCAqb2JqKTsKKwkvKioKKwkgKiBPYmplY3QgZ2V0c3RyaXBlIG1ldGhvZC4KKwkgKi8KKwlpbnQgKCpjb29fZ2V0c3RyaXBlKShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBjbF9vYmplY3QgKm9iaiwKKwkJCSAgICAgc3RydWN0IGxvdl91c2VyX21kIF9fdXNlciAqbHVtKTsKIH07CiAKIC8qKgpAQCAtNjg3LDE3ICs2OTUsNiBAQAogfTsKIAogLyoqCi0gKiBGbGFncyBtYWludGFpbmVkIGZvciBldmVyeSBjbF9wYWdlLgotICovCi1lbnVtIGNsX3BhZ2VfZmxhZ3MgewotCS8qKgotCSAqIFNldCB3aGVuIHBhZ2VpbiBjb21wbGV0ZXMuIFVzZWQgZm9yIGRlYnVnZ2luZyAocmVhZCBjb21wbGV0ZXMgYXQKLQkgKiBtb3N0IG9uY2UgZm9yIGEgcGFnZSkuCi0JICovCi0JQ1BGX1JFQURfQ09NUExFVEVEID0gMSA8PCAwCi19OwotCi0vKioKICAqIEZpZWxkcyBhcmUgcHJvdGVjdGVkIGJ5IHRoZSBsb2NrIG9uIHN0cnVjdCBwYWdlLCBleGNlcHQgZm9yIGF0b21pY3MgYW5kCiAgKiBpbW11dGFibGVzLgogICoKQEAgLTcxMSwyNCArNzA4LDE5IEBACiAJYXRvbWljX3QJICAgICBjcF9yZWY7CiAJLyoqIEFuIG9iamVjdCB0aGlzIHBhZ2UgaXMgYSBwYXJ0IG9mLiBJbW11dGFibGUgYWZ0ZXIgY3JlYXRpb24uICovCiAJc3RydWN0IGNsX29iamVjdAkqY3Bfb2JqOwotCS8qKiBMaXN0IG9mIHNsaWNlcy4gSW1tdXRhYmxlIGFmdGVyIGNyZWF0aW9uLiAqLwotCXN0cnVjdCBsaXN0X2hlYWQJICAgICAgIGNwX2xheWVyczsKIAkvKiogdm1wYWdlICovCiAJc3RydWN0IHBhZ2UJCSpjcF92bXBhZ2U7CisJLyoqIExpbmthZ2Ugb2YgcGFnZXMgd2l0aGluIGdyb3VwLiBQYWdlcyBtdXN0IGJlIG93bmVkICovCisJc3RydWN0IGxpc3RfaGVhZAkgY3BfYmF0Y2g7CisJLyoqIExpc3Qgb2Ygc2xpY2VzLiBJbW11dGFibGUgYWZ0ZXIgY3JlYXRpb24uICovCisJc3RydWN0IGxpc3RfaGVhZAkgY3BfbGF5ZXJzOworCS8qKiBMaW5rYWdlIG9mIHBhZ2VzIHdpdGhpbiBjbF9yZXEuICovCisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgIGNwX2ZsaWdodDsKIAkvKioKIAkgKiBQYWdlIHN0YXRlLiBUaGlzIGZpZWxkIGlzIGNvbnN0IHRvIGF2b2lkIGFjY2lkZW50YWwgdXBkYXRlLCBpdCBpcwogCSAqIG1vZGlmaWVkIG9ubHkgaW50ZXJuYWxseSB3aXRoaW4gY2xfcGFnZS5jLiBQcm90ZWN0ZWQgYnkgYSBWTSBsb2NrLgogCSAqLwogCWNvbnN0IGVudW0gY2xfcGFnZV9zdGF0ZSBjcF9zdGF0ZTsKLQkvKiogTGlua2FnZSBvZiBwYWdlcyB3aXRoaW4gZ3JvdXAuIFByb3RlY3RlZCBieSBjbF9wYWdlOjpjcF9tdXRleC4gKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCQljcF9iYXRjaDsKLQkvKiogTXV0ZXggc2VyaWFsaXppbmcgbWVtYmVyc2hpcCBvZiBhIHBhZ2UgaW4gYSBiYXRjaC4gKi8KLQlzdHJ1Y3QgbXV0ZXgJCWNwX211dGV4OwotCS8qKiBMaW5rYWdlIG9mIHBhZ2VzIHdpdGhpbiBjbF9yZXEuICovCi0Jc3RydWN0IGxpc3RfaGVhZAkgICAgICAgY3BfZmxpZ2h0OwotCS8qKiBUcmFuc2ZlciBlcnJvci4gKi8KLQlpbnQJCSAgICAgIGNwX2Vycm9yOwotCiAJLyoqCiAJICogUGFnZSB0eXBlLiBPbmx5IENQVF9UUkFOU0lFTlQgaXMgdXNlZCBzbyBmYXIuIEltbXV0YWJsZSBhZnRlcgogCSAqIGNyZWF0aW9uLgpAQCAtNzQxLDEwICs3MzMsNiBAQAogCSAqLwogCXN0cnVjdCBjbF9pbwkgICAgKmNwX293bmVyOwogCS8qKgotCSAqIERlYnVnIGluZm9ybWF0aW9uLCB0aGUgdGFzayBpcyBvd25pbmcgdGhlIHBhZ2UuCi0JICovCi0Jc3RydWN0IHRhc2tfc3RydWN0CSpjcF90YXNrOwotCS8qKgogCSAqIE93bmluZyBJTyByZXF1ZXN0IGluIGNsX3BhZ2Vfc3RhdGU6OkNQU19QQUdFT1VUIGFuZAogCSAqIGNsX3BhZ2Vfc3RhdGU6OkNQU19QQUdFSU4gc3RhdGVzLiBUaGlzIGZpZWxkIGlzIG1haW50YWluZWQgb25seSBpbgogCSAqIHRoZSB0b3AtbGV2ZWwgcGFnZXMuIFByb3RlY3RlZCBieSBhIFZNIGxvY2suCkBAIC03NTYsOCArNzQ0LDYgQEAKIAlzdHJ1Y3QgbHVfcmVmX2xpbmsgICAgICAgY3Bfb2JqX3JlZjsKIAkvKiogTGluayB0byBhIHF1ZXVlLCBmb3IgZGVidWdnaW5nLiAqLwogCXN0cnVjdCBsdV9yZWZfbGluayAgICAgICBjcF9xdWV1ZV9yZWY7Ci0JLyoqIFBlci1wYWdlIGZsYWdzIGZyb20gZW51bSBjbF9wYWdlX2ZsYWdzLiBQcm90ZWN0ZWQgYnkgYSBWTSBsb2NrLiAqLwotCXVuc2lnbmVkICAgICAgICAgICAgICAgICBjcF9mbGFnczsKIAkvKiogQXNzaWduZWQgaWYgZG9pbmcgYSBzeW5jX2lvICovCiAJc3RydWN0IGNsX3N5bmNfaW8gICAgICAgKmNwX3N5bmNfaW87CiB9OwpAQCAtMTA1NiwyMyArMTA0MiwzMiBAQAogCX0JCQkJCQkJCSAgICAgXAogfSB3aGlsZSAoMCkKIAotc3RhdGljIGlubGluZSBpbnQgX19wYWdlX2luX3VzZShjb25zdCBzdHJ1Y3QgY2xfcGFnZSAqcGFnZSwgaW50IHJlZmMpCi17Ci0JaWYgKHBhZ2UtPmNwX3R5cGUgPT0gQ1BUX0NBQ0hFQUJMRSkKLQkJKytyZWZjOwotCUxBU1NFUlQoYXRvbWljX3JlYWQoJnBhZ2UtPmNwX3JlZikgPiAwKTsKLQlyZXR1cm4gKGF0b21pY19yZWFkKCZwYWdlLT5jcF9yZWYpID4gcmVmYyk7Ci19Ci0KLSNkZWZpbmUgY2xfcGFnZV9pbl91c2UocGcpICAgICAgIF9fcGFnZV9pbl91c2UocGcsIDEpCi0jZGVmaW5lIGNsX3BhZ2VfaW5fdXNlX25vcmVmKHBnKSBfX3BhZ2VfaW5fdXNlKHBnLCAwKQotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpjbF9wYWdlX3ZtcGFnZShzdHJ1Y3QgY2xfcGFnZSAqcGFnZSkKIHsKIAlMQVNTRVJUKHBhZ2UtPmNwX3ZtcGFnZSk7CiAJcmV0dXJuIHBhZ2UtPmNwX3ZtcGFnZTsKIH0KIAorLyoqCisgKiBDaGVjayBpZiBhIGNsX3BhZ2UgaXMgaW4gdXNlLgorICoKKyAqIENsaWVudCBjYWNoZSBob2xkcyBhIHJlZmNvdW50LCB0aGlzIHJlZmNvdW50IHdpbGwgYmUgZHJvcHBlZCB3aGVuCisgKiB0aGUgcGFnZSBpcyB0YWtlbiBvdXQgb2YgY2FjaGUsIHNlZSB2dnBfcGFnZV9kZWxldGUoKS4KKyAqLworc3RhdGljIGlubGluZSBib29sIF9fcGFnZV9pbl91c2UoY29uc3Qgc3RydWN0IGNsX3BhZ2UgKnBhZ2UsIGludCByZWZjKQoreworCXJldHVybiAoYXRvbWljX3JlYWQoJnBhZ2UtPmNwX3JlZikgPiByZWZjICsgMSk7Cit9CisKKy8qKgorICogQ2FsbGVyIGl0c2VsZiBob2xkcyBhIHJlZmNvdW50IG9mIGNsX3BhZ2UuCisgKi8KKyNkZWZpbmUgY2xfcGFnZV9pbl91c2UocGcpCSBfX3BhZ2VfaW5fdXNlKHBnLCAxKQorLyoqCisgKiBDYWxsZXIgZG9lc24ndCBob2xkIGEgcmVmY291bnQuCisgKi8KKyNkZWZpbmUgY2xfcGFnZV9pbl91c2Vfbm9yZWYocGcpIF9fcGFnZV9pbl91c2UocGcsIDApCisKIC8qKiBAfSBjbF9wYWdlICovCiAKIC8qKiBcYWRkdG9ncm91cCBjbF9sb2NrIGNsX2xvY2sKQEAgLTE3NzEsMTIgKzE3NjYsMTQgQEAKIAkJc3RydWN0IGNsX3NldGF0dHJfaW8gewogCQkJc3RydWN0IG9zdF9sdmIgICBzYV9hdHRyOwogCQkJdW5zaWduZWQgaW50ICAgICBzYV92YWxpZDsKKwkJCWludAkJc2Ffc3RyaXBlX2luZGV4OworCQkJc3RydWN0IGx1X2ZpZCAgKnNhX3BhcmVudF9maWQ7CiAJCX0gY2lfc2V0YXR0cjsKIAkJc3RydWN0IGNsX2ZhdWx0X2lvIHsKIAkJCS8qKiBwYWdlIGluZGV4IHdpdGhpbiBmaWxlLiAqLwogCQkJcGdvZmZfdAkgZnRfaW5kZXg7CiAJCQkvKiogYnl0ZXMgdmFsaWQgYnl0ZSBvbiBhIGZhdWx0ZWQgcGFnZS4gKi8KLQkJCWludAkgICAgIGZ0X25vYjsKKwkJCXNpemVfdAkgICAgIGZ0X25vYjsKIAkJCS8qKiB3cml0YWJsZSBwYWdlPyBmb3Igbm9wYWdlKCkgb25seSAqLwogCQkJaW50CSAgICAgZnRfd3JpdGFibGU7CiAJCQkvKiogcGFnZSBvZiBhbiBleGVjdXRhYmxlPyAqLwpAQCAtMTkwOSw3ICsxOTA2LDcgQEAKIAkvKiogR2VuZXJpYyBhdHRyaWJ1dGVzIGZvciB0aGUgc2VydmVyIGNvbnN1bXB0aW9uLiAqLwogCXN0cnVjdCBvYmRvCSpjcmFfb2E7CiAJLyoqIEpvYmlkICovCi0JY2hhcgkJIGNyYV9qb2JpZFtKT0JTVEFUU19KT0JJRF9TSVpFXTsKKwljaGFyCQkgY3JhX2pvYmlkW0xVU1RSRV9KT0JJRF9TSVpFXTsKIH07CiAKIC8qKgpAQCAtMjE3NiwxNCArMjE3MywxNiBAQAogdm9pZCBjbF9vYmplY3RfYXR0cl91bmxvY2soc3RydWN0IGNsX29iamVjdCAqbyk7CiBpbnQgIGNsX29iamVjdF9hdHRyX2dldChjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBjbF9vYmplY3QgKm9iaiwKIAkJCXN0cnVjdCBjbF9hdHRyICphdHRyKTsKLWludCAgY2xfb2JqZWN0X2F0dHJfc2V0KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsX29iamVjdCAqb2JqLAotCQkJY29uc3Qgc3RydWN0IGNsX2F0dHIgKmF0dHIsIHVuc2lnbmVkIHZhbGlkKTsKK2ludCAgY2xfb2JqZWN0X2F0dHJfdXBkYXRlKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsX29iamVjdCAqb2JqLAorCQkJICAgY29uc3Qgc3RydWN0IGNsX2F0dHIgKmF0dHIsIHVuc2lnbmVkIGludCB2YWxpZCk7CiBpbnQgIGNsX29iamVjdF9nbGltcHNlKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsX29iamVjdCAqb2JqLAogCQkgICAgICAgc3RydWN0IG9zdF9sdmIgKmx2Yik7CiBpbnQgIGNsX2NvbmZfc2V0KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsX29iamVjdCAqb2JqLAogCQkgY29uc3Qgc3RydWN0IGNsX29iamVjdF9jb25mICpjb25mKTsKIGludCBjbF9vYmplY3RfcHJ1bmUoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmopOwogdm9pZCBjbF9vYmplY3Rfa2lsbChjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBjbF9vYmplY3QgKm9iaik7CitpbnQgIGNsX29iamVjdF9nZXRzdHJpcGUoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmosCisJCQkgc3RydWN0IGxvdl91c2VyX21kIF9fdXNlciAqbHVtKTsKIAogLyoqCiAgKiBSZXR1cm5zIHRydWUsIGlmZiBcYSBvMCBhbmQgXGEgbzEgYXJlIHNsaWNlcyBvZiB0aGUgc2FtZSBvYmplY3QuCkBAIC0yMTk3LDYgKzIxOTYsNyBAQAogewogCWNsb2ItPmNvX3NsaWNlX29mZiA9IGNsX29iamVjdF9oZWFkZXIoY2xvYiktPmNvaF9wYWdlX2J1ZnNpemU7CiAJY2xfb2JqZWN0X2hlYWRlcihjbG9iKS0+Y29oX3BhZ2VfYnVmc2l6ZSArPSBjZnNfc2l6ZV9yb3VuZChzaXplKTsKKwlXQVJOX09OKGNsX29iamVjdF9oZWFkZXIoY2xvYiktPmNvaF9wYWdlX2J1ZnNpemUgPiA1MTIpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgKmNsX29iamVjdF9wYWdlX3NsaWNlKHN0cnVjdCBjbF9vYmplY3QgKmNsb2IsCkBAIC0yMjYzLDYgKzIyNjMsOCBAQAogCQkgICAgICBzdHJ1Y3QgY2xfaW8gKmlvLCBzdHJ1Y3QgY2xfcGFnZSAqcGcpOwogdm9pZCBjbF9wYWdlX2Rpc293bihjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsCiAJCSAgICBzdHJ1Y3QgY2xfaW8gKmlvLCBzdHJ1Y3QgY2xfcGFnZSAqcGFnZSk7Cit2b2lkIGNsX3BhZ2VfZGlzb3duMChjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsCisJCSAgICAgc3RydWN0IGNsX2lvICppbywgc3RydWN0IGNsX3BhZ2UgKnBnKTsKIGludCBjbF9wYWdlX2lzX293bmVkKGNvbnN0IHN0cnVjdCBjbF9wYWdlICpwZywgY29uc3Qgc3RydWN0IGNsX2lvICppbyk7CiAKIC8qKiBAfSBvd25lcnNoaXAgKi8KQEAgLTIzMDQsNyArMjMwNiw3IEBACiAJCQkgIHN0cnVjdCBjbF9wYWdlICpwYWdlLCBwZ29mZl90ICptYXhfaW5kZXgpOwogbG9mZl90IGNsX29mZnNldChjb25zdCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmosIHBnb2ZmX3QgaWR4KTsKIHBnb2ZmX3QgY2xfaW5kZXgoY29uc3Qgc3RydWN0IGNsX29iamVjdCAqb2JqLCBsb2ZmX3Qgb2Zmc2V0KTsKLWludCBjbF9wYWdlX3NpemUoY29uc3Qgc3RydWN0IGNsX29iamVjdCAqb2JqKTsKK3NpemVfdCBjbF9wYWdlX3NpemUoY29uc3Qgc3RydWN0IGNsX29iamVjdCAqb2JqKTsKIGludCBjbF9wYWdlc19wcnVuZShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBjbF9vYmplY3QgKm9iaik7CiAKIHZvaWQgY2xfbG9ja19wcmludChjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHZvaWQgKmNvb2tpZSwKQEAgLTIzMzMsNyArMjMzNSw3IEBACiAJLyoqCiAJICogIyBvZiBMUlUgZW50cmllcyBhdmFpbGFibGUKIAkgKi8KLQlhdG9taWNfdAkJY2NjX2xydV9sZWZ0OworCWF0b21pY19sb25nX3QJCWNjY19scnVfbGVmdDsKIAkvKioKIAkgKiBMaXN0IG9mIGVudGl0aWVzKE9TQ3MpIGZvciB0aGlzIExSVSBjYWNoZQogCSAqLwpAQCAtMjM0NywxNCArMjM0OSwxOCBAQAogCSAqLwogCXNwaW5sb2NrX3QJCWNjY19scnVfbG9jazsKIAkvKioKKwkgKiBTZXQgaWYgdW5zdGFibGUgY2hlY2sgaXMgZW5hYmxlZAorCSAqLworCXVuc2lnbmVkIGludAkJY2NjX3Vuc3RhYmxlX2NoZWNrOjE7CisJLyoqCiAJICogIyBvZiB1bnN0YWJsZSBwYWdlcyBmb3IgdGhpcyBtb3VudCBwb2ludAogCSAqLwotCWF0b21pY190CQljY2NfdW5zdGFibGVfbnI7CisJYXRvbWljX2xvbmdfdAkJY2NjX3Vuc3RhYmxlX25yOwogCS8qKgogCSAqIFdhaXRxIGZvciBhd2FpdGluZyB1bnN0YWJsZSBwYWdlcyB0byByZWFjaCB6ZXJvLgogCSAqIFVzZWQgYXQgdW1vdW50aW5nIHRpbWUgYW5kIHNpZ25hbGVkIG9uIEJSVyBjb21taXQKIAkgKi8KLSAgICAgICAgd2FpdF9xdWV1ZV9oZWFkX3QJY2NjX3Vuc3RhYmxlX3dhaXRxOworCXdhaXRfcXVldWVfaGVhZF90CWNjY191bnN0YWJsZV93YWl0cTsKIAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9pbnRlcnZhbF90cmVlLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2ludGVydmFsX3RyZWUuaAppbmRleCA0YTE1MjI4Li41ZDM4N2QzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2ludGVydmFsX3RyZWUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2ludGVydmFsX3RyZWUuaApAQCAtNjMsNiArNjMsMTEgQEAKIAlyZXR1cm4gbm9kZS0+aW5faW50cmVlID09IDE7CiB9CiAKK3N0YXRpYyBpbmxpbmUgX191NjQgaW50ZXJ2YWxfbG93KHN0cnVjdCBpbnRlcnZhbF9ub2RlICpub2RlKQoreworCXJldHVybiBub2RlLT5pbl9leHRlbnQuc3RhcnQ7Cit9CisKIHN0YXRpYyBpbmxpbmUgX191NjQgaW50ZXJ2YWxfaGlnaChzdHJ1Y3QgaW50ZXJ2YWxfbm9kZSAqbm9kZSkKIHsKIAlyZXR1cm4gbm9kZS0+aW5fZXh0ZW50LmVuZDsKQEAgLTc3LDggKzgyLDI5IEBACiAJbm9kZS0+aW5fbWF4X2hpZ2ggPSBlbmQ7CiB9CiAKKy8qCisgKiBSdWxlcyB0byB3cml0ZSBhbiBpbnRlcnZhbCBjYWxsYmFjay4KKyAqICAtIHRoZSBjYWxsYmFjayByZXR1cm5zIElOVEVSVkFMX0lURVJfU1RPUCB3aGVuIGl0IHRoaW5rcyB0aGUgaXRlcmF0aW9uCisgKiAgICBzaG91bGQgYmUgc3RvcHBlZC4gSXQgd2lsbCB0aGVuIGNhdXNlIHRoZSBpdGVyYXRpb24gZnVuY3Rpb24gdG8gcmV0dXJuCisgKiAgICBpbW1lZGlhdGVseSB3aXRoIHJldHVybiB2YWx1ZSBJTlRFUlZBTF9JVEVSX1NUT1AuCisgKiAgLSBjYWxsYmFja3MgZm9yIGludGVydmFsX2l0ZXJhdGUgYW5kIGludGVydmFsX2l0ZXJhdGVfcmV2ZXJzZTogRXZlcnkKKyAqICAgIG5vZGVzIGluIHRoZSB0cmVlIHdpbGwgYmUgc2V0IHRvIEBub2RlIGJlZm9yZSB0aGUgY2FsbGJhY2sgYmVpbmcgY2FsbGVkCisgKiAgLSBjYWxsYmFjayBmb3IgaW50ZXJ2YWxfc2VhcmNoOiBPbmx5IG92ZXJsYXBwZWQgbm9kZSB3aWxsIGJlIHNldCB0byBAbm9kZQorICogICAgYmVmb3JlIHRoZSBjYWxsYmFjayBiZWluZyBjYWxsZWQuCisgKi8KK3R5cGVkZWYgZW51bSBpbnRlcnZhbF9pdGVyICgqaW50ZXJ2YWxfY2FsbGJhY2tfdCkoc3RydWN0IGludGVydmFsX25vZGUgKm5vZGUsCisJCQkJCQkgIHZvaWQgKmFyZ3MpOworCiBzdHJ1Y3QgaW50ZXJ2YWxfbm9kZSAqaW50ZXJ2YWxfaW5zZXJ0KHN0cnVjdCBpbnRlcnZhbF9ub2RlICpub2RlLAogCQkJCSAgICAgIHN0cnVjdCBpbnRlcnZhbF9ub2RlICoqcm9vdCk7CiB2b2lkIGludGVydmFsX2VyYXNlKHN0cnVjdCBpbnRlcnZhbF9ub2RlICpub2RlLCBzdHJ1Y3QgaW50ZXJ2YWxfbm9kZSAqKnJvb3QpOwogCisvKgorICogU2VhcmNoIHRoZSBleHRlbnRzIGluIHRoZSB0cmVlIGFuZCBjYWxsIEBmdW5jIGZvciBlYWNoIG92ZXJsYXBwZWQKKyAqIGV4dGVudHMuCisgKi8KK2VudW0gaW50ZXJ2YWxfaXRlciBpbnRlcnZhbF9zZWFyY2goc3RydWN0IGludGVydmFsX25vZGUgKnJvb3QsCisJCQkJICAgc3RydWN0IGludGVydmFsX25vZGVfZXh0ZW50ICpleCwKKwkJCQkgICBpbnRlcnZhbF9jYWxsYmFja190IGZ1bmMsIHZvaWQgKmRhdGEpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbGludXgvbHVzdHJlX2NvbXBhdDI1LmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2x1c3RyZV9jb21wYXQyNS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWI2NGVjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbGludXgvbHVzdHJlX2NvbXBhdDI1LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogR1BMIEhFQURFUiBTVEFSVAotICoKLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQKLSAqIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IElmIG5vdCwgc2VlCi0gKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sCi0gKgotICogR1BMIEhFQURFUiBFTkQKLSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyLCBJbnRlbCBDb3Jwb3JhdGlvbi4KLSAqLwotLyoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEx1c3RyZSwgaHR0cDovL3d3dy5sdXN0cmUub3JnLwotICogTHVzdHJlIGlzIGEgdHJhZGVtYXJrIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqLwotCi0jaWZuZGVmIF9MSU5VWF9DT01QQVQyNV9ICi0jZGVmaW5lIF9MSU5VWF9DT01QQVQyNV9ICi0KLSNpbmNsdWRlIDxsaW51eC9mc19zdHJ1Y3QuaD4KLSNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgotCi0jaW5jbHVkZSAibHVzdHJlX3BhdGNobGVzc19jb21wYXQuaCIKLQotLyoKLSAqIHNldCBBVFRSX0JMT0NLUyB0byBhIGhpZ2ggdmFsdWUgdG8gYXZvaWQgYW55IHJpc2sgb2YgY29sbGlzaW9uIHdpdGggb3RoZXIKLSAqIEFUVFJfKiBhdHRyaWJ1dGVzIChzZWUgYnVnIDEzODI4KQotICovCi0jZGVmaW5lIEFUVFJfQkxPQ0tTICAgICgxIDw8IDI3KQotCi0jZGVmaW5lIGN1cnJlbnRfbmdyb3VwcyBjdXJyZW50X2NyZWQoKS0+Z3JvdXBfaW5mby0+bmdyb3VwcwotI2RlZmluZSBjdXJyZW50X2dyb3VwcyBjdXJyZW50X2NyZWQoKS0+Z3JvdXBfaW5mby0+c21hbGxfYmxvY2sKLQotLyoKLSAqIE9CRCBuZWVkIHdvcmtpbmcgcmFuZG9tIGRyaXZlciwgdGh1cyBhbGwgb3VyCi0gKiBpbml0aWFsaXphdGlvbiByb3V0aW5lcyBtdXN0IGJlIGNhbGxlZCBhZnRlciBkZXZpY2UKLSAqIGRyaXZlciBpbml0aWFsaXphdGlvbgotICovCi0jaWZuZGVmIE1PRFVMRQotI3VuZGVmIG1vZHVsZV9pbml0Ci0jZGVmaW5lIG1vZHVsZV9pbml0KGEpICAgICBsYXRlX2luaXRjYWxsKGEpCi0jZW5kaWYKLQotI2RlZmluZSBMVElNRV9TKHRpbWUpCQkgICAodGltZS50dl9zZWMpCi0KLSNpZm5kZWYgUVVPVEFfT0sKLSMgZGVmaW5lIFFVT1RBX09LIDAKLSNlbmRpZgotI2lmbmRlZiBOT19RVU9UQQotIyBkZWZpbmUgTk9fUVVPVEEgKC1FRFFVT1QpCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKF9BU01fR0VORVJJQ19CSVRPUFNfRVhUMl9OT05fQVRPTUlDX0hfKSAmJiAhZGVmaW5lZChleHQyX3NldF9iaXQpCi0jIGRlZmluZSBleHQyX3NldF9iaXQJICAgICBfX3Rlc3RfYW5kX3NldF9iaXRfbGUKLSMgZGVmaW5lIGV4dDJfY2xlYXJfYml0CSAgIF9fdGVzdF9hbmRfY2xlYXJfYml0X2xlCi0jIGRlZmluZSBleHQyX3Rlc3RfYml0CSAgICB0ZXN0X2JpdF9sZQotIyBkZWZpbmUgZXh0Ml9maW5kX2ZpcnN0X3plcm9fYml0IGZpbmRfZmlyc3RfemVyb19iaXRfbGUKLSMgZGVmaW5lIGV4dDJfZmluZF9uZXh0X3plcm9fYml0ICBmaW5kX25leHRfemVyb19iaXRfbGUKLSNlbmRpZgotCi0jZW5kaWYgLyogX0NPTVBBVDI1X0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbGludXgvbHVzdHJlX2xpdGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbGludXgvbHVzdHJlX2xpdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE4ZThhNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2x1c3RyZV9saXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogR1BMIEhFQURFUiBTVEFSVAotICoKLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQKLSAqIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IElmIG5vdCwgc2VlCi0gKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sCi0gKgotICogR1BMIEhFQURFUiBFTkQKLSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAxMCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMuCi0gKi8KLS8qCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMdXN0cmUsIGh0dHA6Ly93d3cubHVzdHJlLm9yZy8KLSAqIEx1c3RyZSBpcyBhIHRyYWRlbWFyayBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKi8KLQotI2lmbmRlZiBfTElOVVhfTExfSAotI2RlZmluZSBfTElOVVhfTExfSAotCi0jaWZuZGVmIF9MTF9ICi0jZXJyb3IgRG8gbm90ICNpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseS4gI2luY2x1ZGUgPGx1c3RyZV9saXRlLmg+IGluc3RlYWQKLSNlbmRpZgotCi0jaW5jbHVkZSA8bGludXgvc3RhdGZzLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgotCi0jaW5jbHVkZSAiLi4vb2JkX2NsYXNzLmgiCi0jaW5jbHVkZSAiLi4vbHVzdHJlX25ldC5oIgotI2luY2x1ZGUgIi4uL2x1c3RyZV9oYS5oIgotCi0jaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+Ci0jaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9saW51eC9sdXN0cmVfY29tcGF0MjUuaCIKLSNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+Ci0KLS8qIGxwcm9jZnMuYyAqLwotZW51bSB7Ci0JIExQUk9DX0xMX0RJUlRZX0hJVFMgPSAwLAotCSBMUFJPQ19MTF9ESVJUWV9NSVNTRVMsCi0JIExQUk9DX0xMX1JFQURfQllURVMsCi0JIExQUk9DX0xMX1dSSVRFX0JZVEVTLAotCSBMUFJPQ19MTF9CUldfUkVBRCwKLQkgTFBST0NfTExfQlJXX1dSSVRFLAotCSBMUFJPQ19MTF9PU0NfUkVBRCwKLQkgTFBST0NfTExfT1NDX1dSSVRFLAotCSBMUFJPQ19MTF9JT0NUTCwKLQkgTFBST0NfTExfT1BFTiwKLQkgTFBST0NfTExfUkVMRUFTRSwKLQkgTFBST0NfTExfTUFQLAotCSBMUFJPQ19MTF9MTFNFRUssCi0JIExQUk9DX0xMX0ZTWU5DLAotCSBMUFJPQ19MTF9SRUFERElSLAotCSBMUFJPQ19MTF9TRVRBVFRSLAotCSBMUFJPQ19MTF9UUlVOQywKLQkgTFBST0NfTExfRkxPQ0ssCi0JIExQUk9DX0xMX0dFVEFUVFIsCi0JIExQUk9DX0xMX0NSRUFURSwKLQkgTFBST0NfTExfTElOSywKLQkgTFBST0NfTExfVU5MSU5LLAotCSBMUFJPQ19MTF9TWU1MSU5LLAotCSBMUFJPQ19MTF9NS0RJUiwKLQkgTFBST0NfTExfUk1ESVIsCi0JIExQUk9DX0xMX01LTk9ELAotCSBMUFJPQ19MTF9SRU5BTUUsCi0JIExQUk9DX0xMX1NUQUZTLAotCSBMUFJPQ19MTF9BTExPQ19JTk9ERSwKLQkgTFBST0NfTExfU0VUWEFUVFIsCi0JIExQUk9DX0xMX0dFVFhBVFRSLAotCSBMUFJPQ19MTF9HRVRYQVRUUl9ISVRTLAotCSBMUFJPQ19MTF9MSVNUWEFUVFIsCi0JIExQUk9DX0xMX1JFTU9WRVhBVFRSLAotCSBMUFJPQ19MTF9JTk9ERV9QRVJNLAotCSBMUFJPQ19MTF9GSUxFX09QQ09ERVMKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9saW51eC9sdXN0cmVfdXNlci5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9saW51eC9sdXN0cmVfdXNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTY3OTUwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbGludXgvbHVzdHJlX3VzZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBHUEwgSEVBREVSIFNUQVJUCi0gKgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LAotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZAotICogaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgSWYgbm90LCBzZWUKLSAqIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLmh0bWwKLSAqCi0gKiBHUEwgSEVBREVSIEVORAotICovCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIsIEludGVsIENvcnBvcmF0aW9uLgotICovCi0vKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTHVzdHJlLCBodHRwOi8vd3d3Lmx1c3RyZS5vcmcvCi0gKiBMdXN0cmUgaXMgYSB0cmFkZW1hcmsgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICoKLSAqIGx1c3RyZS9pbmNsdWRlL2xpbnV4L2x1c3RyZV91c2VyLmgKLSAqCi0gKiBMdXN0cmUgcHVibGljIHVzZXItc3BhY2UgaW50ZXJmYWNlIGRlZmluaXRpb25zLgotICovCi0KLSNpZm5kZWYgX0xJTlVYX0xVU1RSRV9VU0VSX0gKLSNkZWZpbmUgX0xJTlVYX0xVU1RSRV9VU0VSX0gKLQotIyBpbmNsdWRlIDxsaW51eC9xdW90YS5oPgotCi0vKgotICogYXNtLXg4Nl82NC9wcm9jZXNzb3IuaCBvbiBzb21lIFNMRVMgOSBkaXN0cm9zIHNlZW1zIHRvIHVzZQotICoga2VybmVsLW9ubHkgdHlwZWRlZnMuICBmb3J0dW5hdGVseSBza2lwcGluZyBpdCBhbHRvZ2V0aGVyIGlzIG9rCi0gKiAoZm9yIG5vdykuCi0gKi8KLSNkZWZpbmUgX19BU01fWDg2XzY0X1BST0NFU1NPUl9ICi0KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLQotLyoKLSAqIFdlIG5lZWQgdG8gYWx3YXlzIHVzZSA2NGJpdCB2ZXJzaW9uIGJlY2F1c2UgdGhlIHN0cnVjdHVyZQotICogaXMgc2hhcmVkIGFjcm9zcyBlbnRpcmUgY2x1c3RlciB3aGVyZSAzMmJpdCBhbmQgNjRiaXQgbWFjaGluZXMKLSAqIGFyZSBjby1leGlzdGluZy4KLSAqLwotI2lmIF9fQklUU19QRVJfTE9ORyAhPSA2NCB8fCBkZWZpbmVkKF9fQVJDSF9XQU5UX1NUQVQ2NCkKLXR5cGVkZWYgc3RydWN0IHN0YXQ2NCAgIGxzdGF0X3Q7Ci0jZGVmaW5lIGxzdGF0X2YJIGxzdGF0NjQKLSNlbHNlCi10eXBlZGVmIHN0cnVjdCBzdGF0ICAgICBsc3RhdF90OwotI2RlZmluZSBsc3RhdF9mCSBsc3RhdAotI2VuZGlmCi0KLSNkZWZpbmUgSEFWRV9MT1ZfVVNFUl9NRFNfREFUQQotCi0jZW5kaWYgLyogX0xVU1RSRV9VU0VSX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHByb2Nmc19zdGF0dXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHByb2Nmc19zdGF0dXMuaAppbmRleCBkNjhlNjBlLi5jYzA3MTNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2xwcm9jZnNfc3RhdHVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9scHJvY2ZzX3N0YXR1cy5oCkBAIC0xNjUsOCArMTY1LDEwIEBACiAJc3RydWN0IGxwcm9jZnNfY291bnRlciBscF9jbnRyWzBdOwogfTsKIAotI2RlZmluZSBMUFJPQ0ZTX0dFVF9OVU1fQ1BVIDB4MDAwMQotI2RlZmluZSBMUFJPQ0ZTX0dFVF9TTVBfSUQgIDB4MDAwMgorZW51bSBscHJvY2ZzX3N0YXRzX2xvY2tfb3BzIHsKKwlMUFJPQ0ZTX0dFVF9OVU1fQ1BVCT0gMHgwMDAxLCAvKiBudW1iZXIgYWxsb2NhdGVkIHBlci1DUFUgc3RhdHMgKi8KKwlMUFJPQ0ZTX0dFVF9TTVBfSUQJPSAweDAwMDIsIC8qIGN1cnJlbnQgc3RhdCB0byBiZSB1cGRhdGVkICovCit9OwogCiBlbnVtIGxwcm9jZnNfc3RhdHNfZmxhZ3MgewogCUxQUk9DRlNfU1RBVFNfRkxBR19OT05FICAgICA9IDB4MDAwMCwgLyogcGVyIGNwdSBjb3VudGVyICovCkBAIC0zNjMsODIgKzM2NSw5OSBAQAogI2RlZmluZSBKT0JTVEFUU19QUk9DTkFNRV9VSUQJCSJwcm9jbmFtZV91aWQiCiAjZGVmaW5lIEpPQlNUQVRTX05PREVMT0NBTAkJIm5vZGVsb2NhbCIKIAorLyogb2JkX2NvbmZpZy5jICovCit2b2lkIGx1c3RyZV9yZWdpc3Rlcl9jbGllbnRfcHJvY2Vzc19jb25maWcoaW50ICgqY3BjKShzdHJ1Y3QgbHVzdHJlX2NmZyAqbGNmZykpOworCiBpbnQgbHByb2Nmc193cml0ZV9mcmFjX2hlbHBlcihjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAogCQkJICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgaW50ICp2YWwsIGludCBtdWx0KTsKIGludCBscHJvY2ZzX3JlYWRfZnJhY19oZWxwZXIoY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50LAogCQkJICAgICBsb25nIHZhbCwgaW50IG11bHQpOwogaW50IGxwcm9jZnNfc3RhdHNfYWxsb2Nfb25lKHN0cnVjdCBscHJvY2ZzX3N0YXRzICpzdGF0cywgdW5zaWduZWQgaW50IGNwdWlkKTsKLS8qCi0gKiBccmV0dXJuIHZhbHVlCi0gKiAgICAgIDwgMCAgICAgOiBvbiBlcnJvciAob25seSBwb3NzaWJsZSBmb3Igb3BjIGFzIExQUk9DRlNfR0VUX1NNUF9JRCkKKworLyoqCisgKiBMb2NrIHN0YXRpc3RpY3Mgc3RydWN0dXJlIGZvciBhY2Nlc3MsIHBvc3NpYmx5IG9ubHkgb24gdGhpcyBDUFUuCisgKgorICogVGhlIHN0YXRpc3RpY3Mgc3RydWN0IG1heSBiZSBhbGxvY2F0ZWQgd2l0aCBwZXItQ1BVIHN0cnVjdHVyZXMgZm9yCisgKiBlZmZpY2llbnQgY29uY3VycmVudCB1cGRhdGUgKHVzdWFsbHkgb25seSBvbiBzZXJ2ZXItd2lkZSBzdGF0cyksIG9yCisgKiBhcyBhIHNpbmdsZSBnbG9iYWwgc3RydWN0IChlLmcuIGZvciBwZXItY2xpZW50IG9yIHBlci1qb2Igc3RhdGlzdGljcyksCisgKiBzbyB0aGUgcmVxdWlyZWQgbG9ja2luZyBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIHN0cnVjdHVyZSBhbGxvY2F0ZWQuCisgKgorICogRm9yIHBlci1DUFUgc3RhdGlzdGljcywgcGluIHRoZSB0aHJlYWQgdG8gdGhlIGN1cnJlbnQgY3B1aWQgc28gdGhhdAorICogd2lsbCBvbmx5IGFjY2VzcyB0aGUgc3RhdGlzdGljcyBmb3IgdGhhdCBDUFUuICBJZiB0aGUgc3RhdHMgc3RydWN0dXJlCisgKiBmb3IgdGhlIGN1cnJlbnQgQ1BVIGhhcyBub3QgYmVlbiBhbGxvY2F0ZWQgKG9yIHByZXZpb3VzbHkgZnJlZWQpLAorICogYWxsb2NhdGUgaXQgbm93LiAgVGhlIHBlci1DUFUgc3RhdGlzdGljcyBkbyBub3QgbmVlZCBsb2NraW5nIHNpbmNlCisgKiB0aGUgdGhyZWFkIGlzIHBpbm5lZCB0byB0aGUgQ1BVIGR1cmluZyB1cGRhdGUuCisgKgorICogRm9yIGdsb2JhbCBzdGF0aXN0aWNzLCBsb2NrIHRoZSBzdGF0cyBzdHJ1Y3R1cmUgdG8gcHJldmVudCBjb25jdXJyZW50IHVwZGF0ZS4KKyAqCisgKiBccGFyYW1baW5dIHN0YXRzCXN0YXRpc3RpY3Mgc3RydWN0dXJlIHRvIGxvY2sKKyAqIFxwYXJhbVtpbl0gb3BjCXR5cGUgb2Ygb3BlcmF0aW9uOgorICoJCQlMUFJPQ0ZTX0dFVF9TTVBfSUQ6ICJsb2NrIiBhbmQgcmV0dXJuIGN1cnJlbnQgQ1BVIGluZGV4CisgKgkJCQlmb3IgaW5jcmVtZW50aW5nIHN0YXRpc3RpY3MgZm9yIHRoYXQgQ1BVCisgKgkJCUxQUk9DRlNfR0VUX05VTV9DUFU6ICJsb2NrIiBhbmQgcmV0dXJuIG51bWJlciBvZiB1c2VkCisgKgkJCQlDUFUgaW5kaWNlcyB0byBpdGVyYXRlIG92ZXIgYWxsIGluZGljZXMKKyAqIFxwYXJhbVtvdXRdIGZsYWdzCUNQVSBpbnRlcnJ1cHQgc2F2ZWQgc3RhdGUgZm9yIElSUS1zYWZlIGxvY2tpbmcKKyAqCisgKiBccmV0dmFsIGNwdWlkIG9mIGN1cnJlbnQgdGhyZWFkIG9yIG51bWJlciBvZiBhbGxvY2F0ZWQgc3RydWN0cworICogXHJldHZhbCBuZWdhdGl2ZSBvbiBlcnJvciAob25seSBmb3Igb3BjIExQUk9DRlNfR0VUX1NNUF9JRCArIHBlci1DUFUgc3RhdHMpCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGxwcm9jZnNfc3RhdHNfbG9jayhzdHJ1Y3QgbHByb2Nmc19zdGF0cyAqc3RhdHMsIGludCBvcGMsCitzdGF0aWMgaW5saW5lIGludCBscHJvY2ZzX3N0YXRzX2xvY2soc3RydWN0IGxwcm9jZnNfc3RhdHMgKnN0YXRzLAorCQkJCSAgICAgZW51bSBscHJvY2ZzX3N0YXRzX2xvY2tfb3BzIG9wYywKIAkJCQkgICAgIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQogewotCWludAkJcmMgPSAwOworCWlmIChzdGF0cy0+bHNfZmxhZ3MgJiBMUFJPQ0ZTX1NUQVRTX0ZMQUdfTk9QRVJDUFUpIHsKKwkJaWYgKHN0YXRzLT5sc19mbGFncyAmIExQUk9DRlNfU1RBVFNfRkxBR19JUlFfU0FGRSkKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0cy0+bHNfbG9jaywgKmZsYWdzKTsKKwkJZWxzZQorCQkJc3Bpbl9sb2NrKCZzdGF0cy0+bHNfbG9jayk7CisJCXJldHVybiBvcGMgPT0gTFBST0NGU19HRVRfTlVNX0NQVSA/IDEgOiAwOworCX0KIAogCXN3aXRjaCAob3BjKSB7CisJY2FzZSBMUFJPQ0ZTX0dFVF9TTVBfSUQ6IHsKKwkJdW5zaWduZWQgaW50IGNwdWlkID0gZ2V0X2NwdSgpOworCisJCWlmICh1bmxpa2VseSghc3RhdHMtPmxzX3BlcmNwdVtjcHVpZF0pKSB7CisJCQlpbnQgcmMgPSBscHJvY2ZzX3N0YXRzX2FsbG9jX29uZShzdGF0cywgY3B1aWQpOworCisJCQlpZiAocmMgPCAwKSB7CisJCQkJcHV0X2NwdSgpOworCQkJCXJldHVybiByYzsKKwkJCX0KKwkJfQorCQlyZXR1cm4gY3B1aWQ7CisJfQorCWNhc2UgTFBST0NGU19HRVRfTlVNX0NQVToKKwkJcmV0dXJuIHN0YXRzLT5sc19iaWdnZXN0X2FsbG9jX251bTsKIAlkZWZhdWx0OgogCQlMQlVHKCk7Ci0KLQljYXNlIExQUk9DRlNfR0VUX1NNUF9JRDoKLQkJaWYgKHN0YXRzLT5sc19mbGFncyAmIExQUk9DRlNfU1RBVFNfRkxBR19OT1BFUkNQVSkgewotCQkJaWYgKHN0YXRzLT5sc19mbGFncyAmIExQUk9DRlNfU1RBVFNfRkxBR19JUlFfU0FGRSkKLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdHMtPmxzX2xvY2ssICpmbGFncyk7Ci0JCQllbHNlCi0JCQkJc3Bpbl9sb2NrKCZzdGF0cy0+bHNfbG9jayk7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIHsKLQkJCXVuc2lnbmVkIGludCBjcHVpZCA9IGdldF9jcHUoKTsKLQotCQkJaWYgKHVubGlrZWx5KCFzdGF0cy0+bHNfcGVyY3B1W2NwdWlkXSkpIHsKLQkJCQlyYyA9IGxwcm9jZnNfc3RhdHNfYWxsb2Nfb25lKHN0YXRzLCBjcHVpZCk7Ci0JCQkJaWYgKHJjIDwgMCkgewotCQkJCQlwdXRfY3B1KCk7Ci0JCQkJCXJldHVybiByYzsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gY3B1aWQ7Ci0JCX0KLQotCWNhc2UgTFBST0NGU19HRVRfTlVNX0NQVToKLQkJaWYgKHN0YXRzLT5sc19mbGFncyAmIExQUk9DRlNfU1RBVFNfRkxBR19OT1BFUkNQVSkgewotCQkJaWYgKHN0YXRzLT5sc19mbGFncyAmIExQUk9DRlNfU1RBVFNfRkxBR19JUlFfU0FGRSkKLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdHMtPmxzX2xvY2ssICpmbGFncyk7Ci0JCQllbHNlCi0JCQkJc3Bpbl9sb2NrKCZzdGF0cy0+bHNfbG9jayk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQlyZXR1cm4gc3RhdHMtPmxzX2JpZ2dlc3RfYWxsb2NfbnVtOwogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGxwcm9jZnNfc3RhdHNfdW5sb2NrKHN0cnVjdCBscHJvY2ZzX3N0YXRzICpzdGF0cywgaW50IG9wYywKKy8qKgorICogVW5sb2NrIHN0YXRpc3RpY3Mgc3RydWN0dXJlIGFmdGVyIGFjY2Vzcy4KKyAqCisgKiBVbmxvY2sgdGhlIGxvY2sgYWNxdWlyZWQgdmlhIGxwcm9jZnNfc3RhdHNfbG9jaygpIGZvciBnbG9iYWwgc3RhdGlzdGljcywKKyAqIG9yIHVucGluIHRoaXMgdGhyZWFkIGZyb20gdGhlIGN1cnJlbnQgY3B1aWQgZm9yIHBlci1DUFUgc3RhdGlzdGljcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHVzaW5nIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyB1c2VkIHdoZW4gY2FsbGluZworICogbHByb2Nmc19zdGF0c19sb2NrKCkgc28gdGhhdCB0aGUgY29ycmVjdCBvcGVyYXRpb24gY2FuIGJlIHBlcmZvcm1lZC4KKyAqCisgKiBccGFyYW1baW5dIHN0YXRzCXN0YXRpc3RpY3Mgc3RydWN0dXJlIHRvIHVubG9jaworICogXHBhcmFtW2luXSBvcGMJdHlwZSBvZiBvcGVyYXRpb24gKGN1cnJlbnQgY3B1aWQgb3IgbnVtYmVyIG9mIHN0cnVjdHMpCisgKiBccGFyYW1baW5dIGZsYWdzCUNQVSBpbnRlcnJ1cHQgc2F2ZWQgc3RhdGUgZm9yIElSUS1zYWZlIGxvY2tpbmcKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxwcm9jZnNfc3RhdHNfdW5sb2NrKHN0cnVjdCBscHJvY2ZzX3N0YXRzICpzdGF0cywKKwkJCQkJZW51bSBscHJvY2ZzX3N0YXRzX2xvY2tfb3BzIG9wYywKIAkJCQkJdW5zaWduZWQgbG9uZyAqZmxhZ3MpCiB7Ci0Jc3dpdGNoIChvcGMpIHsKLQlkZWZhdWx0OgotCQlMQlVHKCk7Ci0KLQljYXNlIExQUk9DRlNfR0VUX1NNUF9JRDoKLQkJaWYgKHN0YXRzLT5sc19mbGFncyAmIExQUk9DRlNfU1RBVFNfRkxBR19OT1BFUkNQVSkgewotCQkJaWYgKHN0YXRzLT5sc19mbGFncyAmIExQUk9DRlNfU1RBVFNfRkxBR19JUlFfU0FGRSkKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0cy0+bHNfbG9jaywgKmZsYWdzKTsKLQkJCWVsc2UKLQkJCQlzcGluX3VubG9jaygmc3RhdHMtPmxzX2xvY2spOwotCQl9IGVsc2UgewotCQkJcHV0X2NwdSgpOwotCQl9Ci0JCXJldHVybjsKLQotCWNhc2UgTFBST0NGU19HRVRfTlVNX0NQVToKLQkJaWYgKHN0YXRzLT5sc19mbGFncyAmIExQUk9DRlNfU1RBVFNfRkxBR19OT1BFUkNQVSkgewotCQkJaWYgKHN0YXRzLT5sc19mbGFncyAmIExQUk9DRlNfU1RBVFNfRkxBR19JUlFfU0FGRSkKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0cy0+bHNfbG9jaywgKmZsYWdzKTsKLQkJCWVsc2UKLQkJCQlzcGluX3VubG9jaygmc3RhdHMtPmxzX2xvY2spOwotCQl9Ci0JCXJldHVybjsKKwlpZiAoc3RhdHMtPmxzX2ZsYWdzICYgTFBST0NGU19TVEFUU19GTEFHX05PUEVSQ1BVKSB7CisJCWlmIChzdGF0cy0+bHNfZmxhZ3MgJiBMUFJPQ0ZTX1NUQVRTX0ZMQUdfSVJRX1NBRkUpCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0cy0+bHNfbG9jaywgKmZsYWdzKTsKKwkJZWxzZQorCQkJc3Bpbl91bmxvY2soJnN0YXRzLT5sc19sb2NrKTsKKwl9IGVsc2UgaWYgKG9wYyA9PSBMUFJPQ0ZTX0dFVF9TTVBfSUQpIHsKKwkJcHV0X2NwdSgpOwogCX0KIH0KIApAQCAtNDk2LDcgKzUxNSw3IEBACiAJCQkJCSAgICBpbnQgaWR4LAogCQkJCQkgICAgZW51bSBscHJvY2ZzX2ZpZWxkc19mbGFncyBmaWVsZCkKIHsKLQlpbnQJICAgICAgaTsKKwl1bnNpZ25lZCBpbnQgaTsKIAl1bnNpZ25lZCBpbnQgIG51bV9jcHU7CiAJdW5zaWduZWQgbG9uZyBmbGFncwk9IDA7CiAJX191NjQJICAgICAgcmV0CT0gMDsKQEAgLTY4MSw2ICs3MDAsMTIgQEAKIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeXNmc19vcHMgbHVzdHJlX3N5c2ZzX29wczsKIAorc3RydWN0IHJvb3Rfc3F1YXNoX2luZm87CitpbnQgbHByb2Nmc193cl9yb290X3NxdWFzaChjb25zdCBjaGFyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQsCisJCQkgICBzdHJ1Y3Qgcm9vdF9zcXVhc2hfaW5mbyAqc3F1YXNoLCBjaGFyICpuYW1lKTsKK2ludCBscHJvY2ZzX3dyX25vc3F1YXNoX25pZHMoY29uc3QgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50LAorCQkJICAgICBzdHJ1Y3Qgcm9vdF9zcXVhc2hfaW5mbyAqc3F1YXNoLCBjaGFyICpuYW1lKTsKKwogLyogYWxsIHF1b3RhIHByb2MgZnVuY3Rpb25zICovCiBpbnQgbHByb2Nmc19xdW90YV9yZF9idW5pdChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCiAJCQkgICBsb2ZmX3Qgb2ZmLCBpbnQgY291bnQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1X29iamVjdC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdV9vYmplY3QuaAppbmRleCA2ZTI1YzFiLi4yNjA2NDNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1X29iamVjdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVfb2JqZWN0LmgKQEAgLTMyNyw3ICszMjcsNyBAQAogCS8qKgogCSAqIE51bWJlciBvZiBleGlzdGluZyBkZXZpY2UgdHlwZSBpbnN0YW5jZXMuCiAJICovCi0JdW5zaWduZWQJCQkJbGR0X2RldmljZV9ucjsKKwlhdG9taWNfdAkJCQlsZHRfZGV2aWNlX25yOwogCS8qKgogCSAqIExpbmthZ2UgaW50byBhIGdsb2JhbCBsaXN0IG9mIGFsbCBkZXZpY2UgdHlwZXMuCiAJICoKQEAgLTYwMiw3ICs2MDIsNyBAQAogCS8qKgogCSAqIGluZGV4IG9mIGJ1Y2tldCBvbiBoYXNoIHRhYmxlIHdoaWxlIHB1cmdpbmcKIAkgKi8KLQlpbnQJCSAgICAgICBsc19wdXJnZV9zdGFydDsKKwl1bnNpZ25lZCBpbnQJCWxzX3B1cmdlX3N0YXJ0OwogCS8qKgogCSAqIFRvcC1sZXZlbCBkZXZpY2UgZm9yIHRoaXMgc3RhY2suCiAJICovCkBAIC02MjMsNiArNjIzLDExIEBACiAJc3BpbmxvY2tfdAkJbHNfbGRfbG9jazsKIAogCS8qKgorCSAqIExvY2sgdG8gc2VyaWFsaXplIHNpdGUgcHVyZ2UuCisJICovCisJc3RydWN0IG11dGV4CQlsc19wdXJnZV9tdXRleDsKKworCS8qKgogCSAqIGx1X3NpdGUgc3RhdHMKIAkgKi8KIAlzdHJ1Y3QgbHByb2Nmc19zdGF0cwkqbHNfc3RhdHM7CkBAIC02NzMsNyArNjc4LDYgQEAKIAogaW50ICBsdV9kZXZpY2VfdHlwZV9pbml0KHN0cnVjdCBsdV9kZXZpY2VfdHlwZSAqbGR0KTsKIHZvaWQgbHVfZGV2aWNlX3R5cGVfZmluaShzdHJ1Y3QgbHVfZGV2aWNlX3R5cGUgKmxkdCk7Ci12b2lkIGx1X3R5cGVzX3N0b3Aodm9pZCk7CiAKIC8qKiBAfSBjdG9ycyAqLwogCkBAIC0xMDI1LDcgKzEwMjksOCBAQAogCS8qKgogCSAqIENvbnRleHRzIHVzYWJsZSBpbiBjYWNoZSBzaHJpbmtlciB0aHJlYWQuCiAJICovCi0JTENUX1NIUklOS0VSICA9IExDVF9NRF9USFJFQUR8TENUX0RUX1RIUkVBRHxMQ1RfQ0xfVEhSRUFEfExDVF9OT1JFRgorCUxDVF9TSFJJTktFUiAgPSBMQ1RfTURfVEhSRUFEIHwgTENUX0RUX1RIUkVBRCB8IExDVF9DTF9USFJFQUQgfAorCQkJTENUX05PUkVGCiB9OwogCiAvKioKQEAgLTEyNjQsMTIgKzEyNjksMjggQEAKIH07CiAKIC8qKgorICogVmFsaWRhdGUgbmFtZXMgKHBhdGggY29tcG9uZW50cykKKyAqCisgKiBUbyBiZSB2YWxpZCBcYSBuYW1lIG11c3QgYmUgbm9uLWVtcHR5LCAnXDAnIHRlcm1pbmF0ZWQgb2YgbGVuZ3RoIFxhCisgKiBuYW1lX2xlbiwgYW5kIG5vdCBjb250YWluICcvJy4gVGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgbmFtZSAoYmVmb3JlCisgKiBzYXkgLUVOQU1FVE9PTE9ORyB3aWxsIGJlIHJldHVybmVkKSBpcyByZWFsbHkgY29udHJvbGxlZCBieSBsbGl0ZQorICogYW5kIHRoZSBzZXJ2ZXIuIFdlIG9ubHkgY2hlY2sgZm9yIHNvbWV0aGluZyBpbnNhbmUgY29taW5nIGZyb20gYmFkCisgKiBpbnRlZ2VyIGhhbmRsaW5nIGhlcmUuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBsdV9uYW1lX2lzX3ZhbGlkXzIoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQoreworCXJldHVybiBuYW1lICYmIG5hbWVfbGVuID4gMCAmJiBuYW1lX2xlbiA8IElOVF9NQVggJiYKKwkgICAgICAgbmFtZVtuYW1lX2xlbl0gPT0gJ1wwJyAmJiBzdHJsZW4obmFtZSkgPT0gbmFtZV9sZW4gJiYKKwkgICAgICAgIW1lbWNocihuYW1lLCAnLycsIG5hbWVfbGVuKTsKK30KKworLyoqCiAgKiBDb21tb24gYnVmZmVyIHN0cnVjdHVyZSB0byBiZSBwYXNzZWQgYXJvdW5kIGZvciB2YXJpb3VzIHhhdHRyX3tzLGd9ZXQoKQogICogbWV0aG9kcy4KICAqLwogc3RydWN0IGx1X2J1ZiB7CiAJdm9pZCAgICpsYl9idWY7Ci0Jc3NpemVfdCBsYl9sZW47CisJc2l6ZV90CWxiX2xlbjsKIH07CiAKICNkZWZpbmUgRExVQlVGICIoJXAgJXp1KSIKQEAgLTEyOTgsNSArMTMxOSwxMiBAQAogaW50ICBsdV9rbWVtX2luaXQoc3RydWN0IGx1X2ttZW1fZGVzY3IgKmNhY2hlcyk7CiB2b2lkIGx1X2ttZW1fZmluaShzdHJ1Y3QgbHVfa21lbV9kZXNjciAqY2FjaGVzKTsKIAordm9pZCBsdV9idWZfZnJlZShzdHJ1Y3QgbHVfYnVmICpidWYpOwordm9pZCBsdV9idWZfYWxsb2Moc3RydWN0IGx1X2J1ZiAqYnVmLCBzaXplX3Qgc2l6ZSk7Cit2b2lkIGx1X2J1Zl9yZWFsbG9jKHN0cnVjdCBsdV9idWYgKmJ1Ziwgc2l6ZV90IHNpemUpOworCitpbnQgbHVfYnVmX2NoZWNrX2FuZF9ncm93KHN0cnVjdCBsdV9idWYgKmJ1Ziwgc2l6ZV90IGxlbik7CitzdHJ1Y3QgbHVfYnVmICpsdV9idWZfY2hlY2tfYW5kX2FsbG9jKHN0cnVjdCBsdV9idWYgKmJ1Ziwgc2l6ZV90IGxlbik7CisKIC8qKiBAfSBsdSAqLwogI2VuZGlmIC8qIF9fTFVTVFJFX0xVX09CSkVDVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfaWRsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfaWRsLmgKaW5kZXggMDUxODY0Yy4uNzJlYWVlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmUvbHVzdHJlX2lkbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV9pZGwuaApAQCAtOTMsNiArOTMsNyBAQAogLyogRGVmbidzIHNoYXJlZCB3aXRoIHVzZXItc3BhY2UuICovCiAjaW5jbHVkZSAibHVzdHJlX3VzZXIuaCIKICNpbmNsdWRlICJsdXN0cmVfZXJybm8uaCIKKyNpbmNsdWRlICIuLi9sdXN0cmVfdmVyLmgiCiAKIC8qCiAgKiAgR0VORVJBTCBTVFVGRgpAQCAtMTk2LDEyICsxOTcsMTIgQEAKIAlyZXR1cm4gcmFuZ2UtPmxzcl9mbGFncyAmIExVX1NFUV9SQU5HRV9NQVNLOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBmbGRfcmFuZ2VfaXNfb3N0KGNvbnN0IHN0cnVjdCBsdV9zZXFfcmFuZ2UgKnJhbmdlKQorc3RhdGljIGlubGluZSBib29sIGZsZF9yYW5nZV9pc19vc3QoY29uc3Qgc3RydWN0IGx1X3NlcV9yYW5nZSAqcmFuZ2UpCiB7CiAJcmV0dXJuIGZsZF9yYW5nZV90eXBlKHJhbmdlKSA9PSBMVV9TRVFfUkFOR0VfT1NUOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBmbGRfcmFuZ2VfaXNfbWR0KGNvbnN0IHN0cnVjdCBsdV9zZXFfcmFuZ2UgKnJhbmdlKQorc3RhdGljIGlubGluZSBib29sIGZsZF9yYW5nZV9pc19tZHQoY29uc3Qgc3RydWN0IGx1X3NlcV9yYW5nZSAqcmFuZ2UpCiB7CiAJcmV0dXJuIGZsZF9yYW5nZV90eXBlKHJhbmdlKSA9PSBMVV9TRVFfUkFOR0VfTURUOwogfQpAQCAtMjYwLDIzICsyNjEsMjMgQEAKICAqIGNoZWNrIGlmIGdpdmVuIHNlcSBpZCBcYSBzIGlzIHdpdGhpbiBnaXZlbiByYW5nZSBcYSByCiAgKi8KIAotc3RhdGljIGlubGluZSBpbnQgcmFuZ2Vfd2l0aGluKGNvbnN0IHN0cnVjdCBsdV9zZXFfcmFuZ2UgKnJhbmdlLAotCQkJICAgICAgIF9fdTY0IHMpCitzdGF0aWMgaW5saW5lIGJvb2wgcmFuZ2Vfd2l0aGluKGNvbnN0IHN0cnVjdCBsdV9zZXFfcmFuZ2UgKnJhbmdlLAorCQkJCV9fdTY0IHMpCiB7CiAJcmV0dXJuIHMgPj0gcmFuZ2UtPmxzcl9zdGFydCAmJiBzIDwgcmFuZ2UtPmxzcl9lbmQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHJhbmdlX2lzX3NhbmUoY29uc3Qgc3RydWN0IGx1X3NlcV9yYW5nZSAqcmFuZ2UpCitzdGF0aWMgaW5saW5lIGJvb2wgcmFuZ2VfaXNfc2FuZShjb25zdCBzdHJ1Y3QgbHVfc2VxX3JhbmdlICpyYW5nZSkKIHsKIAlyZXR1cm4gKHJhbmdlLT5sc3JfZW5kID49IHJhbmdlLT5sc3Jfc3RhcnQpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCByYW5nZV9pc196ZXJvKGNvbnN0IHN0cnVjdCBsdV9zZXFfcmFuZ2UgKnJhbmdlKQorc3RhdGljIGlubGluZSBib29sIHJhbmdlX2lzX3plcm8oY29uc3Qgc3RydWN0IGx1X3NlcV9yYW5nZSAqcmFuZ2UpCiB7CiAJcmV0dXJuIChyYW5nZS0+bHNyX3N0YXJ0ID09IDAgJiYgcmFuZ2UtPmxzcl9lbmQgPT0gMCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHJhbmdlX2lzX2V4aGF1c3RlZChjb25zdCBzdHJ1Y3QgbHVfc2VxX3JhbmdlICpyYW5nZSkKK3N0YXRpYyBpbmxpbmUgYm9vbCByYW5nZV9pc19leGhhdXN0ZWQoY29uc3Qgc3RydWN0IGx1X3NlcV9yYW5nZSAqcmFuZ2UpCiAKIHsKIAlyZXR1cm4gcmFuZ2Vfc3BhY2UocmFuZ2UpID09IDA7CkBAIC00MzcsNjkgKzQzOCw2OSBAQAogCUZJRF9PSURfRE9UX0xVU1RSRV9PQkYgPSAyVUwsCiB9OwogCi1zdGF0aWMgaW5saW5lIGludCBmaWRfc2VxX2lzX21kdDAoX191NjQgc2VxKQorc3RhdGljIGlubGluZSBib29sIGZpZF9zZXFfaXNfbWR0MChfX3U2NCBzZXEpCiB7CiAJcmV0dXJuIChzZXEgPT0gRklEX1NFUV9PU1RfTURUMCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGZpZF9zZXFfaXNfbWR0KGNvbnN0IF9fdTY0IHNlcSkKK3N0YXRpYyBpbmxpbmUgYm9vbCBmaWRfc2VxX2lzX21kdChfX3U2NCBzZXEpCiB7CiAJcmV0dXJuIHNlcSA9PSBGSURfU0VRX09TVF9NRFQwIHx8IHNlcSA+PSBGSURfU0VRX05PUk1BTDsKIH07CiAKLXN0YXRpYyBpbmxpbmUgaW50IGZpZF9zZXFfaXNfZWNobyhfX3U2NCBzZXEpCitzdGF0aWMgaW5saW5lIGJvb2wgZmlkX3NlcV9pc19lY2hvKF9fdTY0IHNlcSkKIHsKIAlyZXR1cm4gKHNlcSA9PSBGSURfU0VRX0VDSE8pOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBmaWRfaXNfZWNobyhjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQpCitzdGF0aWMgaW5saW5lIGJvb2wgZmlkX2lzX2VjaG8oY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkKQogewogCXJldHVybiBmaWRfc2VxX2lzX2VjaG8oZmlkX3NlcShmaWQpKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZmlkX3NlcV9pc19sbG9nKF9fdTY0IHNlcSkKK3N0YXRpYyBpbmxpbmUgYm9vbCBmaWRfc2VxX2lzX2xsb2coX191NjQgc2VxKQogewogCXJldHVybiAoc2VxID09IEZJRF9TRVFfTExPRyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGZpZF9pc19sbG9nKGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBmaWRfaXNfbGxvZyhjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQpCiB7CiAJLyogZmlsZSB3aXRoIE9JRCA9PSAwIGlzIG5vdCBsbG9nIGJ1dCBjb250YWlucyBsYXN0IG9pZCAqLwogCXJldHVybiBmaWRfc2VxX2lzX2xsb2coZmlkX3NlcShmaWQpKSAmJiBmaWRfb2lkKGZpZCkgPiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBmaWRfc2VxX2lzX3JzdmQoY29uc3QgX191NjQgc2VxKQorc3RhdGljIGlubGluZSBib29sIGZpZF9zZXFfaXNfcnN2ZChfX3U2NCBzZXEpCiB7CiAJcmV0dXJuIChzZXEgPiBGSURfU0VRX09TVF9NRFQwICYmIHNlcSA8PSBGSURfU0VRX1JTVkQpOwogfTsKIAotc3RhdGljIGlubGluZSBpbnQgZmlkX3NlcV9pc19zcGVjaWFsKGNvbnN0IF9fdTY0IHNlcSkKK3N0YXRpYyBpbmxpbmUgYm9vbCBmaWRfc2VxX2lzX3NwZWNpYWwoX191NjQgc2VxKQogewogCXJldHVybiBzZXEgPT0gRklEX1NFUV9TUEVDSUFMOwogfTsKIAotc3RhdGljIGlubGluZSBpbnQgZmlkX3NlcV9pc19sb2NhbF9maWxlKGNvbnN0IF9fdTY0IHNlcSkKK3N0YXRpYyBpbmxpbmUgYm9vbCBmaWRfc2VxX2lzX2xvY2FsX2ZpbGUoX191NjQgc2VxKQogewogCXJldHVybiBzZXEgPT0gRklEX1NFUV9MT0NBTF9GSUxFIHx8CiAJICAgICAgIHNlcSA9PSBGSURfU0VRX0xPQ0FMX05BTUU7CiB9OwogCi1zdGF0aWMgaW5saW5lIGludCBmaWRfc2VxX2lzX3Jvb3QoY29uc3QgX191NjQgc2VxKQorc3RhdGljIGlubGluZSBib29sIGZpZF9zZXFfaXNfcm9vdChfX3U2NCBzZXEpCiB7CiAJcmV0dXJuIHNlcSA9PSBGSURfU0VRX1JPT1Q7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGZpZF9zZXFfaXNfZG90KGNvbnN0IF9fdTY0IHNlcSkKK3N0YXRpYyBpbmxpbmUgYm9vbCBmaWRfc2VxX2lzX2RvdChfX3U2NCBzZXEpCiB7CiAJcmV0dXJuIHNlcSA9PSBGSURfU0VRX0RPVF9MVVNUUkU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGZpZF9zZXFfaXNfZGVmYXVsdChjb25zdCBfX3U2NCBzZXEpCitzdGF0aWMgaW5saW5lIGJvb2wgZmlkX3NlcV9pc19kZWZhdWx0KF9fdTY0IHNlcSkKIHsKIAlyZXR1cm4gc2VxID09IEZJRF9TRVFfTE9WX0RFRkFVTFQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGZpZF9pc19tZHQwKGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBmaWRfaXNfbWR0MChjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQpCiB7CiAJcmV0dXJuIGZpZF9zZXFfaXNfbWR0MChmaWRfc2VxKGZpZCkpOwogfQpAQCAtNTE2LDEyICs1MTcsMTIgQEAKICAqIFxwYXJhbSBmaWQgdGhlIGZpZCB0byBiZSB0ZXN0ZWQuCiAgKiBccmV0dXJuIHRydWUgaWYgdGhlIGZpZCBpcyBhIGlnaWY7IG90aGVyd2lzZSBmYWxzZS4KICAqLwotc3RhdGljIGlubGluZSBpbnQgZmlkX3NlcV9pc19pZ2lmKGNvbnN0IF9fdTY0IHNlcSkKK3N0YXRpYyBpbmxpbmUgYm9vbCBmaWRfc2VxX2lzX2lnaWYoX191NjQgc2VxKQogewogCXJldHVybiBzZXEgPj0gRklEX1NFUV9JR0lGICYmIHNlcSA8PSBGSURfU0VRX0lHSUZfTUFYOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBmaWRfaXNfaWdpZihjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQpCitzdGF0aWMgaW5saW5lIGJvb2wgZmlkX2lzX2lnaWYoY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkKQogewogCXJldHVybiBmaWRfc2VxX2lzX2lnaWYoZmlkX3NlcShmaWQpKTsKIH0KQEAgLTUzMSwyNyArNTMyLDI3IEBACiAgKiBccGFyYW0gZmlkIHRoZSBmaWQgdG8gYmUgdGVzdGVkLgogICogXHJldHVybiB0cnVlIGlmIHRoZSBmaWQgaXMgYSBpZGlmOyBvdGhlcndpc2UgZmFsc2UuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGZpZF9zZXFfaXNfaWRpZihjb25zdCBfX3U2NCBzZXEpCitzdGF0aWMgaW5saW5lIGJvb2wgZmlkX3NlcV9pc19pZGlmKF9fdTY0IHNlcSkKIHsKIAlyZXR1cm4gc2VxID49IEZJRF9TRVFfSURJRiAmJiBzZXEgPD0gRklEX1NFUV9JRElGX01BWDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZmlkX2lzX2lkaWYoY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkKQorc3RhdGljIGlubGluZSBib29sIGZpZF9pc19pZGlmKGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCkKIHsKIAlyZXR1cm4gZmlkX3NlcV9pc19pZGlmKGZpZF9zZXEoZmlkKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGZpZF9pc19sb2NhbF9maWxlKGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBmaWRfaXNfbG9jYWxfZmlsZShjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQpCiB7CiAJcmV0dXJuIGZpZF9zZXFfaXNfbG9jYWxfZmlsZShmaWRfc2VxKGZpZCkpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBmaWRfc2VxX2lzX25vcm0oY29uc3QgX191NjQgc2VxKQorc3RhdGljIGlubGluZSBib29sIGZpZF9zZXFfaXNfbm9ybShfX3U2NCBzZXEpCiB7CiAJcmV0dXJuIChzZXEgPj0gRklEX1NFUV9OT1JNQUwpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBmaWRfaXNfbm9ybShjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQpCitzdGF0aWMgaW5saW5lIGJvb2wgZmlkX2lzX25vcm0oY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkKQogewogCXJldHVybiBmaWRfc2VxX2lzX25vcm0oZmlkX3NlcShmaWQpKTsKIH0KQEAgLTY1OCw3ICs2NTksNyBAQAogCQlvaS0+b2lfZmlkLmZfb2lkID0gb2lkOwogCQlvaS0+b2lfZmlkLmZfdmVyID0gb2lkID4+IDQ4OwogCX0gZWxzZSB7Ci0JCWlmIChvaWQgPiBPQklGX01BWF9PSUQpIHsKKwkJaWYgKG9pZCA+PSBPQklGX01BWF9PSUQpIHsKIAkJCUNFUlJPUigiQmFkICVsbHUgdG8gc2V0ICIgRE9TVElEICJcbiIsIG9pZCwgUE9TVElEKG9pKSk7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTY4Myw3ICs2ODQsNyBAQAogCQlmaWQtPmZfb2lkID0gb2lkOwogCQlmaWQtPmZfdmVyID0gb2lkID4+IDQ4OwogCX0gZWxzZSB7Ci0JCWlmIChvaWQgPiBPQklGX01BWF9PSUQpIHsKKwkJaWYgKG9pZCA+PSBPQklGX01BWF9PSUQpIHsKIAkJCUNFUlJPUigiVG9vIGxhcmdlIE9JRCAlI2xseCB0byBzZXQgUkVHICJERklEIlxuIiwKIAkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW9pZCwgUEZJRChmaWQpKTsKIAkJCXJldHVybiAtRUJBREY7CkBAIC03NjksNyArNzcwLDcgQEAKIH0KIAogLyogQ2hlY2sgd2hldGhlciB0aGUgZmlkIGlzIGZvciBMQVNUX0lEICovCi1zdGF0aWMgaW5saW5lIGludCBmaWRfaXNfbGFzdF9pZChjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQpCitzdGF0aWMgaW5saW5lIGJvb2wgZmlkX2lzX2xhc3RfaWQoY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkKQogewogCXJldHVybiAoZmlkX29pZChmaWQpID09IDApOwogfQpAQCAtODM4LDcgKzgzOSw3IEBACiAJZHN0LT5mX3ZlciA9IGJlMzJfdG9fY3B1KGZpZF92ZXIoc3JjKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGZpZF9pc19zYW5lKGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBmaWRfaXNfc2FuZShjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQpCiB7CiAJcmV0dXJuIGZpZCAmJgogCSAgICAgICAoKGZpZF9zZXEoZmlkKSA+PSBGSURfU0VRX1NUQVJUICYmIGZpZF92ZXIoZmlkKSA9PSAwKSB8fApAQCAtODQ2LDE1ICs4NDcsMTAgQEAKIAkJZmlkX3NlcV9pc19yc3ZkKGZpZF9zZXEoZmlkKSkpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBmaWRfaXNfemVybyhjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQpCi17Ci0JcmV0dXJuIGZpZF9zZXEoZmlkKSA9PSAwICYmIGZpZF9vaWQoZmlkKSA9PSAwOwotfQotCiB2b2lkIGx1c3RyZV9zd2FiX2x1X2ZpZChzdHJ1Y3QgbHVfZmlkICpmaWQpOwogdm9pZCBsdXN0cmVfc3dhYl9sdV9zZXFfcmFuZ2Uoc3RydWN0IGx1X3NlcV9yYW5nZSAqcmFuZ2UpOwogCi1zdGF0aWMgaW5saW5lIGludCBsdV9maWRfZXEoY29uc3Qgc3RydWN0IGx1X2ZpZCAqZjAsIGNvbnN0IHN0cnVjdCBsdV9maWQgKmYxKQorc3RhdGljIGlubGluZSBib29sIGx1X2ZpZF9lcShjb25zdCBzdHJ1Y3QgbHVfZmlkICpmMCwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZjEpCiB7CiAJcmV0dXJuIG1lbWNtcChmMCwgZjEsIHNpemVvZigqZjApKSA9PSAwOwogfQpAQCAtMTAxNywxMiArMTAxMywxMiBAQAogCXJldHVybiBuZXh0OwogfQogCi1zdGF0aWMgaW5saW5lIGludCBsdV9kaXJlbnRfY2FsY19zaXplKGludCBuYW1lbGVuLCBfX3UxNiBhdHRyKQorc3RhdGljIGlubGluZSBzaXplX3QgbHVfZGlyZW50X2NhbGNfc2l6ZShzaXplX3QgbmFtZWxlbiwgX191MTYgYXR0cikKIHsKLQlpbnQgc2l6ZTsKKwlzaXplX3Qgc2l6ZTsKIAogCWlmIChhdHRyICYgTFVEQV9UWVBFKSB7Ci0JCWNvbnN0IHVuc2lnbmVkIGFsaWduID0gc2l6ZW9mKHN0cnVjdCBsdWRhX3R5cGUpIC0gMTsKKwkJY29uc3Qgc2l6ZV90IGFsaWduID0gc2l6ZW9mKHN0cnVjdCBsdWRhX3R5cGUpIC0gMTsKIAogCQlzaXplID0gKHNpemVvZihzdHJ1Y3QgbHVfZGlyZW50KSArIG5hbWVsZW4gKyBhbGlnbikgJiB+YWxpZ247CiAJCXNpemUgKz0gc2l6ZW9mKHN0cnVjdCBsdWRhX3R5cGUpOwpAQCAtMTAzMywxNSArMTAyOSw2IEBACiAJcmV0dXJuIChzaXplICsgNykgJiB+NzsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgbHVfZGlyZW50X3NpemUoc3RydWN0IGx1X2RpcmVudCAqZW50KQotewotCWlmIChsZTE2X3RvX2NwdShlbnQtPmxkZV9yZWNsZW4pID09IDApIHsKLQkJcmV0dXJuIGx1X2RpcmVudF9jYWxjX3NpemUobGUxNl90b19jcHUoZW50LT5sZGVfbmFtZWxlbiksCi0JCQkJCSAgIGxlMzJfdG9fY3B1KGVudC0+bGRlX2F0dHJzKSk7Ci0JfQotCXJldHVybiBsZTE2X3RvX2NwdShlbnQtPmxkZV9yZWNsZW4pOwotfQotCiAjZGVmaW5lIE1EU19ESVJfRU5EX09GRiAweGZmZmZmZmZmZmZmZmZmZmVVTEwKIAogLyoqCkBAIC0xMDY3LDE5ICsxMDU0LDE5IEBACiAKICNkZWZpbmUgREVBRF9IQU5ETEVfTUFHSUMgMHhkZWFkYmVlZmNhZmViYWJlVUxMCiAKLXN0YXRpYyBpbmxpbmUgaW50IGx1c3RyZV9oYW5kbGVfaXNfdXNlZChzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAqbGgpCitzdGF0aWMgaW5saW5lIGJvb2wgbHVzdHJlX2hhbmRsZV9pc191c2VkKGNvbnN0IHN0cnVjdCBsdXN0cmVfaGFuZGxlICpsaCkKIHsKIAlyZXR1cm4gbGgtPmNvb2tpZSAhPSAwdWxsOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBsdXN0cmVfaGFuZGxlX2VxdWFsKGNvbnN0IHN0cnVjdCBsdXN0cmVfaGFuZGxlICpsaDEsCi0JCQkJICAgICAgY29uc3Qgc3RydWN0IGx1c3RyZV9oYW5kbGUgKmxoMikKK3N0YXRpYyBpbmxpbmUgYm9vbCBsdXN0cmVfaGFuZGxlX2VxdWFsKGNvbnN0IHN0cnVjdCBsdXN0cmVfaGFuZGxlICpsaDEsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBsdXN0cmVfaGFuZGxlICpsaDIpCiB7CiAJcmV0dXJuIGxoMS0+Y29va2llID09IGxoMi0+Y29va2llOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbHVzdHJlX2hhbmRsZV9jb3B5KHN0cnVjdCBsdXN0cmVfaGFuZGxlICp0Z3QsCi0JCQkJICAgICAgc3RydWN0IGx1c3RyZV9oYW5kbGUgKnNyYykKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAqc3JjKQogewogCXRndC0+Y29va2llID0gc3JjLT5jb29raWU7CiB9CkBAIC0xMTA1LDcgKzEwOTIsNyBAQAogCiAvKiB3aXRob3V0IGdzcywgcHRscnBjX2JvZHkgaXMgcHV0IGF0IHRoZSBmaXJzdCBidWZmZXIuICovCiAjZGVmaW5lIFBUTFJQQ19OVU1fVkVSU0lPTlMgICAgIDQKLSNkZWZpbmUgSk9CU1RBVFNfSk9CSURfU0laRSAgICAgMzIgIC8qIDMyIGJ5dGVzIHN0cmluZyAqLworCiBzdHJ1Y3QgcHRscnBjX2JvZHlfdjMgewogCXN0cnVjdCBsdXN0cmVfaGFuZGxlIHBiX2hhbmRsZTsKIAlfX3UzMiBwYl90eXBlOwpAQCAtMTEyNyw3ICsxMTE0LDcgQEAKIAlfX3U2NCBwYl9wcmVfdmVyc2lvbnNbUFRMUlBDX05VTV9WRVJTSU9OU107CiAJLyogcGFkZGluZyBmb3IgZnV0dXJlIG5lZWRzICovCiAJX191NjQgcGJfcGFkZGluZ1s0XTsKLQljaGFyICBwYl9qb2JpZFtKT0JTVEFUU19KT0JJRF9TSVpFXTsKKwljaGFyICBwYl9qb2JpZFtMVVNUUkVfSk9CSURfU0laRV07CiB9OwogCiAjZGVmaW5lIHB0bHJwY19ib2R5ICAgICBwdGxycGNfYm9keV92MwpAQCAtMTI5Myw2ICsxMjgwLDkgQEAKICNkZWZpbmUgT0JEX0NPTk5FQ1RfT1BFTl9CWV9GSUQJMHgyMDAwMDAwMDAwMDAwMFVMTAkvKiBvcGVuIGJ5IGZpZCB3b24ndCBwYWNrCiAJCQkJCQkJICogbmFtZSBpbiByZXF1ZXN0CiAJCQkJCQkJICovCisjZGVmaW5lIE9CRF9DT05ORUNUX0xGU0NLCTB4NDAwMDAwMDAwMDAwMDBVTEwvKiBzdXBwb3J0IG9ubGluZSBMRlNDSyAqLworI2RlZmluZSBPQkRfQ09OTkVDVF9VTkxJTktfQ0xPU0UgMHgxMDAwMDAwMDAwMDAwMDBVTEwvKiBjbG9zZSBmaWxlIGluIHVubGluayAqLworI2RlZmluZSBPQkRfQ09OTkVDVF9ESVJfU1RSSVBFCSAweDQwMDAwMDAwMDAwMDAwMFVMTC8qIHN0cmlwZWQgRE5FIGRpciAqLwogCiAvKiBYWFggUkVBRE1FIFhYWDoKICAqIFBsZWFzZSBETyBOT1QgYWRkIGZsYWcgdmFsdWVzIGhlcmUgYmVmb3JlIGZpcnN0IGVuc3VyaW5nIHRoYXQgdGhpcyBzYW1lCkBAIC0xMzE4LDE0ICsxMzA4LDYgQEAKICNkZWZpbmUgQ0xJRU5UX0NPTk5FQ1RfTURUX1JFUUQgKE9CRF9DT05ORUNUX0lCSVRTIHwgT0JEX0NPTk5FQ1RfRklEIHwgXAogCQkJCSBPQkRfQ09OTkVDVF9GVUxMMjApCiAKLSNkZWZpbmUgT0JEX09DRF9WRVJTSU9OKG1ham9yLCBtaW5vciwgcGF0Y2gsIGZpeCkgKCgobWFqb3IpPDwyNCkgKyBcCi0JCQkJCQkgICgobWlub3IpPDwxNikgKyBcCi0JCQkJCQkgICgocGF0Y2gpPDw4KSArIChmaXgpKQotI2RlZmluZSBPQkRfT0NEX1ZFUlNJT05fTUFKT1IodmVyc2lvbikgKChpbnQpKCh2ZXJzaW9uKT4+MjQpJjI1NSkKLSNkZWZpbmUgT0JEX09DRF9WRVJTSU9OX01JTk9SKHZlcnNpb24pICgoaW50KSgodmVyc2lvbik+PjE2KSYyNTUpCi0jZGVmaW5lIE9CRF9PQ0RfVkVSU0lPTl9QQVRDSCh2ZXJzaW9uKSAoKGludCkoKHZlcnNpb24pPj44KSYyNTUpCi0jZGVmaW5lIE9CRF9PQ0RfVkVSU0lPTl9GSVgodmVyc2lvbikgICAoKGludCkodmVyc2lvbikmMjU1KQotCiAvKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBib3RoIHJlcXVlc3QgYW5kIHJlcGx5LgogICoKICAqIElmIHdlIGV2ZW50dWFsbHkgaGF2ZSBzZXBhcmF0ZSBjb25uZWN0IGRhdGEgZm9yIGRpZmZlcmVudCB0eXBlcywgd2hpY2ggd2UKQEAgLTE0NzgsMTAgKzE0NjAsMjMgQEAKIAlPQkRfRkxfTE9DQUxfTUFTSyAgID0gMHhGMDAwMDAwMCwKIH07CiAKLSNkZWZpbmUgTE9WX01BR0lDX1YxICAgICAgMHgwQkQxMEJEMAotI2RlZmluZSBMT1ZfTUFHSUMJIExPVl9NQUdJQ19WMQotI2RlZmluZSBMT1ZfTUFHSUNfSk9JTl9WMSAweDBCRDIwQkQwCi0jZGVmaW5lIExPVl9NQUdJQ19WMyAgICAgIDB4MEJEMzBCRDAKKy8qCisgKiBBbGwgTE9WIEVBIG1hZ2ljcyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBwb3N0Zml4LCBpZiBzb21lIG5ldyB2ZXJzaW9uCisgKiBMdXN0cmUgaW5zdHJvZHVjZXMgbmV3IExPViBFQSBtYWdpYywgdGhlbiB3aGVuIGRvd24tZ3JhZGUgdG8gYW4gb2xkCisgKiBMdXN0cmUsIGV2ZW4gdGhvdWdoIHRoZSBvbGQgdmVyc2lvbiBzeXN0ZW0gZG9lcyBub3QgcmVjb2duaXplcyBzdWNoCisgKiBuZXcgbWFnaWMsIGl0IHN0aWxsIGNhbiBkaXN0aW5ndWlzaCB0aGUgY29ycnVwdGVkIGNhc2VzIGJ5IGNoZWNraW5nCisgKiB0aGUgbWFnaWMncyBwb3N0Zml4LgorICovCisjZGVmaW5lIExPVl9NQUdJQ19NQUdJQyAweDBCRDAKKyNkZWZpbmUgTE9WX01BR0lDX01BU0sgIDB4RkZGRgorCisjZGVmaW5lIExPVl9NQUdJQ19WMQkJKDB4MEJEMTAwMDAgfCBMT1ZfTUFHSUNfTUFHSUMpCisjZGVmaW5lIExPVl9NQUdJQ19KT0lOX1YxCSgweDBCRDIwMDAwIHwgTE9WX01BR0lDX01BR0lDKQorI2RlZmluZSBMT1ZfTUFHSUNfVjMJCSgweDBCRDMwMDAwIHwgTE9WX01BR0lDX01BR0lDKQorI2RlZmluZSBMT1ZfTUFHSUNfTUlHUkFURQkoMHgwQkQ0MDAwMCB8IExPVl9NQUdJQ19NQUdJQykKKy8qIHJlc2VydmVkIGZvciBzcGVjaWZ5aW5nIE9TVHMgKi8KKyNkZWZpbmUgTE9WX01BR0lDX1NQRUNJRklDCSgweDBCRDUwMDAwIHwgTE9WX01BR0lDX01BR0lDKQorI2RlZmluZSBMT1ZfTUFHSUMJCUxPVl9NQUdJQ19WMQogCiAvKgogICogbWFnaWMgZm9yIGZ1bGx5IGRlZmluZWQgc3RyaXBpbmcKQEAgLTE0OTgsMTQgKzE0OTMsNiBAQAogI2RlZmluZSBMT1ZfTUFHSUNfVjFfREVGICAweDBDRDEwQkQwCiAjZGVmaW5lIExPVl9NQUdJQ19WM19ERUYgIDB4MENEMzBCRDAKIAotI2RlZmluZSBMT1ZfUEFUVEVSTl9SQUlEMAkweDAwMSAgIC8qIHN0cmlwZXMgYXJlIHVzZWQgcm91bmQtcm9iaW4gKi8KLSNkZWZpbmUgTE9WX1BBVFRFUk5fUkFJRDEJMHgwMDIgICAvKiBzdHJpcGVzIGFyZSBtaXJyb3JzIG9mIGVhY2ggb3RoZXIgKi8KLSNkZWZpbmUgTE9WX1BBVFRFUk5fRklSU1QJMHgxMDAgICAvKiBmaXJzdCBzdHJpcGUgaXMgbm90IGluIHJvdW5kLXJvYmluICovCi0jZGVmaW5lIExPVl9QQVRURVJOX0NNT0JECTB4MjAwCi0KLSNkZWZpbmUgTE9WX1BBVFRFUk5fRl9NQVNLCTB4ZmZmZjAwMDAKLSNkZWZpbmUgTE9WX1BBVFRFUk5fRl9SRUxFQVNFRAkweDgwMDAwMDAwIC8qIEhTTSByZWxlYXNlZCBmaWxlICovCi0KICNkZWZpbmUgbG92X3BhdHRlcm4ocGF0dGVybikJCShwYXR0ZXJuICYgfkxPVl9QQVRURVJOX0ZfTUFTSykKICNkZWZpbmUgbG92X3BhdHRlcm5fZmxhZ3MocGF0dGVybikJKHBhdHRlcm4gJiBMT1ZfUEFUVEVSTl9GX01BU0spCiAKQEAgLTE1NjksMjUgKzE1NTYsMjUgQEAKIAlvaS0+b2kub2lfaWQgPSBvaWQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgX191NjQgbG1tX29pX2lkKHN0cnVjdCBvc3RfaWQgKm9pKQorc3RhdGljIGlubGluZSBfX3U2NCBsbW1fb2lfaWQoY29uc3Qgc3RydWN0IG9zdF9pZCAqb2kpCiB7CiAJcmV0dXJuIG9pLT5vaS5vaV9pZDsKIH0KIAotc3RhdGljIGlubGluZSBfX3U2NCBsbW1fb2lfc2VxKHN0cnVjdCBvc3RfaWQgKm9pKQorc3RhdGljIGlubGluZSBfX3U2NCBsbW1fb2lfc2VxKGNvbnN0IHN0cnVjdCBvc3RfaWQgKm9pKQogewogCXJldHVybiBvaS0+b2kub2lfc2VxOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbG1tX29pX2xlX3RvX2NwdShzdHJ1Y3Qgb3N0X2lkICpkc3Rfb2ksCi0JCQkJICAgIHN0cnVjdCBvc3RfaWQgKnNyY19vaSkKKwkJCQkgICAgY29uc3Qgc3RydWN0IG9zdF9pZCAqc3JjX29pKQogewogCWRzdF9vaS0+b2kub2lfaWQgPSBsZTY0X3RvX2NwdShzcmNfb2ktPm9pLm9pX2lkKTsKIAlkc3Rfb2ktPm9pLm9pX3NlcSA9IGxlNjRfdG9fY3B1KHNyY19vaS0+b2kub2lfc2VxKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGxtbV9vaV9jcHVfdG9fbGUoc3RydWN0IG9zdF9pZCAqZHN0X29pLAotCQkJCSAgICBzdHJ1Y3Qgb3N0X2lkICpzcmNfb2kpCisJCQkJICAgIGNvbnN0IHN0cnVjdCBvc3RfaWQgKnNyY19vaSkKIHsKIAlkc3Rfb2ktPm9pLm9pX2lkID0gY3B1X3RvX2xlNjQoc3JjX29pLT5vaS5vaV9pZCk7CiAJZHN0X29pLT5vaS5vaV9zZXEgPSBjcHVfdG9fbGU2NChzcmNfb2ktPm9pLm9pX3NlcSk7CkBAIC0xNjEwLDYgKzE1OTcsNyBAQAogI2RlZmluZSBYQVRUUl9OQU1FX0xPVgkgICJ0cnVzdGVkLmxvdiIKICNkZWZpbmUgWEFUVFJfTkFNRV9MTUEJICAidHJ1c3RlZC5sbWEiCiAjZGVmaW5lIFhBVFRSX05BTUVfTE1WCSAgInRydXN0ZWQubG12IgorI2RlZmluZSBYQVRUUl9OQU1FX0RFRkFVTFRfTE1WCSJ0cnVzdGVkLmRtdiIKICNkZWZpbmUgWEFUVFJfTkFNRV9MSU5LCSAidHJ1c3RlZC5saW5rIgogI2RlZmluZSBYQVRUUl9OQU1FX0ZJRAkgICJ0cnVzdGVkLmZpZCIKICNkZWZpbmUgWEFUVFJfTkFNRV9WRVJTSU9OICAgICAgInRydXN0ZWQudmVyc2lvbiIKQEAgLTE2MjUsNyArMTYxMyw3IEBACiAJLyogbG1tX3N0cmlwZV9jb3VudCB1c2VkIHRvIGJlIF9fdTMyICovCiAJX191MTYgbG1tX3N0cmlwZV9jb3VudDsgICAvKiBudW0gc3RyaXBlcyBpbiB1c2UgZm9yIHRoaXMgb2JqZWN0ICovCiAJX191MTYgbG1tX2xheW91dF9nZW47ICAgICAvKiBsYXlvdXQgZ2VuZXJhdGlvbiBudW1iZXIgKi8KLQljaGFyICBsbW1fcG9vbF9uYW1lW0xPVl9NQVhQT09MTkFNRV07IC8qIG11c3QgYmUgMzJiaXQgYWxpZ25lZCAqLworCWNoYXIgIGxtbV9wb29sX25hbWVbTE9WX01BWFBPT0xOQU1FICsgMV07IC8qIG11c3QgYmUgMzJiaXQgYWxpZ25lZCAqLwogCXN0cnVjdCBsb3Zfb3N0X2RhdGFfdjEgbG1tX29iamVjdHNbMF07IC8qIHBlci1zdHJpcGUgZGF0YSAqLwogfTsKIApAQCAtMTcyNyw2ICsxNzE1LDggQEAKICNkZWZpbmUgT0JEX01EX0ZMREFUQVZFUlNJT04gKDB4MDAxMDAwMDAwMDAwMDAwMFVMTCkgLyogaXZlcnNpb24gc3VtICovCiAjZGVmaW5lIE9CRF9NRF9GTFJFTEVBU0VEICAgICgweDAwMjAwMDAwMDAwMDAwMDBVTEwpIC8qIGZpbGUgcmVsZWFzZWQgKi8KIAorI2RlZmluZSBPQkRfTURfREVGQVVMVF9NRUEgICAoMHgwMDQwMDAwMDAwMDAwMDAwVUxMKSAvKiBkZWZhdWx0IE1FQSAqLworCiAjZGVmaW5lIE9CRF9NRF9GTEdFVEFUVFIgKE9CRF9NRF9GTElEICAgIHwgT0JEX01EX0ZMQVRJTUUgfCBPQkRfTURfRkxNVElNRSB8IFwKIAkJCSAgT0JEX01EX0ZMQ1RJTUUgfCBPQkRfTURfRkxTSVpFICB8IE9CRF9NRF9GTEJMS1NaIHwgXAogCQkJICBPQkRfTURfRkxNT0RFICB8IE9CRF9NRF9GTFRZUEUgIHwgT0JEX01EX0ZMVUlEICAgfCBcCkBAIC0xNzgyLDcgKzE3NzIsNyBAQAogCQkJCSAgICAgICogaXQgdG8gc3luYyBxdWlja2x5CiAJCQkJICAgICAgKi8KIAotI2RlZmluZSBPQkRfT0JKRUNUX0VPRiAweGZmZmZmZmZmZmZmZmZmZmZVTEwKKyNkZWZpbmUgT0JEX09CSkVDVF9FT0YJTFVTVFJFX0VPRgogCiAjZGVmaW5lIE9TVF9NSU5fUFJFQ1JFQVRFIDMyCiAjZGVmaW5lIE9TVF9NQVhfUFJFQ1JFQVRFIDIwMDAwCkBAIC0xODA2LDkgKzE3OTYsOSBAQAogCiAvKiBtdWx0aXBsZSBvZiA4IGJ5dGVzID0+IGNhbiBhcnJheSAqLwogc3RydWN0IG5pb2J1Zl9yZW1vdGUgewotCV9fdTY0IG9mZnNldDsKLQlfX3UzMiBsZW47Ci0JX191MzIgZmxhZ3M7CisJX191NjQJcm5iX29mZnNldDsKKwlfX3UzMglybmJfbGVuOworCV9fdTMyCXJuYl9mbGFnczsKIH07CiAKIHZvaWQgbHVzdHJlX3N3YWJfbmlvYnVmX3JlbW90ZShzdHJ1Y3QgbmlvYnVmX3JlbW90ZSAqbmJyKTsKQEAgLTE4NzgsMTIgKzE4NjgsNiBAQAogCiB2b2lkIGx1c3RyZV9zd2FiX29iZF9xdW90YWN0bChzdHJ1Y3Qgb2JkX3F1b3RhY3RsICpxKTsKIAotI2RlZmluZSBRX1FVT1RBQ0hFQ0sJMHg4MDAxMDAgLyogZGVwcmVjYXRlZCBhcyBvZiAyLjQgKi8KLSNkZWZpbmUgUV9JTklUUVVPVEEJMHg4MDAxMDEgLyogZGVwcmVjYXRlZCBhcyBvZiAyLjQgICovCi0jZGVmaW5lIFFfR0VUT0lORk8JMHg4MDAxMDIgLyogZ2V0IG9iZCBxdW90YSBpbmZvICovCi0jZGVmaW5lIFFfR0VUT1FVT1RBCTB4ODAwMTAzIC8qIGdldCBvYmQgcXVvdGFzICovCi0jZGVmaW5lIFFfRklOVkFMSURBVEUJMHg4MDAxMDQgLyogZGVwcmVjYXRlZCBhcyBvZiAyLjQgKi8KLQogI2RlZmluZSBRX0NPUFkob3V0LCBpbiwgbWVtYmVyKSAob3V0KS0+bWVtYmVyID0gKGluKS0+bWVtYmVyCiAKICNkZWZpbmUgUUNUTF9DT1BZKG91dCwgaW4pCQlcCkBAIC0xOTQ2LDggKzE5MzAsOCBAQAogCU1EU19ESVNDT05ORUNUCQk9IDM5LAogCU1EU19HRVRTVEFUVVMJCT0gNDAsCiAJTURTX1NUQVRGUwkJPSA0MSwKLQlNRFNfUElOCQkJPSA0MiwKLQlNRFNfVU5QSU4JCT0gNDMsCisJTURTX1BJTgkJCT0gNDIsIC8qIG9ic29sZXRlLCBuZXZlciB1c2VkIGluIGEgcmVsZWFzZSAqLworCU1EU19VTlBJTgkJPSA0MywgLyogb2Jzb2xldGUsIG5ldmVyIHVzZWQgaW4gYSByZWxlYXNlICovCiAJTURTX1NZTkMJCT0gNDQsCiAJTURTX0RPTkVfV1JJVElORwk9IDQ1LAogCU1EU19TRVRfSU5GTwkJPSA0NiwKQEAgLTE5NTYsNyArMTk0MCw3IEBACiAJTURTX0dFVFhBVFRSCQk9IDQ5LAogCU1EU19TRVRYQVRUUgkJPSA1MCwgLyogb2Jzb2xldGUsIG5vdyBpdCdzIE1EU19SRUlOVCBvcCAqLwogCU1EU19XUklURVBBR0UJCT0gNTEsCi0JTURTX0lTX1NVQkRJUgkJPSA1MiwKKwlNRFNfSVNfU1VCRElSCQk9IDUyLCAvKiBvYnNvbGV0ZSwgbmV2ZXIgdXNlZCBpbiBhIHJlbGVhc2UgKi8KIAlNRFNfR0VUX0lORk8JCT0gNTMsCiAJTURTX0hTTV9TVEFURV9HRVQJPSA1NCwKIAlNRFNfSFNNX1NUQVRFX1NFVAk9IDU1LApAQCAtMTk4NCw3ICsxOTY4LDcgQEAKIAlSRUlOVF9PUEVOICAgICA9IDYsCiAJUkVJTlRfU0VUWEFUVFIgPSA3LAogCVJFSU5UX1JNRU5UUlkgID0gOCwKLS8qICAgICAgUkVJTlRfV1JJVEUgICAgPSA5LCAqLworCVJFSU5UX01JR1JBVEUgID0gOSwKIAlSRUlOVF9NQVgKIH07CiAKQEAgLTIwMDMsNiArMTk4Nyw3IEBACiAjZGVmaW5lIERJU1BfT1BFTl9MT0NLICAgICAgIDB4MDIwMDAwMDAKICNkZWZpbmUgRElTUF9PUEVOX0xFQVNFICAgICAgMHgwNDAwMDAwMAogI2RlZmluZSBESVNQX09QRU5fU1RSSVBFICAgICAweDA4MDAwMDAwCisjZGVmaW5lIERJU1BfT1BFTl9ERU5ZCQkweDEwMDAwMDAwCiAKIC8qIElOT0RFIExPQ0sgUEFSVFMgKi8KICNkZWZpbmUgTURTX0lOT0RFTE9DS19MT09LVVAgMHgwMDAwMDEJLyogRm9yIG5hbWVzcGFjZSwgZGVudHJ5IGV0YywgYW5kIGFsc28KQEAgLTIwMjgsNyArMjAxMyw3IEBACiAKICNkZWZpbmUgTURTX0lOT0RFTE9DS19NQVhTSElGVCA1CiAvKiBUaGlzIEZVTEwgbG9jayBpcyB1c2VmdWwgdG8gdGFrZSBvbiB1bmxpbmsgc29ydCBvZiBvcGVyYXRpb25zICovCi0jZGVmaW5lIE1EU19JTk9ERUxPQ0tfRlVMTCAoKDE8PChNRFNfSU5PREVMT0NLX01BWFNISUZUKzEpKS0xKQorI2RlZmluZSBNRFNfSU5PREVMT0NLX0ZVTEwgKCgxIDw8IChNRFNfSU5PREVMT0NLX01BWFNISUZUICsgMSkpIC0gMSkKIAogLyogTk9URTogdW50aWwgTHVzdHJlIDEuOC43LzIuMS4xIHRoZSBmaWRfdmVyKCkgd2FzIHBhY2tlZCBpbnRvIG5hbWVbMl0sCiAgKiBidXQgd2FzIG1vdmVkIGludG8gbmFtZVsxXSBhbG9uZyB3aXRoIHRoZSBPSUQgdG8gYXZvaWQgY29uc3VtaW5nIHRoZQpAQCAtMjEwOCw0MyArMjA5Myw0MyBAQAogfTsKIAogc3RydWN0IG1kdF9ib2R5IHsKLQlzdHJ1Y3QgbHVfZmlkICBmaWQxOwotCXN0cnVjdCBsdV9maWQgIGZpZDI7Ci0Jc3RydWN0IGx1c3RyZV9oYW5kbGUgaGFuZGxlOwotCV9fdTY0CSAgdmFsaWQ7Ci0JX191NjQJICBzaXplOyAgIC8qIE9mZnNldCwgaW4gdGhlIGNhc2Ugb2YgTURTX1JFQURQQUdFICovCi0JX19zNjQJICBtdGltZTsKLQlfX3M2NAkgIGF0aW1lOwotCV9fczY0CSAgY3RpbWU7Ci0JX191NjQJICBibG9ja3M7IC8qIFhJRCwgaW4gdGhlIGNhc2Ugb2YgTURTX1JFQURQQUdFICovCi0JX191NjQJICBpb2Vwb2NoOwotCV9fdTY0CSAgdF9zdGF0ZTsgLyogdHJhbnNpZW50IGZpbGUgc3RhdGUgZGVmaW5lZCBpbgotCQkJICAgICogZW51bSBtZF90cmFuc2llbnRfc3RhdGUKLQkJCSAgICAqIHdhcyAiaW5vIiB1bnRpbCAyLjQuMAotCQkJICAgICovCi0JX191MzIJICBmc3VpZDsKLQlfX3UzMgkgIGZzZ2lkOwotCV9fdTMyCSAgY2FwYWJpbGl0eTsKLQlfX3UzMgkgIG1vZGU7Ci0JX191MzIJICB1aWQ7Ci0JX191MzIJICBnaWQ7Ci0JX191MzIJICBmbGFnczsgLyogZnJvbSB2ZnMgZm9yIHBpbi91bnBpbiwgTFVTVFJFX0JGTEFHIGNsb3NlICovCi0JX191MzIJICByZGV2OwotCV9fdTMyCSAgbmxpbms7IC8qICNieXRlcyB0byByZWFkIGluIHRoZSBjYXNlIG9mIE1EU19SRUFEUEFHRSAqLwotCV9fdTMyCSAgdW51c2VkMjsgLyogd2FzICJnZW5lcmF0aW9uIiB1bnRpbCAyLjQuMCAqLwotCV9fdTMyCSAgc3VwcGdpZDsKLQlfX3UzMgkgIGVhZGF0YXNpemU7Ci0JX191MzIJICBhY2xzaXplOwotCV9fdTMyCSAgbWF4X21kc2l6ZTsKLQlfX3UzMgkgIG1heF9jb29raWVzaXplOwotCV9fdTMyCSAgdWlkX2g7IC8qIGhpZ2ggMzItYml0cyBvZiB1aWQsIGZvciBGVUlEICovCi0JX191MzIJICBnaWRfaDsgLyogaGlnaCAzMi1iaXRzIG9mIGdpZCwgZm9yIEZVSUQgKi8KLQlfX3UzMgkgIHBhZGRpbmdfNTsgLyogYWxzbyBmaXggbHVzdHJlX3N3YWJfbWR0X2JvZHkgKi8KLQlfX3U2NAkgIHBhZGRpbmdfNjsKLQlfX3U2NAkgIHBhZGRpbmdfNzsKLQlfX3U2NAkgIHBhZGRpbmdfODsKLQlfX3U2NAkgIHBhZGRpbmdfOTsKLQlfX3U2NAkgIHBhZGRpbmdfMTA7CisJc3RydWN0IGx1X2ZpZCBtYm9fZmlkMTsKKwlzdHJ1Y3QgbHVfZmlkIG1ib19maWQyOworCXN0cnVjdCBsdXN0cmVfaGFuZGxlIG1ib19oYW5kbGU7CisJX191NjQJbWJvX3ZhbGlkOworCV9fdTY0CW1ib19zaXplOwkvKiBPZmZzZXQsIGluIHRoZSBjYXNlIG9mIE1EU19SRUFEUEFHRSAqLworCV9fczY0CW1ib19tdGltZTsKKwlfX3M2NAltYm9fYXRpbWU7CisJX19zNjQJbWJvX2N0aW1lOworCV9fdTY0CW1ib19ibG9ja3M7CS8qIFhJRCwgaW4gdGhlIGNhc2Ugb2YgTURTX1JFQURQQUdFICovCisJX191NjQJbWJvX2lvZXBvY2g7CisJX191NjQJbWJvX3Rfc3RhdGU7CS8qIHRyYW5zaWVudCBmaWxlIHN0YXRlIGRlZmluZWQgaW4KKwkJCQkgKiBlbnVtIG1kX3RyYW5zaWVudF9zdGF0ZQorCQkJCSAqIHdhcyAiaW5vIiB1bnRpbCAyLjQuMAorCQkJCSAqLworCV9fdTMyCW1ib19mc3VpZDsKKwlfX3UzMgltYm9fZnNnaWQ7CisJX191MzIJbWJvX2NhcGFiaWxpdHk7CisJX191MzIJbWJvX21vZGU7CisJX191MzIJbWJvX3VpZDsKKwlfX3UzMgltYm9fZ2lkOworCV9fdTMyCW1ib19mbGFnczsKKwlfX3UzMgltYm9fcmRldjsKKwlfX3UzMgltYm9fbmxpbms7CS8qICNieXRlcyB0byByZWFkIGluIHRoZSBjYXNlIG9mIE1EU19SRUFEUEFHRSAqLworCV9fdTMyCW1ib191bnVzZWQyOwkvKiB3YXMgImdlbmVyYXRpb24iIHVudGlsIDIuNC4wICovCisJX191MzIJbWJvX3N1cHBnaWQ7CisJX191MzIJbWJvX2VhZGF0YXNpemU7CisJX191MzIJbWJvX2FjbHNpemU7CisJX191MzIJbWJvX21heF9tZHNpemU7CisJX191MzIJbWJvX21heF9jb29raWVzaXplOworCV9fdTMyCW1ib191aWRfaDsJLyogaGlnaCAzMi1iaXRzIG9mIHVpZCwgZm9yIEZVSUQgKi8KKwlfX3UzMgltYm9fZ2lkX2g7CS8qIGhpZ2ggMzItYml0cyBvZiBnaWQsIGZvciBGVUlEICovCisJX191MzIJbWJvX3BhZGRpbmdfNTsJLyogYWxzbyBmaXggbHVzdHJlX3N3YWJfbWR0X2JvZHkgKi8KKwlfX3U2NAltYm9fcGFkZGluZ182OworCV9fdTY0CW1ib19wYWRkaW5nXzc7CisJX191NjQJbWJvX3BhZGRpbmdfODsKKwlfX3U2NAltYm9fcGFkZGluZ185OworCV9fdTY0CW1ib19wYWRkaW5nXzEwOwogfTsgLyogMjE2ICovCiAKIHZvaWQgbHVzdHJlX3N3YWJfbWR0X2JvZHkoc3RydWN0IG1kdF9ib2R5ICpiKTsKQEAgLTIyNjMsNiArMjI0OCwxMSBAQAogCQkJCQkgICAgICAqLwogI2RlZmluZSBNRFNfT1BFTl9SRUxFQVNFICAgMDIwMDAwMDAwMDAwMDBVTEwgLyogT3BlbiB0aGUgZmlsZSBmb3IgSFNNIHJlbGVhc2UgKi8KIAorI2RlZmluZSBNRFNfT1BFTl9GTF9JTlRFUk5BTCAoTURTX09QRU5fSEFTX0VBIHwgTURTX09QRU5fSEFTX09CSlMgfAlcCisJCQkgICAgICBNRFNfT1BFTl9PV05FUk9WRVJSSURFIHwgTURTX09QRU5fTE9DSyB8CVwKKwkJCSAgICAgIE1EU19PUEVOX0JZX0ZJRCB8IE1EU19PUEVOX0xFQVNFIHwJXAorCQkJICAgICAgTURTX09QRU5fUkVMRUFTRSkKKwogZW51bSBtZHNfb3BfYmlhcyB7CiAJTURTX0NIRUNLX1NQTElUCQk9IDEgPDwgMCwKIAlNRFNfQ1JPU1NfUkVGCQk9IDEgPDwgMSwKQEAgLTIyNzcsNiArMjI2Nyw3IEBACiAJTURTX0NSRUFURV9WT0xBVElMRQk9IDEgPDwgMTAsCiAJTURTX09XTkVST1ZFUlJJREUJPSAxIDw8IDExLAogCU1EU19IU01fUkVMRUFTRQkJPSAxIDw8IDEyLAorCU1EU19SRU5BTUVfTUlHUkFURQk9IEJJVCgxMyksCiB9OwogCiAvKiBpbnN0YW5jZSBvZiBtZHRfcmVpbnRfcmVjICovCkBAIC0yNDcyLDcgKzI0NjMsNyBAQAogCV9fdTMyIGxkX3RndF9jb3VudDsJCS8qIGhvdyBtYW55IE1EUydzICovCiAJX191MzIgbGRfYWN0aXZlX3RndF9jb3VudDsJIC8qIGhvdyBtYW55IGFjdGl2ZSAqLwogCV9fdTMyIGxkX2RlZmF1bHRfc3RyaXBlX2NvdW50OyAgICAgLyogaG93IG1hbnkgb2JqZWN0cyBhcmUgdXNlZCAqLwotCV9fdTMyIGxkX3BhdHRlcm47CQkgIC8qIGRlZmF1bHQgTUVBX01BR0lDXyogKi8KKwlfX3UzMiBsZF9wYXR0ZXJuOwkJICAvKiBkZWZhdWx0IGhhc2ggcGF0dGVybiAqLwogCV9fdTY0IGxkX2RlZmF1bHRfaGFzaF9zaXplOwogCV9fdTY0IGxkX3BhZGRpbmdfMTsJCS8qIGFsc28gZml4IGx1c3RyZV9zd2FiX2xtdl9kZXNjICovCiAJX191MzIgbGRfcGFkZGluZ18yOwkJLyogYWxzbyBmaXggbHVzdHJlX3N3YWJfbG12X2Rlc2MgKi8KQEAgLTI0ODIsMjMgKzI0NzMsMTI5IEBACiAJc3RydWN0IG9iZF91dWlkIGxkX3V1aWQ7CiB9OwogCi0vKiBUT0RPOiBsbXZfc3RyaXBlX21kIHNob3VsZCBjb250YWluIG1kcyBjYXBhYmlsaXRpZXMgZm9yIGFsbCBzbGF2ZSBmaWRzICovCi1zdHJ1Y3QgbG12X3N0cmlwZV9tZCB7Ci0JX191MzIJIG1lYV9tYWdpYzsKLQlfX3UzMgkgbWVhX2NvdW50OwotCV9fdTMyCSBtZWFfbWFzdGVyOwotCV9fdTMyCSBtZWFfcGFkZGluZzsKLQljaGFyCSAgbWVhX3Bvb2xfbmFtZVtMT1ZfTUFYUE9PTE5BTUVdOwotCXN0cnVjdCBsdV9maWQgbWVhX2lkc1swXTsKKy8qIExNViBsYXlvdXQgRUEsIGFuZCBpdCB3aWxsIGJlIHN0b3JlZCBib3RoIGluIG1hc3RlciBhbmQgc2xhdmUgb2JqZWN0ICovCitzdHJ1Y3QgbG12X21kc19tZF92MSB7CisJX191MzIgbG12X21hZ2ljOworCV9fdTMyIGxtdl9zdHJpcGVfY291bnQ7CisJX191MzIgbG12X21hc3Rlcl9tZHRfaW5kZXg7CS8qIE9uIG1hc3RlciBvYmplY3QsIGl0IGlzIG1hc3RlcgorCQkJCQkgKiBNRFQgaW5kZXgsIG9uIHNsYXZlIG9iamVjdCwgaXQKKwkJCQkJICogaXMgc3RyaXBlIGluZGV4IG9mIHRoZSBzbGF2ZSBvYmoKKwkJCQkJICovCisJX191MzIgbG12X2hhc2hfdHlwZTsJCS8qIGRpciBzdHJpcGUgcG9saWN5LCBpLmUuIGluZGljYXRlCisJCQkJCSAqIHdoaWNoIGhhc2ggZnVuY3Rpb24gdG8gYmUgdXNlZCwKKwkJCQkJICogTm90ZTogb25seSBsb3dlciAxNiBiaXRzIGlzIGJlaW5nCisJCQkJCSAqIHVzZWQgZm9yIG5vdy4gSGlnaGVyIDE2IGJpdHMgd2lsbAorCQkJCQkgKiBiZSB1c2VkIHRvIG1hcmsgdGhlIG9iamVjdCBzdGF0dXMsCisJCQkJCSAqIGZvciBleGFtcGxlIG1pZ3JhdGluZyBvciBkZWFkLgorCQkJCQkgKi8KKwlfX3UzMiBsbXZfbGF5b3V0X3ZlcnNpb247CS8qIFVzZWQgZm9yIGRpcmVjdG9yeSByZXN0cmlwaW5nICovCisJX191MzIgbG12X3BhZGRpbmcxOworCV9fdTY0IGxtdl9wYWRkaW5nMjsKKwlfX3U2NCBsbXZfcGFkZGluZzM7CisJY2hhciBsbXZfcG9vbF9uYW1lW0xPVl9NQVhQT09MTkFNRSArIDFdOy8qIHBvb2wgbmFtZSAqLworCXN0cnVjdCBsdV9maWQgbG12X3N0cmlwZV9maWRzWzBdOwkvKiBGSURzIGZvciBlYWNoIHN0cmlwZSAqLwogfTsKIAotI2RlZmluZSBNRUFfTUFHSUNfTEFTVF9DSEFSICAgICAgMHhiMjIyMWNhMQotI2RlZmluZSBNRUFfTUFHSUNfQUxMX0NIQVJTICAgICAgMHhiMjIyYTExYwotI2RlZmluZSBNRUFfTUFHSUNfSEFTSF9TRUdNRU5UICAgMHhiMjIyYTExYgorI2RlZmluZSBMTVZfTUFHSUNfVjEJIDB4MENEMjBDRDAJLyogbm9ybWFsIHN0cmlwZSBsbXYgbWFnaWMgKi8KKyNkZWZpbmUgTE1WX01BR0lDCSBMTVZfTUFHSUNfVjEKIAotI2RlZmluZSBNQVhfSEFTSF9TSVpFXzMyCSAweDdmZmZmZmZmVUwKLSNkZWZpbmUgTUFYX0hBU0hfU0laRQkgICAgMHg3ZmZmZmZmZmZmZmZmZmZmVUxMCi0jZGVmaW5lIE1BWF9IQVNIX0hJR0hFU1RfQklUICAgICAweDEwMDAwMDAwMDAwMDAwMDBVTEwKKy8qICNkZWZpbmUgTE1WX1VTRVJfTUFHSUMgMHgwQ0QzMENEMCAqLworI2RlZmluZSBMTVZfTUFHSUNfU1RSSVBFIDB4MENENDBDRDAJLyogbWFnaWMgZm9yIGRpciBzdWJfc3RyaXBlICovCisKKy8qCisgKlJpZ2h0IG5vdyBvbmx5IHRoZSBsb3dlciBwYXJ0KDAtMTZiaXRzKSBvZiBsbXZfaGFzaF90eXBlIGlzIGJlaW5nIHVzZWQsCisgKiBhbmQgdGhlIGhpZ2hlciBwYXJ0IHdpbGwgYmUgdGhlIGZsYWcgdG8gaW5kaWNhdGUgdGhlIHN0YXR1cyBvZiBvYmplY3QsCisgKiBmb3IgZXhhbXBsZSB0aGUgb2JqZWN0IGlzIGJlaW5nIG1pZ3JhdGVkLiBBbmQgdGhlIGhhc2ggZnVuY3Rpb24KKyAqIG1pZ2h0IGJlIGludGVycHJldGVkIGRpZmZlcmVudGx5IHdpdGggZGlmZmVyZW50IGZsYWdzLgorICovCisjZGVmaW5lIExNVl9IQVNIX1RZUEVfTUFTSwkJMHgwMDAwZmZmZgorCisjZGVmaW5lIExNVl9IQVNIX0ZMQUdfTUlHUkFUSU9OCQkweDgwMDAwMDAwCisjZGVmaW5lIExNVl9IQVNIX0ZMQUdfREVBRAkJMHg0MDAwMDAwMAorCisvKioKKyAqIFRoZSBGTlYtMWEgaGFzaCBhbGdvcml0aG0gaXMgYXMgZm9sbG93czoKKyAqICAgICBoYXNoID0gRk5WX29mZnNldF9iYXNpcworICogICAgIGZvciBlYWNoIG9jdGV0X29mX2RhdGEgdG8gYmUgaGFzaGVkCisgKiAgICAgICAgICAgICBoYXNoID0gaGFzaCBYT1Igb2N0ZXRfb2ZfZGF0YQorICogICAgICAgICAgICAgaGFzaCA9IGhhc2ggw5cgRk5WX3ByaW1lCisgKiAgICAgcmV0dXJuIGhhc2gKKyAqIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRm93bGVy4oCTTm9sbOKAk1ZvX2hhc2hfZnVuY3Rpb24jRk5WLTFhX2hhc2gKKyAqCisgKiBodHRwOi8vd3d3LmlzdGhlLmNvbS9jaG9uZ28vdGVjaC9jb21wL2Zudi9pbmRleC5odG1sI0ZOVi1yZWZlcmVuY2Utc291cmNlCisgKiBGTlZfcHJpbWUgaXMgMl40MCArIDJeOCArIDB4YjMgPSAweDEwMDAwMDAwMWIzVUxMCisgKiovCisjZGVmaW5lIExVU1RSRV9GTlZfMUFfNjRfUFJJTUUJCTB4MTAwMDAwMDAxYjNVTEwKKyNkZWZpbmUgTFVTVFJFX0ZOVl8xQV82NF9PRkZTRVRfQklBUwkweGNiZjI5Y2U0ODQyMjIzMjVVTEwKK3N0YXRpYyBpbmxpbmUgX191NjQgbHVzdHJlX2hhc2hfZm52XzFhXzY0KGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJX191NjQgaGFzaCA9IExVU1RSRV9GTlZfMUFfNjRfT0ZGU0VUX0JJQVM7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcCA9IGJ1ZjsKKwlzaXplX3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJaGFzaCBePSBwW2ldOworCQloYXNoICo9IExVU1RSRV9GTlZfMUFfNjRfUFJJTUU7CisJfQorCisJcmV0dXJuIGhhc2g7Cit9CisKK3VuaW9uIGxtdl9tZHNfbWQgeworCV9fdTMyCQkJbG12X21hZ2ljOworCXN0cnVjdCBsbXZfbWRzX21kX3YxCWxtdl9tZF92MTsKKwlzdHJ1Y3QgbG12X3VzZXJfbWQJbG12X3VzZXJfbWQ7Cit9OworCit2b2lkIGx1c3RyZV9zd2FiX2xtdl9tZHNfbWQodW5pb24gbG12X21kc19tZCAqbG1tKTsKKworc3RhdGljIGlubGluZSBzc2l6ZV90IGxtdl9tZHNfbWRfc2l6ZShpbnQgc3RyaXBlX2NvdW50LCB1bnNpZ25lZCBpbnQgbG1tX21hZ2ljKQoreworCXNzaXplX3QgbGVuID0gLUVJTlZBTDsKKworCXN3aXRjaCAobG1tX21hZ2ljKSB7CisJY2FzZSBMTVZfTUFHSUNfVjE6IHsKKwkJc3RydWN0IGxtdl9tZHNfbWRfdjEgKmxtbTE7CisKKwkJbGVuID0gc2l6ZW9mKCpsbW0xKTsKKwkJbGVuICs9IHN0cmlwZV9jb3VudCAqIHNpemVvZihsbW0xLT5sbXZfc3RyaXBlX2ZpZHNbMF0pOworCQlicmVhazsgfQorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW5saW5lIGludCBsbXZfbWRzX21kX3N0cmlwZV9jb3VudF9nZXQoY29uc3QgdW5pb24gbG12X21kc19tZCAqbG1tKQoreworCXN3aXRjaCAobGUzMl90b19jcHUobG1tLT5sbXZfbWFnaWMpKSB7CisJY2FzZSBMTVZfTUFHSUNfVjE6CisJCXJldHVybiBsZTMyX3RvX2NwdShsbW0tPmxtdl9tZF92MS5sbXZfc3RyaXBlX2NvdW50KTsKKwljYXNlIExNVl9VU0VSX01BR0lDOgorCQlyZXR1cm4gbGUzMl90b19jcHUobG1tLT5sbXZfdXNlcl9tZC5sdW1fc3RyaXBlX2NvdW50KTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxtdl9tZHNfbWRfc3RyaXBlX2NvdW50X3NldCh1bmlvbiBsbXZfbWRzX21kICpsbW0sCisJCQkJCSAgICAgIHVuc2lnbmVkIGludCBzdHJpcGVfY291bnQpCit7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAobGUzMl90b19jcHUobG1tLT5sbXZfbWFnaWMpKSB7CisJY2FzZSBMTVZfTUFHSUNfVjE6CisJCWxtbS0+bG12X21kX3YxLmxtdl9zdHJpcGVfY291bnQgPSBjcHVfdG9fbGUzMihzdHJpcGVfY291bnQpOworCQlicmVhazsKKwljYXNlIExNVl9VU0VSX01BR0lDOgorCQlsbW0tPmxtdl91c2VyX21kLmx1bV9zdHJpcGVfY291bnQgPSBjcHVfdG9fbGUzMihzdHJpcGVfY291bnQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyYyA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7Cit9CiAKIGVudW0gZmxkX3JwY19vcGMgewogCUZMRF9RVUVSWQk9IDkwMCwKQEAgLTI1ODIsOCArMjY3OSw4IEBACiAjZGVmaW5lIFBMRExNUkVTKHJlcykJKHJlcyktPmxyX25hbWUubmFtZVswXSwgKHJlcyktPmxyX25hbWUubmFtZVsxXSwgXAogCQkJKHJlcyktPmxyX25hbWUubmFtZVsyXSwgKHJlcyktPmxyX25hbWUubmFtZVszXQogCi1zdGF0aWMgaW5saW5lIGludCBsZGxtX3Jlc19lcShjb25zdCBzdHJ1Y3QgbGRsbV9yZXNfaWQgKnJlczAsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgbGRsbV9yZXNfaWQgKnJlczEpCitzdGF0aWMgaW5saW5lIGJvb2wgbGRsbV9yZXNfZXEoY29uc3Qgc3RydWN0IGxkbG1fcmVzX2lkICpyZXMwLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBsZGxtX3Jlc19pZCAqcmVzMSkKIHsKIAlyZXR1cm4gIW1lbWNtcChyZXMwLCByZXMxLCBzaXplb2YoKnJlczApKTsKIH0KQEAgLTI2MjAsMTcgKzI3MTcsMTUgQEAKIAlfX3U2NCBnaWQ7CiB9OwogCi0jZGVmaW5lIExETE1fR0lEX0FOWSAoKF9fdTY0KS0xKQotCi1zdGF0aWMgaW5saW5lIGludCBsZGxtX2V4dGVudF9vdmVybGFwKHN0cnVjdCBsZGxtX2V4dGVudCAqZXgxLAotCQkJCSAgICAgIHN0cnVjdCBsZGxtX2V4dGVudCAqZXgyKQorc3RhdGljIGlubGluZSBpbnQgbGRsbV9leHRlbnRfb3ZlcmxhcChjb25zdCBzdHJ1Y3QgbGRsbV9leHRlbnQgKmV4MSwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbGRsbV9leHRlbnQgKmV4MikKIHsKIAlyZXR1cm4gKGV4MS0+c3RhcnQgPD0gZXgyLT5lbmQpICYmIChleDItPnN0YXJ0IDw9IGV4MS0+ZW5kKTsKIH0KIAogLyogY2hlY2sgaWYgQGV4MSBjb250YWlucyBAZXgyICovCi1zdGF0aWMgaW5saW5lIGludCBsZGxtX2V4dGVudF9jb250YWluKHN0cnVjdCBsZGxtX2V4dGVudCAqZXgxLAotCQkJCSAgICAgIHN0cnVjdCBsZGxtX2V4dGVudCAqZXgyKQorc3RhdGljIGlubGluZSBpbnQgbGRsbV9leHRlbnRfY29udGFpbihjb25zdCBzdHJ1Y3QgbGRsbV9leHRlbnQgKmV4MSwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbGRsbV9leHRlbnQgKmV4MikKIHsKIAlyZXR1cm4gKGV4MS0+c3RhcnQgPD0gZXgyLT5zdGFydCkgJiYgKGV4MS0+ZW5kID49IGV4Mi0+ZW5kKTsKIH0KQEAgLTI4MzMsNyArMjkyOCwyOSBAQAogfTsKICNkZWZpbmUgT0JEX0ZJUlNUX09QQyBPQkRfUElORwogCi0vKiBjYXRhbG9nIG9mIGxvZyBvYmplY3RzICovCisvKioKKyAqIGxsb2cgY29udGV4dHMgaW5kaWNlcy4KKyAqCisgKiBUaGVyZSBpcyBjb21wYXRpYmlsaXR5IHByb2JsZW0gd2l0aCBpbmRleGVzIGJlbG93LCB0aGV5IGFyZSBub3QKKyAqIGNvbnRpbnVvdXMgYW5kIG11c3Qga2VlcCB0aGVpciBudW1iZXJzIGZvciBjb21wYXRpYmlsaXR5IG5lZWRzLgorICogU2VlIExVLTUyMTggZm9yIGRldGFpbHMuCisgKi8KK2VudW0gbGxvZ19jdHh0X2lkIHsKKwlMTE9HX0NPTkZJR19PUklHX0NUWFQgID0gIDAsCisJTExPR19DT05GSUdfUkVQTF9DVFhUID0gMSwKKwlMTE9HX01EU19PU1RfT1JJR19DVFhUID0gMiwKKwlMTE9HX01EU19PU1RfUkVQTF9DVFhUID0gMywgLyoga2VwdCBqdXN0IHRvIGF2b2lkIHJlLWFzc2lnbm1lbnQgKi8KKwlMTE9HX1NJWkVfT1JJR19DVFhUID0gNCwKKwlMTE9HX1NJWkVfUkVQTF9DVFhUID0gNSwKKwlMTE9HX1RFU1RfT1JJR19DVFhUID0gOCwKKwlMTE9HX1RFU1RfUkVQTF9DVFhUID0gOSwgLyoga2VwdCBqdXN0IHRvIGF2b2lkIHJlLWFzc2lnbm1lbnQgKi8KKwlMTE9HX0NIQU5HRUxPR19PUklHX0NUWFQgPSAxMiwgLyoqPCBjaGFuZ2Vsb2cgZ2VuZXJhdGlvbiBvbiBtZGQgKi8KKwlMTE9HX0NIQU5HRUxPR19SRVBMX0NUWFQgPSAxMywgLyoqPCBjaGFuZ2Vsb2cgYWNjZXNzIG9uIGNsaWVudHMgKi8KKwkvKiBmb3IgbXVsdGlwbGUgY2hhbmdlbG9nIGNvbnN1bWVycyAqLworCUxMT0dfQ0hBTkdFTE9HX1VTRVJfT1JJR19DVFhUID0gMTQsCisJTExPR19BR0VOVF9PUklHX0NUWFQgPSAxNSwgLyoqPCBhZ2VudCByZXF1ZXN0cyBnZW5lcmF0aW9uIG9uIGNkdCAqLworCUxMT0dfTUFYX0NUWFRTCit9OwogCiAvKiogSWRlbnRpZmllciBmb3IgYSBzaW5nbGUgbG9nIG9iamVjdCAqLwogc3RydWN0IGxsb2dfbG9naWQgewpAQCAtMjkzOSw3ICszMDU2LDcgQEAKIAlfX3UzMgkJCWxzcl91aWRfaDsKIAlfX3UzMgkJCWxzcl9naWQ7CiAJX191MzIJCQlsc3JfZ2lkX2g7Ci0JX191NjQJCQlsc3JfcGFkZGluZzsKKwlfX3U2NAkJCWxzcl92YWxpZDsKIAlzdHJ1Y3QgbGxvZ19yZWNfdGFpbCAgICBsc3JfdGFpbDsKIH0gX19wYWNrZWQ7CiAKQEAgLTI5NjMsMTUgKzMwODAsOSBAQAogCiAvKiogY2hhbmdlbG9nIHJlY29yZCAqLwogc3RydWN0IGxsb2dfY2hhbmdlbG9nX3JlYyB7Ci0Jc3RydWN0IGxsb2dfcmVjX2hkciAgY3JfaGRyOwotCXN0cnVjdCBjaGFuZ2Vsb2dfcmVjIGNyOwotCXN0cnVjdCBsbG9nX3JlY190YWlsIGNyX3RhaWw7IC8qKjwgZm9yX3NpemV6b2Zfb25seSAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGxsb2dfY2hhbmdlbG9nX2V4dF9yZWMgewotCXN0cnVjdCBsbG9nX3JlY19oZHIgICAgICBjcl9oZHI7Ci0Jc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjIGNyOwotCXN0cnVjdCBsbG9nX3JlY190YWlsICAgICBjcl90YWlsOyAvKio8IGZvcl9zaXplem9mX29ubHkgKi8KKwlzdHJ1Y3QgbGxvZ19yZWNfaGRyCWNyX2hkcjsKKwlzdHJ1Y3QgY2hhbmdlbG9nX3JlYwljcjsJCS8qKjwgVmFyaWFibGUgbGVuZ3RoIGZpZWxkICovCisJc3RydWN0IGxsb2dfcmVjX3RhaWwJY3JfZG9fbm90X3VzZTsJLyoqPCBmb3Jfc2l6ZXpvZl9vbmx5ICovCiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbGxvZ19jaGFuZ2Vsb2dfdXNlcl9yZWMgewpAQCAtMjk5MCw3ICszMTAxLDcgQEAKIAlBUlNfU1VDQ0VFRCwKIH07CiAKLXN0YXRpYyBpbmxpbmUgY2hhciAqYWdlbnRfcmVxX3N0YXR1czJuYW1lKGVudW0gYWdlbnRfcmVxX3N0YXR1cyBhcnMpCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmFnZW50X3JlcV9zdGF0dXMybmFtZShjb25zdCBlbnVtIGFnZW50X3JlcV9zdGF0dXMgYXJzKQogewogCXN3aXRjaCAoYXJzKSB7CiAJY2FzZSBBUlNfV0FJVElORzoKQEAgLTMwNTYsNiArMzE2Nyw5IEBACiAJTExPR19GX1pBUF9XSEVOX0VNUFRZCT0gMHgxLAogCUxMT0dfRl9JU19DQVQJCT0gMHgyLAogCUxMT0dfRl9JU19QTEFJTgkJPSAweDQsCisJTExPR19GX0VYVF9KT0JJRCAgICAgICAgPSBCSVQoMyksCisKKwlMTE9HX0ZfRVhUX01BU0sgPSBMTE9HX0ZfRVhUX0pPQklELAogfTsKIAogc3RydWN0IGxsb2dfbG9nX2hkciB7CkBAIC0zMDY4LDggKzMxODIsOCBAQAogCV9fdTMyCQkgICBsbGhfY2F0X2lkeDsKIAkvKiBmb3IgYSBjYXRhbG9nIHRoZSBmaXJzdCBwbGFpbiBzbG90IGlzIG5leHQgdG8gaXQgKi8KIAlzdHJ1Y3Qgb2JkX3V1aWQJIGxsaF90Z3R1dWlkOwotCV9fdTMyCQkgICBsbGhfcmVzZXJ2ZWRbTExPR19IRUFERVJfU0laRS9zaXplb2YoX191MzIpIC0gMjNdOwotCV9fdTMyCQkgICBsbGhfYml0bWFwW0xMT0dfQklUTUFQX0JZVEVTL3NpemVvZihfX3UzMildOworCV9fdTMyCQkgICBsbGhfcmVzZXJ2ZWRbTExPR19IRUFERVJfU0laRSAvIHNpemVvZihfX3UzMikgLSAyM107CisJX191MzIJCSAgIGxsaF9iaXRtYXBbTExPR19CSVRNQVBfQllURVMgLyBzaXplb2YoX191MzIpXTsKIAlzdHJ1Y3QgbGxvZ19yZWNfdGFpbCAgICBsbGhfdGFpbDsKIH0gX19wYWNrZWQ7CiAKQEAgLTMxNjYsNyArMzI4MCw3IEBACiAjZGVmaW5lIG9fY2tzdW0gICBvX25saW5rCiAjZGVmaW5lIG9fZ3JhbnRfdXNlZCBvX2RhdGFfdmVyc2lvbgogCi1zdGF0aWMgaW5saW5lIHZvaWQgbHVzdHJlX3NldF93aXJlX29iZG8oc3RydWN0IG9iZF9jb25uZWN0X2RhdGEgKm9jZCwKK3N0YXRpYyBpbmxpbmUgdm9pZCBsdXN0cmVfc2V0X3dpcmVfb2Jkbyhjb25zdCBzdHJ1Y3Qgb2JkX2Nvbm5lY3RfZGF0YSAqb2NkLAogCQkJCQlzdHJ1Y3Qgb2JkbyAqd29iZG8sCiAJCQkJCWNvbnN0IHN0cnVjdCBvYmRvICpsb2JkbykKIHsKQEAgLTMxODUsNyArMzI5OSw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbHVzdHJlX2dldF93aXJlX29iZG8oc3RydWN0IG9iZF9jb25uZWN0X2RhdGEgKm9jZCwKK3N0YXRpYyBpbmxpbmUgdm9pZCBsdXN0cmVfZ2V0X3dpcmVfb2Jkbyhjb25zdCBzdHJ1Y3Qgb2JkX2Nvbm5lY3RfZGF0YSAqb2NkLAogCQkJCQlzdHJ1Y3Qgb2JkbyAqbG9iZG8sCiAJCQkJCWNvbnN0IHN0cnVjdCBvYmRvICp3b2JkbykKIHsKQEAgLTMyODQsMTcgKzMzOTgsMTcgQEAKIAogLyoqIGx1c3RyZV9jYXBhOjpsY19vcGMgKi8KIGVudW0gewotCUNBUEFfT1BDX0JPRFlfV1JJVEUgICA9IDE8PDAsICAvKio8IHdyaXRlIG9iamVjdCBkYXRhICovCi0JQ0FQQV9PUENfQk9EWV9SRUFEICAgID0gMTw8MSwgIC8qKjwgcmVhZCBvYmplY3QgZGF0YSAqLwotCUNBUEFfT1BDX0lOREVYX0xPT0tVUCA9IDE8PDIsICAvKio8IGxvb2t1cCBvYmplY3QgZmlkICovCi0JQ0FQQV9PUENfSU5ERVhfSU5TRVJUID0gMTw8MywgIC8qKjwgaW5zZXJ0IG9iamVjdCBmaWQgKi8KLQlDQVBBX09QQ19JTkRFWF9ERUxFVEUgPSAxPDw0LCAgLyoqPCBkZWxldGUgb2JqZWN0IGZpZCAqLwotCUNBUEFfT1BDX09TU19XUklURSAgICA9IDE8PDUsICAvKio8IHdyaXRlIG9zcyBvYmplY3QgZGF0YSAqLwotCUNBUEFfT1BDX09TU19SRUFEICAgICA9IDE8PDYsICAvKio8IHJlYWQgb3NzIG9iamVjdCBkYXRhICovCi0JQ0FQQV9PUENfT1NTX1RSVU5DICAgID0gMTw8NywgIC8qKjwgdHJ1bmNhdGUgb3NzIG9iamVjdCAqLwotCUNBUEFfT1BDX09TU19ERVNUUk9ZICA9IDE8PDgsICAvKio8IGRlc3Ryb3kgb3NzIG9iamVjdCAqLwotCUNBUEFfT1BDX01FVEFfV1JJVEUgICA9IDE8PDksICAvKio8IHdyaXRlIG9iamVjdCBtZXRhIGRhdGEgKi8KLQlDQVBBX09QQ19NRVRBX1JFQUQgICAgPSAxPDwxMCwgLyoqPCByZWFkIG9iamVjdCBtZXRhIGRhdGEgKi8KKwlDQVBBX09QQ19CT0RZX1dSSVRFICAgPSAxIDw8IDAsICAvKio8IHdyaXRlIG9iamVjdCBkYXRhICovCisJQ0FQQV9PUENfQk9EWV9SRUFEICAgID0gMSA8PCAxLCAgLyoqPCByZWFkIG9iamVjdCBkYXRhICovCisJQ0FQQV9PUENfSU5ERVhfTE9PS1VQID0gMSA8PCAyLCAgLyoqPCBsb29rdXAgb2JqZWN0IGZpZCAqLworCUNBUEFfT1BDX0lOREVYX0lOU0VSVCA9IDEgPDwgMywgIC8qKjwgaW5zZXJ0IG9iamVjdCBmaWQgKi8KKwlDQVBBX09QQ19JTkRFWF9ERUxFVEUgPSAxIDw8IDQsICAvKio8IGRlbGV0ZSBvYmplY3QgZmlkICovCisJQ0FQQV9PUENfT1NTX1dSSVRFICAgID0gMSA8PCA1LCAgLyoqPCB3cml0ZSBvc3Mgb2JqZWN0IGRhdGEgKi8KKwlDQVBBX09QQ19PU1NfUkVBRCAgICAgPSAxIDw8IDYsICAvKio8IHJlYWQgb3NzIG9iamVjdCBkYXRhICovCisJQ0FQQV9PUENfT1NTX1RSVU5DICAgID0gMSA8PCA3LCAgLyoqPCB0cnVuY2F0ZSBvc3Mgb2JqZWN0ICovCisJQ0FQQV9PUENfT1NTX0RFU1RST1kgID0gMSA8PCA4LCAgLyoqPCBkZXN0cm95IG9zcyBvYmplY3QgKi8KKwlDQVBBX09QQ19NRVRBX1dSSVRFICAgPSAxIDw8IDksICAvKio8IHdyaXRlIG9iamVjdCBtZXRhIGRhdGEgKi8KKwlDQVBBX09QQ19NRVRBX1JFQUQgICAgPSAxIDw8IDEwLCAvKio8IHJlYWQgb2JqZWN0IG1ldGEgZGF0YSAqLwogfTsKIAogI2RlZmluZSBDQVBBX09QQ19PU1NfUlcgKENBUEFfT1BDX09TU19SRUFEIHwgQ0FQQV9PUENfT1NTX1dSSVRFKQpAQCAtMzM0Niw2ICszNDYwLDE0IEBACiAKIHZvaWQgbHVzdHJlX3N3YWJfZmlkMnBhdGgoc3RydWN0IGdldGluZm9fZmlkMnBhdGggKmdmKTsKIAorLyoqIHBhdGgycGFyZW50IHJlcXVlc3QvcmVwbHkgc3RydWN0dXJlcyAqLworc3RydWN0IGdldHBhcmVudCB7CisJc3RydWN0IGx1X2ZpZAlncF9maWQ7CQkvKio8IHBhcmVudCBGSUQgKi8KKwlfX3UzMgkJZ3BfbGlua25vOwkvKio8IGhhcmRsaW5rIG51bWJlciAqLworCV9fdTMyCQlncF9uYW1lX3NpemU7CS8qKjwgc2l6ZSBvZiB0aGUgbmFtZSBmaWVsZCAqLworCWNoYXIJCWdwX25hbWVbMF07CS8qKjwgemVyby10ZXJtaW5hdGVkIGxpbmsgbmFtZSAqLworfSBfX3BhY2tlZDsKKwogZW51bSB7CiAJTEFZT1VUX0lOVEVOVF9BQ0NFU1MgICAgPSAwLAogCUxBWU9VVF9JTlRFTlRfUkVBRCAgICAgID0gMSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV9pb2N0bC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmUvbHVzdHJlX2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNkN2M5NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV9pb2N0bC5oCkBAIC0wLDAgKzEsNDEyIEBACisvKgorICogR1BMIEhFQURFUiBTVEFSVAorICoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQKKyAqIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IElmIG5vdCwgc2VlCisgKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sCisgKgorICogR1BMIEhFQURFUiBFTkQKKyAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE1LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqLworI2lmbmRlZiBMVVNUUkVfSU9DVExfSF8KKyNkZWZpbmUgTFVTVFJFX0lPQ1RMX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmcy5oIgorI2luY2x1ZGUgImx1c3RyZV9pZGwuaCIKKworI2lmZGVmIF9fS0VSTkVMX18KKyMgaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyMgaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjIGluY2x1ZGUgIi4uL29iZF9zdXBwb3J0LmgiCisjZWxzZSAvKiBfX0tFUk5FTF9fICovCisjIGluY2x1ZGUgPG1hbGxvYy5oPgorIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaWJjZnMvdXRpbC9pb2N0bC5oPgorI2VuZGlmIC8qICFfX0tFUk5FTF9fICovCisKKyNpZiAhZGVmaW5lZChfX0tFUk5FTF9fKSAmJiAhZGVmaW5lZChMVVNUUkVfVVRJTFMpCisjIGVycm9yIFRoaXMgZmlsZSBpcyBmb3IgTHVzdHJlIGludGVybmFsIHVzZSBvbmx5LgorI2VuZGlmCisKK2VudW0gbWRfZWNob19jbWQgeworCUVDSE9fTURfQ1JFQVRFCQk9IDEsIC8qIE9wZW4vQ3JlYXRlIGZpbGUgb24gTURUICovCisJRUNIT19NRF9NS0RJUgkJPSAyLCAvKiBNa2RpciBvbiBNRFQgKi8KKwlFQ0hPX01EX0RFU1RST1kJCT0gMywgLyogVW5saW5rIGZpbGUgb24gTURUICovCisJRUNIT19NRF9STURJUgkJPSA0LCAvKiBSbWRpciBvbiBNRFQgKi8KKwlFQ0hPX01EX0xPT0tVUAkJPSA1LCAvKiBMb29rdXAgb24gTURUICovCisJRUNIT19NRF9HRVRBVFRSCQk9IDYsIC8qIEdldGF0dHIgb24gTURUICovCisJRUNIT19NRF9TRVRBVFRSCQk9IDcsIC8qIFNldGF0dHIgb24gTURUICovCisJRUNIT19NRF9BTExPQ19GSUQJPSA4LCAvKiBHZXQgRklEcyBmcm9tIE1EVCAqLworfTsKKworI2RlZmluZSBPQkRfREVWX0lEIDEKKyNkZWZpbmUgT0JEX0RFVl9OQU1FICJvYmQiCisjZGVmaW5lIE9CRF9ERVZfUEFUSCAiL2Rldi8iIE9CRF9ERVZfTkFNRQorI2RlZmluZSBPQkRfREVWX01BSk9SIDEwCisjZGVmaW5lIE9CRF9ERVZfTUlOT1IgMjQxCisKKyNkZWZpbmUgT0JEX0lPQ1RMX1ZFUlNJT04JMHgwMDAxMDAwNAorI2RlZmluZSBPQkRfREVWX0JZX0RFVk5BTUUJMHhmZmZmZDBkZQorI2RlZmluZSBPQkRfTUFYX0lPQ1RMX0JVRkZFUglDT05GSUdfTFVTVFJFX09CRF9NQVhfSU9DVExfQlVGRkVSCisKK3N0cnVjdCBvYmRfaW9jdGxfZGF0YSB7CisJX191MzIJCWlvY19sZW47CisJX191MzIJCWlvY192ZXJzaW9uOworCisJdW5pb24geworCQlfX3U2NAlpb2NfY29va2llOworCQlfX3U2NAlpb2NfdTY0XzE7CisJfTsKKwl1bmlvbiB7CisJCV9fdTMyCWlvY19jb25uMTsKKwkJX191MzIJaW9jX3UzMl8xOworCX07CisJdW5pb24geworCQlfX3UzMglpb2NfY29ubjI7CisJCV9fdTMyCWlvY191MzJfMjsKKwl9OworCisJc3RydWN0IG9iZG8JaW9jX29iZG8xOworCXN0cnVjdCBvYmRvCWlvY19vYmRvMjsKKworCV9fdTY0CQlpb2NfY291bnQ7CisJX191NjQJCWlvY19vZmZzZXQ7CisJX191MzIJCWlvY19kZXY7CisJX191MzIJCWlvY19jb21tYW5kOworCisJX191NjQJCWlvY19uaWQ7CisJX191MzIJCWlvY19uYWw7CisJX191MzIJCWlvY190eXBlOworCisJLyogYnVmZmVycyB0aGUga2VybmVsIHdpbGwgdHJlYXQgYXMgdXNlciBwb2ludGVycyAqLworCV9fdTMyCQlpb2NfcGxlbjE7CisJY2hhciBfX3VzZXIgICAgKmlvY19wYnVmMTsKKwlfX3UzMgkJaW9jX3BsZW4yOworCWNoYXIgX191c2VyICAgICppb2NfcGJ1ZjI7CisKKwkvKiBpbmxpbmUgYnVmZmVycyBmb3IgdmFyaW91cyBhcmd1bWVudHMgKi8KKwlfX3UzMgkJaW9jX2lubGxlbjE7CisJY2hhcgkgICAgICAgKmlvY19pbmxidWYxOworCV9fdTMyCQlpb2NfaW5sbGVuMjsKKwljaGFyCSAgICAgICAqaW9jX2lubGJ1ZjI7CisJX191MzIJCWlvY19pbmxsZW4zOworCWNoYXIJICAgICAgICppb2NfaW5sYnVmMzsKKwlfX3UzMgkJaW9jX2lubGxlbjQ7CisJY2hhcgkgICAgICAgKmlvY19pbmxidWY0OworCisJY2hhcgkJaW9jX2J1bGtbMF07Cit9OworCitzdHJ1Y3Qgb2JkX2lvY3RsX2hkciB7CisJX191MzIJCWlvY19sZW47CisJX191MzIJCWlvY192ZXJzaW9uOworfTsKKworc3RhdGljIGlubGluZSBfX3UzMiBvYmRfaW9jdGxfcGFja2xlbihzdHJ1Y3Qgb2JkX2lvY3RsX2RhdGEgKmRhdGEpCit7CisJX191MzIgbGVuID0gY2ZzX3NpemVfcm91bmQoc2l6ZW9mKCpkYXRhKSk7CisKKwlsZW4gKz0gY2ZzX3NpemVfcm91bmQoZGF0YS0+aW9jX2lubGxlbjEpOworCWxlbiArPSBjZnNfc2l6ZV9yb3VuZChkYXRhLT5pb2NfaW5sbGVuMik7CisJbGVuICs9IGNmc19zaXplX3JvdW5kKGRhdGEtPmlvY19pbmxsZW4zKTsKKwlsZW4gKz0gY2ZzX3NpemVfcm91bmQoZGF0YS0+aW9jX2lubGxlbjQpOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGlubGluZSBpbnQgb2JkX2lvY3RsX2lzX2ludmFsaWQoc3RydWN0IG9iZF9pb2N0bF9kYXRhICpkYXRhKQoreworCWlmIChkYXRhLT5pb2NfbGVuID4gKDEgPDwgMzApKSB7CisJCUNFUlJPUigiT0JEIGlvY3RsOiBpb2NfbGVuIGxhcmdlciB0aGFuIDE8PDMwXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGRhdGEtPmlvY19pbmxsZW4xID4gKDEgPDwgMzApKSB7CisJCUNFUlJPUigiT0JEIGlvY3RsOiBpb2NfaW5sbGVuMSBsYXJnZXIgdGhhbiAxPDwzMFxuIik7CisJCXJldHVybiAxOworCX0KKworCWlmIChkYXRhLT5pb2NfaW5sbGVuMiA+ICgxIDw8IDMwKSkgeworCQlDRVJST1IoIk9CRCBpb2N0bDogaW9jX2lubGxlbjIgbGFyZ2VyIHRoYW4gMTw8MzBcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoZGF0YS0+aW9jX2lubGxlbjMgPiAoMSA8PCAzMCkpIHsKKwkJQ0VSUk9SKCJPQkQgaW9jdGw6IGlvY19pbmxsZW4zIGxhcmdlciB0aGFuIDE8PDMwXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGRhdGEtPmlvY19pbmxsZW40ID4gKDEgPDwgMzApKSB7CisJCUNFUlJPUigiT0JEIGlvY3RsOiBpb2NfaW5sbGVuNCBsYXJnZXIgdGhhbiAxPDwzMFxuIik7CisJCXJldHVybiAxOworCX0KKworCWlmIChkYXRhLT5pb2NfaW5sYnVmMSAmJiAhZGF0YS0+aW9jX2lubGxlbjEpIHsKKwkJQ0VSUk9SKCJPQkQgaW9jdGw6IGlubGJ1ZjEgcG9pbnRlciBidXQgMCBsZW5ndGhcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoZGF0YS0+aW9jX2lubGJ1ZjIgJiYgIWRhdGEtPmlvY19pbmxsZW4yKSB7CisJCUNFUlJPUigiT0JEIGlvY3RsOiBpbmxidWYyIHBvaW50ZXIgYnV0IDAgbGVuZ3RoXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGRhdGEtPmlvY19pbmxidWYzICYmICFkYXRhLT5pb2NfaW5sbGVuMykgeworCQlDRVJST1IoIk9CRCBpb2N0bDogaW5sYnVmMyBwb2ludGVyIGJ1dCAwIGxlbmd0aFxuIik7CisJCXJldHVybiAxOworCX0KKworCWlmIChkYXRhLT5pb2NfaW5sYnVmNCAmJiAhZGF0YS0+aW9jX2lubGxlbjQpIHsKKwkJQ0VSUk9SKCJPQkQgaW9jdGw6IGlubGJ1ZjQgcG9pbnRlciBidXQgMCBsZW5ndGhcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoZGF0YS0+aW9jX3BidWYxICYmICFkYXRhLT5pb2NfcGxlbjEpIHsKKwkJQ0VSUk9SKCJPQkQgaW9jdGw6IHBidWYxIHBvaW50ZXIgYnV0IDAgbGVuZ3RoXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGRhdGEtPmlvY19wYnVmMiAmJiAhZGF0YS0+aW9jX3BsZW4yKSB7CisJCUNFUlJPUigiT0JEIGlvY3RsOiBwYnVmMiBwb2ludGVyIGJ1dCAwIGxlbmd0aFxuIik7CisJCXJldHVybiAxOworCX0KKworCWlmICghZGF0YS0+aW9jX3BidWYxICYmIGRhdGEtPmlvY19wbGVuMSkgeworCQlDRVJST1IoIk9CRCBpb2N0bDogcGxlbjEgc2V0IGJ1dCBOVUxMIHBvaW50ZXJcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIWRhdGEtPmlvY19wYnVmMiAmJiBkYXRhLT5pb2NfcGxlbjIpIHsKKwkJQ0VSUk9SKCJPQkQgaW9jdGw6IHBsZW4yIHNldCBidXQgTlVMTCBwb2ludGVyXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKG9iZF9pb2N0bF9wYWNrbGVuKGRhdGEpID4gZGF0YS0+aW9jX2xlbikgeworCQlDRVJST1IoIk9CRCBpb2N0bDogcGFja2xlbiBleGNlZWRzIGlvY19sZW4gKCVkID4gJWQpXG4iLAorCQkgICAgICAgb2JkX2lvY3RsX3BhY2tsZW4oZGF0YSksIGRhdGEtPmlvY19sZW4pOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIF9fS0VSTkVMX18KKworaW50IG9iZF9pb2N0bF9nZXRkYXRhKGNoYXIgKipidWYsIGludCAqbGVuLCB2b2lkIF9fdXNlciAqYXJnKTsKK2ludCBvYmRfaW9jdGxfcG9wZGF0YSh2b2lkIF9fdXNlciAqYXJnLCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKKworc3RhdGljIGlubGluZSB2b2lkIG9iZF9pb2N0bF9mcmVlZGF0YShjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJa3ZmcmVlKGJ1Zik7Cit9CisKKyNlbHNlIC8qIF9fS0VSTkVMX18gKi8KKworc3RhdGljIGlubGluZSBpbnQgb2JkX2lvY3RsX3BhY2soc3RydWN0IG9iZF9pb2N0bF9kYXRhICpkYXRhLCBjaGFyICoqcGJ1ZiwKKwkJCQkgaW50IG1heF9sZW4pCit7CisJY2hhciAqcHRyOworCXN0cnVjdCBvYmRfaW9jdGxfZGF0YSAqb3ZlcmxheTsKKworCWRhdGEtPmlvY19sZW4gPSBvYmRfaW9jdGxfcGFja2xlbihkYXRhKTsKKwlkYXRhLT5pb2NfdmVyc2lvbiA9IE9CRF9JT0NUTF9WRVJTSU9OOworCisJaWYgKCpwYnVmICYmIGRhdGEtPmlvY19sZW4gPiBtYXhfbGVuKSB7CisJCWZwcmludGYoc3RkZXJyLCAicGJ1ZiA9ICVwLCBpb2NfbGVuID0gJXUsIG1heF9sZW4gPSAlZFxuIiwKKwkJCSpwYnVmLCBkYXRhLT5pb2NfbGVuLCBtYXhfbGVuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCEqcGJ1ZikKKwkJKnBidWYgPSBtYWxsb2MoZGF0YS0+aW9jX2xlbik7CisKKwlpZiAoISpwYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW92ZXJsYXkgPSAoc3RydWN0IG9iZF9pb2N0bF9kYXRhICopKnBidWY7CisJbWVtY3B5KCpwYnVmLCBkYXRhLCBzaXplb2YoKmRhdGEpKTsKKworCXB0ciA9IG92ZXJsYXktPmlvY19idWxrOworCWlmIChkYXRhLT5pb2NfaW5sYnVmMSkKKwkJTE9HTChkYXRhLT5pb2NfaW5sYnVmMSwgZGF0YS0+aW9jX2lubGxlbjEsIHB0cik7CisKKwlpZiAoZGF0YS0+aW9jX2lubGJ1ZjIpCisJCUxPR0woZGF0YS0+aW9jX2lubGJ1ZjIsIGRhdGEtPmlvY19pbmxsZW4yLCBwdHIpOworCisJaWYgKGRhdGEtPmlvY19pbmxidWYzKQorCQlMT0dMKGRhdGEtPmlvY19pbmxidWYzLCBkYXRhLT5pb2NfaW5sbGVuMywgcHRyKTsKKworCWlmIChkYXRhLT5pb2NfaW5sYnVmNCkKKwkJTE9HTChkYXRhLT5pb2NfaW5sYnVmNCwgZGF0YS0+aW9jX2lubGxlbjQsIHB0cik7CisKKwlpZiAob2JkX2lvY3RsX2lzX2ludmFsaWQob3ZlcmxheSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIGlvY3RsIGRhdGE6IGlvY19sZW4gPSAldSwgbWF4X2xlbiA9ICVkXG4iLAorCQkJZGF0YS0+aW9jX2xlbiwgbWF4X2xlbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorb2JkX2lvY3RsX3VucGFjayhzdHJ1Y3Qgb2JkX2lvY3RsX2RhdGEgKmRhdGEsIGNoYXIgKnBidWYsIGludCBtYXhfbGVuKQoreworCWNoYXIgKnB0cjsKKwlzdHJ1Y3Qgb2JkX2lvY3RsX2RhdGEgKm92ZXJsYXk7CisKKwlpZiAoIXBidWYpCisJCXJldHVybiAxOworCisJb3ZlcmxheSA9IChzdHJ1Y3Qgb2JkX2lvY3RsX2RhdGEgKilwYnVmOworCisJLyogUHJlc2VydmUgdGhlIGNhbGxlcidzIGJ1ZmZlciBwb2ludGVycyAqLworCW92ZXJsYXktPmlvY19pbmxidWYxID0gZGF0YS0+aW9jX2lubGJ1ZjE7CisJb3ZlcmxheS0+aW9jX2lubGJ1ZjIgPSBkYXRhLT5pb2NfaW5sYnVmMjsKKwlvdmVybGF5LT5pb2NfaW5sYnVmMyA9IGRhdGEtPmlvY19pbmxidWYzOworCW92ZXJsYXktPmlvY19pbmxidWY0ID0gZGF0YS0+aW9jX2lubGJ1ZjQ7CisKKwltZW1jcHkoZGF0YSwgcGJ1Ziwgc2l6ZW9mKCpkYXRhKSk7CisKKwlwdHIgPSBvdmVybGF5LT5pb2NfYnVsazsKKwlpZiAoZGF0YS0+aW9jX2lubGJ1ZjEpCisJCUxPR1UoZGF0YS0+aW9jX2lubGJ1ZjEsIGRhdGEtPmlvY19pbmxsZW4xLCBwdHIpOworCisJaWYgKGRhdGEtPmlvY19pbmxidWYyKQorCQlMT0dVKGRhdGEtPmlvY19pbmxidWYyLCBkYXRhLT5pb2NfaW5sbGVuMiwgcHRyKTsKKworCWlmIChkYXRhLT5pb2NfaW5sYnVmMykKKwkJTE9HVShkYXRhLT5pb2NfaW5sYnVmMywgZGF0YS0+aW9jX2lubGxlbjMsIHB0cik7CisKKwlpZiAoZGF0YS0+aW9jX2lubGJ1ZjQpCisJCUxPR1UoZGF0YS0+aW9jX2lubGJ1ZjQsIGRhdGEtPmlvY19pbmxsZW40LCBwdHIpOworCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiAhX19LRVJORUxfXyAqLworCisvKgorICogT0JEX0lPQ19EQVRBX1RZUEUgaXMgb25seSBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zIHdpdGggb2xkZXIKKyAqIExpbnV4IEx1c3RyZSB1c2VyIHRvb2xzLiBOZXcgaW9jdGxzIHNob3VsZCBOT1QgdXNlIHRoaXMgbWFjcm8gYXMKKyAqIHRoZSBpb2N0bCAic2l6ZSIuIEluc3RlYWQgdGhlIGlvY3RsIHNob3VsZCBnZXQgYSAic2l6ZSIgYXJndW1lbnQKKyAqIHdoaWNoIGlzIHRoZSBhY3R1YWwgZGF0YSB0eXBlIHVzZWQgYnkgdGhlIGlvY3RsLCB0byBlbnN1cmUgdGhlCisgKiBpb2N0bCBpbnRlcmZhY2UgaXMgdmVyc2lvbmVkIGNvcnJlY3RseS4KKyAqLworI2RlZmluZSBPQkRfSU9DX0RBVEFfVFlQRQlsb25nCisKKy8qCUlPQ19MRExNX1RFU1QJCV9JT1dSKCdmJywgNDAsIGxvbmcpICovCisvKglJT0NfTERMTV9EVU1QCQlfSU9XUignZicsIDQxLCBsb25nKSAqLworLyoJSU9DX0xETE1fUkVHUkVTU19TVEFSVAlfSU9XUignZicsIDQyLCBsb25nKSAqLworLyoJSU9DX0xETE1fUkVHUkVTU19TVE9QCV9JT1dSKCdmJywgNDMsIGxvbmcpICovCisKKyNkZWZpbmUgT0JEX0lPQ19DUkVBVEUJCV9JT1dSKCdmJywgMTAxLCBPQkRfSU9DX0RBVEFfVFlQRSkKKyNkZWZpbmUgT0JEX0lPQ19ERVNUUk9ZCQlfSU9XKCdmJywgMTA0LCBPQkRfSU9DX0RBVEFfVFlQRSkKKy8qCU9CRF9JT0NfUFJFQUxMT0NBVEUJX0lPV1IoJ2YnLCAxMDUsIE9CRF9JT0NfREFUQV9UWVBFKSAqLworCisjZGVmaW5lIE9CRF9JT0NfU0VUQVRUUgkJX0lPVygnZicsIDEwNywgT0JEX0lPQ19EQVRBX1RZUEUpCisjZGVmaW5lIE9CRF9JT0NfR0VUQVRUUgkJX0lPV1IoJ2YnLCAxMDgsIE9CRF9JT0NfREFUQV9UWVBFKQorI2RlZmluZSBPQkRfSU9DX1JFQUQJCV9JT1dSKCdmJywgMTA5LCBPQkRfSU9DX0RBVEFfVFlQRSkKKyNkZWZpbmUgT0JEX0lPQ19XUklURQkJX0lPV1IoJ2YnLCAxMTAsIE9CRF9JT0NfREFUQV9UWVBFKQorCisjZGVmaW5lIE9CRF9JT0NfU1RBVEZTCQlfSU9XUignZicsIDExMywgT0JEX0lPQ19EQVRBX1RZUEUpCisjZGVmaW5lIE9CRF9JT0NfU1lOQwkJX0lPVygnZicsIDExNCwgT0JEX0lPQ19EQVRBX1RZUEUpCisvKglPQkRfSU9DX1JFQUQyCQlfSU9XUignZicsIDExNSwgT0JEX0lPQ19EQVRBX1RZUEUpICovCisvKglPQkRfSU9DX0ZPUk1BVAkJX0lPV1IoJ2YnLCAxMTYsIE9CRF9JT0NfREFUQV9UWVBFKSAqLworLyoJT0JEX0lPQ19QQVJUSVRJT04JX0lPV1IoJ2YnLCAxMTcsIE9CRF9JT0NfREFUQV9UWVBFKSAqLworLyoJT0JEX0lPQ19DT1BZCQlfSU9XUignZicsIDEyMCwgT0JEX0lPQ19EQVRBX1RZUEUpICovCisvKglPQkRfSU9DX01JR1IJCV9JT1dSKCdmJywgMTIxLCBPQkRfSU9DX0RBVEFfVFlQRSkgKi8KKy8qCU9CRF9JT0NfUFVOQ0gJCV9JT1dSKCdmJywgMTIyLCBPQkRfSU9DX0RBVEFfVFlQRSkgKi8KKworLyoJT0JEX0lPQ19NT0RVTEVfREVCVUcJX0lPV1IoJ2YnLCAxMjQsIE9CRF9JT0NfREFUQV9UWVBFKSAqLworI2RlZmluZSBPQkRfSU9DX0JSV19SRUFECV9JT1dSKCdmJywgMTI1LCBPQkRfSU9DX0RBVEFfVFlQRSkKKyNkZWZpbmUgT0JEX0lPQ19CUldfV1JJVEUJX0lPV1IoJ2YnLCAxMjYsIE9CRF9JT0NfREFUQV9UWVBFKQorI2RlZmluZSBPQkRfSU9DX05BTUUyREVWCV9JT1dSKCdmJywgMTI3LCBPQkRfSU9DX0RBVEFfVFlQRSkKKyNkZWZpbmUgT0JEX0lPQ19VVUlEMkRFVglfSU9XUignZicsIDEzMCwgT0JEX0lPQ19EQVRBX1RZUEUpCisjZGVmaW5lIE9CRF9JT0NfR0VUTkFNRQkJX0lPV1IoJ2YnLCAxMzEsIE9CRF9JT0NfREFUQV9UWVBFKQorI2RlZmluZSBPQkRfSU9DX0dFVE1ETkFNRQlfSU9SKCdmJywgMTMxLCBjaGFyW01BWF9PQkRfTkFNRV0pCisjZGVmaW5lIE9CRF9JT0NfR0VURFROQU1FCU9CRF9JT0NfR0VUTkFNRQorI2RlZmluZSBPQkRfSU9DX0xPVl9HRVRfQ09ORklHCV9JT1dSKCdmJywgMTMyLCBPQkRfSU9DX0RBVEFfVFlQRSkKKyNkZWZpbmUgT0JEX0lPQ19DTElFTlRfUkVDT1ZFUglfSU9XKCdmJywgMTMzLCBPQkRfSU9DX0RBVEFfVFlQRSkKKyNkZWZpbmUgT0JEX0lPQ19QSU5HX1RBUkdFVAlfSU9XKCdmJywgMTM2LCBPQkRfSU9DX0RBVEFfVFlQRSkKKworLyoJT0JEX0lPQ19ERUNfRlNfVVNFX0NPVU5UIF9JTygnZicsIDEzOSkgKi8KKyNkZWZpbmUgT0JEX0lPQ19OT19UUkFOU05PCV9JT1coJ2YnLCAxNDAsIE9CRF9JT0NfREFUQV9UWVBFKQorI2RlZmluZSBPQkRfSU9DX1NFVF9SRUFET05MWQlfSU9XKCdmJywgMTQxLCBPQkRfSU9DX0RBVEFfVFlQRSkKKyNkZWZpbmUgT0JEX0lPQ19BQk9SVF9SRUNPVkVSWQlfSU9SKCdmJywgMTQyLCBPQkRfSU9DX0RBVEFfVFlQRSkKKy8qCU9CRF9JT0NfUk9PVF9TUVVBU0gJX0lPV1IoJ2YnLCAxNDMsIE9CRF9JT0NfREFUQV9UWVBFKSAqLworI2RlZmluZSBPQkRfR0VUX1ZFUlNJT04JCV9JT1dSKCdmJywgMTQ0LCBPQkRfSU9DX0RBVEFfVFlQRSkKKy8qCU9CRF9JT0NfR1NTX1NVUFBPUlQJX0lPV1IoJ2YnLCAxNDUsIE9CRF9JT0NfREFUQV9UWVBFKSAqLworLyoJT0JEX0lPQ19DTE9TRV9VVUlECV9JT1dSKCdmJywgMTQ3LCBPQkRfSU9DX0RBVEFfVFlQRSkgKi8KKyNkZWZpbmUgT0JEX0lPQ19DSEFOR0VMT0dfU0VORAlfSU9XKCdmJywgMTQ4LCBPQkRfSU9DX0RBVEFfVFlQRSkKKyNkZWZpbmUgT0JEX0lPQ19HRVRERVZJQ0UJX0lPV1IoJ2YnLCAxNDksIE9CRF9JT0NfREFUQV9UWVBFKQorI2RlZmluZSBPQkRfSU9DX0ZJRDJQQVRICV9JT1dSKCdmJywgMTUwLCBPQkRfSU9DX0RBVEFfVFlQRSkKKy8qCWx1c3RyZS9sdXN0cmVfdXNlci5oCTE1MS0xNTMgKi8KKy8qCU9CRF9JT0NfTE9WX1NFVFNUUklQRQkxNTQgTExfSU9DX0xPVl9TRVRTVFJJUEUgKi8KKy8qCU9CRF9JT0NfTE9WX0dFVFNUUklQRQkxNTUgTExfSU9DX0xPVl9HRVRTVFJJUEUgKi8KKy8qCU9CRF9JT0NfTE9WX1NFVEVBCTE1NiBMTF9JT0NfTE9WX1NFVEVBICovCisvKglsdXN0cmUvbHVzdHJlX3VzZXIuaAkxNTctMTU5ICovCisjZGVmaW5lCU9CRF9JT0NfUVVPVEFDSEVDSwlfSU9XKCdmJywgMTYwLCBpbnQpCisjZGVmaW5lCU9CRF9JT0NfUE9MTF9RVU9UQUNIRUNLCV9JT1IoJ2YnLCAxNjEsIHN0cnVjdCBpZl9xdW90YWNoZWNrICopCisjZGVmaW5lIE9CRF9JT0NfUVVPVEFDVEwJX0lPV1IoJ2YnLCAxNjIsIHN0cnVjdCBpZl9xdW90YWN0bCkKKy8qCWx1c3RyZS9sdXN0cmVfdXNlci5oCTE2My0xNzYgKi8KKyNkZWZpbmUgT0JEX0lPQ19DSEFOR0VMT0dfUkVHCV9JT1coJ2YnLCAxNzcsIHN0cnVjdCBvYmRfaW9jdGxfZGF0YSkKKyNkZWZpbmUgT0JEX0lPQ19DSEFOR0VMT0dfREVSRUcJX0lPVygnZicsIDE3OCwgc3RydWN0IG9iZF9pb2N0bF9kYXRhKQorI2RlZmluZSBPQkRfSU9DX0NIQU5HRUxPR19DTEVBUglfSU9XKCdmJywgMTc5LCBzdHJ1Y3Qgb2JkX2lvY3RsX2RhdGEpCisvKglPQkRfSU9DX1JFQ09SRAkJX0lPV1IoJ2YnLCAxODAsIE9CRF9JT0NfREFUQV9UWVBFKSAqLworLyoJT0JEX0lPQ19FTkRSRUNPUkQJX0lPV1IoJ2YnLCAxODEsIE9CRF9JT0NfREFUQV9UWVBFKSAqLworLyoJT0JEX0lPQ19QQVJTRQkJX0lPV1IoJ2YnLCAxODIsIE9CRF9JT0NfREFUQV9UWVBFKSAqLworLyoJT0JEX0lPQ19ET1JFQ09SRAlfSU9XUignZicsIDE4MywgT0JEX0lPQ19EQVRBX1RZUEUpICovCisjZGVmaW5lIE9CRF9JT0NfUFJPQ0VTU19DRkcJX0lPV1IoJ2YnLCAxODQsIE9CRF9JT0NfREFUQV9UWVBFKQorLyoJT0JEX0lPQ19EVU1QX0xPRwlfSU9XUignZicsIDE4NSwgT0JEX0lPQ19EQVRBX1RZUEUpICovCisvKglPQkRfSU9DX0NMRUFSX0xPRwlfSU9XUignZicsIDE4NiwgT0JEX0lPQ19EQVRBX1RZUEUpICovCisjZGVmaW5lIE9CRF9JT0NfUEFSQU0JCV9JT1coJ2YnLCAxODcsIE9CRF9JT0NfREFUQV9UWVBFKQorI2RlZmluZSBPQkRfSU9DX1BPT0wJCV9JT1dSKCdmJywgMTg4LCBPQkRfSU9DX0RBVEFfVFlQRSkKKyNkZWZpbmUgT0JEX0lPQ19SRVBMQUNFX05JRFMJX0lPV1IoJ2YnLCAxODksIE9CRF9JT0NfREFUQV9UWVBFKQorCisjZGVmaW5lIE9CRF9JT0NfQ0FUTE9HTElTVAlfSU9XUignZicsIDE5MCwgT0JEX0lPQ19EQVRBX1RZUEUpCisjZGVmaW5lIE9CRF9JT0NfTExPR19JTkZPCV9JT1dSKCdmJywgMTkxLCBPQkRfSU9DX0RBVEFfVFlQRSkKKyNkZWZpbmUgT0JEX0lPQ19MTE9HX1BSSU5UCV9JT1dSKCdmJywgMTkyLCBPQkRfSU9DX0RBVEFfVFlQRSkKKyNkZWZpbmUgT0JEX0lPQ19MTE9HX0NBTkNFTAlfSU9XUignZicsIDE5MywgT0JEX0lPQ19EQVRBX1RZUEUpCisjZGVmaW5lIE9CRF9JT0NfTExPR19SRU1PVkUJX0lPV1IoJ2YnLCAxOTQsIE9CRF9JT0NfREFUQV9UWVBFKQorI2RlZmluZSBPQkRfSU9DX0xMT0dfQ0hFQ0sJX0lPV1IoJ2YnLCAxOTUsIE9CRF9JT0NfREFUQV9UWVBFKQorLyoJT0JEX0lPQ19MTE9HX0NBVElORk8JX0lPV1IoJ2YnLCAxOTYsIE9CRF9JT0NfREFUQV9UWVBFKSAqLworI2RlZmluZSBPQkRfSU9DX05PREVNQVAJCV9JT1dSKCdmJywgMTk3LCBPQkRfSU9DX0RBVEFfVFlQRSkKKworLyoJRUNIT19JT0NfR0VUX1NUUklQRQlfSU9XUignZicsIDIwMCwgT0JEX0lPQ19EQVRBX1RZUEUpICovCisvKglFQ0hPX0lPQ19TRVRfU1RSSVBFCV9JT1dSKCdmJywgMjAxLCBPQkRfSU9DX0RBVEFfVFlQRSkgKi8KKy8qCUVDSE9fSU9DX0VOUVVFVUUJX0lPV1IoJ2YnLCAyMDIsIE9CRF9JT0NfREFUQV9UWVBFKSAqLworLyoJRUNIT19JT0NfQ0FOQ0VMCQlfSU9XUignZicsIDIwMywgT0JEX0lPQ19EQVRBX1RZUEUpICovCisKKyNkZWZpbmUgT0JEX0lPQ19HRVRfT0JKX1ZFUlNJT04JX0lPUignZicsIDIxMCwgT0JEX0lPQ19EQVRBX1RZUEUpCisKKy8qCWx1c3RyZS9sdXN0cmVfdXNlci5oCTIxMi0yMTcgKi8KKyNkZWZpbmUgT0JEX0lPQ19HRVRfTU5UT1BUCV9JT1coJ2YnLCAyMjAsIG1udG9wdF90KQorI2RlZmluZSBPQkRfSU9DX0VDSE9fTUQJCV9JT1IoJ2YnLCAyMjEsIHN0cnVjdCBvYmRfaW9jdGxfZGF0YSkKKyNkZWZpbmUgT0JEX0lPQ19FQ0hPX0FMTE9DX1NFUQlfSU9XUignZicsIDIyMiwgc3RydWN0IG9iZF9pb2N0bF9kYXRhKQorI2RlZmluZSBPQkRfSU9DX1NUQVJUX0xGU0NLCV9JT1dSKCdmJywgMjMwLCBPQkRfSU9DX0RBVEFfVFlQRSkKKyNkZWZpbmUgT0JEX0lPQ19TVE9QX0xGU0NLCV9JT1coJ2YnLCAyMzEsIE9CRF9JT0NfREFUQV9UWVBFKQorI2RlZmluZSBPQkRfSU9DX1FVRVJZX0xGU0NLCV9JT1IoJ2YnLCAyMzIsIHN0cnVjdCBvYmRfaW9jdGxfZGF0YSkKKy8qCWx1c3RyZS9sdXN0cmVfdXNlci5oCTI0MC0yNDkgKi8KKy8qCUxJQkNGU19JT0NfREVCVUdfTUFTSwkyNTAgKi8KKworI2RlZmluZSBJT0NfT1NDX1NFVF9BQ1RJVkUJX0lPV1IoJ2gnLCAyMSwgdm9pZCAqKQorCisjZW5kaWYgLyogTFVTVFJFX0lPQ1RMX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfdXNlci5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmUvbHVzdHJlX3VzZXIuaAppbmRleCBlZjZmMzhmLi42ZmM5ODU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfdXNlci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV91c2VyLmgKQEAgLTQyLDggKzQyLDM1IEBACiAgKiBAewogICovCiAKKyNpZmRlZiBfX0tFUk5FTF9fCisjIGluY2x1ZGUgPGxpbnV4L3F1b3RhLmg+CisjIGluY2x1ZGUgPGxpbnV4L3N0cmluZy5oPiAvKiBzbnByaW50ZigpICovCisjIGluY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNlbHNlIC8qICFfX0tFUk5FTF9fICovCisjIGRlZmluZSBORUVEX1FVT1RBX0RFRlMKKyMgaW5jbHVkZSA8c3RkaW8uaD4gLyogc25wcmludGYoKSAqLworIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgaW5jbHVkZSA8c3lzL3F1b3RhLmg+CisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2luY2x1ZGUgImxsX2ZpZW1hcC5oIgotI2luY2x1ZGUgIi4uL2xpbnV4L2x1c3RyZV91c2VyLmgiCisKKy8qCisgKiBXZSBuZWVkIHRvIGFsd2F5cyB1c2UgNjRiaXQgdmVyc2lvbiBiZWNhdXNlIHRoZSBzdHJ1Y3R1cmUKKyAqIGlzIHNoYXJlZCBhY3Jvc3MgZW50aXJlIGNsdXN0ZXIgd2hlcmUgMzJiaXQgYW5kIDY0Yml0IG1hY2hpbmVzCisgKiBhcmUgY28tZXhpc3RpbmcuCisgKi8KKyNpZiBfX0JJVFNfUEVSX0xPTkcgIT0gNjQgfHwgZGVmaW5lZChfX0FSQ0hfV0FOVF9TVEFUNjQpCit0eXBlZGVmIHN0cnVjdCBzdGF0NjQgICBsc3RhdF90OworI2RlZmluZSBsc3RhdF9mICBsc3RhdDY0CisjZWxzZQordHlwZWRlZiBzdHJ1Y3Qgc3RhdCAgICAgbHN0YXRfdDsKKyNkZWZpbmUgbHN0YXRfZiAgbHN0YXQKKyNlbmRpZgorCisjZGVmaW5lIEhBVkVfTE9WX1VTRVJfTURTX0RBVEEKKworI2RlZmluZSBMVVNUUkVfRU9GIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTAogCiAvKiBmb3Igc3RhdGZzKCkgKi8KICNkZWZpbmUgTExfU1VQRVJfTUFHSUMgMHgwQkQwMEJEMApAQCAtMTE3LDYgKzE0NCwxMSBAQAogCV9fdTMyIGZfdmVyOwogfTsKIAorc3RhdGljIGlubGluZSBib29sIGZpZF9pc196ZXJvKGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCkKK3sKKwlyZXR1cm4gIWZpZC0+Zl9zZXEgJiYgIWZpZC0+Zl9vaWQ7Cit9CisKIHN0cnVjdCBmaWx0ZXJfZmlkIHsKIAlzdHJ1Y3QgbHVfZmlkCWZmX3BhcmVudDsgIC8qIGZmX3BhcmVudC5mX3ZlciA9PSBmaWxlIHN0cmlwZSBudW1iZXIgKi8KIH07CkBAIC0xNjcsNyArMTk5LDcgQEAKICAqLwogc3RydWN0IG9zdF9pZCB7CiAJdW5pb24gewotCQlzdHJ1Y3Qgb3N0aWQgeworCQlzdHJ1Y3QgewogCQkJX191NjQJb2lfaWQ7CiAJCQlfX3U2NAlvaV9zZXE7CiAJCX0gb2k7CkBAIC0xODgsMjYgKzIyMCwyMCBAQAogICogKlNUUklQRSogLSBzZXQvZ2V0IGxvdl91c2VyX21kCiAgKiAqSU5GTyAgICAtIHNldC9nZXQgbG92X3VzZXJfbWRzX2RhdGEKICAqLwotLyogc2VlIDxsdXN0cmVfbGliLmg+IGZvciBpb2N0bCBudW1iZXJzcyAxMDEtMTUwICovCisvKglsdXN0cmVfaW9jdGwuaAkJCTEwMS0xNTAgKi8KICNkZWZpbmUgTExfSU9DX0dFVEZMQUdTCQkgX0lPUignZicsIDE1MSwgbG9uZykKICNkZWZpbmUgTExfSU9DX1NFVEZMQUdTCQkgX0lPVygnZicsIDE1MiwgbG9uZykKICNkZWZpbmUgTExfSU9DX0NMUkZMQUdTCQkgX0lPVygnZicsIDE1MywgbG9uZykKLS8qIExMX0lPQ19MT1ZfU0VUU1RSSVBFOiBTZWUgYWxzbyBPQkRfSU9DX0xPVl9TRVRTVFJJUEUgKi8KICNkZWZpbmUgTExfSU9DX0xPVl9TRVRTVFJJUEUJICAgIF9JT1coJ2YnLCAxNTQsIGxvbmcpCi0vKiBMTF9JT0NfTE9WX0dFVFNUUklQRTogU2VlIGFsc28gT0JEX0lPQ19MT1ZfR0VUU1RSSVBFICovCiAjZGVmaW5lIExMX0lPQ19MT1ZfR0VUU1RSSVBFCSAgICBfSU9XKCdmJywgMTU1LCBsb25nKQotLyogTExfSU9DX0xPVl9TRVRFQTogU2VlIGFsc28gT0JEX0lPQ19MT1ZfU0VURUEgKi8KICNkZWZpbmUgTExfSU9DX0xPVl9TRVRFQQkJX0lPVygnZicsIDE1NiwgbG9uZykKLSNkZWZpbmUgTExfSU9DX1JFQ1JFQVRFX09CSgkgICAgIF9JT1coJ2YnLCAxNTcsIGxvbmcpCi0jZGVmaW5lIExMX0lPQ19SRUNSRUFURV9GSUQJICAgICBfSU9XKCdmJywgMTU3LCBzdHJ1Y3QgbHVfZmlkKQorLyoJTExfSU9DX1JFQ1JFQVRFX09CSgkJMTU3IG9ic29sZXRlICovCisvKglMTF9JT0NfUkVDUkVBVEVfRklECQkxNTggb2Jzb2xldGUgKi8KICNkZWZpbmUgTExfSU9DX0dST1VQX0xPQ0sJICAgICAgIF9JT1coJ2YnLCAxNTgsIGxvbmcpCiAjZGVmaW5lIExMX0lPQ19HUk9VUF9VTkxPQ0sJICAgICBfSU9XKCdmJywgMTU5LCBsb25nKQotLyogTExfSU9DX1FVT1RBQ0hFQ0s6IFNlZSBhbHNvIE9CRF9JT0NfUVVPVEFDSEVDSyAqLwotI2RlZmluZSBMTF9JT0NfUVVPVEFDSEVDSwkgICAgICAgX0lPVygnZicsIDE2MCwgaW50KQotLyogTExfSU9DX1BPTExfUVVPVEFDSEVDSzogU2VlIGFsc28gT0JEX0lPQ19QT0xMX1FVT1RBQ0hFQ0sgKi8KLSNkZWZpbmUgTExfSU9DX1BPTExfUVVPVEFDSEVDSwkgIF9JT1IoJ2YnLCAxNjEsIHN0cnVjdCBpZl9xdW90YWNoZWNrICopCi0vKiBMTF9JT0NfUVVPVEFDVEw6IFNlZSBhbHNvIE9CRF9JT0NfUVVPVEFDVEwgKi8KLSNkZWZpbmUgTExfSU9DX1FVT1RBQ1RMCQkgX0lPV1IoJ2YnLCAxNjIsIHN0cnVjdCBpZl9xdW90YWN0bCkKKy8qICNkZWZpbmUgTExfSU9DX1FVT1RBQ0hFQ0sJCTE2MCBPQkRfSU9DX1FVT1RBQ0hFQ0sgKi8KKy8qICNkZWZpbmUgTExfSU9DX1BPTExfUVVPVEFDSEVDSwkxNjEgT0JEX0lPQ19QT0xMX1FVT1RBQ0hFQ0sgKi8KKy8qICNkZWZpbmUgTExfSU9DX1FVT1RBQ1RMCQkxNjIgT0JEX0lPQ19RVU9UQUNUTCAqLwogI2RlZmluZSBJT0NfT0JEX1NUQVRGUwkJICBfSU9XUignZicsIDE2NCwgc3RydWN0IG9iZF9zdGF0ZnMgKikKICNkZWZpbmUgSU9DX0xPVl9HRVRJTkZPCQkgX0lPV1IoJ2YnLCAxNjUsIHN0cnVjdCBsb3ZfdXNlcl9tZHNfZGF0YSAqKQogI2RlZmluZSBMTF9JT0NfRkxVU0hDVFgJCSBfSU9XKCdmJywgMTY2LCBsb25nKQpAQCAtMjIxLDggKzI0Nyw3IEBACiAjZGVmaW5lIExMX0lPQ19HRVRfQ09OTkVDVF9GTEFHUwlfSU9XUignZicsIDE3NCwgX191NjQgKikKICNkZWZpbmUgTExfSU9DX0dFVF9NRFRJRFgJICAgICAgIF9JT1IoJ2YnLCAxNzUsIGludCkKIAotLyogc2VlIDxsdXN0cmVfbGliLmg+IGZvciBpb2N0bCBudW1iZXJzIDE3Ny0yMTAgKi8KLQorLyoJbHVzdHJlX2lvY3RsLmgJCQkxNzctMjEwICovCiAjZGVmaW5lIExMX0lPQ19IU01fU1RBVEVfR0VUCQlfSU9SKCdmJywgMjExLCBzdHJ1Y3QgaHNtX3VzZXJfc3RhdGUpCiAjZGVmaW5lIExMX0lPQ19IU01fU1RBVEVfU0VUCQlfSU9XKCdmJywgMjEyLCBzdHJ1Y3QgaHNtX3N0YXRlX3NldCkKICNkZWZpbmUgTExfSU9DX0hTTV9DVF9TVEFSVAkJX0lPVygnZicsIDIxMywgc3RydWN0IGx1c3RyZV9rZXJuZWxjb21tKQpAQCAtMjQyLDYgKzI2NywxNyBAQAogI2RlZmluZSBMTF9JT0NfU0VUX0xFQVNFCQlfSU9XUignZicsIDI0MywgbG9uZykKICNkZWZpbmUgTExfSU9DX0dFVF9MRUFTRQkJX0lPKCdmJywgMjQ0KQogI2RlZmluZSBMTF9JT0NfSFNNX0lNUE9SVAkJX0lPV1IoJ2YnLCAyNDUsIHN0cnVjdCBoc21fdXNlcl9pbXBvcnQpCisjZGVmaW5lIExMX0lPQ19MTVZfU0VUX0RFRkFVTFRfU1RSSVBFCV9JT1dSKCdmJywgMjQ2LCBzdHJ1Y3QgbG12X3VzZXJfbWQpCisjZGVmaW5lIExMX0lPQ19NSUdSQVRFCQkJX0lPUignZicsIDI0NywgaW50KQorI2RlZmluZSBMTF9JT0NfRklEMk1EVElEWAkJX0lPV1IoJ2YnLCAyNDgsIHN0cnVjdCBsdV9maWQpCisjZGVmaW5lIExMX0lPQ19HRVRQQVJFTlQJCV9JT1dSKCdmJywgMjQ5LCBzdHJ1Y3QgZ2V0cGFyZW50KQorCisvKiBMZWFzZSB0eXBlcyBmb3IgdXNlIGFzIGFyZyBhbmQgcmV0dXJuIG9mIExMX0lPQ197R0VULFNFVH1fTEVBU0UgaW9jdGwuICovCitlbnVtIGxsX2xlYXNlX3R5cGUgeworCUxMX0xFQVNFX1JETENLCT0gMHgxLAorCUxMX0xFQVNFX1dSTENLCT0gMHgyLAorCUxMX0xFQVNFX1VOTENLCT0gMHg0LAorfTsKIAogI2RlZmluZSBMTF9TVEFURlNfTE1WCSAgIDEKICNkZWZpbmUgTExfU1RBVEZTX0xPVgkgICAyCkBAIC0yNTMsMTAgKzI4OSw2IEBACiAjZGVmaW5lIElPQ19NRENfR0VURklMRUlORk8gICAgIF9JT1dSKElPQ19NRENfVFlQRSwgMjIsIHN0cnVjdCBsb3ZfdXNlcl9tZHNfZGF0YSAqKQogI2RlZmluZSBMTF9JT0NfTURDX0dFVElORk8gICAgICBfSU9XUihJT0NfTURDX1RZUEUsIDIzLCBzdHJ1Y3QgbG92X3VzZXJfbWRzX2RhdGEgKikKIAotLyogS2VlcCB0aGVzZSBmb3IgYmFja3dhcmQgY29tcGFydGFiaWxpdHkuICovCi0jZGVmaW5lIExMX0lPQ19PQkRfU1RBVEZTICAgICAgIElPQ19PQkRfU1RBVEZTCi0jZGVmaW5lIElPQ19NRENfR0VUU1RSSVBFICAgICAgIElPQ19NRENfR0VURklMRVNUUklQRQotCiAjZGVmaW5lIE1BWF9PQkRfTkFNRSAxMjggLyogSWYgdGhpcyBjaGFuZ2VzLCBhIE5FVyBpb2N0bCBtdXN0IGJlIGFkZGVkICovCiAKIC8qIERlZmluZSBPX0xPVl9ERUxBWV9DUkVBVEUgdG8gYmUgYSBtYXNrIHRoYXQgaXMgbm90IHVzZWZ1bCBmb3IgcmVndWxhcgpAQCAtMjczLDIwICszMDUsMjYgQEAKICNkZWZpbmUgTExfRklMRV9MT0NLTEVTU19JTyAgICAgMHgwMDAwMDAxMCAvKiBzZXJ2ZXItc2lkZSBsb2NrcyB3aXRoIGNpbyAqLwogI2RlZmluZSBMTF9GSUxFX1JNVEFDTAkgIDB4MDAwMDAwMjAKIAotI2RlZmluZSBMT1ZfVVNFUl9NQUdJQ19WMSAweDBCRDEwQkQwCi0jZGVmaW5lIExPVl9VU0VSX01BR0lDICAgIExPVl9VU0VSX01BR0lDX1YxCi0jZGVmaW5lIExPVl9VU0VSX01BR0lDX0pPSU5fVjEgMHgwQkQyMEJEMAotI2RlZmluZSBMT1ZfVVNFUl9NQUdJQ19WMyAweDBCRDMwQkQwCisjZGVmaW5lIExPVl9VU0VSX01BR0lDX1YxCTB4MEJEMTBCRDAKKyNkZWZpbmUgTE9WX1VTRVJfTUFHSUMJCUxPVl9VU0VSX01BR0lDX1YxCisjZGVmaW5lIExPVl9VU0VSX01BR0lDX0pPSU5fVjEJMHgwQkQyMEJEMAorI2RlZmluZSBMT1ZfVVNFUl9NQUdJQ19WMwkweDBCRDMwQkQwCisvKiAweDBCRDQwQkQwIGlzIG9jY3VwaWVkIGJ5IExPVl9NQUdJQ19NSUdSQVRFICovCisjZGVmaW5lIExPVl9VU0VSX01BR0lDX1NQRUNJRklDCTB4MEJENTBCRDAJLyogZm9yIHNwZWNpZmljIE9TVHMgKi8KIAotI2RlZmluZSBMTVZfTUFHSUNfVjEgICAgICAweDBDRDEwQ0QwICAgIC8qbm9ybWFsIHN0cmlwZSBsbXYgbWFnaWMgKi8KLSNkZWZpbmUgTE1WX1VTRVJfTUFHSUMgICAgMHgwQ0QyMENEMCAgICAvKmRlZmF1bHQgbG12IG1hZ2ljKi8KKyNkZWZpbmUgTE1WX1VTRVJfTUFHSUMgICAgMHgwQ0QzMENEMCAgICAvKmRlZmF1bHQgbG12IG1hZ2ljKi8KIAotI2RlZmluZSBMT1ZfUEFUVEVSTl9SQUlEMCAweDAwMQotI2RlZmluZSBMT1ZfUEFUVEVSTl9SQUlEMSAweDAwMgotI2RlZmluZSBMT1ZfUEFUVEVSTl9GSVJTVCAweDEwMAorI2RlZmluZSBMT1ZfUEFUVEVSTl9SQUlEMAkweDAwMQorI2RlZmluZSBMT1ZfUEFUVEVSTl9SQUlEMQkweDAwMgorI2RlZmluZSBMT1ZfUEFUVEVSTl9GSVJTVAkweDEwMAorI2RlZmluZSBMT1ZfUEFUVEVSTl9DTU9CRAkweDIwMAogCi0jZGVmaW5lIExPVl9NQVhQT09MTkFNRSAxNgotI2RlZmluZSBMT1ZfUE9PTE5BTUVGICIlLjE2cyIKKyNkZWZpbmUgTE9WX1BBVFRFUk5fRl9NQVNLCTB4ZmZmZjAwMDAKKyNkZWZpbmUgTE9WX1BBVFRFUk5fRl9IT0xFCTB4NDAwMDAwMDAgLyogdGhlcmUgaXMgaG9sZSBpbiBMT1YgRUEgKi8KKyNkZWZpbmUgTE9WX1BBVFRFUk5fRl9SRUxFQVNFRAkweDgwMDAwMDAwIC8qIEhTTSByZWxlYXNlZCBmaWxlICovCisKKyNkZWZpbmUgTE9WX01BWFBPT0xOQU1FIDE1CisjZGVmaW5lIExPVl9QT09MTkFNRUYgIiUuMTVzIgogCiAjZGVmaW5lIExPVl9NSU5fU1RSSVBFX0JJVFMgMTYgICAvKiBtYXhpbXVtIFBBR0VfU0laRSAoaWE2NCksIHBvd2VyIG9mIDIgKi8KICNkZWZpbmUgTE9WX01JTl9TVFJJUEVfU0laRSAoMSA8PCBMT1ZfTUlOX1NUUklQRV9CSVRTKQpAQCAtMzQ0LDE4ICszODIsMTcgQEAKIAkJCQkJICAgKiB1c2VkIHdoZW4gcmVhZGluZwogCQkJCQkgICAqLwogCX07Ci0JY2hhciAgbG1tX3Bvb2xfbmFtZVtMT1ZfTUFYUE9PTE5BTUVdOyAvKiBwb29sIG5hbWUgKi8KKwljaGFyICBsbW1fcG9vbF9uYW1lW0xPVl9NQVhQT09MTkFNRSArIDFdOyAgIC8qIHBvb2wgbmFtZSAqLwogCXN0cnVjdCBsb3ZfdXNlcl9vc3RfZGF0YV92MSBsbW1fb2JqZWN0c1swXTsgLyogcGVyLXN0cmlwZSBkYXRhICovCiB9IF9fcGFja2VkOwogCiBzdGF0aWMgaW5saW5lIF9fdTMyIGxvdl91c2VyX21kX3NpemUoX191MTYgc3RyaXBlcywgX191MzIgbG1tX21hZ2ljKQogewotCWlmIChsbW1fbWFnaWMgPT0gTE9WX1VTRVJfTUFHSUNfVjMpCi0JCXJldHVybiBzaXplb2Yoc3RydWN0IGxvdl91c2VyX21kX3YzKSArCi0JCQkJc3RyaXBlcyAqIHNpemVvZihzdHJ1Y3QgbG92X3VzZXJfb3N0X2RhdGFfdjEpOwotCWVsc2UKKwlpZiAobG1tX21hZ2ljID09IExPVl9VU0VSX01BR0lDX1YxKQogCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBsb3ZfdXNlcl9tZF92MSkgKwogCQkJCXN0cmlwZXMgKiBzaXplb2Yoc3RydWN0IGxvdl91c2VyX29zdF9kYXRhX3YxKTsKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBsb3ZfdXNlcl9tZF92MykgKworCSAgICAgICBzdHJpcGVzICogc2l6ZW9mKHN0cnVjdCBsb3ZfdXNlcl9vc3RfZGF0YV92MSk7CiB9CiAKIC8qIENvbXBpbGUgd2l0aCAtRF9MQVJHRUZJTEU2NF9TT1VSQ0Ugb3IgLURfR05VX1NPVVJDRSAob3IgI2RlZmluZSkgdG8KQEAgLTM3NCwxOSArNDExLDI2IEBACiB9IF9fcGFja2VkOwogI2VuZGlmCiAKLS8qIGtlZXAgdGhpcyB0byBiZSB0aGUgc2FtZSBzaXplIGFzIGxvdl91c2VyX29zdF9kYXRhX3YxICovCiBzdHJ1Y3QgbG12X3VzZXJfbWRzX2RhdGEgewogCXN0cnVjdCBsdV9maWQJbHVtX2ZpZDsKIAlfX3UzMgkJbHVtX3BhZGRpbmc7CiAJX191MzIJCWx1bV9tZHM7CiB9OwogCi0vKiBsdW1fdHlwZSAqLwotZW51bSB7Ci0JTE1WX1NUUklQRV9UWVBFID0gMCwKLQlMTVZfREVGQVVMVF9UWVBFID0gMSwKK2VudW0gbG12X2hhc2hfdHlwZSB7CisJTE1WX0hBU0hfVFlQRV9VTktOT1dOCT0gMCwJLyogMCBpcyByZXNlcnZlZCBmb3IgdGVzdGluZyBwdXJwb3NlICovCisJTE1WX0hBU0hfVFlQRV9BTExfQ0hBUlMgPSAxLAorCUxNVl9IQVNIX1RZUEVfRk5WXzFBXzY0ID0gMiwKIH07CiAKKyNkZWZpbmUgTE1WX0hBU0hfTkFNRV9BTExfQ0hBUlMJCSJhbGxfY2hhciIKKyNkZWZpbmUgTE1WX0hBU0hfTkFNRV9GTlZfMUFfNjQJCSJmbnZfMWFfNjQiCisKKy8qCisgKiBHb3QgdGhpcyBhY2NvcmRpbmcgdG8gaG93IGdldCBMT1ZfTUFYX1NUUklQRV9DT1VOVCwgc2VlIGFib3ZlLAorICogKG1heCBidWZmZXIgc2l6ZSAtIGxtditycGMgaGVhZGVyKSAvIHNpemVvZihzdHJ1Y3QgbG12X3VzZXJfbWRzX2RhdGEpCisgKi8KKyNkZWZpbmUgTE1WX01BWF9TVFJJUEVfQ09VTlQgMjAwMCAgLyogKCgxMiAqIDQwOTYgLSAyNTYpIC8gMjQpICovCiAjZGVmaW5lIGxtdl91c2VyX21kIGxtdl91c2VyX21kX3YxCiBzdHJ1Y3QgbG12X3VzZXJfbWRfdjEgewogCV9fdTMyCWx1bV9tYWdpYzsJIC8qIG11c3QgYmUgdGhlIGZpcnN0IGZpZWxkICovCkBAIC0zOTcsOSArNDQxLDkgQEAKIAlfX3UzMglsdW1fcGFkZGluZzE7CiAJX191MzIJbHVtX3BhZGRpbmcyOwogCV9fdTMyCWx1bV9wYWRkaW5nMzsKLQljaGFyCWx1bV9wb29sX25hbWVbTE9WX01BWFBPT0xOQU1FXTsKKwljaGFyCWx1bV9wb29sX25hbWVbTE9WX01BWFBPT0xOQU1FICsgMV07CiAJc3RydWN0CWxtdl91c2VyX21kc19kYXRhICBsdW1fb2JqZWN0c1swXTsKLX07Cit9IF9fcGFja2VkOwogCiBzdGF0aWMgaW5saW5lIGludCBsbXZfdXNlcl9tZF9zaXplKGludCBzdHJpcGVzLCBpbnQgbG1tX21hZ2ljKQogewpAQCAtNDA3LDYgKzQ1MSw4IEBACiAJCSAgICAgIHN0cmlwZXMgKiBzaXplb2Yoc3RydWN0IGxtdl91c2VyX21kc19kYXRhKTsKIH0KIAordm9pZCBsdXN0cmVfc3dhYl9sbXZfdXNlcl9tZChzdHJ1Y3QgbG12X3VzZXJfbWQgKmx1bSk7CisKIHN0cnVjdCBsbF9yZWNyZWF0ZV9vYmogewogCV9fdTY0IGxyY19pZDsKIAlfX3UzMiBscmNfb3N0X2lkeDsKQEAgLTQ5OCw2ICs1NDQsMTIgQEAKIAogLyoqKioqKioqKiBRdW90YXMgKioqKioqKioqKi8KIAorI2RlZmluZSBRX1FVT1RBQ0hFQ0sgICAweDgwMDEwMCAvKiBkZXByZWNhdGVkIGFzIG9mIDIuNCAqLworI2RlZmluZSBRX0lOSVRRVU9UQSAgICAweDgwMDEwMSAvKiBkZXByZWNhdGVkIGFzIG9mIDIuNCAgKi8KKyNkZWZpbmUgUV9HRVRPSU5GTyAgICAgMHg4MDAxMDIgLyogZ2V0IG9iZCBxdW90YSBpbmZvICovCisjZGVmaW5lIFFfR0VUT1FVT1RBICAgIDB4ODAwMTAzIC8qIGdldCBvYmQgcXVvdGFzICovCisjZGVmaW5lIFFfRklOVkFMSURBVEUgIDB4ODAwMTA0IC8qIGRlcHJlY2F0ZWQgYXMgb2YgMi40ICovCisKIC8qIHRoZXNlIG11c3QgYmUgZXhwbGljaXRseSB0cmFuc2xhdGVkIGludG8gbGludXggUV8qIGluIGxsX2Rpcl9pb2N0bCAqLwogI2RlZmluZSBMVVNUUkVfUV9RVU9UQU9OICAgIDB4ODAwMDAyICAgICAvKiB0dXJuIHF1b3RhcyBvbiAqLwogI2RlZmluZSBMVVNUUkVfUV9RVU9UQU9GRiAgIDB4ODAwMDAzICAgICAvKiB0dXJuIHF1b3RhcyBvZmYgKi8KQEAgLTY0OCwxMSArNzAwLDE2IEBACiB9CiAKIC8qIHBlci1yZWNvcmQgZmxhZ3MgKi8KLSNkZWZpbmUgQ0xGX1ZFUlNJT04gICAgIDB4MTAwMAotI2RlZmluZSBDTEZfRVhUX1ZFUlNJT04gMHgyMDAwCiAjZGVmaW5lIENMRl9GTEFHU0hJRlQgICAxMgogI2RlZmluZSBDTEZfRkxBR01BU0sgICAgKCgxVSA8PCBDTEZfRkxBR1NISUZUKSAtIDEpCiAjZGVmaW5lIENMRl9WRVJNQVNLICAgICAofkNMRl9GTEFHTUFTSykKK2VudW0gY2hhbmdlbG9nX3JlY19mbGFncyB7CisJQ0xGX1ZFUlNJT04JPSAweDEwMDAsCisJQ0xGX1JFTkFNRQk9IDB4MjAwMCwKKwlDTEZfSk9CSUQJPSAweDQwMDAsCisJQ0xGX1NVUFBPUlRFRAk9IENMRl9WRVJTSU9OIHwgQ0xGX1JFTkFNRSB8IENMRl9KT0JJRAorfTsKKwogLyogQW55dGhpbmcgdW5kZXIgdGhlIGZsYWdtYXNrIG1heSBiZSBwZXItdHlwZSAoaWYgZGVzaXJlZCkgKi8KIC8qIEZsYWdzIGZvciB1bmxpbmsgKi8KICNkZWZpbmUgQ0xGX1VOTElOS19MQVNUICAgICAgIDB4MDAwMSAvKiBVbmxpbmsgb2YgbGFzdCBoYXJkbGluayAqLwpAQCAtNzM2LDEyICs3OTMsMzUgQEAKIAkqZmxhZ3MgfD0gKGVycm9yIDw8IENMRl9IU01fRVJSX0wpOwogfQogCi0jZGVmaW5lIENSX01BWFNJWkUgY2ZzX3NpemVfcm91bmQoMipOQU1FX01BWCArIDEgKyBcCi0JCQkJICBzaXplb2Yoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjKSkKK2VudW0gY2hhbmdlbG9nX3NlbmRfZmxhZyB7CisJLyogTm90IHlldCBpbXBsZW1lbnRlZCAqLworCUNIQU5HRUxPR19GTEFHX0ZPTExPVwk9IEJJVCgwKSwKKwkvKgorCSAqIEJsb2NraW5nIElPIG1ha2VzIHNlbnNlIGluIGNhc2Ugb2Ygc2xvdyB1c2VyIHBhcnNpbmcgb2YgdGhlIHJlY29yZHMsCisJICogYnV0IGl0IGFsc28gcHJldmVudHMgdXMgZnJvbSBjbGVhbmluZyB1cCBpZiB0aGUgcmVjb3JkcyBhcmUgbm90CisJICogY29uc3VtZWQuCisJICovCisJQ0hBTkdFTE9HX0ZMQUdfQkxPQ0sJPSBCSVQoMSksCisJLyogUGFjayBqb2JpZCBpbnRvIHRoZSBjaGFuZ2Vsb2cgcmVjb3JkcyBpZiBhdmFpbGFibGUuICovCisJQ0hBTkdFTE9HX0ZMQUdfSk9CSUQJPSBCSVQoMiksCit9OwogCisjZGVmaW5lIENSX01BWFNJWkUgY2ZzX3NpemVfcm91bmQoMiAqIE5BTUVfTUFYICsgMiArIFwKKwkJCQkgIGNoYW5nZWxvZ19yZWNfb2Zmc2V0KENMRl9TVVBQT1JURUQpKQorCisvKiAzMSB1c2FibGUgYnl0ZXMgc3RyaW5nICsgbnVsbCB0ZXJtaW5hdG9yLiAqLworI2RlZmluZSBMVVNUUkVfSk9CSURfU0laRQkzMgorCisvKgorICogVGhpcyBpcyB0aGUgbWluaW1hbCBjaGFuZ2Vsb2cgcmVjb3JkLiBJdCBjYW4gY29udGFpbiBleHRlbnNpb25zCisgKiBzdWNoIGFzIHJlbmFtZSBmaWVsZHMgb3IgcHJvY2VzcyBqb2JpZC4gSXRzIGV4YWN0IGNvbnRlbnQgaXMgZGVzY3JpYmVkCisgKiBieSB0aGUgY3JfZmxhZ3MuCisgKgorICogRXh0ZW5zaW9ucyBhcmUgcGFja2VkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZWlyIGNvcnJlc3BvbmRpbmcgZmxhZ3MuCisgKi8KIHN0cnVjdCBjaGFuZ2Vsb2dfcmVjIHsKIAlfX3UxNgkJIGNyX25hbWVsZW47Ci0JX191MTYJCSBjcl9mbGFnczsgLyoqPCAoZmxhZ3MmQ0xGX0ZMQUdNQVNLKXxDTEZfVkVSU0lPTiAqLworCV9fdTE2CQkgY3JfZmxhZ3M7IC8qKjwgXGEgY2hhbmdlbG9nX3JlY19mbGFncyAqLwogCV9fdTMyCQkgY3JfdHlwZTsgIC8qKjwgXGEgY2hhbmdlbG9nX3JlY190eXBlICovCiAJX191NjQJCSBjcl9pbmRleDsgLyoqPCBjaGFuZ2Vsb2cgcmVjb3JkIG51bWJlciAqLwogCV9fdTY0CQkgY3JfcHJldjsgIC8qKjwgbGFzdCBpbmRleCBmb3IgdGhpcyB0YXJnZXQgZmlkICovCkBAIC03NTEsNTUgKzgzMSwxMzggQEAKIAkJX191MzIJIGNyX21hcmtlcmZsYWdzOyAvKio8IENMX01BUksgZmxhZ3MgKi8KIAl9OwogCXN0cnVjdCBsdV9maWQJICAgIGNyX3BmaWQ7CS8qKjwgcGFyZW50IGZpZCAqLwotCWNoYXIJCSAgY3JfbmFtZVswXTsgICAgIC8qKjwgbGFzdCBlbGVtZW50ICovCiB9IF9fcGFja2VkOwogCi0vKiBjaGFuZ2Vsb2dfZXh0X3JlYyBpcyAyKnNpemVvZihsdV9maWQpIGJpZ2dlciB0aGFuIGNoYW5nZWxvZ19yZWMsIHRvIHNhdmUKLSAqIHNwYWNlLCBvbmx5IHJlbmFtZSB1c2VzIGNoYW5nZWxvZ19leHRfcmVjLCB3aGlsZSBvdGhlcnMgdXNlIGNoYW5nZWxvZ19yZWMgdG8KLSAqIHN0b3JlIHJlY29yZHMuCi0gKi8KLXN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYyB7Ci0JX191MTYJCQljcl9uYW1lbGVuOwotCV9fdTE2CQkJY3JfZmxhZ3M7IC8qKjwgKGZsYWdzICYgQ0xGX0ZMQUdNQVNLKSB8Ci0JCQkJCSAgICoJQ0xGX0VYVF9WRVJTSU9OCi0JCQkJCSAgICovCi0JX191MzIJCQljcl90eXBlOyAgLyoqPCBcYSBjaGFuZ2Vsb2dfcmVjX3R5cGUgKi8KLQlfX3U2NAkJCWNyX2luZGV4OyAvKio8IGNoYW5nZWxvZyByZWNvcmQgbnVtYmVyICovCi0JX191NjQJCQljcl9wcmV2OyAgLyoqPCBsYXN0IGluZGV4IGZvciB0aGlzIHRhcmdldCBmaWQgKi8KLQlfX3U2NAkJCWNyX3RpbWU7Ci0JdW5pb24gewotCQlzdHJ1Y3QgbHVfZmlkCWNyX3RmaWQ7CS8qKjwgdGFyZ2V0IGZpZCAqLwotCQlfX3UzMgkJY3JfbWFya2VyZmxhZ3M7IC8qKjwgQ0xfTUFSSyBmbGFncyAqLwotCX07Ci0Jc3RydWN0IGx1X2ZpZAkJY3JfcGZpZDsJLyoqPCB0YXJnZXQgcGFyZW50IGZpZCAqLwotCXN0cnVjdCBsdV9maWQJCWNyX3NmaWQ7CS8qKjwgc291cmNlIGZpZCwgb3IgemVybyAqLwotCXN0cnVjdCBsdV9maWQJCWNyX3NwZmlkOyAgICAgLyoqPCBzb3VyY2UgcGFyZW50IGZpZCwgb3IgemVybyAqLwotCWNoYXIJCQljcl9uYW1lWzBdOyAgICAgLyoqPCBsYXN0IGVsZW1lbnQgKi8KLX0gX19wYWNrZWQ7CisvKiBDaGFuZ2Vsb2cgZXh0ZW5zaW9uIGZvciBSRU5BTUUuICovCitzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZW5hbWUgeworCXN0cnVjdCBsdV9maWQJY3Jfc2ZpZDsJLyoqPCBzb3VyY2UgZmlkLCBvciB6ZXJvICovCisJc3RydWN0IGx1X2ZpZAljcl9zcGZpZDsJLyoqPCBzb3VyY2UgcGFyZW50IGZpZCwgb3IgemVybyAqLworfTsKIAotI2RlZmluZSBDSEFOR0VMT0dfUkVDX0VYVEVOREVEKHJlYykgXAotCSgoKHJlYyktPmNyX2ZsYWdzICYgQ0xGX1ZFUk1BU0spID09IENMRl9FWFRfVkVSU0lPTikKKy8qIENoYW5nZWxvZyBleHRlbnNpb24gdG8gaW5jbHVkZSBKT0JJRC4gKi8KK3N0cnVjdCBjaGFuZ2Vsb2dfZXh0X2pvYmlkIHsKKwljaGFyCWNyX2pvYmlkW0xVU1RSRV9KT0JJRF9TSVpFXTsJLyoqPCB6ZXJvLXRlcm1pbmF0ZWQgc3RyaW5nLiAqLworfTsKIAotc3RhdGljIGlubGluZSBpbnQgY2hhbmdlbG9nX3JlY19zaXplKHN0cnVjdCBjaGFuZ2Vsb2dfcmVjICpyZWMpCitzdGF0aWMgaW5saW5lIHNpemVfdCBjaGFuZ2Vsb2dfcmVjX29mZnNldChlbnVtIGNoYW5nZWxvZ19yZWNfZmxhZ3MgY3JmKQogewotCXJldHVybiBDSEFOR0VMT0dfUkVDX0VYVEVOREVEKHJlYykgPyBzaXplb2Yoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjKSA6Ci0JCQkJCSAgICAgc2l6ZW9mKCpyZWMpOworCXNpemVfdCBzaXplID0gc2l6ZW9mKHN0cnVjdCBjaGFuZ2Vsb2dfcmVjKTsKKworCWlmIChjcmYgJiBDTEZfUkVOQU1FKQorCQlzaXplICs9IHNpemVvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZW5hbWUpOworCisJaWYgKGNyZiAmIENMRl9KT0JJRCkKKwkJc2l6ZSArPSBzaXplb2Yoc3RydWN0IGNoYW5nZWxvZ19leHRfam9iaWQpOworCisJcmV0dXJuIHNpemU7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGNoYW5nZWxvZ19yZWNfc2l6ZShzdHJ1Y3QgY2hhbmdlbG9nX3JlYyAqcmVjKQoreworCXJldHVybiBjaGFuZ2Vsb2dfcmVjX29mZnNldChyZWMtPmNyX2ZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSBzaXplX3QgY2hhbmdlbG9nX3JlY192YXJzaXplKHN0cnVjdCBjaGFuZ2Vsb2dfcmVjICpyZWMpCit7CisJcmV0dXJuIGNoYW5nZWxvZ19yZWNfc2l6ZShyZWMpIC0gc2l6ZW9mKCpyZWMpICsgcmVjLT5jcl9uYW1lbGVuOworfQorCitzdGF0aWMgaW5saW5lCitzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZW5hbWUgKmNoYW5nZWxvZ19yZWNfcmVuYW1lKHN0cnVjdCBjaGFuZ2Vsb2dfcmVjICpyZWMpCit7CisJZW51bSBjaGFuZ2Vsb2dfcmVjX2ZsYWdzIGNyZiA9IHJlYy0+Y3JfZmxhZ3MgJiBDTEZfVkVSU0lPTjsKKworCXJldHVybiAoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVuYW1lICopKChjaGFyICopcmVjICsKKwkJCQkJICAgICAgIGNoYW5nZWxvZ19yZWNfb2Zmc2V0KGNyZikpOworfQorCisvKiBUaGUgam9iaWQgZm9sbG93cyB0aGUgcmVuYW1lIGV4dGVuc2lvbiwgaWYgcHJlc2VudCAqLworc3RhdGljIGlubGluZQorc3RydWN0IGNoYW5nZWxvZ19leHRfam9iaWQgKmNoYW5nZWxvZ19yZWNfam9iaWQoc3RydWN0IGNoYW5nZWxvZ19yZWMgKnJlYykKK3sKKwllbnVtIGNoYW5nZWxvZ19yZWNfZmxhZ3MgY3JmID0gcmVjLT5jcl9mbGFncyAmCisJCQkJICAgICAgIChDTEZfVkVSU0lPTiB8IENMRl9SRU5BTUUpOworCisJcmV0dXJuIChzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9qb2JpZCAqKSgoY2hhciAqKXJlYyArCisJCQkJCSAgICAgIGNoYW5nZWxvZ19yZWNfb2Zmc2V0KGNyZikpOworfQorCisvKiBUaGUgbmFtZSBmb2xsb3dzIHRoZSByZW5hbWUgYW5kIGpvYmlkIGV4dGVuc2lvbnMsIGlmIHByZXNlbnQgKi8KIHN0YXRpYyBpbmxpbmUgY2hhciAqY2hhbmdlbG9nX3JlY19uYW1lKHN0cnVjdCBjaGFuZ2Vsb2dfcmVjICpyZWMpCiB7Ci0JcmV0dXJuIENIQU5HRUxPR19SRUNfRVhURU5ERUQocmVjKSA/Ci0JCSgoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjICopcmVjKS0+Y3JfbmFtZSA6IHJlYy0+Y3JfbmFtZTsKKwlyZXR1cm4gKGNoYXIgKilyZWMgKyBjaGFuZ2Vsb2dfcmVjX29mZnNldChyZWMtPmNyX2ZsYWdzICYKKwkJCQkJCSAgQ0xGX1NVUFBPUlRFRCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGNoYW5nZWxvZ19yZWNfc25hbWVsZW4oc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjICpyZWMpCitzdGF0aWMgaW5saW5lIHNpemVfdCBjaGFuZ2Vsb2dfcmVjX3NuYW1lbGVuKHN0cnVjdCBjaGFuZ2Vsb2dfcmVjICpyZWMpCiB7Ci0JcmV0dXJuIHJlYy0+Y3JfbmFtZWxlbiAtIHN0cmxlbihyZWMtPmNyX25hbWUpIC0gMTsKKwlyZXR1cm4gcmVjLT5jcl9uYW1lbGVuIC0gc3RybGVuKGNoYW5nZWxvZ19yZWNfbmFtZShyZWMpKSAtIDE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgY2hhciAqY2hhbmdlbG9nX3JlY19zbmFtZShzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMgKnJlYykKK3N0YXRpYyBpbmxpbmUgY2hhciAqY2hhbmdlbG9nX3JlY19zbmFtZShzdHJ1Y3QgY2hhbmdlbG9nX3JlYyAqcmVjKQogewotCXJldHVybiByZWMtPmNyX25hbWUgKyBzdHJsZW4ocmVjLT5jcl9uYW1lKSArIDE7CisJY2hhciAqY3JfbmFtZSA9IGNoYW5nZWxvZ19yZWNfbmFtZShyZWMpOworCisJcmV0dXJuIGNyX25hbWUgKyBzdHJsZW4oY3JfbmFtZSkgKyAxOworfQorCisvKioKKyAqIFJlbWFwIGEgcmVjb3JkIHRvIHRoZSBkZXNpcmVkIGZvcm1hdCBhcyBzcGVjaWZpZWQgYnkgdGhlIGNyZiBmbGFncy4KKyAqIFRoZSByZWNvcmQgbXVzdCBiZSBiaWcgZW5vdWdoIHRvIGNvbnRhaW4gdGhlIGZpbmFsIHJlbWFwcGVkIHZlcnNpb24uCisgKiBTdXBlcmZsdW91cyBleHRlbnNpb24gZmllbGRzIGFyZSByZW1vdmVkIGFuZCBtaXNzaW5nIG9uZXMgYXJlIGFkZGVkCisgKiBhbmQgemVyb2VkLiBUaGUgZmxhZ3Mgb2YgdGhlIHJlY29yZCBhcmUgdXBkYXRlZCBhY2NvcmRpbmdseS4KKyAqCisgKiBUaGUgam9iaWQgYW5kIHJlbmFtZSBleHRlbnNpb25zIGNhbiBiZSBhZGRlZCB0byBhIHJlY29yZCwgdG8gbWF0Y2ggdGhlCisgKiBmb3JtYXQgYW4gYXBwbGljYXRpb24gZXhwZWN0cywgdHlwaWNhbGx5LiBJbiB0aGlzIGNhc2UsIHRoZSBuZXdseSBhZGRlZAorICogZmllbGRzIHdpbGwgYmUgemVyb2VkLgorICogVGhlIEpvYmlkIGZpZWxkIGNhbiBiZSByZW1vdmVkLCB0byBndWFyYW50ZWUgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyCisgKiBjbGllbnRzIHRoYXQgZG9uJ3QgZXhwZWN0IHRoaXMgZmllbGQgaW4gdGhlIHJlY29yZHMgdGhleSBwcm9jZXNzLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgYXNzdW1wdGlvbnMgYXJlIGJlaW5nIG1hZGU6CisgKgktIENMRl9SRU5BTUUgd2lsbCBub3QgYmUgcmVtb3ZlZAorICoJLSBDTEZfSk9CSUQgd2lsbCBub3QgYmUgYWRkZWQgd2l0aG91dCBDTEZfUkVOQU1FIGJlaW5nIGFkZGVkIHRvbworICoKKyAqIEBwYXJhbVtpbixvdXRdICByZWMJCVRoZSByZWNvcmQgdG8gcmVtYXAuCisgKiBAcGFyYW1baW5dCSAgIGNyZl93YW50ZWQJRmxhZ3MgZGVzY3JpYmluZyB0aGUgZGVzaXJlZCBleHRlbnNpb25zLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2hhbmdlbG9nX3JlbWFwX3JlYyhzdHJ1Y3QgY2hhbmdlbG9nX3JlYyAqcmVjLAorCQkJCSAgICAgICBlbnVtIGNoYW5nZWxvZ19yZWNfZmxhZ3MgY3JmX3dhbnRlZCkKK3sKKwljaGFyICpqaWRfbW92LCAqcm5tX21vdjsKKworCWNyZl93YW50ZWQgJj0gQ0xGX1NVUFBPUlRFRDsKKworCWlmICgocmVjLT5jcl9mbGFncyAmIENMRl9TVVBQT1JURUQpID09IGNyZl93YW50ZWQpCisJCXJldHVybjsKKworCS8qIEZpcnN0IG1vdmUgdGhlIHZhcmlhYmxlLWxlbmd0aCBuYW1lIGZpZWxkICovCisJbWVtbW92ZSgoY2hhciAqKXJlYyArIGNoYW5nZWxvZ19yZWNfb2Zmc2V0KGNyZl93YW50ZWQpLAorCQljaGFuZ2Vsb2dfcmVjX25hbWUocmVjKSwgcmVjLT5jcl9uYW1lbGVuKTsKKworCS8qIExvY2F0aW9ucyBvZiBqb2JpZCBhbmQgcmVuYW1lIGV4dGVuc2lvbnMgaW4gdGhlIHJlbWFwcGVkIHJlY29yZCAqLworCWppZF9tb3YgPSAoY2hhciAqKXJlYyArCisJCSAgY2hhbmdlbG9nX3JlY19vZmZzZXQoY3JmX3dhbnRlZCAmIH5DTEZfSk9CSUQpOworCXJubV9tb3YgPSAoY2hhciAqKXJlYyArCisJCSAgY2hhbmdlbG9nX3JlY19vZmZzZXQoY3JmX3dhbnRlZCAmIH4oQ0xGX0pPQklEIHwgQ0xGX1JFTkFNRSkpOworCisJLyogTW92ZSB0aGUgZXh0ZW5zaW9uIGZpZWxkcyB0byB0aGUgZGVzaXJlZCBwb3NpdGlvbnMgKi8KKwlpZiAoKGNyZl93YW50ZWQgJiBDTEZfSk9CSUQpICYmIChyZWMtPmNyX2ZsYWdzICYgQ0xGX0pPQklEKSkKKwkJbWVtbW92ZShqaWRfbW92LCBjaGFuZ2Vsb2dfcmVjX2pvYmlkKHJlYyksCisJCQlzaXplb2Yoc3RydWN0IGNoYW5nZWxvZ19leHRfam9iaWQpKTsKKworCWlmICgoY3JmX3dhbnRlZCAmIENMRl9SRU5BTUUpICYmIChyZWMtPmNyX2ZsYWdzICYgQ0xGX1JFTkFNRSkpCisJCW1lbW1vdmUocm5tX21vdiwgY2hhbmdlbG9nX3JlY19yZW5hbWUocmVjKSwKKwkJCXNpemVvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZW5hbWUpKTsKKworCS8qIENsZWFyIG5ld2x5IGFkZGVkIGZpZWxkcyAqLworCWlmICgoY3JmX3dhbnRlZCAmIENMRl9KT0JJRCkgJiYgIShyZWMtPmNyX2ZsYWdzICYgQ0xGX0pPQklEKSkKKwkJbWVtc2V0KGppZF9tb3YsIDAsIHNpemVvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9qb2JpZCkpOworCisJaWYgKChjcmZfd2FudGVkICYgQ0xGX1JFTkFNRSkgJiYgIShyZWMtPmNyX2ZsYWdzICYgQ0xGX1JFTkFNRSkpCisJCW1lbXNldChybm1fbW92LCAwLCBzaXplb2Yoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVuYW1lKSk7CisKKwkvKiBVcGRhdGUgdGhlIHJlY29yZCdzIGZsYWdzIGFjY29yZGluZ2x5ICovCisJcmVjLT5jcl9mbGFncyA9IChyZWMtPmNyX2ZsYWdzICYgQ0xGX0ZMQUdNQVNLKSB8IGNyZl93YW50ZWQ7CiB9CiAKIHN0cnVjdCBpb2NfY2hhbmdlbG9nIHsKQEAgLTk3OCw3ICsxMTQxLDcgQEAKIC8qKiBSZXR1cm4gcG9pbnRlciB0byBkYXRhIGZpZWxkIGluIGEgaHNtIHVzZXIgcmVxdWVzdCAqLwogc3RhdGljIGlubGluZSB2b2lkICpodXJfZGF0YShzdHJ1Y3QgaHNtX3VzZXJfcmVxdWVzdCAqaHVyKQogewotCXJldHVybiAmKGh1ci0+aHVyX3VzZXJfaXRlbVtodXItPmh1cl9yZXF1ZXN0LmhyX2l0ZW1jb3VudF0pOworCXJldHVybiAmaHVyLT5odXJfdXNlcl9pdGVtW2h1ci0+aHVyX3JlcXVlc3QuaHJfaXRlbWNvdW50XTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9jZmcuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2NmZy5oCmluZGV4IDk1YTBiZTEuLjhlYjM5NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2NmZy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2NmZy5oCkBAIC0xNTEsMTMgKzE1MSwxMSBAQAogCQlsdXN0cmVfY2ZnX2J1ZnNfc2V0X3N0cmluZyhidWZzLCAwLCBuYW1lKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkICpsdXN0cmVfY2ZnX2J1ZihzdHJ1Y3QgbHVzdHJlX2NmZyAqbGNmZywgaW50IGluZGV4KQorc3RhdGljIGlubGluZSB2b2lkICpsdXN0cmVfY2ZnX2J1ZihzdHJ1Y3QgbHVzdHJlX2NmZyAqbGNmZywgX191MzIgaW5kZXgpCiB7Ci0JaW50IGk7Ci0JaW50IG9mZnNldDsKLQlpbnQgYnVmY291bnQ7Ci0KLQlMQVNTRVJUKGluZGV4ID49IDApOworCV9fdTMyIGk7CisJc2l6ZV90IG9mZnNldDsKKwlfX3UzMiBidWZjb3VudDsKIAogCWJ1ZmNvdW50ID0gbGNmZy0+bGNmZ19idWZjb3VudDsKIAlpZiAoaW5kZXggPj0gYnVmY291bnQpCkBAIC0xNzIsNyArMTcwLDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBsdXN0cmVfY2ZnX2J1ZnNfaW5pdChzdHJ1Y3QgbHVzdHJlX2NmZ19idWZzICpidWZzLAogCQkJCQlzdHJ1Y3QgbHVzdHJlX2NmZyAqbGNmZykKIHsKLQlpbnQgaTsKKwlfX3UzMiBpOwogCiAJYnVmcy0+bGNmZ19idWZjb3VudCA9IGxjZmctPmxjZmdfYnVmY291bnQ7CiAJZm9yIChpID0gMDsgaSA8IGJ1ZnMtPmxjZmdfYnVmY291bnQ7IGkrKykgewpAQCAtMTgxLDcgKzE3OSw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIGNoYXIgKmx1c3RyZV9jZmdfc3RyaW5nKHN0cnVjdCBsdXN0cmVfY2ZnICpsY2ZnLCBpbnQgaW5kZXgpCitzdGF0aWMgaW5saW5lIGNoYXIgKmx1c3RyZV9jZmdfc3RyaW5nKHN0cnVjdCBsdXN0cmVfY2ZnICpsY2ZnLCBfX3UzMiBpbmRleCkKIHsKIAljaGFyICpzOwogCkBAIC0xOTcsOCArMTk1LDggQEAKIAkgKiBvZiBkYXRhLiAgVHJ5IHRvIHVzZSB0aGUgcGFkZGluZyBmaXJzdCB0aG91Z2guCiAJICovCiAJaWYgKHNbbGNmZy0+bGNmZ19idWZsZW5zW2luZGV4XSAtIDFdICE9ICdcMCcpIHsKLQkJaW50IGxhc3QgPSBtaW4oKGludClsY2ZnLT5sY2ZnX2J1ZmxlbnNbaW5kZXhdLAotCQkJICAgICAgIGNmc19zaXplX3JvdW5kKGxjZmctPmxjZmdfYnVmbGVuc1tpbmRleF0pIC0gMSk7CisJCXNpemVfdCBsYXN0ID0gbWluKChzaXplX3QpbGNmZy0+bGNmZ19idWZsZW5zW2luZGV4XSwKKwkJCQkgIGNmc19zaXplX3JvdW5kKGxjZmctPmxjZmdfYnVmbGVuc1tpbmRleF0pIC0gMSk7CiAJCWNoYXIgbG9zdCA9IHNbbGFzdF07CiAKIAkJc1tsYXN0XSA9ICdcMCc7CkBAIC0yMTAsMTAgKzIwOCwxMCBAQAogCXJldHVybiBzOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBsdXN0cmVfY2ZnX2xlbihfX3UzMiBidWZjb3VudCwgX191MzIgKmJ1ZmxlbnMpCitzdGF0aWMgaW5saW5lIF9fdTMyIGx1c3RyZV9jZmdfbGVuKF9fdTMyIGJ1ZmNvdW50LCBfX3UzMiAqYnVmbGVucykKIHsKLQlpbnQgaTsKLQlpbnQgbGVuOworCV9fdTMyIGk7CisJX191MzIgbGVuOwogCiAJbGVuID0gTENGR19IRFJfU0laRShidWZjb3VudCk7CiAJZm9yIChpID0gMDsgaSA8IGJ1ZmNvdW50OyBpKyspCkBAIC0yNTQsNyArMjUyLDcgQEAKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGx1c3RyZV9jZmdfc2FuaXR5X2NoZWNrKHZvaWQgKmJ1ZiwgaW50IGxlbikKK3N0YXRpYyBpbmxpbmUgaW50IGx1c3RyZV9jZmdfc2FuaXR5X2NoZWNrKHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3QgbHVzdHJlX2NmZyAqbGNmZyA9IChzdHJ1Y3QgbHVzdHJlX2NmZyAqKWJ1ZjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfY29tcGF0LmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9jb21wYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjdjNDM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfY29tcGF0LmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIEdQTCBIRUFERVIgU1RBUlQKKyAqCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkCisgKiBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBJZiBub3QsIHNlZQorICogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbAorICoKKyAqIEdQTCBIRUFERVIgRU5ECisgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTAsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiwgSW50ZWwgQ29ycG9yYXRpb24uCisgKi8KKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBMdXN0cmUsIGh0dHA6Ly93d3cubHVzdHJlLm9yZy8KKyAqIEx1c3RyZSBpcyBhIHRyYWRlbWFyayBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKi8KKworI2lmbmRlZiBfTFVTVFJFX0NPTVBBVF9ICisjZGVmaW5lIF9MVVNUUkVfQ09NUEFUX0gKKworI2luY2x1ZGUgPGxpbnV4L2ZzX3N0cnVjdC5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisKKyNpbmNsdWRlICJsdXN0cmVfcGF0Y2hsZXNzX2NvbXBhdC5oIgorCisvKgorICogc2V0IEFUVFJfQkxPQ0tTIHRvIGEgaGlnaCB2YWx1ZSB0byBhdm9pZCBhbnkgcmlzayBvZiBjb2xsaXNpb24gd2l0aCBvdGhlcgorICogQVRUUl8qIGF0dHJpYnV0ZXMgKHNlZSBidWcgMTM4MjgpCisgKi8KKyNkZWZpbmUgQVRUUl9CTE9DS1MgICAgKDEgPDwgMjcpCisKKyNkZWZpbmUgY3VycmVudF9uZ3JvdXBzIGN1cnJlbnRfY3JlZCgpLT5ncm91cF9pbmZvLT5uZ3JvdXBzCisjZGVmaW5lIGN1cnJlbnRfZ3JvdXBzIGN1cnJlbnRfY3JlZCgpLT5ncm91cF9pbmZvLT5zbWFsbF9ibG9jaworCisvKgorICogT0JEIG5lZWQgd29ya2luZyByYW5kb20gZHJpdmVyLCB0aHVzIGFsbCBvdXIKKyAqIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzIG11c3QgYmUgY2FsbGVkIGFmdGVyIGRldmljZQorICogZHJpdmVyIGluaXRpYWxpemF0aW9uCisgKi8KKyNpZm5kZWYgTU9EVUxFCisjdW5kZWYgbW9kdWxlX2luaXQKKyNkZWZpbmUgbW9kdWxlX2luaXQoYSkgICAgIGxhdGVfaW5pdGNhbGwoYSkKKyNlbmRpZgorCisjZGVmaW5lIExUSU1FX1ModGltZSkJCSAgICh0aW1lLnR2X3NlYykKKworI2lmbmRlZiBRVU9UQV9PSworIyBkZWZpbmUgUVVPVEFfT0sgMAorI2VuZGlmCisjaWZuZGVmIE5PX1FVT1RBCisjIGRlZmluZSBOT19RVU9UQSAoLUVEUVVPVCkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoX0FTTV9HRU5FUklDX0JJVE9QU19FWFQyX05PTl9BVE9NSUNfSF8pICYmICFkZWZpbmVkKGV4dDJfc2V0X2JpdCkKKyMgZGVmaW5lIGV4dDJfc2V0X2JpdAkgICAgIF9fdGVzdF9hbmRfc2V0X2JpdF9sZQorIyBkZWZpbmUgZXh0Ml9jbGVhcl9iaXQJICAgX190ZXN0X2FuZF9jbGVhcl9iaXRfbGUKKyMgZGVmaW5lIGV4dDJfdGVzdF9iaXQJICAgIHRlc3RfYml0X2xlCisjIGRlZmluZSBleHQyX2ZpbmRfZmlyc3RfemVyb19iaXQgZmluZF9maXJzdF96ZXJvX2JpdF9sZQorIyBkZWZpbmUgZXh0Ml9maW5kX25leHRfemVyb19iaXQgIGZpbmRfbmV4dF96ZXJvX2JpdF9sZQorI2VuZGlmCisKKyNlbmRpZiAvKiBfTFVTVFJFX0NPTVBBVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9kbG0uaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2RsbS5oCmluZGV4IDYwMDUxYTUuLmQwMzUzNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2RsbS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2RsbS5oCkBAIC01NzMsNiArNTczLDExIEBACiB9OwogCiAvKioKKyAqIExETE1fR0lEX0FOWSBpcyB1c2VkIHRvIG1hdGNoIGFueSBncm91cCBpZCBpbiBsZGxtX2xvY2tfbWF0Y2goKS4KKyAqLworI2RlZmluZSBMRExNX0dJRF9BTlkJKChfX3U2NCktMSkKKworLyoqCiAgKiBMRExNIGxvY2sgc3RydWN0dXJlCiAgKgogICogUmVwcmVzZW50cyBhIHNpbmdsZSBMRExNIGxvY2sgYW5kIGl0cyBzdGF0ZSBpbiBtZW1vcnkuIEVhY2ggbG9jayBpcwpAQCAtOTY4LDYgKzk3Myw3IEBACiAJdm9pZCAqZWlfY2JfY3A7ICAvKiogbG9jayBjb21wbGV0aW9uIGNhbGxiYWNrICovCiAJdm9pZCAqZWlfY2JfZ2w7ICAvKiogbG9jayBnbGltcHNlIGNhbGxiYWNrICovCiAJdm9pZCAqZWlfY2JkYXRhOyAvKiogRGF0YSB0byBiZSBwYXNzZWQgaW50byBjYWxsYmFja3MuICovCisJdW5zaWduZWQgaW50IGVpX2VucV9zbGF2ZToxOyAvKiB3aGV0aGVyIGVucXVldWUgc2xhdmUgc3RyaXBlcyAqLwogfTsKIAogZXh0ZXJuIHN0cnVjdCBvYmRfb3BzIGxkbG1fb2JkX29wczsKQEAgLTEyODEsMTYgKzEyODcsNiBAQAogaW50IGludGVudF9kaXNwb3NpdGlvbihzdHJ1Y3QgbGRsbV9yZXBseSAqcmVwLCBpbnQgZmxhZyk7CiB2b2lkIGludGVudF9zZXRfZGlzcG9zaXRpb24oc3RydWN0IGxkbG1fcmVwbHkgKnJlcCwgaW50IGZsYWcpOwogCi0vKiBpb2N0bHMgZm9yIHRyeWluZyByZXF1ZXN0cyAqLwotI2RlZmluZSBJT0NfTERMTV9UWVBFCQkgICAnZicKLSNkZWZpbmUgSU9DX0xETE1fTUlOX05SCQkgNDAKLQotI2RlZmluZSBJT0NfTERMTV9URVNUCQkgICBfSU9XUignZicsIDQwLCBsb25nKQotI2RlZmluZSBJT0NfTERMTV9EVU1QCQkgICBfSU9XUignZicsIDQxLCBsb25nKQotI2RlZmluZSBJT0NfTERMTV9SRUdSRVNTX1NUQVJUCSAgX0lPV1IoJ2YnLCA0MiwgbG9uZykKLSNkZWZpbmUgSU9DX0xETE1fUkVHUkVTU19TVE9QCSAgIF9JT1dSKCdmJywgNDMsIGxvbmcpCi0jZGVmaW5lIElPQ19MRExNX01BWF9OUgkJIDQzCi0KIC8qKgogICogIk1vZGVzIiBvZiBhY3F1aXJpbmcgbG9ja19yZXMsIG5lY2Vzc2FyeSB0byB0ZWxsIGxvY2tkZXAgdGhhdCB0YWtpbmcgbW9yZQogICogdGhhbiBvbmUgbG9ja19yZXMgaXMgZGVhZC1sb2NrIHNhZmUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9kbG1fZmxhZ3MuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2RsbV9mbGFncy5oCmluZGV4IGU3ZTBjMjEuLmEwZjA2NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2RsbV9mbGFncy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2RsbV9mbGFncy5oCkBAIC0yOCwyMSArMjgsNiBAQAogLyoqIGxfZmxhZ3MgYml0cyBtYXJrZWQgYXMgImFsbF9mbGFncyIgYml0cyAqLwogI2RlZmluZSBMRExNX0ZMX0FMTF9GTEFHU19NQVNLICAgICAgICAgIDB4MDBGRkZGRkZDMDhGOTMyRlVMTAogCi0vKiogbF9mbGFncyBiaXRzIG1hcmtlZCBhcyAiYXN0IiBiaXRzICovCi0jZGVmaW5lIExETE1fRkxfQVNUX01BU0sgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDgwMDA4MDAwVUxMCi0KLS8qKiBsX2ZsYWdzIGJpdHMgbWFya2VkIGFzICJibG9ja2VkIiBiaXRzICovCi0jZGVmaW5lIExETE1fRkxfQkxPQ0tFRF9NQVNLICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDBFVUxMCi0KLS8qKiBsX2ZsYWdzIGJpdHMgbWFya2VkIGFzICJnb25lIiBiaXRzICovCi0jZGVmaW5lIExETE1fRkxfR09ORV9NQVNLICAgICAgICAgICAgICAgMHgwMDA2MDA0MDAwMDAwMDAwVUxMCi0KLS8qKiBsX2ZsYWdzIGJpdHMgbWFya2VkIGFzICJpbmhlcml0IiBiaXRzICovCi0jZGVmaW5lIExETE1fRkxfSU5IRVJJVF9NQVNLICAgICAgICAgICAgMHgwMDAwMDAwMDAwODAwMDAwVUxMCi0KLS8qKiBsX2ZsYWdzIGJpdHMgbWFya2VkIGFzICJvZmZfd2lyZSIgYml0cyAqLwotI2RlZmluZSBMRExNX0ZMX09GRl9XSVJFX01BU0sgICAgICAgICAgIDB4MDBGRkZGRkYwMDAwMDAwMFVMTAotCiAvKiogZXh0ZW50LCBtb2RlLCBvciByZXNvdXJjZSBjaGFuZ2VkICovCiAjZGVmaW5lIExETE1fRkxfTE9DS19DSEFOR0VEICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDAxVUxMIC8qIGJpdCAwICovCiAjZGVmaW5lIGxkbG1faXNfbG9ja19jaGFuZ2VkKF9sKSAgICAgICAgTERMTV9URVNUX0ZMQUcoKF9sKSwgMVVMTCA8PCAgMCkKQEAgLTM3Miw2ICszNTcsMjcgQEAKICNkZWZpbmUgbGRsbV9zZXRfZXhjbChfbCkgICAgICAgICAgICAgICBMRExNX1NFVF9GTEFHKChfbCksIDFVTEwgPDwgNTUpCiAjZGVmaW5lIGxkbG1fY2xlYXJfZXhjbChfbCkgICAgICAgICAgICAgTERMTV9DTEVBUl9GTEFHKChfbCksIDFVTEwgPDwgNTUpCiAKKy8qKiBsX2ZsYWdzIGJpdHMgbWFya2VkIGFzICJhc3QiIGJpdHMgKi8KKyNkZWZpbmUgTERMTV9GTF9BU1RfTUFTSwkJKExETE1fRkxfRkxPQ0tfREVBRExPQ0sJCXxcCisJCQkJCSBMRExNX0ZMX0FTVF9ESVNDQVJEX0RBVEEpCisKKy8qKiBsX2ZsYWdzIGJpdHMgbWFya2VkIGFzICJibG9ja2VkIiBiaXRzICovCisjZGVmaW5lIExETE1fRkxfQkxPQ0tFRF9NQVNLCQkoTERMTV9GTF9CTE9DS19HUkFOVEVECQl8XAorCQkJCQkgTERMTV9GTF9CTE9DS19DT05WCQl8XAorCQkJCQkgTERMTV9GTF9CTE9DS19XQUlUKQorCisvKiogbF9mbGFncyBiaXRzIG1hcmtlZCBhcyAiZ29uZSIgYml0cyAqLworI2RlZmluZSBMRExNX0ZMX0dPTkVfTUFTSwkJKExETE1fRkxfREVTVFJPWUVECQl8XAorCQkJCQkgTERMTV9GTF9GQUlMRUQpCisKKy8qKiBsX2ZsYWdzIGJpdHMgbWFya2VkIGFzICJpbmhlcml0IiBiaXRzICovCisvKiBGbGFncyBpbmhlcml0ZWQgZnJvbSB3aXJlIG9uIGVucXVldWUvcmVwbHkgYmV0d2VlbiBjbGllbnQvc2VydmVyLiAqLworLyogTk9fVElNRU9VVCBmbGFnIHRvIGZvcmNlIGxkbG1fbG9ja19tYXRjaCgpIHRvIHdhaXQgd2l0aCBubyB0aW1lb3V0LiAqLworLyogVEVTVF9MT0NLIGZsYWcgdG8gbm90IGxldCBURVNUIGxvY2sgdG8gYmUgZ3JhbnRlZC4gKi8KKyNkZWZpbmUgTERMTV9GTF9JTkhFUklUX01BU0sJCShMRExNX0ZMX0NBTkNFTF9PTl9CTE9DSwl8XAorCQkJCQkgTERMTV9GTF9OT19USU1FT1VUCQl8XAorCQkJCQkgTERMTV9GTF9URVNUX0xPQ0spCisKIC8qKiB0ZXN0IGZvciBsZGxtX2xvY2sgZmxhZyBiaXQgc2V0ICovCiAjZGVmaW5lIExETE1fVEVTVF9GTEFHKF9sLCBfYikgICAgICAgICgoKF9sKS0+bF9mbGFncyAmIChfYikpICE9IDApCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2VhY2wuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2VhY2wuaAppbmRleCBkMTAzOWUxLi4xZTcxYTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9lYWNsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZWFjbC5oCkBAIC00Niw2ICs0Niw3IEBACiAKICNpZmRlZiBDT05GSUdfRlNfUE9TSVhfQUNMCiAKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X2FjbF94YXR0ci5oPgogCiB0eXBlZGVmIHN0cnVjdCB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9maWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2ZpZC5oCmluZGV4IDc0MzY3MWEuLjMxNjc4MDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2ZpZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2ZpZC5oCkBAIC0yMjksNiArMjI5LDcgQEAKIAlNRERfTE9WX09CSl9PU0VRCT0gNDEyMVVMLAogCUxGU0NLX05BTUVTUEFDRV9PSUQgICAgID0gNDEyMlVMLAogCVJFTU9URV9QQVJFTlRfRElSX09JRAk9IDQxMjNVTCwKKwlTTEFWRV9MTE9HX0NBVEFMT0dTX09JRAk9IDQxMjRVTCwKIH07CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBsdV9sb2NhbF9vYmpfZmlkKHN0cnVjdCBsdV9maWQgKmZpZCwgX191MzIgb2lkKQpAQCAtMzkyLDIxICszOTMsMTkgQEAKICAqIGJ1dCB3YXMgbW92ZWQgaW50byBuYW1lWzFdIGFsb25nIHdpdGggdGhlIE9JRCB0byBhdm9pZCBjb25zdW1pbmcgdGhlCiAgKiByZW5hbWluZyBuYW1lWzIsM10gZmllbGRzIHRoYXQgbmVlZCB0byBiZSB1c2VkIGZvciB0aGUgcXVvdGEgaWRlbnRpZmllci4KICAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgbGRsbV9yZXNfaWQgKgorc3RhdGljIGlubGluZSB2b2lkCiBmaWRfYnVpbGRfcmVnX3Jlc19uYW1lKGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCwgc3RydWN0IGxkbG1fcmVzX2lkICpyZXMpCiB7CiAJbWVtc2V0KHJlcywgMCwgc2l6ZW9mKCpyZXMpKTsKIAlyZXMtPm5hbWVbTFVTVFJFX1JFU19JRF9TRVFfT0ZGXSA9IGZpZF9zZXEoZmlkKTsKIAlyZXMtPm5hbWVbTFVTVFJFX1JFU19JRF9WRVJfT0lEX09GRl0gPSBmaWRfdmVyX29pZChmaWQpOwotCi0JcmV0dXJuIHJlczsKIH0KIAogLyoKICAqIFJldHVybiB0cnVlIGlmIHJlc291cmNlIGlzIGZvciBvYmplY3QgaWRlbnRpZmllZCBieSBGSUQuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGZpZF9yZXNfbmFtZV9lcShjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQsCi0JCQkJICBjb25zdCBzdHJ1Y3QgbGRsbV9yZXNfaWQgKnJlcykKK3N0YXRpYyBpbmxpbmUgYm9vbCBmaWRfcmVzX25hbWVfZXEoY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBsZGxtX3Jlc19pZCAqcmVzKQogewogCXJldHVybiByZXMtPm5hbWVbTFVTVFJFX1JFU19JRF9TRVFfT0ZGXSA9PSBmaWRfc2VxKGZpZCkgJiYKIAkgICAgICAgcmVzLT5uYW1lW0xVU1RSRV9SRVNfSURfVkVSX09JRF9PRkZdID09IGZpZF92ZXJfb2lkKGZpZCk7CkBAIC00MTUsMjkgKzQxNCwyNSBAQAogLyoKICAqIEV4dHJhY3QgRklEIGZyb20gTERMTSByZXNvdXJjZS4gUmV2ZXJzZSBvZiBmaWRfYnVpbGRfcmVnX3Jlc19uYW1lKCkuCiAgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGx1X2ZpZCAqCitzdGF0aWMgaW5saW5lIHZvaWQKIGZpZF9leHRyYWN0X2Zyb21fcmVzX25hbWUoc3RydWN0IGx1X2ZpZCAqZmlkLCBjb25zdCBzdHJ1Y3QgbGRsbV9yZXNfaWQgKnJlcykKIHsKIAlmaWQtPmZfc2VxID0gcmVzLT5uYW1lW0xVU1RSRV9SRVNfSURfU0VRX09GRl07CiAJZmlkLT5mX29pZCA9IChfX3UzMikocmVzLT5uYW1lW0xVU1RSRV9SRVNfSURfVkVSX09JRF9PRkZdKTsKIAlmaWQtPmZfdmVyID0gKF9fdTMyKShyZXMtPm5hbWVbTFVTVFJFX1JFU19JRF9WRVJfT0lEX09GRl0gPj4gMzIpOwogCUxBU1NFUlQoZmlkX3Jlc19uYW1lX2VxKGZpZCwgcmVzKSk7Ci0KLQlyZXR1cm4gZmlkOwogfQogCiAvKgogICogQnVpbGQgKERMTSkgcmVzb3VyY2UgaWRlbnRpZmllciBmcm9tIGdsb2JhbCBxdW90YSBGSUQgYW5kIHF1b3RhIElELgogICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBsZGxtX3Jlc19pZCAqCitzdGF0aWMgaW5saW5lIHZvaWQKIGZpZF9idWlsZF9xdW90YV9yZXNfbmFtZShjb25zdCBzdHJ1Y3QgbHVfZmlkICpnbGJfZmlkLCB1bmlvbiBscXVvdGFfaWQgKnFpZCwKIAkJCSBzdHJ1Y3QgbGRsbV9yZXNfaWQgKnJlcykKIHsKIAlmaWRfYnVpbGRfcmVnX3Jlc19uYW1lKGdsYl9maWQsIHJlcyk7CiAJcmVzLT5uYW1lW0xVU1RSRV9SRVNfSURfUVVPVEFfU0VRX09GRl0gPSBmaWRfc2VxKCZxaWQtPnFpZF9maWQpOwogCXJlcy0+bmFtZVtMVVNUUkVfUkVTX0lEX1FVT1RBX1ZFUl9PSURfT0ZGXSA9IGZpZF92ZXJfb2lkKCZxaWQtPnFpZF9maWQpOwotCi0JcmV0dXJuIHJlczsKIH0KIAogLyoKQEAgLTQ1NCwxNCArNDQ5LDEyIEBACiAJCShfX3UzMikocmVzLT5uYW1lW0xVU1RSRV9SRVNfSURfUVVPVEFfVkVSX09JRF9PRkZdID4+IDMyKTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgbGRsbV9yZXNfaWQgKgorc3RhdGljIGlubGluZSB2b2lkCiBmaWRfYnVpbGRfcGRvX3Jlc19uYW1lKGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCwgdW5zaWduZWQgaW50IGhhc2gsCiAJCSAgICAgICBzdHJ1Y3QgbGRsbV9yZXNfaWQgKnJlcykKIHsKIAlmaWRfYnVpbGRfcmVnX3Jlc19uYW1lKGZpZCwgcmVzKTsKIAlyZXMtPm5hbWVbTFVTVFJFX1JFU19JRF9IU0hfT0ZGXSA9IGhhc2g7Ci0KLQlyZXR1cm4gcmVzOwogfQogCiAvKioKQEAgLTQ4Miw3ICs0NzUsNyBAQAogICogICAgcmVzIHdpbGwgYmUgYnVpbHQgZnJvbSBub3JtYWwgRklEIGRpcmVjdGx5LCBpLmUuIHJlc1swXSA9IGZfc2VxLAogICogICAgcmVzWzFdID0gZl9vaWQgKyBmX3Zlci4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIG9zdGlkX2J1aWxkX3Jlc19uYW1lKHN0cnVjdCBvc3RfaWQgKm9pLAorc3RhdGljIGlubGluZSB2b2lkIG9zdGlkX2J1aWxkX3Jlc19uYW1lKGNvbnN0IHN0cnVjdCBvc3RfaWQgKm9pLAogCQkJCQlzdHJ1Y3QgbGRsbV9yZXNfaWQgKm5hbWUpCiB7CiAJbWVtc2V0KG5hbWUsIDAsIHNpemVvZigqbmFtZSkpOwpAQCAtNDk3LDggKzQ5MCw4IEBACiAvKioKICAqIFJldHVybiB0cnVlIGlmIHRoZSByZXNvdXJjZSBpcyBmb3IgdGhlIG9iamVjdCBpZGVudGlmaWVkIGJ5IHRoaXMgaWQgJiBncm91cC4KICAqLwotc3RhdGljIGlubGluZSBpbnQgb3N0aWRfcmVzX25hbWVfZXEoc3RydWN0IG9zdF9pZCAqb2ksCi0JCQkJICAgIHN0cnVjdCBsZGxtX3Jlc19pZCAqbmFtZSkKK3N0YXRpYyBpbmxpbmUgaW50IG9zdGlkX3Jlc19uYW1lX2VxKGNvbnN0IHN0cnVjdCBvc3RfaWQgKm9pLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbGRsbV9yZXNfaWQgKm5hbWUpCiB7CiAJLyogTm90ZTogaXQgaXMganVzdCBhIHRyaWNrIGhlcmUgdG8gc2F2ZSBzb21lIGVmZm9ydCwgcHJvYmFibHkgdGhlCiAJICogY29ycmVjdCB3YXkgd291bGQgYmUgdHVybiB0aGVtIGludG8gdGhlIEZJRCBhbmQgY29tcGFyZQpAQCAtNjAzLDEzICs1OTYsMTQgQEAKIAkgKiAoZnJvbSBPSUQpLCBvciB1cCB0byAxMjhNIGlub2RlcyB3aXRob3V0IGNvbGxpc2lvbnMgZm9yIG5ldyBmaWxlcy4KIAkgKi8KIAlpbm8gPSAoKHNlcSAmIDB4MDAwZmZmZmZVTEwpIDw8IDEyKSArICgoc2VxID4+IDgpICYgMHhmZmZmZjAwMCkgKwotCSAgICAgICAoc2VxID4+ICg2NCAtICg0MC04KSkgJiAweGZmZmZmZjAwKSArCisJICAgICAgIChzZXEgPj4gKDY0IC0gKDQwIC0gOCkpICYgMHhmZmZmZmYwMCkgKwogCSAgICAgICAoZmlkX29pZChmaWQpICYgMHhmZjAwMGZmZikgKyAoKGZpZF9vaWQoZmlkKSAmIDB4MDBmZmYwMDApIDw8IDgpOwogCiAJcmV0dXJuIGlubyA/IGlubyA6IGZpZF9vaWQoZmlkKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgbHVfZmlkX2RpZmYoc3RydWN0IGx1X2ZpZCAqZmlkMSwgc3RydWN0IGx1X2ZpZCAqZmlkMikKK3N0YXRpYyBpbmxpbmUgaW50IGx1X2ZpZF9kaWZmKGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZDEsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQyKQogewogCUxBU1NFUlRGKGZpZF9zZXEoZmlkMSkgPT0gZmlkX3NlcShmaWQyKSwgImZpZDE6IkRGSUQiLCBmaWQyOiJERklEIlxuIiwKIAkJIFBGSUQoZmlkMSksIFBGSUQoZmlkMikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfaGFuZGxlcy5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfaGFuZGxlcy5oCmluZGV4IDFhNjNhNmIuLmUwNzFiYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2hhbmRsZXMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9oYW5kbGVzLmgKQEAgLTY2LDYgKzY2LDcgQEAKIHN0cnVjdCBwb3J0YWxzX2hhbmRsZSB7CiAJc3RydWN0IGxpc3RfaGVhZAkJCWhfbGluazsKIAlfX3U2NAkJCQloX2Nvb2tpZTsKKwljb25zdCB2b2lkCQkJKmhfb3duZXI7CiAJc3RydWN0IHBvcnRhbHNfaGFuZGxlX29wcwkqaF9vcHM7CiAKIAkvKiBuZXdseSBhZGRlZCBmaWVsZHMgdG8gaGFuZGxlIHRoZSBSQ1UgaXNzdWUuIC1qeGlvbmcgKi8KQEAgLTc1LDE1ICs3NiwxMyBAQAogCXVuc2lnbmVkIGludAkJCWhfaW46MTsKIH07CiAKLSNkZWZpbmUgUkNVMkhBTkRMRShyY3UpICAgIGNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCBwb3J0YWxzX2hhbmRsZSwgaF9yY3UpCi0KIC8qIGhhbmRsZXMuYyAqLwogCiAvKiBBZGQgYSBoYW5kbGUgdG8gdGhlIGhhc2ggdGFibGUgKi8KIHZvaWQgY2xhc3NfaGFuZGxlX2hhc2goc3RydWN0IHBvcnRhbHNfaGFuZGxlICosCiAJCSAgICAgICBzdHJ1Y3QgcG9ydGFsc19oYW5kbGVfb3BzICpvcHMpOwogdm9pZCBjbGFzc19oYW5kbGVfdW5oYXNoKHN0cnVjdCBwb3J0YWxzX2hhbmRsZSAqKTsKLXZvaWQgKmNsYXNzX2hhbmRsZTJvYmplY3QoX191NjQgY29va2llKTsKK3ZvaWQgKmNsYXNzX2hhbmRsZTJvYmplY3QoX191NjQgY29va2llLCBjb25zdCB2b2lkICpvd25lcik7CiB2b2lkIGNsYXNzX2hhbmRsZV9mcmVlX2NiKHN0cnVjdCByY3VfaGVhZCAqcmN1KTsKIGludCBjbGFzc19oYW5kbGVfaW5pdCh2b2lkKTsKIHZvaWQgY2xhc3NfaGFuZGxlX2NsZWFudXAodm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9pbXBvcnQuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2ltcG9ydC5oCmluZGV4IDQ0NDViZTcuLjU0NjFiYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2ltcG9ydC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2ltcG9ydC5oCkBAIC0yODUsOCArMjg1LDEwIEBACiAJCQkJICBpbXBfcmVzZW5kX3JlcGxheToxLAogCQkJCSAgLyogZGlzYWJsZSBub3JtYWwgcmVjb3ZlcnksIGZvciB0ZXN0IG9ubHkuICovCiAJCQkJICBpbXBfbm9fcGluZ2VyX3JlY292ZXI6MSwKKyNpZiBPQkRfT0NEX1ZFUlNJT04oMywgMCwgNTMsIDApID4gTFVTVFJFX1ZFUlNJT05fQ09ERQogCQkJCSAgLyogbmVlZCBJUiBNTkUgc3dhYiAqLwogCQkJCSAgaW1wX25lZWRfbW5lX3N3YWI6MSwKKyNlbmRpZgogCQkJCSAgLyogaW1wb3J0IG11c3QgYmUgcmVjb25uZWN0ZWQgaW5zdGVhZCBvZgogCQkJCSAgICogY2hvc2luZyBuZXcgY29ubmVjdGlvbgogCQkJCSAgICovCkBAIC0zMDUsMjggKzMwNyw2IEBACiAJdGltZTY0X3QJICAgICBpbXBfbGFzdF9yZXBseV90aW1lOyAgICAvKiBmb3IgaGVhbHRoIGNoZWNrICovCiB9OwogCi10eXBlZGVmIHZvaWQgKCpvYmRfaW1wb3J0X2NhbGxiYWNrKShzdHJ1Y3Qgb2JkX2ltcG9ydCAqaW1wLCB2b2lkICpjbG9zdXJlLAotCQkJCSAgICBpbnQgZXZlbnQsIHZvaWQgKmV2ZW50X2FyZywgdm9pZCAqY2JfZGF0YSk7Ci0KLS8qKgotICogU3RydWN0dXJlIGZvciBpbXBvcnQgb2JzZXJ2ZXIuCi0gKiBJdCBpcyBwb3NzaWJsZSB0byByZWdpc3RlciAib2JzZXJ2ZXIiIG9uIGFuIGltcG9ydCBhbmQgZXZlcnkgdGltZQotICogc29tZXRoaW5nIGhhcHBlbnMgdG8gYW4gaW1wb3J0IChsaWtlIGNvbm5lY3QvZXZpY3QvZGlzY29ubmVjdCkKLSAqIG9iZGVydmVyIHdpbGwgZ2V0IGl0cyBjYWxsYmFjayBjYWxsZWQgd2l0aCBldmVudCB0eXBlCi0gKi8KLXN0cnVjdCBvYmRfaW1wb3J0X29ic2VydmVyIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCSAgIG9pb19jaGFpbjsKLQlvYmRfaW1wb3J0X2NhbGxiYWNrICBvaW9fY2I7Ci0Jdm9pZAkJKm9pb19jYl9kYXRhOwotfTsKLQotdm9pZCBjbGFzc19vYnNlcnZlX2ltcG9ydChzdHJ1Y3Qgb2JkX2ltcG9ydCAqaW1wLCBvYmRfaW1wb3J0X2NhbGxiYWNrIGNiLAotCQkJICB2b2lkICpjYl9kYXRhKTsKLXZvaWQgY2xhc3NfdW5vYnNlcnZlX2ltcG9ydChzdHJ1Y3Qgb2JkX2ltcG9ydCAqaW1wLCBvYmRfaW1wb3J0X2NhbGxiYWNrIGNiLAotCQkJICAgIHZvaWQgKmNiX2RhdGEpOwotdm9pZCBjbGFzc19ub3RpZnlfaW1wb3J0X29ic2VydmVycyhzdHJ1Y3Qgb2JkX2ltcG9ydCAqaW1wLCBpbnQgZXZlbnQsCi0JCQkJICAgdm9pZCAqZXZlbnRfYXJnKTsKLQogLyogaW1wb3J0LmMgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGF0X2VzdDJ0aW1lb3V0KHVuc2lnbmVkIGludCB2YWwpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9saWIuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2xpYi5oCmluZGV4IDA2OTU4ZjIuLjZiMjMxOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2xpYi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2xpYi5oCkBAIC01MSw3ICs1MSw2IEBACiAjaW5jbHVkZSAibHVzdHJlX2NmZy5oIgogCiAvKiB0YXJnZXQuYyAqLwotc3RydWN0IGtzdGF0ZnM7CiBzdHJ1Y3QgcHRscnBjX3JlcXVlc3Q7CiBzdHJ1Y3Qgb2JkX2V4cG9ydDsKIHN0cnVjdCBsdV90YXJnZXQ7CkBAIC03NCwzMjUgKzczLDggQEAKIAkJICAgICAgdTMyIHZhbGxlbiwgdm9pZCAqdmFsLAogCQkgICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3Rfc2V0ICpzZXQpOwogCi0jZGVmaW5lIE9CRF9SRUNPVkVSWV9NQVhfVElNRSAob2JkX3RpbWVvdXQgKiAxOCkgLyogYjEzMDc5ICovCi0jZGVmaW5lIE9CRF9NQVhfSU9DVExfQlVGRkVSIENPTkZJR19MVVNUUkVfT0JEX01BWF9JT0NUTF9CVUZGRVIKLQogdm9pZCB0YXJnZXRfc2VuZF9yZXBseShzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgaW50IHJjLCBpbnQgZmFpbF9pZCk7CiAKLS8qIGNsaWVudC5jICovCi0KLWludCBjbGllbnRfc2Fub2JkX3NldHVwKHN0cnVjdCBvYmRfZGV2aWNlICpvYmRkZXYsIHN0cnVjdCBsdXN0cmVfY2ZnICpsY2ZnKTsKLXN0cnVjdCBjbGllbnRfb2JkICpjbGllbnRfY29ubjJjbGkoc3RydWN0IGx1c3RyZV9oYW5kbGUgKmNvbm4pOwotCi1zdHJ1Y3QgbWRfb3Blbl9kYXRhOwotc3RydWN0IG9iZF9jbGllbnRfaGFuZGxlIHsKLQlzdHJ1Y3QgbHVzdHJlX2hhbmRsZQkgb2NoX2ZoOwotCXN0cnVjdCBsdV9maWQJCSBvY2hfZmlkOwotCXN0cnVjdCBtZF9vcGVuX2RhdGEJKm9jaF9tb2Q7Ci0Jc3RydWN0IGx1c3RyZV9oYW5kbGUJIG9jaF9sZWFzZV9oYW5kbGU7IC8qIG9wZW4gbG9jayBmb3IgbGVhc2UgKi8KLQlfX3UzMgkJCSBvY2hfbWFnaWM7Ci0JZm1vZGVfdAkJCSBvY2hfZmxhZ3M7Ci19OwotCi0jZGVmaW5lIE9CRF9DTElFTlRfSEFORExFX01BR0lDIDB4ZDE1ZWE1ZWQKLQotLyogc3RhdGZzX3BhY2suYyAqLwotdm9pZCBzdGF0ZnNfdW5wYWNrKHN0cnVjdCBrc3RhdGZzICpzZnMsIHN0cnVjdCBvYmRfc3RhdGZzICpvc2ZzKTsKLQotLyoKLSAqIEZvciBtZCBlY2hvIGNsaWVudAotICovCi1lbnVtIG1kX2VjaG9fY21kIHsKLQlFQ0hPX01EX0NSRUFURSAgICAgICA9IDEsIC8qIE9wZW4vQ3JlYXRlIGZpbGUgb24gTURUICovCi0JRUNIT19NRF9NS0RJUgk9IDIsIC8qIE1rZGlyIG9uIE1EVCAqLwotCUVDSE9fTURfREVTVFJPWSAgICAgID0gMywgLyogVW5saW5rIGZpbGUgb24gTURUICovCi0JRUNIT19NRF9STURJUgk9IDQsIC8qIFJtZGlyIG9uIE1EVCAqLwotCUVDSE9fTURfTE9PS1VQICAgICAgID0gNSwgLyogTG9va3VwIG9uIE1EVCAqLwotCUVDSE9fTURfR0VUQVRUUiAgICAgID0gNiwgLyogR2V0YXR0ciBvbiBNRFQgKi8KLQlFQ0hPX01EX1NFVEFUVFIgICAgICA9IDcsIC8qIFNldGF0dHIgb24gTURUICovCi0JRUNIT19NRF9BTExPQ19GSUQgICAgPSA4LCAvKiBHZXQgRklEcyBmcm9tIE1EVCAqLwotfTsKLQotLyoKLSAqICAgT0JEIElPQ1RMUwotICovCi0jZGVmaW5lIE9CRF9JT0NUTF9WRVJTSU9OIDB4MDAwMTAwMDQKLQotc3RydWN0IG9iZF9pb2N0bF9kYXRhIHsKLQlfX3UzMiBpb2NfbGVuOwotCV9fdTMyIGlvY192ZXJzaW9uOwotCi0JdW5pb24gewotCQlfX3U2NCBpb2NfY29va2llOwotCQlfX3U2NCBpb2NfdTY0XzE7Ci0JfTsKLQl1bmlvbiB7Ci0JCV9fdTMyIGlvY19jb25uMTsKLQkJX191MzIgaW9jX3UzMl8xOwotCX07Ci0JdW5pb24gewotCQlfX3UzMiBpb2NfY29ubjI7Ci0JCV9fdTMyIGlvY191MzJfMjsKLQl9OwotCi0Jc3RydWN0IG9iZG8gaW9jX29iZG8xOwotCXN0cnVjdCBvYmRvIGlvY19vYmRvMjsKLQotCXU2NAkgaW9jX2NvdW50OwotCXU2NAkgaW9jX29mZnNldDsKLQlfX3UzMiAgICBpb2NfZGV2OwotCV9fdTMyICAgIGlvY19jb21tYW5kOwotCi0JX191NjQgaW9jX25pZDsKLQlfX3UzMiBpb2NfbmFsOwotCV9fdTMyIGlvY190eXBlOwotCi0JLyogYnVmZmVycyB0aGUga2VybmVsIHdpbGwgdHJlYXQgYXMgdXNlciBwb2ludGVycyAqLwotCV9fdTMyICBpb2NfcGxlbjE7Ci0Jdm9pZCBfX3VzZXIgKmlvY19wYnVmMTsKLQlfX3UzMiAgaW9jX3BsZW4yOwotCXZvaWQgX191c2VyICppb2NfcGJ1ZjI7Ci0KLQkvKiBpbmxpbmUgYnVmZmVycyBmb3IgdmFyaW91cyBhcmd1bWVudHMgKi8KLQlfX3UzMiAgaW9jX2lubGxlbjE7Ci0JY2hhciAgKmlvY19pbmxidWYxOwotCV9fdTMyICBpb2NfaW5sbGVuMjsKLQljaGFyICAqaW9jX2lubGJ1ZjI7Ci0JX191MzIgIGlvY19pbmxsZW4zOwotCWNoYXIgICppb2NfaW5sYnVmMzsKLQlfX3UzMiAgaW9jX2lubGxlbjQ7Ci0JY2hhciAgKmlvY19pbmxidWY0OwotCi0JY2hhciAgICBpb2NfYnVsa1swXTsKLX07Ci0KLXN0cnVjdCBvYmRfaW9jdGxfaGRyIHsKLQlfX3UzMiBpb2NfbGVuOwotCV9fdTMyIGlvY192ZXJzaW9uOwotfTsKLQotc3RhdGljIGlubGluZSBpbnQgb2JkX2lvY3RsX3BhY2tsZW4oc3RydWN0IG9iZF9pb2N0bF9kYXRhICpkYXRhKQotewotCWludCBsZW4gPSBjZnNfc2l6ZV9yb3VuZChzaXplb2Yoc3RydWN0IG9iZF9pb2N0bF9kYXRhKSk7Ci0KLQlsZW4gKz0gY2ZzX3NpemVfcm91bmQoZGF0YS0+aW9jX2lubGxlbjEpOwotCWxlbiArPSBjZnNfc2l6ZV9yb3VuZChkYXRhLT5pb2NfaW5sbGVuMik7Ci0JbGVuICs9IGNmc19zaXplX3JvdW5kKGRhdGEtPmlvY19pbmxsZW4zKTsKLQlsZW4gKz0gY2ZzX3NpemVfcm91bmQoZGF0YS0+aW9jX2lubGxlbjQpOwotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG9iZF9pb2N0bF9pc19pbnZhbGlkKHN0cnVjdCBvYmRfaW9jdGxfZGF0YSAqZGF0YSkKLXsKLQlpZiAoZGF0YS0+aW9jX2xlbiA+IE9CRF9NQVhfSU9DVExfQlVGRkVSKSB7Ci0JCUNFUlJPUigiT0JEIGlvY3RsOiBpb2NfbGVuIGxhcmdlciB0aGFuICVkXG4iLAotCQkgICAgICAgT0JEX01BWF9JT0NUTF9CVUZGRVIpOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKGRhdGEtPmlvY19pbmxsZW4xID4gT0JEX01BWF9JT0NUTF9CVUZGRVIpIHsKLQkJQ0VSUk9SKCJPQkQgaW9jdGw6IGlvY19pbmxsZW4xIGxhcmdlciB0aGFuIGlvY19sZW5cbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKGRhdGEtPmlvY19pbmxsZW4yID4gT0JEX01BWF9JT0NUTF9CVUZGRVIpIHsKLQkJQ0VSUk9SKCJPQkQgaW9jdGw6IGlvY19pbmxsZW4yIGxhcmdlciB0aGFuIGlvY19sZW5cbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKGRhdGEtPmlvY19pbmxsZW4zID4gT0JEX01BWF9JT0NUTF9CVUZGRVIpIHsKLQkJQ0VSUk9SKCJPQkQgaW9jdGw6IGlvY19pbmxsZW4zIGxhcmdlciB0aGFuIGlvY19sZW5cbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKGRhdGEtPmlvY19pbmxsZW40ID4gT0JEX01BWF9JT0NUTF9CVUZGRVIpIHsKLQkJQ0VSUk9SKCJPQkQgaW9jdGw6IGlvY19pbmxsZW40IGxhcmdlciB0aGFuIGlvY19sZW5cbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKGRhdGEtPmlvY19pbmxidWYxICYmICFkYXRhLT5pb2NfaW5sbGVuMSkgewotCQlDRVJST1IoIk9CRCBpb2N0bDogaW5sYnVmMSBwb2ludGVyIGJ1dCAwIGxlbmd0aFxuIik7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoZGF0YS0+aW9jX2lubGJ1ZjIgJiYgIWRhdGEtPmlvY19pbmxsZW4yKSB7Ci0JCUNFUlJPUigiT0JEIGlvY3RsOiBpbmxidWYyIHBvaW50ZXIgYnV0IDAgbGVuZ3RoXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmIChkYXRhLT5pb2NfaW5sYnVmMyAmJiAhZGF0YS0+aW9jX2lubGxlbjMpIHsKLQkJQ0VSUk9SKCJPQkQgaW9jdGw6IGlubGJ1ZjMgcG9pbnRlciBidXQgMCBsZW5ndGhcbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKGRhdGEtPmlvY19pbmxidWY0ICYmICFkYXRhLT5pb2NfaW5sbGVuNCkgewotCQlDRVJST1IoIk9CRCBpb2N0bDogaW5sYnVmNCBwb2ludGVyIGJ1dCAwIGxlbmd0aFxuIik7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoZGF0YS0+aW9jX3BidWYxICYmICFkYXRhLT5pb2NfcGxlbjEpIHsKLQkJQ0VSUk9SKCJPQkQgaW9jdGw6IHBidWYxIHBvaW50ZXIgYnV0IDAgbGVuZ3RoXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmIChkYXRhLT5pb2NfcGJ1ZjIgJiYgIWRhdGEtPmlvY19wbGVuMikgewotCQlDRVJST1IoIk9CRCBpb2N0bDogcGJ1ZjIgcG9pbnRlciBidXQgMCBsZW5ndGhcbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKGRhdGEtPmlvY19wbGVuMSAmJiAhZGF0YS0+aW9jX3BidWYxKSB7Ci0JCUNFUlJPUigiT0JEIGlvY3RsOiBwbGVuMSBzZXQgYnV0IE5VTEwgcG9pbnRlclxuIik7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoZGF0YS0+aW9jX3BsZW4yICYmICFkYXRhLT5pb2NfcGJ1ZjIpIHsKLQkJQ0VSUk9SKCJPQkQgaW9jdGw6IHBsZW4yIHNldCBidXQgTlVMTCBwb2ludGVyXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmIChvYmRfaW9jdGxfcGFja2xlbihkYXRhKSA+IGRhdGEtPmlvY19sZW4pIHsKLQkJQ0VSUk9SKCJPQkQgaW9jdGw6IHBhY2tsZW4gZXhjZWVkcyBpb2NfbGVuICglZCA+ICVkKVxuIiwKLQkJICAgICAgIG9iZF9pb2N0bF9wYWNrbGVuKGRhdGEpLCBkYXRhLT5pb2NfbGVuKTsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOwotfQotCi0jaW5jbHVkZSAib2JkX3N1cHBvcnQuaCIKLQotLyogZnVuY3Rpb24gZGVmaW5lZCBpbiBsdXN0cmUvb2JkY2xhc3MvPHBsYXRmb3JtPi88cGxhdGZvcm0+LW1vZHVsZS5jICovCi1pbnQgb2JkX2lvY3RsX2dldGRhdGEoY2hhciAqKmJ1ZiwgaW50ICpsZW4sIHZvaWQgX191c2VyICphcmcpOwotaW50IG9iZF9pb2N0bF9wb3BkYXRhKHZvaWQgX191c2VyICphcmcsIHZvaWQgKmRhdGEsIGludCBsZW4pOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgb2JkX2lvY3RsX2ZyZWVkYXRhKGNoYXIgKmJ1ZiwgaW50IGxlbikKLXsKLQlrdmZyZWUoYnVmKTsKLQlyZXR1cm47Ci19Ci0KLS8qCi0gKiBCU0QgaW9jdGwgZGVzY3JpcHRpb246Ci0gKiAjZGVmaW5lIElPQ19WMSAgICAgICBfSU9SKGcsIG4xLCBsb25nKQotICogI2RlZmluZSBJT0NfVjIgICAgICAgX0lPVyhnLCBuMiwgbG9uZykKLSAqCi0gKiBpb2N0bChmLCBJT0NfVjEsIGFyZyk7Ci0gKiBhcmcgd2lsbCBiZSB0cmVhdGVkIGFzIGEgbG9uZyB2YWx1ZSwKLSAqCi0gKiBpb2N0bChmLCBJT0NfVjIsIGFyZykKLSAqIGFyZyB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBwb2ludGVyLCBic2Qgd2lsbCBjYWxsCi0gKiBjb3B5aW4oYnVmLCBhcmcsIHNpemVvZihsb25nKSkKLSAqCi0gKiBUbyBtYWtlIEJTRCBpb2N0bCBoYW5kbGVzIGFyZ3VtZW50IGNvcnJlY3RseSBhbmQgc2ltcGxlbHksCi0gKiB3ZSBjaGFuZ2UgX0lPUiB0byBfSU9XUiBzbyBCU0Qgd2lsbCBjb3B5aW4gb2JkX2lvY3RsX2RhdGEKLSAqIGZvciB1cy4gRG9lcyB0aGlzIGNoYW5nZSBhZmZlY3QgTGludXg/ICAoWFhYIExpYW5nKQotICovCi0jZGVmaW5lIE9CRF9JT0NfREFUQV9UWVBFIGxvbmcKLQotI2RlZmluZSBPQkRfSU9DX0NSRUFURQkJIF9JT1dSKCdmJywgMTAxLCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19ERVNUUk9ZCQlfSU9XKCdmJywgMTA0LCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19QUkVBTExPQ0FURQkgICAgX0lPV1IoJ2YnLCAxMDUsIE9CRF9JT0NfREFUQV9UWVBFKQotCi0jZGVmaW5lIE9CRF9JT0NfU0VUQVRUUgkJX0lPVygnZicsIDEwNywgT0JEX0lPQ19EQVRBX1RZUEUpCi0jZGVmaW5lIE9CRF9JT0NfR0VUQVRUUgkJX0lPV1IgKCdmJywgMTA4LCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19SRUFECQkgICBfSU9XUignZicsIDEwOSwgT0JEX0lPQ19EQVRBX1RZUEUpCi0jZGVmaW5lIE9CRF9JT0NfV1JJVEUJCSAgX0lPV1IoJ2YnLCAxMTAsIE9CRF9JT0NfREFUQV9UWVBFKQotCi0jZGVmaW5lIE9CRF9JT0NfU1RBVEZTCQkgX0lPV1IoJ2YnLCAxMTMsIE9CRF9JT0NfREFUQV9UWVBFKQotI2RlZmluZSBPQkRfSU9DX1NZTkMJCSAgIF9JT1coJ2YnLCAxMTQsIE9CRF9JT0NfREFUQV9UWVBFKQotI2RlZmluZSBPQkRfSU9DX1JFQUQyCQkgIF9JT1dSKCdmJywgMTE1LCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19GT1JNQVQJCSBfSU9XUignZicsIDExNiwgT0JEX0lPQ19EQVRBX1RZUEUpCi0jZGVmaW5lIE9CRF9JT0NfUEFSVElUSU9OCSAgICAgIF9JT1dSKCdmJywgMTE3LCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19DT1BZCQkgICBfSU9XUignZicsIDEyMCwgT0JEX0lPQ19EQVRBX1RZUEUpCi0jZGVmaW5lIE9CRF9JT0NfTUlHUgkJICAgX0lPV1IoJ2YnLCAxMjEsIE9CRF9JT0NfREFUQV9UWVBFKQotI2RlZmluZSBPQkRfSU9DX1BVTkNICQkgIF9JT1dSKCdmJywgMTIyLCBPQkRfSU9DX0RBVEFfVFlQRSkKLQotI2RlZmluZSBPQkRfSU9DX01PRFVMRV9ERUJVRwkgICBfSU9XUignZicsIDEyNCwgT0JEX0lPQ19EQVRBX1RZUEUpCi0jZGVmaW5lIE9CRF9JT0NfQlJXX1JFQUQJICAgICAgIF9JT1dSKCdmJywgMTI1LCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19CUldfV1JJVEUJICAgICAgX0lPV1IoJ2YnLCAxMjYsIE9CRF9JT0NfREFUQV9UWVBFKQotI2RlZmluZSBPQkRfSU9DX05BTUUyREVWCSAgICAgICBfSU9XUignZicsIDEyNywgT0JEX0lPQ19EQVRBX1RZUEUpCi0jZGVmaW5lIE9CRF9JT0NfVVVJRDJERVYJICAgICAgIF9JT1dSKCdmJywgMTMwLCBPQkRfSU9DX0RBVEFfVFlQRSkKLQotI2RlZmluZSBPQkRfSU9DX0dFVE5BTUUJCV9JT1dSKCdmJywgMTMxLCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19HRVRNRE5BTUUJICAgICAgX0lPUignZicsIDEzMSwgY2hhcltNQVhfT0JEX05BTUVdKQotI2RlZmluZSBPQkRfSU9DX0dFVERUTkFNRQkgICAgICAgT0JEX0lPQ19HRVROQU1FCi0KLSNkZWZpbmUgT0JEX0lPQ19MT1ZfR0VUX0NPTkZJRwkgX0lPV1IoJ2YnLCAxMzIsIE9CRF9JT0NfREFUQV9UWVBFKQotI2RlZmluZSBPQkRfSU9DX0NMSUVOVF9SRUNPVkVSCSBfSU9XKCdmJywgMTMzLCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19QSU5HX1RBUkdFVAkgICAgX0lPVygnZicsIDEzNiwgT0JEX0lPQ19EQVRBX1RZUEUpCi0KLSNkZWZpbmUgT0JEX0lPQ19ERUNfRlNfVVNFX0NPVU5UICAgICAgIF9JTyAgKCdmJywgMTM5KQotI2RlZmluZSBPQkRfSU9DX05PX1RSQU5TTk8JICAgICBfSU9XKCdmJywgMTQwLCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19TRVRfUkVBRE9OTFkJICAgX0lPVygnZicsIDE0MSwgT0JEX0lPQ19EQVRBX1RZUEUpCi0jZGVmaW5lIE9CRF9JT0NfQUJPUlRfUkVDT1ZFUlkJIF9JT1IoJ2YnLCAxNDIsIE9CRF9JT0NfREFUQV9UWVBFKQotCi0jZGVmaW5lIE9CRF9JT0NfUk9PVF9TUVVBU0gJICAgIF9JT1dSKCdmJywgMTQzLCBPQkRfSU9DX0RBVEFfVFlQRSkKLQotI2RlZmluZSBPQkRfR0VUX1ZFUlNJT04JCV9JT1dSICgnZicsIDE0NCwgT0JEX0lPQ19EQVRBX1RZUEUpCi0KLSNkZWZpbmUgT0JEX0lPQ19HU1NfU1VQUE9SVAkgICAgX0lPV1IoJ2YnLCAxNDUsIE9CRF9JT0NfREFUQV9UWVBFKQotCi0jZGVmaW5lIE9CRF9JT0NfQ0xPU0VfVVVJRAkgICAgIF9JT1dSICgnZicsIDE0NywgT0JEX0lPQ19EQVRBX1RZUEUpCi0KLSNkZWZpbmUgT0JEX0lPQ19DSEFOR0VMT0dfU0VORAkgX0lPVygnZicsIDE0OCwgT0JEX0lPQ19EQVRBX1RZUEUpCi0jZGVmaW5lIE9CRF9JT0NfR0VUREVWSUNFCSAgICAgIF9JT1dSICgnZicsIDE0OSwgT0JEX0lPQ19EQVRBX1RZUEUpCi0jZGVmaW5lIE9CRF9JT0NfRklEMlBBVEgJICAgICAgIF9JT1dSICgnZicsIDE1MCwgT0JEX0lPQ19EQVRBX1RZUEUpCi0vKiBzZWUgYWxzbyA8bHVzdHJlL2x1c3RyZV91c2VyLmg+IGZvciBpb2N0bHMgMTUxLTE1MyAqLwotLyogT0JEX0lPQ19MT1ZfU0VUU1RSSVBFOiBTZWUgYWxzbyBMTF9JT0NfTE9WX1NFVFNUUklQRSAqLwotI2RlZmluZSBPQkRfSU9DX0xPVl9TRVRTVFJJUEUJICBfSU9XKCdmJywgMTU0LCBPQkRfSU9DX0RBVEFfVFlQRSkKLS8qIE9CRF9JT0NfTE9WX0dFVFNUUklQRTogU2VlIGFsc28gTExfSU9DX0xPVl9HRVRTVFJJUEUgKi8KLSNkZWZpbmUgT0JEX0lPQ19MT1ZfR0VUU1RSSVBFCSAgX0lPVygnZicsIDE1NSwgT0JEX0lPQ19EQVRBX1RZUEUpCi0vKiBPQkRfSU9DX0xPVl9TRVRFQTogU2VlIGFsc28gTExfSU9DX0xPVl9TRVRFQSAqLwotI2RlZmluZSBPQkRfSU9DX0xPVl9TRVRFQQkgICAgICBfSU9XKCdmJywgMTU2LCBPQkRfSU9DX0RBVEFfVFlQRSkKLS8qIHNlZSA8bHVzdHJlL2x1c3RyZV91c2VyLmg+IGZvciBpb2N0bHMgMTU3LTE1OSAqLwotLyogT0JEX0lPQ19RVU9UQUNIRUNLOiBTZWUgYWxzbyBMTF9JT0NfUVVPVEFDSEVDSyAqLwotI2RlZmluZSBPQkRfSU9DX1FVT1RBQ0hFQ0sJICAgICBfSU9XKCdmJywgMTYwLCBpbnQpCi0vKiBPQkRfSU9DX1BPTExfUVVPVEFDSEVDSzogU2VlIGFsc28gTExfSU9DX1BPTExfUVVPVEFDSEVDSyAqLwotI2RlZmluZSBPQkRfSU9DX1BPTExfUVVPVEFDSEVDSwlfSU9SKCdmJywgMTYxLCBzdHJ1Y3QgaWZfcXVvdGFjaGVjayAqKQotLyogT0JEX0lPQ19RVU9UQUNUTDogU2VlIGFsc28gTExfSU9DX1FVT1RBQ1RMICovCi0jZGVmaW5lIE9CRF9JT0NfUVVPVEFDVEwJICAgICAgIF9JT1dSKCdmJywgMTYyLCBzdHJ1Y3QgaWZfcXVvdGFjdGwpCi0vKiBzZWUgIGFsc28gPGx1c3RyZS9sdXN0cmVfdXNlci5oPiBmb3IgaW9jdGxzIDE2My0xNzYgKi8KLSNkZWZpbmUgT0JEX0lPQ19DSEFOR0VMT0dfUkVHCSAgX0lPVygnZicsIDE3Nywgc3RydWN0IG9iZF9pb2N0bF9kYXRhKQotI2RlZmluZSBPQkRfSU9DX0NIQU5HRUxPR19ERVJFRwlfSU9XKCdmJywgMTc4LCBzdHJ1Y3Qgb2JkX2lvY3RsX2RhdGEpCi0jZGVmaW5lIE9CRF9JT0NfQ0hBTkdFTE9HX0NMRUFSCV9JT1coJ2YnLCAxNzksIHN0cnVjdCBvYmRfaW9jdGxfZGF0YSkKLSNkZWZpbmUgT0JEX0lPQ19SRUNPUkQJCSBfSU9XUignZicsIDE4MCwgT0JEX0lPQ19EQVRBX1RZUEUpCi0jZGVmaW5lIE9CRF9JT0NfRU5EUkVDT1JECSAgICAgIF9JT1dSKCdmJywgMTgxLCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19QQVJTRQkJICBfSU9XUignZicsIDE4MiwgT0JEX0lPQ19EQVRBX1RZUEUpCi0jZGVmaW5lIE9CRF9JT0NfRE9SRUNPUkQJICAgICAgIF9JT1dSKCdmJywgMTgzLCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19QUk9DRVNTX0NGRwkgICAgX0lPV1IoJ2YnLCAxODQsIE9CRF9JT0NfREFUQV9UWVBFKQotI2RlZmluZSBPQkRfSU9DX0RVTVBfTE9HCSAgICAgICBfSU9XUignZicsIDE4NSwgT0JEX0lPQ19EQVRBX1RZUEUpCi0jZGVmaW5lIE9CRF9JT0NfQ0xFQVJfTE9HCSAgICAgIF9JT1dSKCdmJywgMTg2LCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19QQVJBTQkJICBfSU9XKCdmJywgMTg3LCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19QT09MCQkgICBfSU9XUignZicsIDE4OCwgT0JEX0lPQ19EQVRBX1RZUEUpCi0jZGVmaW5lIE9CRF9JT0NfUkVQTEFDRV9OSURTCSAgIF9JT1dSKCdmJywgMTg5LCBPQkRfSU9DX0RBVEFfVFlQRSkKLQotI2RlZmluZSBPQkRfSU9DX0NBVExPR0xJU1QJICAgICBfSU9XUignZicsIDE5MCwgT0JEX0lPQ19EQVRBX1RZUEUpCi0jZGVmaW5lIE9CRF9JT0NfTExPR19JTkZPCSAgICAgIF9JT1dSKCdmJywgMTkxLCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19MTE9HX1BSSU5UCSAgICAgX0lPV1IoJ2YnLCAxOTIsIE9CRF9JT0NfREFUQV9UWVBFKQotI2RlZmluZSBPQkRfSU9DX0xMT0dfQ0FOQ0VMCSAgICBfSU9XUignZicsIDE5MywgT0JEX0lPQ19EQVRBX1RZUEUpCi0jZGVmaW5lIE9CRF9JT0NfTExPR19SRU1PVkUJICAgIF9JT1dSKCdmJywgMTk0LCBPQkRfSU9DX0RBVEFfVFlQRSkKLSNkZWZpbmUgT0JEX0lPQ19MTE9HX0NIRUNLCSAgICAgX0lPV1IoJ2YnLCAxOTUsIE9CRF9JT0NfREFUQV9UWVBFKQotLyogT0JEX0lPQ19MTE9HX0NBVElORk8gaXMgZGVwcmVjYXRlZCAqLwotI2RlZmluZSBPQkRfSU9DX0xMT0dfQ0FUSU5GTwkgICBfSU9XUignZicsIDE5NiwgT0JEX0lPQ19EQVRBX1RZUEUpCi0KLS8qCSNkZWZpbmUgRUNIT19JT0NfR0VUX1NUUklQRSAgICBfSU9XUignZicsIDIwMCwgT0JEX0lPQ19EQVRBX1RZUEUpICovCi0vKgkjZGVmaW5lIEVDSE9fSU9DX1NFVF9TVFJJUEUgICAgX0lPV1IoJ2YnLCAyMDEsIE9CRF9JT0NfREFUQV9UWVBFKSAqLwotLyoJI2RlZmluZSBFQ0hPX0lPQ19FTlFVRVVFICAgICAgIF9JT1dSKCdmJywgMjAyLCBPQkRfSU9DX0RBVEFfVFlQRSkgKi8KLS8qCSNkZWZpbmUgRUNIT19JT0NfQ0FOQ0VMICAgICAgICBfSU9XUignZicsIDIwMywgT0JEX0lPQ19EQVRBX1RZUEUpICovCi0KLSNkZWZpbmUgT0JEX0lPQ19HRVRfT0JKX1ZFUlNJT04JX0lPUignZicsIDIxMCwgT0JEX0lPQ19EQVRBX1RZUEUpCi0KLS8qIDxsdXN0cmUvbHVzdHJlX3VzZXIuaD4gZGVmaW5lcyBpb2N0bCBudW1iZXIgMjE4LTIxOSAqLwotI2RlZmluZSBPQkRfSU9DX0dFVF9NTlRPUFQJICAgICBfSU9XKCdmJywgMjIwLCBtbnRvcHRfdCkKLQotI2RlZmluZSBPQkRfSU9DX0VDSE9fTUQJCV9JT1IoJ2YnLCAyMjEsIHN0cnVjdCBvYmRfaW9jdGxfZGF0YSkKLSNkZWZpbmUgT0JEX0lPQ19FQ0hPX0FMTE9DX1NFUQkgX0lPV1IoJ2YnLCAyMjIsIHN0cnVjdCBvYmRfaW9jdGxfZGF0YSkKLQotI2RlZmluZSBPQkRfSU9DX1NUQVJUX0xGU0NLCSAgICAgICBfSU9XUignZicsIDIzMCwgT0JEX0lPQ19EQVRBX1RZUEUpCi0jZGVmaW5lIE9CRF9JT0NfU1RPUF9MRlNDSwkgICAgICAgX0lPVygnZicsIDIzMSwgT0JEX0lPQ19EQVRBX1RZUEUpCi0jZGVmaW5lIE9CRF9JT0NfUEFVU0VfTEZTQ0sJICAgICAgIF9JT1coJ2YnLCAyMzIsIE9CRF9JT0NfREFUQV9UWVBFKQotCi0vKiBYWFggX0lPV1IoJ2YnLCAyNTAsIGxvbmcpIGhhcyBiZWVuIGRlZmluZWQgaW4KLSAqIGxpYmNmcy9pbmNsdWRlL2xpYmNmcy9saWJjZnNfcHJpdmF0ZS5oIGZvciBkZWJ1ZywgZG9uJ3QgdXNlIGl0Ci0gKi8KLQotLyogVW50aWwgc3VjaCB0aW1lIGFzIHdlIGdldF9pbmZvIHRoZSBwZXItc3RyaXBlIG1heGltdW0gZnJvbSB0aGUgT1NULAotICogd2UgZGVmaW5lIHRoaXMgdG8gYmUgMlQgLSA0aywgd2hpY2ggaXMgdGhlIGV4dDMgbWF4Ynl0ZXMuCi0gKi8KLSNkZWZpbmUgTFVTVFJFX1NUUklQRV9NQVhCWVRFUyAweDFmZmZmZmZmMDAwVUxMCi0KLS8qIFNwZWNpYWwgdmFsdWVzIGZvciByZW1vdmUgTE9WIEVBIGZyb20gZGlzayAqLwotI2RlZmluZSBMT1ZFQV9ERUxFVEVfVkFMVUVTKHNpemUsIGNvdW50LCBvZmZzZXQpIChzaXplID09IDAgJiYgY291bnQgPT0gMCAmJiBcCi0JCQkJCQkgb2Zmc2V0ID09ICh0eXBlb2Yob2Zmc2V0KSkoLTEpKQotCi0vKiAjZGVmaW5lIFBPSVNPTl9CVUxLIDAgKi8KLQogLyoKICAqIGxfd2FpdF9ldmVudCBpcyBhIGZsZXhpYmxlIHNsZWVwaW5nIGZ1bmN0aW9uLCBwZXJtaXR0aW5nIHNpbXBsZSBjYWxsZXIKICAqIGNvbmZpZ3VyYXRpb24gb2YgaW50ZXJydXB0IGFuZCB0aW1lb3V0IHNlbnNpdGl2aXR5IGFsb25nIHdpdGggYWN0aW9ucyB0bwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbGlua2VhLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9saW5rZWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDllOGJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbGlua2VhLmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIEdQTCBIRUFERVIgU1RBUlQKKyAqCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkCisgKiBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBJZiBub3QsIHNlZQorICogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbAorICoKKyAqIEdQTCBIRUFERVIgRU5ECisgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTQsIEludGVsIENvcnBvcmF0aW9uLgorICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcy4KKyAqCisgKiBBdXRob3I6IGRpIHdhbmcgPGRpLndhbmdAaW50ZWwuY29tPgorICovCisKKyNkZWZpbmUgREVGQVVMVF9MSU5LRUFfU0laRQk0MDk2CisKK3N0cnVjdCBsaW5rZWFfZGF0YSB7CisJLyoqCisJICogQnVmZmVyIHRvIGtlZXAgbGluayBFQSBib2R5LgorCSAqLworCXN0cnVjdCBsdV9idWYJCSpsZF9idWY7CisJLyoqCisJICogVGhlIG1hdGNoZWQgaGVhZGVyLCBlbnRyeSBhbmQgaXRzIGxlbmd0aCBpbiB0aGUgRUEKKwkgKi8KKwlzdHJ1Y3QgbGlua19lYV9oZWFkZXIJKmxkX2xlaDsKKwlzdHJ1Y3QgbGlua19lYV9lbnRyeQkqbGRfbGVlOworCWludAkJCWxkX3JlY2xlbjsKK307CisKK2ludCBsaW5rZWFfZGF0YV9uZXcoc3RydWN0IGxpbmtlYV9kYXRhICpsZGF0YSwgc3RydWN0IGx1X2J1ZiAqYnVmKTsKK2ludCBsaW5rZWFfaW5pdChzdHJ1Y3QgbGlua2VhX2RhdGEgKmxkYXRhKTsKK3ZvaWQgbGlua2VhX2VudHJ5X3VucGFjayhjb25zdCBzdHJ1Y3QgbGlua19lYV9lbnRyeSAqbGVlLCBpbnQgKnJlY2xlbiwKKwkJCSBzdHJ1Y3QgbHVfbmFtZSAqbG5hbWUsIHN0cnVjdCBsdV9maWQgKnBmaWQpOworaW50IGxpbmtlYV9lbnRyeV9wYWNrKHN0cnVjdCBsaW5rX2VhX2VudHJ5ICpsZWUsIGNvbnN0IHN0cnVjdCBsdV9uYW1lICpsbmFtZSwKKwkJICAgICAgY29uc3Qgc3RydWN0IGx1X2ZpZCAqcGZpZCk7CitpbnQgbGlua2VhX2FkZF9idWYoc3RydWN0IGxpbmtlYV9kYXRhICpsZGF0YSwgY29uc3Qgc3RydWN0IGx1X25hbWUgKmxuYW1lLAorCQkgICBjb25zdCBzdHJ1Y3QgbHVfZmlkICpwZmlkKTsKK3ZvaWQgbGlua2VhX2RlbF9idWYoc3RydWN0IGxpbmtlYV9kYXRhICpsZGF0YSwgY29uc3Qgc3RydWN0IGx1X25hbWUgKmxuYW1lKTsKK2ludCBsaW5rZWFfbGlua3NfZmluZChzdHJ1Y3QgbGlua2VhX2RhdGEgKmxkYXRhLCBjb25zdCBzdHJ1Y3QgbHVfbmFtZSAqbG5hbWUsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBsdV9maWQgICpwZmlkKTsKKworc3RhdGljIGlubGluZSB2b2lkIGxpbmtlYV9maXJzdF9lbnRyeShzdHJ1Y3QgbGlua2VhX2RhdGEgKmxkYXRhKQoreworCUxBU1NFUlQobGRhdGEpOworCUxBU1NFUlQobGRhdGEtPmxkX2xlaCk7CisKKwlpZiAobGRhdGEtPmxkX2xlaC0+bGVoX3JlY2NvdW50ID09IDApCisJCWxkYXRhLT5sZF9sZWUgPSBOVUxMOworCWVsc2UKKwkJbGRhdGEtPmxkX2xlZSA9IChzdHJ1Y3QgbGlua19lYV9lbnRyeSAqKShsZGF0YS0+bGRfbGVoICsgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsaW5rZWFfbmV4dF9lbnRyeShzdHJ1Y3QgbGlua2VhX2RhdGEgKmxkYXRhKQoreworCUxBU1NFUlQobGRhdGEpOworCUxBU1NFUlQobGRhdGEtPmxkX2xlaCk7CisKKwlpZiAobGRhdGEtPmxkX2xlZSkgeworCQlsZGF0YS0+bGRfbGVlID0gKHN0cnVjdCBsaW5rX2VhX2VudHJ5ICopKChjaGFyICopbGRhdGEtPmxkX2xlZSArCisJCQkJCQkJIGxkYXRhLT5sZF9yZWNsZW4pOworCQlpZiAoKGNoYXIgKilsZGF0YS0+bGRfbGVlID49ICgoY2hhciAqKWxkYXRhLT5sZF9sZWggKworCQkJCQkgICAgICBsZGF0YS0+bGRfbGVoLT5sZWhfbGVuKSkKKwkJCWxkYXRhLT5sZF9sZWUgPSBOVUxMOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2xpdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE2ODk3Ny4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9saXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogR1BMIEhFQURFUiBTVEFSVAotICoKLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQKLSAqIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IElmIG5vdCwgc2VlCi0gKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sCi0gKgotICogR1BMIEhFQURFUiBFTkQKLSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyLCBJbnRlbCBDb3Jwb3JhdGlvbi4KLSAqLwotLyoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEx1c3RyZSwgaHR0cDovL3d3dy5sdXN0cmUub3JnLwotICogTHVzdHJlIGlzIGEgdHJhZGVtYXJrIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqLwotCi0jaWZuZGVmIF9MTF9ICi0jZGVmaW5lIF9MTF9ICi0KLS8qKiBcZGVmZ3JvdXAgbGl0ZSBsaXRlCi0gKgotICogQHsKLSAqLwotCi0jaW5jbHVkZSAibGludXgvbHVzdHJlX2xpdGUuaCIKLQotI2luY2x1ZGUgIm9iZF9jbGFzcy5oIgotI2luY2x1ZGUgImx1c3RyZV9uZXQuaCIKLSNpbmNsdWRlICJsdXN0cmVfbWRzLmgiCi0jaW5jbHVkZSAibHVzdHJlX2hhLmgiCi0KLS8qIDRVTCAqIDEwMjQgKiAxMDI0ICovCi0jZGVmaW5lIExMX01BWF9CTEtTSVpFX0JJVFMgICAgICgyMikKLSNkZWZpbmUgTExfTUFYX0JMS1NJWkUJICAoMVVMPDxMTF9NQVhfQkxLU0laRV9CSVRTKQotCi0vKgotICogVGhpcyBpcyBlbWJlZGRlZCBpbnRvIGxsaXRlIHN1cGVyLWJsb2NrcyB0byBrZWVwIHRyYWNrIG9mCi0gKiBjb25uZWN0IGZsYWdzIChjYXBhYmlsaXRpZXMpIHN1cHBvcnRlZCBieSBhbGwgaW1wb3J0cyBnaXZlbiBtb3VudCBpcwotICogY29ubmVjdGVkIHRvLgotICovCi1zdHJ1Y3QgbHVzdHJlX2NsaWVudF9vY2QgewotCS8qCi0JICogVGhpcyBpcyBjb25qdW5jdGlvbiBvZiBjb25uZWN0X2ZsYWdzIGFjcm9zcyBhbGwgaW1wb3J0cyAoTE9WcykgdGhpcwotCSAqIG1vdW50IGlzIGNvbm5lY3RlZCB0by4gVGhpcyBmaWVsZCBpcyB1cGRhdGVkIGJ5IGNsX29jZF91cGRhdGUoKQotCSAqIHVuZGVyIC0+bGNvX2xvY2suCi0JICovCi0JX191NjQJICAgICAgbGNvX2ZsYWdzOwotCXN0cnVjdCBtdXRleAkgICBsY29fbG9jazsKLQlzdHJ1Y3Qgb2JkX2V4cG9ydCAqbGNvX21kX2V4cDsKLQlzdHJ1Y3Qgb2JkX2V4cG9ydCAqbGNvX2R0X2V4cDsKLX07Ci0KLS8qCi0gKiBDaGFpbiBvZiBoYXNoIG92ZXJmbG93IHBhZ2VzLgotICovCi1zdHJ1Y3QgbGxfZGlyX2NoYWluIHsKLQkvKiBYWFggc29tZXRoaW5nLiBMYXRlciAqLwotfTsKLQotc3RhdGljIGlubGluZSB2b2lkIGxsX2Rpcl9jaGFpbl9pbml0KHN0cnVjdCBsbF9kaXJfY2hhaW4gKmNoYWluKQotewotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbGxfZGlyX2NoYWluX2Zpbmkoc3RydWN0IGxsX2Rpcl9jaGFpbiAqY2hhaW4pCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBoYXNoX3hfaW5kZXgoX191NjQgaGFzaCwgaW50IGhhc2g2NCkKLXsKLQlpZiAoQklUU19QRVJfTE9ORyA9PSAzMiAmJiBoYXNoNjQpCi0JCWhhc2ggPj49IDMyOwotCS8qIHNhdmUgaGFzaCAwIGFzIGluZGV4IDAgYmVjYXVzZSBvdGhlcndpc2Ugd2UnbGwgc2F2ZSBpdCBhdAotCSAqIHBhZ2UgaW5kZXggZW5kICh+MFVMKSBhbmQgaXQgY2F1c2VzIHRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKCkKLQkgKiB0byBsb29wIGZvcmV2ZXIuCi0JICovCi0JcmV0dXJuIH4wVUwgLSAoaGFzaCArICFoYXNoKTsKLX0KLQotLyoqIEB9IGxpdGUgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9sbXYuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2xtdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZjdhZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9sbXYuaApAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqIEdQTCBIRUFERVIgU1RBUlQKKyAqCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscy4gIEEgY29weSBpcworICogaW5jbHVkZWQgaW4gdGhlIENPUFlJTkcgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBJZiBub3QsIHNlZQorICogaHR0cDovL3d3dy5zdW4uY29tL3NvZnR3YXJlL3Byb2R1Y3RzL2x1c3RyZS9kb2NzL0dQTHYyLnBkZgorICoKKyAqIEdQTCBIRUFERVIgRU5ECisgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIEludGVsIENvcnBvcmF0aW9uLgorICovCisvKgorICogbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2xtdi5oCisgKgorICogTHVzdHJlIExNViBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMuCisgKgorICogQXV0aG9yOiBEaSBXYW5nIDxkaS53YW5nQGludGVsLmNvbT4KKyAqLworCisjaWZuZGVmIF9MVVNUUkVfTE1WX0gKKyNkZWZpbmUgX0xVU1RSRV9MTVZfSAorI2luY2x1ZGUgImx1c3RyZS9sdXN0cmVfaWRsLmgiCisKK3N0cnVjdCBsbXZfb2luZm8geworCXN0cnVjdCBsdV9maWQJbG1vX2ZpZDsKKwl1MzIJCWxtb19tZHM7CisJc3RydWN0IGlub2RlCSpsbW9fcm9vdDsKK307CisKK3N0cnVjdCBsbXZfc3RyaXBlX21kIHsKKwlfX3UzMglsc21fbWRfbWFnaWM7CisJX191MzIJbHNtX21kX3N0cmlwZV9jb3VudDsKKwlfX3UzMglsc21fbWRfbWFzdGVyX21kdF9pbmRleDsKKwlfX3UzMglsc21fbWRfaGFzaF90eXBlOworCV9fdTMyCWxzbV9tZF9sYXlvdXRfdmVyc2lvbjsKKwlfX3UzMglsc21fbWRfZGVmYXVsdF9jb3VudDsKKwlfX3UzMglsc21fbWRfZGVmYXVsdF9pbmRleDsKKwljaGFyCWxzbV9tZF9wb29sX25hbWVbTE9WX01BWFBPT0xOQU1FICsgMV07CisJc3RydWN0IGxtdl9vaW5mbyBsc21fbWRfb2luZm9bMF07Cit9OworCitzdGF0aWMgaW5saW5lIGJvb2wKK2xzbV9tZF9lcShjb25zdCBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtMSwgY29uc3Qgc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbTIpCit7CisJX191MzIgaWR4OworCisJaWYgKGxzbTEtPmxzbV9tZF9tYWdpYyAhPSBsc20yLT5sc21fbWRfbWFnaWMgfHwKKwkgICAgbHNtMS0+bHNtX21kX3N0cmlwZV9jb3VudCAhPSBsc20yLT5sc21fbWRfc3RyaXBlX2NvdW50IHx8CisJICAgIGxzbTEtPmxzbV9tZF9tYXN0ZXJfbWR0X2luZGV4ICE9IGxzbTItPmxzbV9tZF9tYXN0ZXJfbWR0X2luZGV4IHx8CisJICAgIGxzbTEtPmxzbV9tZF9oYXNoX3R5cGUgIT0gbHNtMi0+bHNtX21kX2hhc2hfdHlwZSB8fAorCSAgICBsc20xLT5sc21fbWRfbGF5b3V0X3ZlcnNpb24gIT0gbHNtMi0+bHNtX21kX2xheW91dF92ZXJzaW9uIHx8CisJICAgICFzdHJjbXAobHNtMS0+bHNtX21kX3Bvb2xfbmFtZSwgbHNtMi0+bHNtX21kX3Bvb2xfbmFtZSkpCisJCXJldHVybiBmYWxzZTsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgbHNtMS0+bHNtX21kX3N0cmlwZV9jb3VudDsgaWR4KyspIHsKKwkJaWYgKCFsdV9maWRfZXEoJmxzbTEtPmxzbV9tZF9vaW5mb1tpZHhdLmxtb19maWQsCisJCQkgICAgICAgJmxzbTItPmxzbV9tZF9vaW5mb1tpZHhdLmxtb19maWQpKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCit1bmlvbiBsbXZfbWRzX21kOworCitpbnQgbG12X3VucGFja19tZChzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqKmxzbXAsCisJCSAgY29uc3QgdW5pb24gbG12X21kc19tZCAqbG1tLCBpbnQgc3RyaXBlX2NvdW50KTsKKworc3RhdGljIGlubGluZSBpbnQgbG12X2FsbG9jX21lbW1kKHN0cnVjdCBsbXZfc3RyaXBlX21kICoqbHNtcCwgaW50IHN0cmlwZV9jb3VudCkKK3sKKwlyZXR1cm4gbG12X3VucGFja19tZChOVUxMLCBsc21wLCBOVUxMLCBzdHJpcGVfY291bnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbG12X2ZyZWVfbWVtbWQoc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSkKK3sKKwlsbXZfdW5wYWNrX21kKE5VTEwsICZsc20sIE5VTEwsIDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbG12MV9sZV90b19jcHUoc3RydWN0IGxtdl9tZHNfbWRfdjEgKmxtdl9kc3QsCisJCQkJICBjb25zdCBzdHJ1Y3QgbG12X21kc19tZF92MSAqbG12X3NyYykKK3sKKwlfX3UzMiBpOworCisJbG12X2RzdC0+bG12X21hZ2ljID0gbGUzMl90b19jcHUobG12X3NyYy0+bG12X21hZ2ljKTsKKwlsbXZfZHN0LT5sbXZfc3RyaXBlX2NvdW50ID0gbGUzMl90b19jcHUobG12X3NyYy0+bG12X3N0cmlwZV9jb3VudCk7CisJbG12X2RzdC0+bG12X21hc3Rlcl9tZHRfaW5kZXggPQorCQlsZTMyX3RvX2NwdShsbXZfc3JjLT5sbXZfbWFzdGVyX21kdF9pbmRleCk7CisJbG12X2RzdC0+bG12X2hhc2hfdHlwZSA9IGxlMzJfdG9fY3B1KGxtdl9zcmMtPmxtdl9oYXNoX3R5cGUpOworCWxtdl9kc3QtPmxtdl9sYXlvdXRfdmVyc2lvbiA9IGxlMzJfdG9fY3B1KGxtdl9zcmMtPmxtdl9sYXlvdXRfdmVyc2lvbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbG12X3NyYy0+bG12X3N0cmlwZV9jb3VudDsgaSsrKQorCQlmaWRfbGVfdG9fY3B1KCZsbXZfZHN0LT5sbXZfc3RyaXBlX2ZpZHNbaV0sCisJCQkgICAgICAmbG12X3NyYy0+bG12X3N0cmlwZV9maWRzW2ldKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxtdl9sZV90b19jcHUodW5pb24gbG12X21kc19tZCAqbG12X2RzdCwKKwkJCQkgY29uc3QgdW5pb24gbG12X21kc19tZCAqbG12X3NyYykKK3sKKwlzd2l0Y2ggKGxlMzJfdG9fY3B1KGxtdl9zcmMtPmxtdl9tYWdpYykpIHsKKwljYXNlIExNVl9NQUdJQ19WMToKKwkJbG12MV9sZV90b19jcHUoJmxtdl9kc3QtPmxtdl9tZF92MSwgJmxtdl9zcmMtPmxtdl9tZF92MSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworLyogVGhpcyBoYXNoIGlzIG9ubHkgZm9yIHRlc3RpbmcgcHVycG9zZSAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK2xtdl9oYXNoX2FsbF9jaGFycyh1bnNpZ25lZCBpbnQgY291bnQsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKW5hbWU7CisJdW5zaWduZWQgaW50IGMgPSAwOworCisJd2hpbGUgKC0tbmFtZWxlbiA+PSAwKQorCQljICs9IHBbbmFtZWxlbl07CisKKwljID0gYyAlIGNvdW50OworCisJcmV0dXJuIGM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CitsbXZfaGFzaF9mbnYxYSh1bnNpZ25lZCBpbnQgY291bnQsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKQoreworCV9fdTY0IGhhc2g7CisKKwloYXNoID0gbHVzdHJlX2hhc2hfZm52XzFhXzY0KG5hbWUsIG5hbWVsZW4pOworCisJcmV0dXJuIGRvX2RpdihoYXNoLCBjb3VudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxtdl9uYW1lX3RvX3N0cmlwZV9pbmRleChfX3UzMiBsbXZfaGFzaF90eXBlLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgc3RyaXBlX2NvdW50LAorCQkJCQkgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbikKK3sKKwlfX3UzMiBoYXNoX3R5cGUgPSBsbXZfaGFzaF90eXBlICYgTE1WX0hBU0hfVFlQRV9NQVNLOworCWludCBpZHg7CisKKwlMQVNTRVJUKG5hbWVsZW4gPiAwKTsKKwlpZiAoc3RyaXBlX2NvdW50IDw9IDEpCisJCXJldHVybiAwOworCisJLyogZm9yIG1pZ3JhdGluZyBvYmplY3QsIGFsd2F5cyBzdGFydCBmcm9tIDAgc3RyaXBlICovCisJaWYgKGxtdl9oYXNoX3R5cGUgJiBMTVZfSEFTSF9GTEFHX01JR1JBVElPTikKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGhhc2hfdHlwZSkgeworCWNhc2UgTE1WX0hBU0hfVFlQRV9BTExfQ0hBUlM6CisJCWlkeCA9IGxtdl9oYXNoX2FsbF9jaGFycyhzdHJpcGVfY291bnQsIG5hbWUsIG5hbWVsZW4pOworCQlicmVhazsKKwljYXNlIExNVl9IQVNIX1RZUEVfRk5WXzFBXzY0OgorCQlpZHggPSBsbXZfaGFzaF9mbnYxYShzdHJpcGVfY291bnQsIG5hbWUsIG5hbWVsZW4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZHggPSAtRUJBREZEOworCQlicmVhazsKKwl9CisJQ0RFQlVHKERfSU5GTywgIm5hbWUgJS4qcyBoYXNoX3R5cGUgJWQgaWR4ICVkXG4iLCBuYW1lbGVuLCBuYW1lLAorCSAgICAgICBoYXNoX3R5cGUsIGlkeCk7CisKKwlyZXR1cm4gaWR4OworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgbG12X2lzX2tub3duX2hhc2hfdHlwZShfX3UzMiB0eXBlKQoreworCXJldHVybiAodHlwZSAmIExNVl9IQVNIX1RZUEVfTUFTSykgPT0gTE1WX0hBU0hfVFlQRV9GTlZfMUFfNjQgfHwKKwkgICAgICAgKHR5cGUgJiBMTVZfSEFTSF9UWVBFX01BU0spID09IExNVl9IQVNIX1RZUEVfQUxMX0NIQVJTOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2xvZy5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbG9nLmgKaW5kZXggYjk2ZTAyMy4uOTk1YjI2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbG9nLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbG9nLmgKQEAgLTI3NywxMiArMjc3LDExIEBACiAJX19sbG9nX2N0eHRfcHV0KE5VTEwsIGN0eHQpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbGxvZ19ncm91cF9pbml0KHN0cnVjdCBvYmRfbGxvZ19ncm91cCAqb2xnLCBpbnQgZ3JvdXApCitzdGF0aWMgaW5saW5lIHZvaWQgbGxvZ19ncm91cF9pbml0KHN0cnVjdCBvYmRfbGxvZ19ncm91cCAqb2xnKQogewogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm9sZy0+b2xnX3dhaXRxKTsKIAlzcGluX2xvY2tfaW5pdCgmb2xnLT5vbGdfbG9jayk7CiAJbXV0ZXhfaW5pdCgmb2xnLT5vbGdfY2F0X3Byb2Nlc3NpbmcpOwotCW9sZy0+b2xnX3NlcSA9IGdyb3VwOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBsbG9nX2dyb3VwX3NldF9jdHh0KHN0cnVjdCBvYmRfbGxvZ19ncm91cCAqb2xnLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbWRjLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9tZGMuaAppbmRleCBmYTYyYjk1Li44ZmMyZDNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9tZGMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9tZGMuaApAQCAtOTYsNyArOTYsNyBAQAogCQkJCSAgICBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQpCiB7CiAJaWYgKGl0ICYmIChpdC0+aXRfb3AgPT0gSVRfR0VUQVRUUiB8fCBpdC0+aXRfb3AgPT0gSVRfTE9PS1VQIHx8Ci0JCSAgIGl0LT5pdF9vcCA9PSBJVF9MQVlPVVQpKQorCQkgICBpdC0+aXRfb3AgPT0gSVRfTEFZT1VUIHx8IGl0LT5pdF9vcCA9PSBJVF9SRUFERElSKSkKIAkJcmV0dXJuOwogCiAJLyogVGhpcyB3b3VsZCBub3JtYWxseSBibG9jayB1bnRpbCB0aGUgZXhpc3RpbmcgcmVxdWVzdCBmaW5pc2hlcy4KQEAgLTEzNiw3ICsxMzYsNyBAQAogCQkJCSAgICBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQpCiB7CiAJaWYgKGl0ICYmIChpdC0+aXRfb3AgPT0gSVRfR0VUQVRUUiB8fCBpdC0+aXRfb3AgPT0gSVRfTE9PS1VQIHx8Ci0JCSAgIGl0LT5pdF9vcCA9PSBJVF9MQVlPVVQpKQorCQkgICBpdC0+aXRfb3AgPT0gSVRfTEFZT1VUIHx8IGl0LT5pdF9vcCA9PSBJVF9SRUFERElSKSkKIAkJcmV0dXJuOwogCiAJaWYgKGxjay0+cnBjbF9pdCA9PSBNRENfRkFLRV9SUENMX0lUKSB7IC8qIE9CRF9GQUlMX01EQ19SUENTX1NFTSAqLwpAQCAtMTU2LDM0ICsxNTYsNDQgQEAKIAltdXRleF91bmxvY2soJmxjay0+cnBjbF9tdXRleCk7CiB9CiAKLS8qIFVwZGF0ZSB0aGUgbWF4aW11bSBvYnNlcnZlZCBlYXNpemUgYW5kIGNvb2tpZXNpemUuICBUaGUgZGVmYXVsdCBlYXNpemUKLSAqIGFuZCBjb29raWVzaXplIGlzIGluaXRpYWxpemVkIHRvIHRoZSBtaW5pbXVtIHZhbHVlIGJ1dCBhbGxvd2VkIHRvIGdyb3cKLSAqIHVwIHRvIGEgc2luZ2xlIHBhZ2UgaW4gc2l6ZSBpZiByZXF1aXJlZCB0byBoYW5kbGUgdGhlIGNvbW1vbiBjYXNlLgorLyoqCisgKiBVcGRhdGUgdGhlIG1heGltdW0gcG9zc2libGUgZWFzaXplIGFuZCBjb29raWVzaXplLgorICoKKyAqIFRoZSB2YWx1ZXMgYXJlIGxlYXJuZWQgZnJvbSBwdGxycGMgcmVwbGllcyBzZW50IGJ5IHRoZSBNRFQuICBUaGUKKyAqIGRlZmF1bHQgZWFzaXplIGFuZCBjb29raWVzaXplIGlzIGluaXRpYWxpemVkIHRvIHRoZSBtaW5pbXVtIHZhbHVlIGJ1dAorICogYWxsb3dlZCB0byBncm93IHVwIHRvIGEgc2luZ2xlIHBhZ2UgaW4gc2l6ZSBpZiByZXF1aXJlZCB0byBoYW5kbGUgdGhlCisgKiBjb21tb24gY2FzZS4KKyAqCisgKiBcc2VlIGNsaWVudF9vYmQ6OmNsX2RlZmF1bHRfbWRzX2Vhc2l6ZSBhbmQKKyAqIGNsaWVudF9vYmQ6OmNsX2RlZmF1bHRfbWRzX2Nvb2tpZXNpemUKKyAqCisgKiBccGFyYW1baW5dIGV4cAlleHBvcnQgZm9yIE1EQyBkZXZpY2UKKyAqIFxwYXJhbVtpbl0gYm9keQlib2R5IG9mIHB0bHJwYyByZXBseSBmcm9tIE1EVAorICoKICAqLwogc3RhdGljIGlubGluZSB2b2lkIG1kY191cGRhdGVfbWF4X2VhX2Zyb21fYm9keShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAogCQkJCQkgICAgICAgc3RydWN0IG1kdF9ib2R5ICpib2R5KQogewotCWlmIChib2R5LT52YWxpZCAmIE9CRF9NRF9GTE1PREVBU0laRSkgeworCWlmIChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxNT0RFQVNJWkUpIHsKIAkJc3RydWN0IGNsaWVudF9vYmQgKmNsaSA9ICZleHAtPmV4cF9vYmQtPnUuY2xpOworCQl1MzIgZGVmX2Nvb2tpZXNpemUsIGRlZl9lYXNpemU7CiAKLQkJaWYgKGNsaS0+Y2xfbWF4X21kc19lYXNpemUgPCBib2R5LT5tYXhfbWRzaXplKSB7Ci0JCQljbGktPmNsX21heF9tZHNfZWFzaXplID0gYm9keS0+bWF4X21kc2l6ZTsKLQkJCWNsaS0+Y2xfZGVmYXVsdF9tZHNfZWFzaXplID0KLQkJCSAgICBtaW5fdChfX3UzMiwgYm9keS0+bWF4X21kc2l6ZSwgUEFHRV9TSVpFKTsKLQkJfQotCQlpZiAoY2xpLT5jbF9tYXhfbWRzX2Nvb2tpZXNpemUgPCBib2R5LT5tYXhfY29va2llc2l6ZSkgewotCQkJY2xpLT5jbF9tYXhfbWRzX2Nvb2tpZXNpemUgPSBib2R5LT5tYXhfY29va2llc2l6ZTsKLQkJCWNsaS0+Y2xfZGVmYXVsdF9tZHNfY29va2llc2l6ZSA9Ci0JCQkgICAgbWluX3QoX191MzIsIGJvZHktPm1heF9jb29raWVzaXplLCBQQUdFX1NJWkUpOwotCQl9CisJCWlmIChjbGktPmNsX21heF9tZHNfZWFzaXplIDwgYm9keS0+bWJvX21heF9tZHNpemUpCisJCQljbGktPmNsX21heF9tZHNfZWFzaXplID0gYm9keS0+bWJvX21heF9tZHNpemU7CisKKwkJZGVmX2Vhc2l6ZSA9IG1pbl90KF9fdTMyLCBib2R5LT5tYm9fbWF4X21kc2l6ZSwKKwkJCQkgICBPQkRfTUFYX0RFRkFVTFRfRUFfU0laRSk7CisJCWNsaS0+Y2xfZGVmYXVsdF9tZHNfZWFzaXplID0gZGVmX2Vhc2l6ZTsKKworCQlpZiAoY2xpLT5jbF9tYXhfbWRzX2Nvb2tpZXNpemUgPCBib2R5LT5tYm9fbWF4X2Nvb2tpZXNpemUpCisJCQljbGktPmNsX21heF9tZHNfY29va2llc2l6ZSA9IGJvZHktPm1ib19tYXhfY29va2llc2l6ZTsKKworCQlkZWZfY29va2llc2l6ZSA9IG1pbl90KF9fdTMyLCBib2R5LT5tYm9fbWF4X2Nvb2tpZXNpemUsCisJCQkJICAgICAgIE9CRF9NQVhfREVGQVVMVF9DT09LSUVfU0laRSk7CisJCWNsaS0+Y2xfZGVmYXVsdF9tZHNfY29va2llc2l6ZSA9IGRlZl9jb29raWVzaXplOwogCX0KIH0KIAotc3RydWN0IG1kY19jYWNoZV93YWl0ZXIgewotCXN0cnVjdCBsaXN0X2hlYWQJICAgICAgbWN3X2VudHJ5OwotCXdhaXRfcXVldWVfaGVhZF90CSAgICAgbWN3X3dhaXRxOwotfTsKLQogLyogbWRjL21kY19sb2Nrcy5jICovCiBpbnQgaXRfb3Blbl9lcnJvcihpbnQgcGhhc2UsIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX21kcy5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbWRzLmgKaW5kZXggNDEwNGJkOS4uMjNhN2U0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbWRzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbWRzLmgKQEAgLTU4LDkgKzU4LDYgQEAKICNkZWZpbmUgTUREX09CRF9OQU1FICAgICAibWRkX29iZCIKICNkZWZpbmUgTUREX09CRF9VVUlEICAgICAibWRkX29iZF91dWlkIgogCi0vKiB0aGVzZSBhcmUgbG9jYWwgZmxhZ3MsIHVzZWQgb25seSBvbiB0aGUgY2xpZW50LCBwcml2YXRlICovCi0jZGVmaW5lIE1fQ0hFQ0tfU1RBTEUJICAgMDIwMDAwMDAwMAotCiAvKiogQH0gbWRzICovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbmV0LmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9uZXQuaAppbmRleCBkNWRlYmQ2Li5lOWFiYTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9uZXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9uZXQuaApAQCAtMjYxLDcgKzI2MSwxMCBAQAogCiAjZGVmaW5lIE1EU19NQVhSRVFTSVpFCQkoNSAqIDEwMjQpCS8qID49IDQ3MzYgKi8KIAotI2RlZmluZSBPU1RfTUFYUkVRU0laRQkJKDUgKiAxMDI0KQorLyoqCisgKiBGSUVNQVAgcmVxdWVzdCBjYW4gYmUgNEsrIGZvciBub3cKKyAqLworI2RlZmluZSBPU1RfTUFYUkVRU0laRQkJKDE2ICogMTAyNCkKIAogLyogTWFjcm8gdG8gaGlkZSBhIHR5cGVjYXN0LiAqLwogI2RlZmluZSBwdGxycGNfcmVxX2FzeW5jX2FyZ3MocmVxKSAoKHZvaWQgKikmcmVxLT5ycV9hc3luY19hcmdzKQpAQCAtNTcwLDEzICs1NzMsMTMgQEAKIAkgKgogCSAqIFxwYXJhbVtpbixvdXRdIHBvbGljeSBUaGUgcG9saWN5IGJlaW5nIGluaXRpYWxpemVkCiAJICovCi0JaW50CSgqb3BfcG9saWN5X2luaXQpIChzdHJ1Y3QgcHRscnBjX25yc19wb2xpY3kgKnBvbGljeSk7CisJaW50CSgqb3BfcG9saWN5X2luaXQpKHN0cnVjdCBwdGxycGNfbnJzX3BvbGljeSAqcG9saWN5KTsKIAkvKioKIAkgKiBDYWxsZWQgZHVyaW5nIHBvbGljeSB1bnJlZ2lzdHJhdGlvbjsgdGhpcyBvcGVyYXRpb24gaXMgb3B0aW9uYWwuCiAJICoKIAkgKiBccGFyYW1baW4sb3V0XSBwb2xpY3kgVGhlIHBvbGljeSBiZWluZyB1bnJlZ2lzdGVyZWQvZmluYWxpemVkCiAJICovCi0Jdm9pZAkoKm9wX3BvbGljeV9maW5pKSAoc3RydWN0IHB0bHJwY19ucnNfcG9saWN5ICpwb2xpY3kpOworCXZvaWQJKCpvcF9wb2xpY3lfZmluaSkoc3RydWN0IHB0bHJwY19ucnNfcG9saWN5ICpwb2xpY3kpOwogCS8qKgogCSAqIENhbGxlZCB3aGVuIGFjdGl2YXRpbmcgYSBwb2xpY3kgdmlhIGxwcm9jZnM7IHBvbGljaWVzIGFsbG9jYXRlIGFuZAogCSAqIGluaXRpYWxpemUgdGhlaXIgcmVzb3VyY2VzIGhlcmU7IHRoaXMgb3BlcmF0aW9uIGlzIG9wdGlvbmFsLgpAQCAtNTg1LDcgKzU4OCw3IEBACiAJICoKIAkgKiBcc2VlIG5yc19wb2xpY3lfc3RhcnRfbG9ja2VkKCkKIAkgKi8KLQlpbnQJKCpvcF9wb2xpY3lfc3RhcnQpIChzdHJ1Y3QgcHRscnBjX25yc19wb2xpY3kgKnBvbGljeSk7CisJaW50CSgqb3BfcG9saWN5X3N0YXJ0KShzdHJ1Y3QgcHRscnBjX25yc19wb2xpY3kgKnBvbGljeSk7CiAJLyoqCiAJICogQ2FsbGVkIHdoZW4gZGVhY3RpdmF0aW5nIGEgcG9saWN5IHZpYSBscHJvY2ZzOyBwb2xpY2llcyBkZWFsbG9jYXRlCiAJICogdGhlaXIgcmVzb3VyY2VzIGhlcmU7IHRoaXMgb3BlcmF0aW9uIGlzIG9wdGlvbmFsCkBAIC01OTQsNyArNTk3LDcgQEAKIAkgKgogCSAqIFxzZWUgbnJzX3BvbGljeV9zdG9wMCgpCiAJICovCi0Jdm9pZAkoKm9wX3BvbGljeV9zdG9wKSAoc3RydWN0IHB0bHJwY19ucnNfcG9saWN5ICpwb2xpY3kpOworCXZvaWQJKCpvcF9wb2xpY3lfc3RvcCkoc3RydWN0IHB0bHJwY19ucnNfcG9saWN5ICpwb2xpY3kpOwogCS8qKgogCSAqIFVzZWQgZm9yIHBvbGljeS1zcGVjaWZpYyBvcGVyYXRpb25zOyBpLmUuIG5vdCBnZW5lcmljIG9uZXMgbGlrZQogCSAqIFxlIFBUTFJQQ19OUlNfQ1RMX1NUQVJUIGFuZCBcZSBQVExSUENfTlJTX0NUTF9HRVRfSU5GTzsgYW5hbG9nb3VzCkBAIC02MTAsOCArNjEzLDggQEAKIAkgKgogCSAqIFxzZWUgcHRscnBjX25yc19wb2xpY3lfY29udHJvbCgpCiAJICovCi0JaW50CSgqb3BfcG9saWN5X2N0bCkgKHN0cnVjdCBwdGxycGNfbnJzX3BvbGljeSAqcG9saWN5LAotCQkJCSAgZW51bSBwdGxycGNfbnJzX2N0bCBvcGMsIHZvaWQgKmFyZyk7CisJaW50CSgqb3BfcG9saWN5X2N0bCkoc3RydWN0IHB0bHJwY19ucnNfcG9saWN5ICpwb2xpY3ksCisJCQkJIGVudW0gcHRscnBjX25yc19jdGwgb3BjLCB2b2lkICphcmcpOwogCiAJLyoqCiAJICogQ2FsbGVkIHdoZW4gb2J0YWluaW5nIHJlZmVyZW5jZXMgdG8gdGhlIHJlc291cmNlcyBvZiB0aGUgcmVzb3VyY2UKQEAgLTY0OCwxMSArNjUxLDExIEBACiAJICogXHNlZSBwdGxycGNfbnJzX3JlcV9pbml0aWFsaXplKCkKIAkgKiBcc2VlIHB0bHJwY19ucnNfaHByZXFfYWRkX25vbG9jaygpCiAJICovCi0JaW50CSgqb3BfcmVzX2dldCkgKHN0cnVjdCBwdGxycGNfbnJzX3BvbGljeSAqcG9saWN5LAotCQkJICAgICAgIHN0cnVjdCBwdGxycGNfbnJzX3JlcXVlc3QgKm5ycSwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcHRscnBjX25yc19yZXNvdXJjZSAqcGFyZW50LAotCQkJICAgICAgIHN0cnVjdCBwdGxycGNfbnJzX3Jlc291cmNlICoqcmVzcCwKLQkJCSAgICAgICBib29sIG1vdmluZ19yZXEpOworCWludAkoKm9wX3Jlc19nZXQpKHN0cnVjdCBwdGxycGNfbnJzX3BvbGljeSAqcG9saWN5LAorCQkJICAgICAgc3RydWN0IHB0bHJwY19ucnNfcmVxdWVzdCAqbnJxLAorCQkJICAgICAgY29uc3Qgc3RydWN0IHB0bHJwY19ucnNfcmVzb3VyY2UgKnBhcmVudCwKKwkJCSAgICAgIHN0cnVjdCBwdGxycGNfbnJzX3Jlc291cmNlICoqcmVzcCwKKwkJCSAgICAgIGJvb2wgbW92aW5nX3JlcSk7CiAJLyoqCiAJICogQ2FsbGVkIHdoZW4gcmVsZWFzaW5nIHJlZmVyZW5jZXMgdGFrZW4gZm9yIHJlc291cmNlcyBpbiB0aGUgcmVzb3VyY2UKIAkgKiBoaWVyYXJjaHkgZm9yIHRoZSByZXF1ZXN0OyB0aGlzIG9wZXJhdGlvbiBpcyBvcHRpb25hbC4KQEAgLTY2Myw4ICs2NjYsOCBAQAogCSAqIFxzZWUgcHRscnBjX25yc19yZXFfZmluYWxpemUoKQogCSAqIFxzZWUgcHRscnBjX25yc19ocHJlcV9hZGRfbm9sb2NrKCkKIAkgKi8KLQl2b2lkCSgqb3BfcmVzX3B1dCkgKHN0cnVjdCBwdGxycGNfbnJzX3BvbGljeSAqcG9saWN5LAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBwdGxycGNfbnJzX3Jlc291cmNlICpyZXMpOworCXZvaWQJKCpvcF9yZXNfcHV0KShzdHJ1Y3QgcHRscnBjX25yc19wb2xpY3kgKnBvbGljeSwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBwdGxycGNfbnJzX3Jlc291cmNlICpyZXMpOwogCiAJLyoqCiAJICogT2J0YWlucyBhIHJlcXVlc3QgZm9yIGhhbmRsaW5nIGZyb20gdGhlIHBvbGljeSwgYW5kIG9wdGlvbmFsbHkKQEAgLTY4Myw4ICs2ODYsOCBAQAogCSAqIFxzZWUgcHRscnBjX25yc19yZXFfZ2V0X25vbG9jaygpCiAJICovCiAJc3RydWN0IHB0bHJwY19ucnNfcmVxdWVzdCAqCi0JCSgqb3BfcmVxX2dldCkgKHN0cnVjdCBwdGxycGNfbnJzX3BvbGljeSAqcG9saWN5LCBib29sIHBlZWssCi0JCQkgICAgICAgYm9vbCBmb3JjZSk7CisJCSgqb3BfcmVxX2dldCkoc3RydWN0IHB0bHJwY19ucnNfcG9saWN5ICpwb2xpY3ksIGJvb2wgcGVlaywKKwkJCSAgICAgIGJvb2wgZm9yY2UpOwogCS8qKgogCSAqIENhbGxlZCB3aGVuIGF0dGVtcHRpbmcgdG8gYWRkIGEgcmVxdWVzdCB0byBhIHBvbGljeSBmb3IgbGF0ZXIKIAkgKiBoYW5kbGluZzsgdGhpcyBvcGVyYXRpb24gaXMgbWFuZGF0b3J5LgpAQCAtNjk3LDggKzcwMCw4IEBACiAJICoKIAkgKiBcc2VlIHB0bHJwY19ucnNfcmVxX2FkZF9ub2xvY2soKQogCSAqLwotCWludAkoKm9wX3JlcV9lbnF1ZXVlKSAoc3RydWN0IHB0bHJwY19ucnNfcG9saWN5ICpwb2xpY3ksCi0JCQkJICAgc3RydWN0IHB0bHJwY19ucnNfcmVxdWVzdCAqbnJxKTsKKwlpbnQJKCpvcF9yZXFfZW5xdWV1ZSkoc3RydWN0IHB0bHJwY19ucnNfcG9saWN5ICpwb2xpY3ksCisJCQkJICBzdHJ1Y3QgcHRscnBjX25yc19yZXF1ZXN0ICpucnEpOwogCS8qKgogCSAqIFJlbW92ZXMgYSByZXF1ZXN0IGZyb20gdGhlIHBvbGljeSdzIHNldCBvZiBwZW5kaW5nIHJlcXVlc3RzLiBOb3JtYWxseQogCSAqIGNhbGxlZCBhZnRlciBhIHJlcXVlc3QgaGFzIGJlZW4gcG9sbGVkIHN1Y2Nlc3NmdWxseSBmcm9tIHRoZSBwb2xpY3kKQEAgLTcwNyw4ICs3MTAsOCBAQAogCSAqIFxwYXJhbVtpbixvdXRdIHBvbGljeSBUaGUgcG9saWN5IHRoZSByZXF1ZXN0IFxhIG5ycSBiZWxvbmdzIHRvCiAJICogXHBhcmFtW2luLG91dF0gbnJxICAgIFRoZSByZXF1ZXN0IHRvIGRlcXVldWUKIAkgKi8KLQl2b2lkCSgqb3BfcmVxX2RlcXVldWUpIChzdHJ1Y3QgcHRscnBjX25yc19wb2xpY3kgKnBvbGljeSwKLQkJCQkgICBzdHJ1Y3QgcHRscnBjX25yc19yZXF1ZXN0ICpucnEpOworCXZvaWQJKCpvcF9yZXFfZGVxdWV1ZSkoc3RydWN0IHB0bHJwY19ucnNfcG9saWN5ICpwb2xpY3ksCisJCQkJICBzdHJ1Y3QgcHRscnBjX25yc19yZXF1ZXN0ICpucnEpOwogCS8qKgogCSAqIENhbGxlZCBhZnRlciB0aGUgcmVxdWVzdCBiZWluZyBjYXJyaWVkIG91dC4gQ291bGQgYmUgdXNlZCBmb3IKIAkgKiBqb2IvcmVzb3VyY2UgY29udHJvbDsgdGhpcyBvcGVyYXRpb24gaXMgb3B0aW9uYWwuCkBAIC03MjEsOCArNzI0LDggQEAKIAkgKgogCSAqIFxzZWUgcHRscnBjX25yc19yZXFfc3RvcF9ub2xvY2soKQogCSAqLwotCXZvaWQJKCpvcF9yZXFfc3RvcCkgKHN0cnVjdCBwdGxycGNfbnJzX3BvbGljeSAqcG9saWN5LAotCQkJCXN0cnVjdCBwdGxycGNfbnJzX3JlcXVlc3QgKm5ycSk7CisJdm9pZAkoKm9wX3JlcV9zdG9wKShzdHJ1Y3QgcHRscnBjX25yc19wb2xpY3kgKnBvbGljeSwKKwkJCSAgICAgICBzdHJ1Y3QgcHRscnBjX25yc19yZXF1ZXN0ICpucnEpOwogCS8qKgogCSAqIFJlZ2lzdGVycyB0aGUgcG9saWN5J3MgbHByb2NmcyBpbnRlcmZhY2Ugd2l0aCBhIFBUTFJQQyBzZXJ2aWNlLgogCSAqCkBAIC03MzEsNyArNzM0LDcgQEAKIAkgKiBccmV0dmFsIDAJc3VjY2VzcwogCSAqIFxyZXR2YWwgIT0gMAllcnJvcgogCSAqLwotCWludAkoKm9wX2xwcm9jZnNfaW5pdCkgKHN0cnVjdCBwdGxycGNfc2VydmljZSAqc3ZjKTsKKwlpbnQJKCpvcF9scHJvY2ZzX2luaXQpKHN0cnVjdCBwdGxycGNfc2VydmljZSAqc3ZjKTsKIAkvKioKIAkgKiBVbmVnaXN0ZXJzIHRoZSBwb2xpY3kncyBscHJvY2ZzIGludGVyZmFjZSB3aXRoIGEgUFRMUlBDIHNlcnZpY2UuCiAJICoKQEAgLTc0Myw3ICs3NDYsNyBAQAogCSAqCiAJICogXHBhcmFtW2luXSBzdmMgVGhlIHNlcnZpY2UKIAkgKi8KLQl2b2lkCSgqb3BfbHByb2Nmc19maW5pKSAoc3RydWN0IHB0bHJwY19zZXJ2aWNlICpzdmMpOworCXZvaWQJKCpvcF9scHJvY2ZzX2ZpbmkpKHN0cnVjdCBwdGxycGNfc2VydmljZSAqc3ZjKTsKIH07CiAKIC8qKgpAQCAtMTYyOCw3ICsxNjMxLDcgQEAKIC8qKgogICogUmV0dXJucyAxIGlmIHJlcXVlc3QgYnVmZmVyIGF0IG9mZnNldCBcYSBpbmRleCB3YXMgYWxyZWFkeSBzd2FiYmVkCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGx1c3RyZV9yZXFfc3dhYmJlZChzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgaW50IGluZGV4KQorc3RhdGljIGlubGluZSBpbnQgbHVzdHJlX3JlcV9zd2FiYmVkKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBzaXplX3QgaW5kZXgpCiB7CiAJTEFTU0VSVChpbmRleCA8IHNpemVvZihyZXEtPnJxX3JlcV9zd2FiX21hc2spICogOCk7CiAJcmV0dXJuIHJlcS0+cnFfcmVxX3N3YWJfbWFzayAmICgxIDw8IGluZGV4KTsKQEAgLTE2MzcsNyArMTY0MCw3IEBACiAvKioKICAqIFJldHVybnMgMSBpZiByZXF1ZXN0IHJlcGx5IGJ1ZmZlciBhdCBvZmZzZXQgXGEgaW5kZXggd2FzIGFscmVhZHkgc3dhYmJlZAogICovCi1zdGF0aWMgaW5saW5lIGludCBsdXN0cmVfcmVwX3N3YWJiZWQoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIGludCBpbmRleCkKK3N0YXRpYyBpbmxpbmUgaW50IGx1c3RyZV9yZXBfc3dhYmJlZChzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgc2l6ZV90IGluZGV4KQogewogCUxBU1NFUlQoaW5kZXggPCBzaXplb2YocmVxLT5ycV9yZXBfc3dhYl9tYXNrKSAqIDgpOwogCXJldHVybiByZXEtPnJxX3JlcF9zd2FiX21hc2sgJiAoMSA8PCBpbmRleCk7CkBAIC0xNjYyLDcgKzE2NjUsOCBAQAogLyoqCiAgKiBNYXJrIHJlcXVlc3QgYnVmZmVyIGF0IG9mZnNldCBcYSBpbmRleCB0aGF0IGl0IHdhcyBhbHJlYWR5IHN3YWJiZWQKICAqLwotc3RhdGljIGlubGluZSB2b2lkIGx1c3RyZV9zZXRfcmVxX3N3YWJiZWQoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIGludCBpbmRleCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBsdXN0cmVfc2V0X3JlcV9zd2FiYmVkKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLAorCQkJCQkgIHNpemVfdCBpbmRleCkKIHsKIAlMQVNTRVJUKGluZGV4IDwgc2l6ZW9mKHJlcS0+cnFfcmVxX3N3YWJfbWFzaykgKiA4KTsKIAlMQVNTRVJUKChyZXEtPnJxX3JlcV9zd2FiX21hc2sgJiAoMSA8PCBpbmRleCkpID09IDApOwpAQCAtMTY3Miw3ICsxNjc2LDggQEAKIC8qKgogICogTWFyayByZXF1ZXN0IHJlcGx5IGJ1ZmZlciBhdCBvZmZzZXQgXGEgaW5kZXggdGhhdCBpdCB3YXMgYWxyZWFkeSBzd2FiYmVkCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBsdXN0cmVfc2V0X3JlcF9zd2FiYmVkKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBpbnQgaW5kZXgpCitzdGF0aWMgaW5saW5lIHZvaWQgbHVzdHJlX3NldF9yZXBfc3dhYmJlZChzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwKKwkJCQkJICBzaXplX3QgaW5kZXgpCiB7CiAJTEFTU0VSVChpbmRleCA8IHNpemVvZihyZXEtPnJxX3JlcF9zd2FiX21hc2spICogOCk7CiAJTEFTU0VSVCgocmVxLT5ycV9yZXBfc3dhYl9tYXNrICYgKDEgPDwgaW5kZXgpKSA9PSAwKTsKQEAgLTI0MDMsNyArMjQwOCw2IEBACiBpbnQgcHRscnBjX3JlcGx5KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKTsKIGludCBwdGxycGNfc2VuZF9lcnJvcihzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgaW50IGRpZmZpY3VsdCk7CiBpbnQgcHRscnBjX2Vycm9yKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKTsKLXZvaWQgcHRscnBjX3Jlc2VuZF9yZXEoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXF1ZXN0KTsKIGludCBwdGxycGNfYXRfZ2V0X25ldF9sYXRlbmN5KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKTsKIGludCBwdGxfc2VuZF9ycGMoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXF1ZXN0LCBpbnQgbm9yZXBseSk7CiBpbnQgcHRscnBjX3JlZ2lzdGVyX3JxYmQoc3RydWN0IHB0bHJwY19yZXF1ZXN0X2J1ZmZlcl9kZXNjICpycWJkKTsKQEAgLTI0MjMsMjMgKzI0MjcsMTcgQEAKIAogaW50IHB0bHJwY19xdWV1ZV93YWl0KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKTsKIGludCBwdGxycGNfcmVwbGF5X3JlcShzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSk7Ci1pbnQgcHRscnBjX3VucmVnaXN0ZXJfcmVwbHkoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIGludCBhc3luYyk7CiB2b2lkIHB0bHJwY19hYm9ydF9pbmZsaWdodChzdHJ1Y3Qgb2JkX2ltcG9ydCAqaW1wKTsKIHZvaWQgcHRscnBjX2Fib3J0X3NldChzdHJ1Y3QgcHRscnBjX3JlcXVlc3Rfc2V0ICpzZXQpOwogCiBzdHJ1Y3QgcHRscnBjX3JlcXVlc3Rfc2V0ICpwdGxycGNfcHJlcF9zZXQodm9pZCk7CiBzdHJ1Y3QgcHRscnBjX3JlcXVlc3Rfc2V0ICpwdGxycGNfcHJlcF9mY3NldChpbnQgbWF4LCBzZXRfcHJvZHVjZXJfZnVuYyBmdW5jLAogCQkJCQkgICAgIHZvaWQgKmFyZyk7Ci1pbnQgcHRscnBjX3NldF9uZXh0X3RpbWVvdXQoc3RydWN0IHB0bHJwY19yZXF1ZXN0X3NldCAqKTsKIGludCBwdGxycGNfY2hlY2tfc2V0KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IHB0bHJwY19yZXF1ZXN0X3NldCAqc2V0KTsKIGludCBwdGxycGNfc2V0X3dhaXQoc3RydWN0IHB0bHJwY19yZXF1ZXN0X3NldCAqKTsKLWludCBwdGxycGNfZXhwaXJlZF9zZXQodm9pZCAqZGF0YSk7Ci12b2lkIHB0bHJwY19pbnRlcnJ1cHRlZF9zZXQodm9pZCAqZGF0YSk7CiB2b2lkIHB0bHJwY19tYXJrX2ludGVycnVwdGVkKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKTsKIHZvaWQgcHRscnBjX3NldF9kZXN0cm95KHN0cnVjdCBwdGxycGNfcmVxdWVzdF9zZXQgKik7CiB2b2lkIHB0bHJwY19zZXRfYWRkX3JlcShzdHJ1Y3QgcHRscnBjX3JlcXVlc3Rfc2V0ICosIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKTsKLXZvaWQgcHRscnBjX3NldF9hZGRfbmV3X3JlcShzdHJ1Y3QgcHRscnBjZF9jdGwgKnBjLAotCQkJICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKTsKIAogdm9pZCBwdGxycGNfZnJlZV9ycV9wb29sKHN0cnVjdCBwdGxycGNfcmVxdWVzdF9wb29sICpwb29sKTsKIGludCBwdGxycGNfYWRkX3Jxc190b19wb29sKHN0cnVjdCBwdGxycGNfcmVxdWVzdF9wb29sICpwb29sLCBpbnQgbnVtX3JxKTsKQEAgLTI2MTEsOSArMjYwOSw5IEBACiAgKiBAewogICovCiBpbnQgcHRscnBjX2J1Zl9uZWVkX3N3YWIoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIGNvbnN0IGludCBpbm91dCwKLQkJCSBpbnQgaW5kZXgpOworCQkJIHUzMiBpbmRleCk7CiB2b2lkIHB0bHJwY19idWZfc2V0X3N3YWJiZWQoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIGNvbnN0IGludCBpbm91dCwKLQkJCSAgICBpbnQgaW5kZXgpOworCQkJICAgIHUzMiBpbmRleCk7CiBpbnQgcHRscnBjX3VucGFja19yZXBfbXNnKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBpbnQgbGVuKTsKIGludCBwdGxycGNfdW5wYWNrX3JlcV9tc2coc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIGludCBsZW4pOwogCkBAIC0yNjMyLDI3ICsyNjMwLDI3IEBACiAJCSAgICAgIHVuc2lnbmVkIGludCBuZXdsZW4sIGludCBtb3ZlX2RhdGEpOwogdm9pZCBsdXN0cmVfZnJlZV9yZXBseV9zdGF0ZShzdHJ1Y3QgcHRscnBjX3JlcGx5X3N0YXRlICpycyk7CiBpbnQgX19sdXN0cmVfdW5wYWNrX21zZyhzdHJ1Y3QgbHVzdHJlX21zZyAqbSwgaW50IGxlbik7Ci1pbnQgbHVzdHJlX21zZ19oZHJfc2l6ZShfX3UzMiBtYWdpYywgaW50IGNvdW50KTsKLWludCBsdXN0cmVfbXNnX3NpemUoX191MzIgbWFnaWMsIGludCBjb3VudCwgX191MzIgKmxlbmd0aHMpOwotaW50IGx1c3RyZV9tc2dfc2l6ZV92MihpbnQgY291bnQsIF9fdTMyICpsZW5ndGhzKTsKLWludCBsdXN0cmVfcGFja2VkX21zZ19zaXplKHN0cnVjdCBsdXN0cmVfbXNnICptc2cpOwotaW50IGx1c3RyZV9tc2dfZWFybHlfc2l6ZSh2b2lkKTsKLXZvaWQgKmx1c3RyZV9tc2dfYnVmX3YyKHN0cnVjdCBsdXN0cmVfbXNnX3YyICptLCBpbnQgbiwgaW50IG1pbl9zaXplKTsKLXZvaWQgKmx1c3RyZV9tc2dfYnVmKHN0cnVjdCBsdXN0cmVfbXNnICptLCBpbnQgbiwgaW50IG1pbmxlbik7Ci1pbnQgbHVzdHJlX21zZ19idWZsZW4oc3RydWN0IGx1c3RyZV9tc2cgKm0sIGludCBuKTsKLWludCBsdXN0cmVfbXNnX2J1ZmNvdW50KHN0cnVjdCBsdXN0cmVfbXNnICptKTsKLWNoYXIgKmx1c3RyZV9tc2dfc3RyaW5nKHN0cnVjdCBsdXN0cmVfbXNnICptLCBpbnQgbiwgaW50IG1heF9sZW4pOwordTMyIGx1c3RyZV9tc2dfaGRyX3NpemUoX191MzIgbWFnaWMsIHUzMiBjb3VudCk7Cit1MzIgbHVzdHJlX21zZ19zaXplKF9fdTMyIG1hZ2ljLCBpbnQgY291bnQsIF9fdTMyICpsZW5ndGhzKTsKK3UzMiBsdXN0cmVfbXNnX3NpemVfdjIoaW50IGNvdW50LCBfX3UzMiAqbGVuZ3Rocyk7Cit1MzIgbHVzdHJlX3BhY2tlZF9tc2dfc2l6ZShzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnKTsKK3UzMiBsdXN0cmVfbXNnX2Vhcmx5X3NpemUodm9pZCk7Cit2b2lkICpsdXN0cmVfbXNnX2J1Zl92MihzdHJ1Y3QgbHVzdHJlX21zZ192MiAqbSwgdTMyIG4sIHUzMiBtaW5fc2l6ZSk7Cit2b2lkICpsdXN0cmVfbXNnX2J1ZihzdHJ1Y3QgbHVzdHJlX21zZyAqbSwgdTMyIG4sIHUzMiBtaW5sZW4pOwordTMyIGx1c3RyZV9tc2dfYnVmbGVuKHN0cnVjdCBsdXN0cmVfbXNnICptLCB1MzIgbik7Cit1MzIgbHVzdHJlX21zZ19idWZjb3VudChzdHJ1Y3QgbHVzdHJlX21zZyAqbSk7CitjaGFyICpsdXN0cmVfbXNnX3N0cmluZyhzdHJ1Y3QgbHVzdHJlX21zZyAqbSwgdTMyIG4sIHUzMiBtYXhfbGVuKTsKIF9fdTMyIGx1c3RyZV9tc2doZHJfZ2V0X2ZsYWdzKHN0cnVjdCBsdXN0cmVfbXNnICptc2cpOwogdm9pZCBsdXN0cmVfbXNnaGRyX3NldF9mbGFncyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCBfX3UzMiBmbGFncyk7CiBfX3UzMiBsdXN0cmVfbXNnX2dldF9mbGFncyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnKTsKLXZvaWQgbHVzdHJlX21zZ19hZGRfZmxhZ3Moc3RydWN0IGx1c3RyZV9tc2cgKm1zZywgaW50IGZsYWdzKTsKLXZvaWQgbHVzdHJlX21zZ19zZXRfZmxhZ3Moc3RydWN0IGx1c3RyZV9tc2cgKm1zZywgaW50IGZsYWdzKTsKLXZvaWQgbHVzdHJlX21zZ19jbGVhcl9mbGFncyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCBpbnQgZmxhZ3MpOwordm9pZCBsdXN0cmVfbXNnX2FkZF9mbGFncyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCB1MzIgZmxhZ3MpOwordm9pZCBsdXN0cmVfbXNnX3NldF9mbGFncyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCB1MzIgZmxhZ3MpOwordm9pZCBsdXN0cmVfbXNnX2NsZWFyX2ZsYWdzKHN0cnVjdCBsdXN0cmVfbXNnICptc2csIHUzMiBmbGFncyk7CiBfX3UzMiBsdXN0cmVfbXNnX2dldF9vcF9mbGFncyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnKTsKLXZvaWQgbHVzdHJlX21zZ19hZGRfb3BfZmxhZ3Moc3RydWN0IGx1c3RyZV9tc2cgKm1zZywgaW50IGZsYWdzKTsKK3ZvaWQgbHVzdHJlX21zZ19hZGRfb3BfZmxhZ3Moc3RydWN0IGx1c3RyZV9tc2cgKm1zZywgdTMyIGZsYWdzKTsKIHN0cnVjdCBsdXN0cmVfaGFuZGxlICpsdXN0cmVfbXNnX2dldF9oYW5kbGUoc3RydWN0IGx1c3RyZV9tc2cgKm1zZyk7CiBfX3UzMiBsdXN0cmVfbXNnX2dldF90eXBlKHN0cnVjdCBsdXN0cmVfbXNnICptc2cpOwotdm9pZCBsdXN0cmVfbXNnX2FkZF92ZXJzaW9uKHN0cnVjdCBsdXN0cmVfbXNnICptc2csIGludCB2ZXJzaW9uKTsKK3ZvaWQgbHVzdHJlX21zZ19hZGRfdmVyc2lvbihzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCB1MzIgdmVyc2lvbik7CiBfX3UzMiBsdXN0cmVfbXNnX2dldF9vcGMoc3RydWN0IGx1c3RyZV9tc2cgKm1zZyk7CiBfX3U2NCBsdXN0cmVfbXNnX2dldF9sYXN0X2NvbW1pdHRlZChzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnKTsKIF9fdTY0ICpsdXN0cmVfbXNnX2dldF92ZXJzaW9ucyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX3BhcmFtLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9wYXJhbS5oCmluZGV4IDgyYWFkZDMuLjgwNjFhMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX3BhcmFtLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfcGFyYW0uaApAQCAtMzksNiArMzksOSBAQAogI2lmbmRlZiBfTFVTVFJFX1BBUkFNX0gKICNkZWZpbmUgX0xVU1RSRV9QQVJBTV9ICiAKKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnMuaCIKKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2xpbnV4L2xuZXQvdHlwZXMuaCIKKwogLyoqIFxkZWZncm91cCBwYXJhbSBwYXJhbQogICoKICAqIEB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2x1c3RyZV9wYXRjaGxlc3NfY29tcGF0LmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9wYXRjaGxlc3NfY29tcGF0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbGludXgvbHVzdHJlX3BhdGNobGVzc19jb21wYXQuaApyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfcGF0Y2hsZXNzX2NvbXBhdC5oCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9yZXFfbGF5b3V0LmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9yZXFfbGF5b3V0LmgKaW5kZXggNTQ0YTQzYy4uYTEzNTU4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfcmVxX2xheW91dC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX3JlcV9sYXlvdXQuaApAQCAtNzYsNyArNzYsOCBAQAogdm9pZCByZXFfY2Fwc3VsZV9maW5pKHN0cnVjdCByZXFfY2Fwc3VsZSAqcGlsbCk7CiAKIHZvaWQgcmVxX2NhcHN1bGVfc2V0KHN0cnVjdCByZXFfY2Fwc3VsZSAqcGlsbCwgY29uc3Qgc3RydWN0IHJlcV9mb3JtYXQgKmZtdCk7Ci1pbnQgcmVxX2NhcHN1bGVfZmlsbGVkX3NpemVzKHN0cnVjdCByZXFfY2Fwc3VsZSAqcGlsbCwgZW51bSByZXFfbG9jYXRpb24gbG9jKTsKK3NpemVfdCByZXFfY2Fwc3VsZV9maWxsZWRfc2l6ZXMoc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLAorCQkJCWVudW0gcmVxX2xvY2F0aW9uIGxvYyk7CiBpbnQgIHJlcV9jYXBzdWxlX3NlcnZlcl9wYWNrKHN0cnVjdCByZXFfY2Fwc3VsZSAqcGlsbCk7CiAKIHZvaWQgKnJlcV9jYXBzdWxlX2NsaWVudF9nZXQoc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLApAQCAtODYsMjcgKzg3LDI3IEBACiAJCQkJICB2b2lkICpzd2FiYmVyKTsKIHZvaWQgKnJlcV9jYXBzdWxlX2NsaWVudF9zaXplZF9nZXQoc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLAogCQkJCSAgIGNvbnN0IHN0cnVjdCByZXFfbXNnX2ZpZWxkICpmaWVsZCwKLQkJCQkgICBpbnQgbGVuKTsKKwkJCQkgICB1MzIgbGVuKTsKIHZvaWQgKnJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLAogCQkJICAgICBjb25zdCBzdHJ1Y3QgcmVxX21zZ19maWVsZCAqZmllbGQpOwogdm9pZCAqcmVxX2NhcHN1bGVfc2VydmVyX3NpemVkX2dldChzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwsCiAJCQkJICAgY29uc3Qgc3RydWN0IHJlcV9tc2dfZmllbGQgKmZpZWxkLAotCQkJCSAgIGludCBsZW4pOworCQkJCSAgIHUzMiBsZW4pOwogdm9pZCAqcmVxX2NhcHN1bGVfc2VydmVyX3N3YWJfZ2V0KHN0cnVjdCByZXFfY2Fwc3VsZSAqcGlsbCwKIAkJCQkgIGNvbnN0IHN0cnVjdCByZXFfbXNnX2ZpZWxkICpmaWVsZCwKIAkJCQkgIHZvaWQgKnN3YWJiZXIpOwogdm9pZCAqcmVxX2NhcHN1bGVfc2VydmVyX3NpemVkX3N3YWJfZ2V0KHN0cnVjdCByZXFfY2Fwc3VsZSAqcGlsbCwKIAkJCQkJY29uc3Qgc3RydWN0IHJlcV9tc2dfZmllbGQgKmZpZWxkLAotCQkJCQlpbnQgbGVuLCB2b2lkICpzd2FiYmVyKTsKKwkJCQkJdTMyIGxlbiwgdm9pZCAqc3dhYmJlcik7CiAKIHZvaWQgcmVxX2NhcHN1bGVfc2V0X3NpemUoc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLAogCQkJICBjb25zdCBzdHJ1Y3QgcmVxX21zZ19maWVsZCAqZmllbGQsCi0JCQkgIGVudW0gcmVxX2xvY2F0aW9uIGxvYywgaW50IHNpemUpOwotaW50IHJlcV9jYXBzdWxlX2dldF9zaXplKGNvbnN0IHN0cnVjdCByZXFfY2Fwc3VsZSAqcGlsbCwKKwkJCSAgZW51bSByZXFfbG9jYXRpb24gbG9jLCB1MzIgc2l6ZSk7Cit1MzIgcmVxX2NhcHN1bGVfZ2V0X3NpemUoY29uc3Qgc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLAogCQkJIGNvbnN0IHN0cnVjdCByZXFfbXNnX2ZpZWxkICpmaWVsZCwKIAkJCSBlbnVtIHJlcV9sb2NhdGlvbiBsb2MpOwotaW50IHJlcV9jYXBzdWxlX21zZ19zaXplKHN0cnVjdCByZXFfY2Fwc3VsZSAqcGlsbCwgZW51bSByZXFfbG9jYXRpb24gbG9jKTsKLWludCByZXFfY2Fwc3VsZV9mbXRfc2l6ZShfX3UzMiBtYWdpYywgY29uc3Qgc3RydWN0IHJlcV9mb3JtYXQgKmZtdCwKK3UzMiByZXFfY2Fwc3VsZV9tc2dfc2l6ZShzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwsIGVudW0gcmVxX2xvY2F0aW9uIGxvYyk7Cit1MzIgcmVxX2NhcHN1bGVfZm10X3NpemUoX191MzIgbWFnaWMsIGNvbnN0IHN0cnVjdCByZXFfZm9ybWF0ICpmbXQsCiAJCQkgZW51bSByZXFfbG9jYXRpb24gbG9jKTsKIHZvaWQgcmVxX2NhcHN1bGVfZXh0ZW5kKHN0cnVjdCByZXFfY2Fwc3VsZSAqcGlsbCwgY29uc3Qgc3RydWN0IHJlcV9mb3JtYXQgKmZtdCk7CiAKQEAgLTExNSw4ICsxMTYsNyBAQAogCQkJICBlbnVtIHJlcV9sb2NhdGlvbiBsb2MpOwogdm9pZCByZXFfY2Fwc3VsZV9zaHJpbmsoc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLAogCQkJY29uc3Qgc3RydWN0IHJlcV9tc2dfZmllbGQgKmZpZWxkLAotCQkJdW5zaWduZWQgaW50IG5ld2xlbiwKLQkJCWVudW0gcmVxX2xvY2F0aW9uIGxvYyk7CisJCQl1MzIgbmV3bGVuLCBlbnVtIHJlcV9sb2NhdGlvbiBsb2MpOwogaW50ICByZXFfbGF5b3V0X2luaXQodm9pZCk7CiB2b2lkIHJlcV9sYXlvdXRfZmluaSh2b2lkKTsKIApAQCAtMTQ5LDE0ICsxNDksMTEgQEAKIGV4dGVybiBzdHJ1Y3QgcmVxX2Zvcm1hdCBSUUZfTURTX0dFVEFUVFJfTkFNRTsKIGV4dGVybiBzdHJ1Y3QgcmVxX2Zvcm1hdCBSUUZfTURTX0NMT1NFOwogZXh0ZXJuIHN0cnVjdCByZXFfZm9ybWF0IFJRRl9NRFNfUkVMRUFTRV9DTE9TRTsKLWV4dGVybiBzdHJ1Y3QgcmVxX2Zvcm1hdCBSUUZfTURTX1BJTjsKLWV4dGVybiBzdHJ1Y3QgcmVxX2Zvcm1hdCBSUUZfTURTX1VOUElOOwogZXh0ZXJuIHN0cnVjdCByZXFfZm9ybWF0IFJRRl9NRFNfQ09OTkVDVDsKIGV4dGVybiBzdHJ1Y3QgcmVxX2Zvcm1hdCBSUUZfTURTX0RJU0NPTk5FQ1Q7CiBleHRlcm4gc3RydWN0IHJlcV9mb3JtYXQgUlFGX01EU19HRVRfSU5GTzsKIGV4dGVybiBzdHJ1Y3QgcmVxX2Zvcm1hdCBSUUZfTURTX1JFQURQQUdFOwogZXh0ZXJuIHN0cnVjdCByZXFfZm9ybWF0IFJRRl9NRFNfV1JJVEVQQUdFOwotZXh0ZXJuIHN0cnVjdCByZXFfZm9ybWF0IFJRRl9NRFNfSVNfU1VCRElSOwogZXh0ZXJuIHN0cnVjdCByZXFfZm9ybWF0IFJRRl9NRFNfRE9ORV9XUklUSU5HOwogZXh0ZXJuIHN0cnVjdCByZXFfZm9ybWF0IFJRRl9NRFNfUkVJTlQ7CiBleHRlcm4gc3RydWN0IHJlcV9mb3JtYXQgUlFGX01EU19SRUlOVF9DUkVBVEU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV92ZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX3Zlci5oCmluZGV4IDY0NTU5YTEuLjE5YzkxMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX3Zlci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX3Zlci5oCkBAIC0yLDE0ICsyLDIxIEBACiAjZGVmaW5lIF9MVVNUUkVfVkVSX0hfCiAKICNkZWZpbmUgTFVTVFJFX01BSk9SIDIKLSNkZWZpbmUgTFVTVFJFX01JTk9SIDQKLSNkZWZpbmUgTFVTVFJFX1BBVENIIDYwCisjZGVmaW5lIExVU1RSRV9NSU5PUiA2CisjZGVmaW5lIExVU1RSRV9QQVRDSCA5OQogI2RlZmluZSBMVVNUUkVfRklYIDAKLSNkZWZpbmUgTFVTVFJFX1ZFUlNJT05fU1RSSU5HICIyLjQuNjAiCisjZGVmaW5lIExVU1RSRV9WRVJTSU9OX1NUUklORyAiMi42Ljk5IgogCi0jZGVmaW5lIExVU1RSRV9WRVJTSU9OX0NPREUgT0JEX09DRF9WRVJTSU9OKExVU1RSRV9NQUpPUiwgXAotCQkJCQkgICAgTFVTVFJFX01JTk9SLCBMVVNUUkVfUEFUQ0gsIFwKLQkJCQkJICAgIExVU1RSRV9GSVgpCisjZGVmaW5lIE9CRF9PQ0RfVkVSU0lPTihtYWpvciwgbWlub3IsIHBhdGNoLCBmaXgpCQkJXAorCSgoKG1ham9yKSA8PCAyNCkgKyAoKG1pbm9yKSA8PCAxNikgKyAoKHBhdGNoKSA8PCA4KSArIChmaXgpKQorCisjZGVmaW5lIE9CRF9PQ0RfVkVSU0lPTl9NQUpPUih2ZXJzaW9uKQkoKGludCkoKHZlcnNpb24pID4+IDI0KSAmIDI1NSkKKyNkZWZpbmUgT0JEX09DRF9WRVJTSU9OX01JTk9SKHZlcnNpb24pCSgoaW50KSgodmVyc2lvbikgPj4gMTYpICYgMjU1KQorI2RlZmluZSBPQkRfT0NEX1ZFUlNJT05fUEFUQ0godmVyc2lvbikJKChpbnQpKCh2ZXJzaW9uKSA+PiAgOCkgJiAyNTUpCisjZGVmaW5lIE9CRF9PQ0RfVkVSU0lPTl9GSVgodmVyc2lvbikJKChpbnQpKCh2ZXJzaW9uKSA+PiAgMCkgJiAyNTUpCisKKyNkZWZpbmUgTFVTVFJFX1ZFUlNJT05fQ09ERQkJCQkJCVwKKwlPQkRfT0NEX1ZFUlNJT04oTFVTVFJFX01BSk9SLCBMVVNUUkVfTUlOT1IsIExVU1RSRV9QQVRDSCwgTFVTVFJFX0ZJWCkKIAogLyoKICAqIElmIGx1c3RyZSB2ZXJzaW9uIG9mIGNsaWVudCBhbmQgc2VydmVycyBpdCBjb25uZWN0cyB0byBkaWZmZXJzIGJ5IG1vcmUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvb2JkLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL29iZC5oCmluZGV4IGExYmMyYzQuLmY2ZmM0ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvb2JkLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9vYmQuaApAQCAtMzUsMjEgKzM1LDEzIEBACiAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCi0jZGVmaW5lIElPQ19PU0NfVFlQRQkgJ2gnCi0jZGVmaW5lIElPQ19PU0NfTUlOX05SICAgICAgIDIwCi0jZGVmaW5lIElPQ19PU0NfU0VUX0FDVElWRSAgIF9JT1dSKElPQ19PU0NfVFlQRSwgMjEsIHN0cnVjdCBvYmRfZGV2aWNlICopCi0jZGVmaW5lIElPQ19PU0NfTUFYX05SICAgICAgIDUwCi0KLSNkZWZpbmUgSU9DX01EQ19UWVBFCSAnaScKLSNkZWZpbmUgSU9DX01EQ19NSU5fTlIgICAgICAgMjAKLSNkZWZpbmUgSU9DX01EQ19NQVhfTlIgICAgICAgNTAKLQogI2luY2x1ZGUgImx1c3RyZS9sdXN0cmVfaWRsLmgiCiAjaW5jbHVkZSAibHVzdHJlX2xpYi5oIgogI2luY2x1ZGUgImx1X3JlZi5oIgogI2luY2x1ZGUgImx1c3RyZV9leHBvcnQuaCIKICNpbmNsdWRlICJsdXN0cmVfZmlkLmgiCiAjaW5jbHVkZSAibHVzdHJlX2ZsZC5oIgorI2luY2x1ZGUgImx1c3RyZV9oYW5kbGVzLmgiCiAjaW5jbHVkZSAibHVzdHJlX2ludGVudC5oIgogCiAjZGVmaW5lIE1BWF9PQkRfREVWSUNFUyA4MTkyCkBAIC04MSw2ICs3MywxMyBAQAogewogfQogCisvKgorICogSWYgd2UgYXJlIHVuYWJsZSB0byBnZXQgdGhlIG1heGltdW0gb2JqZWN0IHNpemUgZnJvbSB0aGUgT1NUIGluCisgKiBvY2RfbWF4Ynl0ZXMgdXNpbmcgT0JEX0NPTk5FQ1RfTUFYQllURVMsIHRoZW4gd2UgZmFsbCBiYWNrIHRvIHVzaW5nCisgKiB0aGUgb2xkIG1heGltdW0gb2JqZWN0IHNpemUgZnJvbSBleHQzLgorICovCisjZGVmaW5lIExVU1RSRV9FWFQzX1NUUklQRV9NQVhCWVRFUyAweDFmZmZmZmZmMDAwVUxMCisKIHN0cnVjdCBsb3Zfc3RyaXBlX21kIHsKIAlhdG9taWNfdCAgICAgbHNtX3JlZmM7CiAJc3BpbmxvY2tfdAlsc21fbG9jazsKQEAgLTg5LDMxICs4OCwxNyBAQAogCS8qIG1heGltdW0gcG9zc2libGUgZmlsZSBzaXplLCBtaWdodCBjaGFuZ2UgYXMgT1NUcyBzdGF0dXMgY2hhbmdlcywKIAkgKiBlLmcuIGRpc2Nvbm5lY3RlZCwgZGVhY3RpdmF0ZWQKIAkgKi8KLQlfX3U2NAkgICAgbHNtX21heGJ5dGVzOwotCXN0cnVjdCB7Ci0JCS8qIFB1YmxpYyBtZW1iZXJzLiAqLwotCQlzdHJ1Y3Qgb3N0X2lkIGx3X29iamVjdF9vaTsgLyogbG92IG9iamVjdCBpZC9zZXEgKi8KLQotCQkvKiBMT1YtcHJpdmF0ZSBtZW1iZXJzIHN0YXJ0IGhlcmUgLS0gb25seSBmb3IgdXNlIGluIGxvdi8uICovCi0JCV9fdTMyIGx3X21hZ2ljOwotCQlfX3UzMiBsd19zdHJpcGVfc2l6ZTsgICAgICAvKiBzaXplIG9mIHRoZSBzdHJpcGUgKi8KLQkJX191MzIgbHdfcGF0dGVybjsJICAvKiBzdHJpcGluZyBwYXR0ZXJuIChSQUlEMCwgUkFJRDEpICovCi0JCV9fdTE2IGx3X3N0cmlwZV9jb3VudDsgIC8qIG51bWJlciBvZiBvYmplY3RzIGJlaW5nIHN0cmlwZWQgb3ZlciAqLwotCQlfX3UxNiBsd19sYXlvdXRfZ2VuOyAgICAgICAvKiBnZW5lcmF0aW9uIG9mIHRoZSBsYXlvdXQgKi8KLQkJY2hhciAgbHdfcG9vbF9uYW1lW0xPVl9NQVhQT09MTkFNRV07IC8qIHBvb2wgbmFtZSAqLwotCX0gbHNtX3dpcmU7Ci0KKwlfX3U2NAkJbHNtX21heGJ5dGVzOworCXN0cnVjdCBvc3RfaWQJbHNtX29pOworCV9fdTMyCQlsc21fbWFnaWM7CisJX191MzIJCWxzbV9zdHJpcGVfc2l6ZTsKKwlfX3UzMgkJbHNtX3BhdHRlcm47CS8qIHN0cmlwaW5nIHBhdHRlcm4gKFJBSUQwLCBSQUlEMSkgKi8KKwlfX3UxNgkJbHNtX3N0cmlwZV9jb3VudDsKKwlfX3UxNgkJbHNtX2xheW91dF9nZW47CisJY2hhcgkJbHNtX3Bvb2xfbmFtZVtMT1ZfTUFYUE9PTE5BTUUgKyAxXTsKIAlzdHJ1Y3QgbG92X29pbmZvICpsc21fb2luZm9bMF07CiB9OwogCi0jZGVmaW5lIGxzbV9vaQkJIGxzbV93aXJlLmx3X29iamVjdF9vaQotI2RlZmluZSBsc21fbWFnaWMJbHNtX3dpcmUubHdfbWFnaWMKLSNkZWZpbmUgbHNtX2xheW91dF9nZW4gICBsc21fd2lyZS5sd19sYXlvdXRfZ2VuCi0jZGVmaW5lIGxzbV9zdHJpcGVfc2l6ZSAgbHNtX3dpcmUubHdfc3RyaXBlX3NpemUKLSNkZWZpbmUgbHNtX3BhdHRlcm4gICAgICBsc21fd2lyZS5sd19wYXR0ZXJuCi0jZGVmaW5lIGxzbV9zdHJpcGVfY291bnQgbHNtX3dpcmUubHdfc3RyaXBlX2NvdW50Ci0jZGVmaW5lIGxzbV9wb29sX25hbWUgICAgbHNtX3dpcmUubHdfcG9vbF9uYW1lCi0KIHN0YXRpYyBpbmxpbmUgYm9vbCBsc21faXNfcmVsZWFzZWQoc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSkKIHsKIAlyZXR1cm4gISEobHNtLT5sc21fcGF0dGVybiAmIExPVl9QQVRURVJOX0ZfUkVMRUFTRUQpOwpAQCAtMTc3LDMxICsxNjIsMTAgQEAKIHN0cnVjdCBicndfcGFnZSB7CiAJdTY0IG9mZjsKIAlzdHJ1Y3QgcGFnZSAqcGc7Ci0JaW50IGNvdW50OworCXVuc2lnbmVkIGludCBjb3VudDsKIAl1MzIgZmxhZzsKIH07CiAKLS8qIGxsb2cgY29udGV4dHMgKi8KLWVudW0gbGxvZ19jdHh0X2lkIHsKLQlMTE9HX0NPTkZJR19PUklHX0NUWFQgID0gIDAsCi0JTExPR19DT05GSUdfUkVQTF9DVFhULAotCUxMT0dfTURTX09TVF9PUklHX0NUWFQsCi0JTExPR19NRFNfT1NUX1JFUExfQ1RYVCwKLQlMTE9HX1NJWkVfT1JJR19DVFhULAotCUxMT0dfU0laRV9SRVBMX0NUWFQsCi0JTExPR19SRDFfT1JJR19DVFhULAotCUxMT0dfUkQxX1JFUExfQ1RYVCwKLQlMTE9HX1RFU1RfT1JJR19DVFhULAotCUxMT0dfVEVTVF9SRVBMX0NUWFQsCi0JTExPR19MT1ZFQV9PUklHX0NUWFQsCi0JTExPR19MT1ZFQV9SRVBMX0NUWFQsCi0JTExPR19DSEFOR0VMT0dfT1JJR19DVFhULAkvKio8IGNoYW5nZWxvZyBnZW5lcmF0aW9uIG9uIG1kZCAqLwotCUxMT0dfQ0hBTkdFTE9HX1JFUExfQ1RYVCwJLyoqPCBjaGFuZ2Vsb2cgYWNjZXNzIG9uIGNsaWVudHMgKi8KLQlMTE9HX0NIQU5HRUxPR19VU0VSX09SSUdfQ1RYVCwJLyoqPCBmb3IgbXVsdGlwbGUgY2hhbmdlbG9nIGNvbnN1bWVycyAqLwotCUxMT0dfQUdFTlRfT1JJR19DVFhULAkJLyoqPCBhZ2VudCByZXF1ZXN0cyBnZW5lcmF0aW9uIG9uIGNkdCAqLwotCUxMT0dfTUFYX0NUWFRTCi19OwotCiBzdHJ1Y3QgdGltZW91dF9pdGVtIHsKIAllbnVtIHRpbWVvdXRfZXZlbnQgdGlfZXZlbnQ7CiAJdW5zaWduZWQgbG9uZwkgdGlfdGltZW91dDsKQEAgLTIxMSwxMSArMTc1LDEyIEBACiAJc3RydWN0IGxpc3RfaGVhZAkgdGlfY2hhaW47CiB9OwogCi0jZGVmaW5lIE9TQ19NQVhfUklGX0RFRkFVTFQgICAgICAgOAotI2RlZmluZSBPU0NfTUFYX1JJRl9NQVgJIDI1NgotI2RlZmluZSBPU0NfTUFYX0RJUlRZX0RFRkFVTFQgIChPU0NfTUFYX1JJRl9ERUZBVUxUICogNCkKLSNkZWZpbmUgT1NDX01BWF9ESVJUWV9NQl9NQVggICAyMDQ4ICAgICAvKiBhcmJpdHJhcnksIGJ1dCA8IE1BWF9MT05HIGJ5dGVzICovCi0jZGVmaW5lIE9TQ19ERUZBVUxUX1JFU0VORFMgICAgICAxMAorI2RlZmluZSBPQkRfTUFYX1JJRl9ERUZBVUxUCTgKKyNkZWZpbmUgT0JEX01BWF9SSUZfTUFYCQk1MTIKKyNkZWZpbmUgT1NDX01BWF9SSUZfTUFYCQkyNTYKKyNkZWZpbmUgT1NDX01BWF9ESVJUWV9ERUZBVUxUCShPQkRfTUFYX1JJRl9ERUZBVUxUICogNCkKKyNkZWZpbmUgT1NDX01BWF9ESVJUWV9NQl9NQVgJMjA0OAkvKiBhcmJpdHJhcnksIGJ1dCA8IE1BWF9MT05HIGJ5dGVzICovCisjZGVmaW5lIE9TQ19ERUZBVUxUX1JFU0VORFMJMTAKIAogLyogcG9zc2libGUgdmFsdWVzIGZvciBmb19zeW5jX2xvY2tfY2FuY2VsICovCiBlbnVtIHsKQEAgLTIyNSw0MCArMTkwLDc0IEBACiAJTlVNX1NZTkNfT05fQ0FOQ0VMX1NUQVRFUwogfTsKIAotI2RlZmluZSBNRENfTUFYX1JJRl9ERUZBVUxUICAgICAgIDgKLSNkZWZpbmUgTURDX01BWF9SSUZfTUFYCSA1MTIKLQogZW51bSBvYmRfY2xfc2VtX2xvY2tfY2xhc3MgewogCU9CRF9DTElfU0VNX05PUk1BTCwKIAlPQkRfQ0xJX1NFTV9NR0MsCiAJT0JEX0NMSV9TRU1fTURDT1NDLAogfTsKIAorLyoKKyAqIExpbWl0IHJlcGx5IGJ1ZmZlciBzaXplIGZvciBzdHJpcGluZyBkYXRhIHRvIG9uZSB4ODZfNjQgcGFnZS4gVGhpcworICogdmFsdWUgaXMgY2hvc2VuIHRvIGZpdCB0aGUgc3RyaXBpbmcgZGF0YSBmb3IgY29tbW9uIHVzZSBjYXNlcyB3aGlsZQorICogc3RheWluZyB3ZWxsIGJlbG93IHRoZSBsaW1pdCBhdCB3aGljaCB0aGUgYnVmZmVyIG11c3QgYmUgYmFja2VkIGJ5CisgKiB2bWFsbG9jKCkuIEV4Y2Vzc2l2ZSB1c2Ugb2Ygdm1hbGxvYygpIG1heSBjYXVzZSBzcGlubG9jayBjb250ZW50aW9uCisgKiBvbiB0aGUgTURTLgorICovCisjZGVmaW5lIE9CRF9NQVhfREVGQVVMVF9FQV9TSVpFCQk0MDk2CisjZGVmaW5lIE9CRF9NQVhfREVGQVVMVF9DT09LSUVfU0laRQk0MDk2CisKIHN0cnVjdCBtZGNfcnBjX2xvY2s7CiBzdHJ1Y3Qgb2JkX2ltcG9ydDsKIHN0cnVjdCBjbGllbnRfb2JkIHsKIAlzdHJ1Y3Qgcndfc2VtYXBob3JlICBjbF9zZW07CiAJc3RydWN0IG9iZF91dWlkCSAgY2xfdGFyZ2V0X3V1aWQ7CiAJc3RydWN0IG9iZF9pbXBvcnQgICAgICAgKmNsX2ltcG9ydDsgLyogcHRscnBjIGNvbm5lY3Rpb24gc3RhdGUgKi8KLQlpbnQJCSAgICAgIGNsX2Nvbm5fY291bnQ7Ci0JLyogbWF4X21kc19lYXNpemUgaXMgcHVyZWx5IGEgcGVyZm9ybWFuY2UgdGhpbmcgc28gd2UgZG9uJ3QgaGF2ZSB0bwotCSAqIGNhbGwgb2JkX3NpemVfZGlza21kKCkgYWxsIHRoZSB0aW1lLgorCXNpemVfdAkJCSBjbF9jb25uX2NvdW50OworCS8qCisJICogQ2FjaGUgbWF4aW11bSBhbmQgZGVmYXVsdCB2YWx1ZXMgZm9yIGVhc2l6ZSBhbmQgY29va2llc2l6ZS4gVGhpcyBpcworCSAqIHN0cmljdGx5IGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHRvIG1pbmltaXplIGNhbGxzIHRvCisJICogb2JkX3NpemVfZGlza21kKCkuIFRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlCisJICogaW5pdGlhbCBzaXplIG9mIGEgcmVxdWVzdCBidWZmZXIuIFRoZSBwdGxycGMgbGF5ZXIgd2lsbCByZXNpemUgdGhlCisJICogYnVmZmVyIGFzIG5lZWRlZCB0byBhY2NvbW1vZGF0ZSBhIGxhcmdlciByZXBseSBmcm9tIHRoZQorCSAqIHNlcnZlci4gVGhlIGRlZmF1bHQgdmFsdWVzIHNob3VsZCBiZSBzbWFsbCBlbm91Z2ggdG8gYXZvaWQgd2FzdGVkCisJICogbWVtb3J5IGFuZCBleGNlc3NpdmUgdXNlIG9mIHZtYWxsb2MoKSwgeWV0IGxhcmdlIGVub3VnaCB0byBhdm9pZAorCSAqIHJlYWxsb2NhdGluZyB0aGUgYnVmZmVyIGluIHRoZSBjb21tb24gdXNlIGNhc2UuCiAJICovCi0JaW50CQkJIGNsX2RlZmF1bHRfbWRzX2Vhc2l6ZTsKLQlpbnQJCQkgY2xfbWF4X21kc19lYXNpemU7Ci0JaW50CQkJIGNsX2RlZmF1bHRfbWRzX2Nvb2tpZXNpemU7Ci0JaW50CQkJIGNsX21heF9tZHNfY29va2llc2l6ZTsKKwkvKgorCSAqIERlZmF1bHQgRUEgc2l6ZSBmb3Igc3RyaXBpbmcgYXR0cmlidXRlcy4gSXQgaXMgaW5pdGlhbGl6ZWQgYXQKKwkgKiBtb3VudC10aW1lIGJhc2VkIG9uIHRoZSBkZWZhdWx0IHN0cmlwZSB3aWR0aCBvZiB0aGUgZmlsZXN5c3RlbSwKKwkgKiB0aGVuIGl0IHRyYWNrcyB0aGUgbGFyZ2VzdCBvYnNlcnZlZCBFQSBzaXplIGFkdmVydGlzZWQgYnkKKwkgKiB0aGUgTURULCB1cCB0byBhIG1heGltdW0gdmFsdWUgb2YgT0JEX01BWF9ERUZBVUxUX0VBX1NJWkUuCisJICovCisJdTMyCQkJIGNsX2RlZmF1bHRfbWRzX2Vhc2l6ZTsKKwkvKiBNYXhpbXVtIHBvc3NpYmxlIEVBIHNpemUgY29tcHV0ZWQgYXQgbW91bnQtdGltZSBiYXNlZCBvbgorCSAqIHRoZSBudW1iZXIgb2YgT1NUcyBpbiB0aGUgZmlsZXN5c3RlbS4gTWF5IGJlIGluY3JlYXNlZCBhdAorCSAqIHJ1bi10aW1lIGlmIGEgbGFyZ2VyIG9ic2VydmVkIHNpemUgaXMgYWR2ZXJ0aXNlZCBieSB0aGUgTURULgorCSAqLworCXUzMgkJCSBjbF9tYXhfbWRzX2Vhc2l6ZTsKKwkvKiBEZWZhdWx0IGNvb2tpZSBzaXplIGZvciBsbG9nIGNvb2tpZXMgKHNlZSBzdHJ1Y3QgbGxvZ19jb29raWUpLiBJdCBpcworCSAqIGluaXRpYWxpemVkIHRvIHplcm8gYXQgbW91bnQtdGltZSwgdGhlbiBpdCB0cmFja3MgdGhlIGxhcmdlc3QKKwkgKiBvYnNlcnZlZCBjb29raWUgc2l6ZSBhZHZlcnRpc2VkIGJ5IHRoZSBNRFQsIHVwIHRvIGEgbWF4aW11bSB2YWx1ZSBvZgorCSAqIE9CRF9NQVhfREVGQVVMVF9DT09LSUVfU0laRS4gTm90ZSB0aGF0IGxsb2dfY29va2llcyBhcmUgbm90CisJICogdXNlZCBieSBjbGllbnRzIGNvbW11bmljYXRpbmcgd2l0aCBNRFMgdmVyc2lvbnMgMi40LjAgYW5kIGxhdGVyLgorCSAqLworCXUzMgkJCSBjbF9kZWZhdWx0X21kc19jb29raWVzaXplOworCS8qIE1heGltdW0gcG9zc2libGUgY29va2llIHNpemUgY29tcHV0ZWQgYXQgbW91bnQtdGltZSBiYXNlZCBvbgorCSAqIHRoZSBudW1iZXIgb2YgT1NUcyBpbiB0aGUgZmlsZXN5c3RlbS4gTWF5IGJlIGluY3JlYXNlZCBhdAorCSAqIHJ1bi10aW1lIGlmIGEgbGFyZ2VyIG9ic2VydmVkIHNpemUgaXMgYWR2ZXJ0aXNlZCBieSB0aGUgTURULgorCSAqLworCXUzMgkJCSBjbF9tYXhfbWRzX2Nvb2tpZXNpemU7CiAKIAllbnVtIGx1c3RyZV9zZWNfcGFydCAgICAgY2xfc3BfbWU7CiAJZW51bSBsdXN0cmVfc2VjX3BhcnQgICAgIGNsX3NwX3RvOwogCXN0cnVjdCBzcHRscnBjX2ZsYXZvciAgICBjbF9mbHZyX21nYzsgICAvKiBmaXhlZCBmbGF2b3Igb2YgbWdjLT5tZ3MgKi8KIAogCS8qIHRoZSBncmFudCB2YWx1ZXMgYXJlIHByb3RlY3RlZCBieSBsb2lfbGlzdF9sb2NrIGJlbG93ICovCi0JbG9uZwkJICAgICBjbF9kaXJ0eTsJIC8qIGFsbCBfZGlydHlfIGluIGJ5dGVzICovCi0JbG9uZwkJICAgICBjbF9kaXJ0eV9tYXg7ICAgICAvKiBhbGxvd2VkIHcvbyBycGMgKi8KLQlsb25nCQkgICAgIGNsX2RpcnR5X3RyYW5zaXQ7IC8qIGRpcnR5IHN5bmNocm9ub3VzICovCi0JbG9uZwkJICAgICBjbF9hdmFpbF9ncmFudDsgICAvKiBieXRlcyBvZiBjcmVkaXQgZm9yIG9zdCAqLwotCWxvbmcJCSAgICAgY2xfbG9zdF9ncmFudDsgICAgLyogbG9zdCBjcmVkaXRzICh0cnVuYykgKi8KKwl1bnNpZ25lZCBsb25nCQkgY2xfZGlydHlfcGFnZXM7CS8qIGFsbCBfZGlydHlfIGluIHBhaGdlcyAqLworCXVuc2lnbmVkIGxvbmcJCSBjbF9kaXJ0eV9tYXhfcGFnZXM7CS8qIGFsbG93ZWQgdy9vIHJwYyAqLworCXVuc2lnbmVkIGxvbmcJCSBjbF9kaXJ0eV90cmFuc2l0OwkvKiBkaXJ0eSBzeW5jaHJvbm91cyAqLworCXVuc2lnbmVkIGxvbmcJCSBjbF9hdmFpbF9ncmFudDsJLyogYnl0ZXMgb2YgY3JlZGl0IGZvciBvc3QgKi8KKwl1bnNpZ25lZCBsb25nCQkgY2xfbG9zdF9ncmFudDsJCS8qIGxvc3QgY3JlZGl0cyAodHJ1bmMpICovCiAKIAkvKiBzaW5jZSB3ZSBhbGxvY2F0ZSBncmFudCBieSBibG9ja3MsIHdlIGRvbid0IGtub3cgaG93IG1hbnkgZ3JhbnQgd2lsbAogCSAqIGJlIHVzZWQgdG8gYWRkIGEgcGFnZSBpbnRvIGNhY2hlLiBBcyBhIHNvbHV0aW9uLCB3ZSByZXNlcnZlIG1heGltdW0KQEAgLTI3NSw4ICsyNzQsNyBAQAogCSAqIHRoZSBleHRlbnQgc2l6ZS4gQSBjaHVuayBpcyBtYXgoUEFHRV9TSVpFLCBPU1QgYmxvY2sgc2l6ZSkKIAkgKi8KIAlpbnQJCSAgY2xfY2h1bmtiaXRzOwotCWludAkJICBjbF9jaHVuazsKLQlpbnQJCSAgY2xfZXh0ZW50X3RheDsgLyogZXh0ZW50IG92ZXJoZWFkLCBieSBieXRlcyAqLworCXVuc2lnbmVkIGludAkgIGNsX2V4dGVudF90YXg7IC8qIGV4dGVudCBvdmVyaGVhZCwgYnkgYnl0ZXMgKi8KIAogCS8qIGtlZXAgdHJhY2sgb2Ygb2JqZWN0cyB0aGF0IGhhdmUgbG9pcyB0aGF0IGNvbnRhaW4gcGFnZXMgd2hpY2gKIAkgKiBoYXZlIGJlZW4gcXVldWVkIGZvciBhc3luYyBicncuICB0aGlzIGxvY2sgYWxzbyBwcm90ZWN0cyB0aGUKQEAgLTMwMSwxMyArMjk5LDEzIEBACiAJc3RydWN0IGxpc3RfaGVhZAkgICAgICAgY2xfbG9pX2hwX3JlYWR5X2xpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZAkgICAgICAgY2xfbG9pX3dyaXRlX2xpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZAkgICAgICAgY2xfbG9pX3JlYWRfbGlzdDsKLQlpbnQJCSAgICAgIGNsX3JfaW5fZmxpZ2h0OwotCWludAkJICAgICAgY2xfd19pbl9mbGlnaHQ7CisJX191MzIJCQkgY2xfcl9pbl9mbGlnaHQ7CisJX191MzIJCQkgY2xfd19pbl9mbGlnaHQ7CiAJLyoganVzdCBhIHN1bSBvZiB0aGUgbG9pL2xvcCBwZW5kaW5nIG51bWJlcnMgdG8gYmUgZXhwb3J0ZWQgYnkgc3lzZnMgKi8KIAlhdG9taWNfdAkgICAgIGNsX3BlbmRpbmdfd19wYWdlczsKIAlhdG9taWNfdAkgICAgIGNsX3BlbmRpbmdfcl9wYWdlczsKIAlfX3UzMgkJCSBjbF9tYXhfcGFnZXNfcGVyX3JwYzsKLQlpbnQJCSAgICAgIGNsX21heF9ycGNzX2luX2ZsaWdodDsKKwlfX3UzMgkJCSBjbF9tYXhfcnBjc19pbl9mbGlnaHQ7CiAJc3RydWN0IG9iZF9oaXN0b2dyYW0gICAgIGNsX3JlYWRfcnBjX2hpc3Q7CiAJc3RydWN0IG9iZF9oaXN0b2dyYW0gICAgIGNsX3dyaXRlX3JwY19oaXN0OwogCXN0cnVjdCBvYmRfaGlzdG9ncmFtICAgICBjbF9yZWFkX3BhZ2VfaGlzdDsKQEAgLTMxOCwxMyArMzE2LDEzIEBACiAJLyogbHJ1IGZvciBvc2MgY2FjaGluZyBwYWdlcyAqLwogCXN0cnVjdCBjbF9jbGllbnRfY2FjaGUJKmNsX2NhY2hlOwogCXN0cnVjdCBsaXN0X2hlYWQJIGNsX2xydV9vc2M7IC8qIG1lbWJlciBvZiBjbF9jYWNoZS0+Y2NjX2xydSAqLwotCWF0b21pY190CQkqY2xfbHJ1X2xlZnQ7Ci0JYXRvbWljX3QJCSBjbF9scnVfYnVzeTsKKwlhdG9taWNfbG9uZ190CQkqY2xfbHJ1X2xlZnQ7CisJYXRvbWljX2xvbmdfdAkJIGNsX2xydV9idXN5OworCWF0b21pY19sb25nX3QJCSBjbF9scnVfaW5fbGlzdDsKIAlhdG9taWNfdAkJIGNsX2xydV9zaHJpbmtlcnM7Ci0JYXRvbWljX3QJCSBjbF9scnVfaW5fbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSBjbF9scnVfbGlzdDsgLyogbHJ1IHBhZ2UgbGlzdCAqLwogCXNwaW5sb2NrX3QJCSBjbF9scnVfbGlzdF9sb2NrOyAvKiBwYWdlIGxpc3QgcHJvdGVjdG9yICovCi0JYXRvbWljX3QJCSBjbF91bnN0YWJsZV9jb3VudDsKKwlhdG9taWNfbG9uZ190CQkgY2xfdW5zdGFibGVfY291bnQ7CiAKIAkvKiBudW1iZXIgb2YgaW4gZmxpZ2h0IGRlc3Ryb3kgcnBjcyBpcyBsaW1pdGVkIHRvIG1heF9ycGNzX2luX2ZsaWdodCAqLwogCWF0b21pY190CSAgICAgY2xfZGVzdHJveV9pbl9mbGlnaHQ7CkBAIC0zNTAsNyArMzQ4LDcgQEAKIAkvKiB1c2VkIGJ5IHF1b3RhY2hlY2sgd2hlbiB0aGUgc2VydmVycyBhcmUgb2xkZXIgdGhhbiAyLjQgKi8KIAlpbnQJCSAgICAgIGNsX3FjaGtfc3RhdDsgLyogcXVvdGFjaGVjayBzdGF0IG9mIHRoZSBwZWVyICovCiAjZGVmaW5lIENMX05PVF9RVU9UQUNIRUNLRUQgMSAgIC8qIGNsaWVudC0+Y2xfcWNoa19zdGF0IGluaXQgdmFsdWUgKi8KLSNpZiBMVVNUUkVfVkVSU0lPTl9DT0RFID49IE9CRF9PQ0RfVkVSU0lPTigyLCA3LCA1MCwgMCkKKyNpZiBPQkRfT0NEX1ZFUlNJT04oMiwgNywgNTMsIDApIDwgTFVTVFJFX1ZFUlNJT05fQ09ERQogI3dhcm5pbmcgInBsZWFzZSBjb25zaWRlciByZW1vdmluZyBxdW90YWNoZWNrIGNvbXBhdGliaWxpdHkgY29kZSIKICNlbmRpZgogCkBAIC00MzEsNyArNDI5LDcgQEAKIHN0cnVjdCBsbXZfdGd0X2Rlc2MgewogCXN0cnVjdCBvYmRfdXVpZAkJbHRkX3V1aWQ7CiAJc3RydWN0IG9iZF9leHBvcnQJKmx0ZF9leHA7Ci0JaW50CQkJbHRkX2lkeDsKKwl1MzIJCQlsdGRfaWR4OwogCXN0cnVjdCBtdXRleAkJbHRkX2ZpZF9tdXRleDsKIAl1bnNpZ25lZCBsb25nCQlsdGRfYWN0aXZlOjE7IC8qIHRhcmdldCB1cCBmb3IgcmVxdWVzdHMgKi8KIH07CkBAIC00NTgsOSArNDU2LDggQEAKIAlpbnQJCQltYXhfZGVmX2Vhc2l6ZTsKIAlpbnQJCQltYXhfY29va2llc2l6ZTsKIAlpbnQJCQltYXhfZGVmX2Nvb2tpZXNpemU7Ci0JaW50CQkJc2VydmVyX3RpbWVvdXQ7CiAKLQlpbnQJCQl0Z3RzX3NpemU7IC8qIHNpemUgb2YgdGd0cyBhcnJheSAqLworCXUzMgkJCXRndHNfc2l6ZTsgLyogc2l6ZSBvZiB0Z3RzIGFycmF5ICovCiAJc3RydWN0IGxtdl90Z3RfZGVzYwkqKnRndHM7CiAKIAlzdHJ1Y3Qgb2JkX2Nvbm5lY3RfZGF0YQljb25uX2RhdGE7CkBAIC00NzAsMTIgKzQ2NywxMSBAQAogc3RydWN0IG5pb2J1Zl9sb2NhbCB7CiAJX191NjQJCWxuYl9maWxlX29mZnNldDsKIAlfX3UzMgkJbG5iX3BhZ2Vfb2Zmc2V0OwotCV9fdTMyCQlsZW47Ci0JX191MzIJCWZsYWdzOwotCXN0cnVjdCBwYWdlCSpwYWdlOwotCXN0cnVjdCBkZW50cnkJKmRlbnRyeTsKLQlpbnQJCWxuYl9ncmFudF91c2VkOwotCWludAkJcmM7CisJX191MzIJCWxuYl9sZW47CisJX191MzIJCWxuYl9mbGFnczsKKwlzdHJ1Y3QgcGFnZQkqbG5iX3BhZ2U7CisJdm9pZAkJKmxuYl9kYXRhOworCWludAkJbG5iX3JjOwogfTsKIAogI2RlZmluZSBMVVNUUkVfRkxEX05BTUUJICJmbGQiCkBAIC01MTcsNyArNTEzLDYgQEAKICNkZWZpbmUgTl9MT0NBTF9URU1QX1BBR0UgMHgxMDAwMDAwMAogCiBzdHJ1Y3Qgb2JkX3RyYW5zX2luZm8gewotCV9fdTY0CQkgICAgb3RpX3RyYW5zbm87CiAJX191NjQJCSAgICBvdGlfeGlkOwogCS8qIE9ubHkgdXNlZCBvbiB0aGUgc2VydmVyIHNpZGUgZm9yIHRyYWNraW5nIGFja3MuICovCiAJc3RydWN0IG90aV9yZXFfYWNrX2xvY2sgewpAQCAtNTI3LDUwICs1MjIsMTEgQEAKIAl2b2lkCQkgICAgKm90aV9oYW5kbGU7CiAJc3RydWN0IGxsb2dfY29va2llICAgICAgIG90aV9vbmVjb29raWU7CiAJc3RydWN0IGxsb2dfY29va2llICAgICAgKm90aV9sb2djb29raWVzOwotCWludAkJICAgICAgb3RpX251bWNvb2tpZXM7Ci0JLyoqIHN5bmNocm9ub3VzIHdyaXRlIGlzIG5lZWRlZCAqLwotCXVuc2lnbmVkIGxvbmcJCSBvdGlfc3luY193cml0ZToxOwogCi0JLyogaW5pdGlhbCB0aHJlYWQgaGFuZGxpbmcgdHJhbnNhY3Rpb24gKi8KLQlzdHJ1Y3QgcHRscnBjX3RocmVhZCAqb3RpX3RocmVhZDsKLQlfX3UzMgkJICAgIG90aV9jb25uX2NudDsKIAkvKiogVkJSOiB2ZXJzaW9ucyAqLwogCV9fdTY0CQkgICAgb3RpX3ByZV92ZXJzaW9uOwotCS8qKiBKb2JJRCAqLwotCWNoYXIJCSAgICAqb3RpX2pvYmlkOwotCi0Jc3RydWN0IG9iZF91dWlkCSAqb3RpX29zdF91dWlkOwogfTsKIAotc3RhdGljIGlubGluZSB2b2lkIG90aV9hbGxvY19jb29raWVzKHN0cnVjdCBvYmRfdHJhbnNfaW5mbyAqb3RpLAotCQkJCSAgICAgaW50IG51bV9jb29raWVzKQotewotCWlmICghb3RpKQotCQlyZXR1cm47Ci0KLQlpZiAobnVtX2Nvb2tpZXMgPT0gMSkKLQkJb3RpLT5vdGlfbG9nY29va2llcyA9ICZvdGktPm90aV9vbmVjb29raWU7Ci0JZWxzZQotCQlvdGktPm90aV9sb2djb29raWVzID0gbGliY2ZzX2t2emFsbG9jKG51bV9jb29raWVzICogc2l6ZW9mKG90aS0+b3RpX29uZWNvb2tpZSksCi0JCQkJCQkgICAgICBHRlBfTk9GUyk7Ci0KLQlvdGktPm90aV9udW1jb29raWVzID0gbnVtX2Nvb2tpZXM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBvdGlfZnJlZV9jb29raWVzKHN0cnVjdCBvYmRfdHJhbnNfaW5mbyAqb3RpKQotewotCWlmICghb3RpIHx8ICFvdGktPm90aV9sb2djb29raWVzKQotCQlyZXR1cm47Ci0KLQlpZiAob3RpLT5vdGlfbG9nY29va2llcyA9PSAmb3RpLT5vdGlfb25lY29va2llKQotCQlMQVNTRVJUKG90aS0+b3RpX251bWNvb2tpZXMgPT0gMSk7Ci0JZWxzZQotCQlrdmZyZWUob3RpLT5vdGlfbG9nY29va2llcyk7Ci0KLQlvdGktPm90aV9sb2djb29raWVzID0gTlVMTDsKLQlvdGktPm90aV9udW1jb29raWVzID0gMDsKLX0KLQogLyoKICAqIEV2ZW50cyBzaWduYWxsZWQgdGhyb3VnaCBvYmRfbm90aWZ5KCkgdXBjYWxsLWNoYWluLgogICovCkBAIC02MTYsNyArNTcyLDYgQEAKIH07CiAKIHN0cnVjdCBvYmRfbGxvZ19ncm91cCB7Ci0JaW50CQlvbGdfc2VxOwogCXN0cnVjdCBsbG9nX2N0eHQgICpvbGdfY3R4dHNbTExPR19NQVhfQ1RYVFNdOwogCXdhaXRfcXVldWVfaGVhZF90CW9sZ193YWl0cTsKIAlzcGlubG9ja190CSAgIG9sZ19sb2NrOwpAQCAtNjI1LDcgKzU4MCw2IEBACiAKIC8qIGNvcnJlc3BvbmRzIHRvIG9uZSBvZiB0aGUgb2JkJ3MgKi8KICNkZWZpbmUgT0JEX0RFVklDRV9NQUdJQwkwWEFCNUNENkVGCi0jZGVmaW5lIE9CRF9ERVZfQllfREVWTkFNRSAgICAgIDB4ZmZmZmQwZGUKIAogc3RydWN0IGx2ZnNfcnVuX2N0eHQgewogCXN0cnVjdCBkdF9kZXZpY2UgKmR0OwpAQCAtNjUzLDcgKzYwNyw2IEBACiAJCSAgICAgIG9iZF9zdGFydGluZzoxLCAgICAgIC8qIHN0YXJ0ZWQgc2V0dXAgKi8KIAkJICAgICAgb2JkX2ZvcmNlOjEsCSAvKiBjbGVhbnVwIHdpdGggPiAwIG9iZCByZWZjb3VudCAqLwogCQkgICAgICBvYmRfZmFpbDoxLAkgLyogY2xlYW51cCB3aXRoIGZhaWxvdmVyICovCi0JCSAgICAgIG9iZF9hc3luY19yZWNvdjoxLCAvKiBhbGxvdyBhc3luY2hyb25vdXMgb3JwaGFuIGNsZWFudXAgKi8KIAkJICAgICAgb2JkX25vX2Nvbm46MSwgICAgICAgLyogZGVueSBuZXcgY29ubmVjdGlvbnMgKi8KIAkJICAgICAgb2JkX2luYWN0aXZlOjEsICAgICAgLyogZGV2aWNlIGFjdGl2ZS9pbmFjdGl2ZQogCQkJCQkgICAgKiAoZm9yIHN5c2ZzIHN0YXR1cyBvbmx5ISEpCkBAIC03MjgsOSArNjgxLDYgQEAKIAlzdHJ1Y3QgY29tcGxldGlvbglvYmRfa29ial91bnJlZ2lzdGVyOwogfTsKIAotI2RlZmluZSBPQkRfTExPR19GTF9TRU5ETk9XICAgICAweDAwMDEKLSNkZWZpbmUgT0JEX0xMT0dfRkxfRVhJVAkweDAwMDIKLQogZW51bSBvYmRfY2xlYW51cF9zdGFnZSB7CiAvKiBTcGVjaWFsIGNhc2UgaGFjayBmb3IgTURTIExPVnMgKi8KIAlPQkRfQ0xFQU5VUF9FQVJMWSwKQEAgLTc0MCw4ICs2OTAsNiBAQAogCiAvKiBnZXQvc2V0X2luZm8ga2V5cyAqLwogI2RlZmluZSBLRVlfQVNZTkMJICAgICAgICJhc3luYyIKLSNkZWZpbmUgS0VZX0JMT0NLU0laRV9CSVRTICAgICAgImJsb2Nrc2l6ZV9iaXRzIgotI2RlZmluZSBLRVlfQkxPQ0tTSVpFCSAgICJibG9ja3NpemUiCiAjZGVmaW5lIEtFWV9DSEFOR0VMT0dfQ0xFQVIgICAgICJjaGFuZ2Vsb2dfY2xlYXIiCiAjZGVmaW5lIEtFWV9GSUQyUEFUSAkgICAgImZpZDJwYXRoIgogI2RlZmluZSBLRVlfQ0hFQ0tTVU0JICAgICJjaGVja3N1bSIKQEAgLTc1MywzMCArNzAxLDIyIEBACiAjZGVmaW5lIEtFWV9HUkFOVF9TSFJJTksJImdyYW50X3NocmluayIKICNkZWZpbmUgS0VZX0hTTV9DT1BZVE9PTF9TRU5EICAgImhzbV9zZW5kIgogI2RlZmluZSBLRVlfSU5JVF9SRUNPVl9CQUNLVVAgICAiaW5pdF9yZWNvdl9iayIKLSNkZWZpbmUgS0VZX0lOSVRfUkVDT1YJICAiaW5pdGlhbF9yZWNvdiIKICNkZWZpbmUgS0VZX0lOVEVSTURTCSAgICAiaW50ZXJfbWRzIgogI2RlZmluZSBLRVlfTEFTVF9JRAkgICAgICJsYXN0X2lkIgogI2RlZmluZSBLRVlfTEFTVF9GSUQJCSJsYXN0X2ZpZCIKLSNkZWZpbmUgS0VZX0xPQ0tfVE9fU1RSSVBFICAgICAgImxvY2tfdG9fc3RyaXBlIgogI2RlZmluZSBLRVlfTE9WREVTQwkgICAgICJsb3ZkZXNjIgotI2RlZmluZSBLRVlfTE9WX0lEWAkgICAgICJsb3ZfaWR4IgogI2RlZmluZSBLRVlfTUFYX0VBU0laRQkJIm1heF9lYXNpemUiCiAjZGVmaW5lIEtFWV9ERUZBVUxUX0VBU0laRQkiZGVmYXVsdF9lYXNpemUiCi0jZGVmaW5lIEtFWV9NRFNfQ09OTgkgICAgIm1kc19jb25uIgogI2RlZmluZSBLRVlfTUdTU0VDCSAgICAgICJtZ3NzZWMiCi0jZGVmaW5lIEtFWV9ORVhUX0lECSAgICAgIm5leHRfaWQiCiAjZGVmaW5lIEtFWV9SRUFEX09OTFkJICAgInJlYWQtb25seSIKICNkZWZpbmUgS0VZX1JFR0lTVEVSX1RBUkdFVCAgICAgInJlZ2lzdGVyX3RhcmdldCIKICNkZWZpbmUgS0VZX1NFVF9GUwkgICAgICAic2V0X2ZzIgogI2RlZmluZSBLRVlfVEdUX0NPVU5UCSAgICJ0Z3RfY291bnQiCiAvKiAgICAgIEtFWV9TRVRfSU5GTyBpbiBsdXN0cmVfaWRsLmggKi8KICNkZWZpbmUgS0VZX1NQVExSUENfQ09ORgkic3B0bHJwY19jb25mIgotI2RlZmluZSBLRVlfQ09OTkVDVF9GTEFHCSJjb25uZWN0X2ZsYWdzIgotI2RlZmluZSBLRVlfU1lOQ19MT0NLX0NBTkNFTCAgICAic3luY19sb2NrX2NhbmNlbCIKIAogI2RlZmluZSBLRVlfQ0FDSEVfU0VUCQkiY2FjaGVfc2V0IgogI2RlZmluZSBLRVlfQ0FDSEVfTFJVX1NIUklOSwkiY2FjaGVfbHJ1X3NocmluayIKLSNkZWZpbmUgS0VZX0NIQU5HRUxPR19JTkRFWAkiY2hhbmdlbG9nX2luZGV4IgogCiBzdHJ1Y3QgbHVfY29udGV4dDsKIApAQCAtODAxLDkgKzc0MSwxMSBAQAogCS8qIENSRUFUIG5lZWRzIHRvIGJlIHRlc3RlZCBiZWZvcmUgb3BlbiAoYm90aCBjb3VsZCBiZSBzZXQpICovCiAJaWYgKGl0LT5pdF9vcCAmIElUX0NSRUFUKQogCQlyZXR1cm4gTENLX0NXOwotCWVsc2UgaWYgKGl0LT5pdF9vcCAmIChJVF9SRUFERElSIHwgSVRfR0VUQVRUUiB8IElUX09QRU4gfCBJVF9MT09LVVAgfAorCWVsc2UgaWYgKGl0LT5pdF9vcCAmIChJVF9HRVRBVFRSIHwgSVRfT1BFTiB8IElUX0xPT0tVUCB8CiAJCQkgICAgICBJVF9MQVlPVVQpKQogCQlyZXR1cm4gTENLX0NSOworCWVsc2UgaWYgKGl0LT5pdF9vcCAmIElUX1JFQURESVIpCisJCXJldHVybiBMQ0tfUFI7CiAJZWxzZSBpZiAoaXQtPml0X29wICYgIElUX0dFVFhBVFRSKQogCQlyZXR1cm4gTENLX1BSOwogCWVsc2UgaWYgKGl0LT5pdF9vcCAmICBJVF9TRVRYQVRUUikKQEAgLTgxMyw2ICs3NTUsMTQgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAorZW51bSBtZF9jbGlfZmxhZ3MgeworCUNMSV9TRVRfTUVBCT0gQklUKDApLAorCUNMSV9STV9FTlRSWQk9IEJJVCgxKSwKKwlDTElfSEFTSDY0CT0gQklUKDIpLAorCUNMSV9BUEkzMgk9IEJJVCgzKSwKKwlDTElfTUlHUkFURQk9IEJJVCg0KSwKK307CisKIHN0cnVjdCBtZF9vcF9kYXRhIHsKIAlzdHJ1Y3QgbHVfZmlkCSAgIG9wX2ZpZDE7IC8qIG9wZXJhdGlvbiBmaWQxICh1c3VhbGx5IHBhcmVudCkgKi8KIAlzdHJ1Y3QgbHVfZmlkCSAgIG9wX2ZpZDI7IC8qIG9wZXJhdGlvbiBmaWQyICh1c3VhbGx5IGNoaWxkKSAqLwpAQCAtODIyLDcgKzc3Miw3IEBACiAJc3RydWN0IGx1c3RyZV9oYW5kbGUgICAgb3BfaGFuZGxlOwogCXM2NAkJCW9wX21vZF90aW1lOwogCWNvbnN0IGNoYXIJICAgICAqb3BfbmFtZTsKLQlpbnQJCSAgICAgb3BfbmFtZWxlbjsKKwlzaXplX3QJCQlvcF9uYW1lbGVuOwogCV9fdTMyCQkgICBvcF9tb2RlOwogCXN0cnVjdCBsbXZfc3RyaXBlX21kICAgKm9wX21lYTE7CiAJc3RydWN0IGxtdl9zdHJpcGVfbWQgICAqb3BfbWVhMjsKQEAgLTgzMSw2ICs3ODEsNyBAQAogCV9fdTMyCQkgICBvcF9mc2dpZDsKIAljZnNfY2FwX3QJICAgICAgIG9wX2NhcDsKIAl2b2lkCQkgICAqb3BfZGF0YTsKKwlzaXplX3QJCQlvcF9kYXRhX3NpemU7CiAKIAkvKiBpYXR0ciBmaWVsZHMgYW5kIGJsb2Nrcy4gKi8KIAlzdHJ1Y3QgaWF0dHIJICAgIG9wX2F0dHI7CkBAIC04NDUsMjggKzc5NiwyOSBAQAogCS8qIFZhcmlvdXMgb3BlcmF0aW9uIGZsYWdzLiAqLwogCWVudW0gbWRzX29wX2JpYXMgICAgICAgIG9wX2JpYXM7CiAKLQkvKiBPcGVyYXRpb24gdHlwZSAqLwotCV9fdTMyCQkgICBvcF9vcGM7Ci0KIAkvKiBVc2VkIGJ5IHJlYWRkaXIgKi8KIAlfX3U2NAkJICAgb3Bfb2Zmc2V0OwogCiAJLyogVXNlZCBieSByZWFkZGlyICovCi0JX191MzIJCSAgIG9wX25wYWdlczsKKwlfX3UzMgkJCW9wX21heF9wYWdlczsKIAogCS8qIHVzZWQgdG8gdHJhbnNmZXIgaW5mbyBiZXR3ZWVuIHRoZSBzdGFja3Mgb2YgTUQgY2xpZW50CiAJICogc2VlIGVudW0gb3BfY2xpX2ZsYWdzCiAJICovCi0JX191MzIJCQlvcF9jbGlfZmxhZ3M7CisJZW51bSBtZF9jbGlfZmxhZ3MJb3BfY2xpX2ZsYWdzOwogCiAJLyogRmlsZSBvYmplY3QgZGF0YSB2ZXJzaW9uIGZvciBIU00gcmVsZWFzZSwgb24gY2xpZW50ICovCiAJX191NjQJCQlvcF9kYXRhX3ZlcnNpb247CiAJc3RydWN0IGx1c3RyZV9oYW5kbGUJb3BfbGVhc2VfaGFuZGxlOworCisJLyogZGVmYXVsdCBzdHJpcGUgb2Zmc2V0ICovCisJX191MzIJCQlvcF9kZWZhdWx0X3N0cmlwZV9vZmZzZXQ7CiB9OwogCi1lbnVtIG9wX2NsaV9mbGFncyB7Ci0JQ0xJX1NFVF9NRUEJPSAxIDw8IDAsCi0JQ0xJX1JNX0VOVFJZCT0gMSA8PCAxLAorc3RydWN0IG1kX2NhbGxiYWNrIHsKKwlpbnQgKCptZF9ibG9ja2luZ19hc3QpKHN0cnVjdCBsZGxtX2xvY2sgKmxvY2ssCisJCQkgICAgICAgc3RydWN0IGxkbG1fbG9ja19kZXNjICpkZXNjLAorCQkJICAgICAgIHZvaWQgKmRhdGEsIGludCBmbGFnKTsKIH07CiAKIHN0cnVjdCBtZF9lbnF1ZXVlX2luZm87CkBAIC04NzksOCArODMxLDcgQEAKIAlzdHJ1Y3QgaW5vZGUJICAgKm1pX2RpcjsKIAlpbnQgKCptaV9jYikoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsCiAJCSAgICAgc3RydWN0IG1kX2VucXVldWVfaW5mbyAqbWluZm8sIGludCByYyk7Ci0JX191NjQJCSAgIG1pX2NiZGF0YTsKLQl1bnNpZ25lZCBpbnQJICAgIG1pX2dlbmVyYXRpb247CisJdm9pZAkJCSptaV9jYmRhdGE7CiB9OwogCiBzdHJ1Y3Qgb2JkX29wcyB7CkBAIC04OTQsOCArODQ1LDYgQEAKIAkJCSAgICAgIF9fdTMyIGtleWxlbiwgdm9pZCAqa2V5LAogCQkJICAgICAgX191MzIgdmFsbGVuLCB2b2lkICp2YWwsCiAJCQkgICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3Rfc2V0ICpzZXQpOwotCWludCAoKmF0dGFjaCkoc3RydWN0IG9iZF9kZXZpY2UgKmRldiwgdTMyIGxlbiwgdm9pZCAqZGF0YSk7Ci0JaW50ICgqZGV0YWNoKShzdHJ1Y3Qgb2JkX2RldmljZSAqZGV2KTsKIAlpbnQgKCpzZXR1cCkoc3RydWN0IG9iZF9kZXZpY2UgKmRldiwgc3RydWN0IGx1c3RyZV9jZmcgKmNmZyk7CiAJaW50ICgqcHJlY2xlYW51cCkoc3RydWN0IG9iZF9kZXZpY2UgKmRldiwKIAkJCSAgZW51bSBvYmRfY2xlYW51cF9zdGFnZSBjbGVhbnVwX3N0YWdlKTsKQEAgLTkyNyw4ICs4NzYsOCBAQAogCWludCAoKmZpZF9maW5pKShzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkKTsKIAogCS8qIEFsbG9jYXRlIG5ldyBmaWQgYWNjb3JkaW5nIHRvIHBhc3NlZCBAaGludC4gKi8KLQlpbnQgKCpmaWRfYWxsb2MpKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsdV9maWQgKmZpZCwKLQkJCSBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSk7CisJaW50ICgqZmlkX2FsbG9jKShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCisJCQkgc3RydWN0IGx1X2ZpZCAqZmlkLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSk7CiAKIAkvKgogCSAqIE9iamVjdCB3aXRoIEBmaWQgaXMgZ2V0dGluZyBkZWxldGVkLCB3ZSBtYXkgd2FudCB0byBkbyBzb21ldGhpbmcKQEAgLTk0MywxMyArODkyLDEwIEBACiAJaW50ICgqdW5wYWNrbWQpKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCiAJCQlzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqKm1lbV90Z3QsCiAJCQlzdHJ1Y3QgbG92X21kc19tZCAqZGlza19zcmMsIGludCBkaXNrX2xlbik7Ci0JaW50ICgqcHJlYWxsb2NhdGUpKHN0cnVjdCBsdXN0cmVfaGFuZGxlICosIHUzMiAqcmVxLCB1NjQgKmlkcyk7CiAJaW50ICgqY3JlYXRlKShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCi0JCSAgICAgIHN0cnVjdCBvYmRvICpvYSwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKiplYSwKLQkJICAgICAgc3RydWN0IG9iZF90cmFuc19pbmZvICpvdGkpOworCQkgICAgICBzdHJ1Y3Qgb2JkbyAqb2EsIHN0cnVjdCBvYmRfdHJhbnNfaW5mbyAqb3RpKTsKIAlpbnQgKCpkZXN0cm95KShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCi0JCSAgICAgICBzdHJ1Y3Qgb2JkbyAqb2EsIHN0cnVjdCBsb3Zfc3RyaXBlX21kICplYSwKLQkJICAgICAgIHN0cnVjdCBvYmRfdHJhbnNfaW5mbyAqb3RpLCBzdHJ1Y3Qgb2JkX2V4cG9ydCAqbWRfZXhwKTsKKwkJICAgICAgIHN0cnVjdCBvYmRvICpvYSwgc3RydWN0IG9iZF90cmFuc19pbmZvICpvdGkpOwogCWludCAoKnNldGF0dHIpKGNvbnN0IHN0cnVjdCBsdV9lbnYgKiwgc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKIAkJICAgICAgIHN0cnVjdCBvYmRfaW5mbyAqb2luZm8sIHN0cnVjdCBvYmRfdHJhbnNfaW5mbyAqb3RpKTsKIAlpbnQgKCpzZXRhdHRyX2FzeW5jKShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3Qgb2JkX2luZm8gKm9pbmZvLApAQCAtOTU5LDggKzkwNSw2IEBACiAJCSAgICAgICBzdHJ1Y3Qgb2JkX2luZm8gKm9pbmZvKTsKIAlpbnQgKCpnZXRhdHRyX2FzeW5jKShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3Qgb2JkX2luZm8gKm9pbmZvLAogCQkJICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3Rfc2V0ICpzZXQpOwotCWludCAoKmFkanVzdF9rbXMpKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20sCi0JCQkgIHU2NCBzaXplLCBpbnQgc2hyaW5rKTsKIAlpbnQgKCpwcmVwcncpKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgaW50IGNtZCwKIAkJICAgICAgc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG9iZG8gKm9hLCBpbnQgb2JqY291bnQsCiAJCSAgICAgIHN0cnVjdCBvYmRfaW9vYmogKm9iaiwgc3RydWN0IG5pb2J1Zl9yZW1vdGUgKnJlbW90ZSwKQEAgLTk3Miw4ICs5MTYsNiBAQAogCQkJc3RydWN0IG5pb2J1Zl9yZW1vdGUgKnJlbW90ZSwgaW50IHBhZ2VzLAogCQkJc3RydWN0IG5pb2J1Zl9sb2NhbCAqbG9jYWwsCiAJCQlzdHJ1Y3Qgb2JkX3RyYW5zX2luZm8gKm90aSwgaW50IHJjKTsKLQlpbnQgKCpmaW5kX2NiZGF0YSkoc3RydWN0IG9iZF9leHBvcnQgKiwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKiwKLQkJCSAgIGxkbG1faXRlcmF0b3JfdCBpdCwgdm9pZCAqZGF0YSk7CiAJaW50ICgqaW5pdF9leHBvcnQpKHN0cnVjdCBvYmRfZXhwb3J0ICpleHApOwogCWludCAoKmRlc3Ryb3lfZXhwb3J0KShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwKTsKIApAQCAtMTAwOSwyNyArOTUxLDExIEBACiAJICovCiB9OwogCi1lbnVtIHsKLQlMVVNUUkVfT1BDX01LRElSICAgID0gKDEgPDwgMCksCi0JTFVTVFJFX09QQ19TWU1MSU5LICA9ICgxIDw8IDEpLAotCUxVU1RSRV9PUENfTUtOT0QgICAgPSAoMSA8PCAyKSwKLQlMVVNUUkVfT1BDX0NSRUFURSAgID0gKDEgPDwgMyksCi0JTFVTVFJFX09QQ19BTlkgICAgICA9ICgxIDw8IDQpCi19OwotCiAvKiBsbXYgc3RydWN0dXJlcyAqLwotI2RlZmluZSBNRUFfTUFHSUNfTEFTVF9DSEFSICAgICAgMHhiMjIyMWNhMQotI2RlZmluZSBNRUFfTUFHSUNfQUxMX0NIQVJTICAgICAgMHhiMjIyYTExYwotI2RlZmluZSBNRUFfTUFHSUNfSEFTSF9TRUdNRU5UICAgMHhiMjIyYTExYgotCi0jZGVmaW5lIE1BWF9IQVNIX1NJWkVfMzIJIDB4N2ZmZmZmZmZVTAotI2RlZmluZSBNQVhfSEFTSF9TSVpFCSAgICAweDdmZmZmZmZmZmZmZmZmZmZVTEwKLSNkZWZpbmUgTUFYX0hBU0hfSElHSEVTVF9CSVQgICAgIDB4MTAwMDAwMDAwMDAwMDAwMFVMTAotCiBzdHJ1Y3QgbHVzdHJlX21kIHsKIAlzdHJ1Y3QgbWR0X2JvZHkJICpib2R5OwogCXN0cnVjdCBsb3Zfc3RyaXBlX21kICAgICpsc207Ci0Jc3RydWN0IGxtdl9zdHJpcGVfbWQgICAgKm1lYTsKKwlzdHJ1Y3QgbG12X3N0cmlwZV9tZCAgICAqbG12OwogI2lmZGVmIENPTkZJR19GU19QT1NJWF9BQ0wKIAlzdHJ1Y3QgcG9zaXhfYWNsCSpwb3NpeF9hY2w7CiAjZW5kaWYKQEAgLTEwNDQsNDggKzk3MCw1NSBAQAogCWJvb2wJCQkgIG1vZF9pc19jcmVhdGU7CiB9OwogCitzdHJ1Y3Qgb2JkX2NsaWVudF9oYW5kbGUgeworCXN0cnVjdCBsdXN0cmVfaGFuZGxlCSBvY2hfZmg7CisJc3RydWN0IGx1X2ZpZAkJIG9jaF9maWQ7CisJc3RydWN0IG1kX29wZW5fZGF0YQkqb2NoX21vZDsKKwlzdHJ1Y3QgbHVzdHJlX2hhbmRsZQkgb2NoX2xlYXNlX2hhbmRsZTsgLyogb3BlbiBsb2NrIGZvciBsZWFzZSAqLworCV9fdTMyCQkJIG9jaF9tYWdpYzsKKwlpbnQJCQkgb2NoX2ZsYWdzOworfTsKKworI2RlZmluZSBPQkRfQ0xJRU5UX0hBTkRMRV9NQUdJQyAweGQxNWVhNWVkCisKIHN0cnVjdCBsb29rdXBfaW50ZW50Oworc3RydWN0IGNsX2F0dHI7CiAKIHN0cnVjdCBtZF9vcHMgewogCWludCAoKmdldHN0YXR1cykoc3RydWN0IG9iZF9leHBvcnQgKiwgc3RydWN0IGx1X2ZpZCAqKTsKIAlpbnQgKCpudWxsX2lub2RlKShzdHJ1Y3Qgb2JkX2V4cG9ydCAqLCBjb25zdCBzdHJ1Y3QgbHVfZmlkICopOwotCWludCAoKmZpbmRfY2JkYXRhKShzdHJ1Y3Qgb2JkX2V4cG9ydCAqLCBjb25zdCBzdHJ1Y3QgbHVfZmlkICosCi0JCQkgICBsZGxtX2l0ZXJhdG9yX3QsIHZvaWQgKik7CiAJaW50ICgqY2xvc2UpKHN0cnVjdCBvYmRfZXhwb3J0ICosIHN0cnVjdCBtZF9vcF9kYXRhICosCiAJCSAgICAgc3RydWN0IG1kX29wZW5fZGF0YSAqLCBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKiopOwogCWludCAoKmNyZWF0ZSkoc3RydWN0IG9iZF9leHBvcnQgKiwgc3RydWN0IG1kX29wX2RhdGEgKiwKLQkJICAgICAgY29uc3Qgdm9pZCAqLCBpbnQsIGludCwgX191MzIsIF9fdTMyLCBjZnNfY2FwX3QsCi0JCSAgICAgIF9fdTY0LCBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKiopOworCQkgICAgICBjb25zdCB2b2lkICosIHNpemVfdCwgdW1vZGVfdCwgdWlkX3QsIGdpZF90LAorCQkgICAgICBjZnNfY2FwX3QsIF9fdTY0LCBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKiopOwogCWludCAoKmRvbmVfd3JpdGluZykoc3RydWN0IG9iZF9leHBvcnQgKiwgc3RydWN0IG1kX29wX2RhdGEgICosCiAJCQkgICAgc3RydWN0IG1kX29wZW5fZGF0YSAqKTsKIAlpbnQgKCplbnF1ZXVlKShzdHJ1Y3Qgb2JkX2V4cG9ydCAqLCBzdHJ1Y3QgbGRsbV9lbnF1ZXVlX2luZm8gKiwKKwkJICAgICAgIGNvbnN0IGxkbG1fcG9saWN5X2RhdGFfdCAqLAogCQkgICAgICAgc3RydWN0IGxvb2t1cF9pbnRlbnQgKiwgc3RydWN0IG1kX29wX2RhdGEgKiwKLQkJICAgICAgIHN0cnVjdCBsdXN0cmVfaGFuZGxlICosIHZvaWQgKiwgaW50LAotCQkgICAgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqLCBfX3U2NCk7CisJCSAgICAgICBzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAqLCBfX3U2NCk7CiAJaW50ICgqZ2V0YXR0cikoc3RydWN0IG9iZF9leHBvcnQgKiwgc3RydWN0IG1kX29wX2RhdGEgKiwKIAkJICAgICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKik7CiAJaW50ICgqZ2V0YXR0cl9uYW1lKShzdHJ1Y3Qgb2JkX2V4cG9ydCAqLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqLAogCQkJICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKik7CiAJaW50ICgqaW50ZW50X2xvY2spKHN0cnVjdCBvYmRfZXhwb3J0ICosIHN0cnVjdCBtZF9vcF9kYXRhICosCi0JCQkgICB2b2lkICosIGludCwgc3RydWN0IGxvb2t1cF9pbnRlbnQgKiwgaW50LAorCQkJICAgc3RydWN0IGxvb2t1cF9pbnRlbnQgKiwKIAkJCSAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKiwKIAkJCSAgIGxkbG1fYmxvY2tpbmdfY2FsbGJhY2ssIF9fdTY0KTsKIAlpbnQgKCpsaW5rKShzdHJ1Y3Qgb2JkX2V4cG9ydCAqLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqLAogCQkgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqKTsKIAlpbnQgKCpyZW5hbWUpKHN0cnVjdCBvYmRfZXhwb3J0ICosIHN0cnVjdCBtZF9vcF9kYXRhICosCi0JCSAgICAgIGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICosIGludCwKKwkJICAgICAgY29uc3QgY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgc2l6ZV90LAogCQkgICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKiopOwotCWludCAoKmlzX3N1YmRpcikoc3RydWN0IG9iZF9leHBvcnQgKiwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqLAotCQkJIGNvbnN0IHN0cnVjdCBsdV9maWQgKiwKLQkJCSAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKik7CiAJaW50ICgqc2V0YXR0cikoc3RydWN0IG9iZF9leHBvcnQgKiwgc3RydWN0IG1kX29wX2RhdGEgKiwgdm9pZCAqLAotCQkgICAgICAgaW50LCB2b2lkICosIGludCwgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqLAorCQkgICAgICAgc2l6ZV90LCB2b2lkICosIHNpemVfdCwgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqLAogCQkJIHN0cnVjdCBtZF9vcGVuX2RhdGEgKiptb2QpOwogCWludCAoKnN5bmMpKHN0cnVjdCBvYmRfZXhwb3J0ICosIGNvbnN0IHN0cnVjdCBsdV9maWQgKiwKIAkJICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKik7Ci0JaW50ICgqcmVhZHBhZ2UpKHN0cnVjdCBvYmRfZXhwb3J0ICosIHN0cnVjdCBtZF9vcF9kYXRhICosCi0JCQlzdHJ1Y3QgcGFnZSAqKiwgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqKTsKLQorCWludCAoKnJlYWRfcGFnZSkoc3RydWN0IG9iZF9leHBvcnQgKiwgc3RydWN0IG1kX29wX2RhdGEgKiwKKwkJCSBzdHJ1Y3QgbWRfY2FsbGJhY2sgKmNiX29wLCBfX3U2NCBoYXNoX29mZnNldCwKKwkJCSBzdHJ1Y3QgcGFnZSAqKnBwYWdlKTsKIAlpbnQgKCp1bmxpbmspKHN0cnVjdCBvYmRfZXhwb3J0ICosIHN0cnVjdCBtZF9vcF9kYXRhICosCiAJCSAgICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKik7CiAKQEAgLTEwOTcsNyArMTAzMCw3IEBACiAJCQl1NjQsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQsIGludCwgaW50LAogCQkJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqKTsKIAotCWludCAoKmluaXRfZWFfc2l6ZSkoc3RydWN0IG9iZF9leHBvcnQgKiwgaW50LCBpbnQsIGludCwgaW50KTsKKwlpbnQgKCppbml0X2VhX3NpemUpKHN0cnVjdCBvYmRfZXhwb3J0ICosIHUzMiwgdTMyLCB1MzIsIHUzMik7CiAKIAlpbnQgKCpnZXRfbHVzdHJlX21kKShzdHJ1Y3Qgb2JkX2V4cG9ydCAqLCBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKiwKIAkJCSAgICAgc3RydWN0IG9iZF9leHBvcnQgKiwgc3RydWN0IG9iZF9leHBvcnQgKiwKQEAgLTExMDUsMTIgKzEwMzgsMTcgQEAKIAogCWludCAoKmZyZWVfbHVzdHJlX21kKShzdHJ1Y3Qgb2JkX2V4cG9ydCAqLCBzdHJ1Y3QgbHVzdHJlX21kICopOwogCisJaW50ICgqbWVyZ2VfYXR0cikoc3RydWN0IG9iZF9leHBvcnQgKiwKKwkJCSAgY29uc3Qgc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSwKKwkJCSAgc3RydWN0IGNsX2F0dHIgKmF0dHIsIGxkbG1fYmxvY2tpbmdfY2FsbGJhY2spOworCiAJaW50ICgqc2V0X29wZW5fcmVwbGF5X2RhdGEpKHN0cnVjdCBvYmRfZXhwb3J0ICosCiAJCQkJICAgIHN0cnVjdCBvYmRfY2xpZW50X2hhbmRsZSAqLAogCQkJCSAgICBzdHJ1Y3QgbG9va3VwX2ludGVudCAqKTsKIAlpbnQgKCpjbGVhcl9vcGVuX3JlcGxheV9kYXRhKShzdHJ1Y3Qgb2JkX2V4cG9ydCAqLAogCQkJCSAgICAgIHN0cnVjdCBvYmRfY2xpZW50X2hhbmRsZSAqKTsKLQlpbnQgKCpzZXRfbG9ja19kYXRhKShzdHJ1Y3Qgb2JkX2V4cG9ydCAqLCBfX3U2NCAqLCB2b2lkICosIF9fdTY0ICopOworCWludCAoKnNldF9sb2NrX2RhdGEpKHN0cnVjdCBvYmRfZXhwb3J0ICosIGNvbnN0IHN0cnVjdCBsdXN0cmVfaGFuZGxlICosCisJCQkgICAgIHZvaWQgKiwgX191NjQgKik7CiAKIAllbnVtIGxkbG1fbW9kZSAoKmxvY2tfbWF0Y2gpKHN0cnVjdCBvYmRfZXhwb3J0ICosIF9fdTY0LAogCQkJCSAgICAgY29uc3Qgc3RydWN0IGx1X2ZpZCAqLCBlbnVtIGxkbG1fdHlwZSwKQEAgLTExMjEsNiArMTA1OSwxMSBAQAogCQkJICAgICBsZGxtX3BvbGljeV9kYXRhX3QgKiwgZW51bSBsZGxtX21vZGUsCiAJCQkgICAgIGVudW0gbGRsbV9jYW5jZWxfZmxhZ3MgZmxhZ3MsIHZvaWQgKm9wYXF1ZSk7CiAKKwlpbnQgKCpnZXRfZmlkX2Zyb21fbHNtKShzdHJ1Y3Qgb2JkX2V4cG9ydCAqLAorCQkJCWNvbnN0IHN0cnVjdCBsbXZfc3RyaXBlX21kICosCisJCQkJY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sCisJCQkJc3RydWN0IGx1X2ZpZCAqZmlkKTsKKwogCWludCAoKmludGVudF9nZXRhdHRyX2FzeW5jKShzdHJ1Y3Qgb2JkX2V4cG9ydCAqLAogCQkJCSAgICBzdHJ1Y3QgbWRfZW5xdWV1ZV9pbmZvICosCiAJCQkJICAgIHN0cnVjdCBsZGxtX2VucXVldWVfaW5mbyAqKTsKQEAgLTExMzcsOCArMTA4MCw2IEBACiAKIHN0cnVjdCBsc21fb3BlcmF0aW9ucyB7CiAJdm9pZCAoKmxzbV9mcmVlKShzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqKTsKLQlpbnQgKCpsc21fZGVzdHJveSkoc3RydWN0IGxvdl9zdHJpcGVfbWQgKiwgc3RydWN0IG9iZG8gKm9hLAotCQkJICAgc3RydWN0IG9iZF9leHBvcnQgKm1kX2V4cCk7CiAJdm9pZCAoKmxzbV9zdHJpcGVfYnlfaW5kZXgpKHN0cnVjdCBsb3Zfc3RyaXBlX21kICosIGludCAqLCB1NjQgKiwKIAkJCQkgICAgdTY0ICopOwogCXZvaWQgKCpsc21fc3RyaXBlX2J5X29mZnNldCkoc3RydWN0IGxvdl9zdHJpcGVfbWQgKiwgaW50ICosIHU2NCAqLApAQCAtMTE2NCwxMCArMTEwNSw2IEBACiAJfQogfQogCi0vKiBSZXF1ZXN0cyBmb3Igb2JkX2V4dGVudF9jYWxjKCkgKi8KLSNkZWZpbmUgT0JEX0NBTENfU1RSSVBFX1NUQVJUICAgMQotI2RlZmluZSBPQkRfQ0FMQ19TVFJJUEVfRU5EICAgICAyCi0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IG1kX29wZW5fZGF0YSAqb2JkX21vZF9hbGxvYyh2b2lkKQogewogCXN0cnVjdCBtZF9vcGVuX2RhdGEgKm1vZDsKQEAgLTEyMTEsNyArMTE0OCw4IEBACiAJcmV0dXJuIGx1X2Rldi0+bGRfb2JkLT5vYmRfbmFtZTsKIH0KIAotc3RhdGljIGlubGluZSBib29sIGZpbGVuYW1lX2lzX3ZvbGF0aWxlKGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCBpbnQgKmlkeCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBmaWxlbmFtZV9pc192b2xhdGlsZShjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZWxlbiwKKwkJCQkJaW50ICppZHgpCiB7CiAJY29uc3QgY2hhcgkqc3RhcnQ7CiAJY2hhcgkJKmVuZDsKQEAgLTEyNTksNCArMTE5NywyOCBAQAogCXJldHVybiBvYmQtPnUuY2xpLmNsX21heF9wYWdlc19wZXJfcnBjIDw8IFBBR0VfU0hJRlQ7CiB9CiAKKy8qCisgKiB3aGVuIFJQQyBzaXplIG9yIHRoZSBtYXggUlBDcyBpbiBmbGlnaHQgaXMgaW5jcmVhc2VkLCB0aGUgbWF4IGRpcnR5IHBhZ2VzCisgKiBvZiB0aGUgY2xpZW50IHNob3VsZCBiZSBpbmNyZWFzZWQgYWNjb3JkaW5nbHkgdG8gYXZvaWQgc2VuZGluZyBmcmFnbWVudGVkCisgKiBSUENzIG92ZXIgdGhlIG5ldHdvcmsgd2hlbiB0aGUgY2xpZW50IHJ1bnMgb3V0IG9mIHRoZSBtYXhpbXVtIGRpcnR5IHNwYWNlCisgKiB3aGVuIHNvIG1hbnkgUlBDcyBhcmUgYmVpbmcgZ2VuZXJhdGVkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2xpZW50X2FkanVzdF9tYXhfZGlydHkoc3RydWN0IGNsaWVudF9vYmQgKmNsaSkKK3sKKwkvKiBpbml0aWFsaXppbmcgKi8KKwlpZiAoY2xpLT5jbF9kaXJ0eV9tYXhfcGFnZXMgPD0gMCkKKwkJY2xpLT5jbF9kaXJ0eV9tYXhfcGFnZXMgPQorCQkJKE9TQ19NQVhfRElSVFlfREVGQVVMVCAqIDEwMjQgKiAxMDI0KSA+PiBQQUdFX1NISUZUOworCWVsc2UgeworCQl1bnNpZ25lZCBsb25nIGRpcnR5X21heCA9IGNsaS0+Y2xfbWF4X3JwY3NfaW5fZmxpZ2h0ICoKKwkJCQkJICBjbGktPmNsX21heF9wYWdlc19wZXJfcnBjOworCisJCWlmIChkaXJ0eV9tYXggPiBjbGktPmNsX2RpcnR5X21heF9wYWdlcykKKwkJCWNsaS0+Y2xfZGlydHlfbWF4X3BhZ2VzID0gZGlydHlfbWF4OworCX0KKworCWlmIChjbGktPmNsX2RpcnR5X21heF9wYWdlcyA+IHRvdGFscmFtX3BhZ2VzIC8gOCkKKwkJY2xpLT5jbF9kaXJ0eV9tYXhfcGFnZXMgPSB0b3RhbHJhbV9wYWdlcyAvIDg7Cit9CisKICNlbmRpZiAvKiBfX09CRF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL29iZF9jbGFzcy5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9vYmRfY2xhc3MuaAppbmRleCA2NDgyYTkzLi4xNjA5NGRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL29iZF9jbGFzcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvb2JkX2NsYXNzLmgKQEAgLTU2LDcgKzU2LDYgQEAKICNkZWZpbmUgT0JEX1NUQVRGU19GT1JfTURUMAkweDAwMDgJLyogVGhlIHN0YXRmcyBpcyBvbmx5IGZvciByZXRyaWV2aW5nCiAJCQkJCSAqIGluZm9ybWF0aW9uIGZyb20gTURUMC4KIAkJCQkJICovCi0jZGVmaW5lIE9CRF9GTF9QVU5DSAkgICAgMHgwMDAwMDAwMSAgLyogVG8gaW5kaWNhdGUgaXQgaXMgcHVuY2ggb3BlcmF0aW9uICovCiAKIC8qIE9CRCBEZXZpY2UgRGVjbGFyYXRpb25zICovCiBleHRlcm4gc3RydWN0IG9iZF9kZXZpY2UgKm9iZF9kZXZzW01BWF9PQkRfREVWSUNFU107CkBAIC05Nyw2ICs5NiwxMSBAQAogdm9pZCBvYmRfem9tYmllX2ltcGV4cF9zdG9wKHZvaWQpOwogdm9pZCBvYmRfem9tYmllX2JhcnJpZXIodm9pZCk7CiAKK2ludCBvYmRfZ2V0X3JlcXVlc3Rfc2xvdChzdHJ1Y3QgY2xpZW50X29iZCAqY2xpKTsKK3ZvaWQgb2JkX3B1dF9yZXF1ZXN0X3Nsb3Qoc3RydWN0IGNsaWVudF9vYmQgKmNsaSk7CitfX3UzMiBvYmRfZ2V0X21heF9ycGNzX2luX2ZsaWdodChzdHJ1Y3QgY2xpZW50X29iZCAqY2xpKTsKK2ludCBvYmRfc2V0X21heF9ycGNzX2luX2ZsaWdodChzdHJ1Y3QgY2xpZW50X29iZCAqY2xpLCBfX3UzMiBtYXgpOworCiBzdHJ1Y3QgbGxvZ19oYW5kbGU7CiBzdHJ1Y3QgbGxvZ19yZWNfaGRyOwogdHlwZWRlZiBpbnQgKCpsbG9nX2NiX3QpKGNvbnN0IHN0cnVjdCBsdV9lbnYgKiwgc3RydWN0IGxsb2dfaGFuZGxlICosCkBAIC0yNjUsMTAgKzI2OSwxMCBAQAogc3RydWN0IGlub2RlOwogc3RydWN0IGx1X2F0dHI7CiBzdHJ1Y3Qgb2JkbzsKLXZvaWQgb2Jkb19yZWZyZXNoX2lub2RlKHN0cnVjdCBpbm9kZSAqZHN0LCBzdHJ1Y3Qgb2JkbyAqc3JjLCB1MzIgdmFsaWQpOwordm9pZCBvYmRvX3JlZnJlc2hfaW5vZGUoc3RydWN0IGlub2RlICpkc3QsIGNvbnN0IHN0cnVjdCBvYmRvICpzcmMsIHUzMiB2YWxpZCk7CiAKLXZvaWQgb2Jkb190b19pb29iaihzdHJ1Y3Qgb2JkbyAqb2EsIHN0cnVjdCBvYmRfaW9vYmogKmlvb2JqKTsKLXZvaWQgbWRfZnJvbV9vYmRvKHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLCBzdHJ1Y3Qgb2JkbyAqb2EsIHUzMiB2YWxpZCk7Cit2b2lkIG9iZG9fdG9faW9vYmooY29uc3Qgc3RydWN0IG9iZG8gKm9hLCBzdHJ1Y3Qgb2JkX2lvb2JqICppb29iaik7Cit2b2lkIG1kX2Zyb21fb2JkbyhzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwgY29uc3Qgc3RydWN0IG9iZG8gKm9hLCB1MzIgdmFsaWQpOwogCiAjZGVmaW5lIE9CVChkZXYpCShkZXYpLT5vYmRfdHlwZQogI2RlZmluZSBPQlAoZGV2LCBvcCkgICAgKGRldiktPm9iZF90eXBlLT50eXBfZHRfb3BzLT5vcApAQCAtNjczLDE1ICs2NzcsNiBAQAogCXJldHVybiByYzsKIH0KIAotLyogaGVscGVyIGZ1bmN0aW9ucyAqLwotc3RhdGljIGlubGluZSBpbnQgb2JkX2FsbG9jX21lbW1kKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCi0JCQkJICBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqKm1lbV90Z3QpCi17Ci0JTEFTU0VSVChtZW1fdGd0KTsKLQlMQVNTRVJUKCEqbWVtX3RndCk7Ci0JcmV0dXJuIG9iZF91bnBhY2ttZChleHAsIG1lbV90Z3QsIE5VTEwsIDApOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBvYmRfZnJlZV9tZW1tZChzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAogCQkJCSBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqKm1lbV90Z3QpCiB7CkBAIC02OTUsMjkgKzY5MCwyNiBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludCBvYmRfY3JlYXRlKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKLQkJCSAgICAgc3RydWN0IG9iZG8gKm9iZG8sIHN0cnVjdCBsb3Zfc3RyaXBlX21kICoqZWEsCi0JCQkgICAgIHN0cnVjdCBvYmRfdHJhbnNfaW5mbyAqb3RpKQorCQkJICAgICBzdHJ1Y3Qgb2JkbyAqb2Jkbywgc3RydWN0IG9iZF90cmFuc19pbmZvICpvdGkpCiB7CiAJaW50IHJjOwogCiAJRVhQX0NIRUNLX0RUX09QKGV4cCwgY3JlYXRlKTsKIAlFWFBfQ09VTlRFUl9JTkNSRU1FTlQoZXhwLCBjcmVhdGUpOwogCi0JcmMgPSBPQlAoZXhwLT5leHBfb2JkLCBjcmVhdGUpKGVudiwgZXhwLCBvYmRvLCBlYSwgb3RpKTsKKwlyYyA9IE9CUChleHAtPmV4cF9vYmQsIGNyZWF0ZSkoZW52LCBleHAsIG9iZG8sIG90aSk7CiAJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBvYmRfZGVzdHJveShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCi0JCQkgICAgICBzdHJ1Y3Qgb2JkbyAqb2Jkbywgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmVhLAotCQkJICAgICAgc3RydWN0IG9iZF90cmFuc19pbmZvICpvdGksCi0JCQkgICAgICBzdHJ1Y3Qgb2JkX2V4cG9ydCAqbWRfZXhwKQorCQkJICAgICAgc3RydWN0IG9iZG8gKm9iZG8sIHN0cnVjdCBvYmRfdHJhbnNfaW5mbyAqb3RpKQogewogCWludCByYzsKIAogCUVYUF9DSEVDS19EVF9PUChleHAsIGRlc3Ryb3kpOwogCUVYUF9DT1VOVEVSX0lOQ1JFTUVOVChleHAsIGRlc3Ryb3kpOwogCi0JcmMgPSBPQlAoZXhwLT5leHBfb2JkLCBkZXN0cm95KShlbnYsIGV4cCwgb2JkbywgZWEsIG90aSwgbWRfZXhwKTsKKwlyYyA9IE9CUChleHAtPmV4cF9vYmQsIGRlc3Ryb3kpKGVudiwgZXhwLCBvYmRvLCBvdGkpOwogCXJldHVybiByYzsKIH0KIApAQCAtOTI1LDcgKzkxNyw4IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBvYmRfZmlkX2FsbG9jKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCitzdGF0aWMgaW5saW5lIGludCBvYmRfZmlkX2FsbG9jKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwKKwkJCQlzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAogCQkJCXN0cnVjdCBsdV9maWQgKmZpZCwKIAkJCQlzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSkKIHsKQEAgLTkzNCw3ICs5MjcsNyBAQAogCUVYUF9DSEVDS19EVF9PUChleHAsIGZpZF9hbGxvYyk7CiAJRVhQX0NPVU5URVJfSU5DUkVNRU5UKGV4cCwgZmlkX2FsbG9jKTsKIAotCXJjID0gT0JQKGV4cC0+ZXhwX29iZCwgZmlkX2FsbG9jKShleHAsIGZpZCwgb3BfZGF0YSk7CisJcmMgPSBPQlAoZXhwLT5leHBfb2JkLCBmaWRfYWxsb2MpKGVudiwgZXhwLCBmaWQsIG9wX2RhdGEpOwogCXJldHVybiByYzsKIH0KIApAQCAtMTE0NywxOSArMTE0MCw2IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBvYmRfYWRqdXN0X2ttcyhzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAotCQkJCSBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtLCB1NjQgc2l6ZSwKLQkJCQkgaW50IHNocmluaykKLXsKLQlpbnQgcmM7Ci0KLQlFWFBfQ0hFQ0tfRFRfT1AoZXhwLCBhZGp1c3Rfa21zKTsKLQlFWFBfQ09VTlRFUl9JTkNSRU1FTlQoZXhwLCBhZGp1c3Rfa21zKTsKLQotCXJjID0gT0JQKGV4cC0+ZXhwX29iZCwgYWRqdXN0X2ttcykoZXhwLCBsc20sIHNpemUsIHNocmluayk7Ci0JcmV0dXJuIHJjOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBvYmRfaW9jb250cm9sKHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCiAJCQkJaW50IGxlbiwgdm9pZCAqa2FyZywgdm9pZCBfX3VzZXIgKnVhcmcpCiB7CkBAIC0xMTcyLDE5ICsxMTUyLDYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IG9iZF9maW5kX2NiZGF0YShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAotCQkJCSAgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwKLQkJCQkgIGxkbG1faXRlcmF0b3JfdCBpdCwgdm9pZCAqZGF0YSkKLXsKLQlpbnQgcmM7Ci0KLQlFWFBfQ0hFQ0tfRFRfT1AoZXhwLCBmaW5kX2NiZGF0YSk7Ci0JRVhQX0NPVU5URVJfSU5DUkVNRU5UKGV4cCwgZmluZF9jYmRhdGEpOwotCi0JcmMgPSBPQlAoZXhwLT5leHBfb2JkLCBmaW5kX2NiZGF0YSkoZXhwLCBsc20sIGl0LCBkYXRhKTsKLQlyZXR1cm4gcmM7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBvYmRfaW1wb3J0X2V2ZW50KHN0cnVjdCBvYmRfZGV2aWNlICpvYmQsCiAJCQkJICAgIHN0cnVjdCBvYmRfaW1wb3J0ICppbXAsCiAJCQkJICAgIGVudW0gb2JkX2ltcG9ydF9ldmVudCBldmVudCkKQEAgLTEyMTAsMTIgKzExNzcsNyBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JLyogdGhlIGNoZWNrIGZvciBhc3luY19yZWNvdiBpcyBhIGNvbXBsZXRlIGhhY2sgLSBJJ20gaGVyZWJ5Ci0JICogb3ZlcmxvYWRpbmcgdGhlIG1lYW5pbmcgdG8gYWxzbyBtZWFuICJ0aGlzIHdhcyBjYWxsZWQgZnJvbQotCSAqIG1kc19wb3N0c2V0dXAiLiAgSSBrbm93IHRoYXQgbXkgbWRzIGlzIGFibGUgdG8gaGFuZGxlIG5vdGlmaWVzCi0JICogYnkgdGhpcyBwb2ludCwgYW5kIGl0IG5lZWRzIHRvIGdldCB0aGVtIHRvIGV4ZWN1dGUgbWRzX3Bvc3RyZWNvdi4KLQkgKi8KLQlpZiAoIW9iZC0+b2JkX3NldF91cCAmJiAhb2JkLT5vYmRfYXN5bmNfcmVjb3YpIHsKKwlpZiAoIW9iZC0+b2JkX3NldF91cCkgewogCQlDREVCVUcoRF9IQSwgIm9iZCAlcyBub3Qgc2V0IHVwXG4iLCBvYmQtPm9iZF9uYW1lKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTM1OCwxOCArMTMyMCw2IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBtZF9maW5kX2NiZGF0YShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAotCQkJCSBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQsCi0JCQkJIGxkbG1faXRlcmF0b3JfdCBpdCwgdm9pZCAqZGF0YSkKLXsKLQlpbnQgcmM7Ci0KLQlFWFBfQ0hFQ0tfTURfT1AoZXhwLCBmaW5kX2NiZGF0YSk7Ci0JRVhQX01EX0NPVU5URVJfSU5DUkVNRU5UKGV4cCwgZmluZF9jYmRhdGEpOwotCXJjID0gTURQKGV4cC0+ZXhwX29iZCwgZmluZF9jYmRhdGEpKGV4cCwgZmlkLCBpdCwgZGF0YSk7Ci0JcmV0dXJuIHJjOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBtZF9jbG9zZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKIAkJCSAgIHN0cnVjdCBtZF9vcGVuX2RhdGEgKm1vZCwKIAkJCSAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXVlc3QpCkBAIC0xMzgzLDkgKzEzMzMsOSBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludCBtZF9jcmVhdGUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCQkgICAgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGRhdGFsZW4sIGludCBtb2RlLCBfX3UzMiB1aWQsCi0JCQkgICAgX191MzIgZ2lkLCBjZnNfY2FwX3QgY2FwX2VmZmVjdGl2ZSwgX191NjQgcmRldiwKLQkJCSAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0KQorCQkJICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhbGVuLCB1bW9kZV90IG1vZGUsCisJCQkgICAgdWlkX3QgdWlkLCBnaWRfdCBnaWQsIGNmc19jYXBfdCBjYXBfZWZmZWN0aXZlLAorCQkJICAgIF9fdTY0IHJkZXYsIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXVlc3QpCiB7CiAJaW50IHJjOwogCkBAIC0xNDEwLDE5ICsxMzYwLDE4IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IG1kX2VucXVldWUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKIAkJCSAgICAgc3RydWN0IGxkbG1fZW5xdWV1ZV9pbmZvICplaW5mbywKKwkJCSAgICAgY29uc3QgbGRsbV9wb2xpY3lfZGF0YV90ICpwb2xpY3ksCiAJCQkgICAgIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCwKIAkJCSAgICAgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCiAJCQkgICAgIHN0cnVjdCBsdXN0cmVfaGFuZGxlICpsb2NraCwKLQkJCSAgICAgdm9pZCAqbG1tLCBpbnQgbG1tc2l6ZSwKLQkJCSAgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxLAogCQkJICAgICBfX3U2NCBleHRyYV9sb2NrX2ZsYWdzKQogewogCWludCByYzsKIAogCUVYUF9DSEVDS19NRF9PUChleHAsIGVucXVldWUpOwogCUVYUF9NRF9DT1VOVEVSX0lOQ1JFTUVOVChleHAsIGVucXVldWUpOwotCXJjID0gTURQKGV4cC0+ZXhwX29iZCwgZW5xdWV1ZSkoZXhwLCBlaW5mbywgaXQsIG9wX2RhdGEsIGxvY2toLAotCQkJCQlsbW0sIGxtbXNpemUsIHJlcSwgZXh0cmFfbG9ja19mbGFncyk7CisJcmMgPSBNRFAoZXhwLT5leHBfb2JkLCBlbnF1ZXVlKShleHAsIGVpbmZvLCBwb2xpY3ksIGl0LCBvcF9kYXRhLCBsb2NraCwKKwkJCQkJZXh0cmFfbG9ja19mbGFncyk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0xNDM5LDkgKzEzODgsOSBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludCBtZF9pbnRlbnRfbG9jayhzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAotCQkJCSBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwgdm9pZCAqbG1tLAotCQkJCSBpbnQgbG1tc2l6ZSwgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0LAotCQkJCSBpbnQgbG9va3VwX2ZsYWdzLCBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXFwLAorCQkJCSBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKKwkJCQkgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0LAorCQkJCSBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXFwLAogCQkJCSBsZGxtX2Jsb2NraW5nX2NhbGxiYWNrIGNiX2Jsb2NraW5nLAogCQkJCSBfX3U2NCBleHRyYV9sb2NrX2ZsYWdzKQogewpAQCAtMTQ0OSw5ICsxMzk4LDggQEAKIAogCUVYUF9DSEVDS19NRF9PUChleHAsIGludGVudF9sb2NrKTsKIAlFWFBfTURfQ09VTlRFUl9JTkNSRU1FTlQoZXhwLCBpbnRlbnRfbG9jayk7Ci0JcmMgPSBNRFAoZXhwLT5leHBfb2JkLCBpbnRlbnRfbG9jaykoZXhwLCBvcF9kYXRhLCBsbW0sIGxtbXNpemUsCi0JCQkJCSAgICBpdCwgbG9va3VwX2ZsYWdzLCByZXFwLCBjYl9ibG9ja2luZywKLQkJCQkJICAgIGV4dHJhX2xvY2tfZmxhZ3MpOworCXJjID0gTURQKGV4cC0+ZXhwX29iZCwgaW50ZW50X2xvY2spKGV4cCwgb3BfZGF0YSwgaXQsIHJlcXAsCisJCQkJCSAgICBjYl9ibG9ja2luZywgZXh0cmFfbG9ja19mbGFncyk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0xNDY3LDggKzE0MTUsOCBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludCBtZF9yZW5hbWUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCQkgICAgY29uc3QgY2hhciAqb2xkLCBpbnQgb2xkbGVuLCBjb25zdCBjaGFyICpuZXcsCi0JCQkgICAgaW50IG5ld2xlbiwgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCkKKwkJCSAgICBjb25zdCBjaGFyICpvbGQsIHNpemVfdCBvbGRsZW4sIGNvbnN0IGNoYXIgKm5ldywKKwkJCSAgICBzaXplX3QgbmV3bGVuLCBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0KQogewogCWludCByYzsKIApAQCAtMTQ3OSwyMSArMTQyNyw4IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBtZF9pc19zdWJkaXIoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbHVfZmlkICpwZmlkLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBsdV9maWQgKmNmaWQsCi0JCQkgICAgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCkKLXsKLQlpbnQgcmM7Ci0KLQlFWFBfQ0hFQ0tfTURfT1AoZXhwLCBpc19zdWJkaXIpOwotCUVYUF9NRF9DT1VOVEVSX0lOQ1JFTUVOVChleHAsIGlzX3N1YmRpcik7Ci0JcmMgPSBNRFAoZXhwLT5leHBfb2JkLCBpc19zdWJkaXIpKGV4cCwgcGZpZCwgY2ZpZCwgcmVxdWVzdCk7Ci0JcmV0dXJuIHJjOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBtZF9zZXRhdHRyKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQkJICAgICB2b2lkICplYSwgaW50IGVhbGVuLCB2b2lkICplYTIsIGludCBlYTJsZW4sCisJCQkgICAgIHZvaWQgKmVhLCBzaXplX3QgZWFsZW4sIHZvaWQgKmVhMiwgc2l6ZV90IGVhMmxlbiwKIAkJCSAgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCwKIAkJCSAgICAgc3RydWN0IG1kX29wZW5fZGF0YSAqKm1vZCkKIHsKQEAgLTE1MTcsMTUgKzE0NTIsMTggQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IG1kX3JlYWRwYWdlKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBtZF9vcF9kYXRhICpvcGRhdGEsCi0JCQkgICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLAotCQkJICAgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCkKK3N0YXRpYyBpbmxpbmUgaW50IG1kX3JlYWRfcGFnZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAorCQkJICAgICAgIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAorCQkJICAgICAgIHN0cnVjdCBtZF9jYWxsYmFjayAqY2Jfb3AsCisJCQkgICAgICAgX191NjQgIGhhc2hfb2Zmc2V0LAorCQkJICAgICAgIHN0cnVjdCBwYWdlICoqcHBhZ2UpCiB7CiAJaW50IHJjOwogCi0JRVhQX0NIRUNLX01EX09QKGV4cCwgcmVhZHBhZ2UpOwotCUVYUF9NRF9DT1VOVEVSX0lOQ1JFTUVOVChleHAsIHJlYWRwYWdlKTsKLQlyYyA9IE1EUChleHAtPmV4cF9vYmQsIHJlYWRwYWdlKShleHAsIG9wZGF0YSwgcGFnZXMsIHJlcXVlc3QpOworCUVYUF9DSEVDS19NRF9PUChleHAsIHJlYWRfcGFnZSk7CisJRVhQX01EX0NPVU5URVJfSU5DUkVNRU5UKGV4cCwgcmVhZF9wYWdlKTsKKwlyYyA9IE1EUChleHAtPmV4cF9vYmQsIHJlYWRfcGFnZSkoZXhwLCBvcF9kYXRhLCBjYl9vcCwgaGFzaF9vZmZzZXQsCisJCQkJCSAgcHBhZ2UpOwogCXJldHVybiByYzsKIH0KIApAQCAtMTU1OSw2ICsxNDk3LDE2IEBACiAJcmV0dXJuIE1EUChleHAtPmV4cF9vYmQsIGZyZWVfbHVzdHJlX21kKShleHAsIG1kKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgbWRfbWVyZ2VfYXR0cihzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAorCQkJCWNvbnN0IHN0cnVjdCBsbXZfc3RyaXBlX21kICpsc20sCisJCQkJc3RydWN0IGNsX2F0dHIgKmF0dHIsCisJCQkJbGRsbV9ibG9ja2luZ19jYWxsYmFjayBjYikKK3sKKwlFWFBfQ0hFQ0tfTURfT1AoZXhwLCBtZXJnZV9hdHRyKTsKKwlFWFBfTURfQ09VTlRFUl9JTkNSRU1FTlQoZXhwLCBtZXJnZV9hdHRyKTsKKwlyZXR1cm4gTURQKGV4cC0+ZXhwX29iZCwgbWVyZ2VfYXR0cikoZXhwLCBsc20sIGF0dHIsIGNiKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgbWRfc2V0eGF0dHIoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkLAogCQkJICAgICAgdTY0IHZhbGlkLCBjb25zdCBjaGFyICpuYW1lLAogCQkJICAgICAgY29uc3QgY2hhciAqaW5wdXQsIGludCBpbnB1dF9zaXplLApAQCAtMTYwMyw3ICsxNTUxLDggQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQgbWRfc2V0X2xvY2tfZGF0YShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAotCQkJCSAgIF9fdTY0ICpsb2NraCwgdm9pZCAqZGF0YSwgX191NjQgKmJpdHMpCisJCQkJICAgY29uc3Qgc3RydWN0IGx1c3RyZV9oYW5kbGUgKmxvY2toLAorCQkJCSAgIHZvaWQgKmRhdGEsIF9fdTY0ICpiaXRzKQogewogCUVYUF9DSEVDS19NRF9PUChleHAsIHNldF9sb2NrX2RhdGEpOwogCUVYUF9NRF9DT1VOVEVSX0lOQ1JFTUVOVChleHAsIHNldF9sb2NrX2RhdGEpOwpAQCAtMTY3NCw2ICsxNjIzLDE5IEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgaW5saW5lIGludCBtZF9nZXRfZmlkX2Zyb21fbHNtKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSwKKwkJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKKwkJCQkgICAgICBzdHJ1Y3QgbHVfZmlkICpmaWQpCit7CisJaW50IHJjOworCisJRVhQX0NIRUNLX01EX09QKGV4cCwgZ2V0X2ZpZF9mcm9tX2xzbSk7CisJRVhQX01EX0NPVU5URVJfSU5DUkVNRU5UKGV4cCwgZ2V0X2ZpZF9mcm9tX2xzbSk7CisJcmMgPSBNRFAoZXhwLT5leHBfb2JkLCBnZXRfZmlkX2Zyb21fbHNtKShleHAsIGxzbSwgbmFtZSwgbmFtZWxlbiwgZmlkKTsKKwlyZXR1cm4gcmM7Cit9CisKIC8qIE9CRCBNZXRhZGF0YSBTdXBwb3J0ICovCiAKIGludCBvYmRfaW5pdF9jYWNoZXModm9pZCk7CkBAIC0xNjgyLDE2ICsxNjQ0LDYgQEAKIC8qIHN1cHBvcnQgcm91dGluZXMgKi8KIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqb2Jkb19jYWNoZXA7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBvYmRvMmZpZChzdHJ1Y3Qgb2JkbyAqb2EsIHN0cnVjdCBsdV9maWQgKmZpZCkKLXsKLQkvKiBzb21ldGhpbmcgaGVyZSAqLwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZmlkMm9iZG8oc3RydWN0IGx1X2ZpZCAqZmlkLCBzdHJ1Y3Qgb2JkbyAqb2EpCi17Ci0JLyogc29tZXRoaW5nIGhlcmUgKi8KLX0KLQogdHlwZWRlZiBpbnQgKCpyZWdpc3Rlcl9sd3BfY2IpKHZvaWQgKmRhdGEpOwogCiBzdHJ1Y3QgbHdwX3JlZ2lzdGVyX2l0ZW0gewpAQCAtMTcxMCw2ICsxNjYyLDkgQEAKIGV4dGVybiBpbnQgKCpwdGxycGNfcHV0X2Nvbm5lY3Rpb25fc3VwZXJoYWNrKShzdHJ1Y3QgcHRscnBjX2Nvbm5lY3Rpb24gKmMpOwogCiAvKiBvYmRfbW91bnQuYyAqLworaW50IGx1c3RyZV91bnJlZ2lzdGVyX2ZzKHZvaWQpOworaW50IGx1c3RyZV9yZWdpc3Rlcl9mcyh2b2lkKTsKK2ludCBsdXN0cmVfY2hlY2tfZXhjbHVzaW9uKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNoYXIgKnN2bmFtZSk7CiAKIC8qIHN5c2N0bC5jICovCiBpbnQgb2JkX3N5c2N0bF9pbml0KHZvaWQpOwpAQCAtMTczMCw4ICsxNjg1LDI0IEBACiBleHRlcm4gY2hhciBvYmRfam9iaWRfbm9kZVtdOwogZXh0ZXJuIHN0cnVjdCBtaXNjZGV2aWNlIG9iZF9wc2RldjsKIGV4dGVybiBzcGlubG9ja190IG9iZF90eXBlc19sb2NrOworaW50IGNsYXNzX3Byb2Nmc19pbml0KHZvaWQpOworaW50IGNsYXNzX3Byb2Nmc19jbGVhbih2b2lkKTsKIAogLyogcHJuZy5jICovCiAjZGVmaW5lIGxsX2dlbmVyYXRlX3JhbmRvbV91dWlkKHV1aWRfb3V0KSBjZnNfZ2V0X3JhbmRvbV9ieXRlcyh1dWlkX291dCwgc2l6ZW9mKGNsYXNzX3V1aWRfdCkpCiAKKy8qIHN0YXRmc19wYWNrLmMgKi8KK3N0cnVjdCBrc3RhdGZzOwordm9pZCBzdGF0ZnNfcGFjayhzdHJ1Y3Qgb2JkX3N0YXRmcyAqb3Nmcywgc3RydWN0IGtzdGF0ZnMgKnNmcyk7Cit2b2lkIHN0YXRmc191bnBhY2soc3RydWN0IGtzdGF0ZnMgKnNmcywgc3RydWN0IG9iZF9zdGF0ZnMgKm9zZnMpOworCisvKiByb290IHNxdWFzaCBpbmZvICovCitzdHJ1Y3Qgcndfc2VtYXBob3JlOworc3RydWN0IHJvb3Rfc3F1YXNoX2luZm8geworCXVpZF90CQkJcnNpX3VpZDsKKwlnaWRfdAkJCXJzaV9naWQ7CisJc3RydWN0IGxpc3RfaGVhZAlyc2lfbm9zcXVhc2hfbmlkczsKKwlzdHJ1Y3Qgcndfc2VtYXBob3JlCXJzaV9zZW07Cit9OworCiAjZW5kaWYgLyogX19MSU5VWF9PQkRfQ0xBU1NfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9vYmRfc3VwcG9ydC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9vYmRfc3VwcG9ydC5oCmluZGV4IDg0NWU2NGE1Li5iMzQ2YTdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL29iZF9zdXBwb3J0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9vYmRfc3VwcG9ydC5oCkBAIC0zNSw3ICszNSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzLmgiCi0jaW5jbHVkZSAibGludXgvbHVzdHJlX2NvbXBhdDI1LmgiCisjaW5jbHVkZSAibHVzdHJlX2NvbXBhdC5oIgogI2luY2x1ZGUgImxwcm9jZnNfc3RhdHVzLmgiCiAKIC8qIGdsb2JhbCB2YXJpYWJsZXMgKi8KQEAgLTUyLDExICs1Miw5IEBACiBleHRlcm4gdW5zaWduZWQgaW50IGF0X2hpc3Rvcnk7CiBleHRlcm4gaW50IGF0X2Vhcmx5X21hcmdpbjsKIGV4dGVybiBpbnQgYXRfZXh0cmE7Ci1leHRlcm4gdW5zaWduZWQgaW50IG9iZF9zeW5jX2ZpbHRlcjsKLWV4dGVybiB1bnNpZ25lZCBpbnQgb2JkX21heF9kaXJ0eV9wYWdlczsKLWV4dGVybiBhdG9taWNfdCBvYmRfdW5zdGFibGVfcGFnZXM7Ci1leHRlcm4gYXRvbWljX3Qgb2JkX2RpcnR5X3BhZ2VzOwotZXh0ZXJuIGF0b21pY190IG9iZF9kaXJ0eV90cmFuc2l0X3BhZ2VzOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgb2JkX21heF9kaXJ0eV9wYWdlczsKK2V4dGVybiBhdG9taWNfbG9uZ190IG9iZF9kaXJ0eV9wYWdlczsKK2V4dGVybiBhdG9taWNfbG9uZ190IG9iZF9kaXJ0eV90cmFuc2l0X3BhZ2VzOwogZXh0ZXJuIGNoYXIgb2JkX2pvYmlkX3ZhcltdOwogCiAvKiBTb21lIGhhc2ggaW5pdCBhcmd1bWVudCBjb25zdGFudHMgKi8KQEAgLTExNywxNyArMTE1LDE3IEBACiAgKiBydW5uaW5nIG9uIGEgYmFja3VwIHNlcnZlci4gKElmIGl0J3MgdG9vIGxvdywgaW1wb3J0X3NlbGVjdF9jb25uZWN0aW9uCiAgKiB3aWxsIGluY3JlYXNlIHRoZSB0aW1lb3V0IGFueWhvdy4pCiAgKi8KLSNkZWZpbmUgSU5JVElBTF9DT05ORUNUX1RJTUVPVVQgbWF4KENPTk5FQ1RJT05fU1dJVENIX01JTiwgb2JkX3RpbWVvdXQvMjApCisjZGVmaW5lIElOSVRJQUxfQ09OTkVDVF9USU1FT1VUIG1heChDT05ORUNUSU9OX1NXSVRDSF9NSU4sIG9iZF90aW1lb3V0IC8gMjApCiAvKiBUaGUgbWF4IGRlbGF5IGJldHdlZW4gY29ubmVjdHMgaXMgU1dJVENIX01BWCArIFNXSVRDSF9JTkMgKyBJTklUSUFMICovCiAjZGVmaW5lIFJFQ09OTkVDVF9ERUxBWV9NQVggKENPTk5FQ1RJT05fU1dJVENIX01BWCArIENPTk5FQ1RJT05fU1dJVENIX0lOQyArIFwKIAkJCSAgICAgSU5JVElBTF9DT05ORUNUX1RJTUVPVVQpCiAvKiBUaGUgbWluIHRpbWUgYSB0YXJnZXQgc2hvdWxkIHdhaXQgZm9yIGNsaWVudHMgdG8gcmVjb25uZWN0IGluIHJlY292ZXJ5ICovCi0jZGVmaW5lIE9CRF9SRUNPVkVSWV9USU1FX01JTiAgICAoMipSRUNPTk5FQ1RfREVMQVlfTUFYKQorI2RlZmluZSBPQkRfUkVDT1ZFUllfVElNRV9NSU4gICAgKDIgKiBSRUNPTk5FQ1RfREVMQVlfTUFYKQogI2RlZmluZSBPQkRfSVJfRkFDVE9SX01JTgkgMQogI2RlZmluZSBPQkRfSVJfRkFDVE9SX01BWAkgMTAKLSNkZWZpbmUgT0JEX0lSX0ZBQ1RPUl9ERUZBVUxUICAgIChPQkRfSVJfRkFDVE9SX01BWC8yKQorI2RlZmluZSBPQkRfSVJfRkFDVE9SX0RFRkFVTFQgICAgKE9CRF9JUl9GQUNUT1JfTUFYIC8gMikKIC8qIGRlZmF1bHQgdGltZW91dCBmb3IgdGhlIE1HUyB0byBiZWNvbWUgSVJfRlVMTCAqLwotI2RlZmluZSBPQkRfSVJfTUdTX1RJTUVPVVQgICAgICAgKDQqb2JkX3RpbWVvdXQpCisjZGVmaW5lIE9CRF9JUl9NR1NfVElNRU9VVCAgICAgICAoNCAqIG9iZF90aW1lb3V0KQogI2RlZmluZSBMT05HX1VOTElOSyAzMDAJICAvKiBVbmxpbmsgc2hvdWxkIGhhcHBlbiBiZWZvcmUgbm93ICovCiAKIC8qKgpAQCAtMzE4LDYgKzMxNiwxMCBAQAogI2RlZmluZSBPQkRfRkFJTF9MRExNX0FHTF9OT0xPQ0sJIDB4MzFiCiAjZGVmaW5lIE9CRF9GQUlMX0xETE1fT1NUX0xWQgkJIDB4MzFjCiAjZGVmaW5lIE9CRF9GQUlMX0xETE1fRU5RVUVVRV9IQU5HCSAweDMxZAorI2RlZmluZSBPQkRfRkFJTF9MRExNX0NQX0NCX1dBSVQyCSAweDMyMAorI2RlZmluZSBPQkRfRkFJTF9MRExNX0NQX0NCX1dBSVQzCSAweDMyMQorI2RlZmluZSBPQkRfRkFJTF9MRExNX0NQX0NCX1dBSVQ0CSAweDMyMgorI2RlZmluZSBPQkRfRkFJTF9MRExNX0NQX0NCX1dBSVQ1CSAweDMyMwogCiAvKiBMT0NLTEVTUyBJTyAqLwogI2RlZmluZSBPQkRfRkFJTF9MRExNX1NFVF9DT05URU5USU9OICAgICAweDM4NQpAQCAtNDAwLDYgKzQwMiw3IEBACiAjZGVmaW5lIE9CRF9GQUlMX01EQ19HRVRBVFRSX0VOUVVFVUUgICAgIDB4ODAzCiAjZGVmaW5lIE9CRF9GQUlMX01EQ19SUENTX1NFTQkJIDB4ODA0CiAjZGVmaW5lIE9CRF9GQUlMX01EQ19MSUdIVFdFSUdIVAkgMHg4MDUKKyNkZWZpbmUgT0JEX0ZBSUxfTURDX0NMT1NFCQkgMHg4MDYKIAogI2RlZmluZSBPQkRfRkFJTF9NR1MJCSAgICAgMHg5MDAKICNkZWZpbmUgT0JEX0ZBSUxfTUdTX0FMTF9SRVFVRVNUX05FVCAgICAgMHg5MDEKQEAgLTQ1NSw2ICs0NTgsNyBAQAogI2RlZmluZSBPQkRfRkFJTF9MT1ZfSU5JVAkJCSAgICAweDE0MDMKICNkZWZpbmUgT0JEX0ZBSUxfR0xJTVBTRV9ERUxBWQkJCSAgICAweDE0MDQKICNkZWZpbmUgT0JEX0ZBSUxfTExJVEVfWEFUVFJfRU5PTUVNCQkgICAgMHgxNDA1CisjZGVmaW5lIE9CRF9GQUlMX0dFVEFUVFJfREVMQVkJCQkgICAgMHgxNDA5CiAKICNkZWZpbmUgT0JEX0ZBSUxfRklEX0lORElSCTB4MTUwMQogI2RlZmluZSBPQkRfRkFJTF9GSURfSU5MTUEJMHgxNTAyCkBAIC00NzQsMTEgKzQ3OCwxNiBAQAogI2RlZmluZSBPQkRfRkFJTF9MRlNDS19DUkFTSAkJMHgxNjBhCiAjZGVmaW5lIE9CRF9GQUlMX0xGU0NLX05PX0FVVE8JCTB4MTYwYgogI2RlZmluZSBPQkRfRkFJTF9MRlNDS19OT19ET1VCTEVTQ0FOCTB4MTYwYworI2RlZmluZSBPQkRfRkFJTF9MRlNDS19JTlZBTElEX1BGSUQJMHgxNjE5CisjZGVmaW5lIE9CRF9GQUlMX0xGU0NLX0JBRF9OQU1FX0hBU0gJMHgxNjI4CiAKIC8qIFVQREFURSAqLwogI2RlZmluZSBPQkRfRkFJTF9VUERBVEVfT0JKX05FVAkJCTB4MTcwMAogI2RlZmluZSBPQkRfRkFJTF9VUERBVEVfT0JKX05FVF9SRVAJCTB4MTcwMQogCisvKiBMTVYgKi8KKyNkZWZpbmUgT0JEX0ZBSUxfVU5LTk9XTl9MTVZfU1RSSVBFCQkweDE5MDEKKwogLyogQXNzaWduIHJlZmVyZW5jZXMgdG8gbW92ZWQgY29kZSB0byByZWR1Y2UgY29kZSBjaGFuZ2VzICovCiAjZGVmaW5lIE9CRF9GQUlMX1BSRUNIRUNLKGlkKQkJICAgQ0ZTX0ZBSUxfUFJFQ0hFQ0soaWQpCiAjZGVmaW5lIE9CRF9GQUlMX0NIRUNLKGlkKQkJICAgICAgQ0ZTX0ZBSUxfQ0hFQ0soaWQpCkBAIC01MjAsNyArNTI5LDggQEAKIAlQT0lTT05fUFRSKHB0cik7CQkJCQkJICAgICAgXAogfSB3aGlsZSAoMCkKIAotI2RlZmluZSBLRVlfSVMoc3RyKSBcCi0JKGtleWxlbiA+PSAoc2l6ZW9mKHN0ciktMSkgJiYgbWVtY21wKGtleSwgc3RyLCAoc2l6ZW9mKHN0ciktMSkpID09IDApCisjZGVmaW5lIEtFWV9JUyhzdHIpCQkJCQlcCisJKGtleWxlbiA+PSAoc2l6ZW9mKHN0cikgLSAxKSAmJgkJCVwKKwltZW1jbXAoa2V5LCBzdHIsIChzaXplb2Yoc3RyKSAtIDEpKSA9PSAwKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vaW50ZXJ2YWxfdHJlZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9pbnRlcnZhbF90cmVlLmMKaW5kZXggZjRhNzBlYi4uZTEzNGVjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9pbnRlcnZhbF90cmVlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9pbnRlcnZhbF90cmVlLmMKQEAgLTkwLDYgKzkwLDE3IEBACiAJcmV0dXJuIChlMS0+c3RhcnQgPT0gZTItPnN0YXJ0KSAmJiAoZTEtPmVuZCA9PSBlMi0+ZW5kKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgZXh0ZW50X292ZXJsYXBwZWQoc3RydWN0IGludGVydmFsX25vZGVfZXh0ZW50ICplMSwKKwkJCQkgICAgc3RydWN0IGludGVydmFsX25vZGVfZXh0ZW50ICplMikKK3sKKwlyZXR1cm4gKGUxLT5zdGFydCA8PSBlMi0+ZW5kKSAmJiAoZTItPnN0YXJ0IDw9IGUxLT5lbmQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBub2RlX2VxdWFsKHN0cnVjdCBpbnRlcnZhbF9ub2RlICpuMSwgc3RydWN0IGludGVydmFsX25vZGUgKm4yKQoreworCXJldHVybiBleHRlbnRfZXF1YWwoJm4xLT5pbl9leHRlbnQsICZuMi0+aW5fZXh0ZW50KTsKK30KKwogc3RhdGljIGlubGluZSBfX3U2NCBtYXhfdTY0KF9fdTY0IHgsIF9fdTY0IHkpCiB7CiAJcmV0dXJuIHggPiB5ID8geCA6IHk7CkBAIC0yNjIsNyArMjczLDcgQEAKIAlwID0gcm9vdDsKIAl3aGlsZSAoKnApIHsKIAkJcGFyZW50ID0gKnA7Ci0JCWlmIChleHRlbnRfZXF1YWwoJnBhcmVudC0+aW5fZXh0ZW50LCAmbm9kZS0+aW5fZXh0ZW50KSkKKwkJaWYgKG5vZGVfZXF1YWwocGFyZW50LCBub2RlKSkKIAkJCXJldHVybiBwYXJlbnQ7CiAKIAkJLyogbWF4X2hpZ2ggZmllbGQgbXVzdCBiZSB1cGRhdGVkIGFmdGVyIGVhY2ggaXRlcmF0aW9uICovCkBAIC00NjMsMyArNDc0LDkwIEBACiAJCWludGVydmFsX2VyYXNlX2NvbG9yKGNoaWxkLCBwYXJlbnQsIHJvb3QpOwogfQogRVhQT1JUX1NZTUJPTChpbnRlcnZhbF9lcmFzZSk7CisKK3N0YXRpYyBpbmxpbmUgaW50IGludGVydmFsX21heV9vdmVybGFwKHN0cnVjdCBpbnRlcnZhbF9ub2RlICpub2RlLAorCQkJCSAgICAgICBzdHJ1Y3QgaW50ZXJ2YWxfbm9kZV9leHRlbnQgKmV4dCkKK3sKKwlyZXR1cm4gKGV4dC0+c3RhcnQgPD0gbm9kZS0+aW5fbWF4X2hpZ2ggJiYKKwkJZXh0LT5lbmQgPj0gaW50ZXJ2YWxfbG93KG5vZGUpKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZmluZHMgYWxsIGludGVydmFscyB0aGF0IG92ZXJsYXAgaW50ZXJ2YWwgZXh0LAorICogYW5kIGNhbGxzIGZ1bmMgdG8gaGFuZGxlIHJlc3VsdGVkIGludGVydmFscyBvbmUgYnkgb25lLgorICogaW4gbHVzdHJlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgZmluZCBhbGwgY29uZmxpY3RpbmcgbG9ja3MgaW4KKyAqIHRoZSBncmFudGVkIHF1ZXVlIGFuZCBhZGQgdGhlc2UgbG9ja3MgdG8gdGhlIGFzdCB3b3JrIGxpc3QuCisgKgorICogeworICoJaWYgKCFub2RlKQorICoJCXJldHVybiAwOworICoJaWYgKGV4dC0+ZW5kIDwgaW50ZXJ2YWxfbG93KG5vZGUpKSB7CisgKgkJaW50ZXJ2YWxfc2VhcmNoKG5vZGUtPmluX2xlZnQsIGV4dCwgZnVuYywgZGF0YSk7CisgKgl9IGVsc2UgaWYgKGludGVydmFsX21heV9vdmVybGFwKG5vZGUsIGV4dCkpIHsKKyAqCQlpZiAoZXh0ZW50X292ZXJsYXBwZWQoZXh0LCAmbm9kZS0+aW5fZXh0ZW50KSkKKyAqCQkJZnVuYyhub2RlLCBkYXRhKTsKKyAqCQlpbnRlcnZhbF9zZWFyY2gobm9kZS0+aW5fbGVmdCwgZXh0LCBmdW5jLCBkYXRhKTsKKyAqCQlpbnRlcnZhbF9zZWFyY2gobm9kZS0+aW5fcmlnaHQsIGV4dCwgZnVuYywgZGF0YSk7CisgKgl9CisgKglyZXR1cm4gMDsKKyAqIH0KKyAqCisgKi8KK2VudW0gaW50ZXJ2YWxfaXRlciBpbnRlcnZhbF9zZWFyY2goc3RydWN0IGludGVydmFsX25vZGUgKm5vZGUsCisJCQkJICAgc3RydWN0IGludGVydmFsX25vZGVfZXh0ZW50ICpleHQsCisJCQkJICAgaW50ZXJ2YWxfY2FsbGJhY2tfdCBmdW5jLAorCQkJCSAgIHZvaWQgKmRhdGEpCit7CisJZW51bSBpbnRlcnZhbF9pdGVyIHJjID0gSU5URVJWQUxfSVRFUl9DT05UOworCXN0cnVjdCBpbnRlcnZhbF9ub2RlICpwYXJlbnQ7CisKKwlMQVNTRVJUKGV4dCk7CisJTEFTU0VSVChmdW5jKTsKKworCXdoaWxlIChub2RlKSB7CisJCWlmIChleHQtPmVuZCA8IGludGVydmFsX2xvdyhub2RlKSkgeworCQkJaWYgKG5vZGUtPmluX2xlZnQpIHsKKwkJCQlub2RlID0gbm9kZS0+aW5fbGVmdDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfSBlbHNlIGlmIChpbnRlcnZhbF9tYXlfb3ZlcmxhcChub2RlLCBleHQpKSB7CisJCQlpZiAoZXh0ZW50X292ZXJsYXBwZWQoZXh0LCAmbm9kZS0+aW5fZXh0ZW50KSkgeworCQkJCXJjID0gZnVuYyhub2RlLCBkYXRhKTsKKwkJCQlpZiAocmMgPT0gSU5URVJWQUxfSVRFUl9TVE9QKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKG5vZGUtPmluX2xlZnQpIHsKKwkJCQlub2RlID0gbm9kZS0+aW5fbGVmdDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChub2RlLT5pbl9yaWdodCkgeworCQkJCW5vZGUgPSBub2RlLT5pbl9yaWdodDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCXBhcmVudCA9IG5vZGUtPmluX3BhcmVudDsKKwkJd2hpbGUgKHBhcmVudCkgeworCQkJaWYgKG5vZGVfaXNfbGVmdF9jaGlsZChub2RlKSAmJgorCQkJICAgIHBhcmVudC0+aW5fcmlnaHQpIHsKKwkJCQkvKgorCQkJCSAqIElmIHdlIGV2ZXIgZ290IHRoZSBsZWZ0LCBpdCBtZWFucyB0aGF0IHRoZQorCQkJCSAqIHBhcmVudCBtZXQgZXh0LT5lbmQ8aW50ZXJ2YWxfbG93KHBhcmVudCksIG9yCisJCQkJICogbWF5X292ZXJsYXAocGFyZW50KS4gSWYgdGhlIGZvcm1lciBpcyB0cnVlLAorCQkJCSAqIHdlIG5lZWRuJ3QgZ28gYmFjay4gU28gc3RvcCBlYXJseSBhbmQgY2hlY2sKKwkJCQkgKiBtYXlfb3ZlcmxhcChwYXJlbnQpIGFmdGVyIHRoaXMgbG9vcC4KKwkJCQkgKi8KKwkJCQlub2RlID0gcGFyZW50LT5pbl9yaWdodDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW5vZGUgPSBwYXJlbnQ7CisJCQlwYXJlbnQgPSBwYXJlbnQtPmluX3BhcmVudDsKKwkJfQorCQlpZiAoIXBhcmVudCB8fCAhaW50ZXJ2YWxfbWF5X292ZXJsYXAocGFyZW50LCBleHQpKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChpbnRlcnZhbF9zZWFyY2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sX2xvY2suYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbF9sb2NrLmMKaW5kZXggZWE4ODQwYy4uMzg0NWYzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sX2xvY2suYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xfbG9jay5jCkBAIC00NSw2ICs0NSw4IEBACiAgKiBiZWluZyBhbiBhdG9taWMgb3BlcmF0aW9uLgogICovCiBzdHJ1Y3QgbGRsbV9yZXNvdXJjZSAqbG9ja19yZXNfYW5kX2xvY2soc3RydWN0IGxkbG1fbG9jayAqbG9jaykKKwkJCQlfX2FjcXVpcmVzKCZsb2NrLT5sX2xvY2spCisJCQkJX19hY3F1aXJlcygmbG9jay0+bF9yZXNvdXJjZS0+bHJfbG9jaykKIHsKIAlzcGluX2xvY2soJmxvY2stPmxfbG9jayk7CiAKQEAgLTU5LDYgKzYxLDggQEAKICAqIFVubG9jayBhIGxvY2sgYW5kIGl0cyByZXNvdXJjZSBwcmV2aW91c2x5IGxvY2tlZCB3aXRoIGxvY2tfcmVzX2FuZF9sb2NrCiAgKi8KIHZvaWQgdW5sb2NrX3Jlc19hbmRfbG9jayhzdHJ1Y3QgbGRsbV9sb2NrICpsb2NrKQorCQlfX3JlbGVhc2VzKCZsb2NrLT5sX3Jlc291cmNlLT5scl9sb2NrKQorCQlfX3JlbGVhc2VzKCZsb2NrLT5sX2xvY2spCiB7CiAJLyogb24gc2VydmVyLXNpZGUgcmVzb3VyY2Ugb2YgbG9jayBkb2Vzbid0IGNoYW5nZSAqLwogCWxkbG1fY2xlYXJfcmVzX2xvY2tlZChsb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9leHRlbnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9leHRlbnQuYwppbmRleCBmNTAyM2Q5Li5lY2Y0NzJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fZXh0ZW50LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2V4dGVudC5jCkBAIC0yMjEsNyArMjIxLDcgQEAKIH0KIAogdm9pZCBsZGxtX2V4dGVudF9wb2xpY3lfd2lyZV90b19sb2NhbChjb25zdCBsZGxtX3dpcmVfcG9saWN5X2RhdGFfdCAqd3BvbGljeSwKLQkJCQkgICAgIGxkbG1fcG9saWN5X2RhdGFfdCAqbHBvbGljeSkKKwkJCQkgICAgICBsZGxtX3BvbGljeV9kYXRhX3QgKmxwb2xpY3kpCiB7CiAJbWVtc2V0KGxwb2xpY3ksIDAsIHNpemVvZigqbHBvbGljeSkpOwogCWxwb2xpY3ktPmxfZXh0ZW50LnN0YXJ0ID0gd3BvbGljeS0+bF9leHRlbnQuc3RhcnQ7CkBAIC0yMzAsNyArMjMwLDcgQEAKIH0KIAogdm9pZCBsZGxtX2V4dGVudF9wb2xpY3lfbG9jYWxfdG9fd2lyZShjb25zdCBsZGxtX3BvbGljeV9kYXRhX3QgKmxwb2xpY3ksCi0JCQkJICAgICBsZGxtX3dpcmVfcG9saWN5X2RhdGFfdCAqd3BvbGljeSkKKwkJCQkgICAgICBsZGxtX3dpcmVfcG9saWN5X2RhdGFfdCAqd3BvbGljeSkKIHsKIAltZW1zZXQod3BvbGljeSwgMCwgc2l6ZW9mKCp3cG9saWN5KSk7CiAJd3BvbGljeS0+bF9leHRlbnQuc3RhcnQgPSBscG9saWN5LT5sX2V4dGVudC5zdGFydDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9mbG9jay5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2Zsb2NrLmMKaW5kZXggZDZiNjFiYy4uODYxZjM2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2Zsb2NrLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2Zsb2NrLmMKQEAgLTk3LDcgKzk3LDcgQEAKIAlMQVNTRVJUKGhsaXN0X3VuaGFzaGVkKCZsb2NrLT5sX2V4cF9mbG9ja19oYXNoKSk7CiAKIAlsaXN0X2RlbF9pbml0KCZsb2NrLT5sX3Jlc19saW5rKTsKLQlpZiAoZmxhZ3MgPT0gTERMTV9GTF9XQUlUX05PUkVQUk9DICYmICFsZGxtX2lzX2ZhaWxlZChsb2NrKSkgeworCWlmIChmbGFncyA9PSBMRExNX0ZMX1dBSVRfTk9SRVBST0MpIHsKIAkJLyogY2xpZW50IHNpZGUgLSBzZXQgYSBmbGFnIHRvIHByZXZlbnQgc2VuZGluZyBhIENBTkNFTCAqLwogCQlsb2NrLT5sX2ZsYWdzIHw9IExETE1fRkxfTE9DQUxfT05MWSB8IExETE1fRkxfQ0JQRU5ESU5HOwogCkBAIC0xNjYsNyArMTY2LDcgQEAKIAkJICovCiAJCWxpc3RfZm9yX2VhY2godG1wLCAmcmVzLT5scl9ncmFudGVkKSB7CiAJCQlsb2NrID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBsZGxtX2xvY2ssCi0JCQkJCSAgICAgIGxfcmVzX2xpbmspOworCQkJCQkgIGxfcmVzX2xpbmspOwogCQkJaWYgKGxkbG1fc2FtZV9mbG9ja19vd25lcihsb2NrLCByZXEpKSB7CiAJCQkJb3dubG9ja3MgPSB0bXA7CiAJCQkJYnJlYWs7CkBAIC0xODIsNyArMTgyLDcgQEAKIAkJICovCiAJCWxpc3RfZm9yX2VhY2godG1wLCAmcmVzLT5scl9ncmFudGVkKSB7CiAJCQlsb2NrID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBsZGxtX2xvY2ssCi0JCQkJCSAgICAgIGxfcmVzX2xpbmspOworCQkJCQkgIGxfcmVzX2xpbmspOwogCiAJCQlpZiAobGRsbV9zYW1lX2Zsb2NrX293bmVyKGxvY2ssIHJlcSkpIHsKIAkJCQlpZiAoIW93bmxvY2tzKQpAQCAtMzM5LDEwICszMzksMTAgQEAKIAkJCQkJCWxvY2stPmxfZ3JhbnRlZF9tb2RlLCAmbnVsbF9jYnMsCiAJCQkJCQlOVUxMLCAwLCBMVkJfVF9OT05FKTsKIAkJCWxvY2tfcmVzX2FuZF9sb2NrKHJlcSk7Ci0JCQlpZiAoIW5ldzIpIHsKKwkJCWlmIChJU19FUlIobmV3MikpIHsKIAkJCQlsZGxtX2Zsb2NrX2Rlc3Ryb3kocmVxLCBsb2NrLT5sX2dyYW50ZWRfbW9kZSwKIAkJCQkJCSAgICpmbGFncyk7Ci0JCQkJKmVyciA9IC1FTk9MQ0s7CisJCQkJKmVyciA9IFBUUl9FUlIobmV3Mik7CiAJCQkJcmV0dXJuIExETE1fSVRFUl9TVE9QOwogCQkJfQogCQkJZ290byByZXByb2Nlc3M7CkBAIC00NTUsMjkgKzQ1NSwyMiBAQAogCWVudW0gbGRsbV9lcnJvcgkJICAgIGVycjsKIAlpbnQJCQkgICAgIHJjID0gMDsKIAorCU9CRF9GQUlMX1RJTUVPVVQoT0JEX0ZBSUxfTERMTV9DUF9DQl9XQUlUMiwgNCk7CisJaWYgKE9CRF9GQUlMX1BSRUNIRUNLKE9CRF9GQUlMX0xETE1fQ1BfQ0JfV0FJVDMpKSB7CisJCWxvY2tfcmVzX2FuZF9sb2NrKGxvY2spOworCQlsb2NrLT5sX2ZsYWdzIHw9IExETE1fRkxfRkFJTF9MT0M7CisJCXVubG9ja19yZXNfYW5kX2xvY2sobG9jayk7CisJCU9CRF9GQUlMX1RJTUVPVVQoT0JEX0ZBSUxfTERMTV9DUF9DQl9XQUlUMywgNCk7CisJfQogCUNERUJVRyhEX0RMTVRSQUNFLCAiZmxhZ3M6IDB4JWxseCBkYXRhOiAlcCBnZXRsazogJXBcbiIsCiAJICAgICAgIGZsYWdzLCBkYXRhLCBnZXRsayk7CiAKLQkvKiBJbXBvcnQgaW52YWxpZGF0aW9uLiBXZSBuZWVkIHRvIGFjdHVhbGx5IHJlbGVhc2UgdGhlIGxvY2sKLQkgKiByZWZlcmVuY2VzIGJlaW5nIGhlbGQsIHNvIHRoYXQgaXQgY2FuIGdvIGF3YXkuIE5vIHBvaW50IGluCi0JICogaG9sZGluZyB0aGUgbG9jayBldmVuIGlmIGFwcCBzdGlsbCBiZWxpZXZlcyBpdCBoYXMgaXQsIHNpbmNlCi0JICogc2VydmVyIGFscmVhZHkgZHJvcHBlZCBpdCBhbnl3YXkuIE9ubHkgZm9yIGdyYW50ZWQgbG9ja3MgdG9vLgotCSAqLwotCWlmICgobG9jay0+bF9mbGFncyAmIChMRExNX0ZMX0ZBSUxFRHxMRExNX0ZMX0xPQ0FMX09OTFkpKSA9PQotCSAgICAoTERMTV9GTF9GQUlMRUR8TERMTV9GTF9MT0NBTF9PTkxZKSkgewotCQlpZiAobG9jay0+bF9yZXFfbW9kZSA9PSBsb2NrLT5sX2dyYW50ZWRfbW9kZSAmJgotCQkgICAgbG9jay0+bF9ncmFudGVkX21vZGUgIT0gTENLX05MICYmICFkYXRhKQotCQkJbGRsbV9sb2NrX2RlY3JlZl9pbnRlcm5hbChsb2NrLCBsb2NrLT5sX3JlcV9tb2RlKTsKLQotCQkvKiBOZWVkIHRvIHdha2UgdXAgdGhlIHdhaXRlciBpZiB3ZSB3ZXJlIGV2aWN0ZWQgKi8KLQkJd2FrZV91cCgmbG9jay0+bF93YWl0cSk7Ci0JCXJldHVybiAwOwotCX0KLQogCUxBU1NFUlQoZmxhZ3MgIT0gTERMTV9GTF9XQUlUX05PUkVQUk9DKTsKIAotCWlmICghKGZsYWdzICYgKExETE1fRkxfQkxPQ0tfV0FJVCB8IExETE1fRkxfQkxPQ0tfR1JBTlRFRCB8Ci0JCSAgICAgICBMRExNX0ZMX0JMT0NLX0NPTlYpKSkgeworCWlmIChmbGFncyAmIExETE1fRkxfRkFJTEVEKQorCQlnb3RvIGdyYW50ZWQ7CisKKwlpZiAoIShmbGFncyAmIExETE1fRkxfQkxPQ0tFRF9NQVNLKSkgewogCQlpZiAoIWRhdGEpCiAJCQkvKiBtZHMgZ3JhbnRlZCB0aGUgbG9jayBpbiB0aGUgcmVwbHkgKi8KIAkJCWdvdG8gZ3JhbnRlZDsKQEAgLTUxNCwxMiArNTA3LDIxIEBACiBncmFudGVkOgogCU9CRF9GQUlMX1RJTUVPVVQoT0JEX0ZBSUxfTERMTV9DUF9DQl9XQUlULCAxMCk7CiAKLQlpZiAobGRsbV9pc19mYWlsZWQobG9jaykpIHsKLQkJTERMTV9ERUJVRyhsb2NrLCAiY2xpZW50LXNpZGUgZW5xdWV1ZSB3YWtpbmcgdXA6IGZhaWxlZCIpOwotCQlyZXR1cm4gLUVJTzsKKwlpZiAoT0JEX0ZBSUxfUFJFQ0hFQ0soT0JEX0ZBSUxfTERMTV9DUF9DQl9XQUlUNCkpIHsKKwkJbG9ja19yZXNfYW5kX2xvY2sobG9jayk7CisJCS8qIERFQURMT0NLIGlzIGFsd2F5cyBzZXQgd2l0aCBDQlBFTkRJTkcgKi8KKwkJbG9jay0+bF9mbGFncyB8PSBMRExNX0ZMX0ZMT0NLX0RFQURMT0NLIHwgTERMTV9GTF9DQlBFTkRJTkc7CisJCXVubG9ja19yZXNfYW5kX2xvY2sobG9jayk7CisJCU9CRF9GQUlMX1RJTUVPVVQoT0JEX0ZBSUxfTERMTV9DUF9DQl9XQUlUNCwgNCk7CiAJfQotCi0JTERMTV9ERUJVRyhsb2NrLCAiY2xpZW50LXNpZGUgZW5xdWV1ZSBncmFudGVkIik7CisJaWYgKE9CRF9GQUlMX1BSRUNIRUNLKE9CRF9GQUlMX0xETE1fQ1BfQ0JfV0FJVDUpKSB7CisJCWxvY2tfcmVzX2FuZF9sb2NrKGxvY2spOworCQkvKiBERUFETE9DSyBpcyBhbHdheXMgc2V0IHdpdGggQ0JQRU5ESU5HICovCisJCWxvY2stPmxfZmxhZ3MgfD0gTERMTV9GTF9GQUlMX0xPQyB8CisJCQkJIExETE1fRkxfRkxPQ0tfREVBRExPQ0sgfCBMRExNX0ZMX0NCUEVORElORzsKKwkJdW5sb2NrX3Jlc19hbmRfbG9jayhsb2NrKTsKKwkJT0JEX0ZBSUxfVElNRU9VVChPQkRfRkFJTF9MRExNX0NQX0NCX1dBSVQ1LCA0KTsKKwl9CiAKIAlsb2NrX3Jlc19hbmRfbG9jayhsb2NrKTsKIApAQCAtNTMwLDIwICs1MzIsNTkgQEAKIAlpZiAobGRsbV9pc19kZXN0cm95ZWQobG9jaykpIHsKIAkJdW5sb2NrX3Jlc19hbmRfbG9jayhsb2NrKTsKIAkJTERMTV9ERUJVRyhsb2NrLCAiY2xpZW50LXNpZGUgZW5xdWV1ZSB3YWtpbmcgdXA6IGRlc3Ryb3llZCIpOwotCQlyZXR1cm4gMDsKKwkJLyoKKwkJICogQW4gZXJyb3IgaXMgc3RpbGwgdG8gYmUgcmV0dXJuZWQsIHRvIHByb3BhZ2F0ZSBpdCB1cCB0bworCQkgKiBsZGxtX2NsaV9lbnF1ZXVlX2ZpbmkoKSBjYWxsZXIuCisJCSAqLworCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAkvKiBsZGxtX2xvY2tfZW5xdWV1ZSgpIGhhcyBhbHJlYWR5IHBsYWNlZCBsb2NrIG9uIHRoZSBncmFudGVkIGxpc3QuICovCi0JbGlzdF9kZWxfaW5pdCgmbG9jay0+bF9yZXNfbGluayk7CisJbGRsbV9yZXNvdXJjZV91bmxpbmtfbG9jayhsb2NrKTsKIAotCWlmIChsZGxtX2lzX2Zsb2NrX2RlYWRsb2NrKGxvY2spKSB7Ci0JCUxETE1fREVCVUcobG9jaywgImNsaWVudC1zaWRlIGVucXVldWUgZGVhZGxvY2sgcmVjZWl2ZWQiKTsKLQkJcmMgPSAtRURFQURMSzsKLQl9IGVsc2UgaWYgKGZsYWdzICYgTERMTV9GTF9URVNUX0xPQ0spIHsKKwkvKgorCSAqIEltcG9ydCBpbnZhbGlkYXRpb24uIFdlIG5lZWQgdG8gYWN0dWFsbHkgcmVsZWFzZSB0aGUgbG9jaworCSAqIHJlZmVyZW5jZXMgYmVpbmcgaGVsZCwgc28gdGhhdCBpdCBjYW4gZ28gYXdheS4gTm8gcG9pbnQgaW4KKwkgKiBob2xkaW5nIHRoZSBsb2NrIGV2ZW4gaWYgYXBwIHN0aWxsIGJlbGlldmVzIGl0IGhhcyBpdCwgc2luY2UKKwkgKiBzZXJ2ZXIgYWxyZWFkeSBkcm9wcGVkIGl0IGFueXdheS4gT25seSBmb3IgZ3JhbnRlZCBsb2NrcyB0b28uCisJICovCisJLyogRG8gdGhlIHNhbWUgZm9yIERFQURMT0NLJ2VkIGxvY2tzLiAqLworCWlmIChsZGxtX2lzX2ZhaWxlZChsb2NrKSB8fCBsZGxtX2lzX2Zsb2NrX2RlYWRsb2NrKGxvY2spKSB7CisJCWludCBtb2RlOworCisJCWlmIChmbGFncyAmIExETE1fRkxfVEVTVF9MT0NLKQorCQkJTEFTU0VSVChsZGxtX2lzX3Rlc3RfbG9jayhsb2NrKSk7CisKKwkJaWYgKGxkbG1faXNfdGVzdF9sb2NrKGxvY2spIHx8IGxkbG1faXNfZmxvY2tfZGVhZGxvY2sobG9jaykpCisJCQltb2RlID0gZ2V0bGstPmZsX3R5cGU7CisJCWVsc2UKKwkJCW1vZGUgPSBsb2NrLT5sX2dyYW50ZWRfbW9kZTsKKworCQlpZiAobGRsbV9pc19mbG9ja19kZWFkbG9jayhsb2NrKSkgeworCQkJTERMTV9ERUJVRyhsb2NrLCAiY2xpZW50LXNpZGUgZW5xdWV1ZSBkZWFkbG9jayByZWNlaXZlZCIpOworCQkJcmMgPSAtRURFQURMSzsKKwkJfQorCQlsZGxtX2Zsb2NrX2Rlc3Ryb3kobG9jaywgbW9kZSwgTERMTV9GTF9XQUlUX05PUkVQUk9DKTsKKwkJdW5sb2NrX3Jlc19hbmRfbG9jayhsb2NrKTsKKworCQkvKiBOZWVkIHRvIHdha2UgdXAgdGhlIHdhaXRlciBpZiB3ZSB3ZXJlIGV2aWN0ZWQgKi8KKwkJd2FrZV91cCgmbG9jay0+bF93YWl0cSk7CisKKwkJLyoKKwkJICogQW4gZXJyb3IgaXMgc3RpbGwgdG8gYmUgcmV0dXJuZWQsIHRvIHByb3BhZ2F0ZSBpdCB1cCB0bworCQkgKiBsZGxtX2NsaV9lbnF1ZXVlX2ZpbmkoKSBjYWxsZXIuCisJCSAqLworCQlyZXR1cm4gcmMgPyA6IC1FSU87CisJfQorCisJTERMTV9ERUJVRyhsb2NrLCAiY2xpZW50LXNpZGUgZW5xdWV1ZSBncmFudGVkIik7CisKKwlpZiAoZmxhZ3MgJiBMRExNX0ZMX1RFU1RfTE9DSykgewogCQkvKiBmY250bChGX0dFVExLKSByZXF1ZXN0ICovCiAJCS8qIFRoZSBvbGQgbW9kZSB3YXMgc2F2ZWQgaW4gZ2V0bGstPmZsX3R5cGUgc28gdGhhdCBpZiB0aGUgbW9kZQogCQkgKiBpbiB0aGUgbG9jayBjaGFuZ2VzIHdlIGNhbiBkZWNyZWYgdGhlIGFwcHJvcHJpYXRlIHJlZmNvdW50LgogCQkgKi8KKwkJTEFTU0VSVChsZGxtX2lzX3Rlc3RfbG9jayhsb2NrKSk7CiAJCWxkbG1fZmxvY2tfZGVzdHJveShsb2NrLCBnZXRsay0+ZmxfdHlwZSwgTERMTV9GTF9XQUlUX05PUkVQUk9DKTsKIAkJc3dpdGNoIChsb2NrLT5sX2dyYW50ZWRfbW9kZSkgewogCQljYXNlIExDS19QUjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2ludGVybmFsLmgKaW5kZXggZTRjZjY1ZC4uNWU4MmNmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2ludGVybmFsLmgKQEAgLTEwMCw5ICsxMDAsMTAgQEAKIGludCBsZGxtX2NhbmNlbF9scnUoc3RydWN0IGxkbG1fbmFtZXNwYWNlICpucywgaW50IG5yLAogCQkgICAgZW51bSBsZGxtX2NhbmNlbF9mbGFncyBzeW5jLCBpbnQgZmxhZ3MpOwogaW50IGxkbG1fY2FuY2VsX2xydV9sb2NhbChzdHJ1Y3QgbGRsbV9uYW1lc3BhY2UgKm5zLAotCQkJIHN0cnVjdCBsaXN0X2hlYWQgKmNhbmNlbHMsIGludCBjb3VudCwgaW50IG1heCwKLQkJCSBlbnVtIGxkbG1fY2FuY2VsX2ZsYWdzIGNhbmNlbF9mbGFncywgaW50IGZsYWdzKTsKLWV4dGVybiBpbnQgbGRsbV9lbnF1ZXVlX21pbjsKKwkJCSAgc3RydWN0IGxpc3RfaGVhZCAqY2FuY2VscywgaW50IGNvdW50LCBpbnQgbWF4LAorCQkJICBlbnVtIGxkbG1fY2FuY2VsX2ZsYWdzIGNhbmNlbF9mbGFncywgaW50IGZsYWdzKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgbGRsbV9lbnF1ZXVlX21pbjsKK2V4dGVybiB1bnNpZ25lZCBpbnQgbGRsbV9jYW5jZWxfdW51c2VkX2xvY2tzX2JlZm9yZV9yZXBsYXk7CiAKIC8qIGxkbG1fcmVzb3VyY2UuYyAqLwogaW50IGxkbG1fcmVzb3VyY2VfcHV0cmVmX2xvY2tlZChzdHJ1Y3QgbGRsbV9yZXNvdXJjZSAqcmVzKTsKQEAgLTIwMCw4ICsyMDEsNyBAQAogCiAJTEFTU0VSVCghbGlzdF9lbXB0eSgmbm9kZS0+bGlfZ3JvdXApKTsKIAotCWxvY2sgPSBsaXN0X2VudHJ5KG5vZGUtPmxpX2dyb3VwLm5leHQsIHN0cnVjdCBsZGxtX2xvY2ssCi0JCQkgICAgICBsX3NsX3BvbGljeSk7CisJbG9jayA9IGxpc3RfZW50cnkobm9kZS0+bGlfZ3JvdXAubmV4dCwgc3RydWN0IGxkbG1fbG9jaywgbF9zbF9wb2xpY3kpOwogCXJldHVybiAmbG9jay0+bF9wb2xpY3lfZGF0YS5sX2V4dGVudDsKIH0KIApAQCAtMzAyLDcgKzMwMiw3IEBACiAKIAlsb2NrX3Jlc19hbmRfbG9jayhsb2NrKTsKIAlpZiAoKGxvY2stPmxfcmVxX21vZGUgPT0gbG9jay0+bF9ncmFudGVkX21vZGUpICYmCi0JICAgICAhbGRsbV9pc19jcF9yZXFkKGxvY2spKQorCSAgICAhbGRsbV9pc19jcF9yZXFkKGxvY2spKQogCQlyZXQgPSAxOwogCWVsc2UgaWYgKGxkbG1faXNfZmFpbGVkKGxvY2spIHx8IGxkbG1faXNfY2FuY2VsKGxvY2spKQogCQlyZXQgPSAxOwpAQCAtMzI2LDEzICszMjYsMTMgQEAKIHZvaWQgbGRsbV9pYml0c19wb2xpY3lfbG9jYWxfdG9fd2lyZShjb25zdCBsZGxtX3BvbGljeV9kYXRhX3QgKmxwb2xpY3ksCiAJCQkJICAgICBsZGxtX3dpcmVfcG9saWN5X2RhdGFfdCAqd3BvbGljeSk7CiB2b2lkIGxkbG1fZXh0ZW50X3BvbGljeV93aXJlX3RvX2xvY2FsKGNvbnN0IGxkbG1fd2lyZV9wb2xpY3lfZGF0YV90ICp3cG9saWN5LAotCQkJCSAgICAgbGRsbV9wb2xpY3lfZGF0YV90ICpscG9saWN5KTsKKwkJCQkgICAgICBsZGxtX3BvbGljeV9kYXRhX3QgKmxwb2xpY3kpOwogdm9pZCBsZGxtX2V4dGVudF9wb2xpY3lfbG9jYWxfdG9fd2lyZShjb25zdCBsZGxtX3BvbGljeV9kYXRhX3QgKmxwb2xpY3ksCi0JCQkJICAgICBsZGxtX3dpcmVfcG9saWN5X2RhdGFfdCAqd3BvbGljeSk7CisJCQkJICAgICAgbGRsbV93aXJlX3BvbGljeV9kYXRhX3QgKndwb2xpY3kpOwogdm9pZCBsZGxtX2Zsb2NrX3BvbGljeV93aXJlMThfdG9fbG9jYWwoY29uc3QgbGRsbV93aXJlX3BvbGljeV9kYXRhX3QgKndwb2xpY3ksCi0JCQkJICAgICBsZGxtX3BvbGljeV9kYXRhX3QgKmxwb2xpY3kpOworCQkJCSAgICAgICBsZGxtX3BvbGljeV9kYXRhX3QgKmxwb2xpY3kpOwogdm9pZCBsZGxtX2Zsb2NrX3BvbGljeV93aXJlMjFfdG9fbG9jYWwoY29uc3QgbGRsbV93aXJlX3BvbGljeV9kYXRhX3QgKndwb2xpY3ksCi0JCQkJICAgICBsZGxtX3BvbGljeV9kYXRhX3QgKmxwb2xpY3kpOworCQkJCSAgICAgICBsZGxtX3BvbGljeV9kYXRhX3QgKmxwb2xpY3kpOwogCiB2b2lkIGxkbG1fZmxvY2tfcG9saWN5X2xvY2FsX3RvX3dpcmUoY29uc3QgbGRsbV9wb2xpY3lfZGF0YV90ICpscG9saWN5LAogCQkJCSAgICAgbGRsbV93aXJlX3BvbGljeV9kYXRhX3QgKndwb2xpY3kpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2xpYi5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2xpYi5jCmluZGV4IDdjODMyYWEuLjE1M2U5OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9saWIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fbGliLmMKQEAgLTgyLDcgKzgyLDcgQEAKIAkJCWlmIChwcmlvcml0eSkgewogCQkJCWxpc3RfZGVsKCZpdGVtLT5vaWNfaXRlbSk7CiAJCQkJbGlzdF9hZGQoJml0ZW0tPm9pY19pdGVtLAotCQkJCQkgICAgICZpbXAtPmltcF9jb25uX2xpc3QpOworCQkJCQkgJmltcC0+aW1wX2Nvbm5fbGlzdCk7CiAJCQkJaXRlbS0+b2ljX2xhc3RfYXR0ZW1wdCA9IDA7CiAJCQl9CiAJCQlDREVCVUcoRF9IQSwgImltcCAlcEAlczogZm91bmQgZXhpc3RpbmcgY29ubiAlcyVzXG4iLApAQCAtMTAyLDcgKzEwMiw3IEBACiAJCQlsaXN0X2FkZCgmaW1wX2Nvbm4tPm9pY19pdGVtLCAmaW1wLT5pbXBfY29ubl9saXN0KTsKIAkJZWxzZQogCQkJbGlzdF9hZGRfdGFpbCgmaW1wX2Nvbm4tPm9pY19pdGVtLAotCQkJCQkgICZpbXAtPmltcF9jb25uX2xpc3QpOworCQkJCSAgICAgICZpbXAtPmltcF9jb25uX2xpc3QpOwogCQlDREVCVUcoRF9IQSwgImltcCAlcEAlczogYWRkIGNvbm5lY3Rpb24gJXMgYXQgJXNcbiIsCiAJCSAgICAgICBpbXAsIGltcC0+aW1wX29iZC0+b2JkX25hbWUsIHV1aWQtPnV1aWQsCiAJCSAgICAgICAocHJpb3JpdHkgPyAiaGVhZCIgOiAidGFpbCIpKTsKQEAgLTI5OSwxMiArMjk5LDE0IEBACiAJICAgICAgIG1pbl90KHVuc2lnbmVkIGludCwgTFVTVFJFX0NGR19CVUZMRU4obGNmZywgMiksCiAJCSAgICAgc2l6ZW9mKHNlcnZlcl91dWlkKSkpOwogCi0JY2xpLT5jbF9kaXJ0eSA9IDA7CisJY2xpLT5jbF9kaXJ0eV9wYWdlcyA9IDA7CiAJY2xpLT5jbF9hdmFpbF9ncmFudCA9IDA7Ci0JLyogRklYTUU6IFNob3VsZCBsaW1pdCB0aGlzIGZvciB0aGUgc3VtIG9mIGFsbCBjbF9kaXJ0eV9tYXguICovCi0JY2xpLT5jbF9kaXJ0eV9tYXggPSBPU0NfTUFYX0RJUlRZX0RFRkFVTFQgKiAxMDI0ICogMTAyNDsKLQlpZiAoY2xpLT5jbF9kaXJ0eV9tYXggPj4gUEFHRV9TSElGVCA+IHRvdGFscmFtX3BhZ2VzIC8gOCkKLQkJY2xpLT5jbF9kaXJ0eV9tYXggPSB0b3RhbHJhbV9wYWdlcyA8PCAoUEFHRV9TSElGVCAtIDMpOworCS8qIEZJWE1FOiBTaG91bGQgbGltaXQgdGhpcyBmb3IgdGhlIHN1bSBvZiBhbGwgY2xfZGlydHlfbWF4X3BhZ2VzLiAqLworCS8qCisJICogY2xfZGlydHlfbWF4X3BhZ2VzIG1heSBiZSBjaGFuZ2VkIGF0IGNvbm5lY3QgdGltZSBpbgorCSAqIHB0bHJwY19jb25uZWN0X2ludGVycHJldCgpLgorCSAqLworCWNsaWVudF9hZGp1c3RfbWF4X2RpcnR5KGNsaSk7CiAJSU5JVF9MSVNUX0hFQUQoJmNsaS0+Y2xfY2FjaGVfd2FpdGVycyk7CiAJSU5JVF9MSVNUX0hFQUQoJmNsaS0+Y2xfbG9pX3JlYWR5X2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZjbGktPmNsX2xvaV9ocF9yZWFkeV9saXN0KTsKQEAgLTMyNiwxMSArMzI4LDExIEBACiAJLyogbHJ1IGZvciBvc2MuICovCiAJSU5JVF9MSVNUX0hFQUQoJmNsaS0+Y2xfbHJ1X29zYyk7CiAJYXRvbWljX3NldCgmY2xpLT5jbF9scnVfc2hyaW5rZXJzLCAwKTsKLQlhdG9taWNfc2V0KCZjbGktPmNsX2xydV9idXN5LCAwKTsKLQlhdG9taWNfc2V0KCZjbGktPmNsX2xydV9pbl9saXN0LCAwKTsKKwlhdG9taWNfbG9uZ19zZXQoJmNsaS0+Y2xfbHJ1X2J1c3ksIDApOworCWF0b21pY19sb25nX3NldCgmY2xpLT5jbF9scnVfaW5fbGlzdCwgMCk7CiAJSU5JVF9MSVNUX0hFQUQoJmNsaS0+Y2xfbHJ1X2xpc3QpOwogCXNwaW5fbG9ja19pbml0KCZjbGktPmNsX2xydV9saXN0X2xvY2spOwotCWF0b21pY19zZXQoJmNsaS0+Y2xfdW5zdGFibGVfY291bnQsIDApOworCWF0b21pY19sb25nX3NldCgmY2xpLT5jbF91bnN0YWJsZV9jb3VudCwgMCk7CiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjbGktPmNsX2Rlc3Ryb3lfd2FpdHEpOwogCWF0b21pY19zZXQoJmNsaS0+Y2xfZGVzdHJveV9pbl9mbGlnaHQsIDApOwpAQCAtMzYwLDcgKzM2Miw3IEBACiAJY2xpLT5jbF9jaHVua2JpdHMgPSBQQUdFX1NISUZUOwogCiAJaWYgKCFzdHJjbXAobmFtZSwgTFVTVFJFX01EQ19OQU1FKSkgewotCQljbGktPmNsX21heF9ycGNzX2luX2ZsaWdodCA9IE1EQ19NQVhfUklGX0RFRkFVTFQ7CisJCWNsaS0+Y2xfbWF4X3JwY3NfaW5fZmxpZ2h0ID0gT0JEX01BWF9SSUZfREVGQVVMVDsKIAl9IGVsc2UgaWYgKHRvdGFscmFtX3BhZ2VzID4+ICgyMCAtIFBBR0VfU0hJRlQpIDw9IDEyOCAvKiBNQiAqLykgewogCQljbGktPmNsX21heF9ycGNzX2luX2ZsaWdodCA9IDI7CiAJfSBlbHNlIGlmICh0b3RhbHJhbV9wYWdlcyA+PiAoMjAgLSBQQUdFX1NISUZUKSA8PSAyNTYgLyogTUIgKi8pIHsKQEAgLTM2OCw3ICszNzAsNyBAQAogCX0gZWxzZSBpZiAodG90YWxyYW1fcGFnZXMgPj4gKDIwIC0gUEFHRV9TSElGVCkgPD0gNTEyIC8qIE1CICovKSB7CiAJCWNsaS0+Y2xfbWF4X3JwY3NfaW5fZmxpZ2h0ID0gNDsKIAl9IGVsc2UgewotCQljbGktPmNsX21heF9ycGNzX2luX2ZsaWdodCA9IE9TQ19NQVhfUklGX0RFRkFVTFQ7CisJCWNsaS0+Y2xfbWF4X3JwY3NfaW5fZmxpZ2h0ID0gT0JEX01BWF9SSUZfREVGQVVMVDsKIAl9CiAJcmMgPSBsZGxtX2dldF9yZWYoKTsKIAlpZiAocmMpIHsKQEAgLTUzNCw3ICs1MzYsNyBAQAogCWltcCA9IGNsaS0+Y2xfaW1wb3J0OwogCiAJZG93bl93cml0ZSgmY2xpLT5jbF9zZW0pOwotCUNERUJVRyhEX0lORk8sICJkaXNjb25uZWN0ICVzIC0gJWRcbiIsIG9iZC0+b2JkX25hbWUsCisJQ0RFQlVHKERfSU5GTywgImRpc2Nvbm5lY3QgJXMgLSAlenVcbiIsIG9iZC0+b2JkX25hbWUsCiAJICAgICAgIGNsaS0+Y2xfY29ubl9jb3VudCk7CiAKIAlpZiAoIWNsaS0+Y2xfY29ubl9jb3VudCkgewpAQCAtNjkwLDcgKzY5Miw3IEBACiAJaWYgKHJzLT5yc190cmFuc25vID4gZXhwLT5leHBfbGFzdF9jb21taXR0ZWQpIHsKIAkJLyogbm90IGNvbW1pdHRlZCBhbHJlYWR5ICovCiAJCWxpc3RfYWRkX3RhaWwoJnJzLT5yc19vYmRfbGlzdCwKLQkJCQkgICZleHAtPmV4cF91bmNvbW1pdHRlZF9yZXBsaWVzKTsKKwkJCSAgICAgICZleHAtPmV4cF91bmNvbW1pdHRlZF9yZXBsaWVzKTsKIAl9CiAJc3Bpbl91bmxvY2soJmV4cC0+ZXhwX3VuY29tbWl0dGVkX3JlcGxpZXNfbG9jayk7CiAKQEAgLTc5NSw3ICs3OTcsNyBAQAogCQlDRVJST1IoImR1bXBpbmcgbG9ja3MgZm9yIGV4cG9ydCAlcCxpZ25vcmUgaWYgdGhlIHVubW91bnQgZG9lc24ndCBoYW5nXG4iLAogCQkgICAgICAgZXhwKTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NrLCAmZXhwLT5leHBfbG9ja3NfbGlzdCwKLQkJCQkJbF9leHBfcmVmc19saW5rKQorCQkJCSAgICBsX2V4cF9yZWZzX2xpbmspCiAJCQlMRExNX0VSUk9SKGxvY2ssICJsb2NrOiIpOwogCX0KIAlzcGluX3VubG9jaygmZXhwLT5leHBfbG9ja3NfbGlzdF9ndWFyZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fbG9jay5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2xvY2suYwppbmRleCBhNTk5M2Y3Li4zYzQ4YjRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fbG9jay5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9sb2NrLmMKQEAgLTQ4MSw4ICs0ODEsOCBAQAogCXVubG9ja19yZXNfYW5kX2xvY2sobG9jayk7CiAKIAluZXdyZXMgPSBsZGxtX3Jlc291cmNlX2dldChucywgTlVMTCwgbmV3X3Jlc2lkLCB0eXBlLCAxKTsKLQlpZiAoIW5ld3JlcykKLQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKElTX0VSUihuZXdyZXMpKQorCQlyZXR1cm4gUFRSX0VSUihuZXdyZXMpOwogCiAJbHVfcmVmX2FkZCgmbmV3cmVzLT5scl9yZWZlcmVuY2UsICJsb2NrIiwgbG9jayk7CiAJLyoKQEAgLTU0Miw3ICs1NDIsNyBAQAogCiAJTEFTU0VSVChoYW5kbGUpOwogCi0JbG9jayA9IGNsYXNzX2hhbmRsZTJvYmplY3QoaGFuZGxlLT5jb29raWUpOworCWxvY2sgPSBjbGFzc19oYW5kbGUyb2JqZWN0KGhhbmRsZS0+Y29va2llLCBOVUxMKTsKIAlpZiAoIWxvY2spCiAJCXJldHVybiBOVUxMOwogCkBAIC05MzcsNyArOTM3LDcgQEAKIAkJCQkvKiBnbyB0byBuZXh0IHBvbGljeSBncm91cCB3aXRoaW4gbW9kZSBncm91cCAqLwogCQkJCXRtcCA9IHBvbGljeV9lbmQtPmxfcmVzX2xpbmsubmV4dDsKIAkJCQlsb2NrID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBsZGxtX2xvY2ssCi0JCQkJCQkgICAgICBsX3Jlc19saW5rKTsKKwkJCQkJCSAgbF9yZXNfbGluayk7CiAJCQl9ICAvKiBsb29wIG92ZXIgcG9saWN5IGdyb3VwcyB3aXRoaW4gdGhlIG1vZGUgZ3JvdXAgKi8KIAogCQkJLyogaW5zZXJ0IHBvaW50IGlzIGxhc3QgbG9jayBvZiB0aGUgbW9kZSBncm91cCwKQEAgLTEwMjgsMTUgKzEwMjgsMjggQEAKIAljaGVja19yZXNfbG9ja2VkKHJlcyk7CiAKIAlsb2NrLT5sX2dyYW50ZWRfbW9kZSA9IGxvY2stPmxfcmVxX21vZGU7CisKKwlpZiAod29ya19saXN0ICYmIGxvY2stPmxfY29tcGxldGlvbl9hc3QpCisJCWxkbG1fYWRkX2FzdF93b3JrX2l0ZW0obG9jaywgTlVMTCwgd29ya19saXN0KTsKKwogCWlmIChyZXMtPmxyX3R5cGUgPT0gTERMTV9QTEFJTiB8fCByZXMtPmxyX3R5cGUgPT0gTERMTV9JQklUUykKIAkJbGRsbV9ncmFudF9sb2NrX3dpdGhfc2tpcGxpc3QobG9jayk7CiAJZWxzZSBpZiAocmVzLT5scl90eXBlID09IExETE1fRVhURU5UKQogCQlsZGxtX2V4dGVudF9hZGRfbG9jayhyZXMsIGxvY2spOwotCWVsc2UKKwllbHNlIGlmIChyZXMtPmxyX3R5cGUgPT0gTERMTV9GTE9DSykgeworCQkvKgorCQkgKiBXZSBzaG91bGQgbm90IGFkZCBsb2NrcyB0byBncmFudGVkIGxpc3QgaW4gdGhlIGZvbGxvd2luZyBjYXNlczoKKwkJICogLSB0aGlzIGlzIGFuIFVOTE9DSyBidXQgbm90IGEgcmVhbCBsb2NrOworCQkgKiAtIHRoaXMgaXMgYSBURVNUIGxvY2s7CisJCSAqIC0gdGhpcyBpcyBhIEZfQ0FOQ0VMTEsgbG9jayAoYXN5bmMgZmxvY2sgaGFzIHJlcV9tb2RlID09IDApCisJCSAqIC0gdGhpcyBpcyBhIGRlYWRsb2NrIChmbG9jayBjYW5ub3QgYmUgZ3JhbnRlZCkKKwkJICovCisJCWlmICghbG9jay0+bF9yZXFfbW9kZSB8fCBsb2NrLT5sX3JlcV9tb2RlID09IExDS19OTCB8fAorCQkgICAgbGRsbV9pc190ZXN0X2xvY2sobG9jaykgfHwgbGRsbV9pc19mbG9ja19kZWFkbG9jayhsb2NrKSkKKwkJCXJldHVybjsKIAkJbGRsbV9yZXNvdXJjZV9hZGRfbG9jayhyZXMsICZyZXMtPmxyX2dyYW50ZWQsIGxvY2spOwotCi0JaWYgKHdvcmtfbGlzdCAmJiBsb2NrLT5sX2NvbXBsZXRpb25fYXN0KQotCQlsZGxtX2FkZF9hc3Rfd29ya19pdGVtKGxvY2ssIE5VTEwsIHdvcmtfbGlzdCk7CisJfSBlbHNlCisJCUxCVUcoKTsKIAogCWxkbG1fcG9vbF9hZGQoJmxkbG1fcmVzX3RvX25zKHJlcyktPm5zX3Bvb2wsIGxvY2spOwogfQpAQCAtMTEwMyw3ICsxMTE2LDcgQEAKIAkJICogb2YgYml0cy4KIAkJICovCiAJCWlmIChsb2NrLT5sX3Jlc291cmNlLT5scl90eXBlID09IExETE1fSUJJVFMgJiYKLQkJICAgICAoKGxvY2stPmxfcG9saWN5X2RhdGEubF9pbm9kZWJpdHMuYml0cyAmCisJCSAgICAoKGxvY2stPmxfcG9saWN5X2RhdGEubF9pbm9kZWJpdHMuYml0cyAmCiAJCSAgICAgIHBvbGljeS0+bF9pbm9kZWJpdHMuYml0cykgIT0KIAkJICAgICAgcG9saWN5LT5sX2lub2RlYml0cy5iaXRzKSkKIAkJCWNvbnRpbnVlOwpAQCAtMTIxNCw3ICsxMjI3LDcgQEAKIAl9CiAKIAlyZXMgPSBsZGxtX3Jlc291cmNlX2dldChucywgTlVMTCwgcmVzX2lkLCB0eXBlLCAwKTsKLQlpZiAoIXJlcykgeworCWlmIChJU19FUlIocmVzKSkgewogCQlMQVNTRVJUKCFvbGRfbG9jayk7CiAJCXJldHVybiAwOwogCX0KQEAgLTEzNjMsMTIgKzEzNzYsMTIgQEAKIAkJaWYgKHNpemUgPT0gc2l6ZW9mKHN0cnVjdCBvc3RfbHZiKSkgewogCQkJaWYgKGxvYyA9PSBSQ0xfQ0xJRU5UKQogCQkJCWx2YiA9IHJlcV9jYXBzdWxlX2NsaWVudF9zd2FiX2dldChwaWxsLAotCQkJCQkJJlJNRl9ETE1fTFZCLAotCQkJCQkJbHVzdHJlX3N3YWJfb3N0X2x2Yik7CisJCQkJCQkJCSAgJlJNRl9ETE1fTFZCLAorCQkJCQkJCWx1c3RyZV9zd2FiX29zdF9sdmIpOwogCQkJZWxzZQogCQkJCWx2YiA9IHJlcV9jYXBzdWxlX3NlcnZlcl9zd2FiX2dldChwaWxsLAotCQkJCQkJJlJNRl9ETE1fTFZCLAotCQkJCQkJbHVzdHJlX3N3YWJfb3N0X2x2Yik7CisJCQkJCQkJCSAgJlJNRl9ETE1fTFZCLAorCQkJCQkJCWx1c3RyZV9zd2FiX29zdF9sdmIpOwogCQkJaWYgKHVubGlrZWx5KCFsdmIpKSB7CiAJCQkJTERMTV9FUlJPUihsb2NrLCAibm8gTFZCIik7CiAJCQkJcmV0dXJuIC1FUFJPVE87CkBAIC0xMzgwLDggKzEzOTMsOCBAQAogCiAJCQlpZiAobG9jID09IFJDTF9DTElFTlQpCiAJCQkJbHZiID0gcmVxX2NhcHN1bGVfY2xpZW50X3N3YWJfZ2V0KHBpbGwsCi0JCQkJCQkmUk1GX0RMTV9MVkIsCi0JCQkJCQlsdXN0cmVfc3dhYl9vc3RfbHZiX3YxKTsKKwkJCQkJCQkJICAmUk1GX0RMTV9MVkIsCisJCQkJCQkJbHVzdHJlX3N3YWJfb3N0X2x2Yl92MSk7CiAJCQllbHNlCiAJCQkJbHZiID0gcmVxX2NhcHN1bGVfc2VydmVyX3NpemVkX3N3YWJfZ2V0KHBpbGwsCiAJCQkJCQkmUk1GX0RMTV9MVkIsIHNpemUsCkBAIC0xNDA1LDEyICsxNDE4LDEyIEBACiAJCWlmIChzaXplID09IHNpemVvZihzdHJ1Y3QgbHF1b3RhX2x2YikpIHsKIAkJCWlmIChsb2MgPT0gUkNMX0NMSUVOVCkKIAkJCQlsdmIgPSByZXFfY2Fwc3VsZV9jbGllbnRfc3dhYl9nZXQocGlsbCwKLQkJCQkJCSZSTUZfRExNX0xWQiwKLQkJCQkJCWx1c3RyZV9zd2FiX2xxdW90YV9sdmIpOworCQkJCQkJCQkgICZSTUZfRExNX0xWQiwKKwkJCQkJCQlsdXN0cmVfc3dhYl9scXVvdGFfbHZiKTsKIAkJCWVsc2UKIAkJCQlsdmIgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfc3dhYl9nZXQocGlsbCwKLQkJCQkJCSZSTUZfRExNX0xWQiwKLQkJCQkJCWx1c3RyZV9zd2FiX2xxdW90YV9sdmIpOworCQkJCQkJCQkgICZSTUZfRExNX0xWQiwKKwkJCQkJCQlsdXN0cmVfc3dhYl9scXVvdGFfbHZiKTsKIAkJCWlmICh1bmxpa2VseSghbHZiKSkgewogCQkJCUxETE1fRVJST1IobG9jaywgIm5vIExWQiIpOwogCQkJCXJldHVybiAtRVBST1RPOwpAQCAtMTQ2MiwxNSArMTQ3NSwxNSBAQAogewogCXN0cnVjdCBsZGxtX2xvY2sgKmxvY2s7CiAJc3RydWN0IGxkbG1fcmVzb3VyY2UgKnJlczsKKwlpbnQgcmM7CiAKIAlyZXMgPSBsZGxtX3Jlc291cmNlX2dldChucywgTlVMTCwgcmVzX2lkLCB0eXBlLCAxKTsKLQlpZiAoIXJlcykKLQkJcmV0dXJuIE5VTEw7CisJaWYgKElTX0VSUihyZXMpKQorCQlyZXR1cm4gRVJSX0NBU1QocmVzKTsKIAogCWxvY2sgPSBsZGxtX2xvY2tfbmV3KHJlcyk7Ci0KIAlpZiAoIWxvY2spCi0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCWxvY2stPmxfcmVxX21vZGUgPSBtb2RlOwogCWxvY2stPmxfYXN0X2RhdGEgPSBkYXRhOwpAQCAtMTQ4NCwyNyArMTQ5NywzMyBAQAogCWxvY2stPmxfdHJlZV9ub2RlID0gTlVMTDsKIAkvKiBpZiB0aGlzIGlzIHRoZSBleHRlbnQgbG9jaywgYWxsb2NhdGUgdGhlIGludGVydmFsIHRyZWUgbm9kZSAqLwogCWlmICh0eXBlID09IExETE1fRVhURU5UKSB7Ci0JCWlmICghbGRsbV9pbnRlcnZhbF9hbGxvYyhsb2NrKSkKKwkJaWYgKCFsZGxtX2ludGVydmFsX2FsbG9jKGxvY2spKSB7CisJCQlyYyA9IC1FTk9NRU07CiAJCQlnb3RvIG91dDsKKwkJfQogCX0KIAogCWlmIChsdmJfbGVuKSB7CiAJCWxvY2stPmxfbHZiX2xlbiA9IGx2Yl9sZW47CiAJCWxvY2stPmxfbHZiX2RhdGEgPSBremFsbG9jKGx2Yl9sZW4sIEdGUF9OT0ZTKTsKLQkJaWYgKCFsb2NrLT5sX2x2Yl9kYXRhKQorCQlpZiAoIWxvY2stPmxfbHZiX2RhdGEpIHsKKwkJCXJjID0gLUVOT01FTTsKIAkJCWdvdG8gb3V0OworCQl9CiAJfQogCiAJbG9jay0+bF9sdmJfdHlwZSA9IGx2Yl90eXBlOwotCWlmIChPQkRfRkFJTF9DSEVDSyhPQkRfRkFJTF9MRExNX05FV19MT0NLKSkKKwlpZiAoT0JEX0ZBSUxfQ0hFQ0soT0JEX0ZBSUxfTERMTV9ORVdfTE9DSykpIHsKKwkJcmMgPSAtRU5PRU5UOwogCQlnb3RvIG91dDsKKwl9CiAKIAlyZXR1cm4gbG9jazsKIAogb3V0OgogCWxkbG1fbG9ja19kZXN0cm95KGxvY2spOwogCUxETE1fTE9DS19SRUxFQVNFKGxvY2spOwotCXJldHVybiBOVUxMOworCXJldHVybiBFUlJfUFRSKHJjKTsKIH0KIAogLyoqCkBAIC0xNTIyLDE2ICsxNTQxLDEzIEBACiAJc3RydWN0IGxkbG1fbG9jayAqbG9jayA9ICpsb2NrcDsKIAlzdHJ1Y3QgbGRsbV9yZXNvdXJjZSAqcmVzID0gbG9jay0+bF9yZXNvdXJjZTsKIAotCWxvY2stPmxfbGFzdF9hY3Rpdml0eSA9IGt0aW1lX2dldF9yZWFsX3NlY29uZHMoKTsKLQogCWxvY2tfcmVzX2FuZF9sb2NrKGxvY2spOwogCWlmIChsb2NrLT5sX3JlcV9tb2RlID09IGxvY2stPmxfZ3JhbnRlZF9tb2RlKSB7CiAJCS8qIFRoZSBzZXJ2ZXIgcmV0dXJuZWQgYSBibG9ja2VkIGxvY2ssIGJ1dCBpdCB3YXMgZ3JhbnRlZAogCQkgKiBiZWZvcmUgd2UgZ290IGEgY2hhbmNlIHRvIGFjdHVhbGx5IGVucXVldWUgaXQuICBXZSBkb24ndAogCQkgKiBuZWVkIHRvIGRvIGFueXRoaW5nIGVsc2UuCiAJCSAqLwotCQkqZmxhZ3MgJj0gfihMRExNX0ZMX0JMT0NLX0dSQU5URUQgfAotCQkJICAgIExETE1fRkxfQkxPQ0tfQ09OViB8IExETE1fRkxfQkxPQ0tfV0FJVCk7CisJCSpmbGFncyAmPSB+TERMTV9GTF9CTE9DS0VEX01BU0s7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMTU0Niw2ICsxNTYyLDggQEAKIAkgKi8KIAlpZiAoKmZsYWdzICYgTERMTV9GTF9BU1RfRElTQ0FSRF9EQVRBKQogCQlsZGxtX3NldF9hc3RfZGlzY2FyZF9kYXRhKGxvY2spOworCWlmICgqZmxhZ3MgJiBMRExNX0ZMX1RFU1RfTE9DSykKKwkJbGRsbV9zZXRfdGVzdF9sb2NrKGxvY2spOwogCiAJLyoKIAkgKiBUaGlzIGRpc3RpbmN0aW9uIGJldHdlZW4gbG9jYWwgbG9jayB0cmVlcyBpcyB2ZXJ5IGltcG9ydGFudDsgYSBjbGllbnQKQEAgLTE2ODgsNyArMTcwNiw3IEBACiAJCXJldHVybiAtRU5PRU5UOwogCiAJZ2xfd29yayA9IGxpc3RfZW50cnkoYXJnLT5saXN0LT5uZXh0LCBzdHJ1Y3QgbGRsbV9nbGltcHNlX3dvcmssCi0JCQkJIGdsX2xpc3QpOworCQkJICAgICBnbF9saXN0KTsKIAlsaXN0X2RlbF9pbml0KCZnbF93b3JrLT5nbF9saXN0KTsKIAogCWxvY2sgPSBnbF93b3JrLT5nbF9sb2NrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2xvY2tkLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fbG9ja2QuYwppbmRleCA4MjE5MzlmLi5mZGU2OTdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fbG9ja2QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fbG9ja2QuYwpAQCAtNTU5LDggKzU1OSwxMSBAQAogCiAJc3dpdGNoIChsdXN0cmVfbXNnX2dldF9vcGMocmVxLT5ycV9yZXFtc2cpKSB7CiAJY2FzZSBMRExNX0JMX0NBTExCQUNLOgotCQlpZiAoT0JEX0ZBSUxfQ0hFQ0soT0JEX0ZBSUxfTERMTV9CTF9DQUxMQkFDS19ORVQpKQorCQlpZiAoT0JEX0ZBSUxfQ0hFQ0soT0JEX0ZBSUxfTERMTV9CTF9DQUxMQkFDS19ORVQpKSB7CisJCQlpZiAoY2ZzX2ZhaWxfZXJyKQorCQkJCWxkbG1fY2FsbGJhY2tfcmVwbHkocmVxLCAtKGludCljZnNfZmFpbF9lcnIpOwogCQkJcmV0dXJuIDA7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRExNX0NQX0NBTExCQUNLOgogCQlpZiAoT0JEX0ZBSUxfQ0hFQ0soT0JEX0ZBSUxfTERMTV9DUF9DQUxMQkFDS19ORVQpKQpAQCAtNzA2LDEyICs3MDksMTIgQEAKIAlpZiAoIWxpc3RfZW1wdHkoJmJscC0+YmxwX2xpc3QpICYmCiAJICAgIChsaXN0X2VtcHR5KCZibHAtPmJscF9wcmlvX2xpc3QpIHx8IG51bV9ibCA9PSAwKSkKIAkJYmx3aSA9IGxpc3RfZW50cnkoYmxwLT5ibHBfbGlzdC5uZXh0LAotCQkJCSAgICAgIHN0cnVjdCBsZGxtX2JsX3dvcmtfaXRlbSwgYmx3aV9lbnRyeSk7CisJCQkJICBzdHJ1Y3QgbGRsbV9ibF93b3JrX2l0ZW0sIGJsd2lfZW50cnkpOwogCWVsc2UKIAkJaWYgKCFsaXN0X2VtcHR5KCZibHAtPmJscF9wcmlvX2xpc3QpKQogCQkJYmx3aSA9IGxpc3RfZW50cnkoYmxwLT5ibHBfcHJpb19saXN0Lm5leHQsCi0JCQkJCSAgICAgIHN0cnVjdCBsZGxtX2JsX3dvcmtfaXRlbSwKLQkJCQkJICAgICAgYmx3aV9lbnRyeSk7CisJCQkJCSAgc3RydWN0IGxkbG1fYmxfd29ya19pdGVtLAorCQkJCQkgIGJsd2lfZW50cnkpOwogCiAJaWYgKGJsd2kpIHsKIAkJaWYgKCsrbnVtX2JsID49IGF0b21pY19yZWFkKCZibHAtPmJscF9udW1fdGhyZWFkcykpCkBAIC03NDEsNyArNzQ0LDcgQEAKIAlpbml0X2NvbXBsZXRpb24oJmJsdGQuYmx0ZF9jb21wKTsKIAlibHRkLmJsdGRfbnVtID0gYXRvbWljX3JlYWQoJmJscC0+YmxwX251bV90aHJlYWRzKTsKIAlzbnByaW50ZihibHRkLmJsdGRfbmFtZSwgc2l6ZW9mKGJsdGQuYmx0ZF9uYW1lKSwKLQkJImxkbG1fYmxfJTAyZCIsIGJsdGQuYmx0ZF9udW0pOworCQkgImxkbG1fYmxfJTAyZCIsIGJsdGQuYmx0ZF9udW0pOwogCXRhc2sgPSBrdGhyZWFkX3J1bihsZGxtX2JsX3RocmVhZF9tYWluLCAmYmx0ZCwgIiVzIiwgYmx0ZC5ibHRkX25hbWUpOwogCWlmIChJU19FUlIodGFzaykpIHsKIAkJQ0VSUk9SKCJjYW5ub3Qgc3RhcnQgTERMTSB0aHJlYWQgbGRsbV9ibF8lMDJkOiByYyAlbGRcbiIsCkBAIC03ODYsOCArNzg5LDggQEAKIAkJaWYgKCFibHdpKSB7CiAJCQlhdG9taWNfZGVjKCZibHAtPmJscF9idXN5X3RocmVhZHMpOwogCQkJbF93YWl0X2V2ZW50X2V4Y2x1c2l2ZShibHAtPmJscF93YWl0cSwKLQkJCQkJIChibHdpID0gbGRsbV9ibF9nZXRfd29yayhibHApKSwKLQkJCQkJICZsd2kpOworCQkJCQkgICAgICAgKGJsd2kgPSBsZGxtX2JsX2dldF93b3JrKGJscCkpLAorCQkJCQkgICAgICAgJmx3aSk7CiAJCQlidXN5ID0gYXRvbWljX2luY19yZXR1cm4oJmJscC0+YmxwX2J1c3lfdGhyZWFkcyk7CiAJCX0gZWxzZSB7CiAJCQlidXN5ID0gYXRvbWljX3JlYWQoJmJscC0+YmxwX2J1c3lfdGhyZWFkcyk7CkBAIC04NzQsOCArODc3LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0wobGRsbV9wdXRfcmVmKTsKIAotZXh0ZXJuIHVuc2lnbmVkIGludCBsZGxtX2NhbmNlbF91bnVzZWRfbG9ja3NfYmVmb3JlX3JlcGxheTsKLQogc3RhdGljIHNzaXplX3QgY2FuY2VsX3VudXNlZF9sb2Nrc19iZWZvcmVfcmVwbGF5X3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCiAJCQkJCQkgICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAogCQkJCQkJICAgICAgY2hhciAqYnVmKQpAQCAtMTA5NCwxNiArMTA5NSwxNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWxkbG1fbG9ja19zbGFiID0ga21lbV9jYWNoZV9jcmVhdGUoImxkbG1fbG9ja3MiLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBsZGxtX2xvY2spLCAwLAotCQkJICAgICAgU0xBQl9IV0NBQ0hFX0FMSUdOIHwgU0xBQl9ERVNUUk9ZX0JZX1JDVSwgTlVMTCk7CisJCQkJCSAgIHNpemVvZihzdHJ1Y3QgbGRsbV9sb2NrKSwgMCwKKwkJCQkJICAgU0xBQl9IV0NBQ0hFX0FMSUdOIHwKKwkJCQkJICAgU0xBQl9ERVNUUk9ZX0JZX1JDVSwgTlVMTCk7CiAJaWYgKCFsZGxtX2xvY2tfc2xhYikgewogCQlrbWVtX2NhY2hlX2Rlc3Ryb3kobGRsbV9yZXNvdXJjZV9zbGFiKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJbGRsbV9pbnRlcnZhbF9zbGFiID0ga21lbV9jYWNoZV9jcmVhdGUoImludGVydmFsX25vZGUiLAotCQkJCQlzaXplb2Yoc3RydWN0IGxkbG1faW50ZXJ2YWwpLAotCQkJCQkwLCBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwpOworCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBsZGxtX2ludGVydmFsKSwKKwkJCQkJICAgICAgIDAsIFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7CiAJaWYgKCFsZGxtX2ludGVydmFsX3NsYWIpIHsKIAkJa21lbV9jYWNoZV9kZXN0cm95KGxkbG1fcmVzb3VyY2Vfc2xhYik7CiAJCWttZW1fY2FjaGVfZGVzdHJveShsZGxtX2xvY2tfc2xhYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fcG9vbC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX3Bvb2wuYwppbmRleCA2NTdlZDQwLi45YTExMzZlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX3Bvb2wuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fcG9vbC5jCkBAIC0zNTcsMzggKzM1Nyw0MCBAQAogCWludCBjb3VudDsKIAogCXJlY2FsY19pbnRlcnZhbF9zZWMgPSBrdGltZV9nZXRfc2Vjb25kcygpIC0gcGwtPnBsX3JlY2FsY190aW1lOwotCWlmIChyZWNhbGNfaW50ZXJ2YWxfc2VjIDw9IDApCi0JCWdvdG8gcmVjYWxjOwotCi0Jc3Bpbl9sb2NrKCZwbC0+cGxfbG9jayk7CiAJaWYgKHJlY2FsY19pbnRlcnZhbF9zZWMgPiAwKSB7Ci0JCS8qCi0JCSAqIFVwZGF0ZSBwb29sIHN0YXRpc3RpY3MgZXZlcnkgMXMuCi0JCSAqLwotCQlsZGxtX3Bvb2xfcmVjYWxjX3N0YXRzKHBsKTsKKwkJc3Bpbl9sb2NrKCZwbC0+cGxfbG9jayk7CisJCXJlY2FsY19pbnRlcnZhbF9zZWMgPSBrdGltZV9nZXRfc2Vjb25kcygpIC0gcGwtPnBsX3JlY2FsY190aW1lOwogCi0JCS8qCi0JCSAqIFplcm8gb3V0IGFsbCByYXRlcyBhbmQgc3BlZWQgZm9yIHRoZSBsYXN0IHBlcmlvZC4KLQkJICovCi0JCWF0b21pY19zZXQoJnBsLT5wbF9ncmFudF9yYXRlLCAwKTsKLQkJYXRvbWljX3NldCgmcGwtPnBsX2NhbmNlbF9yYXRlLCAwKTsKKwkJaWYgKHJlY2FsY19pbnRlcnZhbF9zZWMgPiAwKSB7CisJCQkvKgorCQkJICogVXBkYXRlIHBvb2wgc3RhdGlzdGljcyBldmVyeSAxcy4KKwkJCSAqLworCQkJbGRsbV9wb29sX3JlY2FsY19zdGF0cyhwbCk7CisKKwkJCS8qCisJCQkgKiBaZXJvIG91dCBhbGwgcmF0ZXMgYW5kIHNwZWVkIGZvciB0aGUgbGFzdCBwZXJpb2QuCisJCQkgKi8KKwkJCWF0b21pY19zZXQoJnBsLT5wbF9ncmFudF9yYXRlLCAwKTsKKwkJCWF0b21pY19zZXQoJnBsLT5wbF9jYW5jZWxfcmF0ZSwgMCk7CisJCX0KKwkJc3Bpbl91bmxvY2soJnBsLT5wbF9sb2NrKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJnBsLT5wbF9sb2NrKTsKIAotIHJlY2FsYzoKIAlpZiAocGwtPnBsX29wcy0+cG9fcmVjYWxjKSB7CiAJCWNvdW50ID0gcGwtPnBsX29wcy0+cG9fcmVjYWxjKHBsKTsKIAkJbHByb2Nmc19jb3VudGVyX2FkZChwbC0+cGxfc3RhdHMsIExETE1fUE9PTF9SRUNBTENfU1RBVCwKIAkJCQkgICAgY291bnQpOwogCX0KKwogCXJlY2FsY19pbnRlcnZhbF9zZWMgPSBwbC0+cGxfcmVjYWxjX3RpbWUgLSBrdGltZV9nZXRfc2Vjb25kcygpICsKIAkJCSAgICAgIHBsLT5wbF9yZWNhbGNfcGVyaW9kOwogCWlmIChyZWNhbGNfaW50ZXJ2YWxfc2VjIDw9IDApIHsKKwkJLyogREVCVUc6IHNob3VsZCBiZSByZS1yZW1vdmVkIGFmdGVyIExVLTQ1MzYgaXMgZml4ZWQgKi8KKwkJQ0RFQlVHKERfRExNVFJBQ0UsICIlczogTmVnYXRpdmUgaW50ZXJ2YWwoJWxkKSwgdG9vIHNob3J0IHBlcmlvZCglbGQpXG4iLAorCQkgICAgICAgcGwtPnBsX25hbWUsIChsb25nKXJlY2FsY19pbnRlcnZhbF9zZWMsCisJCSAgICAgICAobG9uZylwbC0+cGxfcmVjYWxjX3BlcmlvZCk7CisKIAkJLyogUHJldmVudCB0b28gZnJlcXVlbnQgcmVjYWxjdWxhdGlvbi4gKi8KLQkJQ0RFQlVHKERfRExNVFJBQ0UsCi0JCSAgICAgICAiTmVnYXRpdmUgaW50ZXJ2YWwoJWQpLCB0b28gc2hvcnQgcGVyaW9kKCVsbGQpIiwKLQkJICAgICAgIHJlY2FsY19pbnRlcnZhbF9zZWMsCi0JCSAgICAgICAoczY0KXBsLT5wbF9yZWNhbGNfcGVyaW9kKTsKIAkJcmVjYWxjX2ludGVydmFsX3NlYyA9IDE7CiAJfQogCkBAIC03OTIsNyArNzk0LDggQEAKICAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgbGRsbV9wb29sc19jb3VudChsZGxtX3NpZGVfdCBjbGllbnQsIGdmcF90IGdmcF9tYXNrKQogewotCWludCB0b3RhbCA9IDAsIG5yX25zOworCXVuc2lnbmVkIGxvbmcgdG90YWwgPSAwOworCWludCBucl9uczsKIAlzdHJ1Y3QgbGRsbV9uYW1lc3BhY2UgKm5zOwogCXN0cnVjdCBsZGxtX25hbWVzcGFjZSAqbnNfb2xkID0gTlVMTDsgLyogbG9vcCBkZXRlY3Rpb24gKi8KIAl2b2lkICpjb29raWU7CkBAIC05OTUsNyArOTk4LDcgQEAKIAl3YWtlX3VwKCZ0aHJlYWQtPnRfY3RsX3dhaXRxKTsKIAogCUNERUJVRyhEX0RMTVRSQUNFLCAiJXM6IHBvb2wgdGhyZWFkIHN0YXJ0aW5nLCBwcm9jZXNzICVkXG4iLAotCQkibGRsbV9wb29sZCIsIGN1cnJlbnRfcGlkKCkpOworCSAgICAgICAibGRsbV9wb29sZCIsIGN1cnJlbnRfcGlkKCkpOwogCiAJd2hpbGUgKDEpIHsKIAkJc3RydWN0IGxfd2FpdF9pbmZvIGx3aTsKQEAgLTEwMjUsNyArMTAyOCw3IEBACiAJd2FrZV91cCgmdGhyZWFkLT50X2N0bF93YWl0cSk7CiAKIAlDREVCVUcoRF9ETE1UUkFDRSwgIiVzOiBwb29sIHRocmVhZCBleGl0aW5nLCBwcm9jZXNzICVkXG4iLAotCQkibGRsbV9wb29sZCIsIGN1cnJlbnRfcGlkKCkpOworCSAgICAgICAibGRsbV9wb29sZCIsIGN1cnJlbnRfcGlkKCkpOwogCiAJY29tcGxldGVfYW5kX2V4aXQoJmxkbG1fcG9vbHNfY29tcCwgMCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fcmVxdWVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX3JlcXVlc3QuYwppbmRleCBhZjQ4N2Y5Li4zNWJhNmYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fcmVxdWVzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9yZXF1ZXN0LmMKQEAgLTYzLDggKzYzLDggQEAKIAogI2luY2x1ZGUgImxkbG1faW50ZXJuYWwuaCIKIAotaW50IGxkbG1fZW5xdWV1ZV9taW4gPSBPQkRfVElNRU9VVF9ERUZBVUxUOwotbW9kdWxlX3BhcmFtKGxkbG1fZW5xdWV1ZV9taW4sIGludCwgMDY0NCk7Cit1bnNpZ25lZCBpbnQgbGRsbV9lbnF1ZXVlX21pbiA9IE9CRF9USU1FT1VUX0RFRkFVTFQ7Cittb2R1bGVfcGFyYW0obGRsbV9lbnF1ZXVlX21pbiwgdWludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGxkbG1fZW5xdWV1ZV9taW4sICJsb2NrIGVucXVldWUgdGltZW91dCBtaW5pbXVtIik7CiAKIC8qIGluIGNsaWVudCBzaWRlLCB3aGV0aGVyIHRoZSBjYWNoZWQgbG9ja3Mgd2lsbCBiZSBjYW5jZWxlZCBiZWZvcmUgcmVwbGF5ICovCkBAIC0xMjMsNDQgKzEyMyw1NiBAQAogCXJldHVybiAwOwogfQogCisvKioKKyAqIENhbGN1bGF0ZSB0aGUgQ29tcGxldGlvbiB0aW1lb3V0IChjb3ZlcmluZyBlbnF1ZXVlLCBCTCBBU1QsIGRhdGEgZmx1c2gsCisgKiBsb2NrIGNhbmNlbCwgYW5kIHRoZWlyIHJlcGxpZXMpLiBVc2VkIGZvciBsb2NrIGNvbXBsZXRpb24gdGltZW91dCBvbiB0aGUKKyAqIGNsaWVudCBzaWRlLgorICoKKyAqIFxwYXJhbVtpbl0gbG9jawlsb2NrIHdoaWNoIGlzIHdhaXRpbmcgdGhlIGNvbXBsZXRpb24gY2FsbGJhY2sKKyAqCisgKiBccmV0dmFsCQl0aW1lb3V0IGluIHNlY29uZHMgdG8gd2FpdCBmb3IgdGhlIHNlcnZlciByZXBseQorICovCiAvKiBXZSB1c2UgdGhlIHNhbWUgYmFzaXMgZm9yIGJvdGggc2VydmVyIHNpZGUgYW5kIGNsaWVudCBzaWRlIGZ1bmN0aW9ucwogICogZnJvbSBhIHNpbmdsZSBub2RlLgogICovCi1zdGF0aWMgaW50IGxkbG1fZ2V0X2VucV90aW1lb3V0KHN0cnVjdCBsZGxtX2xvY2sgKmxvY2spCitzdGF0aWMgdW5zaWduZWQgaW50IGxkbG1fY3BfdGltZW91dChzdHJ1Y3QgbGRsbV9sb2NrICpsb2NrKQogewotCWludCB0aW1lb3V0ID0gYXRfZ2V0KGxkbG1fbG9ja190b19uc19hdChsb2NrKSk7CisJdW5zaWduZWQgaW50IHRpbWVvdXQ7CiAKIAlpZiAoQVRfT0ZGKQotCQlyZXR1cm4gb2JkX3RpbWVvdXQgLyAyOwotCS8qIFNpbmNlIHRoZXNlIGFyZSBub24tdXBkYXRpbmcgdGltZW91dHMsIHdlIHNob3VsZCBiZSBjb25zZXJ2YXRpdmUuCi0JICogSXQgd291bGQgYmUgbmljZSB0byBoYXZlIHNvbWUga2luZCBvZiAiZWFybHkgcmVwbHkiIG1lY2hhbmlzbSBmb3IKLQkgKiBsb2NrIGNhbGxiYWNrcyB0b28uLi4KKwkJcmV0dXJuIG9iZF90aW1lb3V0OworCisJLyoKKwkgKiBXYWl0IGEgbG9uZyB0aW1lIGZvciBlbnF1ZXVlIC0gc2VydmVyIG1heSBoYXZlIHRvIGNhbGxiYWNrIGEKKwkgKiBsb2NrIGZyb20gYW5vdGhlciBjbGllbnQuICBTZXJ2ZXIgd2lsbCBldmljdCB0aGUgb3RoZXIgY2xpZW50IGlmIGl0CisJICogZG9lc24ndCByZXNwb25kIHJlYXNvbmFibHksIGFuZCB0aGVuIGdpdmUgdXMgdGhlIGxvY2suCiAJICovCi0JdGltZW91dCA9IG1pbl90KGludCwgYXRfbWF4LCB0aW1lb3V0ICsgKHRpbWVvdXQgPj4gMSkpOyAvKiAxNTAlICovCi0JcmV0dXJuIG1heCh0aW1lb3V0LCBsZGxtX2VucXVldWVfbWluKTsKKwl0aW1lb3V0ID0gYXRfZ2V0KGxkbG1fbG9ja190b19uc19hdChsb2NrKSk7CisJcmV0dXJuIG1heCgzICogdGltZW91dCwgbGRsbV9lbnF1ZXVlX21pbik7CiB9CiAKIC8qKgogICogSGVscGVyIGZ1bmN0aW9uIGZvciBsZGxtX2NvbXBsZXRpb25fYXN0KCksIHVwZGF0aW5nIHRpbWluZ3Mgd2hlbiBsb2NrIGlzCiAgKiBhY3R1YWxseSBncmFudGVkLgogICovCi1zdGF0aWMgaW50IGxkbG1fY29tcGxldGlvbl90YWlsKHN0cnVjdCBsZGxtX2xvY2sgKmxvY2spCitzdGF0aWMgaW50IGxkbG1fY29tcGxldGlvbl90YWlsKHN0cnVjdCBsZGxtX2xvY2sgKmxvY2ssIHZvaWQgKmRhdGEpCiB7CiAJbG9uZyBkZWxheTsKLQlpbnQgIHJlc3VsdDsKKwlpbnQgcmVzdWx0ID0gMDsKIAogCWlmIChsZGxtX2lzX2Rlc3Ryb3llZChsb2NrKSB8fCBsZGxtX2lzX2ZhaWxlZChsb2NrKSkgewogCQlMRExNX0RFQlVHKGxvY2ssICJjbGllbnQtc2lkZSBlbnF1ZXVlOiBkZXN0cm95ZWQiKTsKIAkJcmVzdWx0ID0gLUVJTzsKKwl9IGVsc2UgaWYgKCFkYXRhKSB7CisJCUxETE1fREVCVUcobG9jaywgImNsaWVudC1zaWRlIGVucXVldWU6IGdyYW50ZWQiKTsKIAl9IGVsc2UgeworCQkvKiBUYWtlIGludG8gQVQgb25seSBDUCBSUEMsIG5vdCBpbW1lZGlhdGVseSBncmFudGVkIGxvY2tzICovCiAJCWRlbGF5ID0ga3RpbWVfZ2V0X3JlYWxfc2Vjb25kcygpIC0gbG9jay0+bF9sYXN0X2FjdGl2aXR5OwogCQlMRExNX0RFQlVHKGxvY2ssICJjbGllbnQtc2lkZSBlbnF1ZXVlOiBncmFudGVkIGFmdGVyICVsZHMiLAogCQkJICAgZGVsYXkpOwogCiAJCS8qIFVwZGF0ZSBvdXIgdGltZSBlc3RpbWF0ZSAqLwotCQlhdF9tZWFzdXJlZChsZGxtX2xvY2tfdG9fbnNfYXQobG9jayksCi0JCQkgICAgZGVsYXkpOwotCQlyZXN1bHQgPSAwOworCQlhdF9tZWFzdXJlZChsZGxtX2xvY2tfdG9fbnNfYXQobG9jayksIGRlbGF5KTsKIAl9CiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTE3NywxMCArMTg5LDkgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKCEoZmxhZ3MgJiAoTERMTV9GTF9CTE9DS19XQUlUIHwgTERMTV9GTF9CTE9DS19HUkFOVEVEIHwKLQkJICAgICAgIExETE1fRkxfQkxPQ0tfQ09OVikpKSB7CisJaWYgKCEoZmxhZ3MgJiBMRExNX0ZMX0JMT0NLRURfTUFTSykpIHsKIAkJd2FrZV91cCgmbG9jay0+bF93YWl0cSk7Ci0JCXJldHVybiBsZGxtX2NvbXBsZXRpb25fdGFpbChsb2NrKTsKKwkJcmV0dXJuIGxkbG1fY29tcGxldGlvbl90YWlsKGxvY2ssIGRhdGEpOwogCX0KIAogCUxETE1fREVCVUcobG9jaywgImNsaWVudC1zaWRlIGVucXVldWUgcmV0dXJuZWQgYSBibG9ja2VkIGxvY2ssIGdvaW5nIGZvcndhcmQiKTsKQEAgLTIyNCw4ICsyMzUsNyBAQAogCQlnb3RvIG5vcmVwcm9jOwogCX0KIAotCWlmICghKGZsYWdzICYgKExETE1fRkxfQkxPQ0tfV0FJVCB8IExETE1fRkxfQkxPQ0tfR1JBTlRFRCB8Ci0JCSAgICAgICBMRExNX0ZMX0JMT0NLX0NPTlYpKSkgeworCWlmICghKGZsYWdzICYgTERMTV9GTF9CTE9DS0VEX01BU0spKSB7CiAJCXdha2VfdXAoJmxvY2stPmxfd2FpdHEpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0yNDAsMTMgKzI1MCwxMCBAQAogCWlmIChvYmQpCiAJCWltcCA9IG9iZC0+dS5jbGkuY2xfaW1wb3J0OwogCi0JLyogV2FpdCBhIGxvbmcgdGltZSBmb3IgZW5xdWV1ZSAtIHNlcnZlciBtYXkgaGF2ZSB0byBjYWxsYmFjayBhCi0JICogbG9jayBmcm9tIGFub3RoZXIgY2xpZW50LiAgU2VydmVyIHdpbGwgZXZpY3QgdGhlIG90aGVyIGNsaWVudCBpZiBpdAotCSAqIGRvZXNuJ3QgcmVzcG9uZCByZWFzb25hYmx5LCBhbmQgdGhlbiBnaXZlIHVzIHRoZSBsb2NrLgotCSAqLwotCXRpbWVvdXQgPSBsZGxtX2dldF9lbnFfdGltZW91dChsb2NrKSAqIDI7CisJdGltZW91dCA9IGxkbG1fY3BfdGltZW91dChsb2NrKTsKIAogCWx3ZC5sd2RfbG9jayA9IGxvY2s7CisJbG9jay0+bF9sYXN0X2FjdGl2aXR5ID0ga3RpbWVfZ2V0X3JlYWxfc2Vjb25kcygpOwogCiAJaWYgKGxkbG1faXNfbm9fdGltZW91dChsb2NrKSkgewogCQlMRExNX0RFQlVHKGxvY2ssICJ3YWl0aW5nIGluZGVmaW5pdGVseSBiZWNhdXNlIG9mIE5PX1RJTUVPVVQiKTsKQEAgLTI3OSw3ICsyODYsNyBAQAogCQlyZXR1cm4gcmM7CiAJfQogCi0JcmV0dXJuIGxkbG1fY29tcGxldGlvbl90YWlsKGxvY2spOworCXJldHVybiBsZGxtX2NvbXBsZXRpb25fdGFpbChsb2NrLCBkYXRhKTsKIH0KIEVYUE9SVF9TWU1CT0wobGRsbV9jb21wbGV0aW9uX2FzdCk7CiAKQEAgLTMwOSw4ICszMTYsNiBAQAogCWVsc2UKIAkJTERMTV9ERUJVRyhsb2NrLCAibG9jayB3YXMgZ3JhbnRlZCBvciBmYWlsZWQgaW4gcmFjZSIpOwogCi0JbGRsbV9sb2NrX2RlY3JlZl9pbnRlcm5hbChsb2NrLCBtb2RlKTsKLQogCS8qIFhYWCAtIEhBQ0sgYmVjYXVzZSB3ZSBzaG91bGRuJ3QgY2FsbCBsZGxtX2xvY2tfZGVzdHJveSgpCiAJICogICAgICAgZnJvbSBsbGl0ZS9maWxlLmMvbGxfZmlsZV9mbG9jaygpLgogCSAqLwpAQCAtMzIxLDkgKzMyNiwxNCBAQAogCSAqLwogCWlmIChsb2NrLT5sX3Jlc291cmNlLT5scl90eXBlID09IExETE1fRkxPQ0spIHsKIAkJbG9ja19yZXNfYW5kX2xvY2sobG9jayk7Ci0JCWxkbG1fcmVzb3VyY2VfdW5saW5rX2xvY2sobG9jayk7Ci0JCWxkbG1fbG9ja19kZXN0cm95X25vbG9jayhsb2NrKTsKKwkJaWYgKCFsZGxtX2lzX2Rlc3Ryb3llZChsb2NrKSkgeworCQkJbGRsbV9yZXNvdXJjZV91bmxpbmtfbG9jayhsb2NrKTsKKwkJCWxkbG1fbG9ja19kZWNyZWZfaW50ZXJuYWxfbm9sb2NrKGxvY2ssIG1vZGUpOworCQkJbGRsbV9sb2NrX2Rlc3Ryb3lfbm9sb2NrKGxvY2spOworCQl9CiAJCXVubG9ja19yZXNfYW5kX2xvY2sobG9jayk7CisJfSBlbHNlIHsKKwkJbGRsbV9sb2NrX2RlY3JlZl9pbnRlcm5hbChsb2NrLCBtb2RlKTsKIAl9CiB9CiAKQEAgLTQxOCwxMSArNDI4LDYgQEAKIAkqZmxhZ3MgPSBsZGxtX2ZsYWdzX2Zyb21fd2lyZShyZXBseS0+bG9ja19mbGFncyk7CiAJbG9jay0+bF9mbGFncyB8PSBsZGxtX2ZsYWdzX2Zyb21fd2lyZShyZXBseS0+bG9ja19mbGFncyAmCiAJCQkJCSAgICAgIExETE1fRkxfSU5IRVJJVF9NQVNLKTsKLQkvKiBtb3ZlIE5PX1RJTUVPVVQgZmxhZyB0byB0aGUgbG9jayB0byBmb3JjZSBsZGxtX2xvY2tfbWF0Y2goKQotCSAqIHRvIHdhaXQgd2l0aCBubyB0aW1lb3V0IGFzIHdlbGwKLQkgKi8KLQlsb2NrLT5sX2ZsYWdzIHw9IGxkbG1fZmxhZ3NfZnJvbV93aXJlKHJlcGx5LT5sb2NrX2ZsYWdzICYKLQkJCQkJICAgICAgTERMTV9GTF9OT19USU1FT1VUKTsKIAl1bmxvY2tfcmVzX2FuZF9sb2NrKGxvY2spOwogCiAJQ0RFQlVHKERfSU5GTywgImxvY2FsOiAlcCwgcmVtb3RlIGNvb2tpZTogJSNsbHgsIGZsYWdzOiAweCVsbHhcbiIsCkBAIC01NTYsNyArNTYxLDcgQEAKIAkJCQkJICAgICBlbnVtIHJlcV9sb2NhdGlvbiBsb2MsCiAJCQkJCSAgICAgaW50IG9mZikKIHsKLQlpbnQgc2l6ZSA9IHJlcV9jYXBzdWxlX21zZ19zaXplKHBpbGwsIGxvYyk7CisJdTMyIHNpemUgPSByZXFfY2Fwc3VsZV9tc2dfc2l6ZShwaWxsLCBsb2MpOwogCiAJcmV0dXJuIGxkbG1fcmVxX2hhbmRsZXNfYXZhaWwoc2l6ZSwgb2ZmKTsKIH0KQEAgLTU2NSw3ICs1NzAsNyBAQAogCQkJCQkgICAgY29uc3Qgc3RydWN0IHJlcV9mb3JtYXQgKmZtdCwKIAkJCQkJICAgIGVudW0gcmVxX2xvY2F0aW9uIGxvYywgaW50IG9mZikKIHsKLQlpbnQgc2l6ZSA9IHJlcV9jYXBzdWxlX2ZtdF9zaXplKGltcC0+aW1wX21zZ19tYWdpYywgZm10LCBsb2MpOworCXUzMiBzaXplID0gcmVxX2NhcHN1bGVfZm10X3NpemUoaW1wLT5pbXBfbXNnX21hZ2ljLCBmbXQsIGxvYyk7CiAKIAlyZXR1cm4gbGRsbV9yZXFfaGFuZGxlc19hdmFpbChzaXplLCBvZmYpOwogfQpAQCAtNjk2LDggKzcwMSw4IEBACiAJCWxvY2sgPSBsZGxtX2xvY2tfY3JlYXRlKG5zLCByZXNfaWQsIGVpbmZvLT5laV90eXBlLAogCQkJCQllaW5mby0+ZWlfbW9kZSwgJmNicywgZWluZm8tPmVpX2NiZGF0YSwKIAkJCQkJbHZiX2xlbiwgbHZiX3R5cGUpOwotCQlpZiAoIWxvY2spCi0JCQlyZXR1cm4gLUVOT01FTTsKKwkJaWYgKElTX0VSUihsb2NrKSkKKwkJCXJldHVybiBQVFJfRVJSKGxvY2spOwogCQkvKiBmb3IgdGhlIGxvY2FsIGxvY2ssIGFkZCB0aGUgcmVmZXJlbmNlICovCiAJCWxkbG1fbG9ja19hZGRyZWZfaW50ZXJuYWwobG9jaywgZWluZm8tPmVpX21vZGUpOwogCQlsZGxtX2xvY2syaGFuZGxlKGxvY2ssIGxvY2toKTsKQEAgLTcxOSw2ICs3MjQsNyBAQAogCWxvY2stPmxfZXhwb3J0ID0gTlVMTDsKIAlsb2NrLT5sX2Jsb2NraW5nX2FzdCA9IGVpbmZvLT5laV9jYl9ibDsKIAlsb2NrLT5sX2ZsYWdzIHw9ICgqZmxhZ3MgJiAoTERMTV9GTF9OT19MUlUgfCBMRExNX0ZMX0VYQ0wpKTsKKwlsb2NrLT5sX2xhc3RfYWN0aXZpdHkgPSBrdGltZV9nZXRfcmVhbF9zZWNvbmRzKCk7CiAKIAkvKiBsb2NrIG5vdCBzZW50IHRvIHNlcnZlciB5ZXQgKi8KIApAQCAtODE5LDcgKzgyNSw3IEBACiAJCWxvY2tfcmVzX2FuZF9sb2NrKGxvY2spOwogCQlsZGxtX3NldF9jYnBlbmRpbmcobG9jayk7CiAJCWxvY2FsX29ubHkgPSAhIShsb2NrLT5sX2ZsYWdzICYKLQkJCQkoTERMTV9GTF9MT0NBTF9PTkxZfExETE1fRkxfQ0FOQ0VMX09OX0JMT0NLKSk7CisJCQkJKExETE1fRkxfTE9DQUxfT05MWSB8IExETE1fRkxfQ0FOQ0VMX09OX0JMT0NLKSk7CiAJCWxkbG1fY2FuY2VsX2NhbGxiYWNrKGxvY2spOwogCQlyYyA9IGxkbG1faXNfYmxfYXN0KGxvY2spID8gTERMTV9GTF9CTF9BU1QgOiBMRExNX0ZMX0NBTkNFTElORzsKIAkJdW5sb2NrX3Jlc19hbmRfbG9jayhsb2NrKTsKQEAgLTExODAsOCArMTE4Niw3IEBACiAKIAlzbHYgPSBsZGxtX3Bvb2xfZ2V0X3NsdihwbCk7CiAJbHZmID0gbGRsbV9wb29sX2dldF9sdmYocGwpOwotCWxhID0gY2ZzX2R1cmF0aW9uX3NlYyhjZnNfdGltZV9zdWIoY3VyLAotCQkJICAgICAgbG9jay0+bF9sYXN0X3VzZWQpKTsKKwlsYSA9IGNmc19kdXJhdGlvbl9zZWMoY2ZzX3RpbWVfc3ViKGN1ciwgbG9jay0+bF9sYXN0X3VzZWQpKTsKIAlsdiA9IGx2ZiAqIGxhICogdW51c2VkOwogCiAJLyogSW5mb3JtIHBvb2wgYWJvdXQgY3VycmVudCBDTFYgdG8gc2VlIGl0IHZpYSBkZWJ1Z2ZzLiAqLwpAQCAtMTE5Myw5ICsxMTk4LDYgQEAKIAlpZiAoc2x2ID09IDAgfHwgbHYgPCBzbHYpCiAJCXJldHVybiBMRExNX1BPTElDWV9LRUVQX0xPQ0s7CiAKLQlpZiAobnMtPm5zX2NhbmNlbCAmJiBucy0+bnNfY2FuY2VsKGxvY2spID09IDApCi0JCXJldHVybiBMRExNX1BPTElDWV9LRUVQX0xPQ0s7Ci0KIAlyZXR1cm4gTERMTV9QT0xJQ1lfQ0FOQ0VMX0xPQ0s7CiB9CiAKQEAgLTEyMzksOSArMTI0MSw2IEBACiAJCQljZnNfdGltZV9hZGQobG9jay0+bF9sYXN0X3VzZWQsIG5zLT5uc19tYXhfYWdlKSkpCiAJCXJldHVybiBMRExNX1BPTElDWV9LRUVQX0xPQ0s7CiAKLQlpZiAobnMtPm5zX2NhbmNlbCAmJiBucy0+bnNfY2FuY2VsKGxvY2spID09IDApCi0JCXJldHVybiBMRExNX1BPTElDWV9LRUVQX0xPQ0s7Ci0KIAlyZXR1cm4gTERMTV9QT0xJQ1lfQ0FOQ0VMX0xPQ0s7CiB9CiAKQEAgLTEzNzQsNyArMTM3Myw3IEBACiAJCQlicmVhazsKIAogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobG9jaywgbmV4dCwgJm5zLT5uc191bnVzZWRfbGlzdCwKLQkJCQkJICAgICBsX2xydSkgeworCQkJCQkgbF9scnUpIHsKIAkJCS8qIE5vIGxvY2tzIHdoaWNoIGdvdCBibG9ja2luZyByZXF1ZXN0cy4gKi8KIAkJCUxBU1NFUlQoIWxkbG1faXNfYmxfYXN0KGxvY2spKTsKIApAQCAtMTQxMyw3ICsxNDEyLDggQEAKIAkJICogVGhhdCBpcywgZm9yIHNocmlua2VyIHBvbGljeSB3ZSBkcm9wIG9ubHkKIAkJICogb2xkIGxvY2tzLCBidXQgYWRkaXRpb25hbGx5IGNob29zZSB0aGVtIGJ5CiAJCSAqIHRoZWlyIHdlaWdodC4gQmlnIGV4dGVudCBsb2NrcyB3aWxsIHN0YXkgaW4KLQkJICogdGhlIGNhY2hlLiAqLworCQkgKiB0aGUgY2FjaGUuCisJCSAqLwogCQlyZXN1bHQgPSBwZihucywgbG9jaywgdW51c2VkLCBhZGRlZCwgY291bnQpOwogCQlpZiAocmVzdWx0ID09IExETE1fUE9MSUNZX0tFRVBfTE9DSykgewogCQkJbHVfcmVmX2RlbCgmbG9jay0+bF9yZWZlcmVuY2UsCkBAIC0xNjEwLDggKzE2MTAsNyBAQAogCSAqLwogCXdoaWxlIChjb3VudCA+IDApIHsKIAkJTEFTU0VSVCghbGlzdF9lbXB0eShjYW5jZWxzKSk7Ci0JCWxvY2sgPSBsaXN0X2VudHJ5KGNhbmNlbHMtPm5leHQsIHN0cnVjdCBsZGxtX2xvY2ssCi0JCQkJICAgICAgbF9ibF9hc3QpOworCQlsb2NrID0gbGlzdF9lbnRyeShjYW5jZWxzLT5uZXh0LCBzdHJ1Y3QgbGRsbV9sb2NrLCBsX2JsX2FzdCk7CiAJCUxBU1NFUlQobG9jay0+bF9jb25uX2V4cG9ydCk7CiAKIAkJaWYgKGV4cF9jb25uZWN0X2NhbmNlbHNldChsb2NrLT5sX2Nvbm5fZXhwb3J0KSkgewpAQCAtMTY2MCw3ICsxNjU5LDcgQEAKIAlpbnQgcmM7CiAKIAlyZXMgPSBsZGxtX3Jlc291cmNlX2dldChucywgTlVMTCwgcmVzX2lkLCAwLCAwKTsKLQlpZiAoIXJlcykgeworCWlmIChJU19FUlIocmVzKSkgewogCQkvKiBUaGlzIGlzIG5vdCBhIHByb2JsZW0uICovCiAJCUNERUJVRyhEX0lORk8sICJObyByZXNvdXJjZSAlbGx1XG4iLCByZXNfaWQtPm5hbWVbMF0pOwogCQlyZXR1cm4gMDsKQEAgLTE3MDQsNyArMTcwMyw4IEBACiAgKiB0aGF0IGhhdmUgMCByZWFkZXJzL3dyaXRlcnMuCiAgKgogICogSWYgZmxhZ3MgJiBMQ0ZfTE9DQUwsIHRocm93IHRoZSBsb2NrcyBhd2F5IHdpdGhvdXQgdHJ5aW5nCi0gKiB0byBub3RpZnkgdGhlIHNlcnZlci4gKi8KKyAqIHRvIG5vdGlmeSB0aGUgc2VydmVyLgorICovCiBpbnQgbGRsbV9jbGlfY2FuY2VsX3VudXNlZChzdHJ1Y3QgbGRsbV9uYW1lc3BhY2UgKm5zLAogCQkJICAgY29uc3Qgc3RydWN0IGxkbG1fcmVzX2lkICpyZXNfaWQsCiAJCQkgICBlbnVtIGxkbG1fY2FuY2VsX2ZsYWdzIGZsYWdzLCB2b2lkICpvcGFxdWUpCkBAIC0xODExLDEzICsxODExLDEwIEBACiAJc3RydWN0IGxkbG1fcmVzb3VyY2UgKnJlczsKIAlpbnQgcmM7CiAKLQlpZiAoIW5zKSB7Ci0JCUNFUlJPUigibXVzdCBwYXNzIGluIG5hbWVzcGFjZVxuIik7Ci0JCUxCVUcoKTsKLQl9CisJTEFTU0VSVEYobnMsICJtdXN0IHBhc3MgaW4gbmFtZXNwYWNlXG4iKTsKIAogCXJlcyA9IGxkbG1fcmVzb3VyY2VfZ2V0KG5zLCBOVUxMLCByZXNfaWQsIDAsIDApOwotCWlmICghcmVzKQorCWlmIChJU19FUlIocmVzKSkKIAkJcmV0dXJuIDA7CiAKIAlMRExNX1JFU09VUkNFX0FERFJFRihyZXMpOwpAQCAtMTg0Myw3ICsxODQwLDcgQEAKIAkgKiBidWcgMTc2MTQ6IGxvY2tzIGJlaW5nIGFjdGl2ZWx5IGNhbmNlbGxlZC4gR2V0IGEgcmVmZXJlbmNlCiAJICogb24gYSBsb2NrIHNvIHRoYXQgaXQgZG9lcyBub3QgZGlzYXBwZWFyIHVuZGVyIHVzIChlLmcuIGR1ZSB0byBjYW5jZWwpCiAJICovCi0JaWYgKCEobG9jay0+bF9mbGFncyAmIChMRExNX0ZMX0ZBSUxFRHxMRExNX0ZMX0NBTkNFTElORykpKSB7CisJaWYgKCEobG9jay0+bF9mbGFncyAmIChMRExNX0ZMX0ZBSUxFRCB8IExETE1fRkxfQ0FOQ0VMSU5HKSkpIHsKIAkJbGlzdF9hZGQoJmxvY2stPmxfcGVuZGluZ19jaGFpbiwgbGlzdCk7CiAJCUxETE1fTE9DS19HRVQobG9jayk7CiAJfQpAQCAtMjAxMyw3ICsyMDEwLDcgQEAKIAkJCQkJIExDRl9MT0NBTCwgTERMTV9DQU5DRUxfTk9fV0FJVCk7CiAKIAlDREVCVUcoRF9ETE1UUkFDRSwgIkNhbmNlbGVkICVkIHVudXNlZCBsb2NrcyBmcm9tIG5hbWVzcGFjZSAlc1xuIiwKLQkJCSAgIGNhbmNlbGVkLCBsZGxtX25zX25hbWUobnMpKTsKKwkgICAgICAgY2FuY2VsZWQsIGxkbG1fbnNfbmFtZShucykpOwogfQogCiBpbnQgbGRsbV9yZXBsYXlfbG9ja3Moc3RydWN0IG9iZF9pbXBvcnQgKmltcCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9yZXNvdXJjZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX3Jlc291cmNlLmMKaW5kZXggNTFhMjhkOS4uYTA5YzI1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX3Jlc291cmNlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX3Jlc291cmNlLmMKQEAgLTQ0OSw4ICs0NDksOCBAQAogCQkJCSAgY29uc3Qgdm9pZCAqa2V5LCB1bnNpZ25lZCBtYXNrKQogewogCWNvbnN0IHN0cnVjdCBsZGxtX3Jlc19pZCAgICAgKmlkICA9IGtleTsKLQl1bnNpZ25lZAkJdmFsID0gMDsKLQl1bnNpZ25lZAkJaTsKKwl1bnNpZ25lZCBpbnQJCXZhbCA9IDA7CisJdW5zaWduZWQgaW50CQlpOwogCiAJZm9yIChpID0gMDsgaSA8IFJFU19OQU1FX1NJWkU7IGkrKykKIAkJdmFsICs9IGlkLT5uYW1lW2ldOwpAQCAtNTYxLDkgKzU2MSw5IEBACiBzdHJ1Y3QgbGRsbV9uc19oYXNoX2RlZiB7CiAJZW51bSBsZGxtX25zX3R5cGUgbnNkX3R5cGU7CiAJLyoqIGhhc2ggYnVja2V0IGJpdHMgKi8KLQl1bnNpZ25lZAluc2RfYmt0X2JpdHM7CisJdW5zaWduZWQgaW50CW5zZF9ia3RfYml0czsKIAkvKiogaGFzaCBiaXRzICovCi0JdW5zaWduZWQJbnNkX2FsbF9iaXRzOworCXVuc2lnbmVkIGludAluc2RfYWxsX2JpdHM7CiAJLyoqIGhhc2ggb3BlcmF0aW9ucyAqLwogCXN0cnVjdCBjZnNfaGFzaF9vcHMgKm5zZF9ob3BzOwogfTsKQEAgLTc1OCw4ICs3NTgsNyBAQAogCQkgKi8KIAkJbG9ja19yZXMocmVzKTsKIAkJbGlzdF9mb3JfZWFjaCh0bXAsIHEpIHsKLQkJCWxvY2sgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGxkbG1fbG9jaywKLQkJCQkJICAgICAgbF9yZXNfbGluayk7CisJCQlsb2NrID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBsZGxtX2xvY2ssIGxfcmVzX2xpbmspOwogCQkJaWYgKGxkbG1faXNfY2xlYW5lZChsb2NrKSkgewogCQkJCWxvY2sgPSBOVUxMOwogCQkJCWNvbnRpbnVlOwpAQCAtNzkzLDggKzc5MiwxNCBAQAogCQkJICovCiAJCQl1bmxvY2tfcmVzKHJlcyk7CiAJCQlMRExNX0RFQlVHKGxvY2ssICJzZXR0aW5nIEZMX0xPQ0FMX09OTFkiKTsKKwkJCWlmIChsb2NrLT5sX2ZsYWdzICYgTERMTV9GTF9GQUlMX0xPQykgeworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCQlzY2hlZHVsZV90aW1lb3V0KGNmc190aW1lX3NlY29uZHMoNCkpOworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCQl9CiAJCQlpZiAobG9jay0+bF9jb21wbGV0aW9uX2FzdCkKLQkJCQlsb2NrLT5sX2NvbXBsZXRpb25fYXN0KGxvY2ssIDAsIE5VTEwpOworCQkJCWxvY2stPmxfY29tcGxldGlvbl9hc3QobG9jaywgTERMTV9GTF9GQUlMRUQsCisJCQkJCQkgICAgICAgTlVMTCk7CiAJCQlMRExNX0xPQ0tfUkVMRUFTRShsb2NrKTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC04NzUsNyArODgwLDggQEAKIAkJICAgICAgIGxkbG1fbnNfbmFtZShucyksIGF0b21pY19yZWFkKCZucy0+bnNfYnJlZikpOwogZm9yY2Vfd2FpdDoKIAkJaWYgKGZvcmNlKQotCQkJbHdpID0gTFdJX1RJTUVPVVQob2JkX3RpbWVvdXQgKiBIWiAvIDQsIE5VTEwsIE5VTEwpOworCQkJbHdpID0gTFdJX1RJTUVPVVQobXNlY3NfdG9famlmZmllcyhvYmRfdGltZW91dCAqCisJCQkJCSAgTVNFQ19QRVJfU0VDKSAvIDQsIE5VTEwsIE5VTEwpOwogCiAJCXJjID0gbF93YWl0X2V2ZW50KG5zLT5uc193YWl0cSwKIAkJCQkgIGF0b21pY19yZWFkKCZucy0+bnNfYnJlZikgPT0gMCwgJmx3aSk7CkBAIC0xMDgyLDEwICsxMDg4LDExIEBACiAJCSAgaW50IGNyZWF0ZSkKIHsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAgICAgKmhub2RlOwotCXN0cnVjdCBsZGxtX3Jlc291cmNlICpyZXM7CisJc3RydWN0IGxkbG1fcmVzb3VyY2UgKnJlcyA9IE5VTEw7CiAJc3RydWN0IGNmc19oYXNoX2JkCSBiZDsKIAlfX3U2NAkJIHZlcnNpb247CiAJaW50CQkgICAgICBuc19yZWZjb3VudCA9IDA7CisJaW50IHJjOwogCiAJTEFTU0VSVCghcGFyZW50KTsKIAlMQVNTRVJUKG5zLT5uc19yc19oYXNoKTsKQEAgLTEwOTUsMzEgKzExMDIsMjAgQEAKIAlobm9kZSA9IGNmc19oYXNoX2JkX2xvb2t1cF9sb2NrZWQobnMtPm5zX3JzX2hhc2gsICZiZCwgKHZvaWQgKiluYW1lKTsKIAlpZiAoaG5vZGUpIHsKIAkJY2ZzX2hhc2hfYmRfdW5sb2NrKG5zLT5uc19yc19oYXNoLCAmYmQsIDApOwotCQlyZXMgPSBobGlzdF9lbnRyeShobm9kZSwgc3RydWN0IGxkbG1fcmVzb3VyY2UsIGxyX2hhc2gpOwotCQkvKiBTeW5jaHJvbml6ZSB3aXRoIHJlZ2FyZCB0byByZXNvdXJjZSBjcmVhdGlvbi4gKi8KLQkJaWYgKG5zLT5uc19sdmJvICYmIG5zLT5uc19sdmJvLT5sdmJvX2luaXQpIHsKLQkJCW11dGV4X2xvY2soJnJlcy0+bHJfbHZiX211dGV4KTsKLQkJCW11dGV4X3VubG9jaygmcmVzLT5scl9sdmJfbXV0ZXgpOwotCQl9Ci0KLQkJaWYgKHVubGlrZWx5KHJlcy0+bHJfbHZiX2xlbiA8IDApKSB7Ci0JCQlsZGxtX3Jlc291cmNlX3B1dHJlZihyZXMpOwotCQkJcmVzID0gTlVMTDsKLQkJfQotCQlyZXR1cm4gcmVzOworCQlnb3RvIGx2Ym9faW5pdDsKIAl9CiAKIAl2ZXJzaW9uID0gY2ZzX2hhc2hfYmRfdmVyc2lvbl9nZXQoJmJkKTsKIAljZnNfaGFzaF9iZF91bmxvY2sobnMtPm5zX3JzX2hhc2gsICZiZCwgMCk7CiAKIAlpZiAoY3JlYXRlID09IDApCi0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKIAogCUxBU1NFUlRGKHR5cGUgPj0gTERMTV9NSU5fVFlQRSAmJiB0eXBlIDwgTERMTV9NQVhfVFlQRSwKIAkJICJ0eXBlOiAlZFxuIiwgdHlwZSk7CiAJcmVzID0gbGRsbV9yZXNvdXJjZV9uZXcoKTsKIAlpZiAoIXJlcykKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJcmVzLT5scl9uc19idWNrZXQgID0gY2ZzX2hhc2hfYmRfZXh0cmFfZ2V0KG5zLT5uc19yc19oYXNoLCAmYmQpOwogCXJlcy0+bHJfbmFtZSAgICAgICA9ICpuYW1lOwpAQCAtMTEzNyw3ICsxMTMzLDcgQEAKIAkJLyogV2UgaGF2ZSB0YWtlbiBscl9sdmJfbXV0ZXguIERyb3AgaXQuICovCiAJCW11dGV4X3VubG9jaygmcmVzLT5scl9sdmJfbXV0ZXgpOwogCQlrbWVtX2NhY2hlX2ZyZWUobGRsbV9yZXNvdXJjZV9zbGFiLCByZXMpOwotCitsdmJvX2luaXQ6CiAJCXJlcyA9IGhsaXN0X2VudHJ5KGhub2RlLCBzdHJ1Y3QgbGRsbV9yZXNvdXJjZSwgbHJfaGFzaCk7CiAJCS8qIFN5bmNocm9uaXplIHdpdGggcmVnYXJkIHRvIHJlc291cmNlIGNyZWF0aW9uLiAqLwogCQlpZiAobnMtPm5zX2x2Ym8gJiYgbnMtPm5zX2x2Ym8tPmx2Ym9faW5pdCkgewpAQCAtMTE0Niw4ICsxMTQyLDkgQEAKIAkJfQogCiAJCWlmICh1bmxpa2VseShyZXMtPmxyX2x2Yl9sZW4gPCAwKSkgeworCQkJcmMgPSByZXMtPmxyX2x2Yl9sZW47CiAJCQlsZGxtX3Jlc291cmNlX3B1dHJlZihyZXMpOwotCQkJcmVzID0gTlVMTDsKKwkJCXJlcyA9IEVSUl9QVFIocmMpOwogCQl9CiAJCXJldHVybiByZXM7CiAJfQpAQCAtMTE1OCw4ICsxMTU1LDYgQEAKIAogCWNmc19oYXNoX2JkX3VubG9jayhucy0+bnNfcnNfaGFzaCwgJmJkLCAxKTsKIAlpZiAobnMtPm5zX2x2Ym8gJiYgbnMtPm5zX2x2Ym8tPmx2Ym9faW5pdCkgewotCQlpbnQgcmM7Ci0KIAkJT0JEX0ZBSUxfVElNRU9VVChPQkRfRkFJTF9MRExNX0NSRUFURV9SRVNPVVJDRSwgMik7CiAJCXJjID0gbnMtPm5zX2x2Ym8tPmx2Ym9faW5pdChyZXMpOwogCQlpZiAocmMgPCAwKSB7CkBAIC0xMTY5LDcgKzExNjQsNyBAQAogCQkJcmVzLT5scl9sdmJfbGVuID0gcmM7CiAJCQltdXRleF91bmxvY2soJnJlcy0+bHJfbHZiX211dGV4KTsKIAkJCWxkbG1fcmVzb3VyY2VfcHV0cmVmKHJlcyk7Ci0JCQlyZXR1cm4gTlVMTDsKKwkJCXJldHVybiBFUlJfUFRSKHJjKTsKIAkJfQogCX0KIApAQCAtMTM4Niw3ICsxMzgxLDcgQEAKIAlpZiAoIWxpc3RfZW1wdHkoJnJlcy0+bHJfZ3JhbnRlZCkpIHsKIAkJQ0RFQlVHKGxldmVsLCAiR3JhbnRlZCBsb2NrcyAoaW4gcmV2ZXJzZSBvcmRlcik6XG4iKTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGxvY2ssICZyZXMtPmxyX2dyYW50ZWQsCi0JCQkJCQlsX3Jlc19saW5rKSB7CisJCQkJCSAgICBsX3Jlc19saW5rKSB7CiAJCQlMRExNX0RFQlVHX0xJTUlUKGxldmVsLCBsb2NrLCAiIyMjIik7CiAJCQlpZiAoIShsZXZlbCAmIERfQ0FOVE1BU0spICYmCiAJCQkgICAgKytncmFudGVkID4gbGRsbV9kdW1wX2dyYW50ZWRfbWF4KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL01ha2VmaWxlCmluZGV4IDJjYmIxYjguLjFhYzA5NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL01ha2VmaWxlCkBAIC0xLDYgKzEsNiBAQAogb2JqLSQoQ09ORklHX0xVU1RSRV9GUykgKz0gbHVzdHJlLm8KIGx1c3RyZS15IDo9IGRjYWNoZS5vIGRpci5vIGZpbGUubyBsbGl0ZV9jbG9zZS5vIGxsaXRlX2xpYi5vIGxsaXRlX25mcy5vIFwKLQkgICAgcncubyBuYW1laS5vIHN5bWxpbmsubyBsbGl0ZV9tbWFwLm8gXAorCSAgICBydy5vIG5hbWVpLm8gc3ltbGluay5vIGxsaXRlX21tYXAubyByYW5nZV9sb2NrLm8gXAogCSAgICB4YXR0ci5vIHhhdHRyX2NhY2hlLm8gcncyNi5vIHN1cGVyMjUubyBzdGF0YWhlYWQubyBcCiAJICAgIGdsaW1wc2UubyBsY29tbW9uX2NsLm8gbGNvbW1vbl9taXNjLm8gXAogCSAgICB2dnBfZGV2Lm8gdnZwX3BhZ2UubyB2dnBfbG9jay5vIHZ2cF9pby5vIHZ2cF9vYmplY3QubyB2dnBfcmVxLm8gXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZGNhY2hlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9kY2FjaGUuYwppbmRleCA0NjNiMWEzLi4wZTQ1ZDhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9kY2FjaGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9kY2FjaGUuYwpAQCAtMzcsNyArMzcsNiBAQAogI2RlZmluZSBERUJVR19TVUJTWVNURU0gU19MTElURQogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmRfc3VwcG9ydC5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfaWRsLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfZGxtLmgiCiAKQEAgLTEwMiwzOSArMTAxLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcmV0dXJuX2lmX2VxdWFsKHN0cnVjdCBsZGxtX2xvY2sgKmxvY2ssIHZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuIChsZGxtX2lzX2NhbmNlbGluZyhsb2NrKSAmJiBsZGxtX2lzX2Rpc2NhcmRfZGF0YShsb2NrKSkgPwotCQlMRExNX0lURVJfQ09OVElOVUUgOiBMRExNX0lURVJfU1RPUDsKLX0KLQotLyogZmluZCBhbnkgbGRsbSBsb2NrIG9mIHRoZSBpbm9kZSBpbiBtZGMgYW5kIGxvdgotICogcmV0dXJuIDAgICAgbm90IGZpbmQKLSAqCTEgICAgZmluZCBvbmUKLSAqICAgICAgPCAwICAgIGVycm9yCi0gKi8KLXN0YXRpYyBpbnQgZmluZF9jYmRhdGEoc3RydWN0IGlub2RlICppbm9kZSkKLXsKLQlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfaTJzYmkoaW5vZGUpOwotCXN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc207Ci0JaW50IHJjID0gMDsKLQotCUxBU1NFUlQoaW5vZGUpOwotCXJjID0gbWRfZmluZF9jYmRhdGEoc2JpLT5sbF9tZF9leHAsIGxsX2lub2RlMmZpZChpbm9kZSksCi0JCQkgICAgcmV0dXJuX2lmX2VxdWFsLCBOVUxMKTsKLQlpZiAocmMgIT0gMCkKLQkJcmV0dXJuIHJjOwotCi0JbHNtID0gY2NjX2lub2RlX2xzbV9nZXQoaW5vZGUpOwotCWlmICghbHNtKQotCQlyZXR1cm4gcmM7Ci0KLQlyYyA9IG9iZF9maW5kX2NiZGF0YShzYmktPmxsX2R0X2V4cCwgbHNtLCByZXR1cm5faWZfZXF1YWwsIE5VTEwpOwotCWNjY19pbm9kZV9sc21fcHV0KGlub2RlLCBsc20pOwotCi0JcmV0dXJuIHJjOwotfQotCiAvKioKICAqIENhbGxlZCB3aGVuIGxhc3QgcmVmZXJlbmNlIHRvIGEgZGVudHJ5IGlzIGRyb3BwZWQgYW5kIGRjYWNoZSB3YW50cyB0byBrbm93CiAgKiB3aGV0aGVyIG9yIG5vdCBpdCBzaG91bGQgY2FjaGUgaXQ6CkBAIC0xNTUsMTkgKzEyMSw2IEBACiAJLyoga2VybmVsID49IDIuNi4zOCBsYXN0IHJlZmNvdW50IGlzIGRlY3JlYXNlZCBhZnRlciB0aGlzIGZ1bmN0aW9uLiAqLwogCUxBU1NFUlQoZF9jb3VudChkZSkgPT0gMSk7CiAKLQkvKiBEaXNhYmxlIHRoaXMgcGllY2Ugb2YgY29kZSB0ZW1wb3JhcmlseSBiZWNhdXNlIHRoaXMgaXMgY2FsbGVkCi0JICogaW5zaWRlIGRjYWNoZV9sb2NrIHNvIGl0J3Mgbm90IGFwcHJvcHJpYXRlIHRvIGRvIGxvdHMgb2Ygd29yawotCSAqIGhlcmUuIEFUVEVOVElPTjogQmVmb3JlIHRoaXMgcGllY2Ugb2YgY29kZSBlbmFibGluZywgTFUtMjQ4NyBtdXN0IGJlCi0JICogcmVzb2x2ZWQuCi0JICovCi0jaWYgMAotCS8qIGlmIG5vdCBsZGxtIGxvY2sgZm9yIHRoaXMgaW5vZGUsIHNldCBpX25saW5rIHRvIDAgc28gdGhhdAotCSAqIHRoaXMgaW5vZGUgY2FuIGJlIHJlY3ljbGVkIGxhdGVyIGI9MjA0MzMKLQkgKi8KLQlpZiAoZF9yZWFsbHlfaXNfcG9zaXRpdmUoZGUpICYmICFmaW5kX2NiZGF0YShkX2lub2RlKGRlKSkpCi0JCWNsZWFyX25saW5rKGRfaW5vZGUoZGUpKTsKLSNlbmRpZgotCiAJaWYgKGRfbHVzdHJlX2ludmFsaWQoKHN0cnVjdCBkZW50cnkgKilkZSkpCiAJCXJldHVybiAxOwogCXJldHVybiAwOwpAQCAtMzI1LDE0ICsyNzgsMTMgQEAKIAlpZiAobG9va3VwX2ZsYWdzICYgKExPT0tVUF9QQVJFTlQgfCBMT09LVVBfT1BFTiB8IExPT0tVUF9DUkVBVEUpKQogCQlyZXR1cm4gMTsKIAotCWlmIChkX25lZWRfc3RhdGFoZWFkKGRpciwgZGVudHJ5KSA8PSAwKQorCWlmICghZGVudHJ5X21heV9zdGF0YWhlYWQoZGlyLCBkZW50cnkpKQogCQlyZXR1cm4gMTsKIAogCWlmIChsb29rdXBfZmxhZ3MgJiBMT09LVVBfUkNVKQogCQlyZXR1cm4gLUVDSElMRDsKIAotCWRvX3N0YXRhaGVhZF9lbnRlcihkaXIsICZkZW50cnksICFkX2lub2RlKGRlbnRyeSkpOwotCWxsX3N0YXRhaGVhZF9tYXJrKGRpciwgZGVudHJ5KTsKKwlsbF9zdGF0YWhlYWQoZGlyLCAmZGVudHJ5LCAhZF9pbm9kZShkZW50cnkpKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMzQ3LDE4ICsyOTksOSBAQAogCXJldHVybiBsbF9yZXZhbGlkYXRlX2RlbnRyeShkZW50cnksIGZsYWdzKTsKIH0KIAotc3RhdGljIHZvaWQgbGxfZF9pcHV0KHN0cnVjdCBkZW50cnkgKmRlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCUxBU1NFUlQoaW5vZGUpOwotCWlmICghZmluZF9jYmRhdGEoaW5vZGUpKQotCQljbGVhcl9ubGluayhpbm9kZSk7Ci0JaXB1dChpbm9kZSk7Ci19Ci0KIGNvbnN0IHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBsbF9kX29wcyA9IHsKIAkuZF9yZXZhbGlkYXRlID0gbGxfcmV2YWxpZGF0ZV9uZCwKIAkuZF9yZWxlYXNlID0gbGxfcmVsZWFzZSwKIAkuZF9kZWxldGUgID0gbGxfZGRlbGV0ZSwKLQkuZF9pcHV0ICAgID0gbGxfZF9pcHV0LAogCS5kX2NvbXBhcmUgPSBsbF9kY29tcGFyZSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9kaXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2Rpci5jCmluZGV4IDViMzgxNzcuLjdmMzJhNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2Rpci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2Rpci5jCkBAIC00Niw5ICs0Niw4IEBACiAKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZF9zdXBwb3J0LmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmRfY2xhc3MuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfaW9jdGwuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saWIuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfaWRsLmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2RsbS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2ZpZC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2tlcm5lbGNvbW0uaCIKQEAgLTEzNCwxMTEgKzEzMywzNSBAQAogICogZm9yIHRoaXMgaW50ZWdyYXRlZCBwYWdlIHdpbGwgYmUgYWRqdXN0ZWQuIFNlZSBsbXZfYWRqdXN0X2RpcnBhZ2VzKCkuCiAgKgogICovCi0KLS8qIHJldHVybnMgdGhlIHBhZ2UgdW5sb2NrZWQsIGJ1dCB3aXRoIGEgcmVmZXJlbmNlICovCi1zdGF0aWMgaW50IGxsX2Rpcl9maWxsZXIodm9pZCAqX2hhc2gsIHN0cnVjdCBwYWdlICpwYWdlMCkKK3N0cnVjdCBwYWdlICpsbF9nZXRfZGlyX3BhZ2Uoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAorCQkJICAgICBfX3U2NCBvZmZzZXQpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UwLT5tYXBwaW5nLT5ob3N0OwotCWludCBoYXNoNjQgPSBsbF9pMnNiaShpbm9kZSktPmxsX2ZsYWdzICYgTExfU0JJXzY0QklUX0hBU0g7Ci0Jc3RydWN0IG9iZF9leHBvcnQgKmV4cCA9IGxsX2kyc2JpKGlub2RlKS0+bGxfbWRfZXhwOwotCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxdWVzdDsKLQlzdHJ1Y3QgbWR0X2JvZHkgKmJvZHk7Ci0Jc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGE7Ci0JX191NjQgaGFzaCA9ICooKF9fdTY0ICopX2hhc2gpOwotCXN0cnVjdCBwYWdlICoqcGFnZV9wb29sOworCXN0cnVjdCBtZF9jYWxsYmFjayBjYl9vcDsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlzdHJ1Y3QgbHVfZGlycGFnZSAqZHA7Ci0JaW50IG1heF9wYWdlcyA9IGxsX2kyc2JpKGlub2RlKS0+bGxfbWRfYnJ3X3NpemUgPj4gUEFHRV9TSElGVDsKLQlpbnQgbnJkcGdzID0gMDsgLyogbnVtYmVyIG9mIHBhZ2VzIHJlYWQgYWN0dWFsbHkgKi8KLQlpbnQgbnBhZ2VzOwotCWludCBpOwogCWludCByYzsKIAotCUNERUJVRyhEX1ZGU1RSQUNFLCAiVkZTIE9wOmlub2RlPSJERklEIiglcCkgaGFzaCAlbGx1XG4iLAotCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpLCBpbm9kZSwgaGFzaCk7CisJY2Jfb3AubWRfYmxvY2tpbmdfYXN0ID0gbGxfbWRfYmxvY2tpbmdfYXN0OworCXJjID0gbWRfcmVhZF9wYWdlKGxsX2kybWRleHAoZGlyKSwgb3BfZGF0YSwgJmNiX29wLCBvZmZzZXQsICZwYWdlKTsKKwlpZiAocmMpCisJCXJldHVybiBFUlJfUFRSKHJjKTsKIAotCUxBU1NFUlQobWF4X3BhZ2VzID4gMCAmJiBtYXhfcGFnZXMgPD0gTURfTUFYX0JSV19QQUdFUyk7Ci0KLQlvcF9kYXRhID0gbGxfcHJlcF9tZF9vcF9kYXRhKE5VTEwsIGlub2RlLCBOVUxMLCBOVUxMLCAwLCAwLAotCQkJCSAgICAgTFVTVFJFX09QQ19BTlksIE5VTEwpOwotCWlmIChJU19FUlIob3BfZGF0YSkpCi0JCXJldHVybiBQVFJfRVJSKG9wX2RhdGEpOwotCi0JcGFnZV9wb29sID0ga2NhbGxvYyhtYXhfcGFnZXMsIHNpemVvZihwYWdlKSwgR0ZQX05PRlMpOwotCWlmIChwYWdlX3Bvb2wpIHsKLQkJcGFnZV9wb29sWzBdID0gcGFnZTA7Ci0JfSBlbHNlIHsKLQkJcGFnZV9wb29sID0gJnBhZ2UwOwotCQltYXhfcGFnZXMgPSAxOwotCX0KLQlmb3IgKG5wYWdlcyA9IDE7IG5wYWdlcyA8IG1heF9wYWdlczsgbnBhZ2VzKyspIHsKLQkJcGFnZSA9IHBhZ2VfY2FjaGVfYWxsb2NfY29sZChpbm9kZS0+aV9tYXBwaW5nKTsKLQkJaWYgKCFwYWdlKQotCQkJYnJlYWs7Ci0JCXBhZ2VfcG9vbFtucGFnZXNdID0gcGFnZTsKLQl9Ci0KLQlvcF9kYXRhLT5vcF9ucGFnZXMgPSBucGFnZXM7Ci0Jb3BfZGF0YS0+b3Bfb2Zmc2V0ID0gaGFzaDsKLQlyYyA9IG1kX3JlYWRwYWdlKGV4cCwgb3BfZGF0YSwgcGFnZV9wb29sLCAmcmVxdWVzdCk7Ci0JbGxfZmluaXNoX21kX29wX2RhdGEob3BfZGF0YSk7Ci0JaWYgKHJjIDwgMCkgewotCQkvKiBwYWdlMCBpcyBzcGVjaWFsLCB3aGljaCB3YXMgYWRkZWQgaW50byBwYWdlIGNhY2hlIGVhcmx5ICovCi0JCWRlbGV0ZV9mcm9tX3BhZ2VfY2FjaGUocGFnZTApOwotCX0gZWxzZSBpZiAocmMgPT0gMCkgewotCQlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmcmVxdWVzdC0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7Ci0JCS8qIENoZWNrZWQgYnkgbWRjX3JlYWRwYWdlKCkgKi8KLQkJaWYgKGJvZHktPnZhbGlkICYgT0JEX01EX0ZMU0laRSkKLQkJCWlfc2l6ZV93cml0ZShpbm9kZSwgYm9keS0+c2l6ZSk7Ci0KLQkJbnJkcGdzID0gKHJlcXVlc3QtPnJxX2J1bGstPmJkX25vYl90cmFuc2ZlcnJlZCtQQUdFX1NJWkUtMSkKLQkJCSA+PiBQQUdFX1NISUZUOwotCQlTZXRQYWdlVXB0b2RhdGUocGFnZTApOwotCX0KLQl1bmxvY2tfcGFnZShwYWdlMCk7Ci0JcHRscnBjX3JlcV9maW5pc2hlZChyZXF1ZXN0KTsKLQotCUNERUJVRyhEX1ZGU1RSQUNFLCAicmVhZCAlZC8lZCBwYWdlc1xuIiwgbnJkcGdzLCBucGFnZXMpOwotCi0JZm9yIChpID0gMTsgaSA8IG5wYWdlczsgaSsrKSB7Ci0JCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCQlpbnQgcmV0OwotCi0JCXBhZ2UgPSBwYWdlX3Bvb2xbaV07Ci0KLQkJaWYgKHJjIDwgMCB8fCBpID49IG5yZHBncykgewotCQkJcHV0X3BhZ2UocGFnZSk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKLQotCQlkcCA9IGttYXAocGFnZSk7Ci0JCWhhc2ggPSBsZTY0X3RvX2NwdShkcC0+bGRwX2hhc2hfc3RhcnQpOwotCQlrdW5tYXAocGFnZSk7Ci0KLQkJb2Zmc2V0ID0gaGFzaF94X2luZGV4KGhhc2gsIGhhc2g2NCk7Ci0KLQkJcHJlZmV0Y2h3KCZwYWdlLT5mbGFncyk7Ci0JCXJldCA9IGFkZF90b19wYWdlX2NhY2hlX2xydShwYWdlLCBpbm9kZS0+aV9tYXBwaW5nLCBvZmZzZXQsCi0JCQkJCSAgICBHRlBfTk9GUyk7Ci0JCWlmIChyZXQgPT0gMCkgewotCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCX0gZWxzZSB7Ci0JCQlDREVCVUcoRF9WRlNUUkFDRSwgInBhZ2UgJWx1IGFkZCB0byBwYWdlIGNhY2hlIGZhaWxlZDogJWRcbiIsCi0JCQkgICAgICAgb2Zmc2V0LCByZXQpOwotCQl9Ci0JCXB1dF9wYWdlKHBhZ2UpOwotCX0KLQotCWlmIChwYWdlX3Bvb2wgIT0gJnBhZ2UwKQotCQlrZnJlZShwYWdlX3Bvb2wpOwotCXJldHVybiByYzsKKwlyZXR1cm4gcGFnZTsKIH0KIAotdm9pZCBsbF9yZWxlYXNlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCByZW1vdmUpCit2b2lkIGxsX3JlbGVhc2VfcGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgYm9vbCByZW1vdmUpCiB7CiAJa3VubWFwKHBhZ2UpOworCisJLyoKKwkgKiBBbHdheXMgcmVtb3ZlIHRoZSBwYWdlIGZvciBzdHJpcGVkIGRpciwgYmVjYXVzZSB0aGUgcGFnZSBpcworCSAqIGJ1aWx0IGZyb20gdGVtcG9yYXJpbHkgaW4gTE1WIGxheWVyCisJICovCisJaWYgKGlub2RlICYmIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYKKwkgICAgbGxfaTJpbmZvKGlub2RlKS0+bGxpX2xzbV9tZCkgeworCQlfX2ZyZWVfcGFnZShwYWdlKTsKKwkJcmV0dXJuOworCX0KKwogCWlmIChyZW1vdmUpIHsKIAkJbG9ja19wYWdlKHBhZ2UpOwogCQlpZiAobGlrZWx5KHBhZ2UtPm1hcHBpbmcpKQpAQCAtMjQ4LDIyNSArMTcxLDYgQEAKIAlwdXRfcGFnZShwYWdlKTsKIH0KIAotLyoKLSAqIEZpbmQsIGttYXAgYW5kIHJldHVybiBwYWdlIHRoYXQgY29udGFpbnMgZ2l2ZW4gaGFzaC4KLSAqLwotc3RhdGljIHN0cnVjdCBwYWdlICpsbF9kaXJfcGFnZV9sb2NhdGUoc3RydWN0IGlub2RlICpkaXIsIF9fdTY0ICpoYXNoLAotCQkJCSAgICAgICBfX3U2NCAqc3RhcnQsIF9fdTY0ICplbmQpCi17Ci0JaW50IGhhc2g2NCA9IGxsX2kyc2JpKGRpciktPmxsX2ZsYWdzICYgTExfU0JJXzY0QklUX0hBU0g7Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBkaXItPmlfbWFwcGluZzsKLQkvKgotCSAqIENvbXBsZW1lbnQgb2YgaGFzaCBpcyB1c2VkIGFzIGFuIGluZGV4IHNvIHRoYXQKLQkgKiByYWRpeF90cmVlX2dhbmdfbG9va3VwKCkgY2FuIGJlIHVzZWQgdG8gZmluZCBhIHBhZ2Ugd2l0aCBzdGFydGluZwotCSAqIGhhc2ggX3NtYWxsZXJfIHRoYW4gb25lIHdlIGFyZSBsb29raW5nIGZvci4KLQkgKi8KLQl1bnNpZ25lZCBsb25nIG9mZnNldCA9IGhhc2hfeF9pbmRleCgqaGFzaCwgaGFzaDY0KTsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlpbnQgZm91bmQ7Ci0KLQlzcGluX2xvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOwotCWZvdW5kID0gcmFkaXhfdHJlZV9nYW5nX2xvb2t1cCgmbWFwcGluZy0+cGFnZV90cmVlLAotCQkJCSAgICAgICAodm9pZCAqKikmcGFnZSwgb2Zmc2V0LCAxKTsKLQlpZiAoZm91bmQgPiAwICYmICFyYWRpeF90cmVlX2V4Y2VwdGlvbmFsX2VudHJ5KHBhZ2UpKSB7Ci0JCXN0cnVjdCBsdV9kaXJwYWdlICpkcDsKLQotCQlnZXRfcGFnZShwYWdlKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOwotCQkvKgotCQkgKiBJbiBjb250cmFzdCB0byBmaW5kX2xvY2tfcGFnZSgpIHdlIGFyZSBzdXJlIHRoYXQgZGlyZWN0b3J5Ci0JCSAqIHBhZ2UgY2Fubm90IGJlIHRydW5jYXRlZCAod2hpbGUgRExNIGxvY2sgaXMgaGVsZCkgYW5kLAotCQkgKiBoZW5jZSwgY2FuIGF2b2lkIHJlc3RhcnQuCi0JCSAqCi0JCSAqIEluIGZhY3QsIHBhZ2UgY2Fubm90IGJlIGxvY2tlZCBoZXJlIGF0IGFsbCwgYmVjYXVzZQotCQkgKiBsbF9kaXJfZmlsbGVyKCkgZG9lcyBzeW5jaHJvbm91cyBpby4KLQkJICovCi0JCXdhaXRfb25fcGFnZV9sb2NrZWQocGFnZSk7Ci0JCWlmIChQYWdlVXB0b2RhdGUocGFnZSkpIHsKLQkJCWRwID0ga21hcChwYWdlKTsKLQkJCWlmIChCSVRTX1BFUl9MT05HID09IDMyICYmIGhhc2g2NCkgewotCQkJCSpzdGFydCA9IGxlNjRfdG9fY3B1KGRwLT5sZHBfaGFzaF9zdGFydCkgPj4gMzI7Ci0JCQkJKmVuZCAgID0gbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX2VuZCkgPj4gMzI7Ci0JCQkJKmhhc2ggID0gKmhhc2ggPj4gMzI7Ci0JCQl9IGVsc2UgewotCQkJCSpzdGFydCA9IGxlNjRfdG9fY3B1KGRwLT5sZHBfaGFzaF9zdGFydCk7Ci0JCQkJKmVuZCAgID0gbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX2VuZCk7Ci0JCQl9Ci0JCQlMQVNTRVJURigqc3RhcnQgPD0gKmhhc2gsICJzdGFydCA9ICUjbGx4LGVuZCA9ICUjbGx4LGhhc2ggPSAlI2xseFxuIiwKLQkJCQkgKnN0YXJ0LCAqZW5kLCAqaGFzaCk7Ci0JCQlDREVCVUcoRF9WRlNUUkFDRSwgInBhZ2UgJWx1IFslbGx1ICVsbHVdLCBoYXNoICVsbHVcbiIsCi0JCQkgICAgICAgb2Zmc2V0LCAqc3RhcnQsICplbmQsICpoYXNoKTsKLQkJCWlmICgqaGFzaCA+ICplbmQpIHsKLQkJCQlsbF9yZWxlYXNlX3BhZ2UocGFnZSwgMCk7Ci0JCQkJcGFnZSA9IE5VTEw7Ci0JCQl9IGVsc2UgaWYgKCplbmQgIT0gKnN0YXJ0ICYmICpoYXNoID09ICplbmQpIHsKLQkJCQkvKgotCQkJCSAqIHVwb24gaGFzaCBjb2xsaXNpb24sIHJlbW92ZSB0aGlzIHBhZ2UsCi0JCQkJICogb3RoZXJ3aXNlIHB1dCBwYWdlIHJlZmVyZW5jZSwgYW5kCi0JCQkJICogbGxfZ2V0X2Rpcl9wYWdlKCkgd2lsbCBpc3N1ZSBSUEMgdG8gZmV0Y2gKLQkJCQkgKiB0aGUgcGFnZSB3ZSB3YW50LgotCQkJCSAqLwotCQkJCWxsX3JlbGVhc2VfcGFnZShwYWdlLAotCQkJCSAgICBsZTMyX3RvX2NwdShkcC0+bGRwX2ZsYWdzKSAmIExERl9DT0xMSURFKTsKLQkJCQlwYWdlID0gTlVMTDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXB1dF9wYWdlKHBhZ2UpOwotCQkJcGFnZSA9IEVSUl9QVFIoLUVJTyk7Ci0JCX0KLQotCX0gZWxzZSB7Ci0JCXNwaW5fdW5sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKLQkJcGFnZSA9IE5VTEw7Ci0JfQotCXJldHVybiBwYWdlOwotfQotCi1zdHJ1Y3QgcGFnZSAqbGxfZ2V0X2Rpcl9wYWdlKHN0cnVjdCBpbm9kZSAqZGlyLCBfX3U2NCBoYXNoLAotCQkJICAgICBzdHJ1Y3QgbGxfZGlyX2NoYWluICpjaGFpbikKLXsKLQlsZGxtX3BvbGljeV9kYXRhX3QgcG9saWN5ID0gey5sX2lub2RlYml0cyA9IHtNRFNfSU5PREVMT0NLX1VQREFURX0gfTsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGRpci0+aV9tYXBwaW5nOwotCXN0cnVjdCBsdXN0cmVfaGFuZGxlIGxvY2toOwotCXN0cnVjdCBsdV9kaXJwYWdlICpkcDsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQllbnVtIGxkbG1fbW9kZSBtb2RlOwotCWludCByYzsKLQlfX3U2NCBzdGFydCA9IDA7Ci0JX191NjQgZW5kID0gMDsKLQlfX3U2NCBsaGFzaCA9IGhhc2g7Ci0Jc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhkaXIpOwotCWludCBoYXNoNjQgPSBsbF9pMnNiaShkaXIpLT5sbF9mbGFncyAmIExMX1NCSV82NEJJVF9IQVNIOwotCi0JbW9kZSA9IExDS19QUjsKLQlyYyA9IG1kX2xvY2tfbWF0Y2gobGxfaTJzYmkoZGlyKS0+bGxfbWRfZXhwLCBMRExNX0ZMX0JMT0NLX0dSQU5URUQsCi0JCQkgICBsbF9pbm9kZTJmaWQoZGlyKSwgTERMTV9JQklUUywgJnBvbGljeSwgbW9kZSwgJmxvY2toKTsKLQlpZiAoIXJjKSB7Ci0JCXN0cnVjdCBsZGxtX2VucXVldWVfaW5mbyBlaW5mbyA9IHsKLQkJCS5laV90eXBlID0gTERMTV9JQklUUywKLQkJCS5laV9tb2RlID0gbW9kZSwKLQkJCS5laV9jYl9ibCA9IGxsX21kX2Jsb2NraW5nX2FzdCwKLQkJCS5laV9jYl9jcCA9IGxkbG1fY29tcGxldGlvbl9hc3QsCi0JCX07Ci0JCXN0cnVjdCBsb29rdXBfaW50ZW50IGl0ID0geyAuaXRfb3AgPSBJVF9SRUFERElSIH07Ci0JCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxdWVzdDsKLQkJc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGE7Ci0KLQkJb3BfZGF0YSA9IGxsX3ByZXBfbWRfb3BfZGF0YShOVUxMLCBkaXIsIGRpciwgTlVMTCwgMCwgMCwKLQkJCQkJICAgICBMVVNUUkVfT1BDX0FOWSwgTlVMTCk7Ci0JCWlmIChJU19FUlIob3BfZGF0YSkpCi0JCQlyZXR1cm4gKHZvaWQgKilvcF9kYXRhOwotCi0JCXJjID0gbWRfZW5xdWV1ZShsbF9pMnNiaShkaXIpLT5sbF9tZF9leHAsICZlaW5mbywgJml0LAotCQkJCW9wX2RhdGEsICZsb2NraCwgTlVMTCwgMCwgTlVMTCwgMCk7Ci0KLQkJbGxfZmluaXNoX21kX29wX2RhdGEob3BfZGF0YSk7Ci0KLQkJcmVxdWVzdCA9IChzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKilpdC5pdF9yZXF1ZXN0OwotCQlpZiAocmVxdWVzdCkKLQkJCXB0bHJwY19yZXFfZmluaXNoZWQocmVxdWVzdCk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCUNFUlJPUigibG9jayBlbnF1ZXVlOiAiIERGSUQgIiBhdCAlbGx1OiByYyAlZFxuIiwKLQkJCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChkaXIpKSwgaGFzaCwgcmMpOwotCQkJcmV0dXJuIEVSUl9QVFIocmMpOwotCQl9Ci0KLQkJQ0RFQlVHKERfSU5PREUsICJzZXR0aW5nIGxyX2x2Yl9pbm9kZSB0byBpbm9kZSAiREZJRCIoJXApXG4iLAotCQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoZGlyKSksIGRpcik7Ci0JCW1kX3NldF9sb2NrX2RhdGEobGxfaTJzYmkoZGlyKS0+bGxfbWRfZXhwLAotCQkJCSAmaXQuaXRfbG9ja19oYW5kbGUsIGRpciwgTlVMTCk7Ci0JfSBlbHNlIHsKLQkJLyogZm9yIGNyb3NzLXJlZiBvYmplY3QsIGxfYXN0X2RhdGEgb2YgdGhlIGxvY2sgbWF5IG5vdCBiZSBzZXQsCi0JCSAqIHdlIHJlc2V0IGl0IGhlcmUKLQkJICovCi0JCW1kX3NldF9sb2NrX2RhdGEobGxfaTJzYmkoZGlyKS0+bGxfbWRfZXhwLCAmbG9ja2guY29va2llLAotCQkJCSBkaXIsIE5VTEwpOwotCX0KLQlsZGxtX2xvY2tfZHVtcF9oYW5kbGUoRF9PVEhFUiwgJmxvY2toKTsKLQotCW11dGV4X2xvY2soJmxsaS0+bGxpX3JlYWRkaXJfbXV0ZXgpOwotCXBhZ2UgPSBsbF9kaXJfcGFnZV9sb2NhdGUoZGlyLCAmbGhhc2gsICZzdGFydCwgJmVuZCk7Ci0JaWYgKElTX0VSUihwYWdlKSkgewotCQlDRVJST1IoImRpciBwYWdlIGxvY2F0ZTogIkRGSUQiIGF0ICVsbHU6IHJjICVsZFxuIiwKLQkJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGRpcikpLCBsaGFzaCwgUFRSX0VSUihwYWdlKSk7Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9IGVsc2UgaWYgKHBhZ2UpIHsKLQkJLyoKLQkJICogWFhYIG5pa2l0YTogbm90IGVudGlyZWx5IGNvcnJlY3QgaGFuZGxpbmcgb2YgYSBjb3JuZXIgY2FzZToKLQkJICogc3VwcG9zZSBoYXNoIGNoYWluIG9mIGVudHJpZXMgd2l0aCBoYXNoIHZhbHVlIEhBU0ggY3Jvc3NlcwotCQkgKiBib3JkZXIgYmV0d2VlbiBwYWdlcyBQMCBhbmQgUDEuIEZpcnN0IGJvdGggUDAgYW5kIFAxIGFyZQotCQkgKiBjYWNoZWQsIHNlZWtkaXIoKSBpcyBjYWxsZWQgZm9yIHNvbWUgZW50cnkgZnJvbSB0aGUgUDAgcGFydAotCQkgKiBvZiB0aGUgY2hhaW4uIExhdGVyIFAwIGdvZXMgb3V0IG9mIGNhY2hlLiB0ZWxsZGlyKEhBU0gpCi0JCSAqIGhhcHBlbnMgYW5kIGZpbmRzIFAxLCBhcyBpdCBzdGFydHMgd2l0aCBtYXRjaGluZyBoYXNoCi0JCSAqIHZhbHVlLiBSZW1haW5pbmcgZW50cmllcyBmcm9tIFAwIHBhcnQgb2YgdGhlIGNoYWluIGFyZQotCQkgKiBza2lwcGVkLiAoSXMgdGhhdCByZWFsbHkgYSBidWc/KQotCQkgKgotCQkgKiBQb3NzaWJsZSBzb2x1dGlvbnM6IDAuIGRvbid0IGNhY2hlIFAxIGlzIHN1Y2ggY2FzZSwgaGFuZGxlCi0JCSAqIGl0IGFzIGFuICJvdmVyZmxvdyIgcGFnZS4gMS4gaW52YWxpZGF0ZSBhbGwgcGFnZXMgYXQKLQkJICogb25jZS4gMi4gdXNlIEhBU0h8MSBhcyBhbiBpbmRleCBmb3IgUDEuCi0JCSAqLwotCQlnb3RvIGhhc2hfY29sbGlzaW9uOwotCX0KLQotCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgaGFzaF94X2luZGV4KGhhc2gsIGhhc2g2NCksCi0JCQkgICAgICAgbGxfZGlyX2ZpbGxlciwgJmxoYXNoKTsKLQlpZiAoSVNfRVJSKHBhZ2UpKSB7Ci0JCUNFUlJPUigicmVhZCBjYWNoZSBwYWdlOiAiREZJRCIgYXQgJWxsdTogcmMgJWxkXG4iLAotCQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoZGlyKSksIGhhc2gsIFBUUl9FUlIocGFnZSkpOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCi0Jd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKLQkodm9pZClrbWFwKHBhZ2UpOwotCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKSB7Ci0JCUNFUlJPUigicGFnZSBub3QgdXBkYXRlZDogIkRGSUQiIGF0ICVsbHU6IHJjICVkXG4iLAotCQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoZGlyKSksIGhhc2gsIC01KTsKLQkJZ290byBmYWlsOwotCX0KLQlpZiAoIVBhZ2VDaGVja2VkKHBhZ2UpKQotCQkvKiBYWFg6IGNoZWNrIHBhZ2UgZm9ybWF0IGxhdGVyICovCi0JCVNldFBhZ2VDaGVja2VkKHBhZ2UpOwotCWlmIChQYWdlRXJyb3IocGFnZSkpIHsKLQkJQ0VSUk9SKCJwYWdlIGVycm9yOiAiREZJRCIgYXQgJWxsdTogcmMgJWRcbiIsCi0JCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChkaXIpKSwgaGFzaCwgLTUpOwotCQlnb3RvIGZhaWw7Ci0JfQotaGFzaF9jb2xsaXNpb246Ci0JZHAgPSBwYWdlX2FkZHJlc3MocGFnZSk7Ci0JaWYgKEJJVFNfUEVSX0xPTkcgPT0gMzIgJiYgaGFzaDY0KSB7Ci0JCXN0YXJ0ID0gbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX3N0YXJ0KSA+PiAzMjsKLQkJZW5kICAgPSBsZTY0X3RvX2NwdShkcC0+bGRwX2hhc2hfZW5kKSA+PiAzMjsKLQkJbGhhc2ggPSBoYXNoID4+IDMyOwotCX0gZWxzZSB7Ci0JCXN0YXJ0ID0gbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX3N0YXJ0KTsKLQkJZW5kICAgPSBsZTY0X3RvX2NwdShkcC0+bGRwX2hhc2hfZW5kKTsKLQkJbGhhc2ggPSBoYXNoOwotCX0KLQlpZiAoZW5kID09IHN0YXJ0KSB7Ci0JCUxBU1NFUlQoc3RhcnQgPT0gbGhhc2gpOwotCQlDV0FSTigiUGFnZS13aWRlIGhhc2ggY29sbGlzaW9uOiAlbGx1XG4iLCBlbmQpOwotCQlpZiAoQklUU19QRVJfTE9ORyA9PSAzMiAmJiBoYXNoNjQpCi0JCQlDV0FSTigiUmVhbCBwYWdlLXdpZGUgaGFzaCBjb2xsaXNpb24gYXQgWyVsbHUgJWxsdV0gd2l0aCBoYXNoICVsbHVcbiIsCi0JCQkgICAgICBsZTY0X3RvX2NwdShkcC0+bGRwX2hhc2hfc3RhcnQpLAotCQkJICAgICAgbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX2VuZCksIGhhc2gpOwotCQkvKgotCQkgKiBGZXRjaCB3aG9sZSBvdmVyZmxvdyBjaGFpbi4uLgotCQkgKgotCQkgKiBYWFggbm90IHlldC4KLQkJICovCi0JCWdvdG8gZmFpbDsKLQl9Ci1vdXRfdW5sb2NrOgotCW11dGV4X3VubG9jaygmbGxpLT5sbGlfcmVhZGRpcl9tdXRleCk7Ci0JbGRsbV9sb2NrX2RlY3JlZigmbG9ja2gsIG1vZGUpOwotCXJldHVybiBwYWdlOwotCi1mYWlsOgotCWxsX3JlbGVhc2VfcGFnZShwYWdlLCAxKTsKLQlwYWdlID0gRVJSX1BUUigtRUlPKTsKLQlnb3RvIG91dF91bmxvY2s7Ci19Ci0KIC8qKgogICogcmV0dXJuIElGXyogdHlwZSBmb3IgZ2l2ZW4gbHVfZGlyZW50IGVudHJ5LgogICogSUZfKiBmbGFnIHNobGQgYmUgY29udmVydGVkIHRvIHBhcnRpY3VsYXIgT1MgZmlsZSB0eXBlIGluCkBAIC00ODksMTE5ICsxOTMsMTAwIEBACiAJcmV0dXJuIHR5cGU7CiB9CiAKLWludCBsbF9kaXJfcmVhZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eCkKK2ludCBsbF9kaXJfcmVhZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBfX3U2NCAqcHBvcywgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCisJCXN0cnVjdCBkaXJfY29udGV4dCAqY3R4KQogewotCXN0cnVjdCBsbF9pbm9kZV9pbmZvICppbmZvICAgICAgID0gbGxfaTJpbmZvKGlub2RlKTsKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAgICAqc2JpCT0gbGxfaTJzYmkoaW5vZGUpOwotCV9fdTY0CQkgICBwb3MJCT0gY3R4LT5wb3M7Ci0JaW50CQkgICBhcGkzMiAgICAgID0gbGxfbmVlZF8zMmJpdF9hcGkoc2JpKTsKLQlpbnQJCSAgIGhhc2g2NCAgICAgPSBzYmktPmxsX2ZsYWdzICYgTExfU0JJXzY0QklUX0hBU0g7CisJX191NjQJCSAgIHBvcwkJPSAqcHBvczsKKwlpbnQJCSAgIGlzX2FwaTMyID0gbGxfbmVlZF8zMmJpdF9hcGkoc2JpKTsKKwlpbnQJCSAgIGlzX2hhc2g2NCA9IHNiaS0+bGxfZmxhZ3MgJiBMTF9TQklfNjRCSVRfSEFTSDsKIAlzdHJ1Y3QgcGFnZQkgICpwYWdlOwotCXN0cnVjdCBsbF9kaXJfY2hhaW4gICBjaGFpbjsKLQlpbnQJCSAgIGRvbmUgPSAwOworCWJvb2wJCSAgIGRvbmUgPSBmYWxzZTsKIAlpbnQJCSAgIHJjID0gMDsKIAotCWxsX2Rpcl9jaGFpbl9pbml0KCZjaGFpbik7Ci0KLQlwYWdlID0gbGxfZ2V0X2Rpcl9wYWdlKGlub2RlLCBwb3MsICZjaGFpbik7CisJcGFnZSA9IGxsX2dldF9kaXJfcGFnZShpbm9kZSwgb3BfZGF0YSwgcG9zKTsKIAogCXdoaWxlIChyYyA9PSAwICYmICFkb25lKSB7CiAJCXN0cnVjdCBsdV9kaXJwYWdlICpkcDsKIAkJc3RydWN0IGx1X2RpcmVudCAgKmVudDsKKwkJX191NjQgaGFzaDsKKwkJX191NjQgbmV4dDsKIAotCQlpZiAoIUlTX0VSUihwYWdlKSkgewotCQkJLyoKLQkJCSAqIElmIHBhZ2UgaXMgZW1wdHkgKGVuZCBvZiBkaXJlY3RvcnkgaXMgcmVhY2hlZCksCi0JCQkgKiB1c2UgdGhpcyB2YWx1ZS4KLQkJCSAqLwotCQkJX191NjQgaGFzaCA9IE1EU19ESVJfRU5EX09GRjsKLQkJCV9fdTY0IG5leHQ7Ci0KLQkJCWRwID0gcGFnZV9hZGRyZXNzKHBhZ2UpOwotCQkJZm9yIChlbnQgPSBsdV9kaXJlbnRfc3RhcnQoZHApOyBlbnQgJiYgIWRvbmU7Ci0JCQkgICAgIGVudCA9IGx1X2RpcmVudF9uZXh0KGVudCkpIHsKLQkJCQlfX3UxNgkgIHR5cGU7Ci0JCQkJaW50CSAgICBuYW1lbGVuOwotCQkJCXN0cnVjdCBsdV9maWQgIGZpZDsKLQkJCQlfX3U2NAkgIGxoYXNoOwotCQkJCV9fdTY0CSAgaW5vOwotCi0JCQkJLyoKLQkJCQkgKiBYWFg6IGltcGxlbWVudCBjb3JyZWN0IHN3YWJiaW5nIGhlcmUuCi0JCQkJICovCi0KLQkJCQloYXNoID0gbGU2NF90b19jcHUoZW50LT5sZGVfaGFzaCk7Ci0JCQkJaWYgKGhhc2ggPCBwb3MpCi0JCQkJCS8qCi0JCQkJCSAqIFNraXAgdW50aWwgd2UgZmluZCB0YXJnZXQgaGFzaAotCQkJCQkgKiB2YWx1ZS4KLQkJCQkJICovCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJbmFtZWxlbiA9IGxlMTZfdG9fY3B1KGVudC0+bGRlX25hbWVsZW4pOwotCQkJCWlmIChuYW1lbGVuID09IDApCi0JCQkJCS8qCi0JCQkJCSAqIFNraXAgZHVtbXkgcmVjb3JkLgotCQkJCQkgKi8KLQkJCQkJY29udGludWU7Ci0KLQkJCQlpZiAoYXBpMzIgJiYgaGFzaDY0KQotCQkJCQlsaGFzaCA9IGhhc2ggPj4gMzI7Ci0JCQkJZWxzZQotCQkJCQlsaGFzaCA9IGhhc2g7Ci0JCQkJZmlkX2xlX3RvX2NwdSgmZmlkLCAmZW50LT5sZGVfZmlkKTsKLQkJCQlpbm8gPSBjbF9maWRfYnVpbGRfaW5vKCZmaWQsIGFwaTMyKTsKLQkJCQl0eXBlID0gbGxfZGlyZW50X3R5cGVfZ2V0KGVudCk7Ci0JCQkJY3R4LT5wb3MgPSBsaGFzaDsKLQkJCQkvKiBGb3IgJ2xsX25mc19nZXRfbmFtZV9maWxsZGlyKCknLCBpdCB3aWxsIHRyeQotCQkJCSAqIHRvIGFjY2VzcyB0aGUgJ2VudCcgdGhyb3VnaCBpdHMgJ2xkZV9uYW1lJywKLQkJCQkgKiBzbyB0aGUgcGFyYW1ldGVyICduYW1lJyBmb3IgJ2N0eC0+YWN0b3IoKScKLQkJCQkgKiBtdXN0IGJlIHBhcnQgb2YgdGhlICdlbnQnLgotCQkJCSAqLwotCQkJCWRvbmUgPSAhZGlyX2VtaXQoY3R4LCBlbnQtPmxkZV9uYW1lLAotCQkJCQkJIG5hbWVsZW4sIGlubywgdHlwZSk7Ci0JCQl9Ci0JCQluZXh0ID0gbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX2VuZCk7Ci0JCQlpZiAoIWRvbmUpIHsKLQkJCQlwb3MgPSBuZXh0OwotCQkJCWlmIChwb3MgPT0gTURTX0RJUl9FTkRfT0ZGKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIEVuZCBvZiBkaXJlY3RvcnkgcmVhY2hlZC4KLQkJCQkJICovCi0JCQkJCWRvbmUgPSAxOwotCQkJCQlsbF9yZWxlYXNlX3BhZ2UocGFnZSwgMCk7Ci0JCQkJfSBlbHNlIGlmICgxIC8qIGNoYWluIGlzIGV4aGF1c3RlZCovKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIE5vcm1hbCBjYXNlOiBjb250aW51ZSB0byB0aGUgbmV4dAotCQkJCQkgKiBwYWdlLgotCQkJCQkgKi8KLQkJCQkJbGxfcmVsZWFzZV9wYWdlKHBhZ2UsCi0JCQkJCSAgICBsZTMyX3RvX2NwdShkcC0+bGRwX2ZsYWdzKSAmCi0JCQkJCQkJTERGX0NPTExJREUpOwotCQkJCQluZXh0ID0gcG9zOwotCQkJCQlwYWdlID0gbGxfZ2V0X2Rpcl9wYWdlKGlub2RlLCBwb3MsCi0JCQkJCQkJICAgICAgICZjaGFpbik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyoKLQkJCQkJICogZ28gaW50byBvdmVyZmxvdyBwYWdlLgotCQkJCQkgKi8KLQkJCQkJTEFTU0VSVChsZTMyX3RvX2NwdShkcC0+bGRwX2ZsYWdzKSAmCi0JCQkJCQlMREZfQ09MTElERSk7Ci0JCQkJCWxsX3JlbGVhc2VfcGFnZShwYWdlLCAxKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXBvcyA9IGhhc2g7Ci0JCQkJbGxfcmVsZWFzZV9wYWdlKHBhZ2UsIDApOwotCQkJfQotCQl9IGVsc2UgeworCQlpZiAoSVNfRVJSKHBhZ2UpKSB7CiAJCQlyYyA9IFBUUl9FUlIocGFnZSk7Ci0JCQlDRVJST1IoImVycm9yIHJlYWRpbmcgZGlyICJERklEIiBhdCAlbHU6IHJjICVkXG4iLAotCQkJICAgICAgIFBGSUQoJmluZm8tPmxsaV9maWQpLCAodW5zaWduZWQgbG9uZylwb3MsIHJjKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaGFzaCA9IE1EU19ESVJfRU5EX09GRjsKKwkJZHAgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJCWZvciAoZW50ID0gbHVfZGlyZW50X3N0YXJ0KGRwKTsgZW50ICYmICFkb25lOworCQkgICAgIGVudCA9IGx1X2RpcmVudF9uZXh0KGVudCkpIHsKKwkJCV9fdTE2CSAgdHlwZTsKKwkJCWludAkgICAgbmFtZWxlbjsKKwkJCXN0cnVjdCBsdV9maWQgIGZpZDsKKwkJCV9fdTY0CSAgbGhhc2g7CisJCQlfX3U2NAkgIGlubzsKKworCQkJaGFzaCA9IGxlNjRfdG9fY3B1KGVudC0+bGRlX2hhc2gpOworCQkJaWYgKGhhc2ggPCBwb3MpCisJCQkJLyoKKwkJCQkgKiBTa2lwIHVudGlsIHdlIGZpbmQgdGFyZ2V0IGhhc2gKKwkJCQkgKiB2YWx1ZS4KKwkJCQkgKi8KKwkJCQljb250aW51ZTsKKworCQkJbmFtZWxlbiA9IGxlMTZfdG9fY3B1KGVudC0+bGRlX25hbWVsZW4pOworCQkJaWYgKG5hbWVsZW4gPT0gMCkKKwkJCQkvKgorCQkJCSAqIFNraXAgZHVtbXkgcmVjb3JkLgorCQkJCSAqLworCQkJCWNvbnRpbnVlOworCisJCQlpZiAoaXNfYXBpMzIgJiYgaXNfaGFzaDY0KQorCQkJCWxoYXNoID0gaGFzaCA+PiAzMjsKKwkJCWVsc2UKKwkJCQlsaGFzaCA9IGhhc2g7CisJCQlmaWRfbGVfdG9fY3B1KCZmaWQsICZlbnQtPmxkZV9maWQpOworCQkJaW5vID0gY2xfZmlkX2J1aWxkX2lubygmZmlkLCBpc19hcGkzMik7CisJCQl0eXBlID0gbGxfZGlyZW50X3R5cGVfZ2V0KGVudCk7CisJCQljdHgtPnBvcyA9IGxoYXNoOworCQkJLyogRm9yICdsbF9uZnNfZ2V0X25hbWVfZmlsbGRpcigpJywgaXQgd2lsbCB0cnkKKwkJCSAqIHRvIGFjY2VzcyB0aGUgJ2VudCcgdGhyb3VnaCBpdHMgJ2xkZV9uYW1lJywKKwkJCSAqIHNvIHRoZSBwYXJhbWV0ZXIgJ25hbWUnIGZvciAnY3R4LT5hY3RvcigpJworCQkJICogbXVzdCBiZSBwYXJ0IG9mIHRoZSAnZW50Jy4KKwkJCSAqLworCQkJZG9uZSA9ICFkaXJfZW1pdChjdHgsIGVudC0+bGRlX25hbWUsCisJCQkJCSBuYW1lbGVuLCBpbm8sIHR5cGUpOworCQl9CisKKwkJaWYgKGRvbmUpIHsKKwkJCXBvcyA9IGhhc2g7CisJCQlsbF9yZWxlYXNlX3BhZ2UoaW5vZGUsIHBhZ2UsIGZhbHNlKTsKKwkJCWJyZWFrOworCQl9CisKKwkJbmV4dCA9IGxlNjRfdG9fY3B1KGRwLT5sZHBfaGFzaF9lbmQpOworCQlwb3MgPSBuZXh0OworCQlpZiAocG9zID09IE1EU19ESVJfRU5EX09GRikgeworCQkJLyoKKwkJCSAqIEVuZCBvZiBkaXJlY3RvcnkgcmVhY2hlZC4KKwkJCSAqLworCQkJZG9uZSA9IDE7CisJCQlsbF9yZWxlYXNlX3BhZ2UoaW5vZGUsIHBhZ2UsIGZhbHNlKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBOb3JtYWwgY2FzZTogY29udGludWUgdG8gdGhlIG5leHQKKwkJCSAqIHBhZ2UuCisJCQkgKi8KKwkJCWxsX3JlbGVhc2VfcGFnZShpbm9kZSwgcGFnZSwKKwkJCQkJbGUzMl90b19jcHUoZHAtPmxkcF9mbGFncykgJgorCQkJCQlMREZfQ09MTElERSk7CisJCQluZXh0ID0gcG9zOworCQkJcGFnZSA9IGxsX2dldF9kaXJfcGFnZShpbm9kZSwgb3BfZGF0YSwgcG9zKTsKIAkJfQogCX0KIAogCWN0eC0+cG9zID0gcG9zOwotCWxsX2Rpcl9jaGFpbl9maW5pKCZjaGFpbik7CiAJcmV0dXJuIHJjOwogfQogCkBAIC02MTMsOSArMjk4LDEwIEBACiAJX191NjQgcG9zID0gbGZkID8gbGZkLT5sZmRfcG9zIDogMDsKIAlpbnQJCQloYXNoNjQJPSBzYmktPmxsX2ZsYWdzICYgTExfU0JJXzY0QklUX0hBU0g7CiAJaW50CQkJYXBpMzIJPSBsbF9uZWVkXzMyYml0X2FwaShzYmkpOworCXN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhOwogCWludAkJCXJjOwogCi0JQ0RFQlVHKERfVkZTVFJBQ0UsICJWRlMgT3A6aW5vZGU9IkRGSUQiKCVwKSBwb3MgJWx1LyVsbHUgMzJiaXRfYXBpICVkXG4iLAorCUNERUJVRyhEX1ZGU1RSQUNFLCAiVkZTIE9wOmlub2RlPSJERklEIiglcCkgcG9zL3NpemUgJWx1LyVsbHUgMzJiaXRfYXBpICVkXG4iLAogCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpLCBpbm9kZSwgKHVuc2lnbmVkIGxvbmcpcG9zLAogCSAgICAgICBpX3NpemVfcmVhZChpbm9kZSksIGFwaTMyKTsKIApAQCAtNjI3LDE5ICszMTMsNTggQEAKIAkJZ290byBvdXQ7CiAJfQogCisJb3BfZGF0YSA9IGxsX3ByZXBfbWRfb3BfZGF0YShOVUxMLCBpbm9kZSwgaW5vZGUsIE5VTEwsIDAsIDAsCisJCQkJICAgICBMVVNUUkVfT1BDX0FOWSwgaW5vZGUpOworCWlmIChJU19FUlIob3BfZGF0YSkpIHsKKwkJcmMgPSBQVFJfRVJSKG9wX2RhdGEpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAodW5saWtlbHkob3BfZGF0YS0+b3BfbWVhMSkpIHsKKwkJLyoKKwkJICogVGhpcyBpcyBvbmx5IG5lZWRlZCBmb3Igc3RyaXBlZCBkaXIgdG8gZmlsbCAuLiwKKwkJICogc2VlIGxtdl9yZWFkX3BhZ2UKKwkJICovCisJCWlmIChmaWxlX2RlbnRyeShmaWxwKS0+ZF9wYXJlbnQgJiYKKwkJICAgIGZpbGVfZGVudHJ5KGZpbHApLT5kX3BhcmVudC0+ZF9pbm9kZSkgeworCQkJX191NjQgaWJpdHMgPSBNRFNfSU5PREVMT0NLX1VQREFURTsKKwkJCXN0cnVjdCBpbm9kZSAqcGFyZW50OworCisJCQlwYXJlbnQgPSBmaWxlX2RlbnRyeShmaWxwKS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJCQlpZiAobGxfaGF2ZV9tZF9sb2NrKHBhcmVudCwgJmliaXRzLCBMQ0tfTUlOTU9ERSkpCisJCQkJb3BfZGF0YS0+b3BfZmlkMyA9ICpsbF9pbm9kZTJmaWQocGFyZW50KTsKKwkJfQorCisJCS8qCisJCSAqIElmIGl0IGNhbiBub3QgZmluZCBpbiBjYWNoZSwgZG8gbG9va3VwIC4uIG9uIHRoZSBtYXN0ZXIKKwkJICogb2JqZWN0CisJCSAqLworCQlpZiAoZmlkX2lzX3plcm8oJm9wX2RhdGEtPm9wX2ZpZDMpKSB7CisJCQlyYyA9IGxsX2Rpcl9nZXRfcGFyZW50X2ZpZChpbm9kZSwgJm9wX2RhdGEtPm9wX2ZpZDMpOworCQkJaWYgKHJjKSB7CisJCQkJbGxfZmluaXNoX21kX29wX2RhdGEob3BfZGF0YSk7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQl9CisJfQorCW9wX2RhdGEtPm9wX21heF9wYWdlcyA9IHNiaS0+bGxfbWRfYnJ3X3BhZ2VzOwogCWN0eC0+cG9zID0gcG9zOwotCXJjID0gbGxfZGlyX3JlYWQoaW5vZGUsIGN0eCk7CisJcmMgPSBsbF9kaXJfcmVhZChpbm9kZSwgJnBvcywgb3BfZGF0YSwgY3R4KTsKKwlwb3MgPSBjdHgtPnBvczsKIAlpZiAobGZkKQotCQlsZmQtPmxmZF9wb3MgPSBjdHgtPnBvczsKLQlpZiAoY3R4LT5wb3MgPT0gTURTX0RJUl9FTkRfT0ZGKSB7CisJCWxmZC0+bGZkX3BvcyA9IHBvczsKKworCWlmIChwb3MgPT0gTURTX0RJUl9FTkRfT0ZGKSB7CiAJCWlmIChhcGkzMikKLQkJCWN0eC0+cG9zID0gTExfRElSX0VORF9PRkZfMzJCSVQ7CisJCQlwb3MgPSBMTF9ESVJfRU5EX09GRl8zMkJJVDsKIAkJZWxzZQotCQkJY3R4LT5wb3MgPSBMTF9ESVJfRU5EX09GRjsKKwkJCXBvcyA9IExMX0RJUl9FTkRfT0ZGOwogCX0gZWxzZSB7CiAJCWlmIChhcGkzMiAmJiBoYXNoNjQpCi0JCQljdHgtPnBvcyA+Pj0gMzI7CisJCQlwb3MgPj49IDMyOwogCX0KKwljdHgtPnBvcyA9IHBvczsKKwlsbF9maW5pc2hfbWRfb3BfZGF0YShvcF9kYXRhKTsKIAlmaWxwLT5mX3ZlcnNpb24gPSBpbm9kZS0+aV92ZXJzaW9uOwogCiBvdXQ6CkBAIC02NjgsMTggKzM5Myw0MCBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBsbF9kaXJfc2V0ZGlyc3RyaXBlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgbG12X3VzZXJfbWQgKmx1bXAsCi0JCQkgICAgICAgY2hhciAqZmlsZW5hbWUpCisvKioKKyAqIENyZWF0ZSBzdHJpcGVkIGRpcmVjdG9yeSB3aXRoIHNwZWNpZmllZCBzdHJpcGUoQGx1bXApCisgKgorICogcGFyYW1baW5dIHBhcmVudAl0aGUgcGFyZW50IG9mIHRoZSBkaXJlY3RvcnkuCisgKiBwYXJhbVtpbl0gbHVtcAl0aGUgc3BlY2lmaWVkIHN0cmlwZXMuCisgKiBwYXJhbVtpbl0gZGlybmFtZQl0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5LgorICogcGFyYW1baW5dIG1vZGUJdGhlIHNwZWNpZmllZCBtb2RlIG9mIHRoZSBkaXJlY3RvcnkuCisgKgorICogcmV0dmFsCQk9MCBpZiBzdHJpcGVkIGRpcmVjdG9yeSBpcyBiZWluZyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KKyAqCQkJPDAgaWYgdGhlIGNyZWF0aW9uIGlzIGZhaWxlZC4KKyAqLworc3RhdGljIGludCBsbF9kaXJfc2V0ZGlyc3RyaXBlKHN0cnVjdCBpbm9kZSAqcGFyZW50LCBzdHJ1Y3QgbG12X3VzZXJfbWQgKmx1bXAsCisJCQkgICAgICAgY29uc3QgY2hhciAqZGlybmFtZSwgdW1vZGVfdCBtb2RlKQogewogCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxdWVzdCA9IE5VTEw7CiAJc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGE7Ci0Jc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGxsX2kyc2JpKGRpcik7Ci0JaW50IG1vZGU7CisJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGxsX2kyc2JpKHBhcmVudCk7CiAJaW50IGVycjsKIAotCW1vZGUgPSAofmN1cnJlbnRfdW1hc2soKSAmIDA3NTUpIHwgU19JRkRJUjsKLQlvcF9kYXRhID0gbGxfcHJlcF9tZF9vcF9kYXRhKE5VTEwsIGRpciwgTlVMTCwgZmlsZW5hbWUsCi0JCQkJICAgICBzdHJsZW4oZmlsZW5hbWUpLCBtb2RlLCBMVVNUUkVfT1BDX01LRElSLAorCWlmICh1bmxpa2VseShsdW1wLT5sdW1fbWFnaWMgIT0gTE1WX1VTRVJfTUFHSUMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCUNERUJVRyhEX1ZGU1RSQUNFLCAiVkZTIE9wOmlub2RlPSJERklEIiglcCkgbmFtZSAlcyBzdHJpcGVfb2Zmc2V0ICVkLCBzdHJpcGVfY291bnQ6ICV1XG4iLAorCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChwYXJlbnQpKSwgcGFyZW50LCBkaXJuYW1lLAorCSAgICAgICAoaW50KWx1bXAtPmx1bV9zdHJpcGVfb2Zmc2V0LCBsdW1wLT5sdW1fc3RyaXBlX2NvdW50KTsKKworCWlmIChsdW1wLT5sdW1fbWFnaWMgIT0gY3B1X3RvX2xlMzIoTE1WX1VTRVJfTUFHSUMpKQorCQlsdXN0cmVfc3dhYl9sbXZfdXNlcl9tZChsdW1wKTsKKworCWlmICghSVNfUE9TSVhBQ0wocGFyZW50KSB8fCAhZXhwX2Nvbm5lY3RfdW1hc2sobGxfaTJtZGV4cChwYXJlbnQpKSkKKwkJbW9kZSAmPSB+Y3VycmVudF91bWFzaygpOworCW1vZGUgPSAobW9kZSAmIChTX0lSV1hVR08gfCBTX0lTVlRYKSkgfCBTX0lGRElSOworCW9wX2RhdGEgPSBsbF9wcmVwX21kX29wX2RhdGEoTlVMTCwgcGFyZW50LCBOVUxMLCBkaXJuYW1lLAorCQkJCSAgICAgc3RybGVuKGRpcm5hbWUpLCBtb2RlLCBMVVNUUkVfT1BDX01LRElSLAogCQkJCSAgICAgbHVtcCk7CiAJaWYgKElTX0VSUihvcF9kYXRhKSkgewogCQllcnIgPSBQVFJfRVJSKG9wX2RhdGEpOwpAQCAtNzMwLDYgKzQ3NywxMyBAQAogCQkJbHVtX3NpemUgPSBzaXplb2Yoc3RydWN0IGxvdl91c2VyX21kX3YzKTsKIAkJCWJyZWFrOwogCQl9CisJCWNhc2UgTE1WX1VTRVJfTUFHSUM6IHsKKwkJCWlmIChsdW1wLT5sbW1fbWFnaWMgIT0gY3B1X3RvX2xlMzIoTE1WX1VTRVJfTUFHSUMpKQorCQkJCWx1c3RyZV9zd2FiX2xtdl91c2VyX21kKAorCQkJCQkoc3RydWN0IGxtdl91c2VyX21kICopbHVtcCk7CisJCQlsdW1fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbG12X3VzZXJfbWQpOworCQkJYnJlYWs7CisJCX0KIAkJZGVmYXVsdDogewogCQkJQ0RFQlVHKERfSU9DVEwsICJiYWQgdXNlcmxhbmQgTE9WIE1BR0lDOiAlIzA4eCAhPSAlIzA4eCBub3IgJSMwOHhcbiIsCiAJCQkgICAgICAgbHVtcC0+bG1tX21hZ2ljLCBMT1ZfVVNFUl9NQUdJQ19WMSwKQEAgLTc0Niw5ICs1MDAsNiBAQAogCWlmIChJU19FUlIob3BfZGF0YSkpCiAJCXJldHVybiBQVFJfRVJSKG9wX2RhdGEpOwogCi0JaWYgKGx1bXAgJiYgbHVtcC0+bG1tX21hZ2ljID09IGNwdV90b19sZTMyKExNVl9VU0VSX01BR0lDKSkKLQkJb3BfZGF0YS0+b3BfY2xpX2ZsYWdzIHw9IENMSV9TRVRfTUVBOwotCiAJLyogc3dhYmJpbmcgaXMgZG9uZSBpbiBsb3Zfc2V0c3RyaXBlKCkgb24gc2VydmVyIHNpZGUgKi8KIAlyYyA9IG1kX3NldGF0dHIoc2JpLT5sbF9tZF9leHAsIG9wX2RhdGEsIGx1bXAsIGx1bV9zaXplLAogCQkJTlVMTCwgMCwgJnJlcSwgTlVMTCk7CkBAIC04MDMsOCArNTU0LDE2IEBACiAJcmV0dXJuIHJjOwogfQogCi1pbnQgbGxfZGlyX2dldHN0cmlwZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbG92X21kc19tZCAqKmxtbXAsCi0JCSAgICAgaW50ICpsbW1fc2l6ZSwgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCkKKy8qKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgdG8gZ2V0IGRlZmF1bHQgTE9WL0xNVi9EZWZhdWx0IExNVgorICogQHZhbGlkIHdpbGwgYmUgdXNlZCB0byBpbmRpY2F0ZSB3aGljaCBzdHJpcGUgaXQgd2lsbCByZXRyaWV2ZQorICoJT0JEX01EX01FQQkJTE1WIHN0cmlwZSBFQQorICoJT0JEX01EX0RFRkFVTFRfTUVBCURlZmF1bHQgTE1WIHN0cmlwZSBFQQorICoJb3RoZXJ3aXNlCQlEZWZhdWx0IExPViBFQS4KKyAqIEVhY2ggdGltZSwgaXQgY2FuIG9ubHkgcmV0cmlldmUgMSBzdHJpcGUgRUEKKyAqKi8KK2ludCBsbF9kaXJfZ2V0c3RyaXBlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKipwbG1tLCBpbnQgKnBsbW1fc2l6ZSwKKwkJICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0LCB1NjQgdmFsaWQpCiB7CiAJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGxsX2kyc2JpKGlub2RlKTsKIAlzdHJ1Y3QgbWR0X2JvZHkgICAqYm9keTsKQEAgLTgxMyw3ICs1NzIsNyBAQAogCWludCByYywgbG1tc2l6ZTsKIAlzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YTsKIAotCXJjID0gbGxfZ2V0X2RlZmF1bHRfbWRzaXplKHNiaSwgJmxtbXNpemUpOworCXJjID0gbGxfZ2V0X21heF9tZHNpemUoc2JpLCAmbG1tc2l6ZSk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKQEAgLTgzNCw5ICs1OTMsOSBAQAogCiAJYm9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7CiAKLQlsbW1zaXplID0gYm9keS0+ZWFkYXRhc2l6ZTsKKwlsbW1zaXplID0gYm9keS0+bWJvX2VhZGF0YXNpemU7CiAKLQlpZiAoIShib2R5LT52YWxpZCAmIChPQkRfTURfRkxFQVNJWkUgfCBPQkRfTURfRkxESVJFQSkpIHx8CisJaWYgKCEoYm9keS0+bWJvX3ZhbGlkICYgKE9CRF9NRF9GTEVBU0laRSB8IE9CRF9NRF9GTERJUkVBKSkgfHwKIAkgICAgbG1tc2l6ZSA9PSAwKSB7CiAJCXJjID0gLUVOT0RBVEE7CiAJCWdvdG8gb3V0OwpAQCAtODQ0LDYgKzYwMyw3IEBACiAKIAlsbW0gPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfc2l6ZWRfZ2V0KCZyZXEtPnJxX3BpbGwsCiAJCQkJCSAgICZSTUZfTURUX01ELCBsbW1zaXplKTsKKwlMQVNTRVJUKGxtbSk7CiAKIAkvKgogCSAqIFRoaXMgaXMgY29taW5nIGZyb20gdGhlIE1EUywgc28gaXMgcHJvYmFibHkgaW4KQEAgLTg2MCw0MCArNjIwLDUxIEBACiAJCWlmIChjcHVfdG9fbGUzMihMT1ZfTUFHSUMpICE9IExPVl9NQUdJQykKIAkJCWx1c3RyZV9zd2FiX2xvdl91c2VyX21kX3YzKChzdHJ1Y3QgbG92X3VzZXJfbWRfdjMgKilsbW0pOwogCQlicmVhazsKKwljYXNlIExNVl9NQUdJQ19WMToKKwkJaWYgKGNwdV90b19sZTMyKExNVl9NQUdJQykgIT0gTE1WX01BR0lDKQorCQkJbHVzdHJlX3N3YWJfbG12X21kc19tZCgodW5pb24gbG12X21kc19tZCAqKWxtbSk7CisJCWJyZWFrOworCWNhc2UgTE1WX1VTRVJfTUFHSUM6CisJCWlmIChjcHVfdG9fbGUzMihMTVZfVVNFUl9NQUdJQykgIT0gTE1WX1VTRVJfTUFHSUMpCisJCQlsdXN0cmVfc3dhYl9sbXZfdXNlcl9tZCgoc3RydWN0IGxtdl91c2VyX21kICopbG1tKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQ0VSUk9SKCJ1bmtub3duIG1hZ2ljOiAlbFhcbiIsICh1bnNpZ25lZCBsb25nKWxtbS0+bG1tX21hZ2ljKTsKIAkJcmMgPSAtRVBST1RPOwogCX0KIG91dDoKLQkqbG1tcCA9IGxtbTsKLQkqbG1tX3NpemUgPSBsbW1zaXplOworCSpwbG1tID0gbG1tOworCSpwbG1tX3NpemUgPSBsbW1zaXplOwogCSpyZXF1ZXN0ID0gcmVxOwogCXJldHVybiByYzsKIH0KIAoraW50IGxsX2dldF9tZHRfaWR4X2J5X2ZpZChzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpLCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQpCit7CisJc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGE7CisJaW50IG1kdF9pbmRleCwgcmM7CisKKwlvcF9kYXRhID0ga3phbGxvYyhzaXplb2YoKm9wX2RhdGEpLCBHRlBfTk9GUyk7CisJaWYgKCFvcF9kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW9wX2RhdGEtPm9wX2ZsYWdzIHw9IE1GX0dFVF9NRFRfSURYOworCW9wX2RhdGEtPm9wX2ZpZDEgPSAqZmlkOworCXJjID0gbWRfZ2V0YXR0cihzYmktPmxsX21kX2V4cCwgb3BfZGF0YSwgTlVMTCk7CisJbWR0X2luZGV4ID0gb3BfZGF0YS0+b3BfbWRzOworCWt2ZnJlZShvcF9kYXRhKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gbWR0X2luZGV4OworfQorCiAvKgogICogIEdldCBNRFQgaW5kZXggZm9yIHRoZSBpbm9kZS4KICAqLwogaW50IGxsX2dldF9tZHRfaWR4KHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0Jc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGxsX2kyc2JpKGlub2RlKTsKLQlzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YTsKLQlpbnQgcmMsIG1kdGlkeDsKLQotCW9wX2RhdGEgPSBsbF9wcmVwX21kX29wX2RhdGEoTlVMTCwgaW5vZGUsIE5VTEwsIE5VTEwsIDAsCi0JCQkJICAgICAwLCBMVVNUUkVfT1BDX0FOWSwgTlVMTCk7Ci0JaWYgKElTX0VSUihvcF9kYXRhKSkKLQkJcmV0dXJuIFBUUl9FUlIob3BfZGF0YSk7Ci0KLQlvcF9kYXRhLT5vcF9mbGFncyB8PSBNRl9HRVRfTURUX0lEWDsKLQlyYyA9IG1kX2dldGF0dHIoc2JpLT5sbF9tZF9leHAsIG9wX2RhdGEsIE5VTEwpOwotCW1kdGlkeCA9IG9wX2RhdGEtPm9wX21kczsKLQlsbF9maW5pc2hfbWRfb3BfZGF0YShvcF9kYXRhKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNERUJVRyhEX0lORk8sICJtZF9nZXRhdHRyX25hbWU6ICVkXG4iLCByYyk7Ci0JCXJldHVybiByYzsKLQl9Ci0JcmV0dXJuIG1kdGlkeDsKKwlyZXR1cm4gbGxfZ2V0X21kdF9pZHhfYnlfZmlkKGxsX2kyc2JpKGlub2RlKSwgbGxfaW5vZGUyZmlkKGlub2RlKSk7CiB9CiAKIC8qKgpAQCAtMTI4OCwxMSArMTA1OSw5IEBACiAJCXJldHVybiAwOwogCX0KIAljYXNlIElPQ19NRENfTE9PS1VQOiB7Ci0JCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxdWVzdCA9IE5VTEw7CiAJCWludCBuYW1lbGVuLCBsZW4gPSAwOwogCQljaGFyICpidWYgPSBOVUxMOwogCQljaGFyICpmaWxlbmFtZTsKLQkJc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGE7CiAKIAkJcmMgPSBvYmRfaW9jdGxfZ2V0ZGF0YSgmYnVmLCAmbGVuLCAodm9pZCBfX3VzZXIgKilhcmcpOwogCQlpZiAocmMpCkBAIC0xMzA4LDIxICsxMDc3LDEzIEBACiAJCQlnb3RvIG91dF9mcmVlOwogCQl9CiAKLQkJb3BfZGF0YSA9IGxsX3ByZXBfbWRfb3BfZGF0YShOVUxMLCBpbm9kZSwgTlVMTCwgZmlsZW5hbWUsIG5hbWVsZW4sCi0JCQkJCSAgICAgMCwgTFVTVFJFX09QQ19BTlksIE5VTEwpOwotCQlpZiAoSVNfRVJSKG9wX2RhdGEpKSB7Ci0JCQlyYyA9IFBUUl9FUlIob3BfZGF0YSk7Ci0JCQlnb3RvIG91dF9mcmVlOwotCQl9Ci0KLQkJb3BfZGF0YS0+b3BfdmFsaWQgPSBPQkRfTURfRkxJRDsKLQkJcmMgPSBtZF9nZXRhdHRyX25hbWUoc2JpLT5sbF9tZF9leHAsIG9wX2RhdGEsICZyZXF1ZXN0KTsKLQkJbGxfZmluaXNoX21kX29wX2RhdGEob3BfZGF0YSk7CisJCXJjID0gbGxfZ2V0X2ZpZF9ieV9uYW1lKGlub2RlLCBmaWxlbmFtZSwgbmFtZWxlbiwgTlVMTCk7CiAJCWlmIChyYyA8IDApIHsKLQkJCUNERUJVRyhEX0lORk8sICJtZF9nZXRhdHRyX25hbWU6ICVkXG4iLCByYyk7CisJCQlDRVJST1IoIiVzOiBsb29rdXAgJS4qcyBmYWlsZWQ6IHJjID0gJWRcbiIsCisJCQkgICAgICAgbGxfZ2V0X2ZzbmFtZShpbm9kZS0+aV9zYiwgTlVMTCwgMCksIG5hbWVsZW4sCisJCQkgICAgICAgZmlsZW5hbWUsIHJjKTsKIAkJCWdvdG8gb3V0X2ZyZWU7CiAJCX0KLQkJcHRscnBjX3JlcV9maW5pc2hlZChyZXF1ZXN0KTsKIG91dF9mcmVlOgogCQlvYmRfaW9jdGxfZnJlZWRhdGEoYnVmLCBsZW4pOwogCQlyZXR1cm4gcmM7CkBAIC0xMzMzLDYgKzEwOTQsNyBAQAogCQljaGFyCQkqZmlsZW5hbWU7CiAJCWludAkJIG5hbWVsZW4gPSAwOwogCQlpbnQJCSBsdW1sZW4gPSAwOworCQl1bW9kZV90IG1vZGU7CiAJCWludAkJIGxlbjsKIAkJaW50CQkgcmM7CiAKQEAgLTEzNjYsMTUgKzExMjgsMzIgQEAKIAkJCWdvdG8gbG12X291dF9mcmVlOwogCQl9CiAKLQkJLyoqCi0JCSAqIGxsX2Rpcl9zZXRkaXJzdHJpcGUgd2lsbCBiZSB1c2VkIHRvIHNldCBkaXIgc3RyaXBlCi0JCSAqICBtZGNfY3JlYXRlLS0tPm1kdF9yZWludF9jcmVhdGUgKHdpdGggZGlyc3RyaXBlKQotCQkgKi8KLQkJcmMgPSBsbF9kaXJfc2V0ZGlyc3RyaXBlKGlub2RlLCBsdW0sIGZpbGVuYW1lKTsKKyNpZiBPQkRfT0NEX1ZFUlNJT04oMiwgOSwgNTAsIDApID4gTFVTVFJFX1ZFUlNJT05fQ09ERQorCQltb2RlID0gZGF0YS0+aW9jX3R5cGUgIT0gMCA/IGRhdGEtPmlvY190eXBlIDogU19JUldYVUdPOworI2Vsc2UKKwkJbW9kZSA9IGRhdGEtPmlvY190eXBlOworI2VuZGlmCisJCXJjID0gbGxfZGlyX3NldGRpcnN0cmlwZShpbm9kZSwgbHVtLCBmaWxlbmFtZSwgbW9kZSk7CiBsbXZfb3V0X2ZyZWU6CiAJCW9iZF9pb2N0bF9mcmVlZGF0YShidWYsIGxlbik7CiAJCXJldHVybiByYzsKIAl9CisJY2FzZSBMTF9JT0NfTE1WX1NFVF9ERUZBVUxUX1NUUklQRTogeworCQlzdHJ1Y3QgbG12X3VzZXJfbWQgX191c2VyICp1bHVtcDsKKwkJc3RydWN0IGxtdl91c2VyX21kIGx1bTsKKwkJaW50IHJjOworCisJCXVsdW1wID0gKHN0cnVjdCBsbXZfdXNlcl9tZCBfX3VzZXIgKilhcmc7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmbHVtLCB1bHVtcCwgc2l6ZW9mKGx1bSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGx1bS5sdW1fbWFnaWMgIT0gTE1WX1VTRVJfTUFHSUMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlyYyA9IGxsX2Rpcl9zZXRzdHJpcGUoaW5vZGUsIChzdHJ1Y3QgbG92X3VzZXJfbWQgKikmbHVtLCAwKTsKKworCQlyZXR1cm4gcmM7CisJfQogCWNhc2UgTExfSU9DX0xPVl9TRVRTVFJJUEU6IHsKIAkJc3RydWN0IGxvdl91c2VyX21kX3YzIGx1bXYzOwogCQlzdHJ1Y3QgbG92X3VzZXJfbWRfdjEgKmx1bXYxID0gKHN0cnVjdCBsb3ZfdXNlcl9tZF92MSAqKSZsdW12MzsKQEAgLTE0MDQsNTAgKzExODMsMTAwIEBACiAJCXJldHVybiByYzsKIAl9CiAJY2FzZSBMTF9JT0NfTE1WX0dFVFNUUklQRTogewotCQlzdHJ1Y3QgbG12X3VzZXJfbWQgX191c2VyICpsdW1wID0gKHZvaWQgX191c2VyICopYXJnOworCQlzdHJ1Y3QgbG12X3VzZXJfbWQgX191c2VyICp1bG12OwogCQlzdHJ1Y3QgbG12X3VzZXJfbWQgbHVtOwotCQlzdHJ1Y3QgbG12X3VzZXJfbWQgKnRtcDsKKwkJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXF1ZXN0ID0gTlVMTDsKKwkJc3RydWN0IGxtdl91c2VyX21kICp0bXAgPSBOVUxMOworCQl1bmlvbiBsbXZfbWRzX21kICpsbW0gPSBOVUxMOworCQl1NjQgdmFsaWQgPSAwOworCQlpbnQgc3RyaXBlX2NvdW50OworCQlpbnQgbWR0X2luZGV4OwogCQlpbnQgbHVtX3NpemU7Ci0JCWludCByYyA9IDA7Ci0JCWludCBtZHRpbmRleDsKKwkJaW50IGxtbXNpemU7CisJCWludCByYzsKKwkJaW50IGk7CiAKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZsdW0sIGx1bXAsIHNpemVvZihzdHJ1Y3QgbG12X3VzZXJfbWQpKSkKKwkJdWxtdiA9IChzdHJ1Y3QgbG12X3VzZXJfbWQgX191c2VyICopYXJnOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmx1bSwgdWxtdiwgc2l6ZW9mKCp1bG12KSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAotCQlpZiAobHVtLmx1bV9tYWdpYyAhPSBMTVZfTUFHSUNfVjEpCisJCS8qCisJCSAqIGx1bV9tYWdpYyB3aWxsIGluZGljYXRlIHdoaWNoIHN0cmlwZSB0aGUgaW9jdGwgd2lsbCBsaWtlCisJCSAqIHRvIGdldCwgTE1WX01BR0lDX1YxIGlzIGZvciBub3JtYWwgTE1WIHN0cmlwZSwgTE1WX1VTRVJfTUFHSUMKKwkJICogaXMgZm9yIGRlZmF1bHQgTE1WIHN0cmlwZQorCQkgKi8KKwkJaWYgKGx1bS5sdW1fbWFnaWMgPT0gTE1WX01BR0lDX1YxKQorCQkJdmFsaWQgfD0gT0JEX01EX01FQTsKKwkJZWxzZSBpZiAobHVtLmx1bV9tYWdpYyA9PSBMTVZfVVNFUl9NQUdJQykKKwkJCXZhbGlkIHw9IE9CRF9NRF9ERUZBVUxUX01FQTsKKwkJZWxzZQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJbHVtX3NpemUgPSBsbXZfdXNlcl9tZF9zaXplKDEsIExNVl9NQUdJQ19WMSk7CisJCXJjID0gbGxfZGlyX2dldHN0cmlwZShpbm9kZSwgKHZvaWQgKiopJmxtbSwgJmxtbXNpemUsICZyZXF1ZXN0LAorCQkJCSAgICAgIHZhbGlkKTsKKwkJaWYgKHJjKQorCQkJZ290byBmaW5pc2hfcmVxOworCisJCS8qIEdldCBkZWZhdWx0IExNViBFQSAqLworCQlpZiAobHVtLmx1bV9tYWdpYyA9PSBMTVZfVVNFUl9NQUdJQykgeworCQkJaWYgKHJjKQorCQkJCWdvdG8gZmluaXNoX3JlcTsKKworCQkJaWYgKGxtbXNpemUgPiBzaXplb2YoKnVsbXYpKSB7CisJCQkJcmMgPSAtRUlOVkFMOworCQkJCWdvdG8gZmluaXNoX3JlcTsKKwkJCX0KKworCQkJaWYgKGNvcHlfdG9fdXNlcih1bG12LCBsbW0sIGxtbXNpemUpKQorCQkJCXJjID0gLUVGQVVMVDsKKworCQkJZ290byBmaW5pc2hfcmVxOworCQl9CisKKwkJc3RyaXBlX2NvdW50ID0gbG12X21kc19tZF9zdHJpcGVfY291bnRfZ2V0KGxtbSk7CisJCWx1bV9zaXplID0gbG12X3VzZXJfbWRfc2l6ZShzdHJpcGVfY291bnQsIExNVl9NQUdJQ19WMSk7CiAJCXRtcCA9IGt6YWxsb2MobHVtX3NpemUsIEdGUF9OT0ZTKTsKIAkJaWYgKCF0bXApIHsKIAkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gZnJlZV9sbXY7CisJCQlnb3RvIGZpbmlzaF9yZXE7CiAJCX0KIAotCQkqdG1wID0gbHVtOwotCQl0bXAtPmx1bV90eXBlID0gTE1WX1NUUklQRV9UWVBFOwotCQl0bXAtPmx1bV9zdHJpcGVfY291bnQgPSAxOwotCQltZHRpbmRleCA9IGxsX2dldF9tZHRfaWR4KGlub2RlKTsKLQkJaWYgKG1kdGluZGV4IDwgMCkgeworCQltZHRfaW5kZXggPSBsbF9nZXRfbWR0X2lkeChpbm9kZSk7CisJCWlmIChtZHRfaW5kZXggPCAwKSB7CiAJCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIGZyZWVfbG12OworCQkJZ290byBvdXRfdG1wOworCQl9CisJCXRtcC0+bHVtX21hZ2ljID0gTE1WX01BR0lDX1YxOworCQl0bXAtPmx1bV9zdHJpcGVfY291bnQgPSAwOworCQl0bXAtPmx1bV9zdHJpcGVfb2Zmc2V0ID0gbWR0X2luZGV4OworCQlmb3IgKGkgPSAwOyBpIDwgc3RyaXBlX2NvdW50OyBpKyspIHsKKwkJCXN0cnVjdCBsdV9maWQgZmlkOworCisJCQlmaWRfbGVfdG9fY3B1KCZmaWQsICZsbW0tPmxtdl9tZF92MS5sbXZfc3RyaXBlX2ZpZHNbaV0pOworCQkJbWR0X2luZGV4ID0gbGxfZ2V0X21kdF9pZHhfYnlfZmlkKHNiaSwgJmZpZCk7CisJCQlpZiAobWR0X2luZGV4IDwgMCkgeworCQkJCXJjID0gbWR0X2luZGV4OworCQkJCWdvdG8gb3V0X3RtcDsKKwkJCX0KKwkJCXRtcC0+bHVtX29iamVjdHNbaV0ubHVtX21kcyA9IG1kdF9pbmRleDsKKwkJCXRtcC0+bHVtX29iamVjdHNbaV0ubHVtX2ZpZCA9IGZpZDsKKwkJCXRtcC0+bHVtX3N0cmlwZV9jb3VudCsrOwogCQl9CiAKLQkJdG1wLT5sdW1fc3RyaXBlX29mZnNldCA9IG1kdGluZGV4OwotCQl0bXAtPmx1bV9vYmplY3RzWzBdLmx1bV9tZHMgPSBtZHRpbmRleDsKLQkJbWVtY3B5KCZ0bXAtPmx1bV9vYmplY3RzWzBdLmx1bV9maWQsIGxsX2lub2RlMmZpZChpbm9kZSksCi0JCSAgICAgICBzaXplb2Yoc3RydWN0IGx1X2ZpZCkpOwotCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgdG1wLCBsdW1fc2l6ZSkpIHsKKwkJaWYgKGNvcHlfdG9fdXNlcih1bG12LCB0bXAsIGx1bV9zaXplKSkgewogCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBmcmVlX2xtdjsKKwkJCWdvdG8gb3V0X3RtcDsKIAkJfQotZnJlZV9sbXY6CitvdXRfdG1wOgogCQlrZnJlZSh0bXApOworZmluaXNoX3JlcToKKwkJcHRscnBjX3JlcV9maW5pc2hlZChyZXF1ZXN0KTsKIAkJcmV0dXJuIHJjOwogCX0KKwogCWNhc2UgTExfSU9DX0xPVl9TV0FQX0xBWU9VVFM6CiAJCXJldHVybiAtRVBFUk07Ci0JY2FzZSBMTF9JT0NfT0JEX1NUQVRGUzoKKwljYXNlIElPQ19PQkRfU1RBVEZTOgogCQlyZXR1cm4gbGxfb2JkX3N0YXRmcyhpbm9kZSwgKHZvaWQgX191c2VyICopYXJnKTsKIAljYXNlIExMX0lPQ19MT1ZfR0VUU1RSSVBFOgogCWNhc2UgTExfSU9DX01EQ19HRVRJTkZPOgpAQCAtMTQ2OSw3ICsxMjk4LDggQEAKIAkJCXJjID0gbGxfbG92X2dldHN0cmlwZV9lYV9pbmZvKGlub2RlLCBmaWxlbmFtZSwgJmxtbSwKIAkJCQkJCSAgICAgICZsbW1zaXplLCAmcmVxdWVzdCk7CiAJCX0gZWxzZSB7Ci0JCQlyYyA9IGxsX2Rpcl9nZXRzdHJpcGUoaW5vZGUsICZsbW0sICZsbW1zaXplLCAmcmVxdWVzdCk7CisJCQlyYyA9IGxsX2Rpcl9nZXRzdHJpcGUoaW5vZGUsICh2b2lkICoqKSZsbW0sICZsbW1zaXplLAorCQkJCQkgICAgICAmcmVxdWVzdCwgMCk7CiAJCX0KIAogCQlpZiAocmVxdWVzdCkgewpAQCAtMTUxMiwxOCArMTM0MiwxOCBAQAogCQkJbHN0YXRfdCBzdCA9IHsgMCB9OwogCiAJCQlzdC5zdF9kZXYgICAgID0gaW5vZGUtPmlfc2ItPnNfZGV2OwotCQkJc3Quc3RfbW9kZSAgICA9IGJvZHktPm1vZGU7Ci0JCQlzdC5zdF9ubGluayAgID0gYm9keS0+bmxpbms7Ci0JCQlzdC5zdF91aWQgICAgID0gYm9keS0+dWlkOwotCQkJc3Quc3RfZ2lkICAgICA9IGJvZHktPmdpZDsKLQkJCXN0LnN0X3JkZXYgICAgPSBib2R5LT5yZGV2OwotCQkJc3Quc3Rfc2l6ZSAgICA9IGJvZHktPnNpemU7CisJCQlzdC5zdF9tb2RlICAgID0gYm9keS0+bWJvX21vZGU7CisJCQlzdC5zdF9ubGluayAgID0gYm9keS0+bWJvX25saW5rOworCQkJc3Quc3RfdWlkICAgICA9IGJvZHktPm1ib191aWQ7CisJCQlzdC5zdF9naWQgICAgID0gYm9keS0+bWJvX2dpZDsKKwkJCXN0LnN0X3JkZXYgICAgPSBib2R5LT5tYm9fcmRldjsKKwkJCXN0LnN0X3NpemUgICAgPSBib2R5LT5tYm9fc2l6ZTsKIAkJCXN0LnN0X2Jsa3NpemUgPSBQQUdFX1NJWkU7Ci0JCQlzdC5zdF9ibG9ja3MgID0gYm9keS0+YmxvY2tzOwotCQkJc3Quc3RfYXRpbWUgICA9IGJvZHktPmF0aW1lOwotCQkJc3Quc3RfbXRpbWUgICA9IGJvZHktPm10aW1lOwotCQkJc3Quc3RfY3RpbWUgICA9IGJvZHktPmN0aW1lOwotCQkJc3Quc3RfaW5vICAgICA9IGNsX2ZpZF9idWlsZF9pbm8oJmJvZHktPmZpZDEsCisJCQlzdC5zdF9ibG9ja3MgID0gYm9keS0+bWJvX2Jsb2NrczsKKwkJCXN0LnN0X2F0aW1lICAgPSBib2R5LT5tYm9fYXRpbWU7CisJCQlzdC5zdF9tdGltZSAgID0gYm9keS0+bWJvX210aW1lOworCQkJc3Quc3RfY3RpbWUgICA9IGJvZHktPm1ib19jdGltZTsKKwkJCXN0LnN0X2lubyAgICAgPSBjbF9maWRfYnVpbGRfaW5vKCZib2R5LT5tYm9fZmlkMSwKIAkJCQkJCQkgc2JpLT5sbF9mbGFncyAmCiAJCQkJCQkJIExMX1NCSV8zMkJJVF9BUEkpOwogCkBAIC0xNjExLDkgKzE0NDEsNiBAQAogCQlrdmZyZWUobG1tKTsKIAkJcmV0dXJuIHJjOwogCX0KLQljYXNlIE9CRF9JT0NfTExPR19DQVRJTkZPOiB7Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQl9CiAJY2FzZSBPQkRfSU9DX1FVT1RBQ0hFQ0s6IHsKIAkJc3RydWN0IG9iZF9xdW90YWN0bCAqb3FjdGw7CiAJCWludCBlcnJvciA9IDA7CkBAIC0xNjcxLDcgKzE0OTgsNyBAQAogCQlrZnJlZShjaGVjayk7CiAJCXJldHVybiByYzsKIAl9Ci0JY2FzZSBMTF9JT0NfUVVPVEFDVEw6IHsKKwljYXNlIE9CRF9JT0NfUVVPVEFDVEw6IHsKIAkJc3RydWN0IGlmX3F1b3RhY3RsICpxY3RsOwogCiAJCXFjdGwgPSBremFsbG9jKHNpemVvZigqcWN0bCksIEdGUF9OT0ZTKTsKQEAgLTE3MzksNiArMTU2NiwyNSBAQAogCQlyZXR1cm4gcmM7CiAJY2FzZSBPQkRfSU9DX0ZJRDJQQVRIOgogCQlyZXR1cm4gbGxfZmlkMnBhdGgoaW5vZGUsICh2b2lkIF9fdXNlciAqKWFyZyk7CisJY2FzZSBMTF9JT0NfR0VUUEFSRU5UOgorCQlyZXR1cm4gbGxfZ2V0cGFyZW50KGZpbGUsICh2b2lkIF9fdXNlciAqKWFyZyk7CisJY2FzZSBMTF9JT0NfRklEMk1EVElEWDogeworCQlzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwID0gbGxfaTJtZGV4cChpbm9kZSk7CisJCXN0cnVjdCBsdV9maWQgZmlkOworCQlfX3UzMiBpbmRleDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmZpZCwgKGNvbnN0IHN0cnVjdCBsdV9maWQgX191c2VyICopYXJnLAorCQkJCSAgIHNpemVvZihmaWQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCS8qIENhbGwgbWRjX2lvY29udHJvbCAqLworCQlyYyA9IG9iZF9pb2NvbnRyb2woTExfSU9DX0ZJRDJNRFRJRFgsIGV4cCwgc2l6ZW9mKGZpZCksICZmaWQsCisJCQkJICAgJmluZGV4KTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCXJldHVybiBpbmRleDsKKwl9CiAJY2FzZSBMTF9JT0NfSFNNX1JFUVVFU1Q6IHsKIAkJc3RydWN0IGhzbV91c2VyX3JlcXVlc3QJKmh1cjsKIAkJc3NpemVfdAkJCSB0b3RhbHNpemU7CkBAIC0xODUzLDYgKzE2OTksNDUgQEAKIAkJa2ZyZWUoY29weSk7CiAJCXJldHVybiByYzsKIAl9CisJY2FzZSBMTF9JT0NfTUlHUkFURTogeworCQljaGFyICpidWYgPSBOVUxMOworCQljb25zdCBjaGFyICpmaWxlbmFtZTsKKwkJaW50IG5hbWVsZW4gPSAwOworCQlpbnQgbGVuOworCQlpbnQgcmM7CisJCWludCBtZHRpZHg7CisKKwkJcmMgPSBvYmRfaW9jdGxfZ2V0ZGF0YSgmYnVmLCAmbGVuLCAodm9pZCBfX3VzZXIgKilhcmcpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCisJCWRhdGEgPSAoc3RydWN0IG9iZF9pb2N0bF9kYXRhICopYnVmOworCQlpZiAoIWRhdGEtPmlvY19pbmxidWYxIHx8ICFkYXRhLT5pb2NfaW5sYnVmMiB8fAorCQkgICAgIWRhdGEtPmlvY19pbmxsZW4xIHx8ICFkYXRhLT5pb2NfaW5sbGVuMikgeworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBtaWdyYXRlX2ZyZWU7CisJCX0KKworCQlmaWxlbmFtZSA9IGRhdGEtPmlvY19pbmxidWYxOworCQluYW1lbGVuID0gZGF0YS0+aW9jX2lubGxlbjE7CisJCWlmIChuYW1lbGVuIDwgMSB8fCBuYW1lbGVuICE9IHN0cmxlbihmaWxlbmFtZSkgKyAxKSB7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlnb3RvIG1pZ3JhdGVfZnJlZTsKKwkJfQorCisJCWlmIChkYXRhLT5pb2NfaW5sbGVuMiAhPSBzaXplb2YobWR0aWR4KSkgeworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBtaWdyYXRlX2ZyZWU7CisJCX0KKwkJbWR0aWR4ID0gKihpbnQgKilkYXRhLT5pb2NfaW5sYnVmMjsKKworCQlyYyA9IGxsX21pZ3JhdGUoaW5vZGUsIGZpbGUsIG1kdGlkeCwgZmlsZW5hbWUsIG5hbWVsZW4gLSAxKTsKK21pZ3JhdGVfZnJlZToKKwkJb2JkX2lvY3RsX2ZyZWVkYXRhKGJ1ZiwgbGVuKTsKKworCQlyZXR1cm4gcmM7CisJfQorCiAJZGVmYXVsdDoKIAkJcmV0dXJuIG9iZF9pb2NvbnRyb2woY21kLCBzYmktPmxsX2R0X2V4cCwgMCwgTlVMTCwKIAkJCQkgICAgICh2b2lkIF9fdXNlciAqKWFyZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9maWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9maWxlLmMKaW5kZXggNTcyODFiOS4uNmUzYTE4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZmlsZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2ZpbGUuYwpAQCAtMzgsMTQgKzM4LDE1IEBACiAKICNkZWZpbmUgREVCVUdfU1VCU1lTVEVNIFNfTExJVEUKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9kbG0uaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saXRlLmgiCiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+Ci0jaW5jbHVkZSAibGxpdGVfaW50ZXJuYWwuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZS9sbF9maWVtYXAuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfaW9jdGwuaCIKIAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvY2xfb2JqZWN0LmgiCisjaW5jbHVkZSAibGxpdGVfaW50ZXJuYWwuaCIKIAogc3RhdGljIGludAogbGxfcHV0X2dyb3VwbG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBhcmcpOwpAQCAtMTg4LDE3ICsxODksMTEgQEAKIAkJc3Bpbl91bmxvY2soJmxsaS0+bGxpX2xvY2spOwogCX0KIAotCWlmIChyYyA9PSAwKSB7Ci0JCXJjID0gbGxfb2JqZWN0c19kZXN0cm95KHJlcSwgaW5vZGUpOwotCQlpZiAocmMpCi0JCQlDRVJST1IoImlub2RlICVsdSBsbF9vYmplY3RzIGRlc3Ryb3k6IHJjID0gJWRcbiIsCi0JCQkgICAgICAgaW5vZGUtPmlfaW5vLCByYyk7Ci0JfQogCWlmIChyYyA9PSAwICYmIG9wX2RhdGEtPm9wX2JpYXMgJiBNRFNfSFNNX1JFTEVBU0UpIHsKIAkJc3RydWN0IG1kdF9ib2R5ICpib2R5OwogCiAJCWJvZHkgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfTURUX0JPRFkpOwotCQlpZiAoIShib2R5LT52YWxpZCAmIE9CRF9NRF9GTFJFTEVBU0VEKSkKKwkJaWYgKCEoYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0ZMUkVMRUFTRUQpKQogCQkJcmMgPSAtRUJVU1k7CiAJfQogCkBAIC0zNDksMTMgKzM0NCwxMSBAQAogCWZkID0gTFVTVFJFX0ZQUklWQVRFKGZpbGUpOwogCUxBU1NFUlQoZmQpOwogCi0JLyogVGhlIGxhc3QgcmVmIG9uIEBmaWxlLCBtYXliZSBub3QgYmUgdGhlIG93bmVyIHBpZCBvZiBzdGF0YWhlYWQuCi0JICogRGlmZmVyZW50IHByb2Nlc3NlcyBjYW4gb3BlbiB0aGUgc2FtZSBkaXIsICJsbF9vcGVuZGlyX2tleSIgbWVhbnM6Ci0JICogaXQgaXMgbWUgdGhhdCBzaG91bGQgc3RvcCB0aGUgc3RhdGFoZWFkIHRocmVhZC4KKwkvKiBUaGUgbGFzdCByZWYgb24gQGZpbGUsIG1heWJlIG5vdCBiZSB0aGUgb3duZXIgcGlkIG9mIHN0YXRhaGVhZCwKKwkgKiBiZWNhdXNlIHBhcmVudCBhbmQgY2hpbGQgcHJvY2VzcyBjYW4gc2hhcmUgdGhlIHNhbWUgZmlsZSBoYW5kbGUuCiAJICovCi0JaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgbGxpLT5sbGlfb3BlbmRpcl9rZXkgPT0gZmQgJiYKLQkgICAgbGxpLT5sbGlfb3BlbmRpcl9waWQgIT0gMCkKLQkJbGxfc3RvcF9zdGF0YWhlYWQoaW5vZGUsIGxsaS0+bGxpX29wZW5kaXJfa2V5KTsKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJiBsbGktPmxsaV9vcGVuZGlyX2tleSA9PSBmZCkKKwkJbGxfZGVhdXRob3JpemVfc3RhdGFoZWFkKGlub2RlLCBmZCk7CiAKIAlpZiAoaXNfcm9vdF9pbm9kZShpbm9kZSkpIHsKIAkJTFVTVFJFX0ZQUklWQVRFKGZpbGUpID0gTlVMTDsKQEAgLTM2NCw3ICszNTcsOCBAQAogCX0KIAogCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewotCQlsb3ZfcmVhZF9hbmRfY2xlYXJfYXN5bmNfcmMobGxpLT5sbGlfY2xvYik7CisJCWlmIChsbGktPmxsaV9jbG9iKQorCQkJbG92X3JlYWRfYW5kX2NsZWFyX2FzeW5jX3JjKGxsaS0+bGxpX2Nsb2IpOwogCQlsbGktPmxsaV9hc3luY19yYyA9IDA7CiAJfQogCkBAIC0zNzYsNTUgKzM3MCwzOSBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBsbF9pbnRlbnRfZmlsZV9vcGVuKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgdm9pZCAqbG1tLAotCQkJICAgICAgIGludCBsbW1zaXplLCBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXRwKQorc3RhdGljIGludCBsbF9pbnRlbnRfZmlsZV9vcGVuKHN0cnVjdCBkZW50cnkgKmRlLCB2b2lkICpsbW0sIGludCBsbW1zaXplLAorCQkJICAgICAgIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdHApCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGRfaW5vZGUoZGVudHJ5KTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZF9pbm9kZShkZSk7CiAJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGxsX2kyc2JpKGlub2RlKTsKLQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQgPSBkZW50cnktPmRfcGFyZW50OwotCWNvbnN0IGNoYXIgKm5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOwotCWNvbnN0IGludCBsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJc3RydWN0IGRlbnRyeSAqcGFyZW50ID0gZGUtPmRfcGFyZW50OworCWNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwogCXN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhOwotCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxOwotCV9fdTMyIG9wYyA9IExVU1RSRV9PUENfQU5ZOwotCWludCByYzsKKwlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSA9IE5VTEw7CisJaW50IGxlbiA9IDAsIHJjOwogCi0JLyogVXN1YWxseSB3ZSBjb21lIGhlcmUgb25seSBmb3IgTkZTRCwgYW5kIHdlIHdhbnQgb3BlbiBsb2NrLiAqLwotCS8qIFdlIGNhbiBhbHNvIGdldCBoZXJlIGlmIHRoZXJlIHdhcyBjYWNoZWQgb3BlbiBoYW5kbGUgaW4gcmV2YWxpZGF0ZV9pdAotCSAqIGJ1dCBpdCBkaXNhcHBlYXJlZCB3aGlsZSB3ZSB3ZXJlIGdldHRpbmcgZnJvbSB0aGVyZSB0byBsbF9maWxlX29wZW4uCi0JICogQnV0IHRoaXMgbWVhbnMgdGhpcyBmaWxlIHdhcyBjbG9zZWQgYW5kIGltbWVkaWF0ZWx5IG9wZW5lZCB3aGljaAotCSAqIG1ha2VzIGEgZ29vZCBjYW5kaWRhdGUgZm9yIHVzaW5nIE9QRU4gbG9jaworCUxBU1NFUlQocGFyZW50KTsKKwlMQVNTRVJUKGl0cC0+aXRfZmxhZ3MgJiBNRFNfT1BFTl9CWV9GSUQpOworCisJLyoKKwkgKiBpZiBzZXJ2ZXIgc3VwcG9ydHMgb3Blbi1ieS1maWQsIG9yIGZpbGUgbmFtZSBpcyBpbnZhbGlkLCBkb24ndCBwYWNrCisJICogbmFtZSBpbiBvcGVuIHJlcXVlc3QKIAkgKi8KLQkvKiBJZiBsbW1zaXplICYgbG1tIGFyZSBub3QgMCwgd2UgYXJlIGp1c3Qgc2V0dGluZyBzdHJpcGUgaW5mbwotCSAqIHBhcmFtZXRlcnMuIE5vIG5lZWQgZm9yIHRoZSBvcGVuIGxvY2sKLQkgKi8KLQlpZiAoIWxtbSAmJiBsbW1zaXplID09IDApIHsKLQkJc3RydWN0IGxsX2RlbnRyeV9kYXRhICpsZGQgPSBsbF9kMmQoZGVudHJ5KTsKLQkJLyoKLQkJICogSWYgd2UgY2FtZSB2aWEgbGxfaWdldF9mb3JfbmZzLCB0aGVuIHdlIG5lZWQgdG8gcmVxdWVzdAotCQkgKiBzdHJ1Y3QgbGxfZGVudHJ5X2RhdGEgKmxkZCA9IGxsX2QyZChmaWxlLT5mX2RlbnRyeSk7Ci0JCSAqCi0JCSAqIE5COiB3aGVuIGxkZCBpcyBOVUxMLCBpdCBtdXN0IGhhdmUgY29tZSB2aWEgbm9ybWFsCi0JCSAqIGxvb2t1cCBwYXRoIG9ubHksIHNpbmNlIGxsX2lnZXRfZm9yX25mcyBhbHdheXMgY2FsbHMKLQkJICogbGxfZF9pbml0KCkuCi0JCSAqLwotCQlpZiAobGRkICYmIGxkZC0+bGxkX25mc19kZW50cnkpIHsKLQkJCWxkZC0+bGxkX25mc19kZW50cnkgPSAwOwotCQkJaXRwLT5pdF9mbGFncyB8PSBNRFNfT1BFTl9MT0NLOwotCQl9Ci0JCWlmIChpdHAtPml0X2ZsYWdzICYgRk1PREVfV1JJVEUpCi0JCQlvcGMgPSBMVVNUUkVfT1BDX0NSRUFURTsKKwlpZiAoIShleHBfY29ubmVjdF9mbGFncyhzYmktPmxsX21kX2V4cCkgJiBPQkRfQ09OTkVDVF9PUEVOX0JZX0ZJRCkgJiYKKwkgICAgbHVfbmFtZV9pc192YWxpZF8yKGRlLT5kX25hbWUubmFtZSwgZGUtPmRfbmFtZS5sZW4pKSB7CisJCW5hbWUgPSBkZS0+ZF9uYW1lLm5hbWU7CisJCWxlbiA9IGRlLT5kX25hbWUubGVuOwogCX0KIAotCW9wX2RhdGEgID0gbGxfcHJlcF9tZF9vcF9kYXRhKE5VTEwsIGRfaW5vZGUocGFyZW50KSwKLQkJCQkgICAgICBpbm9kZSwgbmFtZSwgbGVuLAotCQkJCSAgICAgIE9fUkRXUiwgb3BjLCBOVUxMKTsKKwlvcF9kYXRhICA9IGxsX3ByZXBfbWRfb3BfZGF0YShOVUxMLCBkX2lub2RlKHBhcmVudCksIGlub2RlLCBuYW1lLCBsZW4sCisJCQkJICAgICAgT19SRFdSLCBMVVNUUkVfT1BDX0FOWSwgTlVMTCk7CiAJaWYgKElTX0VSUihvcF9kYXRhKSkKIAkJcmV0dXJuIFBUUl9FUlIob3BfZGF0YSk7CisJb3BfZGF0YS0+b3BfZGF0YSA9IGxtbTsKKwlvcF9kYXRhLT5vcF9kYXRhX3NpemUgPSBsbW1zaXplOwogCi0JaXRwLT5pdF9mbGFncyB8PSBNRFNfT1BFTl9CWV9GSUQ7Ci0JcmMgPSBtZF9pbnRlbnRfbG9jayhzYmktPmxsX21kX2V4cCwgb3BfZGF0YSwgbG1tLCBsbW1zaXplLCBpdHAsCi0JCQkgICAgMCAvKnVudXNlZCAqLywgJnJlcSwgbGxfbWRfYmxvY2tpbmdfYXN0LCAwKTsKKwlyYyA9IG1kX2ludGVudF9sb2NrKHNiaS0+bGxfbWRfZXhwLCBvcF9kYXRhLCBpdHAsICZyZXEsCisJCQkgICAgJmxsX21kX2Jsb2NraW5nX2FzdCwgMCk7CiAJbGxfZmluaXNoX21kX29wX2RhdGEob3BfZGF0YSk7CiAJaWYgKHJjID09IC1FU1RBTEUpIHsKIAkJLyogcmVhc29uIGZvciBrZWVwIG93biBleGl0IHBhdGggLSBkb25gdCBmbG9vZCBsb2cKQEAgLTQ3OSw4ICs0NTcsOCBAQAogCXN0cnVjdCBtZHRfYm9keSAqYm9keTsKIAogCWJvZHkgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfZ2V0KCZpdC0+aXRfcmVxdWVzdC0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7Ci0Jb2NoLT5vY2hfZmggPSBib2R5LT5oYW5kbGU7Ci0Jb2NoLT5vY2hfZmlkID0gYm9keS0+ZmlkMTsKKwlvY2gtPm9jaF9maCA9IGJvZHktPm1ib19oYW5kbGU7CisJb2NoLT5vY2hfZmlkID0gYm9keS0+bWJvX2ZpZDE7CiAJb2NoLT5vY2hfbGVhc2VfaGFuZGxlLmNvb2tpZSA9IGl0LT5pdF9sb2NrX2hhbmRsZTsKIAlvY2gtPm9jaF9tYWdpYyA9IE9CRF9DTElFTlRfSEFORExFX01BR0lDOwogCW9jaC0+b2NoX2ZsYWdzID0gaXQtPml0X2ZsYWdzOwpAQCAtNTA4LDcgKzQ4Niw3IEBACiAKIAkJYm9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJml0LT5pdF9yZXF1ZXN0LT5ycV9waWxsLAogCQkJCQkgICAgICAmUk1GX01EVF9CT0RZKTsKLQkJbGxfaW9lcG9jaF9vcGVuKGxsaSwgYm9keS0+aW9lcG9jaCk7CisJCWxsX2lvZXBvY2hfb3BlbihsbGksIGJvZHktPm1ib19pb2Vwb2NoKTsKIAl9CiAKIAlMVVNUUkVfRlBSSVZBVEUoZmlsZSkgPSBmZDsKQEAgLTU0Myw3ICs1MjEsNyBAQAogCXN0cnVjdCBvYmRfY2xpZW50X2hhbmRsZSAqKm9jaF9wID0gTlVMTDsKIAlfX3U2NCAqb2NoX3VzZWNvdW50ID0gTlVMTDsKIAlzdHJ1Y3QgbGxfZmlsZV9kYXRhICpmZDsKLQlpbnQgcmMgPSAwLCBvcGVuZGlyX3NldCA9IDA7CisJaW50IHJjID0gMDsKIAogCUNERUJVRyhEX1ZGU1RSQUNFLCAiVkZTIE9wOmlub2RlPSJERklEIiglcCksIGZsYWdzICVvXG4iLAogCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpLCBpbm9kZSwgZmlsZS0+Zl9mbGFncyk7CkBAIC01NTgsMTYgKzUzNiw4IEBACiAJfQogCiAJZmQtPmZkX2ZpbGUgPSBmaWxlOwotCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7Ci0JCXNwaW5fbG9jaygmbGxpLT5sbGlfc2FfbG9jayk7Ci0JCWlmICghbGxpLT5sbGlfb3BlbmRpcl9rZXkgJiYgIWxsaS0+bGxpX3NhaSAmJgotCQkgICAgbGxpLT5sbGlfb3BlbmRpcl9waWQgPT0gMCkgewotCQkJbGxpLT5sbGlfb3BlbmRpcl9rZXkgPSBmZDsKLQkJCWxsaS0+bGxpX29wZW5kaXJfcGlkID0gY3VycmVudF9waWQoKTsKLQkJCW9wZW5kaXJfc2V0ID0gMTsKLQkJfQotCQlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7Ci0JfQorCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQlsbF9hdXRob3JpemVfc3RhdGFoZWFkKGlub2RlLCBmZCk7CiAKIAlpZiAoaXNfcm9vdF9pbm9kZShpbm9kZSkpIHsKIAkJTFVTVFJFX0ZQUklWQVRFKGZpbGUpID0gZmQ7CkBAIC02MTUsNyArNTg1LDcgQEAKIAl9IGVsc2UgaWYgKGl0LT5pdF9mbGFncyAmIEZNT0RFX0VYRUMpIHsKIAkJb2NoX3AgPSAmbGxpLT5sbGlfbWRzX2V4ZWNfb2NoOwogCQlvY2hfdXNlY291bnQgPSAmbGxpLT5sbGlfb3Blbl9mZF9leGVjX2NvdW50OwotCSB9IGVsc2UgeworCX0gZWxzZSB7CiAJCW9jaF9wID0gJmxsaS0+bGxpX21kc19yZWFkX29jaDsKIAkJb2NoX3VzZWNvdW50ID0gJmxsaS0+bGxpX29wZW5fZmRfcmVhZF9jb3VudDsKIAl9CkBAIC02NTIsOSArNjIyLDE5IEBACiAJCQkgKiByZXN1bHQgaW4gYSBkZWFkbG9jawogCQkJICovCiAJCQltdXRleF91bmxvY2soJmxsaS0+bGxpX29jaF9tdXRleCk7Ci0JCQlpdC0+aXRfY3JlYXRlX21vZGUgfD0gTV9DSEVDS19TVEFMRTsKKwkJCS8qCisJCQkgKiBOb3JtYWxseSBjYWxsZWQgdW5kZXIgdHdvIHNpdHVhdGlvbnM6CisJCQkgKiAxLiBORlMgZXhwb3J0LgorCQkJICogMi4gcmV2YWxpZGF0ZSB3aXRoIElUX09QRU4gKHJldmFsaWRhdGUgZG9lc24ndAorCQkJICogICAgZXhlY3V0ZSB0aGlzIGludGVudCBhbnkgbW9yZSkuCisJCQkgKgorCQkJICogQWx3YXlzIGZldGNoIE1EU19PUEVOX0xPQ0sgaWYgdGhpcyBpcyBub3Qgc2V0c3RyaXBlLgorCQkJICoKKwkJCSAqIEFsd2F5cyBzcGVjaWZ5IE1EU19PUEVOX0JZX0ZJRCBiZWNhdXNlIHdlIGRvbid0IHdhbnQKKwkJCSAqIHRvIGdldCBmaWxlIHdpdGggZGlmZmVyZW50IGZpZC4KKwkJCSAqLworCQkJaXQtPml0X2ZsYWdzIHw9IE1EU19PUEVOX0xPQ0sgfCBNRFNfT1BFTl9CWV9GSUQ7CiAJCQlyYyA9IGxsX2ludGVudF9maWxlX29wZW4oZmlsZS0+Zl9wYXRoLmRlbnRyeSwgTlVMTCwgMCwgaXQpOwotCQkJaXQtPml0X2NyZWF0ZV9tb2RlICY9IH5NX0NIRUNLX1NUQUxFOwogCQkJaWYgKHJjKQogCQkJCWdvdG8gb3V0X29wZW5lcnI7CiAKQEAgLTcxNiw5ICs2OTYsMTAgQEAKIAkJbXV0ZXhfdW5sb2NrKCZsbGktPmxsaV9vY2hfbXV0ZXgpOwogCiBvdXRfb3BlbmVycjoKLQkJaWYgKG9wZW5kaXJfc2V0ICE9IDApCi0JCQlsbF9zdG9wX3N0YXRhaGVhZChpbm9kZSwgbGxpLT5sbGlfb3BlbmRpcl9rZXkpOwotCQlsbF9maWxlX2RhdGFfcHV0KGZkKTsKKwkJaWYgKGxsaS0+bGxpX29wZW5kaXJfa2V5ID09IGZkKQorCQkJbGxfZGVhdXRob3JpemVfc3RhdGFoZWFkKGlub2RlLCBmZCk7CisJCWlmIChmZCkKKwkJCWxsX2ZpbGVfZGF0YV9wdXQoZmQpOwogCX0gZWxzZSB7CiAJCWxsX3N0YXRzX29wc190YWxseShsbF9pMnNiaShpbm9kZSksIExQUk9DX0xMX09QRU4sIDEpOwogCX0KQEAgLTc2NCw3ICs3NDUsNyBAQAogCXN0cnVjdCBsb29rdXBfaW50ZW50IGl0ID0geyAuaXRfb3AgPSBJVF9PUEVOIH07CiAJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGxsX2kyc2JpKGlub2RlKTsKIAlzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YTsKLQlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcTsKKwlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSA9IE5VTEw7CiAJc3RydWN0IGx1c3RyZV9oYW5kbGUgb2xkX2hhbmRsZSA9IHsgMCB9OwogCXN0cnVjdCBvYmRfY2xpZW50X2hhbmRsZSAqb2NoID0gTlVMTDsKIAlpbnQgcmM7CkBAIC04MzEsOCArODEyLDggQEAKIAogCWl0Lml0X2ZsYWdzID0gZm1vZGUgfCBvcGVuX2ZsYWdzOwogCWl0Lml0X2ZsYWdzIHw9IE1EU19PUEVOX0xPQ0sgfCBNRFNfT1BFTl9CWV9GSUQgfCBNRFNfT1BFTl9MRUFTRTsKLQlyYyA9IG1kX2ludGVudF9sb2NrKHNiaS0+bGxfbWRfZXhwLCBvcF9kYXRhLCBOVUxMLCAwLCAmaXQsIDAsICZyZXEsCi0JCQkgICAgbGxfbWRfYmxvY2tpbmdfbGVhc2VfYXN0LAorCXJjID0gbWRfaW50ZW50X2xvY2soc2JpLT5sbF9tZF9leHAsIG9wX2RhdGEsICZpdCwgJnJlcSwKKwkJCSAgICAmbGxfbWRfYmxvY2tpbmdfbGVhc2VfYXN0LAogCS8qIExETE1fRkxfTk9fTFJVOiBUbyBub3QgcHV0IHRoZSBsZWFzZSBsb2NrIGludG8gTFJVIGxpc3QsIG90aGVyd2lzZQogCSAqIGl0IGNhbiBiZSBjYW5jZWxsZWQgd2hpY2ggbWF5IG1pc2xlYWQgYXBwbGljYXRpb25zIHRoYXQgdGhlIGxlYXNlIGlzCiAJICogYnJva2VuOwpAQCAtODQwLDcgKzgyMSw3IEBACiAJICogb3BlbiBpbiBsbF9tZF9ibG9ja2luZ19hc3QoKS4gT3RoZXJ3aXNlIGFzIGxsX21kX2Jsb2NraW5nX2xlYXNlX2FzdAogCSAqIGRvZXNuJ3QgZGVhbCB3aXRoIG9wZW5oYW5kbGUsIHNvIG5vcm1hbCBvcGVuaGFuZGxlIHdpbGwgYmUgbGVha2VkLgogCSAqLwotCQkJCUxETE1fRkxfTk9fTFJVIHwgTERMTV9GTF9FWENMKTsKKwkJCSAgICBMRExNX0ZMX05PX0xSVSB8IExETE1fRkxfRVhDTCk7CiAJbGxfZmluaXNoX21kX29wX2RhdGEob3BfZGF0YSk7CiAJcHRscnBjX3JlcV9maW5pc2hlZChyZXEpOwogCWlmIChyYyA8IDApCkBAIC05MDgsNyArODg5LDYgQEAKIHsKIAlzdHJ1Y3QgbGRsbV9sb2NrICpsb2NrOwogCWJvb2wgY2FuY2VsbGVkID0gdHJ1ZTsKLQlpbnQgcmM7CiAKIAlsb2NrID0gbGRsbV9oYW5kbGUybG9jaygmb2NoLT5vY2hfbGVhc2VfaGFuZGxlKTsKIAlpZiAobG9jaykgewpAQCAtOTI2LDkgKzkwNiw4IEBACiAJaWYgKGxlYXNlX2Jyb2tlbikKIAkJKmxlYXNlX2Jyb2tlbiA9IGNhbmNlbGxlZDsKIAotCXJjID0gbGxfY2xvc2VfaW5vZGVfb3BlbmhhbmRsZShsbF9pMnNiaShpbm9kZSktPmxsX21kX2V4cCwgaW5vZGUsIG9jaCwKLQkJCQkgICAgICAgTlVMTCk7Ci0JcmV0dXJuIHJjOworCXJldHVybiBsbF9jbG9zZV9pbm9kZV9vcGVuaGFuZGxlKGxsX2kyc2JpKGlub2RlKS0+bGxfbWRfZXhwLAorCQkJCQkgaW5vZGUsIG9jaCwgTlVMTCk7CiB9CiAKIC8qIEZpbGxzIHRoZSBvYmRvIHdpdGggdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBsc20gKi8KQEAgLTExMzgsMTAgKzExMTcsMTEgQEAKIHsKIAlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGZpbGVfaW5vZGUoZmlsZSkpOwogCXN0cnVjdCBsbF9maWxlX2RhdGEgICpmZCAgPSBMVVNUUkVfRlBSSVZBVEUoZmlsZSk7CisJc3RydWN0IHJhbmdlX2xvY2sgcmFuZ2U7CiAJc3RydWN0IGNsX2lvCSAqaW87CiAJc3NpemVfdAkgICAgICAgcmVzdWx0OwogCi0JQ0RFQlVHKERfVkZTVFJBQ0UsICJmaWxlOiAlcywgdHlwZTogJWQgcHBvczogJWxsdSwgY291bnQ6ICV6ZFxuIiwKKwlDREVCVUcoRF9WRlNUUkFDRSwgImZpbGU6ICVzLCB0eXBlOiAlZCBwcG9zOiAlbGx1LCBjb3VudDogJXp1XG4iLAogCSAgICAgICBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX25hbWUubmFtZSwgaW90LCAqcHBvcywgY291bnQpOwogCiByZXN0YXJ0OgpAQCAtMTE1MCw3ICsxMTMwLDEyIEBACiAKIAlpZiAoY2xfaW9fcndfaW5pdChlbnYsIGlvLCBpb3QsICpwcG9zLCBjb3VudCkgPT0gMCkgewogCQlzdHJ1Y3QgdnZwX2lvICp2aW8gPSB2dnBfZW52X2lvKGVudik7Ci0JCWludCB3cml0ZV9tdXRleF9sb2NrZWQgPSAwOworCQlib29sIHJhbmdlX2xvY2tlZCA9IGZhbHNlOworCisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19BUFBFTkQpCisJCQlyYW5nZV9sb2NrX2luaXQoJnJhbmdlLCAwLCBMVVNUUkVfRU9GKTsKKwkJZWxzZQorCQkJcmFuZ2VfbG9ja19pbml0KCZyYW5nZSwgKnBwb3MsICpwcG9zICsgY291bnQgLSAxKTsKIAogCQl2aW8tPnZ1aV9mZCAgPSBMVVNUUkVfRlBSSVZBVEUoZmlsZSk7CiAJCXZpby0+dnVpX2lvX3N1YnR5cGUgPSBhcmdzLT52aWFfaW9fc3VidHlwZTsKQEAgLTExNTksMTQgKzExNDQsMjMgQEAKIAkJY2FzZSBJT19OT1JNQUw6CiAJCQl2aW8tPnZ1aV9pdGVyID0gYXJncy0+dS5ub3JtYWwudmlhX2l0ZXI7CiAJCQl2aW8tPnZ1aV9pb2NiID0gYXJncy0+dS5ub3JtYWwudmlhX2lvY2I7Ci0JCQlpZiAoKGlvdCA9PSBDSVRfV1JJVEUpICYmCisJCQkvKgorCQkJICogRGlyZWN0IElPIHJlYWRzIG11c3QgYWxzbyB0YWtlIHJhbmdlIGxvY2ssCisJCQkgKiBvciBtdWx0aXBsZSByZWFkcyB3aWxsIHRyeSB0byB3b3JrIG9uIHRoZSBzYW1lIHBhZ2VzCisJCQkgKiBTZWUgTFUtNjIyNyBmb3IgZGV0YWlscy4KKwkJCSAqLworCQkJaWYgKCgoaW90ID09IENJVF9XUklURSkgfHwKKwkJCSAgICAgKGlvdCA9PSBDSVRfUkVBRCAmJiAoZmlsZS0+Zl9mbGFncyAmIE9fRElSRUNUKSkpICYmCiAJCQkgICAgISh2aW8tPnZ1aV9mZC0+ZmRfZmxhZ3MgJiBMTF9GSUxFX0dST1VQX0xPQ0tFRCkpIHsKLQkJCQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZsbGktPgotCQkJCQkJCSAgICAgICBsbGlfd3JpdGVfbXV0ZXgpKSB7Ci0JCQkJCXJlc3VsdCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlDREVCVUcoRF9WRlNUUkFDRSwgIlJhbmdlIGxvY2sgWyVsbHUsICVsbHVdXG4iLAorCQkJCSAgICAgICByYW5nZS5ybF9ub2RlLmluX2V4dGVudC5zdGFydCwKKwkJCQkgICAgICAgcmFuZ2Uucmxfbm9kZS5pbl9leHRlbnQuZW5kKTsKKwkJCQlyZXN1bHQgPSByYW5nZV9sb2NrKCZsbGktPmxsaV93cml0ZV90cmVlLAorCQkJCQkJICAgICZyYW5nZSk7CisJCQkJaWYgKHJlc3VsdCA8IDApCiAJCQkJCWdvdG8gb3V0OwotCQkJCX0KLQkJCQl3cml0ZV9tdXRleF9sb2NrZWQgPSAxOworCisJCQkJcmFuZ2VfbG9ja2VkID0gdHJ1ZTsKIAkJCX0KIAkJCWRvd25fcmVhZCgmbGxpLT5sbGlfdHJ1bmNfc2VtKTsKIAkJCWJyZWFrOwpAQCAtMTE4Myw4ICsxMTc3LDEyIEBACiAJCWxsX2NsX3JlbW92ZShmaWxlLCBlbnYpOwogCQlpZiAoYXJncy0+dmlhX2lvX3N1YnR5cGUgPT0gSU9fTk9STUFMKQogCQkJdXBfcmVhZCgmbGxpLT5sbGlfdHJ1bmNfc2VtKTsKLQkJaWYgKHdyaXRlX211dGV4X2xvY2tlZCkKLQkJCW11dGV4X3VubG9jaygmbGxpLT5sbGlfd3JpdGVfbXV0ZXgpOworCQlpZiAocmFuZ2VfbG9ja2VkKSB7CisJCQlDREVCVUcoRF9WRlNUUkFDRSwgIlJhbmdlIHVubG9jayBbJWxsdSwgJWxsdV1cbiIsCisJCQkgICAgICAgcmFuZ2Uucmxfbm9kZS5pbl9leHRlbnQuc3RhcnQsCisJCQkgICAgICAgcmFuZ2Uucmxfbm9kZS5pbl9leHRlbnQuZW5kKTsKKwkJCXJhbmdlX3VubG9jaygmbGxpLT5sbGlfd3JpdGVfdHJlZSwgJnJhbmdlKTsKKwkJfQogCX0gZWxzZSB7CiAJCS8qIGNsX2lvX3J3X2luaXQoKSBoYW5kbGVkIElPICovCiAJCXJlc3VsdCA9IGlvLT5jaV9yZXN1bHQ7CkBAIC0xMjAxLDcgKzExOTksNyBAQAogCSAqIHNob3J0IHJlYWQvd3JpdGUgaW5zdGVhZCBvZiByZXN0YXJ0IGlvLgogCSAqLwogCWlmICgocmVzdWx0ID09IDAgfHwgcmVzdWx0ID09IC1FTk9EQVRBKSAmJiBpby0+Y2lfbmVlZF9yZXN0YXJ0KSB7Ci0JCUNERUJVRyhEX1ZGU1RSQUNFLCAiUmVzdGFydCAlcyBvbiAlcEQgZnJvbSAlbGxkLCBjb3VudDolemRcbiIsCisJCUNERUJVRyhEX1ZGU1RSQUNFLCAiUmVzdGFydCAlcyBvbiAlcEQgZnJvbSAlbGxkLCBjb3VudDolenVcbiIsCiAJCSAgICAgICBpb3QgPT0gQ0lUX1JFQUQgPyAicmVhZCIgOiAid3JpdGUiLAogCQkgICAgICAgZmlsZSwgKnBwb3MsIGNvdW50KTsKIAkJTEFTU0VSVEYoaW8tPmNpX25vYiA9PSAwLCAiJXpkXG4iLCBpby0+Y2lfbm9iKTsKQEAgLTEyOTYsOTQgKzEyOTQsMTUgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgaW50IGxsX2xvdl9yZWNyZWF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgb3N0X2lkICpvaSwgdTMyIG9zdF9pZHgpCi17Ci0Jc3RydWN0IG9iZF9leHBvcnQgKmV4cCA9IGxsX2kyZHRleHAoaW5vZGUpOwotCXN0cnVjdCBvYmRfdHJhbnNfaW5mbyBvdGkgPSB7IDAgfTsKLQlzdHJ1Y3Qgb2JkbyAqb2EgPSBOVUxMOwotCWludCBsc21fc2l6ZTsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20gPSBOVUxMLCAqbHNtMjsKLQotCW9hID0ga21lbV9jYWNoZV96YWxsb2Mob2Jkb19jYWNoZXAsIEdGUF9OT0ZTKTsKLQlpZiAoIW9hKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWxzbSA9IGNjY19pbm9kZV9sc21fZ2V0KGlub2RlKTsKLQlpZiAoIWxzbV9oYXNfb2JqZWN0cyhsc20pKSB7Ci0JCXJjID0gLUVOT0VOVDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JbHNtX3NpemUgPSBzaXplb2YoKmxzbSkgKyAoc2l6ZW9mKHN0cnVjdCBsb3Zfb2luZm8pICoKLQkJICAgKGxzbS0+bHNtX3N0cmlwZV9jb3VudCkpOwotCi0JbHNtMiA9IGxpYmNmc19rdnphbGxvYyhsc21fc2l6ZSwgR0ZQX05PRlMpOwotCWlmICghbHNtMikgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQotCW9hLT5vX29pID0gKm9pOwotCW9hLT5vX25saW5rID0gb3N0X2lkeDsKLQlvYS0+b19mbGFncyB8PSBPQkRfRkxfUkVDUkVBVEVfT0JKUzsKLQlvYS0+b192YWxpZCA9IE9CRF9NRF9GTElEIHwgT0JEX01EX0ZMRkxBR1MgfCBPQkRfTURfRkxHUk9VUDsKLQlvYmRvX2Zyb21faW5vZGUob2EsIGlub2RlLCBPQkRfTURfRkxUWVBFIHwgT0JEX01EX0ZMQVRJTUUgfAotCQkJCSAgIE9CRF9NRF9GTE1USU1FIHwgT0JEX01EX0ZMQ1RJTUUpOwotCW9iZG9fc2V0X3BhcmVudF9maWQob2EsICZsbF9pMmluZm8oaW5vZGUpLT5sbGlfZmlkKTsKLQltZW1jcHkobHNtMiwgbHNtLCBsc21fc2l6ZSk7Ci0JbGxfaW5vZGVfc2l6ZV9sb2NrKGlub2RlKTsKLQlyYyA9IG9iZF9jcmVhdGUoTlVMTCwgZXhwLCBvYSwgJmxzbTIsICZvdGkpOwotCWxsX2lub2RlX3NpemVfdW5sb2NrKGlub2RlKTsKLQotCWt2ZnJlZShsc20yKTsKLQlnb3RvIG91dDsKLW91dDoKLQljY2NfaW5vZGVfbHNtX3B1dChpbm9kZSwgbHNtKTsKLQlrbWVtX2NhY2hlX2ZyZWUob2Jkb19jYWNoZXAsIG9hKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgbGxfbG92X3JlY3JlYXRlX29iaihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgbGxfcmVjcmVhdGVfb2JqIHVjcmVhdDsKLQlzdHJ1Y3Qgb3N0X2lkCQlvaTsKLQotCWlmICghY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCi0JCXJldHVybiAtRVBFUk07Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnVjcmVhdCwgKHN0cnVjdCBsbF9yZWNyZWF0ZV9vYmogX191c2VyICopYXJnLAotCQkJICAgc2l6ZW9mKHVjcmVhdCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCW9zdGlkX3NldF9zZXFfbWR0MCgmb2kpOwotCW9zdGlkX3NldF9pZCgmb2ksIHVjcmVhdC5scmNfaWQpOwotCXJldHVybiBsbF9sb3ZfcmVjcmVhdGUoaW5vZGUsICZvaSwgdWNyZWF0LmxyY19vc3RfaWR4KTsKLX0KLQotc3RhdGljIGludCBsbF9sb3ZfcmVjcmVhdGVfZmlkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBsdV9maWQJZmlkOwotCXN0cnVjdCBvc3RfaWQJb2k7Ci0JdTMyCQlvc3RfaWR4OwotCi0JaWYgKCFjYXBhYmxlKENGU19DQVBfU1lTX0FETUlOKSkKLQkJcmV0dXJuIC1FUEVSTTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmZmlkLCAoc3RydWN0IGx1X2ZpZCBfX3VzZXIgKilhcmcsIHNpemVvZihmaWQpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlmaWRfdG9fb3N0aWQoJmZpZCwgJm9pKTsKLQlvc3RfaWR4ID0gKGZpZF9zZXEoJmZpZCkgPj4gMTYpICYgMHhmZmZmOwotCXJldHVybiBsbF9sb3ZfcmVjcmVhdGUoaW5vZGUsICZvaSwgb3N0X2lkeCk7Ci19Ci0KIGludCBsbF9sb3Zfc2V0c3RyaXBlX2VhX2luZm8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJICAgICBfX3U2NCBmbGFncywgc3RydWN0IGxvdl91c2VyX21kICpsdW0sCiAJCQkgICAgIGludCBsdW1fc2l6ZSkKIHsKIAlzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtID0gTlVMTDsKLQlzdHJ1Y3QgbG9va3VwX2ludGVudCBvaXQgPSB7Lml0X29wID0gSVRfT1BFTiwgLml0X2ZsYWdzID0gZmxhZ3N9OworCXN0cnVjdCBsb29rdXBfaW50ZW50IG9pdCA9IHsKKwkJLml0X29wID0gSVRfT1BFTiwKKwkJLml0X2ZsYWdzID0gZmxhZ3MgfCBNRFNfT1BFTl9CWV9GSUQsCisJfTsKIAlpbnQgcmMgPSAwOwogCiAJbHNtID0gY2NjX2lub2RlX2xzbV9nZXQoaW5vZGUpOwpAQCAtMTM5NywxMSArMTMxNiwxMSBAQAogCiAJbGxfaW5vZGVfc2l6ZV9sb2NrKGlub2RlKTsKIAlyYyA9IGxsX2ludGVudF9maWxlX29wZW4oZGVudHJ5LCBsdW0sIGx1bV9zaXplLCAmb2l0KTsKLQlpZiAocmMpCisJaWYgKHJjIDwgMCkKIAkJZ290byBvdXRfdW5sb2NrOwogCXJjID0gb2l0Lml0X3N0YXR1czsKIAlpZiAocmMgPCAwKQotCQlnb3RvIG91dF9yZXFfZnJlZTsKKwkJZ290byBvdXRfdW5sb2NrOwogCiAJbGxfcmVsZWFzZV9vcGVuaGFuZGxlKGlub2RlLCAmb2l0KTsKIApAQCAtMTQxMSw5ICsxMzMwLDYgQEAKIAljY2NfaW5vZGVfbHNtX3B1dChpbm9kZSwgbHNtKTsKIG91dDoKIAlyZXR1cm4gcmM7Ci1vdXRfcmVxX2ZyZWU6Ci0JcHRscnBjX3JlcV9maW5pc2hlZCgoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICopb2l0Lml0X3JlcXVlc3QpOwotCWdvdG8gb3V0OwogfQogCiBpbnQgbGxfbG92X2dldHN0cmlwZV9lYV9pbmZvKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLApAQCAtMTQ0OCw5ICsxMzY0LDkgQEAKIAogCWJvZHkgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfTURUX0JPRFkpOwogCi0JbG1tc2l6ZSA9IGJvZHktPmVhZGF0YXNpemU7CisJbG1tc2l6ZSA9IGJvZHktPm1ib19lYWRhdGFzaXplOwogCi0JaWYgKCEoYm9keS0+dmFsaWQgJiAoT0JEX01EX0ZMRUFTSVpFIHwgT0JEX01EX0ZMRElSRUEpKSB8fAorCWlmICghKGJvZHktPm1ib192YWxpZCAmIChPQkRfTURfRkxFQVNJWkUgfCBPQkRfTURfRkxESVJFQSkpIHx8CiAJICAgIGxtbXNpemUgPT0gMCkgewogCQlyYyA9IC1FTk9EQVRBOwogCQlnb3RvIG91dDsKQEAgLTE0ODEsMTMgKzEzOTcsMTMgQEAKIAkJICovCiAJCWlmIChsbW0tPmxtbV9tYWdpYyA9PSBjcHVfdG9fbGUzMihMT1ZfTUFHSUNfVjEpKSB7CiAJCQlsdXN0cmVfc3dhYl9sb3ZfdXNlcl9tZF92MSgoc3RydWN0IGxvdl91c2VyX21kX3YxICopbG1tKTsKLQkJCWlmIChTX0lTUkVHKGJvZHktPm1vZGUpKQorCQkJaWYgKFNfSVNSRUcoYm9keS0+bWJvX21vZGUpKQogCQkJCWx1c3RyZV9zd2FiX2xvdl91c2VyX21kX29iamVjdHMoCiAJCQkJICgoc3RydWN0IGxvdl91c2VyX21kX3YxICopbG1tKS0+bG1tX29iamVjdHMsCiAJCQkJIHN0cmlwZV9jb3VudCk7CiAJCX0gZWxzZSBpZiAobG1tLT5sbW1fbWFnaWMgPT0gY3B1X3RvX2xlMzIoTE9WX01BR0lDX1YzKSkgewogCQkJbHVzdHJlX3N3YWJfbG92X3VzZXJfbWRfdjMoKHN0cnVjdCBsb3ZfdXNlcl9tZF92MyAqKWxtbSk7Ci0JCQlpZiAoU19JU1JFRyhib2R5LT5tb2RlKSkKKwkJCWlmIChTX0lTUkVHKGJvZHktPm1ib19tb2RlKSkKIAkJCQlsdXN0cmVfc3dhYl9sb3ZfdXNlcl9tZF9vYmplY3RzKAogCQkJCSAoKHN0cnVjdCBsb3ZfdXNlcl9tZF92MyAqKWxtbSktPmxtbV9vYmplY3RzLAogCQkJCSBzdHJpcGVfY291bnQpOwpAQCAtMTUzMCw1NSArMTQ0Niw0OCBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBsbF9sb3Zfc2V0c3RyaXBlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCBsbF9maWxlX2dldHN0cmlwZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICBzdHJ1Y3QgbG92X3VzZXJfbWQgX191c2VyICpsdW0pCiB7Ci0Jc3RydWN0IGxvdl91c2VyX21kX3YzIGx1bXYzOwotCXN0cnVjdCBsb3ZfdXNlcl9tZF92MSAqbHVtdjEgPSAoc3RydWN0IGxvdl91c2VyX21kX3YxICopJmx1bXYzOwotCXN0cnVjdCBsb3ZfdXNlcl9tZF92MSBfX3VzZXIgKmx1bXYxcCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlzdHJ1Y3QgbG92X3VzZXJfbWRfdjMgX191c2VyICpsdW12M3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JaW50IGx1bV9zaXplLCByYzsKLQlfX3U2NCBmbGFncyA9IEZNT0RFX1dSSVRFOworCXN0cnVjdCBsdV9lbnYgKmVudjsKKwlpbnQgcmVmY2hlY2s7CisJaW50IHJjOwogCi0JLyogZmlyc3QgdHJ5IHdpdGggdjEgd2hpY2ggaXMgc21hbGxlciB0aGFuIHYzICovCi0JbHVtX3NpemUgPSBzaXplb2Yoc3RydWN0IGxvdl91c2VyX21kX3YxKTsKLQlpZiAoY29weV9mcm9tX3VzZXIobHVtdjEsIGx1bXYxcCwgbHVtX3NpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKKwllbnYgPSBjbF9lbnZfZ2V0KCZyZWZjaGVjayk7CisJaWYgKElTX0VSUihlbnYpKQorCQlyZXR1cm4gUFRSX0VSUihlbnYpOwogCi0JaWYgKGx1bXYxLT5sbW1fbWFnaWMgPT0gTE9WX1VTRVJfTUFHSUNfVjMpIHsKLQkJbHVtX3NpemUgPSBzaXplb2Yoc3RydWN0IGxvdl91c2VyX21kX3YzKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZsdW12MywgbHVtdjNwLCBsdW1fc2l6ZSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlyYyA9IGxsX2xvdl9zZXRzdHJpcGVfZWFfaW5mbyhpbm9kZSwgZmlsZS0+Zl9wYXRoLmRlbnRyeSwgZmxhZ3MsIGx1bXYxLAotCQkJCSAgICAgIGx1bV9zaXplKTsKLQljbF9sb3ZfZGVsYXlfY3JlYXRlX2NsZWFyKCZmaWxlLT5mX2ZsYWdzKTsKLQlpZiAocmMgPT0gMCkgewotCQlzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtOwotCQlfX3UzMiBnZW47Ci0KLQkJcHV0X3VzZXIoMCwgJmx1bXYxcC0+bG1tX3N0cmlwZV9jb3VudCk7Ci0KLQkJbGxfbGF5b3V0X3JlZnJlc2goaW5vZGUsICZnZW4pOwotCQlsc20gPSBjY2NfaW5vZGVfbHNtX2dldChpbm9kZSk7Ci0JCXJjID0gb2JkX2lvY29udHJvbChMTF9JT0NfTE9WX0dFVFNUUklQRSwgbGxfaTJkdGV4cChpbm9kZSksCi0JCQkJICAgMCwgbHNtLCAodm9pZCBfX3VzZXIgKilhcmcpOwotCQljY2NfaW5vZGVfbHNtX3B1dChpbm9kZSwgbHNtKTsKLQl9CisJcmMgPSBjbF9vYmplY3RfZ2V0c3RyaXBlKGVudiwgbGxfaTJpbmZvKGlub2RlKS0+bGxpX2Nsb2IsIGx1bSk7CisJY2xfZW52X3B1dChlbnYsICZyZWZjaGVjayk7CiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IGxsX2xvdl9nZXRzdHJpcGUoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgaW50IGxsX2xvdl9zZXRzdHJpcGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0Jc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbTsKLQlpbnQgcmMgPSAtRU5PREFUQTsKKwlzdHJ1Y3QgbG92X3VzZXJfbWQgX191c2VyICpsdW0gPSAoc3RydWN0IGxvdl91c2VyX21kIF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3QgbG92X3VzZXJfbWQgKmtsdW07CisJaW50IGx1bV9zaXplLCByYzsKKwlfX3U2NCBmbGFncyA9IEZNT0RFX1dSSVRFOwogCi0JbHNtID0gY2NjX2lub2RlX2xzbV9nZXQoaW5vZGUpOwotCWlmIChsc20pCi0JCXJjID0gb2JkX2lvY29udHJvbChMTF9JT0NfTE9WX0dFVFNUUklQRSwgbGxfaTJkdGV4cChpbm9kZSksIDAsCi0JCQkJICAgbHNtLCAodm9pZCBfX3VzZXIgKilhcmcpOwotCWNjY19pbm9kZV9sc21fcHV0KGlub2RlLCBsc20pOworCXJjID0gbGxfY29weV91c2VyX21kKGx1bSwgJmtsdW0pOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCWx1bV9zaXplID0gcmM7CisJcmMgPSBsbF9sb3Zfc2V0c3RyaXBlX2VhX2luZm8oaW5vZGUsIGZpbGUtPmZfcGF0aC5kZW50cnksIGZsYWdzLCBrbHVtLAorCQkJCSAgICAgIGx1bV9zaXplKTsKKwljbF9sb3ZfZGVsYXlfY3JlYXRlX2NsZWFyKCZmaWxlLT5mX2ZsYWdzKTsKKwlpZiAocmMgPT0gMCkgeworCQlfX3UzMiBnZW47CisKKwkJcHV0X3VzZXIoMCwgJmx1bS0+bG1tX3N0cmlwZV9jb3VudCk7CisKKwkJbGxfbGF5b3V0X3JlZnJlc2goaW5vZGUsICZnZW4pOworCQlyYyA9IGxsX2ZpbGVfZ2V0c3RyaXBlKGlub2RlLCAoc3RydWN0IGxvdl91c2VyX21kIF9fdXNlciAqKWFyZyk7CisJfQorCisJa2ZyZWUoa2x1bSk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0yMjQ3LDYgKzIxNTYsMTIgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK3N0YXRpYyBpbmxpbmUgbG9uZyBsbF9sZWFzZV90eXBlX2Zyb21fZm1vZGUoZm1vZGVfdCBmbW9kZSkKK3sKKwlyZXR1cm4gKChmbW9kZSAmIEZNT0RFX1JFQUQpID8gTExfTEVBU0VfUkRMQ0sgOiAwKSB8CisJICAgICAgICgoZm1vZGUgJiBGTU9ERV9XUklURSkgPyBMTF9MRUFTRV9XUkxDSyA6IDApOworfQorCiBzdGF0aWMgbG9uZwogbGxfZmlsZV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CkBAIC0yMzE0LDExICsyMjI5LDggQEAKIAkJcmV0dXJuIHJjOwogCX0KIAljYXNlIExMX0lPQ19MT1ZfR0VUU1RSSVBFOgotCQlyZXR1cm4gbGxfbG92X2dldHN0cmlwZShpbm9kZSwgYXJnKTsKLQljYXNlIExMX0lPQ19SRUNSRUFURV9PQko6Ci0JCXJldHVybiBsbF9sb3ZfcmVjcmVhdGVfb2JqKGlub2RlLCBhcmcpOwotCWNhc2UgTExfSU9DX1JFQ1JFQVRFX0ZJRDoKLQkJcmV0dXJuIGxsX2xvdl9yZWNyZWF0ZV9maWQoaW5vZGUsIGFyZyk7CisJCXJldHVybiBsbF9maWxlX2dldHN0cmlwZShpbm9kZSwKKwkJCQkJIChzdHJ1Y3QgbG92X3VzZXJfbWQgX191c2VyICopYXJnKTsKIAljYXNlIEZTRklMVF9JT0NfRklFTUFQOgogCQlyZXR1cm4gbGxfaW9jdGxfZmllbWFwKGlub2RlLCBhcmcpOwogCWNhc2UgRlNGSUxUX0lPQ19HRVRGTEFHUzoKQEAgLTIzNDksNiArMjI2MSw4IEBACiAKIAkJcmV0dXJuIDA7CiAJfQorCWNhc2UgTExfSU9DX0dFVFBBUkVOVDoKKwkJcmV0dXJuIGxsX2dldHBhcmVudChmaWxlLCAoc3RydWN0IGdldHBhcmVudCBfX3VzZXIgKilhcmcpOwogCWNhc2UgT0JEX0lPQ19GSUQyUEFUSDoKIAkJcmV0dXJuIGxsX2ZpZDJwYXRoKGlub2RlLCAodm9pZCBfX3VzZXIgKilhcmcpOwogCWNhc2UgTExfSU9DX0RBVEFfVkVSU0lPTjogewpAQCAtMjQ1MSwyMCArMjM2NSwyMCBAQAogCQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGlub2RlKTsKIAkJc3RydWN0IG9iZF9jbGllbnRfaGFuZGxlICpvY2ggPSBOVUxMOwogCQlib29sIGxlYXNlX2Jyb2tlbjsKLQkJZm1vZGVfdCBtb2RlID0gMDsKKwkJZm1vZGVfdCBmbW9kZTsKIAogCQlzd2l0Y2ggKGFyZykgewotCQljYXNlIEZfV1JMQ0s6CisJCWNhc2UgTExfTEVBU0VfV1JMQ0s6CiAJCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCiAJCQkJcmV0dXJuIC1FUEVSTTsKLQkJCW1vZGUgPSBGTU9ERV9XUklURTsKKwkJCWZtb2RlID0gRk1PREVfV1JJVEU7CiAJCQlicmVhazsKLQkJY2FzZSBGX1JETENLOgorCQljYXNlIExMX0xFQVNFX1JETENLOgogCQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCiAJCQkJcmV0dXJuIC1FUEVSTTsKLQkJCW1vZGUgPSBGTU9ERV9SRUFEOworCQkJZm1vZGUgPSBGTU9ERV9SRUFEOwogCQkJYnJlYWs7Ci0JCWNhc2UgRl9VTkxDSzoKKwkJY2FzZSBMTF9MRUFTRV9VTkxDSzoKIAkJCW11dGV4X2xvY2soJmxsaS0+bGxpX29jaF9tdXRleCk7CiAJCQlpZiAoZmQtPmZkX2xlYXNlX29jaCkgewogCQkJCW9jaCA9IGZkLT5mZF9sZWFzZV9vY2g7CkBAIC0yNDcyLDI2ICsyMzg2LDI2IEBACiAJCQl9CiAJCQltdXRleF91bmxvY2soJmxsaS0+bGxpX29jaF9tdXRleCk7CiAKLQkJCWlmIChvY2gpIHsKLQkJCQltb2RlID0gb2NoLT5vY2hfZmxhZ3MgJgotCQkJCSAgICAgICAoRk1PREVfUkVBRHxGTU9ERV9XUklURSk7Ci0JCQkJcmMgPSBsbF9sZWFzZV9jbG9zZShvY2gsIGlub2RlLCAmbGVhc2VfYnJva2VuKTsKLQkJCQlpZiAocmMgPT0gMCAmJiBsZWFzZV9icm9rZW4pCi0JCQkJCW1vZGUgPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlyYyA9IC1FTk9MQ0s7Ci0JCQl9CisJCQlpZiAoIW9jaCkKKwkJCQlyZXR1cm4gLUVOT0xDSzsKIAotCQkJLyogcmV0dXJuIHRoZSB0eXBlIG9mIGxlYXNlIG9yIGVycm9yICovCi0JCQlyZXR1cm4gcmMgPCAwID8gcmMgOiAoaW50KW1vZGU7CisJCQlmbW9kZSA9IG9jaC0+b2NoX2ZsYWdzOworCQkJcmMgPSBsbF9sZWFzZV9jbG9zZShvY2gsIGlub2RlLCAmbGVhc2VfYnJva2VuKTsKKwkJCWlmIChyYyA8IDApCisJCQkJcmV0dXJuIHJjOworCisJCQlpZiAobGVhc2VfYnJva2VuKQorCQkJCWZtb2RlID0gMDsKKworCQkJcmV0dXJuIGxsX2xlYXNlX3R5cGVfZnJvbV9mbW9kZShmbW9kZSk7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCi0JCUNERUJVRyhEX0lOT0RFLCAiU2V0IGxlYXNlIHdpdGggbW9kZSAlZFxuIiwgbW9kZSk7CisJCUNERUJVRyhEX0lOT0RFLCAiU2V0IGxlYXNlIHdpdGggbW9kZSAldVxuIiwgZm1vZGUpOwogCiAJCS8qIGFwcGx5IGZvciBsZWFzZSAqLwotCQlvY2ggPSBsbF9sZWFzZV9vcGVuKGlub2RlLCBmaWxlLCBtb2RlLCAwKTsKKwkJb2NoID0gbGxfbGVhc2Vfb3Blbihpbm9kZSwgZmlsZSwgZm1vZGUsIDApOwogCQlpZiAoSVNfRVJSKG9jaCkpCiAJCQlyZXR1cm4gUFRSX0VSUihvY2gpOwogCkBAIC0yNTEyLDggKzI0MjYsOCBAQAogCWNhc2UgTExfSU9DX0dFVF9MRUFTRTogewogCQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGlub2RlKTsKIAkJc3RydWN0IGxkbG1fbG9jayAqbG9jayA9IE5VTEw7CisJCWZtb2RlX3QgZm1vZGUgPSAwOwogCi0JCXJjID0gMDsKIAkJbXV0ZXhfbG9jaygmbGxpLT5sbGlfb2NoX211dGV4KTsKIAkJaWYgKGZkLT5mZF9sZWFzZV9vY2gpIHsKIAkJCXN0cnVjdCBvYmRfY2xpZW50X2hhbmRsZSAqb2NoID0gZmQtPmZkX2xlYXNlX29jaDsKQEAgLTI1MjIsMTQgKzI0MzYsMTMgQEAKIAkJCWlmIChsb2NrKSB7CiAJCQkJbG9ja19yZXNfYW5kX2xvY2sobG9jayk7CiAJCQkJaWYgKCFsZGxtX2lzX2NhbmNlbChsb2NrKSkKLQkJCQkJcmMgPSBvY2gtPm9jaF9mbGFncyAmCi0JCQkJCQkoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKTsKKwkJCQkJZm1vZGUgPSBvY2gtPm9jaF9mbGFnczsKIAkJCQl1bmxvY2tfcmVzX2FuZF9sb2NrKGxvY2spOwogCQkJCUxETE1fTE9DS19QVVQobG9jayk7CiAJCQl9CiAJCX0KIAkJbXV0ZXhfdW5sb2NrKCZsbGktPmxsaV9vY2hfbXV0ZXgpOwotCQlyZXR1cm4gcmM7CisJCXJldHVybiBsbF9sZWFzZV90eXBlX2Zyb21fZm1vZGUoZm1vZGUpOwogCX0KIAljYXNlIExMX0lPQ19IU01fSU1QT1JUOiB7CiAJCXN0cnVjdCBoc21fdXNlcl9pbXBvcnQgKmh1aTsKQEAgLTI1NzQsOSArMjQ4Nyw4IEBACiAJCWVvZiA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKIAl9CiAKLQlyZXR2YWwgPSBnZW5lcmljX2ZpbGVfbGxzZWVrX3NpemUoZmlsZSwgb2Zmc2V0LCBvcmlnaW4sCi0JCQkJCSAgbGxfZmlsZV9tYXhieXRlcyhpbm9kZSksIGVvZik7Ci0JcmV0dXJuIHJldHZhbDsKKwlyZXR1cm4gZ2VuZXJpY19maWxlX2xsc2Vla19zaXplKGZpbGUsIG9mZnNldCwgb3JpZ2luLAorCQkJCQlsbF9maWxlX21heGJ5dGVzKGlub2RlKSwgZW9mKTsKIH0KIAogc3RhdGljIGludCBsbF9mbHVzaChzdHJ1Y3QgZmlsZSAqZmlsZSwgZmxfb3duZXJfdCBpZCkKQEAgLTI1OTMsOSArMjUwNSwxMSBAQAogCSAqLwogCXJjID0gbGxpLT5sbGlfYXN5bmNfcmM7CiAJbGxpLT5sbGlfYXN5bmNfcmMgPSAwOwotCWVyciA9IGxvdl9yZWFkX2FuZF9jbGVhcl9hc3luY19yYyhsbGktPmxsaV9jbG9iKTsKLQlpZiAocmMgPT0gMCkKLQkJcmMgPSBlcnI7CisJaWYgKGxsaS0+bGxpX2Nsb2IpIHsKKwkJZXJyID0gbG92X3JlYWRfYW5kX2NsZWFyX2FzeW5jX3JjKGxsaS0+bGxpX2Nsb2IpOworCQlpZiAoIXJjKQorCQkJcmMgPSBlcnI7CisJfQogCiAJLyogVGhlIGFwcGxpY2F0aW9uIGhhcyBiZWVuIHRvbGQgYWJvdXQgd3JpdGUgZmFpbHVyZSBhbHJlYWR5LgogCSAqIERvIG5vdCByZXBvcnQgZmFpbHVyZSBhZ2Fpbi4KQEAgLTI3MTQsNiArMjYyOCw3IEBACiAJc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGE7CiAJc3RydWN0IGx1c3RyZV9oYW5kbGUgbG9ja2ggPSB7MH07CiAJbGRsbV9wb2xpY3lfZGF0YV90IGZsb2NrID0geyB7MH0gfTsKKwlpbnQgZmxfdHlwZSA9IGZpbGVfbG9jay0+ZmxfdHlwZTsKIAlfX3U2NCBmbGFncyA9IDA7CiAJaW50IHJjOwogCWludCByYzIgPSAwOwpAQCAtMjc0NCw3ICsyNjU5LDcgQEAKIAlpZiAoZmlsZV9sb2NrLT5mbF9sbW9wcyAmJiBmaWxlX2xvY2stPmZsX2xtb3BzLT5sbV9jb21wYXJlX293bmVyKQogCQlmbG9jay5sX2Zsb2NrLm93bmVyID0gKHVuc2lnbmVkIGxvbmcpZmlsZV9sb2NrLT5mbF9waWQ7CiAKLQlzd2l0Y2ggKGZpbGVfbG9jay0+ZmxfdHlwZSkgeworCXN3aXRjaCAoZmxfdHlwZSkgewogCWNhc2UgRl9SRExDSzoKIAkJZWluZm8uZWlfbW9kZSA9IExDS19QUjsKIAkJYnJlYWs7CkBAIC0yNzY0LDggKzI2NzksNyBAQAogCQllaW5mby5laV9tb2RlID0gTENLX1BXOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlDREVCVUcoRF9JTkZPLCAiVW5rbm93biBmY250bCBsb2NrIHR5cGU6ICVkXG4iLAotCQkgICAgICAgZmlsZV9sb2NrLT5mbF90eXBlKTsKKwkJQ0RFQlVHKERfSU5GTywgIlVua25vd24gZmNudGwgbG9jayB0eXBlOiAlZFxuIiwgZmxfdHlwZSk7CiAJCXJldHVybiAtRU5PVFNVUFA7CiAJfQogCkBAIC0yNzg3LDE2ICsyNzAxLDE4IEBACiAJY2FzZSBGX0dFVExLNjQ6CiAjZW5kaWYKIAkJZmxhZ3MgPSBMRExNX0ZMX1RFU1RfTE9DSzsKLQkJLyogU2F2ZSB0aGUgb2xkIG1vZGUgc28gdGhhdCBpZiB0aGUgbW9kZSBpbiB0aGUgbG9jayBjaGFuZ2VzIHdlCi0JCSAqIGNhbiBkZWNyZW1lbnQgdGhlIGFwcHJvcHJpYXRlIHJlYWRlciBvciB3cml0ZXIgcmVmY291bnQuCi0JCSAqLwotCQlmaWxlX2xvY2stPmZsX3R5cGUgPSBlaW5mby5laV9tb2RlOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlDRVJST1IoInVua25vd24gZmNudGwgbG9jayBjb21tYW5kOiAlZFxuIiwgY21kKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJLyoKKwkgKiBTYXZlIHRoZSBvbGQgbW9kZSBzbyB0aGF0IGlmIHRoZSBtb2RlIGluIHRoZSBsb2NrIGNoYW5nZXMgd2UKKwkgKiBjYW4gZGVjcmVtZW50IHRoZSBhcHByb3ByaWF0ZSByZWFkZXIgb3Igd3JpdGVyIHJlZmNvdW50LgorCSAqLworCWZpbGVfbG9jay0+ZmxfdHlwZSA9IGVpbmZvLmVpX21vZGU7CisKIAlvcF9kYXRhID0gbGxfcHJlcF9tZF9vcF9kYXRhKE5VTEwsIGlub2RlLCBOVUxMLCBOVUxMLCAwLCAwLAogCQkJCSAgICAgTFVTVFJFX09QQ19BTlksIE5VTEwpOwogCWlmIChJU19FUlIob3BfZGF0YSkpCkBAIC0yODA2LDggKzI3MjIsMTIgQEAKIAkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSwgZmxvY2subF9mbG9jay5waWQsIGZsYWdzLAogCSAgICAgICBlaW5mby5laV9tb2RlLCBmbG9jay5sX2Zsb2NrLnN0YXJ0LCBmbG9jay5sX2Zsb2NrLmVuZCk7CiAKLQlyYyA9IG1kX2VucXVldWUoc2JpLT5sbF9tZF9leHAsICZlaW5mbywgTlVMTCwKLQkJCW9wX2RhdGEsICZsb2NraCwgJmZsb2NrLCAwLCBOVUxMIC8qIHJlcSAqLywgZmxhZ3MpOworCXJjID0gbWRfZW5xdWV1ZShzYmktPmxsX21kX2V4cCwgJmVpbmZvLCAmZmxvY2ssIE5VTEwsIG9wX2RhdGEsICZsb2NraCwKKwkJCWZsYWdzKTsKKworCS8qIFJlc3RvcmUgdGhlIGZpbGUgbG9jayB0eXBlIGlmIG5vdCBURVNUIGxvY2suICovCisJaWYgKCEoZmxhZ3MgJiBMRExNX0ZMX1RFU1RfTE9DSykpCisJCWZpbGVfbG9jay0+ZmxfdHlwZSA9IGZsX3R5cGU7CiAKIAlpZiAoKHJjID09IDAgfHwgZmlsZV9sb2NrLT5mbF90eXBlID09IEZfVU5MQ0spICYmCiAJICAgICEoZmxhZ3MgJiBMRExNX0ZMX1RFU1RfTE9DSykpCkBAIC0yODE1LDggKzI3MzUsOCBAQAogCiAJaWYgKHJjMiAmJiBmaWxlX2xvY2stPmZsX3R5cGUgIT0gRl9VTkxDSykgewogCQllaW5mby5laV9tb2RlID0gTENLX05MOwotCQltZF9lbnF1ZXVlKHNiaS0+bGxfbWRfZXhwLCAmZWluZm8sIE5VTEwsCi0JCQkgICBvcF9kYXRhLCAmbG9ja2gsICZmbG9jaywgMCwgTlVMTCAvKiByZXEgKi8sIGZsYWdzKTsKKwkJbWRfZW5xdWV1ZShzYmktPmxsX21kX2V4cCwgJmVpbmZvLCAmZmxvY2ssIE5VTEwsIG9wX2RhdGEsCisJCQkgICAmbG9ja2gsIGZsYWdzKTsKIAkJcmMgPSByYzI7CiAJfQogCkBAIC0yODI1LDYgKzI3NDUsMTE3IEBACiAJcmV0dXJuIHJjOwogfQogCitpbnQgbGxfZ2V0X2ZpZF9ieV9uYW1lKHN0cnVjdCBpbm9kZSAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICAgaW50IG5hbWVsZW4sIHN0cnVjdCBsdV9maWQgKmZpZCkKK3sKKwlzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSA9IE5VTEw7CisJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXE7CisJc3RydWN0IG1kdF9ib2R5ICpib2R5OworCWludCByYzsKKworCW9wX2RhdGEgPSBsbF9wcmVwX21kX29wX2RhdGEoTlVMTCwgcGFyZW50LCBOVUxMLCBuYW1lLCBuYW1lbGVuLCAwLAorCQkJCSAgICAgTFVTVFJFX09QQ19BTlksIE5VTEwpOworCWlmIChJU19FUlIob3BfZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKG9wX2RhdGEpOworCisJb3BfZGF0YS0+b3BfdmFsaWQgPSBPQkRfTURfRkxJRDsKKwlyYyA9IG1kX2dldGF0dHJfbmFtZShsbF9pMnNiaShwYXJlbnQpLT5sbF9tZF9leHAsIG9wX2RhdGEsICZyZXEpOworCWxsX2ZpbmlzaF9tZF9vcF9kYXRhKG9wX2RhdGEpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCWJvZHkgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfTURUX0JPRFkpOworCWlmICghYm9keSkgeworCQlyYyA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0X3JlcTsKKwl9CisJaWYgKGZpZCkKKwkJKmZpZCA9IGJvZHktPm1ib19maWQxOworb3V0X3JlcToKKwlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7CisJcmV0dXJuIHJjOworfQorCitpbnQgbGxfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKnBhcmVudCwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBtZHRpZHgsCisJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKQoreworCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxdWVzdCA9IE5VTEw7CisJc3RydWN0IGlub2RlICpjaGlsZF9pbm9kZSA9IE5VTEw7CisJc3RydWN0IGRlbnRyeSAqZGNoaWxkID0gTlVMTDsKKwlzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YTsKKwlzdHJ1Y3QgcXN0ciBxc3RyOworCWludCByYzsKKworCUNERUJVRyhEX1ZGU1RSQUNFLCAibWlncmF0ZSAlcyB1bmRlciAiREZJRCIgdG8gTURUJWRcbiIsCisJICAgICAgIG5hbWUsIFBGSUQobGxfaW5vZGUyZmlkKHBhcmVudCkpLCBtZHRpZHgpOworCisJb3BfZGF0YSA9IGxsX3ByZXBfbWRfb3BfZGF0YShOVUxMLCBwYXJlbnQsIE5VTEwsIG5hbWUsIG5hbWVsZW4sCisJCQkJICAgICAwLCBMVVNUUkVfT1BDX0FOWSwgTlVMTCk7CisJaWYgKElTX0VSUihvcF9kYXRhKSkKKwkJcmV0dXJuIFBUUl9FUlIob3BfZGF0YSk7CisKKwkvKiBHZXQgY2hpbGQgRklEIGZpcnN0ICovCisJcXN0ci5oYXNoID0gZnVsbF9uYW1lX2hhc2gocGFyZW50LCBuYW1lLCBuYW1lbGVuKTsKKwlxc3RyLm5hbWUgPSBuYW1lOworCXFzdHIubGVuID0gbmFtZWxlbjsKKwlkY2hpbGQgPSBkX2xvb2t1cChmaWxlX2RlbnRyeShmaWxlKSwgJnFzdHIpOworCWlmIChkY2hpbGQpIHsKKwkJb3BfZGF0YS0+b3BfZmlkMyA9ICpsbF9pbm9kZTJmaWQoZGNoaWxkLT5kX2lub2RlKTsKKwkJaWYgKGRjaGlsZC0+ZF9pbm9kZSkgeworCQkJY2hpbGRfaW5vZGUgPSBpZ3JhYihkY2hpbGQtPmRfaW5vZGUpOworCQkJaWYgKGNoaWxkX2lub2RlKSB7CisJCQkJaW5vZGVfbG9jayhjaGlsZF9pbm9kZSk7CisJCQkJb3BfZGF0YS0+b3BfZmlkMyA9ICpsbF9pbm9kZTJmaWQoY2hpbGRfaW5vZGUpOworCQkJCWxsX2ludmFsaWRhdGVfYWxpYXNlcyhjaGlsZF9pbm9kZSk7CisJCQl9CisJCX0KKwkJZHB1dChkY2hpbGQpOworCX0gZWxzZSB7CisJCXJjID0gbGxfZ2V0X2ZpZF9ieV9uYW1lKHBhcmVudCwgbmFtZSwgbmFtZWxlbiwKKwkJCQkJJm9wX2RhdGEtPm9wX2ZpZDMpOworCQlpZiAocmMpCisJCQlnb3RvIG91dF9mcmVlOworCX0KKworCWlmICghZmlkX2lzX3NhbmUoJm9wX2RhdGEtPm9wX2ZpZDMpKSB7CisJCUNFUlJPUigiJXM6IG1pZ3JhdGUgJXMsIGJ1dCBmaWQgIkRGSUQiIGlzIGluc2FuZVxuIiwKKwkJICAgICAgIGxsX2dldF9mc25hbWUocGFyZW50LT5pX3NiLCBOVUxMLCAwKSwgbmFtZSwKKwkJICAgICAgIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDMpKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCXJjID0gbGxfZ2V0X21kdF9pZHhfYnlfZmlkKGxsX2kyc2JpKHBhcmVudCksICZvcF9kYXRhLT5vcF9maWQzKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCisJaWYgKHJjID09IG1kdGlkeCkgeworCQlDREVCVUcoRF9JTkZPLCAiJXM6IkRGSUQiIGlzIGFscmVhZHkgb24gTURUJWQuXG4iLCBuYW1lLAorCQkgICAgICAgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMyksIG1kdGlkeCk7CisJCXJjID0gMDsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlvcF9kYXRhLT5vcF9tZHMgPSBtZHRpZHg7CisJb3BfZGF0YS0+b3BfY2xpX2ZsYWdzID0gQ0xJX01JR1JBVEU7CisJcmMgPSBtZF9yZW5hbWUobGxfaTJzYmkocGFyZW50KS0+bGxfbWRfZXhwLCBvcF9kYXRhLCBuYW1lLAorCQkgICAgICAgbmFtZWxlbiwgbmFtZSwgbmFtZWxlbiwgJnJlcXVlc3QpOworCWlmICghcmMpCisJCWxsX3VwZGF0ZV90aW1lcyhyZXF1ZXN0LCBwYXJlbnQpOworCisJcHRscnBjX3JlcV9maW5pc2hlZChyZXF1ZXN0KTsKKworb3V0X2ZyZWU6CisJaWYgKGNoaWxkX2lub2RlKSB7CisJCWNsZWFyX25saW5rKGNoaWxkX2lub2RlKTsKKwkJaW5vZGVfdW5sb2NrKGNoaWxkX2lub2RlKTsKKwkJaXB1dChjaGlsZF9pbm9kZSk7CisJfQorCisJbGxfZmluaXNoX21kX29wX2RhdGEob3BfZGF0YSk7CisJcmV0dXJuIHJjOworfQorCiBzdGF0aWMgaW50CiBsbF9maWxlX25vZmxvY2soc3RydWN0IGZpbGUgKmZpbGUsIGludCBjbWQsIHN0cnVjdCBmaWxlX2xvY2sgKmZpbGVfbG9jaykKIHsKQEAgLTI4NDcsNyArMjg3OCw3IEBACiAJc3RydWN0IGx1c3RyZV9oYW5kbGUgbG9ja2g7CiAJbGRsbV9wb2xpY3lfZGF0YV90IHBvbGljeTsKIAllbnVtIGxkbG1fbW9kZSBtb2RlID0gKGxfcmVxX21vZGUgPT0gTENLX01JTk1PREUpID8KLQkJCQkoTENLX0NSfExDS19DV3xMQ0tfUFJ8TENLX1BXKSA6IGxfcmVxX21vZGU7CisJCQkgICAgICAoTENLX0NSIHwgTENLX0NXIHwgTENLX1BSIHwgTENLX1BXKSA6IGxfcmVxX21vZGU7CiAJc3RydWN0IGx1X2ZpZCAqZmlkOwogCV9fdTY0IGZsYWdzOwogCWludCBpOwpAQCAtMjg4OCwxNSArMjkxOSwxMiBAQAogewogCWxkbG1fcG9saWN5X2RhdGFfdCBwb2xpY3kgPSB7IC5sX2lub2RlYml0cyA9IHtiaXRzfSB9OwogCXN0cnVjdCBsdV9maWQgKmZpZDsKLQllbnVtIGxkbG1fbW9kZSByYzsKIAogCWZpZCA9ICZsbF9pMmluZm8oaW5vZGUpLT5sbGlfZmlkOwogCUNERUJVRyhEX0lORk8sICJ0cnlpbmcgdG8gbWF0Y2ggcmVzICJERklEIlxuIiwgUEZJRChmaWQpKTsKIAotCXJjID0gbWRfbG9ja19tYXRjaChsbF9pMm1kZXhwKGlub2RlKSwgZmxhZ3MgfCBMRExNX0ZMX0JMT0NLX0dSQU5URUQsCi0JCQkgICBmaWQsIExETE1fSUJJVFMsICZwb2xpY3ksIG1vZGUsIGxvY2toKTsKLQotCXJldHVybiByYzsKKwlyZXR1cm4gbWRfbG9ja19tYXRjaChsbF9pMm1kZXhwKGlub2RlKSwgZmxhZ3MgfCBMRExNX0ZMX0JMT0NLX0dSQU5URUQsCisJCQkgICAgIGZpZCwgTERMTV9JQklUUywgJnBvbGljeSwgbW9kZSwgbG9ja2gpOwogfQogCiBzdGF0aWMgaW50IGxsX2lub2RlX3JldmFsaWRhdGVfZmluaShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgcmMpCkBAIC0yOTQ5LDE1ICsyOTc3LDkgQEAKIAkJaWYgKElTX0VSUihvcF9kYXRhKSkKIAkJCXJldHVybiBQVFJfRVJSKG9wX2RhdGEpOwogCi0JCW9pdC5pdF9jcmVhdGVfbW9kZSB8PSBNX0NIRUNLX1NUQUxFOwotCQlyYyA9IG1kX2ludGVudF9sb2NrKGV4cCwgb3BfZGF0YSwgTlVMTCwgMCwKLQkJCQkgICAgLyogd2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIG5hbWUKLQkJCQkgICAgICogYmFzZWQgbG9va3VwCi0JCQkJICAgICAqLwotCQkJCSAgICAmb2l0LCAwLCAmcmVxLAotCQkJCSAgICBsbF9tZF9ibG9ja2luZ19hc3QsIDApOworCQlyYyA9IG1kX2ludGVudF9sb2NrKGV4cCwgb3BfZGF0YSwgJm9pdCwgJnJlcSwKKwkJCQkgICAgJmxsX21kX2Jsb2NraW5nX2FzdCwgMCk7CiAJCWxsX2ZpbmlzaF9tZF9vcF9kYXRhKG9wX2RhdGEpOwotCQlvaXQuaXRfY3JlYXRlX21vZGUgJj0gfk1fQ0hFQ0tfU1RBTEU7CiAJCWlmIChyYyA8IDApIHsKIAkJCXJjID0gbGxfaW5vZGVfcmV2YWxpZGF0ZV9maW5pKGlub2RlLCByYyk7CiAJCQlnb3RvIG91dDsKQEAgLTMwMDMsMTAgKzMwMjUsOCBAQAogCQlvcF9kYXRhLT5vcF92YWxpZCA9IHZhbGlkOwogCQlyYyA9IG1kX2dldGF0dHIoc2JpLT5sbF9tZF9leHAsIG9wX2RhdGEsICZyZXEpOwogCQlsbF9maW5pc2hfbWRfb3BfZGF0YShvcF9kYXRhKTsKLQkJaWYgKHJjKSB7Ci0JCQlyYyA9IGxsX2lub2RlX3JldmFsaWRhdGVfZmluaShpbm9kZSwgcmMpOwotCQkJcmV0dXJuIHJjOwotCQl9CisJCWlmIChyYykKKwkJCXJldHVybiBsbF9pbm9kZV9yZXZhbGlkYXRlX2ZpbmkoaW5vZGUsIHJjKTsKIAogCQlyYyA9IGxsX3ByZXBfaW5vZGUoJmlub2RlLCByZXEsIE5VTEwsIE5VTEwpOwogCX0KQEAgLTMwMTUsNiArMzAzNSwyOCBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGludCBsbF9tZXJnZV9tZF9hdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGNsX2F0dHIgYXR0ciA9IHsgMCB9OworCWludCByYzsKKworCUxBU1NFUlQobGxfaTJpbmZvKGlub2RlKS0+bGxpX2xzbV9tZCk7CisJcmMgPSBtZF9tZXJnZV9hdHRyKGxsX2kybWRleHAoaW5vZGUpLCBsbF9pMmluZm8oaW5vZGUpLT5sbGlfbHNtX21kLAorCQkJICAgJmF0dHIsIGxsX21kX2Jsb2NraW5nX2FzdCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlzZXRfbmxpbmsoaW5vZGUsIGF0dHIuY2F0X25saW5rKTsKKwlpbm9kZS0+aV9ibG9ja3MgPSBhdHRyLmNhdF9ibG9ja3M7CisJaV9zaXplX3dyaXRlKGlub2RlLCBhdHRyLmNhdF9zaXplKTsKKworCWxsX2kyaW5mbyhpbm9kZSktPmxsaV9hdGltZSA9IGF0dHIuY2F0X2F0aW1lOworCWxsX2kyaW5mbyhpbm9kZSktPmxsaV9tdGltZSA9IGF0dHIuY2F0X210aW1lOworCWxsX2kyaW5mbyhpbm9kZSktPmxsaV9jdGltZSA9IGF0dHIuY2F0X2N0aW1lOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgbGxfaW5vZGVfcmV2YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIF9fdTY0IGliaXRzKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkX2lub2RlKGRlbnRyeSk7CkBAIC0zMDI2LDYgKzMwNjgsMTMgQEAKIAogCS8qIGlmIG9iamVjdCBpc24ndCByZWd1bGFyIGZpbGUsIGRvbid0IHZhbGlkYXRlIHNpemUgKi8KIAlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYKKwkJICAgIGxsX2kyaW5mbyhpbm9kZSktPmxsaV9sc21fbWQpIHsKKwkJCXJjID0gbGxfbWVyZ2VfbWRfYXR0cihpbm9kZSk7CisJCQlpZiAocmMpCisJCQkJcmV0dXJuIHJjOworCQl9CisKIAkJTFRJTUVfUyhpbm9kZS0+aV9hdGltZSkgPSBsbF9pMmluZm8oaW5vZGUpLT5sbGlfYXRpbWU7CiAJCUxUSU1FX1MoaW5vZGUtPmlfbXRpbWUpID0gbGxfaTJpbmZvKGlub2RlKS0+bGxpX210aW1lOwogCQlMVElNRV9TKGlub2RlLT5pX2N0aW1lKSA9IGxsX2kyaW5mbyhpbm9kZSktPmxsaV9jdGltZTsKQEAgLTMwNTcsMTMgKzMxMDYsMTQgQEAKIAlpZiAocmVzKQogCQlyZXR1cm4gcmVzOwogCisJT0JEX0ZBSUxfVElNRU9VVChPQkRfRkFJTF9HRVRBVFRSX0RFTEFZLCAzMCk7CisKIAlzdGF0LT5kZXYgPSBpbm9kZS0+aV9zYi0+c19kZXY7CiAJaWYgKGxsX25lZWRfMzJiaXRfYXBpKHNiaSkpCiAJCXN0YXQtPmlubyA9IGNsX2ZpZF9idWlsZF9pbm8oJmxsaS0+bGxpX2ZpZCwgMSk7CiAJZWxzZQogCQlzdGF0LT5pbm8gPSBpbm9kZS0+aV9pbm87CiAJc3RhdC0+bW9kZSA9IGlub2RlLT5pX21vZGU7Ci0Jc3RhdC0+bmxpbmsgPSBpbm9kZS0+aV9ubGluazsKIAlzdGF0LT51aWQgPSBpbm9kZS0+aV91aWQ7CiAJc3RhdC0+Z2lkID0gaW5vZGUtPmlfZ2lkOwogCXN0YXQtPnJkZXYgPSBpbm9kZS0+aV9yZGV2OwpAQCAtMzA3Miw2ICszMTIyLDcgQEAKIAlzdGF0LT5jdGltZSA9IGlub2RlLT5pX2N0aW1lOwogCXN0YXQtPmJsa3NpemUgPSAxIDw8IGlub2RlLT5pX2Jsa2JpdHM7CiAKKwlzdGF0LT5ubGluayA9IGlub2RlLT5pX25saW5rOwogCXN0YXQtPnNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CiAJc3RhdC0+YmxvY2tzID0gaW5vZGUtPmlfYmxvY2tzOwogCkBAIC0zMTM5LDYgKzMxOTAsMTIgQEAKIAogaW50IGxsX2lub2RlX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spCiB7CisJc3RydWN0IGxsX3NiX2luZm8gKnNiaTsKKwlzdHJ1Y3Qgcm9vdF9zcXVhc2hfaW5mbyAqc3F1YXNoOworCWNvbnN0IHN0cnVjdCBjcmVkICpvbGRfY3JlZCA9IE5VTEw7CisJc3RydWN0IGNyZWQgKmNyZWQgPSBOVUxMOworCWJvb2wgc3F1YXNoX2lkID0gZmFsc2U7CisJY2ZzX2NhcF90IGNhcDsKIAlpbnQgcmMgPSAwOwogCiAJaWYgKG1hc2sgJiBNQVlfTk9UX0JMT0NLKQpAQCAtMzE1OCw5ICszMjE1LDQ2IEBACiAJQ0RFQlVHKERfVkZTVFJBQ0UsICJWRlMgT3A6aW5vZGU9IkRGSUQiKCVwKSwgaW5vZGUgbW9kZSAleCBtYXNrICVvXG4iLAogCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpLCBpbm9kZSwgaW5vZGUtPmlfbW9kZSwgbWFzayk7CiAKKwkvKiBzcXVhc2ggZnN1aWQvZnNnaWQgaWYgbmVlZGVkICovCisJc2JpID0gbGxfaTJzYmkoaW5vZGUpOworCXNxdWFzaCA9ICZzYmktPmxsX3NxdWFzaDsKKwlpZiAodW5saWtlbHkoc3F1YXNoLT5yc2lfdWlkICYmCisJCSAgICAgdWlkX2VxKGN1cnJlbnRfZnN1aWQoKSwgR0xPQkFMX1JPT1RfVUlEKSAmJgorCQkgICAgICEoc2JpLT5sbF9mbGFncyAmIExMX1NCSV9OT1JPT1RTUVVBU0gpKSkgeworCQlzcXVhc2hfaWQgPSB0cnVlOworCX0KKworCWlmIChzcXVhc2hfaWQpIHsKKwkJQ0RFQlVHKERfT1RIRVIsICJzcXVhc2ggY3JlZHMgKCVkOiVkKT0+KCVkOiVkKVxuIiwKKwkJICAgICAgIF9fa3VpZF92YWwoY3VycmVudF9mc3VpZCgpKSwgX19rZ2lkX3ZhbChjdXJyZW50X2ZzZ2lkKCkpLAorCQkgICAgICAgc3F1YXNoLT5yc2lfdWlkLCBzcXVhc2gtPnJzaV9naWQpOworCisJCS8qCisJCSAqIHVwZGF0ZSBjdXJyZW50IHByb2Nlc3MncyBjcmVkZW50aWFscworCQkgKiBhbmQgRlMgY2FwYWJpbGl0eQorCQkgKi8KKwkJY3JlZCA9IHByZXBhcmVfY3JlZHMoKTsKKwkJaWYgKCFjcmVkKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJY3JlZC0+ZnN1aWQgPSBtYWtlX2t1aWQoJmluaXRfdXNlcl9ucywgc3F1YXNoLT5yc2lfdWlkKTsKKwkJY3JlZC0+ZnNnaWQgPSBtYWtlX2tnaWQoJmluaXRfdXNlcl9ucywgc3F1YXNoLT5yc2lfZ2lkKTsKKwkJZm9yIChjYXAgPSAwOyBjYXAgPCBzaXplb2YoY2ZzX2NhcF90KSAqIDg7IGNhcCsrKSB7CisJCQlpZiAoKDEgPDwgY2FwKSAmIENGU19DQVBfRlNfTUFTSykKKwkJCQljYXBfbG93ZXIoY3JlZC0+Y2FwX2VmZmVjdGl2ZSwgY2FwKTsKKwkJfQorCQlvbGRfY3JlZCA9IG92ZXJyaWRlX2NyZWRzKGNyZWQpOworCX0KKwogCWxsX3N0YXRzX29wc190YWxseShsbF9pMnNiaShpbm9kZSksIExQUk9DX0xMX0lOT0RFX1BFUk0sIDEpOwogCXJjID0gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrKTsKIAorCS8qIHJlc3RvcmUgY3VycmVudCBwcm9jZXNzJ3MgY3JlZGVudGlhbHMgYW5kIEZTIGNhcGFiaWxpdHkgKi8KKwlpZiAoc3F1YXNoX2lkKSB7CisJCXJldmVydF9jcmVkcyhvbGRfY3JlZCk7CisJCXB1dF9jcmVkKGNyZWQpOworCX0KKwogCXJldHVybiByYzsKIH0KIApAQCAtMzIxMywxMCArMzMwNywxMCBAQAogCS5zZXRhdHRyCT0gbGxfc2V0YXR0ciwKIAkuZ2V0YXR0cgk9IGxsX2dldGF0dHIsCiAJLnBlcm1pc3Npb24JPSBsbF9pbm9kZV9wZXJtaXNzaW9uLAotCS5zZXR4YXR0cgk9IGxsX3NldHhhdHRyLAotCS5nZXR4YXR0cgk9IGxsX2dldHhhdHRyLAorCS5zZXR4YXR0cgk9IGdlbmVyaWNfc2V0eGF0dHIsCisJLmdldHhhdHRyCT0gZ2VuZXJpY19nZXR4YXR0ciwKIAkubGlzdHhhdHRyCT0gbGxfbGlzdHhhdHRyLAotCS5yZW1vdmV4YXR0cgk9IGxsX3JlbW92ZXhhdHRyLAorCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCiAJLmZpZW1hcAkJPSBsbF9maWVtYXAsCiAJLmdldF9hY2wJPSBsbF9nZXRfYWNsLAogfTsKQEAgLTMyNTEsNyArMzM0NSw2IEBACiAJaWYgKCFpbl9kYXRhKQogCQlyZXR1cm4gTlVMTDsKIAotCW1lbXNldChpbl9kYXRhLCAwLCBzaXplb2YoKmluX2RhdGEpKTsKIAlpbl9kYXRhLT5pb2NkX3NpemUgPSBzaXplOwogCWluX2RhdGEtPmlvY2RfY2IgPSBjYjsKIAlpbl9kYXRhLT5pb2NkX2NvdW50ID0gY291bnQ7CkBAIC0zMzg5LDcgKzM0ODIsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlsbW1zaXplID0gYm9keS0+ZWFkYXRhc2l6ZTsKKwlsbW1zaXplID0gYm9keS0+bWJvX2VhZGF0YXNpemU7CiAJaWYgKGxtbXNpemUgPT0gMCkgLyogZW1wdHkgbGF5b3V0ICovIHsKIAkJcmMgPSAwOwogCQlnb3RvIG91dDsKQEAgLTM0NDcsNyArMzU0MCw3IEBACiAJCSAgIFBGSUQoJmxsaS0+bGxpX2ZpZCksIGlub2RlLCByZWNvbmYpOwogCiAJLyogaW4gY2FzZSB0aGlzIGlzIGEgY2FjaGluZyBsb2NrIGFuZCByZWluc3RhdGUgd2l0aCBuZXcgaW5vZGUgKi8KLQltZF9zZXRfbG9ja19kYXRhKHNiaS0+bGxfbWRfZXhwLCAmbG9ja2gtPmNvb2tpZSwgaW5vZGUsIE5VTEwpOworCW1kX3NldF9sb2NrX2RhdGEoc2JpLT5sbF9tZF9leHAsIGxvY2toLCBpbm9kZSwgTlVMTCk7CiAKIAlsb2NrX3Jlc19hbmRfbG9jayhsb2NrKTsKIAlsdmJfcmVhZHkgPSBsZGxtX2lzX2x2Yl9yZWFkeShsb2NrKTsKQEAgLTM1NTcsOCArMzY1MCw4IEBACiAJc3RydWN0IGxkbG1fZW5xdWV1ZV9pbmZvIGVpbmZvID0gewogCQkuZWlfdHlwZSA9IExETE1fSUJJVFMsCiAJCS5laV9tb2RlID0gTENLX0NSLAotCQkuZWlfY2JfYmwgPSBsbF9tZF9ibG9ja2luZ19hc3QsCi0JCS5laV9jYl9jcCA9IGxkbG1fY29tcGxldGlvbl9hc3QsCisJCS5laV9jYl9ibCA9ICZsbF9tZF9ibG9ja2luZ19hc3QsCisJCS5laV9jYl9jcCA9ICZsZGxtX2NvbXBsZXRpb25fYXN0LAogCX07CiAJaW50IHJjOwogCkBAIC0zNjA0LDggKzM2OTcsNyBAQAogCQkJICBsbF9nZXRfZnNuYW1lKGlub2RlLT5pX3NiLCBOVUxMLCAwKSwKIAkJCSAgUEZJRCgmbGxpLT5sbGlfZmlkKSwgaW5vZGUpOwogCi0JcmMgPSBtZF9lbnF1ZXVlKHNiaS0+bGxfbWRfZXhwLCAmZWluZm8sICZpdCwgb3BfZGF0YSwgJmxvY2toLAotCQkJTlVMTCwgMCwgTlVMTCwgMCk7CisJcmMgPSBtZF9lbnF1ZXVlKHNiaS0+bGxfbWRfZXhwLCAmZWluZm8sIE5VTEwsICZpdCwgb3BfZGF0YSwgJmxvY2toLCAwKTsKIAlwdGxycGNfcmVxX2ZpbmlzaGVkKGl0Lml0X3JlcXVlc3QpOwogCWl0Lml0X3JlcXVlc3QgPSBOVUxMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9nbGltcHNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9nbGltcHNlLmMKaW5kZXggOTIwMDRhMDUuLjIyNTA3YjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2dsaW1wc2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9nbGltcHNlLmMKQEAgLTQyLDcgKzQyLDYgQEAKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZC5oIgogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfZGxtLmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX21kYy5oIgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sY29tbW9uX2NsLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sY29tbW9uX2NsLmMKaW5kZXggMzk2ZTRlNGYuLjA4NDMzMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xjb21tb25fY2wuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sY29tbW9uX2NsLmMKQEAgLTQ5LDcgKzQ5LDYgQEAKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkX3N1cHBvcnQuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9maWQuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saXRlLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfZGxtLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfdmVyLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbWRjLmgiCkBAIC0xMDAsNiArOTksNyBAQAogCWlvLT51LmNpX3NldGF0dHIuc2FfYXR0ci5sdmJfY3RpbWUgPSBMVElNRV9TKGF0dHItPmlhX2N0aW1lKTsKIAlpby0+dS5jaV9zZXRhdHRyLnNhX2F0dHIubHZiX3NpemUgPSBhdHRyLT5pYV9zaXplOwogCWlvLT51LmNpX3NldGF0dHIuc2FfdmFsaWQgPSBhdHRyLT5pYV92YWxpZDsKKwlpby0+dS5jaV9zZXRhdHRyLnNhX3BhcmVudF9maWQgPSBsbF9pbm9kZTJmaWQoaW5vZGUpOwogCiBhZ2FpbjoKIAlpZiAoY2xfaW9faW5pdChlbnYsIGlvLCBDSVRfU0VUQVRUUiwgaW8tPmNpX29iaikgPT0gMCkgewpAQCAtMTU0LDcgKzE1NCw3IEBACiAJaW50IHJlc3VsdCA9IDA7CiAJaW50IHJlZmNoZWNrOwogCi0JTEFTU0VSVChtZC0+Ym9keS0+dmFsaWQgJiBPQkRfTURfRkxJRCk7CisJTEFTU0VSVChtZC0+Ym9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0ZMSUQpOwogCUxBU1NFUlQoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSk7CiAKIAllbnYgPSBjbF9lbnZfZ2V0KCZyZWZjaGVjayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sY29tbW9uX21pc2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xjb21tb25fbWlzYy5jCmluZGV4IGY2YmUxMDUuLmZiMzQ2YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xjb21tb25fbWlzYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xjb21tb25fbWlzYy5jCkBAIC0zOCw3ICszOCw2IEBACiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmQuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2NsX29iamVjdC5oIgogCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIgogI2luY2x1ZGUgImxsaXRlX2ludGVybmFsLmgiCiAKIC8qIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgYW5kIG1heGltdW0gTE9WIEVBIGFuZCBjb29raWUgc2l6ZXMuICBUaGlzIGFsbG93cwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfY2xvc2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2Nsb3NlLmMKaW5kZXggMjMyNmI0MC4uODY0NDYzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfY2xvc2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9jbG9zZS5jCkBAIC0zOCw3ICszOCw2IEBACiAKICNkZWZpbmUgREVCVUdfU1VCU1lTVEVNIFNfTExJVEUKIAotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKICNpbmNsdWRlICJsbGl0ZV9pbnRlcm5hbC5oIgogCiAvKiogcmVjb3JkcyB0aGF0IGEgd3JpdGUgaXMgaW4gZmxpZ2h0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfaW50ZXJuYWwuaAppbmRleCA0ZDZkNTg5Li4zZTk4YmQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2ludGVybmFsLmgKQEAgLTM2LDE0ICszNiwyMSBAQAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX3Zlci5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2Rpc2suaCIJLyogZm9yIHMyc2JpICovCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfZWFjbC5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpbmtlYS5oIgogCiAvKiBmb3Igc3RydWN0IGNsX2xvY2tfZGVzY3IgYW5kIHN0cnVjdCBjbF9pbyAqLworI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX3BhdGNobGVzc19jb21wYXQuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9jb21wYXQuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2NsX29iamVjdC5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xtdi5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX21kYy5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2ludGVudC5oIgogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KICNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2xfeGF0dHIuaD4KICNpbmNsdWRlICJ2dnBfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJyYW5nZV9sb2NrLmgiCiAKICNpZm5kZWYgRk1PREVfRVhFQwogI2RlZmluZSBGTU9ERV9FWEVDIDAKQEAgLTU3LDYgKzY0LDkgQEAKICNkZWZpbmUgTExfRElSX0VORF9PRkYJICAweDdmZmZmZmZmZmZmZmZmZmZVTEwKICNkZWZpbmUgTExfRElSX0VORF9PRkZfMzJCSVQgICAgMHg3ZmZmZmZmZlVMCiAKKy8qIDRVTCAqIDEwMjQgKiAxMDI0ICovCisjZGVmaW5lIExMX01BWF9CTEtTSVpFX0JJVFMgMjIKKwogI2RlZmluZSBMTF9JVDJTVFIoaXQpICgoaXQpID8gbGRsbV9pdDJzdHIoKGl0KS0+aXRfb3ApIDogIjAiKQogI2RlZmluZSBMVVNUUkVfRlBSSVZBVEUoZmlsZSkgKChmaWxlKS0+cHJpdmF0ZV9kYXRhKQogCkBAIC0xMTYsOSArMTI2LDcgQEAKIAogCS8qIGlkZW50aWZ5aW5nIGZpZWxkcyBmb3IgYm90aCBtZXRhZGF0YSBhbmQgZGF0YSBzdGFja3MuICovCiAJc3RydWN0IGx1X2ZpZAkJICAgbGxpX2ZpZDsKLQkvKiBQYXJlbnQgZmlkIGZvciBhY2Nlc3NpbmcgZGVmYXVsdCBzdHJpcGUgZGF0YSBvbiBwYXJlbnQgZGlyZWN0b3J5Ci0JICogZm9yIGFsbG9jYXRpbmcgT1NUIG9iamVjdHMgYWZ0ZXIgYSBta25vZCgpIGFuZCBsYXRlciBvcGVuLWJ5LUZJRC4KLQkgKi8KKwkvKiBtYXN0ZXIgaW5vZGUgZmlkIGZvciBzdHJpcGUgZGlyZWN0b3J5ICovCiAJc3RydWN0IGx1X2ZpZAkJICAgbGxpX3BmaWQ7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgICAgIGxsaV9jbG9zZV9saXN0OwpAQCAtMTU2LDcgKzE2NCw3IEBACiAJCS8qIGZvciBkaXJlY3RvcnkgKi8KIAkJc3RydWN0IHsKIAkJCS8qIHNlcmlhbGl6ZSBub3JtYWwgcmVhZGRpciBhbmQgc3RhdGFoZWFkLXJlYWRkaXIuICovCi0JCQlzdHJ1Y3QgbXV0ZXgJCQlkX3JlYWRkaXJfbXV0ZXg7CisJCQlzdHJ1Y3QgbXV0ZXgJCQlsbGlfcmVhZGRpcl9tdXRleDsKIAogCQkJLyogbWV0YWRhdGEgc3RhdGFoZWFkICovCiAJCQkvKiBzaW5jZSBwYXJlbnQtY2hpbGQgdGhyZWFkcyBjYW4gc2hhcmUgdGhlIHNhbWUgQGZpbGUKQEAgLTE2NCwyNyArMTcyLDM5IEBACiAJCQkgKiBjYXNlIG9mIHBhcmVudCBleGl0IGJlZm9yZSBjaGlsZCAtLSBpdCBpcyBtZSBzaG91bGQKIAkJCSAqIGNsZWFudXAgdGhlIGRpciByZWFkYWhlYWQuCiAJCQkgKi8KLQkJCXZvaWQJCQkgICAqZF9vcGVuZGlyX2tleTsKLQkJCXN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAgICAgICAqZF9zYWk7CisJCQl2b2lkCQkJICAgICAgICpsbGlfb3BlbmRpcl9rZXk7CisJCQlzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gICAgICAgKmxsaV9zYWk7CiAJCQkvKiBwcm90ZWN0IHN0YXRhaGVhZCBzdHVmZi4gKi8KLQkJCXNwaW5sb2NrX3QJCQlkX3NhX2xvY2s7CisJCQlzcGlubG9ja190CQkJbGxpX3NhX2xvY2s7CiAJCQkvKiAib3BlbmRpcl9waWQiIGlzIHRoZSB0b2tlbiB3aGVuIGxvb2t1cC9yZXZhbGlkYXRlCiAJCQkgKiAtLSBJIGFtIHRoZSBvd25lciBvZiBkaXIgc3RhdGFoZWFkLgogCQkJICovCi0JCQlwaWRfdAkJCSAgIGRfb3BlbmRpcl9waWQ7Ci0JCX0gZDsKLQotI2RlZmluZSBsbGlfcmVhZGRpcl9tdXRleCAgICAgICB1LmQuZF9yZWFkZGlyX211dGV4Ci0jZGVmaW5lIGxsaV9vcGVuZGlyX2tleQkgdS5kLmRfb3BlbmRpcl9rZXkKLSNkZWZpbmUgbGxpX3NhaQkJIHUuZC5kX3NhaQotI2RlZmluZSBsbGlfc2FfbG9jawkgICAgIHUuZC5kX3NhX2xvY2sKLSNkZWZpbmUgbGxpX29wZW5kaXJfcGlkCSB1LmQuZF9vcGVuZGlyX3BpZAorCQkJcGlkX3QJCQkJbGxpX29wZW5kaXJfcGlkOworCQkJLyogc3RhdCB3aWxsIHRyeSB0byBhY2Nlc3Mgc3RhdGFoZWFkIGVudHJpZXMgb3Igc3RhcnQKKwkJCSAqIHN0YXRhaGVhZCBpZiB0aGlzIGZsYWcgaXMgc2V0LCBhbmQgdGhpcyBmbGFnIHdpbGwgYmUKKwkJCSAqIHNldCB1cG9uIGRpciBvcGVuLCBhbmQgY2xlYXJlZCB3aGVuIGRpciBpcyBjbG9zZWQsCisJCQkgKiBzdGF0YWhlYWQgaGl0IHJhdGlvIGlzIHRvbyBsb3csIG9yIHN0YXJ0IHN0YXRhaGVhZAorCQkJICogdGhyZWFkIGZhaWxlZC4KKwkJCSAqLworCQkJdW5zaWduZWQgaW50CQkJbGxpX3NhX2VuYWJsZWQ6MTsKKwkJCS8qIGdlbmVyYXRpb24gZm9yIHN0YXRhaGVhZCAqLworCQkJdW5zaWduZWQgaW50CQkJbGxpX3NhX2dlbmVyYXRpb247CisJCQkvKiBkaXJlY3Rvcnkgc3RyaXBlIGluZm9ybWF0aW9uICovCisJCQlzdHJ1Y3QgbG12X3N0cmlwZV9tZAkgICAgICAgKmxsaV9sc21fbWQ7CisJCQkvKiBkZWZhdWx0IGRpcmVjdG9yeSBzdHJpcGUgb2Zmc2V0LiAgVGhpcyBpcyBleHRyYWN0ZWQKKwkJCSAqIGZyb20gdGhlICJkbXYiIHhhdHRyIGluIG9yZGVyIHRvIGRlY2lkZSB3aGljaCBNRFQgdG8KKwkJCSAqIGNyZWF0ZSBhIHN1YmRpcmVjdG9yeSBvbi4gIFRoZSBNRFMgaXRzZWxmIGZldGNoZXMKKwkJCSAqICJkbXYiIGFuZCBnZXRzIHRoZSByZXN0IG9mIHRoZSBkZWZhdWx0IGxheW91dCBpdHNlbGYKKwkJCSAqIChjb3VudCwgaGFzaCwgZXRjKS4KKwkJCSAqLworCQkJX191MzIJCQkJbGxpX2RlZl9zdHJpcGVfb2Zmc2V0OworCQl9OwogCiAJCS8qIGZvciBub24tZGlyZWN0b3J5ICovCiAJCXN0cnVjdCB7Ci0JCQlzdHJ1Y3QgbXV0ZXgJCQlmX3NpemVfbXV0ZXg7Ci0JCQljaGFyCQkJCSpmX3N5bWxpbmtfbmFtZTsKLQkJCV9fdTY0CQkJCWZfbWF4Ynl0ZXM7CisJCQlzdHJ1Y3QgbXV0ZXgJCQlsbGlfc2l6ZV9tdXRleDsKKwkJCWNoYXIJCQkgICAgICAgKmxsaV9zeW1saW5rX25hbWU7CisJCQlfX3U2NAkJCQlsbGlfbWF4Ynl0ZXM7CiAJCQkvKgogCQkJICogc3RydWN0IHJ3X3NlbWFwaG9yZSB7CiAJCQkgKiAgICBzaWduZWQgbG9uZwljb3VudDsgICAgIC8vIGFsaWduIGQuZF9kZWZfYWNsCkBAIC0xOTIsMTYgKzIxMiwxNiBAQAogCQkJICogICAgc3RydWN0IGxpc3RfaGVhZCB3YWl0X2xpc3Q7CiAJCQkgKiB9CiAJCQkgKi8KLQkJCXN0cnVjdCByd19zZW1hcGhvcmUJCWZfdHJ1bmNfc2VtOwotCQkJc3RydWN0IG11dGV4CQkJZl93cml0ZV9tdXRleDsKKwkJCXN0cnVjdCByd19zZW1hcGhvcmUJCWxsaV90cnVuY19zZW07CisJCQlzdHJ1Y3QgcmFuZ2VfbG9ja190cmVlCQlsbGlfd3JpdGVfdHJlZTsKIAotCQkJc3RydWN0IHJ3X3NlbWFwaG9yZQkJZl9nbGltcHNlX3NlbTsKLQkJCXVuc2lnbmVkIGxvbmcJCQlmX2dsaW1wc2VfdGltZTsKLQkJCXN0cnVjdCBsaXN0X2hlYWQJCQlmX2FnbF9saXN0OwotCQkJX191NjQJCQkJZl9hZ2xfaW5kZXg7CisJCQlzdHJ1Y3Qgcndfc2VtYXBob3JlCQlsbGlfZ2xpbXBzZV9zZW07CisJCQl1bnNpZ25lZCBsb25nCQkJbGxpX2dsaW1wc2VfdGltZTsKKwkJCXN0cnVjdCBsaXN0X2hlYWQJCWxsaV9hZ2xfbGlzdDsKKwkJCV9fdTY0CQkJCWxsaV9hZ2xfaW5kZXg7CiAKIAkJCS8qIGZvciB3cml0ZXBhZ2UoKSBvbmx5IHRvIGNvbW11bmljYXRlIHRvIGZzeW5jICovCi0JCQlpbnQJCQkJZl9hc3luY19yYzsKKwkJCWludAkJCQlsbGlfYXN5bmNfcmM7CiAKIAkJCS8qCiAJCQkgKiB3aGVuZXZlciBhIHByb2Nlc3MgdHJ5IHRvIHJlYWQvd3JpdGUgdGhlIGZpbGUsIHRoZQpAQCAtMjExLDIyICsyMzEsOSBAQAogCQkJICogc28gdGhlIHJlYWQvd3JpdGUgc3RhdGlzdGljcyBmb3Igam9iaWQgd2lsbCBub3QgYmUKIAkJCSAqIGFjY3VyYXRlIGlmIHRoZSBmaWxlIGlzIHNoYXJlZCBieSBkaWZmZXJlbnQgam9icy4KIAkJCSAqLwotCQkJY2hhcgkJICAgICBmX2pvYmlkW0pPQlNUQVRTX0pPQklEX1NJWkVdOwotCQl9IGY7Ci0KLSNkZWZpbmUgbGxpX3NpemVfbXV0ZXggICAgICAgICAgdS5mLmZfc2l6ZV9tdXRleAotI2RlZmluZSBsbGlfc3ltbGlua19uYW1lCXUuZi5mX3N5bWxpbmtfbmFtZQotI2RlZmluZSBsbGlfbWF4Ynl0ZXMJICAgIHUuZi5mX21heGJ5dGVzCi0jZGVmaW5lIGxsaV90cnVuY19zZW0JICAgdS5mLmZfdHJ1bmNfc2VtCi0jZGVmaW5lIGxsaV93cml0ZV9tdXRleAkgdS5mLmZfd3JpdGVfbXV0ZXgKLSNkZWZpbmUgbGxpX2dsaW1wc2Vfc2VtCQl1LmYuZl9nbGltcHNlX3NlbQotI2RlZmluZSBsbGlfZ2xpbXBzZV90aW1lCXUuZi5mX2dsaW1wc2VfdGltZQotI2RlZmluZSBsbGlfYWdsX2xpc3QJCXUuZi5mX2FnbF9saXN0Ci0jZGVmaW5lIGxsaV9hZ2xfaW5kZXgJCXUuZi5mX2FnbF9pbmRleAotI2RlZmluZSBsbGlfYXN5bmNfcmMJCXUuZi5mX2FzeW5jX3JjCi0jZGVmaW5lIGxsaV9qb2JpZAkJdS5mLmZfam9iaWQKLQotCX0gdTsKKwkJCWNoYXIJCQkJbGxpX2pvYmlkW0xVU1RSRV9KT0JJRF9TSVpFXTsKKwkJfTsKKwl9OwogCiAJLyogWFhYOiBGb3IgZm9sbG93aW5nIGZyZXF1ZW50IHVzZWQgbWVtYmVycywgYWx0aG91Z2ggdGhleSBtYXliZSBzcGVjaWFsCiAJICogICAgICB1c2VkIGZvciBub24tZGlyZWN0b3J5IG9iamVjdCwgaXQgaXMgc29tZSB0aW1lLXdhc3RpbmcgdG8gY2hlY2sKQEAgLTQwMSwxMiArNDA4LDEzIEBACiAjZGVmaW5lIExMX1NCSV9MQVlPVVRfTE9DSyAgICAweDIwMDAwIC8qIGxheW91dCBsb2NrIHN1cHBvcnQgKi8KICNkZWZpbmUgTExfU0JJX1VTRVJfRklEMlBBVEggIDB4NDAwMDAgLyogYWxsb3cgZmlkMnBhdGggYnkgdW5wcml2aWxlZ2VkIHVzZXJzICovCiAjZGVmaW5lIExMX1NCSV9YQVRUUl9DQUNIRSAgICAweDgwMDAwIC8qIHN1cHBvcnQgZm9yIHhhdHRyIGNhY2hlICovCisjZGVmaW5lIExMX1NCSV9OT1JPT1RTUVVBU0gJMHgxMDAwMDAgLyogZG8gbm90IGFwcGx5IHJvb3Qgc3F1YXNoICovCiAKICNkZWZpbmUgTExfU0JJX0ZMQUdTIHsJXAogCSJub2xjayIsCVwKIAkiY2hlY2tzdW0iLAlcCiAJImZsb2NrIiwJXAotCSJ4YXR0ciIsCVwKKwkidXNlcl94YXR0ciIsCVwKIAkiYWNsIiwJCVwKIAkiPz8/IiwJCVwKIAkiPz8/IiwJCVwKQEAgLTQyMiw5ICs0MzAsMjcgQEAKIAkidmVyYm9zZSIsCVwKIAkibGF5b3V0IiwJXAogCSJ1c2VyX2ZpZDJwYXRoIixcCi0JInhhdHRyIiwJXAorCSJ4YXR0cl9jYWNoZSIsCVwKKwkibm9yb290c3F1YXNoIiwJXAogfQogCisvKgorICogVGhpcyBpcyBlbWJlZGRlZCBpbnRvIGxsaXRlIHN1cGVyLWJsb2NrcyB0byBrZWVwIHRyYWNrIG9mIGNvbm5lY3QKKyAqIGZsYWdzIChjYXBhYmlsaXRpZXMpIHN1cHBvcnRlZCBieSBhbGwgaW1wb3J0cyBnaXZlbiBtb3VudCBpcworICogY29ubmVjdGVkIHRvLgorICovCitzdHJ1Y3QgbHVzdHJlX2NsaWVudF9vY2QgeworCS8qCisJICogVGhpcyBpcyBjb25qdW5jdGlvbiBvZiBjb25uZWN0X2ZsYWdzIGFjcm9zcyBhbGwgaW1wb3J0cworCSAqIChMT1ZzKSB0aGlzIG1vdW50IGlzIGNvbm5lY3RlZCB0by4gVGhpcyBmaWVsZCBpcyB1cGRhdGVkIGJ5CisJICogY2xfb2NkX3VwZGF0ZSgpIHVuZGVyIC0+bGNvX2xvY2suCisJICovCisJX191NjQJCQkgbGNvX2ZsYWdzOworCXN0cnVjdCBtdXRleAkJIGxjb19sb2NrOworCXN0cnVjdCBvYmRfZXhwb3J0CSpsY29fbWRfZXhwOworCXN0cnVjdCBvYmRfZXhwb3J0CSpsY29fZHRfZXhwOworfTsKKwogc3RydWN0IGxsX3NiX2luZm8gewogCS8qIHRoaXMgcHJvdGVjdHMgcGdsaXN0IGFuZCByYV9pbmZvLiAgSXQgaXNuJ3Qgc2FmZSB0bwogCSAqIGdyYWIgZnJvbSBpbnRlcnJ1cHQgY29udGV4dHMKQEAgLTQ2MSw3ICs0ODcsNyBAQAogCXVuc2lnbmVkIGludAkgICAgICBsbF9uYW1lbGVuOwogCXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgICAqbGxfZm9wOwogCi0JdW5zaWduZWQgaW50CSAgICAgIGxsX21kX2Jyd19zaXplOyAvKiB1c2VkIGJ5IHJlYWRkaXIgKi8KKwl1bnNpZ25lZCBpbnQJCSAgbGxfbWRfYnJ3X3BhZ2VzOyAvKiByZWFkZGlyIHBhZ2VzIHBlciBSUEMgKi8KIAogCXN0cnVjdCBsdV9zaXRlCSAgICpsbF9zaXRlOwogCXN0cnVjdCBjbF9kZXZpY2UJICpsbF9jbDsKQEAgLTQ4NCwxMSArNTEwLDE3IEBACiAJYXRvbWljX3QJCSAgbGxfc2Ffd3Jvbmc7ICAgLyogc3RhdGFoZWFkIHRocmVhZCBzdG9wcGVkIGZvcgogCQkJCQkJICAqIGxvdyBoaXQgcmF0aW8KIAkJCQkJCSAgKi8KKwlhdG9taWNfdAkJbGxfc2FfcnVubmluZzsJLyogcnVubmluZyBzdGF0YWhlYWQgdGhyZWFkCisJCQkJCQkgKiBjb3VudAorCQkJCQkJICovCiAJYXRvbWljX3QJCSAgbGxfYWdsX3RvdGFsOyAgLyogQUdMIHRocmVhZCBzdGFydGVkIGNvdW50ICovCiAKIAlkZXZfdAkJCSAgbGxfc2Rldl9vcmlnOyAvKiBzYXZlIHNfZGV2IGJlZm9yZSBhc3NpZ24gZm9yCiAJCQkJCQkgKiBjbHVzdGVyZWQgbmZzCiAJCQkJCQkgKi8KKwkvKiByb290IHNxdWFzaCAqLworCXN0cnVjdCByb290X3NxdWFzaF9pbmZvCSAgbGxfc3F1YXNoOworCiAJX19rZXJuZWxfZnNpZF90CQkgIGxsX2ZzaWQ7CiAJc3RydWN0IGtvYmplY3QJCSBsbF9rb2JqOyAvKiBzeXNmcyBvYmplY3QgKi8KIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sJKmxsX3NiOyAvKiBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKGZvciBzeXNmcyBjb2RlKSovCkBAIC02NDMsMjUgKzY3NSw2NiBAQAogCQkgICAgICAgc3RydWN0IGxsX2ZpbGVfZGF0YSAqZmlsZSwgbG9mZl90IHBvcywKIAkJICAgICAgIHNpemVfdCBjb3VudCwgaW50IHJ3KTsKIAorZW51bSB7CisJTFBST0NfTExfRElSVFlfSElUUywKKwlMUFJPQ19MTF9ESVJUWV9NSVNTRVMsCisJTFBST0NfTExfUkVBRF9CWVRFUywKKwlMUFJPQ19MTF9XUklURV9CWVRFUywKKwlMUFJPQ19MTF9CUldfUkVBRCwKKwlMUFJPQ19MTF9CUldfV1JJVEUsCisJTFBST0NfTExfT1NDX1JFQUQsCisJTFBST0NfTExfT1NDX1dSSVRFLAorCUxQUk9DX0xMX0lPQ1RMLAorCUxQUk9DX0xMX09QRU4sCisJTFBST0NfTExfUkVMRUFTRSwKKwlMUFJPQ19MTF9NQVAsCisJTFBST0NfTExfTExTRUVLLAorCUxQUk9DX0xMX0ZTWU5DLAorCUxQUk9DX0xMX1JFQURESVIsCisJTFBST0NfTExfU0VUQVRUUiwKKwlMUFJPQ19MTF9UUlVOQywKKwlMUFJPQ19MTF9GTE9DSywKKwlMUFJPQ19MTF9HRVRBVFRSLAorCUxQUk9DX0xMX0NSRUFURSwKKwlMUFJPQ19MTF9MSU5LLAorCUxQUk9DX0xMX1VOTElOSywKKwlMUFJPQ19MTF9TWU1MSU5LLAorCUxQUk9DX0xMX01LRElSLAorCUxQUk9DX0xMX1JNRElSLAorCUxQUk9DX0xMX01LTk9ELAorCUxQUk9DX0xMX1JFTkFNRSwKKwlMUFJPQ19MTF9TVEFGUywKKwlMUFJPQ19MTF9BTExPQ19JTk9ERSwKKwlMUFJPQ19MTF9TRVRYQVRUUiwKKwlMUFJPQ19MTF9HRVRYQVRUUiwKKwlMUFJPQ19MTF9HRVRYQVRUUl9ISVRTLAorCUxQUk9DX0xMX0xJU1RYQVRUUiwKKwlMUFJPQ19MTF9SRU1PVkVYQVRUUiwKKwlMUFJPQ19MTF9JTk9ERV9QRVJNLAorCUxQUk9DX0xMX0ZJTEVfT1BDT0RFUworfTsKKwogLyogbGxpdGUvZGlyLmMgKi8KLXZvaWQgbGxfcmVsZWFzZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgcmVtb3ZlKTsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxsX2Rpcl9vcGVyYXRpb25zOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGxsX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwotc3RydWN0IHBhZ2UgKmxsX2dldF9kaXJfcGFnZShzdHJ1Y3QgaW5vZGUgKmRpciwgX191NjQgaGFzaCwKLQkJCSAgICAgc3RydWN0IGxsX2Rpcl9jaGFpbiAqY2hhaW4pOwotaW50IGxsX2Rpcl9yZWFkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KTsKLQoraW50IGxsX2Rpcl9yZWFkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIF9fdTY0ICpwcG9zLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKKwkJc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpOwogaW50IGxsX2dldF9tZHRfaWR4KHN0cnVjdCBpbm9kZSAqaW5vZGUpOworaW50IGxsX2dldF9tZHRfaWR4X2J5X2ZpZChzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpLCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQpOworc3RydWN0IHBhZ2UgKmxsX2dldF9kaXJfcGFnZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCisJCQkgICAgIF9fdTY0IG9mZnNldCk7Cit2b2lkIGxsX3JlbGVhc2VfcGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgYm9vbCByZW1vdmUpOworCiAvKiBsbGl0ZS9uYW1laS5jICovCiBleHRlcm4gY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbGxfc3BlY2lhbF9pbm9kZV9vcGVyYXRpb25zOwogCi1pbnQgbGxfb2JqZWN0c19kZXN0cm95KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxdWVzdCwKLQkJICAgICAgIHN0cnVjdCBpbm9kZSAqZGlyKTsKIHN0cnVjdCBpbm9kZSAqbGxfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbm9fdCBoYXNoLAogCQkgICAgICBzdHJ1Y3QgbHVzdHJlX21kICpsaWMpOworaW50IGxsX3Rlc3RfaW5vZGVfYnlfZmlkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKm9wYXF1ZSk7CiBpbnQgbGxfbWRfYmxvY2tpbmdfYXN0KHN0cnVjdCBsZGxtX2xvY2sgKiwgc3RydWN0IGxkbG1fbG9ja19kZXNjICosCiAJCSAgICAgICB2b2lkICpkYXRhLCBpbnQgZmxhZyk7CiBzdHJ1Y3QgZGVudHJ5ICpsbF9zcGxpY2VfYWxpYXMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqZGUpOwordm9pZCBsbF91cGRhdGVfdGltZXMoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXF1ZXN0LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIAogLyogbGxpdGUvcncuYyAqLwogaW50IGxsX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpOwpAQCAtNzA0LDcgKzc3NywxMCBAQAogCQkJICBzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAqZmgpOwogaW50IGxsX2dldGF0dHIoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlLCBzdHJ1Y3Qga3N0YXQgKnN0YXQpOwogc3RydWN0IHBvc2l4X2FjbCAqbGxfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSk7Ci0KK2ludCBsbF9taWdyYXRlKHN0cnVjdCBpbm9kZSAqcGFyZW50LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG1kdGlkeCwKKwkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pOworaW50IGxsX2dldF9maWRfYnlfbmFtZShzdHJ1Y3QgaW5vZGUgKnBhcmVudCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgIGludCBuYW1lbGVuLCBzdHJ1Y3QgbHVfZmlkICpmaWQpOwogaW50IGxsX2lub2RlX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spOwogCiBpbnQgbGxfbG92X3NldHN0cmlwZV9lYV9pbmZvKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKQEAgLTcxNSw4ICs3OTEsOCBAQAogCQkJICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0KTsKIGludCBsbF9kaXJfc2V0c3RyaXBlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBsb3ZfdXNlcl9tZCAqbHVtcCwKIAkJICAgICBpbnQgc2V0X2RlZmF1bHQpOwotaW50IGxsX2Rpcl9nZXRzdHJpcGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGxvdl9tZHNfbWQgKipsbW1wLAotCQkgICAgIGludCAqbG1tX3NpemUsIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXVlc3QpOworaW50IGxsX2Rpcl9nZXRzdHJpcGUoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqKmxtbXAsIGludCAqbG1tX3NpemUsCisJCSAgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCwgdTY0IHZhbGlkKTsKIGludCBsbF9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLCBpbnQgZGF0YSk7CiBpbnQgbGxfbWVyZ2VfYXR0cihjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogaW50IGxsX2ZpZDJwYXRoKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgX191c2VyICphcmcpOwpAQCAtNzQ4LDggKzgyNCw4IEBACiBpbnQgbGxfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlLCBzdHJ1Y3Qga3N0YXRmcyAqc2ZzKTsKIGludCBsbF9zdGF0ZnNfaW50ZXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IG9iZF9zdGF0ZnMgKm9zZnMsCiAJCSAgICAgICBfX3U2NCBtYXhfYWdlLCBfX3UzMiBmbGFncyk7Ci12b2lkIGxsX3VwZGF0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbHVzdHJlX21kICptZCk7Ci12b2lkIGxsX3JlYWRfaW5vZGUyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKm9wYXF1ZSk7CitpbnQgbGxfdXBkYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBsdXN0cmVfbWQgKm1kKTsKK2ludCBsbF9yZWFkX2lub2RlMihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpvcGFxdWUpOwogdm9pZCBsbF9kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CiBpbnQgbGxfaW9jb250cm9sKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwpAQCAtNzYzLDE1ICs4MzksNDYgQEAKIGludCBsbF9vYmRfc3RhdGZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgX191c2VyICphcmcpOwogaW50IGxsX2dldF9tYXhfbWRzaXplKHN0cnVjdCBsbF9zYl9pbmZvICpzYmksIGludCAqbWF4X21kc2l6ZSk7CiBpbnQgbGxfZ2V0X2RlZmF1bHRfbWRzaXplKHN0cnVjdCBsbF9zYl9pbmZvICpzYmksIGludCAqZGVmYXVsdF9tZHNpemUpOworaW50IGxsX3NldF9kZWZhdWx0X21kc2l6ZShzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpLCBpbnQgZGVmYXVsdF9tZHNpemUpOwogaW50IGxsX3Byb2Nlc3NfY29uZmlnKHN0cnVjdCBsdXN0cmVfY2ZnICpsY2ZnKTsKKworZW51bSB7CisJTFVTVFJFX09QQ19NS0RJUgk9IDAsCisJTFVTVFJFX09QQ19TWU1MSU5LCT0gMSwKKwlMVVNUUkVfT1BDX01LTk9ECT0gMiwKKwlMVVNUUkVfT1BDX0NSRUFURQk9IDMsCisJTFVTVFJFX09QQ19BTlkJCT0gNSwKK307CisKIHN0cnVjdCBtZF9vcF9kYXRhICpsbF9wcmVwX21kX29wX2RhdGEoc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCiAJCQkJICAgICAgc3RydWN0IGlub2RlICppMSwgc3RydWN0IGlub2RlICppMiwKLQkJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKLQkJCQkgICAgICBpbnQgbW9kZSwgX191MzIgb3BjLCB2b2lkICpkYXRhKTsKKwkJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZWxlbiwKKwkJCQkgICAgICB1MzIgbW9kZSwgX191MzIgb3BjLCB2b2lkICpkYXRhKTsKIHZvaWQgbGxfZmluaXNoX21kX29wX2RhdGEoc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEpOwogaW50IGxsX2dldF9vYmRfbmFtZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBjaGFyICpsbF9nZXRfZnNuYW1lKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNoYXIgKmJ1ZiwgaW50IGJ1Zmxlbik7Cit2b2lkIGxsX2NvbXB1dGVfcm9vdHNxdWFzaF9zdGF0ZShzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpKTsKIHZvaWQgbGxfb3Blbl9jbGVhbnVwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqb3Blbl9yZXEpOworc3NpemVfdCBsbF9jb3B5X3VzZXJfbWQoY29uc3Qgc3RydWN0IGxvdl91c2VyX21kIF9fdXNlciAqbWQsCisJCQlzdHJ1Y3QgbG92X3VzZXJfbWQgKiprYnVmKTsKKworLyogQ29tcHV0ZSBleHBlY3RlZCB1c2VyIG1kIHNpemUgd2hlbiBwYXNzaW5nIGluIGEgbWQgZnJvbSB1c2VyIHNwYWNlICovCitzdGF0aWMgaW5saW5lIHNzaXplX3QgbGxfbG92X3VzZXJfbWRfc2l6ZShjb25zdCBzdHJ1Y3QgbG92X3VzZXJfbWQgKmx1bSkKK3sKKwlzd2l0Y2ggKGx1bS0+bG1tX21hZ2ljKSB7CisJY2FzZSBMT1ZfVVNFUl9NQUdJQ19WMToKKwkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgbG92X3VzZXJfbWRfdjEpOworCWNhc2UgTE9WX1VTRVJfTUFHSUNfVjM6CisJCXJldHVybiBzaXplb2Yoc3RydWN0IGxvdl91c2VyX21kX3YzKTsKKwljYXNlIExPVl9VU0VSX01BR0lDX1NQRUNJRklDOgorCQlpZiAobHVtLT5sbW1fc3RyaXBlX2NvdW50ID4gTE9WX01BWF9TVFJJUEVfQ09VTlQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlyZXR1cm4gbG92X3VzZXJfbWRfc2l6ZShsdW0tPmxtbV9zdHJpcGVfY291bnQsCisJCQkJCUxPVl9VU0VSX01BR0lDX1NQRUNJRklDKTsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CiAKIC8qIGxsaXRlL2xsaXRlX25mcy5jICovCiBleHRlcm4gY29uc3Qgc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIGx1c3RyZV9leHBvcnRfb3BlcmF0aW9uczsKQEAgLTc3OSw2ICs4ODYsNyBAQAogdm9pZCBnZXRfdXVpZDJmc2lkKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4sIF9fa2VybmVsX2ZzaWRfdCAqZnNpZCk7CiBzdHJ1Y3QgaW5vZGUgKnNlYXJjaF9pbm9kZV9mb3JfbHVzdHJlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkJICAgICAgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkKTsKK2ludCBsbF9kaXJfZ2V0X3BhcmVudF9maWQoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBsdV9maWQgKnBhcmVudF9maWQpOwogCiAvKiBsbGl0ZS9zeW1saW5rLmMgKi8KIGV4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBsbF9mYXN0X3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKQEAgLTkzMywxMiArMTA0MSwxOSBAQAogfQogCiAvKiBsbGl0ZS94YXR0ci5jICovCi1pbnQgbGxfc2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQljb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncyk7Ci1zc2l6ZV90IGxsX2dldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJICAgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworZXh0ZXJuIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpsbF94YXR0cl9oYW5kbGVyc1tdOworCisjZGVmaW5lIFhBVFRSX1VTRVJfVAkJMQorI2RlZmluZSBYQVRUUl9UUlVTVEVEX1QJCTIKKyNkZWZpbmUgWEFUVFJfU0VDVVJJVFlfVAkzCisjZGVmaW5lIFhBVFRSX0FDTF9BQ0NFU1NfVAk0CisjZGVmaW5lIFhBVFRSX0FDTF9ERUZBVUxUX1QJNQorI2RlZmluZSBYQVRUUl9MVVNUUkVfVAkJNgorI2RlZmluZSBYQVRUUl9PVEhFUl9UCQk3CisKIHNzaXplX3QgbGxfbGlzdHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7Ci1pbnQgbGxfcmVtb3ZleGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lKTsKK2ludCBsbF94YXR0cl9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCB0eXBlLAorCQkgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUsIF9fdTY0IHZhbGlkKTsKIAogLyoqCiAgKiBDb21tb24gSU8gYXJndW1lbnRzIGZvciB2YXJpb3VzIFZGUyBJL08gaW50ZXJmYWNlcy4KQEAgLTk2NCwxMSArMTA3OSwxMCBAQAogCiAvKiBwZXIgaW5vZGUgc3RydWN0LCBmb3IgZGlyIG9ubHkgKi8KIHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyB7Ci0Jc3RydWN0IGlub2RlCSAgICpzYWlfaW5vZGU7CisJc3RydWN0IGRlbnRyeQkgICAqc2FpX2RlbnRyeTsKIAlhdG9taWNfdAkgICAgc2FpX3JlZmNvdW50OyAgIC8qIHdoZW4gYWNjZXNzIHRoaXMgc3RydWN0LCBob2xkCiAJCQkJCSAgICAgKiByZWZjb3VudAogCQkJCQkgICAgICovCi0JdW5zaWduZWQgaW50CSAgICBzYWlfZ2VuZXJhdGlvbjsgLyogZ2VuZXJhdGlvbiBmb3Igc3RhdGFoZWFkICovCiAJdW5zaWduZWQgaW50CSAgICBzYWlfbWF4OwkvKiBtYXggYWhlYWQgb2YgbG9va3VwICovCiAJX191NjQJCSAgIHNhaV9zZW50OyAgICAgICAvKiBzdGF0IHJlcXVlc3RzIHNlbnQgY291bnQgKi8KIAlfX3U2NAkJICAgc2FpX3JlcGxpZWQ7ICAgIC8qIHN0YXQgcmVxdWVzdHMgd2hpY2ggcmVjZWl2ZWQKQEAgLTk5NSwyMiArMTEwOSwyNSBAQAogCXVuc2lnbmVkIGludAkgICAgc2FpX2xzX2FsbDoxLCAgIC8qICJscyAtYWwiLCBkbyBzdGF0LWFoZWFkIGZvcgogCQkJCQkgICAgICogaGlkZGVuIGVudHJpZXMKIAkJCQkJICAgICAqLwotCQkJCXNhaV9hZ2xfdmFsaWQ6MTsvKiBBR0wgaXMgdmFsaWQgZm9yIHRoZSBkaXIgKi8KKwkJCQlzYWlfYWdsX3ZhbGlkOjEsLyogQUdMIGlzIHZhbGlkIGZvciB0aGUgZGlyICovCisJCQkJc2FpX2luX3JlYWRwYWdlOjE7Lyogc3RhdGFoZWFkIGlzIGluIHJlYWRkaXIoKSAqLwogCXdhaXRfcXVldWVfaGVhZF90CXNhaV93YWl0cTsgICAgICAvKiBzdGF0LWFoZWFkIHdhaXQgcXVldWUgKi8KIAlzdHJ1Y3QgcHRscnBjX3RocmVhZCAgICBzYWlfdGhyZWFkOyAgICAgLyogc3RhdC1haGVhZCB0aHJlYWQgKi8KIAlzdHJ1Y3QgcHRscnBjX3RocmVhZCAgICBzYWlfYWdsX3RocmVhZDsgLyogQUdMIHRocmVhZCAqLwotCXN0cnVjdCBsaXN0X2hlYWQJc2FpX2VudHJpZXM7ICAgIC8qIGVudHJ5IGxpc3QgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCXNhaV9lbnRyaWVzX3JlY2VpdmVkOyAvKiBlbnRyaWVzIHJldHVybmVkICovCi0Jc3RydWN0IGxpc3RfaGVhZAlzYWlfZW50cmllc19zdGF0ZWQ7ICAgLyogZW50cmllcyBzdGF0ZWQgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCXNhaV9lbnRyaWVzX2FnbDsgLyogQUdMIGVudHJpZXMgdG8gYmUgc2VudCAqLworCXN0cnVjdCBsaXN0X2hlYWQJc2FpX2ludGVyaW1fZW50cmllczsgLyogZW50cmllcyB3aGljaCBnb3QgYXN5bmMKKwkJCQkJCSAgICAgICogc3RhdCByZXBseSwgYnV0IG5vdAorCQkJCQkJICAgICAgKiBpbnN0YW50aWF0ZWQKKwkJCQkJCSAgICAgICovCisJc3RydWN0IGxpc3RfaGVhZAlzYWlfZW50cmllczsJLyogY29tcGxldGVkIGVudHJpZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXNhaV9hZ2xzOwkvKiBBR0xzIHRvIGJlIHNlbnQgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCXNhaV9jYWNoZVtMTF9TQV9DQUNIRV9TSVpFXTsKIAlzcGlubG9ja190CQlzYWlfY2FjaGVfbG9ja1tMTF9TQV9DQUNIRV9TSVpFXTsKIAlhdG9taWNfdAkJc2FpX2NhY2hlX2NvdW50OyAvKiBlbnRyeSBjb3VudCBpbiBjYWNoZSAqLwogfTsKIAotaW50IGRvX3N0YXRhaGVhZF9lbnRlcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqKmRlbnRyeSwKLQkJICAgICAgIGludCBvbmx5X3VucGx1Zyk7Ci12b2lkIGxsX3N0b3Bfc3RhdGFoZWFkKHN0cnVjdCBpbm9kZSAqZGlyLCB2b2lkICprZXkpOworaW50IGxsX3N0YXRhaGVhZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqKmRlbnRyeSwgYm9vbCB1bnBsdWcpOwordm9pZCBsbF9hdXRob3JpemVfc3RhdGFoZWFkKHN0cnVjdCBpbm9kZSAqZGlyLCB2b2lkICprZXkpOwordm9pZCBsbF9kZWF1dGhvcml6ZV9zdGF0YWhlYWQoc3RydWN0IGlub2RlICpkaXIsIHZvaWQgKmtleSk7CiAKIGJsa2NudF90IGRpcnR5X2NudChzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIApAQCAtMTA0MCw3MyArMTE1Nyw1MyBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCi1sbF9zdGF0YWhlYWRfbWFyayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQotewotCXN0cnVjdCBsbF9pbm9kZV9pbmZvICAgICAqbGxpID0gbGxfaTJpbmZvKGRpcik7Ci0Jc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWkgPSBsbGktPmxsaV9zYWk7Ci0Jc3RydWN0IGxsX2RlbnRyeV9kYXRhICAgICpsZGQgPSBsbF9kMmQoZGVudHJ5KTsKLQotCS8qIG5vdCB0aGUgc2FtZSBwcm9jZXNzLCBkb24ndCBtYXJrICovCi0JaWYgKGxsaS0+bGxpX29wZW5kaXJfcGlkICE9IGN1cnJlbnRfcGlkKCkpCi0JCXJldHVybjsKLQotCUxBU1NFUlQobGRkKTsKLQlpZiAoc2FpKQotCQlsZGQtPmxsZF9zYV9nZW5lcmF0aW9uID0gc2FpLT5zYWlfZ2VuZXJhdGlvbjsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLWRfbmVlZF9zdGF0YWhlYWQoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeXApCisvKgorICogZGVudHJ5IG1heSBzdGF0YWhlYWQgd2hlbiBzdGF0YWhlYWQgaXMgZW5hYmxlZCBhbmQgY3VycmVudCBwcm9jZXNzIGhhcyBvcGVuZWQKKyAqIHBhcmVudCBkaXJlY3RvcnksIGFuZCB0aGlzIGRlbnRyeSBoYXNuJ3QgYWNjZXNzZWQgc3RhdGFoZWFkIGNhY2hlIGJlZm9yZQorICovCitzdGF0aWMgaW5saW5lIGJvb2wKK2RlbnRyeV9tYXlfc3RhdGFoZWFkKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CiAJc3RydWN0IGxsX2lub2RlX2luZm8gICpsbGk7CiAJc3RydWN0IGxsX2RlbnRyeV9kYXRhICpsZGQ7CiAKIAlpZiAobGxfaTJzYmkoZGlyKS0+bGxfc2FfbWF4ID09IDApCi0JCXJldHVybiAtRUFHQUlOOworCQlyZXR1cm4gZmFsc2U7CiAKIAlsbGkgPSBsbF9pMmluZm8oZGlyKTsKKworCS8qCisJICogc3RhdGFoZWFkIGlzIG5vdCBhbGxvd2VkIGZvciB0aGlzIGRpciwgdGhlcmUgbWF5IGJlIHRocmVlIGNhdXNlczoKKwkgKiAxLiBkaXIgaXMgbm90IG9wZW5lZC4KKwkgKiAyLiBzdGF0YWhlYWQgaGl0IHJhdGlvIGlzIHRvbyBsb3cuCisJICogMy4gcHJldmlvdXMgc3RhdCBzdGFydGVkIHN0YXRhaGVhZCB0aHJlYWQgZmFpbGVkLgorCSAqLworCWlmICghbGxpLT5sbGlfc2FfZW5hYmxlZCkKKwkJcmV0dXJuIGZhbHNlOworCiAJLyogbm90IHRoZSBzYW1lIHByb2Nlc3MsIGRvbid0IHN0YXRhaGVhZCAqLwogCWlmIChsbGktPmxsaV9vcGVuZGlyX3BpZCAhPSBjdXJyZW50X3BpZCgpKQotCQlyZXR1cm4gLUVBR0FJTjsKKwkJcmV0dXJuIGZhbHNlOwogCi0JLyogc3RhdGFoZWFkIGhhcyBiZWVuIHN0b3BwZWQgKi8KLQlpZiAoIWxsaS0+bGxpX29wZW5kaXJfa2V5KQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCWxkZCA9IGxsX2QyZChkZW50cnlwKTsKIAkvKgotCSAqIFdoZW4gc3RhdHMgYSBkZW50cnksIHRoZSBzeXN0ZW0gdHJpZ2dlciBtb3JlIHRoYW4gb25jZSAicmV2YWxpZGF0ZSIKLQkgKiBvciAibG9va3VwIiwgZm9yICJnZXRhdHRyIiwgZm9yICJnZXR4YXR0ciIsIGFuZCBtYXliZSBmb3Igb3RoZXJzLgotCSAqIFVuZGVyIHBhdGNobGVzcyBjbGllbnQgbW9kZSwgdGhlIG9wZXJhdGlvbiBpbnRlbnQgaXMgbm90IGFjY3VyYXRlLAotCSAqIHdoaWNoIG1heWJlIG1pc2d1aWRlIHRoZSBzdGF0YWhlYWQgdGhyZWFkLiBGb3IgZXhhbXBsZToKLQkgKiBUaGUgInJldmFsaWRhdGUiIGNhbGwgZm9yICJnZXRhdHRyIiBhbmQgImdldHhhdHRyIiBvZiBhIGRlbnRyeSBtYXliZQotCSAqIGhhdmUgdGhlIHNhbWUgb3BlcmF0aW9uIGludGVudCAtLSAiSVRfR0VUQVRUUiIuCi0JICogSW4gZmFjdCwgb25lIGRlbnRyeSBzaG91bGQgaGFzIG9ubHkgb25lIGNoYW5jZSB0byBpbnRlcmFjdCB3aXRoIHRoZQotCSAqIHN0YXRhaGVhZCB0aHJlYWQsIG90aGVyd2lzZSB0aGUgc3RhdGFoZWFkIHdpbmRvd3Mgd2lsbCBiZSBjb25mdXNlZC4KKwkgKiBXaGVuIHN0YXRpbmcgYSBkZW50cnksIGtlcm5lbCBtYXkgdHJpZ2dlciAncmV2YWxpZGF0ZScgb3IgJ2xvb2t1cCcKKwkgKiBtdWx0aXBsZSB0aW1lcywgZWcuIGZvciAnZ2V0YXR0cicsICdnZXR4YXR0cicgYW5kIGV0Yy4KKwkgKiBGb3IgcGF0Y2hsZXNzIGNsaWVudCwgbG9va3VwIGludGVudCBpcyBub3QgYWNjdXJhdGUsIHdoaWNoIG1heQorCSAqIG1pc2d1aWRlIHN0YXRhaGVhZC4gRm9yIGV4YW1wbGU6CisJICogVGhlICdyZXZhbGlkYXRlJyBjYWxsIGZvciAnZ2V0YXR0cicgYW5kICdnZXR4YXR0cicgb2YgYSBkZW50cnkgd2lsbAorCSAqIGhhdmUgdGhlIHNhbWUgaW50ZW50IC0tIElUX0dFVEFUVFIsIHdoaWxlIG9uZSBkZW50cnkgc2hvdWxkIGFjY2VzcworCSAqIHN0YXRhaGVhZCBjYWNoZSBvbmNlLCBvdGhlcndpc2Ugc3RhdGFoZWFkIHdpbmRvd3MgaXMgbWVzc2VkIHVwLgogCSAqIFRoZSBzb2x1dGlvbiBpcyBhcyBmb2xsb3dpbmc6Ci0JICogQXNzaWduICJsbGRfc2FfZ2VuZXJhdGlvbiIgd2l0aCAic2FpX2dlbmVyYXRpb24iIHdoZW4gYSBkZW50cnkKLQkgKiAiSVRfR0VUQVRUUiIgZm9yIHRoZSBmaXJzdCB0aW1lLCBhbmQgdGhlIHN1YnNlcXVlbnQgIklUX0dFVEFUVFIiCi0JICogd2lsbCBieXBhc3MgaW50ZXJhY3Rpbmcgd2l0aCBzdGF0YWhlYWQgdGhyZWFkIGZvciBjaGVja2luZzoKLQkgKiAibGxkX3NhX2dlbmVyYXRpb24gPT0gbGxpX3NhaS0+c2FpX2dlbmVyYXRpb24iCisJICogQXNzaWduICdsbGRfc2FfZ2VuZXJhdGlvbicgd2l0aCAnbGxpX3NhX2dlbmVyYXRpb24nIHdoZW4gYSBkZW50cnkKKwkgKiBJVF9HRVRBVFRSIGZvciB0aGUgZmlyc3QgdGltZSwgYW5kIHN1YnNlcXVlbnQgSVRfR0VUQVRUUiB3aWxsCisJICogYnlwYXNzIGludGVyYWN0aW5nIHdpdGggc3RhdGFoZWFkIGNhY2hlIGJ5IGNoZWNraW5nCisJICogJ2xsZF9zYV9nZW5lcmF0aW9uID09IGxsaS0+bGxpX3NhX2dlbmVyYXRpb24nLgogCSAqLwotCWlmIChsZGQgJiYgbGxpLT5sbGlfc2FpICYmCi0JICAgIGxkZC0+bGxkX3NhX2dlbmVyYXRpb24gPT0gbGxpLT5sbGlfc2FpLT5zYWlfZ2VuZXJhdGlvbikKLQkJcmV0dXJuIC1FQUdBSU47CisJbGRkID0gbGxfZDJkKGRlbnRyeSk7CisJaWYgKGxkZCAmJiBsZGQtPmxsZF9zYV9nZW5lcmF0aW9uID09IGxsaS0+bGxpX3NhX2dlbmVyYXRpb24pCisJCXJldHVybiBmYWxzZTsKIAotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotbGxfc3RhdGFoZWFkX2VudGVyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICoqZGVudHJ5cCwgaW50IG9ubHlfdW5wbHVnKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBkX25lZWRfc3RhdGFoZWFkKGRpciwgKmRlbnRyeXApOwotCWlmIChyZXQgPD0gMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiBkb19zdGF0YWhlYWRfZW50ZXIoZGlyLCBkZW50cnlwLCBvbmx5X3VucGx1Zyk7CisJcmV0dXJuIHRydWU7CiB9CiAKIC8qIGxsaXRlIGlvY3RsIHJlZ2lzdGVyIHN1cHBvcnQgcm91dGluZSAqLwpAQCAtMTIxMyw3ICsxMzEwLDcgQEAKIAkJCUNERUJVRyhEX0RMTVRSQUNFLCAic2V0dGluZyBsX2RhdGEgdG8gaW5vZGUgIkRGSUQiJXAgZm9yIHJlbW90ZSBsb2NrICUjbGx4XG4iLAogCQkJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSksIGlub2RlLAogCQkJICAgICAgIGhhbmRsZS5jb29raWUpOwotCQkJbWRfc2V0X2xvY2tfZGF0YShleHAsICZoYW5kbGUuY29va2llLCBpbm9kZSwgTlVMTCk7CisJCQltZF9zZXRfbG9ja19kYXRhKGV4cCwgJmhhbmRsZSwgaW5vZGUsIE5VTEwpOwogCQl9CiAKIAkJaGFuZGxlLmNvb2tpZSA9IGl0LT5pdF9sb2NrX2hhbmRsZTsKQEAgLTEyMjEsOCArMTMxOCw3IEBACiAJCUNERUJVRyhEX0RMTVRSQUNFLCAic2V0dGluZyBsX2RhdGEgdG8gaW5vZGUgIkRGSUQiJXAgZm9yIGxvY2sgJSNsbHhcbiIsCiAJCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpLCBpbm9kZSwgaGFuZGxlLmNvb2tpZSk7CiAKLQkJbWRfc2V0X2xvY2tfZGF0YShleHAsICZoYW5kbGUuY29va2llLCBpbm9kZSwKLQkJCQkgJml0LT5pdF9sb2NrX2JpdHMpOworCQltZF9zZXRfbG9ja19kYXRhKGV4cCwgJmhhbmRsZSwgaW5vZGUsICZpdC0+aXRfbG9ja19iaXRzKTsKIAkJaXQtPml0X2xvY2tfc2V0ID0gMTsKIAl9CiAKQEAgLTEyOTUsNiArMTM5MSw4IEBACiBpbnQgbGxfcGFnZV9zeW5jX2lvKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsX2lvICppbywKIAkJICAgIHN0cnVjdCBjbF9wYWdlICpwYWdlLCBlbnVtIGNsX3JlcV90eXBlIGNydCk7CiAKK2ludCBsbF9nZXRwYXJlbnQoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBnZXRwYXJlbnQgX191c2VyICphcmcpOworCiAvKiBsY29tbW9uX2NsLmMgKi8KIGludCBjbF9zZXRhdHRyX29zdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBzdHJ1Y3QgaWF0dHIgKmF0dHIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9saWIuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2xpYi5jCmluZGV4IDU0NjA2M2UuLjZiYjQxYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2xpYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2xpYi5jCkBAIC00MSw3ICs0MSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV9pb2N0bC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2hhLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfZGxtLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9scHJvY2ZzX3N0YXR1cy5oIgpAQCAtMTE1LDkgKzExNSwxNiBAQAogCXNiaS0+bGxfc2FfbWF4ID0gTExfU0FfUlBDX0RFRjsKIAlhdG9taWNfc2V0KCZzYmktPmxsX3NhX3RvdGFsLCAwKTsKIAlhdG9taWNfc2V0KCZzYmktPmxsX3NhX3dyb25nLCAwKTsKKwlhdG9taWNfc2V0KCZzYmktPmxsX3NhX3J1bm5pbmcsIDApOwogCWF0b21pY19zZXQoJnNiaS0+bGxfYWdsX3RvdGFsLCAwKTsKIAlzYmktPmxsX2ZsYWdzIHw9IExMX1NCSV9BR0xfRU5BQkxFRDsKIAorCS8qIHJvb3Qgc3F1YXNoICovCisJc2JpLT5sbF9zcXVhc2gucnNpX3VpZCA9IDA7CisJc2JpLT5sbF9zcXVhc2gucnNpX2dpZCA9IDA7CisJSU5JVF9MSVNUX0hFQUQoJnNiaS0+bGxfc3F1YXNoLnJzaV9ub3NxdWFzaF9uaWRzKTsKKwlpbml0X3J3c2VtKCZzYmktPmxsX3NxdWFzaC5yc2lfc2VtKTsKKwogCXNiaS0+bGxfc2IgPSBzYjsKIAogCXJldHVybiBzYmk7CkBAIC0xMjgsNiArMTM1LDggQEAKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfczJzYmkoc2IpOwogCiAJaWYgKHNiaS0+bGxfY2FjaGUpIHsKKwkJaWYgKCFsaXN0X2VtcHR5KCZzYmktPmxsX3NxdWFzaC5yc2lfbm9zcXVhc2hfbmlkcykpCisJCQljZnNfZnJlZV9uaWRsaXN0KCZzYmktPmxsX3NxdWFzaC5yc2lfbm9zcXVhc2hfbmlkcyk7CiAJCWNsX2NhY2hlX2RlY3JlZihzYmktPmxsX2NhY2hlKTsKIAkJc2JpLT5sbF9jYWNoZSA9IE5VTEw7CiAJfQpAQCAtMTgwLDcgKzE4OSw5IEBACiAJCQkJICBPQkRfQ09OTkVDVF9QSU5HTEVTUyB8CiAJCQkJICBPQkRfQ09OTkVDVF9NQVhfRUFTSVpFIHwKIAkJCQkgIE9CRF9DT05ORUNUX0ZMT0NLX0RFQUQgfAotCQkJCSAgT0JEX0NPTk5FQ1RfRElTUF9TVFJJUEU7CisJCQkJICBPQkRfQ09OTkVDVF9ESVNQX1NUUklQRSB8IE9CRF9DT05ORUNUX0xGU0NLIHwKKwkJCQkgIE9CRF9DT05ORUNUX09QRU5fQllfRklEIHwKKwkJCQkgIE9CRF9DT05ORUNUX0RJUl9TVFJJUEU7CiAKIAlpZiAoc2JpLT5sbF9mbGFncyAmIExMX1NCSV9TT01fUFJFVklFVykKIAkJZGF0YS0+b2NkX2Nvbm5lY3RfZmxhZ3MgfD0gT0JEX0NPTk5FQ1RfU09NOwpAQCAtMzEwLDkgKzMyMSw5IEBACiAJCXNiaS0+bGxfZmxhZ3MgfD0gTExfU0JJXzY0QklUX0hBU0g7CiAKIAlpZiAoZGF0YS0+b2NkX2Nvbm5lY3RfZmxhZ3MgJiBPQkRfQ09OTkVDVF9CUldfU0laRSkKLQkJc2JpLT5sbF9tZF9icndfc2l6ZSA9IGRhdGEtPm9jZF9icndfc2l6ZTsKKwkJc2JpLT5sbF9tZF9icndfcGFnZXMgPSBkYXRhLT5vY2RfYnJ3X3NpemUgPj4gUEFHRV9TSElGVDsKIAllbHNlCi0JCXNiaS0+bGxfbWRfYnJ3X3NpemUgPSBQQUdFX1NJWkU7CisJCXNiaS0+bGxfbWRfYnJ3X3BhZ2VzID0gMTsKIAogCWlmIChkYXRhLT5vY2RfY29ubmVjdF9mbGFncyAmIE9CRF9DT05ORUNUX0xBWU9VVExPQ0spCiAJCXNiaS0+bGxfZmxhZ3MgfD0gTExfU0JJX0xBWU9VVF9MT0NLOwpAQCAtNDE4LDYgKzQyOSw3IEBACiAJQ0RFQlVHKERfU1VQRVIsICJyb290ZmlkICJERklEIlxuIiwgUEZJRCgmc2JpLT5sbF9yb290X2ZpZCkpOwogCiAJc2ItPnNfb3AgPSAmbHVzdHJlX3N1cGVyX29wZXJhdGlvbnM7CisJc2ItPnNfeGF0dHIgPSBsbF94YXR0cl9oYW5kbGVyczsKICNpZiBUSFJFQURfU0laRSA+PSA4MTkyIC8qYj0xNzYzMCovCiAJc2ItPnNfZXhwb3J0X29wID0gJmx1c3RyZV9leHBvcnRfb3BlcmF0aW9uczsKICNlbmRpZgpAQCAtNDYyLDcgKzQ3NCw3IEBACiAJbWRfZnJlZV9sdXN0cmVfbWQoc2JpLT5sbF9tZF9leHAsICZsbWQpOwogCXB0bHJwY19yZXFfZmluaXNoZWQocmVxdWVzdCk7CiAKLQlpZiAoIShyb290KSkgeworCWlmIChJU19FUlIocm9vdCkpIHsKIAkJaWYgKGxtZC5sc20pCiAJCQlvYmRfZnJlZV9tZW1tZChzYmktPmxsX2R0X2V4cCwgJmxtZC5sc20pOwogI2lmZGVmIENPTkZJR19GU19QT1NJWF9BQ0wKQEAgLTQ4NiwxMSArNDk4LDIxIEBACiAJZXJyID0gb2JkX3NldF9pbmZvX2FzeW5jKE5VTEwsIHNiaS0+bGxfZHRfZXhwLCBzaXplb2YoS0VZX0NIRUNLU1VNKSwKIAkJCQkgS0VZX0NIRUNLU1VNLCBzaXplb2YoY2hlY2tzdW0pLCAmY2hlY2tzdW0sCiAJCQkJIE5VTEwpOworCWlmIChlcnIpIHsKKwkJQ0VSUk9SKCIlczogU2V0IGNoZWNrc3VtIGZhaWxlZDogcmMgPSAlZFxuIiwKKwkJICAgICAgIHNiaS0+bGxfZHRfZXhwLT5leHBfb2JkLT5vYmRfbmFtZSwgZXJyKTsKKwkJZ290byBvdXRfcm9vdDsKKwl9CiAJY2xfc2JfaW5pdChzYik7CiAKIAllcnIgPSBvYmRfc2V0X2luZm9fYXN5bmMoTlVMTCwgc2JpLT5sbF9kdF9leHAsIHNpemVvZihLRVlfQ0FDSEVfU0VUKSwKIAkJCQkgS0VZX0NBQ0hFX1NFVCwgc2l6ZW9mKCpzYmktPmxsX2NhY2hlKSwKIAkJCQkgc2JpLT5sbF9jYWNoZSwgTlVMTCk7CisJaWYgKGVycikgeworCQlDRVJST1IoIiVzOiBTZXQgY2FjaGVfc2V0IGZhaWxlZDogcmMgPSAlZFxuIiwKKwkJICAgICAgIHNiaS0+bGxfZHRfZXhwLT5leHBfb2JkLT5vYmRfbmFtZSwgZXJyKTsKKwkJZ290byBvdXRfcm9vdDsKKwl9CiAKIAlzYi0+c19yb290ID0gZF9tYWtlX3Jvb3Qocm9vdCk7CiAJaWYgKCFzYi0+c19yb290KSB7CkBAIC01NjAsNiArNTgyLDE3IEBACiAJcmV0dXJuIHJjOwogfQogCisvKioKKyAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIGRlZmF1bHRfZWFzaXplIHBhcmFtZXRlci4KKyAqCisgKiBcc2VlIGNsaWVudF9vYmQ6OmNsX2RlZmF1bHRfbWRzX2Vhc2l6ZQorICoKKyAqIFxwYXJhbVtpbl0gIHNiaQlzdXBlcmJsb2NrIGluZm8gZm9yIHRoaXMgZmlsZXN5c3RlbQorICogXHBhcmFtW291dF0gbG1tc2l6ZQlwb2ludGVyIHRvIHN0b3JhZ2UgbG9jYXRpb24gZm9yIHZhbHVlCisgKgorICogXHJldHZhbCAwCQlvbiBzdWNjZXNzCisgKiBccmV0dmFsIG5lZ2F0aXZlCW5lZ2F0ZWQgZXJybm8gb24gZmFpbHVyZQorICovCiBpbnQgbGxfZ2V0X2RlZmF1bHRfbWRzaXplKHN0cnVjdCBsbF9zYl9pbmZvICpzYmksIGludCAqbG1tc2l6ZSkKIHsKIAlpbnQgc2l6ZSwgcmM7CkBAIC01NzMsNiArNjA2LDI5IEBACiAJcmV0dXJuIHJjOwogfQogCisvKioKKyAqIFNldCB0aGUgZGVmYXVsdF9lYXNpemUgcGFyYW1ldGVyIHRvIHRoZSBnaXZlbiB2YWx1ZS4KKyAqCisgKiBcc2VlIGNsaWVudF9vYmQ6OmNsX2RlZmF1bHRfbWRzX2Vhc2l6ZQorICoKKyAqIFxwYXJhbVtpbl0gc2JpCXN1cGVyYmxvY2sgaW5mbyBmb3IgdGhpcyBmaWxlc3lzdGVtCisgKiBccGFyYW1baW5dIGxtbXNpemUJdGhlIHNpemUgdG8gc2V0CisgKgorICogXHJldHZhbCAwCQlvbiBzdWNjZXNzCisgKiBccmV0dmFsIG5lZ2F0aXZlCW5lZ2F0ZWQgZXJybm8gb24gZmFpbHVyZQorICovCitpbnQgbGxfc2V0X2RlZmF1bHRfbWRzaXplKHN0cnVjdCBsbF9zYl9pbmZvICpzYmksIGludCBsbW1zaXplKQoreworCWlmIChsbW1zaXplIDwgc2l6ZW9mKHN0cnVjdCBsb3ZfbWRzX21kKSB8fAorCSAgICBsbW1zaXplID4gT0JEX01BWF9ERUZBVUxUX0VBX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIG9iZF9zZXRfaW5mb19hc3luYyhOVUxMLCBzYmktPmxsX21kX2V4cCwKKwkJCQkgIHNpemVvZihLRVlfREVGQVVMVF9FQVNJWkUpLAorCQkJCSAgS0VZX0RFRkFVTFRfRUFTSVpFLAorCQkJCSAgc2l6ZW9mKGludCksICZsbW1zaXplLCBOVUxMKTsKK30KKwogc3RhdGljIHZvaWQgY2xpZW50X2NvbW1vbl9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfczJzYmkoc2IpOwpAQCAtNjA4LDYgKzY2NCwxMiBAQAogCWlmIChzYmkpIHsKIAkJc2ItPnNfZGV2ID0gc2JpLT5sbF9zZGV2X29yaWc7CiAJCXNiaS0+bGxfdW1vdW50aW5nID0gMTsKKworCQkvKiB3YWl0IHJ1bm5pbmcgc3RhdGFoZWFkIHRocmVhZHMgdG8gcXVpdCAqLworCQl3aGlsZSAoYXRvbWljX3JlYWQoJnNiaS0+bGxfc2FfcnVubmluZykgPiAwKSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KG1zZWNzX3RvX2ppZmZpZXMoTVNFQ19QRVJfU0VDID4+IDMpKTsKKwkJfQogCX0KIH0KIApAQCAtNjQ3LDcgKzcwOSw4IEBACiAJCQkqZmxhZ3MgfD0gdG1wOwogCQkJZ290byBuZXh0OwogCQl9Ci0JCXRtcCA9IGxsX3NldF9vcHQoIm5vZmxvY2siLCBzMSwgTExfU0JJX0ZMT0NLfExMX1NCSV9MT0NBTEZMT0NLKTsKKwkJdG1wID0gbGxfc2V0X29wdCgibm9mbG9jayIsIHMxLAorCQkJCSBMTF9TQklfRkxPQ0sgfCBMTF9TQklfTE9DQUxGTE9DSyk7CiAJCWlmICh0bXApIHsKIAkJCSpmbGFncyAmPSB+dG1wOwogCQkJZ290byBuZXh0OwpAQCAtNzcyLDExICs4MzUsMTMgQEAKIAkJbGxpLT5sbGlfc2FpID0gTlVMTDsKIAkJc3Bpbl9sb2NrX2luaXQoJmxsaS0+bGxpX3NhX2xvY2spOwogCQlsbGktPmxsaV9vcGVuZGlyX3BpZCA9IDA7CisJCWxsaS0+bGxpX3NhX2VuYWJsZWQgPSAwOworCQlsbGktPmxsaV9kZWZfc3RyaXBlX29mZnNldCA9IC0xOwogCX0gZWxzZSB7CiAJCW11dGV4X2luaXQoJmxsaS0+bGxpX3NpemVfbXV0ZXgpOwogCQlsbGktPmxsaV9zeW1saW5rX25hbWUgPSBOVUxMOwogCQlpbml0X3J3c2VtKCZsbGktPmxsaV90cnVuY19zZW0pOwotCQltdXRleF9pbml0KCZsbGktPmxsaV93cml0ZV9tdXRleCk7CisJCXJhbmdlX2xvY2tfdHJlZV9pbml0KCZsbGktPmxsaV93cml0ZV90cmVlKTsKIAkJaW5pdF9yd3NlbSgmbGxpLT5sbGlfZ2xpbXBzZV9zZW0pOwogCQlsbGktPmxsaV9nbGltcHNlX3RpbWUgPSAwOwogCQlJTklUX0xJU1RfSEVBRCgmbGxpLT5sbGlfYWdsX2xpc3QpOwpAQCAtODk2LDcgKzk2MSw4IEBACiAJc3RydWN0IGx1c3RyZV9zYl9pbmZvICpsc2kgPSBzMmxzaShzYik7CiAJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGxsX3Myc2JpKHNiKTsKIAljaGFyICpwcm9maWxlbm0gPSBnZXRfcHJvZmlsZV9uYW1lKHNiKTsKLQlpbnQgY2NjX2NvdW50LCBuZXh0LCBmb3JjZSA9IDEsIHJjID0gMDsKKwlpbnQgbmV4dCwgZm9yY2UgPSAxLCByYyA9IDA7CisJbG9uZyBjY2NfY291bnQ7CiAKIAlDREVCVUcoRF9WRlNUUkFDRSwgIlZGUyBPcDogc2IgJXAgLSAlc1xuIiwgc2IsIHByb2ZpbGVubSk7CiAKQEAgLTkxNywxMyArOTgzLDEzIEBACiAJCXN0cnVjdCBsX3dhaXRfaW5mbyBsd2kgPSBMV0lfSU5UUihMV0lfT05fU0lHTkFMX05PT1AsIE5VTEwpOwogCiAJCXJjID0gbF93YWl0X2V2ZW50KHNiaS0+bGxfY2FjaGUtPmNjY191bnN0YWJsZV93YWl0cSwKLQkJCQkgICFhdG9taWNfcmVhZCgmc2JpLT5sbF9jYWNoZS0+Y2NjX3Vuc3RhYmxlX25yKSwKKwkJCQkgICFhdG9taWNfbG9uZ19yZWFkKCZzYmktPmxsX2NhY2hlLT5jY2NfdW5zdGFibGVfbnIpLAogCQkJCSAgJmx3aSk7CiAJfQogCi0JY2NjX2NvdW50ID0gYXRvbWljX3JlYWQoJnNiaS0+bGxfY2FjaGUtPmNjY191bnN0YWJsZV9ucik7CisJY2NjX2NvdW50ID0gYXRvbWljX2xvbmdfcmVhZCgmc2JpLT5sbF9jYWNoZS0+Y2NjX3Vuc3RhYmxlX25yKTsKIAlpZiAoIWZvcmNlICYmIHJjICE9IC1FSU5UUikKLQkJTEFTU0VSVEYoIWNjY19jb3VudCwgImNvdW50OiAlaVxuIiwgY2NjX2NvdW50KTsKKwkJTEFTU0VSVEYoIWNjY19jb3VudCwgImNvdW50OiAlbGlcbiIsIGNjY19jb3VudCk7CiAKIAkvKiBXZSBuZWVkIHRvIHNldCBmb3JjZSBiZWZvcmUgdGhlIGxvdl9kaXNjb25uZWN0IGluCiAJICogbHVzdHJlX2NvbW1vbl9wdXRfc3VwZXIsIHNpbmNlIGxfZCBjbGVhbnMgdXAgb3NjJ3MgYXMgd2VsbC4KQEAgLTk5MSw2ICsxMDU3LDIwNiBAQAogCXJldHVybiBpbm9kZTsKIH0KIAorc3RhdGljIHZvaWQgbGxfZGlyX2NsZWFyX2xzbV9tZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oaW5vZGUpOworCisJTEFTU0VSVChTX0lTRElSKGlub2RlLT5pX21vZGUpKTsKKworCWlmIChsbGktPmxsaV9sc21fbWQpIHsKKwkJbG12X2ZyZWVfbWVtbWQobGxpLT5sbGlfbHNtX21kKTsKKwkJbGxpLT5sbGlfbHNtX21kID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmxsX2lnZXRfYW5vbl9kaXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQsCisJCQkJICAgICAgc3RydWN0IGx1c3RyZV9tZCAqbWQpCit7CisJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGxsX3Myc2JpKHNiKTsKKwlzdHJ1Y3QgbWR0X2JvZHkgKmJvZHkgPSBtZC0+Ym9keTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWlub190IGlubzsKKworCWlubyA9IGNsX2ZpZF9idWlsZF9pbm8oZmlkLCBzYmktPmxsX2ZsYWdzICYgTExfU0JJXzMyQklUX0FQSSk7CisJaW5vZGUgPSBpZ2V0X2xvY2tlZChzYiwgaW5vKTsKKwlpZiAoIWlub2RlKSB7CisJCUNFUlJPUigiJXM6IGZhaWxlZCBnZXQgc2ltcGxlIGlub2RlICJERklEIjogcmMgPSAtRU5PRU5UXG4iLAorCQkgICAgICAgbGxfZ2V0X2ZzbmFtZShzYiwgTlVMTCwgMCksIFBGSUQoZmlkKSk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCX0KKworCWlmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSB7CisJCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oaW5vZGUpOworCQlzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtID0gbWQtPmxtdjsKKworCQlpbm9kZS0+aV9tb2RlID0gKGlub2RlLT5pX21vZGUgJiB+U19JRk1UKSB8CisJCQkJKGJvZHktPm1ib19tb2RlICYgU19JRk1UKTsKKwkJTEFTU0VSVEYoU19JU0RJUihpbm9kZS0+aV9tb2RlKSwgIk5vdCBzbGF2ZSBpbm9kZSAiREZJRCJcbiIsCisJCQkgUEZJRChmaWQpKTsKKworCQlMVElNRV9TKGlub2RlLT5pX210aW1lKSA9IDA7CisJCUxUSU1FX1MoaW5vZGUtPmlfYXRpbWUpID0gMDsKKwkJTFRJTUVfUyhpbm9kZS0+aV9jdGltZSkgPSAwOworCQlpbm9kZS0+aV9yZGV2ID0gMDsKKworCQlpbm9kZS0+aV9vcCA9ICZsbF9kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJmxsX2Rpcl9vcGVyYXRpb25zOworCQlsbGktPmxsaV9maWQgPSAqZmlkOworCQlsbF9sbGlfaW5pdChsbGkpOworCisJCUxBU1NFUlQobHNtKTsKKwkJLyogbWFzdGVyIG9iamVjdCBGSUQgKi8KKwkJbGxpLT5sbGlfcGZpZCA9IGJvZHktPm1ib19maWQxOworCQlDREVCVUcoRF9JTk9ERSwgImxsaSAlcCBzbGF2ZSAiREZJRCIgbWFzdGVyICJERklEIlxuIiwKKwkJICAgICAgIGxsaSwgUEZJRChmaWQpLCBQRklEKCZsbGktPmxsaV9wZmlkKSk7CisJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCX0KKworCXJldHVybiBpbm9kZTsKK30KKworc3RhdGljIGludCBsbF9pbml0X2xzbV9tZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbHVzdHJlX21kICptZCkKK3sKKwlzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtID0gbWQtPmxtdjsKKwlzdHJ1Y3QgbHVfZmlkICpmaWQ7CisJaW50IGk7CisKKwlMQVNTRVJUKGxzbSk7CisJLyoKKwkgKiBYWFggc2lnaCwgdGhpcyBsc21fcm9vdCBpbml0aWFsaXphdGlvbiBzaG91bGQgYmUgaW4KKwkgKiBMTVYgbGF5ZXIsIGJ1dCBpdCBuZWVkcyBsbF9pZ2V0IHJpZ2h0IG5vdywgc28gd2UKKwkgKiBwdXQgdGhpcyBoZXJlIHJpZ2h0IG5vdy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbHNtLT5sc21fbWRfc3RyaXBlX2NvdW50OyBpKyspIHsKKwkJZmlkID0gJmxzbS0+bHNtX21kX29pbmZvW2ldLmxtb19maWQ7CisJCUxBU1NFUlQoIWxzbS0+bHNtX21kX29pbmZvW2ldLmxtb19yb290KTsKKwkJLyogVW5mb3J0dW5hdGVseSBsbF9pZ2V0IHdpbGwgY2FsbCBsbF91cGRhdGVfaW5vZGUsCisJCSAqIHdoZXJlIHRoZSBpbml0aWFsaXphdGlvbiBvZiBzbGF2ZSBpbm9kZSBpcyBzbGlnaHRseQorCQkgKiBkaWZmZXJlbnQsIHNvIGl0IHJlc2V0IGxzbV9tZCB0byBOVUxMIHRvIGF2b2lkCisJCSAqIGluaXRpYWxpemluZyBsc20gZm9yIHNsYXZlIGlub2RlLgorCQkgKi8KKwkJLyogRm9yIG1pZ3JhdGluZyBpbm9kZSwgbWFzdGVyIHN0cmlwZSBhbmQgbWFzdGVyIG9iamVjdCB3aWxsCisJCSAqIGJlIHNhbWUsIHNvIHdlIG9ubHkgbmVlZCBhc3NpZ24gdGhpcyBpbm9kZQorCQkgKi8KKwkJaWYgKGxzbS0+bHNtX21kX2hhc2hfdHlwZSAmIExNVl9IQVNIX0ZMQUdfTUlHUkFUSU9OICYmICFpKQorCQkJbHNtLT5sc21fbWRfb2luZm9baV0ubG1vX3Jvb3QgPSBpbm9kZTsKKwkJZWxzZQorCQkJbHNtLT5sc21fbWRfb2luZm9baV0ubG1vX3Jvb3QgPQorCQkJCWxsX2lnZXRfYW5vbl9kaXIoaW5vZGUtPmlfc2IsIGZpZCwgbWQpOworCQlpZiAoSVNfRVJSKGxzbS0+bHNtX21kX29pbmZvW2ldLmxtb19yb290KSkgeworCQkJaW50IHJjID0gUFRSX0VSUihsc20tPmxzbV9tZF9vaW5mb1tpXS5sbW9fcm9vdCk7CisKKwkJCWxzbS0+bHNtX21kX29pbmZvW2ldLmxtb19yb290ID0gTlVMTDsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBsbGlfbHNtX21kX2VxKGNvbnN0IHN0cnVjdCBsbXZfc3RyaXBlX21kICpsc21fbWQxLAorCQkJCWNvbnN0IHN0cnVjdCBsbXZfc3RyaXBlX21kICpsc21fbWQyKQoreworCXJldHVybiBsc21fbWQxLT5sc21fbWRfbWFnaWMgPT0gbHNtX21kMi0+bHNtX21kX21hZ2ljICYmCisJICAgICAgIGxzbV9tZDEtPmxzbV9tZF9zdHJpcGVfY291bnQgPT0gbHNtX21kMi0+bHNtX21kX3N0cmlwZV9jb3VudCAmJgorCSAgICAgICBsc21fbWQxLT5sc21fbWRfbWFzdGVyX21kdF9pbmRleCA9PQorCQkJbHNtX21kMi0+bHNtX21kX21hc3Rlcl9tZHRfaW5kZXggJiYKKwkgICAgICAgbHNtX21kMS0+bHNtX21kX2hhc2hfdHlwZSA9PSBsc21fbWQyLT5sc21fbWRfaGFzaF90eXBlICYmCisJICAgICAgIGxzbV9tZDEtPmxzbV9tZF9sYXlvdXRfdmVyc2lvbiA9PQorCQkJbHNtX21kMi0+bHNtX21kX2xheW91dF92ZXJzaW9uICYmCisJICAgICAgICFzdHJjbXAobHNtX21kMS0+bHNtX21kX3Bvb2xfbmFtZSwKKwkJICAgICAgIGxzbV9tZDItPmxzbV9tZF9wb29sX25hbWUpOworfQorCitzdGF0aWMgaW50IGxsX3VwZGF0ZV9sc21fbWQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGx1c3RyZV9tZCAqbWQpCit7CisJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhpbm9kZSk7CisJc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSA9IG1kLT5sbXY7CisJaW50IHJjOworCisJTEFTU0VSVChTX0lTRElSKGlub2RlLT5pX21vZGUpKTsKKwlDREVCVUcoRF9JTk9ERSwgInVwZGF0ZSBsc20gJXAgb2YgIkRGSUQiXG4iLCBsbGktPmxsaV9sc21fbWQsCisJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSkpOworCisJLyogbm8gc3RyaXBlZCBpbmZvcm1hdGlvbiBmcm9tIHJlcXVlc3QuICovCisJaWYgKCFsc20pIHsKKwkJaWYgKCFsbGktPmxsaV9sc21fbWQpIHsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKGxsaS0+bGxpX2xzbV9tZC0+bHNtX21kX2hhc2hfdHlwZSAmCisJCQkgICBMTVZfSEFTSF9GTEFHX01JR1JBVElPTikgeworCQkJLyoKKwkJCSAqIG1pZ3JhdGlvbiBpcyBkb25lLCB0aGUgdGVtcG9yYXkgTUlHUkFURSBsYXlvdXQgaGFzCisJCQkgKiBiZWVuIHJlbW92ZWQKKwkJCSAqLworCQkJQ0RFQlVHKERfSU5PREUsIERGSUQiIGZpbmlzaCBtaWdyYXRpb24uXG4iLAorCQkJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSkpOworCQkJbG12X2ZyZWVfbWVtbWQobGxpLT5sbGlfbHNtX21kKTsKKwkJCWxsaS0+bGxpX2xzbV9tZCA9IE5VTEw7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBUaGUgbHVzdHJlX21kIGZyb20gcmVxIGRvZXMgbm90IGluY2x1ZGUgc3RyaXBlRUEsCisJCQkgKiBzZWUgbGxfbWRfc2V0YXR0cgorCQkJICovCisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qIHNldCB0aGUgZGlyZWN0b3J5IGxheW91dCAqLworCWlmICghbGxpLT5sbGlfbHNtX21kKSB7CisJCXJjID0gbGxfaW5pdF9sc21fbWQoaW5vZGUsIG1kKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCWxsaS0+bGxpX2xzbV9tZCA9IGxzbTsKKwkJLyoKKwkJICogc2V0IGxzbV9tZCB0byBOVUxMLCBzbyB0aGUgZm9sbG93aW5nIGZyZWUgbHVzdHJlX21kCisJCSAqIHdpbGwgbm90IGZyZWUgdGhpcyBsc20KKwkJICovCisJCW1kLT5sbXYgPSBOVUxMOworCQlDREVCVUcoRF9JTk9ERSwgIlNldCBsc20gJXAgbWFnaWMgJXggdG8gIkRGSUQiXG4iLCBsc20sCisJCSAgICAgICBsc20tPmxzbV9tZF9tYWdpYywgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSk7CisJCXJldHVybiAwOworCX0KKworCS8qIENvbXBhcmUgdGhlIG9sZCBhbmQgbmV3IHN0cmlwZSBpbmZvcm1hdGlvbiAqLworCWlmICghbHNtX21kX2VxKGxsaS0+bGxpX2xzbV9tZCwgbHNtKSkgeworCQlzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqb2xkX2xzbSA9IGxsaS0+bGxpX2xzbV9tZDsKKwkJaW50IGlkeDsKKworCQlDRVJST1IoIiVzOiBpbm9kZSAiREZJRCIoJXApJ3MgbG12IGxheW91dCBtaXNtYXRjaCAoJXApLyglcCkgbWFnaWM6MHgleC8weCV4IHN0cmlwZSBjb3VudDogJWQvJWQgbWFzdGVyX21kdDogJWQvJWQgaGFzaF90eXBlOjB4JXgvMHgleCBsYXlvdXQ6IDB4JXgvMHgleCBwb29sOiVzLyVzXG4iLAorCQkgICAgICAgbGxfZ2V0X2ZzbmFtZShpbm9kZS0+aV9zYiwgTlVMTCwgMCksIFBGSUQoJmxsaS0+bGxpX2ZpZCksCisJCSAgICAgICBpbm9kZSwgbHNtLCBvbGRfbHNtLAorCQkgICAgICAgbHNtLT5sc21fbWRfbWFnaWMsIG9sZF9sc20tPmxzbV9tZF9tYWdpYywKKwkJICAgICAgIGxzbS0+bHNtX21kX3N0cmlwZV9jb3VudCwKKwkJICAgICAgIG9sZF9sc20tPmxzbV9tZF9zdHJpcGVfY291bnQsCisJCSAgICAgICBsc20tPmxzbV9tZF9tYXN0ZXJfbWR0X2luZGV4LAorCQkgICAgICAgb2xkX2xzbS0+bHNtX21kX21hc3Rlcl9tZHRfaW5kZXgsCisJCSAgICAgICBsc20tPmxzbV9tZF9oYXNoX3R5cGUsIG9sZF9sc20tPmxzbV9tZF9oYXNoX3R5cGUsCisJCSAgICAgICBsc20tPmxzbV9tZF9sYXlvdXRfdmVyc2lvbiwKKwkJICAgICAgIG9sZF9sc20tPmxzbV9tZF9sYXlvdXRfdmVyc2lvbiwKKwkJICAgICAgIGxzbS0+bHNtX21kX3Bvb2xfbmFtZSwKKwkJICAgICAgIG9sZF9sc20tPmxzbV9tZF9wb29sX25hbWUpOworCisJCWZvciAoaWR4ID0gMDsgaWR4IDwgb2xkX2xzbS0+bHNtX21kX3N0cmlwZV9jb3VudDsgaWR4KyspIHsKKwkJCUNFUlJPUigiJXM6IHN1YiBGSURzIGluIG9sZCBsc20gaWR4ICVkLCBvbGQ6ICJERklEIlxuIiwKKwkJCSAgICAgICBsbF9nZXRfZnNuYW1lKGlub2RlLT5pX3NiLCBOVUxMLCAwKSwgaWR4LAorCQkJICAgICAgIFBGSUQoJm9sZF9sc20tPmxzbV9tZF9vaW5mb1tpZHhdLmxtb19maWQpKTsKKwkJfQorCisJCWZvciAoaWR4ID0gMDsgaWR4IDwgbHNtLT5sc21fbWRfc3RyaXBlX2NvdW50OyBpZHgrKykgeworCQkJQ0VSUk9SKCIlczogc3ViIEZJRHMgaW4gbmV3IGxzbSBpZHggJWQsIG5ldzogIkRGSUQiXG4iLAorCQkJICAgICAgIGxsX2dldF9mc25hbWUoaW5vZGUtPmlfc2IsIE5VTEwsIDApLCBpZHgsCisJCQkgICAgICAgUEZJRCgmbHNtLT5sc21fbWRfb2luZm9baWR4XS5sbW9fZmlkKSk7CisJCX0KKworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogdm9pZCBsbF9jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oaW5vZGUpOwpAQCAtMTAzMSwxNCArMTI5NywxNSBAQAogCiAjaWZkZWYgQ09ORklHX0ZTX1BPU0lYX0FDTAogCWlmIChsbGktPmxsaV9wb3NpeF9hY2wpIHsKLQkJTEFTU0VSVChhdG9taWNfcmVhZCgmbGxpLT5sbGlfcG9zaXhfYWNsLT5hX3JlZmNvdW50KSA9PSAxKTsKIAkJcG9zaXhfYWNsX3JlbGVhc2UobGxpLT5sbGlfcG9zaXhfYWNsKTsKIAkJbGxpLT5sbGlfcG9zaXhfYWNsID0gTlVMTDsKIAl9CiAjZW5kaWYKIAlsbGktPmxsaV9pbm9kZV9tYWdpYyA9IExMSV9JTk9ERV9ERUFEOwogCi0JaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQlsbF9kaXJfY2xlYXJfbHNtX21kKGlub2RlKTsKKwlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJiAhaXNfYmFkX2lub2RlKGlub2RlKSkKIAkJTEFTU0VSVChsaXN0X2VtcHR5KCZsbGktPmxsaV9hZ2xfbGlzdCkpOwogCiAJLyoKQEAgLTExMDMsMTAgKzEzNzAsMTAgQEAKIAlvcF9kYXRhLT5vcF9hdHRyLmlhX3ZhbGlkID0gaWFfdmFsaWQ7CiAKIAkvKiBFeHRyYWN0IGVwb2NoIGRhdGEgaWYgb2J0YWluZWQuICovCi0Jb3BfZGF0YS0+b3BfaGFuZGxlID0gbWQuYm9keS0+aGFuZGxlOwotCW9wX2RhdGEtPm9wX2lvZXBvY2ggPSBtZC5ib2R5LT5pb2Vwb2NoOworCW9wX2RhdGEtPm9wX2hhbmRsZSA9IG1kLmJvZHktPm1ib19oYW5kbGU7CisJb3BfZGF0YS0+b3BfaW9lcG9jaCA9IG1kLmJvZHktPm1ib19pb2Vwb2NoOwogCi0JbGxfdXBkYXRlX2lub2RlKGlub2RlLCAmbWQpOworCXJjID0gbGxfdXBkYXRlX2lub2RlKGlub2RlLCAmbWQpOwogCXB0bHJwY19yZXFfZmluaXNoZWQocmVxdWVzdCk7CiAKIAlyZXR1cm4gcmM7CkBAIC0xMTM4LDggKzE0MDUsOCBAQAogCQlyYyA9IGxsX3NvbV91cGRhdGUoaW5vZGUsIG9wX2RhdGEpOwogCWVsc2UgaWYgKHJjKSB7CiAJCUNFUlJPUigiJXM6IGlub2RlICJERklEIiBtZGMgdHJ1bmNhdGUgZmFpbGVkOiByYyA9ICVkXG4iLAotCQkgICAgICBsbF9pMnNiaShpbm9kZSktPmxsX21kX2V4cC0+ZXhwX29iZC0+b2JkX25hbWUsCi0JCSAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSksIHJjKTsKKwkJICAgICAgIGxsX2kyc2JpKGlub2RlKS0+bGxfbWRfZXhwLT5leHBfb2JkLT5vYmRfbmFtZSwKKwkJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSksIHJjKTsKIAl9CiAJcmV0dXJuIHJjOwogfQpAQCAtMTMzMSwxNCArMTU5OCwxNCBAQAogewogCWludCBtb2RlID0gZF9pbm9kZShkZSktPmlfbW9kZTsKIAotCWlmICgoYXR0ci0+aWFfdmFsaWQgJiAoQVRUUl9DVElNRXxBVFRSX1NJWkV8QVRUUl9NT0RFKSkgPT0KLQkJCSAgICAgIChBVFRSX0NUSU1FfEFUVFJfU0laRXxBVFRSX01PREUpKQorCWlmICgoYXR0ci0+aWFfdmFsaWQgJiAoQVRUUl9DVElNRSB8IEFUVFJfU0laRSB8IEFUVFJfTU9ERSkpID09CisJCQkgICAgICAoQVRUUl9DVElNRSB8IEFUVFJfU0laRSB8IEFUVFJfTU9ERSkpCiAJCWF0dHItPmlhX3ZhbGlkIHw9IE1EU19PUEVOX09XTkVST1ZFUlJJREU7CiAKLQlpZiAoKChhdHRyLT5pYV92YWxpZCAmIChBVFRSX01PREV8QVRUUl9GT1JDRXxBVFRSX1NJWkUpKSA9PQotCQkJICAgICAgIChBVFRSX1NJWkV8QVRUUl9NT0RFKSkgJiYKKwlpZiAoKChhdHRyLT5pYV92YWxpZCAmIChBVFRSX01PREUgfCBBVFRSX0ZPUkNFIHwgQVRUUl9TSVpFKSkgPT0KKwkJCSAgICAgICAoQVRUUl9TSVpFIHwgQVRUUl9NT0RFKSkgJiYKIAkgICAgKCgobW9kZSAmIFNfSVNVSUQpICYmICEoYXR0ci0+aWFfbW9kZSAmIFNfSVNVSUQpKSB8fAotCSAgICAgKCgobW9kZSAmIChTX0lTR0lEfFNfSVhHUlApKSA9PSAoU19JU0dJRHxTX0lYR1JQKSkgJiYKKwkgICAgICgoKG1vZGUgJiAoU19JU0dJRCB8IFNfSVhHUlApKSA9PSAoU19JU0dJRCB8IFNfSVhHUlApKSAmJgogCSAgICAgICEoYXR0ci0+aWFfbW9kZSAmIFNfSVNHSUQpKSkpCiAJCWF0dHItPmlhX3ZhbGlkIHw9IEFUVFJfRk9SQ0U7CiAKQEAgLTEzNDksNyArMTYxNiw3IEBACiAJCWF0dHItPmlhX3ZhbGlkIHw9IEFUVFJfS0lMTF9TVUlEOwogCiAJaWYgKChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkgJiYKLQkgICAgKChtb2RlICYgKFNfSVNHSUR8U19JWEdSUCkpID09IChTX0lTR0lEfFNfSVhHUlApKSAmJgorCSAgICAoKG1vZGUgJiAoU19JU0dJRCB8IFNfSVhHUlApKSA9PSAoU19JU0dJRCB8IFNfSVhHUlApKSAmJgogCSAgICAhKGF0dHItPmlhX21vZGUgJiBTX0lTR0lEKSAmJgogCSAgICAhKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9LSUxMX1NHSUQpKQogCQlhdHRyLT5pYV92YWxpZCB8PSBBVFRSX0tJTExfU0dJRDsKQEAgLTE0NjUsMTQgKzE3MzIsMTQgQEAKIAltdXRleF91bmxvY2soJmxsaS0+bGxpX3NpemVfbXV0ZXgpOwogfQogCi12b2lkIGxsX3VwZGF0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbHVzdHJlX21kICptZCkKK2ludCBsbF91cGRhdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGx1c3RyZV9tZCAqbWQpCiB7CiAJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhpbm9kZSk7CiAJc3RydWN0IG1kdF9ib2R5ICpib2R5ID0gbWQtPmJvZHk7CiAJc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSA9IG1kLT5sc207CiAJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGxsX2kyc2JpKGlub2RlKTsKIAotCUxBU1NFUlQoKGxzbSAhPSBOVUxMKSA9PSAoKGJvZHktPnZhbGlkICYgT0JEX01EX0ZMRUFTSVpFKSAhPSAwKSk7CisJTEFTU0VSVCgobHNtICE9IE5VTEwpID09ICgoYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0ZMRUFTSVpFKSAhPSAwKSk7CiAJaWYgKGxzbSkgewogCQlpZiAoIWxsaS0+bGxpX2hhc19zbWQgJiYKIAkJICAgICEoc2JpLT5sbF9mbGFncyAmIExMX1NCSV9MQVlPVVRfTE9DSykpCkBAIC0xNDgzLDggKzE3NTAsMTYgQEAKIAkJCWxsaS0+bGxpX21heGJ5dGVzID0gTUFYX0xGU19GSUxFU0laRTsKIAl9CiAKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQlpbnQgcmM7CisKKwkJcmMgPSBsbF91cGRhdGVfbHNtX21kKGlub2RlLCBtZCk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwl9CisKICNpZmRlZiBDT05GSUdfRlNfUE9TSVhfQUNMCi0JaWYgKGJvZHktPnZhbGlkICYgT0JEX01EX0ZMQUNMKSB7CisJaWYgKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9GTEFDTCkgewogCQlzcGluX2xvY2soJmxsaS0+bGxpX2xvY2spOwogCQlpZiAobGxpLT5sbGlfcG9zaXhfYWNsKQogCQkJcG9zaXhfYWNsX3JlbGVhc2UobGxpLT5sbGlfcG9zaXhfYWNsKTsKQEAgLTE0OTIsNjUgKzE3NjcsNjcgQEAKIAkJc3Bpbl91bmxvY2soJmxsaS0+bGxpX2xvY2spOwogCX0KICNlbmRpZgotCWlub2RlLT5pX2lubyA9IGNsX2ZpZF9idWlsZF9pbm8oJmJvZHktPmZpZDEsCisJaW5vZGUtPmlfaW5vID0gY2xfZmlkX2J1aWxkX2lubygmYm9keS0+bWJvX2ZpZDEsCiAJCQkJCXNiaS0+bGxfZmxhZ3MgJiBMTF9TQklfMzJCSVRfQVBJKTsKLQlpbm9kZS0+aV9nZW5lcmF0aW9uID0gY2xfZmlkX2J1aWxkX2dlbigmYm9keS0+ZmlkMSk7CisJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IGNsX2ZpZF9idWlsZF9nZW4oJmJvZHktPm1ib19maWQxKTsKIAotCWlmIChib2R5LT52YWxpZCAmIE9CRF9NRF9GTEFUSU1FKSB7Ci0JCWlmIChib2R5LT5hdGltZSA+IExUSU1FX1MoaW5vZGUtPmlfYXRpbWUpKQotCQkJTFRJTUVfUyhpbm9kZS0+aV9hdGltZSkgPSBib2R5LT5hdGltZTsKLQkJbGxpLT5sbGlfYXRpbWUgPSBib2R5LT5hdGltZTsKKwlpZiAoYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0ZMQVRJTUUpIHsKKwkJaWYgKGJvZHktPm1ib19hdGltZSA+IExUSU1FX1MoaW5vZGUtPmlfYXRpbWUpKQorCQkJTFRJTUVfUyhpbm9kZS0+aV9hdGltZSkgPSBib2R5LT5tYm9fYXRpbWU7CisJCWxsaS0+bGxpX2F0aW1lID0gYm9keS0+bWJvX2F0aW1lOwogCX0KLQlpZiAoYm9keS0+dmFsaWQgJiBPQkRfTURfRkxNVElNRSkgewotCQlpZiAoYm9keS0+bXRpbWUgPiBMVElNRV9TKGlub2RlLT5pX210aW1lKSkgeworCWlmIChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxNVElNRSkgeworCQlpZiAoYm9keS0+bWJvX210aW1lID4gTFRJTUVfUyhpbm9kZS0+aV9tdGltZSkpIHsKIAkJCUNERUJVRyhEX0lOT0RFLCAic2V0dGluZyBpbm8gJWx1IG10aW1lIGZyb20gJWx1IHRvICVsbHVcbiIsCiAJCQkgICAgICAgaW5vZGUtPmlfaW5vLCBMVElNRV9TKGlub2RlLT5pX210aW1lKSwKLQkJCSAgICAgICBib2R5LT5tdGltZSk7Ci0JCQlMVElNRV9TKGlub2RlLT5pX210aW1lKSA9IGJvZHktPm10aW1lOworCQkJICAgICAgIGJvZHktPm1ib19tdGltZSk7CisJCQlMVElNRV9TKGlub2RlLT5pX210aW1lKSA9IGJvZHktPm1ib19tdGltZTsKIAkJfQotCQlsbGktPmxsaV9tdGltZSA9IGJvZHktPm10aW1lOworCQlsbGktPmxsaV9tdGltZSA9IGJvZHktPm1ib19tdGltZTsKIAl9Ci0JaWYgKGJvZHktPnZhbGlkICYgT0JEX01EX0ZMQ1RJTUUpIHsKLQkJaWYgKGJvZHktPmN0aW1lID4gTFRJTUVfUyhpbm9kZS0+aV9jdGltZSkpCi0JCQlMVElNRV9TKGlub2RlLT5pX2N0aW1lKSA9IGJvZHktPmN0aW1lOwotCQlsbGktPmxsaV9jdGltZSA9IGJvZHktPmN0aW1lOworCWlmIChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxDVElNRSkgeworCQlpZiAoYm9keS0+bWJvX2N0aW1lID4gTFRJTUVfUyhpbm9kZS0+aV9jdGltZSkpCisJCQlMVElNRV9TKGlub2RlLT5pX2N0aW1lKSA9IGJvZHktPm1ib19jdGltZTsKKwkJbGxpLT5sbGlfY3RpbWUgPSBib2R5LT5tYm9fY3RpbWU7CiAJfQotCWlmIChib2R5LT52YWxpZCAmIE9CRF9NRF9GTE1PREUpCi0JCWlub2RlLT5pX21vZGUgPSAoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCl8KGJvZHktPm1vZGUgJiB+U19JRk1UKTsKLQlpZiAoYm9keS0+dmFsaWQgJiBPQkRfTURfRkxUWVBFKQotCQlpbm9kZS0+aV9tb2RlID0gKGlub2RlLT5pX21vZGUgJiB+U19JRk1UKXwoYm9keS0+bW9kZSAmIFNfSUZNVCk7CisJaWYgKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9GTE1PREUpCisJCWlub2RlLT5pX21vZGUgPSAoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkgfAorCQkJCShib2R5LT5tYm9fbW9kZSAmIH5TX0lGTVQpOworCWlmIChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxUWVBFKQorCQlpbm9kZS0+aV9tb2RlID0gKGlub2RlLT5pX21vZGUgJiB+U19JRk1UKSB8CisJCQkJKGJvZHktPm1ib19tb2RlICYgU19JRk1UKTsKIAlMQVNTRVJUKGlub2RlLT5pX21vZGUgIT0gMCk7CiAJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCiAJCWlub2RlLT5pX2Jsa2JpdHMgPSBtaW4oUFRMUlBDX01BWF9CUldfQklUUyArIDEsCiAJCQkJICAgICAgIExMX01BWF9CTEtTSVpFX0JJVFMpOwogCWVsc2UKIAkJaW5vZGUtPmlfYmxrYml0cyA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwotCWlmIChib2R5LT52YWxpZCAmIE9CRF9NRF9GTFVJRCkKLQkJaW5vZGUtPmlfdWlkID0gbWFrZV9rdWlkKCZpbml0X3VzZXJfbnMsIGJvZHktPnVpZCk7Ci0JaWYgKGJvZHktPnZhbGlkICYgT0JEX01EX0ZMR0lEKQotCQlpbm9kZS0+aV9naWQgPSBtYWtlX2tnaWQoJmluaXRfdXNlcl9ucywgYm9keS0+Z2lkKTsKLQlpZiAoYm9keS0+dmFsaWQgJiBPQkRfTURfRkxGTEFHUykKLQkJaW5vZGUtPmlfZmxhZ3MgPSBsbF9leHRfdG9faW5vZGVfZmxhZ3MoYm9keS0+ZmxhZ3MpOwotCWlmIChib2R5LT52YWxpZCAmIE9CRF9NRF9GTE5MSU5LKQotCQlzZXRfbmxpbmsoaW5vZGUsIGJvZHktPm5saW5rKTsKLQlpZiAoYm9keS0+dmFsaWQgJiBPQkRfTURfRkxSREVWKQotCQlpbm9kZS0+aV9yZGV2ID0gb2xkX2RlY29kZV9kZXYoYm9keS0+cmRldik7CisJaWYgKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9GTFVJRCkKKwkJaW5vZGUtPmlfdWlkID0gbWFrZV9rdWlkKCZpbml0X3VzZXJfbnMsIGJvZHktPm1ib191aWQpOworCWlmIChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxHSUQpCisJCWlub2RlLT5pX2dpZCA9IG1ha2Vfa2dpZCgmaW5pdF91c2VyX25zLCBib2R5LT5tYm9fZ2lkKTsKKwlpZiAoYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0ZMRkxBR1MpCisJCWlub2RlLT5pX2ZsYWdzID0gbGxfZXh0X3RvX2lub2RlX2ZsYWdzKGJvZHktPm1ib19mbGFncyk7CisJaWYgKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9GTE5MSU5LKQorCQlzZXRfbmxpbmsoaW5vZGUsIGJvZHktPm1ib19ubGluayk7CisJaWYgKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9GTFJERVYpCisJCWlub2RlLT5pX3JkZXYgPSBvbGRfZGVjb2RlX2Rldihib2R5LT5tYm9fcmRldik7CiAKLQlpZiAoYm9keS0+dmFsaWQgJiBPQkRfTURfRkxJRCkgeworCWlmIChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxJRCkgewogCQkvKiBGSUQgc2hvdWxkbid0IGJlIGNoYW5nZWQhICovCiAJCWlmIChmaWRfaXNfc2FuZSgmbGxpLT5sbGlfZmlkKSkgewotCQkJTEFTU0VSVEYobHVfZmlkX2VxKCZsbGktPmxsaV9maWQsICZib2R5LT5maWQxKSwKKwkJCUxBU1NFUlRGKGx1X2ZpZF9lcSgmbGxpLT5sbGlfZmlkLCAmYm9keS0+bWJvX2ZpZDEpLAogCQkJCSAiVHJ5aW5nIHRvIGNoYW5nZSBGSUQgIkRGSUQiIHRvIHRoZSAiREZJRCIsIGlub2RlICJERklEIiglcClcbiIsCi0JCQkJIFBGSUQoJmxsaS0+bGxpX2ZpZCksIFBGSUQoJmJvZHktPmZpZDEpLAorCQkJCSBQRklEKCZsbGktPmxsaV9maWQpLCBQRklEKCZib2R5LT5tYm9fZmlkMSksCiAJCQkJIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSksIGlub2RlKTsKIAkJfSBlbHNlIHsKLQkJCWxsaS0+bGxpX2ZpZCA9IGJvZHktPmZpZDE7CisJCQlsbGktPmxsaV9maWQgPSBib2R5LT5tYm9fZmlkMTsKIAkJfQogCX0KIAogCUxBU1NFUlQoZmlkX3NlcSgmbGxpLT5sbGlfZmlkKSAhPSAwKTsKIAotCWlmIChib2R5LT52YWxpZCAmIE9CRF9NRF9GTFNJWkUpIHsKKwlpZiAoYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0ZMU0laRSkgewogCQlpZiAoZXhwX2Nvbm5lY3Rfc29tKGxsX2kybWRleHAoaW5vZGUpKSAmJgogCQkgICAgU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgewogCQkJc3RydWN0IGx1c3RyZV9oYW5kbGUgbG9ja2g7CkBAIC0xNTc3LDcgKzE4NTQsNyBAQAogCQkJCQkvKiBVc2Ugb2xkIHNpemUgYXNzaWdubWVudCB0byBhdm9pZAogCQkJCQkgKiBkZWFkbG9jayBiejE0MTM4ICYgYnoxNDMyNgogCQkJCQkgKi8KLQkJCQkJaV9zaXplX3dyaXRlKGlub2RlLCBib2R5LT5zaXplKTsKKwkJCQkJaV9zaXplX3dyaXRlKGlub2RlLCBib2R5LT5tYm9fc2l6ZSk7CiAJCQkJCXNwaW5fbG9jaygmbGxpLT5sbGlfbG9jayk7CiAJCQkJCWxsaS0+bGxpX2ZsYWdzIHw9IExMSUZfTURTX1NJWkVfTE9DSzsKIAkJCQkJc3Bpbl91bmxvY2soJmxsaS0+bGxpX2xvY2spOwpAQCAtMTU4OCwyNiArMTg2NSwyOSBAQAogCQkJLyogVXNlIG9sZCBzaXplIGFzc2lnbm1lbnQgdG8gYXZvaWQKIAkJCSAqIGRlYWRsb2NrIGJ6MTQxMzggJiBiejE0MzI2CiAJCQkgKi8KLQkJCWlfc2l6ZV93cml0ZShpbm9kZSwgYm9keS0+c2l6ZSk7CisJCQlpX3NpemVfd3JpdGUoaW5vZGUsIGJvZHktPm1ib19zaXplKTsKIAogCQkJQ0RFQlVHKERfVkZTVFJBQ0UsICJpbm9kZT0lbHUsIHVwZGF0aW5nIGlfc2l6ZSAlbGx1XG4iLAotCQkJICAgICAgIGlub2RlLT5pX2lubywgKHVuc2lnbmVkIGxvbmcgbG9uZylib2R5LT5zaXplKTsKKwkJCSAgICAgICBpbm9kZS0+aV9pbm8sICh1bnNpZ25lZCBsb25nIGxvbmcpYm9keS0+bWJvX3NpemUpOwogCQl9CiAKLQkJaWYgKGJvZHktPnZhbGlkICYgT0JEX01EX0ZMQkxPQ0tTKQotCQkJaW5vZGUtPmlfYmxvY2tzID0gYm9keS0+YmxvY2tzOworCQlpZiAoYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0ZMQkxPQ0tTKQorCQkJaW5vZGUtPmlfYmxvY2tzID0gYm9keS0+bWJvX2Jsb2NrczsKIAl9CiAKLQlpZiAoYm9keS0+dmFsaWQgJiBPQkRfTURfVFNUQVRFKSB7Ci0JCWlmIChib2R5LT50X3N0YXRlICYgTVNfUkVTVE9SRSkKKwlpZiAoYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX1RTVEFURSkgeworCQlpZiAoYm9keS0+bWJvX3Rfc3RhdGUgJiBNU19SRVNUT1JFKQogCQkJbGxpLT5sbGlfZmxhZ3MgfD0gTExJRl9GSUxFX1JFU1RPUklORzsKIAl9CisKKwlyZXR1cm4gMDsKIH0KIAotdm9pZCBsbF9yZWFkX2lub2RlMihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpvcGFxdWUpCitpbnQgbGxfcmVhZF9pbm9kZTIoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqb3BhcXVlKQogewogCXN0cnVjdCBsdXN0cmVfbWQgKm1kID0gb3BhcXVlOwogCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oaW5vZGUpOworCWludCByYzsKIAogCUNERUJVRyhEX1ZGU1RSQUNFLCAiVkZTIE9wOmlub2RlPSJERklEIiglcClcbiIsCiAJICAgICAgIFBGSUQoJmxsaS0+bGxpX2ZpZCksIGlub2RlKTsKQEAgLTE2MjMsNyArMTkwMyw5IEBACiAJTFRJTUVfUyhpbm9kZS0+aV9hdGltZSkgPSAwOwogCUxUSU1FX1MoaW5vZGUtPmlfY3RpbWUpID0gMDsKIAlpbm9kZS0+aV9yZGV2ID0gMDsKLQlsbF91cGRhdGVfaW5vZGUoaW5vZGUsIG1kKTsKKwlyYyA9IGxsX3VwZGF0ZV9pbm9kZShpbm9kZSwgbWQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCiAJLyogT0lERUJVRyhpbm9kZSk7ICovCiAKQEAgLTE2NDQsNiArMTkyNiw4IEBACiAJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwKIAkJCQkgICBpbm9kZS0+aV9yZGV2KTsKIAl9CisKKwlyZXR1cm4gMDsKIH0KIAogdm9pZCBsbF9kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKQEAgLTE2NTUsMjAgKzE5MzksMTMgQEAKIAkJICogb3NjX2V4dGVudCBpbXBsZW1lbnRhdGlvbiBhdCBMVS0xMDMwLgogCQkgKi8KIAkJY2xfc3luY19maWxlX3JhbmdlKGlub2RlLCAwLCBPQkRfT0JKRUNUX0VPRiwKLQkJCQkgICBDTF9GU1lOQ19ESVNDQVJELCAxKTsKKwkJCQkgICBDTF9GU1lOQ19MT0NBTCwgMSk7CiAKIAl0cnVuY2F0ZV9pbm9kZV9wYWdlc19maW5hbCgmaW5vZGUtPmlfZGF0YSk7CiAKLQkvKiBXb3JrYXJvdW5kIGZvciBMVS0xMTggKi8KLQlpZiAoaW5vZGUtPmlfZGF0YS5ucnBhZ2VzKSB7Ci0JCXNwaW5fbG9ja19pcnEoJmlub2RlLT5pX2RhdGEudHJlZV9sb2NrKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZpbm9kZS0+aV9kYXRhLnRyZWVfbG9jayk7Ci0JCUxBU1NFUlRGKGlub2RlLT5pX2RhdGEubnJwYWdlcyA9PSAwLAotCQkJICJpbm9kZT0iREZJRCIoJXApIG5ycGFnZXM9JWx1LCBzZWUgaHR0cDovL2ppcmEud2hhbWNsb3VkLmNvbS9icm93c2UvTFUtMTE4XG4iLAotCQkJIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSksIGlub2RlLAotCQkJIGlub2RlLT5pX2RhdGEubnJwYWdlcyk7Ci0JfQotCS8qIFdvcmthcm91bmQgZW5kICovCisJTEFTU0VSVEYoIWlub2RlLT5pX2RhdGEubnJwYWdlcywKKwkJICJpbm9kZT0iIERGSUQgIiglcCkgbnJwYWdlcz0lbHUsIHNlZSBodHRwOi8vamlyYS53aGFtY2xvdWQuY29tL2Jyb3dzZS9MVS0xMThcbiIsCisJCSBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpLCBpbm9kZSwgaW5vZGUtPmlfZGF0YS5ucnBhZ2VzKTsKIAogCWxsX2NsZWFyX2lub2RlKGlub2RlKTsKIAljbGVhcl9pbm9kZShpbm9kZSk7CkBAIC0xNzA0LDcgKzE5ODEsNyBAQAogCiAJCWJvZHkgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfTURUX0JPRFkpOwogCi0JCWZsYWdzID0gYm9keS0+ZmxhZ3M7CisJCWZsYWdzID0gYm9keS0+bWJvX2ZsYWdzOwogCiAJCXB0bHJwY19yZXFfZmluaXNoZWQocmVxKTsKIApAQCAtMTg4Niw5ICsyMTYzLDkgQEAKIAlpZiAoIW9wX2RhdGEpCiAJCXJldHVybjsKIAotCW9wX2RhdGEtPm9wX2ZpZDEgPSBib2R5LT5maWQxOwotCW9wX2RhdGEtPm9wX2lvZXBvY2ggPSBib2R5LT5pb2Vwb2NoOwotCW9wX2RhdGEtPm9wX2hhbmRsZSA9IGJvZHktPmhhbmRsZTsKKwlvcF9kYXRhLT5vcF9maWQxID0gYm9keS0+bWJvX2ZpZDE7CisJb3BfZGF0YS0+b3BfaW9lcG9jaCA9IGJvZHktPm1ib19pb2Vwb2NoOworCW9wX2RhdGEtPm9wX2hhbmRsZSA9IGJvZHktPm1ib19oYW5kbGU7CiAJb3BfZGF0YS0+b3BfbW9kX3RpbWUgPSBnZXRfc2Vjb25kcygpOwogCW1kX2Nsb3NlKGV4cCwgb3BfZGF0YSwgTlVMTCwgJmNsb3NlX3JlcSk7CiAJcHRscnBjX3JlcV9maW5pc2hlZChjbG9zZV9yZXEpOwpAQCAtMTkxMCw3ICsyMTg3LDkgQEAKIAkJZ290byBjbGVhbnVwOwogCiAJaWYgKCppbm9kZSkgewotCQlsbF91cGRhdGVfaW5vZGUoKmlub2RlLCAmbWQpOworCQlyYyA9IGxsX3VwZGF0ZV9pbm9kZSgqaW5vZGUsICZtZCk7CisJCWlmIChyYykKKwkJCWdvdG8gb3V0OwogCX0gZWxzZSB7CiAJCUxBU1NFUlQoc2IpOwogCkBAIC0xOTE4LDE4ICsyMTk3LDE4IEBACiAJCSAqIEF0IHRoaXMgcG9pbnQgc2VydmVyIHJldHVybnMgdG8gY2xpZW50J3Mgc2FtZSBmaWQgYXMgY2xpZW50CiAJCSAqIGdlbmVyYXRlZCBmb3IgY3JlYXRpbmcuIFNvIHVzaW5nIC0+ZmlkMSBpcyBva2F5IGhlcmUuCiAJCSAqLwotCQlpZiAoIWZpZF9pc19zYW5lKCZtZC5ib2R5LT5maWQxKSkgeworCQlpZiAoIWZpZF9pc19zYW5lKCZtZC5ib2R5LT5tYm9fZmlkMSkpIHsKIAkJCUNFUlJPUigiJXM6IEZpZCBpcyBpbnNhbmUgIiBERklEICJcbiIsCiAJCQkgICAgICAgbGxfZ2V0X2ZzbmFtZShzYiwgTlVMTCwgMCksCi0JCQkgICAgICAgUEZJRCgmbWQuYm9keS0+ZmlkMSkpOworCQkJICAgICAgIFBGSUQoJm1kLmJvZHktPm1ib19maWQxKSk7CiAJCQlyYyA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCSppbm9kZSA9IGxsX2lnZXQoc2IsIGNsX2ZpZF9idWlsZF9pbm8oJm1kLmJvZHktPmZpZDEsCisJCSppbm9kZSA9IGxsX2lnZXQoc2IsIGNsX2ZpZF9idWlsZF9pbm8oJm1kLmJvZHktPm1ib19maWQxLAogCQkJCQkgICAgIHNiaS0+bGxfZmxhZ3MgJiBMTF9TQklfMzJCSVRfQVBJKSwKIAkJCQkgJm1kKTsKLQkJaWYgKCEqaW5vZGUpIHsKKwkJaWYgKElTX0VSUigqaW5vZGUpKSB7CiAjaWZkZWYgQ09ORklHX0ZTX1BPU0lYX0FDTAogCQkJaWYgKG1kLnBvc2l4X2FjbCkgewogCQkJCXBvc2l4X2FjbF9yZWxlYXNlKG1kLnBvc2l4X2FjbCk7CkBAIC0yMDc1LDExICsyMzU0LDIwIEBACiAvKiB0aGlzIGZ1bmN0aW9uIHByZXBhcmVzIG1kX29wX2RhdGEgaGludCBmb3IgcGFzc2luZyBvdCBkb3duIHRvIE1EIHN0YWNrLiAqLwogc3RydWN0IG1kX29wX2RhdGEgKmxsX3ByZXBfbWRfb3BfZGF0YShzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKIAkJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmkxLCBzdHJ1Y3QgaW5vZGUgKmkyLAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLAotCQkJCSAgICAgIGludCBtb2RlLCBfX3UzMiBvcGMsIHZvaWQgKmRhdGEpCisJCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVsZW4sCisJCQkJICAgICAgdTMyIG1vZGUsIF9fdTMyIG9wYywgdm9pZCAqZGF0YSkKIHsKLQlpZiAobmFtZWxlbiA+IGxsX2kyc2JpKGkxKS0+bGxfbmFtZWxlbikKLQkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7CisJaWYgKCFuYW1lKSB7CisJCS8qIERvIG5vdCByZXVzZSBuYW1lbGVuIGZvciBzb21ldGhpbmcgZWxzZS4gKi8KKwkJaWYgKG5hbWVsZW4pCisJCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9IGVsc2UgeworCQlpZiAobmFtZWxlbiA+IGxsX2kyc2JpKGkxKS0+bGxfbmFtZWxlbikKKwkJCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOworCisJCWlmICghbHVfbmFtZV9pc192YWxpZF8yKG5hbWUsIG5hbWVsZW4pKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQogCiAJaWYgKCFvcF9kYXRhKQogCQlvcF9kYXRhID0ga3phbGxvYyhzaXplb2YoKm9wX2RhdGEpLCBHRlBfTk9GUyk7CkBAIC0yMDg5LDExICsyMzc3LDI2IEBACiAKIAlsbF9pMmdpZHMob3BfZGF0YS0+b3Bfc3VwcGdpZHMsIGkxLCBpMik7CiAJb3BfZGF0YS0+b3BfZmlkMSA9ICpsbF9pbm9kZTJmaWQoaTEpOworCW9wX2RhdGEtPm9wX2RlZmF1bHRfc3RyaXBlX29mZnNldCA9IC0xOworCWlmIChTX0lTRElSKGkxLT5pX21vZGUpKSB7CisJCW9wX2RhdGEtPm9wX21lYTEgPSBsbF9pMmluZm8oaTEpLT5sbGlfbHNtX21kOworCQlvcF9kYXRhLT5vcF9kZWZhdWx0X3N0cmlwZV9vZmZzZXQgPQorCQkJbGxfaTJpbmZvKGkxKS0+bGxpX2RlZl9zdHJpcGVfb2Zmc2V0OworCX0KIAotCWlmIChpMikKKwlpZiAoaTIpIHsKIAkJb3BfZGF0YS0+b3BfZmlkMiA9ICpsbF9pbm9kZTJmaWQoaTIpOwotCWVsc2UKKwkJaWYgKFNfSVNESVIoaTItPmlfbW9kZSkpCisJCQlvcF9kYXRhLT5vcF9tZWEyID0gbGxfaTJpbmZvKGkyKS0+bGxpX2xzbV9tZDsKKwl9IGVsc2UgewogCQlmaWRfemVybygmb3BfZGF0YS0+b3BfZmlkMik7CisJfQorCisJaWYgKGxsX2kyc2JpKGkxKS0+bGxfZmxhZ3MgJiBMTF9TQklfNjRCSVRfSEFTSCkKKwkJb3BfZGF0YS0+b3BfY2xpX2ZsYWdzIHw9IENMSV9IQVNINjQ7CisKKwlpZiAobGxfbmVlZF8zMmJpdF9hcGkobGxfaTJzYmkoaTEpKSkKKwkJb3BfZGF0YS0+b3BfY2xpX2ZsYWdzIHw9IENMSV9BUEkzMjsKIAogCW9wX2RhdGEtPm9wX25hbWUgPSBuYW1lOwogCW9wX2RhdGEtPm9wX25hbWVsZW4gPSBuYW1lbGVuOwpAQCAtMjEwNSwyNiArMjQwOCwxMiBAQAogCW9wX2RhdGEtPm9wX2JpYXMgPSAwOwogCW9wX2RhdGEtPm9wX2NsaV9mbGFncyA9IDA7CiAJaWYgKChvcGMgPT0gTFVTVFJFX09QQ19DUkVBVEUpICYmIG5hbWUgJiYKLQkgICAgZmlsZW5hbWVfaXNfdm9sYXRpbGUobmFtZSwgbmFtZWxlbiwgTlVMTCkpCisJICAgIGZpbGVuYW1lX2lzX3ZvbGF0aWxlKG5hbWUsIG5hbWVsZW4sICZvcF9kYXRhLT5vcF9tZHMpKQogCQlvcF9kYXRhLT5vcF9iaWFzIHw9IE1EU19DUkVBVEVfVk9MQVRJTEU7Ci0Jb3BfZGF0YS0+b3Bfb3BjID0gb3BjOwotCW9wX2RhdGEtPm9wX21kcyA9IDA7CisJZWxzZQorCQlvcF9kYXRhLT5vcF9tZHMgPSAwOwogCW9wX2RhdGEtPm9wX2RhdGEgPSBkYXRhOwogCi0JLyogSWYgdGhlIGZpbGUgaXMgYmVpbmcgb3BlbmVkIGFmdGVyIG1rbm9kKCkgKG5vcm1hbGx5IGR1ZSB0byBORlMpCi0JICogdHJ5IHRvIHVzZSB0aGUgZGVmYXVsdCBzdHJpcGUgZGF0YSBmcm9tIHBhcmVudCBkaXJlY3RvcnkgZm9yCi0JICogYWxsb2NhdGluZyBPU1Qgb2JqZWN0cy4gIFRyeSB0byBwYXNzIHRoZSBwYXJlbnQgRklEIHRvIE1EUy4KLQkgKi8KLQlpZiAob3BjID09IExVU1RSRV9PUENfQ1JFQVRFICYmIGkxID09IGkyICYmIFNfSVNSRUcoaTItPmlfbW9kZSkgJiYKLQkgICAgIWxsX2kyaW5mbyhpMiktPmxsaV9oYXNfc21kKSB7Ci0JCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oaTIpOwotCi0JCXNwaW5fbG9jaygmbGxpLT5sbGlfbG9jayk7Ci0JCWlmIChsaWtlbHkoIWxsaS0+bGxpX2hhc19zbWQgJiYgIWZpZF9pc196ZXJvKCZsbGktPmxsaV9wZmlkKSkpCi0JCQlvcF9kYXRhLT5vcF9maWQxID0gbGxpLT5sbGlfcGZpZDsKLQkJc3Bpbl91bmxvY2soJmxsaS0+bGxpX2xvY2spOwotCX0KLQogCS8qIFdoZW4gY2FsbGVkIGJ5IGxsX3NldGF0dHJfcmF3LCBmaWxlIGlzIGkxLiAqLwogCWlmIChsbF9pMmluZm8oaTEpLT5sbGlfZmxhZ3MgJiBMTElGX0RBVEFfTU9ESUZJRUQpCiAJCW9wX2RhdGEtPm9wX2JpYXMgfD0gTURTX0RBVEFfTU9ESUZJRUQ7CkBAIC0yMjUxLDMgKzI1NDAsMTk3IEBACiAJaWYgKGJ1ZikKIAkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWJ1Zik7CiB9CisKK3NzaXplX3QgbGxfY29weV91c2VyX21kKGNvbnN0IHN0cnVjdCBsb3ZfdXNlcl9tZCBfX3VzZXIgKm1kLAorCQkJc3RydWN0IGxvdl91c2VyX21kICoqa2J1ZikKK3sKKwlzdHJ1Y3QgbG92X3VzZXJfbWQgbHVtOworCXNzaXplX3QgbHVtX3NpemU7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmx1bSwgbWQsIHNpemVvZihsdW0pKSkgeworCQlsdW1fc2l6ZSA9IC1FRkFVTFQ7CisJCWdvdG8gbm9fa2J1ZjsKKwl9CisKKwlsdW1fc2l6ZSA9IGxsX2xvdl91c2VyX21kX3NpemUoJmx1bSk7CisJaWYgKGx1bV9zaXplIDwgMCkKKwkJZ290byBub19rYnVmOworCisJKmtidWYgPSBremFsbG9jKGx1bV9zaXplLCBHRlBfTk9GUyk7CisJaWYgKCEqa2J1ZikgeworCQlsdW1fc2l6ZSA9IC1FTk9NRU07CisJCWdvdG8gbm9fa2J1ZjsKKwl9CisKKwlpZiAoY29weV9mcm9tX3VzZXIoKmtidWYsIG1kLCBsdW1fc2l6ZSkgIT0gMCkgeworCQlrZnJlZSgqa2J1Zik7CisJCSprYnVmID0gTlVMTDsKKwkJbHVtX3NpemUgPSAtRUZBVUxUOworCX0KK25vX2tidWY6CisJcmV0dXJuIGx1bV9zaXplOworfQorCisvKgorICogQ29tcHV0ZSBsbGl0ZSByb290IHNxdWFzaCBzdGF0ZSBhZnRlciBhIGNoYW5nZSBvZiByb290IHNxdWFzaAorICogY29uZmlndXJhdGlvbiBzZXR0aW5nIG9yIGFkZC9yZW1vdmUgb2YgYSBsbmV0IG5pZAorICovCit2b2lkIGxsX2NvbXB1dGVfcm9vdHNxdWFzaF9zdGF0ZShzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpKQoreworCXN0cnVjdCByb290X3NxdWFzaF9pbmZvICpzcXVhc2ggPSAmc2JpLT5sbF9zcXVhc2g7CisJbG5ldF9wcm9jZXNzX2lkX3QgaWQ7CisJYm9vbCBtYXRjaGVkOworCWludCBpOworCisJLyogVXBkYXRlIG5vcm9vdHNxdWFzaCBmbGFnICovCisJZG93bl93cml0ZSgmc3F1YXNoLT5yc2lfc2VtKTsKKwlpZiAobGlzdF9lbXB0eSgmc3F1YXNoLT5yc2lfbm9zcXVhc2hfbmlkcykpIHsKKwkJc2JpLT5sbF9mbGFncyAmPSB+TExfU0JJX05PUk9PVFNRVUFTSDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBEbyBub3QgYXBwbHkgcm9vdCBzcXVhc2ggYXMgc29vbiBhcyBvbmUgb2Ygb3VyIE5JRHMgaXMKKwkJICogaW4gdGhlIG5vc3F1YXNoX25pZHMgbGlzdAorCQkgKi8KKwkJbWF0Y2hlZCA9IGZhbHNlOworCQlpID0gMDsKKworCQl3aGlsZSAoTE5ldEdldElkKGkrKywgJmlkKSAhPSAtRU5PRU5UKSB7CisJCQlpZiAoTE5FVF9ORVRUWVAoTE5FVF9OSURORVQoaWQubmlkKSkgPT0gTE9MTkQpCisJCQkJY29udGludWU7CisJCQlpZiAoY2ZzX21hdGNoX25pZChpZC5uaWQsICZzcXVhc2gtPnJzaV9ub3NxdWFzaF9uaWRzKSkgeworCQkJCW1hdGNoZWQgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChtYXRjaGVkKQorCQkJc2JpLT5sbF9mbGFncyB8PSBMTF9TQklfTk9ST09UU1FVQVNIOworCQllbHNlCisJCQlzYmktPmxsX2ZsYWdzICY9IH5MTF9TQklfTk9ST09UU1FVQVNIOworCX0KKwl1cF93cml0ZSgmc3F1YXNoLT5yc2lfc2VtKTsKK30KKworLyoqCisgKiBQYXJzZSBsaW5rZWEgY29udGVudCB0byBleHRyYWN0IGluZm9ybWF0aW9uIGFib3V0IGEgZ2l2ZW4gaGFyZGxpbmsKKyAqCisgKiBccGFyYW1baW5dCWxkYXRhCQktIEluaXRpYWxpemVkIGxpbmtlYSBkYXRhCisgKiBccGFyYW1baW5dCWxpbmtubwkJLSBMaW5rIGlkZW50aWZpZXIKKyAqIFxwYXJhbVtvdXRdCXBhcmVudF9maWQJLSBUaGUgZW50cnkncyBwYXJlbnQgRklECisgKiBccGFyYW1baW5dCXNpemUJCS0gRW50cnkgbmFtZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqCisgKiBccmV0dmFsIDAgb24gc3VjY2VzcworICogXHJldHZhbCBBcHByb3ByaWF0ZSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBsbF9saW5rZWFfZGVjb2RlKHN0cnVjdCBsaW5rZWFfZGF0YSAqbGRhdGEsIHVuc2lnbmVkIGludCBsaW5rbm8sCisJCQkgICAgc3RydWN0IGx1X2ZpZCAqcGFyZW50X2ZpZCwgc3RydWN0IGx1X25hbWUgKmxuKQoreworCXVuc2lnbmVkIGludCBpZHg7CisJaW50IHJjOworCisJcmMgPSBsaW5rZWFfaW5pdChsZGF0YSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJaWYgKGxpbmtubyA+PSBsZGF0YS0+bGRfbGVoLT5sZWhfcmVjY291bnQpCisJCS8qIGJleW9uZCBsYXN0IGxpbmsgKi8KKwkJcmV0dXJuIC1FTk9EQVRBOworCisJbGlua2VhX2ZpcnN0X2VudHJ5KGxkYXRhKTsKKwlmb3IgKGlkeCA9IDA7IGxkYXRhLT5sZF9sZWU7IGlkeCsrKSB7CisJCWxpbmtlYV9lbnRyeV91bnBhY2sobGRhdGEtPmxkX2xlZSwgJmxkYXRhLT5sZF9yZWNsZW4sIGxuLAorCQkJCSAgICBwYXJlbnRfZmlkKTsKKwkJaWYgKGlkeCA9PSBsaW5rbm8pCisJCQlicmVhazsKKworCQlsaW5rZWFfbmV4dF9lbnRyeShsZGF0YSk7CisJfQorCisJaWYgKGlkeCA8IGxpbmtubykKKwkJcmV0dXJuIC1FTk9EQVRBOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogR2V0IHBhcmVudCBGSUQgYW5kIG5hbWUgb2YgYW4gaWRlbnRpZmllZCBsaW5rLiBPcGVyYXRpb24gaXMgcGVyZm9ybWVkIGZvcgorICogYSBnaXZlbiBsaW5rIG51bWJlciwgbGV0dGluZyB0aGUgY2FsbGVyIGl0ZXJhdGUgb3ZlciBsaW5rbm8gdG8gbGlzdCBvbmUgb3IKKyAqIGFsbCBsaW5rcyBvZiBhbiBlbnRyeS4KKyAqCisgKiBccGFyYW1baW5dCSAgZmlsZQktIEZpbGUgZGVzY3JpcHRvciBhZ2FpbnN0IHdoaWNoIHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbgorICogXHBhcmFtW2luLG91dF0gYXJnCS0gVXNlci1maWxsZWQgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIGxpbmtubyB0byBvcGVyYXRlCisgKgkJCSAgb24gYW5kIHRoZSBhdmFpbGFibGUgc2l6ZS4gSXQgaXMgZXZlbnR1YWxseSBmaWxsZWQgd2l0aAorICoJCQkgIHRoZSByZXF1ZXN0ZWQgaW5mb3JtYXRpb24gb3IgbGVmdCB1bnRvdWNoZWQgb24gZXJyb3IKKyAqCisgKiBccmV0dmFsIC0gMCBvbiBzdWNjZXNzCisgKiBccmV0dmFsIC0gQXBwcm9wcmlhdGUgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlCisgKi8KK2ludCBsbF9nZXRwYXJlbnQoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBnZXRwYXJlbnQgX191c2VyICphcmcpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoZmlsZSk7CisJc3RydWN0IGxpbmtlYV9kYXRhICpsZGF0YTsKKwlzdHJ1Y3QgbHVfZmlkIHBhcmVudF9maWQ7CisJc3RydWN0IGx1X2J1ZiBidWYgPSB7CisJCS5sYl9idWYgPSBOVUxMLAorCQkubGJfbGVuID0gMAorCX07CisJc3RydWN0IGx1X25hbWUgbG47CisJdTMyIG5hbWVfc2l6ZTsKKwl1MzIgbGlua25vOworCWludCByYzsKKworCWlmICghY2FwYWJsZShDRlNfQ0FQX0RBQ19SRUFEX1NFQVJDSCkgJiYKKwkgICAgIShsbF9pMnNiaShpbm9kZSktPmxsX2ZsYWdzICYgTExfU0JJX1VTRVJfRklEMlBBVEgpKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKGdldF91c2VyKG5hbWVfc2l6ZSwgJmFyZy0+Z3BfbmFtZV9zaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoZ2V0X3VzZXIobGlua25vLCAmYXJnLT5ncF9saW5rbm8pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChuYW1lX3NpemUgPiBQQVRIX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpsZGF0YSksIEdGUF9OT0ZTKTsKKwlpZiAoIWxkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJjID0gbGlua2VhX2RhdGFfbmV3KGxkYXRhLCAmYnVmKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGxkYXRhX2ZyZWU7CisKKwlyYyA9IGxsX3hhdHRyX2xpc3QoaW5vZGUsIFhBVFRSX05BTUVfTElOSywgWEFUVFJfVFJVU1RFRF9ULCBidWYubGJfYnVmLAorCQkJICAgYnVmLmxiX2xlbiwgT0JEX01EX0ZMWEFUVFIpOworCWlmIChyYyA8IDApCisJCWdvdG8gbGJfZnJlZTsKKworCXJjID0gbGxfbGlua2VhX2RlY29kZShsZGF0YSwgbGlua25vLCAmcGFyZW50X2ZpZCwgJmxuKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGxiX2ZyZWU7CisKKwlpZiAobG4ubG5fbmFtZWxlbiA+PSBuYW1lX3NpemUpIHsKKwkJcmMgPSAtRU9WRVJGTE9XOworCQlnb3RvIGxiX2ZyZWU7CisJfQorCisJaWYgKGNvcHlfdG9fdXNlcigmYXJnLT5ncF9maWQsICZwYXJlbnRfZmlkLCBzaXplb2YoYXJnLT5ncF9maWQpKSkgeworCQlyYyA9IC1FRkFVTFQ7CisJCWdvdG8gbGJfZnJlZTsKKwl9CisKKwlpZiAoY29weV90b191c2VyKCZhcmctPmdwX25hbWUsIGxuLmxuX25hbWUsIGxuLmxuX25hbWVsZW4pKSB7CisJCXJjID0gLUVGQVVMVDsKKwkJZ290byBsYl9mcmVlOworCX0KKworCWlmIChwdXRfdXNlcignXDAnLCBhcmctPmdwX25hbWUgKyBsbi5sbl9uYW1lbGVuKSkgeworCQlyYyA9IC1FRkFVTFQ7CisJCWdvdG8gbGJfZnJlZTsKKwl9CisKK2xiX2ZyZWU6CisJbHVfYnVmX2ZyZWUoJmJ1Zik7CitsZGF0YV9mcmVlOgorCWtmcmVlKGxkYXRhKTsKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9tbWFwLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9tbWFwLmMKaW5kZXggNjZlZTVkYi4uNDM2NjkxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbW1hcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX21tYXAuYwpAQCAtNDMsOSArNDMsNyBAQAogCiAjZGVmaW5lIERFQlVHX1NVQlNZU1RFTSBTX0xMSVRFCiAKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saXRlLmgiCiAjaW5jbHVkZSAibGxpdGVfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2xpbnV4L2x1c3RyZV9jb21wYXQyNS5oIgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGxsX2ZpbGVfdm1fb3BzOwogCkBAIC0xMjYsNyArMTI0LDcgQEAKIAogCWZpbyA9ICZpby0+dS5jaV9mYXVsdDsKIAlmaW8tPmZ0X2luZGV4ICAgICAgPSBpbmRleDsKLQlmaW8tPmZ0X2V4ZWN1dGFibGUgPSB2bWEtPnZtX2ZsYWdzJlZNX0VYRUM7CisJZmlvLT5mdF9leGVjdXRhYmxlID0gdm1hLT52bV9mbGFncyAmIFZNX0VYRUM7CiAKIAkvKgogCSAqIGRpc2FibGUgVk1fU0VRX1JFQUQgYW5kIHVzZSBWTV9SQU5EX1JFQUQgdG8gbWFrZSBzdXJlIHRoYXQKQEAgLTEzNCw3ICsxMzIsNyBAQAogCSAqIGZpbGVtYXBfbm9wYWdlLiB3ZSBkbyBvdXIgcmVhZGFoZWFkIGluIGxsX3JlYWRwYWdlLgogCSAqLwogCWlmIChyYV9mbGFncykKLQkJKnJhX2ZsYWdzID0gdm1hLT52bV9mbGFncyAmIChWTV9SQU5EX1JFQUR8Vk1fU0VRX1JFQUQpOworCQkqcmFfZmxhZ3MgPSB2bWEtPnZtX2ZsYWdzICYgKFZNX1JBTkRfUkVBRCB8IFZNX1NFUV9SRUFEKTsKIAl2bWEtPnZtX2ZsYWdzICY9IH5WTV9TRVFfUkVBRDsKIAl2bWEtPnZtX2ZsYWdzIHw9IFZNX1JBTkRfUkVBRDsKIApAQCAtNDI5LDcgKzQyNyw2IEBACiAJc3RydWN0IGlub2RlICppbm9kZSAgICA9IGZpbGVfaW5vZGUodm1hLT52bV9maWxlKTsKIAlzdHJ1Y3QgdnZwX29iamVjdCAqdm9iID0gY2xfaW5vZGUydnZwKGlub2RlKTsKIAotCUxBU1NFUlQodm1hLT52bV9maWxlKTsKIAlMQVNTRVJUKGF0b21pY19yZWFkKCZ2b2ItPnZvYl9tbWFwX2NudCkgPj0gMCk7CiAJYXRvbWljX2luYygmdm9iLT52b2JfbW1hcF9jbnQpOwogfQpAQCAtNDQyLDcgKzQzOSw2IEBACiAJc3RydWN0IGlub2RlICAgICAgKmlub2RlID0gZmlsZV9pbm9kZSh2bWEtPnZtX2ZpbGUpOwogCXN0cnVjdCB2dnBfb2JqZWN0ICp2b2IgICA9IGNsX2lub2RlMnZ2cChpbm9kZSk7CiAKLQlMQVNTRVJUKHZtYS0+dm1fZmlsZSk7CiAJYXRvbWljX2RlYygmdm9iLT52b2JfbW1hcF9jbnQpOwogCUxBU1NFUlQoYXRvbWljX3JlYWQoJnZvYi0+dm9iX21tYXBfY250KSA+PSAwKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX25mcy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbmZzLmMKaW5kZXggNjU5NzJjOC4uNzA5MjMwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbmZzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbmZzLmMKQEAgLTM4LDcgKzM4LDYgQEAKICAqLwogCiAjZGVmaW5lIERFQlVHX1NVQlNZU1RFTSBTX0xMSVRFCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIgogI2luY2x1ZGUgImxsaXRlX2ludGVybmFsLmgiCiAjaW5jbHVkZSA8bGludXgvZXhwb3J0ZnMuaD4KIApAQCAtNzMsMTEgKzcyLDYgQEAKIAlmc2lkLT52YWxbMV0gPSBrZXkgPj4gMzI7CiB9CiAKLXN0YXRpYyBpbnQgbGxfbmZzX3Rlc3RfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqb3BhcXVlKQotewotCXJldHVybiBsdV9maWRfZXEoJmxsX2kyaW5mbyhpbm9kZSktPmxsaV9maWQsIG9wYXF1ZSk7Ci19Ci0KIHN0cnVjdCBpbm9kZSAqc2VhcmNoX2lub2RlX2Zvcl9sdXN0cmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQpCiB7CkBAIC05Miw3ICs4Niw3IEBACiAKIAlDREVCVUcoRF9JTkZPLCAic2VhcmNoaW5nIGlub2RlIGZvcjooJWx1LCJERklEIilcbiIsIGhhc2gsIFBGSUQoZmlkKSk7CiAKLQlpbm9kZSA9IGlsb29rdXA1KHNiLCBoYXNoLCBsbF9uZnNfdGVzdF9pbm9kZSwgKHZvaWQgKilmaWQpOworCWlub2RlID0gaWxvb2t1cDUoc2IsIGhhc2gsIGxsX3Rlc3RfaW5vZGVfYnlfZmlkLCAodm9pZCAqKWZpZCk7CiAJaWYgKGlub2RlKQogCQlyZXR1cm4gaW5vZGU7CiAKQEAgLTE1MywxMiArMTQ3LDE4IEBACiAJCXJldHVybiBFUlJfUFRSKC1FU1RBTEUpOwogCX0KIAorCXJlc3VsdCA9IGRfb2J0YWluX2FsaWFzKGlub2RlKTsKKwlpZiAoSVNfRVJSKHJlc3VsdCkpIHsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCiAJLyoqCi0JICogSXQgaXMgYW4gYW5vbnltb3VzIGRlbnRyeSB3aXRob3V0IE9TVCBvYmplY3RzIGNyZWF0ZWQgeWV0LgotCSAqIFdlIGhhdmUgdG8gZmluZCB0aGUgcGFyZW50IHRvIHRlbGwgTURTIGhvdyB0byBpbml0IGxvdiBvYmplY3RzLgorCSAqIEluIGNhc2UgZF9vYnRhaW5fYWxpYXMoKSBmb3VuZCBhIGRpc2Nvbm5lY3RlZCBkZW50cnksIGFsd2F5cyB1cGRhdGUKKwkgKiBsbGlfcGZpZCB0byBhbGxvdyBsYXRlciBvcGVyYXRpb24gKG5vcm1hbGx5IG9wZW4pIGhhdmUgcGFyZW50IGZpZCwKKwkgKiB3aGljaCBtYXkgYmUgdXNlZCBieSBNRFMgdG8gY3JlYXRlIGRhdGEuCiAJICovCi0JaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYgIWxsX2kyaW5mbyhpbm9kZSktPmxsaV9oYXNfc21kICYmCi0JICAgIHBhcmVudCAmJiAhZmlkX2lzX3plcm8ocGFyZW50KSkgeworCWlmIChwYXJlbnQpIHsKIAkJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhpbm9kZSk7CiAKIAkJc3Bpbl9sb2NrKCZsbGktPmxsaV9sb2NrKTsKQEAgLTI1NSw2ICsyNTUsOCBAQAogCQkubGdkX2ZpZCA9IGxsX2kyaW5mbyhkX2lub2RlKGNoaWxkKSktPmxsaV9maWQsCiAJCS5jdHguYWN0b3IgPSBsbF9uZnNfZ2V0X25hbWVfZmlsbGRpciwKIAl9OworCXN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhOworCV9fdTY0IHBvcyA9IDA7CiAKIAlpZiAoIWRpciB8fCAhU19JU0RJUihkaXItPmlfbW9kZSkpIHsKIAkJcmMgPSAtRU5PVERJUjsKQEAgLTI2Niw5ICsyNjgsMTggQEAKIAkJZ290byBvdXQ7CiAJfQogCisJb3BfZGF0YSA9IGxsX3ByZXBfbWRfb3BfZGF0YShOVUxMLCBkaXIsIGRpciwgTlVMTCwgMCwgMCwKKwkJCQkgICAgIExVU1RSRV9PUENfQU5ZLCBkaXIpOworCWlmIChJU19FUlIob3BfZGF0YSkpIHsKKwkJcmMgPSBQVFJfRVJSKG9wX2RhdGEpOworCQlnb3RvIG91dDsKKwl9CisKKwlvcF9kYXRhLT5vcF9tYXhfcGFnZXMgPSBsbF9pMnNiaShkaXIpLT5sbF9tZF9icndfcGFnZXM7CiAJaW5vZGVfbG9jayhkaXIpOwotCXJjID0gbGxfZGlyX3JlYWQoZGlyLCAmbGdkLmN0eCk7CisJcmMgPSBsbF9kaXJfcmVhZChkaXIsICZwb3MsIG9wX2RhdGEsICZsZ2QuY3R4KTsKIAlpbm9kZV91bmxvY2soZGlyKTsKKwlsbF9maW5pc2hfbWRfb3BfZGF0YShvcF9kYXRhKTsKIAlpZiAoIXJjICYmICFsZ2QubGdkX2ZvdW5kKQogCQlyYyA9IC1FTk9FTlQ7CiBvdXQ6CkBAIC0yOTcsMTQgKzMwOCwxMiBAQAogCXJldHVybiBsbF9pZ2V0X2Zvcl9uZnMoc2IsICZuZnNfZmlkLT5sbmZfcGFyZW50LCBOVUxMKTsKIH0KIAotc3RhdGljIHN0cnVjdCBkZW50cnkgKmxsX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqZGNoaWxkKQoraW50IGxsX2Rpcl9nZXRfcGFyZW50X2ZpZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGx1X2ZpZCAqcGFyZW50X2ZpZCkKIHsKIAlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSA9IE5VTEw7Ci0Jc3RydWN0IGlub2RlCSAgKmRpciA9IGRfaW5vZGUoZGNoaWxkKTsKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAgICAgKnNiaTsKLQlzdHJ1Y3QgZGVudHJ5CSAqcmVzdWx0ID0gTlVMTDsKIAlzdHJ1Y3QgbWR0X2JvZHkgICAgICAgKmJvZHk7Ci0Jc3RhdGljIGNoYXIJICAgZG90ZG90W10gPSAiLi4iOworCXN0YXRpYyBjb25zdCBjaGFyIGRvdGRvdFtdID0gIi4uIjsKIAlzdHJ1Y3QgbWRfb3BfZGF0YSAgICAgKm9wX2RhdGE7CiAJaW50CQkgICByYzsKIAlpbnQJCSAgICAgIGxtbXNpemU7CkBAIC0zMTksMTMgKzMyOCwxMyBAQAogCiAJcmMgPSBsbF9nZXRfZGVmYXVsdF9tZHNpemUoc2JpLCAmbG1tc2l6ZSk7CiAJaWYgKHJjICE9IDApCi0JCXJldHVybiBFUlJfUFRSKHJjKTsKKwkJcmV0dXJuIHJjOwogCiAJb3BfZGF0YSA9IGxsX3ByZXBfbWRfb3BfZGF0YShOVUxMLCBkaXIsIE5VTEwsIGRvdGRvdCwKIAkJCQkgICAgIHN0cmxlbihkb3Rkb3QpLCBsbW1zaXplLAogCQkJCSAgICAgTFVTVFJFX09QQ19BTlksIE5VTEwpOwogCWlmIChJU19FUlIob3BfZGF0YSkpCi0JCXJldHVybiAodm9pZCAqKW9wX2RhdGE7CisJCXJldHVybiBQVFJfRVJSKG9wX2RhdGEpOwogCiAJcmMgPSBtZF9nZXRhdHRyX25hbWUoc2JpLT5sbF9tZF9leHAsIG9wX2RhdGEsICZyZXEpOwogCWxsX2ZpbmlzaF9tZF9vcF9kYXRhKG9wX2RhdGEpOwpAQCAtMzMzLDIxICszNDIsMzYgQEAKIAkJQ0VSUk9SKCIlczogZmFpbHVyZSBpbm9kZSAiREZJRCIgZ2V0IHBhcmVudDogcmMgPSAlZFxuIiwKIAkJICAgICAgIGxsX2dldF9mc25hbWUoZGlyLT5pX3NiLCBOVUxMLCAwKSwKIAkJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGRpcikpLCByYyk7Ci0JCXJldHVybiBFUlJfUFRSKHJjKTsKKwkJcmV0dXJuIHJjOwogCX0KIAlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX01EVF9CT0RZKTsKIAkvKgogCSAqIExVLTM5NTI6IE1EVCBtYXkgbG9zdCB0aGUgRklEIG9mIGl0cyBwYXJlbnQsIHdlIHNob3VsZCBub3QgY3Jhc2gKIAkgKiB0aGUgTkZTIHNlcnZlciwgbGxfaWdldF9mb3JfbmZzKCkgd2lsbCBoYW5kbGUgdGhlIGVycm9yLgogCSAqLwotCWlmIChib2R5LT52YWxpZCAmIE9CRF9NRF9GTElEKSB7CisJaWYgKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9GTElEKSB7CiAJCUNERUJVRyhEX0lORk8sICJwYXJlbnQgZm9yICIgREZJRCAiIGlzICIgREZJRCAiXG4iLAotCQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoZGlyKSksIFBGSUQoJmJvZHktPmZpZDEpKTsKKwkJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGRpcikpLCBQRklEKCZib2R5LT5tYm9fZmlkMSkpOworCQkqcGFyZW50X2ZpZCA9IGJvZHktPm1ib19maWQxOwogCX0KLQlyZXN1bHQgPSBsbF9pZ2V0X2Zvcl9uZnMoZGlyLT5pX3NiLCAmYm9keS0+ZmlkMSwgTlVMTCk7CiAKIAlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7Ci0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmxsX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqZGNoaWxkKQoreworCXN0cnVjdCBsdV9maWQgcGFyZW50X2ZpZCA9IHsgMCB9OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlpbnQgcmM7CisKKwlyYyA9IGxsX2Rpcl9nZXRfcGFyZW50X2ZpZChkY2hpbGQtPmRfaW5vZGUsICZwYXJlbnRfZmlkKTsKKwlpZiAocmMpCisJCXJldHVybiBFUlJfUFRSKHJjKTsKKworCWRlbnRyeSA9IGxsX2lnZXRfZm9yX25mcyhkY2hpbGQtPmRfaW5vZGUtPmlfc2IsICZwYXJlbnRfZmlkLCBOVUxMKTsKKworCXJldHVybiBkZW50cnk7CiB9CiAKIGNvbnN0IHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBsdXN0cmVfZXhwb3J0X29wZXJhdGlvbnMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9scHJvY19sbGl0ZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbHByb2NfbGxpdGUuYwppbmRleCBlODZiZjNjLi42ZWFlNjA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9scHJvY19sbGl0ZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xwcm9jX2xsaXRlLmMKQEAgLTMxLDcgKzMxLDYgQEAKICAqLwogI2RlZmluZSBERUJVR19TVUJTWVNURU0gU19MTElURQogCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHByb2Nmc19zdGF0dXMuaCIKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkX3N1cHBvcnQuaCIKQEAgLTM1OCwxNiArMzU3LDE2IEBACiAJc3RydWN0IGxsX3NiX2luZm8gICAgICAqc2JpICAgPSBsbF9zMnNiaShzYik7CiAJc3RydWN0IGNsX2NsaWVudF9jYWNoZSAqY2FjaGUgPSBzYmktPmxsX2NhY2hlOwogCWludCBzaGlmdCA9IDIwIC0gUEFHRV9TSElGVDsKLQlpbnQgbWF4X2NhY2hlZF9tYjsKLQlpbnQgdW51c2VkX21iOworCWxvbmcgbWF4X2NhY2hlZF9tYjsKKwlsb25nIHVudXNlZF9tYjsKIAogCW1heF9jYWNoZWRfbWIgPSBjYWNoZS0+Y2NjX2xydV9tYXggPj4gc2hpZnQ7Ci0JdW51c2VkX21iID0gYXRvbWljX3JlYWQoJmNhY2hlLT5jY2NfbHJ1X2xlZnQpID4+IHNoaWZ0OworCXVudXNlZF9tYiA9IGF0b21pY19sb25nX3JlYWQoJmNhY2hlLT5jY2NfbHJ1X2xlZnQpID4+IHNoaWZ0OwogCXNlcV9wcmludGYobSwKIAkJICAgInVzZXJzOiAlZFxuIgotCQkgICAibWF4X2NhY2hlZF9tYjogJWRcbiIKLQkJICAgInVzZWRfbWI6ICVkXG4iCi0JCSAgICJ1bnVzZWRfbWI6ICVkXG4iCisJCSAgICJtYXhfY2FjaGVkX21iOiAlbGRcbiIKKwkJICAgInVzZWRfbWI6ICVsZFxuIgorCQkgICAidW51c2VkX21iOiAlbGRcbiIKIAkJICAgInJlY2xhaW1fY291bnQ6ICV1XG4iLAogCQkgICBhdG9taWNfcmVhZCgmY2FjaGUtPmNjY191c2VycyksCiAJCSAgIG1heF9jYWNoZWRfbWIsCkBAIC0zODUsMTAgKzM4NCwxMyBAQAogCXN0cnVjdCBsbF9zYl9pbmZvICpzYmkgPSBsbF9zMnNiaShzYik7CiAJc3RydWN0IGNsX2NsaWVudF9jYWNoZSAqY2FjaGUgPSBzYmktPmxsX2NhY2hlOwogCXN0cnVjdCBsdV9lbnYgKmVudjsKKwlsb25nIGRpZmYgPSAwOworCWxvbmcgbnJwYWdlcyA9IDA7CiAJaW50IHJlZmNoZWNrOwotCWludCBtdWx0LCByYywgcGFnZXNfbnVtYmVyOwotCWludCBkaWZmID0gMDsKLQlpbnQgbnJwYWdlcyA9IDA7CisJbG9uZyBwYWdlc19udW1iZXI7CisJaW50IG11bHQ7CisJbG9uZyByYzsKKwl1NjQgdmFsOwogCWNoYXIga2VybmJ1ZlsxMjhdOwogCiAJaWYgKGNvdW50ID49IHNpemVvZihrZXJuYnVmKSkKQEAgLTQwMSwxMCArNDAzLDE0IEBACiAJbXVsdCA9IDEgPDwgKDIwIC0gUEFHRV9TSElGVCk7CiAJYnVmZmVyICs9IGxwcm9jZnNfZmluZF9uYW1lZF92YWx1ZShrZXJuYnVmLCAibWF4X2NhY2hlZF9tYjoiLCAmY291bnQpIC0KIAkJICBrZXJuYnVmOwotCXJjID0gbHByb2Nmc193cml0ZV9mcmFjX2hlbHBlcihidWZmZXIsIGNvdW50LCAmcGFnZXNfbnVtYmVyLCBtdWx0KTsKKwlyYyA9IGxwcm9jZnNfd3JpdGVfZnJhY191NjRfaGVscGVyKGJ1ZmZlciwgY291bnQsICZ2YWwsIG11bHQpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCisJaWYgKHZhbCA+IExPTkdfTUFYKQorCQlyZXR1cm4gLUVSQU5HRTsKKwlwYWdlc19udW1iZXIgPSAobG9uZyl2YWw7CisKIAlpZiAocGFnZXNfbnVtYmVyIDwgMCB8fCBwYWdlc19udW1iZXIgPiB0b3RhbHJhbV9wYWdlcykgewogCQlDRVJST1IoIiVzOiBjYW4ndCBzZXQgbWF4IGNhY2hlIG1vcmUgdGhhbiAlbHUgTUJcbiIsCiAJCSAgICAgICBsbF9nZXRfZnNuYW1lKHNiLCBOVUxMLCAwKSwKQEAgLTQxOCw3ICs0MjQsNyBAQAogCiAJLyogZWFzeSAtIGFkZCBtb3JlIExSVSBzbG90cy4gKi8KIAlpZiAoZGlmZiA+PSAwKSB7Ci0JCWF0b21pY19hZGQoZGlmZiwgJmNhY2hlLT5jY2NfbHJ1X2xlZnQpOworCQlhdG9taWNfbG9uZ19hZGQoZGlmZiwgJmNhY2hlLT5jY2NfbHJ1X2xlZnQpOwogCQlyYyA9IDA7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTQyOSwxOCArNDM1LDE4IEBACiAKIAlkaWZmID0gLWRpZmY7CiAJd2hpbGUgKGRpZmYgPiAwKSB7Ci0JCWludCB0bXA7CisJCWxvbmcgdG1wOwogCiAJCS8qIHJlZHVjZSBMUlUgYnVkZ2V0IGZyb20gZnJlZSBzbG90cy4gKi8KIAkJZG8gewotCQkJaW50IG92LCBudjsKKwkJCWxvbmcgb3YsIG52OwogCi0JCQlvdiA9IGF0b21pY19yZWFkKCZjYWNoZS0+Y2NjX2xydV9sZWZ0KTsKKwkJCW92ID0gYXRvbWljX2xvbmdfcmVhZCgmY2FjaGUtPmNjY19scnVfbGVmdCk7CiAJCQlpZiAob3YgPT0gMCkKIAkJCQlicmVhazsKIAogCQkJbnYgPSBvdiA+IGRpZmYgPyBvdiAtIGRpZmYgOiAwOwotCQkJcmMgPSBhdG9taWNfY21weGNoZygmY2FjaGUtPmNjY19scnVfbGVmdCwgb3YsIG52KTsKKwkJCXJjID0gYXRvbWljX2xvbmdfY21weGNoZygmY2FjaGUtPmNjY19scnVfbGVmdCwgb3YsIG52KTsKIAkJCWlmIChsaWtlbHkob3YgPT0gcmMpKSB7CiAJCQkJZGlmZiAtPSBvdiAtIG52OwogCQkJCW5ycGFnZXMgKz0gb3YgLSBudjsKQEAgLTQ3NCw3ICs0ODAsNyBAQAogCQlzcGluX3VubG9jaygmc2JpLT5sbF9sb2NrKTsKIAkJcmMgPSBjb3VudDsKIAl9IGVsc2UgewotCQlhdG9taWNfYWRkKG5ycGFnZXMsICZjYWNoZS0+Y2NjX2xydV9sZWZ0KTsKKwkJYXRvbWljX2xvbmdfYWRkKG5ycGFnZXMsICZjYWNoZS0+Y2NjX2xydV9sZWZ0KTsKIAl9CiAJcmV0dXJuIHJjOwogfQpAQCAtNzM4LDYgKzc0NCwxOCBAQAogfQogTFVTVFJFX1JPX0FUVFIobWF4X2Vhc2l6ZSk7CiAKKy8qKgorICogR2V0IGRlZmF1bHRfZWFzaXplLgorICoKKyAqIFxzZWUgY2xpZW50X29iZDo6Y2xfZGVmYXVsdF9tZHNfZWFzaXplCisgKgorICogXHBhcmFtW2luXSBrb2JqCWtlcm5lbCBvYmplY3QgZm9yIHN5c2ZzIHRyZWUKKyAqIFxwYXJhbVtpbl0gYXR0cglhdHRyaWJ1dGUgb2YgdGhpcyBrZXJuZWwgb2JqZWN0CisgKiBccGFyYW1baW5dIGJ1ZglidWZmZXIgdG8gd3JpdGUgZGF0YSBpbnRvCisgKgorICogXHJldHZhbCBwb3NpdGl2ZQlcYSBjb3VudCBvbiBzdWNjZXNzCisgKiBccmV0dmFsIG5lZ2F0aXZlCW5lZ2F0ZWQgZXJybm8gb24gZmFpbHVyZQorICovCiBzdGF0aWMgc3NpemVfdCBkZWZhdWx0X2Vhc2l6ZV9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAogCQkJCSAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCiAJCQkJICAgY2hhciAqYnVmKQpAQCAtNzUzLDcgKzc3MSw0NCBAQAogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGVhbGVuKTsKIH0KLUxVU1RSRV9ST19BVFRSKGRlZmF1bHRfZWFzaXplKTsKKworLyoqCisgKiBTZXQgZGVmYXVsdF9lYXNpemUuCisgKgorICogUmFuZ2UgY2hlY2tpbmcgb24gdGhlIHBhc3NlZCB2YWx1ZSBpcyBoYW5kbGVkIGJ5CisgKiBsbF9zZXRfZGVmYXVsdF9tZHNpemUoKS4KKyAqCisgKiBcc2VlIGNsaWVudF9vYmQ6OmNsX2RlZmF1bHRfbWRzX2Vhc2l6ZQorICoKKyAqIFxwYXJhbVtpbl0ga29iaglrZXJuZWwgb2JqZWN0IGZvciBzeXNmcyB0cmVlCisgKiBccGFyYW1baW5dIGF0dHIJYXR0cmlidXRlIG9mIHRoaXMga2VybmVsIG9iamVjdAorICogXHBhcmFtW2luXSBidWZmZXIJc3RyaW5nIHBhc3NlZCBmcm9tIHVzZXIgc3BhY2UKKyAqIFxwYXJhbVtpbl0gY291bnQJXGEgYnVmZmVyIGxlbmd0aAorICoKKyAqIFxyZXR2YWwgcG9zaXRpdmUJXGEgY291bnQgb24gc3VjY2VzcworICogXHJldHZhbCBuZWdhdGl2ZQluZWdhdGVkIGVycm5vIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIHNzaXplX3QgZGVmYXVsdF9lYXNpemVfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgIGNvbnN0IGNoYXIgKmJ1ZmZlciwKKwkJCQkgICAgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBsbF9zYl9pbmZvICpzYmkgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGxsX3NiX2luZm8sCisJCQkJCSAgICAgIGxsX2tvYmopOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCByYzsKKworCXJjID0ga3N0cnRvdWwoYnVmZmVyLCAxMCwgJnZhbCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IGxsX3NldF9kZWZhdWx0X21kc2l6ZShzYmksIHZhbCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gY291bnQ7Cit9CitMVVNUUkVfUldfQVRUUihkZWZhdWx0X2Vhc2l6ZSk7CiAKIHN0YXRpYyBpbnQgbGxfc2JpX2ZsYWdzX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKQEAgLTc3NCw3ICs4MjksNyBAQAogCQlmbGFncyA+Pj0gMTsKIAkJKytpOwogCX0KLQlzZXFfcHJpbnRmKG0sICJcYlxuIik7CisJc2VxX3B1dHMobSwgIlxiXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtODIzLDE1ICs4NzgsMTE2IEBACiAJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgbGxfc2JfaW5mbywKIAkJCQkJICAgICAgbGxfa29iaik7CiAJc3RydWN0IGNsX2NsaWVudF9jYWNoZSAqY2FjaGUgPSBzYmktPmxsX2NhY2hlOwotCWludCBwYWdlcywgbWI7CisJbG9uZyBwYWdlczsKKwlpbnQgbWI7CiAKLQlwYWdlcyA9IGF0b21pY19yZWFkKCZjYWNoZS0+Y2NjX3Vuc3RhYmxlX25yKTsKKwlwYWdlcyA9IGF0b21pY19sb25nX3JlYWQoJmNhY2hlLT5jY2NfdW5zdGFibGVfbnIpOwogCW1iID0gKHBhZ2VzICogUEFHRV9TSVpFKSA+PiAyMDsKIAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgInVuc3RhYmxlX3BhZ2VzOiAlOGRcbiIKLQkJCSAgICAidW5zdGFibGVfbWI6ICAgICU4ZFxuIiwgcGFnZXMsIG1iKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICJ1bnN0YWJsZV9jaGVjazogICAgICU4ZFxuIgorCQkJICAgICJ1bnN0YWJsZV9wYWdlczogJTEybGRcbiIKKwkJCSAgICAidW5zdGFibGVfbWI6ICAgICAgICAlOGRcbiIsCisJCQkgICAgY2FjaGUtPmNjY191bnN0YWJsZV9jaGVjaywgcGFnZXMsIG1iKTsKIH0KLUxVU1RSRV9ST19BVFRSKHVuc3RhYmxlX3N0YXRzKTsKKworc3RhdGljIHNzaXplX3QgdW5zdGFibGVfc3RhdHNfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgIGNvbnN0IGNoYXIgKmJ1ZmZlciwKKwkJCQkgICAgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBsbF9zYl9pbmZvICpzYmkgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGxsX3NiX2luZm8sCisJCQkJCSAgICAgIGxsX2tvYmopOworCWNoYXIga2VybmJ1ZlsxMjhdOworCWludCB2YWwsIHJjOworCisJaWYgKCFjb3VudCkKKwkJcmV0dXJuIDA7CisJaWYgKGNvdW50ID49IHNpemVvZihrZXJuYnVmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoa2VybmJ1ZiwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWtlcm5idWZbY291bnRdID0gMDsKKworCWJ1ZmZlciArPSBscHJvY2ZzX2ZpbmRfbmFtZWRfdmFsdWUoa2VybmJ1ZiwgInVuc3RhYmxlX2NoZWNrOiIsICZjb3VudCkgLQorCQkgIGtlcm5idWY7CisJcmMgPSBscHJvY2ZzX3dyaXRlX2hlbHBlcihidWZmZXIsIGNvdW50LCAmdmFsKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwkvKiBib3Jyb3cgbHJ1IGxvY2sgdG8gc2V0IHRoZSB2YWx1ZSAqLworCXNwaW5fbG9jaygmc2JpLT5sbF9jYWNoZS0+Y2NjX2xydV9sb2NrKTsKKwlzYmktPmxsX2NhY2hlLT5jY2NfdW5zdGFibGVfY2hlY2sgPSAhIXZhbDsKKwlzcGluX3VubG9jaygmc2JpLT5sbF9jYWNoZS0+Y2NjX2xydV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KK0xVU1RSRV9SV19BVFRSKHVuc3RhYmxlX3N0YXRzKTsKKworc3RhdGljIHNzaXplX3Qgcm9vdF9zcXVhc2hfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJCQljaGFyICpidWYpCit7CisJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgbGxfc2JfaW5mbywKKwkJCQkJICAgICAgbGxfa29iaik7CisJc3RydWN0IHJvb3Rfc3F1YXNoX2luZm8gKnNxdWFzaCA9ICZzYmktPmxsX3NxdWFzaDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1OiV1XG4iLCBzcXVhc2gtPnJzaV91aWQsIHNxdWFzaC0+cnNpX2dpZCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJvb3Rfc3F1YXNoX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJCSBjb25zdCBjaGFyICpidWZmZXIsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBsbF9zYl9pbmZvLAorCQkJCQkgICAgICBsbF9rb2JqKTsKKwlzdHJ1Y3Qgcm9vdF9zcXVhc2hfaW5mbyAqc3F1YXNoID0gJnNiaS0+bGxfc3F1YXNoOworCisJcmV0dXJuIGxwcm9jZnNfd3Jfcm9vdF9zcXVhc2goYnVmZmVyLCBjb3VudCwgc3F1YXNoLAorCQkJCSAgICAgIGxsX2dldF9mc25hbWUoc2JpLT5sbF9zYiwgTlVMTCwgMCkpOworfQorTFVTVFJFX1JXX0FUVFIocm9vdF9zcXVhc2gpOworCitzdGF0aWMgaW50IGxsX25vc3F1YXNoX25pZHNfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBtLT5wcml2YXRlOworCXN0cnVjdCBsbF9zYl9pbmZvICpzYmkgPSBsbF9zMnNiaShzYik7CisJc3RydWN0IHJvb3Rfc3F1YXNoX2luZm8gKnNxdWFzaCA9ICZzYmktPmxsX3NxdWFzaDsKKwlpbnQgbGVuOworCisJZG93bl9yZWFkKCZzcXVhc2gtPnJzaV9zZW0pOworCWlmICghbGlzdF9lbXB0eSgmc3F1YXNoLT5yc2lfbm9zcXVhc2hfbmlkcykpIHsKKwkJbGVuID0gY2ZzX3ByaW50X25pZGxpc3QobS0+YnVmICsgbS0+Y291bnQsIG0tPnNpemUgLSBtLT5jb3VudCwKKwkJCQkJJnNxdWFzaC0+cnNpX25vc3F1YXNoX25pZHMpOworCQltLT5jb3VudCArPSBsZW47CisJCXNlcV9wdXRzKG0sICJcbiIpOworCX0gZWxzZSB7CisJCXNlcV9wdXRzKG0sICJOT05FXG4iKTsKKwl9CisJdXBfcmVhZCgmc3F1YXNoLT5yc2lfc2VtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBsbF9ub3NxdWFzaF9uaWRzX3NlcV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJICBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmYpCit7CisJc3RydWN0IHNlcV9maWxlICptID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBtLT5wcml2YXRlOworCXN0cnVjdCBsbF9zYl9pbmZvICpzYmkgPSBsbF9zMnNiaShzYik7CisJc3RydWN0IHJvb3Rfc3F1YXNoX2luZm8gKnNxdWFzaCA9ICZzYmktPmxsX3NxdWFzaDsKKwlpbnQgcmM7CisKKwlyYyA9IGxwcm9jZnNfd3Jfbm9zcXVhc2hfbmlkcyhidWZmZXIsIGNvdW50LCBzcXVhc2gsCisJCQkJICAgICAgbGxfZ2V0X2ZzbmFtZShzYiwgTlVMTCwgMCkpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCWxsX2NvbXB1dGVfcm9vdHNxdWFzaF9zdGF0ZShzYmkpOworCisJcmV0dXJuIHJjOworfQorCitMUFJPQ19TRVFfRk9QUyhsbF9ub3NxdWFzaF9uaWRzKTsKIAogc3RhdGljIHN0cnVjdCBscHJvY2ZzX3ZhcnMgbHByb2Nmc19sbGl0ZV9vYmRfdmFyc1tdID0gewogCS8qIHsgIm1udHB0X3BhdGgiLCAgIGxsX3JkX3BhdGgsCSAgICAgMCwgMCB9LCAqLwpAQCAtODQwLDYgKzk5Niw4IEBACiAJeyAibWF4X2NhY2hlZF9tYiIsICAgICZsbF9tYXhfY2FjaGVkX21iX2ZvcHMsIE5VTEwgfSwKIAl7ICJzdGF0YWhlYWRfc3RhdHMiLCAgJmxsX3N0YXRhaGVhZF9zdGF0c19mb3BzLCBOVUxMLCAwIH0sCiAJeyAic2JpX2ZsYWdzIiwJICAgICAgJmxsX3NiaV9mbGFnc19mb3BzLCBOVUxMLCAwIH0sCisJeyAubmFtZSA9CQkibm9zcXVhc2hfbmlkcyIsCisJICAuZm9wcyA9CQkmbGxfbm9zcXVhc2hfbmlkc19mb3BzCQl9LAogCXsgTlVMTCB9CiB9OwogCkBAIC04NjksNiArMTAyNyw3IEBACiAJJmx1c3RyZV9hdHRyX2RlZmF1bHRfZWFzaXplLmF0dHIsCiAJJmx1c3RyZV9hdHRyX3hhdHRyX2NhY2hlLmF0dHIsCiAJJmx1c3RyZV9hdHRyX3Vuc3RhYmxlX3N0YXRzLmF0dHIsCisJJmx1c3RyZV9hdHRyX3Jvb3Rfc3F1YXNoLmF0dHIsCiAJTlVMTCwKIH07CiAKQEAgLTg5MywxNyArMTA1MiwxNyBAQAogCS8qIGZpbGUgb3BlcmF0aW9uICovCiAJeyBMUFJPQ19MTF9ESVJUWV9ISVRTLCAgICAgTFBST0NGU19UWVBFX1JFR1MsICJkaXJ0eV9wYWdlc19oaXRzIiB9LAogCXsgTFBST0NfTExfRElSVFlfTUlTU0VTLCAgIExQUk9DRlNfVFlQRV9SRUdTLCAiZGlydHlfcGFnZXNfbWlzc2VzIiB9LAotCXsgTFBST0NfTExfUkVBRF9CWVRFUywgICAgIExQUk9DRlNfQ05UUl9BVkdNSU5NQVh8TFBST0NGU19UWVBFX0JZVEVTLAorCXsgTFBST0NfTExfUkVBRF9CWVRFUywgICAgIExQUk9DRlNfQ05UUl9BVkdNSU5NQVggfCBMUFJPQ0ZTX1RZUEVfQllURVMsCiAJCQkJICAgInJlYWRfYnl0ZXMiIH0sCi0JeyBMUFJPQ19MTF9XUklURV9CWVRFUywgICAgTFBST0NGU19DTlRSX0FWR01JTk1BWHxMUFJPQ0ZTX1RZUEVfQllURVMsCisJeyBMUFJPQ19MTF9XUklURV9CWVRFUywgICAgTFBST0NGU19DTlRSX0FWR01JTk1BWCB8IExQUk9DRlNfVFlQRV9CWVRFUywKIAkJCQkgICAid3JpdGVfYnl0ZXMiIH0sCi0JeyBMUFJPQ19MTF9CUldfUkVBRCwgICAgICAgTFBST0NGU19DTlRSX0FWR01JTk1BWHxMUFJPQ0ZTX1RZUEVfUEFHRVMsCisJeyBMUFJPQ19MTF9CUldfUkVBRCwgICAgICAgTFBST0NGU19DTlRSX0FWR01JTk1BWCB8IExQUk9DRlNfVFlQRV9QQUdFUywKIAkJCQkgICAiYnJ3X3JlYWQiIH0sCi0JeyBMUFJPQ19MTF9CUldfV1JJVEUsICAgICAgTFBST0NGU19DTlRSX0FWR01JTk1BWHxMUFJPQ0ZTX1RZUEVfUEFHRVMsCisJeyBMUFJPQ19MTF9CUldfV1JJVEUsICAgICAgTFBST0NGU19DTlRSX0FWR01JTk1BWCB8IExQUk9DRlNfVFlQRV9QQUdFUywKIAkJCQkgICAiYnJ3X3dyaXRlIiB9LAotCXsgTFBST0NfTExfT1NDX1JFQUQsICAgICAgIExQUk9DRlNfQ05UUl9BVkdNSU5NQVh8TFBST0NGU19UWVBFX0JZVEVTLAorCXsgTFBST0NfTExfT1NDX1JFQUQsICAgICAgIExQUk9DRlNfQ05UUl9BVkdNSU5NQVggfCBMUFJPQ0ZTX1RZUEVfQllURVMsCiAJCQkJICAgIm9zY19yZWFkIiB9LAotCXsgTFBST0NfTExfT1NDX1dSSVRFLCAgICAgIExQUk9DRlNfQ05UUl9BVkdNSU5NQVh8TFBST0NGU19UWVBFX0JZVEVTLAorCXsgTFBST0NfTExfT1NDX1dSSVRFLCAgICAgIExQUk9DRlNfQ05UUl9BVkdNSU5NQVggfCBMUFJPQ0ZTX1RZUEVfQllURVMsCiAJCQkJICAgIm9zY193cml0ZSIgfSwKIAl7IExQUk9DX0xMX0lPQ1RMLAkgIExQUk9DRlNfVFlQRV9SRUdTLCAiaW9jdGwiIH0sCiAJeyBMUFJPQ19MTF9PUEVOLAkgICBMUFJPQ0ZTX1RZUEVfUkVHUywgIm9wZW4iIH0sCkBAIC0xMTUwLDcgKzEzMDksNyBAQAogCQkJICAgciwgcGN0KHIsIHJlYWRfdG90KSwgcGN0KHJlYWRfY3VtLCByZWFkX3RvdCksCiAJCQkgICB3LCBwY3Qodywgd3JpdGVfdG90KSwgcGN0KHdyaXRlX2N1bSwgd3JpdGVfdG90KSk7CiAJCXN0YXJ0ID0gZW5kOwotCQlpZiAoc3RhcnQgPT0gMTw8MTApIHsKKwkJaWYgKHN0YXJ0ID09IDEgPDwgMTApIHsKIAkJCXN0YXJ0ID0gMTsKIAkJCXVuaXRzICs9IDEwOwogCQkJdW5pdHArKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL25hbWVpLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9uYW1laS5jCmluZGV4IDM2NjRiZmQuLmRmYTM2ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL25hbWVpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbmFtZWkuYwpAQCAtNDIsMTMgKzQyLDEyIEBACiAKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZF9zdXBwb3J0LmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfZmlkLmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2RsbS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX3Zlci5oIgogI2luY2x1ZGUgImxsaXRlX2ludGVybmFsLmgiCiAKLXN0YXRpYyBpbnQgbGxfY3JlYXRlX2l0KHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosCi0JCQlpbnQsIHN0cnVjdCBsb29rdXBfaW50ZW50ICopOworc3RhdGljIGludCBsbF9jcmVhdGVfaXQoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCXN0cnVjdCBsb29rdXBfaW50ZW50ICppdCk7CiAKIC8qIGNhbGxlZCBmcm9tIGlnZXQ1X2xvY2tlZC0+ZmluZF9pbm9kZSgpIHVuZGVyIGlub2RlX2hhc2hfbG9jayBzcGlubG9jayAqLwogc3RhdGljIGludCBsbF90ZXN0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKm9wYXF1ZSkKQEAgLTU2LDEyICs1NSwxMiBAQAogCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oaW5vZGUpOwogCXN0cnVjdCBsdXN0cmVfbWQgICAgICptZCA9IG9wYXF1ZTsKIAotCWlmICh1bmxpa2VseSghKG1kLT5ib2R5LT52YWxpZCAmIE9CRF9NRF9GTElEKSkpIHsKKwlpZiAodW5saWtlbHkoIShtZC0+Ym9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0ZMSUQpKSkgewogCQlDRVJST1IoIk1EUyBib2R5IG1pc3NpbmcgRklEXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKCFsdV9maWRfZXEoJmxsaS0+bGxpX2ZpZCwgJm1kLT5ib2R5LT5maWQxKSkKKwlpZiAoIWx1X2ZpZF9lcSgmbGxpLT5sbGlfZmlkLCAmbWQtPmJvZHktPm1ib19maWQxKSkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gMTsKQEAgLTcyLDIwICs3MSwyMCBAQAogCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oaW5vZGUpOwogCXN0cnVjdCBtZHRfYm9keSAqYm9keSA9ICgoc3RydWN0IGx1c3RyZV9tZCAqKW9wYXF1ZSktPmJvZHk7CiAKLQlpZiAodW5saWtlbHkoIShib2R5LT52YWxpZCAmIE9CRF9NRF9GTElEKSkpIHsKKwlpZiAodW5saWtlbHkoIShib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxJRCkpKSB7CiAJCUNFUlJPUigiTURTIGJvZHkgbWlzc2luZyBGSURcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlsbGktPmxsaV9maWQgPSBib2R5LT5maWQxOwotCWlmICh1bmxpa2VseSghKGJvZHktPnZhbGlkICYgT0JEX01EX0ZMVFlQRSkpKSB7CisJbGxpLT5sbGlfZmlkID0gYm9keS0+bWJvX2ZpZDE7CisJaWYgKHVubGlrZWx5KCEoYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0ZMVFlQRSkpKSB7CiAJCUNFUlJPUigiQ2FuIG5vdCBpbml0aWFsaXplIGlub2RlICIgREZJRAogCQkgICAgICAgIiB3aXRob3V0IG9iamVjdCB0eXBlOiB2YWxpZCA9ICUjbGx4XG4iLAotCQkgICAgICAgUEZJRCgmbGxpLT5sbGlfZmlkKSwgYm9keS0+dmFsaWQpOworCQkgICAgICAgUEZJRCgmbGxpLT5sbGlfZmlkKSwgYm9keS0+bWJvX3ZhbGlkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaW5vZGUtPmlfbW9kZSA9IChpbm9kZS0+aV9tb2RlICYgflNfSUZNVCkgfCAoYm9keS0+bW9kZSAmIFNfSUZNVCk7CisJaW5vZGUtPmlfbW9kZSA9IChpbm9kZS0+aV9tb2RlICYgflNfSUZNVCkgfCAoYm9keS0+bWJvX21vZGUgJiBTX0lGTVQpOwogCWlmICh1bmxpa2VseShpbm9kZS0+aV9tb2RlID09IDApKSB7CiAJCUNFUlJPUigiSW52YWxpZCBpbm9kZSAiREZJRCIgdHlwZVxuIiwgUEZJRCgmbGxpLT5sbGlfZmlkKSk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtOTYsNDEgKzk1LDQ1IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBHZXQgYW4gaW5vZGUgYnkgaW5vZGUgbnVtYmVyIChhbHJlYWR5IGluc3RhbnRpYXRlZCBieSB0aGUgaW50ZW50IGxvb2t1cCkuCi0gKiBSZXR1cm5zIGlub2RlIG9yIE5VTEwKKy8qKgorICogR2V0IGFuIGlub2RlIGJ5IGlub2RlIG51bWJlcihAaGFzaCksIHdoaWNoIGlzIGFscmVhZHkgaW5zdGFudGlhdGVkIGJ5CisgKiB0aGUgaW50ZW50IGxvb2t1cCkuCiAgKi8KIHN0cnVjdCBpbm9kZSAqbGxfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbm9fdCBoYXNoLAogCQkgICAgICBzdHJ1Y3QgbHVzdHJlX21kICptZCkKIHsKIAlzdHJ1Y3QgaW5vZGUJICppbm9kZTsKKwlpbnQgcmMgPSAwOwogCiAJTEFTU0VSVChoYXNoICE9IDApOwogCWlub2RlID0gaWdldDVfbG9ja2VkKHNiLCBoYXNoLCBsbF90ZXN0X2lub2RlLCBsbF9zZXRfaW5vZGUsIG1kKTsKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCWlmIChpbm9kZSkgewotCQlpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykgewotCQkJaW50IHJjID0gMDsKLQotCQkJbGxfcmVhZF9pbm9kZTIoaW5vZGUsIG1kKTsKLQkJCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmCi0JCQkgICAgIWxsX2kyaW5mbyhpbm9kZSktPmxsaV9jbG9iKSB7Ci0JCQkJQ0RFQlVHKERfSU5PREUsCi0JCQkJICAgICAgICIlczogYXBwbHkgbHNtICVwIHRvIGlub2RlICIgREZJRCAiLlxuIiwKLQkJCQkgICAgICAgbGxfZ2V0X2ZzbmFtZShzYiwgTlVMTCwgMCksIG1kLT5sc20sCi0JCQkJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSkpOwotCQkJCXJjID0gY2xfZmlsZV9pbm9kZV9pbml0KGlub2RlLCBtZCk7Ci0JCQl9Ci0JCQlpZiAocmMgIT0gMCkgewotCQkJCWlnZXRfZmFpbGVkKGlub2RlKTsKLQkJCQlpbm9kZSA9IE5VTEw7Ci0JCQl9IGVsc2UgewotCQkJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOwotCQkJfQotCQl9IGVsc2UgaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiAoSV9GUkVFSU5HIHwgSV9DTEVBUikpKSB7Ci0JCQlsbF91cGRhdGVfaW5vZGUoaW5vZGUsIG1kKTsKLQkJCUNERUJVRyhEX1ZGU1RSQUNFLCAiZ290IGlub2RlOiAiREZJRCIoJXApXG4iLAotCQkJICAgICAgIFBGSUQoJm1kLT5ib2R5LT5maWQxKSwgaW5vZGUpOworCWlmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSB7CisJCXJjID0gbGxfcmVhZF9pbm9kZTIoaW5vZGUsIG1kKTsKKwkJaWYgKCFyYyAmJiBTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmCisJCSAgICAhbGxfaTJpbmZvKGlub2RlKS0+bGxpX2Nsb2IpIHsKKwkJCUNERUJVRyhEX0lOT0RFLCAiJXM6IGFwcGx5IGxzbSAlcCB0byBpbm9kZSAiREZJRCJcbiIsCisJCQkgICAgICAgbGxfZ2V0X2ZzbmFtZShzYiwgTlVMTCwgMCksIG1kLT5sc20sCisJCQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSk7CisJCQlyYyA9IGNsX2ZpbGVfaW5vZGVfaW5pdChpbm9kZSwgbWQpOworCQl9CisJCWlmIChyYykgeworCQkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCQkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CisJCQlpcHV0KGlub2RlKTsKKwkJCWlub2RlID0gRVJSX1BUUihyYyk7CisJCX0gZWxzZSB7CisJCQl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKKwkJfQorCX0gZWxzZSBpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIChJX0ZSRUVJTkcgfCBJX0NMRUFSKSkpIHsKKwkJcmMgPSBsbF91cGRhdGVfaW5vZGUoaW5vZGUsIG1kKTsKKwkJQ0RFQlVHKERfVkZTVFJBQ0UsICJnb3QgaW5vZGU6ICJERklEIiglcCk6IHJjID0gJWRcbiIsCisJCSAgICAgICBQRklEKCZtZC0+Ym9keS0+bWJvX2ZpZDEpLCBpbm9kZSwgcmMpOworCQlpZiAocmMpIHsKKwkJCWlwdXQoaW5vZGUpOworCQkJaW5vZGUgPSBFUlJfUFRSKHJjKTsKIAkJfQogCX0KIAlyZXR1cm4gaW5vZGU7CkBAIC0xNTgsNiArMTYxLDExIEBACiAJc3Bpbl91bmxvY2soJmRpci0+aV9sb2NrKTsKIH0KIAoraW50IGxsX3Rlc3RfaW5vZGVfYnlfZmlkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKm9wYXF1ZSkKK3sKKwlyZXR1cm4gbHVfZmlkX2VxKCZsbF9pMmluZm8oaW5vZGUpLT5sbGlfZmlkLCBvcGFxdWUpOworfQorCiBpbnQgbGxfbWRfYmxvY2tpbmdfYXN0KHN0cnVjdCBsZGxtX2xvY2sgKmxvY2ssIHN0cnVjdCBsZGxtX2xvY2tfZGVzYyAqZGVzYywKIAkJICAgICAgIHZvaWQgKmRhdGEsIGludCBmbGFnKQogewpAQCAtMTk2LDYgKzIwNCw4IEBACiAJCX0KIAogCQlpZiAoYml0cyAmIE1EU19JTk9ERUxPQ0tfWEFUVFIpIHsKKwkJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQkJCWxsX2kyaW5mbyhpbm9kZSktPmxsaV9kZWZfc3RyaXBlX29mZnNldCA9IC0xOwogCQkJbGxfeGF0dHJfY2FjaGVfZGVzdHJveShpbm9kZSk7CiAJCQliaXRzICY9IH5NRFNfSU5PREVMT0NLX1hBVFRSOwogCQl9CkBAIC0yNTMsMTAgKzI2Myw0MSBAQAogCQl9CiAKIAkJaWYgKChiaXRzICYgTURTX0lOT0RFTE9DS19VUERBVEUpICYmIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKLQkJCUNERUJVRyhEX0lOT0RFLCAiaW52YWxpZGF0aW5nIGlub2RlICJERklEIlxuIiwKLQkJCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpKTsKKwkJCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oaW5vZGUpOworCisJCQlDREVCVUcoRF9JTk9ERSwgImludmFsaWRhdGluZyBpbm9kZSAiREZJRCIgbGxpID0gJXAsIHBmaWQgID0gIkRGSUQiXG4iLAorCQkJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSksIGxsaSwKKwkJCSAgICAgICBQRklEKCZsbGktPmxsaV9wZmlkKSk7CisKIAkJCXRydW5jYXRlX2lub2RlX3BhZ2VzKGlub2RlLT5pX21hcHBpbmcsIDApOwotCQkJbGxfaW52YWxpZGF0ZV9uZWdhdGl2ZV9jaGlsZHJlbihpbm9kZSk7CisKKwkJCWlmICh1bmxpa2VseSghZmlkX2lzX3plcm8oJmxsaS0+bGxpX3BmaWQpKSkgeworCQkJCXN0cnVjdCBpbm9kZSAqbWFzdGVyX2lub2RlID0gTlVMTDsKKwkJCQl1bnNpZ25lZCBsb25nIGhhc2g7CisKKwkJCQkvKgorCQkJCSAqIFRoaXMgaXMgc2xhdmUgaW5vZGUsIHNpbmNlIGFsbCBvZiB0aGUgY2hpbGQKKwkJCQkgKiBkZW50cnkgaXMgY29ubmVjdGVkIG9uIHRoZSBtYXN0ZXIgaW5vZGUsIHNvCisJCQkJICogd2UgaGF2ZSB0byBpbnZhbGlkYXRlIHRoZSBuZWdhdGl2ZSBjaGlsZHJlbgorCQkJCSAqIG9uIG1hc3RlciBpbm9kZQorCQkJCSAqLworCQkJCUNERUJVRyhEX0lOT0RFLCAiSW52YWxpZGF0ZSBzIkRGSUQiIG0iREZJRCJcbiIsCisJCQkJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSksCisJCQkJICAgICAgIFBGSUQoJmxsaS0+bGxpX3BmaWQpKTsKKworCQkJCWhhc2ggPSBjbF9maWRfYnVpbGRfaW5vKCZsbGktPmxsaV9wZmlkLAorCQkJCQkJCWxsX25lZWRfMzJiaXRfYXBpKGxsX2kyc2JpKGlub2RlKSkpOworCisJCQkJbWFzdGVyX2lub2RlID0gaWxvb2t1cDUoaW5vZGUtPmlfc2IsIGhhc2gsCisJCQkJCQkJbGxfdGVzdF9pbm9kZV9ieV9maWQsCisJCQkJCQkJKHZvaWQgKikmbGxpLT5sbGlfcGZpZCk7CisJCQkJaWYgKG1hc3Rlcl9pbm9kZSAmJiAhSVNfRVJSKG1hc3Rlcl9pbm9kZSkpIHsKKwkJCQkJbGxfaW52YWxpZGF0ZV9uZWdhdGl2ZV9jaGlsZHJlbihtYXN0ZXJfaW5vZGUpOworCQkJCQlpcHV0KG1hc3Rlcl9pbm9kZSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlsbF9pbnZhbGlkYXRlX25lZ2F0aXZlX2NoaWxkcmVuKGlub2RlKTsKKwkJCX0KIAkJfQogCiAJCWlmICgoYml0cyAmIChNRFNfSU5PREVMT0NLX0xPT0tVUCB8IE1EU19JTk9ERUxPQ0tfUEVSTSkpICYmCkBAIC0zMjIsNyArMzYzLDggQEAKIAkJTEFTU0VSVChhbGlhcyAhPSBkZW50cnkpOwogCiAJCXNwaW5fbG9jaygmYWxpYXMtPmRfbG9jayk7Ci0JCWlmIChhbGlhcy0+ZF9mbGFncyAmIERDQUNIRV9ESVNDT05ORUNURUQpCisJCWlmICgoYWxpYXMtPmRfZmxhZ3MgJiBEQ0FDSEVfRElTQ09OTkVDVEVEKSAmJgorCQkgICAgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKIAkJCS8qIExBU1NFUlQobGFzdF9kaXNjb24gPT0gTlVMTCk7IExVLTQwNSwgYnogMjAwNTUgKi8KIAkJCWRpc2Nvbl9hbGlhcyA9IGFsaWFzOwogCQllbHNlIGlmIChhbGlhcy0+ZF9wYXJlbnQgPT0gZGVudHJ5LT5kX3BhcmVudAkgICAgICYmCkBAIC0zODgsNiArNDMwLDcgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKIAlfX3U2NCBiaXRzID0gMDsKIAlpbnQgcmMgPSAwOworCXN0cnVjdCBkZW50cnkgKmFsaWFzOwogCiAJLyogTkIgMSByZXF1ZXN0IHJlZmVyZW5jZSB3aWxsIGJlIHRha2VuIGF3YXkgYnkgbGxfaW50ZW50X2xvY2soKQogCSAqIHdoZW4gSSByZXR1cm4KQEAgLTQxMiwyNiArNDU1LDEyIEBACiAJCSAqLwogCX0KIAotCS8qIE9ubHkgaGFzaCAqZGUgaWYgaXQgaXMgdW5oYXNoZWQgKG5ldyBkZW50cnkpLgotCSAqIEF0b2ltY19vcGVuIG1heSBwYXNzaW5nIGhhc2hlZCBkZW50cmllcyBmb3Igb3Blbi4KLQkgKi8KLQlpZiAoZF91bmhhc2hlZCgqZGUpKSB7Ci0JCXN0cnVjdCBkZW50cnkgKmFsaWFzOwotCi0JCWFsaWFzID0gbGxfc3BsaWNlX2FsaWFzKGlub2RlLCAqZGUpOwotCQlpZiAoSVNfRVJSKGFsaWFzKSkgewotCQkJcmMgPSBQVFJfRVJSKGFsaWFzKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCSpkZSA9IGFsaWFzOwotCX0gZWxzZSBpZiAoIWl0X2Rpc3Bvc2l0aW9uKGl0LCBESVNQX0xPT0tVUF9ORUcpICAmJgotCQkgICAhaXRfZGlzcG9zaXRpb24oaXQsIERJU1BfT1BFTl9DUkVBVEUpKSB7Ci0JCS8qIFdpdGggRElTUF9PUEVOX0NSRUFURSBkZW50cnkgd2lsbCBiZQotCQkgKiBpbnN0YW50aWF0ZWQgaW4gbGxfY3JlYXRlX2l0LgotCQkgKi8KLQkJTEFTU0VSVCghZF9pbm9kZSgqZGUpKTsKLQkJZF9pbnN0YW50aWF0ZSgqZGUsIGlub2RlKTsKKwlhbGlhcyA9IGxsX3NwbGljZV9hbGlhcyhpbm9kZSwgKmRlKTsKKwlpZiAoSVNfRVJSKGFsaWFzKSkgeworCQlyYyA9IFBUUl9FUlIoYWxpYXMpOworCQlnb3RvIG91dDsKIAl9CisJKmRlID0gYWxpYXM7CiAKIAlpZiAoIWl0X2Rpc3Bvc2l0aW9uKGl0LCBESVNQX0xPT0tVUF9ORUcpKSB7CiAJCS8qIHdlIGhhdmUgbG9va3VwIGxvb2sgLSB1bmhpZGUgZGVudHJ5ICovCkBAIC00NDYsOSArNDc1LDIwIEBACiAJCXN0cnVjdCBsb29rdXBfaW50ZW50IHBhcmVudF9pdCA9IHsKIAkJCQkJLml0X29wID0gSVRfR0VUQVRUUiwKIAkJCQkJLml0X2xvY2tfaGFuZGxlID0gMCB9OworCQlzdHJ1Y3QgbHVfZmlkIGZpZCA9IGxsX2kyaW5mbyhwYXJlbnQpLT5sbGlfZmlkOwogCi0JCWlmIChtZF9yZXZhbGlkYXRlX2xvY2sobGxfaTJtZGV4cChwYXJlbnQpLCAmcGFyZW50X2l0LAotCQkJCSAgICAgICAmbGxfaTJpbmZvKHBhcmVudCktPmxsaV9maWQsIE5VTEwpKSB7CisJCS8qIElmIGl0IGlzIHN0cmlwZWQgZGlyZWN0b3J5LCBnZXQgdGhlIHJlYWwgc3RyaXBlIHBhcmVudCAqLworCQlpZiAodW5saWtlbHkobGxfaTJpbmZvKHBhcmVudCktPmxsaV9sc21fbWQpKSB7CisJCQlyYyA9IG1kX2dldF9maWRfZnJvbV9sc20obGxfaTJtZGV4cChwYXJlbnQpLAorCQkJCQkJIGxsX2kyaW5mbyhwYXJlbnQpLT5sbGlfbHNtX21kLAorCQkJCQkJICgqZGUpLT5kX25hbWUubmFtZSwKKwkJCQkJCSAoKmRlKS0+ZF9uYW1lLmxlbiwgJmZpZCk7CisJCQlpZiAocmMpCisJCQkJcmV0dXJuIHJjOworCQl9CisKKwkJaWYgKG1kX3JldmFsaWRhdGVfbG9jayhsbF9pMm1kZXhwKHBhcmVudCksICZwYXJlbnRfaXQsICZmaWQsCisJCQkJICAgICAgIE5VTEwpKSB7CiAJCQlkX2x1c3RyZV9yZXZhbGlkYXRlKCpkZSk7CiAJCQlsbF9pbnRlbnRfcmVsZWFzZSgmcGFyZW50X2l0KTsKIAkJfQpAQCAtNDYyLDEzICs1MDIsMTMgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBkZW50cnkgKmxsX2xvb2t1cF9pdChzdHJ1Y3QgaW5vZGUgKnBhcmVudCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAotCQkJCSAgIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCwgaW50IGxvb2t1cF9mbGFncykKKwkJCQkgICBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQpCiB7CiAJc3RydWN0IGxvb2t1cF9pbnRlbnQgbG9va3VwX2l0ID0geyAuaXRfb3AgPSBJVF9MT09LVVAgfTsKIAlzdHJ1Y3QgZGVudHJ5ICpzYXZlID0gZGVudHJ5LCAqcmV0dmFsOwogCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxID0gTlVMTDsKKwlzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSA9IE5VTEw7CiAJc3RydWN0IGlub2RlICppbm9kZTsKLQlzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YTsKIAlfX3UzMiBvcGM7CiAJaW50IHJjOwogCkBAIC00ODQsOCArNTI0LDggQEAKIAlpZiAoIWl0IHx8IGl0LT5pdF9vcCA9PSBJVF9HRVRYQVRUUikKIAkJaXQgPSAmbG9va3VwX2l0OwogCi0JaWYgKGl0LT5pdF9vcCA9PSBJVF9HRVRBVFRSKSB7Ci0JCXJjID0gbGxfc3RhdGFoZWFkX2VudGVyKHBhcmVudCwgJmRlbnRyeSwgMCk7CisJaWYgKGl0LT5pdF9vcCA9PSBJVF9HRVRBVFRSICYmIGRlbnRyeV9tYXlfc3RhdGFoZWFkKHBhcmVudCwgZGVudHJ5KSkgeworCQlyYyA9IGxsX3N0YXRhaGVhZChwYXJlbnQsICZkZW50cnksIDApOwogCQlpZiAocmMgPT0gMSkgewogCQkJaWYgKGRlbnRyeSA9PSBzYXZlKQogCQkJCXJldHZhbCA9IE5VTEw7CkBAIC01MDEsOCArNTQxLDcgQEAKIAkJb3BjID0gTFVTVFJFX09QQ19BTlk7CiAKIAlvcF9kYXRhID0gbGxfcHJlcF9tZF9vcF9kYXRhKE5VTEwsIHBhcmVudCwgTlVMTCwgZGVudHJ5LT5kX25hbWUubmFtZSwKLQkJCQkgICAgIGRlbnRyeS0+ZF9uYW1lLmxlbiwgbG9va3VwX2ZsYWdzLCBvcGMsCi0JCQkJICAgICBOVUxMKTsKKwkJCQkgICAgIGRlbnRyeS0+ZF9uYW1lLmxlbiwgMCwgb3BjLCBOVUxMKTsKIAlpZiAoSVNfRVJSKG9wX2RhdGEpKQogCQlyZXR1cm4gKHZvaWQgKilvcF9kYXRhOwogCkBAIC01MTAsOSArNTQ5LDM4IEBACiAJaWYgKCFJU19QT1NJWEFDTChwYXJlbnQpIHx8ICFleHBfY29ubmVjdF91bWFzayhsbF9pMm1kZXhwKHBhcmVudCkpKQogCQlpdC0+aXRfY3JlYXRlX21vZGUgJj0gfmN1cnJlbnRfdW1hc2soKTsKIAotCXJjID0gbWRfaW50ZW50X2xvY2sobGxfaTJtZGV4cChwYXJlbnQpLCBvcF9kYXRhLCBOVUxMLCAwLCBpdCwKLQkJCSAgICBsb29rdXBfZmxhZ3MsICZyZXEsIGxsX21kX2Jsb2NraW5nX2FzdCwgMCk7Ci0JbGxfZmluaXNoX21kX29wX2RhdGEob3BfZGF0YSk7CisJcmMgPSBtZF9pbnRlbnRfbG9jayhsbF9pMm1kZXhwKHBhcmVudCksIG9wX2RhdGEsIGl0LCAmcmVxLAorCQkJICAgICZsbF9tZF9ibG9ja2luZ19hc3QsIDApOworCS8qCisJICogSWYgdGhlIE1EUyBhbGxvd3MgdGhlIGNsaWVudCB0byBjaGdycCAoQ0ZTX1NFVEdSUF9QRVJNKSwgYnV0IHRoZQorCSAqIGNsaWVudCBkb2VzIG5vdCBrbm93IHdoaWNoIHN1cHBnaWQgc2hvdWxkIGJlIHNlbnQgdG8gdGhlIE1EUywgb3IKKwkgKiBzb21lIG90aGVyKHMpIGNoYW5nZWQgdGhlIHRhcmdldCBmaWxlJ3MgR0lEIGFmdGVyIHRoaXMgUlBDIHNlbnQKKwkgKiB0byB0aGUgTURTIHdpdGggdGhlIHN1cHBnaWQgYXMgdGhlIG9yaWdpbmFsIEdJRCwgdGhlbiB3ZSBzaG91bGQKKwkgKiB0cnkgYWdhaW4gd2l0aCByaWdodCBzdXBwZ2lkLgorCSAqLworCWlmIChyYyA9PSAtRUFDQ0VTICYmIGl0LT5pdF9vcCAmIElUX09QRU4gJiYKKwkgICAgaXRfZGlzcG9zaXRpb24oaXQsIERJU1BfT1BFTl9ERU5ZKSkgeworCQlzdHJ1Y3QgbWR0X2JvZHkgKmJvZHk7CisKKwkJTEFTU0VSVChyZXEpOworCisJCWJvZHkgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfTURUX0JPRFkpOworCQlpZiAob3BfZGF0YS0+b3Bfc3VwcGdpZHNbMF0gPT0gYm9keS0+bWJvX2dpZCB8fAorCQkgICAgb3BfZGF0YS0+b3Bfc3VwcGdpZHNbMV0gPT0gYm9keS0+bWJvX2dpZCB8fAorCQkgICAgIWluX2dyb3VwX3AobWFrZV9rZ2lkKCZpbml0X3VzZXJfbnMsIGJvZHktPm1ib19naWQpKSkgeworCQkJcmV0dmFsID0gRVJSX1BUUigtRUFDQ0VTKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZmlkX3plcm8oJm9wX2RhdGEtPm9wX2ZpZDIpOworCQlvcF9kYXRhLT5vcF9zdXBwZ2lkc1sxXSA9IGJvZHktPm1ib19naWQ7CisJCXB0bHJwY19yZXFfZmluaXNoZWQocmVxKTsKKwkJcmVxID0gTlVMTDsKKwkJbGxfaW50ZW50X3JlbGVhc2UoaXQpOworCQlyYyA9IG1kX2ludGVudF9sb2NrKGxsX2kybWRleHAocGFyZW50KSwgb3BfZGF0YSwgaXQsICZyZXEsCisJCQkJICAgIGxsX21kX2Jsb2NraW5nX2FzdCwgMCk7CisJfQorCiAJaWYgKHJjIDwgMCkgewogCQlyZXR2YWwgPSBFUlJfUFRSKHJjKTsKIAkJZ290byBvdXQ7CkBAIC01MzcsMTEgKzYwNSwxMSBAQAogCQlyZXR2YWwgPSBOVUxMOwogCWVsc2UKIAkJcmV0dmFsID0gZGVudHJ5OwotIG91dDoKLQlpZiAocmVxKQotCQlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7Ci0JaWYgKGl0LT5pdF9vcCA9PSBJVF9HRVRBVFRSICYmICghcmV0dmFsIHx8IHJldHZhbCA9PSBkZW50cnkpKQotCQlsbF9zdGF0YWhlYWRfbWFyayhwYXJlbnQsIGRlbnRyeSk7CitvdXQ6CisJaWYgKG9wX2RhdGEgJiYgIUlTX0VSUihvcF9kYXRhKSkKKwkJbGxfZmluaXNoX21kX29wX2RhdGEob3BfZGF0YSk7CisKKwlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtNTU0LDE1ICs2MjIsMTkgQEAKIAlDREVCVUcoRF9WRlNUUkFDRSwgIlZGUyBPcDpuYW1lPSVwZCwgZGlyPSJERklEIiglcCksZmxhZ3M9JXVcbiIsCiAJICAgICAgIGRlbnRyeSwgUEZJRChsbF9pbm9kZTJmaWQocGFyZW50KSksIHBhcmVudCwgZmxhZ3MpOwogCi0JLyogT3B0aW1pemUgYXdheSAoQ1JFQVRFICYmICFPUEVOKS4gTGV0IC5jcmVhdGUgaGFuZGxlIHRoZSByYWNlLiAqLwotCWlmICgoZmxhZ3MgJiBMT09LVVBfQ1JFQVRFKSAmJiAhKGZsYWdzICYgTE9PS1VQX09QRU4pKQorCS8qIE9wdGltaXplIGF3YXkgKENSRUFURSAmJiAhT1BFTikuIExldCAuY3JlYXRlIGhhbmRsZSB0aGUgcmFjZS4KKwkgKiBidXQgb25seSBpZiB3ZSBoYXZlIHdyaXRlIHBlcm1pc3Npb25zIHRoZXJlLCBvdGhlcndpc2Ugd2UgbmVlZAorCSAqIHRvIHByb2NlZWQgd2l0aCBsb29rdXAuIExVLTQxODUKKwkgKi8KKwlpZiAoKGZsYWdzICYgTE9PS1VQX0NSRUFURSkgJiYgIShmbGFncyAmIExPT0tVUF9PUEVOKSAmJgorCSAgICAoaW5vZGVfcGVybWlzc2lvbihwYXJlbnQsIE1BWV9XUklURSB8IE1BWV9FWEVDKSA9PSAwKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlpZiAoZmxhZ3MgJiAoTE9PS1VQX1BBUkVOVHxMT09LVVBfT1BFTnxMT09LVVBfQ1JFQVRFKSkKKwlpZiAoZmxhZ3MgJiAoTE9PS1VQX1BBUkVOVCB8IExPT0tVUF9PUEVOIHwgTE9PS1VQX0NSRUFURSkpCiAJCWl0cCA9IE5VTEw7CiAJZWxzZQogCQlpdHAgPSAmaXQ7Ci0JZGUgPSBsbF9sb29rdXBfaXQocGFyZW50LCBkZW50cnksIGl0cCwgMCk7CisJZGUgPSBsbF9sb29rdXBfaXQocGFyZW50LCBkZW50cnksIGl0cCk7CiAKIAlpZiAoaXRwKQogCQlsbF9pbnRlbnRfcmVsZWFzZShpdHApOwpAQCAtNTgwLDI3ICs2NTIsNDMgQEAKIHsKIAlzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQ7CiAJc3RydWN0IGRlbnRyeSAqZGU7Ci0JbG9uZyBsb25nIGxvb2t1cF9mbGFncyA9IExPT0tVUF9PUEVOOwogCWludCByYyA9IDA7CiAKIAlDREVCVUcoRF9WRlNUUkFDRSwgIlZGUyBPcDpuYW1lPSVwZCwgZGlyPSJERklEIiglcCksZmlsZSAlcCxvcGVuX2ZsYWdzICV4LG1vZGUgJXggb3BlbmVkICVkXG4iLAogCSAgICAgICBkZW50cnksIFBGSUQobGxfaW5vZGUyZmlkKGRpcikpLCBkaXIsIGZpbGUsIG9wZW5fZmxhZ3MsIG1vZGUsCiAJICAgICAgICpvcGVuZWQpOwogCisJLyogT25seSBuZWdhdGl2ZSBkZW50cmllcyBlbnRlciBoZXJlICovCisJTEFTU0VSVCghZF9pbm9kZShkZW50cnkpKTsKKworCWlmICghZF9pbl9sb29rdXAoZGVudHJ5KSkgeworCQkvKiBBIHZhbGlkIG5lZ2F0aXZlIGRlbnRyeSB0aGF0IGp1c3QgcGFzc2VkIHJldmFsaWRhdGlvbiwKKwkJICogdGhlcmUncyBsaXR0bGUgcG9pbnQgdG8gdHJ5IGFuZCBvcGVuIGl0IHNlcnZlci1zaWRlLAorCQkgKiBldmVuIHRob3VnaCB0aGVyZSdzIGEgbWludXNjbGUgY2hhbmNlIGl0IG1pZ2h0IHN1Y2NlZWQuCisJCSAqIEVpdGhlciB3YXkgaXQncyBhIHZhbGlkIHJhY2UgdG8ganVzdCByZXR1cm4gLUVOT0VOVCBoZXJlLgorCQkgKi8KKwkJaWYgKCEob3Blbl9mbGFncyAmIE9fQ1JFQVQpKQorCQkJcmV0dXJuIC1FTk9FTlQ7CisKKwkJLyogT3RoZXJ3aXNlIHdlIGp1c3QgdW5oYXNoIGl0IHRvIGJlIHJlaGFzaGVkIGFmcmVzaCB2aWEKKwkJICogbG9va3VwIGlmIG5lY2Vzc2FyeQorCQkgKi8KKwkJZF9kcm9wKGRlbnRyeSk7CisJfQorCiAJaXQgPSBremFsbG9jKHNpemVvZigqaXQpLCBHRlBfTk9GUyk7CiAJaWYgKCFpdCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlpdC0+aXRfb3AgPSBJVF9PUEVOOwotCWlmIChvcGVuX2ZsYWdzICYgT19DUkVBVCkgeworCWlmIChvcGVuX2ZsYWdzICYgT19DUkVBVCkKIAkJaXQtPml0X29wIHw9IElUX0NSRUFUOwotCQlsb29rdXBfZmxhZ3MgfD0gTE9PS1VQX0NSRUFURTsKLQl9CiAJaXQtPml0X2NyZWF0ZV9tb2RlID0gKG1vZGUgJiBTX0lBTExVR08pIHwgU19JRlJFRzsKIAlpdC0+aXRfZmxhZ3MgPSAob3Blbl9mbGFncyAmIH5PX0FDQ01PREUpIHwgT1BFTl9GTU9ERShvcGVuX2ZsYWdzKTsKKwlpdC0+aXRfZmxhZ3MgJj0gfk1EU19PUEVOX0ZMX0lOVEVSTkFMOwogCiAJLyogRGVudHJ5IGFkZGVkIHRvIGRjYWNoZSB0cmVlIGluIGxsX2xvb2t1cF9pdCAqLwotCWRlID0gbGxfbG9va3VwX2l0KGRpciwgZGVudHJ5LCBpdCwgbG9va3VwX2ZsYWdzKTsKKwlkZSA9IGxsX2xvb2t1cF9pdChkaXIsIGRlbnRyeSwgaXQpOwogCWlmIChJU19FUlIoZGUpKQogCQlyYyA9IFBUUl9FUlIoZGUpOwogCWVsc2UgaWYgKGRlKQpAQCAtNjA5LDcgKzY5Nyw3IEBACiAJaWYgKCFyYykgewogCQlpZiAoaXRfZGlzcG9zaXRpb24oaXQsIERJU1BfT1BFTl9DUkVBVEUpKSB7CiAJCQkvKiBEZW50cnkgaW5zdGFudGlhdGVkIGluIGxsX2NyZWF0ZV9pdC4gKi8KLQkJCXJjID0gbGxfY3JlYXRlX2l0KGRpciwgZGVudHJ5LCBtb2RlLCBpdCk7CisJCQlyYyA9IGxsX2NyZWF0ZV9pdChkaXIsIGRlbnRyeSwgaXQpOwogCQkJaWYgKHJjKSB7CiAJCQkJLyogV2UgZGdldCBpbiBsbF9zcGxpY2VfYWxpYXMuICovCiAJCQkJaWYgKGRlKQpAQCAtNjk1LDcgKzc4Myw3IEBACiAgKiBJZiB0aGUgY3JlYXRlIHN1Y2NlZWRzLCB3ZSBmaWxsIGluIHRoZSBpbm9kZSBpbmZvcm1hdGlvbgogICogd2l0aCBkX2luc3RhbnRpYXRlKCkuCiAgKi8KLXN0YXRpYyBpbnQgbGxfY3JlYXRlX2l0KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAorc3RhdGljIGludCBsbF9jcmVhdGVfaXQoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJCXN0cnVjdCBsb29rdXBfaW50ZW50ICppdCkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwpAQCAtNzE2LDI3ICs4MDQsMjYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbGxfdXBkYXRlX3RpbWVzKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxdWVzdCwKLQkJCSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQordm9pZCBsbF91cGRhdGVfdGltZXMoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXF1ZXN0LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXN0cnVjdCBtZHRfYm9keSAqYm9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJnJlcXVlc3QtPnJxX3BpbGwsCiAJCQkJCQkgICAgICAgJlJNRl9NRFRfQk9EWSk7CiAKIAlMQVNTRVJUKGJvZHkpOwotCWlmIChib2R5LT52YWxpZCAmIE9CRF9NRF9GTE1USU1FICYmCi0JICAgIGJvZHktPm10aW1lID4gTFRJTUVfUyhpbm9kZS0+aV9tdGltZSkpIHsKKwlpZiAoYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0ZMTVRJTUUgJiYKKwkgICAgYm9keS0+bWJvX210aW1lID4gTFRJTUVfUyhpbm9kZS0+aV9tdGltZSkpIHsKIAkJQ0RFQlVHKERfSU5PREUsICJzZXR0aW5nIGZpZCAiREZJRCIgbXRpbWUgZnJvbSAlbHUgdG8gJWxsdVxuIiwKIAkJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSksIExUSU1FX1MoaW5vZGUtPmlfbXRpbWUpLAotCQkgICAgICAgYm9keS0+bXRpbWUpOwotCQlMVElNRV9TKGlub2RlLT5pX210aW1lKSA9IGJvZHktPm10aW1lOworCQkgICAgICAgYm9keS0+bWJvX210aW1lKTsKKwkJTFRJTUVfUyhpbm9kZS0+aV9tdGltZSkgPSBib2R5LT5tYm9fbXRpbWU7CiAJfQotCWlmIChib2R5LT52YWxpZCAmIE9CRF9NRF9GTENUSU1FICYmCi0JICAgIGJvZHktPmN0aW1lID4gTFRJTUVfUyhpbm9kZS0+aV9jdGltZSkpCi0JCUxUSU1FX1MoaW5vZGUtPmlfY3RpbWUpID0gYm9keS0+Y3RpbWU7CisJaWYgKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9GTENUSU1FICYmCisJICAgIGJvZHktPm1ib19jdGltZSA+IExUSU1FX1MoaW5vZGUtPmlfY3RpbWUpKQorCQlMVElNRV9TKGlub2RlLT5pX2N0aW1lKSA9IGJvZHktPm1ib19jdGltZTsKIH0KIAogc3RhdGljIGludCBsbF9uZXdfbm9kZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAotCQkgICAgICAgY29uc3QgY2hhciAqdGd0LCBpbnQgbW9kZSwgaW50IHJkZXYsCisJCSAgICAgICBjb25zdCBjaGFyICp0Z3QsIHVtb2RlX3QgbW9kZSwgaW50IHJkZXYsCiAJCSAgICAgICBfX3UzMiBvcGMpCiB7CiAJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXF1ZXN0ID0gTlVMTDsKQEAgLTc0OCw3ICs4MzUsNyBAQAogCiAJaWYgKHVubGlrZWx5KHRndCkpCiAJCXRndF9sZW4gPSBzdHJsZW4odGd0KSArIDE7Ci0KK2FnYWluOgogCW9wX2RhdGEgPSBsbF9wcmVwX21kX29wX2RhdGEoTlVMTCwgZGlyLCBOVUxMLAogCQkJCSAgICAgZGVudHJ5LT5kX25hbWUubmFtZSwKIAkJCQkgICAgIGRlbnRyeS0+ZF9uYW1lLmxlbiwKQEAgLTc2Myw5ICs4NTAsNDUgQEAKIAkJCWZyb21fa2dpZCgmaW5pdF91c2VyX25zLCBjdXJyZW50X2ZzZ2lkKCkpLAogCQkJY2ZzX2N1cnByb2NfY2FwX3BhY2soKSwgcmRldiwgJnJlcXVlc3QpOwogCWxsX2ZpbmlzaF9tZF9vcF9kYXRhKG9wX2RhdGEpOwotCWlmIChlcnIpCisJaWYgKGVyciA8IDAgJiYgZXJyICE9IC1FUkVNT1RFKQogCQlnb3RvIGVycl9leGl0OwogCisJLyoKKwkgKiBJZiB0aGUgY2xpZW50IGRvZXNuJ3Qga25vdyB3aGVyZSB0byBjcmVhdGUgYSBzdWJkaXJlY3RvcnkgKG9yCisJICogaW4gY2FzZSBvZiBhIHJhY2UgdGhhdCBzZW5kcyB0aGUgUlBDIHRvIHRoZSB3cm9uZyBNRFMpLCB0aGUKKwkgKiBNRFMgd2lsbCByZXR1cm4gLUVSRU1PVEUgYW5kIHRoZSBjbGllbnQgd2lsbCBmZXRjaCB0aGUgbGF5b3V0CisJICogb2YgdGhlIGRpcmVjdG9yeSwgdGhlbiBjcmVhdGUgdGhlIGRpcmVjdG9yeSBvbiB0aGUgcmlnaHQgTURULgorCSAqLworCWlmICh1bmxpa2VseShlcnIgPT0gLUVSRU1PVEUpKSB7CisJCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oZGlyKTsKKwkJc3RydWN0IGxtdl91c2VyX21kICpsdW07CisJCWludCBsdW1zaXplLCBlcnIyOworCisJCXB0bHJwY19yZXFfZmluaXNoZWQocmVxdWVzdCk7CisJCXJlcXVlc3QgPSBOVUxMOworCisJCWVycjIgPSBsbF9kaXJfZ2V0c3RyaXBlKGRpciwgKHZvaWQgKiopJmx1bSwgJmx1bXNpemUsICZyZXF1ZXN0LAorCQkJCQlPQkRfTURfREVGQVVMVF9NRUEpOworCQlpZiAoIWVycjIpIHsKKwkJCS8qIFVwZGF0ZSBzdHJpcGVfb2Zmc2V0IGFuZCByZXRyeSAqLworCQkJbGxpLT5sbGlfZGVmX3N0cmlwZV9vZmZzZXQgPSBsdW0tPmx1bV9zdHJpcGVfb2Zmc2V0OworCQl9IGVsc2UgaWYgKGVycjIgPT0gLUVOT0RBVEEgJiYKKwkJCSAgIGxsaS0+bGxpX2RlZl9zdHJpcGVfb2Zmc2V0ICE9IC0xKSB7CisJCQkvKgorCQkJICogSWYgdGhlcmUgYXJlIG5vIGRlZmF1bHQgc3RyaXBlIEVBIG9uIHRoZSBNRFQsIGJ1dCB0aGUKKwkJCSAqIGNsaWVudCBoYXMgZGVmYXVsdCBzdHJpcGUsIHRoZW4gaXQgcHJvYmFibHkgbWVhbnMKKwkJCSAqIGRlZmF1bHQgc3RyaXBlIEVBIGhhcyBqdXN0IGJlZW4gZGVsZXRlZC4KKwkJCSAqLworCQkJbGxpLT5sbGlfZGVmX3N0cmlwZV9vZmZzZXQgPSAtMTsKKwkJfSBlbHNlIHsKKwkJCWdvdG8gZXJyX2V4aXQ7CisJCX0KKworCQlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcXVlc3QpOworCQlyZXF1ZXN0ID0gTlVMTDsKKwkJZ290byBhZ2FpbjsKKwl9CisKIAlsbF91cGRhdGVfdGltZXMocmVxdWVzdCwgZGlyKTsKIAogCWVyciA9IGxsX3ByZXBfaW5vZGUoJmlub2RlLCByZXF1ZXN0LCBkaXItPmlfc2IsIE5VTEwpOwpAQCAtNzc0LDcgKzg5Nyw4IEBACiAKIAlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwogZXJyX2V4aXQ6Ci0JcHRscnBjX3JlcV9maW5pc2hlZChyZXF1ZXN0KTsKKwlpZiAocmVxdWVzdCkKKwkJcHRscnBjX3JlcV9maW5pc2hlZChyZXF1ZXN0KTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC04MzcsNzcgKzk2MSw2IEBACiAJcmV0dXJuIHJjOwogfQogCi1pbnQgbGxfb2JqZWN0c19kZXN0cm95KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxdWVzdCwgc3RydWN0IGlub2RlICpkaXIpCi17Ci0Jc3RydWN0IG1kdF9ib2R5ICpib2R5OwotCXN0cnVjdCBsb3ZfbWRzX21kICplYWRhdGE7Ci0Jc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSA9IE5VTEw7Ci0Jc3RydWN0IG9iZF90cmFuc19pbmZvIG90aSA9IHsgMCB9OwotCXN0cnVjdCBvYmRvICpvYTsKLQlpbnQgcmM7Ci0KLQkvKiByZXEgaXMgc3dhYmJlZCBzbyB0aGlzIGlzIHNhZmUgKi8KLQlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmcmVxdWVzdC0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7Ci0JaWYgKCEoYm9keS0+dmFsaWQgJiBPQkRfTURfRkxFQVNJWkUpKQotCQlyZXR1cm4gMDsKLQotCWlmIChib2R5LT5lYWRhdGFzaXplID09IDApIHsKLQkJQ0VSUk9SKCJPQkRfTURfRkxFQVNJWkUgc2V0IGJ1dCBlYWRhdGFzaXplIHplcm9cbiIpOwotCQlyYyA9IC1FUFJPVE87Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIFRoZSBNRFMgc2VudCBiYWNrIHRoZSBFQSBiZWNhdXNlIHdlIHVubGlua2VkIHRoZSBsYXN0IHJlZmVyZW5jZQotCSAqIHRvIHRoaXMgZmlsZS4gVXNlIHRoaXMgRUEgdG8gdW5saW5rIHRoZSBvYmplY3RzIG9uIHRoZSBPU1QuCi0JICogSXQncyBvcGFxdWUgc28gd2UgZG9uJ3Qgc3dhYiBoZXJlOyB3ZSBsZWF2ZSBpdCB0byBvYmRfdW5wYWNrbWQoKSB0bwotCSAqIGNoZWNrIGl0IGlzIGNvbXBsZXRlIGFuZCBzZW5zaWJsZS4KLQkgKi8KLQllYWRhdGEgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfc2l6ZWRfZ2V0KCZyZXF1ZXN0LT5ycV9waWxsLCAmUk1GX01EVF9NRCwKLQkJCQkJICAgICAgYm9keS0+ZWFkYXRhc2l6ZSk7Ci0JTEFTU0VSVChlYWRhdGEpOwotCi0JcmMgPSBvYmRfdW5wYWNrbWQobGxfaTJkdGV4cChkaXIpLCAmbHNtLCBlYWRhdGEsIGJvZHktPmVhZGF0YXNpemUpOwotCWlmIChyYyA8IDApIHsKLQkJQ0VSUk9SKCJvYmRfdW5wYWNrbWQ6ICVkXG4iLCByYyk7Ci0JCWdvdG8gb3V0OwotCX0KLQlMQVNTRVJUKHJjID49IHNpemVvZigqbHNtKSk7Ci0KLQlvYSA9IGttZW1fY2FjaGVfemFsbG9jKG9iZG9fY2FjaGVwLCBHRlBfTk9GUyk7Ci0JaWYgKCFvYSkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X2ZyZWVfbWVtbWQ7Ci0JfQotCi0Jb2EtPm9fb2kgPSBsc20tPmxzbV9vaTsKLQlvYS0+b19tb2RlID0gYm9keS0+bW9kZSAmIFNfSUZNVDsKLQlvYS0+b192YWxpZCA9IE9CRF9NRF9GTElEIHwgT0JEX01EX0ZMVFlQRSB8IE9CRF9NRF9GTEdST1VQOwotCi0JaWYgKGJvZHktPnZhbGlkICYgT0JEX01EX0ZMQ09PS0lFKSB7Ci0JCW9hLT5vX3ZhbGlkIHw9IE9CRF9NRF9GTENPT0tJRTsKLQkJb3RpLm90aV9sb2djb29raWVzID0KLQkJCXJlcV9jYXBzdWxlX3NlcnZlcl9zaXplZF9nZXQoJnJlcXVlc3QtPnJxX3BpbGwsCi0JCQkJCQkgICAgICZSTUZfTE9HQ09PS0lFUywKLQkJCQkJCSAgIHNpemVvZihzdHJ1Y3QgbGxvZ19jb29raWUpICoKLQkJCQkJCSAgICAgbHNtLT5sc21fc3RyaXBlX2NvdW50KTsKLQkJaWYgKCFvdGkub3RpX2xvZ2Nvb2tpZXMpIHsKLQkJCW9hLT5vX3ZhbGlkICY9IH5PQkRfTURfRkxDT09LSUU7Ci0JCQlib2R5LT52YWxpZCAmPSB+T0JEX01EX0ZMQ09PS0lFOwotCQl9Ci0JfQotCi0JcmMgPSBvYmRfZGVzdHJveShOVUxMLCBsbF9pMmR0ZXhwKGRpciksIG9hLCBsc20sICZvdGksCi0JCQkgbGxfaTJtZGV4cChkaXIpKTsKLQlpZiAocmMpCi0JCUNFUlJPUigib2JkIGRlc3Ryb3kgb2JqaWQgIkRPU1RJRCIgZXJyb3IgJWRcbiIsCi0JCSAgICAgICBQT1NUSUQoJmxzbS0+bHNtX29pKSwgcmMpOwotb3V0X2ZyZWVfbWVtbWQ6Ci0Jb2JkX2ZyZWVfbWVtbWQobGxfaTJkdGV4cChkaXIpLCAmbHNtKTsKLQlrbWVtX2NhY2hlX2ZyZWUob2Jkb19jYWNoZXAsIG9hKTsKLW91dDoKLQlyZXR1cm4gcmM7Ci19Ci0KIC8qIGxsX3VubGluaygpIGRvZXNuJ3QgdXBkYXRlIHRoZSBpbm9kZSB3aXRoIHRoZSBuZXcgbGluayBjb3VudC4KICAqIEluc3RlYWQsIGxsX2RkZWxldGUoKSBhbmQgbGxfZF9pcHV0KCkgd2lsbCB1cGRhdGUgaXQgYmFzZWQgdXBvbiBpZiB0aGVyZQogICogaXMgYW55IGxvY2sgZXhpc3RpbmcuIFRoZXkgd2lsbCByZWN5Y2xlIGRlbnRyaWVzIGFuZCBpbm9kZXMgYmFzZWQgdXBvbiBsb2NrcwpAQCAtOTI5LDcgKzk4Miw3IEBACiAJaWYgKElTX0VSUihvcF9kYXRhKSkKIAkJcmV0dXJuIFBUUl9FUlIob3BfZGF0YSk7CiAKLQlpZiAoZGNoaWxkICYmIGRjaGlsZC0+ZF9pbm9kZSkKKwlpZiAoZGNoaWxkLT5kX2lub2RlKQogCQlvcF9kYXRhLT5vcF9maWQzID0gKmxsX2lub2RlMmZpZChkY2hpbGQtPmRfaW5vZGUpOwogCiAJb3BfZGF0YS0+b3BfZmlkMiA9IG9wX2RhdGEtPm9wX2ZpZDM7CkBAIC05NDEsNyArOTk0LDYgQEAKIAlsbF91cGRhdGVfdGltZXMocmVxdWVzdCwgZGlyKTsKIAlsbF9zdGF0c19vcHNfdGFsbHkobGxfaTJzYmkoZGlyKSwgTFBST0NfTExfVU5MSU5LLCAxKTsKIAotCXJjID0gbGxfb2JqZWN0c19kZXN0cm95KHJlcXVlc3QsIGRpcik7CiAgb3V0OgogCXB0bHJwY19yZXFfZmluaXNoZWQocmVxdWVzdCk7CiAJcmV0dXJuIHJjOwpAQCAtOTU2LDkgKzEwMDgsOSBAQAogCiAJaWYgKCFJU19QT1NJWEFDTChkaXIpIHx8ICFleHBfY29ubmVjdF91bWFzayhsbF9pMm1kZXhwKGRpcikpKQogCQltb2RlICY9IH5jdXJyZW50X3VtYXNrKCk7Ci0JbW9kZSA9IChtb2RlICYgKFNfSVJXWFVHT3xTX0lTVlRYKSkgfCBTX0lGRElSOwotCWVyciA9IGxsX25ld19ub2RlKGRpciwgZGVudHJ5LCBOVUxMLCBtb2RlLCAwLCBMVVNUUkVfT1BDX01LRElSKTsKKwltb2RlID0gKG1vZGUgJiAoU19JUldYVUdPIHwgU19JU1ZUWCkpIHwgU19JRkRJUjsKIAorCWVyciA9IGxsX25ld19ub2RlKGRpciwgZGVudHJ5LCBOVUxMLCBtb2RlLCAwLCBMVVNUUkVfT1BDX01LRElSKTsKIAlpZiAoIWVycikKIAkJbGxfc3RhdHNfb3BzX3RhbGx5KGxsX2kyc2JpKGRpciksIExQUk9DX0xMX01LRElSLCAxKTsKIApAQCAtOTgxLDcgKzEwMzMsNyBAQAogCWlmIChJU19FUlIob3BfZGF0YSkpCiAJCXJldHVybiBQVFJfRVJSKG9wX2RhdGEpOwogCi0JaWYgKGRjaGlsZCAmJiBkY2hpbGQtPmRfaW5vZGUpCisJaWYgKGRjaGlsZC0+ZF9pbm9kZSkKIAkJb3BfZGF0YS0+b3BfZmlkMyA9ICpsbF9pbm9kZTJmaWQoZGNoaWxkLT5kX2lub2RlKTsKIAogCW9wX2RhdGEtPm9wX2ZpZDIgPSBvcF9kYXRhLT5vcF9maWQzOwpAQCAtMTA2Miw5ICsxMTE0LDkgQEAKIAlpZiAoSVNfRVJSKG9wX2RhdGEpKQogCQlyZXR1cm4gUFRSX0VSUihvcF9kYXRhKTsKIAotCWlmIChzcmNfZGNoaWxkICYmIHNyY19kY2hpbGQtPmRfaW5vZGUpCisJaWYgKHNyY19kY2hpbGQtPmRfaW5vZGUpCiAJCW9wX2RhdGEtPm9wX2ZpZDMgPSAqbGxfaW5vZGUyZmlkKHNyY19kY2hpbGQtPmRfaW5vZGUpOwotCWlmICh0Z3RfZGNoaWxkICYmIHRndF9kY2hpbGQtPmRfaW5vZGUpCisJaWYgKHRndF9kY2hpbGQtPmRfaW5vZGUpCiAJCW9wX2RhdGEtPm9wX2ZpZDQgPSAqbGxfaW5vZGUyZmlkKHRndF9kY2hpbGQtPmRfaW5vZGUpOwogCiAJZXJyID0gbWRfcmVuYW1lKHNiaS0+bGxfbWRfZXhwLCBvcF9kYXRhLApAQCAtMTA3Nyw3ICsxMTI5LDYgQEAKIAkJbGxfdXBkYXRlX3RpbWVzKHJlcXVlc3QsIHNyYyk7CiAJCWxsX3VwZGF0ZV90aW1lcyhyZXF1ZXN0LCB0Z3QpOwogCQlsbF9zdGF0c19vcHNfdGFsbHkoc2JpLCBMUFJPQ19MTF9SRU5BTUUsIDEpOwotCQllcnIgPSBsbF9vYmplY3RzX2Rlc3Ryb3kocmVxdWVzdCwgc3JjKTsKIAl9CiAKIAlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcXVlc3QpOwpAQCAtMTEwMSwxMCArMTE1MiwxMCBAQAogCS5zZXRhdHRyCSAgICA9IGxsX3NldGF0dHIsCiAJLmdldGF0dHIJICAgID0gbGxfZ2V0YXR0ciwKIAkucGVybWlzc2lvbgkgPSBsbF9pbm9kZV9wZXJtaXNzaW9uLAotCS5zZXR4YXR0cgkgICA9IGxsX3NldHhhdHRyLAotCS5nZXR4YXR0cgkgICA9IGxsX2dldHhhdHRyLAorCS5zZXR4YXR0cgkgICA9IGdlbmVyaWNfc2V0eGF0dHIsCisJLmdldHhhdHRyCSAgID0gZ2VuZXJpY19nZXR4YXR0ciwKIAkubGlzdHhhdHRyCSAgPSBsbF9saXN0eGF0dHIsCi0JLnJlbW92ZXhhdHRyCT0gbGxfcmVtb3ZleGF0dHIsCisJLnJlbW92ZXhhdHRyCT0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKIAkuZ2V0X2FjbAkgICAgPSBsbF9nZXRfYWNsLAogfTsKIApAQCAtMTExMiw5ICsxMTYzLDkgQEAKIAkuc2V0YXR0cgk9IGxsX3NldGF0dHIsCiAJLmdldGF0dHIJPSBsbF9nZXRhdHRyLAogCS5wZXJtaXNzaW9uICAgICA9IGxsX2lub2RlX3Blcm1pc3Npb24sCi0JLnNldHhhdHRyICAgICAgID0gbGxfc2V0eGF0dHIsCi0JLmdldHhhdHRyICAgICAgID0gbGxfZ2V0eGF0dHIsCisJLnNldHhhdHRyICAgICAgID0gZ2VuZXJpY19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIgICAgICAgPSBnZW5lcmljX2dldHhhdHRyLAogCS5saXN0eGF0dHIgICAgICA9IGxsX2xpc3R4YXR0ciwKLQkucmVtb3ZleGF0dHIgICAgPSBsbF9yZW1vdmV4YXR0ciwKKwkucmVtb3ZleGF0dHIgICAgPSBnZW5lcmljX3JlbW92ZXhhdHRyLAogCS5nZXRfYWNsCSAgICA9IGxsX2dldF9hY2wsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvcmFuZ2VfbG9jay5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvcmFuZ2VfbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YzgxOGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9yYW5nZV9sb2NrLmMKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisgKiBHUEwgSEVBREVSIFNUQVJUCisgKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LAorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZAorICogaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgSWYgbm90LCBzZWUKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyAqCisgKiBHUEwgSEVBREVSIEVORAorICovCisvKgorICogUmFuZ2UgbG9jayBpcyB1c2VkIHRvIGFsbG93IG11bHRpcGxlIHRocmVhZHMgd3JpdGluZyBhIHNpbmdsZSBzaGFyZWQKKyAqIGZpbGUgZ2l2ZW4gZWFjaCB0aHJlYWQgaXMgd3JpdGluZyB0byBhIG5vbi1vdmVybGFwcGluZyBwb3J0aW9uIG9mIHRoZQorICogZmlsZS4KKyAqCisgKiBSZWZlciB0byB0aGUgcG9zc2libGUgdXBzdHJlYW0ga2VybmVsIHZlcnNpb24gb2YgcmFuZ2UgbG9jayBieQorICogSmFuIEthcmEgPGphY2tAc3VzZS5jej46IGh0dHBzOi8vbGttbC5vcmcvbGttbC8yMDEzLzEvMzEvNDgwCisgKgorICogVGhpcyBmaWxlIGNvdWxkIGxhdGVyIHJlcGxhY2VkIGJ5IHRoZSB1cHN0cmVhbSBrZXJuZWwgdmVyc2lvbi4KKyAqLworLyoKKyAqIEF1dGhvcjogUHJha2FzaCBTdXJ5YSA8c3VyeWExQGxsbmwuZ292PgorICogQXV0aG9yOiBCb2JpIEphbSA8Ym9iaWphbS54dUBpbnRlbC5jb20+CisgKi8KKyNpbmNsdWRlICJyYW5nZV9sb2NrLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmUvbHVzdHJlX3VzZXIuaCIKKworLyoqCisgKiBJbml0aWFsaXplIGEgcmFuZ2UgbG9jayB0cmVlCisgKgorICogXHBhcmFtIHRyZWUgW2luXQlhbiBlbXB0eSByYW5nZSBsb2NrIHRyZWUKKyAqCisgKiBQcmU6ICBDYWxsZXIgc2hvdWxkIGhhdmUgYWxsb2NhdGVkIHRoZSByYW5nZSBsb2NrIHRyZWUuCisgKiBQb3N0OiBUaGUgcmFuZ2UgbG9jayB0cmVlIGlzIHJlYWR5IHRvIGZ1bmN0aW9uLgorICovCit2b2lkIHJhbmdlX2xvY2tfdHJlZV9pbml0KHN0cnVjdCByYW5nZV9sb2NrX3RyZWUgKnRyZWUpCit7CisJdHJlZS0+cmx0X3Jvb3QgPSBOVUxMOworCXRyZWUtPnJsdF9zZXF1ZW5jZSA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJnRyZWUtPnJsdF9sb2NrKTsKK30KKworLyoqCisgKiBJbml0aWFsaXplIGEgcmFuZ2UgbG9jayBub2RlCisgKgorICogXHBhcmFtIGxvY2sgIFtpbl0JYW4gZW1wdHkgcmFuZ2UgbG9jayBub2RlCisgKiBccGFyYW0gc3RhcnQgW2luXQlzdGFydCBvZiB0aGUgY292ZXJpbmcgcmVnaW9uCisgKiBccGFyYW0gZW5kICAgW2luXQllbmQgb2YgdGhlIGNvdmVyaW5nIHJlZ2lvbgorICoKKyAqIFByZTogIENhbGxlciBzaG91bGQgaGF2ZSBhbGxvY2F0ZWQgdGhlIHJhbmdlIGxvY2sgbm9kZS4KKyAqIFBvc3Q6IFRoZSByYW5nZSBsb2NrIG5vZGUgaXMgbWVhbnQgdG8gY292ZXIgW3N0YXJ0LCBlbmRdIHJlZ2lvbgorICovCit2b2lkIHJhbmdlX2xvY2tfaW5pdChzdHJ1Y3QgcmFuZ2VfbG9jayAqbG9jaywgX191NjQgc3RhcnQsIF9fdTY0IGVuZCkKK3sKKwltZW1zZXQoJmxvY2stPnJsX25vZGUsIDAsIHNpemVvZihsb2NrLT5ybF9ub2RlKSk7CisJaWYgKGVuZCAhPSBMVVNUUkVfRU9GKQorCQllbmQgPj49IFBBR0VfU0hJRlQ7CisJaW50ZXJ2YWxfc2V0KCZsb2NrLT5ybF9ub2RlLCBzdGFydCA+PiBQQUdFX1NISUZULCBlbmQpOworCUlOSVRfTElTVF9IRUFEKCZsb2NrLT5ybF9uZXh0X2xvY2spOworCWxvY2stPnJsX3Rhc2sgPSBOVUxMOworCWxvY2stPnJsX2xvY2tfY291bnQgPSAwOworCWxvY2stPnJsX2Jsb2NraW5nX3JhbmdlcyA9IDA7CisJbG9jay0+cmxfc2VxdWVuY2UgPSAwOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCByYW5nZV9sb2NrICpuZXh0X2xvY2soc3RydWN0IHJhbmdlX2xvY2sgKmxvY2spCit7CisJcmV0dXJuIGxpc3RfZW50cnkobG9jay0+cmxfbmV4dF9sb2NrLm5leHQsIHR5cGVvZigqbG9jayksIHJsX25leHRfbG9jayk7Cit9CisKKy8qKgorICogSGVscGVyIGZ1bmN0aW9uIG9mIHJhbmdlX3VubG9jaygpCisgKgorICogXHBhcmFtIG5vZGUgW2luXQlhIHJhbmdlIGxvY2sgZm91bmQgb3ZlcmxhcHBlZCBkdXJpbmcgaW50ZXJ2YWwgbm9kZQorICoJCQlzZWFyY2gKKyAqIFxwYXJhbSBhcmcgW2luXQl0aGUgcmFuZ2UgbG9jayB0byBiZSB0ZXN0ZWQKKyAqCisgKiBccmV0dmFsIElOVEVSVkFMX0lURVJfQ09OVAlpbmRpY2F0ZSB0byBjb250aW51ZSB0aGUgc2VhcmNoIGZvciBuZXh0CisgKgkJCQlvdmVybGFwcGluZyByYW5nZSBub2RlCisgKiBccmV0dmFsIElOVEVSVkFMX0lURVJfU1RPUAlpbmRpY2F0ZSB0byBzdG9wIHRoZSBzZWFyY2gKKyAqLworc3RhdGljIGVudW0gaW50ZXJ2YWxfaXRlciByYW5nZV91bmxvY2tfY2Ioc3RydWN0IGludGVydmFsX25vZGUgKm5vZGUsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcmFuZ2VfbG9jayAqbG9jayA9IGFyZzsKKwlzdHJ1Y3QgcmFuZ2VfbG9jayAqb3ZlcmxhcCA9IG5vZGUycmFuZ2Vsb2NrKG5vZGUpOworCXN0cnVjdCByYW5nZV9sb2NrICppdGVyOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpdGVyLCAmb3ZlcmxhcC0+cmxfbmV4dF9sb2NrLCBybF9uZXh0X2xvY2spIHsKKwkJaWYgKGl0ZXItPnJsX3NlcXVlbmNlID4gbG9jay0+cmxfc2VxdWVuY2UpIHsKKwkJCS0taXRlci0+cmxfYmxvY2tpbmdfcmFuZ2VzOworCQkJTEFTU0VSVChpdGVyLT5ybF9ibG9ja2luZ19yYW5nZXMgPiAwKTsKKwkJfQorCX0KKwlpZiAob3ZlcmxhcC0+cmxfc2VxdWVuY2UgPiBsb2NrLT5ybF9zZXF1ZW5jZSkgeworCQktLW92ZXJsYXAtPnJsX2Jsb2NraW5nX3JhbmdlczsKKwkJaWYgKG92ZXJsYXAtPnJsX2Jsb2NraW5nX3JhbmdlcyA9PSAwKQorCQkJd2FrZV91cF9wcm9jZXNzKG92ZXJsYXAtPnJsX3Rhc2spOworCX0KKwlyZXR1cm4gSU5URVJWQUxfSVRFUl9DT05UOworfQorCisvKioKKyAqIFVubG9jayBhIHJhbmdlIGxvY2ssIHdha2UgdXAgbG9ja3MgYmxvY2tlZCBieSB0aGlzIGxvY2suCisgKgorICogXHBhcmFtIHRyZWUgW2luXQlyYW5nZSBsb2NrIHRyZWUKKyAqIFxwYXJhbSBsb2NrIFtpbl0JcmFuZ2UgbG9jayB0byBiZSBkZWxldGVkCisgKgorICogSWYgdGhpcyBsb2NrIGhhcyBiZWVuIGdyYW50ZWQsIHJlbGFzZSBpdDsgaWYgbm90LCBqdXN0IGRlbGV0ZSBpdCBmcm9tCisgKiB0aGUgdHJlZSBvciB0aGUgc2FtZSByZWdpb24gbG9jayBsaXN0LiBXYWtlIHVwIHRob3NlIGxvY2tzIG9ubHkgYmxvY2tlZAorICogYnkgdGhpcyBsb2NrIHRocm91Z2ggcmFuZ2VfdW5sb2NrX2NiKCkuCisgKi8KK3ZvaWQgcmFuZ2VfdW5sb2NrKHN0cnVjdCByYW5nZV9sb2NrX3RyZWUgKnRyZWUsIHN0cnVjdCByYW5nZV9sb2NrICpsb2NrKQoreworCXNwaW5fbG9jaygmdHJlZS0+cmx0X2xvY2spOworCWlmICghbGlzdF9lbXB0eSgmbG9jay0+cmxfbmV4dF9sb2NrKSkgeworCQlzdHJ1Y3QgcmFuZ2VfbG9jayAqbmV4dDsKKworCQlpZiAoaW50ZXJ2YWxfaXNfaW50cmVlKCZsb2NrLT5ybF9ub2RlKSkgeyAvKiBmaXJzdCBsb2NrICovCisJCQkvKiBJbnNlcnQgdGhlIG5leHQgc2FtZSByYW5nZSBsb2NrIGludG8gdGhlIHRyZWUgKi8KKwkJCW5leHQgPSBuZXh0X2xvY2sobG9jayk7CisJCQluZXh0LT5ybF9sb2NrX2NvdW50ID0gbG9jay0+cmxfbG9ja19jb3VudCAtIDE7CisJCQlpbnRlcnZhbF9lcmFzZSgmbG9jay0+cmxfbm9kZSwgJnRyZWUtPnJsdF9yb290KTsKKwkJCWludGVydmFsX2luc2VydCgmbmV4dC0+cmxfbm9kZSwgJnRyZWUtPnJsdF9yb290KTsKKwkJfSBlbHNlIHsKKwkJCS8qIGZpbmQgdGhlIGZpcnN0IGxvY2sgaW4gdHJlZSAqLworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShuZXh0LCAmbG9jay0+cmxfbmV4dF9sb2NrLAorCQkJCQkgICAgcmxfbmV4dF9sb2NrKSB7CisJCQkJaWYgKCFpbnRlcnZhbF9pc19pbnRyZWUoJm5leHQtPnJsX25vZGUpKQorCQkJCQljb250aW51ZTsKKworCQkJCUxBU1NFUlQobmV4dC0+cmxfbG9ja19jb3VudCA+IDApOworCQkJCW5leHQtPnJsX2xvY2tfY291bnQtLTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlsaXN0X2RlbF9pbml0KCZsb2NrLT5ybF9uZXh0X2xvY2spOworCX0gZWxzZSB7CisJCUxBU1NFUlQoaW50ZXJ2YWxfaXNfaW50cmVlKCZsb2NrLT5ybF9ub2RlKSk7CisJCWludGVydmFsX2VyYXNlKCZsb2NrLT5ybF9ub2RlLCAmdHJlZS0+cmx0X3Jvb3QpOworCX0KKworCWludGVydmFsX3NlYXJjaCh0cmVlLT5ybHRfcm9vdCwgJmxvY2stPnJsX25vZGUuaW5fZXh0ZW50LAorCQkJcmFuZ2VfdW5sb2NrX2NiLCBsb2NrKTsKKwlzcGluX3VubG9jaygmdHJlZS0+cmx0X2xvY2spOworfQorCisvKioKKyAqIEhlbHBlciBmdW5jdGlvbiBvZiByYW5nZV9sb2NrKCkKKyAqCisgKiBccGFyYW0gbm9kZSBbaW5dCWEgcmFuZ2UgbG9jayBmb3VuZCBvdmVybGFwcGVkIGR1cmluZyBpbnRlcnZhbCBub2RlCisgKgkJCXNlYXJjaAorICogXHBhcmFtIGFyZyBbaW5dCXRoZSByYW5nZSBsb2NrIHRvIGJlIHRlc3RlZAorICoKKyAqIFxyZXR2YWwgSU5URVJWQUxfSVRFUl9DT05UCWluZGljYXRlIHRvIGNvbnRpbnVlIHRoZSBzZWFyY2ggZm9yIG5leHQKKyAqCQkJCW92ZXJsYXBwaW5nIHJhbmdlIG5vZGUKKyAqIFxyZXR2YWwgSU5URVJWQUxfSVRFUl9TVE9QCWluZGljYXRlIHRvIHN0b3AgdGhlIHNlYXJjaAorICovCitzdGF0aWMgZW51bSBpbnRlcnZhbF9pdGVyIHJhbmdlX2xvY2tfY2Ioc3RydWN0IGludGVydmFsX25vZGUgKm5vZGUsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcmFuZ2VfbG9jayAqbG9jayA9IChzdHJ1Y3QgcmFuZ2VfbG9jayAqKWFyZzsKKwlzdHJ1Y3QgcmFuZ2VfbG9jayAqb3ZlcmxhcCA9IG5vZGUycmFuZ2Vsb2NrKG5vZGUpOworCisJbG9jay0+cmxfYmxvY2tpbmdfcmFuZ2VzICs9IG92ZXJsYXAtPnJsX2xvY2tfY291bnQgKyAxOworCXJldHVybiBJTlRFUlZBTF9JVEVSX0NPTlQ7Cit9CisKKy8qKgorICogTG9jayBhIHJlZ2lvbgorICoKKyAqIFxwYXJhbSB0cmVlIFtpbl0JcmFuZ2UgbG9jayB0cmVlCisgKiBccGFyYW0gbG9jayBbaW5dCXJhbmdlIGxvY2sgbm9kZSBjb250YWluaW5nIHRoZSByZWdpb24gc3BhbgorICoKKyAqIFxyZXR2YWwgMAlnZXQgdGhlIHJhbmdlIGxvY2sKKyAqIFxyZXR2YWwgPDAJZXJyb3IgY29kZSB3aGlsZSBub3QgZ2V0dGluZyB0aGUgcmFuZ2UgbG9jaworICoKKyAqIElmIHRoZXJlIGV4aXN0cyBvdmVybGFwcGluZyByYW5nZSBsb2NrLCB0aGUgbmV3IGxvY2sgd2lsbCB3YWl0IGFuZAorICogcmV0cnksIGlmIGxhdGVyIGl0IGZpbmQgdGhhdCBpdCBpcyBub3QgdGhlIGNob3NlbiBvbmUgdG8gd2FrZSB1cCwKKyAqIGl0IHdhaXQgYWdhaW4uCisgKi8KK2ludCByYW5nZV9sb2NrKHN0cnVjdCByYW5nZV9sb2NrX3RyZWUgKnRyZWUsIHN0cnVjdCByYW5nZV9sb2NrICpsb2NrKQoreworCXN0cnVjdCBpbnRlcnZhbF9ub2RlICpub2RlOworCWludCByYyA9IDA7CisKKwlzcGluX2xvY2soJnRyZWUtPnJsdF9sb2NrKTsKKwkvKgorCSAqIFdlIG5lZWQgdG8gY2hlY2sgZm9yIGFsbCBjb25mbGljdGluZyBpbnRlcnZhbHMKKwkgKiBhbHJlYWR5IGluIHRoZSB0cmVlLgorCSAqLworCWludGVydmFsX3NlYXJjaCh0cmVlLT5ybHRfcm9vdCwgJmxvY2stPnJsX25vZGUuaW5fZXh0ZW50LAorCQkJcmFuZ2VfbG9ja19jYiwgbG9jayk7CisJLyoKKwkgKiBJbnNlcnQgdG8gdGhlIHRyZWUgaWYgSSBhbSB1bmlxdWUsIG90aGVyd2lzZSBJJ3ZlIGJlZW4gbGlua2VkIHRvCisJICogdGhlIHJsX25leHRfbG9jayBvZiBhbm90aGVyIGxvY2sgd2hpY2ggaGFzIHRoZSBzYW1lIHJhbmdlIGFzIG1pbmUKKwkgKiBpbiByYW5nZV9sb2NrX2NiKCkuCisJICovCisJbm9kZSA9IGludGVydmFsX2luc2VydCgmbG9jay0+cmxfbm9kZSwgJnRyZWUtPnJsdF9yb290KTsKKwlpZiAobm9kZSkgeworCQlzdHJ1Y3QgcmFuZ2VfbG9jayAqdG1wID0gbm9kZTJyYW5nZWxvY2sobm9kZSk7CisKKwkJbGlzdF9hZGRfdGFpbCgmbG9jay0+cmxfbmV4dF9sb2NrLCAmdG1wLT5ybF9uZXh0X2xvY2spOworCQl0bXAtPnJsX2xvY2tfY291bnQrKzsKKwl9CisJbG9jay0+cmxfc2VxdWVuY2UgPSArK3RyZWUtPnJsdF9zZXF1ZW5jZTsKKworCXdoaWxlIChsb2NrLT5ybF9ibG9ja2luZ19yYW5nZXMgPiAwKSB7CisJCWxvY2stPnJsX3Rhc2sgPSBjdXJyZW50OworCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrKCZ0cmVlLT5ybHRfbG9jayk7CisJCXNjaGVkdWxlKCk7CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyYW5nZV91bmxvY2sodHJlZSwgbG9jayk7CisJCQlyYyA9IC1FSU5UUjsKKwkJCWdvdG8gb3V0OworCQl9CisJCXNwaW5fbG9jaygmdHJlZS0+cmx0X2xvY2spOworCX0KKwlzcGluX3VubG9jaygmdHJlZS0+cmx0X2xvY2spOworb3V0OgorCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3JhbmdlX2xvY2suaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3JhbmdlX2xvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmQwNGE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvcmFuZ2VfbG9jay5oCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBHUEwgSEVBREVSIFNUQVJUCisgKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LAorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZAorICogaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgSWYgbm90LCBzZWUKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyAqCisgKiBHUEwgSEVBREVSIEVORAorICovCisvKgorICogUmFuZ2UgbG9jayBpcyB1c2VkIHRvIGFsbG93IG11bHRpcGxlIHRocmVhZHMgd3JpdGluZyBhIHNpbmdsZSBzaGFyZWQKKyAqIGZpbGUgZ2l2ZW4gZWFjaCB0aHJlYWQgaXMgd3JpdGluZyB0byBhIG5vbi1vdmVybGFwcGluZyBwb3J0aW9uIG9mIHRoZQorICogZmlsZS4KKyAqCisgKiBSZWZlciB0byB0aGUgcG9zc2libGUgdXBzdHJlYW0ga2VybmVsIHZlcnNpb24gb2YgcmFuZ2UgbG9jayBieQorICogSmFuIEthcmEgPGphY2tAc3VzZS5jej46IGh0dHBzOi8vbGttbC5vcmcvbGttbC8yMDEzLzEvMzEvNDgwCisgKgorICogVGhpcyBmaWxlIGNvdWxkIGxhdGVyIHJlcGxhY2VkIGJ5IHRoZSB1cHN0cmVhbSBrZXJuZWwgdmVyc2lvbi4KKyAqLworLyoKKyAqIEF1dGhvcjogUHJha2FzaCBTdXJ5YSA8c3VyeWExQGxsbmwuZ292PgorICogQXV0aG9yOiBCb2JpIEphbSA8Ym9iaWphbS54dUBpbnRlbC5jb20+CisgKi8KKyNpZm5kZWYgX1JBTkdFX0xPQ0tfSAorI2RlZmluZSBfUkFOR0VfTE9DS19ICisKKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnMuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2ludGVydmFsX3RyZWUuaCIKKworc3RydWN0IHJhbmdlX2xvY2sgeworCXN0cnVjdCBpbnRlcnZhbF9ub2RlCXJsX25vZGU7CisJLyoqCisJICogUHJvY2VzcyB0byBlbnF1ZXVlIHRoaXMgbG9jay4KKwkgKi8KKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnJsX3Rhc2s7CisJLyoqCisJICogTGlzdCBvZiBsb2NrcyB3aXRoIHRoZSBzYW1lIHJhbmdlLgorCSAqLworCXN0cnVjdCBsaXN0X2hlYWQJcmxfbmV4dF9sb2NrOworCS8qKgorCSAqIE51bWJlciBvZiBsb2NrcyBpbiB0aGUgbGlzdCBybF9uZXh0X2xvY2sKKwkgKi8KKwl1bnNpZ25lZCBpbnQJCXJsX2xvY2tfY291bnQ7CisJLyoqCisJICogTnVtYmVyIG9mIHJhbmdlcyB3aGljaCBhcmUgYmxvY2tpbmcgYWNxdWlzaXRpb24gb2YgdGhlIGxvY2sKKwkgKi8KKwl1bnNpZ25lZCBpbnQJCXJsX2Jsb2NraW5nX3JhbmdlczsKKwkvKioKKwkgKiBTZXF1ZW5jZSBudW1iZXIgb2YgcmFuZ2UgbG9jay4gVGhpcyBudW1iZXIgaXMgdXNlZCB0byBnZXQgdG8ga25vdworCSAqIHRoZSBvcmRlciB0aGUgbG9ja3MgYXJlIHF1ZXVlZDsgdGhpcyBpcyByZXF1aXJlZCBmb3IgcmFuZ2VfY2FuY2VsKCkuCisJICovCisJX191NjQJCQlybF9zZXF1ZW5jZTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJhbmdlX2xvY2sgKm5vZGUycmFuZ2Vsb2NrKGNvbnN0IHN0cnVjdCBpbnRlcnZhbF9ub2RlICpuKQoreworCXJldHVybiBjb250YWluZXJfb2Yobiwgc3RydWN0IHJhbmdlX2xvY2ssIHJsX25vZGUpOworfQorCitzdHJ1Y3QgcmFuZ2VfbG9ja190cmVlIHsKKwlzdHJ1Y3QgaW50ZXJ2YWxfbm9kZQkqcmx0X3Jvb3Q7CisJc3BpbmxvY2tfdAkJIHJsdF9sb2NrOwkvKiBwcm90ZWN0IHJhbmdlIGxvY2sgdHJlZSAqLworCV9fdTY0CQkJIHJsdF9zZXF1ZW5jZTsKK307CisKK3ZvaWQgcmFuZ2VfbG9ja190cmVlX2luaXQoc3RydWN0IHJhbmdlX2xvY2tfdHJlZSAqdHJlZSk7Cit2b2lkIHJhbmdlX2xvY2tfaW5pdChzdHJ1Y3QgcmFuZ2VfbG9jayAqbG9jaywgX191NjQgc3RhcnQsIF9fdTY0IGVuZCk7CitpbnQgIHJhbmdlX2xvY2soc3RydWN0IHJhbmdlX2xvY2tfdHJlZSAqdHJlZSwgc3RydWN0IHJhbmdlX2xvY2sgKmxvY2spOwordm9pZCByYW5nZV91bmxvY2soc3RydWN0IHJhbmdlX2xvY2tfdHJlZSAqdHJlZSwgc3RydWN0IHJhbmdlX2xvY2sgKmxvY2spOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9ydy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvcncuYwppbmRleCA4NzM5M2M0Li41MGMwMTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9ydy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3J3LmMKQEAgLTUwLDEwICs1MCw4IEBACiAKICNkZWZpbmUgREVCVUdfU1VCU1lTVEVNIFNfTExJVEUKIAotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZF9ja3N1bS5oIgogI2luY2x1ZGUgImxsaXRlX2ludGVybmFsLmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9saW51eC9sdXN0cmVfY29tcGF0MjUuaCIKIAogc3RhdGljIHZvaWQgbGxfcmFfc3RhdHNfaW5jX3NiaShzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpLCBlbnVtIHJhX3N0YXQgd2hpY2gpOwogCkBAIC00MTMsNyArNDExLDcgQEAKIAkJCSAqIGZvcndhcmQgcmVhZC1haGVhZCwgaXQgd2lsbCBiZSBmaXhlZCB3aGVuIGJhY2t3YXJkCiAJCQkgKiByZWFkLWFoZWFkIGlzIGltcGxlbWVudGVkCiAJCQkgKi8KLQkJCUxBU1NFUlRGKHBhZ2VfaWR4ID4gcmlhLT5yaWFfc3RvZmYsICJJbnZhbGlkIHBhZ2VfaWR4ICVsdSBycyAlbHUgcmUgJWx1IHJvICVsdSBybCAlbHUgcnAgJWx1XG4iLAorCQkJTEFTU0VSVEYocGFnZV9pZHggPj0gcmlhLT5yaWFfc3RvZmYsICJJbnZhbGlkIHBhZ2VfaWR4ICVsdSBycyAlbHUgcmUgJWx1IHJvICVsdSBybCAlbHUgcnAgJWx1XG4iLAogCQkJCSBwYWdlX2lkeCwKIAkJCQkgcmlhLT5yaWFfc3RhcnQsIHJpYS0+cmlhX2VuZCwgcmlhLT5yaWFfc3RvZmYsCiAJCQkJIHJpYS0+cmlhX2xlbmd0aCwgcmlhLT5yaWFfcGFnZXMpOwpAQCAtNDc0LDEwICs0NzIsMjIgQEAKIAl9CiAKIAkvKiBSZXNlcnZlIGEgcGFydCBvZiB0aGUgcmVhZC1haGVhZCB3aW5kb3cgdGhhdCB3ZSdsbCBiZSBpc3N1aW5nICovCi0JaWYgKHJhcy0+cmFzX3dpbmRvd19sZW4pIHsKLQkJc3RhcnQgPSByYXMtPnJhc19uZXh0X3JlYWRhaGVhZDsKKwlpZiAocmFzLT5yYXNfd2luZG93X2xlbiA+IDApIHsKKwkJLyoKKwkJICogTm90ZTogb3RoZXIgdGhyZWFkIG1pZ2h0IHJvbGxiYWNrIHRoZSByYXNfbmV4dF9yZWFkYWhlYWQsCisJCSAqIGlmIGl0IGNhbiBub3QgZ2V0IHRoZSBmdWxsIHNpemUgb2YgcHJlcGFyZWQgcGFnZXMsIHNlZSB0aGUKKwkJICogZW5kIG9mIHRoaXMgZnVuY3Rpb24uIEZvciBzdHJpZGUgcmVhZCBhaGVhZCwgaXQgbmVlZHMgdG8KKwkJICogbWFrZSBzdXJlIHRoZSBvZmZzZXQgaXMgbm8gbGVzcyB0aGFuIHJhc19zdHJpZGVfb2Zmc2V0LAorCQkgKiBzbyB0aGF0IHN0cmlkZSByZWFkIGFoZWFkIGNhbiB3b3JrIGNvcnJlY3RseS4KKwkJICovCisJCWlmIChzdHJpZGVfaW9fbW9kZShyYXMpKQorCQkJc3RhcnQgPSBtYXgocmFzLT5yYXNfbmV4dF9yZWFkYWhlYWQsCisJCQkJICAgIHJhcy0+cmFzX3N0cmlkZV9vZmZzZXQpOworCQllbHNlCisJCQlzdGFydCA9IHJhcy0+cmFzX25leHRfcmVhZGFoZWFkOwogCQllbmQgPSByYXMtPnJhc193aW5kb3dfc3RhcnQgKyByYXMtPnJhc193aW5kb3dfbGVuIC0gMTsKIAl9CisKIAlpZiAoZW5kICE9IDApIHsKIAkJdW5zaWduZWQgbG9uZyBycGNfYm91bmRhcnk7CiAJCS8qCkBAIC02NDgsMTAgKzY1OCwxMSBAQAogewogCXVuc2lnbmVkIGxvbmcgc3RyaWRlX2dhcCA9IGluZGV4IC0gcmFzLT5yYXNfbGFzdF9yZWFkcGFnZSAtIDE7CiAKLQlpZiAoIXN0cmlkZV9pb19tb2RlKHJhcykgJiYgKHN0cmlkZV9nYXAgIT0gMCB8fAotCSAgICByYXMtPnJhc19jb25zZWN1dGl2ZV9zdHJpZGVfcmVxdWVzdHMgPT0gMCkpIHsKKwlpZiAoKHN0cmlkZV9nYXAgIT0gMCB8fCByYXMtPnJhc19jb25zZWN1dGl2ZV9zdHJpZGVfcmVxdWVzdHMgPT0gMCkgJiYKKwkgICAgIXN0cmlkZV9pb19tb2RlKHJhcykpIHsKIAkJcmFzLT5yYXNfc3RyaWRlX3BhZ2VzID0gcmFzLT5yYXNfY29uc2VjdXRpdmVfcGFnZXM7Ci0JCXJhcy0+cmFzX3N0cmlkZV9sZW5ndGggPSBzdHJpZGVfZ2FwK3Jhcy0+cmFzX2NvbnNlY3V0aXZlX3BhZ2VzOworCQlyYXMtPnJhc19zdHJpZGVfbGVuZ3RoID0gcmFzLT5yYXNfY29uc2VjdXRpdmVfcGFnZXMgKworCQkJCQkgc3RyaWRlX2dhcDsKIAl9CiAJTEFTU0VSVChyYXMtPnJhc19yZXF1ZXN0X2luZGV4ID09IDApOwogCUxBU1NFUlQocmFzLT5yYXNfY29uc2VjdXRpdmVfc3RyaWRlX3JlcXVlc3RzID09IDApOwpAQCAtNjYzLDEwICs2NzQsOSBAQAogCX0KIAogCXJhcy0+cmFzX3N0cmlkZV9wYWdlcyA9IHJhcy0+cmFzX2NvbnNlY3V0aXZlX3BhZ2VzOwotCXJhcy0+cmFzX3N0cmlkZV9sZW5ndGggPSBzdHJpZGVfZ2FwK3Jhcy0+cmFzX2NvbnNlY3V0aXZlX3BhZ2VzOworCXJhcy0+cmFzX3N0cmlkZV9sZW5ndGggPSBzdHJpZGVfZ2FwICsgcmFzLT5yYXNfY29uc2VjdXRpdmVfcGFnZXM7CiAKIAlSQVNfQ0RFQlVHKHJhcyk7Ci0JcmV0dXJuOwogfQogCiAvKiBTdHJpZGUgUmVhZC1haGVhZCB3aW5kb3cgd2lsbCBiZSBpbmNyZWFzZWQgaW5jX2xlbiBhY2NvcmRpbmcgdG8KQEAgLTg4Miw3ICs4OTIsNiBAQAogCVJBU19DREVCVUcocmFzKTsKIAlyYXMtPnJhc19yZXF1ZXN0X2luZGV4Kys7CiAJc3Bpbl91bmxvY2soJnJhcy0+cmFzX2xvY2spOwotCXJldHVybjsKIH0KIAogaW50IGxsX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqdm1wYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKQEAgLTEwMTUsMTEgKzEwMjQsMTUgQEAKIAkJICogaXMgY2FsbGVkIGxhdGVyIG9uLgogCQkgKi8KIAkJaWdub3JlX2xheW91dCA9IDE7CisKKwlpZiAoIWxsX2kyaW5mbyhpbm9kZSktPmxsaV9jbG9iKQorCQlyZXR1cm4gMDsKKwogCXJlc3VsdCA9IGNsX3N5bmNfZmlsZV9yYW5nZShpbm9kZSwgc3RhcnQsIGVuZCwgbW9kZSwgaWdub3JlX2xheW91dCk7CiAJaWYgKHJlc3VsdCA+IDApIHsKIAkJd2JjLT5ucl90b193cml0ZSAtPSByZXN1bHQ7CiAJCXJlc3VsdCA9IDA7Ci0JIH0KKwl9CiAKIAlpZiAod2JjLT5yYW5nZV9jeWNsaWMgfHwgKHJhbmdlX3dob2xlICYmIHdiYy0+bnJfdG9fd3JpdGUgPiAwKSkgewogCQlpZiAoZW5kID09IE9CRF9PQkpFQ1RfRU9GKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvcncyNi5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvcncyNi5jCmluZGV4IGQ5OGM3YWMuLjI2ZjNhMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3J3MjYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9ydzI2LmMKQEAgLTUxLDkgKzUxLDcgQEAKIAogI2RlZmluZSBERUJVR19TVUJTWVNURU0gU19MTElURQogCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIgogI2luY2x1ZGUgImxsaXRlX2ludGVybmFsLmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9saW51eC9sdXN0cmVfY29tcGF0MjUuaCIKIAogLyoqCiAgKiBJbXBsZW1lbnRzIExpbnV4IFZNIGFkZHJlc3Nfc3BhY2U6OmludmFsaWRhdGVwYWdlKCkgbWV0aG9kLiBUaGlzIG1ldGhvZCBpcwpAQCAtMTYxLDcgKzE1OSw3IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotI2RlZmluZSBNQVhfRElSRUNUSU9fU0laRSAoMioxMDI0KjEwMjQqMTAyNFVMKQorI2RlZmluZSBNQVhfRElSRUNUSU9fU0laRSAoMiAqIDEwMjQgKiAxMDI0ICogMTAyNFVMKQogCiBzdGF0aWMgaW5saW5lIGludCBsbF9nZXRfdXNlcl9wYWdlcyhpbnQgcncsIHVuc2lnbmVkIGxvbmcgdXNlcl9hZGRyLAogCQkJCSAgICBzaXplX3Qgc2l6ZSwgc3RydWN0IHBhZ2UgKioqcGFnZXMsCkBAIC0yMTQsMTAgKzIxMiwxMCBAQAogCWludCBpOwogCXNzaXplX3QgcmMgPSAwOwogCWxvZmZfdCBmaWxlX29mZnNldCAgPSBwdi0+bGRwX3N0YXJ0X29mZnNldDsKLQlsb25nIHNpemUJICAgPSBwdi0+bGRwX3NpemU7CisJc2l6ZV90IHNpemUgPSBwdi0+bGRwX3NpemU7CiAJaW50IHBhZ2VfY291bnQgICAgICA9IHB2LT5sZHBfbnI7CiAJc3RydWN0IHBhZ2UgKipwYWdlcyA9IHB2LT5sZHBfcGFnZXM7Ci0JbG9uZyBwYWdlX3NpemUgICAgICA9IGNsX3BhZ2Vfc2l6ZShvYmopOworCXNpemVfdCBwYWdlX3NpemUgPSBjbF9wYWdlX3NpemUob2JqKTsKIAlib29sIGRvX2lvOwogCWludCAgaW9fcGFnZXMgICAgICAgPSAwOwogCkBAIC0zNDYsNyArMzQ0LDYgQEAKIAlzdHJ1Y3QgY2xfaW8gKmlvOwogCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OwotCXN0cnVjdCB2dnBfb2JqZWN0ICpvYmogPSBjbF9pbm9kZTJ2dnAoaW5vZGUpOwogCWxvZmZfdCBmaWxlX29mZnNldCA9IGlvY2ItPmtpX3BvczsKIAlzc2l6ZV90IGNvdW50ID0gaW92X2l0ZXJfY291bnQoaXRlcik7CiAJc3NpemVfdCB0b3RfYnl0ZXMgPSAwLCByZXN1bHQgPSAwOwpAQCAtMzc1LDE0ICszNzIsNiBAQAogCWlvID0gdnZwX2Vudl9pbyhlbnYpLT52dWlfY2wuY2lzX2lvOwogCUxBU1NFUlQoaW8pOwogCi0JLyogMC4gTmVlZCBsb2NraW5nIGJldHdlZW4gYnVmZmVyZWQgYW5kIGRpcmVjdCBhY2Nlc3MuIGFuZCByYWNlIHdpdGgKLQkgKiAgICBzaXplIGNoYW5naW5nIGJ5IGNvbmN1cnJlbnQgdHJ1bmNhdGVzIGFuZCB3cml0ZXMuCi0JICogMS4gTmVlZCBpbm9kZSBtdXRleCB0byBvcGVyYXRlIHRyYW5zaWVudCBwYWdlcy4KLQkgKi8KLQlpZiAoaW92X2l0ZXJfcncoaXRlcikgPT0gUkVBRCkKLQkJaW5vZGVfbG9jayhpbm9kZSk7Ci0KLQlMQVNTRVJUKG9iai0+dm9iX3RyYW5zaWVudF9wYWdlcyA9PSAwKTsKIAl3aGlsZSAoaW92X2l0ZXJfY291bnQoaXRlcikpIHsKIAkJc3RydWN0IHBhZ2UgKipwYWdlczsKIAkJc2l6ZV90IG9mZnM7CkBAIC00MzAsMTAgKzQxOSw2IEBACiAJCWZpbGVfb2Zmc2V0ICs9IHJlc3VsdDsKIAl9CiBvdXQ6Ci0JTEFTU0VSVChvYmotPnZvYl90cmFuc2llbnRfcGFnZXMgPT0gMCk7Ci0JaWYgKGlvdl9pdGVyX3J3KGl0ZXIpID09IFJFQUQpCi0JCWlub2RlX3VubG9jayhpbm9kZSk7Ci0KIAlpZiAodG90X2J5dGVzID4gMCkgewogCQlzdHJ1Y3QgdnZwX2lvICp2aW8gPSB2dnBfZW52X2lvKGVudik7CiAKQEAgLTYxNiw2ICs2MDEsMTMgQEAKIAkJCUxBU1NFUlQoZnJvbSA9PSAwKTsKIAkJdmlvLT51LndyaXRlLnZ1aV90byA9IGZyb20gKyBjb3BpZWQ7CiAKKwkJLyoKKwkJICogVG8gYWRkcmVzcyB0aGUgZGVhZGxvY2sgaW4gYmFsYW5jZV9kaXJ0eV9wYWdlcygpIHdoZXJlCisJCSAqIHRoaXMgZGlydHkgcGFnZSBtYXkgYmUgd3JpdHRlbiBiYWNrIGluIHRoZSBzYW1lIHRocmVhZC4KKwkJICovCisJCWlmIChQYWdlRGlydHkodm1wYWdlKSkKKwkJCXVucGx1ZyA9IHRydWU7CisKIAkJLyogV2UgbWF5IGhhdmUgb25lIGZ1bGwgUlBDLCBjb21taXQgaXQgc29vbiAqLwogCQlpZiAocGxpc3QtPnBsX25yID49IFBUTFJQQ19NQVhfQlJXX1BBR0VTKQogCQkJdW5wbHVnID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3N0YXRhaGVhZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvc3RhdGFoZWFkLmMKaW5kZXggYzFjYjZiMS4uMDY3NzUxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvc3RhdGFoZWFkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvc3RhdGFoZWFkLmMKQEAgLTM5LDcgKzM5LDYgQEAKICNkZWZpbmUgREVCVUdfU1VCU1lTVEVNIFNfTExJVEUKIAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkX3N1cHBvcnQuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saXRlLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfZGxtLmgiCiAjaW5jbHVkZSAibGxpdGVfaW50ZXJuYWwuaCIKIApAQCAtNTAsMjQgKzQ5LDI2IEBACiAJU0FfRU5UUllfSU5JVCA9IDAsICAgICAgLyoqIGluaXQgZW50cnkgKi8KIAlTQV9FTlRSWV9TVUNDID0gMSwgICAgICAvKiogc3RhdCBzdWNjZWVkICovCiAJU0FfRU5UUllfSU5WQSA9IDIsICAgICAgLyoqIGludmFsaWQgZW50cnkgKi8KLQlTQV9FTlRSWV9ERVNUID0gMywgICAgICAvKiogZW50cnkgdG8gYmUgZGVzdHJveWVkICovCiB9OwogCi1zdHJ1Y3QgbGxfc2FfZW50cnkgewotCS8qIGxpbmsgaW50byBzYWktPnNhaV9lbnRyaWVzICovCi0Jc3RydWN0IGxpc3RfaGVhZAkgICAgICBzZV9saW5rOwotCS8qIGxpbmsgaW50byBzYWktPnNhaV9lbnRyaWVzX3tyZWNlaXZlZCxzdGF0ZWR9ICovCisvKgorICogc2FfZW50cnkgaXMgbm90IHJlZmNvdW50ZWQ6IHN0YXRhaGVhZCB0aHJlYWQgYWxsb2NhdGVzIGl0IGFuZCBkbyBhc3luYyBzdGF0LAorICogYW5kIGluIGFzeW5jIHN0YXQgY2FsbGJhY2sgbGxfc3RhdGFoZWFkX2ludGVycHJldCgpIHdpbGwgYWRkIGl0IGludG8KKyAqIHNhaV9pbnRlcmltX2VudHJpZXMsIGxhdGVyIHN0YXRhaGVhZCB0aHJlYWQgd2lsbCBjYWxsIHNhX2hhbmRsZV9jYWxsYmFjaygpIHRvCisgKiBpbnN0YW50aWF0ZSBlbnRyeSBhbmQgbW92ZSBpdCBpbnRvIHNhaV9lbnRyaWVzLCBhbmQgdGhlbiBvbmx5IHNjYW5uZXIgcHJvY2VzcworICogY2FuIGFjY2VzcyBhbmQgZnJlZSBpdC4KKyAqLworc3RydWN0IHNhX2VudHJ5IHsKKwkvKiBsaW5rIGludG8gc2FpX2ludGVyaW1fZW50cmllcyBvciBzYWlfZW50cmllcyAqLwogCXN0cnVjdCBsaXN0X2hlYWQJICAgICAgc2VfbGlzdDsKIAkvKiBsaW5rIGludG8gc2FpIGhhc2ggdGFibGUgbG9jYWxseSAqLwogCXN0cnVjdCBsaXN0X2hlYWQJICAgICAgc2VfaGFzaDsKLQkvKiBlbnRyeSByZWZlcmVuY2UgY291bnQgKi8KLQlhdG9taWNfdAkgICAgc2VfcmVmY291bnQ7CiAJLyogZW50cnkgaW5kZXggaW4gdGhlIHNhaSAqLwogCV9fdTY0CQkgICBzZV9pbmRleDsKIAkvKiBsb3cgbGF5ZXIgbGRsbSBsb2NrIGhhbmRsZSAqLwogCV9fdTY0CQkgICBzZV9oYW5kbGU7CiAJLyogZW50cnkgc3RhdHVzICovCi0JZW51bSBzZV9zdGF0CSAgIHNlX3N0YXQ7CisJZW51bSBzZV9zdGF0CQlzZV9zdGF0ZTsKIAkvKiBlbnRyeSBzaXplLCBjb250YWlucyBuYW1lICovCiAJaW50CQkgICAgIHNlX3NpemU7CiAJLyogcG9pbnRlciB0byBhc3luYyBnZXRhdHRyIGVucXVldWUgaW5mbyAqLwpAQCAtODMsMjcgKzg0LDI0IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IHNhaV9nZW5lcmF0aW9uOwogc3RhdGljIERFRklORV9TUElOTE9DSyhzYWlfZ2VuZXJhdGlvbl9sb2NrKTsKIAotLyoKLSAqIFRoZSBlbnRyeSBvbmx5IGNhbiBiZSByZWxlYXNlZCBieSB0aGUgY2FsbGVyLCBpdCBpcyBuZWNlc3NhcnkgdG8gaG9sZCBsb2NrLgotICovCi1zdGF0aWMgaW5saW5lIGludCBsbF9zYV9lbnRyeV9zdGF0ZWQoc3RydWN0IGxsX3NhX2VudHJ5ICplbnRyeSkKKy8qIHNhX2VudHJ5IGlzIHJlYWR5IHRvIHVzZSAqLworc3RhdGljIGlubGluZSBpbnQgc2FfcmVhZHkoc3RydWN0IHNhX2VudHJ5ICplbnRyeSkKIHsKIAlzbXBfcm1iKCk7Ci0JcmV0dXJuIChlbnRyeS0+c2Vfc3RhdCAhPSBTQV9FTlRSWV9JTklUKTsKKwlyZXR1cm4gKGVudHJ5LT5zZV9zdGF0ZSAhPSBTQV9FTlRSWV9JTklUKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgbGxfc2FfZW50cnlfaGFzaChpbnQgdmFsKQorLyogaGFzaCB2YWx1ZSB0byBwdXQgaW4gc2FpX2NhY2hlICovCitzdGF0aWMgaW5saW5lIGludCBzYV9oYXNoKGludCB2YWwpCiB7CiAJcmV0dXJuIHZhbCAmIExMX1NBX0NBQ0hFX01BU0s7CiB9CiAKLS8qCi0gKiBJbnNlcnQgZW50cnkgdG8gaGFzaCBTQSB0YWJsZS4KLSAqLworLyogaGFzaCBlbnRyeSBpbnRvIHNhaV9jYWNoZSAqLwogc3RhdGljIGlubGluZSB2b2lkCi1sbF9zYV9lbnRyeV9lbmhhc2goc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWksIHN0cnVjdCBsbF9zYV9lbnRyeSAqZW50cnkpCitzYV9yZWhhc2goc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWksIHN0cnVjdCBzYV9lbnRyeSAqZW50cnkpCiB7Ci0JaW50IGkgPSBsbF9zYV9lbnRyeV9oYXNoKGVudHJ5LT5zZV9xc3RyLmhhc2gpOworCWludCBpID0gc2FfaGFzaChlbnRyeS0+c2VfcXN0ci5oYXNoKTsKIAogCXNwaW5fbG9jaygmc2FpLT5zYWlfY2FjaGVfbG9ja1tpXSk7CiAJbGlzdF9hZGRfdGFpbCgmZW50cnktPnNlX2hhc2gsICZzYWktPnNhaV9jYWNoZVtpXSk7CkBAIC0xMTQsOSArMTEyLDkgQEAKICAqIFJlbW92ZSBlbnRyeSBmcm9tIFNBIHRhYmxlLgogICovCiBzdGF0aWMgaW5saW5lIHZvaWQKLWxsX3NhX2VudHJ5X3VuaGFzaChzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSwgc3RydWN0IGxsX3NhX2VudHJ5ICplbnRyeSkKK3NhX3VuaGFzaChzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSwgc3RydWN0IHNhX2VudHJ5ICplbnRyeSkKIHsKLQlpbnQgaSA9IGxsX3NhX2VudHJ5X2hhc2goZW50cnktPnNlX3FzdHIuaGFzaCk7CisJaW50IGkgPSBzYV9oYXNoKGVudHJ5LT5zZV9xc3RyLmhhc2gpOwogCiAJc3Bpbl9sb2NrKCZzYWktPnNhaV9jYWNoZV9sb2NrW2ldKTsKIAlsaXN0X2RlbF9pbml0KCZlbnRyeS0+c2VfaGFzaCk7CkBAIC0xMjksMTkgKzEyNywyMSBAQAogCXJldHVybiAoaW5vZGUgJiYgU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJiBzYWktPnNhaV9hZ2xfdmFsaWQpOwogfQogCisvKiBzdGF0YWhlYWQgd2luZG93IGlzIGZ1bGwgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHNhX3NlbnRfZnVsbChzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSkKIHsKIAlyZXR1cm4gYXRvbWljX3JlYWQoJnNhaS0+c2FpX2NhY2hlX2NvdW50KSA+PSBzYWktPnNhaV9tYXg7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHNhX3JlY2VpdmVkX2VtcHR5KHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpKQorLyogZ290IGFzeW5jIHN0YXQgcmVwbGllcyAqLworc3RhdGljIGlubGluZSBpbnQgc2FfaGFzX2NhbGxiYWNrKHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpKQogewotCXJldHVybiBsaXN0X2VtcHR5KCZzYWktPnNhaV9lbnRyaWVzX3JlY2VpdmVkKTsKKwlyZXR1cm4gIWxpc3RfZW1wdHkoJnNhaS0+c2FpX2ludGVyaW1fZW50cmllcyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGFnbF9saXN0X2VtcHR5KHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpKQogewotCXJldHVybiBsaXN0X2VtcHR5KCZzYWktPnNhaV9lbnRyaWVzX2FnbCk7CisJcmV0dXJuIGxpc3RfZW1wdHkoJnNhaS0+c2FpX2FnbHMpOwogfQogCiAvKioKQEAgLTE1Nyw3ICsxNTcsNyBAQAogfQogCiAvKgotICogSWYgdGhlIGdpdmVuIGluZGV4IGlzIGJlaGluZCBvZiBzdGF0YWhlYWQgd2luZG93IG1vcmUgdGhhbgorICogaWYgdGhlIGdpdmVuIGluZGV4IGlzIGJlaGluZCBvZiBzdGF0YWhlYWQgd2luZG93IG1vcmUgdGhhbgogICogU0FfT01JVFRFRF9FTlRSWV9NQVgsIHRoZW4gaXQgaXMgb2xkLgogICovCiBzdGF0aWMgaW5saW5lIGludCBpc19vbWl0dGVkX2VudHJ5KHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpLCBfX3U2NCBpbmRleCkKQEAgLTE2NiwyMCArMTY2LDE3IEBACiAJCSBzYWktPnNhaV9pbmRleCk7CiB9CiAKLS8qCi0gKiBJbnNlcnQgaXQgaW50byBzYWlfZW50cmllcyB0YWlsIHdoZW4gaW5pdC4KLSAqLwotc3RhdGljIHN0cnVjdCBsbF9zYV9lbnRyeSAqCi1sbF9zYV9lbnRyeV9hbGxvYyhzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsCi0JCSAgc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWksIF9fdTY0IGluZGV4LAotCQkgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4pCisvKiBhbGxvY2F0ZSBzYV9lbnRyeSBhbmQgaGFzaCBpdCB0byBhbGxvdyBzY2FubmVyIHByb2Nlc3MgdG8gZmluZCBpdCAqLworc3RhdGljIHN0cnVjdCBzYV9lbnRyeSAqCitzYV9hbGxvYyhzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpLCBfX3U2NCBpbmRleCwKKwkgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbikKIHsKIAlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpOwotCXN0cnVjdCBsbF9zYV9lbnRyeSAgICplbnRyeTsKKwlzdHJ1Y3Qgc2FfZW50cnkgICAqZW50cnk7CiAJaW50CQkgICBlbnRyeV9zaXplOwogCWNoYXIJCSAqZG5hbWU7CiAKLQllbnRyeV9zaXplID0gc2l6ZW9mKHN0cnVjdCBsbF9zYV9lbnRyeSkgKyAobGVuICYgfjMpICsgNDsKKwllbnRyeV9zaXplID0gc2l6ZW9mKHN0cnVjdCBzYV9lbnRyeSkgKyAobGVuICYgfjMpICsgNDsKIAllbnRyeSA9IGt6YWxsb2MoZW50cnlfc2l6ZSwgR0ZQX05PRlMpOwogCWlmICh1bmxpa2VseSghZW50cnkpKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKQEAgLTE4OCwzNCArMTg1LDkgQEAKIAkgICAgICAgbGVuLCBuYW1lLCBlbnRyeSwgaW5kZXgpOwogCiAJZW50cnktPnNlX2luZGV4ID0gaW5kZXg7Ci0KLQkvKgotCSAqIFN0YXRhaGVhZCBlbnRyeSByZWZlcmVuY2UgcnVsZXM6Ci0JICoKLQkgKiAxKSBXaGVuIHN0YXRhaGVhZCBlbnRyeSBpcyBpbml0aWFsaXplZCwgaXRzIHJlZmVyZW5jZSBpcyBzZXQgYXMgMi4KLQkgKiAgICBPbmUgcmVmZXJlbmNlIGlzIHVzZWQgYnkgdGhlIGRpcmVjdG9yeSBzY2FubmVyLiBXaGVuIHRoZSBzY2FubmVyCi0JICogICAgc2VhcmNoZXMgdGhlIHN0YXRhaGVhZCBjYWNoZSBmb3IgdGhlIGdpdmVuIG5hbWUsIGl0IGNhbiBwZXJmb3JtCi0JICogICAgbG9ja2xlc3MgaGFzaCBsb29rdXAgKG9ubHkgdGhlIHNjYW5uZXIgY2FuIHJlbW92ZSBlbnRyeSBmcm9tIGhhc2gKLQkgKiAgICBsaXN0KSwgYW5kIG9uY2UgZm91bmQsIGl0IG5lZWRuJ3QgdG8gY2FsbCAiYXRvbWljX2luYygpIiBmb3IgdGhlCi0JICogICAgZW50cnkgcmVmZXJlbmNlLiBTbyB0aGUgcGVyZm9ybWFuY2UgaXMgaW1wcm92ZWQuIEFmdGVyIHVzaW5nIHRoZQotCSAqICAgIHN0YXRhaGVhZCBlbnRyeSwgdGhlIHNjYW5uZXIgd2lsbCBjYWxsICJhdG9taWNfZGVjKCkiIHRvIGRyb3AgdGhlCi0JICogICAgcmVmZXJlbmNlIGhlbGQgd2hlbiBpbml0aWFsaXphdGlvbi4gSWYgaXQgaXMgdGhlIGxhc3QgcmVmZXJlbmNlLAotCSAqICAgIHRoZSBzdGF0YWhlYWQgZW50cnkgd2lsbCBiZSBmcmVlZC4KLQkgKgotCSAqIDIpIEFsbCBvdGhlciB0aHJlYWRzLCBpbmNsdWRpbmcgc3RhdGFoZWFkIHRocmVhZCBhbmQgcHRscnBjZCB0aHJlYWQsCi0JICogICAgd2hlbiB0aGV5IHByb2Nlc3MgdGhlIHN0YXRhaGVhZCBlbnRyeSwgdGhlIHJlZmVyZW5jZSBmb3IgdGFyZ2V0Ci0JICogICAgc2hvdWxkIGJlIGhlbGQgdG8gZ3VhcmFudGVlIHRoZSBlbnRyeSB3aWxsIG5vdCBiZSByZWxlYXNlZCBieSB0aGUKLQkgKiAgICBkaXJlY3Rvcnkgc2Nhbm5lci4gQWZ0ZXIgcHJvY2Vzc2luZyB0aGUgZW50cnksIHRoZXNlIHRocmVhZHMgd2lsbAotCSAqICAgIGRyb3AgdGhlIGVudHJ5IHJlZmVyZW5jZS4gSWYgaXQgaXMgdGhlIGxhc3QgcmVmZXJlbmNlLCB0aGUgZW50cnkKLQkgKiAgICB3aWxsIGJlIGZyZWVkLgotCSAqCi0JICogICAgVGhlIHNlY29uZCByZWZlcmVuY2Ugd2hlbiBpbml0aWFsaXplcyB0aGUgc3RhdGFoZWFkIGVudHJ5IGlzIHVzZWQKLQkgKiAgICBieSB0aGUgc3RhdGFoZWFkIHRocmVhZCwgZm9sbG93aW5nIHRoZSBydWxlIDIpLgotCSAqLwotCWF0b21pY19zZXQoJmVudHJ5LT5zZV9yZWZjb3VudCwgMik7Ci0JZW50cnktPnNlX3N0YXQgPSBTQV9FTlRSWV9JTklUOworCWVudHJ5LT5zZV9zdGF0ZSA9IFNBX0VOVFJZX0lOSVQ7CiAJZW50cnktPnNlX3NpemUgPSBlbnRyeV9zaXplOwotCWRuYW1lID0gKGNoYXIgKillbnRyeSArIHNpemVvZihzdHJ1Y3QgbGxfc2FfZW50cnkpOworCWRuYW1lID0gKGNoYXIgKillbnRyeSArIHNpemVvZihzdHJ1Y3Qgc2FfZW50cnkpOwogCW1lbWNweShkbmFtZSwgbmFtZSwgbGVuKTsKIAlkbmFtZVtsZW5dID0gMDsKIApAQCAtMjIzLDExICsxOTUsMTAgQEAKIAllbnRyeS0+c2VfcXN0ci5sZW4gPSBsZW47CiAJZW50cnktPnNlX3FzdHIubmFtZSA9IGRuYW1lOwogCi0JbGxpID0gbGxfaTJpbmZvKHNhaS0+c2FpX2lub2RlKTsKKwlsbGkgPSBsbF9pMmluZm8oc2FpLT5zYWlfZGVudHJ5LT5kX2lub2RlKTsKIAlzcGluX2xvY2soJmxsaS0+bGxpX3NhX2xvY2spOwotCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5zZV9saW5rLCAmc2FpLT5zYWlfZW50cmllcyk7CiAJSU5JVF9MSVNUX0hFQUQoJmVudHJ5LT5zZV9saXN0KTsKLQlsbF9zYV9lbnRyeV9lbmhhc2goc2FpLCBlbnRyeSk7CisJc2FfcmVoYXNoKHNhaSwgZW50cnkpOwogCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKIAogCWF0b21pY19pbmMoJnNhaS0+c2FpX2NhY2hlX2NvdW50KTsKQEAgLTIzNSwxOCArMjA2LDI5IEBACiAJcmV0dXJuIGVudHJ5OwogfQogCi0vKgotICogVXNlZCBieSB0aGUgZGlyZWN0b3J5IHNjYW5uZXIgdG8gc2VhcmNoIGVudHJ5IHdpdGggbmFtZS4KLSAqCi0gKiBPbmx5IHRoZSBjYWxsZXIgY2FuIHJlbW92ZSB0aGUgZW50cnkgZnJvbSBoYXNoLCBzbyBpdCBpcyB1bm5lY2Vzc2FyeSB0byBob2xkCi0gKiBoYXNoIGxvY2suIEl0IGlzIGNhbGxlcidzIGR1dHkgdG8gcmVsZWFzZSB0aGUgaW5pdCByZWZjb3VudCBvbiB0aGUgZW50cnksIHNvCi0gKiBpdCBpcyBhbHNvIHVubmVjZXNzYXJ5IHRvIGluY3JlYXNlIHJlZmNvdW50IG9uIHRoZSBlbnRyeS4KLSAqLwotc3RhdGljIHN0cnVjdCBsbF9zYV9lbnRyeSAqCi1sbF9zYV9lbnRyeV9nZXRfYnluYW1lKHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpLCBjb25zdCBzdHJ1Y3QgcXN0ciAqcXN0cikKKy8qIGZyZWUgc2FfZW50cnksIHdoaWNoIHNob3VsZCBoYXZlIGJlZW4gdW5oYXNoZWQgYW5kIG5vdCBpbiBhbnkgbGlzdCAqLworc3RhdGljIHZvaWQgc2FfZnJlZShzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSwgc3RydWN0IHNhX2VudHJ5ICplbnRyeSkKIHsKLQlzdHJ1Y3QgbGxfc2FfZW50cnkgKmVudHJ5OwotCWludCBpID0gbGxfc2FfZW50cnlfaGFzaChxc3RyLT5oYXNoKTsKKwlDREVCVUcoRF9SRUFEQSwgImZyZWUgc2EgZW50cnkgJS4qcyglcCkgaW5kZXggJWxsdVxuIiwKKwkgICAgICAgZW50cnktPnNlX3FzdHIubGVuLCBlbnRyeS0+c2VfcXN0ci5uYW1lLCBlbnRyeSwKKwkgICAgICAgZW50cnktPnNlX2luZGV4KTsKKworCUxBU1NFUlQobGlzdF9lbXB0eSgmZW50cnktPnNlX2xpc3QpKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJmVudHJ5LT5zZV9oYXNoKSk7CisKKwlrZnJlZShlbnRyeSk7CisJYXRvbWljX2RlYygmc2FpLT5zYWlfY2FjaGVfY291bnQpOworfQorCisvKgorICogZmluZCBzYV9lbnRyeSBieSBuYW1lLCB1c2VkIGJ5IGRpcmVjdG9yeSBzY2FubmVyLCBsb2NrIGlzIG5vdCBuZWVkZWQgYmVjYXVzZQorICogb25seSBzY2FubmVyIGNhbiByZW1vdmUgdGhlIGVudHJ5IGZyb20gY2FjaGUuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2FfZW50cnkgKgorc2FfZ2V0KHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpLCBjb25zdCBzdHJ1Y3QgcXN0ciAqcXN0cikKK3sKKwlzdHJ1Y3Qgc2FfZW50cnkgKmVudHJ5OworCWludCBpID0gc2FfaGFzaChxc3RyLT5oYXNoKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZzYWktPnNhaV9jYWNoZVtpXSwgc2VfaGFzaCkgewogCQlpZiAoZW50cnktPnNlX3FzdHIuaGFzaCA9PSBxc3RyLT5oYXNoICYmCkBAIC0yNTcsMzYgKzIzOSwxMDAgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotLyoKLSAqIFVzZWQgYnkgdGhlIGFzeW5jIGdldGF0dHIgcmVxdWVzdCBjYWxsYmFjayB0byBmaW5kIGVudHJ5IHdpdGggaW5kZXguCi0gKgotICogSW5zaWRlIGxsaV9zYV9sb2NrIHRvIHByZXZlbnQgb3RoZXJzIHRvIGNoYW5nZSB0aGUgbGlzdCBkdXJpbmcgdGhlIHNlYXJjaC4KLSAqIEl0IG5lZWRzIHRvIGluY3JlYXNlIGVudHJ5IHJlZmNvdW50IGJlZm9yZSByZXR1cm5pbmcgdG8gZ3VhcmFudGVlIHRoYXQgdGhlCi0gKiBlbnRyeSBjYW5ub3QgYmUgZnJlZWQgYnkgb3RoZXJzLgotICovCi1zdGF0aWMgc3RydWN0IGxsX3NhX2VudHJ5ICoKLWxsX3NhX2VudHJ5X2dldF9ieWluZGV4KHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpLCBfX3U2NCBpbmRleCkKKy8qIHVuaGFzaCBhbmQgdW5saW5rIHNhX2VudHJ5LCBhbmQgdGhlbiBmcmVlIGl0ICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3NhX2tpbGwoc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWksIHN0cnVjdCBzYV9lbnRyeSAqZW50cnkpCiB7Ci0Jc3RydWN0IGxsX3NhX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKHNhaS0+c2FpX2RlbnRyeS0+ZF9pbm9kZSk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmc2FpLT5zYWlfZW50cmllcywgc2VfbGluaykgewotCQlpZiAoZW50cnktPnNlX2luZGV4ID09IGluZGV4KSB7Ci0JCQlMQVNTRVJUKGF0b21pY19yZWFkKCZlbnRyeS0+c2VfcmVmY291bnQpID4gMCk7Ci0JCQlhdG9taWNfaW5jKCZlbnRyeS0+c2VfcmVmY291bnQpOwotCQkJcmV0dXJuIGVudHJ5OwotCQl9Ci0JCWlmIChlbnRyeS0+c2VfaW5kZXggPiBpbmRleCkKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gTlVMTDsKKwlMQVNTRVJUKCFsaXN0X2VtcHR5KCZlbnRyeS0+c2VfaGFzaCkpOworCUxBU1NFUlQoIWxpc3RfZW1wdHkoJmVudHJ5LT5zZV9saXN0KSk7CisJTEFTU0VSVChzYV9yZWFkeShlbnRyeSkpOworCisJc2FfdW5oYXNoKHNhaSwgZW50cnkpOworCisJc3Bpbl9sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKKwlsaXN0X2RlbF9pbml0KCZlbnRyeS0+c2VfbGlzdCk7CisJc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOworCisJaWYgKGVudHJ5LT5zZV9pbm9kZSkKKwkJaXB1dChlbnRyeS0+c2VfaW5vZGUpOworCisJc2FfZnJlZShzYWksIGVudHJ5KTsKIH0KIAotc3RhdGljIHZvaWQgbGxfc2FfZW50cnlfY2xlYW51cChzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSwKLQkJCQlzdHJ1Y3QgbGxfc2FfZW50cnkgKmVudHJ5KQorLyogY2FsbGVkIGJ5IHNjYW5uZXIgYWZ0ZXIgdXNlLCBzYV9lbnRyeSB3aWxsIGJlIGtpbGxlZCAqLworc3RhdGljIHZvaWQKK3NhX3B1dChzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSwgc3RydWN0IHNhX2VudHJ5ICplbnRyeSkKIHsKLQlzdHJ1Y3QgbWRfZW5xdWV1ZV9pbmZvICptaW5mbyA9IGVudHJ5LT5zZV9taW5mbzsKLQlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgICpyZXEgICA9IGVudHJ5LT5zZV9yZXE7CisJc3RydWN0IHNhX2VudHJ5ICp0bXAsICpuZXh0OwogCisJaWYgKGVudHJ5ICYmIGVudHJ5LT5zZV9zdGF0ZSA9PSBTQV9FTlRSWV9TVUNDKSB7CisJCXN0cnVjdCBsbF9zYl9pbmZvICpzYmkgPSBsbF9pMnNiaShzYWktPnNhaV9kZW50cnktPmRfaW5vZGUpOworCisJCXNhaS0+c2FpX2hpdCsrOworCQlzYWktPnNhaV9jb25zZWN1dGl2ZV9taXNzID0gMDsKKwkJc2FpLT5zYWlfbWF4ID0gbWluKDIgKiBzYWktPnNhaV9tYXgsIHNiaS0+bGxfc2FfbWF4KTsKKwl9IGVsc2UgeworCQlzYWktPnNhaV9taXNzKys7CisJCXNhaS0+c2FpX2NvbnNlY3V0aXZlX21pc3MrKzsKKwl9CisKKwlpZiAoZW50cnkpCisJCXNhX2tpbGwoc2FpLCBlbnRyeSk7CisKKwkvKgorCSAqIGtpbGwgb2xkIGNvbXBsZXRlZCBlbnRyaWVzLCBvbmx5IHNjYW5uZXIgcHJvY2VzcyBkb2VzIHRoaXMsIG5vIG5lZWQKKwkgKiB0byBsb2NrCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRtcCwgbmV4dCwgJnNhaS0+c2FpX2VudHJpZXMsIHNlX2xpc3QpIHsKKwkJaWYgKCFpc19vbWl0dGVkX2VudHJ5KHNhaSwgdG1wLT5zZV9pbmRleCkpCisJCQlicmVhazsKKwkJc2Ffa2lsbChzYWksIHRtcCk7CisJfQorCisJd2FrZV91cCgmc2FpLT5zYWlfdGhyZWFkLnRfY3RsX3dhaXRxKTsKK30KKworLyoKKyAqIHVwZGF0ZSBzdGF0ZSBhbmQgc29ydCBhZGQgZW50cnkgdG8gc2FpX2VudHJpZXMgYnkgaW5kZXgsIHJldHVybiB0cnVlIGlmCisgKiBzY2FubmVyIGlzIHdhaXRpbmcgb24gdGhpcyBlbnRyeS4KKyAqLworc3RhdGljIGJvb2wKK19fc2FfbWFrZV9yZWFkeShzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSwgc3RydWN0IHNhX2VudHJ5ICplbnRyeSwgaW50IHJldCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MgPSAmc2FpLT5zYWlfZW50cmllczsKKwlfX3U2NCBpbmRleCA9IGVudHJ5LT5zZV9pbmRleDsKKwlzdHJ1Y3Qgc2FfZW50cnkgKnNlOworCisJTEFTU0VSVCghc2FfcmVhZHkoZW50cnkpKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJmVudHJ5LT5zZV9saXN0KSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2Uoc2UsICZzYWktPnNhaV9lbnRyaWVzLCBzZV9saXN0KSB7CisJCWlmIChzZS0+c2VfaW5kZXggPCBlbnRyeS0+c2VfaW5kZXgpIHsKKwkJCXBvcyA9ICZzZS0+c2VfbGlzdDsKKwkJCWJyZWFrOworCQl9CisJfQorCWxpc3RfYWRkKCZlbnRyeS0+c2VfbGlzdCwgcG9zKTsKKwllbnRyeS0+c2Vfc3RhdGUgPSByZXQgPCAwID8gU0FfRU5UUllfSU5WQSA6IFNBX0VOVFJZX1NVQ0M7CisKKwlyZXR1cm4gKGluZGV4ID09IHNhaS0+c2FpX2luZGV4X3dhaXQpOworfQorCisvKgorICogcmVsZWFzZSByZXNvdXJjZXMgdXNlZCBpbiBhc3luYyBzdGF0IFJQQywgdXBkYXRlIGVudHJ5IHN0YXRlIGFuZCB3YWtldXAgaWYKKyAqIHNjYW5uZXIgcHJvY2VzcyBpdCB3YWl0aW5nIG9uIHRoaXMgZW50cnkuCisgKi8KK3N0YXRpYyB2b2lkCitzYV9tYWtlX3JlYWR5KHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpLCBzdHJ1Y3Qgc2FfZW50cnkgKmVudHJ5LCBpbnQgcmV0KQoreworCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oc2FpLT5zYWlfZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgbWRfZW5xdWV1ZV9pbmZvICptaW5mbyA9IGVudHJ5LT5zZV9taW5mbzsKKwlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSA9IGVudHJ5LT5zZV9yZXE7CisJYm9vbCB3YWtldXA7CisKKwkvKiByZWxlYXNlIHJlc291cmNlcyB1c2VkIGluIFJQQyAqLwogCWlmIChtaW5mbykgewogCQllbnRyeS0+c2VfbWluZm8gPSBOVUxMOwogCQlsbF9pbnRlbnRfcmVsZWFzZSgmbWluZm8tPm1pX2l0KTsKQEAgLTI5OCwxMjMgKzM0NCwyMSBAQAogCQllbnRyeS0+c2VfcmVxID0gTlVMTDsKIAkJcHRscnBjX3JlcV9maW5pc2hlZChyZXEpOwogCX0KLX0KLQotc3RhdGljIHZvaWQgbGxfc2FfZW50cnlfcHV0KHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpLAotCQkJICAgIHN0cnVjdCBsbF9zYV9lbnRyeSAqZW50cnkpCi17Ci0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmVudHJ5LT5zZV9yZWZjb3VudCkpIHsKLQkJQ0RFQlVHKERfUkVBREEsICJmcmVlIHNhIGVudHJ5ICUuKnMoJXApIGluZGV4ICVsbHVcbiIsCi0JCSAgICAgICBlbnRyeS0+c2VfcXN0ci5sZW4sIGVudHJ5LT5zZV9xc3RyLm5hbWUsIGVudHJ5LAotCQkgICAgICAgZW50cnktPnNlX2luZGV4KTsKLQotCQlMQVNTRVJUKGxpc3RfZW1wdHkoJmVudHJ5LT5zZV9saW5rKSk7Ci0JCUxBU1NFUlQobGlzdF9lbXB0eSgmZW50cnktPnNlX2xpc3QpKTsKLQkJTEFTU0VSVChsaXN0X2VtcHR5KCZlbnRyeS0+c2VfaGFzaCkpOwotCi0JCWxsX3NhX2VudHJ5X2NsZWFudXAoc2FpLCBlbnRyeSk7Ci0JCWlwdXQoZW50cnktPnNlX2lub2RlKTsKLQotCQlrZnJlZShlbnRyeSk7Ci0JCWF0b21pY19kZWMoJnNhaS0+c2FpX2NhY2hlX2NvdW50KTsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotZG9fc2FfZW50cnlfZmluaShzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSwgc3RydWN0IGxsX3NhX2VudHJ5ICplbnRyeSkKLXsKLQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKHNhaS0+c2FpX2lub2RlKTsKLQotCUxBU1NFUlQoIWxpc3RfZW1wdHkoJmVudHJ5LT5zZV9oYXNoKSk7Ci0JTEFTU0VSVCghbGlzdF9lbXB0eSgmZW50cnktPnNlX2xpbmspKTsKLQotCWxsX3NhX2VudHJ5X3VuaGFzaChzYWksIGVudHJ5KTsKIAogCXNwaW5fbG9jaygmbGxpLT5sbGlfc2FfbG9jayk7Ci0JZW50cnktPnNlX3N0YXQgPSBTQV9FTlRSWV9ERVNUOwotCWxpc3RfZGVsX2luaXQoJmVudHJ5LT5zZV9saW5rKTsKLQlpZiAobGlrZWx5KCFsaXN0X2VtcHR5KCZlbnRyeS0+c2VfbGlzdCkpKQotCQlsaXN0X2RlbF9pbml0KCZlbnRyeS0+c2VfbGlzdCk7CisJd2FrZXVwID0gX19zYV9tYWtlX3JlYWR5KHNhaSwgZW50cnksIHJldCk7CiAJc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOwogCi0JbGxfc2FfZW50cnlfcHV0KHNhaSwgZW50cnkpOworCWlmICh3YWtldXApCisJCXdha2VfdXAoJnNhaS0+c2FpX3dhaXRxKTsKIH0KIAotLyoKLSAqIERlbGV0ZSBpdCBmcm9tIHNhaV9lbnRyaWVzX3N0YXRlZCBsaXN0IHdoZW4gZmluaS4KLSAqLwotc3RhdGljIHZvaWQKLWxsX3NhX2VudHJ5X2Zpbmkoc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWksIHN0cnVjdCBsbF9zYV9lbnRyeSAqZW50cnkpCi17Ci0Jc3RydWN0IGxsX3NhX2VudHJ5ICpwb3MsICpuZXh0OwotCi0JaWYgKGVudHJ5KQotCQlkb19zYV9lbnRyeV9maW5pKHNhaSwgZW50cnkpOwotCi0JLyogZHJvcCBvbGQgZW50cnksIG9ubHkgJ3NjYW5uZXInIHByb2Nlc3MgZG9lcyB0aGlzLCBubyBuZWVkIHRvIGxvY2sgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9zLCBuZXh0LCAmc2FpLT5zYWlfZW50cmllcywgc2VfbGluaykgewotCQlpZiAoIWlzX29taXR0ZWRfZW50cnkoc2FpLCBwb3MtPnNlX2luZGV4KSkKLQkJCWJyZWFrOwotCQlkb19zYV9lbnRyeV9maW5pKHNhaSwgcG9zKTsKLQl9Ci19Ci0KLS8qCi0gKiBJbnNpZGUgbGxpX3NhX2xvY2suCi0gKi8KLXN0YXRpYyB2b2lkCi1kb19zYV9lbnRyeV90b19zdGF0ZWQoc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWksCi0JCSAgICAgIHN0cnVjdCBsbF9zYV9lbnRyeSAqZW50cnksIGVudW0gc2Vfc3RhdCBzdGF0KQotewotCXN0cnVjdCBsbF9zYV9lbnRyeSAqc2U7Ci0Jc3RydWN0IGxpc3RfaGVhZAkgKnBvcyA9ICZzYWktPnNhaV9lbnRyaWVzX3N0YXRlZDsKLQotCWlmICghbGlzdF9lbXB0eSgmZW50cnktPnNlX2xpc3QpKQotCQlsaXN0X2RlbF9pbml0KCZlbnRyeS0+c2VfbGlzdCk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2Uoc2UsICZzYWktPnNhaV9lbnRyaWVzX3N0YXRlZCwgc2VfbGlzdCkgewotCQlpZiAoc2UtPnNlX2luZGV4IDwgZW50cnktPnNlX2luZGV4KSB7Ci0JCQlwb3MgPSAmc2UtPnNlX2xpc3Q7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWxpc3RfYWRkKCZlbnRyeS0+c2VfbGlzdCwgcG9zKTsKLQllbnRyeS0+c2Vfc3RhdCA9IHN0YXQ7Ci19Ci0KLS8qCi0gKiBNb3ZlIGVudHJ5IHRvIHNhaV9lbnRyaWVzX3N0YXRlZCBhbmQgc29ydCB3aXRoIHRoZSBpbmRleC4KLSAqIFxyZXR2YWwgMSAgICAtLSBlbnRyeSB0byBiZSBkZXN0cm95ZWQuCi0gKiBccmV0dmFsIDAgICAgLS0gZW50cnkgaXMgaW5zZXJ0ZWQgaW50byBzdGF0ZWQgbGlzdC4KLSAqLwotc3RhdGljIGludAotbGxfc2FfZW50cnlfdG9fc3RhdGVkKHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpLAotCQkgICAgICBzdHJ1Y3QgbGxfc2FfZW50cnkgKmVudHJ5LCBlbnVtIHNlX3N0YXQgc3RhdCkKLXsKLQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKHNhaS0+c2FpX2lub2RlKTsKLQlpbnQJCSAgIHJldCA9IDE7Ci0KLQlsbF9zYV9lbnRyeV9jbGVhbnVwKHNhaSwgZW50cnkpOwotCi0Jc3Bpbl9sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKLQlpZiAobGlrZWx5KGVudHJ5LT5zZV9zdGF0ICE9IFNBX0VOVFJZX0RFU1QpKSB7Ci0JCWRvX3NhX2VudHJ5X3RvX3N0YXRlZChzYWksIGVudHJ5LCBzdGF0KTsKLQkJcmV0ID0gMDsKLQl9Ci0Jc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIEluc2VydCBpbm9kZSBpbnRvIHRoZSBsaXN0IG9mIHNhaV9lbnRyaWVzX2FnbC4KLSAqLworLyogSW5zZXJ0IGlub2RlIGludG8gdGhlIGxpc3Qgb2Ygc2FpX2FnbHMuICovCiBzdGF0aWMgdm9pZCBsbF9hZ2xfYWRkKHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpLAogCQkgICAgICAgc3RydWN0IGlub2RlICppbm9kZSwgaW50IGluZGV4KQogewogCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpjaGlsZCAgPSBsbF9pMmluZm8oaW5vZGUpOwotCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpwYXJlbnQgPSBsbF9pMmluZm8oc2FpLT5zYWlfaW5vZGUpOworCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpwYXJlbnQgPSBsbF9pMmluZm8oc2FpLT5zYWlfZGVudHJ5LT5kX2lub2RlKTsKIAlpbnQJCSAgIGFkZGVkICA9IDA7CiAKIAlzcGluX2xvY2soJmNoaWxkLT5sbGlfYWdsX2xvY2spOwpAQCAtNDI2LDkgKzM3MCw5IEBACiAKIAkJaWdyYWIoaW5vZGUpOwogCQlzcGluX2xvY2soJnBhcmVudC0+bGxpX2FnbF9sb2NrKTsKLQkJaWYgKGxpc3RfZW1wdHkoJnNhaS0+c2FpX2VudHJpZXNfYWdsKSkKKwkJaWYgKGxpc3RfZW1wdHkoJnNhaS0+c2FpX2FnbHMpKQogCQkJYWRkZWQgPSAxOwotCQlsaXN0X2FkZF90YWlsKCZjaGlsZC0+bGxpX2FnbF9saXN0LCAmc2FpLT5zYWlfZW50cmllc19hZ2wpOworCQlsaXN0X2FkZF90YWlsKCZjaGlsZC0+bGxpX2FnbF9saXN0LCAmc2FpLT5zYWlfYWdscyk7CiAJCXNwaW5fdW5sb2NrKCZwYXJlbnQtPmxsaV9hZ2xfbG9jayk7CiAJfSBlbHNlIHsKIAkJc3Bpbl91bmxvY2soJmNoaWxkLT5sbGlfYWdsX2xvY2spOwpAQCAtNDM4LDggKzM4MiwxMCBAQAogCQl3YWtlX3VwKCZzYWktPnNhaV9hZ2xfdGhyZWFkLnRfY3RsX3dhaXRxKTsKIH0KIAotc3RhdGljIHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqbGxfc2FpX2FsbG9jKHZvaWQpCisvKiBhbGxvY2F0ZSBzYWkgKi8KK3N0YXRpYyBzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKmxsX3NhaV9hbGxvYyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CisJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhkZW50cnktPmRfaW5vZGUpOwogCXN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpOwogCWludAkJICAgICAgIGk7CiAKQEAgLTQ0NywyNCArMzkzLDE4IEBACiAJaWYgKCFzYWkpCiAJCXJldHVybiBOVUxMOwogCisJc2FpLT5zYWlfZGVudHJ5ID0gZGdldChkZW50cnkpOwogCWF0b21pY19zZXQoJnNhaS0+c2FpX3JlZmNvdW50LCAxKTsKIAotCXNwaW5fbG9jaygmc2FpX2dlbmVyYXRpb25fbG9jayk7Ci0Jc2FpLT5zYWlfZ2VuZXJhdGlvbiA9ICsrc2FpX2dlbmVyYXRpb247Ci0JaWYgKHVubGlrZWx5KHNhaV9nZW5lcmF0aW9uID09IDApKQotCQlzYWktPnNhaV9nZW5lcmF0aW9uID0gKytzYWlfZ2VuZXJhdGlvbjsKLQlzcGluX3VubG9jaygmc2FpX2dlbmVyYXRpb25fbG9jayk7Ci0KIAlzYWktPnNhaV9tYXggPSBMTF9TQV9SUENfTUlOOwogCXNhaS0+c2FpX2luZGV4ID0gMTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzYWktPnNhaV93YWl0cSk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmc2FpLT5zYWlfdGhyZWFkLnRfY3RsX3dhaXRxKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzYWktPnNhaV9hZ2xfdGhyZWFkLnRfY3RsX3dhaXRxKTsKIAorCUlOSVRfTElTVF9IRUFEKCZzYWktPnNhaV9pbnRlcmltX2VudHJpZXMpOwogCUlOSVRfTElTVF9IRUFEKCZzYWktPnNhaV9lbnRyaWVzKTsKLQlJTklUX0xJU1RfSEVBRCgmc2FpLT5zYWlfZW50cmllc19yZWNlaXZlZCk7Ci0JSU5JVF9MSVNUX0hFQUQoJnNhaS0+c2FpX2VudHJpZXNfc3RhdGVkKTsKLQlJTklUX0xJU1RfSEVBRCgmc2FpLT5zYWlfZW50cmllc19hZ2wpOworCUlOSVRfTElTVF9IRUFEKCZzYWktPnNhaV9hZ2xzKTsKIAogCWZvciAoaSA9IDA7IGkgPCBMTF9TQV9DQUNIRV9TSVpFOyBpKyspIHsKIAkJSU5JVF9MSVNUX0hFQUQoJnNhaS0+c2FpX2NhY2hlW2ldKTsKQEAgLTQ3Miw2MyArNDEyLDc0IEBACiAJfQogCWF0b21pY19zZXQoJnNhaS0+c2FpX2NhY2hlX2NvdW50LCAwKTsKIAorCXNwaW5fbG9jaygmc2FpX2dlbmVyYXRpb25fbG9jayk7CisJbGxpLT5sbGlfc2FfZ2VuZXJhdGlvbiA9ICsrc2FpX2dlbmVyYXRpb247CisJaWYgKHVubGlrZWx5KCFzYWlfZ2VuZXJhdGlvbikpCisJCWxsaS0+bGxpX3NhX2dlbmVyYXRpb24gPSArK3NhaV9nZW5lcmF0aW9uOworCXNwaW5fdW5sb2NrKCZzYWlfZ2VuZXJhdGlvbl9sb2NrKTsKKwogCXJldHVybiBzYWk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICoKLWxsX3NhaV9nZXQoc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWkpCisvKiBmcmVlIHNhaSAqLworc3RhdGljIGlubGluZSB2b2lkIGxsX3NhaV9mcmVlKHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpKQogewotCWF0b21pY19pbmMoJnNhaS0+c2FpX3JlZmNvdW50KTsKKwlMQVNTRVJUKHNhaS0+c2FpX2RlbnRyeSk7CisJZHB1dChzYWktPnNhaV9kZW50cnkpOworCWtmcmVlKHNhaSk7Cit9CisKKy8qCisgKiB0YWtlIHJlZmNvdW50IG9mIHNhaSBpZiBzYWkgZm9yIEBkaXIgZXhpc3RzLCB3aGljaCBtZWFucyBzdGF0YWhlYWQgaXMgb24gZm9yCisgKiB0aGlzIGRpcmVjdG9yeS4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKmxsX3NhaV9nZXQoc3RydWN0IGlub2RlICpkaXIpCit7CisJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhkaXIpOworCXN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpID0gTlVMTDsKKworCXNwaW5fbG9jaygmbGxpLT5sbGlfc2FfbG9jayk7CisJc2FpID0gbGxpLT5sbGlfc2FpOworCWlmIChzYWkpCisJCWF0b21pY19pbmMoJnNhaS0+c2FpX3JlZmNvdW50KTsKKwlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7CisKIAlyZXR1cm4gc2FpOwogfQogCisvKgorICogcHV0IHNhaSByZWZjb3VudCBhZnRlciB1c2UsIGlmIHJlZmNvdW50IHJlYWNoZXMgemVybywgZnJlZSBzYWkgYW5kIHNhX2VudHJpZXMKKyAqIGF0dGFjaGVkIHRvIGl0LgorICovCiBzdGF0aWMgdm9pZCBsbF9zYWlfcHV0KHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpKQogewotCXN0cnVjdCBpbm9kZQkgKmlub2RlID0gc2FpLT5zYWlfaW5vZGU7Ci0Jc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSAgID0gbGxfaTJpbmZvKGlub2RlKTsKKwlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKHNhaS0+c2FpX2RlbnRyeS0+ZF9pbm9kZSk7CiAKIAlpZiAoYXRvbWljX2RlY19hbmRfbG9jaygmc2FpLT5zYWlfcmVmY291bnQsICZsbGktPmxsaV9zYV9sb2NrKSkgewotCQlzdHJ1Y3QgbGxfc2FfZW50cnkgKmVudHJ5LCAqbmV4dDsKLQotCQlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJnNhaS0+c2FpX3JlZmNvdW50KSA+IDApKSB7Ci0JCQkvKiBJdCBpcyByYWNlIGNhc2UsIHRoZSBpbnRlcnByZXQgY2FsbGJhY2sganVzdCBob2xkCi0JCQkgKiBhIHJlZmVyZW5jZSBjb3VudAotCQkJICovCi0JCQlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMQVNTRVJUKCFsbGktPmxsaV9vcGVuZGlyX2tleSk7Ci0JCUxBU1NFUlQodGhyZWFkX2lzX3N0b3BwZWQoJnNhaS0+c2FpX3RocmVhZCkpOwotCQlMQVNTRVJUKHRocmVhZF9pc19zdG9wcGVkKCZzYWktPnNhaV9hZ2xfdGhyZWFkKSk7CisJCXN0cnVjdCBsbF9zYl9pbmZvICpzYmkgPSBsbF9pMnNiaShzYWktPnNhaV9kZW50cnktPmRfaW5vZGUpOworCQlzdHJ1Y3Qgc2FfZW50cnkgKmVudHJ5LCAqbmV4dDsKIAogCQlsbGktPmxsaV9zYWkgPSBOVUxMOwotCQlsbGktPmxsaV9vcGVuZGlyX3BpZCA9IDA7CiAJCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKIAotCQlpZiAoc2FpLT5zYWlfc2VudCA+IHNhaS0+c2FpX3JlcGxpZWQpCi0JCQlDREVCVUcoRF9SRUFEQSwgInN0YXRhaGVhZCBmb3IgZGlyICJERklECi0JCQkgICAgICAiIGRvZXMgbm90IGZpbmlzaDogW3NlbnQ6JWxsdV0gW3JlcGxpZWQ6JWxsdV1cbiIsCi0JCQkgICAgICBQRklEKCZsbGktPmxsaV9maWQpLAotCQkJICAgICAgc2FpLT5zYWlfc2VudCwgc2FpLT5zYWlfcmVwbGllZCk7CisJCUxBU1NFUlQodGhyZWFkX2lzX3N0b3BwZWQoJnNhaS0+c2FpX3RocmVhZCkpOworCQlMQVNTRVJUKHRocmVhZF9pc19zdG9wcGVkKCZzYWktPnNhaV9hZ2xfdGhyZWFkKSk7CisJCUxBU1NFUlQoc2FpLT5zYWlfc2VudCA9PSBzYWktPnNhaV9yZXBsaWVkKTsKKwkJTEFTU0VSVCghc2FfaGFzX2NhbGxiYWNrKHNhaSkpOwogCiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbnRyeSwgbmV4dCwgJnNhaS0+c2FpX2VudHJpZXMsCi0JCQkJCSBzZV9saW5rKQotCQkJZG9fc2FfZW50cnlfZmluaShzYWksIGVudHJ5KTsKLQotCQlMQVNTRVJUKGxpc3RfZW1wdHkoJnNhaS0+c2FpX2VudHJpZXMpKTsKLQkJTEFTU0VSVChsaXN0X2VtcHR5KCZzYWktPnNhaV9lbnRyaWVzX3JlY2VpdmVkKSk7Ci0JCUxBU1NFUlQobGlzdF9lbXB0eSgmc2FpLT5zYWlfZW50cmllc19zdGF0ZWQpKTsKKwkJCQkJIHNlX2xpc3QpCisJCQlzYV9raWxsKHNhaSwgZW50cnkpOwogCiAJCUxBU1NFUlQoYXRvbWljX3JlYWQoJnNhaS0+c2FpX2NhY2hlX2NvdW50KSA9PSAwKTsKLQkJTEFTU0VSVChsaXN0X2VtcHR5KCZzYWktPnNhaV9lbnRyaWVzX2FnbCkpOworCQlMQVNTRVJUKGxpc3RfZW1wdHkoJnNhaS0+c2FpX2FnbHMpKTsKIAotCQlpcHV0KGlub2RlKTsKLQkJa2ZyZWUoc2FpKTsKKwkJbGxfc2FpX2ZyZWUoc2FpKTsKKwkJYXRvbWljX2RlYygmc2JpLT5sbF9zYV9ydW5uaW5nKTsKIAl9CiB9CiAKLS8qIERvIE5PVCBmb3JnZXQgdG8gZHJvcCBpbm9kZSByZWZjb3VudCB3aGVuIGludG8gc2FpX2VudHJpZXNfYWdsLiAqLworLyogRG8gTk9UIGZvcmdldCB0byBkcm9wIGlub2RlIHJlZmNvdW50IHdoZW4gaW50byBzYWlfYWdscy4gKi8KIHN0YXRpYyB2b2lkIGxsX2FnbF90cmlnZ2VyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpKQogewogCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgICA9IGxsX2kyaW5mbyhpbm9kZSk7CkBAIC01ODgsMjkgKzUzOSwyMSBAQAogCWlwdXQoaW5vZGUpOwogfQogCi1zdGF0aWMgdm9pZCBsbF9wb3N0X3N0YXRhaGVhZChzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSkKKy8qCisgKiBwcmVwYXJlIGlub2RlIGZvciBzYSBlbnRyeSwgYWRkIGl0IGludG8gYWdsIGxpc3QsIG5vdyBzYV9lbnRyeSBpcyByZWFkeQorICogdG8gYmUgdXNlZCBieSBzY2FubmVyIHByb2Nlc3MuCisgKi8KK3N0YXRpYyB2b2lkIHNhX2luc3RhbnRpYXRlKHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpLAorCQkJICAgc3RydWN0IHNhX2VudHJ5ICplbnRyeSkKIHsKLQlzdHJ1Y3QgaW5vZGUJICAgKmRpciAgID0gc2FpLT5zYWlfaW5vZGU7CisJc3RydWN0IGlub2RlICpkaXIgPSBzYWktPnNhaV9kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IGlub2RlCSAgICpjaGlsZDsKLQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAgICpsbGkgICA9IGxsX2kyaW5mbyhkaXIpOwotCXN0cnVjdCBsbF9zYV9lbnRyeSAgICAgKmVudHJ5OwogCXN0cnVjdCBtZF9lbnF1ZXVlX2luZm8gKm1pbmZvOwogCXN0cnVjdCBsb29rdXBfaW50ZW50ICAgKml0OwogCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAgKnJlcTsKIAlzdHJ1Y3QgbWR0X2JvZHkJKmJvZHk7CiAJaW50CQkgICAgIHJjICAgID0gMDsKIAotCXNwaW5fbG9jaygmbGxpLT5sbGlfc2FfbG9jayk7Ci0JaWYgKHVubGlrZWx5KGxpc3RfZW1wdHkoJnNhaS0+c2FpX2VudHJpZXNfcmVjZWl2ZWQpKSkgewotCQlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7Ci0JCXJldHVybjsKLQl9Ci0JZW50cnkgPSBsaXN0X2VudHJ5KHNhaS0+c2FpX2VudHJpZXNfcmVjZWl2ZWQubmV4dCwKLQkJCSAgIHN0cnVjdCBsbF9zYV9lbnRyeSwgc2VfbGlzdCk7Ci0JYXRvbWljX2luYygmZW50cnktPnNlX3JlZmNvdW50KTsKLQlsaXN0X2RlbF9pbml0KCZlbnRyeS0+c2VfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOwotCiAJTEFTU0VSVChlbnRyeS0+c2VfaGFuZGxlICE9IDApOwogCiAJbWluZm8gPSBlbnRyeS0+c2VfbWluZm87CkBAIC02MzIsNyArNTc1LDcgQEAKIAkJLyogWFhYOiBObyBmaWQgaW4gcmVwbHksIHRoaXMgaXMgcHJvYmFibHkgY3Jvc3MtcmVmIGNhc2UuCiAJCSAqIFNBIGNhbid0IGhhbmRsZSBpdCB5ZXQuCiAJCSAqLwotCQlpZiAoYm9keS0+dmFsaWQgJiBPQkRfTURfTURTKSB7CisJCWlmIChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfTURTKSB7CiAJCQlyYyA9IC1FQUdBSU47CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtNjQxLDcgKzU4NCw3IEBACiAJCSAqIHJldmFsaWRhdGUuCiAJCSAqLwogCQkvKiB1bmxpbmtlZCBhbmQgcmUtY3JlYXRlZCB3aXRoIHRoZSBzYW1lIG5hbWUgKi8KLQkJaWYgKHVubGlrZWx5KCFsdV9maWRfZXEoJm1pbmZvLT5taV9kYXRhLm9wX2ZpZDIsICZib2R5LT5maWQxKSkpIHsKKwkJaWYgKHVubGlrZWx5KCFsdV9maWRfZXEoJm1pbmZvLT5taV9kYXRhLm9wX2ZpZDIsICZib2R5LT5tYm9fZmlkMSkpKSB7CiAJCQllbnRyeS0+c2VfaW5vZGUgPSBOVUxMOwogCQkJaXB1dChjaGlsZCk7CiAJCQljaGlsZCA9IE5VTEw7CkBAIC02NTksOCArNjAyLDkgQEAKIAlpZiAocmMpCiAJCWdvdG8gb3V0OwogCi0JQ0RFQlVHKERfRExNVFJBQ0UsICIlczogc2V0dGluZyBsX2RhdGEgdG8gaW5vZGUgIkRGSUQiJXBcbiIsCisJQ0RFQlVHKERfUkVBREEsICIlczogc2V0dGluZyAlLipzIiBERklEICIgbF9kYXRhIHRvIGlub2RlICVwXG4iLAogCSAgICAgICBsbF9nZXRfZnNuYW1lKGNoaWxkLT5pX3NiLCBOVUxMLCAwKSwKKwkgICAgICAgZW50cnktPnNlX3FzdHIubGVuLCBlbnRyeS0+c2VfcXN0ci5uYW1lLAogCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChjaGlsZCkpLCBjaGlsZCk7CiAJbGxfc2V0X2xvY2tfZGF0YShsbF9pMnNiaShkaXIpLT5sbF9tZF9leHAsIGNoaWxkLCBpdCwgTlVMTCk7CiAKQEAgLTY3MCwzNCArNjE0LDc1IEBACiAJCWxsX2FnbF9hZGQoc2FpLCBjaGlsZCwgZW50cnktPnNlX2luZGV4KTsKIAogb3V0OgotCS8qIFRoZSAibGxfc2FfZW50cnlfdG9fc3RhdGVkKCkiIHdpbGwgZHJvcCByZWxhdGVkIGxkbG0gaWJpdHMgbG9jawotCSAqIHJlZmVyZW5jZSBjb3VudCBieSBjYWxsaW5nICJsbF9pbnRlbnRfZHJvcF9sb2NrKCkiIGluIHNwaXRlIG9mIHRoZQotCSAqIGFib3ZlIG9wZXJhdGlvbnMgZmFpbGVkIG9yIG5vdC4gRG8gbm90IHdvcnJ5IGFib3V0IGNhbGxpbmcKLQkgKiAibGxfaW50ZW50X2Ryb3BfbG9jaygpIiBtb3JlIHRoYW4gb25jZS4KKwkvKgorCSAqIHNhX21ha2VfcmVhZHkoKSB3aWxsIGRyb3AgbGRsbSBpYml0cyBsb2NrIHJlZmNvdW50IGJ5IGNhbGxpbmcKKwkgKiBsbF9pbnRlbnRfZHJvcF9sb2NrKCkgaW4gc3BpdGUgb2YgZmFpbHVyZXMuIERvIG5vdCB3b3JyeSBhYm91dAorCSAqIGNhbGxpbmcgbGxfaW50ZW50X2Ryb3BfbG9jaygpIG1vcmUgdGhhbiBvbmNlLgogCSAqLwotCXJjID0gbGxfc2FfZW50cnlfdG9fc3RhdGVkKHNhaSwgZW50cnksCi0JCQkJICAgcmMgPCAwID8gU0FfRU5UUllfSU5WQSA6IFNBX0VOVFJZX1NVQ0MpOwotCWlmIChyYyA9PSAwICYmIGVudHJ5LT5zZV9pbmRleCA9PSBzYWktPnNhaV9pbmRleF93YWl0KQotCQl3YWtlX3VwKCZzYWktPnNhaV93YWl0cSk7Ci0JbGxfc2FfZW50cnlfcHV0KHNhaSwgZW50cnkpOworCXNhX21ha2VfcmVhZHkoc2FpLCBlbnRyeSwgcmMpOwogfQogCisvKiBvbmNlIHRoZXJlIGFyZSBhc3luYyBzdGF0IHJlcGxpZXMsIGluc3RhbnRpYXRlIHNhX2VudHJ5IGZyb20gcmVwbGllcyAqLworc3RhdGljIHZvaWQgc2FfaGFuZGxlX2NhbGxiYWNrKHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpKQoreworCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGk7CisKKwlsbGkgPSBsbF9pMmluZm8oc2FpLT5zYWlfZGVudHJ5LT5kX2lub2RlKTsKKworCXdoaWxlIChzYV9oYXNfY2FsbGJhY2soc2FpKSkgeworCQlzdHJ1Y3Qgc2FfZW50cnkgKmVudHJ5OworCisJCXNwaW5fbG9jaygmbGxpLT5sbGlfc2FfbG9jayk7CisJCWlmICh1bmxpa2VseSghc2FfaGFzX2NhbGxiYWNrKHNhaSkpKSB7CisJCQlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7CisJCQlicmVhazsKKwkJfQorCQllbnRyeSA9IGxpc3RfZW50cnkoc2FpLT5zYWlfaW50ZXJpbV9lbnRyaWVzLm5leHQsCisJCQkJICAgc3RydWN0IHNhX2VudHJ5LCBzZV9saXN0KTsKKwkJbGlzdF9kZWxfaW5pdCgmZW50cnktPnNlX2xpc3QpOworCQlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7CisKKwkJc2FfaW5zdGFudGlhdGUoc2FpLCBlbnRyeSk7CisJfQorfQorCisvKgorICogY2FsbGJhY2sgZm9yIGFzeW5jIHN0YXQsIGJlY2F1c2UgdGhpcyBpcyBjYWxsZWQgaW4gcHRscnBjZCBjb250ZXh0LCB3ZSBvbmx5CisgKiBwdXQgc2FfZW50cnkgaW4gc2FpX2NiX2VudHJpZXMgbGlzdCwgYW5kIGxldCBzYV9oYW5kbGVfY2FsbGJhY2soKSB0byByZWFsbHkKKyAqIHByZXBhcmUgaW5vZGUgYW5kIGluc3RhbnRpYXRlIHNhX2VudHJ5IGxhdGVyLgorICovCiBzdGF0aWMgaW50IGxsX3N0YXRhaGVhZF9pbnRlcnByZXQoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsCiAJCQkJICBzdHJ1Y3QgbWRfZW5xdWV1ZV9pbmZvICptaW5mbywgaW50IHJjKQogewogCXN0cnVjdCBsb29rdXBfaW50ZW50ICAgICAqaXQgID0gJm1pbmZvLT5taV9pdDsKIAlzdHJ1Y3QgaW5vZGUJICAgICAqZGlyID0gbWluZm8tPm1pX2RpcjsKIAlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAgICAgKmxsaSA9IGxsX2kyaW5mbyhkaXIpOwotCXN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpID0gTlVMTDsKLQlzdHJ1Y3QgbGxfc2FfZW50cnkgICAgICAgKmVudHJ5OwotCV9fdTY0CQkJICBoYW5kbGUgPSAwOwotCWludAkJICAgICAgIHdha2V1cDsKKwlzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSA9IGxsaS0+bGxpX3NhaTsKKwlzdHJ1Y3Qgc2FfZW50cnkgKmVudHJ5ID0gKHN0cnVjdCBzYV9lbnRyeSAqKW1pbmZvLT5taV9jYmRhdGE7CisJX191NjQgaGFuZGxlID0gMDsKKwlib29sIHdha2V1cDsKIAogCWlmIChpdF9kaXNwb3NpdGlvbihpdCwgRElTUF9MT09LVVBfTkVHKSkKIAkJcmMgPSAtRU5PRU5UOwogCi0JaWYgKHJjID09IDApIHsKLQkJLyogcmVsZWFzZSBpYml0cyBsb2NrIEFTQVAgdG8gYXZvaWQgZGVhZGxvY2sgd2hlbiBzdGF0YWhlYWQKKwkvKgorCSAqIGJlY2F1c2Ugc3RhdGFoZWFkIHRocmVhZCB3aWxsIHdhaXQgZm9yIGFsbCBpbmZsaWdodCBSUEMgdG8gZmluaXNoLAorCSAqIHNhaSBzaG91bGQgYmUgYWx3YXlzIHZhbGlkLCBubyBuZWVkIHRvIHJlZmNvdW50CisJICovCisJTEFTU0VSVChzYWkpOworCUxBU1NFUlQoIXRocmVhZF9pc19zdG9wcGVkKCZzYWktPnNhaV90aHJlYWQpKTsKKwlMQVNTRVJUKGVudHJ5KTsKKworCUNERUJVRyhEX1JFQURBLCAic2FfZW50cnkgJS4qcyByYyAlZFxuIiwKKwkgICAgICAgZW50cnktPnNlX3FzdHIubGVuLCBlbnRyeS0+c2VfcXN0ci5uYW1lLCByYyk7CisKKwlpZiAocmMpIHsKKwkJbGxfaW50ZW50X3JlbGVhc2UoaXQpOworCQlpcHV0KGRpcik7CisJCWtmcmVlKG1pbmZvKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiByZWxlYXNlIGliaXRzIGxvY2sgQVNBUCB0byBhdm9pZCBkZWFkbG9jayB3aGVuIHN0YXRhaGVhZAogCQkgKiB0aHJlYWQgZW5xdWV1ZXMgbG9jayBvbiBwYXJlbnQgaW4gcmVhZGRpciBhbmQgYW5vdGhlcgogCQkgKiBwcm9jZXNzIGVucXVldWVzIGxvY2sgb24gY2hpbGQgd2l0aCBwYXJlbnQgbG9jayBoZWxkLCBlZy4KIAkJICogdW5saW5rLgpAQCAtNzA3LDY1ICs2OTIsMzIgQEAKIAl9CiAKIAlzcGluX2xvY2soJmxsaS0+bGxpX3NhX2xvY2spOwotCS8qIHN0YWxlIGVudHJ5ICovCi0JaWYgKHVubGlrZWx5KCFsbGktPmxsaV9zYWkgfHwKLQkJICAgICBsbGktPmxsaV9zYWktPnNhaV9nZW5lcmF0aW9uICE9IG1pbmZvLT5taV9nZW5lcmF0aW9uKSkgewotCQlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7Ci0JCXJjID0gLUVTVEFMRTsKLQkJZ290byBvdXQ7CisJaWYgKHJjKSB7CisJCXdha2V1cCA9IF9fc2FfbWFrZV9yZWFkeShzYWksIGVudHJ5LCByYyk7CiAJfSBlbHNlIHsKLQkJc2FpID0gbGxfc2FpX2dldChsbGktPmxsaV9zYWkpOwotCQlpZiAodW5saWtlbHkoIXRocmVhZF9pc19ydW5uaW5nKCZzYWktPnNhaV90aHJlYWQpKSkgewotCQkJc2FpLT5zYWlfcmVwbGllZCsrOwotCQkJc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOwotCQkJcmMgPSAtRUJBREZEOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQllbnRyeSA9IGxsX3NhX2VudHJ5X2dldF9ieWluZGV4KHNhaSwgbWluZm8tPm1pX2NiZGF0YSk7Ci0JCWlmICghZW50cnkpIHsKLQkJCXNhaS0+c2FpX3JlcGxpZWQrKzsKLQkJCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKLQkJCXJjID0gLUVJRFJNOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlpZiAocmMgIT0gMCkgewotCQkJZG9fc2FfZW50cnlfdG9fc3RhdGVkKHNhaSwgZW50cnksIFNBX0VOVFJZX0lOVkEpOwotCQkJd2FrZXVwID0gKGVudHJ5LT5zZV9pbmRleCA9PSBzYWktPnNhaV9pbmRleF93YWl0KTsKLQkJfSBlbHNlIHsKLQkJCWVudHJ5LT5zZV9taW5mbyA9IG1pbmZvOwotCQkJZW50cnktPnNlX3JlcSA9IHB0bHJwY19yZXF1ZXN0X2FkZHJlZihyZXEpOwotCQkJLyogUmVsZWFzZSB0aGUgYXN5bmMgaWJpdHMgbG9jayBBU0FQIHRvIGF2b2lkIGRlYWRsb2NrCi0JCQkgKiB3aGVuIHN0YXRhaGVhZCB0aHJlYWQgdHJpZXMgdG8gZW5xdWV1ZSBsb2NrIG9uIHBhcmVudAotCQkJICogZm9yIHJlYWRwYWdlIGFuZCBvdGhlciB0cmllcyB0byBlbnF1ZXVlIGxvY2sgb24gY2hpbGQKLQkJCSAqIHdpdGggcGFyZW50J3MgbG9jayBoZWxkLCBmb3IgZXhhbXBsZTogdW5saW5rLgotCQkJICovCi0JCQllbnRyeS0+c2VfaGFuZGxlID0gaGFuZGxlOwotCQkJd2FrZXVwID0gbGlzdF9lbXB0eSgmc2FpLT5zYWlfZW50cmllc19yZWNlaXZlZCk7Ci0JCQlsaXN0X2FkZF90YWlsKCZlbnRyeS0+c2VfbGlzdCwKLQkJCQkgICAgICAmc2FpLT5zYWlfZW50cmllc19yZWNlaXZlZCk7Ci0JCX0KLQkJc2FpLT5zYWlfcmVwbGllZCsrOwotCQlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7Ci0KLQkJbGxfc2FfZW50cnlfcHV0KHNhaSwgZW50cnkpOwotCQlpZiAod2FrZXVwKQotCQkJd2FrZV91cCgmc2FpLT5zYWlfdGhyZWFkLnRfY3RsX3dhaXRxKTsKKwkJZW50cnktPnNlX21pbmZvID0gbWluZm87CisJCWVudHJ5LT5zZV9yZXEgPSBwdGxycGNfcmVxdWVzdF9hZGRyZWYocmVxKTsKKwkJLyoKKwkJICogUmVsZWFzZSB0aGUgYXN5bmMgaWJpdHMgbG9jayBBU0FQIHRvIGF2b2lkIGRlYWRsb2NrCisJCSAqIHdoZW4gc3RhdGFoZWFkIHRocmVhZCB0cmllcyB0byBlbnF1ZXVlIGxvY2sgb24gcGFyZW50CisJCSAqIGZvciByZWFkcGFnZSBhbmQgb3RoZXIgdHJpZXMgdG8gZW5xdWV1ZSBsb2NrIG9uIGNoaWxkCisJCSAqIHdpdGggcGFyZW50J3MgbG9jayBoZWxkLCBmb3IgZXhhbXBsZTogdW5saW5rLgorCQkgKi8KKwkJZW50cnktPnNlX2hhbmRsZSA9IGhhbmRsZTsKKwkJd2FrZXVwID0gIXNhX2hhc19jYWxsYmFjayhzYWkpOworCQlsaXN0X2FkZF90YWlsKCZlbnRyeS0+c2VfbGlzdCwgJnNhaS0+c2FpX2ludGVyaW1fZW50cmllcyk7CiAJfQorCXNhaS0+c2FpX3JlcGxpZWQrKzsKIAotb3V0OgotCWlmIChyYyAhPSAwKSB7Ci0JCWxsX2ludGVudF9yZWxlYXNlKGl0KTsKLQkJaXB1dChkaXIpOwotCQlrZnJlZShtaW5mbyk7Ci0JfQotCWlmIChzYWkpCi0JCWxsX3NhaV9wdXQoc2FpKTsKKwlpZiAod2FrZXVwKQorCQl3YWtlX3VwKCZzYWktPnNhaV90aHJlYWQudF9jdGxfd2FpdHEpOworCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKKwogCXJldHVybiByYzsKIH0KIAotc3RhdGljIHZvaWQgc2FfYXJnc19maW5pKHN0cnVjdCBtZF9lbnF1ZXVlX2luZm8gKm1pbmZvLAorLyogZmluaXNoIGFzeW5jIHN0YXQgUlBDIGFyZ3VtZW50cyAqLworc3RhdGljIHZvaWQgc2FfZmluaV9kYXRhKHN0cnVjdCBtZF9lbnF1ZXVlX2luZm8gKm1pbmZvLAogCQkJIHN0cnVjdCBsZGxtX2VucXVldWVfaW5mbyAqZWluZm8pCiB7CiAJTEFTU0VSVChtaW5mbyAmJiBlaW5mbyk7CkBAIC03NzcsMTIgKzcyOSwxMSBAQAogLyoqCiAgKiBwcmVwYXJlIGFyZ3VtZW50cyBmb3IgYXN5bmMgc3RhdCBSUEMuCiAgKi8KLXN0YXRpYyBpbnQgc2FfYXJnc19pbml0KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgaW5vZGUgKmNoaWxkLAotCQkJc3RydWN0IGxsX3NhX2VudHJ5ICplbnRyeSwgc3RydWN0IG1kX2VucXVldWVfaW5mbyAqKnBtaSwKK3N0YXRpYyBpbnQgc2FfcHJlcF9kYXRhKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgaW5vZGUgKmNoaWxkLAorCQkJc3RydWN0IHNhX2VudHJ5ICplbnRyeSwgc3RydWN0IG1kX2VucXVldWVfaW5mbyAqKnBtaSwKIAkJCXN0cnVjdCBsZGxtX2VucXVldWVfaW5mbyAqKnBlaSkKIHsKIAljb25zdCBzdHJ1Y3QgcXN0ciAgICAgICpxc3RyID0gJmVudHJ5LT5zZV9xc3RyOwotCXN0cnVjdCBsbF9pbm9kZV9pbmZvICAgICAqbGxpICA9IGxsX2kyaW5mbyhkaXIpOwogCXN0cnVjdCBtZF9lbnF1ZXVlX2luZm8gICAqbWluZm87CiAJc3RydWN0IGxkbG1fZW5xdWV1ZV9pbmZvICplaW5mbzsKIAlzdHJ1Y3QgbWRfb3BfZGF0YQkqb3BfZGF0YTsKQEAgLTgwOCw4ICs3NTksNyBAQAogCW1pbmZvLT5taV9pdC5pdF9vcCA9IElUX0dFVEFUVFI7CiAJbWluZm8tPm1pX2RpciA9IGlncmFiKGRpcik7CiAJbWluZm8tPm1pX2NiID0gbGxfc3RhdGFoZWFkX2ludGVycHJldDsKLQltaW5mby0+bWlfZ2VuZXJhdGlvbiA9IGxsaS0+bGxpX3NhaS0+c2FpX2dlbmVyYXRpb247Ci0JbWluZm8tPm1pX2NiZGF0YSA9IGVudHJ5LT5zZV9pbmRleDsKKwltaW5mby0+bWlfY2JkYXRhID0gZW50cnk7CiAKIAllaW5mby0+ZWlfdHlwZSAgID0gTERMTV9JQklUUzsKIAllaW5mby0+ZWlfbW9kZSAgID0gaXRfdG9fbG9ja19tb2RlKCZtaW5mby0+bWlfaXQpOwpAQCAtODI0LDMxICs3NzQsMzMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkb19zYV9sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBsbF9zYV9lbnRyeSAqZW50cnkpCisvKiBhc3luYyBzdGF0IGZvciBmaWxlIG5vdCBmb3VuZCBpbiBkY2FjaGUgKi8KK3N0YXRpYyBpbnQgc2FfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3Qgc2FfZW50cnkgKmVudHJ5KQogewogCXN0cnVjdCBtZF9lbnF1ZXVlX2luZm8gICAqbWluZm87CiAJc3RydWN0IGxkbG1fZW5xdWV1ZV9pbmZvICplaW5mbzsKIAlpbnQJCSAgICAgICByYzsKIAotCXJjID0gc2FfYXJnc19pbml0KGRpciwgTlVMTCwgZW50cnksICZtaW5mbywgJmVpbmZvKTsKKwlyYyA9IHNhX3ByZXBfZGF0YShkaXIsIE5VTEwsIGVudHJ5LCAmbWluZm8sICZlaW5mbyk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKIAlyYyA9IG1kX2ludGVudF9nZXRhdHRyX2FzeW5jKGxsX2kybWRleHAoZGlyKSwgbWluZm8sIGVpbmZvKTsKLQlpZiAocmMgPCAwKQotCQlzYV9hcmdzX2ZpbmkobWluZm8sIGVpbmZvKTsKKwlpZiAocmMpCisJCXNhX2ZpbmlfZGF0YShtaW5mbywgZWluZm8pOwogCiAJcmV0dXJuIHJjOwogfQogCiAvKioKLSAqIHNpbWlsYXIgdG8gbGxfcmV2YWxpZGF0ZV9pdCgpLgotICogXHJldHZhbCAgICAgIDEgLS0gZGVudHJ5IHZhbGlkCi0gKiBccmV0dmFsICAgICAgMCAtLSB3aWxsIHNlbmQgc3RhdC1haGVhZCByZXF1ZXN0Ci0gKiBccmV0dmFsIG90aGVycyAtLSBwcmVwYXJlIHN0YXQtYWhlYWQgcmVxdWVzdCBmYWlsZWQKKyAqIGFzeW5jIHN0YXQgZm9yIGZpbGUgZm91bmQgaW4gZGNhY2hlLCBzaW1pbGFyIHRvIC5yZXZhbGlkYXRlCisgKgorICogXHJldHZhbAkxIGRlbnRyeSB2YWxpZCwgbm8gUlBDIHNlbnQKKyAqIFxyZXR2YWwJMCBkZW50cnkgaW52YWxpZCwgd2lsbCBzZW5kIGFzeW5jIHN0YXQgUlBDCisgKiBccmV0dmFsCW5lZ2F0aXZlIG51bWJlciB1cG9uIGVycm9yCiAgKi8KLXN0YXRpYyBpbnQgZG9fc2FfcmV2YWxpZGF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGxsX3NhX2VudHJ5ICplbnRyeSwKLQkJCSAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCitzdGF0aWMgaW50IHNhX3JldmFsaWRhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBzYV9lbnRyeSAqZW50cnksCisJCQkgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCXN0cnVjdCBpbm9kZQkgICAgICppbm9kZSA9IGRfaW5vZGUoZGVudHJ5KTsKIAlzdHJ1Y3QgbG9va3VwX2ludGVudCAgICAgIGl0ID0geyAuaXRfb3AgPSBJVF9HRVRBVFRSLApAQCAtODcyLDcgKzgyNCw3IEBACiAJCXJldHVybiAxOwogCX0KIAotCXJjID0gc2FfYXJnc19pbml0KGRpciwgaW5vZGUsIGVudHJ5LCAmbWluZm8sICZlaW5mbyk7CisJcmMgPSBzYV9wcmVwX2RhdGEoZGlyLCBpbm9kZSwgZW50cnksICZtaW5mbywgJmVpbmZvKTsKIAlpZiAocmMpIHsKIAkJZW50cnktPnNlX2lub2RlID0gTlVMTDsKIAkJaXB1dChpbm9kZSk7CkBAIC04ODAsNTYgKzgzMiw1MCBAQAogCX0KIAogCXJjID0gbWRfaW50ZW50X2dldGF0dHJfYXN5bmMobGxfaTJtZGV4cChkaXIpLCBtaW5mbywgZWluZm8pOwotCWlmIChyYyA8IDApIHsKKwlpZiAocmMpIHsKIAkJZW50cnktPnNlX2lub2RlID0gTlVMTDsKIAkJaXB1dChpbm9kZSk7Ci0JCXNhX2FyZ3NfZmluaShtaW5mbywgZWluZm8pOworCQlzYV9maW5pX2RhdGEobWluZm8sIGVpbmZvKTsKIAl9CiAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyB2b2lkIGxsX3N0YXRhaGVhZF9vbmUoc3RydWN0IGRlbnRyeSAqcGFyZW50LCBjb25zdCBjaGFyICplbnRyeV9uYW1lLAotCQkJICAgICBpbnQgZW50cnlfbmFtZV9sZW4pCisvKiBhc3luYyBzdGF0IGZvciBmaWxlIHdpdGggQG5hbWUgKi8KK3N0YXRpYyB2b2lkIHNhX3N0YXRhaGVhZChzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4pCiB7CiAJc3RydWN0IGlub2RlCSAgICAgKmRpciAgICA9IGRfaW5vZGUocGFyZW50KTsKIAlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAgICAgKmxsaSAgICA9IGxsX2kyaW5mbyhkaXIpOwogCXN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpICAgID0gbGxpLT5sbGlfc2FpOwogCXN0cnVjdCBkZW50cnkJICAgICpkZW50cnkgPSBOVUxMOwotCXN0cnVjdCBsbF9zYV9lbnRyeSAgICAgICAqZW50cnk7CisJc3RydWN0IHNhX2VudHJ5ICplbnRyeTsKIAlpbnQJCSAgICAgICByYzsKLQlpbnQJCSAgICAgICByYzE7CiAKLQllbnRyeSA9IGxsX3NhX2VudHJ5X2FsbG9jKHBhcmVudCwgc2FpLCBzYWktPnNhaV9pbmRleCwgZW50cnlfbmFtZSwKLQkJCQkgIGVudHJ5X25hbWVfbGVuKTsKKwllbnRyeSA9IHNhX2FsbG9jKHBhcmVudCwgc2FpLCBzYWktPnNhaV9pbmRleCwgbmFtZSwgbGVuKTsKIAlpZiAoSVNfRVJSKGVudHJ5KSkKIAkJcmV0dXJuOwogCiAJZGVudHJ5ID0gZF9sb29rdXAocGFyZW50LCAmZW50cnktPnNlX3FzdHIpOwogCWlmICghZGVudHJ5KSB7Ci0JCXJjID0gZG9fc2FfbG9va3VwKGRpciwgZW50cnkpOworCQlyYyA9IHNhX2xvb2t1cChkaXIsIGVudHJ5KTsKIAl9IGVsc2UgewotCQlyYyA9IGRvX3NhX3JldmFsaWRhdGUoZGlyLCBlbnRyeSwgZGVudHJ5KTsKKwkJcmMgPSBzYV9yZXZhbGlkYXRlKGRpciwgZW50cnksIGRlbnRyeSk7CiAJCWlmIChyYyA9PSAxICYmIGFnbF9zaG91bGRfcnVuKHNhaSwgZF9pbm9kZShkZW50cnkpKSkKIAkJCWxsX2FnbF9hZGQoc2FpLCBkX2lub2RlKGRlbnRyeSksIGVudHJ5LT5zZV9pbmRleCk7CisJfQogCisJaWYgKGRlbnRyeSkKIAkJZHB1dChkZW50cnkpOwotCX0KIAotCWlmIChyYykgewotCQlyYzEgPSBsbF9zYV9lbnRyeV90b19zdGF0ZWQoc2FpLCBlbnRyeSwKLQkJCQkJcmMgPCAwID8gU0FfRU5UUllfSU5WQSA6IFNBX0VOVFJZX1NVQ0MpOwotCQlpZiAocmMxID09IDAgJiYgZW50cnktPnNlX2luZGV4ID09IHNhaS0+c2FpX2luZGV4X3dhaXQpCi0JCQl3YWtlX3VwKCZzYWktPnNhaV93YWl0cSk7Ci0JfSBlbHNlIHsKKwlpZiAocmMpCisJCXNhX21ha2VfcmVhZHkoc2FpLCBlbnRyeSwgcmMpOworCWVsc2UKIAkJc2FpLT5zYWlfc2VudCsrOwotCX0KIAogCXNhaS0+c2FpX2luZGV4Kys7Ci0JLyogZHJvcCBvbmUgcmVmY291bnQgb24gZW50cnkgYnkgbGxfc2FfZW50cnlfYWxsb2MgKi8KLQlsbF9zYV9lbnRyeV9wdXQoc2FpLCBlbnRyeSk7CiB9CiAKKy8qIGFzeW5jIGdsaW1wc2UgKGFnbCkgdGhyZWFkIG1haW4gZnVuY3Rpb24gKi8KIHN0YXRpYyBpbnQgbGxfYWdsX3RocmVhZCh2b2lkICphcmcpCiB7CiAJc3RydWN0IGRlbnRyeQkgICAgKnBhcmVudCA9IGFyZzsKQEAgLTkzNywxMCArODgzLDEyIEBACiAJc3RydWN0IGxsX2lub2RlX2luZm8gICAgICpwbGxpICAgPSBsbF9pMmluZm8oZGlyKTsKIAlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAgICAgKmNsbGk7CiAJc3RydWN0IGxsX3NiX2luZm8JKnNiaSAgICA9IGxsX2kyc2JpKGRpcik7Ci0Jc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWkgICAgPSBsbF9zYWlfZ2V0KHBsbGktPmxsaV9zYWkpOwotCXN0cnVjdCBwdGxycGNfdGhyZWFkICAgICAqdGhyZWFkID0gJnNhaS0+c2FpX2FnbF90aHJlYWQ7CisJc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWk7CisJc3RydWN0IHB0bHJwY190aHJlYWQgKnRocmVhZDsKIAlzdHJ1Y3QgbF93YWl0X2luZm8JbHdpICAgID0geyAwIH07CiAKKwlzYWkgPSBsbF9zYWlfZ2V0KGRpcik7CisJdGhyZWFkID0gJnNhaS0+c2FpX2FnbF90aHJlYWQ7CiAJdGhyZWFkLT50X3BpZCA9IGN1cnJlbnRfcGlkKCk7CiAJQ0RFQlVHKERfUkVBREEsICJhZ2wgdGhyZWFkIHN0YXJ0ZWQ6IHNhaSAlcCwgcGFyZW50ICVwZFxuIiwKIAkgICAgICAgc2FpLCBwYXJlbnQpOwpAQCAtOTU5LDcgKzkwNyw3IEBACiAKIAl3aGlsZSAoMSkgewogCQlsX3dhaXRfZXZlbnQodGhyZWFkLT50X2N0bF93YWl0cSwKLQkJCSAgICAgIWxpc3RfZW1wdHkoJnNhaS0+c2FpX2VudHJpZXNfYWdsKSB8fAorCQkJICAgICAhbGlzdF9lbXB0eSgmc2FpLT5zYWlfYWdscykgfHwKIAkJCSAgICAgIXRocmVhZF9pc19ydW5uaW5nKHRocmVhZCksCiAJCQkgICAgICZsd2kpOwogCkBAIC05NzAsOCArOTE4LDggQEAKIAkJLyogVGhlIHN0YXRhaGVhZCB0aHJlYWQgbWF5YmUgaGVscCB0byBwcm9jZXNzIEFHTCBlbnRyaWVzLAogCQkgKiBzbyBjaGVjayB3aGV0aGVyIGxpc3QgZW1wdHkgYWdhaW4uCiAJCSAqLwotCQlpZiAoIWxpc3RfZW1wdHkoJnNhaS0+c2FpX2VudHJpZXNfYWdsKSkgewotCQkJY2xsaSA9IGxpc3RfZW50cnkoc2FpLT5zYWlfZW50cmllc19hZ2wubmV4dCwKKwkJaWYgKCFsaXN0X2VtcHR5KCZzYWktPnNhaV9hZ2xzKSkgeworCQkJY2xsaSA9IGxpc3RfZW50cnkoc2FpLT5zYWlfYWdscy5uZXh0LAogCQkJCQkgIHN0cnVjdCBsbF9pbm9kZV9pbmZvLCBsbGlfYWdsX2xpc3QpOwogCQkJbGlzdF9kZWxfaW5pdCgmY2xsaS0+bGxpX2FnbF9saXN0KTsKIAkJCXNwaW5fdW5sb2NrKCZwbGxpLT5sbGlfYWdsX2xvY2spOwpAQCAtOTgzLDggKzkzMSw4IEBACiAKIAlzcGluX2xvY2soJnBsbGktPmxsaV9hZ2xfbG9jayk7CiAJc2FpLT5zYWlfYWdsX3ZhbGlkID0gMDsKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJnNhaS0+c2FpX2VudHJpZXNfYWdsKSkgewotCQljbGxpID0gbGlzdF9lbnRyeShzYWktPnNhaV9lbnRyaWVzX2FnbC5uZXh0LAorCXdoaWxlICghbGlzdF9lbXB0eSgmc2FpLT5zYWlfYWdscykpIHsKKwkJY2xsaSA9IGxpc3RfZW50cnkoc2FpLT5zYWlfYWdscy5uZXh0LAogCQkJCSAgc3RydWN0IGxsX2lub2RlX2luZm8sIGxsaV9hZ2xfbGlzdCk7CiAJCWxpc3RfZGVsX2luaXQoJmNsbGktPmxsaV9hZ2xfbGlzdCk7CiAJCXNwaW5fdW5sb2NrKCZwbGxpLT5sbGlfYWdsX2xvY2spOwpAQCAtMTAwMSw2ICs5NDksNyBAQAogCXJldHVybiAwOwogfQogCisvKiBzdGFydCBhZ2wgdGhyZWFkICovCiBzdGF0aWMgdm9pZCBsbF9zdGFydF9hZ2woc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSkKIHsKIAlzdHJ1Y3QgcHRscnBjX3RocmVhZCAqdGhyZWFkID0gJnNhaS0+c2FpX2FnbF90aHJlYWQ7CkBAIC0xMDI1LDU4ICs5NzQsNzEgQEAKIAkJICAgICAmbHdpKTsKIH0KIAorLyogc3RhdGFoZWFkIHRocmVhZCBtYWluIGZ1bmN0aW9uICovCiBzdGF0aWMgaW50IGxsX3N0YXRhaGVhZF90aHJlYWQodm9pZCAqYXJnKQogewogCXN0cnVjdCBkZW50cnkJICAgICpwYXJlbnQgPSBhcmc7CiAJc3RydWN0IGlub2RlCSAgICAgKmRpciAgICA9IGRfaW5vZGUocGFyZW50KTsKLQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAgICAgKnBsbGkgICA9IGxsX2kyaW5mbyhkaXIpOwotCXN0cnVjdCBsbF9pbm9kZV9pbmZvICAgICAqY2xsaTsKKwlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAgICAgKmxsaSAgID0gbGxfaTJpbmZvKGRpcik7CiAJc3RydWN0IGxsX3NiX2luZm8JKnNiaSAgICA9IGxsX2kyc2JpKGRpcik7Ci0Jc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWkgICAgPSBsbF9zYWlfZ2V0KHBsbGktPmxsaV9zYWkpOwotCXN0cnVjdCBwdGxycGNfdGhyZWFkICAgICAqdGhyZWFkID0gJnNhaS0+c2FpX3RocmVhZDsKLQlzdHJ1Y3QgcHRscnBjX3RocmVhZCAqYWdsX3RocmVhZCA9ICZzYWktPnNhaV9hZ2xfdGhyZWFkOwotCXN0cnVjdCBwYWdlCSAgICAgICpwYWdlOworCXN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpOworCXN0cnVjdCBwdGxycGNfdGhyZWFkICpzYV90aHJlYWQ7CisJc3RydWN0IHB0bHJwY190aHJlYWQgKmFnbF90aHJlYWQ7CisJc3RydWN0IHBhZ2UJICAgICAgKnBhZ2UgPSBOVUxMOwogCV9fdTY0CQkgICAgIHBvcyAgICA9IDA7CiAJaW50CQkgICAgICAgZmlyc3QgID0gMDsKIAlpbnQJCSAgICAgICByYyAgICAgPSAwOwotCXN0cnVjdCBsbF9kaXJfY2hhaW4gICAgICAgY2hhaW47CisJc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGE7CiAJc3RydWN0IGxfd2FpdF9pbmZvCWx3aSAgICA9IHsgMCB9OwogCi0JdGhyZWFkLT50X3BpZCA9IGN1cnJlbnRfcGlkKCk7CisJc2FpID0gbGxfc2FpX2dldChkaXIpOworCXNhX3RocmVhZCA9ICZzYWktPnNhaV90aHJlYWQ7CisJYWdsX3RocmVhZCA9ICZzYWktPnNhaV9hZ2xfdGhyZWFkOworCXNhX3RocmVhZC0+dF9waWQgPSBjdXJyZW50X3BpZCgpOwogCUNERUJVRyhEX1JFQURBLCAic3RhdGFoZWFkIHRocmVhZCBzdGFydGluZzogc2FpICVwLCBwYXJlbnQgJXBkXG4iLAogCSAgICAgICBzYWksIHBhcmVudCk7CiAKKwlvcF9kYXRhID0gbGxfcHJlcF9tZF9vcF9kYXRhKE5VTEwsIGRpciwgZGlyLCBOVUxMLCAwLCAwLAorCQkJCSAgICAgTFVTVFJFX09QQ19BTlksIGRpcik7CisJaWYgKElTX0VSUihvcF9kYXRhKSkgeworCQlyYyA9IFBUUl9FUlIob3BfZGF0YSk7CisJCWdvdG8gb3V0OworCX0KKworCW9wX2RhdGEtPm9wX21heF9wYWdlcyA9IGxsX2kyc2JpKGRpciktPmxsX21kX2Jyd19wYWdlczsKKwogCWlmIChzYmktPmxsX2ZsYWdzICYgTExfU0JJX0FHTF9FTkFCTEVEKQogCQlsbF9zdGFydF9hZ2wocGFyZW50LCBzYWkpOwogCiAJYXRvbWljX2luYygmc2JpLT5sbF9zYV90b3RhbCk7Ci0Jc3Bpbl9sb2NrKCZwbGxpLT5sbGlfc2FfbG9jayk7Ci0JaWYgKHRocmVhZF9pc19pbml0KHRocmVhZCkpCisJc3Bpbl9sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKKwlpZiAodGhyZWFkX2lzX2luaXQoc2FfdGhyZWFkKSkKIAkJLyogSWYgc29tZW9uZSBlbHNlIGhhcyBjaGFuZ2VkIHRoZSB0aHJlYWQgc3RhdGUKIAkJICogKGUuZy4gYWxyZWFkeSBjaGFuZ2VkIHRvIFNWQ19TVE9QUElORyksIHdlIGNhbid0IGp1c3QKIAkJICogYmxpbmRseSBvdmVyd3JpdGUgdGhhdCBzZXR0aW5nLgogCQkgKi8KLQkJdGhyZWFkX3NldF9mbGFncyh0aHJlYWQsIFNWQ19SVU5OSU5HKTsKLQlzcGluX3VubG9jaygmcGxsaS0+bGxpX3NhX2xvY2spOwotCXdha2VfdXAoJnRocmVhZC0+dF9jdGxfd2FpdHEpOworCQl0aHJlYWRfc2V0X2ZsYWdzKHNhX3RocmVhZCwgU1ZDX1JVTk5JTkcpOworCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKKwl3YWtlX3VwKCZzYV90aHJlYWQtPnRfY3RsX3dhaXRxKTsKIAotCWxsX2Rpcl9jaGFpbl9pbml0KCZjaGFpbik7Ci0JcGFnZSA9IGxsX2dldF9kaXJfcGFnZShkaXIsIHBvcywgJmNoYWluKTsKLQotCXdoaWxlICgxKSB7CisJd2hpbGUgKHBvcyAhPSBNRFNfRElSX0VORF9PRkYgJiYgdGhyZWFkX2lzX3J1bm5pbmcoc2FfdGhyZWFkKSkgewogCQlzdHJ1Y3QgbHVfZGlycGFnZSAqZHA7CiAJCXN0cnVjdCBsdV9kaXJlbnQgICplbnQ7CiAKKwkJc2FpLT5zYWlfaW5fcmVhZHBhZ2UgPSAxOworCQlwYWdlID0gbGxfZ2V0X2Rpcl9wYWdlKGRpciwgb3BfZGF0YSwgcG9zKTsKKwkJc2FpLT5zYWlfaW5fcmVhZHBhZ2UgPSAwOwogCQlpZiAoSVNfRVJSKHBhZ2UpKSB7CiAJCQlyYyA9IFBUUl9FUlIocGFnZSk7Ci0JCQlDREVCVUcoRF9SRUFEQSwgImVycm9yIHJlYWRpbmcgZGlyICJERklEIiBhdCAlbGx1LyVsbHU6IFtyYyAlZF0gW3BhcmVudCAldV1cbiIsCisJCQlDREVCVUcoRF9SRUFEQSwgImVycm9yIHJlYWRpbmcgZGlyICJERklEIiBhdCAlbGx1LyVsbHU6IG9wZW5kaXJfcGlkID0gJXU6IHJjID0gJWRcbiIsCiAJCQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoZGlyKSksIHBvcywgc2FpLT5zYWlfaW5kZXgsCi0JCQkgICAgICAgcmMsIHBsbGktPmxsaV9vcGVuZGlyX3BpZCk7Ci0JCQlnb3RvIG91dDsKKwkJCSAgICAgICBsbGktPmxsaV9vcGVuZGlyX3BpZCwgcmMpOworCQkJYnJlYWs7CiAJCX0KIAogCQlkcCA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKLQkJZm9yIChlbnQgPSBsdV9kaXJlbnRfc3RhcnQoZHApOyBlbnQ7CisJCWZvciAoZW50ID0gbHVfZGlyZW50X3N0YXJ0KGRwKTsKKwkJICAgICBlbnQgJiYgdGhyZWFkX2lzX3J1bm5pbmcoc2FfdGhyZWFkKSAmJiAhc2FfbG93X2hpdChzYWkpOwogCQkgICAgIGVudCA9IGx1X2RpcmVudF9uZXh0KGVudCkpIHsKIAkJCV9fdTY0IGhhc2g7CiAJCQlpbnQgbmFtZWxlbjsKQEAgLTExMjMsMTIzICsxMDg1LDc5IEBACiAJCQlpZiAodW5saWtlbHkoKytmaXJzdCA9PSAxKSkKIAkJCQljb250aW51ZTsKIAota2VlcF9pdDoKLQkJCWxfd2FpdF9ldmVudCh0aHJlYWQtPnRfY3RsX3dhaXRxLAotCQkJCSAgICAgIXNhX3NlbnRfZnVsbChzYWkpIHx8Ci0JCQkJICAgICAhbGlzdF9lbXB0eSgmc2FpLT5zYWlfZW50cmllc19yZWNlaXZlZCkgfHwKLQkJCQkgICAgICFsaXN0X2VtcHR5KCZzYWktPnNhaV9lbnRyaWVzX2FnbCkgfHwKLQkJCQkgICAgICF0aHJlYWRfaXNfcnVubmluZyh0aHJlYWQpLAotCQkJCSAgICAgJmx3aSk7CisJCQkvKiB3YWl0IGZvciBzcGFyZSBzdGF0YWhlYWQgd2luZG93ICovCisJCQlkbyB7CisJCQkJbF93YWl0X2V2ZW50KHNhX3RocmVhZC0+dF9jdGxfd2FpdHEsCisJCQkJCSAgICAgIXNhX3NlbnRfZnVsbChzYWkpIHx8CisJCQkJCSAgICAgc2FfaGFzX2NhbGxiYWNrKHNhaSkgfHwKKwkJCQkJICAgICAhbGlzdF9lbXB0eSgmc2FpLT5zYWlfYWdscykgfHwKKwkJCQkJICAgICAhdGhyZWFkX2lzX3J1bm5pbmcoc2FfdGhyZWFkKSwKKwkJCQkJICAgICAmbHdpKTsKKwkJCQlzYV9oYW5kbGVfY2FsbGJhY2soc2FpKTsKIAotaW50ZXJwcmV0X2l0OgotCQkJd2hpbGUgKCFsaXN0X2VtcHR5KCZzYWktPnNhaV9lbnRyaWVzX3JlY2VpdmVkKSkKLQkJCQlsbF9wb3N0X3N0YXRhaGVhZChzYWkpOworCQkJCXNwaW5fbG9jaygmbGxpLT5sbGlfYWdsX2xvY2spOworCQkJCXdoaWxlIChzYV9zZW50X2Z1bGwoc2FpKSAmJgorCQkJCSAgICAgICAhYWdsX2xpc3RfZW1wdHkoc2FpKSkgeworCQkJCQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqY2xsaTsKIAotCQkJaWYgKHVubGlrZWx5KCF0aHJlYWRfaXNfcnVubmluZyh0aHJlYWQpKSkgewotCQkJCWxsX3JlbGVhc2VfcGFnZShwYWdlLCAwKTsKLQkJCQlyYyA9IDA7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0KLQkJCS8qIElmIG5vIHdpbmRvdyBmb3IgbWV0YWRhdGEgc3RhdGFoZWFkLCBidXQgdGhlcmUgYXJlCi0JCQkgKiBzb21lIEFHTCBlbnRyaWVzIHRvIGJlIHRyaWdnZXJlZCwgdGhlbiB0cnkgdG8gaGVscAotCQkJICogdG8gcHJvY2VzcyB0aGUgQUdMIGVudHJpZXMuCi0JCQkgKi8KLQkJCWlmIChzYV9zZW50X2Z1bGwoc2FpKSkgewotCQkJCXNwaW5fbG9jaygmcGxsaS0+bGxpX2FnbF9sb2NrKTsKLQkJCQl3aGlsZSAoIWxpc3RfZW1wdHkoJnNhaS0+c2FpX2VudHJpZXNfYWdsKSkgewotCQkJCQljbGxpID0gbGlzdF9lbnRyeShzYWktPnNhaV9lbnRyaWVzX2FnbC5uZXh0LAorCQkJCQljbGxpID0gbGlzdF9lbnRyeShzYWktPnNhaV9hZ2xzLm5leHQsCiAJCQkJCQkJICBzdHJ1Y3QgbGxfaW5vZGVfaW5mbywgbGxpX2FnbF9saXN0KTsKIAkJCQkJbGlzdF9kZWxfaW5pdCgmY2xsaS0+bGxpX2FnbF9saXN0KTsKLQkJCQkJc3Bpbl91bmxvY2soJnBsbGktPmxsaV9hZ2xfbG9jayk7CisJCQkJCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9hZ2xfbG9jayk7CisKIAkJCQkJbGxfYWdsX3RyaWdnZXIoJmNsbGktPmxsaV92ZnNfaW5vZGUsCiAJCQkJCQkgICAgICAgc2FpKTsKIAotCQkJCQlpZiAoIWxpc3RfZW1wdHkoJnNhaS0+c2FpX2VudHJpZXNfcmVjZWl2ZWQpKQotCQkJCQkJZ290byBpbnRlcnByZXRfaXQ7Ci0KLQkJCQkJaWYgKHVubGlrZWx5KAotCQkJCQkJIXRocmVhZF9pc19ydW5uaW5nKHRocmVhZCkpKSB7Ci0JCQkJCQlsbF9yZWxlYXNlX3BhZ2UocGFnZSwgMCk7Ci0JCQkJCQlyYyA9IDA7Ci0JCQkJCQlnb3RvIG91dDsKLQkJCQkJfQotCi0JCQkJCWlmICghc2Ffc2VudF9mdWxsKHNhaSkpCi0JCQkJCQlnb3RvIGRvX2l0OwotCi0JCQkJCXNwaW5fbG9jaygmcGxsaS0+bGxpX2FnbF9sb2NrKTsKKwkJCQkJc3Bpbl9sb2NrKCZsbGktPmxsaV9hZ2xfbG9jayk7CiAJCQkJfQotCQkJCXNwaW5fdW5sb2NrKCZwbGxpLT5sbGlfYWdsX2xvY2spOworCQkJCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9hZ2xfbG9jayk7CisJCQl9IHdoaWxlIChzYV9zZW50X2Z1bGwoc2FpKSAmJgorCQkJCSB0aHJlYWRfaXNfcnVubmluZyhzYV90aHJlYWQpKTsKIAotCQkJCWdvdG8ga2VlcF9pdDsKLQkJCX0KLQotZG9faXQ6Ci0JCQlsbF9zdGF0YWhlYWRfb25lKHBhcmVudCwgbmFtZSwgbmFtZWxlbik7CisJCQlzYV9zdGF0YWhlYWQocGFyZW50LCBuYW1lLCBuYW1lbGVuKTsKIAkJfQorCiAJCXBvcyA9IGxlNjRfdG9fY3B1KGRwLT5sZHBfaGFzaF9lbmQpOwotCQlpZiAocG9zID09IE1EU19ESVJfRU5EX09GRikgewotCQkJLyoKLQkJCSAqIEVuZCBvZiBkaXJlY3RvcnkgcmVhY2hlZC4KLQkJCSAqLwotCQkJbGxfcmVsZWFzZV9wYWdlKHBhZ2UsIDApOwotCQkJd2hpbGUgKDEpIHsKLQkJCQlsX3dhaXRfZXZlbnQodGhyZWFkLT50X2N0bF93YWl0cSwKLQkJCQkJICAgICAhbGlzdF9lbXB0eSgmc2FpLT5zYWlfZW50cmllc19yZWNlaXZlZCkgfHwKLQkJCQkJICAgICBzYWktPnNhaV9zZW50ID09IHNhaS0+c2FpX3JlcGxpZWQgfHwKLQkJCQkJICAgICAhdGhyZWFkX2lzX3J1bm5pbmcodGhyZWFkKSwKLQkJCQkJICAgICAmbHdpKTsKKwkJbGxfcmVsZWFzZV9wYWdlKGRpciwgcGFnZSwKKwkJCQlsZTMyX3RvX2NwdShkcC0+bGRwX2ZsYWdzKSAmIExERl9DT0xMSURFKTsKIAotCQkJCXdoaWxlICghbGlzdF9lbXB0eSgmc2FpLT5zYWlfZW50cmllc19yZWNlaXZlZCkpCi0JCQkJCWxsX3Bvc3Rfc3RhdGFoZWFkKHNhaSk7Ci0KLQkJCQlpZiAodW5saWtlbHkoIXRocmVhZF9pc19ydW5uaW5nKHRocmVhZCkpKSB7Ci0JCQkJCXJjID0gMDsKLQkJCQkJZ290byBvdXQ7Ci0JCQkJfQotCi0JCQkJaWYgKHNhaS0+c2FpX3NlbnQgPT0gc2FpLT5zYWlfcmVwbGllZCAmJgotCQkJCSAgICBsaXN0X2VtcHR5KCZzYWktPnNhaV9lbnRyaWVzX3JlY2VpdmVkKSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCXNwaW5fbG9jaygmcGxsaS0+bGxpX2FnbF9sb2NrKTsKLQkJCXdoaWxlICghbGlzdF9lbXB0eSgmc2FpLT5zYWlfZW50cmllc19hZ2wpICYmCi0JCQkgICAgICAgdGhyZWFkX2lzX3J1bm5pbmcodGhyZWFkKSkgewotCQkJCWNsbGkgPSBsaXN0X2VudHJ5KHNhaS0+c2FpX2VudHJpZXNfYWdsLm5leHQsCi0JCQkJCQkgIHN0cnVjdCBsbF9pbm9kZV9pbmZvLCBsbGlfYWdsX2xpc3QpOwotCQkJCWxpc3RfZGVsX2luaXQoJmNsbGktPmxsaV9hZ2xfbGlzdCk7Ci0JCQkJc3Bpbl91bmxvY2soJnBsbGktPmxsaV9hZ2xfbG9jayk7Ci0JCQkJbGxfYWdsX3RyaWdnZXIoJmNsbGktPmxsaV92ZnNfaW5vZGUsIHNhaSk7Ci0JCQkJc3Bpbl9sb2NrKCZwbGxpLT5sbGlfYWdsX2xvY2spOwotCQkJfQotCQkJc3Bpbl91bmxvY2soJnBsbGktPmxsaV9hZ2xfbG9jayk7Ci0KLQkJCXJjID0gMDsKLQkJCWdvdG8gb3V0OwotCQl9IGVsc2UgaWYgKDEpIHsKLQkJCS8qCi0JCQkgKiBjaGFpbiBpcyBleGhhdXN0ZWQuCi0JCQkgKiBOb3JtYWwgY2FzZTogY29udGludWUgdG8gdGhlIG5leHQgcGFnZS4KLQkJCSAqLwotCQkJbGxfcmVsZWFzZV9wYWdlKHBhZ2UsIGxlMzJfdG9fY3B1KGRwLT5sZHBfZmxhZ3MpICYKLQkJCQkJICAgICAgTERGX0NPTExJREUpOwotCQkJcGFnZSA9IGxsX2dldF9kaXJfcGFnZShkaXIsIHBvcywgJmNoYWluKTsKLQkJfSBlbHNlIHsKLQkJCUxBU1NFUlQobGUzMl90b19jcHUoZHAtPmxkcF9mbGFncykgJiBMREZfQ09MTElERSk7Ci0JCQlsbF9yZWxlYXNlX3BhZ2UocGFnZSwgMSk7Ci0JCQkvKgotCQkJICogZ28gaW50byBvdmVyZmxvdyBwYWdlLgotCQkJICovCisJCWlmIChzYV9sb3dfaGl0KHNhaSkpIHsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWF0b21pY19pbmMoJnNiaS0+bGxfc2Ffd3JvbmcpOworCQkJQ0RFQlVHKERfUkVBREEsICJTdGF0YWhlYWQgZm9yIGRpciAiREZJRCIgaGl0IHJhdGlvIHRvbyBsb3c6IGhpdC9taXNzICVsbHUvJWxsdSwgc2VudC9yZXBsaWVkICVsbHUvJWxsdSwgc3RvcHBpbmcgc3RhdGFoZWFkIHRocmVhZDogcGlkICVkXG4iLAorCQkJICAgICAgIFBGSUQoJmxsaS0+bGxpX2ZpZCksIHNhaS0+c2FpX2hpdCwKKwkJCSAgICAgICBzYWktPnNhaV9taXNzLCBzYWktPnNhaV9zZW50LAorCQkJICAgICAgIHNhaS0+c2FpX3JlcGxpZWQsIGN1cnJlbnRfcGlkKCkpOworCQkJYnJlYWs7CiAJCX0KIAl9CisJbGxfZmluaXNoX21kX29wX2RhdGEob3BfZGF0YSk7CiAKKwlpZiAocmMgPCAwKSB7CisJCXNwaW5fbG9jaygmbGxpLT5sbGlfc2FfbG9jayk7CisJCXRocmVhZF9zZXRfZmxhZ3Moc2FfdGhyZWFkLCBTVkNfU1RPUFBJTkcpOworCQlsbGktPmxsaV9zYV9lbmFibGVkID0gMDsKKwkJc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOworCX0KKworCS8qCisJICogc3RhdGFoZWFkIGlzIGZpbmlzaGVkLCBidXQgc3RhdGFoZWFkIGVudHJpZXMgbmVlZCB0byBiZSBjYWNoZWQsIHdhaXQKKwkgKiBmb3IgZmlsZSByZWxlYXNlIHRvIHN0b3AgbWUuCisJICovCisJd2hpbGUgKHRocmVhZF9pc19ydW5uaW5nKHNhX3RocmVhZCkpIHsKKwkJbF93YWl0X2V2ZW50KHNhX3RocmVhZC0+dF9jdGxfd2FpdHEsCisJCQkgICAgIHNhX2hhc19jYWxsYmFjayhzYWkpIHx8CisJCQkgICAgICFhZ2xfbGlzdF9lbXB0eShzYWkpIHx8CisJCQkgICAgICF0aHJlYWRfaXNfcnVubmluZyhzYV90aHJlYWQpLAorCQkJICAgICAmbHdpKTsKKworCQlzYV9oYW5kbGVfY2FsbGJhY2soc2FpKTsKKwl9CiBvdXQ6CiAJaWYgKHNhaS0+c2FpX2FnbF92YWxpZCkgewotCQlzcGluX2xvY2soJnBsbGktPmxsaV9hZ2xfbG9jayk7CisJCXNwaW5fbG9jaygmbGxpLT5sbGlfYWdsX2xvY2spOwogCQl0aHJlYWRfc2V0X2ZsYWdzKGFnbF90aHJlYWQsIFNWQ19TVE9QUElORyk7Ci0JCXNwaW5fdW5sb2NrKCZwbGxpLT5sbGlfYWdsX2xvY2spOworCQlzcGluX3VubG9jaygmbGxpLT5sbGlfYWdsX2xvY2spOwogCQl3YWtlX3VwKCZhZ2xfdGhyZWFkLT50X2N0bF93YWl0cSk7CiAKIAkJQ0RFQlVHKERfUkVBREEsICJzdG9wIGFnbCB0aHJlYWQ6IHNhaSAlcCBwaWQgJXVcbiIsCkBAIC0xMjQ5LDg0ICsxMTY3LDkzIEBACiAJCQkgICAgICZsd2kpOwogCX0gZWxzZSB7CiAJCS8qIFNldCBhZ2xfdGhyZWFkIGZsYWdzIGFueXdheS4gKi8KLQkJdGhyZWFkX3NldF9mbGFncygmc2FpLT5zYWlfYWdsX3RocmVhZCwgU1ZDX1NUT1BQRUQpOworCQl0aHJlYWRfc2V0X2ZsYWdzKGFnbF90aHJlYWQsIFNWQ19TVE9QUEVEKTsKIAl9Ci0JbGxfZGlyX2NoYWluX2ZpbmkoJmNoYWluKTsKLQlzcGluX2xvY2soJnBsbGktPmxsaV9zYV9sb2NrKTsKLQlpZiAoIWxpc3RfZW1wdHkoJnNhaS0+c2FpX2VudHJpZXNfcmVjZWl2ZWQpKSB7Ci0JCXRocmVhZF9zZXRfZmxhZ3ModGhyZWFkLCBTVkNfU1RPUFBJTkcpOwotCQlzcGluX3VubG9jaygmcGxsaS0+bGxpX3NhX2xvY2spOwogCi0JCS8qIFRvIHJlbGVhc2UgdGhlIHJlc291cmNlcyBoZWxkIGJ5IHJlY2VpdmVkIGVudHJpZXMuICovCi0JCXdoaWxlICghbGlzdF9lbXB0eSgmc2FpLT5zYWlfZW50cmllc19yZWNlaXZlZCkpCi0JCQlsbF9wb3N0X3N0YXRhaGVhZChzYWkpOwotCi0JCXNwaW5fbG9jaygmcGxsaS0+bGxpX3NhX2xvY2spOworCS8qCisJICogd2FpdCBmb3IgaW5mbGlnaHQgc3RhdGFoZWFkIFJQQ3MgdG8gZmluaXNoLCBhbmQgdGhlbiB3ZSBjYW4gZnJlZSBzYWkKKwkgKiBzYWZlbHkgYmVjYXVzZSBzdGF0YWhlYWQgUlBDIHdpbGwgYWNjZXNzIHNhaSBkYXRhCisJICovCisJd2hpbGUgKHNhaS0+c2FpX3NlbnQgIT0gc2FpLT5zYWlfcmVwbGllZCkgeworCQkvKiBpbiBjYXNlIHdlJ3JlIG5vdCB3b2tlbiB1cCwgdGltZW91dCB3YWl0ICovCisJCWx3aSA9IExXSV9USU1FT1VUKG1zZWNzX3RvX2ppZmZpZXMoTVNFQ19QRVJfU0VDID4+IDMpLAorCQkJCSAgTlVMTCwgTlVMTCk7CisJCWxfd2FpdF9ldmVudChzYV90aHJlYWQtPnRfY3RsX3dhaXRxLAorCQkJICAgICBzYWktPnNhaV9zZW50ID09IHNhaS0+c2FpX3JlcGxpZWQsICZsd2kpOwogCX0KLQl0aHJlYWRfc2V0X2ZsYWdzKHRocmVhZCwgU1ZDX1NUT1BQRUQpOwotCXNwaW5fdW5sb2NrKCZwbGxpLT5sbGlfc2FfbG9jayk7Ci0Jd2FrZV91cCgmc2FpLT5zYWlfd2FpdHEpOwotCXdha2VfdXAoJnRocmVhZC0+dF9jdGxfd2FpdHEpOwotCWxsX3NhaV9wdXQoc2FpKTsKLQlkcHV0KHBhcmVudCk7CisKKwkvKiByZWxlYXNlIHJlc291cmNlcyBoZWxkIGJ5IHN0YXRhaGVhZCBSUENzICovCisJc2FfaGFuZGxlX2NhbGxiYWNrKHNhaSk7CisKKwlzcGluX2xvY2soJmxsaS0+bGxpX3NhX2xvY2spOworCXRocmVhZF9zZXRfZmxhZ3Moc2FfdGhyZWFkLCBTVkNfU1RPUFBFRCk7CisJc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOworCiAJQ0RFQlVHKERfUkVBREEsICJzdGF0YWhlYWQgdGhyZWFkIHN0b3BwZWQ6IHNhaSAlcCwgcGFyZW50ICVwZFxuIiwKIAkgICAgICAgc2FpLCBwYXJlbnQpOworCisJd2FrZV91cCgmc2FpLT5zYWlfd2FpdHEpOworCXdha2VfdXAoJnNhX3RocmVhZC0+dF9jdGxfd2FpdHEpOworCWxsX3NhaV9wdXQoc2FpKTsKKwogCXJldHVybiByYzsKIH0KIAotLyoqCi0gKiBjYWxsZWQgaW4gbGxfZmlsZV9yZWxlYXNlKCkuCi0gKi8KLXZvaWQgbGxfc3RvcF9zdGF0YWhlYWQoc3RydWN0IGlub2RlICpkaXIsIHZvaWQgKmtleSkKKy8qIGF1dGhvcml6ZSBvcGVuZWQgZGlyIGhhbmRsZSBAa2V5IHRvIHN0YXRhaGVhZCAqLwordm9pZCBsbF9hdXRob3JpemVfc3RhdGFoZWFkKHN0cnVjdCBpbm9kZSAqZGlyLCB2b2lkICprZXkpCiB7CiAJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhkaXIpOwogCi0JaWYgKHVubGlrZWx5KCFrZXkpKQotCQlyZXR1cm47CisJc3Bpbl9sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKKwlpZiAoIWxsaS0+bGxpX29wZW5kaXJfa2V5ICYmICFsbGktPmxsaV9zYWkpIHsKKwkJLyoKKwkJICogaWYgbGxpX3NhaSBpcyBub3QgTlVMTCwgaXQgbWVhbnMgcHJldmlvdXMgc3RhdGFoZWFkIGlzIG5vdAorCQkgKiBmaW5pc2hlZCB5ZXQsIHdlJ2QgYmV0dGVyIG5vdCBzdGFydCBhIG5ldyBzdGF0YWhlYWQgZm9yIG5vdy4KKwkJICovCisJCUxBU1NFUlQoIWxsaS0+bGxpX29wZW5kaXJfcGlkKTsKKwkJbGxpLT5sbGlfb3BlbmRpcl9rZXkgPSBrZXk7CisJCWxsaS0+bGxpX29wZW5kaXJfcGlkID0gY3VycmVudF9waWQoKTsKKwkJbGxpLT5sbGlfc2FfZW5hYmxlZCA9IDE7CisJfQorCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKK30KKworLyoKKyAqIGRlYXV0aG9yaXplIG9wZW5lZCBkaXIgaGFuZGxlIEBrZXkgdG8gc3RhdGFoZWFkLCBidXQgc3RhdGFoZWFkIHRocmVhZCBtYXkKKyAqIHN0aWxsIGJlIHJ1bm5pbmcsIG5vdGlmeSBpdCB0byBxdWl0LgorICovCit2b2lkIGxsX2RlYXV0aG9yaXplX3N0YXRhaGVhZChzdHJ1Y3QgaW5vZGUgKmRpciwgdm9pZCAqa2V5KQoreworCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oZGlyKTsKKwlzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaTsKKworCUxBU1NFUlQobGxpLT5sbGlfb3BlbmRpcl9rZXkgPT0ga2V5KTsKKwlMQVNTRVJUKGxsaS0+bGxpX29wZW5kaXJfcGlkKTsKKworCUNERUJVRyhEX1JFQURBLCAiZGVhdXRob3JpemUgc3RhdGFoZWFkIGZvciAiREZJRCJcbiIsCisJICAgICAgIFBGSUQoJmxsaS0+bGxpX2ZpZCkpOwogCiAJc3Bpbl9sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKLQlpZiAobGxpLT5sbGlfb3BlbmRpcl9rZXkgIT0ga2V5IHx8IGxsaS0+bGxpX29wZW5kaXJfcGlkID09IDApIHsKLQkJc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOwotCQlyZXR1cm47Ci0JfQotCiAJbGxpLT5sbGlfb3BlbmRpcl9rZXkgPSBOVUxMOwotCi0JaWYgKGxsaS0+bGxpX3NhaSkgewotCQlzdHJ1Y3QgbF93YWl0X2luZm8gbHdpID0geyAwIH07Ci0JCXN0cnVjdCBwdGxycGNfdGhyZWFkICp0aHJlYWQgPSAmbGxpLT5sbGlfc2FpLT5zYWlfdGhyZWFkOwotCi0JCWlmICghdGhyZWFkX2lzX3N0b3BwZWQodGhyZWFkKSkgewotCQkJdGhyZWFkX3NldF9mbGFncyh0aHJlYWQsIFNWQ19TVE9QUElORyk7Ci0JCQlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7Ci0JCQl3YWtlX3VwKCZ0aHJlYWQtPnRfY3RsX3dhaXRxKTsKLQotCQkJQ0RFQlVHKERfUkVBREEsICJzdG9wIHN0YXRhaGVhZCB0aHJlYWQ6IHNhaSAlcCBwaWQgJXVcbiIsCi0JCQkgICAgICAgbGxpLT5sbGlfc2FpLCAodW5zaWduZWQgaW50KXRocmVhZC0+dF9waWQpOwotCQkJbF93YWl0X2V2ZW50KHRocmVhZC0+dF9jdGxfd2FpdHEsCi0JCQkJICAgICB0aHJlYWRfaXNfc3RvcHBlZCh0aHJlYWQpLAotCQkJCSAgICAgJmx3aSk7Ci0JCX0gZWxzZSB7Ci0JCQlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7Ci0JCX0KLQorCWxsaS0+bGxpX29wZW5kaXJfcGlkID0gMDsKKwlsbGktPmxsaV9zYV9lbmFibGVkID0gMDsKKwlzYWkgPSBsbGktPmxsaV9zYWk7CisJaWYgKHNhaSAmJiB0aHJlYWRfaXNfcnVubmluZygmc2FpLT5zYWlfdGhyZWFkKSkgewogCQkvKgotCQkgKiBQdXQgdGhlIHJlZiB3aGljaCB3YXMgaGVsZCB3aGVuIGZpcnN0IHN0YXRhaGVhZF9lbnRlci4KLQkJICogSXQgbWF5YmUgbm90IHRoZSBsYXN0IHJlZiBmb3Igc29tZSBzdGF0YWhlYWQgcmVxdWVzdHMKLQkJICogbWF5YmUgaW5mbGlnaHQuCisJCSAqIHN0YXRhaGVhZCB0aHJlYWQgbWF5IG5vdCBxdWl0IHlldCBiZWNhdXNlIGl0IG5lZWRzIHRvIGNhY2hlCisJCSAqIGVudHJpZXMsIG5vdyBpdCdzIHRpbWUgdG8gdGVsbCBpdCB0byBxdWl0LgogCQkgKi8KLQkJbGxfc2FpX3B1dChsbGktPmxsaV9zYWkpOwotCX0gZWxzZSB7Ci0JCWxsaS0+bGxpX29wZW5kaXJfcGlkID0gMDsKLQkJc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOworCQl0aHJlYWRfc2V0X2ZsYWdzKCZzYWktPnNhaV90aHJlYWQsIFNWQ19TVE9QUElORyk7CisJCXdha2VfdXAoJnNhaS0+c2FpX3RocmVhZC50X2N0bF93YWl0cSk7CiAJfQorCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKIH0KIAogZW51bSB7CiAJLyoqCiAJICogbm90IGZpcnN0IGRpcmVudCwgb3IgaXMgIi4iCiAJICovCi0JTFNfTk9ORV9GSVJTVF9ERSA9IDAsCisJTFNfTk9UX0ZJUlNUX0RFID0gMCwKIAkvKioKIAkgKiB0aGUgZmlyc3Qgbm9uLWhpZGRlbiBkaXJlbnQKIAkgKi8KQEAgLTEzMzcsMTcgKzEyNjQsMjYgQEAKIAlMU19GSVJTVF9ET1RfREUKIH07CiAKKy8qIGZpbGUgaXMgZmlyc3QgZGlyZW50IHVuZGVyIEBkaXIgKi8KIHN0YXRpYyBpbnQgaXNfZmlyc3RfZGlyZW50KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7Ci0Jc3RydWN0IGxsX2Rpcl9jaGFpbiAgIGNoYWluOwogCWNvbnN0IHN0cnVjdCBxc3RyICAqdGFyZ2V0ID0gJmRlbnRyeS0+ZF9uYW1lOworCXN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhOwogCXN0cnVjdCBwYWdlCSAgKnBhZ2U7CiAJX191NjQJCSBwb3MgICAgPSAwOwogCWludAkJICAgZG90X2RlOwotCWludAkJICAgcmMgICAgID0gTFNfTk9ORV9GSVJTVF9ERTsKKwlpbnQgcmMgPSBMU19OT1RfRklSU1RfREU7CiAKLQlsbF9kaXJfY2hhaW5faW5pdCgmY2hhaW4pOwotCXBhZ2UgPSBsbF9nZXRfZGlyX3BhZ2UoZGlyLCBwb3MsICZjaGFpbik7CisJb3BfZGF0YSA9IGxsX3ByZXBfbWRfb3BfZGF0YShOVUxMLCBkaXIsIGRpciwgTlVMTCwgMCwgMCwKKwkJCQkgICAgIExVU1RSRV9PUENfQU5ZLCBkaXIpOworCWlmIChJU19FUlIob3BfZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKG9wX2RhdGEpOworCS8qKgorCSAqIEZJWE1FIGNob29zZSB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSByZWFkZGlyCisJICovCisJb3BfZGF0YS0+b3BfbWF4X3BhZ2VzID0gbGxfaTJzYmkoZGlyKS0+bGxfbWRfYnJ3X3BhZ2VzOworCisJcGFnZSA9IGxsX2dldF9kaXJfcGFnZShkaXIsIG9wX2RhdGEsIHBvcyk7CiAKIAl3aGlsZSAoMSkgewogCQlzdHJ1Y3QgbHVfZGlycGFnZSAqZHA7CkBAIC0xMzU3LDkgKzEyOTMsMTAgQEAKIAkJCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oZGlyKTsKIAogCQkJcmMgPSBQVFJfRVJSKHBhZ2UpOwotCQkJQ0VSUk9SKCJlcnJvciByZWFkaW5nIGRpciAiREZJRCIgYXQgJWxsdTogW3JjICVkXSBbcGFyZW50ICV1XVxuIiwKKwkJCUNFUlJPUigiJXM6IGVycm9yIHJlYWRpbmcgZGlyICJERklEIiBhdCAlbGx1OiBvcGVuZGlyX3BpZCA9ICV1IDogcmMgPSAlZFxuIiwKKwkJCSAgICAgICBsbF9nZXRfZnNuYW1lKGRpci0+aV9zYiwgTlVMTCwgMCksCiAJCQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoZGlyKSksIHBvcywKLQkJCSAgICAgICByYywgbGxpLT5sbGlfb3BlbmRpcl9waWQpOworCQkJICAgICAgIGxsaS0+bGxpX29wZW5kaXJfcGlkLCByYyk7CiAJCQlicmVhazsKIAkJfQogCkBAIC0xNDExLDEzICsxMzQ4LDEzIEBACiAKIAkJCWlmICh0YXJnZXQtPmxlbiAhPSBuYW1lbGVuIHx8CiAJCQkgICAgbWVtY21wKHRhcmdldC0+bmFtZSwgbmFtZSwgbmFtZWxlbikgIT0gMCkKLQkJCQlyYyA9IExTX05PTkVfRklSU1RfREU7CisJCQkJcmMgPSBMU19OT1RfRklSU1RfREU7CiAJCQllbHNlIGlmICghZG90X2RlKQogCQkJCXJjID0gTFNfRklSU1RfREU7CiAJCQllbHNlCiAJCQkJcmMgPSBMU19GSVJTVF9ET1RfREU7CiAKLQkJCWxsX3JlbGVhc2VfcGFnZShwYWdlLCAwKTsKKwkJCWxsX3JlbGVhc2VfcGFnZShkaXIsIHBhZ2UsIGZhbHNlKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJCXBvcyA9IGxlNjRfdG9fY3B1KGRwLT5sZHBfaGFzaF9lbmQpOwpAQCAtMTQyNSwyNjEgKzEzNjIsMjI4IEBACiAJCQkvKgogCQkJICogRW5kIG9mIGRpcmVjdG9yeSByZWFjaGVkLgogCQkJICovCi0JCQlsbF9yZWxlYXNlX3BhZ2UocGFnZSwgMCk7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmICgxKSB7CisJCQlsbF9yZWxlYXNlX3BhZ2UoZGlyLCBwYWdlLCBmYWxzZSk7CisJCQlnb3RvIG91dDsKKwkJfSBlbHNlIHsKIAkJCS8qCiAJCQkgKiBjaGFpbiBpcyBleGhhdXN0ZWQKIAkJCSAqIE5vcm1hbCBjYXNlOiBjb250aW51ZSB0byB0aGUgbmV4dCBwYWdlLgogCQkJICovCi0JCQlsbF9yZWxlYXNlX3BhZ2UocGFnZSwgbGUzMl90b19jcHUoZHAtPmxkcF9mbGFncykgJgotCQkJCQkgICAgICBMREZfQ09MTElERSk7Ci0JCQlwYWdlID0gbGxfZ2V0X2Rpcl9wYWdlKGRpciwgcG9zLCAmY2hhaW4pOwotCQl9IGVsc2UgewotCQkJLyoKLQkJCSAqIGdvIGludG8gb3ZlcmZsb3cgcGFnZS4KLQkJCSAqLwotCQkJTEFTU0VSVChsZTMyX3RvX2NwdShkcC0+bGRwX2ZsYWdzKSAmIExERl9DT0xMSURFKTsKLQkJCWxsX3JlbGVhc2VfcGFnZShwYWdlLCAxKTsKKwkJCWxsX3JlbGVhc2VfcGFnZShkaXIsIHBhZ2UsCisJCQkJCWxlMzJfdG9fY3B1KGRwLT5sZHBfZmxhZ3MpICYKKwkJCQkJTERGX0NPTExJREUpOworCQkJcGFnZSA9IGxsX2dldF9kaXJfcGFnZShkaXIsIG9wX2RhdGEsIHBvcyk7CiAJCX0KIAl9Ci0KIG91dDoKLQlsbF9kaXJfY2hhaW5fZmluaSgmY2hhaW4pOworCWxsX2ZpbmlzaF9tZF9vcF9kYXRhKG9wX2RhdGEpOwogCXJldHVybiByYzsKIH0KIAotc3RhdGljIHZvaWQKLWxsX3NhaV91bnBsdWcoc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWksIHN0cnVjdCBsbF9zYV9lbnRyeSAqZW50cnkpCisvKioKKyAqIHJldmFsaWRhdGUgQGRlbnRyeXAgZnJvbSBzdGF0YWhlYWQgY2FjaGUKKyAqCisgKiBccGFyYW1baW5dICBkaXIJcGFyZW50IGRpcmVjdG9yeQorICogXHBhcmFtW2luXSAgc2FpCXNhaSBzdHJ1Y3R1cmUKKyAqIFxwYXJhbVtvdXRdIGRlbnRyeXAJcG9pbnRlciB0byBkZW50cnkgd2hpY2ggd2lsbCBiZSByZXZhbGlkYXRlZAorICogXHBhcmFtW2luXSAgdW5wbHVnCXVucGx1ZyBzdGF0YWhlYWQgd2luZG93IG9ubHkgKG5vcm1hbGx5IGZvciBuZWdhdGl2ZQorICoJCQlkZW50cnkpCisgKiBccmV0dmFsCQkxIG9uIHN1Y2Nlc3MsIGRlbnRyeSBpcyBzYXZlZCBpbiBAZGVudHJ5cAorICogXHJldHZhbAkJMCBpZiByZXZhbGlkYXRpb24gZmFpbGVkIChubyBwcm9wZXIgbG9jayBvbiBjbGllbnQpCisgKiBccmV0dmFsCQluZWdhdGl2ZSBudW1iZXIgdXBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IHJldmFsaWRhdGVfc3RhdGFoZWFkX2RlbnRyeShzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCQkgICAgICAgc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWksCisJCQkJICAgICAgIHN0cnVjdCBkZW50cnkgKipkZW50cnlwLAorCQkJCSAgICAgICBib29sIHVucGx1ZykKIHsKLQlzdHJ1Y3QgcHRscnBjX3RocmVhZCAqdGhyZWFkID0gJnNhaS0+c2FpX3RocmVhZDsKLQlzdHJ1Y3QgbGxfc2JfaW5mbyAgICAqc2JpICAgID0gbGxfaTJzYmkoc2FpLT5zYWlfaW5vZGUpOwotCWludAkJICAgaGl0OworCXN0cnVjdCBzYV9lbnRyeSAqZW50cnkgPSBOVUxMOworCXN0cnVjdCBsX3dhaXRfaW5mbyBsd2kgPSB7IDAgfTsKKwlzdHJ1Y3QgbGxfZGVudHJ5X2RhdGEgKmxkZDsKKwlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpOworCWludCByYyA9IDA7CiAKLQlpZiAoZW50cnkgJiYgZW50cnktPnNlX3N0YXQgPT0gU0FfRU5UUllfU1VDQykKLQkJaGl0ID0gMTsKLQllbHNlCi0JCWhpdCA9IDA7CisJaWYgKCgqZGVudHJ5cCktPmRfbmFtZS5uYW1lWzBdID09ICcuJykgeworCQlpZiAoc2FpLT5zYWlfbHNfYWxsIHx8CisJCSAgICBzYWktPnNhaV9taXNzX2hpZGRlbiA+PSBzYWktPnNhaV9za2lwX2hpZGRlbikgeworCQkJLyoKKwkJCSAqIEhpZGRlbiBkZW50cnkgaXMgdGhlIGZpcnN0IG9uZSwgb3Igc3RhdGFoZWFkCisJCQkgKiB0aHJlYWQgZG9lcyBub3Qgc2tpcCBzbyBtYW55IGhpZGRlbiBkZW50cmllcworCQkJICogYmVmb3JlICJzYWlfbHNfYWxsIiBlbmFibGVkIGFzIGJlbG93LgorCQkJICovCisJCX0gZWxzZSB7CisJCQlpZiAoIXNhaS0+c2FpX2xzX2FsbCkKKwkJCQkvKgorCQkJCSAqIEl0IG1heWJlIGJlY2F1c2UgaGlkZGVuIGRlbnRyeSBpcyBub3QKKwkJCQkgKiB0aGUgZmlyc3Qgb25lLCAic2FpX2xzX2FsbCIgd2FzIG5vdAorCQkJCSAqIHNldCwgdGhlbiAibHMgLWFsIiBtaXNzZWQuIEVuYWJsZQorCQkJCSAqICJzYWlfbHNfYWxsIiBmb3Igc3VjaCBjYXNlLgorCQkJCSAqLworCQkJCXNhaS0+c2FpX2xzX2FsbCA9IDE7CiAKLQlsbF9zYV9lbnRyeV9maW5pKHNhaSwgZW50cnkpOwotCWlmIChoaXQpIHsKLQkJc2FpLT5zYWlfaGl0Kys7Ci0JCXNhaS0+c2FpX2NvbnNlY3V0aXZlX21pc3MgPSAwOwotCQlzYWktPnNhaV9tYXggPSBtaW4oMiAqIHNhaS0+c2FpX21heCwgc2JpLT5sbF9zYV9tYXgpOwotCX0gZWxzZSB7Ci0JCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oc2FpLT5zYWlfaW5vZGUpOwotCi0JCXNhaS0+c2FpX21pc3MrKzsKLQkJc2FpLT5zYWlfY29uc2VjdXRpdmVfbWlzcysrOwotCQlpZiAoc2FfbG93X2hpdChzYWkpICYmIHRocmVhZF9pc19ydW5uaW5nKHRocmVhZCkpIHsKLQkJCWF0b21pY19pbmMoJnNiaS0+bGxfc2Ffd3JvbmcpOwotCQkJQ0RFQlVHKERfUkVBREEsICJTdGF0YWhlYWQgZm9yIGRpciAiIERGSUQgIiBoaXQgcmF0aW8gdG9vIGxvdzogaGl0L21pc3MgJWxsdS8lbGx1LCBzZW50L3JlcGxpZWQgJWxsdS8lbGx1LCBzdG9wcGluZyBzdGF0YWhlYWQgdGhyZWFkXG4iLAotCQkJICAgICAgIFBGSUQoJmxsaS0+bGxpX2ZpZCksIHNhaS0+c2FpX2hpdCwKLQkJCSAgICAgICBzYWktPnNhaV9taXNzLCBzYWktPnNhaV9zZW50LAotCQkJICAgICAgIHNhaS0+c2FpX3JlcGxpZWQpOwotCQkJc3Bpbl9sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKLQkJCWlmICghdGhyZWFkX2lzX3N0b3BwZWQodGhyZWFkKSkKLQkJCQl0aHJlYWRfc2V0X2ZsYWdzKHRocmVhZCwgU1ZDX1NUT1BQSU5HKTsKLQkJCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKKwkJCS8qCisJCQkgKiBTdWNoICJnZXRhdHRyIiBoYXMgYmVlbiBza2lwcGVkIGJlZm9yZQorCQkJICogInNhaV9sc19hbGwiIGVuYWJsZWQgYXMgYWJvdmUuCisJCQkgKi8KKwkJCXNhaS0+c2FpX21pc3NfaGlkZGVuKys7CisJCQlyZXR1cm4gLUVBR0FJTjsKIAkJfQogCX0KIAotCWlmICghdGhyZWFkX2lzX3N0b3BwZWQodGhyZWFkKSkKLQkJd2FrZV91cCgmdGhyZWFkLT50X2N0bF93YWl0cSk7CisJaWYgKHVucGx1ZykgeworCQlyYyA9IDE7CisJCWdvdG8gb3V0X3VucGx1ZzsKKwl9CisKKwllbnRyeSA9IHNhX2dldChzYWksICYoKmRlbnRyeXApLT5kX25hbWUpOworCWlmICghZW50cnkpIHsKKwkJcmMgPSAtRUFHQUlOOworCQlnb3RvIG91dF91bnBsdWc7CisJfQorCisJLyogaWYgc3RhdGFoZWFkIGlzIGJ1c3kgaW4gcmVhZGRpciwgaGVscCBpdCBkbyBwb3N0LXdvcmsgKi8KKwlpZiAoIXNhX3JlYWR5KGVudHJ5KSAmJiBzYWktPnNhaV9pbl9yZWFkcGFnZSkKKwkJc2FfaGFuZGxlX2NhbGxiYWNrKHNhaSk7CisKKwlpZiAoIXNhX3JlYWR5KGVudHJ5KSkgeworCQlzYWktPnNhaV9pbmRleF93YWl0ID0gZW50cnktPnNlX2luZGV4OworCQlsd2kgPSBMV0lfVElNRU9VVF9JTlRSKGNmc190aW1lX3NlY29uZHMoMzApLCBOVUxMLAorCQkJCSAgICAgICBMV0lfT05fU0lHTkFMX05PT1AsIE5VTEwpOworCQlyYyA9IGxfd2FpdF9ldmVudChzYWktPnNhaV93YWl0cSwgc2FfcmVhZHkoZW50cnkpLCAmbHdpKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJLyoKKwkJCSAqIGVudHJ5IG1heSBub3QgYmUgcmVhZHksIHNvIGl0IG1heSBiZSB1c2VkIGJ5IGluZmxpZ2h0CisJCQkgKiBzdGF0YWhlYWQgUlBDLCBkb24ndCBmcmVlIGl0LgorCQkJICovCisJCQllbnRyeSA9IE5VTEw7CisJCQlyYyA9IC1FQUdBSU47CisJCQlnb3RvIG91dF91bnBsdWc7CisJCX0KKwl9CisKKwlpZiAoZW50cnktPnNlX3N0YXRlID09IFNBX0VOVFJZX1NVQ0MgJiYgZW50cnktPnNlX2lub2RlKSB7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBlbnRyeS0+c2VfaW5vZGU7CisJCXN0cnVjdCBsb29rdXBfaW50ZW50IGl0ID0geyAuaXRfb3AgPSBJVF9HRVRBVFRSLAorCQkJCQkgICAgLml0X2xvY2tfaGFuZGxlID0gZW50cnktPnNlX2hhbmRsZSB9OworCQlfX3U2NCBiaXRzOworCisJCXJjID0gbWRfcmV2YWxpZGF0ZV9sb2NrKGxsX2kybWRleHAoZGlyKSwgJml0LAorCQkJCQlsbF9pbm9kZTJmaWQoaW5vZGUpLCAmYml0cyk7CisJCWlmIChyYyA9PSAxKSB7CisJCQlpZiAoISgqZGVudHJ5cCktPmRfaW5vZGUpIHsKKwkJCQlzdHJ1Y3QgZGVudHJ5ICphbGlhczsKKworCQkJCWFsaWFzID0gbGxfc3BsaWNlX2FsaWFzKGlub2RlLCAqZGVudHJ5cCk7CisJCQkJaWYgKElTX0VSUihhbGlhcykpIHsKKwkJCQkJcmMgPSBQVFJfRVJSKGFsaWFzKTsKKwkJCQkJZ290byBvdXRfdW5wbHVnOworCQkJCX0KKwkJCQkqZGVudHJ5cCA9IGFsaWFzOworCQkJCS8qKgorCQkJCSAqIHN0YXRhaGVhZCBwcmVwYXJlZCB0aGlzIGlub2RlLCB0cmFuc2ZlciBpbm9kZQorCQkJCSAqIHJlZmNvdW50IGZyb20gc2FfZW50cnkgdG8gZGVudHJ5CisJCQkJICovCisJCQkJZW50cnktPnNlX2lub2RlID0gTlVMTDsKKwkJCX0gZWxzZSBpZiAoKCpkZW50cnlwKS0+ZF9pbm9kZSAhPSBpbm9kZSkgeworCQkJCS8qIHJldmFsaWRhdGUsIGJ1dCBpbm9kZSBpcyByZWNyZWF0ZWQgKi8KKwkJCQlDREVCVUcoRF9SRUFEQSwKKwkJCQkgICAgICAgIiVzOiBzdGFsZSBkZW50cnkgJXBkIGlub2RlICJERklEIiwgc3RhdGFoZWFkIGlub2RlICJERklEIlxuIiwKKwkJCQkgICAgICAgbGxfZ2V0X2ZzbmFtZSgoKmRlbnRyeXApLT5kX2lub2RlLT5pX3NiLAorCQkJCQkJICAgICBOVUxMLCAwKSwKKwkJCQkgICAgICAgKmRlbnRyeXAsCisJCQkJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKCgqZGVudHJ5cCktPmRfaW5vZGUpKSwKKwkJCQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSk7CisJCQkJcmMgPSAtRVNUQUxFOworCQkJCWdvdG8gb3V0X3VucGx1ZzsKKwkJCX0KKworCQkJaWYgKChiaXRzICYgTURTX0lOT0RFTE9DS19MT09LVVApICYmCisJCQkgICAgZF9sdXN0cmVfaW52YWxpZCgqZGVudHJ5cCkpCisJCQkJZF9sdXN0cmVfcmV2YWxpZGF0ZSgqZGVudHJ5cCk7CisJCQlsbF9pbnRlbnRfcmVsZWFzZSgmaXQpOworCQl9CisJfQorb3V0X3VucGx1ZzoKKwkvKgorCSAqIHN0YXRhaGVhZCBjYWNoZWQgc2FfZW50cnkgY2FuIGJlIHVzZWQgb25seSBvbmNlLCBhbmQgd2lsbCBiZSBraWxsZWQKKwkgKiByaWdodCBhZnRlciB1c2UsIHNvIGlmIGxvb2t1cC9yZXZhbGlkYXRlIGFjY2Vzc2VkIHN0YXRhaGVhZCBjYWNoZSwKKwkgKiBzZXQgZGVudHJ5IGxkZF9zYV9nZW5lcmF0aW9uIHRvIHBhcmVudCBsbGlfc2FfZ2VuZXJhdGlvbiwgbGF0ZXIgaWYgd2UKKwkgKiBzdGF0IHRoaXMgZmlsZSBhZ2Fpbiwgd2Uga25vdyB3ZSd2ZSBkb25lIHN0YXRhaGVhZCBiZWZvcmUsIHNlZQorCSAqIGRlbnRyeV9tYXlfc3RhdGFoZWFkKCkuCisJICovCisJbGRkID0gbGxfZDJkKCpkZW50cnlwKTsKKwlsbGkgPSBsbF9pMmluZm8oZGlyKTsKKwkvKiBsZGQgY2FuIGJlIE5VTEwgaWYgbGxpdGUgbG9va3VwIGZhaWxlZC4gKi8KKwlpZiAobGRkKQorCQlsZGQtPmxsZF9zYV9nZW5lcmF0aW9uID0gbGxpLT5sbGlfc2FfZ2VuZXJhdGlvbjsKKwlzYV9wdXQoc2FpLCBlbnRyeSk7CisJcmV0dXJuIHJjOwogfQogCiAvKioKLSAqIFN0YXJ0IHN0YXRhaGVhZCB0aHJlYWQgaWYgdGhpcyBpcyB0aGUgZmlyc3QgZGlyIGVudHJ5LgotICogT3RoZXJ3aXNlIGlmIGEgdGhyZWFkIGlzIHN0YXJ0ZWQgYWxyZWFkeSwgd2FpdCBpdCB1bnRpbCBpdCBpcyBhaGVhZCBvZiBtZS4KLSAqIFxyZXR2YWwgMSAgICAgICAtLSBmaW5kIGVudHJ5IHdpdGggbG9jayBpbiBjYWNoZSwgdGhlIGNhbGxlciBuZWVkcyB0byBkbwotICoJCSAgICBub3RoaW5nLgotICogXHJldHZhbCAwICAgICAgIC0tIGZpbmQgZW50cnkgaW4gY2FjaGUsIGJ1dCB3aXRob3V0IGxvY2ssIHRoZSBjYWxsZXIgbmVlZHMKLSAqCQkgICAgcmVmcmVzaCBmcm9tIE1EUy4KLSAqIFxyZXR2YWwgb3RoZXJzICAtLSB0aGUgY2FsbGVyIG5lZWQgdG8gcHJvY2VzcyBhcyBub24tc3RhdGFoZWFkLgorICogc3RhcnQgc3RhdGFoZWFkIHRocmVhZAorICoKKyAqIFxwYXJhbVtpbl0gZGlyCXBhcmVudCBkaXJlY3RvcnkKKyAqIFxwYXJhbVtpbl0gZGVudHJ5CWRlbnRyeSB0aGF0IHRyaWdnZXJzIHN0YXRhaGVhZCwgbm9ybWFsbHkgdGhlIGZpcnN0CisgKgkJCWRpcmVudCB1bmRlciBAZGlyCisgKiBccmV0dmFsCQktRUFHQUlOIG9uIHN1Y2Nlc3MsIGJlY2F1c2Ugd2hlbiB0aGlzIGZ1bmN0aW9uIGlzCisgKgkJCWNhbGxlZCwgaXQncyBhbHJlYWR5IGluIGxvb2t1cCBjYWxsLCBzbyBjbGllbnQgc2hvdWxkCisgKgkJCWRvIGl0IGl0c2VsZiBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHN0YXRhaGVhZCB0aHJlYWQKKyAqCQkJdG8gZG8gaXQgYXN5bmNocm9ub3VzbHkuCisgKiBccmV0dmFsCQluZWdhdGl2ZSBudW1iZXIgdXBvbiBlcnJvcgogICovCi1pbnQgZG9fc3RhdGFoZWFkX2VudGVyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICoqZGVudHJ5cCwKLQkJICAgICAgIGludCBvbmx5X3VucGx1ZykKK3N0YXRpYyBpbnQgc3RhcnRfc3RhdGFoZWFkX3RocmVhZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewotCXN0cnVjdCBsbF9pbm9kZV9pbmZvICAgICAqbGxpICAgPSBsbF9pMmluZm8oZGlyKTsKLQlzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSAgID0gbGxpLT5sbGlfc2FpOwotCXN0cnVjdCBkZW50cnkJICAgICpwYXJlbnQ7Ci0Jc3RydWN0IGxsX3NhX2VudHJ5ICAgICAgICplbnRyeTsKLQlzdHJ1Y3QgcHRscnBjX3RocmVhZCAgICAgKnRocmVhZDsKLQlzdHJ1Y3QgbF93YWl0X2luZm8JbHdpICAgPSB7IDAgfTsKKwlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGRpcik7CisJc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWkgPSBOVUxMOworCXN0cnVjdCBsX3dhaXRfaW5mbyBsd2kgPSB7IDAgfTsKKwlzdHJ1Y3QgcHRscnBjX3RocmVhZCAqdGhyZWFkOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKLQlpbnQJCSAgICAgICByYyAgICA9IDA7Ci0Jc3RydWN0IGxsX2lub2RlX2luZm8gICAgICpwbGxpOwotCi0JTEFTU0VSVChsbGktPmxsaV9vcGVuZGlyX3BpZCA9PSBjdXJyZW50X3BpZCgpKTsKLQotCWlmIChzYWkpIHsKLQkJdGhyZWFkID0gJnNhaS0+c2FpX3RocmVhZDsKLQkJaWYgKHVubGlrZWx5KHRocmVhZF9pc19zdG9wcGVkKHRocmVhZCkgJiYKLQkJCSAgICAgbGlzdF9lbXB0eSgmc2FpLT5zYWlfZW50cmllc19zdGF0ZWQpKSkgewotCQkJLyogdG8gcmVsZWFzZSByZXNvdXJjZSAqLwotCQkJbGxfc3RvcF9zdGF0YWhlYWQoZGlyLCBsbGktPmxsaV9vcGVuZGlyX2tleSk7Ci0JCQlyZXR1cm4gLUVBR0FJTjsKLQkJfQotCi0JCWlmICgoKmRlbnRyeXApLT5kX25hbWUubmFtZVswXSA9PSAnLicpIHsKLQkJCWlmIChzYWktPnNhaV9sc19hbGwgfHwKLQkJCSAgICBzYWktPnNhaV9taXNzX2hpZGRlbiA+PSBzYWktPnNhaV9za2lwX2hpZGRlbikgewotCQkJCS8qCi0JCQkJICogSGlkZGVuIGRlbnRyeSBpcyB0aGUgZmlyc3Qgb25lLCBvciBzdGF0YWhlYWQKLQkJCQkgKiB0aHJlYWQgZG9lcyBub3Qgc2tpcCBzbyBtYW55IGhpZGRlbiBkZW50cmllcwotCQkJCSAqIGJlZm9yZSAic2FpX2xzX2FsbCIgZW5hYmxlZCBhcyBiZWxvdy4KLQkJCQkgKi8KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCFzYWktPnNhaV9sc19hbGwpCi0JCQkJCS8qCi0JCQkJCSAqIEl0IG1heWJlIGJlY2F1c2UgaGlkZGVuIGRlbnRyeSBpcyBub3QKLQkJCQkJICogdGhlIGZpcnN0IG9uZSwgInNhaV9sc19hbGwiIHdhcyBub3QKLQkJCQkJICogc2V0LCB0aGVuICJscyAtYWwiIG1pc3NlZC4gRW5hYmxlCi0JCQkJCSAqICJzYWlfbHNfYWxsIiBmb3Igc3VjaCBjYXNlLgotCQkJCQkgKi8KLQkJCQkJc2FpLT5zYWlfbHNfYWxsID0gMTsKLQotCQkJCS8qCi0JCQkJICogU3VjaCAiZ2V0YXR0ciIgaGFzIGJlZW4gc2tpcHBlZCBiZWZvcmUKLQkJCQkgKiAic2FpX2xzX2FsbCIgZW5hYmxlZCBhcyBhYm92ZS4KLQkJCQkgKi8KLQkJCQlzYWktPnNhaV9taXNzX2hpZGRlbisrOwotCQkJCXJldHVybiAtRUFHQUlOOwotCQkJfQotCQl9Ci0KLQkJZW50cnkgPSBsbF9zYV9lbnRyeV9nZXRfYnluYW1lKHNhaSwgJigqZGVudHJ5cCktPmRfbmFtZSk7Ci0JCWlmICghZW50cnkgfHwgb25seV91bnBsdWcpIHsKLQkJCWxsX3NhaV91bnBsdWcoc2FpLCBlbnRyeSk7Ci0JCQlyZXR1cm4gZW50cnkgPyAxIDogLUVBR0FJTjsKLQkJfQotCi0JCWlmICghbGxfc2FfZW50cnlfc3RhdGVkKGVudHJ5KSkgewotCQkJc2FpLT5zYWlfaW5kZXhfd2FpdCA9IGVudHJ5LT5zZV9pbmRleDsKLQkJCWx3aSA9IExXSV9USU1FT1VUX0lOVFIoY2ZzX3RpbWVfc2Vjb25kcygzMCksIE5VTEwsCi0JCQkJCSAgICAgICBMV0lfT05fU0lHTkFMX05PT1AsIE5VTEwpOwotCQkJcmMgPSBsX3dhaXRfZXZlbnQoc2FpLT5zYWlfd2FpdHEsCi0JCQkJCSAgbGxfc2FfZW50cnlfc3RhdGVkKGVudHJ5KSB8fAotCQkJCQkgIHRocmVhZF9pc19zdG9wcGVkKHRocmVhZCksCi0JCQkJCSAgJmx3aSk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJbGxfc2FpX3VucGx1ZyhzYWksIGVudHJ5KTsKLQkJCQlyZXR1cm4gLUVBR0FJTjsKLQkJCX0KLQkJfQotCi0JCWlmIChlbnRyeS0+c2Vfc3RhdCA9PSBTQV9FTlRSWV9TVUNDICYmIGVudHJ5LT5zZV9pbm9kZSkgewotCQkJc3RydWN0IGlub2RlICppbm9kZSA9IGVudHJ5LT5zZV9pbm9kZTsKLQkJCXN0cnVjdCBsb29rdXBfaW50ZW50IGl0ID0geyAuaXRfb3AgPSBJVF9HRVRBVFRSLAotCQkJCQkJICAgIC5pdF9sb2NrX2hhbmRsZSA9Ci0JCQkJCQkgICAgIGVudHJ5LT5zZV9oYW5kbGUgfTsKLQkJCV9fdTY0IGJpdHM7Ci0KLQkJCXJjID0gbWRfcmV2YWxpZGF0ZV9sb2NrKGxsX2kybWRleHAoZGlyKSwgJml0LAotCQkJCQkJbGxfaW5vZGUyZmlkKGlub2RlKSwgJmJpdHMpOwotCQkJaWYgKHJjID09IDEpIHsKLQkJCQlpZiAoIWRfaW5vZGUoKmRlbnRyeXApKSB7Ci0JCQkJCXN0cnVjdCBkZW50cnkgKmFsaWFzOwotCi0JCQkJCWFsaWFzID0gbGxfc3BsaWNlX2FsaWFzKGlub2RlLAotCQkJCQkJCQkqZGVudHJ5cCk7Ci0JCQkJCWlmIChJU19FUlIoYWxpYXMpKSB7Ci0JCQkJCQlsbF9zYWlfdW5wbHVnKHNhaSwgZW50cnkpOwotCQkJCQkJcmV0dXJuIFBUUl9FUlIoYWxpYXMpOwotCQkJCQl9Ci0JCQkJCSpkZW50cnlwID0gYWxpYXM7Ci0JCQkJfSBlbHNlIGlmIChkX2lub2RlKCpkZW50cnlwKSAhPSBpbm9kZSkgewotCQkJCQkvKiByZXZhbGlkYXRlLCBidXQgaW5vZGUgaXMgcmVjcmVhdGVkICovCi0JCQkJCUNERUJVRyhEX1JFQURBLCAiJXM6IHN0YWxlIGRlbnRyeSAlcGQgaW5vZGUgIkRGSUQiLCBzdGF0YWhlYWQgaW5vZGUgIkRGSUQiXG4iLAotCQkJCQkgICAgICAgbGxfZ2V0X2ZzbmFtZShkX2lub2RlKCpkZW50cnlwKS0+aV9zYiwgTlVMTCwgMCksCi0JCQkJCSAgICAgICAqZGVudHJ5cCwKLQkJCQkJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGRfaW5vZGUoKmRlbnRyeXApKSksCi0JCQkJCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpKTsKLQkJCQkJbGxfc2FpX3VucGx1ZyhzYWksIGVudHJ5KTsKLQkJCQkJcmV0dXJuIC1FU1RBTEU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaXB1dChpbm9kZSk7Ci0JCQkJfQotCQkJCWVudHJ5LT5zZV9pbm9kZSA9IE5VTEw7Ci0KLQkJCQlpZiAoKGJpdHMgJiBNRFNfSU5PREVMT0NLX0xPT0tVUCkgJiYKLQkJCQkgICAgZF9sdXN0cmVfaW52YWxpZCgqZGVudHJ5cCkpCi0JCQkJCWRfbHVzdHJlX3JldmFsaWRhdGUoKmRlbnRyeXApOwotCQkJCWxsX2ludGVudF9yZWxlYXNlKCZpdCk7Ci0JCQl9Ci0JCX0KLQotCQlsbF9zYWlfdW5wbHVnKHNhaSwgZW50cnkpOwotCQlyZXR1cm4gcmM7Ci0JfQorCXN0cnVjdCBkZW50cnkgKnBhcmVudCA9IGRlbnRyeS0+ZF9wYXJlbnQ7CisJaW50IHJjOwogCiAJLyogSSBhbSB0aGUgImxsaV9vcGVuZGlyX3BpZCIgb3duZXIsIG9ubHkgbWUgY2FuIHNldCAibGxpX3NhaSIuICovCi0JcmMgPSBpc19maXJzdF9kaXJlbnQoZGlyLCAqZGVudHJ5cCk7Ci0JaWYgKHJjID09IExTX05PTkVfRklSU1RfREUpIHsKKwlyYyA9IGlzX2ZpcnN0X2RpcmVudChkaXIsIGRlbnRyeSk7CisJaWYgKHJjID09IExTX05PVF9GSVJTVF9ERSkgewogCQkvKiBJdCBpcyBub3QgImxzIC17YX1sIiBvcGVyYXRpb24sIG5vIG5lZWQgc3RhdGFoZWFkIGZvciBpdC4gKi8KLQkJcmMgPSAtRUFHQUlOOworCQlyYyA9IC1FRkFVTFQ7CiAJCWdvdG8gb3V0OwogCX0KIAotCXNhaSA9IGxsX3NhaV9hbGxvYygpOworCXNhaSA9IGxsX3NhaV9hbGxvYyhwYXJlbnQpOwogCWlmICghc2FpKSB7CiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQogCiAJc2FpLT5zYWlfbHNfYWxsID0gKHJjID09IExTX0ZJUlNUX0RPVF9ERSk7Ci0Jc2FpLT5zYWlfaW5vZGUgPSBpZ3JhYihkaXIpOwotCWlmICh1bmxpa2VseSghc2FpLT5zYWlfaW5vZGUpKSB7Ci0JCUNXQVJOKCJEbyBub3Qgc3RhcnQgc3RhdCBhaGVhZCBvbiBkeWluZyBpbm9kZSAiREZJRCJcbiIsCi0JCSAgICAgIFBGSUQoJmxsaS0+bGxpX2ZpZCkpOwotCQlyYyA9IC1FU1RBTEU7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIGdldCBwYXJlbnQgcmVmZXJlbmNlIGNvdW50IGhlcmUsIGFuZCBwdXQgaXQgaW4gbGxfc3RhdGFoZWFkX3RocmVhZCAqLwotCXBhcmVudCA9IGRnZXQoKCpkZW50cnlwKS0+ZF9wYXJlbnQpOwotCWlmICh1bmxpa2VseShzYWktPnNhaV9pbm9kZSAhPSBkX2lub2RlKHBhcmVudCkpKSB7Ci0JCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpubGxpID0gbGxfaTJpbmZvKGRfaW5vZGUocGFyZW50KSk7Ci0KLQkJQ1dBUk4oIlJhY2UgY29uZGl0aW9uLCBzb21lb25lIGNoYW5nZWQgJXBkIGp1c3Qgbm93OiBvbGQgcGFyZW50ICJERklEIiwgbmV3IHBhcmVudCAiREZJRCJcbiIsCi0JCSAgICAgICpkZW50cnlwLAotCQkgICAgICBQRklEKCZsbGktPmxsaV9maWQpLCBQRklEKCZubGxpLT5sbGlfZmlkKSk7Ci0JCWRwdXQocGFyZW50KTsKLQkJaXB1dChzYWktPnNhaV9pbm9kZSk7Ci0JCXJjID0gLUVBR0FJTjsKLQkJZ290byBvdXQ7Ci0JfQotCi0JQ0RFQlVHKERfUkVBREEsICJzdGFydCBzdGF0YWhlYWQgdGhyZWFkOiBzYWkgJXAsIHBhcmVudCAlcGRcbiIsCi0JICAgICAgIHNhaSwgcGFyZW50KTsKLQotCS8qIFRoZSBzYWkgYnVmZmVyIGFscmVhZHkgaGFzIG9uZSByZWZlcmVuY2UgdGFrZW4gYXQgYWxsb2NhdGlvbiB0aW1lLAotCSAqIGJ1dCBhcyBzb29uIGFzIHdlIGV4cG9zZSB0aGUgc2FpIGJ5IGF0dGFjaGluZyBpdCB0byB0aGUgbGxpIHRoYXQKLQkgKiBkZWZhdWx0IHJlZmVyZW5jZSBjYW4gYmUgZHJvcHBlZCBieSBhbm90aGVyIHRocmVhZCBjYWxsaW5nCi0JICogbGxfc3RvcF9zdGF0YWhlYWQuIFdlIG5lZWQgdG8gdGFrZSBhIGxvY2FsIHJlZmVyZW5jZSB0byBwcm90ZWN0Ci0JICogdGhlIHNhaSBidWZmZXIgd2hpbGUgd2UgaW50ZW5kIHRvIGFjY2VzcyBpdC4KKwkvKgorCSAqIGlmIGN1cnJlbnQgbGxpX29wZW5kaXJfa2V5IHdhcyBkZWF1dGhvcml6ZWQsIG9yIGRpciByZS1vcGVuZWQgYnkKKwkgKiBhbm90aGVyIHByb2Nlc3MsIGRvbid0IHN0YXJ0IHN0YXRhaGVhZCwgb3RoZXJ3aXNlIHRoZSBuZXdseSBzcGF3bmVkCisJICogc3RhdGFoZWFkIHRocmVhZCB3b24ndCBiZSBub3RpZmllZCB0byBxdWl0LgogCSAqLwotCWxsX3NhaV9nZXQoc2FpKTsKKwlzcGluX2xvY2soJmxsaS0+bGxpX3NhX2xvY2spOworCWlmICh1bmxpa2VseShsbGktPmxsaV9zYWkgfHwgbGxpLT5sbGlfb3BlbmRpcl9rZXkgfHwKKwkJICAgICBsbGktPmxsaV9vcGVuZGlyX3BpZCAhPSBjdXJyZW50LT5waWQpKSB7CisJCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKKwkJcmMgPSAtRVBFUk07CisJCWdvdG8gb3V0OworCX0KIAlsbGktPmxsaV9zYWkgPSBzYWk7CisJc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOwogCi0JcGxsaSA9IGxsX2kyaW5mbyhkX2lub2RlKHBhcmVudCkpOworCWF0b21pY19pbmMoJmxsX2kyc2JpKHBhcmVudC0+ZF9pbm9kZSktPmxsX3NhX3J1bm5pbmcpOworCisJQ0RFQlVHKERfUkVBREEsICJzdGFydCBzdGF0YWhlYWQgdGhyZWFkOiBbcGlkICVkXSBbcGFyZW50ICVwZF1cbiIsCisJICAgICAgIGN1cnJlbnRfcGlkKCksIHBhcmVudCk7CisKIAl0YXNrID0ga3RocmVhZF9ydW4obGxfc3RhdGFoZWFkX3RocmVhZCwgcGFyZW50LCAibGxfc2FfJXUiLAotCQkJICAgcGxsaS0+bGxpX29wZW5kaXJfcGlkKTsKKwkJCSAgIGxsaS0+bGxpX29wZW5kaXJfcGlkKTsKIAl0aHJlYWQgPSAmc2FpLT5zYWlfdGhyZWFkOwogCWlmIChJU19FUlIodGFzaykpIHsKIAkJcmMgPSBQVFJfRVJSKHRhc2spOwotCQlDRVJST1IoImNhbid0IHN0YXJ0IGxsX3NhIHRocmVhZCwgcmM6ICVkXG4iLCByYyk7Ci0JCWRwdXQocGFyZW50KTsKLQkJbGxpLT5sbGlfb3BlbmRpcl9rZXkgPSBOVUxMOwotCQl0aHJlYWRfc2V0X2ZsYWdzKHRocmVhZCwgU1ZDX1NUT1BQRUQpOwotCQl0aHJlYWRfc2V0X2ZsYWdzKCZzYWktPnNhaV9hZ2xfdGhyZWFkLCBTVkNfU1RPUFBFRCk7Ci0JCS8qIERyb3AgYm90aCBvdXIgb3duIGxvY2FsIHJlZmVyZW5jZSBhbmQgdGhlIGRlZmF1bHQKLQkJICogcmVmZXJlbmNlIGZyb20gYWxsb2NhdGlvbiB0aW1lLgotCQkgKi8KLQkJbGxfc2FpX3B1dChzYWkpOwotCQlsbF9zYWlfcHV0KHNhaSk7Ci0JCUxBU1NFUlQoIWxsaS0+bGxpX3NhaSk7Ci0JCXJldHVybiAtRUFHQUlOOworCQlDRVJST1IoImNhbid0IHN0YXJ0IGxsX3NhIHRocmVhZCwgcmMgOiAlZFxuIiwgcmMpOworCQlnb3RvIG91dDsKIAl9CiAKIAlsX3dhaXRfZXZlbnQodGhyZWFkLT50X2N0bF93YWl0cSwKQEAgLTE2OTQsMTAgKzE1OTgsNDcgQEAKIAlyZXR1cm4gLUVBR0FJTjsKIAogb3V0OgotCWtmcmVlKHNhaSk7CisJLyoKKwkgKiBvbmNlIHdlIHN0YXJ0IHN0YXRhaGVhZCB0aHJlYWQgZmFpbGVkLCBkaXNhYmxlIHN0YXRhaGVhZCBzbworCSAqIHRoYXQgc3Vic2VxdWVudCBzdGF0IHdvbid0IHdhc3RlIHRpbWUgdG8gdHJ5IGl0LgorCSAqLwogCXNwaW5fbG9jaygmbGxpLT5sbGlfc2FfbG9jayk7Ci0JbGxpLT5sbGlfb3BlbmRpcl9rZXkgPSBOVUxMOwotCWxsaS0+bGxpX29wZW5kaXJfcGlkID0gMDsKKwlsbGktPmxsaV9zYV9lbmFibGVkID0gMDsKKwlsbGktPmxsaV9zYWkgPSBOVUxMOwogCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKKwlpZiAoc2FpKQorCQlsbF9zYWlfZnJlZShzYWkpOwogCXJldHVybiByYzsKIH0KKworLyoqCisgKiBzdGF0YWhlYWQgZW50cnkgZnVuY3Rpb24sIHRoaXMgaXMgY2FsbGVkIHdoZW4gY2xpZW50IGdldGF0dHIgb24gYSBmaWxlLCBpdAorICogd2lsbCBzdGFydCBzdGF0YWhlYWQgdGhyZWFkIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGRpciBlbnRyeSwgZWxzZSByZXZhbGlkYXRlCisgKiBkZW50cnkgZnJvbSBzdGF0YWhlYWQgY2FjaGUuCisgKgorICogXHBhcmFtW2luXSAgZGlyCXBhcmVudCBkaXJlY3RvcnkKKyAqIFxwYXJhbVtvdXRdIGRlbnRyeXAJZGVudHJ5IHRvIGdldGF0dHIKKyAqIFxwYXJhbVtpbl0gIHVucGx1Zwl1bnBsdWcgc3RhdGFoZWFkIHdpbmRvdyBvbmx5IChub3JtYWxseSBmb3IgbmVnYXRpdmUKKyAqCQkJZGVudHJ5KQorICogXHJldHZhbAkJMSBvbiBzdWNjZXNzCisgKiBccmV0dmFsCQkwIHJldmFsaWRhdGlvbiBmcm9tIHN0YXRhaGVhZCBjYWNoZSBmYWlsZWQsIGNhbGxlciBuZWVkcworICoJCQl0byBnZXRhdHRyIGZyb20gc2VydmVyIGRpcmVjdGx5CisgKiBccmV0dmFsCQluZWdhdGl2ZSBudW1iZXIgb24gZXJyb3IsIGNhbGxlciBvZnRlbiBpZ25vcmVzIHRoaXMgYW5kCisgKgkJCXRoZW4gZ2V0YXR0ciBmcm9tIHNlcnZlcgorICovCitpbnQgbGxfc3RhdGFoZWFkKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICoqZGVudHJ5cCwgYm9vbCB1bnBsdWcpCit7CisJc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWk7CisKKwlzYWkgPSBsbF9zYWlfZ2V0KGRpcik7CisJaWYgKHNhaSkgeworCQlpbnQgcmM7CisKKwkJcmMgPSByZXZhbGlkYXRlX3N0YXRhaGVhZF9kZW50cnkoZGlyLCBzYWksIGRlbnRyeXAsIHVucGx1Zyk7CisJCUNERUJVRyhEX1JFQURBLCAicmV2YWxpZGF0ZSBzdGF0YWhlYWQgJXBkOiAlZC5cbiIsCisJCSAgICAgICAqZGVudHJ5cCwgcmMpOworCQlsbF9zYWlfcHV0KHNhaSk7CisJCXJldHVybiByYzsKKwl9CisJcmV0dXJuIHN0YXJ0X3N0YXRhaGVhZF90aHJlYWQoZGlyLCAqZGVudHJ5cCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9zdXBlcjI1LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9zdXBlcjI1LmMKaW5kZXggM2RkN2UwZS4uMTA2Y2QwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvc3VwZXIyNS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3N1cGVyMjUuYwpAQCAtMzQsNyArMzQsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saXRlLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfaGEuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9kbG0uaCIKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC04Myw4ICs4Miw2IEBACiB9OwogTU9EVUxFX0FMSUFTX0ZTKCJsdXN0cmUiKTsKIAotdm9pZCBsdXN0cmVfcmVnaXN0ZXJfY2xpZW50X3Byb2Nlc3NfY29uZmlnKGludCAoKmNwYykoc3RydWN0IGx1c3RyZV9jZmcgKmxjZmcpKTsKLQogc3RhdGljIGludCBfX2luaXQgbHVzdHJlX2luaXQodm9pZCkKIHsKIAlsbmV0X3Byb2Nlc3NfaWRfdCBsbmV0X2lkOwpAQCAtMTAyLDggKzk5LDggQEAKIAogCXJjID0gLUVOT01FTTsKIAlsbF9pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibHVzdHJlX2lub2RlX2NhY2hlIiwKLQkJCQkJICAgIHNpemVvZihzdHJ1Y3QgbGxfaW5vZGVfaW5mbyksCi0JCQkJCSAgICAwLCBTTEFCX0hXQ0FDSEVfQUxJR058U0xBQl9BQ0NPVU5ULAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBsbF9pbm9kZV9pbmZvKSwgMCwKKwkJCQkJICAgIFNMQUJfSFdDQUNIRV9BTElHTiB8IFNMQUJfQUNDT1VOVCwKIAkJCQkJICAgIE5VTEwpOwogCWlmICghbGxfaW5vZGVfY2FjaGVwKQogCQlnb3RvIG91dF9jYWNoZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3N5bWxpbmsuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3N5bWxpbmsuYwppbmRleCA4YzhiZGZlLi5mOGJjN2VkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9zeW1saW5rLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvc3ltbGluay5jCkBAIC0zNSw3ICszNSw2IEBACiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2RlZmluZSBERUJVR19TVUJTWVNURU0gU19MTElURQogCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIgogI2luY2x1ZGUgImxsaXRlX2ludGVybmFsLmgiCiAKIHN0YXRpYyBpbnQgbGxfcmVhZGxpbmtfaW50ZXJuYWwoc3RydWN0IGlub2RlICppbm9kZSwKQEAgLTgwLDE3ICs3OSwxNyBAQAogCX0KIAogCWJvZHkgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfZ2V0KCYoKnJlcXVlc3QpLT5ycV9waWxsLCAmUk1GX01EVF9CT0RZKTsKLQlpZiAoKGJvZHktPnZhbGlkICYgT0JEX01EX0xJTktOQU1FKSA9PSAwKSB7CisJaWYgKChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfTElOS05BTUUpID09IDApIHsKIAkJQ0VSUk9SKCJPQkRfTURfTElOS05BTUUgbm90IHNldCBvbiByZXBseVxuIik7CiAJCXJjID0gLUVQUk9UTzsKIAkJZ290byBmYWlsZWQ7CiAJfQogCiAJTEFTU0VSVChzeW1sZW4gIT0gMCk7Ci0JaWYgKGJvZHktPmVhZGF0YXNpemUgIT0gc3ltbGVuKSB7CisJaWYgKGJvZHktPm1ib19lYWRhdGFzaXplICE9IHN5bWxlbikgewogCQlDRVJST1IoIiVzOiBpbm9kZSAiREZJRCI6IHN5bWxpbmsgbGVuZ3RoICVkIG5vdCBleHBlY3RlZCAlZFxuIiwKIAkJICAgICAgIGxsX2dldF9mc25hbWUoaW5vZGUtPmlfc2IsIE5VTEwsIDApLAotCQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSwgYm9keS0+ZWFkYXRhc2l6ZSAtIDEsCisJCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpLCBib2R5LT5tYm9fZWFkYXRhc2l6ZSAtIDEsCiAJCSAgICAgICBzeW1sZW4gLSAxKTsKIAkJcmMgPSAtRVBST1RPOwogCQlnb3RvIGZhaWxlZDsKQEAgLTE1NSw4ICsxNTQsOCBAQAogCS5nZXRfbGluawk9IGxsX2dldF9saW5rLAogCS5nZXRhdHRyCT0gbGxfZ2V0YXR0ciwKIAkucGVybWlzc2lvbgk9IGxsX2lub2RlX3Blcm1pc3Npb24sCi0JLnNldHhhdHRyCT0gbGxfc2V0eGF0dHIsCi0JLmdldHhhdHRyCT0gbGxfZ2V0eGF0dHIsCisJLnNldHhhdHRyCT0gZ2VuZXJpY19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIJPSBnZW5lcmljX2dldHhhdHRyLAogCS5saXN0eGF0dHIJPSBsbF9saXN0eGF0dHIsCi0JLnJlbW92ZXhhdHRyCT0gbGxfcmVtb3ZleGF0dHIsCisJLnJlbW92ZXhhdHRyCT0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfZGV2LmMKaW5kZXggZTYyMzIxNi4uOGFhOGVjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX2Rldi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9kZXYuYwpAQCAtMzgsNyArMzgsNiBAQAogI2RlZmluZSBERUJVR19TVUJTWVNURU0gU19MTElURQogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmQuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saXRlLmgiCiAjaW5jbHVkZSAibGxpdGVfaW50ZXJuYWwuaCIKICNpbmNsdWRlICJ2dnBfaW50ZXJuYWwuaCIKIApAQCAtMzY4LDEyICszNjcsNiBAQAogCQlDRVJST1IoIkNhbm5vdCBjbGVhbnVwIGNsLXN0YWNrIGR1ZSB0byBtZW1vcnkgc2hvcnRhZ2UuXG4iKTsKIAkJcmVzdWx0ID0gUFRSX0VSUihlbnYpOwogCX0KLQkvKgotCSAqIElmIG1vdW50IGZhaWxlZCAoc2JpLT5sbF9jbCA9PSBOVUxMKSwgYW5kIHRoaXMgdGhlcmUgYXJlIG5vIG90aGVyCi0JICogbW91bnRzLCBzdG9wIGRldmljZSB0eXBlcyBtYW51YWxseSAodGhpcyB1c3VhbGx5IGhhcHBlbnMKLQkgKiBhdXRvbWF0aWNhbGx5IHdoZW4gbGFzdCBkZXZpY2UgaXMgZGVzdHJveWVkKS4KLQkgKi8KLQlsdV90eXBlc19zdG9wKCk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfaW50ZXJuYWwuaAppbmRleCA3OWZjNDI4Li41ODAyZGE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfaW50ZXJuYWwuaApAQCAtMjE3LDExICsyMTcsMTIgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCXZvYl9wZW5kaW5nX2xpc3Q7CiAKIAkvKioKLQkgKiBBY2Nlc3MgdGhpcyBjb3VudGVyIGlzIHByb3RlY3RlZCBieSBpbm9kZS0+aV9zZW0uIE5vdyB0aGF0Ci0JICogdGhlIGxpZmV0aW1lIG9mIHRyYW5zaWVudCBwYWdlcyBtdXN0IGJlIGNvdmVyZWQgYnkgaW5vZGUgc2VtLAotCSAqIHdlIGRvbid0IG5lZWQgdG8gaG9sZCBhbnkgbG9jay4uCisJICogTnVtYmVyIG9mIHRyYW5zaWVudCBwYWdlcy4gIFRoaXMgaXMgbm8gbG9uZ2VyIHByb3RlY3RlZCBieSBpX3NlbSwKKwkgKiBhbmQgbmVlZHMgdG8gYmUgYXRvbWljLiAgVGhpcyBpcyBub3QgYWN0dWFsbHkgdXNlZCBmb3IgYW55dGhpbmcsCisJICogYW5kIGNhbiBwcm9iYWJseSBiZSByZW1vdmVkLgogCSAqLwotCWludAkJCXZvYl90cmFuc2llbnRfcGFnZXM7CisJYXRvbWljX3QJCXZvYl90cmFuc2llbnRfcGFnZXM7CisKIAkvKioKIAkgKiBOdW1iZXIgb2Ygb3V0c3RhbmRpbmcgbW1hcHMgb24gdGhpcyBmaWxlLgogCSAqCkBAIC0yNDcsOSArMjQ4LDkgQEAKICAqLwogc3RydWN0IHZ2cF9wYWdlIHsKIAlzdHJ1Y3QgY2xfcGFnZV9zbGljZSB2cGdfY2w7Ci0JaW50CQkgIHZwZ19kZWZlcl91cHRvZGF0ZTsKLQlpbnQJCSAgdnBnX3JhX3VzZWQ7Ci0JaW50CQkgIHZwZ193cml0ZV9xdWV1ZWQ7CisJdW5zaWduZWQgaW50CXZwZ19kZWZlcl91cHRvZGF0ZToxLAorCQkJdnBnX3JhX3VzZWQ6MSwKKwkJCXZwZ193cml0ZV9xdWV1ZWQ6MTsKIAkvKioKIAkgKiBOb24tZW1wdHkgaWZmIHRoaXMgcGFnZSBpcyBhbHJlYWR5IGNvdW50ZWQgaW4KIAkgKiB2dnBfb2JqZWN0Ojp2b2JfcGVuZGluZ19saXN0LiBUaGlzIGxpc3QgaXMgb25seSB1c2VkIGFzIGEgZmxhZywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9pby5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX2lvLmMKaW5kZXggOTQ5MTZkYy4uMmFiNDUwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX2lvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX2lvLmMKQEAgLTM4LDcgKzM4LDYgQEAKICNkZWZpbmUgREVCVUdfU1VCU1lTVEVNIFNfTExJVEUKIAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkLmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIgogCiAjaW5jbHVkZSAibGxpdGVfaW50ZXJuYWwuaCIKICNpbmNsdWRlICJ2dnBfaW50ZXJuYWwuaCIKQEAgLTYyOCw3ICs2MjcsNyBAQAogCQlhdHRyLT5jYXRfbXRpbWUgPSBpby0+dS5jaV9zZXRhdHRyLnNhX2F0dHIubHZiX210aW1lOwogCQl2YWxpZCB8PSBDQVRfTVRJTUU7CiAJfQotCXJlc3VsdCA9IGNsX29iamVjdF9hdHRyX3NldChlbnYsIG9iaiwgYXR0ciwgdmFsaWQpOworCXJlc3VsdCA9IGNsX29iamVjdF9hdHRyX3VwZGF0ZShlbnYsIG9iaiwgYXR0ciwgdmFsaWQpOwogCWNsX29iamVjdF9hdHRyX3VubG9jayhvYmopOwogCiAJcmV0dXJuIHJlc3VsdDsKQEAgLTgyMSw3ICs4MjAsNyBAQAogCWNsX3BhZ2VfZGlzb3duKGVudiwgaW8sIHBhZ2UpOwogCiAJLyogaGVsZCBpbiBsbF9jbF9pbml0KCkgKi8KLQlsdV9yZWZfZGVsKCZwYWdlLT5jcF9yZWZlcmVuY2UsICJjbF9pbyIsIGlvKTsKKwlsdV9yZWZfZGVsKCZwYWdlLT5jcF9yZWZlcmVuY2UsICJjbF9pbyIsIGNsX2lvX3RvcChpbykpOwogCWNsX3BhZ2VfcHV0KGVudiwgcGFnZSk7CiB9CiAKQEAgLTk1OSwxMCArOTU4LDMwIEBACiAKIAlDREVCVUcoRF9WRlNUUkFDRSwgIndyaXRlOiBbJWxsaSwgJWxsaSlcbiIsIHBvcywgcG9zICsgKGxvbmcgbG9uZyljbnQpOwogCi0JaWYgKCF2aW8tPnZ1aV9pdGVyKSAvKiBmcm9tIGEgdGVtcCBpbyBpbiBsbF9jbF9pbml0KCkuICovCisJaWYgKCF2aW8tPnZ1aV9pdGVyKSB7CisJCS8qIGZyb20gYSB0ZW1wIGlvIGluIGxsX2NsX2luaXQoKS4gKi8KIAkJcmVzdWx0ID0gMDsKLQllbHNlCi0JCXJlc3VsdCA9IGdlbmVyaWNfZmlsZV93cml0ZV9pdGVyKHZpby0+dnVpX2lvY2IsIHZpby0+dnVpX2l0ZXIpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFdoZW4gdXNpbmcgdGhlIGxvY2tlZCBBSU8gZnVuY3Rpb24gKGdlbmVyaWNfZmlsZV9haW9fd3JpdGUoKSkKKwkJICogdGVzdGluZyBoYXMgc2hvd24gdGhlIGlub2RlIG11dGV4IHRvIGJlIGEgbGltaXRpbmcgZmFjdG9yCisJCSAqIHdpdGggbXVsdGktdGhyZWFkZWQgc2luZ2xlIHNoYXJlZCBmaWxlIHBlcmZvcm1hbmNlLiBUbyBnZXQKKwkJICogYXJvdW5kIHRoaXMsIHdlIG5vdyB1c2UgdGhlIGxvY2tsZXNzIHZlcnNpb24uIFRvIG1haW50YWluCisJCSAqIGNvbnNpc3RlbmN5LCBwcm9wZXIgbG9ja2luZyB0byBwcm90ZWN0IGFnYWluc3Qgd3JpdGVzLAorCQkgKiB0cnVjYXRlcywgZXRjLiBpcyBoYW5kbGVkIGluIHRoZSBoaWdoZXIgbGF5ZXJzIG9mIGx1c3RyZS4KKwkJICovCisJCWJvb2wgbG9ja19ub2RlID0gIUlTX05PU0VDKGlub2RlKTsKKworCQlpZiAobG9ja19ub2RlKQorCQkJaW5vZGVfbG9jayhpbm9kZSk7CisJCXJlc3VsdCA9IF9fZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIodmlvLT52dWlfaW9jYiwKKwkJCQkJCSAgIHZpby0+dnVpX2l0ZXIpOworCQlpZiAobG9ja19ub2RlKQorCQkJaW5vZGVfdW5sb2NrKGlub2RlKTsKKworCQlpZiAocmVzdWx0ID4gMCB8fCByZXN1bHQgPT0gLUVJT0NCUVVFVUVEKQorCQkJcmVzdWx0ID0gZ2VuZXJpY193cml0ZV9zeW5jKHZpby0+dnVpX2lvY2IsIHJlc3VsdCk7CisJfQogCiAJaWYgKHJlc3VsdCA+IDApIHsKIAkJcmVzdWx0ID0gdnZwX2lvX3dyaXRlX2NvbW1pdChlbnYsIGlvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9sb2NrLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfbG9jay5jCmluZGV4IDY0YmUwYzkuLjA3ZWIyNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9sb2NrLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX2xvY2suYwpAQCAtMzcsNyArMzcsNiBAQAogI2RlZmluZSBERUJVR19TVUJTWVNURU0gU19MTElURQogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmRfc3VwcG9ydC5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKIAogI2luY2x1ZGUgInZ2cF9pbnRlcm5hbC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfb2JqZWN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfb2JqZWN0LmMKaW5kZXggMmM1MjBiMC4uYjU3MTk1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX29iamVjdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9vYmplY3QuYwpAQCAtMzksNyArMzksNiBAQAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmcy5oIgogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmQuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saXRlLmgiCiAKICNpbmNsdWRlICJsbGl0ZV9pbnRlcm5hbC5oIgogI2luY2x1ZGUgInZ2cF9pbnRlcm5hbC5oIgpAQCAtNjgsOCArNjcsOCBAQAogCiAJKCpwKShlbnYsIGNvb2tpZSwgIiglcyAlZCAlZCkgaW5vZGU6ICVwICIsCiAJICAgICBsaXN0X2VtcHR5KCZvYmotPnZvYl9wZW5kaW5nX2xpc3QpID8gIi0iIDogIisiLAotCSAgICAgb2JqLT52b2JfdHJhbnNpZW50X3BhZ2VzLCBhdG9taWNfcmVhZCgmb2JqLT52b2JfbW1hcF9jbnQpLAotCSAgICAgaW5vZGUpOworCSAgICAgYXRvbWljX3JlYWQoJm9iai0+dm9iX3RyYW5zaWVudF9wYWdlcyksCisJICAgICBhdG9taWNfcmVhZCgmb2JqLT52b2JfbW1hcF9jbnQpLCBpbm9kZSk7CiAJaWYgKGlub2RlKSB7CiAJCWxsaSA9IGxsX2kyaW5mbyhpbm9kZSk7CiAJCSgqcCkoZW52LCBjb29raWUsICIlbHUvJXUgJW8gJXUgJWQgJXAgIkRGSUQsCkBAIC0xMDIsOCArMTAxLDggQEAKIAlyZXR1cm4gMDsgLyogbGF5ZXJzIGJlbG93IGhhdmUgdG8gZmlsbCBpbiB0aGUgcmVzdCAqLwogfQogCi1zdGF0aWMgaW50IHZ2cF9hdHRyX3NldChjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBjbF9vYmplY3QgKm9iaiwKLQkJCWNvbnN0IHN0cnVjdCBjbF9hdHRyICphdHRyLCB1bnNpZ25lZCB2YWxpZCkKK3N0YXRpYyBpbnQgdnZwX2F0dHJfdXBkYXRlKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsX29iamVjdCAqb2JqLAorCQkJICAgY29uc3Qgc3RydWN0IGNsX2F0dHIgKmF0dHIsIHVuc2lnbmVkIGludCB2YWxpZCkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gdnZwX29iamVjdF9pbm9kZShvYmopOwogCkBAIC0xMjAsNyArMTE5LDcgQEAKIAlpZiAoMCAmJiB2YWxpZCAmIENBVF9TSVpFKQogCQlpX3NpemVfd3JpdGUoaW5vZGUsIGF0dHItPmNhdF9zaXplKTsKIAkvKiBub3QgY3VycmVudGx5IG5lY2Vzc2FyeSAqLwotCWlmICgwICYmIHZhbGlkICYgKENBVF9VSUR8Q0FUX0dJRHxDQVRfU0laRSkpCisJaWYgKDAgJiYgdmFsaWQgJiAoQ0FUX1VJRCB8IENBVF9HSUQgfCBDQVRfU0laRSkpCiAJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCXJldHVybiAwOwogfQpAQCAtMjEwLDcgKzIwOSw3IEBACiAJLmNvb19sb2NrX2luaXQgPSB2dnBfbG9ja19pbml0LAogCS5jb29faW9faW5pdCAgID0gdnZwX2lvX2luaXQsCiAJLmNvb19hdHRyX2dldCAgPSB2dnBfYXR0cl9nZXQsCi0JLmNvb19hdHRyX3NldCAgPSB2dnBfYXR0cl9zZXQsCisJLmNvb19hdHRyX3VwZGF0ZSA9IHZ2cF9hdHRyX3VwZGF0ZSwKIAkuY29vX2NvbmZfc2V0ICA9IHZ2cF9jb25mX3NldCwKIAkuY29vX3BydW5lICAgICA9IHZ2cF9wcnVuZSwKIAkuY29vX2dsaW1wc2UgICA9IHZ2cF9vYmplY3RfZ2xpbXBzZQpAQCAtMjIxLDcgKzIyMCw3IEBACiAJCQkgICAgY29uc3Qgc3RydWN0IGNsX29iamVjdF9jb25mICpjb25mKQogewogCXZvYi0+dm9iX2lub2RlID0gY29uZi0+Y29jX2lub2RlOwotCXZvYi0+dm9iX3RyYW5zaWVudF9wYWdlcyA9IDA7CisJYXRvbWljX3NldCgmdm9iLT52b2JfdHJhbnNpZW50X3BhZ2VzLCAwKTsKIAljbF9vYmplY3RfcGFnZV9pbml0KCZ2b2ItPnZvYl9jbCwgc2l6ZW9mKHN0cnVjdCB2dnBfcGFnZSkpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX3BhZ2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9wYWdlLmMKaW5kZXggMmU1NjZkOS4uNWQ3OWVmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX3BhZ2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfcGFnZS5jCkBAIC00NCw4ICs0NCw2IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZS1mbGFncy5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KIAotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKLQogI2luY2x1ZGUgImxsaXRlX2ludGVybmFsLmgiCiAjaW5jbHVkZSAidnZwX2ludGVybmFsLmgiCiAKQEAgLTI0OSw3ICsyNDcsNyBAQAogCQkJc2V0X2JpdChBU19FSU8sICZpbm9kZS0+aV9tYXBwaW5nLT5mbGFncyk7CiAKIAkJaWYgKChpb3JldCA9PSAtRVNIVVRET1dOIHx8IGlvcmV0ID09IC1FSU5UUikgJiYKLQkJICAgICBvYmotPnZvYl9kaXNjYXJkX3BhZ2Vfd2FybmVkID09IDApIHsKKwkJICAgIG9iai0+dm9iX2Rpc2NhcmRfcGFnZV93YXJuZWQgPT0gMCkgewogCQkJb2JqLT52b2JfZGlzY2FyZF9wYWdlX3dhcm5lZCA9IDE7CiAJCQlsbF9kaXJ0eV9wYWdlX2Rpc2NhcmRfd2Fybih2bXBhZ2UsIGlvcmV0KTsKIAkJfQpAQCAtNDQ0LDE4ICs0NDIsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgdnZwX3RyYW5zaWVudF9wYWdlX3ZlcmlmeShjb25zdCBzdHJ1Y3QgY2xfcGFnZSAqcGFnZSkKLXsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gdnZwX29iamVjdF9pbm9kZShwYWdlLT5jcF9vYmopOwotCi0JTEFTU0VSVCghaW5vZGVfdHJ5bG9jayhpbm9kZSkpOwotfQotCiBzdGF0aWMgaW50IHZ2cF90cmFuc2llbnRfcGFnZV9vd24oY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LAogCQkJCSAgY29uc3Qgc3RydWN0IGNsX3BhZ2Vfc2xpY2UgKnNsaWNlLAogCQkJCSAgc3RydWN0IGNsX2lvICp1bnVzZWQsIGludCBub25ibG9jaykKIHsKLQl2dnBfdHJhbnNpZW50X3BhZ2VfdmVyaWZ5KHNsaWNlLT5jcGxfcGFnZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ2MywyMSArNDUzLDE4IEBACiAJCQkJICAgICAgY29uc3Qgc3RydWN0IGNsX3BhZ2Vfc2xpY2UgKnNsaWNlLAogCQkJCSAgICAgIHN0cnVjdCBjbF9pbyAqdW51c2VkKQogewotCXZ2cF90cmFuc2llbnRfcGFnZV92ZXJpZnkoc2xpY2UtPmNwbF9wYWdlKTsKIH0KIAogc3RhdGljIHZvaWQgdnZwX3RyYW5zaWVudF9wYWdlX3VuYXNzdW1lKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwKIAkJCQkJY29uc3Qgc3RydWN0IGNsX3BhZ2Vfc2xpY2UgKnNsaWNlLAogCQkJCQlzdHJ1Y3QgY2xfaW8gKnVudXNlZCkKIHsKLQl2dnBfdHJhbnNpZW50X3BhZ2VfdmVyaWZ5KHNsaWNlLT5jcGxfcGFnZSk7CiB9CiAKIHN0YXRpYyB2b2lkIHZ2cF90cmFuc2llbnRfcGFnZV9kaXNvd24oY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LAogCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBjbF9wYWdlX3NsaWNlICpzbGljZSwKIAkJCQkgICAgICBzdHJ1Y3QgY2xfaW8gKnVudXNlZCkKIHsKLQl2dnBfdHJhbnNpZW50X3BhZ2VfdmVyaWZ5KHNsaWNlLT5jcGxfcGFnZSk7CiB9CiAKIHN0YXRpYyB2b2lkIHZ2cF90cmFuc2llbnRfcGFnZV9kaXNjYXJkKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwKQEAgLTQ4Niw4ICs0NzMsNiBAQAogewogCXN0cnVjdCBjbF9wYWdlICpwYWdlID0gc2xpY2UtPmNwbF9wYWdlOwogCi0JdnZwX3RyYW5zaWVudF9wYWdlX3ZlcmlmeShzbGljZS0+Y3BsX3BhZ2UpOwotCiAJLyoKIAkgKiBGb3IgdHJhbnNpZW50IHBhZ2VzLCByZW1vdmUgaXQgZnJvbSB0aGUgcmFkaXggdHJlZS4KIAkgKi8KQEAgLTUxMSw3ICs0OTYsNiBAQAogCQkJICAgICAgY29uc3Qgc3RydWN0IGNsX3BhZ2Vfc2xpY2UgKnNsaWNlLAogCQkJICAgICAgaW50IGlvcmV0KQogewotCXZ2cF90cmFuc2llbnRfcGFnZV92ZXJpZnkoc2xpY2UtPmNwbF9wYWdlKTsKIH0KIAogc3RhdGljIHZvaWQgdnZwX3RyYW5zaWVudF9wYWdlX2ZpbmkoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LApAQCAtNTIyLDggKzUwNiw3IEBACiAJc3RydWN0IHZ2cF9vYmplY3QgKmNsb2JqID0gY2wydnZwKGNscC0+Y3Bfb2JqKTsKIAogCXZ2cF9wYWdlX2ZpbmlfY29tbW9uKHZwZyk7Ci0JTEFTU0VSVCghaW5vZGVfdHJ5bG9jayhjbG9iai0+dm9iX2lub2RlKSk7Ci0JY2xvYmotPnZvYl90cmFuc2llbnRfcGFnZXMtLTsKKwlhdG9taWNfZGVjKCZjbG9iai0+dm9iX3RyYW5zaWVudF9wYWdlcyk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xfcGFnZV9vcGVyYXRpb25zIHZ2cF90cmFuc2llbnRfcGFnZV9vcHMgPSB7CkBAIC01NDksNyArNTMyLDcgQEAKIH07CiAKIGludCB2dnBfcGFnZV9pbml0KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsX29iamVjdCAqb2JqLAotCQlzdHJ1Y3QgY2xfcGFnZSAqcGFnZSwgcGdvZmZfdCBpbmRleCkKKwkJICBzdHJ1Y3QgY2xfcGFnZSAqcGFnZSwgcGdvZmZfdCBpbmRleCkKIHsKIAlzdHJ1Y3QgdnZwX3BhZ2UgKnZwZyA9IGNsX29iamVjdF9wYWdlX3NsaWNlKG9iaiwgcGFnZSk7CiAJc3RydWN0IHBhZ2UgICAgICp2bXBhZ2UgPSBwYWdlLT5jcF92bXBhZ2U7CkBAIC01NzAsMTAgKzU1Myw5IEBACiAJfSBlbHNlIHsKIAkJc3RydWN0IHZ2cF9vYmplY3QgKmNsb2JqID0gY2wydnZwKG9iaik7CiAKLQkJTEFTU0VSVCghaW5vZGVfdHJ5bG9jayhjbG9iai0+dm9iX2lub2RlKSk7CiAJCWNsX3BhZ2Vfc2xpY2VfYWRkKHBhZ2UsICZ2cGctPnZwZ19jbCwgb2JqLCBpbmRleCwKIAkJCQkgICZ2dnBfdHJhbnNpZW50X3BhZ2Vfb3BzKTsKLQkJY2xvYmotPnZvYl90cmFuc2llbnRfcGFnZXMrKzsKKwkJYXRvbWljX2luYygmY2xvYmotPnZvYl90cmFuc2llbnRfcGFnZXMpOwogCX0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9yZXEuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9yZXEuYwppbmRleCA5ZmU5ZDZjLi5lM2Y0Yzc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfcmVxLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX3JlcS5jCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9jbF9vYmplY3QuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkX3N1cHBvcnQuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saXRlLmgiCiAjaW5jbHVkZSAibGxpdGVfaW50ZXJuYWwuaCIKICNpbmNsdWRlICJ2dnBfaW50ZXJuYWwuaCIKIApAQCAtODMsOCArODIsMTAgQEAKIAl9CiAJb2Jkb19mcm9tX2lub2RlKG9hLCBpbm9kZSwgdmFsaWRfZmxhZ3MgJiBmbGFncyk7CiAJb2Jkb19zZXRfcGFyZW50X2ZpZChvYSwgJmxsX2kyaW5mbyhpbm9kZSktPmxsaV9maWQpOworCWlmIChPQkRfRkFJTF9DSEVDSyhPQkRfRkFJTF9MRlNDS19JTlZBTElEX1BGSUQpKQorCQlvYS0+b19wYXJlbnRfb2lkKys7CiAJbWVtY3B5KGF0dHItPmNyYV9qb2JpZCwgbGxfaTJpbmZvKGlub2RlKS0+bGxpX2pvYmlkLAotCSAgICAgICBKT0JTVEFUU19KT0JJRF9TSVpFKTsKKwkgICAgICAgTFVTVFJFX0pPQklEX1NJWkUpOwogfQogCiBzdGF0aWMgdm9pZCB2dnBfcmVxX2NvbXBsZXRpb24oY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUveGF0dHIuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3hhdHRyLmMKaW5kZXggOTgzMDNjZi4uZTA3MGFkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUveGF0dHIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS94YXR0ci5jCkBAIC0zOCwyMSArMzgsMTIgQEAKICNkZWZpbmUgREVCVUdfU1VCU1lTVEVNIFNfTExJVEUKIAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkX3N1cHBvcnQuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saXRlLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfZGxtLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfdmVyLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfZWFjbC5oIgogCiAjaW5jbHVkZSAibGxpdGVfaW50ZXJuYWwuaCIKIAotI2RlZmluZSBYQVRUUl9VU0VSX1QJICAgICgxKQotI2RlZmluZSBYQVRUUl9UUlVTVEVEX1QJICgyKQotI2RlZmluZSBYQVRUUl9TRUNVUklUWV9UCSgzKQotI2RlZmluZSBYQVRUUl9BQ0xfQUNDRVNTX1QgICAgICAoNCkKLSNkZWZpbmUgWEFUVFJfQUNMX0RFRkFVTFRfVCAgICAgKDUpCi0jZGVmaW5lIFhBVFRSX0xVU1RSRV9UCSAgKDYpCi0jZGVmaW5lIFhBVFRSX09USEVSX1QJICAgKDcpCi0KIHN0YXRpYwogaW50IGdldF94YXR0cl90eXBlKGNvbnN0IGNoYXIgKm5hbWUpCiB7CkBAIC05OSw0NiArOTAsNTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljCi1pbnQgbGxfc2V0eGF0dHJfY29tbW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCSAgICAgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsCi0JCSAgICAgICBpbnQgZmxhZ3MsIF9fdTY0IHZhbGlkKQorc3RhdGljIGludAorbGxfeGF0dHJfc2V0X2NvbW1vbihjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqaGFuZGxlciwKKwkJICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwKKwkJICAgIGludCBmbGFncykKIHsKKwljaGFyIGZ1bGxuYW1lW3N0cmxlbihoYW5kbGVyLT5wcmVmaXgpICsgc3RybGVuKG5hbWUpICsgMV07CiAJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGxsX2kyc2JpKGlub2RlKTsKIAlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSA9IE5VTEw7Ci0JaW50IHhhdHRyX3R5cGUsIHJjOwogCWNvbnN0IGNoYXIgKnB2ID0gdmFsdWU7CisJX191NjQgdmFsaWQ7CisJaW50IHJjOwogCi0JeGF0dHJfdHlwZSA9IGdldF94YXR0cl90eXBlKG5hbWUpOwotCXJjID0geGF0dHJfdHlwZV9maWx0ZXIoc2JpLCB4YXR0cl90eXBlKTsKKwlpZiAoZmxhZ3MgPT0gWEFUVFJfUkVQTEFDRSkgeworCQlsbF9zdGF0c19vcHNfdGFsbHkobGxfaTJzYmkoaW5vZGUpLCBMUFJPQ19MTF9SRU1PVkVYQVRUUiwgMSk7CisJCXZhbGlkID0gT0JEX01EX0ZMWEFUVFJSTTsKKwl9IGVsc2UgeworCQlsbF9zdGF0c19vcHNfdGFsbHkobGxfaTJzYmkoaW5vZGUpLCBMUFJPQ19MTF9TRVRYQVRUUiwgMSk7CisJCXZhbGlkID0gT0JEX01EX0ZMWEFUVFI7CisJfQorCisJcmMgPSB4YXR0cl90eXBlX2ZpbHRlcihzYmksIGhhbmRsZXItPmZsYWdzKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCWlmICgoeGF0dHJfdHlwZSA9PSBYQVRUUl9BQ0xfQUNDRVNTX1QgfHwKLQkgICAgIHhhdHRyX3R5cGUgPT0gWEFUVFJfQUNMX0RFRkFVTFRfVCkgJiYKKwlpZiAoKGhhbmRsZXItPmZsYWdzID09IFhBVFRSX0FDTF9BQ0NFU1NfVCB8fAorCSAgICAgaGFuZGxlci0+ZmxhZ3MgPT0gWEFUVFJfQUNMX0RFRkFVTFRfVCkgJiYKIAkgICAgIWlub2RlX293bmVyX29yX2NhcGFibGUoaW5vZGUpKQogCQlyZXR1cm4gLUVQRVJNOwogCiAJLyogYjEwNjY3OiBpZ25vcmUgbHVzdHJlIHNwZWNpYWwgeGF0dHIgZm9yIG5vdyAqLwotCWlmICgoeGF0dHJfdHlwZSA9PSBYQVRUUl9UUlVTVEVEX1QgJiYgc3RyY21wKG5hbWUsICJ0cnVzdGVkLmxvdiIpID09IDApIHx8Ci0JICAgICh4YXR0cl90eXBlID09IFhBVFRSX0xVU1RSRV9UICYmIHN0cmNtcChuYW1lLCAibHVzdHJlLmxvdiIpID09IDApKQorCWlmICgoaGFuZGxlci0+ZmxhZ3MgPT0gWEFUVFJfVFJVU1RFRF9UICYmICFzdHJjbXAobmFtZSwgImxvdiIpKSB8fAorCSAgICAoaGFuZGxlci0+ZmxhZ3MgPT0gWEFUVFJfTFVTVFJFX1QgJiYgIXN0cmNtcChuYW1lLCAibG92IikpKQogCQlyZXR1cm4gMDsKIAogCS8qIGIxNTU4NzogaWdub3JlIHNlY3VyaXR5LmNhcGFiaWxpdHkgeGF0dHIgZm9yIG5vdyAqLwotCWlmICgoeGF0dHJfdHlwZSA9PSBYQVRUUl9TRUNVUklUWV9UICYmCi0JICAgICBzdHJjbXAobmFtZSwgInNlY3VyaXR5LmNhcGFiaWxpdHkiKSA9PSAwKSkKKwlpZiAoKGhhbmRsZXItPmZsYWdzID09IFhBVFRSX1NFQ1VSSVRZX1QgJiYKKwkgICAgICFzdHJjbXAobmFtZSwgImNhcGFiaWxpdHkiKSkpCiAJCXJldHVybiAwOwogCiAJLyogTFUtNTQ5OiAgRGlzYWJsZSBzZWN1cml0eS5zZWxpbnV4IHdoZW4gc2VsaW51eCBpcyBkaXNhYmxlZCAqLwotCWlmICh4YXR0cl90eXBlID09IFhBVFRSX1NFQ1VSSVRZX1QgJiYgIXNlbGludXhfaXNfZW5hYmxlZCgpICYmCi0JICAgIHN0cmNtcChuYW1lLCAic2VjdXJpdHkuc2VsaW51eCIpID09IDApCisJaWYgKGhhbmRsZXItPmZsYWdzID09IFhBVFRSX1NFQ1VSSVRZX1QgJiYgIXNlbGludXhfaXNfZW5hYmxlZCgpICYmCisJICAgIHN0cmNtcChuYW1lLCAic2VsaW51eCIpID09IDApCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAorCXNwcmludGYoZnVsbG5hbWUsICIlcyVzXG4iLCBoYW5kbGVyLT5wcmVmaXgsIG5hbWUpOwogCXJjID0gbWRfc2V0eGF0dHIoc2JpLT5sbF9tZF9leHAsIGxsX2lub2RlMmZpZChpbm9kZSksCi0JCQkgdmFsaWQsIG5hbWUsIHB2LCBzaXplLCAwLCBmbGFncywKKwkJCSB2YWxpZCwgZnVsbG5hbWUsIHB2LCBzaXplLCAwLCBmbGFncywKIAkJCSBsbF9pMnN1cHBnaWQoaW5vZGUpLCAmcmVxKTsKIAlpZiAocmMpIHsKLQkJaWYgKHJjID09IC1FT1BOT1RTVVBQICYmIHhhdHRyX3R5cGUgPT0gWEFUVFJfVVNFUl9UKSB7CisJCWlmIChyYyA9PSAtRU9QTk9UU1VQUCAmJiBoYW5kbGVyLT5mbGFncyA9PSBYQVRUUl9VU0VSX1QpIHsKIAkJCUxDT05TT0xFX0lORk8oIkRpc2FibGluZyB1c2VyX3hhdHRyIGZlYXR1cmUgYmVjYXVzZSBpdCBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBzZXJ2ZXJcbiIpOwogCQkJc2JpLT5sbF9mbGFncyAmPSB+TExfU0JJX1VTRVJfWEFUVFI7CiAJCX0KQEAgLTE0OSw4ICsxNTEsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGxsX3NldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCitzdGF0aWMgaW50IGxsX3hhdHRyX3NldChjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqaGFuZGxlciwKKwkJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCWNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwKKwkJCWludCBmbGFncykKIHsKIAlMQVNTRVJUKGlub2RlKTsKIAlMQVNTRVJUKG5hbWUpOwpAQCAtMTU4LDIwICsxNjIsMjQgQEAKIAlDREVCVUcoRF9WRlNUUkFDRSwgIlZGUyBPcDppbm9kZT0iREZJRCIoJXApLCB4YXR0ciAlc1xuIiwKIAkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSwgaW5vZGUsIG5hbWUpOwogCi0JbGxfc3RhdHNfb3BzX3RhbGx5KGxsX2kyc2JpKGlub2RlKSwgTFBST0NfTExfU0VUWEFUVFIsIDEpOwotCi0JaWYgKChzdHJuY21wKG5hbWUsIFhBVFRSX1RSVVNURURfUFJFRklYLAotCQkgICAgIHNpemVvZihYQVRUUl9UUlVTVEVEX1BSRUZJWCkgLSAxKSA9PSAwICYmCi0JICAgICBzdHJjbXAobmFtZSArIHNpemVvZihYQVRUUl9UUlVTVEVEX1BSRUZJWCkgLSAxLCAibG92IikgPT0gMCkgfHwKLQkgICAgKHN0cm5jbXAobmFtZSwgWEFUVFJfTFVTVFJFX1BSRUZJWCwKLQkJICAgICBzaXplb2YoWEFUVFJfTFVTVFJFX1BSRUZJWCkgLSAxKSA9PSAwICYmCi0JICAgICBzdHJjbXAobmFtZSArIHNpemVvZihYQVRUUl9MVVNUUkVfUFJFRklYKSAtIDEsICJsb3YiKSA9PSAwKSkgeworCWlmICghc3RyY21wKG5hbWUsICJsb3YiKSkgewogCQlzdHJ1Y3QgbG92X3VzZXJfbWQgKmx1bXAgPSAoc3RydWN0IGxvdl91c2VyX21kICopdmFsdWU7CisJCWludCBvcF90eXBlID0gZmxhZ3MgPT0gWEFUVFJfUkVQTEFDRSA/IExQUk9DX0xMX1JFTU9WRVhBVFRSIDoKKwkJCQkJCSAgICAgICBMUFJPQ19MTF9TRVRYQVRUUjsKIAkJaW50IHJjID0gMDsKIAorCQlsbF9zdGF0c19vcHNfdGFsbHkobGxfaTJzYmkoaW5vZGUpLCBvcF90eXBlLCAxKTsKKwogCQlpZiAoc2l6ZSAhPSAwICYmIHNpemUgPCBzaXplb2Yoc3RydWN0IGxvdl91c2VyX21kKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCisJCS8qCisJCSAqIEl0IGlzIHBvc3NpYmxlIHRvIHNldCBhbiB4YXR0ciB0byBhICIiIHZhbHVlIG9mIHplcm8gc2l6ZS4KKwkJICogRm9yIHRoaXMgY2FzZSB3ZSBhcmUgZ29pbmcgdG8gdHJlYXQgaXQgYXMgYSByZW1vdmFsLgorCQkgKi8KKwkJaWYgKCFzaXplICYmIGx1bXApCisJCQlsdW1wID0gTlVMTDsKKwogCQkvKiBBdHRyaWJ1dGVzIHRoYXQgYXJlIHNhdmVkIHZpYSBnZXR4YXR0ciB3aWxsIGFsd2F5cyBoYXZlCiAJCSAqIHRoZSBzdHJpcGVfb2Zmc2V0IGFzIDAuICBJbnN0ZWFkLCB0aGUgTURTIHNob3VsZCBiZQogCQkgKiBhbGxvd2VkIHRvIHBpY2sgdGhlIHN0YXJ0aW5nIE9TVCBpbmRleC4gICBiPTE3ODQ2CkBAIC0xODEsMTIgKzE4OSwxNSBAQAogCiAJCWlmIChsdW1wICYmIFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKIAkJCV9fdTY0IGl0X2ZsYWdzID0gRk1PREVfV1JJVEU7Ci0JCQlpbnQgbHVtX3NpemUgPSAobHVtcC0+bG1tX21hZ2ljID09IExPVl9VU0VSX01BR0lDX1YxKSA/Ci0JCQkJc2l6ZW9mKCpsdW1wKSA6IHNpemVvZihzdHJ1Y3QgbG92X3VzZXJfbWRfdjMpOworCQkJaW50IGx1bV9zaXplOworCisJCQlsdW1fc2l6ZSA9IGxsX2xvdl91c2VyX21kX3NpemUobHVtcCk7CisJCQlpZiAobHVtX3NpemUgPCAwIHx8IHNpemUgPCBsdW1fc2l6ZSkKKwkJCQlyZXR1cm4gMDsgLyogYj0xMDY2NzogaWdub3JlIGVycm9yICovCiAKIAkJCXJjID0gbGxfbG92X3NldHN0cmlwZV9lYV9pbmZvKGlub2RlLCBkZW50cnksIGl0X2ZsYWdzLAogCQkJCQkJICAgICAgbHVtcCwgbHVtX3NpemUpOwotCQkJLyogYjEwNjY3OiByYyBhbHdheXMgYmUgMCBoZXJlIGZvciBub3cgKi8KKwkJCS8qIGI9MTA2Njc6IHJjIGFsd2F5cyBiZSAwIGhlcmUgZm9yIG5vdyAqLwogCQkJcmMgPSAwOwogCQl9IGVsc2UgaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKIAkJCXJjID0gbGxfZGlyX3NldHN0cmlwZShpbm9kZSwgbHVtcCwgMCk7CkBAIC0xOTQsOTIgKzIwNSwyNyBAQAogCiAJCXJldHVybiByYzsKIAotCX0gZWxzZSBpZiAoc3RyY21wKG5hbWUsIFhBVFRSX05BTUVfTE1BKSA9PSAwIHx8Ci0JCSAgIHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX0xJTkspID09IDApCisJfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJsbWEiKSB8fCAhc3RyY21wKG5hbWUsICJsaW5rIikpIHsKKwkJbGxfc3RhdHNfb3BzX3RhbGx5KGxsX2kyc2JpKGlub2RlKSwgTFBST0NfTExfU0VUWEFUVFIsIDEpOwogCQlyZXR1cm4gMDsKKwl9CiAKLQlyZXR1cm4gbGxfc2V0eGF0dHJfY29tbW9uKGlub2RlLCBuYW1lLCB2YWx1ZSwgc2l6ZSwgZmxhZ3MsCi0JCQkJICBPQkRfTURfRkxYQVRUUik7CisJcmV0dXJuIGxsX3hhdHRyX3NldF9jb21tb24oaGFuZGxlciwgZGVudHJ5LCBpbm9kZSwgbmFtZSwgdmFsdWUsIHNpemUsCisJCQkJICAgZmxhZ3MpOwogfQogCi1pbnQgbGxfcmVtb3ZleGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lKQoraW50CitsbF94YXR0cl9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCB0eXBlLCB2b2lkICpidWZmZXIsCisJICAgICAgc2l6ZV90IHNpemUsIF9fdTY0IHZhbGlkKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkX2lub2RlKGRlbnRyeSk7Ci0KLQlMQVNTRVJUKGlub2RlKTsKLQlMQVNTRVJUKG5hbWUpOwotCi0JQ0RFQlVHKERfVkZTVFJBQ0UsICJWRlMgT3A6aW5vZGU9IkRGSUQiKCVwKSwgeGF0dHIgJXNcbiIsCi0JICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSksIGlub2RlLCBuYW1lKTsKLQotCWxsX3N0YXRzX29wc190YWxseShsbF9pMnNiaShpbm9kZSksIExQUk9DX0xMX1JFTU9WRVhBVFRSLCAxKTsKLQlyZXR1cm4gbGxfc2V0eGF0dHJfY29tbW9uKGlub2RlLCBuYW1lLCBOVUxMLCAwLCAwLAotCQkJCSAgT0JEX01EX0ZMWEFUVFJSTSk7Ci19Ci0KLXN0YXRpYwotaW50IGxsX2dldHhhdHRyX2NvbW1vbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAotCQkgICAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgX191NjQgdmFsaWQpCi17CisJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhpbm9kZSk7CiAJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGxsX2kyc2JpKGlub2RlKTsKIAlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSA9IE5VTEw7CiAJc3RydWN0IG1kdF9ib2R5ICpib2R5OwotCWludCB4YXR0cl90eXBlLCByYzsKIAl2b2lkICp4ZGF0YTsKLQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGlub2RlKTsKKwlpbnQgcmM7CiAKLQlDREVCVUcoRF9WRlNUUkFDRSwgIlZGUyBPcDppbm9kZT0iREZJRCIoJXApXG4iLAotCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpLCBpbm9kZSk7Ci0KLQkvKiBsaXN0eGF0dHIgaGF2ZSBzbGlnaHRseSBkaWZmZXJlbnQgYmVoYXZpb3IgZnJvbSBvZiBleHQzOgotCSAqIHdpdGhvdXQgJ3VzZXJfeGF0dHInIGV4dDMgd2lsbCBsaXN0IGFsbCB4YXR0ciBuYW1lcyBidXQKLQkgKiBmaWx0ZXJlZCBvdXQgIl51c2VyLi4qIjsgd2UgbGlzdCB0aGVtIGFsbCBmb3Igc2ltcGxpY2l0eS4KLQkgKi8KLQlpZiAoIW5hbWUpIHsKLQkJeGF0dHJfdHlwZSA9IFhBVFRSX09USEVSX1Q7Ci0JCWdvdG8gZG9fZ2V0eGF0dHI7Ci0JfQotCi0JeGF0dHJfdHlwZSA9IGdldF94YXR0cl90eXBlKG5hbWUpOwotCXJjID0geGF0dHJfdHlwZV9maWx0ZXIoc2JpLCB4YXR0cl90eXBlKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCS8qIGIxNTU4NzogaWdub3JlIHNlY3VyaXR5LmNhcGFiaWxpdHkgeGF0dHIgZm9yIG5vdyAqLwotCWlmICgoeGF0dHJfdHlwZSA9PSBYQVRUUl9TRUNVUklUWV9UICYmCi0JICAgICBzdHJjbXAobmFtZSwgInNlY3VyaXR5LmNhcGFiaWxpdHkiKSA9PSAwKSkKLQkJcmV0dXJuIC1FTk9EQVRBOwotCi0JLyogTFUtNTQ5OiAgRGlzYWJsZSBzZWN1cml0eS5zZWxpbnV4IHdoZW4gc2VsaW51eCBpcyBkaXNhYmxlZCAqLwotCWlmICh4YXR0cl90eXBlID09IFhBVFRSX1NFQ1VSSVRZX1QgJiYgIXNlbGludXhfaXNfZW5hYmxlZCgpICYmCi0JICAgIHN0cmNtcChuYW1lLCAic2VjdXJpdHkuc2VsaW51eCIpID09IDApCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQotI2lmZGVmIENPTkZJR19GU19QT1NJWF9BQ0wKLQkvKiBwb3NpeCBhY2wgaXMgdW5kZXIgcHJvdGVjdGlvbiBvZiBMT09LVVAgbG9jay4gd2hlbiBjYWxsaW5nIHRvIHRoaXMsCi0JICogd2UganVzdCBoYXZlIHBhdGggcmVzb2x1dGlvbiB0byB0aGUgdGFyZ2V0IGlub2RlLCBzbyB3ZSBoYXZlIGdyZWF0Ci0JICogY2hhbmNlIHRoYXQgY2FjaGVkIEFDTCBpcyB1cHRvZGF0ZS4KLQkgKi8KLQlpZiAoeGF0dHJfdHlwZSA9PSBYQVRUUl9BQ0xfQUNDRVNTX1QpIHsKLQkJc3RydWN0IHBvc2l4X2FjbCAqYWNsOwotCi0JCXNwaW5fbG9jaygmbGxpLT5sbGlfbG9jayk7Ci0JCWFjbCA9IHBvc2l4X2FjbF9kdXAobGxpLT5sbGlfcG9zaXhfYWNsKTsKLQkJc3Bpbl91bmxvY2soJmxsaS0+bGxpX2xvY2spOwotCi0JCWlmICghYWNsKQotCQkJcmV0dXJuIC1FTk9EQVRBOwotCi0JCXJjID0gcG9zaXhfYWNsX3RvX3hhdHRyKCZpbml0X3VzZXJfbnMsIGFjbCwgYnVmZmVyLCBzaXplKTsKLQkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKLQkJcmV0dXJuIHJjOwotCX0KLQlpZiAoeGF0dHJfdHlwZSA9PSBYQVRUUl9BQ0xfREVGQVVMVF9UICYmICFTX0lTRElSKGlub2RlLT5pX21vZGUpKQotCQlyZXR1cm4gLUVOT0RBVEE7Ci0jZW5kaWYKLQotZG9fZ2V0eGF0dHI6Ci0JaWYgKHNiaS0+bGxfeGF0dHJfY2FjaGVfZW5hYmxlZCAmJiB4YXR0cl90eXBlICE9IFhBVFRSX0FDTF9BQ0NFU1NfVCkgeworCWlmIChzYmktPmxsX3hhdHRyX2NhY2hlX2VuYWJsZWQgJiYgdHlwZSAhPSBYQVRUUl9BQ0xfQUNDRVNTX1QpIHsKIAkJcmMgPSBsbF94YXR0cl9jYWNoZV9nZXQoaW5vZGUsIG5hbWUsIGJ1ZmZlciwgc2l6ZSwgdmFsaWQpOwogCQlpZiAocmMgPT0gLUVBR0FJTikKIAkJCWdvdG8gZ2V0eGF0dHJfbm9jYWNoZTsKQEAgLTMxMSwzNiArMjU3LDM2IEBACiAKIAkJLyogb25seSBkZXRlY3QgdGhlIHhhdHRyIHNpemUgKi8KIAkJaWYgKHNpemUgPT0gMCkgewotCQkJcmMgPSBib2R5LT5lYWRhdGFzaXplOworCQkJcmMgPSBib2R5LT5tYm9fZWFkYXRhc2l6ZTsKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJaWYgKHNpemUgPCBib2R5LT5lYWRhdGFzaXplKSB7CisJCWlmIChzaXplIDwgYm9keS0+bWJvX2VhZGF0YXNpemUpIHsKIAkJCUNFUlJPUigic2VydmVyIGJ1ZzogcmVwbGllZCBzaXplICV1ID4gJXVcbiIsCi0JCQkgICAgICAgYm9keS0+ZWFkYXRhc2l6ZSwgKGludClzaXplKTsKKwkJCSAgICAgICBib2R5LT5tYm9fZWFkYXRhc2l6ZSwgKGludClzaXplKTsKIAkJCXJjID0gLUVSQU5HRTsKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJaWYgKGJvZHktPmVhZGF0YXNpemUgPT0gMCkgeworCQlpZiAoYm9keS0+bWJvX2VhZGF0YXNpemUgPT0gMCkgewogCQkJcmMgPSAtRU5PREFUQTsKIAkJCWdvdG8gb3V0OwogCQl9CiAKIAkJLyogZG8gbm90IG5lZWQgc3dhYiB4YXR0ciBkYXRhICovCiAJCXhkYXRhID0gcmVxX2NhcHN1bGVfc2VydmVyX3NpemVkX2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX0VBREFUQSwKLQkJCQkJCSAgICAgYm9keS0+ZWFkYXRhc2l6ZSk7CisJCQkJCQkgICAgIGJvZHktPm1ib19lYWRhdGFzaXplKTsKIAkJaWYgKCF4ZGF0YSkgewogCQkJcmMgPSAtRUZBVUxUOwogCQkJZ290byBvdXQ7CiAJCX0KIAotCQltZW1jcHkoYnVmZmVyLCB4ZGF0YSwgYm9keS0+ZWFkYXRhc2l6ZSk7Ci0JCXJjID0gYm9keS0+ZWFkYXRhc2l6ZTsKKwkJbWVtY3B5KGJ1ZmZlciwgeGRhdGEsIGJvZHktPm1ib19lYWRhdGFzaXplKTsKKwkJcmMgPSBib2R5LT5tYm9fZWFkYXRhc2l6ZTsKIAl9CiAKIG91dF94YXR0cjoKLQlpZiAocmMgPT0gLUVPUE5PVFNVUFAgJiYgeGF0dHJfdHlwZSA9PSBYQVRUUl9VU0VSX1QpIHsKKwlpZiAocmMgPT0gLUVPUE5PVFNVUFAgJiYgdHlwZSA9PSBYQVRUUl9VU0VSX1QpIHsKIAkJTENPTlNPTEVfSU5GTygKIAkJCSIlczogZGlzYWJsaW5nIHVzZXJfeGF0dHIgZmVhdHVyZSBiZWNhdXNlIGl0IGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHNlcnZlcjogcmMgPSAlZFxuIiwKIAkJCWxsX2dldF9mc25hbWUoaW5vZGUtPmlfc2IsIE5VTEwsIDApLCByYyk7CkBAIC0zNTEsOCArMjk3LDY1IEBACiAJcmV0dXJuIHJjOwogfQogCi1zc2l6ZV90IGxsX2dldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJICAgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCitzdGF0aWMgaW50IGxsX3hhdHRyX2dldF9jb21tb24oY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgKmhhbmRsZXIsCisJCQkgICAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisJY2hhciBmdWxsbmFtZVtzdHJsZW4oaGFuZGxlci0+cHJlZml4KSArIHN0cmxlbihuYW1lKSArIDFdOworCXN0cnVjdCBsbF9zYl9pbmZvICpzYmkgPSBsbF9pMnNiaShpbm9kZSk7CisjaWZkZWYgQ09ORklHX0ZTX1BPU0lYX0FDTAorCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oaW5vZGUpOworI2VuZGlmCisJaW50IHJjOworCisJQ0RFQlVHKERfVkZTVFJBQ0UsICJWRlMgT3A6aW5vZGU9IkRGSUQiKCVwKVxuIiwKKwkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSwgaW5vZGUpOworCisJbGxfc3RhdHNfb3BzX3RhbGx5KGxsX2kyc2JpKGlub2RlKSwgTFBST0NfTExfR0VUWEFUVFIsIDEpOworCisJcmMgPSB4YXR0cl90eXBlX2ZpbHRlcihzYmksIGhhbmRsZXItPmZsYWdzKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCS8qIGIxNTU4NzogaWdub3JlIHNlY3VyaXR5LmNhcGFiaWxpdHkgeGF0dHIgZm9yIG5vdyAqLworCWlmICgoaGFuZGxlci0+ZmxhZ3MgPT0gWEFUVFJfU0VDVVJJVFlfVCAmJiAhc3RyY21wKG5hbWUsICJjYXBhYmlsaXR5IikpKQorCQlyZXR1cm4gLUVOT0RBVEE7CisKKwkvKiBMVS01NDk6ICBEaXNhYmxlIHNlY3VyaXR5LnNlbGludXggd2hlbiBzZWxpbnV4IGlzIGRpc2FibGVkICovCisJaWYgKGhhbmRsZXItPmZsYWdzID09IFhBVFRSX1NFQ1VSSVRZX1QgJiYgIXNlbGludXhfaXNfZW5hYmxlZCgpICYmCisJICAgICFzdHJjbXAobmFtZSwgInNlbGludXgiKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisjaWZkZWYgQ09ORklHX0ZTX1BPU0lYX0FDTAorCS8qIHBvc2l4IGFjbCBpcyB1bmRlciBwcm90ZWN0aW9uIG9mIExPT0tVUCBsb2NrLiB3aGVuIGNhbGxpbmcgdG8gdGhpcywKKwkgKiB3ZSBqdXN0IGhhdmUgcGF0aCByZXNvbHV0aW9uIHRvIHRoZSB0YXJnZXQgaW5vZGUsIHNvIHdlIGhhdmUgZ3JlYXQKKwkgKiBjaGFuY2UgdGhhdCBjYWNoZWQgQUNMIGlzIHVwdG9kYXRlLgorCSAqLworCWlmIChoYW5kbGVyLT5mbGFncyA9PSBYQVRUUl9BQ0xfQUNDRVNTX1QpIHsKKwkJc3RydWN0IHBvc2l4X2FjbCAqYWNsOworCisJCXNwaW5fbG9jaygmbGxpLT5sbGlfbG9jayk7CisJCWFjbCA9IHBvc2l4X2FjbF9kdXAobGxpLT5sbGlfcG9zaXhfYWNsKTsKKwkJc3Bpbl91bmxvY2soJmxsaS0+bGxpX2xvY2spOworCisJCWlmICghYWNsKQorCQkJcmV0dXJuIC1FTk9EQVRBOworCisJCXJjID0gcG9zaXhfYWNsX3RvX3hhdHRyKCZpbml0X3VzZXJfbnMsIGFjbCwgYnVmZmVyLCBzaXplKTsKKwkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKwkJcmV0dXJuIHJjOworCX0KKwlpZiAoaGFuZGxlci0+ZmxhZ3MgPT0gWEFUVFJfQUNMX0RFRkFVTFRfVCAmJiAhU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuIC1FTk9EQVRBOworI2VuZGlmCisJc3ByaW50ZihmdWxsbmFtZSwgIiVzJXNcbiIsIGhhbmRsZXItPnByZWZpeCwgbmFtZSk7CisJcmV0dXJuIGxsX3hhdHRyX2xpc3QoaW5vZGUsIGZ1bGxuYW1lLCBoYW5kbGVyLT5mbGFncywgYnVmZmVyLCBzaXplLAorCQkJICAgICBPQkRfTURfRkxYQVRUUik7Cit9CisKK3N0YXRpYyBpbnQgbGxfeGF0dHJfZ2V0KGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpoYW5kbGVyLAorCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKIAlMQVNTRVJUKGlub2RlKTsKIAlMQVNTRVJUKG5hbWUpOwpAQCAtMzYwLDM2ICszNjMsMjMgQEAKIAlDREVCVUcoRF9WRlNUUkFDRSwgIlZGUyBPcDppbm9kZT0iREZJRCIoJXApLCB4YXR0ciAlc1xuIiwKIAkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSwgaW5vZGUsIG5hbWUpOwogCi0JbGxfc3RhdHNfb3BzX3RhbGx5KGxsX2kyc2JpKGlub2RlKSwgTFBST0NfTExfR0VUWEFUVFIsIDEpOwotCi0JaWYgKChzdHJuY21wKG5hbWUsIFhBVFRSX1RSVVNURURfUFJFRklYLAotCQkgICAgIHNpemVvZihYQVRUUl9UUlVTVEVEX1BSRUZJWCkgLSAxKSA9PSAwICYmCi0JICAgICBzdHJjbXAobmFtZSArIHNpemVvZihYQVRUUl9UUlVTVEVEX1BSRUZJWCkgLSAxLCAibG92IikgPT0gMCkgfHwKLQkgICAgKHN0cm5jbXAobmFtZSwgWEFUVFJfTFVTVFJFX1BSRUZJWCwKLQkJICAgICBzaXplb2YoWEFUVFJfTFVTVFJFX1BSRUZJWCkgLSAxKSA9PSAwICYmCi0JICAgICBzdHJjbXAobmFtZSArIHNpemVvZihYQVRUUl9MVVNUUkVfUFJFRklYKSAtIDEsICJsb3YiKSA9PSAwKSkgeworCWlmICghc3RyY21wKG5hbWUsICJsb3YiKSkgewogCQlzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtOwogCQlzdHJ1Y3QgbG92X3VzZXJfbWQgKmx1bXA7CiAJCXN0cnVjdCBsb3ZfbWRzX21kICpsbW0gPSBOVUxMOwogCQlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcXVlc3QgPSBOVUxMOwogCQlpbnQgcmMgPSAwLCBsbW1zaXplID0gMDsKIAorCQlsbF9zdGF0c19vcHNfdGFsbHkobGxfaTJzYmkoaW5vZGUpLCBMUFJPQ19MTF9HRVRYQVRUUiwgMSk7CisKIAkJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmICFTX0lTRElSKGlub2RlLT5pX21vZGUpKQogCQkJcmV0dXJuIC1FTk9EQVRBOwogCi0JCWlmIChzaXplID09IDAgJiYgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewotCQkJLyogWFhYIGRpcmVjdG9yeSBFQSBpcyBmaXggZm9yIG5vdywgb3B0aW1pemUgdG8gc2F2ZQotCQkJICogUlBDIHRyYW5zZmVyCi0JCQkgKi8KLQkJCXJjID0gc2l6ZW9mKHN0cnVjdCBsb3ZfdXNlcl9tZCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCiAJCWxzbSA9IGNjY19pbm9kZV9sc21fZ2V0KGlub2RlKTsKIAkJaWYgKCFsc20pIHsKIAkJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7Ci0JCQkJcmMgPSBsbF9kaXJfZ2V0c3RyaXBlKGlub2RlLCAmbG1tLAotCQkJCQkJICAgICAgJmxtbXNpemUsICZyZXF1ZXN0KTsKKwkJCQlyYyA9IGxsX2Rpcl9nZXRzdHJpcGUoaW5vZGUsICh2b2lkICoqKSZsbW0sCisJCQkJCQkgICAgICAmbG1tc2l6ZSwgJnJlcXVlc3QsIDApOwogCQkJfSBlbHNlIHsKIAkJCQlyYyA9IC1FTk9EQVRBOwogCQkJfQpAQCAtNDM5LDcgKzQyOSw3IEBACiAJCXJldHVybiByYzsKIAl9CiAKLQlyZXR1cm4gbGxfZ2V0eGF0dHJfY29tbW9uKGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUsIE9CRF9NRF9GTFhBVFRSKTsKKwlyZXR1cm4gbGxfeGF0dHJfZ2V0X2NvbW1vbihoYW5kbGVyLCBkZW50cnksIGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUpOwogfQogCiBzc2l6ZV90IGxsX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCkBAIC00NTcsNyArNDQ3LDggQEAKIAogCWxsX3N0YXRzX29wc190YWxseShsbF9pMnNiaShpbm9kZSksIExQUk9DX0xMX0xJU1RYQVRUUiwgMSk7CiAKLQlyYyA9IGxsX2dldHhhdHRyX2NvbW1vbihpbm9kZSwgTlVMTCwgYnVmZmVyLCBzaXplLCBPQkRfTURfRkxYQVRUUkxTKTsKKwlyYyA9IGxsX3hhdHRyX2xpc3QoaW5vZGUsIE5VTEwsIFhBVFRSX09USEVSX1QsIGJ1ZmZlciwgc2l6ZSwKKwkJCSAgIE9CRF9NRF9GTFhBVFRSTFMpOwogCWlmIChyYyA8IDApCiAJCWdvdG8gb3V0OwogCkBAIC00ODgsNyArNDc5LDggQEAKIAkJaWYgKCFsbF9pMmluZm8oaW5vZGUpLT5sbGlfaGFzX3NtZCkKIAkJCXJjMiA9IC0xOwogCX0gZWxzZSBpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewotCQlyYzIgPSBsbF9kaXJfZ2V0c3RyaXBlKGlub2RlLCAmbG1tLCAmbG1tc2l6ZSwgJnJlcXVlc3QpOworCQlyYzIgPSBsbF9kaXJfZ2V0c3RyaXBlKGlub2RlLCAodm9pZCAqKikmbG1tLCAmbG1tc2l6ZSwKKwkJCQkgICAgICAgJnJlcXVlc3QsIDApOwogCX0KIAogCWlmIChyYzIgPCAwKSB7CkBAIC01MTgsMyArNTEwLDU3IEBACiAKIAlyZXR1cm4gcmM7CiB9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciBsbF91c2VyX3hhdHRyX2hhbmRsZXIgPSB7CisJLnByZWZpeCA9IFhBVFRSX1VTRVJfUFJFRklYLAorCS5mbGFncyA9IFhBVFRSX1VTRVJfVCwKKwkuZ2V0ID0gbGxfeGF0dHJfZ2V0X2NvbW1vbiwKKwkuc2V0ID0gbGxfeGF0dHJfc2V0X2NvbW1vbiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciBsbF90cnVzdGVkX3hhdHRyX2hhbmRsZXIgPSB7CisJLnByZWZpeCA9IFhBVFRSX1RSVVNURURfUFJFRklYLAorCS5mbGFncyA9IFhBVFRSX1RSVVNURURfVCwKKwkuZ2V0ID0gbGxfeGF0dHJfZ2V0LAorCS5zZXQgPSBsbF94YXR0cl9zZXQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgbGxfc2VjdXJpdHlfeGF0dHJfaGFuZGxlciA9IHsKKwkucHJlZml4ID0gWEFUVFJfU0VDVVJJVFlfUFJFRklYLAorCS5mbGFncyA9IFhBVFRSX1NFQ1VSSVRZX1QsCisJLmdldCA9IGxsX3hhdHRyX2dldF9jb21tb24sCisJLnNldCA9IGxsX3hhdHRyX3NldF9jb21tb24sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgbGxfYWNsX2FjY2Vzc194YXR0cl9oYW5kbGVyID0geworCS5wcmVmaXggPSBYQVRUUl9OQU1FX1BPU0lYX0FDTF9BQ0NFU1MsCisJLmZsYWdzID0gWEFUVFJfQUNMX0FDQ0VTU19ULAorCS5nZXQgPSBsbF94YXR0cl9nZXRfY29tbW9uLAorCS5zZXQgPSBsbF94YXR0cl9zZXRfY29tbW9uLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyIGxsX2FjbF9kZWZhdWx0X3hhdHRyX2hhbmRsZXIgPSB7CisJLnByZWZpeCA9IFhBVFRSX05BTUVfUE9TSVhfQUNMX0RFRkFVTFQsCisJLmZsYWdzID0gWEFUVFJfQUNMX0RFRkFVTFRfVCwKKwkuZ2V0ID0gbGxfeGF0dHJfZ2V0X2NvbW1vbiwKKwkuc2V0ID0gbGxfeGF0dHJfc2V0X2NvbW1vbiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciBsbF9sdXN0cmVfeGF0dHJfaGFuZGxlciA9IHsKKwkucHJlZml4ID0gWEFUVFJfTFVTVFJFX1BSRUZJWCwKKwkuZmxhZ3MgPSBYQVRUUl9MVVNUUkVfVCwKKwkuZ2V0ID0gbGxfeGF0dHJfZ2V0LAorCS5zZXQgPSBsbF94YXR0cl9zZXQsCit9OworCitjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqbGxfeGF0dHJfaGFuZGxlcnNbXSA9IHsKKwkmbGxfdXNlcl94YXR0cl9oYW5kbGVyLAorCSZsbF90cnVzdGVkX3hhdHRyX2hhbmRsZXIsCisJJmxsX3NlY3VyaXR5X3hhdHRyX2hhbmRsZXIsCisjaWZkZWYgQ09ORklHX0ZTX1BPU0lYX0FDTAorCSZsbF9hY2xfYWNjZXNzX3hhdHRyX2hhbmRsZXIsCisJJmxsX2FjbF9kZWZhdWx0X3hhdHRyX2hhbmRsZXIsCisjZW5kaWYKKwkmbGxfbHVzdHJlX3hhdHRyX2hhbmRsZXIsCisJTlVMTCwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS94YXR0cl9jYWNoZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUveGF0dHJfY2FjaGUuYwppbmRleCA4MDg5ZGE4Li41MGExOWE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS94YXR0cl9jYWNoZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3hhdHRyX2NhY2hlLmMKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmRfc3VwcG9ydC5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9kbG0uaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV92ZXIuaCIKICNpbmNsdWRlICJsbGl0ZV9pbnRlcm5hbC5oIgpAQCAtMjcwLDEwICsyNjksMTIgQEAKIAlzdHJ1Y3QgbHVzdHJlX2hhbmRsZSBsb2NraCA9IHsgMCB9OwogCXN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhOwogCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oaW5vZGUpOwotCXN0cnVjdCBsZGxtX2VucXVldWVfaW5mbyBlaW5mbyA9IHsgLmVpX3R5cGUgPSBMRExNX0lCSVRTLAotCQkJCQkgICAuZWlfbW9kZSA9IGl0X3RvX2xvY2tfbW9kZShvaXQpLAotCQkJCQkgICAuZWlfY2JfYmwgPSBsbF9tZF9ibG9ja2luZ19hc3QsCi0JCQkJCSAgIC5laV9jYl9jcCA9IGxkbG1fY29tcGxldGlvbl9hc3QgfTsKKwlzdHJ1Y3QgbGRsbV9lbnF1ZXVlX2luZm8gZWluZm8gPSB7CisJCS5laV90eXBlID0gTERMTV9JQklUUywKKwkJLmVpX21vZGUgPSBpdF90b19sb2NrX21vZGUob2l0KSwKKwkJLmVpX2NiX2JsID0gJmxsX21kX2Jsb2NraW5nX2FzdCwKKwkJLmVpX2NiX2NwID0gJmxkbG1fY29tcGxldGlvbl9hc3QsCisJfTsKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfaTJzYmkoaW5vZGUpOwogCXN0cnVjdCBvYmRfZXhwb3J0ICpleHAgPSBzYmktPmxsX21kX2V4cDsKIAlpbnQgcmM7CkBAIC0zMDQsNyArMzA1LDcgQEAKIAogCW9wX2RhdGEtPm9wX3ZhbGlkID0gT0JEX01EX0ZMWEFUVFIgfCBPQkRfTURfRkxYQVRUUkxTOwogCi0JcmMgPSBtZF9lbnF1ZXVlKGV4cCwgJmVpbmZvLCBvaXQsIG9wX2RhdGEsICZsb2NraCwgTlVMTCwgMCwgTlVMTCwgMCk7CisJcmMgPSBtZF9lbnF1ZXVlKGV4cCwgJmVpbmZvLCBOVUxMLCBvaXQsIG9wX2RhdGEsICZsb2NraCwgMCk7CiAJbGxfZmluaXNoX21kX29wX2RhdGEob3BfZGF0YSk7CiAKIAlpZiAocmMgPCAwKSB7CkBAIC0zODAsMjUgKzM4MSwyNSBAQAogCX0KIAkvKiBkbyBub3QgbmVlZCBzd2FiIHhhdHRyIGRhdGEgKi8KIAl4ZGF0YSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9zaXplZF9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9FQURBVEEsCi0JCQkJCSAgICAgYm9keS0+ZWFkYXRhc2l6ZSk7CisJCQkJCSAgICAgYm9keS0+bWJvX2VhZGF0YXNpemUpOwogCXh2YWwgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfc2l6ZWRfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfRUFWQUxTLAotCQkJCQkgICAgYm9keS0+YWNsc2l6ZSk7CisJCQkJCSAgICBib2R5LT5tYm9fYWNsc2l6ZSk7CiAJeHNpemVzID0gcmVxX2NhcHN1bGVfc2VydmVyX3NpemVkX2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX0VBVkFMU19MRU5TLAotCQkJCQkgICAgICBib2R5LT5tYXhfbWRzaXplICogc2l6ZW9mKF9fdTMyKSk7CisJCQkJCSAgICAgIGJvZHktPm1ib19tYXhfbWRzaXplICogc2l6ZW9mKF9fdTMyKSk7CiAJaWYgKCF4ZGF0YSB8fCAheHZhbCB8fCAheHNpemVzKSB7CiAJCUNFUlJPUigid3Jvbmcgc2V0eGF0dHIgcmVwbHlcbiIpOwogCQlyYyA9IC1FUFJPVE87CiAJCWdvdG8gb3V0X2Rlc3Ryb3k7CiAJfQogCi0JeHRhaWwgPSB4ZGF0YSArIGJvZHktPmVhZGF0YXNpemU7Ci0JeHZ0YWlsID0geHZhbCArIGJvZHktPmFjbHNpemU7CisJeHRhaWwgPSB4ZGF0YSArIGJvZHktPm1ib19lYWRhdGFzaXplOworCXh2dGFpbCA9IHh2YWwgKyBib2R5LT5tYm9fYWNsc2l6ZTsKIAogCUNERUJVRyhEX0NBQ0hFLCAiY2FjaGluZzogeGRhdGE9JXAgeHRhaWw9JXBcbiIsIHhkYXRhLCB4dGFpbCk7CiAKIAlsbF94YXR0cl9jYWNoZV9pbml0KGxsaSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgYm9keS0+bWF4X21kc2l6ZTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGJvZHktPm1ib19tYXhfbWRzaXplOyBpKyspIHsKIAkJQ0RFQlVHKERfQ0FDSEUsICJjYWNoaW5nIFslc109JS4qc1xuIiwgeGRhdGEsICp4c2l6ZXMsIHh2YWwpOwogCQkvKiBQZXJmb3JtIGNvbnNpc3RlbmN5IGNoZWNrczogYXR0ciBuYW1lcyBhbmQgdmFscyBpbiBwaWxsICovCiAJCWlmICghbWVtY2hyKHhkYXRhLCAwLCB4dGFpbCAtIHhkYXRhKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9mbGQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9sbXZfZmxkLmMKaW5kZXggYTNkMTcwYS4uYTUyNjVmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9mbGQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X2ZsZC5jCkBAIC00NywxOCArNDcsMjAgQEAKICNpbmNsdWRlICIuLi9pbmNsdWRlL2xwcm9jZnNfc3RhdHVzLmgiCiAjaW5jbHVkZSAibG12X2ludGVybmFsLmgiCiAKLWludCBsbXZfZmxkX2xvb2t1cChzdHJ1Y3QgbG12X29iZCAqbG12LAotCQkgICBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQsCi0JCSAgIHUzMiAqbWRzKQoraW50IGxtdl9mbGRfbG9va3VwKHN0cnVjdCBsbXZfb2JkICpsbXYsIGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCwgdTMyICptZHMpCiB7CisJc3RydWN0IG9iZF9kZXZpY2UgKm9iZCA9IGxtdjJvYmRfZGV2KGxtdik7CiAJaW50IHJjOwogCi0JLyogRklYTUU6IEN1cnJlbnRseSBaRlMgc3RpbGwgdXNlIGxvY2FsIHNlcSBmb3IgUk9PVCB1bmZvcnR1bmF0ZWx5LCBhbmQKKwkvKgorCSAqIEZJWE1FOiBDdXJyZW50bHkgWkZTIHN0aWxsIHVzZSBsb2NhbCBzZXEgZm9yIFJPT1QgdW5mb3J0dW5hdGVseSwgYW5kCiAJICogdGhpcyBmaWRfaXNfbG9jYWwgY2hlY2sgc2hvdWxkIGJlIHJlbW92ZWQgb25jZSBMVS0yMjQwIGlzIGZpeGVkCiAJICovCi0JTEFTU0VSVEYoKGZpZF9zZXFfaW5fZmxkYihmaWRfc2VxKGZpZCkpIHx8Ci0JCSAgZmlkX3NlcV9pc19sb2NhbF9maWxlKGZpZF9zZXEoZmlkKSkpICYmCi0JCSBmaWRfaXNfc2FuZShmaWQpLCBERklEIiBpcyBpbnNhbmUhXG4iLCBQRklEKGZpZCkpOworCWlmICghZmlkX2lzX3NhbmUoZmlkKSB8fCAhKGZpZF9zZXFfaW5fZmxkYihmaWRfc2VxKGZpZCkpIHx8CisJCQkJICAgZmlkX3NlcV9pc19sb2NhbF9maWxlKGZpZF9zZXEoZmlkKSkpKSB7CisJCUNFUlJPUigiJXM6IGludmFsaWQgRklEICIgREZJRCAiXG4iLCBvYmQtPm9iZF9uYW1lLCBQRklEKGZpZCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlyYyA9IGZsZF9jbGllbnRfbG9va3VwKCZsbXYtPmxtdl9mbGQsIGZpZF9zZXEoZmlkKSwgbWRzLAogCQkJICAgICAgIExVX1NFUV9SQU5HRV9NRFQsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9pbnRlbnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9sbXZfaW50ZW50LmMKaW5kZXggMmY1OGZkYS4uOWY0ZTgyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9pbnRlbnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X2ludGVudC5jCkBAIC00MywxMyArNDMsMTMgQEAKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saWIuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9uZXQuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9kbG0uaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9tZGMuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZF9jbGFzcy5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHByb2Nmc19zdGF0dXMuaCIKICNpbmNsdWRlICJsbXZfaW50ZXJuYWwuaCIKIAotc3RhdGljIGludCBsbXZfaW50ZW50X3JlbW90ZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCB2b2lkICpsbW0sCi0JCQkgICAgIGludCBsbW1zaXplLCBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBsdV9maWQgKnBhcmVudF9maWQsIGludCBmbGFncywKK3N0YXRpYyBpbnQgbG12X2ludGVudF9yZW1vdGUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgbHVfZmlkICpwYXJlbnRfZmlkLAogCQkJICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXFwLAogCQkJICAgICBsZGxtX2Jsb2NraW5nX2NhbGxiYWNrIGNiX2Jsb2NraW5nLAogCQkJICAgICBfX3U2NCBleHRyYV9sb2NrX2ZsYWdzKQpAQCAtNjgsNyArNjgsNyBAQAogCWlmICghYm9keSkKIAkJcmV0dXJuIC1FUFJPVE87CiAKLQlMQVNTRVJUKChib2R5LT52YWxpZCAmIE9CRF9NRF9NRFMpKTsKKwlMQVNTRVJUKChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfTURTKSk7CiAKIAkvKgogCSAqIFVuZm9ydHVuYXRlbHksIHdlIGhhdmUgdG8gbGllIHRvIE1EQy9NRFMgdG8gcmV0cmlldmUKQEAgLTg3LDkgKzg3LDkgQEAKIAkJaXQtPml0X3JlcXVlc3QgPSBOVUxMOwogCX0KIAotCUxBU1NFUlQoZmlkX2lzX3NhbmUoJmJvZHktPmZpZDEpKTsKKwlMQVNTRVJUKGZpZF9pc19zYW5lKCZib2R5LT5tYm9fZmlkMSkpOwogCi0JdGd0ID0gbG12X2ZpbmRfdGFyZ2V0KGxtdiwgJmJvZHktPmZpZDEpOworCXRndCA9IGxtdl9maW5kX3RhcmdldChsbXYsICZib2R5LT5tYm9fZmlkMSk7CiAJaWYgKElTX0VSUih0Z3QpKSB7CiAJCXJjID0gUFRSX0VSUih0Z3QpOwogCQlnb3RvIG91dDsKQEAgLTEwMSw3ICsxMDEsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlvcF9kYXRhLT5vcF9maWQxID0gYm9keS0+ZmlkMTsKKwlvcF9kYXRhLT5vcF9maWQxID0gYm9keS0+bWJvX2ZpZDE7CiAJLyogU2VudCB0aGUgcGFyZW50IEZJRCB0byB0aGUgcmVtb3RlIE1EVCAqLwogCWlmIChwYXJlbnRfZmlkKSB7CiAJCS8qIFRoZSBwYXJlbnQgZmlkIGlzIG9ubHkgZm9yIHJlbW90ZSBvcGVuIHRvCkBAIC0xMTAsMTggKzExMCwxNCBAQAogCQkgKi8KIAkJTEFTU0VSVChpdC0+aXRfb3AgJiBJVF9PUEVOKTsKIAkJb3BfZGF0YS0+b3BfZmlkMiA9ICpwYXJlbnRfZmlkOwotCQkvKiBBZGQgb2JqZWN0IEZJRCB0byBvcF9maWQzLCBpbiBjYXNlIGl0IG5lZWRzIHRvIGNoZWNrIHN0YWxlCi0JCSAqIChNX0NIRUNLX1NUQUxFKSwgc2VlIG1kY19maW5pc2hfaW50ZW50X2xvY2sKLQkJICovCi0JCW9wX2RhdGEtPm9wX2ZpZDMgPSBib2R5LT5maWQxOwogCX0KIAogCW9wX2RhdGEtPm9wX2JpYXMgPSBNRFNfQ1JPU1NfUkVGOwotCUNERUJVRyhEX0lOT0RFLCAiUkVNT1RFX0lOVEVOVCB3aXRoIGZpZD0iREZJRCIgLT4gbWRzICMlZFxuIiwKLQkgICAgICAgUEZJRCgmYm9keS0+ZmlkMSksIHRndC0+bHRkX2lkeCk7CisJQ0RFQlVHKERfSU5PREUsICJSRU1PVEVfSU5URU5UIHdpdGggZmlkPSIgREZJRCAiIC0+IG1kcyAjJXVcbiIsCisJICAgICAgIFBGSUQoJmJvZHktPm1ib19maWQxKSwgdGd0LT5sdGRfaWR4KTsKIAotCXJjID0gbWRfaW50ZW50X2xvY2sodGd0LT5sdGRfZXhwLCBvcF9kYXRhLCBsbW0sIGxtbXNpemUsIGl0LAotCQkJICAgIGZsYWdzLCAmcmVxLCBjYl9ibG9ja2luZywgZXh0cmFfbG9ja19mbGFncyk7CisJcmMgPSBtZF9pbnRlbnRfbG9jayh0Z3QtPmx0ZF9leHAsIG9wX2RhdGEsIGl0LCAmcmVxLCBjYl9ibG9ja2luZywKKwkJCSAgICBleHRyYV9sb2NrX2ZsYWdzKTsKIAlpZiAocmMpCiAJCWdvdG8gb3V0X2ZyZWVfb3BfZGF0YTsKIApAQCAtMTM2LDggKzEzMiwxMCBAQAogCQlpdC0+aXRfcmVtb3RlX2xvY2tfbW9kZSA9IGl0LT5pdF9sb2NrX21vZGU7CiAJfQogCi0JaXQtPml0X2xvY2tfaGFuZGxlID0gcGxvY2suY29va2llOwotCWl0LT5pdF9sb2NrX21vZGUgPSBwbW9kZTsKKwlpZiAocG1vZGUpIHsKKwkJaXQtPml0X2xvY2tfaGFuZGxlID0gcGxvY2suY29va2llOworCQlpdC0+aXRfbG9ja19tb2RlID0gcG1vZGU7CisJfQogCiBvdXRfZnJlZV9vcF9kYXRhOgogCWtmcmVlKG9wX2RhdGEpOwpAQCAtMTUwLDEzICsxNDgsMTI2IEBACiAJcmV0dXJuIHJjOwogfQogCitpbnQgbG12X3JldmFsaWRhdGVfc2xhdmVzKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCisJCQkgIGNvbnN0IHN0cnVjdCBsbXZfc3RyaXBlX21kICpsc20sCisJCQkgIGxkbG1fYmxvY2tpbmdfY2FsbGJhY2sgY2JfYmxvY2tpbmcsCisJCQkgIGludCBleHRyYV9sb2NrX2ZsYWdzKQoreworCXN0cnVjdCBvYmRfZGV2aWNlICpvYmQgPSBleHAtPmV4cF9vYmQ7CisJc3RydWN0IGxtdl9vYmQgKmxtdiA9ICZvYmQtPnUubG12OworCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxID0gTlVMTDsKKwlzdHJ1Y3QgbWR0X2JvZHkgKmJvZHk7CisJc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGE7CisJaW50IHJjID0gMCwgaTsKKworCS8qKgorCSAqIHJldmFsaWRhdGUgc2xhdmVzIGhhcyBzb21lIHByb2JsZW1zLCB0ZW1wb3JhcmlseSByZXR1cm4sCisJICogd2UgbWF5IG5vdCBuZWVkIHRoYXQKKwkgKi8KKwlvcF9kYXRhID0ga3phbGxvYyhzaXplb2YoKm9wX2RhdGEpLCBHRlBfTk9GUyk7CisJaWYgKCFvcF9kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qKgorCSAqIExvb3Agb3ZlciB0aGUgc3RyaXBlIGluZm9ybWF0aW9uLCBjaGVjayB2YWxpZGl0eSBhbmQgdXBkYXRlIHRoZW0KKwkgKiBmcm9tIE1EUyBpZiBuZWVkZWQuCisJICovCisJZm9yIChpID0gMDsgaSA8IGxzbS0+bHNtX21kX3N0cmlwZV9jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBsb29rdXBfaW50ZW50IGl0ID0geyAuaXRfb3AgPSBJVF9HRVRBVFRSIH07CisJCXN0cnVjdCBsdXN0cmVfaGFuZGxlICpsb2NraCA9IE5VTEw7CisJCXN0cnVjdCBsbXZfdGd0X2Rlc2MgKnRndCA9IE5VTEw7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJCXN0cnVjdCBsdV9maWQgZmlkOworCisJCWZpZCA9IGxzbS0+bHNtX21kX29pbmZvW2ldLmxtb19maWQ7CisJCWlub2RlID0gbHNtLT5sc21fbWRfb2luZm9baV0ubG1vX3Jvb3Q7CisKKwkJLyoKKwkJICogUHJlcGFyZSBvcF9kYXRhIGZvciByZXZhbGlkYXRpbmcuIE5vdGUgdGhhdCBAZmlkMiBzaGx1bGQgYmUKKwkJICogZGVmaW5lZCBvdGhlcndpc2UgaXQgd2lsbCBnbyB0byBzZXJ2ZXIgYW5kIHRha2UgbmV3IGxvY2sKKwkJICogd2hpY2ggaXMgbm90IG5lZWRlZCBoZXJlLgorCQkgKi8KKwkJbWVtc2V0KG9wX2RhdGEsIDAsIHNpemVvZigqb3BfZGF0YSkpOworCQlvcF9kYXRhLT5vcF9maWQxID0gZmlkOworCQlvcF9kYXRhLT5vcF9maWQyID0gZmlkOworCisJCXRndCA9IGxtdl9sb2NhdGVfbWRzKGxtdiwgb3BfZGF0YSwgJmZpZCk7CisJCWlmIChJU19FUlIodGd0KSkgeworCQkJcmMgPSBQVFJfRVJSKHRndCk7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKworCQlDREVCVUcoRF9JTk9ERSwgIlJldmFsaWRhdGUgc2xhdmUgIiBERklEICIgLT4gbWRzICMldVxuIiwKKwkJICAgICAgIFBGSUQoJmZpZCksIHRndC0+bHRkX2lkeCk7CisKKwkJaWYgKHJlcSkgeworCQkJcHRscnBjX3JlcV9maW5pc2hlZChyZXEpOworCQkJcmVxID0gTlVMTDsKKwkJfQorCisJCXJjID0gbWRfaW50ZW50X2xvY2sodGd0LT5sdGRfZXhwLCBvcF9kYXRhLCAmaXQsICZyZXEsCisJCQkJICAgIGNiX2Jsb2NraW5nLCBleHRyYV9sb2NrX2ZsYWdzKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gY2xlYW51cDsKKworCQlsb2NraCA9IChzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAqKSZpdC5pdF9sb2NrX2hhbmRsZTsKKwkJaWYgKHJjID4gMCAmJiAhcmVxKSB7CisJCQkvKiBzbGF2ZSBpbm9kZSBpcyBzdGlsbCB2YWxpZCAqLworCQkJQ0RFQlVHKERfSU5PREUsICJzbGF2ZSAiREZJRCIgaXMgc3RpbGwgdmFsaWQuXG4iLAorCQkJICAgICAgIFBGSUQoJmZpZCkpOworCQkJcmMgPSAwOworCQl9IGVsc2UgeworCQkJLyogcmVmcmVzaCBzbGF2ZSBmcm9tIHNlcnZlciAqLworCQkJYm9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJnJlcS0+cnFfcGlsbCwKKwkJCQkJCSAgICAgICZSTUZfTURUX0JPRFkpOworCQkJTEFTU0VSVChib2R5KTsKKworCQkJaWYgKHVubGlrZWx5KGJvZHktPm1ib19ubGluayA8IDIpKSB7CisJCQkJQ0VSUk9SKCIlczogbmxpbmsgJWQgPCAyIGNvcnJ1cHQgc3RyaXBlICVkICJERklEIjoiIERGSUQiXG4iLAorCQkJCSAgICAgICBvYmQtPm9iZF9uYW1lLCBib2R5LT5tYm9fbmxpbmssIGksCisJCQkJICAgICAgIFBGSUQoJmxzbS0+bHNtX21kX29pbmZvW2ldLmxtb19maWQpLAorCQkJCSAgICAgICBQRklEKCZsc20tPmxzbV9tZF9vaW5mb1swXS5sbW9fZmlkKSk7CisKKwkJCQlpZiAoaXQuaXRfbG9ja19tb2RlICYmIGxvY2toKSB7CisJCQkJCWxkbG1fbG9ja19kZWNyZWYobG9ja2gsIGl0Lml0X2xvY2tfbW9kZSk7CisJCQkJCWl0Lml0X2xvY2tfbW9kZSA9IDA7CisJCQkJfQorCisJCQkJcmMgPSAtRUlPOworCQkJCWdvdG8gY2xlYW51cDsKKwkJCX0KKworCQkJaV9zaXplX3dyaXRlKGlub2RlLCBib2R5LT5tYm9fc2l6ZSk7CisJCQlpbm9kZS0+aV9ibG9ja3MgPSBib2R5LT5tYm9fYmxvY2tzOworCQkJc2V0X25saW5rKGlub2RlLCBib2R5LT5tYm9fbmxpbmspOworCQkJTFRJTUVfUyhpbm9kZS0+aV9hdGltZSkgPSBib2R5LT5tYm9fYXRpbWU7CisJCQlMVElNRV9TKGlub2RlLT5pX2N0aW1lKSA9IGJvZHktPm1ib19jdGltZTsKKwkJCUxUSU1FX1MoaW5vZGUtPmlfbXRpbWUpID0gYm9keS0+bWJvX210aW1lOworCQl9CisKKwkJbWRfc2V0X2xvY2tfZGF0YSh0Z3QtPmx0ZF9leHAsIGxvY2toLCBpbm9kZSwgTlVMTCk7CisKKwkJaWYgKGl0Lml0X2xvY2tfbW9kZSAmJiBsb2NraCkgeworCQkJbGRsbV9sb2NrX2RlY3JlZihsb2NraCwgaXQuaXRfbG9ja19tb2RlKTsKKwkJCWl0Lml0X2xvY2tfbW9kZSA9IDA7CisJCX0KKwl9CisKK2NsZWFudXA6CisJaWYgKHJlcSkKKwkJcHRscnBjX3JlcV9maW5pc2hlZChyZXEpOworCisJa2ZyZWUob3BfZGF0YSk7CisJcmV0dXJuIHJjOworfQorCiAvKgogICogSVRfT1BFTiBpcyBpbnRlbmRlZCB0byBvcGVuIChhbmQgY3JlYXRlLCBwb3NzaWJsZSkgYW4gb2JqZWN0LiBQYXJlbnQgKHBpZCkKICAqIG1heSBiZSBzcGxpdCBkaXIuCiAgKi8KIHN0YXRpYyBpbnQgbG12X2ludGVudF9vcGVuKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQkJICAgdm9pZCAqbG1tLCBpbnQgbG1tc2l6ZSwgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0LAotCQkJICAgaW50IGZsYWdzLCBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXFwLAorCQkJICAgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0LAorCQkJICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxcCwKIAkJCSAgIGxkbG1fYmxvY2tpbmdfY2FsbGJhY2sgY2JfYmxvY2tpbmcsCiAJCQkgICBfX3U2NCBleHRyYV9sb2NrX2ZsYWdzKQogewpAQCAtMTY2LDM1ICsyNzcsNTUgQEAKIAlzdHJ1Y3QgbWR0X2JvZHkJCSpib2R5OwogCWludAkJCXJjOwogCi0JdGd0ID0gbG12X2xvY2F0ZV9tZHMobG12LCBvcF9kYXRhLCAmb3BfZGF0YS0+b3BfZmlkMSk7Ci0JaWYgKElTX0VSUih0Z3QpKQotCQlyZXR1cm4gUFRSX0VSUih0Z3QpOworCWlmIChpdC0+aXRfZmxhZ3MgJiBNRFNfT1BFTl9CWV9GSUQpIHsKKwkJTEFTU0VSVChmaWRfaXNfc2FuZSgmb3BfZGF0YS0+b3BfZmlkMikpOworCisJCS8qCisJCSAqIGZvciBzdHJpcGVkIGRpcmVjdG9yeSwgd2UgY2FuJ3Qga25vdyBwYXJlbnQgc3RyaXBlIGZpZAorCQkgKiB3aXRob3V0IG5hbWUsIGJ1dCB3ZSBjYW4gc2V0IGl0IHRvIGNoaWxkIGZpZCwgYW5kIE1EVAorCQkgKiB3aWxsIG9idGFpbiBpdCBmcm9tIGxpbmtlYSBpbiBvcGVuIGluIHN1Y2ggY2FzZS4KKwkJICovCisJCWlmIChvcF9kYXRhLT5vcF9tZWExKQorCQkJb3BfZGF0YS0+b3BfZmlkMSA9IG9wX2RhdGEtPm9wX2ZpZDI7CisKKwkJdGd0ID0gbG12X2ZpbmRfdGFyZ2V0KGxtdiwgJm9wX2RhdGEtPm9wX2ZpZDIpOworCQlpZiAoSVNfRVJSKHRndCkpCisJCQlyZXR1cm4gUFRSX0VSUih0Z3QpOworCisJCW9wX2RhdGEtPm9wX21kcyA9IHRndC0+bHRkX2lkeDsKKwl9IGVsc2UgeworCQlMQVNTRVJUKGZpZF9pc19zYW5lKCZvcF9kYXRhLT5vcF9maWQxKSk7CisJCUxBU1NFUlQoZmlkX2lzX3plcm8oJm9wX2RhdGEtPm9wX2ZpZDIpKTsKKwkJTEFTU0VSVChvcF9kYXRhLT5vcF9uYW1lKTsKKworCQl0Z3QgPSBsbXZfbG9jYXRlX21kcyhsbXYsIG9wX2RhdGEsICZvcF9kYXRhLT5vcF9maWQxKTsKKwkJaWYgKElTX0VSUih0Z3QpKQorCQkJcmV0dXJuIFBUUl9FUlIodGd0KTsKKwl9CiAKIAkvKiBJZiBpdCBpcyByZWFkeSB0byBvcGVuIHRoZSBmaWxlIGJ5IEZJRCwgZG8gbm90IG5lZWQKIAkgKiBhbGxvY2F0ZSBGSUQgYXQgYWxsLCBvdGhlcndpc2UgaXQgd2lsbCBjb25mdXNlIE1EVAogCSAqLwotCWlmICgoaXQtPml0X29wICYgSVRfQ1JFQVQpICYmCi0JICAgICEoaXQtPml0X2ZsYWdzICYgTURTX09QRU5fQllfRklEKSkgeworCWlmICgoaXQtPml0X29wICYgSVRfQ1JFQVQpICYmICEoaXQtPml0X2ZsYWdzICYgTURTX09QRU5fQllfRklEKSkgewogCQkvKgotCQkgKiBGb3Igb3BlbiB3aXRoIElUX0NSRUFURSBhbmQgZm9yIElUX0NSRUFURSBjYXNlcyBhbGxvY2F0ZSBuZXcKLQkJICogZmlkIGFuZCBzZXR1cCBGTEQgZm9yIGl0LgorCQkgKiBGb3IgbG9va3VwKElUX0NSRUFURSkgY2FzZXMgYWxsb2NhdGUgbmV3IGZpZCBhbmQgc2V0dXAgRkxECisJCSAqIGZvciBpdC4KIAkJICovCi0JCW9wX2RhdGEtPm9wX2ZpZDMgPSBvcF9kYXRhLT5vcF9maWQyOwotCQlyYyA9IGxtdl9maWRfYWxsb2MoZXhwLCAmb3BfZGF0YS0+b3BfZmlkMiwgb3BfZGF0YSk7CisJCXJjID0gbG12X2ZpZF9hbGxvYyhOVUxMLCBleHAsICZvcF9kYXRhLT5vcF9maWQyLCBvcF9kYXRhKTsKIAkJaWYgKHJjICE9IDApCiAJCQlyZXR1cm4gcmM7CiAJfQogCi0JQ0RFQlVHKERfSU5PREUsICJPUEVOX0lOVEVOVCB3aXRoIGZpZDE9IiBERklEICIsIGZpZDI9IiBERklEICIsIG5hbWU9JyVzJyAtPiBtZHMgIyVkXG4iLAorCUNERUJVRyhEX0lOT0RFLCAiT1BFTl9JTlRFTlQgd2l0aCBmaWQxPSIgREZJRCAiLCBmaWQyPSIgREZJRCAiLCBuYW1lPSclcycgLT4gbWRzICMldVxuIiwKIAkgICAgICAgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSksCiAJICAgICAgIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDIpLCBvcF9kYXRhLT5vcF9uYW1lLCB0Z3QtPmx0ZF9pZHgpOwogCi0JcmMgPSBtZF9pbnRlbnRfbG9jayh0Z3QtPmx0ZF9leHAsIG9wX2RhdGEsIGxtbSwgbG1tc2l6ZSwgaXQsIGZsYWdzLAotCQkJICAgIHJlcXAsIGNiX2Jsb2NraW5nLCBleHRyYV9sb2NrX2ZsYWdzKTsKKwlyYyA9IG1kX2ludGVudF9sb2NrKHRndC0+bHRkX2V4cCwgb3BfZGF0YSwgaXQsIHJlcXAsIGNiX2Jsb2NraW5nLAorCQkJICAgIGV4dHJhX2xvY2tfZmxhZ3MpOwogCWlmIChyYyAhPSAwKQogCQlyZXR1cm4gcmM7CiAJLyoKLQkgKiBOb3RoaW5nIGlzIGZvdW5kLCBkbyBub3QgYWNjZXNzIGJvZHktPmZpZDEgYXMgaXQgaXMgemVybyBhbmQgdGh1cworCSAqIE5vdGhpbmcgaXMgZm91bmQsIGRvIG5vdCBhY2Nlc3MgYm9keS0+bWJvX2ZpZDEgYXMgaXQgaXMgemVybyBhbmQgdGh1cwogCSAqIHBvaW50bGVzcy4KIAkgKi8KIAlpZiAoKGl0LT5pdF9kaXNwb3NpdGlvbiAmIERJU1BfTE9PS1VQX05FRykgJiYKQEAgLTIwNSwzMSArMzM2LDE3IEBACiAJYm9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJigqcmVxcCktPnJxX3BpbGwsICZSTUZfTURUX0JPRFkpOwogCWlmICghYm9keSkKIAkJcmV0dXJuIC1FUFJPVE87Ci0JLyoKLQkgKiBOb3QgY3Jvc3MtcmVmIGNhc2UsIGp1c3QgZ2V0IG91dCBvZiBoZXJlLgotCSAqLwotCWlmIChsaWtlbHkoIShib2R5LT52YWxpZCAmIE9CRF9NRF9NRFMpKSkKLQkJcmV0dXJuIDA7CiAKLQkvKgotCSAqIE9rYXksIE1EUyBoYXMgcmV0dXJuZWQgc3VjY2Vzcy4gUHJvYmFibHkgbmFtZSBoYXMgYmVlbiByZXNvbHZlZCBpbgotCSAqIHJlbW90ZSBpbm9kZS4KLQkgKi8KLQlyYyA9IGxtdl9pbnRlbnRfcmVtb3RlKGV4cCwgbG1tLCBsbW1zaXplLCBpdCwgJm9wX2RhdGEtPm9wX2ZpZDEsIGZsYWdzLAotCQkJICAgICAgIHJlcXAsIGNiX2Jsb2NraW5nLCBleHRyYV9sb2NrX2ZsYWdzKTsKLQlpZiAocmMgIT0gMCkgewotCQlMQVNTRVJUKHJjIDwgMCk7Ci0JCS8qCi0JCSAqIFRoaXMgaXMgcG9zc2libGUsIHRoYXQgc29tZSB1c2Vyc3BhY2UgYXBwbGljYXRpb24gd2lsbCB0cnkgdG8KLQkJICogb3BlbiBmaWxlIGFzIGRpcmVjdG9yeSBhbmQgd2Ugd2lsbCBoYXZlIC1FTk9URElSIGhlcmUuIEFzCi0JCSAqIHRoaXMgaXMgbm9ybWFsIHNpdHVhdGlvbiwgd2Ugc2hvdWxkIG5vdCBwcmludCBlcnJvciBoZXJlLAotCQkgKiBvbmx5IGRlYnVnIGluZm8uCi0JCSAqLwotCQlDREVCVUcoRF9JTk9ERSwgIkNhbid0IGhhbmRsZSByZW1vdGUgJXM6IGRpciAiIERGSUQgIigiIERGSUQgIik6JSpzOiAlZFxuIiwKLQkJICAgICAgIExMX0lUMlNUUihpdCksIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDIpLAotCQkgICAgICAgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSksIG9wX2RhdGEtPm9wX25hbWVsZW4sCi0JCSAgICAgICBvcF9kYXRhLT5vcF9uYW1lLCByYyk7Ci0JCXJldHVybiByYzsKKwkvKiBOb3QgY3Jvc3MtcmVmIGNhc2UsIGp1c3QgZ2V0IG91dCBvZiBoZXJlLiAqLworCWlmICh1bmxpa2VseSgoYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX01EUykpKSB7CisJCXJjID0gbG12X2ludGVudF9yZW1vdGUoZXhwLCBpdCwgJm9wX2RhdGEtPm9wX2ZpZDEsIHJlcXAsCisJCQkJICAgICAgIGNiX2Jsb2NraW5nLCBleHRyYV9sb2NrX2ZsYWdzKTsKKwkJaWYgKHJjICE9IDApCisJCQlyZXR1cm4gcmM7CisKKwkJYm9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJigqcmVxcCktPnJxX3BpbGwsICZSTUZfTURUX0JPRFkpOworCQlpZiAoIWJvZHkpCisJCQlyZXR1cm4gLUVQUk9UTzsKIAl9CiAKIAlyZXR1cm4gcmM7CkBAIC0yNDAsMzggKzM1NywxMDMgQEAKICAqLwogc3RhdGljIGludCBsbXZfaW50ZW50X2xvb2t1cChzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAogCQkJICAgICBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkJCSAgICAgdm9pZCAqbG1tLCBpbnQgbG1tc2l6ZSwgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0LAotCQkJICAgICBpbnQgZmxhZ3MsIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXAsCisJCQkgICAgIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCwKKwkJCSAgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxcCwKIAkJCSAgICAgbGRsbV9ibG9ja2luZ19jYWxsYmFjayBjYl9ibG9ja2luZywKIAkJCSAgICAgX191NjQgZXh0cmFfbG9ja19mbGFncykKIHsKKwlzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtID0gb3BfZGF0YS0+b3BfbWVhMTsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAgICAgICpvYmQgPSBleHAtPmV4cF9vYmQ7CiAJc3RydWN0IGxtdl9vYmQJICpsbXYgPSAmb2JkLT51LmxtdjsKIAlzdHJ1Y3QgbG12X3RndF9kZXNjICAgICp0Z3QgPSBOVUxMOwogCXN0cnVjdCBtZHRfYm9keQkqYm9keTsKIAlpbnQJCSAgICAgcmMgPSAwOwogCisJLyoKKwkgKiBJZiBpdCByZXR1cm5zIEVSUl9QVFIoLUVCQURGRCkgdGhlbiBpdCBpcyBhbiB1bmtub3duIGhhc2ggdHlwZQorCSAqIGl0IHdpbGwgdHJ5IGFsbCBzdHJpcGVzIHRvIGxvY2F0ZSB0aGUgb2JqZWN0CisJICovCiAJdGd0ID0gbG12X2xvY2F0ZV9tZHMobG12LCBvcF9kYXRhLCAmb3BfZGF0YS0+b3BfZmlkMSk7Ci0JaWYgKElTX0VSUih0Z3QpKQorCWlmIChJU19FUlIodGd0KSAmJiAoUFRSX0VSUih0Z3QpICE9IC1FQkFERkQpKQogCQlyZXR1cm4gUFRSX0VSUih0Z3QpOwogCisJLyoKKwkgKiBCb3RoIG1pZ3JhdGluZyBkaXIgYW5kIHVua25vd24gaGFzaCBkaXIgbmVlZCB0byB0cnkKKwkgKiBhbGwgb2Ygc3ViLXN0cmlwZXMKKwkgKi8KKwlpZiAobHNtICYmICFsbXZfaXNfa25vd25faGFzaF90eXBlKGxzbS0+bHNtX21kX2hhc2hfdHlwZSkpIHsKKwkJc3RydWN0IGxtdl9vaW5mbyAqb2luZm8gPSAmbHNtLT5sc21fbWRfb2luZm9bMF07CisKKwkJb3BfZGF0YS0+b3BfZmlkMSA9IG9pbmZvLT5sbW9fZmlkOworCQlvcF9kYXRhLT5vcF9tZHMgPSBvaW5mby0+bG1vX21kczsKKwkJdGd0ID0gbG12X2dldF90YXJnZXQobG12LCBvaW5mby0+bG1vX21kcywgTlVMTCk7CisJCWlmIChJU19FUlIodGd0KSkKKwkJCXJldHVybiBQVFJfRVJSKHRndCk7CisJfQorCiAJaWYgKCFmaWRfaXNfc2FuZSgmb3BfZGF0YS0+b3BfZmlkMikpCiAJCWZpZF96ZXJvKCZvcF9kYXRhLT5vcF9maWQyKTsKIAotCUNERUJVRyhEX0lOT0RFLCAiTE9PS1VQX0lOVEVOVCB3aXRoIGZpZDE9IkRGSUQiLCBmaWQyPSJERklECi0JICAgICAgICIsIG5hbWU9JyVzJyAtPiBtZHMgIyVkXG4iLCBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwKLQkgICAgICAgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMiksCisJQ0RFQlVHKERfSU5PREUsICJMT09LVVBfSU5URU5UIHdpdGggZmlkMT0iIERGSUQgIiwgZmlkMj0iIERGSUQgIiwgbmFtZT0nJXMnIC0+IG1kcyAjJXUgbHNtPSVwIGxzbV9tYWdpYz0leFxuIiwKKwkgICAgICAgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSksIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDIpLAogCSAgICAgICBvcF9kYXRhLT5vcF9uYW1lID8gb3BfZGF0YS0+b3BfbmFtZSA6ICI8TlVMTD4iLAotCSAgICAgICB0Z3QtPmx0ZF9pZHgpOworCSAgICAgICB0Z3QtPmx0ZF9pZHgsIGxzbSwgIWxzbSA/IC0xIDogbHNtLT5sc21fbWRfbWFnaWMpOwogCiAJb3BfZGF0YS0+b3BfYmlhcyAmPSB+TURTX0NST1NTX1JFRjsKIAotCXJjID0gbWRfaW50ZW50X2xvY2sodGd0LT5sdGRfZXhwLCBvcF9kYXRhLCBsbW0sIGxtbXNpemUsIGl0LAotCQkJICAgIGZsYWdzLCByZXFwLCBjYl9ibG9ja2luZywgZXh0cmFfbG9ja19mbGFncyk7Ci0KLQlpZiAocmMgPCAwIHx8ICEqcmVxcCkKKwlyYyA9IG1kX2ludGVudF9sb2NrKHRndC0+bHRkX2V4cCwgb3BfZGF0YSwgaXQsIHJlcXAsIGNiX2Jsb2NraW5nLAorCQkJICAgIGV4dHJhX2xvY2tfZmxhZ3MpOworCWlmIChyYyA8IDApCiAJCXJldHVybiByYzsKIAorCWlmICghKnJlcXApIHsKKwkJLyoKKwkJICogSWYgUlBDIGhhcHBlbnMsIGxzbSBpbmZvcm1hdGlvbiB3aWxsIGJlIHJldmFsaWRhdGVkCisJCSAqIGR1cmluZyB1cGRhdGVfaW5vZGUgcHJvY2VzcyAoc2VlIGxsX3VwZGF0ZV9sc21fbWQpCisJCSAqLworCQlpZiAob3BfZGF0YS0+b3BfbWVhMikgeworCQkJcmMgPSBsbXZfcmV2YWxpZGF0ZV9zbGF2ZXMoZXhwLCBvcF9kYXRhLT5vcF9tZWEyLAorCQkJCQkJICAgY2JfYmxvY2tpbmcsCisJCQkJCQkgICBleHRyYV9sb2NrX2ZsYWdzKTsKKwkJCWlmIChyYyAhPSAwKQorCQkJCXJldHVybiByYzsKKwkJfQorCQlyZXR1cm4gcmM7CisJfSBlbHNlIGlmIChpdF9kaXNwb3NpdGlvbihpdCwgRElTUF9MT09LVVBfTkVHKSAmJiBsc20gJiYKKwkJICAgbG12X25lZWRfdHJ5X2FsbF9zdHJpcGVzKGxzbSkpIHsKKwkJLyoKKwkJICogRm9yIG1pZ3JhdGluZyBhbmQgdW5rbm93biBoYXNoIHR5cGUgZGlyZWN0b3J5LCBpdCB3aWxsCisJCSAqIHRyeSB0byB0YXJnZXQgdGhlIGVudHJ5IG9uIG90aGVyIHN0cmlwZXMKKwkJICovCisJCWludCBzdHJpcGVfaW5kZXg7CisKKwkJZm9yIChzdHJpcGVfaW5kZXggPSAxOworCQkgICAgIHN0cmlwZV9pbmRleCA8IGxzbS0+bHNtX21kX3N0cmlwZV9jb3VudCAmJgorCQkgICAgIGl0X2Rpc3Bvc2l0aW9uKGl0LCBESVNQX0xPT0tVUF9ORUcpOyBzdHJpcGVfaW5kZXgrKykgeworCQkJc3RydWN0IGxtdl9vaW5mbyAqb2luZm87CisKKwkJCS8qIHJlbGVhc2UgdGhlIHByZXZpb3VzIHJlcXVlc3QgKi8KKwkJCXB0bHJwY19yZXFfZmluaXNoZWQoKnJlcXApOworCQkJaXQtPml0X3JlcXVlc3QgPSBOVUxMOworCQkJKnJlcXAgPSBOVUxMOworCisJCQlvaW5mbyA9ICZsc20tPmxzbV9tZF9vaW5mb1tzdHJpcGVfaW5kZXhdOworCQkJdGd0ID0gbG12X2ZpbmRfdGFyZ2V0KGxtdiwgJm9pbmZvLT5sbW9fZmlkKTsKKwkJCWlmIChJU19FUlIodGd0KSkKKwkJCQlyZXR1cm4gUFRSX0VSUih0Z3QpOworCisJCQlDREVCVUcoRF9JTk9ERSwgIlRyeSBvdGhlciBzdHJpcGVzICIgREZJRCJcbiIsCisJCQkgICAgICAgUEZJRCgmb2luZm8tPmxtb19maWQpKTsKKworCQkJb3BfZGF0YS0+b3BfZmlkMSA9IG9pbmZvLT5sbW9fZmlkOworCQkJaXQtPml0X2Rpc3Bvc2l0aW9uICY9IH5ESVNQX0VOUV9DT01QTEVURTsKKwkJCXJjID0gbWRfaW50ZW50X2xvY2sodGd0LT5sdGRfZXhwLCBvcF9kYXRhLCBpdCwgcmVxcCwKKwkJCQkJICAgIGNiX2Jsb2NraW5nLCBleHRyYV9sb2NrX2ZsYWdzKTsKKwkJCWlmIChyYykKKwkJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKIAkvKgogCSAqIE1EUyBoYXMgcmV0dXJuZWQgc3VjY2Vzcy4gUHJvYmFibHkgbmFtZSBoYXMgYmVlbiByZXNvbHZlZCBpbgogCSAqIHJlbW90ZSBpbm9kZS4gTGV0J3MgY2hlY2sgdGhpcy4KQEAgLTI3OSwxOSArNDYxLDIzIEBACiAJYm9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJigqcmVxcCktPnJxX3BpbGwsICZSTUZfTURUX0JPRFkpOwogCWlmICghYm9keSkKIAkJcmV0dXJuIC1FUFJPVE87Ci0JLyogTm90IGNyb3NzLXJlZiBjYXNlLCBqdXN0IGdldCBvdXQgb2YgaGVyZS4gKi8KLQlpZiAobGlrZWx5KCEoYm9keS0+dmFsaWQgJiBPQkRfTURfTURTKSkpCi0JCXJldHVybiAwOwogCi0JcmMgPSBsbXZfaW50ZW50X3JlbW90ZShleHAsIGxtbSwgbG1tc2l6ZSwgaXQsIE5VTEwsIGZsYWdzLCByZXFwLAotCQkJICAgICAgIGNiX2Jsb2NraW5nLCBleHRyYV9sb2NrX2ZsYWdzKTsKKwkvKiBOb3QgY3Jvc3MtcmVmIGNhc2UsIGp1c3QgZ2V0IG91dCBvZiBoZXJlLiAqLworCWlmICh1bmxpa2VseSgoYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX01EUykpKSB7CisJCXJjID0gbG12X2ludGVudF9yZW1vdGUoZXhwLCBpdCwgTlVMTCwgcmVxcCwgY2JfYmxvY2tpbmcsCisJCQkJICAgICAgIGV4dHJhX2xvY2tfZmxhZ3MpOworCQlpZiAocmMgIT0gMCkKKwkJCXJldHVybiByYzsKKwkJYm9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJigqcmVxcCktPnJxX3BpbGwsICZSTUZfTURUX0JPRFkpOworCQlpZiAoIWJvZHkpCisJCQlyZXR1cm4gLUVQUk9UTzsKKwl9CiAKIAlyZXR1cm4gcmM7CiB9CiAKIGludCBsbXZfaW50ZW50X2xvY2soc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCSAgICB2b2lkICpsbW0sIGludCBsbW1zaXplLCBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQsCi0JCSAgICBpbnQgZmxhZ3MsIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXAsCisJCSAgICBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQsIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXAsCiAJCSAgICBsZGxtX2Jsb2NraW5nX2NhbGxiYWNrIGNiX2Jsb2NraW5nLAogCQkgICAgX191NjQgZXh0cmFfbG9ja19mbGFncykKIHsKQEAgLTMwMCw4ICs0ODYsOSBAQAogCiAJTEFTU0VSVChmaWRfaXNfc2FuZSgmb3BfZGF0YS0+b3BfZmlkMSkpOwogCi0JQ0RFQlVHKERfSU5PREUsICJJTlRFTlQgTE9DSyAnJXMnIGZvciAnJSpzJyBvbiAiREZJRCJcbiIsCi0JICAgICAgIExMX0lUMlNUUihpdCksIG9wX2RhdGEtPm9wX25hbWVsZW4sIG9wX2RhdGEtPm9wX25hbWUsCisJQ0RFQlVHKERfSU5PREUsICJJTlRFTlQgTE9DSyAnJXMnIGZvciAiREZJRCIgJyUqcycgb24gIkRGSUQiXG4iLAorCSAgICAgICBMTF9JVDJTVFIoaXQpLCBQRklEKCZvcF9kYXRhLT5vcF9maWQyKSwKKwkgICAgICAgKGludClvcF9kYXRhLT5vcF9uYW1lbGVuLCBvcF9kYXRhLT5vcF9uYW1lLAogCSAgICAgICBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSk7CiAKIAlyYyA9IGxtdl9jaGVja19jb25uZWN0KG9iZCk7CkBAIC0zMDksMTQgKzQ5NiwzNCBAQAogCQlyZXR1cm4gcmM7CiAKIAlpZiAoaXQtPml0X29wICYgKElUX0xPT0tVUCB8IElUX0dFVEFUVFIgfCBJVF9MQVlPVVQpKQotCQlyYyA9IGxtdl9pbnRlbnRfbG9va3VwKGV4cCwgb3BfZGF0YSwgbG1tLCBsbW1zaXplLCBpdCwKLQkJCQkgICAgICAgZmxhZ3MsIHJlcXAsIGNiX2Jsb2NraW5nLAorCQlyYyA9IGxtdl9pbnRlbnRfbG9va3VwKGV4cCwgb3BfZGF0YSwgaXQsIHJlcXAsIGNiX2Jsb2NraW5nLAogCQkJCSAgICAgICBleHRyYV9sb2NrX2ZsYWdzKTsKIAllbHNlIGlmIChpdC0+aXRfb3AgJiBJVF9PUEVOKQotCQlyYyA9IGxtdl9pbnRlbnRfb3BlbihleHAsIG9wX2RhdGEsIGxtbSwgbG1tc2l6ZSwgaXQsCi0JCQkJICAgICBmbGFncywgcmVxcCwgY2JfYmxvY2tpbmcsCisJCXJjID0gbG12X2ludGVudF9vcGVuKGV4cCwgb3BfZGF0YSwgaXQsIHJlcXAsIGNiX2Jsb2NraW5nLAogCQkJCSAgICAgZXh0cmFfbG9ja19mbGFncyk7CiAJZWxzZQogCQlMQlVHKCk7CisKKwlpZiAocmMgPCAwKSB7CisJCXN0cnVjdCBsdXN0cmVfaGFuZGxlIGxvY2tfaGFuZGxlOworCisJCWlmIChpdC0+aXRfbG9ja19tb2RlKSB7CisJCQlsb2NrX2hhbmRsZS5jb29raWUgPSBpdC0+aXRfbG9ja19oYW5kbGU7CisJCQlsZGxtX2xvY2tfZGVjcmVmKCZsb2NrX2hhbmRsZSwgaXQtPml0X2xvY2tfbW9kZSk7CisJCX0KKworCQlpdC0+aXRfbG9ja19oYW5kbGUgPSAwOworCQlpdC0+aXRfbG9ja19tb2RlID0gMDsKKworCQlpZiAoaXQtPml0X3JlbW90ZV9sb2NrX21vZGUpIHsKKwkJCWxvY2tfaGFuZGxlLmNvb2tpZSA9IGl0LT5pdF9yZW1vdGVfbG9ja19oYW5kbGU7CisJCQlsZGxtX2xvY2tfZGVjcmVmKCZsb2NrX2hhbmRsZSwKKwkJCQkJIGl0LT5pdF9yZW1vdGVfbG9ja19tb2RlKTsKKwkJfQorCisJCWl0LT5pdF9yZW1vdGVfbG9ja19oYW5kbGUgPSAwOworCQlpdC0+aXRfcmVtb3RlX2xvY2tfbW9kZSA9IDA7CisJfQorCiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9pbnRlcm5hbC5oCmluZGV4IDBiZWFmYzQuLjUyYjAzNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9sbXZfaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X2ludGVybmFsLmgKQEAgLTM1LDYgKzM1LDcgQEAKIAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV9pZGwuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZC5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xtdi5oIgogCiAjZGVmaW5lIExNVl9NQVhfVEdUX0NPVU5UIDEyOAogCkBAIC00NCw3NyArNDUsMTE2IEBACiBpbnQgbG12X2NoZWNrX2Nvbm5lY3Qoc3RydWN0IG9iZF9kZXZpY2UgKm9iZCk7CiAKIGludCBsbXZfaW50ZW50X2xvY2soc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCSAgICB2b2lkICpsbW0sIGludCBsbW1zaXplLCBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQsCi0JCSAgICBpbnQgZmxhZ3MsIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXAsCisJCSAgICBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQsIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXAsCiAJCSAgICBsZGxtX2Jsb2NraW5nX2NhbGxiYWNrIGNiX2Jsb2NraW5nLAogCQkgICAgX191NjQgZXh0cmFfbG9ja19mbGFncyk7CiAKIGludCBsbXZfZmxkX2xvb2t1cChzdHJ1Y3QgbG12X29iZCAqbG12LCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQsIHUzMiAqbWRzKTsKIGludCBfX2xtdl9maWRfYWxsb2Moc3RydWN0IGxtdl9vYmQgKmxtdiwgc3RydWN0IGx1X2ZpZCAqZmlkLCB1MzIgbWRzKTsKLWludCBsbXZfZmlkX2FsbG9jKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsdV9maWQgKmZpZCwKLQkJICBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSk7CitpbnQgbG12X2ZpZF9hbGxvYyhjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCisJCSAgc3RydWN0IGx1X2ZpZCAqZmlkLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSk7CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxtdl9nZXRfbWVhKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKQoraW50IGxtdl91bnBhY2tfbWQoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxtdl9zdHJpcGVfbWQgKipsc21wLAorCQkgIGNvbnN0IHVuaW9uIGxtdl9tZHNfbWQgKmxtbSwgaW50IHN0cmlwZV9jb3VudCk7CisKK2ludCBsbXZfcmV2YWxpZGF0ZV9zbGF2ZXMoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKKwkJCSAgY29uc3Qgc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSwKKwkJCSAgbGRsbV9ibG9ja2luZ19jYWxsYmFjayBjYl9ibG9ja2luZywKKwkJCSAgaW50IGV4dHJhX2xvY2tfZmxhZ3MpOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBvYmRfZGV2aWNlICpsbXYyb2JkX2RldihzdHJ1Y3QgbG12X29iZCAqbG12KQogewotCXN0cnVjdCBtZHRfYm9keQkgKmJvZHk7Ci0Jc3RydWN0IGxtdl9zdHJpcGVfbWQgICAgKm1lYTsKLQotCUxBU1NFUlQocmVxKTsKLQotCWJvZHkgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfTURUX0JPRFkpOwotCi0JaWYgKCFib2R5IHx8ICFTX0lTRElSKGJvZHktPm1vZGUpIHx8ICFib2R5LT5lYWRhdGFzaXplKQotCQlyZXR1cm4gTlVMTDsKLQotCW1lYSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9zaXplZF9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9NRFRfTUQsCi0JCQkJCSAgIGJvZHktPmVhZGF0YXNpemUpOwotCWlmIChtZWEtPm1lYV9jb3VudCA9PSAwKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobWVhLT5tZWFfbWFnaWMgIT0gTUVBX01BR0lDX0xBU1RfQ0hBUiAmJgotCSAgICBtZWEtPm1lYV9tYWdpYyAhPSBNRUFfTUFHSUNfQUxMX0NIQVJTICYmCi0JICAgIG1lYS0+bWVhX21hZ2ljICE9IE1FQV9NQUdJQ19IQVNIX1NFR01FTlQpCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIG1lYTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgbG12X2dldF9lYXNpemUoc3RydWN0IGxtdl9vYmQgKmxtdikKLXsKLQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBsbXZfc3RyaXBlX21kKSArCi0JCWxtdi0+ZGVzYy5sZF90Z3RfY291bnQgKgotCQlzaXplb2Yoc3RydWN0IGx1X2ZpZCk7CisJcmV0dXJuIGNvbnRhaW5lcl9vZjAobG12LCBzdHJ1Y3Qgb2JkX2RldmljZSwgdS5sbXYpOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBsbXZfdGd0X2Rlc2MgKgotbG12X2dldF90YXJnZXQoc3RydWN0IGxtdl9vYmQgKmxtdiwgdTMyIG1kcykKK2xtdl9nZXRfdGFyZ2V0KHN0cnVjdCBsbXZfb2JkICpsbXYsIHUzMiBtZHRfaWR4LCBpbnQgKmluZGV4KQogewotCWludCBjb3VudCA9IGxtdi0+ZGVzYy5sZF90Z3RfY291bnQ7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBsbXYtPmRlc2MubGRfdGd0X2NvdW50OyBpKyspIHsKIAkJaWYgKCFsbXYtPnRndHNbaV0pCiAJCQljb250aW51ZTsKIAotCQlpZiAobG12LT50Z3RzW2ldLT5sdGRfaWR4ID09IG1kcykKKwkJaWYgKGxtdi0+dGd0c1tpXS0+bHRkX2lkeCA9PSBtZHRfaWR4KSB7CisJCQlpZiAoaW5kZXgpCisJCQkJKmluZGV4ID0gaTsKIAkJCXJldHVybiBsbXYtPnRndHNbaV07CisJCX0KIAl9CiAKIAlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQKK2xtdl9maW5kX3RhcmdldF9pbmRleChzdHJ1Y3QgbG12X29iZCAqbG12LCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQpCit7CisJc3RydWN0IGxtdl90Z3RfZGVzYyAqbHRkOworCXUzMiBtZHRfaWR4ID0gMDsKKwlpbnQgaW5kZXggPSAwOworCisJaWYgKGxtdi0+ZGVzYy5sZF90Z3RfY291bnQgPiAxKSB7CisJCWludCByYzsKKworCQlyYyA9IGxtdl9mbGRfbG9va3VwKGxtdiwgZmlkLCAmbWR0X2lkeCk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJfQorCisJbHRkID0gbG12X2dldF90YXJnZXQobG12LCBtZHRfaWR4LCAmaW5kZXgpOworCWlmIChJU19FUlIobHRkKSkKKwkJcmV0dXJuIFBUUl9FUlIobHRkKTsKKworCXJldHVybiBpbmRleDsKK30KKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgbG12X3RndF9kZXNjICoKIGxtdl9maW5kX3RhcmdldChzdHJ1Y3QgbG12X29iZCAqbG12LCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQpCiB7Ci0JdTMyIG1kcyA9IDA7Ci0JaW50IHJjOworCWludCBpbmRleDsKIAotCWlmIChsbXYtPmRlc2MubGRfdGd0X2NvdW50ID4gMSkgewotCQlyYyA9IGxtdl9mbGRfbG9va3VwKGxtdiwgZmlkLCAmbWRzKTsKLQkJaWYgKHJjKQotCQkJcmV0dXJuIEVSUl9QVFIocmMpOwotCX0KKwlpbmRleCA9IGxtdl9maW5kX3RhcmdldF9pbmRleChsbXYsIGZpZCk7CisJaWYgKGluZGV4IDwgMCkKKwkJcmV0dXJuIEVSUl9QVFIoaW5kZXgpOwogCi0JcmV0dXJuIGxtdl9nZXRfdGFyZ2V0KGxtdiwgbWRzKTsKKwlyZXR1cm4gbG12LT50Z3RzW2luZGV4XTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbG12X3N0cmlwZV9tZF9zaXplKGludCBzdHJpcGVfY291bnQpCit7CisJc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbTsKKworCXJldHVybiBzaXplb2YoKmxzbSkgKyBzdHJpcGVfY291bnQgKiBzaXplb2YobHNtLT5sc21fbWRfb2luZm9bMF0pOworfQorCitpbnQgbG12X25hbWVfdG9fc3RyaXBlX2luZGV4KGVudW0gbG12X2hhc2hfdHlwZSBoYXNodHlwZSwKKwkJCSAgICAgdW5zaWduZWQgaW50IG1heF9tZHRfaW5kZXgsCisJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKTsKKworc3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3QgbG12X29pbmZvICoKK2xzbV9uYW1lX3RvX3N0cmlwZV9pbmZvKGNvbnN0IHN0cnVjdCBsbXZfc3RyaXBlX21kICpsc20sIGNvbnN0IGNoYXIgKm5hbWUsCisJCQlpbnQgbmFtZWxlbikKK3sKKwlpbnQgc3RyaXBlX2luZGV4OworCisJc3RyaXBlX2luZGV4ID0gbG12X25hbWVfdG9fc3RyaXBlX2luZGV4KGxzbS0+bHNtX21kX2hhc2hfdHlwZSwKKwkJCQkJCWxzbS0+bHNtX21kX3N0cmlwZV9jb3VudCwKKwkJCQkJCW5hbWUsIG5hbWVsZW4pOworCWlmIChzdHJpcGVfaW5kZXggPCAwKQorCQlyZXR1cm4gRVJSX1BUUihzdHJpcGVfaW5kZXgpOworCisJTEFTU0VSVEYoc3RyaXBlX2luZGV4IDwgbHNtLT5sc21fbWRfc3RyaXBlX2NvdW50LAorCQkgInN0cmlwZV9pbmRleCA9ICVkLCBzdHJpcGVfY291bnQgPSAlZCBoYXNoX3R5cGUgPSAleCBuYW1lID0gJS4qc1xuIiwKKwkJIHN0cmlwZV9pbmRleCwgbHNtLT5sc21fbWRfc3RyaXBlX2NvdW50LAorCQkgbHNtLT5sc21fbWRfaGFzaF90eXBlLCBuYW1lbGVuLCBuYW1lKTsKKworCXJldHVybiAmbHNtLT5sc21fbWRfb2luZm9bc3RyaXBlX2luZGV4XTsKK30KKworc3RhdGljIGlubGluZSBib29sIGxtdl9uZWVkX3RyeV9hbGxfc3RyaXBlcyhjb25zdCBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtKQoreworCXJldHVybiAhbG12X2lzX2tub3duX2hhc2hfdHlwZShsc20tPmxzbV9tZF9oYXNoX3R5cGUpIHx8CisJICAgICAgIGxzbS0+bHNtX21kX2hhc2hfdHlwZSAmIExNVl9IQVNIX0ZMQUdfTUlHUkFUSU9OOwogfQogCiBzdHJ1Y3QgbG12X3RndF9kZXNjCkBAIC0xMjMsNiArMTYzLDYgQEAKIC8qIGxwcm9jX2xtdi5jICovCiB2b2lkIGxwcm9jZnNfbG12X2luaXRfdmFycyhzdHJ1Y3QgbHByb2Nmc19zdGF0aWNfdmFycyAqbHZhcnMpOwogCi1leHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsbXZfcHJvY190YXJnZXRfZm9wczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxtdl9wcm9jX3RhcmdldF9mb3BzOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9sbXZfb2JkLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X29iZC5jCmluZGV4IDBlMTU4OGEuLjdkYmIyYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9sbXZfb2JkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9vYmQuYwpAQCAtNDMsMTIgKzQzLDEzIEBACiAKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfaWRsLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmRfc3VwcG9ydC5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpYi5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX25ldC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkX2NsYXNzLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbG12LmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9scHJvY2ZzX3N0YXR1cy5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2NsX29iamVjdC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2ZpZC5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV9pb2N0bC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2tlcm5lbGNvbW0uaCIKICNpbmNsdWRlICJsbXZfaW50ZXJuYWwuaCIKIApAQCAtNzAsMTIgKzcxLDEyIEBACiAgKiAgLUVOT1RDT05OOiBUaGUgVVVJRCBpcyBmb3VuZCwgYnV0IHRoZSB0YXJnZXQgY29ubmVjdGlvbiBpcyBiYWQgKCEpCiAgKiAgLUVCQURGICAgOiBUaGUgVVVJRCBpcyBmb3VuZCwgYnV0IHRoZSBPQkQgb2YgdGhlIHdyb25nIHR5cGUgKCEpCiAgKi8KLXN0YXRpYyBpbnQgbG12X3NldF9tZGNfYWN0aXZlKHN0cnVjdCBsbXZfb2JkICpsbXYsIHN0cnVjdCBvYmRfdXVpZCAqdXVpZCwKK3N0YXRpYyBpbnQgbG12X3NldF9tZGNfYWN0aXZlKHN0cnVjdCBsbXZfb2JkICpsbXYsIGNvbnN0IHN0cnVjdCBvYmRfdXVpZCAqdXVpZCwKIAkJCSAgICAgIGludCBhY3RpdmF0ZSkKIHsKIAlzdHJ1Y3QgbG12X3RndF9kZXNjICAgICp1bmluaXRpYWxpemVkX3Zhcih0Z3QpOwogCXN0cnVjdCBvYmRfZGV2aWNlICAgICAgKm9iZDsKLQlpbnQJCSAgICAgaTsKKwl1MzIJCSAgICAgaTsKIAlpbnQJCSAgICAgcmMgPSAwOwogCiAJQ0RFQlVHKERfSU5GTywgIlNlYXJjaGluZyBpbiBsbXYgJXAgZm9yIHV1aWQgJXMgKGFjdGl2YXRlPSVkKVxuIiwKQEAgLTI0NCwzNiArMjQ1LDEyIEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZCBsbXZfc2V0X3RpbWVvdXRzKHN0cnVjdCBvYmRfZGV2aWNlICpvYmQpCi17Ci0Jc3RydWN0IGxtdl9vYmQJKmxtdjsKLQlpbnQJCSAgICBpOwotCi0JbG12ID0gJm9iZC0+dS5sbXY7Ci0JaWYgKGxtdi0+c2VydmVyX3RpbWVvdXQgPT0gMCkKLQkJcmV0dXJuOwotCi0JaWYgKGxtdi0+Y29ubmVjdGVkID09IDApCi0JCXJldHVybjsKLQotCWZvciAoaSA9IDA7IGkgPCBsbXYtPmRlc2MubGRfdGd0X2NvdW50OyBpKyspIHsKLQkJc3RydWN0IGxtdl90Z3RfZGVzYyAqdGd0ID0gbG12LT50Z3RzW2ldOwotCi0JCXRndCA9IGxtdi0+dGd0c1tpXTsKLQkJaWYgKCF0Z3QgfHwgIXRndC0+bHRkX2V4cCB8fCAhdGd0LT5sdGRfYWN0aXZlKQotCQkJY29udGludWU7Ci0KLQkJb2JkX3NldF9pbmZvX2FzeW5jKE5VTEwsIHRndC0+bHRkX2V4cCwgc2l6ZW9mKEtFWV9JTlRFUk1EUyksCi0JCQkJICAgS0VZX0lOVEVSTURTLCAwLCBOVUxMLCBOVUxMKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgbG12X2luaXRfZWFfc2l6ZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBpbnQgZWFzaXplLAotCQkJICAgIGludCBkZWZfZWFzaXplLCBpbnQgY29va2llc2l6ZSwgaW50IGRlZl9jb29raWVzaXplKQorc3RhdGljIGludCBsbXZfaW5pdF9lYV9zaXplKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHUzMiBlYXNpemUsIHUzMiBkZWZfZWFzaXplLAorCQkJICAgIHUzMiBjb29raWVzaXplLCB1MzIgZGVmX2Nvb2tpZXNpemUpCiB7CiAJc3RydWN0IG9iZF9kZXZpY2UgICAqb2JkID0gZXhwLT5leHBfb2JkOwogCXN0cnVjdCBsbXZfb2JkICAgICAgKmxtdiA9ICZvYmQtPnUubG12OwotCWludAkJICBpOworCXUzMiBpOwogCWludAkJICByYyA9IDA7CiAJaW50CQkgIGNoYW5nZSA9IDA7CiAKQEAgLTQyMCw2ICszOTcsNyBAQAogewogCXN0cnVjdCBsbXZfb2JkICAgICAgKmxtdiA9ICZvYmQtPnUubG12OwogCXN0cnVjdCBsbXZfdGd0X2Rlc2MgKnRndDsKKwlpbnQgb3JpZ190Z3RfY291bnQgPSAwOwogCWludAkJICByYyA9IDA7CiAKIAlDREVCVUcoRF9DT05GSUcsICJUYXJnZXQgdXVpZDogJXMuIGluZGV4ICVkXG4iLCB1dWlkcC0+dXVpZCwgaW5kZXgpOwpAQCAtNDg5LDE0ICs0NjcsMTcgQEAKIAl0Z3QtPmx0ZF91dWlkID0gKnV1aWRwOwogCXRndC0+bHRkX2FjdGl2ZSA9IDA7CiAJbG12LT50Z3RzW2luZGV4XSA9IHRndDsKLQlpZiAoaW5kZXggPj0gbG12LT5kZXNjLmxkX3RndF9jb3VudCkKKwlpZiAoaW5kZXggPj0gbG12LT5kZXNjLmxkX3RndF9jb3VudCkgeworCQlvcmlnX3RndF9jb3VudCA9IGxtdi0+ZGVzYy5sZF90Z3RfY291bnQ7CiAJCWxtdi0+ZGVzYy5sZF90Z3RfY291bnQgPSBpbmRleCArIDE7CisJfQogCiAJaWYgKGxtdi0+Y29ubmVjdGVkKSB7CiAJCXJjID0gbG12X2Nvbm5lY3RfbWRjKG9iZCwgdGd0KTsKIAkJaWYgKHJjKSB7CiAJCQlzcGluX2xvY2soJmxtdi0+bG12X2xvY2spOwotCQkJbG12LT5kZXNjLmxkX3RndF9jb3VudC0tOworCQkJaWYgKGxtdi0+ZGVzYy5sZF90Z3RfY291bnQgPT0gaW5kZXggKyAxKQorCQkJCWxtdi0+ZGVzYy5sZF90Z3RfY291bnQgPSBvcmlnX3RndF9jb3VudDsKIAkJCW1lbXNldCh0Z3QsIDAsIHNpemVvZigqdGd0KSk7CiAJCQlzcGluX3VubG9jaygmbG12LT5sbXZfbG9jayk7CiAJCX0gZWxzZSB7CkBAIC01MTQsNyArNDk1LDcgQEAKIHsKIAlzdHJ1Y3QgbG12X29iZCAgICAgICAqbG12ID0gJm9iZC0+dS5sbXY7CiAJc3RydWN0IGxtdl90Z3RfZGVzYyAgKnRndDsKLQlpbnQJCSAgIGk7CisJdTMyIGk7CiAJaW50CQkgICByYzsKIAlpbnQJCSAgIGVhc2l6ZTsKIApAQCAtNTU0LDEwICs1MzUsOSBAQAogCQkJZ290byBvdXRfZGlzYzsKIAl9CiAKLQlsbXZfc2V0X3RpbWVvdXRzKG9iZCk7CiAJY2xhc3NfZXhwb3J0X3B1dChsbXYtPmV4cCk7CiAJbG12LT5jb25uZWN0ZWQgPSAxOwotCWVhc2l6ZSA9IGxtdl9nZXRfZWFzaXplKGxtdik7CisJZWFzaXplID0gbG12X21kc19tZF9zaXplKGxtdi0+ZGVzYy5sZF90Z3RfY291bnQsIExNVl9NQUdJQyk7CiAJbG12X2luaXRfZWFfc2l6ZShvYmQtPm9iZF9zZWxmX2V4cG9ydCwgZWFzaXplLCAwLCAwLCAwKTsKIAltdXRleF91bmxvY2soJmxtdi0+bG12X2luaXRfbXV0ZXgpOwogCXJldHVybiAwOwpAQCAtNjI5LDcgKzYwOSw3IEBACiAJc3RydWN0IG9iZF9kZXZpY2UgICAgICpvYmQgPSBjbGFzc19leHAyb2JkKGV4cCk7CiAJc3RydWN0IGxtdl9vYmQJKmxtdiA9ICZvYmQtPnUubG12OwogCWludAkJICAgIHJjOwotCWludAkJICAgIGk7CisJdTMyIGk7CiAKIAlpZiAoIWxtdi0+dGd0cykKIAkJZ290byBvdXRfbG9jYWw7CkBAIC03NTgsNyArNzM4LDcgQEAKIAkJCSAgICAgY29uc3Qgc3RydWN0IGhzbV91c2VyX3JlcXVlc3QgKmh1ciwKIAkJCSAgICAgY29uc3Qgc3RydWN0IGxtdl90Z3RfZGVzYyAqdGd0X21kcykKIHsKLQlpbnQJCQlpLCBuciA9IDA7CisJdTMyIGksIG5yID0gMDsKIAlzdHJ1Y3QgbG12X3RndF9kZXNjICAgICpjdXJyX3RndDsKIAogCS8qIGNvdW50IGhvdyBtYW55IHJlcXVlc3RzIG11c3QgYmUgc2VudCB0byB0aGUgZ2l2ZW4gdGFyZ2V0ICovCkBAIC04ODUsMTAgKzg2NSw4IEBACiAKIAlyYyA9IGxpYmNmc19ra3VjX2dyb3VwX2FkZChmaWxwLCBsay0+bGtfdWlkLCBsay0+bGtfZ3JvdXAsCiAJCQkJICAgJmtjZCwgc2l6ZW9mKGtjZCkpOwotCWlmIChyYykgewotCQlpZiAoZmlscCkKLQkJCWZwdXQoZmlscCk7Ci0JfQorCWlmIChyYykKKwkJZnB1dChmaWxwKTsKIAogCXJldHVybiByYzsKIH0KQEAgLTg5OSwxMCArODc3LDEwIEBACiAJc3RydWN0IG9iZF9kZXZpY2UgICAgKm9iZGRldiA9IGNsYXNzX2V4cDJvYmQoZXhwKTsKIAlzdHJ1Y3QgbG12X29iZCAgICAgICAqbG12ID0gJm9iZGRldi0+dS5sbXY7CiAJc3RydWN0IGxtdl90Z3RfZGVzYyAqdGd0ID0gTlVMTDsKLQlpbnQJCSAgIGkgPSAwOworCXUzMiBpID0gMDsKIAlpbnQJCSAgIHJjID0gMDsKIAlpbnQJCSAgIHNldCA9IDA7Ci0JaW50CQkgICBjb3VudCA9IGxtdi0+ZGVzYy5sZF90Z3RfY291bnQ7CisJdTMyIGNvdW50ID0gbG12LT5kZXNjLmxkX3RndF9jb3VudDsKIAogCWlmIChjb3VudCA9PSAwKQogCQlyZXR1cm4gLUVOT1RUWTsKQEAgLTEwMTEsNiArOTg5LDIxIEBACiAJCXJjID0gb2JkX2lvY29udHJvbChjbWQsIHRndC0+bHRkX2V4cCwgbGVuLCBrYXJnLCB1YXJnKTsKIAkJYnJlYWs7CiAJfQorCWNhc2UgTExfSU9DX0ZJRDJNRFRJRFg6IHsKKwkJc3RydWN0IGx1X2ZpZCAqZmlkID0ga2FyZzsKKwkJaW50IG1kdF9pbmRleDsKKworCQlyYyA9IGxtdl9mbGRfbG9va3VwKGxtdiwgZmlkLCAmbWR0X2luZGV4KTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCS8qCisJCSAqIE5vdGU6IHRoaXMgaXMgZnJvbSBsbGl0ZShzZWUgbGxfZGlyX2lvY3RsKCkpLCBAdWFyZyBkb2VzIG5vdAorCQkgKiBwb2ludCB0byB1c2VyIHNwYWNlIG1lbW9yeSBmb3IgRklEMk1EVElEWC4KKwkJICovCisJCSooX191MzIgKil1YXJnID0gbWR0X2luZGV4OworCQlicmVhazsKKwl9CiAJY2FzZSBPQkRfSU9DX0ZJRDJQQVRIOiB7CiAJCXJjID0gbG12X2ZpZDJwYXRoKGV4cCwgbGVuLCBrYXJnLCB1YXJnKTsKIAkJYnJlYWs7CkBAIC0xMTY5LDMyICsxMTYyLDM3IEBACiAJCXJldHVybiAwOwogCX0KIAorCWlmIChvcF9kYXRhLT5vcF9kZWZhdWx0X3N0cmlwZV9vZmZzZXQgIT0gLTEpIHsKKwkJKm1kcyA9IG9wX2RhdGEtPm9wX2RlZmF1bHRfc3RyaXBlX29mZnNldDsKKwkJcmV0dXJuIDA7CisJfQorCiAJLyoqCiAJICogSWYgc3RyaXBlX29mZnNldCBpcyBwcm92aWRlZCBkdXJpbmcgc2V0ZGlyc3RyaXBlCiAJICogKHNldGRpcnN0cmlwZSAtaSB4eCksIHh4IE1EUyB3aWxsIGJlIGNob3Nlbi4KIAkgKi8KLQlpZiAob3BfZGF0YS0+b3BfY2xpX2ZsYWdzICYgQ0xJX1NFVF9NRUEpIHsKKwlpZiAob3BfZGF0YS0+b3BfY2xpX2ZsYWdzICYgQ0xJX1NFVF9NRUEgJiYgb3BfZGF0YS0+b3BfZGF0YSkgewogCQlzdHJ1Y3QgbG12X3VzZXJfbWQgKmx1bTsKIAotCQlsdW0gPSAoc3RydWN0IGxtdl91c2VyX21kICopb3BfZGF0YS0+b3BfZGF0YTsKLQkJaWYgKGx1bS0+bHVtX3R5cGUgPT0gTE1WX1NUUklQRV9UWVBFICYmCi0JCSAgICBsdW0tPmx1bV9zdHJpcGVfb2Zmc2V0ICE9IC0xKSB7Ci0JCQlpZiAobHVtLT5sdW1fc3RyaXBlX29mZnNldCA+PSBsbXYtPmRlc2MubGRfdGd0X2NvdW50KSB7Ci0JCQkJQ0VSUk9SKCIlczogU3RyaXBlX29mZnNldCAlZCA+IE1EVCBjb3VudCAlZDogcmMgPSAlZFxuIiwKLQkJCQkgICAgICAgb2JkLT5vYmRfbmFtZSwKLQkJCQkgICAgICAgbHVtLT5sdW1fc3RyaXBlX29mZnNldCwKLQkJCQkgICAgICAgbG12LT5kZXNjLmxkX3RndF9jb3VudCwgLUVSQU5HRSk7Ci0JCQkJcmV0dXJuIC1FUkFOR0U7Ci0JCQl9Ci0JCQkqbWRzID0gbHVtLT5sdW1fc3RyaXBlX29mZnNldDsKLQkJCXJldHVybiAwOworCQlsdW0gPSBvcF9kYXRhLT5vcF9kYXRhOworCQlpZiAobGUzMl90b19jcHUobHVtLT5sdW1fc3RyaXBlX29mZnNldCkgIT0gKF9fdTMyKS0xKSB7CisJCQkqbWRzID0gbGUzMl90b19jcHUobHVtLT5sdW1fc3RyaXBlX29mZnNldCk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogLTEgbWVhbnMgZGVmYXVsdCwgd2hpY2ggd2lsbCBiZSBpbiB0aGUgc2FtZSBNRFQgd2l0aAorCQkJICogdGhlIHN0cmlwZQorCQkJICovCisJCQkqbWRzID0gb3BfZGF0YS0+b3BfbWRzOworCQkJbHVtLT5sdW1fc3RyaXBlX29mZnNldCA9IGNwdV90b19sZTMyKG9wX2RhdGEtPm9wX21kcyk7CiAJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBBbGxvY2F0ZSBuZXcgZmlkIG9uIHRhcmdldCBhY2NvcmRpbmcgdG8gb3BlcmF0aW9uIHR5cGUgYW5kCisJCSAqIHBhcmVudCBob21lIG1kcy4KKwkJICovCisJCSptZHMgPSBvcF9kYXRhLT5vcF9tZHM7CiAJfQogCi0JLyogQWxsb2NhdGUgbmV3IGZpZCBvbiB0YXJnZXQgYWNjb3JkaW5nIHRvIG9wZXJhdGlvbiB0eXBlIGFuZCBwYXJlbnQKLQkgKiBob21lIG1kcy4KLQkgKi8KLQkqbWRzID0gb3BfZGF0YS0+b3BfbWRzOwogCXJldHVybiAwOwogfQogCkBAIC0xMjAzLDcgKzEyMDEsNyBAQAogCXN0cnVjdCBsbXZfdGd0X2Rlc2MJKnRndDsKIAlpbnQJCQkgcmM7CiAKLQl0Z3QgPSBsbXZfZ2V0X3RhcmdldChsbXYsIG1kcyk7CisJdGd0ID0gbG12X2dldF90YXJnZXQobG12LCBtZHMsIE5VTEwpOwogCWlmIChJU19FUlIodGd0KSkKIAkJcmV0dXJuIFBUUl9FUlIodGd0KTsKIApAQCAtMTIyMSw3ICsxMjE5LDcgQEAKIAkvKgogCSAqIEFza2luZyB1bmRlcmxheWluZyB0Z3QgbGF5ZXIgdG8gYWxsb2NhdGUgbmV3IGZpZC4KIAkgKi8KLQlyYyA9IG9iZF9maWRfYWxsb2ModGd0LT5sdGRfZXhwLCBmaWQsIE5VTEwpOworCXJjID0gb2JkX2ZpZF9hbGxvYyhOVUxMLCB0Z3QtPmx0ZF9leHAsIGZpZCwgTlVMTCk7CiAJaWYgKHJjID4gMCkgewogCQlMQVNTRVJUKGZpZF9pc19zYW5lKGZpZCkpOwogCQlyYyA9IDA7CkBAIC0xMjMyLDggKzEyMzAsOCBAQAogCXJldHVybiByYzsKIH0KIAotaW50IGxtdl9maWRfYWxsb2Moc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGx1X2ZpZCAqZmlkLAotCQkgIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhKQoraW50IGxtdl9maWRfYWxsb2MoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAorCQkgIHN0cnVjdCBsdV9maWQgKmZpZCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEpCiB7CiAJc3RydWN0IG9iZF9kZXZpY2UgICAgICpvYmQgPSBjbGFzc19leHAyb2JkKGV4cCk7CiAJc3RydWN0IGxtdl9vYmQJKmxtdiA9ICZvYmQtPnUubG12OwpAQCAtMTI3OCwxMCArMTI3NiwxMCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlsbXYtPnRndHMgPSBrY2FsbG9jKDMyLCBzaXplb2YoKmxtdi0+dGd0cyksIEdGUF9OT0ZTKTsKKwlsbXYtPnRndHNfc2l6ZSA9IDMyVTsKKwlsbXYtPnRndHMgPSBrY2FsbG9jKGxtdi0+dGd0c19zaXplLCBzaXplb2YoKmxtdi0+dGd0cyksIEdGUF9OT0ZTKTsKIAlpZiAoIWxtdi0+dGd0cykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbG12LT50Z3RzX3NpemUgPSAzMjsKIAogCW9iZF9zdHIydXVpZCgmbG12LT5kZXNjLmxkX3V1aWQsIGRlc2MtPmxkX3V1aWQudXVpZCk7CiAJbG12LT5kZXNjLmxkX3RndF9jb3VudCA9IDA7CkBAIC0xMzU0LDcgKzEzNTIsNyBAQAogCiAJCW9iZF9zdHIydXVpZCgmb2JkX3V1aWQsICBsdXN0cmVfY2ZnX2J1ZihsY2ZnLCAxKSk7CiAKLQkJaWYgKHNzY2FuZihsdXN0cmVfY2ZnX2J1ZihsY2ZnLCAyKSwgIiVkIiwgJmluZGV4KSAhPSAxKSB7CisJCWlmIChzc2NhbmYobHVzdHJlX2NmZ19idWYobGNmZywgMiksICIldSIsICZpbmRleCkgIT0gMSkgewogCQkJcmMgPSAtRUlOVkFMOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTEzODAsNyArMTM3OCw3IEBACiAJc3RydWN0IGxtdl9vYmQJKmxtdiA9ICZvYmQtPnUubG12OwogCXN0cnVjdCBvYmRfc3RhdGZzICAgICAqdGVtcDsKIAlpbnQJCSAgICByYyA9IDA7Ci0JaW50CQkgICAgaTsKKwl1MzIgaTsKIAogCXJjID0gbG12X2NoZWNrX2Nvbm5lY3Qob2JkKTsKIAlpZiAocmMpCkBAIC0xNTIyLDcgKzE1MjAsNyBAQAogewogCXN0cnVjdCBvYmRfZGV2aWNlICAgKm9iZCA9IGV4cC0+ZXhwX29iZDsKIAlzdHJ1Y3QgbG12X29iZCAgICAgICpsbXYgPSAmb2JkLT51LmxtdjsKLQlpbnQJCSAgaTsKKwl1MzIgaTsKIAlpbnQJCSAgcmM7CiAKIAlyYyA9IGxtdl9jaGVja19jb25uZWN0KG9iZCk7CkBAIC0xNTQ1LDM2ICsxNTQzLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBsbXZfZmluZF9jYmRhdGEoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkLAotCQkJICAgbGRsbV9pdGVyYXRvcl90IGl0LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBvYmRfZGV2aWNlICAgKm9iZCA9IGV4cC0+ZXhwX29iZDsKLQlzdHJ1Y3QgbG12X29iZCAgICAgICpsbXYgPSAmb2JkLT51LmxtdjsKLQlpbnQJCSAgaTsKLQlpbnQJCSAgcmM7Ci0KLQlyYyA9IGxtdl9jaGVja19jb25uZWN0KG9iZCk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQlDREVCVUcoRF9JTk9ERSwgIkNCREFUQSBmb3IgIkRGSUQiXG4iLCBQRklEKGZpZCkpOwotCi0JLyoKLQkgKiBXaXRoIERORSBldmVyeSBvYmplY3QgY2FuIGhhdmUgdHdvIGxvY2tzIGluIGRpZmZlcmVudCBuYW1lc3BhY2VzOgotCSAqIGxvb2t1cCBsb2NrIGluIHNwYWNlIG9mIE1EVCBzdG9yaW5nIGRpcmVudHJ5IGFuZCB1cGRhdGUvb3BlbiBsb2NrIGluCi0JICogc3BhY2Ugb2YgTURUIHN0b3JpbmcgaW5vZGUuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IGxtdi0+ZGVzYy5sZF90Z3RfY291bnQ7IGkrKykgewotCQlpZiAoIWxtdi0+dGd0c1tpXSB8fCAhbG12LT50Z3RzW2ldLT5sdGRfZXhwKQotCQkJY29udGludWU7Ci0JCXJjID0gbWRfZmluZF9jYmRhdGEobG12LT50Z3RzW2ldLT5sdGRfZXhwLCBmaWQsIGl0LCBkYXRhKTsKLQkJaWYgKHJjKQotCQkJcmV0dXJuIHJjOwotCX0KLQotCXJldHVybiByYzsKLX0KLQogc3RhdGljIGludCBsbXZfY2xvc2Uoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCiAJCSAgICAgc3RydWN0IG1kX29wZW5fZGF0YSAqbW9kLCBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0KQogewpAQCAtMTU5NiwyNSArMTU2NCwxMTYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0cnVjdCBsbXZfdGd0X2Rlc2MKLSpsbXZfbG9jYXRlX21kcyhzdHJ1Y3QgbG12X29iZCAqbG12LCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkJc3RydWN0IGx1X2ZpZCAqZmlkKQorLyoqCisgKiBDaG9vc2luZyB0aGUgTURUIGJ5IG5hbWUgb3IgRklEIGluIEBvcF9kYXRhLgorICogRm9yIG5vbi1zdHJpcGVkIGRpcmVjdG9yeSwgaXQgd2lsbCBsb2NhdGUgTURUIGJ5IGZpZC4KKyAqIEZvciBzdHJpcGVkLWRpcmVjdG9yeSwgaXQgd2lsbCBsb2NhdGUgTURUIGJ5IG5hbWUuIEFuZCBhbHNvCisgKiBpdCB3aWxsIHJlc2V0IG9wX2ZpZDEgd2l0aCB0aGUgRklEIG9mIHRoZSBjaG9zZW4gc3RyaXBlLgorICoqLworc3RhdGljIHN0cnVjdCBsbXZfdGd0X2Rlc2MgKgorbG12X2xvY2F0ZV90YXJnZXRfZm9yX25hbWUoc3RydWN0IGxtdl9vYmQgKmxtdiwgc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSwKKwkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCBzdHJ1Y3QgbHVfZmlkICpmaWQsCisJCQkgICB1MzIgKm1kcykKIHsKKwljb25zdCBzdHJ1Y3QgbG12X29pbmZvICpvaW5mbzsKIAlzdHJ1Y3QgbG12X3RndF9kZXNjICp0Z3Q7CiAKLQl0Z3QgPSBsbXZfZmluZF90YXJnZXQobG12LCBmaWQpOwotCWlmIChJU19FUlIodGd0KSkKLQkJcmV0dXJuIHRndDsKKwlpZiAoT0JEX0ZBSUxfQ0hFQ0soT0JEX0ZBSUxfTEZTQ0tfQkFEX05BTUVfSEFTSCkpIHsKKwkJaWYgKGNmc19mYWlsX3ZhbCA+PSBsc20tPmxzbV9tZF9zdHJpcGVfY291bnQpCisJCQlyZXR1cm4gRVJSX1BUUigtRUJBREYpOworCQlvaW5mbyA9ICZsc20tPmxzbV9tZF9vaW5mb1tjZnNfZmFpbF92YWxdOworCX0gZWxzZSB7CisJCW9pbmZvID0gbHNtX25hbWVfdG9fc3RyaXBlX2luZm8obHNtLCBuYW1lLCBuYW1lbGVuKTsKKwkJaWYgKElTX0VSUihvaW5mbykpCisJCQlyZXR1cm4gRVJSX0NBU1Qob2luZm8pOworCX0KIAotCW9wX2RhdGEtPm9wX21kcyA9IHRndC0+bHRkX2lkeDsKKwlpZiAoZmlkKQorCQkqZmlkID0gb2luZm8tPmxtb19maWQ7CisJaWYgKG1kcykKKwkJKm1kcyA9IG9pbmZvLT5sbW9fbWRzOwogCisJdGd0ID0gbG12X2dldF90YXJnZXQobG12LCBvaW5mby0+bG1vX21kcywgTlVMTCk7CisKKwlDREVCVUcoRF9JTkZPLCAibG9jYXRlIG9uIG1kcyAldSAiIERGSUQgIlxuIiwgb2luZm8tPmxtb19tZHMsCisJICAgICAgIFBGSUQoJm9pbmZvLT5sbW9fZmlkKSk7CiAJcmV0dXJuIHRndDsKIH0KIAorLyoqCisgKiBMb2NhdGUgbWRzIGJ5IGZpZCBvciBuYW1lCisgKgorICogRm9yIHN0cmlwZWQgZGlyZWN0b3J5IChsc20gIT0gTlVMTCksIGl0IHdpbGwgbG9jYXRlIHRoZSBzdHJpcGUKKyAqIGJ5IG5hbWUgaGFzaCAoc2VlIGxzbV9uYW1lX3RvX3N0cmlwZV9pbmZvKCkpLiBOb3RlOiBpZiB0aGUgaGFzaF90eXBlCisgKiBpcyB1bmtub3duLCBpdCB3aWxsIHJldHVybiAtRUJBREZELCBhbmQgbG12X2ludGVudF9sb29rdXAgbWlnaHQgbmVlZAorICogd2FsayB0aHJvdWdoIGFsbCBvZiBzdHJpcGVzIHRvIGxvY2F0ZSB0aGUgZW50cnkuCisgKgorICogRm9yIG5vcm1hbCBkaXJlY290cnksIGl0IHdpbGwgbG9jYXRlIE1EUyBieSBGSUQgZGlyZWN0bHkuCisgKiBccGFyYW1baW5dIGxtdglMTVYgZGV2aWNlCisgKiBccGFyYW1baW5dIG9wX2RhdGEJY2xpZW50IE1EIHN0YWNrIHBhcmFtZXRlcnMsIG5hbWUsIG5hbWVsZW4KKyAqCQkJbWRzX251bSBldGMuCisgKiBccGFyYW1baW5dIGZpZAlvYmplY3QgRklEIHVzZWQgdG8gbG9jYXRlIE1EUy4KKyAqCisgKiByZXR2YWwJCXBvaW50ZXIgdG8gdGhlIGxtdl90Z3RfZGVzYyBpZiBzdWNjZWVkLgorICoJCQlFUlJfUFRSKGVycm5vKSBpZiBmYWlsZWQuCisgKi8KK3N0cnVjdCBsbXZfdGd0X2Rlc2MqCitsbXZfbG9jYXRlX21kcyhzdHJ1Y3QgbG12X29iZCAqbG12LCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKKwkgICAgICAgc3RydWN0IGx1X2ZpZCAqZmlkKQoreworCXN0cnVjdCBsbXZfc3RyaXBlX21kICpsc20gPSBvcF9kYXRhLT5vcF9tZWExOworCXN0cnVjdCBsbXZfdGd0X2Rlc2MgKnRndDsKKworCS8qCisJICogRHVyaW5nIGNyZWF0aW5nIFZPTEFUSUxFIGZpbGUsIGl0IHNob3VsZCBob25vciB0aGUgbWR0CisJICogaW5kZXggaWYgdGhlIGZpbGUgdW5kZXIgc3RyaXBlZCBkaXIgaXMgYmVpbmcgcmVzdG9yZWQsIHNlZQorCSAqIGN0X3Jlc3RvcmUoKS4KKwkgKi8KKwlpZiAob3BfZGF0YS0+b3BfYmlhcyAmIE1EU19DUkVBVEVfVk9MQVRJTEUgJiYKKwkgICAgKGludClvcF9kYXRhLT5vcF9tZHMgIT0gLTEgJiYgbHNtKSB7CisJCWludCBpOworCisJCXRndCA9IGxtdl9nZXRfdGFyZ2V0KGxtdiwgb3BfZGF0YS0+b3BfbWRzLCBOVUxMKTsKKwkJaWYgKElTX0VSUih0Z3QpKQorCQkJcmV0dXJuIHRndDsKKworCQkvKiByZWZpbGwgdGhlIHJpZ2h0IHBhcmVudCBmaWQgKi8KKwkJZm9yIChpID0gMDsgaSA8IGxzbS0+bHNtX21kX3N0cmlwZV9jb3VudDsgaSsrKSB7CisJCQlzdHJ1Y3QgbG12X29pbmZvICpvaW5mbzsKKworCQkJb2luZm8gPSAmbHNtLT5sc21fbWRfb2luZm9baV07CisJCQlpZiAob2luZm8tPmxtb19tZHMgPT0gb3BfZGF0YS0+b3BfbWRzKSB7CisJCQkJKmZpZCA9IG9pbmZvLT5sbW9fZmlkOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyogSG1tLCBjYW4gbm90IGZpbmQgdGhlIHN0cmlwZSBieSBtZHRfaW5kZXgob3BfbWRzKSAqLworCQlpZiAoaSA9PSBsc20tPmxzbV9tZF9zdHJpcGVfY291bnQpCisJCQl0Z3QgPSBFUlJfUFRSKC1FSU5WQUwpOworCisJCXJldHVybiB0Z3Q7CisJfQorCisJaWYgKCFsc20gfHwgIW9wX2RhdGEtPm9wX25hbWVsZW4pIHsKKwkJdGd0ID0gbG12X2ZpbmRfdGFyZ2V0KGxtdiwgZmlkKTsKKwkJaWYgKElTX0VSUih0Z3QpKQorCQkJcmV0dXJuIHRndDsKKworCQlvcF9kYXRhLT5vcF9tZHMgPSB0Z3QtPmx0ZF9pZHg7CisKKwkJcmV0dXJuIHRndDsKKwl9CisKKwlyZXR1cm4gbG12X2xvY2F0ZV90YXJnZXRfZm9yX25hbWUobG12LCBsc20sIG9wX2RhdGEtPm9wX25hbWUsCisJCQkJCSAgb3BfZGF0YS0+b3BfbmFtZWxlbiwgZmlkLAorCQkJCQkgICZvcF9kYXRhLT5vcF9tZHMpOworfQorCiBzdGF0aWMgaW50IGxtdl9jcmVhdGUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCSAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIGludCBkYXRhbGVuLCBpbnQgbW9kZSwgX191MzIgdWlkLAotCQkgICAgICBfX3UzMiBnaWQsIGNmc19jYXBfdCBjYXBfZWZmZWN0aXZlLCBfX3U2NCByZGV2LAotCQkgICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0KQorCQkgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgZGF0YWxlbiwgdW1vZGVfdCBtb2RlLAorCQkgICAgICB1aWRfdCB1aWQsIGdpZF90IGdpZCwgY2ZzX2NhcF90IGNhcF9lZmZlY3RpdmUsCisJCSAgICAgIF9fdTY0IHJkZXYsIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXVlc3QpCiB7CiAJc3RydWN0IG9iZF9kZXZpY2UgICAgICAgKm9iZCA9IGV4cC0+ZXhwX29iZDsKIAlzdHJ1Y3QgbG12X29iZAkgICpsbXYgPSAmb2JkLT51LmxtdjsKQEAgLTE2MzIsMTMgKzE2OTEsMzAgQEAKIAlpZiAoSVNfRVJSKHRndCkpCiAJCXJldHVybiBQVFJfRVJSKHRndCk7CiAKLQlyYyA9IGxtdl9maWRfYWxsb2MoZXhwLCAmb3BfZGF0YS0+b3BfZmlkMiwgb3BfZGF0YSk7CisJQ0RFQlVHKERfSU5PREUsICJDUkVBVEUgbmFtZSAnJS4qcycgb24gIkRGSUQiIC0+IG1kcyAjJXhcbiIsCisJICAgICAgIChpbnQpb3BfZGF0YS0+b3BfbmFtZWxlbiwgb3BfZGF0YS0+b3BfbmFtZSwKKwkgICAgICAgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSksIG9wX2RhdGEtPm9wX21kcyk7CisKKwlyYyA9IGxtdl9maWRfYWxsb2MoTlVMTCwgZXhwLCAmb3BfZGF0YS0+b3BfZmlkMiwgb3BfZGF0YSk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlDREVCVUcoRF9JTk9ERSwgIkNSRUFURSAnJSpzJyBvbiAiREZJRCIgLT4gbWRzICMleFxuIiwKLQkgICAgICAgb3BfZGF0YS0+b3BfbmFtZWxlbiwgb3BfZGF0YS0+b3BfbmFtZSwgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSksCi0JICAgICAgIG9wX2RhdGEtPm9wX21kcyk7CisJaWYgKGV4cF9jb25uZWN0X2ZsYWdzKGV4cCkgJiBPQkRfQ09OTkVDVF9ESVJfU1RSSVBFKSB7CisJCS8qCisJCSAqIFNlbmQgdGhlIGNyZWF0ZSByZXF1ZXN0IHRvIHRoZSBNRFQgd2hlcmUgdGhlIG9iamVjdAorCQkgKiB3aWxsIGJlIGxvY2F0ZWQKKwkJICovCisJCXRndCA9IGxtdl9maW5kX3RhcmdldChsbXYsICZvcF9kYXRhLT5vcF9maWQyKTsKKwkJaWYgKElTX0VSUih0Z3QpKQorCQkJcmV0dXJuIFBUUl9FUlIodGd0KTsKKworCQlvcF9kYXRhLT5vcF9tZHMgPSB0Z3QtPmx0ZF9pZHg7CisJfSBlbHNlIHsKKwkJQ0RFQlVHKERfQ09ORklHLCAiU2VydmVyIGRvZXNuJ3Qgc3VwcG9ydCBzdHJpcGVkIGRpcnNcbiIpOworCX0KKworCUNERUJVRyhEX0lOT0RFLCAiQ1JFQVRFIG9iaiAiREZJRCIgLT4gbWRzICMleFxuIiwKKwkgICAgICAgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSksIG9wX2RhdGEtPm9wX21kcyk7CiAKIAlvcF9kYXRhLT5vcF9mbGFncyB8PSBNRl9NRENfQ0FOQ0VMX0ZJRDE7CiAJcmMgPSBtZF9jcmVhdGUodGd0LT5sdGRfZXhwLCBvcF9kYXRhLCBkYXRhLCBkYXRhbGVuLCBtb2RlLCB1aWQsIGdpZCwKQEAgLTE2NzQsNzAgKzE3NTAsMTAgQEAKIH0KIAogc3RhdGljIGludAotbG12X2VucXVldWVfcmVtb3RlKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsZGxtX2VucXVldWVfaW5mbyAqZWluZm8sCi0JCSAgIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCSAgIHN0cnVjdCBsdXN0cmVfaGFuZGxlICpsb2NraCwgdm9pZCAqbG1tLCBpbnQgbG1tc2l6ZSwKLQkJICAgX191NjQgZXh0cmFfbG9ja19mbGFncykKLXsKLQlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgICAgICAqcmVxID0gaXQtPml0X3JlcXVlc3Q7Ci0Jc3RydWN0IG9iZF9kZXZpY2UJICAqb2JkID0gZXhwLT5leHBfb2JkOwotCXN0cnVjdCBsbXZfb2JkCSAgICAgKmxtdiA9ICZvYmQtPnUubG12OwotCXN0cnVjdCBsdXN0cmVfaGFuZGxlCXBsb2NrOwotCXN0cnVjdCBsbXZfdGd0X2Rlc2MJKnRndDsKLQlzdHJ1Y3QgbWRfb3BfZGF0YQkgICpyZGF0YTsKLQlzdHJ1Y3QgbHVfZmlkCSAgICAgICBmaWQxOwotCXN0cnVjdCBtZHRfYm9keQkgICAgKmJvZHk7Ci0JaW50CQkJIHJjID0gMDsKLQlpbnQJCQkgcG1vZGU7Ci0KLQlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX01EVF9CT0RZKTsKLQotCWlmICghKGJvZHktPnZhbGlkICYgT0JEX01EX01EUykpCi0JCXJldHVybiAwOwotCi0JQ0RFQlVHKERfSU5PREUsICJSRU1PVEVfRU5RVUVVRSAnJXMnIG9uICJERklEIiAtPiAiREZJRCJcbiIsCi0JICAgICAgIExMX0lUMlNUUihpdCksIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDEpLCBQRklEKCZib2R5LT5maWQxKSk7Ci0KLQkvKgotCSAqIFdlIGdvdCBMT09LVVAgbG9jaywgYnV0IHdlIHJlYWxseSBuZWVkIGF0dHJzLgotCSAqLwotCXBtb2RlID0gaXQtPml0X2xvY2tfbW9kZTsKLQlMQVNTRVJUKHBtb2RlICE9IDApOwotCW1lbWNweSgmcGxvY2ssIGxvY2toLCBzaXplb2YocGxvY2spKTsKLQlpdC0+aXRfbG9ja19tb2RlID0gMDsKLQlpdC0+aXRfcmVxdWVzdCA9IE5VTEw7Ci0JZmlkMSA9IGJvZHktPmZpZDE7Ci0KLQlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7Ci0KLQl0Z3QgPSBsbXZfZmluZF90YXJnZXQobG12LCAmZmlkMSk7Ci0JaWYgKElTX0VSUih0Z3QpKSB7Ci0JCXJjID0gUFRSX0VSUih0Z3QpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpyZGF0YSksIEdGUF9OT0ZTKTsKLQlpZiAoIXJkYXRhKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmRhdGEtPm9wX2ZpZDEgPSBmaWQxOwotCXJkYXRhLT5vcF9iaWFzID0gTURTX0NST1NTX1JFRjsKLQotCXJjID0gbWRfZW5xdWV1ZSh0Z3QtPmx0ZF9leHAsIGVpbmZvLCBpdCwgcmRhdGEsIGxvY2toLAotCQkJbG1tLCBsbW1zaXplLCBOVUxMLCBleHRyYV9sb2NrX2ZsYWdzKTsKLQlrZnJlZShyZGF0YSk7Ci1vdXQ6Ci0JbGRsbV9sb2NrX2RlY3JlZigmcGxvY2ssIHBtb2RlKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQKIGxtdl9lbnF1ZXVlKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsZGxtX2VucXVldWVfaW5mbyAqZWluZm8sCisJICAgIGNvbnN0IGxkbG1fcG9saWN5X2RhdGFfdCAqcG9saWN5LAogCSAgICBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCSAgICBzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAqbG9ja2gsIHZvaWQgKmxtbSwgaW50IGxtbXNpemUsCi0JICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcSwgX191NjQgZXh0cmFfbG9ja19mbGFncykKKwkgICAgc3RydWN0IGx1c3RyZV9oYW5kbGUgKmxvY2toLCBfX3U2NCBleHRyYV9sb2NrX2ZsYWdzKQogewogCXN0cnVjdCBvYmRfZGV2aWNlCSpvYmQgPSBleHAtPmV4cF9vYmQ7CiAJc3RydWN0IGxtdl9vYmQJICAgKmxtdiA9ICZvYmQtPnUubG12OwpAQCAtMTc1NSwyMiArMTc3MSwxOCBAQAogCWlmIChJU19FUlIodGd0KSkKIAkJcmV0dXJuIFBUUl9FUlIodGd0KTsKIAotCUNERUJVRyhEX0lOT0RFLCAiRU5RVUVVRSAnJXMnIG9uICJERklEIiAtPiBtZHMgIyVkXG4iLAorCUNERUJVRyhEX0lOT0RFLCAiRU5RVUVVRSAnJXMnIG9uICIgREZJRCAiIC0+IG1kcyAjJXVcbiIsCiAJICAgICAgIExMX0lUMlNUUihpdCksIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDEpLCB0Z3QtPmx0ZF9pZHgpOwogCi0JcmMgPSBtZF9lbnF1ZXVlKHRndC0+bHRkX2V4cCwgZWluZm8sIGl0LCBvcF9kYXRhLCBsb2NraCwKLQkJCWxtbSwgbG1tc2l6ZSwgcmVxLCBleHRyYV9sb2NrX2ZsYWdzKTsKKwlyYyA9IG1kX2VucXVldWUodGd0LT5sdGRfZXhwLCBlaW5mbywgcG9saWN5LCBpdCwgb3BfZGF0YSwgbG9ja2gsCisJCQlleHRyYV9sb2NrX2ZsYWdzKTsKIAotCWlmIChyYyA9PSAwICYmIGl0ICYmIGl0LT5pdF9vcCA9PSBJVF9PUEVOKSB7Ci0JCXJjID0gbG12X2VucXVldWVfcmVtb3RlKGV4cCwgZWluZm8sIGl0LCBvcF9kYXRhLCBsb2NraCwKLQkJCQkJbG1tLCBsbW1zaXplLCBleHRyYV9sb2NrX2ZsYWdzKTsKLQl9CiAJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50CiBsbXZfZ2V0YXR0cl9uYW1lKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQkgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCkKKwkJIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnByZXEpCiB7CiAJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICAgKnJlcSA9IE5VTEw7CiAJc3RydWN0IG9iZF9kZXZpY2UgICAgICAgKm9iZCA9IGV4cC0+ZXhwX29iZDsKQEAgLTE3ODcsMjYgKzE3OTksMjUgQEAKIAlpZiAoSVNfRVJSKHRndCkpCiAJCXJldHVybiBQVFJfRVJSKHRndCk7CiAKLQlDREVCVUcoRF9JTk9ERSwgIkdFVEFUVFJfTkFNRSBmb3IgJSpzIG9uICJERklEIiAtPiBtZHMgIyVkXG4iLAotCSAgICAgICBvcF9kYXRhLT5vcF9uYW1lbGVuLCBvcF9kYXRhLT5vcF9uYW1lLCBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwKLQkgICAgICAgdGd0LT5sdGRfaWR4KTsKKwlDREVCVUcoRF9JTk9ERSwgIkdFVEFUVFJfTkFNRSBmb3IgJSpzIG9uICIgREZJRCAiIC0+IG1kcyAjJXVcbiIsCisJICAgICAgIChpbnQpb3BfZGF0YS0+b3BfbmFtZWxlbiwgb3BfZGF0YS0+b3BfbmFtZSwKKwkgICAgICAgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSksIHRndC0+bHRkX2lkeCk7CiAKLQlyYyA9IG1kX2dldGF0dHJfbmFtZSh0Z3QtPmx0ZF9leHAsIG9wX2RhdGEsIHJlcXVlc3QpOworCXJjID0gbWRfZ2V0YXR0cl9uYW1lKHRndC0+bHRkX2V4cCwgb3BfZGF0YSwgcHJlcSk7CiAJaWYgKHJjICE9IDApCiAJCXJldHVybiByYzsKIAotCWJvZHkgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfZ2V0KCYoKnJlcXVlc3QpLT5ycV9waWxsLAotCQkJCSAgICAgICZSTUZfTURUX0JPRFkpOwotCi0JaWYgKGJvZHktPnZhbGlkICYgT0JEX01EX01EUykgewotCQlzdHJ1Y3QgbHVfZmlkIHJpZCA9IGJvZHktPmZpZDE7CisJYm9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJigqcHJlcSktPnJxX3BpbGwsICZSTUZfTURUX0JPRFkpOworCWlmIChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfTURTKSB7CisJCXN0cnVjdCBsdV9maWQgcmlkID0gYm9keS0+bWJvX2ZpZDE7CiAKIAkJQ0RFQlVHKERfSU5PREUsICJSZXF1ZXN0IGF0dHJzIGZvciAiREZJRCJcbiIsCiAJCSAgICAgICBQRklEKCZyaWQpKTsKIAogCQl0Z3QgPSBsbXZfZmluZF90YXJnZXQobG12LCAmcmlkKTsKIAkJaWYgKElTX0VSUih0Z3QpKSB7Ci0JCQlwdGxycGNfcmVxX2ZpbmlzaGVkKCpyZXF1ZXN0KTsKKwkJCXB0bHJwY19yZXFfZmluaXNoZWQoKnByZXEpOworCQkJKnByZXEgPSBOVUxMOwogCQkJcmV0dXJuIFBUUl9FUlIodGd0KTsKIAkJfQogCkBAIC0xODE1LDggKzE4MjYsOCBAQAogCQlvcF9kYXRhLT5vcF9uYW1lbGVuID0gMDsKIAkJb3BfZGF0YS0+b3BfbmFtZSA9IE5VTEw7CiAJCXJjID0gbWRfZ2V0YXR0cl9uYW1lKHRndC0+bHRkX2V4cCwgb3BfZGF0YSwgJnJlcSk7Ci0JCXB0bHJwY19yZXFfZmluaXNoZWQoKnJlcXVlc3QpOwotCQkqcmVxdWVzdCA9IHJlcTsKKwkJcHRscnBjX3JlcV9maW5pc2hlZCgqcHJlcSk7CisJCSpwcmVxID0gcmVxOwogCX0KIAogCXJldHVybiByYzsKQEAgLTE4MjksMjMgKzE4NDAsMjQgQEAKIAkgZmwgPT0gTUZfTURDX0NBTkNFTF9GSUQ0ID8gJm9wX2RhdGEtPm9wX2ZpZDQgOiBcCiAJIE5VTEwpCiAKLXN0YXRpYyBpbnQgbG12X2Vhcmx5X2NhbmNlbChzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkJCSAgICBpbnQgb3BfdGd0LCBlbnVtIGxkbG1fbW9kZSBtb2RlLCBpbnQgYml0cywKLQkJCSAgICBpbnQgZmxhZykKK3N0YXRpYyBpbnQgbG12X2Vhcmx5X2NhbmNlbChzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbG12X3RndF9kZXNjICp0Z3QsCisJCQkgICAgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsIGludCBvcF90Z3QsCisJCQkgICAgZW51bSBsZGxtX21vZGUgbW9kZSwgaW50IGJpdHMsIGludCBmbGFnKQogewogCXN0cnVjdCBsdV9maWQJICAqZmlkID0gbWRfb3BfZGF0YV9maWQob3BfZGF0YSwgZmxhZyk7CiAJc3RydWN0IG9iZF9kZXZpY2UgICAgICAqb2JkID0gZXhwLT5leHBfb2JkOwogCXN0cnVjdCBsbXZfb2JkCSAqbG12ID0gJm9iZC0+dS5sbXY7Ci0Jc3RydWN0IGxtdl90Z3RfZGVzYyAgICAqdGd0OwogCWxkbG1fcG9saWN5X2RhdGFfdCAgICAgIHBvbGljeSA9IHsgezB9IH07CiAJaW50CQkgICAgIHJjID0gMDsKIAogCWlmICghZmlkX2lzX3NhbmUoZmlkKSkKIAkJcmV0dXJuIDA7CiAKLQl0Z3QgPSBsbXZfZmluZF90YXJnZXQobG12LCBmaWQpOwotCWlmIChJU19FUlIodGd0KSkKLQkJcmV0dXJuIFBUUl9FUlIodGd0KTsKKwlpZiAoIXRndCkgeworCQl0Z3QgPSBsbXZfZmluZF90YXJnZXQobG12LCBmaWQpOworCQlpZiAoSVNfRVJSKHRndCkpCisJCQlyZXR1cm4gUFRSX0VSUih0Z3QpOworCX0KIAogCWlmICh0Z3QtPmx0ZF9pZHggIT0gb3BfdGd0KSB7CiAJCUNERUJVRyhEX0lOT0RFLCAiRUFSTFlfQ0FOQ0VMIG9uICJERklEIlxuIiwgUEZJRChmaWQpKTsKQEAgLTE4ODIsMTIgKzE4OTQsMjQgQEAKIAlMQVNTRVJUKG9wX2RhdGEtPm9wX25hbWVsZW4gIT0gMCk7CiAKIAlDREVCVUcoRF9JTk9ERSwgIkxJTksgIkRGSUQiOiUqcyB0byAiREZJRCJcbiIsCi0JICAgICAgIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDIpLCBvcF9kYXRhLT5vcF9uYW1lbGVuLAorCSAgICAgICBQRklEKCZvcF9kYXRhLT5vcF9maWQyKSwgKGludClvcF9kYXRhLT5vcF9uYW1lbGVuLAogCSAgICAgICBvcF9kYXRhLT5vcF9uYW1lLCBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSk7CiAKIAlvcF9kYXRhLT5vcF9mc3VpZCA9IGZyb21fa3VpZCgmaW5pdF91c2VyX25zLCBjdXJyZW50X2ZzdWlkKCkpOwogCW9wX2RhdGEtPm9wX2ZzZ2lkID0gZnJvbV9rZ2lkKCZpbml0X3VzZXJfbnMsIGN1cnJlbnRfZnNnaWQoKSk7CiAJb3BfZGF0YS0+b3BfY2FwID0gY2ZzX2N1cnByb2NfY2FwX3BhY2soKTsKKwlpZiAob3BfZGF0YS0+b3BfbWVhMikgeworCQlzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtID0gb3BfZGF0YS0+b3BfbWVhMjsKKwkJY29uc3Qgc3RydWN0IGxtdl9vaW5mbyAqb2luZm87CisKKwkJb2luZm8gPSBsc21fbmFtZV90b19zdHJpcGVfaW5mbyhsc20sIG9wX2RhdGEtPm9wX25hbWUsCisJCQkJCQlvcF9kYXRhLT5vcF9uYW1lbGVuKTsKKwkJaWYgKElTX0VSUihvaW5mbykpCisJCQlyZXR1cm4gUFRSX0VSUihvaW5mbyk7CisKKwkJb3BfZGF0YS0+b3BfZmlkMiA9IG9pbmZvLT5sbW9fZmlkOworCX0KKwogCXRndCA9IGxtdl9sb2NhdGVfbWRzKGxtdiwgb3BfZGF0YSwgJm9wX2RhdGEtPm9wX2ZpZDIpOwogCWlmIChJU19FUlIodGd0KSkKIAkJcmV0dXJuIFBUUl9FUlIodGd0KTsKQEAgLTE4OTYsNyArMTkyMCw3IEBACiAJICogQ2FuY2VsIFVQREFURSBsb2NrIG9uIGNoaWxkIChmaWQxKS4KIAkgKi8KIAlvcF9kYXRhLT5vcF9mbGFncyB8PSBNRl9NRENfQ0FOQ0VMX0ZJRDI7Ci0JcmMgPSBsbXZfZWFybHlfY2FuY2VsKGV4cCwgb3BfZGF0YSwgdGd0LT5sdGRfaWR4LCBMQ0tfRVgsCisJcmMgPSBsbXZfZWFybHlfY2FuY2VsKGV4cCwgTlVMTCwgb3BfZGF0YSwgdGd0LT5sdGRfaWR4LCBMQ0tfRVgsCiAJCQkgICAgICBNRFNfSU5PREVMT0NLX1VQREFURSwgTUZfTURDX0NBTkNFTF9GSUQxKTsKIAlpZiAocmMgIT0gMCkKIAkJcmV0dXJuIHJjOwpAQCAtMTkwNywyMCArMTkzMSwyMiBAQAogfQogCiBzdGF0aWMgaW50IGxtdl9yZW5hbWUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCSAgICAgIGNvbnN0IGNoYXIgKm9sZCwgaW50IG9sZGxlbiwgY29uc3QgY2hhciAqbmV3LCBpbnQgbmV3bGVuLAorCQkgICAgICBjb25zdCBjaGFyICpvbGQsIHNpemVfdCBvbGRsZW4sCisJCSAgICAgIGNvbnN0IGNoYXIgKm5ldywgc2l6ZV90IG5ld2xlbiwKIAkJICAgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCkKIHsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAgICAgICAqb2JkID0gZXhwLT5leHBfb2JkOwogCXN0cnVjdCBsbXZfb2JkCSAgKmxtdiA9ICZvYmQtPnUubG12OwogCXN0cnVjdCBsbXZfdGd0X2Rlc2MgICAgICpzcmNfdGd0OwotCXN0cnVjdCBsbXZfdGd0X2Rlc2MgICAgICp0Z3RfdGd0OwogCWludAkJCXJjOwogCiAJTEFTU0VSVChvbGRsZW4gIT0gMCk7CiAKLQlDREVCVUcoRF9JTk9ERSwgIlJFTkFNRSAlKnMgaW4gIkRGSUQiIHRvICUqcyBpbiAiREZJRCJcbiIsCi0JICAgICAgIG9sZGxlbiwgb2xkLCBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwKLQkgICAgICAgbmV3bGVuLCBuZXcsIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDIpKTsKKwlDREVCVUcoRF9JTk9ERSwgIlJFTkFNRSAlLipzIGluICJERklEIjolZCB0byAlLipzIGluICJERklEIjolZFxuIiwKKwkgICAgICAgKGludClvbGRsZW4sIG9sZCwgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSksCisJICAgICAgIG9wX2RhdGEtPm9wX21lYTEgPyBvcF9kYXRhLT5vcF9tZWExLT5sc21fbWRfc3RyaXBlX2NvdW50IDogMCwKKwkgICAgICAgKGludCluZXdsZW4sIG5ldywgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMiksCisJICAgICAgIG9wX2RhdGEtPm9wX21lYTIgPyBvcF9kYXRhLT5vcF9tZWEyLT5sc21fbWRfc3RyaXBlX2NvdW50IDogMCk7CiAKIAlyYyA9IGxtdl9jaGVja19jb25uZWN0KG9iZCk7CiAJaWYgKHJjKQpAQCAtMTkyOSwxMyArMTk1NSw2MCBAQAogCW9wX2RhdGEtPm9wX2ZzdWlkID0gZnJvbV9rdWlkKCZpbml0X3VzZXJfbnMsIGN1cnJlbnRfZnN1aWQoKSk7CiAJb3BfZGF0YS0+b3BfZnNnaWQgPSBmcm9tX2tnaWQoJmluaXRfdXNlcl9ucywgY3VycmVudF9mc2dpZCgpKTsKIAlvcF9kYXRhLT5vcF9jYXAgPSBjZnNfY3VycHJvY19jYXBfcGFjaygpOwotCXNyY190Z3QgPSBsbXZfbG9jYXRlX21kcyhsbXYsIG9wX2RhdGEsICZvcF9kYXRhLT5vcF9maWQxKTsKKworCWlmIChvcF9kYXRhLT5vcF9jbGlfZmxhZ3MgJiBDTElfTUlHUkFURSkgeworCQlMQVNTRVJURihmaWRfaXNfc2FuZSgmb3BfZGF0YS0+b3BfZmlkMyksICJpbnZhbGlkIEZJRCAiREZJRCJcbiIsCisJCQkgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMykpOworCisJCWlmIChvcF9kYXRhLT5vcF9tZWExKSB7CisJCQlzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtID0gb3BfZGF0YS0+b3BfbWVhMTsKKwkJCXN0cnVjdCBsbXZfdGd0X2Rlc2MgKnRtcDsKKworCQkJLyogRml4IHRoZSBwYXJlbnQgZmlkIGZvciBzdHJpcGVkIGRpciAqLworCQkJdG1wID0gbG12X2xvY2F0ZV90YXJnZXRfZm9yX25hbWUobG12LCBsc20sIG9sZCwKKwkJCQkJCQkgb2xkbGVuLAorCQkJCQkJCSAmb3BfZGF0YS0+b3BfZmlkMSwKKwkJCQkJCQkgTlVMTCk7CisJCQlpZiAoSVNfRVJSKHRtcCkpCisJCQkJcmV0dXJuIFBUUl9FUlIodG1wKTsKKwkJfQorCisJCXJjID0gbG12X2ZpZF9hbGxvYyhOVUxMLCBleHAsICZvcF9kYXRhLT5vcF9maWQyLCBvcF9kYXRhKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCQlzcmNfdGd0ID0gbG12X2ZpbmRfdGFyZ2V0KGxtdiwgJm9wX2RhdGEtPm9wX2ZpZDMpOworCX0gZWxzZSB7CisJCWlmIChvcF9kYXRhLT5vcF9tZWExKSB7CisJCQlzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtID0gb3BfZGF0YS0+b3BfbWVhMTsKKworCQkJc3JjX3RndCA9IGxtdl9sb2NhdGVfdGFyZ2V0X2Zvcl9uYW1lKGxtdiwgbHNtLCBvbGQsCisJCQkJCQkJICAgICBvbGRsZW4sCisJCQkJCQkJICAgICAmb3BfZGF0YS0+b3BfZmlkMSwKKwkJCQkJCQkgICAgICZvcF9kYXRhLT5vcF9tZHMpOworCQkJaWYgKElTX0VSUihzcmNfdGd0KSkKKwkJCQlyZXR1cm4gUFRSX0VSUihzcmNfdGd0KTsKKwkJfSBlbHNlIHsKKwkJCXNyY190Z3QgPSBsbXZfZmluZF90YXJnZXQobG12LCAmb3BfZGF0YS0+b3BfZmlkMSk7CisJCQlpZiAoSVNfRVJSKHNyY190Z3QpKQorCQkJCXJldHVybiBQVFJfRVJSKHNyY190Z3QpOworCisJCQlvcF9kYXRhLT5vcF9tZHMgPSBzcmNfdGd0LT5sdGRfaWR4OworCQl9CisKKwkJaWYgKG9wX2RhdGEtPm9wX21lYTIpIHsKKwkJCXN0cnVjdCBsbXZfc3RyaXBlX21kICpsc20gPSBvcF9kYXRhLT5vcF9tZWEyOworCQkJY29uc3Qgc3RydWN0IGxtdl9vaW5mbyAqb2luZm87CisKKwkJCW9pbmZvID0gbHNtX25hbWVfdG9fc3RyaXBlX2luZm8obHNtLCBuZXcsIG5ld2xlbik7CisJCQlpZiAoSVNfRVJSKG9pbmZvKSkKKwkJCQlyZXR1cm4gUFRSX0VSUihvaW5mbyk7CisKKwkJCW9wX2RhdGEtPm9wX2ZpZDIgPSBvaW5mby0+bG1vX2ZpZDsKKwkJfQorCX0KIAlpZiAoSVNfRVJSKHNyY190Z3QpKQogCQlyZXR1cm4gUFRSX0VSUihzcmNfdGd0KTsKIAotCXRndF90Z3QgPSBsbXZfbG9jYXRlX21kcyhsbXYsIG9wX2RhdGEsICZvcF9kYXRhLT5vcF9maWQyKTsKLQlpZiAoSVNfRVJSKHRndF90Z3QpKQotCQlyZXR1cm4gUFRSX0VSUih0Z3RfdGd0KTsKIAkvKgogCSAqIExPT0tVUCBsb2NrIG9uIHNyYyBjaGlsZCAoZmlkMykgc2hvdWxkIGFsc28gYmUgY2FuY2VsbGVkIGZvcgogCSAqIHNyY190Z3QgaW4gbWRjX3JlbmFtZS4KQEAgLTE5NDYsMzUgKzIwMTksNTMgQEAKIAkgKiBDYW5jZWwgVVBEQVRFIGxvY2tzIG9uIHRndCBwYXJlbnQgKGZpZDIpLCB0Z3RfdGd0IGlzIGl0cwogCSAqIG93biB0YXJnZXQuCiAJICovCi0JcmMgPSBsbXZfZWFybHlfY2FuY2VsKGV4cCwgb3BfZGF0YSwgc3JjX3RndC0+bHRkX2lkeCwKKwlyYyA9IGxtdl9lYXJseV9jYW5jZWwoZXhwLCBOVUxMLCBvcF9kYXRhLCBzcmNfdGd0LT5sdGRfaWR4LAogCQkJICAgICAgTENLX0VYLCBNRFNfSU5PREVMT0NLX1VQREFURSwKIAkJCSAgICAgIE1GX01EQ19DQU5DRUxfRklEMik7Ci0KKwlpZiAocmMpCisJCXJldHVybiByYzsKIAkvKgotCSAqIENhbmNlbCBMT09LVVAgbG9ja3Mgb24gdGd0IGNoaWxkIChmaWQ0KSBmb3IgcGFyZW50IHRndF90Z3QuCisJICogQ2FuY2VsIExPT0tVUCBsb2NrcyBvbiBzb3VyY2UgY2hpbGQgKGZpZDMpIGZvciBwYXJlbnQgdGd0X3RndC4KIAkgKi8KLQlpZiAocmMgPT0gMCkgewotCQlyYyA9IGxtdl9lYXJseV9jYW5jZWwoZXhwLCBvcF9kYXRhLCBzcmNfdGd0LT5sdGRfaWR4LAorCWlmIChmaWRfaXNfc2FuZSgmb3BfZGF0YS0+b3BfZmlkMykpIHsKKwkJc3RydWN0IGxtdl90Z3RfZGVzYyAqdGd0OworCisJCXRndCA9IGxtdl9maW5kX3RhcmdldChsbXYsICZvcF9kYXRhLT5vcF9maWQxKTsKKwkJaWYgKElTX0VSUih0Z3QpKQorCQkJcmV0dXJuIFBUUl9FUlIodGd0KTsKKworCQkvKiBDYW5jZWwgTE9PS1VQIGxvY2sgb24gaXRzIHBhcmVudCAqLworCQlyYyA9IGxtdl9lYXJseV9jYW5jZWwoZXhwLCB0Z3QsIG9wX2RhdGEsIHNyY190Z3QtPmx0ZF9pZHgsCiAJCQkJICAgICAgTENLX0VYLCBNRFNfSU5PREVMT0NLX0xPT0tVUCwKLQkJCQkgICAgICBNRl9NRENfQ0FOQ0VMX0ZJRDQpOworCQkJCSAgICAgIE1GX01EQ19DQU5DRUxfRklEMyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQlyYyA9IGxtdl9lYXJseV9jYW5jZWwoZXhwLCBOVUxMLCBvcF9kYXRhLCBzcmNfdGd0LT5sdGRfaWR4LAorCQkJCSAgICAgIExDS19FWCwgTURTX0lOT0RFTE9DS19GVUxMLAorCQkJCSAgICAgIE1GX01EQ19DQU5DRUxfRklEMyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKIAl9CiAKIAkvKgogCSAqIENhbmNlbCBhbGwgdGhlIGxvY2tzIG9uIHRndCBjaGlsZCAoZmlkNCkuCiAJICovCi0JaWYgKHJjID09IDApCi0JCXJjID0gbG12X2Vhcmx5X2NhbmNlbChleHAsIG9wX2RhdGEsIHNyY190Z3QtPmx0ZF9pZHgsCisJaWYgKGZpZF9pc19zYW5lKCZvcF9kYXRhLT5vcF9maWQ0KSkKKwkJcmMgPSBsbXZfZWFybHlfY2FuY2VsKGV4cCwgTlVMTCwgb3BfZGF0YSwgc3JjX3RndC0+bHRkX2lkeCwKIAkJCQkgICAgICBMQ0tfRVgsIE1EU19JTk9ERUxPQ0tfRlVMTCwKIAkJCQkgICAgICBNRl9NRENfQ0FOQ0VMX0ZJRDQpOwogCi0JaWYgKHJjID09IDApCi0JCXJjID0gbWRfcmVuYW1lKHNyY190Z3QtPmx0ZF9leHAsIG9wX2RhdGEsIG9sZCwgb2xkbGVuLAotCQkJICAgICAgIG5ldywgbmV3bGVuLCByZXF1ZXN0KTsKKwlDREVCVUcoRF9JTk9ERSwgREZJRCI6bSVkIHRvICJERklEIlxuIiwgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSksCisJICAgICAgIG9wX2RhdGEtPm9wX21kcywgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMikpOworCisJcmMgPSBtZF9yZW5hbWUoc3JjX3RndC0+bHRkX2V4cCwgb3BfZGF0YSwgb2xkLCBvbGRsZW4sCisJCSAgICAgICBuZXcsIG5ld2xlbiwgcmVxdWVzdCk7CiAJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50IGxtdl9zZXRhdHRyKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQkgICAgICAgdm9pZCAqZWEsIGludCBlYWxlbiwgdm9pZCAqZWEyLCBpbnQgZWEybGVuLAorCQkgICAgICAgdm9pZCAqZWEsIHNpemVfdCBlYWxlbiwgdm9pZCAqZWEyLCBzaXplX3QgZWEybGVuLAogCQkgICAgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCwKIAkJICAgICAgIHN0cnVjdCBtZF9vcGVuX2RhdGEgKiptb2QpCiB7CkBAIC0yMDIxLDE2OSArMjExMiw0MTkgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLS8qCi0gKiBBZGp1c3QgYSBzZXQgb2YgcGFnZXMsIGVhY2ggcGFnZSBjb250YWluaW5nIGFuIGFycmF5IG9mIGx1X2RpcnBhZ2VzLAotICogc28gdGhhdCBlYWNoIHBhZ2UgY2FuIGJlIHVzZWQgYXMgYSBzaW5nbGUgbG9naWNhbCBsdV9kaXJwYWdlLgorLyoqCisgKiBHZXQgY3VycmVudCBtaW5pbXVtIGVudHJ5IGZyb20gc3RyaXBlZCBkaXJlY3RvcnkKICAqCi0gKiBBIGx1X2RpcnBhZ2UgaXMgbGFpZCBvdXQgYXMgZm9sbG93cywgd2hlcmUgcyA9IGxkcF9oYXNoX3N0YXJ0LAotICogZSA9IGxkcF9oYXNoX2VuZCwgZiA9IGxkcF9mbGFncywgcCA9IHBhZGRpbmcsIGFuZCBlYWNoICJlbnQiIGlzIGEKLSAqIHN0cnVjdCBsdV9kaXJlbnQuICBJdCBoYXMgc2l6ZSB1cCB0byBMVV9QQUdFX1NJWkUuIFRoZSBsZHBfaGFzaF9lbmQKLSAqIHZhbHVlIGlzIHVzZWQgYXMgYSBjb29raWUgdG8gcmVxdWVzdCB0aGUgbmV4dCBsdV9kaXJwYWdlIGluIGEKLSAqIGRpcmVjdG9yeSBsaXN0aW5nIHRoYXQgc3BhbnMgbXVsdGlwbGUgcGFnZXMgKHR3byBpbiB0aGlzIGV4YW1wbGUpOgotICogICBfX19fX19fXwotICogIHwJfAotICogLnwtLS0tLS0tLXYtLS0tLS0tICAgLS0tLS0uCi0gKiB8c3xlfGZ8cHxlbnR8ZW50fCAuLi4gfGVudHwKLSAqICctLXwtLS0tLS0tLS0tLS0tLSAgIC0tLS0tJyAgIEVhY2ggQ0ZTX1BBR0UgY29udGFpbnMgYSBzaW5nbGUKLSAqICAgICctLS0tLS0uCQkgICBsdV9kaXJwYWdlLgotICogLi0tLS0tLS0tLXYtLS0tLS0tICAgLS0tLS0uCi0gKiB8c3xlfGZ8cHxlbnR8IDAgfCAuLi4gfCAwIHwKLSAqICctLS0tLS0tLS0tLS0tLS0tLSAgIC0tLS0tJworICogVGhpcyBmdW5jdGlvbiB3aWxsIHNlYXJjaCB0aGUgZGlyIGVudHJ5LCB3aG9zZSBoYXNoIHZhbHVlIGlzIHRoZQorICogY2xvc2VzdCg+PSkgdG8gQGhhc2hfb2Zmc2V0LCBmcm9tIGFsbCBvZiBzdWItc3RyaXBlcywgYW5kIGl0IGlzCisgKiBvbmx5IGJlaW5nIGNhbGxlZCBmb3Igc3RyaXBlZCBkaXJlY3RvcnkuCiAgKgotICogSG93ZXZlciwgb24gaG9zdHMgd2hlcmUgdGhlIG5hdGl2ZSBWTSBwYWdlIHNpemUgKFBBR0VfU0laRSkgaXMKLSAqIGxhcmdlciB0aGFuIExVX1BBR0VfU0laRSwgYSBzaW5nbGUgaG9zdCBwYWdlIG1heSBjb250YWluIG11bHRpcGxlCi0gKiBsdV9kaXJwYWdlcy4gQWZ0ZXIgcmVhZGluZyB0aGUgbHVfZGlycGFnZXMgZnJvbSB0aGUgTURTLCB0aGUKLSAqIGxkcF9oYXNoX2VuZCBvZiB0aGUgZmlyc3QgbHVfZGlycGFnZSByZWZlcnMgdG8gdGhlIG9uZSBpbW1lZGlhdGVseQotICogYWZ0ZXIgaXQgaW4gdGhlIHNhbWUgQ0ZTX1BBR0UgKGFycm93cyBzaW1wbGlmaWVkIGZvciBicmV2aXR5LCBidXQKLSAqIGluIGdlbmVyYWwgZTA9PXMxLCBlMT09czIsIGV0Yy4pOgorICogXHBhcmFtW2luXSBleHAJCWV4cG9ydCBvZiBMTVYKKyAqIFxwYXJhbVtpbl0gb3BfZGF0YQkJcGFyYW1ldGVycyB0cmFuc2ZlcnJlZCBiZXdlZW4gY2xpZW50IE1EIHN0YWNrCisgKgkJCQlzdHJpcGVfaW5mb3JtYXRpb24gd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGlzCisgKgkJCQlwYXJhbWV0ZXIKKyAqIFxwYXJhbVtpbl0gY2Jfb3AJCWxkbG0gY2FsbGJhY2sgYmVpbmcgdXNlZCBpbiBlbnF1ZXVlIGluCisgKgkJCQltZGNfcmVhZF9wYWdlCisgKiBccGFyYW1baW5dIGhhc2hfb2Zmc2V0CXRoZSBoYXNoIHZhbHVlLCB3aGljaCBpcyB1c2VkIHRvIGxvY2F0ZQorICoJCQkJbWludW0oY2xvc2V0KSBkaXIgZW50cnkKKyAqIFxwYXJhbVtpbnxvdXRdIHN0cmlwZV9vZmZzZXQJdGhlIGNhbGxlciB1c2UgdGhpcyB0byBpbmRpY2F0ZSB0aGUgc3RyaXBlCisgKgkJCQlpbmRleCBvZiBsYXN0IGVudHJ5LCBzbyB0byBhdm9pZCBoYXNoIGNvbmZsaWN0CisgKgkJCQliZXR3ZWVuIHN0cmlwZXMuIEl0IHdpbGwgYWxzbyBiZSB1c2VkIHRvCisgKgkJCQlyZXR1cm4gdGhlIHN0cmlwZSBpbmRleCBvZiBjdXJyZW50IGRpciBlbnRyeS4KKyAqIFxwYXJhbVtpbnxvdXRdIGVudHAJCXRoZSBtaW51bSBlbnRyeSBhbmQgaXQgYWxzbyBpcyBiZWluZyB1c2VkCisgKgkJCQl0byBpbnB1dCB0aGUgbGFzdCBkaXIgZW50cnkgdG8gcmVzb2x2ZSB0aGUKKyAqCQkJCWhhc2ggY29uZmxpY3QKICAqCi0gKiAuLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAtLS0tLS4KLSAqIHxzMHxlMHxmMHxwfGVudHxlbnR8IC4uLiB8ZW50fAotICogfC0tLXYtLS0tLS0tLS0tLS0tLS0tICAgLS0tLS18Ci0gKiB8czF8ZTF8ZjF8cHxlbnR8ZW50fCAuLi4gfGVudHwKLSAqIHwtLS12LS0tLS0tLS0tLS0tLS0tLSAgIC0tLS0tfCAgSGVyZSwgZWFjaCBDRlNfUEFHRSBjb250YWlucwotICoJICAgICAuLi4JCSBtdWx0aXBsZSBsdV9kaXJwYWdlcy4KLSAqIHwtLS12LS0tLS0tLS0tLS0tLS0tLSAgIC0tLS0tfAotICogfHMnfGUnfGYnfHB8ZW50fGVudHwgLi4uIHxlbnR8Ci0gKiAnLS0tfC0tLS0tLS0tLS0tLS0tLS0gICAtLS0tLScKLSAqICAgICB2Ci0gKiAuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLSAqIHwJbmV4dCBDRlNfUEFHRSAgICAgICB8CisgKiBccGFyYW1bb3V0XSBwcGFnZQkJdGhlIHBhZ2Ugd2hpY2ggaG9sZHMgdGhlIG1pbnVtIGVudHJ5CiAgKgotICogVGhpcyBzdHJ1Y3R1cmUgaXMgdHJhbnNmb3JtZWQgaW50byBhIHNpbmdsZSBsb2dpY2FsIGx1X2RpcnBhZ2UgYXMgZm9sbG93czoKLSAqCi0gKiAtIFJlcGxhY2UgZTAgd2l0aCBlJyBzbyB0aGUgcmVxdWVzdCBmb3IgdGhlIG5leHQgbHVfZGlycGFnZSBnZXRzIHRoZSBwYWdlCi0gKiAgIGxhYmVsZWQgJ25leHQgQ0ZTX1BBR0UnLgotICoKLSAqIC0gQ29weSB0aGUgTERGX0NPTExJREUgZmxhZyBmcm9tIGYnIHRvIGYwIHRvIGNvcnJlY3RseSByZWZsZWN0IHdoZXRoZXIKLSAqICAgYSBoYXNoIGNvbGxpc2lvbiB3aXRoIHRoZSBuZXh0IHBhZ2UgZXhpc3RzLgotICoKLSAqIC0gQWRqdXN0IHRoZSBsZGVfcmVjbGVuIG9mIHRoZSBlbmRpbmcgZW50cnkgb2YgZWFjaCBsdV9kaXJwYWdlIHRvIHNwYW4KLSAqICAgdG8gdGhlIGZpcnN0IGVudHJ5IG9mIHRoZSBuZXh0IGx1X2RpcnBhZ2UuCisgKiBccmV0dmFsCQkJPSAwIGdldCB0aGUgZW50cnkgc3VjY2Vzc2Z1bGx5CisgKgkJCQluZWdhdGl2ZSBlcnJubyAoPCAwKSBkb2VzIG5vdCBnZXQgdGhlIGVudHJ5CiAgKi8KLSNpZiBQQUdFX1NJWkUgPiBMVV9QQUdFX1NJWkUKLXN0YXRpYyB2b2lkIGxtdl9hZGp1c3RfZGlycGFnZXMoc3RydWN0IHBhZ2UgKipwYWdlcywgaW50IG5jZnNwZ3MsIGludCBubHVwZ3MpCitzdGF0aWMgaW50IGxtdl9nZXRfbWluX3N0cmlwZWRfZW50cnkoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKKwkJCQkgICAgIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAorCQkJCSAgICAgc3RydWN0IG1kX2NhbGxiYWNrICpjYl9vcCwKKwkJCQkgICAgIF9fdTY0IGhhc2hfb2Zmc2V0LCBpbnQgKnN0cmlwZV9vZmZzZXQsCisJCQkJICAgICBzdHJ1Y3QgbHVfZGlyZW50ICoqZW50cCwKKwkJCQkgICAgIHN0cnVjdCBwYWdlICoqcHBhZ2UpCiB7CisJc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSA9IG9wX2RhdGEtPm9wX21lYTE7CisJc3RydWN0IG9iZF9kZXZpY2UgKm9iZCA9IGV4cC0+ZXhwX29iZDsKKwlzdHJ1Y3QgbG12X29iZCAqbG12ID0gJm9iZC0+dS5sbXY7CisJc3RydWN0IGx1X2RpcmVudCAqbWluX2VudCA9IE5VTEw7CisJc3RydWN0IHBhZ2UgKm1pbl9wYWdlID0gTlVMTDsKKwlzdHJ1Y3QgbG12X3RndF9kZXNjICp0Z3Q7CisJaW50IHN0cmlwZV9jb3VudDsKKwlpbnQgbWluX2lkeCA9IDA7CisJaW50IHJjID0gMDsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBuY2ZzcGdzOyBpKyspIHsKLQkJc3RydWN0IGx1X2RpcnBhZ2UJKmRwID0ga21hcChwYWdlc1tpXSk7Ci0JCXN0cnVjdCBsdV9kaXJwYWdlCSpmaXJzdCA9IGRwOwotCQlzdHJ1Y3QgbHVfZGlyZW50CSplbmRfZGlyZW50ID0gTlVMTDsKLQkJc3RydWN0IGx1X2RpcmVudAkqZW50OwotCQlfX3U2NAkJCWhhc2hfZW5kID0gZHAtPmxkcF9oYXNoX2VuZDsKLQkJX191MzIJCQlmbGFncyA9IGRwLT5sZHBfZmxhZ3M7CisJc3RyaXBlX2NvdW50ID0gbHNtLT5sc21fbWRfc3RyaXBlX2NvdW50OworCWZvciAoaSA9IDA7IGkgPCBzdHJpcGVfY291bnQ7IGkrKykgeworCQlfX3U2NCBzdHJpcGVfaGFzaCA9IGhhc2hfb2Zmc2V0OworCQlzdHJ1Y3QgbHVfZGlyZW50ICplbnQgPSBOVUxMOworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CisJCXN0cnVjdCBsdV9kaXJwYWdlICpkcDsKIAotCQl3aGlsZSAoLS1ubHVwZ3MgPiAwKSB7Ci0JCQllbnQgPSBsdV9kaXJlbnRfc3RhcnQoZHApOwotCQkJZm9yIChlbmRfZGlyZW50ID0gZW50OyBlbnQ7Ci0JCQkgICAgIGVuZF9kaXJlbnQgPSBlbnQsIGVudCA9IGx1X2RpcmVudF9uZXh0KGVudCkpCi0JCQkJOwotCi0JCQkvKiBBZHZhbmNlIGRwIHRvIG5leHQgbHVfZGlycGFnZS4gKi8KLQkJCWRwID0gKHN0cnVjdCBsdV9kaXJwYWdlICopKChjaGFyICopZHAgKyBMVV9QQUdFX1NJWkUpOwotCi0JCQkvKiBDaGVjayBpZiB3ZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIENGU19QQUdFLiAqLwotCQkJaWYgKCEoKHVuc2lnbmVkIGxvbmcpZHAgJiB+UEFHRV9NQVNLKSkKLQkJCQlicmVhazsKLQotCQkJLyogU2F2ZSB0aGUgaGFzaCBhbmQgZmxhZ3Mgb2YgdGhpcyBsdV9kaXJwYWdlLiAqLwotCQkJaGFzaF9lbmQgPSBkcC0+bGRwX2hhc2hfZW5kOwotCQkJZmxhZ3MgPSBkcC0+bGRwX2ZsYWdzOwotCi0JCQkvKiBDaGVjayBpZiBsdV9kaXJwYWdlIGNvbnRhaW5zIG5vIGVudHJpZXMuICovCi0JCQlpZiAoIWVuZF9kaXJlbnQpCi0JCQkJYnJlYWs7Ci0KLQkJCS8qIEVubGFyZ2UgdGhlIGVuZCBlbnRyeSBsZGVfcmVjbGVuIGZyb20gMCB0bwotCQkJICogZmlyc3QgZW50cnkgb2YgbmV4dCBsdV9kaXJwYWdlLgotCQkJICovCi0JCQlMQVNTRVJUKGxlMTZfdG9fY3B1KGVuZF9kaXJlbnQtPmxkZV9yZWNsZW4pID09IDApOwotCQkJZW5kX2RpcmVudC0+bGRlX3JlY2xlbiA9Ci0JCQkJY3B1X3RvX2xlMTYoKGNoYXIgKikoZHAtPmxkcF9lbnRyaWVzKSAtCi0JCQkJCSAgICAoY2hhciAqKWVuZF9kaXJlbnQpOworCQl0Z3QgPSBsbXZfZ2V0X3RhcmdldChsbXYsIGxzbS0+bHNtX21kX29pbmZvW2ldLmxtb19tZHMsIE5VTEwpOworCQlpZiAoSVNfRVJSKHRndCkpIHsKKwkJCXJjID0gUFRSX0VSUih0Z3QpOworCQkJZ290byBvdXQ7CiAJCX0KIAotCQlmaXJzdC0+bGRwX2hhc2hfZW5kID0gaGFzaF9lbmQ7Ci0JCWZpcnN0LT5sZHBfZmxhZ3MgJj0gfmNwdV90b19sZTMyKExERl9DT0xMSURFKTsKLQkJZmlyc3QtPmxkcF9mbGFncyB8PSBmbGFncyAmIGNwdV90b19sZTMyKExERl9DT0xMSURFKTsKKwkJLyoKKwkJICogb3BfZGF0YSB3aWxsIGJlIHNoYXJlZCBieSBlYWNoIHN0cmlwZSwgc28gd2UgbmVlZAorCQkgKiByZXNldCB0aGVzZSB2YWx1ZSBmb3IgZWFjaCBzdHJpcGUKKwkJICovCisJCW9wX2RhdGEtPm9wX2ZpZDEgPSBsc20tPmxzbV9tZF9vaW5mb1tpXS5sbW9fZmlkOworCQlvcF9kYXRhLT5vcF9maWQyID0gbHNtLT5sc21fbWRfb2luZm9baV0ubG1vX2ZpZDsKKwkJb3BfZGF0YS0+b3BfZGF0YSA9IGxzbS0+bHNtX21kX29pbmZvW2ldLmxtb19yb290OworbmV4dDoKKwkJcmMgPSBtZF9yZWFkX3BhZ2UodGd0LT5sdGRfZXhwLCBvcF9kYXRhLCBjYl9vcCwgc3RyaXBlX2hhc2gsCisJCQkJICAmcGFnZSk7CisJCWlmIChyYykKKwkJCWdvdG8gb3V0OwogCi0JCWt1bm1hcChwYWdlc1tpXSk7CisJCWRwID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCQlmb3IgKGVudCA9IGx1X2RpcmVudF9zdGFydChkcCk7IGVudDsKKwkJICAgICBlbnQgPSBsdV9kaXJlbnRfbmV4dChlbnQpKSB7CisJCQkvKiBTa2lwIGR1bW15IGVudHJ5ICovCisJCQlpZiAoIWxlMTZfdG9fY3B1KGVudC0+bGRlX25hbWVsZW4pKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAobGU2NF90b19jcHUoZW50LT5sZGVfaGFzaCkgPCBoYXNoX29mZnNldCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGxlNjRfdG9fY3B1KGVudC0+bGRlX2hhc2gpID09IGhhc2hfb2Zmc2V0ICYmCisJCQkgICAgKCplbnRwID09IGVudCB8fCBpIDwgKnN0cmlwZV9vZmZzZXQpKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBza2lwIC4gYW5kIC4uIGZvciBvdGhlciBzdHJpcGVzICovCisJCQlpZiAoaSAmJiAoIXN0cm5jbXAoZW50LT5sZGVfbmFtZSwgIi4iLAorCQkJCQkgICBsZTE2X3RvX2NwdShlbnQtPmxkZV9uYW1lbGVuKSkgfHwKKwkJCQkgICFzdHJuY21wKGVudC0+bGRlX25hbWUsICIuLiIsCisJCQkJCSAgIGxlMTZfdG9fY3B1KGVudC0+bGRlX25hbWVsZW4pKSkpCisJCQkJY29udGludWU7CisJCQlicmVhazsKKwkJfQorCisJCWlmICghZW50KSB7CisJCQlzdHJpcGVfaGFzaCA9IGxlNjRfdG9fY3B1KGRwLT5sZHBfaGFzaF9lbmQpOworCisJCQlrdW5tYXAocGFnZSk7CisJCQlwdXRfcGFnZShwYWdlKTsKKwkJCXBhZ2UgPSBOVUxMOworCisJCQkvKgorCQkJICogcmVhY2ggdGhlIGVuZCBvZiBjdXJyZW50IHN0cmlwZSwgZ28gdG8gbmV4dCBzdHJpcGUKKwkJCSAqLworCQkJaWYgKHN0cmlwZV9oYXNoID09IE1EU19ESVJfRU5EX09GRikKKwkJCQljb250aW51ZTsKKwkJCWVsc2UKKwkJCQlnb3RvIG5leHQ7CisJCX0KKworCQlpZiAobWluX2VudCkgeworCQkJaWYgKGxlNjRfdG9fY3B1KG1pbl9lbnQtPmxkZV9oYXNoKSA+CisJCQkgICAgbGU2NF90b19jcHUoZW50LT5sZGVfaGFzaCkpIHsKKwkJCQltaW5fZW50ID0gZW50OworCQkJCWt1bm1hcChtaW5fcGFnZSk7CisJCQkJcHV0X3BhZ2UobWluX3BhZ2UpOworCQkJCW1pbl9pZHggPSBpOworCQkJCW1pbl9wYWdlID0gcGFnZTsKKwkJCX0gZWxzZSB7CisJCQkJa3VubWFwKHBhZ2UpOworCQkJCXB1dF9wYWdlKHBhZ2UpOworCQkJCXBhZ2UgPSBOVUxMOworCQkJfQorCQl9IGVsc2UgeworCQkJbWluX2VudCA9IGVudDsKKwkJCW1pbl9wYWdlID0gcGFnZTsKKwkJCW1pbl9pZHggPSBpOworCQl9CiAJfQotCUxBU1NFUlRGKG5sdXBncyA9PSAwLCAibGVmdCA9ICVkIiwgbmx1cGdzKTsKLX0KLSNlbHNlCi0jZGVmaW5lIGxtdl9hZGp1c3RfZGlycGFnZXMocGFnZXMsIG5jZnNwZ3MsIG5sdXBncykgZG8ge30gd2hpbGUgKDApCi0jZW5kaWYJLyogUEFHRV9TSVpFID4gTFVfUEFHRV9TSVpFICovCiAKLXN0YXRpYyBpbnQgbG12X3JlYWRwYWdlKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQkJc3RydWN0IHBhZ2UgKipwYWdlcywgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCkKK291dDoKKwlpZiAoKnBwYWdlKSB7CisJCWt1bm1hcCgqcHBhZ2UpOworCQlwdXRfcGFnZSgqcHBhZ2UpOworCX0KKwkqc3RyaXBlX29mZnNldCA9IG1pbl9pZHg7CisJKmVudHAgPSBtaW5fZW50OworCSpwcGFnZSA9IG1pbl9wYWdlOworCXJldHVybiByYzsKK30KKworLyoqCisgKiBCdWlsZCBkaXIgZW50cnkgcGFnZSBmcm9tIGEgc3RyaXBlZCBkaXJlY3RvcnkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGdldHMgb25lIGVudHJ5IGJ5IEBvZmZzZXQgZnJvbSBhIHN0cmlwZWQgZGlyZWN0b3J5LiBJdCB3aWxsCisgKiByZWFkIGVudHJpZXMgZnJvbSBhbGwgb2Ygc3RyaXBlcywgYW5kIGNob29zZSBvbmUgY2xvc2VzdCB0byB0aGUgcmVxdWlyZWQKKyAqIG9mZnNldCgmb2Zmc2V0KS4gQSBmZXcgbm90ZXMKKyAqIDEuIHNraXAgLiBhbmQgLi4gZm9yIG5vbi16ZXJvIHN0cmlwZXMsIGJlY2F1c2UgdGhlcmUgY2FuIG9ubHkgaGF2ZSBvbmUgLgorICogYW5kIC4uIGluIGEgZGlyZWN0b3J5LgorICogMi4gb3BfZGF0YSB3aWxsIGJlIHNoYXJlZCBieSBhbGwgb2Ygc3RyaXBlcywgaW5zdGVhZCBvZiBhbGxvY2F0aW5nIG5ldworICogb25lLCBzbyBuZWVkIHRvIHJlc3RvcmUgYmVmb3JlIHJldXNpbmcuCisgKiAzLiByZWxlYXNlIHRoZSBlbnRyeSBwYWdlIGlmIHRoYXQgaXMgbm90IGJlaW5nIGNob3Nlbi4KKyAqCisgKiBccGFyYW1baW5dIGV4cAlvYmQgZXhwb3J0IHJlZmVyIHRvIExNVgorICogXHBhcmFtW2luXSBvcF9kYXRhCWhvbGQgdGhvc2UgTUQgcGFyYW1ldGVycyBvZiByZWFkX2VudHJ5CisgKiBccGFyYW1baW5dIGNiX29wCWxkbG0gY2FsbGJhY2sgYmVpbmcgdXNlZCBpbiBlbnF1ZXVlIGluIG1kY19yZWFkX2VudHJ5CisgKiBccGFyYW1bb3V0XSBsZHAJdGhlIGVudHJ5IGJlaW5nIHJlYWQKKyAqIFxwYXJhbVtvdXRdIHBwYWdlCXRoZSBwYWdlIGhvbGRpbmcgdGhlIGVudHJ5LiBOb3RlOiBiZWNhdXNlIHRoZSBlbnRyeQorICoJCQl3aWxsIGJlIGFjY2Vzc2VkIGluIHVwcGVyIGxheWVyLCBzbyB3ZSBuZWVkIGhvbGQgdGhlCisgKgkJCXBhZ2UgdW50aWwgdGhlIHVzYWdlcyBvZiBlbnRyeSBpcyBmaW5pc2hlZCwgc2VlCisgKgkJCWxsX2Rpcl9lbnRyeV9uZXh0LgorICoKKyAqIHJldHZhbAkJPTAgaWYgZ2V0IGVudHJ5IHN1Y2Nlc3NmdWxseQorICoJCQk8MCBjYW5ub3QgZ2V0IGVudHJ5CisgKi8KK3N0YXRpYyBpbnQgbG12X3JlYWRfc3RyaXBlZF9wYWdlKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCisJCQkJIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAorCQkJCSBzdHJ1Y3QgbWRfY2FsbGJhY2sgKmNiX29wLAorCQkJCSBfX3U2NCBvZmZzZXQsIHN0cnVjdCBwYWdlICoqcHBhZ2UpCiB7Ci0Jc3RydWN0IG9iZF9kZXZpY2UJKm9iZCA9IGV4cC0+ZXhwX29iZDsKLQlzdHJ1Y3QgbG12X29iZAkJKmxtdiA9ICZvYmQtPnUubG12OwotCV9fdTY0CQkJb2Zmc2V0ID0gb3BfZGF0YS0+b3Bfb2Zmc2V0OwotCWludAkJCXJjOwotCWludAkJCW5jZnNwZ3M7IC8qIHBhZ2VzIHJlYWQgaW4gUEFHRV9TSVpFICovCi0JaW50CQkJbmx1cGdzOyAvKiBwYWdlcyByZWFkIGluIExVX1BBR0VfU0laRSAqLwotCXN0cnVjdCBsbXZfdGd0X2Rlc2MJKnRndDsKKwlzdHJ1Y3QgaW5vZGUgKm1hc3Rlcl9pbm9kZSA9IG9wX2RhdGEtPm9wX2RhdGE7CisJc3RydWN0IGx1X2ZpZCBtYXN0ZXJfZmlkID0gb3BfZGF0YS0+b3BfZmlkMTsKKwlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkID0gZXhwLT5leHBfb2JkOworCV9fdTY0IGhhc2hfb2Zmc2V0ID0gb2Zmc2V0OworCXN0cnVjdCBwYWdlICptaW5fZW50X3BhZ2UgPSBOVUxMOworCXN0cnVjdCBwYWdlICplbnRfcGFnZSA9IE5VTEw7CisJc3RydWN0IGx1X2RpcmVudCAqbWluX2VudCA9IE5VTEw7CisJc3RydWN0IGx1X2RpcmVudCAqbGFzdF9lbnQ7CisJc3RydWN0IGx1X2RpcmVudCAqZW50OworCXN0cnVjdCBsdV9kaXJwYWdlICpkcDsKKwlzaXplX3QgbGVmdF9ieXRlczsKKwlpbnQgZW50X2lkeCA9IDA7CisJdm9pZCAqYXJlYTsKKwlpbnQgcmM7CiAKIAlyYyA9IGxtdl9jaGVja19jb25uZWN0KG9iZCk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlDREVCVUcoRF9JTk9ERSwgIlJFQURQQUdFIGF0ICUjbGx4IGZyb20gIkRGSUQiXG4iLAotCSAgICAgICBvZmZzZXQsIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDEpKTsKKwkvKgorCSAqIEFsbG9jYXRlIGEgcGFnZSBhbmQgcmVhZCBlbnRyaWVzIGZyb20gYWxsIG9mIHN0cmlwZXMgYW5kIGZpbGwKKwkgKiB0aGUgcGFnZSBieSBoYXNoIG9yZGVyCisJICovCisJZW50X3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOworCWlmICghZW50X3BhZ2UpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogSW5pdGlhbGl6ZSB0aGUgZW50cnkgcGFnZSAqLworCWRwID0ga21hcChlbnRfcGFnZSk7CisJbWVtc2V0KGRwLCAwLCBzaXplb2YoKmRwKSk7CisJZHAtPmxkcF9oYXNoX3N0YXJ0ID0gY3B1X3RvX2xlNjQob2Zmc2V0KTsKKwlkcC0+bGRwX2ZsYWdzIHw9IExERl9DT0xMSURFOworCisJYXJlYSA9IGRwICsgMTsKKwlsZWZ0X2J5dGVzID0gUEFHRV9TSVpFIC0gc2l6ZW9mKCpkcCk7CisJZW50ID0gYXJlYTsKKwlsYXN0X2VudCA9IGVudDsKKwlkbyB7CisJCV9fdTE2IGVudF9zaXplOworCisJCS8qIEZpbmQgdGhlIG1pbnVtIGVudHJ5IGZyb20gYWxsIHN1Yi1zdHJpcGVzICovCisJCXJjID0gbG12X2dldF9taW5fc3RyaXBlZF9lbnRyeShleHAsIG9wX2RhdGEsIGNiX29wLCBoYXNoX29mZnNldCwKKwkJCQkJICAgICAgICZlbnRfaWR4LCAmbWluX2VudCwKKwkJCQkJICAgICAgICZtaW5fZW50X3BhZ2UpOworCQlpZiAocmMpCisJCQlnb3RvIG91dDsKKworCQkvKgorCQkgKiBJZiBpdCBjYW4gbm90IGdldCBtaW51bSBlbnRyeSwgaXQgbWVhbnMgaXQgYWxyZWFkeSByZWFjaGVzCisJCSAqIHRoZSBlbmQgb2YgdGhpcyBkaXJlY3RvcnkKKwkJICovCisJCWlmICghbWluX2VudCkgeworCQkJbGFzdF9lbnQtPmxkZV9yZWNsZW4gPSAwOworCQkJaGFzaF9vZmZzZXQgPSBNRFNfRElSX0VORF9PRkY7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWVudF9zaXplID0gbGUxNl90b19jcHUobWluX2VudC0+bGRlX3JlY2xlbik7CisKKwkJLyoKKwkJICogdGhlIGxhc3QgZW50cnkgbGRlX3JlY2xlbiBpcyAwLCBidXQgaXQgbWlnaHQgbm90CisJCSAqIHRoZSBlbmQgb2YgdGhpcyBlbnRyeSBvZiB0aGlzIHRlbXBvcmF5IGVudHJ5CisJCSAqLworCQlpZiAoIWVudF9zaXplKQorCQkJZW50X3NpemUgPSBsdV9kaXJlbnRfY2FsY19zaXplKAorCQkJCQlsZTE2X3RvX2NwdShtaW5fZW50LT5sZGVfbmFtZWxlbiksCisJCQkJCWxlMzJfdG9fY3B1KG1pbl9lbnQtPmxkZV9hdHRycykpOworCQlpZiAoZW50X3NpemUgPiBsZWZ0X2J5dGVzKSB7CisJCQlsYXN0X2VudC0+bGRlX3JlY2xlbiA9IGNwdV90b19sZTE2KDApOworCQkJaGFzaF9vZmZzZXQgPSBsZTY0X3RvX2NwdShtaW5fZW50LT5sZGVfaGFzaCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCW1lbWNweShlbnQsIG1pbl9lbnQsIGVudF9zaXplKTsKKworCQkvKgorCQkgKiBSZXBsYWNlIC4gd2l0aCBtYXN0ZXIgRklEIGFuZCBSZXBsYWNlIC4uIHdpdGggdGhlIHBhcmVudCBGSUQKKwkJICogb2YgbWFzdGVyIG9iamVjdAorCQkgKi8KKwkJaWYgKCFzdHJuY21wKGVudC0+bGRlX25hbWUsICIuIiwKKwkJCSAgICAgbGUxNl90b19jcHUoZW50LT5sZGVfbmFtZWxlbikpICYmCisJCSAgICBsZTE2X3RvX2NwdShlbnQtPmxkZV9uYW1lbGVuKSA9PSAxKQorCQkJZmlkX2NwdV90b19sZSgmZW50LT5sZGVfZmlkLCAmbWFzdGVyX2ZpZCk7CisJCWVsc2UgaWYgKCFzdHJuY21wKGVudC0+bGRlX25hbWUsICIuLiIsCisJCQkJICBsZTE2X3RvX2NwdShlbnQtPmxkZV9uYW1lbGVuKSkgJiYKKwkJCSBsZTE2X3RvX2NwdShlbnQtPmxkZV9uYW1lbGVuKSA9PSAyKQorCQkJZmlkX2NwdV90b19sZSgmZW50LT5sZGVfZmlkLCAmb3BfZGF0YS0+b3BfZmlkMyk7CisKKwkJbGVmdF9ieXRlcyAtPSBlbnRfc2l6ZTsKKwkJZW50LT5sZGVfcmVjbGVuID0gY3B1X3RvX2xlMTYoZW50X3NpemUpOworCQlsYXN0X2VudCA9IGVudDsKKwkJZW50ID0gKHZvaWQgKillbnQgKyBlbnRfc2l6ZTsKKwkJaGFzaF9vZmZzZXQgPSBsZTY0X3RvX2NwdShtaW5fZW50LT5sZGVfaGFzaCk7CisJCWlmIChoYXNoX29mZnNldCA9PSBNRFNfRElSX0VORF9PRkYpIHsKKwkJCWxhc3RfZW50LT5sZGVfcmVjbGVuID0gMDsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoMSk7CitvdXQ6CisJaWYgKG1pbl9lbnRfcGFnZSkgeworCQlrdW5tYXAobWluX2VudF9wYWdlKTsKKwkJcHV0X3BhZ2UobWluX2VudF9wYWdlKTsKKwl9CisKKwlpZiAodW5saWtlbHkocmMpKSB7CisJCV9fZnJlZV9wYWdlKGVudF9wYWdlKTsKKwkJZW50X3BhZ2UgPSBOVUxMOworCX0gZWxzZSB7CisJCWlmIChlbnQgPT0gYXJlYSkKKwkJCWRwLT5sZHBfZmxhZ3MgfD0gTERGX0VNUFRZOworCQlkcC0+bGRwX2ZsYWdzID0gY3B1X3RvX2xlMzIoZHAtPmxkcF9mbGFncyk7CisJCWRwLT5sZHBfaGFzaF9lbmQgPSBjcHVfdG9fbGU2NChoYXNoX29mZnNldCk7CisJfQorCisJLyoKKwkgKiBXZSBkbyBub3Qgd2FudCB0byBhbGxvY2F0ZSBtZF9vcF9kYXRhIGR1cmluZyBlYWNoCisJICogZGlyIGVudHJ5IHJlYWRpbmcsIHNvIG9wX2RhdGEgd2lsbCBiZSBzaGFyZWQgYnkgZXZlcnkgc3RyaXBlLAorCSAqIHRoZW4gd2UgbmVlZCB0byByZXN0b3JlIGl0IGJhY2sgdG8gb3JpZ2luYWwgdmFsdWUgYmVmb3JlCisJICogcmV0dXJuIHRvIHRoZSB1cHBlciBsYXllcgorCSAqLworCW9wX2RhdGEtPm9wX2ZpZDEgPSBtYXN0ZXJfZmlkOworCW9wX2RhdGEtPm9wX2ZpZDIgPSBtYXN0ZXJfZmlkOworCW9wX2RhdGEtPm9wX2RhdGEgPSBtYXN0ZXJfaW5vZGU7CisKKwkqcHBhZ2UgPSBlbnRfcGFnZTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBsbXZfcmVhZF9wYWdlKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAorCQkJIHN0cnVjdCBtZF9jYWxsYmFjayAqY2Jfb3AsIF9fdTY0IG9mZnNldCwKKwkJCSBzdHJ1Y3QgcGFnZSAqKnBwYWdlKQoreworCXN0cnVjdCBsbXZfc3RyaXBlX21kICpsc20gPSBvcF9kYXRhLT5vcF9tZWExOworCXN0cnVjdCBvYmRfZGV2aWNlICpvYmQgPSBleHAtPmV4cF9vYmQ7CisJc3RydWN0IGxtdl9vYmQgKmxtdiA9ICZvYmQtPnUubG12OworCXN0cnVjdCBsbXZfdGd0X2Rlc2MgKnRndDsKKwlpbnQgcmM7CisKKwlyYyA9IGxtdl9jaGVja19jb25uZWN0KG9iZCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAodW5saWtlbHkobHNtKSkgeworCQlyYyA9IGxtdl9yZWFkX3N0cmlwZWRfcGFnZShleHAsIG9wX2RhdGEsIGNiX29wLCBvZmZzZXQsIHBwYWdlKTsKKwkJcmV0dXJuIHJjOworCX0KIAogCXRndCA9IGxtdl9maW5kX3RhcmdldChsbXYsICZvcF9kYXRhLT5vcF9maWQxKTsKIAlpZiAoSVNfRVJSKHRndCkpCiAJCXJldHVybiBQVFJfRVJSKHRndCk7CiAKLQlyYyA9IG1kX3JlYWRwYWdlKHRndC0+bHRkX2V4cCwgb3BfZGF0YSwgcGFnZXMsIHJlcXVlc3QpOwotCWlmIChyYyAhPSAwKQotCQlyZXR1cm4gcmM7Ci0KLQluY2ZzcGdzID0gKCgqcmVxdWVzdCktPnJxX2J1bGstPmJkX25vYl90cmFuc2ZlcnJlZCArIFBBR0VfU0laRSAtIDEpCi0JCSA+PiBQQUdFX1NISUZUOwotCW5sdXBncyA9ICgqcmVxdWVzdCktPnJxX2J1bGstPmJkX25vYl90cmFuc2ZlcnJlZCA+PiBMVV9QQUdFX1NISUZUOwotCUxBU1NFUlQoISgoKnJlcXVlc3QpLT5ycV9idWxrLT5iZF9ub2JfdHJhbnNmZXJyZWQgJiB+TFVfUEFHRV9NQVNLKSk7Ci0JTEFTU0VSVChuY2ZzcGdzID4gMCAmJiBuY2ZzcGdzIDw9IG9wX2RhdGEtPm9wX25wYWdlcyk7Ci0KLQlDREVCVUcoRF9JTk9ERSwgInJlYWQgJWQoJWQpLyVkIHBhZ2VzXG4iLCBuY2ZzcGdzLCBubHVwZ3MsCi0JICAgICAgIG9wX2RhdGEtPm9wX25wYWdlcyk7Ci0KLQlsbXZfYWRqdXN0X2RpcnBhZ2VzKHBhZ2VzLCBuY2ZzcGdzLCBubHVwZ3MpOworCXJjID0gbWRfcmVhZF9wYWdlKHRndC0+bHRkX2V4cCwgb3BfZGF0YSwgY2Jfb3AsIG9mZnNldCwgcHBhZ2UpOwogCiAJcmV0dXJuIHJjOwogfQogCisvKioKKyAqIFVubGluayBhIGZpbGUvZGlyZWN0b3J5CisgKgorICogVW5saW5rIGEgZmlsZSBvciBkaXJlY3RvcnkgdW5kZXIgdGhlIHBhcmVudCBkaXIuIFRoZSB1bmxpbmsgcmVxdWVzdAorICogdXN1YWxseSB3aWxsIGJlIHNlbnQgdG8gdGhlIE1EVCB3aGVyZSB0aGUgY2hpbGQgaXMgbG9jYXRlZCwgYnV0IGlmCisgKiB0aGUgY2xpZW50IGRvZXMgbm90IGhhdmUgdGhlIGNoaWxkIEZJRCB0aGVuIHJlcXVlc3Qgd2lsbCBiZSBzZW50IHRvIHRoZQorICogTURUIHdoZXJlIHRoZSBwYXJlbnQgaXMgbG9jYXRlZC4KKyAqCisgKiBJZiB0aGUgcGFyZW50IGlzIGEgc3RyaXBlZCBkaXJlY3RvcnkgdGhlbiBpdCBhbHNvIG5lZWRzIHRvIGxvY2F0ZSB3aGljaAorICogc3RyaXBlIHRoZSBuYW1lIG9mIHRoZSBjaGlsZCBpcyBsb2NhdGVkLCBhbmQgcmVwbGFjZSB0aGUgcGFyZW50IEZJRAorICogKEBvcC0+b3BfZmlkMSkgd2l0aCB0aGUgc3RyaXBlIEZJRC4gTm90ZTogaWYgdGhlIHN0cmlwZSBpcyB1bmtub3duLAorICogaXQgd2lsbCB3YWxrIHRocm91Z2ggYWxsIG9mIHN1Yi1zdHJpcGVzIHVudGlsIHRoZSBjaGlsZCBpcyBiZWluZworICogdW5saW5rZWQgZmluYWxseS4KKyAqCisgKiBccGFyYW1baW5dIGV4cAlleHBvcnQgcmVmZXIgdG8gTE1WCisgKiBccGFyYW1baW5dIG9wX2RhdGEJZGlmZmVyZW50IHBhcmFtZXRlcnMgdHJhbnNmZXJyZWQgYmV3ZWVuIGNsaWVudAorICoJCQlNRCBzdGFja3MsIG5hbWUsIG5hbWVsZW4sIEZJRHMgZXRjLgorICoJCQlvcF9maWQxIGlzIHRoZSBwYXJlbnQgRklELCBvcF9maWQyIGlzIHRoZSBjaGlsZAorICoJCQlGSUQuCisgKiBccGFyYW1bb3V0XSByZXF1ZXN0IHBvaW50IHRvIHRoZSByZXF1ZXN0IG9mIHVubGluay4KKyAqCisgKiByZXR2YWwJCTAgaWYgc3VjY2VlZAorICoJCQluZWdhdGl2ZSBlcnJubyBpZiBmYWlsZWQuCisgKi8KIHN0YXRpYyBpbnQgbG12X3VubGluayhzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKIAkJICAgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCkKIHsKLQlzdHJ1Y3Qgb2JkX2RldmljZSAgICAgICAqb2JkID0gZXhwLT5leHBfb2JkOworCXN0cnVjdCBsbXZfc3RyaXBlX21kICpsc20gPSBvcF9kYXRhLT5vcF9tZWExOworCXN0cnVjdCBvYmRfZGV2aWNlICAgICpvYmQgPSBleHAtPmV4cF9vYmQ7CiAJc3RydWN0IGxtdl9vYmQJICAqbG12ID0gJm9iZC0+dS5sbXY7CisJc3RydWN0IGxtdl90Z3RfZGVzYyAqcGFyZW50X3RndCA9IE5VTEw7CiAJc3RydWN0IGxtdl90Z3RfZGVzYyAgICAgKnRndCA9IE5VTEw7CiAJc3RydWN0IG1kdF9ib2R5CQkqYm9keTsKKwlpbnQgc3RyaXBlX2luZGV4ID0gMDsKIAlpbnQJCSAgICAgcmM7CiAKIAlyYyA9IGxtdl9jaGVja19jb25uZWN0KG9iZCk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7Ci1yZXRyeToKK3JldHJ5X3VubGluazoKKwkvKiBGb3Igc3RyaXBlZCBkaXIsIHdlIG5lZWQgdG8gbG9jYXRlIHRoZSBwYXJlbnQgYXMgd2VsbCAqLworCWlmIChsc20pIHsKKwkJc3RydWN0IGxtdl90Z3RfZGVzYyAqdG1wOworCisJCUxBU1NFUlQob3BfZGF0YS0+b3BfbmFtZSAmJiBvcF9kYXRhLT5vcF9uYW1lbGVuKTsKKworCQl0bXAgPSBsbXZfbG9jYXRlX3RhcmdldF9mb3JfbmFtZShsbXYsIGxzbSwKKwkJCQkJCSBvcF9kYXRhLT5vcF9uYW1lLAorCQkJCQkJIG9wX2RhdGEtPm9wX25hbWVsZW4sCisJCQkJCQkgJm9wX2RhdGEtPm9wX2ZpZDEsCisJCQkJCQkgJm9wX2RhdGEtPm9wX21kcyk7CisKKwkJLyoKKwkJICogcmV0dXJuIC1FQkFERkQgbWVhbnMgdW5rbm93biBoYXNoIHR5cGUsIG1pZ2h0CisJCSAqIG5lZWQgdHJ5IGFsbCBzdWItc3RyaXBlIGhlcmUKKwkJICovCisJCWlmIChJU19FUlIodG1wKSAmJiBQVFJfRVJSKHRtcCkgIT0gLUVCQURGRCkKKwkJCXJldHVybiBQVFJfRVJSKHRtcCk7CisKKwkJLyoKKwkJICogTm90ZTogYm90aCBtaWdyYXRpbmcgZGlyIGFuZCB1bmtub3duIGhhc2ggZGlyIG5lZWQgdG8KKwkJICogdHJ5IGFsbCBvZiBzdWItc3RyaXBlcywgc28gd2UgbmVlZCBzdGFydCBzZWFyY2ggdGhlCisJCSAqIG5hbWUgZnJvbSBzdHJpcGUgMCwgYnV0IG1pZ3JhdGluZyBkaXIgaXMgYWxyZWFkeSBoYW5kbGVkCisJCSAqIGluc2lkZSBsbXZfbG9jYXRlX3RhcmdldF9mb3JfbmFtZSgpLCBzbyB3ZSBvbmx5IGNoZWNrCisJCSAqIHVua25vd24gaGFzaCB0eXBlIGRpcmVjdG9yeSBoZXJlCisJCSAqLworCQlpZiAoIWxtdl9pc19rbm93bl9oYXNoX3R5cGUobHNtLT5sc21fbWRfaGFzaF90eXBlKSkgeworCQkJc3RydWN0IGxtdl9vaW5mbyAqb2luZm87CisKKwkJCW9pbmZvID0gJmxzbS0+bHNtX21kX29pbmZvW3N0cmlwZV9pbmRleF07CisKKwkJCW9wX2RhdGEtPm9wX2ZpZDEgPSBvaW5mby0+bG1vX2ZpZDsKKwkJCW9wX2RhdGEtPm9wX21kcyA9IG9pbmZvLT5sbW9fbWRzOworCQl9CisJfQorCit0cnlfbmV4dF9zdHJpcGU6CiAJLyogU2VuZCB1bmxpbmsgcmVxdWVzdHMgdG8gdGhlIE1EVCB3aGVyZSB0aGUgY2hpbGQgaXMgbG9jYXRlZCAqLwogCWlmIChsaWtlbHkoIWZpZF9pc196ZXJvKCZvcF9kYXRhLT5vcF9maWQyKSkpCi0JCXRndCA9IGxtdl9sb2NhdGVfbWRzKGxtdiwgb3BfZGF0YSwgJm9wX2RhdGEtPm9wX2ZpZDIpOworCQl0Z3QgPSBsbXZfZmluZF90YXJnZXQobG12LCAmb3BfZGF0YS0+b3BfZmlkMik7CisJZWxzZSBpZiAobHNtKQorCQl0Z3QgPSBsbXZfZ2V0X3RhcmdldChsbXYsIG9wX2RhdGEtPm9wX21kcywgTlVMTCk7CiAJZWxzZQogCQl0Z3QgPSBsbXZfbG9jYXRlX21kcyhsbXYsIG9wX2RhdGEsICZvcF9kYXRhLT5vcF9maWQxKTsKKwogCWlmIChJU19FUlIodGd0KSkKIAkJcmV0dXJuIFBUUl9FUlIodGd0KTsKIApAQCAtMjIwMywyOSArMjU0NCw1NyBAQAogCS8qCiAJICogQ2FuY2VsIEZVTEwgbG9ja3Mgb24gY2hpbGQgKGZpZDMpLgogCSAqLwotCXJjID0gbG12X2Vhcmx5X2NhbmNlbChleHAsIG9wX2RhdGEsIHRndC0+bHRkX2lkeCwgTENLX0VYLAotCQkJICAgICAgTURTX0lOT0RFTE9DS19GVUxMLCBNRl9NRENfQ0FOQ0VMX0ZJRDMpOworCXBhcmVudF90Z3QgPSBsbXZfZmluZF90YXJnZXQobG12LCAmb3BfZGF0YS0+b3BfZmlkMSk7CisJaWYgKElTX0VSUihwYXJlbnRfdGd0KSkKKwkJcmV0dXJuIFBUUl9FUlIocGFyZW50X3RndCk7CiAKKwlpZiAocGFyZW50X3RndCAhPSB0Z3QpIHsKKwkJcmMgPSBsbXZfZWFybHlfY2FuY2VsKGV4cCwgcGFyZW50X3RndCwgb3BfZGF0YSwgdGd0LT5sdGRfaWR4LAorCQkJCSAgICAgIExDS19FWCwgTURTX0lOT0RFTE9DS19MT09LVVAsCisJCQkJICAgICAgTUZfTURDX0NBTkNFTF9GSUQzKTsKKwl9CisKKwlyYyA9IGxtdl9lYXJseV9jYW5jZWwoZXhwLCBOVUxMLCBvcF9kYXRhLCB0Z3QtPmx0ZF9pZHgsIExDS19FWCwKKwkJCSAgICAgIE1EU19JTk9ERUxPQ0tfRlVMTCwgTUZfTURDX0NBTkNFTF9GSUQzKTsKIAlpZiAocmMgIT0gMCkKIAkJcmV0dXJuIHJjOwogCi0JQ0RFQlVHKERfSU5PREUsICJ1bmxpbmsgd2l0aCBmaWQ9IkRGSUQiLyJERklEIiAtPiBtZHMgIyVkXG4iLAorCUNERUJVRyhEX0lOT0RFLCAidW5saW5rIHdpdGggZmlkPSIgREZJRCAiLyIgREZJRCAiIC0+IG1kcyAjJXVcbiIsCiAJICAgICAgIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDEpLCBQRklEKCZvcF9kYXRhLT5vcF9maWQyKSwgdGd0LT5sdGRfaWR4KTsKIAogCXJjID0gbWRfdW5saW5rKHRndC0+bHRkX2V4cCwgb3BfZGF0YSwgcmVxdWVzdCk7Ci0JaWYgKHJjICE9IDAgJiYgcmMgIT0gLUVSRU1PVEUpCisJaWYgKHJjICE9IDAgJiYgcmMgIT0gLUVSRU1PVEUgICYmIHJjICE9IC1FTk9FTlQpCiAJCXJldHVybiByYzsKIAorCS8qIFRyeSBuZXh0IHN0cmlwZSBpZiBpdCBpcyBuZWVkZWQuICovCisJaWYgKHJjID09IC1FTk9FTlQgJiYgbHNtICYmIGxtdl9uZWVkX3RyeV9hbGxfc3RyaXBlcyhsc20pKSB7CisJCXN0cnVjdCBsbXZfb2luZm8gKm9pbmZvOworCisJCXN0cmlwZV9pbmRleCsrOworCQlpZiAoc3RyaXBlX2luZGV4ID49IGxzbS0+bHNtX21kX3N0cmlwZV9jb3VudCkKKwkJCXJldHVybiByYzsKKworCQlvaW5mbyA9ICZsc20tPmxzbV9tZF9vaW5mb1tzdHJpcGVfaW5kZXhdOworCisJCW9wX2RhdGEtPm9wX2ZpZDEgPSBvaW5mby0+bG1vX2ZpZDsKKwkJb3BfZGF0YS0+b3BfbWRzID0gb2luZm8tPmxtb19tZHM7CisKKwkJcHRscnBjX3JlcV9maW5pc2hlZCgqcmVxdWVzdCk7CisJCSpyZXF1ZXN0ID0gTlVMTDsKKworCQlnb3RvIHRyeV9uZXh0X3N0cmlwZTsKKwl9CisKIAlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmKCpyZXF1ZXN0KS0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7CiAJaWYgKCFib2R5KQogCQlyZXR1cm4gLUVQUk9UTzsKIAogCS8qIE5vdCBjcm9zcy1yZWYgY2FzZSwganVzdCBnZXQgb3V0IG9mIGhlcmUuICovCi0JaWYgKGxpa2VseSghKGJvZHktPnZhbGlkICYgT0JEX01EX01EUykpKQotCQlyZXR1cm4gMDsKKwlpZiAobGlrZWx5KCEoYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX01EUykpKQorCQlyZXR1cm4gcmM7CiAKIAlDREVCVUcoRF9JTk9ERSwgIiVzOiB0cnkgdW5saW5rIHRvIGFub3RoZXIgTURUIGZvciAiREZJRCJcbiIsCi0JICAgICAgIGV4cC0+ZXhwX29iZC0+b2JkX25hbWUsIFBGSUQoJmJvZHktPmZpZDEpKTsKKwkgICAgICAgZXhwLT5leHBfb2JkLT5vYmRfbmFtZSwgUEZJRCgmYm9keS0+bWJvX2ZpZDEpKTsKIAogCS8qIFRoaXMgaXMgYSByZW1vdGUgb2JqZWN0LCB0cnkgcmVtb3RlIE1EVCwgTm90ZTogaXQgbWF5CiAJICogdHJ5IG1vcmUgdGhhbiAxIHRpbWUgaGVyZSwgQ29uc2lkZXJpbmcgZm9sbG93aW5nIGNhc2UKQEAgLTIyNDcsMTEgKzI2MTYsMTEgQEAKIAkgKiBJbiB0aGVvcnksIGl0IG1pZ2h0IHRyeSB1bmxpbWl0ZWQgdGltZSBoZXJlLCBidXQgaXQgc2hvdWxkCiAJICogYmUgdmVyeSByYXJlIGNhc2UuCiAJICovCi0Jb3BfZGF0YS0+b3BfZmlkMiA9IGJvZHktPmZpZDE7CisJb3BfZGF0YS0+b3BfZmlkMiA9IGJvZHktPm1ib19maWQxOwogCXB0bHJwY19yZXFfZmluaXNoZWQoKnJlcXVlc3QpOwogCSpyZXF1ZXN0ID0gTlVMTDsKIAotCWdvdG8gcmV0cnk7CisJZ290byByZXRyeV91bmxpbms7CiB9CiAKIHN0YXRpYyBpbnQgbG12X3ByZWNsZWFudXAoc3RydWN0IG9iZF9kZXZpY2UgKm9iZCwgZW51bSBvYmRfY2xlYW51cF9zdGFnZSBzdGFnZSkKQEAgLTIyNzQsNiArMjY0MywyMiBAQAogCXJldHVybiAwOwogfQogCisvKioKKyAqIEdldCBieSBrZXkgYSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBMTVYgZGV2aWNlLgorICoKKyAqIERpc3BhdGNoIHJlcXVlc3QgdG8gbG93ZXItbGF5ZXIgZGV2aWNlcyBhcyBuZWVkZWQuCisgKgorICogXHBhcmFtW2luXSAgZW52CWV4ZWN1dGlvbiBlbnZpcm9ubWVudCBmb3IgdGhpcyB0aHJlYWQKKyAqIFxwYXJhbVtpbl0gIGV4cAlleHBvcnQgZm9yIHRoZSBMTVYgZGV2aWNlCisgKiBccGFyYW1baW5dICBrZXlsZW4JbGVuZ3RoIG9mIGtleSBpZGVudGlmaWVyCisgKiBccGFyYW1baW5dICBrZXkJaWRlbnRpZmllciBvZiBrZXkgdG8gZ2V0IHZhbHVlIGZvcgorICogXHBhcmFtW2luXSAgdmFsbGVuCXNpemUgb2YgXGEgdmFsCisgKiBccGFyYW1bb3V0XSB2YWwJcG9pbnRlciB0byBzdG9yYWdlIGxvY2F0aW9uIGZvciB2YWx1ZQorICogXHBhcmFtW2luXSAgbHNtCW9wdGlvbmFsIHN0cmlwaW5nIG1ldGFkYXRhIG9mIG9iamVjdAorICoKKyAqIFxyZXR2YWwgMAkJb24gc3VjY2VzcworICogXHJldHZhbCBuZWdhdGl2ZQluZWdhdGVkIGVycm5vIG9uIGZhaWx1cmUKKyAqLwogc3RhdGljIGludCBsbXZfZ2V0X2luZm8oY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAogCQkJX191MzIga2V5bGVuLCB2b2lkICprZXksIF9fdTMyICp2YWxsZW4sIHZvaWQgKnZhbCwKIAkJCXN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20pCkBAIC0yMzM3LDYgKzI3MjIsMjIgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAorLyoqCisgKiBBc3luY2hyb25vdXNseSBzZXQgYnkga2V5IGEgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgTE1WIGRldmljZS4KKyAqCisgKiBEaXNwYXRjaCByZXF1ZXN0IHRvIGxvd2VyLWxheWVyIGRldmljZXMgYXMgbmVlZGVkLgorICoKKyAqIFxwYXJhbVtpbl0gZW52CWV4ZWN1dGlvbiBlbnZpcm9ubWVudCBmb3IgdGhpcyB0aHJlYWQKKyAqIFxwYXJhbVtpbl0gZXhwCWV4cG9ydCBmb3IgdGhlIExNViBkZXZpY2UKKyAqIFxwYXJhbVtpbl0ga2V5bGVuCWxlbmd0aCBvZiBrZXkgaWRlbnRpZmllcgorICogXHBhcmFtW2luXSBrZXkJaWRlbnRpZmllciBvZiBrZXkgdG8gc3RvcmUgdmFsdWUgZm9yCisgKiBccGFyYW1baW5dIHZhbGxlbglzaXplIG9mIHZhbHVlIHRvIHN0b3JlCisgKiBccGFyYW1baW5dIHZhbAlwb2ludGVyIHRvIGRhdGEgdG8gYmUgc3RvcmVkCisgKiBccGFyYW1baW5dIHNldAlvcHRpb25hbCBsaXN0IG9mIHJlbGF0ZWQgcHRscnBjIHJlcXVlc3RzCisgKgorICogXHJldHZhbCAwCQlvbiBzdWNjZXNzCisgKiBccmV0dmFsIG5lZ2F0aXZlCW5lZ2F0ZWQgZXJybm8gb24gZmFpbHVyZQorICovCiBzdGF0aWMgaW50IGxtdl9zZXRfaW5mb19hc3luYyhjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCiAJCQkgICAgICB1MzIga2V5bGVuLCB2b2lkICprZXksIHUzMiB2YWxsZW4sCiAJCQkgICAgICB2b2lkICp2YWwsIHN0cnVjdCBwdGxycGNfcmVxdWVzdF9zZXQgKnNldCkKQEAgLTIzNTQsNyArMjc1NSw4IEBACiAJfQogCWxtdiA9ICZvYmQtPnUubG12OwogCi0JaWYgKEtFWV9JUyhLRVlfUkVBRF9PTkxZKSB8fCBLRVlfSVMoS0VZX0ZMVVNIX0NUWCkpIHsKKwlpZiAoS0VZX0lTKEtFWV9SRUFEX09OTFkpIHx8IEtFWV9JUyhLRVlfRkxVU0hfQ1RYKSB8fAorCSAgICBLRVlfSVMoS0VZX0RFRkFVTFRfRUFTSVpFKSkgewogCQlpbnQgaSwgZXJyID0gMDsKIAogCQlmb3IgKGkgPSAwOyBpIDwgbG12LT5kZXNjLmxkX3RndF9jb3VudDsgaSsrKSB7CkBAIC0yMzc1LDEwNSArMjc3NywyNDcgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGludCBsbXZfcGFja21kKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsb3ZfbWRzX21kICoqbG1tcCwKLQkJICAgICAgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSkKK3N0YXRpYyBpbnQgbG12X3BhY2tfbWRfdjEoY29uc3Qgc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSwKKwkJCSAgc3RydWN0IGxtdl9tZHNfbWRfdjEgKmxtbTEpCiB7Ci0Jc3RydWN0IG9iZF9kZXZpY2UJICpvYmQgPSBjbGFzc19leHAyb2JkKGV4cCk7Ci0Jc3RydWN0IGxtdl9vYmQJICAgICpsbXYgPSAmb2JkLT51LmxtdjsKLQlzdHJ1Y3QgbG12X3N0cmlwZV9tZCAgICAgICptZWFwOwotCXN0cnVjdCBsbXZfc3RyaXBlX21kICAgICAgKmxzbXA7Ci0JaW50CQkJbWVhX3NpemU7Ci0JaW50CQkJaTsKKwlpbnQgY3BsZW47CisJaW50IGk7CiAKLQltZWFfc2l6ZSA9IGxtdl9nZXRfZWFzaXplKGxtdik7Ci0JaWYgKCFsbW1wKQotCQlyZXR1cm4gbWVhX3NpemU7CisJbG1tMS0+bG12X21hZ2ljID0gY3B1X3RvX2xlMzIobHNtLT5sc21fbWRfbWFnaWMpOworCWxtbTEtPmxtdl9zdHJpcGVfY291bnQgPSBjcHVfdG9fbGUzMihsc20tPmxzbV9tZF9zdHJpcGVfY291bnQpOworCWxtbTEtPmxtdl9tYXN0ZXJfbWR0X2luZGV4ID0gY3B1X3RvX2xlMzIobHNtLT5sc21fbWRfbWFzdGVyX21kdF9pbmRleCk7CisJbG1tMS0+bG12X2hhc2hfdHlwZSA9IGNwdV90b19sZTMyKGxzbS0+bHNtX21kX2hhc2hfdHlwZSk7CisJY3BsZW4gPSBzdHJsY3B5KGxtbTEtPmxtdl9wb29sX25hbWUsIGxzbS0+bHNtX21kX3Bvb2xfbmFtZSwKKwkJCXNpemVvZihsbW0xLT5sbXZfcG9vbF9uYW1lKSk7CisJaWYgKGNwbGVuID49IHNpemVvZihsbW0xLT5sbXZfcG9vbF9uYW1lKSkKKwkJcmV0dXJuIC1FMkJJRzsKIAorCWZvciAoaSA9IDA7IGkgPCBsc20tPmxzbV9tZF9zdHJpcGVfY291bnQ7IGkrKykKKwkJZmlkX2NwdV90b19sZSgmbG1tMS0+bG12X3N0cmlwZV9maWRzW2ldLAorCQkJICAgICAgJmxzbS0+bHNtX21kX29pbmZvW2ldLmxtb19maWQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitsbXZfcGFja19tZCh1bmlvbiBsbXZfbWRzX21kICoqbG1tcCwgY29uc3Qgc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSwKKwkgICAgaW50IHN0cmlwZV9jb3VudCkKK3sKKwlpbnQgbG1tX3NpemUgPSAwLCByYyA9IDA7CisJYm9vbCBhbGxvY2F0ZWQgPSBmYWxzZTsKKworCUxBU1NFUlQobG1tcCk7CisKKwkvKiBGcmVlIGxtbSAqLwogCWlmICgqbG1tcCAmJiAhbHNtKSB7CisJCWludCBzdHJpcGVfY250OworCisJCXN0cmlwZV9jbnQgPSBsbXZfbWRzX21kX3N0cmlwZV9jb3VudF9nZXQoKmxtbXApOworCQlsbW1fc2l6ZSA9IGxtdl9tZHNfbWRfc2l6ZShzdHJpcGVfY250LAorCQkJCQkgICBsZTMyX3RvX2NwdSgoKmxtbXApLT5sbXZfbWFnaWMpKTsKKwkJaWYgKCFsbW1fc2l6ZSkKKwkJCXJldHVybiAtRUlOVkFMOwogCQlrdmZyZWUoKmxtbXApOwogCQkqbG1tcCA9IE5VTEw7CiAJCXJldHVybiAwOwogCX0KIAotCWlmICghKmxtbXApIHsKLQkJKmxtbXAgPSBsaWJjZnNfa3Z6YWxsb2MobWVhX3NpemUsIEdGUF9OT0ZTKTsKKwkvKiBBbGxvYyBsbW0gKi8KKwlpZiAoISpsbW1wICYmICFsc20pIHsKKwkJbG1tX3NpemUgPSBsbXZfbWRzX21kX3NpemUoc3RyaXBlX2NvdW50LCBMTVZfTUFHSUMpOworCQlMQVNTRVJUKGxtbV9zaXplID4gMCk7CisJCSpsbW1wID0gbGliY2ZzX2t2emFsbG9jKGxtbV9zaXplLCBHRlBfTk9GUyk7CiAJCWlmICghKmxtbXApCiAJCQlyZXR1cm4gLUVOT01FTTsKKwkJbG12X21kc19tZF9zdHJpcGVfY291bnRfc2V0KCpsbW1wLCBzdHJpcGVfY291bnQpOworCQkoKmxtbXApLT5sbXZfbWFnaWMgPSBjcHVfdG9fbGUzMihMTVZfTUFHSUMpOworCQlyZXR1cm4gbG1tX3NpemU7CiAJfQogCi0JaWYgKCFsc20pCi0JCXJldHVybiBtZWFfc2l6ZTsKLQotCWxzbXAgPSAoc3RydWN0IGxtdl9zdHJpcGVfbWQgKilsc207Ci0JbWVhcCA9IChzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqKSpsbW1wOwotCi0JaWYgKGxzbXAtPm1lYV9tYWdpYyAhPSBNRUFfTUFHSUNfTEFTVF9DSEFSICYmCi0JICAgIGxzbXAtPm1lYV9tYWdpYyAhPSBNRUFfTUFHSUNfQUxMX0NIQVJTKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW1lYXAtPm1lYV9tYWdpYyA9IGNwdV90b19sZTMyKGxzbXAtPm1lYV9tYWdpYyk7Ci0JbWVhcC0+bWVhX2NvdW50ID0gY3B1X3RvX2xlMzIobHNtcC0+bWVhX2NvdW50KTsKLQltZWFwLT5tZWFfbWFzdGVyID0gY3B1X3RvX2xlMzIobHNtcC0+bWVhX21hc3Rlcik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbG12LT5kZXNjLmxkX3RndF9jb3VudDsgaSsrKSB7Ci0JCW1lYXAtPm1lYV9pZHNbaV0gPSBsc21wLT5tZWFfaWRzW2ldOwotCQlmaWRfY3B1X3RvX2xlKCZtZWFwLT5tZWFfaWRzW2ldLCAmbHNtcC0+bWVhX2lkc1tpXSk7CisJLyogcGFjayBsbW0gKi8KKwlMQVNTRVJUKGxzbSk7CisJbG1tX3NpemUgPSBsbXZfbWRzX21kX3NpemUobHNtLT5sc21fbWRfc3RyaXBlX2NvdW50LAorCQkJCSAgIGxzbS0+bHNtX21kX21hZ2ljKTsKKwlpZiAoISpsbW1wKSB7CisJCSpsbW1wID0gbGliY2ZzX2t2emFsbG9jKGxtbV9zaXplLCBHRlBfTk9GUyk7CisJCWlmICghKmxtbXApCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJYWxsb2NhdGVkID0gdHJ1ZTsKIAl9CiAKLQlyZXR1cm4gbWVhX3NpemU7CisJc3dpdGNoIChsc20tPmxzbV9tZF9tYWdpYykgeworCWNhc2UgTE1WX01BR0lDX1YxOgorCQlyYyA9IGxtdl9wYWNrX21kX3YxKGxzbSwgJigqbG1tcCktPmxtdl9tZF92MSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJaWYgKHJjICYmIGFsbG9jYXRlZCkgeworCQlrdmZyZWUoKmxtbXApOworCQkqbG1tcCA9IE5VTEw7CisJfQorCisJcmV0dXJuIGxtbV9zaXplOwogfQogCi1zdGF0aWMgaW50IGxtdl91bnBhY2ttZChzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqKmxzbXAsCi0JCQlzdHJ1Y3QgbG92X21kc19tZCAqbG1tLCBpbnQgbG1tX3NpemUpCitzdGF0aWMgaW50IGxtdl91bnBhY2tfbWRfdjEoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgbG12X21kc19tZF92MSAqbG1tMSkKIHsKLQlzdHJ1Y3Qgb2JkX2RldmljZQkgICpvYmQgPSBjbGFzc19leHAyb2JkKGV4cCk7Ci0Jc3RydWN0IGxtdl9zdHJpcGVfbWQgICAgICAqKnRtZWEgPSAoc3RydWN0IGxtdl9zdHJpcGVfbWQgKiopbHNtcDsKLQlzdHJ1Y3QgbG12X3N0cmlwZV9tZCAgICAgICAqbWVhID0gKHN0cnVjdCBsbXZfc3RyaXBlX21kICopbG1tOwotCXN0cnVjdCBsbXZfb2JkCSAgICAgKmxtdiA9ICZvYmQtPnUubG12OwotCWludAkJCSBtZWFfc2l6ZTsKLQlpbnQJCQkgaTsKLQlfX3UzMgkJICAgICAgIG1hZ2ljOworCXN0cnVjdCBsbXZfb2JkICpsbXYgPSAmZXhwLT5leHBfb2JkLT51LmxtdjsKKwlpbnQgc3RyaXBlX2NvdW50OworCWludCByYyA9IDA7CisJaW50IGNwbGVuOworCWludCBpOwogCi0JbWVhX3NpemUgPSBsbXZfZ2V0X2Vhc2l6ZShsbXYpOwotCWlmICghbHNtcCkKLQkJcmV0dXJuIG1lYV9zaXplOworCWxzbS0+bHNtX21kX21hZ2ljID0gbGUzMl90b19jcHUobG1tMS0+bG12X21hZ2ljKTsKKwlsc20tPmxzbV9tZF9zdHJpcGVfY291bnQgPSBsZTMyX3RvX2NwdShsbW0xLT5sbXZfc3RyaXBlX2NvdW50KTsKKwlsc20tPmxzbV9tZF9tYXN0ZXJfbWR0X2luZGV4ID0gbGUzMl90b19jcHUobG1tMS0+bG12X21hc3Rlcl9tZHRfaW5kZXgpOworCWlmIChPQkRfRkFJTF9DSEVDSyhPQkRfRkFJTF9VTktOT1dOX0xNVl9TVFJJUEUpKQorCQlsc20tPmxzbV9tZF9oYXNoX3R5cGUgPSBMTVZfSEFTSF9UWVBFX1VOS05PV047CisJZWxzZQorCQlsc20tPmxzbV9tZF9oYXNoX3R5cGUgPSBsZTMyX3RvX2NwdShsbW0xLT5sbXZfaGFzaF90eXBlKTsKKwlsc20tPmxzbV9tZF9sYXlvdXRfdmVyc2lvbiA9IGxlMzJfdG9fY3B1KGxtbTEtPmxtdl9sYXlvdXRfdmVyc2lvbik7CisJY3BsZW4gPSBzdHJsY3B5KGxzbS0+bHNtX21kX3Bvb2xfbmFtZSwgbG1tMS0+bG12X3Bvb2xfbmFtZSwKKwkJCXNpemVvZihsc20tPmxzbV9tZF9wb29sX25hbWUpKTsKIAotCWlmICgqbHNtcCAmJiAhbG1tKSB7Ci0JCWt2ZnJlZSgqdG1lYSk7CisJaWYgKGNwbGVuID49IHNpemVvZihsc20tPmxzbV9tZF9wb29sX25hbWUpKQorCQlyZXR1cm4gLUUyQklHOworCisJQ0RFQlVHKERfSU5GTywgInVucGFjayBsc20gY291bnQgJWQsIG1hc3RlciAlZCBoYXNoX3R5cGUgJWQgbGF5b3V0X3ZlcnNpb24gJWRcbiIsCisJICAgICAgIGxzbS0+bHNtX21kX3N0cmlwZV9jb3VudCwgbHNtLT5sc21fbWRfbWFzdGVyX21kdF9pbmRleCwKKwkgICAgICAgbHNtLT5sc21fbWRfaGFzaF90eXBlLCBsc20tPmxzbV9tZF9sYXlvdXRfdmVyc2lvbik7CisKKwlzdHJpcGVfY291bnQgPSBsZTMyX3RvX2NwdShsbW0xLT5sbXZfc3RyaXBlX2NvdW50KTsKKwlmb3IgKGkgPSAwOyBpIDwgc3RyaXBlX2NvdW50OyBpKyspIHsKKwkJZmlkX2xlX3RvX2NwdSgmbHNtLT5sc21fbWRfb2luZm9baV0ubG1vX2ZpZCwKKwkJCSAgICAgICZsbW0xLT5sbXZfc3RyaXBlX2ZpZHNbaV0pOworCQlyYyA9IGxtdl9mbGRfbG9va3VwKGxtdiwgJmxzbS0+bHNtX21kX29pbmZvW2ldLmxtb19maWQsCisJCQkJICAgICZsc20tPmxzbV9tZF9vaW5mb1tpXS5sbW9fbWRzKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCQlDREVCVUcoRF9JTkZPLCAidW5wYWNrIGZpZCAjJWQgIkRGSUQiXG4iLCBpLAorCQkgICAgICAgUEZJRCgmbHNtLT5sc21fbWRfb2luZm9baV0ubG1vX2ZpZCkpOworCX0KKworCXJldHVybiByYzsKK30KKworaW50IGxtdl91bnBhY2tfbWQoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxtdl9zdHJpcGVfbWQgKipsc21wLAorCQkgIGNvbnN0IHVuaW9uIGxtdl9tZHNfbWQgKmxtbSwgaW50IHN0cmlwZV9jb3VudCkKK3sKKwlzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtOworCWJvb2wgYWxsb2NhdGVkID0gZmFsc2U7CisJaW50IGxzbV9zaXplLCByYzsKKworCUxBU1NFUlQobHNtcCk7CisKKwlsc20gPSAqbHNtcDsKKwkvKiBGcmVlIG1lbW1kICovCisJaWYgKGxzbSAmJiAhbG1tKSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDE7IGkgPCBsc20tPmxzbV9tZF9zdHJpcGVfY291bnQ7IGkrKykgeworCQkJLyoKKwkJCSAqIEZvciBtaWdyYXRpbmcgaW5vZGUsIHRoZSBtYXN0ZXIgc3RyaXBlIGFuZCBtYXN0ZXIKKwkJCSAqIG9iamVjdCB3aWxsIGJlIHRoZSBzYW1lLCBzbyBkbyBub3QgbmVlZCBpcHV0LCBzZWUKKwkJCSAqIGxsX3VwZGF0ZV9sc21fbWQKKwkJCSAqLworCQkJaWYgKCEobHNtLT5sc21fbWRfaGFzaF90eXBlICYgTE1WX0hBU0hfRkxBR19NSUdSQVRJT04gJiYKKwkJCSAgICAgICFpKSAmJiBsc20tPmxzbV9tZF9vaW5mb1tpXS5sbW9fcm9vdCkKKwkJCQlpcHV0KGxzbS0+bHNtX21kX29pbmZvW2ldLmxtb19yb290KTsKKwkJfQorCisJCWt2ZnJlZShsc20pOwogCQkqbHNtcCA9IE5VTEw7CiAJCXJldHVybiAwOwogCX0KIAotCUxBU1NFUlQobWVhX3NpemUgPT0gbG1tX3NpemUpOworCS8qIEFsbG9jIG1lbW1kICovCisJaWYgKCFsc20gJiYgIWxtbSkgeworCQlsc21fc2l6ZSA9IGxtdl9zdHJpcGVfbWRfc2l6ZShzdHJpcGVfY291bnQpOworCQlsc20gPSBsaWJjZnNfa3Z6YWxsb2MobHNtX3NpemUsIEdGUF9OT0ZTKTsKKwkJaWYgKCFsc20pCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJbHNtLT5sc21fbWRfc3RyaXBlX2NvdW50ID0gc3RyaXBlX2NvdW50OworCQkqbHNtcCA9IGxzbTsKKwkJcmV0dXJuIDA7CisJfQogCi0JKnRtZWEgPSBsaWJjZnNfa3Z6YWxsb2MobWVhX3NpemUsIEdGUF9OT0ZTKTsKLQlpZiAoISp0bWVhKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAobGUzMl90b19jcHUobG1tLT5sbXZfbWFnaWMpID09IExNVl9NQUdJQ19TVFJJUEUpCisJCXJldHVybiAtRVBFUk07CiAKLQlpZiAoIWxtbSkKLQkJcmV0dXJuIG1lYV9zaXplOworCS8qIFVucGFjayBtZW1tZCAqLworCWlmIChsZTMyX3RvX2NwdShsbW0tPmxtdl9tYWdpYykgIT0gTE1WX01BR0lDX1YxICYmCisJICAgIGxlMzJfdG9fY3B1KGxtbS0+bG12X21hZ2ljKSAhPSBMTVZfVVNFUl9NQUdJQykgeworCQlDRVJST1IoIiVzOiBpbnZhbGlkIGxtdiBtYWdpYyAleDogcmMgPSAlZFxuIiwKKwkJICAgICAgIGV4cC0+ZXhwX29iZC0+b2JkX25hbWUsIGxlMzJfdG9fY3B1KGxtbS0+bG12X21hZ2ljKSwKKwkJICAgICAgIC1FSU8pOworCQlyZXR1cm4gLUVJTzsKKwl9CiAKLQlpZiAobWVhLT5tZWFfbWFnaWMgPT0gTUVBX01BR0lDX0xBU1RfQ0hBUiB8fAotCSAgICBtZWEtPm1lYV9tYWdpYyA9PSBNRUFfTUFHSUNfQUxMX0NIQVJTIHx8Ci0JICAgIG1lYS0+bWVhX21hZ2ljID09IE1FQV9NQUdJQ19IQVNIX1NFR01FTlQpIHsKLQkJbWFnaWMgPSBsZTMyX3RvX2NwdShtZWEtPm1lYV9tYWdpYyk7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogT2xkIG1lYSBpcyBub3QgaGFuZGxlZCBoZXJlLgorCWlmIChsZTMyX3RvX2NwdShsbW0tPmxtdl9tYWdpYykgPT0gTE1WX01BR0lDX1YxKQorCQlsc21fc2l6ZSA9IGxtdl9zdHJpcGVfbWRfc2l6ZShsbXZfbWRzX21kX3N0cmlwZV9jb3VudF9nZXQobG1tKSk7CisJZWxzZQorCQkvKioKKwkJICogVW5wYWNrIGRlZmF1bHQgZGlyc3RyaXBlKGxtdl91c2VyX21kKSB0byBsbXZfc3RyaXBlX21kLAorCQkgKiBzdHJpcGVjb3VudCBzaG91bGQgYmUgMCB0aGVuLgogCQkgKi8KLQkJQ0VSUk9SKCJPbGQgbm90IHN1cHBvcnRhYmxlIEVBIGlzIGZvdW5kXG4iKTsKLQkJTEJVRygpOworCQlsc21fc2l6ZSA9IGxtdl9zdHJpcGVfbWRfc2l6ZSgwKTsKKworCWlmICghbHNtKSB7CisJCWxzbSA9IGxpYmNmc19rdnphbGxvYyhsc21fc2l6ZSwgR0ZQX05PRlMpOworCQlpZiAoIWxzbSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlhbGxvY2F0ZWQgPSB0cnVlOworCQkqbHNtcCA9IGxzbTsKIAl9CiAKLQkoKnRtZWEpLT5tZWFfbWFnaWMgPSBtYWdpYzsKLQkoKnRtZWEpLT5tZWFfY291bnQgPSBsZTMyX3RvX2NwdShtZWEtPm1lYV9jb3VudCk7Ci0JKCp0bWVhKS0+bWVhX21hc3RlciA9IGxlMzJfdG9fY3B1KG1lYS0+bWVhX21hc3Rlcik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgKCp0bWVhKS0+bWVhX2NvdW50OyBpKyspIHsKLQkJKCp0bWVhKS0+bWVhX2lkc1tpXSA9IG1lYS0+bWVhX2lkc1tpXTsKLQkJZmlkX2xlX3RvX2NwdSgmKCp0bWVhKS0+bWVhX2lkc1tpXSwgJigqdG1lYSktPm1lYV9pZHNbaV0pOworCXN3aXRjaCAobGUzMl90b19jcHUobG1tLT5sbXZfbWFnaWMpKSB7CisJY2FzZSBMTVZfTUFHSUNfVjE6CisJCXJjID0gbG12X3VucGFja19tZF92MShleHAsIGxzbSwgJmxtbS0+bG12X21kX3YxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQ0VSUk9SKCIlczogdW5yZWNvZ25pemVkIG1hZ2ljICV4XG4iLCBleHAtPmV4cF9vYmQtPm9iZF9uYW1lLAorCQkgICAgICAgbGUzMl90b19jcHUobG1tLT5sbXZfbWFnaWMpKTsKKwkJcmMgPSAtRUlOVkFMOworCQlicmVhazsKIAl9Ci0JcmV0dXJuIG1lYV9zaXplOworCisJaWYgKHJjICYmIGFsbG9jYXRlZCkgeworCQlrdmZyZWUobHNtKTsKKwkJKmxzbXAgPSBOVUxMOworCQlsc21fc2l6ZSA9IHJjOworCX0KKwlyZXR1cm4gbHNtX3NpemU7Cit9CitFWFBPUlRfU1lNQk9MKGxtdl91bnBhY2tfbWQpOworCitzdGF0aWMgaW50IGxtdl91bnBhY2ttZChzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqKmxzbXAsCisJCQlzdHJ1Y3QgbG92X21kc19tZCAqbG1tLCBpbnQgZGlza19sZW4pCit7CisJcmV0dXJuIGxtdl91bnBhY2tfbWQoZXhwLCAoc3RydWN0IGxtdl9zdHJpcGVfbWQgKiopbHNtcCwKKwkJCSAgICAgKHVuaW9uIGxtdl9tZHNfbWQgKilsbW0sIGRpc2tfbGVuKTsKK30KKworc3RhdGljIGludCBsbXZfcGFja21kKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsb3ZfbWRzX21kICoqbG1tcCwKKwkJICAgICAgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSkKK3sKKwljb25zdCBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbG12ID0gKHN0cnVjdCBsbXZfc3RyaXBlX21kICopbHNtOworCXN0cnVjdCBvYmRfZGV2aWNlICpvYmQgPSBleHAtPmV4cF9vYmQ7CisJc3RydWN0IGxtdl9vYmQgKmxtdl9vYmQgPSAmb2JkLT51LmxtdjsKKwlpbnQgc3RyaXBlX2NvdW50OworCisJaWYgKCFsbW1wKSB7CisJCWlmIChsc20pCisJCQlzdHJpcGVfY291bnQgPSBsbXYtPmxzbV9tZF9zdHJpcGVfY291bnQ7CisJCWVsc2UKKwkJCXN0cmlwZV9jb3VudCA9IGxtdl9vYmQtPmRlc2MubGRfdGd0X2NvdW50OworCisJCXJldHVybiBsbXZfbWRzX21kX3NpemUoc3RyaXBlX2NvdW50LCBMTVZfTUFHSUNfVjEpOworCX0KKworCXJldHVybiBsbXZfcGFja19tZCgodW5pb24gbG12X21kc19tZCAqKilsbW1wLCBsbXYsIDApOwogfQogCiBzdGF0aWMgaW50IGxtdl9jYW5jZWxfdW51c2VkKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCwKQEAgLTI0ODQsNyArMzAyOCw3IEBACiAJc3RydWN0IGxtdl9vYmQJICAqbG12ID0gJm9iZC0+dS5sbXY7CiAJaW50CQkgICAgICByYyA9IDA7CiAJaW50CQkgICAgICBlcnI7Ci0JaW50CQkgICAgICBpOworCXUzMiBpOwogCiAJTEFTU0VSVChmaWQpOwogCkBAIC0yNTAyLDggKzMwNDYsOSBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBsbXZfc2V0X2xvY2tfZGF0YShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBfX3U2NCAqbG9ja2gsIHZvaWQgKmRhdGEsCi0JCQkgICAgIF9fdTY0ICpiaXRzKQorc3RhdGljIGludCBsbXZfc2V0X2xvY2tfZGF0YShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAqbG9ja2gsCisJCQkgICAgIHZvaWQgKmRhdGEsIF9fdTY0ICpiaXRzKQogewogCXN0cnVjdCBsbXZfb2JkCSAgKmxtdiA9ICZleHAtPmV4cF9vYmQtPnUubG12OwogCXN0cnVjdCBsbXZfdGd0X2Rlc2MgKnRndCA9IGxtdi0+dGd0c1swXTsKQEAgLTI1MjYsMjQgKzMwNzEsMzIgQEAKIAlzdHJ1Y3Qgb2JkX2RldmljZSAgICAgICAqb2JkID0gZXhwLT5leHBfb2JkOwogCXN0cnVjdCBsbXZfb2JkCSAgKmxtdiA9ICZvYmQtPnUubG12OwogCWVudW0gbGRsbV9tb2RlCSAgICAgIHJjOwotCWludAkJICAgICAgaTsKKwlpbnQgdGd0OworCXUzMiBpOwogCiAJQ0RFQlVHKERfSU5PREUsICJMb2NrIG1hdGNoIGZvciAiREZJRCJcbiIsIFBGSUQoZmlkKSk7CiAKIAkvKgotCSAqIFdpdGggQ01EIGV2ZXJ5IG9iamVjdCBjYW4gaGF2ZSB0d28gbG9ja3MgaW4gZGlmZmVyZW50IG5hbWVzcGFjZXM6Ci0JICogbG9va3VwIGxvY2sgaW4gc3BhY2Ugb2YgbWRzIHN0b3JpbmcgZGlyZW50cnkgYW5kIHVwZGF0ZS9vcGVuIGxvY2sgaW4KLQkgKiBzcGFjZSBvZiBtZHMgc3RvcmluZyBpbm9kZS4gVGh1cyB3ZSBjaGVjayBhbGwgdGFyZ2V0cywgbm90IG9ubHkgdGhhdAotCSAqIG9uZSBmaWQgd2FzIGNyZWF0ZWQgaW4uCisJICogV2l0aCBETkUgZXZlcnkgb2JqZWN0IGNhbiBoYXZlIHR3byBsb2NrcyBpbiBkaWZmZXJlbnQgbmFtZXNwYWNlczoKKwkgKiBsb29rdXAgbG9jayBpbiBzcGFjZSBvZiBNRFQgc3RvcmluZyBkaXJlbnRyeSBhbmQgdXBkYXRlL29wZW4gbG9jayBpbgorCSAqIHNwYWNlIG9mIE1EVCBzdG9yaW5nIGlub2RlLiAgVHJ5IHRoZSBNRFQgdGhhdCB0aGUgRklEIG1hcHMgdG8gZmlyc3QsCisJICogc2luY2UgdGhpcyBjYW4gYmUgZWFzaWx5IGZvdW5kLCBhbmQgb25seSB0cnkgb3RoZXJzIGlmIHRoYXQgZmFpbHMuCiAJICovCi0JZm9yIChpID0gMDsgaSA8IGxtdi0+ZGVzYy5sZF90Z3RfY291bnQ7IGkrKykgewotCQlzdHJ1Y3QgbG12X3RndF9kZXNjICp0Z3QgPSBsbXYtPnRndHNbaV07CisJZm9yIChpID0gMCwgdGd0ID0gbG12X2ZpbmRfdGFyZ2V0X2luZGV4KGxtdiwgZmlkKTsKKwkgICAgIGkgPCBsbXYtPmRlc2MubGRfdGd0X2NvdW50OworCSAgICAgaSsrLCB0Z3QgPSAodGd0ICsgMSkgJSBsbXYtPmRlc2MubGRfdGd0X2NvdW50KSB7CisJCWlmICh0Z3QgPCAwKSB7CisJCQlDREVCVUcoRF9IQSwgIiVzOiAiREZJRCIgaXMgaW5hY2Nlc3NpYmxlOiByYyA9ICVkXG4iLAorCQkJICAgICAgIG9iZC0+b2JkX25hbWUsIFBGSUQoZmlkKSwgdGd0KTsKKwkJCXRndCA9IDA7CisJCX0KIAotCQlpZiAoIXRndCB8fCAhdGd0LT5sdGRfZXhwIHx8ICF0Z3QtPmx0ZF9hY3RpdmUpCisJCWlmICghbG12LT50Z3RzW3RndF0gfHwgIWxtdi0+dGd0c1t0Z3RdLT5sdGRfZXhwIHx8CisJCSAgICAhbG12LT50Z3RzW3RndF0tPmx0ZF9hY3RpdmUpCiAJCQljb250aW51ZTsKIAotCQlyYyA9IG1kX2xvY2tfbWF0Y2godGd0LT5sdGRfZXhwLCBmbGFncywgZmlkLCB0eXBlLCBwb2xpY3ksIG1vZGUsCi0JCQkJICAgbG9ja2gpOworCQlyYyA9IG1kX2xvY2tfbWF0Y2gobG12LT50Z3RzW3RndF0tPmx0ZF9leHAsIGZsYWdzLCBmaWQsCisJCQkJICAgdHlwZSwgcG9saWN5LCBtb2RlLCBsb2NraCk7CiAJCWlmIChyYykKIAkJCXJldHVybiByYzsKIAl9CkBAIC0yNTcxLDggKzMxMjQsMTAgQEAKIAlzdHJ1Y3QgbG12X29iZAkgICpsbXYgPSAmb2JkLT51LmxtdjsKIAlzdHJ1Y3QgbG12X3RndF9kZXNjICp0Z3QgPSBsbXYtPnRndHNbMF07CiAKLQlpZiAobWQtPm1lYSkKLQkJb2JkX2ZyZWVfbWVtbWQoZXhwLCAodm9pZCAqKSZtZC0+bWVhKTsKKwlpZiAobWQtPmxtdikgeworCQlsbXZfZnJlZV9tZW1tZChtZC0+bG12KTsKKwkJbWQtPmxtdiA9IE5VTEw7CisJfQogCWlmICghdGd0IHx8ICF0Z3QtPmx0ZF9leHApCiAJCXJldHVybiAtRUlOVkFMOwogCXJldHVybiBtZF9mcmVlX2x1c3RyZV9tZCh0Z3QtPmx0ZF9leHAsIG1kKTsKQEAgLTI2MjEsNyArMzE3Niw3IEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQl0Z3QgPSBsbXZfZmluZF90YXJnZXQobG12LCAmb3BfZGF0YS0+b3BfZmlkMSk7CisJdGd0ID0gbG12X2xvY2F0ZV9tZHMobG12LCBvcF9kYXRhLCAmb3BfZGF0YS0+b3BfZmlkMSk7CiAJaWYgKElTX0VSUih0Z3QpKQogCQlyZXR1cm4gUFRSX0VSUih0Z3QpOwogCkBAIC0yNjQ5LDYgKzMyMDQsMjMgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK3N0YXRpYyBpbnQKK2xtdl9nZXRfZmlkX2Zyb21fbHNtKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCisJCSAgICAgY29uc3Qgc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSwKKwkJICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwgc3RydWN0IGx1X2ZpZCAqZmlkKQoreworCWNvbnN0IHN0cnVjdCBsbXZfb2luZm8gKm9pbmZvOworCisJTEFTU0VSVChsc20pOworCW9pbmZvID0gbHNtX25hbWVfdG9fc3RyaXBlX2luZm8obHNtLCBuYW1lLCBuYW1lbGVuKTsKKwlpZiAoSVNfRVJSKG9pbmZvKSkKKwkJcmV0dXJuIFBUUl9FUlIob2luZm8pOworCisJKmZpZCA9IG9pbmZvLT5sbW9fZmlkOworCisJcmV0dXJuIDA7Cit9CisKIC8qKgogICogRm9yIGxtdiwgb25seSBuZWVkIHRvIHNlbmQgcmVxdWVzdCB0byBtYXN0ZXIgTURULCBhbmQgdGhlIG1hc3RlciBNRFQgd2lsbAogICogcHJvY2VzcyB3aXRoIG90aGVyIHNsYXZlIE1EVHMuIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyBRX0dFVE9RVU9UQSBmb3Igd2hpY2gKQEAgLTI2NjAsOCArMzIzMiw5IEBACiAJc3RydWN0IG9iZF9kZXZpY2UgICAqb2JkID0gY2xhc3NfZXhwMm9iZChleHApOwogCXN0cnVjdCBsbXZfb2JkICAgICAgKmxtdiA9ICZvYmQtPnUubG12OwogCXN0cnVjdCBsbXZfdGd0X2Rlc2MgKnRndCA9IGxtdi0+dGd0c1swXTsKLQlpbnQJCSAgcmMgPSAwLCBpOworCWludCByYyA9IDA7CiAJX191NjQgY3Vyc3BhY2UgPSAwLCBjdXJpbm9kZXMgPSAwOworCXUzMiBpOwogCiAJaWYgKCF0Z3QgfHwgIXRndC0+bHRkX2V4cCB8fCAhdGd0LT5sdGRfYWN0aXZlIHx8CiAJICAgICFsbXYtPmRlc2MubGRfdGd0X2NvdW50KSB7CkBAIC0yNzA0LDcgKzMyNzcsOCBAQAogCXN0cnVjdCBvYmRfZGV2aWNlICAgKm9iZCA9IGNsYXNzX2V4cDJvYmQoZXhwKTsKIAlzdHJ1Y3QgbG12X29iZCAgICAgICpsbXYgPSAmb2JkLT51LmxtdjsKIAlzdHJ1Y3QgbG12X3RndF9kZXNjICp0Z3Q7Ci0JaW50CQkgIGksIHJjID0gMDsKKwlpbnQgcmMgPSAwOworCXUzMiBpOwogCiAJZm9yIChpID0gMDsgaSA8IGxtdi0+ZGVzYy5sZF90Z3RfY291bnQ7IGkrKykgewogCQlpbnQgZXJyOwpAQCAtMjcyMyw2ICszMjk3LDQ3IEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgaW50IGxtdl9tZXJnZV9hdHRyKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCisJCQkgIGNvbnN0IHN0cnVjdCBsbXZfc3RyaXBlX21kICpsc20sCisJCQkgIHN0cnVjdCBjbF9hdHRyICphdHRyLAorCQkJICBsZGxtX2Jsb2NraW5nX2NhbGxiYWNrIGNiX2Jsb2NraW5nKQoreworCWludCByYywgaTsKKworCXJjID0gbG12X3JldmFsaWRhdGVfc2xhdmVzKGV4cCwgbHNtLCBjYl9ibG9ja2luZywgMCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJZm9yIChpID0gMDsgaSA8IGxzbS0+bHNtX21kX3N0cmlwZV9jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBsc20tPmxzbV9tZF9vaW5mb1tpXS5sbW9fcm9vdDsKKworCQlDREVCVUcoRF9JTkZPLCAiIkRGSUQiIHNpemUgJWxsdSwgYmxvY2tzICVsbHUgbmxpbmsgJXUsIGF0aW1lICVsdSBjdGltZSAlbHUsIG10aW1lICVsdS5cbiIsCisJCSAgICAgICBQRklEKCZsc20tPmxzbV9tZF9vaW5mb1tpXS5sbW9fZmlkKSwKKwkJICAgICAgIGlfc2l6ZV9yZWFkKGlub2RlKSwgKHVuc2lnbmVkIGxvbmcgbG9uZylpbm9kZS0+aV9ibG9ja3MsCisJCSAgICAgICBpbm9kZS0+aV9ubGluaywgTFRJTUVfUyhpbm9kZS0+aV9hdGltZSksCisJCSAgICAgICBMVElNRV9TKGlub2RlLT5pX2N0aW1lKSwgTFRJTUVfUyhpbm9kZS0+aV9tdGltZSkpOworCisJCS8qIGZvciBzbGF2ZSBzdHJpcGUsIGl0IG5lZWRzIHRvIHN1YnRyYWN0IG5saW5rIGZvciAuIGFuZCAuLiAqLworCQlpZiAoaSkKKwkJCWF0dHItPmNhdF9ubGluayArPSBpbm9kZS0+aV9ubGluayAtIDI7CisJCWVsc2UKKwkJCWF0dHItPmNhdF9ubGluayA9IGlub2RlLT5pX25saW5rOworCisJCWF0dHItPmNhdF9zaXplICs9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwkJYXR0ci0+Y2F0X2Jsb2NrcyArPSBpbm9kZS0+aV9ibG9ja3M7CisKKwkJaWYgKGF0dHItPmNhdF9hdGltZSA8IExUSU1FX1MoaW5vZGUtPmlfYXRpbWUpKQorCQkJYXR0ci0+Y2F0X2F0aW1lID0gTFRJTUVfUyhpbm9kZS0+aV9hdGltZSk7CisKKwkJaWYgKGF0dHItPmNhdF9jdGltZSA8IExUSU1FX1MoaW5vZGUtPmlfY3RpbWUpKQorCQkJYXR0ci0+Y2F0X2N0aW1lID0gTFRJTUVfUyhpbm9kZS0+aV9jdGltZSk7CisKKwkJaWYgKGF0dHItPmNhdF9tdGltZSA8IExUSU1FX1MoaW5vZGUtPmlfbXRpbWUpKQorCQkJYXR0ci0+Y2F0X210aW1lID0gTFRJTUVfUyhpbm9kZS0+aV9tdGltZSk7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IG9iZF9vcHMgbG12X29iZF9vcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5zZXR1cAkJPSBsbXZfc2V0dXAsCkBAIC0yNzQ2LDcgKzMzNjEsNiBAQAogc3RhdGljIHN0cnVjdCBtZF9vcHMgbG12X21kX29wcyA9IHsKIAkuZ2V0c3RhdHVzCQk9IGxtdl9nZXRzdGF0dXMsCiAJLm51bGxfaW5vZGUJCT0gbG12X251bGxfaW5vZGUsCi0JLmZpbmRfY2JkYXRhCQk9IGxtdl9maW5kX2NiZGF0YSwKIAkuY2xvc2UJCQk9IGxtdl9jbG9zZSwKIAkuY3JlYXRlCQkJPSBsbXZfY3JlYXRlLAogCS5kb25lX3dyaXRpbmcJCT0gbG12X2RvbmVfd3JpdGluZywKQEAgLTI3NjAsNyArMzM3NCw3IEBACiAJLnNldGF0dHIJCT0gbG12X3NldGF0dHIsCiAJLnNldHhhdHRyCQk9IGxtdl9zZXR4YXR0ciwKIAkuc3luYwkJCT0gbG12X3N5bmMsCi0JLnJlYWRwYWdlCQk9IGxtdl9yZWFkcGFnZSwKKwkucmVhZF9wYWdlCQk9IGxtdl9yZWFkX3BhZ2UsCiAJLnVubGluawkJCT0gbG12X3VubGluaywKIAkuaW5pdF9lYV9zaXplCQk9IGxtdl9pbml0X2VhX3NpemUsCiAJLmNhbmNlbF91bnVzZWQJCT0gbG12X2NhbmNlbF91bnVzZWQsCkBAIC0yNzY4LDEwICszMzgyLDEyIEBACiAJLmxvY2tfbWF0Y2gJCT0gbG12X2xvY2tfbWF0Y2gsCiAJLmdldF9sdXN0cmVfbWQJCT0gbG12X2dldF9sdXN0cmVfbWQsCiAJLmZyZWVfbHVzdHJlX21kCQk9IGxtdl9mcmVlX2x1c3RyZV9tZCwKKwkubWVyZ2VfYXR0cgkJPSBsbXZfbWVyZ2VfYXR0ciwKIAkuc2V0X29wZW5fcmVwbGF5X2RhdGEJPSBsbXZfc2V0X29wZW5fcmVwbGF5X2RhdGEsCiAJLmNsZWFyX29wZW5fcmVwbGF5X2RhdGEJPSBsbXZfY2xlYXJfb3Blbl9yZXBsYXlfZGF0YSwKIAkuaW50ZW50X2dldGF0dHJfYXN5bmMJPSBsbXZfaW50ZW50X2dldGF0dHJfYXN5bmMsCi0JLnJldmFsaWRhdGVfbG9jawk9IGxtdl9yZXZhbGlkYXRlX2xvY2sKKwkucmV2YWxpZGF0ZV9sb2NrCT0gbG12X3JldmFsaWRhdGVfbG9jaywKKwkuZ2V0X2ZpZF9mcm9tX2xzbQk9IGxtdl9nZXRfZmlkX2Zyb21fbHNtLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgbG12X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9scHJvY19sbXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9scHJvY19sbXYuYwppbmRleCBjMjljMzYxLi4yMGJiZGZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbHByb2NfbG12LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xwcm9jX2xtdi5jCkBAIC0xNjksNyArMTY5LDcgQEAKIAogCWlmICghdGd0KQogCQlyZXR1cm4gMDsKLQlzZXFfcHJpbnRmKHAsICIlZDogJXMgJXNBQ1RJVkVcbiIsCisJc2VxX3ByaW50ZihwLCAiJXU6ICVzICVzQUNUSVZFXG4iLAogCQkgICB0Z3QtPmx0ZF9pZHgsIHRndC0+bHRkX3V1aWQudXVpZCwKIAkJICAgdGd0LT5sdGRfYWN0aXZlID8gIiIgOiAiSU4iKTsKIAlyZXR1cm4gMDsKQEAgLTIwMiw3ICsyMDIsNyBAQAogCXsgTlVMTCB9CiB9OwogCi1zdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxtdl9wcm9jX3RhcmdldF9mb3BzID0geworY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsbXZfcHJvY190YXJnZXRfZm9wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm9wZW4JCSA9IGxtdl90YXJnZXRfc2VxX29wZW4sCiAJLnJlYWQJCSA9IHNlcV9yZWFkLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9jbF9pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9jbF9pbnRlcm5hbC5oCmluZGV4IDk3NDA1NjguLjRkMmI3ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfY2xfaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2NsX2ludGVybmFsLmgKQEAgLTI4OSw4ICsyODksOCBAQAogfTsKIAogc3RydWN0IGxvdl9wYWdlIHsKLQlzdHJ1Y3QgY2xfcGFnZV9zbGljZSBscHNfY2w7Ci0JaW50CQkgIGxwc19pbnZhbGlkOworCXN0cnVjdCBjbF9wYWdlX3NsaWNlCWxwc19jbDsKKwl1bnNpZ25lZCBpbnQJCWxwc19zdHJpcGU7IC8qIHN0cmlwZSBpbmRleCAqLwogfTsKIAogLyoKQEAgLTU1Niw2ICs1NTYsOCBAQAogCQkJCQkgc3RydWN0IGxvdnN1Yl9sb2NrICpzdWIpOwogc3RydWN0IGxvdl9pb19zdWIgKmxvdl9wYWdlX3N1YmlvKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGxvdl9pbyAqbGlvLAogCQkJCSAgY29uc3Qgc3RydWN0IGNsX3BhZ2Vfc2xpY2UgKnNsaWNlKTsKKworc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxvdl9sc21fYWRkcmVmKHN0cnVjdCBsb3Zfb2JqZWN0ICpsb3YpOwogaW50IGxvdl9wYWdlX3N0cmlwZShjb25zdCBzdHJ1Y3QgY2xfcGFnZSAqcGFnZSk7CiAKICNkZWZpbmUgbG92X2ZvcmVhY2hfdGFyZ2V0KGxvdiwgdmFyKQkJICAgIFwKQEAgLTc0MiwxMSArNzQ0LDE1IEBACiBzdGF0aWMgaW5saW5lIHN0cnVjdCBsb3ZfbGF5b3V0X3JhaWQwICpsb3ZfcjAoc3RydWN0IGxvdl9vYmplY3QgKmxvdikKIHsKIAlMQVNTRVJUKGxvdi0+bG9fdHlwZSA9PSBMTFRfUkFJRDApOwotCUxBU1NFUlQobG92LT5sb19sc20tPmxzbV93aXJlLmx3X21hZ2ljID09IExPVl9NQUdJQyB8fAotCQlsb3YtPmxvX2xzbS0+bHNtX3dpcmUubHdfbWFnaWMgPT0gTE9WX01BR0lDX1YzKTsKKwlMQVNTRVJUKGxvdi0+bG9fbHNtLT5sc21fbWFnaWMgPT0gTE9WX01BR0lDIHx8CisJCWxvdi0+bG9fbHNtLT5sc21fbWFnaWMgPT0gTE9WX01BR0lDX1YzKTsKIAlyZXR1cm4gJmxvdi0+dS5yYWlkMDsKIH0KIAorLyogbG92X3BhY2suYyAqLworaW50IGxvdl9nZXRzdHJpcGUoc3RydWN0IGxvdl9vYmplY3QgKm9iaiwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwKKwkJICBzdHJ1Y3QgbG92X3VzZXJfbWQgX191c2VyICpsdW1wKTsKKwogLyoqIEB9IGxvdiAqLwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2Rldi5jCmluZGV4IGIxZjI2MGQuLjA1NmFlMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9kZXYuYwpAQCAtNTE2LDYgKzUxNiw1IEBACiAJLmxkdF9vcHMgICAgICA9ICZsb3ZfZGV2aWNlX3R5cGVfb3BzLAogCS5sZHRfY3R4X3RhZ3MgPSBMQ1RfQ0xfVEhSRUFECiB9OwotRVhQT1JUX1NZTUJPTChsb3ZfZGV2aWNlX3R5cGUpOwogCiAvKiogQH0gbG92ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2VhLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2VhLmMKaW5kZXggNTA1M2RlYS4uMjE0YzU2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9lYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfZWEuYwpAQCAtNjYsNyArNjYsOCBAQAogCX0KIAogCWlmIChsbW0tPmxtbV9zdHJpcGVfc2l6ZSA9PSAwIHx8Ci0JICAgIChsZTMyX3RvX2NwdShsbW0tPmxtbV9zdHJpcGVfc2l6ZSkmKExPVl9NSU5fU1RSSVBFX1NJWkUtMSkpICE9IDApIHsKKwkgICAgKGxlMzJfdG9fY3B1KGxtbS0+bG1tX3N0cmlwZV9zaXplKSAmCisJICAgICAoTE9WX01JTl9TVFJJUEVfU0laRSAtIDEpKSAhPSAwKSB7CiAJCUNFUlJPUigiYmFkIHN0cmlwZSBzaXplICV1XG4iLAogCQkgICAgICAgbGUzMl90b19jcHUobG1tLT5sbW1fc3RyaXBlX3NpemUpKTsKIAkJbG92X2R1bXBfbG1tX2NvbW1vbihEX1dBUk5JTkcsIGxtbSk7CkBAIC0xNDYsMjEgKzE0NywxNSBAQAogCQkqc3dpZHRoID0gKHU2NClsc20tPmxzbV9zdHJpcGVfc2l6ZSAqIGxzbS0+bHNtX3N0cmlwZV9jb3VudDsKIH0KIAotc3RhdGljIGludCBsc21fZGVzdHJveV9wbGFpbihzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtLCBzdHJ1Y3Qgb2JkbyAqb2EsCi0JCQkgICAgIHN0cnVjdCBvYmRfZXhwb3J0ICptZF9leHApCi17Ci0JcmV0dXJuIDA7Ci19Ci0KIC8qIEZpbmQgbWluaW11bSBzdHJpcGUgbWF4Ynl0ZXMgdmFsdWUuICBGb3IgaW5hY3RpdmUgb3IKLSAqIHJlY29ubmVjdGluZyB0YXJnZXRzIHVzZSBMVVNUUkVfU1RSSVBFX01BWEJZVEVTLgorICogcmVjb25uZWN0aW5nIHRhcmdldHMgdXNlIExVU1RSRV9FWFQzX1NUUklQRV9NQVhCWVRFUy4KICAqLwogc3RhdGljIHZvaWQgbG92X3RndF9tYXhieXRlcyhzdHJ1Y3QgbG92X3RndF9kZXNjICp0Z3QsIF9fdTY0ICpzdHJpcGVfbWF4Ynl0ZXMpCiB7CiAJc3RydWN0IG9iZF9pbXBvcnQgKmltcCA9IHRndC0+bHRkX29iZC0+dS5jbGkuY2xfaW1wb3J0OwogCiAJaWYgKCFpbXAgfHwgIXRndC0+bHRkX2FjdGl2ZSkgewotCQkqc3RyaXBlX21heGJ5dGVzID0gTFVTVFJFX1NUUklQRV9NQVhCWVRFUzsKKwkJKnN0cmlwZV9tYXhieXRlcyA9IExVU1RSRV9FWFQzX1NUUklQRV9NQVhCWVRFUzsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTcxLDcgKzE2Niw3IEBACiAJCWlmICgqc3RyaXBlX21heGJ5dGVzID4gaW1wLT5pbXBfY29ubmVjdF9kYXRhLm9jZF9tYXhieXRlcykKIAkJCSpzdHJpcGVfbWF4Ynl0ZXMgPSBpbXAtPmltcF9jb25uZWN0X2RhdGEub2NkX21heGJ5dGVzOwogCX0gZWxzZSB7Ci0JCSpzdHJpcGVfbWF4Ynl0ZXMgPSBMVVNUUkVfU1RSSVBFX01BWEJZVEVTOworCQkqc3RyaXBlX21heGJ5dGVzID0gTFVTVFJFX0VYVDNfU1RSSVBFX01BWEJZVEVTOwogCX0KIAlzcGluX3VubG9jaygmaW1wLT5pbXBfbG9jayk7CiB9CkBAIC0yNDUsNyArMjQwLDYgQEAKIAogY29uc3Qgc3RydWN0IGxzbV9vcGVyYXRpb25zIGxzbV92MV9vcHMgPSB7CiAJLmxzbV9mcmVlCSAgICA9IGxzbV9mcmVlX3BsYWluLAotCS5sc21fZGVzdHJveQkgPSBsc21fZGVzdHJveV9wbGFpbiwKIAkubHNtX3N0cmlwZV9ieV9pbmRleCAgICA9IGxzbV9zdHJpcGVfYnlfaW5kZXhfcGxhaW4sCiAJLmxzbV9zdHJpcGVfYnlfb2Zmc2V0ICAgPSBsc21fc3RyaXBlX2J5X29mZnNldF9wbGFpbiwKIAkubHNtX2xtbV92ZXJpZnkJID0gbHNtX2xtbV92ZXJpZnlfdjEsCkBAIC0zMzUsNyArMzI5LDYgQEAKIAogY29uc3Qgc3RydWN0IGxzbV9vcGVyYXRpb25zIGxzbV92M19vcHMgPSB7CiAJLmxzbV9mcmVlCSAgICA9IGxzbV9mcmVlX3BsYWluLAotCS5sc21fZGVzdHJveQkgPSBsc21fZGVzdHJveV9wbGFpbiwKIAkubHNtX3N0cmlwZV9ieV9pbmRleCAgICA9IGxzbV9zdHJpcGVfYnlfaW5kZXhfcGxhaW4sCiAJLmxzbV9zdHJpcGVfYnlfb2Zmc2V0ICAgPSBsc21fc3RyaXBlX2J5X29mZnNldF9wbGFpbiwKIAkubHNtX2xtbV92ZXJpZnkJID0gbHNtX2xtbV92ZXJpZnlfdjMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2ludGVybmFsLmgKaW5kZXggMTJiZDUxMS4uMDdlNWVkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfaW50ZXJuYWwuaApAQCAtMTM0LDggKzEzNCw2IEBACiAvKiBsb3ZfbWVyZ2UuYyAqLwogdm9pZCBsb3ZfbWVyZ2VfYXR0cnMoc3RydWN0IG9iZG8gKnRndCwgc3RydWN0IG9iZG8gKnNyYywgdTY0IHZhbGlkLAogCQkgICAgIHN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20sIGludCBzdHJpcGVubywgaW50ICpzZXQpOwotaW50IGxvdl9hZGp1c3Rfa21zKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20sCi0JCSAgIHU2NCBzaXplLCBpbnQgc2hyaW5rKTsKIGludCBsb3ZfbWVyZ2VfbHZiX2ttcyhzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtLAogCQkgICAgICBzdHJ1Y3Qgb3N0X2x2YiAqbHZiLCBfX3U2NCAqa21zX3BsYWNlKTsKIApAQCAtMTU3LDExICsxNTUsNiBAQAogaW50IGxvdl9wcmVwX2dldGF0dHJfc2V0KHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBvYmRfaW5mbyAqb2luZm8sCiAJCQkgc3RydWN0IGxvdl9yZXF1ZXN0X3NldCAqKnJlcXNldCk7CiBpbnQgbG92X2ZpbmlfZ2V0YXR0cl9zZXQoc3RydWN0IGxvdl9yZXF1ZXN0X3NldCAqc2V0KTsKLWludCBsb3ZfcHJlcF9kZXN0cm95X3NldChzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3Qgb2JkX2luZm8gKm9pbmZvLAotCQkJIHN0cnVjdCBvYmRvICpzcmNfb2EsIHN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20sCi0JCQkgc3RydWN0IG9iZF90cmFuc19pbmZvICpvdGksCi0JCQkgc3RydWN0IGxvdl9yZXF1ZXN0X3NldCAqKnJlcXNldCk7Ci1pbnQgbG92X2ZpbmlfZGVzdHJveV9zZXQoc3RydWN0IGxvdl9yZXF1ZXN0X3NldCAqc2V0KTsKIGludCBsb3ZfcHJlcF9zZXRhdHRyX3NldChzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3Qgb2JkX2luZm8gKm9pbmZvLAogCQkJIHN0cnVjdCBvYmRfdHJhbnNfaW5mbyAqb3RpLAogCQkJIHN0cnVjdCBsb3ZfcmVxdWVzdF9zZXQgKipyZXFzZXQpOwpAQCAtMTk3LDggKzE5MCw2IEBACiAJICAgICAgIHN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20pOwogaW50IGxvdl91bnBhY2ttZChzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqKmxzbXAsCiAJCSBzdHJ1Y3QgbG92X21kc19tZCAqbG1tLCBpbnQgbG1tX2J5dGVzKTsKLWludCBsb3ZfZ2V0c3RyaXBlKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCi0JCSAgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwgc3RydWN0IGxvdl91c2VyX21kIF9fdXNlciAqbHVtcCk7CiBpbnQgbG92X2FsbG9jX21lbW1kKHN0cnVjdCBsb3Zfc3RyaXBlX21kICoqbHNtcCwgX191MTYgc3RyaXBlX2NvdW50LAogCQkgICAgaW50IHBhdHRlcm4sIGludCBtYWdpYyk7CiBpbnQgbG92X2ZyZWVfbWVtbWQoc3RydWN0IGxvdl9zdHJpcGVfbWQgKipsc21wKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfaW8uYwppbmRleCA4NDAzMmE1Li5kMTAxNTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2lvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9pby5jCkBAIC04Nyw2ICs4Nyw5IEBACiAJY2FzZSBDSVRfU0VUQVRUUjogewogCQlpby0+dS5jaV9zZXRhdHRyLnNhX2F0dHIgPSBwYXJlbnQtPnUuY2lfc2V0YXR0ci5zYV9hdHRyOwogCQlpby0+dS5jaV9zZXRhdHRyLnNhX3ZhbGlkID0gcGFyZW50LT51LmNpX3NldGF0dHIuc2FfdmFsaWQ7CisJCWlvLT51LmNpX3NldGF0dHIuc2Ffc3RyaXBlX2luZGV4ID0gc3RyaXBlOworCQlpby0+dS5jaV9zZXRhdHRyLnNhX3BhcmVudF9maWQgPQorCQkJCQlwYXJlbnQtPnUuY2lfc2V0YXR0ci5zYV9wYXJlbnRfZmlkOwogCQlpZiAoY2xfaW9faXNfdHJ1bmMoaW8pKSB7CiAJCQlsb2ZmX3QgbmV3X3NpemUgPSBwYXJlbnQtPnUuY2lfc2V0YXR0ci5zYV9hdHRyLmx2Yl9zaXplOwogCkBAIC0yNDQsMTQgKzI0NywxMiBAQAogCiBpbnQgbG92X3BhZ2Vfc3RyaXBlKGNvbnN0IHN0cnVjdCBjbF9wYWdlICpwYWdlKQogewotCXN0cnVjdCBsb3ZzdWJfb2JqZWN0ICpzdWJvYmo7CiAJY29uc3Qgc3RydWN0IGNsX3BhZ2Vfc2xpY2UgKnNsaWNlOwogCi0Jc2xpY2UgPSBjbF9wYWdlX2F0KHBhZ2UsICZsb3ZzdWJfZGV2aWNlX3R5cGUpOworCXNsaWNlID0gY2xfcGFnZV9hdChwYWdlLCAmbG92X2RldmljZV90eXBlKTsKIAlMQVNTRVJUKHNsaWNlLT5jcGxfb2JqKTsKIAotCXN1Ym9iaiA9IGNsMmxvdnN1YihzbGljZS0+Y3BsX29iaik7Ci0JcmV0dXJuIHN1Ym9iai0+bHNvX2luZGV4OworCXJldHVybiBjbDJsb3ZfcGFnZShzbGljZSktPmxwc19zdHJpcGU7CiB9CiAKIHN0cnVjdCBsb3ZfaW9fc3ViICpsb3ZfcGFnZV9zdWJpbyhjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBsb3ZfaW8gKmxpbywKQEAgLTI5OCw4ICsyOTksOCBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyB2b2lkIGxvdl9pb19zbGljZV9pbml0KHN0cnVjdCBsb3ZfaW8gKmxpbywKLQkJCSAgICAgIHN0cnVjdCBsb3Zfb2JqZWN0ICpvYmosIHN0cnVjdCBjbF9pbyAqaW8pCitzdGF0aWMgaW50IGxvdl9pb19zbGljZV9pbml0KHN0cnVjdCBsb3ZfaW8gKmxpbywgc3RydWN0IGxvdl9vYmplY3QgKm9iaiwKKwkJCSAgICAgc3RydWN0IGNsX2lvICppbykKIHsKIAlpby0+Y2lfcmVzdWx0ID0gMDsKIAlsaW8tPmxpc19vYmplY3QgPSBvYmo7CkBAIC0zMTQsNiArMzE1LDE1IEBACiAJCWxpby0+bGlzX2lvX2VuZHBvcyA9IGxpby0+bGlzX2VuZHBvczsKIAkJaWYgKGNsX2lvX2lzX2FwcGVuZChpbykpIHsKIAkJCUxBU1NFUlQoaW8tPmNpX3R5cGUgPT0gQ0lUX1dSSVRFKTsKKworCQkJLyoKKwkJCSAqIElmIHRoZXJlIGlzIExPViBFQSBob2xlLCB0aGVuIHdlIG1heSBjYW5ub3QgbG9jYXRlCisJCQkgKiB0aGUgY3VycmVudCBmaWxlLXRhaWwgZXhhY3RseS4KKwkJCSAqLworCQkJaWYgKHVubGlrZWx5KG9iai0+bG9fbHNtLT5sc21fcGF0dGVybiAmCisJCQkJICAgICBMT1ZfUEFUVEVSTl9GX0hPTEUpKQorCQkJCXJldHVybiAtRUlPOworCiAJCQlsaW8tPmxpc19wb3MgPSAwOwogCQkJbGlvLT5saXNfZW5kcG9zID0gT0JEX09CSkVDVF9FT0Y7CiAJCX0KQEAgLTM0OSw2ICszNTksNyBAQAogCWRlZmF1bHQ6CiAJCUxCVUcoKTsKIAl9CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGxvdl9pb19maW5pKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgY29uc3Qgc3RydWN0IGNsX2lvX3NsaWNlICppb3MpCkBAIC04NzAsNyArODgxLDcgQEAKIAlzdHJ1Y3QgbG92X29iamVjdCAgICpsb3YgPSBjbDJsb3Yob2JqKTsKIAogCUlOSVRfTElTVF9IRUFEKCZsaW8tPmxpc19hY3RpdmUpOwotCWxvdl9pb19zbGljZV9pbml0KGxpbywgbG92LCBpbyk7CisJaW8tPmNpX3Jlc3VsdCA9IGxvdl9pb19zbGljZV9pbml0KGxpbywgbG92LCBpbyk7CiAJaWYgKGlvLT5jaV9yZXN1bHQgPT0gMCkgewogCQlpby0+Y2lfcmVzdWx0ID0gbG92X2lvX3N1YmlvX2luaXQoZW52LCBsaW8sIGlvKTsKIAkJaWYgKGlvLT5jaV9yZXN1bHQgPT0gMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9tZXJnZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9tZXJnZS5jCmluZGV4IGI5YzkwODYuLjY3NGFmMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfbWVyZ2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X21lcmdlLmMKQEAgLTEwNSw0NSArMTA1LDYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLS8qIE11c3QgYmUgY2FsbGVkIHVuZGVyIHRoZSBsb3Zfc3RyaXBlX2xvY2soKSAqLwotaW50IGxvdl9hZGp1c3Rfa21zKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20sCi0JCSAgIHU2NCBzaXplLCBpbnQgc2hyaW5rKQotewotCXN0cnVjdCBsb3Zfb2luZm8gKmxvaTsKLQlpbnQgc3RyaXBlID0gMDsKLQlfX3U2NCBrbXM7Ci0KLQlhc3NlcnRfc3Bpbl9sb2NrZWQoJmxzbS0+bHNtX2xvY2spOwotCUxBU1NFUlQobHNtLT5sc21fbG9ja19vd25lciA9PSBjdXJyZW50X3BpZCgpKTsKLQotCWlmIChzaHJpbmspIHsKLQkJZm9yICg7IHN0cmlwZSA8IGxzbS0+bHNtX3N0cmlwZV9jb3VudDsgc3RyaXBlKyspIHsKLQkJCXN0cnVjdCBsb3Zfb2luZm8gKmxvaSA9IGxzbS0+bHNtX29pbmZvW3N0cmlwZV07Ci0KLQkJCWttcyA9IGxvdl9zaXplX3RvX3N0cmlwZShsc20sIHNpemUsIHN0cmlwZSk7Ci0JCQlDREVCVUcoRF9JTk9ERSwKLQkJCSAgICAgICAic3RyaXBlICVkIEtNUyAlc2luZyAlbGx1LT4lbGx1XG4iLAotCQkJICAgICAgIHN0cmlwZSwga21zID4gbG9pLT5sb2lfa21zID8gImluY3JlYXNlIjoic2hyaW5rIiwKLQkJCSAgICAgICBsb2ktPmxvaV9rbXMsIGttcyk7Ci0JCQlsb2ktPmxvaV9sdmIubHZiX3NpemUgPSBrbXM7Ci0JCQlsb2lfa21zX3NldChsb2ksIGxvaS0+bG9pX2x2Yi5sdmJfc2l6ZSk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHNpemUgPiAwKQotCQlzdHJpcGUgPSBsb3Zfc3RyaXBlX251bWJlcihsc20sIHNpemUgLSAxKTsKLQlrbXMgPSBsb3Zfc2l6ZV90b19zdHJpcGUobHNtLCBzaXplLCBzdHJpcGUpOwotCWxvaSA9IGxzbS0+bHNtX29pbmZvW3N0cmlwZV07Ci0KLQlDREVCVUcoRF9JTk9ERSwgInN0cmlwZSAlZCBLTVMgJXNpbmNyZWFzaW5nICVsbHUtPiVsbHVcbiIsCi0JICAgICAgIHN0cmlwZSwga21zID4gbG9pLT5sb2lfa21zID8gIiIgOiAibm90ICIsIGxvaS0+bG9pX2ttcywga21zKTsKLQlpZiAoa21zID4gbG9pLT5sb2lfa21zKQotCQlsb2lfa21zX3NldChsb2ksIGttcyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogdm9pZCBsb3ZfbWVyZ2VfYXR0cnMoc3RydWN0IG9iZG8gKnRndCwgc3RydWN0IG9iZG8gKnNyYywgdTY0IHZhbGlkLAogCQkgICAgIHN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20sIGludCBzdHJpcGVubywgaW50ICpzZXQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X29iZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9vYmQuYwppbmRleCA5YjkyZDU1Li5iMjMwMTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X29iZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3Zfb2JkLmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnMuaCIKIAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkX3N1cHBvcnQuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfaW9jdGwuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saWIuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9uZXQuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfaWRsLmgiCkBAIC05NDAsNyArOTQxLDcgQEAKIAl9CiAJY2FzZSBMQ0ZHX1BBUkFNOiB7CiAJCXN0cnVjdCBscHJvY2ZzX3N0YXRpY192YXJzIGx2YXJzID0geyBOVUxMIH07Ci0JCXN0cnVjdCBsb3ZfZGVzYyAqZGVzYyA9ICYob2JkLT51Lmxvdi5kZXNjKTsKKwkJc3RydWN0IGxvdl9kZXNjICpkZXNjID0gJm9iZC0+dS5sb3YuZGVzYzsKIAogCQlpZiAoIWRlc2MpIHsKIAkJCXJjID0gLUVJTlZBTDsKQEAgLTk3MSw5MiArOTcyLDYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgbG92X3JlY3JlYXRlKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBvYmRvICpzcmNfb2EsCi0JCQlzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqKmVhLCBzdHJ1Y3Qgb2JkX3RyYW5zX2luZm8gKm90aSkKLXsKLQlzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqb2JqX21kcCwgKmxzbTsKLQlzdHJ1Y3QgbG92X29iZCAqbG92ID0gJmV4cC0+ZXhwX29iZC0+dS5sb3Y7Ci0JdW5zaWduZWQgb3N0X2lkeDsKLQlpbnQgcmMsIGk7Ci0KLQlMQVNTRVJUKHNyY19vYS0+b192YWxpZCAmIE9CRF9NRF9GTEZMQUdTICYmCi0JCXNyY19vYS0+b19mbGFncyAmIE9CRF9GTF9SRUNSRUFURV9PQkpTKTsKLQotCW9ial9tZHAgPSBremFsbG9jKHNpemVvZigqb2JqX21kcCksIEdGUF9OT0ZTKTsKLQlpZiAoIW9ial9tZHApCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jb3N0X2lkeCA9IHNyY19vYS0+b19ubGluazsKLQlsc20gPSAqZWE7Ci0JaWYgKCFsc20pIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKG9zdF9pZHggPj0gbG92LT5kZXNjLmxkX3RndF9jb3VudCB8fAotCSAgICAhbG92LT5sb3ZfdGd0c1tvc3RfaWR4XSkgewotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBsc20tPmxzbV9zdHJpcGVfY291bnQ7IGkrKykgewotCQlzdHJ1Y3QgbG92X29pbmZvICpsb2kgPSBsc20tPmxzbV9vaW5mb1tpXTsKLQotCQlpZiAobG92X29pbmZvX2lzX2R1bW15KGxvaSkpCi0JCQljb250aW51ZTsKLQotCQlpZiAobG9pLT5sb2lfb3N0X2lkeCA9PSBvc3RfaWR4KSB7Ci0JCQlpZiAob3N0aWRfaWQoJmxvaS0+bG9pX29pKSAhPSBvc3RpZF9pZCgmc3JjX29hLT5vX29pKSkgewotCQkJCXJjID0gLUVJTlZBTDsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChpID09IGxzbS0+bHNtX3N0cmlwZV9jb3VudCkgewotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJjID0gb2JkX2NyZWF0ZShOVUxMLCBsb3YtPmxvdl90Z3RzW29zdF9pZHhdLT5sdGRfZXhwLAotCQkJc3JjX29hLCAmb2JqX21kcCwgb3RpKTsKLW91dDoKLQlrZnJlZShvYmpfbWRwKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLS8qIHRoZSBMT1YgZXhwZWN0cyBvYS0+b19pZCB0byBiZSBzZXQgdG8gdGhlIExPViBvYmplY3QgaWQgKi8KLXN0YXRpYyBpbnQgbG92X2NyZWF0ZShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCi0JCSAgICAgIHN0cnVjdCBvYmRvICpzcmNfb2EsIHN0cnVjdCBsb3Zfc3RyaXBlX21kICoqZWEsCi0JCSAgICAgIHN0cnVjdCBvYmRfdHJhbnNfaW5mbyAqb3RpKQotewotCXN0cnVjdCBsb3Zfb2JkICpsb3Y7Ci0JaW50IHJjID0gMDsKLQotCUxBU1NFUlQoZWEpOwotCWlmICghZXhwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICgoc3JjX29hLT5vX3ZhbGlkICYgT0JEX01EX0ZMRkxBR1MpICYmCi0JICAgIHNyY19vYS0+b19mbGFncyA9PSBPQkRfRkxfREVMT1JQSEFOKSB7Ci0JCS8qIHNob3VsZCBiZSB1c2VkIHdpdGggTE9WIGFueW1vcmUgKi8KLQkJTEJVRygpOwotCX0KLQotCWxvdiA9ICZleHAtPmV4cF9vYmQtPnUubG92OwotCWlmICghbG92LT5kZXNjLmxkX2FjdGl2ZV90Z3RfY291bnQpCi0JCXJldHVybiAtRUlPOwotCi0Jb2JkX2dldHJlZihleHAtPmV4cF9vYmQpOwotCS8qIFJlY3JlYXRlIGEgc3BlY2lmaWMgb2JqZWN0IGlkIGF0IHRoZSBnaXZlbiBPU1QgaW5kZXggKi8KLQlpZiAoKHNyY19vYS0+b192YWxpZCAmIE9CRF9NRF9GTEZMQUdTKSAmJgotCSAgICAoc3JjX29hLT5vX2ZsYWdzICYgT0JEX0ZMX1JFQ1JFQVRFX09CSlMpKSB7Ci0JCXJjID0gbG92X3JlY3JlYXRlKGV4cCwgc3JjX29hLCBlYSwgb3RpKTsKLQl9Ci0KLQlvYmRfcHV0cmVmKGV4cC0+ZXhwX29iZCk7Ci0JcmV0dXJuIHJjOwotfQotCiAjZGVmaW5lIEFTU0VSVF9MU01fTUFHSUMobHNtcCkJCQkJCQkgIFwKIGRvIHsJCQkJCQkJCQkgICAgXAogCUxBU1NFUlQoKGxzbXApKTsJCQkJCQlcCkBAIC0xMDY1LDU5ICs5ODAsNiBAQAogCQkgIiVwLT5sc21fbWFnaWM9JXhcbiIsIChsc21wKSwgKGxzbXApLT5sc21fbWFnaWMpOwkgICAgICBcCiB9IHdoaWxlICgwKQogCi1zdGF0aWMgaW50IGxvdl9kZXN0cm95KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKLQkJICAgICAgIHN0cnVjdCBvYmRvICpvYSwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwKLQkJICAgICAgIHN0cnVjdCBvYmRfdHJhbnNfaW5mbyAqb3RpLCBzdHJ1Y3Qgb2JkX2V4cG9ydCAqbWRfZXhwKQotewotCXN0cnVjdCBsb3ZfcmVxdWVzdF9zZXQgKnNldDsKLQlzdHJ1Y3Qgb2JkX2luZm8gb2luZm87Ci0Jc3RydWN0IGxvdl9yZXF1ZXN0ICpyZXE7Ci0Jc3RydWN0IGxvdl9vYmQgKmxvdjsKLQlpbnQgcmMgPSAwLCBlcnIgPSAwOwotCi0JQVNTRVJUX0xTTV9NQUdJQyhsc20pOwotCi0JaWYgKCFleHAgfHwgIWV4cC0+ZXhwX29iZCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlpZiAob2EtPm9fdmFsaWQgJiBPQkRfTURfRkxDT09LSUUpIHsKLQkJTEFTU0VSVChvdGkpOwotCQlMQVNTRVJUKG90aS0+b3RpX2xvZ2Nvb2tpZXMpOwotCX0KLQotCWxvdiA9ICZleHAtPmV4cF9vYmQtPnUubG92OwotCW9iZF9nZXRyZWYoZXhwLT5leHBfb2JkKTsKLQlyYyA9IGxvdl9wcmVwX2Rlc3Ryb3lfc2V0KGV4cCwgJm9pbmZvLCBvYSwgbHNtLCBvdGksICZzZXQpOwotCWlmIChyYykKLQkJZ290byBvdXQ7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcSwgJnNldC0+c2V0X2xpc3QsIHJxX2xpbmspIHsKLQkJaWYgKG9hLT5vX3ZhbGlkICYgT0JEX01EX0ZMQ09PS0lFKQotCQkJb3RpLT5vdGlfbG9nY29va2llcyA9IHNldC0+c2V0X2Nvb2tpZXMgKyByZXEtPnJxX3N0cmlwZTsKLQotCQllcnIgPSBvYmRfZGVzdHJveShlbnYsIGxvdi0+bG92X3RndHNbcmVxLT5ycV9pZHhdLT5sdGRfZXhwLAotCQkJCSAgcmVxLT5ycV9vaS5vaV9vYSwgTlVMTCwgb3RpLCBOVUxMKTsKLQkJZXJyID0gbG92X3VwZGF0ZV9jb21tb25fc2V0KHNldCwgcmVxLCBlcnIpOwotCQlpZiAoZXJyKSB7Ci0JCQlDRVJST1IoIiVzOiBkZXN0cm95aW5nIG9iamlkICJET1NUSUQiIHN1Ym9iaiAiCi0JCQkgICAgICAgRE9TVElEIiBvbiBPU1QgaWR4ICVkOiByYyA9ICVkXG4iLAotCQkJICAgICAgIGV4cC0+ZXhwX29iZC0+b2JkX25hbWUsIFBPU1RJRCgmb2EtPm9fb2kpLAotCQkJICAgICAgIFBPU1RJRCgmcmVxLT5ycV9vaS5vaV9vYS0+b19vaSksCi0JCQkgICAgICAgcmVxLT5ycV9pZHgsIGVycik7Ci0JCQlpZiAoIXJjKQotCQkJCXJjID0gZXJyOwotCQl9Ci0JfQotCi0JaWYgKHJjID09IDApCi0JCXJjID0gbHNtX29wX2ZpbmQobHNtLT5sc21fbWFnaWMpLT5sc21fZGVzdHJveShsc20sIG9hLCBtZF9leHApOwotCi0JZXJyID0gbG92X2ZpbmlfZGVzdHJveV9zZXQoc2V0KTsKLW91dDoKLQlvYmRfcHV0cmVmKGV4cC0+ZXhwX29iZCk7Ci0JcmV0dXJuIHJjID8gcmMgOiBlcnI7Ci19Ci0KIHN0YXRpYyBpbnQgbG92X2dldGF0dHJfaW50ZXJwcmV0KHN0cnVjdCBwdGxycGNfcmVxdWVzdF9zZXQgKnJxc2V0LAogCQkJCSB2b2lkICpkYXRhLCBpbnQgcmMpCiB7CkBAIC0xMjY3LDQ2ICsxMTI5LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogZmluZCBhbnkgbGRsbSBsb2NrIG9mIHRoZSBpbm9kZSBpbiBsb3YKLSAqIHJldHVybiAwICAgIG5vdCBmaW5kCi0gKgkxICAgIGZpbmQgb25lCi0gKiAgICAgIDwgMCAgICBlcnJvcgotICovCi1zdGF0aWMgaW50IGxvdl9maW5kX2NiZGF0YShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAotCQkJICAgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwgbGRsbV9pdGVyYXRvcl90IGl0LAotCQkJICAgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbG92X29iZCAqbG92OwotCWludCByYyA9IDAsIGk7Ci0KLQlBU1NFUlRfTFNNX01BR0lDKGxzbSk7Ci0KLQlpZiAoIWV4cCB8fCAhZXhwLT5leHBfb2JkKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWxvdiA9ICZleHAtPmV4cF9vYmQtPnUubG92OwotCWZvciAoaSA9IDA7IGkgPCBsc20tPmxzbV9zdHJpcGVfY291bnQ7IGkrKykgewotCQlzdHJ1Y3QgbG92X3N0cmlwZV9tZCBzdWJtZDsKLQkJc3RydWN0IGxvdl9vaW5mbyAqbG9pID0gbHNtLT5sc21fb2luZm9baV07Ci0KLQkJaWYgKGxvdl9vaW5mb19pc19kdW1teShsb2kpKQotCQkJY29udGludWU7Ci0KLQkJaWYgKCFsb3YtPmxvdl90Z3RzW2xvaS0+bG9pX29zdF9pZHhdKSB7Ci0JCQlDREVCVUcoRF9IQSwgImxvdiBpZHggJWQgTlVMTFxuIiwgbG9pLT5sb2lfb3N0X2lkeCk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXN1Ym1kLmxzbV9vaSA9IGxvaS0+bG9pX29pOwotCQlzdWJtZC5sc21fc3RyaXBlX2NvdW50ID0gMDsKLQkJcmMgPSBvYmRfZmluZF9jYmRhdGEobG92LT5sb3ZfdGd0c1tsb2ktPmxvaV9vc3RfaWR4XS0+bHRkX2V4cCwKLQkJCQkgICAgICZzdWJtZCwgaXQsIGRhdGEpOwotCQlpZiAocmMgIT0gMCkKLQkJCXJldHVybiByYzsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCiBpbnQgbG92X3N0YXRmc19pbnRlcnByZXQoc3RydWN0IHB0bHJwY19yZXF1ZXN0X3NldCAqcnFzZXQsIHZvaWQgKmRhdGEsIGludCByYykKIHsKIAlzdHJ1Y3QgbG92X3JlcXVlc3Rfc2V0ICpsb3ZzZXQgPSAoc3RydWN0IGxvdl9yZXF1ZXN0X3NldCAqKWRhdGE7CkBAIC0xNDYwLDcgKzEyODIsNyBAQAogCQl9CiAKIAkJZGVzYyA9IChzdHJ1Y3QgbG92X2Rlc2MgKilkYXRhLT5pb2NfaW5sYnVmMTsKLQkJbWVtY3B5KGRlc2MsICYobG92LT5kZXNjKSwgc2l6ZW9mKCpkZXNjKSk7CisJCW1lbWNweShkZXNjLCAmbG92LT5kZXNjLCBzaXplb2YoKmRlc2MpKTsKIAogCQl1dWlkcCA9IChzdHJ1Y3Qgb2JkX3V1aWQgKilkYXRhLT5pb2NfaW5sYnVmMjsKIAkJZ2VucCA9IChfX3UzMiAqKWRhdGEtPmlvY19pbmxidWYzOwpAQCAtMTQ3Nyw5ICsxMjk5LDYgQEAKIAkJb2JkX2lvY3RsX2ZyZWVkYXRhKGJ1ZiwgbGVuKTsKIAkJYnJlYWs7CiAJfQotCWNhc2UgTExfSU9DX0xPVl9HRVRTVFJJUEU6Ci0JCXJjID0gbG92X2dldHN0cmlwZShleHAsIGthcmcsIHVhcmcpOwotCQlicmVhazsKIAljYXNlIE9CRF9JT0NfUVVPVEFDVEw6IHsKIAkJc3RydWN0IGlmX3F1b3RhY3RsICpxY3RsID0ga2FyZzsKIAkJc3RydWN0IGxvdl90Z3RfZGVzYyAqdGd0ID0gTlVMTDsKQEAgLTE3MjYsNiArMTU0NSw4IEBACiAJdTY0IGZtX3N0YXJ0LCBmbV9lbmQsIGZtX2xlbmd0aCwgZm1fZW5kX29mZnNldDsKIAl1NjQgY3Vycl9sb2M7CiAJaW50IGN1cnJlbnRfZXh0ZW50ID0gMCwgcmMgPSAwLCBpOworCS8qIFdoZXRoZXIgaGF2ZSB3ZSBjb2xsZWN0ZWQgZW5vdWdoIGV4dGVudHMgKi8KKwlib29sIGVub3VnaCA9IGZhbHNlOwogCWludCBvc3RfZW9mID0gMDsgLyogRU9GIGZvciBvYmplY3QgKi8KIAlpbnQgb3N0X2RvbmUgPSAwOyAvKiBkb25lIHdpdGggcmVxdWlyZWQgbWFwcGluZyBmb3IgdGhpcyBPU1Q/ICovCiAJaW50IGxhc3Rfc3RyaXBlOwpAQCAtMTg2MCw3ICsxNjgxLDcgQEAKIAkJCWx1bl9zdGFydCArPSBsZW5fbWFwcGVkX3NpbmdsZV9jYWxsOwogCQkJZm1fbG9jYWwtPmZtX2xlbmd0aCA9IHJlcV9mbV9sZW4gLSBsZW5fbWFwcGVkX3NpbmdsZV9jYWxsOwogCQkJcmVxX2ZtX2xlbiA9IGZtX2xvY2FsLT5mbV9sZW5ndGg7Ci0JCQlmbV9sb2NhbC0+Zm1fZXh0ZW50X2NvdW50ID0gY291bnRfbG9jYWw7CisJCQlmbV9sb2NhbC0+Zm1fZXh0ZW50X2NvdW50ID0gZW5vdWdoID8gMSA6IGNvdW50X2xvY2FsOwogCQkJZm1fbG9jYWwtPmZtX21hcHBlZF9leHRlbnRzID0gMDsKIAkJCWZtX2xvY2FsLT5mbV9mbGFncyA9IGZpZW1hcC0+Zm1fZmxhZ3M7CiAKQEAgLTE5MDgsNiArMTcyOSwxMiBAQAogCQkJCQlnb3RvIGZpbmlzaDsKIAkJCQl9CiAJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKGVub3VnaCkgeworCQkJCS8qCisJCQkJICogV2UndmUgY29sbGVjdGVkIGVub3VnaCBleHRlbnRzIGFuZCB0aGVyZSBhcmUKKwkJCQkgKiBtb3JlIGV4dGVudHMgYWZ0ZXIgaXQuCisJCQkJICovCisJCQkJZ290byBmaW5pc2g7CiAJCQl9CiAKIAkJCS8qIElmIHdlIGp1c3QgbmVlZCBudW0gb2YgZXh0ZW50cyB0aGVuIGdvIHRvIG5leHQgZGV2aWNlICovCkBAIC0xOTE2LDggKzE3NDMsOSBAQAogCQkJCWJyZWFrOwogCQkJfQogCi0JCQlsZW5fbWFwcGVkX3NpbmdsZV9jYWxsID0gbGNsX2ZtX2V4dFtleHRfY291bnQtMV0uZmVfbG9naWNhbCAtCi0JCQkJICBsdW5fc3RhcnQgKyBsY2xfZm1fZXh0W2V4dF9jb3VudCAtIDFdLmZlX2xlbmd0aDsKKwkJCWxlbl9tYXBwZWRfc2luZ2xlX2NhbGwgPQorCQkJCWxjbF9mbV9leHRbZXh0X2NvdW50IC0gMV0uZmVfbG9naWNhbCAtCisJCQkJbHVuX3N0YXJ0ICsgbGNsX2ZtX2V4dFtleHRfY291bnQgLSAxXS5mZV9sZW5ndGg7CiAKIAkJCS8qIEhhdmUgd2UgZmluaXNoZWQgbWFwcGluZyBvbiB0aGlzIGRldmljZT8gKi8KIAkJCWlmIChyZXFfZm1fbGVuIDw9IGxlbl9tYXBwZWRfc2luZ2xlX2NhbGwpCkBAIC0xOTI2LDE0ICsxNzU0LDE1IEBACiAJCQkvKiBDbGVhciB0aGUgRVhURU5UX0xBU1QgZmxhZyB3aGljaCBjYW4gYmUgcHJlc2VudCBvbgogCQkJICogbGFzdCBleHRlbnQKIAkJCSAqLwotCQkJaWYgKGxjbF9mbV9leHRbZXh0X2NvdW50LTFdLmZlX2ZsYWdzICYgRklFTUFQX0VYVEVOVF9MQVNUKQorCQkJaWYgKGxjbF9mbV9leHRbZXh0X2NvdW50IC0gMV0uZmVfZmxhZ3MgJgorCQkJICAgIEZJRU1BUF9FWFRFTlRfTEFTVCkKIAkJCQlsY2xfZm1fZXh0W2V4dF9jb3VudCAtIDFdLmZlX2ZsYWdzICY9CiAJCQkJCQkJICAgIH5GSUVNQVBfRVhURU5UX0xBU1Q7CiAKIAkJCWN1cnJfbG9jID0gbG92X3N0cmlwZV9zaXplKGxzbSwKLQkJCQkJICAgbGNsX2ZtX2V4dFtleHRfY291bnQgLSAxXS5mZV9sb2dpY2FsKwotCQkJCQkgICBsY2xfZm1fZXh0W2V4dF9jb3VudCAtIDFdLmZlX2xlbmd0aCwKLQkJCQkJICAgY3VyX3N0cmlwZSk7CisJCQkJCWxjbF9mbV9leHRbZXh0X2NvdW50IC0gMV0uZmVfbG9naWNhbCArCisJCQkJCWxjbF9mbV9leHRbZXh0X2NvdW50IC0gMV0uZmVfbGVuZ3RoLAorCQkJCQljdXJfc3RyaXBlKTsKIAkJCWlmIChjdXJyX2xvYyA+PSBmbV9rZXktPm9hLm9fc2l6ZSkKIAkJCQlvc3RfZW9mID0gMTsKIApAQCAtMTk0NSw3ICsxNzc0LDcgQEAKIAogCQkJLyogUmFuIG91dCBvZiBhdmFpbGFibGUgZXh0ZW50cz8gKi8KIAkJCWlmIChjdXJyZW50X2V4dGVudCA+PSBmaWVtYXAtPmZtX2V4dGVudF9jb3VudCkKLQkJCQlnb3RvIGZpbmlzaDsKKwkJCQllbm91Z2ggPSB0cnVlOwogCQl9IHdoaWxlIChvc3RfZG9uZSA9PSAwICYmIG9zdF9lb2YgPT0gMCk7CiAKIAkJaWYgKGN1cl9zdHJpcGVfd3JhcCA9PSBsYXN0X3N0cmlwZSkKQEAgLTE5ODUsNzMgKzE4MTQsMTQgQEAKIHsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkZGV2ID0gY2xhc3NfZXhwMm9iZChleHApOwogCXN0cnVjdCBsb3Zfb2JkICpsb3YgPSAmb2JkZGV2LT51LmxvdjsKLQlpbnQgaSwgcmM7CisJaW50IHJjOwogCiAJaWYgKCF2YWxsZW4gfHwgIXZhbCkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlvYmRfZ2V0cmVmKG9iZGRldik7CiAKLQlpZiAoS0VZX0lTKEtFWV9MT0NLX1RPX1NUUklQRSkpIHsKLQkJc3RydWN0IHsKLQkJCWNoYXIgbmFtZVsxNl07Ci0JCQlzdHJ1Y3QgbGRsbV9sb2NrICpsb2NrOwotCQl9ICpkYXRhID0ga2V5OwotCQlzdHJ1Y3QgbGRsbV9yZXNfaWQgKnJlc19pZCA9ICZkYXRhLT5sb2NrLT5sX3Jlc291cmNlLT5scl9uYW1lOwotCQlzdHJ1Y3QgbG92X29pbmZvICpsb2k7Ci0JCV9fdTMyICpzdHJpcGUgPSB2YWw7Ci0KLQkJaWYgKCp2YWxsZW4gPCBzaXplb2YoKnN0cmlwZSkpIHsKLQkJCXJjID0gLUVGQVVMVDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCSp2YWxsZW4gPSBzaXplb2YoKnN0cmlwZSk7Ci0KLQkJLyogWFhYIFRoaXMgaXMgYW5vdGhlciBvbmUgb2YgdGhvc2UgYml0cyB0aGF0IHdpbGwgbmVlZCB0bwotCQkgKiBjaGFuZ2UgaWYgd2UgZXZlciBhY3R1YWxseSBzdXBwb3J0IG5lc3RlZCBMT1ZzLiAgSXQgdXNlcwotCQkgKiB0aGUgbG9jaydzIGV4cG9ydCB0byBmaW5kIG91dCB3aGljaCBzdHJpcGUgaXQgaXMuCi0JCSAqLwotCQkvKiBYWFggLSBpdCdzIGFzc3VtZWQgYWxsIHRoZSBsb2NrcyBmb3IgZGVsZXRlZCBPU1RzIGhhdmUKLQkJICogYmVlbiBjYW5jZWxsZWQuIEFsc28sIHRoZSBleHBvcnQgZm9yIGRlbGV0ZWQgT1NUcyB3aWxsCi0JCSAqIGJlIE5VTEwgYW5kIHdvbid0IG1hdGNoIHRoZSBsb2NrJ3MgZXhwb3J0LgotCQkgKi8KLQkJZm9yIChpID0gMDsgaSA8IGxzbS0+bHNtX3N0cmlwZV9jb3VudDsgaSsrKSB7Ci0JCQlsb2kgPSBsc20tPmxzbV9vaW5mb1tpXTsKLQkJCWlmIChsb3Zfb2luZm9faXNfZHVtbXkobG9pKSkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKCFsb3YtPmxvdl90Z3RzW2xvaS0+bG9pX29zdF9pZHhdKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGxvdi0+bG92X3RndHNbbG9pLT5sb2lfb3N0X2lkeF0tPmx0ZF9leHAgPT0KLQkJCSAgICBkYXRhLT5sb2NrLT5sX2Nvbm5fZXhwb3J0ICYmCi0JCQkgICAgb3N0aWRfcmVzX25hbWVfZXEoJmxvaS0+bG9pX29pLCByZXNfaWQpKSB7Ci0JCQkJKnN0cmlwZSA9IGk7Ci0JCQkJcmMgPSAwOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9Ci0JCUxETE1fRVJST1IoZGF0YS0+bG9jaywgImxvY2sgb24gaW5vZGUgd2l0aG91dCBzdWNoIG9iamVjdCIpOwotCQlkdW1wX2xzbShEX0VSUk9SLCBsc20pOwotCQlyYyA9IC1FTlhJTzsKLQkJZ290byBvdXQ7Ci0JfSBlbHNlIGlmIChLRVlfSVMoS0VZX0xBU1RfSUQpKSB7Ci0JCXN0cnVjdCBvYmRfaWRfaW5mbyAqaW5mbyA9IHZhbDsKLQkJX191MzIgc2l6ZSA9IHNpemVvZih1NjQpOwotCQlzdHJ1Y3QgbG92X3RndF9kZXNjICp0Z3Q7Ci0KLQkJTEFTU0VSVCgqdmFsbGVuID09IHNpemVvZihzdHJ1Y3Qgb2JkX2lkX2luZm8pKTsKLQkJdGd0ID0gbG92LT5sb3ZfdGd0c1tpbmZvLT5pZHhdOwotCi0JCWlmICghdGd0IHx8ICF0Z3QtPmx0ZF9hY3RpdmUpIHsKLQkJCXJjID0gLUVTUkNIOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlyYyA9IG9iZF9nZXRfaW5mbyhlbnYsIHRndC0+bHRkX2V4cCwga2V5bGVuLCBrZXksCi0JCQkJICAmc2l6ZSwgaW5mby0+ZGF0YSwgTlVMTCk7Ci0JCXJjID0gMDsKLQkJZ290byBvdXQ7Ci0JfSBlbHNlIGlmIChLRVlfSVMoS0VZX0xPVkRFU0MpKSB7CisJaWYgKEtFWV9JUyhLRVlfTE9WREVTQykpIHsKIAkJc3RydWN0IGxvdl9kZXNjICpkZXNjX3JldCA9IHZhbDsKIAkJKmRlc2NfcmV0ID0gbG92LT5kZXNjOwogCkBAIC0yMDYwLDIyICsxODMwLDYgQEAKIAl9IGVsc2UgaWYgKEtFWV9JUyhLRVlfRklFTUFQKSkgewogCQlyYyA9IGxvdl9maWVtYXAobG92LCBrZXlsZW4sIGtleSwgdmFsbGVuLCB2YWwsIGxzbSk7CiAJCWdvdG8gb3V0OwotCX0gZWxzZSBpZiAoS0VZX0lTKEtFWV9DT05ORUNUX0ZMQUcpKSB7Ci0JCXN0cnVjdCBsb3ZfdGd0X2Rlc2MgKnRndDsKLQkJX191NjQgb3N0X2lkeCA9ICooKF9fdTY0ICopdmFsKTsKLQotCQlMQVNTRVJUKCp2YWxsZW4gPT0gc2l6ZW9mKF9fdTY0KSk7Ci0JCUxBU1NFUlQob3N0X2lkeCA8IGxvdi0+ZGVzYy5sZF90Z3RfY291bnQpOwotCQl0Z3QgPSBsb3YtPmxvdl90Z3RzW29zdF9pZHhdOwotCi0JCWlmICghdGd0IHx8ICF0Z3QtPmx0ZF9leHApIHsKLQkJCXJjID0gLUVTUkNIOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQkqKChfX3U2NCAqKXZhbCkgPSBleHBfY29ubmVjdF9mbGFncyh0Z3QtPmx0ZF9leHApOwotCQlyYyA9IDA7Ci0JCWdvdG8gb3V0OwogCX0gZWxzZSBpZiAoS0VZX0lTKEtFWV9UR1RfQ09VTlQpKSB7CiAJCSooKGludCAqKXZhbCkgPSBsb3YtPmRlc2MubGRfdGd0X2NvdW50OwogCQlyYyA9IDA7CkBAIC0yMDk4LDggKzE4NTIsNyBAQAogCXUzMiBjb3VudDsKIAlpbnQgaSwgcmMgPSAwLCBlcnI7CiAJc3RydWN0IGxvdl90Z3RfZGVzYyAqdGd0OwotCXVuc2lnbmVkIGludCBpbmNyID0gMCwgY2hlY2tfdXVpZCA9IDAsIGRvX2luYWN0aXZlID0gMCwgbm9fc2V0ID0gMDsKLQl1bnNpZ25lZCBpbnQgbmV4dF9pZCA9IDAsIG1kc19jb24gPSAwOworCWludCBkb19pbmFjdGl2ZSA9IDAsIG5vX3NldCA9IDA7CiAKIAlpZiAoIXNldCkgewogCQlub19zZXQgPSAxOwpAQCAtMjExMSwxOCArMTg2NCw4IEBACiAJb2JkX2dldHJlZihvYmRkZXYpOwogCWNvdW50ID0gbG92LT5kZXNjLmxkX3RndF9jb3VudDsKIAotCWlmIChLRVlfSVMoS0VZX05FWFRfSUQpKSB7Ci0JCWNvdW50ID0gdmFsbGVuIC8gc2l6ZW9mKHN0cnVjdCBvYmRfaWRfaW5mbyk7Ci0JCXZhbGxlbiA9IHNpemVvZih1NjQpOwotCQlpbmNyID0gc2l6ZW9mKHN0cnVjdCBvYmRfaWRfaW5mbyk7CisJaWYgKEtFWV9JUyhLRVlfQ0hFQ0tTVU0pKSB7CiAJCWRvX2luYWN0aXZlID0gMTsKLQkJbmV4dF9pZCA9IDE7Ci0JfSBlbHNlIGlmIChLRVlfSVMoS0VZX0NIRUNLU1VNKSkgewotCQlkb19pbmFjdGl2ZSA9IDE7Ci0JfSBlbHNlIGlmIChLRVlfSVMoS0VZX0VWSUNUX0JZX05JRCkpIHsKLQkJLyogdXNlIGRlZmF1bHRzOiAgZG9faW5hY3RpdmUgPSBpbmNyID0gMDsgKi8KLQl9IGVsc2UgaWYgKEtFWV9JUyhLRVlfTURTX0NPTk4pKSB7Ci0JCW1kc19jb24gPSAxOwogCX0gZWxzZSBpZiAoS0VZX0lTKEtFWV9DQUNIRV9TRVQpKSB7CiAJCUxBU1NFUlQoIWxvdi0+bG92X2NhY2hlKTsKIAkJbG92LT5sb3ZfY2FjaGUgPSB2YWw7CkBAIC0yMTMwLDExICsxODczLDkgQEAKIAkJY2xfY2FjaGVfaW5jcmVmKGxvdi0+bG92X2NhY2hlKTsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgdmFsID0gKGNoYXIgKil2YWwgKyBpbmNyKSB7Ci0JCWlmIChuZXh0X2lkKQotCQkJdGd0ID0gbG92LT5sb3ZfdGd0c1soKHN0cnVjdCBvYmRfaWRfaW5mbyAqKXZhbCktPmlkeF07Ci0JCWVsc2UKLQkJCXRndCA9IGxvdi0+bG92X3RndHNbaV07CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJdGd0ID0gbG92LT5sb3ZfdGd0c1tpXTsKKwogCQkvKiBPU1Qgd2FzIGRpc2Nvbm5lY3RlZCAqLwogCQlpZiAoIXRndCB8fCAhdGd0LT5sdGRfZXhwKQogCQkJY29udGludWU7CkBAIC0yMTQzLDM0ICsxODg0LDggQEAKIAkJaWYgKCF0Z3QtPmx0ZF9hY3RpdmUgJiYgIWRvX2luYWN0aXZlKQogCQkJY29udGludWU7CiAKLQkJaWYgKG1kc19jb24pIHsKLQkJCXN0cnVjdCBtZHNfZ3JvdXBfaW5mbyAqbWdpOwotCi0JCQlMQVNTRVJUKHZhbGxlbiA9PSBzaXplb2YoKm1naSkpOwotCQkJbWdpID0gKHN0cnVjdCBtZHNfZ3JvdXBfaW5mbyAqKXZhbDsKLQotCQkJLyogT25seSB3YW50IGEgc3BlY2lmaWMgT1NDICovCi0JCQlpZiAobWdpLT51dWlkICYmICFvYmRfdXVpZF9lcXVhbHMobWdpLT51dWlkLAotCQkJCQkJCSAgJnRndC0+bHRkX3V1aWQpKQotCQkJCWNvbnRpbnVlOwotCi0JCQllcnIgPSBvYmRfc2V0X2luZm9fYXN5bmMoZW52LCB0Z3QtPmx0ZF9leHAsCi0JCQkJCQkga2V5bGVuLCBrZXksIHNpemVvZihpbnQpLAotCQkJCQkJICZtZ2ktPmdyb3VwLCBzZXQpOwotCQl9IGVsc2UgaWYgKG5leHRfaWQpIHsKLQkJCWVyciA9IG9iZF9zZXRfaW5mb19hc3luYyhlbnYsIHRndC0+bHRkX2V4cCwKLQkJCQkJIGtleWxlbiwga2V5LCB2YWxsZW4sCi0JCQkJCSAoKHN0cnVjdCBvYmRfaWRfaW5mbyAqKXZhbCktPmRhdGEsIHNldCk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBPbmx5IHdhbnQgYSBzcGVjaWZpYyBPU0MgKi8KLQkJCWlmIChjaGVja191dWlkICYmCi0JCQkgICAgIW9iZF91dWlkX2VxdWFscyh2YWwsICZ0Z3QtPmx0ZF91dWlkKSkKLQkJCQljb250aW51ZTsKLQotCQkJZXJyID0gb2JkX3NldF9pbmZvX2FzeW5jKGVudiwgdGd0LT5sdGRfZXhwLAotCQkJCQkJIGtleWxlbiwga2V5LCB2YWxsZW4sIHZhbCwgc2V0KTsKLQkJfQotCisJCWVyciA9IG9iZF9zZXRfaW5mb19hc3luYyhlbnYsIHRndC0+bHRkX2V4cCwga2V5bGVuLCBrZXksCisJCQkJCSB2YWxsZW4sIHZhbCwgc2V0KTsKIAkJaWYgKCFyYykKIAkJCXJjID0gZXJyOwogCX0KQEAgLTIzMTgsMTIgKzIwMzMsOCBAQAogCS5zdGF0ZnNfYXN5bmMgICA9IGxvdl9zdGF0ZnNfYXN5bmMsCiAJLnBhY2ttZCAgICAgICAgID0gbG92X3BhY2ttZCwKIAkudW5wYWNrbWQgICAgICAgPSBsb3ZfdW5wYWNrbWQsCi0JLmNyZWF0ZSAgICAgICAgID0gbG92X2NyZWF0ZSwKLQkuZGVzdHJveSAgICAgICAgPSBsb3ZfZGVzdHJveSwKIAkuZ2V0YXR0cl9hc3luYyAgPSBsb3ZfZ2V0YXR0cl9hc3luYywKIAkuc2V0YXR0cl9hc3luYyAgPSBsb3Zfc2V0YXR0cl9hc3luYywKLQkuYWRqdXN0X2ttcyAgICAgPSBsb3ZfYWRqdXN0X2ttcywKLQkuZmluZF9jYmRhdGEgICAgPSBsb3ZfZmluZF9jYmRhdGEsCiAJLmlvY29udHJvbCAgICAgID0gbG92X2lvY29udHJvbCwKIAkuZ2V0X2luZm8gICAgICAgPSBsb3ZfZ2V0X2luZm8sCiAJLnNldF9pbmZvX2FzeW5jID0gbG92X3NldF9pbmZvX2FzeW5jLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9vYmplY3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3Zfb2JqZWN0LmMKaW5kZXggZjk2MjFiMC4uNTJmNzM2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9vYmplY3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X29iamVjdC5jCkBAIC03NSw2ICs3NSwxMyBAQAogCiBzdGF0aWMgaW50IGxvdl9sYXlvdXRfd2FpdChjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBsb3Zfb2JqZWN0ICpsb3YpOwogCit2b2lkIGxvdl9sc21fcHV0KHN0cnVjdCBjbF9vYmplY3QgKnVudXNlZCwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSkKK3sKKwlpZiAobHNtKQorCQlsb3ZfZnJlZV9tZW1tZCgmbHNtKTsKK30KK0VYUE9SVF9TWU1CT0wobG92X2xzbV9wdXQpOworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBMb3Ygb2JqZWN0IGxheW91dCBvcGVyYXRpb25zLgpAQCAtMTk1LDYgKzIwMiwxMCBAQAogCXN0cnVjdCBjbF9vYmplY3RfaGVhZGVyICpoZHIgPSBjbF9vYmplY3RfaGVhZGVyKCZsb3YtPmxvX2NsKTsKIAlzdHJ1Y3QgY2xfb2JqZWN0ICpvOwogCisJaWYgKCFzdHJpcGUpCisJCXJldHVybiBoZHItPmNvaF9wYWdlX2J1ZnNpemUgLSBsb3YtPmxvX2NsLmNvX3NsaWNlX29mZiAtCisJCSAgICAgICBjZnNfc2l6ZV9yb3VuZChzaXplb2Yoc3RydWN0IGxvdl9wYWdlKSk7CisKIAljbF9vYmplY3RfZm9yX2VhY2gobywgc3RyaXBlKQogCQlvLT5jb19zbGljZV9vZmYgKz0gaGRyLT5jb2hfcGFnZV9idWZzaXplOwogCkBAIC0yMjQsNiArMjM1LDcgQEAKIAogCUxBU1NFUlQoIWxvdi0+bG9fbHNtKTsKIAlsb3YtPmxvX2xzbSA9IGxzbV9hZGRyZWYobHNtKTsKKwlsb3YtPmxvX2xheW91dF9pbnZhbGlkID0gdHJ1ZTsKIAlyMC0+bG9fbnIgID0gbHNtLT5sc21fc3RyaXBlX2NvdW50OwogCUxBU1NFUlQocjAtPmxvX25yIDw9IGxvdl90YXJnZXRzX25yKGRldikpOwogCkBAIC03MTksNiArNzMxLDEwIEBACiAJCUxBU1NFUlQoYXRvbWljX3JlYWQoJmxvdi0+bG9fYWN0aXZlX2lvcykgPT0gMCk7CiAKIAkJbG92LT5sb190eXBlID0gTExUX0VNUFRZOworCQkvKiBwYWdlIGJ1ZnNpemUgZml4dXAgKi8KKwkJY2xfb2JqZWN0X2hlYWRlcigmbG92LT5sb19jbCktPmNvaF9wYWdlX2J1ZnNpemUgLT0KKwkJCWxvdl9wYWdlX3NsaWNlX2ZpeHVwKGxvdiwgTlVMTCk7CisKIAkJcmVzdWx0ID0gbmV3X29wcy0+bGxvX2luaXQoZW52LAogCQkJCQlsdTJsb3ZfZGV2KGxvdi0+bG9fY2wuY29fbHUubG9fZGV2KSwKIAkJCQkJbG92LCBjb25mLCBzdGF0ZSk7CkBAIC04NzgsOCArODk0LDggQEAKIAlyZXR1cm4gTE9WXzJESVNQQVRDSF9OT0xPQ0soY2wybG92KG9iaiksIGxsb19nZXRhdHRyLCBlbnYsIG9iaiwgYXR0cik7CiB9CiAKLXN0YXRpYyBpbnQgbG92X2F0dHJfc2V0KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsX29iamVjdCAqb2JqLAotCQkJY29uc3Qgc3RydWN0IGNsX2F0dHIgKmF0dHIsIHVuc2lnbmVkIHZhbGlkKQorc3RhdGljIGludCBsb3ZfYXR0cl91cGRhdGUoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmosCisJCQkgICBjb25zdCBzdHJ1Y3QgY2xfYXR0ciAqYXR0ciwgdW5zaWduZWQgaW50IHZhbGlkKQogewogCS8qCiAJICogTm8gZGlzcGF0Y2ggaXMgcmVxdWlyZWQgaGVyZSwgYXMgbm8gbGF5b3V0IGltcGxlbWVudHMgdGhpcy4KQEAgLTg5NSwxMyArOTExLDMwIEBACiAJCQkJICAgIGlvKTsKIH0KIAorc3RhdGljIGludCBsb3Zfb2JqZWN0X2dldHN0cmlwZShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBjbF9vYmplY3QgKm9iaiwKKwkJCQlzdHJ1Y3QgbG92X3VzZXJfbWQgX191c2VyICpsdW0pCit7CisJc3RydWN0IGxvdl9vYmplY3QgKmxvdiA9IGNsMmxvdihvYmopOworCXN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc207CisJaW50IHJjID0gMDsKKworCWxzbSA9IGxvdl9sc21fYWRkcmVmKGxvdik7CisJaWYgKCFsc20pCisJCXJldHVybiAtRU5PREFUQTsKKworCXJjID0gbG92X2dldHN0cmlwZShjbDJsb3Yob2JqKSwgbHNtLCBsdW0pOworCWxvdl9sc21fcHV0KG9iaiwgbHNtKTsKKwlyZXR1cm4gcmM7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xfb2JqZWN0X29wZXJhdGlvbnMgbG92X29wcyA9IHsKIAkuY29vX3BhZ2VfaW5pdCA9IGxvdl9wYWdlX2luaXQsCiAJLmNvb19sb2NrX2luaXQgPSBsb3ZfbG9ja19pbml0LAogCS5jb29faW9faW5pdCAgID0gbG92X2lvX2luaXQsCiAJLmNvb19hdHRyX2dldCAgPSBsb3ZfYXR0cl9nZXQsCi0JLmNvb19hdHRyX3NldCAgPSBsb3ZfYXR0cl9zZXQsCi0JLmNvb19jb25mX3NldCAgPSBsb3ZfY29uZl9zZXQKKwkuY29vX2F0dHJfdXBkYXRlID0gbG92X2F0dHJfdXBkYXRlLAorCS5jb29fY29uZl9zZXQgID0gbG92X2NvbmZfc2V0LAorCS5jb29fZ2V0c3RyaXBlID0gbG92X29iamVjdF9nZXRzdHJpcGUKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbHVfb2JqZWN0X29wZXJhdGlvbnMgbG92X2x1X29ial9vcHMgPSB7CkBAIC05MzgsNyArOTcxLDcgQEAKIAlyZXR1cm4gb2JqOwogfQogCi1zdGF0aWMgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxvdl9sc21fYWRkcmVmKHN0cnVjdCBsb3Zfb2JqZWN0ICpsb3YpCitzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbG92X2xzbV9hZGRyZWYoc3RydWN0IGxvdl9vYmplY3QgKmxvdikKIHsKIAlzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtID0gTlVMTDsKIApAQCAtOTY5LDEzICsxMDAyLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0wobG92X2xzbV9nZXQpOwogCi12b2lkIGxvdl9sc21fcHV0KHN0cnVjdCBjbF9vYmplY3QgKnVudXNlZCwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSkKLXsKLQlpZiAobHNtKQotCQlsb3ZfZnJlZV9tZW1tZCgmbHNtKTsKLX0KLUVYUE9SVF9TWU1CT0wobG92X2xzbV9wdXQpOwotCiBpbnQgbG92X3JlYWRfYW5kX2NsZWFyX2FzeW5jX3JjKHN0cnVjdCBjbF9vYmplY3QgKmNsb2IpCiB7CiAJc3RydWN0IGx1X29iamVjdCAqbHVvYmo7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X3BhY2suYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcGFjay5jCmluZGV4IDg2OWVmNDEuLmJlNmU5ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcGFjay5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcGFjay5jCkBAIC00NSw2ICs0NSw3IEBACiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmUvbHVzdHJlX3VzZXIuaCIKIAogI2luY2x1ZGUgImxvdl9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxvdl9jbF9pbnRlcm5hbC5oIgogCiB2b2lkIGxvdl9kdW1wX2xtbV9jb21tb24oaW50IGxldmVsLCB2b2lkICpsbW1wKQogewpAQCAtMTA0LDExICsxMDUsOSBAQAogICogICAgIExPVnMgcHJvcGVybHkuICBGb3Igbm93IGxvdl9tZHNfbWRfc2l6ZSgpIGp1c3QgYXNzdW1lcyBvbmUgdTY0CiAgKiAgICAgcGVyIHN0cmlwZS4KICAqLwotaW50IGxvdl9wYWNrbWQoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxvdl9tZHNfbWQgKipsbW1wLAotCSAgICAgICBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtKQoraW50IGxvdl9vYmRfcGFja21kKHN0cnVjdCBsb3Zfb2JkICpsb3YsIHN0cnVjdCBsb3ZfbWRzX21kICoqbG1tcCwKKwkJICAgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSkKIHsKLQlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkID0gY2xhc3NfZXhwMm9iZChleHApOwotCXN0cnVjdCBsb3Zfb2JkICpsb3YgPSAmb2JkLT51LmxvdjsKIAlzdHJ1Y3QgbG92X21kc19tZF92MSAqbG1tdjE7CiAJc3RydWN0IGxvdl9tZHNfbWRfdjMgKmxtbXYzOwogCV9fdTE2IHN0cmlwZV9jb3VudDsKQEAgLTE0OCwxNiArMTQ3LDExIEBACiAJCQlzdHJpcGVfY291bnQgPSAwOwogCQl9CiAJfSBlbHNlIHsKLQkJLyogTm8gbmVlZCB0byBhbGxvY2F0ZSBtb3JlIHRoYW4gbWF4aW11bSBzdXBwb3J0ZWQgc3RyaXBlcy4KLQkJICogQW55d2F5LCB0aGlzIGlzIHByZXR0eSBpbmFjY3VyYXRlIHNpbmNlIGxkX3RndF9jb3VudCBub3cKLQkJICogcmVwcmVzZW50cyBtYXggaW5kZXggYW5kIHdlIHNob3VsZCByZWx5IG9uIHRoZSBhY3R1YWwgbnVtYmVyCi0JCSAqIG9mIE9TVHMgaW5zdGVhZAorCQkvKgorCQkgKiBUbyBjYWxjdWxhdGUgbWF4aW11bSBlYXNpemUgYnkgYWN0aXZlIHRhcmdldHMgYXQgcHJlc2VudCwKKwkJICogd2hpY2ggaXMgZXhhY3RseSB0aGUgbWF4aW11bSBlYXNpemUgdG8gYmUgc2VlbiBieSBMT1YKIAkJICovCi0JCXN0cmlwZV9jb3VudCA9IGxvdl9tZHNfbWRfbWF4X3N0cmlwZV9jb3VudCgKLQkJCWxvdi0+bG92X29jZC5vY2RfbWF4X2Vhc2l6ZSwgbG1tX21hZ2ljKTsKLQotCQlpZiAoc3RyaXBlX2NvdW50ID4gbG92LT5kZXNjLmxkX3RndF9jb3VudCkKLQkJCXN0cmlwZV9jb3VudCA9IGxvdi0+ZGVzYy5sZF90Z3RfY291bnQ7CisJCXN0cmlwZV9jb3VudCA9IGxvdi0+ZGVzYy5sZF9hY3RpdmVfdGd0X2NvdW50OwogCX0KIAogCS8qIFhYWCBMT1YgU1RBQ0tJTkcgY2FsbCBpbnRvIG9zYyBmb3Igc2l6ZXMgKi8KQEAgLTIyNSw2ICsyMTksMTUgQEAKIAlyZXR1cm4gbG1tX3NpemU7CiB9CiAKK2ludCBsb3ZfcGFja21kKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsb3ZfbWRzX21kICoqbG1tcCwKKwkgICAgICAgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSkKK3sKKwlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkID0gY2xhc3NfZXhwMm9iZChleHApOworCXN0cnVjdCBsb3Zfb2JkICpsb3YgPSAmb2JkLT51LmxvdjsKKworCXJldHVybiBsb3Zfb2JkX3BhY2ttZChsb3YsIGxtbXAsIGxzbSk7Cit9CisKIC8qIEZpbmQgdGhlIG1heCBzdHJpcGVjb3VudCB3ZSBzaG91bGQgdXNlICovCiBfX3UxNiBsb3ZfZ2V0X3N0cmlwZWNudChzdHJ1Y3QgbG92X29iZCAqbG92LCBfX3UzMiBtYWdpYywgX191MTYgc3RyaXBlX2NvdW50KQogewpAQCAtMjg0LDcgKzI4Nyw3IEBACiAJc3Bpbl9sb2NrX2luaXQoJigqbHNtcCktPmxzbV9sb2NrKTsKIAkoKmxzbXApLT5sc21fbWFnaWMgPSBtYWdpYzsKIAkoKmxzbXApLT5sc21fc3RyaXBlX2NvdW50ID0gc3RyaXBlX2NvdW50OwotCSgqbHNtcCktPmxzbV9tYXhieXRlcyA9IExVU1RSRV9TVFJJUEVfTUFYQllURVMgKiBzdHJpcGVfY291bnQ7CisJKCpsc21wKS0+bHNtX21heGJ5dGVzID0gTFVTVFJFX0VYVDNfU1RSSVBFX01BWEJZVEVTICogc3RyaXBlX2NvdW50OwogCSgqbHNtcCktPmxzbV9wYXR0ZXJuID0gcGF0dGVybjsKIAkoKmxzbXApLT5sc21fcG9vbF9uYW1lWzBdID0gJ1wwJzsKIAkoKmxzbXApLT5sc21fbGF5b3V0X2dlbiA9IDA7CkBAIC0zNzIsMTYgKzM3NSwxNyBAQAogICogdGhlIG1heGltdW0gbnVtYmVyIG9mIE9TVCBpbmRpY2VzIHdoaWNoIHdpbGwgZml0IGluIHRoZSB1c2VyIGJ1ZmZlci4KICAqIGxtbV9tYWdpYyBtdXN0IGJlIExPVl9VU0VSX01BR0lDLgogICovCi1pbnQgbG92X2dldHN0cmlwZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtLAoraW50IGxvdl9nZXRzdHJpcGUoc3RydWN0IGxvdl9vYmplY3QgKm9iaiwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwKIAkJICBzdHJ1Y3QgbG92X3VzZXJfbWQgX191c2VyICpsdW1wKQogewogCS8qCiAJICogWFhYIGh1Z2Ugc3RydWN0IGFsbG9jYXRlZCBvbiBzdGFjay4KIAkgKi8KIAkvKiB3ZSB1c2UgbG92X3VzZXJfbWRfdjMgYmVjYXVzZSBpdCBpcyBsYXJnZXIgdGhhbiBsb3ZfdXNlcl9tZF92MSAqLworCXN0cnVjdCBsb3Zfb2JkICpsb3Y7CiAJc3RydWN0IGxvdl91c2VyX21kX3YzIGx1bTsKIAlzdHJ1Y3QgbG92X21kc19tZCAqbG1tayA9IE5VTEw7Ci0JaW50IHJjLCBsbW1fc2l6ZTsKKwlpbnQgcmMsIGxtbWtfc2l6ZSwgbG1tX3NpemU7CiAJaW50IGx1bV9zaXplOwogCW1tX3NlZ21lbnRfdCBzZWc7CiAKQEAgLTQwMSwxMiArNDA1LDEzIEBACiAJbHVtX3NpemUgPSBzaXplb2Yoc3RydWN0IGxvdl91c2VyX21kX3YxKTsKIAlpZiAoY29weV9mcm9tX3VzZXIoJmx1bSwgbHVtcCwgbHVtX3NpemUpKSB7CiAJCXJjID0gLUVGQVVMVDsKLQkJZ290byBvdXRfc2V0OworCQlnb3RvIG91dDsKIAl9Ci0JaWYgKChsdW0ubG1tX21hZ2ljICE9IExPVl9VU0VSX01BR0lDKSAmJgotCSAgICAobHVtLmxtbV9tYWdpYyAhPSBMT1ZfVVNFUl9NQUdJQ19WMykpIHsKKwlpZiAobHVtLmxtbV9tYWdpYyAhPSBMT1ZfVVNFUl9NQUdJQ19WMSAmJgorCSAgICBsdW0ubG1tX21hZ2ljICE9IExPVl9VU0VSX01BR0lDX1YzICYmCisJICAgIGx1bS5sbW1fbWFnaWMgIT0gTE9WX1VTRVJfTUFHSUNfU1BFQ0lGSUMpIHsKIAkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIG91dF9zZXQ7CisJCWdvdG8gb3V0OwogCX0KIAogCWlmIChsdW0ubG1tX3N0cmlwZV9jb3VudCAmJgpAQCAtNDE1LDExICs0MjAsMTMgQEAKIAkJbHVtLmxtbV9zdHJpcGVfY291bnQgPSBsc20tPmxzbV9zdHJpcGVfY291bnQ7CiAJCXJjID0gY29weV90b191c2VyKGx1bXAsICZsdW0sIGx1bV9zaXplKTsKIAkJcmMgPSAtRU9WRVJGTE9XOwotCQlnb3RvIG91dF9zZXQ7CisJCWdvdG8gb3V0OwogCX0KLQlyYyA9IGxvdl9wYWNrbWQoZXhwLCAmbG1taywgbHNtKTsKKwlsb3YgPSBsdTJsb3ZfZGV2KG9iai0+bG9fY2wuY29fbHUubG9fZGV2KS0+bGRfbG92OworCXJjID0gbG92X29iZF9wYWNrbWQobG92LCAmbG1taywgbHNtKTsKIAlpZiAocmMgPCAwKQotCQlnb3RvIG91dF9zZXQ7CisJCWdvdG8gb3V0OworCWxtbWtfc2l6ZSA9IHJjOwogCWxtbV9zaXplID0gcmM7CiAJcmMgPSAwOwogCkBAIC00NTUsNyArNDYyLDcgQEAKIAkJbG1tX3NpemUgPSBsdW1fc2l6ZTsKIAl9IGVsc2UgaWYgKGx1bS5sbW1fc3RyaXBlX2NvdW50IDwgbG1tay0+bG1tX3N0cmlwZV9jb3VudCkgewogCQlyYyA9IC1FT1ZFUkZMT1c7Ci0JCWdvdG8gb3V0X3NldDsKKwkJZ290byBvdXRfZnJlZTsKIAl9CiAJLyoKIAkgKiBIYXZlIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIGxvdl9tZHNfbWQgJiBsb3ZfdXNlcl9tZC4KQEAgLTQ2OCw4ICs0NzUsOSBAQAogCWlmIChjb3B5X3RvX3VzZXIobHVtcCwgbG1taywgbG1tX3NpemUpKQogCQlyYyA9IC1FRkFVTFQ7CiAKLQlvYmRfZnJlZV9kaXNrbWQoZXhwLCAmbG1tayk7Ci1vdXRfc2V0Ogorb3V0X2ZyZWU6CisJa2ZyZWUobG1tayk7CitvdXQ6CiAJc2V0X2ZzKHNlZyk7CiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9wYWdlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X3BhZ2UuYwppbmRleCBjMTcwMjZmLi4wMGJmYWJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X3BhZ2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X3BhZ2UuYwpAQCAtNjUsNyArNjUsOSBAQAogCXBnb2ZmX3QgaW5kZXggPSAqbWF4X2luZGV4OwogCXVuc2lnbmVkIGludCBwcHM7IC8qIHBhZ2VzIHBlciBzdHJpcGUgKi8KIAotCUNERUJVRyhEX1JFQURBLCAiKm1heF9pbmRleCA9ICVsdSwgbnIgPSAlZFxuIiwgaW5kZXgsIHIwLT5sb19ucik7CisJQ0RFQlVHKERfUkVBREEsIERGSUQgIiptYXhfaW5kZXggPSAlbHUsIG5yID0gJWRcbiIsCisJICAgICAgIFBGSUQobHVfb2JqZWN0X2ZpZChsb3YybHUobG9vKSkpLCBpbmRleCwgcjAtPmxvX25yKTsKKwogCWlmIChpbmRleCA9PSAwKSAvKiB0aGUgcGFnZSBpcyBub3QgY292ZXJlZCBieSBhbnkgbG9jayAqLwogCQlyZXR1cm4gMDsKIApAQCAtODAsNyArODIsMTIgQEAKIAogCS8qIGNhbGN1bGF0ZSB0aGUgZW5kIG9mIGN1cnJlbnQgc3RyaXBlICovCiAJcHBzID0gbG9vLT5sb19sc20tPmxzbV9zdHJpcGVfc2l6ZSA+PiBQQUdFX1NISUZUOwotCWluZGV4ID0gKChzbGljZS0+Y3BsX2luZGV4ICsgcHBzKSAmIH4ocHBzIC0gMSkpIC0gMTsKKwlpbmRleCA9IHNsaWNlLT5jcGxfaW5kZXggKyBwcHMgLSBzbGljZS0+Y3BsX2luZGV4ICUgcHBzIC0gMTsKKworCUNERUJVRyhEX1JFQURBLCBERklEICIqbWF4X2luZGV4ID0gJWx1LCBpbmRleCA9ICVsdSwgcHBzID0gJXUsIHN0cmlwZV9zaXplID0gJXUsIHN0cmlwZSBubyA9ICV1LCBwYWdlIGluZGV4ID0gJWx1XG4iLAorCSAgICAgICBQRklEKGx1X29iamVjdF9maWQobG92Mmx1KGxvbykpKSwgKm1heF9pbmRleCwgaW5kZXgsIHBwcywKKwkgICAgICAgbG9vLT5sb19sc20tPmxzbV9zdHJpcGVfc2l6ZSwgbG92X3BhZ2Vfc3RyaXBlKHNsaWNlLT5jcGxfcGFnZSksCisJICAgICAgIHNsaWNlLT5jcGxfaW5kZXgpOwogCiAJLyogbmV2ZXIgZXhjZWVkIHRoZSBlbmQgb2YgdGhlIHN0cmlwZSAqLwogCSptYXhfaW5kZXggPSBtaW5fdChwZ29mZl90LCAqbWF4X2luZGV4LCBpbmRleCk7CkBAIC0xMjIsNiArMTI5LDcgQEAKIAlyYyA9IGxvdl9zdHJpcGVfb2Zmc2V0KGxvby0+bG9fbHNtLCBvZmZzZXQsIHN0cmlwZSwgJnN1Ym9mZik7CiAJTEFTU0VSVChyYyA9PSAwKTsKIAorCWxwZy0+bHBzX3N0cmlwZSA9IHN0cmlwZTsKIAljbF9wYWdlX3NsaWNlX2FkZChwYWdlLCAmbHBnLT5scHNfY2wsIG9iaiwgaW5kZXgsICZsb3ZfcmFpZDBfcGFnZV9vcHMpOwogCiAJc3ViID0gbG92X3N1Yl9nZXQoZW52LCBsaW8sIHN0cmlwZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X3Bvb2wuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcG9vbC5jCmluZGV4IDRjMmQyMTcuLmY4YzhhMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcG9vbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcG9vbC5jCkBAIC02MSw3ICs2MSw3IEBACiAJCUxBU1NFUlQoaGxpc3RfdW5oYXNoZWQoJnBvb2wtPnBvb2xfaGFzaCkpOwogCQlMQVNTRVJUKGxpc3RfZW1wdHkoJnBvb2wtPnBvb2xfbGlzdCkpOwogCQlMQVNTRVJUKCFwb29sLT5wb29sX2RlYnVnZnNfZW50cnkpOwotCQlsb3Zfb3N0X3Bvb2xfZnJlZSgmKHBvb2wtPnBvb2xfb2JkcykpOworCQlsb3Zfb3N0X3Bvb2xfZnJlZSgmcG9vbC0+cG9vbF9vYmRzKTsKIAkJa2ZyZWUocG9vbCk7CiAJfQogfQpAQCAtOTIsNyArOTIsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBMT1ZfTUFYUE9PTE5BTUU7IGkrKykgewogCQlpZiAocG9vbG5hbWVbaV0gPT0gJ1wwJykKIAkJCWJyZWFrOwotCQlyZXN1bHQgPSAocmVzdWx0IDw8IDQpXihyZXN1bHQgPj4gMjgpIF4gIHBvb2xuYW1lW2ldOworCQlyZXN1bHQgPSAocmVzdWx0IDw8IDQpIF4gKHJlc3VsdCA+PiAyOCkgXiAgcG9vbG5hbWVbaV07CiAJfQogCXJldHVybiAocmVzdWx0ICUgbWFzayk7CiB9CkBAIC0yNjAsNyArMjYwLDcgQEAKIAl0Z3QgPSBwb29sX3RndChpdGVyLT5wb29sLCBpdGVyLT5pZHgpOwogCXVwX3JlYWQoJnBvb2xfdGd0X3J3X3NlbShpdGVyLT5wb29sKSk7CiAJaWYgKHRndCkKLQkJc2VxX3ByaW50ZihzLCAiJXNcbiIsIG9iZF91dWlkMnN0cigmKHRndC0+bHRkX3V1aWQpKSk7CisJCXNlcV9wcmludGYocywgIiVzXG4iLCBvYmRfdXVpZDJzdHIoJnRndC0+bHRkX3V1aWQpKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDAwLDcgKzQwMCw3IEBACiAJc3RydWN0IHBvb2xfZGVzYyAqbmV3X3Bvb2w7CiAJaW50IHJjOwogCi0JbG92ID0gJihvYmQtPnUubG92KTsKKwlsb3YgPSAmb2JkLT51LmxvdjsKIAogCWlmIChzdHJsZW4ocG9vbG5hbWUpID4gTE9WX01BWFBPT0xOQU1FKQogCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKQEAgLTQ3MSw3ICs0NzEsNyBAQAogCXN0cnVjdCBsb3Zfb2JkICpsb3Y7CiAJc3RydWN0IHBvb2xfZGVzYyAqcG9vbDsKIAotCWxvdiA9ICYob2JkLT51Lmxvdik7CisJbG92ID0gJm9iZC0+dS5sb3Y7CiAKIAkvKiBsb29rdXAgYW5kIGtpbGwgaGFzaCByZWZlcmVuY2UgKi8KIAlwb29sID0gY2ZzX2hhc2hfZGVsX2tleShsb3YtPmxvdl9wb29sc19oYXNoX2JvZHksIHBvb2xuYW1lKTsKQEAgLTUwMyw3ICs1MDMsNyBAQAogCXVuc2lnbmVkIGludCBsb3ZfaWR4OwogCWludCByYzsKIAotCWxvdiA9ICYob2JkLT51Lmxvdik7CisJbG92ID0gJm9iZC0+dS5sb3Y7CiAKIAlwb29sID0gY2ZzX2hhc2hfbG9va3VwKGxvdi0+bG92X3Bvb2xzX2hhc2hfYm9keSwgcG9vbG5hbWUpOwogCWlmICghcG9vbCkKQEAgLTUxNyw3ICs1MTcsNyBAQAogCQlpZiAoIWxvdi0+bG92X3RndHNbbG92X2lkeF0pCiAJCQljb250aW51ZTsKIAkJaWYgKG9iZF91dWlkX2VxdWFscygmb3N0X3V1aWQsCi0JCQkJICAgICYobG92LT5sb3ZfdGd0c1tsb3ZfaWR4XS0+bHRkX3V1aWQpKSkKKwkJCQkgICAgJmxvdi0+bG92X3RndHNbbG92X2lkeF0tPmx0ZF91dWlkKSkKIAkJCWJyZWFrOwogCX0KIAkvKiB0ZXN0IGlmIG9zdCBmb3VuZCBpbiBsb3YgKi8KQEAgLTU0Nyw3ICs1NDcsNyBAQAogCXVuc2lnbmVkIGludCBsb3ZfaWR4OwogCWludCByYyA9IDA7CiAKLQlsb3YgPSAmKG9iZC0+dS5sb3YpOworCWxvdiA9ICZvYmQtPnUubG92OwogCiAJcG9vbCA9IGNmc19oYXNoX2xvb2t1cChsb3YtPmxvdl9wb29sc19oYXNoX2JvZHksIHBvb2xuYW1lKTsKIAlpZiAoIXBvb2wpCkBAIC01NjIsNyArNTYyLDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChvYmRfdXVpZF9lcXVhbHMoJm9zdF91dWlkLAotCQkJCSAgICAmKGxvdi0+bG92X3RndHNbbG92X2lkeF0tPmx0ZF91dWlkKSkpCisJCQkJICAgICZsb3YtPmxvdl90Z3RzW2xvdl9pZHhdLT5sdGRfdXVpZCkpCiAJCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcmVxdWVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9yZXF1ZXN0LmMKaW5kZXggNDA5OWI1MS4uMDlkY2FmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9yZXF1ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9yZXF1ZXN0LmMKQEAgLTMyNSw4NCArMzI1LDYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludCBsb3ZfZmluaV9kZXN0cm95X3NldChzdHJ1Y3QgbG92X3JlcXVlc3Rfc2V0ICpzZXQpCi17Ci0JaWYgKCFzZXQpCi0JCXJldHVybiAwOwotCUxBU1NFUlQoc2V0LT5zZXRfZXhwKTsKLQlpZiAoYXRvbWljX3JlYWQoJnNldC0+c2V0X2NvbXBsZXRlcykpIHsKLQkJLyogRklYTUUgdXBkYXRlIHFvcyBkYXRhIGhlcmUgKi8KLQl9Ci0KLQlsb3ZfcHV0X3JlcXNldChzZXQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBsb3ZfcHJlcF9kZXN0cm95X3NldChzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3Qgb2JkX2luZm8gKm9pbmZvLAotCQkJIHN0cnVjdCBvYmRvICpzcmNfb2EsIHN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20sCi0JCQkgc3RydWN0IG9iZF90cmFuc19pbmZvICpvdGksCi0JCQkgc3RydWN0IGxvdl9yZXF1ZXN0X3NldCAqKnJlcXNldCkKLXsKLQlzdHJ1Y3QgbG92X3JlcXVlc3Rfc2V0ICpzZXQ7Ci0Jc3RydWN0IGxvdl9vYmQgKmxvdiA9ICZleHAtPmV4cF9vYmQtPnUubG92OwotCWludCByYyA9IDAsIGk7Ci0KLQlzZXQgPSBremFsbG9jKHNpemVvZigqc2V0KSwgR0ZQX05PRlMpOwotCWlmICghc2V0KQotCQlyZXR1cm4gLUVOT01FTTsKLQlsb3ZfaW5pdF9zZXQoc2V0KTsKLQotCXNldC0+c2V0X2V4cCA9IGV4cDsKLQlzZXQtPnNldF9vaSA9IG9pbmZvOwotCXNldC0+c2V0X29pLT5vaV9tZCA9IGxzbTsKLQlzZXQtPnNldF9vaS0+b2lfb2EgPSBzcmNfb2E7Ci0JaWYgKG90aSAmJiBzcmNfb2EtPm9fdmFsaWQgJiBPQkRfTURfRkxDT09LSUUpCi0JCXNldC0+c2V0X2Nvb2tpZXMgPSBvdGktPm90aV9sb2djb29raWVzOwotCi0JZm9yIChpID0gMDsgaSA8IGxzbS0+bHNtX3N0cmlwZV9jb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCBsb3Zfb2luZm8gKmxvaTsKLQkJc3RydWN0IGxvdl9yZXF1ZXN0ICpyZXE7Ci0KLQkJbG9pID0gbHNtLT5sc21fb2luZm9baV07Ci0JCWlmIChsb3Zfb2luZm9faXNfZHVtbXkobG9pKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICghbG92X2NoZWNrX2FuZF93YWl0X2FjdGl2ZShsb3YsIGxvaS0+bG9pX29zdF9pZHgpKSB7Ci0JCQlDREVCVUcoRF9IQSwgImxvdiBpZHggJWQgaW5hY3RpdmVcbiIsIGxvaS0+bG9pX29zdF9pZHgpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlyZXEgPSBremFsbG9jKHNpemVvZigqcmVxKSwgR0ZQX05PRlMpOwotCQlpZiAoIXJlcSkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBvdXRfc2V0OwotCQl9Ci0KLQkJcmVxLT5ycV9zdHJpcGUgPSBpOwotCQlyZXEtPnJxX2lkeCA9IGxvaS0+bG9pX29zdF9pZHg7Ci0KLQkJcmVxLT5ycV9vaS5vaV9vYSA9IGttZW1fY2FjaGVfemFsbG9jKG9iZG9fY2FjaGVwLCBHRlBfTk9GUyk7Ci0JCWlmICghcmVxLT5ycV9vaS5vaV9vYSkgewotCQkJa2ZyZWUocmVxKTsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gb3V0X3NldDsKLQkJfQotCQltZW1jcHkocmVxLT5ycV9vaS5vaV9vYSwgc3JjX29hLCBzaXplb2YoKnJlcS0+cnFfb2kub2lfb2EpKTsKLQkJcmVxLT5ycV9vaS5vaV9vYS0+b19vaSA9IGxvaS0+bG9pX29pOwotCQlsb3Zfc2V0X2FkZF9yZXEocmVxLCBzZXQpOwotCX0KLQlpZiAoIXNldC0+c2V0X2NvdW50KSB7Ci0JCXJjID0gLUVJTzsKLQkJZ290byBvdXRfc2V0OwotCX0KLQkqcmVxc2V0ID0gc2V0OwotCXJldHVybiByYzsKLW91dF9zZXQ6Ci0JbG92X2ZpbmlfZGVzdHJveV9zZXQoc2V0KTsKLQlyZXR1cm4gcmM7Ci19Ci0KIGludCBsb3ZfZmluaV9zZXRhdHRyX3NldChzdHJ1Y3QgbG92X3JlcXVlc3Rfc2V0ICpzZXQpCiB7CiAJaW50IHJjID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZzdWJfb2JqZWN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92c3ViX29iamVjdC5jCmluZGV4IGZiMmYyNjYuLmEyYmFjN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZzdWJfb2JqZWN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdnN1Yl9vYmplY3QuYwpAQCAtOTgsOCArOTgsOCBAQAogCXJldHVybiAoKnApKGVudiwgY29va2llLCAiWyVkXSIsIGxvcy0+bHNvX2luZGV4KTsKIH0KIAotc3RhdGljIGludCBsb3ZzdWJfYXR0cl9zZXQoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmosCi0JCQkgICBjb25zdCBzdHJ1Y3QgY2xfYXR0ciAqYXR0ciwgdW5zaWduZWQgdmFsaWQpCitzdGF0aWMgaW50IGxvdnN1Yl9hdHRyX3VwZGF0ZShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBjbF9vYmplY3QgKm9iaiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBjbF9hdHRyICphdHRyLCB1bnNpZ25lZCBpbnQgdmFsaWQpCiB7CiAJc3RydWN0IGxvdl9vYmplY3QgKmxvdiA9IGNsMmxvdnN1YihvYmopLT5sc29fc3VwZXI7CiAKQEAgLTExOSw3ICsxMTksNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBjbF9vYmplY3Rfb3BlcmF0aW9ucyBsb3ZzdWJfb3BzID0gewogCS5jb29fcGFnZV9pbml0ID0gbG92c3ViX3BhZ2VfaW5pdCwKIAkuY29vX2xvY2tfaW5pdCA9IGxvdnN1Yl9sb2NrX2luaXQsCi0JLmNvb19hdHRyX3NldCAgPSBsb3ZzdWJfYXR0cl9zZXQsCisJLmNvb19hdHRyX3VwZGF0ZSA9IGxvdnN1Yl9hdHRyX3VwZGF0ZSwKIAkuY29vX2dsaW1wc2UgICA9IGxvdnN1Yl9vYmplY3RfZ2xpbXBzZQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL2xwcm9jX21kYy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL2xwcm9jX21kYy5jCmluZGV4IDk4ZDE1ZmIuLmZjYTk0NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9scHJvY19tZGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbHByb2NfbWRjLmMKQEAgLTQzLDExICs0MywxMCBAQAogCWludCBsZW47CiAJc3RydWN0IG9iZF9kZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3Qgb2JkX2RldmljZSwKIAkJCQkJICAgICAgb2JkX2tvYmopOwotCXN0cnVjdCBjbGllbnRfb2JkICpjbGkgPSAmZGV2LT51LmNsaTsKKwlfX3UzMiBtYXg7CiAKLQlzcGluX2xvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Ci0JbGVuID0gc3ByaW50ZihidWYsICIldVxuIiwgY2xpLT5jbF9tYXhfcnBjc19pbl9mbGlnaHQpOwotCXNwaW5fdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOworCW1heCA9IG9iZF9nZXRfbWF4X3JwY3NfaW5fZmxpZ2h0KCZkZXYtPnUuY2xpKTsKKwlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBtYXgpOwogCiAJcmV0dXJuIGxlbjsKIH0KQEAgLTU5LDcgKzU4LDYgQEAKIHsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBvYmRfZGV2aWNlLAogCQkJCQkgICAgICBvYmRfa29iaik7Ci0Jc3RydWN0IGNsaWVudF9vYmQgKmNsaSA9ICZkZXYtPnUuY2xpOwogCWludCByYzsKIAl1bnNpZ25lZCBsb25nIHZhbDsKIApAQCAtNjcsMTIgKzY1LDkgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCWlmICh2YWwgPCAxIHx8IHZhbCA+IE1EQ19NQVhfUklGX01BWCkKLQkJcmV0dXJuIC1FUkFOR0U7Ci0KLQlzcGluX2xvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Ci0JY2xpLT5jbF9tYXhfcnBjc19pbl9mbGlnaHQgPSB2YWw7Ci0Jc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CisJcmMgPSBvYmRfc2V0X21heF9ycGNzX2luX2ZsaWdodCgmZGV2LT51LmNsaSwgdmFsKTsKKwlpZiAocmMpCisJCWNvdW50ID0gcmM7CiAKIAlyZXR1cm4gY291bnQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX2ludGVybmFsLmgKaW5kZXggNThmMjg0MS4uZjQ0NmMxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfaW50ZXJuYWwuaApAQCAtMzQsNjMgKzM0LDU3IEBACiAjZGVmaW5lIF9NRENfSU5URVJOQUxfSAogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbWRjLmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbWRzLmgiCiAKIHZvaWQgbHByb2Nmc19tZGNfaW5pdF92YXJzKHN0cnVjdCBscHJvY2ZzX3N0YXRpY192YXJzICpsdmFycyk7CiAKIHZvaWQgbWRjX3BhY2tfYm9keShzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkLAotCQkgICBfX3U2NCB2YWxpZCwgaW50IGVhX3NpemUsIF9fdTMyIHN1cHBnaWQsIGludCBmbGFncyk7Ci12b2lkIG1kY19pc19zdWJkaXJfcGFjayhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqcGZpZCwKLQkJCWNvbnN0IHN0cnVjdCBsdV9maWQgKmNmaWQsIGludCBmbGFncyk7CisJCSAgIF9fdTY0IHZhbGlkLCBzaXplX3QgZWFfc2l6ZSwgX191MzIgc3VwcGdpZCwgdTMyIGZsYWdzKTsKIHZvaWQgbWRjX3N3YXBfbGF5b3V0c19wYWNrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLAogCQkJICAgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEpOwotdm9pZCBtZGNfcmVhZGRpcl9wYWNrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBfX3U2NCBwZ29mZiwgX191MzIgc2l6ZSwKK3ZvaWQgbWRjX3JlYWRkaXJfcGFjayhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgX191NjQgcGdvZmYsIHNpemVfdCBzaXplLAogCQkgICAgICBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQpOwotdm9pZCBtZGNfZ2V0YXR0cl9wYWNrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBfX3U2NCB2YWxpZCwgaW50IGZsYWdzLAotCQkgICAgICBzdHJ1Y3QgbWRfb3BfZGF0YSAqZGF0YSwgaW50IGVhX3NpemUpOwordm9pZCBtZGNfZ2V0YXR0cl9wYWNrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBfX3U2NCB2YWxpZCwgdTMyIGZsYWdzLAorCQkgICAgICBzdHJ1Y3QgbWRfb3BfZGF0YSAqZGF0YSwgc2l6ZV90IGVhX3NpemUpOwogdm9pZCBtZGNfc2V0YXR0cl9wYWNrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkJICAgICAgdm9pZCAqZWEsIGludCBlYWxlbiwgdm9pZCAqZWEyLCBpbnQgZWEybGVuKTsKKwkJICAgICAgdm9pZCAqZWEsIHNpemVfdCBlYWxlbiwgdm9pZCAqZWEyLCBzaXplX3QgZWEybGVuKTsKIHZvaWQgbWRjX2NyZWF0ZV9wYWNrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkJICAgICBjb25zdCB2b2lkICpkYXRhLCBpbnQgZGF0YWxlbiwgX191MzIgbW9kZSwgX191MzIgdWlkLAotCQkgICAgIF9fdTMyIGdpZCwgY2ZzX2NhcF90IGNhcGFiaWxpdHksIF9fdTY0IHJkZXYpOworCQkgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhbGVuLCB1bW9kZV90IG1vZGUsIHVpZF90IHVpZCwKKwkJICAgICBnaWRfdCBnaWQsIGNmc19jYXBfdCBjYXBhYmlsaXR5LCBfX3U2NCByZGV2KTsKIHZvaWQgbWRjX29wZW5fcGFjayhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCSAgIF9fdTMyIG1vZGUsIF9fdTY0IHJkZXYsIF9fdTY0IGZsYWdzLCBjb25zdCB2b2lkICpkYXRhLAotCQkgICBpbnQgZGF0YWxlbik7CisJCSAgIHVtb2RlX3QgbW9kZSwgX191NjQgcmRldiwgX191NjQgZmxhZ3MsIGNvbnN0IHZvaWQgKmRhdGEsCisJCSAgIHNpemVfdCBkYXRhbGVuKTsKIHZvaWQgbWRjX3VubGlua19wYWNrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSk7CiB2b2lkIG1kY19saW5rX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhKTsKIHZvaWQgbWRjX3JlbmFtZV9wYWNrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkJICAgICBjb25zdCBjaGFyICpvbGQsIGludCBvbGRsZW4sIGNvbnN0IGNoYXIgKm5ldywgaW50IG5ld2xlbik7CisJCSAgICAgY29uc3QgY2hhciAqb2xkLCBzaXplX3Qgb2xkbGVuLAorCQkgICAgIGNvbnN0IGNoYXIgKm5ldywgc2l6ZV90IG5ld2xlbik7CiB2b2lkIG1kY19jbG9zZV9wYWNrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSk7Ci1pbnQgbWRjX2VudGVyX3JlcXVlc3Qoc3RydWN0IGNsaWVudF9vYmQgKmNsaSk7Ci12b2lkIG1kY19leGl0X3JlcXVlc3Qoc3RydWN0IGNsaWVudF9vYmQgKmNsaSk7CiAKIC8qIG1kYy9tZGNfbG9ja3MuYyAqLwogaW50IG1kY19zZXRfbG9ja19kYXRhKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCi0JCSAgICAgIF9fdTY0ICpsb2NraCwgdm9pZCAqZGF0YSwgX191NjQgKmJpdHMpOworCQkgICAgICBjb25zdCBzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAqbG9ja2gsCisJCSAgICAgIHZvaWQgKmRhdGEsIF9fdTY0ICpiaXRzKTsKIAogaW50IG1kY19udWxsX2lub2RlKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCk7CiAKLWludCBtZGNfZmluZF9jYmRhdGEoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkLAotCQkgICAgbGRsbV9pdGVyYXRvcl90IGl0LCB2b2lkICpkYXRhKTsKLQogaW50IG1kY19pbnRlbnRfbG9jayhzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAotCQkgICAgc3RydWN0IG1kX29wX2RhdGEgKiwKLQkJICAgIHZvaWQgKmxtbSwgaW50IGxtbXNpemUsCi0JCSAgICBzdHJ1Y3QgbG9va3VwX2ludGVudCAqLCBpbnQsCisJCSAgICBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKKwkJICAgIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCwKIAkJICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXAsCiAJCSAgICBsZGxtX2Jsb2NraW5nX2NhbGxiYWNrIGNiX2Jsb2NraW5nLAogCQkgICAgX191NjQgZXh0cmFfbG9ja19mbGFncyk7CisKIGludCBtZGNfZW5xdWV1ZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbGRsbV9lbnF1ZXVlX2luZm8gKmVpbmZvLAorCQljb25zdCBsZGxtX3BvbGljeV9kYXRhX3QgKnBvbGljeSwKIAkJc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0LCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkJc3RydWN0IGx1c3RyZV9oYW5kbGUgKmxvY2toLCB2b2lkICpsbW0sIGludCBsbW1zaXplLAotCQlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXEsIF9fdTY0IGV4dHJhX2xvY2tfZmxhZ3MpOworCQlzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAqbG9ja2gsIF9fdTY0IGV4dHJhX2xvY2tfZmxhZ3MpOwogCiBpbnQgbWRjX3Jlc291cmNlX2dldF91bnVzZWQoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkLAogCQkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKmNhbmNlbHMsIGVudW0gbGRsbV9tb2RlICBtb2RlLAogCQkJICAgIF9fdTY0IGJpdHMpOwogLyogbWRjL21kY19yZXF1ZXN0LmMgKi8KLWludCBtZGNfZmlkX2FsbG9jKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsdV9maWQgKmZpZCwKLQkJICBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSk7CitpbnQgbWRjX2ZpZF9hbGxvYyhjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCisJCSAgc3RydWN0IGx1X2ZpZCAqZmlkLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSk7CiBzdHJ1Y3Qgb2JkX2NsaWVudF9oYW5kbGU7CiAKIGludCBtZGNfc2V0X29wZW5fcmVwbGF5X2RhdGEoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKQEAgLTEwMSwxNiArOTUsMTcgQEAKIHZvaWQgbWRjX3JlcGxheV9vcGVuKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKTsKIAogaW50IG1kY19jcmVhdGUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIGludCBkYXRhbGVuLCBpbnQgbW9kZSwgX191MzIgdWlkLCBfX3UzMiBnaWQsCi0JICAgICAgIGNmc19jYXBfdCBjYXBhYmlsaXR5LCBfX3U2NCByZGV2LAorCSAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgZGF0YWxlbiwgdW1vZGVfdCBtb2RlLCB1aWRfdCB1aWQsCisJICAgICAgIGdpZF90IGdpZCwgY2ZzX2NhcF90IGNhcGFiaWxpdHksIF9fdTY0IHJkZXYsCiAJICAgICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXVlc3QpOwogaW50IG1kY19saW5rKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAogCSAgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCk7CiBpbnQgbWRjX3JlbmFtZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkgICAgICAgY29uc3QgY2hhciAqb2xkLCBpbnQgb2xkbGVuLCBjb25zdCBjaGFyICpuZXcsIGludCBuZXdsZW4sCisJICAgICAgIGNvbnN0IGNoYXIgKm9sZCwgc2l6ZV90IG9sZGxlbiwKKwkgICAgICAgY29uc3QgY2hhciAqbmV3LCBzaXplX3QgbmV3bGVuLAogCSAgICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0KTsKIGludCBtZGNfc2V0YXR0cihzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkJdm9pZCAqZWEsIGludCBlYWxlbiwgdm9pZCAqZWEyLCBpbnQgZWEybGVuLAorCQl2b2lkICplYSwgc2l6ZV90IGVhbGVuLCB2b2lkICplYTIsIHNpemVfdCBlYTJsZW4sCiAJCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXVlc3QsIHN0cnVjdCBtZF9vcGVuX2RhdGEgKiptb2QpOwogaW50IG1kY191bmxpbmsoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCiAJICAgICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXVlc3QpOwpAQCAtMTM4LDQgKzEzMywxMiBAQAogCQkJCSBjb3VudCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBoYXNoX3hfaW5kZXgoX191NjQgaGFzaCwgaW50IGhhc2g2NCkKK3sKKwlpZiAoQklUU19QRVJfTE9ORyA9PSAzMiAmJiBoYXNoNjQpCisJCWhhc2ggPj49IDMyOworCS8qIHNhdmUgaGFzaCAwIHdpdGggaGFzaCAxICovCisJcmV0dXJuIH4wVUwgLSAoaGFzaCArICFoYXNoKTsKK30KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX2xpYi5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19saWIuYwppbmRleCAxNDNiZDc2Li5hYWM3ZTA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX2xpYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfbGliLmMKQEAgLTM3LDI3ICszNywxMiBAQAogCiBzdGF0aWMgdm9pZCBfX21kY19wYWNrX2JvZHkoc3RydWN0IG1kdF9ib2R5ICpiLCBfX3UzMiBzdXBwZ2lkKQogewotCWItPnN1cHBnaWQgPSBzdXBwZ2lkOwotCWItPnVpZCA9IGZyb21fa3VpZCgmaW5pdF91c2VyX25zLCBjdXJyZW50X3VpZCgpKTsKLQliLT5naWQgPSBmcm9tX2tnaWQoJmluaXRfdXNlcl9ucywgY3VycmVudF9naWQoKSk7Ci0JYi0+ZnN1aWQgPSBmcm9tX2t1aWQoJmluaXRfdXNlcl9ucywgY3VycmVudF9mc3VpZCgpKTsKLQliLT5mc2dpZCA9IGZyb21fa2dpZCgmaW5pdF91c2VyX25zLCBjdXJyZW50X2ZzZ2lkKCkpOwotCWItPmNhcGFiaWxpdHkgPSBjZnNfY3VycHJvY19jYXBfcGFjaygpOwotfQotCi12b2lkIG1kY19pc19zdWJkaXJfcGFjayhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqcGZpZCwKLQkJCWNvbnN0IHN0cnVjdCBsdV9maWQgKmNmaWQsIGludCBmbGFncykKLXsKLQlzdHJ1Y3QgbWR0X2JvZHkgKmIgPSByZXFfY2Fwc3VsZV9jbGllbnRfZ2V0KCZyZXEtPnJxX3BpbGwsCi0JCQkJCQkgICAgJlJNRl9NRFRfQk9EWSk7Ci0KLQlpZiAocGZpZCkgewotCQliLT5maWQxID0gKnBmaWQ7Ci0JCWItPnZhbGlkID0gT0JEX01EX0ZMSUQ7Ci0JfQotCWlmIChjZmlkKQotCQliLT5maWQyID0gKmNmaWQ7Ci0JYi0+ZmxhZ3MgPSBmbGFnczsKKwliLT5tYm9fc3VwcGdpZCA9IHN1cHBnaWQ7CisJYi0+bWJvX3VpZCA9IGZyb21fa3VpZCgmaW5pdF91c2VyX25zLCBjdXJyZW50X3VpZCgpKTsKKwliLT5tYm9fZ2lkID0gZnJvbV9rZ2lkKCZpbml0X3VzZXJfbnMsIGN1cnJlbnRfZ2lkKCkpOworCWItPm1ib19mc3VpZCA9IGZyb21fa3VpZCgmaW5pdF91c2VyX25zLCBjdXJyZW50X2ZzdWlkKCkpOworCWItPm1ib19mc2dpZCA9IGZyb21fa2dpZCgmaW5pdF91c2VyX25zLCBjdXJyZW50X2ZzZ2lkKCkpOworCWItPm1ib19jYXBhYmlsaXR5ID0gY2ZzX2N1cnByb2NfY2FwX3BhY2soKTsKIH0KIAogdm9pZCBtZGNfc3dhcF9sYXlvdXRzX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsCkBAIC02Nyw0MyArNTIsNzQgQEAKIAkJCQkJCSAgICAmUk1GX01EVF9CT0RZKTsKIAogCV9fbWRjX3BhY2tfYm9keShiLCBvcF9kYXRhLT5vcF9zdXBwZ2lkc1swXSk7Ci0JYi0+ZmlkMSA9IG9wX2RhdGEtPm9wX2ZpZDE7Ci0JYi0+ZmlkMiA9IG9wX2RhdGEtPm9wX2ZpZDI7Ci0JYi0+dmFsaWQgfD0gT0JEX01EX0ZMSUQ7CisJYi0+bWJvX2ZpZDEgPSBvcF9kYXRhLT5vcF9maWQxOworCWItPm1ib19maWQyID0gb3BfZGF0YS0+b3BfZmlkMjsKKwliLT5tYm9fdmFsaWQgfD0gT0JEX01EX0ZMSUQ7CiB9CiAKIHZvaWQgbWRjX3BhY2tfYm9keShzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkLAotCQkgICBfX3U2NCB2YWxpZCwgaW50IGVhX3NpemUsIF9fdTMyIHN1cHBnaWQsIGludCBmbGFncykKKwkJICAgX191NjQgdmFsaWQsIHNpemVfdCBlYV9zaXplLCBfX3UzMiBzdXBwZ2lkLCB1MzIgZmxhZ3MpCiB7CiAJc3RydWN0IG1kdF9ib2R5ICpiID0gcmVxX2NhcHN1bGVfY2xpZW50X2dldCgmcmVxLT5ycV9waWxsLAogCQkJCQkJICAgICZSTUZfTURUX0JPRFkpOwotCWItPnZhbGlkID0gdmFsaWQ7Ci0JYi0+ZWFkYXRhc2l6ZSA9IGVhX3NpemU7Ci0JYi0+ZmxhZ3MgPSBmbGFnczsKKwliLT5tYm9fdmFsaWQgPSB2YWxpZDsKKwliLT5tYm9fZWFkYXRhc2l6ZSA9IGVhX3NpemU7CisJYi0+bWJvX2ZsYWdzID0gZmxhZ3M7CiAJX19tZGNfcGFja19ib2R5KGIsIHN1cHBnaWQpOwogCWlmIChmaWQpIHsKLQkJYi0+ZmlkMSA9ICpmaWQ7Ci0JCWItPnZhbGlkIHw9IE9CRF9NRF9GTElEOworCQliLT5tYm9fZmlkMSA9ICpmaWQ7CisJCWItPm1ib192YWxpZCB8PSBPQkRfTURfRkxJRDsKIAl9CiB9CiAKLXZvaWQgbWRjX3JlYWRkaXJfcGFjayhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgX191NjQgcGdvZmYsCi0JCSAgICAgIF9fdTMyIHNpemUsIGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCkKKy8qKgorICogUGFjayBhIG5hbWUgKHBhdGggY29tcG9uZW50KSBpbnRvIGEgcmVxdWVzdAorICoKKyAqIFxwYXJhbVtpbl0gcmVxCXJlcXVlc3QKKyAqIFxwYXJhbVtpbl0gZmllbGQJcmVxdWVzdCBmaWVsZCAodXN1YWxseSBSTUZfTkFNRSkKKyAqIFxwYXJhbVtpbl0gbmFtZQlwYXRoIGNvbXBvbmVudAorICogXHBhcmFtW2luXSBuYW1lX2xlbglsZW5ndGggb2YgcGF0aCBjb21wb25lbnQKKyAqCisgKiBcYSBmaWVsZCBtdXN0IGJlIHByZXNlbnQgaW4gXGEgcmVxIGFuZCBvZiBzaXplIFxhIG5hbWVfbGVuICsgMS4KKyAqCisgKiBcYSBuYW1lIG11c3QgYmUgJ1wwJyB0ZXJtaW5hdGVkIG9mIGxlbmd0aCBcYSBuYW1lX2xlbiBhbmQgcmVwcmVzZW50CisgKiBhIHNpbmdsZSBwYXRoIGNvbXBvbmVudCAobm90IGNvbnRhaW4gJy8nKS4KKyAqLworc3RhdGljIHZvaWQgbWRjX3BhY2tfbmFtZShzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwKKwkJCSAgY29uc3Qgc3RydWN0IHJlcV9tc2dfZmllbGQgKmZpZWxkLAorCQkJICBjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZV9sZW4pCit7CisJc2l6ZV90IGJ1Zl9zaXplOworCXNpemVfdCBjcHlfbGVuOworCWNoYXIgKmJ1ZjsKKworCWJ1ZiA9IHJlcV9jYXBzdWxlX2NsaWVudF9nZXQoJnJlcS0+cnFfcGlsbCwgZmllbGQpOworCWJ1Zl9zaXplID0gcmVxX2NhcHN1bGVfZ2V0X3NpemUoJnJlcS0+cnFfcGlsbCwgZmllbGQsIFJDTF9DTElFTlQpOworCisJTEFTU0VSVChuYW1lICYmIG5hbWVfbGVuICYmIGJ1ZiAmJiBidWZfc2l6ZSA9PSBuYW1lX2xlbiArIDEpOworCisJY3B5X2xlbiA9IHN0cmxjcHkoYnVmLCBuYW1lLCBidWZfc2l6ZSk7CisKKwlMQVNTRVJUKGNweV9sZW4gPT0gbmFtZV9sZW4gJiYgbHVfbmFtZV9pc192YWxpZF8yKGJ1ZiwgY3B5X2xlbikpOworfQorCit2b2lkIG1kY19yZWFkZGlyX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIF9fdTY0IHBnb2ZmLCBzaXplX3Qgc2l6ZSwKKwkJICAgICAgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkKQogewogCXN0cnVjdCBtZHRfYm9keSAqYiA9IHJlcV9jYXBzdWxlX2NsaWVudF9nZXQoJnJlcS0+cnFfcGlsbCwKIAkJCQkJCSAgICAmUk1GX01EVF9CT0RZKTsKLQliLT5maWQxID0gKmZpZDsKLQliLT52YWxpZCB8PSBPQkRfTURfRkxJRDsKLQliLT5zaXplID0gcGdvZmY7CQkgICAgICAgLyogISEgKi8KLQliLT5ubGluayA9IHNpemU7CQkJLyogISEgKi8KKwliLT5tYm9fZmlkMSA9ICpmaWQ7CisJYi0+bWJvX3ZhbGlkIHw9IE9CRF9NRF9GTElEOworCWItPm1ib19zaXplID0gcGdvZmY7CQkgICAgICAgLyogISEgKi8KKwliLT5tYm9fbmxpbmsgPSBzaXplOwkJCS8qICEhICovCiAJX19tZGNfcGFja19ib2R5KGIsIC0xKTsKLQliLT5tb2RlID0gTFVEQV9GSUQgfCBMVURBX1RZUEU7CisJYi0+bWJvX21vZGUgPSBMVURBX0ZJRCB8IExVREFfVFlQRTsKIH0KIAogLyogcGFja2luZyBvZiBNRFMgcmVjb3JkcyAqLwogdm9pZCBtZGNfY3JlYXRlX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQkgICAgIGNvbnN0IHZvaWQgKmRhdGEsIGludCBkYXRhbGVuLCBfX3UzMiBtb2RlLAotCQkgICAgIF9fdTMyIHVpZCwgX191MzIgZ2lkLCBjZnNfY2FwX3QgY2FwX2VmZmVjdGl2ZSwgX191NjQgcmRldikKKwkJICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgZGF0YWxlbiwgdW1vZGVfdCBtb2RlLAorCQkgICAgIHVpZF90IHVpZCwgZ2lkX3QgZ2lkLCBjZnNfY2FwX3QgY2FwX2VmZmVjdGl2ZSwgX191NjQgcmRldikKIHsKIAlzdHJ1Y3QgbWR0X3JlY19jcmVhdGUJKnJlYzsKIAljaGFyCQkJKnRtcDsKQEAgLTEzMCwyMiArMTQ2LDE3IEBACiAJcmVjLT5jcl9iaWFzICAgICA9IG9wX2RhdGEtPm9wX2JpYXM7CiAJcmVjLT5jcl91bWFzayAgICA9IGN1cnJlbnRfdW1hc2soKTsKIAotCXRtcCA9IHJlcV9jYXBzdWxlX2NsaWVudF9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9OQU1FKTsKLQlMT0dMMChvcF9kYXRhLT5vcF9uYW1lLCBvcF9kYXRhLT5vcF9uYW1lbGVuLCB0bXApOwotCisJbWRjX3BhY2tfbmFtZShyZXEsICZSTUZfTkFNRSwgb3BfZGF0YS0+b3BfbmFtZSwgb3BfZGF0YS0+b3BfbmFtZWxlbik7CiAJaWYgKGRhdGEpIHsKIAkJdG1wID0gcmVxX2NhcHN1bGVfY2xpZW50X2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX0VBREFUQSk7CiAJCW1lbWNweSh0bXAsIGRhdGEsIGRhdGFsZW4pOwogCX0KIH0KIAotc3RhdGljIF9fdTY0IG1kc19wYWNrX29wZW5fZmxhZ3MoX191NjQgZmxhZ3MsIF9fdTMyIG1vZGUpCitzdGF0aWMgaW5saW5lIF9fdTY0IG1kc19wYWNrX29wZW5fZmxhZ3MoX191NjQgZmxhZ3MpCiB7CiAJX191NjQgY3JfZmxhZ3MgPSAoZmxhZ3MgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFIHwKLQkJCQkgICBNRFNfT1BFTl9IQVNfRUEgfCBNRFNfT1BFTl9IQVNfT0JKUyB8Ci0JCQkJICAgTURTX09QRU5fT1dORVJPVkVSUklERSB8IE1EU19PUEVOX0xPQ0sgfAotCQkJCSAgIE1EU19PUEVOX0JZX0ZJRCB8IE1EU19PUEVOX0xFQVNFIHwKLQkJCQkgICBNRFNfT1BFTl9SRUxFQVNFKSk7CisJCQkJICAgTURTX09QRU5fRkxfSU5URVJOQUwpKTsKIAlpZiAoZmxhZ3MgJiBPX0NSRUFUKQogCQljcl9mbGFncyB8PSBNRFNfT1BFTl9DUkVBVDsKIAlpZiAoZmxhZ3MgJiBPX0VYQ0wpCkBAIC0xNzEsOCArMTgyLDggQEAKIAogLyogcGFja2luZyBvZiBNRFMgcmVjb3JkcyAqLwogdm9pZCBtZGNfb3Blbl9wYWNrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkJICAgX191MzIgbW9kZSwgX191NjQgcmRldiwgX191NjQgZmxhZ3MsIGNvbnN0IHZvaWQgKmxtbSwKLQkJICAgaW50IGxtbWxlbikKKwkJICAgdW1vZGVfdCBtb2RlLCBfX3U2NCByZGV2LCBfX3U2NCBmbGFncywgY29uc3Qgdm9pZCAqbG1tLAorCQkgICBzaXplX3QgbG1tbGVuKQogewogCXN0cnVjdCBtZHRfcmVjX2NyZWF0ZSAqcmVjOwogCWNoYXIgKnRtcDsKQEAgLTE5MCw3ICsyMDEsNyBAQAogCXJlYy0+Y3JfZmlkMiA9IG9wX2RhdGEtPm9wX2ZpZDI7CiAKIAlyZWMtPmNyX21vZGUgICAgID0gbW9kZTsKLQljcl9mbGFncyA9IG1kc19wYWNrX29wZW5fZmxhZ3MoZmxhZ3MsIG1vZGUpOworCWNyX2ZsYWdzID0gbWRzX3BhY2tfb3Blbl9mbGFncyhmbGFncyk7CiAJcmVjLT5jcl9yZGV2ICAgICA9IHJkZXY7CiAJcmVjLT5jcl90aW1lICAgICA9IG9wX2RhdGEtPm9wX21vZF90aW1lOwogCXJlYy0+Y3Jfc3VwcGdpZDEgPSBvcF9kYXRhLT5vcF9zdXBwZ2lkc1swXTsKQEAgLTIwMCw4ICsyMTEsOSBAQAogCXJlYy0+Y3Jfb2xkX2hhbmRsZSA9IG9wX2RhdGEtPm9wX2hhbmRsZTsKIAogCWlmIChvcF9kYXRhLT5vcF9uYW1lKSB7Ci0JCXRtcCA9IHJlcV9jYXBzdWxlX2NsaWVudF9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9OQU1FKTsKLQkJTE9HTDAob3BfZGF0YS0+b3BfbmFtZSwgb3BfZGF0YS0+b3BfbmFtZWxlbiwgdG1wKTsKKwkJbWRjX3BhY2tfbmFtZShyZXEsICZSTUZfTkFNRSwgb3BfZGF0YS0+b3BfbmFtZSwKKwkJCSAgICAgIG9wX2RhdGEtPm9wX25hbWVsZW4pOworCiAJCWlmIChvcF9kYXRhLT5vcF9iaWFzICYgTURTX0NSRUFURV9WT0xBVElMRSkKIAkJCWNyX2ZsYWdzIHw9IE1EU19PUEVOX1ZPTEFUSUxFOwogCX0KQEAgLTI5NSw3ICszMDcsNyBAQAogfQogCiB2b2lkIG1kY19zZXRhdHRyX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQkgICAgICB2b2lkICplYSwgaW50IGVhbGVuLCB2b2lkICplYTIsIGludCBlYTJsZW4pCisJCSAgICAgIHZvaWQgKmVhLCBzaXplX3QgZWFsZW4sIHZvaWQgKmVhMiwgc2l6ZV90IGVhMmxlbikKIHsKIAlzdHJ1Y3QgbWR0X3JlY19zZXRhdHRyICpyZWM7CiAJc3RydWN0IG1kdF9pb2Vwb2NoICplcG9jaDsKQEAgLTMxNiw3ICszMjgsNyBAQAogCiAJbHVtID0gcmVxX2NhcHN1bGVfY2xpZW50X2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX0VBREFUQSk7CiAJaWYgKCFlYSkgeyAvKiBSZW1vdmUgTE9WIEVBICovCi0JCWx1bS0+bG1tX21hZ2ljID0gTE9WX1VTRVJfTUFHSUNfVjE7CisJCWx1bS0+bG1tX21hZ2ljID0gY3B1X3RvX2xlMzIoTE9WX1VTRVJfTUFHSUNfVjEpOwogCQlsdW0tPmxtbV9zdHJpcGVfc2l6ZSA9IDA7CiAJCWx1bS0+bG1tX3N0cmlwZV9jb3VudCA9IDA7CiAJCWx1bS0+bG1tX3N0cmlwZV9vZmZzZXQgPSAodHlwZW9mKGx1bS0+bG1tX3N0cmlwZV9vZmZzZXQpKSgtMSk7CkBAIC0zMzQsNyArMzQ2LDYgQEAKIHZvaWQgbWRjX3VubGlua19wYWNrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSkKIHsKIAlzdHJ1Y3QgbWR0X3JlY191bmxpbmsgKnJlYzsKLQljaGFyICp0bXA7CiAKIAlDTEFTU0VSVChzaXplb2Yoc3RydWN0IG1kdF9yZWNfcmVpbnQpID09IHNpemVvZihzdHJ1Y3QgbWR0X3JlY191bmxpbmspKTsKIAlyZWMgPSByZXFfY2Fwc3VsZV9jbGllbnRfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfUkVDX1JFSU5UKTsKQEAgLTM1MiwxNSArMzYzLDEyIEBACiAJcmVjLT51bF90aW1lICAgICA9IG9wX2RhdGEtPm9wX21vZF90aW1lOwogCXJlYy0+dWxfYmlhcyAgICAgPSBvcF9kYXRhLT5vcF9iaWFzOwogCi0JdG1wID0gcmVxX2NhcHN1bGVfY2xpZW50X2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX05BTUUpOwotCUxBU1NFUlQodG1wKTsKLQlMT0dMMChvcF9kYXRhLT5vcF9uYW1lLCBvcF9kYXRhLT5vcF9uYW1lbGVuLCB0bXApOworCW1kY19wYWNrX25hbWUocmVxLCAmUk1GX05BTUUsIG9wX2RhdGEtPm9wX25hbWUsIG9wX2RhdGEtPm9wX25hbWVsZW4pOwogfQogCiB2b2lkIG1kY19saW5rX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhKQogewogCXN0cnVjdCBtZHRfcmVjX2xpbmsgKnJlYzsKLQljaGFyICp0bXA7CiAKIAlDTEFTU0VSVChzaXplb2Yoc3RydWN0IG1kdF9yZWNfcmVpbnQpID09IHNpemVvZihzdHJ1Y3QgbWR0X3JlY19saW5rKSk7CiAJcmVjID0gcmVxX2NhcHN1bGVfY2xpZW50X2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX1JFQ19SRUlOVCk7CkBAIC0zNzYsMjAgKzM4NCwyMSBAQAogCXJlYy0+bGtfdGltZSAgICAgPSBvcF9kYXRhLT5vcF9tb2RfdGltZTsKIAlyZWMtPmxrX2JpYXMgICAgID0gb3BfZGF0YS0+b3BfYmlhczsKIAotCXRtcCA9IHJlcV9jYXBzdWxlX2NsaWVudF9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9OQU1FKTsKLQlMT0dMMChvcF9kYXRhLT5vcF9uYW1lLCBvcF9kYXRhLT5vcF9uYW1lbGVuLCB0bXApOworCW1kY19wYWNrX25hbWUocmVxLCAmUk1GX05BTUUsIG9wX2RhdGEtPm9wX25hbWUsIG9wX2RhdGEtPm9wX25hbWVsZW4pOwogfQogCiB2b2lkIG1kY19yZW5hbWVfcGFjayhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCSAgICAgY29uc3QgY2hhciAqb2xkLCBpbnQgb2xkbGVuLCBjb25zdCBjaGFyICpuZXcsIGludCBuZXdsZW4pCisJCSAgICAgY29uc3QgY2hhciAqb2xkLCBzaXplX3Qgb2xkbGVuLAorCQkgICAgIGNvbnN0IGNoYXIgKm5ldywgc2l6ZV90IG5ld2xlbikKIHsKIAlzdHJ1Y3QgbWR0X3JlY19yZW5hbWUgKnJlYzsKLQljaGFyICp0bXA7CiAKIAlDTEFTU0VSVChzaXplb2Yoc3RydWN0IG1kdF9yZWNfcmVpbnQpID09IHNpemVvZihzdHJ1Y3QgbWR0X3JlY19yZW5hbWUpKTsKIAlyZWMgPSByZXFfY2Fwc3VsZV9jbGllbnRfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfUkVDX1JFSU5UKTsKIAogCS8qIFhYWCBkbyBzb21ldGhpbmcgYWJvdXQgdGltZSwgdWlkLCBnaWQgKi8KKwlyZWMtPnJuX29wY29kZQkgPSBvcF9kYXRhLT5vcF9jbGlfZmxhZ3MgJiBDTElfTUlHUkFURSA/CisJCQkJUkVJTlRfTUlHUkFURSA6IFJFSU5UX1JFTkFNRTsKIAlyZWMtPnJuX29wY29kZSAgID0gUkVJTlRfUkVOQU1FOwogCXJlYy0+cm5fZnN1aWQgICAgPSBvcF9kYXRhLT5vcF9mc3VpZDsKIAlyZWMtPnJuX2ZzZ2lkICAgID0gb3BfZGF0YS0+b3BfZnNnaWQ7CkBAIC00MDIsMzkgKzQxMSwzNCBAQAogCXJlYy0+cm5fbW9kZSAgICAgPSBvcF9kYXRhLT5vcF9tb2RlOwogCXJlYy0+cm5fYmlhcyAgICAgPSBvcF9kYXRhLT5vcF9iaWFzOwogCi0JdG1wID0gcmVxX2NhcHN1bGVfY2xpZW50X2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX05BTUUpOwotCUxPR0wwKG9sZCwgb2xkbGVuLCB0bXApOworCW1kY19wYWNrX25hbWUocmVxLCAmUk1GX05BTUUsIG9sZCwgb2xkbGVuKTsKIAotCWlmIChuZXcpIHsKLQkJdG1wID0gcmVxX2NhcHN1bGVfY2xpZW50X2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX1NZTVRHVCk7Ci0JCUxPR0wwKG5ldywgbmV3bGVuLCB0bXApOwotCX0KKwlpZiAobmV3KQorCQltZGNfcGFja19uYW1lKHJlcSwgJlJNRl9TWU1UR1QsIG5ldywgbmV3bGVuKTsKIH0KIAotdm9pZCBtZGNfZ2V0YXR0cl9wYWNrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBfX3U2NCB2YWxpZCwgaW50IGZsYWdzLAotCQkgICAgICBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwgaW50IGVhX3NpemUpCit2b2lkIG1kY19nZXRhdHRyX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIF9fdTY0IHZhbGlkLCB1MzIgZmxhZ3MsCisJCSAgICAgIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLCBzaXplX3QgZWFfc2l6ZSkKIHsKIAlzdHJ1Y3QgbWR0X2JvZHkgKmIgPSByZXFfY2Fwc3VsZV9jbGllbnRfZ2V0KCZyZXEtPnJxX3BpbGwsCiAJCQkJCQkgICAgJlJNRl9NRFRfQk9EWSk7CiAKLQliLT52YWxpZCA9IHZhbGlkOworCWItPm1ib192YWxpZCA9IHZhbGlkOwogCWlmIChvcF9kYXRhLT5vcF9iaWFzICYgTURTX0NIRUNLX1NQTElUKQotCQliLT52YWxpZCB8PSBPQkRfTURfRkxDS1NQTElUOworCQliLT5tYm9fdmFsaWQgfD0gT0JEX01EX0ZMQ0tTUExJVDsKIAlpZiAob3BfZGF0YS0+b3BfYmlhcyAmIE1EU19DUk9TU19SRUYpCi0JCWItPnZhbGlkIHw9IE9CRF9NRF9GTENST1NTUkVGOwotCWItPmVhZGF0YXNpemUgPSBlYV9zaXplOwotCWItPmZsYWdzID0gZmxhZ3M7CisJCWItPm1ib192YWxpZCB8PSBPQkRfTURfRkxDUk9TU1JFRjsKKwliLT5tYm9fZWFkYXRhc2l6ZSA9IGVhX3NpemU7CisJYi0+bWJvX2ZsYWdzID0gZmxhZ3M7CiAJX19tZGNfcGFja19ib2R5KGIsIG9wX2RhdGEtPm9wX3N1cHBnaWRzWzBdKTsKIAotCWItPmZpZDEgPSBvcF9kYXRhLT5vcF9maWQxOwotCWItPmZpZDIgPSBvcF9kYXRhLT5vcF9maWQyOwotCWItPnZhbGlkIHw9IE9CRF9NRF9GTElEOworCWItPm1ib19maWQxID0gb3BfZGF0YS0+b3BfZmlkMTsKKwliLT5tYm9fZmlkMiA9IG9wX2RhdGEtPm9wX2ZpZDI7CisJYi0+bWJvX3ZhbGlkIHw9IE9CRF9NRF9GTElEOwogCi0JaWYgKG9wX2RhdGEtPm9wX25hbWUpIHsKLQkJY2hhciAqdG1wID0gcmVxX2NhcHN1bGVfY2xpZW50X2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX05BTUUpOwotCi0JCUxPR0wwKG9wX2RhdGEtPm9wX25hbWUsIG9wX2RhdGEtPm9wX25hbWVsZW4sIHRtcCk7Ci0JfQorCWlmIChvcF9kYXRhLT5vcF9uYW1lKQorCQltZGNfcGFja19uYW1lKHJlcSwgJlJNRl9OQU1FLCBvcF9kYXRhLT5vcF9uYW1lLAorCQkJICAgICAgb3BfZGF0YS0+b3BfbmFtZWxlbik7CiB9CiAKIHN0YXRpYyB2b2lkIG1kY19oc21fcmVsZWFzZV9wYWNrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLApAQCAtNDgyLDY3ICs0ODYsMyBAQAogCW1kY19pb2Vwb2NoX3BhY2soZXBvY2gsIG9wX2RhdGEpOwogCW1kY19oc21fcmVsZWFzZV9wYWNrKHJlcSwgb3BfZGF0YSk7CiB9Ci0KLXN0YXRpYyBpbnQgbWRjX3JlcV9hdmFpbChzdHJ1Y3QgY2xpZW50X29iZCAqY2xpLCBzdHJ1Y3QgbWRjX2NhY2hlX3dhaXRlciAqbWN3KQotewotCWludCByYzsKLQotCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQlyYyA9IGxpc3RfZW1wdHkoJm1jdy0+bWN3X2VudHJ5KTsKLQlzcGluX3VubG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQlyZXR1cm4gcmM7Ci19OwotCi0vKiBXZSByZWNvcmQgcmVxdWVzdHMgaW4gZmxpZ2h0IGluIGNsaS0+Y2xfcl9pbl9mbGlnaHQgaGVyZS4KLSAqIFRoZXJlIGlzIG9ubHkgb25lIHdyaXRlIHJwYyBwb3NzaWJsZSBpbiBtZGMgYW55d2F5LiBJZiB0aGlzIHRvIGNoYW5nZQotICogaW4gdGhlIGZ1dHVyZSAtIHRoZSBjb2RlIG1heSBuZWVkIHRvIGJlIHJldmlzaXRlZC4KLSAqLwotaW50IG1kY19lbnRlcl9yZXF1ZXN0KHN0cnVjdCBjbGllbnRfb2JkICpjbGkpCi17Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbWRjX2NhY2hlX3dhaXRlciBtY3c7Ci0Jc3RydWN0IGxfd2FpdF9pbmZvIGx3aSA9IExXSV9JTlRSKExXSV9PTl9TSUdOQUxfTk9PUCwgTlVMTCk7Ci0KLQlzcGluX2xvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Ci0JaWYgKGNsaS0+Y2xfcl9pbl9mbGlnaHQgPj0gY2xpLT5jbF9tYXhfcnBjc19pbl9mbGlnaHQpIHsKLQkJbGlzdF9hZGRfdGFpbCgmbWN3Lm1jd19lbnRyeSwgJmNsaS0+Y2xfY2FjaGVfd2FpdGVycyk7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm1jdy5tY3dfd2FpdHEpOwotCQlzcGluX3VubG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQkJcmMgPSBsX3dhaXRfZXZlbnQobWN3Lm1jd193YWl0cSwgbWRjX3JlcV9hdmFpbChjbGksICZtY3cpLAotCQkJCSAgJmx3aSk7Ci0JCWlmIChyYykgewotCQkJc3Bpbl9sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCQkJaWYgKGxpc3RfZW1wdHkoJm1jdy5tY3dfZW50cnkpKQotCQkJCWNsaS0+Y2xfcl9pbl9mbGlnaHQtLTsKLQkJCWxpc3RfZGVsX2luaXQoJm1jdy5tY3dfZW50cnkpOwotCQkJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Ci0JCX0KLQl9IGVsc2UgewotCQljbGktPmNsX3JfaW5fZmxpZ2h0Kys7Ci0JCXNwaW5fdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXZvaWQgbWRjX2V4aXRfcmVxdWVzdChzdHJ1Y3QgY2xpZW50X29iZCAqY2xpKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKmwsICp0bXA7Ci0Jc3RydWN0IG1kY19jYWNoZV93YWl0ZXIgKm1jdzsKLQotCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQljbGktPmNsX3JfaW5fZmxpZ2h0LS07Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKGwsIHRtcCwgJmNsaS0+Y2xfY2FjaGVfd2FpdGVycykgewotCQlpZiAoY2xpLT5jbF9yX2luX2ZsaWdodCA+PSBjbGktPmNsX21heF9ycGNzX2luX2ZsaWdodCkgewotCQkJLyogTm8gZnJlZSByZXF1ZXN0IHNsb3RzIGFueW1vcmUgKi8KLQkJCWJyZWFrOwotCQl9Ci0KLQkJbWN3ID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgbWRjX2NhY2hlX3dhaXRlciwgbWN3X2VudHJ5KTsKLQkJbGlzdF9kZWxfaW5pdCgmbWN3LT5tY3dfZW50cnkpOwotCQljbGktPmNsX3JfaW5fZmxpZ2h0Kys7Ci0JCXdha2VfdXAoJm1jdy0+bWN3X3dhaXRxKTsKLQl9Ci0JLyogRW1wdHkgd2FpdGluZyBsaXN0PyBEZWNyZWFzZSByZXFzIGluLWZsaWdodCBudW1iZXIgKi8KLQotCXNwaW5fdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19sb2Nrcy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19sb2Nrcy5jCmluZGV4IGY0OGI1ODQuLmYxZjZjMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfbG9ja3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX2xvY2tzLmMKQEAgLTkzLDggKzkzLDggQEAKIEVYUE9SVF9TWU1CT0woaXRfb3Blbl9lcnJvcik7CiAKIC8qIHRoaXMgbXVzdCBiZSBjYWxsZWQgb24gYSBsb2NraCB0aGF0IGlzIGtub3duIHRvIGhhdmUgYSByZWZlcmVuY2VkIGxvY2sgKi8KLWludCBtZGNfc2V0X2xvY2tfZGF0YShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBfX3U2NCAqbG9ja2gsIHZvaWQgKmRhdGEsCi0JCSAgICAgIF9fdTY0ICpiaXRzKQoraW50IG1kY19zZXRfbG9ja19kYXRhKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIGNvbnN0IHN0cnVjdCBsdXN0cmVfaGFuZGxlICpsb2NraCwKKwkJICAgICAgdm9pZCAqZGF0YSwgX191NjQgKmJpdHMpCiB7CiAJc3RydWN0IGxkbG1fbG9jayAqbG9jazsKIAlzdHJ1Y3QgaW5vZGUgKm5ld19pbm9kZSA9IGRhdGE7CkBAIC0xMDIsMTAgKzEwMiwxMCBAQAogCWlmIChiaXRzKQogCQkqYml0cyA9IDA7CiAKLQlpZiAoISpsb2NraCkKKwlpZiAoIWx1c3RyZV9oYW5kbGVfaXNfdXNlZChsb2NraCkpCiAJCXJldHVybiAwOwogCi0JbG9jayA9IGxkbG1faGFuZGxlMmxvY2soKHN0cnVjdCBsdXN0cmVfaGFuZGxlICopbG9ja2gpOworCWxvY2sgPSBsZGxtX2hhbmRsZTJsb2NrKGxvY2toKTsKIAogCUxBU1NFUlQobG9jayk7CiAJbG9ja19yZXNfYW5kX2xvY2sobG9jayk7CkBAIC0xNzQsNyArMTc0LDcgQEAKIAlmaWRfYnVpbGRfcmVnX3Jlc19uYW1lKGZpZCwgJnJlc19pZCk7CiAKIAlyZXMgPSBsZGxtX3Jlc291cmNlX2dldChucywgTlVMTCwgJnJlc19pZCwgMCwgMCk7Ci0JaWYgKCFyZXMpCisJaWYgKElTX0VSUihyZXMpKQogCQlyZXR1cm4gMDsKIAogCWxvY2tfcmVzKHJlcyk7CkBAIC0xODUsMjggKzE4NSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIGZpbmQgYW55IGxkbG0gbG9jayBvZiB0aGUgaW5vZGUgaW4gbWRjCi0gKiByZXR1cm4gMCAgICBub3QgZmluZAotICoJMSAgICBmaW5kIG9uZQotICogICAgICA8IDAgICAgZXJyb3IKLSAqLwotaW50IG1kY19maW5kX2NiZGF0YShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAotCQkgICAgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkLAotCQkgICAgbGRsbV9pdGVyYXRvcl90IGl0LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBsZGxtX3Jlc19pZCByZXNfaWQ7Ci0JaW50IHJjID0gMDsKLQotCWZpZF9idWlsZF9yZWdfcmVzX25hbWUoKHN0cnVjdCBsdV9maWQgKilmaWQsICZyZXNfaWQpOwotCXJjID0gbGRsbV9yZXNvdXJjZV9pdGVyYXRlKGNsYXNzX2V4cDJvYmQoZXhwKS0+b2JkX25hbWVzcGFjZSwgJnJlc19pZCwKLQkJCQkgICBpdCwgZGF0YSk7Ci0JaWYgKHJjID09IExETE1fSVRFUl9TVE9QKQotCQlyZXR1cm4gMTsKLQllbHNlIGlmIChyYyA9PSBMRExNX0lURVJfQ09OVElOVUUpCi0JCXJldHVybiAwOwotCXJldHVybiByYzsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIG1kY19jbGVhcl9yZXBsYXlfZmxhZyhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgaW50IHJjKQogewogCS8qIERvbid0IGhvbGQgZXJyb3IgcmVxdWVzdHMgZm9yIHJlcGxheS4gKi8KQEAgLTI0MCwyNCArMjE4LDI0IEBACiAKIAkvKiBGSVhNRTogcmVtb3ZlIHRoaXMgZXhwbGljaXQgb2Zmc2V0LiAqLwogCXJjID0gc3B0bHJwY19jbGlfZW5sYXJnZV9yZXFidWYocmVxLCBETE1fSU5URU5UX1JFQ19PRkYgKyA0LAotCQkJCQlib2R5LT5lYWRhdGFzaXplKTsKKwkJCQkJYm9keS0+bWJvX2VhZGF0YXNpemUpOwogCWlmIChyYykgewogCQlDRVJST1IoIkNhbid0IGVubGFyZ2Ugc2VnbWVudCAlZCBzaXplIHRvICVkXG4iLAotCQkgICAgICAgRExNX0lOVEVOVF9SRUNfT0ZGICsgNCwgYm9keS0+ZWFkYXRhc2l6ZSk7Ci0JCWJvZHktPnZhbGlkICY9IH5PQkRfTURfRkxFQVNJWkU7Ci0JCWJvZHktPmVhZGF0YXNpemUgPSAwOworCQkgICAgICAgRExNX0lOVEVOVF9SRUNfT0ZGICsgNCwgYm9keS0+bWJvX2VhZGF0YXNpemUpOworCQlib2R5LT5tYm9fdmFsaWQgJj0gfk9CRF9NRF9GTEVBU0laRTsKKwkJYm9keS0+bWJvX2VhZGF0YXNpemUgPSAwOwogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqbWRjX2ludGVudF9vcGVuX3BhY2soc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKLQkJCQkJCSAgIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCwKLQkJCQkJCSAgIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQkJCQkJICAgdm9pZCAqbG1tLCBpbnQgbG1tc2l6ZSwKLQkJCQkJCSAgIHZvaWQgKmNiX2RhdGEpCitzdGF0aWMgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoKK21kY19pbnRlbnRfb3Blbl9wYWNrKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCwKKwkJICAgICBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSkKIHsKIAlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcTsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAgICAgKm9iZGRldiA9IGNsYXNzX2V4cDJvYmQoZXhwKTsKIAlzdHJ1Y3QgbGRsbV9pbnRlbnQgICAgKmxpdDsKKwljb25zdCB2b2lkICpsbW0gPSBvcF9kYXRhLT5vcF9kYXRhOworCXUzMiBsbW1zaXplID0gb3BfZGF0YS0+b3BfZGF0YV9zaXplOwogCUxJU1RfSEVBRChjYW5jZWxzKTsKIAlpbnQJCSAgICBjb3VudCA9IDA7CiAJaW50CQkgICAgbW9kZTsKQEAgLTI3NCw3ICsyNTIsNyBAQAogCQkJZWxzZQogCQkJCW1vZGUgPSBMQ0tfUFI7CiAJCX0gZWxzZSB7Ci0JCQlpZiAoaXQtPml0X2ZsYWdzICYgKEZNT0RFX1dSSVRFfE1EU19PUEVOX1RSVU5DKSkKKwkJCWlmIChpdC0+aXRfZmxhZ3MgJiAoRk1PREVfV1JJVEUgfCBNRFNfT1BFTl9UUlVOQykpCiAJCQkJbW9kZSA9IExDS19DVzsKIAkJCWVsc2UgaWYgKGl0LT5pdF9mbGFncyAmIF9fRk1PREVfRVhFQykKIAkJCQltb2RlID0gTENLX1BSOwpAQCAtMzI1LDYgKzMwMyw5IEBACiAJbWRjX29wZW5fcGFjayhyZXEsIG9wX2RhdGEsIGl0LT5pdF9jcmVhdGVfbW9kZSwgMCwgaXQtPml0X2ZsYWdzLCBsbW0sCiAJCSAgICAgIGxtbXNpemUpOwogCisJcmVxX2NhcHN1bGVfc2V0X3NpemUoJnJlcS0+cnFfcGlsbCwgJlJNRl9NRFRfTUQsIFJDTF9TRVJWRVIsCisJCQkgICAgIG9iZGRldi0+dS5jbGkuY2xfbWF4X21kc19lYXNpemUpOworCiAJcHRscnBjX3JlcXVlc3Rfc2V0X3JlcGxlbihyZXEpOwogCXJldHVybiByZXE7CiB9CkBAIC0zMzYsNyArMzE3LDggQEAKIHsKIAlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QJKnJlcTsKIAlzdHJ1Y3QgbGRsbV9pbnRlbnQJKmxpdDsKLQlpbnQJCQlyYywgY291bnQgPSAwLCBtYXhkYXRhOworCWludCByYywgY291bnQgPSAwOworCXUzMiBtYXhkYXRhOwogCUxJU1RfSEVBRChjYW5jZWxzKTsKIAogCXJlcSA9IHB0bHJwY19yZXF1ZXN0X2FsbG9jKGNsYXNzX2V4cDJjbGlpbXAoZXhwKSwKQEAgLTQyMSw3ICs0MDMsNyBAQAogCQkJCSAgICAgICBPQkRfTURfTUVBIHwgT0JEX01EX0ZMQUNMOwogCXN0cnVjdCBsZGxtX2ludGVudCAgICAqbGl0OwogCWludAkJICAgIHJjOwotCWludAkJICAgIGVhc2l6ZTsKKwl1MzIgZWFzaXplOwogCiAJcmVxID0gcHRscnBjX3JlcXVlc3RfYWxsb2MoY2xhc3NfZXhwMmNsaWltcChleHApLAogCQkJCSAgICZSUUZfTERMTV9JTlRFTlRfR0VUQVRUUik7CkBAIC01MjYsNyArNTA4LDcgQEAKIAlzdHJ1Y3QgbGRsbV9yZXBseSAgICpsb2NrcmVwOwogCXN0cnVjdCBsZGxtX2xvY2sgICAgKmxvY2s7CiAJdm9pZAkJKmx2Yl9kYXRhID0gTlVMTDsKLQlpbnQJCSAgbHZiX2xlbiA9IDA7CisJdTMyIGx2Yl9sZW4gPSAwOwogCiAJTEFTU0VSVChyYyA+PSAwKTsKIAkvKiBTaW1pbGFybHksIGlmIHdlJ3JlIGdvaW5nIHRvIHJlcGxheSB0aGlzIHJlcXVlc3QsIHdlIGRvbid0IHdhbnQgdG8KQEAgLTYwNSw3ICs1ODcsNyBAQAogCQkJbWRjX3NldF9vcGVuX3JlcGxheV9kYXRhKE5VTEwsIE5VTEwsIGl0KTsKIAkJfQogCi0JCWlmICgoYm9keS0+dmFsaWQgJiAoT0JEX01EX0ZMRElSRUEgfCBPQkRfTURfRkxFQVNJWkUpKSAhPSAwKSB7CisJCWlmICgoYm9keS0+bWJvX3ZhbGlkICYgKE9CRF9NRF9GTERJUkVBIHwgT0JEX01EX0ZMRUFTSVpFKSkgIT0gMCkgewogCQkJdm9pZCAqZWFkYXRhOwogCiAJCQltZGNfdXBkYXRlX21heF9lYV9mcm9tX2JvZHkoZXhwLCBib2R5KTsKQEAgLTYxNSw3ICs1OTcsNyBAQAogCQkJICogRXZlbnR1YWxseSwgb2JkX3VucGFja21kKCkgd2lsbCBjaGVjayB0aGUgY29udGVudHMuCiAJCQkgKi8KIAkJCWVhZGF0YSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9zaXplZF9nZXQocGlsbCwgJlJNRl9NRFRfTUQsCi0JCQkJCQkJICAgICAgYm9keS0+ZWFkYXRhc2l6ZSk7CisJCQkJCQkJICAgICAgYm9keS0+bWJvX2VhZGF0YXNpemUpOwogCQkJaWYgKCFlYWRhdGEpCiAJCQkJcmV0dXJuIC1FUFJPVE87CiAKQEAgLTYyMyw3ICs2MDUsNyBAQAogCQkJICogbG9jawogCQkJICovCiAJCQlsdmJfZGF0YSA9IGVhZGF0YTsKLQkJCWx2Yl9sZW4gPSBib2R5LT5lYWRhdGFzaXplOworCQkJbHZiX2xlbiA9IGJvZHktPm1ib19lYWRhdGFzaXplOwogCiAJCQkvKgogCQkJICogV2Ugc2F2ZSB0aGUgcmVwbHkgTE9WIEVBIGluIGNhc2Ugd2UgaGF2ZSB0byByZXBsYXkgYQpAQCAtNjM5LDIwICs2MjEsMjAgQEAKIAogCQkJCWlmIChyZXFfY2Fwc3VsZV9nZXRfc2l6ZShwaWxsLCAmUk1GX0VBREFUQSwKIAkJCQkJCQkgUkNMX0NMSUVOVCkgPAotCQkJCSAgICBib2R5LT5lYWRhdGFzaXplKQorCQkJCSAgICBib2R5LT5tYm9fZWFkYXRhc2l6ZSkKIAkJCQkJbWRjX3JlYWxsb2Nfb3Blbm1zZyhyZXEsIGJvZHkpOwogCQkJCWVsc2UKIAkJCQkJcmVxX2NhcHN1bGVfc2hyaW5rKHBpbGwsICZSTUZfRUFEQVRBLAotCQkJCQkJCSAgIGJvZHktPmVhZGF0YXNpemUsCisJCQkJCQkJICAgYm9keS0+bWJvX2VhZGF0YXNpemUsCiAJCQkJCQkJICAgUkNMX0NMSUVOVCk7CiAKIAkJCQlyZXFfY2Fwc3VsZV9zZXRfc2l6ZShwaWxsLCAmUk1GX0VBREFUQSwKIAkJCQkJCSAgICAgUkNMX0NMSUVOVCwKLQkJCQkJCSAgICAgYm9keS0+ZWFkYXRhc2l6ZSk7CisJCQkJCQkgICAgIGJvZHktPm1ib19lYWRhdGFzaXplKTsKIAogCQkJCWxtbSA9IHJlcV9jYXBzdWxlX2NsaWVudF9nZXQocGlsbCwgJlJNRl9FQURBVEEpOwogCQkJCWlmIChsbW0pCi0JCQkJCW1lbWNweShsbW0sIGVhZGF0YSwgYm9keS0+ZWFkYXRhc2l6ZSk7CisJCQkJCW1lbWNweShsbW0sIGVhZGF0YSwgYm9keS0+bWJvX2VhZGF0YXNpemUpOwogCQkJfQogCQl9CiAJfSBlbHNlIGlmIChpdC0+aXRfb3AgJiBJVF9MQVlPVVQpIHsKQEAgLTY2Miw3ICs2NDQsOCBAQAogCQlsdmJfbGVuID0gcmVxX2NhcHN1bGVfZ2V0X3NpemUocGlsbCwgJlJNRl9ETE1fTFZCLCBSQ0xfU0VSVkVSKTsKIAkJaWYgKGx2Yl9sZW4gPiAwKSB7CiAJCQlsdmJfZGF0YSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9zaXplZF9nZXQocGlsbCwKLQkJCQkJCQkmUk1GX0RMTV9MVkIsIGx2Yl9sZW4pOworCQkJCQkJCQkmUk1GX0RMTV9MVkIsCisJCQkJCQkJCWx2Yl9sZW4pOwogCQkJaWYgKCFsdmJfZGF0YSkKIAkJCQlyZXR1cm4gLUVQUk9UTzsKIAkJfQpAQCAtNzA1LDkgKzY4OCw5IEBACiAgKiB3ZSBkb24ndCBrbm93IGluIGFkdmFuY2UgdGhlIGZpbGUgdHlwZS4KICAqLwogaW50IG1kY19lbnF1ZXVlKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsZGxtX2VucXVldWVfaW5mbyAqZWluZm8sCisJCWNvbnN0IGxkbG1fcG9saWN5X2RhdGFfdCAqcG9saWN5LAogCQlzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQlzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAqbG9ja2gsIHZvaWQgKmxtbSwgaW50IGxtbXNpemUsCi0JCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXAsIHU2NCBleHRyYV9sb2NrX2ZsYWdzKQorCQlzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAqbG9ja2gsIHU2NCBleHRyYV9sb2NrX2ZsYWdzKQogewogCXN0YXRpYyBjb25zdCBsZGxtX3BvbGljeV9kYXRhX3QgbG9va3VwX3BvbGljeSA9IHsKIAkJLmxfaW5vZGViaXRzID0geyBNRFNfSU5PREVMT0NLX0xPT0tVUCB9CkBAIC03MjEsOSArNzA0LDggQEAKIAlzdGF0aWMgY29uc3QgbGRsbV9wb2xpY3lfZGF0YV90IGdldHhhdHRyX3BvbGljeSA9IHsKIAkJLmxfaW5vZGViaXRzID0geyBNRFNfSU5PREVMT0NLX1hBVFRSIH0KIAl9OwotCWxkbG1fcG9saWN5X2RhdGFfdCBjb25zdCAqcG9saWN5ID0gJmxvb2t1cF9wb2xpY3k7CiAJc3RydWN0IG9iZF9kZXZpY2UgKm9iZGRldiA9IGNsYXNzX2V4cDJvYmQoZXhwKTsKLQlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcTsKKwlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSA9IE5VTEw7CiAJdTY0IGZsYWdzLCBzYXZlZF9mbGFncyA9IGV4dHJhX2xvY2tfZmxhZ3M7CiAJc3RydWN0IGxkbG1fcmVzX2lkIHJlc19pZDsKIAlpbnQgZ2VuZXJhdGlvbiwgcmVzZW5kcyA9IDA7CkBAIC03MzMsNDAgKzcxNSwzMiBAQAogCiAJTEFTU0VSVEYoIWl0IHx8IGVpbmZvLT5laV90eXBlID09IExETE1fSUJJVFMsICJsb2NrIHR5cGUgJWRcbiIsCiAJCSBlaW5mby0+ZWlfdHlwZSk7Ci0KIAlmaWRfYnVpbGRfcmVnX3Jlc19uYW1lKCZvcF9kYXRhLT5vcF9maWQxLCAmcmVzX2lkKTsKIAogCWlmIChpdCkgeworCQlMQVNTRVJUKCFwb2xpY3kpOworCiAJCXNhdmVkX2ZsYWdzIHw9IExETE1fRkxfSEFTX0lOVEVOVDsKLQkJaWYgKGl0LT5pdF9vcCAmIChJVF9VTkxJTksgfCBJVF9HRVRBVFRSIHwgSVRfUkVBRERJUikpCisJCWlmIChpdC0+aXRfb3AgJiAoSVRfT1BFTiB8IElUX1VOTElOSyB8IElUX0dFVEFUVFIgfCBJVF9SRUFERElSKSkKIAkJCXBvbGljeSA9ICZ1cGRhdGVfcG9saWN5OwogCQllbHNlIGlmIChpdC0+aXRfb3AgJiBJVF9MQVlPVVQpCiAJCQlwb2xpY3kgPSAmbGF5b3V0X3BvbGljeTsKIAkJZWxzZSBpZiAoaXQtPml0X29wICYgKElUX0dFVFhBVFRSIHwgSVRfU0VUWEFUVFIpKQogCQkJcG9saWN5ID0gJmdldHhhdHRyX3BvbGljeTsKKwkJZWxzZQorCQkJcG9saWN5ID0gJmxvb2t1cF9wb2xpY3k7CiAJfQogCi0JTEFTU0VSVCghcmVxcCk7Ci0KIAlnZW5lcmF0aW9uID0gb2JkZGV2LT51LmNsaS5jbF9pbXBvcnQtPmltcF9nZW5lcmF0aW9uOwogcmVzZW5kOgogCWZsYWdzID0gc2F2ZWRfZmxhZ3M7CiAJaWYgKCFpdCkgewotCQkvKiBUaGUgb25seSB3YXkgcmlnaHQgbm93IGlzIEZMT0NLLCBpbiB0aGlzIGNhc2Ugd2UgaGlkZSBmbG9jawotCQkgKiBwb2xpY3kgYXMgbG1tLCBidXQgbG1tc2l6ZSBpcyAwCi0JCSAqLwotCQlMQVNTRVJUKGxtbSAmJiBsbW1zaXplID09IDApOworCQkvKiBUaGUgb25seSB3YXkgcmlnaHQgbm93IGlzIEZMT0NLLiAqLwogCQlMQVNTRVJURihlaW5mby0+ZWlfdHlwZSA9PSBMRExNX0ZMT0NLLCAibG9jayB0eXBlICVkXG4iLAogCQkJIGVpbmZvLT5laV90eXBlKTsKLQkJcG9saWN5ID0gbG1tOwogCQlyZXNfaWQubmFtZVszXSA9IExETE1fRkxPQ0s7Ci0JCXJlcSA9IE5VTEw7CiAJfSBlbHNlIGlmIChpdC0+aXRfb3AgJiBJVF9PUEVOKSB7Ci0JCXJlcSA9IG1kY19pbnRlbnRfb3Blbl9wYWNrKGV4cCwgaXQsIG9wX2RhdGEsIGxtbSwgbG1tc2l6ZSwKLQkJCQkJICAgZWluZm8tPmVpX2NiZGF0YSk7Ci0JCXBvbGljeSA9ICZ1cGRhdGVfcG9saWN5OwotCQllaW5mby0+ZWlfY2JkYXRhID0gTlVMTDsKLQkJbG1tID0gTlVMTDsKKwkJcmVxID0gbWRjX2ludGVudF9vcGVuX3BhY2soZXhwLCBpdCwgb3BfZGF0YSk7CiAJfSBlbHNlIGlmIChpdC0+aXRfb3AgJiBJVF9VTkxJTkspIHsKIAkJcmVxID0gbWRjX2ludGVudF91bmxpbmtfcGFjayhleHAsIGl0LCBvcF9kYXRhKTsKIAl9IGVsc2UgaWYgKGl0LT5pdF9vcCAmIChJVF9HRVRBVFRSIHwgSVRfTE9PS1VQKSkgewpAQCAtODA2LDcgKzc4MCw3IEBACiAJICovCiAJaWYgKGl0KSB7CiAJCW1kY19nZXRfcnBjX2xvY2sob2JkZGV2LT51LmNsaS5jbF9ycGNfbG9jaywgaXQpOwotCQlyYyA9IG1kY19lbnRlcl9yZXF1ZXN0KCZvYmRkZXYtPnUuY2xpKTsKKwkJcmMgPSBvYmRfZ2V0X3JlcXVlc3Rfc2xvdCgmb2JkZGV2LT51LmNsaSk7CiAJCWlmIChyYyAhPSAwKSB7CiAJCQltZGNfcHV0X3JwY19sb2NrKG9iZGRldi0+dS5jbGkuY2xfcnBjX2xvY2ssIGl0KTsKIAkJCW1kY19jbGVhcl9yZXBsYXlfZmxhZyhyZXEsIDApOwpAQCAtODM0LDEzICs4MDgsMTIgQEAKIAkJcmV0dXJuIHJjOwogCX0KIAotCW1kY19leGl0X3JlcXVlc3QoJm9iZGRldi0+dS5jbGkpOworCW9iZF9wdXRfcmVxdWVzdF9zbG90KCZvYmRkZXYtPnUuY2xpKTsKIAltZGNfcHV0X3JwY19sb2NrKG9iZGRldi0+dS5jbGkuY2xfcnBjX2xvY2ssIGl0KTsKIAogCWlmIChyYyA8IDApIHsKLQkJQ0RFQlVHX0xJTUlUKChyYyA9PSAtRUFDQ0VTIHx8IHJjID09IC1FSURSTSkgPyBEX0lORk8gOiBEX0VSUk9SLAotCQkJICAgICAiJXM6IGxkbG1fY2xpX2VucXVldWUgZmFpbGVkOiByYyA9ICVkXG4iLAotCQkJICAgICBvYmRkZXYtPm9iZF9uYW1lLCByYyk7CisJCUNERUJVRyhEX0lORk8sICIlczogbGRsbV9jbGlfZW5xdWV1ZSBmYWlsZWQ6IHJjID0gJWRcbiIsCisJCSAgICAgICBvYmRkZXYtPm9iZF9uYW1lLCByYyk7CiAKIAkJbWRjX2NsZWFyX3JlcGxheV9mbGFnKHJlcSwgcmMpOwogCQlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7CkBAIC05MDMsNiArODc2LDkgQEAKIAlMQVNTRVJUKHJlcXVlc3QgIT0gTFBfUE9JU09OKTsKIAlMQVNTRVJUKHJlcXVlc3QtPnJxX3JlcG1zZyAhPSBMUF9QT0lTT04pOwogCisJaWYgKGl0LT5pdF9vcCAmIElUX1JFQURESVIpCisJCXJldHVybiAwOworCiAJaWYgKCFpdF9kaXNwb3NpdGlvbihpdCwgRElTUF9JVF9FWEVDRCkpIHsKIAkJLyogVGhlIHNlcnZlciBmYWlsZWQgYmVmb3JlIGl0IGV2ZW4gc3RhcnRlZCBleGVjdXRpbmcgdGhlCiAJCSAqIGludGVudCwgaS5lLiBiZWNhdXNlIGl0IGNvdWxkbid0IHVucGFjayB0aGUgcmVxdWVzdC4KQEAgLTkxNywyNyArODkzLDYgQEAKIAltZHRfYm9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJnJlcXVlc3QtPnJxX3BpbGwsICZSTUZfTURUX0JPRFkpOwogCUxBU1NFUlQobWR0X2JvZHkpOyAgICAgIC8qIG1kY19lbnF1ZXVlIGNoZWNrZWQgKi8KIAotCS8qIElmIHdlIHdlcmUgcmV2YWxpZGF0aW5nIGEgZmlkL25hbWUgcGFpciwgbWFyayB0aGUgaW50ZW50IGluCi0JICogY2FzZSB3ZSBmYWlsIGFuZCBnZXQgY2FsbGVkIGFnYWluIGZyb20gbG9va3VwCi0JICovCi0JaWYgKGZpZF9pc19zYW5lKCZvcF9kYXRhLT5vcF9maWQyKSAmJgotCSAgICBpdC0+aXRfY3JlYXRlX21vZGUgJiBNX0NIRUNLX1NUQUxFICYmCi0JICAgIGl0LT5pdF9vcCAhPSBJVF9HRVRBVFRSKSB7Ci0JCS8qIEFsc286IGRpZCB3ZSBmaW5kIHRoZSBzYW1lIGlub2RlPyAqLwotCQkvKiBzZXZlciBjYW4gcmV0dXJuIG9uZSBvZiB0d28gZmlkczoKLQkJICogb3BfZmlkMiAtIG5ldyBhbGxvY2F0ZWQgZmlkIC0gaWYgZmlsZSBpcyBjcmVhdGVkLgotCQkgKiBvcF9maWQzIC0gZXhpc3RlbnQgZmlkIC0gaWYgZmlsZSBvbmx5IG9wZW4uCi0JCSAqIG9wX2ZpZDMgaXMgc2F2ZWQgaW4gbG12X2ludGVudF9vcGVuCi0JCSAqLwotCQlpZiAoKCFsdV9maWRfZXEoJm9wX2RhdGEtPm9wX2ZpZDIsICZtZHRfYm9keS0+ZmlkMSkpICYmCi0JCSAgICAoIWx1X2ZpZF9lcSgmb3BfZGF0YS0+b3BfZmlkMywgJm1kdF9ib2R5LT5maWQxKSkpIHsKLQkJCUNERUJVRyhEX0RFTlRSWSwgIkZvdW5kIHN0YWxlIGRhdGEgIkRGSUQiKCJERklEIikvIkRGSUQKLQkJCSAgICAgICAiXG4iLCBQRklEKCZvcF9kYXRhLT5vcF9maWQyKSwKLQkJCSAgICAgICBQRklEKCZvcF9kYXRhLT5vcF9maWQyKSwgUEZJRCgmbWR0X2JvZHktPmZpZDEpKTsKLQkJCXJldHVybiAtRVNUQUxFOwotCQl9Ci0JfQotCiAJcmMgPSBpdF9vcGVuX2Vycm9yKERJU1BfTE9PS1VQX0VYRUNELCBpdCk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CkBAIC05ODAsMTAgKzkzNSwxMCBAQAogCiAJCUxETE1fREVCVUcobG9jaywgIm1hdGNoaW5nIGFnYWluc3QgdGhpcyIpOwogCi0JCUxBU1NFUlRGKGZpZF9yZXNfbmFtZV9lcSgmbWR0X2JvZHktPmZpZDEsCisJCUxBU1NFUlRGKGZpZF9yZXNfbmFtZV9lcSgmbWR0X2JvZHktPm1ib19maWQxLAogCQkJCQkgJmxvY2stPmxfcmVzb3VyY2UtPmxyX25hbWUpLAogCQkJICJMb2NrIHJlc19pZDogIkRMRExNUkVTIiwgZmlkOiAiREZJRCJcbiIsCi0JCQkgUExETE1SRVMobG9jay0+bF9yZXNvdXJjZSksIFBGSUQoJm1kdF9ib2R5LT5maWQxKSk7CisJCQkgUExETE1SRVMobG9jay0+bF9yZXNvdXJjZSksIFBGSUQoJm1kdF9ib2R5LT5tYm9fZmlkMSkpOwogCQlMRExNX0xPQ0tfUFVUKGxvY2spOwogCiAJCW1lbWNweSgmb2xkX2xvY2ssIGxvY2toLCBzaXplb2YoKmxvY2toKSk7CkBAIC05OTgsOCArOTUzLDggQEAKIAl9CiAJQ0RFQlVHKERfREVOVFJZLAogCSAgICAgICAiRF9JVCBkZW50cnkgJS4qcyBpbnRlbnQ6ICVzIHN0YXR1cyAlZCBkaXNwICV4IHJjICVkXG4iLAotCSAgICAgICBvcF9kYXRhLT5vcF9uYW1lbGVuLCBvcF9kYXRhLT5vcF9uYW1lLCBsZGxtX2l0MnN0cihpdC0+aXRfb3ApLAotCSAgICAgICBpdC0+aXRfc3RhdHVzLCBpdC0+aXRfZGlzcG9zaXRpb24sIHJjKTsKKwkgICAgICAgKGludClvcF9kYXRhLT5vcF9uYW1lbGVuLCBvcF9kYXRhLT5vcF9uYW1lLAorCSAgICAgICBsZGxtX2l0MnN0cihpdC0+aXRfb3ApLCBpdC0+aXRfc3RhdHVzLCBpdC0+aXRfZGlzcG9zaXRpb24sIHJjKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTEwNDIsNiArOTk3LDkgQEAKIAkJCQkJCSAgTURTX0lOT0RFTE9DS19MT09LVVAgfAogCQkJCQkJICBNRFNfSU5PREVMT0NLX1BFUk07CiAJCQlicmVhazsKKwkJY2FzZSBJVF9SRUFERElSOgorCQkJcG9saWN5LmxfaW5vZGViaXRzLmJpdHMgPSBNRFNfSU5PREVMT0NLX1VQREFURTsKKwkJCWJyZWFrOwogCQljYXNlIElUX0xBWU9VVDoKIAkJCXBvbGljeS5sX2lub2RlYml0cy5iaXRzID0gTURTX0lOT0RFTE9DS19MQVlPVVQ7CiAJCQlicmVhazsKQEAgLTEwOTUsMTAgKzEwNTMsOCBAQAogICogY2hpbGQgbG9va3VwLgogICovCiBpbnQgbWRjX2ludGVudF9sb2NrKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQkgICAgdm9pZCAqbG1tLCBpbnQgbG1tc2l6ZSwgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0LAotCQkgICAgaW50IGxvb2t1cF9mbGFncywgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxcCwKLQkJICAgIGxkbG1fYmxvY2tpbmdfY2FsbGJhY2sgY2JfYmxvY2tpbmcsCi0JCSAgICBfX3U2NCBleHRyYV9sb2NrX2ZsYWdzKQorCQkgICAgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0LCBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXFwLAorCQkgICAgbGRsbV9ibG9ja2luZ19jYWxsYmFjayBjYl9ibG9ja2luZywgX191NjQgZXh0cmFfbG9ja19mbGFncykKIHsKIAlzdHJ1Y3QgbGRsbV9lbnF1ZXVlX2luZm8gZWluZm8gPSB7CiAJCS5laV90eXBlCT0gTERMTV9JQklUUywKQEAgLTExMTIsMTQgKzEwNjgsMTQgQEAKIAlMQVNTRVJUKGl0KTsKIAogCUNERUJVRyhEX0RMTVRSQUNFLCAiKG5hbWU6ICUuKnMsIkRGSUQiKSBpbiBvYmogIkRGSUQKLQkJIiwgaW50ZW50OiAlcyBmbGFncyAlI0xvXG4iLCBvcF9kYXRhLT5vcF9uYW1lbGVuLAorCQkiLCBpbnRlbnQ6ICVzIGZsYWdzICUjTG9cbiIsIChpbnQpb3BfZGF0YS0+b3BfbmFtZWxlbiwKIAkJb3BfZGF0YS0+b3BfbmFtZSwgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMiksCiAJCVBGSUQoJm9wX2RhdGEtPm9wX2ZpZDEpLCBsZGxtX2l0MnN0cihpdC0+aXRfb3ApLAogCQlpdC0+aXRfZmxhZ3MpOwogCiAJbG9ja2guY29va2llID0gMDsKIAlpZiAoZmlkX2lzX3NhbmUoJm9wX2RhdGEtPm9wX2ZpZDIpICYmCi0JICAgIChpdC0+aXRfb3AgJiAoSVRfTE9PS1VQIHwgSVRfR0VUQVRUUikpKSB7CisJICAgIChpdC0+aXRfb3AgJiAoSVRfTE9PS1VQIHwgSVRfR0VUQVRUUiB8IElUX1JFQURESVIpKSkgewogCQkvKiBXZSBjb3VsZCBqdXN0IHJldHVybiAxIGltbWVkaWF0ZWx5LCBidXQgc2luY2Ugd2Ugc2hvdWxkIG9ubHkKIAkJICogYmUgY2FsbGVkIGluIHJldmFsaWRhdGVfaXQgaWYgd2UgYWxyZWFkeSBoYXZlIGEgbG9jaywgbGV0J3MKIAkJICogdmVyaWZ5IHRoYXQuCkBAIC0xMTM1LDEzICsxMDkxLDEzIEBACiAKIAkvKiBGb3IgY2FzZSBpZiB1cHBlciBsYXllciBkaWQgbm90IGFsbG9jIGZpZCwgZG8gaXQgbm93LiAqLwogCWlmICghZmlkX2lzX3NhbmUoJm9wX2RhdGEtPm9wX2ZpZDIpICYmIGl0LT5pdF9vcCAmIElUX0NSRUFUKSB7Ci0JCXJjID0gbWRjX2ZpZF9hbGxvYyhleHAsICZvcF9kYXRhLT5vcF9maWQyLCBvcF9kYXRhKTsKKwkJcmMgPSBtZGNfZmlkX2FsbG9jKE5VTEwsIGV4cCwgJm9wX2RhdGEtPm9wX2ZpZDIsIG9wX2RhdGEpOwogCQlpZiAocmMgPCAwKSB7CiAJCQlDRVJST1IoIkNhbid0IGFsbG9jIG5ldyBmaWQsIHJjICVkXG4iLCByYyk7CiAJCQlyZXR1cm4gcmM7CiAJCX0KIAl9Ci0JcmMgPSBtZGNfZW5xdWV1ZShleHAsICZlaW5mbywgaXQsIG9wX2RhdGEsICZsb2NraCwgbG1tLCBsbW1zaXplLCBOVUxMLAorCXJjID0gbWRjX2VucXVldWUoZXhwLCAmZWluZm8sIE5VTEwsIGl0LCBvcF9kYXRhLCAmbG9ja2gsCiAJCQkgZXh0cmFfbG9ja19mbGFncyk7CiAJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIHJjOwpAQCAtMTE3MCw3ICsxMTI2LDcgQEAKIAogCW9iZGRldiA9IGNsYXNzX2V4cDJvYmQoZXhwKTsKIAotCW1kY19leGl0X3JlcXVlc3QoJm9iZGRldi0+dS5jbGkpOworCW9iZF9wdXRfcmVxdWVzdF9zbG90KCZvYmRkZXYtPnUuY2xpKTsKIAlpZiAoT0JEX0ZBSUxfQ0hFQ0soT0JEX0ZBSUxfTURDX0dFVEFUVFJfRU5RVUVVRSkpCiAJCXJjID0gLUVUSU1FRE9VVDsKIApAQCAtMTIyMiwxNSArMTE3OCwxNSBAQAogCiAJQ0RFQlVHKERfRExNVFJBQ0UsCiAJICAgICAgICJuYW1lOiAlLipzIGluIGlub2RlICIgREZJRCAiLCBpbnRlbnQ6ICVzIGZsYWdzICUjTG9cbiIsCi0JICAgICAgIG9wX2RhdGEtPm9wX25hbWVsZW4sIG9wX2RhdGEtPm9wX25hbWUsIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDEpLAotCSAgICAgICBsZGxtX2l0MnN0cihpdC0+aXRfb3ApLCBpdC0+aXRfZmxhZ3MpOworCSAgICAgICAoaW50KW9wX2RhdGEtPm9wX25hbWVsZW4sIG9wX2RhdGEtPm9wX25hbWUsCisJICAgICAgIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDEpLCBsZGxtX2l0MnN0cihpdC0+aXRfb3ApLCBpdC0+aXRfZmxhZ3MpOwogCiAJZmlkX2J1aWxkX3JlZ19yZXNfbmFtZSgmb3BfZGF0YS0+b3BfZmlkMSwgJnJlc19pZCk7CiAJcmVxID0gbWRjX2ludGVudF9nZXRhdHRyX3BhY2soZXhwLCBpdCwgb3BfZGF0YSk7CiAJaWYgKElTX0VSUihyZXEpKQogCQlyZXR1cm4gUFRSX0VSUihyZXEpOwogCi0JcmMgPSBtZGNfZW50ZXJfcmVxdWVzdCgmb2JkZGV2LT51LmNsaSk7CisJcmMgPSBvYmRfZ2V0X3JlcXVlc3Rfc2xvdCgmb2JkZGV2LT51LmNsaSk7CiAJaWYgKHJjICE9IDApIHsKIAkJcHRscnBjX3JlcV9maW5pc2hlZChyZXEpOwogCQlyZXR1cm4gcmM7CkBAIC0xMjM5LDcgKzExOTUsNyBAQAogCXJjID0gbGRsbV9jbGlfZW5xdWV1ZShleHAsICZyZXEsIGVpbmZvLCAmcmVzX2lkLCAmcG9saWN5LCAmZmxhZ3MsIE5VTEwsCiAJCQkgICAgICAwLCBMVkJfVF9OT05FLCAmbWluZm8tPm1pX2xvY2toLCAxKTsKIAlpZiAocmMgPCAwKSB7Ci0JCW1kY19leGl0X3JlcXVlc3QoJm9iZGRldi0+dS5jbGkpOworCQlvYmRfcHV0X3JlcXVlc3Rfc2xvdCgmb2JkZGV2LT51LmNsaSk7CiAJCXB0bHJwY19yZXFfZmluaXNoZWQocmVxKTsKIAkJcmV0dXJuIHJjOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfcmVpbnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfcmVpbnQuYwppbmRleCA1ZGJhMmM4Li5jOTIxZTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX3JlaW50LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19yZWludC5jCkBAIC04Niw3ICs4Niw3IEBACiAJZmlkX2J1aWxkX3JlZ19yZXNfbmFtZShmaWQsICZyZXNfaWQpOwogCXJlcyA9IGxkbG1fcmVzb3VyY2VfZ2V0KGV4cC0+ZXhwX29iZC0+b2JkX25hbWVzcGFjZSwKIAkJCQlOVUxMLCAmcmVzX2lkLCAwLCAwKTsKLQlpZiAoIXJlcykKKwlpZiAoSVNfRVJSKHJlcykpCiAJCXJldHVybiAwOwogCUxETE1fUkVTT1VSQ0VfQUREUkVGKHJlcyk7CiAJLyogSW5pdGlhbGl6ZSBpYml0cyBsb2NrIHBvbGljeS4gKi8KQEAgLTk5LDcgKzk5LDcgQEAKIH0KIAogaW50IG1kY19zZXRhdHRyKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQl2b2lkICplYSwgaW50IGVhbGVuLCB2b2lkICplYTIsIGludCBlYTJsZW4sCisJCXZvaWQgKmVhLCBzaXplX3QgZWFsZW4sIHZvaWQgKmVhMiwgc2l6ZV90IGVhMmxlbiwKIAkJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCwgc3RydWN0IG1kX29wZW5fZGF0YSAqKm1vZCkKIHsKIAlMSVNUX0hFQUQoY2FuY2Vscyk7CkBAIC0xMTAsMTEgKzExMCwxMCBAQAogCV9fdTY0IGJpdHM7CiAKIAliaXRzID0gTURTX0lOT0RFTE9DS19VUERBVEU7Ci0JaWYgKG9wX2RhdGEtPm9wX2F0dHIuaWFfdmFsaWQgJiAoQVRUUl9NT0RFfEFUVFJfVUlEfEFUVFJfR0lEKSkKKwlpZiAob3BfZGF0YS0+b3BfYXR0ci5pYV92YWxpZCAmIChBVFRSX01PREUgfCBBVFRSX1VJRCB8IEFUVFJfR0lEKSkKIAkJYml0cyB8PSBNRFNfSU5PREVMT0NLX0xPT0tVUDsKIAlpZiAoKG9wX2RhdGEtPm9wX2ZsYWdzICYgTUZfTURDX0NBTkNFTF9GSUQxKSAmJgotCSAgICAoZmlkX2lzX3NhbmUoJm9wX2RhdGEtPm9wX2ZpZDEpKSAmJgotCSAgICAhT0JEX0ZBSUxfQ0hFQ0soT0JEX0ZBSUxfTERMTV9CTF9DQUxMQkFDS19ORVQpKQorCSAgICAoZmlkX2lzX3NhbmUoJm9wX2RhdGEtPm9wX2ZpZDEpKSkKIAkJY291bnQgPSBtZGNfcmVzb3VyY2VfZ2V0X3VudXNlZChleHAsICZvcF9kYXRhLT5vcF9maWQxLAogCQkJCQkJJmNhbmNlbHMsIExDS19FWCwgYml0cyk7CiAJcmVxID0gcHRscnBjX3JlcXVlc3RfYWxsb2MoY2xhc3NfZXhwMmNsaWltcChleHApLApAQCAtMTc3LDggKzE3Niw4IEBACiAKIAkJZXBvY2ggPSByZXFfY2Fwc3VsZV9jbGllbnRfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfTURUX0VQT0NIKTsKIAkJYm9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7Ci0JCWVwb2NoLT5oYW5kbGUgPSBib2R5LT5oYW5kbGU7Ci0JCWVwb2NoLT5pb2Vwb2NoID0gYm9keS0+aW9lcG9jaDsKKwkJZXBvY2gtPmhhbmRsZSA9IGJvZHktPm1ib19oYW5kbGU7CisJCWVwb2NoLT5pb2Vwb2NoID0gYm9keS0+bWJvX2lvZXBvY2g7CiAJCXJlcS0+cnFfcmVwbGF5X2NiID0gbWRjX3JlcGxheV9vcGVuOwogCS8qKiBidWcgMzYzMywgb3BlbiBtYXkgYmUgY29tbWl0dGVkIGFuZCBlc3RhbGUgYW5zd2VyIGlzIG5vdCBlcnJvciAqLwogCX0gZWxzZSBpZiAocmMgPT0gLUVTVEFMRSAmJiAob3BfZGF0YS0+b3BfZmxhZ3MgJiBNRl9TT01fQ0hBTkdFKSkgewpAQCAtMTk3LDkgKzE5Niw5IEBACiB9CiAKIGludCBtZGNfY3JlYXRlKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCSAgICAgICBjb25zdCB2b2lkICpkYXRhLCBpbnQgZGF0YWxlbiwgaW50IG1vZGUsIF9fdTMyIHVpZCwgX191MzIgZ2lkLAotCSAgICAgICBjZnNfY2FwX3QgY2FwX2VmZmVjdGl2ZSwgX191NjQgcmRldiwKLQkgICAgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCkKKwkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFsZW4sIHVtb2RlX3QgbW9kZSwKKwkgICAgICAgdWlkX3QgdWlkLCBnaWRfdCBnaWQsIGNmc19jYXBfdCBjYXBfZWZmZWN0aXZlLAorCSAgICAgICBfX3U2NCByZGV2LCBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0KQogewogCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxOwogCWludCBsZXZlbCwgcmM7CkBAIC0yMTQsMTEgKzIxMyw5IEBACiAJCSAqIG1kY19maWRfYWxsb2MoKSBtYXkgcmV0dXJuIGVycm5vIDEgaW4gY2FzZSBvZiBzd2l0Y2ggdG8gbmV3CiAJCSAqIHNlcXVlbmNlLCBoYW5kbGUgdGhpcy4KIAkJICovCi0JCXJjID0gbWRjX2ZpZF9hbGxvYyhleHAsICZvcF9kYXRhLT5vcF9maWQyLCBvcF9kYXRhKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJQ0VSUk9SKCJDYW4ndCBhbGxvYyBuZXcgZmlkLCByYyAlZFxuIiwgcmMpOworCQlyYyA9IG1kY19maWRfYWxsb2MoTlVMTCwgZXhwLCAmb3BfZGF0YS0+b3BfZmlkMiwgb3BfZGF0YSk7CisJCWlmIChyYyA8IDApCiAJCQlyZXR1cm4gcmM7Ci0JCX0KIAl9CiAKIHJlYnVpbGQ6CkBAIC0zMDcsMTQgKzMwNCwxMiBAQAogCUxBU1NFUlQoIXJlcSk7CiAKIAlpZiAoKG9wX2RhdGEtPm9wX2ZsYWdzICYgTUZfTURDX0NBTkNFTF9GSUQxKSAmJgotCSAgICAoZmlkX2lzX3NhbmUoJm9wX2RhdGEtPm9wX2ZpZDEpKSAmJgotCSAgICAhT0JEX0ZBSUxfQ0hFQ0soT0JEX0ZBSUxfTERMTV9CTF9DQUxMQkFDS19ORVQpKQorCSAgICAoZmlkX2lzX3NhbmUoJm9wX2RhdGEtPm9wX2ZpZDEpKSkKIAkJY291bnQgPSBtZGNfcmVzb3VyY2VfZ2V0X3VudXNlZChleHAsICZvcF9kYXRhLT5vcF9maWQxLAogCQkJCQkJJmNhbmNlbHMsIExDS19FWCwKIAkJCQkJCU1EU19JTk9ERUxPQ0tfVVBEQVRFKTsKIAlpZiAoKG9wX2RhdGEtPm9wX2ZsYWdzICYgTUZfTURDX0NBTkNFTF9GSUQzKSAmJgotCSAgICAoZmlkX2lzX3NhbmUoJm9wX2RhdGEtPm9wX2ZpZDMpKSAmJgotCSAgICAhT0JEX0ZBSUxfQ0hFQ0soT0JEX0ZBSUxfTERMTV9CTF9DQUxMQkFDS19ORVQpKQorCSAgICAoZmlkX2lzX3NhbmUoJm9wX2RhdGEtPm9wX2ZpZDMpKSkKIAkJY291bnQgKz0gbWRjX3Jlc291cmNlX2dldF91bnVzZWQoZXhwLCAmb3BfZGF0YS0+b3BfZmlkMywKIAkJCQkJCSAmY2FuY2VscywgTENLX0VYLAogCQkJCQkJIE1EU19JTk9ERUxPQ0tfRlVMTCk7CkBAIC0zOTQsNyArMzg5LDcgQEAKIH0KIAogaW50IG1kY19yZW5hbWUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JICAgICAgIGNvbnN0IGNoYXIgKm9sZCwgaW50IG9sZGxlbiwgY29uc3QgY2hhciAqbmV3LCBpbnQgbmV3bGVuLAorCSAgICAgICBjb25zdCBjaGFyICpvbGQsIHNpemVfdCBvbGRsZW4sIGNvbnN0IGNoYXIgKm5ldywgc2l6ZV90IG5ld2xlbiwKIAkgICAgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCkKIHsKIAlMSVNUX0hFQUQoY2FuY2Vscyk7CkBAIC00MzEsNyArNDI2LDggQEAKIAl9CiAKIAlyZXFfY2Fwc3VsZV9zZXRfc2l6ZSgmcmVxLT5ycV9waWxsLCAmUk1GX05BTUUsIFJDTF9DTElFTlQsIG9sZGxlbiArIDEpOwotCXJlcV9jYXBzdWxlX3NldF9zaXplKCZyZXEtPnJxX3BpbGwsICZSTUZfU1lNVEdULCBSQ0xfQ0xJRU5ULCBuZXdsZW4rMSk7CisJcmVxX2NhcHN1bGVfc2V0X3NpemUoJnJlcS0+cnFfcGlsbCwgJlJNRl9TWU1UR1QsIFJDTF9DTElFTlQsCisJCQkgICAgIG5ld2xlbiArIDEpOwogCiAJcmMgPSBtZGNfcHJlcF9lbGNfcmVxKGV4cCwgcmVxLCBNRFNfUkVJTlQsICZjYW5jZWxzLCBjb3VudCk7CiAJaWYgKHJjKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX3JlcXVlc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfcmVxdWVzdC5jCmluZGV4IDU0MjgwMWYuLmY1NmVhNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfcmVxdWVzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfcmVxdWVzdC5jCkBAIC0zOSw3ICszOSw5IEBACiAjIGluY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KIAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2FjbC5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV9pb2N0bC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkX2NsYXNzLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbG12LmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfZmlkLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9scHJvY2ZzX3N0YXR1cy5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX3BhcmFtLmgiCkBAIC01NywxNiArNTksMTYgQEAKIAlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gJnJlcS0+cnFfaW1wb3J0LT5pbXBfb2JkLT51LmNsaTsKIAlpbnQgcmM7CiAKLQkvKiBtZGNfZW50ZXJfcmVxdWVzdCgpIGVuc3VyZXMgdGhhdCB0aGlzIGNsaWVudCBoYXMgbm8gbW9yZQorCS8qIG9iZF9nZXRfcmVxdWVzdF9zbG90KCkgZW5zdXJlcyB0aGF0IHRoaXMgY2xpZW50IGhhcyBubyBtb3JlCiAJICogdGhhbiBjbF9tYXhfcnBjc19pbl9mbGlnaHQgUlBDcyBzaW11bHRhbmVvdXNseSBpbmYgbGlnaHQKIAkgKiBhZ2FpbnN0IGFuIE1EVC4KIAkgKi8KLQlyYyA9IG1kY19lbnRlcl9yZXF1ZXN0KGNsaSk7CisJcmMgPSBvYmRfZ2V0X3JlcXVlc3Rfc2xvdChjbGkpOwogCWlmIChyYyAhPSAwKQogCQlyZXR1cm4gcmM7CiAKIAlyYyA9IHB0bHJwY19xdWV1ZV93YWl0KHJlcSk7Ci0JbWRjX2V4aXRfcmVxdWVzdChjbGkpOworCW9iZF9wdXRfcmVxdWVzdF9zbG90KGNsaSk7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC05OCw3ICsxMDAsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQkqcm9vdGZpZCA9IGJvZHktPmZpZDE7CisJKnJvb3RmaWQgPSBib2R5LT5tYm9fZmlkMTsKIAlDREVCVUcoRF9ORVQsCiAJICAgICAgICJyb290IGZpZD0iREZJRCIsIGxhc3RfY29tbWl0dGVkPSVsbHVcbiIsCiAJICAgICAgIFBGSUQocm9vdGZpZCksCkBAIC0xMzYsMTIgKzEzOCwxMiBAQAogCWlmICghYm9keSkKIAkJcmV0dXJuIC1FUFJPVE87CiAKLQlDREVCVUcoRF9ORVQsICJtb2RlOiAlb1xuIiwgYm9keS0+bW9kZSk7CisJQ0RFQlVHKERfTkVULCAibW9kZTogJW9cbiIsIGJvZHktPm1ib19tb2RlKTsKIAogCW1kY191cGRhdGVfbWF4X2VhX2Zyb21fYm9keShleHAsIGJvZHkpOwotCWlmIChib2R5LT5lYWRhdGFzaXplICE9IDApIHsKKwlpZiAoYm9keS0+bWJvX2VhZGF0YXNpemUgIT0gMCkgewogCQllYWRhdGEgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfc2l6ZWRfZ2V0KHBpbGwsICZSTUZfTURUX01ELAotCQkJCQkJICAgICAgYm9keS0+ZWFkYXRhc2l6ZSk7CisJCQkJCQkgICAgICBib2R5LT5tYm9fZWFkYXRhc2l6ZSk7CiAJCWlmICghZWFkYXRhKQogCQkJcmV0dXJuIC1FUFJPVE87CiAJfQpAQCAtMjMwLDMyICsyMzIsNiBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBtZGNfaXNfc3ViZGlyKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCi0JCQkgY29uc3Qgc3RydWN0IGx1X2ZpZCAqcGZpZCwKLQkJCSBjb25zdCBzdHJ1Y3QgbHVfZmlkICpjZmlkLAotCQkJIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXVlc3QpCi17Ci0Jc3RydWN0IHB0bHJwY19yZXF1ZXN0ICAqcmVxOwotCWludAkJICAgICByYzsKLQotCSpyZXF1ZXN0ID0gTlVMTDsKLQlyZXEgPSBwdGxycGNfcmVxdWVzdF9hbGxvY19wYWNrKGNsYXNzX2V4cDJjbGlpbXAoZXhwKSwKLQkJCQkJJlJRRl9NRFNfSVNfU1VCRElSLCBMVVNUUkVfTURTX1ZFUlNJT04sCi0JCQkJCU1EU19JU19TVUJESVIpOwotCWlmICghcmVxKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW1kY19pc19zdWJkaXJfcGFjayhyZXEsIHBmaWQsIGNmaWQsIDApOwotCXB0bHJwY19yZXF1ZXN0X3NldF9yZXBsZW4ocmVxKTsKLQotCXJjID0gcHRscnBjX3F1ZXVlX3dhaXQocmVxKTsKLQlpZiAocmMgJiYgcmMgIT0gLUVSRU1PVEUpCi0JCXB0bHJwY19yZXFfZmluaXNoZWQocmVxKTsKLQllbHNlCi0JCSpyZXF1ZXN0ID0gcmVxOwotCXJldHVybiByYzsKLX0KLQogc3RhdGljIGludCBtZGNfeGF0dHJfY29tbW9uKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCiAJCQkgICAgY29uc3Qgc3RydWN0IHJlcV9mb3JtYXQgKmZtdCwKIAkJCSAgICBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQsCkBAIC0zOTcsMTUgKzM3MywxNSBAQAogCXZvaWQJCSAgICpidWY7CiAJaW50CQkgICAgIHJjOwogCi0JaWYgKCFib2R5LT5hY2xzaXplKQorCWlmICghYm9keS0+bWJvX2FjbHNpemUpCiAJCXJldHVybiAwOwogCi0JYnVmID0gcmVxX2NhcHN1bGVfc2VydmVyX3NpemVkX2dldChwaWxsLCAmUk1GX0FDTCwgYm9keS0+YWNsc2l6ZSk7CisJYnVmID0gcmVxX2NhcHN1bGVfc2VydmVyX3NpemVkX2dldChwaWxsLCAmUk1GX0FDTCwgYm9keS0+bWJvX2FjbHNpemUpOwogCiAJaWYgKCFidWYpCiAJCXJldHVybiAtRVBST1RPOwogCi0JYWNsID0gcG9zaXhfYWNsX2Zyb21feGF0dHIoJmluaXRfdXNlcl9ucywgYnVmLCBib2R5LT5hY2xzaXplKTsKKwlhY2wgPSBwb3NpeF9hY2xfZnJvbV94YXR0cigmaW5pdF91c2VyX25zLCBidWYsIGJvZHktPm1ib19hY2xzaXplKTsKIAlpZiAoIWFjbCkKIAkJcmV0dXJuIDA7CiAKQEAgLTQ0MywyNCArNDE5LDI0IEBACiAKIAltZC0+Ym9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQocGlsbCwgJlJNRl9NRFRfQk9EWSk7CiAKLQlpZiAobWQtPmJvZHktPnZhbGlkICYgT0JEX01EX0ZMRUFTSVpFKSB7CisJaWYgKG1kLT5ib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxFQVNJWkUpIHsKIAkJaW50IGxtbXNpemU7CiAJCXN0cnVjdCBsb3ZfbWRzX21kICpsbW07CiAKLQkJaWYgKCFTX0lTUkVHKG1kLT5ib2R5LT5tb2RlKSkgeworCQlpZiAoIVNfSVNSRUcobWQtPmJvZHktPm1ib19tb2RlKSkgewogCQkJQ0RFQlVHKERfSU5GTywKIAkJCSAgICAgICAiT0JEX01EX0ZMRUFTSVpFIHNldCwgc2hvdWxkIGJlIGEgcmVndWxhciBmaWxlLCBidXQgaXMgbm90XG4iKTsKIAkJCXJjID0gLUVQUk9UTzsKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJaWYgKG1kLT5ib2R5LT5lYWRhdGFzaXplID09IDApIHsKKwkJaWYgKG1kLT5ib2R5LT5tYm9fZWFkYXRhc2l6ZSA9PSAwKSB7CiAJCQlDREVCVUcoRF9JTkZPLAogCQkJICAgICAgICJPQkRfTURfRkxFQVNJWkUgc2V0LCBidXQgZWFkYXRhc2l6ZSAwXG4iKTsKIAkJCXJjID0gLUVQUk9UTzsKIAkJCWdvdG8gb3V0OwogCQl9Ci0JCWxtbXNpemUgPSBtZC0+Ym9keS0+ZWFkYXRhc2l6ZTsKKwkJbG1tc2l6ZSA9IG1kLT5ib2R5LT5tYm9fZWFkYXRhc2l6ZTsKIAkJbG1tID0gcmVxX2NhcHN1bGVfc2VydmVyX3NpemVkX2dldChwaWxsLCAmUk1GX01EVF9NRCwgbG1tc2l6ZSk7CiAJCWlmICghbG1tKSB7CiAJCQlyYyA9IC1FUFJPVE87CkBAIC00NzEsNyArNDQ3LDcgQEAKIAkJaWYgKHJjIDwgMCkKIAkJCWdvdG8gb3V0OwogCi0JCWlmIChyYyA8IHNpemVvZigqbWQtPmxzbSkpIHsKKwkJaWYgKHJjIDwgKHR5cGVvZihyYykpc2l6ZW9mKCptZC0+bHNtKSkgewogCQkJQ0RFQlVHKERfSU5GTywKIAkJCSAgICAgICAibHNtIHNpemUgdG9vIHNtYWxsOiByYyA8IHNpemVvZiAoKm1kLT5sc20pICglZCA8ICVkKVxuIiwKIAkJCSAgICAgICByYywgKGludClzaXplb2YoKm1kLT5sc20pKTsKQEAgLTQ3OSwyNCArNDU1LDI0IEBACiAJCQlnb3RvIG91dDsKIAkJfQogCi0JfSBlbHNlIGlmIChtZC0+Ym9keS0+dmFsaWQgJiBPQkRfTURfRkxESVJFQSkgeworCX0gZWxzZSBpZiAobWQtPmJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9GTERJUkVBKSB7CiAJCWludCBsbXZzaXplOwogCQlzdHJ1Y3QgbG92X21kc19tZCAqbG12OwogCi0JCWlmICghU19JU0RJUihtZC0+Ym9keS0+bW9kZSkpIHsKKwkJaWYgKCFTX0lTRElSKG1kLT5ib2R5LT5tYm9fbW9kZSkpIHsKIAkJCUNERUJVRyhEX0lORk8sCiAJCQkgICAgICAgIk9CRF9NRF9GTERJUkVBIHNldCwgc2hvdWxkIGJlIGEgZGlyZWN0b3J5LCBidXQgaXMgbm90XG4iKTsKIAkJCXJjID0gLUVQUk9UTzsKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJaWYgKG1kLT5ib2R5LT5lYWRhdGFzaXplID09IDApIHsKKwkJaWYgKG1kLT5ib2R5LT5tYm9fZWFkYXRhc2l6ZSA9PSAwKSB7CiAJCQlDREVCVUcoRF9JTkZPLAogCQkJICAgICAgICJPQkRfTURfRkxESVJFQSBpcyBzZXQsIGJ1dCBlYWRhdGFzaXplIDBcbiIpOwogCQkJcmV0dXJuIC1FUFJPVE87CiAJCX0KLQkJaWYgKG1kLT5ib2R5LT52YWxpZCAmIE9CRF9NRF9NRUEpIHsKLQkJCWxtdnNpemUgPSBtZC0+Ym9keS0+ZWFkYXRhc2l6ZTsKKwkJaWYgKG1kLT5ib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfTUVBKSB7CisJCQlsbXZzaXplID0gbWQtPmJvZHktPm1ib19lYWRhdGFzaXplOwogCQkJbG12ID0gcmVxX2NhcHN1bGVfc2VydmVyX3NpemVkX2dldChwaWxsLCAmUk1GX01EVF9NRCwKIAkJCQkJCQkgICBsbXZzaXplKTsKIAkJCWlmICghbG12KSB7CkBAIC01MDQsMTUgKzQ4MCwxNSBAQAogCQkJCWdvdG8gb3V0OwogCQkJfQogCi0JCQlyYyA9IG9iZF91bnBhY2ttZChtZF9leHAsICh2b2lkICopJm1kLT5tZWEsIGxtdiwKKwkJCXJjID0gb2JkX3VucGFja21kKG1kX2V4cCwgKHZvaWQgKikmbWQtPmxtdiwgbG12LAogCQkJCQkgIGxtdnNpemUpOwogCQkJaWYgKHJjIDwgMCkKIAkJCQlnb3RvIG91dDsKIAotCQkJaWYgKHJjIDwgc2l6ZW9mKCptZC0+bWVhKSkgeworCQkJaWYgKHJjIDwgKHR5cGVvZihyYykpc2l6ZW9mKCptZC0+bG12KSkgewogCQkJCUNERUJVRyhEX0lORk8sCi0JCQkJICAgICAgICJzaXplIHRvbyBzbWFsbDogcmMgPCBzaXplb2YoKm1kLT5tZWEpICglZCA8ICVkKVxuIiwKLQkJCQkJcmMsIChpbnQpc2l6ZW9mKCptZC0+bWVhKSk7CisJCQkJICAgICAgICJzaXplIHRvbyBzbWFsbDogcmMgPCBzaXplb2YoKm1kLT5sbXYpICglZCA8ICVkKVxuIiwKKwkJCQkJcmMsIChpbnQpc2l6ZW9mKCptZC0+bG12KSk7CiAJCQkJcmMgPSAtRVBST1RPOwogCQkJCWdvdG8gb3V0OwogCQkJfQpAQCAtNTIwLDEyICs0OTYsMTIgQEAKIAl9CiAJcmMgPSAwOwogCi0JaWYgKG1kLT5ib2R5LT52YWxpZCAmIE9CRF9NRF9GTEFDTCkgeworCWlmIChtZC0+Ym9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0ZMQUNMKSB7CiAJCS8qIGZvciBBQ0wsIGl0J3MgcG9zc2libGUgdGhhdCBGTEFDTCBpcyBzZXQgYnV0IGFjbHNpemUgaXMgemVyby4KIAkJICogb25seSB3aGVuIGFjbHNpemUgIT0gMCB0aGVyZSdzIGFuIGFjdHVhbCBzZWdtZW50IGZvciBBQ0wKIAkJICogaW4gcmVwbHkgYnVmZmVyLgogCQkgKi8KLQkJaWYgKG1kLT5ib2R5LT5hY2xzaXplKSB7CisJCWlmIChtZC0+Ym9keS0+bWJvX2FjbHNpemUpIHsKIAkJCXJjID0gbWRjX3VucGFja19hY2wocmVxLCBtZCk7CiAJCQlpZiAocmMpCiAJCQkJZ290byBvdXQ7CkBAIC01ODAsOSArNTU2LDkgQEAKIAogCQlmaWxlX2ZoID0gJm9jaC0+b2NoX2ZoOwogCQlDREVCVUcoRF9IQSwgInVwZGF0aW5nIGhhbmRsZSBmcm9tICUjbGx4IHRvICUjbGx4XG4iLAotCQkgICAgICAgZmlsZV9maC0+Y29va2llLCBib2R5LT5oYW5kbGUuY29va2llKTsKKwkJICAgICAgIGZpbGVfZmgtPmNvb2tpZSwgYm9keS0+bWJvX2hhbmRsZS5jb29raWUpOwogCQlvbGQgPSAqZmlsZV9maDsKLQkJKmZpbGVfZmggPSBib2R5LT5oYW5kbGU7CisJCSpmaWxlX2ZoID0gYm9keS0+bWJvX2hhbmRsZTsKIAl9CiAJY2xvc2VfcmVxID0gbW9kLT5tb2RfY2xvc2VfcmVxOwogCWlmIChjbG9zZV9yZXEpIHsKQEAgLTU5Nyw3ICs1NzMsNyBAQAogCQlpZiAob2NoKQogCQkJTEFTU0VSVCghbWVtY21wKCZvbGQsICZlcG9jaC0+aGFuZGxlLCBzaXplb2Yob2xkKSkpOwogCQlERUJVR19SRVEoRF9IQSwgY2xvc2VfcmVxLCAidXBkYXRpbmcgY2xvc2UgYm9keSB3aXRoIG5ldyBmaCIpOwotCQllcG9jaC0+aGFuZGxlID0gYm9keS0+aGFuZGxlOworCQllcG9jaC0+aGFuZGxlID0gYm9keS0+bWJvX2hhbmRsZTsKIAl9CiB9CiAKQEAgLTY3OSwxMSArNjU1LDExIEBACiAJCXNwaW5fdW5sb2NrKCZvcGVuX3JlcS0+cnFfbG9jayk7CiAJfQogCi0JcmVjLT5jcl9maWQyID0gYm9keS0+ZmlkMTsKLQlyZWMtPmNyX2lvZXBvY2ggPSBib2R5LT5pb2Vwb2NoOwotCXJlYy0+Y3Jfb2xkX2hhbmRsZS5jb29raWUgPSBib2R5LT5oYW5kbGUuY29va2llOworCXJlYy0+Y3JfZmlkMiA9IGJvZHktPm1ib19maWQxOworCXJlYy0+Y3JfaW9lcG9jaCA9IGJvZHktPm1ib19pb2Vwb2NoOworCXJlYy0+Y3Jfb2xkX2hhbmRsZS5jb29raWUgPSBib2R5LT5tYm9faGFuZGxlLmNvb2tpZTsKIAlvcGVuX3JlcS0+cnFfcmVwbGF5X2NiID0gbWRjX3JlcGxheV9vcGVuOwotCWlmICghZmlkX2lzX3NhbmUoJmJvZHktPmZpZDEpKSB7CisJaWYgKCFmaWRfaXNfc2FuZSgmYm9keS0+bWJvX2ZpZDEpKSB7CiAJCURFQlVHX1JFUShEX0VSUk9SLCBvcGVuX3JlcSwKIAkJCSAgIlNhdmluZyByZXBsYXkgcmVxdWVzdCB3aXRoIGluc2FuZSBmaWQiKTsKIAkJTEJVRygpOwpAQCAtNzAxLDkgKzY3NywxNSBAQAogCSAgICBpbXBfY29ubmVjdF9kaXNwX3N0cmlwZShtb2QtPm1vZF9vcGVuX3JlcS0+cnFfaW1wb3J0KSkKIAkJY29tbWl0dGVkID0gMTsKIAotCUxBU1NFUlQobW9kLT5tb2Rfb3Blbl9yZXEtPnJxX3JlcGxheSA9PSAwKTsKLQotCURFQlVHX1JFUShEX1JQQ1RSQUNFLCBtb2QtPm1vZF9vcGVuX3JlcSwgImZyZWUgb3BlbiByZXF1ZXN0XG4iKTsKKwkvKgorCSAqIE5vIHJlYXNvbiB0byBhc3NzZXJ0IGhlcmUgaWYgdGhlIG9wZW4gcmVxdWVzdCBoYXMKKwkgKiBycV9yZXBsYXkgPT0gMS4gSXQgbWVhbnMgdGhhdCBtZGNfY2xvc2UgZmFpbGVkLCBhbmQKKwkgKiBjbG9zZSByZXF1ZXN0IHdhc25gdCBzZW50LiBJdCBpcyBub3QgZmF0YWwgdG8gY2xpZW50LgorCSAqIFRoZSB3b3JzdCB0aGluZyBpcyBldmljdGlvbiBpZiB0aGUgY2xpZW50IGdldHMgb3BlbiBsb2NrCisJICovCisJREVCVUdfUkVRKERfUlBDVFJBQ0UsIG1vZC0+bW9kX29wZW5fcmVxLAorCQkgICJmcmVlIG9wZW4gcmVxdWVzdCBycV9yZXBsYXkgPSAlZFxuIiwKKwkJICAgbW9kLT5tb2Rfb3Blbl9yZXEtPnJxX3JlcGxheSk7CiAKIAlwdGxycGNfcmVxdWVzdF9jb21taXR0ZWQobW9kLT5tb2Rfb3Blbl9yZXEsIGNvbW1pdHRlZCk7CiAJaWYgKG1vZC0+bW9kX2Nsb3NlX3JlcSkKQEAgLTc0NCw3ICs3MjYsNyBAQAogCQllcG9jaCA9IHJlcV9jYXBzdWxlX2NsaWVudF9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9NRFRfRVBPQ0gpOwogCiAJCWVwb2NoLT5mbGFncyB8PSBNRl9TT01fQVU7Ci0JCWlmIChyZXBib2R5LT52YWxpZCAmIE9CRF9NRF9GTEdFVEFUVFJMT0NLKQorCQlpZiAocmVwYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0ZMR0VUQVRUUkxPQ0spCiAJCQlvcF9kYXRhLT5vcF9mbGFncyB8PSBNRl9HRVRBVFRSX0xPQ0s7CiAJfQogfQpAQCAtNzYzLDcgKzc0NSw3IEBACiAJCXJlcV9mbXQgPSAmUlFGX01EU19SRUxFQVNFX0NMT1NFOwogCiAJCS8qIGFsbG9jYXRlIGEgRklEIGZvciB2b2xhdGlsZSBmaWxlICovCi0JCXJjID0gbWRjX2ZpZF9hbGxvYyhleHAsICZvcF9kYXRhLT5vcF9maWQyLCBvcF9kYXRhKTsKKwkJcmMgPSBtZGNfZmlkX2FsbG9jKE5VTEwsIGV4cCwgJm9wX2RhdGEtPm9wX2ZpZDIsIG9wX2RhdGEpOwogCQlpZiAocmMgPCAwKSB7CiAJCQlDRVJST1IoIiVzOiAiREZJRCIgZmFpbGVkIHRvIGFsbG9jYXRlIEZJRDogJWRcbiIsCiAJCQkgICAgICAgb2JkLT5vYmRfbmFtZSwgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSksIHJjKTsKQEAgLTc3MywyMiArNzU1LDEwIEBACiAJfQogCiAJKnJlcXVlc3QgPSBOVUxMOwotCXJlcSA9IHB0bHJwY19yZXF1ZXN0X2FsbG9jKGNsYXNzX2V4cDJjbGlpbXAoZXhwKSwgcmVxX2ZtdCk7Ci0JaWYgKCFyZXEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmMgPSBwdGxycGNfcmVxdWVzdF9wYWNrKHJlcSwgTFVTVFJFX01EU19WRVJTSU9OLCBNRFNfQ0xPU0UpOwotCWlmIChyYykgewotCQlwdGxycGNfcmVxdWVzdF9mcmVlKHJlcSk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQkvKiBUbyBhdm9pZCBhIGxpdmVsb2NrIChidWcgNzAzNCksIHdlIG5lZWQgdG8gc2VuZCBDTE9TRSBSUENzIHRvIGEKLQkgKiBwb3J0YWwgd2hvc2UgdGhyZWFkcyBhcmUgbm90IHRha2luZyBhbnkgRExNIGxvY2tzIGFuZCBhcmUgdGhlcmVmb3JlCi0JICogYWx3YXlzIHByb2dyZXNzaW5nCi0JICovCi0JcmVxLT5ycV9yZXF1ZXN0X3BvcnRhbCA9IE1EU19SRUFEUEFHRV9QT1JUQUw7Ci0JcHRscnBjX2F0X3NldF9yZXFfdGltZW91dChyZXEpOworCWlmIChPQkRfRkFJTF9DSEVDSyhPQkRfRkFJTF9NRENfQ0xPU0UpKQorCQlyZXEgPSBOVUxMOworCWVsc2UKKwkJcmVxID0gcHRscnBjX3JlcXVlc3RfYWxsb2MoY2xhc3NfZXhwMmNsaWltcChleHApLCByZXFfZm10KTsKIAogCS8qIEVuc3VyZSB0aGF0IHRoaXMgY2xvc2UncyBoYW5kbGUgaXMgZml4ZWQgdXAgZHVyaW5nIHJlcGxheS4gKi8KIAlpZiAobGlrZWx5KG1vZCkpIHsKQEAgLTgwOSw2ICs3NzksMjkgQEAKIAkJIENERUJVRyhEX0hBLAogCQkJImNvdWxkbid0IGZpbmQgb3BlbiByZXE7IGV4cGVjdGluZyBjbG9zZSBlcnJvclxuIik7CiAJfQorCWlmICghcmVxKSB7CisJCS8qCisJCSAqIFRPRE86IHJlcGVhdCBjbG9zZSBhZnRlciBlcnJvcnMKKwkJICovCisJCUNXQVJOKCIlczogY2xvc2Ugb2YgRklEICJERklEIiBmYWlsZWQsIGZpbGUgcmVmZXJlbmNlIHdpbGwgYmUgZHJvcHBlZCB3aGVuIHRoaXMgY2xpZW50IHVubW91bnRzIG9yIGlzIGV2aWN0ZWRcbiIsCisJCSAgICAgIG9iZC0+b2JkX25hbWUsIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDEpKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlyYyA9IHB0bHJwY19yZXF1ZXN0X3BhY2socmVxLCBMVVNUUkVfTURTX1ZFUlNJT04sIE1EU19DTE9TRSk7CisJaWYgKHJjKSB7CisJCXB0bHJwY19yZXF1ZXN0X2ZyZWUocmVxKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBUbyBhdm9pZCBhIGxpdmVsb2NrIChidWcgNzAzNCksIHdlIG5lZWQgdG8gc2VuZCBDTE9TRSBSUENzIHRvIGEKKwkgKiBwb3J0YWwgd2hvc2UgdGhyZWFkcyBhcmUgbm90IHRha2luZyBhbnkgRExNIGxvY2tzIGFuZCBhcmUgdGhlcmVmb3JlCisJICogYWx3YXlzIHByb2dyZXNzaW5nCisJICovCisJcmVxLT5ycV9yZXF1ZXN0X3BvcnRhbCA9IE1EU19SRUFEUEFHRV9QT1JUQUw7CisJcHRscnBjX2F0X3NldF9yZXFfdGltZW91dChyZXEpOwogCiAJbWRjX2Nsb3NlX3BhY2socmVxLCBvcF9kYXRhKTsKIApAQCAtODU0LDYgKzg0Nyw3IEBACiAJCX0KIAl9CiAKK291dDoKIAlpZiAobW9kKSB7CiAJCWlmIChyYyAhPSAwKQogCQkJbW9kLT5tb2RfY2xvc2VfcmVxID0gTlVMTDsKQEAgLTkzNiwxNiArOTMwLDE3IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IG1kY19yZWFkcGFnZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkJCXN0cnVjdCBwYWdlICoqcGFnZXMsIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXVlc3QpCitzdGF0aWMgaW50IG1kY19nZXRwYWdlKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCwKKwkJICAgICAgIHU2NCBvZmZzZXQsIHN0cnVjdCBwYWdlICoqcGFnZXMsIGludCBucGFnZXMsCisJCSAgICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0KQogewotCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAgICpyZXE7CiAJc3RydWN0IHB0bHJwY19idWxrX2Rlc2MgKmRlc2M7Ci0JaW50CQkgICAgICBpOwotCXdhaXRfcXVldWVfaGVhZF90CSAgICAgIHdhaXRxOwotCWludAkJICAgICAgcmVzZW5kcyA9IDA7Ci0Jc3RydWN0IGxfd2FpdF9pbmZvICAgICAgIGx3aTsKLQlpbnQJCSAgICAgIHJjOworCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxOworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRxOworCXN0cnVjdCBsX3dhaXRfaW5mbyBsd2k7CisJaW50IHJlc2VuZHMgPSAwOworCWludCByYzsKKwlpbnQgaTsKIAogCSpyZXF1ZXN0ID0gTlVMTDsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ3YWl0cSk7CkBAIC05NjQsNyArOTU5LDcgQEAKIAlyZXEtPnJxX3JlcXVlc3RfcG9ydGFsID0gTURTX1JFQURQQUdFX1BPUlRBTDsKIAlwdGxycGNfYXRfc2V0X3JlcV90aW1lb3V0KHJlcSk7CiAKLQlkZXNjID0gcHRscnBjX3ByZXBfYnVsa19pbXAocmVxLCBvcF9kYXRhLT5vcF9ucGFnZXMsIDEsIEJVTEtfUFVUX1NJTkssCisJZGVzYyA9IHB0bHJwY19wcmVwX2J1bGtfaW1wKHJlcSwgbnBhZ2VzLCAxLCBCVUxLX1BVVF9TSU5LLAogCQkJCSAgICBNRFNfQlVMS19QT1JUQUwpOwogCWlmICghZGVzYykgewogCQlwdGxycGNfcmVxdWVzdF9mcmVlKHJlcSk7CkBAIC05NzIsMTIgKzk2NywxMCBAQAogCX0KIAogCS8qIE5CIHJlcSBub3cgb3ducyBkZXNjIGFuZCB3aWxsIGZyZWUgaXQgd2hlbiBpdCBnZXRzIGZyZWVkICovCi0JZm9yIChpID0gMDsgaSA8IG9wX2RhdGEtPm9wX25wYWdlczsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7IGkrKykKIAkJcHRscnBjX3ByZXBfYnVsa19wYWdlX3BpbihkZXNjLCBwYWdlc1tpXSwgMCwgUEFHRV9TSVpFKTsKIAotCW1kY19yZWFkZGlyX3BhY2socmVxLCBvcF9kYXRhLT5vcF9vZmZzZXQsCi0JCQkgUEFHRV9TSVpFICogb3BfZGF0YS0+b3BfbnBhZ2VzLAotCQkJICZvcF9kYXRhLT5vcF9maWQxKTsKKwltZGNfcmVhZGRpcl9wYWNrKHJlcSwgb2Zmc2V0LCBQQUdFX1NJWkUgKiBucGFnZXMsIGZpZCk7CiAKIAlwdGxycGNfcmVxdWVzdF9zZXRfcmVwbGVuKHJlcSk7CiAJcmMgPSBwdGxycGNfcXVldWVfd2FpdChyZXEpOwpAQCAtOTg4LDExICs5ODEsMTIgQEAKIAogCQlyZXNlbmRzKys7CiAJCWlmICghY2xpZW50X3Nob3VsZF9yZXNlbmQocmVzZW5kcywgJmV4cC0+ZXhwX29iZC0+dS5jbGkpKSB7Ci0JCQlDRVJST1IoInRvbyBtYW55IHJlc2VuZCByZXRyaWVzLCByZXR1cm5pbmcgZXJyb3JcbiIpOworCQkJQ0VSUk9SKCIlczogdG9vIG1hbnkgcmVzZW5kIHJldHJpZXM6IHJjID0gJWRcbiIsCisJCQkgICAgICAgZXhwLT5leHBfb2JkLT5vYmRfbmFtZSwgLUVJTyk7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQotCQlsd2kgPSBMV0lfVElNRU9VVF9JTlRSKGNmc190aW1lX3NlY29uZHMocmVzZW5kcyksCi0JCQkJICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOworCQlsd2kgPSBMV0lfVElNRU9VVF9JTlRSKGNmc190aW1lX3NlY29uZHMocmVzZW5kcyksIE5VTEwsIE5VTEwsCisJCQkJICAgICAgIE5VTEwpOwogCQlsX3dhaXRfZXZlbnQod2FpdHEsIDAsICZsd2kpOwogCiAJCWdvdG8gcmVzdGFydF9idWxrOwpAQCAtMTAwNiw5ICsxMDAwLDkgQEAKIAl9CiAKIAlpZiAocmVxLT5ycV9idWxrLT5iZF9ub2JfdHJhbnNmZXJyZWQgJiB+TFVfUEFHRV9NQVNLKSB7Ci0JCUNFUlJPUigiVW5leHBlY3RlZCAjIGJ5dGVzIHRyYW5zZmVycmVkOiAlZCAoJWxkIGV4cGVjdGVkKVxuIiwKLQkJICAgICAgIHJlcS0+cnFfYnVsay0+YmRfbm9iX3RyYW5zZmVycmVkLAotCQkgICAgICAgUEFHRV9TSVpFICogb3BfZGF0YS0+b3BfbnBhZ2VzKTsKKwkJQ0VSUk9SKCIlczogdW5leHBlY3RlZCBieXRlcyB0cmFuc2ZlcnJlZDogJWQgKCVsZCBleHBlY3RlZClcbiIsCisJCSAgICAgICBleHAtPmV4cF9vYmQtPm9iZF9uYW1lLCByZXEtPnJxX2J1bGstPmJkX25vYl90cmFuc2ZlcnJlZCwKKwkJICAgICAgIFBBR0VfU0laRSAqIG5wYWdlcyk7CiAJCXB0bHJwY19yZXFfZmluaXNoZWQocmVxKTsKIAkJcmV0dXJuIC1FUFJPVE87CiAJfQpAQCAtMTAxNyw2ICsxMDExLDQ1MyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBtZGNfcmVsZWFzZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgcmVtb3ZlKQoreworCWlmIChyZW1vdmUpIHsKKwkJbG9ja19wYWdlKHBhZ2UpOworCQlpZiAobGlrZWx5KHBhZ2UtPm1hcHBpbmcpKQorCQkJdHJ1bmNhdGVfY29tcGxldGVfcGFnZShwYWdlLT5tYXBwaW5nLCBwYWdlKTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJfQorCXB1dF9wYWdlKHBhZ2UpOworfQorCitzdGF0aWMgc3RydWN0IHBhZ2UgKm1kY19wYWdlX2xvY2F0ZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgX191NjQgKmhhc2gsCisJCQkJICAgIF9fdTY0ICpzdGFydCwgX191NjQgKmVuZCwgaW50IGhhc2g2NCkKK3sKKwkvKgorCSAqIENvbXBsZW1lbnQgb2YgaGFzaCBpcyB1c2VkIGFzIGFuIGluZGV4IHNvIHRoYXQKKwkgKiByYWRpeF90cmVlX2dhbmdfbG9va3VwKCkgY2FuIGJlIHVzZWQgdG8gZmluZCBhIHBhZ2Ugd2l0aCBzdGFydGluZworCSAqIGhhc2ggX3NtYWxsZXJfIHRoYW4gb25lIHdlIGFyZSBsb29raW5nIGZvci4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IGhhc2hfeF9pbmRleCgqaGFzaCwgaGFzaDY0KTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgZm91bmQ7CisKKwlzcGluX2xvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOworCWZvdW5kID0gcmFkaXhfdHJlZV9nYW5nX2xvb2t1cCgmbWFwcGluZy0+cGFnZV90cmVlLAorCQkJCSAgICAgICAodm9pZCAqKikmcGFnZSwgb2Zmc2V0LCAxKTsKKwlpZiAoZm91bmQgPiAwICYmICFyYWRpeF90cmVlX2V4Y2VwdGlvbmFsX2VudHJ5KHBhZ2UpKSB7CisJCXN0cnVjdCBsdV9kaXJwYWdlICpkcDsKKworCQlnZXRfcGFnZShwYWdlKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOworCQkvKgorCQkgKiBJbiBjb250cmFzdCB0byBmaW5kX2xvY2tfcGFnZSgpIHdlIGFyZSBzdXJlIHRoYXQgZGlyZWN0b3J5CisJCSAqIHBhZ2UgY2Fubm90IGJlIHRydW5jYXRlZCAod2hpbGUgRExNIGxvY2sgaXMgaGVsZCkgYW5kLAorCQkgKiBoZW5jZSwgY2FuIGF2b2lkIHJlc3RhcnQuCisJCSAqCisJCSAqIEluIGZhY3QsIHBhZ2UgY2Fubm90IGJlIGxvY2tlZCBoZXJlIGF0IGFsbCwgYmVjYXVzZQorCQkgKiBtZGNfcmVhZF9wYWdlX3JlbW90ZSBkb2VzIHN5bmNocm9ub3VzIGlvLgorCQkgKi8KKwkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKKwkJaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQkJZHAgPSBrbWFwKHBhZ2UpOworCQkJaWYgKEJJVFNfUEVSX0xPTkcgPT0gMzIgJiYgaGFzaDY0KSB7CisJCQkJKnN0YXJ0ID0gbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX3N0YXJ0KSA+PiAzMjsKKwkJCQkqZW5kICAgPSBsZTY0X3RvX2NwdShkcC0+bGRwX2hhc2hfZW5kKSA+PiAzMjsKKwkJCQkqaGFzaCAgPSAqaGFzaCA+PiAzMjsKKwkJCX0gZWxzZSB7CisJCQkJKnN0YXJ0ID0gbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX3N0YXJ0KTsKKwkJCQkqZW5kICAgPSBsZTY0X3RvX2NwdShkcC0+bGRwX2hhc2hfZW5kKTsKKwkJCX0KKwkJCWlmICh1bmxpa2VseSgqc3RhcnQgPT0gMSAmJiAqaGFzaCA9PSAwKSkKKwkJCQkqaGFzaCA9ICpzdGFydDsKKwkJCWVsc2UKKwkJCQlMQVNTRVJURigqc3RhcnQgPD0gKmhhc2gsICJzdGFydCA9ICUjbGx4LGVuZCA9ICUjbGx4LGhhc2ggPSAlI2xseFxuIiwKKwkJCQkJICpzdGFydCwgKmVuZCwgKmhhc2gpOworCQkJQ0RFQlVHKERfVkZTVFJBQ0UsICJvZmZzZXQgJWx4IFslI2xseCAlI2xseF0sIGhhc2ggJSNsbHhcbiIsCisJCQkgICAgICAgb2Zmc2V0LCAqc3RhcnQsICplbmQsICpoYXNoKTsKKwkJCWlmICgqaGFzaCA+ICplbmQpIHsKKwkJCQlrdW5tYXAocGFnZSk7CisJCQkJbWRjX3JlbGVhc2VfcGFnZShwYWdlLCAwKTsKKwkJCQlwYWdlID0gTlVMTDsKKwkJCX0gZWxzZSBpZiAoKmVuZCAhPSAqc3RhcnQgJiYgKmhhc2ggPT0gKmVuZCkgeworCQkJCS8qCisJCQkJICogdXBvbiBoYXNoIGNvbGxpc2lvbiwgcmVtb3ZlIHRoaXMgcGFnZSwKKwkJCQkgKiBvdGhlcndpc2UgcHV0IHBhZ2UgcmVmZXJlbmNlLCBhbmQKKwkJCQkgKiBtZGNfcmVhZF9wYWdlX3JlbW90ZSgpIHdpbGwgaXNzdWUgUlBDIHRvCisJCQkJICogZmV0Y2ggdGhlIHBhZ2Ugd2Ugd2FudC4KKwkJCQkgKi8KKwkJCQlrdW5tYXAocGFnZSk7CisJCQkJbWRjX3JlbGVhc2VfcGFnZShwYWdlLAorCQkJCQkJIGxlMzJfdG9fY3B1KGRwLT5sZHBfZmxhZ3MpICYgTERGX0NPTExJREUpOworCQkJCXBhZ2UgPSBOVUxMOworCQkJfQorCQl9IGVsc2UgeworCQkJcHV0X3BhZ2UocGFnZSk7CisJCQlwYWdlID0gRVJSX1BUUigtRUlPKTsKKwkJfQorCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKKwkJcGFnZSA9IE5VTEw7CisJfQorCXJldHVybiBwYWdlOworfQorCisvKgorICogQWRqdXN0IGEgc2V0IG9mIHBhZ2VzLCBlYWNoIHBhZ2UgY29udGFpbmluZyBhbiBhcnJheSBvZiBsdV9kaXJwYWdlcywKKyAqIHNvIHRoYXQgZWFjaCBwYWdlIGNhbiBiZSB1c2VkIGFzIGEgc2luZ2xlIGxvZ2ljYWwgbHVfZGlycGFnZS4KKyAqCisgKiBBIGx1X2RpcnBhZ2UgaXMgbGFpZCBvdXQgYXMgZm9sbG93cywgd2hlcmUgcyA9IGxkcF9oYXNoX3N0YXJ0LAorICogZSA9IGxkcF9oYXNoX2VuZCwgZiA9IGxkcF9mbGFncywgcCA9IHBhZGRpbmcsIGFuZCBlYWNoICJlbnQiIGlzIGEKKyAqIHN0cnVjdCBsdV9kaXJlbnQuICBJdCBoYXMgc2l6ZSB1cCB0byBMVV9QQUdFX1NJWkUuIFRoZSBsZHBfaGFzaF9lbmQKKyAqIHZhbHVlIGlzIHVzZWQgYXMgYSBjb29raWUgdG8gcmVxdWVzdCB0aGUgbmV4dCBsdV9kaXJwYWdlIGluIGEKKyAqIGRpcmVjdG9yeSBsaXN0aW5nIHRoYXQgc3BhbnMgbXVsdGlwbGUgcGFnZXMgKHR3byBpbiB0aGlzIGV4YW1wbGUpOgorICogICBfX19fX19fXworICogIHwgICAgICAgIHwKKyAqIC58LS0tLS0tLS12LS0tLS0tLSAgIC0tLS0tLgorICogfHN8ZXxmfHB8ZW50fGVudHwgLi4uIHxlbnR8CisgKiAnLS18LS0tLS0tLS0tLS0tLS0gICAtLS0tLScgICBFYWNoIFBBR0UgY29udGFpbnMgYSBzaW5nbGUKKyAqICAgICctLS0tLS0uICAgICAgICAgICAgICAgICAgIGx1X2RpcnBhZ2UuCisgKiAuLS0tLS0tLS0tdi0tLS0tLS0gICAtLS0tLS4KKyAqIHxzfGV8ZnxwfGVudHwgMCB8IC4uLiB8IDAgfAorICogJy0tLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0nCisgKgorICogSG93ZXZlciwgb24gaG9zdHMgd2hlcmUgdGhlIG5hdGl2ZSBWTSBwYWdlIHNpemUgKFBBR0VfU0laRSkgaXMKKyAqIGxhcmdlciB0aGFuIExVX1BBR0VfU0laRSwgYSBzaW5nbGUgaG9zdCBwYWdlIG1heSBjb250YWluIG11bHRpcGxlCisgKiBsdV9kaXJwYWdlcy4gQWZ0ZXIgcmVhZGluZyB0aGUgbHVfZGlycGFnZXMgZnJvbSB0aGUgTURTLCB0aGUKKyAqIGxkcF9oYXNoX2VuZCBvZiB0aGUgZmlyc3QgbHVfZGlycGFnZSByZWZlcnMgdG8gdGhlIG9uZSBpbW1lZGlhdGVseQorICogYWZ0ZXIgaXQgaW4gdGhlIHNhbWUgUEFHRSAoYXJyb3dzIHNpbXBsaWZpZWQgZm9yIGJyZXZpdHksIGJ1dAorICogaW4gZ2VuZXJhbCBlMD09czEsIGUxPT1zMiwgZXRjLik6CisgKgorICogLi0tLS0tLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0uCisgKiB8czB8ZTB8ZjB8cHxlbnR8ZW50fCAuLi4gfGVudHwKKyAqIHwtLS12LS0tLS0tLS0tLS0tLS0tLSAgIC0tLS0tfAorICogfHMxfGUxfGYxfHB8ZW50fGVudHwgLi4uIHxlbnR8CisgKiB8LS0tdi0tLS0tLS0tLS0tLS0tLS0gICAtLS0tLXwgIEhlcmUsIGVhY2ggUEFHRSBjb250YWlucworICogICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICBtdWx0aXBsZSBsdV9kaXJwYWdlcy4KKyAqIHwtLS12LS0tLS0tLS0tLS0tLS0tLSAgIC0tLS0tfAorICogfHMnfGUnfGYnfHB8ZW50fGVudHwgLi4uIHxlbnR8CisgKiAnLS0tfC0tLS0tLS0tLS0tLS0tLS0gICAtLS0tLScKKyAqICAgICB2CisgKiAuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KKyAqIHwgICAgICAgIG5leHQgUEFHRSAgICAgICAgICAgfAorICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHRyYW5zZm9ybWVkIGludG8gYSBzaW5nbGUgbG9naWNhbCBsdV9kaXJwYWdlIGFzIGZvbGxvd3M6CisgKgorICogLSBSZXBsYWNlIGUwIHdpdGggZScgc28gdGhlIHJlcXVlc3QgZm9yIHRoZSBuZXh0IGx1X2RpcnBhZ2UgZ2V0cyB0aGUgcGFnZQorICogICBsYWJlbGVkICduZXh0IFBBR0UnLgorICoKKyAqIC0gQ29weSB0aGUgTERGX0NPTExJREUgZmxhZyBmcm9tIGYnIHRvIGYwIHRvIGNvcnJlY3RseSByZWZsZWN0IHdoZXRoZXIKKyAqICAgYSBoYXNoIGNvbGxpc2lvbiB3aXRoIHRoZSBuZXh0IHBhZ2UgZXhpc3RzLgorICoKKyAqIC0gQWRqdXN0IHRoZSBsZGVfcmVjbGVuIG9mIHRoZSBlbmRpbmcgZW50cnkgb2YgZWFjaCBsdV9kaXJwYWdlIHRvIHNwYW4KKyAqICAgdG8gdGhlIGZpcnN0IGVudHJ5IG9mIHRoZSBuZXh0IGx1X2RpcnBhZ2UuCisgKi8KKyNpZiBQQUdFX1NJWkUgPiBMVV9QQUdFX1NJWkUKK3N0YXRpYyB2b2lkIG1kY19hZGp1c3RfZGlycGFnZXMoc3RydWN0IHBhZ2UgKipwYWdlcywgaW50IGNmc19wZ3MsIGludCBsdV9wZ3MpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2ZzX3BnczsgaSsrKSB7CisJCXN0cnVjdCBsdV9kaXJwYWdlICpkcCA9IGttYXAocGFnZXNbaV0pOworCQlfX3U2NCBoYXNoX2VuZCA9IGxlNjRfdG9fY3B1KGRwLT5sZHBfaGFzaF9lbmQpOworCQlfX3UzMiBmbGFncyA9IGxlMzJfdG9fY3B1KGRwLT5sZHBfZmxhZ3MpOworCQlzdHJ1Y3QgbHVfZGlycGFnZSAqZmlyc3QgPSBkcDsKKwkJc3RydWN0IGx1X2RpcmVudCAqZW5kX2RpcmVudCA9IE5VTEw7CisJCXN0cnVjdCBsdV9kaXJlbnQgKmVudDsKKworCQl3aGlsZSAoLS1sdV9wZ3MgPiAwKSB7CisJCQllbnQgPSBsdV9kaXJlbnRfc3RhcnQoZHApOworCQkJZm9yIChlbmRfZGlyZW50ID0gZW50OyBlbnQ7CisJCQkgICAgIGVuZF9kaXJlbnQgPSBlbnQsIGVudCA9IGx1X2RpcmVudF9uZXh0KGVudCkpOworCisJCQkvKiBBZHZhbmNlIGRwIHRvIG5leHQgbHVfZGlycGFnZS4gKi8KKwkJCWRwID0gKHN0cnVjdCBsdV9kaXJwYWdlICopKChjaGFyICopZHAgKyBMVV9QQUdFX1NJWkUpOworCisJCQkvKiBDaGVjayBpZiB3ZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIENGU19QQUdFLiAqLworCQkJaWYgKCEoKHVuc2lnbmVkIGxvbmcpZHAgJiB+UEFHRV9NQVNLKSkKKwkJCQlicmVhazsKKworCQkJLyogU2F2ZSB0aGUgaGFzaCBhbmQgZmxhZ3Mgb2YgdGhpcyBsdV9kaXJwYWdlLiAqLworCQkJaGFzaF9lbmQgPSBsZTY0X3RvX2NwdShkcC0+bGRwX2hhc2hfZW5kKTsKKwkJCWZsYWdzID0gbGUzMl90b19jcHUoZHAtPmxkcF9mbGFncyk7CisKKwkJCS8qIENoZWNrIGlmIGx1X2RpcnBhZ2UgY29udGFpbnMgbm8gZW50cmllcy4gKi8KKwkJCWlmICghZW5kX2RpcmVudCkKKwkJCQlicmVhazsKKworCQkJLyoKKwkJCSAqIEVubGFyZ2UgdGhlIGVuZCBlbnRyeSBsZGVfcmVjbGVuIGZyb20gMCB0bworCQkJICogZmlyc3QgZW50cnkgb2YgbmV4dCBsdV9kaXJwYWdlLgorCQkJICovCisJCQlMQVNTRVJUKCFsZTE2X3RvX2NwdShlbmRfZGlyZW50LT5sZGVfcmVjbGVuKSk7CisJCQllbmRfZGlyZW50LT5sZGVfcmVjbGVuID0KKwkJCQljcHVfdG9fbGUxNigoY2hhciAqKShkcC0+bGRwX2VudHJpZXMpIC0KKwkJCQkJICAgIChjaGFyICopZW5kX2RpcmVudCk7CisJCX0KKworCQlmaXJzdC0+bGRwX2hhc2hfZW5kID0gaGFzaF9lbmQ7CisJCWZpcnN0LT5sZHBfZmxhZ3MgJj0gfmNwdV90b19sZTMyKExERl9DT0xMSURFKTsKKwkJZmlyc3QtPmxkcF9mbGFncyB8PSBmbGFncyAmIGNwdV90b19sZTMyKExERl9DT0xMSURFKTsKKworCQlrdW5tYXAocGFnZXNbaV0pOworCX0KKwlMQVNTRVJURihsdV9wZ3MgPT0gMCwgImxlZnQgPSAlZCIsIGx1X3Bncyk7Cit9CisjZWxzZQorI2RlZmluZSBtZGNfYWRqdXN0X2RpcnBhZ2VzKHBhZ2VzLCBjZnNfcGdzLCBsdV9wZ3MpIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmICAvKiBQQUdFX1NJWkUgPiBMVV9QQUdFX1NJWkUgKi8KKworLyogcGFyYW1ldGVycyBmb3IgcmVhZGRpciBwYWdlICovCitzdHJ1Y3QgcmVhZHBhZ2VfcGFyYW0geworCXN0cnVjdCBtZF9vcF9kYXRhCSpycF9tb2Q7CisJX191NjQJCQlycF9vZmY7CisJaW50CQkJcnBfaGFzaDY0OworCXN0cnVjdCBvYmRfZXhwb3J0CSpycF9leHA7CisJc3RydWN0IG1kX2NhbGxiYWNrCSpycF9jYjsKK307CisKKy8qKgorICogUmVhZCBwYWdlcyBmcm9tIHNlcnZlci4KKyAqCisgKiBQYWdlIGluIE1EU19SRUFEUEFHRSBSUEMgaXMgcGFja2VkIGluIExVX1BBR0VfU0laRSwgYW5kIGVhY2ggcGFnZSBjb250YWlucworICogYSBoZWFkZXIgbHVfZGlycGFnZSB3aGljaCBkZXNjcmliZXMgdGhlIHN0YXJ0L2VuZCBoYXNoLCBhbmQgd2hldGhlciB0aGlzCisgKiBwYWdlIGlzIGVtcHR5IChjb250YWlucyBubyBkaXIgZW50cnkpIG9yIGhhc2ggY29sbGlkZSB3aXRoIG5leHQgcGFnZS4KKyAqIEFmdGVyIGNsaWVudCByZWNlaXZlcyByZXBseSwgc2V2ZXJhbCBwYWdlcyB3aWxsIGJlIGludGVncmF0ZWQgaW50byBkaXIgcGFnZQorICogaW4gUEFHRV9TSVpFIChpZiBQQUdFX1NJWkUgZ3JlYXRlciB0aGFuIExVX1BBR0VfU0laRSksIGFuZCB0aGUKKyAqIGx1X2RpcnBhZ2UgZm9yIHRoaXMgaW50ZWdyYXRlZCBwYWdlIHdpbGwgYmUgYWRqdXN0ZWQuCisgKiovCitzdGF0aWMgaW50IG1kY19yZWFkX3BhZ2VfcmVtb3RlKHZvaWQgKmRhdGEsIHN0cnVjdCBwYWdlICpwYWdlMCkKK3sKKwlzdHJ1Y3QgcmVhZHBhZ2VfcGFyYW0gKnJwID0gZGF0YTsKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VfcG9vbDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgbHVfZGlycGFnZSAqZHA7CisJaW50IHJkX3BncyA9IDA7IC8qIG51bWJlciBvZiBwYWdlcyByZWFkIGFjdHVhbGx5ICovCisJaW50IG5wYWdlczsKKwlzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSA9IHJwLT5ycF9tb2Q7CisJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXE7CisJaW50IG1heF9wYWdlcyA9IG9wX2RhdGEtPm9wX21heF9wYWdlczsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBsdV9maWQgKmZpZDsKKwlpbnQgaTsKKwlpbnQgcmM7CisKKwlMQVNTRVJUKG1heF9wYWdlcyA+IDAgJiYgbWF4X3BhZ2VzIDw9IFBUTFJQQ19NQVhfQlJXX1BBR0VTKTsKKwlpbm9kZSA9IG9wX2RhdGEtPm9wX2RhdGE7CisJZmlkID0gJm9wX2RhdGEtPm9wX2ZpZDE7CisJTEFTU0VSVChpbm9kZSk7CisKKwlwYWdlX3Bvb2wgPSBrY2FsbG9jKG1heF9wYWdlcywgc2l6ZW9mKHBhZ2UpLCBHRlBfTk9GUyk7CisJaWYgKHBhZ2VfcG9vbCkgeworCQlwYWdlX3Bvb2xbMF0gPSBwYWdlMDsKKwl9IGVsc2UgeworCQlwYWdlX3Bvb2wgPSAmcGFnZTA7CisJCW1heF9wYWdlcyA9IDE7CisJfQorCisJZm9yIChucGFnZXMgPSAxOyBucGFnZXMgPCBtYXhfcGFnZXM7IG5wYWdlcysrKSB7CisJCXBhZ2UgPSBwYWdlX2NhY2hlX2FsbG9jX2NvbGQoaW5vZGUtPmlfbWFwcGluZyk7CisJCWlmICghcGFnZSkKKwkJCWJyZWFrOworCQlwYWdlX3Bvb2xbbnBhZ2VzXSA9IHBhZ2U7CisJfQorCisJcmMgPSBtZGNfZ2V0cGFnZShycC0+cnBfZXhwLCBmaWQsIHJwLT5ycF9vZmYsIHBhZ2VfcG9vbCwgbnBhZ2VzLCAmcmVxKTsKKwlpZiAoIXJjKSB7CisJCWludCBsdV9wZ3MgPSByZXEtPnJxX2J1bGstPmJkX25vYl90cmFuc2ZlcnJlZDsKKworCQlyZF9wZ3MgPSAocmVxLT5ycV9idWxrLT5iZF9ub2JfdHJhbnNmZXJyZWQgKworCQkJICBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOworCQlsdV9wZ3MgPj49IExVX1BBR0VfU0hJRlQ7CisJCUxBU1NFUlQoIShyZXEtPnJxX2J1bGstPmJkX25vYl90cmFuc2ZlcnJlZCAmIH5MVV9QQUdFX01BU0spKTsKKworCQlDREVCVUcoRF9JTk9ERSwgInJlYWQgJWQoJWQpIHBhZ2VzXG4iLCByZF9wZ3MsIGx1X3Bncyk7CisKKwkJbWRjX2FkanVzdF9kaXJwYWdlcyhwYWdlX3Bvb2wsIHJkX3BncywgbHVfcGdzKTsKKworCQlTZXRQYWdlVXB0b2RhdGUocGFnZTApOworCX0KKworCXVubG9ja19wYWdlKHBhZ2UwKTsKKwlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7CisJQ0RFQlVHKERfQ0FDSEUsICJyZWFkICVkLyVkIHBhZ2VzXG4iLCByZF9wZ3MsIG5wYWdlcyk7CisJZm9yIChpID0gMTsgaSA8IG5wYWdlczsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCQlfX3U2NCBoYXNoOworCQlpbnQgcmV0OworCisJCXBhZ2UgPSBwYWdlX3Bvb2xbaV07CisKKwkJaWYgKHJjIDwgMCB8fCBpID49IHJkX3BncykgeworCQkJcHV0X3BhZ2UocGFnZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKworCQlkcCA9IGttYXAocGFnZSk7CisJCWhhc2ggPSBsZTY0X3RvX2NwdShkcC0+bGRwX2hhc2hfc3RhcnQpOworCQlrdW5tYXAocGFnZSk7CisKKwkJb2Zmc2V0ID0gaGFzaF94X2luZGV4KGhhc2gsIHJwLT5ycF9oYXNoNjQpOworCisJCXByZWZldGNodygmcGFnZS0+ZmxhZ3MpOworCQlyZXQgPSBhZGRfdG9fcGFnZV9jYWNoZV9scnUocGFnZSwgaW5vZGUtPmlfbWFwcGluZywgb2Zmc2V0LAorCQkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghcmV0KQorCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCWVsc2UKKwkJCUNERUJVRyhEX1ZGU1RSQUNFLCAicGFnZSAlbHUgYWRkIHRvIHBhZ2UgY2FjaGUgZmFpbGVkOiByYyA9ICVkXG4iLAorCQkJICAgICAgIG9mZnNldCwgcmV0KTsKKwkJcHV0X3BhZ2UocGFnZSk7CisJfQorCisJaWYgKHBhZ2VfcG9vbCAhPSAmcGFnZTApCisJCWtmcmVlKHBhZ2VfcG9vbCk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogUmVhZCBkaXIgcGFnZSBmcm9tIGNhY2hlIGZpcnN0LCBpZiBpdCBjYW4gbm90IGZpbmQgaXQsIHJlYWQgaXQgZnJvbQorICogc2VydmVyIGFuZCBhZGQgaW50byB0aGUgY2FjaGUuCisgKgorICogXHBhcmFtW2luXSBleHAJTURDIGV4cG9ydAorICogXHBhcmFtW2luXSBvcF9kYXRhCWNsaWVudCBNRCBzdGFjayBwYXJhbWV0ZXJzLCB0cmFuc2ZlcnJpbmcgcGFyYW1ldGVycworICoJCQliZXR3ZWVuIGRpZmZlcmVudCBsYXllcnMgb24gY2xpZW50IE1EIHN0YWNrLgorICogXHBhcmFtW2luXSBjYl9vcAljYWxsYmFjayByZXF1aXJlZCBmb3IgbGRsbSBsb2NrIGVucXVldWUgZHVyaW5nCisgKgkJCXJlYWQgcGFnZQorICogXHBhcmFtW2luXSBoYXNoX29mZnNldCB0aGUgaGFzaCBvZmZzZXQgb2YgdGhlIHBhZ2UgdG8gYmUgcmVhZAorICogXHBhcmFtW2luXSBwcGFnZQl0aGUgcGFnZSB0byBiZSByZWFkCisgKgorICogcmV0dmFsCQk9IDAgZ2V0IHRoZSBwYWdlIHN1Y2Nlc3NmdWxseQorICoJCQllcnJubyg8MCkgZ2V0IHRoZSBwYWdlIGZhaWxlZAorICovCitzdGF0aWMgaW50IG1kY19yZWFkX3BhZ2Uoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCisJCQkgc3RydWN0IG1kX2NhbGxiYWNrICpjYl9vcCwgX191NjQgaGFzaF9vZmZzZXQsCisJCQkgc3RydWN0IHBhZ2UgKipwcGFnZSkKK3sKKwlzdHJ1Y3QgbG9va3VwX2ludGVudCBpdCA9IHsgLml0X29wID0gSVRfUkVBRERJUiB9OworCXN0cnVjdCBwYWdlICpwYWdlOworCXN0cnVjdCBpbm9kZSAqZGlyID0gb3BfZGF0YS0+b3BfZGF0YTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKKwlzdHJ1Y3QgbHVfZGlycGFnZSAqZHA7CisJX191NjQgc3RhcnQgPSAwOworCV9fdTY0IGVuZCA9IDA7CisJc3RydWN0IGx1c3RyZV9oYW5kbGUgbG9ja2g7CisJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICplbnFfcmVxID0gTlVMTDsKKwlzdHJ1Y3QgcmVhZHBhZ2VfcGFyYW0gcnBfcGFyYW07CisJaW50IHJjOworCisJKnBwYWdlID0gTlVMTDsKKworCUxBU1NFUlQoZGlyKTsKKwltYXBwaW5nID0gZGlyLT5pX21hcHBpbmc7CisKKwlyYyA9IG1kY19pbnRlbnRfbG9jayhleHAsIG9wX2RhdGEsICZpdCwgJmVucV9yZXEsCisJCQkgICAgIGNiX29wLT5tZF9ibG9ja2luZ19hc3QsIDApOworCWlmIChlbnFfcmVxKQorCQlwdGxycGNfcmVxX2ZpbmlzaGVkKGVucV9yZXEpOworCisJaWYgKHJjIDwgMCkgeworCQlDRVJST1IoIiVzOiAiREZJRCIgbG9jayBlbnF1ZXVlIGZhaWxzOiByYyA9ICVkXG4iLAorCQkgICAgICAgZXhwLT5leHBfb2JkLT5vYmRfbmFtZSwgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSksIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjID0gMDsKKwlsb2NraC5jb29raWUgPSBpdC5pdF9sb2NrX2hhbmRsZTsKKwltZGNfc2V0X2xvY2tfZGF0YShleHAsICZsb2NraCwgZGlyLCBOVUxMKTsKKworCXJwX3BhcmFtLnJwX29mZiA9IGhhc2hfb2Zmc2V0OworCXJwX3BhcmFtLnJwX2hhc2g2NCA9IG9wX2RhdGEtPm9wX2NsaV9mbGFncyAmIENMSV9IQVNINjQ7CisJcGFnZSA9IG1kY19wYWdlX2xvY2F0ZShtYXBwaW5nLCAmcnBfcGFyYW0ucnBfb2ZmLCAmc3RhcnQsICZlbmQsCisJCQkgICAgICAgcnBfcGFyYW0ucnBfaGFzaDY0KTsKKwlpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCUNERUJVRyhEX0lORk8sICIlczogZGlyIHBhZ2UgbG9jYXRlOiAiIERGSUQgIiBhdCAlbGx1OiByYyAlbGRcbiIsCisJCSAgICAgICBleHAtPmV4cF9vYmQtPm9iZF9uYW1lLCBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwKKwkJICAgICAgIHJwX3BhcmFtLnJwX29mZiwgUFRSX0VSUihwYWdlKSk7CisJCXJjID0gUFRSX0VSUihwYWdlKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0gZWxzZSBpZiAocGFnZSkgeworCQkvKgorCQkgKiBYWFggbmlraXRhOiBub3QgZW50aXJlbHkgY29ycmVjdCBoYW5kbGluZyBvZiBhIGNvcm5lciBjYXNlOgorCQkgKiBzdXBwb3NlIGhhc2ggY2hhaW4gb2YgZW50cmllcyB3aXRoIGhhc2ggdmFsdWUgSEFTSCBjcm9zc2VzCisJCSAqIGJvcmRlciBiZXR3ZWVuIHBhZ2VzIFAwIGFuZCBQMS4gRmlyc3QgYm90aCBQMCBhbmQgUDEgYXJlCisJCSAqIGNhY2hlZCwgc2Vla2RpcigpIGlzIGNhbGxlZCBmb3Igc29tZSBlbnRyeSBmcm9tIHRoZSBQMCBwYXJ0CisJCSAqIG9mIHRoZSBjaGFpbi4gTGF0ZXIgUDAgZ29lcyBvdXQgb2YgY2FjaGUuIHRlbGxkaXIoSEFTSCkKKwkJICogaGFwcGVucyBhbmQgZmluZHMgUDEsIGFzIGl0IHN0YXJ0cyB3aXRoIG1hdGNoaW5nIGhhc2gKKwkJICogdmFsdWUuIFJlbWFpbmluZyBlbnRyaWVzIGZyb20gUDAgcGFydCBvZiB0aGUgY2hhaW4gYXJlCisJCSAqIHNraXBwZWQuIChJcyB0aGF0IHJlYWxseSBhIGJ1Zz8pCisJCSAqCisJCSAqIFBvc3NpYmxlIHNvbHV0aW9uczogMC4gZG9uJ3QgY2FjaGUgUDEgaXMgc3VjaCBjYXNlLCBoYW5kbGUKKwkJICogaXQgYXMgYW4gIm92ZXJmbG93IiBwYWdlLiAxLiBpbnZhbGlkYXRlIGFsbCBwYWdlcyBhdAorCQkgKiBvbmNlLiAyLiB1c2UgSEFTSHwxIGFzIGFuIGluZGV4IGZvciBQMS4KKwkJICovCisJCWdvdG8gaGFzaF9jb2xsaXNpb247CisJfQorCisJcnBfcGFyYW0ucnBfZXhwID0gZXhwOworCXJwX3BhcmFtLnJwX21vZCA9IG9wX2RhdGE7CisJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLAorCQkJICAgICAgIGhhc2hfeF9pbmRleChycF9wYXJhbS5ycF9vZmYsCisJCQkJCSAgICBycF9wYXJhbS5ycF9oYXNoNjQpLAorCQkJICAgICAgIG1kY19yZWFkX3BhZ2VfcmVtb3RlLCAmcnBfcGFyYW0pOworCWlmIChJU19FUlIocGFnZSkpIHsKKwkJQ0VSUk9SKCIlczogcmVhZCBjYWNoZSBwYWdlOiAiREZJRCIgYXQgJWxsdTogcmMgJWxkXG4iLAorCQkgICAgICAgZXhwLT5leHBfb2JkLT5vYmRfbmFtZSwgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSksCisJCSAgICAgICBycF9wYXJhbS5ycF9vZmYsIFBUUl9FUlIocGFnZSkpOworCQlyYyA9IFBUUl9FUlIocGFnZSk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOworCSh2b2lkKWttYXAocGFnZSk7CisJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJQ0VSUk9SKCIlczogcGFnZSBub3QgdXBkYXRlZDogIkRGSUQiIGF0ICVsbHU6IHJjICVkXG4iLAorCQkgICAgICAgZXhwLT5leHBfb2JkLT5vYmRfbmFtZSwgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSksCisJCSAgICAgICBycF9wYXJhbS5ycF9vZmYsIC01KTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAoIVBhZ2VDaGVja2VkKHBhZ2UpKQorCQlTZXRQYWdlQ2hlY2tlZChwYWdlKTsKKwlpZiAoUGFnZUVycm9yKHBhZ2UpKSB7CisJCUNFUlJPUigiJXM6IHBhZ2UgZXJyb3I6ICJERklEIiBhdCAlbGx1OiByYyAlZFxuIiwKKwkJICAgICAgIGV4cC0+ZXhwX29iZC0+b2JkX25hbWUsIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDEpLAorCQkgICAgICAgcnBfcGFyYW0ucnBfb2ZmLCAtNSk7CisJCWdvdG8gZmFpbDsKKwl9CisKK2hhc2hfY29sbGlzaW9uOgorCWRwID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCWlmIChCSVRTX1BFUl9MT05HID09IDMyICYmIHJwX3BhcmFtLnJwX2hhc2g2NCkgeworCQlzdGFydCA9IGxlNjRfdG9fY3B1KGRwLT5sZHBfaGFzaF9zdGFydCkgPj4gMzI7CisJCWVuZCA9IGxlNjRfdG9fY3B1KGRwLT5sZHBfaGFzaF9lbmQpID4+IDMyOworCQlycF9wYXJhbS5ycF9vZmYgPSBoYXNoX29mZnNldCA+PiAzMjsKKwl9IGVsc2UgeworCQlzdGFydCA9IGxlNjRfdG9fY3B1KGRwLT5sZHBfaGFzaF9zdGFydCk7CisJCWVuZCA9IGxlNjRfdG9fY3B1KGRwLT5sZHBfaGFzaF9lbmQpOworCQlycF9wYXJhbS5ycF9vZmYgPSBoYXNoX29mZnNldDsKKwl9CisJaWYgKGVuZCA9PSBzdGFydCkgeworCQlMQVNTRVJUKHN0YXJ0ID09IHJwX3BhcmFtLnJwX29mZik7CisJCUNXQVJOKCJQYWdlLXdpZGUgaGFzaCBjb2xsaXNpb246ICUjbHhcbiIsICh1bnNpZ25lZCBsb25nKWVuZCk7CisjaWYgQklUU19QRVJfTE9ORyA9PSAzMgorCQlDV0FSTigiUmVhbCBwYWdlLXdpZGUgaGFzaCBjb2xsaXNpb24gYXQgWyVsbHUgJWxsdV0gd2l0aCBoYXNoICVsbHVcbiIsCisJCSAgICAgIGxlNjRfdG9fY3B1KGRwLT5sZHBfaGFzaF9zdGFydCksCisJCSAgICAgIGxlNjRfdG9fY3B1KGRwLT5sZHBfaGFzaF9lbmQpLCBoYXNoX29mZnNldCk7CisjZW5kaWYKKwkJLyoKKwkJICogRmV0Y2ggd2hvbGUgb3ZlcmZsb3cgY2hhaW4uLi4KKwkJICoKKwkJICogWFhYIG5vdCB5ZXQuCisJCSAqLworCQlnb3RvIGZhaWw7CisJfQorCSpwcGFnZSA9IHBhZ2U7CitvdXRfdW5sb2NrOgorCWxkbG1fbG9ja19kZWNyZWYoJmxvY2toLCBpdC5pdF9sb2NrX21vZGUpOworCXJldHVybiByYzsKK2ZhaWw6CisJa3VubWFwKHBhZ2UpOworCW1kY19yZWxlYXNlX3BhZ2UocGFnZSwgMSk7CisJcmMgPSAtRUlPOworCWdvdG8gb3V0X3VubG9jazsKK30KKwogc3RhdGljIGludCBtZGNfc3RhdGZzKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwKIAkJICAgICAgc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG9iZF9zdGF0ZnMgKm9zZnMsCiAJCSAgICAgIF9fdTY0IG1heF9hZ2UsIF9fdTMyIGZsYWdzKQpAQCAtMTQwMSw3ICsxODQyLDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qga3VjX2hkciAqY2hhbmdlbG9nX2t1Y19oZHIoY2hhciAqYnVmLCBpbnQgbGVuLCBpbnQgZmxhZ3MpCitzdGF0aWMgc3RydWN0IGt1Y19oZHIgKmNoYW5nZWxvZ19rdWNfaGRyKGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwgdTMyIGZsYWdzKQogewogCXN0cnVjdCBrdWNfaGRyICpsaCA9IChzdHJ1Y3Qga3VjX2hkciAqKWJ1ZjsKIApAQCAtMTQxNSw0MCArMTg1Niw0NCBAQAogCXJldHVybiBsaDsKIH0KIAotI2RlZmluZSBEX0NIQU5HRUxPRyAwCi0KIHN0cnVjdCBjaGFuZ2Vsb2dfc2hvdyB7CiAJX191NjQJCWNzX3N0YXJ0cmVjOwotCV9fdTMyCQljc19mbGFnczsKKwllbnVtIGNoYW5nZWxvZ19zZW5kX2ZsYWcJY3NfZmxhZ3M7CiAJc3RydWN0IGZpbGUJKmNzX2ZwOwogCWNoYXIJCSpjc19idWY7CiAJc3RydWN0IG9iZF9kZXZpY2UgKmNzX29iZDsKIH07CiAKK3N0YXRpYyBpbmxpbmUgY2hhciAqY3Nfb2JkX25hbWUoc3RydWN0IGNoYW5nZWxvZ19zaG93ICpjcykKK3sKKwlyZXR1cm4gY3MtPmNzX29iZC0+b2JkX25hbWU7Cit9CisKIHN0YXRpYyBpbnQgY2hhbmdlbG9nX2trdWNfY2IoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgbGxvZ19oYW5kbGUgKmxsaCwKIAkJCSAgICAgc3RydWN0IGxsb2dfcmVjX2hkciAqaGRyLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBjaGFuZ2Vsb2dfc2hvdyAqY3MgPSBkYXRhOwogCXN0cnVjdCBsbG9nX2NoYW5nZWxvZ19yZWMgKnJlYyA9IChzdHJ1Y3QgbGxvZ19jaGFuZ2Vsb2dfcmVjICopaGRyOwogCXN0cnVjdCBrdWNfaGRyICpsaDsKLQlpbnQgbGVuLCByYzsKKwlzaXplX3QgbGVuOworCWludCByYzsKIAogCWlmIChyZWMtPmNyX2hkci5scmhfdHlwZSAhPSBDSEFOR0VMT0dfUkVDKSB7CiAJCXJjID0gLUVJTlZBTDsKIAkJQ0VSUk9SKCIlczogbm90IGEgY2hhbmdlbG9nIHJlYyAleC8lZDogcmMgPSAlZFxuIiwKLQkJICAgICAgIGNzLT5jc19vYmQtPm9iZF9uYW1lLCByZWMtPmNyX2hkci5scmhfdHlwZSwKKwkJICAgICAgIGNzX29iZF9uYW1lKGNzKSwgcmVjLT5jcl9oZHIubHJoX3R5cGUsCiAJCSAgICAgICByZWMtPmNyLmNyX3R5cGUsIHJjKTsKIAkJcmV0dXJuIHJjOwogCX0KIAogCWlmIChyZWMtPmNyLmNyX2luZGV4IDwgY3MtPmNzX3N0YXJ0cmVjKSB7CiAJCS8qIFNraXAgZW50cmllcyBlYXJsaWVyIHRoYW4gd2hhdCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiAqLwotCQlDREVCVUcoRF9DSEFOR0VMT0csICJyZWM9JWxsdSBzdGFydD0lbGx1XG4iLAorCQlDREVCVUcoRF9IU00sICJyZWM9JWxsdSBzdGFydD0lbGx1XG4iLAogCQkgICAgICAgcmVjLT5jci5jcl9pbmRleCwgY3MtPmNzX3N0YXJ0cmVjKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JQ0RFQlVHKERfQ0hBTkdFTE9HLCAiJWxsdSAlMDJkJS01cyAlbGx1IDB4JXggdD0iREZJRCIgcD0iREZJRAorCUNERUJVRyhEX0hTTSwgIiVsbHUgJTAyZCUtNXMgJWxsdSAweCV4IHQ9IiBERklEICIgcD0iIERGSUQKIAkJIiAlLipzXG4iLCByZWMtPmNyLmNyX2luZGV4LCByZWMtPmNyLmNyX3R5cGUsCiAJCWNoYW5nZWxvZ190eXBlMnN0cihyZWMtPmNyLmNyX3R5cGUpLCByZWMtPmNyLmNyX3RpbWUsCiAJCXJlYy0+Y3IuY3JfZmxhZ3MgJiBDTEZfRkxBR01BU0ssCkBAIC0xNDYyLDIwICsxOTA3LDIxIEBACiAJbWVtY3B5KGxoICsgMSwgJnJlYy0+Y3IsIGxlbiAtIHNpemVvZigqbGgpKTsKIAogCXJjID0gbGliY2ZzX2trdWNfbXNnX3B1dChjcy0+Y3NfZnAsIGxoKTsKLQlDREVCVUcoRF9DSEFOR0VMT0csICJrdWNtc2cgZnAgJXAgbGVuICVkIHJjICVkXG4iLCBjcy0+Y3NfZnAsIGxlbiwgcmMpOworCUNERUJVRyhEX0hTTSwgImt1Y21zZyBmcCAlcCBsZW4gJXp1IHJjICVkXG4iLCBjcy0+Y3NfZnAsIGxlbiwgcmMpOwogCiAJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50IG1kY19jaGFuZ2Vsb2dfc2VuZF90aHJlYWQodm9pZCAqY3NkYXRhKQogeworCWVudW0gbGxvZ19mbGFnIGZsYWdzID0gTExPR19GX0lTX0NBVDsKIAlzdHJ1Y3QgY2hhbmdlbG9nX3Nob3cgKmNzID0gY3NkYXRhOwogCXN0cnVjdCBsbG9nX2N0eHQgKmN0eHQgPSBOVUxMOwogCXN0cnVjdCBsbG9nX2hhbmRsZSAqbGxoID0gTlVMTDsKIAlzdHJ1Y3Qga3VjX2hkciAqa3VjaDsKIAlpbnQgcmM7CiAKLQlDREVCVUcoRF9DSEFOR0VMT0csICJjaGFuZ2Vsb2cgdG8gZnA9JXAgc3RhcnQgJWxsdVxuIiwKKwlDREVCVUcoRF9IU00sICJjaGFuZ2Vsb2cgdG8gZnA9JXAgc3RhcnQgJWxsdVxuIiwKIAkgICAgICAgY3MtPmNzX2ZwLCBjcy0+Y3Nfc3RhcnRyZWMpOwogCiAJY3MtPmNzX2J1ZiA9IGt6YWxsb2MoS1VDX0NIQU5HRUxPR19NU0dfTUFYU0laRSwgR0ZQX05PRlMpOwpAQCAtMTQ5NCwxMCArMTk0MCwxNCBAQAogCQkgICAgICAgTExPR19PUEVOX0VYSVNUUyk7CiAJaWYgKHJjKSB7CiAJCUNFUlJPUigiJXM6IGZhaWwgdG8gb3BlbiBjaGFuZ2Vsb2cgY2F0YWxvZzogcmMgPSAlZFxuIiwKLQkJICAgICAgIGNzLT5jc19vYmQtPm9iZF9uYW1lLCByYyk7CisJCSAgICAgICBjc19vYmRfbmFtZShjcyksIHJjKTsKIAkJZ290byBvdXQ7CiAJfQotCXJjID0gbGxvZ19pbml0X2hhbmRsZShOVUxMLCBsbGgsIExMT0dfRl9JU19DQVQsIE5VTEwpOworCisJaWYgKGNzLT5jc19mbGFncyAmIENIQU5HRUxPR19GTEFHX0pPQklEKQorCQlmbGFncyB8PSBMTE9HX0ZfRVhUX0pPQklEOworCisJcmMgPSBsbG9nX2luaXRfaGFuZGxlKE5VTEwsIGxsaCwgZmxhZ3MsIE5VTEwpOwogCWlmIChyYykgewogCQlDRVJST1IoImxsb2dfaW5pdF9oYW5kbGUgZmFpbGVkICVkXG4iLCByYyk7CiAJCWdvdG8gb3V0OwpAQCAtMTU1MCwxMiArMjAwMCwxMiBAQAogCWlmIChJU19FUlIodGFzaykpIHsKIAkJcmMgPSBQVFJfRVJSKHRhc2spOwogCQlDRVJST1IoIiVzOiBjYW4ndCBzdGFydCBjaGFuZ2Vsb2cgdGhyZWFkOiByYyA9ICVkXG4iLAotCQkgICAgICAgb2JkLT5vYmRfbmFtZSwgcmMpOworCQkgICAgICAgY3Nfb2JkX25hbWUoY3MpLCByYyk7CiAJCWtmcmVlKGNzKTsKIAl9IGVsc2UgewogCQlyYyA9IDA7Ci0JCUNERUJVRyhEX0NIQU5HRUxPRywgIiVzOiBzdGFydGVkIGNoYW5nZWxvZyB0aHJlYWRcbiIsCi0JCSAgICAgICBvYmQtPm9iZF9uYW1lKTsKKwkJQ0RFQlVHKERfSFNNLCAiJXM6IHN0YXJ0ZWQgY2hhbmdlbG9nIHRocmVhZFxuIiwKKwkJICAgICAgIGNzX29iZF9uYW1lKGNzKSk7CiAJfQogCiAJQ0VSUk9SKCJGYWlsZWQgdG8gc3RhcnQgY2hhbmdlbG9nIHRocmVhZDogJWRcbiIsIHJjKTsKQEAgLTE2NjksOSArMjExOSwxMSBAQAogCSAqIHdpdGggdGhlIHJlcXVlc3QgUlBDIHRvIGF2b2lkIGV4dHJhIFJQQyByb3VuZCB0cmlwcwogCSAqLwogCWNvdW50ID0gbWRjX3Jlc291cmNlX2dldF91bnVzZWQoZXhwLCAmb3BfZGF0YS0+b3BfZmlkMSwgJmNhbmNlbHMsCi0JCQkJCUxDS19DUiwgTURTX0lOT0RFTE9DS19MQVlPVVQpOworCQkJCQlMQ0tfQ1IsIE1EU19JTk9ERUxPQ0tfTEFZT1VUIHwKKwkJCQkJTURTX0lOT0RFTE9DS19YQVRUUik7CiAJY291bnQgKz0gbWRjX3Jlc291cmNlX2dldF91bnVzZWQoZXhwLCAmb3BfZGF0YS0+b3BfZmlkMiwgJmNhbmNlbHMsCi0JCQkJCSBMQ0tfQ1IsIE1EU19JTk9ERUxPQ0tfTEFZT1VUKTsKKwkJCQkJIExDS19DUiwgTURTX0lOT0RFTE9DS19MQVlPVVQgfAorCQkJCQkgTURTX0lOT0RFTE9DS19YQVRUUik7CiAKIAlyZXEgPSBwdGxycGNfcmVxdWVzdF9hbGxvYyhjbGFzc19leHAyY2xpaW1wKGV4cCksCiAJCQkJICAgJlJRRl9NRFNfU1dBUF9MQVlPVVRTKTsKQEAgLTE5MTcsNyArMjM2OSw3IEBACiBzdGF0aWMgdm9pZCBsdXN0cmVfc3dhYl9oYWwoc3RydWN0IGhzbV9hY3Rpb25fbGlzdCAqaCkKIHsKIAlzdHJ1Y3QgaHNtX2FjdGlvbl9pdGVtCSpoYWk7Ci0JaW50CQkJIGk7CisJdTMyIGk7CiAKIAlfX3N3YWIzMnMoJmgtPmhhbF92ZXJzaW9uKTsKIAlfX3N3YWIzMnMoJmgtPmhhbF9jb3VudCk7CkBAIC0xOTY2LDE0ICsyNDE4LDE0IEBACiAgKiBAcGFyYW0gdmFsIEtVQyBtZXNzYWdlIChrdWNfaGRyICsgaHNtX2FjdGlvbl9saXN0KQogICogQHBhcmFtIGxlbiB0b3RhbCBsZW5ndGggb2YgbWVzc2FnZQogICovCi1zdGF0aWMgaW50IG1kY19oc21fY29weXRvb2xfc2VuZChpbnQgbGVuLCB2b2lkICp2YWwpCitzdGF0aWMgaW50IG1kY19oc21fY29weXRvb2xfc2VuZChzaXplX3QgbGVuLCB2b2lkICp2YWwpCiB7CiAJc3RydWN0IGt1Y19oZHIJCSpsaCA9IChzdHJ1Y3Qga3VjX2hkciAqKXZhbDsKIAlzdHJ1Y3QgaHNtX2FjdGlvbl9saXN0CSpoYWwgPSAoc3RydWN0IGhzbV9hY3Rpb25fbGlzdCAqKShsaCArIDEpOwogCiAJaWYgKGxlbiA8IHNpemVvZigqbGgpICsgc2l6ZW9mKCpoYWwpKSB7Ci0JCUNFUlJPUigiU2hvcnQgSFNNIG1lc3NhZ2UgJWQgPCAlZFxuIiwgbGVuLAotCQkgICAgICAgKGludCkoc2l6ZW9mKCpsaCkgKyBzaXplb2YoKmhhbCkpKTsKKwkJQ0VSUk9SKCJTaG9ydCBIU00gbWVzc2FnZSAlenUgPCAlenVcbiIsIGxlbiwKKwkJICAgICAgIHNpemVvZigqbGgpICsgc2l6ZW9mKCpoYWwpKTsKIAkJcmV0dXJuIC1FUFJPVE87CiAJfQogCWlmIChsaC0+a3VjX21hZ2ljID09IF9fc3dhYjE2KEtVQ19NQUdJQykpIHsKQEAgLTIwNDQsOSArMjQ5Niw4IEBACiAJCX0KIAkJc3Bpbl91bmxvY2soJmltcC0+aW1wX2xvY2spOwogCi0JCXJjID0gZG9fc2V0X2luZm9fYXN5bmMoaW1wLCBNRFNfU0VUX0lORk8sIExVU1RSRV9NRFNfVkVSU0lPTiwKLQkJCQkgICAgICAga2V5bGVuLCBrZXksIHZhbGxlbiwgdmFsLCBzZXQpOwotCQlyZXR1cm4gcmM7CisJCXJldHVybiBkb19zZXRfaW5mb19hc3luYyhpbXAsIE1EU19TRVRfSU5GTywgTFVTVFJFX01EU19WRVJTSU9OLAorCQkJCQkga2V5bGVuLCBrZXksIHZhbGxlbiwgdmFsLCBzZXQpOwogCX0KIAlpZiAoS0VZX0lTKEtFWV9TUFRMUlBDX0NPTkYpKSB7CiAJCXNwdGxycGNfY29uZl9jbGllbnRfYWRhcHQoZXhwLT5leHBfb2JkKTsKQEAgLTIwNjUsNiArMjUxNiwxMiBAQAogCQlyYyA9IG1kY19oc21fY29weXRvb2xfc2VuZCh2YWxsZW4sIHZhbCk7CiAJCXJldHVybiByYzsKIAl9CisJaWYgKEtFWV9JUyhLRVlfREVGQVVMVF9FQVNJWkUpKSB7CisJCXUzMiAqZGVmYXVsdF9lYXNpemUgPSB2YWw7CisKKwkJZXhwLT5leHBfb2JkLT51LmNsaS5jbF9kZWZhdWx0X21kc19lYXNpemUgPSAqZGVmYXVsdF9lYXNpemU7CisJCXJldHVybiAwOworCX0KIAogCUNFUlJPUigiVW5rbm93biBrZXkgJXNcbiIsIChjaGFyICopa2V5KTsKIAlyZXR1cm4gLUVJTlZBTDsKQEAgLTIwNzcsMTggKzI1MzQsMTggQEAKIAlpbnQgcmMgPSAtRUlOVkFMOwogCiAJaWYgKEtFWV9JUyhLRVlfTUFYX0VBU0laRSkpIHsKLQkJaW50IG1kc2l6ZSwgKm1heF9lYXNpemU7CisJCXUzMiBtZHNpemUsICptYXhfZWFzaXplOwogCiAJCWlmICgqdmFsbGVuICE9IHNpemVvZihpbnQpKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCW1kc2l6ZSA9ICooaW50ICopdmFsOworCQltZHNpemUgPSAqKHUzMiAqKXZhbDsKIAkJaWYgKG1kc2l6ZSA+IGV4cC0+ZXhwX29iZC0+dS5jbGkuY2xfbWF4X21kc19lYXNpemUpCiAJCQlleHAtPmV4cF9vYmQtPnUuY2xpLmNsX21heF9tZHNfZWFzaXplID0gbWRzaXplOwogCQltYXhfZWFzaXplID0gdmFsOwogCQkqbWF4X2Vhc2l6ZSA9IGV4cC0+ZXhwX29iZC0+dS5jbGkuY2xfbWF4X21kc19lYXNpemU7CiAJCXJldHVybiAwOwogCX0gZWxzZSBpZiAoS0VZX0lTKEtFWV9ERUZBVUxUX0VBU0laRSkpIHsKLQkJaW50ICpkZWZhdWx0X2Vhc2l6ZTsKKwkJdTMyICpkZWZhdWx0X2Vhc2l6ZTsKIAogCQlpZiAoKnZhbGxlbiAhPSBzaXplb2YoaW50KSkKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtMjEwNSw3ICsyNTYyLDcgQEAKIAkJKmRhdGEgPSBpbXAtPmltcF9jb25uZWN0X2RhdGE7CiAJCXJldHVybiAwOwogCX0gZWxzZSBpZiAoS0VZX0lTKEtFWV9UR1RfQ09VTlQpKSB7Ci0JCSooKGludCAqKXZhbCkgPSAxOworCQkqKCh1MzIgKil2YWwpID0gMTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0yMTk5LDEzICsyNjU2LDEzIEBACiAJcmV0dXJuIHJjOwogfQogCi1pbnQgbWRjX2ZpZF9hbGxvYyhzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbHVfZmlkICpmaWQsCi0JCSAgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEpCitpbnQgbWRjX2ZpZF9hbGxvYyhjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCisJCSAgc3RydWN0IGx1X2ZpZCAqZmlkLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSkKIHsKIAlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gJmV4cC0+ZXhwX29iZC0+dS5jbGk7CiAJc3RydWN0IGx1X2NsaWVudF9zZXEgKnNlcSA9IGNsaS0+Y2xfc2VxOwogCi0JcmV0dXJuIHNlcV9jbGllbnRfYWxsb2NfZmlkKE5VTEwsIHNlcSwgZmlkKTsKKwlyZXR1cm4gc2VxX2NsaWVudF9hbGxvY19maWQoZW52LCBzZXEsIGZpZCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgb2JkX3V1aWQgKm1kY19nZXRfdXVpZChzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwKQpAQCAtMjMzMyw4ICsyNzkwLDggQEAKICAqIGEgbGFyZ2UgbnVtYmVyIG9mIHN0cmlwZXMgaXMgcG9zc2libGUuICBJZiBhIGxhcmdlciByZXBseSBidWZmZXIgaXMKICAqIHJlcXVpcmVkIGl0IHdpbGwgYmUgcmVhbGxvY2F0ZWQgaW4gdGhlIHB0bHJwYyBsYXllciBkdWUgdG8gb3ZlcmZsb3cuCiAgKi8KLXN0YXRpYyBpbnQgbWRjX2luaXRfZWFfc2l6ZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBpbnQgZWFzaXplLAotCQkJICAgIGludCBkZWZfZWFzaXplLCBpbnQgY29va2llc2l6ZSwgaW50IGRlZl9jb29raWVzaXplKQorc3RhdGljIGludCBtZGNfaW5pdF9lYV9zaXplKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHUzMiBlYXNpemUsIHUzMiBkZWZfZWFzaXplLAorCQkJICAgIHUzMiBjb29raWVzaXplLCB1MzIgZGVmX2Nvb2tpZXNpemUpCiB7CiAJc3RydWN0IG9iZF9kZXZpY2UgKm9iZCA9IGV4cC0+ZXhwX29iZDsKIAlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gJm9iZC0+dS5jbGk7CkBAIC0yNDMwLDcgKzI4ODcsNiBAQAogc3RhdGljIHN0cnVjdCBtZF9vcHMgbWRjX21kX29wcyA9IHsKIAkuZ2V0c3RhdHVzCQk9IG1kY19nZXRzdGF0dXMsCiAJLm51bGxfaW5vZGUJCT0gbWRjX251bGxfaW5vZGUsCi0JLmZpbmRfY2JkYXRhCQk9IG1kY19maW5kX2NiZGF0YSwKIAkuY2xvc2UJCQk9IG1kY19jbG9zZSwKIAkuY3JlYXRlCQkJPSBtZGNfY3JlYXRlLAogCS5kb25lX3dyaXRpbmcJCT0gbWRjX2RvbmVfd3JpdGluZywKQEAgLTI0MzksMTMgKzI4OTUsMTIgQEAKIAkuZ2V0YXR0cl9uYW1lCQk9IG1kY19nZXRhdHRyX25hbWUsCiAJLmludGVudF9sb2NrCQk9IG1kY19pbnRlbnRfbG9jaywKIAkubGluawkJCT0gbWRjX2xpbmssCi0JLmlzX3N1YmRpcgkJPSBtZGNfaXNfc3ViZGlyLAogCS5yZW5hbWUJCQk9IG1kY19yZW5hbWUsCiAJLnNldGF0dHIJCT0gbWRjX3NldGF0dHIsCiAJLnNldHhhdHRyCQk9IG1kY19zZXR4YXR0ciwKIAkuZ2V0eGF0dHIJCT0gbWRjX2dldHhhdHRyLAogCS5zeW5jCQkJPSBtZGNfc3luYywKLQkucmVhZHBhZ2UJCT0gbWRjX3JlYWRwYWdlLAorCS5yZWFkX3BhZ2UJCT0gbWRjX3JlYWRfcGFnZSwKIAkudW5saW5rCQkJPSBtZGNfdW5saW5rLAogCS5jYW5jZWxfdW51c2VkCQk9IG1kY19jYW5jZWxfdW51c2VkLAogCS5pbml0X2VhX3NpemUJCT0gbWRjX2luaXRfZWFfc2l6ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21nYy9tZ2NfcmVxdWVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWdjL21nY19yZXF1ZXN0LmMKaW5kZXggOWQwYmQ0Ny4uMjMzNzRjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWdjL21nY19yZXF1ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWdjL21nY19yZXF1ZXN0LmMKQEAgLTU0OSw4ICs1NDksOSBAQAogCQkgKiBjYXVzZWQgdGhlIGxvY2sgcmV2b2NhdGlvbiB0byBmaW5pc2ggaXRzIHNldHVwLCBwbHVzIHNvbWUKIAkJICogcmFuZG9tIHNvIGV2ZXJ5b25lIGRvZXNuJ3QgdHJ5IHRvIHJlY29ubmVjdCBhdCBvbmNlLgogCQkgKi8KLQkJdG8gPSBNR0NfVElNRU9VVF9NSU5fU0VDT05EUyAqIEhaOwotCQl0byArPSByYW5kICogSFogLyAxMDA7IC8qIHJhbmQgaXMgY2VudGktc2Vjb25kcyAqLworCQl0byA9IG1zZWNzX3RvX2ppZmZpZXMoTUdDX1RJTUVPVVRfTUlOX1NFQ09ORFMgKiBNU0VDX1BFUl9TRUMpOworCQkvKiByYW5kIGlzIGNlbnRpLXNlY29uZHMgKi8KKwkJdG8gKz0gbXNlY3NfdG9famlmZmllcyhyYW5kICogTVNFQ19QRVJfU0VDIC8gMTAwKTsKIAkJbHdpID0gTFdJX1RJTUVPVVQodG8sIE5VTEwsIE5VTEwpOwogCQlsX3dhaXRfZXZlbnQocnFfd2FpdHEsIHJxX3N0YXRlICYgKFJRX1NUT1AgfCBSUV9QUkVDTEVBTlVQKSwKIAkJCSAgICAgJmx3aSk7CkBAIC0xMTU4LDcgKzExNTksNyBAQAogCiAJd2hpbGUgKGRhdGFsZW4gPiAwKSB7CiAJCWludCAgIGVudHJ5X2xlbiA9IHNpemVvZigqZW50cnkpOwotCQlpbnQgICBpc19vc3Q7CisJCWludCBpc19vc3QsIGk7CiAJCXN0cnVjdCBvYmRfZGV2aWNlICpvYmQ7CiAJCWNoYXIgKm9iZG5hbWU7CiAJCWNoYXIgKmNuYW1lOwpAQCAtMTI2NCwxMSArMTI2NSwxNyBAQAogCQkJY29udGludWU7CiAJCX0KIAotCQkvKiBUT0RPOiBpdGVyYXRlIGFsbCBuaWRzIHRvIGZpbmQgb25lICovCisJCS8qIGl0ZXJhdGUgYWxsIG5pZHMgdG8gZmluZCBvbmUgKi8KIAkJLyogZmluZCB1dWlkIGJ5IG5pZCAqLwotCQlyYyA9IGNsaWVudF9pbXBvcnRfZmluZF9jb25uKG9iZC0+dS5jbGkuY2xfaW1wb3J0LAotCQkJCQkgICAgIGVudHJ5LT51Lm5pZHNbMF0sCi0JCQkJCSAgICAgKHN0cnVjdCBvYmRfdXVpZCAqKXV1aWQpOworCQlyYyA9IC1FTk9FTlQ7CisJCWZvciAoaSA9IDA7IGkgPCBlbnRyeS0+bW5lX25pZF9jb3VudDsgaSsrKSB7CisJCQlyYyA9IGNsaWVudF9pbXBvcnRfZmluZF9jb25uKG9iZC0+dS5jbGkuY2xfaW1wb3J0LAorCQkJCQkJICAgICBlbnRyeS0+dS5uaWRzWzBdLAorCQkJCQkJICAgICAoc3RydWN0IG9iZF91dWlkICopdXVpZCk7CisJCQlpZiAoIXJjKQorCQkJCWJyZWFrOworCQl9CisKIAkJdXBfcmVhZCgmb2JkLT51LmNsaS5jbF9zZW0pOwogCQlpZiAocmMgPCAwKSB7CiAJCQlDRVJST1IoIm1nYzogY2Fubm90IGZpbmQgdXVpZCBieSBuaWQgJXNcbiIsCkBAIC0xNDI4LDE0ICsxNDM1LDEyIEBACiAJfQogCiAJbW5lX3N3YWIgPSAhIXB0bHJwY19yZXBfbmVlZF9zd2FiKHJlcSk7Ci0jaWYgTFVTVFJFX1ZFUlNJT05fQ09ERSA8IE9CRF9PQ0RfVkVSU0lPTigzLCAyLCA1MCwgMCkKKyNpZiBPQkRfT0NEX1ZFUlNJT04oMywgMCwgNTMsIDApID4gTFVTVFJFX1ZFUlNJT05fQ09ERQogCS8qIFRoaXMgaW1wb3J0IGZsYWcgbWVhbnMgdGhlIHNlcnZlciBkaWQgYW4gZXh0cmEgc3dhYiBvZiBJUiBNTkUKIAkgKiByZWNvcmRzIChmaXhlZCBpbiBMVS0xMjUyKSwgcmV2ZXJzZSBpdCBoZXJlIGlmIG5lZWRlZC4gTFUtMTY0NAogCSAqLwogCWlmICh1bmxpa2VseShyZXEtPnJxX2ltcG9ydC0+aW1wX25lZWRfbW5lX3N3YWIpKQogCQltbmVfc3dhYiA9ICFtbmVfc3dhYjsKLSNlbHNlCi0jd2FybmluZyAiTFUtMTY0NDogUmVtb3ZlIG9sZCBPQkRfQ09OTkVDVF9NTkVfU1dBQiBmaXh1cCBhbmQgaW1wX25lZWRfbW5lX3N3YWIiCiAjZW5kaWYKIAogCWZvciAoaSA9IDA7IGkgPCBucnBhZ2VzICYmIGVhbGVuID4gMDsgaSsrKSB7CkBAIC0xNzQwLDggKzE3NDUsNiBAQAogCS5kZWxfY29ubiAgICAgICA9IGNsaWVudF9pbXBvcnRfZGVsX2Nvbm4sCiAJLmNvbm5lY3QgICAgICAgID0gY2xpZW50X2Nvbm5lY3RfaW1wb3J0LAogCS5kaXNjb25uZWN0ICAgICA9IGNsaWVudF9kaXNjb25uZWN0X2V4cG9ydCwKLQkvKiAuZW5xdWV1ZSAgICAgPSBtZ2NfZW5xdWV1ZSwgKi8KLQkvKiAuaW9jb250cm9sICAgPSBtZ2NfaW9jb250cm9sLCAqLwogCS5zZXRfaW5mb19hc3luYyA9IG1nY19zZXRfaW5mb19hc3luYywKIAkuZ2V0X2luZm8gICAgICAgPSBtZ2NfZ2V0X2luZm8sCiAJLmltcG9ydF9ldmVudCAgID0gbWdjX2ltcG9ydF9ldmVudCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvTWFrZWZpbGUKaW5kZXggZGY3ZTQ3Zi4uYjQyZTEwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvTWFrZWZpbGUKQEAgLTMsNiArMyw2IEBACiBvYmRjbGFzcy15IDo9IGxpbnV4L2xpbnV4LW1vZHVsZS5vIGxpbnV4L2xpbnV4LW9iZG8ubyBsaW51eC9saW51eC1zeXNjdGwubyBcCiAJICAgICAgbGxvZy5vIGxsb2dfY2F0Lm8gbGxvZ19vYmQubyBsbG9nX3N3YWIubyBjbGFzc19vYmQubyBkZWJ1Zy5vIFwKIAkgICAgICBnZW5vcHMubyB1dWlkLm8gbHByb2Nmc19zdGF0dXMubyBscHJvY2ZzX2NvdW50ZXJzLm8gXAotCSAgICAgIGx1c3RyZV9oYW5kbGVzLm8gbHVzdHJlX3BlZXIubyBzdGF0ZnNfcGFjay5vIFwKKwkgICAgICBsdXN0cmVfaGFuZGxlcy5vIGx1c3RyZV9wZWVyLm8gc3RhdGZzX3BhY2subyBsaW5rZWEubyBcCiAJICAgICAgb2Jkby5vIG9iZF9jb25maWcubyBvYmRfbW91bnQubyBsdV9vYmplY3QubyBsdV9yZWYubyBcCiAJICAgICAgY2xfb2JqZWN0Lm8gY2xfcGFnZS5vIGNsX2xvY2subyBjbF9pby5vIGtlcm5lbGNvbW0ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xfaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsX2lvLmMKaW5kZXggZTcyZjFmYy4uYmM0YjdiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xfaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbF9pby5jCkBAIC03Myw3ICs3Myw2IEBACiB7CiAJcmV0dXJuIGNsX2Vudl9pbmZvKGVudiktPmNsdF9jdXJyZW50X2lvICE9IE5VTEw7CiB9Ci1FWFBPUlRfU1lNQk9MKGNsX2lvX2lzX2dvaW5nKTsKIAogLyoqCiAgKiBjbF9pbyBpbnZhcmlhbnQgdGhhdCBob2xkcyBhdCBhbGwgdGltZXMgd2hlbiBleHBvcnRlZCBjbF9pb18qKCkgZnVuY3Rpb25zCkBAIC04NTksOSArODU4LDYgQEAKIAlMQVNTRVJUKHBhZ2UtPmNwX293bmVyKTsKIAlMSU5WUk5UKHBsaXN0LT5wbF9vd25lciA9PSBjdXJyZW50KTsKIAotCWxvY2tkZXBfb2ZmKCk7Ci0JbXV0ZXhfbG9jaygmcGFnZS0+Y3BfbXV0ZXgpOwotCWxvY2tkZXBfb24oKTsKIAlMQVNTRVJUKGxpc3RfZW1wdHkoJnBhZ2UtPmNwX2JhdGNoKSk7CiAJbGlzdF9hZGRfdGFpbCgmcGFnZS0+Y3BfYmF0Y2gsICZwbGlzdC0+cGxfcGFnZXMpOwogCSsrcGxpc3QtPnBsX25yOwpAQCAtODc3LDEyICs4NzMsMTAgQEAKIAkJICAgICAgc3RydWN0IGNsX3BhZ2UgKnBhZ2UpCiB7CiAJTEFTU0VSVChwbGlzdC0+cGxfbnIgPiAwKTsKKwlMQVNTRVJUKGNsX3BhZ2VfaXNfdm1sb2NrZWQoZW52LCBwYWdlKSk7CiAJTElOVlJOVChwbGlzdC0+cGxfb3duZXIgPT0gY3VycmVudCk7CiAKIAlsaXN0X2RlbF9pbml0KCZwYWdlLT5jcF9iYXRjaCk7Ci0JbG9ja2RlcF9vZmYoKTsKLQltdXRleF91bmxvY2soJnBhZ2UtPmNwX211dGV4KTsKLQlsb2NrZGVwX29uKCk7CiAJLS1wbGlzdC0+cGxfbnI7CiAJbHVfcmVmX2RlbF9hdCgmcGFnZS0+Y3BfcmVmZXJlbmNlLCAmcGFnZS0+Y3BfcXVldWVfcmVmLCAicXVldWUiLCBwbGlzdCk7CiAJY2xfcGFnZV9wdXQoZW52LCBwYWdlKTsKQEAgLTk0MSw4ICs5MzUsNiBAQAogfQogRVhQT1JUX1NZTUJPTChjbF9wYWdlX2xpc3Rfc3BsaWNlKTsKIAotdm9pZCBjbF9wYWdlX2Rpc293bjAoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LAotCQkgICAgIHN0cnVjdCBjbF9pbyAqaW8sIHN0cnVjdCBjbF9wYWdlICpwZyk7CiAKIC8qKgogICogRGlzb3ducyBwYWdlcyBpbiBhIHF1ZXVlLgpAQCAtOTU5LDkgKzk1MSw2IEBACiAJCUxBU1NFUlQocGxpc3QtPnBsX25yID4gMCk7CiAKIAkJbGlzdF9kZWxfaW5pdCgmcGFnZS0+Y3BfYmF0Y2gpOwotCQlsb2NrZGVwX29mZigpOwotCQltdXRleF91bmxvY2soJnBhZ2UtPmNwX211dGV4KTsKLQkJbG9ja2RlcF9vbigpOwogCQktLXBsaXN0LT5wbF9ucjsKIAkJLyoKIAkJICogY2xfcGFnZV9kaXNvd24wIHJhdGhlciB0aGFuIHVzdWFsIGNsX3BhZ2VfZGlzb3duKCkgaXMgdXNlZCwKQEAgLTEyMjEsNyArMTIxMCw3IEBACiB7CiAJc3RydWN0IGNsX29iamVjdCAgKm9iajsKIAlzdHJ1Y3QgY2xfcmVxX29iaiAqcnFvOwotCWludCBpOworCXVuc2lnbmVkIGludCBpOwogCiAJTEFTU0VSVChsaXN0X2VtcHR5KCZwYWdlLT5jcF9mbGlnaHQpKTsKIAlMQVNTRVJUKCFwYWdlLT5jcF9yZXEpOwpAQCAtMTI2OCw3ICsxMjU3LDcgQEAKICAqLwogaW50IGNsX3JlcV9wcmVwKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsX3JlcSAqcmVxKQogewotCWludCBpOworCXVuc2lnbmVkIGludCBpOwogCWludCByZXN1bHQ7CiAJY29uc3Qgc3RydWN0IGNsX3JlcV9zbGljZSAqc2xpY2U7CiAKQEAgLTEzMDEsNyArMTI5MCw3IEBACiB7CiAJY29uc3Qgc3RydWN0IGNsX3JlcV9zbGljZSAqc2xpY2U7CiAJc3RydWN0IGNsX3BhZ2UJICAgICpwYWdlOwotCWludCBpOworCXVuc2lnbmVkIGludCBpOwogCiAJTEFTU0VSVCghbGlzdF9lbXB0eSgmcmVxLT5jcnFfcGFnZXMpKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xfb2JqZWN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbF9vYmplY3QuYwppbmRleCA5MWE1ODA2Li4zMTk5ZGQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbF9vYmplY3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbF9vYmplY3QuYwpAQCAtMTYzLDcgKzE2Myw3IEBACiAgKgogICogUHJldmVudHMgZGF0YS1hdHRyaWJ1dGVzIGZyb20gY2hhbmdpbmcsIHVudGlsIGxvY2sgaXMgcmVsZWFzZWQgYnkKICAqIGNsX29iamVjdF9hdHRyX3VubG9jaygpLiBUaGlzIGhhcyB0byBiZSBjYWxsZWQgYmVmb3JlIGNhbGxzIHRvCi0gKiBjbF9vYmplY3RfYXR0cl9nZXQoKSwgY2xfb2JqZWN0X2F0dHJfc2V0KCkuCisgKiBjbF9vYmplY3RfYXR0cl9nZXQoKSwgY2xfb2JqZWN0X2F0dHJfdXBkYXRlKCkuCiAgKi8KIHZvaWQgY2xfb2JqZWN0X2F0dHJfbG9jayhzdHJ1Y3QgY2xfb2JqZWN0ICpvKQogCV9fYWNxdWlyZXMoY2xfb2JqZWN0X2F0dHJfZ3VhcmQobykpCkBAIC0yMTcsMTEgKzIxNywxMSBAQAogICogVXBkYXRlcyBkYXRhLWF0dHJpYnV0ZXMgb2YgYW4gb2JqZWN0IFxhIG9iai4KICAqCiAgKiBPbmx5IGF0dHJpYnV0ZXMsIG1lbnRpb25lZCBpbiBhIHZhbGlkbmVzcyBiaXQtbWFzayBcYSB2IGFyZQotICogdXBkYXRlZC4gQ2FsbHMgY2xfb2JqZWN0X29wZXJhdGlvbnM6OmNvb19hdHRyX3NldCgpIG9uIGV2ZXJ5IGxheWVyLCBib3R0b20KLSAqIHRvIHRvcC4KKyAqIHVwZGF0ZWQuIENhbGxzIGNsX29iamVjdF9vcGVyYXRpb25zOjpjb29fYXR0cl91cGRhdGUoKSBvbiBldmVyeSBsYXllciwKKyAqIGJvdHRvbSB0byB0b3AuCiAgKi8KLWludCBjbF9vYmplY3RfYXR0cl9zZXQoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmosCi0JCSAgICAgICBjb25zdCBzdHJ1Y3QgY2xfYXR0ciAqYXR0ciwgdW5zaWduZWQgdikKK2ludCBjbF9vYmplY3RfYXR0cl91cGRhdGUoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmosCisJCQkgIGNvbnN0IHN0cnVjdCBjbF9hdHRyICphdHRyLCB1bnNpZ25lZCBpbnQgdikKIHsKIAlzdHJ1Y3QgbHVfb2JqZWN0X2hlYWRlciAqdG9wOwogCWludCByZXN1bHQ7CkBAIC0yMzEsOCArMjMxLDkgQEAKIAl0b3AgPSBvYmotPmNvX2x1LmxvX2hlYWRlcjsKIAlyZXN1bHQgPSAwOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShvYmosICZ0b3AtPmxvaF9sYXllcnMsIGNvX2x1LmxvX2xpbmthZ2UpIHsKLQkJaWYgKG9iai0+Y29fb3BzLT5jb29fYXR0cl9zZXQpIHsKLQkJCXJlc3VsdCA9IG9iai0+Y29fb3BzLT5jb29fYXR0cl9zZXQoZW52LCBvYmosIGF0dHIsIHYpOworCQlpZiAob2JqLT5jb19vcHMtPmNvb19hdHRyX3VwZGF0ZSkgeworCQkJcmVzdWx0ID0gb2JqLT5jb19vcHMtPmNvb19hdHRyX3VwZGF0ZShlbnYsIG9iaiwgYXR0ciwKKwkJCQkJCQkgICAgICB2KTsKIAkJCWlmIChyZXN1bHQgIT0gMCkgewogCQkJCWlmIChyZXN1bHQgPiAwKQogCQkJCQlyZXN1bHQgPSAwOwpAQCAtMjQyLDcgKzI0Myw3IEBACiAJfQogCXJldHVybiByZXN1bHQ7CiB9Ci1FWFBPUlRfU1lNQk9MKGNsX29iamVjdF9hdHRyX3NldCk7CitFWFBPUlRfU1lNQk9MKGNsX29iamVjdF9hdHRyX3VwZGF0ZSk7CiAKIC8qKgogICogTm90aWZpZXMgbGF5ZXJzIChib3R0b20tdG8tdG9wKSB0aGF0IGdsaW1wc2UgQVNUIHdhcyByZWNlaXZlZC4KQEAgLTMyMSw2ICszMjIsMjcgQEAKIEVYUE9SVF9TWU1CT0woY2xfb2JqZWN0X3BydW5lKTsKIAogLyoqCisgKiBHZXQgc3RyaXBlIGluZm9ybWF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICovCitpbnQgY2xfb2JqZWN0X2dldHN0cmlwZShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBjbF9vYmplY3QgKm9iaiwKKwkJCXN0cnVjdCBsb3ZfdXNlcl9tZCBfX3VzZXIgKnVhcmcpCit7CisJc3RydWN0IGx1X29iamVjdF9oZWFkZXIgKnRvcDsKKwlpbnQgcmVzdWx0ID0gMDsKKworCXRvcCA9IG9iai0+Y29fbHUubG9faGVhZGVyOworCWxpc3RfZm9yX2VhY2hfZW50cnkob2JqLCAmdG9wLT5sb2hfbGF5ZXJzLCBjb19sdS5sb19saW5rYWdlKSB7CisJCWlmIChvYmotPmNvX29wcy0+Y29vX2dldHN0cmlwZSkgeworCQkJcmVzdWx0ID0gb2JqLT5jb19vcHMtPmNvb19nZXRzdHJpcGUoZW52LCBvYmosIHVhcmcpOworCQkJaWYgKHJlc3VsdCkKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXN1bHQ7Cit9CitFWFBPUlRfU1lNQk9MKGNsX29iamVjdF9nZXRzdHJpcGUpOworCisvKioKICAqIEhlbHBlciBmdW5jdGlvbiByZW1vdmluZyBhbGwgb2JqZWN0IGxvY2tzLCBhbmQgbWFya2luZyBvYmplY3QgZm9yCiAgKiBkZWxldGlvbi4gQWxsIG9iamVjdCBwYWdlcyBtdXN0IGhhdmUgYmVlbiBkZWxldGVkIGF0IHRoaXMgcG9pbnQuCiAgKgpAQCAtMzc3LDcgKzM5OSw3IEBACiAgKi8KIGludCBjbF9zaXRlX2luaXQoc3RydWN0IGNsX3NpdGUgKnMsIHN0cnVjdCBjbF9kZXZpY2UgKmQpCiB7Ci0JaW50IGk7CisJc2l6ZV90IGk7CiAJaW50IHJlc3VsdDsKIAogCXJlc3VsdCA9IGx1X3NpdGVfaW5pdCgmcy0+Y3NfbHUsICZkLT5jZF9sdV9kZXYpOwpAQCAtNDExLDcgKzQzMyw3IEBACiAgKi8KIGludCBjbF9zaXRlX3N0YXRzX3ByaW50KGNvbnN0IHN0cnVjdCBjbF9zaXRlICpzaXRlLCBzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCiB7Ci0JaW50IGk7CisJc2l6ZV90IGk7CiAJc3RhdGljIGNvbnN0IGNoYXIgKnBzdGF0ZVtdID0gewogCQlbQ1BTX0NBQ0hFRF0gID0gImMiLAogCQlbQ1BTX09XTkVEXSAgID0gIm8iLApAQCAtMTAwMCw3ICsxMDIyLDcgQEAKIAkJICogdGh1cyB3ZSBtdXN0IHVuaW5pdGlhbGl6ZSB1cCB0byBpLCB0aGUgcmVzdCBhcmUgdW5kZWZpbmVkLgogCQkgKi8KIAkJZm9yIChqID0gMDsgaiA8IGk7IGorKykgewotCQkJY2xlID0gJmNsX2Vudl9wZXJjcHVbaV07CisJCQljbGUgPSAmY2xfZW52X3BlcmNwdVtqXTsKIAkJCWx1X2NvbnRleHRfZXhpdCgmY2xlLT5jZV9zZXMpOwogCQkJbHVfY29udGV4dF9maW5pKCZjbGUtPmNlX3Nlcyk7CiAJCQlsdV9lbnZfZmluaSgmY2xlLT5jZV9sdSk7CkBAIC0xMTI2LDcgKzExNDgsNyBAQAogCiAJaW5mbyA9IGNsMF9rZXlfaW5pdChjdHgsIGtleSk7CiAJaWYgKCFJU19FUlIoaW5mbykpIHsKLQkJaW50IGk7CisJCXNpemVfdCBpOwogCiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGluZm8tPmNsdF9jb3VudGVycyk7ICsraSkKIAkJCWx1X3JlZl9pbml0KCZpbmZvLT5jbHRfY291bnRlcnNbaV0uY3RjX2xvY2tzX2xvY2tlZCk7CkBAIC0xMTM4LDcgKzExNjAsNyBAQAogCQkJc3RydWN0IGx1X2NvbnRleHRfa2V5ICprZXksIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGNsX3RocmVhZF9pbmZvICppbmZvOwotCWludCBpOworCXNpemVfdCBpOwogCiAJaW5mbyA9IGRhdGE7CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW5mby0+Y2x0X2NvdW50ZXJzKTsgKytpKQpAQCAtMTE1MCw3ICsxMTcyLDcgQEAKIAkJCXN0cnVjdCBsdV9jb250ZXh0X2tleSAqa2V5LCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBjbF90aHJlYWRfaW5mbyAqaW5mbyA9IGRhdGE7Ci0JaW50IGk7CisJc2l6ZV90IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpbmZvLT5jbHRfY291bnRlcnMpOyArK2kpIHsKIAkJTEFTU0VSVChpbmZvLT5jbHRfY291bnRlcnNbaV0uY3RjX25yX2hlbGQgPT0gMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbF9wYWdlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbF9wYWdlLmMKaW5kZXggZGIyZGM2Yi4uNjM5NzNiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xfcGFnZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsX3BhZ2UuYwpAQCAtMTUxLDcgKzE1MSw2IEBACiAJCUlOSVRfTElTVF9IRUFEKCZwYWdlLT5jcF9sYXllcnMpOwogCQlJTklUX0xJU1RfSEVBRCgmcGFnZS0+Y3BfYmF0Y2gpOwogCQlJTklUX0xJU1RfSEVBRCgmcGFnZS0+Y3BfZmxpZ2h0KTsKLQkJbXV0ZXhfaW5pdCgmcGFnZS0+Y3BfbXV0ZXgpOwogCQlsdV9yZWZfaW5pdCgmcGFnZS0+Y3BfcmVmZXJlbmNlKTsKIAkJaGVhZCA9IG8tPmNvX2x1LmxvX2hlYWRlcjsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShvLCAmaGVhZC0+bG9oX2xheWVycywgY29fbHUubG9fbGlua2FnZSkgewpAQCAtMTcxLDcgKzE3MCw2IEBACiAJfQogCXJldHVybiBwYWdlOwogfQotRVhQT1JUX1NZTUJPTChjbF9wYWdlX2FsbG9jKTsKIAogLyoqCiAgKiBSZXR1cm5zIGEgY2xfcGFnZSB3aXRoIGluZGV4IFxhIGlkeCBhdCB0aGUgb2JqZWN0IFxhIG8sIGFuZCBhc3NvY2lhdGVkIHdpdGgKQEAgLTIyOSwxMSArMjI3LDYgQEAKIAogc3RhdGljIGlubGluZSBpbnQgY2xfcGFnZV9pbnZhcmlhbnQoY29uc3Qgc3RydWN0IGNsX3BhZ2UgKnBnKQogewotCS8qCi0JICogUGFnZSBpbnZhcmlhbnQgaXMgcHJvdGVjdGVkIGJ5IGEgVk0gbG9jay4KLQkgKi8KLQlMSU5WUk5UKGNsX3BhZ2VfaXNfdm1sb2NrZWQoTlVMTCwgcGcpKTsKLQogCXJldHVybiBjbF9wYWdlX2luX3VzZV9ub3JlZihwZyk7CiB9CiAKQEAgLTQ3OCw3ICs0NzEsNiBAQAogCQlMQVNTRVJUKHBhZ2UtPmNwX293bmVyLT5jaV9vd25lZF9uciA+IDApOwogCQlwYWdlLT5jcF9vd25lci0+Y2lfb3duZWRfbnItLTsKIAkJcGFnZS0+Y3Bfb3duZXIgPSBOVUxMOwotCQlwYWdlLT5jcF90YXNrID0gTlVMTDsKIAl9CiB9CiAKQEAgLTU2Miw3ICs1NTQsNiBAQAogCQkJUEFTU0VSVChlbnYsIHBnLCAhcGctPmNwX293bmVyKTsKIAkJCVBBU1NFUlQoZW52LCBwZywgIXBnLT5jcF9yZXEpOwogCQkJcGctPmNwX293bmVyID0gY2xfaW9fdG9wKGlvKTsKLQkJCXBnLT5jcF90YXNrICA9IGN1cnJlbnQ7CiAJCQljbF9wYWdlX293bmVyX3NldChwZyk7CiAJCQlpZiAocGctPmNwX3N0YXRlICE9IENQU19GUkVFSU5HKSB7CiAJCQkJY2xfcGFnZV9zdGF0ZV9zZXQoZW52LCBwZywgQ1BTX09XTkVEKTsKQEAgLTYxOSw3ICs2MTAsNiBAQAogCWNsX3BhZ2VfaW52b2lkKGVudiwgaW8sIHBnLCBDTF9QQUdFX09QKGNwb19hc3N1bWUpKTsKIAlQQVNTRVJUKGVudiwgcGcsICFwZy0+Y3Bfb3duZXIpOwogCXBnLT5jcF9vd25lciA9IGNsX2lvX3RvcChpbyk7Ci0JcGctPmNwX3Rhc2sgPSBjdXJyZW50OwogCWNsX3BhZ2Vfb3duZXJfc2V0KHBnKTsKIAljbF9wYWdlX3N0YXRlX3NldChlbnYsIHBnLCBDUFNfT1dORUQpOwogfQpAQCAtODYwLDEwICs4NTAsNiBAQAogCVBBU1NFUlQoZW52LCBwZywgcGctPmNwX3N0YXRlID09IGNsX3JlcV90eXBlX3N0YXRlKGNydCkpOwogCiAJQ0xfUEFHRV9IRUFERVIoRF9UUkFDRSwgZW52LCBwZywgIiVkICVkXG4iLCBjcnQsIGlvcmV0KTsKLQlpZiAoY3J0ID09IENSVF9SRUFEICYmIGlvcmV0ID09IDApIHsKLQkJUEFTU0VSVChlbnYsIHBnLCAhKHBnLT5jcF9mbGFncyAmIENQRl9SRUFEX0NPTVBMRVRFRCkpOwotCQlwZy0+Y3BfZmxhZ3MgfD0gQ1BGX1JFQURfQ09NUExFVEVEOwotCX0KIAogCWNsX3BhZ2Vfc3RhdGVfc2V0KGVudiwgcGcsIENQU19DQUNIRUQpOwogCWlmIChjcnQgPj0gQ1JUX05SKQpAQCAtODcyLDcgKzg1OCw2IEBACiAJCQkgICAgICAgKGNvbnN0IHN0cnVjdCBsdV9lbnYgKiwKIAkJCQljb25zdCBzdHJ1Y3QgY2xfcGFnZV9zbGljZSAqLCBpbnQpLCBpb3JldCk7CiAJaWYgKGFuY2hvcikgewotCQlMQVNTRVJUKGNsX3BhZ2VfaXNfdm1sb2NrZWQoZW52LCBwZykpOwogCQlMQVNTRVJUKHBnLT5jcF9zeW5jX2lvID09IGFuY2hvcik7CiAJCXBnLT5jcF9zeW5jX2lvID0gTlVMTDsKIAl9CkBAIC05ODksMTAgKzk3NCwxMCBAQAogCQkJICBsdV9wcmludGVyX3QgcHJpbnRlciwgY29uc3Qgc3RydWN0IGNsX3BhZ2UgKnBnKQogewogCSgqcHJpbnRlcikoZW52LCBjb29raWUsCi0JCSAgICJwYWdlQCVwWyVkICVwICVkICVkICVkICVwICVwICUjeF1cbiIsCisJCSAgICJwYWdlQCVwWyVkICVwICVkICVkICVwICVwXVxuIiwKIAkJICAgcGcsIGF0b21pY19yZWFkKCZwZy0+Y3BfcmVmKSwgcGctPmNwX29iaiwKLQkJICAgcGctPmNwX3N0YXRlLCBwZy0+Y3BfZXJyb3IsIHBnLT5jcF90eXBlLAotCQkgICBwZy0+Y3Bfb3duZXIsIHBnLT5jcF9yZXEsIHBnLT5jcF9mbGFncyk7CisJCSAgIHBnLT5jcF9zdGF0ZSwgcGctPmNwX3R5cGUsCisJCSAgIHBnLT5jcF9vd25lciwgcGctPmNwX3JlcSk7CiB9CiBFWFBPUlRfU1lNQk9MKGNsX3BhZ2VfaGVhZGVyX3ByaW50KTsKIApAQCAtMTAyMCw3ICsxMDA1LDYgQEAKIAkJCSAgICAgIChjb25zdCBzdHJ1Y3QgbHVfZW52ICosCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IGNsX3BhZ2Vfc2xpY2UgKikpOwogfQotRVhQT1JUX1NZTUJPTChjbF9wYWdlX2NhbmNlbCk7CiAKIC8qKgogICogQ29udmVydHMgYSBieXRlIG9mZnNldCB3aXRoaW4gb2JqZWN0IFxhIG9iaiBpbnRvIGEgcGFnZSBpbmRleC4KQEAgLTEwNDYsOSArMTAzMCw5IEBACiB9CiBFWFBPUlRfU1lNQk9MKGNsX2luZGV4KTsKIAotaW50IGNsX3BhZ2Vfc2l6ZShjb25zdCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmopCitzaXplX3QgY2xfcGFnZV9zaXplKGNvbnN0IHN0cnVjdCBjbF9vYmplY3QgKm9iaikKIHsKLQlyZXR1cm4gMSA8PCBQQUdFX1NISUZUOworCXJldHVybiAxVUwgPDwgUEFHRV9TSElGVDsKIH0KIEVYUE9SVF9TWU1CT0woY2xfcGFnZV9zaXplKTsKIApAQCAtMTA4NywxMSArMTA3MSwxMSBAQAogCS8qIEluaXRpYWxpemUgY2FjaGUgZGF0YSAqLwogCWF0b21pY19zZXQoJmNhY2hlLT5jY2NfdXNlcnMsIDEpOwogCWNhY2hlLT5jY2NfbHJ1X21heCA9IGxydV9wYWdlX21heDsKLQlhdG9taWNfc2V0KCZjYWNoZS0+Y2NjX2xydV9sZWZ0LCBscnVfcGFnZV9tYXgpOworCWF0b21pY19sb25nX3NldCgmY2FjaGUtPmNjY19scnVfbGVmdCwgbHJ1X3BhZ2VfbWF4KTsKIAlzcGluX2xvY2tfaW5pdCgmY2FjaGUtPmNjY19scnVfbG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJmNhY2hlLT5jY2NfbHJ1KTsKIAotCWF0b21pY19zZXQoJmNhY2hlLT5jY2NfdW5zdGFibGVfbnIsIDApOworCWF0b21pY19sb25nX3NldCgmY2FjaGUtPmNjY191bnN0YWJsZV9uciwgMCk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmY2FjaGUtPmNjY191bnN0YWJsZV93YWl0cSk7CiAKIAlyZXR1cm4gY2FjaGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbGFzc19vYmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsYXNzX29iZC5jCmluZGV4IGQ5ZDJhMTkuLjc2ZTFlZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsYXNzX29iZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsYXNzX29iZC5jCkBAIC00MCwxMCArNDAsMTAgQEAKICNpbmNsdWRlICIuLi9pbmNsdWRlL2xwcm9jZnNfc3RhdHVzLmgiCiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvY2xfb2JqZWN0LmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmUvbHVzdHJlX2lvY3RsLmgiCiAjaW5jbHVkZSAibGxvZ19pbnRlcm5hbC5oIgogCiBzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkX2RldnNbTUFYX09CRF9ERVZJQ0VTXTsKLUVYUE9SVF9TWU1CT0wob2JkX2RldnMpOwogc3RydWN0IGxpc3RfaGVhZCBvYmRfdHlwZXM7CiBERUZJTkVfUldMT0NLKG9iZF9kZXZfbG9jayk7CiAKQEAgLTU0LDExICs1NCw5IEBACiBFWFBPUlRfU1lNQk9MKG9iZF9kdW1wX29uX3RpbWVvdXQpOwogdW5zaWduZWQgaW50IG9iZF9kdW1wX29uX2V2aWN0aW9uOwogRVhQT1JUX1NZTUJPTChvYmRfZHVtcF9vbl9ldmljdGlvbik7Ci11bnNpZ25lZCBpbnQgb2JkX21heF9kaXJ0eV9wYWdlcyA9IDI1NjsKK3Vuc2lnbmVkIGxvbmcgb2JkX21heF9kaXJ0eV9wYWdlczsKIEVYUE9SVF9TWU1CT0wob2JkX21heF9kaXJ0eV9wYWdlcyk7Ci1hdG9taWNfdCBvYmRfdW5zdGFibGVfcGFnZXM7Ci1FWFBPUlRfU1lNQk9MKG9iZF91bnN0YWJsZV9wYWdlcyk7Ci1hdG9taWNfdCBvYmRfZGlydHlfcGFnZXM7CithdG9taWNfbG9uZ190IG9iZF9kaXJ0eV9wYWdlczsKIEVYUE9SVF9TWU1CT0wob2JkX2RpcnR5X3BhZ2VzKTsKIHVuc2lnbmVkIGludCBvYmRfdGltZW91dCA9IE9CRF9USU1FT1VUX0RFRkFVTFQ7ICAgLyogc2Vjb25kcyAqLwogRVhQT1JUX1NZTUJPTChvYmRfdGltZW91dCk7CkBAIC03NiwxMyArNzQsMTEgQEAKIGludCBhdF9leHRyYSA9IDMwOwogRVhQT1JUX1NZTUJPTChhdF9leHRyYSk7CiAKLWF0b21pY190IG9iZF9kaXJ0eV90cmFuc2l0X3BhZ2VzOworYXRvbWljX2xvbmdfdCBvYmRfZGlydHlfdHJhbnNpdF9wYWdlczsKIEVYUE9SVF9TWU1CT0wob2JkX2RpcnR5X3RyYW5zaXRfcGFnZXMpOwogCiBjaGFyIG9iZF9qb2JpZF92YXJbSk9CU1RBVFNfSk9CSURfVkFSX01BWF9MRU4gKyAxXSA9IEpPQlNUQVRTX0RJU0FCTEU7Ci1FWFBPUlRfU1lNQk9MKG9iZF9qb2JpZF92YXIpOwotCi1jaGFyIG9iZF9qb2JpZF9ub2RlW0pPQlNUQVRTX0pPQklEX1NJWkUgKyAxXTsKK2NoYXIgb2JkX2pvYmlkX25vZGVbTFVTVFJFX0pPQklEX1NJWkUgKyAxXTsKIAogLyogR2V0IGpvYmlkIG9mIGN1cnJlbnQgcHJvY2VzcyBmcm9tIHN0b3JlZCB2YXJpYWJsZSBvciBjYWxjdWxhdGUKICAqIGl0IGZyb20gcGlkIGFuZCB1c2VyX2lkLgpAQCAtOTMsMTQgKzg5LDE0IEBACiAgKi8KIGludCBsdXN0cmVfZ2V0X2pvYmlkKGNoYXIgKmpvYmlkKQogewotCW1lbXNldChqb2JpZCwgMCwgSk9CU1RBVFNfSk9CSURfU0laRSk7CisJbWVtc2V0KGpvYmlkLCAwLCBMVVNUUkVfSk9CSURfU0laRSk7CiAJLyogSm9ic3RhdHMgaXNuJ3QgZW5hYmxlZCAqLwogCWlmIChzdHJjbXAob2JkX2pvYmlkX3ZhciwgSk9CU1RBVFNfRElTQUJMRSkgPT0gMCkKIAkJcmV0dXJuIDA7CiAKIAkvKiBVc2UgcHJvY2VzcyBuYW1lICsgZnN1aWQgYXMgam9iaWQgKi8KIAlpZiAoc3RyY21wKG9iZF9qb2JpZF92YXIsIEpPQlNUQVRTX1BST0NOQU1FX1VJRCkgPT0gMCkgewotCQlzbnByaW50Zihqb2JpZCwgSk9CU1RBVFNfSk9CSURfU0laRSwgIiVzLiV1IiwKKwkJc25wcmludGYoam9iaWQsIExVU1RSRV9KT0JJRF9TSVpFLCAiJXMuJXUiLAogCQkJIGN1cnJlbnRfY29tbSgpLAogCQkJIGZyb21fa3VpZCgmaW5pdF91c2VyX25zLCBjdXJyZW50X2ZzdWlkKCkpKTsKIAkJcmV0dXJuIDA7CkBAIC0xMTYsMTkgKzExMiw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGx1c3RyZV9nZXRfam9iaWQpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgb2JkX2RhdGEyY29ubihzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAqY29ubiwKLQkJCQkgc3RydWN0IG9iZF9pb2N0bF9kYXRhICpkYXRhKQotewotCW1lbXNldChjb25uLCAwLCBzaXplb2YoKmNvbm4pKTsKLQljb25uLT5jb29raWUgPSBkYXRhLT5pb2NfY29va2llOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgb2JkX2Nvbm4yZGF0YShzdHJ1Y3Qgb2JkX2lvY3RsX2RhdGEgKmRhdGEsCi0JCQkJIHN0cnVjdCBsdXN0cmVfaGFuZGxlICpjb25uKQotewotCWRhdGEtPmlvY19jb29raWUgPSBjb25uLT5jb29raWU7Ci19Ci0KIHN0YXRpYyBpbnQgY2xhc3NfcmVzb2x2ZV9kZXZfbmFtZShfX3UzMiBsZW4sIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJaW50IHJjOwpAQCAtMjg3LDEzICsyNzAsNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQljYXNlIE9CRF9JT0NfQ0xPU0VfVVVJRDogewotCQlDREVCVUcoRF9JT0NUTCwgImNsb3NpbmcgYWxsIGNvbm5lY3Rpb25zIHRvIHV1aWQgJXMgKE5PT1ApXG4iLAotCQkgICAgICAgZGF0YS0+aW9jX2lubGJ1ZjEpOwotCQllcnIgPSAwOwotCQlnb3RvIG91dDsKLQl9Ci0KIAljYXNlIE9CRF9JT0NfR0VUREVWSUNFOiB7CiAJCWludCAgICAgaW5kZXggPSBkYXRhLT5pb2NfY291bnQ7CiAJCWNoYXIgICAgKnN0YXR1cywgKnN0cjsKQEAgLTQ2NywxNSArNDQzLDEwIEBACiAJcmV0dXJuIHJldDsKIH0KIAotZXh0ZXJuIGludCBjbGFzc19wcm9jZnNfaW5pdCh2b2lkKTsKLWV4dGVybiBpbnQgY2xhc3NfcHJvY2ZzX2NsZWFuKHZvaWQpOwotCiBzdGF0aWMgaW50IF9faW5pdCBvYmRjbGFzc19pbml0KHZvaWQpCiB7CiAJaW50IGksIGVycjsKIAotCWludCBsdXN0cmVfcmVnaXN0ZXJfZnModm9pZCk7Ci0KIAlMQ09OU09MRV9JTkZPKCJMdXN0cmU6IEJ1aWxkIFZlcnNpb246ICIgTFVTVFJFX1ZFUlNJT05fU1RSSU5HICJcbiIpOwogCiAJc3Bpbl9sb2NrX2luaXQoJm9iZF90eXBlc19sb2NrKTsKQEAgLTU0MiwyMyArNTEzLDkgQEAKIAogc3RhdGljIHZvaWQgb2JkY2xhc3NfZXhpdCh2b2lkKQogewotCWludCBpOwotCi0JaW50IGx1c3RyZV91bnJlZ2lzdGVyX2ZzKHZvaWQpOwotCiAJbHVzdHJlX3VucmVnaXN0ZXJfZnMoKTsKIAogCW1pc2NfZGVyZWdpc3Rlcigmb2JkX3BzZGV2KTsKLQlmb3IgKGkgPSAwOyBpIDwgY2xhc3NfZGV2bm9fbWF4KCk7IGkrKykgewotCQlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkID0gY2xhc3NfbnVtMm9iZChpKTsKLQotCQlpZiAob2JkICYmIG9iZC0+b2JkX3NldF91cCAmJgotCQkgICAgT0JUKG9iZCkgJiYgT0JQKG9iZCwgZGV0YWNoKSkgewotCQkJLyogWFhYIHNob3VsZCB0aGlzIGNhbGwgZ2VuZXJpYyBkZXRhY2ggb3RoZXJ3aXNlPyAqLwotCQkJTEFTU0VSVChvYmQtPm9iZF9tYWdpYyA9PSBPQkRfREVWSUNFX01BR0lDKTsKLQkJCU9CUChvYmQsIGRldGFjaCkob2JkKTsKLQkJfQotCX0KIAlsbG9nX2luZm9fZmluaSgpOwogCWNsX2dsb2JhbF9maW5pKCk7CiAJbHVfZ2xvYmFsX2ZpbmkoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2RlYnVnLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9kZWJ1Zy5jCmluZGV4IDhhY2Y2NzIuLjBiZDRhZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2RlYnVnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvZGVidWcuYwpAQCAtNDgsMTAgKzQ4LDEwIEBACiAJTEFTU0VSVChhZGRyKTsKIAogCXB1dF91bmFsaWduZWRfbGU2NChvZmYsIGFkZHIpOwotCXB1dF91bmFsaWduZWRfbGU2NChpZCwgYWRkcitMUERTKTsKKwlwdXRfdW5hbGlnbmVkX2xlNjQoaWQsIGFkZHIgKyBMUERTKTsKIAlhZGRyICs9IGxlbiAtIExQRFMgLSBMUERTOwogCXB1dF91bmFsaWduZWRfbGU2NChvZmYsIGFkZHIpOwotCXB1dF91bmFsaWduZWRfbGU2NChpZCwgYWRkcitMUERTKTsKKwlwdXRfdW5hbGlnbmVkX2xlNjQoaWQsIGFkZHIgKyBMUERTKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvZ2Vub3BzLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9nZW5vcHMuYwppbmRleCA5OWMyZGE2Li5jZjhiYjJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9nZW5vcHMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9nZW5vcHMuYwpAQCAtMTMzLDcgKzEzMyw2IEBACiAJbW9kdWxlX3B1dCh0eXBlLT50eXBfZHRfb3BzLT5vd25lcik7CiAJc3Bpbl91bmxvY2soJnR5cGUtPm9iZF90eXBlX2xvY2spOwogfQotRVhQT1JUX1NZTUJPTChjbGFzc19wdXRfdHlwZSk7CiAKICNkZWZpbmUgQ0xBU1NfTUFYX05BTUUgMTAyNAogCkBAIC0xNjYsMTAgKzE2NSwxMCBAQAogCSAgICAhdHlwZS0+dHlwX25hbWUpCiAJCWdvdG8gZmFpbGVkOwogCi0JKih0eXBlLT50eXBfZHRfb3BzKSA9ICpkdF9vcHM7CisJKnR5cGUtPnR5cF9kdF9vcHMgPSAqZHRfb3BzOwogCS8qIG1kX29wcyBpcyBvcHRpb25hbCAqLwogCWlmIChtZF9vcHMpCi0JCSoodHlwZS0+dHlwX21kX29wcykgPSAqbWRfb3BzOworCQkqdHlwZS0+dHlwX21kX29wcyA9ICptZF9vcHM7CiAJc3RyY3B5KHR5cGUtPnR5cF9uYW1lLCBuYW1lKTsKIAlzcGluX2xvY2tfaW5pdCgmdHlwZS0+b2JkX3R5cGVfbG9jayk7CiAKQEAgLTM5MSw3ICszOTAsNiBAQAogCiAJcmV0dXJuIC0xOwogfQotRVhQT1JUX1NZTUJPTChjbGFzc19uYW1lMmRldik7CiAKIHN0cnVjdCBvYmRfZGV2aWNlICpjbGFzc19uYW1lMm9iZChjb25zdCBjaGFyICpuYW1lKQogewpAQCAtNDIxLDcgKzQxOSw2IEBACiAKIAlyZXR1cm4gLTE7CiB9Ci1FWFBPUlRfU1lNQk9MKGNsYXNzX3V1aWQyZGV2KTsKIAogLyoqCiAgKiBHZXQgb2JkIGRldmljZSBmcm9tIDo6b2JkX2RldnNbXQpAQCAtNDUwLDcgKzQ0Nyw2IEBACiAKIAlyZXR1cm4gb2JkOwogfQotRVhQT1JUX1NZTUJPTChjbGFzc19udW0yb2JkKTsKIAogLyogU2VhcmNoIGZvciBhIGNsaWVudCBPQkQgY29ubmVjdGVkIHRvIHRndF91dWlkLiAgSWYgZ3JwX3V1aWQgaXMKICAqIHNwZWNpZmllZCwgdGhlbiBvbmx5IHRoZSBjbGllbnQgd2l0aCB0aGF0IHV1aWQgaXMgcmV0dXJuZWQsCkBAIC01MDksNyArNTA1LDcgQEAKIAkJCWNvbnRpbnVlOwogCQlpZiAob2JkX3V1aWRfZXF1YWxzKGdycF91dWlkLCAmb2JkLT5vYmRfdXVpZCkpIHsKIAkJCWlmIChuZXh0KQotCQkJCSpuZXh0ID0gaSsxOworCQkJCSpuZXh0ID0gaSArIDE7CiAJCQlyZWFkX3VubG9jaygmb2JkX2Rldl9sb2NrKTsKIAkJCXJldHVybiBvYmQ7CiAJCX0KQEAgLTYxOCw3ICs2MTQsNyBAQAogCX0KIAogCUNERUJVRyhEX0lORk8sICJsb29raW5nIGZvciBleHBvcnQgY29va2llICUjbGx4XG4iLCBjb25uLT5jb29raWUpOwotCWV4cG9ydCA9IGNsYXNzX2hhbmRsZTJvYmplY3QoY29ubi0+Y29va2llKTsKKwlleHBvcnQgPSBjbGFzc19oYW5kbGUyb2JqZWN0KGNvbm4tPmNvb2tpZSwgTlVMTCk7CiAJcmV0dXJuIGV4cG9ydDsKIH0KIEVYUE9SVF9TWU1CT0woY2xhc3NfY29ubjJleHBvcnQpOwpAQCAtODE3LDcgKzgxMyw2IEBACiAJc3Bpbl91bmxvY2soJmV4cC0+ZXhwX29iZC0+b2JkX2Rldl9sb2NrKTsKIAljbGFzc19leHBvcnRfcHV0KGV4cCk7CiB9Ci1FWFBPUlRfU1lNQk9MKGNsYXNzX3VubGlua19leHBvcnQpOwogCiAvKiBJbXBvcnQgbWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KIHN0YXRpYyB2b2lkIGNsYXNzX2ltcG9ydF9kZXN0cm95KHN0cnVjdCBvYmRfaW1wb3J0ICppbXApCkBAIC05NzMsNyArOTY4LDYgQEAKIAkgICAgICAgbG9jaywgZXhwLCBsb2NrLT5sX2V4cF9yZWZzX25yKTsKIAlzcGluX3VubG9jaygmZXhwLT5leHBfbG9ja3NfbGlzdF9ndWFyZCk7CiB9Ci1FWFBPUlRfU1lNQk9MKF9fY2xhc3NfZXhwb3J0X2FkZF9sb2NrX3JlZik7CiAKIHZvaWQgX19jbGFzc19leHBvcnRfZGVsX2xvY2tfcmVmKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsZGxtX2xvY2sgKmxvY2spCiB7CkBAIC05OTEsNyArOTg1LDYgQEAKIAkgICAgICAgbG9jaywgZXhwLCBsb2NrLT5sX2V4cF9yZWZzX25yKTsKIAlzcGluX3VubG9jaygmZXhwLT5leHBfbG9ja3NfbGlzdF9ndWFyZCk7CiB9Ci1FWFBPUlRfU1lNQk9MKF9fY2xhc3NfZXhwb3J0X2RlbF9sb2NrX3JlZik7CiAjZW5kaWYKIAogLyogQSBjb25uZWN0aW9uIGRlZmluZXMgYW4gZXhwb3J0IGNvbnRleHQgaW4gd2hpY2ggcHJlYWxsb2NhdGlvbiBjYW4KQEAgLTExMDAsNyArMTA5Myw2IEBACiAKICNpZiBMVVNUUkVfVFJBQ0tTX0xPQ0tfRVhQX1JFRlMKIHZvaWQgKCpjbGFzc19leHBvcnRfZHVtcF9ob29rKShzdHJ1Y3Qgb2JkX2V4cG9ydCAqKSA9IE5VTEw7Ci1FWFBPUlRfU1lNQk9MKGNsYXNzX2V4cG9ydF9kdW1wX2hvb2spOwogI2VuZGlmCiAKIC8qIFRvdGFsIGFtb3VudCBvZiB6b21iaWVzIHRvIGJlIGRlc3Ryb3llZCAqLwpAQCAtMTMxMiwzICsxMzA0LDEzNSBAQAogCW9iZF96b21iaWVfaW1wZXhwX25vdGlmeSgpOwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJm9iZF96b21iaWVfc3RvcCk7CiB9CisKK3N0cnVjdCBvYmRfcmVxdWVzdF9zbG90X3dhaXRlciB7CisJc3RydWN0IGxpc3RfaGVhZAlvcnN3X2VudHJ5OworCXdhaXRfcXVldWVfaGVhZF90CW9yc3dfd2FpdHE7CisJYm9vbAkJCW9yc3dfc2lnbmFsZWQ7Cit9OworCitzdGF0aWMgYm9vbCBvYmRfcmVxdWVzdF9zbG90X2F2YWlsKHN0cnVjdCBjbGllbnRfb2JkICpjbGksCisJCQkJICAgc3RydWN0IG9iZF9yZXF1ZXN0X3Nsb3Rfd2FpdGVyICpvcnN3KQoreworCWJvb2wgYXZhaWw7CisKKwlzcGluX2xvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CisJYXZhaWwgPSAhIWxpc3RfZW1wdHkoJm9yc3ctPm9yc3dfZW50cnkpOworCXNwaW5fdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOworCisJcmV0dXJuIGF2YWlsOworfTsKKworLyoKKyAqIEZvciBuZXR3b3JrIGZsb3cgY29udHJvbCwgdGhlIFJQQyBzcG9uc29yIG5lZWRzIHRvIGFjcXVpcmUgYSBjcmVkaXQKKyAqIGJlZm9yZSBzZW5kaW5nIHRoZSBSUEMuIFRoZSBjcmVkaXRzIGNvdW50IGZvciBhIGNvbm5lY3Rpb24gaXMgZGVmaW5lZAorICogYnkgdGhlICJjbF9tYXhfcnBjc19pbl9mbGlnaHQiLiBJZiBhbGwgdGhlIGNyZWRpdHMgYXJlIG9jY3B1aWVkLCB0aGVuCisgKiB0aGUgc3Vic2VxdWVudCBSUEMgc3BvbnNvcnMgbmVlZCB0byB3YWl0IHVudGlsIG90aGVycyByZWxlYXNlZCB0aGVpcgorICogY3JlZGl0cywgb3IgdGhlIGFkbWluaXN0cmF0b3IgaW5jcmVhc2VkIHRoZSAiY2xfbWF4X3JwY3NfaW5fZmxpZ2h0Ii4KKyAqLworaW50IG9iZF9nZXRfcmVxdWVzdF9zbG90KHN0cnVjdCBjbGllbnRfb2JkICpjbGkpCit7CisJc3RydWN0IG9iZF9yZXF1ZXN0X3Nsb3Rfd2FpdGVyIG9yc3c7CisJc3RydWN0IGxfd2FpdF9pbmZvIGx3aTsKKwlpbnQgcmM7CisKKwlzcGluX2xvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CisJaWYgKGNsaS0+Y2xfcl9pbl9mbGlnaHQgPCBjbGktPmNsX21heF9ycGNzX2luX2ZsaWdodCkgeworCQljbGktPmNsX3JfaW5fZmxpZ2h0Kys7CisJCXNwaW5fdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZvcnN3Lm9yc3dfd2FpdHEpOworCWxpc3RfYWRkX3RhaWwoJm9yc3cub3Jzd19lbnRyeSwgJmNsaS0+Y2xfbG9pX3JlYWRfbGlzdCk7CisJb3Jzdy5vcnN3X3NpZ25hbGVkID0gZmFsc2U7CisJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CisKKwlsd2kgPSBMV0lfSU5UUihMV0lfT05fU0lHTkFMX05PT1AsIE5VTEwpOworCXJjID0gbF93YWl0X2V2ZW50KG9yc3cub3Jzd193YWl0cSwKKwkJCSAgb2JkX3JlcXVlc3Rfc2xvdF9hdmFpbChjbGksICZvcnN3KSB8fAorCQkJICBvcnN3Lm9yc3dfc2lnbmFsZWQsCisJCQkgICZsd2kpOworCisJLyoKKwkgKiBIZXJlLCB3ZSBtdXN0IHRha2UgdGhlIGxvY2sgdG8gYXZvaWQgdGhlIG9uLXN0YWNrICdvcnN3JyB0byBiZQorCSAqIGZyZWVkIGJ1dCBvdGhlciAoc3VjaCBhcyBvYmRfcHV0X3JlcXVlc3Rfc2xvdCkgaXMgdXNpbmcgaXQuCisJICovCisJc3Bpbl9sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOworCWlmIChyYykgeworCQlpZiAoIW9yc3cub3Jzd19zaWduYWxlZCkgeworCQkJaWYgKGxpc3RfZW1wdHkoJm9yc3cub3Jzd19lbnRyeSkpCisJCQkJY2xpLT5jbF9yX2luX2ZsaWdodC0tOworCQkJZWxzZQorCQkJCWxpc3RfZGVsKCZvcnN3Lm9yc3dfZW50cnkpOworCQl9CisJfQorCisJaWYgKG9yc3cub3Jzd19zaWduYWxlZCkgeworCQlMQVNTRVJUKGxpc3RfZW1wdHkoJm9yc3cub3Jzd19lbnRyeSkpOworCisJCXJjID0gLUVJTlRSOworCX0KKwlzcGluX3VubG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKKworCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0wob2JkX2dldF9yZXF1ZXN0X3Nsb3QpOworCit2b2lkIG9iZF9wdXRfcmVxdWVzdF9zbG90KHN0cnVjdCBjbGllbnRfb2JkICpjbGkpCit7CisJc3RydWN0IG9iZF9yZXF1ZXN0X3Nsb3Rfd2FpdGVyICpvcnN3OworCisJc3Bpbl9sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOworCWNsaS0+Y2xfcl9pbl9mbGlnaHQtLTsKKworCS8qIElmIHRoZXJlIGlzIGZyZWUgc2xvdCwgd2FrZXVwIHRoZSBmaXJzdCB3YWl0ZXIuICovCisJaWYgKCFsaXN0X2VtcHR5KCZjbGktPmNsX2xvaV9yZWFkX2xpc3QpICYmCisJICAgIGxpa2VseShjbGktPmNsX3JfaW5fZmxpZ2h0IDwgY2xpLT5jbF9tYXhfcnBjc19pbl9mbGlnaHQpKSB7CisJCW9yc3cgPSBsaXN0X2VudHJ5KGNsaS0+Y2xfbG9pX3JlYWRfbGlzdC5uZXh0LAorCQkJCSAgc3RydWN0IG9iZF9yZXF1ZXN0X3Nsb3Rfd2FpdGVyLCBvcnN3X2VudHJ5KTsKKwkJbGlzdF9kZWxfaW5pdCgmb3Jzdy0+b3Jzd19lbnRyeSk7CisJCWNsaS0+Y2xfcl9pbl9mbGlnaHQrKzsKKwkJd2FrZV91cCgmb3Jzdy0+b3Jzd193YWl0cSk7CisJfQorCXNwaW5fdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOworfQorRVhQT1JUX1NZTUJPTChvYmRfcHV0X3JlcXVlc3Rfc2xvdCk7CisKK19fdTMyIG9iZF9nZXRfbWF4X3JwY3NfaW5fZmxpZ2h0KHN0cnVjdCBjbGllbnRfb2JkICpjbGkpCit7CisJcmV0dXJuIGNsaS0+Y2xfbWF4X3JwY3NfaW5fZmxpZ2h0OworfQorRVhQT1JUX1NZTUJPTChvYmRfZ2V0X21heF9ycGNzX2luX2ZsaWdodCk7CisKK2ludCBvYmRfc2V0X21heF9ycGNzX2luX2ZsaWdodChzdHJ1Y3QgY2xpZW50X29iZCAqY2xpLCBfX3UzMiBtYXgpCit7CisJc3RydWN0IG9iZF9yZXF1ZXN0X3Nsb3Rfd2FpdGVyICpvcnN3OworCV9fdTMyIG9sZDsKKwlpbnQgZGlmZjsKKwlpbnQgaTsKKworCWlmIChtYXggPiBPQkRfTUFYX1JJRl9NQVggfHwgbWF4IDwgMSkKKwkJcmV0dXJuIC1FUkFOR0U7CisKKwlzcGluX2xvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CisJb2xkID0gY2xpLT5jbF9tYXhfcnBjc19pbl9mbGlnaHQ7CisJY2xpLT5jbF9tYXhfcnBjc19pbl9mbGlnaHQgPSBtYXg7CisJZGlmZiA9IG1heCAtIG9sZDsKKworCS8qIFdlIGluY3JlYXNlIHRoZSBtYXhfcnBjc19pbl9mbGlnaHQsIHRoZW4gd2FrZXVwIHNvbWUgd2FpdGVycy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgZGlmZjsgaSsrKSB7CisJCWlmIChsaXN0X2VtcHR5KCZjbGktPmNsX2xvaV9yZWFkX2xpc3QpKQorCQkJYnJlYWs7CisKKwkJb3JzdyA9IGxpc3RfZW50cnkoY2xpLT5jbF9sb2lfcmVhZF9saXN0Lm5leHQsCisJCQkJICBzdHJ1Y3Qgb2JkX3JlcXVlc3Rfc2xvdF93YWl0ZXIsIG9yc3dfZW50cnkpOworCQlsaXN0X2RlbF9pbml0KCZvcnN3LT5vcnN3X2VudHJ5KTsKKwkJY2xpLT5jbF9yX2luX2ZsaWdodCsrOworCQl3YWtlX3VwKCZvcnN3LT5vcnN3X3dhaXRxKTsKKwl9CisJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wob2JkX3NldF9tYXhfcnBjc19pbl9mbGlnaHQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGlua2VhLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9saW5rZWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjFkMmYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGlua2VhLmMKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiBHUEwgSEVBREVSIFNUQVJUCisgKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LAorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZAorICogaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgSWYgbm90LCBzZWUKKyAqIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLmh0bWwKKyAqCisgKiBHUEwgSEVBREVSIEVORAorICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE0LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMuCisgKgorICogQXV0aG9yOiBEaSBXYW5nIDxkaS53YW5nQGludGVsLmNvbT4KKyAqLworCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmUvbHVzdHJlX2lkbC5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGlua2VhLmgiCisKK2ludCBsaW5rZWFfZGF0YV9uZXcoc3RydWN0IGxpbmtlYV9kYXRhICpsZGF0YSwgc3RydWN0IGx1X2J1ZiAqYnVmKQoreworCWxkYXRhLT5sZF9idWYgPSBsdV9idWZfY2hlY2tfYW5kX2FsbG9jKGJ1ZiwgUEFHRV9TSVpFKTsKKwlpZiAoIWxkYXRhLT5sZF9idWYtPmxiX2J1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJbGRhdGEtPmxkX2xlaCA9IGxkYXRhLT5sZF9idWYtPmxiX2J1ZjsKKwlsZGF0YS0+bGRfbGVoLT5sZWhfbWFnaWMgPSBMSU5LX0VBX01BR0lDOworCWxkYXRhLT5sZF9sZWgtPmxlaF9sZW4gPSBzaXplb2Yoc3RydWN0IGxpbmtfZWFfaGVhZGVyKTsKKwlsZGF0YS0+bGRfbGVoLT5sZWhfcmVjY291bnQgPSAwOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChsaW5rZWFfZGF0YV9uZXcpOworCitpbnQgbGlua2VhX2luaXQoc3RydWN0IGxpbmtlYV9kYXRhICpsZGF0YSkKK3sKKwlzdHJ1Y3QgbGlua19lYV9oZWFkZXIgKmxlaDsKKworCUxBU1NFUlQobGRhdGEtPmxkX2J1Zik7CisJbGVoID0gbGRhdGEtPmxkX2J1Zi0+bGJfYnVmOworCWlmIChsZWgtPmxlaF9tYWdpYyA9PSBfX3N3YWIzMihMSU5LX0VBX01BR0lDKSkgeworCQlsZWgtPmxlaF9tYWdpYyA9IExJTktfRUFfTUFHSUM7CisJCWxlaC0+bGVoX3JlY2NvdW50ID0gX19zd2FiMzIobGVoLT5sZWhfcmVjY291bnQpOworCQlsZWgtPmxlaF9sZW4gPSBfX3N3YWI2NChsZWgtPmxlaF9sZW4pOworCQkvKiBlbnRyaWVzIGFyZSBzd2FiYmVkIGJ5IGxpbmtlYV9lbnRyeV91bnBhY2sgKi8KKwl9CisJaWYgKGxlaC0+bGVoX21hZ2ljICE9IExJTktfRUFfTUFHSUMpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChsZWgtPmxlaF9yZWNjb3VudCA9PSAwKQorCQlyZXR1cm4gLUVOT0RBVEE7CisKKwlsZGF0YS0+bGRfbGVoID0gbGVoOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChsaW5rZWFfaW5pdCk7CisKKy8qKgorICogUGFjayBhIGxpbmtfZWFfZW50cnkuCisgKiBBbGwgZWxlbWVudHMgYXJlIHN0b3JlZCBhcyBjaGFycyB0byBhdm9pZCBhbGlnbm1lbnQgaXNzdWVzLgorICogTnVtYmVycyBhcmUgYWx3YXlzIGJpZy1lbmRpYW4KKyAqIFxyZXR2YWwgcmVjb3JkIGxlbmd0aAorICovCitpbnQgbGlua2VhX2VudHJ5X3BhY2soc3RydWN0IGxpbmtfZWFfZW50cnkgKmxlZSwgY29uc3Qgc3RydWN0IGx1X25hbWUgKmxuYW1lLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgbHVfZmlkICpwZmlkKQoreworCXN0cnVjdCBsdV9maWQgICB0bXBmaWQ7CisJaW50ICAgICAgICAgICAgIHJlY2xlbjsKKworCXRtcGZpZCA9ICpwZmlkOworCWlmIChPQkRfRkFJTF9DSEVDSyhPQkRfRkFJTF9MRlNDS19MSU5LRUFfQ1JBU0gpKQorCQl0bXBmaWQuZl92ZXIgPSB+MDsKKwlmaWRfY3B1X3RvX2JlKCZ0bXBmaWQsICZ0bXBmaWQpOworCW1lbWNweSgmbGVlLT5sZWVfcGFyZW50X2ZpZCwgJnRtcGZpZCwgc2l6ZW9mKHRtcGZpZCkpOworCW1lbWNweShsZWUtPmxlZV9uYW1lLCBsbmFtZS0+bG5fbmFtZSwgbG5hbWUtPmxuX25hbWVsZW4pOworCXJlY2xlbiA9IHNpemVvZihzdHJ1Y3QgbGlua19lYV9lbnRyeSkgKyBsbmFtZS0+bG5fbmFtZWxlbjsKKworCWxlZS0+bGVlX3JlY2xlblswXSA9IChyZWNsZW4gPj4gOCkgJiAweGZmOworCWxlZS0+bGVlX3JlY2xlblsxXSA9IHJlY2xlbiAmIDB4ZmY7CisJcmV0dXJuIHJlY2xlbjsKK30KK0VYUE9SVF9TWU1CT0wobGlua2VhX2VudHJ5X3BhY2spOworCit2b2lkIGxpbmtlYV9lbnRyeV91bnBhY2soY29uc3Qgc3RydWN0IGxpbmtfZWFfZW50cnkgKmxlZSwgaW50ICpyZWNsZW4sCisJCQkgc3RydWN0IGx1X25hbWUgKmxuYW1lLCBzdHJ1Y3QgbHVfZmlkICpwZmlkKQoreworCSpyZWNsZW4gPSAobGVlLT5sZWVfcmVjbGVuWzBdIDw8IDgpIHwgbGVlLT5sZWVfcmVjbGVuWzFdOworCW1lbWNweShwZmlkLCAmbGVlLT5sZWVfcGFyZW50X2ZpZCwgc2l6ZW9mKCpwZmlkKSk7CisJZmlkX2JlX3RvX2NwdShwZmlkLCBwZmlkKTsKKwlpZiAobG5hbWUpIHsKKwkJbG5hbWUtPmxuX25hbWUgPSBsZWUtPmxlZV9uYW1lOworCQlsbmFtZS0+bG5fbmFtZWxlbiA9ICpyZWNsZW4gLSBzaXplb2Yoc3RydWN0IGxpbmtfZWFfZW50cnkpOworCX0KK30KK0VYUE9SVF9TWU1CT0wobGlua2VhX2VudHJ5X3VucGFjayk7CisKKy8qKgorICogQWRkIGEgcmVjb3JkIHRvIHRoZSBlbmQgb2YgbGluayBlYSBidWYKKyAqKi8KK2ludCBsaW5rZWFfYWRkX2J1ZihzdHJ1Y3QgbGlua2VhX2RhdGEgKmxkYXRhLCBjb25zdCBzdHJ1Y3QgbHVfbmFtZSAqbG5hbWUsCisJCSAgIGNvbnN0IHN0cnVjdCBsdV9maWQgKnBmaWQpCit7CisJTEFTU0VSVChsZGF0YS0+bGRfbGVoKTsKKworCWlmICghbG5hbWUgfHwgIXBmaWQpCisJCXJldHVybiAtRUlOVkFMOworCisJbGRhdGEtPmxkX3JlY2xlbiA9IGxuYW1lLT5sbl9uYW1lbGVuICsgc2l6ZW9mKHN0cnVjdCBsaW5rX2VhX2VudHJ5KTsKKwlpZiAobGRhdGEtPmxkX2xlaC0+bGVoX2xlbiArIGxkYXRhLT5sZF9yZWNsZW4gPgorCSAgICBsZGF0YS0+bGRfYnVmLT5sYl9sZW4pIHsKKwkJaWYgKGx1X2J1Zl9jaGVja19hbmRfZ3JvdyhsZGF0YS0+bGRfYnVmLAorCQkJCQkgIGxkYXRhLT5sZF9sZWgtPmxlaF9sZW4gKworCQkJCQkgIGxkYXRhLT5sZF9yZWNsZW4pIDwgMCkKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCWxkYXRhLT5sZF9sZWggPSBsZGF0YS0+bGRfYnVmLT5sYl9idWY7CisJbGRhdGEtPmxkX2xlZSA9IGxkYXRhLT5sZF9idWYtPmxiX2J1ZiArIGxkYXRhLT5sZF9sZWgtPmxlaF9sZW47CisJbGRhdGEtPmxkX3JlY2xlbiA9IGxpbmtlYV9lbnRyeV9wYWNrKGxkYXRhLT5sZF9sZWUsIGxuYW1lLCBwZmlkKTsKKwlsZGF0YS0+bGRfbGVoLT5sZWhfbGVuICs9IGxkYXRhLT5sZF9yZWNsZW47CisJbGRhdGEtPmxkX2xlaC0+bGVoX3JlY2NvdW50Kys7CisJQ0RFQlVHKERfSU5PREUsICJOZXcgbGlua19lYSBuYW1lICciIERGSUQgIjolLipzJyBpcyBhZGRlZFxuIiwKKwkgICAgICAgUEZJRChwZmlkKSwgbG5hbWUtPmxuX25hbWVsZW4sIGxuYW1lLT5sbl9uYW1lKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wobGlua2VhX2FkZF9idWYpOworCisvKiogRGVsIHRoZSBjdXJyZW50IHJlY29yZCBmcm9tIHRoZSBsaW5rIGVhIGJ1ZiAqLwordm9pZCBsaW5rZWFfZGVsX2J1ZihzdHJ1Y3QgbGlua2VhX2RhdGEgKmxkYXRhLCBjb25zdCBzdHJ1Y3QgbHVfbmFtZSAqbG5hbWUpCit7CisJTEFTU0VSVChsZGF0YS0+bGRfbGVoICYmIGxkYXRhLT5sZF9sZWUpOworCisJbGRhdGEtPmxkX2xlaC0+bGVoX3JlY2NvdW50LS07CisJbGRhdGEtPmxkX2xlaC0+bGVoX2xlbiAtPSBsZGF0YS0+bGRfcmVjbGVuOworCW1lbW1vdmUobGRhdGEtPmxkX2xlZSwgKGNoYXIgKilsZGF0YS0+bGRfbGVlICsgbGRhdGEtPmxkX3JlY2xlbiwKKwkJKGNoYXIgKilsZGF0YS0+bGRfbGVoICsgbGRhdGEtPmxkX2xlaC0+bGVoX2xlbiAtCisJCShjaGFyICopbGRhdGEtPmxkX2xlZSk7CisJQ0RFQlVHKERfSU5PREUsICJPbGQgbGlua19lYSBuYW1lICclLipzJyBpcyByZW1vdmVkXG4iLAorCSAgICAgICBsbmFtZS0+bG5fbmFtZWxlbiwgbG5hbWUtPmxuX25hbWUpOworCisJaWYgKChjaGFyICopbGRhdGEtPmxkX2xlZSA+PSAoKGNoYXIgKilsZGF0YS0+bGRfbGVoICsKKwkJCQkgICAgICBsZGF0YS0+bGRfbGVoLT5sZWhfbGVuKSkKKwkJbGRhdGEtPmxkX2xlZSA9IE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGxpbmtlYV9kZWxfYnVmKTsKKworLyoqCisgKiBDaGVjayBpZiBzdWNoIGEgbGluayBleGlzdHMgaW4gbGlua0VBLgorICoKKyAqIFxwYXJhbSBsZGF0YSBsaW5rIGRhdGEgdGhlIHNlYXJjaCB0byBiZSBkb25lIG9uCisgKiBccGFyYW0gbG5hbWUgbmFtZSBpbiB0aGUgcGFyZW50J3MgZGlyZWN0b3J5IGVudHJ5IHBvaW50aW5nIHRvIHRoaXMgb2JqZWN0CisgKiBccGFyYW0gcGZpZCBwYXJlbnQgZmlkIHRoZSBsaW5rIHRvIGJlIGZvdW5kIGZvcgorICoKKyAqIFxyZXR2YWwgICAwIHN1Y2Nlc3MKKyAqIFxyZXR2YWwgLUVOT0VOVCBsaW5rIGRvZXMgbm90IGV4aXN0CisgKiBccmV0dmFsIC12ZSBvbiBlcnJvcgorICovCitpbnQgbGlua2VhX2xpbmtzX2ZpbmQoc3RydWN0IGxpbmtlYV9kYXRhICpsZGF0YSwgY29uc3Qgc3RydWN0IGx1X25hbWUgKmxuYW1lLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgbHVfZmlkICAqcGZpZCkKK3sKKwlzdHJ1Y3QgbHVfbmFtZSB0bXBuYW1lOworCXN0cnVjdCBsdV9maWQgIHRtcGZpZDsKKwlpbnQgY291bnQ7CisKKwlMQVNTRVJUKGxkYXRhLT5sZF9sZWgpOworCisJLyogbGluayAjMCAqLworCWxkYXRhLT5sZF9sZWUgPSAoc3RydWN0IGxpbmtfZWFfZW50cnkgKikobGRhdGEtPmxkX2xlaCArIDEpOworCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgbGRhdGEtPmxkX2xlaC0+bGVoX3JlY2NvdW50OyBjb3VudCsrKSB7CisJCWxpbmtlYV9lbnRyeV91bnBhY2sobGRhdGEtPmxkX2xlZSwgJmxkYXRhLT5sZF9yZWNsZW4sCisJCQkJICAgICZ0bXBuYW1lLCAmdG1wZmlkKTsKKwkJaWYgKHRtcG5hbWUubG5fbmFtZWxlbiA9PSBsbmFtZS0+bG5fbmFtZWxlbiAmJgorCQkgICAgbHVfZmlkX2VxKCZ0bXBmaWQsIHBmaWQpICYmCisJCSAgICAoc3RybmNtcCh0bXBuYW1lLmxuX25hbWUsIGxuYW1lLT5sbl9uYW1lLAorCQkJICAgICB0bXBuYW1lLmxuX25hbWVsZW4pID09IDApKQorCQkJYnJlYWs7CisJCWxkYXRhLT5sZF9sZWUgPSAoc3RydWN0IGxpbmtfZWFfZW50cnkgKikoKGNoYXIgKilsZGF0YS0+bGRfbGVlICsKKwkJCQkJCQkgbGRhdGEtPmxkX3JlY2xlbik7CisJfQorCisJaWYgKGNvdW50ID09IGxkYXRhLT5sZF9sZWgtPmxlaF9yZWNjb3VudCkgeworCQlDREVCVUcoRF9JTk9ERSwgIk9sZCBsaW5rX2VhIG5hbWUgJyUuKnMnIG5vdCBmb3VuZFxuIiwKKwkJICAgICAgIGxuYW1lLT5sbl9uYW1lbGVuLCBsbmFtZS0+bG5fbmFtZSk7CisJCWxkYXRhLT5sZF9sZWUgPSBOVUxMOworCQlsZGF0YS0+bGRfcmVjbGVuID0gMDsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChsaW5rZWFfbGlua3NfZmluZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9saW51eC9saW51eC1tb2R1bGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xpbnV4L2xpbnV4LW1vZHVsZS5jCmluZGV4IDMzMzQyYmYuLmJlMDllMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xpbnV4L2xpbnV4LW1vZHVsZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xpbnV4L2xpbnV4LW1vZHVsZS5jCkBAIC02NSw2ICs2NSw3IEBACiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9vYmRfc3VwcG9ydC5oIgogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvb2JkX2NsYXNzLmgiCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9scHJvY2ZzX3N0YXR1cy5oIgorI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV9pb2N0bC5oIgogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvbHVzdHJlX3Zlci5oIgogCiAvKiBidWZmZXIgTVVTVCBiZSBhdCBsZWFzdCB0aGUgc2l6ZSBvZiBvYmRfaW9jdGxfaGRyICovCkBAIC0xNTcsNyArMTU4LDYgQEAKIAllcnIgPSBjb3B5X3RvX3VzZXIoYXJnLCBkYXRhLCBsZW4pID8gLUVGQVVMVCA6IDA7CiAJcmV0dXJuIGVycjsKIH0KLUVYUE9SVF9TWU1CT0wob2JkX2lvY3RsX3BvcGRhdGEpOwogCiAvKiAgb3BlbmluZyAvZGV2L29iZCAqLwogc3RhdGljIGludCBvYmRfY2xhc3Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKQEAgLTE5MSw3ICsxOTEsNyBAQAogfQogCiAvKiBkZWNsYXJlIGNoYXJhY3RlciBkZXZpY2UgKi8KLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG9iZF9wc2Rldl9mb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb2JkX3BzZGV2X2ZvcHMgPSB7CiAJLm93bmVyCSAgPSBUSElTX01PRFVMRSwKIAkudW5sb2NrZWRfaW9jdGwgPSBvYmRfY2xhc3NfaW9jdGwsIC8qIHVubG9ja2VkX2lvY3RsICovCiAJLm9wZW4JICAgPSBvYmRfY2xhc3Nfb3BlbiwgICAgICAvKiBvcGVuICovCkBAIC0yOTEsNyArMjkxLDcgQEAKIAkJCQljb25zdCBjaGFyICpidWZmZXIsCiAJCQkJc2l6ZV90IGNvdW50KQogewotCWlmICghY291bnQgfHwgY291bnQgPiBKT0JTVEFUU19KT0JJRF9TSVpFKQorCWlmICghY291bnQgfHwgY291bnQgPiBMVVNUUkVfSk9CSURfU0laRSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAltZW1jcHkob2JkX2pvYmlkX25vZGUsIGJ1ZmZlciwgY291bnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGludXgvbGludXgtb2Jkby5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGludXgvbGludXgtb2Jkby5jCmluZGV4IGM2Y2M2YTcuLjQxYjc3YTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xpbnV4L2xpbnV4LW9iZG8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9saW51eC9saW51eC1vYmRvLmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAKLXZvaWQgb2Jkb19yZWZyZXNoX2lub2RlKHN0cnVjdCBpbm9kZSAqZHN0LCBzdHJ1Y3Qgb2JkbyAqc3JjLCB1MzIgdmFsaWQpCit2b2lkIG9iZG9fcmVmcmVzaF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmRzdCwgY29uc3Qgc3RydWN0IG9iZG8gKnNyYywgdTMyIHZhbGlkKQogewogCXZhbGlkICY9IHNyYy0+b192YWxpZDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGludXgvbGludXgtc3lzY3RsLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9saW51eC9saW51eC1zeXNjdGwuYwppbmRleCA4ZjcwZGQyLi5lNmM3ODVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9saW51eC9saW51eC1zeXNjdGwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9saW51eC9saW51eC1zeXNjdGwuYwpAQCAtNDUsNiArNDUsNyBAQAogCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9vYmRfc3VwcG9ydC5oIgogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvbHByb2Nmc19zdGF0dXMuaCIKKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL29iZF9jbGFzcy5oIgogCiBzdHJ1Y3Qgc3RhdGljX2x1c3RyZV91aW50dmFsdWVfYXR0ciB7CiAJc3RydWN0IHsKQEAgLTk1LDggKzk2LDggQEAKIHN0YXRpYyBzc2l6ZV90IG1heF9kaXJ0eV9tYl9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAogCQkJCSBjaGFyICpidWYpCiB7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVsXG4iLAotCQkJb2JkX21heF9kaXJ0eV9wYWdlcyAvICgxIDw8ICgyMCAtIFBBR0VfU0hJRlQpKSk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWx1XG4iLAorCQkgICAgICAgb2JkX21heF9kaXJ0eV9wYWdlcyAvICgxIDw8ICgyMCAtIFBBR0VfU0hJRlQpKSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IG1heF9kaXJ0eV9tYl9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2cuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2cuYwppbmRleCAxNzg0Y2EwLi40Mzc5N2YxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZy5jCkBAIC04MCw3ICs4MCw3IEBACiAJCUxBU1NFUlQobGlzdF9lbXB0eSgmbG9naGFuZGxlLT51LnBoZC5waGRfZW50cnkpKTsKIAllbHNlIGlmIChsb2doYW5kbGUtPmxnaF9oZHItPmxsaF9mbGFncyAmIExMT0dfRl9JU19DQVQpCiAJCUxBU1NFUlQobGlzdF9lbXB0eSgmbG9naGFuZGxlLT51LmNoZC5jaGRfaGVhZCkpOwotCUxBU1NFUlQoc2l6ZW9mKCoobG9naGFuZGxlLT5sZ2hfaGRyKSkgPT0gTExPR19DSFVOS19TSVpFKTsKKwlMQVNTRVJUKHNpemVvZigqbG9naGFuZGxlLT5sZ2hfaGRyKSA9PSBMTE9HX0NIVU5LX1NJWkUpOwogCWtmcmVlKGxvZ2hhbmRsZS0+bGdoX2hkcik7CiBvdXQ6CiAJa2ZyZWUobG9naGFuZGxlKTsKQEAgLTEzNyw2ICsxMzcsNyBAQAogaW50IGxsb2dfaW5pdF9oYW5kbGUoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgbGxvZ19oYW5kbGUgKmhhbmRsZSwKIAkJICAgICBpbnQgZmxhZ3MsIHN0cnVjdCBvYmRfdXVpZCAqdXVpZCkKIHsKKwllbnVtIGxsb2dfZmxhZyBmbXQgPSBmbGFncyAmIExMT0dfRl9FWFRfTUFTSzsKIAlzdHJ1Y3QgbGxvZ19sb2dfaGRyCSpsbGg7CiAJaW50CQkJIHJjOwogCkBAIC0xOTQsNiArMTk1LDcgQEAKIAkJICAgICAgIGZsYWdzLCBMTE9HX0ZfSVNfQ0FULCBMTE9HX0ZfSVNfUExBSU4pOwogCQlyYyA9IC1FSU5WQUw7CiAJfQorCWxsaC0+bGxoX2ZsYWdzIHw9IGZtdDsKIG91dDoKIAlpZiAocmMpIHsKIAkJa2ZyZWUobGxoKTsKQEAgLTIzMyw2ICsyMzUsMTAgQEAKIAllbHNlCiAJCWxhc3RfaW5kZXggPSBMTE9HX0JJVE1BUF9CWVRFUyAqIDggLSAxOwogCisJLyogUmVjb3JkIGlzIG5vdCBpbiB0aGlzIGJ1ZmZlci4gKi8KKwlpZiAoaW5kZXggPiBsYXN0X2luZGV4KQorCQlnb3RvIG91dDsKKwogCXdoaWxlIChyYyA9PSAwKSB7CiAJCXN0cnVjdCBsbG9nX3JlY19oZHIgKnJlYzsKIApAQCAtMjYyLDcgKzI2OCw3IEBACiAJCSAqLwogCQlmb3IgKHJlYyA9IChzdHJ1Y3QgbGxvZ19yZWNfaGRyICopYnVmOwogCQkgICAgIChjaGFyICopcmVjIDwgYnVmICsgTExPR19DSFVOS19TSVpFOwotCQkgICAgIHJlYyA9IChzdHJ1Y3QgbGxvZ19yZWNfaGRyICopKChjaGFyICopcmVjICsgcmVjLT5scmhfbGVuKSkgeworCQkgICAgIHJlYyA9IGxsb2dfcmVjX2hkcl9uZXh0KHJlYykpIHsKIAkJCUNERUJVRyhEX09USEVSLCAicHJvY2Vzc2luZyByZWMgMHglcCB0eXBlICUjeFxuIiwKIAkJCSAgICAgICByZWMsIHJlYy0+bHJoX3R5cGUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX2NhdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19jYXQuYwppbmRleCBhODJhMjk1Li5jZThlMmY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX2NhdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfY2F0LmMKQEAgLTYzLDExICs2MywxMyBAQAogCQkJICAgICAgc3RydWN0IGxsb2dfbG9naWQgKmxvZ2lkKQogewogCXN0cnVjdCBsbG9nX2hhbmRsZQkqbG9naGFuZGxlOworCWVudW0gbGxvZ19mbGFnIGZtdDsKIAlpbnQJCQkgcmMgPSAwOwogCiAJaWYgKCFjYXRoYW5kbGUpCiAJCXJldHVybiAtRUJBREY7CiAKKwlmbXQgPSBjYXRoYW5kbGUtPmxnaF9oZHItPmxsaF9mbGFncyAmIExMT0dfRl9FWFRfTUFTSzsKIAlkb3duX3dyaXRlKCZjYXRoYW5kbGUtPmxnaF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvZ2hhbmRsZSwgJmNhdGhhbmRsZS0+dS5jaGQuY2hkX2hlYWQsCiAJCQkgICAgdS5waGQucGhkX2VudHJ5KSB7CkBAIC05OSw3ICsxMDEsNyBAQAogCQlyZXR1cm4gcmM7CiAJfQogCi0JcmMgPSBsbG9nX2luaXRfaGFuZGxlKGVudiwgbG9naGFuZGxlLCBMTE9HX0ZfSVNfUExBSU4sIE5VTEwpOworCXJjID0gbGxvZ19pbml0X2hhbmRsZShlbnYsIGxvZ2hhbmRsZSwgZm10IHwgTExPR19GX0lTX1BMQUlOLCBOVUxMKTsKIAlpZiAocmMgPCAwKSB7CiAJCWxsb2dfY2xvc2UoZW52LCBsb2doYW5kbGUpOwogCQlsb2doYW5kbGUgPSBOVUxMOwpAQCAtMTA3LDcgKzEwOSw3IEBACiAJfQogCiAJZG93bl93cml0ZSgmY2F0aGFuZGxlLT5sZ2hfbG9jayk7Ci0JbGlzdF9hZGQoJmxvZ2hhbmRsZS0+dS5waGQucGhkX2VudHJ5LCAmY2F0aGFuZGxlLT51LmNoZC5jaGRfaGVhZCk7CisJbGlzdF9hZGRfdGFpbCgmbG9naGFuZGxlLT51LnBoZC5waGRfZW50cnksICZjYXRoYW5kbGUtPnUuY2hkLmNoZF9oZWFkKTsKIAl1cF93cml0ZSgmY2F0aGFuZGxlLT5sZ2hfbG9jayk7CiAKIAlsb2doYW5kbGUtPnUucGhkLnBoZF9jYXRfaGFuZGxlID0gY2F0aGFuZGxlOwpAQCAtMTIzLDcgKzEyNSw2IEBACiBpbnQgbGxvZ19jYXRfY2xvc2UoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgbGxvZ19oYW5kbGUgKmNhdGhhbmRsZSkKIHsKIAlzdHJ1Y3QgbGxvZ19oYW5kbGUJKmxvZ2hhbmRsZSwgKm47Ci0JaW50CQkJIHJjOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxvZ2hhbmRsZSwgbiwgJmNhdGhhbmRsZS0+dS5jaGQuY2hkX2hlYWQsCiAJCQkJIHUucGhkLnBoZF9lbnRyeSkgewpAQCAtMTM0LDggKzEzNSw3IEBACiAJLyogaWYgaGFuZGxlIHdhcyBzdG9yZWQgaW4gY3R4dCwgcmVtb3ZlIGl0IHRvbyAqLwogCWlmIChjYXRoYW5kbGUtPmxnaF9jdHh0LT5sb2NfaGFuZGxlID09IGNhdGhhbmRsZSkKIAkJY2F0aGFuZGxlLT5sZ2hfY3R4dC0+bG9jX2hhbmRsZSA9IE5VTEw7Ci0JcmMgPSBsbG9nX2Nsb3NlKGVudiwgY2F0aGFuZGxlKTsKLQlyZXR1cm4gcmM7CisJcmV0dXJuIGxsb2dfY2xvc2UoZW52LCBjYXRoYW5kbGUpOwogfQogRVhQT1JUX1NZTUJPTChsbG9nX2NhdF9jbG9zZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfaW50ZXJuYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfaW50ZXJuYWwuaAppbmRleCBmNzk0OTUyLi4yMWE5M2M3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19pbnRlcm5hbC5oCkBAIC03MCw0ICs3MCw5IEBACiAJCQkgbGxvZ19jYl90IGNiLCB2b2lkICpkYXRhLCB2b2lkICpjYXRkYXRhLCBib29sIGZvcmspOwogaW50IGxsb2dfY2F0X2NsZWFudXAoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgbGxvZ19oYW5kbGUgKmNhdGhhbmRsZSwKIAkJICAgICBzdHJ1Y3QgbGxvZ19oYW5kbGUgKmxvZ2hhbmRsZSwgaW50IGluZGV4KTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbGxvZ19yZWNfaGRyICpsbG9nX3JlY19oZHJfbmV4dChzdHJ1Y3QgbGxvZ19yZWNfaGRyICpyZWMpCit7CisJcmV0dXJuIChzdHJ1Y3QgbGxvZ19yZWNfaGRyICopKChjaGFyICopcmVjICsgcmVjLT5scmhfbGVuKTsKK30KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19vYmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfb2JkLmMKaW5kZXggNmFjZTdlMC4uYTQyNzdkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19vYmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX29iZC5jCkBAIC0yMTAsNyArMjEwLDYgQEAKIC8qIGNvbnRleHQga2V5OiBsbG9nX3RocmVhZF9rZXkgKi8KIExVX0NPTlRFWFRfS0VZX0RFRklORShsbG9nLCBMQ1RfTURfVEhSRUFEIHwgTENUX01HX1RIUkVBRCB8IExDVF9MT0NBTCk7CiBMVV9LRVlfSU5JVF9HRU5FUklDKGxsb2cpOwotRVhQT1JUX1NZTUJPTChsbG9nX3RocmVhZF9rZXkpOwogCiBpbnQgbGxvZ19pbmZvX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfc3dhYi5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19zd2FiLmMKaW5kZXggZjdiOWIxOS4uOGM0YzFiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19zd2FiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19zd2FiLmMKQEAgLTE3MiwyMCArMTcyLDIzIEBACiAJCV9fc3dhYjY0cygmY3ItPmNyLmNyX3RpbWUpOwogCQlsdXN0cmVfc3dhYl9sdV9maWQoJmNyLT5jci5jcl90ZmlkKTsKIAkJbHVzdHJlX3N3YWJfbHVfZmlkKCZjci0+Y3IuY3JfcGZpZCk7Ci0JCWlmIChDSEFOR0VMT0dfUkVDX0VYVEVOREVEKCZjci0+Y3IpKSB7Ci0JCQlzdHJ1Y3QgbGxvZ19jaGFuZ2Vsb2dfZXh0X3JlYyAqZXh0ID0KLQkJCQkoc3RydWN0IGxsb2dfY2hhbmdlbG9nX2V4dF9yZWMgKilyZWM7CisJCWlmIChjci0+Y3IuY3JfZmxhZ3MgJiBDTEZfUkVOQU1FKSB7CisJCQlzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZW5hbWUgKnJubSA9CisJCQkJY2hhbmdlbG9nX3JlY19yZW5hbWUoJmNyLT5jcik7CiAKLQkJCWx1c3RyZV9zd2FiX2x1X2ZpZCgmZXh0LT5jci5jcl9zZmlkKTsKLQkJCWx1c3RyZV9zd2FiX2x1X2ZpZCgmZXh0LT5jci5jcl9zcGZpZCk7Ci0JCQl0YWlsID0gJmV4dC0+Y3JfdGFpbDsKLQkJfSBlbHNlIHsKLQkJCXRhaWwgPSAmY3ItPmNyX3RhaWw7CisJCQlsdXN0cmVfc3dhYl9sdV9maWQoJnJubS0+Y3Jfc2ZpZCk7CisJCQlsdXN0cmVfc3dhYl9sdV9maWQoJnJubS0+Y3Jfc3BmaWQpOwogCQl9Ci0JCXRhaWwgPSAoc3RydWN0IGxsb2dfcmVjX3RhaWwgKikoKGNoYXIgKil0YWlsICsKKwkJLyoKKwkJICogQmVjYXVzZSB0aGUgdGFpbCBmb2xsb3dzIGEgdmFyaWFibGUtbGVuZ3RoIHN0cnVjdHVyZSB3ZSBuZWVkCisJCSAqIHRvIGNvbXB1dGUgaXRzIGxvY2F0aW9uIGF0IHJ1bnRpbWUKKwkJICovCisJCXRhaWwgPSAoc3RydWN0IGxsb2dfcmVjX3RhaWwgKikoKGNoYXIgKikmY3ItPmNyICsKKwkJCQkJCWNoYW5nZWxvZ19yZWNfc2l6ZSgmY3ItPmNyKSArCiAJCQkJCQljci0+Y3IuY3JfbmFtZWxlbik7CiAJCWJyZWFrOwogCX0KKwogCWNhc2UgQ0hBTkdFTE9HX1VTRVJfUkVDOgogCXsKIAkJc3RydWN0IGxsb2dfY2hhbmdlbG9nX3VzZXJfcmVjICpjdXIgPQpAQCAtMjI0LDYgKzIyNyw3IEBACiAJCV9fc3dhYjMycygmbHNyLT5sc3JfdWlkX2gpOwogCQlfX3N3YWIzMnMoJmxzci0+bHNyX2dpZCk7CiAJCV9fc3dhYjMycygmbHNyLT5sc3JfZ2lkX2gpOworCQlfX3N3YWI2NHMoJmxzci0+bHNyX3ZhbGlkKTsKIAkJdGFpbCA9ICZsc3ItPmxzcl90YWlsOwogCQlicmVhazsKIAl9CkBAIC0zNDMsNyArMzQ3LDYgQEAKIAogCXByaW50X2x1c3RyZV9jZmcobGNmZyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX2x1c3RyZV9jZmcpOwogCiAvKiB1c2VkIG9ubHkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgb24tZGlzayBjZmdfbWFya2VyIGRhdGEgKi8KIHN0cnVjdCBjZmdfbWFya2VyMzIgewpAQCAtNDAzLDQgKzQwNiwzIEBACiAJCV9fc3dhYjY0cygmbWFya2VyLT5jbV9jYW5jZWx0aW1lKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX2NmZ19tYXJrZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHByb2Nmc19zdGF0dXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xwcm9jZnNfc3RhdHVzLmMKaW5kZXggMjc5YjYyNS4uODUyYTVhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHByb2Nmc19zdGF0dXMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9scHJvY2ZzX3N0YXR1cy5jCkBAIC05Niw2ICs5NiwxMiBAQAogCSJwaW5nbGVzcyIsCiAJImZsb2NrX2RlYWRsb2NrIiwKIAkiZGlzcF9zdHJpcGUiLAorCSJvcGVuX2J5X2ZpZCIsCisJImxmc2NrIiwKKwkidW5rbm93biIsCisJInVubGlua19jbG9zZSIsCisJInVua25vd24iLAorCSJkaXJfc3RyaXBlIiwKIAkidW5rbm93biIsCiAJTlVMTAogfTsKQEAgLTMwOSw3ICszMTUsNyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobGRlYnVnZnNfYWRkX3NpbXBsZSk7CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxwcm9jZnNfZ2VuZXJpY19mb3BzID0geyB9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbHByb2Nmc19nZW5lcmljX2ZvcHMgPSB7IH07CiAKIGludCBsZGVidWdmc19hZGRfdmFycyhzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsCiAJCSAgICAgIHN0cnVjdCBscHJvY2ZzX3ZhcnMgKmxpc3QsCkBAIC02MTUsNyArNjIxLDYgQEAKIAogCWxwcm9jZnNfc3RhdHNfdW5sb2NrKHN0YXRzLCBMUFJPQ0ZTX0dFVF9OVU1fQ1BVLCAmZmxhZ3MpOwogfQotRVhQT1JUX1NZTUJPTChscHJvY2ZzX3N0YXRzX2NvbGxlY3QpOwogCiAvKioKICAqIEFwcGVuZCBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGN1cnJlbnQgc2V0IGZsYWdzIHRvIHN0ci4KQEAgLTEwNDMsNyArMTA0OCw2IEBACiAJfQogCXJldHVybiByYzsKIH0KLUVYUE9SVF9TWU1CT0wobHByb2Nmc19zdGF0c19hbGxvY19vbmUpOwogCiBzdHJ1Y3QgbHByb2Nmc19zdGF0cyAqbHByb2Nmc19hbGxvY19zdGF0cyh1bnNpZ25lZCBpbnQgbnVtLAogCQkJCQkgIGVudW0gbHByb2Nmc19zdGF0c19mbGFncyBmbGFncykKQEAgLTE1NDcsNiArMTU1MSwxNDYgQEAKIH0KIEVYUE9SVF9TWU1CT0wobHByb2Nmc19vaF9jbGVhcik7CiAKK2ludCBscHJvY2ZzX3dyX3Jvb3Rfc3F1YXNoKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQsCisJCQkgICBzdHJ1Y3Qgcm9vdF9zcXVhc2hfaW5mbyAqc3F1YXNoLCBjaGFyICpuYW1lKQoreworCWNoYXIga2VybmJ1Zls2NF0sICp0bXAsICplcnJtc2c7CisJdW5zaWduZWQgbG9uZyB1aWQsIGdpZDsKKwlpbnQgcmM7CisKKwlpZiAoY291bnQgPj0gc2l6ZW9mKGtlcm5idWYpKSB7CisJCWVycm1zZyA9ICJzdHJpbmcgdG9vIGxvbmciOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbGVkX25vcHJpbnQ7CisJfQorCWlmIChjb3B5X2Zyb21fdXNlcihrZXJuYnVmLCBidWZmZXIsIGNvdW50KSkgeworCQllcnJtc2cgPSAiYmFkIGFkZHJlc3MiOworCQlyYyA9IC1FRkFVTFQ7CisJCWdvdG8gZmFpbGVkX25vcHJpbnQ7CisJfQorCWtlcm5idWZbY291bnRdID0gJ1wwJzsKKworCS8qIGxvb2sgZm9yIHVpZCBnaWQgc2VwYXJhdG9yICovCisJdG1wID0gc3RyY2hyKGtlcm5idWYsICc6Jyk7CisJaWYgKCF0bXApIHsKKwkJZXJybXNnID0gIm5lZWRzIHVpZDpnaWQgZm9ybWF0IjsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxlZDsKKwl9CisJKnRtcCA9ICdcMCc7CisJdG1wKys7CisKKwkvKiBwYXJzZSB1aWQgKi8KKwlpZiAoa3N0cnRvdWwoa2VybmJ1ZiwgMCwgJnVpZCkgIT0gMCkgeworCQllcnJtc2cgPSAiYmFkIHVpZCI7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsZWQ7CisJfQorCS8qIHBhcnNlIGdpZCAqLworCWlmIChrc3RydG91bCh0bXAsIDAsICZnaWQpICE9IDApIHsKKwkJZXJybXNnID0gImJhZCBnaWQiOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbGVkOworCX0KKworCXNxdWFzaC0+cnNpX3VpZCA9IHVpZDsKKwlzcXVhc2gtPnJzaV9naWQgPSBnaWQ7CisKKwlMQ09OU09MRV9JTkZPKCIlczogcm9vdF9zcXVhc2ggaXMgc2V0IHRvICV1OiV1XG4iLAorCQkgICAgICBuYW1lLCBzcXVhc2gtPnJzaV91aWQsIHNxdWFzaC0+cnNpX2dpZCk7CisJcmV0dXJuIGNvdW50OworCitmYWlsZWQ6CisJaWYgKHRtcCkgeworCQl0bXAtLTsKKwkJKnRtcCA9ICc6JzsKKwl9CisJQ1dBUk4oIiVzOiBmYWlsZWQgdG8gc2V0IHJvb3Rfc3F1YXNoIHRvIFwiJXNcIiwgJXMsIHJjID0gJWRcbiIsCisJICAgICAgbmFtZSwga2VybmJ1ZiwgZXJybXNnLCByYyk7CisJcmV0dXJuIHJjOworZmFpbGVkX25vcHJpbnQ6CisJQ1dBUk4oIiVzOiBmYWlsZWQgdG8gc2V0IHJvb3Rfc3F1YXNoIGR1ZSB0byAlcywgcmMgPSAlZFxuIiwKKwkgICAgICBuYW1lLCBlcnJtc2csIHJjKTsKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MKGxwcm9jZnNfd3Jfcm9vdF9zcXVhc2gpOworCitpbnQgbHByb2Nmc193cl9ub3NxdWFzaF9uaWRzKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQsCisJCQkgICAgIHN0cnVjdCByb290X3NxdWFzaF9pbmZvICpzcXVhc2gsIGNoYXIgKm5hbWUpCit7CisJY2hhciAqa2VybmJ1ZiA9IE5VTEwsICplcnJtc2c7CisJc3RydWN0IGxpc3RfaGVhZCB0bXA7CisJaW50IGxlbiA9IGNvdW50OworCWludCByYzsKKworCWlmIChjb3VudCA+IDQwOTYpIHsKKwkJZXJybXNnID0gInN0cmluZyB0b28gbG9uZyI7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJa2VybmJ1ZiA9IGt6YWxsb2MoY291bnQgKyAxLCBHRlBfTk9GUyk7CisJaWYgKCFrZXJuYnVmKSB7CisJCWVycm1zZyA9ICJubyBtZW1vcnkiOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZmFpbGVkOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcihrZXJuYnVmLCBidWZmZXIsIGNvdW50KSkgeworCQllcnJtc2cgPSAiYmFkIGFkZHJlc3MiOworCQlyYyA9IC1FRkFVTFQ7CisJCWdvdG8gZmFpbGVkOworCX0KKwlrZXJuYnVmW2NvdW50XSA9ICdcMCc7CisKKwlpZiAoY291bnQgPiAwICYmIGtlcm5idWZbY291bnQgLSAxXSA9PSAnXG4nKQorCQlsZW4gPSBjb3VudCAtIDE7CisKKwlpZiAoKGxlbiA9PSA0ICYmICFzdHJuY21wKGtlcm5idWYsICJOT05FIiwgbGVuKSkgfHwKKwkgICAgKGxlbiA9PSA1ICYmICFzdHJuY21wKGtlcm5idWYsICJjbGVhciIsIGxlbikpKSB7CisJCS8qIGVtcHR5IHN0cmluZyBpcyBzcGVjaWFsIGNhc2UgKi8KKwkJZG93bl93cml0ZSgmc3F1YXNoLT5yc2lfc2VtKTsKKwkJaWYgKCFsaXN0X2VtcHR5KCZzcXVhc2gtPnJzaV9ub3NxdWFzaF9uaWRzKSkKKwkJCWNmc19mcmVlX25pZGxpc3QoJnNxdWFzaC0+cnNpX25vc3F1YXNoX25pZHMpOworCQl1cF93cml0ZSgmc3F1YXNoLT5yc2lfc2VtKTsKKwkJTENPTlNPTEVfSU5GTygiJXM6IG5vc3F1YXNoX25pZHMgaXMgY2xlYXJlZFxuIiwgbmFtZSk7CisJCWtmcmVlKGtlcm5idWYpOworCQlyZXR1cm4gY291bnQ7CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJnRtcCk7CisJaWYgKGNmc19wYXJzZV9uaWRsaXN0KGtlcm5idWYsIGNvdW50LCAmdG1wKSA8PSAwKSB7CisJCWVycm1zZyA9ICJjYW4ndCBwYXJzZSI7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsZWQ7CisJfQorCUxDT05TT0xFX0lORk8oIiVzOiBub3NxdWFzaF9uaWRzIHNldCB0byAlc1xuIiwKKwkJICAgICAgbmFtZSwga2VybmJ1Zik7CisJa2ZyZWUoa2VybmJ1Zik7CisJa2VybmJ1ZiA9IE5VTEw7CisKKwlkb3duX3dyaXRlKCZzcXVhc2gtPnJzaV9zZW0pOworCWlmICghbGlzdF9lbXB0eSgmc3F1YXNoLT5yc2lfbm9zcXVhc2hfbmlkcykpCisJCWNmc19mcmVlX25pZGxpc3QoJnNxdWFzaC0+cnNpX25vc3F1YXNoX25pZHMpOworCWxpc3Rfc3BsaWNlKCZ0bXAsICZzcXVhc2gtPnJzaV9ub3NxdWFzaF9uaWRzKTsKKwl1cF93cml0ZSgmc3F1YXNoLT5yc2lfc2VtKTsKKworCXJldHVybiBjb3VudDsKKworZmFpbGVkOgorCWlmIChrZXJuYnVmKSB7CisJCUNXQVJOKCIlczogZmFpbGVkIHRvIHNldCBub3NxdWFzaF9uaWRzIHRvIFwiJXNcIiwgJXMgcmMgPSAlZFxuIiwKKwkJICAgICAgbmFtZSwga2VybmJ1ZiwgZXJybXNnLCByYyk7CisJCWtmcmVlKGtlcm5idWYpOworCQlrZXJuYnVmID0gTlVMTDsKKwl9IGVsc2UgeworCQlDV0FSTigiJXM6IGZhaWxlZCB0byBzZXQgbm9zcXVhc2hfbmlkcyBkdWUgdG8gJXMgcmMgPSAlZFxuIiwKKwkJICAgICAgbmFtZSwgZXJybXNnLCByYyk7CisJfQorCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0wobHByb2Nmc193cl9ub3NxdWFzaF9uaWRzKTsKKwogc3RhdGljIHNzaXplX3QgbHVzdHJlX2F0dHJfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKIAkJCQlzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sdV9vYmplY3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2x1X29iamVjdC5jCmluZGV4IDliMDMwNTkuLjA1NGU1NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2x1X29iamVjdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2x1X29iamVjdC5jCkBAIC01NSw2ICs1NSwzNCBAQAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVfcmVmLmgiCiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogCitlbnVtIHsKKwlMVV9DQUNIRV9QRVJDRU5UX01BWAkgPSA1MCwKKwlMVV9DQUNIRV9QRVJDRU5UX0RFRkFVTFQgPSAyMAorfTsKKworI2RlZmluZSBMVV9DQUNIRV9OUl9NQVhfQURKVVNUCQkxMjgKKyNkZWZpbmUgTFVfQ0FDSEVfTlJfVU5MSU1JVEVECQktMQorI2RlZmluZSBMVV9DQUNIRV9OUl9ERUZBVUxUCQlMVV9DQUNIRV9OUl9VTkxJTUlURUQKKyNkZWZpbmUgTFVfQ0FDSEVfTlJfTERJU0tGU19MSU1JVAlMVV9DQUNIRV9OUl9VTkxJTUlURUQKKyNkZWZpbmUgTFVfQ0FDSEVfTlJfWkZTX0xJTUlUCQkyNTYKKworI2RlZmluZSBMVV9TSVRFX0JJVFNfTUlOCTEyCisjZGVmaW5lIExVX1NJVEVfQklUU19NQVgJMjQKKy8qKgorICogdG90YWwgMjU2IGJ1Y2tldHMsIHdlIGRvbid0IHdhbnQgdG9vIG1hbnkgYnVja2V0cyBiZWNhdXNlOgorICogLSBjb25zdW1lIHRvbyBtdWNoIG1lbW9yeQorICogLSBhdm9pZCB1bmJhbGFuY2VkIExSVSBsaXN0CisgKi8KKyNkZWZpbmUgTFVfU0lURV9CS1RfQklUUwk4CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbHVfY2FjaGVfcGVyY2VudCA9IExVX0NBQ0hFX1BFUkNFTlRfREVGQVVMVDsKK21vZHVsZV9wYXJhbShsdV9jYWNoZV9wZXJjZW50LCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhsdV9jYWNoZV9wZXJjZW50LCAiUGVyY2VudGFnZSBvZiBtZW1vcnkgdG8gYmUgdXNlZCBhcyBsdV9vYmplY3QgY2FjaGUiKTsKKworc3RhdGljIGxvbmcgbHVfY2FjaGVfbnIgPSBMVV9DQUNIRV9OUl9ERUZBVUxUOworbW9kdWxlX3BhcmFtKGx1X2NhY2hlX25yLCBsb25nLCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobHVfY2FjaGVfbnIsICJNYXhpbXVtIG51bWJlciBvZiBvYmplY3RzIGluIGx1X29iamVjdCBjYWNoZSIpOworCiBzdGF0aWMgdm9pZCBsdV9vYmplY3RfZnJlZShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBsdV9vYmplY3QgKm8pOwogc3RhdGljIF9fdTMyIGxzX3N0YXRzX3JlYWQoc3RydWN0IGxwcm9jZnNfc3RhdHMgKnN0YXRzLCBpbnQgaWR4KTsKIApAQCAtMzEwLDEwICszMzgsMTAgQEAKIAlzdHJ1Y3QgY2ZzX2hhc2hfYmQJICAgIGJkMjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgICAgICBkaXNwb3NlOwogCWludAkJICAgICAgZGlkX3N0aDsKLQlpbnQJCSAgICAgIHN0YXJ0OworCXVuc2lnbmVkIGludCBzdGFydDsKIAlpbnQJCSAgICAgIGNvdW50OwogCWludAkJICAgICAgYm5yOwotCWludAkJICAgICAgaTsKKwl1bnNpZ25lZCBpbnQgaTsKIAogCWlmIChPQkRfRkFJTF9DSEVDSyhPQkRfRkFJTF9PQkRfTk9fTFJVKSkKIAkJcmV0dXJuIDA7CkBAIC0zMjQsOCArMzUyLDEzIEBACiAJICogdGhlIGRpc3Bvc2UgbGlzdCwgcmVtb3ZpbmcgdGhlbSBmcm9tIExSVSBhbmQgaGFzaCB0YWJsZS4KIAkgKi8KIAlzdGFydCA9IHMtPmxzX3B1cmdlX3N0YXJ0OwotCWJuciA9IChuciA9PSB+MCkgPyAtMSA6IG5yIC8gQ0ZTX0hBU0hfTkJLVChzLT5sc19vYmpfaGFzaCkgKyAxOworCWJuciA9IChuciA9PSB+MCkgPyAtMSA6IG5yIC8gKGludClDRlNfSEFTSF9OQktUKHMtPmxzX29ial9oYXNoKSArIDE7CiAgYWdhaW46CisJLyoKKwkgKiBJdCBkb2Vzbid0IG1ha2UgYW55IHNlbnNlIHRvIG1ha2UgcHVyZ2UgdGhyZWFkcyBwYXJhbGxlbCwgdGhhdCBjYW4KKwkgKiBvbmx5IGJyaW5nIHRyb3VibGVzIHRvIHVzLiBTZWUgTFUtNTMzMS4KKwkgKi8KKwltdXRleF9sb2NrKCZzLT5sc19wdXJnZV9tdXRleCk7CiAJZGlkX3N0aCA9IDA7CiAJY2ZzX2hhc2hfZm9yX2VhY2hfYnVja2V0KHMtPmxzX29ial9oYXNoLCAmYmQsIGkpIHsKIAkJaWYgKGkgPCBzdGFydCkKQEAgLTM3MSw2ICs0MDQsNyBAQAogCQlpZiAobnIgPT0gMCkKIAkJCWJyZWFrOwogCX0KKwltdXRleF91bmxvY2soJnMtPmxzX3B1cmdlX211dGV4KTsKIAogCWlmIChuciAhPSAwICYmIGRpZF9zdGggJiYgc3RhcnQgIT0gMCkgewogCQlzdGFydCA9IDA7IC8qIHJlc3RhcnQgZnJvbSB0aGUgZmlyc3QgYnVja2V0ICovCkBAIC01NzMsNiArNjA3LDI3IEBACiAJcmV0dXJuIGx1X29iamVjdF9maW5kX2F0KGVudiwgZGV2LT5sZF9zaXRlLT5sc190b3BfZGV2LCBmLCBjb25mKTsKIH0KIAorLyoKKyAqIExpbWl0IHRoZSBsdV9vYmplY3QgY2FjaGUgdG8gYSBtYXhpbXVtIG9mIGx1X2NhY2hlX25yIG9iamVjdHMuICBCZWNhdXNlCisgKiB0aGUgY2FsY3VsYXRpb24gZm9yIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyB0byByZWNsYWltIGlzIG5vdCBjb3ZlcmVkIGJ5CisgKiBhIGxvY2sgdGhlIG1heGltdW0gbnVtYmVyIG9mIG9iamVjdHMgaXMgY2FwcGVkIGJ5IExVX0NBQ0hFX01BWF9BREpVU1QuCisgKiBUaGlzIGVuc3VyZXMgdGhhdCBtYW55IGNvbmN1cnJlbnQgdGhyZWFkcyB3aWxsIG5vdCBhY2NpZGVudGFsbHkgcHVyZ2UKKyAqIHRoZSBlbnRpcmUgY2FjaGUuCisgKi8KK3N0YXRpYyB2b2lkIGx1X29iamVjdF9saW1pdChjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBsdV9kZXZpY2UgKmRldikKK3sKKwlfX3U2NCBzaXplLCBucjsKKworCWlmIChsdV9jYWNoZV9uciA9PSBMVV9DQUNIRV9OUl9VTkxJTUlURUQpCisJCXJldHVybjsKKworCXNpemUgPSBjZnNfaGFzaF9zaXplX2dldChkZXYtPmxkX3NpdGUtPmxzX29ial9oYXNoKTsKKwluciA9IChfX3U2NClsdV9jYWNoZV9ucjsKKwlpZiAoc2l6ZSA+IG5yKQorCQlsdV9zaXRlX3B1cmdlKGVudiwgZGV2LT5sZF9zaXRlLAorCQkJICAgICAgbWluX3QoX191NjQsIHNpemUgLSBuciwgTFVfQ0FDSEVfTlJfTUFYX0FESlVTVCkpOworfQorCiBzdGF0aWMgc3RydWN0IGx1X29iamVjdCAqbHVfb2JqZWN0X25ldyhjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsCiAJCQkJICAgICAgIHN0cnVjdCBsdV9kZXZpY2UgKmRldiwKIAkJCQkgICAgICAgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZiwKQEAgLTU5MCw2ICs2NDUsOSBAQAogCWNmc19oYXNoX2JkX2dldF9hbmRfbG9jayhocywgKHZvaWQgKilmLCAmYmQsIDEpOwogCWNmc19oYXNoX2JkX2FkZF9sb2NrZWQoaHMsICZiZCwgJm8tPmxvX2hlYWRlci0+bG9oX2hhc2gpOwogCWNmc19oYXNoX2JkX3VubG9jayhocywgJmJkLCAxKTsKKworCWx1X29iamVjdF9saW1pdChlbnYsIGRldik7CisKIAlyZXR1cm4gbzsKIH0KIApAQCAtNjU2LDYgKzcxNCw5IEBACiAJaWYgKGxpa2VseShQVFJfRVJSKHNoYWRvdykgPT0gLUVOT0VOVCkpIHsKIAkJY2ZzX2hhc2hfYmRfYWRkX2xvY2tlZChocywgJmJkLCAmby0+bG9faGVhZGVyLT5sb2hfaGFzaCk7CiAJCWNmc19oYXNoX2JkX3VubG9jayhocywgJmJkLCAxKTsKKworCQlsdV9vYmplY3RfbGltaXQoZW52LCBkZXYpOworCiAJCXJldHVybiBvOwogCX0KIApAQCAtNzA2LDEzICs3NjcsMTUgQEAKIAlzdHJ1Y3QgbHVfb2JqZWN0ICpvYmo7CiAKIAl0b3AgPSBsdV9vYmplY3RfZmluZChlbnYsIGRldiwgZiwgY29uZik7Ci0JaWYgKCFJU19FUlIodG9wKSkgewotCQlvYmogPSBsdV9vYmplY3RfbG9jYXRlKHRvcC0+bG9faGVhZGVyLCBkZXYtPmxkX3R5cGUpOwotCQlpZiAoIW9iaikKLQkJCWx1X29iamVjdF9wdXQoZW52LCB0b3ApOwotCX0gZWxzZSB7Ci0JCW9iaiA9IHRvcDsKKwlpZiAoSVNfRVJSKHRvcCkpCisJCXJldHVybiB0b3A7CisKKwlvYmogPSBsdV9vYmplY3RfbG9jYXRlKHRvcC0+bG9faGVhZGVyLCBkZXYtPmxkX3R5cGUpOworCWlmICh1bmxpa2VseSghb2JqKSkgeworCQlsdV9vYmplY3RfcHV0KGVudiwgdG9wKTsKKwkJb2JqID0gRVJSX1BUUigtRU5PRU5UKTsKIAl9CisKIAlyZXR1cm4gb2JqOwogfQogRVhQT1JUX1NZTUJPTChsdV9vYmplY3RfZmluZF9zbGljZSk7CkBAIC03MjYsMzQgKzc4OSwzMSBAQAogewogCWludCByZXN1bHQgPSAwOwogCisJYXRvbWljX3NldCgmbGR0LT5sZHRfZGV2aWNlX25yLCAwKTsKIAlJTklUX0xJU1RfSEVBRCgmbGR0LT5sZHRfbGlua2FnZSk7CiAJaWYgKGxkdC0+bGR0X29wcy0+bGR0b19pbml0KQogCQlyZXN1bHQgPSBsZHQtPmxkdF9vcHMtPmxkdG9faW5pdChsZHQpOwotCWlmIChyZXN1bHQgPT0gMCkKKworCWlmICghcmVzdWx0KSB7CisJCXNwaW5fbG9jaygmb2JkX3R5cGVzX2xvY2spOwogCQlsaXN0X2FkZCgmbGR0LT5sZHRfbGlua2FnZSwgJmx1X2RldmljZV90eXBlcyk7CisJCXNwaW5fdW5sb2NrKCZvYmRfdHlwZXNfbG9jayk7CisJfQorCiAJcmV0dXJuIHJlc3VsdDsKIH0KIEVYUE9SVF9TWU1CT0wobHVfZGV2aWNlX3R5cGVfaW5pdCk7CiAKIHZvaWQgbHVfZGV2aWNlX3R5cGVfZmluaShzdHJ1Y3QgbHVfZGV2aWNlX3R5cGUgKmxkdCkKIHsKKwlzcGluX2xvY2soJm9iZF90eXBlc19sb2NrKTsKIAlsaXN0X2RlbF9pbml0KCZsZHQtPmxkdF9saW5rYWdlKTsKKwlzcGluX3VubG9jaygmb2JkX3R5cGVzX2xvY2spOwogCWlmIChsZHQtPmxkdF9vcHMtPmxkdG9fZmluaSkKIAkJbGR0LT5sZHRfb3BzLT5sZHRvX2ZpbmkobGR0KTsKIH0KIEVYUE9SVF9TWU1CT0wobHVfZGV2aWNlX3R5cGVfZmluaSk7CiAKLXZvaWQgbHVfdHlwZXNfc3RvcCh2b2lkKQotewotCXN0cnVjdCBsdV9kZXZpY2VfdHlwZSAqbGR0OwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShsZHQsICZsdV9kZXZpY2VfdHlwZXMsIGxkdF9saW5rYWdlKSB7Ci0JCWlmIChsZHQtPmxkdF9kZXZpY2VfbnIgPT0gMCAmJiBsZHQtPmxkdF9vcHMtPmxkdG9fc3RvcCkKLQkJCWxkdC0+bGR0X29wcy0+bGR0b19zdG9wKGxkdCk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChsdV90eXBlc19zdG9wKTsKLQogLyoqCiAgKiBHbG9iYWwgbGlzdCBvZiBhbGwgc2l0ZXMgb24gdGhpcyBub2RlCiAgKi8KQEAgLTgwOCwyMiArODY4LDE0IEBACiB9CiBFWFBPUlRfU1lNQk9MKGx1X3NpdGVfcHJpbnQpOwogCi1lbnVtIHsKLQlMVV9DQUNIRV9QRVJDRU5UX01BWCAgICAgPSA1MCwKLQlMVV9DQUNIRV9QRVJDRU5UX0RFRkFVTFQgPSAyMAotfTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBsdV9jYWNoZV9wZXJjZW50ID0gTFVfQ0FDSEVfUEVSQ0VOVF9ERUZBVUxUOwotbW9kdWxlX3BhcmFtKGx1X2NhY2hlX3BlcmNlbnQsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGx1X2NhY2hlX3BlcmNlbnQsICJQZXJjZW50YWdlIG9mIG1lbW9yeSB0byBiZSB1c2VkIGFzIGx1X29iamVjdCBjYWNoZSIpOwotCiAvKioKICAqIFJldHVybiBkZXNpcmVkIGhhc2ggdGFibGUgb3JkZXIuCiAgKi8KLXN0YXRpYyBpbnQgbHVfaHRhYmxlX29yZGVyKHZvaWQpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsdV9odGFibGVfb3JkZXIoc3RydWN0IGx1X2RldmljZSAqdG9wKQogeworCXVuc2lnbmVkIGxvbmcgYml0c19tYXggPSBMVV9TSVRFX0JJVFNfTUFYOwogCXVuc2lnbmVkIGxvbmcgY2FjaGVfc2l6ZTsKLQlpbnQgYml0czsKKwl1bnNpZ25lZCBsb25nIGJpdHM7CiAKIAkvKgogCSAqIENhbGN1bGF0ZSBoYXNoIHRhYmxlIHNpemUsIGFzc3VtaW5nIHRoYXQgd2Ugd2FudCByZWFzb25hYmxlCkBAIC04NTQsNyArOTA2LDcgQEAKIAlmb3IgKGJpdHMgPSAxOyAoMSA8PCBiaXRzKSA8IGNhY2hlX3NpemU7ICsrYml0cykgewogCQk7CiAJfQotCXJldHVybiBiaXRzOworCXJldHVybiBjbGFtcF90KHR5cGVvZihiaXRzKSwgYml0cywgTFVfU0lURV9CSVRTX01JTiwgYml0c19tYXgpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgbHVfb2JqX2hvcF9oYXNoKHN0cnVjdCBjZnNfaGFzaCAqaHMsCkBAIC05MzAsMjggKzk4MiwxOCBAQAogLyoqCiAgKiBJbml0aWFsaXplIHNpdGUgXGEgcywgd2l0aCBcYSBkIGFzIHRoZSB0b3AgbGV2ZWwgZGV2aWNlLgogICovCi0jZGVmaW5lIExVX1NJVEVfQklUU19NSU4gICAgMTIKLSNkZWZpbmUgTFVfU0lURV9CSVRTX01BWCAgICAxOQotLyoqCi0gKiB0b3RhbCAyNTYgYnVja2V0cywgd2UgZG9uJ3Qgd2FudCB0b28gbWFueSBidWNrZXRzIGJlY2F1c2U6Ci0gKiAtIGNvbnN1bWUgdG9vIG11Y2ggbWVtb3J5Ci0gKiAtIGF2b2lkIHVuYmFsYW5jZWQgTFJVIGxpc3QKLSAqLwotI2RlZmluZSBMVV9TSVRFX0JLVF9CSVRTICAgIDgKLQogaW50IGx1X3NpdGVfaW5pdChzdHJ1Y3QgbHVfc2l0ZSAqcywgc3RydWN0IGx1X2RldmljZSAqdG9wKQogewogCXN0cnVjdCBsdV9zaXRlX2JrdF9kYXRhICpia3Q7CiAJc3RydWN0IGNmc19oYXNoX2JkIGJkOworCXVuc2lnbmVkIGxvbmcgYml0czsKKwl1bnNpZ25lZCBsb25nIGk7CiAJY2hhciBuYW1lWzE2XTsKLQlpbnQgYml0czsKLQlpbnQgaTsKIAogCW1lbXNldChzLCAwLCBzaXplb2YoKnMpKTsKLQliaXRzID0gbHVfaHRhYmxlX29yZGVyKCk7Ci0Jc25wcmludGYobmFtZSwgMTYsICJsdV9zaXRlXyVzIiwgdG9wLT5sZF90eXBlLT5sZHRfbmFtZSk7Ci0JZm9yIChiaXRzID0gbWluKG1heChMVV9TSVRFX0JJVFNfTUlOLCBiaXRzKSwgTFVfU0lURV9CSVRTX01BWCk7Ci0JICAgICBiaXRzID49IExVX1NJVEVfQklUU19NSU47IGJpdHMtLSkgeworCW11dGV4X2luaXQoJnMtPmxzX3B1cmdlX211dGV4KTsKKwlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJsdV9zaXRlXyVzIiwgdG9wLT5sZF90eXBlLT5sZHRfbmFtZSk7CisJZm9yIChiaXRzID0gbHVfaHRhYmxlX29yZGVyKHRvcCk7IGJpdHMgPj0gTFVfU0lURV9CSVRTX01JTjsgYml0cy0tKSB7CiAJCXMtPmxzX29ial9oYXNoID0gY2ZzX2hhc2hfY3JlYXRlKG5hbWUsIGJpdHMsIGJpdHMsCiAJCQkJCQkgYml0cyAtIExVX1NJVEVfQktUX0JJVFMsCiAJCQkJCQkgc2l6ZW9mKCpia3QpLCAwLCAwLApAQCAtOTU5LDEzICsxMDAxLDE0IEBACiAJCQkJCQkgQ0ZTX0hBU0hfU1BJTl9CS1RMT0NLIHwKIAkJCQkJCSBDRlNfSEFTSF9OT19JVEVNUkVGIHwKIAkJCQkJCSBDRlNfSEFTSF9ERVBUSCB8Ci0JCQkJCQkgQ0ZTX0hBU0hfQVNTRVJUX0VNUFRZKTsKKwkJCQkJCSBDRlNfSEFTSF9BU1NFUlRfRU1QVFkgfAorCQkJCQkJIENGU19IQVNIX0NPVU5URVIpOwogCQlpZiAocy0+bHNfb2JqX2hhc2gpCiAJCQlicmVhazsKIAl9CiAKIAlpZiAoIXMtPmxzX29ial9oYXNoKSB7Ci0JCUNFUlJPUigiZmFpbGVkIHRvIGNyZWF0ZSBsdV9zaXRlIGhhc2ggd2l0aCBiaXRzOiAlZFxuIiwgYml0cyk7CisJCUNFUlJPUigiZmFpbGVkIHRvIGNyZWF0ZSBsdV9zaXRlIGhhc2ggd2l0aCBiaXRzOiAlbHVcbiIsIGJpdHMpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTEwODIsOCArMTEyNSwxMCBAQAogICovCiBpbnQgbHVfZGV2aWNlX2luaXQoc3RydWN0IGx1X2RldmljZSAqZCwgc3RydWN0IGx1X2RldmljZV90eXBlICp0KQogewotCWlmICh0LT5sZHRfZGV2aWNlX25yKysgPT0gMCAmJiB0LT5sZHRfb3BzLT5sZHRvX3N0YXJ0KQorCWlmIChhdG9taWNfaW5jX3JldHVybigmdC0+bGR0X2RldmljZV9ucikgPT0gMSAmJgorCSAgICB0LT5sZHRfb3BzLT5sZHRvX3N0YXJ0KQogCQl0LT5sZHRfb3BzLT5sZHRvX3N0YXJ0KHQpOworCiAJbWVtc2V0KGQsIDAsIHNpemVvZigqZCkpOwogCWF0b21pY19zZXQoJmQtPmxkX3JlZiwgMCk7CiAJZC0+bGRfdHlwZSA9IHQ7CkBAIC0xMDk4LDkgKzExNDMsOCBAQAogICovCiB2b2lkIGx1X2RldmljZV9maW5pKHN0cnVjdCBsdV9kZXZpY2UgKmQpCiB7Ci0Jc3RydWN0IGx1X2RldmljZV90eXBlICp0OworCXN0cnVjdCBsdV9kZXZpY2VfdHlwZSAqdCA9IGQtPmxkX3R5cGU7CiAKLQl0ID0gZC0+bGRfdHlwZTsKIAlpZiAoZC0+bGRfb2JkKSB7CiAJCWQtPmxkX29iZC0+b2JkX2x1X2RldiA9IE5VTEw7CiAJCWQtPmxkX29iZCA9IE5VTEw7CkBAIC0xMTA5LDggKzExNTMsMTAgQEAKIAlsdV9yZWZfZmluaSgmZC0+bGRfcmVmZXJlbmNlKTsKIAlMQVNTRVJURihhdG9taWNfcmVhZCgmZC0+bGRfcmVmKSA9PSAwLAogCQkgIlJlZmNvdW50IGlzICV1XG4iLCBhdG9taWNfcmVhZCgmZC0+bGRfcmVmKSk7Ci0JTEFTU0VSVCh0LT5sZHRfZGV2aWNlX25yID4gMCk7Ci0JaWYgKC0tdC0+bGR0X2RldmljZV9uciA9PSAwICYmIHQtPmxkdF9vcHMtPmxkdG9fc3RvcCkKKwlMQVNTRVJUKGF0b21pY19yZWFkKCZ0LT5sZHRfZGV2aWNlX25yKSA+IDApOworCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnQtPmxkdF9kZXZpY2VfbnIpICYmCisJICAgIHQtPmxkdF9vcHMtPmxkdG9fc3RvcCkKIAkJdC0+bGR0X29wcy0+bGR0b19zdG9wKHQpOwogfQogRVhQT1JUX1NZTUJPTChsdV9kZXZpY2VfZmluaSk7CkBAIC0xMjU0LDcgKzEzMDAsNiBAQAogCQl9CiAJfQogfQotRVhQT1JUX1NZTUJPTChsdV9zdGFja19maW5pKTsKIAogZW51bSB7CiAJLyoqCkBAIC0xMjgxLDcgKzEzMjYsNyBAQAogaW50IGx1X2NvbnRleHRfa2V5X3JlZ2lzdGVyKHN0cnVjdCBsdV9jb250ZXh0X2tleSAqa2V5KQogewogCWludCByZXN1bHQ7Ci0JaW50IGk7CisJdW5zaWduZWQgaW50IGk7CiAKIAlMQVNTRVJUKGtleS0+bGN0X2luaXQpOwogCUxBU1NFUlQoa2V5LT5sY3RfZmluaSk7CkBAIC0xNDc2LDE4ICsxNTIxLDE2IEBACiAJCSsra2V5X3NldF92ZXJzaW9uOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wobHVfY29udGV4dF9rZXlfcXVpZXNjZSk7CiAKIHZvaWQgbHVfY29udGV4dF9rZXlfcmV2aXZlKHN0cnVjdCBsdV9jb250ZXh0X2tleSAqa2V5KQogewogCWtleS0+bGN0X3RhZ3MgJj0gfkxDVF9RVUlFU0NFTlQ7CiAJKytrZXlfc2V0X3ZlcnNpb247CiB9Ci1FWFBPUlRfU1lNQk9MKGx1X2NvbnRleHRfa2V5X3Jldml2ZSk7CiAKIHN0YXRpYyB2b2lkIGtleXNfZmluaShzdHJ1Y3QgbHVfY29udGV4dCAqY3R4KQogewotCWludAlpOworCXVuc2lnbmVkIGludCBpOwogCiAJaWYgKCFjdHgtPmxjX3ZhbHVlKQogCQlyZXR1cm47CkBAIC0xNTAxLDcgKzE1NDQsNyBAQAogCiBzdGF0aWMgaW50IGtleXNfZmlsbChzdHJ1Y3QgbHVfY29udGV4dCAqY3R4KQogewotCWludCBpOworCXVuc2lnbmVkIGludCBpOwogCiAJTElOVlJOVChjdHgtPmxjX3ZhbHVlKTsKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsdV9rZXlzKTsgKytpKSB7CkBAIC0xNjE0LDcgKzE2NTcsNyBAQAogICovCiB2b2lkIGx1X2NvbnRleHRfZXhpdChzdHJ1Y3QgbHVfY29udGV4dCAqY3R4KQogewotCWludCBpOworCXVuc2lnbmVkIGludCBpOwogCiAJTElOVlJOVChjdHgtPmxjX3N0YXRlID09IExDU19FTlRFUkVEKTsKIAljdHgtPmxjX3N0YXRlID0gTENTX0xFRlQ7CkBAIC0xNjQyLDcgKzE2ODUsNiBAQAogewogCXJldHVybiBsaWtlbHkoY3R4LT5sY192ZXJzaW9uID09IGtleV9zZXRfdmVyc2lvbikgPyAwIDoga2V5c19maWxsKGN0eCk7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1X2NvbnRleHRfcmVmaWxsKTsKIAogLyoqCiAgKiBsdV9jdHhfdGFncy9sdV9zZXNfdGFncyB3aWxsIGJlIHVwZGF0ZWQgaWYgdGhlcmUgYXJlIG5ldyB0eXBlcyBvZgpAQCAtMTY5Niw3ICsxNzM4LDcgQEAKIAkJCSAgICAgIHN0cnVjdCBsdV9zaXRlX3N0YXRzICpzdGF0cywgaW50IHBvcHVsYXRlZCkKIHsKIAlzdHJ1Y3QgY2ZzX2hhc2hfYmQgYmQ7Ci0JaW50CSAgIGk7CisJdW5zaWduZWQgaW50IGk7CiAKIAljZnNfaGFzaF9mb3JfZWFjaF9idWNrZXQoaHMsICZiZCwgaSkgewogCQlzdHJ1Y3QgbHVfc2l0ZV9ia3RfZGF0YSAqYmt0ID0gY2ZzX2hhc2hfYmRfZXh0cmFfZ2V0KGhzLCAmYmQpOwpAQCAtMTk0MCwzICsxOTgyLDczIEBACiAJfQogfQogRVhQT1JUX1NZTUJPTChsdV9rbWVtX2ZpbmkpOworCit2b2lkIGx1X2J1Zl9mcmVlKHN0cnVjdCBsdV9idWYgKmJ1ZikKK3sKKwlMQVNTRVJUKGJ1Zik7CisJaWYgKGJ1Zi0+bGJfYnVmKSB7CisJCUxBU1NFUlQoYnVmLT5sYl9sZW4gPiAwKTsKKwkJa3ZmcmVlKGJ1Zi0+bGJfYnVmKTsKKwkJYnVmLT5sYl9idWYgPSBOVUxMOworCQlidWYtPmxiX2xlbiA9IDA7CisJfQorfQorRVhQT1JUX1NZTUJPTChsdV9idWZfZnJlZSk7CisKK3ZvaWQgbHVfYnVmX2FsbG9jKHN0cnVjdCBsdV9idWYgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJTEFTU0VSVChidWYpOworCUxBU1NFUlQoIWJ1Zi0+bGJfYnVmKTsKKwlMQVNTRVJUKCFidWYtPmxiX2xlbik7CisJYnVmLT5sYl9idWYgPSBsaWJjZnNfa3Z6YWxsb2Moc2l6ZSwgR0ZQX05PRlMpOworCWlmIChsaWtlbHkoYnVmLT5sYl9idWYpKQorCQlidWYtPmxiX2xlbiA9IHNpemU7Cit9CitFWFBPUlRfU1lNQk9MKGx1X2J1Zl9hbGxvYyk7CisKK3ZvaWQgbHVfYnVmX3JlYWxsb2Moc3RydWN0IGx1X2J1ZiAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlsdV9idWZfZnJlZShidWYpOworCWx1X2J1Zl9hbGxvYyhidWYsIHNpemUpOworfQorRVhQT1JUX1NZTUJPTChsdV9idWZfcmVhbGxvYyk7CisKK3N0cnVjdCBsdV9idWYgKmx1X2J1Zl9jaGVja19hbmRfYWxsb2Moc3RydWN0IGx1X2J1ZiAqYnVmLCBzaXplX3QgbGVuKQoreworCWlmICghYnVmLT5sYl9idWYgJiYgIWJ1Zi0+bGJfbGVuKQorCQlsdV9idWZfYWxsb2MoYnVmLCBsZW4pOworCisJaWYgKChsZW4gPiBidWYtPmxiX2xlbikgJiYgYnVmLT5sYl9idWYpCisJCWx1X2J1Zl9yZWFsbG9jKGJ1ZiwgbGVuKTsKKworCXJldHVybiBidWY7Cit9CitFWFBPUlRfU1lNQk9MKGx1X2J1Zl9jaGVja19hbmRfYWxsb2MpOworCisvKioKKyAqIEluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBcYSBidWYuCisgKiBwcmVzZXJ2ZXMgb2xkIGRhdGEgaW4gYnVmZmVyCisgKiBvbGQgYnVmZmVyIHJlbWFpbnMgdW5jaGFuZ2VkIG9uIGVycm9yCisgKiBccmV0dmFsIDAgb3IgLUVOT01FTQorICovCitpbnQgbHVfYnVmX2NoZWNrX2FuZF9ncm93KHN0cnVjdCBsdV9idWYgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwljaGFyICpwdHI7CisKKwlpZiAobGVuIDw9IGJ1Zi0+bGJfbGVuKQorCQlyZXR1cm4gMDsKKworCXB0ciA9IGxpYmNmc19rdnphbGxvYyhsZW4sIEdGUF9OT0ZTKTsKKwlpZiAoIXB0cikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBGcmVlIHRoZSBvbGQgYnVmICovCisJaWYgKGJ1Zi0+bGJfYnVmKSB7CisJCW1lbWNweShwdHIsIGJ1Zi0+bGJfYnVmLCBidWYtPmxiX2xlbik7CisJCWt2ZnJlZShidWYtPmxiX2J1Zik7CisJfQorCisJYnVmLT5sYl9idWYgPSBwdHI7CisJYnVmLT5sYl9sZW4gPSBsZW47CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sdXN0cmVfaGFuZGxlcy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHVzdHJlX2hhbmRsZXMuYwppbmRleCAwODJmNTMwLi5jOTQ0NWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sdXN0cmVfaGFuZGxlcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2x1c3RyZV9oYW5kbGVzLmMKQEAgLTEzMCw3ICsxMzAsNyBAQAogfQogRVhQT1JUX1NZTUJPTChjbGFzc19oYW5kbGVfdW5oYXNoKTsKIAotdm9pZCAqY2xhc3NfaGFuZGxlMm9iamVjdChfX3U2NCBjb29raWUpCit2b2lkICpjbGFzc19oYW5kbGUyb2JqZWN0KF9fdTY0IGNvb2tpZSwgY29uc3Qgdm9pZCAqb3duZXIpCiB7CiAJc3RydWN0IGhhbmRsZV9idWNrZXQgKmJ1Y2tldDsKIAlzdHJ1Y3QgcG9ydGFsc19oYW5kbGUgKmg7CkBAIC0xNDUsNyArMTQ1LDcgQEAKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShoLCAmYnVja2V0LT5oZWFkLCBoX2xpbmspIHsKLQkJaWYgKGgtPmhfY29va2llICE9IGNvb2tpZSkKKwkJaWYgKGgtPmhfY29va2llICE9IGNvb2tpZSB8fCBoLT5oX293bmVyICE9IG93bmVyKQogCQkJY29udGludWU7CiAKIAkJc3Bpbl9sb2NrKCZoLT5oX2xvY2spOwpAQCAtMTY0LDggKzE2NCwxMSBAQAogCiB2b2lkIGNsYXNzX2hhbmRsZV9mcmVlX2NiKHN0cnVjdCByY3VfaGVhZCAqcmN1KQogewotCXN0cnVjdCBwb3J0YWxzX2hhbmRsZSAqaCA9IFJDVTJIQU5ETEUocmN1KTsKLQl2b2lkICpwdHIgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWgtPmhfY29va2llOworCXN0cnVjdCBwb3J0YWxzX2hhbmRsZSAqaDsKKwl2b2lkICpwdHI7CisKKwloID0gY29udGFpbmVyX29mKHJjdSwgc3RydWN0IHBvcnRhbHNfaGFuZGxlLCBoX3JjdSk7CisJcHRyID0gKHZvaWQgKikodW5zaWduZWQgbG9uZyloLT5oX2Nvb2tpZTsKIAogCWlmIChoLT5oX29wcy0+aG9wX2ZyZWUpCiAJCWgtPmhfb3BzLT5ob3BfZnJlZShwdHIsIGgtPmhfc2l6ZSk7CkBAIC0yMTQsNyArMjE3LDcgQEAKIAkJc3RydWN0IHBvcnRhbHNfaGFuZGxlICpoOwogCiAJCXNwaW5fbG9jaygmaGFuZGxlX2hhc2hbaV0ubG9jayk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGgsICYoaGFuZGxlX2hhc2hbaV0uaGVhZCksIGhfbGluaykgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShoLCAmaGFuZGxlX2hhc2hbaV0uaGVhZCwgaF9saW5rKSB7CiAJCQlDRVJST1IoImZvcmNlIGNsZWFuIGhhbmRsZSAlI2xseCBhZGRyICVwIG9wcyAlcFxuIiwKIAkJCSAgICAgICBoLT5oX2Nvb2tpZSwgaCwgaC0+aF9vcHMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sdXN0cmVfcGVlci5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHVzdHJlX3BlZXIuYwppbmRleCA1OTc0YTliLi5mZmE3NDBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sdXN0cmVfcGVlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2x1c3RyZV9wZWVyLmMKQEAgLTEzOSw3ICsxMzksNiBAQAogCX0KIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0woY2xhc3NfYWRkX3V1aWQpOwogCiAvKiBEZWxldGUgdGhlIG5pZHMgZm9yIG9uZSB1dWlkIGlmIHNwZWNpZmllZCwgb3RoZXJ3aXNlIGRlbGV0ZSBhbGwgKi8KIGludCBjbGFzc19kZWxfdXVpZChjb25zdCBjaGFyICp1dWlkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3Mvb2JkX2NvbmZpZy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3Mvb2JkX2NvbmZpZy5jCmluZGV4IDBlYWIxMjMuLmJiZWQxYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZF9jb25maWcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9vYmRfY29uZmlnLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNkZWZpbmUgREVCVUdfU1VCU1lTVEVNIFNfQ0xBU1MKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZF9jbGFzcy5oIgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV9pb2N0bC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xvZy5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHByb2Nmc19zdGF0dXMuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9wYXJhbS5oIgpAQCAtMjM3LDcgKzIzOCw3IEBACiAJLyogcmVjb3ZlcnkgZGF0YSAqLwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm9iZC0+b2JkX2V2aWN0X2lucHJvZ3Jlc3Nfd2FpdHEpOwogCi0JbGxvZ19ncm91cF9pbml0KCZvYmQtPm9iZF9vbGcsIEZJRF9TRVFfTExPRyk7CisJbGxvZ19ncm91cF9pbml0KCZvYmQtPm9iZF9vbGcpOwogCiAJb2JkLT5vYmRfY29ubl9pbnByb2dyZXNzID0gMDsKIApAQCAtMjUwLDE1ICsyNTEsNiBAQAogCX0KIAltZW1jcHkob2JkLT5vYmRfdXVpZC51dWlkLCB1dWlkLCBsZW4pOwogCi0JLyogZG8gdGhlIGF0dGFjaCAqLwotCWlmIChPQlAob2JkLCBhdHRhY2gpKSB7Ci0JCXJjID0gT0JQKG9iZCwgYXR0YWNoKShvYmQsIHNpemVvZigqbGNmZyksIGxjZmcpOwotCQlpZiAocmMpIHsKLQkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCiAJLyogRGV0YWNoIGRyb3BzIHRoaXMgKi8KIAlzcGluX2xvY2soJm9iZC0+b2JkX2Rldl9sb2NrKTsKIAlhdG9taWNfc2V0KCZvYmQtPm9iZF9yZWZjb3VudCwgMSk7CkBAIC00MjIsMTcgKzQxNCwxMiBAQAogCX0KIAkvKiBMZWF2ZSB0aGlzIG9uIGZvcmV2ZXIgKi8KIAlvYmQtPm9iZF9zdG9wcGluZyA9IDE7Ci0KLQkvKiB3YWl0IGZvciBhbHJlYWR5LWFycml2ZWQtY29ubmVjdGlvbnMgdG8gZmluaXNoLiAqLwotCXdoaWxlIChvYmQtPm9iZF9jb25uX2lucHJvZ3Jlc3MgPiAwKSB7Ci0JCXNwaW5fdW5sb2NrKCZvYmQtPm9iZF9kZXZfbG9jayk7Ci0KLQkJY29uZF9yZXNjaGVkKCk7Ci0KLQkJc3Bpbl9sb2NrKCZvYmQtPm9iZF9kZXZfbG9jayk7Ci0JfQogCXNwaW5fdW5sb2NrKCZvYmQtPm9iZF9kZXZfbG9jayk7CiAKKwl3aGlsZSAob2JkLT5vYmRfY29ubl9pbnByb2dyZXNzID4gMCkKKwkJeWllbGQoKTsKKwlzbXBfcm1iKCk7CisKIAlpZiAobGNmZy0+bGNmZ19idWZjb3VudCA+PSAyICYmIExVU1RSRV9DRkdfQlVGTEVOKGxjZmcsIDEpID4gMCkgewogCQlmb3IgKGZsYWcgPSBsdXN0cmVfY2ZnX3N0cmluZyhsY2ZnLCAxKTsgKmZsYWcgIT0gMDsgZmxhZysrKQogCQkJc3dpdGNoICgqZmxhZykgewpAQCAtNTI2LDExICs1MTMsNiBAQAogCQkJCUNFUlJPUigiQ2xlYW51cCAlcyByZXR1cm5lZCAlZFxuIiwKIAkJCQkgICAgICAgb2JkLT5vYmRfbmFtZSwgZXJyKTsKIAkJfQotCQlpZiAoT0JQKG9iZCwgZGV0YWNoKSkgewotCQkJZXJyID0gT0JQKG9iZCwgZGV0YWNoKShvYmQpOwotCQkJaWYgKGVycikKLQkJCQlDRVJST1IoIkRldGFjaCByZXR1cm5lZCAlZFxuIiwgZXJyKTsKLQkJfQogCQljbGFzc19yZWxlYXNlX2RldihvYmQpOwogCX0KIH0KQEAgLTc1Niw3ICs3MzgsNyBAQAogCX0KIAogCXN0YXJ0ID0ga3RpbWVfZ2V0KCk7Ci0JcmMgPSBjYWxsX3VzZXJtb2RlaGVscGVyKGFyZ3ZbMF0sIGFyZ3YsIE5VTEwsIDEpOworCXJjID0gY2FsbF91c2VybW9kZWhlbHBlcihhcmd2WzBdLCBhcmd2LCBOVUxMLCBVTUhfV0FJVF9QUk9DKTsKIAllbmQgPSBrdGltZV9nZXQoKTsKIAogCWlmIChyYyA8IDApIHsKQEAgLTEwMjYsNyArMTAwOCw3IEBACiAKIAkJCQkJb2xkZnMgPSBnZXRfZnMoKTsKIAkJCQkJc2V0X2ZzKEtFUk5FTF9EUyk7Ci0JCQkJCXJjID0gKHZhci0+Zm9wcy0+d3JpdGUpKCZmYWtlZmlsZSwgc3ZhbCwKKwkJCQkJcmMgPSB2YXItPmZvcHMtPndyaXRlKCZmYWtlZmlsZSwgc3ZhbCwKIAkJCQkJCQkJdmFsbGVuLCBOVUxMKTsKIAkJCQkJc2V0X2ZzKG9sZGZzKTsKIAkJCQl9CkBAIC0xMDYwLDggKzEwNDIsNiBAQAogfQogRVhQT1JUX1NZTUJPTChjbGFzc19wcm9jZXNzX3Byb2NfcGFyYW0pOwogCi1leHRlcm4gaW50IGx1c3RyZV9jaGVja19leGNsdXNpb24oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY2hhciAqc3ZuYW1lKTsKLQogLyoqIFBhcnNlIGEgY29uZmlndXJhdGlvbiBsbG9nLCBkb2luZyB2YXJpb3VzIG1hbmlwdWxhdGlvbnMgb24gdGhlbQogICogZm9yIHZhcmlvdXMgcmVhc29ucywgKG1vZGlmaWNhdGlvbnMgZm9yIGNvbXBhdGliaWxpdHksIHNraXAgb2Jzb2xldGUKICAqIHJlY29yZHMsIGNoYW5nZSB1dWlkcywgZXRjKSwgdGhlbiBjbGFzc19wcm9jZXNzX2NvbmZpZygpIHJlc3VsdGluZwpAQCAtMTMxNywzMyArMTI5NywzMyBAQAogCWlmIChyYyA8IDApCiAJCXJldHVybiByYzsKIAotCXB0ciArPSBzbnByaW50ZihwdHIsIGVuZC1wdHIsICJjbWQ9JTA1eCAiLCBsY2ZnLT5sY2ZnX2NvbW1hbmQpOworCXB0ciArPSBzbnByaW50ZihwdHIsIGVuZCAtIHB0ciwgImNtZD0lMDV4ICIsIGxjZmctPmxjZmdfY29tbWFuZCk7CiAJaWYgKGxjZmctPmxjZmdfZmxhZ3MpCi0JCXB0ciArPSBzbnByaW50ZihwdHIsIGVuZC1wdHIsICJmbGFncz0lIzA4eCAiLAorCQlwdHIgKz0gc25wcmludGYocHRyLCBlbmQgLSBwdHIsICJmbGFncz0lIzA4eCAiLAogCQkJCWxjZmctPmxjZmdfZmxhZ3MpOwogCiAJaWYgKGxjZmctPmxjZmdfbnVtKQotCQlwdHIgKz0gc25wcmludGYocHRyLCBlbmQtcHRyLCAibnVtPSUjMDh4ICIsIGxjZmctPmxjZmdfbnVtKTsKKwkJcHRyICs9IHNucHJpbnRmKHB0ciwgZW5kIC0gcHRyLCAibnVtPSUjMDh4ICIsIGxjZmctPmxjZmdfbnVtKTsKIAogCWlmIChsY2ZnLT5sY2ZnX25pZCkgewogCQljaGFyIG5pZHN0cltMTkVUX05JRFNUUl9TSVpFXTsKIAogCQlsaWJjZnNfbmlkMnN0cl9yKGxjZmctPmxjZmdfbmlkLCBuaWRzdHIsIHNpemVvZihuaWRzdHIpKTsKLQkJcHRyICs9IHNucHJpbnRmKHB0ciwgZW5kLXB0ciwgIm5pZD0lcyglI2xseClcbiAgICAgIiwKKwkJcHRyICs9IHNucHJpbnRmKHB0ciwgZW5kIC0gcHRyLCAibmlkPSVzKCUjbGx4KVxuICAgICAiLAogCQkJCW5pZHN0ciwgbGNmZy0+bGNmZ19uaWQpOwogCX0KIAogCWlmIChsY2ZnLT5sY2ZnX2NvbW1hbmQgPT0gTENGR19NQVJLRVIpIHsKIAkJc3RydWN0IGNmZ19tYXJrZXIgKm1hcmtlciA9IGx1c3RyZV9jZmdfYnVmKGxjZmcsIDEpOwogCi0JCXB0ciArPSBzbnByaW50ZihwdHIsIGVuZC1wdHIsICJtYXJrZXI9JWQoJSN4KSVzICclcyciLAorCQlwdHIgKz0gc25wcmludGYocHRyLCBlbmQgLSBwdHIsICJtYXJrZXI9JWQoJSN4KSVzICclcyciLAogCQkJCW1hcmtlci0+Y21fc3RlcCwgbWFya2VyLT5jbV9mbGFncywKIAkJCQltYXJrZXItPmNtX3RndG5hbWUsIG1hcmtlci0+Y21fY29tbWVudCk7CiAJfSBlbHNlIHsKIAkJaW50IGk7CiAKIAkJZm9yIChpID0gMDsgaSA8ICBsY2ZnLT5sY2ZnX2J1ZmNvdW50OyBpKyspIHsKLQkJCXB0ciArPSBzbnByaW50ZihwdHIsIGVuZC1wdHIsICIlZDolcyAgIiwgaSwKKwkJCXB0ciArPSBzbnByaW50ZihwdHIsIGVuZCAtIHB0ciwgIiVkOiVzICAiLCBpLAogCQkJCQlsdXN0cmVfY2ZnX3N0cmluZyhsY2ZnLCBpKSk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9vYmRfbW91bnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZF9tb3VudC5jCmluZGV4IGFhODRhNTBlLi4wZDNhM2IwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9vYmRfbW91bnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9vYmRfbW91bnQuYwpAQCAtMzcsMTEgKzM3LDExIEBACiAgKi8KIAogI2RlZmluZSBERUJVR19TVUJTWVNURU0gU19DTEFTUwotI2RlZmluZSBEX01PVU5UIChEX1NVUEVSfERfQ09ORklHLyp8RF9XQVJOSU5HICovKQorI2RlZmluZSBEX01PVU5UIChEX1NVUEVSIHwgRF9DT05GSUcvKnxEX1dBUk5JTkcgKi8pCiAjZGVmaW5lIFBSSU5UX0NNRCBDREVCVUcKIAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkLmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9saW51eC9sdXN0cmVfY29tcGF0MjUuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9jb21wYXQuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZF9jbGFzcy5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV91c2VyLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbG9nLmgiCkBAIC02OCw3ICs2OCw3IEBACiAgKiAgIHRoaXMgbG9nLCBhbmQgaXMgYWRkZWQgdG8gdGhlIG1nYydzIGxpc3Qgb2YgbG9ncyB0byBmb2xsb3cuCiAgKi8KIGludCBsdXN0cmVfcHJvY2Vzc19sb2coc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY2hhciAqbG9nbmFtZSwKLQkJICAgICAgc3RydWN0IGNvbmZpZ19sbG9nX2luc3RhbmNlICpjZmcpCisJCSAgICAgICBzdHJ1Y3QgY29uZmlnX2xsb2dfaW5zdGFuY2UgKmNmZykKIHsKIAlzdHJ1Y3QgbHVzdHJlX2NmZyAqbGNmZzsKIAlzdHJ1Y3QgbHVzdHJlX2NmZ19idWZzICpidWZzOwpAQCAtMzg0LDE3ICszODQsMTUgQEAKIAkJCQkgIE9CRF9DT05ORUNUX0ZVTEwyMCB8IE9CRF9DT05ORUNUX0lNUF9SRUNPViB8CiAJCQkJICBPQkRfQ09OTkVDVF9MVkJfVFlQRTsKIAotI2lmIExVU1RSRV9WRVJTSU9OX0NPREUgPCBPQkRfT0NEX1ZFUlNJT04oMywgMiwgNTAsIDApCisjaWYgT0JEX09DRF9WRVJTSU9OKDMsIDAsIDUzLCAwKSA+IExVU1RSRV9WRVJTSU9OX0NPREUKIAlkYXRhLT5vY2RfY29ubmVjdF9mbGFncyB8PSBPQkRfQ09OTkVDVF9NTkVfU1dBQjsKLSNlbHNlCi0jd2FybmluZyAiTFUtMTY0NDogUmVtb3ZlIG9sZCBPQkRfQ09OTkVDVF9NTkVfU1dBQiBmaXh1cCBhbmQgaW1wX25lZWRfbW5lX3N3YWIiCiAjZW5kaWYKIAogCWlmIChsbWRfaXNfY2xpZW50KGxzaS0+bHNpX2xtZCkgJiYKIAkgICAgbHNpLT5sc2lfbG1kLT5sbWRfZmxhZ3MgJiBMTURfRkxHX05PSVIpCiAJCWRhdGEtPm9jZF9jb25uZWN0X2ZsYWdzICY9IH5PQkRfQ09OTkVDVF9JTVBfUkVDT1Y7CiAJZGF0YS0+b2NkX3ZlcnNpb24gPSBMVVNUUkVfVkVSU0lPTl9DT0RFOwotCXJjID0gb2JkX2Nvbm5lY3QoTlVMTCwgJmV4cCwgb2JkLCAmKG9iZC0+b2JkX3V1aWQpLCBkYXRhLCBOVUxMKTsKKwlyYyA9IG9iZF9jb25uZWN0KE5VTEwsICZleHAsIG9iZCwgJm9iZC0+b2JkX3V1aWQsIGRhdGEsIE5VTEwpOwogCWlmIChyYykgewogCQlDRVJST1IoImNvbm5lY3QgZmFpbGVkICVkXG4iLCByYyk7CiAJCWdvdG8gb3V0OwpAQCAtNjcwLDcgKzY2OCw2IEBACiAJfQogCS8qIERyb3AgYSByZWYgdG8gdGhlIG1vdW50ZWQgZGlzayAqLwogCWx1c3RyZV9wdXRfbHNpKHNiKTsKLQlsdV90eXBlc19zdG9wKCk7CiAJcmV0dXJuIHJjOwogfQogRVhQT1JUX1NZTUJPTChsdXN0cmVfY29tbW9uX3B1dF9zdXBlcik7CkBAIC03MzEsNyArNzI4LDcgQEAKIHN0YXRpYyBpbnQgbG1kX21ha2VfZXhjbHVzaW9uKHN0cnVjdCBsdXN0cmVfbW91bnRfZGF0YSAqbG1kLCBjb25zdCBjaGFyICpwdHIpCiB7CiAJY29uc3QgY2hhciAqczEgPSBwdHIsICpzMjsKLQlfX3UzMiBpbmRleCwgKmV4Y2x1ZGVfbGlzdDsKKwlfX3UzMiBpbmRleCA9IDAsICpleGNsdWRlX2xpc3Q7CiAJaW50IHJjID0gMCwgZGV2bWF4OwogCiAJLyogVGhlIHNob3J0ZXN0IGFuIG9zdCBuYW1lIGNhbiBiZSBpcyA4IGNoYXJzOiAtT1NUMDAwMC4KQEAgLTc1OCw3ICs3NTUsNyBAQAogCQkJZXhjbHVkZV9saXN0W2xtZC0+bG1kX2V4Y2x1ZGVfY291bnQrK10gPSBpbmRleDsKIAkJZWxzZQogCQkJQ0RFQlVHKERfTU9VTlQsICJpZ25vcmluZyBleGNsdWRlICUuKnM6IHR5cGUgPSAlI3hcbiIsCi0JCQkgICAgICAgKHVpbnQpKHMyLXMxKSwgczEsIHJjKTsKKwkJCSAgICAgICAodWludCkoczIgLSBzMSksIHMxLCByYyk7CiAJCXMxID0gczI7CiAJCS8qIG5vdyB3ZSBhcmUgcG9pbnRpbmcgYXQgJzonIChuZXh0IGV4Y2x1ZGUpCiAJCSAqIG9yICcsJyAoZW5kIG9mIGV4Y2x1ZGVzKQpAQCAtODgwLDcgKzg3Nyw3IEBACiAgKi8KIHN0YXRpYyBpbnQgbG1kX3BhcnNlKGNoYXIgKm9wdGlvbnMsIHN0cnVjdCBsdXN0cmVfbW91bnRfZGF0YSAqbG1kKQogewotCWNoYXIgKnMxLCAqczIsICpkZXZuYW1lID0gTlVMTDsKKwljaGFyICpzMSwgKnMyLCAqczMsICpkZXZuYW1lID0gTlVMTDsKIAlzdHJ1Y3QgbHVzdHJlX21vdW50X2RhdGEgKnJhdyA9IChzdHJ1Y3QgbHVzdHJlX21vdW50X2RhdGEgKilvcHRpb25zOwogCWludCByYyA9IDA7CiAKQEAgLTkxMyw2ICs5MTAsNyBAQAogCQkvKiBTa2lwIHdoaXRlc3BhY2UgYW5kIGV4dHJhIGNvbW1hcyAqLwogCQl3aGlsZSAoKnMxID09ICcgJyB8fCAqczEgPT0gJywnKQogCQkJczErKzsKKwkJczMgPSBzMTsKIAogCQkvKiBDbGllbnQgb3B0aW9ucyBhcmUgcGFyc2VkIGluIGxsX29wdGlvbnM6IGVnLiBmbG9jaywKIAkJICogdXNlcl94YXR0ciwgYWNsCkBAIC05NzAsNiArOTY4LDcgQEAKIAkJCXJjID0gbG1kX3BhcnNlX21nc3NlYyhsbWQsIHMxICsgNyk7CiAJCQlpZiAocmMpCiAJCQkJZ290byBpbnZhbGlkOworCQkJczMgPSBzMjsKIAkJCWNsZWFyKys7CiAJCS8qIG9zdCBleGNsdXNpb24gbGlzdCAqLwogCQl9IGVsc2UgaWYgKHN0cm5jbXAoczEsICJleGNsdWRlPSIsIDgpID09IDApIHsKQEAgLTk5MCwxMCArOTg5LDE5IEBACiAJCQlzaXplX3QgbGVuZ3RoLCBwYXJhbXNfbGVuZ3RoOwogCQkJY2hhciAqdGFpbCA9IHN0cmNocihzMSArIDYsICcsJyk7CiAKLQkJCWlmICghdGFpbCkKKwkJCWlmICghdGFpbCkgewogCQkJCWxlbmd0aCA9IHN0cmxlbihzMSk7Ci0JCQllbHNlCi0JCQkJbGVuZ3RoID0gdGFpbCAtIHMxOworCQkJfSBlbHNlIHsKKwkJCQlsbmV0X25pZF90IG5pZDsKKwkJCQljaGFyICpwYXJhbV9zdHIgPSB0YWlsICsgMTsKKwkJCQlpbnQgc3VwcGxlbWVudGFyeSA9IDE7CisKKwkJCQl3aGlsZSAoIWNsYXNzX3BhcnNlX25pZF9xdWlldChwYXJhbV9zdHIsICZuaWQsCisJCQkJCQkJICAgICAgJnBhcmFtX3N0cikpIHsKKwkJCQkJc3VwcGxlbWVudGFyeSA9IDA7CisJCQkJfQorCQkJCWxlbmd0aCA9IHBhcmFtX3N0ciAtIHMxIC0gc3VwcGxlbWVudGFyeTsKKwkJCX0KIAkJCWxlbmd0aCAtPSA2OwogCQkJcGFyYW1zX2xlbmd0aCA9IHN0cmxlbihsbWQtPmxtZF9wYXJhbXMpOwogCQkJaWYgKHBhcmFtc19sZW5ndGggKyBsZW5ndGggKyAxID49IExNRF9QQVJBTVNfTUFYTEVOKQpAQCAtMTAwMSw2ICsxMDA5LDcgQEAKIAkJCXN0cm5jYXQobG1kLT5sbWRfcGFyYW1zLCBzMSArIDYsIGxlbmd0aCk7CiAJCQlsbWQtPmxtZF9wYXJhbXNbcGFyYW1zX2xlbmd0aCArIGxlbmd0aF0gPSAnXDAnOwogCQkJc3RybGNhdChsbWQtPmxtZF9wYXJhbXMsICIgIiwgTE1EX1BBUkFNU19NQVhMRU4pOworCQkJczMgPSBzMSArIDYgKyBsZW5ndGg7CiAJCQljbGVhcisrOwogCQl9IGVsc2UgaWYgKHN0cm5jbXAoczEsICJvc2Q9IiwgNCkgPT0gMCkgewogCQkJcmMgPSBsbWRfcGFyc2Vfc3RyaW5nKCZsbWQtPmxtZF9vc2RfdHlwZSwgczEgKyA0KTsKQEAgLTEwOTcsNyArMTEwNiw3IEBACiAJc3RydWN0IGx1c3RyZV9zYl9pbmZvICpsc2k7CiAJaW50IHJjOwogCi0JQ0RFQlVHKERfTU9VTlR8RF9WRlNUUkFDRSwgIlZGUyBPcDogc2IgJXBcbiIsIHNiKTsKKwlDREVCVUcoRF9NT1VOVCB8IERfVkZTVFJBQ0UsICJWRlMgT3A6IHNiICVwXG4iLCBzYik7CiAKIAlsc2kgPSBsdXN0cmVfaW5pdF9sc2koc2IpOwogCWlmICghbHNpKQpAQCAtMTEzMyw3ICsxMTQyLDcgQEAKIAkJfSBlbHNlIHsKIAkJCXJjID0gbHVzdHJlX3N0YXJ0X21nYyhzYik7CiAJCQlpZiAocmMpIHsKLQkJCQlsdXN0cmVfcHV0X2xzaShzYik7CisJCQkJbHVzdHJlX2NvbW1vbl9wdXRfc3VwZXIoc2IpOwogCQkJCWdvdG8gb3V0OwogCQkJfQogCQkJLyogQ29ubmVjdCBhbmQgc3RhcnQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZG8uYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZG8uYwppbmRleCA4NTgzYTRhLi43OTEwNGE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9vYmRvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3Mvb2Jkby5jCkBAIC0xMTIsNyArMTEyLDcgQEAKIH0KIEVYUE9SVF9TWU1CT0wob2Jkb19mcm9tX2lub2RlKTsKIAotdm9pZCBvYmRvX3RvX2lvb2JqKHN0cnVjdCBvYmRvICpvYSwgc3RydWN0IG9iZF9pb29iaiAqaW9vYmopCit2b2lkIG9iZG9fdG9faW9vYmooY29uc3Qgc3RydWN0IG9iZG8gKm9hLCBzdHJ1Y3Qgb2JkX2lvb2JqICppb29iaikKIHsKIAlpb29iai0+aW9vX29pZCA9IG9hLT5vX29pOwogCWlmICh1bmxpa2VseSghKG9hLT5vX3ZhbGlkICYgT0JEX01EX0ZMR1JPVVApKSkKQEAgLTEyNSw3ICsxMjUsOCBAQAogfQogRVhQT1JUX1NZTUJPTChvYmRvX3RvX2lvb2JqKTsKIAotc3RhdGljIHZvaWQgaWF0dHJfZnJvbV9vYmRvKHN0cnVjdCBpYXR0ciAqYXR0ciwgc3RydWN0IG9iZG8gKm9hLCB1MzIgdmFsaWQpCitzdGF0aWMgdm9pZCBpYXR0cl9mcm9tX29iZG8oc3RydWN0IGlhdHRyICphdHRyLCBjb25zdCBzdHJ1Y3Qgb2JkbyAqb2EsCisJCQkgICAgdTMyIHZhbGlkKQogewogCXZhbGlkICY9IG9hLT5vX3ZhbGlkOwogCkBAIC0xNTIsMTIgKzE1MywxNCBAQAogCX0KICNpZiAwICAgLyogeW91IHNob3VsZG4ndCBiZSBhYmxlIHRvIGNoYW5nZSBhIGZpbGUncyB0eXBlIHdpdGggc2V0YXR0ciAqLwogCWlmICh2YWxpZCAmIE9CRF9NRF9GTFRZUEUpIHsKLQkJYXR0ci0+aWFfbW9kZSA9IChhdHRyLT5pYV9tb2RlICYgflNfSUZNVCl8KG9hLT5vX21vZGUgJiBTX0lGTVQpOworCQlhdHRyLT5pYV9tb2RlID0gKGF0dHItPmlhX21vZGUgJiB+U19JRk1UKSB8CisJCQkJKG9hLT5vX21vZGUgJiBTX0lGTVQpOwogCQlhdHRyLT5pYV92YWxpZCB8PSBBVFRSX01PREU7CiAJfQogI2VuZGlmCiAJaWYgKHZhbGlkICYgT0JEX01EX0ZMTU9ERSkgewotCQlhdHRyLT5pYV9tb2RlID0gKGF0dHItPmlhX21vZGUgJiBTX0lGTVQpfChvYS0+b19tb2RlICYgflNfSUZNVCk7CisJCWF0dHItPmlhX21vZGUgPSAoYXR0ci0+aWFfbW9kZSAmIFNfSUZNVCkgfAorCQkJCShvYS0+b19tb2RlICYgflNfSUZNVCk7CiAJCWF0dHItPmlhX3ZhbGlkIHw9IEFUVFJfTU9ERTsKIAkJaWYgKCFpbl9ncm91cF9wKG1ha2Vfa2dpZCgmaW5pdF91c2VyX25zLCBvYS0+b19naWQpKSAmJgogCQkgICAgIWNhcGFibGUoQ0ZTX0NBUF9GU0VUSUQpKQpAQCAtMTczLDcgKzE3Niw3IEBACiAJfQogfQogCi12b2lkIG1kX2Zyb21fb2JkbyhzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwgc3RydWN0IG9iZG8gKm9hLCB1MzIgdmFsaWQpCit2b2lkIG1kX2Zyb21fb2JkbyhzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwgY29uc3Qgc3RydWN0IG9iZG8gKm9hLCB1MzIgdmFsaWQpCiB7CiAJaWF0dHJfZnJvbV9vYmRvKCZvcF9kYXRhLT5vcF9hdHRyLCBvYSwgdmFsaWQpOwogCWlmICh2YWxpZCAmIE9CRF9NRF9GTEJMT0NLUykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkZWNoby9lY2hvX2NsaWVudC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkZWNoby9lY2hvX2NsaWVudC5jCmluZGV4IDViMjljNGEuLjUwNTU4MmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGVjaG8vZWNob19jbGllbnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRlY2hvL2VjaG9fY2xpZW50LmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlICIuLi9pbmNsdWRlL2NsX29iamVjdC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2ZpZC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2FjbC5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV9pb2N0bC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX25ldC5oIgogCiAjaW5jbHVkZSAiZWNob19pbnRlcm5hbC5oIgpAQCAtNjQsMTQgKzY1LDE0IEBACiAKIAlzdHJ1Y3QgZWNob19kZXZpY2UgICAgICplb19kZXY7CiAJc3RydWN0IGxpc3RfaGVhZAkgICAgICBlb19vYmpfY2hhaW47Ci0Jc3RydWN0IGxvdl9zdHJpcGVfbWQgICAqZW9fbHNtOworCXN0cnVjdCBsb3Zfb2luZm8gICAgICAgKmVvX29pbmZvOwogCWF0b21pY190CSAgICBlb19ucGFnZXM7CiAJaW50CQkgICAgIGVvX2RlbGV0ZWQ7CiB9OwogCiBzdHJ1Y3QgZWNob19vYmplY3RfY29uZiB7CiAJc3RydWN0IGNsX29iamVjdF9jb25mICBlb2NfY2w7Ci0Jc3RydWN0IGxvdl9zdHJpcGVfbWQgKiplb2NfbWQ7CisJc3RydWN0IGxvdl9vaW5mbyAgICAgICoqZW9jX29pbmZvOwogfTsKIAogc3RydWN0IGVjaG9fcGFnZSB7CkBAIC0xNTIsOSArMTUzLDYgQEAKIH0KIAogLyoqIEB9IGVjaG9faGVscGVycyAqLwotCi1zdGF0aWMgc3RydWN0IGVjaG9fb2JqZWN0ICpjbF9lY2hvX29iamVjdF9maW5kKHN0cnVjdCBlY2hvX2RldmljZSAqZCwKLQkJCQkJICAgICAgIHN0cnVjdCBsb3Zfc3RyaXBlX21kICoqbHNtKTsKIHN0YXRpYyBpbnQgY2xfZWNob19vYmplY3RfcHV0KHN0cnVjdCBlY2hvX29iamVjdCAqZWNvKTsKIHN0YXRpYyBpbnQgY2xfZWNob19vYmplY3RfYnJ3KHN0cnVjdCBlY2hvX29iamVjdCAqZWNvLCBpbnQgcncsIHU2NCBvZmZzZXQsCiAJCQkgICAgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBpbnQgbnBhZ2VzLCBpbnQgYXN5bmMpOwpAQCAtNDEzLDEwICs0MTEsMTMgQEAKIAljY29uZiA9IGx1MmNsX2NvbmYoY29uZik7CiAJZWNvbmYgPSBjbDJlY2hvX2NvbmYoY2NvbmYpOwogCi0JTEFTU0VSVChlY29uZi0+ZW9jX21kKTsKLQllY28tPmVvX2xzbSA9ICplY29uZi0+ZW9jX21kOwotCS8qIGNsZWFyIHRoZSBsc20gcG9pbnRlciBzbyB0aGF0IGl0IHdvbid0IGdldCBmcmVlZC4gKi8KLQkqZWNvbmYtPmVvY19tZCA9IE5VTEw7CisJTEFTU0VSVChlY29uZi0+ZW9jX29pbmZvKTsKKwkvKgorCSAqIFRyYW5zZmVyIHRoZSBvaW5mbyBwb2ludGVyIHRvIGVjbyB0aGF0IGl0IHdvbid0IGJlCisJICogZnJlZWQuCisJICovCisJZWNvLT5lb19vaW5mbyA9ICplY29uZi0+ZW9jX29pbmZvOworCSplY29uZi0+ZW9jX29pbmZvID0gTlVMTDsKIAogCWVjby0+ZW9fZGV2ID0gZWQ7CiAJYXRvbWljX3NldCgmZWNvLT5lb19ucGFnZXMsIDApOwpAQCAtNDI5LDUyICs0MzAsNiBAQAogCXJldHVybiAwOwogfQogCi0vKiB0YWtlbiBmcm9tIG9zY191bnBhY2ttZCgpICovCi1zdGF0aWMgaW50IGVjaG9fYWxsb2NfbWVtbWQoc3RydWN0IGVjaG9fZGV2aWNlICplZCwKLQkJCSAgICBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqKmxzbXApCi17Ci0JaW50IGxzbV9zaXplOwotCi0JLyogSWYgZXhwb3J0IGlzIGxvdi9vc2MgdGhlbiB1c2UgdGhlaXIgb2JkIG1ldGhvZCAqLwotCWlmIChlZC0+ZWRfbmV4dCkKLQkJcmV0dXJuIG9iZF9hbGxvY19tZW1tZChlZC0+ZWRfZWMtPmVjX2V4cCwgbHNtcCk7Ci0JLyogT0ZEIGhhcyBubyB1bnBhY2ttZCBtZXRob2QsIGRvIGV2ZXJ5dGhpbmcgaGVyZSAqLwotCWxzbV9zaXplID0gbG92X3N0cmlwZV9tZF9zaXplKDEpOwotCi0JTEFTU0VSVCghKmxzbXApOwotCSpsc21wID0ga3phbGxvYyhsc21fc2l6ZSwgR0ZQX05PRlMpOwotCWlmICghKmxzbXApCi0JCXJldHVybiAtRU5PTUVNOwotCi0JKCpsc21wKS0+bHNtX29pbmZvWzBdID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxvdl9vaW5mbyksIEdGUF9OT0ZTKTsKLQlpZiAoISgqbHNtcCktPmxzbV9vaW5mb1swXSkgewotCQlrZnJlZSgqbHNtcCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWxvaV9pbml0KCgqbHNtcCktPmxzbV9vaW5mb1swXSk7Ci0JKCpsc21wKS0+bHNtX21heGJ5dGVzID0gTFVTVFJFX1NUUklQRV9NQVhCWVRFUzsKLQlvc3RpZF9zZXRfc2VxX2VjaG8oJigqbHNtcCktPmxzbV9vaSk7Ci0KLQlyZXR1cm4gbHNtX3NpemU7Ci19Ci0KLXN0YXRpYyBpbnQgZWNob19mcmVlX21lbW1kKHN0cnVjdCBlY2hvX2RldmljZSAqZWQsIHN0cnVjdCBsb3Zfc3RyaXBlX21kICoqbHNtcCkKLXsKLQlpbnQgbHNtX3NpemU7Ci0KLQkvKiBJZiBleHBvcnQgaXMgbG92L29zYyB0aGVuIHVzZSB0aGVpciBvYmQgbWV0aG9kICovCi0JaWYgKGVkLT5lZF9uZXh0KQotCQlyZXR1cm4gb2JkX2ZyZWVfbWVtbWQoZWQtPmVkX2VjLT5lY19leHAsIGxzbXApOwotCS8qIE9GRCBoYXMgbm8gdW5wYWNrbWQgbWV0aG9kLCBkbyBldmVyeXRoaW5nIGhlcmUgKi8KLQlsc21fc2l6ZSA9IGxvdl9zdHJpcGVfbWRfc2l6ZSgxKTsKLQotCWtmcmVlKCgqbHNtcCktPmxzbV9vaW5mb1swXSk7Ci0Ja2ZyZWUoKmxzbXApOwotCSpsc21wID0gTlVMTDsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHZvaWQgZWNob19vYmplY3RfZnJlZShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBsdV9vYmplY3QgKm9iaikKIHsKIAlzdHJ1Y3QgZWNob19vYmplY3QgKmVjbyAgICA9IGNsMmVjaG9fb2JqKGx1MmNsKG9iaikpOwpAQCAtNDg5LDggKzQ0NCw3IEBACiAJbHVfb2JqZWN0X2Zpbmkob2JqKTsKIAlsdV9vYmplY3RfaGVhZGVyX2Zpbmkob2JqLT5sb19oZWFkZXIpOwogCi0JaWYgKGVjby0+ZW9fbHNtKQotCQllY2hvX2ZyZWVfbWVtbWQoZWNvLT5lb19kZXYsICZlY28tPmVvX2xzbSk7CisJa2ZyZWUoZWNvLT5lb19vaW5mbyk7CiAJa21lbV9jYWNoZV9mcmVlKGVjaG9fb2JqZWN0X2ttZW0sIGVjbyk7CiB9CiAKQEAgLTg2NCwyNSArODE4LDIxIEBACiAgKi8KIAogLyogSW50ZXJmYWNlcyB0byBlY2hvIGNsaWVudCBvYmQgZGV2aWNlICovCi1zdGF0aWMgc3RydWN0IGVjaG9fb2JqZWN0ICpjbF9lY2hvX29iamVjdF9maW5kKHN0cnVjdCBlY2hvX2RldmljZSAqZCwKLQkJCQkJICAgICAgIHN0cnVjdCBsb3Zfc3RyaXBlX21kICoqbHNtcCkKK3N0YXRpYyBzdHJ1Y3QgZWNob19vYmplY3QgKgorY2xfZWNob19vYmplY3RfZmluZChzdHJ1Y3QgZWNob19kZXZpY2UgKmQsIGNvbnN0IHN0cnVjdCBvc3RfaWQgKm9pKQogewogCXN0cnVjdCBsdV9lbnYgKmVudjsKIAlzdHJ1Y3QgZWNob190aHJlYWRfaW5mbyAqaW5mbzsKIAlzdHJ1Y3QgZWNob19vYmplY3RfY29uZiAqY29uZjsKLQlzdHJ1Y3QgbG92X3N0cmlwZV9tZCAgICAqbHNtOworCXN0cnVjdCBsb3Zfb2luZm8gKm9pbmZvID0gTlVMTDsKIAlzdHJ1Y3QgZWNob19vYmplY3QgKmVjbzsKIAlzdHJ1Y3QgY2xfb2JqZWN0ICAgKm9iajsKIAlzdHJ1Y3QgbHVfZmlkICpmaWQ7CiAJaW50IHJlZmNoZWNrOwogCWludCByYzsKIAotCUxBU1NFUlQobHNtcCk7Ci0JbHNtID0gKmxzbXA7Ci0JTEFTU0VSVChsc20pOwotCUxBU1NFUlRGKG9zdGlkX2lkKCZsc20tPmxzbV9vaSkgIT0gMCwgRE9TVElEIlxuIiwgUE9TVElEKCZsc20tPmxzbV9vaSkpOwotCUxBU1NFUlRGKG9zdGlkX3NlcSgmbHNtLT5sc21fb2kpID09IEZJRF9TRVFfRUNITywgRE9TVElEIlxuIiwKLQkJIFBPU1RJRCgmbHNtLT5sc21fb2kpKTsKKwlMQVNTRVJURihvc3RpZF9pZChvaSksIERPU1RJRCAiXG4iLCBQT1NUSUQob2kpKTsKKwlMQVNTRVJURihvc3RpZF9zZXEob2kpID09IEZJRF9TRVFfRUNITywgRE9TVElEICJcbiIsIFBPU1RJRChvaSkpOwogCiAJLyogTmV2ZXIgcmV0dXJuIGFuIG9iamVjdCBpZiB0aGUgb2JkIGlzIHRvIGJlIGZyZWVkLiAqLwogCWlmIChlY2hvX2RldjJjbChkKS0+Y2RfbHVfZGV2LmxkX29iZC0+b2JkX3N0b3BwaW5nKQpAQCAtODk1LDE2ICs4NDUsMjQgQEAKIAlpbmZvID0gZWNob19lbnZfaW5mbyhlbnYpOwogCWNvbmYgPSAmaW5mby0+ZXRpX2NvbmY7CiAJaWYgKGQtPmVkX25leHQpIHsKLQkJc3RydWN0IGxvdl9vaW5mbyAqb2luZm8gPSBsc20tPmxzbV9vaW5mb1swXTsKKwkJb2luZm8gPSBremFsbG9jKHNpemVvZigqb2luZm8pLCBHRlBfTk9GUyk7CisJCWlmICghb2luZm8pIHsKKwkJCWVjbyA9IEVSUl9QVFIoLUVOT01FTSk7CisJCQlnb3RvIG91dDsKKwkJfQogCi0JCUxBU1NFUlQob2luZm8pOwotCQlvaW5mby0+bG9pX29pID0gbHNtLT5sc21fb2k7CisJCW9pbmZvLT5sb2lfb2kgPSAqb2k7CiAJCWNvbmYtPmVvY19jbC51LmNvY19vaW5mbyA9IG9pbmZvOwogCX0KLQljb25mLT5lb2NfbWQgPSBsc21wOworCisJLyoKKwkgKiBJZiBlY2hvX29iamVjdF9pbml0KCkgaXMgc3VjY2Vzc2Z1bCB0aGVuIG93bmVyc2hpcCBvZiBvaW5mbworCSAqIGlzIHRyYW5zZmVycmVkIHRvIHRoZSBvYmplY3QuCisJICovCisJY29uZi0+ZW9jX29pbmZvID0gJm9pbmZvOwogCiAJZmlkICA9ICZpbmZvLT5ldGlfZmlkOwotCXJjID0gb3N0aWRfdG9fZmlkKGZpZCwgJmxzbS0+bHNtX29pLCAwKTsKKwlyYyA9IG9zdGlkX3RvX2ZpZChmaWQsIChzdHJ1Y3Qgb3N0X2lkICopb2ksIDApOwogCWlmIChyYyAhPSAwKSB7CiAJCWVjbyA9IEVSUl9QVFIocmMpOwogCQlnb3RvIG91dDsKQEAgLTkyNyw2ICs4ODUsNyBAQAogCX0KIAogb3V0OgorCWtmcmVlKG9pbmZvKTsKIAljbF9lbnZfcHV0KGVudiwgJnJlZmNoZWNrKTsKIAlyZXR1cm4gZWNvOwogfQpAQCAtMTA1MSw3ICsxMDEwLDcgQEAKIAlzdHJ1Y3QgY2xfaW8JICAgICppbzsKIAlzdHJ1Y3QgY2xfcGFnZQkgICpjbHA7CiAJc3RydWN0IGx1c3RyZV9oYW5kbGUgICAgbGggPSB7IDAgfTsKLQlpbnQgcGFnZV9zaXplID0gY2xfcGFnZV9zaXplKG9iaik7CisJc2l6ZV90IHBhZ2Vfc2l6ZSA9IGNsX3BhZ2Vfc2l6ZShvYmopOwogCWludCByZWZjaGVjazsKIAlpbnQgcmM7CiAJaW50IGk7CkBAIC0xMTQ1LDcgKzExMDQsNiBAQAogewogCXN0cnVjdCBlY2hvX29iamVjdCAgICAgKmVjbzsKIAlzdHJ1Y3QgZWNob19jbGllbnRfb2JkICplYyA9IGVkLT5lZF9lYzsKLQlzdHJ1Y3QgbG92X3N0cmlwZV9tZCAgICpsc20gPSBOVUxMOwogCWludAkJICAgICByYzsKIAlpbnQJCSAgICAgY3JlYXRlZCA9IDA7CiAKQEAgLTExNTYsMzAgKzExMTQsMTkgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmMgPSBlY2hvX2FsbG9jX21lbW1kKGVkLCAmbHNtKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNFUlJPUigiQ2Fubm90IGFsbG9jYXRlIG1kOiByYyA9ICVkXG4iLCByYyk7Ci0JCWdvdG8gZmFpbGVkOwotCX0KKwlpZiAoIW9zdGlkX2lkKCZvYS0+b19vaSkpCisJCW9zdGlkX3NldF9pZCgmb2EtPm9fb2ksICsrbGFzdF9vYmplY3RfaWQpOwogCi0JLyogc2V0dXAgb2JqZWN0IElEIGhlcmUgKi8KLQlsc20tPmxzbV9vaSA9IG9hLT5vX29pOwotCi0JaWYgKG9zdGlkX2lkKCZsc20tPmxzbV9vaSkgPT0gMCkKLQkJb3N0aWRfc2V0X2lkKCZsc20tPmxzbV9vaSwgKytsYXN0X29iamVjdF9pZCk7Ci0KLQlyYyA9IG9iZF9jcmVhdGUoZW52LCBlYy0+ZWNfZXhwLCBvYSwgJmxzbSwgb3RpKTsKKwlyYyA9IG9iZF9jcmVhdGUoZW52LCBlYy0+ZWNfZXhwLCBvYSwgb3RpKTsKIAlpZiAocmMgIT0gMCkgewogCQlDRVJST1IoIkNhbm5vdCBjcmVhdGUgb2JqZWN0czogcmMgPSAlZFxuIiwgcmMpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAJY3JlYXRlZCA9IDE7CiAKLQkvKiBTZWUgd2hhdCBvYmplY3QgSUQgd2Ugd2VyZSBnaXZlbiAqLwotCW9hLT5vX29pID0gbHNtLT5sc21fb2k7CiAJb2EtPm9fdmFsaWQgfD0gT0JEX01EX0ZMSUQ7CiAKLQllY28gPSBjbF9lY2hvX29iamVjdF9maW5kKGVkLCAmbHNtKTsKKwllY28gPSBjbF9lY2hvX29iamVjdF9maW5kKGVkLCAmb2EtPm9fb2kpOwogCWlmIChJU19FUlIoZWNvKSkgewogCQlyYyA9IFBUUl9FUlIoZWNvKTsKIAkJZ290byBmYWlsZWQ7CkBAIC0xMTkwLDkgKzExMzcsNyBAQAogCiAgZmFpbGVkOgogCWlmIChjcmVhdGVkICYmIHJjKQotCQlvYmRfZGVzdHJveShlbnYsIGVjLT5lY19leHAsIG9hLCBsc20sIG90aSwgTlVMTCk7Ci0JaWYgKGxzbSkKLQkJZWNob19mcmVlX21lbW1kKGVkLCAmbHNtKTsKKwkJb2JkX2Rlc3Ryb3koZW52LCBlYy0+ZWNfZXhwLCBvYSwgb3RpKTsKIAlpZiAocmMpCiAJCUNFUlJPUigiY3JlYXRlIG9iamVjdCBmYWlsZWQgd2l0aDogcmMgPSAlZFxuIiwgcmMpOwogCXJldHVybiByYzsKQEAgLTEyMDEsMzIgKzExNDYsMjEgQEAKIHN0YXRpYyBpbnQgZWNob19nZXRfb2JqZWN0KHN0cnVjdCBlY2hvX29iamVjdCAqKmVjb3AsIHN0cnVjdCBlY2hvX2RldmljZSAqZWQsCiAJCQkgICBzdHJ1Y3Qgb2JkbyAqb2EpCiB7Ci0Jc3RydWN0IGxvdl9zdHJpcGVfbWQgICAqbHNtID0gTlVMTDsKIAlzdHJ1Y3QgZWNob19vYmplY3QgICAgICplY287CiAJaW50CQkgICAgIHJjOwogCi0JaWYgKChvYS0+b192YWxpZCAmIE9CRF9NRF9GTElEKSA9PSAwIHx8IG9zdGlkX2lkKCZvYS0+b19vaSkgPT0gMCkgewotCQkvKiBkaXNhbGxvdyB1c2Ugb2Ygb2JqZWN0IGlkIDAgKi8KLQkJQ0VSUk9SKCJObyB2YWxpZCBvaWRcbiIpOworCWlmICghKG9hLT5vX3ZhbGlkICYgT0JEX01EX0ZMSUQpIHx8ICEob2EtPm9fdmFsaWQgJiBPQkRfTURfRkxHUk9VUCkgfHwKKwkgICAgIW9zdGlkX2lkKCZvYS0+b19vaSkpIHsKKwkJQ0VSUk9SKCJpbnZhbGlkIG9pZCAiIERPU1RJRCAiXG4iLCBQT1NUSUQoJm9hLT5vX29pKSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJjID0gZWNob19hbGxvY19tZW1tZChlZCwgJmxzbSk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JbHNtLT5sc21fb2kgPSBvYS0+b19vaTsKLQlpZiAoIShvYS0+b192YWxpZCAmIE9CRF9NRF9GTEdST1VQKSkKLQkJb3N0aWRfc2V0X3NlcV9lY2hvKCZsc20tPmxzbV9vaSk7Ci0KIAlyYyA9IDA7Ci0JZWNvID0gY2xfZWNob19vYmplY3RfZmluZChlZCwgJmxzbSk7CisJZWNvID0gY2xfZWNob19vYmplY3RfZmluZChlZCwgJm9hLT5vX29pKTsKIAlpZiAoIUlTX0VSUihlY28pKQogCQkqZWNvcCA9IGVjbzsKIAllbHNlCiAJCXJjID0gUFRSX0VSUihlY28pOwotCWlmIChsc20pCi0JCWVjaG9fZnJlZV9tZW1tZChlZCwgJmxzbSk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0xNDM2LDEzICsxMzcwLDEyIEBACiAJCQlucGFnZXMgPSB0b3RfcGFnZXM7CiAKIAkJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgaSsrLCBvZmYgKz0gUEFHRV9TSVpFKSB7Ci0JCQlybmJbaV0ub2Zmc2V0ID0gb2ZmOwotCQkJcm5iW2ldLmxlbiA9IFBBR0VfU0laRTsKLQkJCXJuYltpXS5mbGFncyA9IGJyd19mbGFnczsKKwkJCXJuYltpXS5ybmJfb2Zmc2V0ID0gb2ZmOworCQkJcm5iW2ldLnJuYl9sZW4gPSBQQUdFX1NJWkU7CisJCQlybmJbaV0ucm5iX2ZsYWdzID0gYnJ3X2ZsYWdzOwogCQl9CiAKIAkJaW9vLmlvb19idWZjbnQgPSBucGFnZXM7Ci0JCW90aS0+b3RpX3RyYW5zbm8gPSAwOwogCiAJCWxwYWdlcyA9IG5wYWdlczsKIAkJcmV0ID0gb2JkX3ByZXBydyhlbnYsIHJ3LCBleHAsIG9hLCAxLCAmaW9vLCBybmIsICZscGFnZXMsCkBAIC0xNDUyLDE0ICsxMzg1LDE0IEBACiAJCUxBU1NFUlQobHBhZ2VzID09IG5wYWdlcyk7CiAKIAkJZm9yIChpID0gMDsgaSA8IGxwYWdlczsgaSsrKSB7Ci0JCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGxuYltpXS5wYWdlOworCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBsbmJbaV0ubG5iX3BhZ2U7CiAKIAkJCS8qIHJlYWQgcGFzdCBlb2Y/ICovCi0JCQlpZiAoIXBhZ2UgICYmIGxuYltpXS5yYyA9PSAwKQorCQkJaWYgKCFwYWdlICAmJiBsbmJbaV0ubG5iX3JjID09IDApCiAJCQkJY29udGludWU7CiAKIAkJCWlmIChhc3luYykKLQkJCQlsbmJbaV0uZmxhZ3MgfD0gT0JEX0JSV19BU1lOQzsKKwkJCQlsbmJbaV0ubG5iX2ZsYWdzIHw9IE9CRF9CUldfQVNZTkM7CiAKIAkJCWlmIChvc3RpZF9pZCgmb2EtPm9fb2kpID09IEVDSE9fUEVSU0lTVEVOVF9PQkpJRCB8fAogCQkJICAgIChvYS0+b192YWxpZCAmIE9CRF9NRF9GTEZMQUdTKSA9PSAwIHx8CkBAIC0xNDY5LDEzICsxNDAyLDEzIEBACiAJCQlpZiAocncgPT0gT0JEX0JSV19XUklURSkKIAkJCQllY2hvX2NsaWVudF9wYWdlX2RlYnVnX3NldHVwKHBhZ2UsIHJ3LAogCQkJCQkJCSAgICBvc3RpZF9pZCgmb2EtPm9fb2kpLAotCQkJCQkJCSAgICAgcm5iW2ldLm9mZnNldCwKLQkJCQkJCQkgICAgIHJuYltpXS5sZW4pOworCQkJCQkJCSAgICAgcm5iW2ldLnJuYl9vZmZzZXQsCisJCQkJCQkJICAgICBybmJbaV0ucm5iX2xlbik7CiAJCQllbHNlCiAJCQkJZWNob19jbGllbnRfcGFnZV9kZWJ1Z19jaGVjayhwYWdlLAogCQkJCQkJCSAgICBvc3RpZF9pZCgmb2EtPm9fb2kpLAotCQkJCQkJCSAgICAgcm5iW2ldLm9mZnNldCwKLQkJCQkJCQkgICAgIHJuYltpXS5sZW4pOworCQkJCQkJCSAgICAgcm5iW2ldLnJuYl9vZmZzZXQsCisJCQkJCQkJICAgICBybmJbaV0ucm5iX2xlbik7CiAJCX0KIAogCQlyZXQgPSBvYmRfY29tbWl0cncoZW52LCBydywgZXhwLCBvYSwgMSwgJmlvbywKQEAgLTE2MTMsOCArMTU0Niw3IEBACiAKIAkJcmMgPSBlY2hvX2dldF9vYmplY3QoJmVjbywgZWQsIG9hKTsKIAkJaWYgKHJjID09IDApIHsKLQkJCXJjID0gb2JkX2Rlc3Ryb3koZW52LCBlYy0+ZWNfZXhwLCBvYSwgTlVMTCwKLQkJCQkJICZkdW1teV9vdGksIE5VTEwpOworCQkJcmMgPSBvYmRfZGVzdHJveShlbnYsIGVjLT5lY19leHAsIG9hLCAmZHVtbXlfb3RpKTsKIAkJCWlmIChyYyA9PSAwKQogCQkJCWVjby0+ZW9fZGVsZXRlZCA9IDE7CiAJCQllY2hvX3B1dF9vYmplY3QoZWNvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGVjaG8vZWNob19pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkZWNoby9lY2hvX2ludGVybmFsLmgKaW5kZXggZjUwMzRhMi4uOTY2NDE0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkZWNoby9lY2hvX2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkZWNoby9lY2hvX2ludGVybmFsLmgKQEAgLTMzLDkgKzMzLDkgQEAKIAogLyogVGhlIHBlcnNpc3RlbnQgb2JqZWN0IChpLmUuIGFjdHVhbGx5IHN0b3JlcyBzdHVmZiEpICovCiAjZGVmaW5lIEVDSE9fUEVSU0lTVEVOVF9PQkpJRCAgICAxVUxMCi0jZGVmaW5lIEVDSE9fUEVSU0lTVEVOVF9TSVpFICAgICAoKF9fdTY0KSgxPDwyMCkpCisjZGVmaW5lIEVDSE9fUEVSU0lTVEVOVF9TSVpFICAgICAoKF9fdTY0KSgxIDw8IDIwKSkKIAogLyogYmxvY2sgc2l6ZSB0byB1c2UgZm9yIGRhdGEgdmVyaWZpY2F0aW9uICovCi0jZGVmaW5lIE9CRF9FQ0hPX0JMT0NLX1NJWkUJKDQ8PDEwKQorI2RlZmluZSBPQkRfRUNIT19CTE9DS19TSVpFCSg0IDw8IDEwKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9scHJvY19vc2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9scHJvY19vc2MuYwppbmRleCA3ZTgzZDM5Li5mMDA2MmQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2MvbHByb2Nfb3NjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL2xwcm9jX29zYy5jCkBAIC0xMTksNiArMTE5LDcgQEAKIAogCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKIAljbGktPmNsX21heF9ycGNzX2luX2ZsaWdodCA9IHZhbDsKKwljbGllbnRfYWRqdXN0X21heF9kaXJ0eShjbGkpOwogCXNwaW5fdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwogCiAJcmV0dXJuIGNvdW50OwpAQCAtMTM2LDEwICsxMzcsMTAgQEAKIAlpbnQgbXVsdDsKIAogCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQl2YWwgPSBjbGktPmNsX2RpcnR5X21heDsKKwl2YWwgPSBjbGktPmNsX2RpcnR5X21heF9wYWdlczsKIAlzcGluX3VubG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKIAotCW11bHQgPSAxIDw8IDIwOworCW11bHQgPSAxIDw8ICgyMCAtIFBBR0VfU0hJRlQpOwogCXJldHVybiBscHJvY2ZzX3JlYWRfZnJhY19oZWxwZXIoYnVmLCBQQUdFX1NJWkUsIHZhbCwgbXVsdCk7CiB9CiAKQEAgLTE2Niw3ICsxNjcsNyBAQAogCQlyZXR1cm4gLUVSQU5HRTsKIAogCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQljbGktPmNsX2RpcnR5X21heCA9ICh1MzIpKHBhZ2VzX251bWJlciA8PCBQQUdFX1NISUZUKTsKKwljbGktPmNsX2RpcnR5X21heF9wYWdlcyA9IHBhZ2VzX251bWJlcjsKIAlvc2Nfd2FrZV9jYWNoZV93YWl0ZXJzKGNsaSk7CiAJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CiAKQEAgLTE4MSwxMSArMTgyLDExIEBACiAJaW50IHNoaWZ0ID0gMjAgLSBQQUdFX1NISUZUOwogCiAJc2VxX3ByaW50ZihtLAotCQkgICAidXNlZF9tYjogJWRcbiIKLQkJICAgImJ1c3lfY250OiAlZFxuIiwKLQkJICAgKGF0b21pY19yZWFkKCZjbGktPmNsX2xydV9pbl9saXN0KSArCi0JCSAgICBhdG9taWNfcmVhZCgmY2xpLT5jbF9scnVfYnVzeSkpID4+IHNoaWZ0LAotCQkgICBhdG9taWNfcmVhZCgmY2xpLT5jbF9scnVfYnVzeSkpOworCQkgICAidXNlZF9tYjogJWxkXG4iCisJCSAgICJidXN5X2NudDogJWxkXG4iLAorCQkgICAoYXRvbWljX2xvbmdfcmVhZCgmY2xpLT5jbF9scnVfaW5fbGlzdCkgKworCQkgICAgYXRvbWljX2xvbmdfcmVhZCgmY2xpLT5jbF9scnVfYnVzeSkpID4+IHNoaWZ0LAorCQkgICBhdG9taWNfbG9uZ19yZWFkKCZjbGktPmNsX2xydV9idXN5KSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE5Nyw4ICsxOTgsMTAgQEAKIHsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqZGV2ID0gKChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGEpLT5wcml2YXRlOwogCXN0cnVjdCBjbGllbnRfb2JkICpjbGkgPSAmZGV2LT51LmNsaTsKLQlpbnQgcGFnZXNfbnVtYmVyLCBtdWx0LCByYzsKKwlsb25nIHBhZ2VzX251bWJlciwgcmM7CiAJY2hhciBrZXJuYnVmWzEyOF07CisJaW50IG11bHQ7CisJdTY0IHZhbDsKIAogCWlmIChjb3VudCA+PSBzaXplb2Yoa2VybmJ1ZikpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjEwLDE0ICsyMTMsMTggQEAKIAltdWx0ID0gMSA8PCAoMjAgLSBQQUdFX1NISUZUKTsKIAlidWZmZXIgKz0gbHByb2Nmc19maW5kX25hbWVkX3ZhbHVlKGtlcm5idWYsICJ1c2VkX21iOiIsICZjb3VudCkgLQogCQkgIGtlcm5idWY7Ci0JcmMgPSBscHJvY2ZzX3dyaXRlX2ZyYWNfaGVscGVyKGJ1ZmZlciwgY291bnQsICZwYWdlc19udW1iZXIsIG11bHQpOworCXJjID0gbHByb2Nmc193cml0ZV9mcmFjX3U2NF9oZWxwZXIoYnVmZmVyLCBjb3VudCwgJnZhbCwgbXVsdCk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKKwlpZiAodmFsID4gTE9OR19NQVgpCisJCXJldHVybiAtRVJBTkdFOworCXBhZ2VzX251bWJlciA9IChsb25nKXZhbDsKKwogCWlmIChwYWdlc19udW1iZXIgPCAwKQogCQlyZXR1cm4gLUVSQU5HRTsKIAotCXJjID0gYXRvbWljX3JlYWQoJmNsaS0+Y2xfbHJ1X2luX2xpc3QpIC0gcGFnZXNfbnVtYmVyOworCXJjID0gYXRvbWljX2xvbmdfcmVhZCgmY2xpLT5jbF9scnVfaW5fbGlzdCkgLSBwYWdlc19udW1iZXI7CiAJaWYgKHJjID4gMCkgewogCQlzdHJ1Y3QgbHVfZW52ICplbnY7CiAJCWludCByZWZjaGVjazsKQEAgLTI0NCw3ICsyNTEsNyBAQAogCWludCBsZW47CiAKIAlzcGluX2xvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Ci0JbGVuID0gc3ByaW50ZihidWYsICIlbHVcbiIsIGNsaS0+Y2xfZGlydHkpOworCWxlbiA9IHNwcmludGYoYnVmLCAiJWx1XG4iLCBjbGktPmNsX2RpcnR5X3BhZ2VzIDw8IFBBR0VfU0hJRlQpOwogCXNwaW5fdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwogCiAJcmV0dXJuIGxlbjsKQEAgLTU4Myw2ICs1OTAsNyBAQAogCX0KIAlzcGluX2xvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CiAJY2xpLT5jbF9tYXhfcGFnZXNfcGVyX3JwYyA9IHZhbDsKKwljbGllbnRfYWRqdXN0X21heF9kaXJ0eShjbGkpOwogCXNwaW5fdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwogCiAJcmV0dXJuIGNvdW50OwpAQCAtNTk2LDEzICs2MDQsMTQgQEAKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBvYmRfZGV2aWNlLAogCQkJCQkgICAgICBvYmRfa29iaik7CiAJc3RydWN0IGNsaWVudF9vYmQgKmNsaSA9ICZkZXYtPnUuY2xpOwotCWludCBwYWdlcywgbWI7CisJbG9uZyBwYWdlczsKKwlpbnQgbWI7CiAKLQlwYWdlcyA9IGF0b21pY19yZWFkKCZjbGktPmNsX3Vuc3RhYmxlX2NvdW50KTsKKwlwYWdlcyA9IGF0b21pY19sb25nX3JlYWQoJmNsaS0+Y2xfdW5zdGFibGVfY291bnQpOwogCW1iID0gKHBhZ2VzICogUEFHRV9TSVpFKSA+PiAyMDsKIAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgInVuc3RhYmxlX3BhZ2VzOiAlOGRcbiIKLQkJICAgICAgICJ1bnN0YWJsZV9tYjogICAgJThkXG4iLCBwYWdlcywgbWIpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgInVuc3RhYmxlX3BhZ2VzOiAlMjBsZFxuIgorCQkgICAgICAgInVuc3RhYmxlX21iOiAgICAgICAgICAgICAgJTEwZFxuIiwgcGFnZXMsIG1iKTsKIH0KIExVU1RSRV9ST19BVFRSKHVuc3RhYmxlX3N0YXRzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19jYWNoZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19jYWNoZS5jCmluZGV4IGQwMTExMzUuLjRiYmUyMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfY2FjaGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2NhY2hlLmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIAogc3RhdGljIHZvaWQgb3NjX3VwZGF0ZV9wZW5kaW5nKHN0cnVjdCBvc2Nfb2JqZWN0ICpvYmosIGludCBjbWQsIGludCBkZWx0YSk7CiBzdGF0aWMgaW50IG9zY19leHRlbnRfd2FpdChjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBvc2NfZXh0ZW50ICpleHQsCi0JCQkgICBpbnQgc3RhdGUpOworCQkJICAgZW51bSBvc2NfZXh0ZW50X3N0YXRlIHN0YXRlKTsKIHN0YXRpYyB2b2lkIG9zY19hcF9jb21wbGV0aW9uKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsaWVudF9vYmQgKmNsaSwKIAkJCSAgICAgIHN0cnVjdCBvc2NfYXN5bmNfcGFnZSAqb2FwLCBpbnQgc2VudCwgaW50IHJjKTsKIHN0YXRpYyBpbnQgb3NjX21ha2VfcmVhZHkoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3Qgb3NjX2FzeW5jX3BhZ2UgKm9hcCwKQEAgLTE3Nyw3ICsxNzcsNyBAQAogewogCXN0cnVjdCBvc2Nfb2JqZWN0ICpvYmogPSBleHQtPm9lX29iajsKIAlzdHJ1Y3Qgb3NjX2FzeW5jX3BhZ2UgKm9hcDsKLQlpbnQgcGFnZV9jb3VudDsKKwlzaXplX3QgcGFnZV9jb3VudDsKIAlpbnQgcmMgPSAwOwogCiAJaWYgKCFvc2Nfb2JqZWN0X2lzX2xvY2tlZChvYmopKSB7CkBAIC02MzIsNyArNjMyLDcgQEAKICAqLwogc3RhdGljIHN0cnVjdCBvc2NfZXh0ZW50ICpvc2NfZXh0ZW50X2ZpbmQoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LAogCQkJCQkgIHN0cnVjdCBvc2Nfb2JqZWN0ICpvYmosIHBnb2ZmX3QgaW5kZXgsCi0JCQkJCSAgaW50ICpncmFudHMpCisJCQkJCSAgdW5zaWduZWQgaW50ICpncmFudHMpCiB7CiAJc3RydWN0IGNsaWVudF9vYmQgKmNsaSA9IG9zY19jbGkob2JqKTsKIAlzdHJ1Y3Qgb3NjX2xvY2sgICAqb2xjazsKQEAgLTY0MywxMCArNjQzLDEwIEBACiAJc3RydWN0IG9zY19leHRlbnQgKmZvdW5kID0gTlVMTDsKIAlwZ29mZl90IGNodW5rOwogCXBnb2ZmX3QgbWF4X2VuZDsKLQlpbnQgbWF4X3BhZ2VzOyAvKiBtYXhfcGFnZXNfcGVyX3JwYyAqLwotCWludCBjaHVua3NpemU7CisJdW5zaWduZWQgaW50IG1heF9wYWdlczsgLyogbWF4X3BhZ2VzX3Blcl9ycGMgKi8KKwl1bnNpZ25lZCBpbnQgY2h1bmtzaXplOwogCWludCBwcGNfYml0czsgLyogcGFnZXMgcGVyIGNodW5rIGJpdHMgKi8KLQlpbnQgY2h1bmtfbWFzazsKKwlwZ29mZl90IGNodW5rX21hc2s7CiAJaW50IHJjOwogCiAJY3VyID0gb3NjX2V4dGVudF9hbGxvYyhvYmopOwpAQCAtNzAwLDggKzcwMCw4IEBACiAJaWYgKCFleHQpCiAJCWV4dCA9IGZpcnN0X2V4dGVudChvYmopOwogCXdoaWxlIChleHQpIHsKLQkJbG9mZl90IGV4dF9jaGtfc3RhcnQgPSBleHQtPm9lX3N0YXJ0ID4+IHBwY19iaXRzOwotCQlsb2ZmX3QgZXh0X2Noa19lbmQgPSBleHQtPm9lX2VuZCA+PiBwcGNfYml0czsKKwkJcGdvZmZfdCBleHRfY2hrX3N0YXJ0ID0gZXh0LT5vZV9zdGFydCA+PiBwcGNfYml0czsKKwkJcGdvZmZfdCBleHRfY2hrX2VuZCA9IGV4dC0+b2VfZW5kID4+IHBwY19iaXRzOwogCiAJCUxBU1NFUlQoc2FuaXR5X2NoZWNrX25vbG9jayhleHQpID09IDApOwogCQlpZiAoY2h1bmsgPiBleHRfY2hrX2VuZCArIDEpCkBAIC05MTMsNyArOTEzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBleHRlbnRfd2FpdF9jYihzdHJ1Y3Qgb3NjX2V4dGVudCAqZXh0LCBpbnQgc3RhdGUpCitzdGF0aWMgaW50IGV4dGVudF93YWl0X2NiKHN0cnVjdCBvc2NfZXh0ZW50ICpleHQsIGVudW0gb3NjX2V4dGVudF9zdGF0ZSBzdGF0ZSkKIHsKIAlpbnQgcmV0OwogCkBAIC05MjgsNyArOTI4LDcgQEAKICAqIFdhaXQgZm9yIHRoZSBleHRlbnQncyBzdGF0ZSB0byBiZWNvbWUgQHN0YXRlLgogICovCiBzdGF0aWMgaW50IG9zY19leHRlbnRfd2FpdChjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBvc2NfZXh0ZW50ICpleHQsCi0JCQkgICBpbnQgc3RhdGUpCisJCQkgICBlbnVtIG9zY19leHRlbnRfc3RhdGUgc3RhdGUpCiB7CiAJc3RydWN0IG9zY19vYmplY3QgKm9iaiA9IGV4dC0+b2Vfb2JqOwogCXN0cnVjdCBsX3dhaXRfaW5mbyBsd2kgPSBMV0lfVElNRU9VVF9JTlRSKGNmc190aW1lX3NlY29uZHMoNjAwKSwgTlVMTCwKQEAgLTk1OCw4ICs5NTgsOCBAQAogCXJjID0gbF93YWl0X2V2ZW50KGV4dC0+b2Vfd2FpdHEsIGV4dGVudF93YWl0X2NiKGV4dCwgc3RhdGUpLCAmbHdpKTsKIAlpZiAocmMgPT0gLUVUSU1FRE9VVCkgewogCQlPU0NfRVhURU5UX0RVTVAoRF9FUlJPUiwgZXh0LAotCQkJIiVzOiB3YWl0IGV4dCB0byAlZCB0aW1lZG91dCwgcmVjb3ZlcnkgaW4gcHJvZ3Jlc3M/XG4iLAotCQkJb3NjX2V4cG9ydChvYmopLT5leHBfb2JkLT5vYmRfbmFtZSwgc3RhdGUpOworCQkJCSIlczogd2FpdCBleHQgdG8gJXUgdGltZWRvdXQsIHJlY292ZXJ5IGluIHByb2dyZXNzP1xuIiwKKwkJCQlvc2NfZXhwb3J0KG9iaiktPmV4cF9vYmQtPm9iZF9uYW1lLCBzdGF0ZSk7CiAKIAkJbHdpID0gTFdJX0lOVFIoTlVMTCwgTlVMTCk7CiAJCXJjID0gbF93YWl0X2V2ZW50KGV4dC0+b2Vfd2FpdHEsIGV4dGVudF93YWl0X2NiKGV4dCwgc3RhdGUpLApAQCAtMTA5OSw3ICsxMDk5LDcgQEAKIAlzdHJ1Y3Qgb3NjX2FzeW5jX3BhZ2UgKm9hcDsKIAlzdHJ1Y3Qgb3NjX2FzeW5jX3BhZ2UgKmxhc3QgPSBOVUxMOwogCXN0cnVjdCBvc2Nfb2JqZWN0ICpvYmogPSBleHQtPm9lX29iajsKLQlpbnQgcGFnZV9jb3VudCA9IDA7CisJdW5zaWduZWQgaW50IHBhZ2VfY291bnQgPSAwOwogCWludCByYzsKIAogCS8qIHdlJ3JlIGdvaW5nIHRvIGdyYWIgcGFnZSBsb2NrLCBzbyBvYmplY3QgbG9jayBtdXN0IG5vdCBiZSB0YWtlbi4gKi8KQEAgLTExNDAsOSArMTE0MCwxMSBAQAogCSAqIHRoZSBzaXplIG9mIGZpbGUuCiAJICovCiAJaWYgKCEobGFzdC0+b2FwX2FzeW5jX2ZsYWdzICYgQVNZTkNfQ09VTlRfU1RBQkxFKSkgewotCQlsYXN0LT5vYXBfY291bnQgPSBvc2NfcmVmcmVzaF9jb3VudChlbnYsIGxhc3QsIE9CRF9CUldfV1JJVEUpOwotCQlMQVNTRVJUKGxhc3QtPm9hcF9jb3VudCA+IDApOwotCQlMQVNTRVJUKGxhc3QtPm9hcF9wYWdlX29mZiArIGxhc3QtPm9hcF9jb3VudCA8PSBQQUdFX1NJWkUpOworCQlpbnQgbGFzdF9vYXBfY291bnQgPSBvc2NfcmVmcmVzaF9jb3VudChlbnYsIGxhc3QsIE9CRF9CUldfV1JJVEUpOworCisJCUxBU1NFUlQobGFzdF9vYXBfY291bnQgPiAwKTsKKwkJTEFTU0VSVChsYXN0LT5vYXBfcGFnZV9vZmYgKyBsYXN0X29hcF9jb3VudCA8PSBQQUdFX1NJWkUpOworCQlsYXN0LT5vYXBfY291bnQgPSBsYXN0X29hcF9jb3VudDsKIAkJc3Bpbl9sb2NrKCZsYXN0LT5vYXBfbG9jayk7CiAJCWxhc3QtPm9hcF9hc3luY19mbGFncyB8PSBBU1lOQ19DT1VOVF9TVEFCTEU7CiAJCXNwaW5fdW5sb2NrKCZsYXN0LT5vYXBfbG9jayk7CkBAIC0xMTc0LDcgKzExNzYsOCBAQAogICogY2FsbGVkIHRvIGV4cGFuZCB0aGUgZXh0ZW50IGZvciB0aGUgc2FtZSBJTy4gVG8gZXhwYW5kIHRoZSBleHRlbnQsIHRoZQogICogcGFnZSBpbmRleCBtdXN0IGJlIGluIHRoZSBzYW1lIG9yIG5leHQgY2h1bmsgb2YgZXh0LT5vZV9lbmQuCiAgKi8KLXN0YXRpYyBpbnQgb3NjX2V4dGVudF9leHBhbmQoc3RydWN0IG9zY19leHRlbnQgKmV4dCwgcGdvZmZfdCBpbmRleCwgaW50ICpncmFudHMpCitzdGF0aWMgaW50IG9zY19leHRlbnRfZXhwYW5kKHN0cnVjdCBvc2NfZXh0ZW50ICpleHQsIHBnb2ZmX3QgaW5kZXgsCisJCQkgICAgIHVuc2lnbmVkIGludCAqZ3JhbnRzKQogewogCXN0cnVjdCBvc2Nfb2JqZWN0ICpvYmogPSBleHQtPm9lX29iajsKIAlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gb3NjX2NsaShvYmopOwpAQCAtMTE4Myw3ICsxMTg2LDcgQEAKIAlwZ29mZl90IGNodW5rID0gaW5kZXggPj4gcHBjX2JpdHM7CiAJcGdvZmZfdCBlbmRfY2h1bms7CiAJcGdvZmZfdCBlbmRfaW5kZXg7Ci0JaW50IGNodW5rc2l6ZSA9IDEgPDwgY2xpLT5jbF9jaHVua2JpdHM7CisJdW5zaWduZWQgaW50IGNodW5rc2l6ZSA9IDEgPDwgY2xpLT5jbF9jaHVua2JpdHM7CiAJaW50IHJjID0gMDsKIAogCUxBU1NFUlQoZXh0LT5vZV9tYXhfZW5kID49IGluZGV4ICYmIGV4dC0+b2Vfc3RhcnQgPD0gaW5kZXgpOwpAQCAtMTM2MSw3ICsxMzY0LDcgQEAKIAlpZiAocmMgPT0gMCAmJiBzcnZsb2NrKSB7CiAJCXN0cnVjdCBsdV9kZXZpY2UgKmxkID0gb3BnLT5vcHNfY2wuY3BsX29iai0+Y29fbHUubG9fZGV2OwogCQlzdHJ1Y3Qgb3NjX3N0YXRzICpzdGF0cyA9ICZsdTJvc2NfZGV2KGxkKS0+b2Rfc3RhdHM7Ci0JCWludCBieXRlcyA9IG9hcC0+b2FwX2NvdW50OworCQlzaXplX3QgYnl0ZXMgPSBvYXAtPm9hcF9jb3VudDsKIAogCQlpZiAoY3J0ID09IENSVF9SRUFEKQogCQkJc3RhdHMtPm9zX2xvY2tsZXNzX3JlYWRzICs9IGJ5dGVzOwpAQCAtMTM4MywxOCArMTM4NiwxNiBAQAogCiAjZGVmaW5lIE9TQ19EVU1QX0dSQU5UKGx2bCwgY2xpLCBmbXQsIGFyZ3MuLi4pIGRvIHsJCQkgICAgICBcCiAJc3RydWN0IGNsaWVudF9vYmQgKl9fdG1wID0gKGNsaSk7CQkJCSAgICAgIFwKLQlDREVCVUcobHZsLCAiJXM6IGdyYW50IHsgZGlydHk6ICVsZC8lbGQgZGlydHlfcGFnZXM6ICVkLyVkICIJICAgICAgXAotCSAgICAgICAidW5zdGFibGVfcGFnZXM6ICVkLyVkIGRyb3BwZWQ6ICVsZCBhdmFpbDogJWxkLCAiCSAgICAgIFwKLQkgICAgICAgInJlc2VydmVkOiAlbGQsIGZsaWdodDogJWQgfSBscnUge2luIGxpc3Q6ICVkLCAiCQkgICAgICBcCi0JICAgICAgICJsZWZ0OiAlZCwgd2FpdGVyczogJWQgfSIgZm10LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlDREVCVUcobHZsLCAiJXM6IGdyYW50IHsgZGlydHk6ICVsZC8lbGQgZGlydHlfcGFnZXM6ICVsZC8lbHUgIgkgICAgICBcCisJICAgICAgICJkcm9wcGVkOiAlbGQgYXZhaWw6ICVsZCwgcmVzZXJ2ZWQ6ICVsZCwgZmxpZ2h0OiAlZCB9IgkgICAgICBcCisJICAgICAgICJscnUge2luIGxpc3Q6ICVsZCwgbGVmdDogJWxkLCB3YWl0ZXJzOiAlZCB9IiBmbXQgIlxuIiwJICAgICAgXAogCSAgICAgICBfX3RtcC0+Y2xfaW1wb3J0LT5pbXBfb2JkLT5vYmRfbmFtZSwJCQkgICAgICBcCi0JICAgICAgIF9fdG1wLT5jbF9kaXJ0eSwgX190bXAtPmNsX2RpcnR5X21heCwJCQkgICAgICBcCi0JICAgICAgIGF0b21pY19yZWFkKCZvYmRfZGlydHlfcGFnZXMpLCBvYmRfbWF4X2RpcnR5X3BhZ2VzLAkgICAgICBcCi0JICAgICAgIGF0b21pY19yZWFkKCZvYmRfdW5zdGFibGVfcGFnZXMpLCBvYmRfbWF4X2RpcnR5X3BhZ2VzLAkgICAgICBcCisJICAgICAgIF9fdG1wLT5jbF9kaXJ0eV9wYWdlcywgX190bXAtPmNsX2RpcnR5X21heF9wYWdlcywJICAgICAgXAorCSAgICAgICBhdG9taWNfbG9uZ19yZWFkKCZvYmRfZGlydHlfcGFnZXMpLCBvYmRfbWF4X2RpcnR5X3BhZ2VzLAkgICAgICBcCiAJICAgICAgIF9fdG1wLT5jbF9sb3N0X2dyYW50LCBfX3RtcC0+Y2xfYXZhaWxfZ3JhbnQsCQkgICAgICBcCiAJICAgICAgIF9fdG1wLT5jbF9yZXNlcnZlZF9ncmFudCwgX190bXAtPmNsX3dfaW5fZmxpZ2h0LAkJICAgICAgXAotCSAgICAgICBhdG9taWNfcmVhZCgmX190bXAtPmNsX2xydV9pbl9saXN0KSwJCQkgICAgICBcCi0JICAgICAgIGF0b21pY19yZWFkKCZfX3RtcC0+Y2xfbHJ1X2J1c3kpLAkJCSAgICAgIFwKKwkgICAgICAgYXRvbWljX2xvbmdfcmVhZCgmX190bXAtPmNsX2xydV9pbl9saXN0KSwJCSAgICAgIFwKKwkgICAgICAgYXRvbWljX2xvbmdfcmVhZCgmX190bXAtPmNsX2xydV9idXN5KSwJCQkgICAgICBcCiAJICAgICAgIGF0b21pY19yZWFkKCZfX3RtcC0+Y2xfbHJ1X3Nocmlua2VycyksICMjYXJncyk7CQkgICAgICBcCiB9IHdoaWxlICgwKQogCkBAIC0xNDA0LDggKzE0MDUsOCBAQAogewogCWFzc2VydF9zcGluX2xvY2tlZCgmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKIAlMQVNTRVJUKCEocGdhLT5mbGFnICYgT0JEX0JSV19GUk9NX0dSQU5UKSk7Ci0JYXRvbWljX2luYygmb2JkX2RpcnR5X3BhZ2VzKTsKLQljbGktPmNsX2RpcnR5ICs9IFBBR0VfU0laRTsKKwlhdG9taWNfbG9uZ19pbmMoJm9iZF9kaXJ0eV9wYWdlcyk7CisJY2xpLT5jbF9kaXJ0eV9wYWdlcysrOwogCXBnYS0+ZmxhZyB8PSBPQkRfQlJXX0ZST01fR1JBTlQ7CiAJQ0RFQlVHKERfQ0FDSEUsICJ1c2luZyAlbHUgZ3JhbnQgY3JlZGl0cyBmb3IgYnJ3ICVwIHBhZ2UgJXBcbiIsCiAJICAgICAgIFBBR0VfU0laRSwgcGdhLCBwZ2EtPnBnKTsKQEAgLTE0MjQsMTIgKzE0MjUsMTIgQEAKIAl9CiAKIAlwZ2EtPmZsYWcgJj0gfk9CRF9CUldfRlJPTV9HUkFOVDsKLQlhdG9taWNfZGVjKCZvYmRfZGlydHlfcGFnZXMpOwotCWNsaS0+Y2xfZGlydHkgLT0gUEFHRV9TSVpFOworCWF0b21pY19sb25nX2RlYygmb2JkX2RpcnR5X3BhZ2VzKTsKKwljbGktPmNsX2RpcnR5X3BhZ2VzLS07CiAJaWYgKHBnYS0+ZmxhZyAmIE9CRF9CUldfTk9DQUNIRSkgewogCQlwZ2EtPmZsYWcgJj0gfk9CRF9CUldfTk9DQUNIRTsKLQkJYXRvbWljX2RlYygmb2JkX2RpcnR5X3RyYW5zaXRfcGFnZXMpOwotCQljbGktPmNsX2RpcnR5X3RyYW5zaXQgLT0gUEFHRV9TSVpFOworCQlhdG9taWNfbG9uZ19kZWMoJm9iZF9kaXJ0eV90cmFuc2l0X3BhZ2VzKTsKKwkJY2xpLT5jbF9kaXJ0eV90cmFuc2l0LS07CiAJfQogfQogCkBAIC0xNDk0LDExICsxNDk1LDExIEBACiBzdGF0aWMgdm9pZCBvc2NfZnJlZV9ncmFudChzdHJ1Y3QgY2xpZW50X29iZCAqY2xpLCB1bnNpZ25lZCBpbnQgbnJfcGFnZXMsCiAJCQkgICB1bnNpZ25lZCBpbnQgbG9zdF9ncmFudCkKIHsKLQlpbnQgZ3JhbnQgPSAoMSA8PCBjbGktPmNsX2NodW5rYml0cykgKyBjbGktPmNsX2V4dGVudF90YXg7CisJdW5zaWduZWQgbG9uZyBncmFudCA9ICgxIDw8IGNsaS0+Y2xfY2h1bmtiaXRzKSArIGNsaS0+Y2xfZXh0ZW50X3RheDsKIAogCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQlhdG9taWNfc3ViKG5yX3BhZ2VzLCAmb2JkX2RpcnR5X3BhZ2VzKTsKLQljbGktPmNsX2RpcnR5IC09IG5yX3BhZ2VzIDw8IFBBR0VfU0hJRlQ7CisJYXRvbWljX2xvbmdfc3ViKG5yX3BhZ2VzLCAmb2JkX2RpcnR5X3BhZ2VzKTsKKwljbGktPmNsX2RpcnR5X3BhZ2VzIC09IG5yX3BhZ2VzOwogCWNsaS0+Y2xfbG9zdF9ncmFudCArPSBsb3N0X2dyYW50OwogCWlmIChjbGktPmNsX2F2YWlsX2dyYW50IDwgZ3JhbnQgJiYgY2xpLT5jbF9sb3N0X2dyYW50ID49IGdyYW50KSB7CiAJCS8qIGJvcnJvdyBzb21lIGdyYW50IGZyb20gdHJ1bmNhdGUgdG8gYXZvaWQgdGhlIGNhc2UgdGhhdApAQCAtMTUxMSw3ICsxNTEyLDcgQEAKIAlzcGluX3VubG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKIAlDREVCVUcoRF9DQUNIRSwgImxvc3QgJXUgZ3JhbnQ6ICVsdSBhdmFpbDogJWx1IGRpcnR5OiAlbHVcbiIsCiAJICAgICAgIGxvc3RfZ3JhbnQsIGNsaS0+Y2xfbG9zdF9ncmFudCwKLQkgICAgICAgY2xpLT5jbF9hdmFpbF9ncmFudCwgY2xpLT5jbF9kaXJ0eSk7CisJICAgICAgIGNsaS0+Y2xfYXZhaWxfZ3JhbnQsIGNsaS0+Y2xfZGlydHlfcGFnZXMgPDwgUEFHRV9TSElGVCk7CiB9CiAKIC8qKgpAQCAtMTUzNSwxOSArMTUzNiwxOCBAQAogewogCWludCByYzsKIAotCU9TQ19EVU1QX0dSQU5UKERfQ0FDSEUsIGNsaSwgIm5lZWQ6JWQuXG4iLCBieXRlcyk7CisJT1NDX0RVTVBfR1JBTlQoRF9DQUNIRSwgY2xpLCAibmVlZDolZFxuIiwgYnl0ZXMpOwogCiAJcmMgPSBvc2NfcmVzZXJ2ZV9ncmFudChjbGksIGJ5dGVzKTsKIAlpZiAocmMgPCAwKQogCQlyZXR1cm4gMDsKIAotCWlmIChjbGktPmNsX2RpcnR5ICsgUEFHRV9TSVpFIDw9IGNsaS0+Y2xfZGlydHlfbWF4ICYmCi0JICAgIGF0b21pY19yZWFkKCZvYmRfdW5zdGFibGVfcGFnZXMpICsgMSArCi0JICAgIGF0b21pY19yZWFkKCZvYmRfZGlydHlfcGFnZXMpIDw9IG9iZF9tYXhfZGlydHlfcGFnZXMpIHsKKwlpZiAoY2xpLT5jbF9kaXJ0eV9wYWdlcyA8PSBjbGktPmNsX2RpcnR5X21heF9wYWdlcyAmJgorCSAgICBhdG9taWNfbG9uZ19yZWFkKCZvYmRfZGlydHlfcGFnZXMpICsgMSA8PSBvYmRfbWF4X2RpcnR5X3BhZ2VzKSB7CiAJCW9zY19jb25zdW1lX3dyaXRlX2dyYW50KGNsaSwgJm9hcC0+b2FwX2Jyd19wYWdlKTsKIAkJaWYgKHRyYW5zaWVudCkgewotCQkJY2xpLT5jbF9kaXJ0eV90cmFuc2l0ICs9IFBBR0VfU0laRTsKLQkJCWF0b21pY19pbmMoJm9iZF9kaXJ0eV90cmFuc2l0X3BhZ2VzKTsKKwkJCWNsaS0+Y2xfZGlydHlfdHJhbnNpdCsrOworCQkJYXRvbWljX2xvbmdfaW5jKCZvYmRfZGlydHlfdHJhbnNpdF9wYWdlcyk7CiAJCQlvYXAtPm9hcF9icndfZmxhZ3MgfD0gT0JEX0JSV19OT0NBQ0hFOwogCQl9CiAJCXJjID0gMTsKQEAgLTE1ODEsMTEgKzE1ODEsMTMgQEAKIAlzdHJ1Y3Qgb3NjX29iamVjdCAqb3NjID0gb2FwLT5vYXBfb2JqOwogCXN0cnVjdCBsb3Zfb2luZm8gKmxvaSA9IG9zYy0+b29fb2luZm87CiAJc3RydWN0IG9zY19jYWNoZV93YWl0ZXIgb2N3OwotCXN0cnVjdCBsX3dhaXRfaW5mbyBsd2kgPSBMV0lfVElNRU9VVF9JTlRSKGNmc190aW1lX3NlY29uZHMoNjAwKSwgTlVMTCwKLQkJCQkJCSAgTFdJX09OX1NJR05BTF9OT09QLCBOVUxMKTsKKwlzdHJ1Y3QgbF93YWl0X2luZm8gbHdpOwogCWludCByYyA9IC1FRFFVT1Q7CiAKLQlPU0NfRFVNUF9HUkFOVChEX0NBQ0hFLCBjbGksICJuZWVkOiVkLlxuIiwgYnl0ZXMpOworCWx3aSA9IExXSV9USU1FT1VUX0lOVFIoY2ZzX3RpbWVfc2Vjb25kcyhBVF9PRkYgPyBvYmRfdGltZW91dCA6IGF0X21heCksCisJCQkgICAgICAgTlVMTCwgTFdJX09OX1NJR05BTF9OT09QLCBOVUxMKTsKKworCU9TQ19EVU1QX0dSQU5UKERfQ0FDSEUsIGNsaSwgIm5lZWQ6JWRcbiIsIGJ5dGVzKTsKIAogCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKIApAQCAtMTU5MywxNCArMTU5NSwxNiBAQAogCSAqIG9mIHF1ZXVlZCB3cml0ZXMgYW5kIGNyZWF0ZSBhIGRpc2NvbnRpZ3VvdXMgcnBjIHN0cmVhbQogCSAqLwogCWlmIChPQkRfRkFJTF9DSEVDSyhPQkRfRkFJTF9PU0NfTk9fR1JBTlQpIHx8Ci0JICAgIGNsaS0+Y2xfZGlydHlfbWF4IDwgUEFHRV9TSVpFICAgICB8fAotCSAgICBjbGktPmNsX2FyLmFyX2ZvcmNlX3N5bmMgfHwgbG9pLT5sb2lfYXIuYXJfZm9yY2Vfc3luYykgeworCSAgICAhY2xpLT5jbF9kaXJ0eV9tYXhfcGFnZXMgfHwgY2xpLT5jbF9hci5hcl9mb3JjZV9zeW5jIHx8CisJICAgIGxvaS0+bG9pX2FyLmFyX2ZvcmNlX3N5bmMpIHsKKwkJT1NDX0RVTVBfR1JBTlQoRF9DQUNIRSwgY2xpLCAiZm9yY2VkIHN5bmMgaS9vXG4iKTsKIAkJcmMgPSAtRURRVU9UOwogCQlnb3RvIG91dDsKIAl9CiAKIAkvKiBIb3BlZnVsbHkgbm9ybWFsIGNhc2UgLSBjYWNoZSBzcGFjZSBhbmQgd3JpdGUgY3JlZGl0cyBhdmFpbGFibGUgKi8KIAlpZiAob3NjX2VudGVyX2NhY2hlX3RyeShjbGksIG9hcCwgYnl0ZXMsIDApKSB7CisJCU9TQ19EVU1QX0dSQU5UKERfQ0FDSEUsIGNsaSwgImdyYW50ZWQgZnJvbSBjYWNoZVxuIik7CiAJCXJjID0gMDsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTYxNSw3ICsxNjE5LDcgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZvY3cub2N3X3dhaXRxKTsKIAlvY3cub2N3X29hcCAgID0gb2FwOwogCW9jdy5vY3dfZ3JhbnQgPSBieXRlczsKLQl3aGlsZSAoY2xpLT5jbF9kaXJ0eSA+IDAgfHwgY2xpLT5jbF93X2luX2ZsaWdodCA+IDApIHsKKwl3aGlsZSAoY2xpLT5jbF9kaXJ0eV9wYWdlcyA+IDAgfHwgY2xpLT5jbF93X2luX2ZsaWdodCA+IDApIHsKIAkJbGlzdF9hZGRfdGFpbCgmb2N3Lm9jd19lbnRyeSwgJmNsaS0+Y2xfY2FjaGVfd2FpdGVycyk7CiAJCW9jdy5vY3dfcmMgPSAwOwogCQlzcGluX3VubG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKQEAgLTE2MjksMzIgKzE2MzMsNDkgQEAKIAogCQlzcGluX2xvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CiAKLQkJLyogbF93YWl0X2V2ZW50IGlzIGludGVycnVwdGVkIGJ5IHNpZ25hbCwgb3IgdGltZWQgb3V0ICovCiAJCWlmIChyYyA8IDApIHsKLQkJCWlmIChyYyA9PSAtRVRJTUVET1VUKSB7Ci0JCQkJT1NDX0RVTVBfR1JBTlQoRF9FUlJPUiwgY2xpLAotCQkJCQkgICAgICAgInRyeSB0byByZXNlcnZlICVkLlxuIiwgYnl0ZXMpOwotCQkJCW9zY19leHRlbnRfdHJlZV9kdW1wKERfRVJST1IsIG9zYyk7Ci0JCQkJcmMgPSAtRURRVU9UOwotCQkJfQotCisJCQkvKiBsX3dhaXRfZXZlbnQgaXMgaW50ZXJydXB0ZWQgYnkgc2lnbmFsLCBvciB0aW1lZCBvdXQgKi8KIAkJCWxpc3RfZGVsX2luaXQoJm9jdy5vY3dfZW50cnkpOwotCQkJZ290byBvdXQ7CisJCQlicmVhazsKIAkJfQotCiAJCUxBU1NFUlQobGlzdF9lbXB0eSgmb2N3Lm9jd19lbnRyeSkpOwogCQlyYyA9IG9jdy5vY3dfcmM7CiAKIAkJaWYgKHJjICE9IC1FRFFVT1QpCi0JCQlnb3RvIG91dDsKKwkJCWJyZWFrOwogCQlpZiAob3NjX2VudGVyX2NhY2hlX3RyeShjbGksIG9hcCwgYnl0ZXMsIDApKSB7CiAJCQlyYyA9IDA7Ci0JCQlnb3RvIG91dDsKKwkJCWJyZWFrOwogCQl9CiAJfQorCisJc3dpdGNoIChyYykgeworCWNhc2UgMDoKKwkJT1NDX0RVTVBfR1JBTlQoRF9DQUNIRSwgY2xpLCAiZmluYWxseSBnb3QgZ3JhbnQgc3BhY2VcbiIpOworCQlicmVhazsKKwljYXNlIC1FVElNRURPVVQ6CisJCU9TQ19EVU1QX0dSQU5UKERfQ0FDSEUsIGNsaSwKKwkJCSAgICAgICAidGltZW91dCwgZmFsbCBiYWNrIHRvIHN5bmMgaS9vXG4iKTsKKwkJb3NjX2V4dGVudF90cmVlX2R1bXAoRF9DQUNIRSwgb3NjKTsKKwkJLyogZmFsbCBiYWNrIHRvIHN5bmNocm9ub3VzIEkvTyAqLworCQlyYyA9IC1FRFFVT1Q7CisJCWJyZWFrOworCWNhc2UgLUVJTlRSOgorCQkvKiBFbnN1cmVzIHJlc3RhcnRhYmlsaXR5IC0gTFUtMzU4MSAqLworCQlPU0NfRFVNUF9HUkFOVChEX0NBQ0hFLCBjbGksICJpbnRlcnJ1cHRlZFxuIik7CisJCXJjID0gLUVSRVNUQVJUU1lTOworCQlicmVhazsKKwljYXNlIC1FRFFVT1Q6CisJCU9TQ19EVU1QX0dSQU5UKERfQ0FDSEUsIGNsaSwKKwkJCSAgICAgICAibm8gZ3JhbnQgc3BhY2UsIGZhbGwgYmFjayB0byBzeW5jIGkvb1xuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUNERUJVRyhEX0NBQ0hFLCAiJXM6IGV2ZW50IGZvciBjYWNoZSBzcGFjZSBAICVwIG5ldmVyIGFycml2ZWQgZHVlIHRvICVkLCBmYWxsIGJhY2sgdG8gc3luYyBpL29cbiIsCisJCSAgICAgICBjbGktPmNsX2ltcG9ydC0+aW1wX29iZC0+b2JkX25hbWUsICZvY3csIHJjKTsKKwkJYnJlYWs7CisJfQogb3V0OgogCXNwaW5fdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCU9TQ19EVU1QX0dSQU5UKERfQ0FDSEUsIGNsaSwgInJldHVybmVkICVkLlxuIiwgcmMpOwogCXJldHVybiByYzsKIH0KIApAQCAtMTY3MCwxOSArMTY5MSwxNyBAQAogCiAJCW9jdy0+b2N3X3JjID0gLUVEUVVPVDsKIAkJLyogd2UgY2FuJ3QgZGlydHkgbW9yZSAqLwotCQlpZiAoKGNsaS0+Y2xfZGlydHkgKyBQQUdFX1NJWkUgPiBjbGktPmNsX2RpcnR5X21heCkgfHwKLQkJICAgIChhdG9taWNfcmVhZCgmb2JkX3Vuc3RhYmxlX3BhZ2VzKSArIDEgKwotCQkgICAgIGF0b21pY19yZWFkKCZvYmRfZGlydHlfcGFnZXMpID4gb2JkX21heF9kaXJ0eV9wYWdlcykpIHsKLQkJCUNERUJVRyhEX0NBQ0hFLCAibm8gZGlydHkgcm9vbTogZGlydHk6ICVsZCBvc2MgbWF4ICVsZCwgc3lzIG1heCAlZFxuIiwKLQkJCSAgICAgICBjbGktPmNsX2RpcnR5LAotCQkJICAgICAgIGNsaS0+Y2xfZGlydHlfbWF4LCBvYmRfbWF4X2RpcnR5X3BhZ2VzKTsKKwkJaWYgKChjbGktPmNsX2RpcnR5X3BhZ2VzID4gY2xpLT5jbF9kaXJ0eV9tYXhfcGFnZXMpIHx8CisJCSAgICAoYXRvbWljX2xvbmdfcmVhZCgmb2JkX2RpcnR5X3BhZ2VzKSArIDEgPgorCQkgICAgIG9iZF9tYXhfZGlydHlfcGFnZXMpKSB7CisJCQlDREVCVUcoRF9DQUNIRSwgIm5vIGRpcnR5IHJvb206IGRpcnR5OiAlbGQgb3NjIG1heCAlbGQsIHN5cyBtYXggJWxkXG4iLAorCQkJICAgICAgIGNsaS0+Y2xfZGlydHlfcGFnZXMsIGNsaS0+Y2xfZGlydHlfbWF4X3BhZ2VzLAorCQkJICAgICAgIG9iZF9tYXhfZGlydHlfcGFnZXMpOwogCQkJZ290byB3YWtldXA7CiAJCX0KIAotCQlvY3ctPm9jd19yYyA9IDA7Ci0JCWlmICghb3NjX2VudGVyX2NhY2hlX3RyeShjbGksIG9jdy0+b2N3X29hcCwgb2N3LT5vY3dfZ3JhbnQsIDApKQotCQkJb2N3LT5vY3dfcmMgPSAtRURRVU9UOwotCisJCWlmIChvc2NfZW50ZXJfY2FjaGVfdHJ5KGNsaSwgb2N3LT5vY3dfb2FwLCBvY3ctPm9jd19ncmFudCwgMCkpCisJCQlvY3ctPm9jd19yYyA9IDA7CiB3YWtldXA6CiAJCUNERUJVRyhEX0NBQ0hFLCAid2FrZSB1cCAlcCBmb3Igb2FwICVwLCBhdmFpbCBncmFudCAlbGQsICVkXG4iLAogCQkgICAgICAgb2N3LCBvY3ctPm9jd19vYXAsIGNsaS0+Y2xfYXZhaWxfZ3JhbnQsIG9jdy0+b2N3X3JjKTsKQEAgLTE4NDMsOTcgKzE4NjIsNiBAQAogCQlhci0+YXJfZm9yY2Vfc3luYyA9IDA7CiB9CiAKLS8qKgotICogUGVyZm9ybXMgInVuc3RhYmxlIiBwYWdlIGFjY291bnRpbmcuIFRoaXMgZnVuY3Rpb24gYmFsYW5jZXMgdGhlCi0gKiBpbmNyZW1lbnQgb3BlcmF0aW9ucyBwZXJmb3JtZWQgaW4gb3NjX2luY191bnN0YWJsZV9wYWdlcy4gSXQgaXMKLSAqIHJlZ2lzdGVyZWQgYXMgdGhlIFJQQyByZXF1ZXN0IGNhbGxiYWNrLCBhbmQgaXMgZXhlY3V0ZWQgd2hlbiB0aGUKLSAqIGJ1bGsgUlBDIGlzIGNvbW1pdHRlZCBvbiB0aGUgc2VydmVyLiBUaHVzIGF0IHRoaXMgcG9pbnQsIHRoZSBwYWdlcwotICogaW52b2x2ZWQgaW4gdGhlIGJ1bGsgdHJhbnNmZXIgYXJlIG5vIGxvbmdlciBjb25zaWRlcmVkIHVuc3RhYmxlLgotICovCi12b2lkIG9zY19kZWNfdW5zdGFibGVfcGFnZXMoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpCi17Ci0Jc3RydWN0IGNsaWVudF9vYmQgKmNsaSA9ICZyZXEtPnJxX2ltcG9ydC0+aW1wX29iZC0+dS5jbGk7Ci0Jc3RydWN0IHB0bHJwY19idWxrX2Rlc2MgKmRlc2MgPSByZXEtPnJxX2J1bGs7Ci0JaW50IHBhZ2VfY291bnQgPSBkZXNjLT5iZF9pb3ZfY291bnQ7Ci0JaW50IGk7Ci0KLQkvKiBObyB1bnN0YWJsZSBwYWdlIHRyYWNraW5nICovCi0JaWYgKCFjbGktPmNsX2NhY2hlKQotCQlyZXR1cm47Ci0KLQlMQVNTRVJUKHBhZ2VfY291bnQgPj0gMCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcGFnZV9jb3VudDsgaSsrKQotCQlkZWNfbm9kZV9wYWdlX3N0YXRlKGRlc2MtPmJkX2lvdltpXS5raW92X3BhZ2UsCi0JCQkJCQkJTlJfVU5TVEFCTEVfTkZTKTsKLQotCWF0b21pY19zdWIocGFnZV9jb3VudCwgJmNsaS0+Y2xfY2FjaGUtPmNjY191bnN0YWJsZV9ucik7Ci0JTEFTU0VSVChhdG9taWNfcmVhZCgmY2xpLT5jbF9jYWNoZS0+Y2NjX3Vuc3RhYmxlX25yKSA+PSAwKTsKLQotCWF0b21pY19zdWIocGFnZV9jb3VudCwgJmNsaS0+Y2xfdW5zdGFibGVfY291bnQpOwotCUxBU1NFUlQoYXRvbWljX3JlYWQoJmNsaS0+Y2xfdW5zdGFibGVfY291bnQpID49IDApOwotCi0JYXRvbWljX3N1YihwYWdlX2NvdW50LCAmb2JkX3Vuc3RhYmxlX3BhZ2VzKTsKLQlMQVNTRVJUKGF0b21pY19yZWFkKCZvYmRfdW5zdGFibGVfcGFnZXMpID49IDApOwotCi0Jc3Bpbl9sb2NrKCZyZXEtPnJxX2xvY2spOwotCXJlcS0+cnFfY29tbWl0dGVkID0gMTsKLQlyZXEtPnJxX3Vuc3RhYmxlICA9IDA7Ci0Jc3Bpbl91bmxvY2soJnJlcS0+cnFfbG9jayk7Ci0KLQl3YWtlX3VwX2FsbCgmY2xpLT5jbF9jYWNoZS0+Y2NjX3Vuc3RhYmxlX3dhaXRxKTsKLX0KLQotLyogInVuc3RhYmxlIiBwYWdlIGFjY291bnRpbmcuIFNlZTogb3NjX2RlY191bnN0YWJsZV9wYWdlcy4gKi8KLXZvaWQgb3NjX2luY191bnN0YWJsZV9wYWdlcyhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSkKLXsKLQlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gJnJlcS0+cnFfaW1wb3J0LT5pbXBfb2JkLT51LmNsaTsKLQlzdHJ1Y3QgcHRscnBjX2J1bGtfZGVzYyAqZGVzYyA9IHJlcS0+cnFfYnVsazsKLQlsb25nIHBhZ2VfY291bnQgPSBkZXNjLT5iZF9pb3ZfY291bnQ7Ci0JaW50IGk7Ci0KLQkvKiBObyB1bnN0YWJsZSBwYWdlIHRyYWNraW5nICovCi0JaWYgKCFjbGktPmNsX2NhY2hlKQotCQlyZXR1cm47Ci0KLQlMQVNTRVJUKHBhZ2VfY291bnQgPj0gMCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcGFnZV9jb3VudDsgaSsrKQotCQlpbmNfbm9kZV9wYWdlX3N0YXRlKGRlc2MtPmJkX2lvdltpXS5raW92X3BhZ2UsCi0JCQkJCQkJTlJfVU5TVEFCTEVfTkZTKTsKLQotCUxBU1NFUlQoYXRvbWljX3JlYWQoJmNsaS0+Y2xfY2FjaGUtPmNjY191bnN0YWJsZV9ucikgPj0gMCk7Ci0JYXRvbWljX2FkZChwYWdlX2NvdW50LCAmY2xpLT5jbF9jYWNoZS0+Y2NjX3Vuc3RhYmxlX25yKTsKLQotCUxBU1NFUlQoYXRvbWljX3JlYWQoJmNsaS0+Y2xfdW5zdGFibGVfY291bnQpID49IDApOwotCWF0b21pY19hZGQocGFnZV9jb3VudCwgJmNsaS0+Y2xfdW5zdGFibGVfY291bnQpOwotCi0JTEFTU0VSVChhdG9taWNfcmVhZCgmb2JkX3Vuc3RhYmxlX3BhZ2VzKSA+PSAwKTsKLQlhdG9taWNfYWRkKHBhZ2VfY291bnQsICZvYmRfdW5zdGFibGVfcGFnZXMpOwotCi0Jc3Bpbl9sb2NrKCZyZXEtPnJxX2xvY2spOwotCi0JLyoKLQkgKiBJZiB0aGUgcmVxdWVzdCBoYXMgYWxyZWFkeSBiZWVuIGNvbW1pdHRlZCAoaS5lLiBicndfY29tbWl0Ci0JICogY2FsbGVkIHZpYSBycV9jb21taXRfY2IpLCB3ZSBuZWVkIHRvIHVuZG8gdGhlIHVuc3RhYmxlIHBhZ2UKLQkgKiBpbmNyZW1lbnRzIHdlIGp1c3QgcGVyZm9ybWVkIGJlY2F1c2UgcnFfY29tbWl0X2NiIHdvbnQgYmUKLQkgKiBjYWxsZWQgYWdhaW4uIE90aGVyd2lzZSwganVzdCBzZXQgdGhlIGNvbW1pdCBjYWxsYmFjayBzbyB0aGUKLQkgKiB1bnN0YWJsZSBwYWdlIGFjY291bnRpbmcgaXMgcHJvcGVybHkgdXBkYXRlZCB3aGVuIHRoZSByZXF1ZXN0Ci0JICogaXMgY29tbWl0dGVkCi0JICovCi0JaWYgKHJlcS0+cnFfY29tbWl0dGVkKSB7Ci0JCS8qIERyb3AgbG9jayBiZWZvcmUgY2FsbGluZyBvc2NfZGVjX3Vuc3RhYmxlX3BhZ2VzICovCi0JCXNwaW5fdW5sb2NrKCZyZXEtPnJxX2xvY2spOwotCQlvc2NfZGVjX3Vuc3RhYmxlX3BhZ2VzKHJlcSk7Ci0JCXNwaW5fbG9jaygmcmVxLT5ycV9sb2NrKTsKLQl9IGVsc2UgewotCQlyZXEtPnJxX3Vuc3RhYmxlID0gMTsKLQkJcmVxLT5ycV9jb21taXRfY2IgPSBvc2NfZGVjX3Vuc3RhYmxlX3BhZ2VzOwotCX0KLQotCXNwaW5fdW5sb2NrKCZyZXEtPnJxX2xvY2spOwotfQotCiAvKiB0aGlzIG11c3QgYmUgY2FsbGVkIGhvbGRpbmcgdGhlIGxvaSBsaXN0IGxvY2sgdG8gZ2l2ZSBjb3ZlcmFnZSB0byBleGl0X2NhY2hlLAogICogYXN5bmNfZmxhZyBtYWludGVuYW5jZSwgYW5kIG9hcF9yZXF1ZXN0CiAgKi8KQEAgLTE5NDUsOSArMTg3Myw2IEBACiAJX191NjQgeGlkID0gMDsKIAogCWlmIChvYXAtPm9hcF9yZXF1ZXN0KSB7Ci0JCWlmICghcmMpCi0JCQlvc2NfaW5jX3Vuc3RhYmxlX3BhZ2VzKG9hcC0+b2FwX3JlcXVlc3QpOwotCiAJCXhpZCA9IHB0bHJwY19yZXFfeGlkKG9hcC0+b2FwX3JlcXVlc3QpOwogCQlwdGxycGNfcmVxX2ZpbmlzaGVkKG9hcC0+b2FwX3JlcXVlc3QpOwogCQlvYXAtPm9hcF9yZXF1ZXN0ID0gTlVMTDsKQEAgLTE5NzksNyArMTkwNCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgdHJ5X3RvX2FkZF9leHRlbnRfZm9yX2lvKHN0cnVjdCBjbGllbnRfb2JkICpjbGksCiAJCQkJICAgIHN0cnVjdCBvc2NfZXh0ZW50ICpleHQsIHN0cnVjdCBsaXN0X2hlYWQgKnJwY2xpc3QsCi0JCQkJICAgIGludCAqcGMsIHVuc2lnbmVkIGludCAqbWF4X3BhZ2VzKQorCQkJCSAgICB1bnNpZ25lZCBpbnQgKnBjLCB1bnNpZ25lZCBpbnQgKm1heF9wYWdlcykKIHsKIAlzdHJ1Y3Qgb3NjX2V4dGVudCAqdG1wOwogCXN0cnVjdCBvc2NfYXN5bmNfcGFnZSAqb2FwID0gbGlzdF9maXJzdF9lbnRyeSgmZXh0LT5vZV9wYWdlcywKQEAgLTIwMzIsMTIgKzE5NTcsMTMgQEAKICAqIDUuIFRyYXZlcnNlIHRoZSBleHRlbnQgdHJlZSBmcm9tIHRoZSAxc3QgZXh0ZW50OwogICogNi4gQWJvdmUgc3RlcHMgZXhpdCBpZiB0aGVyZSBpcyBubyBzcGFjZSBpbiB0aGlzIFJQQy4KICAqLwotc3RhdGljIGludCBnZXRfd3JpdGVfZXh0ZW50cyhzdHJ1Y3Qgb3NjX29iamVjdCAqb2JqLCBzdHJ1Y3QgbGlzdF9oZWFkICpycGNsaXN0KQorc3RhdGljIHVuc2lnbmVkIGludCBnZXRfd3JpdGVfZXh0ZW50cyhzdHJ1Y3Qgb3NjX29iamVjdCAqb2JqLAorCQkJCSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKnJwY2xpc3QpCiB7CiAJc3RydWN0IGNsaWVudF9vYmQgKmNsaSA9IG9zY19jbGkob2JqKTsKIAlzdHJ1Y3Qgb3NjX2V4dGVudCAqZXh0OwogCXN0cnVjdCBvc2NfZXh0ZW50ICp0ZW1wOwotCWludCBwYWdlX2NvdW50ID0gMDsKKwl1bnNpZ25lZCBpbnQgcGFnZV9jb3VudCA9IDA7CiAJdW5zaWduZWQgaW50IG1heF9wYWdlcyA9IGNsaS0+Y2xfbWF4X3BhZ2VzX3Blcl9ycGM7CiAKIAlMQVNTRVJUKG9zY19vYmplY3RfaXNfbG9ja2VkKG9iaikpOwpAQCAtMjE3NSw3ICsyMTAxLDcgQEAKIAlzdHJ1Y3Qgb3NjX2V4dGVudCAqZXh0OwogCXN0cnVjdCBvc2NfZXh0ZW50ICpuZXh0OwogCUxJU1RfSEVBRChycGNsaXN0KTsKLQlpbnQgcGFnZV9jb3VudCA9IDA7CisJdW5zaWduZWQgaW50IHBhZ2VfY291bnQgPSAwOwogCXVuc2lnbmVkIGludCBtYXhfcGFnZXMgPSBjbGktPmNsX21heF9wYWdlc19wZXJfcnBjOwogCWludCByYyA9IDA7CiAKQEAgLTIzOTAsNyArMjMxNiw3IEBACiAJc3RydWN0IGNsaWVudF9vYmQgKmNsaSA9IG9hcC0+b2FwX2NsaTsKIAlzdHJ1Y3Qgb3NjX29iamVjdCAqb3NjID0gb2FwLT5vYXBfb2JqOwogCXBnb2ZmX3QgaW5kZXg7Ci0JaW50IGdyYW50cyA9IDA7CisJdW5zaWduZWQgaW50IGdyYW50cyA9IDAsIHRtcDsKIAlpbnQgYnJ3X2ZsYWdzID0gT0JEX0JSV19BU1lOQzsKIAlpbnQgY21kID0gT0JEX0JSV19XUklURTsKIAlpbnQgbmVlZF9yZWxlYXNlID0gMDsKQEAgLTI0MzQsOSArMjM2MCw2IEBACiAJCQlyZXR1cm4gcmM7CiAJfQogCi0JaWYgKG9zY19vdmVyX3Vuc3RhYmxlX3NvZnRfbGltaXQoY2xpKSkKLQkJYnJ3X2ZsYWdzIHw9IE9CRF9CUldfU09GVF9TWU5DOwotCiAJb2FwLT5vYXBfY21kID0gY21kOwogCW9hcC0+b2FwX3BhZ2Vfb2ZmID0gb3BzLT5vcHNfZnJvbTsKIAlvYXAtPm9hcF9jb3VudCA9IG9wcy0+b3BzX3RvIC0gb3BzLT5vcHNfZnJvbTsKQEAgLTI0NzYsNyArMjM5OSw3IEBACiAJCQlncmFudHMgPSAwOwogCQkJbmVlZF9yZWxlYXNlID0gMTsKIAkJfSBlbHNlIGlmIChleHQtPm9lX2VuZCA8IGluZGV4KSB7Ci0JCQlpbnQgdG1wID0gZ3JhbnRzOworCQkJdG1wID0gZ3JhbnRzOwogCQkJLyogdHJ5IHRvIGV4cGFuZCB0aGlzIGV4dGVudCAqLwogCQkJcmMgPSBvc2NfZXh0ZW50X2V4cGFuZChleHQsIGluZGV4LCAmdG1wKTsKIAkJCWlmIChyYyA8IDApIHsKQEAgLTI1MDEsNyArMjQyNCw3IEBACiAJfQogCiAJaWYgKCFleHQpIHsKLQkJaW50IHRtcCA9ICgxIDw8IGNsaS0+Y2xfY2h1bmtiaXRzKSArIGNsaS0+Y2xfZXh0ZW50X3RheDsKKwkJdG1wID0gKDEgPDwgY2xpLT5jbF9jaHVua2JpdHMpICsgY2xpLT5jbF9leHRlbnRfdGF4OwogCiAJCS8qIHRyeSB0byBmaW5kIG5ldyBleHRlbnQgdG8gY292ZXIgdGhpcyBwYWdlICovCiAJCUxBU1NFUlQoIW9pby0+b2lfYWN0aXZlKTsKQEAgLTI2NDUsNyArMjU2OCw3IEBACiAJCWdvdG8gb3V0OwogCiAJc3Bpbl9sb2NrKCZvYXAtPm9hcF9sb2NrKTsKLQlvYXAtPm9hcF9hc3luY19mbGFncyB8PSBBU1lOQ19SRUFEWXxBU1lOQ19VUkdFTlQ7CisJb2FwLT5vYXBfYXN5bmNfZmxhZ3MgfD0gQVNZTkNfUkVBRFkgfCBBU1lOQ19VUkdFTlQ7CiAJc3Bpbl91bmxvY2soJm9hcC0+b2FwX2xvY2spOwogCiAJaWYgKG1lbW9yeV9wcmVzc3VyZV9nZXQoKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfY2xfaW50ZXJuYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfY2xfaW50ZXJuYWwuaAppbmRleCBjOGMzZjFjLi45YzhkZTE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2NsX2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19jbF9pbnRlcm5hbC5oCkBAIC02NCw3ICs2NCw3IEBACiAJLyoqIHRydWUgaWYgdGhpcyBpbyBpcyBsb2NrbGVzcy4gKi8KIAl1bnNpZ25lZCBpbnQJCW9pX2xvY2tsZXNzOwogCS8qKiBob3cgbWFueSBMUlUgcGFnZXMgYXJlIHJlc2VydmVkIGZvciB0aGlzIElPICovCi0JaW50IG9pX2xydV9yZXNlcnZlZDsKKwl1bnNpZ25lZCBsb25nCQlvaV9scnVfcmVzZXJ2ZWQ7CiAKIAkvKiogYWN0aXZlIGV4dGVudHMsIHdlIGtub3cgaG93IG1hbnkgYnl0ZXMgaXMgZ29pbmcgdG8gYmUgd3JpdHRlbiwKIAkgKiBzbyBoYXZpbmcgYW4gYWN0aXZlIGV4dGVudCB3aWxsIHByZXZlbnQgaXQgZnJvbSBiZWluZyBmcmFnbWVudGVkCkBAIC0zODksNyArMzg5LDcgQEAKIGV4dGVybiBzdHJ1Y3QgbHVfY29udGV4dF9rZXkgb3NjX2tleTsKIGV4dGVybiBzdHJ1Y3QgbHVfY29udGV4dF9rZXkgb3NjX3Nlc3Npb25fa2V5OwogCi0jZGVmaW5lIE9TQ19GTEFHUyAoQVNZTkNfVVJHRU5UfEFTWU5DX1JFQURZKQorI2RlZmluZSBPU0NfRkxBR1MgKEFTWU5DX1VSR0VOVCB8IEFTWU5DX1JFQURZKQogCiBpbnQgb3NjX2xvY2tfaW5pdChjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsCiAJCSAgc3RydWN0IGNsX29iamVjdCAqb2JqLCBzdHJ1Y3QgY2xfbG9jayAqbG9jaywKQEAgLTYwOCw3ICs2MDgsNyBAQAogCS8qKiBsaW5rIGxpc3Qgb2Ygb3NjX29iamVjdCdzIG9vX3tocHx1cmdlbnR8bG9ja2luZ31fZXh0cy4gKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCSBvZV9saW5rOwogCS8qKiBzdGF0ZSBvZiB0aGlzIGV4dGVudCAqLwotCXVuc2lnbmVkIGludCAgICAgICBvZV9zdGF0ZTsKKwllbnVtIG9zY19leHRlbnRfc3RhdGUJb2Vfc3RhdGU7CiAJLyoqIGZsYWdzIGZvciB0aGlzIGV4dGVudC4gKi8KIAl1bnNpZ25lZCBpbnQgICAgICAgb2VfaW50cmVlOjEsCiAJLyoqIDAgaXMgd3JpdGUsIDEgaXMgcmVhZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19pbnRlcm5hbC5oCmluZGV4IDdhMjdmMDkuLjY3ZmUwYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2ludGVybmFsLmgKQEAgLTcxLDcgKzcxLDYgQEAKIAlzdHJ1Y3QgY2xpZW50X29iZCAgICAgICAqb2FwX2NsaTsKIAlzdHJ1Y3Qgb3NjX29iamVjdCAgICAgICAqb2FwX29iajsKIAotCXN0cnVjdCBsZGxtX2xvY2sJKm9hcF9sZGxtX2xvY2s7CiAJc3BpbmxvY2tfdAkJIG9hcF9sb2NrOwogfTsKIApAQCAtMTM0LDkgKzEzMyw5IEBACiBpbnQgb3NjX3Byb2Nlc3NfY29uZmlnX2Jhc2Uoc3RydWN0IG9iZF9kZXZpY2UgKm9iZCwgc3RydWN0IGx1c3RyZV9jZmcgKmNmZyk7CiBpbnQgb3NjX2J1aWxkX3JwYyhjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBjbGllbnRfb2JkICpjbGksCiAJCSAgc3RydWN0IGxpc3RfaGVhZCAqZXh0X2xpc3QsIGludCBjbWQpOwotaW50IG9zY19scnVfc2hyaW5rKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsaWVudF9vYmQgKmNsaSwKLQkJICAgaW50IHRhcmdldCwgYm9vbCBmb3JjZSk7Ci1pbnQgb3NjX2xydV9yZWNsYWltKHN0cnVjdCBjbGllbnRfb2JkICpjbGkpOworbG9uZyBvc2NfbHJ1X3Nocmluayhjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBjbGllbnRfb2JkICpjbGksCisJCSAgICBsb25nIHRhcmdldCwgYm9vbCBmb3JjZSk7Citsb25nIG9zY19scnVfcmVjbGFpbShzdHJ1Y3QgY2xpZW50X29iZCAqY2xpKTsKIAogdW5zaWduZWQgbG9uZyBvc2NfbGRsbV93ZWlnaF9hc3Qoc3RydWN0IGxkbG1fbG9jayAqZGxtbG9jayk7CiAKQEAgLTE5OCw3ICsxOTcsNyBAQAogaW50IG9zY19xdW90YV9wb2xsX2NoZWNrKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBpZl9xdW90YWNoZWNrICpxY2hrKTsKIHZvaWQgb3NjX2luY191bnN0YWJsZV9wYWdlcyhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSk7CiB2b2lkIG9zY19kZWNfdW5zdGFibGVfcGFnZXMoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpOwotaW50ICBvc2Nfb3Zlcl91bnN0YWJsZV9zb2Z0X2xpbWl0KHN0cnVjdCBjbGllbnRfb2JkICpjbGkpOworYm9vbCBvc2Nfb3Zlcl91bnN0YWJsZV9zb2Z0X2xpbWl0KHN0cnVjdCBjbGllbnRfb2JkICpjbGkpOwogCiBzdHJ1Y3QgbGRsbV9sb2NrICpvc2NfZGxtbG9ja19hdF9wZ29mZihjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsCiAJCQkJICAgICAgIHN0cnVjdCBvc2Nfb2JqZWN0ICpvYmosIHBnb2ZmX3QgaW5kZXgsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2lvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2lvLmMKaW5kZXggNmUzZGNkMy4uOGE1NTljYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19pby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfaW8uYwpAQCAtMTA5LDExICsxMDksMTEgQEAKIAogCXN0cnVjdCBjbF9wYWdlX2xpc3QgKnFpbiA9ICZxdWV1ZS0+YzJfcWluOwogCXN0cnVjdCBjbF9wYWdlX2xpc3QgKnFvdXQgPSAmcXVldWUtPmMyX3FvdXQ7Ci0JaW50IHF1ZXVlZCA9IDA7CisJdW5zaWduZWQgaW50IHF1ZXVlZCA9IDA7CiAJaW50IHJlc3VsdCA9IDA7CiAJaW50IGNtZDsKIAlpbnQgYnJ3X2ZsYWdzOwotCWludCBtYXhfcGFnZXM7CisJdW5zaWduZWQgaW50IG1heF9wYWdlczsKIAogCUxBU1NFUlQocWluLT5wbF9uciA+IDApOwogCkBAIC0xNjMsMTQgKzE2MywxOSBAQAogCQkJY29udGludWU7CiAJCX0KIAotCQljbF9wYWdlX2xpc3RfbW92ZShxb3V0LCBxaW4sIHBhZ2UpOwogCQlzcGluX2xvY2soJm9hcC0+b2FwX2xvY2spOwotCQlvYXAtPm9hcF9hc3luY19mbGFncyA9IEFTWU5DX1VSR0VOVHxBU1lOQ19SRUFEWTsKKwkJb2FwLT5vYXBfYXN5bmNfZmxhZ3MgPSBBU1lOQ19VUkdFTlQgfCBBU1lOQ19SRUFEWTsKIAkJb2FwLT5vYXBfYXN5bmNfZmxhZ3MgfD0gQVNZTkNfQ09VTlRfU1RBQkxFOwogCQlzcGluX3VubG9jaygmb2FwLT5vYXBfbG9jayk7CiAKIAkJb3NjX3BhZ2Vfc3VibWl0KGVudiwgb3BnLCBjcnQsIGJyd19mbGFncyk7CiAJCWxpc3RfYWRkX3RhaWwoJm9hcC0+b2FwX3BlbmRpbmdfaXRlbSwgJmxpc3QpOworCisJCWlmIChwYWdlLT5jcF9zeW5jX2lvKQorCQkJY2xfcGFnZV9saXN0X21vdmUocW91dCwgcWluLCBwYWdlKTsKKwkJZWxzZSAvKiBhc3luYyBJTyAqLworCQkJY2xfcGFnZV9saXN0X2RlbChlbnYsIHFpbiwgcGFnZSk7CisKIAkJaWYgKCsrcXVldWVkID09IG1heF9wYWdlcykgewogCQkJcXVldWVkID0gMDsKIAkJCXJlc3VsdCA9IG9zY19xdWV1ZV9zeW5jX3BhZ2VzKGVudiwgb3NjLCAmbGlzdCwgY21kLApAQCAtMTk1LDcgKzIwMCw3IEBACiAgKiBFeHBhbmQgc3RyaXBlIEtNUyBpZiBuZWNlc3NhcnkuCiAgKi8KIHN0YXRpYyB2b2lkIG9zY19wYWdlX3RvdWNoX2F0KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwKLQkJCSAgICAgIHN0cnVjdCBjbF9vYmplY3QgKm9iaiwgcGdvZmZfdCBpZHgsIHVuc2lnbmVkIHRvKQorCQkJICAgICAgc3RydWN0IGNsX29iamVjdCAqb2JqLCBwZ29mZl90IGlkeCwgc2l6ZV90IHRvKQogewogCXN0cnVjdCBsb3Zfb2luZm8gKmxvaSA9IGNsMm9zYyhvYmopLT5vb19vaW5mbzsKIAlzdHJ1Y3QgY2xfYXR0ciAqYXR0ciA9ICZvc2NfZW52X2luZm8oZW52KS0+b3RpX2F0dHI7CkBAIC0yMjgsNyArMjMzLDcgQEAKIAkJYXR0ci0+Y2F0X3NpemUgPSBrbXM7CiAJCXZhbGlkIHw9IENBVF9TSVpFOwogCX0KLQljbF9vYmplY3RfYXR0cl9zZXQoZW52LCBvYmosIGF0dHIsIHZhbGlkKTsKKwljbF9vYmplY3RfYXR0cl91cGRhdGUoZW52LCBvYmosIGF0dHIsIHZhbGlkKTsKIAljbF9vYmplY3RfYXR0cl91bmxvY2sob2JqKTsKIH0KIApAQCAtMzE0LDggKzMxOSw4IEBACiAJc3RydWN0IG9zY19vYmplY3QgKm9zYyA9IGNsMm9zYyhpb3MtPmNpc19vYmopOwogCXN0cnVjdCBjbGllbnRfb2JkICpjbGkgPSBvc2NfY2xpKG9zYyk7CiAJdW5zaWduZWQgbG9uZyBjOwotCXVuc2lnbmVkIGludCBucGFnZXM7Ci0JdW5zaWduZWQgaW50IG1heF9wYWdlczsKKwl1bnNpZ25lZCBsb25nIG5wYWdlczsKKwl1bnNpZ25lZCBsb25nIG1heF9wYWdlczsKIAogCWlmIChjbF9pb19pc19hcHBlbmQoaW8pKQogCQlyZXR1cm4gMDsKQEAgLTMyOCwxNSArMzMzLDE1IEBACiAJaWYgKG5wYWdlcyA+IG1heF9wYWdlcykKIAkJbnBhZ2VzID0gbWF4X3BhZ2VzOwogCi0JYyA9IGF0b21pY19yZWFkKGNsaS0+Y2xfbHJ1X2xlZnQpOworCWMgPSBhdG9taWNfbG9uZ19yZWFkKGNsaS0+Y2xfbHJ1X2xlZnQpOwogCWlmIChjIDwgbnBhZ2VzICYmIG9zY19scnVfcmVjbGFpbShjbGkpID4gMCkKLQkJYyA9IGF0b21pY19yZWFkKGNsaS0+Y2xfbHJ1X2xlZnQpOworCQljID0gYXRvbWljX2xvbmdfcmVhZChjbGktPmNsX2xydV9sZWZ0KTsKIAl3aGlsZSAoYyA+PSBucGFnZXMpIHsKLQkJaWYgKGMgPT0gYXRvbWljX2NtcHhjaGcoY2xpLT5jbF9scnVfbGVmdCwgYywgYyAtIG5wYWdlcykpIHsKKwkJaWYgKGMgPT0gYXRvbWljX2xvbmdfY21weGNoZyhjbGktPmNsX2xydV9sZWZ0LCBjLCBjIC0gbnBhZ2VzKSkgewogCQkJb2lvLT5vaV9scnVfcmVzZXJ2ZWQgPSBucGFnZXM7CiAJCQlicmVhazsKIAkJfQotCQljID0gYXRvbWljX3JlYWQoY2xpLT5jbF9scnVfbGVmdCk7CisJCWMgPSBhdG9taWNfbG9uZ19yZWFkKGNsaS0+Y2xfbHJ1X2xlZnQpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMzUwLDcgKzM1NSw3IEBACiAJc3RydWN0IGNsaWVudF9vYmQgKmNsaSA9IG9zY19jbGkob3NjKTsKIAogCWlmIChvaW8tPm9pX2xydV9yZXNlcnZlZCA+IDApIHsKLQkJYXRvbWljX2FkZChvaW8tPm9pX2xydV9yZXNlcnZlZCwgY2xpLT5jbF9scnVfbGVmdCk7CisJCWF0b21pY19sb25nX2FkZChvaW8tPm9pX2xydV9yZXNlcnZlZCwgY2xpLT5jbF9scnVfbGVmdCk7CiAJCW9pby0+b2lfbHJ1X3Jlc2VydmVkID0gMDsKIAl9CiAJb2lvLT5vaV93cml0ZV9vc2Nsb2NrID0gTlVMTDsKQEAgLTM2NCw3ICszNjksNyBAQAogCiAJaW8gPSBpb3MtPmNpc19pbzsKIAlmaW8gPSAmaW8tPnUuY2lfZmF1bHQ7Ci0JQ0RFQlVHKERfSU5GTywgIiVsdSAlZCAlZFxuIiwKKwlDREVCVUcoRF9JTkZPLCAiJWx1ICVkICV6dVxuIiwKIAkgICAgICAgZmlvLT5mdF9pbmRleCwgZmlvLT5mdF93cml0YWJsZSwgZmlvLT5mdF9ub2IpOwogCS8qCiAJICogSWYgbWFwcGluZyBpcyB3cml0ZWFibGUsIGFkanVzdCBrbXMgdG8gY292ZXIgdGhpcyBwYWdlLApAQCAtNDcxLDE4ICs0NzYsMjEgQEAKIAkJCQlhdHRyLT5jYXRfY3RpbWUgPSBsdmItPmx2Yl9jdGltZTsKIAkJCQljbF92YWxpZCB8PSBDQVRfQ1RJTUU7CiAJCQl9Ci0JCQlyZXN1bHQgPSBjbF9vYmplY3RfYXR0cl9zZXQoZW52LCBvYmosIGF0dHIsIGNsX3ZhbGlkKTsKKwkJCXJlc3VsdCA9IGNsX29iamVjdF9hdHRyX3VwZGF0ZShlbnYsIG9iaiwgYXR0ciwKKwkJCQkJCSAgICAgICBjbF92YWxpZCk7CiAJCX0KIAkJY2xfb2JqZWN0X2F0dHJfdW5sb2NrKG9iaik7CiAJfQogCW1lbXNldChvYSwgMCwgc2l6ZW9mKCpvYSkpOwogCWlmIChyZXN1bHQgPT0gMCkgewogCQlvYS0+b19vaSA9IGxvaS0+bG9pX29pOworCQlvYmRvX3NldF9wYXJlbnRfZmlkKG9hLCBpby0+dS5jaV9zZXRhdHRyLnNhX3BhcmVudF9maWQpOworCQlvYS0+b19zdHJpcGVfaWR4ID0gaW8tPnUuY2lfc2V0YXR0ci5zYV9zdHJpcGVfaW5kZXg7CiAJCW9hLT5vX210aW1lID0gYXR0ci0+Y2F0X210aW1lOwogCQlvYS0+b19hdGltZSA9IGF0dHItPmNhdF9hdGltZTsKIAkJb2EtPm9fY3RpbWUgPSBhdHRyLT5jYXRfY3RpbWU7Ci0JCW9hLT5vX3ZhbGlkID0gT0JEX01EX0ZMSUQgfCBPQkRfTURfRkxHUk9VUCB8IE9CRF9NRF9GTEFUSU1FIHwKLQkJCU9CRF9NRF9GTENUSU1FIHwgT0JEX01EX0ZMTVRJTUU7CisJCW9hLT5vX3ZhbGlkIHw9IE9CRF9NRF9GTElEIHwgT0JEX01EX0ZMR1JPVVAgfCBPQkRfTURfRkxBVElNRSB8CisJCQkgICAgICAgT0JEX01EX0ZMQ1RJTUUgfCBPQkRfTURfRkxNVElNRTsKIAkJaWYgKGlhX3ZhbGlkICYgQVRUUl9TSVpFKSB7CiAJCQlvYS0+b19zaXplID0gc2l6ZTsKIAkJCW9hLT5vX2Jsb2NrcyA9IE9CRF9PQkpFQ1RfRU9GOwpAQCAtNTU5LDcgKzU2Nyw3IEBACiAJaWYgKCFzbGljZS0+Y2lzX2lvLT5jaV9ub2F0aW1lKSB7CiAJCWNsX29iamVjdF9hdHRyX2xvY2sob2JqKTsKIAkJYXR0ci0+Y2F0X2F0aW1lID0ga3RpbWVfZ2V0X3JlYWxfc2Vjb25kcygpOwotCQlyYyA9IGNsX29iamVjdF9hdHRyX3NldChlbnYsIG9iaiwgYXR0ciwgQ0FUX0FUSU1FKTsKKwkJcmMgPSBjbF9vYmplY3RfYXR0cl91cGRhdGUoZW52LCBvYmosIGF0dHIsIENBVF9BVElNRSk7CiAJCWNsX29iamVjdF9hdHRyX3VubG9jayhvYmopOwogCX0KIAlyZXR1cm4gcmM7CkBAIC01NzYsNyArNTg0LDcgQEAKIAljbF9vYmplY3RfYXR0cl9sb2NrKG9iaik7CiAJYXR0ci0+Y2F0X2N0aW1lID0ga3RpbWVfZ2V0X3JlYWxfc2Vjb25kcygpOwogCWF0dHItPmNhdF9tdGltZSA9IGF0dHItPmNhdF9jdGltZTsKLQlyYyA9IGNsX29iamVjdF9hdHRyX3NldChlbnYsIG9iaiwgYXR0ciwgQ0FUX01USU1FIHwgQ0FUX0NUSU1FKTsKKwlyYyA9IGNsX29iamVjdF9hdHRyX3VwZGF0ZShlbnYsIG9iaiwgYXR0ciwgQ0FUX01USU1FIHwgQ0FUX0NUSU1FKTsKIAljbF9vYmplY3RfYXR0cl91bmxvY2sob2JqKTsKIAogCXJldHVybiByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfbG9jay5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19sb2NrLmMKaW5kZXggNzE3ZDNmZi4uMzlhOGE1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19sb2NrLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19sb2NrLmMKQEAgLTIyMiw3ICsyMjIsNyBAQAogCQlsZGxtX2xvY2tfYWxsb3dfbWF0Y2hfbG9ja2VkKGRsbWxvY2spOwogCX0KIAotCWNsX29iamVjdF9hdHRyX3NldChlbnYsIG9iaiwgYXR0ciwgdmFsaWQpOworCWNsX29iamVjdF9hdHRyX3VwZGF0ZShlbnYsIG9iaiwgYXR0ciwgdmFsaWQpOwogCWNsX29iamVjdF9hdHRyX3VubG9jayhvYmopOwogfQogCkBAIC00NjcsNyArNDY3LDcgQEAKIAkJICovCiAJCWF0dHItPmNhdF9rbXMgPSBsZGxtX2V4dGVudF9zaGlmdF9rbXMoZGxtbG9jaywgb2xkX2ttcyk7CiAKLQkJY2xfb2JqZWN0X2F0dHJfc2V0KGVudiwgb2JqLCBhdHRyLCBDQVRfS01TKTsKKwkJY2xfb2JqZWN0X2F0dHJfdXBkYXRlKGVudiwgb2JqLCBhdHRyLCBDQVRfS01TKTsKIAkJY2xfb2JqZWN0X2F0dHJfdW5sb2NrKG9iaik7CiAJCXVubG9ja19yZXNfYW5kX2xvY2soZGxtbG9jayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2Nfb2JqZWN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX29iamVjdC5jCmluZGV4IGQyMTFkMTkuLmFhZTNhMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2Nfb2JqZWN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19vYmplY3QuYwpAQCAtMTU5LDggKzE1OSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb3NjX2F0dHJfc2V0KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsX29iamVjdCAqb2JqLAotCQkJY29uc3Qgc3RydWN0IGNsX2F0dHIgKmF0dHIsIHVuc2lnbmVkIHZhbGlkKQorc3RhdGljIGludCBvc2NfYXR0cl91cGRhdGUoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmosCisJCQkgICBjb25zdCBzdHJ1Y3QgY2xfYXR0ciAqYXR0ciwgdW5zaWduZWQgaW50IHZhbGlkKQogewogCXN0cnVjdCBsb3Zfb2luZm8gKm9pbmZvID0gY2wyb3NjKG9iaiktPm9vX29pbmZvOwogCXN0cnVjdCBvc3RfbHZiICpsdmIgPSAmb2luZm8tPmxvaV9sdmI7CkBAIC0xOTUsNyArMTk1LDYgQEAKIAogc3RhdGljIGludCBvc2Nfb2JqZWN0X2FzdF9jbGVhcihzdHJ1Y3QgbGRsbV9sb2NrICpsb2NrLCB2b2lkICpkYXRhKQogewotCUxBU1NFUlQobG9jay0+bF9ncmFudGVkX21vZGUgPT0gbG9jay0+bF9yZXFfbW9kZSk7CiAJaWYgKGxvY2stPmxfYXN0X2RhdGEgPT0gZGF0YSkKIAkJbG9jay0+bF9hc3RfZGF0YSA9IE5VTEw7CiAJcmV0dXJuIExETE1fSVRFUl9DT05USU5VRTsKQEAgLTI2Miw3ICsyNjEsNyBAQAogCS5jb29fbG9ja19pbml0ID0gb3NjX2xvY2tfaW5pdCwKIAkuY29vX2lvX2luaXQgICA9IG9zY19pb19pbml0LAogCS5jb29fYXR0cl9nZXQgID0gb3NjX2F0dHJfZ2V0LAotCS5jb29fYXR0cl9zZXQgID0gb3NjX2F0dHJfc2V0LAorCS5jb29fYXR0cl91cGRhdGUgPSBvc2NfYXR0cl91cGRhdGUsCiAJLmNvb19nbGltcHNlICAgPSBvc2Nfb2JqZWN0X2dsaW1wc2UsCiAJLmNvb19wcnVuZSAgICAgPSBvc2Nfb2JqZWN0X3BydW5lCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19wYWdlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX3BhZ2UuYwppbmRleCAzNTVmNDk2Li4yYTdhNzBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX3BhZ2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX3BhZ2UuYwpAQCAtMzIzLDMyICszMjMsNiBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLWludCBvc2Nfb3Zlcl91bnN0YWJsZV9zb2Z0X2xpbWl0KHN0cnVjdCBjbGllbnRfb2JkICpjbGkpCi17Ci0JbG9uZyBvYmRfdXBhZ2VzLCBvYmRfZHBhZ2VzLCBvc2NfdXBhZ2VzOwotCi0JLyogQ2FuJ3QgY2hlY2sgY2xpLT5jbF91bnN0YWJsZV9jb3VudCwgdGhlcmVmb3JlLCBubyBzb2Z0IGxpbWl0ICovCi0JaWYgKCFjbGkpCi0JCXJldHVybiAwOwotCi0Jb2JkX3VwYWdlcyA9IGF0b21pY19yZWFkKCZvYmRfdW5zdGFibGVfcGFnZXMpOwotCW9iZF9kcGFnZXMgPSBhdG9taWNfcmVhZCgmb2JkX2RpcnR5X3BhZ2VzKTsKLQotCW9zY191cGFnZXMgPSBhdG9taWNfcmVhZCgmY2xpLT5jbF91bnN0YWJsZV9jb3VudCk7Ci0KLQkvKgotCSAqIG9iZF9tYXhfZGlydHlfcGFnZXMgaXMgdGhlIG1heCBudW1iZXIgb2YgKGRpcnR5ICsgdW5zdGFibGUpCi0JICogcGFnZXMgYWxsb3dlZCBhdCBhbnkgZ2l2ZW4gdGltZS4gVG8gc2ltdWxhdGUgYW4gdW5zdGFibGUgcGFnZQotCSAqIG9ubHkgbGltaXQsIHdlIHN1YnRyYWN0IHRoZSBjdXJyZW50IG51bWJlciBvZiBkaXJ0eSBwYWdlcwotCSAqIGZyb20gdGhpcyBtYXguIFRoaXMgZGlmZmVyZW5jZSBpcyByb3VnaGx5IHRoZSBhbW91bnQgb2YgcGFnZXMKLQkgKiBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1bnN0YWJsZSBwYWdlcy4gVGh1cywgdGhlIHNvZnQgbGltaXQKLQkgKiBpcyBoYWxmIG9mIHRoYXQgZGlmZmVyZW5jZS4gQ2hlY2sgb3NjX3VwYWdlcyB0byBlbnN1cmUgd2UgZG9uJ3QKLQkgKiBzZXQgU09GVF9TWU5DIGZvciBPU0NzIHdpdGhvdXQgYW55IG91dHN0YW5kaW5nIHVuc3RhYmxlIHBhZ2VzLgotCSAqLwotCXJldHVybiBvc2NfdXBhZ2VzICYmCi0JICAgICAgIG9iZF91cGFnZXMgPj0gKG9iZF9tYXhfZGlydHlfcGFnZXMgLSBvYmRfZHBhZ2VzKSAvIDI7Ci19Ci0KIC8qKgogICogSGVscGVyIGZ1bmN0aW9uIGNhbGxlZCBieSBvc2NfaW9fc3VibWl0KCkgZm9yIGV2ZXJ5IHBhZ2UgaW4gYW4gaW1tZWRpYXRlCiAgKiB0cmFuc2ZlciAoaS5lLiwgdHJhbnNmZXJyZWQgc3luY2hyb25vdXNseSkuCkBAIC0zNjgsOSArMzQyLDYgQEAKIAlvYXAtPm9hcF9jb3VudCA9IG9wZy0+b3BzX3RvIC0gb3BnLT5vcHNfZnJvbTsKIAlvYXAtPm9hcF9icndfZmxhZ3MgPSBicndfZmxhZ3MgfCBPQkRfQlJXX1NZTkM7CiAKLQlpZiAob3NjX292ZXJfdW5zdGFibGVfc29mdF9saW1pdChvYXAtPm9hcF9jbGkpKQotCQlvYXAtPm9hcF9icndfZmxhZ3MgfD0gT0JEX0JSV19TT0ZUX1NZTkM7Ci0KIAlpZiAoY2FwYWJsZShDRlNfQ0FQX1NZU19SRVNPVVJDRSkpIHsKIAkJb2FwLT5vYXBfYnJ3X2ZsYWdzIHw9IE9CRF9CUldfTk9RVU9UQTsKIAkJb2FwLT5vYXBfY21kIHw9IE9CRF9CUldfTk9RVU9UQTsKQEAgLTQwOSw3ICszODAsNyBAQAogc3RhdGljIGludCBvc2NfY2FjaGVfdG9vX211Y2goc3RydWN0IGNsaWVudF9vYmQgKmNsaSkKIHsKIAlzdHJ1Y3QgY2xfY2xpZW50X2NhY2hlICpjYWNoZSA9IGNsaS0+Y2xfY2FjaGU7Ci0JaW50IHBhZ2VzID0gYXRvbWljX3JlYWQoJmNsaS0+Y2xfbHJ1X2luX2xpc3QpOworCWxvbmcgcGFnZXMgPSBhdG9taWNfbG9uZ19yZWFkKCZjbGktPmNsX2xydV9pbl9saXN0KTsKIAl1bnNpZ25lZCBsb25nIGJ1ZGdldDsKIAogCWJ1ZGdldCA9IGNhY2hlLT5jY2NfbHJ1X21heCAvIChhdG9taWNfcmVhZCgmY2FjaGUtPmNjY191c2VycykgLSAyKTsKQEAgLTQxNyw3ICszODgsNyBAQAogCS8qIGlmIGl0J3MgZ29pbmcgdG8gcnVuIG91dCBMUlUgc2xvdHMsIHdlIHNob3VsZCBmcmVlIHNvbWUsIGJ1dCBub3QKIAkgKiB0b28gbXVjaCB0byBtYWludGFpbiBmYWlybmVzcyBhbW9uZyBPU0NzLgogCSAqLwotCWlmIChhdG9taWNfcmVhZChjbGktPmNsX2xydV9sZWZ0KSA8IGNhY2hlLT5jY2NfbHJ1X21heCA+PiA0KSB7CisJaWYgKGF0b21pY19sb25nX3JlYWQoY2xpLT5jbF9scnVfbGVmdCkgPCBjYWNoZS0+Y2NjX2xydV9tYXggPj4gNCkgewogCQlpZiAocGFnZXMgPj0gYnVkZ2V0KQogCQkJcmV0dXJuIGxydV9zaHJpbmtfbWF4OwogCQllbHNlIGlmIChwYWdlcyA+PSBidWRnZXQgLyAyKQpAQCAtNDQ0LDcgKzQxNSw3IEBACiB7CiAJTElTVF9IRUFEKGxydSk7CiAJc3RydWN0IG9zY19hc3luY19wYWdlICpvYXA7Ci0JaW50IG5wYWdlcyA9IDA7CisJbG9uZyBucGFnZXMgPSAwOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShvYXAsIHBsaXN0LCBvYXBfcGVuZGluZ19pdGVtKSB7CiAJCXN0cnVjdCBvc2NfcGFnZSAqb3BnID0gb2FwMm9zY19wYWdlKG9hcCk7CkBAIC00NjAsOCArNDMxLDggQEAKIAlpZiAobnBhZ2VzID4gMCkgewogCQlzcGluX2xvY2soJmNsaS0+Y2xfbHJ1X2xpc3RfbG9jayk7CiAJCWxpc3Rfc3BsaWNlX3RhaWwoJmxydSwgJmNsaS0+Y2xfbHJ1X2xpc3QpOwotCQlhdG9taWNfc3ViKG5wYWdlcywgJmNsaS0+Y2xfbHJ1X2J1c3kpOwotCQlhdG9taWNfYWRkKG5wYWdlcywgJmNsaS0+Y2xfbHJ1X2luX2xpc3QpOworCQlhdG9taWNfbG9uZ19zdWIobnBhZ2VzLCAmY2xpLT5jbF9scnVfYnVzeSk7CisJCWF0b21pY19sb25nX2FkZChucGFnZXMsICZjbGktPmNsX2xydV9pbl9saXN0KTsKIAkJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbHJ1X2xpc3RfbG9jayk7CiAKIAkJLyogWFhYOiBNYXkgc2V0IGZvcmNlIHRvIGJlIHRydWUgZm9yIGJldHRlciBwZXJmb3JtYW5jZSAqLwpAQCAtNDcyLDkgKzQ0Myw5IEBACiAKIHN0YXRpYyB2b2lkIF9fb3NjX2xydV9kZWwoc3RydWN0IGNsaWVudF9vYmQgKmNsaSwgc3RydWN0IG9zY19wYWdlICpvcGcpCiB7Ci0JTEFTU0VSVChhdG9taWNfcmVhZCgmY2xpLT5jbF9scnVfaW5fbGlzdCkgPiAwKTsKKwlMQVNTRVJUKGF0b21pY19sb25nX3JlYWQoJmNsaS0+Y2xfbHJ1X2luX2xpc3QpID4gMCk7CiAJbGlzdF9kZWxfaW5pdCgmb3BnLT5vcHNfbHJ1KTsKLQlhdG9taWNfZGVjKCZjbGktPmNsX2xydV9pbl9saXN0KTsKKwlhdG9taWNfbG9uZ19kZWMoJmNsaS0+Y2xfbHJ1X2luX2xpc3QpOwogfQogCiAvKioKQEAgLTQ4OCwxMiArNDU5LDEyIEBACiAJCWlmICghbGlzdF9lbXB0eSgmb3BnLT5vcHNfbHJ1KSkgewogCQkJX19vc2NfbHJ1X2RlbChjbGksIG9wZyk7CiAJCX0gZWxzZSB7Ci0JCQlMQVNTRVJUKGF0b21pY19yZWFkKCZjbGktPmNsX2xydV9idXN5KSA+IDApOwotCQkJYXRvbWljX2RlYygmY2xpLT5jbF9scnVfYnVzeSk7CisJCQlMQVNTRVJUKGF0b21pY19sb25nX3JlYWQoJmNsaS0+Y2xfbHJ1X2J1c3kpID4gMCk7CisJCQlhdG9taWNfbG9uZ19kZWMoJmNsaS0+Y2xfbHJ1X2J1c3kpOwogCQl9CiAJCXNwaW5fdW5sb2NrKCZjbGktPmNsX2xydV9saXN0X2xvY2spOwogCi0JCWF0b21pY19pbmMoY2xpLT5jbF9scnVfbGVmdCk7CisJCWF0b21pY19sb25nX2luYyhjbGktPmNsX2xydV9sZWZ0KTsKIAkJLyogdGhpcyBpcyBhIGdyZWF0IHBsYWNlIHRvIHJlbGVhc2UgbW9yZSBMUlUgcGFnZXMgaWYKIAkJICogdGhpcyBvc2Mgb2NjdXBpZXMgdG9vIG1hbnkgTFJVIHBhZ2VzIGFuZCBrZXJuZWwgaXMKIAkJICogc3RlYWxpbmcgb25lIG9mIHRoZW0uCkBAIC01MTgsNyArNDg5LDcgQEAKIAkJc3Bpbl9sb2NrKCZjbGktPmNsX2xydV9saXN0X2xvY2spOwogCQlfX29zY19scnVfZGVsKGNsaSwgb3BnKTsKIAkJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbHJ1X2xpc3RfbG9jayk7Ci0JCWF0b21pY19pbmMoJmNsaS0+Y2xfbHJ1X2J1c3kpOworCQlhdG9taWNfbG9uZ19pbmMoJmNsaS0+Y2xfbHJ1X2J1c3kpOwogCX0KIH0KIApAQCAtNTQwLDEwICs1MTEsMzIgQEAKIH0KIAogLyoqCisgKiBDaGVjayBpZiBhIGNsX3BhZ2UgY2FuIGJlIHJlbGVhc2VkLCBpLmUsIGl0J3Mgbm90IGJlaW5nIHVzZWQuCisgKgorICogSWYgdW5zdGFibGUgYWNjb3VudCBpcyB0dXJuZWQgb24sIGJ1bGsgdHJhbnNmZXIgbWF5IGhvbGQgb25lIHJlZmNvdW50CisgKiBmb3IgcmVjb3Zlcnkgc28gd2UgbmVlZCB0byBjaGVjayB2bXBhZ2UgcmVmY291bnQgYXMgd2VsbDsgb3RoZXJ3aXNlLAorICogZXZlbiB3ZSBjYW4gZGVzdHJveSBjbF9wYWdlIGJ1dCB0aGUgY29ycmVzcG9uZGluZyB2bXBhZ2UgY2FuJ3QgYmUgcmV1c2VkLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgbHJ1X3BhZ2VfYnVzeShzdHJ1Y3QgY2xpZW50X29iZCAqY2xpLCBzdHJ1Y3QgY2xfcGFnZSAqcGFnZSkKK3sKKwlpZiAoY2xfcGFnZV9pbl91c2Vfbm9yZWYocGFnZSkpCisJCXJldHVybiB0cnVlOworCisJaWYgKGNsaS0+Y2xfY2FjaGUtPmNjY191bnN0YWJsZV9jaGVjaykgeworCQlzdHJ1Y3QgcGFnZSAqdm1wYWdlID0gY2xfcGFnZV92bXBhZ2UocGFnZSk7CisKKwkJLyogdm1wYWdlIGhhdmUgdHdvIGtub3duIHVzZXJzOiBjbF9wYWdlIGFuZCBWTSBwYWdlIGNhY2hlICovCisJCWlmIChwYWdlX2NvdW50KHZtcGFnZSkgLSBwYWdlX21hcGNvdW50KHZtcGFnZSkgPiAyKQorCQkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworLyoqCiAgKiBEcm9wIEB0YXJnZXQgb2YgcGFnZXMgZnJvbSBMUlUgYXQgbW9zdC4KICAqLwotaW50IG9zY19scnVfc2hyaW5rKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsaWVudF9vYmQgKmNsaSwKLQkJICAgaW50IHRhcmdldCwgYm9vbCBmb3JjZSkKK2xvbmcgb3NjX2xydV9zaHJpbmsoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xpZW50X29iZCAqY2xpLAorCQkgICAgbG9uZyB0YXJnZXQsIGJvb2wgZm9yY2UpCiB7CiAJc3RydWN0IGNsX2lvICppbzsKIAlzdHJ1Y3QgY2xfb2JqZWN0ICpjbG9iaiA9IE5VTEw7CkBAIC01NTEsMTIgKzU0NCwxMiBAQAogCXN0cnVjdCBvc2NfcGFnZSAqb3BnOwogCXN0cnVjdCBvc2NfcGFnZSAqdGVtcDsKIAlpbnQgbWF4c2NhbiA9IDA7Ci0JaW50IGNvdW50ID0gMDsKKwlsb25nIGNvdW50ID0gMDsKIAlpbnQgaW5kZXggPSAwOwogCWludCByYyA9IDA7CiAKLQlMQVNTRVJUKGF0b21pY19yZWFkKCZjbGktPmNsX2xydV9pbl9saXN0KSA+PSAwKTsKLQlpZiAoYXRvbWljX3JlYWQoJmNsaS0+Y2xfbHJ1X2luX2xpc3QpID09IDAgfHwgdGFyZ2V0IDw9IDApCisJTEFTU0VSVChhdG9taWNfbG9uZ19yZWFkKCZjbGktPmNsX2xydV9pbl9saXN0KSA+PSAwKTsKKwlpZiAoYXRvbWljX2xvbmdfcmVhZCgmY2xpLT5jbF9scnVfaW5fbGlzdCkgPT0gMCB8fCB0YXJnZXQgPD0gMCkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoIWZvcmNlKSB7CkBAIC01NzUsNyArNTY4LDcgQEAKIAlpbyA9ICZvc2NfZW52X2luZm8oZW52KS0+b3RpX2lvOwogCiAJc3Bpbl9sb2NrKCZjbGktPmNsX2xydV9saXN0X2xvY2spOwotCW1heHNjYW4gPSBtaW4odGFyZ2V0IDw8IDEsIGF0b21pY19yZWFkKCZjbGktPmNsX2xydV9pbl9saXN0KSk7CisJbWF4c2NhbiA9IG1pbih0YXJnZXQgPDwgMSwgYXRvbWljX2xvbmdfcmVhZCgmY2xpLT5jbF9scnVfaW5fbGlzdCkpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShvcGcsIHRlbXAsICZjbGktPmNsX2xydV9saXN0LCBvcHNfbHJ1KSB7CiAJCXN0cnVjdCBjbF9wYWdlICpwYWdlOwogCQlib29sIHdpbGxfZnJlZSA9IGZhbHNlOwpAQCAtNTg0LDcgKzU3Nyw3IEBACiAJCQlicmVhazsKIAogCQlwYWdlID0gb3BnLT5vcHNfY2wuY3BsX3BhZ2U7Ci0JCWlmIChjbF9wYWdlX2luX3VzZV9ub3JlZihwYWdlKSkgeworCQlpZiAobHJ1X3BhZ2VfYnVzeShjbGksIHBhZ2UpKSB7CiAJCQlsaXN0X21vdmVfdGFpbCgmb3BnLT5vcHNfbHJ1LCAmY2xpLT5jbF9scnVfbGlzdCk7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtNjIwLDcgKzYxMyw3IEBACiAJCX0KIAogCQlpZiAoY2xfcGFnZV9vd25fdHJ5KGVudiwgaW8sIHBhZ2UpID09IDApIHsKLQkJCWlmICghY2xfcGFnZV9pbl91c2Vfbm9yZWYocGFnZSkpIHsKKwkJCWlmICghbHJ1X3BhZ2VfYnVzeShjbGksIHBhZ2UpKSB7CiAJCQkJLyogcmVtb3ZlIGl0IGZyb20gbHJ1IGxpc3QgZWFybGllciB0byBhdm9pZAogCQkJCSAqIGxvY2sgY29udGVudGlvbgogCQkJCSAqLwpAQCAtNjYzLDI0ICs2NTYsMTkgQEAKIAogCWF0b21pY19kZWMoJmNsaS0+Y2xfbHJ1X3Nocmlua2Vycyk7CiAJaWYgKGNvdW50ID4gMCkgewotCQlhdG9taWNfYWRkKGNvdW50LCBjbGktPmNsX2xydV9sZWZ0KTsKKwkJYXRvbWljX2xvbmdfYWRkKGNvdW50LCBjbGktPmNsX2xydV9sZWZ0KTsKIAkJd2FrZV91cF9hbGwoJm9zY19scnVfd2FpdHEpOwogCX0KIAlyZXR1cm4gY291bnQgPiAwID8gY291bnQgOiByYzsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgbWF4X3RvX3NocmluayhzdHJ1Y3QgY2xpZW50X29iZCAqY2xpKQotewotCXJldHVybiBtaW4oYXRvbWljX3JlYWQoJmNsaS0+Y2xfbHJ1X2luX2xpc3QpID4+IDEsIGxydV9zaHJpbmtfbWF4KTsKLX0KLQotaW50IG9zY19scnVfcmVjbGFpbShzdHJ1Y3QgY2xpZW50X29iZCAqY2xpKQorbG9uZyBvc2NfbHJ1X3JlY2xhaW0oc3RydWN0IGNsaWVudF9vYmQgKmNsaSkKIHsKIAlzdHJ1Y3QgY2xfZW52X25lc3QgbmVzdDsKIAlzdHJ1Y3QgbHVfZW52ICplbnY7CiAJc3RydWN0IGNsX2NsaWVudF9jYWNoZSAqY2FjaGUgPSBjbGktPmNsX2NhY2hlOwogCWludCBtYXhfc2NhbnM7Ci0JaW50IHJjID0gMDsKKwlsb25nIHJjID0gMDsKIAogCUxBU1NFUlQoY2FjaGUpOwogCkBAIC02OTMsMTUgKzY4MSwxNSBAQAogCQlpZiAocmMgPT0gLUVCVVNZKQogCQkJcmMgPSAwOwogCi0JCUNERUJVRyhEX0NBQ0hFLCAiJXM6IEZyZWUgJWQgcGFnZXMgZnJvbSBvd24gTFJVOiAlcC5cbiIsCisJCUNERUJVRyhEX0NBQ0hFLCAiJXM6IEZyZWUgJWxkIHBhZ2VzIGZyb20gb3duIExSVTogJXAuXG4iLAogCQkgICAgICAgY2xpLT5jbF9pbXBvcnQtPmltcF9vYmQtPm9iZF9uYW1lLCByYywgY2xpKTsKIAkJZ290byBvdXQ7CiAJfQogCi0JQ0RFQlVHKERfQ0FDSEUsICIlczogY2xpICVwIG5vIGZyZWUgc2xvdHMsIHBhZ2VzOiAlZCwgYnVzeTogJWQuXG4iLAorCUNERUJVRyhEX0NBQ0hFLCAiJXM6IGNsaSAlcCBubyBmcmVlIHNsb3RzLCBwYWdlczogJWxkLCBidXN5OiAlbGQuXG4iLAogCSAgICAgICBjbGktPmNsX2ltcG9ydC0+aW1wX29iZC0+b2JkX25hbWUsIGNsaSwKLQkgICAgICAgYXRvbWljX3JlYWQoJmNsaS0+Y2xfbHJ1X2luX2xpc3QpLAotCSAgICAgICBhdG9taWNfcmVhZCgmY2xpLT5jbF9scnVfYnVzeSkpOworCSAgICAgICBhdG9taWNfbG9uZ19yZWFkKCZjbGktPmNsX2xydV9pbl9saXN0KSwKKwkgICAgICAgYXRvbWljX2xvbmdfcmVhZCgmY2xpLT5jbF9scnVfYnVzeSkpOwogCiAJLyogUmVjbGFpbSBMUlUgc2xvdHMgZnJvbSBvdGhlciBjbGllbnRfb2JkIGFzIGl0IGNhbid0IGZyZWUgZW5vdWdoCiAJICogZnJvbSBpdHMgb3duLiBUaGlzIHNob3VsZCByYXJlbHkgaGFwcGVuLgpAQCAtNzE3LDEwICs3MDUsMTAgQEAKIAkJY2xpID0gbGlzdF9lbnRyeShjYWNoZS0+Y2NjX2xydS5uZXh0LCBzdHJ1Y3QgY2xpZW50X29iZCwKIAkJCQkgY2xfbHJ1X29zYyk7CiAKLQkJQ0RFQlVHKERfQ0FDSEUsICIlczogY2xpICVwIExSVSBwYWdlczogJWQsIGJ1c3k6ICVkLlxuIiwKKwkJQ0RFQlVHKERfQ0FDSEUsICIlczogY2xpICVwIExSVSBwYWdlczogJWxkLCBidXN5OiAlbGQuXG4iLAogCQkgICAgICAgY2xpLT5jbF9pbXBvcnQtPmltcF9vYmQtPm9iZF9uYW1lLCBjbGksCi0JCSAgICAgICBhdG9taWNfcmVhZCgmY2xpLT5jbF9scnVfaW5fbGlzdCksCi0JCSAgICAgICBhdG9taWNfcmVhZCgmY2xpLT5jbF9scnVfYnVzeSkpOworCQkgICAgICAgYXRvbWljX2xvbmdfcmVhZCgmY2xpLT5jbF9scnVfaW5fbGlzdCksCisJCSAgICAgICBhdG9taWNfbG9uZ19yZWFkKCZjbGktPmNsX2xydV9idXN5KSk7CiAKIAkJbGlzdF9tb3ZlX3RhaWwoJmNsaS0+Y2xfbHJ1X29zYywgJmNhY2hlLT5jY2NfbHJ1KTsKIAkJaWYgKG9zY19jYWNoZV90b29fbXVjaChjbGkpID4gMCkgewpAQCAtNzM3LDExICs3MjUsMTggQEAKIAogb3V0OgogCWNsX2Vudl9uZXN0ZWRfcHV0KCZuZXN0LCBlbnYpOwotCUNERUJVRyhEX0NBQ0hFLCAiJXM6IGNsaSAlcCBmcmVlZCAlZCBwYWdlcy5cbiIsCisJQ0RFQlVHKERfQ0FDSEUsICIlczogY2xpICVwIGZyZWVkICVsZCBwYWdlcy5cbiIsCiAJICAgICAgIGNsaS0+Y2xfaW1wb3J0LT5pbXBfb2JkLT5vYmRfbmFtZSwgY2xpLCByYyk7CiAJcmV0dXJuIHJjOwogfQogCisvKioKKyAqIG9zY19scnVfcmVzZXJ2ZSgpIGlzIGNhbGxlZCB0byByZXNlcnZlIGFuIExSVSBzbG90IGZvciBhIGNsX3BhZ2UuCisgKgorICogVXN1YWxseSB0aGUgTFJVIHNsb3RzIGFyZSByZXNlcnZlZCBpbiBvc2NfaW9faXRlcl9yd19pbml0KCkuCisgKiBPbmx5IGluIHRoZSBjYXNlIHRoYXQgdGhlIExSVSBzbG90cyBhcmUgaW4gZXh0cmVtZSBzaG9ydGFnZSwgaXQgc2hvdWxkCisgKiBoYXZlIHJlc2VydmVkIGVub3VnaCBzbG90cyBmb3IgYW4gSU8uCisgKi8KIHN0YXRpYyBpbnQgb3NjX2xydV9yZXNlcnZlKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IG9zY19vYmplY3QgKm9iaiwKIAkJCSAgIHN0cnVjdCBvc2NfcGFnZSAqb3BnKQogewpAQCAtNzU4LDggKzc1Myw4IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCUxBU1NFUlQoYXRvbWljX3JlYWQoY2xpLT5jbF9scnVfbGVmdCkgPj0gMCk7Ci0Jd2hpbGUgKCFhdG9taWNfYWRkX3VubGVzcyhjbGktPmNsX2xydV9sZWZ0LCAtMSwgMCkpIHsKKwlMQVNTRVJUKGF0b21pY19sb25nX3JlYWQoY2xpLT5jbF9scnVfbGVmdCkgPj0gMCk7CisJd2hpbGUgKCFhdG9taWNfbG9uZ19hZGRfdW5sZXNzKGNsaS0+Y2xfbHJ1X2xlZnQsIC0xLCAwKSkgewogCQkvKiBydW4gb3V0IG9mIExSVSBzcGFjZXMsIHRyeSB0byBkcm9wIHNvbWUgYnkgaXRzZWxmICovCiAJCXJjID0gb3NjX2xydV9yZWNsYWltKGNsaSk7CiAJCWlmIChyYyA8IDApCkBAIC03NzAsNyArNzY1LDcgQEAKIAkJY29uZF9yZXNjaGVkKCk7CiAKIAkJcmMgPSBsX3dhaXRfZXZlbnQob3NjX2xydV93YWl0cSwKLQkJCQkgIGF0b21pY19yZWFkKGNsaS0+Y2xfbHJ1X2xlZnQpID4gMCwKKwkJCQkgIGF0b21pY19sb25nX3JlYWQoY2xpLT5jbF9scnVfbGVmdCkgPiAwLAogCQkJCSAgJmx3aSk7CiAKIAkJaWYgKHJjIDwgMCkKQEAgLTc3OSw3ICs3NzQsNyBAQAogCiBvdXQ6CiAJaWYgKHJjID49IDApIHsKLQkJYXRvbWljX2luYygmY2xpLT5jbF9scnVfYnVzeSk7CisJCWF0b21pY19sb25nX2luYygmY2xpLT5jbF9scnVfYnVzeSk7CiAJCW9wZy0+b3BzX2luX2xydSA9IDE7CiAJCXJjID0gMDsKIAl9CkBAIC03ODcsNCArNzgyLDE1MSBAQAogCXJldHVybiByYzsKIH0KIAorLyoqCisgKiBBdG9taWMgb3BlcmF0aW9ucyBhcmUgZXhwZW5zaXZlLiBXZSBhY2N1bXVsYXRlIHRoZSBhY2NvdW50aW5nIGZvciB0aGUKKyAqIHNhbWUgcGFnZSBwZ2RhdCB0byBnZXQgYmV0dGVyIHBlcmZvcm1hbmNlLgorICogSW4gcHJhY3RpY2UgdGhpcyBjYW4gd29yayBwcmV0dHkgZ29vZCBiZWNhdXNlIHRoZSBwYWdlcyBpbiB0aGUgc2FtZSBSUEMKKyAqIGFyZSBsaWtlbHkgZnJvbSB0aGUgc2FtZSBwYWdlIHpvbmUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB1bnN0YWJsZV9wYWdlX2FjY291bnRpbmcoc3RydWN0IHB0bHJwY19idWxrX2Rlc2MgKmRlc2MsCisJCQkJCSAgICBpbnQgZmFjdG9yKQoreworCWludCBwYWdlX2NvdW50ID0gZGVzYy0+YmRfaW92X2NvdW50OworCXBnX2RhdGFfdCAqbGFzdCA9IE5VTEw7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwYWdlX2NvdW50OyBpKyspIHsKKwkJcGdfZGF0YV90ICpwZ2RhdCA9IHBhZ2VfcGdkYXQoZGVzYy0+YmRfaW92W2ldLmJ2X3BhZ2UpOworCisJCWlmIChsaWtlbHkocGdkYXQgPT0gbGFzdCkpIHsKKwkJCSsrY291bnQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChjb3VudCA+IDApIHsKKwkJCW1vZF9ub2RlX3BhZ2Vfc3RhdGUocGdkYXQsIE5SX1VOU1RBQkxFX05GUywKKwkJCQkJICAgIGZhY3RvciAqIGNvdW50KTsKKwkJCWNvdW50ID0gMDsKKwkJfQorCQlsYXN0ID0gcGdkYXQ7CisJCSsrY291bnQ7CisJfQorCWlmIChjb3VudCA+IDApCisJCW1vZF9ub2RlX3BhZ2Vfc3RhdGUobGFzdCwgTlJfVU5TVEFCTEVfTkZTLCBmYWN0b3IgKiBjb3VudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGRfdW5zdGFibGVfcGFnZV9hY2NvdW50aW5nKHN0cnVjdCBwdGxycGNfYnVsa19kZXNjICpkZXNjKQoreworCXVuc3RhYmxlX3BhZ2VfYWNjb3VudGluZyhkZXNjLCAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRlY191bnN0YWJsZV9wYWdlX2FjY291bnRpbmcoc3RydWN0IHB0bHJwY19idWxrX2Rlc2MgKmRlc2MpCit7CisJdW5zdGFibGVfcGFnZV9hY2NvdW50aW5nKGRlc2MsIC0xKTsKK30KKworLyoqCisgKiBQZXJmb3JtcyAidW5zdGFibGUiIHBhZ2UgYWNjb3VudGluZy4gVGhpcyBmdW5jdGlvbiBiYWxhbmNlcyB0aGUKKyAqIGluY3JlbWVudCBvcGVyYXRpb25zIHBlcmZvcm1lZCBpbiBvc2NfaW5jX3Vuc3RhYmxlX3BhZ2VzLiBJdCBpcworICogcmVnaXN0ZXJlZCBhcyB0aGUgUlBDIHJlcXVlc3QgY2FsbGJhY2ssIGFuZCBpcyBleGVjdXRlZCB3aGVuIHRoZQorICogYnVsayBSUEMgaXMgY29tbWl0dGVkIG9uIHRoZSBzZXJ2ZXIuIFRodXMgYXQgdGhpcyBwb2ludCwgdGhlIHBhZ2VzCisgKiBpbnZvbHZlZCBpbiB0aGUgYnVsayB0cmFuc2ZlciBhcmUgbm8gbG9uZ2VyIGNvbnNpZGVyZWQgdW5zdGFibGUuCisgKgorICogSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoZSByZXF1ZXN0IHNob3VsZCBoYXZlIGJlZW4gY29tbWl0dGVkCisgKiBvciByZXE6cnFfdW5zdGFibGUgbXVzdCBoYXZlIGJlZW4gc2V0OyBpdCBpbXBsaWVzIHRoYXQgdGhlIHVuc3RhYmxlCisgKiBzdGF0aXN0aWMgaGF2ZSBiZWVuIGFkZGVkLgorICovCit2b2lkIG9zY19kZWNfdW5zdGFibGVfcGFnZXMoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IGNsaWVudF9vYmQgKmNsaSA9ICZyZXEtPnJxX2ltcG9ydC0+aW1wX29iZC0+dS5jbGk7CisJc3RydWN0IHB0bHJwY19idWxrX2Rlc2MgKmRlc2MgPSByZXEtPnJxX2J1bGs7CisJaW50IHBhZ2VfY291bnQgPSBkZXNjLT5iZF9pb3ZfY291bnQ7CisJbG9uZyB1bnN0YWJsZV9jb3VudDsKKworCUxBU1NFUlQocGFnZV9jb3VudCA+PSAwKTsKKwlkZWNfdW5zdGFibGVfcGFnZV9hY2NvdW50aW5nKGRlc2MpOworCisJdW5zdGFibGVfY291bnQgPSBhdG9taWNfbG9uZ19zdWJfcmV0dXJuKHBhZ2VfY291bnQsCisJCQkJCQkmY2xpLT5jbF91bnN0YWJsZV9jb3VudCk7CisJTEFTU0VSVCh1bnN0YWJsZV9jb3VudCA+PSAwKTsKKworCXVuc3RhYmxlX2NvdW50ID0gYXRvbWljX2xvbmdfc3ViX3JldHVybihwYWdlX2NvdW50LAorCQkJCQkJJmNsaS0+Y2xfY2FjaGUtPmNjY191bnN0YWJsZV9ucik7CisJTEFTU0VSVCh1bnN0YWJsZV9jb3VudCA+PSAwKTsKKwlpZiAoIXVuc3RhYmxlX2NvdW50KQorCQl3YWtlX3VwX2FsbCgmY2xpLT5jbF9jYWNoZS0+Y2NjX3Vuc3RhYmxlX3dhaXRxKTsKKworCWlmIChvc2NfY2FjaGVfdG9vX211Y2goY2xpKSkKKwkJKHZvaWQpcHRscnBjZF9xdWV1ZV93b3JrKGNsaS0+Y2xfbHJ1X3dvcmspOworfQorCisvKioKKyAqICJ1bnN0YWJsZSIgcGFnZSBhY2NvdW50aW5nLiBTZWU6IG9zY19kZWNfdW5zdGFibGVfcGFnZXMuCisgKi8KK3ZvaWQgb3NjX2luY191bnN0YWJsZV9wYWdlcyhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpICA9ICZyZXEtPnJxX2ltcG9ydC0+aW1wX29iZC0+dS5jbGk7CisJc3RydWN0IHB0bHJwY19idWxrX2Rlc2MgKmRlc2MgPSByZXEtPnJxX2J1bGs7CisJbG9uZyBwYWdlX2NvdW50ID0gZGVzYy0+YmRfaW92X2NvdW50OworCisJLyogTm8gdW5zdGFibGUgcGFnZSB0cmFja2luZyAqLworCWlmICghY2xpLT5jbF9jYWNoZSB8fCAhY2xpLT5jbF9jYWNoZS0+Y2NjX3Vuc3RhYmxlX2NoZWNrKQorCQlyZXR1cm47CisKKwlhZGRfdW5zdGFibGVfcGFnZV9hY2NvdW50aW5nKGRlc2MpOworCWF0b21pY19sb25nX2FkZChwYWdlX2NvdW50LCAmY2xpLT5jbF91bnN0YWJsZV9jb3VudCk7CisJYXRvbWljX2xvbmdfYWRkKHBhZ2VfY291bnQsICZjbGktPmNsX2NhY2hlLT5jY2NfdW5zdGFibGVfbnIpOworCisJLyoKKwkgKiBJZiB0aGUgcmVxdWVzdCBoYXMgYWxyZWFkeSBiZWVuIGNvbW1pdHRlZCAoaS5lLiBicndfY29tbWl0CisJICogY2FsbGVkIHZpYSBycV9jb21taXRfY2IpLCB3ZSBuZWVkIHRvIHVuZG8gdGhlIHVuc3RhYmxlIHBhZ2UKKwkgKiBpbmNyZW1lbnRzIHdlIGp1c3QgcGVyZm9ybWVkIGJlY2F1c2UgcnFfY29tbWl0X2NiIHdvbnQgYmUKKwkgKiBjYWxsZWQgYWdhaW4uCisJICovCisJc3Bpbl9sb2NrKCZyZXEtPnJxX2xvY2spOworCWlmICh1bmxpa2VseShyZXEtPnJxX2NvbW1pdHRlZCkpIHsKKwkJc3Bpbl91bmxvY2soJnJlcS0+cnFfbG9jayk7CisKKwkJb3NjX2RlY191bnN0YWJsZV9wYWdlcyhyZXEpOworCX0gZWxzZSB7CisJCXJlcS0+cnFfdW5zdGFibGUgPSAxOworCQlzcGluX3VubG9jaygmcmVxLT5ycV9sb2NrKTsKKwl9Cit9CisKKy8qKgorICogQ2hlY2sgaWYgaXQgcGlnZ3liYWNrcyBTT0ZUX1NZTkMgZmxhZyB0byBPU1QgZnJvbSB0aGlzIE9TQy4KKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYnkgZXZlcnkgQlJXIFJQQyBzbyBpdCdzIGNyaXRpY2FsCisgKiB0byBtYWtlIHRoaXMgZnVuY3Rpb24gZmFzdC4KKyAqLworYm9vbCBvc2Nfb3Zlcl91bnN0YWJsZV9zb2Z0X2xpbWl0KHN0cnVjdCBjbGllbnRfb2JkICpjbGkpCit7CisJbG9uZyB1bnN0YWJsZV9uciwgb3NjX3Vuc3RhYmxlX2NvdW50OworCisJLyogQ2FuJ3QgY2hlY2sgY2xpLT5jbF91bnN0YWJsZV9jb3VudCwgdGhlcmVmb3JlLCBubyBzb2Z0IGxpbWl0ICovCisJaWYgKCFjbGktPmNsX2NhY2hlIHx8ICFjbGktPmNsX2NhY2hlLT5jY2NfdW5zdGFibGVfY2hlY2spCisJCXJldHVybiBmYWxzZTsKKworCW9zY191bnN0YWJsZV9jb3VudCA9IGF0b21pY19sb25nX3JlYWQoJmNsaS0+Y2xfdW5zdGFibGVfY291bnQpOworCXVuc3RhYmxlX25yID0gYXRvbWljX2xvbmdfcmVhZCgmY2xpLT5jbF9jYWNoZS0+Y2NjX3Vuc3RhYmxlX25yKTsKKworCUNERUJVRyhEX0NBQ0hFLAorCSAgICAgICAiJXM6IGNsaTogJXAgdW5zdGFibGUgcGFnZXM6ICVsdSwgb3NjIHVuc3RhYmxlIHBhZ2VzOiAlbHVcbiIsCisJICAgICAgIGNsaS0+Y2xfaW1wb3J0LT5pbXBfb2JkLT5vYmRfbmFtZSwgY2xpLAorCSAgICAgICB1bnN0YWJsZV9uciwgb3NjX3Vuc3RhYmxlX2NvdW50KTsKKworCS8qCisJICogSWYgdGhlIExSVSBzbG90cyBhcmUgaW4gc2hvcnRhZ2UgLSAyNSUgcmVtYWluaW5nIEFORCB0aGlzIE9TQworCSAqIGhhcyBvbmUgZnVsbCBSUEMgd2luZG93IG9mIHVuc3RhYmxlIHBhZ2VzLCBpdCdzIGEgZ29vZCBjaGFuY2UKKwkgKiB0byBwaWdneWJhY2sgYSBTT0ZUX1NZTkMgZmxhZy4KKwkgKiBQbGVhc2Ugbm90aWNlIHRoYXQgdGhlIE9TVCB3b24ndCB0YWtlIGltbWVkaWF0ZSByZXNwb25zZSBmb3IgdGhlCisJICogU09GVF9TWU5DIHJlcXVlc3Qgc28gYWN0aXZlIE9TQ3Mgd2lsbCBoYXZlIG1vcmUgY2hhbmNlIHRvIGNhcnJ5CisJICogdGhlIGZsYWcsIHRoaXMgaXMgcmVhc29uYWJsZS4KKwkgKi8KKwlyZXR1cm4gdW5zdGFibGVfbnIgPiBjbGktPmNsX2NhY2hlLT5jY2NfbHJ1X21heCA+PiAyICYmCisJICAgICAgIG9zY191bnN0YWJsZV9jb3VudCA+IGNsaS0+Y2xfbWF4X3BhZ2VzX3Blcl9ycGMgKgorCQkJCSAgICBjbGktPmNsX21heF9ycGNzX2luX2ZsaWdodDsKK30KKwogLyoqIEB9IG9zYyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19yZXF1ZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX3JlcXVlc3QuYwppbmRleCA1MzZiODY4Li43NDk3ODFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX3JlcXVlc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX3JlcXVlc3QuYwpAQCAtNDEsNiArNDEsNyBAQAogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfaGEuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2xwcm9jZnNfc3RhdHVzLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmUvbHVzdHJlX2lvY3RsLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfZGVidWcuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9wYXJhbS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2ZpZC5oIgpAQCAtMTAyLDM2ICsxMDMsNiBAQAogc3RhdGljIGludCBicndfaW50ZXJwcmV0KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwKIAkJCSBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgdm9pZCAqZGF0YSwgaW50IHJjKTsKIAotLyogUGFjayBPU0Mgb2JqZWN0IG1ldGFkYXRhIGZvciBkaXNrIHN0b3JhZ2UgKExFIGJ5dGUgb3JkZXIpLiAqLwotc3RhdGljIGludCBvc2NfcGFja21kKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsb3ZfbWRzX21kICoqbG1tcCwKLQkJICAgICAgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSkKLXsKLQlpbnQgbG1tX3NpemU7Ci0KLQlsbW1fc2l6ZSA9IHNpemVvZigqKmxtbXApOwotCWlmICghbG1tcCkKLQkJcmV0dXJuIGxtbV9zaXplOwotCi0JaWYgKCpsbW1wICYmICFsc20pIHsKLQkJa2ZyZWUoKmxtbXApOwotCQkqbG1tcCA9IE5VTEw7Ci0JCXJldHVybiAwOwotCX0gZWxzZSBpZiAodW5saWtlbHkobHNtICYmIG9zdGlkX2lkKCZsc20tPmxzbV9vaSkgPT0gMCkpIHsKLQkJcmV0dXJuIC1FQkFERjsKLQl9Ci0KLQlpZiAoISpsbW1wKSB7Ci0JCSpsbW1wID0ga3phbGxvYyhsbW1fc2l6ZSwgR0ZQX05PRlMpOwotCQlpZiAoISpsbW1wKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JaWYgKGxzbSkKLQkJb3N0aWRfY3B1X3RvX2xlKCZsc20tPmxzbV9vaSwgJigqbG1tcCktPmxtbV9vaSk7Ci0KLQlyZXR1cm4gbG1tX3NpemU7Ci19Ci0KIC8qIFVucGFjayBPU0Mgb2JqZWN0IG1ldGFkYXRhIGZyb20gZGlzayBzdG9yYWdlIChMRSBieXRlIG9yZGVyKS4gKi8KIHN0YXRpYyBpbnQgb3NjX3VucGFja21kKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsb3Zfc3RyaXBlX21kICoqbHNtcCwKIAkJCXN0cnVjdCBsb3ZfbWRzX21kICpsbW0sIGludCBsbW1fYnl0ZXMpCkBAIC0xODksNyArMTYwLDcgQEAKIAkgICAgKGltcC0+aW1wX2Nvbm5lY3RfZGF0YS5vY2RfY29ubmVjdF9mbGFncyAmIE9CRF9DT05ORUNUX01BWEJZVEVTKSkKIAkJKCpsc21wKS0+bHNtX21heGJ5dGVzID0gaW1wLT5pbXBfY29ubmVjdF9kYXRhLm9jZF9tYXhieXRlczsKIAllbHNlCi0JCSgqbHNtcCktPmxzbV9tYXhieXRlcyA9IExVU1RSRV9TVFJJUEVfTUFYQllURVM7CisJCSgqbHNtcCktPmxzbV9tYXhieXRlcyA9IExVU1RSRV9FWFQzX1NUUklQRV9NQVhCWVRFUzsKIAogCXJldHVybiBsc21fc2l6ZTsKIH0KQEAgLTQyNywyNCArMzk4LDE2IEBACiAJCQkJICAgICAgb2luZm8tPm9pX2NiX3VwLCBvaW5mbywgcnFzZXQpOwogfQogCi1zdGF0aWMgaW50IG9zY19yZWFsX2NyZWF0ZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3Qgb2JkbyAqb2EsCi0JCQkgICBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqKmVhLAotCQkJICAgc3RydWN0IG9iZF90cmFuc19pbmZvICpvdGkpCitzdGF0aWMgaW50IG9zY19jcmVhdGUoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAorCQkgICAgICBzdHJ1Y3Qgb2JkbyAqb2EsIHN0cnVjdCBvYmRfdHJhbnNfaW5mbyAqb3RpKQogewogCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxOwogCXN0cnVjdCBvc3RfYm9keSAqYm9keTsKLQlzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtOwogCWludCByYzsKIAogCUxBU1NFUlQob2EpOwotCUxBU1NFUlQoZWEpOwotCi0JbHNtID0gKmVhOwotCWlmICghbHNtKSB7Ci0JCXJjID0gb2JkX2FsbG9jX21lbW1kKGV4cCwgJmxzbSk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7Ci0JfQorCUxBU1NFUlQob2EtPm9fdmFsaWQgJiBPQkRfTURfRkxHUk9VUCk7CisJTEFTU0VSVChmaWRfc2VxX2lzX2VjaG8ob3N0aWRfc2VxKCZvYS0+b19vaSkpKTsKIAogCXJlcSA9IHB0bHJwY19yZXF1ZXN0X2FsbG9jKGNsYXNzX2V4cDJjbGlpbXAoZXhwKSwgJlJRRl9PU1RfQ1JFQVRFKTsKIAlpZiAoIXJlcSkgewpAQCAtNDkwLDIxICs0NTMsMTAgQEAKIAlvYS0+b19ibGtzaXplID0gY2xpX2Jyd19zaXplKGV4cC0+ZXhwX29iZCk7CiAJb2EtPm9fdmFsaWQgfD0gT0JEX01EX0ZMQkxLU1o7CiAKLQkvKiBYWFggTE9WIFNUQUNLSU5HOiB0aGUgbHNtIHRoYXQgaXMgcGFzc2VkIHRvIHVzIGZyb20gTE9WIGRvZXMgbm90Ci0JICogaGF2ZSB2YWxpZCBsc21fb2luZm8gZGF0YSBzdHJ1Y3RzLCBzbyBkb24ndCBnbyB0b3VjaGluZyB0aGF0LgotCSAqIFRoaXMgbmVlZHMgdG8gYmUgZml4ZWQgaW4gYSBiaWcgd2F5LgotCSAqLwotCWxzbS0+bHNtX29pID0gb2EtPm9fb2k7Ci0JKmVhID0gbHNtOwotCi0JaWYgKG90aSkgewotCQlvdGktPm90aV90cmFuc25vID0gbHVzdHJlX21zZ19nZXRfdHJhbnNubyhyZXEtPnJxX3JlcG1zZyk7Ci0KLQkJaWYgKG9hLT5vX3ZhbGlkICYgT0JEX01EX0ZMQ09PS0lFKSB7Ci0JCQlpZiAoIW90aS0+b3RpX2xvZ2Nvb2tpZXMpCi0JCQkJb3RpX2FsbG9jX2Nvb2tpZXMob3RpLCAxKTsKLQkJCSpvdGktPm90aV9sb2djb29raWVzID0gb2EtPm9fbGNvb2tpZTsKLQkJfQorCWlmIChvdGkgJiYgb2EtPm9fdmFsaWQgJiBPQkRfTURfRkxDT09LSUUpIHsKKwkJaWYgKCFvdGktPm90aV9sb2djb29raWVzKQorCQkJb3RpLT5vdGlfbG9nY29va2llcyA9ICZvdGktPm90aV9vbmVjb29raWU7CisJCSpvdGktPm90aV9sb2djb29raWVzID0gb2EtPm9fbGNvb2tpZTsKIAl9CiAKIAlDREVCVUcoRF9IQSwgInRyYW5zbm86ICVsbGRcbiIsCkBAIC01MTIsOCArNDY0LDYgQEAKIG91dF9yZXE6CiAJcHRscnBjX3JlcV9maW5pc2hlZChyZXEpOwogb3V0OgotCWlmIChyYyAmJiAhKmVhKQotCQlvYmRfZnJlZV9tZW1tZChleHAsICZsc20pOwogCXJldHVybiByYzsKIH0KIApAQCAtNjQ5LDcgKzU5OSw3IEBACiAKIAlvc3RpZF9idWlsZF9yZXNfbmFtZSgmb2EtPm9fb2ksICZyZXNfaWQpOwogCXJlcyA9IGxkbG1fcmVzb3VyY2VfZ2V0KG5zLCBOVUxMLCAmcmVzX2lkLCAwLCAwKTsKLQlpZiAoIXJlcykKKwlpZiAoSVNfRVJSKHJlcykpCiAJCXJldHVybiAwOwogCiAJTERMTV9SRVNPVVJDRV9BRERSRUYocmVzKTsKQEAgLTY4OSwzMCArNjM5LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBvc2NfY3JlYXRlKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKLQkJICAgICAgc3RydWN0IG9iZG8gKm9hLCBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqKmVhLAotCQkgICAgICBzdHJ1Y3Qgb2JkX3RyYW5zX2luZm8gKm90aSkKLXsKLQlpbnQgcmMgPSAwOwotCi0JTEFTU0VSVChvYSk7Ci0JTEFTU0VSVChlYSk7Ci0JTEFTU0VSVChvYS0+b192YWxpZCAmIE9CRF9NRF9GTEdST1VQKTsKLQotCWlmICgob2EtPm9fdmFsaWQgJiBPQkRfTURfRkxGTEFHUykgJiYKLQkgICAgb2EtPm9fZmxhZ3MgPT0gT0JEX0ZMX1JFQ1JFQVRFX09CSlMpIHsKLQkJcmV0dXJuIG9zY19yZWFsX2NyZWF0ZShleHAsIG9hLCBlYSwgb3RpKTsKLQl9Ci0KLQlpZiAoIWZpZF9zZXFfaXNfbWR0KG9zdGlkX3NlcSgmb2EtPm9fb2kpKSkKLQkJcmV0dXJuIG9zY19yZWFsX2NyZWF0ZShleHAsIG9hLCBlYSwgb3RpKTsKLQotCS8qIHdlIHNob3VsZCBub3QgZ2V0IGhlcmUgYW55bW9yZSAqLwotCUxCVUcoKTsKLQotCXJldHVybiByYzsKLX0KLQogLyogRGVzdHJveSByZXF1ZXN0cyBjYW4gYmUgYXN5bmMgYWx3YXlzIG9uIHRoZSBjbGllbnQsIGFuZCB3ZSBkb24ndCBldmVuIHJlYWxseQogICogY2FyZSBhYm91dCB0aGUgcmV0dXJuIGNvZGUgc2luY2UgdGhlIGNsaWVudCBjYW5ub3QgZG8gYW55dGhpbmcgYXQgYWxsIGFib3V0CiAgKiBhIGRlc3Ryb3kgZmFpbHVyZS4KQEAgLTcyNSw4ICs2NTEsNyBAQAogICogY29va2llcyB0byB0aGUgTURTIGFmdGVyIGNvbW1pdHRpbmcgZGVzdHJveSB0cmFuc2FjdGlvbnMuCiAgKi8KIHN0YXRpYyBpbnQgb3NjX2Rlc3Ryb3koY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAotCQkgICAgICAgc3RydWN0IG9iZG8gKm9hLCBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqZWEsCi0JCSAgICAgICBzdHJ1Y3Qgb2JkX3RyYW5zX2luZm8gKm90aSwgc3RydWN0IG9iZF9leHBvcnQgKm1kX2V4cG9ydCkKKwkJICAgICAgIHN0cnVjdCBvYmRvICpvYSwgc3RydWN0IG9iZF90cmFuc19pbmZvICpvdGkpCiB7CiAJc3RydWN0IGNsaWVudF9vYmQgKmNsaSA9ICZleHAtPmV4cF9vYmQtPnUuY2xpOwogCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxOwpAQCAtNzk0LDQyICs3MTksNDQgQEAKIHN0YXRpYyB2b2lkIG9zY19hbm5vdW5jZV9jYWNoZWQoc3RydWN0IGNsaWVudF9vYmQgKmNsaSwgc3RydWN0IG9iZG8gKm9hLAogCQkJCWxvbmcgd3JpdGluZ19ieXRlcykKIHsKLQl1MzIgYml0cyA9IE9CRF9NRF9GTEJMT0NLU3xPQkRfTURfRkxHUkFOVDsKKwl1MzIgYml0cyA9IE9CRF9NRF9GTEJMT0NLUyB8IE9CRF9NRF9GTEdSQU5UOwogCiAJTEFTU0VSVCghKG9hLT5vX3ZhbGlkICYgYml0cykpOwogCiAJb2EtPm9fdmFsaWQgfD0gYml0czsKIAlzcGluX2xvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Ci0Jb2EtPm9fZGlydHkgPSBjbGktPmNsX2RpcnR5OwotCWlmICh1bmxpa2VseShjbGktPmNsX2RpcnR5IC0gY2xpLT5jbF9kaXJ0eV90cmFuc2l0ID4KLQkJICAgICBjbGktPmNsX2RpcnR5X21heCkpIHsKKwlvYS0+b19kaXJ0eSA9IGNsaS0+Y2xfZGlydHlfcGFnZXMgPDwgUEFHRV9TSElGVDsKKwlpZiAodW5saWtlbHkoY2xpLT5jbF9kaXJ0eV9wYWdlcyAtIGNsaS0+Y2xfZGlydHlfdHJhbnNpdCA+CisJCSAgICAgY2xpLT5jbF9kaXJ0eV9tYXhfcGFnZXMpKSB7CiAJCUNFUlJPUigiZGlydHkgJWx1IC0gJWx1ID4gZGlydHlfbWF4ICVsdVxuIiwKLQkJICAgICAgIGNsaS0+Y2xfZGlydHksIGNsaS0+Y2xfZGlydHlfdHJhbnNpdCwgY2xpLT5jbF9kaXJ0eV9tYXgpOworCQkgICAgICAgY2xpLT5jbF9kaXJ0eV9wYWdlcywgY2xpLT5jbF9kaXJ0eV90cmFuc2l0LAorCQkgICAgICAgY2xpLT5jbF9kaXJ0eV9tYXhfcGFnZXMpOwogCQlvYS0+b191bmRpcnR5ID0gMDsKLQl9IGVsc2UgaWYgKHVubGlrZWx5KGF0b21pY19yZWFkKCZvYmRfdW5zdGFibGVfcGFnZXMpICsKLQkJCSAgICBhdG9taWNfcmVhZCgmb2JkX2RpcnR5X3BhZ2VzKSAtCi0JCQkgICAgYXRvbWljX3JlYWQoJm9iZF9kaXJ0eV90cmFuc2l0X3BhZ2VzKSA+Ci0JCQkgICAgKGxvbmcpKG9iZF9tYXhfZGlydHlfcGFnZXMgKyAxKSkpIHsKKwl9IGVsc2UgaWYgKHVubGlrZWx5KGF0b21pY19sb25nX3JlYWQoJm9iZF9kaXJ0eV9wYWdlcykgLQorCQkJICAgIGF0b21pY19sb25nX3JlYWQoJm9iZF9kaXJ0eV90cmFuc2l0X3BhZ2VzKSA+CisJCQkgICAgKG9iZF9tYXhfZGlydHlfcGFnZXMgKyAxKSkpIHsKIAkJLyogVGhlIGF0b21pY19yZWFkKCkgYWxsb3dpbmcgdGhlIGF0b21pY19pbmMoKSBhcmUKIAkJICogbm90IGNvdmVyZWQgYnkgYSBsb2NrIHRodXMgdGhleSBtYXkgc2FmZWx5IHJhY2UgYW5kIHRyaXAKIAkJICogdGhpcyBDRVJST1IoKSB1bmxlc3Mgd2UgYWRkIGluIGEgc21hbGwgZnVkZ2UgZmFjdG9yICgrMSkuCiAJCSAqLwotCQlDRVJST1IoIiVzOiBkaXJ0eSAlZCArICVkIC0gJWQgPiBzeXN0ZW0gZGlydHlfbWF4ICVkXG4iLAorCQlDRVJST1IoIiVzOiBkaXJ0eSAlbGQgKyAlbGQgPiBzeXN0ZW0gZGlydHlfbWF4ICVsdVxuIiwKIAkJICAgICAgIGNsaS0+Y2xfaW1wb3J0LT5pbXBfb2JkLT5vYmRfbmFtZSwKLQkJICAgICAgIGF0b21pY19yZWFkKCZvYmRfdW5zdGFibGVfcGFnZXMpLAotCQkgICAgICAgYXRvbWljX3JlYWQoJm9iZF9kaXJ0eV9wYWdlcyksCi0JCSAgICAgICBhdG9taWNfcmVhZCgmb2JkX2RpcnR5X3RyYW5zaXRfcGFnZXMpLAorCQkgICAgICAgYXRvbWljX2xvbmdfcmVhZCgmb2JkX2RpcnR5X3BhZ2VzKSwKKwkJICAgICAgIGF0b21pY19sb25nX3JlYWQoJm9iZF9kaXJ0eV90cmFuc2l0X3BhZ2VzKSwKIAkJICAgICAgIG9iZF9tYXhfZGlydHlfcGFnZXMpOwogCQlvYS0+b191bmRpcnR5ID0gMDsKLQl9IGVsc2UgaWYgKHVubGlrZWx5KGNsaS0+Y2xfZGlydHlfbWF4IC0gY2xpLT5jbF9kaXJ0eSA+IDB4N2ZmZmZmZmYpKSB7CisJfSBlbHNlIGlmICh1bmxpa2VseShjbGktPmNsX2RpcnR5X21heF9wYWdlcyAtIGNsaS0+Y2xfZGlydHlfcGFnZXMgPgorCQkgICAweDdmZmZmZmZmKSkgewogCQlDRVJST1IoImRpcnR5ICVsdSAtIGRpcnR5X21heCAlbHUgdG9vIGJpZz8/P1xuIiwKLQkJICAgICAgIGNsaS0+Y2xfZGlydHksIGNsaS0+Y2xfZGlydHlfbWF4KTsKKwkJICAgICAgIGNsaS0+Y2xfZGlydHlfcGFnZXMsIGNsaS0+Y2xfZGlydHlfbWF4X3BhZ2VzKTsKIAkJb2EtPm9fdW5kaXJ0eSA9IDA7CiAJfSBlbHNlIHsKLQkJbG9uZyBtYXhfaW5fZmxpZ2h0ID0gKGNsaS0+Y2xfbWF4X3BhZ2VzX3Blcl9ycGMgPDwKLQkJCQkgICAgICBQQUdFX1NISUZUKSoKLQkJCQkgICAgIChjbGktPmNsX21heF9ycGNzX2luX2ZsaWdodCArIDEpOwotCQlvYS0+b191bmRpcnR5ID0gbWF4KGNsaS0+Y2xfZGlydHlfbWF4LCBtYXhfaW5fZmxpZ2h0KTsKKwkJdW5zaWduZWQgbG9uZyBtYXhfaW5fZmxpZ2h0OworCisJCW1heF9pbl9mbGlnaHQgPSAoY2xpLT5jbF9tYXhfcGFnZXNfcGVyX3JwYyA8PCBQQUdFX1NISUZUKSAqCisJCQkJKGNsaS0+Y2xfbWF4X3JwY3NfaW5fZmxpZ2h0ICsgMSk7CisJCW9hLT5vX3VuZGlydHkgPSBtYXgoY2xpLT5jbF9kaXJ0eV9tYXhfcGFnZXMgPDwgUEFHRV9TSElGVCwKKwkJCQkgICAgbWF4X2luX2ZsaWdodCk7CiAJfQogCW9hLT5vX2dyYW50ID0gY2xpLT5jbF9hdmFpbF9ncmFudCArIGNsaS0+Y2xfcmVzZXJ2ZWRfZ3JhbnQ7CiAJb2EtPm9fZHJvcHBlZCA9IGNsaS0+Y2xfbG9zdF9ncmFudDsKQEAgLTEwMjksMjIgKzk1NiwyNCBAQAogewogCS8qCiAJICogb2NkX2dyYW50IGlzIHRoZSB0b3RhbCBncmFudCBhbW91bnQgd2UncmUgZXhwZWN0IHRvIGhvbGQ6IGlmIHdlJ3ZlCi0JICogYmVlbiBldmljdGVkLCBpdCdzIHRoZSBuZXcgYXZhaWxfZ3JhbnQgYW1vdW50LCBjbF9kaXJ0eSB3aWxsIGRyb3AKLQkgKiB0byAwIGFzIGluZmxpZ2h0IFJQQ3MgZmFpbCBvdXQ7IG90aGVyd2lzZSwgaXQncyBhdmFpbF9ncmFudCArIGRpcnR5LgorCSAqIGJlZW4gZXZpY3RlZCwgaXQncyB0aGUgbmV3IGF2YWlsX2dyYW50IGFtb3VudCwgY2xfZGlydHlfcGFnZXMgd2lsbAorCSAqIGRyb3AgdG8gMCBhcyBpbmZsaWdodCBSUENzIGZhaWwgb3V0OyBvdGhlcndpc2UsIGl0J3MgYXZhaWxfZ3JhbnQgKworCSAqIGRpcnR5LgogCSAqCiAJICogcmFjZSBpcyB0b2xlcmFibGUgaGVyZTogaWYgd2UncmUgZXZpY3RlZCwgYnV0IGltcF9zdGF0ZSBhbHJlYWR5Ci0JICogbGVmdCBFVklDVEVEIHN0YXRlLCB0aGVuIGNsX2RpcnR5IG11c3QgYmUgMCBhbHJlYWR5LgorCSAqIGxlZnQgRVZJQ1RFRCBzdGF0ZSwgdGhlbiBjbF9kaXJ0eV9wYWdlcyBtdXN0IGJlIDAgYWxyZWFkeS4KIAkgKi8KIAlzcGluX2xvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CiAJaWYgKGNsaS0+Y2xfaW1wb3J0LT5pbXBfc3RhdGUgPT0gTFVTVFJFX0lNUF9FVklDVEVEKQogCQljbGktPmNsX2F2YWlsX2dyYW50ID0gb2NkLT5vY2RfZ3JhbnQ7CiAJZWxzZQotCQljbGktPmNsX2F2YWlsX2dyYW50ID0gb2NkLT5vY2RfZ3JhbnQgLSBjbGktPmNsX2RpcnR5OworCQljbGktPmNsX2F2YWlsX2dyYW50ID0gb2NkLT5vY2RfZ3JhbnQgLQorCQkJCSAgICAgIChjbGktPmNsX2RpcnR5X3BhZ2VzIDw8IFBBR0VfU0hJRlQpOwogCiAJaWYgKGNsaS0+Y2xfYXZhaWxfZ3JhbnQgPCAwKSB7CiAJCUNXQVJOKCIlczogYXZhaWxhYmxlIGdyYW50IDwgMDogYXZhaWwvb2NkL2RpcnR5ICVsZC8ldS8lbGRcbiIsCiAJCSAgICAgIGNsaS0+Y2xfaW1wb3J0LT5pbXBfb2JkLT5vYmRfbmFtZSwgY2xpLT5jbF9hdmFpbF9ncmFudCwKLQkJICAgICAgb2NkLT5vY2RfZ3JhbnQsIGNsaS0+Y2xfZGlydHkpOworCQkgICAgICBvY2QtPm9jZF9ncmFudCwgY2xpLT5jbF9kaXJ0eV9wYWdlcyA8PCBQQUdFX1NISUZUKTsKIAkJLyogd29ya2Fyb3VuZCBmb3Igc2VydmVycyB3aGljaCBkbyBub3QgaGF2ZSB0aGUgcGF0Y2ggZnJvbQogCQkgKiBMVS0yNjc5CiAJCSAqLwpAQCAtMTE4MSw3ICsxMTEwLDcgQEAKIAl9CiAKIAl3aGlsZSAobm9iID4gMCAmJiBwZ19jb3VudCA+IDApIHsKLQkJaW50IGNvdW50ID0gcGdhW2ldLT5jb3VudCA+IG5vYiA/IG5vYiA6IHBnYVtpXS0+Y291bnQ7CisJCXVuc2lnbmVkIGludCBjb3VudCA9IHBnYVtpXS0+Y291bnQgPiBub2IgPyBub2IgOiBwZ2FbaV0tPmNvdW50OwogCiAJCS8qIGNvcnJ1cHQgdGhlIGRhdGEgYmVmb3JlIHdlIGNvbXB1dGUgdGhlIGNoZWNrc3VtLCB0bwogCQkgKiBzaW11bGF0ZSBhbiBPU1QtPmNsaWVudCBkYXRhIGVycm9yCkBAIC0xMTkxLDcgKzExMjAsNyBAQAogCQkJdW5zaWduZWQgY2hhciAqcHRyID0ga21hcChwZ2FbaV0tPnBnKTsKIAkJCWludCBvZmYgPSBwZ2FbaV0tPm9mZiAmIH5QQUdFX01BU0s7CiAKLQkJCW1lbWNweShwdHIgKyBvZmYsICJiYWQxIiwgbWluKDQsIG5vYikpOworCQkJbWVtY3B5KHB0ciArIG9mZiwgImJhZDEiLCBtaW5fdCh0eXBlb2Yobm9iKSwgNCwgbm9iKSk7CiAJCQlrdW5tYXAocGdhW2ldLT5wZyk7CiAJCX0KIAkJY2ZzX2NyeXB0b19oYXNoX3VwZGF0ZV9wYWdlKGhkZXNjLCBwZ2FbaV0tPnBnLApAQCAtMTMzNSwxMSArMTI2NCwxMSBAQAogCiAJCWlmIChpID4gMCAmJiBjYW5fbWVyZ2VfcGFnZXMocGdfcHJldiwgcGcpKSB7CiAJCQluaW9idWYtLTsKLQkJCW5pb2J1Zi0+bGVuICs9IHBnLT5jb3VudDsKKwkJCW5pb2J1Zi0+cm5iX2xlbiArPSBwZy0+Y291bnQ7CiAJCX0gZWxzZSB7Ci0JCQluaW9idWYtPm9mZnNldCA9IHBnLT5vZmY7Ci0JCQluaW9idWYtPmxlbiA9IHBnLT5jb3VudDsKLQkJCW5pb2J1Zi0+ZmxhZ3MgPSBwZy0+ZmxhZzsKKwkJCW5pb2J1Zi0+cm5iX29mZnNldCA9IHBnLT5vZmY7CisJCQluaW9idWYtPnJuYl9sZW4gPSBwZy0+Y291bnQ7CisJCQluaW9idWYtPnJuYl9mbGFncyA9IHBnLT5mbGFnOwogCQl9CiAJCXBnX3ByZXYgPSBwZzsKIAl9CkBAIC0xNDE4LDYgKzEzNDcsMTEgQEAKIAlJTklUX0xJU1RfSEVBRCgmYWEtPmFhX29hcHMpOwogCiAJKnJlcXAgPSByZXE7CisJbmlvYnVmID0gcmVxX2NhcHN1bGVfY2xpZW50X2dldChwaWxsLCAmUk1GX05JT0JVRl9SRU1PVEUpOworCUNERUJVRyhEX1JQQ1RSQUNFLCAiYnJ3IHJwYyAlcCAtIG9iamVjdCAiIERPU1RJRCAiIG9mZnNldCAlbGxkPD4lbGxkXG4iLAorCSAgICAgICByZXEsIFBPU1RJRCgmb2EtPm9fb2kpLCBuaW9idWZbMF0ucm5iX29mZnNldCwKKwkgICAgICAgbmlvYnVmW25pb2NvdW50IC0gMV0ucm5iX29mZnNldCArIG5pb2J1ZltuaW9jb3VudCAtIDFdLnJuYl9sZW4pOworCiAJcmV0dXJuIDA7CiAKICBvdXQ6CkBAIC0xNDYzLDcgKzEzOTcsOCBAQAogCQkJICAgb2EtPm9fdmFsaWQgJiBPQkRfTURfRkxGSUQgPyBvYS0+b19wYXJlbnRfb2lkIDogMCwKIAkJCSAgIG9hLT5vX3ZhbGlkICYgT0JEX01EX0ZMRklEID8gb2EtPm9fcGFyZW50X3ZlciA6IDAsCiAJCQkgICBQT1NUSUQoJm9hLT5vX29pKSwgcGdhWzBdLT5vZmYsCi0JCQkgICBwZ2FbcGFnZV9jb3VudC0xXS0+b2ZmICsgcGdhW3BhZ2VfY291bnQtMV0tPmNvdW50IC0gMSk7CisJCQkgICBwZ2FbcGFnZV9jb3VudCAtIDFdLT5vZmYgKworCQkJICAgcGdhW3BhZ2VfY291bnQgLSAxXS0+Y291bnQgLSAxKTsKIAlDRVJST1IoIm9yaWdpbmFsIGNsaWVudCBjc3VtICV4ICh0eXBlICV4KSwgc2VydmVyIGNzdW0gJXggKHR5cGUgJXgpLCBjbGllbnQgY3N1bSBub3cgJXhcbiIsCiAJICAgICAgIGNsaWVudF9ja3N1bSwgY2xpZW50X2Nrc3VtX3R5cGUsCiAJICAgICAgIHNlcnZlcl9ja3N1bSwgY2tzdW1fdHlwZSwgbmV3X2Nrc3VtKTsKQEAgLTE1NjUsNyArMTUwMCw4IEBACiAJCWNoYXIgKnJvdXRlciA9ICIiOwogCQllbnVtIGNrc3VtX3R5cGUgY2tzdW1fdHlwZTsKIAotCQlja3N1bV90eXBlID0gY2tzdW1fdHlwZV91bnBhY2soYm9keS0+b2Eub192YWxpZCZPQkRfTURfRkxGTEFHUyA/CisJCWNrc3VtX3R5cGUgPSBja3N1bV90eXBlX3VucGFjayhib2R5LT5vYS5vX3ZhbGlkICYKKwkJCQkJICAgICAgIE9CRF9NRF9GTEZMQUdTID8KIAkJCQkJICAgICAgIGJvZHktPm9hLm9fZmxhZ3MgOiAwKTsKIAkJY2xpZW50X2Nrc3VtID0gb3NjX2NoZWNrc3VtX2J1bGsocmMsIGFhLT5hYV9wYWdlX2NvdW50LAogCQkJCQkJIGFhLT5hYV9wcGdhLCBPU1RfUkVBRCwKQEAgLTE3OTQsNyArMTczMCw4IEBACiAKIAkJaWYgKGx1c3RyZV9tc2dfZ2V0X29wYyhyZXEtPnJxX3JlcW1zZykgPT0gT1NUX1dSSVRFKSB7CiAJCQlzdHJ1Y3QgbG92X29pbmZvICpsb2kgPSBjbDJvc2Mob2JqKS0+b29fb2luZm87Ci0JCQlsb2ZmX3QgbGFzdF9vZmYgPSBsYXN0LT5vYXBfY291bnQgKyBsYXN0LT5vYXBfb2JqX29mZjsKKwkJCWxvZmZfdCBsYXN0X29mZiA9IGxhc3QtPm9hcF9jb3VudCArIGxhc3QtPm9hcF9vYmpfb2ZmICsKKwkJCQkJICBsYXN0LT5vYXBfcGFnZV9vZmY7CiAKIAkJCS8qIENoYW5nZSBmaWxlIHNpemUgaWYgdGhpcyBpcyBhbiBvdXQgb2YgcXVvdGEgb3IKIAkJCSAqIGRpcmVjdCBJTyB3cml0ZSBhbmQgaXQgZXh0ZW5kcyB0aGUgZmlsZSBzaXplCkBAIC0xODEyLDExICsxNzQ5LDE0IEBACiAJCX0KIAogCQlpZiAodmFsaWQgIT0gMCkKLQkJCWNsX29iamVjdF9hdHRyX3NldChlbnYsIG9iaiwgYXR0ciwgdmFsaWQpOworCQkJY2xfb2JqZWN0X2F0dHJfdXBkYXRlKGVudiwgb2JqLCBhdHRyLCB2YWxpZCk7CiAJCWNsX29iamVjdF9hdHRyX3VubG9jayhvYmopOwogCX0KIAlrbWVtX2NhY2hlX2ZyZWUob2Jkb19jYWNoZXAsIGFhLT5hYV9vYSk7CiAKKwlpZiAobHVzdHJlX21zZ19nZXRfb3BjKHJlcS0+cnFfcmVxbXNnKSA9PSBPU1RfV1JJVEUgJiYgcmMgPT0gMCkKKwkJb3NjX2luY191bnN0YWJsZV9wYWdlcyhyZXEpOworCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGV4dCwgdG1wLCAmYWEtPmFhX2V4dHMsIG9lX2xpbmspIHsKIAkJbGlzdF9kZWxfaW5pdCgmZXh0LT5vZV9saW5rKTsKIAkJb3NjX2V4dGVudF9maW5pc2goZW52LCBleHQsIDEsIHJjKTsKQEAgLTE4NDcsMjEgKzE3ODcsMjEgQEAKIAogc3RhdGljIHZvaWQgYnJ3X2NvbW1pdChzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSkKIHsKLQlzcGluX2xvY2soJnJlcS0+cnFfbG9jayk7CiAJLyoKIAkgKiBJZiBvc2NfaW5jX3Vuc3RhYmxlX3BhZ2VzICh2aWEgb3NjX2V4dGVudF9maW5pc2gpIHJhY2VzIHdpdGgKIAkgKiB0aGlzIGNhbGxlZCB2aWEgdGhlIHJxX2NvbW1pdF9jYiwgSSBuZWVkIHRvIGVuc3VyZQogCSAqIG9zY19kZWNfdW5zdGFibGVfcGFnZXMgaXMgc3RpbGwgY2FsbGVkLiBPdGhlcndpc2UgdW5zdGFibGUKIAkgKiBwYWdlcyBtYXkgYmUgbGVha2VkLgogCSAqLwotCWlmIChyZXEtPnJxX3Vuc3RhYmxlKSB7CisJc3Bpbl9sb2NrKCZyZXEtPnJxX2xvY2spOworCWlmICh1bmxpa2VseShyZXEtPnJxX3Vuc3RhYmxlKSkgeworCQlyZXEtPnJxX3Vuc3RhYmxlID0gMDsKIAkJc3Bpbl91bmxvY2soJnJlcS0+cnFfbG9jayk7CiAJCW9zY19kZWNfdW5zdGFibGVfcGFnZXMocmVxKTsKLQkJc3Bpbl9sb2NrKCZyZXEtPnJxX2xvY2spOwogCX0gZWxzZSB7CiAJCXJlcS0+cnFfY29tbWl0dGVkID0gMTsKKwkJc3Bpbl91bmxvY2soJnJlcS0+cnFfbG9jayk7CiAJfQotCXNwaW5fdW5sb2NrKCZyZXEtPnJxX2xvY2spOwogfQogCiAvKioKQEAgLTE4ODEsMTMgKzE4MjEsMTMgQEAKIAlzdHJ1Y3Qgb3NjX2FzeW5jX3BhZ2UgKnRtcDsKIAlzdHJ1Y3QgY2xfcmVxICpjbGVycSA9IE5VTEw7CiAJZW51bSBjbF9yZXFfdHlwZSBjcnQgPSAoY21kICYgT0JEX0JSV19XUklURSkgPyBDUlRfV1JJVEUgOiBDUlRfUkVBRDsKLQlzdHJ1Y3QgbGRsbV9sb2NrICpsb2NrID0gTlVMTDsKIAlzdHJ1Y3QgY2xfcmVxX2F0dHIgKmNyYXR0ciA9IE5VTEw7CiAJdTY0IHN0YXJ0aW5nX29mZnNldCA9IE9CRF9PQkpFQ1RfRU9GOwogCXU2NCBlbmRpbmdfb2Zmc2V0ID0gMDsKIAlpbnQgbXBmbGFnID0gMDsKIAlpbnQgbWVtX3RpZ2h0ID0gMDsKIAlpbnQgcGFnZV9jb3VudCA9IDA7CisJYm9vbCBzb2Z0X3N5bmMgPSBmYWxzZTsKIAlpbnQgaTsKIAlpbnQgcmM7CiAJc3RydWN0IG9zdF9ib2R5ICpib2R5OwpAQCAtMTkxNSw2ICsxODU1LDcgQEAKIAkJfQogCX0KIAorCXNvZnRfc3luYyA9IG9zY19vdmVyX3Vuc3RhYmxlX3NvZnRfbGltaXQoY2xpKTsKIAlpZiAobWVtX3RpZ2h0KQogCQltcGZsYWcgPSBjZnNfbWVtb3J5X3ByZXNzdXJlX2dldF9hbmRfc2V0KCk7CiAKQEAgLTE5NDcsMTAgKzE4ODgsMTEgQEAKIAkJCQlyYyA9IFBUUl9FUlIoY2xlcnEpOwogCQkJCWdvdG8gb3V0OwogCQkJfQotCQkJbG9jayA9IG9hcC0+b2FwX2xkbG1fbG9jazsKIAkJfQogCQlpZiAobWVtX3RpZ2h0KQogCQkJb2FwLT5vYXBfYnJ3X2ZsYWdzIHw9IE9CRF9CUldfTUVNQUxMT0M7CisJCWlmIChzb2Z0X3N5bmMpCisJCQlvYXAtPm9hcF9icndfZmxhZ3MgfD0gT0JEX0JSV19TT0ZUX1NZTkM7CiAJCXBnYVtpXSA9ICZvYXAtPm9hcF9icndfcGFnZTsKIAkJcGdhW2ldLT5vZmYgPSBvYXAtPm9hcF9vYmpfb2ZmICsgb2FwLT5vYXBfcGFnZV9vZmY7CiAJCUNERUJVRygwLCAicHV0IHBhZ2UgJXAgaW5kZXggJWx1IG9hcCAlcCBmbGcgJXggdG8gcGdhXG4iLApAQCAtMTk2NCwxMCArMTkwNiw2IEBACiAJTEFTU0VSVChjbGVycSk7CiAJY3JhdHRyLT5jcmFfb2EgPSBvYTsKIAljbF9yZXFfYXR0cl9zZXQoZW52LCBjbGVycSwgY3JhdHRyLCB+MFVMTCk7Ci0JaWYgKGxvY2spIHsKLQkJb2EtPm9faGFuZGxlID0gbG9jay0+bF9yZW1vdGVfaGFuZGxlOwotCQlvYS0+b192YWxpZCB8PSBPQkRfTURfRkxIQU5ETEU7Ci0JfQogCiAJcmMgPSBjbF9yZXFfcHJlcChlbnYsIGNsZXJxKTsKIAlpZiAocmMgIT0gMCkgewpAQCAtMTk5OCw3ICsxOTM2LDcgQEAKIAlib2R5ID0gcmVxX2NhcHN1bGVfY2xpZW50X2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX09TVF9CT0RZKTsKIAljcmF0dHItPmNyYV9vYSA9ICZib2R5LT5vYTsKIAljbF9yZXFfYXR0cl9zZXQoZW52LCBjbGVycSwgY3JhdHRyLAotCQkJT0JEX01EX0ZMTVRJTUV8T0JEX01EX0ZMQ1RJTUV8T0JEX01EX0ZMQVRJTUUpOworCQkJT0JEX01EX0ZMTVRJTUUgfCBPQkRfTURfRkxDVElNRSB8IE9CRF9NRF9GTEFUSU1FKTsKIAogCWx1c3RyZV9tc2dfc2V0X2pvYmlkKHJlcS0+cnFfcmVxbXNnLCBjcmF0dHItPmNyYV9qb2JpZCk7CiAKQEAgLTIwNDQsNyArMTk4Miw3IEBACiAJfQogCXNwaW5fdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwogCi0JREVCVUdfUkVRKERfSU5PREUsIHJlcSwgIiVkIHBhZ2VzLCBhYSAlcC4gbm93ICVkci8lZHcgaW4gZmxpZ2h0IiwKKwlERUJVR19SRVEoRF9JTk9ERSwgcmVxLCAiJWQgcGFnZXMsIGFhICVwLiBub3cgJXVyLyVkdyBpbiBmbGlnaHQiLAogCQkgIHBhZ2VfY291bnQsIGFhLCBjbGktPmNsX3JfaW5fZmxpZ2h0LAogCQkgIGNsaS0+Y2xfd19pbl9mbGlnaHQpOwogCkBAIC0yMTE2LDI3ICsyMDU0LDYgQEAKIAlyZXR1cm4gc2V0OwogfQogCi0vKiBmaW5kIGFueSBsZGxtIGxvY2sgb2YgdGhlIGlub2RlIGluIG9zYwotICogcmV0dXJuIDAgICAgbm90IGZpbmQKLSAqCTEgICAgZmluZCBvbmUKLSAqICAgICAgPCAwICAgIGVycm9yCi0gKi8KLXN0YXRpYyBpbnQgb3NjX2ZpbmRfY2JkYXRhKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20sCi0JCQkgICBsZGxtX2l0ZXJhdG9yX3QgcmVwbGFjZSwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbGRsbV9yZXNfaWQgcmVzX2lkOwotCXN0cnVjdCBvYmRfZGV2aWNlICpvYmQgPSBjbGFzc19leHAyb2JkKGV4cCk7Ci0JaW50IHJjID0gMDsKLQotCW9zdGlkX2J1aWxkX3Jlc19uYW1lKCZsc20tPmxzbV9vaSwgJnJlc19pZCk7Ci0JcmMgPSBsZGxtX3Jlc291cmNlX2l0ZXJhdGUob2JkLT5vYmRfbmFtZXNwYWNlLCAmcmVzX2lkLCByZXBsYWNlLCBkYXRhKTsKLQlpZiAocmMgPT0gTERMTV9JVEVSX1NUT1ApCi0JCXJldHVybiAxOwotCWlmIChyYyA9PSBMRExNX0lURVJfQ09OVElOVUUpCi0JCXJldHVybiAwOwotCXJldHVybiByYzsKLX0KLQogc3RhdGljIGludCBvc2NfZW5xdWV1ZV9maW5pKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLAogCQkJICAgIG9zY19lbnF1ZXVlX3VwY2FsbF9mIHVwY2FsbCwgdm9pZCAqY29va2llLAogCQkJICAgIHN0cnVjdCBsdXN0cmVfaGFuZGxlICpsb2NraCwgZW51bSBsZGxtX21vZGUgbW9kZSwKQEAgLTI1ODYsNzEgKzI1MDMsNiBAQAogCXJldHVybiByYzsKIH0KIAotLyogUmV0cmlldmUgb2JqZWN0IHN0cmlwaW5nIGluZm9ybWF0aW9uLgotICoKLSAqIEBsbW11IGlzIGEgcG9pbnRlciB0byBhbiBpbi1jb3JlIHN0cnVjdCB3aXRoIGxtbV9vc3RfY291bnQgaW5kaWNhdGluZwotICogdGhlIG1heGltdW0gbnVtYmVyIG9mIE9TVCBpbmRpY2VzIHdoaWNoIHdpbGwgZml0IGluIHRoZSB1c2VyIGJ1ZmZlci4KLSAqIGxtbV9tYWdpYyBtdXN0IGJlIExPVl9NQUdJQyAod2Ugb25seSB1c2UgMSBzbG90IGhlcmUpLgotICovCi1zdGF0aWMgaW50IG9zY19nZXRzdHJpcGUoc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwKLQkJCSBzdHJ1Y3QgbG92X3VzZXJfbWQgX191c2VyICpsdW1wKQotewotCS8qIHdlIHVzZSBsb3ZfdXNlcl9tZF92MyBiZWNhdXNlIGl0IGlzIGxhcmdlciB0aGFuIGxvdl91c2VyX21kX3YxICovCi0Jc3RydWN0IGxvdl91c2VyX21kX3YzIGx1bSwgKmx1bWs7Ci0Jc3RydWN0IGxvdl91c2VyX29zdF9kYXRhX3YxICpsbW1fb2JqZWN0czsKLQlpbnQgcmMgPSAwLCBsdW1fc2l6ZTsKLQotCWlmICghbHNtKQotCQlyZXR1cm4gLUVOT0RBVEE7Ci0KLQkvKiB3ZSBvbmx5IG5lZWQgdGhlIGhlYWRlciBwYXJ0IGZyb20gdXNlciBzcGFjZSB0byBnZXQgbG1tX21hZ2ljIGFuZAotCSAqIGxtbV9zdHJpcGVfY291bnQsICh0aGUgaGVhZGVyIHBhcnQgaXMgY29tbW9uIHRvIHYxIGFuZCB2MykKLQkgKi8KLQlsdW1fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbG92X3VzZXJfbWRfdjEpOwotCWlmIChjb3B5X2Zyb21fdXNlcigmbHVtLCBsdW1wLCBsdW1fc2l6ZSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKChsdW0ubG1tX21hZ2ljICE9IExPVl9VU0VSX01BR0lDX1YxKSAmJgotCSAgICAobHVtLmxtbV9tYWdpYyAhPSBMT1ZfVVNFUl9NQUdJQ19WMykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogbG92X3VzZXJfbWRfdlggYW5kIGxvdl9tZHNfbWRfdlggbXVzdCBoYXZlIHRoZSBzYW1lIHNpemUgKi8KLQlMQVNTRVJUKHNpemVvZihzdHJ1Y3QgbG92X3VzZXJfbWRfdjEpID09IHNpemVvZihzdHJ1Y3QgbG92X21kc19tZF92MSkpOwotCUxBU1NFUlQoc2l6ZW9mKHN0cnVjdCBsb3ZfdXNlcl9tZF92MykgPT0gc2l6ZW9mKHN0cnVjdCBsb3ZfbWRzX21kX3YzKSk7Ci0JTEFTU0VSVChzaXplb2YobHVtLmxtbV9vYmplY3RzWzBdKSA9PSBzaXplb2YobHVtay0+bG1tX29iamVjdHNbMF0pKTsKLQotCS8qIHdlIGNhbiB1c2UgbG92X21kc19tZF9zaXplKCkgdG8gY29tcHV0ZSBsdW1fc2l6ZQotCSAqIGJlY2F1c2UgbG92X3VzZXJfbWRfdlggYW5kIGxvdl9tZHNfbWRfdlggaGF2ZSB0aGUgc2FtZSBzaXplCi0JICovCi0JaWYgKGx1bS5sbW1fc3RyaXBlX2NvdW50ID4gMCkgewotCQlsdW1fc2l6ZSA9IGxvdl9tZHNfbWRfc2l6ZShsdW0ubG1tX3N0cmlwZV9jb3VudCwgbHVtLmxtbV9tYWdpYyk7Ci0JCWx1bWsgPSBremFsbG9jKGx1bV9zaXplLCBHRlBfTk9GUyk7Ci0JCWlmICghbHVtaykKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCWlmIChsdW0ubG1tX21hZ2ljID09IExPVl9VU0VSX01BR0lDX1YxKQotCQkJbG1tX29iamVjdHMgPQotCQkJICAgICYoKChzdHJ1Y3QgbG92X3VzZXJfbWRfdjEgKilsdW1rKS0+bG1tX29iamVjdHNbMF0pOwotCQllbHNlCi0JCQlsbW1fb2JqZWN0cyA9ICYobHVtay0+bG1tX29iamVjdHNbMF0pOwotCQlsbW1fb2JqZWN0cy0+bF9vc3Rfb2kgPSBsc20tPmxzbV9vaTsKLQl9IGVsc2UgewotCQlsdW1fc2l6ZSA9IGxvdl9tZHNfbWRfc2l6ZSgwLCBsdW0ubG1tX21hZ2ljKTsKLQkJbHVtayA9ICZsdW07Ci0JfQotCi0JbHVtay0+bG1tX29pID0gbHNtLT5sc21fb2k7Ci0JbHVtay0+bG1tX3N0cmlwZV9jb3VudCA9IDE7Ci0KLQlpZiAoY29weV90b191c2VyKGx1bXAsIGx1bWssIGx1bV9zaXplKSkKLQkJcmMgPSAtRUZBVUxUOwotCi0JaWYgKGx1bWsgIT0gJmx1bSkKLQkJa2ZyZWUobHVtayk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KIHN0YXRpYyBpbnQgb3NjX2lvY29udHJvbCh1bnNpZ25lZCBpbnQgY21kLCBzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBpbnQgbGVuLAogCQkJIHZvaWQgKmthcmcsIHZvaWQgX191c2VyICp1YXJnKQogewpAQCAtMjY2NCw1NyArMjUxNiw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlzd2l0Y2ggKGNtZCkgewotCWNhc2UgT0JEX0lPQ19MT1ZfR0VUX0NPTkZJRzogewotCQljaGFyICpidWY7Ci0JCXN0cnVjdCBsb3ZfZGVzYyAqZGVzYzsKLQkJc3RydWN0IG9iZF91dWlkIHV1aWQ7Ci0KLQkJYnVmID0gTlVMTDsKLQkJbGVuID0gMDsKLQkJaWYgKG9iZF9pb2N0bF9nZXRkYXRhKCZidWYsICZsZW4sIHVhcmcpKSB7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlkYXRhID0gKHN0cnVjdCBvYmRfaW9jdGxfZGF0YSAqKWJ1ZjsKLQotCQlpZiAoc2l6ZW9mKCpkZXNjKSA+IGRhdGEtPmlvY19pbmxsZW4xKSB7Ci0JCQlvYmRfaW9jdGxfZnJlZWRhdGEoYnVmLCBsZW4pOwotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJaWYgKGRhdGEtPmlvY19pbmxsZW4yIDwgc2l6ZW9mKHV1aWQpKSB7Ci0JCQlvYmRfaW9jdGxfZnJlZWRhdGEoYnVmLCBsZW4pOwotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJZGVzYyA9IChzdHJ1Y3QgbG92X2Rlc2MgKilkYXRhLT5pb2NfaW5sYnVmMTsKLQkJZGVzYy0+bGRfdGd0X2NvdW50ID0gMTsKLQkJZGVzYy0+bGRfYWN0aXZlX3RndF9jb3VudCA9IDE7Ci0JCWRlc2MtPmxkX2RlZmF1bHRfc3RyaXBlX2NvdW50ID0gMTsKLQkJZGVzYy0+bGRfZGVmYXVsdF9zdHJpcGVfc2l6ZSA9IDA7Ci0JCWRlc2MtPmxkX2RlZmF1bHRfc3RyaXBlX29mZnNldCA9IDA7Ci0JCWRlc2MtPmxkX3BhdHRlcm4gPSAwOwotCQltZW1jcHkoJmRlc2MtPmxkX3V1aWQsICZvYmQtPm9iZF91dWlkLCBzaXplb2YodXVpZCkpOwotCi0JCW1lbWNweShkYXRhLT5pb2NfaW5sYnVmMiwgJm9iZC0+b2JkX3V1aWQsIHNpemVvZih1dWlkKSk7Ci0KLQkJZXJyID0gY29weV90b191c2VyKHVhcmcsIGJ1ZiwgbGVuKTsKLQkJaWYgKGVycikKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCW9iZF9pb2N0bF9mcmVlZGF0YShidWYsIGxlbik7Ci0JCWdvdG8gb3V0OwotCX0KLQljYXNlIExMX0lPQ19MT1ZfU0VUU1RSSVBFOgotCQllcnIgPSBvYmRfYWxsb2NfbWVtbWQoZXhwLCBrYXJnKTsKLQkJaWYgKGVyciA+IDApCi0JCQllcnIgPSAwOwotCQlnb3RvIG91dDsKLQljYXNlIExMX0lPQ19MT1ZfR0VUU1RSSVBFOgotCQllcnIgPSBvc2NfZ2V0c3RyaXBlKGthcmcsIHVhcmcpOwotCQlnb3RvIG91dDsKIAljYXNlIE9CRF9JT0NfQ0xJRU5UX1JFQ09WRVI6CiAJCWVyciA9IHB0bHJwY19yZWNvdmVyX2ltcG9ydChvYmQtPnUuY2xpLmNsX2ltcG9ydCwKIAkJCQkJICAgIGRhdGEtPmlvY19pbmxidWYxLCAwKTsKQEAgLTI3NDksNTEgKzI1NTAsNyBAQAogCWlmICghdmFsbGVuIHx8ICF2YWwpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JaWYgKEtFWV9JUyhLRVlfTE9DS19UT19TVFJJUEUpKSB7Ci0JCV9fdTMyICpzdHJpcGUgPSB2YWw7Ci0JCSp2YWxsZW4gPSBzaXplb2YoKnN0cmlwZSk7Ci0JCSpzdHJpcGUgPSAwOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UgaWYgKEtFWV9JUyhLRVlfTEFTVF9JRCkpIHsKLQkJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXE7Ci0JCXU2NCAqcmVwbHk7Ci0JCWNoYXIgKnRtcDsKLQkJaW50IHJjOwotCi0JCXJlcSA9IHB0bHJwY19yZXF1ZXN0X2FsbG9jKGNsYXNzX2V4cDJjbGlpbXAoZXhwKSwKLQkJCQkJICAgJlJRRl9PU1RfR0VUX0lORk9fTEFTVF9JRCk7Ci0JCWlmICghcmVxKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJcmVxX2NhcHN1bGVfc2V0X3NpemUoJnJlcS0+cnFfcGlsbCwgJlJNRl9TRVRJTkZPX0tFWSwKLQkJCQkgICAgIFJDTF9DTElFTlQsIGtleWxlbik7Ci0JCXJjID0gcHRscnBjX3JlcXVlc3RfcGFjayhyZXEsIExVU1RSRV9PU1RfVkVSU0lPTiwgT1NUX0dFVF9JTkZPKTsKLQkJaWYgKHJjKSB7Ci0JCQlwdGxycGNfcmVxdWVzdF9mcmVlKHJlcSk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQotCQl0bXAgPSByZXFfY2Fwc3VsZV9jbGllbnRfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfU0VUSU5GT19LRVkpOwotCQltZW1jcHkodG1wLCBrZXksIGtleWxlbik7Ci0KLQkJcmVxLT5ycV9ub19kZWxheSA9IDE7Ci0JCXJlcS0+cnFfbm9fcmVzZW5kID0gMTsKLQkJcHRscnBjX3JlcXVlc3Rfc2V0X3JlcGxlbihyZXEpOwotCQlyYyA9IHB0bHJwY19xdWV1ZV93YWl0KHJlcSk7Ci0JCWlmIChyYykKLQkJCWdvdG8gb3V0OwotCi0JCXJlcGx5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX09CRF9JRCk7Ci0JCWlmICghcmVwbHkpIHsKLQkJCXJjID0gLUVQUk9UTzsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJKigodTY0ICopdmFsKSA9ICpyZXBseTsKLW91dDoKLQkJcHRscnBjX3JlcV9maW5pc2hlZChyZXEpOwotCQlyZXR1cm4gcmM7Ci0JfSBlbHNlIGlmIChLRVlfSVMoS0VZX0ZJRU1BUCkpIHsKKwlpZiAoS0VZX0lTKEtFWV9GSUVNQVApKSB7CiAJCXN0cnVjdCBsbF9maWVtYXBfaW5mb19rZXkgKmZtX2tleSA9IGtleTsKIAkJc3RydWN0IGxkbG1fcmVzX2lkIHJlc19pZDsKIAkJbGRsbV9wb2xpY3lfZGF0YV90IHBvbGljeTsKQEAgLTI5MzEsMTEgKzI2ODgsMTEgQEAKIAogCWlmIChLRVlfSVMoS0VZX0NBQ0hFX0xSVV9TSFJJTkspKSB7CiAJCXN0cnVjdCBjbGllbnRfb2JkICpjbGkgPSAmb2JkLT51LmNsaTsKLQkJaW50IG5yID0gYXRvbWljX3JlYWQoJmNsaS0+Y2xfbHJ1X2luX2xpc3QpID4+IDE7Ci0JCWludCB0YXJnZXQgPSAqKGludCAqKXZhbDsKKwkJbG9uZyBuciA9IGF0b21pY19sb25nX3JlYWQoJmNsaS0+Y2xfbHJ1X2luX2xpc3QpID4+IDE7CisJCWxvbmcgdGFyZ2V0ID0gKihsb25nICopdmFsOwogCiAJCW5yID0gb3NjX2xydV9zaHJpbmsoZW52LCBjbGksIG1pbihuciwgdGFyZ2V0KSwgdHJ1ZSk7Ci0JCSooaW50ICopdmFsIC09IG5yOworCQkqKGxvbmcgKil2YWwgLT0gbnI7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMzAxNCw4ICsyNzcxLDkgQEAKIAkJbG9uZyBsb3N0X2dyYW50OwogCiAJCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQkJZGF0YS0+b2NkX2dyYW50ID0gKGNsaS0+Y2xfYXZhaWxfZ3JhbnQgKyBjbGktPmNsX2RpcnR5KSA/OgotCQkJCTIgKiBjbGlfYnJ3X3NpemUob2JkKTsKKwkJZGF0YS0+b2NkX2dyYW50ID0gKGNsaS0+Y2xfYXZhaWxfZ3JhbnQgKworCQkJCSAgIChjbGktPmNsX2RpcnR5X3BhZ2VzIDw8IFBBR0VfU0hJRlQpKSA/OgorCQkJCSAgIDIgKiBjbGlfYnJ3X3NpemUob2JkKTsKIAkJbG9zdF9ncmFudCA9IGNsaS0+Y2xfbG9zdF9ncmFudDsKIAkJY2xpLT5jbF9sb3N0X2dyYW50ID0gMDsKIAkJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CkBAIC0zMzQ2LDcgKzMxMDQsNiBAQAogCS5kaXNjb25uZWN0ICAgICA9IG9zY19kaXNjb25uZWN0LAogCS5zdGF0ZnMgICAgICAgICA9IG9zY19zdGF0ZnMsCiAJLnN0YXRmc19hc3luYyAgID0gb3NjX3N0YXRmc19hc3luYywKLQkucGFja21kICAgICAgICAgPSBvc2NfcGFja21kLAogCS51bnBhY2ttZCAgICAgICA9IG9zY191bnBhY2ttZCwKIAkuY3JlYXRlICAgICAgICAgPSBvc2NfY3JlYXRlLAogCS5kZXN0cm95ICAgICAgICA9IG9zY19kZXN0cm95LApAQCAtMzM1NCw3ICszMTExLDYgQEAKIAkuZ2V0YXR0cl9hc3luYyAgPSBvc2NfZ2V0YXR0cl9hc3luYywKIAkuc2V0YXR0ciAgICAgICAgPSBvc2Nfc2V0YXR0ciwKIAkuc2V0YXR0cl9hc3luYyAgPSBvc2Nfc2V0YXR0cl9hc3luYywKLQkuZmluZF9jYmRhdGEgICAgPSBvc2NfZmluZF9jYmRhdGEsCiAJLmlvY29udHJvbCAgICAgID0gb3NjX2lvY29udHJvbCwKIAkuZ2V0X2luZm8gICAgICAgPSBvc2NfZ2V0X2luZm8sCiAJLnNldF9pbmZvX2FzeW5jID0gb3NjX3NldF9pbmZvX2FzeW5jLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2NsaWVudC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2NsaWVudC5jCmluZGV4IGQ0NDYzZDcuLjhjNTFkNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9jbGllbnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvY2xpZW50LmMKQEAgLTQ1LDYgKzQ1LDcgQEAKIAogc3RhdGljIGludCBwdGxycGNfc2VuZF9uZXdfcmVxKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKTsKIHN0YXRpYyBpbnQgcHRscnBjZF9jaGVja193b3JrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKTsKK3N0YXRpYyBpbnQgcHRscnBjX3VucmVnaXN0ZXJfcmVwbHkoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXF1ZXN0LCBpbnQgYXN5bmMpOwogCiAvKioKICAqIEluaXRpYWxpemUgcGFzc2VkIGluIGNsaWVudCBzdHJ1Y3R1cmUgXGEgY2wuCkBAIC04OSw3ICs5MCw2IEBACiAKIAlyZXR1cm4gYzsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX3V1aWRfdG9fY29ubmVjdGlvbik7CiAKIC8qKgogICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgbmV3IGJ1bGsgZGVzY3JpcHRvciBvbiB0aGUgc2VuZGVyLgpAQCAtMjAyLDcgKzIwMiw3IEBACiAKIAlpZiAodW5waW4pIHsKIAkJZm9yIChpID0gMDsgaSA8IGRlc2MtPmJkX2lvdl9jb3VudDsgaSsrKQotCQkJcHV0X3BhZ2UoZGVzYy0+YmRfaW92W2ldLmtpb3ZfcGFnZSk7CisJCQlwdXRfcGFnZShkZXNjLT5iZF9pb3ZbaV0uYnZfcGFnZSk7CiAJfQogCiAJa2ZyZWUoZGVzYyk7CkBAIC0yODMsOCArMjgzLDggQEAKIH0KIAogLyogQWRqdXN0IGV4cGVjdGVkIG5ldHdvcmsgbGF0ZW5jeSAqLwotc3RhdGljIHZvaWQgcHRscnBjX2F0X2Fkal9uZXRfbGF0ZW5jeShzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgc2VydmljZV90aW1lKQordm9pZCBwdGxycGNfYXRfYWRqX25ldF9sYXRlbmN5KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBzZXJ2aWNlX3RpbWUpCiB7CiAJdW5zaWduZWQgaW50IG5sLCBvbGRubDsKIAlzdHJ1Y3QgaW1wX2F0ICphdDsKQEAgLTM2NCwzMSArMzY0LDM3IEBACiAJfQogCiAJcmMgPSB1bnBhY2tfcmVwbHkoZWFybHlfcmVxKTsKLQlpZiAocmMgPT0gMCkgewotCQkvKiBFeHBlY3RpbmcgdG8gaW5jcmVhc2UgdGhlIHNlcnZpY2UgdGltZSBlc3RpbWF0ZSBoZXJlICovCi0JCXB0bHJwY19hdF9hZGpfc2VydmljZShyZXEsCi0JCQlsdXN0cmVfbXNnX2dldF90aW1lb3V0KGVhcmx5X3JlcS0+cnFfcmVwbXNnKSk7Ci0JCXB0bHJwY19hdF9hZGpfbmV0X2xhdGVuY3kocmVxLAotCQkJbHVzdHJlX21zZ19nZXRfc2VydmljZV90aW1lKGVhcmx5X3JlcS0+cnFfcmVwbXNnKSk7Ci0JfQotCi0Jc3B0bHJwY19jbGlfZmluaXNoX2Vhcmx5X3JlcGx5KGVhcmx5X3JlcSk7Ci0KLQlpZiAocmMgIT0gMCkgeworCWlmIChyYykgeworCQlzcHRscnBjX2NsaV9maW5pc2hfZWFybHlfcmVwbHkoZWFybHlfcmVxKTsKIAkJc3Bpbl9sb2NrKCZyZXEtPnJxX2xvY2spOwogCQlyZXR1cm4gcmM7CiAJfQogCi0JLyogQWRqdXN0IHRoZSBsb2NhbCB0aW1lb3V0IGZvciB0aGlzIHJlcSAqLwotCXB0bHJwY19hdF9zZXRfcmVxX3RpbWVvdXQocmVxKTsKKwkvKgorCSAqIFVzZSBuZXcgdGltZW91dCB2YWx1ZSBqdXN0IHRvIGFkanVzdCB0aGUgbG9jYWwgdmFsdWUgZm9yIHRoaXMKKwkgKiByZXF1ZXN0LCBkb24ndCBpbmNsdWRlIGl0IGludG8gYXRfaGlzdG9yeS4gSXQgaXMgdW5jbGVhciB5ZXQgd2h5CisJICogc2VydmljZSB0aW1lIGluY3JlYXNlZCBhbmQgc2hvdWxkIGl0IGJlIGNvdW50ZWQgb3Igc2tpcHBlZCwgZS5nLgorCSAqIHRoYXQgY2FuIGJlIHJlY292ZXJ5IGNhc2Ugb3Igc29tZSBlcnJvciBvciBzZXJ2ZXIsIHRoZSByZWFsIHJlcGx5CisJICogd2lsbCBhZGQgYWxsIG5ldyBkYXRhIGlmIGl0IGlzIHdvcnRoIHRvIGFkZC4KKwkgKi8KKwlyZXEtPnJxX3RpbWVvdXQgPSBsdXN0cmVfbXNnX2dldF90aW1lb3V0KGVhcmx5X3JlcS0+cnFfcmVwbXNnKTsKKwlsdXN0cmVfbXNnX3NldF90aW1lb3V0KHJlcS0+cnFfcmVxbXNnLCByZXEtPnJxX3RpbWVvdXQpOworCisJLyogTmV0d29yayBsYXRlbmN5IGNhbiBiZSBhZGp1c3RlZCwgaXQgaXMgcHVyZSBuZXR3b3JrIGRlbGF5cyAqLworCXB0bHJwY19hdF9hZGpfbmV0X2xhdGVuY3kocmVxLAorCQkJCSAgbHVzdHJlX21zZ19nZXRfc2VydmljZV90aW1lKGVhcmx5X3JlcS0+cnFfcmVwbXNnKSk7CisKKwlzcHRscnBjX2NsaV9maW5pc2hfZWFybHlfcmVwbHkoZWFybHlfcmVxKTsKIAogCXNwaW5fbG9jaygmcmVxLT5ycV9sb2NrKTsKIAlvbGRkbCA9IHJlcS0+cnFfZGVhZGxpbmU7CiAJLyoKLQkgKiBzZXJ2ZXIgYXNzdW1lcyBpdCBub3cgaGFzIHJxX3RpbWVvdXQgZnJvbSB3aGVuIGl0IHNlbnQgdGhlCi0JICogZWFybHkgcmVwbHksIHNvIGNsaWVudCBzaG91bGQgZ2l2ZSBpdCBhdCBsZWFzdCB0aGF0IGxvbmcuCisJICogc2VydmVyIGFzc3VtZXMgaXQgbm93IGhhcyBycV90aW1lb3V0IGZyb20gd2hlbiB0aGUgcmVxdWVzdAorCSAqIGFycml2ZWQsIHNvIHRoZSBjbGllbnQgc2hvdWxkIGdpdmUgaXQgYXQgbGVhc3QgdGhhdCBsb25nLgorCSAqIHNpbmNlIHdlIGRvbid0IGtub3cgdGhlIGFycml2YWwgdGltZSB3ZSdsbCB1c2UgdGhlIG9yaWdpbmFsCisJICogc2VudCB0aW1lCiAJICovCi0JcmVxLT5ycV9kZWFkbGluZSA9IGt0aW1lX2dldF9yZWFsX3NlY29uZHMoKSArIHJlcS0+cnFfdGltZW91dCArCisJcmVxLT5ycV9kZWFkbGluZSA9IHJlcS0+cnFfc2VudCArIHJlcS0+cnFfdGltZW91dCArCiAJCQkgICBwdGxycGNfYXRfZ2V0X25ldF9sYXRlbmN5KHJlcSk7CiAKIAlERUJVR19SRVEoRF9BREFQVFRPLCByZXEsCkBAIC04ODQsNyArODkwLDYgQEAKIAogCXJldHVybiBzZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19wcmVwX2Zjc2V0KTsKIAogLyoqCiAgKiBXaW5kIGRvd24gYW5kIGZyZWUgcmVxdWVzdCBzZXQgc3RydWN0dXJlIHByZXZpb3VzbHkgYWxsb2NhdGVkIHdpdGgKQEAgLTEwMDQsNyArMTAwOSw2IEBACiAJCQl3YWtlX3VwKCZwYy0+cGNfcGFydG5lcnNbaV0tPnBjX3NldC0+c2V0X3dhaXRxKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19zZXRfYWRkX25ld19yZXEpOwogCiAvKioKICAqIEJhc2VkIG9uIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBpbXBvcnQsIGRldGVybWluZSBpZiB0aGUgcmVxdWVzdApAQCAtMTAzNSw4ICsxMDM5LDggQEAKIAkJKnN0YXR1cyA9IC1FSU87CiAJfSBlbHNlIGlmIChwdGxycGNfc2VuZF9saW1pdF9leHBpcmVkKHJlcSkpIHsKIAkJLyogcHJvYmFibHkgZG9lc24ndCBuZWVkIHRvIGJlIGEgRF9FUlJPUiBhZnRlciBpbml0aWFsIHRlc3RpbmcgKi8KLQkJREVCVUdfUkVRKERfRVJST1IsIHJlcSwgInNlbmQgbGltaXQgZXhwaXJlZCAiKTsKLQkJKnN0YXR1cyA9IC1FSU87CisJCURFQlVHX1JFUShEX0hBLCByZXEsICJzZW5kIGxpbWl0IGV4cGlyZWQgIik7CisJCSpzdGF0dXMgPSAtRVRJTUVET1VUOwogCX0gZWxzZSBpZiAocmVxLT5ycV9zZW5kX3N0YXRlID09IExVU1RSRV9JTVBfQ09OTkVDVElORyAmJgogCQkgICBpbXAtPmltcF9zdGF0ZSA9PSBMVVNUUkVfSU1QX0NPTk5FQ1RJTkcpIHsKIAkJLyogYWxsb3cgQ09OTkVDVCBldmVuIGlmIGltcG9ydCBpcyBpbnZhbGlkICovCkBAIC0xMDczLDM2ICsxMDc3LDQyIEBACiB9CiAKIC8qKgotICogRGVjaWRlIGlmIHRoZSBlcnJvciBtZXNzYWdlIHJlZ2FyZGluZyBwcm92aWRlZCByZXF1ZXN0IFxhIHJlcQotICogc2hvdWxkIGJlIHByaW50ZWQgdG8gdGhlIGNvbnNvbGUgb3Igbm90LgotICogTWFrZXMgaXQncyBkZWNpc2lvbiBvbiByZXF1ZXN0IHN0YXR1cyBhbmQgb3RoZXIgcHJvcGVydGllcy4KLSAqIFJldHVybnMgMSB0byBwcmludCBlcnJvciBvbiB0aGUgc3lzdGVtIGNvbnNvbGUgb3IgMCBpZiBub3QuCisgKiBEZWNpZGUgaWYgdGhlIGVycm9yIG1lc3NhZ2Ugc2hvdWxkIGJlIHByaW50ZWQgdG8gdGhlIGNvbnNvbGUgb3Igbm90LgorICogTWFrZXMgaXRzIGRlY2lzaW9uIGJhc2VkIG9uIHJlcXVlc3QgdHlwZSwgc3RhdHVzLCBhbmQgZmFpbHVyZSBmcmVxdWVuY3kuCisgKgorICogXHBhcmFtW2luXSByZXEgIHJlcXVlc3QgdGhhdCBmYWlsZWQgYW5kIG1heSBuZWVkIGEgY29uc29sZSBtZXNzYWdlCisgKgorICogXHJldHZhbCBmYWxzZSBpZiBubyBtZXNzYWdlIHNob3VsZCBiZSBwcmludGVkCisgKiBccmV0dmFsIHRydWUgIGlmIGNvbnNvbGUgbWVzc2FnZSBzaG91bGQgYmUgcHJpbnRlZAogICovCi1zdGF0aWMgaW50IHB0bHJwY19jb25zb2xlX2FsbG93KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKQorc3RhdGljIGJvb2wgcHRscnBjX2NvbnNvbGVfYWxsb3coc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpCiB7CiAJX191MzIgb3BjOwotCWludCBlcnI7CiAKIAlMQVNTRVJUKHJlcS0+cnFfcmVxbXNnKTsKIAlvcGMgPSBsdXN0cmVfbXNnX2dldF9vcGMocmVxLT5ycV9yZXFtc2cpOwogCi0JLyoKLQkgKiBTdXBwcmVzcyBwYXJ0aWN1bGFyIHJlY29ubmVjdCBlcnJvcnMgd2hpY2ggYXJlIHRvIGJlIGV4cGVjdGVkLiAgTm8KLQkgKiBlcnJvcnMgYXJlIHN1cHByZXNzZWQgZm9yIHRoZSBpbml0aWFsIGNvbm5lY3Rpb24gb24gYW4gaW1wb3J0Ci0JICovCi0JaWYgKChsdXN0cmVfaGFuZGxlX2lzX3VzZWQoJnJlcS0+cnFfaW1wb3J0LT5pbXBfcmVtb3RlX2hhbmRsZSkpICYmCi0JICAgIChvcGMgPT0gT1NUX0NPTk5FQ1QgfHwgb3BjID09IE1EU19DT05ORUNUIHx8IG9wYyA9PSBNR1NfQ09OTkVDVCkpIHsKLQkJLyogU3VwcHJlc3MgdGltZWQgb3V0IHJlY29ubmVjdCByZXF1ZXN0cyAqLwotCQlpZiAocmVxLT5ycV90aW1lZG91dCkKLQkJCXJldHVybiAwOworCS8qIFN1cHByZXNzIHBhcnRpY3VsYXIgcmVjb25uZWN0IGVycm9ycyB3aGljaCBhcmUgdG8gYmUgZXhwZWN0ZWQuICovCisJaWYgKG9wYyA9PSBPU1RfQ09OTkVDVCB8fCBvcGMgPT0gTURTX0NPTk5FQ1QgfHwgb3BjID09IE1HU19DT05ORUNUKSB7CisJCWludCBlcnI7CiAKLQkJLyogU3VwcHJlc3MgdW5hdmFpbGFibGUvYWdhaW4gcmVjb25uZWN0IHJlcXVlc3RzICovCisJCS8qIFN1cHByZXNzIHRpbWVkIG91dCByZWNvbm5lY3QgcmVxdWVzdHMgKi8KKwkJaWYgKGx1c3RyZV9oYW5kbGVfaXNfdXNlZCgmcmVxLT5ycV9pbXBvcnQtPmltcF9yZW1vdGVfaGFuZGxlKSB8fAorCQkgICAgcmVxLT5ycV90aW1lZG91dCkKKwkJCXJldHVybiBmYWxzZTsKKworCQkvKgorCQkgKiBTdXBwcmVzcyBtb3N0IHVuYXZhaWxhYmxlL2FnYWluIHJlY29ubmVjdCByZXF1ZXN0cywgYnV0CisJCSAqIHByaW50IG9jY2FzaW9uYWxseSBzbyBpdCBpcyBjbGVhciBjbGllbnQgaXMgdHJ5aW5nIHRvCisJCSAqIGNvbm5lY3QgdG8gYSBzZXJ2ZXIgd2hlcmUgbm8gdGFyZ2V0IGlzIHJ1bm5pbmcuCisJCSAqLwogCQllcnIgPSBsdXN0cmVfbXNnX2dldF9zdGF0dXMocmVxLT5ycV9yZXBtc2cpOwotCQlpZiAoZXJyID09IC1FTk9ERVYgfHwgZXJyID09IC1FQUdBSU4pCi0JCQlyZXR1cm4gMDsKKwkJaWYgKChlcnIgPT0gLUVOT0RFViB8fCBlcnIgPT0gLUVBR0FJTikgJiYKKwkJICAgIHJlcS0+cnFfaW1wb3J0LT5pbXBfY29ubl9jbnQgJSAzMCAhPSAyMCkKKwkJCXJldHVybiBmYWxzZTsKIAl9CiAKLQlyZXR1cm4gMTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogLyoqCkBAIC0xMTE2LDE0ICsxMTI2LDE0IEBACiAJZXJyID0gbHVzdHJlX21zZ19nZXRfc3RhdHVzKHJlcS0+cnFfcmVwbXNnKTsKIAlpZiAobHVzdHJlX21zZ19nZXRfdHlwZShyZXEtPnJxX3JlcG1zZykgPT0gUFRMX1JQQ19NU0dfRVJSKSB7CiAJCXN0cnVjdCBvYmRfaW1wb3J0ICppbXAgPSByZXEtPnJxX2ltcG9ydDsKKwkJbG5ldF9uaWRfdCBuaWQgPSBpbXAtPmltcF9jb25uZWN0aW9uLT5jX3BlZXIubmlkOwogCQlfX3UzMiBvcGMgPSBsdXN0cmVfbXNnX2dldF9vcGMocmVxLT5ycV9yZXFtc2cpOwogCiAJCWlmIChwdGxycGNfY29uc29sZV9hbGxvdyhyZXEpKQotCQkJTENPTlNPTEVfRVJST1JfTVNHKDB4MDExLCAiJXM6IENvbW11bmljYXRpbmcgd2l0aCAlcywgb3BlcmF0aW9uICVzIGZhaWxlZCB3aXRoICVkLlxuIiwKKwkJCUxDT05TT0xFX0VSUk9SX01TRygweDAxMSwgIiVzOiBvcGVyYXRpb24gJXMgdG8gbm9kZSAlcyBmYWlsZWQ6IHJjID0gJWRcbiIsCiAJCQkJCSAgIGltcC0+aW1wX29iZC0+b2JkX25hbWUsCi0JCQkJCSAgIGxpYmNmc19uaWQyc3RyKAotCQkJCQkJICAgaW1wLT5pbXBfY29ubmVjdGlvbi0+Y19wZWVyLm5pZCksCi0JCQkJCSAgIGxsX29wY29kZTJzdHIob3BjKSwgZXJyKTsKKwkJCQkJICAgbGxfb3Bjb2RlMnN0cihvcGMpLAorCQkJCQkgICBsaWJjZnNfbmlkMnN0cihuaWQpLCBlcnIpOwogCQlyZXR1cm4gZXJyIDwgMCA/IGVyciA6IC1FSU5WQUw7CiAJfQogCkBAIC0xMjgwLDcgKzEyOTAsNyBAQAogCQkgKiBzb21lIHJlYXNvbi4gVHJ5IHRvIHJlY29ubmVjdCwgYW5kIGlmIHRoYXQgZmFpbHMsIHB1bnQgdG8KIAkJICogdGhlIHVwY2FsbC4KIAkJICovCi0JCWlmIChsbF9ycGNfcmVjb3ZlcmFibGVfZXJyb3IocmMpKSB7CisJCWlmIChwdGxycGNfcmVjb3ZlcmFibGVfZXJyb3IocmMpKSB7CiAJCQlpZiAocmVxLT5ycV9zZW5kX3N0YXRlICE9IExVU1RSRV9JTVBfRlVMTCB8fAogCQkJICAgIGltcC0+aW1wX29iZC0+b2JkX25vX3JlY292IHx8IGltcC0+aW1wX2RsbV9mYWtlKSB7CiAJCQkJcmV0dXJuIHJjOwpAQCAtMTYyOCw4ICsxNjM4LDEwIEBACiAJCQkgICAgcmVxLT5ycV93YWl0aW5nIHx8IHJlcS0+cnFfd2FpdF9jdHgpIHsKIAkJCQlpbnQgc3RhdHVzOwogCi0JCQkJaWYgKCFwdGxycGNfdW5yZWdpc3Rlcl9yZXBseShyZXEsIDEpKQorCQkJCWlmICghcHRscnBjX3VucmVnaXN0ZXJfcmVwbHkocmVxLCAxKSkgeworCQkJCQlwdGxycGNfdW5yZWdpc3Rlcl9idWxrKHJlcSwgMSk7CiAJCQkJCWNvbnRpbnVlOworCQkJCX0KIAogCQkJCXNwaW5fbG9jaygmaW1wLT5pbXBfbG9jayk7CiAJCQkJaWYgKHB0bHJwY19pbXBvcnRfZGVsYXlfcmVxKGltcCwgcmVxLApAQCAtMTk5NSw3ICsyMDA3LDYgQEAKIAkgKi8KIAlyZXR1cm4gMTsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX2V4cGlyZWRfc2V0KTsKIAogLyoqCiAgKiBTZXRzIHJxX2ludHIgZmxhZyBpbiBcYSByZXEgdW5kZXIgc3BpbmxvY2suCkBAIC0yMDEyLDcgKzIwMjMsNyBAQAogICogSW50ZXJydXB0cyAoc2V0cyBpbnRlcnJ1cHRlZCBmbGFnKSBhbGwgdW5jb21wbGV0ZWQgcmVxdWVzdHMgaW4KICAqIGEgc2V0IFxhIGRhdGEuIENhbGxiYWNrIGZvciBsX3dhaXRfZXZlbnQgZm9yIGludGVycnVwdGlibGUgd2FpdHMuCiAgKi8KLXZvaWQgcHRscnBjX2ludGVycnVwdGVkX3NldCh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgcHRscnBjX2ludGVycnVwdGVkX3NldCh2b2lkICpkYXRhKQogewogCXN0cnVjdCBwdGxycGNfcmVxdWVzdF9zZXQgKnNldCA9IGRhdGE7CiAJc3RydWN0IGxpc3RfaGVhZCAqdG1wOwpAQCAtMjAzMCw3ICsyMDQxLDYgQEAKIAkJcHRscnBjX21hcmtfaW50ZXJydXB0ZWQocmVxKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19pbnRlcnJ1cHRlZF9zZXQpOwogCiAvKioKICAqIEdldCB0aGUgc21hbGxlc3QgdGltZW91dCBpbiB0aGUgc2V0OyB0aGlzIGRvZXMgTk9UIHNldCBhIHRpbWVvdXQuCkBAIC0yMDc0LDcgKzIwODQsNiBAQAogCX0KIAlyZXR1cm4gdGltZW91dDsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX3NldF9uZXh0X3RpbWVvdXQpOwogCiAvKioKICAqIFNlbmQgYWxsIHVuc2V0IHJlcXVlc3QgZnJvbSB0aGUgc2V0IGFuZCB0aGVuIHdhaXQgdW50aWwgYWxsCkBAIC0yMzI1LDcgKzIzMzQsNyBAQAogICogVGhlIHJlcXVlc3Qgb3duZXIgKGkuZS4gdGhlIHRocmVhZCBkb2luZyB0aGUgSS9PKSBtdXN0IGNhbGwuLi4KICAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIDEgaWYgdW5yZWdpc3RlcmluZyBjYW5ub3QgYmUgbWFkZS4KICAqLwotaW50IHB0bHJwY191bnJlZ2lzdGVyX3JlcGx5KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxdWVzdCwgaW50IGFzeW5jKQorc3RhdGljIGludCBwdGxycGNfdW5yZWdpc3Rlcl9yZXBseShzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcXVlc3QsIGludCBhc3luYykKIHsKIAlpbnQgcmM7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgKndxOwpAQCAtMjM5MCw3ICsyMzk5LDYgQEAKIAl9CiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY191bnJlZ2lzdGVyX3JlcGx5KTsKIAogc3RhdGljIHZvaWQgcHRscnBjX2ZyZWVfcmVxdWVzdChzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSkKIHsKQEAgLTI0NTEsNyArMjQ1OSw4IEBACiAJICAgICAgIGltcC0+aW1wX29iZC0+b2JkX25hbWUsIGltcC0+aW1wX3BlZXJfY29tbWl0dGVkX3RyYW5zbm8sCiAJICAgICAgIGltcC0+aW1wX2dlbmVyYXRpb24pOwogCi0JaWYgKGltcC0+aW1wX2dlbmVyYXRpb24gIT0gaW1wLT5pbXBfbGFzdF9nZW5lcmF0aW9uX2NoZWNrZWQpCisJaWYgKGltcC0+aW1wX2dlbmVyYXRpb24gIT0gaW1wLT5pbXBfbGFzdF9nZW5lcmF0aW9uX2NoZWNrZWQgfHwKKwkgICAgIWltcC0+aW1wX2xhc3RfdHJhbnNub19jaGVja2VkKQogCQlza2lwX2NvbW1pdHRlZF9saXN0ID0gZmFsc2U7CiAKIAlpbXAtPmltcF9sYXN0X3RyYW5zbm9fY2hlY2tlZCA9IGltcC0+aW1wX3BlZXJfY29tbWl0dGVkX3RyYW5zbm87CkBAIC0yNDk5LDYgKzI1MDgsOSBAQAogCQlpZiAocmVxLT5ycV9pbXBvcnRfZ2VuZXJhdGlvbiA8IGltcC0+aW1wX2dlbmVyYXRpb24pIHsKIAkJCURFQlVHX1JFUShEX1JQQ1RSQUNFLCByZXEsICJmcmVlIHN0YWxlIG9wZW4gcmVxdWVzdCIpOwogCQkJcHRscnBjX2ZyZWVfcmVxdWVzdChyZXEpOworCQl9IGVsc2UgaWYgKCFyZXEtPnJxX3JlcGxheSkgeworCQkJREVCVUdfUkVRKERfUlBDVFJBQ0UsIHJlcSwgImZyZWUgY2xvc2VkIG9wZW4gcmVxdWVzdCIpOworCQkJcHRscnBjX2ZyZWVfcmVxdWVzdChyZXEpOwogCQl9CiAJfQogfQpAQCAtMjU0MSw3ICsyNTUzLDYgQEAKIAlwdGxycGNfY2xpZW50X3dha2VfcmVxKHJlcSk7CiAJc3Bpbl91bmxvY2soJnJlcS0+cnFfbG9jayk7CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19yZXNlbmRfcmVxKTsKIAogLyoqCiAgKiBHcmFiIGFkZGl0aW9uYWwgcmVmZXJlbmNlIG9uIGEgcmVxdWVzdCBcYSByZXEKQEAgLTI2MTAsNyArMjYyMSw2IEBACiAKIAlsaXN0X2FkZCgmcmVxLT5ycV9yZXBsYXlfbGlzdCwgJmltcC0+aW1wX3JlcGxheV9saXN0KTsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX3JldGFpbl9yZXBsYXlhYmxlX3JlcXVlc3QpOwogCiAvKioKICAqIFNlbmQgcmVxdWVzdCBhbmQgd2FpdCB1bnRpbCBpdCBjb21wbGV0ZXMuCkBAIC0yNzgzLDcgKzI3OTMsNiBAQAogCXB0bHJwY2RfYWRkX3JlcShyZXEpOwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChwdGxycGNfcmVwbGF5X3JlcSk7CiAKIC8qKgogICogQWJvcnRzIGFsbCBpbi1mbGlnaHQgcmVxdWVzdCBvbiBpbXBvcnQgXGEgaW1wIHNlbmRpbmcgYW5kIGRlbGF5ZWQgbGlzdHMKQEAgLTI4NDMsNyArMjg1Miw2IEBACiAKIAlzcGluX3VubG9jaygmaW1wLT5pbXBfbG9jayk7CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19hYm9ydF9pbmZsaWdodCk7CiAKIC8qKgogICogQWJvcnQgYWxsIHVuY29tcGxldGVkIHJlcXVlc3RzIGluIHJlcXVlc3Qgc2V0IFxhIHNldApAQCAtMjkyOSw3ICsyOTM3LDYgQEAKIAogCXJldHVybiBuZXh0OwogfQotRVhQT1JUX1NZTUJPTChwdGxycGNfbmV4dF94aWQpOwogCiAvKioKICAqIEdldCBhIGdsaW1wc2UgYXQgd2hhdCBuZXh0IHhpZCB2YWx1ZSBtaWdodCBoYXZlIGJlZW4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvY29ubmVjdGlvbi5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2Nvbm5lY3Rpb24uYwppbmRleCAxNzdhMzc5Li43YjAyMGQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvY29ubmVjdGlvbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9jb25uZWN0aW9uLmMKQEAgLTgyLDcgKzgyLDYgQEAKIAkgICAgICAgbGliY2ZzX25pZDJzdHIoY29ubi0+Y19wZWVyLm5pZCkpOwogCXJldHVybiBjb25uOwogfQotRVhQT1JUX1NZTUJPTChwdGxycGNfY29ubmVjdGlvbl9nZXQpOwogCiBpbnQgcHRscnBjX2Nvbm5lY3Rpb25fcHV0KHN0cnVjdCBwdGxycGNfY29ubmVjdGlvbiAqY29ubikKIHsKQEAgLTExOCw3ICsxMTcsNiBAQAogCiAJcmV0dXJuIHJjOwogfQotRVhQT1JUX1NZTUJPTChwdGxycGNfY29ubmVjdGlvbl9wdXQpOwogCiBzdHJ1Y3QgcHRscnBjX2Nvbm5lY3Rpb24gKgogcHRscnBjX2Nvbm5lY3Rpb25fYWRkcmVmKHN0cnVjdCBwdGxycGNfY29ubmVjdGlvbiAqY29ubikKQEAgLTEzMCw3ICsxMjgsNiBAQAogCiAJcmV0dXJuIGNvbm47CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19jb25uZWN0aW9uX2FkZHJlZik7CiAKIGludCBwdGxycGNfY29ubmVjdGlvbl9pbml0KHZvaWQpCiB7CkBAIC0xNDYsMTMgKzE0MywxMSBAQAogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19jb25uZWN0aW9uX2luaXQpOwogCiB2b2lkIHB0bHJwY19jb25uZWN0aW9uX2Zpbmkodm9pZCkKIHsKIAljZnNfaGFzaF9wdXRyZWYoY29ubl9oYXNoKTsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX2Nvbm5lY3Rpb25fZmluaSk7CiAKIC8qCiAgKiBIYXNoIG9wZXJhdGlvbnMgZm9yIG5ldF9wZWVyPC0+Y29ubmVjdGlvbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2V2ZW50cy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2V2ZW50cy5jCmluZGV4IGIxY2U3MjUuLjI4M2RmYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9ldmVudHMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZXZlbnRzLmMKQEAgLTU0Myw3ICs1NDMsNyBAQAogCXJjID0gTE5ldE5JSW5pdChwaWQpOwogCWlmIChyYyA8IDApIHsKIAkJQ0RFQlVHKERfTkVULCAiQ2FuJ3QgaW5pdCBuZXR3b3JrIGludGVyZmFjZTogJWRcbiIsIHJjKTsKLQkJcmV0dXJuIC1FTk9FTlQ7CisJCXJldHVybiByYzsKIAl9CiAKIAkvKiBDQVZFQVQgRU1QVE9SOiBob3cgd2UgcHJvY2VzcyBwb3J0YWxzIGV2ZW50cyBpcyBfcmFkaWNhbGx5XwpAQCAtNTYxLDcgKzU2MSw3IEBACiAJQ0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgZXZlbnQgcXVldWU6ICVkXG4iLCByYyk7CiAJTE5ldE5JRmluaSgpOwogCi0JcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIHJjOwogfQogCiBpbnQgcHRscnBjX2luaXRfcG9ydGFscyh2b2lkKQpAQCAtNTcwLDcgKzU3MCw3IEBACiAKIAlpZiAocmMgIT0gMCkgewogCQlDRVJST1IoIm5ldHdvcmsgaW5pdGlhbGlzYXRpb24gZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FSU87CisJCXJldHVybiByYzsKIAl9CiAJcmMgPSBwdGxycGNkX2FkZHJlZigpOwogCWlmIChyYyA9PSAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2ltcG9ydC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2ltcG9ydC5jCmluZGV4IDMyOTJlNmUuLmEyM2QwYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9pbXBvcnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvaW1wb3J0LmMKQEAgLTMwNyw3ICszMDcsOCBAQAogCQkgKi8KIAkJbHdpID0gTFdJX1RJTUVPVVRfSU5URVJWQUwoCiAJCQljZnNfdGltZW91dF9jYXAoY2ZzX3RpbWVfc2Vjb25kcyh0aW1lb3V0KSksCi0JCQkodGltZW91dCA+IDEpP2Nmc190aW1lX3NlY29uZHMoMSk6Y2ZzX3RpbWVfc2Vjb25kcygxKS8yLAorCQkJKHRpbWVvdXQgPiAxKSA/IGNmc190aW1lX3NlY29uZHMoMSkgOgorCQkJY2ZzX3RpbWVfc2Vjb25kcygxKSAvIDIsCiAJCQlOVUxMLCBOVUxMKTsKIAkJcmMgPSBsX3dhaXRfZXZlbnQoaW1wLT5pbXBfcmVjb3Zlcnlfd2FpdHEsCiAJCQkJICAoYXRvbWljX3JlYWQoJmltcC0+aW1wX2luZmxpZ2h0KSA9PSAwKSwKQEAgLTQyNCw3ICs0MjUsNiBAQAogCQlwdGxycGNfcGluZ2VyX2ZvcmNlKGltcCk7CiAJfQogfQotRVhQT1JUX1NZTUJPTChwdGxycGNfZmFpbF9pbXBvcnQpOwogCiBpbnQgcHRscnBjX3JlY29ubmVjdF9pbXBvcnQoc3RydWN0IG9iZF9pbXBvcnQgKmltcCkKIHsKQEAgLTY5OCw3ICs2OTgsOCBAQAogCXJlcXVlc3QtPnJxX3NlbmRfc3RhdGUgPSBMVVNUUkVfSU1QX0NPTk5FQ1RJTkc7CiAJLyogQWxsb3cgYSBzbGlnaHRseSBsYXJnZXIgcmVwbHkgZm9yIGZ1dHVyZSBncm93dGggY29tcGF0aWJpbGl0eSAqLwogCXJlcV9jYXBzdWxlX3NldF9zaXplKCZyZXF1ZXN0LT5ycV9waWxsLCAmUk1GX0NPTk5FQ1RfREFUQSwgUkNMX1NFUlZFUiwKLQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBvYmRfY29ubmVjdF9kYXRhKSsxNipzaXplb2YoX191NjQpKTsKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBvYmRfY29ubmVjdF9kYXRhKSArCisJCQkgICAgIDE2ICogc2l6ZW9mKF9fdTY0KSk7CiAJcHRscnBjX3JlcXVlc3Rfc2V0X3JlcGxlbihyZXF1ZXN0KTsKIAlyZXF1ZXN0LT5ycV9pbnRlcnByZXRfcmVwbHkgPSBwdGxycGNfY29ubmVjdF9pbnRlcnByZXQ7CiAKQEAgLTc1MCw2ICs3NTEsMTUzIEBACiAJcmV0dXJuIChyYyA9PSAtRUJVU1kpIHx8IChyYyA9PSAtRUFHQUlOKTsKIH0KIAorc3RhdGljIGludCBwdGxycGNfY29ubmVjdF9zZXRfZmxhZ3Moc3RydWN0IG9iZF9pbXBvcnQgKmltcCwKKwkJCQkgICAgc3RydWN0IG9iZF9jb25uZWN0X2RhdGEgKm9jZCwKKwkJCQkgICAgdTY0IG9sZF9jb25uZWN0X2ZsYWdzLAorCQkJCSAgICBzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBpbnQgaW5pdF9jb25uZWN0KQoreworCXN0cnVjdCBjbGllbnRfb2JkICpjbGkgPSAmaW1wLT5pbXBfb2JkLT51LmNsaTsKKwlzdGF0aWMgYm9vbCB3YXJuZWQ7CisKKwlpZiAoKGltcC0+aW1wX2Nvbm5lY3RfZmxhZ3Nfb3JpZyAmIE9CRF9DT05ORUNUX0lCSVRTKSAmJgorCSAgICAhKG9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3MgJiBPQkRfQ09OTkVDVF9JQklUUykpIHsKKwkJTENPTlNPTEVfV0FSTigiJXM6IE1EUyAlcyBkb2VzIG5vdCBzdXBwb3J0IGliaXRzIGxvY2ssIGVpdGhlciB2ZXJ5IG9sZCBvciBpbnZhbGlkOiByZXF1ZXN0ZWQgJSNsbHgsIHJlcGxpZWQgJSNsbHhcbiIsCisJCQkgICAgICBpbXAtPmltcF9vYmQtPm9iZF9uYW1lLAorCQkJICAgICAgaW1wLT5pbXBfY29ubmVjdGlvbi0+Y19yZW1vdGVfdXVpZC51dWlkLAorCQkJICAgICAgaW1wLT5pbXBfY29ubmVjdF9mbGFnc19vcmlnLAorCQkJICAgICAgb2NkLT5vY2RfY29ubmVjdF9mbGFncyk7CisJCXJldHVybiAtRVBST1RPOworCX0KKworCXNwaW5fbG9jaygmaW1wLT5pbXBfbG9jayk7CisJbGlzdF9kZWwoJmltcC0+aW1wX2Nvbm5fY3VycmVudC0+b2ljX2l0ZW0pOworCWxpc3RfYWRkKCZpbXAtPmltcF9jb25uX2N1cnJlbnQtPm9pY19pdGVtLCAmaW1wLT5pbXBfY29ubl9saXN0KTsKKwlpbXAtPmltcF9sYXN0X3N1Y2Nlc3NfY29ubiA9IGltcC0+aW1wX2Nvbm5fY3VycmVudC0+b2ljX2xhc3RfYXR0ZW1wdDsKKworCXNwaW5fdW5sb2NrKCZpbXAtPmltcF9sb2NrKTsKKworCWlmICghd2FybmVkICYmIChvY2QtPm9jZF9jb25uZWN0X2ZsYWdzICYgT0JEX0NPTk5FQ1RfVkVSU0lPTikgJiYKKwkgICAgKG9jZC0+b2NkX3ZlcnNpb24gPiBMVVNUUkVfVkVSU0lPTl9DT0RFICsKKwkJCQlMVVNUUkVfVkVSU0lPTl9PRkZTRVRfV0FSTiB8fAorCSAgICAgb2NkLT5vY2RfdmVyc2lvbiA8IExVU1RSRV9WRVJTSU9OX0NPREUgLQorCQkJCUxVU1RSRV9WRVJTSU9OX09GRlNFVF9XQVJOKSkgeworCQkvKgorCQkgKiBTaWdoLCBzb21lIGNvbXBpbGVycyBkbyBub3QgbGlrZSAjaWZkZWYgaW4gdGhlIG1pZGRsZQorCQkgKiBvZiBtYWNybyBhcmd1bWVudHMKKwkJICovCisJCWNvbnN0IGNoYXIgKm9sZGVyID0gIm9sZGVyIHRoYW4gY2xpZW50LiBDb25zaWRlciB1cGdyYWRpbmcgc2VydmVyIjsKKwkJY29uc3QgY2hhciAqbmV3ZXIgPSAibmV3ZXIgdGhhbiBjbGllbnQuIENvbnNpZGVyIHJlY29tcGlsaW5nIGFwcGxpY2F0aW9uIjsKKworCQlMQ09OU09MRV9XQVJOKCJTZXJ2ZXIgJXMgdmVyc2lvbiAoJWQuJWQuJWQuJWQpIGlzIG11Y2ggJXMgKCVzKVxuIiwKKwkJCSAgICAgIG9iZDJjbGlfdGd0KGltcC0+aW1wX29iZCksCisJCQkgICAgICBPQkRfT0NEX1ZFUlNJT05fTUFKT1Iob2NkLT5vY2RfdmVyc2lvbiksCisJCQkgICAgICBPQkRfT0NEX1ZFUlNJT05fTUlOT1Iob2NkLT5vY2RfdmVyc2lvbiksCisJCQkgICAgICBPQkRfT0NEX1ZFUlNJT05fUEFUQ0gob2NkLT5vY2RfdmVyc2lvbiksCisJCQkgICAgICBPQkRfT0NEX1ZFUlNJT05fRklYKG9jZC0+b2NkX3ZlcnNpb24pLAorCQkJICAgICAgb2NkLT5vY2RfdmVyc2lvbiA+IExVU1RSRV9WRVJTSU9OX0NPREUgPworCQkJICAgICAgbmV3ZXIgOiBvbGRlciwgTFVTVFJFX1ZFUlNJT05fU1RSSU5HKTsKKwkJd2FybmVkID0gdHJ1ZTsKKwl9CisKKyNpZiBMVVNUUkVfVkVSU0lPTl9DT0RFIDwgT0JEX09DRF9WRVJTSU9OKDMsIDAsIDUzLCAwKQorCS8qCisJICogQ2hlY2sgaWYgc2VydmVyIGhhcyBMVS0xMjUyIGZpeCBhcHBsaWVkIHRvIG5vdCBhbHdheXMgc3dhYgorCSAqIHRoZSBJUiBNTkUgZW50cmllcy4gRG8gdGhpcyBvbmx5IG9uY2UgcGVyIGNvbm5lY3Rpb24uICBUaGlzCisJICogZml4dXAgaXMgdmVyc2lvbi1saW1pdGVkLCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gY2FycnkgdGhlCisJICogT0JEX0NPTk5FQ1RfTU5FX1NXQUIgZmxhZyBhcm91bmQgZm9yZXZlciwganVzdCBzbyBsb25nIGFzIHdlCisJICogbmVlZCBpbnRlcm9wIHdpdGggdW5wYXRjaGVkIDIuMiBzZXJ2ZXJzLiAgRm9yIG5ld2VyIHNlcnZlcnMsCisJICogdGhlIGNsaWVudCB3aWxsIGRvIE1ORSBzd2FiYmluZyBvbmx5IGFzIG5lZWRlZC4gIExVLTE2NDQKKwkgKi8KKwlpZiAodW5saWtlbHkoKG9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3MgJiBPQkRfQ09OTkVDVF9WRVJTSU9OKSAmJgorCQkgICAgICEob2NkLT5vY2RfY29ubmVjdF9mbGFncyAmIE9CRF9DT05ORUNUX01ORV9TV0FCKSAmJgorCQkgICAgIE9CRF9PQ0RfVkVSU0lPTl9NQUpPUihvY2QtPm9jZF92ZXJzaW9uKSA9PSAyICYmCisJCSAgICAgT0JEX09DRF9WRVJTSU9OX01JTk9SKG9jZC0+b2NkX3ZlcnNpb24pID09IDIgJiYKKwkJICAgICBPQkRfT0NEX1ZFUlNJT05fUEFUQ0gob2NkLT5vY2RfdmVyc2lvbikgPCA1NSAmJgorCQkgICAgICFzdHJjbXAoaW1wLT5pbXBfb2JkLT5vYmRfdHlwZS0+dHlwX25hbWUsCisJCQkgICAgIExVU1RSRV9NR0NfTkFNRSkpKQorCQlpbXAtPmltcF9uZWVkX21uZV9zd2FiID0gMTsKKwllbHNlIC8qIGNsZWFyIGlmIHNlcnZlciB3YXMgdXBncmFkZWQgc2luY2UgbGFzdCBjb25uZWN0ICovCisJCWltcC0+aW1wX25lZWRfbW5lX3N3YWIgPSAwOworI2VuZGlmCisKKwlpZiAob2NkLT5vY2RfY29ubmVjdF9mbGFncyAmIE9CRF9DT05ORUNUX0NLU1VNKSB7CisJCS8qCisJCSAqIFdlIHNlbnQgdG8gdGhlIHNlcnZlciBvY2RfY2tzdW1fdHlwZXMgd2l0aCBiaXRzIHNldAorCQkgKiBmb3IgYWxnb3JpdGhtcyB3ZSB1bmRlcnN0YW5kLiBUaGUgc2VydmVyIG1hc2tlZCBvZmYKKwkJICogdGhlIGNoZWNrc3VtIHR5cGVzIGl0IGRvZXNuJ3Qgc3VwcG9ydAorCQkgKi8KKwkJaWYgKCEob2NkLT5vY2RfY2tzdW1fdHlwZXMgJiBja3N1bV90eXBlc19zdXBwb3J0ZWRfY2xpZW50KCkpKSB7CisJCQlMQ09OU09MRV9XQVJOKCJUaGUgbmVnb3RpYXRpb24gb2YgdGhlIGNoZWNrc3VtIGFsZ29yaXRobSB0byB1c2Ugd2l0aCBzZXJ2ZXIgJXMgZmFpbGVkICgleC8leCksIGRpc2FibGluZyBjaGVja3N1bXNcbiIsCisJCQkJICAgICAgb2JkMmNsaV90Z3QoaW1wLT5pbXBfb2JkKSwKKwkJCQkgICAgICBvY2QtPm9jZF9ja3N1bV90eXBlcywKKwkJCQkgICAgICBja3N1bV90eXBlc19zdXBwb3J0ZWRfY2xpZW50KCkpOworCQkJY2xpLT5jbF9jaGVja3N1bSA9IDA7CisJCQljbGktPmNsX3N1cHBfY2tzdW1fdHlwZXMgPSBPQkRfQ0tTVU1fQURMRVI7CisJCX0gZWxzZSB7CisJCQljbGktPmNsX3N1cHBfY2tzdW1fdHlwZXMgPSBvY2QtPm9jZF9ja3N1bV90eXBlczsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIFRoZSBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBPQkRfQ09OTkVDVF9DS1NVTS4KKwkJICogRW5mb3JjZSBBRExFUiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorCQkgKi8KKwkJY2xpLT5jbF9zdXBwX2Nrc3VtX3R5cGVzID0gT0JEX0NLU1VNX0FETEVSOworCX0KKwljbGktPmNsX2Nrc3VtX3R5cGUgPSBja3N1bV90eXBlX3NlbGVjdChjbGktPmNsX3N1cHBfY2tzdW1fdHlwZXMpOworCisJaWYgKG9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3MgJiBPQkRfQ09OTkVDVF9CUldfU0laRSkKKwkJY2xpLT5jbF9tYXhfcGFnZXNfcGVyX3JwYyA9CisJCQltaW4ob2NkLT5vY2RfYnJ3X3NpemUgPj4gUEFHRV9TSElGVCwKKwkJCSAgICBjbGktPmNsX21heF9wYWdlc19wZXJfcnBjKTsKKwllbHNlIGlmIChpbXAtPmltcF9jb25uZWN0X29wID09IE1EU19DT05ORUNUIHx8CisJCSBpbXAtPmltcF9jb25uZWN0X29wID09IE1HU19DT05ORUNUKQorCQljbGktPmNsX21heF9wYWdlc19wZXJfcnBjID0gMTsKKworCUxBU1NFUlQoKGNsaS0+Y2xfbWF4X3BhZ2VzX3Blcl9ycGMgPD0gUFRMUlBDX01BWF9CUldfUEFHRVMpICYmCisJCShjbGktPmNsX21heF9wYWdlc19wZXJfcnBjID4gMCkpOworCisJY2xpZW50X2FkanVzdF9tYXhfZGlydHkoY2xpKTsKKworCS8qCisJICogUmVzZXQgbnNfY29ubmVjdF9mbGFncyBvbmx5IGZvciBpbml0aWFsIGNvbm5lY3QuIEl0IG1pZ2h0IGJlCisJICogY2hhbmdlZCBpbiB3aGlsZSB1c2luZyBGUyBhbmQgaWYgd2UgcmVzZXQgaXQgaW4gcmVjb25uZWN0CisJICogdGhpcyBsZWFkcyB0byBsb3NpbmcgdXNlciBzZXR0aW5ncyBkb25lIGJlZm9yZSBzdWNoIGFzCisJICogZGlzYWJsZSBscnVfcmVzaXplLCBldGMuCisJICovCisJaWYgKG9sZF9jb25uZWN0X2ZsYWdzICE9IGV4cF9jb25uZWN0X2ZsYWdzKGV4cCkgfHwgaW5pdF9jb25uZWN0KSB7CisJCUNERUJVRyhEX0hBLCAiJXM6IFJlc2V0dGluZyBuc19jb25uZWN0X2ZsYWdzIHRvIHNlcnZlciBmbGFnczogJSNsbHhcbiIsCisJCSAgICAgICBpbXAtPmltcF9vYmQtPm9iZF9uYW1lLCBvY2QtPm9jZF9jb25uZWN0X2ZsYWdzKTsKKwkJaW1wLT5pbXBfb2JkLT5vYmRfbmFtZXNwYWNlLT5uc19jb25uZWN0X2ZsYWdzID0KKwkJCW9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3M7CisJCWltcC0+aW1wX29iZC0+b2JkX25hbWVzcGFjZS0+bnNfb3JpZ19jb25uZWN0X2ZsYWdzID0KKwkJCW9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3M7CisJfQorCisJaWYgKChvY2QtPm9jZF9jb25uZWN0X2ZsYWdzICYgT0JEX0NPTk5FQ1RfQVQpICYmCisJICAgIChpbXAtPmltcF9tc2dfbWFnaWMgPT0gTFVTVFJFX01TR19NQUdJQ19WMikpCisJCS8qCisJCSAqIFdlIG5lZWQgYSBwZXItbWVzc2FnZSBzdXBwb3J0IGZsYWcsIGJlY2F1c2UKKwkJICogYS4gd2UgZG9uJ3Qga25vdyBpZiB0aGUgaW5jb21pbmcgY29ubmVjdCByZXBseQorCQkgKiAgICBzdXBwb3J0cyBBVCBvciBub3QgKGluIHJlcGx5X2luX2NhbGxiYWNrKQorCQkgKiAgICB1bnRpbCB3ZSB1bnBhY2sgaXQuCisJCSAqIGIuIGZhaWxvdmVyZWQgc2VydmVyIG1lYW5zIGV4cG9ydCBhbmQgZmxhZ3MgYXJlIGdvbmUKKwkJICogICAgKGluIHB0bHJwY19zZW5kX3JlcGx5KS4KKwkJICogICAgQ2FuIG9ubHkgYmUgc2V0IHdoZW4gd2Uga25vdyBBVCBpcyBzdXBwb3J0ZWQgYXQKKwkJICogICAgYm90aCBlbmRzCisJCSAqLworCQlpbXAtPmltcF9tc2doZHJfZmxhZ3MgfD0gTVNHSERSX0FUX1NVUFBPUlQ7CisJZWxzZQorCQlpbXAtPmltcF9tc2doZHJfZmxhZ3MgJj0gfk1TR0hEUl9BVF9TVVBQT1JUOworCisJaWYgKChvY2QtPm9jZF9jb25uZWN0X2ZsYWdzICYgT0JEX0NPTk5FQ1RfRlVMTDIwKSAmJgorCSAgICAoaW1wLT5pbXBfbXNnX21hZ2ljID09IExVU1RSRV9NU0dfTUFHSUNfVjIpKQorCQlpbXAtPmltcF9tc2doZHJfZmxhZ3MgfD0gTVNHSERSX0NLU1VNX0lOQ09NUEFUMTg7CisJZWxzZQorCQlpbXAtPmltcF9tc2doZHJfZmxhZ3MgJj0gfk1TR0hEUl9DS1NVTV9JTkNPTVBBVDE4OworCisJcmV0dXJuIDA7Cit9CisKIC8qKgogICogaW50ZXJwcmV0X3JlcGx5IGNhbGxiYWNrIGZvciBjb25uZWN0IFJQQ3MuCiAgKiBMb29rcyBpbnRvIHJldHVybmVkIHN0YXR1cyBvZiBjb25uZWN0IG9wZXJhdGlvbiBhbmQgZGVjaWRlcwpAQCAtNzYyLDcgKzkxMCw2IEBACiB7CiAJc3RydWN0IHB0bHJwY19jb25uZWN0X2FzeW5jX2FyZ3MgKmFhID0gZGF0YTsKIAlzdHJ1Y3Qgb2JkX2ltcG9ydCAqaW1wID0gcmVxdWVzdC0+cnFfaW1wb3J0OwotCXN0cnVjdCBjbGllbnRfb2JkICpjbGkgPSAmaW1wLT5pbXBfb2JkLT51LmNsaTsKIAlzdHJ1Y3QgbHVzdHJlX2hhbmRsZSBvbGRfaGRsOwogCV9fdTY0IG9sZF9jb25uZWN0X2ZsYWdzOwogCWludCBtc2dfZmxhZ3M7CkBAIC04NDIsNyArOTg5LDIxIEBACiAJb2xkX2Nvbm5lY3RfZmxhZ3MgPSBleHBfY29ubmVjdF9mbGFncyhleHApOwogCWV4cC0+ZXhwX2Nvbm5lY3RfZGF0YSA9ICpvY2Q7CiAJaW1wLT5pbXBfb2JkLT5vYmRfc2VsZl9leHBvcnQtPmV4cF9jb25uZWN0X2RhdGEgPSAqb2NkOworCisJLyoKKwkgKiBUaGUgbmV0IHN0YXRpc3RpY3MgYWZ0ZXIgKHJlLSljb25uZWN0IGlzIG5vdCB2YWxpZCBhbnltb3JlLAorCSAqIGJlY2F1c2UgbWF5IHJlZmxlY3Qgb3RoZXIgcm91dGluZywgZXRjLgorCSAqLworCWF0X2luaXQoJmltcC0+aW1wX2F0LmlhdF9uZXRfbGF0ZW5jeSwgMCwgMCk7CisJcHRscnBjX2F0X2Fkal9uZXRfbGF0ZW5jeShyZXF1ZXN0LAorCQkJCSAgbHVzdHJlX21zZ19nZXRfc2VydmljZV90aW1lKHJlcXVlc3QtPnJxX3JlcG1zZykpOworCisJLyogSW1wb3J0IGZsYWdzIHNob3VsZCBiZSB1cGRhdGVkIGJlZm9yZSB3YWtpbmcgaW1wb3J0IGF0IEZVTEwgc3RhdGUgKi8KKwlyYyA9IHB0bHJwY19jb25uZWN0X3NldF9mbGFncyhpbXAsIG9jZCwgb2xkX2Nvbm5lY3RfZmxhZ3MsIGV4cCwKKwkJCQkgICAgICBhYS0+cGNhYV9pbml0aWFsX2Nvbm5lY3QpOwogCWNsYXNzX2V4cG9ydF9wdXQoZXhwKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OwogCiAJb2JkX2ltcG9ydF9ldmVudChpbXAtPmltcF9vYmQsIGltcCwgSU1QX0VWRU5UX09DRCk7CiAKQEAgLTk4NywxNTEgKzExNDgsMTMgQEAKIAogZmluaXNoOgogCXJjID0gcHRscnBjX2ltcG9ydF9yZWNvdmVyeV9zdGF0ZV9tYWNoaW5lKGltcCk7Ci0JaWYgKHJjICE9IDApIHsKLQkJaWYgKHJjID09IC1FTk9UQ09OTikgewotCQkJQ0RFQlVHKERfSEEsICJldmljdGVkL2Fib3J0ZWQgYnkgJXNAJXMgZHVyaW5nIHJlY292ZXJ5OyBpbnZhbGlkYXRpbmcgYW5kIHJlY29ubmVjdGluZ1xuIiwKLQkJCSAgICAgICBvYmQyY2xpX3RndChpbXAtPmltcF9vYmQpLAotCQkJICAgICAgIGltcC0+aW1wX2Nvbm5lY3Rpb24tPmNfcmVtb3RlX3V1aWQudXVpZCk7Ci0JCQlwdGxycGNfY29ubmVjdF9pbXBvcnQoaW1wKTsKLQkJCWltcC0+aW1wX2Nvbm5lY3RfdHJpZWQgPSAxOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9IGVsc2UgewotCQlzdGF0aWMgYm9vbCB3YXJuZWQ7Ci0KLQkJc3Bpbl9sb2NrKCZpbXAtPmltcF9sb2NrKTsKLQkJbGlzdF9kZWwoJmltcC0+aW1wX2Nvbm5fY3VycmVudC0+b2ljX2l0ZW0pOwotCQlsaXN0X2FkZCgmaW1wLT5pbXBfY29ubl9jdXJyZW50LT5vaWNfaXRlbSwgJmltcC0+aW1wX2Nvbm5fbGlzdCk7Ci0JCWltcC0+aW1wX2xhc3Rfc3VjY2Vzc19jb25uID0KLQkJCWltcC0+aW1wX2Nvbm5fY3VycmVudC0+b2ljX2xhc3RfYXR0ZW1wdDsKLQotCQlzcGluX3VubG9jaygmaW1wLT5pbXBfbG9jayk7Ci0KLQkJaWYgKChpbXAtPmltcF9jb25uZWN0X2ZsYWdzX29yaWcgJiBPQkRfQ09OTkVDVF9JQklUUykgJiYKLQkJICAgICEob2NkLT5vY2RfY29ubmVjdF9mbGFncyAmIE9CRF9DT05ORUNUX0lCSVRTKSkgewotCQkJTENPTlNPTEVfV0FSTigiJXM6IE1EUyAlcyBkb2VzIG5vdCBzdXBwb3J0IGliaXRzIGxvY2ssIGVpdGhlciB2ZXJ5IG9sZCBvciBpbnZhbGlkOiByZXF1ZXN0ZWQgJWxseCwgcmVwbGllZCAlbGx4XG4iLAotCQkJCSAgICAgIGltcC0+aW1wX29iZC0+b2JkX25hbWUsCi0JCQkJICAgICAgaW1wLT5pbXBfY29ubmVjdGlvbi0+Y19yZW1vdGVfdXVpZC51dWlkLAotCQkJCSAgICAgIGltcC0+aW1wX2Nvbm5lY3RfZmxhZ3Nfb3JpZywKLQkJCQkgICAgICBvY2QtPm9jZF9jb25uZWN0X2ZsYWdzKTsKLQkJCXJjID0gLUVQUk9UTzsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJaWYgKCF3YXJuZWQgJiYgKG9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3MgJiBPQkRfQ09OTkVDVF9WRVJTSU9OKSAmJgotCQkgICAgKG9jZC0+b2NkX3ZlcnNpb24gPiBMVVNUUkVfVkVSU0lPTl9DT0RFICsKLQkJCQkJTFVTVFJFX1ZFUlNJT05fT0ZGU0VUX1dBUk4gfHwKLQkJICAgICBvY2QtPm9jZF92ZXJzaW9uIDwgTFVTVFJFX1ZFUlNJT05fQ09ERSAtCi0JCQkJCUxVU1RSRV9WRVJTSU9OX09GRlNFVF9XQVJOKSkgewotCQkJLyogU2lnaCwgc29tZSBjb21waWxlcnMgZG8gbm90IGxpa2UgI2lmZGVmIGluIHRoZSBtaWRkbGUKLQkJCSAqIG9mIG1hY3JvIGFyZ3VtZW50cwotCQkJICovCi0JCQljb25zdCBjaGFyICpvbGRlciA9ICJvbGRlciB0aGFuIGNsaWVudC4gQ29uc2lkZXIgdXBncmFkaW5nIHNlcnZlciI7Ci0JCQljb25zdCBjaGFyICpuZXdlciA9ICJuZXdlciB0aGFuIGNsaWVudC4gQ29uc2lkZXIgcmVjb21waWxpbmcgYXBwbGljYXRpb24iOwotCi0JCQlMQ09OU09MRV9XQVJOKCJTZXJ2ZXIgJXMgdmVyc2lvbiAoJWQuJWQuJWQuJWQpIGlzIG11Y2ggJXMgKCVzKVxuIiwKLQkJCQkgICAgICBvYmQyY2xpX3RndChpbXAtPmltcF9vYmQpLAotCQkJCSAgICAgIE9CRF9PQ0RfVkVSU0lPTl9NQUpPUihvY2QtPm9jZF92ZXJzaW9uKSwKLQkJCQkgICAgICBPQkRfT0NEX1ZFUlNJT05fTUlOT1Iob2NkLT5vY2RfdmVyc2lvbiksCi0JCQkJICAgICAgT0JEX09DRF9WRVJTSU9OX1BBVENIKG9jZC0+b2NkX3ZlcnNpb24pLAotCQkJCSAgICAgIE9CRF9PQ0RfVkVSU0lPTl9GSVgob2NkLT5vY2RfdmVyc2lvbiksCi0JCQkJICAgICAgb2NkLT5vY2RfdmVyc2lvbiA+IExVU1RSRV9WRVJTSU9OX0NPREUgPwotCQkJCSAgICAgIG5ld2VyIDogb2xkZXIsIExVU1RSRV9WRVJTSU9OX1NUUklORyk7Ci0JCQl3YXJuZWQgPSB0cnVlOwotCQl9Ci0KLSNpZiBMVVNUUkVfVkVSU0lPTl9DT0RFIDwgT0JEX09DRF9WRVJTSU9OKDMsIDIsIDUwLCAwKQotCQkvKiBDaGVjayBpZiBzZXJ2ZXIgaGFzIExVLTEyNTIgZml4IGFwcGxpZWQgdG8gbm90IGFsd2F5cyBzd2FiCi0JCSAqIHRoZSBJUiBNTkUgZW50cmllcy4gRG8gdGhpcyBvbmx5IG9uY2UgcGVyIGNvbm5lY3Rpb24uICBUaGlzCi0JCSAqIGZpeHVwIGlzIHZlcnNpb24tbGltaXRlZCwgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGNhcnJ5IHRoZQotCQkgKiBPQkRfQ09OTkVDVF9NTkVfU1dBQiBmbGFnIGFyb3VuZCBmb3JldmVyLCBqdXN0IHNvIGxvbmcgYXMgd2UKLQkJICogbmVlZCBpbnRlcm9wIHdpdGggdW5wYXRjaGVkIDIuMiBzZXJ2ZXJzLiAgRm9yIG5ld2VyIHNlcnZlcnMsCi0JCSAqIHRoZSBjbGllbnQgd2lsbCBkbyBNTkUgc3dhYmJpbmcgb25seSBhcyBuZWVkZWQuICBMVS0xNjQ0Ci0JCSAqLwotCQlpZiAodW5saWtlbHkoKG9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3MgJiBPQkRfQ09OTkVDVF9WRVJTSU9OKSAmJgotCQkJICAgICAhKG9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3MgJiBPQkRfQ09OTkVDVF9NTkVfU1dBQikgJiYKLQkJCSAgICAgT0JEX09DRF9WRVJTSU9OX01BSk9SKG9jZC0+b2NkX3ZlcnNpb24pID09IDIgJiYKLQkJCSAgICAgT0JEX09DRF9WRVJTSU9OX01JTk9SKG9jZC0+b2NkX3ZlcnNpb24pID09IDIgJiYKLQkJCSAgICAgT0JEX09DRF9WRVJTSU9OX1BBVENIKG9jZC0+b2NkX3ZlcnNpb24pIDwgNTUgJiYKLQkJCSAgICAgc3RyY21wKGltcC0+aW1wX29iZC0+b2JkX3R5cGUtPnR5cF9uYW1lLAotCQkJCSAgICBMVVNUUkVfTUdDX05BTUUpID09IDApKQotCQkJaW1wLT5pbXBfbmVlZF9tbmVfc3dhYiA9IDE7Ci0JCWVsc2UgLyogY2xlYXIgaWYgc2VydmVyIHdhcyB1cGdyYWRlZCBzaW5jZSBsYXN0IGNvbm5lY3QgKi8KLQkJCWltcC0+aW1wX25lZWRfbW5lX3N3YWIgPSAwOwotI2Vsc2UKLSN3YXJuaW5nICJMVS0xNjQ0OiBSZW1vdmUgb2xkIE9CRF9DT05ORUNUX01ORV9TV0FCIGZpeHVwIGFuZCBpbXBfbmVlZF9tbmVfc3dhYiIKLSNlbmRpZgotCi0JCWlmIChvY2QtPm9jZF9jb25uZWN0X2ZsYWdzICYgT0JEX0NPTk5FQ1RfQ0tTVU0pIHsKLQkJCS8qIFdlIHNlbnQgdG8gdGhlIHNlcnZlciBvY2RfY2tzdW1fdHlwZXMgd2l0aCBiaXRzIHNldAotCQkJICogZm9yIGFsZ29yaXRobXMgd2UgdW5kZXJzdGFuZC4gVGhlIHNlcnZlciBtYXNrZWQgb2ZmCi0JCQkgKiB0aGUgY2hlY2tzdW0gdHlwZXMgaXQgZG9lc24ndCBzdXBwb3J0Ci0JCQkgKi8KLQkJCWlmICgob2NkLT5vY2RfY2tzdW1fdHlwZXMgJgotCQkJICAgICBja3N1bV90eXBlc19zdXBwb3J0ZWRfY2xpZW50KCkpID09IDApIHsKLQkJCQlMQ09OU09MRV9XQVJOKCJUaGUgbmVnb3RpYXRpb24gb2YgdGhlIGNoZWNrc3VtIGFsZ29yaXRobSB0byB1c2Ugd2l0aCBzZXJ2ZXIgJXMgZmFpbGVkICgleC8leCksIGRpc2FibGluZyBjaGVja3N1bXNcbiIsCi0JCQkJCSAgICAgIG9iZDJjbGlfdGd0KGltcC0+aW1wX29iZCksCi0JCQkJCSAgICAgIG9jZC0+b2NkX2Nrc3VtX3R5cGVzLAotCQkJCQkgICAgICBja3N1bV90eXBlc19zdXBwb3J0ZWRfY2xpZW50KCkpOwotCQkJCWNsaS0+Y2xfY2hlY2tzdW0gPSAwOwotCQkJCWNsaS0+Y2xfc3VwcF9ja3N1bV90eXBlcyA9IE9CRF9DS1NVTV9BRExFUjsKLQkJCX0gZWxzZSB7Ci0JCQkJY2xpLT5jbF9zdXBwX2Nrc3VtX3R5cGVzID0gb2NkLT5vY2RfY2tzdW1fdHlwZXM7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKiBUaGUgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgT0JEX0NPTk5FQ1RfQ0tTVU0uCi0JCQkgKiBFbmZvcmNlIEFETEVSIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0JCQkgKi8KLQkJCWNsaS0+Y2xfc3VwcF9ja3N1bV90eXBlcyA9IE9CRF9DS1NVTV9BRExFUjsKLQkJfQotCQljbGktPmNsX2Nrc3VtX3R5cGUgPSBja3N1bV90eXBlX3NlbGVjdChjbGktPmNsX3N1cHBfY2tzdW1fdHlwZXMpOwotCi0JCWlmIChvY2QtPm9jZF9jb25uZWN0X2ZsYWdzICYgT0JEX0NPTk5FQ1RfQlJXX1NJWkUpCi0JCQljbGktPmNsX21heF9wYWdlc19wZXJfcnBjID0KLQkJCQltaW4ob2NkLT5vY2RfYnJ3X3NpemUgPj4gUEFHRV9TSElGVCwKLQkJCQkgICAgY2xpLT5jbF9tYXhfcGFnZXNfcGVyX3JwYyk7Ci0JCWVsc2UgaWYgKGltcC0+aW1wX2Nvbm5lY3Rfb3AgPT0gTURTX0NPTk5FQ1QgfHwKLQkJCSBpbXAtPmltcF9jb25uZWN0X29wID09IE1HU19DT05ORUNUKQotCQkJY2xpLT5jbF9tYXhfcGFnZXNfcGVyX3JwYyA9IDE7Ci0KLQkJLyogUmVzZXQgbnNfY29ubmVjdF9mbGFncyBvbmx5IGZvciBpbml0aWFsIGNvbm5lY3QuIEl0IG1pZ2h0IGJlCi0JCSAqIGNoYW5nZWQgaW4gd2hpbGUgdXNpbmcgRlMgYW5kIGlmIHdlIHJlc2V0IGl0IGluIHJlY29ubmVjdAotCQkgKiB0aGlzIGxlYWRzIHRvIGxvc2luZyB1c2VyIHNldHRpbmdzIGRvbmUgYmVmb3JlIHN1Y2ggYXMKLQkJICogZGlzYWJsZSBscnVfcmVzaXplLCBldGMuCi0JCSAqLwotCQlpZiAob2xkX2Nvbm5lY3RfZmxhZ3MgIT0gZXhwX2Nvbm5lY3RfZmxhZ3MoZXhwKSB8fAotCQkgICAgYWEtPnBjYWFfaW5pdGlhbF9jb25uZWN0KSB7Ci0JCQlDREVCVUcoRF9IQSwgIiVzOiBSZXNldHRpbmcgbnNfY29ubmVjdF9mbGFncyB0byBzZXJ2ZXIgZmxhZ3M6ICUjbGx4XG4iLAotCQkJICAgICAgIGltcC0+aW1wX29iZC0+b2JkX25hbWUsIG9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3MpOwotCQkJaW1wLT5pbXBfb2JkLT5vYmRfbmFtZXNwYWNlLT5uc19jb25uZWN0X2ZsYWdzID0KLQkJCQlvY2QtPm9jZF9jb25uZWN0X2ZsYWdzOwotCQkJaW1wLT5pbXBfb2JkLT5vYmRfbmFtZXNwYWNlLT5uc19vcmlnX2Nvbm5lY3RfZmxhZ3MgPQotCQkJCW9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3M7Ci0JCX0KLQotCQlpZiAoKG9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3MgJiBPQkRfQ09OTkVDVF9BVCkgJiYKLQkJICAgIChpbXAtPmltcF9tc2dfbWFnaWMgPT0gTFVTVFJFX01TR19NQUdJQ19WMikpCi0JCQkvKiBXZSBuZWVkIGEgcGVyLW1lc3NhZ2Ugc3VwcG9ydCBmbGFnLCBiZWNhdXNlCi0JCQkgKiBhLiB3ZSBkb24ndCBrbm93IGlmIHRoZSBpbmNvbWluZyBjb25uZWN0IHJlcGx5Ci0JCQkgKiAgICBzdXBwb3J0cyBBVCBvciBub3QgKGluIHJlcGx5X2luX2NhbGxiYWNrKQotCQkJICogICAgdW50aWwgd2UgdW5wYWNrIGl0LgotCQkJICogYi4gZmFpbG92ZXJlZCBzZXJ2ZXIgbWVhbnMgZXhwb3J0IGFuZCBmbGFncyBhcmUgZ29uZQotCQkJICogICAgKGluIHB0bHJwY19zZW5kX3JlcGx5KS4KLQkJCSAqIENhbiBvbmx5IGJlIHNldCB3aGVuIHdlIGtub3cgQVQgaXMgc3VwcG9ydGVkIGF0Ci0JCQkgKiBib3RoIGVuZHMKLQkJCSAqLwotCQkJaW1wLT5pbXBfbXNnaGRyX2ZsYWdzIHw9IE1TR0hEUl9BVF9TVVBQT1JUOwotCQllbHNlCi0JCQlpbXAtPmltcF9tc2doZHJfZmxhZ3MgJj0gfk1TR0hEUl9BVF9TVVBQT1JUOwotCi0JCWlmICgob2NkLT5vY2RfY29ubmVjdF9mbGFncyAmIE9CRF9DT05ORUNUX0ZVTEwyMCkgJiYKLQkJICAgIChpbXAtPmltcF9tc2dfbWFnaWMgPT0gTFVTVFJFX01TR19NQUdJQ19WMikpCi0JCQlpbXAtPmltcF9tc2doZHJfZmxhZ3MgfD0gTVNHSERSX0NLU1VNX0lOQ09NUEFUMTg7Ci0JCWVsc2UKLQkJCWltcC0+aW1wX21zZ2hkcl9mbGFncyAmPSB+TVNHSERSX0NLU1VNX0lOQ09NUEFUMTg7Ci0KLQkJTEFTU0VSVCgoY2xpLT5jbF9tYXhfcGFnZXNfcGVyX3JwYyA8PSBQVExSUENfTUFYX0JSV19QQUdFUykgJiYKLQkJCShjbGktPmNsX21heF9wYWdlc19wZXJfcnBjID4gMCkpOworCWlmIChyYyA9PSAtRU5PVENPTk4pIHsKKwkJQ0RFQlVHKERfSEEsICJldmljdGVkL2Fib3J0ZWQgYnkgJXNAJXMgZHVyaW5nIHJlY292ZXJ5OyBpbnZhbGlkYXRpbmcgYW5kIHJlY29ubmVjdGluZ1xuIiwKKwkJICAgICAgIG9iZDJjbGlfdGd0KGltcC0+aW1wX29iZCksCisJCSAgICAgICBpbXAtPmltcF9jb25uZWN0aW9uLT5jX3JlbW90ZV91dWlkLnV1aWQpOworCQlwdGxycGNfY29ubmVjdF9pbXBvcnQoaW1wKTsKKwkJaW1wLT5pbXBfY29ubmVjdF90cmllZCA9IDE7CisJCXJldHVybiAwOwogCX0KIAogb3V0OgpAQCAtMTQ5NywxMCArMTUyMCwxMyBAQAogLyogQWRhcHRpdmUgVGltZW91dCB1dGlscyAqLwogZXh0ZXJuIHVuc2lnbmVkIGludCBhdF9taW4sIGF0X21heCwgYXRfaGlzdG9yeTsKIAotLyogQmluIGludG8gdGltZXNsaWNlcyB1c2luZyBBVF9CSU5TIGJpbnMuCi0gKiBUaGlzIGdpdmVzIHVzIGEgbWF4IG9mIHRoZSBsYXN0IGJpbmxpbWl0KkFUX0JJTlMgc2VjcyB3aXRob3V0IHRoZSBzdG9yYWdlLAotICogYnV0IHN0aWxsIHNtb290aGluZyBvdXQgYSByZXR1cm4gdG8gbm9ybWFsY3kgZnJvbSBhIHNsb3cgcmVzcG9uc2UuCi0gKiAoRS5nLiByZW1lbWJlciB0aGUgbWF4aW11bSBsYXRlbmN5IGluIGVhY2ggbWludXRlIG9mIHRoZSBsYXN0IDQgbWludXRlcy4pCisvKgorICpVcGRhdGUgYXRfY3VycmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUgKGJvdW5kZWQgYnkgYXRfbWluIGFuZCBhdF9tYXgpLAorICogYXMgd2VsbCBhcyB0aGUgQVQgaGlzdG9yeSAiYmlucyIuCisgKiAgLSBCaW4gaW50byB0aW1lc2xpY2VzIHVzaW5nIEFUX0JJTlMgYmlucy4KKyAqICAtIFRoaXMgZ2l2ZXMgdXMgYSBtYXggb2YgdGhlIGxhc3QgYXRfaGlzdG9yeSBzZWNvbmRzIHdpdGhvdXQgdGhlIHN0b3JhZ2UsCisgKiAgICBidXQgc3RpbGwgc21vb3RoaW5nIG91dCBhIHJldHVybiB0byBub3JtYWxjeSBmcm9tIGEgc2xvdyByZXNwb25zZS4KKyAqICAtIChFLmcuIHJlbWVtYmVyIHRoZSBtYXhpbXVtIGxhdGVuY3kgaW4gZWFjaCBtaW51dGUgb2YgdGhlIGxhc3QgNCBtaW51dGVzLikKICAqLwogaW50IGF0X21lYXN1cmVkKHN0cnVjdCBhZGFwdGl2ZV90aW1lb3V0ICphdCwgdW5zaWduZWQgaW50IHZhbCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9sYXlvdXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9sYXlvdXQuYwppbmRleCBhYjVkODUxLi44MzllZjNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbGF5b3V0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2xheW91dC5jCkBAIC02NjcsMTEgKzY2Nyw4IEBACiAJJlJRRl9NRFNfU1lOQywKIAkmUlFGX01EU19DTE9TRSwKIAkmUlFGX01EU19SRUxFQVNFX0NMT1NFLAotCSZSUUZfTURTX1BJTiwKLQkmUlFGX01EU19VTlBJTiwKIAkmUlFGX01EU19SRUFEUEFHRSwKIAkmUlFGX01EU19XUklURVBBR0UsCi0JJlJRRl9NRFNfSVNfU1VCRElSLAogCSZSUUZfTURTX0RPTkVfV1JJVElORywKIAkmUlFGX01EU19SRUlOVCwKIAkmUlFGX01EU19SRUlOVF9DUkVBVEUsCkBAIC0xMTE2LDkgKzExMTMsOSBAQAogCiBzdHJ1Y3QgcmVxX2Zvcm1hdCB7CiAJY29uc3QgY2hhciAqcmZfbmFtZTsKLQlpbnQgcmZfaWR4OworCXNpemVfdCByZl9pZHg7CiAJc3RydWN0IHsKLQkJaW50IG5yOworCQlzaXplX3QgbnI7CiAJCWNvbnN0IHN0cnVjdCByZXFfbXNnX2ZpZWxkICoqZDsKIAl9IHJmX2ZpZWxkc1tSQ0xfTlJdOwogfTsKQEAgLTEzODksMTUgKzEzODYsNiBAQAogCQkJbWR0X3JlbGVhc2VfY2xvc2VfY2xpZW50LCBtZHNfbGFzdF91bmxpbmtfc2VydmVyKTsKIEVYUE9SVF9TWU1CT0woUlFGX01EU19SRUxFQVNFX0NMT1NFKTsKIAotc3RydWN0IHJlcV9mb3JtYXQgUlFGX01EU19QSU4gPQotCURFRklORV9SRVFfRk1UMCgiTURTX1BJTiIsCi0JCQltZHRfYm9keV9jYXBhLCBtZHRfYm9keV9vbmx5KTsKLUVYUE9SVF9TWU1CT0woUlFGX01EU19QSU4pOwotCi1zdHJ1Y3QgcmVxX2Zvcm1hdCBSUUZfTURTX1VOUElOID0KLQlERUZJTkVfUkVRX0ZNVDAoIk1EU19VTlBJTiIsIG1kdF9ib2R5X29ubHksIGVtcHR5KTsKLUVYUE9SVF9TWU1CT0woUlFGX01EU19VTlBJTik7Ci0KIHN0cnVjdCByZXFfZm9ybWF0IFJRRl9NRFNfRE9ORV9XUklUSU5HID0KIAlERUZJTkVfUkVRX0ZNVDAoIk1EU19ET05FX1dSSVRJTkciLAogCQkJbWR0X2Nsb3NlX2NsaWVudCwgbWR0X2JvZHlfb25seSk7CkBAIC0xNDQ4LDExICsxNDM2LDYgQEAKIAkJCW1kdF9ib2R5X2NhcGEsIG1kdF9ib2R5X29ubHkpOwogRVhQT1JUX1NZTUJPTChSUUZfTURTX1dSSVRFUEFHRSk7CiAKLXN0cnVjdCByZXFfZm9ybWF0IFJRRl9NRFNfSVNfU1VCRElSID0KLQlERUZJTkVfUkVRX0ZNVDAoIk1EU19JU19TVUJESVIiLAotCQkJbWR0X2JvZHlfb25seSwgbWR0X2JvZHlfb25seSk7Ci1FWFBPUlRfU1lNQk9MKFJRRl9NRFNfSVNfU1VCRElSKTsKLQogc3RydWN0IHJlcV9mb3JtYXQgUlFGX0xMT0dfT1JJR0lOX0hBTkRMRV9DUkVBVEUgPQogCURFRklORV9SRVFfRk1UMCgiTExPR19PUklHSU5fSEFORExFX0NSRUFURSIsCiAJCQlsbG9nX29yaWdpbl9oYW5kbGVfY3JlYXRlX2NsaWVudCwgbGxvZ2RfYm9keV9vbmx5KTsKQEAgLTE1NzIsOSArMTU1NSw5IEBACiAgKi8KIGludCByZXFfbGF5b3V0X2luaXQodm9pZCkKIHsKLQlpbnQgaTsKLQlpbnQgajsKLQlpbnQgazsKKwlzaXplX3QgaTsKKwlzaXplX3QgajsKKwlzaXplX3QgazsKIAlzdHJ1Y3QgcmVxX2Zvcm1hdCAqcmYgPSBOVUxMOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmVxX2Zvcm1hdHMpOyArK2kpIHsKQEAgLTE2MTYsNyArMTU5OSw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHJlcV9jYXBzdWxlX2luaXRfYXJlYShzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwpCiB7Ci0JaW50IGk7CisJc2l6ZV90IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwaWxsLT5yY19hcmVhW1JDTF9DTElFTlRdKTsgaSsrKSB7CiAJCXBpbGwtPnJjX2FyZWFbUkNMX0NMSUVOVF1baV0gPSAtMTsKQEAgLTE2NjcsOCArMTY1MCw3IEBACiAKIHN0YXRpYyBpbnQgX19yZXFfZm9ybWF0X2lzX3NhbmUoY29uc3Qgc3RydWN0IHJlcV9mb3JtYXQgKmZtdCkKIHsKLQlyZXR1cm4KLQkJMCA8PSBmbXQtPnJmX2lkeCAmJiBmbXQtPnJmX2lkeCA8IEFSUkFZX1NJWkUocmVxX2Zvcm1hdHMpICYmCisJcmV0dXJuIGZtdC0+cmZfaWR4IDwgQVJSQVlfU0laRShyZXFfZm9ybWF0cykgJiYKIAkJcmVxX2Zvcm1hdHNbZm10LT5yZl9pZHhdID09IGZtdDsKIH0KIApAQCAtMTcwMiwxMSArMTY4NCwxMSBAQAogICogdmFyaWFibGUtc2l6ZWQgZmllbGRzLiAgVGhlIGZpZWxkIHNpemVzIGNvbWUgZnJvbSB0aGUgZGVjbGFyZWQgXGEgcm1mX3NpemUKICAqIGZpZWxkIG9mIGEgXGEgcGlsbCdzIFxhIHJjX2ZtdCdzIFJNRidzLgogICovCi1pbnQgcmVxX2NhcHN1bGVfZmlsbGVkX3NpemVzKHN0cnVjdCByZXFfY2Fwc3VsZSAqcGlsbCwKLQkJCSAgICAgZW51bSByZXFfbG9jYXRpb24gbG9jKQorc2l6ZV90IHJlcV9jYXBzdWxlX2ZpbGxlZF9zaXplcyhzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwsCisJCQkJZW51bSByZXFfbG9jYXRpb24gbG9jKQogewogCWNvbnN0IHN0cnVjdCByZXFfZm9ybWF0ICpmbXQgPSBwaWxsLT5yY19mbXQ7Ci0JaW50IGk7CisJc2l6ZV90IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZm10LT5yZl9maWVsZHNbbG9jXS5ucjsgKytpKSB7CiAJCWlmIChwaWxsLT5yY19hcmVhW2xvY11baV0gPT0gLTEpIHsKQEAgLTE3NjEsMTEgKzE3NDMsMTEgQEAKICAqIFJldHVybnMgdGhlIFBUTFJQQyByZXF1ZXN0IG9yIHJlcGx5IChcYSBsb2MpIGJ1ZmZlciBvZmZzZXQgb2YgYSBcYSBwaWxsCiAgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBSTUYgKFxhIGZpZWxkKS4KICAqLwotc3RhdGljIGludCBfX3JlcV9jYXBzdWxlX29mZnNldChjb25zdCBzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwsCitzdGF0aWMgdTMyIF9fcmVxX2NhcHN1bGVfb2Zmc2V0KGNvbnN0IHN0cnVjdCByZXFfY2Fwc3VsZSAqcGlsbCwKIAkJCQljb25zdCBzdHJ1Y3QgcmVxX21zZ19maWVsZCAqZmllbGQsCiAJCQkJZW51bSByZXFfbG9jYXRpb24gbG9jKQogewotCWludCBvZmZzZXQ7CisJdTMyIG9mZnNldDsKIAogCW9mZnNldCA9IGZpZWxkLT5ybWZfb2Zmc2V0W3BpbGwtPnJjX2ZtdC0+cmZfaWR4XVtsb2NdOwogCUxBU1NFUlRGKG9mZnNldCA+IDAsICIlczolcywgb2ZmPSVkLCBsb2M9JWRcbiIsIHBpbGwtPnJjX2ZtdC0+cmZfbmFtZSwKQEAgLTE4NjksMTAgKzE4NTEsMTAgQEAKIAljb25zdCBzdHJ1Y3QgcmVxX2Zvcm1hdCAqZm10OwogCXN0cnVjdCBsdXN0cmVfbXNnICptc2c7CiAJdm9pZCAqdmFsdWU7Ci0JaW50IGxlbjsKLQlpbnQgb2Zmc2V0OworCXUzMiBsZW47CisJdTMyIG9mZnNldDsKIAotCXZvaWQgKigqZ2V0dGVyKShzdHJ1Y3QgbHVzdHJlX21zZyAqbSwgaW50IG4sIGludCBtaW5sZW4pOworCXZvaWQgKigqZ2V0dGVyKShzdHJ1Y3QgbHVzdHJlX21zZyAqbSwgdTMyIG4sIHUzMiBtaW5sZW4pOwogCiAJc3RhdGljIGNvbnN0IGNoYXIgKnJjbF9uYW1lc1tSQ0xfTlJdID0gewogCQlbUkNMX0NMSUVOVF0gPSAiY2xpZW50IiwKQEAgLTE4OTksMjAgKzE4ODEsMjAgQEAKIAkJICovCiAJCWxlbiA9IGx1c3RyZV9tc2dfYnVmbGVuKG1zZywgb2Zmc2V0KTsKIAkJaWYgKChsZW4gJSBmaWVsZC0+cm1mX3NpemUpICE9IDApIHsKLQkJCUNFUlJPUigiJXM6IGFycmF5IGZpZWxkIHNpemUgbWlzbWF0Y2ggJWQgbW9kdWxvICVkICE9IDAgKCVkKVxuIiwKKwkJCUNFUlJPUigiJXM6IGFycmF5IGZpZWxkIHNpemUgbWlzbWF0Y2ggJWQgbW9kdWxvICV1ICE9IDAgKCVkKVxuIiwKIAkJCSAgICAgICBmaWVsZC0+cm1mX25hbWUsIGxlbiwgZmllbGQtPnJtZl9zaXplLCBsb2MpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAl9IGVsc2UgaWYgKHBpbGwtPnJjX2FyZWFbbG9jXVtvZmZzZXRdICE9IC0xKSB7CiAJCWxlbiA9IHBpbGwtPnJjX2FyZWFbbG9jXVtvZmZzZXRdOwogCX0gZWxzZSB7Ci0JCWxlbiA9IG1heChmaWVsZC0+cm1mX3NpemUsIDApOworCQlsZW4gPSBtYXhfdCh0eXBlb2YoZmllbGQtPnJtZl9zaXplKSwgZmllbGQtPnJtZl9zaXplLCAwKTsKIAl9CiAJdmFsdWUgPSBnZXR0ZXIobXNnLCBvZmZzZXQsIGxlbik7CiAKIAlpZiAoIXZhbHVlKSB7CiAJCURFQlVHX1JFUShEX0VSUk9SLCBwaWxsLT5yY19yZXEsCi0JCQkgICJXcm9uZyBidWZmZXIgZm9yIGZpZWxkIGAlcycgKCVkIG9mICVkKSBpbiBmb3JtYXQgYCVzJzogJWQgdnMuICVkICglcylcbiIsCisJCQkgICJXcm9uZyBidWZmZXIgZm9yIGZpZWxkIGAlcycgKCV1IG9mICV1KSBpbiBmb3JtYXQgYCVzJzogJXUgdnMuICV1ICglcylcbiIsCiAJCQkgIGZpZWxkLT5ybWZfbmFtZSwgb2Zmc2V0LCBsdXN0cmVfbXNnX2J1ZmNvdW50KG1zZyksCiAJCQkgIGZtdC0+cmZfbmFtZSwgbHVzdHJlX21zZ19idWZsZW4obXNnLCBvZmZzZXQpLCBsZW4sCiAJCQkgIHJjbF9uYW1lc1tsb2NdKTsKQEAgLTE5NTgsNyArMTk0MCw3IEBACiAgKi8KIHZvaWQgKnJlcV9jYXBzdWxlX2NsaWVudF9zaXplZF9nZXQoc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLAogCQkJCSAgIGNvbnN0IHN0cnVjdCByZXFfbXNnX2ZpZWxkICpmaWVsZCwKLQkJCQkgICBpbnQgbGVuKQorCQkJCSAgIHUzMiBsZW4pCiB7CiAJcmVxX2NhcHN1bGVfc2V0X3NpemUocGlsbCwgZmllbGQsIFJDTF9DTElFTlQsIGxlbik7CiAJcmV0dXJuIF9fcmVxX2NhcHN1bGVfZ2V0KHBpbGwsIGZpZWxkLCBSQ0xfQ0xJRU5ULCBOVUxMLCAwKTsKQEAgLTE5OTksNyArMTk4MSw3IEBACiAgKi8KIHZvaWQgKnJlcV9jYXBzdWxlX3NlcnZlcl9zaXplZF9nZXQoc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLAogCQkJCSAgIGNvbnN0IHN0cnVjdCByZXFfbXNnX2ZpZWxkICpmaWVsZCwKLQkJCQkgICBpbnQgbGVuKQorCQkJCSAgIHUzMiBsZW4pCiB7CiAJcmVxX2NhcHN1bGVfc2V0X3NpemUocGlsbCwgZmllbGQsIFJDTF9TRVJWRVIsIGxlbik7CiAJcmV0dXJuIF9fcmVxX2NhcHN1bGVfZ2V0KHBpbGwsIGZpZWxkLCBSQ0xfU0VSVkVSLCBOVUxMLCAwKTsKQEAgLTIwMDgsNyArMTk5MCw3IEBACiAKIHZvaWQgKnJlcV9jYXBzdWxlX3NlcnZlcl9zaXplZF9zd2FiX2dldChzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwsCiAJCQkJCWNvbnN0IHN0cnVjdCByZXFfbXNnX2ZpZWxkICpmaWVsZCwKLQkJCQkJaW50IGxlbiwgdm9pZCAqc3dhYmJlcikKKwkJCQkJdTMyIGxlbiwgdm9pZCAqc3dhYmJlcikKIHsKIAlyZXFfY2Fwc3VsZV9zZXRfc2l6ZShwaWxsLCBmaWVsZCwgUkNMX1NFUlZFUiwgbGVuKTsKIAlyZXR1cm4gX19yZXFfY2Fwc3VsZV9nZXQocGlsbCwgZmllbGQsIFJDTF9TRVJWRVIsIHN3YWJiZXIsIDApOwpAQCAtMjAyNCwyMyArMjAwNiwyNSBAQAogICovCiB2b2lkIHJlcV9jYXBzdWxlX3NldF9zaXplKHN0cnVjdCByZXFfY2Fwc3VsZSAqcGlsbCwKIAkJCSAgY29uc3Qgc3RydWN0IHJlcV9tc2dfZmllbGQgKmZpZWxkLAotCQkJICBlbnVtIHJlcV9sb2NhdGlvbiBsb2MsIGludCBzaXplKQorCQkJICBlbnVtIHJlcV9sb2NhdGlvbiBsb2MsIHUzMiBzaXplKQogewogCUxBU1NFUlQobG9jID09IFJDTF9TRVJWRVIgfHwgbG9jID09IFJDTF9DTElFTlQpOwogCi0JaWYgKChzaXplICE9IGZpZWxkLT5ybWZfc2l6ZSkgJiYKKwlpZiAoKHNpemUgIT0gKHUzMilmaWVsZC0+cm1mX3NpemUpICYmCiAJICAgIChmaWVsZC0+cm1mX3NpemUgIT0gLTEpICYmCiAJICAgICEoZmllbGQtPnJtZl9mbGFncyAmIFJNRl9GX05PX1NJWkVfQ0hFQ0spICYmCiAJICAgIChzaXplID4gMCkpIHsKKwkJdTMyIHJtZl9zaXplID0gKHUzMilmaWVsZC0+cm1mX3NpemU7CisKIAkJaWYgKChmaWVsZC0+cm1mX2ZsYWdzICYgUk1GX0ZfU1RSVUNUX0FSUkFZKSAmJgotCQkgICAgKHNpemUgJSBmaWVsZC0+cm1mX3NpemUgIT0gMCkpIHsKLQkJCUNFUlJPUigiJXM6IGFycmF5IGZpZWxkIHNpemUgbWlzbWF0Y2ggJWQgJSUgJWQgIT0gMCAoJWQpXG4iLAotCQkJICAgICAgIGZpZWxkLT5ybWZfbmFtZSwgc2l6ZSwgZmllbGQtPnJtZl9zaXplLCBsb2MpOworCQkgICAgKHNpemUgJSBybWZfc2l6ZSAhPSAwKSkgeworCQkJQ0VSUk9SKCIlczogYXJyYXkgZmllbGQgc2l6ZSBtaXNtYXRjaCAldSAlJSAldSAhPSAwICglZClcbiIsCisJCQkgICAgICAgZmllbGQtPnJtZl9uYW1lLCBzaXplLCBybWZfc2l6ZSwgbG9jKTsKIAkJCUxCVUcoKTsKIAkJfSBlbHNlIGlmICghKGZpZWxkLT5ybWZfZmxhZ3MgJiBSTUZfRl9TVFJVQ1RfQVJSQVkpICYmCi0JCSAgICBzaXplIDwgZmllbGQtPnJtZl9zaXplKSB7Ci0JCQlDRVJST1IoIiVzOiBmaWVsZCBzaXplIG1pc21hdGNoICVkICE9ICVkICglZClcbiIsCi0JCQkgICAgICAgZmllbGQtPnJtZl9uYW1lLCBzaXplLCBmaWVsZC0+cm1mX3NpemUsIGxvYyk7CisJCQkgICBzaXplIDwgcm1mX3NpemUpIHsKKwkJCUNFUlJPUigiJXM6IGZpZWxkIHNpemUgbWlzbWF0Y2ggJXUgIT0gJXUgKCVkKVxuIiwKKwkJCSAgICAgICBmaWVsZC0+cm1mX25hbWUsIHNpemUsIHJtZl9zaXplLCBsb2MpOwogCQkJTEJVRygpOwogCQl9CiAJfQpAQCAtMjA1Nyw3ICsyMDQxLDcgQEAKICAqIGFjdHVhbGx5IHNldHMgdGhlIHNpemUgaW4gcGlsbC5yY19hcmVhW2xvY11bb2Zmc2V0XSwgYnV0IHRoaXMgZnVuY3Rpb24KICAqIHJldHVybnMgdGhlIG1lc3NhZ2UgYnVmbGVuW29mZnNldF0sIG1heWJlIHdlIHNob3VsZCB1c2UgYW5vdGhlciBuYW1lLgogICovCi1pbnQgcmVxX2NhcHN1bGVfZ2V0X3NpemUoY29uc3Qgc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLAordTMyIHJlcV9jYXBzdWxlX2dldF9zaXplKGNvbnN0IHN0cnVjdCByZXFfY2Fwc3VsZSAqcGlsbCwKIAkJCSBjb25zdCBzdHJ1Y3QgcmVxX21zZ19maWVsZCAqZmllbGQsCiAJCQkgZW51bSByZXFfbG9jYXRpb24gbG9jKQogewpAQCAtMjA3NSw3ICsyMDU5LDcgQEAKICAqCiAgKiBTZWUgYWxzbyByZXFfY2Fwc3VsZV9zZXRfc2l6ZSgpLgogICovCi1pbnQgcmVxX2NhcHN1bGVfbXNnX3NpemUoc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLCBlbnVtIHJlcV9sb2NhdGlvbiBsb2MpCit1MzIgcmVxX2NhcHN1bGVfbXNnX3NpemUoc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLCBlbnVtIHJlcV9sb2NhdGlvbiBsb2MpCiB7CiAJcmV0dXJuIGx1c3RyZV9tc2dfc2l6ZShwaWxsLT5yY19yZXEtPnJxX2ltcG9ydC0+aW1wX21zZ19tYWdpYywKIAkJCSAgICAgICBwaWxsLT5yY19mbXQtPnJmX2ZpZWxkc1tsb2NdLm5yLApAQCAtMjA5MCwxMCArMjA3NCwxMSBAQAogICogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIHVzZWQgZm9yIGZvcm1hdHMgd2hpY2ggY29udGFpbiB2YXJpYWJsZSBzaXplCiAgKiBmaWVsZHMuCiAgKi8KLWludCByZXFfY2Fwc3VsZV9mbXRfc2l6ZShfX3UzMiBtYWdpYywgY29uc3Qgc3RydWN0IHJlcV9mb3JtYXQgKmZtdCwKK3UzMiByZXFfY2Fwc3VsZV9mbXRfc2l6ZShfX3UzMiBtYWdpYywgY29uc3Qgc3RydWN0IHJlcV9mb3JtYXQgKmZtdCwKIAkJCSBlbnVtIHJlcV9sb2NhdGlvbiBsb2MpCiB7Ci0JaW50IHNpemUsIGkgPSAwOworCXNpemVfdCBpID0gMDsKKwl1MzIgc2l6ZTsKIAogCS8qCiAJICogVGhpcyBmdW5jdGlvbiBzaG91bGQgcHJvYmFibHkgTEFTU0VSVCgpIHRoYXQgZm10IGhhcyBubyBmaWVsZHMgd2l0aApAQCAtMjEwMyw3ICsyMDg4LDcgQEAKIAkgKiB3ZSBkby4KIAkgKi8KIAlzaXplID0gbHVzdHJlX21zZ19oZHJfc2l6ZShtYWdpYywgZm10LT5yZl9maWVsZHNbbG9jXS5ucik7Ci0JaWYgKHNpemUgPCAwKQorCWlmICghc2l6ZSkKIAkJcmV0dXJuIHNpemU7CiAKIAlmb3IgKDsgaSA8IGZtdC0+cmZfZmllbGRzW2xvY10ubnI7ICsraSkKQEAgLTIxMzUsNyArMjEyMCw3IEBACiB2b2lkIHJlcV9jYXBzdWxlX2V4dGVuZChzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwsIGNvbnN0IHN0cnVjdCByZXFfZm9ybWF0ICpmbXQpCiB7CiAJaW50IGk7Ci0JaW50IGo7CisJc2l6ZV90IGo7CiAKIAljb25zdCBzdHJ1Y3QgcmVxX2Zvcm1hdCAqb2xkOwogCkBAIC0yMTkzLDcgKzIxNzgsNyBAQAogCQkJCSAgICAgY29uc3Qgc3RydWN0IHJlcV9tc2dfZmllbGQgKmZpZWxkLAogCQkJCSAgICAgZW51bSByZXFfbG9jYXRpb24gbG9jKQogewotCWludCBvZmZzZXQ7CisJdTMyIG9mZnNldDsKIAogCUxBU1NFUlQobG9jID09IFJDTF9TRVJWRVIgfHwgbG9jID09IFJDTF9DTElFTlQpOwogCUxBU1NFUlQocmVxX2NhcHN1bGVfaGFzX2ZpZWxkKHBpbGwsIGZpZWxkLCBsb2MpKTsKQEAgLTIyMTAsMTIgKzIxOTUsMTEgQEAKICAqLwogdm9pZCByZXFfY2Fwc3VsZV9zaHJpbmsoc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLAogCQkJY29uc3Qgc3RydWN0IHJlcV9tc2dfZmllbGQgKmZpZWxkLAotCQkJdW5zaWduZWQgaW50IG5ld2xlbiwKLQkJCWVudW0gcmVxX2xvY2F0aW9uIGxvYykKKwkJCXUzMiBuZXdsZW4sIGVudW0gcmVxX2xvY2F0aW9uIGxvYykKIHsKIAljb25zdCBzdHJ1Y3QgcmVxX2Zvcm1hdCAqZm10OwogCXN0cnVjdCBsdXN0cmVfbXNnICptc2c7Ci0JaW50IGxlbjsKKwl1MzIgbGVuOwogCWludCBvZmZzZXQ7CiAKIAlmbXQgPSBwaWxsLT5yY19mbXQ7CkBAIC0yMjI4LDcgKzIyMTIsNyBAQAogCiAJbXNnID0gX19yZXFfbXNnKHBpbGwsIGxvYyk7CiAJbGVuID0gbHVzdHJlX21zZ19idWZsZW4obXNnLCBvZmZzZXQpOwotCUxBU1NFUlRGKG5ld2xlbiA8PSBsZW4sICIlczolcywgb2xkbGVuPSVkLCBuZXdsZW49JWRcbiIsCisJTEFTU0VSVEYobmV3bGVuIDw9IGxlbiwgIiVzOiVzLCBvbGRsZW49JXUsIG5ld2xlbj0ldVxuIiwKIAkJIGZtdC0+cmZfbmFtZSwgZmllbGQtPnJtZl9uYW1lLCBsZW4sIG5ld2xlbik7CiAKIAlpZiAobG9jID09IFJDTF9DTElFTlQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbHByb2NfcHRscnBjLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbHByb2NfcHRscnBjLmMKaW5kZXggYmM5M2I3NS4uOWJhZDU3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2xwcm9jX3B0bHJwYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9scHJvY19wdGxycGMuYwpAQCAtMTkxLDcgKzE5MSw3IEBACiAJTEFTU0VSVCghKmRlYnVnZnNfcm9vdF9yZXQpOwogCUxBU1NFUlQoISpzdGF0c19yZXQpOwogCi0Jc3ZjX3N0YXRzID0gbHByb2Nmc19hbGxvY19zdGF0cyhFWFRSQV9NQVhfT1BDT0RFUytMVVNUUkVfTUFYX09QQ09ERVMsCisJc3ZjX3N0YXRzID0gbHByb2Nmc19hbGxvY19zdGF0cyhFWFRSQV9NQVhfT1BDT0RFUyArIExVU1RSRV9NQVhfT1BDT0RFUywKIAkJCQkJMCk7CiAJaWYgKCFzdmNfc3RhdHMpCiAJCXJldHVybjsKQEAgLTkzNyw3ICs5MzcsNyBAQAogc3RhdGljIGludAogcHRscnBjX2xwcm9jZnNfc3ZjX3JlcV9oaXN0b3J5X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBzb3BzID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgc29wcyA9IHsKIAkJLnN0YXJ0ID0gcHRscnBjX2xwcm9jZnNfc3ZjX3JlcV9oaXN0b3J5X3N0YXJ0LAogCQkuc3RvcCAgPSBwdGxycGNfbHByb2Nmc19zdmNfcmVxX2hpc3Rvcnlfc3RvcCwKIAkJLm5leHQgID0gcHRscnBjX2xwcm9jZnNfc3ZjX3JlcV9oaXN0b3J5X25leHQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbmlvYnVmLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbmlvYnVmLmMKaW5kZXggMTFlYzgyNS4uOWM5MzczOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL25pb2J1Zi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9uaW9idWYuYwpAQCAtMjk1LDcgKzI5NSw2IEBACiAJfQogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChwdGxycGNfdW5yZWdpc3Rlcl9idWxrKTsKIAogc3RhdGljIHZvaWQgcHRscnBjX2F0X3NldF9yZXBseShzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgaW50IGZsYWdzKQogewpAQCAtMzk4LDcgKzM5Nyw4IEBACiAJbHVzdHJlX21zZ19zZXRfc3RhdHVzKHJlcS0+cnFfcmVwbXNnLAogCQkJICAgICAgcHRscnBjX3N0YXR1c19odG9uKHJlcS0+cnFfc3RhdHVzKSk7CiAJbHVzdHJlX21zZ19zZXRfb3BjKHJlcS0+cnFfcmVwbXNnLAotCQlyZXEtPnJxX3JlcW1zZyA/IGx1c3RyZV9tc2dfZ2V0X29wYyhyZXEtPnJxX3JlcW1zZykgOiAwKTsKKwkJCSAgIHJlcS0+cnFfcmVxbXNnID8KKwkJCSAgIGx1c3RyZV9tc2dfZ2V0X29wYyhyZXEtPnJxX3JlcW1zZykgOiAwKTsKIAogCXRhcmdldF9wYWNrX3Bvb2xfcmVwbHkocmVxKTsKIApAQCAtNDMzLDcgKzQzMyw2IEBACiAJcHRscnBjX2Nvbm5lY3Rpb25fcHV0KGNvbm4pOwogCXJldHVybiByYzsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX3NlbmRfcmVwbHkpOwogCiBpbnQgcHRscnBjX3JlcGx5KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKQogewpAQCAtNDQxLDcgKzQ0MCw2IEBACiAJCXJldHVybiAwOwogCXJldHVybiBwdGxycGNfc2VuZF9yZXBseShyZXEsIDApOwogfQotRVhQT1JUX1NZTUJPTChwdGxycGNfcmVwbHkpOwogCiAvKioKICAqIEZvciByZXF1ZXN0IFxhIHJlcSBzZW5kIGFuIGVycm9yIHJlcGx5IGJhY2suIENyZWF0ZSBlbXB0eQpAQCAtNDY4LDEzICs0NjYsMTEgQEAKIAlyYyA9IHB0bHJwY19zZW5kX3JlcGx5KHJlcSwgbWF5X2JlX2RpZmZpY3VsdCk7CiAJcmV0dXJuIHJjOwogfQotRVhQT1JUX1NZTUJPTChwdGxycGNfc2VuZF9lcnJvcik7CiAKIGludCBwdGxycGNfZXJyb3Ioc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpCiB7CiAJcmV0dXJuIHB0bHJwY19zZW5kX2Vycm9yKHJlcSwgMCk7CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19lcnJvcik7CiAKIC8qKgogICogU2VuZCByZXF1ZXN0IFxhIHJlcXVlc3QuCkBAIC00OTAsNyArNDg2LDggQEAKIAlzdHJ1Y3QgcHRscnBjX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CiAJbG5ldF9oYW5kbGVfbWVfdCByZXBseV9tZV9oOwogCWxuZXRfbWRfdCByZXBseV9tZDsKLQlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkID0gcmVxdWVzdC0+cnFfaW1wb3J0LT5pbXBfb2JkOworCXN0cnVjdCBvYmRfaW1wb3J0ICppbXAgPSByZXF1ZXN0LT5ycV9pbXBvcnQ7CisJc3RydWN0IG9iZF9kZXZpY2UgKm9iZCA9IGltcC0+aW1wX29iZDsKIAogCWlmIChPQkRfRkFJTF9DSEVDSyhPQkRfRkFJTF9QVExSUENfRFJPUF9SUEMpKQogCQlyZXR1cm4gMDsKQEAgLTUwMyw3ICs1MDAsNyBAQAogCSAqLwogCUxBU1NFUlQoIXJlcXVlc3QtPnJxX3JlY2VpdmluZ19yZXBseSk7CiAJTEFTU0VSVCghKChsdXN0cmVfbXNnX2dldF9mbGFncyhyZXF1ZXN0LT5ycV9yZXFtc2cpICYgTVNHX1JFUExBWSkgJiYKLQkJICAocmVxdWVzdC0+cnFfaW1wb3J0LT5pbXBfc3RhdGUgPT0gTFVTVFJFX0lNUF9GVUxMKSkpOworCQkgIChpbXAtPmltcF9zdGF0ZSA9PSBMVVNUUkVfSU1QX0ZVTEwpKSk7CiAKIAlpZiAodW5saWtlbHkob2JkICYmIG9iZC0+b2JkX2ZhaWwpKSB7CiAJCUNERUJVRyhEX0hBLCAibXV0aW5nIHJwYyBmb3IgZmFpbGVkIGltcCBvYmQgJXNcbiIsCkBAIC01MTYsMTUgKzUxMywyMiBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQljb25uZWN0aW9uID0gcmVxdWVzdC0+cnFfaW1wb3J0LT5pbXBfY29ubmVjdGlvbjsKKwljb25uZWN0aW9uID0gaW1wLT5pbXBfY29ubmVjdGlvbjsKIAogCWx1c3RyZV9tc2dfc2V0X2hhbmRsZShyZXF1ZXN0LT5ycV9yZXFtc2csCi0JCQkgICAgICAmcmVxdWVzdC0+cnFfaW1wb3J0LT5pbXBfcmVtb3RlX2hhbmRsZSk7CisJCQkgICAgICAmaW1wLT5pbXBfcmVtb3RlX2hhbmRsZSk7CiAJbHVzdHJlX21zZ19zZXRfdHlwZShyZXF1ZXN0LT5ycV9yZXFtc2csIFBUTF9SUENfTVNHX1JFUVVFU1QpOwotCWx1c3RyZV9tc2dfc2V0X2Nvbm5fY250KHJlcXVlc3QtPnJxX3JlcW1zZywKLQkJCQlyZXF1ZXN0LT5ycV9pbXBvcnQtPmltcF9jb25uX2NudCk7Ci0JbHVzdHJlX21zZ2hkcl9zZXRfZmxhZ3MocmVxdWVzdC0+cnFfcmVxbXNnLAotCQkJCXJlcXVlc3QtPnJxX2ltcG9ydC0+aW1wX21zZ2hkcl9mbGFncyk7CisJbHVzdHJlX21zZ19zZXRfY29ubl9jbnQocmVxdWVzdC0+cnFfcmVxbXNnLCBpbXAtPmltcF9jb25uX2NudCk7CisJbHVzdHJlX21zZ2hkcl9zZXRfZmxhZ3MocmVxdWVzdC0+cnFfcmVxbXNnLCBpbXAtPmltcF9tc2doZHJfZmxhZ3MpOworCisJLyoqCisJICogRm9yIGVuYWJsZWQgQVQgYWxsIHJlcXVlc3Qgc2hvdWxkIGhhdmUgQVRfU1VQUE9SVCBpbiB0aGUKKwkgKiBGVUxMIGltcG9ydCBzdGF0ZSB3aGVuIE9CRF9DT05ORUNUX0FUIGlzIHNldAorCSAqLworCUxBU1NFUlQoQVRfT0ZGIHx8IGltcC0+aW1wX3N0YXRlICE9IExVU1RSRV9JTVBfRlVMTCB8fAorCQkoaW1wLT5pbXBfbXNnaGRyX2ZsYWdzICYgTVNHSERSX0FUX1NVUFBPUlQpIHx8CisJCSEoaW1wLT5pbXBfY29ubmVjdF9kYXRhLm9jZF9jb25uZWN0X2ZsYWdzICYKKwkJT0JEX0NPTk5FQ1RfQVQpKTsKIAogCWlmIChyZXF1ZXN0LT5ycV9yZXNlbmQpCiAJCWx1c3RyZV9tc2dfYWRkX2ZsYWdzKHJlcXVlc3QtPnJxX3JlcW1zZywgTVNHX1JFU0VOVCk7CkBAIC02MjgsNyArNjMyLDcgQEAKIAlwdGxycGNfcmVxdWVzdF9hZGRyZWYocmVxdWVzdCk7CiAJaWYgKG9iZCAmJiBvYmQtPm9iZF9zdmNfc3RhdHMpCiAJCWxwcm9jZnNfY291bnRlcl9hZGQob2JkLT5vYmRfc3ZjX3N0YXRzLCBQVExSUENfUkVRQUNUSVZFX0NOVFIsCi0JCQlhdG9taWNfcmVhZCgmcmVxdWVzdC0+cnFfaW1wb3J0LT5pbXBfaW5mbGlnaHQpKTsKKwkJCWF0b21pY19yZWFkKCZpbXAtPmltcF9pbmZsaWdodCkpOwogCiAJT0JEX0ZBSUxfVElNRU9VVChPQkRfRkFJTF9QVExSUENfREVMQVlfU0VORCwgcmVxdWVzdC0+cnFfdGltZW91dCArIDUpOwogCkBAIC02NDAsNyArNjQ0LDcgQEAKIAlyZXF1ZXN0LT5ycV9kZWFkbGluZSA9IHJlcXVlc3QtPnJxX3NlbnQgKyByZXF1ZXN0LT5ycV90aW1lb3V0ICsKIAkJcHRscnBjX2F0X2dldF9uZXRfbGF0ZW5jeShyZXF1ZXN0KTsKIAotCXB0bHJwY19waW5nZXJfc2VuZGluZ19vbl9pbXBvcnQocmVxdWVzdC0+cnFfaW1wb3J0KTsKKwlwdGxycGNfcGluZ2VyX3NlbmRpbmdfb25faW1wb3J0KGltcCk7CiAKIAlERUJVR19SRVEoRF9JTkZPLCByZXF1ZXN0LCAic2VuZCBmbGc9JXgiLAogCQkgIGx1c3RyZV9tc2dfZ2V0X2ZsYWdzKHJlcXVlc3QtPnJxX3JlcW1zZykpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3BhY2tfZ2VuZXJpYy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3BhY2tfZ2VuZXJpYy5jCmluZGV4IGI1MTRmMTguLjg3MTc2ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wYWNrX2dlbmVyaWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcGFja19nZW5lcmljLmMKQEAgLTUwLDM2ICs1MCwzNCBAQAogCiAjaW5jbHVkZSAicHRscnBjX2ludGVybmFsLmgiCiAKLXN0YXRpYyBpbmxpbmUgaW50IGx1c3RyZV9tc2dfaGRyX3NpemVfdjIoaW50IGNvdW50KQorc3RhdGljIGlubGluZSB1MzIgbHVzdHJlX21zZ19oZHJfc2l6ZV92Mih1MzIgY291bnQpCiB7CiAJcmV0dXJuIGNmc19zaXplX3JvdW5kKG9mZnNldG9mKHN0cnVjdCBsdXN0cmVfbXNnX3YyLAogCQkJCSAgICAgICBsbV9idWZsZW5zW2NvdW50XSkpOwogfQogCi1pbnQgbHVzdHJlX21zZ19oZHJfc2l6ZShfX3UzMiBtYWdpYywgaW50IGNvdW50KQordTMyIGx1c3RyZV9tc2dfaGRyX3NpemUoX191MzIgbWFnaWMsIHUzMiBjb3VudCkKIHsKIAlzd2l0Y2ggKG1hZ2ljKSB7CiAJY2FzZSBMVVNUUkVfTVNHX01BR0lDX1YyOgogCQlyZXR1cm4gbHVzdHJlX21zZ19oZHJfc2l6ZV92Mihjb3VudCk7CiAJZGVmYXVsdDoKIAkJTEFTU0VSVEYoMCwgImluY29ycmVjdCBtZXNzYWdlIG1hZ2ljOiAlMDh4XG4iLCBtYWdpYyk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gMDsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9tc2dfaGRyX3NpemUpOwogCiB2b2lkIHB0bHJwY19idWZfc2V0X3N3YWJiZWQoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIGNvbnN0IGludCBpbm91dCwKLQkJCSAgICBpbnQgaW5kZXgpCisJCQkgICAgdTMyIGluZGV4KQogewogCWlmIChpbm91dCkKIAkJbHVzdHJlX3NldF9yZXFfc3dhYmJlZChyZXEsIGluZGV4KTsKIAllbHNlCiAJCWx1c3RyZV9zZXRfcmVwX3N3YWJiZWQocmVxLCBpbmRleCk7CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19idWZfc2V0X3N3YWJiZWQpOwogCiBpbnQgcHRscnBjX2J1Zl9uZWVkX3N3YWIoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIGNvbnN0IGludCBpbm91dCwKLQkJCSBpbnQgaW5kZXgpCisJCQkgdTMyIGluZGV4KQogewogCWlmIChpbm91dCkKIAkJcmV0dXJuIChwdGxycGNfcmVxX25lZWRfc3dhYihyZXEpICYmCkBAIC04OCwxMiArODYsMTEgQEAKIAkJcmV0dXJuIChwdGxycGNfcmVwX25lZWRfc3dhYihyZXEpICYmCiAJCQkhbHVzdHJlX3JlcF9zd2FiYmVkKHJlcSwgaW5kZXgpKTsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX2J1Zl9uZWVkX3N3YWIpOwogCiAvKiBlYXJseSByZXBseSBzaXplICovCi1pbnQgbHVzdHJlX21zZ19lYXJseV9zaXplKHZvaWQpCit1MzIgbHVzdHJlX21zZ19lYXJseV9zaXplKHZvaWQpCiB7Ci0Jc3RhdGljIGludCBzaXplOworCXN0YXRpYyB1MzIgc2l6ZTsKIAogCWlmICghc2l6ZSkgewogCQkvKiBBbHdheXMgcmVwbHkgb2xkIHB0bHJwY19ib2R5X3YyIHRvIGtlZXAgaW50ZXJvcGVyYWJpbGl0eQpAQCAtMTExLDkgKzEwOCw5IEBACiB9CiBFWFBPUlRfU1lNQk9MKGx1c3RyZV9tc2dfZWFybHlfc2l6ZSk7CiAKLWludCBsdXN0cmVfbXNnX3NpemVfdjIoaW50IGNvdW50LCBfX3UzMiAqbGVuZ3RocykKK3UzMiBsdXN0cmVfbXNnX3NpemVfdjIoaW50IGNvdW50LCBfX3UzMiAqbGVuZ3RocykKIHsKLQlpbnQgc2l6ZTsKKwl1MzIgc2l6ZTsKIAlpbnQgaTsKIAogCXNpemUgPSBsdXN0cmVfbXNnX2hkcl9zaXplX3YyKGNvdW50KTsKQEAgLTEzMSw3ICsxMjgsNyBAQAogICogICAgICAgdGFyZ2V0IHRoZW4gdGhlIGZpcnN0IGJ1ZmZlciB3aWxsIGJlIHN0cmlwcGVkIGJlY2F1c2UgdGhlIHB0bHJwYwogICogICAgICAgZGF0YSBpcyBwYXJ0IG9mIHRoZSBsdXN0cmVfbXNnX3YxIGhlYWRlci4gYj0xNDA0MwogICovCi1pbnQgbHVzdHJlX21zZ19zaXplKF9fdTMyIG1hZ2ljLCBpbnQgY291bnQsIF9fdTMyICpsZW5zKQordTMyIGx1c3RyZV9tc2dfc2l6ZShfX3UzMiBtYWdpYywgaW50IGNvdW50LCBfX3UzMiAqbGVucykKIHsKIAlfX3UzMiBzaXplW10gPSB7IHNpemVvZihzdHJ1Y3QgcHRscnBjX2JvZHkpIH07CiAKQEAgLTE0OCwxNSArMTQ1LDE0IEBACiAJCXJldHVybiBsdXN0cmVfbXNnX3NpemVfdjIoY291bnQsIGxlbnMpOwogCWRlZmF1bHQ6CiAJCUxBU1NFUlRGKDAsICJpbmNvcnJlY3QgbWVzc2FnZSBtYWdpYzogJTA4eFxuIiwgbWFnaWMpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIDA7CiAJfQogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfbXNnX3NpemUpOwogCiAvKiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgYnVmZmVyIHRoYXQgd2FzIGFscmVhZHkgcGFja2VkCiAgKiBhbmQgd2lsbCBjb3JyZWN0bHkgaGFuZGxlIHRoZSBkaWZmZXJlbnQgbWVzc2FnZSBmb3JtYXRzLgogICovCi1pbnQgbHVzdHJlX3BhY2tlZF9tc2dfc2l6ZShzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnKQordTMyIGx1c3RyZV9wYWNrZWRfbXNnX3NpemUoc3RydWN0IGx1c3RyZV9tc2cgKm1zZykKIHsKIAlzd2l0Y2ggKG1zZy0+bG1fbWFnaWMpIHsKIAljYXNlIExVU1RSRV9NU0dfTUFHSUNfVjI6CkBAIC0xNjYsNyArMTYyLDYgQEAKIAkJcmV0dXJuIDA7CiAJfQogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfcGFja2VkX21zZ19zaXplKTsKIAogdm9pZCBsdXN0cmVfaW5pdF9tc2dfdjIoc3RydWN0IGx1c3RyZV9tc2dfdjIgKm1zZywgaW50IGNvdW50LCBfX3UzMiAqbGVucywKIAkJCWNoYXIgKipidWZzKQpAQCAtMjI3LDcgKzIyMiw2IEBACiAJLyogb25seSB1c2UgbmV3IGZvcm1hdCwgd2UgZG9uJ3QgbmVlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggMS40ICovCiAJcmV0dXJuIGx1c3RyZV9wYWNrX3JlcXVlc3RfdjIocmVxLCBjb3VudCwgbGVucywgYnVmcyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9wYWNrX3JlcXVlc3QpOwogCiAjaWYgUlNfREVCVUcKIExJU1RfSEVBRChwdGxycGNfcnNfZGVidWdfbHJ1KTsKQEAgLTM2OSw3ICszNjMsNiBAQAogCQkgICAgICAgbHVzdHJlX21zZ19zaXplKHJlcS0+cnFfcmVxbXNnLT5sbV9tYWdpYywgY291bnQsIGxlbnMpKTsKIAlyZXR1cm4gcmM7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9wYWNrX3JlcGx5X2ZsYWdzKTsKIAogaW50IGx1c3RyZV9wYWNrX3JlcGx5KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBpbnQgY291bnQsIF9fdTMyICpsZW5zLAogCQkgICAgICBjaGFyICoqYnVmcykKQEAgLTM3OCwxMSArMzcxLDkgQEAKIH0KIEVYUE9SVF9TWU1CT0wobHVzdHJlX3BhY2tfcmVwbHkpOwogCi12b2lkICpsdXN0cmVfbXNnX2J1Zl92MihzdHJ1Y3QgbHVzdHJlX21zZ192MiAqbSwgaW50IG4sIGludCBtaW5fc2l6ZSkKK3ZvaWQgKmx1c3RyZV9tc2dfYnVmX3YyKHN0cnVjdCBsdXN0cmVfbXNnX3YyICptLCB1MzIgbiwgdTMyIG1pbl9zaXplKQogewotCWludCBpLCBvZmZzZXQsIGJ1ZmxlbiwgYnVmY291bnQ7Ci0KLQlMQVNTRVJUKG4gPj0gMCk7CisJdTMyIGksIG9mZnNldCwgYnVmbGVuLCBidWZjb3VudDsKIAogCWJ1ZmNvdW50ID0gbS0+bG1fYnVmY291bnQ7CiAJaWYgKHVubGlrZWx5KG4gPj0gYnVmY291bnQpKSB7CkBAIC00MDYsNyArMzk3LDcgQEAKIAlyZXR1cm4gKGNoYXIgKiltICsgb2Zmc2V0OwogfQogCi12b2lkICpsdXN0cmVfbXNnX2J1ZihzdHJ1Y3QgbHVzdHJlX21zZyAqbSwgaW50IG4sIGludCBtaW5fc2l6ZSkKK3ZvaWQgKmx1c3RyZV9tc2dfYnVmKHN0cnVjdCBsdXN0cmVfbXNnICptLCB1MzIgbiwgdTMyIG1pbl9zaXplKQogewogCXN3aXRjaCAobS0+bG1fbWFnaWMpIHsKIAljYXNlIExVU1RSRV9NU0dfTUFHSUNfVjI6CkBAIC00MTksNyArNDEwLDcgQEAKIH0KIEVYUE9SVF9TWU1CT0wobHVzdHJlX21zZ19idWYpOwogCi1zdGF0aWMgaW50IGx1c3RyZV9zaHJpbmtfbXNnX3YyKHN0cnVjdCBsdXN0cmVfbXNnX3YyICptc2csIGludCBzZWdtZW50LAorc3RhdGljIGludCBsdXN0cmVfc2hyaW5rX21zZ192MihzdHJ1Y3QgbHVzdHJlX21zZ192MiAqbXNnLCB1MzIgc2VnbWVudCwKIAkJCQl1bnNpZ25lZCBpbnQgbmV3bGVuLCBpbnQgbW92ZV9kYXRhKQogewogCWNoYXIgKnRhaWwgPSBOVUxMLCAqbmV3cG9zOwpAQCAtNDkzLDcgKzQ4NCw2IEBACiAKIAlzcHRscnBjX3N2Y19mcmVlX3JzKHJzKTsKIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX2ZyZWVfcmVwbHlfc3RhdGUpOwogCiBzdGF0aWMgaW50IGx1c3RyZV91bnBhY2tfbXNnX3YyKHN0cnVjdCBsdXN0cmVfbXNnX3YyICptLCBpbnQgbGVuKQogewpAQCAtNTgxLDcgKzU3MSw2IEBACiAJfQogCXJldHVybiByYzsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX3VucGFja19yZXFfbXNnKTsKIAogaW50IHB0bHJwY191bnBhY2tfcmVwX21zZyhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgaW50IGxlbikKIHsKQEAgLTU5NCw3ICs1ODMsNiBAQAogCX0KIAlyZXR1cm4gcmM7CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY191bnBhY2tfcmVwX21zZyk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IGx1c3RyZV91bnBhY2tfcHRscnBjX2JvZHlfdjIoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsCiAJCQkJCSAgICAgICBjb25zdCBpbnQgaW5vdXQsIGludCBvZmZzZXQpCkBAIC02NDcsNyArNjM1LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGx1c3RyZV9tc2dfYnVmbGVuX3YyKHN0cnVjdCBsdXN0cmVfbXNnX3YyICptLCBpbnQgbikKK3N0YXRpYyBpbmxpbmUgdTMyIGx1c3RyZV9tc2dfYnVmbGVuX3YyKHN0cnVjdCBsdXN0cmVfbXNnX3YyICptLCB1MzIgbikKIHsKIAlpZiAobiA+PSBtLT5sbV9idWZjb3VudCkKIAkJcmV0dXJuIDA7CkBAIC02NjIsMTQgKzY1MCwxNCBAQAogICoKICAqIHJldHVybnMgemVybyBmb3Igbm9uLWV4aXN0ZW50IG1lc3NhZ2UgaW5kaWNlcwogICovCi1pbnQgbHVzdHJlX21zZ19idWZsZW4oc3RydWN0IGx1c3RyZV9tc2cgKm0sIGludCBuKQordTMyIGx1c3RyZV9tc2dfYnVmbGVuKHN0cnVjdCBsdXN0cmVfbXNnICptLCB1MzIgbikKIHsKIAlzd2l0Y2ggKG0tPmxtX21hZ2ljKSB7CiAJY2FzZSBMVVNUUkVfTVNHX01BR0lDX1YyOgogCQlyZXR1cm4gbHVzdHJlX21zZ19idWZsZW5fdjIobSwgbik7CiAJZGVmYXVsdDoKIAkJQ0VSUk9SKCJpbmNvcnJlY3QgbWVzc2FnZSBtYWdpYzogJTA4eFxuIiwgbS0+bG1fbWFnaWMpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIDA7CiAJfQogfQogRVhQT1JUX1NZTUJPTChsdXN0cmVfbXNnX2J1Zmxlbik7CkBAIC02NzcsMjMgKzY2NSwyMiBAQAogLyogTkIgcmV0dXJuIHRoZSBidWZjb3VudCBmb3IgbHVzdHJlX21zZ192MiBmb3JtYXQsIHNvIGlmIG1lc3NhZ2UgaXMgcGFja2VkCiAgKiBpbiBWMSBmb3JtYXQsIHRoZSByZXN1bHQgaXMgb25lIGJpZ2dlci4gKGFkZCBzdHJ1Y3QgcHRscnBjX2JvZHkpLgogICovCi1pbnQgbHVzdHJlX21zZ19idWZjb3VudChzdHJ1Y3QgbHVzdHJlX21zZyAqbSkKK3UzMiBsdXN0cmVfbXNnX2J1ZmNvdW50KHN0cnVjdCBsdXN0cmVfbXNnICptKQogewogCXN3aXRjaCAobS0+bG1fbWFnaWMpIHsKIAljYXNlIExVU1RSRV9NU0dfTUFHSUNfVjI6CiAJCXJldHVybiBtLT5sbV9idWZjb3VudDsKIAlkZWZhdWx0OgogCQlDRVJST1IoImluY29ycmVjdCBtZXNzYWdlIG1hZ2ljOiAlMDh4XG4iLCBtLT5sbV9tYWdpYyk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gMDsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9tc2dfYnVmY291bnQpOwogCi1jaGFyICpsdXN0cmVfbXNnX3N0cmluZyhzdHJ1Y3QgbHVzdHJlX21zZyAqbSwgaW50IGluZGV4LCBpbnQgbWF4X2xlbikKK2NoYXIgKmx1c3RyZV9tc2dfc3RyaW5nKHN0cnVjdCBsdXN0cmVfbXNnICptLCB1MzIgaW5kZXgsIHUzMiBtYXhfbGVuKQogewogCS8qIG1heF9sZW4gPT0gMCBtZWFucyB0aGUgc3RyaW5nIHNob3VsZCBmaWxsIHRoZSBidWZmZXIgKi8KIAljaGFyICpzdHI7Ci0JaW50IHNsZW4sIGJsZW47CisJdTMyIHNsZW4sIGJsZW47CiAKIAlzd2l0Y2ggKG0tPmxtX21hZ2ljKSB7CiAJY2FzZSBMVVNUUkVfTVNHX01BR0lDX1YyOgpAQCAtNzMxLDExICs3MTgsMTAgQEAKIAogCXJldHVybiBzdHI7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9tc2dfc3RyaW5nKTsKIAogLyogV3JhcCB1cCB0aGUgbm9ybWFsIGZpeGVkIGxlbmd0aCBjYXNlcyAqLwotc3RhdGljIGlubGluZSB2b2lkICpfX2x1c3RyZV9zd2FiX2J1ZihzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCBpbnQgaW5kZXgsCi0JCQkJICAgICAgaW50IG1pbl9zaXplLCB2b2lkICpzd2FiYmVyKQorc3RhdGljIGlubGluZSB2b2lkICpfX2x1c3RyZV9zd2FiX2J1ZihzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCB1MzIgaW5kZXgsCisJCQkJICAgICAgdTMyIG1pbl9zaXplLCB2b2lkICpzd2FiYmVyKQogewogCXZvaWQgKnB0ciA9IE5VTEw7CiAKQEAgLTgwNCw3ICs3OTAsNyBAQAogfQogRVhQT1JUX1NZTUJPTChsdXN0cmVfbXNnX2dldF9mbGFncyk7CiAKLXZvaWQgbHVzdHJlX21zZ19hZGRfZmxhZ3Moc3RydWN0IGx1c3RyZV9tc2cgKm1zZywgaW50IGZsYWdzKQordm9pZCBsdXN0cmVfbXNnX2FkZF9mbGFncyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCB1MzIgZmxhZ3MpCiB7CiAJc3dpdGNoIChtc2ctPmxtX21hZ2ljKSB7CiAJY2FzZSBMVVNUUkVfTVNHX01BR0lDX1YyOiB7CkBAIC04MjAsNyArODA2LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0wobHVzdHJlX21zZ19hZGRfZmxhZ3MpOwogCi12b2lkIGx1c3RyZV9tc2dfc2V0X2ZsYWdzKHN0cnVjdCBsdXN0cmVfbXNnICptc2csIGludCBmbGFncykKK3ZvaWQgbHVzdHJlX21zZ19zZXRfZmxhZ3Moc3RydWN0IGx1c3RyZV9tc2cgKm1zZywgdTMyIGZsYWdzKQogewogCXN3aXRjaCAobXNnLT5sbV9tYWdpYykgewogCWNhc2UgTFVTVFJFX01TR19NQUdJQ19WMjogewpAQCAtODM0LDkgKzgyMCw4IEBACiAJCUxBU1NFUlRGKDAsICJpbmNvcnJlY3QgbWVzc2FnZSBtYWdpYzogJTA4eFxuIiwgbXNnLT5sbV9tYWdpYyk7CiAJfQogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfbXNnX3NldF9mbGFncyk7CiAKLXZvaWQgbHVzdHJlX21zZ19jbGVhcl9mbGFncyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCBpbnQgZmxhZ3MpCit2b2lkIGx1c3RyZV9tc2dfY2xlYXJfZmxhZ3Moc3RydWN0IGx1c3RyZV9tc2cgKm1zZywgdTMyIGZsYWdzKQogewogCXN3aXRjaCAobXNnLT5sbV9tYWdpYykgewogCWNhc2UgTFVTVFJFX01TR19NQUdJQ19WMjogewpAQCAtODY4LDkgKzg1Myw4IEBACiAJCXJldHVybiAwOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX21zZ19nZXRfb3BfZmxhZ3MpOwogCi12b2lkIGx1c3RyZV9tc2dfYWRkX29wX2ZsYWdzKHN0cnVjdCBsdXN0cmVfbXNnICptc2csIGludCBmbGFncykKK3ZvaWQgbHVzdHJlX21zZ19hZGRfb3BfZmxhZ3Moc3RydWN0IGx1c3RyZV9tc2cgKm1zZywgdTMyIGZsYWdzKQogewogCXN3aXRjaCAobXNnLT5sbV9tYWdpYykgewogCWNhc2UgTFVTVFJFX01TR19NQUdJQ19WMjogewpAQCAtOTAzLDcgKzg4Nyw2IEBACiAJCXJldHVybiBOVUxMOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX21zZ19nZXRfaGFuZGxlKTsKIAogX191MzIgbHVzdHJlX21zZ19nZXRfdHlwZShzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnKQogewpAQCAtOTI0LDcgKzkwNyw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGx1c3RyZV9tc2dfZ2V0X3R5cGUpOwogCi12b2lkIGx1c3RyZV9tc2dfYWRkX3ZlcnNpb24oc3RydWN0IGx1c3RyZV9tc2cgKm1zZywgaW50IHZlcnNpb24pCit2b2lkIGx1c3RyZV9tc2dfYWRkX3ZlcnNpb24oc3RydWN0IGx1c3RyZV9tc2cgKm1zZywgdTMyIHZlcnNpb24pCiB7CiAJc3dpdGNoIChtc2ctPmxtX21hZ2ljKSB7CiAJY2FzZSBMVVNUUkVfTVNHX01BR0lDX1YyOiB7CkBAIC05MzgsNyArOTIxLDYgQEAKIAkJTEFTU0VSVEYoMCwgImluY29ycmVjdCBtZXNzYWdlIG1hZ2ljOiAlMDh4XG4iLCBtc2ctPmxtX21hZ2ljKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9tc2dfYWRkX3ZlcnNpb24pOwogCiBfX3UzMiBsdXN0cmVfbXNnX2dldF9vcGMoc3RydWN0IGx1c3RyZV9tc2cgKm1zZykKIHsKQEAgLTEwNTUsNyArMTAzNyw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX21zZ19nZXRfc2x2KTsKIAogdm9pZCBsdXN0cmVfbXNnX3NldF9zbHYoc3RydWN0IGx1c3RyZV9tc2cgKm1zZywgX191NjQgc2x2KQogewpAQCAtMTA3NSw3ICsxMDU2LDYgQEAKIAkJcmV0dXJuOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX21zZ19zZXRfc2x2KTsKIAogX191MzIgbHVzdHJlX21zZ19nZXRfbGltaXQoc3RydWN0IGx1c3RyZV9tc2cgKm1zZykKIHsKQEAgLTEwOTQsNyArMTA3NCw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX21zZ19nZXRfbGltaXQpOwogCiB2b2lkIGx1c3RyZV9tc2dfc2V0X2xpbWl0KHN0cnVjdCBsdXN0cmVfbXNnICptc2csIF9fdTY0IGxpbWl0KQogewpAQCAtMTExNCw3ICsxMDkzLDYgQEAKIAkJcmV0dXJuOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX21zZ19zZXRfbGltaXQpOwogCiBfX3UzMiBsdXN0cmVfbXNnX2dldF9jb25uX2NudChzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnKQogewpAQCAtMTE0NSw3ICsxMTIzLDYgQEAKIAkJcmV0dXJuIDA7CiAJfQogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfbXNnX2dldF9tYWdpYyk7CiAKIF9fdTMyIGx1c3RyZV9tc2dfZ2V0X3RpbWVvdXQoc3RydWN0IGx1c3RyZV9tc2cgKm1zZykKIHsKQEAgLTEyMDMsOCArMTE4MCw5IEBACiAJCXVuc2lnbmVkIGludCBoc2l6ZSA9IDQ7CiAKIAkJY2ZzX2NyeXB0b19oYXNoX2RpZ2VzdChDRlNfSEFTSF9BTEdfQ1JDMzIsICh1bnNpZ25lZCBjaGFyICopcGIsCi0JCQkJICAgbHVzdHJlX21zZ19idWZsZW4obXNnLCBNU0dfUFRMUlBDX0JPRFlfT0ZGKSwKLQkJCQkgICBOVUxMLCAwLCAodW5zaWduZWQgY2hhciAqKSZjcmMsICZoc2l6ZSk7CisJCQkJICAgICAgIGx1c3RyZV9tc2dfYnVmbGVuKG1zZywKKwkJCQkJCQkgTVNHX1BUTFJQQ19CT0RZX09GRiksCisJCQkJICAgICAgIE5VTEwsIDAsICh1bnNpZ25lZCBjaGFyICopJmNyYywgJmhzaXplKTsKIAkJcmV0dXJuIGNyYzsKIAl9CiAJZGVmYXVsdDoKQEAgLTEyMjcsNyArMTIwNSw2IEBACiAJCUxBU1NFUlRGKDAsICJpbmNvcnJlY3QgbWVzc2FnZSBtYWdpYzogJTA4eFxuIiwgbXNnLT5sbV9tYWdpYyk7CiAJfQogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfbXNnX3NldF9oYW5kbGUpOwogCiB2b2lkIGx1c3RyZV9tc2dfc2V0X3R5cGUoc3RydWN0IGx1c3RyZV9tc2cgKm1zZywgX191MzIgdHlwZSkKIHsKQEAgLTEyNDMsNyArMTIyMCw2IEBACiAJCUxBU1NFUlRGKDAsICJpbmNvcnJlY3QgbWVzc2FnZSBtYWdpYzogJTA4eFxuIiwgbXNnLT5sbV9tYWdpYyk7CiAJfQogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfbXNnX3NldF90eXBlKTsKIAogdm9pZCBsdXN0cmVfbXNnX3NldF9vcGMoc3RydWN0IGx1c3RyZV9tc2cgKm1zZywgX191MzIgb3BjKQogewpAQCAtMTI1OSw3ICsxMjM1LDYgQEAKIAkJTEFTU0VSVEYoMCwgImluY29ycmVjdCBtZXNzYWdlIG1hZ2ljOiAlMDh4XG4iLCBtc2ctPmxtX21hZ2ljKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9tc2dfc2V0X29wYyk7CiAKIHZvaWQgbHVzdHJlX21zZ19zZXRfdmVyc2lvbnMoc3RydWN0IGx1c3RyZV9tc2cgKm1zZywgX191NjQgKnZlcnNpb25zKQogewpAQCAtMTMyNiw3ICsxMzAxLDYgQEAKIAkJTEFTU0VSVEYoMCwgImluY29ycmVjdCBtZXNzYWdlIG1hZ2ljOiAlMDh4XG4iLCBtc2ctPmxtX21hZ2ljKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9tc2dfc2V0X2Nvbm5fY250KTsKIAogdm9pZCBsdXN0cmVfbXNnX3NldF90aW1lb3V0KHN0cnVjdCBsdXN0cmVfbXNnICptc2csIF9fdTMyIHRpbWVvdXQpCiB7CkBAIC0xMzc3LDcgKzEzNTEsNyBAQAogCQlMQVNTRVJURihwYiwgImludmFsaWQgbXNnICVwOiBubyBwdGxycGMgYm9keSFcbiIsIG1zZyk7CiAKIAkJaWYgKGpvYmlkKQotCQkJbWVtY3B5KHBiLT5wYl9qb2JpZCwgam9iaWQsIEpPQlNUQVRTX0pPQklEX1NJWkUpOworCQkJbWVtY3B5KHBiLT5wYl9qb2JpZCwgam9iaWQsIExVU1RSRV9KT0JJRF9TSVpFKTsKIAkJZWxzZSBpZiAocGItPnBiX2pvYmlkWzBdID09ICdcMCcpCiAJCQlsdXN0cmVfZ2V0X2pvYmlkKHBiLT5wYl9qb2JpZCk7CiAJCXJldHVybjsKQEAgLTE0OTEsNyArMTQ2NSw2IEBACiAJICovCiAJQ0xBU1NFUlQob2Zmc2V0b2YodHlwZW9mKCpiKSwgcGJfam9iaWQpICE9IDApOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9wdGxycGNfYm9keSk7CiAKIHZvaWQgbHVzdHJlX3N3YWJfY29ubmVjdChzdHJ1Y3Qgb2JkX2Nvbm5lY3RfZGF0YSAqb2NkKQogewpAQCAtMTU5MSw3ICsxNTY0LDYgQEAKIAlDTEFTU0VSVChvZmZzZXRvZih0eXBlb2YoKm9zKSwgb3Nfc3BhcmU4KSAhPSAwKTsKIAlDTEFTU0VSVChvZmZzZXRvZih0eXBlb2YoKm9zKSwgb3Nfc3BhcmU5KSAhPSAwKTsKIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX3N3YWJfb2JkX3N0YXRmcyk7CiAKIHZvaWQgbHVzdHJlX3N3YWJfb2JkX2lvb2JqKHN0cnVjdCBvYmRfaW9vYmogKmlvbykKIHsKQEAgLTE1OTksMzMgKzE1NzEsMjggQEAKIAlfX3N3YWIzMnMoJmlvby0+aW9vX21heF9icncpOwogCV9fc3dhYjMycygmaW9vLT5pb29fYnVmY250KTsKIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX3N3YWJfb2JkX2lvb2JqKTsKIAogdm9pZCBsdXN0cmVfc3dhYl9uaW9idWZfcmVtb3RlKHN0cnVjdCBuaW9idWZfcmVtb3RlICpuYnIpCiB7Ci0JX19zd2FiNjRzKCZuYnItPm9mZnNldCk7Ci0JX19zd2FiMzJzKCZuYnItPmxlbik7Ci0JX19zd2FiMzJzKCZuYnItPmZsYWdzKTsKKwlfX3N3YWI2NHMoJm5ici0+cm5iX29mZnNldCk7CisJX19zd2FiMzJzKCZuYnItPnJuYl9sZW4pOworCV9fc3dhYjMycygmbmJyLT5ybmJfZmxhZ3MpOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9uaW9idWZfcmVtb3RlKTsKIAogdm9pZCBsdXN0cmVfc3dhYl9vc3RfYm9keShzdHJ1Y3Qgb3N0X2JvZHkgKmIpCiB7CiAJbHVzdHJlX3N3YWJfb2JkbygmYi0+b2EpOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9vc3RfYm9keSk7CiAKIHZvaWQgbHVzdHJlX3N3YWJfb3N0X2xhc3RfaWQodTY0ICppZCkKIHsKIAlfX3N3YWI2NHMoaWQpOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9vc3RfbGFzdF9pZCk7CiAKIHZvaWQgbHVzdHJlX3N3YWJfZ2VuZXJpY18zMnMoX191MzIgKnZhbCkKIHsKIAlfX3N3YWIzMnModmFsKTsKIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX3N3YWJfZ2VuZXJpY18zMnMpOwogCiB2b2lkIGx1c3RyZV9zd2FiX2dsX2Rlc2ModW5pb24gbGRsbV9nbF9kZXNjICpkZXNjKQogewpAQCAtMTY3NCwzNyArMTY0MSwzNiBAQAogCiB2b2lkIGx1c3RyZV9zd2FiX21kdF9ib2R5KHN0cnVjdCBtZHRfYm9keSAqYikKIHsKLQlsdXN0cmVfc3dhYl9sdV9maWQoJmItPmZpZDEpOwotCWx1c3RyZV9zd2FiX2x1X2ZpZCgmYi0+ZmlkMik7CisJbHVzdHJlX3N3YWJfbHVfZmlkKCZiLT5tYm9fZmlkMSk7CisJbHVzdHJlX3N3YWJfbHVfZmlkKCZiLT5tYm9fZmlkMik7CiAJLyogaGFuZGxlIGlzIG9wYXF1ZSAqLwotCV9fc3dhYjY0cygmYi0+dmFsaWQpOwotCV9fc3dhYjY0cygmYi0+c2l6ZSk7Ci0JX19zd2FiNjRzKCZiLT5tdGltZSk7Ci0JX19zd2FiNjRzKCZiLT5hdGltZSk7Ci0JX19zd2FiNjRzKCZiLT5jdGltZSk7Ci0JX19zd2FiNjRzKCZiLT5ibG9ja3MpOwotCV9fc3dhYjY0cygmYi0+aW9lcG9jaCk7Ci0JX19zd2FiNjRzKCZiLT50X3N0YXRlKTsKLQlfX3N3YWIzMnMoJmItPmZzdWlkKTsKLQlfX3N3YWIzMnMoJmItPmZzZ2lkKTsKLQlfX3N3YWIzMnMoJmItPmNhcGFiaWxpdHkpOwotCV9fc3dhYjMycygmYi0+bW9kZSk7Ci0JX19zd2FiMzJzKCZiLT51aWQpOwotCV9fc3dhYjMycygmYi0+Z2lkKTsKLQlfX3N3YWIzMnMoJmItPmZsYWdzKTsKLQlfX3N3YWIzMnMoJmItPnJkZXYpOwotCV9fc3dhYjMycygmYi0+bmxpbmspOwotCUNMQVNTRVJUKG9mZnNldG9mKHR5cGVvZigqYiksIHVudXNlZDIpICE9IDApOwotCV9fc3dhYjMycygmYi0+c3VwcGdpZCk7Ci0JX19zd2FiMzJzKCZiLT5lYWRhdGFzaXplKTsKLQlfX3N3YWIzMnMoJmItPmFjbHNpemUpOwotCV9fc3dhYjMycygmYi0+bWF4X21kc2l6ZSk7Ci0JX19zd2FiMzJzKCZiLT5tYXhfY29va2llc2l6ZSk7Ci0JX19zd2FiMzJzKCZiLT51aWRfaCk7Ci0JX19zd2FiMzJzKCZiLT5naWRfaCk7Ci0JQ0xBU1NFUlQob2Zmc2V0b2YodHlwZW9mKCpiKSwgcGFkZGluZ181KSAhPSAwKTsKKwlfX3N3YWI2NHMoJmItPm1ib192YWxpZCk7CisJX19zd2FiNjRzKCZiLT5tYm9fc2l6ZSk7CisJX19zd2FiNjRzKCZiLT5tYm9fbXRpbWUpOworCV9fc3dhYjY0cygmYi0+bWJvX2F0aW1lKTsKKwlfX3N3YWI2NHMoJmItPm1ib19jdGltZSk7CisJX19zd2FiNjRzKCZiLT5tYm9fYmxvY2tzKTsKKwlfX3N3YWI2NHMoJmItPm1ib19pb2Vwb2NoKTsKKwlfX3N3YWI2NHMoJmItPm1ib190X3N0YXRlKTsKKwlfX3N3YWIzMnMoJmItPm1ib19mc3VpZCk7CisJX19zd2FiMzJzKCZiLT5tYm9fZnNnaWQpOworCV9fc3dhYjMycygmYi0+bWJvX2NhcGFiaWxpdHkpOworCV9fc3dhYjMycygmYi0+bWJvX21vZGUpOworCV9fc3dhYjMycygmYi0+bWJvX3VpZCk7CisJX19zd2FiMzJzKCZiLT5tYm9fZ2lkKTsKKwlfX3N3YWIzMnMoJmItPm1ib19mbGFncyk7CisJX19zd2FiMzJzKCZiLT5tYm9fcmRldik7CisJX19zd2FiMzJzKCZiLT5tYm9fbmxpbmspOworCUNMQVNTRVJUKG9mZnNldG9mKHR5cGVvZigqYiksIG1ib191bnVzZWQyKSAhPSAwKTsKKwlfX3N3YWIzMnMoJmItPm1ib19zdXBwZ2lkKTsKKwlfX3N3YWIzMnMoJmItPm1ib19lYWRhdGFzaXplKTsKKwlfX3N3YWIzMnMoJmItPm1ib19hY2xzaXplKTsKKwlfX3N3YWIzMnMoJmItPm1ib19tYXhfbWRzaXplKTsKKwlfX3N3YWIzMnMoJmItPm1ib19tYXhfY29va2llc2l6ZSk7CisJX19zd2FiMzJzKCZiLT5tYm9fdWlkX2gpOworCV9fc3dhYjMycygmYi0+bWJvX2dpZF9oKTsKKwlDTEFTU0VSVChvZmZzZXRvZih0eXBlb2YoKmIpLCBtYm9fcGFkZGluZ181KSAhPSAwKTsKIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX3N3YWJfbWR0X2JvZHkpOwogCiB2b2lkIGx1c3RyZV9zd2FiX21kdF9pb2Vwb2NoKHN0cnVjdCBtZHRfaW9lcG9jaCAqYikKIHsKQEAgLTE3MTMsNyArMTY3OSw2IEBACiAJIF9fc3dhYjMycygmYi0+ZmxhZ3MpOwogCSBDTEFTU0VSVChvZmZzZXRvZih0eXBlb2YoKmIpLCBwYWRkaW5nKSAhPSAwKTsKIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX3N3YWJfbWR0X2lvZXBvY2gpOwogCiB2b2lkIGx1c3RyZV9zd2FiX21nc190YXJnZXRfaW5mbyhzdHJ1Y3QgbWdzX3RhcmdldF9pbmZvICptdGkpCiB7CkBAIC0xNzI5LDExICsxNjk0LDEwIEBACiAJZm9yIChpID0gMDsgaSA8IE1USV9OSURTX01BWDsgaSsrKQogCQlfX3N3YWI2NHMoJm10aS0+bXRpX25pZHNbaV0pOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9tZ3NfdGFyZ2V0X2luZm8pOwogCiB2b2lkIGx1c3RyZV9zd2FiX21nc19uaWR0YmxfZW50cnkoc3RydWN0IG1nc19uaWR0YmxfZW50cnkgKmVudHJ5KQogewotCWludCBpOworCV9fdTggaTsKIAogCV9fc3dhYjY0cygmZW50cnktPm1uZV92ZXJzaW9uKTsKIAlfX3N3YWIzMnMoJmVudHJ5LT5tbmVfaW5zdGFuY2UpOwpAQCAtMTc2MCwxNCArMTcyNCwxMiBAQAogCV9fc3dhYjMycygmYm9keS0+bWNiX3VuaXRzKTsKIAlfX3N3YWIxNnMoJmJvZHktPm1jYl90eXBlKTsKIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX3N3YWJfbWdzX2NvbmZpZ19ib2R5KTsKIAogdm9pZCBsdXN0cmVfc3dhYl9tZ3NfY29uZmlnX3JlcyhzdHJ1Y3QgbWdzX2NvbmZpZ19yZXMgKmJvZHkpCiB7CiAJX19zd2FiNjRzKCZib2R5LT5tY3Jfb2Zmc2V0KTsKIAlfX3N3YWI2NHMoJmJvZHktPm1jcl9zaXplKTsKIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX3N3YWJfbWdzX2NvbmZpZ19yZXMpOwogCiBzdGF0aWMgdm9pZCBsdXN0cmVfc3dhYl9vYmRfZHFpbmZvKHN0cnVjdCBvYmRfZHFpbmZvICppKQogewpAQCAtMTgwMCw3ICsxNzYyLDYgQEAKIAlsdXN0cmVfc3dhYl9vYmRfZHFpbmZvKCZxLT5xY19kcWluZm8pOwogCWx1c3RyZV9zd2FiX29iZF9kcWJsaygmcS0+cWNfZHFibGspOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9vYmRfcXVvdGFjdGwpOwogCiB2b2lkIGx1c3RyZV9zd2FiX2ZpZDJwYXRoKHN0cnVjdCBnZXRpbmZvX2ZpZDJwYXRoICpnZikKIHsKQEAgLTE4MjIsNyArMTc4Myw3IEBACiAKIHZvaWQgbHVzdHJlX3N3YWJfZmllbWFwKHN0cnVjdCBsbF91c2VyX2ZpZW1hcCAqZmllbWFwKQogewotCWludCBpOworCV9fdTMyIGk7CiAKIAlfX3N3YWI2NHMoJmZpZW1hcC0+Zm1fc3RhcnQpOwogCV9fc3dhYjY0cygmZmllbWFwLT5mbV9sZW5ndGgpOwpAQCAtMTgzNCw3ICsxNzk1LDYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgZmllbWFwLT5mbV9tYXBwZWRfZXh0ZW50czsgaSsrKQogCQlsdXN0cmVfc3dhYl9maWVtYXBfZXh0ZW50KCZmaWVtYXAtPmZtX2V4dGVudHNbaV0pOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9maWVtYXApOwogCiB2b2lkIGx1c3RyZV9zd2FiX21kdF9yZWNfcmVpbnQgKHN0cnVjdCBtZHRfcmVjX3JlaW50ICpycikKIHsKQEAgLTE4NjMsNyArMTgyMyw2IEBACiAKIAlDTEFTU0VSVChvZmZzZXRvZih0eXBlb2YoKnJyKSwgcnJfcGFkZGluZ180KSAhPSAwKTsKIH07Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX21kdF9yZWNfcmVpbnQpOwogCiB2b2lkIGx1c3RyZV9zd2FiX2xvdl9kZXNjKHN0cnVjdCBsb3ZfZGVzYyAqbGQpCiB7CkBAIC0xODc4LDE5ICsxODM3LDQzIEBACiB9CiBFWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX2xvdl9kZXNjKTsKIAotc3RhdGljIHZvaWQgcHJpbnRfbHVtKHN0cnVjdCBsb3ZfdXNlcl9tZCAqbHVtKQorLyogVGhpcyBzdHJ1Y3R1cmUgaXMgYWx3YXlzIGluIGxpdHRsZS1lbmRpYW4gKi8KK3N0YXRpYyB2b2lkIGx1c3RyZV9zd2FiX2xtdl9tZHNfbWRfdjEoc3RydWN0IGxtdl9tZHNfbWRfdjEgKmxtbTEpCiB7Ci0JQ0RFQlVHKERfT1RIRVIsICJsb3ZfdXNlcl9tZCAlcDpcbiIsIGx1bSk7Ci0JQ0RFQlVHKERfT1RIRVIsICJcdGxtbV9tYWdpYzogJSN4XG4iLCBsdW0tPmxtbV9tYWdpYyk7Ci0JQ0RFQlVHKERfT1RIRVIsICJcdGxtbV9wYXR0ZXJuOiAlI3hcbiIsIGx1bS0+bG1tX3BhdHRlcm4pOwotCUNERUJVRyhEX09USEVSLCAiXHRsbW1fb2JqZWN0X2lkOiAlbGx1XG4iLCBsbW1fb2lfaWQoJmx1bS0+bG1tX29pKSk7Ci0JQ0RFQlVHKERfT1RIRVIsICJcdGxtbV9vYmplY3RfZ3I6ICVsbHVcbiIsIGxtbV9vaV9zZXEoJmx1bS0+bG1tX29pKSk7Ci0JQ0RFQlVHKERfT1RIRVIsICJcdGxtbV9zdHJpcGVfc2l6ZTogJSN4XG4iLCBsdW0tPmxtbV9zdHJpcGVfc2l6ZSk7Ci0JQ0RFQlVHKERfT1RIRVIsICJcdGxtbV9zdHJpcGVfY291bnQ6ICUjeFxuIiwgbHVtLT5sbW1fc3RyaXBlX2NvdW50KTsKLQlDREVCVUcoRF9PVEhFUiwgIlx0bG1tX3N0cmlwZV9vZmZzZXQvbG1tX2xheW91dF9nZW46ICUjeFxuIiwKLQkgICAgICAgbHVtLT5sbW1fc3RyaXBlX29mZnNldCk7CisJaW50IGk7CisKKwlfX3N3YWIzMnMoJmxtbTEtPmxtdl9tYWdpYyk7CisJX19zd2FiMzJzKCZsbW0xLT5sbXZfc3RyaXBlX2NvdW50KTsKKwlfX3N3YWIzMnMoJmxtbTEtPmxtdl9tYXN0ZXJfbWR0X2luZGV4KTsKKwlfX3N3YWIzMnMoJmxtbTEtPmxtdl9oYXNoX3R5cGUpOworCV9fc3dhYjMycygmbG1tMS0+bG12X2xheW91dF92ZXJzaW9uKTsKKwlmb3IgKGkgPSAwOyBpIDwgbG1tMS0+bG12X3N0cmlwZV9jb3VudDsgaSsrKQorCQlsdXN0cmVfc3dhYl9sdV9maWQoJmxtbTEtPmxtdl9zdHJpcGVfZmlkc1tpXSk7CiB9CiAKK3ZvaWQgbHVzdHJlX3N3YWJfbG12X21kc19tZCh1bmlvbiBsbXZfbWRzX21kICpsbW0pCit7CisJc3dpdGNoIChsbW0tPmxtdl9tYWdpYykgeworCWNhc2UgTE1WX01BR0lDX1YxOgorCQlsdXN0cmVfc3dhYl9sbXZfbWRzX21kX3YxKCZsbW0tPmxtdl9tZF92MSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KK0VYUE9SVF9TWU1CT0wobHVzdHJlX3N3YWJfbG12X21kc19tZCk7CisKK3ZvaWQgbHVzdHJlX3N3YWJfbG12X3VzZXJfbWQoc3RydWN0IGxtdl91c2VyX21kICpsdW0pCit7CisJX19zd2FiMzJzKCZsdW0tPmx1bV9tYWdpYyk7CisJX19zd2FiMzJzKCZsdW0tPmx1bV9zdHJpcGVfY291bnQpOworCV9fc3dhYjMycygmbHVtLT5sdW1fc3RyaXBlX29mZnNldCk7CisJX19zd2FiMzJzKCZsdW0tPmx1bV9oYXNoX3R5cGUpOworCV9fc3dhYjMycygmbHVtLT5sdW1fdHlwZSk7CisJQ0xBU1NFUlQob2Zmc2V0b2YodHlwZW9mKCpsdW0pLCBsdW1fcGFkZGluZzEpKTsKK30KK0VYUE9SVF9TWU1CT0wobHVzdHJlX3N3YWJfbG12X3VzZXJfbWQpOworCiBzdGF0aWMgdm9pZCBsdXN0cmVfc3dhYl9sbW1fb2koc3RydWN0IG9zdF9pZCAqb2kpCiB7CiAJX19zd2FiNjRzKCZvaS0+b2kub2lfaWQpOwpAQCAtMTkwNSw3ICsxODg4LDYgQEAKIAlfX3N3YWIzMnMoJmx1bS0+bG1tX3N0cmlwZV9zaXplKTsKIAlfX3N3YWIxNnMoJmx1bS0+bG1tX3N0cmlwZV9jb3VudCk7CiAJX19zd2FiMTZzKCZsdW0tPmxtbV9zdHJpcGVfb2Zmc2V0KTsKLQlwcmludF9sdW0obHVtKTsKIH0KIAogdm9pZCBsdXN0cmVfc3dhYl9sb3ZfdXNlcl9tZF92MShzdHJ1Y3QgbG92X3VzZXJfbWRfdjEgKmx1bSkKQEAgLTE5NDEsOSArMTkyMyw5IEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc3RyaXBlX2NvdW50OyBpKyspIHsKLQkJbHVzdHJlX3N3YWJfb3N0X2lkKCYobG9kW2ldLmxfb3N0X29pKSk7Ci0JCV9fc3dhYjMycygmKGxvZFtpXS5sX29zdF9nZW4pKTsKLQkJX19zd2FiMzJzKCYobG9kW2ldLmxfb3N0X2lkeCkpOworCQlsdXN0cmVfc3dhYl9vc3RfaWQoJmxvZFtpXS5sX29zdF9vaSk7CisJCV9fc3dhYjMycygmbG9kW2ldLmxfb3N0X2dlbik7CisJCV9fc3dhYjMycygmbG9kW2ldLmxfb3N0X2lkeCk7CiAJfQogfQogRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9sb3ZfdXNlcl9tZF9vYmplY3RzKTsKQEAgLTE5NzMsNyArMTk1NSw2IEBACiB7CiAJX19zd2FiNjRzKCZpLT5vcGMpOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9sZGxtX2ludGVudCk7CiAKIHN0YXRpYyB2b2lkIGx1c3RyZV9zd2FiX2xkbG1fcmVzb3VyY2VfZGVzYyhzdHJ1Y3QgbGRsbV9yZXNvdXJjZV9kZXNjICpyKQogewpAQCAtMTk5Nyw3ICsxOTc4LDYgQEAKIAlfX3N3YWIzMnMoJnJxLT5sb2NrX2NvdW50KTsKIAkvKiBsb2NrX2hhbmRsZVtdIG9wYXF1ZSAqLwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9sZGxtX3JlcXVlc3QpOwogCiB2b2lkIGx1c3RyZV9zd2FiX2xkbG1fcmVwbHkoc3RydWN0IGxkbG1fcmVwbHkgKnIpCiB7CkBAIC0yMDA4LDcgKzE5ODgsNiBAQAogCV9fc3dhYjY0cygmci0+bG9ja19wb2xpY3lfcmVzMSk7CiAJX19zd2FiNjRzKCZyLT5sb2NrX3BvbGljeV9yZXMyKTsKIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX3N3YWJfbGRsbV9yZXBseSk7CiAKIC8qIER1bXAgZnVuY3Rpb25zICovCiB2b2lkIGR1bXBfaW9vKHN0cnVjdCBvYmRfaW9vYmogKmlvbykKQEAgLTIwMTgsMTQgKzE5OTcsMTIgQEAKIAkgICAgICAgUE9TVElEKCZpb28tPmlvb19vaWQpLCBpb28tPmlvb19tYXhfYnJ3LAogCSAgICAgICBpb28tPmlvb19idWZjbnQpOwogfQotRVhQT1JUX1NZTUJPTChkdW1wX2lvbyk7CiAKIHZvaWQgZHVtcF9ybmlvYnVmKHN0cnVjdCBuaW9idWZfcmVtb3RlICpuYikKIHsKIAlDREVCVUcoRF9SUENUUkFDRSwgIm5pb2J1Zl9yZW1vdGU6IG9mZnNldD0lbGx1LCBsZW49JWQsIGZsYWdzPSV4XG4iLAotCSAgICAgICBuYi0+b2Zmc2V0LCBuYi0+bGVuLCBuYi0+ZmxhZ3MpOworCSAgICAgICBuYi0+cm5iX29mZnNldCwgbmItPnJuYl9sZW4sIG5iLT5ybmJfZmxhZ3MpOwogfQotRVhQT1JUX1NZTUJPTChkdW1wX3JuaW9idWYpOwogCiBzdGF0aWMgdm9pZCBkdW1wX29iZG8oc3RydWN0IG9iZG8gKm9hKQogewpAQCAtMjA5MywxMyArMjA3MCwxMSBAQAogewogCWR1bXBfb2Jkbygmb2ItPm9hKTsKIH0KLUVYUE9SVF9TWU1CT0woZHVtcF9vc3RfYm9keSk7CiAKIHZvaWQgZHVtcF9yY3MoX191MzIgKnJjKQogewogCUNERUJVRyhEX1JQQ1RSQUNFLCAicm1mX3JjczogJWRcbiIsICpyYyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGR1bXBfcmNzKTsKIAogc3RhdGljIGlubGluZSBpbnQgcmVxX3B0bHJwY19ib2R5X3N3YWJiZWQoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpCiB7CkBAIC0yMTg0LDE0ICsyMTU5LDEyIEBACiAJX19zd2FiMzJzKCZjLT5sY190aW1lb3V0KTsKIAlfX3N3YWIzMnMoJmMtPmxjX2V4cGlyeSk7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX2x1c3RyZV9jYXBhKTsKIAogdm9pZCBsdXN0cmVfc3dhYl9oc21fdXNlcl9zdGF0ZShzdHJ1Y3QgaHNtX3VzZXJfc3RhdGUgKnN0YXRlKQogewogCV9fc3dhYjMycygmc3RhdGUtPmh1c19zdGF0ZXMpOwogCV9fc3dhYjMycygmc3RhdGUtPmh1c19hcmNoaXZlX2lkKTsKIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX3N3YWJfaHNtX3VzZXJfc3RhdGUpOwogCiB2b2lkIGx1c3RyZV9zd2FiX2hzbV9zdGF0ZV9zZXQoc3RydWN0IGhzbV9zdGF0ZV9zZXQgKmhzcykKIHsKQEAgLTIyMTQsMTQgKzIxODcsMTIgQEAKIAlfX3N3YWIzMnMoJmFjdGlvbi0+aGNhX2FjdGlvbik7CiAJbHVzdHJlX3N3YWJfaHNtX2V4dGVudCgmYWN0aW9uLT5oY2FfbG9jYXRpb24pOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9oc21fY3VycmVudF9hY3Rpb24pOwogCiB2b2lkIGx1c3RyZV9zd2FiX2hzbV91c2VyX2l0ZW0oc3RydWN0IGhzbV91c2VyX2l0ZW0gKmh1aSkKIHsKIAlsdXN0cmVfc3dhYl9sdV9maWQoJmh1aS0+aHVpX2ZpZCk7CiAJbHVzdHJlX3N3YWJfaHNtX2V4dGVudCgmaHVpLT5odWlfZXh0ZW50KTsKIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX3N3YWJfaHNtX3VzZXJfaXRlbSk7CiAKIHZvaWQgbHVzdHJlX3N3YWJfbGF5b3V0X2ludGVudChzdHJ1Y3QgbGF5b3V0X2ludGVudCAqbGkpCiB7CkBAIC0yMjMwLDcgKzIyMDEsNiBAQAogCV9fc3dhYjY0cygmbGktPmxpX3N0YXJ0KTsKIAlfX3N3YWI2NHMoJmxpLT5saV9lbmQpOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9sYXlvdXRfaW50ZW50KTsKIAogdm9pZCBsdXN0cmVfc3dhYl9oc21fcHJvZ3Jlc3Nfa2VybmVsKHN0cnVjdCBoc21fcHJvZ3Jlc3Nfa2VybmVsICpocGspCiB7CkBAIC0yMjQxLDcgKzIyMTEsNiBAQAogCV9fc3dhYjE2cygmaHBrLT5ocGtfZmxhZ3MpOwogCV9fc3dhYjE2cygmaHBrLT5ocGtfZXJydmFsKTsKIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX3N3YWJfaHNtX3Byb2dyZXNzX2tlcm5lbCk7CiAKIHZvaWQgbHVzdHJlX3N3YWJfaHNtX3JlcXVlc3Qoc3RydWN0IGhzbV9yZXF1ZXN0ICpocikKIHsKQEAgLTIyNTEsNyArMjIyMCw2IEBACiAJX19zd2FiMzJzKCZoci0+aHJfaXRlbWNvdW50KTsKIAlfX3N3YWIzMnMoJmhyLT5ocl9kYXRhX2xlbik7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX2hzbV9yZXF1ZXN0KTsKIAogdm9pZCBsdXN0cmVfc3dhYl9zd2FwX2xheW91dHMoc3RydWN0IG1kY19zd2FwX2xheW91dHMgKm1zbCkKIHsKQEAgLTIyNjQsNCArMjIzMiwzIEBACiAJbHVzdHJlX3N3YWJfbHVfZmlkKCZjZC0+Y2RfZmlkKTsKIAlfX3N3YWI2NHMoJmNkLT5jZF9kYXRhX3ZlcnNpb24pOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9jbG9zZV9kYXRhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wZXJzLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcGVycy5jCmluZGV4IDZjODIwZTkuLjViOWZiMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wZXJzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3BlcnMuYwpAQCAtNjQsOSArNjQsOSBAQAogewogCWxuZXRfa2lvdl90ICpraW92ID0gJmRlc2MtPmJkX2lvdltkZXNjLT5iZF9pb3ZfY291bnRdOwogCi0Ja2lvdi0+a2lvdl9wYWdlID0gcGFnZTsKLQlraW92LT5raW92X29mZnNldCA9IHBhZ2VvZmZzZXQ7Ci0Ja2lvdi0+a2lvdl9sZW4gPSBsZW47CisJa2lvdi0+YnZfcGFnZSA9IHBhZ2U7CisJa2lvdi0+YnZfb2Zmc2V0ID0gcGFnZW9mZnNldDsKKwlraW92LT5idl9sZW4gPSBsZW47CiAKIAlkZXNjLT5iZF9pb3ZfY291bnQrKzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9waW5nZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9waW5nZXIuYwppbmRleCBjMDUyOWQ4Li41NTA0ZmMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcGluZ2VyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3Bpbmdlci5jCkBAIC0zNDAsNyArMzQwLDYgQEAKIHsKIAlwdGxycGNfdXBkYXRlX25leHRfcGluZyhpbXAsIDApOwogfQotRVhQT1JUX1NZTUJPTChwdGxycGNfcGluZ2VyX3NlbmRpbmdfb25faW1wb3J0KTsKIAogdm9pZCBwdGxycGNfcGluZ2VyX2NvbW1pdF9leHBlY3RlZChzdHJ1Y3Qgb2JkX2ltcG9ydCAqaW1wKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3B0bHJwY19pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3B0bHJwY19pbnRlcm5hbC5oCmluZGV4IGE5ODMxZmEuLmYxNGQxOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wdGxycGNfaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcHRscnBjX2ludGVybmFsLmgKQEAgLTUzLDYgKzUzLDggQEAKIGludCBwdGxycGNkX3N0YXJ0KHN0cnVjdCBwdGxycGNkX2N0bCAqcGMpOwogCiAvKiBjbGllbnQuYyAqLwordm9pZCBwdGxycGNfYXRfYWRqX25ldF9sYXRlbmN5KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBzZXJ2aWNlX3RpbWUpOwogc3RydWN0IHB0bHJwY19idWxrX2Rlc2MgKnB0bHJwY19uZXdfYnVsayh1bnNpZ25lZCBucGFnZXMsIHVuc2lnbmVkIG1heF9icncsCiAJCQkJCSB1bnNpZ25lZCB0eXBlLCB1bnNpZ25lZCBwb3J0YWwpOwogaW50IHB0bHJwY19yZXF1ZXN0X2NhY2hlX2luaXQodm9pZCk7CkBAIC02MCw2ICs2MiwxMSBAQAogc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpwdGxycGNfcmVxdWVzdF9jYWNoZV9hbGxvYyhnZnBfdCBmbGFncyk7CiB2b2lkIHB0bHJwY19yZXF1ZXN0X2NhY2hlX2ZyZWUoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpOwogdm9pZCBwdGxycGNfaW5pdF94aWQodm9pZCk7Cit2b2lkIHB0bHJwY19zZXRfYWRkX25ld19yZXEoc3RydWN0IHB0bHJwY2RfY3RsICpwYywKKwkJCSAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSk7CitpbnQgcHRscnBjX2V4cGlyZWRfc2V0KHZvaWQgKmRhdGEpOworaW50IHB0bHJwY19zZXRfbmV4dF90aW1lb3V0KHN0cnVjdCBwdGxycGNfcmVxdWVzdF9zZXQgKik7Cit2b2lkIHB0bHJwY19yZXNlbmRfcmVxKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxdWVzdCk7CiAKIC8qIGV2ZW50cy5jICovCiBpbnQgcHRscnBjX2luaXRfcG9ydGFscyh2b2lkKTsKQEAgLTI2OCw3ICsyNzUsNyBAQAogaW50ICBzcHRscnBjX2luaXQodm9pZCk7CiB2b2lkIHNwdGxycGNfZmluaSh2b2lkKTsKIAotc3RhdGljIGlubGluZSBpbnQgbGxfcnBjX3JlY292ZXJhYmxlX2Vycm9yKGludCByYykKK3N0YXRpYyBpbmxpbmUgYm9vbCBwdGxycGNfcmVjb3ZlcmFibGVfZXJyb3IoaW50IHJjKQogewogCXJldHVybiAocmMgPT0gLUVOT1RDT05OIHx8IHJjID09IC1FTk9ERVYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3B0bHJwY2QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wdGxycGNkLmMKaW5kZXggMGEzNzRiNi4uMWY1NWQ2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3B0bHJwY2QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcHRscnBjZC5jCkBAIC00MTIsNyArNDEyLDcgQEAKIAkgKiBhbiBhcmd1bWVudCwgZGVzY3JpYmluZyBpdHMgInNjb3BlIi4KIAkgKi8KIAlyYyA9IGx1X2NvbnRleHRfaW5pdCgmZW52LmxlX2N0eCwKLQkJCSAgICAgTENUX0NMX1RIUkVBRHxMQ1RfUkVNRU1CRVJ8TENUX05PUkVGKTsKKwkJCSAgICAgTENUX0NMX1RIUkVBRCB8IExDVF9SRU1FTUJFUiB8IExDVF9OT1JFRik7CiAJaWYgKHJjID09IDApIHsKIAkJcmMgPSBsdV9jb250ZXh0X2luaXQoZW52LmxlX3NlcywKIAkJCQkgICAgIExDVF9TRVNTSU9OIHwgTENUX1JFTUVNQkVSIHwgTENUX05PUkVGKTsKQEAgLTU2Nyw3ICs1NjcsNyBAQAogCSAqIHB0bHJwY2QgdGhyZWFkIChvciBhIHRocmVhZC1zZXQpIGhhcyB0byBiZSBnaXZlbiBhbiBhcmd1bWVudCwKIAkgKiBkZXNjcmliaW5nIGl0cyAic2NvcGUiLgogCSAqLwotCXJjID0gbHVfY29udGV4dF9pbml0KCZwYy0+cGNfZW52LmxlX2N0eCwgTENUX0NMX1RIUkVBRHxMQ1RfUkVNRU1CRVIpOworCXJjID0gbHVfY29udGV4dF9pbml0KCZwYy0+cGNfZW52LmxlX2N0eCwgTENUX0NMX1RIUkVBRCB8IExDVF9SRU1FTUJFUik7CiAJaWYgKHJjICE9IDApCiAJCWdvdG8gb3V0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcmVjb3Zlci5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3JlY292ZXIuYwppbmRleCA3MThiM2E4Li40MDVmYWYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcmVjb3Zlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9yZWNvdmVyLmMKQEAgLTIwMSw3ICsyMDEsNiBAQAogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19yZXNlbmQpOwogCiAvKioKICAqIEdvIHRocm91Z2ggYWxsIHJlcXVlc3RzIGluIGRlbGF5ZWQgbGlzdCBhbmQgd2FrZSB0aGVpciB0aHJlYWRzCkBAIC0yMjEsNyArMjIwLDYgQEAKIAl9CiAJc3Bpbl91bmxvY2soJmltcC0+aW1wX2xvY2spOwogfQotRVhQT1JUX1NZTUJPTChwdGxycGNfd2FrZV9kZWxheWVkKTsKIAogdm9pZCBwdGxycGNfcmVxdWVzdF9oYW5kbGVfbm90Y29ubihzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKmZhaWxlZF9yZXEpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjLmMKaW5kZXggZGJkODE5Zi4uNWQzOTk1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWMuYwpAQCAtMzExLDYgKzMxMSwxOSBAQAogCXJldHVybiBzcHRscnBjX2ltcG9ydF9zZWNfYWRhcHQoaW1wLCBOVUxMLCBOVUxMKTsKIH0KIAorLyoqCisgKiBHZXQgYW5kIHZhbGlkYXRlIHRoZSBjbGllbnQgc2lkZSBwdGxycGMgc2VjdXJpdHkgZmFjaWxpdGllcyBmcm9tCisgKiBcYSBpbXAuIFRoZXJlIGlzIGEgcmFjZSBjb25kaXRpb24gb24gY2xpZW50IHJlY29ubmVjdCB3aGVuIHRoZSBpbXBvcnQgaXMKKyAqIGJlaW5nIGRlc3Ryb3llZCB3aGlsZSB0aGVyZSBhcmUgb3V0c3RhbmRpbmcgY2xpZW50IGJvdW5kIHJlcXVlc3RzLiBJbgorICogdGhpcyBjYXNlIGRvIG5vdCBvdXRwdXQgYW55IGVycm9yIG1lc3NhZ2VzIGlmIGltcG9ydCBzZWN1aXR5IGlzIG5vdAorICogZm91bmQuCisgKgorICogXHBhcmFtW2luXSBpbXAgb2JkIGltcG9ydCBhc3NvY2lhdGVkIHdpdGggY2xpZW50CisgKiBccGFyYW1bb3V0XSBzZWMgY2xpZW50IHNpZGUgcHRscnBjIHNlY3VyaXR5CisgKgorICogXHJldHZhbCAwIGlmIHNlY3VyaXR5IHJldHJpZXZlZCBzdWNjZXNzZnVsbHkKKyAqIFxyZXR2YWwgLXZlIGVycm5vIGlmIHRoZXJlIHdhcyBhIHByb2JsZW0KKyAqLwogc3RhdGljIGludCBpbXBvcnRfc2VjX3ZhbGlkYXRlX2dldChzdHJ1Y3Qgb2JkX2ltcG9ydCAqaW1wLAogCQkJCSAgIHN0cnVjdCBwdGxycGNfc2VjICoqc2VjKQogewpAQCAtMzIzLDkgKzMzNiwxMSBAQAogCX0KIAogCSpzZWMgPSBzcHRscnBjX2ltcG9ydF9zZWNfcmVmKGltcCk7CisJLyogT25seSBvdXRwdXQgYW4gZXJyb3Igd2hlbiB0aGUgaW1wb3J0IGlzIHN0aWxsIGFjdGl2ZSAqLwogCWlmICghKnNlYykgewotCQlDRVJST1IoImltcG9ydCAlcCAoJXMpIHdpdGggbm8gc2VjXG4iLAotCQkgICAgICAgaW1wLCBwdGxycGNfaW1wb3J0X3N0YXRlX25hbWUoaW1wLT5pbXBfc3RhdGUpKTsKKwkJaWYgKGxpc3RfZW1wdHkoJmltcC0+aW1wX3pvbWJpZV9jaGFpbikpCisJCQlDRVJST1IoImltcG9ydCAlcCAoJXMpIHdpdGggbm8gc2VjXG4iLAorCQkJICAgICAgIGltcCwgcHRscnBjX2ltcG9ydF9zdGF0ZV9uYW1lKGltcC0+aW1wX3N0YXRlKSk7CiAJCXJldHVybiAtRUFDQ0VTOwogCX0KIApAQCAtNDk5LDcgKzUxNCw3IEBACiAJCSAgICAgICBuZXdjdHgsIG5ld2N0eC0+Y2NfZmxhZ3MpOwogCiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoSFopOworCQlzY2hlZHVsZV90aW1lb3V0KG1zZWNzX3RvX2ppZmZpZXMoTVNFQ19QRVJfU0VDKSk7CiAJfSBlbHNlIHsKIAkJLyoKIAkJICogaXQncyBwb3NzaWJsZSBuZXdjdHggPT0gb2xkY3R4IGlmIHdlJ3JlIHN3aXRjaGluZwpAQCAtNzE4LDggKzczMyw5IEBACiAJcmVxLT5ycV9yZXN0YXJ0ID0gMDsKIAlzcGluX3VubG9jaygmcmVxLT5ycV9sb2NrKTsKIAotCWx3aSA9IExXSV9USU1FT1VUX0lOVFIodGltZW91dCAqIEhaLCBjdHhfcmVmcmVzaF90aW1lb3V0LAotCQkJICAgICAgIGN0eF9yZWZyZXNoX2ludGVycnVwdCwgcmVxKTsKKwlsd2kgPSBMV0lfVElNRU9VVF9JTlRSKG1zZWNzX3RvX2ppZmZpZXModGltZW91dCAqIE1TRUNfUEVSX1NFQyksCisJCQkgICAgICAgY3R4X3JlZnJlc2hfdGltZW91dCwgY3R4X3JlZnJlc2hfaW50ZXJydXB0LAorCQkJICAgICAgIHJlcSk7CiAJcmMgPSBsX3dhaXRfZXZlbnQocmVxLT5ycV9yZXBseV93YWl0cSwgY3R4X2NoZWNrX3JlZnJlc2goY3R4KSwgJmx3aSk7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlY19idWxrLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX2J1bGsuYwppbmRleCA1ZjRkNzk3Li5iMmNjNWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX2J1bGsuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX2J1bGsuYwpAQCAtMTM5LDcgKzEzOSw3IEBACiAJCSAgICJjYWNoZSBtaXNzaW5nOgkgICAlbHVcbiIKIAkJICAgImxvdyBmcmVlIG1hcms6CSAgICVsdVxuIgogCQkgICAibWF4IHdhaXRxdWV1ZSBkZXB0aDogICAgICV1XG4iCi0JCSAgICJtYXggd2FpdCB0aW1lOgkgICAlbGQvJXVcbiIsCisJCSAgICJtYXggd2FpdCB0aW1lOgkgICAlbGQvJWx1XG4iLAogCQkgICB0b3RhbHJhbV9wYWdlcywKIAkJICAgUEFHRVNfUEVSX1BPT0wsCiAJCSAgIHBhZ2VfcG9vbHMuZXBwX21heF9wYWdlcywKQEAgLTE1OCw3ICsxNTgsNyBAQAogCQkgICBwYWdlX3Bvb2xzLmVwcF9zdF9sb3dmcmVlLAogCQkgICBwYWdlX3Bvb2xzLmVwcF9zdF9tYXhfd3FsZW4sCiAJCSAgIHBhZ2VfcG9vbHMuZXBwX3N0X21heF93YWl0LAotCQkgICBIWik7CisJCSAgIG1zZWNzX3RvX2ppZmZpZXMoTVNFQ19QRVJfU0VDKSk7CiAKIAlzcGluX3VubG9jaygmcGFnZV9wb29scy5lcHBfbG9jayk7CiAKQEAgLTMyNiwxMiArMzI2LDEyIEBACiAJTEFTU0VSVChwYWdlX3Bvb2xzLmVwcF9wb29sc1twX2lkeF0pOwogCiAJZm9yIChpID0gMDsgaSA8IGRlc2MtPmJkX2lvdl9jb3VudDsgaSsrKSB7Ci0JCUxBU1NFUlQoZGVzYy0+YmRfZW5jX2lvdltpXS5raW92X3BhZ2UpOworCQlMQVNTRVJUKGRlc2MtPmJkX2VuY19pb3ZbaV0uYnZfcGFnZSk7CiAJCUxBU1NFUlQoZ19pZHggIT0gMCB8fCBwYWdlX3Bvb2xzLmVwcF9wb29sc1twX2lkeF0pOwogCQlMQVNTRVJUKCFwYWdlX3Bvb2xzLmVwcF9wb29sc1twX2lkeF1bZ19pZHhdKTsKIAogCQlwYWdlX3Bvb2xzLmVwcF9wb29sc1twX2lkeF1bZ19pZHhdID0KLQkJCQkJZGVzYy0+YmRfZW5jX2lvdltpXS5raW92X3BhZ2U7CisJCQkJCWRlc2MtPmJkX2VuY19pb3ZbaV0uYnZfcGFnZTsKIAogCQlpZiAoKytnX2lkeCA9PSBQQUdFU19QRVJfUE9PTCkgewogCQkJcF9pZHgrKzsKQEAgLTM0OCw3ICszNDgsNiBAQAogCWtmcmVlKGRlc2MtPmJkX2VuY19pb3YpOwogCWRlc2MtPmJkX2VuY19pb3YgPSBOVUxMOwogfQotRVhQT1JUX1NZTUJPTChzcHRscnBjX2VuY19wb29sX3B1dF9wYWdlcyk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlbmNfcG9vbHNfYWxsb2Modm9pZCkKIHsKQEAgLTQzMiwxMiArNDMxLDEzIEBACiAKIAlpZiAocGFnZV9wb29scy5lcHBfc3RfYWNjZXNzID4gMCkgewogCQlDREVCVUcoRF9TRUMsCi0JCSAgICAgICAibWF4IHBhZ2VzICVsdSwgZ3Jvd3MgJXUsIGdyb3cgZmFpbHMgJXUsIHNocmlua3MgJXUsIGFjY2VzcyAlbHUsIG1pc3NpbmcgJWx1LCBtYXggcWxlbiAldSwgbWF4IHdhaXQgJWxkLyVkXG4iLAorCQkgICAgICAgIm1heCBwYWdlcyAlbHUsIGdyb3dzICV1LCBncm93IGZhaWxzICV1LCBzaHJpbmtzICV1LCBhY2Nlc3MgJWx1LCBtaXNzaW5nICVsdSwgbWF4IHFsZW4gJXUsIG1heCB3YWl0ICVsZC8lbGRcbiIsCiAJCSAgICAgICBwYWdlX3Bvb2xzLmVwcF9zdF9tYXhfcGFnZXMsIHBhZ2VfcG9vbHMuZXBwX3N0X2dyb3dzLAogCQkgICAgICAgcGFnZV9wb29scy5lcHBfc3RfZ3Jvd19mYWlscywKIAkJICAgICAgIHBhZ2VfcG9vbHMuZXBwX3N0X3Nocmlua3MsIHBhZ2VfcG9vbHMuZXBwX3N0X2FjY2VzcywKIAkJICAgICAgIHBhZ2VfcG9vbHMuZXBwX3N0X21pc3NpbmdzLCBwYWdlX3Bvb2xzLmVwcF9zdF9tYXhfd3FsZW4sCi0JCSAgICAgICBwYWdlX3Bvb2xzLmVwcF9zdF9tYXhfd2FpdCwgSFopOworCQkgICAgICAgcGFnZV9wb29scy5lcHBfc3RfbWF4X3dhaXQsCisJCSAgICAgICBtc2Vjc190b19qaWZmaWVzKE1TRUNfUEVSX1NFQykpOwogCX0KIH0KIApAQCAtNDU2LDEzICs0NTYsMTEgQEAKIHsKIAlyZXR1cm4gY2ZzX2NyeXB0b19oYXNoX25hbWUoY2ZzX2hhc2hfYWxnX2lkW2hhc2hfYWxnXSk7CiB9Ci1FWFBPUlRfU1lNQk9MKHNwdGxycGNfZ2V0X2hhc2hfbmFtZSk7CiAKIF9fdTggc3B0bHJwY19nZXRfaGFzaF9hbGcoY29uc3QgY2hhciAqYWxnbmFtZSkKIHsKIAlyZXR1cm4gY2ZzX2NyeXB0b19oYXNoX2FsZyhhbGduYW1lKTsKIH0KLUVYUE9SVF9TWU1CT0woc3B0bHJwY19nZXRfaGFzaF9hbGcpOwogCiBpbnQgYnVsa19zZWNfZGVzY191bnBhY2soc3RydWN0IGx1c3RyZV9tc2cgKm1zZywgaW50IG9mZnNldCwgaW50IHN3YWJiZWQpCiB7CkBAIC01MjIsOSArNTIwLDEwIEBACiAJaGFzaHNpemUgPSBjZnNfY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShjZnNfaGFzaF9hbGdfaWRbYWxnXSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZGVzYy0+YmRfaW92X2NvdW50OyBpKyspIHsKLQkJY2ZzX2NyeXB0b19oYXNoX3VwZGF0ZV9wYWdlKGhkZXNjLCBkZXNjLT5iZF9pb3ZbaV0ua2lvdl9wYWdlLAotCQkJCSAgZGVzYy0+YmRfaW92W2ldLmtpb3Zfb2Zmc2V0ICYgflBBR0VfTUFTSywKLQkJCQkgIGRlc2MtPmJkX2lvdltpXS5raW92X2xlbik7CisJCWNmc19jcnlwdG9faGFzaF91cGRhdGVfcGFnZShoZGVzYywgZGVzYy0+YmRfaW92W2ldLmJ2X3BhZ2UsCisJCQkJCSAgICBkZXNjLT5iZF9pb3ZbaV0uYnZfb2Zmc2V0ICYKKwkJCQkJICAgIH5QQUdFX01BU0ssCisJCQkJCSAgICBkZXNjLT5iZF9pb3ZbaV0uYnZfbGVuKTsKIAl9CiAKIAlpZiAoaGFzaHNpemUgPiBidWZsZW4pIHsKQEAgLTU0Miw0ICs1NDEsMyBAQAogCiAJcmV0dXJuIGVycjsKIH0KLUVYUE9SVF9TWU1CT0woc3B0bHJwY19nZXRfYnVsa19jaGVja3N1bSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX2NvbmZpZy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlY19jb25maWcuYwppbmRleCBjMTQwMzU0Li4yMTgxYTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX2NvbmZpZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWNfY29uZmlnLmMKQEAgLTU4LDcgKzU4LDYgQEAKIAlDRVJST1IoInVua25vd24gdGFyZ2V0ICVwKCVzKVxuIiwgb2JkLCB0eXBlKTsKIAlyZXR1cm4gTFVTVFJFX1NQX0FOWTsKIH0KLUVYUE9SVF9TWU1CT0woc3B0bHJwY190YXJnZXRfc2VjX3BhcnQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogdXNlciBzdXBwbGllZCBmbGF2b3Igc3RyaW5nIHBhcnNpbmcgICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWNfZ2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWNfZ2MuYwppbmRleCA5Yjk4MDFlLi44ZmZkMDAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX2djLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlY19nYy5jCkBAIC03MSw3ICs3MSw2IEBACiAKIAlDREVCVUcoRF9TRUMsICJhZGRlZCBzZWMgJXAoJXMpXG4iLCBzZWMsIHNlYy0+cHNfcG9saWN5LT5zcF9uYW1lKTsKIH0KLUVYUE9SVF9TWU1CT0woc3B0bHJwY19nY19hZGRfc2VjKTsKIAogdm9pZCBzcHRscnBjX2djX2RlbF9zZWMoc3RydWN0IHB0bHJwY19zZWMgKnNlYykKIHsKQEAgLTk1LDcgKzk0LDYgQEAKIAogCUNERUJVRyhEX1NFQywgImRlbCBzZWMgJXAoJXMpXG4iLCBzZWMsIHNlYy0+cHNfcG9saWN5LT5zcF9uYW1lKTsKIH0KLUVYUE9SVF9TWU1CT0woc3B0bHJwY19nY19kZWxfc2VjKTsKIAogc3RhdGljIHZvaWQgc2VjX3Byb2Nlc3NfY3R4X2xpc3Qodm9pZCkKIHsKQEAgLTE4Miw3ICsxODAsOCBAQAogCQkvKiBjaGVjayBjdHggbGlzdCBhZ2FpbiBiZWZvcmUgc2xlZXAgKi8KIAkJc2VjX3Byb2Nlc3NfY3R4X2xpc3QoKTsKIAotCQlsd2kgPSBMV0lfVElNRU9VVChTRUNfR0NfSU5URVJWQUwgKiBIWiwgTlVMTCwgTlVMTCk7CisJCWx3aSA9IExXSV9USU1FT1VUKG1zZWNzX3RvX2ppZmZpZXMoU0VDX0dDX0lOVEVSVkFMICogTVNFQ19QRVJfU0VDKSwKKwkJCQkgIE5VTEwsIE5VTEwpOwogCQlsX3dhaXRfZXZlbnQodGhyZWFkLT50X2N0bF93YWl0cSwKIAkJCSAgICAgdGhyZWFkX2lzX3N0b3BwaW5nKHRocmVhZCkgfHwKIAkJCSAgICAgdGhyZWFkX2lzX3NpZ25hbCh0aHJlYWQpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlY19wbGFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlY19wbGFpbi5jCmluZGV4IDVjNDU5MGIuLmNkMzA1YmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWNfcGxhaW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX3BsYWluLmMKQEAgLTE1NCwxMyArMTU0LDEzIEBACiAJdW5zaWduZWQgaW50IG9mZiwgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBkZXNjLT5iZF9pb3ZfY291bnQ7IGkrKykgewotCQlpZiAoZGVzYy0+YmRfaW92W2ldLmtpb3ZfbGVuID09IDApCisJCWlmIChkZXNjLT5iZF9pb3ZbaV0uYnZfbGVuID09IDApCiAJCQljb250aW51ZTsKIAotCQlwdHIgPSBrbWFwKGRlc2MtPmJkX2lvdltpXS5raW92X3BhZ2UpOwotCQlvZmYgPSBkZXNjLT5iZF9pb3ZbaV0ua2lvdl9vZmZzZXQgJiB+UEFHRV9NQVNLOworCQlwdHIgPSBrbWFwKGRlc2MtPmJkX2lvdltpXS5idl9wYWdlKTsKKwkJb2ZmID0gZGVzYy0+YmRfaW92W2ldLmJ2X29mZnNldCAmIH5QQUdFX01BU0s7CiAJCXB0cltvZmZdIF49IDB4MTsKLQkJa3VubWFwKGRlc2MtPmJkX2lvdltpXS5raW92X3BhZ2UpOworCQlrdW5tYXAoZGVzYy0+YmRfaW92W2ldLmJ2X3BhZ2UpOwogCQlyZXR1cm47CiAJfQogfQpAQCAtMjQ5LDkgKzI0OSwxMiBAQAogCQl1bnNpZ25lZCBpbnQgaHNpemUgPSA0OwogCiAJCWNmc19jcnlwdG9faGFzaF9kaWdlc3QoQ0ZTX0hBU0hfQUxHX0NSQzMyLAotCQkJCWx1c3RyZV9tc2dfYnVmKG1zZywgUExBSU5fUEFDS19NU0dfT0ZGLCAwKSwKLQkJCQlsdXN0cmVfbXNnX2J1Zmxlbihtc2csIFBMQUlOX1BBQ0tfTVNHX09GRiksCi0JCQkJTlVMTCwgMCwgKHVuc2lnbmVkIGNoYXIgKikmY2tzdW0sICZoc2l6ZSk7CisJCQkJICAgICAgIGx1c3RyZV9tc2dfYnVmKG1zZywgUExBSU5fUEFDS19NU0dfT0ZGLAorCQkJCQkJICAgICAgMCksCisJCQkJICAgICAgIGx1c3RyZV9tc2dfYnVmbGVuKG1zZywKKwkJCQkJCQkgUExBSU5fUEFDS19NU0dfT0ZGKSwKKwkJCQkgICAgICAgTlVMTCwgMCwgKHVuc2lnbmVkIGNoYXIgKikmY2tzdW0sCisJCQkJICAgICAgICZoc2l6ZSk7CiAJCWlmIChja3N1bSAhPSBtc2ctPmxtX2Nrc3VtKSB7CiAJCQlDREVCVUcoRF9TRUMsCiAJCQkgICAgICAgImVhcmx5IHJlcGx5IGNoZWNrc3VtIG1pc21hdGNoOiAlMDh4ICE9ICUwOHhcbiIsCkBAIC0zNDksMTEgKzM1MiwxMSBAQAogCiAJLyogZml4IHRoZSBhY3R1YWwgZGF0YSBzaXplICovCiAJZm9yIChpID0gMCwgbm9iID0gMDsgaSA8IGRlc2MtPmJkX2lvdl9jb3VudDsgaSsrKSB7Ci0JCWlmIChkZXNjLT5iZF9pb3ZbaV0ua2lvdl9sZW4gKyBub2IgPiBkZXNjLT5iZF9ub2JfdHJhbnNmZXJyZWQpIHsKLQkJCWRlc2MtPmJkX2lvdltpXS5raW92X2xlbiA9CisJCWlmIChkZXNjLT5iZF9pb3ZbaV0uYnZfbGVuICsgbm9iID4gZGVzYy0+YmRfbm9iX3RyYW5zZmVycmVkKSB7CisJCQlkZXNjLT5iZF9pb3ZbaV0uYnZfbGVuID0KIAkJCQlkZXNjLT5iZF9ub2JfdHJhbnNmZXJyZWQgLSBub2I7CiAJCX0KLQkJbm9iICs9IGRlc2MtPmJkX2lvdltpXS5raW92X2xlbjsKKwkJbm9iICs9IGRlc2MtPmJkX2lvdltpXS5idl9sZW47CiAJfQogCiAJcmMgPSBwbGFpbl92ZXJpZnlfYnVsa19jc3VtKGRlc2MsIHJlcS0+cnFfZmx2ci51X2J1bGsuaGFzaC5oYXNoX2FsZywKQEAgLTg2OSw5ICs4NzIsMTIgQEAKIAkJdW5zaWduZWQgaW50IGhzaXplID0gNDsKIAogCQljZnNfY3J5cHRvX2hhc2hfZGlnZXN0KENGU19IQVNIX0FMR19DUkMzMiwKLQkJCWx1c3RyZV9tc2dfYnVmKG1zZywgUExBSU5fUEFDS19NU0dfT0ZGLCAwKSwKLQkJCWx1c3RyZV9tc2dfYnVmbGVuKG1zZywgUExBSU5fUEFDS19NU0dfT0ZGKSwKLQkJCU5VTEwsIDAsICh1bnNpZ25lZCBjaGFyICopJm1zZy0+bG1fY2tzdW0sICZoc2l6ZSk7CisJCQkJICAgICAgIGx1c3RyZV9tc2dfYnVmKG1zZywgUExBSU5fUEFDS19NU0dfT0ZGLAorCQkJCQkJICAgICAgMCksCisJCQkJICAgICAgIGx1c3RyZV9tc2dfYnVmbGVuKG1zZywKKwkJCQkJCQkgUExBSU5fUEFDS19NU0dfT0ZGKSwKKwkJCQkgICAgICAgTlVMTCwgMCwgKHVuc2lnbmVkIGNoYXIgKikmbXNnLT5sbV9ja3N1bSwKKwkJCQkgICAgICAgJmhzaXplKTsKIAkJcmVxLT5ycV9yZXBseV9vZmYgPSAwOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlcnZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZXJ2aWNlLmMKaW5kZXggNDc4OGM0OS4uNzJmMzkzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlcnZpY2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VydmljZS5jCkBAIC0xMDA1LDYgKzEwMDUsMTAgQEAKIAlhcnJheS0+cGFhX2NvdW50LS07CiB9CiAKKy8qCisgKiBBdHRlbXB0IHRvIGV4dGVuZCB0aGUgcmVxdWVzdCBkZWFkbGluZSBieSBzZW5kaW5nIGFuIGVhcmx5IHJlcGx5IHRvIHRoZQorICogY2xpZW50LgorICovCiBzdGF0aWMgaW50IHB0bHJwY19hdF9zZW5kX2Vhcmx5X3JlcGx5KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKQogewogCXN0cnVjdCBwdGxycGNfc2VydmljZV9wYXJ0ICpzdmNwdCA9IHJlcS0+cnFfcnFiZC0+cnFiZF9zdmNwdDsKQEAgLTEwMzksMjQgKzEwNDMsMjYgQEAKIAkJcmV0dXJuIC1FTk9TWVM7CiAJfQogCi0JLyogRmFrZSBvdXIgcHJvY2Vzc2luZyB0aW1lIGludG8gdGhlIGZ1dHVyZSB0byBhc2sgdGhlIGNsaWVudHMKLQkgKiBmb3Igc29tZSBleHRyYSBhbW91bnQgb2YgdGltZQorCS8qCisJICogV2Ugd2FudCB0byBleHRlbmQgdGhlIHJlcXVlc3QgZGVhZGxpbmUgYnkgYXRfZXh0cmEgc2Vjb25kcywKKwkgKiBzbyB3ZSBzZXQgb3VyIHNlcnZpY2UgZXN0aW1hdGUgdG8gcmVmbGVjdCBob3cgbXVjaCB0aW1lIGhhcworCSAqIHBhc3NlZCBzaW5jZSB0aGlzIHJlcXVlc3QgYXJyaXZlZCBwbHVzIGFuIGFkZGl0aW9uYWwKKwkgKiBhdF9leHRyYSBzZWNvbmRzLiBUaGUgY2xpZW50IHdpbGwgY2FsY3VsYXRlIHRoZSBuZXcgZGVhZGxpbmUKKwkgKiBiYXNlZCBvbiB0aGlzIHNlcnZpY2UgZXN0aW1hdGUgKHBsdXMgc29tZSBhZGRpdGlvbmFsIHRpbWUgdG8KKwkgKiBhY2NvdW50IGZvciBuZXR3b3JrIGxhdGVuY3kpLiBTZWUgcHRscnBjX2F0X3JlY3ZfZWFybHlfcmVwbHkKIAkgKi8KIAlhdF9tZWFzdXJlZCgmc3ZjcHQtPnNjcF9hdF9lc3RpbWF0ZSwgYXRfZXh0cmEgKwogCQkgICAga3RpbWVfZ2V0X3JlYWxfc2Vjb25kcygpIC0gcmVxLT5ycV9hcnJpdmFsX3RpbWUudHZfc2VjKTsKKwluZXdkbCA9IHJlcS0+cnFfYXJyaXZhbF90aW1lLnR2X3NlYyArIGF0X2dldCgmc3ZjcHQtPnNjcF9hdF9lc3RpbWF0ZSk7CiAKIAkvKiBDaGVjayB0byBzZWUgaWYgd2UndmUgYWN0dWFsbHkgaW5jcmVhc2VkIHRoZSBkZWFkbGluZSAtCiAJICogd2UgbWF5IGJlIHBhc3QgYWRhcHRpdmVfbWF4CiAJICovCi0JaWYgKHJlcS0+cnFfZGVhZGxpbmUgPj0gcmVxLT5ycV9hcnJpdmFsX3RpbWUudHZfc2VjICsKLQkgICAgYXRfZ2V0KCZzdmNwdC0+c2NwX2F0X2VzdGltYXRlKSkgeworCWlmIChyZXEtPnJxX2RlYWRsaW5lID49IG5ld2RsKSB7CiAJCURFQlVHX1JFUShEX1dBUk5JTkcsIHJlcSwgIkNvdWxkbid0IGFkZCBhbnkgdGltZSAoJWxkLyVsbGQpLCBub3Qgc2VuZGluZyBlYXJseSByZXBseVxuIiwKLQkJCSAgb2xkZGwsIHJlcS0+cnFfYXJyaXZhbF90aW1lLnR2X3NlYyArCi0JCQkgIGF0X2dldCgmc3ZjcHQtPnNjcF9hdF9lc3RpbWF0ZSkgLQotCQkJICBrdGltZV9nZXRfcmVhbF9zZWNvbmRzKCkpOworCQkJICBvbGRkbCwgbmV3ZGwgLSBrdGltZV9nZXRfcmVhbF9zZWNvbmRzKCkpOwogCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAl9Ci0JbmV3ZGwgPSBrdGltZV9nZXRfcmVhbF9zZWNvbmRzKCkgKyBhdF9nZXQoJnN2Y3B0LT5zY3BfYXRfZXN0aW1hdGUpOwogCiAJcmVxY29weSA9IHB0bHJwY19yZXF1ZXN0X2NhY2hlX2FsbG9jKEdGUF9OT0ZTKTsKIAlpZiAoIXJlcWNvcHkpCkBAIC0xOTgyLDExICsxOTg4LDEyIEBACiAJY29uZF9yZXNjaGVkKCk7CiAKIAlsX3dhaXRfZXZlbnRfZXhjbHVzaXZlX2hlYWQoc3ZjcHQtPnNjcF93YWl0cSwKLQkJCQlwdGxycGNfdGhyZWFkX3N0b3BwaW5nKHRocmVhZCkgfHwKLQkJCQlwdGxycGNfc2VydmVyX3JlcXVlc3RfaW5jb21pbmcoc3ZjcHQpIHx8Ci0JCQkJcHRscnBjX3NlcnZlcl9yZXF1ZXN0X3BlbmRpbmcoc3ZjcHQsIGZhbHNlKSB8fAotCQkJCXB0bHJwY19ycWJkX3BlbmRpbmcoc3ZjcHQpIHx8Ci0JCQkJcHRscnBjX2F0X2NoZWNrKHN2Y3B0KSwgJmx3aSk7CisJCQkJICAgIHB0bHJwY190aHJlYWRfc3RvcHBpbmcodGhyZWFkKSB8fAorCQkJCSAgICBwdGxycGNfc2VydmVyX3JlcXVlc3RfaW5jb21pbmcoc3ZjcHQpIHx8CisJCQkJICAgIHB0bHJwY19zZXJ2ZXJfcmVxdWVzdF9wZW5kaW5nKHN2Y3B0LAorCQkJCQkJCQkgIGZhbHNlKSB8fAorCQkJCSAgICBwdGxycGNfcnFiZF9wZW5kaW5nKHN2Y3B0KSB8fAorCQkJCSAgICBwdGxycGNfYXRfY2hlY2soc3ZjcHQpLCAmbHdpKTsKIAogCWlmIChwdGxycGNfdGhyZWFkX3N0b3BwaW5nKHRocmVhZCkpCiAJCXJldHVybiAtRUlOVFI7CkBAIC0yMDQ5LDcgKzIwNTYsNyBAQAogCX0KIAogCXJjID0gbHVfY29udGV4dF9pbml0KCZlbnYtPmxlX2N0eCwKLQkJCSAgICAgc3ZjLT5zcnZfY3R4X3RhZ3N8TENUX1JFTUVNQkVSfExDVF9OT1JFRik7CisJCQkgICAgIHN2Yy0+c3J2X2N0eF90YWdzIHwgTENUX1JFTUVNQkVSIHwgTENUX05PUkVGKTsKIAlpZiAocmMpCiAJCWdvdG8gb3V0X3Nydl9maW5pOwogCkBAIC0yMzQ5LDcgKzIzNTYsNyBAQAogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZ6b21iaWUpKSB7CiAJCXRocmVhZCA9IGxpc3RfZW50cnkoem9tYmllLm5leHQsCi0JCQkJCXN0cnVjdCBwdGxycGNfdGhyZWFkLCB0X2xpbmspOworCQkJCSAgICBzdHJ1Y3QgcHRscnBjX3RocmVhZCwgdF9saW5rKTsKIAkJbGlzdF9kZWwoJnRocmVhZC0+dF9saW5rKTsKIAkJa2ZyZWUodGhyZWFkKTsKIAl9CkBAIC0yMzk4LDcgKzI0MDUsNiBAQAogCXB0bHJwY19zdG9wX2FsbF90aHJlYWRzKHN2Yyk7CiAJcmV0dXJuIHJjOwogfQotRVhQT1JUX1NZTUJPTChwdGxycGNfc3RhcnRfdGhyZWFkcyk7CiAKIGludCBwdGxycGNfc3RhcnRfdGhyZWFkKHN0cnVjdCBwdGxycGNfc2VydmljZV9wYXJ0ICpzdmNwdCwgaW50IHdhaXQpCiB7CkBAIC0yNTM5LDggKzI1NDUsOCBAQAogCQlMQVNTRVJUKGhycC0+aHJwX250aHJzID4gMCk7CiAJCWhycC0+aHJwX3RocnMgPQogCQkJa3phbGxvY19ub2RlKGhycC0+aHJwX250aHJzICogc2l6ZW9mKCpocnQpLCBHRlBfTk9GUywKLQkJCQljZnNfY3B0X3NwcmVhZF9ub2RlKHB0bHJwY19oci5ocl9jcHRfdGFibGUsCi0JCQkJCQkgICAgaSkpOworCQkJCSAgICAgY2ZzX2NwdF9zcHJlYWRfbm9kZShwdGxycGNfaHIuaHJfY3B0X3RhYmxlLAorCQkJCQkJCSBpKSk7CiAJCWlmICghaHJwLT5ocnBfdGhycykgewogCQkJcmMgPSAtRU5PTUVNOwogCQkJZ290byBvdXQ7CkBAIC0yNTkzLDcgKzI1OTksOCBAQAogCQkJCQkJICAgICBOVUxMLCBOVUxMKTsKIAogCQlyYyA9IGxfd2FpdF9ldmVudChzdmNwdC0+c2NwX3dhaXRxLAotCQkgICAgIGF0b21pY19yZWFkKCZzdmNwdC0+c2NwX25yZXBzX2RpZmZpY3VsdCkgPT0gMCwgJmx3aSk7CisJCQkJICBhdG9taWNfcmVhZCgmc3ZjcHQtPnNjcF9ucmVwc19kaWZmaWN1bHQpID09IDAsCisJCQkJICAmbHdpKTsKIAkJaWYgKHJjID09IDApCiAJCQlicmVhazsKIAkJQ1dBUk4oIlVuZXhwZWN0ZWRseSBsb25nIHRpbWVvdXQgJXMgJXBcbiIsCkBAIC0yNjM5LDcgKzI2NDYsNyBAQAogCQkgKiBldmVudCB3aXRoIGl0cyAndW5saW5rJyBmbGFnIHNldCBmb3IgZWFjaCBwb3N0ZWQgcnFiZAogCQkgKi8KIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShycWJkLCAmc3ZjcHQtPnNjcF9ycWJkX3Bvc3RlZCwKLQkJCQkJcnFiZF9saXN0KSB7CisJCQkJICAgIHJxYmRfbGlzdCkgewogCQkJcmMgPSBMTmV0TURVbmxpbmsocnFiZC0+cnFiZF9tZF9oKTsKIAkJCUxBU1NFUlQocmMgPT0gMCB8fCByYyA9PSAtRU5PRU5UKTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3dpcmV0ZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvd2lyZXRlc3QuYwppbmRleCA2Y2MyYjJlLi5lNTk0NWUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvd2lyZXRlc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvd2lyZXRlc3QuYwpAQCAtMTkwLDI4ICsxOTAsMzAgQEAKIAkJIChsb25nIGxvbmcpUkVJTlRfU0VUWEFUVFIpOwogCUxBU1NFUlRGKFJFSU5UX1JNRU5UUlkgPT0gOCwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKVJFSU5UX1JNRU5UUlkpOwotCUxBU1NFUlRGKFJFSU5UX01BWCA9PSA5LCAiZm91bmQgJWxsZFxuIiwKKwlMQVNTRVJURihSRUlOVF9NSUdSQVRFID09IDksICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZylSRUlOVF9NSUdSQVRFKTsKKwlMQVNTRVJURihSRUlOVF9NQVggPT0gMTAsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZylSRUlOVF9NQVgpOwogCUxBU1NFUlRGKERJU1BfSVRfRVhFQ0QgPT0gMHgwMDAwMDAwMVVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClESVNQX0lUX0VYRUNEKTsKKwkJICh1bnNpZ25lZClESVNQX0lUX0VYRUNEKTsKIAlMQVNTRVJURihESVNQX0xPT0tVUF9FWEVDRCA9PSAweDAwMDAwMDAyVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKURJU1BfTE9PS1VQX0VYRUNEKTsKKwkJICh1bnNpZ25lZClESVNQX0xPT0tVUF9FWEVDRCk7CiAJTEFTU0VSVEYoRElTUF9MT09LVVBfTkVHID09IDB4MDAwMDAwMDRVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpRElTUF9MT09LVVBfTkVHKTsKKwkJICh1bnNpZ25lZClESVNQX0xPT0tVUF9ORUcpOwogCUxBU1NFUlRGKERJU1BfTE9PS1VQX1BPUyA9PSAweDAwMDAwMDA4VUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKURJU1BfTE9PS1VQX1BPUyk7CisJCSAodW5zaWduZWQpRElTUF9MT09LVVBfUE9TKTsKIAlMQVNTRVJURihESVNQX09QRU5fQ1JFQVRFID09IDB4MDAwMDAwMTBVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpRElTUF9PUEVOX0NSRUFURSk7CisJCSAodW5zaWduZWQpRElTUF9PUEVOX0NSRUFURSk7CiAJTEFTU0VSVEYoRElTUF9PUEVOX09QRU4gPT0gMHgwMDAwMDAyMFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClESVNQX09QRU5fT1BFTik7CisJCSAodW5zaWduZWQpRElTUF9PUEVOX09QRU4pOwogCUxBU1NFUlRGKERJU1BfRU5RX0NPTVBMRVRFID09IDB4MDA0MDAwMDBVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpRElTUF9FTlFfQ09NUExFVEUpOworCQkgKHVuc2lnbmVkKURJU1BfRU5RX0NPTVBMRVRFKTsKIAlMQVNTRVJURihESVNQX0VOUV9PUEVOX1JFRiA9PSAweDAwODAwMDAwVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKURJU1BfRU5RX09QRU5fUkVGKTsKKwkJICh1bnNpZ25lZClESVNQX0VOUV9PUEVOX1JFRik7CiAJTEFTU0VSVEYoRElTUF9FTlFfQ1JFQVRFX1JFRiA9PSAweDAxMDAwMDAwVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKURJU1BfRU5RX0NSRUFURV9SRUYpOworCQkgKHVuc2lnbmVkKURJU1BfRU5RX0NSRUFURV9SRUYpOwogCUxBU1NFUlRGKERJU1BfT1BFTl9MT0NLID09IDB4MDIwMDAwMDBVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpRElTUF9PUEVOX0xPQ0spOworCQkgKHVuc2lnbmVkKURJU1BfT1BFTl9MT0NLKTsKIAlMQVNTRVJURihNRFNfU1RBVFVTX0NPTk4gPT0gMSwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKU1EU19TVEFUVVNfQ09OTik7CiAJTEFTU0VSVEYoTURTX1NUQVRVU19MT1YgPT0gMiwgImZvdW5kICVsbGRcbiIsCkBAIC0yMTksNTUgKzIyMSw1NSBAQAogCUxBU1NFUlRGKExVU1RSRV9CRkxBR19VTkNPTU1JVFRFRF9XUklURVMgPT0gMSwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKUxVU1RSRV9CRkxBR19VTkNPTU1JVFRFRF9XUklURVMpOwogCUxBU1NFUlRGKE1GX1NPTV9DSEFOR0UgPT0gMHgwMDAwMDAwMVVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNRl9TT01fQ0hBTkdFKTsKKwkJICh1bnNpZ25lZClNRl9TT01fQ0hBTkdFKTsKIAlMQVNTRVJURihNRl9FUE9DSF9PUEVOID09IDB4MDAwMDAwMDJVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTUZfRVBPQ0hfT1BFTik7CisJCSAodW5zaWduZWQpTUZfRVBPQ0hfT1BFTik7CiAJTEFTU0VSVEYoTUZfRVBPQ0hfQ0xPU0UgPT0gMHgwMDAwMDAwNFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNRl9FUE9DSF9DTE9TRSk7CisJCSAodW5zaWduZWQpTUZfRVBPQ0hfQ0xPU0UpOwogCUxBU1NFUlRGKE1GX01EQ19DQU5DRUxfRklEMSA9PSAweDAwMDAwMDA4VUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU1GX01EQ19DQU5DRUxfRklEMSk7CisJCSAodW5zaWduZWQpTUZfTURDX0NBTkNFTF9GSUQxKTsKIAlMQVNTRVJURihNRl9NRENfQ0FOQ0VMX0ZJRDIgPT0gMHgwMDAwMDAxMFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNRl9NRENfQ0FOQ0VMX0ZJRDIpOworCQkgKHVuc2lnbmVkKU1GX01EQ19DQU5DRUxfRklEMik7CiAJTEFTU0VSVEYoTUZfTURDX0NBTkNFTF9GSUQzID09IDB4MDAwMDAwMjBVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTUZfTURDX0NBTkNFTF9GSUQzKTsKKwkJICh1bnNpZ25lZClNRl9NRENfQ0FOQ0VMX0ZJRDMpOwogCUxBU1NFUlRGKE1GX01EQ19DQU5DRUxfRklENCA9PSAweDAwMDAwMDQwVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU1GX01EQ19DQU5DRUxfRklENCk7CisJCSAodW5zaWduZWQpTUZfTURDX0NBTkNFTF9GSUQ0KTsKIAlMQVNTRVJURihNRl9TT01fQVUgPT0gMHgwMDAwMDA4MFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNRl9TT01fQVUpOworCQkgKHVuc2lnbmVkKU1GX1NPTV9BVSk7CiAJTEFTU0VSVEYoTUZfR0VUQVRUUl9MT0NLID09IDB4MDAwMDAxMDBVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTUZfR0VUQVRUUl9MT0NLKTsKKwkJICh1bnNpZ25lZClNRl9HRVRBVFRSX0xPQ0spOwogCUxBU1NFUlRGKE1EU19BVFRSX01PREUgPT0gMHgwMDAwMDAwMDAwMDAwMDAxVUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylNRFNfQVRUUl9NT0RFKTsKKwkJIChsb25nIGxvbmcpTURTX0FUVFJfTU9ERSk7CiAJTEFTU0VSVEYoTURTX0FUVFJfVUlEID09IDB4MDAwMDAwMDAwMDAwMDAwMlVMTCwgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwKLQkJCShsb25nIGxvbmcpTURTX0FUVFJfVUlEKTsKKwkJIChsb25nIGxvbmcpTURTX0FUVFJfVUlEKTsKIAlMQVNTRVJURihNRFNfQVRUUl9HSUQgPT0gMHgwMDAwMDAwMDAwMDAwMDA0VUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylNRFNfQVRUUl9HSUQpOworCQkgKGxvbmcgbG9uZylNRFNfQVRUUl9HSUQpOwogCUxBU1NFUlRGKE1EU19BVFRSX1NJWkUgPT0gMHgwMDAwMDAwMDAwMDAwMDA4VUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylNRFNfQVRUUl9TSVpFKTsKKwkJIChsb25nIGxvbmcpTURTX0FUVFJfU0laRSk7CiAJTEFTU0VSVEYoTURTX0FUVFJfQVRJTUUgPT0gMHgwMDAwMDAwMDAwMDAwMDEwVUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylNRFNfQVRUUl9BVElNRSk7CisJCSAobG9uZyBsb25nKU1EU19BVFRSX0FUSU1FKTsKIAlMQVNTRVJURihNRFNfQVRUUl9NVElNRSA9PSAweDAwMDAwMDAwMDAwMDAwMjBVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKU1EU19BVFRSX01USU1FKTsKKwkJIChsb25nIGxvbmcpTURTX0FUVFJfTVRJTUUpOwogCUxBU1NFUlRGKE1EU19BVFRSX0NUSU1FID09IDB4MDAwMDAwMDAwMDAwMDA0MFVMTCwgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwKLQkJCShsb25nIGxvbmcpTURTX0FUVFJfQ1RJTUUpOworCQkgKGxvbmcgbG9uZylNRFNfQVRUUl9DVElNRSk7CiAJTEFTU0VSVEYoTURTX0FUVFJfQVRJTUVfU0VUID09IDB4MDAwMDAwMDAwMDAwMDA4MFVMTCwgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwKLQkJCShsb25nIGxvbmcpTURTX0FUVFJfQVRJTUVfU0VUKTsKKwkJIChsb25nIGxvbmcpTURTX0FUVFJfQVRJTUVfU0VUKTsKIAlMQVNTRVJURihNRFNfQVRUUl9NVElNRV9TRVQgPT0gMHgwMDAwMDAwMDAwMDAwMTAwVUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylNRFNfQVRUUl9NVElNRV9TRVQpOworCQkgKGxvbmcgbG9uZylNRFNfQVRUUl9NVElNRV9TRVQpOwogCUxBU1NFUlRGKE1EU19BVFRSX0ZPUkNFID09IDB4MDAwMDAwMDAwMDAwMDIwMFVMTCwgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwKLQkJCShsb25nIGxvbmcpTURTX0FUVFJfRk9SQ0UpOworCQkgKGxvbmcgbG9uZylNRFNfQVRUUl9GT1JDRSk7CiAJTEFTU0VSVEYoTURTX0FUVFJfQVRUUl9GTEFHID09IDB4MDAwMDAwMDAwMDAwMDQwMFVMTCwgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwKLQkJCShsb25nIGxvbmcpTURTX0FUVFJfQVRUUl9GTEFHKTsKKwkJIChsb25nIGxvbmcpTURTX0FUVFJfQVRUUl9GTEFHKTsKIAlMQVNTRVJURihNRFNfQVRUUl9LSUxMX1NVSUQgPT0gMHgwMDAwMDAwMDAwMDAwODAwVUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylNRFNfQVRUUl9LSUxMX1NVSUQpOworCQkgKGxvbmcgbG9uZylNRFNfQVRUUl9LSUxMX1NVSUQpOwogCUxBU1NFUlRGKE1EU19BVFRSX0tJTExfU0dJRCA9PSAweDAwMDAwMDAwMDAwMDEwMDBVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKU1EU19BVFRSX0tJTExfU0dJRCk7CisJCSAobG9uZyBsb25nKU1EU19BVFRSX0tJTExfU0dJRCk7CiAJTEFTU0VSVEYoTURTX0FUVFJfQ1RJTUVfU0VUID09IDB4MDAwMDAwMDAwMDAwMjAwMFVMTCwgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwKLQkJCShsb25nIGxvbmcpTURTX0FUVFJfQ1RJTUVfU0VUKTsKKwkJIChsb25nIGxvbmcpTURTX0FUVFJfQ1RJTUVfU0VUKTsKIAlMQVNTRVJURihNRFNfQVRUUl9GUk9NX09QRU4gPT0gMHgwMDAwMDAwMDAwMDA0MDAwVUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylNRFNfQVRUUl9GUk9NX09QRU4pOworCQkgKGxvbmcgbG9uZylNRFNfQVRUUl9GUk9NX09QRU4pOwogCUxBU1NFUlRGKE1EU19BVFRSX0JMT0NLUyA9PSAweDAwMDAwMDAwMDAwMDgwMDBVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKU1EU19BVFRSX0JMT0NLUyk7CisJCSAobG9uZyBsb25nKU1EU19BVFRSX0JMT0NLUyk7CiAJTEFTU0VSVEYoRkxEX1FVRVJZID09IDkwMCwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKUZMRF9RVUVSWSk7CiAJTEFTU0VSVEYoRkxEX0ZJUlNUX09QQyA9PSA5MDAsICJmb3VuZCAlbGxkXG4iLApAQCAtNDE4LDE1ICs0MjAsMTUgQEAKIAlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsdXN0cmVfbWR0X2F0dHJzICopMCktPmxtYV9zZWxmX2ZpZCkgPT0gMTYsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsdXN0cmVfbWR0X2F0dHJzICopMCktPmxtYV9zZWxmX2ZpZCkpOwogCUxBU1NFUlRGKExNQUlfUkVMRUFTRUQgPT0gMHgwMDAwMDAwMVVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClMTUFJX1JFTEVBU0VEKTsKKwkJICh1bnNpZ25lZClMTUFJX1JFTEVBU0VEKTsKIAlMQVNTRVJURihMTUFDX0hTTSA9PSAweDAwMDAwMDAxVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKUxNQUNfSFNNKTsKKwkJICh1bnNpZ25lZClMTUFDX0hTTSk7CiAJTEFTU0VSVEYoTE1BQ19TT00gPT0gMHgwMDAwMDAwMlVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClMTUFDX1NPTSk7CisJCSAodW5zaWduZWQpTE1BQ19TT00pOwogCUxBU1NFUlRGKExNQUNfTk9UX0lOX09JID09IDB4MDAwMDAwMDRVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTE1BQ19OT1RfSU5fT0kpOworCQkgKHVuc2lnbmVkKUxNQUNfTk9UX0lOX09JKTsKIAlMQVNTRVJURihMTUFDX0ZJRF9PTl9PU1QgPT0gMHgwMDAwMDAwOFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClMTUFDX0ZJRF9PTl9PU1QpOworCQkgKHVuc2lnbmVkKUxNQUNfRklEX09OX09TVCk7CiAKIAkvKiBDaGVja3MgZm9yIHN0cnVjdCBvc3RfaWQgKi8KIAlMQVNTRVJURigoaW50KXNpemVvZihzdHJ1Y3Qgb3N0X2lkKSA9PSAxNiwgImZvdW5kICVsbGRcbiIsCkBAIC00NTIsMzUgKzQ1NCwzNSBAQAogCUxBU1NFUlRGKEZJRF9TRVFfSUdJRiA9PSAxMiwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKUZJRF9TRVFfSUdJRik7CiAJTEFTU0VSVEYoRklEX1NFUV9JR0lGX01BWCA9PSAweDAwMDAwMDAwZmZmZmZmZmZVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKUZJRF9TRVFfSUdJRl9NQVgpOworCQkgKGxvbmcgbG9uZylGSURfU0VRX0lHSUZfTUFYKTsKIAlMQVNTRVJURihGSURfU0VRX0lESUYgPT0gMHgwMDAwMDAwMTAwMDAwMDAwVUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylGSURfU0VRX0lESUYpOworCQkgKGxvbmcgbG9uZylGSURfU0VRX0lESUYpOwogCUxBU1NFUlRGKEZJRF9TRVFfSURJRl9NQVggPT0gMHgwMDAwMDAwMWZmZmZmZmZmVUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylGSURfU0VRX0lESUZfTUFYKTsKKwkJIChsb25nIGxvbmcpRklEX1NFUV9JRElGX01BWCk7CiAJTEFTU0VSVEYoRklEX1NFUV9TVEFSVCA9PSAweDAwMDAwMDAyMDAwMDAwMDBVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKUZJRF9TRVFfU1RBUlQpOworCQkgKGxvbmcgbG9uZylGSURfU0VRX1NUQVJUKTsKIAlMQVNTRVJURihGSURfU0VRX0xPQ0FMX0ZJTEUgPT0gMHgwMDAwMDAwMjAwMDAwMDAxVUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylGSURfU0VRX0xPQ0FMX0ZJTEUpOworCQkgKGxvbmcgbG9uZylGSURfU0VRX0xPQ0FMX0ZJTEUpOwogCUxBU1NFUlRGKEZJRF9TRVFfRE9UX0xVU1RSRSA9PSAweDAwMDAwMDAyMDAwMDAwMDJVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKUZJRF9TRVFfRE9UX0xVU1RSRSk7CisJCSAobG9uZyBsb25nKUZJRF9TRVFfRE9UX0xVU1RSRSk7CiAJTEFTU0VSVEYoRklEX1NFUV9TUEVDSUFMID09IDB4MDAwMDAwMDIwMDAwMDAwNFVMTCwgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwKLQkJCShsb25nIGxvbmcpRklEX1NFUV9TUEVDSUFMKTsKKwkJIChsb25nIGxvbmcpRklEX1NFUV9TUEVDSUFMKTsKIAlMQVNTRVJURihGSURfU0VRX1FVT1RBID09IDB4MDAwMDAwMDIwMDAwMDAwNVVMTCwgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwKLQkJCShsb25nIGxvbmcpRklEX1NFUV9RVU9UQSk7CisJCSAobG9uZyBsb25nKUZJRF9TRVFfUVVPVEEpOwogCUxBU1NFUlRGKEZJRF9TRVFfUVVPVEFfR0xCID09IDB4MDAwMDAwMDIwMDAwMDAwNlVMTCwgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwKLQkJCShsb25nIGxvbmcpRklEX1NFUV9RVU9UQV9HTEIpOworCQkgKGxvbmcgbG9uZylGSURfU0VRX1FVT1RBX0dMQik7CiAJTEFTU0VSVEYoRklEX1NFUV9ST09UID09IDB4MDAwMDAwMDIwMDAwMDAwN1VMTCwgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwKLQkJCShsb25nIGxvbmcpRklEX1NFUV9ST09UKTsKKwkJIChsb25nIGxvbmcpRklEX1NFUV9ST09UKTsKIAlMQVNTRVJURihGSURfU0VRX05PUk1BTCA9PSAweDAwMDAwMDAyMDAwMDA0MDBVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKUZJRF9TRVFfTk9STUFMKTsKKwkJIChsb25nIGxvbmcpRklEX1NFUV9OT1JNQUwpOwogCUxBU1NFUlRGKEZJRF9TRVFfTE9WX0RFRkFVTFQgPT0gMHhmZmZmZmZmZmZmZmZmZmZmVUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylGSURfU0VRX0xPVl9ERUZBVUxUKTsKKwkJIChsb25nIGxvbmcpRklEX1NFUV9MT1ZfREVGQVVMVCk7CiAJTEFTU0VSVEYoRklEX09JRF9TUEVDSUFMX0JGTCA9PSAweDAwMDAwMDAxVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKUZJRF9PSURfU1BFQ0lBTF9CRkwpOworCQkgKHVuc2lnbmVkKUZJRF9PSURfU1BFQ0lBTF9CRkwpOwogCUxBU1NFUlRGKEZJRF9PSURfRE9UX0xVU1RSRSA9PSAweDAwMDAwMDAxVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKUZJRF9PSURfRE9UX0xVU1RSRSk7CisJCSAodW5zaWduZWQpRklEX09JRF9ET1RfTFVTVFJFKTsKIAlMQVNTRVJURihGSURfT0lEX0RPVF9MVVNUUkVfT0JGID09IDB4MDAwMDAwMDJVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpRklEX09JRF9ET1RfTFVTVFJFX09CRik7CisJCSAodW5zaWduZWQpRklEX09JRF9ET1RfTFVTVFJFX09CRik7CiAKIAkvKiBDaGVja3MgZm9yIHN0cnVjdCBsdV9kaXJlbnQgKi8KIAlMQVNTRVJURigoaW50KXNpemVvZihzdHJ1Y3QgbHVfZGlyZW50KSA9PSAzMiwgImZvdW5kICVsbGRcbiIsCkBAIC01MTAsMTEgKzUxMiwxMSBAQAogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGx1X2RpcmVudCAqKTApLT5sZGVfbmFtZVswXSkgPT0gMSwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGx1X2RpcmVudCAqKTApLT5sZGVfbmFtZVswXSkpOwogCUxBU1NFUlRGKExVREFfRklEID09IDB4MDAwMDAwMDFVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTFVEQV9GSUQpOworCQkgKHVuc2lnbmVkKUxVREFfRklEKTsKIAlMQVNTRVJURihMVURBX1RZUEUgPT0gMHgwMDAwMDAwMlVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClMVURBX1RZUEUpOworCQkgKHVuc2lnbmVkKUxVREFfVFlQRSk7CiAJTEFTU0VSVEYoTFVEQV82NEJJVEhBU0ggPT0gMHgwMDAwMDAwNFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClMVURBXzY0QklUSEFTSCk7CisJCSAodW5zaWduZWQpTFVEQV82NEJJVEhBU0gpOwogCiAJLyogQ2hlY2tzIGZvciBzdHJ1Y3QgbHVkYV90eXBlICovCiAJTEFTU0VSVEYoKGludClzaXplb2Yoc3RydWN0IGx1ZGFfdHlwZSkgPT0gMiwgImZvdW5kICVsbGRcbiIsCkBAIC02MDIsOSArNjA0LDkgQEAKIAlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsdXN0cmVfbXNnX3YyICopMCktPmxtX2J1ZmxlbnNbMF0pID09IDQsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsdXN0cmVfbXNnX3YyICopMCktPmxtX2J1ZmxlbnNbMF0pKTsKIAlMQVNTRVJURihMVVNUUkVfTVNHX01BR0lDX1YyID09IDB4MEJEMDBCRDMsICJmb3VuZCAweCUuOHhcbiIsCi0JCUxVU1RSRV9NU0dfTUFHSUNfVjIpOworCQkgTFVTVFJFX01TR19NQUdJQ19WMik7CiAJTEFTU0VSVEYoTFVTVFJFX01TR19NQUdJQ19WMl9TV0FCQkVEID09IDB4RDMwQkQwMEIsICJmb3VuZCAweCUuOHhcbiIsCi0JCUxVU1RSRV9NU0dfTUFHSUNfVjJfU1dBQkJFRCk7CisJCSBMVVNUUkVfTVNHX01BR0lDX1YyX1NXQUJCRUQpOwogCiAJLyogQ2hlY2tzIGZvciBzdHJ1Y3QgcHRscnBjX2JvZHkgKi8KIAlMQVNTRVJURigoaW50KXNpemVvZihzdHJ1Y3QgcHRscnBjX2JvZHlfdjMpID09IDE4NCwgImZvdW5kICVsbGRcbiIsCkBAIC02ODIsNyArNjg0LDcgQEAKIAkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgcHRscnBjX2JvZHlfdjMsIHBiX3BhZGRpbmcpKTsKIAlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBwdGxycGNfYm9keV92MyAqKTApLT5wYl9wYWRkaW5nKSA9PSAzMiwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IHB0bHJwY19ib2R5X3YzICopMCktPnBiX3BhZGRpbmcpKTsKLQlDTEFTU0VSVChKT0JTVEFUU19KT0JJRF9TSVpFID09IDMyKTsKKwlDTEFTU0VSVChMVVNUUkVfSk9CSURfU0laRSA9PSAzMik7CiAJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgcHRscnBjX2JvZHlfdjMsIHBiX2pvYmlkKSA9PSAxNTIsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBwdGxycGNfYm9keV92MywgcGJfam9iaWQpKTsKIAlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBwdGxycGNfYm9keV92MyAqKTApLT5wYl9qb2JpZCkgPT0gMzIsICJmb3VuZCAlbGxkXG4iLApAQCAtNzgwLDYxICs3ODIsNjEgQEAKIAlMQVNTRVJURihNU0dfUFRMUlBDX0hFQURFUl9PRkYgPT0gMzEsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZylNU0dfUFRMUlBDX0hFQURFUl9PRkYpOwogCUxBU1NFUlRGKFBUTFJQQ19NU0dfVkVSU0lPTiA9PSAweDAwMDAwMDAzLCAiZm91bmQgMHglLjh4XG4iLAotCQlQVExSUENfTVNHX1ZFUlNJT04pOworCQkgUFRMUlBDX01TR19WRVJTSU9OKTsKIAlMQVNTRVJURihMVVNUUkVfVkVSU0lPTl9NQVNLID09IDB4ZmZmZjAwMDAsICJmb3VuZCAweCUuOHhcbiIsCi0JCUxVU1RSRV9WRVJTSU9OX01BU0spOworCQkgTFVTVFJFX1ZFUlNJT05fTUFTSyk7CiAJTEFTU0VSVEYoTFVTVFJFX09CRF9WRVJTSU9OID09IDB4MDAwMTAwMDAsICJmb3VuZCAweCUuOHhcbiIsCi0JCUxVU1RSRV9PQkRfVkVSU0lPTik7CisJCSBMVVNUUkVfT0JEX1ZFUlNJT04pOwogCUxBU1NFUlRGKExVU1RSRV9NRFNfVkVSU0lPTiA9PSAweDAwMDIwMDAwLCAiZm91bmQgMHglLjh4XG4iLAotCQlMVVNUUkVfTURTX1ZFUlNJT04pOworCQkgTFVTVFJFX01EU19WRVJTSU9OKTsKIAlMQVNTRVJURihMVVNUUkVfT1NUX1ZFUlNJT04gPT0gMHgwMDAzMDAwMCwgImZvdW5kIDB4JS44eFxuIiwKLQkJTFVTVFJFX09TVF9WRVJTSU9OKTsKKwkJIExVU1RSRV9PU1RfVkVSU0lPTik7CiAJTEFTU0VSVEYoTFVTVFJFX0RMTV9WRVJTSU9OID09IDB4MDAwNDAwMDAsICJmb3VuZCAweCUuOHhcbiIsCi0JCUxVU1RSRV9ETE1fVkVSU0lPTik7CisJCSBMVVNUUkVfRExNX1ZFUlNJT04pOwogCUxBU1NFUlRGKExVU1RSRV9MT0dfVkVSU0lPTiA9PSAweDAwMDUwMDAwLCAiZm91bmQgMHglLjh4XG4iLAotCQlMVVNUUkVfTE9HX1ZFUlNJT04pOworCQkgTFVTVFJFX0xPR19WRVJTSU9OKTsKIAlMQVNTRVJURihMVVNUUkVfTUdTX1ZFUlNJT04gPT0gMHgwMDA2MDAwMCwgImZvdW5kIDB4JS44eFxuIiwKLQkJTFVTVFJFX01HU19WRVJTSU9OKTsKKwkJIExVU1RSRV9NR1NfVkVSU0lPTik7CiAJTEFTU0VSVEYoTVNHSERSX0FUX1NVUFBPUlQgPT0gMSwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKU1TR0hEUl9BVF9TVVBQT1JUKTsKIAlMQVNTRVJURihNU0dIRFJfQ0tTVU1fSU5DT01QQVQxOCA9PSAyLCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpTVNHSERSX0NLU1VNX0lOQ09NUEFUMTgpOwogCUxBU1NFUlRGKE1TR19PUF9GTEFHX01BU0sgPT0gMHhmZmZmMDAwMFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNU0dfT1BfRkxBR19NQVNLKTsKKwkJICh1bnNpZ25lZClNU0dfT1BfRkxBR19NQVNLKTsKIAlMQVNTRVJURihNU0dfT1BfRkxBR19TSElGVCA9PSAxNiwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKU1TR19PUF9GTEFHX1NISUZUKTsKIAlMQVNTRVJURihNU0dfR0VOX0ZMQUdfTUFTSyA9PSAweDAwMDBmZmZmVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU1TR19HRU5fRkxBR19NQVNLKTsKKwkJICh1bnNpZ25lZClNU0dfR0VOX0ZMQUdfTUFTSyk7CiAJTEFTU0VSVEYoTVNHX0xBU1RfUkVQTEFZID09IDB4MDAwMDAwMDFVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTVNHX0xBU1RfUkVQTEFZKTsKKwkJICh1bnNpZ25lZClNU0dfTEFTVF9SRVBMQVkpOwogCUxBU1NFUlRGKE1TR19SRVNFTlQgPT0gMHgwMDAwMDAwMlVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNU0dfUkVTRU5UKTsKKwkJICh1bnNpZ25lZClNU0dfUkVTRU5UKTsKIAlMQVNTRVJURihNU0dfUkVQTEFZID09IDB4MDAwMDAwMDRVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTVNHX1JFUExBWSk7CisJCSAodW5zaWduZWQpTVNHX1JFUExBWSk7CiAJTEFTU0VSVEYoTVNHX0RFTEFZX1JFUExBWSA9PSAweDAwMDAwMDEwVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU1TR19ERUxBWV9SRVBMQVkpOworCQkgKHVuc2lnbmVkKU1TR19ERUxBWV9SRVBMQVkpOwogCUxBU1NFUlRGKE1TR19WRVJTSU9OX1JFUExBWSA9PSAweDAwMDAwMDIwVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU1TR19WRVJTSU9OX1JFUExBWSk7CisJCSAodW5zaWduZWQpTVNHX1ZFUlNJT05fUkVQTEFZKTsKIAlMQVNTRVJURihNU0dfUkVRX1JFUExBWV9ET05FID09IDB4MDAwMDAwNDBVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTVNHX1JFUV9SRVBMQVlfRE9ORSk7CisJCSAodW5zaWduZWQpTVNHX1JFUV9SRVBMQVlfRE9ORSk7CiAJTEFTU0VSVEYoTVNHX0xPQ0tfUkVQTEFZX0RPTkUgPT0gMHgwMDAwMDA4MFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNU0dfTE9DS19SRVBMQVlfRE9ORSk7CisJCSAodW5zaWduZWQpTVNHX0xPQ0tfUkVQTEFZX0RPTkUpOwogCUxBU1NFUlRGKE1TR19DT05ORUNUX1JFQ09WRVJJTkcgPT0gMHgwMDAwMDAwMVVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNU0dfQ09OTkVDVF9SRUNPVkVSSU5HKTsKKwkJICh1bnNpZ25lZClNU0dfQ09OTkVDVF9SRUNPVkVSSU5HKTsKIAlMQVNTRVJURihNU0dfQ09OTkVDVF9SRUNPTk5FQ1QgPT0gMHgwMDAwMDAwMlVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNU0dfQ09OTkVDVF9SRUNPTk5FQ1QpOworCQkgKHVuc2lnbmVkKU1TR19DT05ORUNUX1JFQ09OTkVDVCk7CiAJTEFTU0VSVEYoTVNHX0NPTk5FQ1RfUkVQTEFZQUJMRSA9PSAweDAwMDAwMDA0VUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU1TR19DT05ORUNUX1JFUExBWUFCTEUpOworCQkgKHVuc2lnbmVkKU1TR19DT05ORUNUX1JFUExBWUFCTEUpOwogCUxBU1NFUlRGKE1TR19DT05ORUNUX0xJQkNMSUVOVCA9PSAweDAwMDAwMDEwVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU1TR19DT05ORUNUX0xJQkNMSUVOVCk7CisJCSAodW5zaWduZWQpTVNHX0NPTk5FQ1RfTElCQ0xJRU5UKTsKIAlMQVNTRVJURihNU0dfQ09OTkVDVF9JTklUSUFMID09IDB4MDAwMDAwMjBVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTVNHX0NPTk5FQ1RfSU5JVElBTCk7CisJCSAodW5zaWduZWQpTVNHX0NPTk5FQ1RfSU5JVElBTCk7CiAJTEFTU0VSVEYoTVNHX0NPTk5FQ1RfQVNZTkMgPT0gMHgwMDAwMDA0MFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNU0dfQ09OTkVDVF9BU1lOQyk7CisJCSAodW5zaWduZWQpTVNHX0NPTk5FQ1RfQVNZTkMpOwogCUxBU1NFUlRGKE1TR19DT05ORUNUX05FWFRfVkVSID09IDB4MDAwMDAwODBVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTVNHX0NPTk5FQ1RfTkVYVF9WRVIpOworCQkgKHVuc2lnbmVkKU1TR19DT05ORUNUX05FWFRfVkVSKTsKIAlMQVNTRVJURihNU0dfQ09OTkVDVF9UUkFOU05PID09IDB4MDAwMDAxMDBVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTVNHX0NPTk5FQ1RfVFJBTlNOTyk7CisJCSAodW5zaWduZWQpTVNHX0NPTk5FQ1RfVFJBTlNOTyk7CiAKIAkvKiBDaGVja3MgZm9yIHN0cnVjdCBvYmRfY29ubmVjdF9kYXRhICovCiAJTEFTU0VSVEYoKGludClzaXplb2Yoc3RydWN0IG9iZF9jb25uZWN0X2RhdGEpID09IDE5MiwgImZvdW5kICVsbGRcbiIsCkBAIC0xMDY5LDEyICsxMDcxLDE4IEBACiAJCSAiZm91bmQgMHglLjE2bGx4VUxMXG4iLCBPQkRfQ09OTkVDVF9GTE9DS19ERUFEKTsKIAlMQVNTRVJURihPQkRfQ09OTkVDVF9PUEVOX0JZX0ZJRCA9PSAweDIwMDAwMDAwMDAwMDAwVUxMLAogCQkgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwgT0JEX0NPTk5FQ1RfT1BFTl9CWV9GSUQpOworCUxBU1NFUlRGKE9CRF9DT05ORUNUX0xGU0NLID09IDB4NDAwMDAwMDAwMDAwMDBVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCisJCSBPQkRfQ09OTkVDVF9MRlNDSyk7CisJTEFTU0VSVEYoT0JEX0NPTk5FQ1RfVU5MSU5LX0NMT1NFID09IDB4MTAwMDAwMDAwMDAwMDAwVUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAorCQkgT0JEX0NPTk5FQ1RfVU5MSU5LX0NMT1NFKTsKKwlMQVNTRVJURihPQkRfQ09OTkVDVF9ESVJfU1RSSVBFID09IDB4NDAwMDAwMDAwMDAwMDAwVUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAorCQkgT0JEX0NPTk5FQ1RfRElSX1NUUklQRSk7CiAJTEFTU0VSVEYoT0JEX0NLU1VNX0NSQzMyID09IDB4MDAwMDAwMDFVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpT0JEX0NLU1VNX0NSQzMyKTsKKwkJICh1bnNpZ25lZClPQkRfQ0tTVU1fQ1JDMzIpOwogCUxBU1NFUlRGKE9CRF9DS1NVTV9BRExFUiA9PSAweDAwMDAwMDAyVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU9CRF9DS1NVTV9BRExFUik7CisJCSAodW5zaWduZWQpT0JEX0NLU1VNX0FETEVSKTsKIAlMQVNTRVJURihPQkRfQ0tTVU1fQ1JDMzJDID09IDB4MDAwMDAwMDRVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpT0JEX0NLU1VNX0NSQzMyQyk7CisJCSAodW5zaWduZWQpT0JEX0NLU1VNX0NSQzMyQyk7CiAKIAkvKiBDaGVja3MgZm9yIHN0cnVjdCBvYmRvICovCiAJTEFTU0VSVEYoKGludClzaXplb2Yoc3RydWN0IG9iZG8pID09IDIwOCwgImZvdW5kICVsbGRcbiIsCkBAIC0xMzQ2LDcgKzEzNTQsNyBAQAogCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBsb3ZfbWRzX21kX3YxLCBsbW1fb2JqZWN0c1swXSkpOwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGxvdl9tZHNfbWRfdjEgKikwKS0+bG1tX29iamVjdHNbMF0pID09IDI0LCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbG92X21kc19tZF92MSAqKTApLT5sbW1fb2JqZWN0c1swXSkpOwotCUNMQVNTRVJUKExPVl9NQUdJQ19WMSA9PSAweDBCRDEwQkQwKTsKKwlDTEFTU0VSVChMT1ZfTUFHSUNfVjEgPT0gKDB4MEJEMTAwMDAgfCAweDBCRDApKTsKIAogCS8qIENoZWNrcyBmb3Igc3RydWN0IGxvdl9tZHNfbWRfdjMgKi8KIAlMQVNTRVJURigoaW50KXNpemVvZihzdHJ1Y3QgbG92X21kc19tZF92MykgPT0gNDgsICJmb3VuZCAlbGxkXG4iLApAQCAtMTM3NSw3ICsxMzgzLDcgQEAKIAkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbG92X21kc19tZF92MywgbG1tX2xheW91dF9nZW4pKTsKIAlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsb3ZfbWRzX21kX3YzICopMCktPmxtbV9sYXlvdXRfZ2VuKSA9PSAyLCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbG92X21kc19tZF92MyAqKTApLT5sbW1fbGF5b3V0X2dlbikpOwotCUNMQVNTRVJUKExPVl9NQVhQT09MTkFNRSA9PSAxNik7CisJQ0xBU1NFUlQoTE9WX01BWFBPT0xOQU1FID09IDE1KTsKIAlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBsb3ZfbWRzX21kX3YzLCBsbW1fcG9vbF9uYW1lWzE2XSkgPT0gNDgsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBsb3ZfbWRzX21kX3YzLCBsbW1fcG9vbF9uYW1lWzE2XSkpOwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGxvdl9tZHNfbWRfdjMgKikwKS0+bG1tX3Bvb2xfbmFtZVsxNl0pID09IDEsICJmb3VuZCAlbGxkXG4iLApAQCAtMTM4NCwxNSArMTM5Miw2NCBAQAogCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBsb3ZfbWRzX21kX3YzLCBsbW1fb2JqZWN0c1swXSkpOwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGxvdl9tZHNfbWRfdjMgKikwKS0+bG1tX29iamVjdHNbMF0pID09IDI0LCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbG92X21kc19tZF92MyAqKTApLT5sbW1fb2JqZWN0c1swXSkpOwotCUNMQVNTRVJUKExPVl9NQUdJQ19WMyA9PSAweDBCRDMwQkQwKTsKKwlDTEFTU0VSVChMT1ZfTUFHSUNfVjMgPT0gKDB4MEJEMzAwMDAgfCAweDBCRDApKTsKIAlMQVNTRVJURihMT1ZfUEFUVEVSTl9SQUlEMCA9PSAweDAwMDAwMDAxVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKUxPVl9QQVRURVJOX1JBSUQwKTsKKwkJICh1bnNpZ25lZClMT1ZfUEFUVEVSTl9SQUlEMCk7CiAJTEFTU0VSVEYoTE9WX1BBVFRFUk5fUkFJRDEgPT0gMHgwMDAwMDAwMlVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClMT1ZfUEFUVEVSTl9SQUlEMSk7CisJCSAodW5zaWduZWQpTE9WX1BBVFRFUk5fUkFJRDEpOwogCUxBU1NFUlRGKExPVl9QQVRURVJOX0ZJUlNUID09IDB4MDAwMDAxMDBVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTE9WX1BBVFRFUk5fRklSU1QpOworCQkgKHVuc2lnbmVkKUxPVl9QQVRURVJOX0ZJUlNUKTsKIAlMQVNTRVJURihMT1ZfUEFUVEVSTl9DTU9CRCA9PSAweDAwMDAwMjAwVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKUxPVl9QQVRURVJOX0NNT0JEKTsKKwkJICh1bnNpZ25lZClMT1ZfUEFUVEVSTl9DTU9CRCk7CisKKwkvKiBDaGVja3MgZm9yIHN0cnVjdCBsbXZfbWRzX21kX3YxICovCisJTEFTU0VSVEYoKGludClzaXplb2Yoc3RydWN0IGxtdl9tZHNfbWRfdjEpID09IDU2LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2Yoc3RydWN0IGxtdl9tZHNfbWRfdjEpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBsbXZfbWRzX21kX3YxLCBsbXZfbWFnaWMpID09IDAsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBsbXZfbWRzX21kX3YxLCBsbXZfbWFnaWMpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfbWRzX21kX3YxICopMCktPmxtdl9tYWdpYykgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9tZHNfbWRfdjEgKikwKS0+bG12X21hZ2ljKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X21kc19tZF92MSwgbG12X3N0cmlwZV9jb3VudCkgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9tZHNfbWRfdjEsIGxtdl9zdHJpcGVfY291bnQpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfbWRzX21kX3YxICopMCktPmxtdl9zdHJpcGVfY291bnQpID09IDQsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfbWRzX21kX3YxICopMCktPmxtdl9zdHJpcGVfY291bnQpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBsbXZfbWRzX21kX3YxLCBsbXZfbWFzdGVyX21kdF9pbmRleCkgPT0gOCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9tZHNfbWRfdjEsIGxtdl9tYXN0ZXJfbWR0X2luZGV4KSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbG12X21kc19tZF92MSAqKTApLT5sbXZfbWFzdGVyX21kdF9pbmRleCkgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9tZHNfbWRfdjEgKikwKS0+bG12X21hc3Rlcl9tZHRfaW5kZXgpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBsbXZfbWRzX21kX3YxLCBsbXZfaGFzaF90eXBlKSA9PSAxMiwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9tZHNfbWRfdjEsIGxtdl9oYXNoX3R5cGUpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfbWRzX21kX3YxICopMCktPmxtdl9oYXNoX3R5cGUpID09IDQsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfbWRzX21kX3YxICopMCktPmxtdl9oYXNoX3R5cGUpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBsbXZfbWRzX21kX3YxLCBsbXZfbGF5b3V0X3ZlcnNpb24pID09IDE2LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X21kc19tZF92MSwgbG12X2xheW91dF92ZXJzaW9uKSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbG12X21kc19tZF92MSAqKTApLT5sbXZfbGF5b3V0X3ZlcnNpb24pID09IDQsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfbWRzX21kX3YxICopMCktPmxtdl9sYXlvdXRfdmVyc2lvbikpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9tZHNfbWRfdjEsIGxtdl9wYWRkaW5nMSkgPT0gMjAsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBsbXZfbWRzX21kX3YxLCBsbXZfcGFkZGluZzEpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfbWRzX21kX3YxICopMCktPmxtdl9wYWRkaW5nMSkgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9tZHNfbWRfdjEgKikwKS0+bG12X3BhZGRpbmcxKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X21kc19tZF92MSwgbG12X3BhZGRpbmcyKSA9PSAyNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9tZHNfbWRfdjEsIGxtdl9wYWRkaW5nMikpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9tZHNfbWRfdjEgKikwKS0+bG12X3BhZGRpbmcyKSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbG12X21kc19tZF92MSAqKTApLT5sbXZfcGFkZGluZzIpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBsbXZfbWRzX21kX3YxLCBsbXZfcGFkZGluZzMpID09IDMyLCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X21kc19tZF92MSwgbG12X3BhZGRpbmczKSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbG12X21kc19tZF92MSAqKTApLT5sbXZfcGFkZGluZzMpID09IDgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfbWRzX21kX3YxICopMCktPmxtdl9wYWRkaW5nMykpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9tZHNfbWRfdjEsIGxtdl9wb29sX25hbWVbMTZdKSA9PSA1NiwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9tZHNfbWRfdjEsIGxtdl9wb29sX25hbWVbMTZdKSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbG12X21kc19tZF92MSAqKTApLT5sbXZfcG9vbF9uYW1lWzE2XSkgPT0gMSwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9tZHNfbWRfdjEgKikwKS0+bG12X3Bvb2xfbmFtZVsxNl0pKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBsbXZfbWRzX21kX3YxLCBsbXZfc3RyaXBlX2ZpZHNbMF0pID09IDU2LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X21kc19tZF92MSwgbG12X3N0cmlwZV9maWRzWzBdKSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbG12X21kc19tZF92MSAqKTApLT5sbXZfc3RyaXBlX2ZpZHNbMF0pID09IDE2LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbG12X21kc19tZF92MSAqKTApLT5sbXZfc3RyaXBlX2ZpZHNbMF0pKTsKKwlDTEFTU0VSVChMTVZfTUFHSUNfVjEgPT0gMHgwQ0QyMENEMCk7CisJQ0xBU1NFUlQoTE1WX01BR0lDX1NUUklQRSA9PSAweDBDRDQwQ0QwKTsKKwlDTEFTU0VSVChMTVZfSEFTSF9UWVBFX01BU0sgPT0gMHgwMDAwZmZmZik7CisJQ0xBU1NFUlQoTE1WX0hBU0hfRkxBR19NSUdSQVRJT04gPT0gMHg4MDAwMDAwMCk7CisJQ0xBU1NFUlQoTE1WX0hBU0hfRkxBR19ERUFEID09IDB4NDAwMDAwMDApOwogCiAJLyogQ2hlY2tzIGZvciBzdHJ1Y3Qgb2JkX3N0YXRmcyAqLwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKHN0cnVjdCBvYmRfc3RhdGZzKSA9PSAxNDQsICJmb3VuZCAlbGxkXG4iLApAQCAtMTU4Miw1MyArMTYzOSw1MyBAQAogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG9iZF9kcWJsayAqKTApLT5kcWJfcGFkZGluZykgPT0gNCwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG9iZF9kcWJsayAqKTApLT5kcWJfcGFkZGluZykpOwogCUxBU1NFUlRGKFFfUVVPVEFDSEVDSyA9PSAweDgwMDEwMCwgImZvdW5kIDB4JS44eFxuIiwKLQkJUV9RVU9UQUNIRUNLKTsKKwkJIFFfUVVPVEFDSEVDSyk7CiAJTEFTU0VSVEYoUV9JTklUUVVPVEEgPT0gMHg4MDAxMDEsICJmb3VuZCAweCUuOHhcbiIsCi0JCVFfSU5JVFFVT1RBKTsKKwkJIFFfSU5JVFFVT1RBKTsKIAlMQVNTRVJURihRX0dFVE9JTkZPID09IDB4ODAwMTAyLCAiZm91bmQgMHglLjh4XG4iLAotCQlRX0dFVE9JTkZPKTsKKwkJIFFfR0VUT0lORk8pOwogCUxBU1NFUlRGKFFfR0VUT1FVT1RBID09IDB4ODAwMTAzLCAiZm91bmQgMHglLjh4XG4iLAotCQlRX0dFVE9RVU9UQSk7CisJCSBRX0dFVE9RVU9UQSk7CiAJTEFTU0VSVEYoUV9GSU5WQUxJREFURSA9PSAweDgwMDEwNCwgImZvdW5kIDB4JS44eFxuIiwKLQkJUV9GSU5WQUxJREFURSk7CisJCSBRX0ZJTlZBTElEQVRFKTsKIAogCS8qIENoZWNrcyBmb3Igc3RydWN0IG5pb2J1Zl9yZW1vdGUgKi8KIAlMQVNTRVJURigoaW50KXNpemVvZihzdHJ1Y3QgbmlvYnVmX3JlbW90ZSkgPT0gMTYsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZihzdHJ1Y3QgbmlvYnVmX3JlbW90ZSkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG5pb2J1Zl9yZW1vdGUsIG9mZnNldCkgPT0gMCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG5pb2J1Zl9yZW1vdGUsIG9mZnNldCkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG5pb2J1Zl9yZW1vdGUgKikwKS0+b2Zmc2V0KSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbmlvYnVmX3JlbW90ZSAqKTApLT5vZmZzZXQpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBuaW9idWZfcmVtb3RlLCBsZW4pID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBuaW9idWZfcmVtb3RlLCBsZW4pKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBuaW9idWZfcmVtb3RlICopMCktPmxlbikgPT0gNCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG5pb2J1Zl9yZW1vdGUgKikwKS0+bGVuKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbmlvYnVmX3JlbW90ZSwgZmxhZ3MpID09IDEyLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbmlvYnVmX3JlbW90ZSwgZmxhZ3MpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBuaW9idWZfcmVtb3RlICopMCktPmZsYWdzKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbmlvYnVmX3JlbW90ZSAqKTApLT5mbGFncykpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG5pb2J1Zl9yZW1vdGUsIHJuYl9vZmZzZXQpID09IDAsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBuaW9idWZfcmVtb3RlLCBybmJfb2Zmc2V0KSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbmlvYnVmX3JlbW90ZSAqKTApLT5ybmJfb2Zmc2V0KSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbmlvYnVmX3JlbW90ZSAqKTApLT5ybmJfb2Zmc2V0KSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbmlvYnVmX3JlbW90ZSwgcm5iX2xlbikgPT0gOCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG5pb2J1Zl9yZW1vdGUsIHJuYl9sZW4pKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBuaW9idWZfcmVtb3RlICopMCktPnJuYl9sZW4pID09IDQsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBuaW9idWZfcmVtb3RlICopMCktPnJuYl9sZW4pKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBuaW9idWZfcmVtb3RlLCBybmJfZmxhZ3MpID09IDEyLCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbmlvYnVmX3JlbW90ZSwgcm5iX2ZsYWdzKSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbmlvYnVmX3JlbW90ZSAqKTApLT5ybmJfZmxhZ3MpID09IDQsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBuaW9idWZfcmVtb3RlICopMCktPnJuYl9mbGFncykpOwogCUxBU1NFUlRGKE9CRF9CUldfUkVBRCA9PSAweDAxLCAiZm91bmQgMHglLjh4XG4iLAotCQlPQkRfQlJXX1JFQUQpOworCQkgT0JEX0JSV19SRUFEKTsKIAlMQVNTRVJURihPQkRfQlJXX1dSSVRFID09IDB4MDIsICJmb3VuZCAweCUuOHhcbiIsCi0JCU9CRF9CUldfV1JJVEUpOworCQkgT0JEX0JSV19XUklURSk7CiAJTEFTU0VSVEYoT0JEX0JSV19TWU5DID09IDB4MDgsICJmb3VuZCAweCUuOHhcbiIsCi0JCU9CRF9CUldfU1lOQyk7CisJCSBPQkRfQlJXX1NZTkMpOwogCUxBU1NFUlRGKE9CRF9CUldfQ0hFQ0sgPT0gMHgxMCwgImZvdW5kIDB4JS44eFxuIiwKLQkJT0JEX0JSV19DSEVDSyk7CisJCSBPQkRfQlJXX0NIRUNLKTsKIAlMQVNTRVJURihPQkRfQlJXX0ZST01fR1JBTlQgPT0gMHgyMCwgImZvdW5kIDB4JS44eFxuIiwKLQkJT0JEX0JSV19GUk9NX0dSQU5UKTsKKwkJIE9CRF9CUldfRlJPTV9HUkFOVCk7CiAJTEFTU0VSVEYoT0JEX0JSV19HUkFOVEVEID09IDB4NDAsICJmb3VuZCAweCUuOHhcbiIsCi0JCU9CRF9CUldfR1JBTlRFRCk7CisJCSBPQkRfQlJXX0dSQU5URUQpOwogCUxBU1NFUlRGKE9CRF9CUldfTk9DQUNIRSA9PSAweDgwLCAiZm91bmQgMHglLjh4XG4iLAotCQlPQkRfQlJXX05PQ0FDSEUpOworCQkgT0JEX0JSV19OT0NBQ0hFKTsKIAlMQVNTRVJURihPQkRfQlJXX05PUVVPVEEgPT0gMHgxMDAsICJmb3VuZCAweCUuOHhcbiIsCi0JCU9CRF9CUldfTk9RVU9UQSk7CisJCSBPQkRfQlJXX05PUVVPVEEpOwogCUxBU1NFUlRGKE9CRF9CUldfU1JWTE9DSyA9PSAweDIwMCwgImZvdW5kIDB4JS44eFxuIiwKLQkJT0JEX0JSV19TUlZMT0NLKTsKKwkJIE9CRF9CUldfU1JWTE9DSyk7CiAJTEFTU0VSVEYoT0JEX0JSV19BU1lOQyA9PSAweDQwMCwgImZvdW5kIDB4JS44eFxuIiwKLQkJT0JEX0JSV19BU1lOQyk7CisJCSBPQkRfQlJXX0FTWU5DKTsKIAlMQVNTRVJURihPQkRfQlJXX01FTUFMTE9DID09IDB4ODAwLCAiZm91bmQgMHglLjh4XG4iLAotCQlPQkRfQlJXX01FTUFMTE9DKTsKKwkJIE9CRF9CUldfTUVNQUxMT0MpOwogCUxBU1NFUlRGKE9CRF9CUldfT1ZFUl9VU1JRVU9UQSA9PSAweDEwMDAsICJmb3VuZCAweCUuOHhcbiIsCiAJCSBPQkRfQlJXX09WRVJfVVNSUVVPVEEpOwogCUxBU1NFUlRGKE9CRF9CUldfT1ZFUl9HUlBRVU9UQSA9PSAweDIwMDAsICJmb3VuZCAweCUuOHhcbiIsCkBAIC0xNjYzLDIwMyArMTcyMCwyMDMgQEAKIAkvKiBDaGVja3MgZm9yIHN0cnVjdCBtZHRfYm9keSAqLwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKHN0cnVjdCBtZHRfYm9keSkgPT0gMjE2LCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpKGludClzaXplb2Yoc3RydWN0IG1kdF9ib2R5KSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIGZpZDEpID09IDAsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgZmlkMSkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPmZpZDEpID09IDE2LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+ZmlkMSkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBmaWQyKSA9PSAxNiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBmaWQyKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+ZmlkMikgPT0gMTYsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5maWQyKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIGhhbmRsZSkgPT0gMzIsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgaGFuZGxlKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+aGFuZGxlKSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+aGFuZGxlKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHZhbGlkKSA9PSA0MCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCB2YWxpZCkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnZhbGlkKSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+dmFsaWQpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgc2l6ZSkgPT0gNDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgc2l6ZSkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnNpemUpID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5zaXplKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG10aW1lKSA9PSA1NiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtdGltZSkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm10aW1lKSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bXRpbWUpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgYXRpbWUpID09IDY0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIGF0aW1lKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+YXRpbWUpID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5hdGltZSkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBjdGltZSkgPT0gNzIsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgY3RpbWUpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5jdGltZSkgPT0gOCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPmN0aW1lKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIGJsb2NrcykgPT0gODAsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgYmxvY2tzKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+YmxvY2tzKSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+YmxvY2tzKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHRfc3RhdGUpID09IDk2LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHRfc3RhdGUpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT50X3N0YXRlKSA9PSA4LAorCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fZmlkMSkgPT0gMCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fZmlkMSkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19maWQxKSA9PSAxNiwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19maWQxKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19maWQyKSA9PSAxNiwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fZmlkMikpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19maWQyKSA9PSAxNiwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19maWQyKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19oYW5kbGUpID09IDMyLCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19oYW5kbGUpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9faGFuZGxlKSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX2hhbmRsZSkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fdmFsaWQpID09IDQwLCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib192YWxpZCkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib192YWxpZCkgPT0gOCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib192YWxpZCkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fc2l6ZSkgPT0gNDgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX3NpemUpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fc2l6ZSkgPT0gOCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19zaXplKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19tdGltZSkgPT0gNTYsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX210aW1lKSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX210aW1lKSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX210aW1lKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19hdGltZSkgPT0gNjQsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2F0aW1lKSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX2F0aW1lKSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX2F0aW1lKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19jdGltZSkgPT0gNzIsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2N0aW1lKSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX2N0aW1lKSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX2N0aW1lKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19ibG9ja3MpID09IDgwLCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19ibG9ja3MpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fYmxvY2tzKSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX2Jsb2NrcykpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fdF9zdGF0ZSkgPT0gOTYsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX3Rfc3RhdGUpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fdF9zdGF0ZSkgPT0gOCwKIAkJICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT50X3N0YXRlKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIGZzdWlkKSA9PSAxMDQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgZnN1aWQpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5mc3VpZCkgPT0gNCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPmZzdWlkKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIGZzZ2lkKSA9PSAxMDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgZnNnaWQpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5mc2dpZCkgPT0gNCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPmZzZ2lkKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIGNhcGFiaWxpdHkpID09IDExMiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBjYXBhYmlsaXR5KSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+Y2FwYWJpbGl0eSkgPT0gNCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPmNhcGFiaWxpdHkpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbW9kZSkgPT0gMTE2LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1vZGUpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tb2RlKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bW9kZSkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCB1aWQpID09IDEyMCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCB1aWQpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT51aWQpID09IDQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT51aWQpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgZ2lkKSA9PSAxMjQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgZ2lkKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+Z2lkKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+Z2lkKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIGZsYWdzKSA9PSAxMjgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgZmxhZ3MpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5mbGFncykgPT0gNCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPmZsYWdzKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHJkZXYpID09IDEzMiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCByZGV2KSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+cmRldikgPT0gNCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnJkZXYpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbmxpbmspID09IDEzNiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBubGluaykpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm5saW5rKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bmxpbmspKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgdW51c2VkMikgPT0gMTQwLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHVudXNlZDIpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT51bnVzZWQyKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+dW51c2VkMikpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBzdXBwZ2lkKSA9PSAxNDQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgc3VwcGdpZCkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnN1cHBnaWQpID09IDQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5zdXBwZ2lkKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIGVhZGF0YXNpemUpID09IDE0OCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBlYWRhdGFzaXplKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+ZWFkYXRhc2l6ZSkgPT0gNCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPmVhZGF0YXNpemUpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgYWNsc2l6ZSkgPT0gMTUyLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIGFjbHNpemUpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5hY2xzaXplKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+YWNsc2l6ZSkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYXhfbWRzaXplKSA9PSAxNTYsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWF4X21kc2l6ZSkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1heF9tZHNpemUpID09IDQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYXhfbWRzaXplKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1heF9jb29raWVzaXplKSA9PSAxNjAsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWF4X2Nvb2tpZXNpemUpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYXhfY29va2llc2l6ZSkgPT0gNCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1heF9jb29raWVzaXplKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHVpZF9oKSA9PSAxNjQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgdWlkX2gpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT51aWRfaCkgPT0gNCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnVpZF9oKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIGdpZF9oKSA9PSAxNjgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgZ2lkX2gpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5naWRfaCkgPT0gNCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPmdpZF9oKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHBhZGRpbmdfNSkgPT0gMTcyLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHBhZGRpbmdfNSkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnBhZGRpbmdfNSkgPT0gNCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnBhZGRpbmdfNSkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBwYWRkaW5nXzYpID09IDE3NiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBwYWRkaW5nXzYpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5wYWRkaW5nXzYpID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5wYWRkaW5nXzYpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgcGFkZGluZ183KSA9PSAxODQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgcGFkZGluZ183KSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+cGFkZGluZ183KSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+cGFkZGluZ183KSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHBhZGRpbmdfOCkgPT0gMTkyLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHBhZGRpbmdfOCkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnBhZGRpbmdfOCkgPT0gOCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnBhZGRpbmdfOCkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBwYWRkaW5nXzkpID09IDIwMCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBwYWRkaW5nXzkpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5wYWRkaW5nXzkpID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5wYWRkaW5nXzkpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgcGFkZGluZ18xMCkgPT0gMjA4LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHBhZGRpbmdfMTApKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5wYWRkaW5nXzEwKSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+cGFkZGluZ18xMCkpOworCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fdF9zdGF0ZSkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fZnN1aWQpID09IDEwNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fZnN1aWQpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fZnN1aWQpID09IDQsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fZnN1aWQpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2ZzZ2lkKSA9PSAxMDgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2ZzZ2lkKSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX2ZzZ2lkKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX2ZzZ2lkKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19jYXBhYmlsaXR5KSA9PSAxMTIsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2NhcGFiaWxpdHkpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fY2FwYWJpbGl0eSkgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19jYXBhYmlsaXR5KSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19tb2RlKSA9PSAxMTYsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX21vZGUpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fbW9kZSkgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19tb2RlKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib191aWQpID09IDEyMCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fdWlkKSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX3VpZCkgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib191aWQpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2dpZCkgPT0gMTI0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19naWQpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fZ2lkKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX2dpZCkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fZmxhZ3MpID09IDEyOCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fZmxhZ3MpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fZmxhZ3MpID09IDQsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fZmxhZ3MpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX3JkZXYpID09IDEzMiwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fcmRldikpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19yZGV2KSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX3JkZXYpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX25saW5rKSA9PSAxMzYsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX25saW5rKSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX25saW5rKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX25saW5rKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib191bnVzZWQyKSA9PSAxNDAsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX3VudXNlZDIpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fdW51c2VkMikgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib191bnVzZWQyKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19zdXBwZ2lkKSA9PSAxNDQsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX3N1cHBnaWQpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fc3VwcGdpZCkgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19zdXBwZ2lkKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19lYWRhdGFzaXplKSA9PSAxNDgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2VhZGF0YXNpemUpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fZWFkYXRhc2l6ZSkgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19lYWRhdGFzaXplKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19hY2xzaXplKSA9PSAxNTIsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2FjbHNpemUpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fYWNsc2l6ZSkgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19hY2xzaXplKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19tYXhfbWRzaXplKSA9PSAxNTYsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX21heF9tZHNpemUpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fbWF4X21kc2l6ZSkgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19tYXhfbWRzaXplKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19tYXhfY29va2llc2l6ZSkgPT0gMTYwLCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19tYXhfY29va2llc2l6ZSkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19tYXhfY29va2llc2l6ZSkgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19tYXhfY29va2llc2l6ZSkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fdWlkX2gpID09IDE2NCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fdWlkX2gpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fdWlkX2gpID09IDQsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fdWlkX2gpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2dpZF9oKSA9PSAxNjgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2dpZF9oKSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX2dpZF9oKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX2dpZF9oKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19wYWRkaW5nXzUpID09IDE3MiwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fcGFkZGluZ181KSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX3BhZGRpbmdfNSkgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19wYWRkaW5nXzUpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX3BhZGRpbmdfNikgPT0gMTc2LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19wYWRkaW5nXzYpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fcGFkZGluZ182KSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX3BhZGRpbmdfNikpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fcGFkZGluZ183KSA9PSAxODQsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX3BhZGRpbmdfNykpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19wYWRkaW5nXzcpID09IDgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fcGFkZGluZ183KSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19wYWRkaW5nXzgpID09IDE5MiwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fcGFkZGluZ184KSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX3BhZGRpbmdfOCkgPT0gOCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19wYWRkaW5nXzgpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX3BhZGRpbmdfOSkgPT0gMjAwLCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19wYWRkaW5nXzkpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fcGFkZGluZ185KSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX3BhZGRpbmdfOSkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fcGFkZGluZ18xMCkgPT0gMjA4LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19wYWRkaW5nXzEwKSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX3BhZGRpbmdfMTApID09IDgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fcGFkZGluZ18xMCkpOwogCUxBU1NFUlRGKE1EU19GTU9ERV9DTE9TRUQgPT0gMDAwMDAwMDAwMDAwVUwsICJmb3VuZCAwJS4xMW9VTFxuIiwKLQkJTURTX0ZNT0RFX0NMT1NFRCk7CisJCSBNRFNfRk1PREVfQ0xPU0VEKTsKIAlMQVNTRVJURihNRFNfRk1PREVfRVhFQyA9PSAwMDAwMDAwMDAwMDRVTCwgImZvdW5kIDAlLjExb1VMXG4iLAotCQlNRFNfRk1PREVfRVhFQyk7CisJCSBNRFNfRk1PREVfRVhFQyk7CiAJTEFTU0VSVEYoTURTX0ZNT0RFX0VQT0NIID09IDAwMDAwMTAwMDAwMFVMLCAiZm91bmQgMCUuMTFvVUxcbiIsCi0JCU1EU19GTU9ERV9FUE9DSCk7CisJCSBNRFNfRk1PREVfRVBPQ0gpOwogCUxBU1NFUlRGKE1EU19GTU9ERV9UUlVOQyA9PSAwMDAwMDIwMDAwMDBVTCwgImZvdW5kIDAlLjExb1VMXG4iLAotCQlNRFNfRk1PREVfVFJVTkMpOworCQkgTURTX0ZNT0RFX1RSVU5DKTsKIAlMQVNTRVJURihNRFNfRk1PREVfU09NID09IDAwMDAwNDAwMDAwMFVMLCAiZm91bmQgMCUuMTFvVUxcbiIsCi0JCU1EU19GTU9ERV9TT00pOworCQkgTURTX0ZNT0RFX1NPTSk7CiAJTEFTU0VSVEYoTURTX09QRU5fQ1JFQVRFRCA9PSAwMDAwMDAwMDAwMTBVTCwgImZvdW5kIDAlLjExb1VMXG4iLAotCQlNRFNfT1BFTl9DUkVBVEVEKTsKKwkJIE1EU19PUEVOX0NSRUFURUQpOwogCUxBU1NFUlRGKE1EU19PUEVOX0NST1NTID09IDAwMDAwMDAwMDAyMFVMLCAiZm91bmQgMCUuMTFvVUxcbiIsCi0JCU1EU19PUEVOX0NST1NTKTsKKwkJIE1EU19PUEVOX0NST1NTKTsKIAlMQVNTRVJURihNRFNfT1BFTl9DUkVBVCA9PSAwMDAwMDAwMDAxMDBVTCwgImZvdW5kIDAlLjExb1VMXG4iLAotCQlNRFNfT1BFTl9DUkVBVCk7CisJCSBNRFNfT1BFTl9DUkVBVCk7CiAJTEFTU0VSVEYoTURTX09QRU5fRVhDTCA9PSAwMDAwMDAwMDAyMDBVTCwgImZvdW5kIDAlLjExb1VMXG4iLAotCQlNRFNfT1BFTl9FWENMKTsKKwkJIE1EU19PUEVOX0VYQ0wpOwogCUxBU1NFUlRGKE1EU19PUEVOX1RSVU5DID09IDAwMDAwMDAwMTAwMFVMLCAiZm91bmQgMCUuMTFvVUxcbiIsCi0JCU1EU19PUEVOX1RSVU5DKTsKKwkJIE1EU19PUEVOX1RSVU5DKTsKIAlMQVNTRVJURihNRFNfT1BFTl9BUFBFTkQgPT0gMDAwMDAwMDAyMDAwVUwsICJmb3VuZCAwJS4xMW9VTFxuIiwKLQkJTURTX09QRU5fQVBQRU5EKTsKKwkJIE1EU19PUEVOX0FQUEVORCk7CiAJTEFTU0VSVEYoTURTX09QRU5fU1lOQyA9PSAwMDAwMDAwMTAwMDBVTCwgImZvdW5kIDAlLjExb1VMXG4iLAotCQlNRFNfT1BFTl9TWU5DKTsKKwkJIE1EU19PUEVOX1NZTkMpOwogCUxBU1NFUlRGKE1EU19PUEVOX0RJUkVDVE9SWSA9PSAwMDAwMDAyMDAwMDBVTCwgImZvdW5kIDAlLjExb1VMXG4iLAotCQlNRFNfT1BFTl9ESVJFQ1RPUlkpOworCQkgTURTX09QRU5fRElSRUNUT1JZKTsKIAlMQVNTRVJURihNRFNfT1BFTl9CWV9GSUQgPT0gMDAwMDQwMDAwMDAwVUwsICJmb3VuZCAwJS4xMW9VTFxuIiwKLQkJTURTX09QRU5fQllfRklEKTsKKwkJIE1EU19PUEVOX0JZX0ZJRCk7CiAJTEFTU0VSVEYoTURTX09QRU5fREVMQVlfQ1JFQVRFID09IDAwMDEwMDAwMDAwMFVMLCAiZm91bmQgMCUuMTFvVUxcbiIsCi0JCU1EU19PUEVOX0RFTEFZX0NSRUFURSk7CisJCSBNRFNfT1BFTl9ERUxBWV9DUkVBVEUpOwogCUxBU1NFUlRGKE1EU19PUEVOX09XTkVST1ZFUlJJREUgPT0gMDAwMjAwMDAwMDAwVUwsICJmb3VuZCAwJS4xMW9VTFxuIiwKLQkJTURTX09QRU5fT1dORVJPVkVSUklERSk7CisJCSBNRFNfT1BFTl9PV05FUk9WRVJSSURFKTsKIAlMQVNTRVJURihNRFNfT1BFTl9KT0lOX0ZJTEUgPT0gMDAwNDAwMDAwMDAwVUwsICJmb3VuZCAwJS4xMW9VTFxuIiwKLQkJTURTX09QRU5fSk9JTl9GSUxFKTsKKwkJIE1EU19PUEVOX0pPSU5fRklMRSk7CiAJTEFTU0VSVEYoTURTX09QRU5fTE9DSyA9PSAwMDQwMDAwMDAwMDBVTCwgImZvdW5kIDAlLjExb1VMXG4iLAotCQlNRFNfT1BFTl9MT0NLKTsKKwkJIE1EU19PUEVOX0xPQ0spOwogCUxBU1NFUlRGKE1EU19PUEVOX0hBU19FQSA9PSAwMTAwMDAwMDAwMDBVTCwgImZvdW5kIDAlLjExb1VMXG4iLAotCQlNRFNfT1BFTl9IQVNfRUEpOworCQkgTURTX09QRU5fSEFTX0VBKTsKIAlMQVNTRVJURihNRFNfT1BFTl9IQVNfT0JKUyA9PSAwMjAwMDAwMDAwMDBVTCwgImZvdW5kIDAlLjExb1VMXG4iLAotCQlNRFNfT1BFTl9IQVNfT0JKUyk7CisJCSBNRFNfT1BFTl9IQVNfT0JKUyk7CiAJTEFTU0VSVEYoTURTX09QRU5fTk9SRVNUT1JFID09IDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwVUxMLCAiZm91bmQgMCUuMjJsbG9VTExcbiIsCi0JCQkobG9uZyBsb25nKU1EU19PUEVOX05PUkVTVE9SRSk7CisJCSAobG9uZyBsb25nKU1EU19PUEVOX05PUkVTVE9SRSk7CiAJTEFTU0VSVEYoTURTX09QRU5fTkVXU1RSSVBFID09IDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwVUxMLCAiZm91bmQgMCUuMjJsbG9VTExcbiIsCi0JCQkobG9uZyBsb25nKU1EU19PUEVOX05FV1NUUklQRSk7CisJCSAobG9uZyBsb25nKU1EU19PUEVOX05FV1NUUklQRSk7CiAJTEFTU0VSVEYoTURTX09QRU5fVk9MQVRJTEUgPT0gMDAwMDAwMDAwMDA0MDAwMDAwMDAwMDBVTEwsICJmb3VuZCAwJS4yMmxsb1VMTFxuIiwKLQkJCShsb25nIGxvbmcpTURTX09QRU5fVk9MQVRJTEUpOworCQkgKGxvbmcgbG9uZylNRFNfT1BFTl9WT0xBVElMRSk7CiAJTEFTU0VSVEYoTFVTVFJFX1NZTkNfRkwgPT0gMHgwMDAwMDAwOCwgImZvdW5kIDB4JS44eFxuIiwKLQkJTFVTVFJFX1NZTkNfRkwpOworCQkgTFVTVFJFX1NZTkNfRkwpOwogCUxBU1NFUlRGKExVU1RSRV9JTU1VVEFCTEVfRkwgPT0gMHgwMDAwMDAxMCwgImZvdW5kIDB4JS44eFxuIiwKLQkJTFVTVFJFX0lNTVVUQUJMRV9GTCk7CisJCSBMVVNUUkVfSU1NVVRBQkxFX0ZMKTsKIAlMQVNTRVJURihMVVNUUkVfQVBQRU5EX0ZMID09IDB4MDAwMDAwMjAsICJmb3VuZCAweCUuOHhcbiIsCi0JCUxVU1RSRV9BUFBFTkRfRkwpOworCQkgTFVTVFJFX0FQUEVORF9GTCk7CiAJTEFTU0VSVEYoTFVTVFJFX05PQVRJTUVfRkwgPT0gMHgwMDAwMDA4MCwgImZvdW5kIDB4JS44eFxuIiwKLQkJTFVTVFJFX05PQVRJTUVfRkwpOworCQkgTFVTVFJFX05PQVRJTUVfRkwpOwogCUxBU1NFUlRGKExVU1RSRV9ESVJTWU5DX0ZMID09IDB4MDAwMTAwMDAsICJmb3VuZCAweCUuOHhcbiIsCi0JCUxVU1RSRV9ESVJTWU5DX0ZMKTsKKwkJIExVU1RSRV9ESVJTWU5DX0ZMKTsKIAlMQVNTRVJURihNRFNfSU5PREVMT0NLX0xPT0tVUCA9PSAweDAwMDAwMSwgImZvdW5kIDB4JS44eFxuIiwKLQkJTURTX0lOT0RFTE9DS19MT09LVVApOworCQkgTURTX0lOT0RFTE9DS19MT09LVVApOwogCUxBU1NFUlRGKE1EU19JTk9ERUxPQ0tfVVBEQVRFID09IDB4MDAwMDAyLCAiZm91bmQgMHglLjh4XG4iLAotCQlNRFNfSU5PREVMT0NLX1VQREFURSk7CisJCSBNRFNfSU5PREVMT0NLX1VQREFURSk7CiAJTEFTU0VSVEYoTURTX0lOT0RFTE9DS19PUEVOID09IDB4MDAwMDA0LCAiZm91bmQgMHglLjh4XG4iLAotCQlNRFNfSU5PREVMT0NLX09QRU4pOworCQkgTURTX0lOT0RFTE9DS19PUEVOKTsKIAlMQVNTRVJURihNRFNfSU5PREVMT0NLX0xBWU9VVCA9PSAweDAwMDAwOCwgImZvdW5kIDB4JS44eFxuIiwKLQkJTURTX0lOT0RFTE9DS19MQVlPVVQpOworCQkgTURTX0lOT0RFTE9DS19MQVlPVVQpOwogCiAJLyogQ2hlY2tzIGZvciBzdHJ1Y3QgbWR0X2lvZXBvY2ggKi8KIAlMQVNTRVJURigoaW50KXNpemVvZihzdHJ1Y3QgbWR0X2lvZXBvY2gpID09IDI0LCAiZm91bmQgJWxsZFxuIiwKQEAgLTI2MTcsMzUgKzI2NzQsNiBAQAogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9kZXNjICopMCktPmxkX3V1aWQpID09IDQwLCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbG12X2Rlc2MgKikwKS0+bGRfdXVpZCkpOwogCi0JLyogQ2hlY2tzIGZvciBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqLwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKHN0cnVjdCBsbXZfc3RyaXBlX21kKSA9PSAzMiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKHN0cnVjdCBsbXZfc3RyaXBlX21kKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X3N0cmlwZV9tZCwgbWVhX21hZ2ljKSA9PSAwLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X3N0cmlwZV9tZCwgbWVhX21hZ2ljKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqKTApLT5tZWFfbWFnaWMpID09IDQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfc3RyaXBlX21kICopMCktPm1lYV9tYWdpYykpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9zdHJpcGVfbWQsIG1lYV9jb3VudCkgPT0gNCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9zdHJpcGVfbWQsIG1lYV9jb3VudCkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9zdHJpcGVfbWQgKikwKS0+bWVhX2NvdW50KSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqKTApLT5tZWFfY291bnQpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBsbXZfc3RyaXBlX21kLCBtZWFfbWFzdGVyKSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X3N0cmlwZV9tZCwgbWVhX21hc3RlcikpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9zdHJpcGVfbWQgKikwKS0+bWVhX21hc3RlcikgPT0gNCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9zdHJpcGVfbWQgKikwKS0+bWVhX21hc3RlcikpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9zdHJpcGVfbWQsIG1lYV9wYWRkaW5nKSA9PSAxMiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9zdHJpcGVfbWQsIG1lYV9wYWRkaW5nKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqKTApLT5tZWFfcGFkZGluZykgPT0gNCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9zdHJpcGVfbWQgKikwKS0+bWVhX3BhZGRpbmcpKTsKLQlDTEFTU0VSVChMT1ZfTUFYUE9PTE5BTUUgPT0gMTYpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9zdHJpcGVfbWQsIG1lYV9wb29sX25hbWVbMTZdKSA9PSAzMiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9zdHJpcGVfbWQsIG1lYV9wb29sX25hbWVbMTZdKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqKTApLT5tZWFfcG9vbF9uYW1lWzE2XSkgPT0gMSwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9zdHJpcGVfbWQgKikwKS0+bWVhX3Bvb2xfbmFtZVsxNl0pKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBsbXZfc3RyaXBlX21kLCBtZWFfaWRzWzBdKSA9PSAzMiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9zdHJpcGVfbWQsIG1lYV9pZHNbMF0pKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfc3RyaXBlX21kICopMCktPm1lYV9pZHNbMF0pID09IDE2LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqKTApLT5tZWFfaWRzWzBdKSk7Ci0KIAkvKiBDaGVja3MgZm9yIHN0cnVjdCBsb3ZfZGVzYyAqLwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKHN0cnVjdCBsb3ZfZGVzYykgPT0gODgsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZihzdHJ1Y3QgbG92X2Rlc2MpKTsKQEAgLTMxOTUsMTAgKzMyMjMsMTAgQEAKIAkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbGxvZ19zZXRhdHRyNjRfcmVjLCBsc3JfZ2lkX2gpKTsKIAlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbG9nX3NldGF0dHI2NF9yZWMgKikwKS0+bHNyX2dpZF9oKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbGxvZ19zZXRhdHRyNjRfcmVjICopMCktPmxzcl9naWRfaCkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxsb2dfc2V0YXR0cjY0X3JlYywgbHNyX3BhZGRpbmcpID09IDQ4LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbGxvZ19zZXRhdHRyNjRfcmVjLCBsc3JfcGFkZGluZykpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGxsb2dfc2V0YXR0cjY0X3JlYyAqKTApLT5sc3JfcGFkZGluZykgPT0gOCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGxsb2dfc2V0YXR0cjY0X3JlYyAqKTApLT5sc3JfcGFkZGluZykpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxsb2dfc2V0YXR0cjY0X3JlYywgbHNyX3ZhbGlkKSA9PSA0OCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGxsb2dfc2V0YXR0cjY0X3JlYywgbHNyX3ZhbGlkKSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbGxvZ19zZXRhdHRyNjRfcmVjICopMCktPmxzcl92YWxpZCkgPT0gOCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGxsb2dfc2V0YXR0cjY0X3JlYyAqKTApLT5sc3JfdmFsaWQpKTsKIAlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBsbG9nX3NldGF0dHI2NF9yZWMsIGxzcl90YWlsKSA9PSA1NiwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGxsb2dfc2V0YXR0cjY0X3JlYywgbHNyX3RhaWwpKTsKIAlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbG9nX3NldGF0dHI2NF9yZWMgKikwKS0+bHNyX3RhaWwpID09IDgsICJmb3VuZCAlbGxkXG4iLApAQCAtMzI3Miw1MCArMzMwMCw2IEBACiAJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgY2hhbmdlbG9nX3JlYyAqKTApLT5jcl9wZmlkKSA9PSAxNiwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGNoYW5nZWxvZ19yZWMgKikwKS0+Y3JfcGZpZCkpOwogCi0JLyogQ2hlY2tzIGZvciBzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMgKi8KLQlMQVNTRVJURigoaW50KXNpemVvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMpID09IDk2LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2Yoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMsIGNyX25hbWVsZW4pID09IDAsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYywgY3JfbmFtZWxlbikpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjICopMCktPmNyX25hbWVsZW4pID09IDIsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYyAqKTApLT5jcl9uYW1lbGVuKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMsIGNyX2ZsYWdzKSA9PSAyLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMsIGNyX2ZsYWdzKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMgKikwKS0+Y3JfZmxhZ3MpID09IDIsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYyAqKTApLT5jcl9mbGFncykpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjLCBjcl90eXBlKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMsIGNyX3R5cGUpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYyAqKTApLT5jcl90eXBlKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMgKikwKS0+Y3JfdHlwZSkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjLCBjcl9pbmRleCkgPT0gOCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjLCBjcl9pbmRleCkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjICopMCktPmNyX2luZGV4KSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMgKikwKS0+Y3JfaW5kZXgpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYywgY3JfcHJldikgPT0gMTYsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYywgY3JfcHJldikpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjICopMCktPmNyX3ByZXYpID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYyAqKTApLT5jcl9wcmV2KSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMsIGNyX3RpbWUpID09IDI0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMsIGNyX3RpbWUpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYyAqKTApLT5jcl90aW1lKSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMgKikwKS0+Y3JfdGltZSkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjLCBjcl90ZmlkKSA9PSAzMiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjLCBjcl90ZmlkKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMgKikwKS0+Y3JfdGZpZCkgPT0gMTYsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYyAqKTApLT5jcl90ZmlkKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMsIGNyX3BmaWQpID09IDQ4LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMsIGNyX3BmaWQpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYyAqKTApLT5jcl9wZmlkKSA9PSAxNiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjICopMCktPmNyX3BmaWQpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYywgY3Jfc2ZpZCkgPT0gNjQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYywgY3Jfc2ZpZCkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjICopMCktPmNyX3NmaWQpID09IDE2LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMgKikwKS0+Y3Jfc2ZpZCkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjLCBjcl9zcGZpZCkgPT0gODAsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYywgY3Jfc3BmaWQpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYyAqKTApLT5jcl9zcGZpZCkgPT0gMTYsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYyAqKTApLT5jcl9zcGZpZCkpOwotCiAJLyogQ2hlY2tzIGZvciBzdHJ1Y3QgY2hhbmdlbG9nX3NldGluZm8gKi8KIAlMQVNTRVJURigoaW50KXNpemVvZihzdHJ1Y3QgY2hhbmdlbG9nX3NldGluZm8pID09IDEyLCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpKGludClzaXplb2Yoc3RydWN0IGNoYW5nZWxvZ19zZXRpbmZvKSk7CkBAIC0zMzM5LDEwICszMzIzLDEwIEBACiAJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGxsb2dfY2hhbmdlbG9nX3JlYywgY3IpKTsKIAlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbG9nX2NoYW5nZWxvZ19yZWMgKikwKS0+Y3IpID09IDY0LCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbGxvZ19jaGFuZ2Vsb2dfcmVjICopMCktPmNyKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbGxvZ19jaGFuZ2Vsb2dfcmVjLCBjcl90YWlsKSA9PSA4MCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGxsb2dfY2hhbmdlbG9nX3JlYywgY3JfdGFpbCkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGxsb2dfY2hhbmdlbG9nX3JlYyAqKTApLT5jcl90YWlsKSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbGxvZ19jaGFuZ2Vsb2dfcmVjICopMCktPmNyX3RhaWwpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBsbG9nX2NoYW5nZWxvZ19yZWMsIGNyX2RvX25vdF91c2UpID09IDgwLCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbGxvZ19jaGFuZ2Vsb2dfcmVjLCBjcl9kb19ub3RfdXNlKSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbGxvZ19jaGFuZ2Vsb2dfcmVjICopMCktPmNyX2RvX25vdF91c2UpID09IDgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsbG9nX2NoYW5nZWxvZ19yZWMgKikwKS0+Y3JfZG9fbm90X3VzZSkpOwogCiAJLyogQ2hlY2tzIGZvciBzdHJ1Y3QgbGxvZ19jaGFuZ2Vsb2dfdXNlcl9yZWMgKi8KIAlMQVNTRVJURigoaW50KXNpemVvZihzdHJ1Y3QgbGxvZ19jaGFuZ2Vsb2dfdXNlcl9yZWMpID09IDQwLCAiZm91bmQgJWxsZFxuIiwKQEAgLTM1MDYsNiArMzQ5MCwxOSBAQAogCUNMQVNTRVJUKExMT0dfT1JJR0lOX0hBTkRMRV9ERVNUUk9ZID09IDUwOSk7CiAJQ0xBU1NFUlQoTExPR19GSVJTVF9PUEMgPT0gNTAxKTsKIAlDTEFTU0VSVChMTE9HX0xBU1RfT1BDID09IDUxMCk7CisJQ0xBU1NFUlQoTExPR19DT05GSUdfT1JJR19DVFhUID09IDApOworCUNMQVNTRVJUKExMT0dfQ09ORklHX1JFUExfQ1RYVCA9PSAxKTsKKwlDTEFTU0VSVChMTE9HX01EU19PU1RfT1JJR19DVFhUID09IDIpOworCUNMQVNTRVJUKExMT0dfTURTX09TVF9SRVBMX0NUWFQgPT0gMyk7CisJQ0xBU1NFUlQoTExPR19TSVpFX09SSUdfQ1RYVCA9PSA0KTsKKwlDTEFTU0VSVChMTE9HX1NJWkVfUkVQTF9DVFhUID09IDUpOworCUNMQVNTRVJUKExMT0dfVEVTVF9PUklHX0NUWFQgPT0gOCk7CisJQ0xBU1NFUlQoTExPR19URVNUX1JFUExfQ1RYVCA9PSA5KTsKKwlDTEFTU0VSVChMTE9HX0NIQU5HRUxPR19PUklHX0NUWFQgPT0gMTIpOworCUNMQVNTRVJUKExMT0dfQ0hBTkdFTE9HX1JFUExfQ1RYVCA9PSAxMyk7CisJQ0xBU1NFUlQoTExPR19DSEFOR0VMT0dfVVNFUl9PUklHX0NUWFQgPT0gMTQpOworCUNMQVNTRVJUKExMT0dfQUdFTlRfT1JJR19DVFhUID09IDE1KTsKKwlDTEFTU0VSVChMTE9HX01BWF9DVFhUUyA9PSAxNik7CiAKIAkvKiBDaGVja3MgZm9yIHN0cnVjdCBsbG9nZF9jb25uX2JvZHkgKi8KIAlMQVNTRVJURigoaW50KXNpemVvZihzdHJ1Y3QgbGxvZ2RfY29ubl9ib2R5KSA9PSA0MCwgImZvdW5kICVsbGRcbiIsCkBAIC0zOTQzLDkgKzM5NDAsOSBAQAogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGhzbV9wcm9ncmVzcyAqKTApLT5wYWRkaW5nKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgaHNtX3Byb2dyZXNzICopMCktPnBhZGRpbmcpKTsKIAlMQVNTRVJURihIUF9GTEFHX0NPTVBMRVRFRCA9PSAweDAxLCAiZm91bmQgMHglLjh4XG4iLAotCQlIUF9GTEFHX0NPTVBMRVRFRCk7CisJCSBIUF9GTEFHX0NPTVBMRVRFRCk7CiAJTEFTU0VSVEYoSFBfRkxBR19SRVRSWSA9PSAweDAyLCAiZm91bmQgMHglLjh4XG4iLAotCQlIUF9GTEFHX1JFVFJZKTsKKwkJIEhQX0ZMQUdfUkVUUlkpOwogCiAJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgaHNtX2NvcHksIGhjX2RhdGFfdmVyc2lvbikgPT0gMCwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGhzbV9jb3B5LCBoY19kYXRhX3ZlcnNpb24pKTsKQEAgLTQxMDAsOSArNDA5Nyw5IEBACiAJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgaHNtX3JlcXVlc3QgKikwKS0+aHJfZGF0YV9sZW4pID09IDQsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBoc21fcmVxdWVzdCAqKTApLT5ocl9kYXRhX2xlbikpOwogCUxBU1NFUlRGKEhTTV9GT1JDRV9BQ1RJT04gPT0gMHgwMDAwMDAwMVVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClIU01fRk9SQ0VfQUNUSU9OKTsKKwkJICh1bnNpZ25lZClIU01fRk9SQ0VfQUNUSU9OKTsKIAlMQVNTRVJURihIU01fR0hPU1RfQ09QWSA9PSAweDAwMDAwMDAyVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKUhTTV9HSE9TVF9DT1BZKTsKKwkJICh1bnNpZ25lZClIU01fR0hPU1RfQ09QWSk7CiAKIAkvKiBDaGVja3MgZm9yIHN0cnVjdCBoc21fdXNlcl9yZXF1ZXN0ICovCiAJTEFTU0VSVEYoKGludClzaXplb2Yoc3RydWN0IGhzbV91c2VyX3JlcXVlc3QpID09IDI0LCAiZm91bmQgJWxsZFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9iY20yMDQ4L3JhZGlvLWJjbTIwNDguYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9iY20yMDQ4L3JhZGlvLWJjbTIwNDguYwppbmRleCA4ZGFkZTE5Li5lYTE1Y2M2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYmNtMjA0OC9yYWRpby1iY20yMDQ4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2JjbTIwNDgvcmFkaW8tYmNtMjA0OC5jCkBAIC00ODMsMTAgKzQ4Myw4IEBACiAJCW1lbXNldCgmYmRldi0+cmRzX2luZm8sIDAsIHNpemVvZihiZGV2LT5yZHNfaW5mbykpOwogCX0KIAotCWVyciA9IGJjbTIwNDhfc2VuZF9jb21tYW5kKGJkZXYsIEJDTTIwNDhfSTJDX0ZNX1JEU19TWVNURU0sCi0JCQkJICAgYmRldi0+Y2FjaGVfZm1fcmRzX3N5c3RlbSk7Ci0KLQlyZXR1cm4gZXJyOworCXJldHVybiBiY20yMDQ4X3NlbmRfY29tbWFuZChiZGV2LCBCQ00yMDQ4X0kyQ19GTV9SRFNfU1lTVEVNLAorCQkJCSAgICBiZGV2LT5jYWNoZV9mbV9yZHNfc3lzdGVtKTsKIH0KIAogc3RhdGljIGludCBiY20yMDQ4X2dldF9yZHNfbm9fbG9jayhzdHJ1Y3QgYmNtMjA0OF9kZXZpY2UgKmJkZXYpCkBAIC0xODM0LDkgKzE4MzIsNyBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0JZXJyID0gYmNtMjA0OF9zZXRfcG93ZXJfc3RhdGUoYmRldiwgQkNNMjA0OF9QT1dFUl9PRkYpOwotCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gYmNtMjA0OF9zZXRfcG93ZXJfc3RhdGUoYmRldiwgQkNNMjA0OF9QT1dFUl9PRkYpOwogfQogCiAvKgpAQCAtMTk5NSw5ICsxOTkxLDcgQEAKIAkJCQkJCQkJCVwKIAl2YWx1ZSA9IGJjbTIwNDhfZ2V0XyMjcHJvcChiZGV2KTsJCQkJXAogCQkJCQkJCQkJXAotCXZhbHVlID0gc3ByaW50ZihidWYsIG1hc2sgIlxuIiwgdmFsdWUpOwkJCQlcCi0JCQkJCQkJCQlcCi0JcmV0dXJuIHZhbHVlOwkJCQkJCQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCBtYXNrICJcbiIsIHZhbHVlKTsJCQkJXAogfQogCiAjZGVmaW5lIERFRklORV9TWVNGU19QUk9QRVJUWShwcm9wLCBzaWduYWwsIHNpemUsIG1hc2ssIGNoZWNrKQkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2NlYy9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2NlYy9UT0RPCmluZGV4IGExMGQ0ZjguLjEzMjI0NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jZWMvVE9ETworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY2VjL1RPRE8KQEAgLTEyLDYgKzEyLDcgQEAKIAogT3RoZXIgVE9ET3M6CiAKKy0gVGhlcmUgYXJlIHR3byBwb3NzaWJsZSByZXBsaWVzIHRvIENFQ19NU0dfSU5JVElBVEVfQVJDLiBIb3cgdG8gaGFuZGxlIHRoYXQ/CiAtIEFkZCBhIGZsYWcgdG8gaW5oaWJpdCBwYXNzaW5nIENFQyBSQyBtZXNzYWdlcyB0byB0aGUgcmMgc3Vic3lzdGVtLgogICBBcHBsaWNhdGlvbnMgc2hvdWxkIGJlIGFibGUgdG8gY2hvb3NlIHRoaXMgd2hlbiBjYWxsaW5nIFNfTE9HX0FERFJTLgogLSBJZiB0aGUgcmVwbHkgZmllbGQgb2YgY2VjX21zZyBpcyBzZXQgdGhlbiB3aGVuIHRoZSByZXBseSBhcnJpdmVzIGl0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY2VjL2NlYy1hZGFwLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY2VjL2NlYy1hZGFwLmMKaW5kZXggYjIzOTNiYi4uOTQ2OTg2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2NlYy9jZWMtYWRhcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jZWMvY2VjLWFkYXAuYwpAQCAtMTI0LDEwICsxMjQsMTAgQEAKIAl1NjQgdHMgPSBrdGltZV9nZXRfbnMoKTsKIAlzdHJ1Y3QgY2VjX2ZoICpmaDsKIAotCW11dGV4X2xvY2soJmFkYXAtPmRldm5vZGUuZmhzX2xvY2spOworCW11dGV4X2xvY2soJmFkYXAtPmRldm5vZGUubG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShmaCwgJmFkYXAtPmRldm5vZGUuZmhzLCBsaXN0KQogCQljZWNfcXVldWVfZXZlbnRfZmgoZmgsIGV2LCB0cyk7Ci0JbXV0ZXhfdW5sb2NrKCZhZGFwLT5kZXZub2RlLmZoc19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXAtPmRldm5vZGUubG9jayk7CiB9CiAKIC8qCkBAIC0xOTEsMTIgKzE5MSwxMiBAQAogCXUzMiBtb25pdG9yX21vZGUgPSB2YWxpZF9sYSA/IENFQ19NT0RFX01PTklUT1IgOgogCQkJCSAgICAgIENFQ19NT0RFX01PTklUT1JfQUxMOwogCi0JbXV0ZXhfbG9jaygmYWRhcC0+ZGV2bm9kZS5maHNfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcC0+ZGV2bm9kZS5sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZoLCAmYWRhcC0+ZGV2bm9kZS5maHMsIGxpc3QpIHsKIAkJaWYgKGZoLT5tb2RlX2ZvbGxvd2VyID49IG1vbml0b3JfbW9kZSkKIAkJCWNlY19xdWV1ZV9tc2dfZmgoZmgsIG1zZyk7CiAJfQotCW11dGV4X3VubG9jaygmYWRhcC0+ZGV2bm9kZS5maHNfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwLT5kZXZub2RlLmxvY2spOwogfQogCiAvKgpAQCAtMjA3LDEyICsyMDcsMTIgQEAKIHsKIAlzdHJ1Y3QgY2VjX2ZoICpmaDsKIAotCW11dGV4X2xvY2soJmFkYXAtPmRldm5vZGUuZmhzX2xvY2spOworCW11dGV4X2xvY2soJmFkYXAtPmRldm5vZGUubG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShmaCwgJmFkYXAtPmRldm5vZGUuZmhzLCBsaXN0KSB7CiAJCWlmIChmaC0+bW9kZV9mb2xsb3dlciA9PSBDRUNfTU9ERV9GT0xMT1dFUikKIAkJCWNlY19xdWV1ZV9tc2dfZmgoZmgsIG1zZyk7CiAJfQotCW11dGV4X3VubG9jaygmYWRhcC0+ZGV2bm9kZS5maHNfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwLT5kZXZub2RlLmxvY2spOwogfQogCiAvKiBOb3RpZnkgdXNlcnNwYWNlIG9mIGFuIGFkYXB0ZXIgc3RhdGUgY2hhbmdlLiAqLwpAQCAtODUxLDYgKzg1MSw5IEBACiAJaWYgKCF2YWxpZF9sYSB8fCBtc2ctPmxlbiA8PSAxKQogCQlyZXR1cm47CiAKKwlpZiAoYWRhcC0+bG9nX2FkZHJzLmxvZ19hZGRyX21hc2sgPT0gMCkKKwkJcmV0dXJuOworCiAJLyoKIAkgKiBQcm9jZXNzIHRoZSBtZXNzYWdlIG9uIHRoZSBwcm90b2NvbCBsZXZlbC4gSWYgaXNfcmVwbHkgaXMgdHJ1ZSwKIAkgKiB0aGVuIGNlY19yZWNlaXZlX25vdGlmeSgpIHdvbid0IHBhc3Mgb24gdGhlIHJlcGx5IHRvIHRoZSBsaXN0ZW5lcihzKQpAQCAtMTA0NywxMSArMTA1MCwxNyBAQAogCQkJZHByaW50aygxLCAiY291bGQgbm90IGNsYWltIExBICVkXG4iLCBpKTsKIAl9CiAKKwlpZiAoYWRhcC0+bG9nX2FkZHJzLmxvZ19hZGRyX21hc2sgPT0gMCAmJgorCSAgICAhKGxhcy0+ZmxhZ3MgJiBDRUNfTE9HX0FERFJTX0ZMX0FMTE9XX1VOUkVHX0ZBTExCQUNLKSkKKwkJZ290byB1bmNvbmZpZ3VyZTsKKwogY29uZmlndXJlZDoKIAlpZiAoYWRhcC0+bG9nX2FkZHJzLmxvZ19hZGRyX21hc2sgPT0gMCkgewogCQkvKiBGYWxsIGJhY2sgdG8gdW5yZWdpc3RlcmVkICovCiAJCWxhcy0+bG9nX2FkZHJbMF0gPSBDRUNfTE9HX0FERFJfVU5SRUdJU1RFUkVEOwogCQlsYXMtPmxvZ19hZGRyX21hc2sgPSAxIDw8IGxhcy0+bG9nX2FkZHJbMF07CisJCWZvciAoaSA9IDE7IGkgPCBsYXMtPm51bV9sb2dfYWRkcnM7IGkrKykKKwkJCWxhcy0+bG9nX2FkZHJbaV0gPSBDRUNfTE9HX0FERFJfSU5WQUxJRDsKIAl9CiAJYWRhcC0+aXNfY29uZmlndXJlZCA9IHRydWU7CiAJYWRhcC0+aXNfY29uZmlndXJpbmcgPSBmYWxzZTsKQEAgLTEwNzAsNiArMTA3OSw4IEBACiAJCQljZWNfcmVwb3J0X2ZlYXR1cmVzKGFkYXAsIGkpOwogCQljZWNfcmVwb3J0X3BoeXNfYWRkcihhZGFwLCBpKTsKIAl9CisJZm9yIChpID0gbGFzLT5udW1fbG9nX2FkZHJzOyBpIDwgQ0VDX01BWF9MT0dfQUREUlM7IGkrKykKKwkJbGFzLT5sb2dfYWRkcltpXSA9IENFQ19MT0dfQUREUl9JTlZBTElEOwogCW11dGV4X2xvY2soJmFkYXAtPmxvY2spOwogCWFkYXAtPmt0aHJlYWRfY29uZmlnID0gTlVMTDsKIAltdXRleF91bmxvY2soJmFkYXAtPmxvY2spOwpAQCAtMTM5OCw3ICsxNDA5LDYgQEAKIAl1OCBpbml0X2xhZGRyID0gY2VjX21zZ19pbml0aWF0b3IobXNnKTsKIAl1OCBkZXZ0eXBlID0gY2VjX2xvZ19hZGRyMmRldihhZGFwLCBkZXN0X2xhZGRyKTsKIAlpbnQgbGFfaWR4ID0gY2VjX2xvZ19hZGRyMmlkeChhZGFwLCBkZXN0X2xhZGRyKTsKLQlib29sIGlzX2RpcmVjdGVkID0gbGFfaWR4ID49IDA7CiAJYm9vbCBmcm9tX3VucmVnaXN0ZXJlZCA9IGluaXRfbGFkZHIgPT0gMHhmOwogCXN0cnVjdCBjZWNfbXNnIHR4X2NlY19tc2cgPSB7IH07CiAKQEAgLTE1NjAsNyArMTU3MCw3IEBACiAJCSAqIFVucHJvY2Vzc2VkIG1lc3NhZ2VzIGFyZSBhYm9ydGVkIGlmIHVzZXJzcGFjZSBpc24ndCBkb2luZwogCQkgKiBhbnkgcHJvY2Vzc2luZyBlaXRoZXIuCiAJCSAqLwotCQlpZiAoaXNfZGlyZWN0ZWQgJiYgIWlzX3JlcGx5ICYmICFhZGFwLT5mb2xsb3dlcl9jbnQgJiYKKwkJaWYgKCFpc19icm9hZGNhc3QgJiYgIWlzX3JlcGx5ICYmICFhZGFwLT5mb2xsb3dlcl9jbnQgJiYKIAkJICAgICFhZGFwLT5jZWNfZm9sbG93ZXIgJiYgbXNnLT5tc2dbMV0gIT0gQ0VDX01TR19GRUFUVVJFX0FCT1JUKQogCQkJcmV0dXJuIGNlY19mZWF0dXJlX2Fib3J0KGFkYXAsIG1zZyk7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2NlYy9jZWMtYXBpLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY2VjL2NlYy1hcGkuYwppbmRleCA3YmU3NjE1Li5lMjc0ZTJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY2VjL2NlYy1hcGkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY2VjL2NlYy1hcGkuYwpAQCAtMTYyLDcgKzE2Miw3IEBACiAJCXJldHVybiAtRU5PVFRZOwogCWlmIChjb3B5X2Zyb21fdXNlcigmbG9nX2FkZHJzLCBwYXJnLCBzaXplb2YobG9nX2FkZHJzKSkpCiAJCXJldHVybiAtRUZBVUxUOwotCWxvZ19hZGRycy5mbGFncyA9IDA7CisJbG9nX2FkZHJzLmZsYWdzICY9IENFQ19MT0dfQUREUlNfRkxfQUxMT1dfVU5SRUdfRkFMTEJBQ0s7CiAJbXV0ZXhfbG9jaygmYWRhcC0+bG9jayk7CiAJaWYgKCFhZGFwLT5pc19jb25maWd1cmluZyAmJgogCSAgICAoIWxvZ19hZGRycy5udW1fbG9nX2FkZHJzIHx8ICFhZGFwLT5pc19jb25maWd1cmVkKSAmJgpAQCAtNDM1LDcgKzQzNSw3IEBACiAJdm9pZCBfX3VzZXIgKnBhcmcgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAKIAlpZiAoIWRldm5vZGUtPnJlZ2lzdGVyZWQpCi0JCXJldHVybiAtRUlPOworCQlyZXR1cm4gLUVOT0RFVjsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBDRUNfQURBUF9HX0NBUFM6CkBAIC01MDgsMTQgKzUwOCwxNCBAQAogCiAJZmlscC0+cHJpdmF0ZV9kYXRhID0gZmg7CiAKLQltdXRleF9sb2NrKCZkZXZub2RlLT5maHNfbG9jayk7CisJbXV0ZXhfbG9jaygmZGV2bm9kZS0+bG9jayk7CiAJLyogUXVldWUgdXAgaW5pdGlhbCBzdGF0ZSBldmVudHMgKi8KIAlldl9zdGF0ZS5zdGF0ZV9jaGFuZ2UucGh5c19hZGRyID0gYWRhcC0+cGh5c19hZGRyOwogCWV2X3N0YXRlLnN0YXRlX2NoYW5nZS5sb2dfYWRkcl9tYXNrID0gYWRhcC0+bG9nX2FkZHJzLmxvZ19hZGRyX21hc2s7CiAJY2VjX3F1ZXVlX2V2ZW50X2ZoKGZoLCAmZXZfc3RhdGUsIDApOwogCiAJbGlzdF9hZGQoJmZoLT5saXN0LCAmZGV2bm9kZS0+ZmhzKTsKLQltdXRleF91bmxvY2soJmRldm5vZGUtPmZoc19sb2NrKTsKKwltdXRleF91bmxvY2soJmRldm5vZGUtPmxvY2spOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01NDAsOSArNTQwLDkgQEAKIAkJY2VjX21vbml0b3JfYWxsX2NudF9kZWMoYWRhcCk7CiAJbXV0ZXhfdW5sb2NrKCZhZGFwLT5sb2NrKTsKIAotCW11dGV4X2xvY2soJmRldm5vZGUtPmZoc19sb2NrKTsKKwltdXRleF9sb2NrKCZkZXZub2RlLT5sb2NrKTsKIAlsaXN0X2RlbCgmZmgtPmxpc3QpOwotCW11dGV4X3VubG9jaygmZGV2bm9kZS0+ZmhzX2xvY2spOworCW11dGV4X3VubG9jaygmZGV2bm9kZS0+bG9jayk7CiAKIAkvKiBVbmhvb2sgcGVuZGluZyB0cmFuc21pdHMgZnJvbSB0aGlzIGZpbGVoYW5kbGUuICovCiAJbXV0ZXhfbG9jaygmYWRhcC0+bG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY2VjL2NlYy1jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY2VjL2NlYy1jb3JlLmMKaW5kZXggMTEyYTVmYS4uM2IxZTRkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2NlYy9jZWMtY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jZWMvY2VjLWNvcmUuYwpAQCAtNTEsMzEgKzUxLDI5IEBACiB7CiAJLyoKIAkgKiBDaGVjayBpZiB0aGUgY2VjIGRldmljZSBpcyBhdmFpbGFibGUuIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSB3aXRoCi0JICogdGhlIGNlY19kZXZub2RlX2xvY2sgaGVsZCB0byBwcmV2ZW50IGFuIG9wZW4vdW5yZWdpc3RlciByYWNlOgorCSAqIHRoZSBkZXZub2RlLT5sb2NrIGhlbGQgdG8gcHJldmVudCBhbiBvcGVuL3VucmVnaXN0ZXIgcmFjZToKIAkgKiB3aXRob3V0IHRoZSBsb2NrLCB0aGUgZGV2aWNlIGNvdWxkIGJlIHVucmVnaXN0ZXJlZCBhbmQgZnJlZWQgYmV0d2VlbgogCSAqIHRoZSBkZXZub2RlLT5yZWdpc3RlcmVkIGNoZWNrIGFuZCBnZXRfZGV2aWNlKCkgY2FsbHMsIGxlYWRpbmcgdG8KIAkgKiBhIGNyYXNoLgogCSAqLwotCW11dGV4X2xvY2soJmNlY19kZXZub2RlX2xvY2spOworCW11dGV4X2xvY2soJmRldm5vZGUtPmxvY2spOwogCS8qCiAJICogcmV0dXJuIEVOWElPIGlmIHRoZSBjZWMgZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQKIAkgKiBhbHJlYWR5IG9yIGlmIGl0IGlzIG5vdCByZWdpc3RlcmVkIGFueW1vcmUuCiAJICovCiAJaWYgKCFkZXZub2RlLT5yZWdpc3RlcmVkKSB7Ci0JCW11dGV4X3VubG9jaygmY2VjX2Rldm5vZGVfbG9jayk7CisJCW11dGV4X3VubG9jaygmZGV2bm9kZS0+bG9jayk7CiAJCXJldHVybiAtRU5YSU87CiAJfQogCS8qIGFuZCBpbmNyZWFzZSB0aGUgZGV2aWNlIHJlZmNvdW50ICovCiAJZ2V0X2RldmljZSgmZGV2bm9kZS0+ZGV2KTsKLQltdXRleF91bmxvY2soJmNlY19kZXZub2RlX2xvY2spOworCW11dGV4X3VubG9jaygmZGV2bm9kZS0+bG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKIHZvaWQgY2VjX3B1dF9kZXZpY2Uoc3RydWN0IGNlY19kZXZub2RlICpkZXZub2RlKQogewotCW11dGV4X2xvY2soJmNlY19kZXZub2RlX2xvY2spOwogCXB1dF9kZXZpY2UoJmRldm5vZGUtPmRldik7Ci0JbXV0ZXhfdW5sb2NrKCZjZWNfZGV2bm9kZV9sb2NrKTsKIH0KIAogLyogQ2FsbGVkIHdoZW4gdGhlIGxhc3QgdXNlciBvZiB0aGUgY2VjIGRldmljZSBleGl0cy4gKi8KQEAgLTg0LDExICs4MiwxMCBAQAogCXN0cnVjdCBjZWNfZGV2bm9kZSAqZGV2bm9kZSA9IHRvX2NlY19kZXZub2RlKGNkKTsKIAogCW11dGV4X2xvY2soJmNlY19kZXZub2RlX2xvY2spOwotCiAJLyogTWFyayBkZXZpY2Ugbm9kZSBudW1iZXIgYXMgZnJlZSAqLwogCWNsZWFyX2JpdChkZXZub2RlLT5taW5vciwgY2VjX2Rldm5vZGVfbnVtcyk7Ci0KIAltdXRleF91bmxvY2soJmNlY19kZXZub2RlX2xvY2spOworCiAJY2VjX2RlbGV0ZV9hZGFwdGVyKHRvX2NlY19hZGFwdGVyKGRldm5vZGUpKTsKIH0KIApAQCAtMTE3LDcgKzExNCw3IEBACiAKIAkvKiBJbml0aWFsaXphdGlvbiAqLwogCUlOSVRfTElTVF9IRUFEKCZkZXZub2RlLT5maHMpOwotCW11dGV4X2luaXQoJmRldm5vZGUtPmZoc19sb2NrKTsKKwltdXRleF9pbml0KCZkZXZub2RlLT5sb2NrKTsKIAogCS8qIFBhcnQgMTogRmluZCBhIGZyZWUgbWlub3IgbnVtYmVyICovCiAJbXV0ZXhfbG9jaygmY2VjX2Rldm5vZGVfbG9jayk7CkBAIC0xNjAsNyArMTU3LDkgQEAKIGNkZXZfZGVsOgogCWNkZXZfZGVsKCZkZXZub2RlLT5jZGV2KTsKIGNscl9iaXQ6CisJbXV0ZXhfbG9jaygmY2VjX2Rldm5vZGVfbG9jayk7CiAJY2xlYXJfYml0KGRldm5vZGUtPm1pbm9yLCBjZWNfZGV2bm9kZV9udW1zKTsKKwltdXRleF91bmxvY2soJmNlY19kZXZub2RlX2xvY2spOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE3NywxNyArMTc2LDIxIEBACiB7CiAJc3RydWN0IGNlY19maCAqZmg7CiAKLQkvKiBDaGVjayBpZiBkZXZub2RlIHdhcyBuZXZlciByZWdpc3RlcmVkIG9yIGFscmVhZHkgdW5yZWdpc3RlcmVkICovCi0JaWYgKCFkZXZub2RlLT5yZWdpc3RlcmVkIHx8IGRldm5vZGUtPnVucmVnaXN0ZXJlZCkKLQkJcmV0dXJuOworCW11dGV4X2xvY2soJmRldm5vZGUtPmxvY2spOwogCi0JbXV0ZXhfbG9jaygmZGV2bm9kZS0+ZmhzX2xvY2spOworCS8qIENoZWNrIGlmIGRldm5vZGUgd2FzIG5ldmVyIHJlZ2lzdGVyZWQgb3IgYWxyZWFkeSB1bnJlZ2lzdGVyZWQgKi8KKwlpZiAoIWRldm5vZGUtPnJlZ2lzdGVyZWQgfHwgZGV2bm9kZS0+dW5yZWdpc3RlcmVkKSB7CisJCW11dGV4X3VubG9jaygmZGV2bm9kZS0+bG9jayk7CisJCXJldHVybjsKKwl9CisKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZoLCAmZGV2bm9kZS0+ZmhzLCBsaXN0KQogCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmZoLT53YWl0KTsKLQltdXRleF91bmxvY2soJmRldm5vZGUtPmZoc19sb2NrKTsKIAogCWRldm5vZGUtPnJlZ2lzdGVyZWQgPSBmYWxzZTsKIAlkZXZub2RlLT51bnJlZ2lzdGVyZWQgPSB0cnVlOworCW11dGV4X3VubG9jaygmZGV2bm9kZS0+bG9jayk7CisKIAlkZXZpY2VfZGVsKCZkZXZub2RlLT5kZXYpOwogCWNkZXZfZGVsKCZkZXZub2RlLT5jZGV2KTsKIAlwdXRfZGV2aWNlKCZkZXZub2RlLT5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2N4ZDIwOTkvY3hkMjA5OS5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2N4ZDIwOTkvY3hkMjA5OS5jCmluZGV4IDY5MmJhM2UuLmZlZGViM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jeGQyMDk5L2N4ZDIwOTkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY3hkMjA5OS9jeGQyMDk5LmMKQEAgLTY2MCw3ICs2NjAsNyBAQAogCXN0cnVjdCBjeGQgKmNpID0gY2EtPmRhdGE7CiAKIAltdXRleF9sb2NrKCZjaS0+bG9jayk7Ci0JcHJpbnRrKGtlcm5fSU5GTyAid3JpdGVfZGF0YSAlZFxuIiwgZWNvdW50KTsKKwlkZXZfaW5mbygmY2ktPmkyYy0+ZGV2LCAid3JpdGVfZGF0YSAlZFxuIiwgZWNvdW50KTsKIAl3cml0ZV9yZWcoY2ksIDB4MGQsIGVjb3VudD4+OCk7CiAJd3JpdGVfcmVnKGNpLCAweDBlLCBlY291bnQmMHhmZik7CiAJd3JpdGVfYmxvY2soY2ksIDB4MTEsIGVidWYsIGVjb3VudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL2RhdmluY2lfdnBmZV91c2VyLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL2RhdmluY2lfdnBmZV91c2VyLmgKaW5kZXggZjRmMzVjOS4uZDNmMzRmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS9kYXZpbmNpX3ZwZmVfdXNlci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvZGF2aW5jaV92cGZlX3VzZXIuaApAQCAtNTQ0LDQxICs1NDQsNDEgQEAKIC8qIElQSVBFIG1vZHVsZSBjb25maWd1cmF0aW9ucyAqLwogCiAvKiBJUElQRSBpbnB1dCBjb25maWd1cmF0aW9uICovCi0jZGVmaW5lIFZQRkVfSVBJUEVfSU5QVVRfQ09ORklHCQkoMSA8PCAwKQorI2RlZmluZSBWUEZFX0lQSVBFX0lOUFVUX0NPTkZJRwkJQklUKDApCiAvKiBMVVQgYmFzZWQgRGVmZWN0IFBpeGVsIENvcnJlY3Rpb24gKi8KLSNkZWZpbmUgVlBGRV9JUElQRV9MVVREUEMJCSgxIDw8IDEpCisjZGVmaW5lIFZQRkVfSVBJUEVfTFVURFBDCQlCSVQoMSkKIC8qIE9uIHRoZSBmbHkgKE9URikgRGVmZWN0IFBpeGVsIENvcnJlY3Rpb24gKi8KLSNkZWZpbmUgVlBGRV9JUElQRV9PVEZEUEMJCSgxIDw8IDIpCisjZGVmaW5lIFZQRkVfSVBJUEVfT1RGRFBDCQlCSVQoMikKIC8qIE5vaXNlIEZpbHRlciAtIDEgKi8KLSNkZWZpbmUgVlBGRV9JUElQRV9ORjEJCQkoMSA8PCAzKQorI2RlZmluZSBWUEZFX0lQSVBFX05GMQkJCUJJVCgzKQogLyogTm9pc2UgRmlsdGVyIC0gMiAqLwotI2RlZmluZSBWUEZFX0lQSVBFX05GMgkJCSgxIDw8IDQpCisjZGVmaW5lIFZQRkVfSVBJUEVfTkYyCQkJQklUKDQpCiAvKiBXaGl0ZSBCYWxhbmNlLiAgQWxzbyBhIGNvbnRyb2wgSUQgKi8KLSNkZWZpbmUgVlBGRV9JUElQRV9XQgkJCSgxIDw8IDUpCisjZGVmaW5lIFZQRkVfSVBJUEVfV0IJCQlCSVQoNSkKIC8qIDFzdCBSR0IgdG8gUkJHIEJsZW5kIG1vZHVsZSAqLwotI2RlZmluZSBWUEZFX0lQSVBFX1JHQjJSR0JfMQkJKDEgPDwgNikKKyNkZWZpbmUgVlBGRV9JUElQRV9SR0IyUkdCXzEJCUJJVCg2KQogLyogMm5kIFJHQiB0byBSQkcgQmxlbmQgbW9kdWxlICovCi0jZGVmaW5lIFZQRkVfSVBJUEVfUkdCMlJHQl8yCQkoMSA8PCA3KQorI2RlZmluZSBWUEZFX0lQSVBFX1JHQjJSR0JfMgkJQklUKDcpCiAvKiBHYW1tYSBDb3JyZWN0aW9uICovCi0jZGVmaW5lIFZQRkVfSVBJUEVfR0FNTUEJCSgxIDw8IDgpCisjZGVmaW5lIFZQRkVfSVBJUEVfR0FNTUEJCUJJVCg4KQogLyogM0QgTFVUIGNvbG9yIGNvbnZlcnNpb24gKi8KLSNkZWZpbmUgVlBGRV9JUElQRV8zRF9MVVQJCSgxIDw8IDkpCisjZGVmaW5lIFZQRkVfSVBJUEVfM0RfTFVUCQlCSVQoOSkKIC8qIFJHQiB0byBZQ2JDciBtb2R1bGUgKi8KLSNkZWZpbmUgVlBGRV9JUElQRV9SR0IyWVVWCQkoMSA8PCAxMCkKKyNkZWZpbmUgVlBGRV9JUElQRV9SR0IyWVVWCQlCSVQoMTApCiAvKiBZVVYgNDIyIGNvbnZlcnNpb24gbW9kdWxlICovCi0jZGVmaW5lIFZQRkVfSVBJUEVfWVVWNDIyX0NPTlYJCSgxIDw8IDExKQorI2RlZmluZSBWUEZFX0lQSVBFX1lVVjQyMl9DT05WCQlCSVQoMTEpCiAvKiBFZGdlIEVuaGFuY2VtZW50ICovCi0jZGVmaW5lIFZQRkVfSVBJUEVfWUVFCQkJKDEgPDwgMTIpCisjZGVmaW5lIFZQRkVfSVBJUEVfWUVFCQkJQklUKDEyKQogLyogR3JlZW4gSW1iYWxhbmNlIENvcnJlY3Rpb24gKi8KLSNkZWZpbmUgVlBGRV9JUElQRV9HSUMJCQkoMSA8PCAxMykKKyNkZWZpbmUgVlBGRV9JUElQRV9HSUMJCQlCSVQoMTMpCiAvKiBDRkEgSW50ZXJwb2xhdGlvbiAqLwotI2RlZmluZSBWUEZFX0lQSVBFX0NGQQkJCSgxIDw8IDE0KQorI2RlZmluZSBWUEZFX0lQSVBFX0NGQQkJCUJJVCgxNCkKIC8qIENocm9tYSBBcnRpZmFjdCBSZWR1Y3Rpb24gKi8KLSNkZWZpbmUgVlBGRV9JUElQRV9DQVIJCQkoMSA8PCAxNSkKKyNkZWZpbmUgVlBGRV9JUElQRV9DQVIJCQlCSVQoMTUpCiAvKiBDaHJvbWEgR2FpbiBTdXBwcmVzc2lvbiAqLwotI2RlZmluZSBWUEZFX0lQSVBFX0NHUwkJCSgxIDw8IDE2KQorI2RlZmluZSBWUEZFX0lQSVBFX0NHUwkJCUJJVCgxNikKIC8qIEdsb2JhbCBicmlnaHRuZXNzIGFuZCBjb250cmFzdCBjb250cm9sICovCi0jZGVmaW5lIFZQRkVfSVBJUEVfR0JDRQkJCSgxIDw8IDE3KQorI2RlZmluZSBWUEZFX0lQSVBFX0dCQ0UJCQlCSVQoMTcpCiAKICNkZWZpbmUgVlBGRV9JUElQRV9NQVhfTU9EVUxFUwkJMTgKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS9kbTM2NV9pc2lmLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL2RtMzY1X2lzaWYuYwppbmRleCBhZTkyMDJkLi41NjliY2RjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL2RtMzY1X2lzaWYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL2RtMzY1X2lzaWYuYwpAQCAtMTQ2LDkgKzE0Niw4IEBACiAJdTMyIGZpZWxkX3N0YXR1czsKIAogCWZpZWxkX3N0YXR1cyA9IGlzaWZfcmVhZChpc2lmLT5pc2lmX2NmZy5iYXNlX2FkZHIsIE1PREVTRVQpOwotCWZpZWxkX3N0YXR1cyA9IChmaWVsZF9zdGF0dXMgPj4gRE0zNjVfSVNJRl9NREZTX09GRlNFVCkgJgotCQkJRE0zNjVfSVNJRl9NREZTX01BU0s7Ci0JcmV0dXJuIGZpZWxkX3N0YXR1czsKKwlyZXR1cm4gKGZpZWxkX3N0YXR1cyA+PiBETTM2NV9JU0lGX01ERlNfT0ZGU0VUKSAmCisJCURNMzY1X0lTSUZfTURGU19NQVNLOwogfQogCiBzdGF0aWMgaW50CkBAIC01OTQsOCArNTkzLDcgQEAKIAlyZXQgPSBpc2lmX3ZhbGlkYXRlX2RmY19wYXJhbXMoJnBhcmFtcy0+ZGZjKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwotCXJldCA9IGlzaWZfdmFsaWRhdGVfYmNsYW1wX3BhcmFtcygmcGFyYW1zLT5iY2xhbXApOwotCXJldHVybiByZXQ7CisJcmV0dXJuIGlzaWZfdmFsaWRhdGVfYmNsYW1wX3BhcmFtcygmcGFyYW1zLT5iY2xhbXApOwogfQogCiBzdGF0aWMgaW50IGlzaWZfc2V0X3BhcmFtcyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB2b2lkICpwYXJhbXMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL2RtMzY1X3Jlc2l6ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvZG0zNjVfcmVzaXplci5jCmluZGV4IDNjZDU2Y2MuLjEyODY2MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvZG0zNjVfcmVzaXplci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvZG0zNjVfcmVzaXplci5jCkBAIC0xMjgsNyArMTI4LDcgQEAKIHN0YXRpYyB2b2lkCiBjb25maWd1cmVfcmVzaXplcl9vdXRfcGFyYW1zKHN0cnVjdCB2cGZlX3Jlc2l6ZXJfZGV2aWNlICpyZXNpemVyLCBpbnQgaW5kZXgsCiAJCQkgICAgIHZvaWQgKm91dHB1dF9zcGVjLCB1bnNpZ25lZCBjaGFyIHBhcnRpYWwsCi0JCQkgICAgIHVuc2lnbmVkIGZsYWcpCisJCQkgICAgIHVuc2lnbmVkIGludCBmbGFnKQogewogCXN0cnVjdCByZXNpemVyX3BhcmFtcyAqcGFyYW0gPSAmcmVzaXplci0+Y29uZmlnOwogCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm91dGZvcm1hdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvdnBmZV92aWRlby5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS92cGZlX3ZpZGVvLmMKaW5kZXggMzMxOWZiOC4uOGJlOWY4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS92cGZlX3ZpZGVvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS92cGZlX3ZpZGVvLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAlzdHJ1Y3QgbWVkaWFfcGFkICpyZW1vdGU7CiAKIAlyZW1vdGUgPSBtZWRpYV9lbnRpdHlfcmVtb3RlX3BhZCgmdnBmZV9kZXYtPnZwZmVfaXNpZi5wYWRzWzBdKTsKLQlpZiAocmVtb3RlID09IE5VTEwpIHsKKwlpZiAoIXJlbW90ZSkgewogCQlwcl9lcnIoIkludmFsaWQgbWVkaWEgY29ubmVjdGlvbiB0byBpc2lmL2NjZGNcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC01NCw3ICs1NCw3IEBACiAJaW50IGk7CiAKIAlyZW1vdGUgPSBtZWRpYV9lbnRpdHlfcmVtb3RlX3BhZCgmdnBmZV9kZXYtPnZwZmVfaXNpZi5wYWRzWzBdKTsKLQlpZiAocmVtb3RlID09IE5VTEwpIHsKKwlpZiAoIXJlbW90ZSkgewogCQlwcl9lcnIoIkludmFsaWQgbWVkaWEgY29ubmVjdGlvbiB0byBpc2lmL2NjZGNcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xMDcsNyArMTA3LDcgQEAKIAlpbnQgcmV0OwogCiAJc3ViZGV2ID0gdnBmZV92aWRlb19yZW1vdGVfc3ViZGV2KHZpZGVvLCAmcGFkKTsKLQlpZiAoc3ViZGV2ID09IE5VTEwpCisJaWYgKCFzdWJkZXYpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJZm10LndoaWNoID0gVjRMMl9TVUJERVZfRk9STUFUX0FDVElWRTsKQEAgLTIzNiw3ICsyMzYsNyBAQAogCSAqIGZvcm1hdCBvZiB0aGUgY29ubmVjdGVkIHBhZC4KIAkgKi8KIAlzdWJkZXYgPSB2cGZlX3ZpZGVvX3JlbW90ZV9zdWJkZXYocGlwZS0+b3V0cHV0c1swXSwgTlVMTCk7Ci0JaWYgKHN1YmRldiA9PSBOVUxMKQorCWlmICghc3ViZGV2KQogCQlyZXR1cm4gLUVQSVBFOwogCiAJd2hpbGUgKDEpIHsKQEAgLTQxMyw3ICs0MTMsNyBAQAogCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGZpbGUgaGFuZGxlIG9iamVjdCAqLwogCWhhbmRsZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2cGZlX2ZoKSwgR0ZQX0tFUk5FTCk7CiAKLQlpZiAoaGFuZGxlID09IE5VTEwpCisJaWYgKCFoYW5kbGUpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJdjRsMl9maF9pbml0KCZoYW5kbGUtPnZmaCwgJnZpZGVvLT52aWRlb19kZXYpOwpAQCAtNjgzLDE0ICs2ODMsMTQgQEAKIAl9CiAJLyogZ2V0IHRoZSByZW1vdGUgcGFkICovCiAJcmVtb3RlID0gbWVkaWFfZW50aXR5X3JlbW90ZV9wYWQoJnZpZGVvLT5wYWQpOwotCWlmIChyZW1vdGUgPT0gTlVMTCkgeworCWlmICghcmVtb3RlKSB7CiAJCXY0bDJfZXJyKCZ2cGZlX2Rldi0+djRsMl9kZXYsCiAJCQkgImludmFsaWQgcmVtb3RlIHBhZCBmb3IgdmlkZW8gbm9kZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAkvKiBnZXQgdGhlIHJlbW90ZSBzdWJkZXYgKi8KIAlzdWJkZXYgPSB2cGZlX3ZpZGVvX3JlbW90ZV9zdWJkZXYodmlkZW8sIE5VTEwpOwotCWlmIChzdWJkZXYgPT0gTlVMTCkgeworCWlmICghc3ViZGV2KSB7CiAJCXY0bDJfZXJyKCZ2cGZlX2Rldi0+djRsMl9kZXYsCiAJCQkgImludmFsaWQgcmVtb3RlIHN1YmRldiBmb3IgdmlkZW8gbm9kZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19idDgyOS5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19idDgyOS5jCmluZGV4IDQ0ZjU2NTUuLjA0ZDg4MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfYnQ4MjkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX2J0ODI5LmMKQEAgLTEyMCw3ICsxMjAsNyBAQAogCWludCByYzsKIAogCXBkZXYgPSBkb19wY2lfcHJvYmUoKTsKLQlpZiAocGRldiA9PSBOVUxMKQorCWlmICghcGRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwpAQCAtMTYzLDcgKzE2Myw2IEBACiAJcmV0dXJuIHJjOwogfQogCi0KIHZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXRpcl9kcml2ZXIuZGV2KTsKQEAgLTE3NCw3ICsxNzMsNiBAQAogCXBjaV9kZXZfcHV0KHBkZXYpOwogfQogCi0KIHN0YXRpYyBpbnQgYXRpcl9pbml0X3N0YXJ0KHZvaWQpCiB7CiAJcGNpX2FkZHJfbGluID0gaW9yZW1hcChwY2lfYWRkcl9waHlzICsgREFUQV9QQ0lfT0ZGLCAweDQwMCk7CkBAIC0xODcsMTAgKzE4NSw5IEBACiAKIHN0YXRpYyB2b2lkIGN5Y2xlX2RlbGF5KGludCBjeWNsZSkKIHsKLQl1ZGVsYXkoV0FJVF9DWUNMRSpjeWNsZSk7CisJdWRlbGF5KFdBSVRfQ1lDTEUgKiBjeWNsZSk7CiB9CiAKLQogc3RhdGljIGludCBwb2xsX21haW4odm9pZCkKIHsKIAl1bnNpZ25lZCBjaGFyIHN0YXR1c19oaWdoLCBzdGF0dXNfbG93OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19pbW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX2ltb24uYwppbmRleCBmZjE5MjZjLi4xOThhODA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX2ltb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX2ltb24uYwpAQCAtMzIsNyArMzIsNiBAQAogI2luY2x1ZGUgPG1lZGlhL2xpcmMuaD4KICNpbmNsdWRlIDxtZWRpYS9saXJjX2Rldi5oPgogCi0KICNkZWZpbmUgTU9EX0FVVEhPUgkiVmVua3kgUmFqdSA8ZGV2QHZlbmt5LndzPiIKICNkZWZpbmUgTU9EX0RFU0MJIkRyaXZlciBmb3IgU291bmRHcmFwaCBpTU9OIE11bHRpTWVkaWEgSVIvRGlzcGxheSIKICNkZWZpbmUgTU9EX05BTUUJImxpcmNfaW1vbiIKQEAgLTIxMiw3ICsyMTEsNiBAQAogCWVsc2UKIAkJZGV2X2luZm8oJmNvbnRleHQtPnVzYmRldi0+ZGV2LAogCQkJICJEZXJlZ2lzdGVyZWQgaU1PTiBkcml2ZXIgKG1pbm9yOiVkKVxuIiwgbWlub3IpOwotCiB9CiAKIC8qKgpAQCAtNDI5LDcgKzQyNyw3IEBACiAKIAlkbyB7CiAJCW1lbWNweShjb250ZXh0LT51c2JfdHhfYnVmLCBjb250ZXh0LT50eC5kYXRhX2J1ZiArIG9mZnNldCwgNyk7Ci0JCWNvbnRleHQtPnVzYl90eF9idWZbN10gPSAodW5zaWduZWQgY2hhcikgc2VxOworCQljb250ZXh0LT51c2JfdHhfYnVmWzddID0gKHVuc2lnbmVkIGNoYXIpc2VxOwogCiAJCXJldHZhbCA9IHNlbmRfcGFja2V0KGNvbnRleHQpOwogCQlpZiAocmV0dmFsKSB7CkBAIC00NDcsNyArNDQ1LDcgQEAKIAlpZiAoY29udGV4dC0+dmZkX3Byb3RvXzZwKSB7CiAJCS8qIFNlbmQgcGFja2V0ICM2ICovCiAJCW1lbWNweShjb250ZXh0LT51c2JfdHhfYnVmLCAmdmZkX3BhY2tldDYsIHNpemVvZih2ZmRfcGFja2V0NikpOwotCQljb250ZXh0LT51c2JfdHhfYnVmWzddID0gKHVuc2lnbmVkIGNoYXIpIHNlcTsKKwkJY29udGV4dC0+dXNiX3R4X2J1Zls3XSA9ICh1bnNpZ25lZCBjaGFyKXNlcTsKIAkJcmV0dmFsID0gc2VuZF9wYWNrZXQoY29udGV4dCk7CiAJCWlmIChyZXR2YWwpCiAJCQlkZXZfZXJyKCZjb250ZXh0LT51c2JkZXYtPmRldiwKQEAgLTU2Myw3ICs1NjEsNyBAQAogCQl2YWx1ZSB8PSBQVUxTRV9CSVQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKQotCQlidWZbaV0gPSB2YWx1ZT4+KGkqOCk7CisJCWJ1ZltpXSA9IHZhbHVlID4+IChpICogOCk7CiAKIAlsaXJjX2J1ZmZlcl93cml0ZShjb250ZXh0LT5kcml2ZXItPnJidWYsIGJ1Zik7CiAJd2FrZV91cCgmY29udGV4dC0+ZHJpdmVyLT5yYnVmLT53YWl0X3BvbGwpOwpAQCAtNTg5LDcgKzU4Nyw3IEBACiAKIAlpZiAobGVuICE9IDgpIHsKIAkJZGV2X3dhcm4oZGV2LCAiaW1vbiAlczogaW52YWxpZCBpbmNvbWluZyBwYWNrZXQgc2l6ZSAobGVuID0gJWQsIGludGYlZClcbiIsCi0JCQlfX2Z1bmNfXywgbGVuLCBpbnRmKTsKKwkJCSBfX2Z1bmNfXywgbGVuLCBpbnRmKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNzA0LDcgKzcwMiw3IEBACiAJLyogcHJldmVudCByYWNlcyBwcm9iaW5nIGRldmljZXMgdy9tdWx0aXBsZSBpbnRlcmZhY2VzICovCiAJbXV0ZXhfbG9jaygmZHJpdmVyX2xvY2spOwogCi0JY29udGV4dCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpbW9uX2NvbnRleHQpLCBHRlBfS0VSTkVMKTsKKwljb250ZXh0ID0ga3phbGxvYyhzaXplb2YoKmNvbnRleHQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNvbnRleHQpCiAJCWdvdG8gZHJpdmVyX3VubG9jazsKIApAQCAtNzg0LDExICs3ODIsMTEgQEAKIAkJCV9fZnVuY19fLCB2ZmRfcHJvdG9fNnApOwogCX0KIAotCWRyaXZlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBsaXJjX2RyaXZlciksIEdGUF9LRVJORUwpOworCWRyaXZlciA9IGt6YWxsb2Moc2l6ZW9mKCpkcml2ZXIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRyaXZlcikKIAkJZ290byBmcmVlX2NvbnRleHQ7CiAKLQlyYnVmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxpcmNfYnVmZmVyKSwgR0ZQX0tFUk5FTCk7CisJcmJ1ZiA9IGttYWxsb2Moc2l6ZW9mKCpyYnVmKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyYnVmKQogCQlnb3RvIGZyZWVfZHJpdmVyOwogCkBAIC03OTcsMTYgKzc5NSwxMSBAQAogCQlnb3RvIGZyZWVfcmJ1ZjsKIAl9CiAJcnhfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJ4X3VyYikgewotCQlkZXZfZXJyKGRldiwgIiVzOiB1c2JfYWxsb2NfdXJiIGZhaWxlZCBmb3IgSVIgdXJiXG4iLCBfX2Z1bmNfXyk7CisJaWYgKCFyeF91cmIpCiAJCWdvdG8gZnJlZV9saXJjX2J1ZjsKLQl9CiAJdHhfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXR4X3VyYikgewotCQlkZXZfZXJyKGRldiwgIiVzOiB1c2JfYWxsb2NfdXJiIGZhaWxlZCBmb3IgZGlzcGxheSB1cmJcbiIsCi0JCSAgICBfX2Z1bmNfXyk7CisJaWYgKCF0eF91cmIpCiAJCWdvdG8gZnJlZV9yeF91cmI7Ci0JfQogCiAJbXV0ZXhfaW5pdCgmY29udGV4dC0+Y3R4X2xvY2spOwogCWNvbnRleHQtPnZmZF9wcm90b182cCA9IHZmZF9wcm90b182cDsKQEAgLTgzNSw3ICs4MjgsNyBAQAogCX0KIAogCWRldl9pbmZvKGRldiwgIlJlZ2lzdGVyZWQgaU1PTiBkcml2ZXIgKGxpcmMgbWlub3I6ICVkKVxuIiwKLQkJCWxpcmNfbWlub3IpOworCQkgbGlyY19taW5vcik7CiAKIAkvKiBOZWVkZWQgd2hpbGUgdW5yZWdpc3RlcmluZyEgKi8KIAlkcml2ZXItPm1pbm9yID0gbGlyY19taW5vcjsKQEAgLTg1Niw4ICs4NDksOCBAQAogCQljb250ZXh0LT5kaXNwbGF5ID0gMTsKIAogCXVzYl9maWxsX2ludF91cmIoY29udGV4dC0+cnhfdXJiLCBjb250ZXh0LT51c2JkZXYsCi0JCXVzYl9yY3ZpbnRwaXBlKGNvbnRleHQtPnVzYmRldiwKLQkJCWNvbnRleHQtPnJ4X2VuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKSwKKwkJCSB1c2JfcmN2aW50cGlwZShjb250ZXh0LT51c2JkZXYsCisJCQkgY29udGV4dC0+cnhfZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpLAogCQljb250ZXh0LT51c2JfcnhfYnVmLCBzaXplb2YoY29udGV4dC0+dXNiX3J4X2J1ZiksCiAJCXVzYl9yeF9jYWxsYmFjaywgY29udGV4dCwKIAkJY29udGV4dC0+cnhfZW5kcG9pbnQtPmJJbnRlcnZhbCk7CkBAIC04ODIsNyArODc1LDcgQEAKIAl9CiAKIAlkZXZfaW5mbyhkZXYsICJpTU9OIGRldmljZSAoJTA0eDolMDR4LCBpbnRmJWQpIG9uIHVzYjwlZDolZD4gaW5pdGlhbGl6ZWRcbiIsCi0JCXZlbmRvciwgcHJvZHVjdCwgaWZudW0sIHVzYmRldi0+YnVzLT5idXNudW0sIHVzYmRldi0+ZGV2bnVtKTsKKwkJIHZlbmRvciwgcHJvZHVjdCwgaWZudW0sIHVzYmRldi0+YnVzLT5idXNudW0sIHVzYmRldi0+ZGV2bnVtKTsKIAogCS8qIEV2ZXJ5dGhpbmcgd2VudCBmaW5lLiBKdXN0IHVubG9jayBhbmQgcmV0dXJuIHJldHZhbCAod2l0aCBpcyAwKSAqLwogCW11dGV4X3VubG9jaygmY29udGV4dC0+Y3R4X2xvY2spOwpAQCAtOTczLDggKzk2Niw4IEBACiAJc3RydWN0IGltb25fY29udGV4dCAqY29udGV4dCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAKIAl1c2JfZmlsbF9pbnRfdXJiKGNvbnRleHQtPnJ4X3VyYiwgY29udGV4dC0+dXNiZGV2LAotCQl1c2JfcmN2aW50cGlwZShjb250ZXh0LT51c2JkZXYsCi0JCQljb250ZXh0LT5yeF9lbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyksCisJCQkgdXNiX3JjdmludHBpcGUoY29udGV4dC0+dXNiZGV2LAorCQkJIGNvbnRleHQtPnJ4X2VuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKSwKIAkJY29udGV4dC0+dXNiX3J4X2J1Ziwgc2l6ZW9mKGNvbnRleHQtPnVzYl9yeF9idWYpLAogCQl1c2JfcnhfY2FsbGJhY2ssIGNvbnRleHQsCiAJCWNvbnRleHQtPnJ4X2VuZHBvaW50LT5iSW50ZXJ2YWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19wYXJhbGxlbC5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19wYXJhbGxlbC5jCmluZGV4IDM5MDZhYzYuLjY0ZDk5ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfcGFyYWxsZWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3BhcmFsbGVsLmMKQEAgLTE2MywxMiArMTYzLDEyIEBACiAJaWYgKGNvdW50ID49IDEwMDAgJiYgdGltZWVsYXBzZWQgPiAwKSB7CiAJCWlmIChkZWZhdWx0X3RpbWVyID09IDApIHsKIAkJCS8qIGF1dG9kZXRlY3QgdGltZXIgKi8KLQkJCW5ld3RpbWVyID0gKDEwMDAwMDAqY291bnQpL3RpbWVlbGFwc2VkOworCQkJbmV3dGltZXIgPSAoMTAwMDAwMCAqIGNvdW50KSAvIHRpbWVlbGFwc2VkOwogCQkJcHJfaW5mbygiJXUgSHogdGltZXIgZGV0ZWN0ZWRcbiIsIG5ld3RpbWVyKTsKIAkJCXJldHVybiBuZXd0aW1lcjsKIAkJfQotCQluZXd0aW1lciA9ICgxMDAwMDAwKmNvdW50KS90aW1lZWxhcHNlZDsKLQkJaWYgKGFicyhuZXd0aW1lciAtIGRlZmF1bHRfdGltZXIpID4gZGVmYXVsdF90aW1lci8xMCkgeworCQluZXd0aW1lciA9ICgxMDAwMDAwICogY291bnQpIC8gdGltZWVsYXBzZWQ7CisJCWlmIChhYnMobmV3dGltZXIgLSBkZWZhdWx0X3RpbWVyKSA+IGRlZmF1bHRfdGltZXIgLyAxMCkgewogCQkJLyogYmFkIHRpbWVyICovCiAJCQlwcl9ub3RpY2UoImJhZCB0aW1lcjogJXUgSHpcbiIsIG5ld3RpbWVyKTsKIAkJCXByX25vdGljZSgidXNpbmcgZGVmYXVsdCB0aW1lcjogJXUgSHpcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3Nhc2VtLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3Nhc2VtLmMKaW5kZXggMjIxOGQwMC4uNDY3OGFlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19zYXNlbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfc2FzZW0uYwpAQCAtNDcsNyArNDcsNiBAQAogI2luY2x1ZGUgPG1lZGlhL2xpcmMuaD4KICNpbmNsdWRlIDxtZWRpYS9saXJjX2Rldi5oPgogCi0KICNkZWZpbmUgTU9EX0FVVEhPUgkiT2xpdmVyIFN0YWJlbCA8b2xpdmVyLnN0YWJlbEBnbXguZGU+LCAiIFwKIAkJCSJUaW0gRGF2aWVzIDx0aW1Ab3BlbnN5c3RlbXMubmV0LmF1PiIKICNkZWZpbmUgTU9EX0RFU0MJIlVTQiBEcml2ZXIgZm9yIFNhc2VtIFJlbW90ZSBDb250cm9sbGVyIFYxLjEiCkBAIC03Myw3ICs3Miw3IEBACiAKIC8qIFZGRCBmaWxlX29wZXJhdGlvbnMgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwogc3RhdGljIGludCB2ZmRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgbG9uZyB2ZmRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGxvbmcgdmZkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBzdGF0aWMgaW50IHZmZF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBzdGF0aWMgc3NpemVfdCB2ZmRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCiAJCQkJc2l6ZV90IG5fYnl0ZXMsIGxvZmZfdCAqcG9zKTsKQEAgLTg2LDcgKzg1LDYgQEAKICNkZWZpbmUgU0FTRU1fREFUQV9CVUZfU1oJMzIKIAogc3RydWN0IHNhc2VtX2NvbnRleHQgewotCiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKIAlpbnQgdmZkX2lzb3BlbjsJCQkvKiBWRkQgcG9ydCBoYXMgYmVlbiBvcGVuZWQgKi8KIAl1bnNpZ25lZCBpbnQgdmZkX2NvbnRyYXN0OwkvKiBWRkQgY29udHJhc3QgKi8KQEAgLTE1Niw3ICsxNTQsNiBAQAogCiAKIC8qKiogTSBPIEQgVSBMIEUgICBDIE8gRCBFICoqKi8KLQogTU9EVUxFX0FVVEhPUihNT0RfQVVUSE9SKTsKIE1PRFVMRV9ERVNDUklQVElPTihNT0RfREVTQyk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CkBAIC0xODYsNyArMTgzLDYgQEAKIAllbHNlCiAJCWRldl9pbmZvKCZjb250ZXh0LT5kZXYtPmRldiwKIAkJCSAiRGVyZWdpc3RlcmVkIFNhc2VtIGRyaXZlciAobWlub3I6JWQpXG4iLCBtaW5vcik7Ci0KIH0KIAogLyoqCkBAIC0yNDMsNyArMjM5LDcgQEAKICAqIENhbGxlZCB3aGVuIHRoZSBWRkQgZGV2aWNlIChlLmcuIC9kZXYvdXNiL2xjZCkKICAqIGlzIGNsb3NlZCBieSB0aGUgYXBwbGljYXRpb24uCiAgKi8KLXN0YXRpYyBsb25nIHZmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBsb25nIHZmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IHNhc2VtX2NvbnRleHQgKmNvbnRleHQ7CiAKQEAgLTI5Nyw3ICsyOTMsNiBAQAogCQljb250ZXh0LT52ZmRfaXNvcGVuID0gMDsKIAkJZGV2X2luZm8oJmNvbnRleHQtPmRldi0+ZGV2LCAiVkZEIHBvcnQgY2xvc2VkXG4iKTsKIAkJaWYgKCFjb250ZXh0LT5kZXZfcHJlc2VudCAmJiAhY29udGV4dC0+aXJfaXNvcGVuKSB7Ci0KIAkJCS8qIERldmljZSBkaXNjb25uZWN0ZWQgYmVmb3JlIGNsb3NlIGFuZCBJUiBwb3J0IGlzCiAJCQkgKiBub3Qgb3Blbi4gSWYgSVIgcG9ydCBpcyBvcGVuLCBjb250ZXh0IHdpbGwgYmUKIAkJCSAqIGRlbGV0ZWQgYnkgaXJfY2xvc2UuICovCkBAIC01NDYsOSArNTQxLDcgQEAKIAkJICogYXQgZGlzY29ubmVjdCB0aW1lLCBzbyBkbyBpdCBub3cuCiAJCSAqLwogCQlkZXJlZ2lzdGVyX2Zyb21fbGlyYyhjb250ZXh0KTsKLQogCQlpZiAoIWNvbnRleHQtPnZmZF9pc29wZW4pIHsKLQogCQkJbXV0ZXhfdW5sb2NrKCZjb250ZXh0LT5jdHhfbG9jayk7CiAJCQlkZWxldGVfY29udGV4dChjb250ZXh0KTsKIAkJCXJldHVybjsKQEAgLTYzMyw3ICs2MjYsNiBAQAogCQlyZXR1cm47CiAKIAlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7Ci0KIAljYXNlIC1FTk9FTlQ6CQkvKiB1c2Jjb3JlIHVubGluayBzdWNjZXNzZnVsISAqLwogCQlyZXR1cm47CiAKQEAgLTY1MSw4ICs2NDMsNiBAQAogCXVzYl9zdWJtaXRfdXJiKGNvbnRleHQtPnJ4X3VyYiwgR0ZQX0FUT01JQyk7CiB9CiAKLQotCiAvKioKICAqIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBVU0IgY29yZSBBUEk6IFByb2JlCiAgKi8KQEAgLTcwOSw3ICs2OTksNiBAQAogCiAJCX0gZWxzZSBpZiAoIXZmZF9lcF9mb3VuZCAmJgogCQkJdXNiX2VuZHBvaW50X2lzX2ludF9vdXQoZXApKSB7Ci0KIAkJCXR4X2VuZHBvaW50ID0gZXA7CiAJCQl2ZmRfZXBfZm91bmQgPSAxOwogCQkJaWYgKGRlYnVnKQpAQCAtNzM1LDE3ICs3MjQsMTcgQEAKIAkvKiBBbGxvY2F0ZSBtZW1vcnkgKi8KIAlhbGxvY19zdGF0dXMgPSAwOwogCi0JY29udGV4dCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzYXNlbV9jb250ZXh0KSwgR0ZQX0tFUk5FTCk7CisJY29udGV4dCA9IGt6YWxsb2Moc2l6ZW9mKCpjb250ZXh0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjb250ZXh0KSB7CiAJCWFsbG9jX3N0YXR1cyA9IDE7CiAJCWdvdG8gYWxsb2Nfc3RhdHVzX3N3aXRjaDsKIAl9Ci0JZHJpdmVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxpcmNfZHJpdmVyKSwgR0ZQX0tFUk5FTCk7CisJZHJpdmVyID0ga3phbGxvYyhzaXplb2YoKmRyaXZlciksIEdGUF9LRVJORUwpOwogCWlmICghZHJpdmVyKSB7CiAJCWFsbG9jX3N0YXR1cyA9IDI7CiAJCWdvdG8gYWxsb2Nfc3RhdHVzX3N3aXRjaDsKIAl9Ci0JcmJ1ZiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsaXJjX2J1ZmZlciksIEdGUF9LRVJORUwpOworCXJidWYgPSBrbWFsbG9jKHNpemVvZigqcmJ1ZiksIEdGUF9LRVJORUwpOwogCWlmICghcmJ1ZikgewogCQlhbGxvY19zdGF0dXMgPSAzOwogCQlnb3RvIGFsbG9jX3N0YXR1c19zd2l0Y2g7CkBAIC03NTgsMTcgKzc0NywxMiBAQAogCX0KIAlyeF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCWlmICghcnhfdXJiKSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LAotCQkJIiVzOiB1c2JfYWxsb2NfdXJiIGZhaWxlZCBmb3IgSVIgdXJiXG4iLCBfX2Z1bmNfXyk7CiAJCWFsbG9jX3N0YXR1cyA9IDU7CiAJCWdvdG8gYWxsb2Nfc3RhdHVzX3N3aXRjaDsKIAl9CiAJaWYgKHZmZF9lcF9mb3VuZCkgewogCQl0eF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCQlpZiAoIXR4X3VyYikgewotCQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsCi0JCQkJIiVzOiB1c2JfYWxsb2NfdXJiIGZhaWxlZCBmb3IgVkZEIHVyYiIsCi0JCQkJX19mdW5jX18pOwogCQkJYWxsb2Nfc3RhdHVzID0gNjsKIAkJCWdvdG8gYWxsb2Nfc3RhdHVzX3N3aXRjaDsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3B1bHNlOC1jZWMvcHVsc2U4LWNlYy5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3B1bHNlOC1jZWMvcHVsc2U4LWNlYy5jCmluZGV4IDk0Zjg1OTAuLmVkOGJkOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9wdWxzZTgtY2VjL3B1bHNlOC1jZWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvcHVsc2U4LWNlYy9wdWxzZTgtY2VjLmMKQEAgLTExNCwxNCArMTE0LDExIEBACiAJCWNlY190cmFuc21pdF9kb25lKHB1bHNlOC0+YWRhcCwgQ0VDX1RYX1NUQVRVU19PSywKIAkJCQkgIDAsIDAsIDAsIDApOwogCQlicmVhazsKLQljYXNlIE1TR0NPREVfVFJBTlNNSVRfRkFJTEVEX0xJTkU6Ci0JCWNlY190cmFuc21pdF9kb25lKHB1bHNlOC0+YWRhcCwgQ0VDX1RYX1NUQVRVU19BUkJfTE9TVCwKLQkJCQkgIDEsIDAsIDAsIDApOwotCQlicmVhazsKIAljYXNlIE1TR0NPREVfVFJBTlNNSVRfRkFJTEVEX0FDSzoKIAkJY2VjX3RyYW5zbWl0X2RvbmUocHVsc2U4LT5hZGFwLCBDRUNfVFhfU1RBVFVTX05BQ0ssCiAJCQkJICAwLCAxLCAwLCAwKTsKIAkJYnJlYWs7CisJY2FzZSBNU0dDT0RFX1RSQU5TTUlUX0ZBSUxFRF9MSU5FOgogCWNhc2UgTVNHQ09ERV9UUkFOU01JVF9GQUlMRURfVElNRU9VVF9EQVRBOgogCWNhc2UgTVNHQ09ERV9UUkFOU01JVF9GQUlMRURfVElNRU9VVF9MSU5FOgogCQljZWNfdHJhbnNtaXRfZG9uZShwdWxzZTgtPmFkYXAsIENFQ19UWF9TVEFUVVNfRVJST1IsCkBAIC0xNzAsNiArMTY3LDkgQEAKIAkJY2FzZSBNU0dDT0RFX1RSQU5TTUlUX0ZBSUxFRF9USU1FT1VUX0xJTkU6CiAJCQlzY2hlZHVsZV93b3JrKCZwdWxzZTgtPndvcmspOwogCQkJYnJlYWs7CisJCWNhc2UgTVNHQ09ERV9ISUdIX0VSUk9SOgorCQljYXNlIE1TR0NPREVfTE9XX0VSUk9SOgorCQljYXNlIE1TR0NPREVfUkVDRUlWRV9GQUlMRUQ6CiAJCWNhc2UgTVNHQ09ERV9USU1FT1VUX0VSUk9SOgogCQkJYnJlYWs7CiAJCWNhc2UgTVNHQ09ERV9DT01NQU5EX0FDQ0VQVEVEOgpAQCAtMzg4LDcgKzM4OCw3IEBACiAJaW50IGVycjsKIAogCWNtZFswXSA9IE1TR0NPREVfVFJBTlNNSVRfSURMRVRJTUU7Ci0JY21kWzFdID0gMzsKKwljbWRbMV0gPSBzaWduYWxfZnJlZV90aW1lOwogCWVyciA9IHB1bHNlOF9zZW5kX2FuZF93YWl0KHB1bHNlOCwgY21kLCAyLAogCQkJCSAgIE1TR0NPREVfQ09NTUFORF9BQ0NFUFRFRCwgMSk7CiAJY21kWzBdID0gTVNHQ09ERV9UUkFOU01JVF9BQ0tfUE9MQVJJVFk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9Eb2N1bWVudGF0aW9uL0FCSS9zeXNmcy1jbGFzcy1tb3N0LnR4dCBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L0RvY3VtZW50YXRpb24vQUJJL3N5c2ZzLWNsYXNzLW1vc3QudHh0CmluZGV4IDQyZmYwZDguLjQ4YWE0NWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L0RvY3VtZW50YXRpb24vQUJJL3N5c2ZzLWNsYXNzLW1vc3QudHh0CisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L0RvY3VtZW50YXRpb24vQUJJL3N5c2ZzLWNsYXNzLW1vc3QudHh0CkBAIC01MSw2ICs1MSwxNDAgQEAKIAkJdXNlcy4KIFVzZXJzOgogCitXaGF0OgkJL3N5cy9jbGFzcy9tb3N0L21vc3Rjb3JlL2RldmljZXMvPG1kZXY+L2RjaQorRGF0ZToJCUp1bmUgMjAxNgorS2VybmVsVmVyc2lvbjoJNC45CitDb250YWN0OglDaHJpc3RpYW4gR3JvbW0gPGNocmlzdGlhbi5ncm9tbUBtaWNyb2NoaXAuY29tPgorRGVzY3JpcHRpb246CisJCUlmIHRoZSBuZXR3b3JrIGludGVyZmFjZSBjb250cm9sbGVyIGlzIGF0dGFjaGVkIHZpYSBVU0IsIGEgZGNpCisJCWRpcmVjdG9yeSBpcyBjcmVhdGVkIHRoYXQgYWxsb3dzIGFwcGxpY2F0aW9ucyB0byB1c2UgdGhlCisJCWNvbnRyb2xsZXIncyBkaXJlY3QgY29tbXVuaWNhdGlvbiBpbnRlcmZhY2UgKERDSSkgdG8gZXhjaGFuZ2UKKwkJaW5mb3JtYXRpb24uCitVc2VyczoKKworV2hhdDoJCS9zeXMvY2xhc3MvbW9zdC9tb3N0Y29yZS9kZXZpY2VzLzxtZGV2Pi9kY2kvYXJiX2FkZHJlc3MKK0RhdGU6CQlKdW5lIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuOQorQ29udGFjdDoJQ2hyaXN0aWFuIEdyb21tIDxjaHJpc3RpYW4uZ3JvbW1AbWljcm9jaGlwLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGlzIGlzIHVzZWQgdG8gc2V0IGFuIGFyYml0cmFyeSBEQ0kgcmVnaXN0ZXIgYWRkcmVzcyBhbgorCQlhcHBsaWNhdGlvbiB3YW50cyB0byByZWFkIGZyb20gb3Igd3JpdGUgdG8uCitVc2VyczoKKworV2hhdDoJCS9zeXMvY2xhc3MvbW9zdC9tb3N0Y29yZS9kZXZpY2VzLzxtZGV2Pi9kY2kvYXJiX3ZhbHVlCitEYXRlOgkJSnVuZSAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LjkKK0NvbnRhY3Q6CUNocmlzdGlhbiBHcm9tbSA8Y2hyaXN0aWFuLmdyb21tQG1pY3JvY2hpcC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhpcyBpcyB1c2VkIHRvIHJlYWQgZnJvbSBvciB3cml0ZSB0byB0aGUgYXJiaXRyYXJ5IERDSSByZWdpc3RlcgorCQl3aG9zZSBhZGRyZXNzIGlzIHN0b3JlZCBpbiBhcmJfYWRkcmVzcy4KK1VzZXJzOgorCitXaGF0OgkJL3N5cy9jbGFzcy9tb3N0L21vc3Rjb3JlL2RldmljZXMvPG1kZXY+L2RjaS9tZXBfZXVpNDhfaGkKK0RhdGU6CQlKdW5lIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuOQorQ29udGFjdDoJQ2hyaXN0aWFuIEdyb21tIDxjaHJpc3RpYW4uZ3JvbW1AbWljcm9jaGlwLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGlzIGlzIHVzZWQgdG8gY2hlY2sgYW5kIGNvbmZpZ3VyZSB0aGUgTUFDIGFkZHJlc3MuCitVc2VyczoKKworV2hhdDoJCS9zeXMvY2xhc3MvbW9zdC9tb3N0Y29yZS9kZXZpY2VzLzxtZGV2Pi9kY2kvbWVwX2V1aTQ4X2xvCitEYXRlOgkJSnVuZSAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LjkKK0NvbnRhY3Q6CUNocmlzdGlhbiBHcm9tbSA8Y2hyaXN0aWFuLmdyb21tQG1pY3JvY2hpcC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhpcyBpcyB1c2VkIHRvIGNoZWNrIGFuZCBjb25maWd1cmUgdGhlIE1BQyBhZGRyZXNzLgorVXNlcnM6CisKK1doYXQ6CQkvc3lzL2NsYXNzL21vc3QvbW9zdGNvcmUvZGV2aWNlcy88bWRldj4vZGNpL21lcF9ldWk0OF9taQorRGF0ZToJCUp1bmUgMjAxNgorS2VybmVsVmVyc2lvbjoJNC45CitDb250YWN0OglDaHJpc3RpYW4gR3JvbW0gPGNocmlzdGlhbi5ncm9tbUBtaWNyb2NoaXAuY29tPgorRGVzY3JpcHRpb246CisJCVRoaXMgaXMgdXNlZCB0byBjaGVjayBhbmQgY29uZmlndXJlIHRoZSBNQUMgYWRkcmVzcy4KK1VzZXJzOgorCitXaGF0OgkJL3N5cy9jbGFzcy9tb3N0L21vc3Rjb3JlL2RldmljZXMvPG1kZXY+L2RjaS9tZXBfZmlsdGVyCitEYXRlOgkJSnVuZSAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LjkKK0NvbnRhY3Q6CUNocmlzdGlhbiBHcm9tbSA8Y2hyaXN0aWFuLmdyb21tQG1pY3JvY2hpcC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhpcyBpcyB1c2VkIHRvIGNoZWNrIGFuZCBjb25maWd1cmUgdGhlIE1FUCBmaWx0ZXIgYWRkcmVzcy4KK1VzZXJzOgorCitXaGF0OgkJL3N5cy9jbGFzcy9tb3N0L21vc3Rjb3JlL2RldmljZXMvPG1kZXY+L2RjaS9tZXBfaGFzaDAKK0RhdGU6CQlKdW5lIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuOQorQ29udGFjdDoJQ2hyaXN0aWFuIEdyb21tIDxjaHJpc3RpYW4uZ3JvbW1AbWljcm9jaGlwLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGlzIGlzIHVzZWQgdG8gY2hlY2sgYW5kIGNvbmZpZ3VyZSB0aGUgTUVQIGhhc2ggdGFibGUuCitVc2VyczoKKworV2hhdDoJCS9zeXMvY2xhc3MvbW9zdC9tb3N0Y29yZS9kZXZpY2VzLzxtZGV2Pi9kY2kvbWVwX2hhc2gxCitEYXRlOgkJSnVuZSAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LjkKK0NvbnRhY3Q6CUNocmlzdGlhbiBHcm9tbSA8Y2hyaXN0aWFuLmdyb21tQG1pY3JvY2hpcC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhpcyBpcyB1c2VkIHRvIGNoZWNrIGFuZCBjb25maWd1cmUgdGhlIE1FUCBoYXNoIHRhYmxlLgorVXNlcnM6CisKK1doYXQ6CQkvc3lzL2NsYXNzL21vc3QvbW9zdGNvcmUvZGV2aWNlcy88bWRldj4vZGNpL21lcF9oYXNoMgorRGF0ZToJCUp1bmUgMjAxNgorS2VybmVsVmVyc2lvbjoJNC45CitDb250YWN0OglDaHJpc3RpYW4gR3JvbW0gPGNocmlzdGlhbi5ncm9tbUBtaWNyb2NoaXAuY29tPgorRGVzY3JpcHRpb246CisJCVRoaXMgaXMgdXNlZCB0byBjaGVjayBhbmQgY29uZmlndXJlIHRoZSBNRVAgaGFzaCB0YWJsZS4KK1VzZXJzOgorCitXaGF0OgkJL3N5cy9jbGFzcy9tb3N0L21vc3Rjb3JlL2RldmljZXMvPG1kZXY+L2RjaS9tZXBfaGFzaDMKK0RhdGU6CQlKdW5lIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuOQorQ29udGFjdDoJQ2hyaXN0aWFuIEdyb21tIDxjaHJpc3RpYW4uZ3JvbW1AbWljcm9jaGlwLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGlzIGlzIHVzZWQgdG8gY2hlY2sgYW5kIGNvbmZpZ3VyZSB0aGUgTUVQIGhhc2ggdGFibGUuCitVc2VyczoKKworV2hhdDoJCS9zeXMvY2xhc3MvbW9zdC9tb3N0Y29yZS9kZXZpY2VzLzxtZGV2Pi9kY2kvbmlfc3RhdGUKK0RhdGU6CQlKdW5lIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuOQorQ29udGFjdDoJQ2hyaXN0aWFuIEdyb21tIDxjaHJpc3RpYW4uZ3JvbW1AbWljcm9jaGlwLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlJbmRpY2F0ZXMgdGhlIGN1cnJlbnQgbmV0d29yayBpbnRlcmZhY2Ugc3RhdGUuCitVc2VyczoKKworV2hhdDoJCS9zeXMvY2xhc3MvbW9zdC9tb3N0Y29yZS9kZXZpY2VzLzxtZGV2Pi9kY2kvbm9kZV9hZGRyZXNzCitEYXRlOgkJSnVuZSAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LjkKK0NvbnRhY3Q6CUNocmlzdGlhbiBHcm9tbSA8Y2hyaXN0aWFuLmdyb21tQG1pY3JvY2hpcC5jb20+CitEZXNjcmlwdGlvbjoKKwkJSW5kaWNhdGVzIHRoZSBjdXJyZW50IG5vZGUgYWRkcmVzcy4KK1VzZXJzOgorCitXaGF0OgkJL3N5cy9jbGFzcy9tb3N0L21vc3Rjb3JlL2RldmljZXMvPG1kZXY+L2RjaS9ub2RlX3Bvc2l0aW9uCitEYXRlOgkJSnVuZSAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LjkKK0NvbnRhY3Q6CUNocmlzdGlhbiBHcm9tbSA8Y2hyaXN0aWFuLmdyb21tQG1pY3JvY2hpcC5jb20+CitEZXNjcmlwdGlvbjoKKwkJSW5kaWNhdGVzIHRoZSBjdXJyZW50IG5vZGUgcG9zaXRpb24uCitVc2VyczoKKworV2hhdDoJCS9zeXMvY2xhc3MvbW9zdC9tb3N0Y29yZS9kZXZpY2VzLzxtZGV2Pi9kY2kvcGFja2V0X2JhbmR3aWR0aAorRGF0ZToJCUp1bmUgMjAxNgorS2VybmVsVmVyc2lvbjoJNC45CitDb250YWN0OglDaHJpc3RpYW4gR3JvbW0gPGNocmlzdGlhbi5ncm9tbUBtaWNyb2NoaXAuY29tPgorRGVzY3JpcHRpb246CisJCUluZGljYXRlcyB0aGUgY29uZmlndXJlZCBwYWNrZXQgYmFuZHdpZHRoLgorVXNlcnM6CisKK1doYXQ6CQkvc3lzL2NsYXNzL21vc3QvbW9zdGNvcmUvZGV2aWNlcy88bWRldj4vZGNpL3N5bmNfZXAKK0RhdGU6CQlKdW5lIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuOQorQ29udGFjdDoJQ2hyaXN0aWFuIEdyb21tIDxjaHJpc3RpYW4uZ3JvbW1AbWljcm9jaGlwLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUcmlnZ2VycyB0aGUgY29udHJvbGxlcidzIHN5bmNocm9uaXphdGlvbiBwcm9jZXNzIGZvciBhIGNlcnRhaW4KKwkJZW5kcG9pbnQuCitVc2VyczoKKwogV2hhdDoJCS9zeXMvY2xhc3MvbW9zdC9tb3N0Y29yZS9kZXZpY2VzLzxtZGV2Pi88Y2hhbm5lbD4vCiBEYXRlOgkJSnVuZSAyMDE1CiBLZXJuZWxWZXJzaW9uOgk0LjMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2FpbS1jZGV2L2NkZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2FpbS1jZGV2L2NkZXYuYwppbmRleCBkZTRmNzZhLi43ZjUxMDI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9haW0tY2Rldi9jZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21vc3QvYWltLWNkZXYvY2Rldi5jCkBAIC01Nyw3ICs1NywxMSBAQAogCiBzdGF0aWMgaW5saW5lIGJvb2wgY2hfZ2V0X21ibyhzdHJ1Y3QgYWltX2NoYW5uZWwgKmMsIHN0cnVjdCBtYm8gKiptYm8pCiB7Ci0JKm1ibyA9IG1vc3RfZ2V0X21ibyhjLT5pZmFjZSwgYy0+Y2hhbm5lbF9pZCwgJmNkZXZfYWltKTsKKwlpZiAoIWtmaWZvX3BlZWsoJmMtPmZpZm8sIG1ibykpIHsKKwkJKm1ibyA9IG1vc3RfZ2V0X21ibyhjLT5pZmFjZSwgYy0+Y2hhbm5lbF9pZCwgJmNkZXZfYWltKTsKKwkJaWYgKCptYm8pCisJCQlrZmlmb19pbigmYy0+ZmlmbywgbWJvLCAxKTsKKwl9CiAJcmV0dXJuICptYm87CiB9CiAKQEAgLTEzMCw3ICsxMzQsNyBAQAogCWlmICghYy0+ZGV2KSB7CiAJCXByX2luZm8oIldBUk46IERldmljZSBpcyBkZXN0cm95ZWRcbiIpOwogCQltdXRleF91bmxvY2soJmMtPmlvX211dGV4KTsKLQkJcmV0dXJuIC1FQlVTWTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJaWYgKGMtPmFjY2Vzc19yZWYpIHsKQEAgLTE4NCw4ICsxODgsNyBAQAogCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmZzZXQpCiB7CiAJaW50IHJldDsKLQlzaXplX3QgYWN0dWFsX2xlbjsKLQlzaXplX3QgbWF4X2xlbjsKKwlzaXplX3QgdG9fY29weSwgbGVmdDsKIAlzdHJ1Y3QgbWJvICptYm8gPSBOVUxMOwogCXN0cnVjdCBhaW1fY2hhbm5lbCAqYyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIApAQCAtMjAxLDI3ICsyMDQsMjggQEAKIAl9CiAKIAlpZiAodW5saWtlbHkoIWMtPmRldikpIHsKLQkJcmV0ID0gLUVQSVBFOworCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIHVubG9jazsKIAl9CiAKLQltYXhfbGVuID0gYy0+Y2ZnLT5idWZmZXJfc2l6ZTsKLQlhY3R1YWxfbGVuID0gbWluKGNvdW50LCBtYXhfbGVuKTsKLQltYm8tPmJ1ZmZlcl9sZW5ndGggPSBhY3R1YWxfbGVuOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKG1iby0+dmlydF9hZGRyZXNzLCBidWYsIG1iby0+YnVmZmVyX2xlbmd0aCkpIHsKKwl0b19jb3B5ID0gbWluKGNvdW50LCBjLT5jZmctPmJ1ZmZlcl9zaXplIC0gYy0+bWJvX29mZnMpOworCWxlZnQgPSBjb3B5X2Zyb21fdXNlcihtYm8tPnZpcnRfYWRkcmVzcyArIGMtPm1ib19vZmZzLCBidWYsIHRvX2NvcHkpOworCWlmIChsZWZ0ID09IHRvX2NvcHkpIHsKIAkJcmV0ID0gLUVGQVVMVDsKLQkJZ290byBwdXRfbWJvOworCQlnb3RvIHVubG9jazsKIAl9CiAKLQlyZXQgPSBtb3N0X3N1Ym1pdF9tYm8obWJvKTsKLQlpZiAocmV0KQotCQlnb3RvIHB1dF9tYm87CisJYy0+bWJvX29mZnMgKz0gdG9fY29weSAtIGxlZnQ7CisJaWYgKGMtPm1ib19vZmZzID49IGMtPmNmZy0+YnVmZmVyX3NpemUgfHwKKwkgICAgYy0+Y2ZnLT5kYXRhX3R5cGUgPT0gTU9TVF9DSF9DT05UUk9MIHx8CisJICAgIGMtPmNmZy0+ZGF0YV90eXBlID09IE1PU1RfQ0hfQVNZTkMpIHsKKwkJa2ZpZm9fc2tpcCgmYy0+Zmlmbyk7CisJCW1iby0+YnVmZmVyX2xlbmd0aCA9IGMtPm1ib19vZmZzOworCQljLT5tYm9fb2ZmcyA9IDA7CisJCW1vc3Rfc3VibWl0X21ibyhtYm8pOworCX0KIAotCW11dGV4X3VubG9jaygmYy0+aW9fbXV0ZXgpOwotCXJldHVybiBhY3R1YWxfbGVuOwotcHV0X21ibzoKLQltb3N0X3B1dF9tYm8obWJvKTsKKwlyZXQgPSB0b19jb3B5IC0gbGVmdDsKIHVubG9jazoKIAltdXRleF91bmxvY2soJmMtPmlvX211dGV4KTsKIAlyZXR1cm4gcmV0OwpAQCAtMjU2LDcgKzI2MCw3IEBACiAJLyogbWFrZSBzdXJlIHdlIGRvbid0IHN1Ym1pdCB0byBnb25lIGRldmljZXMgKi8KIAlpZiAodW5saWtlbHkoIWMtPmRldikpIHsKIAkJbXV0ZXhfdW5sb2NrKCZjLT5pb19tdXRleCk7Ci0JCXJldHVybiAtRUlPOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAl0b19jb3B5ID0gbWluX3Qoc2l6ZV90LApAQCAtMjkwLDcgKzI5NCw3IEBACiAJCWlmICgha2ZpZm9faXNfZW1wdHkoJmMtPmZpZm8pKQogCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOwogCX0gZWxzZSB7Ci0JCWlmIChjaF9oYXNfbWJvKGMpKQorCQlpZiAoIWtmaWZvX2lzX2VtcHR5KCZjLT5maWZvKSB8fCBjaF9oYXNfbWJvKGMpKQogCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKIAl9CiAJcmV0dXJuIG1hc2s7CkBAIC0zNjYsNyArMzcwLDcgQEAKIAlzcGluX2xvY2soJmMtPnVubGluayk7CiAJaWYgKCFjLT5hY2Nlc3NfcmVmIHx8ICFjLT5kZXYpIHsKIAkJc3Bpbl91bmxvY2soJmMtPnVubGluayk7Ci0JCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJa2ZpZm9faW4oJmMtPmZpZm8sICZtYm8sIDEpOwogCXNwaW5fdW5sb2NrKCZjLT51bmxpbmspOwpAQCAtNDk5LDIzICs1MDMsMjcgQEAKIAogc3RhdGljIGludCBfX2luaXQgbW9kX2luaXQodm9pZCkKIHsKKwlpbnQgZXJyOworCiAJcHJfaW5mbygiaW5pdCgpXG4iKTsKIAogCUlOSVRfTElTVF9IRUFEKCZjaGFubmVsX2xpc3QpOwogCXNwaW5fbG9ja19pbml0KCZjaF9saXN0X2xvY2spOwogCWlkYV9pbml0KCZtaW5vcl9pZCk7CiAKLQlpZiAoYWxsb2NfY2hyZGV2X3JlZ2lvbigmYWltX2Rldm5vLCAwLCA1MCwgImNkZXYiKSA8IDApCi0JCXJldHVybiAtRUlPOworCWVyciA9IGFsbG9jX2NocmRldl9yZWdpb24oJmFpbV9kZXZubywgMCwgNTAsICJjZGV2Iik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZGVzdF9pZGE7CiAJbWFqb3IgPSBNQUpPUihhaW1fZGV2bm8pOwogCiAJYWltX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAibW9zdF9jZGV2X2FpbSIpOwogCWlmIChJU19FUlIoYWltX2NsYXNzKSkgewogCQlwcl9lcnIoIm5vIHVkZXYgc3VwcG9ydFxuIik7CisJCWVyciA9IFBUUl9FUlIoYWltX2NsYXNzKTsKIAkJZ290byBmcmVlX2NkZXY7CiAJfQotCi0JaWYgKG1vc3RfcmVnaXN0ZXJfYWltKCZjZGV2X2FpbSkpCisJZXJyID0gbW9zdF9yZWdpc3Rlcl9haW0oJmNkZXZfYWltKTsKKwlpZiAoZXJyKQogCQlnb3RvIGRlc3RfY2xhc3M7CiAJcmV0dXJuIDA7CiAKQEAgLTUyMyw3ICs1MzEsOSBAQAogCWNsYXNzX2Rlc3Ryb3koYWltX2NsYXNzKTsKIGZyZWVfY2RldjoKIAl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oYWltX2Rldm5vLCAxKTsKLQlyZXR1cm4gLUVJTzsKK2Rlc3RfaWRhOgorCWlkYV9kZXN0cm95KCZtaW5vcl9pZCk7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IG1vZF9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9haW0tbmV0d29yay9uZXR3b3JraW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvbW9zdC9haW0tbmV0d29yay9uZXR3b3JraW5nLmMKaW5kZXggMmY0MmRlNC4uNDY1OWE2NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2FpbS1uZXR3b3JrL25ldHdvcmtpbmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbW9zdC9haW0tbmV0d29yay9uZXR3b3JraW5nLmMKQEAgLTI5OCwxNSArMjk4LDE2IEBACiAJc3RydWN0IG1vc3RfaW50ZXJmYWNlICppZmFjZSkKIHsKIAlzdHJ1Y3QgbmV0X2Rldl9jb250ZXh0ICpuZCwgKnRtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrKCZsaXN0X2xvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZsaXN0X2xvY2ssIGZsYWdzKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobmQsIHRtcCwgJm5ldF9kZXZpY2VzLCBsaXN0KSB7CiAJCWlmIChuZC0+aWZhY2UgPT0gaWZhY2UpIHsKLQkJCXNwaW5fdW5sb2NrKCZsaXN0X2xvY2spOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdF9sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm4gbmQ7CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2soJmxpc3RfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdF9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTMxNiw2ICszMTcsNyBAQAogewogCXN0cnVjdCBuZXRfZGV2X2NvbnRleHQgKm5kOwogCXN0cnVjdCBuZXRfZGV2X2NoYW5uZWwgKmNoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoIWlmYWNlKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTMzMiw5ICszMzQsOSBAQAogCiAJCW5kLT5pZmFjZSA9IGlmYWNlOwogCi0JCXNwaW5fbG9jaygmbGlzdF9sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3RfbG9jaywgZmxhZ3MpOwogCQlsaXN0X2FkZCgmbmQtPmxpc3QsICZuZXRfZGV2aWNlcyk7Ci0JCXNwaW5fdW5sb2NrKCZsaXN0X2xvY2spOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0X2xvY2ssIGZsYWdzKTsKIAl9CiAKIAljaCA9IGNjZmctPmRpcmVjdGlvbiA9PSBNT1NUX0NIX1RYID8gJm5kLT50eCA6ICZuZC0+cng7CkBAIC0zNzcsNiArMzc5LDcgQEAKIHsKIAlzdHJ1Y3QgbmV0X2Rldl9jb250ZXh0ICpuZDsKIAlzdHJ1Y3QgbmV0X2Rldl9jaGFubmVsICpjaDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJbmQgPSBnZXRfbmV0X2Rldl9jb250ZXh0KGlmYWNlKTsKIAlpZiAoIW5kKQpAQCAtMzk4LDkgKzQwMSw5IEBACiAJbW9zdF9uZXRfcm1fbmV0ZGV2X3NhZmUobmQpOwogCiAJaWYgKCFuZC0+cngubGlua2VkICYmICFuZC0+dHgubGlua2VkKSB7Ci0JCXNwaW5fbG9jaygmbGlzdF9sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3RfbG9jaywgZmxhZ3MpOwogCQlsaXN0X2RlbCgmbmQtPmxpc3QpOwotCQlzcGluX3VubG9jaygmbGlzdF9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdF9sb2NrLCBmbGFncyk7CiAJCWtmcmVlKG5kKTsKIAl9CiAKQEAgLTUxNCwyMCArNTE3LDIxIEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgbW9zdF9uZXRfZXhpdCh2b2lkKQogewogCXN0cnVjdCBuZXRfZGV2X2NvbnRleHQgKm5kLCAqdG1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2soJmxpc3RfbG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3RfbG9jaywgZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShuZCwgdG1wLCAmbmV0X2RldmljZXMsIGxpc3QpIHsKIAkJbGlzdF9kZWwoJm5kLT5saXN0KTsKLQkJc3Bpbl91bmxvY2soJmxpc3RfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpc3RfbG9jaywgZmxhZ3MpOwogCQkvKgogCQkgKiBkbyBub3QgY2FsbCBtb3N0X3N0b3BfY2hhbm5lbCgpIGhlcmUsIGJlY2F1c2UgY2hhbm5lbHMgYXJlCiAJCSAqIGdvaW5nIHRvIGJlIGNsb3NlZCBpbiBuZG9fc3RvcCgpIGFmdGVyIHVucmVnaXN0ZXJfbmV0ZGV2KCkKIAkJICovCiAJCW1vc3RfbmV0X3JtX25ldGRldl9zYWZlKG5kKTsKIAkJa2ZyZWUobmQpOwotCQlzcGluX2xvY2soJmxpc3RfbG9jayk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZsaXN0X2xvY2ssIGZsYWdzKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJmxpc3RfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdF9sb2NrLCBmbGFncyk7CiAKIAltb3N0X2RlcmVnaXN0ZXJfYWltKCZhaW0pOwogCXByX2luZm8oIm1vc3RfbmV0X2V4aXQoKVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9haW0tc291bmQvc291bmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2FpbS1zb3VuZC9zb3VuZC5jCmluZGV4IDljNjQ1ODAuLmU0MTk4ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2FpbS1zb3VuZC9zb3VuZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2FpbS1zb3VuZC9zb3VuZC5jCkBAIC0yMzQsNyArMjM0LDYgQEAKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewogCQlzdHJ1Y3QgbWJvICptYm8gPSBOVUxMOwogCQlib29sIHBlcmlvZF9lbGFwc2VkID0gZmFsc2U7Ci0JCWludCByZXQ7CiAKIAkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKAogCQkJY2hhbm5lbC0+cGxheWJhY2tfd2FpdHEsCkBAIC0yNTAsMTAgKzI0OSw3IEBACiAJCWVsc2UKIAkJCW1lbXNldChtYm8tPnZpcnRfYWRkcmVzcywgMCwgbWJvLT5idWZmZXJfbGVuZ3RoKTsKIAotCQlyZXQgPSBtb3N0X3N1Ym1pdF9tYm8obWJvKTsKLQkJaWYgKHJldCkKLQkJCWNoYW5uZWwtPmlzX3N0cmVhbV9ydW5uaW5nID0gZmFsc2U7Ci0KKwkJbW9zdF9zdWJtaXRfbWJvKG1ibyk7CiAJCWlmIChwZXJpb2RfZWxhcHNlZCkKIAkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoY2hhbm5lbC0+c3Vic3RyZWFtKTsKIAl9CkBAIC00NTcsNyArNDUzLDcgQEAKIC8qKgogICogSW5pdGlhbGl6YXRpb24gb2Ygc3RydWN0IHNuZF9wY21fb3BzCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgcGNtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgcGNtX29wcyA9IHsKIAkub3BlbiAgICAgICA9IHBjbV9vcGVuLAogCS5jbG9zZSAgICAgID0gcGNtX2Nsb3NlLAogCS5pb2N0bCAgICAgID0gc25kX3BjbV9saWJfaW9jdGwsCkBAIC02MTEsNyArNjA3LDggQEAKIAljaGFubmVsLT5pZCA9IGNoYW5uZWxfaWQ7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmY2hhbm5lbC0+cGxheWJhY2tfd2FpdHEpOwogCi0JaWYgKGF1ZGlvX3NldF9od19wYXJhbXMoJmNoYW5uZWwtPnBjbV9oYXJkd2FyZSwgcGNtX2Zvcm1hdCwgY2ZnKSkKKwlyZXQgPSBhdWRpb19zZXRfaHdfcGFyYW1zKCZjaGFubmVsLT5wY21faGFyZHdhcmUsIHBjbV9mb3JtYXQsIGNmZyk7CisJaWYgKHJldCkKIAkJZ290byBlcnJfZnJlZV9jYXJkOwogCiAJc25wcmludGYoY2FyZC0+ZHJpdmVyLCBzaXplb2YoY2FyZC0+ZHJpdmVyKSwgIiVzIiwgRFJJVkVSX05BTUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21vc3QvYWltLXY0bDIvdmlkZW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2FpbS12NGwyL3ZpZGVvLmMKaW5kZXggMTNhYmY3Yy4uZTA3NDg0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21vc3QvYWltLXY0bDIvdmlkZW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbW9zdC9haW0tdjRsMi92aWRlby5jCkBAIC03OSw3ICs3OSw3IEBACiAJc3RydWN0IG1vc3RfdmlkZW9fZGV2ICptZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKIAlzdHJ1Y3QgYWltX2ZoICpmaDsKIAotCXByX2luZm8oImFpbV92ZGV2X29wZW4oKVxuIik7CisJdjRsMl9pbmZvKCZtZGV2LT52NGwyX2RldiwgImFpbV92ZGV2X29wZW4oKVxuIik7CiAKIAlzd2l0Y2ggKHZkZXYtPnZmbF90eXBlKSB7CiAJY2FzZSBWRkxfVFlQRV9HUkFCQkVSOgpAQCAtOTMsNyArOTMsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWlmICghYXRvbWljX2luY19hbmRfdGVzdCgmbWRldi0+YWNjZXNzX3JlZikpIHsKLQkJcHJfZXJyKCJ0b28gbWFueSBjbGllbnRzXG4iKTsKKwkJdjRsMl9lcnIoJm1kZXYtPnY0bDJfZGV2LCAidG9vIG1hbnkgY2xpZW50c1xuIik7CiAJCXJldCA9IC1FQlVTWTsKIAkJZ290byBlcnJfZGVjOwogCX0KQEAgLTEwNiw3ICsxMDYsNyBAQAogCiAJcmV0ID0gbW9zdF9zdGFydF9jaGFubmVsKG1kZXYtPmlmYWNlLCBtZGV2LT5jaF9pZHgsICZhaW1faW5mbyk7CiAJaWYgKHJldCkgewotCQlwcl9lcnIoIm1vc3Rfc3RhcnRfY2hhbm5lbCgpIGZhaWxlZFxuIik7CisJCXY0bDJfZXJyKCZtZGV2LT52NGwyX2RldiwgIm1vc3Rfc3RhcnRfY2hhbm5lbCgpIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX3JtOwogCX0KIApAQCAtMTI4LDcgKzEyOCw3IEBACiAJc3RydWN0IG1vc3RfdmlkZW9fZGV2ICptZGV2ID0gZmgtPm1kZXY7CiAJc3RydWN0IG1ibyAqbWJvLCAqdG1wOwogCi0JcHJfaW5mbygiYWltX3ZkZXZfY2xvc2UoKVxuIik7CisJdjRsMl9pbmZvKCZtZGV2LT52NGwyX2RldiwgImFpbV92ZGV2X2Nsb3NlKClcbiIpOwogCiAJLyoKIAkgKiBXZSBuZWVkIHRvIHB1dCBNQk9zIGJhY2sgYmVmb3JlIHdlIGNhbGwgbW9zdF9zdG9wX2NoYW5uZWwoKQpAQCAtMTM5LDE1ICsxMzksMTUgQEAKIAkgKiBUaGlzIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gY29yZS4KIAkgKi8KIAotCXNwaW5fbG9jaygmbWRldi0+bGlzdF9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZtZGV2LT5saXN0X2xvY2spOwogCW1kZXYtPm11dGUgPSB0cnVlOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtYm8sIHRtcCwgJm1kZXYtPnBlbmRpbmdfbWJvcywgbGlzdCkgewogCQlsaXN0X2RlbCgmbWJvLT5saXN0KTsKLQkJc3Bpbl91bmxvY2soJm1kZXYtPmxpc3RfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmbWRldi0+bGlzdF9sb2NrKTsKIAkJbW9zdF9wdXRfbWJvKG1ibyk7Ci0JCXNwaW5fbG9jaygmbWRldi0+bGlzdF9sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycSgmbWRldi0+bGlzdF9sb2NrKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJm1kZXYtPmxpc3RfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT5saXN0X2xvY2spOwogCW1vc3Rfc3RvcF9jaGFubmVsKG1kZXYtPmlmYWNlLCBtZGV2LT5jaF9pZHgsICZhaW1faW5mbyk7CiAJbWRldi0+bXV0ZSA9IGZhbHNlOwogCkBAIC0xODcsNyArMTg3LDcgQEAKIAkJaW50IGNvbnN0IGNudCA9IHJlbSA8IGNvdW50ID8gcmVtIDogY291bnQ7CiAKIAkJaWYgKGNvcHlfdG9fdXNlcihidWYsIG1iby0+dmlydF9hZGRyZXNzICsgZmgtPm9mZnMsIGNudCkpIHsKLQkJCXByX2VycigicmVhZDogY29weV90b191c2VyIGZhaWxlZFxuIik7CisJCQl2NGwyX2VycigmbWRldi0+djRsMl9kZXYsICJyZWFkOiBjb3B5X3RvX3VzZXIgZmFpbGVkXG4iKTsKIAkJCWlmICghcmV0KQogCQkJCXJldCA9IC1FRkFVTFQ7CiAJCQlyZXR1cm4gcmV0OwpAQCAtMjAwLDkgKzIwMCw5IEBACiAKIAkJaWYgKGNudCA+PSByZW0pIHsKIAkJCWZoLT5vZmZzID0gMDsKLQkJCXNwaW5fbG9jaygmbWRldi0+bGlzdF9sb2NrKTsKKwkJCXNwaW5fbG9ja19pcnEoJm1kZXYtPmxpc3RfbG9jayk7CiAJCQlsaXN0X2RlbCgmbWJvLT5saXN0KTsKLQkJCXNwaW5fdW5sb2NrKCZtZGV2LT5saXN0X2xvY2spOworCQkJc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT5saXN0X2xvY2spOwogCQkJbW9zdF9wdXRfbWJvKG1ibyk7CiAJCX0KIAl9CkBAIC0yNTAsMTYgKzI1MCwxNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHZpZGlvY19xdWVyeWNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAgKnByaXYsCitzdGF0aWMgaW50IHZpZGlvY19xdWVyeWNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCSAgIHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKmNhcCkKIHsKIAlzdHJ1Y3QgYWltX2ZoICpmaCA9IHByaXY7CiAJc3RydWN0IG1vc3RfdmlkZW9fZGV2ICptZGV2ID0gZmgtPm1kZXY7CiAKLQlwcl9pbmZvKCJ2aWRpb2NfcXVlcnljYXAoKVxuIik7CisJdjRsMl9pbmZvKCZtZGV2LT52NGwyX2RldiwgInZpZGlvY19xdWVyeWNhcCgpXG4iKTsKIAogCXN0cmxjcHkoY2FwLT5kcml2ZXIsICJ2NGwyX21vc3RfYWltIiwgc2l6ZW9mKGNhcC0+ZHJpdmVyKSk7Ci0Jc3RybGNweShjYXAtPmNhcmQsICJteV9jYXJkIiwgc2l6ZW9mKGNhcC0+Y2FyZCkpOworCXN0cmxjcHkoY2FwLT5jYXJkLCAiTU9TVCIsIHNpemVvZihjYXAtPmNhcmQpKTsKIAlzbnByaW50ZihjYXAtPmJ1c19pbmZvLCBzaXplb2YoY2FwLT5idXNfaW5mbyksCiAJCSAiJXMiLCBtZGV2LT5pZmFjZS0+ZGVzY3JpcHRpb24pOwogCkBAIC0yNzAsMTAgKzI3MCwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHZpZGlvY19lbnVtX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICAqcHJpdiwKK3N0YXRpYyBpbnQgdmlkaW9jX2VudW1fZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJICAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZikKIHsKLQlwcl9pbmZvKCJ2aWRpb2NfZW51bV9mbXRfdmlkX2NhcCgpICVkXG4iLCBmLT5pbmRleCk7CisJc3RydWN0IGFpbV9maCAqZmggPSBwcml2OworCXN0cnVjdCBtb3N0X3ZpZGVvX2RldiAqbWRldiA9IGZoLT5tZGV2OworCisJdjRsMl9pbmZvKCZtZGV2LT52NGwyX2RldiwgInZpZGlvY19lbnVtX2ZtdF92aWRfY2FwKCkgJWRcbiIsIGYtPmluZGV4KTsKIAogCWlmIChmLT5pbmRleCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yODksNyArMjkyLDEwIEBACiBzdGF0aWMgaW50IHZpZGlvY19nX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKIHsKLQlwcl9pbmZvKCJ2aWRpb2NfZ19mbXRfdmlkX2NhcCgpXG4iKTsKKwlzdHJ1Y3QgYWltX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IG1vc3RfdmlkZW9fZGV2ICptZGV2ID0gZmgtPm1kZXY7CisKKwl2NGwyX2luZm8oJm1kZXYtPnY0bDJfZGV2LCAidmlkaW9jX2dfZm10X3ZpZF9jYXAoKVxuIik7CiAKIAlhaW1fc2V0X2Zvcm1hdF9zdHJ1Y3QoZik7CiAJcmV0dXJuIDA7CkBAIC0yOTgsNyArMzA0LDcgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX3RyeV9mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKIHsKLQlzdHJ1Y3QgYWltX2ZoICpmaCAgPSBwcml2OworCXN0cnVjdCBhaW1fZmggKmZoID0gcHJpdjsKIAlzdHJ1Y3QgbW9zdF92aWRlb19kZXYgKm1kZXYgPSBmaC0+bWRldjsKIAogCXJldHVybiBhaW1fc2V0X2Zvcm1hdChtZGV2LCBWSURJT0NfVFJZX0ZNVCwgZik7CkBAIC0zMDcsNyArMzEzLDcgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX3NfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQogewotCXN0cnVjdCBhaW1fZmggKmZoICA9IHByaXY7CisJc3RydWN0IGFpbV9maCAqZmggPSBwcml2OwogCXN0cnVjdCBtb3N0X3ZpZGVvX2RldiAqbWRldiA9IGZoLT5tZGV2OwogCiAJcmV0dXJuIGFpbV9zZXRfZm9ybWF0KG1kZXYsIFZJRElPQ19TX0ZNVCwgZik7CkBAIC0zMTUsNyArMzIxLDEwIEBACiAKIHN0YXRpYyBpbnQgdmlkaW9jX2dfc3RkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB2NGwyX3N0ZF9pZCAqbm9ybSkKIHsKLQlwcl9pbmZvKCJ2aWRpb2NfZ19zdGQoKVxuIik7CisJc3RydWN0IGFpbV9maCAqZmggPSBwcml2OworCXN0cnVjdCBtb3N0X3ZpZGVvX2RldiAqbWRldiA9IGZoLT5tZGV2OworCisJdjRsMl9pbmZvKCZtZGV2LT52NGwyX2RldiwgInZpZGlvY19nX3N0ZCgpXG4iKTsKIAogCSpub3JtID0gVjRMMl9TVERfVU5LTk9XTjsKIAlyZXR1cm4gMDsKQEAgLTM1Miw3ICszNjEsNyBAQAogCXN0cnVjdCBhaW1fZmggKmZoID0gcHJpdjsKIAlzdHJ1Y3QgbW9zdF92aWRlb19kZXYgKm1kZXYgPSBmaC0+bWRldjsKIAotCXByX2luZm8oInZpZGlvY19zX2lucHV0KCVkKVxuIiwgaW5kZXgpOworCXY0bDJfaW5mbygmbWRldi0+djRsMl9kZXYsICJ2aWRpb2Nfc19pbnB1dCglZClcbiIsIGluZGV4KTsKIAogCWlmIChpbmRleCA+PSBWNEwyX0FJTV9NQVhfSU5QVVQpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzYwLDcgKzM2OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgYWltX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIGFpbV9mb3BzID0gewogCS5vd25lciAgICAgID0gVEhJU19NT0RVTEUsCiAJLm9wZW4gICAgICAgPSBhaW1fdmRldl9vcGVuLAogCS5yZWxlYXNlICAgID0gYWltX3ZkZXZfY2xvc2UsCkBAIC0zOTMsNDUgKzQwMiw0NiBAQAogc3RhdGljIHN0cnVjdCBtb3N0X3ZpZGVvX2RldiAqZ2V0X2FpbV9kZXYoCiAJc3RydWN0IG1vc3RfaW50ZXJmYWNlICppZmFjZSwgaW50IGNoYW5uZWxfaWR4KQogewotCXN0cnVjdCBtb3N0X3ZpZGVvX2RldiAqbWRldiwgKnRtcDsKKwlzdHJ1Y3QgbW9zdF92aWRlb19kZXYgKm1kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9jaygmbGlzdF9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobWRldiwgdG1wLCAmdmlkZW9fZGV2aWNlcywgbGlzdCkgeworCXNwaW5fbG9ja19pcnFzYXZlKCZsaXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1kZXYsICZ2aWRlb19kZXZpY2VzLCBsaXN0KSB7CiAJCWlmIChtZGV2LT5pZmFjZSA9PSBpZmFjZSAmJiBtZGV2LT5jaF9pZHggPT0gY2hhbm5lbF9pZHgpIHsKLQkJCXNwaW5fdW5sb2NrKCZsaXN0X2xvY2spOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdF9sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm4gbWRldjsKIAkJfQogCX0KLQlzcGluX3VubG9jaygmbGlzdF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0X2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGludCBhaW1fcnhfZGF0YShzdHJ1Y3QgbWJvICptYm8pCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbW9zdF92aWRlb19kZXYgKm1kZXYgPQogCQlnZXRfYWltX2RldihtYm8tPmlmcCwgbWJvLT5oZG1fY2hhbm5lbF9pZCk7CiAKIAlpZiAoIW1kZXYpCiAJCXJldHVybiAtRUlPOwogCi0Jc3Bpbl9sb2NrKCZtZGV2LT5saXN0X2xvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT5saXN0X2xvY2ssIGZsYWdzKTsKIAlpZiAodW5saWtlbHkobWRldi0+bXV0ZSkpIHsKLQkJc3Bpbl91bmxvY2soJm1kZXYtPmxpc3RfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPmxpc3RfbG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAlsaXN0X2FkZF90YWlsKCZtYm8tPmxpc3QsICZtZGV2LT5wZW5kaW5nX21ib3MpOwotCXNwaW5fdW5sb2NrKCZtZGV2LT5saXN0X2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPmxpc3RfbG9jaywgZmxhZ3MpOwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbWRldi0+d2FpdF9kYXRhKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBhaW1fcmVnaXN0ZXJfdmlkZW9kZXYoc3RydWN0IG1vc3RfdmlkZW9fZGV2ICptZGV2KQogewotCWludCByZXR2YWwgPSAtRU5PTUVNOwogCWludCByZXQ7CiAKLQlwcl9pbmZvKCJhaW1fcmVnaXN0ZXJfdmlkZW9kZXYoKVxuIik7CisJdjRsMl9pbmZvKCZtZGV2LT52NGwyX2RldiwgImFpbV9yZWdpc3Rlcl92aWRlb2RldigpXG4iKTsKIAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm1kZXYtPndhaXRfZGF0YSk7CiAKQEAgLTQ0NCwyNyArNDU0LDI0IEBACiAJKm1kZXYtPnZkZXYgPSBhaW1fdmlkZW9kZXZfdGVtcGxhdGU7CiAJbWRldi0+dmRldi0+djRsMl9kZXYgPSAmbWRldi0+djRsMl9kZXY7CiAJbWRldi0+dmRldi0+bG9jayA9ICZtZGV2LT5sb2NrOwotCXN0cmNweShtZGV2LT52ZGV2LT5uYW1lLCAibW9zdCB2NGwyIGFpbSB2aWRlbyIpOworCXNucHJpbnRmKG1kZXYtPnZkZXYtPm5hbWUsIHNpemVvZihtZGV2LT52ZGV2LT5uYW1lKSwgIk1PU1Q6ICVzIiwKKwkJIG1kZXYtPnY0bDJfZGV2Lm5hbWUpOwogCiAJLyogUmVnaXN0ZXIgdGhlIHY0bDIgZGV2aWNlICovCiAJdmlkZW9fc2V0X2RydmRhdGEobWRldi0+dmRldiwgbWRldik7Ci0JcmV0dmFsID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKG1kZXYtPnZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsIC0xKTsKLQlpZiAocmV0dmFsICE9IDApIHsKLQkJcHJfZXJyKCJ2aWRlb19yZWdpc3Rlcl9kZXZpY2UgZmFpbGVkICglZClcbiIsIHJldHZhbCk7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyX3ZiaV9kZXY7CisJcmV0ID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKG1kZXYtPnZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsIC0xKTsKKwlpZiAocmV0KSB7CisJCXY0bDJfZXJyKCZtZGV2LT52NGwyX2RldiwgInZpZGVvX3JlZ2lzdGVyX2RldmljZSBmYWlsZWQgKCVkKVxuIiwKKwkJCSByZXQpOworCQl2aWRlb19kZXZpY2VfcmVsZWFzZShtZGV2LT52ZGV2KTsKIAl9CiAKLQlyZXR1cm4gMDsKLQotZXJyX3ZiaV9kZXY6Ci0JdmlkZW9fZGV2aWNlX3JlbGVhc2UobWRldi0+dmRldik7CiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgYWltX3VucmVnaXN0ZXJfdmlkZW9kZXYoc3RydWN0IG1vc3RfdmlkZW9fZGV2ICptZGV2KQogewotCXByX2luZm8oImFpbV91bnJlZ2lzdGVyX3ZpZGVvZGV2KClcbiIpOworCXY0bDJfaW5mbygmbWRldi0+djRsMl9kZXYsICJhaW1fdW5yZWdpc3Rlcl92aWRlb2RldigpXG4iKTsKIAogCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKG1kZXYtPnZkZXYpOwogfQpAQCAtNDg1LDcgKzQ5Miw3IEBACiAJaW50IHJldDsKIAlzdHJ1Y3QgbW9zdF92aWRlb19kZXYgKm1kZXYgPSBnZXRfYWltX2RldihpZmFjZSwgY2hhbm5lbF9pZHgpOwogCi0JcHJfaW5mbygiYWltX3Byb2JlX2NoYW5uZWwoKVxuIik7CisJcHJfaW5mbygiYWltX3Byb2JlX2NoYW5uZWwoJXMpXG4iLCBuYW1lKTsKIAogCWlmIChtZGV2KSB7CiAJCXByX2VycigiY2hhbm5lbCBhbHJlYWR5IGxpbmtlZFxuIik7CkBAIC00OTgsOCArNTA1LDggQEAKIAl9CiAKIAlpZiAoY2NmZy0+ZGF0YV90eXBlICE9IE1PU1RfQ0hfU1lOQyAmJgotCSAgICBjY2ZnLT5kYXRhX3R5cGUgIT0gTU9TVF9DSF9JU09DX0FWUCkgewotCQlwcl9lcnIoIndyb25nIGNoYW5uZWwgdHlwZSwgZXhwZWN0IHN5bmMgb3IgaXNvY19hdnBcbiIpOworCSAgICBjY2ZnLT5kYXRhX3R5cGUgIT0gTU9TVF9DSF9JU09DKSB7CisJCXByX2Vycigid3JvbmcgY2hhbm5lbCB0eXBlLCBleHBlY3Qgc3luYyBvciBpc29jXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC01MTYsOCArNTIzLDcgQEAKIAltZGV2LT52NGwyX2Rldi5yZWxlYXNlID0gYWltX3Y0bDJfZGV2X3JlbGVhc2U7CiAKIAkvKiBDcmVhdGUgdGhlIHY0bDJfZGV2aWNlICovCi0Jc3RybGNweShtZGV2LT52NGwyX2Rldi5uYW1lLCAibW9zdF92aWRlb19kZXZpY2UiLAotCQlzaXplb2YobWRldi0+djRsMl9kZXYubmFtZSkpOworCXN0cmxjcHkobWRldi0+djRsMl9kZXYubmFtZSwgbmFtZSwgc2l6ZW9mKG1kZXYtPnY0bDJfZGV2Lm5hbWUpKTsKIAlyZXQgPSB2NGwyX2RldmljZV9yZWdpc3RlcihOVUxMLCAmbWRldi0+djRsMl9kZXYpOwogCWlmIChyZXQpIHsKIAkJcHJfZXJyKCJ2NGwyX2RldmljZV9yZWdpc3RlcigpIGZhaWxlZFxuIik7CkBAIC01MjksOSArNTM1LDEwIEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJfdW5yZWc7CiAKLQlzcGluX2xvY2soJmxpc3RfbG9jayk7CisJc3Bpbl9sb2NrX2lycSgmbGlzdF9sb2NrKTsKIAlsaXN0X2FkZCgmbWRldi0+bGlzdCwgJnZpZGVvX2RldmljZXMpOwotCXNwaW5fdW5sb2NrKCZsaXN0X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmbGlzdF9sb2NrKTsKKwl2NGwyX2luZm8oJm1kZXYtPnY0bDJfZGV2LCAiYWltX3Byb2JlX2NoYW5uZWwoKSBkb25lXG4iKTsKIAlyZXR1cm4gMDsKIAogZXJyX3VucmVnOgpAQCAtNTQ1LDE2ICs1NTIsMTYgQEAKIHsKIAlzdHJ1Y3QgbW9zdF92aWRlb19kZXYgKm1kZXYgPSBnZXRfYWltX2RldihpZmFjZSwgY2hhbm5lbF9pZHgpOwogCi0JcHJfaW5mbygiYWltX2Rpc2Nvbm5lY3RfY2hhbm5lbCgpXG4iKTsKLQogCWlmICghbWRldikgewogCQlwcl9lcnIoIm5vIHN1Y2ggY2hhbm5lbCBpcyBsaW5rZWRcbiIpOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQlzcGluX2xvY2soJmxpc3RfbG9jayk7CisJdjRsMl9pbmZvKCZtZGV2LT52NGwyX2RldiwgImFpbV9kaXNjb25uZWN0X2NoYW5uZWwoKVxuIik7CisKKwlzcGluX2xvY2tfaXJxKCZsaXN0X2xvY2spOwogCWxpc3RfZGVsKCZtZGV2LT5saXN0KTsKLQlzcGluX3VubG9jaygmbGlzdF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmxpc3RfbG9jayk7CiAKIAlhaW1fdW5yZWdpc3Rlcl92aWRlb2RldihtZGV2KTsKIAl2NGwyX2RldmljZV9kaXNjb25uZWN0KCZtZGV2LT52NGwyX2Rldik7CkBAIC01ODUsMTcgKzU5MiwxNyBAQAogCSAqIHdlIHNpbXVsYXRlIHRoaXMgY2FsbCBoZXJlLgogCSAqIFRoaXMgbXVzdCBiZSBmaXhlZCBpbiBjb3JlLgogCSAqLwotCXNwaW5fbG9jaygmbGlzdF9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZsaXN0X2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtZGV2LCB0bXAsICZ2aWRlb19kZXZpY2VzLCBsaXN0KSB7CiAJCWxpc3RfZGVsKCZtZGV2LT5saXN0KTsKLQkJc3Bpbl91bmxvY2soJmxpc3RfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycSgmbGlzdF9sb2NrKTsKIAogCQlhaW1fdW5yZWdpc3Rlcl92aWRlb2RldihtZGV2KTsKIAkJdjRsMl9kZXZpY2VfZGlzY29ubmVjdCgmbWRldi0+djRsMl9kZXYpOwogCQl2NGwyX2RldmljZV9wdXQoJm1kZXYtPnY0bDJfZGV2KTsKLQkJc3Bpbl9sb2NrKCZsaXN0X2xvY2spOworCQlzcGluX2xvY2tfaXJxKCZsaXN0X2xvY2spOwogCX0KLQlzcGluX3VubG9jaygmbGlzdF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJmxpc3RfbG9jayk7CiAKIAltb3N0X2RlcmVnaXN0ZXJfYWltKCZhaW1faW5mbyk7CiAJQlVHX09OKCFsaXN0X2VtcHR5KCZ2aWRlb19kZXZpY2VzKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9oZG0tZGltMi9kaW0yX2hhbC5jIGIvZHJpdmVycy9zdGFnaW5nL21vc3QvaGRtLWRpbTIvZGltMl9oYWwuYwppbmRleCAzYzUyNDUwLi4wYjk4MTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9oZG0tZGltMi9kaW0yX2hhbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS1kaW0yL2RpbTJfaGFsLmMKQEAgLTIsNyArMiw3IEBACiAgKiBkaW0yX2hhbC5jIC0gRElNMiBIQUwgaW1wbGVtZW50YXRpb24KICAqIChNZWRpYUxCLCBEZXZpY2UgSW50ZXJmYWNlIE1hY3JvIElQLCBPUzYyNDIwKQogICoKLSAqIENvcHlyaWdodCAoQykgMjAxNSwgTWljcm9jaGlwIFRlY2hub2xvZ3kgR2VybWFueSBJSSBHbWJIICYgQ28uIEtHCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiwgTWljcm9jaGlwIFRlY2hub2xvZ3kgR2VybWFueSBJSSBHbWJIICYgQ28uIEtHCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgpAQCAtMjAsMTggKzIwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KIAogLyoKLSAqIFRoZSBudW1iZXIgb2YgZnJhbWVzIHBlciBzdWItYnVmZmVyIGZvciBzeW5jaHJvbm91cyBjaGFubmVscy4KLSAqIEFsbG93ZWQgdmFsdWVzOiAxLCAyLCA0LCA4LCAxNiwgMzIsIDY0LgotICovCi0jZGVmaW5lIEZSQU1FU19QRVJfU1VCQlVGRiAxNgotCi0vKgotICogU2l6ZSBmYWN0b3IgZm9yIHN5bmNocm9ub3VzIERCUiBidWZmZXIuCi0gKiBNaW5pbWFsIHZhbHVlIGlzIDQqRlJBTUVTX1BFUl9TVUJCVUZGLgotICovCi0jZGVmaW5lIFNZTkNfREJSX0ZBQ1RPUiAoNHUgKiAodTE2KUZSQU1FU19QRVJfU1VCQlVGRikKLQotLyoKICAqIFNpemUgZmFjdG9yIGZvciBpc29jaHJvbm91cyBEQlIgYnVmZmVyLgogICogTWluaW1hbCB2YWx1ZSBpcyAzLgogICovCkBAIC02MSwxMiArNDksMTEgQEAKICNkZWZpbmUgREJSX1NJWkUgICgxNiAqIDEwMjQpIC8qIHNwZWNpZmllZCBieSBJUCAqLwogI2RlZmluZSBEQlJfQkxPQ0tfU0laRSAgKERCUl9TSVpFIC8gMzIgLyBEQlJfTUFQX1NJWkUpCiAKKyNkZWZpbmUgUk9VTkRfVVBfVE8oeCwgZCkgICgoKHgpICsgKGQpIC0gMSkgLyAoZCkgKiAoZCkpCisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBnZW5lcmljIGhlbHBlciBmdW5jdGlvbnMgYW5kIG1hY3JvcyAqLwogCi0jZGVmaW5lIE1MQkMwX0ZDTlRfVkFMX01BQ1JPKG4pIE1MQkMwX0ZDTlRfVkFMXyAjIyBuICMjIEZQU0IKLSNkZWZpbmUgTUxCQzBfRkNOVF9WQUwoZnBzYikgTUxCQzBfRkNOVF9WQUxfTUFDUk8oZnBzYikKLQogc3RhdGljIGlubGluZSB1MzIgYml0X21hc2sodTggcG9zaXRpb24pCiB7CiAJcmV0dXJuICh1MzIpMSA8PCBwb3NpdGlvbjsKQEAgLTgxLDEwICs2OCwyMCBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIHR5cGVzIGFuZCBsb2NhbCB2YXJpYWJsZXMgKi8KIAorc3RydWN0IGFzeW5jX3R4X2RiciB7CisJdTggY2hfYWRkcjsKKwl1MTYgcnBjOworCXUxNiB3cGM7CisJdTE2IHJlc3Rfc2l6ZTsKKwl1MTYgc3pfcXVldWVbQ0RUMF9SUENfTUFTSyArIDFdOworfTsKKwogc3RydWN0IGxsZF9nbG9iYWxfdmFyc190IHsKIAlib29sIGRpbV9pc19pbml0aWFsaXplZDsKIAlib29sIG1jbV9pc19pbml0aWFsaXplZDsKIAlzdHJ1Y3QgZGltMl9yZWdzIF9faW9tZW0gKmRpbTI7IC8qIERJTTIgY29yZSBiYXNlIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgYXN5bmNfdHhfZGJyIGF0eF9kYnI7CisJdTMyIGZjbnQ7CiAJdTMyIGRicl9tYXBbREJSX01BUF9TSVpFXTsKIH07CiAKQEAgLTE0OSwxNSArMTQ2LDM0IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyB1MzIgZGltMl9yZWFkX2N0cih1MzIgY3RyX2FkZHIsIHUxNiBtZGF0X2lkeCkKK3N0YXRpYyB2b2lkIGRpbTJfdHJhbnNmZXJfbWFkcih1MzIgdmFsKQogewotCWRpbWNiX2lvX3dyaXRlKCZnLmRpbTItPk1BRFIsIGN0cl9hZGRyKTsKKwlkaW1jYl9pb193cml0ZSgmZy5kaW0yLT5NQURSLCB2YWwpOwogCi0JLyogd2FpdCB0aWxsIHRyYW5zZmVyIGlzIGNvbXBsZXRlZCAqLworCS8qIHdhaXQgZm9yIHRyYW5zZmVyIGNvbXBsZXRpb24gKi8KIAl3aGlsZSAoKGRpbWNiX2lvX3JlYWQoJmcuZGltMi0+TUNUTCkgJiAxKSAhPSAxKQogCQljb250aW51ZTsKIAogCWRpbWNiX2lvX3dyaXRlKCZnLmRpbTItPk1DVEwsIDApOyAgIC8qIGNsZWFyIHRyYW5zZmVyIGNvbXBsZXRlICovCit9CisKK3N0YXRpYyB2b2lkIGRpbTJfY2xlYXJfZGJyKHUxNiBhZGRyLCB1MTYgc2l6ZSkKK3sKKwllbnVtIHsgTUFEUl9UQl9CSVQgPSAzMCwgTUFEUl9XTlJfQklUID0gMzEgfTsKKworCXUxNiBjb25zdCBlbmRfYWRkciA9IGFkZHIgKyBzaXplOworCXUzMiBjb25zdCBjbWQgPSBiaXRfbWFzayhNQURSX1dOUl9CSVQpIHwgYml0X21hc2soTUFEUl9UQl9CSVQpOworCisJZGltY2JfaW9fd3JpdGUoJmcuZGltMi0+TUNUTCwgMCk7ICAgLyogY2xlYXIgdHJhbnNmZXIgY29tcGxldGUgKi8KKwlkaW1jYl9pb193cml0ZSgmZy5kaW0yLT5NREFUMCwgMCk7CisKKwlmb3IgKDsgYWRkciA8IGVuZF9hZGRyOyBhZGRyKyspCisJCWRpbTJfdHJhbnNmZXJfbWFkcihjbWQgfCBhZGRyKTsKK30KKworc3RhdGljIHUzMiBkaW0yX3JlYWRfY3RyKHUzMiBjdHJfYWRkciwgdTE2IG1kYXRfaWR4KQoreworCWRpbTJfdHJhbnNmZXJfbWFkcihjdHJfYWRkcik7CiAKIAlyZXR1cm4gZGltY2JfaW9fcmVhZCgoJmcuZGltMi0+TURBVDApICsgbWRhdF9pZHgpOwogfQpAQCAtMTgyLDEzICsxOTgsNyBAQAogCWRpbWNiX2lvX3dyaXRlKCZnLmRpbTItPk1EV0UyLCBtYXNrWzJdKTsKIAlkaW1jYl9pb193cml0ZSgmZy5kaW0yLT5NRFdFMywgbWFza1szXSk7CiAKLQlkaW1jYl9pb193cml0ZSgmZy5kaW0yLT5NQURSLCBiaXRfbWFzayhNQURSX1dOUl9CSVQpIHwgY3RyX2FkZHIpOwotCi0JLyogd2FpdCB0aWxsIHRyYW5zZmVyIGlzIGNvbXBsZXRlZCAqLwotCXdoaWxlICgoZGltY2JfaW9fcmVhZCgmZy5kaW0yLT5NQ1RMKSAmIDEpICE9IDEpCi0JCWNvbnRpbnVlOwotCi0JZGltY2JfaW9fd3JpdGUoJmcuZGltMi0+TUNUTCwgMCk7ICAgLyogY2xlYXIgdHJhbnNmZXIgY29tcGxldGUgKi8KKwlkaW0yX3RyYW5zZmVyX21hZHIoYml0X21hc2soTUFEUl9XTlJfQklUKSB8IGN0cl9hZGRyKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGRpbTJfd3JpdGVfY3RyKHUzMiBjdHJfYWRkciwgY29uc3QgdTMyICp2YWx1ZSkKQEAgLTI1Miw2ICsyNjIsMTMgQEAKIAlkaW0yX3dyaXRlX2N0cihDRFQgKyBjaF9hZGRyLCBjZHQpOwogfQogCitzdGF0aWMgdTE2IGRpbTJfcnBjKHU4IGNoX2FkZHIpCit7CisJdTMyIGNkdDAgPSBkaW0yX3JlYWRfY3RyKENEVCArIGNoX2FkZHIsIDApOworCisJcmV0dXJuIChjZHQwID4+IENEVDBfUlBDX1NISUZUKSAmIENEVDBfUlBDX01BU0s7Cit9CisKIHN0YXRpYyB2b2lkIGRpbTJfY2xlYXJfY2R0KHU4IGNoX2FkZHIpCiB7CiAJdTMyIGNkdFs0XSA9IHsgMCwgMCwgMCwgMCB9OwpAQCAtMzU2LDYgKzM3Myw1MiBAQAogCiAJZGltMl9jbGVhcl9jYXQoTUxCX0NBVCwgY2hfYWRkcik7CiAJZGltMl9jbGVhcl9jZHQoY2hfYWRkcik7CisKKwkvKiBjbGVhciBjaGFubmVsIHN0YXR1cyBiaXQgKi8KKwlkaW1jYl9pb193cml0ZSgmZy5kaW0yLT5BQ1NSMCwgYml0X21hc2soY2hfYWRkcikpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogdHJhY2UgYXN5bmMgdHggZGJyIGZpbGwgc3RhdGUgKi8KKworc3RhdGljIGlubGluZSB1MTYgbm9ybV9wYyh1MTYgcGMpCit7CisJcmV0dXJuIHBjICYgQ0RUMF9SUENfTUFTSzsKK30KKworc3RhdGljIHZvaWQgZGJyY250X2luaXQodTggY2hfYWRkciwgdTE2IGRicl9zaXplKQoreworCWcuYXR4X2Rici5yZXN0X3NpemUgPSBkYnJfc2l6ZTsKKwlnLmF0eF9kYnIucnBjID0gZGltMl9ycGMoY2hfYWRkcik7CisJZy5hdHhfZGJyLndwYyA9IGcuYXR4X2Rici5ycGM7Cit9CisKK3N0YXRpYyB2b2lkIGRicmNudF9lbnEoaW50IGJ1Zl9zeikKK3sKKwlnLmF0eF9kYnIucmVzdF9zaXplIC09IGJ1Zl9zejsKKwlnLmF0eF9kYnIuc3pfcXVldWVbbm9ybV9wYyhnLmF0eF9kYnIud3BjKV0gPSBidWZfc3o7CisJZy5hdHhfZGJyLndwYysrOworfQorCit1MTYgZGltX2Ricl9zcGFjZShzdHJ1Y3QgZGltX2NoYW5uZWwgKmNoKQoreworCXUxNiBjdXJfcnBjOworCXN0cnVjdCBhc3luY190eF9kYnIgKmRiciA9ICZnLmF0eF9kYnI7CisKKwlpZiAoY2gtPmFkZHIgIT0gZGJyLT5jaF9hZGRyKQorCQlyZXR1cm4gMHhGRkZGOworCisJY3VyX3JwYyA9IGRpbTJfcnBjKGNoLT5hZGRyKTsKKworCXdoaWxlIChub3JtX3BjKGRici0+cnBjKSAhPSBjdXJfcnBjKSB7CisJCWRici0+cmVzdF9zaXplICs9IGRici0+c3pfcXVldWVbbm9ybV9wYyhkYnItPnJwYyldOworCQlkYnItPnJwYysrOworCX0KKworCWlmICgodTE2KShkYnItPndwYyAtIGRici0+cnBjKSA+PSBDRFQwX1JQQ19NQVNLKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBkYnItPnJlc3Rfc2l6ZTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTM5OCw3ICs0NjEsOCBAQAogCiBzdGF0aWMgaW5saW5lIGJvb2wgY2hlY2tfYnl0ZXNfcGVyX2ZyYW1lKHUzMiBieXRlc19wZXJfZnJhbWUpCiB7Ci0JdTE2IGNvbnN0IG1heF9zaXplID0gKCh1MTYpQ0RUM19CRF9NQVNLICsgMXUpIC8gU1lOQ19EQlJfRkFDVE9SOworCXUxNiBjb25zdCBiZF9mYWN0b3IgPSBnLmZjbnQgKyAyOworCXUxNiBjb25zdCBtYXhfc2l6ZSA9ICgodTE2KUNEVDNfQkRfTUFTSyArIDF1KSA+PiBiZF9mYWN0b3I7CiAKIAlpZiAoYnl0ZXNfcGVyX2ZyYW1lIDw9IDApCiAJCXJldHVybiBmYWxzZTsgLyogdG9vIHNtYWxsICovCkBAIC00MzksNyArNTAzLDcgQEAKIHsKIAl1MTYgbjsKIAl1MTYgY29uc3QgbWF4X3NpemUgPSAodTE2KUFEVDFfSVNPQ19TWU5DX0JEX01BU0sgKyAxdTsKLQl1MzIgY29uc3QgdW5pdCA9IGJ5dGVzX3Blcl9mcmFtZSAqICh1MTYpRlJBTUVTX1BFUl9TVUJCVUZGOworCXUzMiBjb25zdCB1bml0ID0gYnl0ZXNfcGVyX2ZyYW1lIDw8IGcuZmNudDsKIAogCWlmIChidWZfc2l6ZSA+IG1heF9zaXplKQogCQlidWZfc2l6ZSA9IG1heF9zaXplOwpAQCAtNDc5LDcgKzU0Myw3IEBACiAJZGltY2JfaW9fd3JpdGUoJmcuZGltMi0+TUxCQzAsCiAJCSAgICAgICBlbmFibGVfNnBpbiA8PCBNTEJDMF9NTEJQRU5fQklUIHwKIAkJICAgICAgIG1sYl9jbG9jayA8PCBNTEJDMF9NTEJDTEtfU0hJRlQgfAotCQkgICAgICAgTUxCQzBfRkNOVF9WQUwoRlJBTUVTX1BFUl9TVUJCVUZGKSA8PCBNTEJDMF9GQ05UX1NISUZUIHwKKwkJICAgICAgIGcuZmNudCA8PCBNTEJDMF9GQ05UX1NISUZUIHwKIAkJICAgICAgIHRydWUgPDwgTUxCQzBfTUxCRU5fQklUKTsKIAogCS8qIGFjdGl2YXRlIGFsbCBIQkkgY2hhbm5lbHMgKi8KQEAgLTUxNSwyMCArNTc5LDE3IEBACiB7CiAJdTggY29uc3Qgc2hpZnQgPSBpZHggKiAxNjsKIAl1MzIgY29uc3QgYWR0MSA9IGRpbTJfcmVhZF9jdHIoQURUICsgY2hfYWRkciwgMSk7CisJdTMyIG1hc2tbNF0gPSB7IDAsIDAsIDAsIDAgfTsKKwl1MzIgYWR0X3dbNF0gPSB7IDAsIDAsIDAsIDAgfTsKIAogCWlmICgoKGFkdDEgPj4gKEFEVDFfRE5FX0JJVCArIHNoaWZ0KSkgJiAxKSA9PSAwKQogCQlyZXR1cm4gZmFsc2U7CiAKLQl7Ci0JCXUzMiBtYXNrWzRdID0geyAwLCAwLCAwLCAwIH07Ci0JCXUzMiBhZHRfd1s0XSA9IHsgMCwgMCwgMCwgMCB9OwotCi0JCW1hc2tbMV0gPQotCQkJYml0X21hc2soQURUMV9ETkVfQklUICsgc2hpZnQpIHwKLQkJCWJpdF9tYXNrKEFEVDFfRVJSX0JJVCArIHNoaWZ0KSB8Ci0JCQliaXRfbWFzayhBRFQxX1JEWV9CSVQgKyBzaGlmdCk7Ci0JCWRpbTJfd3JpdGVfY3RyX21hc2soQURUICsgY2hfYWRkciwgbWFzaywgYWR0X3cpOwotCX0KKwltYXNrWzFdID0KKwkJYml0X21hc2soQURUMV9ETkVfQklUICsgc2hpZnQpIHwKKwkJYml0X21hc2soQURUMV9FUlJfQklUICsgc2hpZnQpIHwKKwkJYml0X21hc2soQURUMV9SRFlfQklUICsgc2hpZnQpOworCWRpbTJfd3JpdGVfY3RyX21hc2soQURUICsgY2hfYWRkciwgbWFzaywgYWR0X3cpOwogCiAJLyogY2xlYXIgY2hhbm5lbCBzdGF0dXMgYml0ICovCiAJZGltY2JfaW9fd3JpdGUoJmcuZGltMi0+QUNTUjAsIGJpdF9tYXNrKGNoX2FkZHIpKTsKQEAgLTYxMiw2ICs2NzMsOSBAQAogCiAJKytzdGF0ZS0+bGV2ZWw7CiAKKwlpZiAoY2gtPmFkZHIgPT0gZy5hdHhfZGJyLmNoX2FkZHIpCisJCWRicmNudF9lbnEoYnVmX3NpemUpOworCiAJaWYgKGNoLT5wYWNrZXRfbGVuZ3RoIHx8IGNoLT5ieXRlc19wZXJfZnJhbWUpCiAJCWRpbTJfc3RhcnRfaXNvY19zeW5jKGNoLT5hZGRyLCBzdGF0ZS0+aWR4MSwgYnVmX2FkZHIsIGJ1Zl9zaXplKTsKIAllbHNlCkBAIC02NTAsNyArNzE0LDggQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBBUEkgKi8KIAotdTggZGltX3N0YXJ0dXAoc3RydWN0IGRpbTJfcmVncyBfX2lvbWVtICpkaW1fYmFzZV9hZGRyZXNzLCB1MzIgbWxiX2Nsb2NrKQordTggZGltX3N0YXJ0dXAoc3RydWN0IGRpbTJfcmVncyBfX2lvbWVtICpkaW1fYmFzZV9hZGRyZXNzLCB1MzIgbWxiX2Nsb2NrLAorCSAgICAgICB1MzIgZmNudCkKIHsKIAlnLmRpbV9pc19pbml0aWFsaXplZCA9IGZhbHNlOwogCkBAIC02NjIsNyArNzI3LDExIEBACiAJaWYgKG1sYl9jbG9jayA+PSA4KQogCQlyZXR1cm4gRElNX0lOSVRfRVJSX01MQl9DTE9DSzsKIAorCWlmIChmY250ID4gTUxCQzBfRkNOVF9NQVhfVkFMKQorCQlyZXR1cm4gRElNX0lOSVRfRVJSX01MQl9DTE9DSzsKKwogCWcuZGltMiA9IGRpbV9iYXNlX2FkZHJlc3M7CisJZy5mY250ID0gZmNudDsKIAlnLmRicl9tYXBbMF0gPSAwOwogCWcuZGJyX21hcFsxXSA9IDA7CiAKQEAgLTY5Myw3ICs3NjIsNyBAQAogCWlmICghY2hlY2tfY2hhbm5lbF9hZGRyZXNzKGNoX2FkZHJlc3MpKQogCQlyZXR1cm4gRElNX0lOSVRfRVJSX0NIQU5ORUxfQUREUkVTUzsKIAotCWNoLT5kYnJfc2l6ZSA9IGh3X2J1ZmZlcl9zaXplOworCWNoLT5kYnJfc2l6ZSA9IFJPVU5EX1VQX1RPKGh3X2J1ZmZlcl9zaXplLCBEQlJfQkxPQ0tfU0laRSk7CiAJY2gtPmRicl9hZGRyID0gYWxsb2NfZGJyKGNoLT5kYnJfc2l6ZSk7CiAJaWYgKGNoLT5kYnJfYWRkciA+PSBEQlJfU0laRSkKIAkJcmV0dXJuIERJTV9JTklUX0VSUl9PVVRfT0ZfTUVNT1JZOwpAQCAtNzA2LDYgKzc3NSwxMiBAQAogCXJldHVybiBESU1fTk9fRVJST1I7CiB9CiAKK3ZvaWQgZGltX3NlcnZpY2VfbWxiX2ludF9pcnEodm9pZCkKK3sKKwlkaW1jYl9pb193cml0ZSgmZy5kaW0yLT5NUzAsIDApOworCWRpbWNiX2lvX3dyaXRlKCZnLmRpbTItPk1TMSwgMCk7Cit9CisKIHUxNiBkaW1fbm9ybV9jdHJsX2FzeW5jX2J1ZmZlcl9zaXplKHUxNiBidWZfc2l6ZSkKIHsKIAlyZXR1cm4gbm9ybV9jdHJsX2FzeW5jX2J1ZmZlcl9zaXplKGJ1Zl9zaXplKTsKQEAgLTc0OSw4ICs4MjQsMTYgQEAKIHU4IGRpbV9pbml0X2FzeW5jKHN0cnVjdCBkaW1fY2hhbm5lbCAqY2gsIHU4IGlzX3R4LCB1MTYgY2hfYWRkcmVzcywKIAkJICB1MTYgbWF4X2J1ZmZlcl9zaXplKQogewotCXJldHVybiBpbml0X2N0cmxfYXN5bmMoY2gsIENBVF9DVF9WQUxfQVNZTkMsIGlzX3R4LCBjaF9hZGRyZXNzLAotCQkJICAgICAgIG1heF9idWZmZXJfc2l6ZSk7CisJdTggcmV0ID0gaW5pdF9jdHJsX2FzeW5jKGNoLCBDQVRfQ1RfVkFMX0FTWU5DLCBpc190eCwgY2hfYWRkcmVzcywKKwkJCQkgbWF4X2J1ZmZlcl9zaXplKTsKKworCWlmIChpc190eCAmJiAhZy5hdHhfZGJyLmNoX2FkZHIpIHsKKwkJZy5hdHhfZGJyLmNoX2FkZHIgPSBjaC0+YWRkcjsKKwkJZGJyY250X2luaXQoY2gtPmFkZHIsIGNoLT5kYnJfc2l6ZSk7CisJCWRpbWNiX2lvX3dyaXRlKCZnLmRpbTItPk1JRU4sIGJpdF9tYXNrKDIwKSk7CisJfQorCisJcmV0dXJuIHJldDsKIH0KIAogdTggZGltX2luaXRfaXNvYyhzdHJ1Y3QgZGltX2NoYW5uZWwgKmNoLCB1OCBpc190eCwgdTE2IGNoX2FkZHJlc3MsCkBAIC03ODEsNiArODY0LDggQEAKIHU4IGRpbV9pbml0X3N5bmMoc3RydWN0IGRpbV9jaGFubmVsICpjaCwgdTggaXNfdHgsIHUxNiBjaF9hZGRyZXNzLAogCQkgdTE2IGJ5dGVzX3Blcl9mcmFtZSkKIHsKKwl1MTYgYmRfZmFjdG9yID0gZy5mY250ICsgMjsKKwogCWlmICghZy5kaW1faXNfaW5pdGlhbGl6ZWQgfHwgIWNoKQogCQlyZXR1cm4gRElNX0VSUl9EUklWRVJfTk9UX0lOSVRJQUxJWkVEOwogCkBAIC03OTAsMTMgKzg3NSwxNCBAQAogCWlmICghY2hlY2tfYnl0ZXNfcGVyX2ZyYW1lKGJ5dGVzX3Blcl9mcmFtZSkpCiAJCXJldHVybiBESU1fRVJSX0JBRF9DT05GSUc7CiAKLQljaC0+ZGJyX3NpemUgPSBieXRlc19wZXJfZnJhbWUgKiBTWU5DX0RCUl9GQUNUT1I7CisJY2gtPmRicl9zaXplID0gYnl0ZXNfcGVyX2ZyYW1lIDw8IGJkX2ZhY3RvcjsKIAljaC0+ZGJyX2FkZHIgPSBhbGxvY19kYnIoY2gtPmRicl9zaXplKTsKIAlpZiAoY2gtPmRicl9hZGRyID49IERCUl9TSVpFKQogCQlyZXR1cm4gRElNX0lOSVRfRVJSX09VVF9PRl9NRU1PUlk7CiAKIAlzeW5jX2luaXQoY2gsIGNoX2FkZHJlc3MgLyAyLCBieXRlc19wZXJfZnJhbWUpOwogCisJZGltMl9jbGVhcl9kYnIoY2gtPmRicl9hZGRyLCBjaC0+ZGJyX3NpemUpOwogCWRpbTJfY29uZmlndXJlX2NoYW5uZWwoY2gtPmFkZHIsIENBVF9DVF9WQUxfU1lOQywgaXNfdHgsCiAJCQkgICAgICAgY2gtPmRicl9hZGRyLCBjaC0+ZGJyX3NpemUsIDAsIHRydWUpOwogCkBAIC04MDgsNiArODk0LDExIEBACiAJaWYgKCFnLmRpbV9pc19pbml0aWFsaXplZCB8fCAhY2gpCiAJCXJldHVybiBESU1fRVJSX0RSSVZFUl9OT1RfSU5JVElBTElaRUQ7CiAKKwlpZiAoY2gtPmFkZHIgPT0gZy5hdHhfZGJyLmNoX2FkZHIpIHsKKwkJZGltY2JfaW9fd3JpdGUoJmcuZGltMi0+TUlFTiwgMCk7CisJCWcuYXR4X2Rici5jaF9hZGRyID0gMDsKKwl9CisKIAlkaW0yX2NsZWFyX2NoYW5uZWwoY2gtPmFkZHIpOwogCWlmIChjaC0+ZGJyX2FkZHIgPCBEQlJfU0laRSkKIAkJZnJlZV9kYnIoY2gtPmRicl9hZGRyLCBjaC0+ZGJyX3NpemUpOwpAQCAtODE2LDcgKzkwNyw3IEBACiAJcmV0dXJuIERJTV9OT19FUlJPUjsKIH0KIAotdm9pZCBkaW1fc2VydmljZV9pcnEoc3RydWN0IGRpbV9jaGFubmVsICpjb25zdCAqY2hhbm5lbHMpCit2b2lkIGRpbV9zZXJ2aWNlX2FoYl9pbnRfaXJxKHN0cnVjdCBkaW1fY2hhbm5lbCAqY29uc3QgKmNoYW5uZWxzKQogewogCWJvb2wgc3RhdGVfY2hhbmdlZDsKIApAQCAtODQ4LDEwICs5MzksNiBAQAogCQkJKytjaDsKIAkJfQogCX0gd2hpbGUgKHN0YXRlX2NoYW5nZWQpOwotCi0JLyogY2xlYXIgcGVuZGluZyBJbnRlcnJ1cHRzICovCi0JZGltY2JfaW9fd3JpdGUoJmcuZGltMi0+TVMwLCAwKTsKLQlkaW1jYl9pb193cml0ZSgmZy5kaW0yLT5NUzEsIDApOwogfQogCiB1OCBkaW1fc2VydmljZV9jaGFubmVsKHN0cnVjdCBkaW1fY2hhbm5lbCAqY2gpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9oZG0tZGltMi9kaW0yX2hhbC5oIGIvZHJpdmVycy9zdGFnaW5nL21vc3QvaGRtLWRpbTIvZGltMl9oYWwuaAppbmRleCAxYzkyNGU4Li42ZGY2ZWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9oZG0tZGltMi9kaW0yX2hhbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS1kaW0yL2RpbTJfaGFsLmgKQEAgLTYwLDcgKzYwLDggQEAKIAl1MTYgZG9uZV9zd19idWZmZXJzX251bWJlcjsgLyo8IERvbmUgc29mdHdhcmUgYnVmZmVycyBudW1iZXIuICovCiB9OwogCi11OCBkaW1fc3RhcnR1cChzdHJ1Y3QgZGltMl9yZWdzIF9faW9tZW0gKmRpbV9iYXNlX2FkZHJlc3MsIHUzMiBtbGJfY2xvY2spOwordTggZGltX3N0YXJ0dXAoc3RydWN0IGRpbTJfcmVncyBfX2lvbWVtICpkaW1fYmFzZV9hZGRyZXNzLCB1MzIgbWxiX2Nsb2NrLAorCSAgICAgICB1MzIgZmNudCk7CiAKIHZvaWQgZGltX3NodXRkb3duKHZvaWQpOwogCkBAIC04NiwxMyArODcsMTcgQEAKIAogdTggZGltX2Rlc3Ryb3lfY2hhbm5lbChzdHJ1Y3QgZGltX2NoYW5uZWwgKmNoKTsKIAotdm9pZCBkaW1fc2VydmljZV9pcnEoc3RydWN0IGRpbV9jaGFubmVsICpjb25zdCAqY2hhbm5lbHMpOwordm9pZCBkaW1fc2VydmljZV9tbGJfaW50X2lycSh2b2lkKTsKKwordm9pZCBkaW1fc2VydmljZV9haGJfaW50X2lycShzdHJ1Y3QgZGltX2NoYW5uZWwgKmNvbnN0ICpjaGFubmVscyk7CiAKIHU4IGRpbV9zZXJ2aWNlX2NoYW5uZWwoc3RydWN0IGRpbV9jaGFubmVsICpjaCk7CiAKIHN0cnVjdCBkaW1fY2hfc3RhdGVfdCAqZGltX2dldF9jaGFubmVsX3N0YXRlKHN0cnVjdCBkaW1fY2hhbm5lbCAqY2gsCiAJCQkJCSAgICAgc3RydWN0IGRpbV9jaF9zdGF0ZV90ICpzdGF0ZV9wdHIpOwogCit1MTYgZGltX2Ricl9zcGFjZShzdHJ1Y3QgZGltX2NoYW5uZWwgKmNoKTsKKwogYm9vbCBkaW1fZW5xdWV1ZV9idWZmZXIoc3RydWN0IGRpbV9jaGFubmVsICpjaCwgdTMyIGJ1ZmZlcl9hZGRyLAogCQkJdTE2IGJ1ZmZlcl9zaXplKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21vc3QvaGRtLWRpbTIvZGltMl9oZG0uYyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS1kaW0yL2RpbTJfaGRtLmMKaW5kZXggYTM2NDQ5NS4uNzhiMmMzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21vc3QvaGRtLWRpbTIvZGltMl9oZG0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbW9zdC9oZG0tZGltMi9kaW0yX2hkbS5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIGRpbTJfaGRtLmMgLSBNZWRpYUxCIERJTTIgSGFyZHdhcmUgRGVwZW5kZW50IE1vZHVsZQogICoKLSAqIENvcHlyaWdodCAoQykgMjAxNSwgTWljcm9jaGlwIFRlY2hub2xvZ3kgR2VybWFueSBJSSBHbWJIICYgQ28uIEtHCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiwgTWljcm9jaGlwIFRlY2hub2xvZ3kgR2VybWFueSBJSSBHbWJIICYgQ28uIEtHCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgpAQCAtNDUsMTUgKzQ1LDE1IEBACiBNT0RVTEVfUEFSTV9ERVNDKGNsb2NrX3NwZWVkLCAiTWVkaWFMQiBDbG9jayBTcGVlZCIpOwogCiAvKgotICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAqIFRoZSBwYXJhbWV0ZXIgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgZnJhbWVzIHBlciBzdWItYnVmZmVyIGZvcgorICogc3luY2hyb25vdXMgY2hhbm5lbHMuICBWYWxpZCB2YWx1ZXM6IFswIC4uIDZdLgogICoKLSAqIFRoZSBkZWZpbmUgYmVsb3cgYWN0aXZhdGVzIGFuIHV0aWxpdHkgZnVuY3Rpb24gdXNlZCBieSBIQUwtc2ltdQotICogZm9yIGNhbGxpbmcgRElNIGludGVycnVwdCBoYW5kbGVyLgotICogSXQgaXMgdXNlZCBvbmx5IGZvciBURVNUIFBVUlBPU0UgYW5kIHNoYWxsIGJlIGNvbW1lbnRlZCBiZWZvcmUgcmVsZWFzZS4KLSAqCi0gKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICogVGhlIHZhbHVlcyAwLCAxLCAyLCAzLCA0LCA1LCA2IHJlcHJlc2VudCBjb3JyZXNwb25kaW5nIG51bWJlciBvZiBmcmFtZXMgcGVyCisgKiBzdWItYnVmZmVyIDEsIDIsIDQsIDgsIDE2LCAzMiwgNjQuCiAgKi8KLS8qICNkZWZpbmUgRU5BQkxFX0hETV9URVNUICovCitzdGF0aWMgdTggZmNudCA9IDQ7ICAvKiAoMSA8PCBmY250KSBmcmFtZXMgcGVyIHN1YmJ1ZmZlciAqLworbW9kdWxlX3BhcmFtKGZjbnQsIGJ5dGUsIDApOworTU9EVUxFX1BBUk1fREVTQyhmY250LCAiTnVtIG9mIGZyYW1lcyBwZXIgc3ViLWJ1ZmZlciBmb3Igc3luYyBjaGFubmVscyBhcyBhIHBvd2VyIG9mIDIiKTsKIAogc3RhdGljIERFRklORV9TUElOTE9DSyhkaW1fbG9jayk7CiAKQEAgLTg1LDcgKzg1LDYgQEAKICAqIEBtb3N0X2lmYWNlOiBtb3N0IGludGVyZmFjZSBzdHJ1Y3R1cmUKICAqIEBjYXBhYmlsaXRpZXM6IGFuIGFycmF5IG9mIGNoYW5uZWwgY2FwYWJpbGl0eSBkYXRhCiAgKiBAaW9fYmFzZTogSS9PIHJlZ2lzdGVyIGJhc2UgYWRkcmVzcwotICogQGlycV9haGIwOiBkaW0yIEFIQjAgaXJxIG51bWJlcgogICogQGNsa19zcGVlZDogdXNlciBzZWxlY3RhYmxlICh0aHJvdWdoIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIpIGNsb2NrIHNwZWVkCiAgKiBAbmV0aW5mb190YXNrOiB0aHJlYWQgdG8gZGVsaXZlciBuZXR3b3JrIHN0YXR1cwogICogQG5ldGluZm9fd2FpdHE6IHdhaXRxIGZvciB0aGUgdGhyZWFkIHRvIHNsZWVwCkBAIC0xMDAsNyArOTksNiBAQAogCXN0cnVjdCBtb3N0X2ludGVyZmFjZSBtb3N0X2lmYWNlOwogCWNoYXIgbmFtZVsxNiArIHNpemVvZiAiZGltMi0iXTsKIAl2b2lkIF9faW9tZW0gKmlvX2Jhc2U7Ci0JdW5zaWduZWQgaW50IGlycV9haGIwOwogCWludCBjbGtfc3BlZWQ7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpuZXRpbmZvX3Rhc2s7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgbmV0aW5mb193YWl0cTsKQEAgLTExOCwxMCArMTE2LDYgQEAKIAkoKChwKVsxXSA9PSAweDE4KSAmJiAoKHApWzJdID09IDB4MDUpICYmICgocClbM10gPT0gMHgwQykgJiYgXAogCSAoKHApWzEzXSA9PSAweDNDKSAmJiAoKHApWzE0XSA9PSAweDAwKSAmJiAoKHApWzE1XSA9PSAweDBBKSkKIAotI2lmIGRlZmluZWQoRU5BQkxFX0hETV9URVNUKQotc3RhdGljIHN0cnVjdCBkaW0yX2hkbSAqdGVzdF9kZXY7Ci0jZW5kaWYKLQogYm9vbCBkaW0yX3N5c2ZzX2dldF9zdGF0ZV9jYih2b2lkKQogewogCWJvb2wgc3RhdGU7CkBAIC0yMTIsNyArMjA2LDggQEAKIAkJCXJldHVybiByZXQ7CiAJfQogCi0JaGFsX3JldCA9IGRpbV9zdGFydHVwKGRldi0+aW9fYmFzZSwgZGV2LT5jbGtfc3BlZWQpOworCXByX2luZm8oInN5bmM6IG51bSBvZiBmcmFtZXMgcGVyIHN1Yi1idWZmZXI6ICV1XG4iLCBmY250KTsKKwloYWxfcmV0ID0gZGltX3N0YXJ0dXAoZGV2LT5pb19iYXNlLCBkZXYtPmNsa19zcGVlZCwgZmNudCk7CiAJaWYgKGhhbF9yZXQgIT0gRElNX05PX0VSUk9SKSB7CiAJCXByX2VycigiZGltX3N0YXJ0dXAgZmFpbGVkOiAlZFxuIiwgaGFsX3JldCk7CiAJCWlmIChwZGF0YSAmJiBwZGF0YS0+ZGVzdHJveSkKQEAgLTI1NCw2ICsyNDksMTEgQEAKIAltYm8gPSBsaXN0X2ZpcnN0X2VudHJ5KGhlYWQsIHN0cnVjdCBtYm8sIGxpc3QpOwogCWJ1Zl9zaXplID0gbWJvLT5idWZmZXJfbGVuZ3RoOwogCisJaWYgKGRpbV9kYnJfc3BhY2UoJmhkbV9jaC0+Y2gpIDwgYnVmX3NpemUpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGltX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCiAJQlVHX09OKG1iby0+YnVzX2FkZHJlc3MgPT0gMCk7CiAJaWYgKCFkaW1fZW5xdWV1ZV9idWZmZXIoJmhkbV9jaC0+Y2gsIG1iby0+YnVzX2FkZHJlc3MsIGJ1Zl9zaXplKSkgewogCQlsaXN0X2RlbChoZWFkLT5uZXh0KTsKQEAgLTQxMSw2ICs0MTEsMjIgQEAKIAlyZXR1cm4gYnVmZmVyOwogfQogCitzdGF0aWMgaXJxcmV0dXJuX3QgZGltMl9tbGJfaXNyKGludCBpcnEsIHZvaWQgKl9kZXYpCit7CisJc3RydWN0IGRpbTJfaGRtICpkZXYgPSBfZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGltX2xvY2ssIGZsYWdzKTsKKwlkaW1fc2VydmljZV9tbGJfaW50X2lycSgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpbV9sb2NrLCBmbGFncyk7CisKKwlpZiAoZGV2LT5hdHhfaWR4ID49IDAgJiYgZGV2LT5oY2hbZGV2LT5hdHhfaWR4XS5pc19pbml0aWFsaXplZCkKKwkJd2hpbGUgKCF0cnlfc3RhcnRfZGltX3RyYW5zZmVyKGRldi0+aGNoICsgZGV2LT5hdHhfaWR4KSkKKwkJCWNvbnRpbnVlOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCiAvKioKICAqIGRpbTJfdGFza2xldF9mbiAtIHRhc2tsZXQgZnVuY3Rpb24KICAqIEBkYXRhOiBwcml2YXRlIGRhdGEKQEAgLTQ1MiwzMCArNDY4LDE0IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkaW1fbG9jaywgZmxhZ3MpOwotCWRpbV9zZXJ2aWNlX2lycShnZXRfYWN0aXZlX2NoYW5uZWxzKGRldiwgYnVmZmVyKSk7CisJZGltX3NlcnZpY2VfYWhiX2ludF9pcnEoZ2V0X2FjdGl2ZV9jaGFubmVscyhkZXYsIGJ1ZmZlcikpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpbV9sb2NrLCBmbGFncyk7CiAKLSNpZiAhZGVmaW5lZChFTkFCTEVfSERNX1RFU1QpCiAJZGltMl90YXNrbGV0LmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CiAJdGFza2xldF9zY2hlZHVsZSgmZGltMl90YXNrbGV0KTsKLSNlbHNlCi0JZGltMl90YXNrbGV0X2ZuKCh1bnNpZ25lZCBsb25nKWRldik7Ci0jZW5kaWYKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLSNpZiBkZWZpbmVkKEVOQUJMRV9IRE1fVEVTVCkKLQotLyoKLSAqIFV0aWxpdHkgZnVuY3Rpb24gdXNlZCBieSBIQUwtc2ltdSBmb3IgY2FsbGluZyBESU0gaW50ZXJydXB0IGhhbmRsZXIuCi0gKiBJdCBpcyB1c2VkIG9ubHkgZm9yIFRFU1QgUFVSUE9TRS4KLSAqLwotdm9pZCByYWlzZV9kaW1faW50ZXJydXB0KHZvaWQpCi17Ci0JKHZvaWQpZGltMl9haGJfaXNyKDAsIHRlc3RfZGV2KTsKLX0KLSNlbmRpZgotCiAvKioKICAqIGNvbXBsZXRlX2FsbF9tYm9zIC0gY29tcGxldGUgTUJPJ3MgaW4gYSBsaXN0CiAgKiBAaGVhZDogbGlzdCBoZWFkCkBAIC01NDUsNyArNTQ1LDcgQEAKIAkJCQloZG1fY2gtPm5hbWUsIGJ1Zl9zaXplLCBuZXdfc2l6ZSk7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkaW1fbG9jaywgZmxhZ3MpOwogCQloYWxfcmV0ID0gZGltX2luaXRfY29udHJvbCgmaGRtX2NoLT5jaCwgaXNfdHgsIGNoX2FkZHIsCi0JCQkJCSAgIGJ1Zl9zaXplKTsKKwkJCQkJICAgaXNfdHggPyBuZXdfc2l6ZSAqIDIgOiBuZXdfc2l6ZSk7CiAJCWJyZWFrOwogCWNhc2UgTU9TVF9DSF9BU1lOQzoKIAkJbmV3X3NpemUgPSBkaW1fbm9ybV9jdHJsX2FzeW5jX2J1ZmZlcl9zaXplKGJ1Zl9zaXplKTsKQEAgLTU1OCw5ICs1NTgsMTAgQEAKIAkJCXByX3dhcm4oIiVzOiBmaXhlZCBidWZmZXIgc2l6ZSAoJWQgLT4gJWQpXG4iLAogCQkJCWhkbV9jaC0+bmFtZSwgYnVmX3NpemUsIG5ld19zaXplKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRpbV9sb2NrLCBmbGFncyk7Ci0JCWhhbF9yZXQgPSBkaW1faW5pdF9hc3luYygmaGRtX2NoLT5jaCwgaXNfdHgsIGNoX2FkZHIsIGJ1Zl9zaXplKTsKKwkJaGFsX3JldCA9IGRpbV9pbml0X2FzeW5jKCZoZG1fY2gtPmNoLCBpc190eCwgY2hfYWRkciwKKwkJCQkJIGlzX3R4ID8gbmV3X3NpemUgKiAyIDogbmV3X3NpemUpOwogCQlicmVhazsKLQljYXNlIE1PU1RfQ0hfSVNPQ19BVlA6CisJY2FzZSBNT1NUX0NIX0lTT0M6CiAJCW5ld19zaXplID0gZGltX25vcm1faXNvY19idWZmZXJfc2l6ZShidWZfc2l6ZSwgc3ViX3NpemUpOwogCQlpZiAobmV3X3NpemUgPT0gMCkgewogCQkJcHJfZXJyKCIlczogaW52YWxpZCBzdWItYnVmZmVyIHNpemUgb3IgdG9vIHNtYWxsIGJ1ZmZlciBzaXplXG4iLApAQCAtNzA1LDEyICs3MDYsMTQgQEAKIAlpZiAoIWhkbV9jaC0+aXNfaW5pdGlhbGl6ZWQpCiAJCXJldHVybiAtRVBFUk07CiAKKwl0YXNrbGV0X2Rpc2FibGUoJmRpbTJfdGFza2xldCk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRpbV9sb2NrLCBmbGFncyk7CiAJaGFsX3JldCA9IGRpbV9kZXN0cm95X2NoYW5uZWwoJmhkbV9jaC0+Y2gpOwogCWhkbV9jaC0+aXNfaW5pdGlhbGl6ZWQgPSBmYWxzZTsKIAlpZiAoY2hfaWR4ID09IGRldi0+YXR4X2lkeCkKIAkJZGV2LT5hdHhfaWR4ID0gLTE7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGltX2xvY2ssIGZsYWdzKTsKKwl0YXNrbGV0X2VuYWJsZSgmZGltMl90YXNrbGV0KTsKIAlpZiAoaGFsX3JldCAhPSBESU1fTk9fRVJST1IpIHsKIAkJcHJfZXJyKCJIQUwgRmFpbGVkIHRvIGNsb3NlIGNoYW5uZWwgJXNcbiIsIGhkbV9jaC0+bmFtZSk7CiAJCXJldCA9IC1FRkFVTFQ7CkBAIC03MzUsNiArNzM4LDcgQEAKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlpbnQgcmV0LCBpOwogCXN0cnVjdCBrb2JqZWN0ICprb2JqOworCWludCBpcnE7CiAKIAlkZXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldikKQEAgLTc0MywyOSArNzQ3LDM3IEBACiAJZGV2LT5hdHhfaWR4ID0gLTE7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOwotI2lmIGRlZmluZWQoRU5BQkxFX0hETV9URVNUKQotCXRlc3RfZGV2ID0gZGV2OwotI2Vsc2UKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWRldi0+aW9fYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwogCWlmIChJU19FUlIoZGV2LT5pb19iYXNlKSkKIAkJcmV0dXJuIFBUUl9FUlIoZGV2LT5pb19iYXNlKTsKIAotCXJldCA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBpcnFcbiIpOworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycSA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBhaGIwX2ludCBpcnFcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0JZGV2LT5pcnFfYWhiMCA9IHJldDsKIAotCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgZGV2LT5pcnFfYWhiMCwgZGltMl9haGJfaXNyLCAwLAotCQkJICAgICAgICJtbGJfYWhiMCIsIGRldik7CisJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBpcnEsIGRpbTJfYWhiX2lzciwgMCwKKwkJCSAgICAgICAiZGltMl9haGIwX2ludCIsIGRldik7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBJUlE6ICVkLCBlcnI6ICVkXG4iLAotCQkJZGV2LT5pcnFfYWhiMCwgcmV0KTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgYWhiMF9pbnQgaXJxICVkXG4iLCBpcnEpOwogCQlyZXR1cm4gcmV0OwogCX0KLSNlbmRpZgorCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAxKTsKKwlpZiAoaXJxIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IG1sYl9pbnQgaXJxXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBpcnEsIGRpbTJfbWxiX2lzciwgMCwKKwkJCSAgICAgICAiZGltMl9tbGJfaW50IiwgZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IG1sYl9pbnQgaXJxICVkXG4iLCBpcnEpOworCQlyZXR1cm4gcmV0OworCX0KKwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+bmV0aW5mb193YWl0cSk7CiAJZGV2LT5kZWxpdmVyX25ldGluZm8gPSAwOwogCWRldi0+bmV0aW5mb190YXNrID0ga3RocmVhZF9ydW4oJmRlbGl2ZXJfbmV0aW5mb190aHJlYWQsICh2b2lkICopZGV2LApAQCAtNzg1LDcgKzc5Nyw3IEBACiAJCWNhcC0+bmFtZV9zdWZmaXggPSBoZG1fY2gtPm5hbWU7CiAJCWNhcC0+ZGlyZWN0aW9uID0gTU9TVF9DSF9SWCB8IE1PU1RfQ0hfVFg7CiAJCWNhcC0+ZGF0YV90eXBlID0gTU9TVF9DSF9DT05UUk9MIHwgTU9TVF9DSF9BU1lOQyB8Ci0JCQkJIE1PU1RfQ0hfSVNPQ19BVlAgfCBNT1NUX0NIX1NZTkM7CisJCQkJIE1PU1RfQ0hfSVNPQyB8IE1PU1RfQ0hfU1lOQzsKIAkJY2FwLT5udW1fYnVmZmVyc19wYWNrZXQgPSBNQVhfQlVGRkVSU19QQUNLRVQ7CiAJCWNhcC0+YnVmZmVyX3NpemVfcGFja2V0ID0gTUFYX0JVRl9TSVpFX1BBQ0tFVDsKIAkJY2FwLT5udW1fYnVmZmVyc19zdHJlYW1pbmcgPSBNQVhfQlVGRkVSU19TVFJFQU1JTkc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9oZG0tZGltMi9kaW0yX3JlZy5oIGIvZHJpdmVycy9zdGFnaW5nL21vc3QvaGRtLWRpbTIvZGltMl9yZWcuaAppbmRleCBlMDgzN2I2Li4wMWZlNDk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9oZG0tZGltMi9kaW0yX3JlZy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS1kaW0yL2RpbTJfcmVnLmgKQEAgLTc3LDEzICs3Nyw3IEBACiAKIAlNTEJDMF9GQ05UX1NISUZUID0gMTUsCiAJTUxCQzBfRkNOVF9NQVNLID0gNywKLQlNTEJDMF9GQ05UX1ZBTF8xRlBTQiA9IDAsCi0JTUxCQzBfRkNOVF9WQUxfMkZQU0IgPSAxLAotCU1MQkMwX0ZDTlRfVkFMXzRGUFNCID0gMiwKLQlNTEJDMF9GQ05UX1ZBTF84RlBTQiA9IDMsCi0JTUxCQzBfRkNOVF9WQUxfMTZGUFNCID0gNCwKLQlNTEJDMF9GQ05UX1ZBTF8zMkZQU0IgPSA1LAotCU1MQkMwX0ZDTlRfVkFMXzY0RlBTQiA9IDYsCisJTUxCQzBfRkNOVF9NQVhfVkFMID0gNiwKIAogCU1MQkMwX01MQkVOX0JJVCA9IDAsCiAKQEAgLTEyMyw2ICsxMTcsOSBAQAogfTsKIAogZW51bSB7CisJQ0RUMF9SUENfU0hJRlQgPSAxNiArIDExLAorCUNEVDBfUlBDX01BU0sgPSBESU0yX01BU0soNSksCisKIAlDRFQxX0JTX0lTT0NfU0hJRlQgPSAwLAogCUNEVDFfQlNfSVNPQ19NQVNLID0gRElNMl9NQVNLKDkpLAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9oZG0tZGltMi9kaW0yX3N5c2ZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvbW9zdC9oZG0tZGltMi9kaW0yX3N5c2ZzLmMKaW5kZXggMmIyOGU0YS4uZDhiMjJmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21vc3QvaGRtLWRpbTIvZGltMl9zeXNmcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS1kaW0yL2RpbTJfc3lzZnMuYwpAQCAtMzksNyArMzksNyBAQAogCU5VTEwsCiB9OwogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBidXNfYXR0cl9ncm91cCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGJ1c19hdHRyX2dyb3VwID0gewogCS5hdHRycyA9IGJ1c19kZWZhdWx0X2F0dHJzLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21vc3QvaGRtLXVzYi9oZG1fdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvbW9zdC9oZG0tdXNiL2hkbV91c2IuYwppbmRleCBhZWFlMDcxLi4yNmM5YWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9oZG0tdXNiL2hkbV91c2IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbW9zdC9oZG0tdXNiL2hkbV91c2IuYwpAQCAtNDMsOCArNDMsOSBAQAogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfU01TQwkweDA0MjQgIC8qIFZJRDogU01TQyAqLwogI2RlZmluZSBVU0JfREVWX0lEX0JSREcJCTB4QzAwMSAgLyogUElEOiBVU0IgQnJpZGdlICovCi0jZGVmaW5lIFVTQl9ERVZfSURfSU5JQwkJMHhDRjE4ICAvKiBQSUQ6IFVTQiBJTklDICovCi0jZGVmaW5lIEhXX1JFU1lOQwkJMHgwMDAwCisjZGVmaW5lIFVTQl9ERVZfSURfT1M4MTExOAkweENGMTggIC8qIFBJRDogVVNCIE9TODExMTggKi8KKyNkZWZpbmUgVVNCX0RFVl9JRF9PUzgxMTE5CTB4Q0YxOSAgLyogUElEOiBVU0IgT1M4MTExOSAqLworI2RlZmluZSBVU0JfREVWX0lEX09TODEyMTAJMHhDRjMwICAvKiBQSUQ6IFVTQiBPUzgxMjEwICovCiAvKiBEUkNJIEFkZHJlc3NlcyAqLwogI2RlZmluZSBEUkNJX1JFR19OSV9TVEFURQkweDAxMDAKICNkZWZpbmUgRFJDSV9SRUdfUEFDS0VUX0JXCTB4MDEwMQpAQCAtNjQsMzMgKzY1LDMwIEBACiAjZGVmaW5lIERSQ0lfV1JJVEVfUkVRCQkweEExCiAKIC8qKgotICogc3RydWN0IGJ1Zl9hbmNob3IgLSB1c2VkIHRvIGNyZWF0ZSBhIGxpc3Qgb2YgcGVuZGluZyBVUkJzCi0gKiBAdXJiOiBwb2ludGVyIHRvIFVTQiByZXF1ZXN0IGJsb2NrCi0gKiBAY2xlYXJfd29ya19vYmo6Ci0gKiBAbGlzdDogbGlua2VkIGxpc3QKLSAqIEB1cmJfY29tcGxldGlvbjoKLSAqLwotc3RydWN0IGJ1Zl9hbmNob3IgewotCXN0cnVjdCB1cmIgKnVyYjsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY2xlYXJfd29ya19vYmo7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCBjb21wbGV0aW9uIHVyYl9jb21wbDsKLX07Ci0KLSNkZWZpbmUgdG9fYnVmX2FuY2hvcih3KSBjb250YWluZXJfb2Yodywgc3RydWN0IGJ1Zl9hbmNob3IsIGNsZWFyX3dvcmtfb2JqKQotCi0vKioKICAqIHN0cnVjdCBtb3N0X2RjaV9vYmogLSBEaXJlY3QgQ29tbXVuaWNhdGlvbiBJbnRlcmZhY2UKICAqIEBrb2JqOnBvc2l0aW9uIGluIHN5c2ZzCiAgKiBAdXNiX2RldmljZTogcG9pbnRlciB0byB0aGUgdXNiIGRldmljZQorICogQHJlZ19hZGRyOiByZWdpc3RlciBhZGRyZXNzIGZvciBhcmJpdHJhcnkgRENJIGFjY2VzcwogICovCiBzdHJ1Y3QgbW9zdF9kY2lfb2JqIHsKIAlzdHJ1Y3Qga29iamVjdCBrb2JqOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2aWNlOworCXUxNiByZWdfYWRkcjsKIH07CiAKICNkZWZpbmUgdG9fZGNpX29iaihwKSBjb250YWluZXJfb2YocCwgc3RydWN0IG1vc3RfZGNpX29iaiwga29iaikKIAorc3RydWN0IG1vc3RfZGV2OworCitzdHJ1Y3QgY2xlYXJfaG9sZF93b3JrIHsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd3M7CisJc3RydWN0IG1vc3RfZGV2ICptZGV2OworCXVuc2lnbmVkIGludCBjaGFubmVsOworCWludCBwaXBlOworfTsKKworI2RlZmluZSB0b19jbGVhcl9ob2xkX3dvcmsodykgY29udGFpbmVyX29mKHcsIHN0cnVjdCBjbGVhcl9ob2xkX3dvcmssIHdzKQorCiAvKioKICAqIHN0cnVjdCBtb3N0X2RldiAtIGhvbGRzIGFsbCB1c2IgaW50ZXJmYWNlIHNwZWNpZmljIHN0dWZmCiAgKiBAcGFyZW50OiBwYXJlbnQgb2JqZWN0IGluIHN5c2ZzCkBAIC0xMDQsMTAgKzEwMiwxMCBAQAogICogQGxpbmtfc3RhdDogbGluayBzdGF0dXMgb2YgaGFyZHdhcmUKICAqIEBkZXNjcmlwdGlvbjogZGV2aWNlIGRlc2NyaXB0aW9uCiAgKiBAc3VmZml4OiBzdWZmaXggZm9yIGNoYW5uZWwgbmFtZQotICogQGFuY2hvcl9saXN0X2xvY2s6IGxvY2tzIGxpc3QgYWNjZXNzCisgKiBAY2hhbm5lbF9sb2NrOiBzeW5jaHJvbml6ZSBjaGFubmVsIGFjY2VzcwogICogQHBhZGRpbmdfYWN0aXZlOiBpbmRpY2F0ZXMgY2hhbm5lbCB1c2VzIHBhZGRpbmcKICAqIEBpc19jaGFubmVsX2hlYWx0aHk6IGhlYWx0aCBzdGF0dXMgdGFibGUgb2YgZWFjaCBjaGFubmVsCi0gKiBAYW5jaG9yX2xpc3Q6IGxpc3Qgb2YgYW5jaG9yZWQgaXRlbXMKKyAqIEBidXN5X3VyYnM6IGxpc3Qgb2YgYW5jaG9yZWQgaXRlbXMKICAqIEBpb19tdXRleDogc3luY2hyb25pemUgSS9PIHdpdGggZGlzY29ubmVjdAogICogQGxpbmtfc3RhdF90aW1lcjogdGltZXIgZm9yIGxpbmsgc3RhdHVzIHJlcG9ydHMKICAqIEBwb2xsX3dvcmtfb2JqOiB3b3JrIGZvciBwb2xsaW5nIGxpbmsgc3RhdHVzCkBAIC0xMjQsMTAgKzEyMiwxMSBAQAogCXUxNiBsaW5rX3N0YXQ7CiAJY2hhciBkZXNjcmlwdGlvbltNQVhfU1RSSU5HX0xFTl07CiAJY2hhciBzdWZmaXhbTUFYX05VTV9FTkRQT0lOVFNdW01BWF9TVUZGSVhfTEVOXTsKLQlzcGlubG9ja190IGFuY2hvcl9saXN0X2xvY2tbTUFYX05VTV9FTkRQT0lOVFNdOworCXNwaW5sb2NrX3QgY2hhbm5lbF9sb2NrW01BWF9OVU1fRU5EUE9JTlRTXTsgLyogc3luYyBjaGFubmVsIGFjY2VzcyAqLwogCWJvb2wgcGFkZGluZ19hY3RpdmVbTUFYX05VTV9FTkRQT0lOVFNdOwogCWJvb2wgaXNfY2hhbm5lbF9oZWFsdGh5W01BWF9OVU1fRU5EUE9JTlRTXTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICphbmNob3JfbGlzdDsKKwlzdHJ1Y3QgY2xlYXJfaG9sZF93b3JrIGNsZWFyX3dvcmtbTUFYX05VTV9FTkRQT0lOVFNdOworCXN0cnVjdCB1c2JfYW5jaG9yICpidXN5X3VyYnM7CiAJc3RydWN0IG11dGV4IGlvX211dGV4OwogCXN0cnVjdCB0aW1lcl9saXN0IGxpbmtfc3RhdF90aW1lcjsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcG9sbF93b3JrX29iajsKQEAgLTE5MSw0MCArMTkwLDI0IEBACiAgKiBmcmVlX2FuY2hvcmVkX2J1ZmZlcnMgLSBmcmVlIGRldmljZSdzIGFuY2hvcmVkIGl0ZW1zCiAgKiBAbWRldjogdGhlIGRldmljZQogICogQGNoYW5uZWw6IGNoYW5uZWwgSUQKKyAqIEBzdGF0dXM6IHN0YXR1cyBvZiBNQk8gdGVybWluYXRpb24KICAqLwotc3RhdGljIHZvaWQgZnJlZV9hbmNob3JlZF9idWZmZXJzKHN0cnVjdCBtb3N0X2RldiAqbWRldiwgdW5zaWduZWQgaW50IGNoYW5uZWwpCitzdGF0aWMgdm9pZCBmcmVlX2FuY2hvcmVkX2J1ZmZlcnMoc3RydWN0IG1vc3RfZGV2ICptZGV2LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCwKKwkJCQkgIGVudW0gbWJvX3N0YXR1c19mbGFncyBzdGF0dXMpCiB7CiAJc3RydWN0IG1ibyAqbWJvOwotCXN0cnVjdCBidWZfYW5jaG9yICphbmNob3IsICp0bXA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdXJiICp1cmI7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+YW5jaG9yX2xpc3RfbG9ja1tjaGFubmVsXSwgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhbmNob3IsIHRtcCwgJm1kZXYtPmFuY2hvcl9saXN0W2NoYW5uZWxdLAotCQkJCSBsaXN0KSB7Ci0JCXN0cnVjdCB1cmIgKnVyYiA9IGFuY2hvci0+dXJiOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPmFuY2hvcl9saXN0X2xvY2tbY2hhbm5lbF0sIGZsYWdzKTsKLQkJaWYgKGxpa2VseSh1cmIpKSB7Ci0JCQltYm8gPSB1cmItPmNvbnRleHQ7Ci0JCQlpZiAoIWlycXNfZGlzYWJsZWQoKSkgewotCQkJCXVzYl9raWxsX3VyYih1cmIpOwotCQkJfSBlbHNlIHsKLQkJCQl1c2JfdW5saW5rX3VyYih1cmIpOwotCQkJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmFuY2hvci0+dXJiX2NvbXBsKTsKLQkJCX0KLQkJCWlmICgobWJvKSAmJiAobWJvLT5jb21wbGV0ZSkpIHsKLQkJCQltYm8tPnN0YXR1cyA9IE1CT19FX0NMT1NFOwotCQkJCW1iby0+cHJvY2Vzc2VkX2xlbmd0aCA9IDA7Ci0JCQkJbWJvLT5jb21wbGV0ZShtYm8pOwotCQkJfQotCQkJdXNiX2ZyZWVfdXJiKHVyYik7CisJd2hpbGUgKCh1cmIgPSB1c2JfZ2V0X2Zyb21fYW5jaG9yKCZtZGV2LT5idXN5X3VyYnNbY2hhbm5lbF0pKSkgeworCQltYm8gPSB1cmItPmNvbnRleHQ7CisJCXVzYl9raWxsX3VyYih1cmIpOworCQlpZiAobWJvICYmIG1iby0+Y29tcGxldGUpIHsKKwkJCW1iby0+c3RhdHVzID0gc3RhdHVzOworCQkJbWJvLT5wcm9jZXNzZWRfbGVuZ3RoID0gMDsKKwkJCW1iby0+Y29tcGxldGUobWJvKTsKIAkJfQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+YW5jaG9yX2xpc3RfbG9ja1tjaGFubmVsXSwgZmxhZ3MpOwotCQlsaXN0X2RlbCgmYW5jaG9yLT5saXN0KTsKLQkJY2FuY2VsX3dvcmtfc3luYygmYW5jaG9yLT5jbGVhcl93b3JrX29iaik7Ci0JCWtmcmVlKGFuY2hvcik7CisJCXVzYl9mcmVlX3VyYih1cmIpOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT5hbmNob3JfbGlzdF9sb2NrW2NoYW5uZWxdLCBmbGFncyk7CiB9CiAKIC8qKgpAQCAtMjQxLDcgKzIyNCw3IEBACiAJCXJldHVybiBmcmFtZV9zaXplOwogCX0KIAlzd2l0Y2ggKGNmZy0+ZGF0YV90eXBlKSB7Ci0JY2FzZSBNT1NUX0NIX0lTT0NfQVZQOgorCWNhc2UgTU9TVF9DSF9JU09DOgogCQlmcmFtZV9zaXplID0gQVZfUEFDS0VUU19QRVJfWEFDVCAqIHN1Yl9zaXplOwogCQlicmVhazsKIAljYXNlIE1PU1RfQ0hfU1lOQzoKQEAgLTI3NCwyMiArMjU3LDI4IEBACiAgKi8KIHN0YXRpYyBpbnQgaGRtX3BvaXNvbl9jaGFubmVsKHN0cnVjdCBtb3N0X2ludGVyZmFjZSAqaWZhY2UsIGludCBjaGFubmVsKQogewotCXN0cnVjdCBtb3N0X2RldiAqbWRldjsKKwlzdHJ1Y3QgbW9zdF9kZXYgKm1kZXYgPSB0b19tZGV2KGlmYWNlKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5sb2NrX3QgKmxvY2s7IC8qIHRlbXAuIGxvY2sgKi8KIAotCW1kZXYgPSB0b19tZGV2KGlmYWNlKTsKIAlpZiAodW5saWtlbHkoIWlmYWNlKSkgewogCQlkZXZfd2FybigmbWRldi0+dXNiX2RldmljZS0+ZGV2LCAiUG9pc29uOiBCYWQgaW50ZXJmYWNlLlxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KLQlpZiAodW5saWtlbHkoKGNoYW5uZWwgPCAwKSB8fCAoY2hhbm5lbCA+PSBpZmFjZS0+bnVtX2NoYW5uZWxzKSkpIHsKKwlpZiAodW5saWtlbHkoY2hhbm5lbCA8IDAgfHwgY2hhbm5lbCA+PSBpZmFjZS0+bnVtX2NoYW5uZWxzKSkgewogCQlkZXZfd2FybigmbWRldi0+dXNiX2RldmljZS0+ZGV2LCAiQ2hhbm5lbCBJRCBvdXQgb2YgcmFuZ2UuXG4iKTsKIAkJcmV0dXJuIC1FQ0hSTkc7CiAJfQogCisJbG9jayA9IG1kZXYtPmNoYW5uZWxfbG9jayArIGNoYW5uZWw7CisJc3Bpbl9sb2NrX2lycXNhdmUobG9jaywgZmxhZ3MpOwogCW1kZXYtPmlzX2NoYW5uZWxfaGVhbHRoeVtjaGFubmVsXSA9IGZhbHNlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobG9jaywgZmxhZ3MpOworCisJY2FuY2VsX3dvcmtfc3luYygmbWRldi0+Y2xlYXJfd29ya1tjaGFubmVsXS53cyk7CiAKIAltdXRleF9sb2NrKCZtZGV2LT5pb19tdXRleCk7Ci0JZnJlZV9hbmNob3JlZF9idWZmZXJzKG1kZXYsIGNoYW5uZWwpOworCWZyZWVfYW5jaG9yZWRfYnVmZmVycyhtZGV2LCBjaGFubmVsLCBNQk9fRV9DTE9TRSk7CiAJaWYgKG1kZXYtPnBhZGRpbmdfYWN0aXZlW2NoYW5uZWxdKQogCQltZGV2LT5wYWRkaW5nX2FjdGl2ZVtjaGFubmVsXSA9IGZhbHNlOwogCkBAIC0zMTMsMTAgKzMwMiwxMCBAQAogc3RhdGljIGludCBoZG1fYWRkX3BhZGRpbmcoc3RydWN0IG1vc3RfZGV2ICptZGV2LCBpbnQgY2hhbm5lbCwgc3RydWN0IG1ibyAqbWJvKQogewogCXN0cnVjdCBtb3N0X2NoYW5uZWxfY29uZmlnICpjb25mID0gJm1kZXYtPmNvbmZbY2hhbm5lbF07Ci0JdW5zaWduZWQgaW50IGosIG51bV9mcmFtZXMsIGZyYW1lX3NpemU7CisJdW5zaWduZWQgaW50IGZyYW1lX3NpemUgPSBnZXRfc3RyZWFtX2ZyYW1lX3NpemUoY29uZik7CisJdW5zaWduZWQgaW50IGosIG51bV9mcmFtZXM7CiAJdTE2IHJkX2FkZHIsIHdyX2FkZHI7CiAKLQlmcmFtZV9zaXplID0gZ2V0X3N0cmVhbV9mcmFtZV9zaXplKGNvbmYpOwogCWlmICghZnJhbWVfc2l6ZSkKIAkJcmV0dXJuIC1FSU87CiAJbnVtX2ZyYW1lcyA9IG1iby0+YnVmZmVyX2xlbmd0aCAvIGZyYW1lX3NpemU7CkBAIC0zNTAsMTAgKzMzOSwxMCBAQAogc3RhdGljIGludCBoZG1fcmVtb3ZlX3BhZGRpbmcoc3RydWN0IG1vc3RfZGV2ICptZGV2LCBpbnQgY2hhbm5lbCwKIAkJCSAgICAgIHN0cnVjdCBtYm8gKm1ibykKIHsKLQl1bnNpZ25lZCBpbnQgaiwgbnVtX2ZyYW1lcywgZnJhbWVfc2l6ZTsKIAlzdHJ1Y3QgbW9zdF9jaGFubmVsX2NvbmZpZyAqY29uc3QgY29uZiA9ICZtZGV2LT5jb25mW2NoYW5uZWxdOworCXVuc2lnbmVkIGludCBmcmFtZV9zaXplID0gZ2V0X3N0cmVhbV9mcmFtZV9zaXplKGNvbmYpOworCXVuc2lnbmVkIGludCBqLCBudW1fZnJhbWVzOwogCi0JZnJhbWVfc2l6ZSA9IGdldF9zdHJlYW1fZnJhbWVfc2l6ZShjb25mKTsKIAlpZiAoIWZyYW1lX3NpemUpCiAJCXJldHVybiAtRUlPOwogCW51bV9mcmFtZXMgPSBtYm8tPnByb2Nlc3NlZF9sZW5ndGggLyBVU0JfTVRVOwpAQCAtMzgwLDM3ICszNjksMjkgQEAKICAqLwogc3RhdGljIHZvaWQgaGRtX3dyaXRlX2NvbXBsZXRpb24oc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCBtYm8gKm1ibzsKLQlzdHJ1Y3QgYnVmX2FuY2hvciAqYW5jaG9yOwotCXN0cnVjdCBtb3N0X2RldiAqbWRldjsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0JdW5zaWduZWQgaW50IGNoYW5uZWw7CisJc3RydWN0IG1ibyAqbWJvID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCBtb3N0X2RldiAqbWRldiA9IHRvX21kZXYobWJvLT5pZnApOworCXVuc2lnbmVkIGludCBjaGFubmVsID0gbWJvLT5oZG1fY2hhbm5lbF9pZDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmbWRldi0+dXNiX2RldmljZS0+ZGV2OworCXNwaW5sb2NrX3QgKmxvY2sgPSBtZGV2LT5jaGFubmVsX2xvY2sgKyBjaGFubmVsOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQltYm8gPSB1cmItPmNvbnRleHQ7Ci0JYW5jaG9yID0gbWJvLT5wcml2OwotCW1kZXYgPSB0b19tZGV2KG1iby0+aWZwKTsKLQljaGFubmVsID0gbWJvLT5oZG1fY2hhbm5lbF9pZDsKLQlkZXYgPSAmbWRldi0+dXNiX2RldmljZS0+ZGV2OwotCi0JaWYgKCh1cmItPnN0YXR1cyA9PSAtRU5PRU5UKSB8fCAodXJiLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQpIHx8Ci0JICAgICghbWRldi0+aXNfY2hhbm5lbF9oZWFsdGh5W2NoYW5uZWxdKSkgewotCQljb21wbGV0ZSgmYW5jaG9yLT51cmJfY29tcGwpOworCXNwaW5fbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKTsKKwlpZiAodXJiLT5zdGF0dXMgPT0gLUVOT0VOVCB8fCB1cmItPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCB8fAorCSAgICAhbWRldi0+aXNfY2hhbm5lbF9oZWFsdGh5W2NoYW5uZWxdKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobG9jaywgZmxhZ3MpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKHVubGlrZWx5KHVyYi0+c3RhdHVzICYmICEodXJiLT5zdGF0dXMgPT0gLUVOT0VOVCB8fAotCQkJCSAgICAgIHVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VUIHx8Ci0JCQkJICAgICAgdXJiLT5zdGF0dXMgPT0gLUVTSFVURE9XTikpKSB7CisJaWYgKHVubGlrZWx5KHVyYi0+c3RhdHVzICYmIHVyYi0+c3RhdHVzICE9IC1FU0hVVERPV04pKSB7CiAJCW1iby0+cHJvY2Vzc2VkX2xlbmd0aCA9IDA7CiAJCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKIAkJY2FzZSAtRVBJUEU6CiAJCQlkZXZfd2FybihkZXYsICJCcm9rZW4gT1VUIHBpcGUgZGV0ZWN0ZWRcbiIpOwotCQkJbW9zdF9zdG9wX2VucXVldWUoJm1kZXYtPmlmYWNlLCBjaGFubmVsKTsKLQkJCW1iby0+c3RhdHVzID0gTUJPX0VfSU5WQUw7Ci0JCQl1c2JfdW5saW5rX3VyYih1cmIpOwotCQkJSU5JVF9XT1JLKCZhbmNob3ItPmNsZWFyX3dvcmtfb2JqLCB3cV9jbGVhcl9oYWx0KTsKLQkJCXNjaGVkdWxlX3dvcmsoJmFuY2hvci0+Y2xlYXJfd29ya19vYmopOworCQkJbWRldi0+aXNfY2hhbm5lbF9oZWFsdGh5W2NoYW5uZWxdID0gZmFsc2U7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssIGZsYWdzKTsKKwkJCW1kZXYtPmNsZWFyX3dvcmtbY2hhbm5lbF0ucGlwZSA9IHVyYi0+cGlwZTsKKwkJCXNjaGVkdWxlX3dvcmsoJm1kZXYtPmNsZWFyX3dvcmtbY2hhbm5lbF0ud3MpOwogCQkJcmV0dXJuOwogCQljYXNlIC1FTk9ERVY6CiAJCWNhc2UgLUVQUk9UTzoKQEAgLTQyNSwxMCArNDA2LDcgQEAKIAkJbWJvLT5wcm9jZXNzZWRfbGVuZ3RoID0gdXJiLT5hY3R1YWxfbGVuZ3RoOwogCX0KIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT5hbmNob3JfbGlzdF9sb2NrW2NoYW5uZWxdLCBmbGFncyk7Ci0JbGlzdF9kZWwoJmFuY2hvci0+bGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+YW5jaG9yX2xpc3RfbG9ja1tjaGFubmVsXSwgZmxhZ3MpOwotCWtmcmVlKGFuY2hvcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncyk7CiAKIAlpZiAobGlrZWx5KG1iby0+Y29tcGxldGUpKQogCQltYm8tPmNvbXBsZXRlKG1ibyk7CkBAIC01NDUsMzYgKzUyMywyOSBAQAogICovCiBzdGF0aWMgdm9pZCBoZG1fcmVhZF9jb21wbGV0aW9uKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgbWJvICptYm87Ci0Jc3RydWN0IGJ1Zl9hbmNob3IgKmFuY2hvcjsKLQlzdHJ1Y3QgbW9zdF9kZXYgKm1kZXY7Ci0Jc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBtYm8gKm1ibyA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgbW9zdF9kZXYgKm1kZXYgPSB0b19tZGV2KG1iby0+aWZwKTsKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbCA9IG1iby0+aGRtX2NoYW5uZWxfaWQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJm1kZXYtPnVzYl9kZXZpY2UtPmRldjsKKwlzcGlubG9ja190ICpsb2NrID0gbWRldi0+Y2hhbm5lbF9sb2NrICsgY2hhbm5lbDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCBjaGFubmVsOwogCi0JbWJvID0gdXJiLT5jb250ZXh0OwotCWFuY2hvciA9IG1iby0+cHJpdjsKLQltZGV2ID0gdG9fbWRldihtYm8tPmlmcCk7Ci0JY2hhbm5lbCA9IG1iby0+aGRtX2NoYW5uZWxfaWQ7Ci0JZGV2ID0gJm1kZXYtPnVzYl9kZXZpY2UtPmRldjsKLQotCWlmICgodXJiLT5zdGF0dXMgPT0gLUVOT0VOVCkgfHwgKHVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VUKSB8fAotCSAgICAoIW1kZXYtPmlzX2NoYW5uZWxfaGVhbHRoeVtjaGFubmVsXSkpIHsKLQkJY29tcGxldGUoJmFuY2hvci0+dXJiX2NvbXBsKTsKKwlzcGluX2xvY2tfaXJxc2F2ZShsb2NrLCBmbGFncyk7CisJaWYgKHVyYi0+c3RhdHVzID09IC1FTk9FTlQgfHwgdXJiLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQgfHwKKwkgICAgIW1kZXYtPmlzX2NoYW5uZWxfaGVhbHRoeVtjaGFubmVsXSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmICh1bmxpa2VseSh1cmItPnN0YXR1cyAmJiAhKHVyYi0+c3RhdHVzID09IC1FTk9FTlQgfHwKLQkJCQkgICAgICB1cmItPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCB8fAotCQkJCSAgICAgIHVyYi0+c3RhdHVzID09IC1FU0hVVERPV04pKSkgeworCWlmICh1bmxpa2VseSh1cmItPnN0YXR1cyAmJiB1cmItPnN0YXR1cyAhPSAtRVNIVVRET1dOKSkgewogCQltYm8tPnByb2Nlc3NlZF9sZW5ndGggPSAwOwogCQlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CiAJCWNhc2UgLUVQSVBFOgogCQkJZGV2X3dhcm4oZGV2LCAiQnJva2VuIElOIHBpcGUgZGV0ZWN0ZWRcbiIpOwotCQkJbWJvLT5zdGF0dXMgPSBNQk9fRV9JTlZBTDsKLQkJCXVzYl91bmxpbmtfdXJiKHVyYik7Ci0JCQlJTklUX1dPUksoJmFuY2hvci0+Y2xlYXJfd29ya19vYmosIHdxX2NsZWFyX2hhbHQpOwotCQkJc2NoZWR1bGVfd29yaygmYW5jaG9yLT5jbGVhcl93b3JrX29iaik7CisJCQltZGV2LT5pc19jaGFubmVsX2hlYWx0aHlbY2hhbm5lbF0gPSBmYWxzZTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobG9jaywgZmxhZ3MpOworCQkJbWRldi0+Y2xlYXJfd29ya1tjaGFubmVsXS5waXBlID0gdXJiLT5waXBlOworCQkJc2NoZWR1bGVfd29yaygmbWRldi0+Y2xlYXJfd29ya1tjaGFubmVsXS53cyk7CiAJCQlyZXR1cm47CiAJCWNhc2UgLUVOT0RFVjoKIAkJY2FzZSAtRVBST1RPOgpAQCAtNTg4LDIxICs1NTksMTUgQEAKIAkJfQogCX0gZWxzZSB7CiAJCW1iby0+cHJvY2Vzc2VkX2xlbmd0aCA9IHVyYi0+YWN0dWFsX2xlbmd0aDsKLQkJaWYgKCFtZGV2LT5wYWRkaW5nX2FjdGl2ZVtjaGFubmVsXSkgewotCQkJbWJvLT5zdGF0dXMgPSBNQk9fU1VDQ0VTUzsKLQkJfSBlbHNlIHsKLQkJCWlmIChoZG1fcmVtb3ZlX3BhZGRpbmcobWRldiwgY2hhbm5lbCwgbWJvKSkgewotCQkJCW1iby0+cHJvY2Vzc2VkX2xlbmd0aCA9IDA7Ci0JCQkJbWJvLT5zdGF0dXMgPSBNQk9fRV9JTlZBTDsKLQkJCX0gZWxzZSB7Ci0JCQkJbWJvLT5zdGF0dXMgPSBNQk9fU1VDQ0VTUzsKLQkJCX0KKwkJbWJvLT5zdGF0dXMgPSBNQk9fU1VDQ0VTUzsKKwkJaWYgKG1kZXYtPnBhZGRpbmdfYWN0aXZlW2NoYW5uZWxdICYmCisJCSAgICBoZG1fcmVtb3ZlX3BhZGRpbmcobWRldiwgY2hhbm5lbCwgbWJvKSkgeworCQkJbWJvLT5wcm9jZXNzZWRfbGVuZ3RoID0gMDsKKwkJCW1iby0+c3RhdHVzID0gTUJPX0VfSU5WQUw7CiAJCX0KIAl9Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPmFuY2hvcl9saXN0X2xvY2tbY2hhbm5lbF0sIGZsYWdzKTsKLQlsaXN0X2RlbCgmYW5jaG9yLT5saXN0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT5hbmNob3JfbGlzdF9sb2NrW2NoYW5uZWxdLCBmbGFncyk7Ci0Ja2ZyZWUoYW5jaG9yKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobG9jaywgZmxhZ3MpOwogCiAJaWYgKGxpa2VseShtYm8tPmNvbXBsZXRlKSkKIAkJbWJvLT5jb21wbGV0ZShtYm8pOwpAQCAtNjI4LDE4ICs1OTMsMTYgQEAKIAkJICAgICAgIHN0cnVjdCBtYm8gKm1ibykKIHsKIAlzdHJ1Y3QgbW9zdF9kZXYgKm1kZXY7Ci0Jc3RydWN0IGJ1Zl9hbmNob3IgKmFuY2hvcjsKIAlzdHJ1Y3QgbW9zdF9jaGFubmVsX2NvbmZpZyAqY29uZjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJaW50IHJldHZhbCA9IDA7CiAJc3RydWN0IHVyYiAqdXJiOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyBsZW5ndGg7CiAJdm9pZCAqdmlydF9hZGRyZXNzOwogCiAJaWYgKHVubGlrZWx5KCFpZmFjZSB8fCAhbWJvKSkKIAkJcmV0dXJuIC1FSU87Ci0JaWYgKHVubGlrZWx5KGlmYWNlLT5udW1fY2hhbm5lbHMgPD0gY2hhbm5lbCkgfHwgKGNoYW5uZWwgPCAwKSkKKwlpZiAodW5saWtlbHkoaWZhY2UtPm51bV9jaGFubmVscyA8PSBjaGFubmVsIHx8IGNoYW5uZWwgPCAwKSkKIAkJcmV0dXJuIC1FQ0hSTkc7CiAKIAltZGV2ID0gdG9fbWRldihpZmFjZSk7CkBAIC02NTAsMzIgKzYxMywxNSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXVyYiA9IHVzYl9hbGxvY191cmIoTk9fSVNPQ0hST05PVVNfVVJCLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXVyYikgewotCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBVUkJcbiIpOworCWlmICghdXJiKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKLQlhbmNob3IgPSBremFsbG9jKHNpemVvZigqYW5jaG9yKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFhbmNob3IpIHsKLQkJcmV0dmFsID0gLUVOT01FTTsKKwlpZiAoKGNvbmYtPmRpcmVjdGlvbiAmIE1PU1RfQ0hfVFgpICYmIG1kZXYtPnBhZGRpbmdfYWN0aXZlW2NoYW5uZWxdICYmCisJICAgIGhkbV9hZGRfcGFkZGluZyhtZGV2LCBjaGFubmVsLCBtYm8pKSB7CisJCXJldHZhbCA9IC1FSU87CiAJCWdvdG8gX2Vycm9yOwogCX0KIAotCWFuY2hvci0+dXJiID0gdXJiOwotCWluaXRfY29tcGxldGlvbigmYW5jaG9yLT51cmJfY29tcGwpOwotCW1iby0+cHJpdiA9IGFuY2hvcjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT5hbmNob3JfbGlzdF9sb2NrW2NoYW5uZWxdLCBmbGFncyk7Ci0JbGlzdF9hZGRfdGFpbCgmYW5jaG9yLT5saXN0LCAmbWRldi0+YW5jaG9yX2xpc3RbY2hhbm5lbF0pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPmFuY2hvcl9saXN0X2xvY2tbY2hhbm5lbF0sIGZsYWdzKTsKLQotCWlmICgobWRldi0+cGFkZGluZ19hY3RpdmVbY2hhbm5lbF0pICYmCi0JICAgIChjb25mLT5kaXJlY3Rpb24gJiBNT1NUX0NIX1RYKSkKLQkJaWYgKGhkbV9hZGRfcGFkZGluZyhtZGV2LCBjaGFubmVsLCBtYm8pKSB7Ci0JCQlyZXR2YWwgPSAtRUlPOwotCQkJZ290byBfZXJyb3JfMTsKLQkJfQotCiAJdXJiLT50cmFuc2Zlcl9kbWEgPSBtYm8tPmJ1c19hZGRyZXNzOwogCXZpcnRfYWRkcmVzcyA9IG1iby0+dmlydF9hZGRyZXNzOwogCWxlbmd0aCA9IG1iby0+YnVmZmVyX2xlbmd0aDsKQEAgLTY4OCw3ICs2MzQsNyBAQAogCQkJCSAgbGVuZ3RoLAogCQkJCSAgaGRtX3dyaXRlX2NvbXBsZXRpb24sCiAJCQkJICBtYm8pOwotCQlpZiAoY29uZi0+ZGF0YV90eXBlICE9IE1PU1RfQ0hfSVNPQ19BVlApCisJCWlmIChjb25mLT5kYXRhX3R5cGUgIT0gTU9TVF9DSF9JU09DKQogCQkJdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfWkVST19QQUNLRVQ7CiAJfSBlbHNlIHsKIAkJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBtZGV2LT51c2JfZGV2aWNlLApAQCAtNzAxLDYgKzY0Nyw4IEBACiAJfQogCXVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CiAKKwl1c2JfYW5jaG9yX3VyYih1cmIsICZtZGV2LT5idXN5X3VyYnNbY2hhbm5lbF0pOworCiAJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfS0VSTkVMKTsKIAlpZiAocmV0dmFsKSB7CiAJCWRldl9lcnIoZGV2LCAiVVJCIHN1Ym1pdCBmYWlsZWQgd2l0aCBlcnJvciAlZC5cbiIsIHJldHZhbCk7CkBAIC03MDksMTAgKzY1Nyw3IEBACiAJcmV0dXJuIDA7CiAKIF9lcnJvcl8xOgotCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT5hbmNob3JfbGlzdF9sb2NrW2NoYW5uZWxdLCBmbGFncyk7Ci0JbGlzdF9kZWwoJmFuY2hvci0+bGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+YW5jaG9yX2xpc3RfbG9ja1tjaGFubmVsXSwgZmxhZ3MpOwotCWtmcmVlKGFuY2hvcik7CisJdXNiX3VuYW5jaG9yX3VyYih1cmIpOwogX2Vycm9yOgogCXVzYl9mcmVlX3VyYih1cmIpOwogCXJldHVybiByZXR2YWw7CkBAIC03MzEsMjkgKzY3NiwzMCBAQAogCXVuc2lnbmVkIGludCBmcmFtZV9zaXplOwogCXVuc2lnbmVkIGludCB0ZW1wX3NpemU7CiAJdW5zaWduZWQgaW50IHRhaWxfc3BhY2U7Ci0Jc3RydWN0IG1vc3RfZGV2ICptZGV2OwotCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbW9zdF9kZXYgKm1kZXYgPSB0b19tZGV2KGlmYWNlKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmbWRldi0+dXNiX2RldmljZS0+ZGV2OwogCi0JbWRldiA9IHRvX21kZXYoaWZhY2UpOwogCW1kZXYtPmlzX2NoYW5uZWxfaGVhbHRoeVtjaGFubmVsXSA9IHRydWU7Ci0JZGV2ID0gJm1kZXYtPnVzYl9kZXZpY2UtPmRldjsKKwltZGV2LT5jbGVhcl93b3JrW2NoYW5uZWxdLmNoYW5uZWwgPSBjaGFubmVsOworCW1kZXYtPmNsZWFyX3dvcmtbY2hhbm5lbF0ubWRldiA9IG1kZXY7CisJSU5JVF9XT1JLKCZtZGV2LT5jbGVhcl93b3JrW2NoYW5uZWxdLndzLCB3cV9jbGVhcl9oYWx0KTsKIAogCWlmICh1bmxpa2VseSghaWZhY2UgfHwgIWNvbmYpKSB7CiAJCWRldl9lcnIoZGV2LCAiQmFkIGludGVyZmFjZSBvciBjb25maWcgcG9pbnRlci5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKHVubGlrZWx5KChjaGFubmVsIDwgMCkgfHwgKGNoYW5uZWwgPj0gaWZhY2UtPm51bV9jaGFubmVscykpKSB7CisJaWYgKHVubGlrZWx5KGNoYW5uZWwgPCAwIHx8IGNoYW5uZWwgPj0gaWZhY2UtPm51bV9jaGFubmVscykpIHsKIAkJZGV2X2VycihkZXYsICJDaGFubmVsIElEIG91dCBvZiByYW5nZS5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKCghY29uZi0+bnVtX2J1ZmZlcnMpIHx8ICghY29uZi0+YnVmZmVyX3NpemUpKSB7CisJaWYgKCFjb25mLT5udW1fYnVmZmVycyB8fCAhY29uZi0+YnVmZmVyX3NpemUpIHsKIAkJZGV2X2VycihkZXYsICJNaXNjb25maWc6IGJ1ZmZlciBzaXplIG9yICNidWZmZXJzIHplcm8uXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKCEoY29uZi0+ZGF0YV90eXBlID09IE1PU1RfQ0hfU1lOQykgJiYKLQkgICAgISgoY29uZi0+ZGF0YV90eXBlID09IE1PU1RfQ0hfSVNPQ19BVlApICYmCi0JICAgICAgKGNvbmYtPnBhY2tldHNfcGVyX3hhY3QgIT0gMHhGRikpKSB7CisJaWYgKGNvbmYtPmRhdGFfdHlwZSAhPSBNT1NUX0NIX1NZTkMgJiYKKwkgICAgIShjb25mLT5kYXRhX3R5cGUgPT0gTU9TVF9DSF9JU09DICYmCisJICAgICAgY29uZi0+cGFja2V0c19wZXJfeGFjdCAhPSAweEZGKSkgewogCQltZGV2LT5wYWRkaW5nX2FjdGl2ZVtjaGFubmVsXSA9IGZhbHNlOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtNzYyLDcgKzcwOCw3IEBACiAJdGVtcF9zaXplID0gY29uZi0+YnVmZmVyX3NpemU7CiAKIAlmcmFtZV9zaXplID0gZ2V0X3N0cmVhbV9mcmFtZV9zaXplKGNvbmYpOwotCWlmICgoZnJhbWVfc2l6ZSA9PSAwKSB8fCAoZnJhbWVfc2l6ZSA+IFVTQl9NVFUpKSB7CisJaWYgKGZyYW1lX3NpemUgPT0gMCB8fCBmcmFtZV9zaXplID4gVVNCX01UVSkgewogCQlkZXZfd2FybihkZXYsICJNaXNjb25maWc6IGZyYW1lIHNpemUgd3JvbmdcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC04MDcsMTcgKzc1MywxNyBAQAogCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihtZGV2LT5od19hZGRyKSkgewogCQlpZiAoZHJjaV9yZF9yZWcodXNiX2RldmljZSwgRFJDSV9SRUdfSFdfQUREUl9ISSwgJmhpKSA8IDApIHsKIAkJCWRldl9lcnIoZGV2LCAiVmVuZG9yIHJlcXVlc3QgXCJod19hZGRyX2hpXCIgZmFpbGVkXG4iKTsKLQkJCXJldHVybiAtMTsKKwkJCXJldHVybiAtRUZBVUxUOwogCQl9CiAKIAkJaWYgKGRyY2lfcmRfcmVnKHVzYl9kZXZpY2UsIERSQ0lfUkVHX0hXX0FERFJfTUksICZtaSkgPCAwKSB7CiAJCQlkZXZfZXJyKGRldiwgIlZlbmRvciByZXF1ZXN0IFwiaHdfYWRkcl9taWRcIiBmYWlsZWRcbiIpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KIAogCQlpZiAoZHJjaV9yZF9yZWcodXNiX2RldmljZSwgRFJDSV9SRUdfSFdfQUREUl9MTywgJmxvKSA8IDApIHsKIAkJCWRldl9lcnIoZGV2LCAiVmVuZG9yIHJlcXVlc3QgXCJod19hZGRyX2xvd1wiIGZhaWxlZFxuIik7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQogCiAJCW11dGV4X2xvY2soJm1kZXYtPmlvX211dGV4KTsKQEAgLTgzMiw3ICs3NzgsNyBAQAogCiAJaWYgKGRyY2lfcmRfcmVnKHVzYl9kZXZpY2UsIERSQ0lfUkVHX05JX1NUQVRFLCAmbGluaykgPCAwKSB7CiAJCWRldl9lcnIoZGV2LCAiVmVuZG9yIHJlcXVlc3QgXCJsaW5rIHN0YXR1c1wiIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCiAJbXV0ZXhfbG9jaygmbWRldi0+aW9fbXV0ZXgpOwpAQCAtODg2LDI1ICs4MzIsMjIgQEAKICAqLwogc3RhdGljIHZvaWQgd3FfbmV0aW5mbyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndxX29iaikKIHsKLQlzdHJ1Y3QgbW9zdF9kZXYgKm1kZXY7Ci0JaW50IGksIHByZXZfbGlua19zdGF0OworCXN0cnVjdCBtb3N0X2RldiAqbWRldiA9IHRvX21kZXZfZnJvbV93b3JrKHdxX29iaik7CisJaW50IGksIHByZXZfbGlua19zdGF0ID0gbWRldi0+bGlua19zdGF0OwogCXU4IHByZXZfaHdfYWRkcls2XTsKIAotCW1kZXYgPSB0b19tZGV2X2Zyb21fd29yayh3cV9vYmopOwotCXByZXZfbGlua19zdGF0ID0gbWRldi0+bGlua19zdGF0OwotCiAJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKIAkJcHJldl9od19hZGRyW2ldID0gbWRldi0+aHdfYWRkcltpXTsKIAogCWlmIChoZG1fdXBkYXRlX25ldGluZm8obWRldikgPCAwKQogCQlyZXR1cm47Ci0JaWYgKChwcmV2X2xpbmtfc3RhdCAhPSBtZGV2LT5saW5rX3N0YXQpIHx8Ci0JICAgIChwcmV2X2h3X2FkZHJbMF0gIT0gbWRldi0+aHdfYWRkclswXSkgfHwKLQkgICAgKHByZXZfaHdfYWRkclsxXSAhPSBtZGV2LT5od19hZGRyWzFdKSB8fAotCSAgICAocHJldl9od19hZGRyWzJdICE9IG1kZXYtPmh3X2FkZHJbMl0pIHx8Ci0JICAgIChwcmV2X2h3X2FkZHJbM10gIT0gbWRldi0+aHdfYWRkclszXSkgfHwKLQkgICAgKHByZXZfaHdfYWRkcls0XSAhPSBtZGV2LT5od19hZGRyWzRdKSB8fAotCSAgICAocHJldl9od19hZGRyWzVdICE9IG1kZXYtPmh3X2FkZHJbNV0pKQorCWlmIChwcmV2X2xpbmtfc3RhdCAhPSBtZGV2LT5saW5rX3N0YXQgfHwKKwkgICAgcHJldl9od19hZGRyWzBdICE9IG1kZXYtPmh3X2FkZHJbMF0gfHwKKwkgICAgcHJldl9od19hZGRyWzFdICE9IG1kZXYtPmh3X2FkZHJbMV0gfHwKKwkgICAgcHJldl9od19hZGRyWzJdICE9IG1kZXYtPmh3X2FkZHJbMl0gfHwKKwkgICAgcHJldl9od19hZGRyWzNdICE9IG1kZXYtPmh3X2FkZHJbM10gfHwKKwkgICAgcHJldl9od19hZGRyWzRdICE9IG1kZXYtPmh3X2FkZHJbNF0gfHwKKwkgICAgcHJldl9od19hZGRyWzVdICE9IG1kZXYtPmh3X2FkZHJbNV0pCiAJCW1vc3RfZGVsaXZlcl9uZXRpbmZvKCZtZGV2LT5pZmFjZSwgbWRldi0+bGlua19zdGF0LAogCQkJCSAgICAgJm1kZXYtPmh3X2FkZHJbMF0pOwogfQpAQCAtOTE3LDMzICs4NjAsMjAgQEAKICAqLwogc3RhdGljIHZvaWQgd3FfY2xlYXJfaGFsdChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndxX29iaikKIHsKLQlzdHJ1Y3QgYnVmX2FuY2hvciAqYW5jaG9yOwotCXN0cnVjdCBtb3N0X2RldiAqbWRldjsKLQlzdHJ1Y3QgbWJvICptYm87Ci0Jc3RydWN0IHVyYiAqdXJiOwotCXVuc2lnbmVkIGludCBjaGFubmVsOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGNsZWFyX2hvbGRfd29yayAqY2xlYXJfd29yayA9IHRvX2NsZWFyX2hvbGRfd29yayh3cV9vYmopOworCXN0cnVjdCBtb3N0X2RldiAqbWRldiA9IGNsZWFyX3dvcmstPm1kZXY7CisJdW5zaWduZWQgaW50IGNoYW5uZWwgPSBjbGVhcl93b3JrLT5jaGFubmVsOworCWludCBwaXBlID0gY2xlYXJfd29yay0+cGlwZTsKIAotCWFuY2hvciA9IHRvX2J1Zl9hbmNob3Iod3Ffb2JqKTsKLQl1cmIgPSBhbmNob3ItPnVyYjsKLQltYm8gPSB1cmItPmNvbnRleHQ7Ci0JbWRldiA9IHRvX21kZXYobWJvLT5pZnApOwotCWNoYW5uZWwgPSBtYm8tPmhkbV9jaGFubmVsX2lkOwotCi0JaWYgKHVzYl9jbGVhcl9oYWx0KHVyYi0+ZGV2LCB1cmItPnBpcGUpKQorCW11dGV4X2xvY2soJm1kZXYtPmlvX211dGV4KTsKKwltb3N0X3N0b3BfZW5xdWV1ZSgmbWRldi0+aWZhY2UsIGNoYW5uZWwpOworCWZyZWVfYW5jaG9yZWRfYnVmZmVycyhtZGV2LCBjaGFubmVsLCBNQk9fRV9JTlZBTCk7CisJaWYgKHVzYl9jbGVhcl9oYWx0KG1kZXYtPnVzYl9kZXZpY2UsIHBpcGUpKQogCQlkZXZfd2FybigmbWRldi0+dXNiX2RldmljZS0+ZGV2LCAiRmFpbGVkIHRvIHJlc2V0IGVuZHBvaW50LlxuIik7CiAKLQl1c2JfZnJlZV91cmIodXJiKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+YW5jaG9yX2xpc3RfbG9ja1tjaGFubmVsXSwgZmxhZ3MpOwotCWxpc3RfZGVsKCZhbmNob3ItPmxpc3QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPmFuY2hvcl9saXN0X2xvY2tbY2hhbm5lbF0sIGZsYWdzKTsKLQotCWlmIChsaWtlbHkobWJvLT5jb21wbGV0ZSkpCi0JCW1iby0+Y29tcGxldGUobWJvKTsKLQlpZiAobWRldi0+Y29uZltjaGFubmVsXS5kaXJlY3Rpb24gJiBNT1NUX0NIX1RYKQotCQltb3N0X3Jlc3VtZV9lbnF1ZXVlKCZtZGV2LT5pZmFjZSwgY2hhbm5lbCk7Ci0KLQlrZnJlZShhbmNob3IpOworCW1kZXYtPmlzX2NoYW5uZWxfaGVhbHRoeVtjaGFubmVsXSA9IHRydWU7CisJbW9zdF9yZXN1bWVfZW5xdWV1ZSgmbWRldi0+aWZhY2UsIGNoYW5uZWwpOworCW11dGV4X3VubG9jaygmbWRldi0+aW9fbXV0ZXgpOwogfQogCiAvKioKQEAgLTk1OCw3ICs4ODgsOSBAQAogICovCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdXNiaWRbXSA9IHsKIAl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9TTVNDLCBVU0JfREVWX0lEX0JSREcpLCB9LAotCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1NNU0MsIFVTQl9ERVZfSURfSU5JQyksIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfU01TQywgVVNCX0RFVl9JRF9PUzgxMTE4KSwgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9TTVNDLCBVU0JfREVWX0lEX09TODExMTkpLCB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1NNU0MsIFVTQl9ERVZfSURfT1M4MTIxMCksIH0sCiAJeyB9IC8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogCkBAIC05NzAsNiArOTAyLDEwIEBACiAJc3RydWN0IG1vc3RfZGNpX2F0dHJpYnV0ZSBtb3N0X2RjaV9hdHRyXyMjX25hbWUgPSBcCiAJCV9fQVRUUihfbmFtZSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdmFsdWUsIHN0b3JlX3ZhbHVlKQogCisjZGVmaW5lIE1PU1RfRENJX1dPX0FUVFIoX25hbWUpIFwKKwlzdHJ1Y3QgbW9zdF9kY2lfYXR0cmlidXRlIG1vc3RfZGNpX2F0dHJfIyNfbmFtZSA9IFwKKwkJX19BVFRSKF9uYW1lLCBTX0lXVVNSLCBOVUxMLCBzdG9yZV92YWx1ZSkKKwogLyoqCiAgKiBzdHJ1Y3QgbW9zdF9kY2lfYXR0cmlidXRlIC0gdG8gYWNjZXNzIHRoZSBhdHRyaWJ1dGVzIG9mIGEgZGNpIG9iamVjdAogICogQGF0dHI6IGF0dHJpYnV0ZXMgb2YgYSBkY2kgb2JqZWN0CkBAIC0xMDQ2LDQ1ICs5ODIsNjggQEAKIAlrZnJlZShkY2lfb2JqKTsKIH0KIAorc3RydWN0IHJlZ3MgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdTE2IHJlZzsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVncyByb19yZWdzW10gPSB7CisJeyAibmlfc3RhdGUiLCBEUkNJX1JFR19OSV9TVEFURSB9LAorCXsgInBhY2tldF9iYW5kd2lkdGgiLCBEUkNJX1JFR19QQUNLRVRfQlcgfSwKKwl7ICJub2RlX2FkZHJlc3MiLCBEUkNJX1JFR19OT0RFX0FERFIgfSwKKwl7ICJub2RlX3Bvc2l0aW9uIiwgRFJDSV9SRUdfTk9ERV9QT1MgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVncyByd19yZWdzW10gPSB7CisJeyAibWVwX2ZpbHRlciIsIERSQ0lfUkVHX01FUF9GSUxURVIgfSwKKwl7ICJtZXBfaGFzaDAiLCBEUkNJX1JFR19IQVNIX1RCTDAgfSwKKwl7ICJtZXBfaGFzaDEiLCBEUkNJX1JFR19IQVNIX1RCTDEgfSwKKwl7ICJtZXBfaGFzaDIiLCBEUkNJX1JFR19IQVNIX1RCTDIgfSwKKwl7ICJtZXBfaGFzaDMiLCBEUkNJX1JFR19IQVNIX1RCTDMgfSwKKwl7ICJtZXBfZXVpNDhfaGkiLCBEUkNJX1JFR19IV19BRERSX0hJIH0sCisJeyAibWVwX2V1aTQ4X21pIiwgRFJDSV9SRUdfSFdfQUREUl9NSSB9LAorCXsgIm1lcF9ldWk0OF9sbyIsIERSQ0lfUkVHX0hXX0FERFJfTE8gfSwKK307CisKK3N0YXRpYyBpbnQgZ2V0X3N0YXRfcmVnX2FkZHIoY29uc3Qgc3RydWN0IHJlZ3MgKnJlZ3MsIGludCBzaXplLAorCQkJICAgICBjb25zdCBjaGFyICpuYW1lLCB1MTYgKnJlZ19hZGRyKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQlpZiAoIXN0cmNtcChuYW1lLCByZWdzW2ldLm5hbWUpKSB7CisJCQkqcmVnX2FkZHIgPSByZWdzW2ldLnJlZzsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtRUZBVUxUOworfQorCisjZGVmaW5lIGdldF9zdGF0aWNfcmVnX2FkZHIocmVncywgbmFtZSwgcmVnX2FkZHIpIFwKKwlnZXRfc3RhdF9yZWdfYWRkcihyZWdzLCBBUlJBWV9TSVpFKHJlZ3MpLCBuYW1lLCByZWdfYWRkcikKKwogc3RhdGljIHNzaXplX3Qgc2hvd192YWx1ZShzdHJ1Y3QgbW9zdF9kY2lfb2JqICpkY2lfb2JqLAogCQkJICBzdHJ1Y3QgbW9zdF9kY2lfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0JdTE2IHRtcF92YWw7CisJY29uc3QgY2hhciAqbmFtZSA9IGF0dHItPmF0dHIubmFtZTsKKwl1MTYgdmFsOwogCXUxNiByZWdfYWRkcjsKIAlpbnQgZXJyOwogCi0JaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAibmlfc3RhdGUiKSkKLQkJcmVnX2FkZHIgPSBEUkNJX1JFR19OSV9TVEFURTsKLQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgInBhY2tldF9iYW5kd2lkdGgiKSkKLQkJcmVnX2FkZHIgPSBEUkNJX1JFR19QQUNLRVRfQlc7Ci0JZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJub2RlX2FkZHJlc3MiKSkKLQkJcmVnX2FkZHIgPSBEUkNJX1JFR19OT0RFX0FERFI7Ci0JZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJub2RlX3Bvc2l0aW9uIikpCi0JCXJlZ19hZGRyID0gRFJDSV9SRUdfTk9ERV9QT1M7Ci0JZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJtZXBfZmlsdGVyIikpCi0JCXJlZ19hZGRyID0gRFJDSV9SRUdfTUVQX0ZJTFRFUjsKLQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgIm1lcF9oYXNoMCIpKQotCQlyZWdfYWRkciA9IERSQ0lfUkVHX0hBU0hfVEJMMDsKLQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgIm1lcF9oYXNoMSIpKQotCQlyZWdfYWRkciA9IERSQ0lfUkVHX0hBU0hfVEJMMTsKLQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgIm1lcF9oYXNoMiIpKQotCQlyZWdfYWRkciA9IERSQ0lfUkVHX0hBU0hfVEJMMjsKLQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgIm1lcF9oYXNoMyIpKQotCQlyZWdfYWRkciA9IERSQ0lfUkVHX0hBU0hfVEJMMzsKLQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgIm1lcF9ldWk0OF9oaSIpKQotCQlyZWdfYWRkciA9IERSQ0lfUkVHX0hXX0FERFJfSEk7Ci0JZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJtZXBfZXVpNDhfbWkiKSkKLQkJcmVnX2FkZHIgPSBEUkNJX1JFR19IV19BRERSX01JOwotCWVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAibWVwX2V1aTQ4X2xvIikpCi0JCXJlZ19hZGRyID0gRFJDSV9SRUdfSFdfQUREUl9MTzsKLQllbHNlCi0JCXJldHVybiAtRUlPOworCWlmICghc3RyY21wKG5hbWUsICJhcmJfYWRkcmVzcyIpKQorCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlMDR4XG4iLCBkY2lfb2JqLT5yZWdfYWRkcik7CiAKLQllcnIgPSBkcmNpX3JkX3JlZyhkY2lfb2JqLT51c2JfZGV2aWNlLCByZWdfYWRkciwgJnRtcF92YWwpOworCWlmICghc3RyY21wKG5hbWUsICJhcmJfdmFsdWUiKSkKKwkJcmVnX2FkZHIgPSBkY2lfb2JqLT5yZWdfYWRkcjsKKwllbHNlIGlmIChnZXRfc3RhdGljX3JlZ19hZGRyKHJvX3JlZ3MsIG5hbWUsICZyZWdfYWRkcikgJiYKKwkJIGdldF9zdGF0aWNfcmVnX2FkZHIocndfcmVncywgbmFtZSwgJnJlZ19hZGRyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnIgPSBkcmNpX3JkX3JlZyhkY2lfb2JqLT51c2JfZGV2aWNlLCByZWdfYWRkciwgJnZhbCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlMDR4XG4iLCB0bXBfdmFsKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlMDR4XG4iLCB2YWwpOwogfQogCiBzdGF0aWMgc3NpemVfdCBzdG9yZV92YWx1ZShzdHJ1Y3QgbW9zdF9kY2lfb2JqICpkY2lfb2JqLApAQCAtMTA5MywzMSArMTA1MiwyOCBAQAogewogCXUxNiB2YWw7CiAJdTE2IHJlZ19hZGRyOwotCWludCBlcnI7CisJY29uc3QgY2hhciAqbmFtZSA9IGF0dHItPmF0dHIubmFtZTsKKwlpbnQgZXJyID0ga3N0cnRvdTE2KGJ1ZiwgMTYsICZ2YWwpOwogCi0JaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAibWVwX2ZpbHRlciIpKQotCQlyZWdfYWRkciA9IERSQ0lfUkVHX01FUF9GSUxURVI7Ci0JZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJtZXBfaGFzaDAiKSkKLQkJcmVnX2FkZHIgPSBEUkNJX1JFR19IQVNIX1RCTDA7Ci0JZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJtZXBfaGFzaDEiKSkKLQkJcmVnX2FkZHIgPSBEUkNJX1JFR19IQVNIX1RCTDE7Ci0JZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJtZXBfaGFzaDIiKSkKLQkJcmVnX2FkZHIgPSBEUkNJX1JFR19IQVNIX1RCTDI7Ci0JZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJtZXBfaGFzaDMiKSkKLQkJcmVnX2FkZHIgPSBEUkNJX1JFR19IQVNIX1RCTDM7Ci0JZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJtZXBfZXVpNDhfaGkiKSkKLQkJcmVnX2FkZHIgPSBEUkNJX1JFR19IV19BRERSX0hJOwotCWVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAibWVwX2V1aTQ4X21pIikpCi0JCXJlZ19hZGRyID0gRFJDSV9SRUdfSFdfQUREUl9NSTsKLQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgIm1lcF9ldWk0OF9sbyIpKQotCQlyZWdfYWRkciA9IERSQ0lfUkVHX0hXX0FERFJfTE87Ci0JZWxzZQotCQlyZXR1cm4gLUVJTzsKLQotCWVyciA9IGtzdHJ0b3UxNihidWYsIDE2LCAmdmFsKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCisJaWYgKCFzdHJjbXAobmFtZSwgImFyYl9hZGRyZXNzIikpIHsKKwkJZGNpX29iai0+cmVnX2FkZHIgPSB2YWw7CisJCXJldHVybiBjb3VudDsKKwl9CisKKwlpZiAoIXN0cmNtcChuYW1lLCAiYXJiX3ZhbHVlIikpIHsKKwkJcmVnX2FkZHIgPSBkY2lfb2JqLT5yZWdfYWRkcjsKKwl9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInN5bmNfZXAiKSkgeworCQl1MTYgZXAgPSB2YWw7CisKKwkJcmVnX2FkZHIgPSBEUkNJX1JFR19CQVNFICsgRFJDSV9DT01NQU5EICsgZXAgKiAxNjsKKwkJdmFsID0gMTsKKwl9IGVsc2UgaWYgKGdldF9zdGF0aWNfcmVnX2FkZHIocm9fcmVncywgbmFtZSwgJnJlZ19hZGRyKSkgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKIAllcnIgPSBkcmNpX3dyX3JlZyhkY2lfb2JqLT51c2JfZGV2aWNlLCByZWdfYWRkciwgdmFsKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKQEAgLTExMjksNiArMTA4NSw3IEBACiBzdGF0aWMgTU9TVF9EQ0lfUk9fQVRUUihwYWNrZXRfYmFuZHdpZHRoKTsKIHN0YXRpYyBNT1NUX0RDSV9ST19BVFRSKG5vZGVfYWRkcmVzcyk7CiBzdGF0aWMgTU9TVF9EQ0lfUk9fQVRUUihub2RlX3Bvc2l0aW9uKTsKK3N0YXRpYyBNT1NUX0RDSV9XT19BVFRSKHN5bmNfZXApOwogc3RhdGljIE1PU1RfRENJX0FUVFIobWVwX2ZpbHRlcik7CiBzdGF0aWMgTU9TVF9EQ0lfQVRUUihtZXBfaGFzaDApOwogc3RhdGljIE1PU1RfRENJX0FUVFIobWVwX2hhc2gxKTsKQEAgLTExMzcsNiArMTA5NCw4IEBACiBzdGF0aWMgTU9TVF9EQ0lfQVRUUihtZXBfZXVpNDhfaGkpOwogc3RhdGljIE1PU1RfRENJX0FUVFIobWVwX2V1aTQ4X21pKTsKIHN0YXRpYyBNT1NUX0RDSV9BVFRSKG1lcF9ldWk0OF9sbyk7CitzdGF0aWMgTU9TVF9EQ0lfQVRUUihhcmJfYWRkcmVzcyk7CitzdGF0aWMgTU9TVF9EQ0lfQVRUUihhcmJfdmFsdWUpOwogCiAvKioKICAqIG1vc3RfZGNpX2RlZl9hdHRycyAtIGFycmF5IG9mIGRlZmF1bHQgYXR0cmlidXRlIGZpbGVzIG9mIHRoZSBkY2kgb2JqZWN0CkBAIC0xMTQ2LDYgKzExMDUsNyBAQAogCSZtb3N0X2RjaV9hdHRyX3BhY2tldF9iYW5kd2lkdGguYXR0ciwKIAkmbW9zdF9kY2lfYXR0cl9ub2RlX2FkZHJlc3MuYXR0ciwKIAkmbW9zdF9kY2lfYXR0cl9ub2RlX3Bvc2l0aW9uLmF0dHIsCisJJm1vc3RfZGNpX2F0dHJfc3luY19lcC5hdHRyLAogCSZtb3N0X2RjaV9hdHRyX21lcF9maWx0ZXIuYXR0ciwKIAkmbW9zdF9kY2lfYXR0cl9tZXBfaGFzaDAuYXR0ciwKIAkmbW9zdF9kY2lfYXR0cl9tZXBfaGFzaDEuYXR0ciwKQEAgLTExNTQsNiArMTExNCw4IEBACiAJJm1vc3RfZGNpX2F0dHJfbWVwX2V1aTQ4X2hpLmF0dHIsCiAJJm1vc3RfZGNpX2F0dHJfbWVwX2V1aTQ4X21pLmF0dHIsCiAJJm1vc3RfZGNpX2F0dHJfbWVwX2V1aTQ4X2xvLmF0dHIsCisJJm1vc3RfZGNpX2F0dHJfYXJiX2FkZHJlc3MuYXR0ciwKKwkmbW9zdF9kY2lfYXR0cl9hcmJfdmFsdWUuYXR0ciwKIAlOVUxMLAogfTsKIApAQCAtMTE3NiwxMCArMTEzOCw5IEBACiBzdGF0aWMgc3RydWN0CiBtb3N0X2RjaV9vYmogKmNyZWF0ZV9tb3N0X2RjaV9vYmooc3RydWN0IGtvYmplY3QgKnBhcmVudCkKIHsKLQlzdHJ1Y3QgbW9zdF9kY2lfb2JqICptb3N0X2RjaTsKKwlzdHJ1Y3QgbW9zdF9kY2lfb2JqICptb3N0X2RjaSA9IGt6YWxsb2Moc2l6ZW9mKCptb3N0X2RjaSksIEdGUF9LRVJORUwpOwogCWludCByZXR2YWw7CiAKLQltb3N0X2RjaSA9IGt6YWxsb2Moc2l6ZW9mKCptb3N0X2RjaSksIEdGUF9LRVJORUwpOwogCWlmICghbW9zdF9kY2kpCiAJCXJldHVybiBOVUxMOwogCkBAIC0xMjE2LDIxICsxMTc3LDE3IEBACiBzdGF0aWMgaW50CiBoZG1fcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogeworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKnVzYl9pZmFjZV9kZXNjID0gaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZzsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmdXNiX2Rldi0+ZGV2OworCXN0cnVjdCBtb3N0X2RldiAqbWRldiA9IGt6YWxsb2Moc2l6ZW9mKCptZGV2KSwgR0ZQX0tFUk5FTCk7CiAJdW5zaWduZWQgaW50IGk7CiAJdW5zaWduZWQgaW50IG51bV9lbmRwb2ludHM7CiAJc3RydWN0IG1vc3RfY2hhbm5lbF9jYXBhYmlsaXR5ICp0bXBfY2FwOwotCXN0cnVjdCBtb3N0X2RldiAqbWRldjsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldjsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0Jc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqdXNiX2lmYWNlX2Rlc2M7CiAJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcF9kZXNjOwogCWludCByZXQgPSAwOwogCWludCBlcnI7CiAKLQl1c2JfaWZhY2VfZGVzYyA9IGludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmc7Ci0JdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKTsKLQlkZXYgPSAmdXNiX2Rldi0+ZGV2OwotCW1kZXYgPSBremFsbG9jKHNpemVvZigqbWRldiksIEdGUF9LRVJORUwpOwogCWlmICghbWRldikKIAkJZ290byBleGl0X0VOT01FTTsKIApAQCAtMTI3Niw5ICsxMjMzLDkgQEAKIAlpZiAoIW1kZXYtPmVwX2FkZHJlc3MpCiAJCWdvdG8gZXhpdF9mcmVlMjsKIAotCW1kZXYtPmFuY2hvcl9saXN0ID0KLQkJa2NhbGxvYyhudW1fZW5kcG9pbnRzLCBzaXplb2YoKm1kZXYtPmFuY2hvcl9saXN0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtZGV2LT5hbmNob3JfbGlzdCkKKwltZGV2LT5idXN5X3VyYnMgPQorCQlrY2FsbG9jKG51bV9lbmRwb2ludHMsIHNpemVvZigqbWRldi0+YnVzeV91cmJzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtZGV2LT5idXN5X3VyYnMpCiAJCWdvdG8gZXhpdF9mcmVlMzsKIAogCXRtcF9jYXAgPSBtZGV2LT5jYXA7CkBAIC0xMjk3LDIxICsxMjU0LDIxIEBACiAJCXRtcF9jYXAtPm51bV9idWZmZXJzX3BhY2tldCA9IEJVRl9DSEFJTl9TSVpFOwogCQl0bXBfY2FwLT5udW1fYnVmZmVyc19zdHJlYW1pbmcgPSBCVUZfQ0hBSU5fU0laRTsKIAkJdG1wX2NhcC0+ZGF0YV90eXBlID0gTU9TVF9DSF9DT05UUk9MIHwgTU9TVF9DSF9BU1lOQyB8Ci0JCQkJICAgICBNT1NUX0NIX0lTT0NfQVZQIHwgTU9TVF9DSF9TWU5DOworCQkJCSAgICAgTU9TVF9DSF9JU09DIHwgTU9TVF9DSF9TWU5DOwogCQlpZiAodXNiX2VuZHBvaW50X2Rpcl9pbihlcF9kZXNjKSkKIAkJCXRtcF9jYXAtPmRpcmVjdGlvbiA9IE1PU1RfQ0hfUlg7CiAJCWVsc2UKIAkJCXRtcF9jYXAtPmRpcmVjdGlvbiA9IE1PU1RfQ0hfVFg7CiAJCXRtcF9jYXArKzsKLQkJSU5JVF9MSVNUX0hFQUQoJm1kZXYtPmFuY2hvcl9saXN0W2ldKTsKLQkJc3Bpbl9sb2NrX2luaXQoJm1kZXYtPmFuY2hvcl9saXN0X2xvY2tbaV0pOworCQlpbml0X3VzYl9hbmNob3IoJm1kZXYtPmJ1c3lfdXJic1tpXSk7CisJCXNwaW5fbG9ja19pbml0KCZtZGV2LT5jaGFubmVsX2xvY2tbaV0pOwogCQllcnIgPSBkcmNpX3dyX3JlZyh1c2JfZGV2LAogCQkJCSAgRFJDSV9SRUdfQkFTRSArIERSQ0lfQ09NTUFORCArCiAJCQkJICBlcF9kZXNjLT5iRW5kcG9pbnRBZGRyZXNzICogMTYsCiAJCQkJICAxKTsKIAkJaWYgKGVyciA8IDApCi0JCQlwcl93YXJuKCJEQ0kgU3luYyBmb3IgRVAgJTAyeCBmYWlsZWQiLAotCQkJCWVwX2Rlc2MtPmJFbmRwb2ludEFkZHJlc3MpOworCQkJZGV2X3dhcm4oZGV2LCAiRENJIFN5bmMgZm9yIEVQICUwMnggZmFpbGVkIiwKKwkJCQkgZXBfZGVzYy0+YkVuZHBvaW50QWRkcmVzcyk7CiAJfQogCWRldl9ub3RpY2UoZGV2LCAiY2xhaW1lZCBnYWRnZXQ6IFZlbmRvcj0lNC40eCBQcm9kSUQ9JTQuNHggQnVzPSUwMnggRGV2aWNlPSUwMnhcbiIsCiAJCSAgIGxlMTZfdG9fY3B1KHVzYl9kZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLApAQCAtMTMzMiw3ICsxMjg5LDkgQEAKIAl9CiAKIAltdXRleF9sb2NrKCZtZGV2LT5pb19tdXRleCk7Ci0JaWYgKGxlMTZfdG9fY3B1KHVzYl9kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSA9PSBVU0JfREVWX0lEX0lOSUMpIHsKKwlpZiAobGUxNl90b19jcHUodXNiX2Rldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpID09IFVTQl9ERVZfSURfT1M4MTExOCB8fAorCSAgICBsZTE2X3RvX2NwdSh1c2JfZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgPT0gVVNCX0RFVl9JRF9PUzgxMTE5IHx8CisJICAgIGxlMTZfdG9fY3B1KHVzYl9kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSA9PSBVU0JfREVWX0lEX09TODEyMTApIHsKIAkJLyogdGhpcyBpbmNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIGluc3RhbmNlCiAJCSAqIG9iamVjdCBvZiB0aGUgY29yZQogCQkgKi8KQEAgLTEzNTEsNyArMTMxMCw3IEBACiAJcmV0dXJuIDA7CiAKIGV4aXRfZnJlZTQ6Ci0Ja2ZyZWUobWRldi0+YW5jaG9yX2xpc3QpOworCWtmcmVlKG1kZXYtPmJ1c3lfdXJicyk7CiBleGl0X2ZyZWUzOgogCWtmcmVlKG1kZXYtPmVwX2FkZHJlc3MpOwogZXhpdF9mcmVlMjoKQEAgLTEzNzksOSArMTMzOCw4IEBACiAgKi8KIHN0YXRpYyB2b2lkIGhkbV9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCiB7Ci0Jc3RydWN0IG1vc3RfZGV2ICptZGV2OworCXN0cnVjdCBtb3N0X2RldiAqbWRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKIAotCW1kZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CiAJbXV0ZXhfbG9jaygmbWRldi0+aW9fbXV0ZXgpOwogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKIAltZGV2LT51c2JfZGV2aWNlID0gTlVMTDsKQEAgLTEzOTMsNyArMTM1MSw3IEBACiAJZGVzdHJveV9tb3N0X2RjaV9vYmoobWRldi0+ZGNpKTsKIAltb3N0X2RlcmVnaXN0ZXJfaW50ZXJmYWNlKCZtZGV2LT5pZmFjZSk7CiAKLQlrZnJlZShtZGV2LT5hbmNob3JfbGlzdCk7CisJa2ZyZWUobWRldi0+YnVzeV91cmJzKTsKIAlrZnJlZShtZGV2LT5jYXApOwogCWtmcmVlKG1kZXYtPmNvbmYpOwogCWtmcmVlKG1kZXYtPmVwX2FkZHJlc3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21vc3QvbW9zdGNvcmUvY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL21vc3QvbW9zdGNvcmUvY29yZS5jCmluZGV4IDdjNjE5ZmUuLjMyOTEwOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L21vc3Rjb3JlL2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbW9zdC9tb3N0Y29yZS9jb3JlLmMKQEAgLTMzLDcgKzMzLDcgQEAKICNkZWZpbmUgU1RSSU5HX1NJWkUJODAKIAogc3RhdGljIHN0cnVjdCBjbGFzcyAqbW9zdF9jbGFzczsKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlICpjbGFzc19nbHVlX2RpcjsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICpjb3JlX2RldjsKIHN0YXRpYyBzdHJ1Y3QgaWRhIG1kZXZfaWQ7CiBzdGF0aWMgaW50IGR1bW15X251bV9idWZmZXJzOwogCkBAIC01MSw2ICs1MSw3IEBACiAJdTE2IGNoYW5uZWxfaWQ7CiAJYm9vbCBpc19wb2lzb25lZDsKIAlzdHJ1Y3QgbXV0ZXggc3RhcnRfbXV0ZXg7CisJc3RydWN0IG11dGV4IG5xX211dGV4OyAvKiBucSB0aHJlYWQgc3luY2hyb25pemF0aW9uICovCiAJaW50IGlzX3N0YXJ2aW5nOwogCXN0cnVjdCBtb3N0X2ludGVyZmFjZSAqaWZhY2U7CiAJc3RydWN0IG1vc3RfaW5zdF9vYmogKmluc3Q7CkBAIC04MiwxMCArODMsMTMgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewogCWludCBtb3N0X2NoX2RhdGFfdHlwZTsKIAljaGFyICpuYW1lOwotfSBjaF9kYXRhX3R5cGVbXSA9IHsgeyBNT1NUX0NIX0NPTlRST0wsICJjb250cm9sXG4iIH0sCit9IGNoX2RhdGFfdHlwZVtdID0geworCXsgTU9TVF9DSF9DT05UUk9MLCAiY29udHJvbFxuIiB9LAogCXsgTU9TVF9DSF9BU1lOQywgImFzeW5jXG4iIH0sCiAJeyBNT1NUX0NIX1NZTkMsICJzeW5jXG4iIH0sCi0JeyBNT1NUX0NIX0lTT0NfQVZQLCAiaXNvY19hdnBcbiJ9IH07CisJeyBNT1NUX0NIX0lTT0MsICJpc29jXG4ifSwKKwl7IE1PU1RfQ0hfSVNPQywgImlzb2NfYXZwXG4ifSwKK307CiAKICNkZWZpbmUgdG9faW5zdF9vYmooZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBtb3N0X2luc3Rfb2JqLCBrb2JqKQogCkBAIC0yNjAsMTEgKzI2NCwxMSBAQAogCiAJc3RyY3B5KGJ1ZiwgIiIpOwogCWlmIChjLT5pZmFjZS0+Y2hhbm5lbF92ZWN0b3JbaV0uZGlyZWN0aW9uICYgTU9TVF9DSF9SWCkKLQkJc3RyY2F0KGJ1ZiwgImRpcl9yeCAiKTsKKwkJc3RyY2F0KGJ1ZiwgInJ4ICIpOwogCWlmIChjLT5pZmFjZS0+Y2hhbm5lbF92ZWN0b3JbaV0uZGlyZWN0aW9uICYgTU9TVF9DSF9UWCkKLQkJc3RyY2F0KGJ1ZiwgImRpcl90eCAiKTsKKwkJc3RyY2F0KGJ1ZiwgInR4ICIpOwogCXN0cmNhdChidWYsICJcbiIpOwotCXJldHVybiBzdHJsZW4oYnVmKSArIDE7CisJcmV0dXJuIHN0cmxlbihidWYpOwogfQogCiBzdGF0aWMgc3NpemVfdCBzaG93X2F2YWlsYWJsZV9kYXRhdHlwZXMoc3RydWN0IG1vc3RfY19vYmogKmMsCkBAIC0yODAsMTAgKzI4NCwxMCBAQAogCQlzdHJjYXQoYnVmLCAiYXN5bmMgIik7CiAJaWYgKGMtPmlmYWNlLT5jaGFubmVsX3ZlY3RvcltpXS5kYXRhX3R5cGUgJiBNT1NUX0NIX1NZTkMpCiAJCXN0cmNhdChidWYsICJzeW5jICIpOwotCWlmIChjLT5pZmFjZS0+Y2hhbm5lbF92ZWN0b3JbaV0uZGF0YV90eXBlICYgTU9TVF9DSF9JU09DX0FWUCkKLQkJc3RyY2F0KGJ1ZiwgImlzb2NfYXZwICIpOworCWlmIChjLT5pZmFjZS0+Y2hhbm5lbF92ZWN0b3JbaV0uZGF0YV90eXBlICYgTU9TVF9DSF9JU09DKQorCQlzdHJjYXQoYnVmLCAiaXNvYyAiKTsKIAlzdHJjYXQoYnVmLCAiXG4iKTsKLQlyZXR1cm4gc3RybGVuKGJ1ZikgKyAxOworCXJldHVybiBzdHJsZW4oYnVmKTsKIH0KIAogc3RhdGljCkBAIC0zOTEsOSArMzk1LDkgQEAKIAkJCQkgIGNoYXIgKmJ1ZikKIHsKIAlpZiAoYy0+Y2ZnLmRpcmVjdGlvbiAmIE1PU1RfQ0hfVFgpCi0JCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgImRpcl90eFxuIik7CisJCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgInR4XG4iKTsKIAllbHNlIGlmIChjLT5jZmcuZGlyZWN0aW9uICYgTU9TVF9DSF9SWCkKLQkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiZGlyX3J4XG4iKTsKKwkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAicnhcbiIpOwogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgInVuY29uZmlndXJlZFxuIik7CiB9CiAKQEAgLTQwNCw4ICs0MDgsMTIgQEAKIHsKIAlpZiAoIXN0cmNtcChidWYsICJkaXJfcnhcbiIpKSB7CiAJCWMtPmNmZy5kaXJlY3Rpb24gPSBNT1NUX0NIX1JYOworCX0gZWxzZSBpZiAoIXN0cmNtcChidWYsICJyeFxuIikpIHsKKwkJYy0+Y2ZnLmRpcmVjdGlvbiA9IE1PU1RfQ0hfUlg7CiAJfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgImRpcl90eFxuIikpIHsKIAkJYy0+Y2ZnLmRpcmVjdGlvbiA9IE1PU1RfQ0hfVFg7CisJfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgInR4XG4iKSkgeworCQljLT5jZmcuZGlyZWN0aW9uID0gTU9TVF9DSF9UWDsKIAl9IGVsc2UgewogCQlwcl9pbmZvKCJXQVJOOiBpbnZhbGlkIGF0dHJpYnV0ZSBzZXR0aW5nc1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtODQ3LDcgKzg1NSwyMyBAQAogCQkJICAgICBzdHJ1Y3QgbW9zdF9haW1fYXR0cmlidXRlICphdHRyLAogCQkJICAgICBjaGFyICpidWYpCiB7Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGFpbV9vYmotPmFkZF9saW5rKTsKKwlzdHJ1Y3QgbW9zdF9jX29iaiAqYzsKKwlzdHJ1Y3QgbW9zdF9pbnN0X29iaiAqaTsKKwlpbnQgb2ZmcyA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksICZpbnN0YW5jZV9saXN0LCBsaXN0KSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJmktPmNoYW5uZWxfbGlzdCwgbGlzdCkgeworCQkJaWYgKGMtPmFpbTAucHRyID09IGFpbV9vYmotPmRyaXZlciB8fAorCQkJICAgIGMtPmFpbTEucHRyID09IGFpbV9vYmotPmRyaXZlcikgeworCQkJCW9mZnMgKz0gc25wcmludGYoYnVmICsgb2ZmcywgUEFHRV9TSVpFIC0gb2ZmcywKKwkJCQkJCSAiJXM6JXNcbiIsCisJCQkJCQkga29iamVjdF9uYW1lKCZpLT5rb2JqKSwKKwkJCQkJCSBrb2JqZWN0X25hbWUoJmMtPmtvYmopKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBvZmZzOwogfQogCiAvKioKQEAgLTExMzEsMTggKzExNTUsMTggQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjLT5maWZvX2xvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHN0cnVjdCBtYm8gKmdldF9oZG1fbWJvKHN0cnVjdCBtb3N0X2Nfb2JqICpjKQorc3RhdGljIGJvb2wgaGRtX21ib19yZWFkeShzdHJ1Y3QgbW9zdF9jX29iaiAqYykKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBtYm8gKm1ibzsKKwlib29sIGVtcHR5OwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmMtPmZpZm9fbG9jaywgZmxhZ3MpOwotCWlmIChjLT5lbnF1ZXVlX2hhbHQgfHwgbGlzdF9lbXB0eSgmYy0+aGFsdF9maWZvKSkKLQkJbWJvID0gTlVMTDsKLQllbHNlCi0JCW1ibyA9IGxpc3RfcG9wX21ibygmYy0+aGFsdF9maWZvKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjLT5maWZvX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gbWJvOworCWlmIChjLT5lbnF1ZXVlX2hhbHQpCisJCXJldHVybiBmYWxzZTsKKworCXNwaW5fbG9ja19pcnEoJmMtPmZpZm9fbG9jayk7CisJZW1wdHkgPSBsaXN0X2VtcHR5KCZjLT5oYWx0X2ZpZm8pOworCXNwaW5fdW5sb2NrX2lycSgmYy0+Zmlmb19sb2NrKTsKKworCXJldHVybiAhZW1wdHk7CiB9CiAKIHN0YXRpYyB2b2lkIG5xX2hkbV9tYm8oc3RydWN0IG1ibyAqbWJvKQpAQCAtMTE2MCwyMCArMTE4NCwzMiBAQAogewogCXN0cnVjdCBtb3N0X2Nfb2JqICpjID0gZGF0YTsKIAlzdHJ1Y3QgbWJvICptYm87CisJaW50IHJldDsKIAl0eXBlb2YoYy0+aWZhY2UtPmVucXVldWUpIGVucXVldWUgPSBjLT5pZmFjZS0+ZW5xdWV1ZTsKIAogCXdoaWxlIChsaWtlbHkoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkpIHsKIAkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGMtPmhkbV9maWZvX3dxLAotCQkJCQkgKG1ibyA9IGdldF9oZG1fbWJvKGMpKSB8fAorCQkJCQkgaGRtX21ib19yZWFkeShjKSB8fAogCQkJCQkga3RocmVhZF9zaG91bGRfc3RvcCgpKTsKIAotCQlpZiAodW5saWtlbHkoIW1ibykpCisJCW11dGV4X2xvY2soJmMtPm5xX211dGV4KTsKKwkJc3Bpbl9sb2NrX2lycSgmYy0+Zmlmb19sb2NrKTsKKwkJaWYgKHVubGlrZWx5KGMtPmVucXVldWVfaGFsdCB8fCBsaXN0X2VtcHR5KCZjLT5oYWx0X2ZpZm8pKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxKCZjLT5maWZvX2xvY2spOworCQkJbXV0ZXhfdW5sb2NrKCZjLT5ucV9tdXRleCk7CiAJCQljb250aW51ZTsKKwkJfQorCisJCW1ibyA9IGxpc3RfcG9wX21ibygmYy0+aGFsdF9maWZvKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjLT5maWZvX2xvY2spOwogCiAJCWlmIChjLT5jZmcuZGlyZWN0aW9uID09IE1PU1RfQ0hfUlgpCiAJCQltYm8tPmJ1ZmZlcl9sZW5ndGggPSBjLT5jZmcuYnVmZmVyX3NpemU7CiAKLQkJaWYgKHVubGlrZWx5KGVucXVldWUobWJvLT5pZnAsIG1iby0+aGRtX2NoYW5uZWxfaWQsIG1ibykpKSB7CisJCXJldCA9IGVucXVldWUobWJvLT5pZnAsIG1iby0+aGRtX2NoYW5uZWxfaWQsIG1ibyk7CisJCW11dGV4X3VubG9jaygmYy0+bnFfbXV0ZXgpOworCisJCWlmICh1bmxpa2VseShyZXQpKSB7CiAJCQlwcl9lcnIoImhkbSBlbnF1ZXVlIGZhaWxlZFxuIik7CiAJCQlucV9oZG1fbWJvKG1ibyk7CiAJCQljLT5oZG1fZW5xdWV1ZV90YXNrID0gTlVMTDsKQEAgLTEyOTQsMTcgKzEzMzAsMTQgQEAKIC8qKgogICogbW9zdF9zdWJtaXRfbWJvIC0gc3VibWl0cyBhbiBNQk8gdG8gZmlmbwogICogQG1ibzogcG9pbnRlciB0byB0aGUgTUJPCi0gKgogICovCi1pbnQgbW9zdF9zdWJtaXRfbWJvKHN0cnVjdCBtYm8gKm1ibykKK3ZvaWQgbW9zdF9zdWJtaXRfbWJvKHN0cnVjdCBtYm8gKm1ibykKIHsKLQlpZiAodW5saWtlbHkoKCFtYm8pIHx8ICghbWJvLT5jb250ZXh0KSkpIHsKLQkJcHJfZXJyKCJCYWQgTUJPIG9yIG1pc3NpbmcgY2hhbm5lbCByZWZlcmVuY2VcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisJaWYgKFdBUk5fT05DRSghbWJvIHx8ICFtYm8tPmNvbnRleHQsCisJCSAgICAgICJiYWQgbWJvIG9yIG1pc3NpbmcgY2hhbm5lbCByZWZlcmVuY2VcbiIpKQorCQlyZXR1cm47CiAKIAlucV9oZG1fbWJvKG1ibyk7Ci0JcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtb3N0X3N1Ym1pdF9tYm8pOwogCkBAIC0xNDY4LDEwICsxNTAxLDggQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmIChhdG9taWNfc3ViX2FuZF90ZXN0KDEsICZjLT5tYm9fbnFfbGV2ZWwpKSB7Ci0JCXByX2luZm8oIldBUk46IHJ4IGRldmljZSBvdXQgb2YgYnVmZmVyc1xuIik7CisJaWYgKGF0b21pY19zdWJfYW5kX3Rlc3QoMSwgJmMtPm1ib19ucV9sZXZlbCkpCiAJCWMtPmlzX3N0YXJ2aW5nID0gMTsKLQl9CiAKIAlpZiAoYy0+YWltMC5yZWZzICYmIGMtPmFpbTAucHRyLT5yeF9jb21wbGV0aW9uICYmCiAJICAgIGMtPmFpbTAucHRyLT5yeF9jb21wbGV0aW9uKG1ibykgPT0gMCkKQEAgLTE3NjEsNiArMTc5Miw3IEBACiAJCWluaXRfY29tcGxldGlvbigmYy0+Y2xlYW51cCk7CiAJCWF0b21pY19zZXQoJmMtPm1ib19yZWYsIDApOwogCQltdXRleF9pbml0KCZjLT5zdGFydF9tdXRleCk7CisJCW11dGV4X2luaXQoJmMtPm5xX211dGV4KTsKIAkJbGlzdF9hZGRfdGFpbCgmYy0+bGlzdCwgJmluc3QtPmNoYW5uZWxfbGlzdCk7CiAJfQogCXByX2luZm8oInJlZ2lzdGVyZWQgbmV3IE1PU1QgZGV2aWNlIG1kZXYlZCAoJXMpXG4iLApAQCAtMTgyNiw4ICsxODU4LDEyIEBACiB7CiAJc3RydWN0IG1vc3RfY19vYmogKmMgPSBnZXRfY2hhbm5lbF9ieV9pZmFjZShpZmFjZSwgaWQpOwogCi0JaWYgKGxpa2VseShjKSkKLQkJYy0+ZW5xdWV1ZV9oYWx0ID0gdHJ1ZTsKKwlpZiAoIWMpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmMtPm5xX211dGV4KTsKKwljLT5lbnF1ZXVlX2hhbHQgPSB0cnVlOworCW11dGV4X3VubG9jaygmYy0+bnFfbXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobW9zdF9zdG9wX2VucXVldWUpOwogCkBAIC0xODQzLDkgKzE4NzksMTIgQEAKIHsKIAlzdHJ1Y3QgbW9zdF9jX29iaiAqYyA9IGdldF9jaGFubmVsX2J5X2lmYWNlKGlmYWNlLCBpZCk7CiAKLQlpZiAodW5saWtlbHkoIWMpKQorCWlmICghYykKIAkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmYy0+bnFfbXV0ZXgpOwogCWMtPmVucXVldWVfaGFsdCA9IGZhbHNlOworCW11dGV4X3VubG9jaygmYy0+bnFfbXV0ZXgpOwogCiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjLT5oZG1fZmlmb193cSk7CiB9CkBAIC0xODc5LDIyICsxOTE4LDE5IEBACiAJCWdvdG8gZXhpdF9jbGFzczsKIAl9CiAKLQljbGFzc19nbHVlX2RpciA9Ci0JCWRldmljZV9jcmVhdGUobW9zdF9jbGFzcywgTlVMTCwgMCwgTlVMTCwgIm1vc3Rjb3JlIik7Ci0JaWYgKElTX0VSUihjbGFzc19nbHVlX2RpcikpIHsKLQkJZXJyID0gUFRSX0VSUihjbGFzc19nbHVlX2Rpcik7CisJY29yZV9kZXYgPSBkZXZpY2VfY3JlYXRlKG1vc3RfY2xhc3MsIE5VTEwsIDAsIE5VTEwsICJtb3N0Y29yZSIpOworCWlmIChJU19FUlIoY29yZV9kZXYpKSB7CisJCWVyciA9IFBUUl9FUlIoY29yZV9kZXYpOwogCQlnb3RvIGV4aXRfZHJpdmVyOwogCX0KIAotCW1vc3RfYWltX2tzZXQgPQotCQlrc2V0X2NyZWF0ZV9hbmRfYWRkKCJhaW1zIiwgTlVMTCwgJmNsYXNzX2dsdWVfZGlyLT5rb2JqKTsKKwltb3N0X2FpbV9rc2V0ID0ga3NldF9jcmVhdGVfYW5kX2FkZCgiYWltcyIsIE5VTEwsICZjb3JlX2Rldi0+a29iaik7CiAJaWYgKCFtb3N0X2FpbV9rc2V0KSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXhpdF9jbGFzc19jb250YWluZXI7CiAJfQogCi0JbW9zdF9pbnN0X2tzZXQgPQotCQlrc2V0X2NyZWF0ZV9hbmRfYWRkKCJkZXZpY2VzIiwgTlVMTCwgJmNsYXNzX2dsdWVfZGlyLT5rb2JqKTsKKwltb3N0X2luc3Rfa3NldCA9IGtzZXRfY3JlYXRlX2FuZF9hZGQoImRldmljZXMiLCBOVUxMLCAmY29yZV9kZXYtPmtvYmopOwogCWlmICghbW9zdF9pbnN0X2tzZXQpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBleGl0X2RyaXZlcl9rc2V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21vc3QvbW9zdGNvcmUvbW9zdGNvcmUuaCBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L21vc3Rjb3JlL21vc3Rjb3JlLmgKaW5kZXggNjBlMDE4ZS4uNWY4MzM5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21vc3QvbW9zdGNvcmUvbW9zdGNvcmUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbW9zdC9tb3N0Y29yZS9tb3N0Y29yZS5oCkBAIC01Niw3ICs1Niw3IEBACiBlbnVtIG1vc3RfY2hhbm5lbF9kYXRhX3R5cGUgewogCU1PU1RfQ0hfQ09OVFJPTCA9IDEgPDwgMCwKIAlNT1NUX0NIX0FTWU5DID0gMSA8PCAxLAotCU1PU1RfQ0hfSVNPQ19BVlAgPSAxIDw8IDIsCisJTU9TVF9DSF9JU09DID0gMSA8PCAyLAogCU1PU1RfQ0hfU1lOQyA9IDEgPDwgNSwKIH07CiAKQEAgLTExMiw3ICsxMTIsNyBAQAogCXUxNiBidWZmZXJfc2l6ZV9wYWNrZXQ7CiAJdTE2IG51bV9idWZmZXJzX3N0cmVhbWluZzsKIAl1MTYgYnVmZmVyX3NpemVfc3RyZWFtaW5nOwotCWNoYXIgKm5hbWVfc3VmZml4OworCWNvbnN0IGNoYXIgKm5hbWVfc3VmZml4OwogfTsKIAogLyoqCkBAIC0yODcsNyArMjg3LDcgQEAKICAqIEBpbnRmX2luc3RhbmNlIFBvaW50ZXIgdG8gdGhlIGludGVyZmFjZSBpbnN0YW5jZSBkZXNjcmlwdGlvbi4KICAqLwogdm9pZCBtb3N0X2RlcmVnaXN0ZXJfaW50ZXJmYWNlKHN0cnVjdCBtb3N0X2ludGVyZmFjZSAqaWZhY2UpOwotaW50IG1vc3Rfc3VibWl0X21ibyhzdHJ1Y3QgbWJvICptYm8pOwordm9pZCBtb3N0X3N1Ym1pdF9tYm8oc3RydWN0IG1ibyAqbWJvKTsKIAogLyoqCiAgKiBtb3N0X3N0b3BfZW5xdWV1ZSAtIHByZXZlbnRzIGNvcmUgZnJvbSBlbnF1ZWluZyBNQk9zCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbmV0bG9naWMveGxyX25ldC5jIGIvZHJpdmVycy9zdGFnaW5nL25ldGxvZ2ljL3hscl9uZXQuYwppbmRleCA5OTQ0NWQwLi41NTJhN2RjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbmV0bG9naWMveGxyX25ldC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9uZXRsb2dpYy94bHJfbmV0LmMKQEAgLTE5Miw3ICsxOTIsNyBAQAogCXJldHVybiBwaHlfZXRodG9vbF9zc2V0KHBoeWRldiwgZWNtZCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgeGxyX2V0aHRvb2xfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyB4bHJfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9zZXR0aW5ncyA9IHhscl9nZXRfc2V0dGluZ3MsCiAJLnNldF9zZXR0aW5ncyA9IHhscl9zZXRfc2V0dGluZ3MsCiB9OwpAQCAtMjY5LDE2ICsyNjksNiBAQAogCW1zZy0+bXNnMyA9IDA7CiB9CiAKLXN0YXRpYyB2b2lkIF9fbWF5YmVfdW51c2VkIHhscl93YWtldXBfcXVldWUodW5zaWduZWQgbG9uZyBkZXYpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXY7Ci0Jc3RydWN0IHhscl9uZXRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSB4bHJfZ2V0X3BoeWRldihwcml2KTsKLQotCWlmIChwaHlkZXYtPmxpbmspCi0JCW5ldGlmX3R4X3dha2VfcXVldWUobmV0ZGV2X2dldF90eF9xdWV1ZShuZGV2LCBwcml2LT53YWtldXBfcSkpOwotfQotCiBzdGF0aWMgbmV0ZGV2X3R4X3QgeGxyX25ldF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7CkBAIC00MTMsNyArNDAzLDcgQEAKIAlyZXR1cm4gc3RhdHM7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgeGxyX25ldGRldl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHhscl9uZXRkZXZfb3BzID0gewogCS5uZG9fb3BlbiA9IHhscl9uZXRfb3BlbiwKIAkubmRvX3N0b3AgPSB4bHJfbmV0X3N0b3AsCiAJLm5kb19zdGFydF94bWl0ID0geGxyX25ldF9zdGFydF94bWl0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi11c2IvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24tdXNiL0tjb25maWcKaW5kZXggMTZlYTE3Zi4uMGI4ZjFkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi11c2IvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uLXVzYi9LY29uZmlnCkBAIC02LDUgKzYsNSBAQAogCSAgTmV0d29ya3MnIHByb2R1Y3RzIGluIHRoZSBPY3Rlb24gZmFtaWx5LgogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBUaGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBvY3Rlb24tdXNiLgorCSAgd2lsbCBiZSBjYWxsZWQgb2N0ZW9uLWhjZC4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi11c2Ivb2N0ZW9uLWhjZC5jIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi11c2Ivb2N0ZW9uLWhjZC5jCmluZGV4IDE3NDQyYjMuLjlhNzg1OGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24tdXNiL29jdGVvbi1oY2QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uLXVzYi9vY3Rlb24taGNkLmMKQEAgLTMyOTIsNyArMzI5Miw2IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnVzYi0+bG9jaywgZmxhZ3MpOwogCXBvcnRfc3RhdHVzID0gY3ZteF91c2JfZ2V0X3N0YXR1cyh1c2IpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVzYi0+bG9jaywgZmxhZ3MpOwotCWJ1ZlswXSA9IDA7CiAJYnVmWzBdID0gcG9ydF9zdGF0dXMuY29ubmVjdF9jaGFuZ2UgPDwgMTsKIAogCXJldHVybiBidWZbMF0gIT0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtbWRpby5jIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1tZGlvLmMKaW5kZXggZTEzYTRhYi4uNjkxZTRhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1tZGlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1tZGlvLmMKQEAgLTM0LDQ4ICszNCwyMyBAQAogCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sICJCdWlsdGluIiwgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CiB9CiAKLXN0YXRpYyBpbnQgY3ZtX29jdF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCi17Ci0Jc3RydWN0IG9jdGVvbl9ldGhlcm5ldCAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlpZiAocHJpdi0+cGh5ZGV2KQotCQlyZXR1cm4gcGh5X2V0aHRvb2xfZ3NldChwcml2LT5waHlkZXYsIGNtZCk7Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIGludCBjdm1fb2N0X3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKLXsKLQlzdHJ1Y3Qgb2N0ZW9uX2V0aGVybmV0ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKLQkJcmV0dXJuIC1FUEVSTTsKLQotCWlmIChwcml2LT5waHlkZXYpCi0JCXJldHVybiBwaHlfZXRodG9vbF9zc2V0KHByaXYtPnBoeWRldiwgY21kKTsKLQotCXJldHVybiAtRUlOVkFMOwotfQotCiBzdGF0aWMgaW50IGN2bV9vY3RfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBvY3Rlb25fZXRoZXJuZXQgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCiAJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JaWYgKHByaXYtPnBoeWRldikKLQkJcmV0dXJuIHBoeV9zdGFydF9hbmVnKHByaXYtPnBoeWRldik7CisJaWYgKGRldi0+cGh5ZGV2KQorCQlyZXR1cm4gcGh5X3N0YXJ0X2FuZWcoZGV2LT5waHlkZXYpOwogCiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBjdm1fb2N0X2V0aHRvb2xfb3BzID0gewogCS5nZXRfZHJ2aW5mbyA9IGN2bV9vY3RfZ2V0X2RydmluZm8sCi0JLmdldF9zZXR0aW5ncyA9IGN2bV9vY3RfZ2V0X3NldHRpbmdzLAotCS5zZXRfc2V0dGluZ3MgPSBjdm1fb2N0X3NldF9zZXR0aW5ncywKIAkubndheV9yZXNldCA9IGN2bV9vY3RfbndheV9yZXNldCwKIAkuZ2V0X2xpbmsgPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfbGlua19rc2V0dGluZ3MgPSBwaHlfZXRodG9vbF9nZXRfbGlua19rc2V0dGluZ3MsCisJLnNldF9saW5rX2tzZXR0aW5ncyA9IHBoeV9ldGh0b29sX3NldF9saW5rX2tzZXR0aW5ncywKIH07CiAKIC8qKgpAQCAtODgsMTUgKzYzLDEzIEBACiAgKi8KIGludCBjdm1fb2N0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCiB7Ci0Jc3RydWN0IG9jdGVvbl9ldGhlcm5ldCAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0KIAlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoIXByaXYtPnBoeWRldikKKwlpZiAoIWRldi0+cGh5ZGV2KQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldHVybiBwaHlfbWlpX2lvY3RsKHByaXYtPnBoeWRldiwgcnEsIGNtZCk7CisJcmV0dXJuIHBoeV9taWlfaW9jdGwoZGV2LT5waHlkZXYsIHJxLCBjbWQpOwogfQogCiB2b2lkIGN2bV9vY3Rfbm90ZV9jYXJyaWVyKHN0cnVjdCBvY3Rlb25fZXRoZXJuZXQgKnByaXYsCkBAIC0xMTksOSArOTIsOSBAQAogCWN2bXhfaGVscGVyX2xpbmtfaW5mb190IGxpbmtfaW5mbzsKIAogCWxpbmtfaW5mby51NjQJCT0gMDsKLQlsaW5rX2luZm8ucy5saW5rX3VwCT0gcHJpdi0+cGh5ZGV2LT5saW5rID8gMSA6IDA7Ci0JbGlua19pbmZvLnMuZnVsbF9kdXBsZXggPSBwcml2LT5waHlkZXYtPmR1cGxleCA/IDEgOiAwOwotCWxpbmtfaW5mby5zLnNwZWVkCT0gcHJpdi0+cGh5ZGV2LT5zcGVlZDsKKwlsaW5rX2luZm8ucy5saW5rX3VwCT0gZGV2LT5waHlkZXYtPmxpbmsgPyAxIDogMDsKKwlsaW5rX2luZm8ucy5mdWxsX2R1cGxleCA9IGRldi0+cGh5ZGV2LT5kdXBsZXggPyAxIDogMDsKKwlsaW5rX2luZm8ucy5zcGVlZAk9IGRldi0+cGh5ZGV2LT5zcGVlZDsKIAlwcml2LT5saW5rX2luZm8JCT0gbGlua19pbmZvLnU2NDsKIAogCS8qCkBAIC0xMzAsOCArMTAzLDggQEAKIAlpZiAocHJpdi0+cG9sbCkKIAkJcHJpdi0+cG9sbChkZXYpOwogCi0JaWYgKHByaXYtPmxhc3RfbGluayAhPSBwcml2LT5waHlkZXYtPmxpbmspIHsKLQkJcHJpdi0+bGFzdF9saW5rID0gcHJpdi0+cGh5ZGV2LT5saW5rOworCWlmIChwcml2LT5sYXN0X2xpbmsgIT0gZGV2LT5waHlkZXYtPmxpbmspIHsKKwkJcHJpdi0+bGFzdF9saW5rID0gZGV2LT5waHlkZXYtPmxpbms7CiAJCWN2bXhfaGVscGVyX2xpbmtfc2V0KHByaXYtPnBvcnQsIGxpbmtfaW5mbyk7CiAJCWN2bV9vY3Rfbm90ZV9jYXJyaWVyKHByaXYsIGxpbmtfaW5mbyk7CiAJfQpAQCAtMTUxLDkgKzEyNCw4IEBACiAKIAlwcml2LT5wb2xsID0gTlVMTDsKIAotCWlmIChwcml2LT5waHlkZXYpCi0JCXBoeV9kaXNjb25uZWN0KHByaXYtPnBoeWRldik7Ci0JcHJpdi0+cGh5ZGV2ID0gTlVMTDsKKwlpZiAoZGV2LT5waHlkZXYpCisJCXBoeV9kaXNjb25uZWN0KGRldi0+cGh5ZGV2KTsKIAogCWlmIChwcml2LT5sYXN0X2xpbmspIHsKIAkJbGlua19pbmZvLnU2NCA9IDA7CkBAIC0xNzYsNiArMTQ4LDcgQEAKIHsKIAlzdHJ1Y3Qgb2N0ZW9uX2V0aGVybmV0ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBoeV9ub2RlOworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBOVUxMOwogCiAJaWYgKCFwcml2LT5vZl9ub2RlKQogCQlnb3RvIG5vX3BoeTsKQEAgLTE5MywxNCArMTY2LDE1IEBACiAJaWYgKCFwaHlfbm9kZSkKIAkJZ290byBub19waHk7CiAKLQlwcml2LT5waHlkZXYgPSBvZl9waHlfY29ubmVjdChkZXYsIHBoeV9ub2RlLCBjdm1fb2N0X2FkanVzdF9saW5rLCAwLAotCQkJCSAgICAgIFBIWV9JTlRFUkZBQ0VfTU9ERV9HTUlJKTsKKwlwaHlkZXYgPSBvZl9waHlfY29ubmVjdChkZXYsIHBoeV9ub2RlLCBjdm1fb2N0X2FkanVzdF9saW5rLCAwLAorCQkJCVBIWV9JTlRFUkZBQ0VfTU9ERV9HTUlJKTsKKwlvZl9ub2RlX3B1dChwaHlfbm9kZSk7CiAKLQlpZiAoIXByaXYtPnBoeWRldikKKwlpZiAoIXBoeWRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlwcml2LT5sYXN0X2xpbmsgPSAwOwotCXBoeV9zdGFydF9hbmVnKHByaXYtPnBoeWRldik7CisJcGh5X3N0YXJ0X2FuZWcocGh5ZGV2KTsKIAogCXJldHVybiAwOwogbm9fcGh5OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1yZ21paS5jIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1yZ21paS5jCmluZGV4IDkxYjE0OGMuLjRlNzMwNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtcmdtaWkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXJnbWlpLmMKQEAgLTExNyw3ICsxMTcsMTAgQEAKIAljdm14X2hlbHBlcl9saW5rX2luZm9fdCBsaW5rX2luZm87CiAJYm9vbCBzdGF0dXNfY2hhbmdlOwogCi0JbGlua19pbmZvID0gY3ZteF9oZWxwZXJfbGlua19hdXRvY29uZihwcml2LT5wb3J0KTsKKwlsaW5rX2luZm8gPSBjdm14X2hlbHBlcl9saW5rX2dldChwcml2LT5wb3J0KTsKKwlpZiAocHJpdi0+bGlua19pbmZvICE9IGxpbmtfaW5mby51NjQgJiYKKwkgICAgY3ZteF9oZWxwZXJfbGlua19zZXQocHJpdi0+cG9ydCwgbGlua19pbmZvKSkKKwkJbGlua19pbmZvLnU2NCA9IHByaXYtPmxpbmtfaW5mbzsKIAlzdGF0dXNfY2hhbmdlID0gcHJpdi0+bGlua19pbmZvICE9IGxpbmtfaW5mby51NjQ7CiAJcHJpdi0+bGlua19pbmZvID0gbGlua19pbmZvLnU2NDsKIApAQCAtMTQ1LDcgKzE0OCw3IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlmIChwcml2LT5waHlkZXYpIHsKKwlpZiAoZGV2LT5waHlkZXYpIHsKIAkJLyoKIAkJICogSW4gcGh5ZGV2IG1vZGUsIHdlIG5lZWQgc3RpbGwgcGVyaW9kaWMgcG9sbGluZyBmb3IgdGhlCiAJCSAqIHByZWFtYmxlIGVycm9yIGNoZWNraW5nLCBhbmQgd2UgYWxzbyBuZWVkIHRvIGNhbGwgdGhpcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1yeC5jIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1yeC5jCmluZGV4IGExMGZlM2EuLmYwOTAwZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtcnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXJ4LmMKQEAgLTQzLDIxICs0MywyNyBAQAogCiAjaW5jbHVkZSA8YXNtL29jdGVvbi9jdm14LWdteHgtZGVmcy5oPgogCi1zdGF0aWMgc3RydWN0IG5hcGlfc3RydWN0IGN2bV9vY3RfbmFwaTsKK3N0YXRpYyBhdG9taWNfdCBvY3RfcnhfcmVhZHkgPSBBVE9NSUNfSU5JVCgwKTsKKworc3RhdGljIHN0cnVjdCBvY3RfcnhfZ3JvdXAgeworCWludCBpcnE7CisJaW50IGdyb3VwOworCXN0cnVjdCBuYXBpX3N0cnVjdCBuYXBpOworfSBvY3RfcnhfZ3JvdXBbMTZdOwogCiAvKioKICAqIGN2bV9vY3RfZG9faW50ZXJydXB0IC0gaW50ZXJydXB0IGhhbmRsZXIuCi0gKiBAY3BsOiBJbnRlcnJ1cHQgbnVtYmVyLiBVbnVzZWQKLSAqIEBkZXZfaWQ6IENvb2tpZSB0byBpZGVudGlmeSB0aGUgZGV2aWNlLiBVbnVzZWQKKyAqIEBpcnE6IEludGVycnVwdCBudW1iZXIuCisgKiBAbmFwaV9pZDogQ29va2llIHRvIGlkZW50aWZ5IHRoZSBOQVBJIGluc3RhbmNlLgogICoKICAqIFRoZSBpbnRlcnJ1cHQgb2NjdXJzIHdoZW5ldmVyIHRoZSBQT1cgaGFzIHBhY2tldHMgaW4gb3VyIGdyb3VwLgogICoKICAqLwotc3RhdGljIGlycXJldHVybl90IGN2bV9vY3RfZG9faW50ZXJydXB0KGludCBjcGwsIHZvaWQgKmRldl9pZCkKK3N0YXRpYyBpcnFyZXR1cm5fdCBjdm1fb2N0X2RvX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpuYXBpX2lkKQogewogCS8qIERpc2FibGUgdGhlIElSUSBhbmQgc3RhcnQgbmFwaV9wb2xsLiAqLwotCWRpc2FibGVfaXJxX25vc3luYyhPQ1RFT05fSVJRX1dPUktRMCArIHBvd19yZWNlaXZlX2dyb3VwKTsKLQluYXBpX3NjaGVkdWxlKCZjdm1fb2N0X25hcGkpOworCWRpc2FibGVfaXJxX25vc3luYyhpcnEpOworCW5hcGlfc2NoZWR1bGUobmFwaV9pZCk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC0xNDMsMTQgKzE0OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qKgotICogY3ZtX29jdF9uYXBpX3BvbGwgLSB0aGUgTkFQSSBwb2xsIGZ1bmN0aW9uLgotICogQG5hcGk6IFRoZSBOQVBJIGluc3RhbmNlLCBvciBudWxsIGlmIGNhbGxlZCBmcm9tIGN2bV9vY3RfcG9sbF9jb250cm9sbGVyCi0gKiBAYnVkZ2V0OiBNYXhpbXVtIG51bWJlciBvZiBwYWNrZXRzIHRvIHJlY2VpdmUuCi0gKgotICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhY2tldHMgcHJvY2Vzc2VkLgotICovCi1zdGF0aWMgaW50IGN2bV9vY3RfbmFwaV9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKK3N0YXRpYyBpbnQgY3ZtX29jdF9wb2xsKHN0cnVjdCBvY3RfcnhfZ3JvdXAgKnJ4X2dyb3VwLCBpbnQgYnVkZ2V0KQogewogCWNvbnN0IGludAljb3JlaWQgPSBjdm14X2dldF9jb3JlX251bSgpOwogCXU2NAlvbGRfZ3JvdXBfbWFzazsKQEAgLTE3MiwxMyArMTcxLDEzIEBACiAJaWYgKE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ042OFhYKSkgewogCQlvbGRfZ3JvdXBfbWFzayA9IGN2bXhfcmVhZF9jc3IoQ1ZNWF9TU09fUFBYX0dSUF9NU0soY29yZWlkKSk7CiAJCWN2bXhfd3JpdGVfY3NyKENWTVhfU1NPX1BQWF9HUlBfTVNLKGNvcmVpZCksCi0JCQkgICAgICAgMXVsbCA8PCBwb3dfcmVjZWl2ZV9ncm91cCk7CisJCQkgICAgICAgQklUKHJ4X2dyb3VwLT5ncm91cCkpOwogCQljdm14X3JlYWRfY3NyKENWTVhfU1NPX1BQWF9HUlBfTVNLKGNvcmVpZCkpOyAvKiBGbHVzaCAqLwogCX0gZWxzZSB7CiAJCW9sZF9ncm91cF9tYXNrID0gY3ZteF9yZWFkX2NzcihDVk1YX1BPV19QUF9HUlBfTVNLWChjb3JlaWQpKTsKIAkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9QT1dfUFBfR1JQX01TS1goY29yZWlkKSwKIAkJCSAgICAgICAob2xkX2dyb3VwX21hc2sgJiB+MHhGRkZGdWxsKSB8Ci0JCQkgICAgICAgMSA8PCBwb3dfcmVjZWl2ZV9ncm91cCk7CisJCQkgICAgICAgQklUKHJ4X2dyb3VwLT5ncm91cCkpOwogCX0KIAogCWlmIChVU0VfQVNZTkNfSU9CRE1BKSB7CkBAIC0yMDMsMTUgKzIwMiwxNSBAQAogCQlpZiAoIXdvcmspIHsKIAkJCWlmIChPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NONjhYWCkpIHsKIAkJCQljdm14X3dyaXRlX2NzcihDVk1YX1NTT19XUV9JUV9ESVMsCi0JCQkJCSAgICAgICAxdWxsIDw8IHBvd19yZWNlaXZlX2dyb3VwKTsKKwkJCQkJICAgICAgIEJJVChyeF9ncm91cC0+Z3JvdXApKTsKIAkJCQljdm14X3dyaXRlX2NzcihDVk1YX1NTT19XUV9JTlQsCi0JCQkJCSAgICAgICAxdWxsIDw8IHBvd19yZWNlaXZlX2dyb3VwKTsKKwkJCQkJICAgICAgIEJJVChyeF9ncm91cC0+Z3JvdXApKTsKIAkJCX0gZWxzZSB7CiAJCQkJdW5pb24gY3ZteF9wb3dfd3FfaW50IHdxX2ludDsKIAogCQkJCXdxX2ludC51NjQgPSAwOwotCQkJCXdxX2ludC5zLmlxX2RpcyA9IDEgPDwgcG93X3JlY2VpdmVfZ3JvdXA7Ci0JCQkJd3FfaW50LnMud3FfaW50ID0gMSA8PCBwb3dfcmVjZWl2ZV9ncm91cDsKKwkJCQl3cV9pbnQucy5pcV9kaXMgPSBCSVQocnhfZ3JvdXAtPmdyb3VwKTsKKwkJCQl3cV9pbnQucy53cV9pbnQgPSBCSVQocnhfZ3JvdXAtPmdyb3VwKTsKIAkJCQljdm14X3dyaXRlX2NzcihDVk1YX1BPV19XUV9JTlQsIHdxX2ludC51NjQpOwogCQkJfQogCQkJYnJlYWs7CkBAIC00MTAsMTAgKzQwOSwyOCBAQAogCX0KIAljdm1fb2N0X3J4X3JlZmlsbF9wb29sKDApOwogCi0JaWYgKHJ4X2NvdW50IDwgYnVkZ2V0ICYmIG5hcGkpIHsKKwlyZXR1cm4gcnhfY291bnQ7Cit9CisKKy8qKgorICogY3ZtX29jdF9uYXBpX3BvbGwgLSB0aGUgTkFQSSBwb2xsIGZ1bmN0aW9uLgorICogQG5hcGk6IFRoZSBOQVBJIGluc3RhbmNlLgorICogQGJ1ZGdldDogTWF4aW11bSBudW1iZXIgb2YgcGFja2V0cyB0byByZWNlaXZlLgorICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBwYWNrZXRzIHByb2Nlc3NlZC4KKyAqLworc3RhdGljIGludCBjdm1fb2N0X25hcGlfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpCit7CisJc3RydWN0IG9jdF9yeF9ncm91cCAqcnhfZ3JvdXAgPSBjb250YWluZXJfb2YobmFwaSwgc3RydWN0IG9jdF9yeF9ncm91cCwKKwkJCQkJCSAgICAgbmFwaSk7CisJaW50IHJ4X2NvdW50OworCisJcnhfY291bnQgPSBjdm1fb2N0X3BvbGwocnhfZ3JvdXAsIGJ1ZGdldCk7CisKKwlpZiAocnhfY291bnQgPCBidWRnZXQpIHsKIAkJLyogTm8gbW9yZSB3b3JrICovCiAJCW5hcGlfY29tcGxldGUobmFwaSk7Ci0JCWVuYWJsZV9pcnEoT0NURU9OX0lSUV9XT1JLUTAgKyBwb3dfcmVjZWl2ZV9ncm91cCk7CisJCWVuYWJsZV9pcnEocnhfZ3JvdXAtPmlycSk7CiAJfQogCXJldHVybiByeF9jb3VudDsKIH0KQEAgLTQyNyw3ICs0NDQsMTcgQEAKICAqLwogdm9pZCBjdm1fb2N0X3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCWN2bV9vY3RfbmFwaV9wb2xsKE5VTEwsIDE2KTsKKwlpbnQgaTsKKworCWlmICghYXRvbWljX3JlYWQoJm9jdF9yeF9yZWFkeSkpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9jdF9yeF9ncm91cCk7IGkrKykgeworCQlpZiAoIShwb3dfcmVjZWl2ZV9ncm91cHMgJiBCSVQoaSkpKQorCQkJY29udGludWU7CisKKwkJY3ZtX29jdF9wb2xsKCZvY3RfcnhfZ3JvdXBbaV0sIDE2KTsKKwl9CiB9CiAjZW5kaWYKIApAQCAtNDQ2LDU0ICs0NzMsODAgQEAKIAlpZiAoIWRldl9mb3JfbmFwaSkKIAkJcGFuaWMoIk5vIG5ldF9kZXZpY2VzIHdlcmUgYWxsb2NhdGVkLiIpOwogCi0JbmV0aWZfbmFwaV9hZGQoZGV2X2Zvcl9uYXBpLCAmY3ZtX29jdF9uYXBpLCBjdm1fb2N0X25hcGlfcG9sbCwKLQkJICAgICAgIHJ4X25hcGlfd2VpZ2h0KTsKLQluYXBpX2VuYWJsZSgmY3ZtX29jdF9uYXBpKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvY3RfcnhfZ3JvdXApOyBpKyspIHsKKwkJaW50IHJldDsKIAotCS8qIFJlZ2lzdGVyIGFuIElSUSBoYW5kbGVyIHRvIHJlY2VpdmUgUE9XIGludGVycnVwdHMgKi8KLQlpID0gcmVxdWVzdF9pcnEoT0NURU9OX0lSUV9XT1JLUTAgKyBwb3dfcmVjZWl2ZV9ncm91cCwKLQkJCWN2bV9vY3RfZG9faW50ZXJydXB0LCAwLCAiRXRoZXJuZXQiLCBjdm1fb2N0X2RldmljZSk7CisJCWlmICghKHBvd19yZWNlaXZlX2dyb3VwcyAmIEJJVChpKSkpCisJCQljb250aW51ZTsKIAotCWlmIChpKQotCQlwYW5pYygiQ291bGQgbm90IGFjcXVpcmUgRXRoZXJuZXQgSVJRICVkXG4iLAotCQkgICAgICBPQ1RFT05fSVJRX1dPUktRMCArIHBvd19yZWNlaXZlX2dyb3VwKTsKKwkJbmV0aWZfbmFwaV9hZGQoZGV2X2Zvcl9uYXBpLCAmb2N0X3J4X2dyb3VwW2ldLm5hcGksCisJCQkgICAgICAgY3ZtX29jdF9uYXBpX3BvbGwsIHJ4X25hcGlfd2VpZ2h0KTsKKwkJbmFwaV9lbmFibGUoJm9jdF9yeF9ncm91cFtpXS5uYXBpKTsKIAotCWRpc2FibGVfaXJxX25vc3luYyhPQ1RFT05fSVJRX1dPUktRMCArIHBvd19yZWNlaXZlX2dyb3VwKTsKKwkJb2N0X3J4X2dyb3VwW2ldLmlycSA9IE9DVEVPTl9JUlFfV09SS1EwICsgaTsKKwkJb2N0X3J4X2dyb3VwW2ldLmdyb3VwID0gaTsKIAotCS8qIEVuYWJsZSBQT1cgaW50ZXJydXB0IHdoZW4gb3VyIHBvcnQgaGFzIGF0IGxlYXN0IG9uZSBwYWNrZXQgKi8KLQlpZiAoT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjY4WFgpKSB7Ci0JCXVuaW9uIGN2bXhfc3NvX3dxX2ludF90aHJ4IGludF90aHI7Ci0JCXVuaW9uIGN2bXhfcG93X3dxX2ludF9wYyBpbnRfcGM7CisJCS8qIFJlZ2lzdGVyIGFuIElSUSBoYW5kbGVyIHRvIHJlY2VpdmUgUE9XIGludGVycnVwdHMgKi8KKwkJcmV0ID0gcmVxdWVzdF9pcnEob2N0X3J4X2dyb3VwW2ldLmlycSwgY3ZtX29jdF9kb19pbnRlcnJ1cHQsIDAsCisJCQkJICAiRXRoZXJuZXQiLCAmb2N0X3J4X2dyb3VwW2ldLm5hcGkpOworCQlpZiAocmV0KQorCQkJcGFuaWMoIkNvdWxkIG5vdCBhY3F1aXJlIEV0aGVybmV0IElSUSAlZFxuIiwKKwkJCSAgICAgIG9jdF9yeF9ncm91cFtpXS5pcnEpOwogCi0JCWludF90aHIudTY0ID0gMDsKLQkJaW50X3Roci5zLnRjX2VuID0gMTsKLQkJaW50X3Roci5zLnRjX3RociA9IDE7Ci0JCWN2bXhfd3JpdGVfY3NyKENWTVhfU1NPX1dRX0lOVF9USFJYKHBvd19yZWNlaXZlX2dyb3VwKSwKLQkJCSAgICAgICBpbnRfdGhyLnU2NCk7CisJCWRpc2FibGVfaXJxX25vc3luYyhvY3RfcnhfZ3JvdXBbaV0uaXJxKTsKIAotCQlpbnRfcGMudTY0ID0gMDsKLQkJaW50X3BjLnMucGNfdGhyID0gNTsKLQkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9TU09fV1FfSU5UX1BDLCBpbnRfcGMudTY0KTsKLQl9IGVsc2UgewotCQl1bmlvbiBjdm14X3Bvd193cV9pbnRfdGhyeCBpbnRfdGhyOwotCQl1bmlvbiBjdm14X3Bvd193cV9pbnRfcGMgaW50X3BjOworCQkvKiBFbmFibGUgUE9XIGludGVycnVwdCB3aGVuIG91ciBwb3J0IGhhcyBhdCBsZWFzdCBvbmUgcGFja2V0ICovCisJCWlmIChPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NONjhYWCkpIHsKKwkJCXVuaW9uIGN2bXhfc3NvX3dxX2ludF90aHJ4IGludF90aHI7CisJCQl1bmlvbiBjdm14X3Bvd193cV9pbnRfcGMgaW50X3BjOwogCi0JCWludF90aHIudTY0ID0gMDsKLQkJaW50X3Roci5zLnRjX2VuID0gMTsKLQkJaW50X3Roci5zLnRjX3RociA9IDE7Ci0JCWN2bXhfd3JpdGVfY3NyKENWTVhfUE9XX1dRX0lOVF9USFJYKHBvd19yZWNlaXZlX2dyb3VwKSwKLQkJCSAgICAgICBpbnRfdGhyLnU2NCk7CisJCQlpbnRfdGhyLnU2NCA9IDA7CisJCQlpbnRfdGhyLnMudGNfZW4gPSAxOworCQkJaW50X3Roci5zLnRjX3RociA9IDE7CisJCQljdm14X3dyaXRlX2NzcihDVk1YX1NTT19XUV9JTlRfVEhSWChpKSwgaW50X3Roci51NjQpOwogCi0JCWludF9wYy51NjQgPSAwOwotCQlpbnRfcGMucy5wY190aHIgPSA1OwotCQljdm14X3dyaXRlX2NzcihDVk1YX1BPV19XUV9JTlRfUEMsIGludF9wYy51NjQpOworCQkJaW50X3BjLnU2NCA9IDA7CisJCQlpbnRfcGMucy5wY190aHIgPSA1OworCQkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9TU09fV1FfSU5UX1BDLCBpbnRfcGMudTY0KTsKKwkJfSBlbHNlIHsKKwkJCXVuaW9uIGN2bXhfcG93X3dxX2ludF90aHJ4IGludF90aHI7CisJCQl1bmlvbiBjdm14X3Bvd193cV9pbnRfcGMgaW50X3BjOworCisJCQlpbnRfdGhyLnU2NCA9IDA7CisJCQlpbnRfdGhyLnMudGNfZW4gPSAxOworCQkJaW50X3Roci5zLnRjX3RociA9IDE7CisJCQljdm14X3dyaXRlX2NzcihDVk1YX1BPV19XUV9JTlRfVEhSWChpKSwgaW50X3Roci51NjQpOworCisJCQlpbnRfcGMudTY0ID0gMDsKKwkJCWludF9wYy5zLnBjX3RociA9IDU7CisJCQljdm14X3dyaXRlX2NzcihDVk1YX1BPV19XUV9JTlRfUEMsIGludF9wYy51NjQpOworCQl9CisKKwkJLyogU2NoZWR1bGUgTkFQSSBub3cuIFRoaXMgd2lsbCBpbmRpcmVjdGx5IGVuYWJsZSB0aGUKKwkJICogaW50ZXJydXB0LgorCQkgKi8KKwkJbmFwaV9zY2hlZHVsZSgmb2N0X3J4X2dyb3VwW2ldLm5hcGkpOwogCX0KLQotCS8qIFNjaGVkdWxlIE5BUEkgbm93LiBUaGlzIHdpbGwgaW5kaXJlY3RseSBlbmFibGUgdGhlIGludGVycnVwdC4gKi8KLQluYXBpX3NjaGVkdWxlKCZjdm1fb2N0X25hcGkpOworCWF0b21pY19pbmMoJm9jdF9yeF9yZWFkeSk7CiB9CiAKIHZvaWQgY3ZtX29jdF9yeF9zaHV0ZG93bih2b2lkKQogewotCW5ldGlmX25hcGlfZGVsKCZjdm1fb2N0X25hcGkpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob2N0X3J4X2dyb3VwKTsgaSsrKSB7CisJCWlmICghKHBvd19yZWNlaXZlX2dyb3VwcyAmIEJJVChpKSkpCisJCQljb250aW51ZTsKKworCQkvKiBEaXNhYmxlIFBPVyBpbnRlcnJ1cHQgKi8KKwkJaWYgKE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ042OFhYKSkKKwkJCWN2bXhfd3JpdGVfY3NyKENWTVhfU1NPX1dRX0lOVF9USFJYKGkpLCAwKTsKKwkJZWxzZQorCQkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9QT1dfV1FfSU5UX1RIUlgoaSksIDApOworCisJCS8qIEZyZWUgdGhlIGludGVycnVwdCBoYW5kbGVyICovCisJCWZyZWVfaXJxKG9jdF9yeF9ncm91cFtpXS5pcnEsIGN2bV9vY3RfZGV2aWNlKTsKKworCQluZXRpZl9uYXBpX2RlbCgmb2N0X3J4X2dyb3VwW2ldLm5hcGkpOworCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtdXRpbC5oIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC11dGlsLmgKaW5kZXggNDVmMDI0Yi4uNjE3ZGE4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC11dGlsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC11dGlsLmgKQEAgLTMyLDEyICszMiwxMyBAQAogICovCiBzdGF0aWMgaW5saW5lIGludCBJTlRFUkZBQ0UoaW50IGlwZF9wb3J0KQogewotCWludCBpbnRlcmZhY2UgPSBjdm14X2hlbHBlcl9nZXRfaW50ZXJmYWNlX251bShpcGRfcG9ydCk7CisJaW50IGludGVyZmFjZTsKIAorCWlmIChpcGRfcG9ydCA9PSBDVk1YX1BJUF9OVU1fSU5QVVRfUE9SVFMpCisJCXJldHVybiAxMDsKKwlpbnRlcmZhY2UgPSBjdm14X2hlbHBlcl9nZXRfaW50ZXJmYWNlX251bShpcGRfcG9ydCk7CiAJaWYgKGludGVyZmFjZSA+PSAwKQogCQlyZXR1cm4gaW50ZXJmYWNlOwotCWVsc2UgaWYgKGlwZF9wb3J0ID09IENWTVhfUElQX05VTV9JTlBVVF9QT1JUUykKLQkJcmV0dXJuIDEwOwogCXBhbmljKCJJbGxlZ2FsIGlwZF9wb3J0ICVkIHBhc3NlZCB0byBJTlRFUkZBQ0VcbiIsIGlwZF9wb3J0KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC5jIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC5jCmluZGV4IGU5Y2Q1ZjIuLmQwMmUzZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LmMKQEAgLTE3LDYgKzE3LDggQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CiAKICNpbmNsdWRlIDxuZXQvZHN0Lmg+CiAKQEAgLTM1LDE3ICszNywxOSBAQAogI2luY2x1ZGUgPGFzbS9vY3Rlb24vY3ZteC1mYXUuaD4KICNpbmNsdWRlIDxhc20vb2N0ZW9uL2N2bXgtaXBkLmg+CiAjaW5jbHVkZSA8YXNtL29jdGVvbi9jdm14LWhlbHBlci5oPgotCisjaW5jbHVkZSA8YXNtL29jdGVvbi9jdm14LWFzeHgtZGVmcy5oPgogI2luY2x1ZGUgPGFzbS9vY3Rlb24vY3ZteC1nbXh4LWRlZnMuaD4KICNpbmNsdWRlIDxhc20vb2N0ZW9uL2N2bXgtc21peC1kZWZzLmg+CiAKKyNkZWZpbmUgT0NURU9OX01BWF9NVFUgNjUzOTIKKwogc3RhdGljIGludCBudW1fcGFja2V0X2J1ZmZlcnMgPSAxMDI0OwogbW9kdWxlX3BhcmFtKG51bV9wYWNrZXRfYnVmZmVycywgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MobnVtX3BhY2tldF9idWZmZXJzLCAiXG4iCiAJIlx0TnVtYmVyIG9mIHBhY2tldCBidWZmZXJzIHRvIGFsbG9jYXRlIGFuZCBzdG9yZSBpbiB0aGVcbiIKIAkiXHRGUEEuIEJ5IGRlZmF1bHQsIDEwMjQgcGFja2V0IGJ1ZmZlcnMgYXJlIHVzZWQuXG4iKTsKIAotaW50IHBvd19yZWNlaXZlX2dyb3VwID0gMTU7CitzdGF0aWMgaW50IHBvd19yZWNlaXZlX2dyb3VwID0gMTU7CiBtb2R1bGVfcGFyYW0ocG93X3JlY2VpdmVfZ3JvdXAsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHBvd19yZWNlaXZlX2dyb3VwLCAiXG4iCiAJIlx0UE9XIGdyb3VwIHRvIHJlY2VpdmUgcGFja2V0cyBmcm9tLiBBbGwgZXRoZXJuZXQgaGFyZHdhcmVcbiIKQEAgLTUzLDYgKzU3LDE1IEBACiAJIlx0Z3JvdXAuIEFsc28gYW55IG90aGVyIHNvZnR3YXJlIGNhbiBzdWJtaXQgcGFja2V0cyB0byB0aGlzXG4iCiAJIlx0Z3JvdXAgZm9yIHRoZSBrZXJuZWwgdG8gcHJvY2Vzcy4iKTsKIAorc3RhdGljIGludCByZWNlaXZlX2dyb3VwX29yZGVyOworbW9kdWxlX3BhcmFtKHJlY2VpdmVfZ3JvdXBfb3JkZXIsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJlY2VpdmVfZ3JvdXBfb3JkZXIsICJcbiIKKwkiXHRPcmRlciAoMC4uNCkgb2YgcmVjZWl2ZSBncm91cHMgdG8gdGFrZSBpbnRvIHVzZS4gRXRoZXJuZXQgaGFyZHdhcmVcbiIKKwkiXHR3aWxsIGJlIGNvbmZpZ3VyZWQgdG8gc2VuZCBpbmNvbWluZyBwYWNrZXRzIHRvIG11bHRpcGxlIFBPV1xuIgorCSJcdGdyb3Vwcy4gcG93X3JlY2VpdmVfZ3JvdXAgcGFyYW1ldGVyIGlzIGlnbm9yZWQgd2hlbiBtdWx0aXBsZVxuIgorCSJcdGdyb3VwcyBhcmUgdGFrZW4gaW50byB1c2UgYW5kIGdyb3VwcyBhcmUgYWxsb2NhdGVkIHN0YXJ0aW5nXG4iCisJIlx0ZnJvbSAwLiBCeSBkZWZhdWx0LCBhIHNpbmdsZSBncm91cCBpcyB1c2VkLlxuIik7CisKIGludCBwb3dfc2VuZF9ncm91cCA9IC0xOwogbW9kdWxlX3BhcmFtKHBvd19zZW5kX2dyb3VwLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhwb3dfc2VuZF9ncm91cCwgIlxuIgpAQCAtODYsNiArOTksOCBAQAogbW9kdWxlX3BhcmFtKHJ4X25hcGlfd2VpZ2h0LCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhyeF9uYXBpX3dlaWdodCwgIlRoZSBOQVBJIFdFSUdIVCBwYXJhbWV0ZXIuIik7CiAKKy8qIE1hc2sgaW5kaWNhdGluZyB3aGljaCByZWNlaXZlIGdyb3VwcyBhcmUgaW4gdXNlLiAqLworaW50IHBvd19yZWNlaXZlX2dyb3VwczsKIAogLyoKICAqIGN2bV9vY3RfcG9sbF9xdWV1ZV9zdG9wcGluZyAtIGZsYWcgdG8gaW5kaWNhdGUgcG9sbGluZyBzaG91bGQgc3RvcC4KQEAgLTIzNywyMSArMjUyLDIyIEBACiB7CiAJc3RydWN0IG9jdGVvbl9ldGhlcm5ldCAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IGludGVyZmFjZSA9IElOVEVSRkFDRShwcml2LT5wb3J0KTsKLQlpbnQgaW5kZXggPSBJTkRFWChwcml2LT5wb3J0KTsKLSNpZiBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkKLQlpbnQgdmxhbl9ieXRlcyA9IDQ7CisjaWYgSVNfRU5BQkxFRChDT05GSUdfVkxBTl84MDIxUSkKKwlpbnQgdmxhbl9ieXRlcyA9IFZMQU5fSExFTjsKICNlbHNlCiAJaW50IHZsYW5fYnl0ZXMgPSAwOwogI2VuZGlmCisJaW50IG10dV9vdmVyaGVhZCA9IEVUSF9ITEVOICsgRVRIX0ZDU19MRU4gKyB2bGFuX2J5dGVzOwogCiAJLyoKIAkgKiBMaW1pdCB0aGUgTVRVIHRvIG1ha2Ugc3VyZSB0aGUgZXRoZXJuZXQgcGFja2V0cyBhcmUgYmV0d2VlbgogCSAqIDY0IGJ5dGVzIGFuZCA2NTUzNSBieXRlcy4KIAkgKi8KLQlpZiAoKG5ld19tdHUgKyAxNCArIDQgKyB2bGFuX2J5dGVzIDwgNjQpIHx8Ci0JICAgIChuZXdfbXR1ICsgMTQgKyA0ICsgdmxhbl9ieXRlcyA+IDY1MzkyKSkgeworCWlmICgobmV3X210dSArIG10dV9vdmVyaGVhZCA8IFZMQU5fRVRIX1pMRU4pIHx8CisJICAgIChuZXdfbXR1ICsgbXR1X292ZXJoZWFkID4gT0NURU9OX01BWF9NVFUpKSB7CiAJCXByX2VycigiTVRVIG11c3QgYmUgYmV0d2VlbiAlZCBhbmQgJWQuXG4iLAotCQkgICAgICAgNjQgLSAxNCAtIDQgLSB2bGFuX2J5dGVzLCA2NTM5MiAtIDE0IC0gNCAtIHZsYW5fYnl0ZXMpOworCQkgICAgICAgVkxBTl9FVEhfWkxFTiAtIG10dV9vdmVyaGVhZCwKKwkJICAgICAgIE9DVEVPTl9NQVhfTVRVIC0gbXR1X292ZXJoZWFkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWRldi0+bXR1ID0gbmV3X210dTsKQEAgLTI1OSw4ICsyNzUsOSBAQAogCWlmICgoaW50ZXJmYWNlIDwgMikgJiYKIAkgICAgKGN2bXhfaGVscGVyX2ludGVyZmFjZV9nZXRfbW9kZShpbnRlcmZhY2UpICE9CiAJCUNWTVhfSEVMUEVSX0lOVEVSRkFDRV9NT0RFX1NQSSkpIHsKKwkJaW50IGluZGV4ID0gSU5ERVgocHJpdi0+cG9ydCk7CiAJCS8qIEFkZCBldGhlcm5ldCBoZWFkZXIgYW5kIEZDUywgYW5kIFZMQU4gaWYgY29uZmlndXJlZC4gKi8KLQkJaW50IG1heF9wYWNrZXQgPSBuZXdfbXR1ICsgMTQgKyA0ICsgdmxhbl9ieXRlczsKKwkJaW50IG1heF9wYWNrZXQgPSBuZXdfbXR1ICsgbXR1X292ZXJoZWFkOwogCiAJCWlmIChPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NOM1hYWCkgfHwKIAkJICAgIE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ041OFhYKSkgewpAQCAtMjc1LDcgKzI5Miw3IEBACiAJCQl1bmlvbiBjdm14X3BpcF9mcm1fbGVuX2Noa3ggZnJtX2xlbl9jaGs7CiAKIAkJCWZybV9sZW5fY2hrLnU2NCA9IDA7Ci0JCQlmcm1fbGVuX2Noay5zLm1pbmxlbiA9IDY0OworCQkJZnJtX2xlbl9jaGsucy5taW5sZW4gPSBWTEFOX0VUSF9aTEVOOwogCQkJZnJtX2xlbl9jaGsucy5tYXhsZW4gPSBtYXhfcGFja2V0OwogCQkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9QSVBfRlJNX0xFTl9DSEtYKGludGVyZmFjZSksCiAJCQkJICAgICAgIGZybV9sZW5fY2hrLnU2NCk7CkBAIC0zMDAsMTIgKzMxNywxMiBAQAogCXVuaW9uIGN2bXhfZ214eF9wcnR4X2NmZyBnbXhfY2ZnOwogCXN0cnVjdCBvY3Rlb25fZXRoZXJuZXQgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBpbnRlcmZhY2UgPSBJTlRFUkZBQ0UocHJpdi0+cG9ydCk7Ci0JaW50IGluZGV4ID0gSU5ERVgocHJpdi0+cG9ydCk7CiAKIAlpZiAoKGludGVyZmFjZSA8IDIpICYmCiAJICAgIChjdm14X2hlbHBlcl9pbnRlcmZhY2VfZ2V0X21vZGUoaW50ZXJmYWNlKSAhPQogCQlDVk1YX0hFTFBFUl9JTlRFUkZBQ0VfTU9ERV9TUEkpKSB7CiAJCXVuaW9uIGN2bXhfZ214eF9yeHhfYWRyX2N0bCBjb250cm9sOworCQlpbnQgaW5kZXggPSBJTkRFWChwcml2LT5wb3J0KTsKIAogCQljb250cm9sLnU2NCA9IDA7CiAJCWNvbnRyb2wucy5iY3N0ID0gMTsJLyogQWxsb3cgYnJvYWRjYXN0IE1BQyBhZGRyZXNzZXMgKi8KQEAgLTM1Miw3ICszNjksNiBAQAogCXN0cnVjdCBvY3Rlb25fZXRoZXJuZXQgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuaW9uIGN2bXhfZ214eF9wcnR4X2NmZyBnbXhfY2ZnOwogCWludCBpbnRlcmZhY2UgPSBJTlRFUkZBQ0UocHJpdi0+cG9ydCk7Ci0JaW50IGluZGV4ID0gSU5ERVgocHJpdi0+cG9ydCk7CiAKIAlpZiAoKGludGVyZmFjZSA8IDIpICYmCiAJICAgIChjdm14X2hlbHBlcl9pbnRlcmZhY2VfZ2V0X21vZGUoaW50ZXJmYWNlKSAhPQpAQCAtMzYwLDYgKzM3Niw3IEBACiAJCWludCBpOwogCQl1OCAqcHRyID0gZGV2LT5kZXZfYWRkcjsKIAkJdTY0IG1hYyA9IDA7CisJCWludCBpbmRleCA9IElOREVYKHByaXYtPnBvcnQpOwogCiAJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCiAJCQltYWMgPSAobWFjIDw8IDgpIHwgKHU2NClwdHJbaV07CkBAIC00NTcsMTAgKzQ3NCw4IEBACiAKIHZvaWQgY3ZtX29jdF9jb21tb25fdW5pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG9jdGVvbl9ldGhlcm5ldCAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlpZiAocHJpdi0+cGh5ZGV2KQotCQlwaHlfZGlzY29ubmVjdChwcml2LT5waHlkZXYpOworCWlmIChkZXYtPnBoeWRldikKKwkJcGh5X2Rpc2Nvbm5lY3QoZGV2LT5waHlkZXYpOwogfQogCiBpbnQgY3ZtX29jdF9jb21tb25fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApAQCAtNDc5LDE1ICs0OTQsMTcgQEAKIAogCWdteF9jZmcudTY0ID0gY3ZteF9yZWFkX2NzcihDVk1YX0dNWFhfUFJUWF9DRkcoaW5kZXgsIGludGVyZmFjZSkpOwogCWdteF9jZmcucy5lbiA9IDE7CisJaWYgKG9jdGVvbl9oYXNfZmVhdHVyZShPQ1RFT05fRkVBVFVSRV9QS05EKSkKKwkJZ214X2NmZy5zLnBrbmQgPSBwcml2LT5wb3J0OwogCWN2bXhfd3JpdGVfY3NyKENWTVhfR01YWF9QUlRYX0NGRyhpbmRleCwgaW50ZXJmYWNlKSwgZ214X2NmZy51NjQpOwogCiAJaWYgKG9jdGVvbl9pc19zaW11bGF0aW9uKCkpCiAJCXJldHVybiAwOwogCi0JaWYgKHByaXYtPnBoeWRldikgewotCQlpbnQgciA9IHBoeV9yZWFkX3N0YXR1cyhwcml2LT5waHlkZXYpOworCWlmIChkZXYtPnBoeWRldikgeworCQlpbnQgciA9IHBoeV9yZWFkX3N0YXR1cyhkZXYtPnBoeWRldik7CiAKLQkJaWYgKHIgPT0gMCAmJiBwcml2LT5waHlkZXYtPmxpbmsgPT0gMCkKKwkJaWYgKHIgPT0gMCAmJiBkZXYtPnBoeWRldi0+bGluayA9PSAwKQogCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKIAkJY3ZtX29jdF9hZGp1c3RfbGluayhkZXYpOwogCX0gZWxzZSB7CkBAIC01MTAsOCArNTI3LDEwIEBACiAJaWYgKGxpbmtfaW5mby51NjQgPT0gcHJpdi0+bGlua19pbmZvKQogCQlyZXR1cm47CiAKLQlsaW5rX2luZm8gPSBjdm14X2hlbHBlcl9saW5rX2F1dG9jb25mKHByaXYtPnBvcnQpOwotCXByaXYtPmxpbmtfaW5mbyA9IGxpbmtfaW5mby51NjQ7CisJaWYgKGN2bXhfaGVscGVyX2xpbmtfc2V0KHByaXYtPnBvcnQsIGxpbmtfaW5mbykpCisJCWxpbmtfaW5mby51NjQgPSBwcml2LT5saW5rX2luZm87CisJZWxzZQorCQlwcml2LT5saW5rX2luZm8gPSBsaW5rX2luZm8udTY0OwogCiAJaWYgKGxpbmtfaW5mby5zLmxpbmtfdXApIHsKIAkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKGRldikpCkBAIC02NDksNiArNjY4LDE2IEBACiAJcmV0dXJuIG5wOwogfQogCitzdGF0aWMgdm9pZCBjdm1fc2V0X3JnbWlpX2RlbGF5KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGludCBpZmFjZSwgaW50IHBvcnQpCit7CisJdTMyIGRlbGF5X3ZhbHVlOworCisJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJ4LWRlbGF5IiwgJmRlbGF5X3ZhbHVlKSkKKwkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9BU1hYX1JYX0NMS19TRVRYKHBvcnQsIGlmYWNlKSwgZGVsYXlfdmFsdWUpOworCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJ0eC1kZWxheSIsICZkZWxheV92YWx1ZSkpCisJCWN2bXhfd3JpdGVfY3NyKENWTVhfQVNYWF9UWF9DTEtfU0VUWChwb3J0LCBpZmFjZSksIGRlbGF5X3ZhbHVlKTsKK30KKwogc3RhdGljIGludCBjdm1fb2N0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJaW50IG51bV9pbnRlcmZhY2VzOwpAQCAtNjY1LDExICs2OTQsMTggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0KIAljdm1fb2N0X2NvbmZpZ3VyZV9jb21tb25faHcoKTsKIAogCWN2bXhfaGVscGVyX2luaXRpYWxpemVfcGFja2V0X2lvX2dsb2JhbCgpOwogCisJaWYgKHJlY2VpdmVfZ3JvdXBfb3JkZXIpIHsKKwkJaWYgKHJlY2VpdmVfZ3JvdXBfb3JkZXIgPiA0KQorCQkJcmVjZWl2ZV9ncm91cF9vcmRlciA9IDQ7CisJCXBvd19yZWNlaXZlX2dyb3VwcyA9ICgxIDw8ICgxIDw8IHJlY2VpdmVfZ3JvdXBfb3JkZXIpKSAtIDE7CisJfSBlbHNlIHsKKwkJcG93X3JlY2VpdmVfZ3JvdXBzID0gQklUKHBvd19yZWNlaXZlX2dyb3VwKTsKKwl9CisKIAkvKiBDaGFuZ2UgdGhlIGlucHV0IGdyb3VwIGZvciBhbGwgcG9ydHMgYmVmb3JlIGlucHV0IGlzIGVuYWJsZWQgKi8KIAludW1faW50ZXJmYWNlcyA9IGN2bXhfaGVscGVyX2dldF9udW1iZXJfb2ZfaW50ZXJmYWNlcygpOwogCWZvciAoaW50ZXJmYWNlID0gMDsgaW50ZXJmYWNlIDwgbnVtX2ludGVyZmFjZXM7IGludGVyZmFjZSsrKSB7CkBAIC02ODMsNyArNzE5LDM3IEBACiAKIAkJCXBpcF9wcnRfdGFneC51NjQgPQogCQkJICAgIGN2bXhfcmVhZF9jc3IoQ1ZNWF9QSVBfUFJUX1RBR1gocG9ydCkpOwotCQkJcGlwX3BydF90YWd4LnMuZ3JwID0gcG93X3JlY2VpdmVfZ3JvdXA7CisKKwkJCWlmIChyZWNlaXZlX2dyb3VwX29yZGVyKSB7CisJCQkJaW50IHRhZ19tYXNrOworCisJCQkJLyogV2Ugc3VwcG9ydCBvbmx5IDE2IGdyb3VwcyBhdCB0aGUgbW9tZW50LCBzbworCQkJCSAqIGFsd2F5cyBkaXNhYmxlIHRoZSB0d28gYWRkaXRpb25hbCAiaGlkZGVuIgorCQkJCSAqIHRhZ19tYXNrIGJpdHMgb24gQ042OFhYLgorCQkJCSAqLworCQkJCWlmIChPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NONjhYWCkpCisJCQkJCXBpcF9wcnRfdGFneC51NjQgfD0gMHgzdWxsIDw8IDQ0OworCisJCQkJdGFnX21hc2sgPSB+KCgxIDw8IHJlY2VpdmVfZ3JvdXBfb3JkZXIpIC0gMSk7CisJCQkJcGlwX3BydF90YWd4LnMuZ3JwdGFnYmFzZQk9IDA7CisJCQkJcGlwX3BydF90YWd4LnMuZ3JwdGFnbWFzawk9IHRhZ19tYXNrOworCQkJCXBpcF9wcnRfdGFneC5zLmdycHRhZwkJPSAxOworCQkJCXBpcF9wcnRfdGFneC5zLnRhZ19tb2RlCQk9IDA7CisJCQkJcGlwX3BydF90YWd4LnMuaW5jX3BydF9mbGFnCT0gMTsKKwkJCQlwaXBfcHJ0X3RhZ3gucy5pcDZfZHBydF9mbGFnCT0gMTsKKwkJCQlwaXBfcHJ0X3RhZ3gucy5pcDRfZHBydF9mbGFnCT0gMTsKKwkJCQlwaXBfcHJ0X3RhZ3gucy5pcDZfc3BydF9mbGFnCT0gMTsKKwkJCQlwaXBfcHJ0X3RhZ3gucy5pcDRfc3BydF9mbGFnCT0gMTsKKwkJCQlwaXBfcHJ0X3RhZ3gucy5pcDZfZHN0X2ZsYWcJPSAxOworCQkJCXBpcF9wcnRfdGFneC5zLmlwNF9kc3RfZmxhZwk9IDE7CisJCQkJcGlwX3BydF90YWd4LnMuaXA2X3NyY19mbGFnCT0gMTsKKwkJCQlwaXBfcHJ0X3RhZ3gucy5pcDRfc3JjX2ZsYWcJPSAxOworCQkJCXBpcF9wcnRfdGFneC5zLmdycAkJPSAwOworCQkJfSBlbHNlIHsKKwkJCQlwaXBfcHJ0X3RhZ3gucy5ncnB0YWcJPSAwOworCQkJCXBpcF9wcnRfdGFneC5zLmdycAk9IHBvd19yZWNlaXZlX2dyb3VwOworCQkJfQorCiAJCQljdm14X3dyaXRlX2NzcihDVk1YX1BJUF9QUlRfVEFHWChwb3J0KSwKIAkJCQkgICAgICAgcGlwX3BydF90YWd4LnU2NCk7CiAJCX0KQEAgLTcwNSw3ICs3NzEsNiBAQAogCWlmICgocG93X3NlbmRfZ3JvdXAgIT0gLTEpKSB7CiAJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAKLQkJcHJfaW5mbygiXHRDb25maWd1cmluZyBkZXZpY2UgZm9yIFBPVyBvbmx5IGFjY2Vzc1xuIik7CiAJCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3Qgb2N0ZW9uX2V0aGVybmV0KSk7CiAJCWlmIChkZXYpIHsKIAkJCS8qIEluaXRpYWxpemUgdGhlIGRldmljZSBwcml2YXRlIHN0cnVjdHVyZS4gKi8KQEAgLTgwOCw2ICs4NzMsOCBAQAogCQkJY2FzZSBDVk1YX0hFTFBFUl9JTlRFUkZBQ0VfTU9ERV9HTUlJOgogCQkJCWRldi0+bmV0ZGV2X29wcyA9ICZjdm1fb2N0X3JnbWlpX25ldGRldl9vcHM7CiAJCQkJc3RyY3B5KGRldi0+bmFtZSwgImV0aCVkIik7CisJCQkJY3ZtX3NldF9yZ21paV9kZWxheShwcml2LT5vZl9ub2RlLCBpbnRlcmZhY2UsCisJCQkJCQkgICAgcG9ydF9pbmRleCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTg0NCwxNyArOTExLDggQEAKIHsKIAlpbnQgcG9ydDsKIAotCS8qIERpc2FibGUgUE9XIGludGVycnVwdCAqLwotCWlmIChPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NONjhYWCkpCi0JCWN2bXhfd3JpdGVfY3NyKENWTVhfU1NPX1dRX0lOVF9USFJYKHBvd19yZWNlaXZlX2dyb3VwKSwgMCk7Ci0JZWxzZQotCQljdm14X3dyaXRlX2NzcihDVk1YX1BPV19XUV9JTlRfVEhSWChwb3dfcmVjZWl2ZV9ncm91cCksIDApOwotCiAJY3ZteF9pcGRfZGlzYWJsZSgpOwogCi0JLyogRnJlZSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KLQlmcmVlX2lycShPQ1RFT05fSVJRX1dPUktRMCArIHBvd19yZWNlaXZlX2dyb3VwLCBjdm1fb2N0X2RldmljZSk7Ci0KIAlhdG9taWNfaW5jX3JldHVybigmY3ZtX29jdF9wb2xsX3F1ZXVlX3N0b3BwaW5nKTsKIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmN2bV9vY3RfcnhfcmVmaWxsX3dvcmspOwogCkBAIC04NzgsNyArOTM2LDYgQEAKIAkJfQogCX0KIAotCiAJY3ZteF9wa29fc2h1dGRvd24oKTsKIAogCWN2bXhfaXBkX2ZyZWVfcHRyKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL29jdGVvbi1ldGhlcm5ldC5oIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9vY3Rlb24tZXRoZXJuZXQuaAppbmRleCA2Mjc1YzE1Li45YzY4NTJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL29jdGVvbi1ldGhlcm5ldC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vb2N0ZW9uLWV0aGVybmV0LmgKQEAgLTQwLDcgKzQwLDYgQEAKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHR4X2ZyZWVfbGlzdFsxNl07CiAJLyogRGV2aWNlIHN0YXRpc3RpY3MgKi8KIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2OwogCXVuc2lnbmVkIGludCBsYXN0X3NwZWVkOwogCXVuc2lnbmVkIGludCBsYXN0X2xpbms7CiAJLyogTGFzdCBuZWdvdGlhdGVkIGxpbmsgc3RhdGUgKi8KQEAgLTczLDcgKzcyLDcgQEAKIAogZXh0ZXJuIGludCBhbHdheXNfdXNlX3BvdzsKIGV4dGVybiBpbnQgcG93X3NlbmRfZ3JvdXA7Ci1leHRlcm4gaW50IHBvd19yZWNlaXZlX2dyb3VwOworZXh0ZXJuIGludCBwb3dfcmVjZWl2ZV9ncm91cHM7CiBleHRlcm4gY2hhciBwb3dfc2VuZF9saXN0W107CiBleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmN2bV9vY3RfZGV2aWNlW107CiBleHRlcm4gYXRvbWljX3QgY3ZtX29jdF9wb2xsX3F1ZXVlX3N0b3BwaW5nOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29scGNfZGNvbi9vbHBjX2Rjb25feG9fMV81LmMgYi9kcml2ZXJzL3N0YWdpbmcvb2xwY19kY29uL29scGNfZGNvbl94b18xXzUuYwppbmRleCA2YTRkMzc5Li4xZTIzZWYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb2xwY19kY29uL29scGNfZGNvbl94b18xXzUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb2xwY19kY29uL29scGNfZGNvbl94b18xXzUuYwpAQCAtNDksNyArNDksNyBAQAogCiBzdGF0aWMgaW50IGRjb25fd2FzX2lycSh2b2lkKQogewotCXVfaW50OF90IHRtcDsKKwl1OCB0bXA7CiAKIAkvKiBpcnEgc3RhdHVzIHdpbGwgYXBwZWFyIGluIFBNSU9fUng1MFs2XSBvbiBncGlvMTIgKi8KIAl0bXAgPSBpbmIoVlg4NTVfR1BJX1NUQVRVU19DSEcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19hcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19hcC5jCmluZGV4IGE1NzU1MzUuLjU1M2U4ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfYXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2FwLmMKQEAgLTc4LDkgKzc4LDkgQEAKIAkvKiB1cGRhdGUgVElNIElFICovCiAJcCA9IHJ0d19nZXRfaWUocGllICsgX0ZJWEVEX0lFX0xFTkdUSF8sIF9USU1fSUVfLCAmdGltX2llbGVuLAogCQkJcG5ldHdvcmtfbWxtZWV4dC0+SUVMZW5ndGggLSBfRklYRURfSUVfTEVOR1RIXyk7Ci0JaWYgKHAgIT0gTlVMTCAmJiB0aW1faWVsZW4gPiAwKSB7CisJaWYgKHAgJiYgdGltX2llbGVuID4gMCkgewogCQl0aW1faWVsZW4gKz0gMjsKLQkJcHJlbWFpbmRlcl9pZSA9IHArdGltX2llbGVuOworCQlwcmVtYWluZGVyX2llID0gcCArIHRpbV9pZWxlbjsKIAkJdGltX2llX29mZnNldCA9IChpbnQpKHAgLSBwaWUpOwogCQlyZW1haW5kZXJfaWVsZW4gPSBwbmV0d29ya19tbG1lZXh0LT5JRUxlbmd0aCAtCiAJCQkJCXRpbV9pZV9vZmZzZXQgLSB0aW1faWVsZW47CkBAIC05OCw3ICs5OCw3IEBACiAJCQkJX1NVUFBPUlRFRFJBVEVTX0lFXywgJnRtcF9sZW4sCiAJCQkJKHBuZXR3b3JrX21sbWVleHQtPklFTGVuZ3RoIC0KIAkJCQkJX0JFQUNPTl9JRV9PRkZTRVRfKSk7Ci0JCWlmIChwICE9ICBOVUxMKQorCQlpZiAocCkKIAkJCW9mZnNldCArPSB0bXBfbGVuKzI7CiAKIAkJLyogRFMgUGFyYW1ldGVyIFNldCBJRSwgbGVuID0gMyAqLwpAQCAtMTgzLDEwICsxODMsMTAgQEAKIAkJaSArPSAocElFLT5MZW5ndGggKyAyKTsKIAl9CiAKLQlpZiAocCAhPSBOVUxMICYmIGllbGVuID4gMCkgeworCWlmIChwICYmIGllbGVuID4gMCkgewogCQlpZWxlbiArPSAyOwogCi0JCXByZW1haW5kZXJfaWUgPSBwK2llbGVuOworCQlwcmVtYWluZGVyX2llID0gcCArIGllbGVuOwogCiAJCWllX29mZnNldCA9IChpbnQpKHAgLSBwaWUpOwogCkBAIC0xOTUsNyArMTk1LDcgQEAKIAkJaWYgKGJtYXRjaCkKIAkJCWRzdF9pZSA9IHA7CiAJCWVsc2UKLQkJCWRzdF9pZSA9IHAraWVsZW47CisJCQlkc3RfaWUgPSBwICsgaWVsZW47CiAJfQogCiAJaWYgKHJlbWFpbmRlcl9pZWxlbiA+IDApIHsKQEAgLTIzMiwxMCArMjMyLDEwIEBACiAKIAlwID0gcnR3X2dldF9pZShwaWUgKyBfRklYRURfSUVfTEVOR1RIXywgaW5kZXgsICZpZWxlbiwKIAkJICAgICAgIHBuZXR3b3JrLT5JRUxlbmd0aCAtIF9GSVhFRF9JRV9MRU5HVEhfKTsKLQlpZiAocCAhPSBOVUxMICYmIGllbGVuID4gMCkgeworCWlmIChwICYmIGllbGVuID4gMCkgewogCQlpZWxlbiArPSAyOwogCi0JCXByZW1haW5kZXJfaWUgPSBwK2llbGVuOworCQlwcmVtYWluZGVyX2llID0gcCArIGllbGVuOwogCiAJCWllX29mZnNldCA9IChpbnQpKHAgLSBwaWUpOwogCkBAIC0zODUsOCArMzg1LDggQEAKIAkJCXVwZGF0ZWQgPSBhcF9mcmVlX3N0YShwYWRhcHRlciwgcHN0YSwgdHJ1ZSwgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcpOwogCQl9IGVsc2UgewogCQkJLyogVE9ETzogQWdpbmcgbWVjaGFuaXNtIHRvIGRpZ2VzdCBmcmFtZXMgaW4gc2xlZXBfcSB0byBhdm9pZCBydW5uaW5nIG91dCBvZiB4bWl0ZnJhbWUgKi8KLQkJCWlmIChwc3RhLT5zbGVlcHFfbGVuID4gKE5SX1hNSVRGUkFNRS9wc3RhcHJpdi0+YXNvY19saXN0X2NudCkgJiYKLQkJCSAgICBwYWRhcHRlci0+eG1pdHByaXYuZnJlZV94bWl0ZnJhbWVfY250IDwgKE5SX1hNSVRGUkFNRS9wc3RhcHJpdi0+YXNvY19saXN0X2NudC8yKSkgeworCQkJaWYgKHBzdGEtPnNsZWVwcV9sZW4gPiAoTlJfWE1JVEZSQU1FIC8gcHN0YXByaXYtPmFzb2NfbGlzdF9jbnQpICYmCisJCQkgICAgcGFkYXB0ZXItPnhtaXRwcml2LmZyZWVfeG1pdGZyYW1lX2NudCA8IChOUl9YTUlURlJBTUUgLyBwc3RhcHJpdi0+YXNvY19saXN0X2NudCAvIDIpKSB7CiAJCQkJREJHXzg4RSgiJXMgc3RhOiVwTSwgc2xlZXBxX2xlbjoldSwgZnJlZV94bWl0ZnJhbWVfY250OiV1LCBhc29jX2xpc3RfY250OiV1LCBjbGVhciBzbGVlcF9xXG4iLCBfX2Z1bmNfXywKIAkJCQkJKHBzdGEtPmh3YWRkciksIHBzdGEtPnNsZWVwcV9sZW4sCiAJCQkJCXBhZGFwdGVyLT54bWl0cHJpdi5mcmVlX3htaXRmcmFtZV9jbnQsCkBAIC00NzAsNyArNDcwLDcgQEAKIAkvKiBiL2cgbW9kZSByYV9iaXRtYXAgKi8KIAlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHBzdGEtPmJzc3JhdGVzZXQpOyBpKyspIHsKIAkJaWYgKHBzdGEtPmJzc3JhdGVzZXRbaV0pCi0JCQl0eF9yYV9iaXRtYXAgfD0gcnR3X2dldF9iaXRfdmFsdWVfZnJvbV9pZWVlX3ZhbHVlKHBzdGEtPmJzc3JhdGVzZXRbaV0mMHg3Zik7CisJCQl0eF9yYV9iaXRtYXAgfD0gcnR3X2dldF9iaXRfdmFsdWVfZnJvbV9pZWVlX3ZhbHVlKHBzdGEtPmJzc3JhdGVzZXRbaV0gJiAweDdmKTsKIAl9CiAJLyogbiBtb2RlIHJhX2JpdG1hcCAqLwogCWlmIChwc3RhX2h0LT5odF9vcHRpb24pIHsKQEAgLTQ4MSw4ICs0ODEsOCBAQAogCQkJbGltaXQgPSA4Oy8qICAgMVIgKi8KIAogCQlmb3IgKGkgPSAwOyBpIDwgbGltaXQ7IGkrKykgewotCQkJaWYgKHBzdGFfaHQtPmh0X2NhcC5zdXBwX21jc19zZXRbaS84XSAmIEJJVChpJTgpKQotCQkJCXR4X3JhX2JpdG1hcCB8PSBCSVQoaSsxMik7CisJCQlpZiAocHN0YV9odC0+aHRfY2FwLm1jcy5yeF9tYXNrW2kgLyA4XSAmIEJJVChpICUgOCkpCisJCQkJdHhfcmFfYml0bWFwIHw9IEJJVChpICsgMTIpOwogCQl9CiAKIAkJLyogbWF4IHNob3J0IEdJIHJhdGUgKi8KQEAgLTUwNywxOSArNTA3LDE5IEBACiAJcHN0YS0+d2lyZWxlc3NfbW9kZSA9IHN0YV9iYW5kOwogCiAJcmFpZCA9IG5ldHdvcmt0eXBlX3RvX3JhaWQoc3RhX2JhbmQpOwotCWluaXRfcmF0ZSA9IGdldF9oaWdoZXN0X3JhdGVfaWR4KHR4X3JhX2JpdG1hcCYweDBmZmZmZmZmKSYweDNmOworCWluaXRfcmF0ZSA9IGdldF9oaWdoZXN0X3JhdGVfaWR4KHR4X3JhX2JpdG1hcCAmIDB4MGZmZmZmZmYpICYgMHgzZjsKIAogCWlmIChwc3RhLT5haWQgPCBOVU1fU1RBKSB7CiAJCXU4IGFyZyA9IDA7CiAKLQkJYXJnID0gcHN0YS0+bWFjX2lkJjB4MWY7CisJCWFyZyA9IHBzdGEtPm1hY19pZCAmIDB4MWY7CiAKIAkJYXJnIHw9IEJJVCg3KTsvKiBzdXBwb3J0IGVudHJ5IDJ+MzEgKi8KIAogCQlpZiAoc2hvcnRHSXJhdGUpCiAJCQlhcmcgfD0gQklUKDUpOwogCi0JCXR4X3JhX2JpdG1hcCB8PSAoKHJhaWQ8PDI4KSYweGYwMDAwMDAwKTsKKwkJdHhfcmFfYml0bWFwIHw9ICgocmFpZCA8PCAyOCkgJiAweGYwMDAwMDAwKTsKIAogCQlEQkdfODhFKCIlcyA9PiBtYWNfaWQ6JWQgLCByYWlkOiVkICwgYml0bWFwID0gMHgleCwgYXJnID0gMHgleFxuIiwKIAkJCV9fZnVuY19fLCBwc3RhLT5tYWNfaWQsIHJhaWQsIHR4X3JhX2JpdG1hcCwgYXJnKTsKQEAgLTU3Myw3ICs1NzMsNyBAQAogCQkvKiBiL2cgbW9kZSByYV9iaXRtYXAgKi8KIAkJZm9yIChpID0gMDsgaSA8IHN1cHBvcnRSYXRlTnVtOyBpKyspIHsKIAkJCWlmIChwc3RhLT5ic3NyYXRlc2V0W2ldKQotCQkJCXR4X3JhX2JpdG1hcCB8PSBydHdfZ2V0X2JpdF92YWx1ZV9mcm9tX2llZWVfdmFsdWUocHN0YS0+YnNzcmF0ZXNldFtpXSYweDdmKTsKKwkJCQl0eF9yYV9iaXRtYXAgfD0gcnR3X2dldF9iaXRfdmFsdWVfZnJvbV9pZWVlX3ZhbHVlKHBzdGEtPmJzc3JhdGVzZXRbaV0gJiAweDdmKTsKIAkJfQogCiAJCWlmIChwY3VyX25ldHdvcmstPkNvbmZpZ3VyYXRpb24uRFNDb25maWcgPiAxNCkgewpAQCAtNTg3LDcgKzU4Nyw3IEBACiAJCX0KIAogCQlyYWlkID0gbmV0d29ya3R5cGVfdG9fcmFpZChuZXR3b3JrX3R5cGUpOwotCQlpbml0X3JhdGUgPSBnZXRfaGlnaGVzdF9yYXRlX2lkeCh0eF9yYV9iaXRtYXAmMHgwZmZmZmZmZikmMHgzZjsKKwkJaW5pdF9yYXRlID0gZ2V0X2hpZ2hlc3RfcmF0ZV9pZHgodHhfcmFfYml0bWFwICYgMHgwZmZmZmZmZikgJiAweDNmOwogCiAJCS8qIGFwIG1vZGUgKi8KIAkJcnR3X2hhbF9zZXRfb2RtX3ZhcihwYWRhcHRlciwgSEFMX09ETV9TVEFfSU5GTywgcHN0YSwgdHJ1ZSk7CkBAIC01OTcsNyArNTk3LDcgQEAKIAogCQkJYXJnID0gcHN0YS0+bWFjX2lkJjB4MWY7CiAJCQlhcmcgfD0gQklUKDcpOwotCQkJdHhfcmFfYml0bWFwIHw9ICgocmFpZDw8MjgpJjB4ZjAwMDAwMDApOworCQkJdHhfcmFfYml0bWFwIHw9ICgocmFpZCA8PCAyOCkgJiAweGYwMDAwMDAwKTsKIAkJCURCR184OEUoInVwZGF0ZV9ibWNfc3RhLCBtYXNrID0gMHgleCwgYXJnID0gMHgleFxuIiwgdHhfcmFfYml0bWFwLCBhcmcpOwogCiAJCQkvKiBiaXRtYXBbMDoyN10gPSB0eF9yYXRlX2JpdG1hcCAqLwpAQCAtNjM2LDcgKzYzNiw3IEBACiAJc3RydWN0IGh0X3ByaXYJKnBodHByaXZfYXAgPSAmcG1sbWVwcml2LT5odHByaXY7CiAJc3RydWN0IGh0X3ByaXYJKnBodHByaXZfc3RhID0gJnBzdGEtPmh0cHJpdjsKIAotCXBzdGEtPm1hY19pZCA9IHBzdGEtPmFpZCsxOworCXBzdGEtPm1hY19pZCA9IHBzdGEtPmFpZCArIDE7CiAJREJHXzg4RSgiJXNcbiIsIF9fZnVuY19fKTsKIAogCS8qIGFwIG1vZGUgKi8KQEAgLTY1OCwxMSArNjU4LDE1IEBACiAJCXBodHByaXZfc3RhLT5hbXBkdV9lbmFibGUgPSBwaHRwcml2X2FwLT5hbXBkdV9lbmFibGU7CiAKIAkJLyogY2hlY2sgaWYgc3RhIHN1cHBvcnQgcyBTaG9ydCBHSSAqLwotCQlpZiAoKHBodHByaXZfc3RhLT5odF9jYXAuY2FwX2luZm8gJiBwaHRwcml2X2FwLT5odF9jYXAuY2FwX2luZm8pICYgKElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwIHwgSUVFRTgwMjExX0hUX0NBUF9TR0lfNDApKQorCQlpZiAobGUxNl90b19jcHUocGh0cHJpdl9zdGEtPmh0X2NhcC5jYXBfaW5mbyAmCisJCQkJcGh0cHJpdl9hcC0+aHRfY2FwLmNhcF9pbmZvKSAmCisJCSAgICAoSUVFRTgwMjExX0hUX0NBUF9TR0lfMjAgfCBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCkpCiAJCQlwaHRwcml2X3N0YS0+c2dpID0gdHJ1ZTsKIAogCQkvKiAgYndtb2RlICovCi0JCWlmICgocGh0cHJpdl9zdGEtPmh0X2NhcC5jYXBfaW5mbyAmIHBodHByaXZfYXAtPmh0X2NhcC5jYXBfaW5mbykgJiBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSCkgeworCQlpZiAobGUxNl90b19jcHUocGh0cHJpdl9zdGEtPmh0X2NhcC5jYXBfaW5mbyAmCisJCQkJcGh0cHJpdl9hcC0+aHRfY2FwLmNhcF9pbmZvKSAmCisJCSAgICBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSCkgewogCQkJcGh0cHJpdl9zdGEtPmJ3bW9kZSA9IHBtbG1lZXh0LT5jdXJfYndtb2RlOwogCQkJcGh0cHJpdl9zdGEtPmNoX29mZnNldCA9IHBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0OwogCQl9CkBAIC03MDIsMTIgKzcwNiwxMiBAQAogCiAJLyogaGFuZGxlIEEtTVBEVSBwYXJhbWV0ZXIgZmllbGQgKi8KIAkvKgotCQlBTVBEVV9wYXJhIFsxOjBdOk1heCBBTVBEVSBMZW4gPT4gMDo4ayAsIDE6MTZrLCAyOjMyaywgMzo2NGsKLQkJQU1QRFVfcGFyYSBbNDoyXTpNaW4gTVBEVSBTdGFydCBTcGFjaW5nCisJCWFtcGR1X3BhcmFtc19pbmZvIFsxOjBdOk1heCBBTVBEVSBMZW4gPT4gMDo4ayAsIDE6MTZrLCAyOjMyaywgMzo2NGsKKwkJYW1wZHVfcGFyYW1zX2luZm8gWzQ6Ml06TWluIE1QRFUgU3RhcnQgU3BhY2luZwogCSovCi0JbWF4X0FNUERVX2xlbiA9IHBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50LkFNUERVX3BhcmEgJiAweDAzOworCW1heF9BTVBEVV9sZW4gPSBwbWxtZWluZm8tPkhUX2NhcHMuYW1wZHVfcGFyYW1zX2luZm8gJiAweDAzOwogCi0JbWluX01QRFVfc3BhY2luZyA9IChwbWxtZWluZm8tPkhUX2NhcHMudS5IVF9jYXBfZWxlbWVudC5BTVBEVV9wYXJhICYgMHgxYykgPj4gMjsKKwltaW5fTVBEVV9zcGFjaW5nID0gKHBtbG1laW5mby0+SFRfY2Fwcy5hbXBkdV9wYXJhbXNfaW5mbyAmIDB4MWMpID4+IDI7CiAKIAlydHdfaGFsX3NldF9od3JlZyhwYWRhcHRlciwgSFdfVkFSX0FNUERVX01JTl9TUEFDRSwgKHU4ICopKCZtaW5fTVBEVV9zcGFjaW5nKSk7CiAKQEAgLTcxNiw3ICs3MjAsNyBAQAogCS8qICAqLwogCS8qICBDb25maWcgU00gUG93ZXIgU2F2ZSBzZXR0aW5nICovCiAJLyogICovCi0JcG1sbWVpbmZvLT5TTV9QUyA9IChsZTE2X3RvX2NwdShwbWxtZWluZm8tPkhUX2NhcHMudS5IVF9jYXBfZWxlbWVudC5IVF9jYXBzX2luZm8pICYgMHgwQykgPj4gMjsKKwlwbWxtZWluZm8tPlNNX1BTID0gKGxlMTZfdG9fY3B1KHBtbG1laW5mby0+SFRfY2Fwcy5jYXBfaW5mbykgJiAweDBDKSA+PiAyOwogCWlmIChwbWxtZWluZm8tPlNNX1BTID09IFdMQU5fSFRfQ0FQX1NNX1BTX1NUQVRJQykKIAkJREJHXzg4RSgiJXMoKTogV0xBTl9IVF9DQVBfU01fUFNfU1RBVElDXG4iLCBfX2Z1bmNfXyk7CiB9CkBAIC03NDYsNyArNzUwLDcgQEAKIAkvKiBjaGVjayBpZiB0aGVyZSBpcyB3cHMgaWUsICovCiAJLyogaWYgdGhlcmUgaXMgd3BzaWUgaW4gYmVhY29uLCB0aGUgaG9zdGFwZCB3aWxsIHVwZGF0ZSBiZWFjb24gdHdpY2Ugd2hlbiBzdGF0aW5nIGhvc3RhcGQsICovCiAJLyogYW5kIGF0IGZpcnN0IHRpbWUgdGhlIHNlY3VyaXR5IGllIChSU04vV1BBIElFKSB3aWxsIG5vdCBpbmNsdWRlIGluIGJlYWNvbi4gKi8KLQlpZiAoIXJ0d19nZXRfd3BzX2llKHBuZXR3b3JrLT5JRXMrX0ZJWEVEX0lFX0xFTkdUSF8sIHBuZXR3b3JrLT5JRUxlbmd0aC1fRklYRURfSUVfTEVOR1RIXywgTlVMTCwgTlVMTCkpCisJaWYgKCFydHdfZ2V0X3dwc19pZShwbmV0d29yay0+SUVzICsgX0ZJWEVEX0lFX0xFTkdUSF8sIHBuZXR3b3JrLT5JRUxlbmd0aCAtIF9GSVhFRF9JRV9MRU5HVEhfLCBOVUxMLCBOVUxMKSkKIAkJcG1sbWVleHQtPmJzdGFydF9ic3MgPSB0cnVlOwogCiAJLyogdG9kbzogdXBkYXRlIHdtbSwgaHQgY2FwICovCkBAIC03OTksNyArODAzLDcgQEAKIAkvKiBzZXQgY2hhbm5lbCwgYndtb2RlICovCiAJcCA9IHJ0d19nZXRfaWUoKHBuZXR3b3JrLT5JRXMgKyBzaXplb2Yoc3RydWN0IG5kaXNfODAyXzExX2ZpeGVkX2llKSksIF9IVF9BRERfSU5GT19JRV8sICZpZV9sZW4sIChwbmV0d29yay0+SUVMZW5ndGggLSBzaXplb2Yoc3RydWN0IG5kaXNfODAyXzExX2ZpeGVkX2llKSkpOwogCWlmIChwICYmIGllX2xlbikgewotCQlwaHRfaW5mbyA9IChzdHJ1Y3QgSFRfaW5mb19lbGVtZW50ICopKHArMik7CisJCXBodF9pbmZvID0gKHN0cnVjdCBIVF9pbmZvX2VsZW1lbnQgKikocCArIDIpOwogCiAJCWlmICgocHJlZ3ByaXYtPmNidzQwX2VuYWJsZSkgJiYJIChwaHRfaW5mby0+aW5mb3NbMF0gJiBCSVQoMikpKSB7CiAJCQkvKiBzd2l0Y2ggdG8gdGhlIDQwTSBIeiBtb2RlICovCkBAIC05MzAsMTUgKzkzNCwxNSBAQAogCW1lbXNldChzdXBwb3J0UmF0ZSwgMCwgTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYKTsKIAkvKiAgZ2V0IHN1cHBvcnRlZCByYXRlcyAqLwogCXAgPSBydHdfZ2V0X2llKGllICsgX0JFQUNPTl9JRV9PRkZTRVRfLCBfU1VQUE9SVEVEUkFURVNfSUVfLCAmaWVfbGVuLCAocGJzc19uZXR3b3JrLT5JRUxlbmd0aCAtIF9CRUFDT05fSUVfT0ZGU0VUXykpOwotCWlmIChwICE9ICBOVUxMKSB7Ci0JCW1lbWNweShzdXBwb3J0UmF0ZSwgcCsyLCBpZV9sZW4pOworCWlmIChwKSB7CisJCW1lbWNweShzdXBwb3J0UmF0ZSwgcCArIDIsIGllX2xlbik7CiAJCXN1cHBvcnRSYXRlTnVtID0gaWVfbGVuOwogCX0KIAogCS8qIGdldCBleHRfc3VwcG9ydGVkIHJhdGVzICovCiAJcCA9IHJ0d19nZXRfaWUoaWUgKyBfQkVBQ09OX0lFX09GRlNFVF8sIF9FWFRfU1VQUE9SVEVEUkFURVNfSUVfLCAmaWVfbGVuLCBwYnNzX25ldHdvcmstPklFTGVuZ3RoIC0gX0JFQUNPTl9JRV9PRkZTRVRfKTsKLQlpZiAocCAhPSAgTlVMTCkgewotCQltZW1jcHkoc3VwcG9ydFJhdGUrc3VwcG9ydFJhdGVOdW0sIHArMiwgaWVfbGVuKTsKKwlpZiAocCkgeworCQltZW1jcHkoc3VwcG9ydFJhdGUgKyBzdXBwb3J0UmF0ZU51bSwgcCArIDIsIGllX2xlbik7CiAJCXN1cHBvcnRSYXRlTnVtICs9IGllX2xlbjsKIAl9CiAKQEAgLTk2Niw3ICs5NzAsNyBAQAogCXBzZWN1cml0eXByaXYtPndwYTJfcGFpcndpc2VfY2lwaGVyID0gX05PX1BSSVZBQ1lfOwogCXAgPSBydHdfZ2V0X2llKGllICsgX0JFQUNPTl9JRV9PRkZTRVRfLCBfUlNOX0lFXzJfLCAmaWVfbGVuLCAocGJzc19uZXR3b3JrLT5JRUxlbmd0aCAtIF9CRUFDT05fSUVfT0ZGU0VUXykpOwogCWlmIChwICYmIGllX2xlbiA+IDApIHsKLQkJaWYgKHJ0d19wYXJzZV93cGEyX2llKHAsIGllX2xlbisyLCAmZ3JvdXBfY2lwaGVyLCAmcGFpcndpc2VfY2lwaGVyLCBOVUxMKSA9PSBfU1VDQ0VTUykgeworCQlpZiAocnR3X3BhcnNlX3dwYTJfaWUocCwgaWVfbGVuICsgMiwgJmdyb3VwX2NpcGhlciwgJnBhaXJ3aXNlX2NpcGhlciwgTlVMTCkgPT0gX1NVQ0NFU1MpIHsKIAkJCXBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG0gPSBkb3QxMUF1dGhBbGdydGhtXzgwMjFYOwogCiAJCQlwc2VjdXJpdHlwcml2LT5kb3Q4MDIxeGFsZyA9IDE7LyogcHNrLCAgdG9kbzo4MDIuMXggKi8KQEAgLTk4NSw4ICs5ODksOCBAQAogCWZvciAocCA9IGllICsgX0JFQUNPTl9JRV9PRkZTRVRfOzsgcCArPSAoaWVfbGVuICsgMikpIHsKIAkJcCA9IHJ0d19nZXRfaWUocCwgX1NTTl9JRV8xXywgJmllX2xlbiwKIAkJCSAgICAgICAocGJzc19uZXR3b3JrLT5JRUxlbmd0aCAtIF9CRUFDT05fSUVfT0ZGU0VUXyAtIChpZV9sZW4gKyAyKSkpOwotCQlpZiAoKHApICYmICghbWVtY21wKHArMiwgT1VJMSwgNCkpKSB7Ci0JCQlpZiAocnR3X3BhcnNlX3dwYV9pZShwLCBpZV9sZW4rMiwgJmdyb3VwX2NpcGhlciwKKwkJaWYgKChwKSAmJiAoIW1lbWNtcChwICsgMiwgT1VJMSwgNCkpKSB7CisJCQlpZiAocnR3X3BhcnNlX3dwYV9pZShwLCBpZV9sZW4gKyAyLCAmZ3JvdXBfY2lwaGVyLAogCQkJCQkgICAgICZwYWlyd2lzZV9jaXBoZXIsIE5VTEwpID09IF9TVUNDRVNTKSB7CiAJCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSA9IGRvdDExQXV0aEFsZ3J0aG1fODAyMVg7CiAKQEAgLTEwMTAsMTAgKzEwMTQsMTAgQEAKIAkJZm9yIChwID0gaWUgKyBfQkVBQ09OX0lFX09GRlNFVF87OyBwICs9IChpZV9sZW4gKyAyKSkgewogCQkJcCA9IHJ0d19nZXRfaWUocCwgX1ZFTkRPUl9TUEVDSUZJQ19JRV8sICZpZV9sZW4sCiAJCQkJICAgICAgIChwYnNzX25ldHdvcmstPklFTGVuZ3RoIC0gX0JFQUNPTl9JRV9PRkZTRVRfIC0gKGllX2xlbiArIDIpKSk7Ci0JCQlpZiAoKHApICYmICFtZW1jbXAocCsyLCBXTU1fUEFSQV9JRSwgNikpIHsKKwkJCWlmICgocCkgJiYgIW1lbWNtcChwICsgMiwgV01NX1BBUkFfSUUsIDYpKSB7CiAJCQkJcG1sbWVwcml2LT5xb3Nwcml2LnFvc19vcHRpb24gPSAxOwogCi0JCQkJKihwKzgpIHw9IEJJVCg3KTsvKiBRb1MgSW5mbywgc3VwcG9ydCBVLUFQU0QgKi8KKwkJCQkqKHAgKyA4KSB8PSBCSVQoNyk7LyogUW9TIEluZm8sIHN1cHBvcnQgVS1BUFNEICovCiAKIAkJCQkvKiBkaXNhYmxlIGFsbCBBQ00gYml0cyBzaW5jZSB0aGUgV01NIGFkbWlzc2lvbiBjb250cm9sIGlzIG5vdCBzdXBwb3J0ZWQgKi8KIAkJCQkqKHAgKyAxMCkgJj0gfkJJVCg0KTsgLyogQkUgKi8KQEAgLTEwMzIsNyArMTAzNiw3IEBACiAJCSAgICAgICAocGJzc19uZXR3b3JrLT5JRUxlbmd0aCAtIF9CRUFDT05fSUVfT0ZGU0VUXykpOwogCWlmIChwICYmIGllX2xlbiA+IDApIHsKIAkJdTggcmZfdHlwZTsKLQkJc3RydWN0IHJ0d19pZWVlODAyMTFfaHRfY2FwICpwaHRfY2FwID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCAqKShwKzIpOworCQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqcGh0X2NhcCA9IChzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqKShwICsgMik7CiAKIAkJcEhUX2NhcHNfaWUgPSBwOwogCQlodF9jYXAgPSB0cnVlOwpAQCAtMTA0Miw3ICsxMDQ2LDcgQEAKIAogCQlpZiAoKHBzZWN1cml0eXByaXYtPndwYV9wYWlyd2lzZV9jaXBoZXIgJiBXUEFfQ0lQSEVSX0NDTVApIHx8CiAJCSAgICAocHNlY3VyaXR5cHJpdi0+d3BhMl9wYWlyd2lzZV9jaXBoZXIgJiBXUEFfQ0lQSEVSX0NDTVApKQotCQkJcGh0X2NhcC0+YW1wZHVfcGFyYW1zX2luZm8gfD0gKElFRUU4MDIxMV9IVF9DQVBfQU1QRFVfREVOU0lUWSYoMHgwNzw8MikpOworCQkJcGh0X2NhcC0+YW1wZHVfcGFyYW1zX2luZm8gfD0gKElFRUU4MDIxMV9IVF9DQVBfQU1QRFVfREVOU0lUWSAmICgweDA3IDw8IDIpKTsKIAkJZWxzZQogCQkJcGh0X2NhcC0+YW1wZHVfcGFyYW1zX2luZm8gfD0gKElFRUU4MDIxMV9IVF9DQVBfQU1QRFVfREVOU0lUWSYweDAwKTsKIApAQCAtMTA1MCw4ICsxMDU0LDggQEAKIAkJcGh0X2NhcC0+YW1wZHVfcGFyYW1zX2luZm8gfD0gKElFRUU4MDIxMV9IVF9DQVBfQU1QRFVfRkFDVE9SICYgMHgwMyk7CiAKIAkJaWYgKHJmX3R5cGUgPT0gUkZfMVQxUikgewotCQkJcGh0X2NhcC0+c3VwcF9tY3Nfc2V0WzBdID0gMHhmZjsKLQkJCXBodF9jYXAtPnN1cHBfbWNzX3NldFsxXSA9IDB4MDsKKwkJCXBodF9jYXAtPm1jcy5yeF9tYXNrWzBdID0gMHhmZjsKKwkJCXBodF9jYXAtPm1jcy5yeF9tYXNrWzFdID0gMHgwOwogCQl9CiAJCW1lbWNweSgmcG1sbWVwcml2LT5odHByaXYuaHRfY2FwLCBwKzIsIGllX2xlbik7CiAJfQpAQCAtMTE0Myw3ICsxMTQ3LDcgQEAKIAogCURCR184OEUoIiVzKGFjbF9udW0gPSVkKSA9JXBNXG4iLCBfX2Z1bmNfXywgcGFjbF9saXN0LT5udW0sIChhZGRyKSk7CiAKLQlpZiAoKE5VTV9BQ0wtMSkgPCBwYWNsX2xpc3QtPm51bSkKKwlpZiAoKE5VTV9BQ0wgLSAxKSA8IHBhY2xfbGlzdC0+bnVtKQogCQlyZXR1cm4gLTE7CiAKIAlzcGluX2xvY2tfYmgoJihwYWNsX25vZGVfcS0+bG9jaykpOwpAQCAtMTQyMiw3ICsxNDI2LDggQEAKIAlpZiAocG1sbWVwcml2LT5udW1fc3RhX25vX2h0IHx8CiAJICAgIChwbWxtZXByaXYtPmh0X29wX21vZGUgJiBIVF9JTkZPX09QRVJBVElPTl9NT0RFX05PTl9HRl9ERVZTX1BSRVNFTlQpKQogCQluZXdfb3BfbW9kZSA9IE9QX01PREVfTUlYRUQ7Ci0JZWxzZSBpZiAoKHBodHByaXZfYXAtPmh0X2NhcC5jYXBfaW5mbyAmIElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIKSAmJgorCWVsc2UgaWYgKChsZTE2X3RvX2NwdShwaHRwcml2X2FwLT5odF9jYXAuY2FwX2luZm8pICYKKwkJICBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSCkgJiYKIAkJIHBtbG1lcHJpdi0+bnVtX3N0YV9odF8yMG1oeikKIAkJbmV3X29wX21vZGUgPSBPUF9NT0RFXzIwTUhaX0hUX1NUQV9BU1NPQ0VEOwogCWVsc2UgaWYgKHBtbG1lcHJpdi0+b2xiY19odCkKQEAgLTE1NTIsNyArMTU1Nyw3IEBACiAJfQogCiAJaWYgKHBzdGEtPmZsYWdzICYgV0xBTl9TVEFfSFQpIHsKLQkJdTE2IGh0X2NhcGFiID0gcHN0YS0+aHRwcml2Lmh0X2NhcC5jYXBfaW5mbzsKKwkJdTE2IGh0X2NhcGFiID0gbGUxNl90b19jcHUocHN0YS0+aHRwcml2Lmh0X2NhcC5jYXBfaW5mbyk7CiAKIAkJREJHXzg4RSgiSFQ6IFNUQSAlcE0gSFQgQ2FwYWJpbGl0aWVzIEluZm86IDB4JTA0eFxuIiwKIAkJCShwc3RhLT5od2FkZHIpLCBodF9jYXBhYik7CkBAIC0xNzEwLDQwICsxNzE1LDYgQEAKIAlyZXR1cm4gYmVhY29uX3VwZGF0ZWQ7CiB9CiAKLWludCBydHdfYXBfaW5mb3JtX2NoX3N3aXRjaChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHU4IG5ld19jaCwgdTggY2hfb2Zmc2V0KQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkLCAqcGxpc3Q7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhID0gTlVMTDsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8JKnBtbG1laW5mbyA9ICYocG1sbWVleHQtPm1sbWV4dF9pbmZvKTsKLQl1OCBiY19hZGRyW0VUSF9BTEVOXSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKLQotCWlmICgocG1sbWVpbmZvLT5zdGF0ZSYweDAzKSAhPSBXSUZJX0ZXX0FQX1NUQVRFKQotCQlyZXR1cm4gMDsKLQotCURCR184OEUoRlVOQ19OREVWX0ZNVCIgd2l0aCBjaDoldSwgb2Zmc2V0OiV1XG4iLAotCQlGVU5DX05ERVZfQVJHKHBhZGFwdGVyLT5wbmV0ZGV2KSwgbmV3X2NoLCBjaF9vZmZzZXQpOwotCi0Jc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwotCXBoZWFkID0gJnBzdGFwcml2LT5hc29jX2xpc3Q7Ci0JcGxpc3QgPSBwaGVhZC0+bmV4dDsKLQotCS8qIGZvciBlYWNoIHN0YSBpbiBhc29jX3F1ZXVlICovCi0Jd2hpbGUgKHBoZWFkICE9IHBsaXN0KSB7Ci0JCXBzdGEgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCBzdGFfaW5mbywgYXNvY19saXN0KTsKLQkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKLQotCQlpc3N1ZV9hY3Rpb25fc3BjdF9jaF9zd2l0Y2gocGFkYXB0ZXIsIHBzdGEtPmh3YWRkciwgbmV3X2NoLCBjaF9vZmZzZXQpOwotCQlwc3RhLT5leHBpcmVfdG8gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHBzdGFwcml2LT5leHBpcmVfdG8gKiAyLCA1KTsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0KLQlpc3N1ZV9hY3Rpb25fc3BjdF9jaF9zd2l0Y2gocGFkYXB0ZXIsIGJjX2FkZHIsIG5ld19jaCwgY2hfb2Zmc2V0KTsKLQotCXJldHVybiAwOwotfQotCiBpbnQgcnR3X3N0YV9mbHVzaChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQsICpwbGlzdDsKQEAgLTE4NTYsOSArMTgyNyw2IEBACiAJcG1sbWVwcml2LT53cHNfcHJvYmVfcmVzcF9pZSA9IE5VTEw7CiAJcG1sbWVwcml2LT53cHNfYXNzb2NfcmVzcF9pZSA9IE5VTEw7CiAKLQlwbWxtZXByaXYtPnAycF9iZWFjb25faWUgPSBOVUxMOwotCXBtbG1lcHJpdi0+cDJwX3Byb2JlX3Jlc3BfaWUgPSBOVUxMOwotCiAJLyogZm9yIEFDTCAqLwogCUlOSVRfTElTVF9IRUFEKCYocGFjbF9saXN0LT5hY2xfbm9kZV9xLnF1ZXVlKSk7CiAJcGFjbF9saXN0LT5udW0gPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19jbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfY21kLmMKaW5kZXggNzc0ODUyMy4uZjFmNDc4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19jbWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2NtZC5jCkBAIC0yNyw4ICsyNyw4IEBACiAKIGludCBydHdfaW5pdF9jbWRfcHJpdihzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2KQogewotCXNlbWFfaW5pdCgmKHBjbWRwcml2LT5jbWRfcXVldWVfc2VtYSksIDApOwotCXNlbWFfaW5pdCgmKHBjbWRwcml2LT50ZXJtaW5hdGVfY21kdGhyZWFkX3NlbWEpLCAwKTsKKwlpbml0X2NvbXBsZXRpb24oJnBjbWRwcml2LT5jbWRfcXVldWVfY29tcCk7CisJaW5pdF9jb21wbGV0aW9uKCZwY21kcHJpdi0+dGVybWluYXRlX2NtZHRocmVhZF9jb21wKTsKIAogCV9ydHdfaW5pdF9xdWV1ZSgmKHBjbWRwcml2LT5jbWRfcXVldWUpKTsKIAlyZXR1cm4gX1NVQ0NFU1M7CkBAIC04NSw3ICs4NSw3IEBACiAJLyogVG8gZGVjaWRlIGFsbG93IG9yIG5vdCAqLwogCWlmICgocGNtZHByaXYtPnBhZGFwdGVyLT5wd3JjdHJscHJpdi5iSFdQd3JQaW5kZXRlY3QpICYmCiAJICAgICghcGNtZHByaXYtPnBhZGFwdGVyLT5yZWdpc3RyeXByaXYudXNic3NfZW5hYmxlKSkgewotCQlpZiAoY21kX29iai0+Y21kY29kZSA9PSBHRU5fQ01EX0NPREUoX1NldF9EcnZfRXh0cmEpKSB7CisJCWlmIChjbWRfb2JqLT5jbWRjb2RlID09IF9TZXRfRHJ2X0V4dHJhX0NNRF8pIHsKIAkJCXN0cnVjdCBkcnZleHRyYV9jbWRfcGFybQkqcGRydmV4dHJhX2NtZF9wYXJtID0gKHN0cnVjdCBkcnZleHRyYV9jbWRfcGFybQkqKWNtZF9vYmotPnBhcm1idWY7CiAKIAkJCWlmIChwZHJ2ZXh0cmFfY21kX3Bhcm0tPmVjX2lkID09IFBPV0VSX1NBVklOR19DVFJMX1dLX0NJRCkKQEAgLTkzLDcgKzkzLDcgQEAKIAkJfQogCX0KIAotCWlmIChjbWRfb2JqLT5jbWRjb2RlID09IEdFTl9DTURfQ09ERShfU2V0Q2hhbm5lbFBsYW4pKQorCWlmIChjbWRfb2JqLT5jbWRjb2RlID09IF9TZXRDaGFubmVsUGxhbl9DTURfKQogCQliQWxsb3cgPSB0cnVlOwogCiAJaWYgKCghcGNtZHByaXYtPnBhZGFwdGVyLT5od19pbml0X2NvbXBsZXRlZCAmJiAhYkFsbG93KSB8fApAQCAtMTIyLDcgKzEyMiw3IEBACiAJcmVzID0gX3J0d19lbnF1ZXVlX2NtZCgmcGNtZHByaXYtPmNtZF9xdWV1ZSwgY21kX29iaik7CiAKIAlpZiAocmVzID09IF9TVUNDRVNTKQotCQl1cCgmcGNtZHByaXYtPmNtZF9xdWV1ZV9zZW1hKTsKKwkJY29tcGxldGUoJnBjbWRwcml2LT5jbWRfcXVldWVfY29tcCk7CiAKIGV4aXQ6CiAKQEAgLTE2MiwxMiArMTYyLDEyIEBACiAJYWxsb3dfc2lnbmFsKFNJR1RFUk0pOwogCiAJcGNtZHByaXYtPmNtZHRoZF9ydW5uaW5nID0gdHJ1ZTsKLQl1cCgmcGNtZHByaXYtPnRlcm1pbmF0ZV9jbWR0aHJlYWRfc2VtYSk7CisJY29tcGxldGUoJnBjbWRwcml2LT50ZXJtaW5hdGVfY21kdGhyZWFkX2NvbXApOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9pbmZvXywgKCJzdGFydCByODcxeCBydHdfY21kX3RocmVhZCAhISEhXG4iKSk7CiAKIAl3aGlsZSAoMSkgewotCQlpZiAoX3J0d19kb3duX3NlbWEoJnBjbWRwcml2LT5jbWRfcXVldWVfc2VtYSkgPT0gX0ZBSUwpCisJCWlmICh3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJnBjbWRwcml2LT5jbWRfcXVldWVfY29tcCkpCiAJCQlicmVhazsKIAogCQlpZiAocGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8CkBAIC0yMzQsNyArMjM0LDcgQEAKIAkJcnR3X2ZyZWVfY21kX29iaihwY21kKTsKIAl9CiAKLQl1cCgmcGNtZHByaXYtPnRlcm1pbmF0ZV9jbWR0aHJlYWRfc2VtYSk7CisJY29tcGxldGUoJnBjbWRwcml2LT50ZXJtaW5hdGVfY21kdGhyZWFkX2NvbXApOwogCiAKIAljb21wbGV0ZV9hbmRfZXhpdChOVUxMLCAwKTsKQEAgLTI3MSw3ICsyNzEsNyBAQAogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9pbmZvXywgKCIlczogZmx1c2ggbmV0d29yayBxdWV1ZVxuIiwgX19mdW5jX18pKTsKIAotCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHBzdXJ2ZXlQYXJhLCBHRU5fQ01EX0NPREUoX1NpdGVTdXJ2ZXkpKTsKKwlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwc3VydmV5UGFyYSwgX1NpdGVTdXJ2ZXlfQ01EXyk7CiAKIAkvKiBwc3VydmV5UGFyYS0+YnNzbGltaXQgPSA0ODsgKi8KIAlwc3VydmV5UGFyYS0+c2Nhbl9tb2RlID0gcG1sbWVwcml2LT5zY2FuX21vZGU7CkBAIC0zMDUsOCArMzA1LDYgQEAKIAlyZXMgPSBydHdfZW5xdWV1ZV9jbWQocGNtZHByaXYsIHBoMmMpOwogCiAJaWYgKHJlcyA9PSBfU1VDQ0VTUykgewotCQlwbWxtZXByaXYtPnNjYW5fc3RhcnRfdGltZSA9IGppZmZpZXM7Ci0KIAkJbW9kX3RpbWVyKCZwbWxtZXByaXYtPnNjYW5fdG9fdGltZXIsCiAJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKFNDQU5OSU5HX1RJTUVPVVQpKTsKIApAQCAtNDkxLDcgKzQ4OSw3IEBACiAJcGNtZC0+Y21kc3ogPSBnZXRfd2xhbl9ic3NpZF9leF9zeihwc2VjbmV0d29yayk7LyogZ2V0IGNtZHN6IGJlZm9yZSBlbmRpYW4gY29udmVyc2lvbiAqLwogCiAJSU5JVF9MSVNUX0hFQUQoJnBjbWQtPmxpc3QpOwotCXBjbWQtPmNtZGNvZGUgPSBfSm9pbkJzc19DTURfOy8qIEdFTl9DTURfQ09ERShfSm9pbkJzcykgKi8KKwlwY21kLT5jbWRjb2RlID0gX0pvaW5Cc3NfQ01EXzsKIAlwY21kLT5wYXJtYnVmID0gKHVuc2lnbmVkIGNoYXIgKilwc2VjbmV0d29yazsKIAlwY21kLT5yc3AgPSBOVUxMOwogCXBjbWQtPnJzcHN6ID0gMDsKQEAgLTY3MCwxMyArNjY4LDEzIEBACiAJdTgJcmVzID0gX1NVQ0NFU1M7CiAKIAotCXBoMmMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaiksIEdGUF9LRVJORUwpOworCXBoMmMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaiksIEdGUF9BVE9NSUMpOwogCWlmICghcGgyYykgewogCQlyZXMgPSBfRkFJTDsKIAkJZ290byBleGl0OwogCX0KIAotCXBhZGRiYXJlcV9wYXJtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFkZEJhUmVxX3Bhcm0pLCBHRlBfS0VSTkVMKTsKKwlwYWRkYmFyZXFfcGFybSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZGRCYVJlcV9wYXJtKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFwYWRkYmFyZXFfcGFybSkgewogCQlrZnJlZShwaDJjKTsKIAkJcmVzID0gX0ZBSUw7CkBAIC02ODYsNyArNjg0LDcgQEAKIAlwYWRkYmFyZXFfcGFybS0+dGlkID0gdGlkOwogCW1lbWNweShwYWRkYmFyZXFfcGFybS0+YWRkciwgYWRkciwgRVRIX0FMRU4pOwogCi0JaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcGFkZGJhcmVxX3Bhcm0sIEdFTl9DTURfQ09ERShfQWRkQkFSZXEpKTsKKwlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwYWRkYmFyZXFfcGFybSwgX0FkZEJBUmVxX0NNRF8pOwogCiAJLyogREJHXzg4RSgicnR3X2FkZGJhcmVxX2NtZCwgdGlkID0lZFxuIiwgdGlkKTsgKi8KIApAQCAtNzI0LDcgKzcyMiw3IEBACiAJcGRydmV4dHJhX2NtZF9wYXJtLT50eXBlX3NpemUgPSAwOwogCXBkcnZleHRyYV9jbWRfcGFybS0+cGJ1ZiA9ICh1OCAqKXBhZGFwdGVyOwogCi0JaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcGRydmV4dHJhX2NtZF9wYXJtLCBHRU5fQ01EX0NPREUoX1NldF9EcnZfRXh0cmEpKTsKKwlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwZHJ2ZXh0cmFfY21kX3Bhcm0sIF9TZXRfRHJ2X0V4dHJhX0NNRF8pOwogCiAKIAkvKiBydHdfZW5xdWV1ZV9jbWQocGNtZHByaXYsIHBoMmMpOyAqLwpAQCAtNzY3LDcgKzc2NSw3IEBACiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAotCQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwY21kb2JqLCBzZXRDaGFubmVsUGxhbl9wYXJhbSwgR0VOX0NNRF9DT0RFKF9TZXRDaGFubmVsUGxhbikpOworCQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwY21kb2JqLCBzZXRDaGFubmVsUGxhbl9wYXJhbSwgX1NldENoYW5uZWxQbGFuX0NNRF8pOwogCQlyZXMgPSBydHdfZW5xdWV1ZV9jbWQocGNtZHByaXYsIHBjbWRvYmopOwogCX0gZWxzZSB7CiAJCS8qIG5vIG5lZWQgdG8gZW5xdWV1ZSwgZG8gdGhlIGNtZCBoZGwgZGlyZWN0bHkgYW5kIGZyZWUgY21kIHBhcmFtZXRlciAqLwpAQCAtOTM2LDcgKzkzNCw3IEBACiAJCXBkcnZleHRyYV9jbWRfcGFybS0+dHlwZV9zaXplID0gbHBzX2N0cmxfdHlwZTsKIAkJcGRydmV4dHJhX2NtZF9wYXJtLT5wYnVmID0gTlVMTDsKIAotCQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwZHJ2ZXh0cmFfY21kX3Bhcm0sIEdFTl9DTURfQ09ERShfU2V0X0Rydl9FeHRyYSkpOworCQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwZHJ2ZXh0cmFfY21kX3Bhcm0sIF9TZXRfRHJ2X0V4dHJhX0NNRF8pOwogCiAJCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7CiAJfSBlbHNlIHsKQEAgLTk3OCw3ICs5NzYsNyBAQAogCXBkcnZleHRyYV9jbWRfcGFybS0+ZWNfaWQgPSBSVFBfVElNRVJfQ0ZHX1dLX0NJRDsKIAlwZHJ2ZXh0cmFfY21kX3Bhcm0tPnR5cGVfc2l6ZSA9IG1pbl90aW1lOwogCXBkcnZleHRyYV9jbWRfcGFybS0+cGJ1ZiA9IE5VTEw7Ci0JaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcGRydmV4dHJhX2NtZF9wYXJtLCBHRU5fQ01EX0NPREUoX1NldF9EcnZfRXh0cmEpKTsKKwlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwZHJ2ZXh0cmFfY21kX3Bhcm0sIF9TZXRfRHJ2X0V4dHJhX0NNRF8pOwogCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7CiBleGl0OgogCkBAIC0xMDIwLDcgKzEwMTgsNyBAQAogCQlwZHJ2ZXh0cmFfY21kX3Bhcm0tPmVjX2lkID0gQU5UX1NFTEVDVF9XS19DSUQ7CiAJCXBkcnZleHRyYV9jbWRfcGFybS0+dHlwZV9zaXplID0gYW50ZW5uYTsKIAkJcGRydmV4dHJhX2NtZF9wYXJtLT5wYnVmID0gTlVMTDsKLQkJaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcGRydmV4dHJhX2NtZF9wYXJtLCBHRU5fQ01EX0NPREUoX1NldF9EcnZfRXh0cmEpKTsKKwkJaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcGRydmV4dHJhX2NtZF9wYXJtLCBfU2V0X0Rydl9FeHRyYV9DTURfKTsKIAogCQlyZXMgPSBydHdfZW5xdWV1ZV9jbWQocGNtZHByaXYsIHBoMmMpOwogCX0gZWxzZSB7CkBAIC0xMDQ4LDcgKzEwNDYsNyBAQAogCiAJcGRydmV4dHJhX2NtZF9wYXJtLT5lY19pZCA9IFBPV0VSX1NBVklOR19DVFJMX1dLX0NJRDsKIAlwZHJ2ZXh0cmFfY21kX3Bhcm0tPnBidWYgPSBOVUxMOwotCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBwc2NtZCwgcGRydmV4dHJhX2NtZF9wYXJtLCBHRU5fQ01EX0NPREUoX1NldF9EcnZfRXh0cmEpKTsKKwlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwcHNjbWQsIHBkcnZleHRyYV9jbWRfcGFybSwgX1NldF9EcnZfRXh0cmFfQ01EXyk7CiAKIAlyZXR1cm4gcnR3X2VucXVldWVfY21kKHBjbWRwcml2LCBwcHNjbWQpOwogfQpAQCAtMTExOSw3ICsxMTE3LDcgQEAKIAlwZHJ2ZXh0cmFfY21kX3Bhcm0tPnR5cGVfc2l6ZSA9IDA7CiAJcGRydmV4dHJhX2NtZF9wYXJtLT5wYnVmID0gTlVMTDsKIAotCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHBkcnZleHRyYV9jbWRfcGFybSwgR0VOX0NNRF9DT0RFKF9TZXRfRHJ2X0V4dHJhKSk7CisJaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcGRydmV4dHJhX2NtZF9wYXJtLCBfU2V0X0Rydl9FeHRyYV9DTURfKTsKIAogCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7CiBleGl0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19kZWJ1Zy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19kZWJ1Zy5jCmluZGV4IGRiNWM5NTIuLjYwZDhjN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfZGVidWcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2RlYnVnLmMKQEAgLTEzOCwxNDQgKzEzOCw2IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1pbnQgcHJvY19nZXRfZndzdGF0ZShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCi0JaW50IGxlbiA9IDA7Ci0KLQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJmd3N0YXRlPTB4JXhcbiIsIGdldF9md3N0YXRlKHBtbG1lcHJpdikpOwotCi0JKmVvZiA9IDE7Ci0JcmV0dXJuIGxlbjsKLX0KLQotaW50IHByb2NfZ2V0X3NlY19pbmZvKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0KLQlpbnQgbGVuID0gMDsKLQotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgImF1dGhfYWxnPTB4JXgsIGVuY19hbGc9MHgleCwgYXV0aF90eXBlPTB4JXgsIGVuY190eXBlPTB4JXhcbiIsCi0JCQkJCQlwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtLCBwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtLAotCQkJCQkJcHNlY3VyaXR5cHJpdi0+bmRpc2F1dGh0eXBlLCBwc2VjdXJpdHlwcml2LT5uZGlzZW5jcnlwdHN0YXR1cyk7Ci0KLQkqZW9mID0gMTsKLQlyZXR1cm4gbGVuOwotfQotCi1pbnQgcHJvY19nZXRfbWxtZXh0X3N0YXRlKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8JKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlpbnQgbGVuID0gMDsKLQotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgInBtbG1laW5mby0+c3RhdGU9MHgleFxuIiwgcG1sbWVpbmZvLT5zdGF0ZSk7Ci0KLQkqZW9mID0gMTsKLQlyZXR1cm4gbGVuOwotfQotCi1pbnQgcHJvY19nZXRfcW9zX29wdGlvbihjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCi0JaW50IGxlbiA9IDA7Ci0KLQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJxb3Nfb3B0aW9uPSVkXG4iLCBwbWxtZXByaXYtPnFvc3ByaXYucW9zX29wdGlvbik7Ci0KLQkqZW9mID0gMTsKLQlyZXR1cm4gbGVuOwotfQotCi1pbnQgcHJvY19nZXRfaHRfb3B0aW9uKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlpbnQgbGVuID0gMDsKLQotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgImh0X29wdGlvbj0lZFxuIiwgcG1sbWVwcml2LT5odHByaXYuaHRfb3B0aW9uKTsKLQkqZW9mID0gMTsKLQlyZXR1cm4gbGVuOwotfQotCi1pbnQgcHJvY19nZXRfcmZfaW5mbyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCWludCBsZW4gPSAwOwotCi0JbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiY3VyX2NoPSVkLCBjdXJfYnc9JWQsIGN1cl9jaF9vZmZzZXQ9JWRcbiIsCi0JCQkJCXBtbG1lZXh0LT5jdXJfY2hhbm5lbCwgcG1sbWVleHQtPmN1cl9id21vZGUsIHBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0KTsKLQkqZW9mID0gMTsKLQlyZXR1cm4gbGVuOwotfQotCi1pbnQgcHJvY19nZXRfYXBfaW5mbyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCB3bGFuX25ldHdvcmsgKmN1cl9uZXR3b3JrID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcms7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQlpbnQgbGVuID0gMDsKLQotCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8ocHN0YXByaXYsIGN1cl9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpOwotCWlmIChwc3RhKSB7Ci0JCWludCBpOwotCQlzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmw7Ci0KLQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiU1NJRD0lc1xuIiwgY3VyX25ldHdvcmstPm5ldHdvcmsuU3NpZC5Tc2lkKTsKLQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAic3RhJ3MgbWFjYWRkcjolcE1cbiIsIHBzdGEtPmh3YWRkcik7Ci0JCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgImN1cl9jaGFubmVsPSVkLCBjdXJfYndtb2RlPSVkLCBjdXJfY2hfb2Zmc2V0PSVkXG4iLCBwbWxtZWV4dC0+Y3VyX2NoYW5uZWwsIHBtbG1lZXh0LT5jdXJfYndtb2RlLCBwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCk7Ci0JCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgInJ0c2VuPSVkLCBjdHMyc2xlZj0lZFxuIiwgcHN0YS0+cnRzZW4sIHBzdGEtPmN0czJzZWxmKTsKLQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAic3RhdGU9MHgleCwgYWlkPSVkLCBtYWNpZD0lZCwgcmFpZD0lZFxuIiwgcHN0YS0+c3RhdGUsIHBzdGEtPmFpZCwgcHN0YS0+bWFjX2lkLCBwc3RhLT5yYWlkKTsKLQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAicW9zX2VuPSVkLCBodF9lbj0lZCwgaW5pdF9yYXRlPSVkXG4iLCBwc3RhLT5xb3Nfb3B0aW9uLCBwc3RhLT5odHByaXYuaHRfb3B0aW9uLCBwc3RhLT5pbml0X3JhdGUpOwotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJid21vZGU9JWQsIGNoX29mZnNldD0lZCwgc2dpPSVkXG4iLCBwc3RhLT5odHByaXYuYndtb2RlLCBwc3RhLT5odHByaXYuY2hfb2Zmc2V0LCBwc3RhLT5odHByaXYuc2dpKTsKLQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiYW1wZHVfZW5hYmxlID0gJWRcbiIsIHBzdGEtPmh0cHJpdi5hbXBkdV9lbmFibGUpOwotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJhZ2dfZW5hYmxlX2JpdG1hcD0leCwgY2FuZGlkYXRlX3RpZF9iaXRtYXA9JXhcbiIsIHBzdGEtPmh0cHJpdi5hZ2dfZW5hYmxlX2JpdG1hcCwgcHN0YS0+aHRwcml2LmNhbmRpZGF0ZV90aWRfYml0bWFwKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotCQkJcHJlb3JkZXJfY3RybCA9ICZwc3RhLT5yZWN2cmVvcmRlcl9jdHJsW2ldOwotCQkJaWYgKHByZW9yZGVyX2N0cmwtPmVuYWJsZSkKLQkJCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJ0aWQ9JWQsIGluZGljYXRlX3NlcT0lZFxuIiwgaSwgcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgImNhbid0IGdldCBzdGEncyBtYWNhZGRyLCBjdXJfbmV0d29yaydzIG1hY2FkZHI6ICVwTVxuIiwgY3VyX25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcyk7Ci0JfQotCi0JKmVvZiA9IDE7Ci0JcmV0dXJuIGxlbjsKLX0KLQogaW50IHByb2NfZ2V0X2FkYXB0ZXJfc3RhdGUoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAogCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKIAkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCkBAIC0yOTEsNTk5ICsxNTMsNiBAQAogCXJldHVybiBsZW47CiB9CiAKLWludCBwcm9jX2dldF90cnhfaW5mbyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCXN0cnVjdCByZWN2X3ByaXYgICpwcmVjdnByaXYgPSAmcGFkYXB0ZXItPnJlY3Zwcml2OwotCWludCBsZW4gPSAwOwotCi0JbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiZnJlZV94bWl0YnVmX2NudD0lZCwgZnJlZV94bWl0ZnJhbWVfY250PSVkLCBmcmVlX2V4dF94bWl0YnVmX2NudD0lZCwgZnJlZV9yZWN2ZnJhbWVfY250PSVkXG4iLAotCQkJCXB4bWl0cHJpdi0+ZnJlZV94bWl0YnVmX2NudCwgcHhtaXRwcml2LT5mcmVlX3htaXRmcmFtZV9jbnQsIHB4bWl0cHJpdi0+ZnJlZV94bWl0X2V4dGJ1Zl9jbnQsIHByZWN2cHJpdi0+ZnJlZV9yZWN2ZnJhbWVfY250KTsKLQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJyeF91cmJfcGVuZGluZ19jbj0lZFxuIiwgcHJlY3Zwcml2LT5yeF9wZW5kaW5nX2NudCk7Ci0KLQkqZW9mID0gMTsKLQlyZXR1cm4gbGVuOwotfQotCi1pbnQgcHJvY19nZXRfbWFjX3JlZ19kdW1wMShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgbGVuID0gMDsKLQlpbnQgaSwgaiA9IDE7Ci0KLQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcbj09PT09PT0gTUFDIFJFRyA9PT09PT09XG4iKTsKLQotCWZvciAoaSA9IDB4MDsgaSA8IDB4MzAwOyBpICs9IDQpIHsKLQkJaWYgKGolNCA9PSAxKQotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiMHglMDJ4IiwgaSk7Ci0JCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIiAweCUwOHggIiwgdXNiX3JlYWQzMihwYWRhcHRlciwgaSkpOwotCQlpZiAoKGorKyklNCA9PSAwKQotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG4iKTsKLQl9Ci0KLQkqZW9mID0gMTsKLQlyZXR1cm4gbGVuOwotfQotCi1pbnQgcHJvY19nZXRfbWFjX3JlZ19kdW1wMihjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgbGVuID0gMDsKLQlpbnQgaSwgaiA9IDE7Ci0KLQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcbj09PT09PT0gTUFDIFJFRyA9PT09PT09XG4iKTsKLQltZW1zZXQocGFnZSwgMCwgY291bnQpOwotCWZvciAoaSA9IDB4MzAwOyBpIDwgMHg2MDA7IGkgKz0gNCkgewotCQlpZiAoaiU0ID09IDEpCi0JCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICIweCUwMngiLCBpKTsKLQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiIDB4JTA4eCAiLCB1c2JfcmVhZDMyKHBhZGFwdGVyLCBpKSk7Ci0JCWlmICgoaisrKSU0ID09IDApCi0JCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcbiIpOwotCX0KLQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX2dldF9tYWNfcmVnX2R1bXAzKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCWludCBsZW4gPSAwOwotCWludCBpLCBqID0gMTsKLQotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuPT09PT09PSBNQUMgUkVHID09PT09PT1cbiIpOwotCi0JZm9yIChpID0gMHg2MDA7IGkgPCAweDgwMDsgaSArPSA0KSB7Ci0JCWlmIChqJTQgPT0gMSkKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIjB4JTAyeCIsIGkpOwotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICIgMHglMDh4ICIsIHVzYl9yZWFkMzIocGFkYXB0ZXIsIGkpKTsKLQkJaWYgKChqKyspJTQgPT0gMCkKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuIik7Ci0JfQotCi0JKmVvZiA9IDE7Ci0JcmV0dXJuIGxlbjsKLX0KLQotaW50IHByb2NfZ2V0X2JiX3JlZ19kdW1wMShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgbGVuID0gMDsKLQlpbnQgaSwgaiA9IDE7Ci0KLQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcbj09PT09PT0gQkIgUkVHID09PT09PT1cbiIpOwotCWZvciAoaSA9IDB4ODAwOyBpIDwgMHhCMDA7IGkgKz0gNCkgewotCQlpZiAoaiU0ID09IDEpCi0JCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICIweCUwMngiLCBpKTsKLQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiIDB4JTA4eCAiLCB1c2JfcmVhZDMyKHBhZGFwdGVyLCBpKSk7Ci0JCWlmICgoaisrKSU0ID09IDApCi0JCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcbiIpOwotCX0KLQkqZW9mID0gMTsKLQlyZXR1cm4gbGVuOwotfQotCi1pbnQgcHJvY19nZXRfYmJfcmVnX2R1bXAyKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCWludCBsZW4gPSAwOwotCWludCBpLCBqID0gMTsKLQotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuPT09PT09PSBCQiBSRUcgPT09PT09PVxuIik7Ci0JZm9yIChpID0gMHhCMDA7IGkgPCAweEUwMDsgaSArPSA0KSB7Ci0JCWlmIChqJTQgPT0gMSkKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIjB4JTAyeCIsIGkpOwotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICIgMHglMDh4ICIsIHVzYl9yZWFkMzIocGFkYXB0ZXIsIGkpKTsKLQkJaWYgKChqKyspJTQgPT0gMCkKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuIik7Ci0JfQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX2dldF9iYl9yZWdfZHVtcDMoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7Ci0JaW50IGxlbiA9IDA7Ci0JaW50IGksIGogPSAxOwotCi0JbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG49PT09PT09IEJCIFJFRyA9PT09PT09XG4iKTsKLQlmb3IgKGkgPSAweEUwMDsgaSA8IDB4MTAwMDsgaSArPSA0KSB7Ci0JCWlmIChqJTQgPT0gMSkKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIjB4JTAyeCIsIGkpOwotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICIgMHglMDh4ICIsIHVzYl9yZWFkMzIocGFkYXB0ZXIsIGkpKTsKLQkJaWYgKChqKyspJTQgPT0gMCkKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuIik7Ci0JfQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX2dldF9yZl9yZWdfZHVtcDEoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7Ci0JaW50IGxlbiA9IDA7Ci0JaW50IGksIGogPSAxLCBwYXRoOwotCXUzMiB2YWx1ZTsKLQotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuPT09PT09PSBSRiBSRUcgPT09PT09PVxuIik7Ci0JcGF0aCA9IDE7Ci0JbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG5SRl9QYXRoKCV4KVxuIiwgcGF0aCk7Ci0JZm9yIChpID0gMDsgaSA8IDB4QzA7IGkrKykgewotCQl2YWx1ZSA9IHJ0d19oYWxfcmVhZF9yZnJlZyhwYWRhcHRlciwgcGF0aCwgaSwgMHhmZmZmZmZmZik7Ci0JCWlmIChqJTQgPT0gMSkKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIjB4JTAyeCAiLCBpKTsKLQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiIDB4JTA4eCAiLCB2YWx1ZSk7Ci0JCWlmICgoaisrKSU0ID09IDApCi0JCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcbiIpOwotCX0KLQkqZW9mID0gMTsKLQlyZXR1cm4gbGVuOwotfQotCi1pbnQgcHJvY19nZXRfcmZfcmVnX2R1bXAyKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCWludCBsZW4gPSAwOwotCWludCBpLCBqID0gMSwgcGF0aDsKLQl1MzIgdmFsdWU7Ci0KLQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcbj09PT09PT0gUkYgUkVHID09PT09PT1cbiIpOwotCXBhdGggPSAxOwotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuUkZfUGF0aCgleClcbiIsIHBhdGgpOwotCWZvciAoaSA9IDB4QzA7IGkgPCAweDEwMDsgaSsrKSB7Ci0JCXZhbHVlID0gcnR3X2hhbF9yZWFkX3JmcmVnKHBhZGFwdGVyLCBwYXRoLCBpLCAweGZmZmZmZmZmKTsKLQkJaWYgKGolNCA9PSAxKQotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiMHglMDJ4ICIsIGkpOwotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICIgMHglMDh4ICIsIHZhbHVlKTsKLQkJaWYgKChqKyspJTQgPT0gMCkKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuIik7Ci0JfQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX2dldF9yZl9yZWdfZHVtcDMoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7Ci0JaW50IGxlbiA9IDA7Ci0JaW50IGksIGogPSAxLCBwYXRoOwotCXUzMiB2YWx1ZTsKLQotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuPT09PT09PSBSRiBSRUcgPT09PT09PVxuIik7Ci0JcGF0aCA9IDI7Ci0JbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG5SRl9QYXRoKCV4KVxuIiwgcGF0aCk7Ci0JZm9yIChpID0gMDsgaSA8IDB4QzA7IGkrKykgewotCQl2YWx1ZSA9IHJ0d19oYWxfcmVhZF9yZnJlZyhwYWRhcHRlciwgcGF0aCwgaSwgMHhmZmZmZmZmZik7Ci0JCWlmIChqJTQgPT0gMSkKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIjB4JTAyeCAiLCBpKTsKLQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiIDB4JTA4eCAiLCB2YWx1ZSk7Ci0JCWlmICgoaisrKSU0ID09IDApCi0JCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcbiIpOwotCX0KLQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLQotaW50IHByb2NfZ2V0X3JmX3JlZ19kdW1wNChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgbGVuID0gMDsKLQlpbnQgaSwgaiA9IDEsIHBhdGg7Ci0JdTMyIHZhbHVlOwotCi0JbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG49PT09PT09IFJGIFJFRyA9PT09PT09XG4iKTsKLQlwYXRoID0gMjsKLQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcblJGX1BhdGgoJXgpXG4iLCBwYXRoKTsKLQlmb3IgKGkgPSAweEMwOyBpIDwgMHgxMDA7IGkrKykgewotCQl2YWx1ZSA9IHJ0d19oYWxfcmVhZF9yZnJlZyhwYWRhcHRlciwgcGF0aCwgaSwgMHhmZmZmZmZmZik7Ci0JCWlmIChqJTQgPT0gMSkKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIjB4JTAyeCAiLCBpKTsKLQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiIDB4JTA4eCAiLCB2YWx1ZSk7Ci0JCWlmICgoaisrKSU0ID09IDApCi0JCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcbiIpOwotCX0KLQkqZW9mID0gMTsKLQlyZXR1cm4gbGVuOwotfQotCi0KLQotaW50IHByb2NfZ2V0X3J4X3NpZ25hbChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgbGVuID0gMDsKLQotCWxlbiA9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50LAotCQkicnNzaTolZFxuIgotCQkicnhwd2RiOiVkXG4iCi0JCSJzaWduYWxfc3RyZW5ndGg6JXVcbiIKLQkJInNpZ25hbF9xdWFsOiV1XG4iCi0JCSJub2lzZToldVxuIiwKLQkJcGFkYXB0ZXItPnJlY3Zwcml2LnJzc2ksCi0JCXBhZGFwdGVyLT5yZWN2cHJpdi5yeHB3ZGIsCi0JCXBhZGFwdGVyLT5yZWN2cHJpdi5zaWduYWxfc3RyZW5ndGgsCi0JCXBhZGFwdGVyLT5yZWN2cHJpdi5zaWduYWxfcXVhbCwKLQkJcGFkYXB0ZXItPnJlY3Zwcml2Lm5vaXNlCi0JCSk7Ci0KLQkqZW9mID0gMTsKLQlyZXR1cm4gbGVuOwotfQotCi1pbnQgcHJvY19zZXRfcnhfc2lnbmFsKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAotCQl1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCWNoYXIgdG1wWzMyXTsKLQl1MzIgaXNfc2lnbmFsX2RiZzsKLQlzMzIgc2lnbmFsX3N0cmVuZ3RoOwotCi0JaWYgKGNvdW50IDwgMSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoYnVmZmVyICYmICFjb3B5X2Zyb21fdXNlcih0bXAsIGJ1ZmZlciwgc2l6ZW9mKHRtcCkpKSB7Ci0JCWludCBudW0gPSBzc2NhbmYodG1wLCAiJXUgJXUiLCAmaXNfc2lnbmFsX2RiZywgJnNpZ25hbF9zdHJlbmd0aCk7Ci0KLQkJaXNfc2lnbmFsX2RiZyA9IGlzX3NpZ25hbF9kYmcgPT0gMCA/IDAgOiAxOwotCQlpZiAoaXNfc2lnbmFsX2RiZyAmJiBudW0gIT0gMikKLQkJCXJldHVybiBjb3VudDsKLQotCQlzaWduYWxfc3RyZW5ndGggPSBjbGFtcChzaWduYWxfc3RyZW5ndGgsIDAsIDEwMCk7Ci0KLQkJcGFkYXB0ZXItPnJlY3Zwcml2LmlzX3NpZ25hbF9kYmcgPSBpc19zaWduYWxfZGJnOwotCQlwYWRhcHRlci0+cmVjdnByaXYuc2lnbmFsX3N0cmVuZ3RoX2RiZyA9IHNpZ25hbF9zdHJlbmd0aDsKLQotCQlpZiAoaXNfc2lnbmFsX2RiZykKLQkJCURCR184OEUoInNldCAlcyAldVxuIiwgIkRCR19TSUdOQUxfU1RSRU5HVEgiLCBzaWduYWxfc3RyZW5ndGgpOwotCQllbHNlCi0JCQlEQkdfODhFKCJzZXQgJXNcbiIsICJIV19TSUdOQUxfU1RSRU5HVEgiKTsKLQl9Ci0JcmV0dXJuIGNvdW50OwotfQotCi1pbnQgcHJvY19nZXRfaHRfZW5hYmxlKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCByZWdpc3RyeV9wcml2CSpwcmVncHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCWludCBsZW4gPSAwOwotCi0JaWYgKHByZWdwcml2KQotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCi0JCQkiJWRcbiIsCi0JCQlwcmVncHJpdi0+aHRfZW5hYmxlCi0JCQkpOwotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX3NldF9odF9lbmFibGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCi0JCXVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYJKnByZWdwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0JY2hhciB0bXBbMzJdOwotCXMzMiBtb2RlID0gMDsKLQotCWlmIChjb3VudCA8IDEpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKGJ1ZmZlciAmJiAhY29weV9mcm9tX3VzZXIodG1wLCBidWZmZXIsIHNpemVvZih0bXApKSkgewotCQlpZiAocHJlZ3ByaXYpIHsKLQkJCXByZWdwcml2LT5odF9lbmFibGUgPSBtb2RlOwotCQkJcHJfaW5mbygiaHRfZW5hYmxlPSVkXG4iLCBwcmVncHJpdi0+aHRfZW5hYmxlKTsKLQkJfQotCX0KLQotCXJldHVybiBjb3VudDsKLX0KLQotaW50IHByb2NfZ2V0X2NidzQwX2VuYWJsZShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdgkqcHJlZ3ByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQotCWludCBsZW4gPSAwOwotCi0JaWYgKHByZWdwcml2KQotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCi0JCQkiJWRcbiIsCi0JCQlwcmVncHJpdi0+Y2J3NDBfZW5hYmxlCi0JCQkpOwotCi0JKmVvZiA9IDE7Ci0JcmV0dXJuIGxlbjsKLX0KLQotaW50IHByb2Nfc2V0X2NidzQwX2VuYWJsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKLQkJdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdgkqcHJlZ3ByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQljaGFyIHRtcFszMl07Ci0JczMyIG1vZGUgPSAwOwotCi0JaWYgKGNvdW50IDwgMSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoYnVmZmVyICYmICFjb3B5X2Zyb21fdXNlcih0bXAsIGJ1ZmZlciwgc2l6ZW9mKHRtcCkpKSB7Ci0JCWlmIChwcmVncHJpdikgewotCQkJcHJlZ3ByaXYtPmNidzQwX2VuYWJsZSA9IG1vZGU7Ci0JCQlwcl9pbmZvKCJjYnc0MF9lbmFibGU9JWRcbiIsIG1vZGUpOwotCQl9Ci0JfQotCXJldHVybiBjb3VudDsKLX0KLQotaW50IHByb2NfZ2V0X2FtcGR1X2VuYWJsZShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdgkqcHJlZ3ByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQotCWludCBsZW4gPSAwOwotCi0JaWYgKHByZWdwcml2KQotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCi0JCQkiJWRcbiIsCi0JCQlwcmVncHJpdi0+YW1wZHVfZW5hYmxlCi0JCQkpOwotCi0JKmVvZiA9IDE7Ci0JcmV0dXJuIGxlbjsKLX0KLQotaW50IHByb2Nfc2V0X2FtcGR1X2VuYWJsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKLQkJdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdgkqcHJlZ3ByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQljaGFyIHRtcFszMl07Ci0JczMyIG1vZGUgPSAwOwotCi0JaWYgKGNvdW50IDwgMSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoYnVmZmVyICYmICFjb3B5X2Zyb21fdXNlcih0bXAsIGJ1ZmZlciwgc2l6ZW9mKHRtcCkpKSB7Ci0JCWlmIChwcmVncHJpdikgewotCQkJcHJlZ3ByaXYtPmFtcGR1X2VuYWJsZSA9IG1vZGU7Ci0JCQlwcl9pbmZvKCJhbXBkdV9lbmFibGU9JWRcbiIsIG1vZGUpOwotCQl9Ci0JfQotCXJldHVybiBjb3VudDsKLX0KLQotaW50IHByb2NfZ2V0X3R3b19wYXRoX3Jzc2koY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7Ci0KLQlpbnQgbGVuID0gMDsKLQotCWlmIChwYWRhcHRlcikKLQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAotCQkJIiVkICVkXG4iLAotCQkJcGFkYXB0ZXItPnJlY3Zwcml2LlJ4UnNzaVswXSwKLQkJCXBhZGFwdGVyLT5yZWN2cHJpdi5SeFJzc2lbMV0KLQkJCSk7Ci0KLQkqZW9mID0gMTsKLQlyZXR1cm4gbGVuOwotfQotCi1pbnQgcHJvY19nZXRfcnhfc3RiYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdgkqcHJlZ3ByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQotCWludCBsZW4gPSAwOwotCi0JaWYgKHByZWdwcml2KQotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCi0JCQkiJWRcbiIsCi0JCQlwcmVncHJpdi0+cnhfc3RiYwotCQkJKTsKLQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX3NldF9yeF9zdGJjKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAotCQl1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCByZWdpc3RyeV9wcml2CSpwcmVncHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCWNoYXIgdG1wWzMyXTsKLQl1MzIgbW9kZSA9IDA7Ci0KLQlpZiAoY291bnQgPCAxKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmIChidWZmZXIgJiYgIWNvcHlfZnJvbV91c2VyKHRtcCwgYnVmZmVyLCBzaXplb2YodG1wKSkpIHsKLQkJaWYgKHByZWdwcml2KSB7Ci0JCQlwcmVncHJpdi0+cnhfc3RiYyA9IG1vZGU7Ci0JCQluZXRkZXZfaW5mbyhkZXYsICJyeF9zdGJjPSVkXG4iLCBtb2RlKTsKLQkJfQotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLWludCBwcm9jX2dldF9yc3NpX2Rpc3AoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0JKmVvZiA9IDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBwcm9jX3NldF9yc3NpX2Rpc3Aoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCi0JCXVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7Ci0JY2hhciB0bXBbMzJdOwotCXUzMiBlbmFibGUgPSAwOwotCi0JaWYgKGNvdW50IDwgMSkgewotCQlEQkdfODhFKCJhcmd1bWVudCBzaXplIGlzIGxlc3MgdGhhbiAxXG4iKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JaWYgKGJ1ZmZlciAmJiAhY29weV9mcm9tX3VzZXIodG1wLCBidWZmZXIsIHNpemVvZih0bXApKSkgewotCQlpbnQgbnVtID0gc3NjYW5mKHRtcCwgIiV4IiwgJmVuYWJsZSk7Ci0KLQkJaWYgKG51bSAhPSAgMSkgewotCQkJREJHXzg4RSgiaW52YWxpZCBzZXRfcnNzaV9kaXNwIHBhcmFtZXRlciFcbiIpOwotCQkJcmV0dXJuIGNvdW50OwotCQl9Ci0KLQkJaWYgKGVuYWJsZSkgewotCQkJREJHXzg4RSgiVHVybiBPbiBSeCBSU1NJIERpc3BsYXkgRnVuY3Rpb25cbiIpOwotCQkJcGFkYXB0ZXItPmJSeFJTU0lEaXNwbGF5ID0gZW5hYmxlOwotCQl9IGVsc2UgewotCQkJREJHXzg4RSgiVHVybiBPZmYgUnggUlNTSSBEaXNwbGF5IEZ1bmN0aW9uXG4iKTsKLQkJCXBhZGFwdGVyLT5iUnhSU1NJRGlzcGxheSA9IDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIGNvdW50OwotfQotCi0jaWZkZWYgQ09ORklHXzg4RVVfQVBfTU9ERQotCi1pbnQgcHJvY19nZXRfYWxsX3N0YV9pbmZvKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCWludCBpLCBqOwotCXN0cnVjdCBsaXN0X2hlYWQgKnBsaXN0LCAqcGhlYWQ7Ci0Jc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsICpwcmVvcmRlcl9jdHJsOwotCWludCBsZW4gPSAwOwotCi0KLQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJzdGFfZHpfYml0bWFwPTB4JXgsIHRpbV9iaXRtYXA9MHgleFxuIiwgcHN0YXByaXYtPnN0YV9kel9iaXRtYXAsIHBzdGFwcml2LT50aW1fYml0bWFwKTsKLQotCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotCi0JZm9yIChpID0gMDsgaSA8IE5VTV9TVEE7IGkrKykgewotCQlwaGVhZCA9ICZwc3RhcHJpdi0+c3RhX2hhc2hbaV07Ci0JCXBsaXN0ID0gcGhlYWQtPm5leHQ7Ci0KLQkJd2hpbGUgKHBoZWFkICE9IHBsaXN0KSB7Ci0JCQlwc3RhID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgc3RhX2luZm8sIGhhc2hfbGlzdCk7Ci0KLQkJCXBsaXN0ID0gcGxpc3QtPm5leHQ7Ci0KLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgInN0YSdzIG1hY2FkZHI6ICVwTVxuIiwgcHN0YS0+aHdhZGRyKTsKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgInJ0c2VuPSVkLCBjdHMyc2xlZj0lZFxuIiwgcHN0YS0+cnRzZW4sIHBzdGEtPmN0czJzZWxmKTsKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgInN0YXRlPTB4JXgsIGFpZD0lZCwgbWFjaWQ9JWQsIHJhaWQ9JWRcbiIsIHBzdGEtPnN0YXRlLCBwc3RhLT5haWQsIHBzdGEtPm1hY19pZCwgcHN0YS0+cmFpZCk7Ci0JCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJxb3NfZW49JWQsIGh0X2VuPSVkLCBpbml0X3JhdGU9JWRcbiIsIHBzdGEtPnFvc19vcHRpb24sIHBzdGEtPmh0cHJpdi5odF9vcHRpb24sIHBzdGEtPmluaXRfcmF0ZSk7Ci0JCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJid21vZGU9JWQsIGNoX29mZnNldD0lZCwgc2dpPSVkXG4iLCBwc3RhLT5odHByaXYuYndtb2RlLCBwc3RhLT5odHByaXYuY2hfb2Zmc2V0LCBwc3RhLT5odHByaXYuc2dpKTsKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgImFtcGR1X2VuYWJsZSA9ICVkXG4iLCBwc3RhLT5odHByaXYuYW1wZHVfZW5hYmxlKTsKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgImFnZ19lbmFibGVfYml0bWFwPSV4LCBjYW5kaWRhdGVfdGlkX2JpdG1hcD0leFxuIiwgcHN0YS0+aHRwcml2LmFnZ19lbmFibGVfYml0bWFwLCBwc3RhLT5odHByaXYuY2FuZGlkYXRlX3RpZF9iaXRtYXApOwotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAic2xlZXBxX2xlbj0lZFxuIiwgcHN0YS0+c2xlZXBxX2xlbik7Ci0JCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJjYXBhYmlsaXR5PTB4JXhcbiIsIHBzdGEtPmNhcGFiaWxpdHkpOwotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiZmxhZ3M9MHgleFxuIiwgcHN0YS0+ZmxhZ3MpOwotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAid3BhX3Bzaz0weCV4XG4iLCBwc3RhLT53cGFfcHNrKTsKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIndwYTJfZ3JvdXBfY2lwaGVyPTB4JXhcbiIsIHBzdGEtPndwYTJfZ3JvdXBfY2lwaGVyKTsKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIndwYTJfcGFpcndpc2VfY2lwaGVyPTB4JXhcbiIsIHBzdGEtPndwYTJfcGFpcndpc2VfY2lwaGVyKTsKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgInFvc19pbmZvPTB4JXhcbiIsIHBzdGEtPnFvc19pbmZvKTsKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgImRvdDExODAyMVhQcml2YWN5PTB4JXhcbiIsIHBzdGEtPmRvdDExODAyMVhQcml2YWN5KTsKLQotCQkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKLQkJCQlwcmVvcmRlcl9jdHJsID0gJnBzdGEtPnJlY3ZyZW9yZGVyX2N0cmxbal07Ci0JCQkJaWYgKHByZW9yZGVyX2N0cmwtPmVuYWJsZSkKLQkJCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAidGlkPSVkLCBpbmRpY2F0ZV9zZXE9JWRcbiIsIGosIHByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSk7Ci0JCQl9Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0jZW5kaWYKLQogaW50IHByb2NfZ2V0X2Jlc3RfY2hhbm5lbChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCiAJCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAogCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfZWZ1c2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfZWZ1c2UuYwppbmRleCBmYmNlMWY3Li4xNmNjNzcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2VmdXNlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19lZnVzZS5jCkBAIC0zMTcsNjkgKzMxNyw2IEBACiAJfQogfQogCi0vKiBEbyBub3Qgc3VwcG9ydCBCVCAqLwotdm9pZCBFRlVTRV9HZXRFZnVzZURlZmluaXRpb24oc3RydWN0IGFkYXB0ZXIgKnBBZGFwdGVyLCB1OCBlZnVzZVR5cGUsIHU4IHR5cGUsIHZvaWQgKnBPdXQpCi17Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBUWVBFX0VGVVNFX01BWF9TRUNUSU9OOgotCQl7Ci0JCQl1OCAqcE1heF9zZWN0aW9uOwotCQkJcE1heF9zZWN0aW9uID0gcE91dDsKLQkJCSpwTWF4X3NlY3Rpb24gPSBFRlVTRV9NQVhfU0VDVElPTl84OEU7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBUWVBFX0VGVVNFX1JFQUxfQ09OVEVOVF9MRU46Ci0JCXsKLQkJCXUxNiAqcHUyVG1wOwotCQkJcHUyVG1wID0gcE91dDsKLQkJCSpwdTJUbXAgPSBFRlVTRV9SRUFMX0NPTlRFTlRfTEVOXzg4RTsKLQkJfQotCQlicmVhazsKLQljYXNlIFRZUEVfRUZVU0VfQ09OVEVOVF9MRU5fQkFOSzoKLQkJewotCQkJdTE2ICpwdTJUbXA7Ci0JCQlwdTJUbXAgPSBwT3V0OwotCQkJKnB1MlRtcCA9IEVGVVNFX1JFQUxfQ09OVEVOVF9MRU5fODhFOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgVFlQRV9BVkFJTEFCTEVfRUZVU0VfQllURVNfQkFOSzoKLQkJewotCQkJdTE2ICpwdTJUbXA7Ci0JCQlwdTJUbXAgPSBwT3V0OwotCQkJKnB1MlRtcCA9ICh1MTYpKEVGVVNFX1JFQUxfQ09OVEVOVF9MRU5fODhFLUVGVVNFX09PQl9QUk9URUNUX0JZVEVTXzg4RSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBUWVBFX0FWQUlMQUJMRV9FRlVTRV9CWVRFU19UT1RBTDoKLQkJewotCQkJdTE2ICpwdTJUbXA7Ci0JCQlwdTJUbXAgPSBwT3V0OwotCQkJKnB1MlRtcCA9ICh1MTYpKEVGVVNFX1JFQUxfQ09OVEVOVF9MRU5fODhFLUVGVVNFX09PQl9QUk9URUNUX0JZVEVTXzg4RSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBUWVBFX0VGVVNFX01BUF9MRU46Ci0JCXsKLQkJCXUxNiAqcHUyVG1wOwotCQkJcHUyVG1wID0gcE91dDsKLQkJCSpwdTJUbXAgPSAodTE2KUVGVVNFX01BUF9MRU5fODhFOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgVFlQRV9FRlVTRV9QUk9URUNUX0JZVEVTX0JBTks6Ci0JCXsKLQkJCXU4ICpwdTFUbXA7Ci0JCQlwdTFUbXAgPSBwT3V0OwotCQkJKnB1MVRtcCA9ICh1OCkoRUZVU0VfT09CX1BST1RFQ1RfQllURVNfODhFKTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQl7Ci0JCQl1OCAqcHUxVG1wOwotCQkJcHUxVG1wID0gcE91dDsKLQkJCSpwdTFUbXAgPSAwOwotCQl9Ci0JCWJyZWFrOwotCX0KLX0KLQogdTggRWZ1c2VfV29yZEVuYWJsZURhdGFXcml0ZShzdHJ1Y3QgYWRhcHRlciAqcEFkYXB0ZXIsIHUxNiBlZnVzZV9hZGRyLCB1OCB3b3JkX2VuLCB1OCAqZGF0YSkKIHsKIAl1MTYJdG1wYWRkciA9IDA7CkBAIC00ODMsMTQgKzQyMCwxMSBAQAogCXU4IGhvZmZzZXQgPSAwLCBod29yZGVuID0gMDsKIAl1OCB0bXBpZHggPSAwOwogCXU4IHRtcGRhdGFbOF07Ci0JdTggbWF4X3NlY3Rpb24gPSAwOwogCXU4IHRtcF9oZWFkZXIgPSAwOwogCi0JRUZVU0VfR2V0RWZ1c2VEZWZpbml0aW9uKHBBZGFwdGVyLCBFRlVTRV9XSUZJLCBUWVBFX0VGVVNFX01BWF9TRUNUSU9OLCAodm9pZCAqKSZtYXhfc2VjdGlvbik7Ci0KIAlpZiAoIWRhdGEpCiAJCXJldHVybiBmYWxzZTsKLQlpZiAob2Zmc2V0ID4gbWF4X3NlY3Rpb24pCisJaWYgKG9mZnNldCA+IEVGVVNFX01BWF9TRUNUSU9OXzg4RSkKIAkJcmV0dXJuIGZhbHNlOwogCiAJbWVtc2V0KGRhdGEsIDB4ZmYsIHNpemVvZih1OCkgKiBQR1BLVF9EQVRBX1NJWkUpOwpAQCAtNTkxLDEyICs1MjUsMTIgQEAKIHN0YXRpYyBib29sIGhhbF9FZnVzZVBnUGFja2V0V3JpdGUyQnl0ZUhlYWRlcihzdHJ1Y3QgYWRhcHRlciAqcEFkYXB0ZXIsIHU4IGVmdXNlVHlwZSwgdTE2ICpwQWRkciwgc3RydWN0IHBncGt0ICpwVGFyZ2V0UGt0KQogewogCWJvb2wgYlJldCA9IGZhbHNlOwotCXUxNgllZnVzZV9hZGRyID0gKnBBZGRyLCBlZnVzZV9tYXhfYXZhaWxhYmxlX2xlbiA9IDA7CisJdTE2IGVmdXNlX2FkZHIgPSAqcEFkZHI7CisJdTE2IGVmdXNlX21heF9hdmFpbGFibGVfbGVuID0KKwkJRUZVU0VfUkVBTF9DT05URU5UX0xFTl84OEUgLSBFRlVTRV9PT0JfUFJPVEVDVF9CWVRFU184OEU7CiAJdTggcGdfaGVhZGVyID0gMCwgdG1wX2hlYWRlciA9IDAsIHBnX2hlYWRlcl90ZW1wID0gMDsKIAl1OCByZXBlYXRjbnQgPSAwOwogCi0JRUZVU0VfR2V0RWZ1c2VEZWZpbml0aW9uKHBBZGFwdGVyLCBlZnVzZVR5cGUsIFRZUEVfQVZBSUxBQkxFX0VGVVNFX0JZVEVTX0JBTkssICh2b2lkICopJmVmdXNlX21heF9hdmFpbGFibGVfbGVuKTsKLQogCXdoaWxlIChlZnVzZV9hZGRyIDwgZWZ1c2VfbWF4X2F2YWlsYWJsZV9sZW4pIHsKIAkJcGdfaGVhZGVyID0gKChwVGFyZ2V0UGt0LT5vZmZzZXQgJiAweDA3KSA8PCA1KSB8IDB4MEY7CiAJCWVmdXNlX09uZUJ5dGVXcml0ZShwQWRhcHRlciwgZWZ1c2VfYWRkciwgcGdfaGVhZGVyKTsKQEAgLTc2OSwxMiArNzAzLDExIEBACiAJYm9vbCBiUmV0ID0gZmFsc2U7CiAJdTggaSwgZWZ1c2VfZGF0YSA9IDAsIGN1cl9oZWFkZXIgPSAwOwogCXU4IG1hdGNoZWRfd2RlbiA9IDAsIGJhZHdvcmRlbiA9IDA7Ci0JdTE2CXN0YXJ0QWRkciA9IDAsIGVmdXNlX21heF9hdmFpbGFibGVfbGVuID0gMCwgZWZ1c2VfbWF4ID0gMDsKKwl1MTYgc3RhcnRBZGRyID0gMDsKKwl1MTYgZWZ1c2VfbWF4X2F2YWlsYWJsZV9sZW4gPQorCQlFRlVTRV9SRUFMX0NPTlRFTlRfTEVOXzg4RSAtIEVGVVNFX09PQl9QUk9URUNUX0JZVEVTXzg4RTsKIAlzdHJ1Y3QgcGdwa3QgY3VyUGt0OwogCi0JRUZVU0VfR2V0RWZ1c2VEZWZpbml0aW9uKHBBZGFwdGVyLCBlZnVzZVR5cGUsIFRZUEVfQVZBSUxBQkxFX0VGVVNFX0JZVEVTX0JBTkssICh2b2lkICopJmVmdXNlX21heF9hdmFpbGFibGVfbGVuKTsKLQlFRlVTRV9HZXRFZnVzZURlZmluaXRpb24ocEFkYXB0ZXIsIGVmdXNlVHlwZSwgVFlQRV9FRlVTRV9SRUFMX0NPTlRFTlRfTEVOLCAodm9pZCAqKSZlZnVzZV9tYXgpOwotCiAJcnR3X2hhbF9nZXRfaHdyZWcocEFkYXB0ZXIsIEhXX1ZBUl9FRlVTRV9CWVRFUywgKHU4ICopJnN0YXJ0QWRkcik7CiAJc3RhcnRBZGRyICU9IEVGVVNFX1JFQUxfQ09OVEVOVF9MRU47CiAKQEAgLTg0NiwxMiArNzc5LDcgQEAKIAkJdTggZWZ1c2VUeXBlCiAJKQogewotCXUxNgllZnVzZV9tYXhfYXZhaWxhYmxlX2xlbiA9IDA7Ci0KLQkvKiBDaGFuZ2UgdG8gY2hlY2sgVFlQRV9FRlVTRV9NQVBfTEVOICwgYmVjYXVzZSA4MTg4RSByYXcgMjU2LCBsb2dpYyBtYXAgb3ZlciAyNTYuICovCi0JRUZVU0VfR2V0RWZ1c2VEZWZpbml0aW9uKHBBZGFwdGVyLCBFRlVTRV9XSUZJLCBUWVBFX0VGVVNFX01BUF9MRU4sICh2b2lkICopJmVmdXNlX21heF9hdmFpbGFibGVfbGVuKTsKLQotCWlmIChFZnVzZV9HZXRDdXJyZW50U2l6ZShwQWRhcHRlcikgPj0gZWZ1c2VfbWF4X2F2YWlsYWJsZV9sZW4pCisJaWYgKEVmdXNlX0dldEN1cnJlbnRTaXplKHBBZGFwdGVyKSA+PSBFRlVTRV9NQVBfTEVOXzg4RSkKIAkJcmV0dXJuIGZhbHNlOwogCXJldHVybiB0cnVlOwogfQpAQCAtOTc3LDEzICs5MDUsOSBAQAogICovCiBzdGF0aWMgdm9pZCBFZnVzZV9SZWFkQWxsTWFwKHN0cnVjdCBhZGFwdGVyICpwQWRhcHRlciwgdTggZWZ1c2VUeXBlLCB1OCAqRWZ1c2UpCiB7Ci0JdTE2IG1hcExlbiA9IDA7Ci0KIAlFZnVzZV9Qb3dlclN3aXRjaChwQWRhcHRlciwgZmFsc2UsIHRydWUpOwogCi0JRUZVU0VfR2V0RWZ1c2VEZWZpbml0aW9uKHBBZGFwdGVyLCBlZnVzZVR5cGUsIFRZUEVfRUZVU0VfTUFQX0xFTiwgKHZvaWQgKikmbWFwTGVuKTsKLQotCWVmdXNlX1JlYWRFRnVzZShwQWRhcHRlciwgZWZ1c2VUeXBlLCAwLCBtYXBMZW4sIEVmdXNlKTsKKwllZnVzZV9SZWFkRUZ1c2UocEFkYXB0ZXIsIGVmdXNlVHlwZSwgMCwgRUZVU0VfTUFQX0xFTl84OEUsIEVmdXNlKTsKIAogCUVmdXNlX1Bvd2VyU3dpdGNoKHBBZGFwdGVyLCBmYWxzZSwgZmFsc2UpOwogfQpAQCAtOTk2LDEyICs5MjAsOSBAQAogCXU4IGVmdXNlVHlwZSkKIHsKIAlzdHJ1Y3QgZWVwcm9tX3ByaXYgKnBFRVBST00gPSBHRVRfRUVQUk9NX0VGVVNFX1BSSVYocEFkYXB0ZXIpOwotCXUxNiBtYXBMZW4gPSAwOwotCi0JRUZVU0VfR2V0RWZ1c2VEZWZpbml0aW9uKHBBZGFwdGVyLCBlZnVzZVR5cGUsIFRZUEVfRUZVU0VfTUFQX0xFTiwgKHZvaWQgKikmbWFwTGVuKTsKIAogCWlmIChwRUVQUk9NLT5iYXV0b2xvYWRfZmFpbF9mbGFnKQotCQltZW1zZXQocEVFUFJPTS0+ZWZ1c2VfZWVwcm9tX2RhdGEsIDB4RkYsIG1hcExlbik7CisJCW1lbXNldChwRUVQUk9NLT5lZnVzZV9lZXByb21fZGF0YSwgMHhGRiwgRUZVU0VfTUFQX0xFTl84OEUpOwogCWVsc2UKIAkJRWZ1c2VfUmVhZEFsbE1hcChwQWRhcHRlciwgZWZ1c2VUeXBlLCBwRUVQUk9NLT5lZnVzZV9lZXByb21fZGF0YSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2llZWU4MDIxMS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19pZWVlODAyMTEuYwppbmRleCAwYjBkNzhmLi45MTRjNDkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2llZWU4MDIxMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaWVlZTgwMjExLmMKQEAgLTE1NSw1OSArMTU1LDYgQEAKIAlyZXR1cm4gcGJ1ZiArIGxlbiArIDI7CiB9CiAKLWlubGluZSB1OCAqcnR3X3NldF9pZV9jaF9zd2l0Y2godTggKmJ1ZiwgdTMyICpidWZfbGVuLCB1OCBjaF9zd2l0Y2hfbW9kZSwKLQl1OCBuZXdfY2gsIHU4IGNoX3N3aXRjaF9jbnQpCi17Ci0JdTggaWVfZGF0YVszXTsKLQotCWllX2RhdGFbMF0gPSBjaF9zd2l0Y2hfbW9kZTsKLQlpZV9kYXRhWzFdID0gbmV3X2NoOwotCWllX2RhdGFbMl0gPSBjaF9zd2l0Y2hfY250OwotCXJldHVybiBydHdfc2V0X2llKGJ1ZiwgV0xBTl9FSURfQ0hBTk5FTF9TV0lUQ0gsICAzLCBpZV9kYXRhLCBidWZfbGVuKTsKLX0KLQotaW5saW5lIHU4IHNlY29uZGFyeV9jaF9vZmZzZXRfdG9faGFsX2NoX29mZnNldCh1OCBjaF9vZmZzZXQpCi17Ci0JaWYgKGNoX29mZnNldCA9PSBTQ04pCi0JCXJldHVybiBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFOwotCWVsc2UgaWYgKGNoX29mZnNldCA9PSBTQ0EpCi0JCXJldHVybiBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfVVBQRVI7Ci0JZWxzZSBpZiAoY2hfb2Zmc2V0ID09IFNDQikKLQkJcmV0dXJuIEhBTF9QUklNRV9DSE5MX09GRlNFVF9MT1dFUjsKLQotCXJldHVybiBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFOwotfQotCi1pbmxpbmUgdTggaGFsX2NoX29mZnNldF90b19zZWNvbmRhcnlfY2hfb2Zmc2V0KHU4IGNoX29mZnNldCkKLXsKLQlpZiAoY2hfb2Zmc2V0ID09IEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkUpCi0JCXJldHVybiBTQ047Ci0JZWxzZSBpZiAoY2hfb2Zmc2V0ID09IEhBTF9QUklNRV9DSE5MX09GRlNFVF9MT1dFUikKLQkJcmV0dXJuIFNDQjsKLQllbHNlIGlmIChjaF9vZmZzZXQgPT0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX1VQUEVSKQotCQlyZXR1cm4gU0NBOwotCi0JcmV0dXJuIFNDTjsKLX0KLQotaW5saW5lIHU4ICpydHdfc2V0X2llX3NlY29uZGFyeV9jaF9vZmZzZXQodTggKmJ1ZiwgdTMyICpidWZfbGVuLCB1OCBzZWNvbmRhcnlfY2hfb2Zmc2V0KQotewotCXJldHVybiBydHdfc2V0X2llKGJ1ZiwgV0xBTl9FSURfU0VDT05EQVJZX0NIQU5ORUxfT0ZGU0VULCAgMSwgJnNlY29uZGFyeV9jaF9vZmZzZXQsIGJ1Zl9sZW4pOwotfQotCi1pbmxpbmUgdTggKnJ0d19zZXRfaWVfbWVzaF9jaF9zd2l0Y2hfcGFybSh1OCAqYnVmLCB1MzIgKmJ1Zl9sZW4sIHU4IHR0bCwKLQl1OCBmbGFncywgdTE2IHJlYXNvbiwgdTE2IHByZWNlZGVuY2UpCi17Ci0JdTggaWVfZGF0YVs2XTsKLQotCWllX2RhdGFbMF0gPSB0dGw7Ci0JaWVfZGF0YVsxXSA9IGZsYWdzOwotCSoodTE2ICopKGllX2RhdGEgKyAyKSA9IGNwdV90b19sZTE2KHJlYXNvbik7Ci0JKih1MTYgKikoaWVfZGF0YSArIDQpID0gY3B1X3RvX2xlMTYocHJlY2VkZW5jZSk7Ci0KLQlyZXR1cm4gcnR3X3NldF9pZShidWYsIDB4MTE4LCAgNiwgaWVfZGF0YSwgYnVmX2xlbik7Ci19Ci0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogaW5kZXg6IHRoZSBpbmZvcm1hdGlvbiBlbGVtZW50IGlkIGluZGV4LCBsaW1pdCBpcyB0aGUgbGltaXQgZm9yIHNlYXJjaAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMjM2LDk3ICsxODMsNiBAQAogCXJldHVybiBOVUxMOwogfQogCi0vKioKLSAqIHJ0d19nZXRfaWVfZXggLSBTZWFyY2ggc3BlY2lmaWMgSUUgZnJvbSBhIHNlcmllcyBvZiBJRXMKLSAqIEBpbl9pZTogQWRkcmVzcyBvZiBJRXMgdG8gc2VhcmNoCi0gKiBAaW5fbGVuOiBMZW5ndGggbGltaXQgZnJvbSBpbl9pZQotICogQGVpZDogRWxlbWVudCBJRCB0byBtYXRjaAotICogQG91aTogT1VJIHRvIG1hdGNoCi0gKiBAb3VpX2xlbjogT1VJIGxlbmd0aAotICogQGllOiBJZiBub3QgTlVMTCBhbmQgdGhlIHNwZWNpZmljIElFIGlzIGZvdW5kLCB0aGUgSUUgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIGJ1ZiBzdGFydGluZyBmcm9tIHRoZSBzcGVjaWZpYyBJRQotICogQGllbGVuOiBJZiBub3QgTlVMTCBhbmQgdGhlIHNwZWNpZmljIElFIGlzIGZvdW5kLCB3aWxsIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBlbnRpcmUgSUUKLSAqCi0gKiBSZXR1cm5zOiBUaGUgYWRkcmVzcyBvZiB0aGUgc3BlY2lmaWMgSUUgZm91bmQsIG9yIE5VTEwKLSAqLwotdTggKnJ0d19nZXRfaWVfZXgodTggKmluX2llLCB1aW50IGluX2xlbiwgdTggZWlkLCB1OCAqb3VpLCB1OCBvdWlfbGVuLCB1OCAqaWUsIHVpbnQgKmllbGVuKQotewotCXVpbnQgY250OwotCXU4ICp0YXJnZXRfaWUgPSBOVUxMOwotCi0KLQlpZiAoaWVsZW4pCi0JCSppZWxlbiA9IDA7Ci0KLQlpZiAoIWluX2llIHx8IGluX2xlbiA8PSAwKQotCQlyZXR1cm4gdGFyZ2V0X2llOwotCi0JY250ID0gMDsKLQotCXdoaWxlIChjbnQgPCBpbl9sZW4pIHsKLQkJaWYgKGVpZCA9PSBpbl9pZVtjbnRdICYmICghb3VpIHx8ICFtZW1jbXAoJmluX2llW2NudCArIDJdLCBvdWksIG91aV9sZW4pKSkgewotCQkJdGFyZ2V0X2llID0gJmluX2llW2NudF07Ci0KLQkJCWlmIChpZSkKLQkJCQltZW1jcHkoaWUsICZpbl9pZVtjbnRdLCBpbl9pZVtjbnQgKyAxXSArIDIpOwotCi0JCQlpZiAoaWVsZW4pCi0JCQkJKmllbGVuID0gaW5faWVbY250ICsgMV0gKyAyOwotCi0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCWNudCArPSBpbl9pZVtjbnQgKyAxXSArIDI7IC8qIGdvdG8gbmV4dCAqLwotCQl9Ci0JfQotCXJldHVybiB0YXJnZXRfaWU7Ci19Ci0KLS8qKgotICogcnR3X2llc19yZW1vdmVfaWUgLSBGaW5kIG1hdGNoaW5nIElFcyBhbmQgcmVtb3ZlCi0gKiBAaWVzOiBBZGRyZXNzIG9mIElFcyB0byBzZWFyY2gKLSAqIEBpZXNfbGVuOiBQb2ludGVyIG9mIGxlbmd0aCBvZiBpZXMsIHdpbGwgdXBkYXRlIHRvIG5ldyBsZW5ndGgKLSAqIEBvZmZzZXQ6IFRoZSBvZmZzZXQgdG8gc3RhcnQgc2NhcmNoCi0gKiBAZWlkOiBFbGVtZW50IElEIHRvIG1hdGNoCi0gKiBAb3VpOiBPVUkgdG8gbWF0Y2gKLSAqIEBvdWlfbGVuOiBPVUkgbGVuZ3RoCi0gKgotICogUmV0dXJuczogX1NVQ0NFU1M6IGllcyBpcyB1cGRhdGVkLCBfRkFJTDogbm90IHVwZGF0ZWQKLSAqLwotaW50IHJ0d19pZXNfcmVtb3ZlX2llKHU4ICppZXMsIHVpbnQgKmllc19sZW4sIHVpbnQgb2Zmc2V0LCB1OCBlaWQsIHU4ICpvdWksIHU4IG91aV9sZW4pCi17Ci0JaW50IHJldCA9IF9GQUlMOwotCXU4ICp0YXJnZXRfaWU7Ci0JdTMyIHRhcmdldF9pZWxlbjsKLQl1OCAqc3RhcnQ7Ci0JdWludCBzZWFyY2hfbGVuOwotCi0JaWYgKCFpZXMgfHwgIWllc19sZW4gfHwgKmllc19sZW4gPD0gb2Zmc2V0KQotCQlnb3RvIGV4aXQ7Ci0KLQlzdGFydCA9IGllcyArIG9mZnNldDsKLQlzZWFyY2hfbGVuID0gKmllc19sZW4gLSBvZmZzZXQ7Ci0KLQl3aGlsZSAoMSkgewotCQl0YXJnZXRfaWUgPSBydHdfZ2V0X2llX2V4KHN0YXJ0LCBzZWFyY2hfbGVuLCBlaWQsIG91aSwgb3VpX2xlbiwgTlVMTCwgJnRhcmdldF9pZWxlbik7Ci0JCWlmICh0YXJnZXRfaWUgJiYgdGFyZ2V0X2llbGVuKSB7Ci0JCQl1OCBidWZbTUFYX0lFX1NaXSA9IHswfTsKLQkJCXU4ICpyZW1haW5faWVzID0gdGFyZ2V0X2llICsgdGFyZ2V0X2llbGVuOwotCQkJdWludCByZW1haW5fbGVuID0gc2VhcmNoX2xlbiAtIChyZW1haW5faWVzIC0gc3RhcnQpOwotCi0JCQltZW1jcHkoYnVmLCByZW1haW5faWVzLCByZW1haW5fbGVuKTsKLQkJCW1lbWNweSh0YXJnZXRfaWUsIGJ1ZiwgcmVtYWluX2xlbik7Ci0JCQkqaWVzX2xlbiA9ICppZXNfbGVuIC0gdGFyZ2V0X2llbGVuOwotCQkJcmV0ID0gX1NVQ0NFU1M7Ci0KLQkJCXN0YXJ0ID0gdGFyZ2V0X2llOwotCQkJc2VhcmNoX2xlbiA9IHJlbWFpbl9sZW47Ci0JCX0gZWxzZSB7Ci0JCQlicmVhazsKLQkJfQotCX0KLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQogdm9pZCBydHdfc2V0X3N1cHBvcnRlZF9yYXRlKHU4ICpTdXBwb3J0ZWRSYXRlcywgdWludCBtb2RlKQogewogCkBAIC0xMDk2LDQzICs5NTIsNiBAQAogCURCR184OEUoInJ0d19tYWNhZGRyX2NmZyBNQUMgQWRkcmVzcyAgPSAlcE1cbiIsIChtYWNfYWRkcikpOwogfQogCi12b2lkIGR1bXBfaWVzKHU4ICpidWYsIHUzMiBidWZfbGVuKQotewotCXU4ICpwb3MgPSBidWY7Ci0JdTggaWQsIGxlbjsKLQotCXdoaWxlIChwb3MgLSBidWYgPD0gYnVmX2xlbikgewotCQlpZCA9ICpwb3M7Ci0JCWxlbiA9ICoocG9zICsgMSk7Ci0KLQkJREJHXzg4RSgiJXMgSUQ6JXUsIExFTjoldVxuIiwgX19mdW5jX18sIGlkLCBsZW4pOwotCQlkdW1wX3dwc19pZShwb3MsIGxlbik7Ci0KLQkJcG9zICs9ICgyICsgbGVuKTsKLQl9Ci19Ci0KLXZvaWQgZHVtcF93cHNfaWUodTggKmllLCB1MzIgaWVfbGVuKQotewotCXU4ICpwb3MgPSBpZTsKLQl1MTYgaWQ7Ci0JdTE2IGxlbjsKLQl1OCAqd3BzX2llOwotCXVpbnQgd3BzX2llbGVuOwotCi0Jd3BzX2llID0gcnR3X2dldF93cHNfaWUoaWUsIGllX2xlbiwgTlVMTCwgJndwc19pZWxlbik7Ci0JaWYgKHdwc19pZSAhPSBpZSB8fCB3cHNfaWVsZW4gPT0gMCkKLQkJcmV0dXJuOwotCi0JcG9zICs9IDY7Ci0Jd2hpbGUgKHBvcyAtIGllIDwgaWVfbGVuKSB7Ci0JCWlkID0gZ2V0X3VuYWxpZ25lZF9iZTE2KHBvcyk7Ci0JCWxlbiA9IGdldF91bmFsaWduZWRfYmUxNihwb3MgKyAyKTsKLQkJREJHXzg4RSgiJXMgSUQ6MHglMDR4LCBMRU46JXVcbiIsIF9fZnVuY19fLCBpZCwgbGVuKTsKLQkJcG9zICs9ICg0ICsgbGVuKTsKLQl9Ci19Ci0KIC8qIEJhcm9uIGFkZHMgdG8gYXZvaWQgRnJlZUJTRCB3YXJuaW5nICovCiBpbnQgaWVlZTgwMjExX2lzX2VtcHR5X2Vzc2lkKGNvbnN0IGNoYXIgKmVzc2lkLCBpbnQgZXNzaWRfbGVuKQogewpAQCAtMTIyMyw3ICsxMDQyLDYgQEAKIAlfX2xlMTYgbGVfdG1wOwogCXUxNiB3cGFfbGVuID0gMCwgcnNuX2xlbiA9IDA7CiAJc3RydWN0IEhUX2luZm9fZWxlbWVudCAqcGh0X2luZm8gPSBOVUxMOwotCXN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCAqcGh0X2NhcCA9IE5VTEw7CiAJdW5zaWduZWQgaW50CQlsZW47CiAJdW5zaWduZWQgY2hhcgkJKnA7CiAKQEAgLTEyNTksMTAgKzEwNzcsMTIgQEAKIAkvKiBwYXJzaW5nIEhUX0NBUF9JRSAqLwogCXAgPSBydHdfZ2V0X2llKHBuZXR3b3JrLT5uZXR3b3JrLklFcyArIF9GSVhFRF9JRV9MRU5HVEhfLCBfSFRfQ0FQQUJJTElUWV9JRV8sICZsZW4sIHBuZXR3b3JrLT5uZXR3b3JrLklFTGVuZ3RoIC0gX0ZJWEVEX0lFX0xFTkdUSF8pOwogCWlmIChwICYmIGxlbiA+IDApIHsKLQkJCXBodF9jYXAgPSAoc3RydWN0IHJ0d19pZWVlODAyMTFfaHRfY2FwICopKHAgKyAyKTsKLQkJCXBuZXR3b3JrLT5CY25JbmZvLmh0X2NhcF9pbmZvID0gcGh0X2NhcC0+Y2FwX2luZm87CisJCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXAgPQorCQkJKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICopKHAgKyAyKTsKKworCQlwbmV0d29yay0+QmNuSW5mby5odF9jYXBfaW5mbyA9IGxlMTZfdG9fY3B1KGh0X2NhcC0+Y2FwX2luZm8pOwogCX0gZWxzZSB7Ci0JCQlwbmV0d29yay0+QmNuSW5mby5odF9jYXBfaW5mbyA9IDA7CisJCXBuZXR3b3JrLT5CY25JbmZvLmh0X2NhcF9pbmZvID0gMDsKIAl9CiAJLyogcGFyc2luZyBIVF9JTkZPX0lFICovCiAJcCA9IHJ0d19nZXRfaWUocG5ldHdvcmstPm5ldHdvcmsuSUVzICsgX0ZJWEVEX0lFX0xFTkdUSF8sIF9IVF9BRERfSU5GT19JRV8sICZsZW4sIHBuZXR3b3JrLT5uZXR3b3JrLklFTGVuZ3RoIC0gX0ZJWEVEX0lFX0xFTkdUSF8pOwpAQCAtMTMzNSw1OCArMTE1NSwzIEBACiAJfQogCXJldHVybiBtYXhfcmF0ZTsKIH0KLQotaW50IHJ0d19hY3Rpb25fZnJhbWVfcGFyc2UoY29uc3QgdTggKmZyYW1lLCB1MzIgZnJhbWVfbGVuLCB1OCAqY2F0ZWdvcnksIHU4ICphY3Rpb24pCi17Ci0JY29uc3QgdTggKmZyYW1lX2JvZHkgPSBmcmFtZSArIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOwotCXUxNiBmYzsKLQl1OCBjLCBhID0gMDsKLQotCWZjID0gbGUxNl90b19jcHUoKChzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIgKilmcmFtZSktPmZyYW1lX2N0bCk7Ci0KLQlpZiAoKGZjICYgKFJUV19JRUVFODAyMTFfRkNUTF9GVFlQRSB8IFJUV19JRUVFODAyMTFfRkNUTF9TVFlQRSkpICE9Ci0JICAgIChSVFdfSUVFRTgwMjExX0ZUWVBFX01HTVQgfCBSVFdfSUVFRTgwMjExX1NUWVBFX0FDVElPTikpCi0JCXJldHVybiBmYWxzZTsKLQotCWMgPSBmcmFtZV9ib2R5WzBdOwotCi0Jc3dpdGNoIChjKSB7Ci0JY2FzZSBSVFdfV0xBTl9DQVRFR09SWV9QMlA6IC8qIHZlbmRvci1zcGVjaWZpYyAqLwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlhID0gZnJhbWVfYm9keVsxXTsKLQl9Ci0KLQlpZiAoY2F0ZWdvcnkpCi0JCSpjYXRlZ29yeSA9IGM7Ci0JaWYgKGFjdGlvbikKLQkJKmFjdGlvbiA9IGE7Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKl9hY3Rpb25fcHVibGljX3N0cltdID0gewotCSJBQ1RfUFVCX0JTU0NPRVhJU1QiLAotCSJBQ1RfUFVCX0RTRV9FTkFCTEUiLAotCSJBQ1RfUFVCX0RTRV9ERUVOQUJMRSIsCi0JIkFDVF9QVUJfRFNFX1JFR19MT0NBVElPTiIsCi0JIkFDVF9QVUJfRVhUX0NITF9TV0lUQ0giLAotCSJBQ1RfUFVCX0RTRV9NU1JfUkVRIiwKLQkiQUNUX1BVQl9EU0VfTVNSX1JQUlQiLAotCSJBQ1RfUFVCX01QIiwKLQkiQUNUX1BVQl9EU0VfUFdSX0NPTlNUUkFJTlQiLAotCSJBQ1RfUFVCX1ZFTkRPUiIsCi0JIkFDVF9QVUJfR0FTX0lOSVRJQUxfUkVRIiwKLQkiQUNUX1BVQl9HQVNfSU5JVElBTF9SU1AiLAotCSJBQ1RfUFVCX0dBU19DT01FQkFDS19SRVEiLAotCSJBQ1RfUFVCX0dBU19DT01FQkFDS19SU1AiLAotCSJBQ1RfUFVCX1RETFNfRElTQ09WRVJZX1JTUCIsCi0JIkFDVF9QVUJfTE9DQVRJT05fVFJBQ0siLAotCSJBQ1RfUFVCX1JTVkQiLAotfTsKLQotY29uc3QgY2hhciAqYWN0aW9uX3B1YmxpY19zdHIodTggYWN0aW9uKQotewotCWFjdGlvbiA9IG1pbl90KHU4LCBhY3Rpb24sIEFDVF9QVUJMSUNfTUFYKTsKLQlyZXR1cm4gX2FjdGlvbl9wdWJsaWNfc3RyW2FjdGlvbl07Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2lvY3RsX3NldC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19pb2N0bF9zZXQuYwppbmRleCBmODVhNmFiLi42ZWQyM2Y0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2lvY3RsX3NldC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaW9jdGxfc2V0LmMKQEAgLTE0LDcgKzE0LDYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjZGVmaW5lIF9SVFdfSU9DVExfU0VUX0NfCiAKLQogI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KICNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KICNpbmNsdWRlIDxydHdfaW9jdGxfc2V0Lmg+CkBAIC01NzAsMTAgKzU2OSw4IEBACiAJc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdpc3RyeXByaXYgPSAmYWRhcHRlci0+cmVnaXN0cnlwcml2OwogCXN0cnVjdCBtbG1lX3ByaXYJKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKIAlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAgKnBjdXJfYnNzID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yazsKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXAgKnBodF9jYXBpZTsKIAl1OAlyZl90eXBlID0gMDsKIAl1OAlid180ME1IeiA9IDAsIHNob3J0X0dJXzIwID0gMCwgc2hvcnRfR0lfNDAgPSAwOwotCXUxNgltY3NfcmF0ZSA9IDA7CiAJdTMyCWh0X2llbGVuID0gMDsKIAogCWlmIChhZGFwdGVyLT5yZWdpc3RyeXByaXYubXBfbW9kZSA9PSAxKSB7CkBAIC01ODgsMTUgKzU4NSwxMSBAQAogCWlmIChwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgJiAoV0lSRUxFU1NfMTFfMjROfFdJUkVMRVNTXzExXzVOKSkgewogCQlwID0gcnR3X2dldF9pZSgmcGN1cl9ic3MtPklFc1sxMl0sIF9IVF9DQVBBQklMSVRZX0lFXywgJmh0X2llbGVuLCBwY3VyX2Jzcy0+SUVMZW5ndGgtMTIpOwogCQlpZiAocCAmJiBodF9pZWxlbiA+IDApIHsKLQkJCXBodF9jYXBpZSA9IChzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXAgKikocCsyKTsKLQotCQkJbWVtY3B5KCZtY3NfcmF0ZSwgcGh0X2NhcGllLT5zdXBwX21jc19zZXQsIDIpOwotCiAJCQkvKiBjdXJfYndtb2QgaXMgdXBkYXRlZCBieSBiZWFjb24sIHBtbG1laW5mbyBpcyB1cGRhdGVkIGJ5IGFzc29jaWF0aW9uIHJlc3BvbnNlICovCiAJCQlid180ME1IeiA9IChwbWxtZWV4dC0+Y3VyX2J3bW9kZSAmJiAoSFRfSU5GT19IVF9QQVJBTV9SRUNfVFJBTlNfQ0hOTF9XSURUSCAmIHBtbG1laW5mby0+SFRfaW5mby5pbmZvc1swXSkpID8gMSA6IDA7CiAKLQkJCXNob3J0X0dJXzIwID0gKGxlMTZfdG9fY3B1KHBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50LkhUX2NhcHNfaW5mbykgJiBJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCkgPyAxIDogMDsKLQkJCXNob3J0X0dJXzQwID0gKGxlMTZfdG9fY3B1KHBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50LkhUX2NhcHNfaW5mbykgJiBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCkgPyAxIDogMDsKKwkJCXNob3J0X0dJXzIwID0gKGxlMTZfdG9fY3B1KHBtbG1laW5mby0+SFRfY2Fwcy5jYXBfaW5mbykgJiBJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCkgPyAxIDogMDsKKwkJCXNob3J0X0dJXzQwID0gKGxlMTZfdG9fY3B1KHBtbG1laW5mby0+SFRfY2Fwcy5jYXBfaW5mbykgJiBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCkgPyAxIDogMDsKIAogCQkJcnR3X2hhbF9nZXRfaHdyZWcoYWRhcHRlciwgSFdfVkFSX1JGX1RZUEUsICh1OCAqKSgmcmZfdHlwZSkpOwogCQkJbWF4X3JhdGUgPSBydHdfbWNzX3JhdGUoCkBAIC02MDQsNyArNTk3LDcgQEAKIAkJCQlid180ME1IeiAmIChwcmVnaXN0cnlwcml2LT5jYnc0MF9lbmFibGUpLAogCQkJCXNob3J0X0dJXzIwLAogCQkJCXNob3J0X0dJXzQwLAotCQkJCXBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50Lk1DU19yYXRlCisJCQkJcG1sbWVpbmZvLT5IVF9jYXBzLm1jcy5yeF9tYXNrCiAJCQkpOwogCQl9CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbWxtZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tbG1lLmMKaW5kZXggMTQ1NjQ5OS4uZWUyZGNkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tbG1lLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tbG1lLmMKQEAgLTUyLDggKzUyLDYgQEAKIAlfcnR3X2luaXRfcXVldWUoJihwbWxtZXByaXYtPmZyZWVfYnNzX3Bvb2wpKTsKIAlfcnR3X2luaXRfcXVldWUoJihwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUpKTsKIAotCXNldF9zY2FubmVkX25ldHdvcmtfdmFsKHBtbG1lcHJpdiwgMCk7Ci0KIAltZW1zZXQoJnBtbG1lcHJpdi0+YXNzb2Nfc3NpZCwgMCwgc2l6ZW9mKHN0cnVjdCBuZGlzXzgwMl8xMV9zc2lkKSk7CiAKIAlwYnVmID0gdnphbGxvYyhNQVhfQlNTX0NOVCAqIChzaXplb2Yoc3RydWN0IHdsYW5fbmV0d29yaykpKTsKQEAgLTEwMCwxMiArOTgsNiBAQAogCXJ0d19mcmVlX21sbWVfaWVfZGF0YSgmcG1sbWVwcml2LT53cHNfcHJvYmVfcmVxX2llLCAmcG1sbWVwcml2LT53cHNfcHJvYmVfcmVxX2llX2xlbik7CiAJcnR3X2ZyZWVfbWxtZV9pZV9kYXRhKCZwbWxtZXByaXYtPndwc19wcm9iZV9yZXNwX2llLCAmcG1sbWVwcml2LT53cHNfcHJvYmVfcmVzcF9pZV9sZW4pOwogCXJ0d19mcmVlX21sbWVfaWVfZGF0YSgmcG1sbWVwcml2LT53cHNfYXNzb2NfcmVzcF9pZSwgJnBtbG1lcHJpdi0+d3BzX2Fzc29jX3Jlc3BfaWVfbGVuKTsKLQotCXJ0d19mcmVlX21sbWVfaWVfZGF0YSgmcG1sbWVwcml2LT5wMnBfYmVhY29uX2llLCAmcG1sbWVwcml2LT5wMnBfYmVhY29uX2llX2xlbik7Ci0JcnR3X2ZyZWVfbWxtZV9pZV9kYXRhKCZwbWxtZXByaXYtPnAycF9wcm9iZV9yZXFfaWUsICZwbWxtZXByaXYtPnAycF9wcm9iZV9yZXFfaWVfbGVuKTsKLQlydHdfZnJlZV9tbG1lX2llX2RhdGEoJnBtbG1lcHJpdi0+cDJwX3Byb2JlX3Jlc3BfaWUsICZwbWxtZXByaXYtPnAycF9wcm9iZV9yZXNwX2llX2xlbik7Ci0JcnR3X2ZyZWVfbWxtZV9pZV9kYXRhKCZwbWxtZXByaXYtPnAycF9nb19wcm9iZV9yZXNwX2llLCAmcG1sbWVwcml2LT5wMnBfZ29fcHJvYmVfcmVzcF9pZV9sZW4pOwotCXJ0d19mcmVlX21sbWVfaWVfZGF0YSgmcG1sbWVwcml2LT5wMnBfYXNzb2NfcmVxX2llLCAmcG1sbWVwcml2LT5wMnBfYXNzb2NfcmVxX2llX2xlbik7CiB9CiAjZWxzZQogdm9pZCBydHdfZnJlZV9tbG1lX3ByaXZfaWVfZGF0YShzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYpCkBAIC0xNDMsOCArMTM1LDYgQEAKIAlwbmV0d29yay0+YWlkID0gMDsKIAlwbmV0d29yay0+am9pbl9yZXMgPSAwOwogCi0JcG1sbWVwcml2LT5udW1fb2Zfc2Nhbm5lZCsrOwotCiBleGl0OgogCXNwaW5fdW5sb2NrX2JoKCZmcmVlX3F1ZXVlLT5sb2NrKTsKIApAQCAtMTc1LDcgKzE2NSw2IEBACiAJc3Bpbl9sb2NrX2JoKCZmcmVlX3F1ZXVlLT5sb2NrKTsKIAlsaXN0X2RlbF9pbml0KCYocG5ldHdvcmstPmxpc3QpKTsKIAlsaXN0X2FkZF90YWlsKCYocG5ldHdvcmstPmxpc3QpLCAmKGZyZWVfcXVldWUtPnF1ZXVlKSk7Ci0JcG1sbWVwcml2LT5udW1fb2Zfc2Nhbm5lZC0tOwogCXNwaW5fdW5sb2NrX2JoKCZmcmVlX3F1ZXVlLT5sb2NrKTsKIH0KIApAQCAtMTg5LDcgKzE3OCw2IEBACiAJCXJldHVybjsKIAlsaXN0X2RlbF9pbml0KCYocG5ldHdvcmstPmxpc3QpKTsKIAlsaXN0X2FkZF90YWlsKCYocG5ldHdvcmstPmxpc3QpLCBnZXRfbGlzdF9oZWFkKGZyZWVfcXVldWUpKTsKLQlwbWxtZXByaXYtPm51bV9vZl9zY2FubmVkLS07CiB9CiAKIC8qCkBAIC0yNzEsNyArMjU5LDYgQEAKIAlwaWJzc1szXSA9ICh1OCkoY3VydGltZSAmIDB4ZmYpOy8qIHBbMF07ICovCiAJcGlic3NbNF0gPSAodTgpKChjdXJ0aW1lPj44KSAmIDB4ZmYpOy8qIHBbMV07ICovCiAJcGlic3NbNV0gPSAodTgpKChjdXJ0aW1lPj4xNikgJiAweGZmKTsvKiBwWzJdOyAqLwotCXJldHVybjsKIH0KIAogdTggKnJ0d19nZXRfY2FwYWJpbGl0eV9mcm9tX2llKHU4ICppZSkKQEAgLTU2OSw3ICs1NTYsNiBAQAogdm9pZCBydHdfYXRpbWRvbmVfZXZlbnRfY2FsbGJhY2soc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHU4ICpwYnVmKQogewogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sICgicmVjZWl2ZSBhdGltZG9uZV9ldmV0XG4iKSk7Ci0JcmV0dXJuOwogfQogCiAKQEAgLTczMiw3ICs3MTgsNiBAQAogCQlsaXN0X2RlbF9pbml0KHBsaXN0KTsKIAkJbGlzdF9hZGRfdGFpbChwbGlzdCwgJmZyZWVfcXVldWUtPnF1ZXVlKTsKIAkJcGxpc3QgPSBwdGVtcDsKLQkJcG1sbWVwcml2LT5udW1fb2Zfc2Nhbm5lZC0tOwogCX0KIAogCXNwaW5fdW5sb2NrX2JoKCZmcmVlX3F1ZXVlLT5sb2NrKTsKQEAgLTE5MzUsNyArMTkyMCw2IEBACiAJdTMyIGllbGVuLCBvdXRfbGVuOwogCWVudW0gaHRfY2FwX2FtcGR1X2ZhY3RvciBtYXhfcnhfYW1wZHVfZmFjdG9yOwogCXVuc2lnbmVkIGNoYXIgKnA7Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaHRfY2FwIGh0X2NhcGllOwogCXVuc2lnbmVkIGNoYXIgV01NX0lFW10gPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMH07CiAJc3RydWN0IG1sbWVfcHJpdgkqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAlzdHJ1Y3QgcW9zX3ByaXYJCSpwcW9zcHJpdiA9ICZwbWxtZXByaXYtPnFvc3ByaXY7CkBAIC0xOTQ4LDYgKzE5MzIsOCBAQAogCXAgPSBydHdfZ2V0X2llKGluX2llKzEyLCBfSFRfQ0FQQUJJTElUWV9JRV8sICZpZWxlbiwgaW5fbGVuLTEyKTsKIAogCWlmIChwICYmIGllbGVuID4gMCkgeworCQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCBodF9jYXA7CisKIAkJaWYgKHBxb3Nwcml2LT5xb3Nfb3B0aW9uID09IDApIHsKIAkJCW91dF9sZW4gPSAqcG91dF9sZW47CiAJCQlydHdfc2V0X2llKG91dF9pZStvdXRfbGVuLCBfVkVORE9SX1NQRUNJRklDX0lFXywKQEAgLTE5NTgsMzMgKzE5NDQsMzMgQEAKIAogCQlvdXRfbGVuID0gKnBvdXRfbGVuOwogCi0JCW1lbXNldCgmaHRfY2FwaWUsIDAsIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXApKTsKKwkJbWVtc2V0KCZodF9jYXAsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCkpOwogCi0JCWh0X2NhcGllLmNhcF9pbmZvID0gSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEggfAotCQkJCSAgICBJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCB8Ci0JCQkJICAgIElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwIHwKLQkJCQkgICAgSUVFRTgwMjExX0hUX0NBUF9UWF9TVEJDIHwKLQkJCQkgICAgSUVFRTgwMjExX0hUX0NBUF9EU1NTQ0NLNDA7CisJCWh0X2NhcC5jYXBfaW5mbyA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIIHwKKwkJCQkJICAgICAgSUVFRTgwMjExX0hUX0NBUF9TR0lfMjAgfAorCQkJCQkgICAgICBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCB8CisJCQkJCSAgICAgIElFRUU4MDIxMV9IVF9DQVBfVFhfU1RCQyB8CisJCQkJCSAgICAgIElFRUU4MDIxMV9IVF9DQVBfRFNTU0NDSzQwKTsKIAogCQlydHdfaGFsX2dldF9kZWZfdmFyKHBhZGFwdGVyLCBIQUxfREVGX1JYX1BBQ0tFVF9PRkZTRVQsICZyeF9wYWNrZXRfb2Zmc2V0KTsKIAkJcnR3X2hhbF9nZXRfZGVmX3ZhcihwYWRhcHRlciwgSEFMX0RFRl9NQVhfUkVDVkJVRl9TWiwgJm1heF9yZWN2YnVmX3N6KTsKIAogCQkvKgotCQlBTVBEVV9wYXJhIFsxOjBdOk1heCBBTVBEVSBMZW4gPT4gMDo4ayAsIDE6MTZrLCAyOjMyaywgMzo2NGsKLQkJQU1QRFVfcGFyYSBbNDoyXTpNaW4gTVBEVSBTdGFydCBTcGFjaW5nCisJCWFtcGR1X3BhcmFtc19pbmZvIFsxOjBdOk1heCBBTVBEVSBMZW4gPT4gMDo4ayAsIDE6MTZrLCAyOjMyaywgMzo2NGsKKwkJYW1wZHVfcGFyYW1zX2luZm8gWzQ6Ml06TWluIE1QRFUgU3RhcnQgU3BhY2luZwogCQkqLwogCiAJCXJ0d19oYWxfZ2V0X2RlZl92YXIocGFkYXB0ZXIsIEhXX1ZBUl9NQVhfUlhfQU1QRFVfRkFDVE9SLCAmbWF4X3J4X2FtcGR1X2ZhY3Rvcik7Ci0JCWh0X2NhcGllLmFtcGR1X3BhcmFtc19pbmZvID0gKG1heF9yeF9hbXBkdV9mYWN0b3ImMHgwMyk7CisJCWh0X2NhcC5hbXBkdV9wYXJhbXNfaW5mbyA9IG1heF9yeF9hbXBkdV9mYWN0b3IgJiAweDAzOwogCiAJCWlmIChwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG0gPT0gX0FFU18pCi0JCQlodF9jYXBpZS5hbXBkdV9wYXJhbXNfaW5mbyB8PSAoSUVFRTgwMjExX0hUX0NBUF9BTVBEVV9ERU5TSVRZJigweDA3PDwyKSk7CisJCQlodF9jYXAuYW1wZHVfcGFyYW1zX2luZm8gfD0gSUVFRTgwMjExX0hUX0NBUF9BTVBEVV9ERU5TSVRZICYgKDB4MDcgPDwgMik7CiAJCWVsc2UKLQkJCWh0X2NhcGllLmFtcGR1X3BhcmFtc19pbmZvIHw9IChJRUVFODAyMTFfSFRfQ0FQX0FNUERVX0RFTlNJVFkmMHgwMCk7Ci0KKwkJCWh0X2NhcC5hbXBkdV9wYXJhbXNfaW5mbyB8PSBJRUVFODAyMTFfSFRfQ0FQX0FNUERVX0RFTlNJVFkgJiAweDAwOwogCiAJCXJ0d19zZXRfaWUob3V0X2llK291dF9sZW4sIF9IVF9DQVBBQklMSVRZX0lFXywKLQkJCSAgIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXApLCAodW5zaWduZWQgY2hhciAqKSZodF9jYXBpZSwgcG91dF9sZW4pOworCQkJICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSwKKwkJCSAgICh1bnNpZ25lZCBjaGFyICopJmh0X2NhcCwgcG91dF9sZW4pOwogCiAJCXBodHByaXYtPmh0X29wdGlvbiA9IHRydWU7CiAKQEAgLTIwMDAsOSArMTk4Niw2IEBACiAvKiB0aGUgZnVuY3Rpb24gaXMgPiBwYXNzaXZlX2xldmVsIChpbiBjcml0aWNhbF9zZWN0aW9uKSAqLwogdm9pZCBydHdfdXBkYXRlX2h0X2NhcChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpwaWUsIHVpbnQgaWVfbGVuKQogewotCXU4ICpwLCBtYXhfYW1wZHVfc3o7Ci0JaW50IGxlbjsKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXAgKnBodF9jYXBpZTsKIAlzdHJ1Y3QgbWxtZV9wcml2CSpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCXN0cnVjdCBodF9wcml2CQkqcGh0cHJpdiA9ICZwbWxtZXByaXYtPmh0cHJpdjsKIAlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwpAQCAtMjAyNywzNCArMjAxMCwyMSBAQAogCQlwaHRwcml2LT5hbXBkdV9lbmFibGUgPSB0cnVlOwogCX0KIAotCi0JLyogY2hlY2sgTWF4IFJ4IEEtTVBEVSBTaXplICovCi0JbGVuID0gMDsKLQlwID0gcnR3X2dldF9pZShwaWUrc2l6ZW9mKHN0cnVjdCBuZGlzXzgwMl8xMV9maXhlZF9pZSksIF9IVF9DQVBBQklMSVRZX0lFXywgJmxlbiwgaWVfbGVuLXNpemVvZihzdHJ1Y3QgbmRpc184MDJfMTFfZml4ZWRfaWUpKTsKLQlpZiAocCAmJiBsZW4gPiAwKSB7Ci0JCXBodF9jYXBpZSA9IChzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXAgKikocCsyKTsKLQkJbWF4X2FtcGR1X3N6ID0gcGh0X2NhcGllLT5hbXBkdV9wYXJhbXNfaW5mbyAmIElFRUU4MDIxMV9IVF9DQVBfQU1QRFVfRkFDVE9SOwotCQltYXhfYW1wZHVfc3ogPSAxIDw8IChtYXhfYW1wZHVfc3orMyk7IC8qICBtYXhfYW1wZHVfc3ogKGtieXRlcyk7ICovCi0JCXBodHByaXYtPnJ4X2FtcGR1X21heGxlbiA9IG1heF9hbXBkdV9zejsKLQl9Ci0JbGVuID0gMDsKLQlwID0gcnR3X2dldF9pZShwaWUrc2l6ZW9mKHN0cnVjdCBuZGlzXzgwMl8xMV9maXhlZF9pZSksIF9IVF9BRERfSU5GT19JRV8sICZsZW4sIGllX2xlbi1zaXplb2Yoc3RydWN0IG5kaXNfODAyXzExX2ZpeGVkX2llKSk7Ci0KIAkvKiB1cGRhdGUgY3VyX2J3bW9kZSAmIGN1cl9jaF9vZmZzZXQgKi8KIAlpZiAoKHByZWdpc3RyeXByaXYtPmNidzQwX2VuYWJsZSkgJiYKLQkgICAgKGxlMTZfdG9fY3B1KHBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50LkhUX2NhcHNfaW5mbykgJiBCSVQoMSkpICYmCisJICAgIChsZTE2X3RvX2NwdShwbWxtZWluZm8tPkhUX2NhcHMuY2FwX2luZm8pICYgQklUKDEpKSAmJgogCSAgICAocG1sbWVpbmZvLT5IVF9pbmZvLmluZm9zWzBdICYgQklUKDIpKSkgewogCQlpbnQgaTsKIAkJdTgJcmZfdHlwZTsKIAotCQlwYWRhcHRlci0+SGFsRnVuYy5HZXRId1JlZ0hhbmRsZXIocGFkYXB0ZXIsIEhXX1ZBUl9SRl9UWVBFLCAodTggKikoJnJmX3R5cGUpKTsKKwkJcnR3X2hhbF9nZXRfaHdyZWcocGFkYXB0ZXIsIEhXX1ZBUl9SRl9UWVBFLCAodTggKikoJnJmX3R5cGUpKTsKIAogCQkvKiB1cGRhdGUgdGhlIE1DUyByYXRlcyAqLwogCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogCQkJaWYgKChyZl90eXBlID09IFJGXzFUMVIpIHx8IChyZl90eXBlID09IFJGXzFUMlIpKQotCQkJCXBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50Lk1DU19yYXRlW2ldICY9IE1DU19yYXRlXzFSW2ldOworCQkJCSgodTggKikmcG1sbWVpbmZvLT5IVF9jYXBzLm1jcylbaV0gJj0gTUNTX3JhdGVfMVJbaV07CiAJCQllbHNlCi0JCQkJcG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuTUNTX3JhdGVbaV0gJj0gTUNTX3JhdGVfMlJbaV07CisJCQkJKCh1OCAqKSZwbWxtZWluZm8tPkhUX2NhcHMubWNzKVtpXSAmPSBNQ1NfcmF0ZV8yUltpXTsKIAkJfQogCQkvKiBzd2l0Y2ggdG8gdGhlIDQwTSBIeiBtb2RlIGFjY29yZGluZyB0byB0aGUgQVAgKi8KIAkJcG1sbWVleHQtPmN1cl9id21vZGUgPSBIVF9DSEFOTkVMX1dJRFRIXzQwOwpAQCAtMjA3Miw3ICsyMDQyLDcgQEAKIAl9CiAKIAkvKiAgQ29uZmlnIFNNIFBvd2VyIFNhdmUgc2V0dGluZyAqLwotCXBtbG1laW5mby0+U01fUFMgPSAobGUxNl90b19jcHUocG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuSFRfY2Fwc19pbmZvKSAmIDB4MEMpID4+IDI7CisJcG1sbWVpbmZvLT5TTV9QUyA9IChsZTE2X3RvX2NwdShwbWxtZWluZm8tPkhUX2NhcHMuY2FwX2luZm8pICYgMHgwQykgPj4gMjsKIAlpZiAocG1sbWVpbmZvLT5TTV9QUyA9PSBXTEFOX0hUX0NBUF9TTV9QU19TVEFUSUMpCiAJCURCR184OEUoIiVzKCk6IFdMQU5fSFRfQ0FQX1NNX1BTX1NUQVRJQ1xuIiwgX19mdW5jX18pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21sbWVfZXh0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21sbWVfZXh0LmMKaW5kZXggN2YzMmIzOS4uZmIxM2RmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tbG1lX2V4dC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbWxtZV9leHQuYwpAQCAtMzIwLDcgKzMyMCw3IEBACiAJc3RydWN0IHhtaXRfZnJhbWUJKnBtZ250ZnJhbWU7CiAJc3RydWN0IHBrdF9hdHRyaWIJKnBhdHRyaWI7CiAJdW5zaWduZWQgY2hhcgkqcGZyYW1lOwotCXN0cnVjdCBydHdfaWVlZTgwMjExX2hkciAqcHdsYW5oZHI7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKnB3bGFuaGRyOwogCV9fbGUxNiAqZmN0cmw7CiAJdW5zaWduZWQgaW50CXJhdGVfbGVuOwogCXN0cnVjdCB4bWl0X3ByaXYJKnB4bWl0cHJpdiA9ICYocGFkYXB0ZXItPnhtaXRwcml2KTsKQEAgLTM0NywyMiArMzQ3LDIyIEBACiAJbWVtc2V0KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCAwLCBXTEFOSERSX09GRlNFVCArIFRYREVTQ19PRkZTRVQpOwogCiAJcGZyYW1lID0gKHU4ICopKHBtZ250ZnJhbWUtPmJ1Zl9hZGRyKSArIFRYREVTQ19PRkZTRVQ7Ci0JcHdsYW5oZHIgPSAoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyICopcGZyYW1lOworCXB3bGFuaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopcGZyYW1lOwogCiAKLQlmY3RybCA9ICYocHdsYW5oZHItPmZyYW1lX2N0bCk7CisJZmN0cmwgPSAmcHdsYW5oZHItPmZyYW1lX2NvbnRyb2w7CiAJKihmY3RybCkgPSAwOwogCi0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMSwgYmNfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweShwd2xhbmhkci0+YWRkcjIsIG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMywgY3VyX25ldHdvcmstPk1hY0FkZHJlc3MsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIxLCBiY19hZGRyKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKSk7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMywgY3VyX25ldHdvcmstPk1hY0FkZHJlc3MpOwogCiAJU2V0U2VxTnVtKHB3bGFuaGRyLCAwLypwbWxtZWV4dC0+bWdudF9zZXEqLyk7CiAJLyogcG1sbWVleHQtPm1nbnRfc2VxKys7ICovCiAJU2V0RnJhbWVTdWJUeXBlKHBmcmFtZSwgV0lGSV9CRUFDT04pOwogCi0JcGZyYW1lICs9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOwotCXBhdHRyaWItPnBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOworCXBmcmFtZSArPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOworCXBhdHRyaWItPnBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CiAKIAlpZiAoKHBtbG1laW5mby0+c3RhdGUmMHgwMykgPT0gV0lGSV9GV19BUF9TVEFURSkgewogCQlpbnQgbGVuX2RpZmY7CkBAIC0zNzcsOCArMzc3LDggQEAKIAkJCSk7CiAJCXBmcmFtZSArPSAoY3VyX25ldHdvcmstPklFTGVuZ3RoK2xlbl9kaWZmKTsKIAkJcGF0dHJpYi0+cGt0bGVuICs9IChjdXJfbmV0d29yay0+SUVMZW5ndGgrbGVuX2RpZmYpOwotCQl3cHNfaWUgPSBydHdfZ2V0X3dwc19pZShwbWdudGZyYW1lLT5idWZfYWRkcitUWERFU0NfT0ZGU0VUK3NpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpK19CRUFDT05fSUVfT0ZGU0VUXywKLQkJCXBhdHRyaWItPnBrdGxlbi1zaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKS1fQkVBQ09OX0lFX09GRlNFVF8sIE5VTEwsICZ3cHNfaWVsZW4pOworCQl3cHNfaWUgPSBydHdfZ2V0X3dwc19pZShwbWdudGZyYW1lLT5idWZfYWRkcitUWERFU0NfT0ZGU0VUK3NpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikrX0JFQUNPTl9JRV9PRkZTRVRfLAorCQkJcGF0dHJpYi0+cGt0bGVuLXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciktX0JFQUNPTl9JRV9PRkZTRVRfLCBOVUxMLCAmd3BzX2llbGVuKTsKIAkJaWYgKHdwc19pZSAmJiB3cHNfaWVsZW4gPiAwKQogCQkJcnR3X2dldF93cHNfYXR0cl9jb250ZW50KHdwc19pZSwgIHdwc19pZWxlbiwgV1BTX0FUVFJfU0VMRUNURURfUkVHSVNUUkFSLCAodTggKikoJnNyKSwgTlVMTCk7CiAJCWlmIChzciAhPSAwKQpAQCAtNDYxLDcgKzQ2MSw3IEBACiAJc3RydWN0IHhtaXRfZnJhbWUJCQkqcG1nbnRmcmFtZTsKIAlzdHJ1Y3QgcGt0X2F0dHJpYgkJCSpwYXR0cmliOwogCXVuc2lnbmVkIGNoYXIJCQkJCSpwZnJhbWU7Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyCSpwd2xhbmhkcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqcHdsYW5oZHI7CiAJX19sZTE2ICpmY3RybDsKIAl1bnNpZ25lZCBjaGFyCQkJCQkqbWFjLCAqYnNzaWQ7CiAJc3RydWN0IHhtaXRfcHJpdgkqcHhtaXRwcml2ID0gJihwYWRhcHRlci0+eG1pdHByaXYpOwpAQCAtNDg4LDIyICs0ODgsMjIgQEAKIAltZW1zZXQocG1nbnRmcmFtZS0+YnVmX2FkZHIsIDAsIFdMQU5IRFJfT0ZGU0VUICsgVFhERVNDX09GRlNFVCk7CiAKIAlwZnJhbWUgPSAodTggKikocG1nbnRmcmFtZS0+YnVmX2FkZHIpICsgVFhERVNDX09GRlNFVDsKLQlwd2xhbmhkciA9IChzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIgKilwZnJhbWU7CisJcHdsYW5oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilwZnJhbWU7CiAKIAltYWMgPSBteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKTsKIAlic3NpZCA9IGN1cl9uZXR3b3JrLT5NYWNBZGRyZXNzOwogCi0JZmN0cmwgPSAmKHB3bGFuaGRyLT5mcmFtZV9jdGwpOworCWZjdHJsID0gJnB3bGFuaGRyLT5mcmFtZV9jb250cm9sOwogCSooZmN0cmwpID0gMDsKLQltZW1jcHkocHdsYW5oZHItPmFkZHIxLCBkYSwgRVRIX0FMRU4pOwotCW1lbWNweShwd2xhbmhkci0+YWRkcjIsIG1hYywgRVRIX0FMRU4pOwotCW1lbWNweShwd2xhbmhkci0+YWRkcjMsIGJzc2lkLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMSwgZGEpOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjIsIG1hYyk7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMywgYnNzaWQpOwogCiAJU2V0U2VxTnVtKHB3bGFuaGRyLCBwbWxtZWV4dC0+bWdudF9zZXEpOwogCXBtbG1lZXh0LT5tZ250X3NlcSsrOwogCVNldEZyYW1lU3ViVHlwZShmY3RybCwgV0lGSV9QUk9CRVJTUCk7CiAKLQlwYXR0cmliLT5oZHJsZW4gPSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKKwlwYXR0cmliLT5oZHJsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwogCXBhdHRyaWItPnBrdGxlbiA9IHBhdHRyaWItPmhkcmxlbjsKIAlwZnJhbWUgKz0gcGF0dHJpYi0+aGRybGVuOwogCkBAIC02MDksNyArNjA5LDcgQEAKIAlzdHJ1Y3QgeG1pdF9mcmFtZQkJKnBtZ250ZnJhbWU7CiAJc3RydWN0IHBrdF9hdHRyaWIJCSpwYXR0cmliOwogCXVuc2lnbmVkIGNoYXIJCQkqcGZyYW1lOwotCXN0cnVjdCBydHdfaWVlZTgwMjExX2hkcgkqcHdsYW5oZHI7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKnB3bGFuaGRyOwogCV9fbGUxNiAqZmN0cmw7CiAJdW5zaWduZWQgY2hhcgkJCSptYWM7CiAJdW5zaWduZWQgY2hhcgkJCWJzc3JhdGVbTnVtUmF0ZXNdOwpAQCAtNjMzLDMxICs2MzMsMzEgQEAKIAltZW1zZXQocG1nbnRmcmFtZS0+YnVmX2FkZHIsIDAsIFdMQU5IRFJfT0ZGU0VUICsgVFhERVNDX09GRlNFVCk7CiAKIAlwZnJhbWUgPSAodTggKikocG1nbnRmcmFtZS0+YnVmX2FkZHIpICsgVFhERVNDX09GRlNFVDsKLQlwd2xhbmhkciA9IChzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIgKilwZnJhbWU7CisJcHdsYW5oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilwZnJhbWU7CiAKIAltYWMgPSBteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKTsKIAotCWZjdHJsID0gJihwd2xhbmhkci0+ZnJhbWVfY3RsKTsKKwlmY3RybCA9ICZwd2xhbmhkci0+ZnJhbWVfY29udHJvbDsKIAkqKGZjdHJsKSA9IDA7CiAKIAlpZiAoZGEpIHsKIAkJLyoJdW5pY2FzdCBwcm9iZSByZXF1ZXN0IGZyYW1lICovCi0JCW1lbWNweShwd2xhbmhkci0+YWRkcjEsIGRhLCBFVEhfQUxFTik7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjMsIGRhLCBFVEhfQUxFTik7CisJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjEsIGRhKTsKKwkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMywgZGEpOwogCX0gZWxzZSB7CiAJCS8qCWJyb2FkY2FzdCBwcm9iZSByZXF1ZXN0IGZyYW1lICovCi0JCW1lbWNweShwd2xhbmhkci0+YWRkcjEsIGJjX2FkZHIsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KHB3bGFuaGRyLT5hZGRyMywgYmNfYWRkciwgRVRIX0FMRU4pOworCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIxLCBiY19hZGRyKTsKKwkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMywgYmNfYWRkcik7CiAJfQogCi0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMiwgbWFjLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMiwgbWFjKTsKIAogCVNldFNlcU51bShwd2xhbmhkciwgcG1sbWVleHQtPm1nbnRfc2VxKTsKIAlwbWxtZWV4dC0+bWdudF9zZXErKzsKIAlTZXRGcmFtZVN1YlR5cGUocGZyYW1lLCBXSUZJX1BST0JFUkVRKTsKIAotCXBmcmFtZSArPSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKLQlwYXR0cmliLT5wa3RsZW4gPSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKKwlwZnJhbWUgKz0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKKwlwYXR0cmliLT5wa3RsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwogCiAJaWYgKHBzc2lkKQogCQlwZnJhbWUgPSBydHdfc2V0X2llKHBmcmFtZSwgX1NTSURfSUVfLCBwc3NpZC0+U3NpZExlbmd0aCwgcHNzaWQtPlNzaWQsICYocGF0dHJpYi0+cGt0bGVuKSk7CkBAIC03NDUsNyArNzQ1LDcgQEAKIAlzdHJ1Y3QgeG1pdF9mcmFtZSAqcG1nbnRmcmFtZTsKIAlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYjsKIAl1bnNpZ25lZCBjaGFyICpwZnJhbWU7Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyICpwd2xhbmhkcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqcHdsYW5oZHI7CiAJX19sZTE2ICpmY3RybDsKIAl1bnNpZ25lZCBpbnQgdmFsMzI7CiAJdTE2IHZhbDE2OwpAQCAtNzY5LDI1ICs3NjksMjcgQEAKIAltZW1zZXQocG1nbnRmcmFtZS0+YnVmX2FkZHIsIDAsIFdMQU5IRFJfT0ZGU0VUICsgVFhERVNDX09GRlNFVCk7CiAKIAlwZnJhbWUgPSAodTggKikocG1nbnRmcmFtZS0+YnVmX2FkZHIpICsgVFhERVNDX09GRlNFVDsKLQlwd2xhbmhkciA9IChzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIgKilwZnJhbWU7CisJcHdsYW5oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilwZnJhbWU7CiAKLQlmY3RybCA9ICYocHdsYW5oZHItPmZyYW1lX2N0bCk7CisJZmN0cmwgPSAmcHdsYW5oZHItPmZyYW1lX2NvbnRyb2w7CiAJKihmY3RybCkgPSAwOwogCiAJU2V0U2VxTnVtKHB3bGFuaGRyLCBwbWxtZWV4dC0+bWdudF9zZXEpOwogCXBtbG1lZXh0LT5tZ250X3NlcSsrOwogCVNldEZyYW1lU3ViVHlwZShwZnJhbWUsIFdJRklfQVVUSCk7CiAKLQlwZnJhbWUgKz0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0JcGF0dHJpYi0+cGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcGZyYW1lICs9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcGF0dHJpYi0+cGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKIAogCiAJaWYgKHBzdGEpIHsvKiAgZm9yIEFQIG1vZGUgKi8KICNpZmRlZiBDT05GSUdfODhFVV9BUF9NT0RFCiAKLQkJbWVtY3B5KHB3bGFuaGRyLT5hZGRyMSwgcHN0YS0+aHdhZGRyLCBFVEhfQUxFTik7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjIsIG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpLCBFVEhfQUxFTik7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjMsIG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpLCBFVEhfQUxFTik7CisJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjEsIHBzdGEtPmh3YWRkcik7CisJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjIsCisJCQkJbXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSkpOworCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLAorCQkJCW15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpKTsKIAogCiAJCS8qICBzZXR0aW5nIGF1dGggYWxnbyBudW1iZXIgKi8KQEAgLTgyNSw5ICs4MjcsOSBAQAogCX0gZWxzZSB7CiAJCV9fbGUzMiBsZV90bXAzMjsKIAkJX19sZTE2IGxlX3RtcDE2OwotCQltZW1jcHkocHdsYW5oZHItPmFkZHIxLCBwbmV0d29yay0+TWFjQWRkcmVzcywgRVRIX0FMRU4pOwotCQltZW1jcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdiksIEVUSF9BTEVOKTsKLQkJbWVtY3B5KHB3bGFuaGRyLT5hZGRyMywgcG5ldHdvcmstPk1hY0FkZHJlc3MsIEVUSF9BTEVOKTsKKwkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMSwgcG5ldHdvcmstPk1hY0FkZHJlc3MpOworCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdikpOworCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBwbmV0d29yay0+TWFjQWRkcmVzcyk7CiAKIAkJLyogIHNldHRpbmcgYXV0aCBhbGdvIG51bWJlciAqLwogCQl2YWwxNiA9IChwbWxtZWluZm8tPmF1dGhfYWxnbyA9PSBkb3QxMUF1dGhBbGdydGhtX1NoYXJlZCkgPyAxIDogMDsvKiAgMDpPUEVOIFN5c3RlbSwgMTpTaGFyZWQga2V5ICovCkBAIC04NjYsNyArODY4LDcgQEAKIAogCQkJU2V0UHJpdmFjeShmY3RybCk7CiAKLQkJCXBhdHRyaWItPmhkcmxlbiA9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOworCQkJcGF0dHJpYi0+aGRybGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKIAogCQkJcGF0dHJpYi0+ZW5jcnlwdCA9IF9XRVA0MF87CiAKQEAgLTg4OSw3ICs4OTEsNyBAQAogCQkJICBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGF0LCBpbnQgcGt0X3R5cGUpCiB7CiAJc3RydWN0IHhtaXRfZnJhbWUJKnBtZ250ZnJhbWU7Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyCSpwd2xhbmhkcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqcHdsYW5oZHI7CiAJc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWI7CiAJdW5zaWduZWQgY2hhcgkqcGJ1ZiwgKnBmcmFtZTsKIAl1bnNpZ25lZCBzaG9ydCB2YWw7CkBAIC05MTYsMTQgKzkxOCwxNSBAQAogCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKIAogCXBmcmFtZSA9ICh1OCAqKShwbWdudGZyYW1lLT5idWZfYWRkcikgKyBUWERFU0NfT0ZGU0VUOwotCXB3bGFuaGRyID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKKwlwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKIAotCWZjdHJsID0gJihwd2xhbmhkci0+ZnJhbWVfY3RsKTsKKwlmY3RybCA9ICZwd2xhbmhkci0+ZnJhbWVfY29udHJvbDsKIAkqKGZjdHJsKSA9IDA7CiAKLQltZW1jcHkoKHZvaWQgKilHZXRBZGRyMVB0cihwd2xhbmhkciksIHBzdGF0LT5od2FkZHIsIEVUSF9BTEVOKTsKLQltZW1jcHkoKHZvaWQgKilHZXRBZGRyMlB0cihwd2xhbmhkciksIG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpLCBFVEhfQUxFTik7Ci0JbWVtY3B5KCh2b2lkICopR2V0QWRkcjNQdHIocHdsYW5oZHIpLCBwbmV0d29yay0+TWFjQWRkcmVzcywgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weSgodm9pZCAqKUdldEFkZHIxUHRyKHB3bGFuaGRyKSwgcHN0YXQtPmh3YWRkcik7CisJZXRoZXJfYWRkcl9jb3B5KCh2b2lkICopR2V0QWRkcjJQdHIocHdsYW5oZHIpLAorCQkJbXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSkpOworCWV0aGVyX2FkZHJfY29weSgodm9pZCAqKUdldEFkZHIzUHRyKHB3bGFuaGRyKSwgcG5ldHdvcmstPk1hY0FkZHJlc3MpOwogCiAKIAlTZXRTZXFOdW0ocHdsYW5oZHIsIHBtbG1lZXh0LT5tZ250X3NlcSk7CkBAIC05MzMsNyArOTM2LDcgQEAKIAllbHNlCiAJCXJldHVybjsKIAotCXBhdHRyaWItPmhkcmxlbiA9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOworCXBhdHRyaWItPmhkcmxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CiAJcGF0dHJpYi0+cGt0bGVuICs9IHBhdHRyaWItPmhkcmxlbjsKIAlwZnJhbWUgKz0gcGF0dHJpYi0+aGRybGVuOwogCkBAIC0xMDE3LDcgKzEwMjAsNyBAQAogCXN0cnVjdCB4bWl0X2ZyYW1lCSpwbWdudGZyYW1lOwogCXN0cnVjdCBwa3RfYXR0cmliCSpwYXR0cmliOwogCXVuc2lnbmVkIGNoYXIJCSpwZnJhbWUsICpwOwotCXN0cnVjdCBydHdfaWVlZTgwMjExX2hkcgkqcHdsYW5oZHI7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKnB3bGFuaGRyOwogCV9fbGUxNiAqZmN0cmw7CiAJdW5zaWduZWQgaW50CWksIGosIGllX2xlbiwgaW5kZXggPSAwOwogCXVuc2lnbmVkIGNoYXIJcmZfdHlwZSwgYnNzcmF0ZVtOdW1SYXRlc10sIHN0YV9ic3NyYXRlW051bVJhdGVzXTsKQEAgLTEwNDAsMjAgKzEwNDMsMjAgQEAKIAogCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKIAlwZnJhbWUgPSAodTggKikocG1nbnRmcmFtZS0+YnVmX2FkZHIpICsgVFhERVNDX09GRlNFVDsKLQlwd2xhbmhkciA9IChzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIgKilwZnJhbWU7CisJcHdsYW5oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilwZnJhbWU7CiAKLQlmY3RybCA9ICYocHdsYW5oZHItPmZyYW1lX2N0bCk7CisJZmN0cmwgPSAmcHdsYW5oZHItPmZyYW1lX2NvbnRyb2w7CiAJKihmY3RybCkgPSAwOwotCW1lbWNweShwd2xhbmhkci0+YWRkcjEsIHBuZXR3b3JrLT5NYWNBZGRyZXNzLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMiwgbXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSksIEVUSF9BTEVOKTsKLQltZW1jcHkocHdsYW5oZHItPmFkZHIzLCBwbmV0d29yay0+TWFjQWRkcmVzcywgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjEsIHBuZXR3b3JrLT5NYWNBZGRyZXNzKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKSk7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMywgcG5ldHdvcmstPk1hY0FkZHJlc3MpOwogCiAJU2V0U2VxTnVtKHB3bGFuaGRyLCBwbWxtZWV4dC0+bWdudF9zZXEpOwogCXBtbG1lZXh0LT5tZ250X3NlcSsrOwogCVNldEZyYW1lU3ViVHlwZShwZnJhbWUsIFdJRklfQVNTT0NSRVEpOwogCi0JcGZyYW1lICs9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOwotCXBhdHRyaWItPnBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOworCXBmcmFtZSArPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOworCXBhdHRyaWItPnBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CiAKIAkvKiBjYXBzICovCiAKQEAgLTExMzIsMjMgKzExMzUsMjMgQEAKIAlpZiAocGFkYXB0ZXItPm1sbWVwcml2Lmh0cHJpdi5odF9vcHRpb24pIHsKIAkJcCA9IHJ0d19nZXRfaWUoKHBtbG1laW5mby0+bmV0d29yay5JRXMgKyBzaXplb2Yoc3RydWN0IG5kaXNfODAyXzExX2ZpeGVkX2llKSksIF9IVF9DQVBBQklMSVRZX0lFXywgJmllX2xlbiwgKHBtbG1laW5mby0+bmV0d29yay5JRUxlbmd0aCAtIHNpemVvZihzdHJ1Y3QgbmRpc184MDJfMTFfZml4ZWRfaWUpKSk7CiAJCWlmICgocCAhPSBOVUxMKSAmJiAoIShpc19hcF9pbl90a2lwKHBhZGFwdGVyKSkpKSB7Ci0JCQltZW1jcHkoJihwbWxtZWluZm8tPkhUX2NhcHMpLCAocCArIDIpLCBzaXplb2Yoc3RydWN0IEhUX2NhcHNfZWxlbWVudCkpOworCQkJbWVtY3B5KCZwbWxtZWluZm8tPkhUX2NhcHMsIHAgKyAyLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXApKTsKIAogCQkJLyogdG8gZGlzYWJsZSA0ME0gSHogc3VwcG9ydCB3aGlsZSBnZF9id180ME1Iel9lbiA9IDAgKi8KIAkJCWlmIChwcmVncHJpdi0+Y2J3NDBfZW5hYmxlID09IDApCi0JCQkJcG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuSFRfY2Fwc19pbmZvICY9IGNwdV90b19sZTE2KH4oQklUKDYpIHwgQklUKDEpKSk7CisJCQkJcG1sbWVpbmZvLT5IVF9jYXBzLmNhcF9pbmZvICY9IGNwdV90b19sZTE2KH4oQklUKDYpIHwgQklUKDEpKSk7CiAJCQllbHNlCi0JCQkJcG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuSFRfY2Fwc19pbmZvIHw9IGNwdV90b19sZTE2KEJJVCgxKSk7CisJCQkJcG1sbWVpbmZvLT5IVF9jYXBzLmNhcF9pbmZvIHw9IGNwdV90b19sZTE2KEJJVCgxKSk7CiAKIAkJCS8qIHRvZG86IGRpc2FibGUgU00gcG93ZXIgc2F2ZSBtb2RlICovCi0JCQlwbWxtZWluZm8tPkhUX2NhcHMudS5IVF9jYXBfZWxlbWVudC5IVF9jYXBzX2luZm8gfD0gY3B1X3RvX2xlMTYoMHgwMDBjKTsKKwkJCXBtbG1laW5mby0+SFRfY2Fwcy5jYXBfaW5mbyB8PSBjcHVfdG9fbGUxNigweDAwMGMpOwogCiAJCQlydHdfaGFsX2dldF9od3JlZyhwYWRhcHRlciwgSFdfVkFSX1JGX1RZUEUsICh1OCAqKSgmcmZfdHlwZSkpOwogCQkJc3dpdGNoIChyZl90eXBlKSB7CiAJCQljYXNlIFJGXzFUMVI6CiAJCQkJaWYgKHByZWdwcml2LT5yeF9zdGJjKQotCQkJCQlwbWxtZWluZm8tPkhUX2NhcHMudS5IVF9jYXBfZWxlbWVudC5IVF9jYXBzX2luZm8gfD0gY3B1X3RvX2xlMTYoMHgwMTAwKTsvKiBSWCBTVEJDIE9uZSBzcGF0aWFsIHN0cmVhbSAqLwotCQkJCW1lbWNweShwbWxtZWluZm8tPkhUX2NhcHMudS5IVF9jYXBfZWxlbWVudC5NQ1NfcmF0ZSwgTUNTX3JhdGVfMVIsIDE2KTsKKwkJCQkJcG1sbWVpbmZvLT5IVF9jYXBzLmNhcF9pbmZvIHw9IGNwdV90b19sZTE2KDB4MDEwMCk7LyogUlggU1RCQyBPbmUgc3BhdGlhbCBzdHJlYW0gKi8KKwkJCQltZW1jcHkoKHU4ICopJnBtbG1laW5mby0+SFRfY2Fwcy5tY3MsIE1DU19yYXRlXzFSLCAxNik7CiAJCQkJYnJlYWs7CiAJCQljYXNlIFJGXzJUMlI6CiAJCQljYXNlIFJGXzFUMlI6CkBAIC0xMTU3LDkgKzExNjAsOSBAQAogCQkJCSAgICAoKHBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSAmIFdJUkVMRVNTXzExXzI0TikgJiYgKHByZWdwcml2LT5yeF9zdGJjID09IDB4MSkpIHx8IC8qIGVuYWJsZSBmb3IgMi40R0h6ICovCiAJCQkJICAgIChwcmVncHJpdi0+d2lmaV9zcGVjID09IDEpKSB7CiAJCQkJCURCR184OEUoImRlY2xhcmUgc3VwcG9ydGluZyBSWCBTVEJDXG4iKTsKLQkJCQkJcG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuSFRfY2Fwc19pbmZvIHw9IGNwdV90b19sZTE2KDB4MDIwMCk7LyogUlggU1RCQyB0d28gc3BhdGlhbCBzdHJlYW0gKi8KKwkJCQkJcG1sbWVpbmZvLT5IVF9jYXBzLmNhcF9pbmZvIHw9IGNwdV90b19sZTE2KDB4MDIwMCk7LyogUlggU1RCQyB0d28gc3BhdGlhbCBzdHJlYW0gKi8KIAkJCQl9Ci0JCQkJbWVtY3B5KHBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50Lk1DU19yYXRlLCBNQ1NfcmF0ZV8yUiwgMTYpOworCQkJCW1lbWNweSgmcG1sbWVpbmZvLT5IVF9jYXBzLm1jcywgTUNTX3JhdGVfMlIsIDE2KTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCXBmcmFtZSA9IHJ0d19zZXRfaWUocGZyYW1lLCBfSFRfQ0FQQUJJTElUWV9JRV8sIGllX2xlbiAsICh1OCAqKSgmKHBtbG1laW5mby0+SFRfY2FwcykpLCAmKHBhdHRyaWItPnBrdGxlbikpOwpAQCAtMTIxMiw3ICsxMjE1LDcgQEAKIAlzdHJ1Y3QgeG1pdF9mcmFtZQkJCSpwbWdudGZyYW1lOwogCXN0cnVjdCBwa3RfYXR0cmliCQkJKnBhdHRyaWI7CiAJdW5zaWduZWQgY2hhcgkJCQkJKnBmcmFtZTsKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIJKnB3bGFuaGRyOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpwd2xhbmhkcjsKIAlfX2xlMTYgKmZjdHJsOwogCXN0cnVjdCB4bWl0X3ByaXYJKnB4bWl0cHJpdjsKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQ7CkBAIC0xMjM5LDkgKzEyNDIsOSBAQAogCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKIAogCXBmcmFtZSA9ICh1OCAqKShwbWdudGZyYW1lLT5idWZfYWRkcikgKyBUWERFU0NfT0ZGU0VUOwotCXB3bGFuaGRyID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKKwlwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKIAotCWZjdHJsID0gJihwd2xhbmhkci0+ZnJhbWVfY3RsKTsKKwlmY3RybCA9ICZwd2xhbmhkci0+ZnJhbWVfY29udHJvbDsKIAkqKGZjdHJsKSA9IDA7CiAKIAlpZiAoKHBtbG1laW5mby0+c3RhdGUmMHgwMykgPT0gV0lGSV9GV19BUF9TVEFURSkKQEAgLTEyNTIsMTYgKzEyNTUsMTYgQEAKIAlpZiAocG93ZXJfbW9kZSkKIAkJU2V0UHdyTWd0KGZjdHJsKTsKIAotCW1lbWNweShwd2xhbmhkci0+YWRkcjEsIGRhLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMiwgbXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSksIEVUSF9BTEVOKTsKLQltZW1jcHkocHdsYW5oZHItPmFkZHIzLCBwbmV0d29yay0+TWFjQWRkcmVzcywgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjEsIGRhKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKSk7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMywgcG5ldHdvcmstPk1hY0FkZHJlc3MpOwogCiAJU2V0U2VxTnVtKHB3bGFuaGRyLCBwbWxtZWV4dC0+bWdudF9zZXEpOwogCXBtbG1lZXh0LT5tZ250X3NlcSsrOwogCVNldEZyYW1lU3ViVHlwZShwZnJhbWUsIFdJRklfREFUQV9OVUxMKTsKIAotCXBmcmFtZSArPSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKLQlwYXR0cmliLT5wa3RsZW4gPSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKKwlwZnJhbWUgKz0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKKwlwYXR0cmliLT5wa3RsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwogCiAJcGF0dHJpYi0+bGFzdF90eGNtZHN6ID0gcGF0dHJpYi0+cGt0bGVuOwogCkBAIC0xMzMyLDcgKzEzMzUsNyBAQAogCXN0cnVjdCB4bWl0X2ZyYW1lCQkJKnBtZ250ZnJhbWU7CiAJc3RydWN0IHBrdF9hdHRyaWIJCQkqcGF0dHJpYjsKIAl1bnNpZ25lZCBjaGFyCQkJCQkqcGZyYW1lOwotCXN0cnVjdCBydHdfaWVlZTgwMjExX2hkcgkqcHdsYW5oZHI7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKnB3bGFuaGRyOwogCV9fbGUxNiAqZmN0cmw7CiAJdW5zaWduZWQgc2hvcnQgKnFjOwogCXN0cnVjdCB4bWl0X3ByaXYJCQkqcHhtaXRwcml2ID0gJihwYWRhcHRlci0+eG1pdHByaXYpOwpAQCAtMTM1OSw5ICsxMzYyLDkgQEAKIAltZW1zZXQocG1nbnRmcmFtZS0+YnVmX2FkZHIsIDAsIFdMQU5IRFJfT0ZGU0VUICsgVFhERVNDX09GRlNFVCk7CiAKIAlwZnJhbWUgPSAodTggKikocG1nbnRmcmFtZS0+YnVmX2FkZHIpICsgVFhERVNDX09GRlNFVDsKLQlwd2xhbmhkciA9IChzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIgKilwZnJhbWU7CisJcHdsYW5oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilwZnJhbWU7CiAKLQlmY3RybCA9ICYocHdsYW5oZHItPmZyYW1lX2N0bCk7CisJZmN0cmwgPSAmcHdsYW5oZHItPmZyYW1lX2NvbnRyb2w7CiAJKihmY3RybCkgPSAwOwogCiAJaWYgKChwbWxtZWluZm8tPnN0YXRlJjB4MDMpID09IFdJRklfRldfQVBfU1RBVEUpCkBAIC0xMzgwLDE2ICsxMzgzLDE2IEBACiAKIAlTZXRBY2twb2xpY3kocWMsIHBhdHRyaWItPmFja19wb2xpY3kpOwogCi0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMSwgZGEsIEVUSF9BTEVOKTsKLQltZW1jcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKSwgRVRIX0FMRU4pOwotCW1lbWNweShwd2xhbmhkci0+YWRkcjMsIHBuZXR3b3JrLT5NYWNBZGRyZXNzLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMSwgZGEpOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjIsIG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBwbmV0d29yay0+TWFjQWRkcmVzcyk7CiAKIAlTZXRTZXFOdW0ocHdsYW5oZHIsIHBtbG1lZXh0LT5tZ250X3NlcSk7CiAJcG1sbWVleHQtPm1nbnRfc2VxKys7CiAJU2V0RnJhbWVTdWJUeXBlKHBmcmFtZSwgV0lGSV9RT1NfREFUQV9OVUxMKTsKIAotCXBmcmFtZSArPSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyX3Fvcyk7Ci0JcGF0dHJpYi0+cGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcl9xb3MpOworCXBmcmFtZSArPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyKTsKKwlwYXR0cmliLT5wa3RsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyKTsKIAogCXBhdHRyaWItPmxhc3RfdHhjbWRzeiA9IHBhdHRyaWItPnBrdGxlbjsKIApAQCAtMTQ1Nyw3ICsxNDYwLDcgQEAKIAlzdHJ1Y3QgeG1pdF9mcmFtZQkJCSpwbWdudGZyYW1lOwogCXN0cnVjdCBwa3RfYXR0cmliCQkJKnBhdHRyaWI7CiAJdW5zaWduZWQgY2hhcgkJCQkJKnBmcmFtZTsKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIJKnB3bGFuaGRyOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpwd2xhbmhkcjsKIAlfX2xlMTYgKmZjdHJsOwogCXN0cnVjdCB4bWl0X3ByaXYJCQkqcHhtaXRwcml2ID0gJihwYWRhcHRlci0+eG1pdHByaXYpOwogCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dCA9ICYocGFkYXB0ZXItPm1sbWVleHRwcml2KTsKQEAgLTE0NzgsMjEgKzE0ODEsMjEgQEAKIAltZW1zZXQocG1nbnRmcmFtZS0+YnVmX2FkZHIsIDAsIFdMQU5IRFJfT0ZGU0VUICsgVFhERVNDX09GRlNFVCk7CiAKIAlwZnJhbWUgPSAodTggKikocG1nbnRmcmFtZS0+YnVmX2FkZHIpICsgVFhERVNDX09GRlNFVDsKLQlwd2xhbmhkciA9IChzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIgKilwZnJhbWU7CisJcHdsYW5oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilwZnJhbWU7CiAKLQlmY3RybCA9ICYocHdsYW5oZHItPmZyYW1lX2N0bCk7CisJZmN0cmwgPSAmcHdsYW5oZHItPmZyYW1lX2NvbnRyb2w7CiAJKihmY3RybCkgPSAwOwogCi0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMSwgZGEsIEVUSF9BTEVOKTsKLQltZW1jcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKSwgRVRIX0FMRU4pOwotCW1lbWNweShwd2xhbmhkci0+YWRkcjMsIHBuZXR3b3JrLT5NYWNBZGRyZXNzLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMSwgZGEpOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjIsIG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBwbmV0d29yay0+TWFjQWRkcmVzcyk7CiAKIAlTZXRTZXFOdW0ocHdsYW5oZHIsIHBtbG1lZXh0LT5tZ250X3NlcSk7CiAJcG1sbWVleHQtPm1nbnRfc2VxKys7CiAJU2V0RnJhbWVTdWJUeXBlKHBmcmFtZSwgV0lGSV9ERUFVVEgpOwogCi0JcGZyYW1lICs9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOwotCXBhdHRyaWItPnBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOworCXBmcmFtZSArPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOworCXBhdHRyaWItPnBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CiAKIAlsZV90bXAgPSBjcHVfdG9fbGUxNihyZWFzb24pOwogCXBmcmFtZSA9IHJ0d19zZXRfZml4ZWRfaWUocGZyYW1lLCBfUlNPTl9DT0RFXywgJmxlX3RtcCwKQEAgLTE1NTksNjYgKzE1NjIsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgaXNzdWVfYWN0aW9uX3NwY3RfY2hfc3dpdGNoKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTggKnJhLCB1OCBuZXdfY2gsIHU4IGNoX29mZnNldCkKLXsKLQlzdHJ1Y3QgeG1pdF9mcmFtZQkJCSpwbWdudGZyYW1lOwotCXN0cnVjdCBwa3RfYXR0cmliCQkJKnBhdHRyaWI7Ci0JdW5zaWduZWQgY2hhcgkJCQkqcGZyYW1lOwotCXN0cnVjdCBydHdfaWVlZTgwMjExX2hkcgkqcHdsYW5oZHI7Ci0JX19sZTE2ICpmY3RybDsKLQlzdHJ1Y3QgeG1pdF9wcml2CQkJKnB4bWl0cHJpdiA9ICYocGFkYXB0ZXItPnhtaXRwcml2KTsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmKHBhZGFwdGVyLT5tbG1lZXh0cHJpdik7Ci0KLQotCURCR184OEUoRlVOQ19OREVWX0ZNVCIgcmEgPSVwTSwgY2g6JXUsIG9mZnNldDoldVxuIiwKLQkJRlVOQ19OREVWX0FSRyhwYWRhcHRlci0+cG5ldGRldiksIHJhLCBuZXdfY2gsIGNoX29mZnNldCk7Ci0KLQlwbWdudGZyYW1lID0gYWxsb2NfbWd0eG1pdGZyYW1lKHB4bWl0cHJpdik7Ci0JaWYgKHBtZ250ZnJhbWUgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JLyogdXBkYXRlIGF0dHJpYnV0ZSAqLwotCXBhdHRyaWIgPSAmcG1nbnRmcmFtZS0+YXR0cmliOwotCXVwZGF0ZV9tZ250ZnJhbWVfYXR0cmliKHBhZGFwdGVyLCBwYXR0cmliKTsKLQotCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKLQotCXBmcmFtZSA9ICh1OCAqKShwbWdudGZyYW1lLT5idWZfYWRkcikgKyBUWERFU0NfT0ZGU0VUOwotCXB3bGFuaGRyID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKLQotCWZjdHJsID0gJihwd2xhbmhkci0+ZnJhbWVfY3RsKTsKLQkqKGZjdHJsKSA9IDA7Ci0KLQltZW1jcHkocHdsYW5oZHItPmFkZHIxLCByYSwgRVRIX0FMRU4pOyAvKiBSQSAqLwotCW1lbWNweShwd2xhbmhkci0+YWRkcjIsIG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpLCBFVEhfQUxFTik7IC8qIFRBICovCi0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMywgcmEsIEVUSF9BTEVOKTsgLyogREEgPSBSQSAqLwotCi0JU2V0U2VxTnVtKHB3bGFuaGRyLCBwbWxtZWV4dC0+bWdudF9zZXEpOwotCXBtbG1lZXh0LT5tZ250X3NlcSsrOwotCVNldEZyYW1lU3ViVHlwZShwZnJhbWUsIFdJRklfQUNUSU9OKTsKLQotCXBmcmFtZSArPSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKLQlwYXR0cmliLT5wa3RsZW4gPSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKLQotCS8qIGNhdGVnb3J5LCBhY3Rpb24gKi8KLQl7Ci0JCXU4IGNhdGVnb3J5LCBhY3Rpb247Ci0JCWNhdGVnb3J5ID0gUlRXX1dMQU5fQ0FURUdPUllfU1BFQ1RSVU1fTUdNVDsKLQkJYWN0aW9uID0gUlRXX1dMQU5fQUNUSU9OX1NQQ1RfQ0hMX1NXSVRDSDsKLQotCQlwZnJhbWUgPSBydHdfc2V0X2ZpeGVkX2llKHBmcmFtZSwgMSwgJihjYXRlZ29yeSksICYocGF0dHJpYi0+cGt0bGVuKSk7Ci0JCXBmcmFtZSA9IHJ0d19zZXRfZml4ZWRfaWUocGZyYW1lLCAxLCAmKGFjdGlvbiksICYocGF0dHJpYi0+cGt0bGVuKSk7Ci0JfQotCi0JcGZyYW1lID0gcnR3X3NldF9pZV9jaF9zd2l0Y2gocGZyYW1lLCAmKHBhdHRyaWItPnBrdGxlbiksIDAsIG5ld19jaCwgMCk7Ci0JcGZyYW1lID0gcnR3X3NldF9pZV9zZWNvbmRhcnlfY2hfb2Zmc2V0KHBmcmFtZSwgJihwYXR0cmliLT5wa3RsZW4pLAotCQloYWxfY2hfb2Zmc2V0X3RvX3NlY29uZGFyeV9jaF9vZmZzZXQoY2hfb2Zmc2V0KSk7Ci0KLQlwYXR0cmliLT5sYXN0X3R4Y21kc3ogPSBwYXR0cmliLT5wa3RsZW47Ci0KLQlkdW1wX21nbnRmcmFtZShwYWRhcHRlciwgcG1nbnRmcmFtZSk7Ci19Ci0KIHN0YXRpYyB2b2lkIGlzc3VlX2FjdGlvbl9CQShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgKnJhZGRyLAogCQkJICAgIHVuc2lnbmVkIGNoYXIgYWN0aW9uLCB1bnNpZ25lZCBzaG9ydCBzdGF0dXMpCiB7CkBAIC0xNjMzLDcgKzE1NzYsNyBAQAogCXN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lOwogCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwogCXU4ICpwZnJhbWU7Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyICpwd2xhbmhkcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqcHdsYW5oZHI7CiAJX19sZTE2ICpmY3RybDsKIAlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmKHBhZGFwdGVyLT54bWl0cHJpdik7CiAJc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJihwYWRhcHRlci0+bWxtZWV4dHByaXYpOwpAQCAtMTY1NiwyMSArMTU5OSwyMSBAQAogCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKIAogCXBmcmFtZSA9ICh1OCAqKShwbWdudGZyYW1lLT5idWZfYWRkcikgKyBUWERFU0NfT0ZGU0VUOwotCXB3bGFuaGRyID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKKwlwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKIAotCWZjdHJsID0gJihwd2xhbmhkci0+ZnJhbWVfY3RsKTsKKwlmY3RybCA9ICZwd2xhbmhkci0+ZnJhbWVfY29udHJvbDsKIAkqKGZjdHJsKSA9IDA7CiAKLQltZW1jcHkocHdsYW5oZHItPmFkZHIxLCByYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweShwd2xhbmhkci0+YWRkcjIsIG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMywgcG5ldHdvcmstPk1hY0FkZHJlc3MsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIxLCByYWRkcik7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMiwgbXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSkpOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjMsIHBuZXR3b3JrLT5NYWNBZGRyZXNzKTsKIAogCVNldFNlcU51bShwd2xhbmhkciwgcG1sbWVleHQtPm1nbnRfc2VxKTsKIAlwbWxtZWV4dC0+bWdudF9zZXErKzsKIAlTZXRGcmFtZVN1YlR5cGUocGZyYW1lLCBXSUZJX0FDVElPTik7CiAKLQlwZnJhbWUgKz0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0JcGF0dHJpYi0+cGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcGZyYW1lICs9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcGF0dHJpYi0+cGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKIAogCXBmcmFtZSA9IHJ0d19zZXRfZml4ZWRfaWUocGZyYW1lLCAxLCAmKGNhdGVnb3J5KSwgJihwYXR0cmliLT5wa3RsZW4pKTsKIAlwZnJhbWUgPSBydHdfc2V0X2ZpeGVkX2llKHBmcmFtZSwgMSwgJihhY3Rpb24pLCAmKHBhdHRyaWItPnBrdGxlbikpOwpAQCAtMTc3OSw3ICsxNzIyLDcgQEAKIAlzdHJ1Y3QgeG1pdF9mcmFtZQkJCSpwbWdudGZyYW1lOwogCXN0cnVjdCBwa3RfYXR0cmliCQkJKnBhdHRyaWI7CiAJdW5zaWduZWQgY2hhcgkJCQkqcGZyYW1lOwotCXN0cnVjdCBydHdfaWVlZTgwMjExX2hkcgkqcHdsYW5oZHI7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKnB3bGFuaGRyOwogCV9fbGUxNiAqZmN0cmw7CiAJc3RydWN0CXdsYW5fbmV0d29yawkqcG5ldHdvcmsgPSBOVUxMOwogCXN0cnVjdCB4bWl0X3ByaXYJCQkqcHhtaXRwcml2ID0gJihwYWRhcHRlci0+eG1pdHByaXYpOwpAQCAtMTgxNSwyMSArMTc1OCwyMSBAQAogCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKIAogCXBmcmFtZSA9ICh1OCAqKShwbWdudGZyYW1lLT5idWZfYWRkcikgKyBUWERFU0NfT0ZGU0VUOwotCXB3bGFuaGRyID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKKwlwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKIAotCWZjdHJsID0gJihwd2xhbmhkci0+ZnJhbWVfY3RsKTsKKwlmY3RybCA9ICZwd2xhbmhkci0+ZnJhbWVfY29udHJvbDsKIAkqKGZjdHJsKSA9IDA7CiAKLQltZW1jcHkocHdsYW5oZHItPmFkZHIxLCBjdXJfbmV0d29yay0+TWFjQWRkcmVzcywgRVRIX0FMRU4pOwotCW1lbWNweShwd2xhbmhkci0+YWRkcjIsIG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMywgY3VyX25ldHdvcmstPk1hY0FkZHJlc3MsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIxLCBjdXJfbmV0d29yay0+TWFjQWRkcmVzcyk7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMiwgbXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSkpOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjMsIGN1cl9uZXR3b3JrLT5NYWNBZGRyZXNzKTsKIAogCVNldFNlcU51bShwd2xhbmhkciwgcG1sbWVleHQtPm1nbnRfc2VxKTsKIAlwbWxtZWV4dC0+bWdudF9zZXErKzsKIAlTZXRGcmFtZVN1YlR5cGUocGZyYW1lLCBXSUZJX0FDVElPTik7CiAKLQlwZnJhbWUgKz0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0JcGF0dHJpYi0+cGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcGZyYW1lICs9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcGF0dHJpYi0+cGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKIAogCXBmcmFtZSA9IHJ0d19zZXRfZml4ZWRfaWUocGZyYW1lLCAxLCAmKGNhdGVnb3J5KSwgJihwYXR0cmliLT5wa3RsZW4pKTsKIAlwZnJhbWUgPSBydHdfc2V0X2ZpeGVkX2llKHBmcmFtZSwgMSwgJihhY3Rpb24pLCAmKHBhdHRyaWItPnBrdGxlbikpOwpAQCAtMjExMiw3ICsyMDU1LDcgQEAKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmKHBtbG1lZXh0LT5tbG1leHRfaW5mbyk7CiAKLQlsZW4gPSBwYWNrZXRfbGVuIC0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7CisJbGVuID0gcGFja2V0X2xlbiAtIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CiAKIAlpZiAobGVuID4gTUFYX0lFX1NaKQogCQlyZXR1cm4gX0ZBSUw7CkBAIC0yMTQyLDcgKzIwODUsNyBAQAogCiAJLyogYmVsb3cgaXMgdG8gY29weSB0aGUgaW5mb3JtYXRpb24gZWxlbWVudCAqLwogCWJzc2lkLT5JRUxlbmd0aCA9IGxlbjsKLQltZW1jcHkoYnNzaWQtPklFcywgKHBmcmFtZSArIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpKSwgYnNzaWQtPklFTGVuZ3RoKTsKKwltZW1jcHkoYnNzaWQtPklFcywgKHBmcmFtZSArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikpLCBic3NpZC0+SUVMZW5ndGgpOwogCiAJLyogZ2V0IHRoZSBzaWduYWwgc3RyZW5ndGggaW4gZEJNLnJhdyBkYXRhICovCiAJYnNzaWQtPlJzc2kgPSBwcmVjdl9mcmFtZS0+YXR0cmliLnBoeV9pbmZvLnJlY3Zwb3dlcjsKQEAgLTIyMTksNyArMjE2Miw3IEBACiAJaWYgKHN1YnR5cGUgPT0gV0lGSV9QUk9CRVJFUSkgewogCQkvKiAgRklYTUUgKi8KIAkJYnNzaWQtPkluZnJhc3RydWN0dXJlTW9kZSA9IE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZTsKLQkJbWVtY3B5KGJzc2lkLT5NYWNBZGRyZXNzLCBHZXRBZGRyMlB0cihwZnJhbWUpLCBFVEhfQUxFTik7CisJCWV0aGVyX2FkZHJfY29weShic3NpZC0+TWFjQWRkcmVzcywgR2V0QWRkcjJQdHIocGZyYW1lKSk7CiAJCWJzc2lkLT5Qcml2YWN5ID0gMTsKIAkJcmV0dXJuIF9TVUNDRVNTOwogCX0KQEAgLTIyMzEsMTAgKzIxNzQsMTAgQEAKIAogCWlmICh2YWwxNiAmIEJJVCgwKSkgewogCQlic3NpZC0+SW5mcmFzdHJ1Y3R1cmVNb2RlID0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlOwotCQltZW1jcHkoYnNzaWQtPk1hY0FkZHJlc3MsIEdldEFkZHIyUHRyKHBmcmFtZSksIEVUSF9BTEVOKTsKKwkJZXRoZXJfYWRkcl9jb3B5KGJzc2lkLT5NYWNBZGRyZXNzLCBHZXRBZGRyMlB0cihwZnJhbWUpKTsKIAl9IGVsc2UgewogCQlic3NpZC0+SW5mcmFzdHJ1Y3R1cmVNb2RlID0gTmRpczgwMl8xMUlCU1M7Ci0JCW1lbWNweShic3NpZC0+TWFjQWRkcmVzcywgR2V0QWRkcjNQdHIocGZyYW1lKSwgRVRIX0FMRU4pOworCQlldGhlcl9hZGRyX2NvcHkoYnNzaWQtPk1hY0FkZHJlc3MsIEdldEFkZHIzUHRyKHBmcmFtZSkpOwogCX0KIAogCWlmICh2YWwxNiAmIEJJVCg0KSkKQEAgLTIyNDksMTAgKzIxOTIsMTAgQEAKIAkJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAkJcCA9IHJ0d19nZXRfaWUoYnNzaWQtPklFcyArIGllX29mZnNldCwgX0hUX0NBUEFCSUxJVFlfSUVfLCAmbGVuLCBic3NpZC0+SUVMZW5ndGggLSBpZV9vZmZzZXQpOwogCQlpZiAocCAmJiBsZW4gPiAwKSB7Ci0JCQlzdHJ1Y3QgSFRfY2Fwc19lbGVtZW50CSpwSFRfY2FwczsKLQkJCXBIVF9jYXBzID0gKHN0cnVjdCBIVF9jYXBzX2VsZW1lbnQgKikocCArIDIpOworCQkJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKnBIVF9jYXBzID0KKwkJCQkoc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKikocCArIDIpOwogCi0JCQlpZiAobGUxNl90b19jcHUocEhUX2NhcHMtPnUuSFRfY2FwX2VsZW1lbnQuSFRfY2Fwc19pbmZvKSZCSVQoMTQpKQorCQkJaWYgKGxlMTZfdG9fY3B1KHBIVF9jYXBzLT5jYXBfaW5mbykgJiBCSVQoMTQpKQogCQkJCXBtbG1lcHJpdi0+bnVtX0ZvcnR5TUh6SW50b2xlcmFudCsrOwogCQl9IGVsc2UgewogCQkJcG1sbWVwcml2LT5udW1fc3RhX25vX2h0Kys7CkBAIC0yNjg0LDcgKzI2MjcsNyBAQAogCQkJfQogCiAJCQkvKiBjaGVjayB0aGUgdmVuZG9yIG9mIHRoZSBhc3NvYyBBUCAqLwotCQkJcG1sbWVpbmZvLT5hc3NvY19BUF92ZW5kb3IgPSBjaGVja19hc3NvY19BUChwZnJhbWUrc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkciksIGxlbi1zaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKSk7CisJCQlwbWxtZWluZm8tPmFzc29jX0FQX3ZlbmRvciA9IGNoZWNrX2Fzc29jX0FQKHBmcmFtZStzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpLCBsZW4tc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7CiAKIAkJCS8qIHVwZGF0ZSBUU0YgVmFsdWUgKi8KIAkJCXVwZGF0ZV9UU0YocG1sbWVleHQsIHBmcmFtZSwgbGVuKTsKQEAgLTMyOTYsMTMgKzMyMzksMTUgQEAKIAl9CiAKIAkvKiBzYXZlIEhUIGNhcGFiaWxpdGllcyBpbiB0aGUgc3RhIG9iamVjdCAqLwotCW1lbXNldCgmcHN0YXQtPmh0cHJpdi5odF9jYXAsIDAsIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXApKTsKLQlpZiAoZWxlbXMuaHRfY2FwYWJpbGl0aWVzICYmIGVsZW1zLmh0X2NhcGFiaWxpdGllc19sZW4gPj0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCkpIHsKKwltZW1zZXQoJnBzdGF0LT5odHByaXYuaHRfY2FwLCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXApKTsKKwlpZiAoZWxlbXMuaHRfY2FwYWJpbGl0aWVzICYmCisJICAgIGVsZW1zLmh0X2NhcGFiaWxpdGllc19sZW4gPj0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSkgewogCQlwc3RhdC0+ZmxhZ3MgfD0gV0xBTl9TVEFfSFQ7CiAKIAkJcHN0YXQtPmZsYWdzIHw9IFdMQU5fU1RBX1dNRTsKIAotCQltZW1jcHkoJnBzdGF0LT5odHByaXYuaHRfY2FwLCBlbGVtcy5odF9jYXBhYmlsaXRpZXMsIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXApKTsKKwkJbWVtY3B5KCZwc3RhdC0+aHRwcml2Lmh0X2NhcCwKKwkJICAgICAgIGVsZW1zLmh0X2NhcGFiaWxpdGllcywgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSk7CiAJfSBlbHNlIHsKIAkJcHN0YXQtPmZsYWdzICY9IH5XTEFOX1NUQV9IVDsKIAl9CkBAIC0zNjM5LDcgKzM1ODQsNyBAQAogCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IE5VTEw7CiAJc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKIAl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7Ci0JdTggKmZyYW1lX2JvZHkgPSBwZnJhbWUgKyBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKKwl1OCAqZnJhbWVfYm9keSA9IHBmcmFtZSArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CiAJdTggY2F0ZWdvcnk7CiAJdTggYWN0aW9uOwogCkBAIC0zNzEzLDcgKzM2NTgsNyBAQAogCWlmIChwc3RhID09IE5VTEwpCiAJCXJldHVybiBfU1VDQ0VTUzsKIAotCWZyYW1lX2JvZHkgPSAodW5zaWduZWQgY2hhciAqKShwZnJhbWUgKyBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKSk7CisJZnJhbWVfYm9keSA9ICh1bnNpZ25lZCBjaGFyICopKHBmcmFtZSArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikpOwogCiAJY2F0ZWdvcnkgPSBmcmFtZV9ib2R5WzBdOwogCWlmIChjYXRlZ29yeSA9PSBSVFdfV0xBTl9DQVRFR09SWV9CQUNLKSB7IC8qICByZXByZXNlbnRpbmcgQmxvY2sgQWNrICovCkBAIC0zODAwLDcgKzM3NDUsNyBAQAogCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKIAl1OCAqZnJhbWVfYm9keTsKIAl1OCBkaWFsb2dUb2tlbiA9IDA7Ci0JZnJhbWVfYm9keSA9ICh1bnNpZ25lZCBjaGFyICopKHBmcmFtZSArIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpKTsKKwlmcmFtZV9ib2R5ID0gKHVuc2lnbmVkIGNoYXIgKikocGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7CiAKIAlkaWFsb2dUb2tlbiA9IGZyYW1lX2JvZHlbN107CiAKQEAgLTM4MTQsNyArMzc1OSw3IEBACiB7CiAJdW5zaWduZWQgaW50IHJldCA9IF9GQUlMOwogCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKLQl1OCAqZnJhbWVfYm9keSA9IHBmcmFtZSArIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOworCXU4ICpmcmFtZV9ib2R5ID0gcGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKIAogCWlmICghbWVtY21wKGZyYW1lX2JvZHkgKyAyLCBQMlBfT1VJLCA0KSkKIAkJcmV0ID0gb25fYWN0aW9uX3B1YmxpY19wMnAocHJlY3ZfZnJhbWUpOwpAQCAtMzgyNiw3ICszNzcxLDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgcmV0ID0gX0ZBSUw7CiAJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOwotCXU4ICpmcmFtZV9ib2R5ID0gcGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7CisJdTggKmZyYW1lX2JvZHkgPSBwZnJhbWUgKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwogCXU4IHRva2VuOwogCiAJdG9rZW4gPSBmcmFtZV9ib2R5WzJdOwpAQCAtMzg0NSw3ICszNzkwLDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgcmV0ID0gX0ZBSUw7CiAJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOwotCXU4ICpmcmFtZV9ib2R5ID0gcGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7CisJdTggKmZyYW1lX2JvZHkgPSBwZnJhbWUgKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwogCXU4IGNhdGVnb3J5LCBhY3Rpb247CiAKIAkvKiBjaGVjayBSQSBtYXRjaGVzIG9yIG5vdCAqLwpAQCAtMzkxNyw3ICszODYyLDcgQEAKIAl1bnNpZ25lZCBjaGFyCSpmcmFtZV9ib2R5OwogCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKIAotCWZyYW1lX2JvZHkgPSAodW5zaWduZWQgY2hhciAqKShwZnJhbWUgKyBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKSk7CisJZnJhbWVfYm9keSA9ICh1bnNpZ25lZCBjaGFyICopKHBmcmFtZSArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikpOwogCiAJY2F0ZWdvcnkgPSBmcmFtZV9ib2R5WzBdOwogCkBAIC00Mjk1LDcgKzQyNDAsNyBAQAogCiAJSU5JVF9MSVNUX0hFQUQoJnBjbWRfb2JqLT5saXN0KTsKIAotCXBjbWRfb2JqLT5jbWRjb2RlID0gR0VOX0NNRF9DT0RFKF9TZXRfTUxNRV9FVlQpOworCXBjbWRfb2JqLT5jbWRjb2RlID0gX1NldF9NTE1FX0VWVF9DTURfOwogCXBjbWRfb2JqLT5jbWRzeiA9IGNtZHN6OwogCXBjbWRfb2JqLT5wYXJtYnVmID0gcGV2dGNtZDsKIApAQCAtNDMwNCw3ICs0MjQ5LDcgQEAKIAogCXBjMmhfZXZ0X2hkciA9IChzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyICopKHBldnRjbWQpOwogCXBjMmhfZXZ0X2hkci0+bGVuID0gc2l6ZW9mKHN0cnVjdCBzdXJ2ZXlfZXZlbnQpOwotCXBjMmhfZXZ0X2hkci0+SUQgPSBHRU5fRVZUX0NPREUoX1N1cnZleSk7CisJcGMyaF9ldnRfaGRyLT5JRCA9IF9TdXJ2ZXlfRVZUXzsKIAlwYzJoX2V2dF9oZHItPnNlcSA9IGF0b21pY19pbmNfcmV0dXJuKCZwbWxtZWV4dC0+ZXZlbnRfc2VxKTsKIAogCXBzdXJ2ZXlfZXZ0ID0gKHN0cnVjdCBzdXJ2ZXlfZXZlbnQgKikocGV2dGNtZCArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKSk7CkBAIC00MzQ1LDcgKzQyOTAsNyBAQAogCiAJSU5JVF9MSVNUX0hFQUQoJnBjbWRfb2JqLT5saXN0KTsKIAotCXBjbWRfb2JqLT5jbWRjb2RlID0gR0VOX0NNRF9DT0RFKF9TZXRfTUxNRV9FVlQpOworCXBjbWRfb2JqLT5jbWRjb2RlID0gX1NldF9NTE1FX0VWVF9DTURfOwogCXBjbWRfb2JqLT5jbWRzeiA9IGNtZHN6OwogCXBjbWRfb2JqLT5wYXJtYnVmID0gcGV2dGNtZDsKIApAQCAtNDM1NCw3ICs0Mjk5LDcgQEAKIAogCXBjMmhfZXZ0X2hkciA9IChzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyICopKHBldnRjbWQpOwogCXBjMmhfZXZ0X2hkci0+bGVuID0gc2l6ZW9mKHN0cnVjdCBzdXJ2ZXlkb25lX2V2ZW50KTsKLQlwYzJoX2V2dF9oZHItPklEID0gR0VOX0VWVF9DT0RFKF9TdXJ2ZXlEb25lKTsKKwlwYzJoX2V2dF9oZHItPklEID0gX1N1cnZleURvbmVfRVZUXzsKIAlwYzJoX2V2dF9oZHItPnNlcSA9IGF0b21pY19pbmNfcmV0dXJuKCZwbWxtZWV4dC0+ZXZlbnRfc2VxKTsKIAogCXBzdXJ2ZXlkb25lX2V2dCA9IChzdHJ1Y3Qgc3VydmV5ZG9uZV9ldmVudCAqKShwZXZ0Y21kICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpKTsKQEAgLTQzODksNyArNDMzNCw3IEBACiAKIAlJTklUX0xJU1RfSEVBRCgmcGNtZF9vYmotPmxpc3QpOwogCi0JcGNtZF9vYmotPmNtZGNvZGUgPSBHRU5fQ01EX0NPREUoX1NldF9NTE1FX0VWVCk7CisJcGNtZF9vYmotPmNtZGNvZGUgPSBfU2V0X01MTUVfRVZUX0NNRF87CiAJcGNtZF9vYmotPmNtZHN6ID0gY21kc3o7CiAJcGNtZF9vYmotPnBhcm1idWYgPSBwZXZ0Y21kOwogCkBAIC00Mzk4LDcgKzQzNDMsNyBAQAogCiAJcGMyaF9ldnRfaGRyID0gKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIgKikocGV2dGNtZCk7CiAJcGMyaF9ldnRfaGRyLT5sZW4gPSBzaXplb2Yoc3RydWN0IGpvaW5ic3NfZXZlbnQpOwotCXBjMmhfZXZ0X2hkci0+SUQgPSBHRU5fRVZUX0NPREUoX0pvaW5Cc3MpOworCXBjMmhfZXZ0X2hkci0+SUQgPSBfSm9pbkJzc19FVlRfOwogCXBjMmhfZXZ0X2hkci0+c2VxID0gYXRvbWljX2luY19yZXR1cm4oJnBtbG1lZXh0LT5ldmVudF9zZXEpOwogCiAJcGpvaW5ic3NfZXZ0ID0gKHN0cnVjdCBqb2luYnNzX2V2ZW50ICopKHBldnRjbWQgKyBzaXplb2Yoc3RydWN0IEMySEV2ZW50X0hlYWRlcikpOwpAQCAtNDQ0MCw3ICs0Mzg1LDcgQEAKIAogCUlOSVRfTElTVF9IRUFEKCZwY21kX29iai0+bGlzdCk7CiAKLQlwY21kX29iai0+Y21kY29kZSA9IEdFTl9DTURfQ09ERShfU2V0X01MTUVfRVZUKTsKKwlwY21kX29iai0+Y21kY29kZSA9IF9TZXRfTUxNRV9FVlRfQ01EXzsKIAlwY21kX29iai0+Y21kc3ogPSBjbWRzejsKIAlwY21kX29iai0+cGFybWJ1ZiA9IHBldnRjbWQ7CiAKQEAgLTQ0NDksMTEgKzQzOTQsMTEgQEAKIAogCXBjMmhfZXZ0X2hkciA9IChzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyICopKHBldnRjbWQpOwogCXBjMmhfZXZ0X2hkci0+bGVuID0gc2l6ZW9mKHN0cnVjdCBzdGFkZWxfZXZlbnQpOwotCXBjMmhfZXZ0X2hkci0+SUQgPSBHRU5fRVZUX0NPREUoX0RlbFNUQSk7CisJcGMyaF9ldnRfaGRyLT5JRCA9IF9EZWxTVEFfRVZUXzsKIAlwYzJoX2V2dF9oZHItPnNlcSA9IGF0b21pY19pbmNfcmV0dXJuKCZwbWxtZWV4dC0+ZXZlbnRfc2VxKTsKIAogCXBkZWxfc3RhX2V2dCA9IChzdHJ1Y3Qgc3RhZGVsX2V2ZW50ICopKHBldnRjbWQgKyBzaXplb2Yoc3RydWN0IEMySEV2ZW50X0hlYWRlcikpOwotCW1lbWNweSgodW5zaWduZWQgY2hhciAqKSgmKHBkZWxfc3RhX2V2dC0+bWFjYWRkcikpLCBNYWNBZGRyLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KCh1bnNpZ25lZCBjaGFyICopKCYocGRlbF9zdGFfZXZ0LT5tYWNhZGRyKSksIE1hY0FkZHIpOwogCW1lbWNweSgodW5zaWduZWQgY2hhciAqKShwZGVsX3N0YV9ldnQtPnJzdmQpLCAodW5zaWduZWQgY2hhciAqKSgmcmVhc29uKSwgMik7CiAKIApAQCAtNDQ5Myw3ICs0NDM4LDcgQEAKIAogCUlOSVRfTElTVF9IRUFEKCZwY21kX29iai0+bGlzdCk7CiAKLQlwY21kX29iai0+Y21kY29kZSA9IEdFTl9DTURfQ09ERShfU2V0X01MTUVfRVZUKTsKKwlwY21kX29iai0+Y21kY29kZSA9IF9TZXRfTUxNRV9FVlRfQ01EXzsKIAlwY21kX29iai0+Y21kc3ogPSBjbWRzejsKIAlwY21kX29iai0+cGFybWJ1ZiA9IHBldnRjbWQ7CiAKQEAgLTQ1MDIsMTEgKzQ0NDcsMTEgQEAKIAogCXBjMmhfZXZ0X2hkciA9IChzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyICopKHBldnRjbWQpOwogCXBjMmhfZXZ0X2hkci0+bGVuID0gc2l6ZW9mKHN0cnVjdCBzdGFzc29jX2V2ZW50KTsKLQlwYzJoX2V2dF9oZHItPklEID0gR0VOX0VWVF9DT0RFKF9BZGRTVEEpOworCXBjMmhfZXZ0X2hkci0+SUQgPSBfQWRkU1RBX0VWVF87CiAJcGMyaF9ldnRfaGRyLT5zZXEgPSBhdG9taWNfaW5jX3JldHVybigmcG1sbWVleHQtPmV2ZW50X3NlcSk7CiAKIAlwYWRkX3N0YV9ldnQgPSAoc3RydWN0IHN0YXNzb2NfZXZlbnQgKikocGV2dGNtZCArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKSk7Ci0JbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopKCYocGFkZF9zdGFfZXZ0LT5tYWNhZGRyKSksIE1hY0FkZHIsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkoKHVuc2lnbmVkIGNoYXIgKikoJihwYWRkX3N0YV9ldnQtPm1hY2FkZHIpKSwgTWFjQWRkcik7CiAJcGFkZF9zdGFfZXZ0LT5jYW1faWQgPSBjYW1faWR4OwogCiAJREJHXzg4RSgicmVwb3J0X2FkZF9zdGFfZXZlbnQ6IGFkZCBTVEFcbiIpOwpAQCAtNDUzNyw3ICs0NDgyLDcgQEAKIAogCQlwc3RhLT5odHByaXYuYW1wZHVfZW5hYmxlID0gcG1sbWVwcml2LT5odHByaXYuYW1wZHVfZW5hYmxlOwogCi0JCWlmIChzdXBwb3J0X3Nob3J0X0dJKHBhZGFwdGVyLCAmKHBtbG1laW5mby0+SFRfY2FwcykpKQorCQlpZiAoc3VwcG9ydF9zaG9ydF9HSShwYWRhcHRlciwgJnBtbG1laW5mby0+SFRfY2FwcykpCiAJCQlwc3RhLT5odHByaXYuc2dpID0gdHJ1ZTsKIAogCQlwc3RhLT5xb3Nfb3B0aW9uID0gdHJ1ZTsKQEAgLTQ5MDQsNyArNDg0OSw3IEBACiAJCQlnb3RvIGV4aXRfc3VydmV5X3RpbWVyX2hkbDsKIAkJfQogCi0JCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHBzdXJ2ZXlQYXJhLCBHRU5fQ01EX0NPREUoX1NpdGVTdXJ2ZXkpKTsKKwkJaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHN1cnZleVBhcmEsIF9TaXRlU3VydmV5X0NNRF8pOwogCQlydHdfZW5xdWV1ZV9jbWQocGNtZHByaXYsIHBoMmMpOwogCX0KIApAQCAtNTQ4MCw3ICs1NDI1LDcgQEAKIAkJCQkgICAgICBwbWxtZWluZm8tPmhpZGRlbl9zc2lkX21vZGUpOwogCXB0eEJlYWNvbl9wYXJtLT5JRUxlbmd0aCArPSBsZW5fZGlmZjsKIAotCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHB0eEJlYWNvbl9wYXJtLCBHRU5fQ01EX0NPREUoX1RYX0JlYWNvbikpOworCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHB0eEJlYWNvbl9wYXJtLCBfVFhfQmVhY29uX0NNRF8pOwogCiAJcmVzID0gcnR3X2VucXVldWVfY21kKHBjbWRwcml2LCBwaDJjKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19wd3JjdHJsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3B3cmN0cmwuYwppbmRleCA1OWM2ZDhhLi4wYjcwZmU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3B3cmN0cmwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3B3cmN0cmwuYwpAQCAtMzgsNyArMzgsNyBAQAogCUxlYXZlQWxsUG93ZXJTYXZlTW9kZShwYWRhcHRlcik7CiAKIAlEQkdfODhFKCI9PT4gcnR3X2h3X3N1c3BlbmRcbiIpOwotCV9lbnRlcl9wd3Jsb2NrKCZwd3Jwcml2LT5sb2NrKTsKKwltdXRleF9sb2NrKCZwd3Jwcml2LT5tdXRleF9sb2NrKTsKIAlwd3Jwcml2LT5iaXBzX3Byb2Nlc3NpbmcgPSB0cnVlOwogCS8qIHMxLiAqLwogCWlmIChwbmV0ZGV2KSB7CkBAIC03Myw3ICs3Myw3IEBACiAJcHdycHJpdi0+cmZfcHdyc3RhdGUgPSByZl9vZmY7CiAJcHdycHJpdi0+Ymlwc19wcm9jZXNzaW5nID0gZmFsc2U7CiAKLQlfZXhpdF9wd3Jsb2NrKCZwd3Jwcml2LT5sb2NrKTsKKwltdXRleF91bmxvY2soJnB3cnByaXYtPm11dGV4X2xvY2spOwogCiAJcmV0dXJuIDA7CiAKQEAgLTkwLDEyICs5MCwxMiBAQAogCiAJLyogc3lzdGVtIHJlc3VtZSAqLwogCURCR184OEUoIj09PiBydHdfaHdfcmVzdW1lXG4iKTsKLQlfZW50ZXJfcHdybG9jaygmcHdycHJpdi0+bG9jayk7CisJbXV0ZXhfbG9jaygmcHdycHJpdi0+bXV0ZXhfbG9jayk7CiAJcHdycHJpdi0+Ymlwc19wcm9jZXNzaW5nID0gdHJ1ZTsKIAlydHdfcmVzZXRfZHJ2X3N3KHBhZGFwdGVyKTsKIAogCWlmIChwbV9uZXRkZXZfb3BlbihwbmV0ZGV2LCBmYWxzZSkgIT0gMCkgewotCQlfZXhpdF9wd3Jsb2NrKCZwd3Jwcml2LT5sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZwd3Jwcml2LT5tdXRleF9sb2NrKTsKIAkJZ290byBlcnJvcl9leGl0OwogCX0KIApAQCAtMTEzLDcgKzExMyw3IEBACiAJcHdycHJpdi0+cmZfcHdyc3RhdGUgPSByZl9vbjsKIAlwd3Jwcml2LT5iaXBzX3Byb2Nlc3NpbmcgPSBmYWxzZTsKIAotCV9leGl0X3B3cmxvY2soJnB3cnByaXYtPmxvY2spOworCW11dGV4X3VubG9jaygmcHdycHJpdi0+bXV0ZXhfbG9jayk7CiAKIAogCXJldHVybiAwOwpAQCAtMTM4LDcgKzEzOCw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlfZW50ZXJfcHdybG9jaygmcHdycHJpdi0+bG9jayk7CisJbXV0ZXhfbG9jaygmcHdycHJpdi0+bXV0ZXhfbG9jayk7CiAKIAlwd3Jwcml2LT5iaXBzX3Byb2Nlc3NpbmcgPSB0cnVlOwogCkBAIC0xNTksNyArMTU5LDcgQEAKIAl9CiAJcHdycHJpdi0+Ymlwc19wcm9jZXNzaW5nID0gZmFsc2U7CiAKLQlfZXhpdF9wd3Jsb2NrKCZwd3Jwcml2LT5sb2NrKTsKKwltdXRleF91bmxvY2soJnB3cnByaXYtPm11dGV4X2xvY2spOwogfQogCiBpbnQgaXBzX2xlYXZlKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKQEAgLTE3MSw3ICsxNzEsNyBAQAogCWludCBrZXlpZDsKIAogCi0JX2VudGVyX3B3cmxvY2soJnB3cnByaXYtPmxvY2spOworCW11dGV4X2xvY2soJnB3cnByaXYtPm11dGV4X2xvY2spOwogCiAJaWYgKChwd3Jwcml2LT5yZl9wd3JzdGF0ZSA9PSByZl9vZmYpICYmICghcHdycHJpdi0+Ymlwc19wcm9jZXNzaW5nKSkgewogCQlwd3Jwcml2LT5iaXBzX3Byb2Nlc3NpbmcgPSB0cnVlOwpAQCAtMjA1LDcgKzIwNSw3IEBACiAJCXB3cnByaXYtPmJwb3dlcl9zYXZpbmcgPSBmYWxzZTsKIAl9CiAKLQlfZXhpdF9wd3Jsb2NrKCZwd3Jwcml2LT5sb2NrKTsKKwltdXRleF91bmxvY2soJnB3cnByaXYtPm11dGV4X2xvY2spOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTUwNCw3ICs1MDQsNyBAQAogewogCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cmN0cmxwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKIAotCV9pbml0X3B3cmxvY2soJnB3cmN0cmxwcml2LT5sb2NrKTsKKwltdXRleF9pbml0KCZwd3JjdHJscHJpdi0+bXV0ZXhfbG9jayk7CiAJcHdyY3RybHByaXYtPnJmX3B3cnN0YXRlID0gcmZfb247CiAJcHdyY3RybHByaXYtPmlwc19lbnRlcl9jbnRzID0gMDsKIAlwd3JjdHJscHJpdi0+aXBzX2xlYXZlX2NudHMgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19yZWN2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3JlY3YuYwppbmRleCA5NzdiYjI1Li5iODdjYmJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3JlY3YuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3JlY3YuYwpAQCAtMzksNyArMzksNyBAQAogICAgICAgIDB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAKIH07CiAKLXZvaWQgcnR3X3NpZ25hbF9zdGF0X3RpbWVyX2hkbCh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgcnR3X3NpZ25hbF9zdGF0X3RpbWVyX2hkbCh1bnNpZ25lZCBsb25nIGRhdGEpOwogCiB2b2lkIF9ydHdfaW5pdF9zdGFfcmVjdl9wcml2KHN0cnVjdCBzdGFfcmVjdl9wcml2ICpwc3RhX3JlY3Zwcml2KQogewpAQCAtNzMsNyArNzMsNyBAQAogCWlmICghcHJlY3Zwcml2LT5wYWxsb2NhdGVkX2ZyYW1lX2J1ZikKIAkJcmV0dXJuIF9GQUlMOwogCi0JcHJlY3Zwcml2LT5wcmVjdl9mcmFtZV9idWYgPSAodTggKilOX0JZVEVfQUxJR01FTlQoKHNpemVfdCkocHJlY3Zwcml2LT5wYWxsb2NhdGVkX2ZyYW1lX2J1ZiksIFJYRlJBTUVfQUxJR05fU1opOworCXByZWN2cHJpdi0+cHJlY3ZfZnJhbWVfYnVmID0gUFRSX0FMSUdOKHByZWN2cHJpdi0+cGFsbG9jYXRlZF9mcmFtZV9idWYsIFJYRlJBTUVfQUxJR05fU1opOwogCiAJcHJlY3ZmcmFtZSA9IChzdHJ1Y3QgcmVjdl9mcmFtZSAqKXByZWN2cHJpdi0+cHJlY3ZfZnJhbWVfYnVmOwogCkBAIC0yMDg4LDcgKzIwODgsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgcnR3X3NpZ25hbF9zdGF0X3RpbWVyX2hkbCh1bnNpZ25lZCBsb25nIGRhdGEpCitzdGF0aWMgdm9pZCBydHdfc2lnbmFsX3N0YXRfdGltZXJfaGRsKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKWRhdGE7CiAJc3RydWN0IHJlY3ZfcHJpdiAqcmVjdnByaXYgPSAmYWRhcHRlci0+cmVjdnByaXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3JmLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3JmLmMKaW5kZXggM2ZjMWE4Zi4uZTQ3YmU4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19yZi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcmYuYwpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPHJlY3Zfb3NkZXAuaD4KICNpbmNsdWRlIDx4bWl0X29zZGVwLmg+CiAKLQogc3RydWN0IGNoX2ZyZXEgewogCXUzMiBjaGFubmVsOwogCXUzMiBmcmVxdWVuY3k7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3NlY3VyaXR5LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3NlY3VyaXR5LmMKaW5kZXggNDQyYTYxNC4uODViYjQ0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19zZWN1cml0eS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfc2VjdXJpdHkuYwpAQCAtMjMzLDcgKzIzMyw2IEBACiAJCQkJICZjcmMsICZwYXlsb2FkW2xlbmd0aC00XSkpOwogCQl9CiAJfQotCXJldHVybjsKIH0KIAogLyogMwkJPT09PT0gVEtJUCByZWxhdGVkID09PT09ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3NyZXNldC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19zcmVzZXQuYwppbmRleCAxM2E1YmY0Li5hMTk4YzU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3NyZXNldC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfc3Jlc2V0LmMKQEAgLTE2LDE4ICsxNiwxNiBAQAogI2luY2x1ZGUgPHJ0d19zcmVzZXQuaD4KICNpbmNsdWRlIDx1c2Jfb3BzX2xpbnV4Lmg+CiAKLXZvaWQgc3Jlc2V0X2luaXRfdmFsdWUoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQordm9pZCBydHdfaGFsX3NyZXNldF9pbml0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3Qgc3Jlc2V0X3ByaXYgKnBzcnRwcml2ID0gJnBIYWxEYXRhLT5zcmVzdHByaXY7CisJc3RydWN0IHNyZXNldF9wcml2ICpwc3J0cHJpdiA9ICZwYWRhcHRlci0+SGFsRGF0YS0+c3Jlc3Rwcml2OwogCiAJcHNydHByaXYtPldpZmlfRXJyb3JfU3RhdHVzID0gV0lGSV9TVEFUVVNfU1VDQ0VTUzsKIH0KIAogdTggc3Jlc2V0X2dldF93aWZpX3N0YXR1cyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IHNyZXNldF9wcml2ICpwc3J0cHJpdiA9ICZwSGFsRGF0YS0+c3Jlc3Rwcml2OworCXN0cnVjdCBzcmVzZXRfcHJpdiAqcHNydHByaXYgPSAmcGFkYXB0ZXItPkhhbERhdGEtPnNyZXN0cHJpdjsKIAogCXU4IHN0YXR1cyA9IFdJRklfU1RBVFVTX1NVQ0NFU1M7CiAJdTMyIHZhbDMyID0gMDsKQEAgLTU0LDYgKzUyLDUgQEAKIAogdm9pZCBzcmVzZXRfc2V0X3dpZmlfZXJyb3Jfc3RhdHVzKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTMyIHN0YXR1cykKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlwSGFsRGF0YS0+c3Jlc3Rwcml2LldpZmlfRXJyb3JfU3RhdHVzID0gc3RhdHVzOworCXBhZGFwdGVyLT5IYWxEYXRhLT5zcmVzdHByaXYuV2lmaV9FcnJvcl9TdGF0dXMgPSBzdGF0dXM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3dsYW5fdXRpbC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d193bGFuX3V0aWwuYwppbmRleCA0NDEwZmU4Li4yYTY1YWM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3dsYW5fdXRpbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfd2xhbl91dGlsLmMKQEAgLTM0MSw5ICszNDEsNiBAQAogewogCXU4IGNlbnRlcl9jaDsKIAotCWlmIChwYWRhcHRlci0+Yk5vdGlmeUNoYW5uZWxDaGFuZ2UpCi0JCURCR184OEUoIlslc10gY2ggPSAlZCwgb2Zmc2V0ID0gJWQsIGJ3bW9kZSA9ICVkXG4iLCBfX2Z1bmNfXywgY2hhbm5lbCwgY2hhbm5lbF9vZmZzZXQsIGJ3bW9kZSk7Ci0KIAlpZiAoKGJ3bW9kZSA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwKSB8fAogCSAgICAoY2hhbm5lbF9vZmZzZXQgPT0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRSkpIHsKIAkJLyogU2VsZWN0Q2hhbm5lbChwYWRhcHRlciwgY2hhbm5lbCk7ICovCkBAIC03MTYsNiArNzEzLDcgQEAKIAlzdHJ1Y3QgbWxtZV9leHRfaW5mbwkqcG1sbWVpbmZvID0gJihwbWxtZWV4dC0+bWxtZXh0X2luZm8pOwogCXN0cnVjdCBtbG1lX3ByaXYJCSpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCXN0cnVjdCBodF9wcml2CQkJKnBodHByaXYgPSAmcG1sbWVwcml2LT5odHByaXY7CisJdTggKkhUX2NhcCA9ICh1OCAqKSgmcG1sbWVpbmZvLT5IVF9jYXBzKTsKIAogCWlmIChwSUUgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtNzI4LDIwICs3MjYsMjAgQEAKIAlmb3IgKGkgPSAwOyBpIDwgKHBJRS0+TGVuZ3RoKTsgaSsrKSB7CiAJCWlmIChpICE9IDIpIHsKIAkJCS8qCUdvdCB0aGUgZW5kaWFuIGlzc3VlIGhlcmUuICovCi0JCQlwbWxtZWluZm8tPkhUX2NhcHMudS5IVF9jYXBbaV0gJj0gKHBJRS0+ZGF0YVtpXSk7CisJCQlIVF9jYXBbaV0gJj0gKHBJRS0+ZGF0YVtpXSk7CiAJCX0gZWxzZSB7CiAJCQkvKiBtb2RpZnkgZnJvbSAgZncgYnkgVGhvbWFzIDIwMTAvMTEvMTcgKi8KLQkJCWlmICgocG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuQU1QRFVfcGFyYSAmIDB4MykgPiAocElFLT5kYXRhW2ldICYgMHgzKSkKKwkJCWlmICgocG1sbWVpbmZvLT5IVF9jYXBzLmFtcGR1X3BhcmFtc19pbmZvICYgMHgzKSA+IChwSUUtPmRhdGFbaV0gJiAweDMpKQogCQkJCW1heF9BTVBEVV9sZW4gPSBwSUUtPmRhdGFbaV0gJiAweDM7CiAJCQllbHNlCi0JCQkJbWF4X0FNUERVX2xlbiA9IHBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50LkFNUERVX3BhcmEgJiAweDM7CisJCQkJbWF4X0FNUERVX2xlbiA9IHBtbG1laW5mby0+SFRfY2Fwcy5hbXBkdV9wYXJhbXNfaW5mbyAmIDB4MzsKIAotCQkJaWYgKChwbWxtZWluZm8tPkhUX2NhcHMudS5IVF9jYXBfZWxlbWVudC5BTVBEVV9wYXJhICYgMHgxYykgPiAocElFLT5kYXRhW2ldICYgMHgxYykpCi0JCQkJbWluX01QRFVfc3BhY2luZyA9IHBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50LkFNUERVX3BhcmEgJiAweDFjOworCQkJaWYgKChwbWxtZWluZm8tPkhUX2NhcHMuYW1wZHVfcGFyYW1zX2luZm8gJiAweDFjKSA+IChwSUUtPmRhdGFbaV0gJiAweDFjKSkKKwkJCQltaW5fTVBEVV9zcGFjaW5nID0gcG1sbWVpbmZvLT5IVF9jYXBzLmFtcGR1X3BhcmFtc19pbmZvICYgMHgxYzsKIAkJCWVsc2UKIAkJCQltaW5fTVBEVV9zcGFjaW5nID0gcElFLT5kYXRhW2ldICYgMHgxYzsKIAotCQkJcG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuQU1QRFVfcGFyYSA9IG1heF9BTVBEVV9sZW4gfCBtaW5fTVBEVV9zcGFjaW5nOworCQkJcG1sbWVpbmZvLT5IVF9jYXBzLmFtcGR1X3BhcmFtc19pbmZvID0gbWF4X0FNUERVX2xlbiB8IG1pbl9NUERVX3NwYWNpbmc7CiAJCX0KIAl9CiAKQEAgLTc1MCw5ICs3NDgsOSBAQAogCS8qIHVwZGF0ZSB0aGUgTUNTIHJhdGVzICovCiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKIAkJaWYgKChyZl90eXBlID09IFJGXzFUMVIpIHx8IChyZl90eXBlID09IFJGXzFUMlIpKQotCQkJcG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuTUNTX3JhdGVbaV0gJj0gTUNTX3JhdGVfMVJbaV07CisJCQkoKHU4ICopJnBtbG1laW5mby0+SFRfY2Fwcy5tY3MpW2ldICY9IE1DU19yYXRlXzFSW2ldOwogCQllbHNlCi0JCQlwbWxtZWluZm8tPkhUX2NhcHMudS5IVF9jYXBfZWxlbWVudC5NQ1NfcmF0ZVtpXSAmPSBNQ1NfcmF0ZV8yUltpXTsKKwkJCSgodTggKikmcG1sbWVpbmZvLT5IVF9jYXBzLm1jcylbaV0gJj0gTUNTX3JhdGVfMlJbaV07CiAJfQogfQogCkBAIC03OTgsOSArNzk2LDkgQEAKIAkJQU1QRFVfcGFyYSBbMTowXTpNYXggQU1QRFUgTGVuID0+IDA6OGsgLCAxOjE2aywgMjozMmssIDM6NjRrCiAJCUFNUERVX3BhcmEgWzQ6Ml06TWluIE1QRFUgU3RhcnQgU3BhY2luZwogCSovCi0JbWF4X0FNUERVX2xlbiA9IHBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50LkFNUERVX3BhcmEgJiAweDAzOworCW1heF9BTVBEVV9sZW4gPSBwbWxtZWluZm8tPkhUX2NhcHMuYW1wZHVfcGFyYW1zX2luZm8gJiAweDAzOwogCi0JbWluX01QRFVfc3BhY2luZyA9IChwbWxtZWluZm8tPkhUX2NhcHMudS5IVF9jYXBfZWxlbWVudC5BTVBEVV9wYXJhICYgMHgxYykgPj4gMjsKKwltaW5fTVBEVV9zcGFjaW5nID0gKHBtbG1laW5mby0+SFRfY2Fwcy5hbXBkdV9wYXJhbXNfaW5mbyAmIDB4MWMpID4+IDI7CiAKIAlydHdfaGFsX3NldF9od3JlZyhwYWRhcHRlciwgSFdfVkFSX0FNUERVX01JTl9TUEFDRSwgKHU4ICopKCZtaW5fTVBEVV9zcGFjaW5nKSk7CiAKQEAgLTg3Miw3ICs4NzAsNiBAQAogCXUzMiB3cGFfaWVsZW4gPSAwOwogCXU4ICpwYnNzaWQgPSBHZXRBZGRyM1B0cihwZnJhbWUpOwogCXN0cnVjdCBIVF9pbmZvX2VsZW1lbnQgKnBodF9pbmZvID0gTlVMTDsKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXAgKnBodF9jYXAgPSBOVUxMOwogCXUzMiBiY25fY2hhbm5lbDsKIAl1bnNpZ25lZCBzaG9ydAlodF9jYXBfaW5mbzsKIAl1bnNpZ25lZCBjaGFyCWh0X2luZm9faW5mb3NfMDsKQEAgLTg4MSw3ICs4NzgsNyBAQAogCWlmIChpc19jbGllbnRfYXNzb2NpYXRlZF90b19hcChBZGFwdGVyKSA9PSBmYWxzZSkKIAkJcmV0dXJuIHRydWU7CiAKLQlsZW4gPSBwYWNrZXRfbGVuIC0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7CisJbGVuID0gcGFja2V0X2xlbiAtIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CiAKIAlpZiAobGVuID4gTUFYX0lFX1NaKSB7CiAJCURCR184OEUoIiVzIElFIHRvbyBsb25nIGZvciBzdXJ2ZXkgZXZlbnRcbiIsIF9fZnVuY19fKTsKQEAgLTkwNywxNCArOTA0LDE2IEBACiAKIAkvKiBiZWxvdyBpcyB0byBjb3B5IHRoZSBpbmZvcm1hdGlvbiBlbGVtZW50ICovCiAJYnNzaWQtPklFTGVuZ3RoID0gbGVuOwotCW1lbWNweShic3NpZC0+SUVzLCAocGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcikpLCBic3NpZC0+SUVMZW5ndGgpOworCW1lbWNweShic3NpZC0+SUVzLCAocGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSksIGJzc2lkLT5JRUxlbmd0aCk7CiAKIAkvKiBjaGVjayBidyBhbmQgY2hhbm5lbCBvZmZzZXQgKi8KIAkvKiBwYXJzaW5nIEhUX0NBUF9JRSAqLwogCXAgPSBydHdfZ2V0X2llKGJzc2lkLT5JRXMgKyBfRklYRURfSUVfTEVOR1RIXywgX0hUX0NBUEFCSUxJVFlfSUVfLCAmbGVuLCBic3NpZC0+SUVMZW5ndGggLSBfRklYRURfSUVfTEVOR1RIXyk7CiAJaWYgKHAgJiYgbGVuID4gMCkgewotCQlwaHRfY2FwID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCAqKShwICsgMik7Ci0JCWh0X2NhcF9pbmZvID0gcGh0X2NhcC0+Y2FwX2luZm87CisJCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXAgPQorCQkJKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICopKHAgKyAyKTsKKworCQlodF9jYXBfaW5mbyA9IGxlMTZfdG9fY3B1KGh0X2NhcC0+Y2FwX2luZm8pOwogCX0gZWxzZSB7CiAJCWh0X2NhcF9pbmZvID0gMDsKIAl9CkBAIC0xMjQzLDE2ICsxMjQyLDE3IEBACiAJcmV0dXJuIG1hc2s7CiB9CiAKLXVuc2lnbmVkIGludCB1cGRhdGVfTVNDX3JhdGUoc3RydWN0IEhUX2NhcHNfZWxlbWVudCAqcEhUX2NhcHMpCit1bnNpZ25lZCBpbnQgdXBkYXRlX01TQ19yYXRlKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpwSFRfY2FwcykKIHsKIAl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CiAKLQltYXNrID0gKHBIVF9jYXBzLT51LkhUX2NhcF9lbGVtZW50Lk1DU19yYXRlWzBdIDw8IDEyKSB8IChwSFRfY2Fwcy0+dS5IVF9jYXBfZWxlbWVudC5NQ1NfcmF0ZVsxXSA8PCAyMCk7CisJbWFzayA9IChwSFRfY2Fwcy0+bWNzLnJ4X21hc2tbMF0gPDwgMTIpIHwKKwkgICAgICAgKHBIVF9jYXBzLT5tY3MucnhfbWFza1sxXSA8PCAyMCk7CiAKIAlyZXR1cm4gbWFzazsKIH0KIAotaW50IHN1cHBvcnRfc2hvcnRfR0koc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgSFRfY2Fwc19lbGVtZW50ICpwSFRfY2FwcykKK2ludCBzdXBwb3J0X3Nob3J0X0dJKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKnBIVF9jYXBzKQogewogCXVuc2lnbmVkIGNoYXIJCQkJCWJpdF9vZmZzZXQ7CiAJc3RydWN0IG1sbWVfZXh0X3ByaXYJKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKQEAgLTEyNjYsNyArMTI2Niw3IEBACiAKIAliaXRfb2Zmc2V0ID0gKHBtbG1lZXh0LT5jdXJfYndtb2RlICYgSFRfQ0hBTk5FTF9XSURUSF80MCkgPyA2IDogNTsKIAotCWlmIChfX2xlMTZfdG9fY3B1KHBIVF9jYXBzLT51LkhUX2NhcF9lbGVtZW50LkhUX2NhcHNfaW5mbykgJiAoMHgxIDw8IGJpdF9vZmZzZXQpKQorCWlmIChfX2xlMTZfdG9fY3B1KHBIVF9jYXBzLT5jYXBfaW5mbykgJiAoMHgxIDw8IGJpdF9vZmZzZXQpKQogCQlyZXR1cm4gX1NVQ0NFU1M7CiAJZWxzZQogCQlyZXR1cm4gX0ZBSUw7CkBAIC0xNTA4LDcgKzE1MDgsNyBAQAogCVNJRlNfVGltZXIgPSAweDBhMGEwODA4Oy8qIDB4MDgwOCAtPiBmb3IgQ0NLLCAweDBhMGEgLT4gZm9yIE9GRE0gKi8KIAkJCQkvKiBjaGFuZ2UgdGhpcyB2YWx1ZSBpZiBoYXZpbmcgSU9UIGlzc3Vlcy4gKi8KIAotCXBhZGFwdGVyLT5IYWxGdW5jLlNldEh3UmVnSGFuZGxlcihwYWRhcHRlciwgSFdfVkFSX1JFU1BfU0lGUywgICh1OCAqKSZTSUZTX1RpbWVyKTsKKwlydHdfaGFsX3NldF9od3JlZyhwYWRhcHRlciwgSFdfVkFSX1JFU1BfU0lGUywgICh1OCAqKSZTSUZTX1RpbWVyKTsKIAogCWlmIChwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgJiBXSVJFTEVTU18xMUIpCiAJCXVwZGF0ZV9tZ250X3R4X3JhdGUocGFkYXB0ZXIsIElFRUU4MDIxMV9DQ0tfUkFURV8xTUIpOwpAQCAtMTU4NCw3ICsxNTg0LDcgQEAKIAl1OCAqcElFOwogCV9fbGUzMiAqcGJ1ZjsKIAotCXBJRSA9IHBmcmFtZSArIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOworCXBJRSA9IHBmcmFtZSArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CiAJcGJ1ZiA9IChfX2xlMzIgKilwSUU7CiAKIAlwbWxtZWV4dC0+VFNGVmFsdWUgPSBsZTMyX3RvX2NwdSgqKHBidWYrMSkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d194bWl0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3htaXQuYwppbmRleCBlMGE1NTY3Li4wZjhiOGUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3htaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3htaXQuYwpAQCAtNTcsOCArNTcsNiBAQAogCS8qICBXZSBkb24ndCBuZWVkIHRvIG1lbXNldCBwYWRhcHRlci0+WFhYIHRvIHplcm8sIGJlY2F1c2UgYWRhcHRlciBpcyBhbGxvY2F0ZWQgYnkgdnphbGxvYygpLiAqLwogCiAJc3Bpbl9sb2NrX2luaXQoJnB4bWl0cHJpdi0+bG9jayk7Ci0Jc2VtYV9pbml0KCZweG1pdHByaXYtPnhtaXRfc2VtYSwgMCk7Ci0Jc2VtYV9pbml0KCZweG1pdHByaXYtPnRlcm1pbmF0ZV94bWl0dGhyZWFkX3NlbWEsIDApOwogCiAJLyoKIAlQbGVhc2UgaW5zZXJ0IGFsbCB0aGUgcXVldWUgaW5pdGlhbGl6YWl0b24gdXNpbmcgX3J0d19pbml0X3F1ZXVlIGJlbG93CkBAIC04OCw3ICs4Niw3IEBACiAJCXJlcyA9IF9GQUlMOwogCQlnb3RvIGV4aXQ7CiAJfQotCXB4bWl0cHJpdi0+cHhtaXRfZnJhbWVfYnVmID0gKHU4ICopTl9CWVRFX0FMSUdNRU5UKChzaXplX3QpKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF9mcmFtZV9idWYpLCA0KTsKKwlweG1pdHByaXYtPnB4bWl0X2ZyYW1lX2J1ZiA9IFBUUl9BTElHTihweG1pdHByaXYtPnBhbGxvY2F0ZWRfZnJhbWVfYnVmLCA0KTsKIAkvKiBweG1pdHByaXYtPnB4bWl0X2ZyYW1lX2J1ZiA9IHB4bWl0cHJpdi0+cGFsbG9jYXRlZF9mcmFtZV9idWYgKyA0IC0gKi8KIAkvKiAJCQkJCQkoKHNpemVfdCkgKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF9mcmFtZV9idWYpICYzKTsgKi8KIApAQCAtMTI2LDcgKzEyNCw3IEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKLQlweG1pdHByaXYtPnB4bWl0YnVmID0gKHU4ICopTl9CWVRFX0FMSUdNRU5UKChzaXplX3QpKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0YnVmKSwgNCk7CisJcHhtaXRwcml2LT5weG1pdGJ1ZiA9IFBUUl9BTElHTihweG1pdHByaXYtPnBhbGxvY2F0ZWRfeG1pdGJ1ZiwgNCk7CiAJLyogcHhtaXRwcml2LT5weG1pdGJ1ZiA9IHB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0YnVmICsgNCAtICovCiAJLyogCQkJCQkJKChzaXplX3QpIChweG1pdHByaXYtPnBhbGxvY2F0ZWRfeG1pdGJ1ZikgJjMpOyAqLwogCkBAIC0xNDQsOSArMTQyLDggQEAKIAkJaWYgKHJlcyA9PSBfRkFJTCkgewogCQkJbXNsZWVwKDEwKTsKIAkJCXJlcyA9IHJ0d19vc194bWl0X3Jlc291cmNlX2FsbG9jKHBhZGFwdGVyLCBweG1pdGJ1ZiwgKE1BWF9YTUlUQlVGX1NaICsgWE1JVEJVRl9BTElHTl9TWikpOwotCQkJaWYgKHJlcyA9PSBfRkFJTCkgeworCQkJaWYgKHJlcyA9PSBfRkFJTCkKIAkJCQlnb3RvIGV4aXQ7Ci0JCQl9CiAJCX0KIAogCQlweG1pdGJ1Zi0+ZmxhZ3MgPSBYTUlUX1ZPX1FVRVVFOwpAQCAtMTY4LDcgKzE2NSw3IEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKLQlweG1pdHByaXYtPnB4bWl0X2V4dGJ1ZiA9ICh1OCAqKU5fQllURV9BTElHTUVOVCgoc2l6ZV90KShweG1pdHByaXYtPnBhbGxvY2F0ZWRfeG1pdF9leHRidWYpLCA0KTsKKwlweG1pdHByaXYtPnB4bWl0X2V4dGJ1ZiA9IFBUUl9BTElHTihweG1pdHByaXYtPnBhbGxvY2F0ZWRfeG1pdF9leHRidWYsIDQpOwogCiAJcHhtaXRidWYgPSAoc3RydWN0IHhtaXRfYnVmICopcHhtaXRwcml2LT5weG1pdF9leHRidWY7CiAKQEAgLTE5OSw4ICsxOTYsNiBAQAogCiAJcHhtaXRwcml2LT50eGlycF9jbnQgPSAxOwogCi0Jc2VtYV9pbml0KCYocHhtaXRwcml2LT50eF9yZXRldnQpLCAwKTsKLQogCS8qIHBlciBBQyBwZW5kaW5nIGlycCAqLwogCXB4bWl0cHJpdi0+YmVxX2NudCA9IDA7CiAJcHhtaXRwcml2LT5ia3FfY250ID0gMDsKQEAgLTI1Miw5ICsyNDcsOCBAQAogCQlweG1pdGJ1ZisrOwogCX0KIAotCWlmIChweG1pdHByaXYtPnBhbGxvY2F0ZWRfeG1pdF9leHRidWYpIHsKKwlpZiAocHhtaXRwcml2LT5wYWxsb2NhdGVkX3htaXRfZXh0YnVmKQogCQl2ZnJlZShweG1pdHByaXYtPnBhbGxvY2F0ZWRfeG1pdF9leHRidWYpOwotCX0KIAogCXJ0d19mcmVlX2h3eG1pdHMocGFkYXB0ZXIpOwogCkBAIC00MDgsNyArNDAyLDcgQEAKIAkJX3J0d19wa3RmaWxlX3JlYWQocHBrdGZpbGUsICh1OCAqKSZpcF9oZHIsIHNpemVvZihpcF9oZHIpKTsKIC8qIAkJdXNlcl9wcmlvID0gKG50b2hzKGlwX2hkci50b3MpID4+IDUpICYgMHgzOyAqLwogCQl1c2VyX3ByaW8gPSBpcF9oZHIudG9zID4+IDU7Ci0JfSBlbHNlIGlmIChwYXR0cmliLT5ldGhlcl90eXBlID09IDB4ODg4ZSkgeworCX0gZWxzZSBpZiAocGF0dHJpYi0+ZXRoZXJfdHlwZSA9PSBFVEhfUF9QQUUpIHsKIAkJLyogICJXaGVuIHByaW9yaXR5IHByb2Nlc3Npbmcgb2YgZGF0YSBmcmFtZXMgaXMgc3VwcG9ydGVkLCAqLwogCQkvKiAgYSBTVEEncyBTTUUgc2hvdWxkIHNlbmQgRUFQT0wtS2V5IGZyYW1lcyBhdCB0aGUgaGlnaGVzdCBwcmlvcml0eS4iICovCiAJCXVzZXJfcHJpbyA9IDc7CkBAIC00NTcsMTQgKzQ1MSwxNCBAQAogCiAJcGF0dHJpYi0+cGt0bGVuID0gcGt0ZmlsZS5wa3RfbGVuOwogCi0JaWYgKEVUSF9QX0lQID09IHBhdHRyaWItPmV0aGVyX3R5cGUpIHsKKwlpZiAocGF0dHJpYi0+ZXRoZXJfdHlwZSA9PSBFVEhfUF9JUCkgewogCQkvKiAgVGhlIGZvbGxvd2luZyBpcyBmb3IgREhDUCBhbmQgQVJQIHBhY2tldCwgd2UgdXNlIGNjazFNIHRvIHR4IHRoZXNlIHBhY2tldHMgYW5kIGxldCBMUFMgYXdha2Ugc29tZSB0aW1lICovCiAJCS8qICB0byBwcmV2ZW50IERIQ1AgcHJvdG9jb2wgZmFpbCAqLwogCQl1OCB0bXBbMjRdOwogCQlfcnR3X3BrdGZpbGVfcmVhZCgmcGt0ZmlsZSwgJnRtcFswXSwgMjQpOwogCQlwYXR0cmliLT5kaGNwX3BrdCA9IDA7CiAJCWlmIChwa3RmaWxlLnBrdF9sZW4gPiAyODIpIHsvKiBNSU5JTVVNX0RIQ1BfUEFDS0VUX1NJWkUpIHsgKi8KLQkJCWlmIChFVEhfUF9JUCA9PSBwYXR0cmliLT5ldGhlcl90eXBlKSB7LyogIElQIGhlYWRlciAqLworCQkJaWYgKHBhdHRyaWItPmV0aGVyX3R5cGUgPT0gRVRIX1BfSVApIHsvKiAgSVAgaGVhZGVyICovCiAJCQkJaWYgKCgodG1wWzIxXSA9PSA2OCkgJiYgKHRtcFsyM10gPT0gNjcpKSB8fAogCQkJCSAgICAoKHRtcFsyMV0gPT0gNjcpICYmICh0bXBbMjNdID09IDY4KSkpIHsKIAkJCQkJLyogIDY4IDogVURQIEJPT1RQIGNsaWVudCAqLwpAQCAtNDc1LDE1ICs0NjksMTUgQEAKIAkJCQl9CiAJCQl9CiAJCX0KLQl9IGVsc2UgaWYgKDB4ODg4ZSA9PSBwYXR0cmliLT5ldGhlcl90eXBlKSB7CisJfSBlbHNlIGlmIChwYXR0cmliLT5ldGhlcl90eXBlID09IEVUSF9QX1BBRSkgewogCQlEQkdfODhFX0xFVkVMKF9kcnZfaW5mb18sICJzZW5kIGVhcG9sIHBhY2tldFxuIik7CiAJfQogCi0JaWYgKChwYXR0cmliLT5ldGhlcl90eXBlID09IDB4ODg4ZSkgfHwgKHBhdHRyaWItPmRoY3BfcGt0ID09IDEpKQorCWlmICgocGF0dHJpYi0+ZXRoZXJfdHlwZSA9PSBFVEhfUF9QQUUpIHx8IChwYXR0cmliLT5kaGNwX3BrdCA9PSAxKSkKIAkJcnR3X3NldF9zY2FuX2RlbnkocGFkYXB0ZXIsIDMwMDApOwogCiAJLyogIElmIEVBUE9MICwgQVJQICwgT1IgREhDUCBwYWNrZXQsIGRyaXZlciBtdXN0IGJlIGluIGFjdGl2ZSBtb2RlLiAqLwotCWlmICgocGF0dHJpYi0+ZXRoZXJfdHlwZSA9PSAweDA4MDYpIHx8IChwYXR0cmliLT5ldGhlcl90eXBlID09IDB4ODg4ZSkgfHwgKHBhdHRyaWItPmRoY3BfcGt0ID09IDEpKQorCWlmICgocGF0dHJpYi0+ZXRoZXJfdHlwZSA9PSBFVEhfUF9BUlApIHx8IChwYXR0cmliLT5ldGhlcl90eXBlID09IEVUSF9QX1BBRSkgfHwgKHBhdHRyaWItPmRoY3BfcGt0ID09IDEpKQogCQlydHdfbHBzX2N0cmxfd2tfY21kKHBhZGFwdGVyLCBMUFNfQ1RSTF9TUEVDSUFMX1BBQ0tFVCwgMSk7CiAKIAlibWNhc3QgPSBJU19NQ0FTVChwYXR0cmliLT5yYSk7CkBAIC01MTUsOCArNTA5LDYgQEAKIAl9CiAKIAlwYXR0cmliLT5hY2tfcG9saWN5ID0gMDsKLQkvKiAgZ2V0IGV0aGVyX2hkcl9sZW4gKi8KLQlwYXR0cmliLT5wa3RfaGRybGVuID0gRVRIX0hMRU47LyogcGF0dHJpYi0+ZXRoZXJfdHlwZSA9PSAweDgxMDApID8gKDE0ICsgNCk6IDE0OyB2bGFuIHRhZyAqLwogCiAJcGF0dHJpYi0+aGRybGVuID0gV0xBTl9IRFJfQTNfTEVOOwogCXBhdHRyaWItPnN1YnR5cGUgPSBXSUZJX0RBVEFfVFlQRTsKQEAgLTUzOSw4ICs1MzEsOCBAQAogCiAJCXBhdHRyaWItPmVuY3J5cHQgPSAwOwogCi0JCWlmICgocGF0dHJpYi0+ZXRoZXJfdHlwZSAhPSAweDg4OGUpICYmICFjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9NUF9TVEFURSkpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sICgiXG5wc3RhLT5pZWVlODAyMXhfYmxvY2tlZCA9PSB0cnVlLCAgcGF0dHJpYi0+ZXRoZXJfdHlwZSglLjR4KSAhPSAweDg4OGVcbiIsIHBhdHRyaWItPmV0aGVyX3R5cGUpKTsKKwkJaWYgKChwYXR0cmliLT5ldGhlcl90eXBlICE9IEVUSF9QX1BBRSkgJiYgIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX01QX1NUQVRFKSkgeworCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywgKCJcbnBzdGEtPmllZWU4MDIxeF9ibG9ja2VkID09IHRydWUsICBwYXR0cmliLT5ldGhlcl90eXBlKCUuNHgpICE9IEVUSF9QX1BBRVxuIiwgcGF0dHJpYi0+ZXRoZXJfdHlwZSkpOwogCQkJcmVzID0gX0ZBSUw7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KQEAgLTc2OSwxMyArNzYxLDEzIEBACiB7CiAJdTE2ICpxYzsKIAotCXN0cnVjdCBydHdfaWVlZTgwMjExX2hkciAqcHdsYW5oZHIgPSAoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyICopaGRyOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKWhkcjsKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCXN0cnVjdCBxb3NfcHJpdiAqcHFvc3ByaXYgPSAmcG1sbWVwcml2LT5xb3Nwcml2OwogCXU4IHFvc19vcHRpb24gPSBmYWxzZTsKIAogCWludCByZXMgPSBfU1VDQ0VTUzsKLQlfX2xlMTYgKmZjdHJsID0gJnB3bGFuaGRyLT5mcmFtZV9jdGw7CisJX19sZTE2ICpmY3RybCA9ICZwd2xhbmhkci0+ZnJhbWVfY29udHJvbDsKIAogCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKIApAQCAtNzg1LDExICs3NzcsMTAgQEAKIAlpZiAocGF0dHJpYi0+cHN0YSkgewogCQlwc3RhID0gcGF0dHJpYi0+cHN0YTsKIAl9IGVsc2UgewotCQlpZiAoYm1jc3QpIHsKKwkJaWYgKGJtY3N0KQogCQkJcHN0YSA9IHJ0d19nZXRfYmNtY19zdGFpbmZvKHBhZGFwdGVyKTsKLQkJfSBlbHNlIHsKKwkJZWxzZQogCQkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbygmcGFkYXB0ZXItPnN0YXByaXYsIHBhdHRyaWItPnJhKTsKLQkJfQogCX0KIAogCW1lbXNldChoZHIsIDAsIFdMQU5IRFJfT0ZGU0VUKTsKQEAgLTk5OSw3ICs5OTAsNyBAQAogCX0KIAogCV9ydHdfb3Blbl9wa3RmaWxlKHBrdCwgJnBrdGZpbGUpOwotCV9ydHdfcGt0ZmlsZV9yZWFkKCZwa3RmaWxlLCBOVUxMLCBwYXR0cmliLT5wa3RfaGRybGVuKTsKKwlfcnR3X3BrdGZpbGVfcmVhZCgmcGt0ZmlsZSwgTlVMTCwgRVRIX0hMRU4pOwogCiAJZnJnX2lueCA9IDA7CiAJZnJnX2xlbiA9IHB4bWl0cHJpdi0+ZnJhZ19sZW4gLSA0Oy8qIDIzNDYtNCA9IDIzNDIgKi8KQEAgLTEwNTQsOSArMTA0NSw4IEBACiAJCQltcGR1X2xlbiAtPSBsbGNfc3o7CiAJCX0KIAotCQlpZiAoKHBhdHRyaWItPmljdl9sZW4gPiAwKSAmJiAocGF0dHJpYi0+YnN3ZW5jKSkgeworCQlpZiAoKHBhdHRyaWItPmljdl9sZW4gPiAwKSAmJiAocGF0dHJpYi0+YnN3ZW5jKSkKIAkJCW1wZHVfbGVuIC09IHBhdHRyaWItPmljdl9sZW47Ci0JCX0KIAogCQlpZiAoYm1jc3QpIHsKIAkJCS8qICBkb24ndCBkbyBmcmFnbWVudCB0byBicm9hZGNhdC9tdWx0aWNhc3QgcGFja2V0cyAqLwpAQCAtMTU2MCwxMSArMTU1MCwxMCBAQAogCWludCByZXMgPSBfU1VDQ0VTUzsKIAogCi0JaWYgKHBhdHRyaWItPnBzdGEpIHsKKwlpZiAocGF0dHJpYi0+cHN0YSkKIAkJcHN0YSA9IHBhdHRyaWItPnBzdGE7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8ocHN0YXByaXYsIHBhdHRyaWItPnJhKTsKLQl9CiAKIAlpZiAocHN0YSA9PSBOVUxMKSB7CiAJCXJlcyA9IF9GQUlMOwpAQCAtMTY1OCwxNiArMTY0Nyw2IEBACiAJcmV0dXJuIGFkZHI7CiB9CiAKLXN0YXRpYyB2b2lkIGRvX3F1ZXVlX3NlbGVjdChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliKQotewotCXU4IHFzZWw7Ci0KLQlxc2VsID0gcGF0dHJpYi0+cHJpb3JpdHk7Ci0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sICgiIyMjIGRvX3F1ZXVlX3NlbGVjdCBwcmlvcml0eT0lZCAsIHFzZWwgPSAlZFxuIiwgcGF0dHJpYi0+cHJpb3JpdHksIHFzZWwpKTsKLQotCXBhdHRyaWItPnFzZWwgPSBxc2VsOwotfQotCiAvKgogICogVGhlIG1haW4gdHJhbnNtaXQodHgpIGVudHJ5CiAgKgpAQCAtMTcwMCw3ICsxNjc5LDcgQEAKIAogCXJ0d19sZWRfY29udHJvbChwYWRhcHRlciwgTEVEX0NUTF9UWCk7CiAKLQlkb19xdWV1ZV9zZWxlY3QocGFkYXB0ZXIsICZweG1pdGZyYW1lLT5hdHRyaWIpOworCXB4bWl0ZnJhbWUtPmF0dHJpYi5xc2VsID0gcHhtaXRmcmFtZS0+YXR0cmliLnByaW9yaXR5OwogCiAjaWZkZWYgQ09ORklHXzg4RVVfQVBfTU9ERQogCXNwaW5fbG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL2JiX2NmZy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvYmJfY2ZnLmMKaW5kZXggY2NlMWVhMi4uMTM0ZmE2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvYmJfY2ZnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvYmJfY2ZnLmMKQEAgLTQ5OCw3ICs0OTgsNyBAQAogc3RhdGljIHZvaWQgc3RvcmVfcHdyaW5kZXhfb2Zmc2V0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAogCQkJCSAgdTMyIHJlZ2FkZHIsIHUzMiBiaXRtYXNrLCB1MzIgZGF0YSkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0ZXIpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBhZGFwdGVyLT5IYWxEYXRhOwogCXUzMiAqIGNvbnN0IHBvd2VyX2xldmVsX29mZnNldCA9CiAJCWhhbF9kYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtoYWxfZGF0YS0+cHdyR3JvdXBDbnRdOwogCkBAIC01MTgsOCArNTE4LDcgQEAKIAkJcG93ZXJfbGV2ZWxfb2Zmc2V0WzRdID0gZGF0YTsKIAlpZiAocmVnYWRkciA9PSByVHhBR0NfQV9NY3MxNV9NY3MxMikgewogCQlwb3dlcl9sZXZlbF9vZmZzZXRbNV0gPSBkYXRhOwotCQlpZiAoaGFsX2RhdGEtPnJmX3R5cGUgPT0gUkZfMVQxUikKLQkJCWhhbF9kYXRhLT5wd3JHcm91cENudCsrOworCQloYWxfZGF0YS0+cHdyR3JvdXBDbnQrKzsKIAl9CiAJaWYgKHJlZ2FkZHIgPT0gclR4QUdDX0JfUmF0ZTE4XzA2KQogCQlwb3dlcl9sZXZlbF9vZmZzZXRbOF0gPSBkYXRhOwpAQCAtNTM3LDggKzUzNiw2IEBACiAJCXBvd2VyX2xldmVsX29mZnNldFsxMl0gPSBkYXRhOwogCWlmIChyZWdhZGRyID09IHJUeEFHQ19CX01jczE1X01jczEyKSB7CiAJCXBvd2VyX2xldmVsX29mZnNldFsxM10gPSBkYXRhOwotCQlpZiAoaGFsX2RhdGEtPnJmX3R5cGUgIT0gUkZfMVQxUikKLQkJCWhhbF9kYXRhLT5wd3JHcm91cENudCsrOwogCX0KIH0KIApAQCAtNTg4LDExICs1ODUsMTAgQEAKIAogc3RhdGljIHZvaWQgcnRsODhlX3BoeV9pbml0X2JiX3JmX3JlZ2lzdGVyX2RlZmluaXRpb24oc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCQkqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHRlcik7CiAJc3RydWN0IGJiX3JlZ19kZWYgICAgICAgICAgICAgICAqcmVnWzRdOwogCi0JcmVnW1JGX1BBVEhfQV0gPSAmaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdOwotCXJlZ1tSRl9QQVRIX0JdID0gJmhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXTsKKwlyZWdbUkZfUEFUSF9BXSA9ICZhZGFwdGVyLT5IYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9BXTsKKwlyZWdbUkZfUEFUSF9CXSA9ICZhZGFwdGVyLT5IYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXTsKIAogCXJlZ1tSRl9QQVRIX0FdLT5yZmludGZzID0gckZQR0EwX1hBQl9SRkludGVyZmFjZVNXOwogCXJlZ1tSRl9QQVRIX0JdLT5yZmludGZzID0gckZQR0EwX1hBQl9SRkludGVyZmFjZVNXOwpAQCAtNjUyLDEzICs2NDgsMTIgQEAKIHN0YXRpYyBib29sIGNvbmZpZ19wYXJhZmlsZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCiB7CiAJc3RydWN0IGVlcHJvbV9wcml2ICplZXByb20gPSBHRVRfRUVQUk9NX0VGVVNFX1BSSVYoYWRhcHQpOwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwogCiAJc2V0X2Jhc2ViYW5kX3BoeV9jb25maWcoYWRhcHQpOwogCiAJLyogSWYgRUVQUk9NIG9yIEVGVVNFIGF1dG9sb2FkIE9LLCBXZSBtdXN0IGNvbmZpZyBieSBQSFlfUkVHX1BHLnR4dCAqLwogCWlmICghZWVwcm9tLT5iYXV0b2xvYWRfZmFpbF9mbGFnKSB7Ci0JCWhhbF9kYXRhLT5wd3JHcm91cENudCA9IDA7CisJCWFkYXB0LT5IYWxEYXRhLT5wd3JHcm91cENudCA9IDA7CiAJCWNvbmZpZ19iYl93aXRoX3BnaGVhZGVyKGFkYXB0KTsKIAl9CiAJc2V0X2Jhc2ViYW5kX2FnY19jb25maWcoYWRhcHQpOwpAQCAtNjY4LDcgKzY2Myw2IEBACiBib29sIHJ0bDg4ZXVfcGh5X2JiX2NvbmZpZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCiB7CiAJaW50IHJ0c3RhdHVzID0gdHJ1ZTsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKIAl1MzIgcmVndmFsOwogCXU4IGNyeXN0YWxfY2FwOwogCkBAIC02ODgsNyArNjgyLDcgQEAKIAlydHN0YXR1cyA9IGNvbmZpZ19wYXJhZmlsZShhZGFwdCk7CiAKIAkvKiAgd3JpdGUgMHgyNFsxNjoxMV0gPSAweDI0WzIyOjE3XSA9IGNyeXN0YWxfY2FwICovCi0JY3J5c3RhbF9jYXAgPSBoYWxfZGF0YS0+Q3J5c3RhbENhcCAmIDB4M0Y7CisJY3J5c3RhbF9jYXAgPSBhZGFwdC0+SGFsRGF0YS0+Q3J5c3RhbENhcCAmIDB4M0Y7CiAJcGh5X3NldF9iYl9yZWcoYWRhcHQsIFJFR19BRkVfWFRBTF9DVFJMLCAweDdmZjgwMCwKIAkJICAgICAgIChjcnlzdGFsX2NhcCB8IChjcnlzdGFsX2NhcCA8PCA2KSkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9oYWxfaW50Zi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvaGFsX2ludGYuYwppbmRleCAwODVmMGZiLi5hMTFjN2I0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9oYWxfaW50Zi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL2hhbF9pbnRmLmMKQEAgLTE3LDYyICsxNyw2IEBACiAjaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgogI2luY2x1ZGUgPGRydl90eXBlcy5oPgogI2luY2x1ZGUgPGhhbF9pbnRmLmg+Ci0jaW5jbHVkZSA8dXNiX2hhbC5oPgotCi12b2lkIHJ0d19oYWxfY2hpcF9jb25maWd1cmUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQotewotCWlmIChhZGFwdC0+SGFsRnVuYy5pbnRmX2NoaXBfY29uZmlndXJlKQotCQlhZGFwdC0+SGFsRnVuYy5pbnRmX2NoaXBfY29uZmlndXJlKGFkYXB0KTsKLX0KLQotdm9pZCBydHdfaGFsX3JlYWRfY2hpcF9pbmZvKHN0cnVjdCBhZGFwdGVyICphZGFwdCkKLXsKLQlpZiAoYWRhcHQtPkhhbEZ1bmMucmVhZF9hZGFwdGVyX2luZm8pCi0JCWFkYXB0LT5IYWxGdW5jLnJlYWRfYWRhcHRlcl9pbmZvKGFkYXB0KTsKLX0KLQotdm9pZCBydHdfaGFsX3JlYWRfY2hpcF92ZXJzaW9uKHN0cnVjdCBhZGFwdGVyICphZGFwdCkKLXsKLQlpZiAoYWRhcHQtPkhhbEZ1bmMucmVhZF9jaGlwX3ZlcnNpb24pCi0JCWFkYXB0LT5IYWxGdW5jLnJlYWRfY2hpcF92ZXJzaW9uKGFkYXB0KTsKLX0KLQotdm9pZCBydHdfaGFsX2RlZl92YWx1ZV9pbml0KHN0cnVjdCBhZGFwdGVyICphZGFwdCkKLXsKLQlpZiAoYWRhcHQtPkhhbEZ1bmMuaW5pdF9kZWZhdWx0X3ZhbHVlKQotCQlhZGFwdC0+SGFsRnVuYy5pbml0X2RlZmF1bHRfdmFsdWUoYWRhcHQpOwotfQotCi12b2lkIHJ0d19oYWxfZnJlZV9kYXRhKHN0cnVjdCBhZGFwdGVyICphZGFwdCkKLXsKLQlpZiAoYWRhcHQtPkhhbEZ1bmMuZnJlZV9oYWxfZGF0YSkKLQkJYWRhcHQtPkhhbEZ1bmMuZnJlZV9oYWxfZGF0YShhZGFwdCk7Ci19Ci0KLXZvaWQgcnR3X2hhbF9kbV9pbml0KHN0cnVjdCBhZGFwdGVyICphZGFwdCkKLXsKLQlpZiAoYWRhcHQtPkhhbEZ1bmMuZG1faW5pdCkKLQkJYWRhcHQtPkhhbEZ1bmMuZG1faW5pdChhZGFwdCk7Ci19Ci0KLXZvaWQgcnR3X2hhbF9zd19sZWRfaW5pdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCi17Ci0JaWYgKGFkYXB0LT5IYWxGdW5jLkluaXRTd0xlZHMpCi0JCWFkYXB0LT5IYWxGdW5jLkluaXRTd0xlZHMoYWRhcHQpOwotfQotCi12b2lkIHJ0d19oYWxfc3dfbGVkX2RlaW5pdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCi17Ci0JaWYgKGFkYXB0LT5IYWxGdW5jLkRlSW5pdFN3TGVkcykKLQkJYWRhcHQtPkhhbEZ1bmMuRGVJbml0U3dMZWRzKGFkYXB0KTsKLX0KLQotdTMyIHJ0d19oYWxfcG93ZXJfb24oc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQotewotCWlmIChhZGFwdC0+SGFsRnVuYy5oYWxfcG93ZXJfb24pCi0JCXJldHVybiBhZGFwdC0+SGFsRnVuYy5oYWxfcG93ZXJfb24oYWRhcHQpOwotCXJldHVybiBfRkFJTDsKLX0KIAogdWludAkgcnR3X2hhbF9pbml0KHN0cnVjdCBhZGFwdGVyICphZGFwdCkKIHsKQEAgLTgwLDE1ICsyNCwxMyBAQAogCiAJYWRhcHQtPmh3X2luaXRfY29tcGxldGVkID0gZmFsc2U7CiAKLQlzdGF0dXMgPSBhZGFwdC0+SGFsRnVuYy5oYWxfaW5pdChhZGFwdCk7CisJc3RhdHVzID0gcnRsODE4OGV1X2hhbF9pbml0KGFkYXB0KTsKIAogCWlmIChzdGF0dXMgPT0gX1NVQ0NFU1MpIHsKIAkJYWRhcHQtPmh3X2luaXRfY29tcGxldGVkID0gdHJ1ZTsKIAogCQlpZiAoYWRhcHQtPnJlZ2lzdHJ5cHJpdi5ub3RjaF9maWx0ZXIgPT0gMSkKIAkJCXJ0d19oYWxfbm90Y2hfZmlsdGVyKGFkYXB0LCAxKTsKLQotCQlydHdfaGFsX3Jlc2V0X3NlY3VyaXR5X2VuZ2luZShhZGFwdCk7CiAJfSBlbHNlIHsKIAkJYWRhcHQtPmh3X2luaXRfY29tcGxldGVkID0gZmFsc2U7CiAJCURCR184OEUoInJ0d19oYWxfaW5pdDogaGFsX19pbml0IGZhaWxcbiIpOwpAQCAtMTA0LDcgKzQ2LDcgQEAKIHsKIAl1aW50CXN0YXR1cyA9IF9TVUNDRVNTOwogCi0Jc3RhdHVzID0gYWRhcHQtPkhhbEZ1bmMuaGFsX2RlaW5pdChhZGFwdCk7CisJc3RhdHVzID0gcnRsODE4OGV1X2hhbF9kZWluaXQoYWRhcHQpOwogCiAJaWYgKHN0YXR1cyA9PSBfU1VDQ0VTUykKIAkJYWRhcHQtPmh3X2luaXRfY29tcGxldGVkID0gZmFsc2U7CkBAIC0xMTQsOTIgKzU2LDYgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi12b2lkIHJ0d19oYWxfc2V0X2h3cmVnKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTggdmFyaWFibGUsIHU4ICp2YWwpCi17Ci0JaWYgKGFkYXB0LT5IYWxGdW5jLlNldEh3UmVnSGFuZGxlcikKLQkJYWRhcHQtPkhhbEZ1bmMuU2V0SHdSZWdIYW5kbGVyKGFkYXB0LCB2YXJpYWJsZSwgdmFsKTsKLX0KLQotdm9pZCBydHdfaGFsX2dldF9od3JlZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHU4IHZhcmlhYmxlLCB1OCAqdmFsKQotewotCWlmIChhZGFwdC0+SGFsRnVuYy5HZXRId1JlZ0hhbmRsZXIpCi0JCWFkYXB0LT5IYWxGdW5jLkdldEh3UmVnSGFuZGxlcihhZGFwdCwgdmFyaWFibGUsIHZhbCk7Ci19Ci0KLXU4IHJ0d19oYWxfZ2V0X2RlZl92YXIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LAotCQkgICAgICAgZW51bSBoYWxfZGVmX3ZhcmlhYmxlIHZhciwgdm9pZCAqdmFsKQotewotCWlmIChhZGFwdC0+SGFsRnVuYy5HZXRIYWxEZWZWYXJIYW5kbGVyKQotCQlyZXR1cm4gYWRhcHQtPkhhbEZ1bmMuR2V0SGFsRGVmVmFySGFuZGxlcihhZGFwdCwgdmFyLCB2YWwpOwotCXJldHVybiBfRkFJTDsKLX0KLQotdm9pZCBydHdfaGFsX3NldF9vZG1fdmFyKHN0cnVjdCBhZGFwdGVyICphZGFwdCwKLQkJCSBlbnVtIGhhbF9vZG1fdmFyaWFibGUgdmFyLCB2b2lkICp2YWwxLAotCQkJIGJvb2wgc2V0KQotewotCWlmIChhZGFwdC0+SGFsRnVuYy5TZXRIYWxPRE1WYXJIYW5kbGVyKQotCQlhZGFwdC0+SGFsRnVuYy5TZXRIYWxPRE1WYXJIYW5kbGVyKGFkYXB0LCB2YXIsCi0JCQkJCQkgICAgICB2YWwxLCBzZXQpOwotfQotCi11MzIgcnR3X2hhbF9pbmlycF9pbml0KHN0cnVjdCBhZGFwdGVyICphZGFwdCkKLXsKLQl1MzIgcnN0ID0gX0ZBSUw7Ci0KLQlpZiAoYWRhcHQtPkhhbEZ1bmMuaW5pcnBfaW5pdCkKLQkJcnN0ID0gYWRhcHQtPkhhbEZ1bmMuaW5pcnBfaW5pdChhZGFwdCk7Ci0JZWxzZQotCQlEQkdfODhFKCIgJXMgSGFsRnVuYy5pbmlycF9pbml0IGlzIE5VTEwhISFcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gcnN0OwotfQotCi11MzIgcnR3X2hhbF9pbmlycF9kZWluaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQotewotCWlmIChhZGFwdC0+SGFsRnVuYy5pbmlycF9kZWluaXQpCi0JCXJldHVybiBhZGFwdC0+SGFsRnVuYy5pbmlycF9kZWluaXQoYWRhcHQpOwotCi0JcmV0dXJuIF9GQUlMOwotfQotCi1zMzIgcnR3X2hhbF94bWl0KHN0cnVjdCBhZGFwdGVyICphZGFwdCwgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCi17Ci0JaWYgKGFkYXB0LT5IYWxGdW5jLmhhbF94bWl0KQotCQlyZXR1cm4gYWRhcHQtPkhhbEZ1bmMuaGFsX3htaXQoYWRhcHQsIHB4bWl0ZnJhbWUpOwotCi0JcmV0dXJuIGZhbHNlOwotfQotCi1zMzIgcnR3X2hhbF9tZ250X3htaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBzdHJ1Y3QgeG1pdF9mcmFtZSAqcG1nbnRmcmFtZSkKLXsKLQlzMzIgcmV0ID0gX0ZBSUw7Ci0KLQlpZiAoYWRhcHQtPkhhbEZ1bmMubWdudF94bWl0KQotCQlyZXQgPSBhZGFwdC0+SGFsRnVuYy5tZ250X3htaXQoYWRhcHQsIHBtZ250ZnJhbWUpOwotCXJldHVybiByZXQ7Ci19Ci0KLXMzMiBydHdfaGFsX2luaXRfeG1pdF9wcml2KHN0cnVjdCBhZGFwdGVyICphZGFwdCkKLXsKLQlpZiAoYWRhcHQtPkhhbEZ1bmMuaW5pdF94bWl0X3ByaXYpCi0JCXJldHVybiBhZGFwdC0+SGFsRnVuYy5pbml0X3htaXRfcHJpdihhZGFwdCk7Ci0JcmV0dXJuIF9GQUlMOwotfQotCi1zMzIgcnR3X2hhbF9pbml0X3JlY3ZfcHJpdihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCi17Ci0JaWYgKGFkYXB0LT5IYWxGdW5jLmluaXRfcmVjdl9wcml2KQotCQlyZXR1cm4gYWRhcHQtPkhhbEZ1bmMuaW5pdF9yZWN2X3ByaXYoYWRhcHQpOwotCi0JcmV0dXJuIF9GQUlMOwotfQotCi12b2lkIHJ0d19oYWxfZnJlZV9yZWN2X3ByaXYoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQotewotCWlmIChhZGFwdC0+SGFsRnVuYy5mcmVlX3JlY3ZfcHJpdikKLQkJYWRhcHQtPkhhbEZ1bmMuZnJlZV9yZWN2X3ByaXYoYWRhcHQpOwotfQotCiB2b2lkIHJ0d19oYWxfdXBkYXRlX3JhX21hc2soc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1MzIgbWFjX2lkLCB1OCByc3NpX2xldmVsKQogewogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICYoYWRhcHQtPm1sbWVwcml2KTsKQEAgLTIxNSw4NiArNzEsNiBAQAogCQkJYWRkX1JBVGlkKGFkYXB0LCBwc3RhLCAwKTsvKiB0b2RvOiBiYXNlZCBvbiByc3NpX2xldmVsKi8KICNlbmRpZgogCX0gZWxzZSB7Ci0JCWlmIChhZGFwdC0+SGFsRnVuYy5VcGRhdGVSQU1hc2tIYW5kbGVyKQotCQkJYWRhcHQtPkhhbEZ1bmMuVXBkYXRlUkFNYXNrSGFuZGxlcihhZGFwdCwgbWFjX2lkLAotCQkJCQkJCSAgICAgIHJzc2lfbGV2ZWwpOworCQlVcGRhdGVIYWxSQU1hc2s4MTg4RVVzYihhZGFwdCwgbWFjX2lkLCByc3NpX2xldmVsKTsKIAl9CiB9Ci0KLXZvaWQgcnR3X2hhbF9hZGRfcmFfdGlkKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTMyIGJpdG1hcCwgdTggYXJnLAotCQkJdTggcnNzaV9sZXZlbCkKLXsKLQlpZiAoYWRhcHQtPkhhbEZ1bmMuQWRkX1JhdGVBVGlkKQotCQlhZGFwdC0+SGFsRnVuYy5BZGRfUmF0ZUFUaWQoYWRhcHQsIGJpdG1hcCwgYXJnLAotCQkJCQkgICAgICAgcnNzaV9sZXZlbCk7Ci19Ci0KLXUzMiBydHdfaGFsX3JlYWRfcmZyZWcoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBlbnVtIHJmX3JhZGlvX3BhdGggcmZwYXRoLAotCQkgICAgICAgdTMyIHJlZ2FkZHIsIHUzMiBiaXRtYXNrKQotewotCXUzMiBkYXRhID0gMDsKLQotCWlmIChhZGFwdC0+SGFsRnVuYy5yZWFkX3JmcmVnKQotCQlkYXRhID0gYWRhcHQtPkhhbEZ1bmMucmVhZF9yZnJlZyhhZGFwdCwgcmZwYXRoLCByZWdhZGRyLAotCQkJCQkJICAgIGJpdG1hc2spOwotCXJldHVybiBkYXRhOwotfQotCi12b2lkIHJ0d19oYWxfc2V0X2J3bW9kZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsCi0JCQllbnVtIGh0X2NoYW5uZWxfd2lkdGggYmFuZHdpZHRoLCB1OCBvZmZzZXQpCi17Ci0JaWYgKGFkYXB0LT5IYWxGdW5jLnNldF9id21vZGVfaGFuZGxlcikKLQkJYWRhcHQtPkhhbEZ1bmMuc2V0X2J3bW9kZV9oYW5kbGVyKGFkYXB0LCBiYW5kd2lkdGgsCi0JCQkJCQkgICAgIG9mZnNldCk7Ci19Ci0KLXZvaWQgcnR3X2hhbF9zZXRfY2hhbihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHU4IGNoYW5uZWwpCi17Ci0JaWYgKGFkYXB0LT5IYWxGdW5jLnNldF9jaGFubmVsX2hhbmRsZXIpCi0JCWFkYXB0LT5IYWxGdW5jLnNldF9jaGFubmVsX2hhbmRsZXIoYWRhcHQsIGNoYW5uZWwpOwotfQotCi12b2lkIHJ0d19oYWxfZG1fd2F0Y2hkb2coc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQotewotCWlmIChhZGFwdC0+SGFsRnVuYy5oYWxfZG1fd2F0Y2hkb2cpCi0JCWFkYXB0LT5IYWxGdW5jLmhhbF9kbV93YXRjaGRvZyhhZGFwdCk7Ci19Ci0KLXZvaWQgcnR3X2hhbF9iY25fcmVsYXRlZF9yZWdfc2V0dGluZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCi17Ci0JaWYgKGFkYXB0LT5IYWxGdW5jLlNldEJlYWNvblJlbGF0ZWRSZWdpc3RlcnNIYW5kbGVyKQotCQlhZGFwdC0+SGFsRnVuYy5TZXRCZWFjb25SZWxhdGVkUmVnaXN0ZXJzSGFuZGxlcihhZGFwdCk7Ci19Ci0KLXU4IHJ0d19oYWxfYW50ZGl2X2JlZm9yZV9saW5rZWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQotewotCWlmIChhZGFwdC0+SGFsRnVuYy5BbnREaXZCZWZvcmVMaW5rSGFuZGxlcikKLQkJcmV0dXJuIGFkYXB0LT5IYWxGdW5jLkFudERpdkJlZm9yZUxpbmtIYW5kbGVyKGFkYXB0KTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgcnR3X2hhbF9hbnRkaXZfcnNzaV9jb21wYXJlZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsCi0JCQkJICBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqZHN0LAotCQkJCSAgc3RydWN0IHdsYW5fYnNzaWRfZXggKnNyYykKLXsKLQlpZiAoYWRhcHQtPkhhbEZ1bmMuQW50RGl2Q29tcGFyZUhhbmRsZXIpCi0JCWFkYXB0LT5IYWxGdW5jLkFudERpdkNvbXBhcmVIYW5kbGVyKGFkYXB0LCBkc3QsIHNyYyk7Ci19Ci0KLXZvaWQgcnR3X2hhbF9zcmVzZXRfaW5pdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCi17Ci0JaWYgKGFkYXB0LT5IYWxGdW5jLnNyZXNldF9pbml0X3ZhbHVlKQotCQlhZGFwdC0+SGFsRnVuYy5zcmVzZXRfaW5pdF92YWx1ZShhZGFwdCk7Ci19Ci0KLXZvaWQgcnR3X2hhbF9ub3RjaF9maWx0ZXIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGJvb2wgZW5hYmxlKQotewotCWlmIChhZGFwdGVyLT5IYWxGdW5jLmhhbF9ub3RjaF9maWx0ZXIpCi0JCWFkYXB0ZXItPkhhbEZ1bmMuaGFsX25vdGNoX2ZpbHRlcihhZGFwdGVyLCBlbmFibGUpOwotfQotCi12b2lkIHJ0d19oYWxfcmVzZXRfc2VjdXJpdHlfZW5naW5lKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQotewotCWlmIChhZGFwdGVyLT5IYWxGdW5jLmhhbF9yZXNldF9zZWN1cml0eV9lbmdpbmUpCi0JCWFkYXB0ZXItPkhhbEZ1bmMuaGFsX3Jlc2V0X3NlY3VyaXR5X2VuZ2luZShhZGFwdGVyKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL29kbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvb2RtLmMKaW5kZXggNTdhMTI3NS4uZDk4M2E4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvb2RtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvb2RtLmMKQEAgLTIyNiwxNTAgKzIyNiw2IEBACiAJb2RtX0VkY2FUdXJib0NoZWNrKHBETV9PZG0pOwogfQogCi0vKiAgSW5pdCAvLi4gRml4ZWQgSFcgdmFsdWUuIE9ubHkgaW5pdCB0aW1lLiAqLwotdm9pZCBPRE1fQ21uSW5mb0luaXQoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIGVudW0gb2RtX2NvbW1vbl9pbmZvX2RlZiBDbW5JbmZvLCB1MzIgVmFsdWUpCi17Ci0JLyogIFRoaXMgc2VjdGlvbiBpcyB1c2VkIGZvciBpbml0IHZhbHVlICovCi0Jc3dpdGNoCShDbW5JbmZvKSB7Ci0JLyogIEZpeGVkIE9ETSB2YWx1ZS4gKi8KLQljYXNlCU9ETV9DTU5JTkZPX0FCSUxJVFk6Ci0JCXBETV9PZG0tPlN1cHBvcnRBYmlsaXR5ID0gKHUzMilWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19QTEFURk9STToKLQkJcERNX09kbS0+U3VwcG9ydFBsYXRmb3JtID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0lOVEVSRkFDRToKLQkJcERNX09kbS0+U3VwcG9ydEludGVyZmFjZSA9ICh1OClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19NUF9URVNUX0NISVA6Ci0JCXBETV9PZG0tPmJJc01QQ2hpcCA9ICh1OClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19JQ19UWVBFOgotCQlwRE1fT2RtLT5TdXBwb3J0SUNUeXBlID0gVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fQ1VUX1ZFUjoKLQkJcERNX09kbS0+Q3V0VmVyc2lvbiA9ICh1OClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19SRl9UWVBFOgotCQlwRE1fT2RtLT5SRlR5cGUgPSAodTgpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UgICAgT0RNX0NNTklORk9fUkZfQU5URU5OQV9UWVBFOgotCQlwRE1fT2RtLT5BbnREaXZUeXBlID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0JPQVJEX1RZUEU6Ci0JCXBETV9PZG0tPkJvYXJkVHlwZSA9ICh1OClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19FWFRfTE5BOgotCQlwRE1fT2RtLT5FeHRMTkEgPSAodTgpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fRVhUX1BBOgotCQlwRE1fT2RtLT5FeHRQQSA9ICh1OClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19FWFRfVFJTVzoKLQkJcERNX09kbS0+RXh0VFJTVyA9ICh1OClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19QQVRDSF9JRDoKLQkJcERNX09kbS0+UGF0Y2hJRCA9ICh1OClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19CSU5IQ1RfVEVTVDoKLQkJcERNX09kbS0+YkluSGN0VGVzdCA9IChib29sKVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0JXSUZJX1RFU1Q6Ci0JCXBETV9PZG0tPmJXSUZJVGVzdCA9IChib29sKVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1NNQVJUX0NPTkNVUlJFTlQ6Ci0JCXBETV9PZG0tPmJEdWFsTWFjU21hcnRDb25jdXJyZW50ID0gKGJvb2wpVmFsdWU7Ci0JCWJyZWFrOwotCS8qIFRvIHJlbW92ZSB0aGUgY29tcGlsZXIgd2FybmluZywgbXVzdCBhZGQgYW4gZW1wdHkgZGVmYXVsdCBzdGF0ZW1lbnQgdG8gaGFuZGxlIHRoZSBvdGhlciB2YWx1ZXMuICovCi0JZGVmYXVsdDoKLQkJLyogZG8gbm90aGluZyAqLwotCQlicmVhazsKLQl9Ci0KLQkvKiAgVHggcG93ZXIgdHJhY2tpbmcgQkIgc3dpbmcgdGFibGUuICovCi0JLyogIFRoZSBiYXNlIGluZGV4ID0gMTIuICsoKDEyLW4pLzIpZEIgMTN+Pz8gPSBkZWNyZWFzZSB0eCBwd3IgYnkgLSgobi0xMikvMilkQiAqLwotCXBETV9PZG0tPkJiU3dpbmdJZHhPZmRtCQkJPSAxMjsgLyogIFNldCBkZWZhbHV0IHZhbHVlIGFzIGluZGV4IDEyLiAqLwotCXBETV9PZG0tPkJiU3dpbmdJZHhPZmRtQ3VycmVudAk9IDEyOwotCXBETV9PZG0tPkJiU3dpbmdGbGFnT2ZkbQkJPSBmYWxzZTsKLX0KLQotdm9pZCBPRE1fQ21uSW5mb0hvb2soc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIGVudW0gb2RtX2NvbW1vbl9pbmZvX2RlZiBDbW5JbmZvLCB2b2lkICpwVmFsdWUpCi17Ci0JLyogICovCi0JLyogIEhvb2sgY2FsbCBieSByZWZlcmVuY2UgcG9pbnRlci4gKi8KLQkvKiAgKi8KLQlzd2l0Y2gJKENtbkluZm8pIHsKLQkvKiAgRHluYW1pYyBjYWxsIGJ5IHJlZmVyZW5jZSBwb2ludGVyLiAqLwotCWNhc2UJT0RNX0NNTklORk9fTUFDX1BIWV9NT0RFOgotCQlwRE1fT2RtLT5wTWFjUGh5TW9kZSA9ICh1OCAqKXBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19UWF9VTkk6Ci0JCXBETV9PZG0tPnBOdW1UeEJ5dGVzVW5pY2FzdCA9ICh1NjQgKilwVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fUlhfVU5JOgotCQlwRE1fT2RtLT5wTnVtUnhCeXRlc1VuaWNhc3QgPSAodTY0ICopcFZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1dNX01PREU6Ci0JCXBETV9PZG0tPnBXaXJlbGVzc01vZGUgPSAodTggKilwVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fQkFORDoKLQkJcERNX09kbS0+cEJhbmRUeXBlID0gKHU4ICopcFZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1NFQ19DSE5MX09GRlNFVDoKLQkJcERNX09kbS0+cFNlY0NoT2Zmc2V0ID0gKHU4ICopcFZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1NFQ19NT0RFOgotCQlwRE1fT2RtLT5wU2VjdXJpdHkgPSAodTggKilwVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fQlc6Ci0JCXBETV9PZG0tPnBCYW5kV2lkdGggPSAodTggKilwVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fQ0hOTDoKLQkJcERNX09kbS0+cENoYW5uZWwgPSAodTggKilwVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fRE1TUF9HRVRfVkFMVUU6Ci0JCXBETV9PZG0tPnBiR2V0VmFsdWVGcm9tT3RoZXJNYWMgPSAoYm9vbCAqKXBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19CVUREWV9BREFQVE9SOgotCQlwRE1fT2RtLT5wQnVkZHlBZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICoqKXBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19ETVNQX0lTX01BU1RFUjoKLQkJcERNX09kbS0+cGJNYXN0ZXJPZkRNU1AgPSAoYm9vbCAqKXBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19TQ0FOOgotCQlwRE1fT2RtLT5wYlNjYW5JblByb2Nlc3MgPSAoYm9vbCAqKXBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19QT1dFUl9TQVZJTkc6Ci0JCXBETV9PZG0tPnBiUG93ZXJTYXZpbmcgPSAoYm9vbCAqKXBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19PTkVfUEFUSF9DQ0E6Ci0JCXBETV9PZG0tPnBPbmVQYXRoQ0NBID0gKHU4ICopcFZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0RSVl9TVE9QOgotCQlwRE1fT2RtLT5wYkRyaXZlclN0b3BwZWQgPSAgKGJvb2wgKilwVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fUE5QX0lOOgotCQlwRE1fT2RtLT5wYkRyaXZlcklzR29pbmdUb1BucFNldFBvd2VyU2xlZXAgPSAgKGJvb2wgKilwVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fSU5JVF9PTjoKLQkJcERNX09kbS0+cGluaXRfYWRwdF9pbl9wcm9ncmVzcyA9ICAoYm9vbCAqKXBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19BTlRfVEVTVDoKLQkJcERNX09kbS0+cEFudGVubmFUZXN0ID0gICh1OCAqKXBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19ORVRfQ0xPU0VEOgotCQlwRE1fT2RtLT5wYk5ldF9jbG9zZWQgPSAoYm9vbCAqKXBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZSAgICBPRE1fQ01OSU5GT19NUF9NT0RFOgotCQlwRE1fT2RtLT5tcF9tb2RlID0gKHU4ICopcFZhbHVlOwotCQlicmVhazsKLQkvKiBUbyByZW1vdmUgdGhlIGNvbXBpbGVyIHdhcm5pbmcsIG11c3QgYWRkIGFuIGVtcHR5IGRlZmF1bHQgc3RhdGVtZW50IHRvIGhhbmRsZSB0aGUgb3RoZXIgdmFsdWVzLiAqLwotCWRlZmF1bHQ6Ci0JCS8qIGRvIG5vdGhpbmcgKi8KLQkJYnJlYWs7Ci0JfQotfQotCiB2b2lkIE9ETV9DbW5JbmZvUHRyQXJyYXlIb29rKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCBlbnVtIG9kbV9jb21tb25faW5mb19kZWYgQ21uSW5mbywgdTE2IEluZGV4LCB2b2lkICpwVmFsdWUpCiB7CiAJLyogIEhvb2sgY2FsbCBieSByZWZlcmVuY2UgcG9pbnRlci4gKi8KQEAgLTM4NSw0NiArMjQxLDYgQEAKIAl9CiB9CiAKLS8qICBVcGRhdGUgQmFuZC9DSGFubmVsLy4uIFRoZSB2YWx1ZXMgYXJlIGR5bmFtaWMgYnV0IG5vbi1wZXItcGFja2V0LiAqLwotdm9pZCBPRE1fQ21uSW5mb1VwZGF0ZShzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgdTMyIENtbkluZm8sIHU2NCBWYWx1ZSkKLXsKLQkvKiAgKi8KLQkvKiAgVGhpcyBpbml0IHZhcmlhYmxlIG1heSBiZSBjaGFuZ2VkIGluIHJ1biB0aW1lLiAqLwotCS8qICAqLwotCXN3aXRjaAkoQ21uSW5mbykgewotCWNhc2UJT0RNX0NNTklORk9fQUJJTElUWToKLQkJcERNX09kbS0+U3VwcG9ydEFiaWxpdHkgPSAodTMyKVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1JGX1RZUEU6Ci0JCXBETV9PZG0tPlJGVHlwZSA9ICh1OClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19XSUZJX0RJUkVDVDoKLQkJcERNX09kbS0+YldJRklfRGlyZWN0ID0gKGJvb2wpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fV0lGSV9ESVNQTEFZOgotCQlwRE1fT2RtLT5iV0lGSV9EaXNwbGF5ID0gKGJvb2wpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fTElOSzoKLQkJcERNX09kbS0+YkxpbmtlZCA9IChib29sKVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1JTU0lfTUlOOgotCQlwRE1fT2RtLT5SU1NJX01pbiA9ICh1OClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19EQkdfQ09NUDoKLQkJcERNX09kbS0+RGVidWdDb21wb25lbnRzID0gVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fREJHX0xFVkVMOgotCQlwRE1fT2RtLT5EZWJ1Z0xldmVsID0gKHUzMilWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19SQV9USFJFU0hPTERfSElHSDoKLQkJcERNX09kbS0+UmF0ZUFkYXB0aXZlLkhpZ2hSU1NJVGhyZXNoID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1JBX1RIUkVTSE9MRF9MT1c6Ci0JCXBETV9PZG0tPlJhdGVBZGFwdGl2ZS5Mb3dSU1NJVGhyZXNoID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQl9Ci19Ci0KIHZvaWQgb2RtX0NvbW1vbkluZm9TZWxmSW5pdChzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSkKIHsKIAlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7CkBAIC00NjksNyArMjg1LDYgQEAKIAlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgiU3VwcG9ydEludGVyZmFjZT0lZFxuIiwgcERNX09kbS0+U3VwcG9ydEludGVyZmFjZSkpOwogCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJTdXBwb3J0SUNUeXBlPTB4JXhcbiIsIHBETV9PZG0tPlN1cHBvcnRJQ1R5cGUpKTsKIAlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgiQ3V0VmVyc2lvbj0lZFxuIiwgcERNX09kbS0+Q3V0VmVyc2lvbikpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJSRlR5cGU9JWRcbiIsIHBETV9PZG0tPlJGVHlwZSkpOwogCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJCb2FyZFR5cGU9JWRcbiIsIHBETV9PZG0tPkJvYXJkVHlwZSkpOwogCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJFeHRMTkE9JWRcbiIsIHBETV9PZG0tPkV4dExOQSkpOwogCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJFeHRQQT0lZFxuIiwgcERNX09kbS0+RXh0UEEpKTsKQEAgLTk0NywzNyArNzYyLDIxIEBACiAJCWJyZWFrOwogCWNhc2UgKE9ETV9XTV9CfE9ETV9XTV9HfE9ETV9XTV9OMjRHKToKIAljYXNlIChPRE1fV01fQXxPRE1fV01fQnxPRE1fV01fR3xPRE1fV01fTjI0Ryk6Ci0JCWlmIChwRE1fT2RtLT5SRlR5cGUgPT0gT0RNXzFUMlIgfHwgcERNX09kbS0+UkZUeXBlID09IE9ETV8xVDFSKSB7Ci0JCQlpZiAocnNzaV9sZXZlbCA9PSBETV9SQVRSX1NUQV9ISUdIKSB7Ci0JCQkJcmF0ZV9iaXRtYXAgPSAweDAwMGYwMDAwOwotCQkJfSBlbHNlIGlmIChyc3NpX2xldmVsID09IERNX1JBVFJfU1RBX01JRERMRSkgewotCQkJCXJhdGVfYml0bWFwID0gMHgwMDBmZjAwMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCoocERNX09kbS0+cEJhbmRXaWR0aCkgPT0gT0RNX0JXNDBNKQotCQkJCQlyYXRlX2JpdG1hcCA9IDB4MDAwZmYwMTU7Ci0JCQkJZWxzZQotCQkJCQlyYXRlX2JpdG1hcCA9IDB4MDAwZmYwMDU7Ci0JCQl9CisJCWlmIChyc3NpX2xldmVsID09IERNX1JBVFJfU1RBX0hJR0gpIHsKKwkJCXJhdGVfYml0bWFwID0gMHgwMDBmMDAwMDsKKwkJfSBlbHNlIGlmIChyc3NpX2xldmVsID09IERNX1JBVFJfU1RBX01JRERMRSkgeworCQkJcmF0ZV9iaXRtYXAgPSAweDAwMGZmMDAwOwogCQl9IGVsc2UgewotCQkJaWYgKHJzc2lfbGV2ZWwgPT0gRE1fUkFUUl9TVEFfSElHSCkgewotCQkJCXJhdGVfYml0bWFwID0gMHgwZjhmMDAwMDsKLQkJCX0gZWxzZSBpZiAocnNzaV9sZXZlbCA9PSBETV9SQVRSX1NUQV9NSURETEUpIHsKLQkJCQlyYXRlX2JpdG1hcCA9IDB4MGY4ZmYwMDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmICgqKHBETV9PZG0tPnBCYW5kV2lkdGgpID09IE9ETV9CVzQwTSkKLQkJCQkJcmF0ZV9iaXRtYXAgPSAweDBmOGZmMDE1OwotCQkJCWVsc2UKLQkJCQkJcmF0ZV9iaXRtYXAgPSAweDBmOGZmMDA1OwotCQkJfQorCQkJaWYgKCoocERNX09kbS0+cEJhbmRXaWR0aCkgPT0gT0RNX0JXNDBNKQorCQkJCXJhdGVfYml0bWFwID0gMHgwMDBmZjAxNTsKKwkJCWVsc2UKKwkJCQlyYXRlX2JpdG1hcCA9IDB4MDAwZmYwMDU7CiAJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJLyogY2FzZSBXSVJFTEVTU18xMV8yNE46ICovCiAJCS8qIGNhc2UgV0lSRUxFU1NfMTFfNU46ICovCi0JCWlmIChwRE1fT2RtLT5SRlR5cGUgPT0gUkZfMVQyUikKLQkJCXJhdGVfYml0bWFwID0gMHgwMDBmZmZmZjsKLQkJZWxzZQotCQkJcmF0ZV9iaXRtYXAgPSAweDBmZmZmZmZmOworCQlyYXRlX2JpdG1hcCA9IDB4MGZmZmZmZmY7CiAJCWJyZWFrOwogCX0KIApAQCAtMTA5Niw4ICs4OTUsNyBAQAogdm9pZCBvZG1fRHluYW1pY1R4UG93ZXJJbml0KHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtKQogewogCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCBkbV9wcml2CSpwZG1wcml2ID0gJnBIYWxEYXRhLT5kbXByaXY7CisJc3RydWN0IGRtX3ByaXYJKnBkbXByaXYgPSAmQWRhcHRlci0+SGFsRGF0YS0+ZG1wcml2OwogCXBkbXByaXYtPmJEeW5hbWljVHhQb3dlckVuYWJsZSA9IGZhbHNlOwogCXBkbXByaXYtPkxhc3REVFBMdmwgPSBUeEhpZ2hQd3JMZXZlbF9Ob3JtYWw7CiAJcGRtcHJpdi0+RHluYW1pY1R4SGlnaFBvd2VyTHZsID0gVHhIaWdoUHdyTGV2ZWxfTm9ybWFsOwpAQCAtMTEyMiw4ICs5MjAsNyBAQAogCiBzdGF0aWMgdm9pZCBGaW5kTWluaW11bVJTU0koc3RydWN0IGFkYXB0ZXIgKnBBZGFwdGVyKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocEFkYXB0ZXIpOwotCXN0cnVjdCBkbV9wcml2CSpwZG1wcml2ID0gJnBIYWxEYXRhLT5kbXByaXY7CisJc3RydWN0IGRtX3ByaXYJKnBkbXByaXYgPSAmcEFkYXB0ZXItPkhhbERhdGEtPmRtcHJpdjsKIAogCS8qIDEgMS5VbmNvbmRpdGlvbmFsbHkgc2V0IFJTU0kgKi8KIAlwZG1wcml2LT5NaW5VbmRlY29yYXRlZFBXREJGb3JETSA9IHBkbXByaXYtPkVudHJ5TWluVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7CkBAIC0xMTMyLDggKzkyOSw3IEBACiB2b2lkIG9kbV9SU1NJTW9uaXRvckNoZWNrQ0Uoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0pCiB7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0Jc3RydWN0IGRtX3ByaXYJKnBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKKwlzdHJ1Y3QgZG1fcHJpdgkqcGRtcHJpdiA9ICZBZGFwdGVyLT5IYWxEYXRhLT5kbXByaXY7CiAJaW50CWk7CiAJaW50CXRtcEVudHJ5TWF4UFdEQiA9IDAsIHRtcEVudHJ5TWluUFdEQiA9IDB4ZmY7CiAJdTgJc3RhX2NudCA9IDA7CkBAIC0xMTYyLDcgKzk1OCw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgc3RhX2NudDsgaSsrKSB7CiAJCWlmIChQV0RCX3Jzc2lbaV0gIT0gMCkgewotCQkJT0RNX1JBX1NldFJTU0lfODE4OEUoJnBIYWxEYXRhLT5vZG1wcml2LAorCQkJT0RNX1JBX1NldFJTU0lfODE4OEUoJkFkYXB0ZXItPkhhbERhdGEtPm9kbXByaXYsCiAJCQkJCSAgICAgUFdEQl9yc3NpW2ldICYgMHhGRiwKIAkJCQkJICAgICAoUFdEQl9yc3NpW2ldID4+IDE2KSAmIDB4RkYpOwogCQl9CkBAIC0xMTc5LDggKzk3NSw3IEBACiAJCXBkbXByaXYtPkVudHJ5TWluVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPSAwOwogCiAJRmluZE1pbmltdW1SU1NJKEFkYXB0ZXIpOwotCU9ETV9DbW5JbmZvVXBkYXRlKCZwSGFsRGF0YS0+b2RtcHJpdiwgT0RNX0NNTklORk9fUlNTSV9NSU4sCi0JCQkgIHBkbXByaXYtPk1pblVuZGVjb3JhdGVkUFdEQkZvckRNKTsKKwlBZGFwdGVyLT5IYWxEYXRhLT5vZG1wcml2LlJTU0lfTWluID0gcGRtcHJpdi0+TWluVW5kZWNvcmF0ZWRQV0RCRm9yRE07CiB9CiAKIC8qIDM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KQEAgLTEyOTAsNyArMTA4NSw2IEBACiAJdTY0CWN1cl90eF9ieXRlcyA9IDA7CiAJdTY0CWN1cl9yeF9ieXRlcyA9IDA7CiAJdTgJYmJ0Y2hhbmdlID0gZmFsc2U7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCQkqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7CiAJc3RydWN0IHhtaXRfcHJpdgkJKnB4bWl0cHJpdiA9ICYoQWRhcHRlci0+eG1pdHByaXYpOwogCXN0cnVjdCByZWN2X3ByaXYJCSpwcmVjdnByaXYgPSAmKEFkYXB0ZXItPnJlY3Zwcml2KTsKIAlzdHJ1Y3QgcmVnaXN0cnlfcHJpdgkqcHJlZ3ByaXYgPSAmQWRhcHRlci0+cmVnaXN0cnlwcml2OwpAQCAtMTM0NCw3ICsxMTM4LDggQEAKIAkJLyogIFR1cm4gT2ZmIEVEQ0EgdHVyYm8gaGVyZS4gKi8KIAkJLyogIFJlc3RvcmUgb3JpZ2luYWwgRURDQSBhY2NvcmRpbmcgdG8gdGhlIGRlY2xhcmF0aW9uIG9mIEFQLiAqLwogCQkgaWYgKHBETV9PZG0tPkRNX0VEQ0FfVGFibGUuYkN1cnJlbnRUdXJib0VEQ0EpIHsKLQkJCXVzYl93cml0ZTMyKEFkYXB0ZXIsIFJFR19FRENBX0JFX1BBUkFNLCBwSGFsRGF0YS0+QWNQYXJhbV9CRSk7CisJCQl1c2Jfd3JpdGUzMihBZGFwdGVyLCBSRUdfRURDQV9CRV9QQVJBTSwKKwkJCQkgICAgQWRhcHRlci0+SGFsRGF0YS0+QWNQYXJhbV9CRSk7CiAJCQlwRE1fT2RtLT5ETV9FRENBX1RhYmxlLmJDdXJyZW50VHVyYm9FRENBID0gZmFsc2U7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9waHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3BoeS5jCmluZGV4IGE4M2JiZWE5Li41MTkyZWY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9waHkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9waHkuYwpAQCAtNjUsOCArNjUsNyBAQAogCQkJZW51bSByZl9yYWRpb19wYXRoIHJmcGF0aCwgdTMyIG9mZnNldCkKIHsKIAl1MzIgcmV0ID0gMDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKLQlzdHJ1Y3QgYmJfcmVnX2RlZiAqcGh5cmVnID0gJmhhbF9kYXRhLT5QSFlSZWdEZWZbcmZwYXRoXTsKKwlzdHJ1Y3QgYmJfcmVnX2RlZiAqcGh5cmVnID0gJmFkYXB0LT5IYWxEYXRhLT5QSFlSZWdEZWZbcmZwYXRoXTsKIAl1MzIgdG1wbG9uZywgdG1wbG9uZzI7CiAJdTggcmZwaV9lbmFibGUgPSAwOwogCkBAIC0xMTAsMTUgKzEwOSwxNCBAQAogCQkJICAgIHUzMiBkYXRhKQogewogCXUzMiBkYXRhX2FuZF9hZGRyID0gMDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKLQlzdHJ1Y3QgYmJfcmVnX2RlZiAqcGh5cmVnID0gJmhhbF9kYXRhLT5QSFlSZWdEZWZbcmZwYXRoXTsKKwlzdHJ1Y3QgYmJfcmVnX2RlZiAqcGh5cmVnID0gJmFkYXB0LT5IYWxEYXRhLT5QSFlSZWdEZWZbcmZwYXRoXTsKIAogCW9mZnNldCAmPSAweGZmOwogCWRhdGFfYW5kX2FkZHIgPSAoKG9mZnNldDw8MjApIHwgKGRhdGEmMHgwMDBmZmZmZikpICYgMHgwZmZmZmZmZjsKIAlwaHlfc2V0X2JiX3JlZyhhZGFwdCwgcGh5cmVnLT5yZjN3aXJlT2Zmc2V0LCBiTWFza0RXb3JkLCBkYXRhX2FuZF9hZGRyKTsKIH0KIAotdTMyIHBoeV9xdWVyeV9yZl9yZWcoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBlbnVtIHJmX3JhZGlvX3BhdGggcmZfcGF0aCwKK3UzMiBydHdfaGFsX3JlYWRfcmZyZWcoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBlbnVtIHJmX3JhZGlvX3BhdGggcmZfcGF0aCwKIAkJICAgICB1MzIgcmVnX2FkZHIsIHUzMiBiaXRfbWFzaykKIHsKIAl1MzIgb3JpZ2luYWxfdmFsdWUsIHJlYWRiYWNrX3ZhbHVlLCBiaXRfc2hpZnQ7CkBAIC0xNDcsMTQgKzE0NSwxMSBAQAogc3RhdGljIHZvaWQgZ2V0X3R4X3Bvd2VyX2luZGV4KHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTggY2hhbm5lbCwgdTggKmNja19wd3IsCiAJCQkgICAgICAgdTggKm9mZG1fcHdyLCB1OCAqYncyMF9wd3IsIHU4ICpidzQwX3B3cikKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gYWRhcHQtPkhhbERhdGE7CiAJdTggaW5kZXggPSAoY2hhbm5lbCAtIDEpOwogCXU4IFR4Q291bnQgPSAwLCBwYXRoX251bXM7CiAKLQlpZiAoKFJGXzFUMlIgPT0gaGFsX2RhdGEtPnJmX3R5cGUpIHx8IChSRl8xVDFSID09IGhhbF9kYXRhLT5yZl90eXBlKSkKLQkJcGF0aF9udW1zID0gMTsKLQllbHNlCi0JCXBhdGhfbnVtcyA9IDI7CisJcGF0aF9udW1zID0gMTsKIAogCWZvciAoVHhDb3VudCA9IDA7IFR4Q291bnQgPCBwYXRoX251bXM7IFR4Q291bnQrKykgewogCQlpZiAoVHhDb3VudCA9PSBSRl9QQVRIX0EpIHsKQEAgLTE4Myw3ICsxNzgsNyBAQAogCQkJCSAgdTggKmNja19wd3IsIHU4ICpvZmRtX3B3ciwgdTggKmJ3MjBfcHdyLAogCQkJCSAgdTggKmJ3NDBfcHdyKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBhZGFwdC0+SGFsRGF0YTsKIAogCWhhbF9kYXRhLT5DdXJyZW50Q2NrVHhQd3JJZHggPSBjY2tfcHdyWzBdOwogCWhhbF9kYXRhLT5DdXJyZW50T2ZkbTI0R1R4UHdySWR4ID0gb2ZkbV9wd3JbMF07CkBAIC0yMTEsNyArMjA2LDcgQEAKIAogc3RhdGljIHZvaWQgcGh5X3NldF9id19tb2RlX2NhbGxiYWNrKHN0cnVjdCBhZGFwdGVyICphZGFwdCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gYWRhcHQtPkhhbERhdGE7CiAJdTggcmVnX2J3X29wbW9kZTsKIAl1OCByZWdfcHJzcl9yc2M7CiAKQEAgLTI3NCwxMCArMjY5LDEwIEBACiAJCXJ0bDg4ZXVfcGh5X3JmNjA1Ml9zZXRfYmFuZHdpZHRoKGFkYXB0LCBoYWxfZGF0YS0+Q3VycmVudENoYW5uZWxCVyk7CiB9CiAKLXZvaWQgcGh5X3NldF9id19tb2RlKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgZW51bSBodF9jaGFubmVsX3dpZHRoIGJhbmR3aWR0aCwKK3ZvaWQgcnR3X2hhbF9zZXRfYndtb2RlKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgZW51bSBodF9jaGFubmVsX3dpZHRoIGJhbmR3aWR0aCwKIAkJICAgICB1bnNpZ25lZCBjaGFyIG9mZnNldCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gYWRhcHQtPkhhbERhdGE7CiAJZW51bSBodF9jaGFubmVsX3dpZHRoIHRtcF9idyA9IGhhbF9kYXRhLT5DdXJyZW50Q2hhbm5lbEJXOwogCiAJaGFsX2RhdGEtPkN1cnJlbnRDaGFubmVsQlcgPSBiYW5kd2lkdGg7CkBAIC0yOTMsMTAgKzI4OCw3IEBACiB7CiAJdTggcmZfcGF0aDsKIAl1MzIgcGFyYW0xLCBwYXJhbTI7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7Ci0KLQlpZiAoYWRhcHQtPmJOb3RpZnlDaGFubmVsQ2hhbmdlKQotCQlEQkdfODhFKCJbJXNdIGNoID0gJWRcbiIsIF9fZnVuY19fLCBjaGFubmVsKTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gYWRhcHQtPkhhbERhdGE7CiAKIAlwaHlfc2V0X3R4X3Bvd2VyX2xldmVsKGFkYXB0LCBjaGFubmVsKTsKIApAQCAtMzEwLDkgKzMwMiw5IEBACiAJfQogfQogCi12b2lkIHBoeV9zd19jaG5sKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTggY2hhbm5lbCkKK3ZvaWQgcnR3X2hhbF9zZXRfY2hhbihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHU4IGNoYW5uZWwpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IGFkYXB0LT5IYWxEYXRhOwogCXU4IHRtcGNoYW5uZWwgPSBoYWxfZGF0YS0+Q3VycmVudENoYW5uZWw7CiAKIAlpZiAoaGFsX2RhdGEtPnJmX2NoaXAgPT0gUkZfUFNFVURPXzExTikKQEAgLTQwNyw3ICszOTksNyBAQAogCiB2b2lkIHJ0bDg4ZXVfZG1fdHhwb3dlcl90cmFja2luZ19jYWxsYmFja190aGVybWFsbWV0ZXIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBhZGFwdC0+SGFsRGF0YTsKIAl1OCB0aGVybWFsX3ZhbCA9IDAsIGRlbHRhLCBkZWx0YV9sY2ssIGRlbHRhX2lxaywgb2Zmc2V0OwogCXU4IHRoZXJtYWxfYXZnX2NvdW50ID0gMDsKIAl1MzIgdGhlcm1hbF9hdmcgPSAwOwpAQCAtNDM5LDcgKzQzMSw3IEBACiAKIAlkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5SZWdBMjQgPSAweDA5MGUxMzE3OwogCi0JdGhlcm1hbF92YWwgPSAodTgpcGh5X3F1ZXJ5X3JmX3JlZyhhZGFwdCwgUkZfUEFUSF9BLAorCXRoZXJtYWxfdmFsID0gKHU4KXJ0d19oYWxfcmVhZF9yZnJlZyhhZGFwdCwgUkZfUEFUSF9BLAogCQkJCQkgICBSRl9UX01FVEVSXzg4RSwgMHhmYzAwKTsKIAogCWlmIChpczJ0KQpAQCAtNjMyLDggKzYyNCw3IEBACiB7CiAJdTMyIHJlZ19lYWMsIHJlZ19lOTQsIHJlZ19lOWMsIHJlZ19lYTQsIHU0dG1wOwogCXU4IHJlc3VsdCA9IDB4MDA7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7Ci0Jc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKmRtX29kbSA9ICZoYWxfZGF0YS0+b2RtcHJpdjsKKwlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtID0gJmFkYXB0LT5IYWxEYXRhLT5vZG1wcml2OwogCiAJLyogMSBHZXQgVFhJTVIgc2V0dGluZyAqLwogCS8qIG1vZGlmeSBSWElRSyBtb2RlIHRhYmxlICovCkBAIC03MzcsOCArNzI4LDcgQEAKIHsKIAl1MzIgcmVnZWFjLCByZWdlYjQsIHJlZ2ViYywgcmVnZWM0LCByZWdlY2M7CiAJdTggcmVzdWx0ID0gMHgwMDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKLQlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtID0gJmhhbF9kYXRhLT5vZG1wcml2OworCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpkbV9vZG0gPSAmYWRhcHQtPkhhbERhdGEtPm9kbXByaXY7CiAKIAkvKiBPbmUgc2hvdCwgcGF0aCBCIExPSyAmIElRSyAqLwogCXBoeV9zZXRfYmJfcmVnKGFkYXB0LCBySVFLX0FHQ19Db250LCBiTWFza0RXb3JkLCAweDAwMDAwMDAyKTsKQEAgLTk1NCwxNyArOTQ0LDExIEBACiAJCQkgICAgICAgdTggYzEsIHU4IGMyKQogewogCXUzMiBpLCBqLCBkaWZmLCBzaW1fYml0bWFwID0gMCwgYm91bmQ7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7Ci0Jc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKmRtX29kbSA9ICZoYWxfZGF0YS0+b2RtcHJpdjsKIAl1OCBmaW5hbF9jYW5kaWRhdGVbMl0gPSB7MHhGRiwgMHhGRn07CS8qIGZvciBwYXRoIEEgYW5kIHBhdGggQiAqLwogCWJvb2wgcmVzdWx0ID0gdHJ1ZTsKIAlzMzIgdG1wMSA9IDAsIHRtcDIgPSAwOwogCi0JaWYgKChkbV9vZG0tPlJGVHlwZSA9PSBPRE1fMlQyUikgfHwgKGRtX29kbS0+UkZUeXBlID09IE9ETV8yVDNSKSB8fAotCSAgICAoZG1fb2RtLT5SRlR5cGUgPT0gT0RNXzJUNFIpKQotCQlib3VuZCA9IDg7Ci0JZWxzZQotCQlib3VuZCA9IDQ7CisJYm91bmQgPSA0OwogCiAJZm9yIChpID0gMDsgaSA8IGJvdW5kOyBpKyspIHsKIAkJaWYgKChpID09IDEpIHx8IChpID09IDMpIHx8IChpID09IDUpIHx8IChpID09IDcpKSB7CkBAIC0xMDMzLDggKzEwMTcsNyBAQAogc3RhdGljIHZvaWQgcGh5X2lxX2NhbGlicmF0ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHMzMiByZXN1bHRbXVs4XSwKIAkJCSAgICAgdTggdCwgYm9vbCBpczJ0KQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwotCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpkbV9vZG0gPSAmaGFsX2RhdGEtPm9kbXByaXY7CisJc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKmRtX29kbSA9ICZhZGFwdC0+SGFsRGF0YS0+b2RtcHJpdjsKIAl1MzIgaTsKIAl1OCBwYXRoX2Ffb2ssIHBhdGhfYl9vazsKIAl1MzIgYWRkYV9yZWdbSVFLX0FEREFfUkVHX05VTV0gPSB7CkBAIC0xMjMyLDEyICsxMjE1LDEyIEBACiAJaWYgKCh0bXByZWcmMHg3MCkgIT0gMCkgewogCQkvKiAxLiBSZWFkIG9yaWdpbmFsIFJGIG1vZGUgKi8KIAkJLyogUGF0aC1BICovCi0JCXJmX2FfbW9kZSA9IHBoeV9xdWVyeV9yZl9yZWcoYWRhcHQsIFJGX1BBVEhfQSwgUkZfQUMsCisJCXJmX2FfbW9kZSA9IHJ0d19oYWxfcmVhZF9yZnJlZyhhZGFwdCwgUkZfUEFUSF9BLCBSRl9BQywKIAkJCQkJICAgICBiTWFzazEyQml0cyk7CiAKIAkJLyogUGF0aC1CICovCiAJCWlmIChpczJ0KQotCQkJcmZfYl9tb2RlID0gcGh5X3F1ZXJ5X3JmX3JlZyhhZGFwdCwgUkZfUEFUSF9CLCBSRl9BQywKKwkJCXJmX2JfbW9kZSA9IHJ0d19oYWxfcmVhZF9yZnJlZyhhZGFwdCwgUkZfUEFUSF9CLCBSRl9BQywKIAkJCQkJCSAgICAgYk1hc2sxMkJpdHMpOwogCiAJCS8qIDIuIFNldCBSRiBtb2RlID0gc3RhbmRieSBtb2RlICovCkBAIC0xMjUyLDcgKzEyMzUsNyBAQAogCX0KIAogCS8qIDMuIFJlYWQgUkYgcmVnMTggKi8KLQlsY19jYWwgPSBwaHlfcXVlcnlfcmZfcmVnKGFkYXB0LCBSRl9QQVRIX0EsIFJGX0NITkxCVywgYk1hc2sxMkJpdHMpOworCWxjX2NhbCA9IHJ0d19oYWxfcmVhZF9yZnJlZyhhZGFwdCwgUkZfUEFUSF9BLCBSRl9DSE5MQlcsIGJNYXNrMTJCaXRzKTsKIAogCS8qIDQuIFNldCBMQyBjYWxpYnJhdGlvbiBiZWdpbiBiaXQxNSAqLwogCXBoeV9zZXRfcmZfcmVnKGFkYXB0LCBSRl9QQVRIX0EsIFJGX0NITkxCVywgYk1hc2sxMkJpdHMsCkBAIC0xMjc5LDggKzEyNjIsNyBAQAogCiB2b2lkIHJ0bDg4ZXVfcGh5X2lxX2NhbGlicmF0ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIGJvb2wgcmVjb3ZlcnkpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7Ci0Jc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKmRtX29kbSA9ICZoYWxfZGF0YS0+b2RtcHJpdjsKKwlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtID0gJmFkYXB0LT5IYWxEYXRhLT5vZG1wcml2OwogCXMzMiByZXN1bHRbNF1bOF07CiAJdTggaSwgZmluYWwsIGNobl9pbmRleDsKIAlib29sIHBhdGhhb2ssIHBhdGhib2s7CkBAIC0xMjk1LDcgKzEyNzcsNyBAQAogCQlyT0ZETTBfUnhJUUV4dEFudGF9OwogCWJvb2wgaXMydDsKIAotCWlzMnQgPSAoZG1fb2RtLT5SRlR5cGUgPT0gT0RNXzJUMlIpID8gdHJ1ZSA6IGZhbHNlOworCWlzMnQgPSBmYWxzZTsKIAogCWlmICghKGRtX29kbS0+U3VwcG9ydEFiaWxpdHkgJiBPRE1fUkZfQ0FMSUJSQVRJT04pKQogCQlyZXR1cm47CkBAIC0xMzkxLDcgKzEzNzMsNyBAQAogCQkJCSAgICAgICAocmVnX2VjNCA9PSAwKSk7CiAJfQogCi0JY2huX2luZGV4ID0gZ2V0X3JpZ2h0X2NobmxfZm9yX2lxayhoYWxfZGF0YS0+Q3VycmVudENoYW5uZWwpOworCWNobl9pbmRleCA9IGdldF9yaWdodF9jaG5sX2Zvcl9pcWsoYWRhcHQtPkhhbERhdGEtPkN1cnJlbnRDaGFubmVsKTsKIAogCWlmIChmaW5hbCA8IDQpIHsKIAkJZm9yIChpID0gMDsgaSA8IElRS19NYXRyaXhfUkVHX05VTTsgaSsrKQpAQCAtMTQwNyw4ICsxMzg5LDcgQEAKIHsKIAlib29sIHNpbmdsZXRvbmUgPSBmYWxzZSwgY2Fycmllcl9zdXAgPSBmYWxzZTsKIAl1MzIgdGltZW91dCA9IDIwMDAsIHRpbWVjb3VudCA9IDA7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7Ci0Jc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKmRtX29kbSA9ICZoYWxfZGF0YS0+b2RtcHJpdjsKKwlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtID0gJmFkYXB0LT5IYWxEYXRhLT5vZG1wcml2OwogCiAJaWYgKCEoZG1fb2RtLT5TdXBwb3J0QWJpbGl0eSAmIE9ETV9SRl9DQUxJQlJBVElPTikpCiAJCXJldHVybjsKQEAgLTE0MjIsMTIgKzE0MDMsNyBAQAogCiAJZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uYkxDS0luUHJvZ3Jlc3MgPSB0cnVlOwogCi0JaWYgKGRtX29kbS0+UkZUeXBlID09IE9ETV8yVDJSKSB7Ci0JCXBoeV9sY19jYWxpYnJhdGUoYWRhcHQsIHRydWUpOwotCX0gZWxzZSB7Ci0JCS8qIEZvciA4OEMgMVQxUiAqLwotCQlwaHlfbGNfY2FsaWJyYXRlKGFkYXB0LCBmYWxzZSk7Ci0JfQorCXBoeV9sY19jYWxpYnJhdGUoYWRhcHQsIGZhbHNlKTsKIAogCWRtX29kbS0+UkZDYWxpYnJhdGVJbmZvLmJMQ0tJblByb2dyZXNzID0gZmFsc2U7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9yZi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcmYuYwppbmRleCAxNTk2Mjc0Li4yZjNlZGYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9yZi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3JmLmMKQEAgLTIyLDcgKzIyLDcgQEAKIHZvaWQgcnRsODhldV9waHlfcmY2MDUyX3NldF9iYW5kd2lkdGgoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LAogCQkJCSAgICAgIGVudW0gaHRfY2hhbm5lbF93aWR0aCBiYW5kd2lkdGgpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IGFkYXB0LT5IYWxEYXRhOwogCiAJc3dpdGNoIChiYW5kd2lkdGgpIHsKIAljYXNlIEhUX0NIQU5ORUxfV0lEVEhfMjA6CkBAIC00NCw3ICs0NCw3IEBACiAKIHZvaWQgcnRsODhldV9waHlfcmY2MDUyX3NldF9jY2tfdHhwb3dlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHU4ICpwb3dlcmxldmVsKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBhZGFwdC0+SGFsRGF0YTsKIAlzdHJ1Y3QgZG1fcHJpdiAqcGRtcHJpdiA9ICZoYWxfZGF0YS0+ZG1wcml2OwogCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZhZGFwdC0+bWxtZWV4dHByaXY7CiAJdTMyIHR4X2FnY1syXSA9IHswLCAwfSwgdG1wdmFsID0gMCwgcHdydHJhY192YWx1ZTsKQEAgLTEyOSw3ICsxMjksNiBAQAogCQkJICAgIHU4ICpwd3JfbGV2ZWxfYncyMCwgdTggKnB3cl9sZXZlbF9idzQwLAogCQkJICAgIHU4IGNoYW5uZWwsIHUzMiAqb2ZkbWJhc2UsIHUzMiAqbWNzX2Jhc2UpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CiAJdTMyIHBvd2VyYmFzZTAsIHBvd2VyYmFzZTE7CiAJdTggaSwgcG93ZXJsZXZlbFsyXTsKIApAQCAtMTQwLDkgKzEzOSw5IEBACiAJCQkgICAgIChwb3dlcmJhc2UwPDw4KSB8IHBvd2VyYmFzZTA7CiAJCSoob2ZkbWJhc2UraSkgPSBwb3dlcmJhc2UwOwogCX0KLQlmb3IgKGkgPSAwOyBpIDwgaGFsX2RhdGEtPk51bVRvdGFsUkZQYXRoOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHQtPkhhbERhdGEtPk51bVRvdGFsUkZQYXRoOyBpKyspIHsKIAkJLyogQ2hlY2sgSFQyMCB0byBIVDQwIGRpZmYgKi8KLQkJaWYgKGhhbF9kYXRhLT5DdXJyZW50Q2hhbm5lbEJXID09IEhUX0NIQU5ORUxfV0lEVEhfMjApCisJCWlmIChhZGFwdC0+SGFsRGF0YS0+Q3VycmVudENoYW5uZWxCVyA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwKQogCQkJcG93ZXJsZXZlbFtpXSA9IHB3cl9sZXZlbF9idzIwW2ldOwogCQllbHNlCiAJCQlwb3dlcmxldmVsW2ldID0gcHdyX2xldmVsX2J3NDBbaV07CkBAIC0xNTYsNyArMTU1LDcgQEAKIAkJCQkgICAgdTggaW5kZXgsIHUzMiAqcG93ZXJiYXNlMCwgdTMyICpwb3dlcmJhc2UxLAogCQkJCSAgICB1MzIgKm91dF92YWwpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IGFkYXB0LT5IYWxEYXRhOwogCXN0cnVjdCBkbV9wcml2CSpwZG1wcml2ID0gJmhhbF9kYXRhLT5kbXByaXY7CiAJdTggaSwgY2hubEdyb3VwID0gMCwgcHdyX2RpZmZfbGltaXRbNF0sIGN1c3RvbWVyX3B3cl9saW1pdDsKIAlzOCBwd3JfZGlmZiA9IDA7CkBAIC0yODYsNyArMjg1LDYgQEAKIAkJCQkJIHU4ICpwd3JfbGV2ZWxfYncyMCwKIAkJCQkJIHU4ICpwd3JfbGV2ZWxfYnc0MCwgdTggY2hhbm5lbCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKIAl1MzIgd3JpdGVfdmFsWzJdLCBwb3dlcmJhc2UwWzJdLCBwb3dlcmJhc2UxWzJdLCBwd3J0cmFjX3ZhbHVlOwogCXU4IGRpcmVjdGlvbjsKIAl1OCBpbmRleCA9IDA7CkBAIC0yOTQsOCArMjkyLDggQEAKIAlnZXRwb3dlcmJhc2U4OGUoYWRhcHQsIHB3cl9sZXZlbF9vZmRtLCBwd3JfbGV2ZWxfYncyMCwgcHdyX2xldmVsX2J3NDAsCiAJCQljaGFubmVsLCAmcG93ZXJiYXNlMFswXSwgJnBvd2VyYmFzZTFbMF0pOwogCi0JcnRsODhldV9kbV90eHBvd2VyX3RyYWNrX2FkanVzdCgmaGFsX2RhdGEtPm9kbXByaXYsIDAsICZkaXJlY3Rpb24sCi0JCQkJCSZwd3J0cmFjX3ZhbHVlKTsKKwlydGw4OGV1X2RtX3R4cG93ZXJfdHJhY2tfYWRqdXN0KCZhZGFwdC0+SGFsRGF0YS0+b2RtcHJpdiwgMCwKKwkJCQkJJmRpcmVjdGlvbiwgJnB3cnRyYWNfdmFsdWUpOwogCiAJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgNjsgaW5kZXgrKykgewogCQlnZXRfcnhfcG93ZXJfdmFsX2J5X3JlZyhhZGFwdCwgY2hhbm5lbCwgaW5kZXgsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9yZl9jZmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3JmX2NmZy5jCmluZGV4IDQ1M2Y5ZTcuLmRkZTY0NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3JmX2NmZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3JmX2NmZy5jCkBAIC0xOSw3ICsxOSw3IEBACiAKIHN0YXRpYyBib29sIGNoZWNrX2NvbmRpdGlvbihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIGNvbnN0IHUzMiAgY29uZGl0aW9uKQogewotCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpvZG0gPSAmR0VUX0hBTF9EQVRBKGFkYXB0KS0+b2RtcHJpdjsKKwlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqb2RtID0gJmFkYXB0LT5IYWxEYXRhLT5vZG1wcml2OwogCXUzMiBfYm9hcmQgPSBvZG0tPkJvYXJkVHlwZTsKIAl1MzIgX3BsYXRmb3JtID0gb2RtLT5TdXBwb3J0UGxhdGZvcm07CiAJdTMyIF9pbnRlcmZhY2UgPSBvZG0tPlN1cHBvcnRJbnRlcmZhY2U7CkBAIC0yMjgsNyArMjI4LDcgQEAKIAogc3RhdGljIGJvb2wgcmY2MDUyX2NvbmZfcGFyYShzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IGFkYXB0LT5IYWxEYXRhOwogCXUzMiB1NHZhbCA9IDA7CiAJdTggcmZwYXRoOwogCWJvb2wgcnRzdGF0dXMgPSB0cnVlOwpAQCAtMjk5LDEyICsyOTksOSBAQAogCiBzdGF0aWMgYm9vbCBydGw4OGVfcGh5X3JmNjA1Ml9jb25maWcoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBhZGFwdC0+SGFsRGF0YTsKIAotCWlmIChoYWxfZGF0YS0+cmZfdHlwZSA9PSBSRl8xVDFSKQotCQloYWxfZGF0YS0+TnVtVG90YWxSRlBhdGggPSAxOwotCWVsc2UKLQkJaGFsX2RhdGEtPk51bVRvdGFsUkZQYXRoID0gMjsKKwloYWxfZGF0YS0+TnVtVG90YWxSRlBhdGggPSAxOwogCiAJcmV0dXJuIHJmNjA1Ml9jb25mX3BhcmEoYWRhcHQpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfY21kLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9jbWQuYwppbmRleCAyNDIyYzAyLi5kMGY1OWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9jbWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9jbWQuYwpAQCAtNjAsNyArNjAsNiBAQAogCXU4IGgyY19ib3hfbnVtOwogCXUzMiBtc2dib3hfYWRkcjsKIAl1MzIgbXNnYm94X2V4X2FkZHI7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKIAl1OCBjbWRfaWR4LCBleHRfY21kX2xlbjsKIAl1MzIgaDJjX2NtZCA9IDA7CiAJdTMyIGgyY19jbWRfZXggPSAwOwpAQCAtODEsNyArODAsNyBAQAogCiAJLyogcGF5IGF0dGVudGlvbiB0byBpZiAgcmFjZSBjb25kaXRpb24gaGFwcGVuZWQgaW4gIEgyQyBjbWQgc2V0dGluZy4gKi8KIAlkbyB7Ci0JCWgyY19ib3hfbnVtID0gaGFsZGF0YS0+TGFzdEhNRUJveE51bTsKKwkJaDJjX2JveF9udW0gPSBhZGFwdC0+SGFsRGF0YS0+TGFzdEhNRUJveE51bTsKIAogCQlpZiAoIV9pc19md19yZWFkX2NtZF9kb3duKGFkYXB0LCBoMmNfYm94X251bSkpIHsKIAkJCURCR184OEUoIiBmdyByZWFkIGNtZCBmYWlsZWQuLi5cbiIpOwpAQCAtMTEwLDcgKzEwOSw4IEBACiAJCX0KIAkJYmNtZF9kb3duID0gdHJ1ZTsKIAotCQloYWxkYXRhLT5MYXN0SE1FQm94TnVtID0gKGgyY19ib3hfbnVtKzEpICUgUlRMODhFX01BWF9IMkNfQk9YX05VTVM7CisJCWFkYXB0LT5IYWxEYXRhLT5MYXN0SE1FQm94TnVtID0KKwkJCShoMmNfYm94X251bSsxKSAlIFJUTDg4RV9NQVhfSDJDX0JPWF9OVU1TOwogCiAJfSB3aGlsZSAoKCFiY21kX2Rvd24pICYmIChyZXRyeV9jbnRzLS0pKTsKIApAQCAtMTI2LDkgKzEyNiw5IEBACiAvKiBiaXRtYXBbMjg6MzFdPSBSYXRlIEFkYXB0aXZlIGlkICovCiAvKiBhcmdbMDo0XSA9IG1hY2lkICovCiAvKiBhcmdbNV0gPSBTaG9ydCBHSSAqLwotdm9pZCBydGw4MTg4ZV9BZGRfUmF0ZUFUaWQoc3RydWN0IGFkYXB0ZXIgKnBBZGFwdGVyLCB1MzIgYml0bWFwLCB1OCBhcmcsIHU4IHJzc2lfbGV2ZWwpCit2b2lkIHJ0d19oYWxfYWRkX3JhX3RpZChzdHJ1Y3QgYWRhcHRlciAqcEFkYXB0ZXIsIHUzMiBiaXRtYXAsIHU4IGFyZywgdTggcnNzaV9sZXZlbCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbGRhdGEgPSBHRVRfSEFMX0RBVEEocEFkYXB0ZXIpOworCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpvZG1wcml2ID0gJnBBZGFwdGVyLT5IYWxEYXRhLT5vZG1wcml2OwogCiAJdTggbWFjaWQsIGluaXRfcmF0ZSwgcmFpZCwgc2hvcnRHSXJhdGUgPSBmYWxzZTsKIApAQCAtMTM4LDcgKzEzOCw3IEBACiAJYml0bWFwICY9IDB4MGZmZmZmZmY7CiAKIAlpZiAocnNzaV9sZXZlbCAhPSBETV9SQVRSX1NUQV9JTklUKQotCQliaXRtYXAgPSBPRE1fR2V0X1JhdGVfQml0bWFwKCZoYWxkYXRhLT5vZG1wcml2LCBtYWNpZCwgYml0bWFwLCByc3NpX2xldmVsKTsKKwkJYml0bWFwID0gT0RNX0dldF9SYXRlX0JpdG1hcChvZG1wcml2LCBtYWNpZCwgYml0bWFwLCByc3NpX2xldmVsKTsKIAogCWJpdG1hcCB8PSAoKHJhaWQ8PDI4KSYweGYwMDAwMDAwKTsKIApAQCAtMTU2LDcgKzE1Niw3IEBACiAJREJHXzg4RSgiJXM9PiBtYWNfaWQ6JWQsIHJhaWQ6JWQsIHJhX2JpdG1hcD0weCV4LCBzaG9ydEdJcmF0ZT0weCUwMnhcbiIsCiAJCV9fZnVuY19fLCBtYWNpZCwgcmFpZCwgYml0bWFwLCBzaG9ydEdJcmF0ZSk7CiAKLQlPRE1fUkFfVXBkYXRlUmF0ZUluZm9fODE4OEUoJihoYWxkYXRhLT5vZG1wcml2KSwgbWFjaWQsIHJhaWQsIGJpdG1hcCwgc2hvcnRHSXJhdGUpOworCU9ETV9SQV9VcGRhdGVSYXRlSW5mb184MTg4RShvZG1wcml2LCBtYWNpZCwgcmFpZCwgYml0bWFwLCBzaG9ydEdJcmF0ZSk7CiB9CiAKIHZvaWQgcnRsODE4OGVfc2V0X0Z3UHdyTW9kZV9jbWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1OCBNb2RlKQpAQCAtMjE5LDcgKzIxOSw3IEBACiAKIHN0YXRpYyB2b2lkIENvbnN0cnVjdEJlYWNvbihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHU4ICpwZnJhbWUsIHUzMiAqcExlbmd0aCkKIHsKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIJKnB3bGFuaGRyOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpwd2xhbmhkcjsKIAlfX2xlMTYgKmZjdHJsOwogCXUzMiByYXRlX2xlbiwgcGt0bGVuOwogCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICYoYWRhcHQtPm1sbWVleHRwcml2KTsKQEAgLTIyNywyMCArMjI3LDIwIEBACiAJc3RydWN0IHdsYW5fYnNzaWRfZXgJCSpjdXJfbmV0d29yayA9ICYocG1sbWVpbmZvLT5uZXR3b3JrKTsKIAl1OCBiY19hZGRyW10gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CiAKLQlwd2xhbmhkciA9IChzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIgKilwZnJhbWU7CisJcHdsYW5oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilwZnJhbWU7CiAKLQlmY3RybCA9ICYocHdsYW5oZHItPmZyYW1lX2N0bCk7CisJZmN0cmwgPSAmcHdsYW5oZHItPmZyYW1lX2NvbnRyb2w7CiAJKihmY3RybCkgPSAwOwogCi0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMSwgYmNfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweShwd2xhbmhkci0+YWRkcjIsIG15aWQoJihhZGFwdC0+ZWVwcm9tcHJpdikpLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMywgY3VyX25ldHdvcmstPk1hY0FkZHJlc3MsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIxLCBiY19hZGRyKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCYoYWRhcHQtPmVlcHJvbXByaXYpKSk7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMywgY3VyX25ldHdvcmstPk1hY0FkZHJlc3MpOwogCiAJU2V0U2VxTnVtKHB3bGFuaGRyLCAwLypwbWxtZWV4dC0+bWdudF9zZXEqLyk7CiAJU2V0RnJhbWVTdWJUeXBlKHBmcmFtZSwgV0lGSV9CRUFDT04pOwogCi0JcGZyYW1lICs9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOwotCXBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOworCXBmcmFtZSArPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOworCXBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CiAKIAkvKiB0aW1lc3RhbXAgd2lsbCBiZSBpbnNlcnRlZCBieSBoYXJkd2FyZSAqLwogCXBmcmFtZSArPSA4OwpAQCAtMzA0LDE2ICszMDQsMTYgQEAKIAogc3RhdGljIHZvaWQgQ29uc3RydWN0UFNQb2xsKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTggKnBmcmFtZSwgdTMyICpwTGVuZ3RoKQogewotCXN0cnVjdCBydHdfaWVlZTgwMjExX2hkcgkqcHdsYW5oZHI7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKnB3bGFuaGRyOwogCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICYoYWRhcHQtPm1sbWVleHRwcml2KTsKIAlzdHJ1Y3QgbWxtZV9leHRfaW5mbwkqcG1sbWVpbmZvID0gJihwbWxtZWV4dC0+bWxtZXh0X2luZm8pOwogCV9fbGUxNiAqZmN0cmw7CiAJc3RydWN0IHdsYW5fYnNzaWRfZXggKnBuZXR3b3JrID0gJihwbWxtZWluZm8tPm5ldHdvcmspOwogCi0JcHdsYW5oZHIgPSAoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyICopcGZyYW1lOworCXB3bGFuaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopcGZyYW1lOwogCiAJLyogIEZyYW1lIGNvbnRyb2wuICovCi0JZmN0cmwgPSAmKHB3bGFuaGRyLT5mcmFtZV9jdGwpOworCWZjdHJsID0gJnB3bGFuaGRyLT5mcmFtZV9jb250cm9sOwogCSooZmN0cmwpID0gMDsKIAlTZXRQd3JNZ3QoZmN0cmwpOwogCVNldEZyYW1lU3ViVHlwZShwZnJhbWUsIFdJRklfUFNQT0xMKTsKQEAgLTMyMiwxMCArMzIyLDEwIEBACiAJU2V0RHVyYXRpb24ocGZyYW1lLCAocG1sbWVpbmZvLT5haWQgfCAweGMwMDApKTsKIAogCS8qICBCU1NJRC4gKi8KLQltZW1jcHkocHdsYW5oZHItPmFkZHIxLCBwbmV0d29yay0+TWFjQWRkcmVzcywgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjEsIHBuZXR3b3JrLT5NYWNBZGRyZXNzKTsKIAogCS8qICBUQS4gKi8KLQltZW1jcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCYoYWRhcHQtPmVlcHJvbXByaXYpKSwgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjIsIG15aWQoJihhZGFwdC0+ZWVwcm9tcHJpdikpKTsKIAogCSpwTGVuZ3RoID0gMTY7CiB9CkBAIC0zMzgsNyArMzM4LDcgQEAKIAl1OCBiRW9zcCwKIAl1OCBiRm9yY2VQb3dlclNhdmUpCiB7Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyCSpwd2xhbmhkcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqcHdsYW5oZHI7CiAJX19sZTE2ICpmY3RybDsKIAl1MzIgcGt0bGVuOwogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdC0+bWxtZXByaXY7CkBAIC0zNDcsOSArMzQ3LDkgQEAKIAlzdHJ1Y3QgbWxtZV9leHRfaW5mbwkqcG1sbWVpbmZvID0gJihwbWxtZWV4dC0+bWxtZXh0X2luZm8pOwogCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwbmV0d29yayA9ICYocG1sbWVpbmZvLT5uZXR3b3JrKTsKIAotCXB3bGFuaGRyID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKKwlwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKIAotCWZjdHJsID0gJnB3bGFuaGRyLT5mcmFtZV9jdGw7CisJZmN0cmwgPSAmcHdsYW5oZHItPmZyYW1lX2NvbnRyb2w7CiAJKihmY3RybCkgPSAwOwogCWlmIChiRm9yY2VQb3dlclNhdmUpCiAJCVNldFB3ck1ndChmY3RybCk7CkBAIC0zNTcsNDAgKzM1Nyw0MCBAQAogCXN3aXRjaCAoY3VyX25ldHdvcmstPm5ldHdvcmsuSW5mcmFzdHJ1Y3R1cmVNb2RlKSB7CiAJY2FzZSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmU6CiAJCVNldFRvRHMoZmN0cmwpOwotCQltZW1jcHkocHdsYW5oZHItPmFkZHIxLCBwbmV0d29yay0+TWFjQWRkcmVzcywgRVRIX0FMRU4pOwotCQltZW1jcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCYoYWRhcHQtPmVlcHJvbXByaXYpKSwgRVRIX0FMRU4pOwotCQltZW1jcHkocHdsYW5oZHItPmFkZHIzLCBTdGFBZGRyLCBFVEhfQUxFTik7CisJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjEsIHBuZXR3b3JrLT5NYWNBZGRyZXNzKTsKKwkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMiwgbXlpZCgmKGFkYXB0LT5lZXByb21wcml2KSkpOworCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBTdGFBZGRyKTsKIAkJYnJlYWs7CiAJY2FzZSBOZGlzODAyXzExQVBNb2RlOgogCQlTZXRGckRzKGZjdHJsKTsKLQkJbWVtY3B5KHB3bGFuaGRyLT5hZGRyMSwgU3RhQWRkciwgRVRIX0FMRU4pOwotCQltZW1jcHkocHdsYW5oZHItPmFkZHIyLCBwbmV0d29yay0+TWFjQWRkcmVzcywgRVRIX0FMRU4pOwotCQltZW1jcHkocHdsYW5oZHItPmFkZHIzLCBteWlkKCYoYWRhcHQtPmVlcHJvbXByaXYpKSwgRVRIX0FMRU4pOworCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIxLCBTdGFBZGRyKTsKKwkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMiwgcG5ldHdvcmstPk1hY0FkZHJlc3MpOworCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBteWlkKCYoYWRhcHQtPmVlcHJvbXByaXYpKSk7CiAJCWJyZWFrOwogCWNhc2UgTmRpczgwMl8xMUlCU1M6CiAJZGVmYXVsdDoKLQkJbWVtY3B5KHB3bGFuaGRyLT5hZGRyMSwgU3RhQWRkciwgRVRIX0FMRU4pOwotCQltZW1jcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCYoYWRhcHQtPmVlcHJvbXByaXYpKSwgRVRIX0FMRU4pOwotCQltZW1jcHkocHdsYW5oZHItPmFkZHIzLCBwbmV0d29yay0+TWFjQWRkcmVzcywgRVRIX0FMRU4pOworCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIxLCBTdGFBZGRyKTsKKwkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMiwgbXlpZCgmKGFkYXB0LT5lZXByb21wcml2KSkpOworCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBwbmV0d29yay0+TWFjQWRkcmVzcyk7CiAJCWJyZWFrOwogCX0KIAogCVNldFNlcU51bShwd2xhbmhkciwgMCk7CiAKIAlpZiAoYlFvUykgewotCQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHJfcW9zICpwd2xhbnFvc2hkcjsKKwkJc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyICpwd2xhbnFvc2hkcjsKIAogCQlTZXRGcmFtZVN1YlR5cGUocGZyYW1lLCBXSUZJX1FPU19EQVRBX05VTEwpOwogCi0JCXB3bGFucW9zaGRyID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcl9xb3MgKilwZnJhbWU7Ci0JCVNldFByaW9yaXR5KCZwd2xhbnFvc2hkci0+cWMsIEFDKTsKLQkJU2V0RU9TUCgmcHdsYW5xb3NoZHItPnFjLCBiRW9zcCk7CisJCXB3bGFucW9zaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfcW9zX2hkciAqKXBmcmFtZTsKKwkJU2V0UHJpb3JpdHkoJnB3bGFucW9zaGRyLT5xb3NfY3RybCwgQUMpOworCQlTZXRFT1NQKCZwd2xhbnFvc2hkci0+cW9zX2N0cmwsIGJFb3NwKTsKIAotCQlwa3RsZW4gPSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyX3Fvcyk7CisJCXBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Fvc19oZHIpOwogCX0gZWxzZSB7CiAJCVNldEZyYW1lU3ViVHlwZShwZnJhbWUsIFdJRklfREFUQV9OVUxMKTsKIAotCQlwa3RsZW4gPSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKKwkJcGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKIAl9CiAKIAkqcExlbmd0aCA9IHBrdGxlbjsKQEAgLTM5OCw3ICszOTgsNyBAQAogCiBzdGF0aWMgdm9pZCBDb25zdHJ1Y3RQcm9iZVJzcChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHU4ICpwZnJhbWUsIHUzMiAqcExlbmd0aCwgdTggKlN0YUFkZHIsIGJvb2wgYkhpZGVTU0lEKQogewotCXN0cnVjdCBydHdfaWVlZTgwMjExX2hkcgkqcHdsYW5oZHI7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKnB3bGFuaGRyOwogCV9fbGUxNiAqZmN0cmw7CiAJdTggKm1hYywgKmJzc2lkOwogCXUzMiBwa3RsZW47CkBAIC00MDYsMjEgKzQwNiwyMSBAQAogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmKHBtbG1lZXh0LT5tbG1leHRfaW5mbyk7CiAJc3RydWN0IHdsYW5fYnNzaWRfZXgJKmN1cl9uZXR3b3JrID0gJihwbWxtZWluZm8tPm5ldHdvcmspOwogCi0JcHdsYW5oZHIgPSAoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyICopcGZyYW1lOworCXB3bGFuaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopcGZyYW1lOwogCiAJbWFjID0gbXlpZCgmKGFkYXB0LT5lZXByb21wcml2KSk7CiAJYnNzaWQgPSBjdXJfbmV0d29yay0+TWFjQWRkcmVzczsKIAotCWZjdHJsID0gJihwd2xhbmhkci0+ZnJhbWVfY3RsKTsKKwlmY3RybCA9ICZwd2xhbmhkci0+ZnJhbWVfY29udHJvbDsKIAkqKGZjdHJsKSA9IDA7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMSwgU3RhQWRkciwgRVRIX0FMRU4pOwotCW1lbWNweShwd2xhbmhkci0+YWRkcjIsIG1hYywgRVRIX0FMRU4pOwotCW1lbWNweShwd2xhbmhkci0+YWRkcjMsIGJzc2lkLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMSwgU3RhQWRkcik7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMiwgbWFjKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBic3NpZCk7CiAKIAlTZXRTZXFOdW0ocHdsYW5oZHIsIDApOwogCVNldEZyYW1lU3ViVHlwZShmY3RybCwgV0lGSV9QUk9CRVJTUCk7CiAKLQlwa3RsZW4gPSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKKwlwa3RsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwogCXBmcmFtZSArPSBwa3RsZW47CiAKIAlpZiAoY3VyX25ldHdvcmstPklFTGVuZ3RoID4gTUFYX0lFX1NaKQpAQCAtNDQ1LDcgKzQ0NSw2IEBACiAvKiAgMjAwOS4xMC4xNSBieSB0eW5saS4gKi8KIHN0YXRpYyB2b2lkIFNldEZ3UnN2ZFBhZ2VQa3Qoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBib29sIGJETEZpbmlzaGVkKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YTsKIAlzdHJ1Y3QgeG1pdF9mcmFtZQkqcG1nbnRmcmFtZTsKIAlzdHJ1Y3QgcGt0X2F0dHJpYgkqcGF0dHJpYjsKIAlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXY7CkBAIC00NjcsNyArNDY2LDYgQEAKIAkJcmV0dXJuOwogCX0KIAotCWhhbGRhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwogCXB4bWl0cHJpdiA9ICZhZGFwdC0+eG1pdHByaXY7CiAJcG1sbWVleHQgPSAmYWRhcHQtPm1sbWVleHRwcml2OwogCXBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87CkBAIC00ODcsNyArNDg1LDcgQEAKIAlpZiAoUGFnZU5lZWQgPT0gMSkKIAkJUGFnZU5lZWQgKz0gMTsKIAlQYWdlTnVtICs9IFBhZ2VOZWVkOwotCWhhbGRhdGEtPkZ3UnN2ZFBhZ2VTdGFydE9mZnNldCA9IFBhZ2VOdW07CisJYWRhcHQtPkhhbERhdGEtPkZ3UnN2ZFBhZ2VTdGFydE9mZnNldCA9IFBhZ2VOdW07CiAKIAlCdWZJbmRleCArPSBQYWdlTmVlZCoxMjg7CiAKQEAgLTU1NCw3ICs1NTIsNyBAQAogCiB2b2lkIHJ0bDgxODhlX3NldF9Gd0pvaW5Cc3NSZXBvcnRfY21kKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTggbXN0YXR1cykKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbGRhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YSA9IGFkYXB0LT5IYWxEYXRhOwogCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICYoYWRhcHQtPm1sbWVleHRwcml2KTsKIAlzdHJ1Y3QgbWxtZV9leHRfaW5mbwkqcG1sbWVpbmZvID0gJihwbWxtZWV4dC0+bWxtZXh0X2luZm8pOwogCWJvb2wJYlNlbmRCZWFjb24gPSBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2RtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9kbS5jCmluZGV4IDgxZjI5MzEuLmQwNGI3ZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2RtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfZG0uYwpAQCAtNDIsNDMgKzQyLDMzIEBACiAvKiAgKi8KIHN0YXRpYyB2b2lkIEluaXRfT0RNX0NvbUluZm9fODhFKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEFkYXB0ZXItPkhhbERhdGE7CiAJc3RydWN0IGRtX3ByaXYJKnBkbXByaXYgPSAmaGFsX2RhdGEtPmRtcHJpdjsKIAlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtID0gJihoYWxfZGF0YS0+b2RtcHJpdik7Ci0JdTggY3V0X3ZlcjsKIAogCS8qICBJbml0IFZhbHVlICovCiAJbWVtc2V0KGRtX29kbSwgMCwgc2l6ZW9mKCpkbV9vZG0pKTsKIAogCWRtX29kbS0+QWRhcHRlciA9IEFkYXB0ZXI7CisJZG1fb2RtLT5TdXBwb3J0UGxhdGZvcm0gPSBPRE1fQ0U7CisJZG1fb2RtLT5TdXBwb3J0SUNUeXBlID0gT0RNX1JUTDgxODhFOworCWRtX29kbS0+Q3V0VmVyc2lvbiA9IE9ETV9DVVRfQTsKKwlkbV9vZG0tPmJJc01QQ2hpcCA9IGhhbF9kYXRhLT5WZXJzaW9uSUQuQ2hpcFR5cGUgPT0gTk9STUFMX0NISVA7CisJZG1fb2RtLT5QYXRjaElEID0gaGFsX2RhdGEtPkN1c3RvbWVySUQ7CisJZG1fb2RtLT5iV0lGSVRlc3QgPSBBZGFwdGVyLT5yZWdpc3RyeXByaXYud2lmaV9zcGVjOwogCi0JT0RNX0NtbkluZm9Jbml0KGRtX29kbSwgT0RNX0NNTklORk9fUExBVEZPUk0sIE9ETV9DRSk7CisJZG1fb2RtLT5BbnREaXZUeXBlID0gaGFsX2RhdGEtPlRSeEFudERpdlR5cGU7CiAKLQlPRE1fQ21uSW5mb0luaXQoZG1fb2RtLCBPRE1fQ01OSU5GT19JQ19UWVBFLCBPRE1fUlRMODE4OEUpOwotCi0JY3V0X3ZlciA9IE9ETV9DVVRfQTsKLQotCU9ETV9DbW5JbmZvSW5pdChkbV9vZG0sIE9ETV9DTU5JTkZPX0NVVF9WRVIsIGN1dF92ZXIpOwotCi0JT0RNX0NtbkluZm9Jbml0KGRtX29kbSwgT0RNX0NNTklORk9fTVBfVEVTVF9DSElQLCBoYWxfZGF0YS0+VmVyc2lvbklELkNoaXBUeXBlID09IE5PUk1BTF9DSElQID8gdHJ1ZSA6IGZhbHNlKTsKLQotCU9ETV9DbW5JbmZvSW5pdChkbV9vZG0sIE9ETV9DTU5JTkZPX1BBVENIX0lELCBoYWxfZGF0YS0+Q3VzdG9tZXJJRCk7Ci0JT0RNX0NtbkluZm9Jbml0KGRtX29kbSwgT0RNX0NNTklORk9fQldJRklfVEVTVCwgQWRhcHRlci0+cmVnaXN0cnlwcml2LndpZmlfc3BlYyk7Ci0KLQotCWlmIChoYWxfZGF0YS0+cmZfdHlwZSA9PSBSRl8xVDFSKQotCQlPRE1fQ21uSW5mb1VwZGF0ZShkbV9vZG0sIE9ETV9DTU5JTkZPX1JGX1RZUEUsIE9ETV8xVDFSKTsKLQllbHNlIGlmIChoYWxfZGF0YS0+cmZfdHlwZSA9PSBSRl8yVDJSKQotCQlPRE1fQ21uSW5mb1VwZGF0ZShkbV9vZG0sIE9ETV9DTU5JTkZPX1JGX1RZUEUsIE9ETV8yVDJSKTsKLQllbHNlIGlmIChoYWxfZGF0YS0+cmZfdHlwZSA9PSBSRl8xVDJSKQotCQlPRE1fQ21uSW5mb1VwZGF0ZShkbV9vZG0sIE9ETV9DTU5JTkZPX1JGX1RZUEUsIE9ETV8xVDJSKTsKLQotCU9ETV9DbW5JbmZvSW5pdChkbV9vZG0sIE9ETV9DTU5JTkZPX1JGX0FOVEVOTkFfVFlQRSwgaGFsX2RhdGEtPlRSeEFudERpdlR5cGUpOworCS8qICBUeCBwb3dlciB0cmFja2luZyBCQiBzd2luZyB0YWJsZS4gKi8KKwkvKiAgVGhlIGJhc2UgaW5kZXggPSAxMi4gKygoMTItbikvMilkQiAxM34/PyA9IGRlY3JlYXNlIHR4IHB3ciBieSAtKChuLTEyKS8yKWRCICovCisJZG1fb2RtLT5CYlN3aW5nSWR4T2ZkbSA9IDEyOyAvKiAgU2V0IGRlZmFsdXQgdmFsdWUgYXMgaW5kZXggMTIuICovCisJZG1fb2RtLT5CYlN3aW5nSWR4T2ZkbUN1cnJlbnQgPSAxMjsKKwlkbV9vZG0tPkJiU3dpbmdGbGFnT2ZkbSA9IGZhbHNlOwogCiAJcGRtcHJpdi0+SW5pdE9ETUZsYWcgPQlPRE1fUkZfQ0FMSUJSQVRJT04gfAogCQkJCU9ETV9SRl9UWF9QV1JfVFJBQ0s7CiAKLQlPRE1fQ21uSW5mb1VwZGF0ZShkbV9vZG0sIE9ETV9DTU5JTkZPX0FCSUxJVFksIHBkbXByaXYtPkluaXRPRE1GbGFnKTsKKwlkbV9vZG0tPlN1cHBvcnRBYmlsaXR5ID0gcGRtcHJpdi0+SW5pdE9ETUZsYWc7CiB9CiAKIHN0YXRpYyB2b2lkIFVwZGF0ZV9PRE1fQ29tSW5mb184OEUoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCkBAIC04Niw3ICs3Niw3IEBACiAJc3RydWN0IG1sbWVfZXh0X3ByaXYJKnBtbG1lZXh0ID0gJkFkYXB0ZXItPm1sbWVleHRwcml2OwogCXN0cnVjdCBtbG1lX3ByaXYJKnBtbG1lcHJpdiA9ICZBZGFwdGVyLT5tbG1lcHJpdjsKIAlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3JjdHJscHJpdiA9ICZBZGFwdGVyLT5wd3JjdHJscHJpdjsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBBZGFwdGVyLT5IYWxEYXRhOwogCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpkbV9vZG0gPSAmKGhhbF9kYXRhLT5vZG1wcml2KTsKIAlzdHJ1Y3QgZG1fcHJpdgkqcGRtcHJpdiA9ICZoYWxfZGF0YS0+ZG1wcml2OwogCWludCBpOwpAQCAtMTA5LDIwICs5OSwyNiBAQAogCQkJCQlPRE1fUkZfVFhfUFdSX1RSQUNLOwogCX0KIAotCU9ETV9DbW5JbmZvVXBkYXRlKGRtX29kbSwgT0RNX0NNTklORk9fQUJJTElUWSwgcGRtcHJpdi0+SW5pdE9ETUZsYWcpOworCWRtX29kbS0+U3VwcG9ydEFiaWxpdHkgPSBwZG1wcml2LT5Jbml0T0RNRmxhZzsKIAotCU9ETV9DbW5JbmZvSG9vayhkbV9vZG0sIE9ETV9DTU5JTkZPX1RYX1VOSSwgJihBZGFwdGVyLT54bWl0cHJpdi50eF9ieXRlcykpOwotCU9ETV9DbW5JbmZvSG9vayhkbV9vZG0sIE9ETV9DTU5JTkZPX1JYX1VOSSwgJihBZGFwdGVyLT5yZWN2cHJpdi5yeF9ieXRlcykpOwotCU9ETV9DbW5JbmZvSG9vayhkbV9vZG0sIE9ETV9DTU5JTkZPX1dNX01PREUsICYocG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlKSk7Ci0JT0RNX0NtbkluZm9Ib29rKGRtX29kbSwgT0RNX0NNTklORk9fU0VDX0NITkxfT0ZGU0VULCAmKGhhbF9kYXRhLT5uQ3VyNDBNaHpQcmltZVNDKSk7Ci0JT0RNX0NtbkluZm9Ib29rKGRtX29kbSwgT0RNX0NNTklORk9fU0VDX01PREUsICYoQWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG0pKTsKLQlPRE1fQ21uSW5mb0hvb2soZG1fb2RtLCBPRE1fQ01OSU5GT19CVywgJihoYWxfZGF0YS0+Q3VycmVudENoYW5uZWxCVykpOwotCU9ETV9DbW5JbmZvSG9vayhkbV9vZG0sIE9ETV9DTU5JTkZPX0NITkwsICYoaGFsX2RhdGEtPkN1cnJlbnRDaGFubmVsKSk7Ci0JT0RNX0NtbkluZm9Ib29rKGRtX29kbSwgT0RNX0NNTklORk9fTkVUX0NMT1NFRCwgJihBZGFwdGVyLT5uZXRfY2xvc2VkKSk7Ci0JT0RNX0NtbkluZm9Ib29rKGRtX29kbSwgT0RNX0NNTklORk9fTVBfTU9ERSwgJihBZGFwdGVyLT5yZWdpc3RyeXByaXYubXBfbW9kZSkpOwotCU9ETV9DbW5JbmZvSG9vayhkbV9vZG0sIE9ETV9DTU5JTkZPX1NDQU4sICYocG1sbWVwcml2LT5iU2NhbkluUHJvY2VzcykpOwotCU9ETV9DbW5JbmZvSG9vayhkbV9vZG0sIE9ETV9DTU5JTkZPX1BPV0VSX1NBVklORywgJihwd3JjdHJscHJpdi0+YnBvd2VyX3NhdmluZykpOwotCU9ETV9DbW5JbmZvSW5pdChkbV9vZG0sIE9ETV9DTU5JTkZPX1JGX0FOVEVOTkFfVFlQRSwgaGFsX2RhdGEtPlRSeEFudERpdlR5cGUpOworCWRtX29kbS0+cE51bVR4Qnl0ZXNVbmljYXN0ID0gJkFkYXB0ZXItPnhtaXRwcml2LnR4X2J5dGVzOworCWRtX29kbS0+cE51bVJ4Qnl0ZXNVbmljYXN0ID0gJkFkYXB0ZXItPnJlY3Zwcml2LnJ4X2J5dGVzOworCWRtX29kbS0+cFdpcmVsZXNzTW9kZSA9ICZwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGU7CisJZG1fb2RtLT5wU2VjQ2hPZmZzZXQgPSAmaGFsX2RhdGEtPm5DdXI0ME1oelByaW1lU0M7CisJZG1fb2RtLT5wU2VjdXJpdHkgPSAodTggKikmQWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG07CisJZG1fb2RtLT5wQmFuZFdpZHRoID0gKHU4ICopJmhhbF9kYXRhLT5DdXJyZW50Q2hhbm5lbEJXOworCWRtX29kbS0+cENoYW5uZWwgPSAmaGFsX2RhdGEtPkN1cnJlbnRDaGFubmVsOworCWRtX29kbS0+cGJOZXRfY2xvc2VkID0gKGJvb2wgKikmQWRhcHRlci0+bmV0X2Nsb3NlZDsKKwlkbV9vZG0tPm1wX21vZGUgPSAmQWRhcHRlci0+cmVnaXN0cnlwcml2Lm1wX21vZGU7CisJZG1fb2RtLT5wYlNjYW5JblByb2Nlc3MgPSAoYm9vbCAqKSZwbWxtZXByaXYtPmJTY2FuSW5Qcm9jZXNzOworCWRtX29kbS0+cGJQb3dlclNhdmluZyA9IChib29sICopJnB3cmN0cmxwcml2LT5icG93ZXJfc2F2aW5nOworCWRtX29kbS0+QW50RGl2VHlwZSA9IGhhbF9kYXRhLT5UUnhBbnREaXZUeXBlOworCisJLyogIFR4IHBvd2VyIHRyYWNraW5nIEJCIHN3aW5nIHRhYmxlLiAqLworCS8qICBUaGUgYmFzZSBpbmRleCA9IDEyLiArKCgxMi1uKS8yKWRCIDEzfj8/ID0gZGVjcmVhc2UgdHggcHdyIGJ5IC0oKG4tMTIpLzIpZEIgKi8KKwlkbV9vZG0tPkJiU3dpbmdJZHhPZmRtID0gMTI7IC8qICBTZXQgZGVmYWx1dCB2YWx1ZSBhcyBpbmRleCAxMi4gKi8KKwlkbV9vZG0tPkJiU3dpbmdJZHhPZmRtQ3VycmVudCA9IDEyOworCWRtX29kbS0+QmJTd2luZ0ZsYWdPZmRtID0gZmFsc2U7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTlVNX1NUQTsgaSsrKQogCQlPRE1fQ21uSW5mb1B0ckFycmF5SG9vayhkbV9vZG0sIE9ETV9DTU5JTkZPX1NUQV9TVEFUVVMsIGksIE5VTEwpOwpAQCAtMTMwLDIzICsxMjYsMTkgQEAKIAogdm9pZCBydGw4MTg4ZV9Jbml0SGFsRG0oc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlzdHJ1Y3QgZG1fcHJpdgkqcGRtcHJpdiA9ICZoYWxfZGF0YS0+ZG1wcml2OwotCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpkbV9vZG0gPSAmKGhhbF9kYXRhLT5vZG1wcml2KTsKKwlzdHJ1Y3QgZG1fcHJpdgkqcGRtcHJpdiA9ICZBZGFwdGVyLT5IYWxEYXRhLT5kbXByaXY7CisJc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKmRtX29kbSA9ICYoQWRhcHRlci0+SGFsRGF0YS0+b2RtcHJpdik7CiAKIAlkbV9Jbml0R1BJT1NldHRpbmcoQWRhcHRlcik7CiAJcGRtcHJpdi0+RE1fVHlwZSA9IERNX1R5cGVfQnlEcml2ZXI7CiAJcGRtcHJpdi0+RE1GbGFnID0gRFlOQU1JQ19GVU5DX0RJU0FCTEU7CiAJVXBkYXRlX09ETV9Db21JbmZvXzg4RShBZGFwdGVyKTsKIAlPRE1fRE1Jbml0KGRtX29kbSk7Ci0JQWRhcHRlci0+Zml4X3JhdGUgPSAweEZGOwogfQogCi12b2lkIHJ0bDgxODhlX0hhbERtV2F0Y2hEb2coc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCit2b2lkIHJ0d19oYWxfZG1fd2F0Y2hkb2coc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7Ci0JYm9vbCBmd19wc19hd2FrZSA9IHRydWU7CiAJdTggaHdfaW5pdF9jb21wbGV0ZWQgPSBmYWxzZTsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9IE5VTEw7CiAJdTggYkxpbmtlZCA9IGZhbHNlOwogCkBAIC0xNTUsMTMgKzE0Nyw2IEBACiAJaWYgKCFod19pbml0X2NvbXBsZXRlZCkKIAkJZ290byBza2lwX2RtOwogCi0JcnR3X2hhbF9nZXRfaHdyZWcoQWRhcHRlciwgSFdfVkFSX0ZXTFBTX1JGX09OLCAodTggKikoJmZ3X3BzX2F3YWtlKSk7Ci0KLQkvKiAgRncgaXMgdW5kZXIgcDJwIHBvd2Vyc2F2aW5nIG1vZGUsIGRyaXZlciBzaG91bGQgc3RvcCBkeW5hbWljIG1lY2hhbmlzbS4gKi8KLQkvKiAgbW9kaWZlZCBieSB0aG9tYXMuIDIwMTEuMDYuMTEuICovCi0JaWYgKEFkYXB0ZXItPndkaW5mby5wMnBfcHNfbW9kZSkKLQkJZndfcHNfYXdha2UgPSBmYWxzZTsKLQogCS8qIE9ETSAqLwogCXBtbG1lcHJpdiA9ICZBZGFwdGVyLT5tbG1lcHJpdjsKIApAQCAtMTc1LDE5ICsxNjAsMTggQEAKIAkJCWJMaW5rZWQgPSB0cnVlOwogCX0KIAotCU9ETV9DbW5JbmZvVXBkYXRlKCZoYWxfZGF0YS0+b2RtcHJpdiwgT0RNX0NNTklORk9fTElOSywgYkxpbmtlZCk7Ci0JT0RNX0RNV2F0Y2hkb2coJmhhbF9kYXRhLT5vZG1wcml2KTsKKwlBZGFwdGVyLT5IYWxEYXRhLT5vZG1wcml2LmJMaW5rZWQgPSBiTGlua2VkOworCU9ETV9ETVdhdGNoZG9nKCZBZGFwdGVyLT5IYWxEYXRhLT5vZG1wcml2KTsKIHNraXBfZG06CiAJLyogIENoZWNrIEdQSU8gdG8gZGV0ZXJtaW5lIGN1cnJlbnQgUkYgb24vb2ZmIGFuZCBQYmMgc3RhdHVzLiAqLwogCS8qICBDaGVjayBIYXJkd2FyZSBSYWRpbyBPTi9PRkYgb3Igbm90ICovCiAJcmV0dXJuOwogfQogCi12b2lkIHJ0bDgxODhlX2luaXRfZG1fcHJpdihzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlcikKK3ZvaWQgcnR3X2hhbF9kbV9pbml0KHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0Jc3RydWN0IGRtX3ByaXYJKnBkbXByaXYgPSAmaGFsX2RhdGEtPmRtcHJpdjsKLQlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcG9kbXByaXYgPSAmaGFsX2RhdGEtPm9kbXByaXY7CisJc3RydWN0IGRtX3ByaXYJKnBkbXByaXYgPSAmQWRhcHRlci0+SGFsRGF0YS0+ZG1wcml2OworCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpwb2RtcHJpdiA9ICZBZGFwdGVyLT5IYWxEYXRhLT5vZG1wcml2OwogCiAJbWVtc2V0KHBkbXByaXYsIDAsIHNpemVvZihzdHJ1Y3QgZG1fcHJpdikpOwogCUluaXRfT0RNX0NvbUluZm9fODhFKEFkYXB0ZXIpOwpAQCAtMTk2LDExICsxODAsOSBAQAogCiAvKiAgQWRkIG5ldyBmdW5jdGlvbiB0byByZXNldCB0aGUgc3RhdGUgb2YgYW50ZW5uYSBkaXZlcnNpdHkgYmVmb3JlIGxpbmsuICovCiAvKiAgQ29tcGFyZSBSU1NJIGZvciBkZWNpZGluZyBhbnRlbm5hICovCi12b2lkIEFudERpdkNvbXBhcmU4MTg4RShzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciwgc3RydWN0IHdsYW5fYnNzaWRfZXggKmRzdCwgc3RydWN0IHdsYW5fYnNzaWRfZXggKnNyYykKK3ZvaWQgcnR3X2hhbF9hbnRkaXZfcnNzaV9jb21wYXJlZChzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciwgc3RydWN0IHdsYW5fYnNzaWRfZXggKmRzdCwgc3RydWN0IHdsYW5fYnNzaWRfZXggKnNyYykKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCi0JaWYgKDAgIT0gaGFsX2RhdGEtPkFudERpdkNmZykgeworCWlmICgwICE9IEFkYXB0ZXItPkhhbERhdGEtPkFudERpdkNmZykgewogCQkvKiBzZWxlY3Qgb3B0aW11bV9hbnRlbm5hIGZvciBiZWZvcmUgbGlua2VkID0+Rm9yIGFudGVubmEgZGl2ZXJzaXR5ICovCiAJCWlmIChkc3QtPlJzc2kgPj0gIHNyYy0+UnNzaSkgey8qIGtlZXAgb3JnIHBhcmFtZXRlciAqLwogCQkJc3JjLT5Sc3NpID0gZHN0LT5Sc3NpOwpAQCAtMjEwLDE1ICsxOTIsMTQgQEAKIH0KIAogLyogIEFkZCBuZXcgZnVuY3Rpb24gdG8gcmVzZXQgdGhlIHN0YXRlIG9mIGFudGVubmEgZGl2ZXJzaXR5IGJlZm9yZSBsaW5rLiAqLwotdTggQW50RGl2QmVmb3JlTGluazgxODhFKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQordTggcnR3X2hhbF9hbnRkaXZfYmVmb3JlX2xpbmtlZChzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlcikKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpkbV9vZG0gPSAmaGFsX2RhdGEtPm9kbXByaXY7CisJc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKmRtX29kbSA9ICZBZGFwdGVyLT5IYWxEYXRhLT5vZG1wcml2OwogCXN0cnVjdCBzd19hbnRfc3dpdGNoICpkbV9zd2F0X3RibCA9ICZkbV9vZG0tPkRNX1NXQVRfVGFibGU7CiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJihBZGFwdGVyLT5tbG1lcHJpdik7CiAKIAkvKiAgQ29uZGl0aW9uIHRoYXQgZG9lcyBub3QgbmVlZCB0byB1c2UgYW50ZW5uYSBkaXZlcnNpdHkuICovCi0JaWYgKGhhbF9kYXRhLT5BbnREaXZDZmcgPT0gMCkKKwlpZiAoQWRhcHRlci0+SGFsRGF0YS0+QW50RGl2Q2ZnID09IDApCiAJCXJldHVybiBmYWxzZTsKIAogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9oYWxfaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfaGFsX2luaXQuYwppbmRleCAwYjQ0NGZkLi4zODViYzJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9oYWxfaW5pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2hhbF9pbml0LmMKQEAgLTEwOCwyOCArMTA4LDI0IEBACiAKIHZvaWQgcnRsODE4OGVfSW5pdGlhbGl6ZUZpcm13YXJlVmFycyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KIAkvKiAgSW5pdCBGdyBMUFMgcmVsYXRlZC4gKi8KIAlwYWRhcHRlci0+cHdyY3RybHByaXYuYkZ3Q3VycmVudEluUFNNb2RlID0gZmFsc2U7CiAKIAkvKiAgSW5pdCBIMkMgY291bnRlci4gYnkgdHlubGkuIDIwMDkuMTIuMDkuICovCi0JcEhhbERhdGEtPkxhc3RITUVCb3hOdW0gPSAwOworCXBhZGFwdGVyLT5IYWxEYXRhLT5MYXN0SE1FQm94TnVtID0gMDsKIH0KIAotc3RhdGljIHZvaWQgcnRsODE4OGVfZnJlZV9oYWxfZGF0YShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCit2b2lkIHJ0d19oYWxfZnJlZV9kYXRhKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKIHsKIAlrZnJlZShwYWRhcHRlci0+SGFsRGF0YSk7CiAJcGFkYXB0ZXItPkhhbERhdGEgPSBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBSZWFkQ2hpcFZlcnNpb244MTg4RShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCit2b2lkIHJ0d19oYWxfcmVhZF9jaGlwX3ZlcnNpb24oc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQogewogCXUzMgkJCQl2YWx1ZTMyOwogCXN0cnVjdCBIQUxfVkVSU0lPTgkJQ2hpcFZlcnNpb247Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpwSGFsRGF0YTsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKnBIYWxEYXRhID0gcGFkYXB0ZXItPkhhbERhdGE7CiAKIAl2YWx1ZTMyID0gdXNiX3JlYWQzMihwYWRhcHRlciwgUkVHX1NZU19DRkcpOwogCUNoaXBWZXJzaW9uLkNoaXBUeXBlID0gKCh2YWx1ZTMyICYgUlRMX0lEKSA/IFRFU1RfQ0hJUCA6IE5PUk1BTF9DSElQKTsKQEAgLTEzOSwxNiArMTM1LDEzIEBACiAJZHVtcF9jaGlwX2luZm8oQ2hpcFZlcnNpb24pOwogCiAJcEhhbERhdGEtPlZlcnNpb25JRCA9IENoaXBWZXJzaW9uOwotCXBIYWxEYXRhLT5yZl90eXBlID0gUkZfMVQxUjsKIAlwSGFsRGF0YS0+TnVtVG90YWxSRlBhdGggPSAxOwotCi0JTVNHXzg4RSgiUkZfVHlwZSBpcyAleCEhXG4iLCBwSGFsRGF0YS0+cmZfdHlwZSk7CiB9CiAKLXN0YXRpYyB2b2lkIHJ0bDgxODhlX1NldEhhbE9ETVZhcihzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciwgZW51bSBoYWxfb2RtX3ZhcmlhYmxlIGVWYXJpYWJsZSwgdm9pZCAqcFZhbHVlMSwgYm9vbCBiU2V0KQordm9pZCBydHdfaGFsX3NldF9vZG1fdmFyKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyLCBlbnVtIGhhbF9vZG1fdmFyaWFibGUgZVZhcmlhYmxlLCB2b2lkICpwVmFsdWUxLCBib29sIGJTZXQpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcG9kbXByaXYgPSAmcEhhbERhdGEtPm9kbXByaXY7CisJc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBvZG1wcml2ID0gJkFkYXB0ZXItPkhhbERhdGEtPm9kbXByaXY7CisKIAlzd2l0Y2ggKGVWYXJpYWJsZSkgewogCWNhc2UgSEFMX09ETV9TVEFfSU5GTzoKIAkJewpAQCAtMTY1LDE3ICsxNTgsMTcgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIEhBTF9PRE1fUDJQX1NUQVRFOgotCQkJT0RNX0NtbkluZm9VcGRhdGUocG9kbXByaXYsIE9ETV9DTU5JTkZPX1dJRklfRElSRUNULCBiU2V0KTsKKwkJcG9kbXByaXYtPmJXSUZJX0RpcmVjdCA9IGJTZXQ7CiAJCWJyZWFrOwogCWNhc2UgSEFMX09ETV9XSUZJX0RJU1BMQVlfU1RBVEU6Ci0JCQlPRE1fQ21uSW5mb1VwZGF0ZShwb2RtcHJpdiwgT0RNX0NNTklORk9fV0lGSV9ESVNQTEFZLCBiU2V0KTsKKwkJcG9kbXByaXYtPmJXSUZJX0Rpc3BsYXkgPSBiU2V0OwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGhhbF9ub3RjaF9maWx0ZXJfODE4OGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGJvb2wgZW5hYmxlKQordm9pZCBydHdfaGFsX25vdGNoX2ZpbHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgYm9vbCBlbmFibGUpCiB7CiAJaWYgKGVuYWJsZSkgewogCQlEQkdfODhFKCJFbmFibGUgbm90Y2ggZmlsdGVyXG4iKTsKQEAgLTE4NSwzMiArMTc4LDYgQEAKIAkJdXNiX3dyaXRlOChhZGFwdGVyLCByT0ZETTBfUnhEU1ArMSwgdXNiX3JlYWQ4KGFkYXB0ZXIsIHJPRkRNMF9SeERTUCsxKSAmIH5CSVQoMSkpOwogCX0KIH0KLXZvaWQgcnRsODE4OGVfc2V0X2hhbF9vcHMoc3RydWN0IGhhbF9vcHMgKnBIYWxGdW5jKQotewotCXBIYWxGdW5jLT5mcmVlX2hhbF9kYXRhID0gJnJ0bDgxODhlX2ZyZWVfaGFsX2RhdGE7Ci0KLQlwSGFsRnVuYy0+ZG1faW5pdCA9ICZydGw4MTg4ZV9pbml0X2RtX3ByaXY7Ci0KLQlwSGFsRnVuYy0+cmVhZF9jaGlwX3ZlcnNpb24gPSAmUmVhZENoaXBWZXJzaW9uODE4OEU7Ci0KLQlwSGFsRnVuYy0+c2V0X2J3bW9kZV9oYW5kbGVyID0gJnBoeV9zZXRfYndfbW9kZTsKLQlwSGFsRnVuYy0+c2V0X2NoYW5uZWxfaGFuZGxlciA9ICZwaHlfc3dfY2hubDsKLQotCXBIYWxGdW5jLT5oYWxfZG1fd2F0Y2hkb2cgPSAmcnRsODE4OGVfSGFsRG1XYXRjaERvZzsKLQotCXBIYWxGdW5jLT5BZGRfUmF0ZUFUaWQgPSAmcnRsODE4OGVfQWRkX1JhdGVBVGlkOwotCi0JcEhhbEZ1bmMtPkFudERpdkJlZm9yZUxpbmtIYW5kbGVyID0gJkFudERpdkJlZm9yZUxpbms4MTg4RTsKLQlwSGFsRnVuYy0+QW50RGl2Q29tcGFyZUhhbmRsZXIgPSAmQW50RGl2Q29tcGFyZTgxODhFOwotCXBIYWxGdW5jLT5yZWFkX3JmcmVnID0gJnBoeV9xdWVyeV9yZl9yZWc7Ci0KLQlwSGFsRnVuYy0+c3Jlc2V0X2luaXRfdmFsdWUgPSAmc3Jlc2V0X2luaXRfdmFsdWU7Ci0JcEhhbEZ1bmMtPnNyZXNldF9nZXRfd2lmaV9zdGF0dXMgID0gJnNyZXNldF9nZXRfd2lmaV9zdGF0dXM7Ci0KLQlwSGFsRnVuYy0+U2V0SGFsT0RNVmFySGFuZGxlciA9ICZydGw4MTg4ZV9TZXRIYWxPRE1WYXI7Ci0KLQlwSGFsRnVuYy0+aGFsX25vdGNoX2ZpbHRlciA9ICZoYWxfbm90Y2hfZmlsdGVyXzgxODhlOwotfQogCiAvKiAgKi8KIC8qICAqLwpAQCAtNTAxLDcgKzQ2OCw3IEBACiAKIHZvaWQgSGFsX1JlYWRUeFBvd2VySW5mbzg4RShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpQUk9NQ29udGVudCwgYm9vbCBBdXRvTG9hZEZhaWwpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpwSGFsRGF0YSA9IHBhZGFwdGVyLT5IYWxEYXRhOwogCXN0cnVjdCB0eHBvd2VyaW5mbzI0ZyBwd3JJbmZvMjRHOwogCXU4IHJmUGF0aCwgY2gsIGdyb3VwOwogCXU4IGJJbjI0RywgVHhDb3VudDsKQEAgLTU1Myw3ICs1MjAsNyBAQAogCiB2b2lkIEhhbF9FZnVzZVBhcnNlWHRhbF84MTg4RShzdHJ1Y3QgYWRhcHRlciAqcEFkYXB0ZXIsIHU4ICpod2luZm8sIGJvb2wgQXV0b0xvYWRGYWlsKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocEFkYXB0ZXIpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqcEhhbERhdGEgPSBwQWRhcHRlci0+SGFsRGF0YTsKIAogCWlmICghQXV0b0xvYWRGYWlsKSB7CiAJCXBIYWxEYXRhLT5DcnlzdGFsQ2FwID0gaHdpbmZvW0VFUFJPTV9YVEFMXzg4RV07CkBAIC01NjcsNyArNTM0LDcgQEAKIAogdm9pZCBIYWxfRWZ1c2VQYXJzZUJvYXJkVHlwZTg4RShzdHJ1Y3QgYWRhcHRlciAqcEFkYXB0ZXIsIHU4ICpod2luZm8sIGJvb2wgQXV0b0xvYWRGYWlsKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocEFkYXB0ZXIpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqcEhhbERhdGEgPSBwQWRhcHRlci0+SGFsRGF0YTsKIAogCWlmICghQXV0b0xvYWRGYWlsKQogCQlwSGFsRGF0YS0+Qm9hcmRUeXBlID0gKGh3aW5mb1tFRVBST01fUkZfQk9BUkRfT1BUSU9OXzg4RV0KQEAgLTU3OSw3ICs1NDYsNyBAQAogCiB2b2lkIEhhbF9FZnVzZVBhcnNlRUVQUk9NVmVyODhFKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTggKmh3aW5mbywgYm9vbCBBdXRvTG9hZEZhaWwpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpwSGFsRGF0YSA9IHBhZGFwdGVyLT5IYWxEYXRhOwogCiAJaWYgKCFBdXRvTG9hZEZhaWwpIHsKIAkJcEhhbERhdGEtPkVFUFJPTVZlcnNpb24gPSBod2luZm9bRUVQUk9NX1ZFUlNJT05fODhFXTsKQEAgLTYwNiw3ICs1NzMsNyBAQAogCiB2b2lkIEhhbF9FZnVzZVBhcnNlQ3VzdG9tZXJJRDg4RShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpod2luZm8sIGJvb2wgQXV0b0xvYWRGYWlsKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqcEhhbERhdGEgPSBwYWRhcHRlci0+SGFsRGF0YTsKIAogCWlmICghQXV0b0xvYWRGYWlsKSB7CiAJCXBIYWxEYXRhLT5FRVBST01DdXN0b21lcklEID0gaHdpbmZvW0VFUFJPTV9DVVNUT01FUklEXzg4RV07CkBAIC02MTksNyArNTg2LDcgQEAKIAogdm9pZCBIYWxfUmVhZEFudGVubmFEaXZlcnNpdHk4OEUoc3RydWN0IGFkYXB0ZXIgKnBBZGFwdGVyLCB1OCAqUFJPTUNvbnRlbnQsIGJvb2wgQXV0b0xvYWRGYWlsKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocEFkYXB0ZXIpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqcEhhbERhdGEgPSBwQWRhcHRlci0+SGFsRGF0YTsKIAlzdHJ1Y3QgcmVnaXN0cnlfcHJpdgkqcmVnaXN0cnlfcGFyID0gJnBBZGFwdGVyLT5yZWdpc3RyeXByaXY7CiAKIAlpZiAoIUF1dG9Mb2FkRmFpbCkgewpAQCAtNjUyLDcgKzYxOSw3IEBACiAKIHZvaWQgSGFsX1JlYWRUaGVybWFsTWV0ZXJfODhFKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyLCB1OCAqUFJPTUNvbnRlbnQsIGJvb2wgQXV0b2xvYWRGYWlsKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpwSGFsRGF0YSA9IEFkYXB0ZXItPkhhbERhdGE7CiAKIAkvKiAgVGhlcm1hbE1ldGVyIGZyb20gRUVQUk9NICovCiAJaWYgKCFBdXRvbG9hZEZhaWwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9yeGRlc2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX3J4ZGVzYy5jCmluZGV4IGYxMTBjOTYuLmZhMmNmZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX3J4ZGVzYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX3J4ZGVzYy5jCkBAIC01NywxMCArNTcsOSBAQAogCXNpZ25hbF9zdGF0LT5hdmdfdmFsID0gc2lnbmFsX3N0YXQtPnRvdGFsX3ZhbCAvIHNpZ25hbF9zdGF0LT50b3RhbF9udW07CiB9CiAKLXZvaWQgcnRsODE4OGVfcHJvY2Vzc19waHlfaW5mbyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHZvaWQgKnByZnJhbWUpCit2b2lkIHJ0bDgxODhlX3Byb2Nlc3NfcGh5X2luZm8oc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAorCQkgICAgICAgICAgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSkKIHsKLQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSA9IHByZnJhbWU7Ci0KIAkvKiAgQ2hlY2sgUlNTSSAqLwogCXByb2Nlc3NfcnNzaShwYWRhcHRlciwgcHJlY3ZmcmFtZSk7CiAJLyogIENoZWNrIEVWTSAqLwpAQCAtMTQwLDcgKzEzOSw2IEBACiB7CiAJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gcHJlY3ZmcmFtZS0+YWRhcHRlcjsKIAlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmVjdmZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7CiAJc3RydWN0IG9kbV9waHlfc3RhdHVzX2luZm8gKnBQSFlJbmZvICA9IChzdHJ1Y3Qgb2RtX3BoeV9zdGF0dXNfaW5mbyAqKSgmcGF0dHJpYi0+cGh5X2luZm8pOwogCXU4ICp3bGFuaGRyOwogCXN0cnVjdCBvZG1fcGVyX3BrdF9pbmZvCXBrdF9pbmZvOwpAQCAtMTgxLDcgKzE3OSw4IEBACiAJCXBrdF9pbmZvLlN0YXRpb25JRCA9IHBzdGEtPm1hY19pZDsKIAlwa3RfaW5mby5SYXRlID0gcGF0dHJpYi0+bWNzX3JhdGU7CiAKLQlPRE1fUGh5U3RhdHVzUXVlcnkoJnBIYWxEYXRhLT5vZG1wcml2LCBwUEhZSW5mbywgKHU4ICopcHBoeV9zdGF0dXMsICYocGt0X2luZm8pKTsKKwlPRE1fUGh5U3RhdHVzUXVlcnkoJnBhZGFwdGVyLT5IYWxEYXRhLT5vZG1wcml2LCBwUEhZSW5mbywKKwkJCSAgICh1OCAqKXBwaHlfc3RhdHVzLCAmKHBrdF9pbmZvKSk7CiAKIAlwcmVjdmZyYW1lLT5wc3RhID0gTlVMTDsKIAlpZiAocGt0X2luZm8uYlBhY2tldE1hdGNoQlNTSUQgJiYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhldV9sZWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhldV9sZWQuYwppbmRleCBkOWU2NzdlLi43ODA2NjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZXVfbGVkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGV1X2xlZC5jCkBAIC00MCwxNCArNDAsMTMgQEAKIHZvaWQgU3dMZWRPZmYoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgTEVEXzg3MXggKnBMZWQpCiB7CiAJdTgJTGVkQ2ZnOwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwogCiAJaWYgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkIHx8IHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCkKIAkJZ290byBleGl0OwogCiAJTGVkQ2ZnID0gdXNiX3JlYWQ4KHBhZGFwdGVyLCBSRUdfTEVEQ0ZHMik7LyogMHg0RSAqLwogCi0JaWYgKHBIYWxEYXRhLT5iTGVkT3BlbkRyYWluKSB7CisJaWYgKHBhZGFwdGVyLT5IYWxEYXRhLT5iTGVkT3BlbkRyYWluKSB7CiAJCQkvKiAgT3Blbi1kcmFpbiBhcnJhbmdlbWVudCBmb3IgY29udHJvbGxpbmcgdGhlIExFRCkgKi8KIAkJTGVkQ2ZnICY9IDB4OTA7IC8qICBTZXQgdG8gc29mdHdhcmUgY29udHJvbC4gKi8KIAkJdXNiX3dyaXRlOChwYWRhcHRlciwgUkVHX0xFRENGRzIsIChMZWRDZmcgfCBCSVQoMykpKTsKQEAgLTY2LDIxICs2NSwyMCBAQAogCiAvKglEZXNjcmlwdGlvbjogKi8KIC8qCQlJbml0aWFsaXplIGFsbCBMRURfODcxeCBvYmplY3RzLiAqLwotdm9pZCBydGw4MTg4ZXVfSW5pdFN3TGVkcyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCit2b2lkIHJ0d19oYWxfc3dfbGVkX2luaXQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQogewogCXN0cnVjdCBsZWRfcHJpdiAqcGxlZHByaXYgPSAmKHBhZGFwdGVyLT5sZWRwcml2KTsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgICAqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7CiAKIAlwbGVkcHJpdi0+YlJlZ1VzZUxlZCA9IHRydWU7CiAJcGxlZHByaXYtPkxlZENvbnRyb2xIYW5kbGVyID0gTGVkQ29udHJvbDgxODhldTsKLQloYWxkYXRhLT5iTGVkT3BlbkRyYWluID0gdHJ1ZTsKKwlwYWRhcHRlci0+SGFsRGF0YS0+YkxlZE9wZW5EcmFpbiA9IHRydWU7CiAKIAlJbml0TGVkODcxeChwYWRhcHRlciwgJihwbGVkcHJpdi0+U3dMZWQwKSk7CiB9CiAKIC8qCURlc2NyaXB0aW9uOiAqLwogLyoJCURlSW5pdGlhbGl6ZSBhbGwgTEVEXzgxOXhVc2Igb2JqZWN0cy4gKi8KLXZvaWQgcnRsODE4OGV1X0RlSW5pdFN3TGVkcyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCit2b2lkIHJ0d19oYWxfc3dfbGVkX2RlaW5pdChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCiB7CiAJc3RydWN0IGxlZF9wcml2CSpsZWRwcml2ID0gJihwYWRhcHRlci0+bGVkcHJpdik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhldV9yZWN2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZXVfcmVjdi5jCmluZGV4IDI1NWQ2ZjIuLmQwNDk1YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhldV9yZWN2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGV1X3JlY3YuYwpAQCAtMTMsNiArMTMsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjZGVmaW5lIF9SVEw4MTg4RVVfUkVDVl9DXworI2luY2x1ZGUgPGxpbnV4L2ttZW1sZWFrLmg+CiAjaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgogI2luY2x1ZGUgPGRydl90eXBlcy5oPgogI2luY2x1ZGUgPHJlY3Zfb3NkZXAuaD4KQEAgLTIzLDcgKzI0LDcgQEAKIAogI2luY2x1ZGUgPHJ0bDgxODhlX2hhbC5oPgogCi1pbnQJcnRsODE4OGV1X2luaXRfcmVjdl9wcml2KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKK2ludAlydHdfaGFsX2luaXRfcmVjdl9wcml2KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKIHsKIAlzdHJ1Y3QgcmVjdl9wcml2CSpwcmVjdnByaXYgPSAmcGFkYXB0ZXItPnJlY3Zwcml2OwogCWludAlpLCByZXMgPSBfU1VDQ0VTUzsKQEAgLTcyLDYgKzczLDcgQEAKIAkJCQkJTUFYX1JFQ1ZCVUZfU1ogKyBSRUNWQlVGRl9BTElHTl9TWiwKIAkJCQkJR0ZQX0tFUk5FTCk7CiAJCQlpZiAocHNrYikgeworCQkJCWttZW1sZWFrX25vdF9sZWFrKHBza2IpOwogCQkJCXBza2ItPmRldiA9IHBhZGFwdGVyLT5wbmV0ZGV2OwogCQkJCXRtcGFkZHIgPSAoc2l6ZV90KXBza2ItPmRhdGE7CiAJCQkJYWxpZ25tID0gdG1wYWRkciAmIChSRUNWQlVGRl9BTElHTl9TWi0xKTsKQEAgLTg3LDcgKzg5LDcgQEAKIAlyZXR1cm4gcmVzOwogfQogCi12b2lkIHJ0bDgxODhldV9mcmVlX3JlY3ZfcHJpdihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCit2b2lkIHJ0d19oYWxfZnJlZV9yZWN2X3ByaXYoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQogewogCWludAlpOwogCXN0cnVjdCByZWN2X2J1ZgkqcHJlY3ZidWY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZXVfeG1pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGV1X3htaXQuYwppbmRleCBlYzIxZDhjLi44NTY1MGIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZXVfeG1pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhldV94bWl0LmMKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDx1c2Jfb3BzX2xpbnV4Lmg+CiAjaW5jbHVkZSA8cnRsODE4OGVfaGFsLmg+CiAKLXMzMglydGw4MTg4ZXVfaW5pdF94bWl0X3ByaXYoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQorczMyIHJ0d19oYWxfaW5pdF94bWl0X3ByaXYoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQogewogCXN0cnVjdCB4bWl0X3ByaXYJKnB4bWl0cHJpdiA9ICZhZGFwdC0+eG1pdHByaXY7CiAKQEAgLTMzLDExICszMyw3IEBACiAKIHN0YXRpYyB1OCB1cmJfemVyb19wYWNrZXRfY2hrKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgaW50IHN6KQogewotCXU4IHNldF90eF9kZXNjX29mZnNldDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKmhhbGRhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwotCXNldF90eF9kZXNjX29mZnNldCA9ICgoKHN6ICsgVFhERVNDX1NJWkUpICUgIGhhbGRhdGEtPlVzYkJ1bGtPdXRTaXplKSA9PSAwKSA/IDEgOiAwOwotCi0JcmV0dXJuIHNldF90eF9kZXNjX29mZnNldDsKKwlyZXR1cm4gISgoc3ogKyBUWERFU0NfU0laRSkgJSBhZGFwdC0+SGFsRGF0YS0+VXNiQnVsa091dFNpemUpOwogfQogCiBzdGF0aWMgdm9pZCBydGw4MTg4ZXVfY2FsX3R4ZGVzY19jaGtzdW0oc3RydWN0IHR4X2Rlc2MJKnB0eGRlc2MpCkBAIC0xNzUsNyArMTcxLDcgQEAKIAl1OCBkYXRhX3JhdGUsIHB3cl9zdGF0dXMsIG9mZnNldDsKIAlzdHJ1Y3QgYWRhcHRlcgkJKmFkYXB0ID0gcHhtaXRmcmFtZS0+cGFkYXB0ZXI7CiAJc3RydWN0IHBrdF9hdHRyaWIJKnBhdHRyaWIgPSAmcHhtaXRmcmFtZS0+YXR0cmliOwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CisJc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKm9kbXByaXYgPSAmYWRhcHQtPkhhbERhdGEtPm9kbXByaXY7CiAJc3RydWN0IHR4X2Rlc2MJKnB0eGRlc2MgPSAoc3RydWN0IHR4X2Rlc2MgKilwbWVtOwogCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dCA9ICZhZGFwdC0+bWxtZWV4dHByaXY7CiAJc3RydWN0IG1sbWVfZXh0X2luZm8JKnBtbG1laW5mbyA9ICYocG1sbWVleHQtPm1sbWV4dF9pbmZvKTsKQEAgLTI1OSwxMiArMjU1LDEyIEBACiAJCQlwdHhkZXNjLT50eGR3NSB8PSBjcHVfdG9fbGUzMigweDAwMDFmZjAwKTsvKiBEQVRBL1JUUyAgUmF0ZSBGQiBMTVQgKi8KIAogCQkJaWYgKHBhdHRyaWItPmh0X2VuKSB7Ci0JCQkJaWYgKE9ETV9SQV9HZXRTaG9ydEdJXzgxODhFKCZoYWxkYXRhLT5vZG1wcml2LCBwYXR0cmliLT5tYWNfaWQpKQorCQkJCWlmIChPRE1fUkFfR2V0U2hvcnRHSV84MTg4RShvZG1wcml2LCBwYXR0cmliLT5tYWNfaWQpKQogCQkJCQlwdHhkZXNjLT50eGR3NSB8PSBjcHVfdG9fbGUzMihTR0kpOy8qIFNHSSAqLwogCQkJfQotCQkJZGF0YV9yYXRlID0gT0RNX1JBX0dldERlY2lzaW9uUmF0ZV84MTg4RSgmaGFsZGF0YS0+b2RtcHJpdiwgcGF0dHJpYi0+bWFjX2lkKTsKKwkJCWRhdGFfcmF0ZSA9IE9ETV9SQV9HZXREZWNpc2lvblJhdGVfODE4OEUob2RtcHJpdiwgcGF0dHJpYi0+bWFjX2lkKTsKIAkJCXB0eGRlc2MtPnR4ZHc1IHw9IGNwdV90b19sZTMyKGRhdGFfcmF0ZSAmIDB4M0YpOwotCQkJcHdyX3N0YXR1cyA9IE9ETV9SQV9HZXRId1B3clN0YXR1c184MTg4RSgmaGFsZGF0YS0+b2RtcHJpdiwgcGF0dHJpYi0+bWFjX2lkKTsKKwkJCXB3cl9zdGF0dXMgPSBPRE1fUkFfR2V0SHdQd3JTdGF0dXNfODE4OEUob2RtcHJpdiwgcGF0dHJpYi0+bWFjX2lkKTsKIAkJCXB0eGRlc2MtPnR4ZHc0IHw9IGNwdV90b19sZTMyKChwd3Jfc3RhdHVzICYgMHg3KSA8PCBQV1JfU1RBVFVTX1NIVCk7CiAJCX0gZWxzZSB7CiAJCQkvKiAgRUFQIGRhdGEgcGFja2V0IGFuZCBBUlAgcGFja2V0IGFuZCBESENQLiAqLwpAQCAtMzMyLDggKzMyOCw3IEBACiAJCXB0eGRlc2MtPnR4ZHc0IHw9IGNwdV90b19sZTMyKEhXX1NTTik7CS8qICBIdyBzZXQgc2VxdWVuY2UgbnVtYmVyICovCiAJfQogCi0JcnRsODhldV9kbV9zZXRfdHhfYW50X2J5X3R4X2luZm8oJmhhbGRhdGEtPm9kbXByaXYsIHBtZW0sCi0JCQkJCSBwYXR0cmliLT5tYWNfaWQpOworCXJ0bDg4ZXVfZG1fc2V0X3R4X2FudF9ieV90eF9pbmZvKG9kbXByaXYsIHBtZW0sIHBhdHRyaWItPm1hY19pZCk7CiAKIAlydGw4MTg4ZXVfY2FsX3R4ZGVzY19jaGtzdW0ocHR4ZGVzYyk7CiAJX2RiZ19kdW1wX3R4X2luZm8oYWRhcHQsIHB4bWl0ZnJhbWUtPmZyYW1lX3RhZywgcHR4ZGVzYyk7CkBAIC0zODcsNyArMzgyLDcgQEAKIAkJfQogCQlmZl9od2FkZHIgPSBydHdfZ2V0X2ZmX2h3YWRkcihweG1pdGZyYW1lKTsKIAotCQlpbm5lcl9yZXQgPSB1c2Jfd3JpdGVfcG9ydChhZGFwdCwgZmZfaHdhZGRyLCB3X3N6LCAodW5zaWduZWQgY2hhciAqKXB4bWl0YnVmKTsKKwkJaW5uZXJfcmV0ID0gdXNiX3dyaXRlX3BvcnQoYWRhcHQsIGZmX2h3YWRkciwgd19zeiwgcHhtaXRidWYpOwogCiAJCXJ0d19jb3VudF90eF9zdGF0cyhhZGFwdCwgcHhtaXRmcmFtZSwgc3opOwogCkBAIC00MjQsMTEgKzQxOSwxMSBAQAogCXJldHVybiBsZW47CiB9CiAKLXMzMiBydGw4MTg4ZXVfeG1pdGZyYW1lX2NvbXBsZXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2LCBzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmKQorczMyIHJ0bDgxODhldV94bWl0ZnJhbWVfY29tcGxldGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKIAlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSA9IE5VTEw7CiAJc3RydWN0IHhtaXRfZnJhbWUgKnBmaXJzdGZyYW1lID0gTlVMTDsKKwlzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmOwogCiAJLyogIGFnZ3JlZ2F0ZSB2YXJpYWJsZSAqLwogCXN0cnVjdCBod194bWl0ICpwaHd4bWl0OwpAQCAtNDQxLDcgKzQzNiw3IEBACiAJdTMyIHBidWZfdGFpbDsJLyogIGxhc3QgcGt0IHRhaWwgKi8KIAl1MzIgbGVuOwkvKiAgcGFja2V0IGxlbmd0aCwgZXhjZXB0IFRYREVTQ19TSVpFIGFuZCBQS1RfT0ZGU0VUICovCiAKLQl1MzIgYnVsa3NpemUgPSBoYWxkYXRhLT5Vc2JCdWxrT3V0U2l6ZTsKKwl1MzIgYnVsa3NpemUgPSBhZGFwdC0+SGFsRGF0YS0+VXNiQnVsa091dFNpemU7CiAJdTggZGVzY19jbnQ7CiAJdTMyIGJ1bGtwdHI7CiAKQEAgLTQ1MCwxMiArNDQ1LDkgQEAKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODE5MmNfeG1pdF9jXywgX2Rydl9pbmZvXywgKCIreG1pdGZyYW1lX2NvbXBsZXRlXG4iKSk7CiAKLQkvKiAgY2hlY2sgeG1pdGJ1ZmZlciBpcyBvayAqLwotCWlmIChweG1pdGJ1ZiA9PSBOVUxMKSB7Ci0JCXB4bWl0YnVmID0gcnR3X2FsbG9jX3htaXRidWYocHhtaXRwcml2KTsKLQkJaWYgKHB4bWl0YnVmID09IE5VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQorCXB4bWl0YnVmID0gcnR3X2FsbG9jX3htaXRidWYocHhtaXRwcml2KTsKKwlpZiAocHhtaXRidWYgPT0gTlVMTCkKKwkJcmV0dXJuIGZhbHNlOwogCiAJLyogMyAxLiBwaWNrIHVwIGZpcnN0IGZyYW1lICovCiAJcnR3X2ZyZWVfeG1pdGZyYW1lKHB4bWl0cHJpdiwgcHhtaXRmcmFtZSk7CkBAIC01NjUsNyArNTU3LDcgQEAKIAogCQlpZiAocGJ1ZiA8IGJ1bGtwdHIpIHsKIAkJCWRlc2NfY250Kys7Ci0JCQlpZiAoZGVzY19jbnQgPT0gaGFsZGF0YS0+VXNiVHhBZ2dEZXNjTnVtKQorCQkJaWYgKGRlc2NfY250ID09IGFkYXB0LT5IYWxEYXRhLT5Vc2JUeEFnZ0Rlc2NOdW0pCiAJCQkJYnJlYWs7CiAJCX0gZWxzZSB7CiAJCQlkZXNjX2NudCA9IDA7CkBAIC01OTQsNyArNTg2LDcgQEAKIAogCS8qIDMgNC4gd3JpdGUgeG1pdCBidWZmZXIgdG8gVVNCIEZJRk8gKi8KIAlmZl9od2FkZHIgPSBydHdfZ2V0X2ZmX2h3YWRkcihwZmlyc3RmcmFtZSk7Ci0JdXNiX3dyaXRlX3BvcnQoYWRhcHQsIGZmX2h3YWRkciwgcGJ1Zl90YWlsLCAodTggKilweG1pdGJ1Zik7CisJdXNiX3dyaXRlX3BvcnQoYWRhcHQsIGZmX2h3YWRkciwgcGJ1Zl90YWlsLCBweG1pdGJ1Zik7CiAKIAkvKiAzIDUuIHVwZGF0ZSBzdGF0aXNpdGMgKi8KIAlwYnVmX3RhaWwgLT0gKHBmaXJzdGZyYW1lLT5hZ2dfbnVtICogVFhERVNDX1NJWkUpOwpAQCAtNjA3LDI0ICs1OTksMTIgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHMzMiB4bWl0ZnJhbWVfZGlyZWN0KHN0cnVjdCBhZGFwdGVyICphZGFwdCwgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCi17Ci0JczMyIHJlczsKLQotCXJlcyA9IHJ0d194bWl0ZnJhbWVfY29hbGVzY2UoYWRhcHQsIHB4bWl0ZnJhbWUtPnBrdCwgcHhtaXRmcmFtZSk7Ci0JaWYgKHJlcyA9PSBfU1VDQ0VTUykKLQkJcnR3X2R1bXBfeGZyYW1lKGFkYXB0LCBweG1pdGZyYW1lKTsKLQllbHNlCi0JCURCR184OEUoIj09PiAlcyB4bWl0ZnJhbWVfY29hbHNlY2UgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIHJlczsKLX0KLQogLyoKICAqIFJldHVybgogICoJdHJ1ZQlkdW1wIHBhY2tldCBkaXJlY3RseQogICoJZmFsc2UJZW5xdWV1ZSBwYWNrZXQKICAqLwotc3RhdGljIHMzMiBwcmVfeG1pdGZyYW1lKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCitzMzIgcnR3X2hhbF94bWl0KHN0cnVjdCBhZGFwdGVyICphZGFwdCwgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCiB7CiAJczMyIHJlczsKIAlzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmID0gTlVMTDsKQEAgLTY1MCw3ICs2MzAsMTIgQEAKIAlweG1pdGZyYW1lLT5idWZfYWRkciA9IHB4bWl0YnVmLT5wYnVmOwogCXB4bWl0YnVmLT5wcml2X2RhdGEgPSBweG1pdGZyYW1lOwogCi0JaWYgKHhtaXRmcmFtZV9kaXJlY3QoYWRhcHQsIHB4bWl0ZnJhbWUpICE9IF9TVUNDRVNTKSB7CisJcmVzID0gcnR3X3htaXRmcmFtZV9jb2FsZXNjZShhZGFwdCwgcHhtaXRmcmFtZS0+cGt0LCBweG1pdGZyYW1lKTsKKworCWlmIChyZXMgPT0gX1NVQ0NFU1MpIHsKKwkJcnR3X2R1bXBfeGZyYW1lKGFkYXB0LCBweG1pdGZyYW1lKTsKKwl9IGVsc2UgeworCQlEQkdfODhFKCI9PT4gJXMgeG1pdGZyYW1lX2NvYWxzZWNlIGZhaWxlZFxuIiwgX19mdW5jX18pOwogCQlydHdfZnJlZV94bWl0YnVmKHB4bWl0cHJpdiwgcHhtaXRidWYpOwogCQlydHdfZnJlZV94bWl0ZnJhbWUocHhtaXRwcml2LCBweG1pdGZyYW1lKTsKIAl9CkBAIC02NzQsMjAgKzY1OSwxMCBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotczMyIHJ0bDgxODhldV9tZ250X3htaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBzdHJ1Y3QgeG1pdF9mcmFtZSAqcG1nbnRmcmFtZSkKK3MzMiBydHdfaGFsX21nbnRfeG1pdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lKQogewogCXN0cnVjdCB4bWl0X3ByaXYgKnhtaXRwcml2ID0gJmFkYXB0LT54bWl0cHJpdjsKIAogCXJ0bDg4ZXVfbW9uX3htaXRfaG9vayhhZGFwdC0+cG1vbmRldiwgcG1nbnRmcmFtZSwgeG1pdHByaXYtPmZyYWdfbGVuKTsKIAlyZXR1cm4gcnR3X2R1bXBfeGZyYW1lKGFkYXB0LCBwbWdudGZyYW1lKTsKIH0KLQotLyoKLSAqIFJldHVybgotICoJdHJ1ZQlkdW1wIHBhY2tldCBkaXJlY3RseSBvawotICoJZmFsc2UJdGVtcG9yYXJ5IGNhbid0IHRyYW5zbWl0IHBhY2tldHMgdG8gaGFyZHdhcmUKLSAqLwotczMyIHJ0bDgxODhldV9oYWxfeG1pdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKQotewotCXJldHVybiBwcmVfeG1pdGZyYW1lKGFkYXB0LCBweG1pdGZyYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3VzYl9oYWxpbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC91c2JfaGFsaW5pdC5jCmluZGV4IDM2M2YzYTMuLjc2OTJjYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3VzYl9oYWxpbml0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvdXNiX2hhbGluaXQuYwpAQCAtMjEsMTQgKzIxLDEzIEBACiAjaW5jbHVkZSA8cnRsODE4OGVfaGFsLmg+CiAjaW5jbHVkZSA8cnRsODE4OGVfbGVkLmg+CiAjaW5jbHVkZSA8cnR3X2lvbC5oPgotI2luY2x1ZGUgPHVzYl9oYWwuaD4KICNpbmNsdWRlIDxwaHkuaD4KIAogI2RlZmluZQkJSEFMX0JCX0VOQUJMRQkJMQogCiBzdGF0aWMgdm9pZCBfQ29uZmlnTm9ybWFsQ2hpcE91dEVQXzgxODhFKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTggTnVtT3V0UGlwZSkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKmhhbGRhdGEJPSBHRVRfSEFMX0RBVEEoYWRhcHQpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YSA9IGFkYXB0LT5IYWxEYXRhOwogCiAJc3dpdGNoIChOdW1PdXRQaXBlKSB7CiAJY2FzZQkzOgpAQCAtNTEsMTMgKzUwLDEyIEBACiAKIHN0YXRpYyBib29sIEhhbFVzYlNldFF1ZXVlUGlwZU1hcHBpbmc4MTg4RVVzYihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHU4IE51bUluUGlwZSwgdTggTnVtT3V0UGlwZSkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKmhhbGRhdGEJPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwogCWJvb2wJCQlyZXN1bHQJCT0gZmFsc2U7CiAKIAlfQ29uZmlnTm9ybWFsQ2hpcE91dEVQXzgxODhFKGFkYXB0LCBOdW1PdXRQaXBlKTsKIAogCS8qICBOb3JtYWwgY2hpcCB3aXRoIG9uZSBJTiBhbmQgb25lIE9VVCBkb2Vzbid0IGhhdmUgaW50ZXJydXB0IElOIEVQLiAqLwotCWlmIChoYWxkYXRhLT5PdXRFcE51bWJlciA9PSAxKSB7CisJaWYgKGFkYXB0LT5IYWxEYXRhLT5PdXRFcE51bWJlciA9PSAxKSB7CiAJCWlmIChOdW1JblBpcGUgIT0gMSkKIAkJCXJldHVybiByZXN1bHQ7CiAJfQpAQCAtNjksOSArNjcsOSBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyB2b2lkIHJ0bDgxODhldV9pbnRlcmZhY2VfY29uZmlndXJlKHN0cnVjdCBhZGFwdGVyICphZGFwdCkKK3ZvaWQgcnR3X2hhbF9jaGlwX2NvbmZpZ3VyZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhCT0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbGRhdGEgPSBhZGFwdC0+SGFsRGF0YTsKIAlzdHJ1Y3QgZHZvYmpfcHJpdgkqcGR2b2JqcHJpdiA9IGFkYXB0ZXJfdG9fZHZvYmooYWRhcHQpOwogCiAJaWYgKHBkdm9ianByaXYtPmlzaGlnaHNwZWVkKQpAQCAtOTQsMTIgKzkyLDExIEBACiAJCQkJcGR2b2JqcHJpdi0+UnROdW1JblBpcGVzLCBwZHZvYmpwcml2LT5SdE51bU91dFBpcGVzKTsKIH0KIAotc3RhdGljIHUzMiBydGw4MTg4ZXVfSW5pdFBvd2VyT24oc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQordTMyIHJ0d19oYWxfcG93ZXJfb24oc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQogewogCXUxNiB2YWx1ZTE2OwogCS8qICBIVyBQb3dlciBvbiBzZXF1ZW5jZSAqLwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YQk9IEdFVF9IQUxfREFUQShhZGFwdCk7Ci0JaWYgKGhhbGRhdGEtPmJNYWNQd3JDdHJsT24pCisJaWYgKGFkYXB0LT5IYWxEYXRhLT5iTWFjUHdyQ3RybE9uKQogCQlyZXR1cm4gX1NVQ0NFU1M7CiAKIAlpZiAoIXJ0bDg4ZXVfcHdyc2VxY21kcGFyc2luZyhhZGFwdCwgUFdSX0NVVF9BTExfTVNLLApAQCAtMTE5LDcgKzExNiw3IEBACiAJLyogIGZvciBTRElPIC0gU2V0IENSIGJpdDEwIHRvIGVuYWJsZSAzMmsgY2FsaWJyYXRpb24uIFN1Z2dlc3RlZCBieSBTRDEgR2ltbXkuIEFkZGVkIGJ5IHR5bmxpLiAyMDExLjA4LjMxLiAqLwogCiAJdXNiX3dyaXRlMTYoYWRhcHQsIFJFR19DUiwgdmFsdWUxNik7Ci0JaGFsZGF0YS0+Yk1hY1B3ckN0cmxPbiA9IHRydWU7CisJYWRhcHQtPkhhbERhdGEtPmJNYWNQd3JDdHJsT24gPSB0cnVlOwogCiAJcmV0dXJuIF9TVUNDRVNTOwogfQpAQCAtMTI5LDE4ICsxMjYsMTcgQEAKIHsKIAl1MzIgaW1yLCBpbXJfZXg7CiAJdTggIHVzYl9vcHQ7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwogCiAJLyogSElTUiB3cml0ZSBvbmUgdG8gY2xlYXIgKi8KIAl1c2Jfd3JpdGUzMihBZGFwdGVyLCBSRUdfSElTUl84OEUsIDB4RkZGRkZGRkYpOwogCS8qICBISU1SIC0gKi8KIAlpbXIgPSBJTVJfUFNUSU1FT1VUXzg4RSB8IElNUl9UQkRFUl84OEUgfCBJTVJfQ1BXTV84OEUgfCBJTVJfQ1BXTTJfODhFOwogCXVzYl93cml0ZTMyKEFkYXB0ZXIsIFJFR19ISU1SXzg4RSwgaW1yKTsKLQloYWxkYXRhLT5JbnRyTWFza1swXSA9IGltcjsKKwlBZGFwdGVyLT5IYWxEYXRhLT5JbnRyTWFza1swXSA9IGltcjsKIAogCWltcl9leCA9IElNUl9UWEVSUl84OEUgfCBJTVJfUlhFUlJfODhFIHwgSU1SX1RYRk9WV184OEUgfCBJTVJfUlhGT1ZXXzg4RTsKIAl1c2Jfd3JpdGUzMihBZGFwdGVyLCBSRUdfSElNUkVfODhFLCBpbXJfZXgpOwotCWhhbGRhdGEtPkludHJNYXNrWzFdID0gaW1yX2V4OworCUFkYXB0ZXItPkhhbERhdGEtPkludHJNYXNrWzFdID0gaW1yX2V4OwogCiAJLyogIFJFR19VU0JfU1BFQ0lBTF9PUFRJT04gLSBCSVQoNCkgKi8KIAkvKiAgMDsgVXNlIGludGVycnVwdCBlbmRwb2ludCB0byB1cGxvYWQgaW50ZXJydXB0IHBrdCAqLwpAQCAtMTU3LDcgKzE1Myw2IEBACiAKIHN0YXRpYyB2b2lkIF9Jbml0UXVldWVSZXNlcnZlZFBhZ2Uoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCQkqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKIAlzdHJ1Y3QgcmVnaXN0cnlfcHJpdgkqcHJlZ2lzdHJ5cHJpdiA9ICZBZGFwdGVyLT5yZWdpc3RyeXByaXY7CiAJdTMyIG51bUhRCT0gMDsKIAl1MzIgbnVtTFEJPSAwOwpAQCAtMTY4LDE0ICsxNjMsMTQgQEAKIAlib29sIGJXaUZpQ29uZmlnID0gcHJlZ2lzdHJ5cHJpdi0+d2lmaV9zcGVjOwogCiAJaWYgKGJXaUZpQ29uZmlnKSB7Ci0JCWlmIChoYWxkYXRhLT5PdXRFcFF1ZXVlU2VsICYgVFhfU0VMRV9IUSkKKwkJaWYgKEFkYXB0ZXItPkhhbERhdGEtPk91dEVwUXVldWVTZWwgJiBUWF9TRUxFX0hRKQogCQkJbnVtSFEgPSAgMHgyOTsKIAotCQlpZiAoaGFsZGF0YS0+T3V0RXBRdWV1ZVNlbCAmIFRYX1NFTEVfTFEpCisJCWlmIChBZGFwdGVyLT5IYWxEYXRhLT5PdXRFcFF1ZXVlU2VsICYgVFhfU0VMRV9MUSkKIAkJCW51bUxRID0gMHgxQzsKIAogCQkvKiAgTk9URTogVGhpcyBzdGVwIHNoYWxsIGJlIHByb2NlZWQgYmVmb3JlIHdyaXRpbmcgUkVHX1JRUE4uICovCi0JCWlmIChoYWxkYXRhLT5PdXRFcFF1ZXVlU2VsICYgVFhfU0VMRV9OUSkKKwkJaWYgKEFkYXB0ZXItPkhhbERhdGEtPk91dEVwUXVldWVTZWwgJiBUWF9TRUxFX05RKQogCQkJbnVtTlEgPSAweDFDOwogCQl2YWx1ZTggPSAodTgpX05QUShudW1OUSk7CiAJCXVzYl93cml0ZTgoQWRhcHRlciwgUkVHX1JRUE5fTlBRLCB2YWx1ZTgpOwpAQCAtMjI1LDEwICsyMjAsOSBAQAogCiBzdGF0aWMgdm9pZCBfSW5pdE5vcm1hbENoaXBPbmVPdXRFcFByaW9yaXR5KHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YQk9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQogCXUxNiB2YWx1ZSA9IDA7Ci0Jc3dpdGNoIChoYWxkYXRhLT5PdXRFcFF1ZXVlU2VsKSB7CisKKwlzd2l0Y2ggKEFkYXB0ZXItPkhhbERhdGEtPk91dEVwUXVldWVTZWwpIHsKIAljYXNlIFRYX1NFTEVfSFE6CiAJCXZhbHVlID0gUVVFVUVfSElHSDsKIAkJYnJlYWs7CkBAIC0yNDcsMTMgKzI0MSwxMiBAQAogCiBzdGF0aWMgdm9pZCBfSW5pdE5vcm1hbENoaXBUd29PdXRFcFByaW9yaXR5KHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YQk9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKIAlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiA9ICZBZGFwdGVyLT5yZWdpc3RyeXByaXY7CiAJdTE2IGJlUSwgYmtRLCB2aVEsIHZvUSwgbWd0USwgaGlROwogCXUxNiB2YWx1ZUhpID0gMDsKIAl1MTYgdmFsdWVMb3cgPSAwOwogCi0Jc3dpdGNoIChoYWxkYXRhLT5PdXRFcFF1ZXVlU2VsKSB7CisJc3dpdGNoIChBZGFwdGVyLT5IYWxEYXRhLT5PdXRFcFF1ZXVlU2VsKSB7CiAJY2FzZSAoVFhfU0VMRV9IUSB8IFRYX1NFTEVfTFEpOgogCQl2YWx1ZUhpID0gUVVFVUVfSElHSDsKIAkJdmFsdWVMb3cgPSBRVUVVRV9MT1c7CkBAIC0zMTMsOSArMzA2LDcgQEAKIAogc3RhdGljIHZvaWQgX0luaXRRdWV1ZVByaW9yaXR5KHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQotCXN3aXRjaCAoaGFsZGF0YS0+T3V0RXBOdW1iZXIpIHsKKwlzd2l0Y2ggKEFkYXB0ZXItPkhhbERhdGEtPk91dEVwTnVtYmVyKSB7CiAJY2FzZSAxOgogCQlfSW5pdE5vcm1hbENoaXBPbmVPdXRFcFByaW9yaXR5KEFkYXB0ZXIpOwogCQlicmVhazsKQEAgLTM1Nyw3ICszNDgsNyBAQAogCiBzdGF0aWMgdm9pZCBfSW5pdFdNQUNTZXR0aW5nKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbGRhdGEgPSBBZGFwdGVyLT5IYWxEYXRhOwogCiAJaGFsZGF0YS0+UmVjZWl2ZUNvbmZpZyA9IFJDUl9BQVAgfCBSQ1JfQVBNIHwgUkNSX0FNIHwgUkNSX0FCIHwKIAkJCQkgIFJDUl9DQlNTSURfREFUQSB8IFJDUl9DQlNTSURfQkNOIHwKQEAgLTQ1Niw3ICs0NDcsNyBAQAogICovCiBzdGF0aWMgdm9pZCB1c2JfQWdnU2V0dGluZ1R4VXBkYXRlKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbGRhdGEgPSBBZGFwdGVyLT5IYWxEYXRhOwogCXUzMiB2YWx1ZTMyOwogCiAJaWYgKEFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi53aWZpX3NwZWMpCkBAIC00OTIsNyArNDgzLDcgQEAKIAkJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIKIAkpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YSA9IEFkYXB0ZXItPkhhbERhdGE7CiAJdTggdmFsdWVETUE7CiAJdTggdmFsdWVVU0I7CiAKQEAgLTU2Niw4ICs1NTcsNiBAQAogCiBzdGF0aWMgdm9pZCBJbml0VXNiQWdncmVnYXRpb25TZXR0aW5nKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQogCS8qICBUeCBhZ2dyZWdhdGlvbiBzZXR0aW5nICovCiAJdXNiX0FnZ1NldHRpbmdUeFVwZGF0ZShBZGFwdGVyKTsKIApAQCAtNTc1LDEyICs1NjQsMTIgQEAKIAl1c2JfQWdnU2V0dGluZ1J4VXBkYXRlKEFkYXB0ZXIpOwogCiAJLyogIDIwMS8xMi8xMCBNSCBBZGQgZm9yIFVTQiBhZ2cgbW9kZSBkeW5hbWljIHN3aXRjaC4gKi8KLQloYWxkYXRhLT5Vc2JSeEhpZ2hTcGVlZE1vZGUgPSBmYWxzZTsKKwlBZGFwdGVyLT5IYWxEYXRhLT5Vc2JSeEhpZ2hTcGVlZE1vZGUgPSBmYWxzZTsKIH0KIAogc3RhdGljIHZvaWQgX0luaXRCZWFjb25QYXJhbWV0ZXJzKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbGRhdGEgPSBBZGFwdGVyLT5IYWxEYXRhOwogCiAJdXNiX3dyaXRlMTYoQWRhcHRlciwgUkVHX0JDTl9DVFJMLCAweDEwMTApOwogCkBAIC02MjIsNyArNjExLDcgQEAKIAogc3RhdGljIHZvaWQgX0luaXRBbnRlbm5hX1NlbGVjdGlvbihzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlcikKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKmhhbGRhdGEJPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxkYXRhID0gQWRhcHRlci0+SGFsRGF0YTsKIAogCWlmIChoYWxkYXRhLT5BbnREaXZDZmcgPT0gMCkKIAkJcmV0dXJuOwpAQCAtNjcyLDEzICs2NjEsMTMgQEAKIAlyZXR1cm4gcmZwb3dlcnN0YXRlOwogfQkvKiAgSGFsRGV0ZWN0UHdyRG93bk1vZGUgKi8KIAotc3RhdGljIHUzMiBydGw4MTg4ZXVfaGFsX2luaXQoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCit1MzIgcnRsODE4OGV1X2hhbF9pbml0KHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQogewogCXU4IHZhbHVlOCA9IDA7CiAJdTE2ICB2YWx1ZTE2OwogCXU4IHR4cGt0YnVmX2JuZHk7CiAJdTMyIHN0YXR1cyA9IF9TVUNDRVNTOwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkJKmhhbGRhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxkYXRhID0gQWRhcHRlci0+SGFsRGF0YTsKIAlzdHJ1Y3QgcHdyY3RybF9wcml2CQkqcHdyY3RybHByaXYgPSAmQWRhcHRlci0+cHdyY3RybHByaXY7CiAJc3RydWN0IHJlZ2lzdHJ5X3ByaXYJKnByZWdpc3RyeXByaXYgPSAmQWRhcHRlci0+cmVnaXN0cnlwcml2OwogCXVuc2lnbmVkIGxvbmcgaW5pdF9zdGFydF90aW1lID0gamlmZmllczsKQEAgLTcwMiw3ICs2OTEsNyBAQAogCX0KIAogCUhBTF9JTklUX1BST0ZJTEVfVEFHKEhBTF9JTklUX1NUQUdFU19JTklUX1BXX09OKTsKLQlzdGF0dXMgPSBydGw4MTg4ZXVfSW5pdFBvd2VyT24oQWRhcHRlcik7CisJc3RhdHVzID0gcnR3X2hhbF9wb3dlcl9vbihBZGFwdGVyKTsKIAlpZiAoc3RhdHVzID09IF9GQUlMKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2Vycl8sICgiRmFpbGVkIHRvIGluaXQgcG93ZXIgb24hXG4iKSk7CiAJCWdvdG8gZXhpdDsKQEAgLTgxMCw4ICs3OTksOCBAQAogCXVzYl93cml0ZTE2KEFkYXB0ZXIsIFJFR19QS1RfQkVfQktfTElGRV9USU1FLCAweDA0MDApOwkvKiAgdW5pdDogMjU2dXMuIDI1Nm1zICovCiAKIAkvKiBLZWVwIFJmUmVnQ2hubFZhbCBmb3IgbGF0ZXIgdXNlLiAqLwotCWhhbGRhdGEtPlJmUmVnQ2hubFZhbFswXSA9IHBoeV9xdWVyeV9yZl9yZWcoQWRhcHRlciwgKGVudW0gcmZfcmFkaW9fcGF0aCkwLCBSRl9DSE5MQlcsIGJSRlJlZ09mZnNldE1hc2spOwotCWhhbGRhdGEtPlJmUmVnQ2hubFZhbFsxXSA9IHBoeV9xdWVyeV9yZl9yZWcoQWRhcHRlciwgKGVudW0gcmZfcmFkaW9fcGF0aCkxLCBSRl9DSE5MQlcsIGJSRlJlZ09mZnNldE1hc2spOworCWhhbGRhdGEtPlJmUmVnQ2hubFZhbFswXSA9IHJ0d19oYWxfcmVhZF9yZnJlZyhBZGFwdGVyLCAoZW51bSByZl9yYWRpb19wYXRoKTAsIFJGX0NITkxCVywgYlJGUmVnT2Zmc2V0TWFzayk7CisJaGFsZGF0YS0+UmZSZWdDaG5sVmFsWzFdID0gcnR3X2hhbF9yZWFkX3JmcmVnKEFkYXB0ZXIsIChlbnVtIHJmX3JhZGlvX3BhdGgpMSwgUkZfQ0hOTEJXLCBiUkZSZWdPZmZzZXRNYXNrKTsKIAogSEFMX0lOSVRfUFJPRklMRV9UQUcoSEFMX0lOSVRfU1RBR0VTX1RVUk5fT05fQkxPQ0spOwogCV9CQlR1cm5PbkJsb2NrKEFkYXB0ZXIpOwpAQCAtOTA1LDcgKzg5NCw2IEBACiBzdGF0aWMgdm9pZCBDYXJkRGlzYWJsZVJUTDgxODhFVShzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlcikKIHsKIAl1OCB2YWw4OwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YQk9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKIAogCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLCAoIkNhcmREaXNhYmxlUlRMODE4OEVVXG4iKSk7CiAKQEAgLTk1OCw3ICs5NDYsNyBAQAogCXZhbDggPSB1c2JfcmVhZDgoQWRhcHRlciwgUkVHX0dQSU9fSU9fU0VMKzEpOwogCXVzYl93cml0ZTgoQWRhcHRlciwgUkVHX0dQSU9fSU9fU0VMKzEsIHZhbDh8MHgwRik7LyogUmVnMHg0MyAqLwogCXVzYl93cml0ZTMyKEFkYXB0ZXIsIFJFR19CQl9QQURfQ1RSTCwgMHgwMDA4MDgwOCk7Lyogc2V0IExOQSAsVFJTVyxFWF9QQSBQaW4gdG8gb3V0cHV0IG1vZGUgKi8KLQloYWxkYXRhLT5iTWFjUHdyQ3RybE9uID0gZmFsc2U7CisJQWRhcHRlci0+SGFsRGF0YS0+Yk1hY1B3ckN0cmxPbiA9IGZhbHNlOwogCUFkYXB0ZXItPmJGV1JlYWR5ID0gZmFsc2U7CiB9CiAKQEAgLTk3Miw3ICs5NjAsNyBAQAogCXVzYl93cml0ZTE2KGFkYXB0LCBSRUdfQVBTX0ZTTUNPLCAweDg4MTIpOwogfQogCi1zdGF0aWMgdTMyIHJ0bDgxODhldV9oYWxfZGVpbml0KHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQordTMyIHJ0bDgxODhldV9oYWxfZGVpbml0KHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQogewogCURCR184OEUoIj09PiAlc1xuIiwgX19mdW5jX18pOwogCkBAIC05OTQsNyArOTgyLDcgQEAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcnRsODE4OGV1X2luaXJwX2luaXQoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCit1MzIgcnR3X2hhbF9pbmlycF9pbml0KHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQogewogCXU4IGk7CiAJc3RydWN0IHJlY3ZfYnVmICpwcmVjdmJ1ZjsKQEAgLTEwMjksMTcgKzEwMTcsNiBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcnRsODE4OGV1X2luaXJwX2RlaW5pdChzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlcikKLXsKLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywgKCJcbiA9PT0+IHVzYl9yeF9kZWluaXRcbiIpKTsKLQotCXVzYl9yZWFkX3BvcnRfY2FuY2VsKEFkYXB0ZXIpOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sICgiXG4gPD09PSB1c2JfcnhfZGVpbml0XG4iKSk7Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KIC8qICAqLwogLyogICovCiAvKglFRVBST00vRUZVU0UgQ29udGVudCBQYXJzaW5nICovCkBAIC0xMDQ3LDcgKzEwMjQsNyBAQAogLyogICovCiBzdGF0aWMgdm9pZCBIYWxfRWZ1c2VQYXJzZVBJRFZJRF84MTg4RVUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1OCAqaHdpbmZvLCBib29sIEF1dG9Mb2FkRmFpbCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKmhhbGRhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YSA9IGFkYXB0LT5IYWxEYXRhOwogCiAJaWYgKCFBdXRvTG9hZEZhaWwpIHsKIAkJLyogIFZJRCwgUElEICovCkBAIC0xMTMyLDEyICsxMTA5LDEwIEBACiAKIHN0YXRpYyB2b2lkIF9SZWFkUkZUeXBlKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQotCWhhbGRhdGEtPnJmX2NoaXAgPSBSRl82MDUyOworCUFkYXB0ZXItPkhhbERhdGEtPnJmX2NoaXAgPSBSRl82MDUyOwogfQogCi1zdGF0aWMgdm9pZCBfUmVhZEFkYXB0ZXJJbmZvODE4OEVVKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQordm9pZCBydHdfaGFsX3JlYWRfY2hpcF9pbmZvKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQogewogCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBqaWZmaWVzOwogCkBAIC0xMTU3LDcgKzExMzIsNyBAQAogCiBzdGF0aWMgdm9pZCBSZXN1bWVUeEJlYWNvbihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbGRhdGEgPSBhZGFwdC0+SGFsRGF0YTsKIAogCS8qICAyMDEwLjAzLjAxLiBNYXJrZWQgYnkgdHlubGkuIE5vIG5lZWQgdG8gY2FsbCB3b3JraXRlbSBiZWFjYXVzZSB3ZSByZWNvcmQgdGhlIHZhbHVlICovCiAJLyogIHdoaWNoIHNob3VsZCBiZSByZWFkIGZyb20gcmVnaXN0ZXIgdG8gYSBnbG9iYWwgdmFyaWFibGUuICovCkBAIC0xMTcxLDcgKzExNDYsNyBAQAogCiBzdGF0aWMgdm9pZCBTdG9wVHhCZWFjb24oc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxkYXRhID0gYWRhcHQtPkhhbERhdGE7CiAKIAkvKiAgMjAxMC4wMy4wMS4gTWFya2VkIGJ5IHR5bmxpLiBObyBuZWVkIHRvIGNhbGwgd29ya2l0ZW0gYmVhY2F1c2Ugd2UgcmVjb3JkIHRoZSB2YWx1ZSAqLwogCS8qICB3aGljaCBzaG91bGQgYmUgcmVhZCBmcm9tIHJlZ2lzdGVyIHRvIGEgZ2xvYmFsIHZhcmlhYmxlLiAqLwpAQCAtMTI3Niw5ICsxMjUxLDkgQEAKIAkJdXNiX3dyaXRlOChBZGFwdGVyLCBiY25fY3RybF9yZWcsIHVzYl9yZWFkOChBZGFwdGVyLCBiY25fY3RybF9yZWcpJih+KEVOX0JDTl9GVU5DVElPTiB8IEVOX1RYQkNOX1JQVCkpKTsKIH0KIAotc3RhdGljIHZvaWQgU2V0SHdSZWc4MTg4RVUoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIsIHU4IHZhcmlhYmxlLCB1OCAqdmFsKQordm9pZCBydHdfaGFsX3NldF9od3JlZyhzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciwgdTggdmFyaWFibGUsIHU4ICp2YWwpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YSA9IEFkYXB0ZXItPkhhbERhdGE7CiAJc3RydWN0IGRtX3ByaXYJKnBkbXByaXYgPSAmaGFsZGF0YS0+ZG1wcml2OwogCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpwb2RtcHJpdiA9ICZoYWxkYXRhLT5vZG1wcml2OwogCkBAIC0xNDI2LDE3ICsxNDAxLDggQEAKIAkJCQkvKiBlbmFibGUgdXBkYXRlIFRTRiAqLwogCQkJCXVzYl93cml0ZTgoQWRhcHRlciwgUkVHX0JDTl9DVFJMLCB1c2JfcmVhZDgoQWRhcHRlciwgUkVHX0JDTl9DVFJMKSYofkJJVCg0KSkpOwogCQkJfQotCQkJaWYgKChwbWxtZWluZm8tPnN0YXRlJjB4MDMpID09IFdJRklfRldfQVBfU1RBVEUpIHsKLQkJCQl1c2Jfd3JpdGUzMihBZGFwdGVyLCBSRUdfUkNSLCB1c2JfcmVhZDMyKEFkYXB0ZXIsIFJFR19SQ1IpfFJDUl9DQlNTSURfQkNOKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKEFkYXB0ZXItPmluX2N0YV90ZXN0KSB7Ci0JCQkJCXUzMiB2ID0gdXNiX3JlYWQzMihBZGFwdGVyLCBSRUdfUkNSKTsKLQkJCQkJdiAmPSB+KFJDUl9DQlNTSURfREFUQSB8IFJDUl9DQlNTSURfQkNOKTsvKiAgUkNSX0FERiAqLwotCQkJCQl1c2Jfd3JpdGUzMihBZGFwdGVyLCBSRUdfUkNSLCB2KTsKLQkJCQl9IGVsc2UgewotCQkJCQl1c2Jfd3JpdGUzMihBZGFwdGVyLCBSRUdfUkNSLCB1c2JfcmVhZDMyKEFkYXB0ZXIsIFJFR19SQ1IpfFJDUl9DQlNTSURfQkNOKTsKLQkJCQl9Ci0JCQl9CisKKwkJCXVzYl93cml0ZTMyKEFkYXB0ZXIsIFJFR19SQ1IsIHVzYl9yZWFkMzIoQWRhcHRlciwgUkVHX1JDUil8UkNSX0NCU1NJRF9CQ04pOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgSFdfVkFSX01MTUVfSk9JTjoKQEAgLTE0NDksMTMgKzE0MTUsNyBAQAogCQkJCS8qIGVuYWJsZSB0byByeCBkYXRhIGZyYW1lLkFjY2VwdCBhbGwgZGF0YSBmcmFtZSAqLwogCQkJCXVzYl93cml0ZTE2KEFkYXB0ZXIsIFJFR19SWEZMVE1BUDIsIDB4RkZGRik7CiAKLQkJCQlpZiAoQWRhcHRlci0+aW5fY3RhX3Rlc3QpIHsKLQkJCQkJdTMyIHYgPSB1c2JfcmVhZDMyKEFkYXB0ZXIsIFJFR19SQ1IpOwotCQkJCQl2ICY9IH4oUkNSX0NCU1NJRF9EQVRBIHwgUkNSX0NCU1NJRF9CQ04pOy8qICBSQ1JfQURGICovCi0JCQkJCXVzYl93cml0ZTMyKEFkYXB0ZXIsIFJFR19SQ1IsIHYpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXVzYl93cml0ZTMyKEFkYXB0ZXIsIFJFR19SQ1IsIHVzYl9yZWFkMzIoQWRhcHRlciwgUkVHX1JDUil8UkNSX0NCU1NJRF9EQVRBfFJDUl9DQlNTSURfQkNOKTsKLQkJCQl9CisJCQkJdXNiX3dyaXRlMzIoQWRhcHRlciwgUkVHX1JDUiwgdXNiX3JlYWQzMihBZGFwdGVyLCBSRUdfUkNSKXxSQ1JfQ0JTU0lEX0RBVEF8UkNSX0NCU1NJRF9CQ04pOwogCiAJCQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpKQogCQkJCQlSZXRyeUxpbWl0ID0gKGhhbGRhdGEtPkN1c3RvbWVySUQgPT0gUlRfQ0lEX0NDWCkgPyA3IDogNDg7CkBAIC0xNTI1LDkgKzE0ODUsNiBAQAogCWNhc2UgSFdfVkFSX1NFQ19DRkc6CiAJCXVzYl93cml0ZTgoQWRhcHRlciwgUkVHX1NFQ0NGRywgKigodTggKil2YWwpKTsKIAkJYnJlYWs7Ci0JY2FzZSBIV19WQVJfRE1fRkxBRzoKLQkJcG9kbXByaXYtPlN1cHBvcnRBYmlsaXR5ID0gKigodTggKil2YWwpOwotCQlicmVhazsKIAljYXNlIEhXX1ZBUl9ETV9GVU5DX09QOgogCQlpZiAodmFsWzBdKQogCQkJcG9kbXByaXYtPkJLX1N1cHBvcnRBYmlsaXR5ID0gcG9kbXByaXYtPlN1cHBvcnRBYmlsaXR5OwpAQCAtMTc5MywxNCArMTc1MCwxMSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgR2V0SHdSZWc4MTg4RVUoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIsIHU4IHZhcmlhYmxlLCB1OCAqdmFsKQordm9pZCBydHdfaGFsX2dldF9od3JlZyhzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciwgdTggdmFyaWFibGUsIHU4ICp2YWwpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpwb2RtcHJpdiA9ICZoYWxkYXRhLT5vZG1wcml2OwotCiAJc3dpdGNoICh2YXJpYWJsZSkgewogCWNhc2UgSFdfVkFSX0JBU0lDX1JBVEU6Ci0JCSooKHUxNiAqKSh2YWwpKSA9IGhhbGRhdGEtPkJhc2ljUmF0ZVNldDsKKwkJKigodTE2ICopKHZhbCkpID0gQWRhcHRlci0+SGFsRGF0YS0+QmFzaWNSYXRlU2V0OwogCWNhc2UgSFdfVkFSX1RYUEFVU0U6CiAJCXZhbFswXSA9IHVzYl9yZWFkOChBZGFwdGVyLCBSRUdfVFhQQVVTRSk7CiAJCWJyZWFrOwpAQCAtMTgwOCwxMSArMTc2Miw4IEBACiAJCS8qIEJDTl9WQUxJRCwgQklUMTYgb2YgUkVHX1RERUNUUkwgPSBCSVQwIG9mIFJFR19UREVDVFJMKzIgKi8KIAkJdmFsWzBdID0gKEJJVCgwKSAmIHVzYl9yZWFkOChBZGFwdGVyLCBSRUdfVERFQ1RSTCsyKSkgPyB0cnVlIDogZmFsc2U7CiAJCWJyZWFrOwotCWNhc2UgSFdfVkFSX0RNX0ZMQUc6Ci0JCXZhbFswXSA9IHBvZG1wcml2LT5TdXBwb3J0QWJpbGl0eTsKLQkJYnJlYWs7CiAJY2FzZSBIV19WQVJfUkZfVFlQRToKLQkJdmFsWzBdID0gaGFsZGF0YS0+cmZfdHlwZTsKKwkJdmFsWzBdID0gUkZfMVQxUjsKIAkJYnJlYWs7CiAJY2FzZSBIV19WQVJfRldMUFNfUkZfT046CiAJCXsKQEAgLTE4MzMsMTMgKzE3ODQsMTMgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIEhXX1ZBUl9DVVJSRU5UX0FOVEVOTkE6Ci0JCXZhbFswXSA9IGhhbGRhdGEtPkN1ckFudGVubmE7CisJCXZhbFswXSA9IEFkYXB0ZXItPkhhbERhdGEtPkN1ckFudGVubmE7CiAJCWJyZWFrOwogCWNhc2UgSFdfVkFSX0VGVVNFX0JZVEVTOiAvKiAgVG8gZ2V0IEVGVUUgdG90YWwgdXNlZCBieXRlcywgYWRkZWQgYnkgUm9nZXIsIDIwMDguMTIuMjIuICovCi0JCSooKHUxNiAqKSh2YWwpKSA9IGhhbGRhdGEtPkVmdXNlVXNlZEJ5dGVzOworCQkqKCh1MTYgKikodmFsKSkgPSBBZGFwdGVyLT5IYWxEYXRhLT5FZnVzZVVzZWRCeXRlczsKIAkJYnJlYWs7CiAJY2FzZSBIV19WQVJfQVBGTV9PTl9NQUM6Ci0JCSp2YWwgPSBoYWxkYXRhLT5iTWFjUHdyQ3RybE9uOworCQkqdmFsID0gQWRhcHRlci0+SGFsRGF0YS0+Yk1hY1B3ckN0cmxPbjsKIAkJYnJlYWs7CiAJY2FzZSBIV19WQVJfQ0hLX0hJX1FVRVVFX0VNUFRZOgogCQkqdmFsID0gKCh1c2JfcmVhZDMyKEFkYXB0ZXIsIFJFR19IR1FfSU5GT1JNQVRJT04pJjB4MDAwMGZmMDApID09IDApID8gdHJ1ZSA6IGZhbHNlOwpAQCAtMTg1MywxNCArMTgwNCwxMyBAQAogLyoJRGVzY3JpcHRpb246ICovCiAvKgkJUXVlcnkgc2V0dGluZyBvZiBzcGVjaWZpZWQgdmFyaWFibGUuICovCiAvKiAgKi8KLXN0YXRpYyB1OAotR2V0SGFsRGVmVmFyODE4OEVVc2IoCit1OCBydHdfaGFsX2dldF9kZWZfdmFyKAogCQlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciwKIAkJZW51bSBoYWxfZGVmX3ZhcmlhYmxlIGVWYXJpYWJsZSwKIAkJdm9pZCAqcFZhbHVlCiAJKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbGRhdGEgPSBBZGFwdGVyLT5IYWxEYXRhOwogCXU4IGJSZXN1bHQgPSBfU1VDQ0VTUzsKIAogCXN3aXRjaCAoZVZhcmlhYmxlKSB7CkBAIC0xOTQ4LDcgKzE4OTgsNyBAQAogCXJldHVybiBiUmVzdWx0OwogfQogCi1zdGF0aWMgdm9pZCBVcGRhdGVIYWxSQU1hc2s4MTg4RVVzYihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHUzMiBtYWNfaWQsIHU4IHJzc2lfbGV2ZWwpCit2b2lkIFVwZGF0ZUhhbFJBTWFzazgxODhFVXNiKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTMyIG1hY19pZCwgdTggcnNzaV9sZXZlbCkKIHsKIAl1OCBpbml0X3JhdGUgPSAwOwogCXU4IG5ldHdvcmtUeXBlLCByYWlkOwpAQCAtMTk1Niw3ICsxOTA2LDcgQEAKIAl1OCBzaG9ydEdJcmF0ZSA9IGZhbHNlOwogCWludAlzdXBwb3J0UmF0ZU51bSA9IDA7CiAJc3RydWN0IHN0YV9pbmZvCSpwc3RhOwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CisJc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKm9kbXByaXYgPSAmYWRhcHQtPkhhbERhdGEtPm9kbXByaXY7CiAJc3RydWN0IG1sbWVfZXh0X3ByaXYJKnBtbG1lZXh0ID0gJmFkYXB0LT5tbG1lZXh0cHJpdjsKIAlzdHJ1Y3QgbWxtZV9leHRfaW5mbwkqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKIAlzdHJ1Y3Qgd2xhbl9ic3NpZF9leAkqY3VyX25ldHdvcmsgPSAmcG1sbWVpbmZvLT5uZXR3b3JrOwpAQCAtMTk5NSw3ICsxOTQ1LDcgQEAKIAkJYnJlYWs7CiAJfQogCi0JcmF0ZV9iaXRtYXAgPSBPRE1fR2V0X1JhdGVfQml0bWFwKCZoYWxkYXRhLT5vZG1wcml2LCBtYWNfaWQsIG1hc2ssIHJzc2lfbGV2ZWwpOworCXJhdGVfYml0bWFwID0gT0RNX0dldF9SYXRlX0JpdG1hcChvZG1wcml2LCBtYWNfaWQsIG1hc2ssIHJzc2lfbGV2ZWwpOwogCURCR184OEUoIiVzID0+IG1hY19pZDolZCwgbmV0d29ya1R5cGU6MHglMDJ4LCBtYXNrOjB4JTA4eFxuXHQgPT0+IHJzc2lfbGV2ZWw6JWQsIHJhdGVfYml0bWFwOjB4JTA4eFxuIiwKIAkJX19mdW5jX18sIG1hY19pZCwgbmV0d29ya1R5cGUsIG1hc2ssIHJzc2lfbGV2ZWwsIHJhdGVfYml0bWFwKTsKIApAQCAtMjAwMywxNSArMTk1MywxNCBAQAogCiAJaW5pdF9yYXRlID0gZ2V0X2hpZ2hlc3RfcmF0ZV9pZHgobWFzaykmMHgzZjsKIAotCU9ETV9SQV9VcGRhdGVSYXRlSW5mb184MTg4RSgmaGFsZGF0YS0+b2RtcHJpdiwgbWFjX2lkLAotCQkJCSAgICByYWlkLCBtYXNrLCBzaG9ydEdJcmF0ZSk7CisJT0RNX1JBX1VwZGF0ZVJhdGVJbmZvXzgxODhFKG9kbXByaXYsIG1hY19pZCwgcmFpZCwgbWFzaywgc2hvcnRHSXJhdGUpOwogCiAJLyogc2V0IHJhX2lkICovCiAJcHN0YS0+cmFpZCA9IHJhaWQ7CiAJcHN0YS0+aW5pdF9yYXRlID0gaW5pdF9yYXRlOwogfQogCi1zdGF0aWMgdm9pZCBTZXRCZWFjb25SZWxhdGVkUmVnaXN0ZXJzODE4OEVVc2Ioc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQordm9pZCBydHdfaGFsX2Jjbl9yZWxhdGVkX3JlZ19zZXR0aW5nKHN0cnVjdCBhZGFwdGVyICphZGFwdCkKIHsKIAl1MzIgdmFsdWUzMjsKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmYWRhcHQtPm1sbWVleHRwcml2OwpAQCAtMjA0NSwxMyArMTk5NCwxMiBAQAogCXVzYl93cml0ZTgoYWRhcHQsIGJjbl9jdHJsX3JlZywgdXNiX3JlYWQ4KGFkYXB0LCBiY25fY3RybF9yZWcpIHwgQklUKDEpKTsKIH0KIAotc3RhdGljIHZvaWQgcnRsODE4OGV1X2luaXRfZGVmYXVsdF92YWx1ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCit2b2lkIHJ0d19oYWxfZGVmX3ZhbHVlX2luaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbGRhdGEgPSBhZGFwdC0+SGFsRGF0YTsKIAlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3JjdHJscHJpdjsKIAl1OCBpOwogCi0JaGFsZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CiAJcHdyY3RybHByaXYgPSAmYWRhcHQtPnB3cmN0cmxwcml2OwogCiAJLyogaW5pdCBkZWZhdWx0IHZhbHVlICovCkBAIC0yMDY3LDQzICsyMDE1LDMgQEAKIAlmb3IgKGkgPSAwOyBpIDwgSFBfVEhFUk1BTF9OVU07IGkrKykKIAkJaGFsZGF0YS0+b2RtcHJpdi5SRkNhbGlicmF0ZUluZm8uVGhlcm1hbFZhbHVlX0hQW2ldID0gMDsKIH0KLQotdm9pZCBydGw4MTg4ZXVfc2V0X2hhbF9vcHMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQotewotCXN0cnVjdCBoYWxfb3BzCSpoYWxmdW5jID0gJmFkYXB0LT5IYWxGdW5jOwotCi0KLQlhZGFwdC0+SGFsRGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoYWxfZGF0YV84MTg4ZSksIEdGUF9LRVJORUwpOwotCWlmICghYWRhcHQtPkhhbERhdGEpCi0JCURCR184OEUoImNhbnQgbm90IGFsbG9jIG1lbW9yeSBmb3IgSEFMIERBVEFcbiIpOwotCi0JaGFsZnVuYy0+aGFsX3Bvd2VyX29uID0gcnRsODE4OGV1X0luaXRQb3dlck9uOwotCWhhbGZ1bmMtPmhhbF9pbml0ID0gJnJ0bDgxODhldV9oYWxfaW5pdDsKLQloYWxmdW5jLT5oYWxfZGVpbml0ID0gJnJ0bDgxODhldV9oYWxfZGVpbml0OwotCi0JaGFsZnVuYy0+aW5pcnBfaW5pdCA9ICZydGw4MTg4ZXVfaW5pcnBfaW5pdDsKLQloYWxmdW5jLT5pbmlycF9kZWluaXQgPSAmcnRsODE4OGV1X2luaXJwX2RlaW5pdDsKLQotCWhhbGZ1bmMtPmluaXRfeG1pdF9wcml2ID0gJnJ0bDgxODhldV9pbml0X3htaXRfcHJpdjsKLQotCWhhbGZ1bmMtPmluaXRfcmVjdl9wcml2ID0gJnJ0bDgxODhldV9pbml0X3JlY3ZfcHJpdjsKLQloYWxmdW5jLT5mcmVlX3JlY3ZfcHJpdiA9ICZydGw4MTg4ZXVfZnJlZV9yZWN2X3ByaXY7Ci0JaGFsZnVuYy0+SW5pdFN3TGVkcyA9ICZydGw4MTg4ZXVfSW5pdFN3TGVkczsKLQloYWxmdW5jLT5EZUluaXRTd0xlZHMgPSAmcnRsODE4OGV1X0RlSW5pdFN3TGVkczsKLQotCWhhbGZ1bmMtPmluaXRfZGVmYXVsdF92YWx1ZSA9ICZydGw4MTg4ZXVfaW5pdF9kZWZhdWx0X3ZhbHVlOwotCWhhbGZ1bmMtPmludGZfY2hpcF9jb25maWd1cmUgPSAmcnRsODE4OGV1X2ludGVyZmFjZV9jb25maWd1cmU7Ci0JaGFsZnVuYy0+cmVhZF9hZGFwdGVyX2luZm8gPSAmX1JlYWRBZGFwdGVySW5mbzgxODhFVTsKLQotCWhhbGZ1bmMtPlNldEh3UmVnSGFuZGxlciA9ICZTZXRId1JlZzgxODhFVTsKLQloYWxmdW5jLT5HZXRId1JlZ0hhbmRsZXIgPSAmR2V0SHdSZWc4MTg4RVU7Ci0JaGFsZnVuYy0+R2V0SGFsRGVmVmFySGFuZGxlciA9ICZHZXRIYWxEZWZWYXI4MTg4RVVzYjsKLQotCWhhbGZ1bmMtPlVwZGF0ZVJBTWFza0hhbmRsZXIgPSAmVXBkYXRlSGFsUkFNYXNrODE4OEVVc2I7Ci0JaGFsZnVuYy0+U2V0QmVhY29uUmVsYXRlZFJlZ2lzdGVyc0hhbmRsZXIgPSAmU2V0QmVhY29uUmVsYXRlZFJlZ2lzdGVyczgxODhFVXNiOwotCi0JaGFsZnVuYy0+aGFsX3htaXQgPSAmcnRsODE4OGV1X2hhbF94bWl0OwotCWhhbGZ1bmMtPm1nbnRfeG1pdCA9ICZydGw4MTg4ZXVfbWdudF94bWl0OwotCi0JcnRsODE4OGVfc2V0X2hhbF9vcHMoaGFsZnVuYyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvSGFsODE4OEVQaHlDZmcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9IYWw4MTg4RVBoeUNmZy5oCmluZGV4IDg5OTA3NDguLjA5NzZhNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9IYWw4MTg4RVBoeUNmZy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9IYWw4MTg4RVBoeUNmZy5oCkBAIC0xNTgsMjQgKzE1OCw2IEBACiAJCQkJICogUGF0aCBBIGFuZCBCICovCiB9OwogCi1zdHJ1Y3QgYW50X3NlbF9vZmRtIHsKLQl1MzIgcl90eF9hbnRlbm5hOjQ7Ci0JdTMyIHJfYW50X2w6NDsKLQl1MzIgcl9hbnRfbm9uX2h0OjQ7Ci0JdTMyIHJfYW50X2h0MTo0OwotCXUzMiByX2FudF9odDI6NDsKLQl1MzIgcl9hbnRfaHRfczE6NDsKLQl1MzIgcl9hbnRfbm9uX2h0X3MxOjQ7Ci0JdTMyIE9GRE1fVFhTQzoyOwotCXUzMiByZXNlcnZlZDoyOwotfTsKLQotc3RydWN0IGFudF9zZWxfY2NrIHsKLQl1OCByX2Nja3J4X2VuYWJsZV8yOjI7Ci0JdTggcl9jY2tyeF9lbmFibGU6MjsKLQl1OCByX2Nja3R4X2VuYWJsZTo0OwotfTsKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgc3RydWN0dXJlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL0hhbEhXSW1nODE4OEVfRlcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9IYWxIV0ltZzgxODhFX0ZXLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYjU1MjQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL0hhbEhXSW1nODE4OEVfRlcuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0qIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0qIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0qIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotKiBtb3JlIGRldGFpbHMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19JTkNfRldfODE4OEVfSFdfSU1HX0gKLSNkZWZpbmUgX19JTkNfRldfODE4OEVfSFdfSU1HX0gKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgRldfQVAuVFhUCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgRldfV29XTEFOLlRYVAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBBcnJheUxlbmd0aF84MTg4RV9GV19Xb1dMQU4gMTU3NjQKLWV4dGVybiBjb25zdCB1OCBBcnJheV84MTg4RV9GV19Xb1dMQU5bQXJyYXlMZW5ndGhfODE4OEVfRldfV29XTEFOXTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvYmFzaWNfdHlwZXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9iYXNpY190eXBlcy5oCmluZGV4IDJjMTY3NmQuLjY5YzRkNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9iYXNpY190eXBlcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9iYXNpY190eXBlcy5oCkBAIC0xMzcsOCArMTM3LDQgQEAKIAkJKCgoKHU4KV9fdmFsKSAmIEJJVF9MRU5fTUFTS184KF9fYml0bGVuKSkgPDwgKF9fYml0b2Zmc2V0KSkgXAogCQkpCiAKLS8qICBHZXQgdGhlIE4tYnl0ZXMgYWxpZ21lbnQgb2Zmc2V0IGZyb20gdGhlIGN1cnJlbnQgbGVuZ3RoICovCi0jZGVmaW5lCU5fQllURV9BTElHTUVOVChfX3ZhbHVlLCBfX2FsaWdtZW50KSAoKF9fYWxpZ21lbnQgPT0gMSkgPyBcCi0JKF9fdmFsdWUpIDogKCgoX192YWx1ZSArIF9fYWxpZ21lbnQgLSAxKSAvIF9fYWxpZ21lbnQpICogX19hbGlnbWVudCkpCi0KICNlbmRpZiAvKiBfX0JBU0lDX1RZUEVTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2Rydl90eXBlcy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2Rydl90eXBlcy5oCmluZGV4IDU1NTA2YTcuLjMyMzI2ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9kcnZfdHlwZXMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvZHJ2X3R5cGVzLmgKQEAgLTUzLDMwICs1MywxNyBAQAogI2RlZmluZSBTUEVDX0RFVl9JRF9BU1NJR05fSUZOQU1FCUJJVCg1KQogCiBzdHJ1Y3QgcmVnaXN0cnlfcHJpdiB7Ci0JdTgJY2hpcF92ZXJzaW9uOwotCXU4CXJmaW50ZnM7Ci0JdTgJbGJrbW9kZTsKLQl1OAloY2k7CiAJc3RydWN0IG5kaXNfODAyXzExX3NzaWQJc3NpZDsKLQl1OAluZXR3b3JrX21vZGU7CS8qIGluZnJhLCBhZC1ob2MsIGF1dG8gKi8KIAl1OAljaGFubmVsOy8qIGFkLWhvYyBzdXBwb3J0IHJlcXVpcmVtZW50ICovCiAJdTgJd2lyZWxlc3NfbW9kZTsvKiBBLCBCLCBHLCBhdXRvICovCi0JdTgJc2Nhbl9tb2RlOy8qIGFjdGl2ZSwgcGFzc2l2ZSAqLwotCXU4CXJhZGlvX2VuYWJsZTsKIAl1OAlwcmVhbWJsZTsvKiBsb25nLCBzaG9ydCwgYXV0byAqLwogCXU4CXZydGxfY2Fycmllcl9zZW5zZTsvKiBFbmFibGUsIERpc2FibGUsIEF1dG8gKi8KIAl1OAl2Y3NfdHlwZTsvKiBSVFMvQ1RTLCBDVFMtdG8tc2VsZiAqLwogCXUxNglydHNfdGhyZXNoOwogCXUxNglmcmFnX3RocmVzaDsKLQl1OAlhZGhvY190eF9wd3I7Ci0JdTgJc29mdF9hcDsKIAl1OAlwb3dlcl9tZ250OwogCXU4CWlwc19tb2RlOwogCXU4CXNtYXJ0X3BzOwotCXU4CWxvbmdfcmV0cnlfbG10OwotCXU4CXNob3J0X3JldHJ5X2xtdDsKLQl1MTYJYnVzeV90aHJlc2g7Ci0JdTgJYWNrX3BvbGljeTsKIAl1OAltcF9tb2RlOwogCXU4CXNvZnR3YXJlX2VuY3J5cHQ7CiAJdTgJc29mdHdhcmVfZGVjcnlwdDsKQEAgLTg0LDExICs3MSw2IEBACiAJICAvKiBVQVBTRCAqLwogCXU4CXdtbV9lbmFibGU7CiAJdTgJdWFwc2RfZW5hYmxlOwotCXU4CXVhcHNkX21heF9zcDsKLQl1OAl1YXBzZF9hY2JrX2VuOwotCXU4CXVhcHNkX2FjYmVfZW47Ci0JdTgJdWFwc2RfYWN2aV9lbjsKLQl1OAl1YXBzZF9hY3ZvX2VuOwogCiAJc3RydWN0IHdsYW5fYnNzaWRfZXggICAgZGV2X25ldHdvcms7CiAKQEAgLTk3LDEwICs3OSw2IEBACiAJdTgJYW1wZHVfZW5hYmxlOy8qIGZvciB0eCAqLwogCXU4CXJ4X3N0YmM7CiAJdTgJYW1wZHVfYW1zZHU7LyogQS1NUERVIFN1cHBvcnRzIEEtTVNEVSBpcyBwZXJtaXR0ZWQgKi8KLQl1OAlsb3dyYXRlX3R3b194bWl0OwotCi0JdTgJcmZfY29uZmlnOwotCXU4CWxvd19wb3dlcjsKIAogCXU4CXdpZmlfc3BlYzsvKiAgIXR1cmJvX21vZGUgKi8KIApAQCAtMTEyLDkgKzkwLDYgQEAKIAogCXU4CXVzYnNzX2VuYWJsZTsvKiAwOmRpc2FibGUsMTplbmFibGUgKi8KIAl1OAlod3Bkbl9tb2RlOy8qIDA6ZGlzYWJsZSwxOmVuYWJsZSwyOmRlY2lkZSBieSBFRlVTRSBjb25maWcgKi8KLQl1OAlod3B3cnBfZGV0ZWN0Oy8qIDA6ZGlzYWJsZSwxOmVuYWJsZSAqLwotCi0JdTgJaHdfd3BzX3BiYzsvKiAwOmRpc2FibGUsMTplbmFibGUgKi8KIAogCXU4CW1heF9yb2FtaW5nX3RpbWVzOyAvKiAgdGhlIG1heCBudW1iZXIgZHJpdmVyIHdpbGwgdHJ5ICovCiAKQEAgLTEyOSwxMiArMTA0LDYgQEAKIAlib29sCW1vbml0b3JfZW5hYmxlOwogfTsKIAotLyogRm9yIHJlZ2lzdHJ5IHBhcmFtZXRlcnMgKi8KLSNkZWZpbmUgUkdUUllfT0ZUKGZpZWxkKSAoKHUzMilvZmZzZXRvZihzdHJ1Y3QgcmVnaXN0cnlfcHJpdiwgZmllbGQpKQotI2RlZmluZSBSR1RSWV9TWihmaWVsZCkgICBzaXplb2YoKChzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqKTApLT5maWVsZCkKLSNkZWZpbmUgQlNTSURfT0ZUKGZpZWxkKSAoKHUzMilvZmZzZXRvZlQoc3RydWN0IHdsYW5fYnNzaWRfZXgsIGZpZWxkKSkKLSNkZWZpbmUgQlNTSURfU1ooZmllbGQpICAgc2l6ZW9mKCgoc3RydWN0IHdsYW5fYnNzaWRfZXggKikwKS0+ZmllbGQpCi0KICNkZWZpbmUgTUFYX0NPTlRJTlVBTF9VUkJfRVJSCQk0CiAKIHN0cnVjdCBkdm9ial9wcml2IHsKQEAgLTE0OSwxNiArMTE4LDExIEBACiAJdTgJUXVldWUyUGlwZVtIV19RVUVVRV9FTlRSWV07LyogZm9yIG91dCBwaXBlIG1hcHBpbmcgKi8KIAogLyotLS0tLS0tLSBiZWxvdyBpcyBmb3IgVVNCIElOVEVSRkFDRSAtLS0tLS0tLSovCi0KLQl1OAlucl9lbmRwb2ludDsKIAl1OAlpc2hpZ2hzcGVlZDsKIAl1OAlSdE51bUluUGlwZXM7CiAJdTgJUnROdW1PdXRQaXBlczsKLQlpbnQJZXBfbnVtWzVdOyAvKiBlbmRwb2ludCBudW1iZXIgKi8KIAlzdHJ1Y3QgbXV0ZXggIHVzYl92ZW5kb3JfcmVxX211dGV4OwogCi0JdTggKnVzYl92ZW5kb3JfcmVxX2J1ZjsKLQogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICpwdXNiaW50ZjsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqcHVzYmRldjsKIH07CkBAIC0xODQsMTQgKzE0OCw3IEBACiAJc3RydWN0CWVlcHJvbV9wcml2IGVlcHJvbXByaXY7CiAJc3RydWN0CWxlZF9wcml2CWxlZHByaXY7CiAKLSNpZmRlZiBDT05GSUdfODhFVV9BUF9NT0RFCi0Jc3RydWN0CWhvc3RhcGRfcHJpdgkqcGhvc3RhcGRwcml2OwotI2VuZGlmCi0KLQlzdHJ1Y3Qgd2lmaWRpcmVjdF9pbmZvCXdkaW5mbzsKLQotCXZvaWQgKkhhbERhdGE7Ci0Jc3RydWN0IGhhbF9vcHMJSGFsRnVuYzsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKkhhbERhdGE7CiAKIAlzMzIJYkRyaXZlclN0b3BwZWQ7CiAJczMyCWJTdXJwcmlzZVJlbW92ZWQ7CkBAIC0xOTksMjAgKzE1NiwxMSBAQAogCXU4CWh3X2luaXRfY29tcGxldGVkOwogCiAJdm9pZCAqY21kVGhyZWFkOwotCXZvaWQgKmV2dFRocmVhZDsKIAl2b2lkICgqaW50Zl9zdGFydCkoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwogCXZvaWQgKCppbnRmX3N0b3ApKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKIAlzdHJ1Y3QgIG5ldF9kZXZpY2UgKnBuZXRkZXY7CiAJc3RydWN0ICBuZXRfZGV2aWNlICpwbW9uZGV2OwogCi0JLyogIHVzZWQgYnkgcnR3X3JlcmVnX25kX25hbWUgcmVsYXRlZCBmdW5jdGlvbiAqLwotCXN0cnVjdCByZXJlZ19uZF9uYW1lX2RhdGEgewotCQlzdHJ1Y3QgIG5ldF9kZXZpY2UgKm9sZF9wbmV0ZGV2OwotCQljaGFyIG9sZF9pZm5hbWVbSUZOQU1TSVpdOwotCQl1OCBvbGRfaXBzX21vZGU7Ci0JCXU4IG9sZF9iUmVnVXNlTGVkOwotCX0gcmVyZWdfbmRfbmFtZV9wcml2OwotCiAJaW50IGJ1cDsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKIAlzdHJ1Y3QgaXdfc3RhdGlzdGljcyBpd3N0YXRzOwpAQCAtMjIzLDIzICsxNzEsMTIgQEAKIAl1OCBiUmVhZFBvcnRDYW5jZWw7CiAJdTggYldyaXRlUG9ydENhbmNlbDsKIAl1OCBiUnhSU1NJRGlzcGxheTsKLQkvKiBUaGUgZHJpdmVyIHdpbGwgc2hvdyB1cCB0aGUgZGVzaXJlZCBjaGFubmVsIG51bWJlcgotCSAqIHdoZW4gdGhpcyBmbGFnIGlzIDEuICovCi0JdTggYk5vdGlmeUNoYW5uZWxDaGFuZ2U7CiAKIAlzdHJ1Y3QgbXV0ZXggaHdfaW5pdF9tdXRleDsKLQotCXNwaW5sb2NrX3QgYnJfZXh0X2xvY2s7Ci0KLQl1OAlmaXhfcmF0ZTsKLQotCXVuc2lnbmVkIGNoYXIgICAgIGluX2N0YV90ZXN0OwogfTsKIAogI2RlZmluZSBhZGFwdGVyX3RvX2R2b2JqKGFkYXB0ZXIpIChhZGFwdGVyLT5kdm9iaikKIAotaW50IHJ0d19oYW5kbGVfZHVhbG1hYyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgYm9vbCBpbml0KTsKLQogc3RhdGljIGlubGluZSB1OCAqbXlpZChzdHJ1Y3QgZWVwcm9tX3ByaXYgKnBlZXByaXYpCiB7CiAJcmV0dXJuIHBlZXByaXYtPm1hY19hZGRyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2hhbF9pbnRmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvaGFsX2ludGYuaAppbmRleCBlYWY5MzliLi5mYTAzMmIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvaGFsX2ludGYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvaGFsX2ludGYuaApAQCAtNTgsNyArNTgsNiBAQAogCUhXX1ZBUl9TRUNfQ0ZHLAogCUhXX1ZBUl9CQ05fVkFMSUQsCiAJSFdfVkFSX1JGX1RZUEUsCi0JSFdfVkFSX0RNX0ZMQUcsCiAJSFdfVkFSX0RNX0ZVTkNfT1AsCiAJSFdfVkFSX0RNX0ZVTkNfU0VULAogCUhXX1ZBUl9ETV9GVU5DX0NMUiwKQEAgLTEzOSw4MSArMTM4LDYgQEAKIAlIQUxfTUFYX0lELAogfTsKIAotc3RydWN0IGhhbF9vcHMgewotCXUzMgkoKmhhbF9wb3dlcl9vbikoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLQl1MzIJKCpoYWxfaW5pdCkoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLQl1MzIJKCpoYWxfZGVpbml0KShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0Jdm9pZAkoKmZyZWVfaGFsX2RhdGEpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci0KLQl1MzIJKCppbmlycF9pbml0KShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotCXUzMgkoKmluaXJwX2RlaW5pdCkoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLQotCXMzMgkoKmluaXRfeG1pdF9wcml2KShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0JczMyCSgqaW5pdF9yZWN2X3ByaXYpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci0Jdm9pZAkoKmZyZWVfcmVjdl9wcml2KShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0Jdm9pZAkoKkluaXRTd0xlZHMpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci0Jdm9pZAkoKkRlSW5pdFN3TGVkcykoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLQotCXZvaWQJKCpkbV9pbml0KShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotCXZvaWQJKCpyZWFkX2NoaXBfdmVyc2lvbikoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLQotCXZvaWQJKCppbml0X2RlZmF1bHRfdmFsdWUpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci0KLQl2b2lkCSgqaW50Zl9jaGlwX2NvbmZpZ3VyZSkoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLQotCXZvaWQJKCpyZWFkX2FkYXB0ZXJfaW5mbykoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLQotCXMzMgkoKmludGVycnVwdF9oYW5kbGVyKShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0Jdm9pZAkoKnNldF9id21vZGVfaGFuZGxlcikoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICAgIGVudW0gaHRfY2hhbm5lbF93aWR0aCBCYW5kd2lkdGgsCi0JCQkJICAgICAgdTggT2Zmc2V0KTsKLQl2b2lkCSgqc2V0X2NoYW5uZWxfaGFuZGxlcikoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1OCBjaGFubmVsKTsKLQotCXZvaWQJKCpoYWxfZG1fd2F0Y2hkb2cpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci0KLQl2b2lkCSgqU2V0SHdSZWdIYW5kbGVyKShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHU4CXZhcmlhYmxlLAotCQkJCSAgIHU4ICp2YWwpOwotCXZvaWQJKCpHZXRId1JlZ0hhbmRsZXIpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTgJdmFyaWFibGUsCi0JCQkJICAgdTggKnZhbCk7Ci0KLQl1OAkoKkdldEhhbERlZlZhckhhbmRsZXIpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgICAgZW51bSBoYWxfZGVmX3ZhcmlhYmxlIGVWYXJpYWJsZSwKLQkJCQkgICAgICAgdm9pZCAqcFZhbHVlKTsKLQotCXZvaWQJKCpTZXRIYWxPRE1WYXJIYW5kbGVyKShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgICAgIGVudW0gaGFsX29kbV92YXJpYWJsZSBlVmFyaWFibGUsCi0JCQkJICAgICAgIHZvaWQgKnBWYWx1ZTEsIGJvb2wgYlNldCk7Ci0KLQl2b2lkCSgqVXBkYXRlUkFNYXNrSGFuZGxlcikoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICAgICB1MzIgbWFjX2lkLCB1OCByc3NpX2xldmVsKTsKLQl2b2lkCSgqU2V0QmVhY29uUmVsYXRlZFJlZ2lzdGVyc0hhbmRsZXIpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci0KLQl2b2lkCSgqQWRkX1JhdGVBVGlkKShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGJpdG1hcCwgdTggYXJnLAotCQkJCXU4IHJzc2lfbGV2ZWwpOwotCi0JdTgJKCpBbnREaXZCZWZvcmVMaW5rSGFuZGxlcikoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwotCXZvaWQJKCpBbnREaXZDb21wYXJlSGFuZGxlcikoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpkc3QsCi0JCQkJCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpzcmMpOwotCXMzMgkoKmhhbF94bWl0KShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpOwotCXMzMiAoKm1nbnRfeG1pdCkoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJIHN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lKTsKLQl1MzIJKCpyZWFkX3JmcmVnKShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICBlbnVtIHJmX3JhZGlvX3BhdGggZVJGUGF0aCwgdTMyIFJlZ0FkZHIsCi0JCQkgICAgICB1MzIgQml0TWFzayk7Ci0KLQl2b2lkICgqc3Jlc2V0X2luaXRfdmFsdWUpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci0JdTggKCpzcmVzZXRfZ2V0X3dpZmlfc3RhdHVzKShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0Jdm9pZCAoKmhhbF9ub3RjaF9maWx0ZXIpKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBib29sIGVuYWJsZSk7Ci0Jdm9pZCAoKmhhbF9yZXNldF9zZWN1cml0eV9lbmdpbmUpKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKLX07Ci0KIGVudW0gcnRfZWVwcm9tX3R5cGUgewogCUVFUFJPTV85M0M0NiwKIAlFRVBST01fOTNDNTYsCkBAIC0yMzUsNiArMTU5LDkgQEAKIAogI2RlZmluZSBpc19ib290X2Zyb21fZWVwcm9tKGFkYXB0ZXIpIChhZGFwdGVyLT5lZXByb21wcml2LkVlcHJvbU9yRWZ1c2UpCiAKK3ZvaWQgVXBkYXRlSGFsUkFNYXNrODE4OEVVc2Ioc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1MzIgbWFjX2lkLCB1OCByc3NpX2xldmVsKTsKK3UzMiBydGw4MTg4ZXVfaGFsX2RlaW5pdChzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlcik7Cit1MzIgcnRsODE4OGV1X2hhbF9pbml0KHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKTsKIHZvaWQgcnR3X2hhbF9kZWZfdmFsdWVfaW5pdChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwogCiB2b2lkCXJ0d19oYWxfZnJlZV9kYXRhKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CkBAIC0yNjIsNyArMTg5LDcgQEAKIAkJCSBib29sIGJTZXQpOwogCiB1MzIJcnR3X2hhbF9pbmlycF9pbml0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci11MzIJcnR3X2hhbF9pbmlycF9kZWluaXQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKK3ZvaWQJcnR3X2hhbF9pbmlycF9kZWluaXQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKIAogczMyCXJ0d19oYWxfeG1pdChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKTsKIHMzMglydHdfaGFsX21nbnRfeG1pdChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCkBAIC0yNzAsNyArMTk3LDcgQEAKIAogczMyCXJ0d19oYWxfaW5pdF94bWl0X3ByaXYoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKIAotczMyCXJ0d19oYWxfaW5pdF9yZWN2X3ByaXYoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKK2ludAlydHdfaGFsX2luaXRfcmVjdl9wcml2KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiB2b2lkCXJ0d19oYWxfZnJlZV9yZWN2X3ByaXYoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKIAogdm9pZCBydHdfaGFsX3VwZGF0ZV9yYV9tYXNrKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTMyIG1hY19pZCwgdTggbGV2ZWwpOwpAQCAtMjk2LDcgKzIyMyw2IEBACiB2b2lkIHJ0d19oYWxfc3Jlc2V0X2luaXQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKIAogdm9pZCBydHdfaGFsX25vdGNoX2ZpbHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgYm9vbCBlbmFibGUpOwotdm9pZCBydHdfaGFsX3Jlc2V0X3NlY3VyaXR5X2VuZ2luZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7CiAKIHZvaWQgaW5kaWNhdGVfd3hfc2Nhbl9jb21wbGV0ZV9ldmVudChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwogdTggcnR3X2RvX2pvaW4oc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9pZWVlODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9pZWVlODAyMTEuaAppbmRleCBkODI4NGM4Li5mYzU4NjIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvaWVlZTgwMjExLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2llZWU4MDIxMS5oCkBAIC0yMzksNyArMjM5LDcgQEAKIAkJCXUxNiBjYXBhYmlsaXR5OwogCQkJaW50IGZsYWdzOwogCQkJdTggdHhfc3VwcF9yYXRlc1sxNl07Ci0JCQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXAgaHRfY2FwOworCQkJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgaHRfY2FwOwogCQl9IGFkZF9zdGE7CiAJCXN0cnVjdCB7CiAJCQl1OAlyZXNlcnZlZFsyXTsvKiBmb3Igc2V0IG1heF9udW1fc3RhICovCkBAIC0yNjQsNyArMjY0LDcgQEAKIAl1MzIgc3RhX3NldDsKIAl1OCB0eF9zdXBwX3JhdGVzWzE2XTsKIAl1MzIgdHhfc3VwcF9yYXRlc19sZW47Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaHRfY2FwIGh0X2NhcDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCBodF9jYXA7CiAJdTY0CXJ4X3BrdHM7CiAJdTY0CXJ4X2J5dGVzOwogCXU2NAlyeF9kcm9wczsKQEAgLTI5MSw2MiArMjkxLDYgQEAKIC8qIHRoaXMgaXMgc3RvbGVuIGZyb20gaXB3MjIwMCBkcml2ZXIgKi8KICNkZWZpbmUgSUVFRV9JQlNTX01BQ19IQVNIX1NJWkUgMzEKIAotc3RydWN0IGllZWVfaWJzc19zZXEgewotCXU4IG1hY1tFVEhfQUxFTl07Ci0JdTE2IHNlcV9udW07Ci0JdTE2IGZyYWdfbnVtOwotCXVuc2lnbmVkIGxvbmcgcGFja2V0X3RpbWU7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotfTsKLQotc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyIHsKLQlfX2xlMTYgZnJhbWVfY3RsOwotCV9fbGUxNiBkdXJhdGlvbl9pZDsKLQl1OCBhZGRyMVtFVEhfQUxFTl07Ci0JdTggYWRkcjJbRVRIX0FMRU5dOwotCXU4IGFkZHIzW0VUSF9BTEVOXTsKLQl1MTYgc2VxX2N0bDsKLQl1OCBhZGRyNFtFVEhfQUxFTl07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIgewotCV9fbGUxNiBmcmFtZV9jdGw7Ci0JX19sZTE2IGR1cmF0aW9uX2lkOwotCXU4IGFkZHIxW0VUSF9BTEVOXTsKLQl1OCBhZGRyMltFVEhfQUxFTl07Ci0JdTggYWRkcjNbRVRIX0FMRU5dOwotCXUxNiBzZXFfY3RsOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyX3FvcyB7Ci0JX19sZTE2IGZyYW1lX2N0bDsKLQlfX2xlMTYgZHVyYXRpb25faWQ7Ci0JdTggYWRkcjFbRVRIX0FMRU5dOwotCXU4IGFkZHIyW0VUSF9BTEVOXTsKLQl1OCBhZGRyM1tFVEhfQUxFTl07Ci0JdTE2IHNlcV9jdGw7Ci0JdTggYWRkcjRbRVRIX0FMRU5dOwotCXUxNglxYzsKLX0gIF9fcGFja2VkOwotCi1zdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHJfcW9zIHsKLQlfX2xlMTYgZnJhbWVfY3RsOwotCV9fbGUxNiBkdXJhdGlvbl9pZDsKLQl1OCBhZGRyMVtFVEhfQUxFTl07Ci0JdTggYWRkcjJbRVRIX0FMRU5dOwotCXU4IGFkZHIzW0VUSF9BTEVOXTsKLQl1MTYgc2VxX2N0bDsKLQl1MTYgICAgIHFjOwotfSAgX19wYWNrZWQ7Ci0KLXN0cnVjdCBlYXBvbCB7Ci0JdTggc25hcFs2XTsKLQl1MTYgZXRoZXJ0eXBlOwotCXU4IHZlcnNpb247Ci0JdTggdHlwZTsKLQl1MTYgbGVuZ3RoOwotfSBfX3BhY2tlZDsKLQogZW51bSBlYXBfdHlwZSB7CiAJRUFQX1BBQ0tFVCA9IDAsCiAJRUFQT0xfU1RBUlQsCkBAIC01NTIsODMgKzQ5NiwxMiBAQAogI2RlZmluZSBJRUVFODAyMTFfTlVNX0NDS19SQVRFUwkJNAogI2RlZmluZSBJRUVFODAyMTFfT0ZETV9TSElGVF9NQVNLX0EJNAogCi0vKiBOT1RFOiBUaGlzIGRhdGEgaXMgZm9yIHN0YXRpc3RpY2FsIHB1cnBvc2VzOyBub3QgYWxsIGhhcmR3YXJlIHByb3ZpZGVzIHRoaXMKLSAqICAgICAgIGluZm9ybWF0aW9uIGZvciBmcmFtZXMgcmVjZWl2ZWQuICBOb3Qgc2V0dGluZyB0aGVzZSB3aWxsIG5vdCBjYXVzZQotICogICAgICAgYW55IGFkdmVyc2UgYWZmZWN0cy4gKi8KLXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgewotCS8qIHUzMiBtYWNfdGltZVsyXTsgKi8KLQlzOCByc3NpOwotCXU4IHNpZ25hbDsKLQl1OCBub2lzZTsKLQl1OCByZWNlaXZlZF9jaGFubmVsOwotCXUxNiByYXRlOyAvKiBpbiAxMDAga2JwcyAqLwotCS8qIHU4IGNvbnRyb2w7ICovCi0JdTggbWFzazsKLQl1OCBmcmVxOwotCXUxNiBsZW47Ci19OwotCiAvKiBJRUVFIDgwMi4xMSByZXF1aXJlcyB0aGF0IFNUQSBzdXBwb3J0cyBjb25jdXJyZW50IHJlY2VwdGlvbiBvZiBhdCBsZWFzdAogICogdGhyZWUgZnJhZ21lbnRlZCBmcmFtZXMuIFRoaXMgZGVmaW5lIGNhbiBiZSBpbmNyZWFzZWQgdG8gc3VwcG9ydCBtb3JlCiAgKiBjb25jdXJyZW50IGZyYW1lcywgYnV0IGl0IHNob3VsZCBiZSBub3RlZCB0aGF0IGVhY2ggZW50cnkgY2FuIGNvbnN1bWUgYWJvdXQKICAqIDIga0Igb2YgUkFNIGFuZCBpbmNyZWFzaW5nIGNhY2hlIHNpemUgd2lsbCBzbG93IGRvd24gZnJhbWUgcmVhc3NlbWJseS4gKi8KICNkZWZpbmUgSUVFRTgwMjExX0ZSQUdfQ0FDSEVfTEVOIDQKIAotc3RydWN0IGllZWU4MDIxMV9mcmFnX2VudHJ5IHsKLQl1MzIgZmlyc3RfZnJhZ190aW1lOwotCXVpbnQgc2VxOwotCXVpbnQgbGFzdF9mcmFnOwotCXVpbnQgcW9zOyAgIC8qIGphY2tzb24gKi8KLQl1aW50IHRpZDsJLyogamFja3NvbiAqLwotCXN0cnVjdCBza19idWZmICpza2I7Ci0JdTggc3JjX2FkZHJbRVRIX0FMRU5dOwotCXU4IGRzdF9hZGRyW0VUSF9BTEVOXTsKLX07Ci0KLXN0cnVjdCBpZWVlODAyMTFfc3RhdHMgewotCXVpbnQgdHhfdW5pY2FzdF9mcmFtZXM7Ci0JdWludCB0eF9tdWx0aWNhc3RfZnJhbWVzOwotCXVpbnQgdHhfZnJhZ21lbnRzOwotCXVpbnQgdHhfdW5pY2FzdF9vY3RldHM7Ci0JdWludCB0eF9tdWx0aWNhc3Rfb2N0ZXRzOwotCXVpbnQgdHhfZGVmZXJyZWRfdHJhbnNtaXNzaW9uczsKLQl1aW50IHR4X3NpbmdsZV9yZXRyeV9mcmFtZXM7Ci0JdWludCB0eF9tdWx0aXBsZV9yZXRyeV9mcmFtZXM7Ci0JdWludCB0eF9yZXRyeV9saW1pdF9leGNlZWRlZDsKLQl1aW50IHR4X2Rpc2NhcmRzOwotCXVpbnQgcnhfdW5pY2FzdF9mcmFtZXM7Ci0JdWludCByeF9tdWx0aWNhc3RfZnJhbWVzOwotCXVpbnQgcnhfZnJhZ21lbnRzOwotCXVpbnQgcnhfdW5pY2FzdF9vY3RldHM7Ci0JdWludCByeF9tdWx0aWNhc3Rfb2N0ZXRzOwotCXVpbnQgcnhfZmNzX2Vycm9yczsKLQl1aW50IHJ4X2Rpc2NhcmRzX25vX2J1ZmZlcjsKLQl1aW50IHR4X2Rpc2NhcmRzX3dyb25nX3NhOwotCXVpbnQgcnhfZGlzY2FyZHNfdW5kZWNyeXB0YWJsZTsKLQl1aW50IHJ4X21lc3NhZ2VfaW5fbXNnX2ZyYWdtZW50czsKLQl1aW50IHJ4X21lc3NhZ2VfaW5fYmFkX21zZ19mcmFnbWVudHM7Ci19OwotCi1zdHJ1Y3QgaWVlZTgwMjExX3NvZnRtYWNfc3RhdHMgewotCXVpbnQgcnhfYXNzX29rOwotCXVpbnQgcnhfYXNzX2VycjsKLQl1aW50IHJ4X3Byb2JlX3JxOwotCXVpbnQgdHhfcHJvYmVfcnM7Ci0JdWludCB0eF9iZWFjb25zOwotCXVpbnQgcnhfYXV0aF9ycTsKLQl1aW50IHJ4X2F1dGhfcnNfb2s7Ci0JdWludCByeF9hdXRoX3JzX2VycjsKLQl1aW50IHR4X2F1dGhfcnE7Ci0JdWludCBub19hdXRoX3JzOwotCXVpbnQgbm9fYXNzX3JzOwotCXVpbnQgdHhfYXNzX3JxOwotCXVpbnQgcnhfYXNzX3JxOwotCXVpbnQgdHhfcHJvYmVfcnE7Ci0JdWludCByZWFzc29jOwotCXVpbnQgc3d0eHN0b3A7Ci0JdWludCBzd3R4YXdha2U7Ci19OwotCiAjZGVmaW5lIFNFQ19LRVlfMQkoMTw8MCkKICNkZWZpbmUgU0VDX0tFWV8yCSgxPDwxKQogI2RlZmluZSBTRUNfS0VZXzMJKDE8PDIpCkBAIC02NDgsNDIgKzUyMSw2IEBACiAjZGVmaW5lIFdFUF9LRVlTIDQKICNkZWZpbmUgV0VQX0tFWV9MRU4gMTMKIAotc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSB7Ci0JdTE2IGFjdGl2ZV9rZXk6MiwKLQllbmFibGVkOjEsCi0JYXV0aF9tb2RlOjIsCi0JYXV0aF9hbGdvOjQsCi0JdW5pY2FzdF91c2VzX2dyb3VwOjE7Ci0JdTgga2V5X3NpemVzW1dFUF9LRVlTXTsKLQl1OCBrZXlzW1dFUF9LRVlTXVtXRVBfS0VZX0xFTl07Ci0JdTggbGV2ZWw7Ci0JdTE2IGZsYWdzOwotfSBfX3BhY2tlZDsKLQotLyoKLQotIDgwMi4xMSBkYXRhIGZyYW1lIGZyb20gQVAKLQotICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi1CeXRlcyB8ICAyICAgfCAgMiAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgICA2ICAgIHwgIDIgICB8IDAuLjIzMTIgfCAgIDQgIHwKLSAgICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfAotRGVzYy4gfCBjdHJsIHwgZHVyYSB8ICBEQS9SQSAgfCAgIFRBICAgIHwgICAgU0EgICB8IFNlcXUgfCAgZnJhbWUgIHwgIGZjcyB8Ci0gICAgICB8ICAgICAgfCB0aW9uIHwgKEJTU0lEKSB8CSB8CSB8IGVuY2UgfCAgZGF0YSAgIHwgICAgICB8Ci0gICAgICBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKLQotVG90YWw6IDI4LTIzNDAgYnl0ZXMKLQotKi8KLQotc3RydWN0IGllZWU4MDIxMV9oZWFkZXJfZGF0YSB7Ci0JdTE2IGZyYW1lX2N0bDsKLQl1MTYgZHVyYXRpb25faWQ7Ci0JdTggYWRkcjFbNl07Ci0JdTggYWRkcjJbNl07Ci0JdTggYWRkcjNbNl07Ci0JdTE2IHNlcV9jdHJsOwotfTsKLQogI2RlZmluZSBCRUFDT05fUFJPQkVfU1NJRF9JRF9QT1NJVElPTiAxMgogCiAvKiBNYW5hZ2VtZW50IEZyYW1lIEluZm9ybWF0aW9uIEVsZW1lbnQgVHlwZXMgKi8KQEAgLTcwMCw4MSArNTM3LDkgQEAKICNkZWZpbmUgTUZJRV9UWVBFX1JBVEVTX0VYCTUwCiAjZGVmaW5lIE1GSUVfVFlQRV9HRU5FUklDCTIyMQogCi1zdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIgewotCXU4IGlkOwotCXU4IGxlbjsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IHsKLQl1OCBpZDsKLQl1OCBsZW47Ci0JdTggZGF0YVswXTsKLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBUaGVzZSBhcmUgdGhlIGRhdGEgdHlwZXMgdGhhdCBjYW4gbWFrZSB1cCBtYW5hZ2VtZW50IHBhY2tldHMKLSAqCi0JdTE2IGF1dGhfYWxnb3JpdGhtOwotCXUxNiBhdXRoX3NlcXVlbmNlOwotCXUxNiBiZWFjb25faW50ZXJ2YWw7Ci0JdTE2IGNhcGFiaWxpdHk7Ci0JdTggY3VycmVudF9hcFtFVEhfQUxFTl07Ci0JdTE2IGxpc3Rlbl9pbnRlcnZhbDsKLQlzdHJ1Y3QgewotCQl1MTYgYXNzb2NpYXRpb25faWQ6MTQsIHJlc2VydmVkOjI7Ci0JfSBfX3BhY2tlZDsKLQl1MzIgdGltZV9zdGFtcFsyXTsKLQl1MTYgcmVhc29uOwotCXUxNiBzdGF0dXM7Ci0qLwotCiAjZGVmaW5lIElFRUU4MDIxMV9ERUZBVUxUX1RYX0VTU0lEICJQZW5ndWluIgogI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9CQVNJQ19SQVRFIDEwCiAKLXN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gewotCXN0cnVjdCBpZWVlODAyMTFfaGVhZGVyX2RhdGEgaGVhZGVyOwotCXUxNiBhbGdvcml0aG07Ci0JdTE2IHRyYW5zYWN0aW9uOwotCXUxNiBzdGF0dXM7Ci0JLyogc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnRfaGRyIGluZm9fZWxlbWVudDsgKi8KLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgewotCXN0cnVjdCBpZWVlODAyMTFfaGVhZGVyX2RhdGEgaGVhZGVyOwotCXUzMiB0aW1lX3N0YW1wWzJdOwotCXUxNiBiZWFjb25faW50ZXJ2YWw7Ci0JdTE2IGNhcGFiaWxpdHk7Ci0Jc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50OwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXF1ZXN0IHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hlYWRlcl9kYXRhIGhlYWRlcjsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSB7Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyIGhlYWRlcjsKLQl1MTYgY2FwYWJpbGl0eTsKLQl1MTYgbGlzdGVuX2ludGVydmFsOwotCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50X2hkciBpbmZvX2VsZW1lbnQ7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lIHsKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOwotCXUxNiBjYXBhYmlsaXR5OwotCXUxNiBzdGF0dXM7Ci0JdTE2IGFpZDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBpZWVlODAyMTFfdHhiIHsKLQl1OCBucl9mcmFnczsKLQl1OCBlbmNyeXB0ZWQ7Ci0JdTE2IHJlc2VydmVkOwotCXUxNiBmcmFnX3NpemU7Ci0JdTE2IHBheWxvYWRfc2l6ZTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqZnJhZ21lbnRzWzBdOwotfTsKLQotCiAvKiBTV0VFUCBUQUJMRSBFTlRSSUVTIE5VTUJFUiovCiAjZGVmaW5lIE1BWF9TV0VFUF9UQUJfRU5UUklFUwkJICA0MgogI2RlZmluZSBNQVhfU1dFRVBfVEFCX0VOVFJJRVNfUEVSX1BBQ0tFVCAgNwpAQCAtODcyLDExICs2MzcsNiBAQAogI2RlZmluZSBDRkdfSUVFRTgwMjExX1JFU0VSVkVfRkNTICgxPDwwKQogI2RlZmluZSBDRkdfSUVFRTgwMjExX0NPTVBVVEVfRkNTICgxPDwxKQogCi1zdHJ1Y3QgdHhfcGVuZGluZyB7Ci0JaW50IGZyYWc7Ci0Jc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YjsKLX07Ci0KICNkZWZpbmUgTUFYVElECTE2CiAKICNkZWZpbmUgSUVFRV9BCSAgICAoMTw8MCkKQEAgLTEwOTYsMjAgKzg1Niw4IEBACiAJU0NBID0gMSwgLyogc2Vjb25kYXJ5IGNoYW5uZWwgYWJvdmUgKi8KIAlTQ0IgPSAzLCAgLyogc2Vjb25kYXJ5IGNoYW5uZWwgYmVsb3cgKi8KIH07Ci11OCBzZWNvbmRhcnlfY2hfb2Zmc2V0X3RvX2hhbF9jaF9vZmZzZXQodTggY2hfb2Zmc2V0KTsKLXU4IGhhbF9jaF9vZmZzZXRfdG9fc2Vjb25kYXJ5X2NoX29mZnNldCh1OCBjaF9vZmZzZXQpOwotdTggKnJ0d19zZXRfaWVfY2hfc3dpdGNoKHU4ICpidWYsIHUzMiAqYnVmX2xlbiwgdTggY2hfc3dpdGNoX21vZGUsCi0JCQkgdTggbmV3X2NoLCB1OCBjaF9zd2l0Y2hfY250KTsKLXU4ICpydHdfc2V0X2llX3NlY29uZGFyeV9jaF9vZmZzZXQodTggKmJ1ZiwgdTMyICpidWZfbGVuLAotCQkJCSAgIHU4IHNlY29uZGFyeV9jaF9vZmZzZXQpOwotdTggKnJ0d19zZXRfaWVfbWVzaF9jaF9zd2l0Y2hfcGFybSh1OCAqYnVmLCB1MzIgKmJ1Zl9sZW4sIHU4IHR0bCwKLQkJCQkgICB1OCBmbGFncywgdTE2IHJlYXNvbiwgdTE2IHByZWNlZGVuY2UpOwogCiB1OCAqcnR3X2dldF9pZSh1OCAqcGJ1ZiwgaW50IGluZGV4LCBpbnQgKmxlbiwgaW50IGxpbWl0KTsKLXU4ICpydHdfZ2V0X2llX2V4KHU4ICppbl9pZSwgdWludCBpbl9sZW4sIHU4IGVpZCwgdTggKm91aSwKLQkJICB1OCBvdWlfbGVuLCB1OCAqaWUsIHVpbnQgKmllbGVuKTsKLWludCBydHdfaWVzX3JlbW92ZV9pZSh1OCAqaWVzLCB1aW50ICppZXNfbGVuLCB1aW50IG9mZnNldCwKLQkJICAgICAgdTggZWlkLCB1OCAqb3VpLCB1OCBvdWlfbGVuKTsKIAogdm9pZCBydHdfc2V0X3N1cHBvcnRlZF9yYXRlKHU4ICpTdXBwb3J0ZWRSYXRlcywgdWludCBtb2RlKTsKIApAQCAtMTEzMywxOSArODgxLDYgQEAKIHU4ICpydHdfZ2V0X3dwc19hdHRyX2NvbnRlbnQodTggKndwc19pZSwgdWludCB3cHNfaWVsZW4sIHUxNiB0YXJnZXRfYXR0cl9pZCwKIAkJCSAgICAgdTggKmJ1Zl9jb250ZW50LCB1aW50ICpsZW5fY29udGVudCk7CiAKLS8qKgotICogZm9yX2VhY2hfaWUgLSBpdGVyYXRlIG92ZXIgY29udGludW91cyBJRXMKLSAqIEBpZToKLSAqIEBidWY6Ci0gKiBAYnVmX2xlbjoKLSAqLwotI2RlZmluZSBmb3JfZWFjaF9pZShpZSwgYnVmLCBidWZfbGVuKSBcCi0JZm9yIChpZSA9ICh2b2lkICopYnVmOyAoKCh1OCAqKWllKSAtICgodTggKilidWYpICsgMSkgPCBidWZfbGVuOwlcCi0JCWllID0gKHZvaWQgKikoKCh1OCAqKWllKSArICooKCh1OCAqKWllKSsxKSArIDIpKQotCi12b2lkIGR1bXBfaWVzKHU4ICpidWYsIHUzMiBidWZfbGVuKTsKLXZvaWQgZHVtcF93cHNfaWUodTggKmllLCB1MzIgaWVfbGVuKTsKLQogdWludAlydHdfZ2V0X3JhdGVzZXRfbGVuKHU4CSpyYXRlc2V0KTsKIAogc3RydWN0IHJlZ2lzdHJ5X3ByaXY7CkBAIC0xMTY3LDggKzkwMiw0IEBACiB1MTYgcnR3X21jc19yYXRlKHU4IHJmX3R5cGUsIHU4IGJ3XzQwTUh6LCB1OCBzaG9ydF9HSV8yMCwgdTggc2hvcnRfR0lfNDAsCiAJCSB1bnNpZ25lZCBjaGFyICpNQ1NfcmF0ZSk7CiAKLWludCBydHdfYWN0aW9uX2ZyYW1lX3BhcnNlKGNvbnN0IHU4ICpmcmFtZSwgdTMyIGZyYW1lX2xlbiwgdTggKmNhdGVnb3J5LAotCQkJICAgdTggKmFjdGlvbik7Ci1jb25zdCBjaGFyICphY3Rpb25fcHVibGljX3N0cih1OCBhY3Rpb24pOwotCiAjZW5kaWYgLyogSUVFRTgwMjExX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9vZG0uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9vZG0uaAppbmRleCBkYmViZjE3Li44MDVmNTJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvb2RtLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL29kbS5oCkBAIC0zMTUsMjIgKzMxNSw2IEBACiAJT0RNX1BTRDJBRkgJCT0gMHgwMDAwMDgwMAogfTsKIAotLyogIDIwMTEvMjAvMjAgTUggRm9yIE1QIGRyaXZlciBSVF9XTEFOX1NUQSA9ICBzdHJ1Y3Qgc3RhX2luZm8gKi8KLS8qICBQbGVhc2UgZGVjbGFyZSBiZWxvdyBPRE0gcmVsYXRpdmUgaW5mbyBpbiB5b3VyIFNUQSBpbmZvIHN0cnVjdHVyZS4gKi8KLQotc3RydWN0IG9kbV9zdGFfaW5mbyB7Ci0JLyogIERyaXZlciBXcml0ZSAqLwotCWJvb2wJYlVzZWQ7CQkvKiAgcmVjb3JkIHRoZSBzdGEgc3RhdHVzIGxpbmsgb3Igbm90PyAqLwotCXU4CUlPVFBlZXI7CS8qICBFbnVtIHZhbHVlLglIVF9JT1RfUEVFUl9FICovCi0KLQkvKiAgT0RNIFdyaXRlICovCi0JLyogMSBQSFlfU1RBVFVTX0lORk8gKi8KLQl1OAlSU1NJX1BhdGhbNF07CQkvKiAgKi8KLQl1OAlSU1NJX0F2ZTsKLQl1OAlSWEVWTVs0XTsKLQl1OAlSWFNOUls0XTsKLX07Ci0KIC8qICAyMDExLzEwLzIwIE1IIERlZmluZSBDb21tb24gaW5mbyBlbnVtIGZvciBhbGwgdGVhbS4gKi8KIAogZW51bSBvZG1fY29tbW9uX2luZm9fZGVmIHsKQEAgLTc0MCw4ICs3MjQsNiBAQAogCXUzMglTdXBwb3J0SUNUeXBlOwogCS8qICBDdXQgVmVyc2lvbiBUZXN0Q2hpcC9BLWN1dC9CLWN1dC4uLiA9IDAvMS8yLzMvLi4uICovCiAJdTgJQ3V0VmVyc2lvbjsKLQkvKiAgUkYgVHlwZSA0VDRSLzNUM1IvMlQyUi8xVDJSLzFUMVIvLi4uICovCi0JdTgJUkZUeXBlOwogCS8qICBCb2FyZCBUeXBlIE5vcm1hbC9IaWdoUG93ZXIvTWluaUNhcmQvU0xJTS9Db21iby8uID0gMC8xLzIvMy80Ly4gKi8KIAl1OAlCb2FyZFR5cGU7CiAJLyogIHdpdGggZXh0ZXJuYWwgTE5BICBOTy9ZZXMgPSAwLzEgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9vc2RlcF9pbnRmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvb3NkZXBfaW50Zi5oCmluZGV4IDU0ZmNhNzkuLmRiZDdkYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9vc2RlcF9pbnRmLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL29zZGVwX2ludGYuaApAQCAtMzQsNyArMzQsNiBAQAogaW50IHJ0d19pbml0X25ldGRldl9uYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2LCBjb25zdCBjaGFyICppZm5hbWUpOwogc3RydWN0IG5ldF9kZXZpY2UgKnJ0d19pbml0X25ldGRldihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwogdTE2IHJ0d19yZWN2X3NlbGVjdF9xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLXZvaWQgcnR3X3Byb2NfcmVtb3ZlX29uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAogaW50IHBtX25ldGRldl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2LCB1OCBibm9ybWFsKTsKIHZvaWQgcnR3X2lwc19kZXZfdW5sb2FkKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvb3NkZXBfc2VydmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL29zZGVwX3NlcnZpY2UuaAppbmRleCA1NDc1OTU2Li45MDQ3YjZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvb3NkZXBfc2VydmljZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9vc2RlcF9zZXJ2aWNlLmgKQEAgLTM1LDcgKzM1LDcgQEAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KQEAgLTQ0LDcgKzQ0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4JLyogIE5lY2Vzc2FyeSBiZWNhdXNlIHdlIHVzZSB0aGUgcHJvYyBmcyAqLwogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgkvKiAgZm9yIHN0cnVjdCB0YXNrbGV0X3N0cnVjdCAqLwogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgpAQCAtNzgsMTYgKzc3LDEyIEBACiAKIHZvaWQgKnJ0d19tYWxsb2MyZChpbnQgaCwgaW50IHcsIGludCBzaXplKTsKIAotdTMyICBfcnR3X2Rvd25fc2VtYShzdHJ1Y3Qgc2VtYXBob3JlICpzZW1hKTsKLQogdm9pZCBfcnR3X2luaXRfcXVldWUoc3RydWN0IF9fcXVldWUgKnBxdWV1ZSk7CiAKIHN0cnVjdCBydHdfbmV0ZGV2X3ByaXZfaW5kaWNhdG9yIHsKIAl2b2lkICpwcml2OwotCXUzMiBzaXplb2ZfcHJpdjsKIH07Ci1zdHJ1Y3QgbmV0X2RldmljZSAqcnR3X2FsbG9jX2V0aGVyZGV2X3dpdGhfb2xkX3ByaXYoaW50IHNpemVvZl9wcml2LAotCQkJCQkJICAgIHZvaWQgKm9sZF9wcml2KTsKK3N0cnVjdCBuZXRfZGV2aWNlICpydHdfYWxsb2NfZXRoZXJkZXZfd2l0aF9vbGRfcHJpdih2b2lkICpvbGRfcHJpdik7CiAKICNkZWZpbmUgcnR3X25ldGRldl9wcml2KG5ldGRldikJCQkJCVwKIAkoKChzdHJ1Y3QgcnR3X25ldGRldl9wcml2X2luZGljYXRvciAqKW5ldGRldl9wcml2KG5ldGRldikpLT5wcml2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3BoeS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3BoeS5oCmluZGV4IDlhOWFiODIuLmNkMzg3ZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9waHkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcGh5LmgKQEAgLTExLDE3ICsxMSwxMyBAQAogCiB1MzIgcGh5X3F1ZXJ5X2JiX3JlZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHUzMiByZWdhZGRyLCB1MzIgYml0bWFzayk7CiB2b2lkIHBoeV9zZXRfYmJfcmVnKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTMyIHJlZ2FkZHIsIHUzMiBiaXRtYXNrLCB1MzIgZGF0YSk7Ci11MzIgcGh5X3F1ZXJ5X3JmX3JlZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIGVudW0gcmZfcmFkaW9fcGF0aCByZl9wYXRoLAordTMyIHJ0d19oYWxfcmVhZF9yZnJlZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIGVudW0gcmZfcmFkaW9fcGF0aCByZl9wYXRoLAogCQkgICAgIHUzMiByZWdfYWRkciwgdTMyIGJpdF9tYXNrKTsKIHZvaWQgcGh5X3NldF9yZl9yZWcoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBlbnVtIHJmX3JhZGlvX3BhdGggcmZfcGF0aCwKIAkJICAgIHUzMiByZWdfYWRkciwgdTMyIGJpdF9tYXNrLCB1MzIgZGF0YSk7CiAKIHZvaWQgcGh5X3NldF90eF9wb3dlcl9sZXZlbChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHU4IGNoYW5uZWwpOwogCi12b2lkIHBoeV9zZXRfYndfbW9kZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIGVudW0gaHRfY2hhbm5lbF93aWR0aCBiYW5kd2lkdGgsCi0JCSAgICAgdW5zaWduZWQgY2hhciBvZmZzZXQpOwotdm9pZCBwaHlfc3dfY2hubChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHU4IGNoYW5uZWwpOwotCiB2b2lkIHJ0bDg4ZXVfZG1fdHhwb3dlcl90cmFja19hZGp1c3Qoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKmRtX29kbSwKIAkJCQkgICAgIHU4IHR5cGUsIHU4ICpkaXIsIHUzMiAqb3V0X3dyaXRlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3JlY3Zfb3NkZXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9yZWN2X29zZGVwLmgKaW5kZXggY2FkMzE1OC4uNzU1MGQ1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3JlY3Zfb3NkZXAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcmVjdl9vc2RlcC5oCkBAIC0yNiwxMyArMjYsOSBAQAogczMyICBydHdfcmVjdl9lbnRyeShzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwogaW50IHJ0d19yZWN2X2luZGljYXRlcGt0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAogCQkJIHN0cnVjdCByZWN2X2ZyYW1lICpyZWN2X2ZyYW1lKTsKLXZvaWQgcnR3X3JlY3ZfcmV0dXJucGFja2V0KHN0cnVjdCAgbmV0X2RldmljZSAqY254dCwgc3RydWN0IHNrX2J1ZmYgKnJldHBrdCk7CiAKIHZvaWQgcnR3X2hhbmRsZV90a2lwX21pY19lcnIoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1OCBiZ3JvdXApOwogCi1pbnQgcnR3X2luaXRfcmVjdl9wcml2KHN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiwgc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnR3X2ZyZWVfcmVjdl9wcml2KHN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdik7Ci0KIHZvaWQgcnR3X29zX3JlY3ZfcmVzb3VyY2VfYWxsb2Moc3RydWN0IHJlY3ZfZnJhbWUgKnJlY3Zmcik7CiAKIGludCBydHdfb3NfcmVjdmJ1Zl9yZXNvdXJjZV9hbGxvYyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHN0cnVjdCByZWN2X2J1ZiAqYnVmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV9jbWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV9jbWQuaAppbmRleCA0ZDdkODA0Li4wNDJiNGVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfY21kLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX2NtZC5oCkBAIC00OSwxMiArNDksNiBAQAogCSBIMkNfUkVTRVRfVFNGCQkJPSAweGMwLAogfTsKIAotc3RydWN0IGNtZF9tc2dfcGFybSB7Ci0JdTggZWlkOyAvKiBlbGVtZW50IGlkICovCi0JdTggc3o7IC8qICBzeiAqLwotCXU4IGJ1Zls2XTsKLX07Ci0KIGVudW0gewogCVBXUlMKIH07CkBAIC02NywxNSArNjEsNiBAQAogCXU4IFB3clN0YXRlOy8qIEFsbE9OKDB4MGMpLFJGT04oMHgwNCksUkZPRkYoMHgwMCkgKi8KIH07CiAKLXN0cnVjdCBIMkNfU1NfUkZPRkZfUEFSQU0gewotCXU4IFJPRk9uOyAvKiAgMTogb24sIDA6b2ZmICovCi0JdTE2IGdwaW9fcGVyaW9kOyAvKiAgdW5pdDogMTAyNCB1cyAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGpvaW5ic3NycHRfcGFybSB7Ci0JdTggT3BNb2RlOwkvKiAgUlRfTUVESUFfU1RBVFVTICovCi19OwotCiBzdHJ1Y3QgcnN2ZHBhZ2VfbG9jIHsKIAl1OCBMb2NQcm9iZVJzcDsKIAl1OCBMb2NQc1BvbGw7CkBAIC04NCwyNiArNjksOSBAQAogCXU4IExvY0JUUW9zTnVsbDsKIH07CiAKLXN0cnVjdCBQMlBfUFNfT2ZmbG9hZF90IHsKLQl1OCBPZmZsb2FkX0VuOjE7Ci0JdTggcm9sZToxOyAvKiAgMTogT3duZXIsIDA6IENsaWVudCAqLwotCXU4IENUV2luZG93X0VuOjE7Ci0JdTggTm9BMF9FbjoxOwotCXU4IE5vQTFfRW46MTsKLQl1OCBBbGxTdGFTbGVlcDoxOyAvKiAgT25seSB2YWxpZCBpbiBPd25lciAqLwotCXU4IGRpc2NvdmVyeToxOwotCXU4IHJzdmQ6MTsKLX07Ci0KLXN0cnVjdCBQMlBfUFNfQ1RXUGVyaW9kX3QgewotCXU4IENUV1BlcmlvZDsJLyogVFUgKi8KLX07Ci0KIC8qICBob3N0IG1lc3NhZ2UgdG8gZmlybXdhcmUgY21kICovCiB2b2lkIHJ0bDgxODhlX3NldF9Gd1B3ck1vZGVfY21kKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTggTW9kZSk7CiB2b2lkIHJ0bDgxODhlX3NldF9Gd0pvaW5Cc3NSZXBvcnRfY21kKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTggbXN0YXR1cyk7Ci12b2lkIHJ0bDgxODhlX0FkZF9SYXRlQVRpZChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiBiaXRtYXAsIHU4IGFyZywKLQkJCSAgIHU4IHJzc2lfbGV2ZWwpOwogCiB2b2lkIHJ0bDgxODhlX3NldF9Gd01lZGlhU3RhdHVzX2NtZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIF9fbGUxNiBtc3RhdHVzX3JwdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV9kbS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX2RtLmgKaW5kZXggNDE5MDExMi4uYzBmZmQ5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX2RtLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX2RtLmgKQEAgLTQ1LDEyICs0NSw5IEBACiAJdTgJUG93ZXJJbmRleF9iYWNrdXBbNl07CiB9OwogCi12b2lkIHJ0bDgxODhlX2luaXRfZG1fcHJpdihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpOwogdm9pZCBydGw4MTg4ZV9Jbml0SGFsRG0oc3RydWN0IGFkYXB0ZXIgKmFkYXB0KTsKLXZvaWQgcnRsODE4OGVfSGFsRG1XYXRjaERvZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpOwogCiB2b2lkIEFudERpdkNvbXBhcmU4MTg4RShzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpkc3QsCiAJCQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqc3JjKTsKLXU4IEFudERpdkJlZm9yZUxpbms4MTg4RShzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV9oYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV9oYWwuaAppbmRleCA5ZGQ1YzI5Li43YzgxZTNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfaGFsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX2hhbC5oCkBAIC0yMDIsNyArMjAyLDYgQEAKIAogCS8qIHJmX2N0cmwgKi8KIAl1OAlyZl9jaGlwOwotCXU4CXJmX3R5cGU7CiAJdTgJTnVtVG90YWxSRlBhdGg7CiAKIAl1OAlCb2FyZFR5cGU7CkBAIC0zNTEsMTAgKzM1MCw2IEBACiAJdTgJVXNiUnhBZ2dQYWdlVGltZW91dDsKIH07CiAKLSNkZWZpbmUgR0VUX0hBTF9EQVRBKF9fcEFkYXB0ZXIpCQkJCVwKLQkoKHN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqKSgoX19wQWRhcHRlciktPkhhbERhdGEpKQotI2RlZmluZSBHRVRfUkZfVFlQRShwcml2KQkJKEdFVF9IQUxfREFUQShwcml2KS0+cmZfdHlwZSkKLQogLyogIHJ0bDgxODhlX2hhbF9pbml0LmMgKi8KIHZvaWQgXzgwNTFSZXNldDg4RShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwogdm9pZCBydGw4MTg4ZV9Jbml0aWFsaXplRmlybXdhcmVWYXJzKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CkBAIC0zODUsOCArMzgwLDYgQEAKIHZvaWQgSGFsX1JlYWRQb3dlclNhdmluZ01vZGU4OEUoc3RydWN0IGFkYXB0ZXIgKnBBZGFwdGVyLCB1OCAqaHdpbmZvLAogCQkJCWJvb2wgQXV0b0xvYWRGYWlsKTsKIAotdm9pZCBydGw4MTg4ZV9zZXRfaGFsX29wcyhzdHJ1Y3QgaGFsX29wcyAqcEhhbEZ1bmMpOwotCiAvKiAgcmVnaXN0ZXIgKi8KIAogdm9pZCBydGw4MTg4ZV9zdGFydF90aHJlYWQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV9sZWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV9sZWQuaAppbmRleCBmY2E2ZDhjLi5kMWFkNmFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfbGVkLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX2xlZC5oCkBAIC0yMiw4ICsyMiw2IEBACiAvKiAgKi8KIC8qICBJbnRlcmZhY2UgdG8gbWFuaXB1bGF0ZSBMRUQgb2JqZWN0cy4gKi8KIC8qICAqLwotdm9pZCBydGw4MTg4ZXVfSW5pdFN3TGVkcyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydGw4MTg4ZXVfRGVJbml0U3dMZWRzKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiB2b2lkIFN3TGVkT24oc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgTEVEXzg3MXggKnBMZWQpOwogdm9pZCBTd0xlZE9mZihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBMRURfODcxeCAqcExlZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV9yZWN2LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfcmVjdi5oCmluZGV4IDU0MDQ4YmMuLjgwODMyYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV9yZWN2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX3JlY3YuaApAQCAtNTEsMTIgKzUxLDExIEBACiB9OwogCiAjZGVmaW5lIElOVEVSUlVQVF9NU0dfRk9STUFUX0xFTiA2MAotczMyIHJ0bDgxODhldV9pbml0X3JlY3ZfcHJpdihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydGw4MTg4ZXVfZnJlZV9yZWN2X3ByaXYoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKIHZvaWQgcnRsODE4OGV1X3JlY3ZfaGRsKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfYnVmICpwcmVjdmJ1Zik7CiB2b2lkIHJ0bDgxODhldV9yZWN2X3Rhc2tsZXQodm9pZCAqcHJpdik7CiB2b2lkIHJ0bDgxODhlX3F1ZXJ5X3J4X3BoeV9zdGF0dXMoc3RydWN0IHJlY3ZfZnJhbWUgKmZyLCBzdHJ1Y3QgcGh5X3N0YXQgKnBoeSk7Ci12b2lkIHJ0bDgxODhlX3Byb2Nlc3NfcGh5X2luZm8oc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB2b2lkICpwcmZyYW1lKTsKK3ZvaWQgcnRsODE4OGVfcHJvY2Vzc19waHlfaW5mbyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCisJCQkgICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZnJhbWUpOwogdm9pZCB1cGRhdGVfcmVjdmZyYW1lX3BoeWluZm9fODhlKHN0cnVjdCByZWN2X2ZyYW1lICpmcmEsIHN0cnVjdCBwaHlfc3RhdCAqcGh5KTsKIHZvaWQgdXBkYXRlX3JlY3ZmcmFtZV9hdHRyaWJfODhlKHN0cnVjdCByZWN2X2ZyYW1lICpmcmEsCiAJCQkJIHN0cnVjdCByZWN2X3N0YXQgKnN0YXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX3htaXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV94bWl0LmgKaW5kZXggNjVhNjNkZi4uNjYyMDViNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX3htaXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfeG1pdC5oCkBAIC0xNTQsMTQgKzE1NCwxMSBAQAogdm9pZCBydGw4MTg4ZV9maWxsX2Zha2VfdHhkZXNjKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTggKnBEZXNjLAogCQkJICAgICAgIHUzMiBCdWZmZXJMZW4sIHU4IElzUHNQb2xsLCB1OCBJc0JUUW9zTnVsbCk7CiBzMzIgcnRsODE4OGV1X2luaXRfeG1pdF9wcml2KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci1zMzIgcnRsODE4OGV1X2hhbF94bWl0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHhtaXRfZnJhbWUgKmZyYW1lKTsKLXMzMiBydGw4MTg4ZXVfbWdudF94bWl0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHhtaXRfZnJhbWUgKmZyYW1lKTsKIHMzMiBydGw4MTg4ZXVfeG1pdF9idWZfaGFuZGxlcihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwogI2RlZmluZSBoYWxfeG1pdF9oYW5kbGVyIHJ0bDgxODhldV94bWl0X2J1Zl9oYW5kbGVyCiB2b2lkIHJ0bDgxODhldV94bWl0X3Rhc2tsZXQodm9pZCAqcHJpdik7CiBzMzIgcnRsODE4OGV1X3htaXRmcmFtZV9jb21wbGV0ZShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJIHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiwKLQkJCQkgc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1Zik7CisJCQkJIHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdik7CiAKIHZvaWQgZHVtcF90eHJwdF9jY3hfODhlKHZvaWQgKmJ1Zik7CiB2b2lkIGhhbmRsZV90eHJwdF9jY3hfODhlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1OCAqYnVmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfYXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfYXAuaAppbmRleCBiODIwNjg0Li5lOGRkNmQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2FwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19hcC5oCkBAIC01MCw3ICs1MCw2IEBACiB1OCBhcF9mcmVlX3N0YShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSwKIAkgICAgICAgYm9vbCBhY3RpdmUsIHUxNiByZWFzb24pOwogaW50IHJ0d19zdGFfZmx1c2goc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLWludCBydHdfYXBfaW5mb3JtX2NoX3N3aXRjaChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHU4IG5ld19jaCwgdTggY2hfb2Zmc2V0KTsKIHZvaWQgc3RhcnRfYXBfbW9kZShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwogdm9pZCBzdG9wX2FwX21vZGUoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKICNlbmRpZiAvKiBlbmQgb2YgQ09ORklHXzg4RVVfQVBfTU9ERSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19jbWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfY21kLmgKaW5kZXggMDhjYTU5Mi4uMThhNjUzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19jbWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2NtZC5oCkBAIC0zOSw4ICszOSw4IEBACiB9OwogCiBzdHJ1Y3QgY21kX3ByaXYgewotCXN0cnVjdCBzZW1hcGhvcmUgY21kX3F1ZXVlX3NlbWE7Ci0Jc3RydWN0IHNlbWFwaG9yZSB0ZXJtaW5hdGVfY21kdGhyZWFkX3NlbWE7CisJc3RydWN0IGNvbXBsZXRpb24gY21kX3F1ZXVlX2NvbXA7CisJc3RydWN0IGNvbXBsZXRpb24gdGVybWluYXRlX2NtZHRocmVhZF9jb21wOwogCXN0cnVjdCBfX3F1ZXVlIGNtZF9xdWV1ZTsKIAl1OCBjbWR0aGRfcnVubmluZzsKIAlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXI7CkBAIC0yMTAsMzQgKzIxMCw2IEBACiB9OwogCiAvKgotCUNhbGxlciBBZC1Ib2MvQVAKLQotCUNvbW1hbmQgbW9kZQotCi0JVGhpcyBpcyB0byBmb3JjZSBmdyB0byBkZWwgYW4gc3RhX2RhdGEgZW50cnkgcGVyIGRyaXZlcidzIHJlcXVlc3QKLQotCUZXIHdpbGwgaW52YWxpZGF0ZSB0aGUgY2FtIGVudHJ5IGFzc29jaWF0ZWQgd2l0aCBpdC4KLQotKi8KLXN0cnVjdCBkZWxfYXNzb2NzdGFfcGFybSB7Ci0JdTgJYWRkcltFVEhfQUxFTl07Ci19OwotCi0vKgotQ2FsbGVyIE1vZGU6IEFQL0FkLUhvQyhNKQotCi1Ob3RlczogVG8gbm90aWZ5IGZ3IHRoYXQgZ2l2ZW4gc3RhaWQgaGFzIGNoYW5nZWQgaXRzIHBvd2VyIHN0YXRlCi0KLUNvbW1hbmQgTW9kZQotCi0qLwotc3RydWN0IHNldHN0YXB3cnN0YXRlX3Bhcm0gewotCXU4CXN0YWlkOwotCXU4CXN0YXR1czsKLQl1OAlod2FkZHJbNl07Ci19OwotCi0vKgogCU5vdGVzOiBUaGlzIGNvbW1hbmQgaXMgdXNlZCBmb3IgSDJDL0MySCBsb29wYmFjayB0ZXN0aW5nCiAKIAltYWNbMF0gPT0gMApAQCAtMzEyLDggKzI4NCw2IEBACiAJdTggY2hhbm5lbF9wbGFuOwogfTsKIAotI2RlZmluZSBHRU5fQ01EX0NPREUoY21kKQljbWQgIyMgX0NNRF8KLQogLyoKIAogUmVzdWx0OgpAQCAtMzc2LDQyICszNDYsNDIgQEAKIH07CiAKIGVudW0gcnR3X2gyY19jbWQgewotCUdFTl9DTURfQ09ERShfSm9pbkJzcyksCi0JR0VOX0NNRF9DT0RFKF9EaXNDb25uZWN0KSwKLQlHRU5fQ01EX0NPREUoX0NyZWF0ZUJzcyksCi0JR0VOX0NNRF9DT0RFKF9TZXRPcE1vZGUpLAotCUdFTl9DTURfQ09ERShfU2l0ZVN1cnZleSksCi0JR0VOX0NNRF9DT0RFKF9TZXRBdXRoKSwKLQlHRU5fQ01EX0NPREUoX1NldEtleSksCi0JR0VOX0NNRF9DT0RFKF9TZXRTdGFLZXkpLAotCUdFTl9DTURfQ09ERShfU2V0QXNzb2NTdGEpLAotCUdFTl9DTURfQ09ERShfQWRkQkFSZXEpLAotCUdFTl9DTURfQ09ERShfU2V0Q2hhbm5lbCksCi0JR0VOX0NNRF9DT0RFKF9UWF9CZWFjb24pLAotCUdFTl9DTURfQ09ERShfU2V0X01MTUVfRVZUKSwKLQlHRU5fQ01EX0NPREUoX1NldF9EcnZfRXh0cmEpLAotCUdFTl9DTURfQ09ERShfU2V0Q2hhbm5lbFBsYW4pLAorCV9Kb2luQnNzX0NNRF8sCisJX0Rpc0Nvbm5lY3RfQ01EXywKKwlfQ3JlYXRlQnNzX0NNRF8sCisJX1NldE9wTW9kZV9DTURfLAorCV9TaXRlU3VydmV5X0NNRF8sCisJX1NldEF1dGhfQ01EXywKKwlfU2V0S2V5X0NNRF8sCisJX1NldFN0YUtleV9DTURfLAorCV9TZXRBc3NvY1N0YV9DTURfLAorCV9BZGRCQVJlcV9DTURfLAorCV9TZXRDaGFubmVsX0NNRF8sCisJX1RYX0JlYWNvbl9DTURfLAorCV9TZXRfTUxNRV9FVlRfQ01EXywKKwlfU2V0X0Rydl9FeHRyYV9DTURfLAorCV9TZXRDaGFubmVsUGxhbl9DTURfLAogCiAJTUFYX0gyQ0NNRAogfTsKIAogI2lmZGVmIF9SVFdfQ01EX0NfCiBzdGF0aWMgc3RydWN0IF9jbWRfY2FsbGJhY2sJcnR3X2NtZF9jYWxsYmFja1tdID0gewotCXtHRU5fQ01EX0NPREUoX0pvaW5Cc3MpLCAmcnR3X2pvaW5ic3NfY21kX2NhbGxiYWNrfSwKLQl7R0VOX0NNRF9DT0RFKF9EaXNDb25uZWN0KSwgJnJ0d19kaXNhc3NvY19jbWRfY2FsbGJhY2t9LAotCXtHRU5fQ01EX0NPREUoX0NyZWF0ZUJzcyksICZydHdfY3JlYXRlYnNzX2NtZF9jYWxsYmFja30sCi0Je0dFTl9DTURfQ09ERShfU2V0T3BNb2RlKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfU2l0ZVN1cnZleSksICZydHdfc3VydmV5X2NtZF9jYWxsYmFja30sCi0Je0dFTl9DTURfQ09ERShfU2V0QXV0aCksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX1NldEtleSksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX1NldFN0YUtleSksICZydHdfc2V0c3RhS2V5X2NtZHJzcF9jYWxsYmFja30sCi0Je0dFTl9DTURfQ09ERShfU2V0QXNzb2NTdGEpLCAmcnR3X3NldGFzc29jc3RhX2NtZHJzcF9jYWxsYmFja30sCi0Je0dFTl9DTURfQ09ERShfQWRkQkFSZXEpLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9TZXRDaGFubmVsKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfVFhfQmVhY29uKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfU2V0X01MTUVfRVZUKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfU2V0X0Rydl9FeHRyYSksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX1NldENoYW5uZWxQbGFuKSwgTlVMTH0sCisJe19Kb2luQnNzX0NNRF8sICZydHdfam9pbmJzc19jbWRfY2FsbGJhY2t9LAorCXtfRGlzQ29ubmVjdF9DTURfLCAmcnR3X2Rpc2Fzc29jX2NtZF9jYWxsYmFja30sCisJe19DcmVhdGVCc3NfQ01EXywgJnJ0d19jcmVhdGVic3NfY21kX2NhbGxiYWNrfSwKKwl7X1NldE9wTW9kZV9DTURfLCBOVUxMfSwKKwl7X1NpdGVTdXJ2ZXlfQ01EXywgJnJ0d19zdXJ2ZXlfY21kX2NhbGxiYWNrfSwKKwl7X1NldEF1dGhfQ01EXywgTlVMTH0sCisJe19TZXRLZXlfQ01EXywgTlVMTH0sCisJe19TZXRTdGFLZXlfQ01EXywgJnJ0d19zZXRzdGFLZXlfY21kcnNwX2NhbGxiYWNrfSwKKwl7X1NldEFzc29jU3RhX0NNRF8sICZydHdfc2V0YXNzb2NzdGFfY21kcnNwX2NhbGxiYWNrfSwKKwl7X0FkZEJBUmVxX0NNRF8sIE5VTEx9LAorCXtfU2V0Q2hhbm5lbF9DTURfLCBOVUxMfSwKKwl7X1RYX0JlYWNvbl9DTURfLCBOVUxMfSwKKwl7X1NldF9NTE1FX0VWVF9DTURfLCBOVUxMfSwKKwl7X1NldF9EcnZfRXh0cmFfQ01EXywgTlVMTH0sCisJe19TZXRDaGFubmVsUGxhbl9DTURfLCBOVUxMfSwKIH07CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19kZWJ1Zy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19kZWJ1Zy5oCmluZGV4IDdlZDRjYWQuLjk1NTkwYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfZGVidWcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2RlYnVnLmgKQEAgLTEyOSwxMzMgKzEyOSwxMiBAQAogaW50IHByb2Nfc2V0X3JlYWRfcmVnKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAogCQkgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKTsKIAotaW50IHByb2NfZ2V0X2Z3c3RhdGUoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkgICAgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkgICAgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLWludCBwcm9jX2dldF9zZWNfaW5mbyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCSAgICAgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkgICAgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci1pbnQgcHJvY19nZXRfbWxtZXh0X3N0YXRlKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLQotaW50IHByb2NfZ2V0X3Fvc19vcHRpb24oY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQlpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci1pbnQgcHJvY19nZXRfaHRfb3B0aW9uKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJICAgICAgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkgICAgICAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotaW50IHByb2NfZ2V0X3JmX2luZm8oY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkgICAgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkgICAgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLWludCBwcm9jX2dldF9hcF9pbmZvKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJICAgICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJICAgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0KIGludCBwcm9jX2dldF9hZGFwdGVyX3N0YXRlKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKIAkJCSAgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAogCQkJICAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwogCi1pbnQgcHJvY19nZXRfdHJ4X2luZm8oY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkgICAgICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJICAgICAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotCi1pbnQgcHJvY19nZXRfbWFjX3JlZ19kdW1wMShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLQotaW50IHByb2NfZ2V0X21hY19yZWdfZHVtcDIoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0KLWludCBwcm9jX2dldF9tYWNfcmVnX2R1bXAzKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotCi1pbnQgcHJvY19nZXRfYmJfcmVnX2R1bXAxKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLQotaW50IHByb2NfZ2V0X2JiX3JlZ19kdW1wMihjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0KLWludCBwcm9jX2dldF9iYl9yZWdfZHVtcDMoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotCi1pbnQgcHJvY19nZXRfcmZfcmVnX2R1bXAxKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLQotaW50IHByb2NfZ2V0X3JmX3JlZ19kdW1wMihjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0KLWludCBwcm9jX2dldF9yZl9yZWdfZHVtcDMoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotCi1pbnQgcHJvY19nZXRfcmZfcmVnX2R1bXA0KGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLQotI2lmZGVmIENPTkZJR184OEVVX0FQX01PREUKLQotaW50IHByb2NfZ2V0X2FsbF9zdGFfaW5mbyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0KLSNlbmRpZgotCiBpbnQgcHJvY19nZXRfYmVzdF9jaGFubmVsKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKIAkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCiAJCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKIAotaW50IHByb2NfZ2V0X3J4X3NpZ25hbChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCSAgICAgICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJICAgICAgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLQotaW50IHByb2Nfc2V0X3J4X3NpZ25hbChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpOwotCi1pbnQgcHJvY19nZXRfaHRfZW5hYmxlKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJICAgICAgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkgICAgICAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotCi1pbnQgcHJvY19zZXRfaHRfZW5hYmxlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSk7Ci0KLWludCBwcm9jX2dldF9jYnc0MF9lbmFibGUoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotCi1pbnQgcHJvY19zZXRfY2J3NDBfZW5hYmxlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAotCQkJICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKTsKLQotaW50IHByb2NfZ2V0X2FtcGR1X2VuYWJsZShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0KLWludCBwcm9jX3NldF9hbXBkdV9lbmFibGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCi0JCQkgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpOwotCi1pbnQgcHJvY19nZXRfcnhfc3RiYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCSAgICAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCSAgICAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotCi1pbnQgcHJvY19zZXRfcnhfc3RiYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKLQkJICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKTsKLQotaW50IHByb2NfZ2V0X3R3b19wYXRoX3Jzc2koY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0KLWludCBwcm9jX2dldF9yc3NpX2Rpc3AoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkgICAgICAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCSAgICAgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0KLWludCBwcm9jX3NldF9yc3NpX2Rpc3Aoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKTsKLQogI2VuZGlmCS8qIF9fUlRXX0RFQlVHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19lZnVzZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19lZnVzZS5oCmluZGV4IDliZmIxMGMuLjE2OGMxMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfZWZ1c2UuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2VmdXNlLmgKQEAgLTM0LDE2ICszNCw2IEBACiAjZGVmaW5lCUVGVVNFX1dJRkkJCQkJMAogI2RlZmluZQlFRlVTRV9CVAkJCQkxCiAKLWVudW0gX0VGVVNFX0RFRl9UWVBFIHsKLQlUWVBFX0VGVVNFX01BWF9TRUNUSU9OCQkJCT0gMCwKLQlUWVBFX0VGVVNFX1JFQUxfQ09OVEVOVF9MRU4JCQk9IDEsCi0JVFlQRV9BVkFJTEFCTEVfRUZVU0VfQllURVNfQkFOSwkJPSAyLAotCVRZUEVfQVZBSUxBQkxFX0VGVVNFX0JZVEVTX1RPVEFMCT0gMywKLQlUWVBFX0VGVVNFX01BUF9MRU4JCQkJCT0gNCwKLQlUWVBFX0VGVVNFX1BST1RFQ1RfQllURVNfQkFOSwkJPSA1LAotCVRZUEVfRUZVU0VfQ09OVEVOVF9MRU5fQkFOSwkJCT0gNiwKLX07Ci0KIC8qIEUtRnVzZSAqLwogI2RlZmluZSBFRlVTRV9NQVBfU0laRSAgICAgIDUxMgogI2RlZmluZSBFRlVTRV9NQVhfU0laRSAgICAgIDI1NgpAQCAtOTUsOCArODUsNiBAQAogfTsKIAogdTggRWZ1c2VfQ2FsY3VsYXRlV29yZENudHModTggd29yZF9lbik7Ci12b2lkIEVGVVNFX0dldEVmdXNlRGVmaW5pdGlvbihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHU4IHR5cGUsIHU4IHR5cGUxLAotCQkJICAgICAgdm9pZCAqb3V0KTsKIHU4IGVmdXNlX09uZUJ5dGVSZWFkKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MTYgYWRkciwgdTggKmRhdGEpOwogdTggZWZ1c2VfT25lQnl0ZVdyaXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MTYgYWRkciwgdTggZGF0YSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfZXZlbnQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfZXZlbnQuaAppbmRleCA1YzM0ZTU2Li4xYzVlYmRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2V2ZW50LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19ldmVudC5oCkBAIC0xOCw3ICsxOCw3IEBACiAjaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgogCiAjaW5jbHVkZSA8d2xhbl9ic3NkZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlbS5oPgogCiAvKgpAQCAtNzEsMTIgKzcxLDYgQEAKIAlpbnQgbWFjX2lkOwogfTsKIAotc3RydWN0IGFkZGJhX2V2ZW50IHsKLQl1bnNpZ25lZCBpbnQgdGlkOwotfTsKLQotI2RlZmluZSBHRU5fRVZUX0NPREUoZXZlbnQpCWV2ZW50ICMjIF9FVlRfCi0KIHN0cnVjdCBmd2V2ZW50IHsKIAl1MzIJcGFybXNpemU7CiAJdm9pZCAoKmV2ZW50X2NhbGxiYWNrKShzdHJ1Y3QgYWRhcHRlciAqZGV2LCB1OCAqcGJ1Zik7CkBAIC04NCwyMSArNzgsNiBAQAogCiAjZGVmaW5lIEMySEVWRU5UX1NaCQkJMzIKIAotc3RydWN0IGV2ZW50X25vZGUgewotCXVuc2lnbmVkIGNoYXIgKm5vZGU7Ci0JdW5zaWduZWQgY2hhciBldnRfY29kZTsKLQl1bnNpZ25lZCBzaG9ydCBldnRfc3o7Ci0JaW50CSpjYWxsZXJfZmZfdGFpbDsKLQlpbnQJY2FsbGVyX2ZmX3N6OwotfTsKLQotc3RydWN0IGMyaGV2ZW50X3F1ZXVlIHsKLQlpbnQJaGVhZDsKLQlpbnQJdGFpbDsKLQlzdHJ1Y3QJZXZlbnRfbm9kZQlub2Rlc1tDMkhFVkVOVF9TWl07Ci0JdW5zaWduZWQgY2hhcglzZXE7Ci19OwotCiAjZGVmaW5lIE5FVFdPUktfUVVFVUVfU1oJNAogCiBzdHJ1Y3QgbmV0d29ya19xdWV1ZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2h0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2h0LmgKaW5kZXggYjQ1NDgzZi4uZDg0MmVhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19odC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfaHQuaApAQCAtMTUsMTYgKzE1LDExIEBACiAjaWZuZGVmIF9SVFdfSFRfSF8KICNkZWZpbmUgX1JUV19IVF9IXwogCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgIndpZmkuaCIKKyNpbmNsdWRlIDxsaW51eC9pZWVlODAyMTEuaD4KIAogc3RydWN0IGh0X3ByaXYgewogCXUzMglodF9vcHRpb247CiAJdTMyCWFtcGR1X2VuYWJsZTsvKiBmb3IgZW5hYmxlIFR4IEEtTVBEVSAqLwotCXUzMgl0eF9hbXNkdV9lbmFibGU7LyogZm9yIGVuYWJsZSBUeCBBLU1TRFUgKi8KLQl1MzIJdHhfYW1kc3VfbWF4bGVuOyAvKiAgMTogOGssIDA6NGsgOyBkZWZhdWx0OjhrLCBmb3IgdHggKi8KLQl1MzIJcnhfYW1wZHVfbWF4bGVuOyAvKiBmb3IgcnggcmVvcmRlcmluZyBjdHJsIHdpbl9zeiwKLQkJCQkgICogdXBkYXRlZCB3aGVuIGpvaW5fY2FsbGJhY2suICovCiAJdTgJYndtb2RlOy8qICAqLwogCXU4CWNoX29mZnNldDsvKiBQUklNRV9DSE5MX09GRlNFVCAqLwogCXU4CXNnaTsvKiBzaG9ydCBHSSAqLwpAQCAtMzMsNyArMjgsNyBAQAogCXU4CWFnZ19lbmFibGVfYml0bWFwOwogCXU4CWNhbmRpZGF0ZV90aWRfYml0bWFwOwogCi0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaHRfY2FwIGh0X2NhcDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCBodF9jYXA7CiB9OwogCiAjZW5kaWYJLyogX1JUTDg3MVhfSFRfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfaW9jdGwuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfaW9jdGwuaAppbmRleCAzYTY1MmRmLi5hNmIxYzg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2lvY3RsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19pb2N0bC5oCkBAIC02OSwxNSArNjksNiBAQAogCVNFVF9PSUQKIH07CiAKLXN0cnVjdCBvaWRfZnVuc19ub2RlIHsKLQl1bnNpZ25lZCBpbnQgb2lkX3N0YXJ0OyAvKiB0aGUgc3RhcnRpbmcgbnVtYmVyIGZvciBPSUQgKi8KLQl1bnNpZ25lZCBpbnQgb2lkX2VuZDsgLyogdGhlIGVuZGluZyBudW1iZXIgZm9yIE9JRCAqLwotCXN0cnVjdCBvaWRfb2JqX3ByaXYgKm5vZGVfYXJyYXk7Ci0JdW5zaWduZWQgaW50IGFycmF5X3N6OyAvKiB0aGUgc2l6ZSBvZiBub2RlX2FycmF5ICovCi0JaW50IHF1ZXJ5X2NvdW50ZXI7IC8qIGNvdW50IHRoZSBudW1iZXIgb2YgcXVlcnkgaGl0cyBmb3IgdGhpcyBzZWdtZW50ICovCi0JaW50IHNldF9jb3VudGVyOyAvKiBjb3VudCB0aGUgbnVtYmVyIG9mIHNldCBoaXRzIGZvciB0aGlzIHNlZ21lbnQgKi8KLX07Ci0KIHN0cnVjdCBvaWRfcGFyX3ByaXYgewogCXZvaWQJCSphZGFwdGVyX2NvbnRleHQ7CiAJTkRJU19PSUQJb2lkOwpAQCAtODksMTIgKzgwLDYgQEAKIAl1MzIJCWRiZzsKIH07CiAKLXN0cnVjdCBvaWRfb2JqX3ByaXYgewotCXVuc2lnbmVkIGNoYXIJZGJnOyAvKiAgMDogd2l0aG91dCBPSUQgZGVidWcgbWVzc2FnZQotCQkJICAgICAgKiAgMTogd2l0aCBPSUQgZGVidWcgbWVzc2FnZSAqLwotCWludCAoKm9pZGZ1bnMpKHN0cnVjdCBvaWRfcGFyX3ByaXYgKnBvaWRfcGFyX3ByaXYpOwotfTsKLQogI2lmIGRlZmluZWQoX1JUV19NUF9JT0NUTF9DXykKIHN0YXRpYyBpbnQgb2lkX251bGxfZnVuY3Rpb24oc3RydWN0IG9pZF9wYXJfcHJpdiAqcG9pZF9wYXJfcHJpdikgewogCXJldHVybiBORElTX1NUQVRVU19TVUNDRVNTOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19tbG1lLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X21sbWUuaAppbmRleCA1ZDhiY2UwLi45NDM0Yjg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X21sbWUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X21sbWUuaApAQCAtMzAxLDEyICszMDEsMTAgQEAKIAogCXU4ICpuaWNfaGRsOwogCi0JdTggbm90X2luZGljX2Rpc2NvOwogCXN0cnVjdCBsaXN0X2hlYWQgKnBzY2FubmVkOwogCXN0cnVjdCBfX3F1ZXVlIGZyZWVfYnNzX3Bvb2w7CiAJc3RydWN0IF9fcXVldWUgc2Nhbm5lZF9xdWV1ZTsKIAl1OCAqZnJlZV9ic3NfYnVmOwotCXUzMgludW1fb2Zfc2Nhbm5lZDsKIAogCXN0cnVjdCBuZGlzXzgwMl8xMV9zc2lkCWFzc29jX3NzaWQ7CiAJdTgJYXNzb2NfYnNzaWRbNl07CkBAIC0zMTgsMTAgKzMxNiw4IEBACiAJc3RydWN0IHRpbWVyX2xpc3QgYXNzb2NfdGltZXI7CiAKIAl1aW50IGFzc29jX2J5X2Jzc2lkOwotCXVpbnQgYXNzb2NfYnlfcnNzaTsKIAogCXN0cnVjdCB0aW1lcl9saXN0IHNjYW5fdG9fdGltZXI7IC8qICBkcml2ZXIgaXRzZWxmIGhhbmRsZXMgc2Nhbl90aW1lb3V0IHN0YXR1cy4gKi8KLQl1MzIgc2Nhbl9zdGFydF90aW1lOyAvKiAgdXNlZCB0byBldmFsdWF0ZSB0aGUgdGltZSBzcGVudCBpbiBzY2FubmluZyAqLwogCiAJc3RydWN0IHFvc19wcml2IHFvc3ByaXY7CiAKQEAgLTM4NywxNyArMzgzLDYgQEAKIAl1MzIgd3BzX3Byb2JlX3Jlc3BfaWVfbGVuOwogCXUzMiB3cHNfYXNzb2NfcmVzcF9pZV9sZW47CiAKLQl1OCAqcDJwX2JlYWNvbl9pZTsKLQl1OCAqcDJwX3Byb2JlX3JlcV9pZTsKLQl1OCAqcDJwX3Byb2JlX3Jlc3BfaWU7Ci0JdTggKnAycF9nb19wcm9iZV9yZXNwX2llOyAvKiBmb3IgR08gKi8KLQl1OCAqcDJwX2Fzc29jX3JlcV9pZTsKLQotCXUzMiBwMnBfYmVhY29uX2llX2xlbjsKLQl1MzIgcDJwX3Byb2JlX3JlcV9pZV9sZW47Ci0JdTMyIHAycF9wcm9iZV9yZXNwX2llX2xlbjsKLQl1MzIgcDJwX2dvX3Byb2JlX3Jlc3BfaWVfbGVuOyAvKiBmb3IgR08gKi8KLQl1MzIgcDJwX2Fzc29jX3JlcV9pZV9sZW47CiAJc3BpbmxvY2tfdCBiY25fdXBkYXRlX2xvY2s7CiAJdTgJCXVwZGF0ZV9iY247CiAjZW5kaWYgLyogaWYgZGVmaW5lZCAoQ09ORklHXzg4RVVfQVBfTU9ERSkgKi8KQEAgLTUwMCwyNyArNDg1LDYgQEAKIAlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHVwX3NjYW5uZWRfbmV0d29yayhzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYpCi17Ci0Jc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCXBtbG1lcHJpdi0+bnVtX29mX3NjYW5uZWQrKzsKLQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGRvd25fc2Nhbm5lZF9uZXR3b3JrKHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdikKLXsKLQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0JcG1sbWVwcml2LT5udW1fb2Zfc2Nhbm5lZC0tOwotCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X3NjYW5uZWRfbmV0d29ya192YWwoc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2LCBpbnQgdmFsKQotewotCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLQlwbWxtZXByaXYtPm51bV9vZl9zY2FubmVkID0gdmFsOwotCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotfQotCiB1MTYgcnR3X2dldF9jYXBhYmlsaXR5KHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpic3MpOwogdm9pZCBydHdfdXBkYXRlX3NjYW5uZWRfbmV0d29yayhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKIAkJCQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqdGFyZ2V0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfbWxtZV9leHQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfbWxtZV9leHQuaAppbmRleCAyNzM4MmZmLi4xYjFjYWFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X21sbWVfZXh0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19tbG1lX2V4dC5oCkBAIC0zNDksNyArMzQ5LDcgQEAKIAogCXN0cnVjdCBBRERCQV9yZXF1ZXN0CUFEREJBX3JlcTsKIAlzdHJ1Y3QgV01NX3BhcmFfZWxlbWVudAlXTU1fcGFyYW07Ci0Jc3RydWN0IEhUX2NhcHNfZWxlbWVudAlIVF9jYXBzOworCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwIEhUX2NhcHM7CiAJc3RydWN0IEhUX2luZm9fZWxlbWVudAlIVF9pbmZvOwogCXN0cnVjdCB3bGFuX2Jzc2lkX2V4CW5ldHdvcms7Lyogam9pbiBuZXR3b3JrIG9yIGJzc19uZXR3b3JrLAogCQkJCQkgKiBpZiBpbiBhcCBtb2RlLCBpdCBpcyB0aGUgc2FtZQpAQCAtNTI5LDEyICs1MjksMTIgQEAKIHZvaWQgdXBkYXRlX3N0YV9pbmZvKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKTsKIHVuc2lnbmVkIGludCB1cGRhdGVfYmFzaWNfcmF0ZSh1bnNpZ25lZCBjaGFyICpwdG4sIHVuc2lnbmVkIGludCBwdG5fc3opOwogdW5zaWduZWQgaW50IHVwZGF0ZV9zdXBwb3J0ZWRfcmF0ZSh1bnNpZ25lZCBjaGFyICpwdG4sIHVuc2lnbmVkIGludCBwdG5fc3opOwotdW5zaWduZWQgaW50IHVwZGF0ZV9NU0NfcmF0ZShzdHJ1Y3QgSFRfY2Fwc19lbGVtZW50ICpwSFRfY2Fwcyk7Cit1bnNpZ25lZCBpbnQgdXBkYXRlX01TQ19yYXRlKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpwSFRfY2Fwcyk7CiB2b2lkIFVwZGF0ZV9SQV9FbnRyeShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiBtYWNfaWQpOwogdm9pZCBzZXRfc3RhX3JhdGUoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpOwogCiB1bnNpZ25lZCBjaGFyIGdldF9oaWdoZXN0X3JhdGVfaWR4KHUzMiBtYXNrKTsKLWludCBzdXBwb3J0X3Nob3J0X0dJKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IEhUX2NhcHNfZWxlbWVudCAqY2Fwcyk7CitpbnQgc3VwcG9ydF9zaG9ydF9HSShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpjYXBzKTsKIHVuc2lnbmVkIGludCBpc19hcF9pbl90a2lwKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiB1bnNpZ25lZCBpbnQgaXNfYXBfaW5fd2VwKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiB1bnNpZ25lZCBpbnQgc2hvdWxkX2ZvcmJpZF9uX3JhdGUoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKQEAgLTU2Miw4ICs1NjIsNiBAQAogCQkgICAgICAgdTE2IHRpZCwgaW50IHRyeV9jbnQsIGludCB3YWl0X21zKTsKIGludCBpc3N1ZV9kZWF1dGgoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBjaGFyICpkYSwKIAkJIHVuc2lnbmVkIHNob3J0IHJlYXNvbik7Ci12b2lkIGlzc3VlX2FjdGlvbl9zcGN0X2NoX3N3aXRjaChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpyYSwgdTggbmV3X2NoLAotCQkJCSB1OCBjaF9vZmZzZXQpOwogdW5zaWduZWQgaW50IHNlbmRfZGVsYmEoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1OCBpbml0aWF0b3IsIHU4ICphZGRyKTsKIHVuc2lnbmVkIGludCBzZW5kX2JlYWNvbihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwogCkBAIC02MjcsMjcgKzYyNSwyNCBAQAogdTggc2V0X2NzYV9oZGwoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBjaGFyICpwYnVmKTsKIHU4IHRkbHNfaGRsKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5zaWduZWQgY2hhciAqcGJ1Zik7CiAKLSNkZWZpbmUgR0VOX0RSVl9DTURfSEFORExFUihzaXplLCBjbWQpCXtzaXplLCAmY21kICMjIF9oZGx9LAotI2RlZmluZSBHRU5fTUxNRV9FWFRfSEFORExFUihzaXplLCBjbWQpCXtzaXplLCBjbWR9LAotCiAjaWZkZWYgX1JUV19DTURfQ18KIAogc3RhdGljIHN0cnVjdCBjbWRfaGRsIHdsYW5jbWRzW10gPSB7Ci0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCB3bGFuX2Jzc2lkX2V4KSwgam9pbl9jbWRfaGRsKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3QgZGlzY29ubmVjdF9wYXJtKSwgZGlzY29ubmVjdF9oZGwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCB3bGFuX2Jzc2lkX2V4KSwgY3JlYXRlYnNzX2hkbCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IHNldG9wbW9kZV9wYXJtKSwgc2V0b3Btb2RlX2hkbCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IHNpdGVzdXJ2ZXlfcGFybSksIHNpdGVzdXJ2ZXlfY21kX2hkbCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IHNldGF1dGhfcGFybSksIHNldGF1dGhfaGRsKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgc2V0a2V5X3Bhcm0pLCBzZXRrZXlfaGRsKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgc2V0X3N0YWtleV9wYXJtKSwgc2V0X3N0YWtleV9oZGwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBzZXRfYXNzb2NzdGFfcGFybSksIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBhZGRCYVJlcV9wYXJtKSwgYWRkX2JhX2hkbCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IHNldF9jaF9wYXJtKSwgc2V0X2NoX2hkbCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IHdsYW5fYnNzaWRfZXgpLCB0eF9iZWFjb25faGRsKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIG1sbWVfZXZ0X2hkbCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUigwLCBydHdfZHJ2ZXh0cmFfY21kX2hkbCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IFNldENoYW5uZWxQbGFuX3BhcmFtKSwgc2V0X2NocGxhbl9oZGwpCisJe3NpemVvZihzdHJ1Y3Qgd2xhbl9ic3NpZF9leCksIGpvaW5fY21kX2hkbH0sCisJe3NpemVvZihzdHJ1Y3QgZGlzY29ubmVjdF9wYXJtKSwgZGlzY29ubmVjdF9oZGx9LAorCXtzaXplb2Yoc3RydWN0IHdsYW5fYnNzaWRfZXgpLCBjcmVhdGVic3NfaGRsfSwKKwl7c2l6ZW9mKHN0cnVjdCBzZXRvcG1vZGVfcGFybSksIHNldG9wbW9kZV9oZGx9LAorCXtzaXplb2Yoc3RydWN0IHNpdGVzdXJ2ZXlfcGFybSksIHNpdGVzdXJ2ZXlfY21kX2hkbH0sCisJe3NpemVvZihzdHJ1Y3Qgc2V0YXV0aF9wYXJtKSwgc2V0YXV0aF9oZGx9LAorCXtzaXplb2Yoc3RydWN0IHNldGtleV9wYXJtKSwgc2V0a2V5X2hkbH0sCisJe3NpemVvZihzdHJ1Y3Qgc2V0X3N0YWtleV9wYXJtKSwgc2V0X3N0YWtleV9oZGx9LAorCXtzaXplb2Yoc3RydWN0IHNldF9hc3NvY3N0YV9wYXJtKSwgTlVMTH0sCisJe3NpemVvZihzdHJ1Y3QgYWRkQmFSZXFfcGFybSksIGFkZF9iYV9oZGx9LAorCXtzaXplb2Yoc3RydWN0IHNldF9jaF9wYXJtKSwgc2V0X2NoX2hkbH0sCisJe3NpemVvZihzdHJ1Y3Qgd2xhbl9ic3NpZF9leCksIHR4X2JlYWNvbl9oZGx9LAorCXswLCBtbG1lX2V2dF9oZGx9LAorCXswLCBydHdfZHJ2ZXh0cmFfY21kX2hkbH0sCisJe3NpemVvZihzdHJ1Y3QgU2V0Q2hhbm5lbFBsYW5fcGFyYW0pLCBzZXRfY2hwbGFuX2hkbH0KIH07CiAKICNlbmRpZgpAQCAtNjY5LDMyICs2NjQsMzIgQEAKIHZvaWQgcnR3X2Z3ZGJnX2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1OCAqcGJ1Zik7CiAKIGVudW0gcnR3X2MyaF9ldmVudCB7Ci0JR0VOX0VWVF9DT0RFKF9SZWFkX01BQ1JFRykgPSAwLCAvKjAqLwotCUdFTl9FVlRfQ09ERShfUmVhZF9CQlJFRyksCi0JR0VOX0VWVF9DT0RFKF9SZWFkX1JGUkVHKSwKLQlHRU5fRVZUX0NPREUoX1JlYWRfRUVQUk9NKSwKLQlHRU5fRVZUX0NPREUoX1JlYWRfRUZVU0UpLAotCUdFTl9FVlRfQ09ERShfUmVhZF9DQU0pLAkvKjUqLwotCUdFTl9FVlRfQ09ERShfR2V0X0Jhc2ljUmF0ZSksCi0JR0VOX0VWVF9DT0RFKF9HZXRfRGF0YVJhdGUpLAotCUdFTl9FVlRfQ09ERShfU3VydmV5KSwJIC8qOCovCi0JR0VOX0VWVF9DT0RFKF9TdXJ2ZXlEb25lKSwJIC8qOSovCisJX1JlYWRfTUFDUkVHX0VWVF8gPSAwLCAvKjAqLworCV9SZWFkX0JCUkVHX0VWVF8sCisJX1JlYWRfUkZSRUdfRVZUXywKKwlfUmVhZF9FRVBST01fRVZUXywKKwlfUmVhZF9FRlVTRV9FVlRfLAorCV9SZWFkX0NBTV9FVlRfLAkvKjUqLworCV9HZXRfQmFzaWNSYXRlX0VWVF8sCisJX0dldF9EYXRhUmF0ZV9FVlRfLAorCV9TdXJ2ZXlfRVZUXywJIC8qOCovCisJX1N1cnZleURvbmVfRVZUXywJIC8qOSovCiAKLQlHRU5fRVZUX0NPREUoX0pvaW5Cc3MpLCAvKjEwKi8KLQlHRU5fRVZUX0NPREUoX0FkZFNUQSksCi0JR0VOX0VWVF9DT0RFKF9EZWxTVEEpLAotCUdFTl9FVlRfQ09ERShfQXRpbURvbmUpLAotCUdFTl9FVlRfQ09ERShfVFhfUmVwb3J0KSwKLQlHRU5fRVZUX0NPREUoX0NDWF9SZXBvcnQpLAkJLyoxNSovCi0JR0VOX0VWVF9DT0RFKF9EVE1fUmVwb3J0KSwKLQlHRU5fRVZUX0NPREUoX1RYX1JhdGVfU3RhdGlzdGljcyksCi0JR0VOX0VWVF9DT0RFKF9DMkhMQkspLAotCUdFTl9FVlRfQ09ERShfRldEQkcpLAotCUdFTl9FVlRfQ09ERShfQzJIRkVFREJBQ0spLCAgICAgICAgICAgICAvKjIwKi8KLQlHRU5fRVZUX0NPREUoX0FEREJBKSwKLQlHRU5fRVZUX0NPREUoX0MySEJDTiksCi0JR0VOX0VWVF9DT0RFKF9SZXBvcnRQd3JTdGF0ZSksCS8qIGZpbGVuOiBvbmx5IGZvciBQQ0lFLCBVU0IgKi8KLQlHRU5fRVZUX0NPREUoX0Nsb3NlUkYpLAkJLyogZmlsZW46IG9ubHkgZm9yIFBDSUUsCisJX0pvaW5Cc3NfRVZUXywgLyoxMCovCisJX0FkZFNUQV9FVlRfLAorCV9EZWxTVEFfRVZUXywKKwlfQXRpbURvbmVfRVZUXywKKwlfVFhfUmVwb3J0X0VWVF8sCisJX0NDWF9SZXBvcnRfRVZUXywJCS8qMTUqLworCV9EVE1fUmVwb3J0X0VWVF8sCisJX1RYX1JhdGVfU3RhdGlzdGljc19FVlRfLAorCV9DMkhMQktfRVZUXywKKwlfRldEQkdfRVZUXywKKwlfQzJIRkVFREJBQ0tfRVZUXywgICAgICAgICAgICAgLyoyMCovCisJX0FEREJBX0VWVF8sCisJX0MySEJDTl9FVlRfLAorCV9SZXBvcnRQd3JTdGF0ZV9FVlRfLAkvKiBmaWxlbjogb25seSBmb3IgUENJRSwgVVNCICovCisJX0Nsb3NlUkZfRVZUXywJCS8qIGZpbGVuOiBvbmx5IGZvciBQQ0lFLAogCQkJCQkgKiB3b3JrIGFyb3VuZCBBU1BNICovCiAJTUFYX0MySEVWVAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfcHdyY3RybC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19wd3JjdHJsLmgKaW5kZXggOTY4MGUyZS4uMThhOWU3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19wd3JjdHJsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19wd3JjdHJsLmgKQEAgLTkyLDIxICs5Miw2IEBACiAJdW5zaWduZWQgc2hvcnQgcnN2ZDsKIH07CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfaW5pdF9wd3Jsb2NrKHN0cnVjdCBzZW1hcGhvcmUgICpwbG9jaykKLXsKLQlzZW1hX2luaXQocGxvY2ssIDEpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX2VudGVyX3B3cmxvY2soc3RydWN0IHNlbWFwaG9yZSAgKnBsb2NrKQotewotCV9ydHdfZG93bl9zZW1hKHBsb2NrKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9leGl0X3B3cmxvY2soc3RydWN0IHNlbWFwaG9yZSAgKnBsb2NrKQotewotCXVwKHBsb2NrKTsKLX0KLQogI2RlZmluZSBMUFNfREVMQVlfVElNRQkxKkhaIC8qICAxIHNlYyAqLwogCiAjZGVmaW5lIEVYRV9QV1JfTk9ORQkweDAxCkBAIC0xNTcsNyArMTQyLDcgQEAKIH07CiAKIHN0cnVjdCBwd3JjdHJsX3ByaXYgewotCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXhfbG9jazsKIAl2b2xhdGlsZSB1OCBycHdtOyAvKiAgcmVxdWVzdGVkIHBvd2VyIHN0YXRlIGZvciBmdyAqLwogCXZvbGF0aWxlIHU4IGNwd207IC8qICBmdyBjdXJyZW50IHBvd2VyIHN0YXRlLiB1cGRhdGVkIHdoZW4KIAkJCSAgICogMS4gcmVhZCBmcm9tIEhDUFdNIDIuIGRyaXZlciBsb3dlcnMgcG93ZXIgbGV2ZWwgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfcmVjdi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19yZWN2LmgKaW5kZXggYjAzNzNiNi4uNDlkOTczOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19yZWN2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19yZWN2LmgKQEAgLTY1LDEzICs2NSw2IEBACiAqLwogfTsKIAotc3RydWN0IHNtb290aF9yc3NpX2RhdGEgewotCXUzMgllbGVtZW50c1sxMDBdOwkvKiBhcnJheSB0byBzdG9yZSB2YWx1ZXMgKi8KLQl1MzIJaW5kZXg7CQkJLyogaW5kZXggdG8gY3VycmVudCBhcnJheSB0byBzdG9yZSAqLwotCXUzMgl0b3RhbF9udW07CQkvKiBudW0gb2YgdmFsaWQgZWxlbWVudHMgKi8KLQl1MzIJdG90YWxfdmFsOwkJLyogc3VtIG9mIHZhbGlkIGVsZW1lbnRzICovCi19OwotCiBzdHJ1Y3Qgc2lnbmFsX3N0YXQgewogCXU4CXVwZGF0ZV9yZXE7CQkvKiB1c2VkIHRvIGluZGljYXRlICovCiAJdTgJYXZnX3ZhbDsJCS8qIGF2ZyBvZiB2YWxpZCBlbGVtZW50cyAqLwpAQCAtMjQ2LDcgKzIzOSw2IEBACiBzdHJ1Y3QgcmVjdl9mcmFtZSB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCBza19idWZmCSAqcGt0OwotCXN0cnVjdCBza19idWZmCSAqcGt0X25ld2FsbG9jOwogCXN0cnVjdCBhZGFwdGVyICAqYWRhcHRlcjsKIAlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiBhdHRyaWI7CiAJdWludCAgbGVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19zZWN1cml0eS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19zZWN1cml0eS5oCmluZGV4IGNhMTI0N2IuLjI2NjNlNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfc2VjdXJpdHkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3NlY3VyaXR5LmgKQEAgLTE2NCwxMiArMTY0LDYgQEAKIAl1OCBiV2VwRGVmYXVsdEtleUlkeFNldDsKIH07CiAKLXN0cnVjdCBzaGEyNTZfc3RhdGUgewotCXU2NCBsZW5ndGg7Ci0JdTMyIHN0YXRlWzhdLCBjdXJsZW47Ci0JdTggYnVmWzY0XTsKLX07Ci0KICNkZWZpbmUgR0VUX0VOQ1JZX0FMR08ocHNlY3VyaXR5cHJpdiwgcHN0YSwgZW5jcnlfYWxnbywgYm1jc3QpCQlcCiBkbyB7CQkJCQkJCQkJXAogCXN3aXRjaCAocHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSkgewkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfc3Jlc2V0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3NyZXNldC5oCmluZGV4IGNlMDI3ZGYuLjRjNGNjZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfc3Jlc2V0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19zcmVzZXQuaApAQCAtMzMsNyArMzMsNiBAQAogI2RlZmluZQlXSUZJX1JYX0hBTkcJCQlCSVQoNSkKICNkZWZpbmUJCVdJRklfSUZfTk9UX0VYSVNUCUJJVCg2KQogCi12b2lkIHNyZXNldF9pbml0X3ZhbHVlKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiB1OCBzcmVzZXRfZ2V0X3dpZmlfc3RhdHVzKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiB2b2lkIHNyZXNldF9zZXRfd2lmaV9lcnJvcl9zdGF0dXMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgc3RhdHVzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d194bWl0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3htaXQuaAppbmRleCBhMDg1M2JhLi5kZDZiN2E5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3htaXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3htaXQuaApAQCAtMTEzLDcgKzExMyw2IEBACiAJdTgJZGhjcF9wa3Q7CiAJdTE2CWV0aGVyX3R5cGU7CiAJdTE2CXNlcW51bTsKLQl1MTYJcGt0X2hkcmxlbjsJLyogdGhlIG9yaWdpbmFsIDgwMi4zIHBrdCBoZWFkZXIgbGVuICovCiAJdTE2CWhkcmxlbjsJCS8qIHRoZSBXTEFOIEhlYWRlciBMZW4gKi8KIAl1MzIJcGt0bGVuOwkJLyogdGhlIG9yaWdpbmFsIDgwMi4zIHBrdCByYXdfZGF0YSBsZW4gKG5vdCBpbmNsdWRlCiAJCQkJICogZXRoZXJfaGRyIGRhdGEpICovCkBAIC0yNTYsMTUgKzI1NSw4IEBACiAJaW50CWFjX3RhZzsKIH07CiAKLXN0cnVjdCBhZ2dfcGt0X2luZm8gewotCXUxNiBvZmZzZXQ7Ci0JdTE2IHBrdF9sZW47Ci19OwotCiBzdHJ1Y3QJeG1pdF9wcml2IHsKIAlzcGlubG9ja190IGxvY2s7Ci0Jc3RydWN0IHNlbWFwaG9yZSB4bWl0X3NlbWE7Ci0Jc3RydWN0IHNlbWFwaG9yZSB0ZXJtaW5hdGVfeG1pdHRocmVhZF9zZW1hOwogCXN0cnVjdCBfX3F1ZXVlIGJlX3BlbmRpbmc7CiAJc3RydWN0IF9fcXVldWUgYmtfcGVuZGluZzsKIAlzdHJ1Y3QgX19xdWV1ZSB2aV9wZW5kaW5nOwpAQCAtMjg5LDcgKzI4MSw2IEBACiAJdTgJd21tX3BhcmFfc2VxWzRdOy8qIHNlcXVlbmNlIGZvciB3bW0gYWMgcGFyYW1ldGVyIHN0cmVuZ3RoCiAJCQkJICogZnJvbSBsYXJnZSB0byBzbWFsbC4gaXQncyB2YWx1ZSBpcyAwLT52bywKIAkJCQkgKiAxLT52aSwgMi0+YmUsIDMtPmJrLiAqLwotCXN0cnVjdCBzZW1hcGhvcmUgdHhfcmV0ZXZ0Oy8qIGFsbCB0eCByZXR1cm4gZXZlbnQ7ICovCiAJdTgJCXR4aXJwX2NudDsvKiAgKi8KIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgeG1pdF90YXNrbGV0OwogCS8qIHBlciBBQyBwZW5kaW5nIGlycCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3VzYl9oYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS91c2JfaGFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYmYwN2EuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3VzYl9oYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1VTQl9IQUxfSF9fCi0jZGVmaW5lIF9fVVNCX0hBTF9IX18KLQotdm9pZCBydGw4MTg4ZXVfc2V0X2hhbF9vcHMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLSNkZWZpbmUgaGFsX3NldF9oYWxfb3BzCXJ0bDgxODhldV9zZXRfaGFsX29wcwotCi0jZW5kaWYgLyogX19VU0JfSEFMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3VzYl9vcHNfbGludXguaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS91c2Jfb3BzX2xpbnV4LmgKaW5kZXggMjIwNzMzMy4uNzhkOWI2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3VzYl9vcHNfbGludXguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvdXNiX29wc19saW51eC5oCkBAIC00NywyMSArNDcsNiBAQAogI2RlZmluZSB1c2JfcmVhZF9pbnRlcnJ1cHRfY29tcGxldGUocHVyYiwgcmVncykJCVwKIAl1c2JfcmVhZF9pbnRlcnJ1cHRfY29tcGxldGUocHVyYikKIAotc3RhdGljIGlubGluZSB1OCBydHdfdXNiX2J1bGtfc2l6ZV9ib3VuZGFyeShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJCSAgICBpbnQgYnVmX2xlbikKLXsKLQl1OCByc3QgPSB0cnVlOwotCXN0cnVjdCBkdm9ial9wcml2ICpwZHZvYmpwcml2ID0gYWRhcHRlcl90b19kdm9iaihwYWRhcHRlcik7Ci0KLQlpZiAocGR2b2JqcHJpdi0+aXNoaWdoc3BlZWQpCi0JCXJzdCA9ICgwID09IChidWZfbGVuKSAlIFVTQl9ISUdIX1NQRUVEX0JVTEtfU0laRSkgPwotCQkgICAgICB0cnVlIDogZmFsc2U7Ci0JZWxzZQotCQlyc3QgPSAoMCA9PSAoYnVmX2xlbikgJSBVU0JfRlVMTF9TUEVFRF9CVUxLX1NJWkUpID8KLQkJICAgICAgdHJ1ZSA6IGZhbHNlOwotCXJldHVybiByc3Q7Ci19Ci0KIHVuc2lnbmVkIGludCBmZmFkZHIycGlwZWhkbChzdHJ1Y3QgZHZvYmpfcHJpdiAqcGR2b2JqLCB1MzIgYWRkcik7CiAKIHU4IHVzYl9yZWFkOChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGFkZHIpOwpAQCAtNzUsNyArNjAsNyBAQAogaW50IHVzYl93cml0ZTE2KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgYWRkciwgdTE2IHZhbCk7CiBpbnQgdXNiX3dyaXRlMzIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgdmFsKTsKIAotdTMyIHVzYl93cml0ZV9wb3J0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgYWRkciwgdTMyIGNudCwgdTggKnBtZW0pOwordTMyIHVzYl93cml0ZV9wb3J0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgYWRkciwgdTMyIGNudCwgc3RydWN0IHhtaXRfYnVmICpwbWVtKTsKIHZvaWQgdXNiX3dyaXRlX3BvcnRfY2FuY2VsKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvd2lmaS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3dpZmkuaAppbmRleCBlN2M1MTIxLi45ZTA4ZTY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvd2lmaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS93aWZpLmgKQEAgLTUwOCwyMiArNTA4LDYgQEAKICNkZWZpbmUgSUVFRTgwMjExX0JBUl9DVFJMX0FDS19QT0xJQ1lfTk9STUFMICAgICAweDAwMDAKICNkZWZpbmUgSUVFRTgwMjExX0JBUl9DVFJMX0NCTVRJRF9DT01QUkVTU0VEX0JBICAweDAwMDQKIAotIC8qKgotICogc3RydWN0IHJ0d19pZWVlODAyMTFfaHRfY2FwIC0gSFQgY2FwYWJpbGl0aWVzCi0gKgotICogVGhpcyBzdHJ1Y3R1cmUgcmVmZXJzIHRvICJIVCBjYXBhYmlsaXRpZXMgZWxlbWVudCIgYXMKLSAqIGRlc2NyaWJlZCBpbiA4MDIuMTFuIGRyYWZ0IHNlY3Rpb24gNy4zLjIuNTIKLSAqLwotCi1zdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXAgewotCXVuc2lnbmVkIHNob3J0CWNhcF9pbmZvOwotCXVuc2lnbmVkIGNoYXIJYW1wZHVfcGFyYW1zX2luZm87Ci0JdW5zaWduZWQgY2hhcglzdXBwX21jc19zZXRbMTZdOwotCXVuc2lnbmVkIHNob3J0CWV4dGVuZGVkX2h0X2NhcF9pbmZvOwotCXVuc2lnbmVkIGludAl0eF9CRl9jYXBfaW5mbzsKLQl1bnNpZ25lZCBjaGFyICAgYW50ZW5uYV9zZWxlY3Rpb25faW5mbzsKLX0gX19wYWNrZWQ7Ci0KIC8qKgogICogc3RydWN0IHJ0d19pZWVlODAyMTFfaHRfY2FwIC0gSFQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogICoKQEAgLTUzOCwyMCArNTIyLDYgQEAKIAl1bnNpZ25lZCBjaGFyCWJhc2ljX3NldFsxNl07CiB9IF9fcGFja2VkOwogCi1zdHJ1Y3QgSFRfY2Fwc19lbGVtZW50IHsKLQl1bmlvbiB7Ci0JCXN0cnVjdCB7Ci0JCQlfX2xlMTYJSFRfY2Fwc19pbmZvOwotCQkJdW5zaWduZWQgY2hhcglBTVBEVV9wYXJhOwotCQkJdW5zaWduZWQgY2hhcglNQ1NfcmF0ZVsxNl07Ci0JCQl1bnNpZ25lZCBzaG9ydAlIVF9leHRfY2FwczsKLQkJCXVuc2lnbmVkIGludAlCZWFtZm9ybWluZ19jYXBzOwotCQkJdW5zaWduZWQgY2hhcglBU0VMX2NhcHM7Ci0JCX0gSFRfY2FwX2VsZW1lbnQ7Ci0JCXVuc2lnbmVkIGNoYXIgSFRfY2FwWzI2XTsKLQl9IHU7Ci19IF9fcGFja2VkOwotCiBzdHJ1Y3QgSFRfaW5mb19lbGVtZW50IHsKIAl1bnNpZ25lZCBjaGFyCXByaW1hcnlfY2hhbm5lbDsKIAl1bnNpZ25lZCBjaGFyCWluZm9zWzVdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3dsYW5fYnNzZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvd2xhbl9ic3NkZWYuaAppbmRleCA1NjA5NjZjLi5lMTkzMWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvd2xhbl9ic3NkZWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvd2xhbl9ic3NkZWYuaApAQCAtMTIzLDQwICsxMjMsMTAgQEAKICNkZWZpbmUgTkRJU184MDJfMTFfQUlfUkVTRklfU1RBVFVTQ09ERSAgICAgICAgMgogI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVNGSV9BU1NPQ0lBVElPTklEICAgICA0CiAKLXN0cnVjdCBuZGlzXzgwMl8xMV9haV9yZXFmaSB7Ci0gICAgdTE2IENhcGFiaWxpdGllczsKLSAgICB1MTYgTGlzdGVuSW50ZXJ2YWw7Ci0gICAgdW5zaWduZWQgY2hhciBDdXJyZW50QVBBZGRyZXNzW0VUSF9BTEVOXTsKLX07Ci0KLXN0cnVjdCBuZGlzXzgwMl8xMV9haV9yZXNmaSB7Ci0gICAgdTE2IENhcGFiaWxpdGllczsKLSAgICB1MTYgU3RhdHVzQ29kZTsKLSAgICB1MTYgQXNzb2NpYXRpb25JZDsKLX07Ci0KLXN0cnVjdCBuZGlzXzgwMl8xMV9hc3NvY19pbmZvIHsKLQl1MzIgIExlbmd0aDsKLQl1MTYgQXZhaWxhYmxlUmVxdWVzdEZpeGVkSUVzOwotCXN0cnVjdCBuZGlzXzgwMl8xMV9haV9yZXFmaSAgICBSZXF1ZXN0Rml4ZWRJRXM7Ci0JdTMyICBSZXF1ZXN0SUVMZW5ndGg7Ci0JdTMyICBPZmZzZXRSZXF1ZXN0SUVzOwotCXUxNiBBdmFpbGFibGVSZXNwb25zZUZpeGVkSUVzOwotCXN0cnVjdCBuZGlzXzgwMl8xMV9haV9yZXNmaSAgICBSZXNwb25zZUZpeGVkSUVzOwotCXUzMiAgUmVzcG9uc2VJRUxlbmd0aDsKLQl1MzIgIE9mZnNldFJlc3BvbnNlSUVzOwotfTsKLQogZW51bSBuZGlzXzgwMl8xMV9yZWxvYWRfZGVmIHsKIAlOZGlzODAyXzExUmVsb2FkV0VQS2V5cwogfTsKIAotc3RydWN0IG5kaXNfODAyXzExX3JlbW92ZV9rZXkgewotCXUzMiAgICAgICAgICAgICAgICAgICBMZW5ndGg7ICAgICAgICAvKiAgTGVuZ3RoICovCi0JdTMyICAgICAgICAgICAgICAgICAgIEtleUluZGV4OwotCXVuc2lnbmVkIGNoYXIgQlNTSURbRVRIX0FMRU5dOwotfTsKLQogc3RydWN0IG5kaXNfODAyXzExX3dlcCB7CiAJdTMyICAgICBMZW5ndGg7ICAgICAgICAvKiAgTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlICovCiAJdTMyICAgICBLZXlJbmRleDsgICAgICAvKiAgMCBpcyB0aGUgcGVyLWNsaWVudCBrZXksCkBAIC0xNjUsMTIgKzEzNSw2IEBACiAJdTggICAgIEtleU1hdGVyaWFsWzE2XTsvKiAgdmFyaWFibGUgbGVuIGRlcGVuZGluZyBvbiBhYm92ZSBmaWVsZCAqLwogfTsKIAotc3RydWN0IG5kaXNfODAyXzExX2F1dGhfcmVxIHsKLQl1MzIgTGVuZ3RoOyAgICAgICAgICAgIC8qICBMZW5ndGggb2Ygc3RydWN0dXJlICovCi0JdW5zaWduZWQgY2hhciBCc3NpZFtFVEhfQUxFTl07Ci0JdTMyIEZsYWdzOwotfTsKLQogZW51bSBuZGlzXzgwMl8xMV9zdGF0dXNfdHlwZSB7CiAJTmRpczgwMl8xMVN0YXR1c1R5cGVfQXV0aGVudGljYXRpb24sCiAJTmRpczgwMl8xMVN0YXR1c1R5cGVfTWVkaWFTdHJlYW1Nb2RlLApAQCAtMTc5LDEwICsxNDMsNiBAQAogCQkJCSAgICAqIGFuIHVwcGVyIGJvdW5kICovCiB9OwogCi1zdHJ1Y3QgbmRpc184MDJfMTFfc3RhdHVzX2luZCB7Ci0JZW51bSBuZGlzXzgwMl8xMV9zdGF0dXNfdHlwZSBTdGF0dXNUeXBlOwotfTsKLQogLyogIG1hc2sgZm9yIGF1dGhlbnRpY2F0aW9uL2ludGVncml0eSBmaWVsZHMgKi8KICNkZWZpbmUgTkRJU184MDJfMTFfQVVUSF9SRVFVRVNUX0FVVEhfRklFTERTICAgICAgICAJMHgwZgogI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfUkVBVVRICQkJMHgwMQpAQCAtMTkzLDIxICsxNTMsNiBAQAogLyogIE1JQyBjaGVjayB0aW1lLCA2MCBzZWNvbmRzLiAqLwogI2RlZmluZSBNSUNfQ0hFQ0tfVElNRQk2MDAwMDAwMAogCi1zdHJ1Y3QgbmRpc184MDJfMTFfYXV0aF9ldnQgewotCXN0cnVjdCBuZGlzXzgwMl8xMV9zdGF0dXNfaW5kICAgICAgIFN0YXR1czsKLQlzdHJ1Y3QgbmRpc184MDJfMTFfYXV0aF9yZXEgIFJlcXVlc3RbMV07Ci19OwotCi1zdHJ1Y3QgbmRpc184MDJfMTFfdGVzdCB7Ci0JdTMyIExlbmd0aDsKLQl1MzIgVHlwZTsKLQl1bmlvbiB7Ci0JCXN0cnVjdCBuZGlzXzgwMl8xMV9hdXRoX2V2dCBBdXRoZW50aWNhdGlvbkV2ZW50OwotCQlORElTXzgwMl8xMV9SU1NJIFJzc2lUcmlnZ2VyOwotCX0gdHQ7Ci19OwotCi0KICNpZm5kZWYgTmRpczgwMl8xMUFQTW9kZQogI2RlZmluZSBOZGlzODAyXzExQVBNb2RlIChOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmVNYXgrMSkKICNlbmRpZgpAQCAtMjk3LDMyICsyNDIsNCBAQAogI2RlZmluZSBOVU1fUFJFX0FVVEhfS0VZIDE2CiAjZGVmaW5lIE5VTV9QTUtJRF9DQUNIRSBOVU1fUFJFX0FVVEhfS0VZCiAKLS8qCi0qCVdQQTIKLSovCi0KLXN0cnVjdCBwbWtpZF9jYW5kaWRhdGUgewotCXVuc2lnbmVkIGNoYXIgQlNTSURbRVRIX0FMRU5dOwotCXUzMiBGbGFnczsKLX07Ci0KLXN0cnVjdCBuZGlzXzgwMl8xMV9wbWtpZF9saXN0IHsKLQl1MzIgVmVyc2lvbjsgICAgICAgLyogIFZlcnNpb24gb2YgdGhlIHN0cnVjdHVyZSAqLwotCXUzMiBOdW1DYW5kaWRhdGVzOyAvKiAgTm8uIG9mIHBta2lkIGNhbmRpZGF0ZXMgKi8KLQlzdHJ1Y3QgcG1raWRfY2FuZGlkYXRlIENhbmRpZGF0ZUxpc3RbMV07Ci19OwotCi1zdHJ1Y3QgbmRpc184MDJfMTFfYXV0aF9lbmNyeXB0IHsKLQllbnVtIG5kaXNfODAyXzExX2F1dGhfbW9kZSBBdXRoTW9kZVN1cHBvcnRlZDsKLQllbnVtIG5kaXNfODAyXzExX3dlcF9zdGF0dXMgRW5jcnlwdFN0YXR1c1N1cHBvcnRlZDsKLX07Ci0KLXN0cnVjdCBuZGlzXzgwMl8xMV9jYXAgewotCXUzMiAgTGVuZ3RoOwotCXUzMiAgVmVyc2lvbjsKLQl1MzIgIE5vT2ZQTUtJRHM7Ci0JdTMyICBOb09mQXV0aEVuY3J5cHRQYWlyc1N1cHBvcnRlZDsKLQlzdHJ1Y3QgbmRpc184MDJfMTFfYXV0aF9lbmNyeXB0IEF1dGhlbnRpY2F0aW9uRW5jcnlwdGlvblN1cHBvcnRlZFsxXTsKLX07Ci0KICNlbmRpZiAvKiBpZm5kZWYgV0xBTl9CU1NERUZfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL2lvY3RsX2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9pb2N0bF9saW51eC5jCmluZGV4IDU2NzJmMDEuLjRkZTlkYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL2lvY3RsX2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvaW9jdGxfbGludXguYwpAQCAtMTMyLDEyICsxMzIsMTUgQEAKIAlwID0gcnR3X2dldF9pZSgmcG5ldHdvcmstPm5ldHdvcmsuSUVzWzEyXSwgX0hUX0NBUEFCSUxJVFlfSUVfLCAmaHRfaWVsZW4sIHBuZXR3b3JrLT5uZXR3b3JrLklFTGVuZ3RoLTEyKTsKIAogCWlmIChwICYmIGh0X2llbGVuID4gMCkgewotCQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXAgKnBodF9jYXBpZTsKKwkJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKnBodF9jYXBpZTsKIAkJaHRfY2FwID0gdHJ1ZTsKLQkJcGh0X2NhcGllID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCAqKShwKzIpOwotCQltZW1jcHkoJm1jc19yYXRlLCBwaHRfY2FwaWUtPnN1cHBfbWNzX3NldCwgMik7Ci0JCWJ3XzQwTUh6ID0gKHBodF9jYXBpZS0+Y2FwX2luZm8mSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEgpID8gMSA6IDA7Ci0JCXNob3J0X0dJID0gKHBodF9jYXBpZS0+Y2FwX2luZm8mKElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwfElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwKSkgPyAxIDogMDsKKwkJcGh0X2NhcGllID0gKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICopKHAgKyAyKTsKKwkJbWVtY3B5KCZtY3NfcmF0ZSwgcGh0X2NhcGllLT5tY3MucnhfbWFzaywgMik7CisJCWJ3XzQwTUh6ID0gISEobGUxNl90b19jcHUocGh0X2NhcGllLT5jYXBfaW5mbykgJgorCQkJICAgICAgSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEgpOworCQlzaG9ydF9HSSA9ICEhKGxlMTZfdG9fY3B1KHBodF9jYXBpZS0+Y2FwX2luZm8pICYKKwkJCSAgICAgIChJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCB8CisJCQkgICAgICAgSUVFRTgwMjExX0hUX0NBUF9TR0lfNDApKTsKIAl9CiAKIAkvKiBBZGQgdGhlIHByb3RvY29sIG5hbWUgKi8KQEAgLTQwMCw3ICs0MDMsNyBAQAogCQkJd2VwX2tleV9sZW4gPSB3ZXBfa2V5X2xlbiA8PSA1ID8gNSA6IDEzOwogCQkJd2VwX3RvdGFsX2xlbiA9IHdlcF9rZXlfbGVuICsgb2Zmc2V0b2Yoc3RydWN0IG5kaXNfODAyXzExX3dlcCwgS2V5TWF0ZXJpYWwpOwogCQkJcHdlcCA9IChzdHJ1Y3QgbmRpc184MDJfMTFfd2VwICopcnR3X21hbGxvYyh3ZXBfdG90YWxfbGVuKTsKLQkJCWlmIChwd2VwID09IE5VTEwpIHsKKwkJCWlmICghcHdlcCkgewogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9vc19jLCBfZHJ2X2Vycl8sICgiIHdwYV9zZXRfZW5jcnlwdGlvbjogcHdlcCBhbGxvY2F0ZSBmYWlsICEhIVxuIikpOwogCQkJCWdvdG8gZXhpdDsKIAkJCX0KQEAgLTQ0MSw3ICs0NDQsNyBAQAogCiAJCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFIHwgV0lGSV9NUF9TVEFURSkpIHsgLyogc3RhIG1vZGUgKi8KIAkJCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8ocHN0YXByaXYsIGdldF9ic3NpZChwbWxtZXByaXYpKTsKLQkJCWlmIChwc3RhID09IE5VTEwpIHsKKwkJCWlmICghcHN0YSkgewogCQkJCTsKIAkJCX0gZWxzZSB7CiAJCQkJaWYgKHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJub25lIikgIT0gMCkKQEAgLTQ3Niw3ICs0NzksNyBAQAogCQkJCX0KIAkJCX0KIAkJCXBiY21jX3N0YSA9IHJ0d19nZXRfYmNtY19zdGFpbmZvKHBhZGFwdGVyKTsKLQkJCWlmIChwYmNtY19zdGEgPT0gTlVMTCkgeworCQkJaWYgKCFwYmNtY19zdGEpIHsKIAkJCQk7CiAJCQl9IGVsc2UgewogCQkJCS8qIEplZmY6IGRvbid0IGRpc2FibGUgaWVlZTgwMjF4X2Jsb2NrZWQgd2hpbGUgY2xlYXJpbmcga2V5ICovCkBAIC01MDIsOSArNTA1LDkgQEAKIAlpbnQgZ3JvdXBfY2lwaGVyID0gMCwgcGFpcndpc2VfY2lwaGVyID0gMDsKIAlpbnQgcmV0ID0gMDsKIAotCWlmICgoaWVsZW4gPiBNQVhfV1BBX0lFX0xFTikgfHwgKHBpZSA9PSBOVUxMKSkgeworCWlmICgoaWVsZW4gPiBNQVhfV1BBX0lFX0xFTikgfHwgKCFwaWUpKSB7CiAJCV9jbHJfZndzdGF0ZV8oJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9VTkRFUl9XUFMpOwotCQlpZiAocGllID09IE5VTEwpCisJCWlmICghcGllKQogCQkJcmV0dXJuIHJldDsKIAkJZWxzZQogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC01MTIsNyArNTE1LDcgQEAKIAogCWlmIChpZWxlbikgewogCQlidWYgPSBrbWVtZHVwKHBpZSwgaWVsZW4sIEdGUF9LRVJORUwpOwotCQlpZiAoYnVmID09IE5VTEwpIHsKKwkJaWYgKCFidWYpIHsKIAkJCXJldCA9ICAtRU5PTUVNOwogCQkJZ290byBleGl0OwogCQl9CkBAIC0xMDQ5LDcgKzEwNTIsNyBAQAogCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBpd19tbG1lICptbG1lID0gKHN0cnVjdCBpd19tbG1lICopZXh0cmE7CiAKLQlpZiAobWxtZSA9PSBOVUxMKQorCWlmICghbWxtZSkKIAkJcmV0dXJuIC0xOwogCiAJREJHXzg4RSgiJXNcbiIsIF9fZnVuY19fKTsKQEAgLTE4OTYsNyArMTg5OSw3IEBACiAKIAlwYXJhbV9sZW4gPSBzaXplb2Yoc3RydWN0IGllZWVfcGFyYW0pICsgcGV4dC0+a2V5X2xlbjsKIAlwYXJhbSA9IChzdHJ1Y3QgaWVlZV9wYXJhbSAqKXJ0d19tYWxsb2MocGFyYW1fbGVuKTsKLQlpZiAocGFyYW0gPT0gTlVMTCkKKwlpZiAoIXBhcmFtKQogCQlyZXR1cm4gLTE7CiAKIAltZW1zZXQocGFyYW0sIDAsIHBhcmFtX2xlbik7CkBAIC0yMDYxLDcgKzIwNjQsNyBAQAogCX0KIAogCXBhcmFtID0gKHN0cnVjdCBpZWVlX3BhcmFtICopcnR3X21hbGxvYyhwLT5sZW5ndGgpOwotCWlmIChwYXJhbSA9PSBOVUxMKSB7CisJaWYgKCFwYXJhbSkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9CkBAIC0yMjU0LDEzICsyMjU3LDEzIEBACiAJCX0KIAl9CiAKLQlpZiAoc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIm5vbmUiKSA9PSAwICYmIChwc3RhID09IE5VTEwpKSB7CisJaWYgKHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJub25lIikgPT0gMCAmJiAoIXBzdGEpKSB7CiAJCS8qIHRvZG86Y2xlYXIgZGVmYXVsdCBlbmNyeXB0aW9uIGtleXMgKi8KIAogCQlEQkdfODhFKCJjbGVhciBkZWZhdWx0IGVuY3J5cHRpb24ga2V5cywga2V5aWQgPSVkXG4iLCBwYXJhbS0+dS5jcnlwdC5pZHgpOwogCQlnb3RvIGV4aXQ7CiAJfQotCWlmIChzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAiV0VQIikgPT0gMCAmJiAocHN0YSA9PSBOVUxMKSkgeworCWlmIChzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAiV0VQIikgPT0gMCAmJiAoIXBzdGEpKSB7CiAJCURCR184OEUoInI4NzF4X3NldF9lbmNyeXB0aW9uLCBjcnlwdC5hbGcgPSBXRVBcbiIpOwogCQl3ZXBfa2V5X2lkeCA9IHBhcmFtLT51LmNyeXB0LmlkeDsKIAkJd2VwX2tleV9sZW4gPSBwYXJhbS0+dS5jcnlwdC5rZXlfbGVuOwpAQCAtMjI3NCw3ICsyMjc3LDcgQEAKIAkJCXdlcF9rZXlfbGVuID0gd2VwX2tleV9sZW4gPD0gNSA/IDUgOiAxMzsKIAkJCXdlcF90b3RhbF9sZW4gPSB3ZXBfa2V5X2xlbiArIG9mZnNldG9mKHN0cnVjdCBuZGlzXzgwMl8xMV93ZXAsIEtleU1hdGVyaWFsKTsKIAkJCXB3ZXAgPSAoc3RydWN0IG5kaXNfODAyXzExX3dlcCAqKXJ0d19tYWxsb2Mod2VwX3RvdGFsX2xlbik7Ci0JCQlpZiAocHdlcCA9PSBOVUxMKSB7CisJCQlpZiAoIXB3ZXApIHsKIAkJCQlEQkdfODhFKCIgcjg3MXhfc2V0X2VuY3J5cHRpb246IHB3ZXAgYWxsb2NhdGUgZmFpbCAhISFcbiIpOwogCQkJCWdvdG8gZXhpdDsKIAkJCX0KQEAgLTI1MjgsNyArMjUzMSw4IEBACiAJCWlmIChXTEFOX1NUQV9IVCZmbGFncykgewogCQkJcHN0YS0+aHRwcml2Lmh0X29wdGlvbiA9IHRydWU7CiAJCQlwc3RhLT5xb3Nfb3B0aW9uID0gMTsKLQkJCW1lbWNweSgodm9pZCAqKSZwc3RhLT5odHByaXYuaHRfY2FwLCAodm9pZCAqKSZwYXJhbS0+dS5hZGRfc3RhLmh0X2NhcCwgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCkpOworCQkJbWVtY3B5KCZwc3RhLT5odHByaXYuaHRfY2FwLCAmcGFyYW0tPnUuYWRkX3N0YS5odF9jYXAsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSk7CiAJCX0gZWxzZSB7CiAJCQlwc3RhLT5odHByaXYuaHRfb3B0aW9uID0gZmFsc2U7CiAJCX0KQEAgLTI2MjQsNyArMjYyOCw4IEBACiAJCQkJICAgICAgKHBzdGEtPmh0XzIwbWh6X3NldCA8PCA1KSk7CiAJCXBzdGFfZGF0YS0+dHhfc3VwcF9yYXRlc19sZW4gPSAgcHN0YS0+YnNzcmF0ZWxlbjsKIAkJbWVtY3B5KHBzdGFfZGF0YS0+dHhfc3VwcF9yYXRlcywgcHN0YS0+YnNzcmF0ZXNldCwgcHN0YS0+YnNzcmF0ZWxlbik7Ci0JCW1lbWNweSgmcHN0YV9kYXRhLT5odF9jYXAsICZwc3RhLT5odHByaXYuaHRfY2FwLCBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaHRfY2FwKSk7CisJCW1lbWNweSgmcHN0YV9kYXRhLT5odF9jYXAsCisJCSAgICAgICAmcHN0YS0+aHRwcml2Lmh0X2NhcCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSk7CiAJCXBzdGFfZGF0YS0+cnhfcGt0cyA9IHBzdGEtPnN0YV9zdGF0cy5yeF9kYXRhX3BrdHM7CiAJCXBzdGFfZGF0YS0+cnhfYnl0ZXMgPSBwc3RhLT5zdGFfc3RhdHMucnhfYnl0ZXM7CiAJCXBzdGFfZGF0YS0+cnhfZHJvcHMgPSBwc3RhLT5zdGFfc3RhdHMucnhfZHJvcHM7CkBAIC0yNjk5LDcgKzI3MDQsNyBAQAogCWlmIChpZV9sZW4gPiAwKSB7CiAJCXBtbG1lcHJpdi0+d3BzX2JlYWNvbl9pZSA9IHJ0d19tYWxsb2MoaWVfbGVuKTsKIAkJcG1sbWVwcml2LT53cHNfYmVhY29uX2llX2xlbiA9IGllX2xlbjsKLQkJaWYgKHBtbG1lcHJpdi0+d3BzX2JlYWNvbl9pZSA9PSBOVUxMKSB7CisJCWlmICghcG1sbWVwcml2LT53cHNfYmVhY29uX2llKSB7CiAJCQlEQkdfODhFKCIlcygpLSVkOiBydHdfbWFsbG9jKCkgRVJST1IhXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTI3MzQsNyArMjczOSw3IEBACiAJaWYgKGllX2xlbiA+IDApIHsKIAkJcG1sbWVwcml2LT53cHNfcHJvYmVfcmVzcF9pZSA9IHJ0d19tYWxsb2MoaWVfbGVuKTsKIAkJcG1sbWVwcml2LT53cHNfcHJvYmVfcmVzcF9pZV9sZW4gPSBpZV9sZW47Ci0JCWlmIChwbWxtZXByaXYtPndwc19wcm9iZV9yZXNwX2llID09IE5VTEwpIHsKKwkJaWYgKCFwbWxtZXByaXYtPndwc19wcm9iZV9yZXNwX2llKSB7CiAJCQlEQkdfODhFKCIlcygpLSVkOiBydHdfbWFsbG9jKCkgRVJST1IhXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTI3NjQsNyArMjc2OSw3IEBACiAJaWYgKGllX2xlbiA+IDApIHsKIAkJcG1sbWVwcml2LT53cHNfYXNzb2NfcmVzcF9pZSA9IHJ0d19tYWxsb2MoaWVfbGVuKTsKIAkJcG1sbWVwcml2LT53cHNfYXNzb2NfcmVzcF9pZV9sZW4gPSBpZV9sZW47Ci0JCWlmIChwbWxtZXByaXYtPndwc19hc3NvY19yZXNwX2llID09IE5VTEwpIHsKKwkJaWYgKCFwbWxtZXByaXYtPndwc19hc3NvY19yZXNwX2llKSB7CiAJCQlEQkdfODhFKCIlcygpLSVkOiBydHdfbWFsbG9jKCkgRVJST1IhXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTI4NjYsNyArMjg3MSw3IEBACiAJfQogCiAJcGFyYW0gPSAoc3RydWN0IGllZWVfcGFyYW0gKilydHdfbWFsbG9jKHAtPmxlbmd0aCk7Ci0JaWYgKHBhcmFtID09IE5VTEwpIHsKKwlpZiAoIXBhcmFtKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KQEAgLTI5NzYsNyArMjk4MSw3IEBACiAJCQlwbWxtZXByaXYtPndwc19wcm9iZV9yZXFfaWUgPSBOVUxMOwogCiAJCQlwbWxtZXByaXYtPndwc19wcm9iZV9yZXFfaWUgPSBydHdfbWFsbG9jKGNwX3N6KTsKLQkJCWlmIChwbWxtZXByaXYtPndwc19wcm9iZV9yZXFfaWUgPT0gTlVMTCkgeworCQkJaWYgKCFwbWxtZXByaXYtPndwc19wcm9iZV9yZXFfaWUpIHsKIAkJCQlwcl9pbmZvKCIlcygpLSVkOiBydHdfbWFsbG9jKCkgRVJST1IhXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQkJCXJldCA9ICAtRUlOVkFMOwogCQkJCWdvdG8gRlJFRV9FWFQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9vc19pbnRmcy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvb3NfaW50ZnMuYwppbmRleCBhZTJjYWZmLi40MDY5MWYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9vc19pbnRmcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL29zX2ludGZzLmMKQEAgLTIzLDggKzIzLDYgQEAKICNpbmNsdWRlIDxydHdfaW9jdGwuaD4KICNpbmNsdWRlIDxydGw4MTg4ZV9oYWwuaD4KIAotI2luY2x1ZGUgPHVzYl9oYWwuaD4KLQogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJSZWFsdGVrIFdpcmVsZXNzIExhbiBEcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIlJlYWx0ZWsgU2VtaWNvbmR1Y3RvciBDb3JwLiIpOwpAQCAtMzMsMTEgKzMxLDcgQEAKICNkZWZpbmUgUlRXX05PVENIX0ZJTFRFUiAwIC8qIDA6RGlzYWJsZSwgMTpFbmFibGUsICovCiAKIC8qIG1vZHVsZSBwYXJhbSBkZWZhdWx0cyAqLwotc3RhdGljIGludCBydHdfY2hpcF92ZXJzaW9uOwotc3RhdGljIGludCBydHdfcmZpbnRmcyA9IEhXUEk7Ci1zdGF0aWMgaW50IHJ0d19sYmttb2RlOy8qIFJUTDg3MTJfQUlSX1RSWDsgKi8KIC8qIE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZTsgaW5mcmEsIGFkLWhvYywgYXV0byAqLwotc3RhdGljIGludCBydHdfbmV0d29ya19tb2RlID0gTmRpczgwMl8xMUlCU1M7CiBzdGF0aWMgaW50IHJ0d19jaGFubmVsID0gMTsvKiBhZC1ob2Mgc3VwcG9ydCByZXF1aXJlbWVudCAqLwogc3RhdGljIGludCBydHdfd2lyZWxlc3NfbW9kZSA9IFdJUkVMRVNTXzExQkdfMjROOwogc3RhdGljIGludCBydHdfdnJ0bF9jYXJyaWVyX3NlbnNlID0gQVVUT19WQ1M7CkBAIC00NSw5ICszOSw2IEBACiBzdGF0aWMgaW50IHJ0d19ydHNfdGhyZXNoID0gMjM0NzsvKiAgKi8KIHN0YXRpYyBpbnQgcnR3X2ZyYWdfdGhyZXNoID0gMjM0NjsvKiAgKi8KIHN0YXRpYyBpbnQgcnR3X3ByZWFtYmxlID0gUFJFQU1CTEVfTE9ORzsvKiBsb25nLCBzaG9ydCwgYXV0byAqLwotc3RhdGljIGludCBydHdfc2Nhbl9tb2RlID0gMTsvKiBhY3RpdmUsIHBhc3NpdmUgKi8KLXN0YXRpYyBpbnQgcnR3X2FkaG9jX3R4X3B3ciA9IDE7Ci1zdGF0aWMgaW50IHJ0d19zb2Z0X2FwOwogc3RhdGljIGludCBydHdfcG93ZXJfbWdudCA9IDE7CiBzdGF0aWMgaW50IHJ0d19pcHNfbW9kZSA9IElQU19OT1JNQUw7CiAKQEAgLTU3LDExICs0OCw2IEBACiBNT0RVTEVfUEFSTV9ERVNDKHJ0d19pcHNfbW9kZSwgIlRoZSBkZWZhdWx0IElQUyBtb2RlIik7CiAKIHN0YXRpYyBpbnQgcnR3X2RlYnVnID0gMTsKLXN0YXRpYyBpbnQgcnR3X3JhZGlvX2VuYWJsZSA9IDE7Ci1zdGF0aWMgaW50IHJ0d19sb25nX3JldHJ5X2xtdCA9IDc7Ci1zdGF0aWMgaW50IHJ0d19zaG9ydF9yZXRyeV9sbXQgPSA3Owotc3RhdGljIGludCBydHdfYnVzeV90aHJlc2ggPSA0MDsKLXN0YXRpYyBpbnQgcnR3X2Fja19wb2xpY3kgPSBOT1JNQUxfQUNLOwogCiBzdGF0aWMgaW50IHJ0d19zb2Z0d2FyZV9lbmNyeXB0Owogc3RhdGljIGludCBydHdfc29mdHdhcmVfZGVjcnlwdDsKQEAgLTcwLDExICs1Niw2IEBACiAKIHN0YXRpYyBpbnQgcnR3X3dtbV9lbmFibGUgPSAxOy8qICBkZWZhdWx0IGlzIHNldCB0byBlbmFibGUgdGhlIHdtbS4gKi8KIHN0YXRpYyBpbnQgcnR3X3VhcHNkX2VuYWJsZTsKLXN0YXRpYyBpbnQgcnR3X3VhcHNkX21heF9zcCA9IE5PX0xJTUlUOwotc3RhdGljIGludCBydHdfdWFwc2RfYWNia19lbjsKLXN0YXRpYyBpbnQgcnR3X3VhcHNkX2FjYmVfZW47Ci1zdGF0aWMgaW50IHJ0d191YXBzZF9hY3ZpX2VuOwotc3RhdGljIGludCBydHdfdWFwc2RfYWN2b19lbjsKIAogc3RhdGljIGludCBydHdfaHRfZW5hYmxlID0gMTsKIC8qIDAgOmRpc2FibGUsIGJpdCgwKTogZW5hYmxlIDIuNGcsIGJpdCgxKTogZW5hYmxlIDVnICovCkBAIC04OSwxMSArNzAsNiBAQAogc3RhdGljIGludCBydHdfcnhfc3RiYyA9IDE7CiBzdGF0aWMgaW50IHJ0d19hbXBkdV9hbXNkdTsvKiAgMDogZGlzYWJsZWQsIDE6ZW5hYmxlZCwgMjphdXRvICovCiAKLS8qIFVzZSAyIHBhdGggVHggdG8gdHJhbnNtaXQgTUNTMH43IGFuZCBsZWdhY3kgbW9kZSAqLwotc3RhdGljIGludCBydHdfbG93cmF0ZV90d29feG1pdCA9IDE7Ci0KLXN0YXRpYyBpbnQgcnR3X3JmX2NvbmZpZyA9IFJGXzgxOVhfTUFYX1RZUEU7ICAvKiBhdXRvICovCi1zdGF0aWMgaW50IHJ0d19sb3dfcG93ZXI7CiBzdGF0aWMgaW50IHJ0d193aWZpX3NwZWM7CiBzdGF0aWMgaW50IHJ0d19jaGFubmVsX3BsYW4gPSBSVF9DSEFOTkVMX0RPTUFJTl9NQVg7CiAKQEAgLTExMSwxMCArODcsNiBAQAogCiBzdGF0aWMgaW50IHJ0d19od3Bkbl9tb2RlID0gMjsvKiAwOmRpc2FibGUsIDE6ZW5hYmxlLCAyOiBieSBFRlVTRSBjb25maWcgKi8KIAotc3RhdGljIGludCBydHdfaHdwd3JwX2RldGVjdDsgLyogSFcgcG93ZXIgIHBpbmcgZGV0ZWN0IDA6ZGlzYWJsZSAsIDE6ZW5hYmxlICovCi0KLXN0YXRpYyBpbnQgcnR3X2h3X3dwc19wYmMgPSAxOwotCiBpbnQgcnR3X21jMnVfZGlzYWJsZTsKIAogc3RhdGljIGludCBydHdfODAyMTFkOwpAQCAtMTMyLDMyICsxMDQsMjIgQEAKIAogbW9kdWxlX3BhcmFtKHJ0d19pbml0bWFjLCBjaGFycCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0ocnR3X2NoYW5uZWxfcGxhbiwgaW50LCAwNjQ0KTsKLW1vZHVsZV9wYXJhbShydHdfY2hpcF92ZXJzaW9uLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19yZmludGZzLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19sYmttb2RlLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19uZXR3b3JrX21vZGUsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0ocnR3X2NoYW5uZWwsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0ocnR3X3dtbV9lbmFibGUsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0ocnR3X3ZydGxfY2Fycmllcl9zZW5zZSwgaW50LCAwNjQ0KTsKIG1vZHVsZV9wYXJhbShydHdfdmNzX3R5cGUsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X2J1c3lfdGhyZXNoLCBpbnQsIDA2NDQpOwogbW9kdWxlX3BhcmFtKHJ0d19odF9lbmFibGUsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0ocnR3X2NidzQwX2VuYWJsZSwgaW50LCAwNjQ0KTsKIG1vZHVsZV9wYXJhbShydHdfYW1wZHVfZW5hYmxlLCBpbnQsIDA2NDQpOwogbW9kdWxlX3BhcmFtKHJ0d19yeF9zdGJjLCBpbnQsIDA2NDQpOwogbW9kdWxlX3BhcmFtKHJ0d19hbXBkdV9hbXNkdSwgaW50LCAwNjQ0KTsKLW1vZHVsZV9wYXJhbShydHdfbG93cmF0ZV90d29feG1pdCwgaW50LCAwNjQ0KTsKLW1vZHVsZV9wYXJhbShydHdfcmZfY29uZmlnLCBpbnQsIDA2NDQpOwogbW9kdWxlX3BhcmFtKHJ0d19wb3dlcl9tZ250LCBpbnQsIDA2NDQpOwogbW9kdWxlX3BhcmFtKHJ0d19zbWFydF9wcywgaW50LCAwNjQ0KTsKLW1vZHVsZV9wYXJhbShydHdfbG93X3Bvd2VyLCBpbnQsIDA2NDQpOwogbW9kdWxlX3BhcmFtKHJ0d193aWZpX3NwZWMsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0ocnR3X2FudGRpdl9jZmcsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0ocnR3X2FudGRpdl90eXBlLCBpbnQsIDA2NDQpOwogbW9kdWxlX3BhcmFtKHJ0d19lbnVzYnNzLCBpbnQsIDA2NDQpOwogbW9kdWxlX3BhcmFtKHJ0d19od3Bkbl9tb2RlLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19od3B3cnBfZGV0ZWN0LCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19od193cHNfcGJjLCBpbnQsIDA2NDQpOwogCiBzdGF0aWMgdWludCBydHdfbWF4X3JvYW1pbmdfdGltZXMgPSAyOwogbW9kdWxlX3BhcmFtKHJ0d19tYXhfcm9hbWluZ190aW1lcywgdWludCwgMDY0NCk7CkBAIC0xODUsMzYxICsxNDcsMTEgQEAKIHN0YXRpYyBpbnQgbmV0ZGV2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXYpOwogc3RhdGljIGludCBuZXRkZXZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXYpOwogCi0vKiBkdW1teSByb3V0aW5lcyAqLwotdm9pZCBydHdfcHJvY19yZW1vdmVfb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIHJ0d19wcm9jX2luaXRfb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci19Ci0KLSNpZiAwCS8qIFRPRE86IENvbnZlcnQgdGhlc2UgdG8gL3N5cyAqLwotc3RhdGljIHZvaWQgcnR3X3Byb2NfaW5pdF9vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRpcl9kZXYgPSBOVUxMOwotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50cnkgPSBOVUxMOwotCXN0cnVjdCBhZGFwdGVyCSpwYWRhcHRlciA9IHJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXU4IHJmX3R5cGU7Ci0KLQlpZiAocnR3X3Byb2MgPT0gTlVMTCkgewotCQltZW1jcHkocnR3X3Byb2NfbmFtZSwgRFJWX05BTUUsIHNpemVvZihEUlZfTkFNRSkpOwotCi0JCXJ0d19wcm9jID0gY3JlYXRlX3Byb2NfZW50cnkocnR3X3Byb2NfbmFtZSwgU19JRkRJUiwKLQkJCQkJICAgICBpbml0X25ldC5wcm9jX25ldCk7Ci0JCWlmIChydHdfcHJvYyA9PSBOVUxMKSB7Ci0JCQlEQkdfODhFKEtFUk5fRVJSICJVbmFibGUgdG8gY3JlYXRlIHJ0d19wcm9jIGRpcmVjdG9yeVxuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInZlcl9pbmZvIiwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJCSAgICAgICBydHdfcHJvYywgcHJvY19nZXRfZHJ2X3ZlcnNpb24sCi0JCQkJCSAgICAgICBkZXYpOwotCQlpZiAoIWVudHJ5KSB7Ci0JCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JaWYgKHBhZGFwdGVyLT5kaXJfZGV2ID09IE5VTEwpIHsKLQkJcGFkYXB0ZXItPmRpcl9kZXYgPSBjcmVhdGVfcHJvY19lbnRyeShkZXYtPm5hbWUsCi0JCQkJCSAgU19JRkRJUiB8IFNfSVJVR08gfCBTX0lYVUdPLAotCQkJCQkgIHJ0d19wcm9jKTsKLQkJZGlyX2RldiA9IHBhZGFwdGVyLT5kaXJfZGV2OwotCQlpZiAoZGlyX2RldiA9PSBOVUxMKSB7Ci0JCQlpZiAocnR3X3Byb2NfY250ID09IDAgJiYgcnR3X3Byb2MpIHsKLQkJCQlyZW1vdmVfcHJvY19lbnRyeShydHdfcHJvY19uYW1lLCBpbml0X25ldC5wcm9jX25ldCk7Ci0JCQkJcnR3X3Byb2MgPSBOVUxMOwotCQkJfQotCi0JCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlIGRpcl9kZXYgZGlyZWN0b3J5XG4iKTsKLQkJCXJldHVybjsKLQkJfQotCX0gZWxzZSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlydHdfcHJvY19jbnQrKzsKLQotCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgid3JpdGVfcmVnIiwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJICAgZGlyX2RldiwgcHJvY19nZXRfd3JpdGVfcmVnLCBkZXYpOwotCWlmICghZW50cnkpIHsKLQkJcHJfaW5mbygiVW5hYmxlIHRvIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQllbnRyeS0+d3JpdGVfcHJvYyA9IHByb2Nfc2V0X3dyaXRlX3JlZzsKLQotCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgicmVhZF9yZWciLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9yZWFkX3JlZywgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0JZW50cnktPndyaXRlX3Byb2MgPSBwcm9jX3NldF9yZWFkX3JlZzsKLQotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJmd3N0YXRlIiwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJICAgZGlyX2RldiwgcHJvY19nZXRfZndzdGF0ZSwgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInNlY19pbmZvIiwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJICAgZGlyX2RldiwgcHJvY19nZXRfc2VjX2luZm8sIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJtbG1leHRfc3RhdGUiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9tbG1leHRfc3RhdGUsIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJxb3Nfb3B0aW9uIiwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJICAgZGlyX2RldiwgcHJvY19nZXRfcW9zX29wdGlvbiwgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImh0X29wdGlvbiIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCSAgIGRpcl9kZXYsIHByb2NfZ2V0X2h0X29wdGlvbiwgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInJmX2luZm8iLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9yZl9pbmZvLCBkZXYpOwotCWlmICghZW50cnkpIHsKLQkJcHJfaW5mbygiVW5hYmxlIHRvIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiYXBfaW5mbyIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCSAgIGRpcl9kZXYsIHByb2NfZ2V0X2FwX2luZm8sIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJhZGFwdGVyX3N0YXRlIiwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJICAgZGlyX2RldiwgcHJvY19nZXRzdHJ1Y3QgYWRhcHRlcl9zdGF0ZSwgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInRyeF9pbmZvIiwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJICAgZGlyX2RldiwgcHJvY19nZXRfdHJ4X2luZm8sIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJtYWNfcmVnX2R1bXAxIiwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJICAgZGlyX2RldiwgcHJvY19nZXRfbWFjX3JlZ19kdW1wMSwgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoIm1hY19yZWdfZHVtcDIiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9tYWNfcmVnX2R1bXAyLCBkZXYpOwotCWlmICghZW50cnkpIHsKLQkJcHJfaW5mbygiVW5hYmxlIHRvIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgibWFjX3JlZ19kdW1wMyIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCSAgIGRpcl9kZXYsIHByb2NfZ2V0X21hY19yZWdfZHVtcDMsIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJiYl9yZWdfZHVtcDEiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9iYl9yZWdfZHVtcDEsIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJiYl9yZWdfZHVtcDIiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9iYl9yZWdfZHVtcDIsIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJiYl9yZWdfZHVtcDMiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9iYl9yZWdfZHVtcDMsIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJyZl9yZWdfZHVtcDEiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9yZl9yZWdfZHVtcDEsIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJyZl9yZWdfZHVtcDIiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9yZl9yZWdfZHVtcDIsIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JcnR3X2hhbF9nZXRfaHdyZWcocGFkYXB0ZXIsIEhXX1ZBUl9SRl9UWVBFLCAodTggKikoJnJmX3R5cGUpKTsKLQlpZiAoKFJGXzFUMlIgPT0gcmZfdHlwZSkgfHwgKFJGXzFUMVIgPT0gcmZfdHlwZSkpIHsKLQkJZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJyZl9yZWdfZHVtcDMiLAotCQkJCQkgICAgICAgU19JRlJFRyB8IFNfSVJVR08sIGRpcl9kZXYsCi0JCQkJCSAgICAgICBwcm9jX2dldF9yZl9yZWdfZHVtcDMsIGRldik7Ci0JCWlmICghZW50cnkpIHsKLQkJCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInJmX3JlZ19kdW1wNCIsCi0JCQkJCSAgICAgICBTX0lGUkVHIHwgU19JUlVHTywgZGlyX2RldiwKLQkJCQkJICAgICAgIHByb2NfZ2V0X3JmX3JlZ19kdW1wNCwgZGV2KTsKLQkJaWYgKCFlbnRyeSkgewotCQkJcHJfaW5mbygiVW5hYmxlIHRvIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkhXG4iKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotI2lmZGVmIENPTkZJR184OEVVX0FQX01PREUKLQotCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiYWxsX3N0YV9pbmZvIiwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJICAgZGlyX2RldiwgcHJvY19nZXRfYWxsX3N0YV9pbmZvLCBkZXYpOwotCWlmICghZW50cnkpIHsKLQkJcHJfaW5mbygiVW5hYmxlIHRvIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkhXG4iKTsKLQkJcmV0dXJuOwotCX0KLSNlbmRpZgotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJiZXN0X2NoYW5uZWwiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9iZXN0X2NoYW5uZWwsIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJyeF9zaWduYWwiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9yeF9zaWduYWwsIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCWVudHJ5LT53cml0ZV9wcm9jID0gcHJvY19zZXRfcnhfc2lnbmFsOwotCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiaHRfZW5hYmxlIiwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJICAgZGlyX2RldiwgcHJvY19nZXRfaHRfZW5hYmxlLCBkZXYpOwotCWlmICghZW50cnkpIHsKLQkJcHJfaW5mbygiVW5hYmxlIHRvIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQllbnRyeS0+d3JpdGVfcHJvYyA9IHByb2Nfc2V0X2h0X2VuYWJsZTsKLQotCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiY2J3NDBfZW5hYmxlIiwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJICAgZGlyX2RldiwgcHJvY19nZXRfY2J3NDBfZW5hYmxlLCBkZXYpOwotCWlmICghZW50cnkpIHsKLQkJcHJfaW5mbygiVW5hYmxlIHRvIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQllbnRyeS0+d3JpdGVfcHJvYyA9IHByb2Nfc2V0X2NidzQwX2VuYWJsZTsKLQotCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiYW1wZHVfZW5hYmxlIiwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJICAgZGlyX2RldiwgcHJvY19nZXRfYW1wZHVfZW5hYmxlLCBkZXYpOwotCWlmICghZW50cnkpIHsKLQkJcHJfaW5mbygiVW5hYmxlIHRvIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQllbnRyeS0+d3JpdGVfcHJvYyA9IHByb2Nfc2V0X2FtcGR1X2VuYWJsZTsKLQotCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgicnhfc3RiYyIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCSAgIGRpcl9kZXYsIHByb2NfZ2V0X3J4X3N0YmMsIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCWVudHJ5LT53cml0ZV9wcm9jID0gcHJvY19zZXRfcnhfc3RiYzsKLQotCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgicGF0aF9yc3NpIiwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJCWRpcl9kZXYsIHByb2NfZ2V0X3R3b19wYXRoX3Jzc2ksIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgicnNzaV9kaXNwIiwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJICAgZGlyX2RldiwgcHJvY19nZXRfcnNzaV9kaXNwLCBkZXYpOwotCWlmICghZW50cnkpIHsKLQkJcHJfaW5mbygiVW5hYmxlIHRvIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQllbnRyeS0+d3JpdGVfcHJvYyA9IHByb2Nfc2V0X3Jzc2lfZGlzcDsKLX0KLQotdm9pZCBydHdfcHJvY19yZW1vdmVfb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkaXJfZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgYWRhcHRlcgkqcGFkYXB0ZXIgPSBydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQl1OCByZl90eXBlOwotCi0JZGlyX2RldiA9IHBhZGFwdGVyLT5kaXJfZGV2OwotCXBhZGFwdGVyLT5kaXJfZGV2ID0gTlVMTDsKLQotCWlmIChkaXJfZGV2KSB7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJ3cml0ZV9yZWciLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoInJlYWRfcmVnIiwgZGlyX2Rldik7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJmd3N0YXRlIiwgZGlyX2Rldik7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJzZWNfaW5mbyIsIGRpcl9kZXYpOwotCQlyZW1vdmVfcHJvY19lbnRyeSgibWxtZXh0X3N0YXRlIiwgZGlyX2Rldik7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJxb3Nfb3B0aW9uIiwgZGlyX2Rldik7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJodF9vcHRpb24iLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoInJmX2luZm8iLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoImFwX2luZm8iLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoImFkYXB0ZXJfc3RhdGUiLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoInRyeF9pbmZvIiwgZGlyX2Rldik7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJtYWNfcmVnX2R1bXAxIiwgZGlyX2Rldik7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJtYWNfcmVnX2R1bXAyIiwgZGlyX2Rldik7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJtYWNfcmVnX2R1bXAzIiwgZGlyX2Rldik7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJiYl9yZWdfZHVtcDEiLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoImJiX3JlZ19kdW1wMiIsIGRpcl9kZXYpOwotCQlyZW1vdmVfcHJvY19lbnRyeSgiYmJfcmVnX2R1bXAzIiwgZGlyX2Rldik7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJyZl9yZWdfZHVtcDEiLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoInJmX3JlZ19kdW1wMiIsIGRpcl9kZXYpOwotCQlydHdfaGFsX2dldF9od3JlZyhwYWRhcHRlciwgSFdfVkFSX1JGX1RZUEUsICh1OCAqKSgmcmZfdHlwZSkpOwotCQlpZiAoKFJGXzFUMlIgPT0gcmZfdHlwZSkgfHwgKFJGXzFUMVIgPT0gcmZfdHlwZSkpIHsKLQkJCXJlbW92ZV9wcm9jX2VudHJ5KCJyZl9yZWdfZHVtcDMiLCBkaXJfZGV2KTsKLQkJCXJlbW92ZV9wcm9jX2VudHJ5KCJyZl9yZWdfZHVtcDQiLCBkaXJfZGV2KTsKLQkJfQotI2lmZGVmIENPTkZJR184OEVVX0FQX01PREUKLQkJcmVtb3ZlX3Byb2NfZW50cnkoImFsbF9zdGFfaW5mbyIsIGRpcl9kZXYpOwotI2VuZGlmCi0KLQkJcmVtb3ZlX3Byb2NfZW50cnkoImJlc3RfY2hhbm5lbCIsIGRpcl9kZXYpOwotCQlyZW1vdmVfcHJvY19lbnRyeSgicnhfc2lnbmFsIiwgZGlyX2Rldik7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJjYnc0MF9lbmFibGUiLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoImh0X2VuYWJsZSIsIGRpcl9kZXYpOwotCQlyZW1vdmVfcHJvY19lbnRyeSgiYW1wZHVfZW5hYmxlIiwgZGlyX2Rldik7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJyeF9zdGJjIiwgZGlyX2Rldik7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJwYXRoX3Jzc2kiLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoInJzc2lfZGlzcCIsIGRpcl9kZXYpOwotCQlyZW1vdmVfcHJvY19lbnRyeShkZXYtPm5hbWUsIHJ0d19wcm9jKTsKLQkJZGlyX2RldiA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuOwotCX0KLQlydHdfcHJvY19jbnQtLTsKLQotCWlmIChydHdfcHJvY19jbnQgPT0gMCkgewotCQlpZiAocnR3X3Byb2MpIHsKLQkJCXJlbW92ZV9wcm9jX2VudHJ5KCJ2ZXJfaW5mbyIsIHJ0d19wcm9jKTsKLQotCQkJcmVtb3ZlX3Byb2NfZW50cnkocnR3X3Byb2NfbmFtZSwgaW5pdF9uZXQucHJvY19uZXQpOwotCQkJcnR3X3Byb2MgPSBOVUxMOwotCQl9Ci0JfQotfQotI2VuZGlmCi0KIHN0YXRpYyB2b2lkIGxvYWRwYXJhbShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2KQogewogCXN0cnVjdCByZWdpc3RyeV9wcml2ICAqcmVnaXN0cnlfcGFyID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7CiAKIAlHbG9iYWxEZWJ1Z0xldmVsID0gcnR3X2RlYnVnOwotCXJlZ2lzdHJ5X3Bhci0+Y2hpcF92ZXJzaW9uID0gKHU4KXJ0d19jaGlwX3ZlcnNpb247Ci0JcmVnaXN0cnlfcGFyLT5yZmludGZzID0gKHU4KXJ0d19yZmludGZzOwotCXJlZ2lzdHJ5X3Bhci0+bGJrbW9kZSA9ICh1OClydHdfbGJrbW9kZTsKLQlyZWdpc3RyeV9wYXItPm5ldHdvcmtfbW9kZSAgPSAodTgpcnR3X25ldHdvcmtfbW9kZTsKIAogCW1lbWNweShyZWdpc3RyeV9wYXItPnNzaWQuU3NpZCwgIkFOWSIsIDMpOwogCXJlZ2lzdHJ5X3Bhci0+c3NpZC5Tc2lkTGVuZ3RoID0gMzsKQEAgLTU1MSwxNyArMTYzLDkgQEAKIAlyZWdpc3RyeV9wYXItPnJ0c190aHJlc2ggPSAodTE2KXJ0d19ydHNfdGhyZXNoOwogCXJlZ2lzdHJ5X3Bhci0+ZnJhZ190aHJlc2ggPSAodTE2KXJ0d19mcmFnX3RocmVzaDsKIAlyZWdpc3RyeV9wYXItPnByZWFtYmxlID0gKHU4KXJ0d19wcmVhbWJsZTsKLQlyZWdpc3RyeV9wYXItPnNjYW5fbW9kZSA9ICh1OClydHdfc2Nhbl9tb2RlOwotCXJlZ2lzdHJ5X3Bhci0+YWRob2NfdHhfcHdyID0gKHU4KXJ0d19hZGhvY190eF9wd3I7Ci0JcmVnaXN0cnlfcGFyLT5zb2Z0X2FwID0gICh1OClydHdfc29mdF9hcDsKIAlyZWdpc3RyeV9wYXItPnNtYXJ0X3BzID0gICh1OClydHdfc21hcnRfcHM7CiAJcmVnaXN0cnlfcGFyLT5wb3dlcl9tZ250ID0gKHU4KXJ0d19wb3dlcl9tZ250OwogCXJlZ2lzdHJ5X3Bhci0+aXBzX21vZGUgPSAodTgpcnR3X2lwc19tb2RlOwotCXJlZ2lzdHJ5X3Bhci0+cmFkaW9fZW5hYmxlID0gKHU4KXJ0d19yYWRpb19lbmFibGU7Ci0JcmVnaXN0cnlfcGFyLT5sb25nX3JldHJ5X2xtdCA9ICh1OClydHdfbG9uZ19yZXRyeV9sbXQ7Ci0JcmVnaXN0cnlfcGFyLT5zaG9ydF9yZXRyeV9sbXQgPSAodTgpcnR3X3Nob3J0X3JldHJ5X2xtdDsKLQlyZWdpc3RyeV9wYXItPmJ1c3lfdGhyZXNoID0gKHUxNilydHdfYnVzeV90aHJlc2g7Ci0JcmVnaXN0cnlfcGFyLT5hY2tfcG9saWN5ID0gKHU4KXJ0d19hY2tfcG9saWN5OwogCXJlZ2lzdHJ5X3Bhci0+bXBfbW9kZSA9IDA7CiAJcmVnaXN0cnlfcGFyLT5zb2Z0d2FyZV9lbmNyeXB0ID0gKHU4KXJ0d19zb2Z0d2FyZV9lbmNyeXB0OwogCXJlZ2lzdHJ5X3Bhci0+c29mdHdhcmVfZGVjcnlwdCA9ICh1OClydHdfc29mdHdhcmVfZGVjcnlwdDsKQEAgLTU3MCwyOCArMTc0LDE4IEBACiAJIC8qIFVBUFNEICovCiAJcmVnaXN0cnlfcGFyLT53bW1fZW5hYmxlID0gKHU4KXJ0d193bW1fZW5hYmxlOwogCXJlZ2lzdHJ5X3Bhci0+dWFwc2RfZW5hYmxlID0gKHU4KXJ0d191YXBzZF9lbmFibGU7Ci0JcmVnaXN0cnlfcGFyLT51YXBzZF9tYXhfc3AgPSAodTgpcnR3X3VhcHNkX21heF9zcDsKLQlyZWdpc3RyeV9wYXItPnVhcHNkX2FjYmtfZW4gPSAodTgpcnR3X3VhcHNkX2FjYmtfZW47Ci0JcmVnaXN0cnlfcGFyLT51YXBzZF9hY2JlX2VuID0gKHU4KXJ0d191YXBzZF9hY2JlX2VuOwotCXJlZ2lzdHJ5X3Bhci0+dWFwc2RfYWN2aV9lbiA9ICh1OClydHdfdWFwc2RfYWN2aV9lbjsKLQlyZWdpc3RyeV9wYXItPnVhcHNkX2Fjdm9fZW4gPSAodTgpcnR3X3VhcHNkX2Fjdm9fZW47CiAKIAlyZWdpc3RyeV9wYXItPmh0X2VuYWJsZSA9ICh1OClydHdfaHRfZW5hYmxlOwogCXJlZ2lzdHJ5X3Bhci0+Y2J3NDBfZW5hYmxlID0gKHU4KXJ0d19jYnc0MF9lbmFibGU7CiAJcmVnaXN0cnlfcGFyLT5hbXBkdV9lbmFibGUgPSAodTgpcnR3X2FtcGR1X2VuYWJsZTsKIAlyZWdpc3RyeV9wYXItPnJ4X3N0YmMgPSAodTgpcnR3X3J4X3N0YmM7CiAJcmVnaXN0cnlfcGFyLT5hbXBkdV9hbXNkdSA9ICh1OClydHdfYW1wZHVfYW1zZHU7Ci0JcmVnaXN0cnlfcGFyLT5sb3dyYXRlX3R3b194bWl0ID0gKHU4KXJ0d19sb3dyYXRlX3R3b194bWl0OwotCXJlZ2lzdHJ5X3Bhci0+cmZfY29uZmlnID0gKHU4KXJ0d19yZl9jb25maWc7Ci0JcmVnaXN0cnlfcGFyLT5sb3dfcG93ZXIgPSAodTgpcnR3X2xvd19wb3dlcjsKIAlyZWdpc3RyeV9wYXItPndpZmlfc3BlYyA9ICh1OClydHdfd2lmaV9zcGVjOwogCXJlZ2lzdHJ5X3Bhci0+Y2hhbm5lbF9wbGFuID0gKHU4KXJ0d19jaGFubmVsX3BsYW47CiAJcmVnaXN0cnlfcGFyLT5hY2NlcHRfYWRkYmFfcmVxID0gdHJ1ZTsKIAlyZWdpc3RyeV9wYXItPmFudGRpdl9jZmcgPSAodTgpcnR3X2FudGRpdl9jZmc7CiAJcmVnaXN0cnlfcGFyLT5hbnRkaXZfdHlwZSA9ICh1OClydHdfYW50ZGl2X3R5cGU7CiAJcmVnaXN0cnlfcGFyLT5od3Bkbl9tb2RlID0gKHU4KXJ0d19od3Bkbl9tb2RlOwotCXJlZ2lzdHJ5X3Bhci0+aHdwd3JwX2RldGVjdCA9ICh1OClydHdfaHdwd3JwX2RldGVjdDsKLQlyZWdpc3RyeV9wYXItPmh3X3dwc19wYmMgPSAodTgpcnR3X2h3X3dwc19wYmM7CiAKIAlyZWdpc3RyeV9wYXItPm1heF9yb2FtaW5nX3RpbWVzID0gKHU4KXJ0d19tYXhfcm9hbWluZ190aW1lczsKIApAQCAtNzMyLDcgKzMyNiw3IEBACiAJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgKCIraW5pdF9uZXRfZGV2XG4iKSk7CiAKIAlpZiAob2xkX3BhZGFwdGVyICE9IE5VTEwpCi0JCXBuZXRkZXYgPSBydHdfYWxsb2NfZXRoZXJkZXZfd2l0aF9vbGRfcHJpdihzaXplb2Yoc3RydWN0IGFkYXB0ZXIpLCAodm9pZCAqKW9sZF9wYWRhcHRlcik7CisJCXBuZXRkZXYgPSBydHdfYWxsb2NfZXRoZXJkZXZfd2l0aF9vbGRfcHJpdigodm9pZCAqKW9sZF9wYWRhcHRlcik7CiAKIAlpZiAoIXBuZXRkZXYpCiAJCXJldHVybiBOVUxMOwpAQCAtNzYyLDcgKzM1Niw3IEBACiAJCWVyciA9IFBUUl9FUlIocGFkYXB0ZXItPmNtZFRocmVhZCk7CiAJZWxzZQogCQkvKiB3YWl0IGZvciBjbWRfdGhyZWFkIHRvIHJ1biAqLwotCQlfcnR3X2Rvd25fc2VtYSgmcGFkYXB0ZXItPmNtZHByaXYudGVybWluYXRlX2NtZHRocmVhZF9zZW1hKTsKKwkJd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZwYWRhcHRlci0+Y21kcHJpdi50ZXJtaW5hdGVfY21kdGhyZWFkX2NvbXApOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTc3Miw5ICszNjYsOSBAQAogCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICgiK3J0d19zdG9wX2Rydl90aHJlYWRzXG4iKSk7CiAKIAkvKiBCZWxvdyBpcyB0byB0ZXJtaW5hdGUgcnR3X2NtZF90aHJlYWQgJiBldmVudF90aHJlYWQuLi4gKi8KLQl1cCgmcGFkYXB0ZXItPmNtZHByaXYuY21kX3F1ZXVlX3NlbWEpOworCWNvbXBsZXRlKCZwYWRhcHRlci0+Y21kcHJpdi5jbWRfcXVldWVfY29tcCk7CiAJaWYgKHBhZGFwdGVyLT5jbWRUaHJlYWQpCi0JCV9ydHdfZG93bl9zZW1hKCZwYWRhcHRlci0+Y21kcHJpdi50ZXJtaW5hdGVfY21kdGhyZWFkX3NlbWEpOworCQl3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJnBhZGFwdGVyLT5jbWRwcml2LnRlcm1pbmF0ZV9jbWR0aHJlYWRfY29tcCk7CiAKIH0KIApAQCAtODIxLDcgKzQxNSw2IEBACiAJcGFkYXB0ZXItPmJSZWFkUG9ydENhbmNlbCA9IGZhbHNlOwogCXBhZGFwdGVyLT5iV3JpdGVQb3J0Q2FuY2VsID0gZmFsc2U7CiAJcGFkYXB0ZXItPmJSeFJTU0lEaXNwbGF5ID0gMDsKLQlwYWRhcHRlci0+Yk5vdGlmeUNoYW5uZWxDaGFuZ2UgPSAwOwogCXJldHVybiBfU1VDQ0VTUzsKIH0KIApAQCAtOTEyLDggKzUwNSw2IEBACiAKIAlydHdfaGFsX3NyZXNldF9pbml0KHBhZGFwdGVyKTsKIAotCXNwaW5fbG9ja19pbml0KCZwYWRhcHRlci0+YnJfZXh0X2xvY2spOwotCiBleGl0OgogCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICgiLXJ0d19pbml0X2Rydl9zd1xuIikpOwogCkBAIC05NjEsMTIgKzU1Miw2IEBACiAKIAlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAoIjw9PSBydHdfZnJlZV9kcnZfc3dcbiIpKTsKIAotCS8qIGZyZWUgdGhlIG9sZF9wbmV0ZGV2ICovCi0JaWYgKHBhZGFwdGVyLT5yZXJlZ19uZF9uYW1lX3ByaXYub2xkX3BuZXRkZXYpIHsKLQkJZnJlZV9uZXRkZXYocGFkYXB0ZXItPnJlcmVnX25kX25hbWVfcHJpdi5vbGRfcG5ldGRldik7Ci0JCXBhZGFwdGVyLT5yZXJlZ19uZF9uYW1lX3ByaXYub2xkX3BuZXRkZXYgPSBOVUxMOwotCX0KLQogCW11dGV4X2Rlc3Ryb3koJnBhZGFwdGVyLT5od19pbml0X211dGV4KTsKIAogCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICgiLXJ0d19mcmVlX2Rydl9zd1xuIikpOwpAQCAtMTAxMyw3ICs1OTgsNiBAQAogCQl9CiAJCWlmIChwYWRhcHRlci0+aW50Zl9zdGFydCkKIAkJCXBhZGFwdGVyLT5pbnRmX3N0YXJ0KHBhZGFwdGVyKTsKLQkJcnR3X3Byb2NfaW5pdF9vbmUocG5ldGRldik7CiAKIAkJcnR3X2xlZF9jb250cm9sKHBhZGFwdGVyLCBMRURfQ1RMX05PX0xJTkspOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9vc2RlcF9zZXJ2aWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9vc2RlcF9zZXJ2aWNlLmMKaW5kZXggNzY0MjUwYi4uN2NkMjY1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvb3NkZXBfc2VydmljZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL29zZGVwX3NlcnZpY2UuYwpAQCAtNTUsMjEgKzU1LDEzIEBACiAJcmV0dXJuIGE7CiB9CiAKLXUzMiBfcnR3X2Rvd25fc2VtYShzdHJ1Y3Qgc2VtYXBob3JlICpzZW1hKQotewotCWlmIChkb3duX2ludGVycnVwdGlibGUoc2VtYSkpCi0JCXJldHVybiBfRkFJTDsKLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KIHZvaWQJX3J0d19pbml0X3F1ZXVlKHN0cnVjdCBfX3F1ZXVlICpwcXVldWUpCiB7CiAJSU5JVF9MSVNUX0hFQUQoJihwcXVldWUtPnF1ZXVlKSk7CiAJc3Bpbl9sb2NrX2luaXQoJihwcXVldWUtPmxvY2spKTsKIH0KIAotc3RydWN0IG5ldF9kZXZpY2UgKnJ0d19hbGxvY19ldGhlcmRldl93aXRoX29sZF9wcml2KGludCBzaXplb2ZfcHJpdiwKLQkJCQkJCSAgICB2b2lkICpvbGRfcHJpdikKK3N0cnVjdCBuZXRfZGV2aWNlICpydHdfYWxsb2NfZXRoZXJkZXZfd2l0aF9vbGRfcHJpdih2b2lkICpvbGRfcHJpdikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldjsKIAlzdHJ1Y3QgcnR3X25ldGRldl9wcml2X2luZGljYXRvciAqcG5waTsKQEAgLTgwLDcgKzcyLDYgQEAKIAogCXBucGkgPSBuZXRkZXZfcHJpdihwbmV0ZGV2KTsKIAlwbnBpLT5wcml2ID0gb2xkX3ByaXY7Ci0JcG5waS0+c2l6ZW9mX3ByaXYgPSBzaXplb2ZfcHJpdjsKIAogUkVUVVJOOgogCXJldHVybiBwbmV0ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvcmVjdl9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvcmVjdl9saW51eC5jCmluZGV4IDBjNDQ5MTQuLjEwM2NkYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3JlY3ZfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9yZWN2X2xpbnV4LmMKQEAgLTI0LDcgKzI0LDYgQEAKIC8qIGFsbG9jIG9zIHJlbGF0ZWQgcmVzb3VyY2UgaW4gc3RydWN0IHJlY3ZfZnJhbWUgKi8KIHZvaWQgcnR3X29zX3JlY3ZfcmVzb3VyY2VfYWxsb2Moc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpCiB7Ci0JcHJlY3ZmcmFtZS0+cGt0X25ld2FsbG9jID0gTlVMTDsKIAlwcmVjdmZyYW1lLT5wa3QgPSBOVUxMOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC91c2JfaW50Zi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvdXNiX2ludGYuYwppbmRleCAxMWQ1MWEzLi42OGUxZTZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC91c2JfaW50Zi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3VzYl9pbnRmLmMKQEAgLTI1LDkgKzI1LDEwIEBACiAjaW5jbHVkZSA8b3NkZXBfaW50Zi5oPgogCiAjaW5jbHVkZSA8dXNiX29wc19saW51eC5oPgotI2luY2x1ZGUgPHVzYl9oYWwuaD4KICNpbmNsdWRlIDxydHdfaW9jdGwuaD4KIAorI2luY2x1ZGUgInJ0bDgxODhlX2hhbC5oIgorCiAjZGVmaW5lIFVTQl9WRU5ERVJfSURfUkVBTFRFSwkJMHgwYmRhCiAKIC8qIERJRF9VU0JfdjkxNl8yMDEzMDExNiAqLwpAQCAtNzksOSArODAsOCBAQAogCiAJcGR2b2JqcHJpdi0+TnVtSW50ZXJmYWNlcyA9IHBjb25mX2Rlc2MtPmJOdW1JbnRlcmZhY2VzOwogCXBkdm9ianByaXYtPkludGVyZmFjZU51bWJlciA9IHBpZmFjZV9kZXNjLT5iSW50ZXJmYWNlTnVtYmVyOwotCXBkdm9ianByaXYtPm5yX2VuZHBvaW50ID0gcGlmYWNlX2Rlc2MtPmJOdW1FbmRwb2ludHM7CiAKLQlmb3IgKGkgPSAwOyBpIDwgcGR2b2JqcHJpdi0+bnJfZW5kcG9pbnQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBwaWZhY2VfZGVzYy0+Yk51bUVuZHBvaW50czsgaSsrKSB7CiAJCWludCBlcF9udW07CiAJCXBlbmRwX2Rlc2MgPSAmcGhvc3RfaWZhY2UtPmVuZHBvaW50W2ldLmRlc2M7CiAKQEAgLTk4LDcgKzk4LDYgQEAKIAkJCQllcF9udW07CiAJCQlwZHZvYmpwcml2LT5SdE51bU91dFBpcGVzKys7CiAJCX0KLQkJcGR2b2JqcHJpdi0+ZXBfbnVtW2ldID0gZXBfbnVtOwogCX0KIAogCWlmIChwdXNiZC0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpCkBAIC0xMDcsMTMgKzEwNiw2IEBACiAJCXBkdm9ianByaXYtPmlzaGlnaHNwZWVkID0gZmFsc2U7CiAKIAltdXRleF9pbml0KCZwZHZvYmpwcml2LT51c2JfdmVuZG9yX3JlcV9tdXRleCk7Ci0JcGR2b2JqcHJpdi0+dXNiX3ZlbmRvcl9yZXFfYnVmID0ga3phbGxvYyhNQVhfVVNCX0lPX0NUTF9TSVpFLCBHRlBfS0VSTkVMKTsKLQotCWlmICghcGR2b2JqcHJpdi0+dXNiX3ZlbmRvcl9yZXFfYnVmKSB7Ci0JCXVzYl9zZXRfaW50ZmRhdGEodXNiX2ludGYsIE5VTEwpOwotCQlrZnJlZShwZHZvYmpwcml2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQogCXVzYl9nZXRfZGV2KHB1c2JkKTsKIAogCXJldHVybiBwZHZvYmpwcml2OwpAQCAtMTQxLDcgKzEzMyw2IEBACiAJCQl9CiAJCX0KIAotCQlrZnJlZShkdm9iai0+dXNiX3ZlbmRvcl9yZXFfYnVmKTsKIAkJbXV0ZXhfZGVzdHJveSgmZHZvYmotPnVzYl92ZW5kb3JfcmVxX211dGV4KTsKIAkJa2ZyZWUoZHZvYmopOwogCX0KQEAgLTIzOCw3ICsyMjksNyBAQAogCXJ0d19jYW5jZWxfYWxsX3RpbWVyKHBhZGFwdGVyKTsKIAlMZWF2ZUFsbFBvd2VyU2F2ZU1vZGUocGFkYXB0ZXIpOwogCi0JX2VudGVyX3B3cmxvY2soJnB3cnByaXYtPmxvY2spOworCW11dGV4X2xvY2soJnB3cnByaXYtPm11dGV4X2xvY2spOwogCS8qIHMxLiAqLwogCWlmIChwbmV0ZGV2KSB7CiAJCW5ldGlmX2NhcnJpZXJfb2ZmKHBuZXRkZXYpOwpAQCAtMjY3LDcgKzI1OCw3IEBACiAJcnR3X2ZyZWVfbmV0d29ya19xdWV1ZShwYWRhcHRlciwgdHJ1ZSk7CiAKIAlydHdfZGV2X3VubG9hZChwYWRhcHRlcik7Ci0JX2V4aXRfcHdybG9jaygmcHdycHJpdi0+bG9jayk7CisJbXV0ZXhfdW5sb2NrKCZwd3Jwcml2LT5tdXRleF9sb2NrKTsKIAogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSkpCiAJCXJ0d19pbmRpY2F0ZV9zY2FuX2RvbmUocGFkYXB0ZXIsIDEpOwpAQCAtMjk4LDE4ICsyODksMjAgQEAKIAkJZ290byBleGl0OwogCX0KIAotCV9lbnRlcl9wd3Jsb2NrKCZwd3Jwcml2LT5sb2NrKTsKKwltdXRleF9sb2NrKCZwd3Jwcml2LT5tdXRleF9sb2NrKTsKIAlydHdfcmVzZXRfZHJ2X3N3KHBhZGFwdGVyKTsKIAlwd3Jwcml2LT5ia2VlcGZ3YWxpdmUgPSBmYWxzZTsKIAogCXByX2RlYnVnKCJia2VlcGZ3YWxpdmUoJXgpXG4iLCBwd3Jwcml2LT5ia2VlcGZ3YWxpdmUpOwotCWlmIChwbV9uZXRkZXZfb3BlbihwbmV0ZGV2LCB0cnVlKSAhPSAwKQorCWlmIChwbV9uZXRkZXZfb3BlbihwbmV0ZGV2LCB0cnVlKSAhPSAwKSB7CisJCW11dGV4X3VubG9jaygmcHdycHJpdi0+bXV0ZXhfbG9jayk7CiAJCWdvdG8gZXhpdDsKKwl9CiAKIAluZXRpZl9kZXZpY2VfYXR0YWNoKHBuZXRkZXYpOwogCW5ldGlmX2NhcnJpZXJfb24ocG5ldGRldik7CiAKLQlfZXhpdF9wd3Jsb2NrKCZwd3Jwcml2LT5sb2NrKTsKKwltdXRleF91bmxvY2soJnB3cnByaXYtPm11dGV4X2xvY2spOwogCiAJcnR3X3JvYW1pbmcocGFkYXB0ZXIsIE5VTEwpOwogCkBAIC0zNjksOCArMzYyLDkgQEAKIAkJcGFkYXB0ZXItPnBtb25kZXYgPSBwbW9uZGV2OwogCX0KIAotCS8qIHN0ZXAgMi4gaG9vayBIYWxGdW5jLCBhbGxvY2F0ZSBIYWxEYXRhICovCi0JaGFsX3NldF9oYWxfb3BzKHBhZGFwdGVyKTsKKwlwYWRhcHRlci0+SGFsRGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoYWxfZGF0YV84MTg4ZSksIEdGUF9LRVJORUwpOworCWlmICghcGFkYXB0ZXItPkhhbERhdGEpCisJCURCR184OEUoImNhbnQgbm90IGFsbG9jIG1lbW9yeSBmb3IgSEFMIERBVEFcbiIpOwogCiAJcGFkYXB0ZXItPmludGZfc3RhcnQgPSAmdXNiX2ludGZfc3RhcnQ7CiAJcGFkYXB0ZXItPmludGZfc3RvcCA9ICZ1c2JfaW50Zl9zdG9wOwpAQCAtNDU2LDExICs0NTAsOSBAQAogCWZyZWVfbWxtZV9hcF9pbmZvKGlmMSk7CiAjZW5kaWYKIAotCWlmIChwbmV0ZGV2KSB7Ci0JCS8qIHdpbGwgY2FsbCBuZXRkZXZfY2xvc2UoKSAqLwotCQl1bnJlZ2lzdGVyX25ldGRldihwbmV0ZGV2KTsKLQkJcnR3X3Byb2NfcmVtb3ZlX29uZShwbmV0ZGV2KTsKLQl9CisJaWYgKHBuZXRkZXYpCisJCXVucmVnaXN0ZXJfbmV0ZGV2KHBuZXRkZXYpOyAvKiB3aWxsIGNhbGwgbmV0ZGV2X2Nsb3NlKCkgKi8KKwogCXJ0bDg4ZXVfbW9uX2RlaW5pdChpZjEtPnBtb25kZXYpOwogCXJ0d19jYW5jZWxfYWxsX3RpbWVyKGlmMSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3VzYl9vcHNfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3VzYl9vcHNfbGludXguYwppbmRleCBjZTFlMWExLi5kMGQ1OTE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC91c2Jfb3BzX2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvdXNiX29wc19saW51eC5jCkBAIC0yMCw3ICsyMCw3IEBACiAKIHN0YXRpYyB2b2lkIGludGVycnVwdF9oYW5kbGVyXzgxODhldShzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHUxNiBwa3RfbGVuLCB1OCAqcGJ1ZikKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKmhhbGRhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YSA9IGFkYXB0LT5IYWxEYXRhOwogCiAJaWYgKHBrdF9sZW4gIT0gSU5URVJSVVBUX01TR19GT1JNQVRfTEVOKSB7CiAJCURCR184OEUoIiVzIEludmFsaWQgaW50ZXJydXB0IGNvbnRlbnQgbGVuZ3RoICglZCkhXG4iLCBfX2Z1bmNfXywgcGt0X2xlbik7CkBAIC00OCw3ICs0OCw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKnBrdF9jb3B5ID0gTlVMTDsKIAlzdHJ1Y3QgcmVjdl9mcmFtZQkqcHJlY3ZmcmFtZSA9IE5VTEw7CiAJc3RydWN0IHJ4X3BrdF9hdHRyaWIJKnBhdHRyaWIgPSBOVUxMOwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxkYXRhID0gYWRhcHQtPkhhbERhdGE7CiAJc3RydWN0IHJlY3ZfcHJpdgkqcHJlY3Zwcml2ID0gJmFkYXB0LT5yZWN2cHJpdjsKIAlzdHJ1Y3QgX19xdWV1ZSAqcGZyZWVfcmVjdl9xdWV1ZSA9ICZwcmVjdnByaXYtPmZyZWVfcmVjdl9xdWV1ZTsKIApAQCAtMjUxLDcgKzI1MSw3IEBACiAJfQogCiAJLyogIEFjcXVpcmUgSU8gbWVtb3J5IGZvciB2ZW5kb3JyZXEgKi8KLQlwSW9fYnVmID0gZHZvYmpwcml2LT51c2JfdmVuZG9yX3JlcV9idWY7CisJcElvX2J1ZiA9IGttYWxsb2MoTUFYX1VTQl9JT19DVExfU0laRSwgR0ZQX0FUT01JQyk7CiAKIAlpZiAocElvX2J1ZiA9PSBOVUxMKSB7CiAJCURCR184OEUoIlslc10gcElvX2J1ZiA9PSBOVUxMXG4iLCBfX2Z1bmNfXyk7CkBAIC0yODUsOCArMjg1LDcgQEAKIAkJCQlpZiAoc3RhdHVzID09ICgtRVNIVVRET1dOKSB8fCBzdGF0dXMgPT0gLUVOT0RFVikgewogCQkJCQlhZGFwdC0+YlN1cnByaXNlUmVtb3ZlZCA9IHRydWU7CiAJCQkJfSBlbHNlIHsKLQkJCQkJc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKLQkJCQkJaGFsZGF0YS0+c3Jlc3Rwcml2LldpZmlfRXJyb3JfU3RhdHVzID0gVVNCX1ZFTl9SRVFfQ01EX0ZBSUw7CisJCQkJCWFkYXB0LT5IYWxEYXRhLT5zcmVzdHByaXYuV2lmaV9FcnJvcl9TdGF0dXMgPSBVU0JfVkVOX1JFUV9DTURfRkFJTDsKIAkJCQl9CiAJCQl9IGVsc2UgeyAvKiAgc3RhdHVzICE9IGxlbiAmJiBzdGF0dXMgPj0gMCAqLwogCQkJCWlmIChzdGF0dXMgPiAwKSB7CkBAIC0zMDMsNiArMzAyLDggQEAKIAkJaWYgKCh2YWx1ZSA+PSBGV184MTg4RV9TVEFSVF9BRERSRVNTICYmIHZhbHVlIDw9IEZXXzgxODhFX0VORF9BRERSRVNTKSB8fCBzdGF0dXMgPT0gbGVuKQogCQkJYnJlYWs7CiAJfQorCWtmcmVlKHBJb19idWYpOworCiByZWxlYXNlX211dGV4OgogCW11dGV4X3VubG9jaygmZHZvYmpwcml2LT51c2JfdmVuZG9yX3JlcV9tdXRleCk7CiBleGl0OgpAQCAtNDM0LDEwICs0MzUsNyBAQAogCQkJYnJlYWs7CiAJCWNhc2UgLUVQUk9UTzoKIAkJY2FzZSAtRU9WRVJGTE9XOgotCQkJewotCQkJCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7Ci0JCQkJaGFsZGF0YS0+c3Jlc3Rwcml2LldpZmlfRXJyb3JfU3RhdHVzID0gVVNCX1JFQURfUE9SVF9GQUlMOwotCQkJfQorCQkJYWRhcHQtPkhhbERhdGEtPnNyZXN0cHJpdi5XaWZpX0Vycm9yX1N0YXR1cyA9IFVTQl9SRUFEX1BPUlRfRkFJTDsKIAkJCXByZWN2YnVmLT5yZXVzZSA9IHRydWU7CiAJCQl1c2JfcmVhZF9wb3J0KGFkYXB0LCBwcmVjdnByaXYtPmZmX2h3YWRkciwgMCwgKHVuc2lnbmVkIGNoYXIgKilwcmVjdmJ1Zik7CiAJCQlicmVhazsKQEAgLTUyNSw3ICs1MjMsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgdXNiX3JlYWRfcG9ydF9jYW5jZWwoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQordm9pZCBydHdfaGFsX2luaXJwX2RlaW5pdChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCiB7CiAJaW50IGk7CiAJc3RydWN0IHJlY3ZfYnVmICpwcmVjdmJ1ZjsKQEAgLTY5MSw3ICs2ODksNyBAQAogCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnB4bWl0cHJpdi0+eG1pdF90YXNrbGV0KTsKIH0KIAotdTMyIHVzYl93cml0ZV9wb3J0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTMyIGFkZHIsIHUzMiBjbnQsIHU4ICp3bWVtKQordTMyIHVzYl93cml0ZV9wb3J0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTMyIGFkZHIsIHUzMiBjbnQsIHN0cnVjdCB4bWl0X2J1ZiAqeG1pdGJ1ZikKIHsKIAl1bnNpZ25lZCBsb25nIGlycUw7CiAJdW5zaWduZWQgaW50IHBpcGU7CkBAIC03MDAsOCArNjk4LDcgQEAKIAlzdHJ1Y3QgdXJiICpwdXJiID0gTlVMTDsKIAlzdHJ1Y3QgZHZvYmpfcHJpdgkqcGR2b2JqID0gYWRhcHRlcl90b19kdm9iaihwYWRhcHRlcik7CiAJc3RydWN0IHhtaXRfcHJpdgkqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmID0gKHN0cnVjdCB4bWl0X2J1ZiAqKXdtZW07Ci0Jc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUgPSAoc3RydWN0IHhtaXRfZnJhbWUgKilweG1pdGJ1Zi0+cHJpdl9kYXRhOworCXN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lID0gKHN0cnVjdCB4bWl0X2ZyYW1lICopeG1pdGJ1Zi0+cHJpdl9kYXRhOwogCXN0cnVjdCB1c2JfZGV2aWNlICpwdXNiZCA9IHBkdm9iai0+cHVzYmRldjsKIAogCkBAIC03MTEsNyArNzA4LDcgQEAKIAkgICAgKHBhZGFwdGVyLT5wd3JjdHJscHJpdi5wbnBfYnN0b3BfdHJ4KSkgewogCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKIAkJCSAoInVzYl93cml0ZV9wb3J0OiggcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8cGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgfHxhZGFwdGVyLT5wd3JjdHJscHJpdi5wbnBfYnN0b3BfdHJ4KSEhIVxuIikpOwotCQlydHdfc2N0eF9kb25lX2VycigmcHhtaXRidWYtPnNjdHgsIFJUV19TQ1RYX0RPTkVfVFhfREVOWSk7CisJCXJ0d19zY3R4X2RvbmVfZXJyKCZ4bWl0YnVmLT5zY3R4LCBSVFdfU0NUWF9ET05FX1RYX0RFTlkpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC03MjAsNDQgKzcxNyw0NCBAQAogCXN3aXRjaCAoYWRkcikgewogCWNhc2UgVk9fUVVFVUVfSU5YOgogCQlweG1pdHByaXYtPnZvcV9jbnQrKzsKLQkJcHhtaXRidWYtPmZsYWdzID0gVk9fUVVFVUVfSU5YOworCQl4bWl0YnVmLT5mbGFncyA9IFZPX1FVRVVFX0lOWDsKIAkJYnJlYWs7CiAJY2FzZSBWSV9RVUVVRV9JTlg6CiAJCXB4bWl0cHJpdi0+dmlxX2NudCsrOwotCQlweG1pdGJ1Zi0+ZmxhZ3MgPSBWSV9RVUVVRV9JTlg7CisJCXhtaXRidWYtPmZsYWdzID0gVklfUVVFVUVfSU5YOwogCQlicmVhazsKIAljYXNlIEJFX1FVRVVFX0lOWDoKIAkJcHhtaXRwcml2LT5iZXFfY250Kys7Ci0JCXB4bWl0YnVmLT5mbGFncyA9IEJFX1FVRVVFX0lOWDsKKwkJeG1pdGJ1Zi0+ZmxhZ3MgPSBCRV9RVUVVRV9JTlg7CiAJCWJyZWFrOwogCWNhc2UgQktfUVVFVUVfSU5YOgogCQlweG1pdHByaXYtPmJrcV9jbnQrKzsKLQkJcHhtaXRidWYtPmZsYWdzID0gQktfUVVFVUVfSU5YOworCQl4bWl0YnVmLT5mbGFncyA9IEJLX1FVRVVFX0lOWDsKIAkJYnJlYWs7CiAJY2FzZSBISUdIX1FVRVVFX0lOWDoKLQkJcHhtaXRidWYtPmZsYWdzID0gSElHSF9RVUVVRV9JTlg7CisJCXhtaXRidWYtPmZsYWdzID0gSElHSF9RVUVVRV9JTlg7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXB4bWl0YnVmLT5mbGFncyA9IE1HVF9RVUVVRV9JTlg7CisJCXhtaXRidWYtPmZsYWdzID0gTUdUX1FVRVVFX0lOWDsKIAkJYnJlYWs7CiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHhtaXRwcml2LT5sb2NrLCBpcnFMKTsKIAotCXB1cmIJPSBweG1pdGJ1Zi0+cHhtaXRfdXJiWzBdOworCXB1cmIJPSB4bWl0YnVmLT5weG1pdF91cmJbMF07CiAKIAkvKiB0cmFuc2xhdGUgRE1BIEZJRk8gYWRkciB0byBwaXBlaGFuZGxlICovCiAJcGlwZSA9IGZmYWRkcjJwaXBlaGRsKHBkdm9iaiwgYWRkcik7CiAKIAl1c2JfZmlsbF9idWxrX3VyYihwdXJiLCBwdXNiZCwgcGlwZSwKLQkJCSAgcHhtaXRmcmFtZS0+YnVmX2FkZHIsIC8qICBweG1pdGJ1Zi0+cGJ1ZiAqLworCQkJICBweG1pdGZyYW1lLT5idWZfYWRkciwgLyogIHhtaXRidWYtPnBidWYgKi8KIAkJCSAgY250LAogCQkJICB1c2Jfd3JpdGVfcG9ydF9jb21wbGV0ZSwKLQkJCSAgcHhtaXRidWYpOy8qIGNvbnRleHQgaXMgcHhtaXRidWYgKi8KKwkJCSAgeG1pdGJ1Zik7LyogY29udGV4dCBpcyB4bWl0YnVmICovCiAKIAlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYihwdXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAoc3RhdHVzKSB7Ci0JCXJ0d19zY3R4X2RvbmVfZXJyKCZweG1pdGJ1Zi0+c2N0eCwgUlRXX1NDVFhfRE9ORV9XUklURV9QT1JUX0VSUik7CisJCXJ0d19zY3R4X2RvbmVfZXJyKCZ4bWl0YnVmLT5zY3R4LCBSVFdfU0NUWF9ET05FX1dSSVRFX1BPUlRfRVJSKTsKIAkJREJHXzg4RSgidXNiX3dyaXRlX3BvcnQsIHN0YXR1cyA9JWRcbiIsIHN0YXR1cyk7CiAJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLCAoInVzYl93cml0ZV9wb3J0KCk6IHVzYl9zdWJtaXRfdXJiLCBzdGF0dXMgPSV4XG4iLCBzdGF0dXMpKTsKIApAQCAtNzc5LDcgKzc3Niw3IEBACiAKIGV4aXQ6CiAJaWYgKHJldCAhPSBfU1VDQ0VTUykKLQkJcnR3X2ZyZWVfeG1pdGJ1ZihweG1pdHByaXYsIHB4bWl0YnVmKTsKKwkJcnR3X2ZyZWVfeG1pdGJ1ZihweG1pdHByaXYsIHhtaXRidWYpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTg0Niw3ICs4NDMsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlyZXQgPSBydGw4MTg4ZXVfeG1pdGZyYW1lX2NvbXBsZXRlKGFkYXB0LCBweG1pdHByaXYsIE5VTEwpOworCQlyZXQgPSBydGw4MTg4ZXVfeG1pdGZyYW1lX2NvbXBsZXRlKGFkYXB0LCBweG1pdHByaXYpOwogCiAJCWlmICghcmV0KQogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC94bWl0X2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC94bWl0X2xpbnV4LmMKaW5kZXggMjIxZTI3NS4uNGIxYjA0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAveG1pdF9saW51eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3htaXRfbGludXguYwpAQCAtNzIsNyArNzIsNyBAQAogCWlmIChweG1pdGJ1Zi0+cGFsbG9jYXRlZF9idWYgPT0gTlVMTCkKIAkJcmV0dXJuIF9GQUlMOwogCi0JcHhtaXRidWYtPnBidWYgPSAodTggKilOX0JZVEVfQUxJR01FTlQoKHNpemVfdCkocHhtaXRidWYtPnBhbGxvY2F0ZWRfYnVmKSwgWE1JVEJVRl9BTElHTl9TWik7CisJcHhtaXRidWYtPnBidWYgPSBQVFJfQUxJR04ocHhtaXRidWYtPnBhbGxvY2F0ZWRfYnVmLCBYTUlUQlVGX0FMSUdOX1NaKTsKIAlweG1pdGJ1Zi0+ZG1hX3RyYW5zZmVyX2FkZHIgPSAwOwogCiAJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2RvdDExZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2RvdDExZC5jCmluZGV4IDRkOGZiNDEuLjI1NzI1YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9kb3QxMWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvZG90MTFkLmMKQEAgLTUxLDkgKzUxLDggQEAKIAlwRG90MTFkSW5mby0+U3RhdGUgPSBET1QxMURfU1RBVEVfTk9ORTsKIAlwRG90MTFkSW5mby0+Q291bnRyeUllTGVuID0gMDsKIAltZW1zZXQocERvdDExZEluZm8tPmNoYW5uZWxfbWFwLCAwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7Ci0JbWVtc2V0KHBEb3QxMWRJbmZvLT5NYXhUeFB3ckRibUxpc3QsIDB4RkYsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKKwltZW1zZXQocERvdDExZEluZm8tPk1heFR4UHdyRGJtTGlzdCwgMHhGRiwgTUFYX0NIQU5ORUxfTlVNQkVSICsgMSk7CiAJUkVTRVRfQ0lFX1dBVENIRE9HKGllZWUpOwotCiB9CiBFWFBPUlRfU1lNQk9MKGRvdDExZF9pbml0KTsKIApAQCAtOTksMTQgKzk4LDEzIEBACiB9CiBFWFBPUlRfU1lNQk9MKERvdDExZF9DaGFubmVsbWFwKTsKIAotCiB2b2lkIERvdDExZF9SZXNldChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKIHsKIAlzdHJ1Y3QgcnRfZG90MTFkX2luZm8gKnBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGllZWUpOwogCXUzMiBpOwogCi0JbWVtc2V0KHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcCwgMCwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOwotCW1lbXNldChwRG90MTFkSW5mby0+TWF4VHhQd3JEYm1MaXN0LCAweEZGLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7CisJbWVtc2V0KHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcCwgMCwgTUFYX0NIQU5ORUxfTlVNQkVSICsgMSk7CisJbWVtc2V0KHBEb3QxMWRJbmZvLT5NYXhUeFB3ckRibUxpc3QsIDB4RkYsIE1BWF9DSEFOTkVMX05VTUJFUiArIDEpOwogCWZvciAoaSA9IDE7IGkgPD0gMTE7IGkrKykKIAkJKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcClbaV0gPSAxOwogCWZvciAoaSA9IDEyOyBpIDw9IDE0OyBpKyspCkBAIC0xMjMsOCArMTIxLDggQEAKIAl1OCBpLCBqLCBOdW1UcmlwbGVzLCBNYXhDaG5sTnVtOwogCXN0cnVjdCBjaG5sX3R4cG93X3RyaXBsZSAqcFRyaXBsZTsKIAotCW1lbXNldChwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXAsIDAsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKLQltZW1zZXQocERvdDExZEluZm8tPk1heFR4UHdyRGJtTGlzdCwgMHhGRiwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOworCW1lbXNldChwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXAsIDAsIE1BWF9DSEFOTkVMX05VTUJFUiArIDEpOworCW1lbXNldChwRG90MTFkSW5mby0+TWF4VHhQd3JEYm1MaXN0LCAweEZGLCBNQVhfQ0hBTk5FTF9OVU1CRVIgKyAxKTsKIAlNYXhDaG5sTnVtID0gMDsKIAlOdW1UcmlwbGVzID0gKENvdXRyeUllTGVuIC0gMykgLyAzOwogCXBUcmlwbGUgPSAoc3RydWN0IGNobmxfdHhwb3dfdHJpcGxlICopKHBDb3V0cnlJZSArIDMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2RvdDExZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2RvdDExZC5oCmluZGV4IDczNWExOTkuLmFhYzM5NWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9kb3QxMWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvZG90MTFkLmgKQEAgLTQ3LDggKzQ3LDggQEAKIAl1OCAgQ291bnRyeUllU3JjQWRkcls2XTsKIAl1OCAgQ291bnRyeUllV2F0Y2hkb2c7CiAKLQl1OCAgY2hhbm5lbF9tYXBbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOwotCXU4ICBNYXhUeFB3ckRibUxpc3RbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOworCXU4ICBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIgKyAxXTsKKwl1OCAgTWF4VHhQd3JEYm1MaXN0W01BWF9DSEFOTkVMX05VTUJFUiArIDFdOwogCiAJZW51bSBkb3QxMWRfc3RhdGUgU3RhdGU7CiB9OwpAQCAtNzgsNiArNzgsNyBAQAogewogCUdFVF9DSUVfV0FUQ0hET0coX19wSWVlZURldikgPSAwOwogfQorCiAjZGVmaW5lIFVQREFURV9DSUVfV0FUQ0hET0coX19wSWVlZURldikgKCsrR0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSkKIAogdm9pZCBkb3QxMWRfaW5pdChzdHJ1Y3QgcnRsbGliX2RldmljZSAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOTJFX2Rldi5jCmluZGV4IGJhNjRhNGYuLjhkNmJjYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9kZXYuYwpAQCAtMTQ4Nyw4ICsxNDg3LDggQEAKIAlzdHJ1Y3QgcGh5X29mZG1fcnhfc3RhdHVzX3J4c2Nfc2dpZW5fZXhpbnRmZmxhZyAqcHJ4c2M7CiAJdTggKnByeHBrdDsKIAl1OCBpLCBtYXhfc3BhdGlhbF9zdHJlYW0sIHRtcF9yeHNuciwgdG1wX3J4ZXZtLCByeHNjX3NnaWVuX2V4ZmxnOwotCWNoYXIgcnhfcHdyWzRdLCByeF9wd3JfYWxsID0gMDsKLQljaGFyIHJ4X3NuclgsIHJ4X2V2bVg7CisJczggcnhfcHdyWzRdLCByeF9wd3JfYWxsID0gMDsKKwlzOCByeF9zbnJYLCByeF9ldm1YOwogCXU4IGV2bSwgcHdkYl9hbGw7CiAJdTMyIFJTU0ksIHRvdGFsX3Jzc2kgPSAwOwogCXU4IGlzX2Nja19yYXRlID0gMDsKQEAgLTE2MTMsNyArMTYxMyw3IEBACiAJCQkJICAgICAyKSAtIDExMDsKIAogCQkJdG1wX3J4c25yID0gcG9mZG1fYnVmLT5yeHNucl9YW2ldOwotCQkJcnhfc25yWCA9IChjaGFyKSh0bXBfcnhzbnIpOworCQkJcnhfc25yWCA9IChzOCkodG1wX3J4c25yKTsKIAkJCXJ4X3NuclggLz0gMjsKIAkJCXByaXYtPnN0YXRzLnJ4U05SZEJbaV0gPSAobG9uZylyeF9zbnJYOwogCkBAIC0xNjQzLDcgKzE2NDMsNyBAQAogCiAJCWZvciAoaSA9IDA7IGkgPCBtYXhfc3BhdGlhbF9zdHJlYW07IGkrKykgewogCQkJdG1wX3J4ZXZtID0gcG9mZG1fYnVmLT5yeGV2bV9YW2ldOwotCQkJcnhfZXZtWCA9IChjaGFyKSh0bXBfcnhldm0pOworCQkJcnhfZXZtWCA9IChzOCkodG1wX3J4ZXZtKTsKIAogCQkJcnhfZXZtWCAvPSAyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOTJFX2h3aW1nLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOTJFX2h3aW1nLmMKaW5kZXggMjljZWZiNS4uZDQzN2E4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9od2ltZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfaHdpbWcuYwpAQCAtMTEsNyArMTEsNyBAQAogICoKICAqIENvbnRhY3QgSW5mb3JtYXRpb246CiAgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLypDcmVhdGVkIG9uICAyMDA4LzExLzE4LCAgMzogNyovCiAKICNpbmNsdWRlICJyODE5MkVfaHdpbWcuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfcGh5LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOTJFX3BoeS5jCmluZGV4IDVlM2JiZTUuLmRkZTQ5MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfcGh5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9waHkuYwpAQCAtMjU2LDcgKzI1Niw3IEBACiAJCXJldHVybiAwOwogCWlmIChwcml2LT5ydGxsaWItPmVSRlBvd2VyU3RhdGUgIT0gZVJmT24gJiYgIXByaXYtPmJlaW5nX2luaXRfYWRhcHRlcikKIAkJcmV0dXJuCTA7Ci0JZG93bigmcHJpdi0+cmZfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT5yZl9tdXRleCk7CiAJaWYgKHByaXYtPlJmX01vZGUgPT0gUkZfT1BfQnlfRlcpIHsKIAkJT3JpZ2luYWxfVmFsdWUgPSBfcnRsOTJlX3BoeV9yZl9md19yZWFkKGRldiwgZVJGUGF0aCwgUmVnQWRkcik7CiAJCXVkZWxheSgyMDApOwpAQCAtMjY1LDcgKzI2NSw3IEBACiAJfQogCUJpdFNoaWZ0ID0gIF9ydGw5MmVfY2FsY3VsYXRlX2JpdF9zaGlmdChCaXRNYXNrKTsKIAlSZWFkYmFja19WYWx1ZSA9IChPcmlnaW5hbF9WYWx1ZSAmIEJpdE1hc2spID4+IEJpdFNoaWZ0OwotCXVwKCZwcml2LT5yZl9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+cmZfbXV0ZXgpOwogCXJldHVybiBSZWFkYmFja19WYWx1ZTsKIH0KIApAQCAtNjMwLDcgKzYzMCw3IEBACiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOwogCXU4CXBvd2VybGV2ZWwgPSAwLCBwb3dlcmxldmVsT0ZETTI0RyA9IDA7Ci0JY2hhciBhbnRfcHdyX2RpZmY7CisJczgJYW50X3B3cl9kaWZmOwogCXUzMgl1NFJlZ1ZhbHVlOwogCiAJaWYgKHByaXYtPmVwcm9tdHlwZSA9PSBFRVBST01fOTNDNDYpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfY2FtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2NhbS5jCmluZGV4IDgwM2M4YjAuLjMwZjY1YWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfY2FtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9jYW0uYwpAQCAtMTA3LDkgKzEwNyw5IEBACiAJCQkJCSAgICBfX2Z1bmNfXyk7CiAJCQkJcmV0dXJuOwogCQkJfQotCQkJZG93bigmcHJpdi0+cnRsbGliLT5pcHNfc2VtKTsKKwkJCW11dGV4X2xvY2soJnByaXYtPnJ0bGxpYi0+aXBzX211dGV4KTsKIAkJCXJ0bDkyZV9pcHNfbGVhdmUoZGV2KTsKLQkJCXVwKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOworCQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5ydGxsaWItPmlwc19tdXRleCk7CiAJCX0KIAl9CiAJcHJpdi0+cnRsbGliLT5pc19zZXRfa2V5ID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9jb3JlLmMKaW5kZXggMTNhNWRkYy4uNGMzMGVlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9jb3JlLmMKQEAgLTM4LDcgKzM4LDcgQEAKIHN0YXRpYyBjaGFyICppZm5hbWUgPSAid2xhbiVkIjsKIAogCi1zdGF0aWMgc3RydWN0IHJ0bDgxOXhfb3BzIHJ0bDgxOXhwX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRsODE5eF9vcHMgcnRsODE5eHBfb3BzID0gewogCS5uaWNfdHlwZQkJCT0gTklDXzgxOTJFLAogCS5nZXRfZWVwcm9tX3NpemUJCT0gcnRsOTJlX2dldF9lZXByb21fc2l6ZSwKIAkuaW5pdF9hZGFwdGVyX3ZhcmlhYmxlCQk9IHJ0bDkyZV9pbml0X3ZhcmlhYmxlcywKQEAgLTk5Myw4ICs5OTMsOCBAQAogCXNwaW5fbG9ja19pbml0KCZwcml2LT5pcnFfdGhfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnByaXYtPnJmX3BzX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZwcml2LT5wc19sb2NrKTsKLQlzZW1hX2luaXQoJnByaXYtPnd4X3NlbSwgMSk7Ci0Jc2VtYV9pbml0KCZwcml2LT5yZl9zZW0sIDEpOworCW11dGV4X2luaXQoJnByaXYtPnd4X211dGV4KTsKKwltdXRleF9pbml0KCZwcml2LT5yZl9tdXRleCk7CiAJbXV0ZXhfaW5pdCgmcHJpdi0+bXV0ZXgpOwogfQogCkBAIC0xMjQ3LDcgKzEyNDcsNyBAQAogCiBSRVNFVF9TVEFSVDoKIAotCQlkb3duKCZwcml2LT53eF9zZW0pOworCQltdXRleF9sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAkJaWYgKHByaXYtPnJ0bGxpYi0+c3RhdGUgPT0gUlRMTElCX0xJTktFRCkKIAkJCXJ0bDkyZV9sZWlzdXJlX3BzX2xlYXZlKGRldik7CkBAIC0xMjU1LDcgKzEyNTUsNyBAQAogCQlpZiAocHJpdi0+dXApIHsKIAkJCW5ldGRldl9pbmZvKGRldiwgIiVzKCk6dGhlIGRyaXZlciBpcyBub3QgdXAuXG4iLAogCQkJCSAgICBfX2Z1bmNfXyk7Ci0JCQl1cCgmcHJpdi0+d3hfc2VtKTsKKwkJCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCQkJcmV0dXJuOwogCQl9CiAJCXByaXYtPnVwID0gMDsKQEAgLTEyNzcsMTQgKzEyNzcsMTQgQEAKIAkJcnRsbGliX3N0b3Bfc2Nhbl9zeW5jcm8oaWVlZSk7CiAKIAkJaWYgKGllZWUtPnN0YXRlID09IFJUTExJQl9MSU5LRUQpIHsKLQkJCVNFTV9ET1dOX0lFRUVfV1goJmllZWUtPnd4X3NlbSk7CisJCQltdXRleF9sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAJCQluZXRkZXZfaW5mbyhkZXYsICJpZWVlLT5zdGF0ZSBpcyBSVExMSUJfTElOS0VEXG4iKTsKIAkJCXJ0bGxpYl9zdG9wX3NlbmRfYmVhY29ucyhwcml2LT5ydGxsaWIpOwogCQkJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CiAJCQljYW5jZWxfZGVsYXllZF93b3JrKCZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EpOwogCQkJcnRsbGliX3N0b3Bfc2NhbihpZWVlKTsKIAkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7Ci0JCQlTRU1fVVBfSUVFRV9XWCgmaWVlZS0+d3hfc2VtKTsKKwkJCW11dGV4X3VubG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCQl9IGVsc2UgewogCQkJbmV0ZGV2X2luZm8oZGV2LCAiaWVlZS0+c3RhdGUgaXMgTk9UIExJTktFRFxuIik7CiAJCQlydGxsaWJfc29mdG1hY19zdG9wX3Byb3RvY29sKHByaXYtPnJ0bGxpYiwgMCwgdHJ1ZSk7CkBAIC0xMjkyLDcgKzEyOTIsNyBAQAogCiAJCXJ0bDkyZV9kbV9iYWNrdXBfc3RhdGUoZGV2KTsKIAotCQl1cCgmcHJpdi0+d3hfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAJCVJUX1RSQUNFKENPTVBfUkVTRVQsCiAJCQkgIiVzKCk6PD09PT09PT09PT1kb3duIHByb2Nlc3MgaXMgZmluaXNoZWRcbiIsCiAJCQkgX19mdW5jX18pOwpAQCAtMTk4Miw3ICsxOTgyLDcgQEAKIAkJCQkJd2VpZ2h0aW5nKSAvIDY7CiB9CiAKLXU4IHJ0bDkyZV9yeF9kYl90b19wZXJjZW50KGNoYXIgYW50cG93ZXIpCit1OCBydGw5MmVfcnhfZGJfdG9fcGVyY2VudChzOCBhbnRwb3dlcikKIHsKIAlpZiAoKGFudHBvd2VyIDw9IC0xMDApIHx8IChhbnRwb3dlciA+PSAyMCkpCiAJCXJldHVybgkwOwpAQCAtMTk5Myw5ICsxOTkzLDkgQEAKIAogfQkvKiBRdWVyeVJ4UHdyUGVyY2VudGFnZSAqLwogCi11OCBydGw5MmVfZXZtX2RiX3RvX3BlcmNlbnQoY2hhciB2YWx1ZSkKK3U4IHJ0bDkyZV9ldm1fZGJfdG9fcGVyY2VudChzOCB2YWx1ZSkKIHsKLQljaGFyIHJldF92YWw7CisJczggcmV0X3ZhbDsKIAogCXJldF92YWwgPSB2YWx1ZTsKIApAQCAtMjE3OSw5ICsyMTc5LDkgQEAKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CiAJaW50IHJldDsKIAotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCXJldCA9IF9ydGw5MmVfdHJ5X3VwKGRldik7Ci0JdXAoJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAJcmV0dXJuIHJldDsKIAogfQpAQCAtMjIwNiwxMSArMjIwNiwxMSBAQAogCQlydGxsaWJfc3RvcF9zY2FuKHByaXYtPnJ0bGxpYik7CiAJfQogCi0JZG93bigmcHJpdi0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlyZXQgPSBfcnRsOTJlX2Rvd24oZGV2LCB0cnVlKTsKIAotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIApAQCAtMjI0MiwxMSArMjI0MiwxMSBAQAogCQkJCSAgcmVzZXRfd3EpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5ydGxsaWItPmRldjsKIAotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJcnRsOTJlX2NvbW1pdChkZXYpOwogCi0JdXAoJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9ydGw5MmVfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMjI2NSwxMiArMjI2NSwxMiBAQAogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKIAlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBtYWM7CiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAogCWV0aGVyX2FkZHJfY29weShkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhKTsKIAogCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJlc2V0X3dxKTsKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldHVybiAwOwogfQpAQCAtMjI4Nyw3ICsyMjg3LDcgQEAKIAlzdHJ1Y3QgaXdfcG9pbnQgKnAgPSAmd3JxLT51LmRhdGE7CiAJc3RydWN0IGllZWVfcGFyYW0gKmlwdyA9IE5VTEw7CiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBSVExfSU9DVExfV1BBX1NVUFBMSUNBTlQ6CkBAIC0yMzkzLDcgKzIzOTMsNyBAQAogCX0KIAogb3V0OgotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfY29yZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9jb3JlLmgKaW5kZXggZjYyN2ZkYy4uYmFiYzBiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9jb3JlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9jb3JlLmgKQEAgLTM3NSw4ICszNzUsOCBAQAogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAkJaXJxX3R4X3Rhc2tsZXQ7CiAJc3RydWN0IHRhc2tsZXRfc3RydWN0CQlpcnFfcHJlcGFyZV9iZWFjb25fdGFza2xldDsKIAotCXN0cnVjdCBzZW1hcGhvcmUJCQl3eF9zZW07Ci0Jc3RydWN0IHNlbWFwaG9yZQkJCXJmX3NlbTsKKwlzdHJ1Y3QgbXV0ZXgJCQkJd3hfbXV0ZXg7CisJc3RydWN0IG11dGV4CQkJCXJmX211dGV4OwogCXN0cnVjdCBtdXRleAkJCQltdXRleDsKIAogCXN0cnVjdCBydF9zdGF0cyBzdGF0czsKQEAgLTUwMyw4ICs1MDMsOCBAQAogCXUzMiBQd3JfVHJhY2s7CiAJdTggQ0NLUHJlc2VudEF0dGVudHVhdGlvbl8yME1kZWZhdWx0OwogCXU4IENDS1ByZXNlbnRBdHRlbnR1YXRpb25fNDBNZGVmYXVsdDsKLQljaGFyIENDS1ByZXNlbnRBdHRlbnR1YXRpb25fZGlmZmVyZW5jZTsKLQljaGFyIENDS1ByZXNlbnRBdHRlbnR1YXRpb247CisJczggQ0NLUHJlc2VudEF0dGVudHVhdGlvbl9kaWZmZXJlbmNlOworCXM4IENDS1ByZXNlbnRBdHRlbnR1YXRpb247CiAJbG9uZyB1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiOwogCiAJdTMyIE1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WzZdOwpAQCAtNjA0LDggKzYwNCw4IEBACiBsb25nIHJ0bDkyZV90cmFuc2xhdGVfdG9fZGJtKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LCB1OCBzaWduYWxfc3RyZW5ndGhfaW5kZXgpOwogdm9pZCBydGw5MmVfdXBkYXRlX3J4X3N0YXRpc3RpY3Moc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsCiAJCQkJIHN0cnVjdCBydGxsaWJfcnhfc3RhdHMgKnBwcmV2aW91c19zdGF0cyk7Ci11OCBydGw5MmVfZXZtX2RiX3RvX3BlcmNlbnQoY2hhciB2YWx1ZSk7Ci11OCBydGw5MmVfcnhfZGJfdG9fcGVyY2VudChjaGFyIGFudHBvd2VyKTsKK3U4IHJ0bDkyZV9ldm1fZGJfdG9fcGVyY2VudChzOCB2YWx1ZSk7Cit1OCBydGw5MmVfcnhfZGJfdG9fcGVyY2VudChzOCBhbnRwb3dlcik7CiB2b2lkIHJ0bDkyZV9jb3B5X21wZHVfc3RhdHMoc3RydWN0IHJ0bGxpYl9yeF9zdGF0cyAqcHNyY19zdGF0cywKIAkJCSAgICBzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICpwdGFyZ2V0X3N0YXRzKTsKIGJvb2wgcnRsOTJlX2VuYWJsZV9uaWMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX3BzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX3BzLmMKaW5kZXggOThlNGQ4OC4uYWE0YjAxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9wcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfcHMuYwpAQCAtMTc5LDkgKzE3OSw5IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKXJ0bGxpYl9wcml2KGRldik7CiAKLQlkb3duKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnJ0bGxpYi0+aXBzX211dGV4KTsKIAlydGw5MmVfaXBzX2xlYXZlKGRldik7Ci0JdXAoJnByaXYtPnJ0bGxpYi0+aXBzX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5ydGxsaWItPmlwc19tdXRleCk7CiB9CiAKIHZvaWQgcnRsOTJlX3J0bGxpYl9pcHNfbGVhdmVfd3Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTIwOSw5ICsyMDksOSBAQAogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopcnRsbGliX3ByaXYoZGV2KTsKIAotCWRvd24oJnByaXYtPnJ0bGxpYi0+aXBzX3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+cnRsbGliLT5pcHNfbXV0ZXgpOwogCXJ0bDkyZV9pcHNfbGVhdmUoZGV2KTsKLQl1cCgmcHJpdi0+cnRsbGliLT5pcHNfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnJ0bGxpYi0+aXBzX211dGV4KTsKIH0KIAogc3RhdGljIGJvb2wgX3J0bDkyZV9wc19zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBydFBzTW9kZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfd3guYwppbmRleCA3MGRmNmExLi43NDEzYTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX3d4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF93eC5jCkBAIC02NSwxMSArNjUsMTEgQEAKIAlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCiAJCXJldHVybiAwOwogCi0JZG93bigmcHJpdi0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlyZXQgPSBydGxsaWJfd3hfc2V0X3JhdGUocHJpdi0+cnRsbGliLCBpbmZvLCB3cnF1LCBleHRyYSk7CiAKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC04NCwxMSArODQsMTEgQEAKIAlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCiAJCXJldHVybiAwOwogCi0JZG93bigmcHJpdi0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlyZXQgPSBydGxsaWJfd3hfc2V0X3J0cyhwcml2LT5ydGxsaWIsIGluZm8sIHdycXUsIGV4dHJhKTsKIAotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTExNCwxMSArMTE0LDExIEBACiAJCQkgICAgX19mdW5jX18pOwogCQlyZXR1cm4gMDsKIAl9Ci0JZG93bigmcHJpdi0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlyZXQgPSBydGxsaWJfd3hfc2V0X3Bvd2VyKHByaXYtPnJ0bGxpYiwgaW5mbywgd3JxdSwgZXh0cmEpOwogCi0JdXAoJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTQyLDExICsxNDIsMTEgQEAKIAlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCiAJCXJldHVybiAwOwogCi0JZG93bigmcHJpdi0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlyZXQgPSBydGxsaWJfd3hfc2V0X3Jhd3R4KHByaXYtPnJ0bGxpYiwgaW5mbywgd3JxdSwgZXh0cmEpOwogCi0JdXAoJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogCkBAIC0xNTgsMTIgKzE1OCwxMiBAQAogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKIAotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJUlRfVFJBQ0UoQ09NUF9EQkcsICIlcygpOiBmb3JjZSByZXNldCAhIGV4dHJhIGlzICVkXG4iLAogCQkgX19mdW5jX18sICpleHRyYSk7CiAJcHJpdi0+Zm9yY2VfcmVzZXQgPSAqZXh0cmE7Ci0JdXAoJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAJcmV0dXJuIDA7CiAKIH0KQEAgLTE3Nyw3ICsxNzcsNyBAQAogCQkJCQkoJihwcml2LT5ydGxsaWItPlBvd2VyU2F2ZUNvbnRyb2wpKTsKIAlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSA9IHByaXYtPnJ0bGxpYjsKIAotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJUlRfVFJBQ0UoQ09NUF9QT1dFUiwgIiVzKCk6ICVzXG4iLCBfX2Z1bmNfXywgKCpleHRyYSA9PSA2KSA/CiAJCSAiREMgcG93ZXIiIDogIkFDIHBvd2VyIik7CkBAIC0xOTMsNyArMTkzLDcgQEAKIAkJaWVlZS0+cHMgPSAqZXh0cmE7CiAJfQogCi0JdXAoJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIwNywxMyArMjA3LDEzIEBACiAJc3RydWN0IHJ0X3B3cl9zYXZlX2N0cmwgKnBQU0MgPSAoc3RydWN0IHJ0X3B3cl9zYXZlX2N0cmwgKikKIAkJCQkJKCYocHJpdi0+cnRsbGliLT5Qb3dlclNhdmVDb250cm9sKSk7CiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAogCW5ldGRldl9pbmZvKGRldiwgIiVzKCk6IHNldCBscHMgYXdha2UgaW50ZXJ2YWwgISBleHRyYSBpcyAlZFxuIiwKIAkJICAgIF9fZnVuY19fLCAqZXh0cmEpOwogCiAJcFBTQy0+UmVnTWF4TFBTQXdha2VJbnR2bCA9ICpleHRyYTsKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjIzLDEzICsyMjMsMTMgQEAKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAogCW5ldGRldl9pbmZvKGRldiwKIAkJICAgICIlcygpOiBmb3JjZSBMUFMgISBleHRyYSBpcyAlZCAoMSBpcyBvcGVuIDAgaXMgY2xvc2UpXG4iLAogCQkgICAgX19mdW5jX18sICpleHRyYSk7CiAJcHJpdi0+Zm9yY2VfbHBzID0gKmV4dHJhOwotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCXJldHVybiAwOwogCiB9CkBAIC0yNjYsNyArMjY2LDcgQEAKIAlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCiAJCXJldHVybiAwOwogCXJ0U3RhdGUgPSBwcml2LT5ydGxsaWItPmVSRlBvd2VyU3RhdGU7Ci0JZG93bigmcHJpdi0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT53eF9tdXRleCk7CiAJaWYgKHdycXUtPm1vZGUgPT0gSVdfTU9ERV9BREhPQyB8fCB3cnF1LT5tb2RlID09IElXX01PREVfTU9OSVRPUiB8fAogCSAgICBpZWVlLT5iTmV0UHJvbWlzY3VvdXNNb2RlKSB7CiAJCWlmIChwcml2LT5ydGxsaWItPlBvd2VyU2F2ZUNvbnRyb2wuYkluYWN0aXZlUHMpIHsKQEAgLTI3NSwyMSArMjc1LDIxIEBACiAJCQkJICAgIFJGX0NIQU5HRV9CWV9JUFMpIHsKIAkJCQkJbmV0ZGV2X3dhcm4oZGV2LCAiJXMoKTogUkYgaXMgT0ZGLlxuIiwKIAkJCQkJCSAgICBfX2Z1bmNfXyk7Ci0JCQkJCXVwKCZwcml2LT53eF9zZW0pOworCQkJCQltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAkJCQkJcmV0dXJuIC0xOwogCQkJCX0KIAkJCQluZXRkZXZfaW5mbyhkZXYsCiAJCQkJCSAgICAiPT09PT09PT09PiVzKCk6IHJ0bDkyZV9pcHNfbGVhdmVcbiIsCiAJCQkJCSAgICBfX2Z1bmNfXyk7Ci0JCQkJZG93bigmcHJpdi0+cnRsbGliLT5pcHNfc2VtKTsKKwkJCQltdXRleF9sb2NrKCZwcml2LT5ydGxsaWItPmlwc19tdXRleCk7CiAJCQkJcnRsOTJlX2lwc19sZWF2ZShkZXYpOwotCQkJCXVwKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOworCQkJCW11dGV4X3VubG9jaygmcHJpdi0+cnRsbGliLT5pcHNfbXV0ZXgpOwogCQkJfQogCQl9CiAJfQogCXJldCA9IHJ0bGxpYl93eF9zZXRfbW9kZShwcml2LT5ydGxsaWIsIGEsIHdycXUsIGIpOwogCi0JdXAoJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDI1LDcgKzQyNSw3IEBACiAJCX0KIAl9CiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXByaXYtPnJ0bGxpYi0+Rmlyc3RJZV9JblNjYW4gPSB0cnVlOwogCkBAIC00MzYsMTUgKzQzNiwxNSBAQAogCQkJCSAgICBSRl9DSEFOR0VfQllfSVBTKSB7CiAJCQkJCW5ldGRldl93YXJuKGRldiwgIiVzKCk6IFJGIGlzIE9GRi5cbiIsCiAJCQkJCQkgICAgX19mdW5jX18pOwotCQkJCQl1cCgmcHJpdi0+d3hfc2VtKTsKKwkJCQkJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAJCQkJCXJldHVybiAtMTsKIAkJCQl9CiAJCQkJUlRfVFJBQ0UoQ09NUF9QUywKIAkJCQkJICI9PT09PT09PT0+JXMoKTogcnRsOTJlX2lwc19sZWF2ZVxuIiwKIAkJCQkJIF9fZnVuY19fKTsKLQkJCQlkb3duKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOworCQkJCW11dGV4X2xvY2soJnByaXYtPnJ0bGxpYi0+aXBzX211dGV4KTsKIAkJCQlydGw5MmVfaXBzX2xlYXZlKGRldik7Ci0JCQkJdXAoJnByaXYtPnJ0bGxpYi0+aXBzX3NlbSk7CisJCQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5ydGxsaWItPmlwc19tdXRleCk7CiAJCQl9CiAJCX0KIAkJcnRsbGliX3N0b3Bfc2Nhbihwcml2LT5ydGxsaWIpOwpAQCAtNDcxLDcgKzQ3MSw3IEBACiAJCXJldCA9IHJ0bGxpYl93eF9zZXRfc2Nhbihwcml2LT5ydGxsaWIsIGEsIHdycXUsIGIpOwogCX0KIAotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQ5MSwxMSArNDkxLDExIEBACiAJCXJldHVybiAwOwogCiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldCA9IHJ0bGxpYl93eF9nZXRfc2Nhbihwcml2LT5ydGxsaWIsIGEsIHdycXUsIGIpOwogCi0JdXAoJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNTEzLDEwICs1MTMsMTAgQEAKIAkJCSAgICBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAlyZXQgPSBydGxsaWJfd3hfc2V0X2Vzc2lkKHByaXYtPnJ0bGxpYiwgYSwgd3JxdSwgYik7CiAKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC01MjgsMTEgKzUyOCwxMSBAQAogCWludCByZXQ7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOwogCi0JZG93bigmcHJpdi0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlyZXQgPSBydGxsaWJfd3hfZ2V0X2Vzc2lkKHByaXYtPnJ0bGxpYiwgYSwgd3JxdSwgYik7CiAKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC01NDUsMTIgKzU0NSwxMiBAQAogCiAJaWYgKHdycXUtPmRhdGEubGVuZ3RoID4gSVdfRVNTSURfTUFYX1NJWkUpCiAJCXJldHVybiAtRTJCSUc7Ci0JZG93bigmcHJpdi0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT53eF9tdXRleCk7CiAJd3JxdS0+ZGF0YS5sZW5ndGggPSBtaW5fdChzaXplX3QsIHdycXUtPmRhdGEubGVuZ3RoLAogCQkJCSAgc2l6ZW9mKHByaXYtPm5pY2spKTsKIAltZW1zZXQocHJpdi0+bmljaywgMCwgc2l6ZW9mKHByaXYtPm5pY2spKTsKIAltZW1jcHkocHJpdi0+bmljaywgZXh0cmEsIHdycXUtPmRhdGEubGVuZ3RoKTsKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAlyZXR1cm4gMDsKIAogfQpAQCAtNTYxLDExICs1NjEsMTEgQEAKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAl3cnF1LT5kYXRhLmxlbmd0aCA9IHN0cmxlbihwcml2LT5uaWNrKTsKIAltZW1jcHkoZXh0cmEsIHByaXYtPm5pY2ssIHdycXUtPmRhdGEubGVuZ3RoKTsKIAl3cnF1LT5kYXRhLmZsYWdzID0gMTsgICAvKiBhY3RpdmUgKi8KLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTc5LDExICs1NzksMTEgQEAKIAlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCiAJCXJldHVybiAwOwogCi0JZG93bigmcHJpdi0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlyZXQgPSBydGxsaWJfd3hfc2V0X2ZyZXEocHJpdi0+cnRsbGliLCBhLCB3cnF1LCBiKTsKIAotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTY0NCwxMSArNjQ0LDExIEBACiAJaWYgKHByaXYtPmJId1JhZGlvT2ZmKQogCQlyZXR1cm4gMDsKIAotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJcmV0ID0gcnRsbGliX3d4X3NldF93YXAocHJpdi0+cnRsbGliLCBpbmZvLCBhd3JxLCBleHRyYSk7CiAKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldHVybiByZXQ7CiAKQEAgLTY5OCwxNCArNjk4LDE0IEBACiAJCXJldHVybiAtRU5FVERPV047CiAKIAlwcml2LT5ydGxsaWItPnd4X3NldF9lbmMgPSAxOwotCWRvd24oJnByaXYtPnJ0bGxpYi0+aXBzX3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+cnRsbGliLT5pcHNfbXV0ZXgpOwogCXJ0bDkyZV9pcHNfbGVhdmUoZGV2KTsKLQl1cCgmcHJpdi0+cnRsbGliLT5pcHNfc2VtKTsKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+cnRsbGliLT5pcHNfbXV0ZXgpOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAogCVJUX1RSQUNFKENPTVBfU0VDLCAiU2V0dGluZyBTVyB3ZXAga2V5Iik7CiAJcmV0ID0gcnRsbGliX3d4X3NldF9lbmNvZGUocHJpdi0+cnRsbGliLCBpbmZvLCB3cnF1LCBrZXkpOwotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAKIAlpZiAod3JxdS0+ZW5jb2RpbmcuZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHsKQEAgLTc5OSw3ICs3OTksNyBAQAogCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAogCWlmICh3cnF1LT5yZXRyeS5mbGFncyAmIElXX1JFVFJZX0xJRkVUSU1FIHx8CiAJICAgIHdycXUtPnJldHJ5LmRpc2FibGVkKSB7CkBAIC04MjIsNyArODIyLDcgQEAKIAogCXJ0bDkyZV9jb21taXQoZGV2KTsKIGV4aXQ6Ci0JdXAoJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtODc1LDcgKzg3NSw3IEBACiAJaWYgKHByaXYtPmJId1JhZGlvT2ZmKQogCQlyZXR1cm4gMDsKIAotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCWlmIChwcml2LT5yZl9zZXRfc2VucyA9PSBOVUxMKSB7CiAJCWVyciA9IC0xOyAvKiB3ZSBoYXZlIG5vdCB0aGlzIHN1cHBvcnQgZm9yIHRoaXMgcmFkaW8gKi8KIAkJZ290byBleGl0OwpAQCAtODg2LDcgKzg4Niw3IEBACiAJCWVyciA9IC1FSU5WQUw7CiAKIGV4aXQ6Ci0JdXAoJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtOTAyLDEyICs5MDIsMTIgQEAKIAlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCiAJCXJldHVybiAwOwogCi0JZG93bigmcHJpdi0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlwcml2LT5ydGxsaWItPnd4X3NldF9lbmMgPSAxOwotCWRvd24oJnByaXYtPnJ0bGxpYi0+aXBzX3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+cnRsbGliLT5pcHNfbXV0ZXgpOwogCXJ0bDkyZV9pcHNfbGVhdmUoZGV2KTsKLQl1cCgmcHJpdi0+cnRsbGliLT5pcHNfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnJ0bGxpYi0+aXBzX211dGV4KTsKIAogCXJldCA9IHJ0bGxpYl93eF9zZXRfZW5jb2RlX2V4dChpZWVlLCBpbmZvLCB3cnF1LCBleHRyYSk7CiAJewpAQCAtOTY5LDcgKzk2OSw3IEBACiAKIGVuZF9od19zZWM6CiAJcHJpdi0+cnRsbGliLT53eF9zZXRfZW5jID0gMDsKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAlyZXR1cm4gcmV0OwogCiB9CkBAIC05ODUsOSArOTg1LDkgQEAKIAlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCiAJCXJldHVybiAwOwogCi0JZG93bigmcHJpdi0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT53eF9tdXRleCk7CiAJcmV0ID0gcnRsbGliX3d4X3NldF9hdXRoKHByaXYtPnJ0bGxpYiwgaW5mbywgJihkYXRhLT5wYXJhbSksIGV4dHJhKTsKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMDAzLDkgKzEwMDMsOSBAQAogCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAlyZXQgPSBydGxsaWJfd3hfc2V0X21sbWUocHJpdi0+cnRsbGliLCBpbmZvLCB3cnF1LCBleHRyYSk7Ci0JdXAoJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTAyMCw5ICsxMDIwLDkgQEAKIAlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCiAJCXJldHVybiAwOwogCi0JZG93bigmcHJpdi0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT53eF9tdXRleCk7CiAJcmV0ID0gcnRsbGliX3d4X3NldF9nZW5faWUocHJpdi0+cnRsbGliLCBleHRyYSwgZGF0YS0+ZGF0YS5sZW5ndGgpOwotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEwOTcsMTQgKzEwOTcsMTQgQEAKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CiAJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUgPSBwcml2LT5ydGxsaWI7CiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXNucHJpbnRmKGV4dHJhLCA0NSwgIlByb21pc2N1b3VzTW9kZTolZCwgRmlsdGVyU3JjU1RBRnJhbWU6JWQiLAogCQkgaWVlZS0+SW50ZWxQcm9taXNjdW91c01vZGVJbmZvLmJQcm9taXNjdW91c09uLAogCQkgaWVlZS0+SW50ZWxQcm9taXNjdW91c01vZGVJbmZvLmJGaWx0ZXJTb3VyY2VTdGF0aW9uRnJhbWUpOwogCXdycXUtPmRhdGEubGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7CiAKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfUW9zLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9Rb3MuaAppbmRleCA0NjMxMjJkLi42MWRhOGY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9Rb3MuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9Rb3MuaApAQCAtMTY5LDkgKzE2OSw2IEBACiAJfSBUWVBFMl84MDIxUTsKIH07CiAKLSNkZWZpbmUgSXNBQ1ZhbGlkKGFjKQkJKChhYyA+PSAwICYmIGFjIDw9IDcpID8gdHJ1ZSA6IGZhbHNlKQotCi0KIHVuaW9uIGFjaV9haWZzbiB7CiAJdTgJY2hhckRhdGE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTl4X1RTUHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfVFNQcm9jLmMKaW5kZXggMmM4YTUyNi4uYTk2NmE4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfVFNQcm9jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfVFNQcm9jLmMKQEAgLTMwNiw2ICszMDYsMTEgQEAKIAlwVHNDb21tb25JbmZvLT5UQ2xhc051bSA9IFRDTEFTX051bTsKIH0KIAorc3RhdGljIGJvb2wgSXNBQ1ZhbGlkKHVuc2lnbmVkIGludCB0aWQpCit7CisJcmV0dXJuIHRpZCA8IDc7Cit9CisKIGJvb2wgR2V0VHMoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCB0c19jb21tb25faW5mbyAqKnBwVFMsCiAJICAgdTggKkFkZHIsIHU4IFRJRCwgZW51bSB0cl9zZWxlY3QgVHhSeFNlbGVjdCwgYm9vbCBiQWRkTmV3VHMpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliLmgKaW5kZXggNzc2ZTE3OS4uYjg5NWE1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWIuaApAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KQEAgLTUyMSw3ICs1MjEsNyBAQAogfTsKIAogI2lmbmRlZiBFVEhfUF9QQUUKLSNkZWZpbmUgRVRIX1BfUEFFIDB4ODg4RSAvKiBQb3J0IEFjY2VzcyBFbnRpdHkgKElFRUUgODAyLjFYKSAqLworI2RlZmluZSBFVEhfUF9QQUUJMHg4ODhFCQkvKiBQb3J0IEFjY2VzcyBFbnRpdHkgKElFRUUgODAyLjFYKSAqLwogI2RlZmluZSBFVEhfUF9JUAkweDA4MDAJCS8qIEludGVybmV0IFByb3RvY29sIHBhY2tldAkqLwogI2RlZmluZSBFVEhfUF9BUlAJMHgwODA2CQkvKiBBZGRyZXNzIFJlc29sdXRpb24gcGFja2V0CSovCiAjZW5kaWYgLyogRVRIX1BfUEFFICovCkBAIC0xNjUxLDkgKzE2NTEsOSBAQAogCXNob3J0IHByb3RvX3N0YXJ0ZWQ7CiAJc2hvcnQgcHJvdG9fc3RvcHBwaW5nOwogCi0Jc3RydWN0IHNlbWFwaG9yZSB3eF9zZW07Ci0Jc3RydWN0IHNlbWFwaG9yZSBzY2FuX3NlbTsKLQlzdHJ1Y3Qgc2VtYXBob3JlIGlwc19zZW07CisJc3RydWN0IG11dGV4IHd4X211dGV4OworCXN0cnVjdCBtdXRleCBzY2FuX211dGV4OworCXN0cnVjdCBtdXRleCBpcHNfbXV0ZXg7CiAKIAlzcGlubG9ja190IG1nbXRfdHhfbG9jazsKIAlzcGlubG9ja190IGJlYWNvbl9sb2NrOwpAQCAtMjIxMiw3ICsyMjEyLDUgQEAKIHZvaWQgSFRVc2VEZWZhdWx0U2V0dGluZyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSk7CiAjZGVmaW5lIFJUX0FTT0NfUkVUUllfTElNSVQJNQogdTggTWdudFF1ZXJ5X1R4UmF0ZUV4Y2x1ZGVDQ0tSYXRlcyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSk7Ci0jZGVmaW5lIFNFTV9ET1dOX0lFRUVfV1gocHNlbSkgZG93bihwc2VtKQotI2RlZmluZSBTRU1fVVBfSUVFRV9XWChwc2VtKSB1cChwc2VtKQogCiAjZW5kaWYgLyogUlRMTElCX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfbW9kdWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX21vZHVsZS5jCmluZGV4IGY0ZjMxOGEuLjlkNTc4OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfbW9kdWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9tb2R1bGUuYwpAQCAtMTM4LDcgKzEzOCw3IEBACiAJcnRsbGliX3NvZnRtYWNfaW5pdChpZWVlKTsKIAogCWllZWUtPnBIVEluZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfaGlfdGhyb3VnaHB1dCksIEdGUF9LRVJORUwpOwotCWlmIChpZWVlLT5wSFRJbmZvID09IE5VTEwpCisJaWYgKCFpZWVlLT5wSFRJbmZvKQogCQlyZXR1cm4gTlVMTDsKIAogCUhUVXBkYXRlRGVmYXVsdFNldHRpbmcoaWVlZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3NvZnRtYWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfc29mdG1hYy5jCmluZGV4IDYyMTU0ZTMuLmRhNzRkYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfc29mdG1hYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfc29mdG1hYy5jCkBAIC0yNzYsOCArMjc2LDkgQEAKIAl9CiB9CiAKLWlubGluZSB2b2lkIHNvZnRtYWNfcHNfbWdtdF94bWl0KHN0cnVjdCBza19idWZmICpza2IsCi0JCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQorc3RhdGljIGlubGluZSB2b2lkCitzb2Z0bWFjX3BzX21nbXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgIHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQogewogCXNob3J0IHNpbmdsZSA9IGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFOwogCXN0cnVjdCBydGxsaWJfaGRyXzNhZGRyICAqaGVhZGVyID0KQEAgLTUxMyw3ICs1MTQsNyBAQAogCiAJaWVlZS0+YmVfc2Nhbl9pbnByb2dyZXNzID0gdHJ1ZTsKIAotCWRvd24oJmllZWUtPnNjYW5fc2VtKTsKKwltdXRleF9sb2NrKCZpZWVlLT5zY2FuX211dGV4KTsKIAogCXdoaWxlICgxKSB7CiAJCWRvIHsKQEAgLTU2Niw3ICs1NjcsNyBAQAogCQlpZiAoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKIAkJCURPVDExRF9TY2FuQ29tcGxldGUoaWVlZSk7CiAJfQotCXVwKCZpZWVlLT5zY2FuX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpZWVlLT5zY2FuX211dGV4KTsKIAogCWllZWUtPmJlX3NjYW5faW5wcm9ncmVzcyA9IGZhbHNlOwogCkBAIC01ODcsNyArNTg4LDcgQEAKIAlpZiAocnRsbGliX2FjdF9zY2FubmluZyhpZWVlLCB0cnVlKSkKIAkJcmV0dXJuOwogCi0JZG93bigmaWVlZS0+c2Nhbl9zZW0pOworCW11dGV4X2xvY2soJmllZWUtPnNjYW5fbXV0ZXgpOwogCiAJaWYgKGllZWUtPmVSRlBvd2VyU3RhdGUgPT0gZVJmT2ZmKSB7CiAJCW5ldGRldl9pbmZvKGllZWUtPmRldiwKQEAgLTYxOCw3ICs2MTksNyBAQAogCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmaWVlZS0+c29mdG1hY19zY2FuX3dxLAogCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhSVExMSUJfU09GVE1BQ19TQ0FOX1RJTUUpKTsKIAotCXVwKCZpZWVlLT5zY2FuX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpZWVlLT5zY2FuX211dGV4KTsKIAlyZXR1cm47CiAKIG91dDoKQEAgLTYzMCw3ICs2MzEsNyBAQAogCWllZWUtPmFjdHNjYW5uaW5nID0gZmFsc2U7CiAJaWVlZS0+c2Nhbl93YXRjaF9kb2cgPSAwOwogCWllZWUtPnNjYW5uaW5nX2NvbnRpbnVlID0gMDsKLQl1cCgmaWVlZS0+c2Nhbl9zZW0pOworCW11dGV4X3VubG9jaygmaWVlZS0+c2Nhbl9tdXRleCk7CiB9CiAKIApAQCAtNjgzLDcgKzY4NCw3IEBACiAKIHN0YXRpYyB2b2lkIHJ0bGxpYl9zb2Z0bWFjX3N0b3Bfc2NhbihzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKIHsKLQlkb3duKCZpZWVlLT5zY2FuX3NlbSk7CisJbXV0ZXhfbG9jaygmaWVlZS0+c2Nhbl9tdXRleCk7CiAJaWVlZS0+c2Nhbl93YXRjaF9kb2cgPSAwOwogCWlmIChpZWVlLT5zY2FubmluZ19jb250aW51ZSA9PSAxKSB7CiAJCWllZWUtPnNjYW5uaW5nX2NvbnRpbnVlID0gMDsKQEAgLTY5Miw3ICs2OTMsNyBAQAogCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmllZWUtPnNvZnRtYWNfc2Nhbl93cSk7CiAJfQogCi0JdXAoJmllZWUtPnNjYW5fc2VtKTsKKwltdXRleF91bmxvY2soJmllZWUtPnNjYW5fbXV0ZXgpOwogfQogCiB2b2lkIHJ0bGxpYl9zdG9wX3NjYW4oc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCkBAIC03NTMsNyArNzU0LDcgQEAKIAl9CiB9CiAKLS8qIGNhbGxlZCB3aXRoIHd4X3NlbSBoZWxkICovCisvKiBjYWxsZWQgd2l0aCB3eF9tdXRleCBoZWxkICovCiB2b2lkIHJ0bGxpYl9zdGFydF9zY2FuX3N5bmNybyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggaXNfbWVzaCkKIHsKIAlpZiAoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkgewpAQCAtNzcwLDggKzc3MSwxMCBAQAogfQogRVhQT1JUX1NZTUJPTChydGxsaWJfc3RhcnRfc2Nhbl9zeW5jcm8pOwogCi1pbmxpbmUgc3RydWN0IHNrX2J1ZmYgKnJ0bGxpYl9hdXRoZW50aWNhdGlvbl9yZXEoc3RydWN0IHJ0bGxpYl9uZXR3b3JrICpiZWFjb24sCi0Jc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIGludCBjaGFsbGVuZ2VsZW4sIHU4ICpkYWRkcikKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKgorcnRsbGliX2F1dGhlbnRpY2F0aW9uX3JlcShzdHJ1Y3QgcnRsbGliX25ldHdvcmsgKmJlYWNvbiwKKwkJCSAgc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkgIGludCBjaGFsbGVuZ2VsZW4sIHU4ICpkYWRkcikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBydGxsaWJfYXV0aGVudGljYXRpb24gKmF1dGg7CkBAIC0xMTMwLDcgKzExMzMsNyBAQAogfQogCiAKLWlubGluZSBpbnQgU2VjSXNJblBNS0lETGlzdChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggKmJzc2lkKQorc3RhdGljIGlubGluZSBpbnQgU2VjSXNJblBNS0lETGlzdChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggKmJzc2lkKQogewogCWludCBpID0gMDsKIApAQCAtMTE0Niw4ICsxMTQ5LDkgQEAKIAlyZXR1cm4gaTsKIH0KIAotaW5saW5lIHN0cnVjdCBza19idWZmICpydGxsaWJfYXNzb2NpYXRpb25fcmVxKHN0cnVjdCBydGxsaWJfbmV0d29yayAqYmVhY29uLAotCQkJCQkgICAgICBzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKgorcnRsbGliX2Fzc29jaWF0aW9uX3JlcShzdHJ1Y3QgcnRsbGliX25ldHdvcmsgKmJlYWNvbiwKKwkJICAgICAgIHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHJ0bGxpYl9hc3NvY19yZXF1ZXN0X2ZyYW1lICpoZHI7CkBAIC0xNTkwLDcgKzE1OTQsNyBAQAogCXJ0bGxpYl9zdG9wX3NjYW5fc3luY3JvKGllZWUpOwogCWlmIChpZWVlLT5ydGxsaWJfaXBzX2xlYXZlICE9IE5VTEwpCiAJCWllZWUtPnJ0bGxpYl9pcHNfbGVhdmUoaWVlZS0+ZGV2KTsKLQlkb3duKCZpZWVlLT53eF9zZW0pOworCW11dGV4X2xvY2soJmllZWUtPnd4X211dGV4KTsKIAogCWlmIChpZWVlLT5kYXRhX2hhcmRfc3RvcCkKIAkJaWVlZS0+ZGF0YV9oYXJkX3N0b3AoaWVlZS0+ZGV2KTsKQEAgLTE2MDUsMTQgKzE2MDksMTQgQEAKIAkJCSBfX2Z1bmNfXyk7CiAJCWlmIChpZWVlLT5ydGxsaWJfaXBzX2xlYXZlX3dxICE9IE5VTEwpCiAJCQlpZWVlLT5ydGxsaWJfaXBzX2xlYXZlX3dxKGllZWUtPmRldik7Ci0JCXVwKCZpZWVlLT53eF9zZW0pOworCQltdXRleF91bmxvY2soJmllZWUtPnd4X211dGV4KTsKIAkJcmV0dXJuOwogCX0KIAlpZWVlLT5hc3NvY2lhdGVfc2VxID0gMTsKIAogCXJ0bGxpYl9hc3NvY2lhdGVfc3RlcDEoaWVlZSwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkKTsKIAotCXVwKCZpZWVlLT53eF9zZW0pOworCW11dGV4X3VubG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogfQogCiBpbmxpbmUgdm9pZCBydGxsaWJfc29mdG1hY19uZXdfbmV0KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLApAQCAtMjIwOSw4ICsyMjEzLDkgQEAKIAl9CiB9CiAKLWlubGluZSBpbnQgcnRsbGliX3J4X2Fzc29jX3Jlc3Aoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJc3RydWN0IHJ0bGxpYl9yeF9zdGF0cyAqcnhfc3RhdHMpCitzdGF0aWMgaW5saW5lIGludAorcnRsbGliX3J4X2Fzc29jX3Jlc3Aoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCSAgICAgc3RydWN0IHJ0bGxpYl9yeF9zdGF0cyAqcnhfc3RhdHMpCiB7CiAJdTE2IGVycmNvZGU7CiAJaW50IGFpZDsKQEAgLTIzNDQsOCArMjM0OSw5IEBACiAJfQogfQogCi1pbmxpbmUgaW50IHJ0bGxpYl9yeF9hdXRoKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICBzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICpyeF9zdGF0cykKK3N0YXRpYyBpbmxpbmUgaW50CitydGxsaWJfcnhfYXV0aChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkgICAgICAgc3RydWN0IHJ0bGxpYl9yeF9zdGF0cyAqcnhfc3RhdHMpCiB7CiAKIAlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUpIHsKQEAgLTIzNjEsNyArMjM2Nyw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLWlubGluZSBpbnQgcnRsbGliX3J4X2RlYXV0aChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbmxpbmUgaW50CitydGxsaWJfcnhfZGVhdXRoKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBydGxsaWJfaGRyXzNhZGRyICpoZWFkZXIgPSAoc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIgKikgc2tiLT5kYXRhOwogCXUxNiBmcmFtZV9jdGw7CkBAIC0yNTgyLDE2ICsyNTg5LDE2IEBACiAJCQkJICAgICBzdHJ1Y3QgcnRsbGliX2RldmljZSwgc3RhcnRfaWJzc193cSk7CiAJLyogaXdjb25maWcgbW9kZSBhZC1ob2Mgd2lsbCBzY2hlZHVsZSB0aGlzIGFuZCByZXR1cm4KIAkgKiBvbiB0aGUgb3RoZXIgaGFuZCB0aGlzIHdpbGwgYmxvY2sgZnVydGhlciBpd2NvbmZpZyBTRVQKLQkgKiBvcGVyYXRpb25zIGJlY2F1c2Ugb2YgdGhlIHd4X3NlbSBob2xkLgorCSAqIG9wZXJhdGlvbnMgYmVjYXVzZSBvZiB0aGUgd3hfbXV0ZXggaG9sZC4KIAkgKiBBbnl3YXkgc29tZSBtb3N0IHNldCBvcGVyYXRpb25zIHNldCBhIGZsYWcgdG8gc3BlZWQtdXAKIAkgKiAoYWJvcnQpIHRoaXMgd3EgKHdoZW4gc3luY3JvIHNjYW5uaW5nKSBiZWZvcmUgc2xlZXBpbmcKLQkgKiBvbiB0aGUgc2VtYXBob3JlCisJICogb24gdGhlIG11dGV4CiAJICovCiAJaWYgKCFpZWVlLT5wcm90b19zdGFydGVkKSB7CiAJCW5ldGRldl9pbmZvKGllZWUtPmRldiwgIj09PT09PT09PT1vaCBkcml2ZXIgZG93biByZXR1cm5cbiIpOwogCQlyZXR1cm47CiAJfQotCWRvd24oJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCiAJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9PSAwKSB7CiAJCXN0cmNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgUlRMTElCX0RFRkFVTFRfVFhfRVNTSUQpOwpAQCAtMjcwMyw3ICsyNzEwLDcgQEAKIAogCW5ldGlmX2NhcnJpZXJfb24oaWVlZS0+ZGV2KTsKIAotCXVwKCZpZWVlLT53eF9zZW0pOworCW11dGV4X3VubG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogfQogCiBpbmxpbmUgdm9pZCBydGxsaWJfc3RhcnRfaWJzcyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKQEAgLTI3MTEsNyArMjcxOCw3IEBACiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZpZWVlLT5zdGFydF9pYnNzX3dxLCBtc2Vjc190b19qaWZmaWVzKDE1MCkpOwogfQogCi0vKiB0aGlzIGlzIGNhbGxlZCBvbmx5IGluIHVzZXIgY29udGV4dCwgd2l0aCB3eF9zZW0gaGVsZCAqLworLyogdGhpcyBpcyBjYWxsZWQgb25seSBpbiB1c2VyIGNvbnRleHQsIHdpdGggd3hfbXV0ZXggaGVsZCAqLwogc3RhdGljIHZvaWQgcnRsbGliX3N0YXJ0X2JzcyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMjc3Myw3ICsyNzgwLDcgQEAKIAkJCQkgICAgIHN0cnVjdCBydGxsaWJfZGV2aWNlLCBhc3NvY2lhdGVfcmV0cnlfd3EpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkb3duKCZpZWVlLT53eF9zZW0pOworCW11dGV4X2xvY2soJmllZWUtPnd4X211dGV4KTsKIAlpZiAoIWllZWUtPnByb3RvX3N0YXJ0ZWQpCiAJCWdvdG8gZXhpdDsKIApAQCAtMjgwNiw3ICsyODEzLDcgQEAKIAogCWllZWUtPmJlaW5yZXRyeSA9IGZhbHNlOwogZXhpdDoKLQl1cCgmaWVlZS0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJmllZWUtPnd4X211dGV4KTsKIH0KIAogc3RhdGljIHN0cnVjdCBza19idWZmICpydGxsaWJfZ2V0X2JlYWNvbl8oc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCkBAIC0yODUzLDkgKzI4NjAsOSBAQAogCQkJCSAgdTggc2h1dGRvd24pCiB7CiAJcnRsbGliX3N0b3Bfc2Nhbl9zeW5jcm8oaWVlZSk7Ci0JZG93bigmaWVlZS0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAJcnRsbGliX3N0b3BfcHJvdG9jb2woaWVlZSwgc2h1dGRvd24pOwotCXVwKCZpZWVlLT53eF9zZW0pOworCW11dGV4X3VubG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTChydGxsaWJfc29mdG1hY19zdG9wX3Byb3RvY29sKTsKIApAQCAtMjkwMiw5ICsyOTA5LDkgQEAKIAogdm9pZCBydGxsaWJfc29mdG1hY19zdGFydF9wcm90b2NvbChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggbWVzaF9mbGFnKQogewotCWRvd24oJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCXJ0bGxpYl9zdGFydF9wcm90b2NvbChpZWVlKTsKLQl1cCgmaWVlZS0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJmllZWUtPnd4X211dGV4KTsKIH0KIEVYUE9SVF9TWU1CT0wocnRsbGliX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2wpOwogCkBAIC0zMDM0LDkgKzMwNDEsOSBAQAogCUlOSVRfV09SS19SU0woJmllZWUtPnd4X3N5bmNfc2Nhbl93cSwgKHZvaWQgKilydGxsaWJfd3hfc3luY19zY2FuX3dxLAogCQkgICAgICBpZWVlKTsKIAotCXNlbWFfaW5pdCgmaWVlZS0+d3hfc2VtLCAxKTsKLQlzZW1hX2luaXQoJmllZWUtPnNjYW5fc2VtLCAxKTsKLQlzZW1hX2luaXQoJmllZWUtPmlwc19zZW0sIDEpOworCW11dGV4X2luaXQoJmllZWUtPnd4X211dGV4KTsKKwltdXRleF9pbml0KCZpZWVlLT5zY2FuX211dGV4KTsKKwltdXRleF9pbml0KCZpZWVlLT5pcHNfbXV0ZXgpOwogCiAJc3Bpbl9sb2NrX2luaXQoJmllZWUtPm1nbXRfdHhfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmllZWUtPmJlYWNvbl9sb2NrKTsKQEAgLTMwNDksNyArMzA1Niw3IEBACiAKIHZvaWQgcnRsbGliX3NvZnRtYWNfZnJlZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKIHsKLQlkb3duKCZpZWVlLT53eF9zZW0pOworCW11dGV4X2xvY2soJmllZWUtPnd4X211dGV4KTsKIAlrZnJlZShpZWVlLT5wRG90MTFkSW5mbyk7CiAJaWVlZS0+cERvdDExZEluZm8gPSBOVUxMOwogCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOwpAQCAtMzA2NCw3ICszMDcxLDcgQEAKIAljYW5jZWxfd29ya19zeW5jKCZpZWVlLT5hc3NvY2lhdGVfY29tcGxldGVfd3EpOwogCWNhbmNlbF93b3JrX3N5bmMoJmllZWUtPmlwc19sZWF2ZV93cSk7CiAJY2FuY2VsX3dvcmtfc3luYygmaWVlZS0+d3hfc3luY19zY2FuX3dxKTsKLQl1cCgmaWVlZS0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJmllZWUtPnd4X211dGV4KTsKIAl0YXNrbGV0X2tpbGwoJmllZWUtPnBzX3Rhc2spOwogfQogCkBAIC0zMzk3LDggKzM0MDQsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLWlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqcnRsbGliX2Rpc2F1dGhfc2tiKHN0cnVjdCBydGxsaWJfbmV0d29yayAqYmVhY29uLAotCQlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTE2IGFzUnNuKQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqCitydGxsaWJfZGlzYXV0aF9za2Ioc3RydWN0IHJ0bGxpYl9uZXR3b3JrICpiZWFjb24sCisJCSAgIHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1MTYgYXNSc24pCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgcnRsbGliX2Rpc2F1dGggKmRpc2F1dGg7CkBAIC0zNDIzLDggKzM0MzEsOSBAQAogCXJldHVybiBza2I7CiB9CiAKLWlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqcnRsbGliX2Rpc2Fzc29jaWF0ZV9za2Ioc3RydWN0IHJ0bGxpYl9uZXR3b3JrICpiZWFjb24sCi0JCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1MTYgYXNSc24pCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICoKK3J0bGxpYl9kaXNhc3NvY2lhdGVfc2tiKHN0cnVjdCBydGxsaWJfbmV0d29yayAqYmVhY29uLAorCQkJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHUxNiBhc1JzbikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBydGxsaWJfZGlzYXNzb2MgKmRpc2FzczsKQEAgLTM0OTksNyArMzUwOCw3IEBACiAJc3RydWN0IGllZWVfcGFyYW0gKnBhcmFtOwogCWludCByZXQgPSAwOwogCi0JZG93bigmaWVlZS0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAKIAlpZiAocC0+bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBpZWVlX3BhcmFtKSB8fCAhcC0+cG9pbnRlcikgewogCQlyZXQgPSAtRUlOVkFMOwpAQCAtMzU0Myw3ICszNTUyLDcgQEAKIAogCWtmcmVlKHBhcmFtKTsKIG91dDoKLQl1cCgmaWVlZS0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJmllZWUtPnd4X211dGV4KTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3NvZnRtYWNfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfc29mdG1hY193eC5jCmluZGV4IDYxZWQ4YjAuLjVmMTQxMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfc29mdG1hY193eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfc29mdG1hY193eC5jCkBAIC0zNSw3ICszNSw3IEBACiAJaW50IHJldDsKIAlzdHJ1Y3QgaXdfZnJlcSAqZndycSA9ICZ3cnF1LT5mcmVxOwogCi0JZG93bigmaWVlZS0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAKIAlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSB7CiAJCXJldCA9IDA7CkBAIC04MSw3ICs4MSw3IEBACiAKIAlyZXQgPSAwOwogb3V0OgotCXVwKCZpZWVlLT53eF9zZW0pOworCW11dGV4X3VubG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKHJ0bGxpYl93eF9zZXRfZnJlcSk7CkBAIC0xNDYsNyArMTQ2LDcgQEAKIAogCXJ0bGxpYl9zdG9wX3NjYW5fc3luY3JvKGllZWUpOwogCi0JZG93bigmaWVlZS0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAJLyogdXNlIGlmY29uZmlnIGh3IGV0aGVyICovCiAJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpIHsKIAkJcmV0ID0gLTE7CkBAIC0xODUsNyArMTg1LDcgQEAKIAlpZiAoaWZ1cCkKIAkJcnRsbGliX3N0YXJ0X3Byb3RvY29sKGllZWUpOwogb3V0OgotCXVwKCZpZWVlLT53eF9zZW0pOworCW11dGV4X3VubG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKHJ0bGxpYl93eF9zZXRfd2FwKTsKQEAgLTI4Nyw3ICsyODcsNyBAQAogCWludCBzZXRfbW9kZV9zdGF0dXMgPSAwOwogCiAJcnRsbGliX3N0b3Bfc2Nhbl9zeW5jcm8oaWVlZSk7Ci0JZG93bigmaWVlZS0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAJc3dpdGNoICh3cnF1LT5tb2RlKSB7CiAJY2FzZSBJV19NT0RFX01PTklUT1I6CiAJY2FzZSBJV19NT0RFX0FESE9DOgpAQCAtMzIyLDcgKzMyMiw3IEBACiAJfQogCiBvdXQ6Ci0JdXAoJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAJcmV0dXJuIHNldF9tb2RlX3N0YXR1czsKIH0KIEVYUE9SVF9TWU1CT0wocnRsbGliX3d4X3NldF9tb2RlKTsKQEAgLTQxMiw3ICs0MTIsNyBAQAogCXJ0bGxpYl93YWtlX2FsbF9xdWV1ZXMoaWVlZSk7CiAKIG91dDoKLQl1cCgmaWVlZS0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJmllZWUtPnd4X211dGV4KTsKIAogfQogCkBAIC00MjEsNyArNDIxLDcgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCWRvd24oJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCiAJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SIHx8ICEoaWVlZS0+cHJvdG9fc3RhcnRlZCkpIHsKIAkJcmV0ID0gLTE7CkBAIC00MzUsNyArNDM1LDcgQEAKIAl9CiAKIG91dDoKLQl1cCgmaWVlZS0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJmllZWUtPnd4X211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChydGxsaWJfd3hfc2V0X3NjYW4pOwpAQCAtNDUwLDcgKzQ1MCw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXJ0bGxpYl9zdG9wX3NjYW5fc3luY3JvKGllZWUpOwotCWRvd24oJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCiAJcHJvdG9fc3RhcnRlZCA9IGllZWUtPnByb3RvX3N0YXJ0ZWQ7CiAKQEAgLTQ5Miw3ICs0OTIsNyBAQAogCWlmIChwcm90b19zdGFydGVkKQogCQlydGxsaWJfc3RhcnRfcHJvdG9jb2woaWVlZSk7CiBvdXQ6Ci0JdXAoJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0wocnRsbGliX3d4X3NldF9lc3NpZCk7CkBAIC01MTQsNyArNTE0LDcgQEAKIAlpbnQgZW5hYmxlID0gKHBhcm1zWzBdID4gMCk7CiAJc2hvcnQgcHJldiA9IGllZWUtPnJhd190eDsKIAotCWRvd24oJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCiAJaWYgKGVuYWJsZSkKIAkJaWVlZS0+cmF3X3R4ID0gMTsKQEAgLTUzNiw3ICs1MzYsNyBAQAogCQkJbmV0aWZfY2Fycmllcl9vZmYoaWVlZS0+ZGV2KTsKIAl9CiAKLQl1cCgmaWVlZS0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJmllZWUtPnd4X211dGV4KTsKIAogCXJldHVybiAwOwogfQpAQCAtNTc1LDcgKzU3NSw3IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQlkb3duKCZpZWVlLT53eF9zZW0pOworCW11dGV4X2xvY2soJmllZWUtPnd4X211dGV4KTsKIAogCWlmICh3cnF1LT5wb3dlci5kaXNhYmxlZCkgewogCQlSVF9UUkFDRShDT01QX0RCRywgIj09PT4lcygpOiBwb3dlciBkaXNhYmxlXG4iLCBfX2Z1bmNfXyk7CkBAIC02MTEsNyArNjExLDcgQEAKIAogCX0KIGV4aXQ6Ci0JdXAoJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAJcmV0dXJuIHJldDsKIAogfQpAQCAtNjIyLDcgKzYyMiw3IEBACiAJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCWRvd24oJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCiAJaWYgKGllZWUtPnBzID09IFJUTExJQl9QU19ESVNBQkxFRCkgewogCQl3cnF1LT5wb3dlci5kaXNhYmxlZCA9IDE7CkBAIC02NDgsNyArNjQ4LDcgQEAKIAkJd3JxdS0+cG93ZXIuZmxhZ3MgfD0gSVdfUE9XRVJfVU5JQ0FTVF9SOwogCiBleGl0OgotCXVwKCZpZWVlLT53eF9zZW0pOworCW11dGV4X3VubG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCXJldHVybiAwOwogCiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3R4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3R4LmMKaW5kZXggNThmYzcwZS4uNzhhM2FkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl90eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfdHguYwpAQCAtMSwzMSArMSwzMSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gIENvcHlyaWdodChjKSAyMDAzIC0gMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAgbW9yZSBkZXRhaWxzLgotCi0gIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICBmaWxlIGNhbGxlZCBMSUNFTlNFLgotCi0gIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gIEphbWVzIFAuIEtldHJlbm9zIDxpcHcyMTAwLWFkbWluQGxpbnV4LmludGVsLmNvbT4KLSAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICBGZXcgbW9kaWZpY2F0aW9ucyBmb3IgUmVhbHRlaydzIFdpLUZpIGRyaXZlcnMgYnkKLSAgQW5kcmVhIE1lcmVsbG8gPGFuZHJlYS5tZXJlbGxvQGdtYWlsLmNvbT4KLQotICBBIHNwZWNpYWwgdGhhbmtzIGdvZXMgdG8gUmVhbHRlayBmb3IgdGhlaXIgc3VwcG9ydCAhCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogSmFtZXMgUC4gS2V0cmVub3MgPGlwdzIxMDAtYWRtaW5AbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZldyBtb2RpZmljYXRpb25zIGZvciBSZWFsdGVrJ3MgV2ktRmkgZHJpdmVycyBieQorICogQW5kcmVhIE1lcmVsbG8gPGFuZHJlYS5tZXJlbGxvQGdtYWlsLmNvbT4KKyAqCisgKiBBIHNwZWNpYWwgdGhhbmtzIGdvZXMgdG8gUmVhbHRlayBmb3IgdGhlaXIgc3VwcG9ydCAhCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgpAQCAtNzMxLDE3ICs3MzEsMTkgQEAKIAkJaWYgKHFvc19hY3RpdmVkKSB7CiAJCQloZHJfbGVuID0gUlRMTElCXzNBRERSX0xFTiArIDI7CiAKLQkJLyogaW4gY2FzZSB3ZSBhcmUgYSBjbGllbnQgdmVyaWZ5IGFjbSBpcyBub3Qgc2V0IGZvciB0aGlzIGFjICovCi0JCXdoaWxlICh1bmxpa2VseShpZWVlLT53bW1fYWNtICYgKDB4MDEgPDwgc2tiLT5wcmlvcml0eSkpKSB7Ci0JCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICJza2ItPnByaW9yaXR5ID0gJXhcbiIsCi0JCQkJICAgIHNrYi0+cHJpb3JpdHkpOwotCQkJaWYgKHdtZV9kb3duZ3JhZGVfYWMoc2tiKSkKLQkJCQlicmVhazsKLQkJCW5ldGRldl9pbmZvKGllZWUtPmRldiwgImNvbnZlcnRlZCBza2ItPnByaW9yaXR5ID0gJXhcbiIsCi0JCQkgICAgICAgc2tiLT5wcmlvcml0eSk7Ci0JCSB9CisJCQkvKiBpbiBjYXNlIHdlIGFyZSBhIGNsaWVudCB2ZXJpZnkgYWNtIGlzIG5vdCBzZXQgZm9yIHRoaXMgYWMgKi8KKwkJCXdoaWxlICh1bmxpa2VseShpZWVlLT53bW1fYWNtICYgKDB4MDEgPDwgc2tiLT5wcmlvcml0eSkpKSB7CisJCQkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAic2tiLT5wcmlvcml0eSA9ICV4XG4iLAorCQkJCQkJc2tiLT5wcmlvcml0eSk7CisJCQkJaWYgKHdtZV9kb3duZ3JhZGVfYWMoc2tiKSkKKwkJCQkJYnJlYWs7CisJCQkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiY29udmVydGVkIHNrYi0+cHJpb3JpdHkgPSAleFxuIiwKKwkJCQkJICAgc2tiLT5wcmlvcml0eSk7CisJCQl9CisKIAkJCXFvc19jdGwgfD0gc2tiLT5wcmlvcml0eTsKIAkJCWhlYWRlci5xb3NfY3RsID0gY3B1X3RvX2xlMTYocW9zX2N0bCAmIFJUTExJQl9RT1NfVElEKTsKKwogCQl9IGVsc2UgewogCQkJaGRyX2xlbiA9IFJUTExJQl8zQUREUl9MRU47CiAJCX0KQEAgLTk4MSw2ICs5ODMsNyBAQAogCXJldHVybiAxOwogCiB9CisKIGludCBydGxsaWJfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCW1lbXNldChza2ItPmNiLCAwLCBzaXplb2Yoc2tiLT5jYikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl93eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl93eC5jCmluZGV4IDg0ZTYyNzIuLmIxNTAwZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfd3guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3d4LmMKQEAgLTI2Myw3ICsyNjMsNyBAQAogCWludCBlcnIgPSAwOwogCiAJbmV0ZGV2X2RiZyhpZWVlLT5kZXYsICJHZXR0aW5nIHNjYW5cbiIpOwotCWRvd24oJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5ldHdvcmssICZpZWVlLT5uZXR3b3JrX2xpc3QsIGxpc3QpIHsKQEAgLTI4Nyw3ICsyODcsNyBAQAogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKLQl1cCgmaWVlZS0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJmllZWUtPnd4X211dGV4KTsKIAl3cnF1LT5kYXRhLmxlbmd0aCA9IGV2IC0gIGV4dHJhOwogCXdycXUtPmRhdGEuZmxhZ3MgPSAwOwogCkBAIC02ODksNyArNjg5LDcgQEAKIAlpZiAoaWVlZS0+c3RhdGUgIT0gUlRMTElCX0xJTktFRCkKIAkJcmV0dXJuIC1FTk9MSU5LOwogCi0JZG93bigmaWVlZS0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAKIAlzd2l0Y2ggKG1sbWUtPmNtZCkgewogCWNhc2UgSVdfTUxNRV9ERUFVVEg6CkBAIC03MTYsMTEgKzcxNiwxMSBAQAogCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPSAwOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQl1cCgmaWVlZS0+d3hfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKLQl1cCgmaWVlZS0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJmllZWUtPnd4X211dGV4KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvTWFrZWZpbGUKaW5kZXggYjVkMGMyZS4uOWUzZjQzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL01ha2VmaWxlCkBAIC0xLDcgKzEsNiBAQAogTklDX1NFTEVDVCA9IFJUTDgxOTJVCiAKLWNjZmxhZ3MteSA6PSAtSSQoVE9QRElSKS9kcml2ZXJzL25ldC93aXJlbGVzcwotY2NmbGFncy15ICs9IC1PMgorY2NmbGFncy15IDo9IC1PMgogY2NmbGFncy15ICs9IC1ESkFDS1NPTl9ORVdfODE4NyAtREpBQ0tTT05fTkVXX1JYCiAKIGllZWU4MDIxMS1yc2wtb2JqcyA6PSBpZWVlODAyMTFfcngubyBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTEuaAppbmRleCAwOWU5NDk5Li4wNzdlYTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExLmgKQEAgLTc0Niw3ICs3NDYsNyBAQAogCWJvb2wJCSAgYmlzcnhhZ2dyc3ViZnJhbWU7CiAJYm9vbAkJICBiUGFja2V0QmVhY29uOwkvL2Nvc2EgYWRkIGZvciByc3NpCiAJYm9vbAkJICBiVG9TZWxmQkE7CQkvL2Nvc2EgYWRkIGZvciByc3NpCi0JY2hhcgkgIGNja19hZGNfcHdkYls0XTsJLy9jb3NhIGFkZCBmb3IgcnggcGF0aCBzZWxlY3Rpb24KKwlzOAkJICBjY2tfYWRjX3B3ZGJbNF07CS8vY29zYSBhZGQgZm9yIHJ4IHBhdGggc2VsZWN0aW9uCiAJdTE2CQkgIFNlcV9OdW07CiAKIH07CkBAIC0xODE0LDcgKzE4MTQsNyBAQAogCXUzMiB3cGF4X3R5cGVfbm90aWZ5OyAvL3thZGRlZCBieSBEYXZpZCwgMjAwNi45LjI2fQogCiAJLyogUW9TIHJlbGF0ZWQgZmxhZyAqLwotCWNoYXIgaW5pdF93bW1wYXJhbV9mbGFnOworCXM4ICBpbml0X3dtbXBhcmFtX2ZsYWc7CiAJLyogc2V0IG9uIGluaXRpYWxpemF0aW9uICovCiAJdTggIHFvc19zdXBwb3J0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwppbmRleCAwNTFjMmJlLi44OWNiYzA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKQEAgLTEwMjcsNyArMTAyNyw3IEBACiAJCQkJaWVlZSwKIAkJCQkoUFRTX0NPTU1PTl9JTkZPICopICZwUnhUUywKIAkJCQloZHItPmFkZHIyLAotCQkJCSh1OClGcmFtZV9Rb1NUSUQoKHU4ICopKHNrYi0+ZGF0YSkpLAorCQkJCUZyYW1lX1FvU1RJRCgodTggKikoc2tiLT5kYXRhKSksCiAJCQkJUlhfRElSLAogCQkJCXRydWUpKQogCQl7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKaW5kZXggNDlkYjFiNy4uZDdkODViMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwpAQCAtMjg0LDcgKzI4NCw4IEBACiAJfQogfQogCi1pbmxpbmUgdm9pZCBzb2Z0bWFjX3BzX21nbXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3N0YXRpYyBpbmxpbmUgdm9pZAorc29mdG1hY19wc19tZ210X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAKIAlzaG9ydCBzaW5nbGUgPSBpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRTsKQEAgLTMyMCw3ICszMjEsNyBAQAogCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCiB9CiAKLWlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX3Byb2JlX3JlcShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9wcm9iZV9yZXEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJdW5zaWduZWQgaW50IGxlbiwgcmF0ZV9sZW47CiAJdTggKnRhZzsKQEAgLTY0MCw4ICs2NDEsOSBAQAogfQogRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfc3RhcnRfc2Nhbl9zeW5jcm8pOwogCi1pbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9hdXRoZW50aWNhdGlvbl9yZXEoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24sCi0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGludCBjaGFsbGVuZ2VsZW4pCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICoKK2llZWU4MDIxMV9hdXRoZW50aWNhdGlvbl9yZXEoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24sCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBpbnQgY2hhbGxlbmdlbGVuKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqYXV0aDsKQEAgLTgwNiw3ICs4MDgsNyBAQAogCQkqKHRhZysrKSA9IDI7CiAKIAkJcHV0X3VuYWxpZ25lZF9sZTE2KGllZWUtPmN1cnJlbnRfbmV0d29yay5hdGltX3dpbmRvdywKLQkJCQkgICAodTggKil0YWcpOworCQkJCSAgIHRhZyk7CiAJCXRhZys9MjsKIAl9CiAKQEAgLTk3OCw3ICs5ODAsOSBAQAogfQogCiAKLWlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2Fzc29jaWF0aW9uX3JlcShzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbixzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKgoraWVlZTgwMjExX2Fzc29jaWF0aW9uX3JlcShzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiwKKwkJCSAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0zMDkxLDcgKzMwOTUsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZV9za2IoCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfZGlzYXNzb2NpYXRlX3NrYigKIAkJCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiwKIAkJCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKIAkJCQkJCQl1OAlhc1JzbikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9CQVByb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9CQVByb2MuYwppbmRleCAyODczN2VjLi45OGZiYjZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfQkFQcm9jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0JBUHJvYy5jCkBAIC0zNTQsNyArMzU0LDcgQEAKIAogCXJlcSA9IChzdHJ1Y3QgcnRsXzgwMjExX2hkcl8zYWRkciAqKSBza2ItPmRhdGE7CiAJdGFnID0gKHU4ICopcmVxOwotCWRzdCA9ICh1OCAqKSgmcmVxLT5hZGRyMlswXSk7CisJZHN0ID0gJnJlcS0+YWRkcjJbMF07CiAJdGFnICs9IHNpemVvZihzdHJ1Y3QgcnRsXzgwMjExX2hkcl8zYWRkcik7CiAJcERpYWxvZ1Rva2VuID0gdGFnICsgMjsgIC8vY2F0ZWdvcnkrYWN0aW9uCiAJcEJhUGFyYW1TZXQgPSAoUEJBX1BBUkFNX1NFVCkodGFnICsgMyk7ICAgLy8rRGlhbG9nVG9rZW4KQEAgLTQ1Miw3ICs0NTIsNyBAQAogCX0KIAlyc3AgPSAoc3RydWN0IHJ0bF84MDIxMV9oZHJfM2FkZHIgKilza2ItPmRhdGE7CiAJdGFnID0gKHU4ICopcnNwOwotCWRzdCA9ICh1OCAqKSgmcnNwLT5hZGRyMlswXSk7CisJZHN0ID0gJnJzcC0+YWRkcjJbMF07CiAJdGFnICs9IHNpemVvZihzdHJ1Y3QgcnRsXzgwMjExX2hkcl8zYWRkcik7CiAJcERpYWxvZ1Rva2VuID0gdGFnICsgMjsKIAlwU3RhdHVzQ29kZSA9ICh1MTYgKikodGFnICsgMyk7CkBAIC01OTAsNyArNTkwLDcgQEAKIAogCUlFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBfElFRUU4MDIxMV9ETF9CQSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CiAJZGVsYmEgPSAoc3RydWN0IHJ0bF84MDIxMV9oZHJfM2FkZHIgKilza2ItPmRhdGE7Ci0JZHN0ID0gKHU4ICopKCZkZWxiYS0+YWRkcjJbMF0pOworCWRzdCA9ICZkZWxiYS0+YWRkcjJbMF07CiAJcERlbEJhUGFyYW1TZXQgPSAoUERFTEJBX1BBUkFNX1NFVCkmZGVsYmEtPnBheWxvYWRbMl07CiAKIAlpZihwRGVsQmFQYXJhbVNldC0+ZmllbGQuSW5pdGlhdG9yID09IDEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVLmgKaW5kZXggODIxYWZjMC4uMGI3YjA0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlUuaApAQCAtNTMzLDcgKzUzMyw3IEBACiAJdTMyICAgICAgICAgICAgIGh0X21jc1s0XVsxNl07CiB9IHJ0X3R4X3JhaGlzX3QsICpwcnRfdHhfcmFoaXNfdDsKIHR5cGVkZWYgc3RydWN0IF9SVF9TTU9PVEhfREFUQV80UkYgewotCWNoYXIgICAgZWxlbWVudHNbNF1bMTAwXTsgLyogYXJyYXkgdG8gc3RvcmUgdmFsdWVzICovCisJczggICAgZWxlbWVudHNbNF1bMTAwXTsgLyogYXJyYXkgdG8gc3RvcmUgdmFsdWVzICovCiAJdTMyICAgICBpbmRleDsgICAgICAgICAgICAvKiBpbmRleCB0byBjdXJyZW50IGFycmF5IHRvIHN0b3JlICovCiAJdTMyICAgICBUb3RhbE51bTsgICAgICAgICAvKiBudW0gb2YgdmFsaWQgZWxlbWVudHMgKi8KIAl1MzIgICAgIFRvdGFsVmFsWzRdOyAgICAgIC8qIHN1bSBvZiB2YWxpZCBlbGVtZW50cyAqLwpAQCAtMTAzMSw3ICsxMDMxLDcgQEAKIAlzOCBjY2tfcHJlc2VudF9hdHRlbnR1YXRpb247CiAJdTggY2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uXzIwTWRlZmF1bHQ7CiAJdTggY2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uXzQwTWRlZmF1bHQ7Ci0JY2hhciBjY2tfcHJlc2VudF9hdHRlbnR1YXRpb25fZGlmZmVyZW5jZTsKKwlzOCBjY2tfcHJlc2VudF9hdHRlbnR1YXRpb25fZGlmZmVyZW5jZTsKIAlib29sIGJ0eHBvd2VyX3RyYWNraW5nOwogCWJvb2wgYmNja19pbl9jaDE0OwogCWJvb2wgYnR4cG93ZXJkYXRhX3JlYWRmcm9tRUVQT1JNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2NvcmUuYwppbmRleCBkZDA5NzBmLi40NTdlZWI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2NvcmUuYwpAQCAtMTE0LDkgKzExNCw5IEBACiAKIAogCi1tb2R1bGVfcGFyYW0oaWZuYW1lLCBjaGFycCwgU19JUlVHTyB8IFNfSVdVU1IpOwotbW9kdWxlX3BhcmFtKGh3d2VwLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKLW1vZHVsZV9wYXJhbShjaGFubmVscywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW0oaWZuYW1lLCBjaGFycCwgMDY0NCk7Cittb2R1bGVfcGFyYW0oaHd3ZXAsIGludCwgMDY0NCk7Cittb2R1bGVfcGFyYW0oY2hhbm5lbHMsIGludCwgMDY0NCk7CiAKIE1PRFVMRV9QQVJNX0RFU0MoaWZuYW1lLCAiIE5ldCBpbnRlcmZhY2UgbmFtZSwgd2xhbiVkPWRlZmF1bHQiKTsKIE1PRFVMRV9QQVJNX0RFU0MoaHd3ZXAsICIgVHJ5IHRvIHVzZSBoYXJkd2FyZSBzZWN1cml0eSBzdXBwb3J0LiAiKTsKQEAgLTkyMiw0NyArOTIyLDYgQEAKIAlza2JfcXVldWVfcHVyZ2UoJnByaXYtPnNrYl9xdWV1ZSk7CiB9CiAKLWlubGluZSB1MTYgaWVlZXJhdGUycnRscmF0ZShpbnQgcmF0ZSkKLXsKLQlzd2l0Y2ggKHJhdGUpIHsKLQljYXNlIDEwOgotCQlyZXR1cm4gMDsKLQljYXNlIDIwOgotCQlyZXR1cm4gMTsKLQljYXNlIDU1OgotCQlyZXR1cm4gMjsKLQljYXNlIDExMDoKLQkJcmV0dXJuIDM7Ci0JY2FzZSA2MDoKLQkJcmV0dXJuIDQ7Ci0JY2FzZSA5MDoKLQkJcmV0dXJuIDU7Ci0JY2FzZSAxMjA6Ci0JCXJldHVybiA2OwotCWNhc2UgMTgwOgotCQlyZXR1cm4gNzsKLQljYXNlIDI0MDoKLQkJcmV0dXJuIDg7Ci0JY2FzZSAzNjA6Ci0JCXJldHVybiA5OwotCWNhc2UgNDgwOgotCQlyZXR1cm4gMTA7Ci0JY2FzZSA1NDA6Ci0JCXJldHVybiAxMTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gMzsKLQl9Ci19Ci0KLXN0YXRpYyB1MTYgcnRsX3JhdGVbXSA9IHsxMCwgMjAsIDU1LCAxMTAsIDYwLCA5MCwgMTIwLCAxODAsIDI0MCwgMzYwLCA0ODAsIDU0MH07Ci1pbmxpbmUgdTE2IHJ0bDgxOTJfcmF0ZTJyYXRlKHNob3J0IHJhdGUpCi17Ci0JaWYgKHJhdGUgPiAxMSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHJ0bF9yYXRlW3JhdGVdOwotfQotCi0KIC8qIFRoZSBwcm90b3R5cGUgb2YgcnhfaXNyIGhhcyBjaGFuZ2VkIHNpbmNlIG9uZSB2ZXJzaW9uIG9mIExpbnV4IEtlcm5lbCAqLwogc3RhdGljIHZvaWQgcnRsODE5Ml9yeF9pc3Ioc3RydWN0IHVyYiAqdXJiKQogewpAQCAtMTMxOSwxNCArMTI3OCw2IEBACiAKIH0KIAotaW5saW5lIHU4IHJ0bDgxOTJfSXNXaXJlbGVzc0JNb2RlKHUxNiByYXRlKQotewotCWlmICgoKHJhdGUgPD0gMTEwKSAmJiAocmF0ZSAhPSA2MCkgJiYgKHJhdGUgIT0gOTApKSB8fCAocmF0ZSA9PSAyMjApKQotCQlyZXR1cm4gMTsKLQllbHNlCi0JCXJldHVybiAwOwotfQotCiBzaG9ydCBydGw4MTl4VV90eF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CkBAIC0xNzAyLDExICsxNjUzLDggQEAKIAkJfQogCQlpZiAoYlNlbmQwQnl0ZSkgewogCQkJdHhfdXJiX3plcm8gPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOwotCQkJaWYgKCF0eF91cmJfemVybykgewotCQkJCVJUX1RSQUNFKENPTVBfRVJSLAotCQkJCQkgImNhbid0IGFsbG9jIHVyYiBmb3IgemVybyBieXRlXG4iKTsKKwkJCWlmICghdHhfdXJiX3plcm8pCiAJCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQl9CiAJCQl1c2JfZmlsbF9idWxrX3VyYih0eF91cmJfemVybywgdWRldiwKIAkJCQkJICB1c2Jfc25kYnVsa3BpcGUodWRldiwgaWR4X3BpcGUpLAogCQkJCQkgICZ6ZXJvLCAwLCB0eF96ZXJvX2lzciwgZGV2KTsKQEAgLTQyMDksNyArNDE1Nyw3IEBACiAgKgogICogUmV0dXJuOgkJMC0xMDAgcGVyY2VudGFnZQogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHU4IHJ0bDgxOXhfcXVlcnlfcnhwd3JwZXJjZW50YWdlKGNoYXIgYW50cG93ZXIpCitzdGF0aWMgdTggcnRsODE5eF9xdWVyeV9yeHB3cnBlcmNlbnRhZ2UoczggYW50cG93ZXIpCiB7CiAJaWYgKChhbnRwb3dlciA8PSAtMTAwKSB8fCAoYW50cG93ZXIgPj0gMjApKQogCQlyZXR1cm4JMDsKQEAgLTQyMjAsOSArNDE2OCw5IEBACiAKIH0JLyogUXVlcnlSeFB3clBlcmNlbnRhZ2UgKi8KIAotc3RhdGljIHU4IHJ0bDgxOXhfZXZtX2RidG9wZXJjZW50YWdlKGNoYXIgdmFsdWUpCitzdGF0aWMgdTggcnRsODE5eF9ldm1fZGJ0b3BlcmNlbnRhZ2UoczggdmFsdWUpCiB7Ci0JY2hhciByZXRfdmFsOworCXM4IHJldF92YWw7CiAKIAlyZXRfdmFsID0gdmFsdWU7CiAKQEAgLTQyOTcsOCArNDI0NSw4IEBACiAJcGh5X29mZG1fcnhfc3RhdHVzX3J4c2Nfc2dpZW5fZXhpbnRmZmxhZyAqcHJ4c2M7CiAJdTgJKnByeHBrdDsKIAl1OAlpLCBtYXhfc3BhdGlhbF9zdHJlYW0sIHRtcF9yeHNuciwgdG1wX3J4ZXZtLCByeHNjX3NnaWVuX2V4ZmxnOwotCWNoYXIJcnhfcHdyWzRdLCByeF9wd3JfYWxsID0gMDsKLQljaGFyCXJ4X3NuclgsIHJ4X2V2bVg7CisJczgJcnhfcHdyWzRdLCByeF9wd3JfYWxsID0gMDsKKwlzOAlyeF9zbnJYLCByeF9ldm1YOwogCXU4CWV2bSwgcHdkYl9hbGw7CiAJdTMyCVJTU0ksIHRvdGFsX3Jzc2kgPSAwOwogCXU4CWlzX2Nja19yYXRlID0gMDsKQEAgLTQ0MjMsNyArNDM3MSw3IEBACiAKIAkJCS8qIEdldCBSeCBzbnIgdmFsdWUgaW4gREIgKi8KIAkJCXRtcF9yeHNuciA9CXBvZmRtX2J1Zi0+cnhzbnJfWFtpXTsKLQkJCXJ4X3NuclggPSAoY2hhcikodG1wX3J4c25yKTsKKwkJCXJ4X3NuclggPSAoczgpKHRtcF9yeHNucik7CiAJCQlyeF9zbnJYIC89IDI7CiAJCQlwcml2LT5zdGF0cy5yeFNOUmRCW2ldID0gKGxvbmcpcnhfc25yWDsKIApAQCAtNDQ1Nyw3ICs0NDA1LDcgQEAKIAogCQlmb3IgKGkgPSAwOyBpIDwgbWF4X3NwYXRpYWxfc3RyZWFtOyBpKyspIHsKIAkJCXRtcF9yeGV2bSA9CXBvZmRtX2J1Zi0+cnhldm1fWFtpXTsKLQkJCXJ4X2V2bVggPSAoY2hhcikodG1wX3J4ZXZtKTsKKwkJCXJ4X2V2bVggPSAoczgpKHRtcF9yeGV2bSk7CiAKIAkJCS8qIERvIG5vdCB1c2Ugc2hpZnQgb3BlcmF0aW9uIGxpa2UgInJ4X2V2bVggPj49IDEiCiAJCQkgKiBiZWNhdXNlIHRoZSBjb21waWxlciBvZiBmcmVlIGJ1aWxkIGVudmlyb25tZW50IHdpbGwKQEAgLTQ0NzUsMTAgKzQ0MjMsMTAgQEAKIAkJCQkgKi8KIAkJCQlwc3RhdHMtPlNpZ25hbFF1YWxpdHkgPQogCQkJCQlwcmVjb3JkX3N0YXRzLT5TaWduYWxRdWFsaXR5ID0KLQkJCQkJKHU4KShldm0gJiAweGZmKTsKKwkJCQkJZXZtICYgMHhmZjsKIAkJCXBzdGF0cy0+UnhNSU1PU2lnbmFsUXVhbGl0eVtpXSA9CiAJCQkJcHJlY29yZF9zdGF0cy0+UnhNSU1PU2lnbmFsUXVhbGl0eVtpXSA9Ci0JCQkJKHU4KShldm0gJiAweGZmKTsKKwkJCQlldm0gJiAweGZmOwogCQl9CiAKIApAQCAtNTAxMyw4ICs0OTYxLDcgQEAKIAogCWRldi0+bmV0ZGV2X29wcyA9ICZydGw4MTkyX25ldGRldl9vcHM7CiAKLQlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0KLQkJKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSZyODE5Ml93eF9oYW5kbGVyc19kZWY7CisJZGV2LT53aXJlbGVzc19oYW5kbGVycyA9ICZyODE5Ml93eF9oYW5kbGVyc19kZWY7CiAKIAlkZXYtPnR5cGUgPSBBUlBIUkRfRVRIRVI7CiAKQEAgLTUyMjIsNyArNTE2OSw4IEBACiAJCX0gZWxzZSB7CiAJCQkvKiBLZXkgTWF0ZXJpYWwgKi8KIAkJCWlmIChLZXlDb250ZW50KSB7Ci0JCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgV0NBTUksICh1MzIpKCooS2V5Q29udGVudCArIGkgLSAyKSkpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFdDQU1JLAorCQkJCQkJKihLZXlDb250ZW50ICsgaSAtIDIpKTsKIAkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSV0NBTSwgVGFyZ2V0Q29tbWFuZCk7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfZG0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfZG0uYwppbmRleCAxZTBlNTNjLi45MjA5YWFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2RtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9kbS5jCkBAIC0xNTAsNyArMTUwLDcgQEAKICNpZmRlZiBVU0JfUlhfQUdHUkVHQVRJT05fU1VQUE9SVAogdm9pZCBkbV9DaGVja1J4QWdncmVnYXRpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldik7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IHByaXYtPmllZWU4MDIxMS0+cEhUSW5mbzsKIAlzdGF0aWMgdW5zaWduZWQgbG9uZwlsYXN0VHhPa0NudDsKIAlzdGF0aWMgdW5zaWduZWQgbG9uZwlsYXN0UnhPa0NudDsKQEAgLTIzNDYsNyArMjM0Niw3IEBACiAKIHN0YXRpYyB2b2lkIGRtX2luaXRfY3RzdG9zZWxmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdigoc3RydWN0IG5ldF9kZXZpY2UgKilkZXYpOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAogCXByaXYtPmllZWU4MDIxMS0+YkNUU1RvU2VsZkVuYWJsZSA9IHRydWU7CiAJcHJpdi0+aWVlZTgwMjExLT5DVFNUb1NlbGZUSCA9IENUU1RvU2VsZlRIVmFsOwpAQCAtMjM1NCw3ICsyMzU0LDcgQEAKIAogc3RhdGljIHZvaWQgZG1fY3RzdG9zZWxmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdigoc3RydWN0IG5ldF9kZXZpY2UgKilkZXYpOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAlQUlRfSElHSF9USFJPVUdIUFVUCXBIVEluZm8gPSBwcml2LT5pZWVlODAyMTEtPnBIVEluZm87CiAJc3RhdGljIHVuc2lnbmVkIGxvbmcJCQkJbGFzdFR4T2tDbnQ7CiAJc3RhdGljIHVuc2lnbmVkIGxvbmcJCQkJbGFzdFJ4T2tDbnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9pZWVlODAyMTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2llZWU4MDIxMS5jCmluZGV4IDg5MTg2NTQuLjVkYzNiNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2llZWU4MDIxMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2llZWU4MDIxMS5jCkBAIC0xNDUsNyArMTQ1LDcgQEAKIAljYXNlIFdJUkVMRVNTXzExQkc6CiAJCW1lbWNweShyYXRlcywgV0lGSV9DQ0tSQVRFUywgSUVFRTgwMjExX0NDS19SQVRFX0xFTik7CiAJCW1lbWNweShyYXRlcyArIElFRUU4MDIxMV9DQ0tfUkFURV9MRU4sIFdJRklfT0ZETVJBVEVTLAotCQkJSUVFRTgwMjExX05VTV9PRkRNX1JBVEVTTEVOKTsKKwkJICAgICAgIElFRUU4MDIxMV9OVU1fT0ZETV9SQVRFU0xFTik7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTE4OCwyNCArMTg4LDI0IEBACiAJaWUgKz0gMjsKIAkvKlNTSUQqLwogCWllID0gcjg3MTJfc2V0X2llKGllLCBfU1NJRF9JRV8sIHBkZXZfbmV0d29yay0+U3NpZC5Tc2lkTGVuZ3RoLAotCQkgICAgcGRldl9uZXR3b3JrLT5Tc2lkLlNzaWQsICZzeik7CisJCQkgIHBkZXZfbmV0d29yay0+U3NpZC5Tc2lkLCAmc3opOwogCS8qc3VwcG9ydGVkIHJhdGVzKi8KIAlzZXRfc3VwcG9ydGVkX3JhdGUocGRldl9uZXR3b3JrLT5yYXRlcywgcHJlZ2lzdHJ5cHJpdi0+d2lyZWxlc3NfbW9kZSk7CiAJcmF0ZUxlbiA9IHI4NzEyX2dldF9yYXRlc2V0X2xlbihwZGV2X25ldHdvcmstPnJhdGVzKTsKIAlpZiAocmF0ZUxlbiA+IDgpIHsKIAkJaWUgPSByODcxMl9zZXRfaWUoaWUsIF9TVVBQT1JURURSQVRFU19JRV8sIDgsCi0JCQkgICAgcGRldl9uZXR3b3JrLT5yYXRlcywgJnN6KTsKKwkJCQkgIHBkZXZfbmV0d29yay0+cmF0ZXMsICZzeik7CiAJCWllID0gcjg3MTJfc2V0X2llKGllLCBfRVhUX1NVUFBPUlRFRFJBVEVTX0lFXywgKHJhdGVMZW4gLSA4KSwKLQkJCSAgICAocGRldl9uZXR3b3JrLT5yYXRlcyArIDgpLCAmc3opOworCQkJCSAgKHBkZXZfbmV0d29yay0+cmF0ZXMgKyA4KSwgJnN6KTsKIAl9IGVsc2UKIAkJaWUgPSByODcxMl9zZXRfaWUoaWUsIF9TVVBQT1JURURSQVRFU19JRV8sCi0JCQkgICAgcmF0ZUxlbiwgcGRldl9uZXR3b3JrLT5yYXRlcywgJnN6KTsKKwkJCQkgIHJhdGVMZW4sIHBkZXZfbmV0d29yay0+cmF0ZXMsICZzeik7CiAJLypEUyBwYXJhbWV0ZXIgc2V0Ki8KIAlpZSA9IHI4NzEyX3NldF9pZShpZSwgX0RTU0VUX0lFXywgMSwKLQkJICAgICh1OCAqKSYocGRldl9uZXR3b3JrLT5Db25maWd1cmF0aW9uLkRTQ29uZmlnKSwgJnN6KTsKKwkJCSAgKHU4ICopJihwZGV2X25ldHdvcmstPkNvbmZpZ3VyYXRpb24uRFNDb25maWcpLCAmc3opOwogCS8qSUJTUyBQYXJhbWV0ZXIgU2V0Ki8KIAlpZSA9IHI4NzEyX3NldF9pZShpZSwgX0lCU1NfUEFSQV9JRV8sIDIsCi0JCSAgICAodTggKikmKHBkZXZfbmV0d29yay0+Q29uZmlndXJhdGlvbi5BVElNV2luZG93KSwgJnN6KTsKKwkJCSAgKHU4ICopJihwZGV2X25ldHdvcmstPkNvbmZpZ3VyYXRpb24uQVRJTVdpbmRvdyksICZzeik7CiAJcmV0dXJuIHN6OwogfQogCkBAIC0yMjAsOCArMjIwLDcgQEAKIAkJcGJ1ZiA9IHI4NzEyX2dldF9pZShwYnVmLCBfV1BBX0lFX0lEXywgJmxlbiwgbGltaXQpOwogCQlpZiAocGJ1ZikgewogCQkJLypjaGVjayBpZiBvdWkgbWF0Y2hlcy4uLiovCi0JCQlpZiAobWVtY21wKChwYnVmICsgMiksIHdwYV9vdWlfdHlwZSwKLQkJCSAgICBzaXplb2Yod3BhX291aV90eXBlKSkpCisJCQlpZiAobWVtY21wKChwYnVmICsgMiksIHdwYV9vdWlfdHlwZSwgc2l6ZW9mKHdwYV9vdWlfdHlwZSkpKQogCQkJCWdvdG8gY2hlY2tfbmV4dF9pZTsKIAkJCS8qY2hlY2sgdmVyc2lvbi4uLiovCiAJCQltZW1jcHkoKHU4ICopJnZhbDE2LCAocGJ1ZiArIDYpLCBzaXplb2YodmFsMTYpKTsKQEAgLTI3OSw3ICsyNzgsNyBAQAogfQogCiBpbnQgcjg3MTJfcGFyc2Vfd3BhX2llKHU4ICp3cGFfaWUsIGludCB3cGFfaWVfbGVuLCBpbnQgKmdyb3VwX2NpcGhlciwKLQkJIGludCAqcGFpcndpc2VfY2lwaGVyKQorCQkgICAgICAgaW50ICpwYWlyd2lzZV9jaXBoZXIpCiB7CiAJaW50IGk7CiAJaW50IGxlZnQsIGNvdW50OwpAQCAtMzIyLDcgKzMyMSw3IEBACiB9CiAKIGludCByODcxMl9wYXJzZV93cGEyX2llKHU4ICpyc25faWUsIGludCByc25faWVfbGVuLCBpbnQgKmdyb3VwX2NpcGhlciwKLQkJICBpbnQgKnBhaXJ3aXNlX2NpcGhlcikKKwkJCWludCAqcGFpcndpc2VfY2lwaGVyKQogewogCWludCBpOwogCWludCBsZWZ0LCBjb3VudDsKQEAgLTM2NSw3ICszNjQsNyBAQAogfQogCiBpbnQgcjg3MTJfZ2V0X3NlY19pZSh1OCAqaW5faWUsIHVpbnQgaW5fbGVuLCB1OCAqcnNuX2llLCB1MTYgKnJzbl9sZW4sCi0JICAgICAgIHU4ICp3cGFfaWUsIHUxNiAqd3BhX2xlbikKKwkJICAgICB1OCAqd3BhX2llLCB1MTYgKndwYV9sZW4pCiB7CiAJdTggYXV0aG1vZGU7CiAJdTggd3BhX291aVs0XSA9IHsweDAsIDB4NTAsIDB4ZjIsIDB4MDF9OwpAQCAtMzgzLDcgKzM4Miw3IEBACiAJCX0gZWxzZSB7CiAJCQlpZiAoYXV0aG1vZGUgPT0gX1dQQTJfSUVfSURfKSB7CiAJCQkJbWVtY3B5KHJzbl9pZSwgJmluX2llW2NudF0sCi0JCQkJCWluX2llW2NudCArIDFdICsgMik7CisJCQkJICAgICAgIGluX2llW2NudCArIDFdICsgMik7CiAJCQkJKnJzbl9sZW4gPSBpbl9pZVtjbnQgKyAxXSArIDI7CiAJCQkJY250ICs9IGluX2llW2NudCArIDFdICsgMjsgIC8qZ2V0IG5leHQqLwogCQkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zX2ludGZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc19pbnRmcy5jCmluZGV4IDU3MjExZjcuLmNiZTRkZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zX2ludGZzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NfaW50ZnMuYwpAQCAtMjQzLDkgKzI0Myw5IEBACiB2b2lkIHI4NzEyX3N0b3BfZHJ2X3RocmVhZHMoc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlcikKIHsKIAkvKkJlbG93IGlzIHRvIHRlcm1pbmF0ZSByODcxMl9jbWRfdGhyZWFkICYgZXZlbnRfdGhyZWFkLi4uKi8KLQl1cCgmcGFkYXB0ZXItPmNtZHByaXYuY21kX3F1ZXVlX3NlbWEpOworCWNvbXBsZXRlKCZwYWRhcHRlci0+Y21kcHJpdi5jbWRfcXVldWVfY29tcCk7CiAJaWYgKHBhZGFwdGVyLT5jbWRUaHJlYWQpCi0JCV9kb3duX3NlbWEoJnBhZGFwdGVyLT5jbWRwcml2LnRlcm1pbmF0ZV9jbWR0aHJlYWRfc2VtYSk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmcGFkYXB0ZXItPmNtZHByaXYudGVybWluYXRlX2NtZHRocmVhZF9jb21wKTsKIAlwYWRhcHRlci0+Y21kcHJpdi5jbWRfc2VxID0gMTsKIH0KIApAQCAtNDI1LDcgKzQyNSw3IEBACiAJZWxzZQogCQluZXRpZl93YWtlX3F1ZXVlKHBuZXRkZXYpOwogCi0JIGlmICh2aWRlb19tb2RlKQorCWlmICh2aWRlb19tb2RlKQogCQllbmFibGVfdmlkZW9fbW9kZShwYWRhcHRlciwgY2J3NDBfZW5hYmxlKTsKIAkvKiBzdGFydCBkcml2ZXIgbWxtZSByZWxhdGlvbiB0aW1lciAqLwogCXN0YXJ0X2Rydl90aW1lcnMocGFkYXB0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NkZXBfaW50Zi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NkZXBfaW50Zi5oCmluZGV4IGFhMGVjNzQuLjVkMzdlMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zZGVwX2ludGYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc2RlcF9pbnRmLmgKQEAgLTM2LDcgKzM2LDcgQEAKIAkvKiB3aGVuIGluIFVTQiwgSU8gaXMgdGhyb3VnaCBpbnRlcnJ1cHQgaW4vb3V0IGVuZHBvaW50cyAqLwogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwogCXN0cnVjdCB1cmIgKnBpb3J3X3VyYjsKLQlzdHJ1Y3Qgc2VtYXBob3JlIGlvX3JldGV2dDsKKwlzdHJ1Y3QgY29tcGxldGlvbiBpb19yZXRldnRfY29tcDsKIH07CiAKIGludCByODcxeF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zZGVwX3NlcnZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zZGVwX3NlcnZpY2UuaAppbmRleCBhZDA0MWM5Li5jOWVhNTBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc2RlcF9zZXJ2aWNlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NkZXBfc2VydmljZS5oCkBAIC01NywxMyArNTcsNiBAQAogCQlzcGluX2xvY2tfaW5pdCgmKChwcXVldWUpLT5sb2NrKSk7CVwKIAl9IHdoaWxlICgwKQogCi1zdGF0aWMgaW5saW5lIHUzMiBfZG93bl9zZW1hKHN0cnVjdCBzZW1hcGhvcmUgKnNlbWEpCi17Ci0JaWYgKGRvd25faW50ZXJydXB0aWJsZShzZW1hKSkKLQkJcmV0dXJuIF9GQUlMOwotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQogc3RhdGljIGlubGluZSB1MzIgZW5kX29mX3F1ZXVlX3NlYXJjaChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLAogCQlzdHJ1Y3QgbGlzdF9oZWFkICpwbGlzdCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3JlY3ZfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3JlY3ZfbGludXguYwppbmRleCA3MzVhMGVhLi41NzZjMTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9yZWN2X2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcmVjdl9saW51eC5jCkBAIC02MCw3ICs2MCw2IEBACiAJaWYgKCFwcmVjdmJ1Zi0+cHVyYikKIAkJcmVzID0gX0ZBSUw7CiAJcHJlY3ZidWYtPnBza2IgPSBOVUxMOwotCXByZWN2YnVmLT5yZXVzZSA9IGZhbHNlOwogCXByZWN2YnVmLT5wYWxsb2NhdGVkX2J1ZiA9IE5VTEw7CiAJcHJlY3ZidWYtPnBidWYgPSBOVUxMOwogCXByZWN2YnVmLT5wZGF0YSA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2NtZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9jbWQuYwppbmRleCAxM2MwMTgzLi45ZjYxNTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2NtZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfY21kLmMKQEAgLTI2NCw5ICsyNjQsOSBAQAogCQkgKi8KIAkJaWYgKHBhZGFwdGVyLT5wd3JjdHJscHJpdi5wd3JfbW9kZSA+IFBTX01PREVfQUNUSVZFKSB7CiAJCQlwYWRhcHRlci0+cHdyY3RybHByaXYucHdyX21vZGUgPSBQU19NT0RFX0FDVElWRTsKLQkJCV9lbnRlcl9wd3Jsb2NrKCYocGFkYXB0ZXItPnB3cmN0cmxwcml2LmxvY2spKTsKKwkJCW11dGV4X2xvY2soJnBhZGFwdGVyLT5wd3JjdHJscHJpdi5tdXRleF9sb2NrKTsKIAkJCXI4NzEyX3NldF9ycHdtKHBhZGFwdGVyLCBQU19TVEFURV9TNCk7Ci0JCQl1cCgmKHBhZGFwdGVyLT5wd3JjdHJscHJpdi5sb2NrKSk7CisJCQltdXRleF91bmxvY2soJnBhZGFwdGVyLT5wd3JjdHJscHJpdi5tdXRleF9sb2NrKTsKIAkJfQogCQlwY21kX3IgPSBwY21kOwogCQlicmVhazsKQEAgLTMyMiw3ICszMjIsNyBAQAogCiAJYWxsb3dfc2lnbmFsKFNJR1RFUk0pOwogCXdoaWxlICgxKSB7Ci0JCWlmICgoX2Rvd25fc2VtYSgmKHBjbWRwcml2LT5jbWRfcXVldWVfc2VtYSkpKSA9PSBfRkFJTCkKKwkJaWYgKHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmcGNtZHByaXYtPmNtZF9xdWV1ZV9jb21wKSkKIAkJCWJyZWFrOwogCQlpZiAocGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8IHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKQogCQkJYnJlYWs7CkBAIC0zOTUsMTAgKzM5NSwxMCBAQAogCQkJfQogCQkJaWYgKHBjbWQtPmNtZGNvZGUgPT0gR0VOX0NNRF9DT0RFKF9TZXRQd3JNb2RlKSkgewogCQkJCWlmIChwYWRhcHRlci0+cHdyY3RybHByaXYuYlNsZWVwKSB7Ci0JCQkJCV9lbnRlcl9wd3Jsb2NrKCYocGFkYXB0ZXItPgotCQkJCQkJICAgICAgIHB3cmN0cmxwcml2LmxvY2spKTsKKwkJCQkJbXV0ZXhfbG9jaygmcGFkYXB0ZXItPgorCQkJCQkJICAgICAgIHB3cmN0cmxwcml2Lm11dGV4X2xvY2spOwogCQkJCQlyODcxMl9zZXRfcnB3bShwYWRhcHRlciwgUFNfU1RBVEVfUzIpOwotCQkJCQl1cCgmcGFkYXB0ZXItPnB3cmN0cmxwcml2LmxvY2spOworCQkJCQltdXRleF91bmxvY2soJnBhZGFwdGVyLT5wd3JjdHJscHJpdi5tdXRleF9sb2NrKTsKIAkJCQl9CiAJCQl9CiAJCQlyODcxMl9mcmVlX2NtZF9vYmoocGNtZCk7CkBAIC00MjAsNyArNDIwLDcgQEAKIAkJCWJyZWFrOwogCQlyODcxMl9mcmVlX2NtZF9vYmoocGNtZCk7CiAJfSB3aGlsZSAoMSk7Ci0JdXAoJnBjbWRwcml2LT50ZXJtaW5hdGVfY21kdGhyZWFkX3NlbWEpOworCWNvbXBsZXRlKCZwY21kcHJpdi0+dGVybWluYXRlX2NtZHRocmVhZF9jb21wKTsKIAl0aHJlYWRfZXhpdCgpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2VmdXNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2VmdXNlLmMKaW5kZXggNzZmNjBiYS4uMjA1Mjk4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9lZnVzZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfZWZ1c2UuYwpAQCAtMjQ4LDcgKzI0OCw3IEBACiAJdTggdG1wZGF0YVtQR1BLVF9EQVRBX1NJWkVdOwogCXU4IHJldCA9IHRydWU7CiAKLQlpZiAoZGF0YSA9PSBOVUxMKQorCWlmICghZGF0YSkKIAkJcmV0dXJuIGZhbHNlOwogCWlmIChvZmZzZXQgPiAweDBmKQogCQlyZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2xlZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9sZWQuYwppbmRleCA5MDU1ODI3Li5hOGUyMzdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2xlZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfbGVkLmMKQEAgLTQzLDcgKzQzLDcgQEAKICNkZWZpbmUgTEVEX0JMSU5LX0xJTktfSU5URVJWQUxfQUxQSEEJCTUwMAogI2RlZmluZSBMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQQkJMTgwCiAjZGVmaW5lIExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEJCTUwCi0jZGVmaW5lIExFRF9CTElOS19XUFNfU1VDRVNTX0lOVEVSVkFMX0FMUEhBCTUwMDAKKyNkZWZpbmUgTEVEX0JMSU5LX1dQU19TVUNDRVNTX0lOVEVSVkFMX0FMUEhBCTUwMDAKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIExFRCBvYmplY3QuCkBAIC01MSwxNyArNTEsMTkgQEAKICAqLwogZW51bSBfTEVEX1NUQVRFXzg3MXggewogCUxFRF9VTktOT1dOID0gMCwKLQlMRURfT04gPSAxLAotCUxFRF9PRkYgPSAyLAorCUxFRF9TVEFURV9PTiA9IDEsCisJTEVEX1NUQVRFX09GRiA9IDIsCiAJTEVEX0JMSU5LX05PUk1BTCA9IDMsCiAJTEVEX0JMSU5LX1NMT1dMWSA9IDQsCiAJTEVEX1BPV0VSX09OX0JMSU5LID0gNSwKIAlMRURfU0NBTl9CTElOSyA9IDYsIC8qIExFRCBpcyBibGlua2luZyBkdXJpbmcgc2Nhbm5pbmcgcGVyaW9kLAogCQkJICAgICAqIHRoZSAjIG9mIHRpbWVzIHRvIGJsaW5rIGlzIGRlcGVuZCBvbiB0aW1lCi0JCQkgICAgICogZm9yIHNjYW5uaW5nLiAqLworCQkJICAgICAqIGZvciBzY2FubmluZy4KKwkJCSAgICAgKi8KIAlMRURfTk9fTElOS19CTElOSyA9IDcsIC8qIExFRCBpcyBibGlua2luZyBkdXJpbmcgbm8gbGluayBzdGF0ZS4gKi8KIAlMRURfQkxJTktfU3RhcnRUb0JsaW5rID0gOCwvKiBDdXN0b21pemVkIGZvciBTZXJjb21tIFByaW50ZXIKLQkJCQkgICAgKiBTZXJ2ZXIgY2FzZSAqLworCQkJCSAgICAqIFNlcnZlciBjYXNlCisJCQkJICAgICovCiAJTEVEX0JMSU5LX1dQUyA9IDksCS8qIExFRCBpcyBibGlua2cgZHVyaW5nIFdQUyBjb21tdW5pY2F0aW9uICovCiAJTEVEX1RYUlhfQkxJTksgPSAxMCwKIAlMRURfQkxJTktfV1BTX1NUT1AgPSAxMSwJLypmb3IgQUxQSEEgKi8KQEAgLTkyLDcgKzk0LDcgQEAKIAluaWMgPSBwYWRhcHRlci0+cG5ldGRldjsKIAlwTGVkLT5wYWRhcHRlciA9IHBhZGFwdGVyOwogCXBMZWQtPkxlZFBpbiA9IExlZFBpbjsKLQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT0ZGOworCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJcExlZC0+YkxlZE9uID0gZmFsc2U7CiAJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCXBMZWQtPkJsaW5rVGltZXMgPSAwOwpAQCAtMTEwLDcgKzExMiw4IEBACiB7CiAJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCS8qIFdlIHNob3VsZCByZXNldCBiTGVkQmxpbmtJblByb2dyZXNzIGlmIHdlIGNhbmNlbAotCSAqIHRoZSBMZWRDb250cm9sVGltZXIsICovCisJICogdGhlIExlZENvbnRyb2xUaW1lciwKKwkgKi8KIAlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiB9CiAKQEAgLTIwOCw3ICsyMTEsNyBAQAogCXU4IGJTdG9wQmxpbmtpbmcgPSBmYWxzZTsKIAogCS8qIENoYW5nZSBMRUQgYWNjb3JkaW5nIHRvIEJsaW5raW5nTGVkU3RhdGUgc3BlY2lmaWVkLiAqLwotCWlmIChwTGVkLT5CbGlua2luZ0xlZFN0YXRlID09IExFRF9PTikKKwlpZiAocExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9PSBMRURfU1RBVEVfT04pCiAJCVN3TGVkT24ocGFkYXB0ZXIsIHBMZWQpOwogCWVsc2UKIAkJU3dMZWRPZmYocGFkYXB0ZXIsIHBMZWQpOwpAQCAtMjQ4LDEwICsyNTEsMTAgQEAKIAkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCX0gZWxzZSB7CiAJCS8qIEFzc2lnbiBMRUQgc3RhdGUgdG8gdG9nZ2xlLiAqLwotCQlpZiAocExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9PSBMRURfT04pCi0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJaWYgKHBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPT0gTEVEX1NUQVRFX09OKQorCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCWVsc2UKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCiAJCS8qIFNjaGVkdWxlIGEgdGltZXIgdG8gdG9nZ2xlIExFRCBzdGF0ZS4gKi8KIAkJc3dpdGNoIChwTGVkLT5DdXJyTGVkU3RhdGUpIHsKQEAgLTI4OCw3ICsyOTEsNyBAQAogCWlmIChwZWVwcm9tcHJpdi0+Q3VzdG9tZXJJRCA9PSBSVF9DSURfODE5eF9DQU1FTykKIAkJcExlZCA9ICYobGVkcHJpdi0+U3dMZWQxKTsKIAkvKiBDaGFuZ2UgTEVEIGFjY29yZGluZyB0byBCbGlua2luZ0xlZFN0YXRlIHNwZWNpZmllZC4gKi8KLQlpZiAocExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9PSBMRURfT04pCisJaWYgKHBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPT0gTEVEX1NUQVRFX09OKQogCQlTd0xlZE9uKHBhZGFwdGVyLCBwTGVkKTsKIAllbHNlCiAJCVN3TGVkT2ZmKHBhZGFwdGVyLCBwTGVkKTsKQEAgLTMxMiwxNyArMzE1LDE3IEBACiAJc3dpdGNoIChwTGVkLT5DdXJyTGVkU3RhdGUpIHsKIAljYXNlIExFRF9CTElOS19TTE9XTFk6CiAJCWlmIChwTGVkLT5iTGVkT24pCi0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQllbHNlCi0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQlicmVhazsKIAljYXNlIExFRF9CTElOS19OT1JNQUw6CiAJCWlmIChwTGVkLT5iTGVkT24pCi0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQllbHNlCi0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQlicmVhazsKQEAgLTMzNSwyNyArMzM4LDI3IEBACiAJCQkJcExlZC0+YkxlZExpbmtCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19OT1JNQUw7CiAJCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJCWVsc2UKLQkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJCX0gZWxzZSBpZiAoIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkgewogCQkJCXBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19TTE9XTFk7CiAJCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJCWVsc2UKLQkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJCX0KIAkJCXBMZWQtPmJMZWRTY2FuQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0gZWxzZSB7CiAJCQkgaWYgKHBMZWQtPmJMZWRPbikKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWVsc2UKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CkBAIC0zNjksMTggKzM3MiwxOCBAQAogCQkJCXBMZWQtPmJMZWRMaW5rQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAkJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfQkxJTktfTk9STUFMOwogCQkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCQllbHNlCi0JCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCQl9IGVsc2UgaWYgKCFjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKIAkJCQlwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAkJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfQkxJTktfU0xPV0xZOwogCQkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCQllbHNlCi0JCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCQl9CkBAIC0zODgsMjYgKzM5MSwyNiBAQAogCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9IGVsc2UgewogCQkJIGlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX0JMSU5LX1dQUzoKIAkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCWVsc2UKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0JMSU5LX1dQU19TVE9QOgkvKiBXUFMgc3VjY2VzcyAqLwotCQlpZiAocExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9PSBMRURfT04pIHsKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQlpZiAocExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9PSBMRURfU1RBVEVfT04pIHsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKLQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1dQU19TVUNFU1NfSU5URVJWQUxfQUxQSEEpKTsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1dQU19TVUNDRVNTX0lOVEVSVkFMX0FMUEhBKSk7CiAJCQliU3RvcEJsaW5raW5nID0gZmFsc2U7CiAJCX0gZWxzZSB7CiAJCQliU3RvcEJsaW5raW5nID0gdHJ1ZTsKQEAgLTQxNiw5ICs0MTksOSBAQAogCQkJcExlZC0+YkxlZExpbmtCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX05PUk1BTDsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQpAQCAtNDM2LDcgKzQzOSw3IEBACiAJdTggYlN0b3BCbGlua2luZyA9IGZhbHNlOwogCiAJLyogQ2hhbmdlIExFRCBhY2NvcmRpbmcgdG8gQmxpbmtpbmdMZWRTdGF0ZSBzcGVjaWZpZWQuICovCi0JaWYgKHBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPT0gTEVEX09OKQorCWlmIChwTGVkLT5CbGlua2luZ0xlZFN0YXRlID09IExFRF9TVEFURV9PTikKIAkJU3dMZWRPbihwYWRhcHRlciwgcExlZCk7CiAJZWxzZQogCQlTd0xlZE9mZihwYWRhcHRlciwgcExlZCk7CkBAIC00NDcsMjAgKzQ1MCwyMCBAQAogCQkJYlN0b3BCbGlua2luZyA9IHRydWU7CiAJCWlmIChiU3RvcEJsaW5raW5nKSB7CiAJCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKSB7Ci0JCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09OOwotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQkJU3dMZWRPbihwYWRhcHRlciwgcExlZCk7CiAJCQl9IGVsc2UgaWYgKCFjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKLQkJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT0ZGOwotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQkJU3dMZWRPZmYocGFkYXB0ZXIsIHBMZWQpOwogCQkJfQogCQkJcExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfSBlbHNlIHsKIAkJCSBpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KQEAgLTQ3MSwyMCArNDc0LDIwIEBACiAJCQliU3RvcEJsaW5raW5nID0gdHJ1ZTsKIAkJaWYgKGJTdG9wQmxpbmtpbmcpIHsKIAkJCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKLQkJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT047Ci0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCQlTd0xlZE9uKHBhZGFwdGVyLCBwTGVkKTsKIAkJCX0gZWxzZSBpZiAoIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkgewotCQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCQlTd0xlZE9mZihwYWRhcHRlciwgcExlZCk7CiAJCQl9CiAJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0gZWxzZSB7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQpAQCAtNTAxLDcgKzUwNCw3IEBACiAJdTggYlN0b3BCbGlua2luZyA9IGZhbHNlOwogCiAJLyogQ2hhbmdlIExFRCBhY2NvcmRpbmcgdG8gQmxpbmtpbmdMZWRTdGF0ZSBzcGVjaWZpZWQuICovCi0JaWYgKHBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPT0gTEVEX09OKQorCWlmIChwTGVkLT5CbGlua2luZ0xlZFN0YXRlID09IExFRF9TVEFURV9PTikKIAkJU3dMZWRPbihwYWRhcHRlciwgcExlZCk7CiAJZWxzZQogCQlpZiAocExlZC0+Q3VyckxlZFN0YXRlICE9IExFRF9CTElOS19XUFNfU1RPUCkKQEAgLTUxMywyMiArNTE2LDIyIEBACiAJCQliU3RvcEJsaW5raW5nID0gdHJ1ZTsKIAkJaWYgKGJTdG9wQmxpbmtpbmcpIHsKIAkJCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKLQkJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT047Ci0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCQlpZiAoIXBMZWQtPmJMZWRPbikKIAkJCQkJU3dMZWRPbihwYWRhcHRlciwgcExlZCk7CiAJCQl9IGVsc2UgaWYgKCFjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKLQkJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT0ZGOwotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQkJaWYgKHBMZWQtPmJMZWRPbikKIAkJCQkJU3dMZWRPZmYocGFkYXB0ZXIsIHBMZWQpOwogCQkJfQogCQkJcExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfSBlbHNlIHsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJfQpAQCAtNTM5LDQ2ICs1NDIsNDYgQEAKIAkJCWJTdG9wQmxpbmtpbmcgPSB0cnVlOwogCQlpZiAoYlN0b3BCbGlua2luZykgewogCQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkgewotCQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJCWlmICghcExlZC0+YkxlZE9uKQogCQkJCQlTd0xlZE9uKHBhZGFwdGVyLCBwTGVkKTsKIAkJCX0gZWxzZSBpZiAoIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkgewotCQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCQlpZiAocExlZC0+YkxlZE9uKQogCQkJCQlTd0xlZE9mZihwYWRhcHRlciwgcExlZCk7CiAJCQl9CiAJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0gZWxzZSB7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9CTElOS19XUFM6CiAJCWlmIChwTGVkLT5iTGVkT24pCi0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQllbHNlCi0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQlicmVhazsKIAljYXNlIExFRF9CTElOS19XUFNfU1RPUDoJLypXUFMgc3VjY2VzcyovCi0JCWlmIChwTGVkLT5CbGlua2luZ0xlZFN0YXRlID09IExFRF9PTikgewotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCWlmIChwTGVkLT5CbGlua2luZ0xlZFN0YXRlID09IExFRF9TVEFURV9PTikgeworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwotCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfV1BTX1NVQ0VTU19JTlRFUlZBTF9BTFBIQSkpOworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfV1BTX1NVQ0NFU1NfSU5URVJWQUxfQUxQSEEpKTsKIAkJCWJTdG9wQmxpbmtpbmcgPSBmYWxzZTsKIAkJfSBlbHNlIHsKIAkJCWJTdG9wQmxpbmtpbmcgPSB0cnVlOwogCQl9CiAJCWlmIChiU3RvcEJsaW5raW5nKSB7Ci0JCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT047Ci0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09OOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCVN3TGVkT24ocGFkYXB0ZXIsIHBMZWQpOwogCQkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9CkBAIC01OTYsMzIgKzU5OSwzMiBAQAogCXU4IGJTdG9wQmxpbmtpbmcgPSBmYWxzZTsKIAogCS8qIENoYW5nZSBMRUQgYWNjb3JkaW5nIHRvIEJsaW5raW5nTGVkU3RhdGUgc3BlY2lmaWVkLiAqLwotCWlmIChwTGVkLT5CbGlua2luZ0xlZFN0YXRlID09IExFRF9PTikKKwlpZiAocExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9PSBMRURfU1RBVEVfT04pCiAJCVN3TGVkT24ocGFkYXB0ZXIsIHBMZWQpOwogCWVsc2UKIAkJU3dMZWRPZmYocGFkYXB0ZXIsIHBMZWQpOwogCWlmICghcExlZDEtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgJiYKIAkgICAgcExlZDEtPkJsaW5raW5nTGVkU3RhdGUgPT0gTEVEX1VOS05PV04pIHsKLQkJcExlZDEtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwotCQlwTGVkMS0+Q3VyckxlZFN0YXRlID0gTEVEX09GRjsKKwkJcExlZDEtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOworCQlwTGVkMS0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJU3dMZWRPZmYocGFkYXB0ZXIsIHBMZWQxKTsKIAl9CiAJc3dpdGNoIChwTGVkLT5DdXJyTGVkU3RhdGUpIHsKIAljYXNlIExFRF9CTElOS19TTE9XTFk6CiAJCWlmIChwTGVkLT5iTGVkT24pCi0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQllbHNlCi0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQlicmVhazsKIAljYXNlIExFRF9CTElOS19TdGFydFRvQmxpbms6CiAJCWlmIChwTGVkLT5iTGVkT24pIHsKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0xPV0xZX0lOVEVSVkFMKSk7CiAJCX0gZWxzZSB7Ci0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT1JNQUxfSU5URVJWQUwpKTsKIAkJfQpAQCAtNjM0LDE3ICs2MzcsMTcgQEAKIAkJCXBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX1NMT1dMWTsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJCXBMZWQtPmJMZWRTY2FuQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0gZWxzZSB7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KQEAgLTY1NywzNyArNjYwLDM3IEBACiAJCQlwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19TTE9XTFk7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0gZWxzZSB7CiAJCQkgaWYgKHBMZWQtPmJMZWRPbikKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWVsc2UKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQkxJTktfV1BTOgogCQlpZiAocExlZC0+YkxlZE9uKSB7Ci0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NMT1dMWV9JTlRFUlZBTCkpOwogCQl9IGVsc2UgewotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9STUFMX0lOVEVSVkFMKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQkxJTktfV1BTX1NUT1A6CS8qV1BTIGF1dGhlbnRpY2F0aW9uIGZhaWwqLwogCQlpZiAocExlZC0+YkxlZE9uKQotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJZWxzZQotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PUk1BTF9JTlRFUlZBTCkpOwogCQlicmVhazsKQEAgLTcwMSwxNCArNzA0LDE0IEBACiAJCX0KIAkJaWYgKGJTdG9wQmxpbmtpbmcpIHsKIAkJCXBMZWQtPkJsaW5rVGltZXMgPSAxMDsKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJfSBlbHNlIHsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PUk1BTF9JTlRFUlZBTCkpOwogCQl9CkBAIC03MjQsNyArNzI3LDcgQEAKIAl1OCBiU3RvcEJsaW5raW5nID0gZmFsc2U7CiAKIAkvKiBDaGFuZ2UgTEVEIGFjY29yZGluZyB0byBCbGlua2luZ0xlZFN0YXRlIHNwZWNpZmllZC4gKi8KLQlpZiAocExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9PSBMRURfT04pCisJaWYgKHBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPT0gTEVEX1NUQVRFX09OKQogCQlTd0xlZE9uKHBhZGFwdGVyLCBwTGVkKTsKIAllbHNlCiAJCVN3TGVkT2ZmKHBhZGFwdGVyLCBwTGVkKTsKQEAgLTczNCwxNyArNzM3LDE3IEBACiAJCWlmIChwTGVkLT5CbGlua1RpbWVzID09IDApCiAJCQliU3RvcEJsaW5raW5nID0gdHJ1ZTsKIAkJaWYgKGJTdG9wQmxpbmtpbmcpIHsKLQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJaWYgKCFwTGVkLT5iTGVkT24pCiAJCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJCXBMZWQtPmJMZWRTY2FuQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0gZWxzZSB7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KQEAgLTc1NCwxNyArNzU3LDE3IEBACiAJCWlmIChwTGVkLT5CbGlua1RpbWVzID09IDApCiAJCQliU3RvcEJsaW5raW5nID0gdHJ1ZTsKIAkJaWYgKGJTdG9wQmxpbmtpbmcpIHsKLQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJaWYgKCFwTGVkLT5iTGVkT24pCiAJCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfSBlbHNlIHsKIAkJCSBpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQpAQCAtNzgwLDcgKzc4Myw3IEBACiAJdTggYlN0b3BCbGlua2luZyA9IGZhbHNlOwogCiAJLyogQ2hhbmdlIExFRCBhY2NvcmRpbmcgdG8gQmxpbmtpbmdMZWRTdGF0ZSBzcGVjaWZpZWQuICovCi0JaWYgKHBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPT0gTEVEX09OKQorCWlmIChwTGVkLT5CbGlua2luZ0xlZFN0YXRlID09IExFRF9TVEFURV9PTikKIAkJU3dMZWRPbihwYWRhcHRlciwgcExlZCk7CiAJZWxzZQogCQlTd0xlZE9mZihwYWRhcHRlciwgcExlZCk7CkBAIC03OTAsMjUgKzc5MywyNSBAQAogCQlpZiAocExlZC0+QmxpbmtUaW1lcyA9PSAwKQogCQkJYlN0b3BCbGlua2luZyA9IHRydWU7CiAJCWlmIChiU3RvcEJsaW5raW5nKSB7Ci0JCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT047Ci0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09OOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCWlmICghcExlZC0+YkxlZE9uKQogCQkJCVN3TGVkT24ocGFkYXB0ZXIsIHBMZWQpOwogCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9IGVsc2UgewogCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWVsc2UKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQkxJTktfV1BTOgogCQlpZiAocExlZC0+YkxlZE9uKQotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJZWxzZQotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJYnJlYWs7CkBAIC04MjcsNyArODMwLDggQEAKIAlzdHJ1Y3QgTEVEXzg3MXggICpwTGVkID0gKHN0cnVjdCBMRURfODcxeCAqKWRhdGE7CiAKIAkvKiBUaGlzIGZpeGVkIHRoZSBjcmFzaCBwcm9ibGVtIG9uIEZlZG9yYSAxMiB3aGVuIHRyeWluZyB0byBkbyB0aGUKLQkgKiBpbnNtb2Q7aWZjb25maWcgdXA7cm1tb2QgY29tbWFuZHMuICovCisJICogaW5zbW9kO2lmY29uZmlnIHVwO3JtbW9kIGNvbW1hbmRzLgorCSAqLwogCWlmIChwTGVkLT5wYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCB8fCBwTGVkLT5wYWRhcHRlci0+YkRyaXZlclN0b3BwZWQpCiAJCXJldHVybjsKIAlzY2hlZHVsZV93b3JrKCZwTGVkLT5CbGlua1dvcmtJdGVtKTsKQEAgLTkwOCw5ICs5MTIsOSBAQAogCQkJcExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfQkxJTktfU0xPV0xZOwogCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWVsc2UKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQl9CkBAIC05MzEsOSArOTM1LDkgQEAKIAkJCXBMZWQtPmJMZWRMaW5rQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19OT1JNQUw7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KQEAgLTk2MSw5ICs5NjUsOSBAQAogCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NDQU5fQkxJTks7CiAJCQlwTGVkLT5CbGlua1RpbWVzID0gMjQ7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCSB9CkBAIC05ODYsOSArOTkwLDkgQEAKIAkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9UWFJYX0JMSU5LOwogCQkJcExlZC0+QmxpbmtUaW1lcyA9IDI7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQpAQCAtMTAxNiw5ICsxMDIwLDkgQEAKIAkJCXBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX1dQUzsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJfQpAQCAtMTA0NiwxMSArMTA1MCwxMSBAQAogCQkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CiAJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19XUFNfU1RPUDsKIAkJaWYgKHBMZWQtPmJMZWRPbikgewotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCi0JCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19XUFNfU1VDRVNTX0lOVEVSVkFMX0FMUEhBKSk7CisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19XUFNfU1VDQ0VTU19JTlRFUlZBTF9BTFBIQSkpOwogCQl9IGVsc2UgewotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsCiAJCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCX0KQEAgLTEwNjMsMTUgKzEwNjcsMTUgQEAKIAkJcExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CiAJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19TTE9XTFk7CiAJCWlmIChwTGVkLT5iTGVkT24pCi0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQllbHNlCi0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQlicmVhazsKIAljYXNlIExFRF9DVExfUE9XRVJfT0ZGOgotCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT0ZGOwotCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKKwkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCWlmIChwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzKSB7CiAJCQlkZWxfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwpAQCAtMTEyMyw5ICsxMTI3LDkgQEAKIAkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TQ0FOX0JMSU5LOwogCQkJcExlZC0+QmxpbmtUaW1lcyA9IDI0OwogCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWVsc2UKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQkgfQpAQCAtMTE0MiwxNyArMTE0NiwxNyBAQAogCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1RYUlhfQkxJTks7CiAJCQlwTGVkLT5CbGlua1RpbWVzID0gMjsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBMRURfQ1RMX0xJTks6Ci0JCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PTjsKLQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09OOworCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQlpZiAocExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcykgewogCQkJZGVsX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKQEAgLTExNzgsOCArMTE4Miw4IEBACiAJCQkJcExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCX0KIAkJCXBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwotCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09OOwotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsCiAJCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCSB9CkBAIC0xMTg3LDE2ICsxMTkxLDE2IEBACiAKIAljYXNlIExFRF9DVExfU1RPUF9XUFM6CiAJCXBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKLQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09OOwotCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CisJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwKIAkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMCkpOwogCQlicmVhazsKIAogCWNhc2UgTEVEX0NUTF9TVE9QX1dQU19GQUlMOgogCQlwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gZmFsc2U7Ci0JCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOworCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAogCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCWJyZWFrOwpAQCAtMTIwNCwxNSArMTIwOCwxNSBAQAogCWNhc2UgTEVEX0NUTF9TVEFSVF9UT19MSU5LOgogCWNhc2UgTEVEX0NUTF9OT19MSU5LOgogCQlpZiAoIUlTX0xFRF9CTElOS0lORyhwTGVkKSkgewotCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09GRjsKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAogCQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMCkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9QT1dFUl9PRkY6Ci0JCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOworCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJaWYgKHBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MpIHsKIAkJCWRlbF90aW1lcigmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CkBAIC0xMjU1LDkgKzEyNTksOSBAQAogCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NDQU5fQkxJTks7CiAJCQlwTGVkLT5CbGlua1RpbWVzID0gMjQ7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KQEAgLTEyNzMsOSArMTI3Nyw5IEBACiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfVFhSWF9CTElOSzsKIAkJCXBMZWQtPkJsaW5rVGltZXMgPSAyOwogCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWVsc2UKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KQEAgLTEyODMsOCArMTI4Nyw4IEBACiAJY2FzZSBMRURfQ1RMX0xJTks6CiAJCWlmIChJU19MRURfV1BTX0JMSU5LSU5HKHBMZWQpKQogCQkJcmV0dXJuOwotCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT047Ci0JCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKKwkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJaWYgKHBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MpIHsKIAkJCWRlbF90aW1lcigmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CkBAIC0xMzEwLDkgKzEzMTQsOSBAQAogCQkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfQkxJTktfV1BTOwogCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWVsc2UKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CkBAIC0xMzI2LDExICsxMzMwLDExIEBACiAJCX0KIAkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX1dQU19TVE9QOwogCQlpZiAocExlZC0+YkxlZE9uKSB7Ci0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKLQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1dQU19TVUNFU1NfSU5URVJWQUxfQUxQSEEpKTsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1dQU19TVUNDRVNTX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0gZWxzZSB7Ci0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwKIAkJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKIAkJfQpAQCAtMTM0MCwyMyArMTM0NCwyMyBAQAogCQkJZGVsX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfQotCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT0ZGOwotCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKKwkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwKIAkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMCkpOwogCQlicmVhazsKIAljYXNlIExFRF9DVExfU1RBUlRfVE9fTElOSzoKIAljYXNlIExFRF9DVExfTk9fTElOSzoKIAkJaWYgKCFJU19MRURfQkxJTktJTkcocExlZCkpIHsKLQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwKIAkJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9DVExfUE9XRVJfT0ZGOgotCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT0ZGOwotCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKKwkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCWlmIChwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzKSB7CiAJCQlkZWxfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwpAQCAtMTM5MCw4ICsxMzk0LDggQEAKIAkJaWYgKHBMZWQxLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzKSB7CiAJCQlwTGVkMS0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJZGVsX3RpbWVyKCZwTGVkMS0+QmxpbmtUaW1lcik7Ci0JCQlwTGVkMS0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCQlwTGVkMS0+Q3VyckxlZFN0YXRlID0gTEVEX09GRjsKKwkJCXBMZWQxLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKKwkJCXBMZWQxLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJaWYgKHBMZWQxLT5iTGVkT24pCiAJCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAogCQkJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKQEAgLTE0MTEsMTEgKzE0MTUsMTEgQEAKIAkJCXBMZWQtPmJMZWRTdGFydFRvTGlua0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfQkxJTktfU3RhcnRUb0JsaW5rOwogCQkJaWYgKHBMZWQtPmJMZWRPbikgewotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0xPV0xZX0lOVEVSVkFMKSk7CiAJCQl9IGVsc2UgewotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PUk1BTF9JTlRFUlZBTCkpOwogCQkJfQpAQCAtMTQyOCw4ICsxNDMyLDggQEAKIAkJCWlmIChwTGVkMS0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcykgewogCQkJCXBMZWQxLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCQkJZGVsX3RpbWVyKCZwTGVkMS0+QmxpbmtUaW1lcik7Ci0JCQkJcExlZDEtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwotCQkJCXBMZWQxLT5DdXJyTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQxLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKKwkJCQlwTGVkMS0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCQlpZiAocExlZDEtPmJMZWRPbikKIAkJCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAogCQkJCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CkBAIC0xNDQ2LDkgKzE0NTAsOSBAQAogCQkJcExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfQkxJTktfU0xPV0xZOwogCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWVsc2UKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQl9CkBAIC0xNDcyLDkgKzE0NzYsOSBAQAogCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NDQU5fQkxJTks7CiAJCQlwTGVkLT5CbGlua1RpbWVzID0gMjQ7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KQEAgLTE0OTMsOSArMTQ5Nyw5IEBACiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfVFhSWF9CTElOSzsKIAkJCXBMZWQtPkJsaW5rVGltZXMgPSAyOwogCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWVsc2UKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KQEAgLTE1MDUsOCArMTUwOSw4IEBACiAJCWlmIChwTGVkMS0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcykgewogCQkJcExlZDEtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCWRlbF90aW1lcigmcExlZDEtPkJsaW5rVGltZXIpOwotCQkJcExlZDEtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwotCQkJcExlZDEtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQlwTGVkMS0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CisJCQlwTGVkMS0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWlmIChwTGVkMS0+YkxlZE9uKQogCQkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwKIAkJCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CkBAIC0xNTI3LDExICsxNTMxLDExIEBACiAJCQlwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19XUFM7CiAJCQlpZiAocExlZC0+YkxlZE9uKSB7Ci0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TTE9XTFlfSU5URVJWQUwpKTsKIAkJCX0gZWxzZSB7Ci0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9STUFMX0lOVEVSVkFMKSk7CiAJCQl9CkBAIC0xNTQ1LDkgKzE1NDksOSBAQAogCQlwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX1NMT1dMWTsKIAkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCWVsc2UKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCWJyZWFrOwpAQCAtMTU1OSw5ICsxNTYzLDkgQEAKIAkJcExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CiAJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19TTE9XTFk7CiAJCWlmIChwTGVkLT5iTGVkT24pCi0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQllbHNlCi0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQkvKkxFRDEgc2V0dGluZ3MqLwpAQCAtMTU3MSw5ICsxNTc1LDkgQEAKIAkJCXBMZWQxLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAkJcExlZDEtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19XUFNfU1RPUDsKIAkJaWYgKHBMZWQxLT5iTGVkT24pCi0JCQlwTGVkMS0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQlwTGVkMS0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCWVsc2UKLQkJCXBMZWQxLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJcExlZDEtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PUk1BTF9JTlRFUlZBTCkpOwogCQlicmVhazsKQEAgLTE1ODUsOSArMTU4OSw5IEBACiAJCXBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfQkxJTktfU0xPV0xZOwogCQlpZiAocExlZC0+YkxlZE9uKQotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJZWxzZQotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJLypMRUQxIHNldHRpbmdzKi8KQEAgLTE1OTgsMTUgKzE2MDIsMTUgQEAKIAkJcExlZDEtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19XUFNfU1RPUF9PVkVSTEFQOwogCQlwTGVkMS0+QmxpbmtUaW1lcyA9IDEwOwogCQlpZiAocExlZDEtPmJMZWRPbikKLQkJCXBMZWQxLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCXBMZWQxLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJZWxzZQotCQkJcExlZDEtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkMS0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9STUFMX0lOVEVSVkFMKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9QT1dFUl9PRkY6Ci0JCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOworCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJaWYgKHBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MpIHsKIAkJCWRlbF90aW1lcigmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CkBAIC0xNjYwLDggKzE2NjQsOCBAQAogCWNhc2UgTEVEX0NUTF9MSU5LOgkvKiBzb2xpZCBibHVlICovCiAJCWlmIChwTGVkLT5DdXJyTGVkU3RhdGUgPT0gTEVEX1NDQU5fQkxJTkspCiAJCQlyZXR1cm47Ci0JCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PTjsKLQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09OOworCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwKIAkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMCkpOwpAQCAtMTY3OSw5ICsxNjgzLDkgQEAKIAkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TQ0FOX0JMSU5LOwogCQkJcExlZC0+QmxpbmtUaW1lcyA9IDI0OwogCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWVsc2UKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CkBAIC0xNjk1LDE2ICsxNjk5LDE2IEBACiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfVFhSWF9CTElOSzsKIAkJCXBMZWQtPkJsaW5rVGltZXMgPSAyOwogCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWVsc2UKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX1BPV0VSX09GRjoKLQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09GRjsKLQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CisJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQlpZiAocExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcykgewogCQkJZGVsX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKQEAgLTE3MzEsOCArMTczNSw4IEBACiAJY2FzZSBMRURfQ1RMX1NJVEVfU1VSVkVZOgogCQlpZiAoSVNfTEVEX1dQU19CTElOS0lORyhwTGVkKSkKIAkJCQlyZXR1cm47Ci0JCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PTjsKLQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09OOworCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCW1vZF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCWJyZWFrOwpAQCAtMTc0Niw5ICsxNzUwLDkgQEAKIAkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9UWFJYX0JMSU5LOwogCQkJcExlZC0+QmxpbmtUaW1lcyA9IDI7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQpAQCAtMTc2Myw5ICsxNzY3LDkgQEAKIAkJCXBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX1dQUzsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJfQpAQCAtMTc3NiwxNCArMTc4MCwxNCBAQAogCQkJZGVsX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfQotCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT047Ci0JCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKKwkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAogCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9QT1dFUl9PRkY6Ci0JCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOworCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJaWYgKHBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MpIHsKIAkJCWRlbF90aW1lcigmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3JlY3YuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfcmVjdi5jCmluZGV4IGYyNWIzNGMuLjY2ZjBlMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfcmVjdi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfcmVjdi5jCkBAIC02MCw3ICs2MCw3IEBACiAJX2luaXRfcXVldWUoJnByZWN2cHJpdi0+ZnJlZV9yZWN2X2J1Zl9xdWV1ZSk7CiAJcHJlY3Zwcml2LT5wYWxsb2NhdGVkX3JlY3ZfYnVmID0KIAkJa3phbGxvYyhOUl9SRUNWQlVGRiAqIHNpemVvZihzdHJ1Y3QgcmVjdl9idWYpICsgNCwgR0ZQX0FUT01JQyk7Ci0JaWYgKHByZWN2cHJpdi0+cGFsbG9jYXRlZF9yZWN2X2J1ZiA9PSBOVUxMKQorCWlmICghcHJlY3Zwcml2LT5wYWxsb2NhdGVkX3JlY3ZfYnVmKQogCQlyZXR1cm4gX0ZBSUw7CiAJcHJlY3Zwcml2LT5wcmVjdl9idWYgPSBwcmVjdnByaXYtPnBhbGxvY2F0ZWRfcmVjdl9idWYgKyA0IC0KIAkJCSAgICAgICgoYWRkcl90KSAocHJlY3Zwcml2LT5wYWxsb2NhdGVkX3JlY3ZfYnVmKSAmIDMpOwpAQCAtMTYzLDcgKzE2Myw4IEBACiAJZHJ2aW5mb19zeiA9IChsZTMyX3RvX2NwdShwcnhzdGF0LT5yeGR3MCkgJiAweDAwMGYwMDAwKSA+PiAxNjsKIAlkcnZpbmZvX3N6IDw8PSAzOwogCS8qVE9ETzoKLQkgKiBPZmZzZXQgMCAqLworCSAqIE9mZnNldCAwCisJICovCiAJcGF0dHJpYi0+YmRlY3J5cHRlZCA9ICgobGUzMl90b19jcHUocHJ4c3RhdC0+cnhkdzApICYgQklUKDI3KSkgPj4gMjcpCiAJCQkJID8gMCA6IDE7CiAJcGF0dHJpYi0+Y3JjX2VyciA9IChsZTMyX3RvX2NwdShwcnhzdGF0LT5yeGR3MCkgJiBCSVQoMTQpKSA+PiAxNDsKQEAgLTIxMCw3ICsyMTEsOCBAQAogCWN1cmZyYWdudW0gPSAwOwogCWlmIChjdXJmcmFnbnVtICE9IHBmaGRyLT5hdHRyaWIuZnJhZ19udW0pIHsKIAkJLyp0aGUgZmlyc3QgZnJhZ21lbnQgbnVtYmVyIG11c3QgYmUgMAotCQkgKmZyZWUgdGhlIHdob2xlIHF1ZXVlKi8KKwkJICpmcmVlIHRoZSB3aG9sZSBxdWV1ZQorCQkgKi8KIAkJcjg3MTJfZnJlZV9yZWN2ZnJhbWUocHJmcmFtZSwgcGZyZWVfcmVjdl9xdWV1ZSk7CiAJCXI4NzEyX2ZyZWVfcmVjdmZyYW1lX3F1ZXVlKGRlZnJhZ19xLCBwZnJlZV9yZWN2X3F1ZXVlKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC0yMjQsMTggKzIyNiwyMSBAQAogCQkvKmNoZWNrIHRoZSBmcmFnbWVudCBzZXF1ZW5jZSAgKDJuZCB+biBmcmFnbWVudCBmcmFtZSkgKi8KIAkJaWYgKGN1cmZyYWdudW0gIT0gcG5maGRyLT5hdHRyaWIuZnJhZ19udW0pIHsKIAkJCS8qIHRoZSBmcmFnbWVudCBudW1iZXIgbXVzdCBpbmNyZWFzZSAgKGFmdGVyIGRlY2FjaGUpCi0JCQkgKiByZWxlYXNlIHRoZSBkZWZyYWdfcSAmIHByZnJhbWUgKi8KKwkJCSAqIHJlbGVhc2UgdGhlIGRlZnJhZ19xICYgcHJmcmFtZQorCQkJICovCiAJCQlyODcxMl9mcmVlX3JlY3ZmcmFtZShwcmZyYW1lLCBwZnJlZV9yZWN2X3F1ZXVlKTsKIAkJCXI4NzEyX2ZyZWVfcmVjdmZyYW1lX3F1ZXVlKGRlZnJhZ19xLCBwZnJlZV9yZWN2X3F1ZXVlKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCWN1cmZyYWdudW0rKzsKIAkJLyogY29weSB0aGUgMm5kfm4gZnJhZ21lbnQgZnJhbWUncyBwYXlsb2FkIHRvIHRoZSBmaXJzdCBmcmFnbWVudAotCQkgKiBnZXQgdGhlIDJuZH5sYXN0IGZyYWdtZW50IGZyYW1lJ3MgcGF5bG9hZCAqLworCQkgKiBnZXQgdGhlIDJuZH5sYXN0IGZyYWdtZW50IGZyYW1lJ3MgcGF5bG9hZAorCQkgKi8KIAkJd2xhbmhkcl9vZmZzZXQgPSBwbmZoZHItPmF0dHJpYi5oZHJsZW4gKyBwbmZoZHItPmF0dHJpYi5pdl9sZW47CiAJCXJlY3ZmcmFtZV9wdWxsKHBuZXh0cmZyYW1lLCB3bGFuaGRyX29mZnNldCk7CiAJCS8qIGFwcGVuZCAgdG8gZmlyc3QgZnJhZ21lbnQgZnJhbWUncyB0YWlsIChpZiBwcml2YWN5IGZyYW1lLAotCQkgKiBwdWxsIHRoZSBJQ1YpICovCisJCSAqIHB1bGwgdGhlIElDVikKKwkJICovCiAJCXJlY3ZmcmFtZV9wdWxsX3RhaWwocHJmcmFtZSwgcGZoZHItPmF0dHJpYi5pY3ZfbGVuKTsKIAkJbWVtY3B5KHBmaGRyLT5yeF90YWlsLCBwbmZoZHItPnJ4X2RhdGEsIHBuZmhkci0+bGVuKTsKIAkJcmVjdmZyYW1lX3B1dChwcmZyYW1lLCBwbmZoZHItPmxlbik7CkBAIC0yNjksNyArMjc0LDcgQEAKIAlmcmFnbnVtID0gcGZoZHItPmF0dHJpYi5mcmFnX251bTsKIAlwc3RhX2FkZHIgPSBwZmhkci0+YXR0cmliLnRhOwogCXBzdGEgPSByODcxMl9nZXRfc3RhaW5mbyhwc3RhcHJpdiwgcHN0YV9hZGRyKTsKLQlpZiAocHN0YSA9PSBOVUxMKQorCWlmICghcHN0YSkKIAkJcGRlZnJhZ19xID0gTlVMTDsKIAllbHNlCiAJCXBkZWZyYWdfcSA9ICZwc3RhLT5zdGFfcmVjdnByaXYuZGVmcmFnX3E7CkBAIC0yNzgsNyArMjgzLDggQEAKIAkJcHJ0bmZyYW1lID0gcHJlY3ZfZnJhbWU7Lyppc24ndCBhIGZyYWdtZW50IGZyYW1lKi8KIAlpZiAoaXNtZnJhZyA9PSAxKSB7CiAJCS8qIDB+KG4tMSkgZnJhZ21lbnQgZnJhbWUKLQkJICogZW5xdWV1ZSB0byBkZWZyYWZfZyAqLworCQkgKiBlbnF1ZXVlIHRvIGRlZnJhZl9nCisJCSAqLwogCQlpZiAocGRlZnJhZ19xICE9IE5VTEwpIHsKIAkJCWlmIChmcmFnbnVtID09IDApIHsKIAkJCQkvKnRoZSBmaXJzdCBmcmFnbWVudCovCkBAIC0yOTQsNyArMzAwLDggQEAKIAkJCXBydG5mcmFtZSA9IE5VTEw7CiAJCX0gZWxzZSB7CiAJCQkvKiBjYW4ndCBmaW5kIHRoaXMgdGEncyBkZWZyYWdfcXVldWUsIHNvIGZyZWUgdGhpcwotCQkJICogcmVjdl9mcmFtZSAqLworCQkJICogcmVjdl9mcmFtZQorCQkJICovCiAJCQlyODcxMl9mcmVlX3JlY3ZmcmFtZShwcmVjdl9mcmFtZSwgcGZyZWVfcmVjdl9xdWV1ZSk7CiAJCQlwcnRuZnJhbWUgPSBOVUxMOwogCQl9CkBAIC0zMDIsNyArMzA5LDggQEAKIAl9CiAJaWYgKChpc21mcmFnID09IDApICYmIChmcmFnbnVtICE9IDApKSB7CiAJCS8qIHRoZSBsYXN0IGZyYWdtZW50IGZyYW1lCi0JCSAqIGVucXVldWUgdGhlIGxhc3QgZnJhZ21lbnQgKi8KKwkJICogZW5xdWV1ZSB0aGUgbGFzdCBmcmFnbWVudAorCQkgKi8KIAkJaWYgKHBkZWZyYWdfcSAhPSBOVUxMKSB7CiAJCQlwaGVhZCA9ICZwZGVmcmFnX3EtPnF1ZXVlOwogCQkJbGlzdF9hZGRfdGFpbCgmcGZoZHItPmxpc3QsIHBoZWFkKTsKQEAgLTMxMSw3ICszMTksOCBAQAogCQkJcHJ0bmZyYW1lID0gcHJlY3ZfZnJhbWU7CiAJCX0gZWxzZSB7CiAJCQkvKiBjYW4ndCBmaW5kIHRoaXMgdGEncyBkZWZyYWdfcXVldWUsIHNvIGZyZWUgdGhpcwotCQkJICogIHJlY3ZfZnJhbWUgKi8KKwkJCSAqICByZWN2X2ZyYW1lCisJCQkgKi8KIAkJCXI4NzEyX2ZyZWVfcmVjdmZyYW1lKHByZWN2X2ZyYW1lLCBwZnJlZV9yZWN2X3F1ZXVlKTsKIAkJCXBydG5mcmFtZSA9IE5VTEw7CiAJCX0KQEAgLTM5MSw3ICs0MDAsOCBAQAogCQkgICBldGhfdHlwZSAhPSBFVEhfUF9BQVJQICYmIGV0aF90eXBlICE9IEVUSF9QX0lQWCkgfHwKIAkJICAgIW1lbWNtcChzdWJfc2tiLT5kYXRhLCBicmlkZ2VfdHVubmVsX2hlYWRlciwgU05BUF9TSVpFKSkpIHsKIAkJCS8qIHJlbW92ZSBSRkMxMDQyIG9yIEJyaWRnZS1UdW5uZWwgZW5jYXBzdWxhdGlvbiBhbmQKLQkJCSAqIHJlcGxhY2UgRXRoZXJUeXBlICovCisJCQkgKiByZXBsYWNlIEV0aGVyVHlwZQorCQkJICovCiAJCQlza2JfcHVsbChzdWJfc2tiLCBTTkFQX1NJWkUpOwogCQkJbWVtY3B5KHNrYl9wdXNoKHN1Yl9za2IsIEVUSF9BTEVOKSwgcGF0dHJpYi0+c3JjLAogCQkJCUVUSF9BTEVOKTsKQEAgLTUzMCw3ICs1NDAsOCBAQAogCQlwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEgPSBwYXR0cmliLT5zZXFfbnVtOwogCX0KIAkvKiBQcmVwYXJlIGluZGljYXRpb24gbGlzdCBhbmQgaW5kaWNhdGlvbi4KLQkgKiBDaGVjayBpZiB0aGVyZSBpcyBhbnkgcGFja2V0IG5lZWQgaW5kaWNhdGUuICovCisJICogQ2hlY2sgaWYgdGhlcmUgaXMgYW55IHBhY2tldCBuZWVkIGluZGljYXRlLgorCSAqLwogCXdoaWxlICghbGlzdF9lbXB0eShwaGVhZCkpIHsKIAkJcHJmcmFtZSA9IGNvbnRhaW5lcl9vZihwbGlzdCwgdW5pb24gcmVjdl9mcmFtZSwgdS5saXN0KTsKIAkJcGF0dHJpYiA9ICZwcmZyYW1lLT51Lmhkci5hdHRyaWI7CkBAIC03NTcsNyArNzY4LDggQEAKIAkJCS8qIE1vZGlmeSB0aGUgUkYgUk5BIGdhaW4gdmFsdWUgdG8gLTQwLCAtMjAsCiAJCQkgKiAtMiwgMTQgYnkgSmVueXUncyBzdWdnZXN0aW9uCiAJCQkgKiBOb3RlOiBkaWZmZXJlbnQgUkYgd2l0aCB0aGUgZGlmZmVyZW50Ci0JCQkgKiBSTkEgZ2Fpbi4gKi8KKwkJCSAqIFJOQSBnYWluLgorCQkJICovCiAJCQljYXNlIDB4MzoKIAkJCQlyeF9wd3JfYWxsID0gLTQwIC0gKHBjY2tfYnVmLT5jY2tfYWdjX3JwdCAmCiAJCQkJCSAgICAgMHgzZSk7CkBAIC04NDIsNyArODU0LDggQEAKIAkJCXRvdGFsX3Jzc2kgKz0gcnNzaTsKIAkJfQogCQkvKiAoMilQV0RCLCBBdmVyYWdlIFBXREIgY2FjbHVhdGVkIGJ5IGhhcmR3YXJlIChmb3IKLQkJICogcmF0ZSBhZGFwdGl2ZSkgKi8KKwkJICogcmF0ZSBhZGFwdGl2ZSkKKwkJICovCiAJCXJ4X3B3cl9hbGwgPSAoKChwcGh5X2hlYWRbUEhZX1NUQVRfUFdEQl9BTExfU0hUXSkgPj4gMSkgJiAweDdmKQogCQkJICAgICAtIDEwNjsKIAkJcHdkYl9hbGwgPSBxdWVyeV9yeF9wd3JfcGVyY2VudGFnZShyeF9wd3JfYWxsKTsKQEAgLTg3MCw3ICs4ODMsOCBAQAogCX0KIAkvKiBVSSBCU1MgTGlzdCBzaWduYWwgc3RyZW5ndGgoaW4gcGVyY2VudGFnZSksIG1ha2UgaXQgZ29vZCBsb29raW5nLAogCSAqIGZyb20gMH4xMDAuIEl0IGlzIGFzc2lnbmVkIHRvIHRoZSBCU1MgTGlzdCBpbgotCSAqIEdldFZhbHVlRnJvbUJlYWNvbk9yUHJvYmVSc3AoKS4gKi8KKwkgKiBHZXRWYWx1ZUZyb21CZWFjb25PclByb2JlUnNwKCkuCisJICovCiAJaWYgKGJjY2tfcmF0ZSkKIAkJcHJmcmFtZS0+dS5oZHIuYXR0cmliLnNpZ25hbF9zdHJlbmd0aCA9CiAJCQkgKHU4KXI4NzEyX3NpZ25hbF9zY2FsZV9tYXBwaW5nKHB3ZGJfYWxsKTsKQEAgLTk4NSwxNSArOTk5LDE1IEBACiAJfQogCXByb2Nlc3NfcGh5X2luZm8ocGFkYXB0ZXIsIHByZnJhbWUpOwogCXByZnJhbWUgPSByODcxMl9kZWNyeXB0b3IocGFkYXB0ZXIsIHByZnJhbWUpOwotCWlmIChwcmZyYW1lID09IE5VTEwpIHsKKwlpZiAoIXByZnJhbWUpIHsKIAkJcmV0dmFsID0gX0ZBSUw7CiAJCWdvdG8gX2V4aXRfcmVjdl9mdW5jOwogCX0KIAlwcmZyYW1lID0gcjg3MTJfcmVjdmZyYW1lX2Noa19kZWZyYWcocGFkYXB0ZXIsIHByZnJhbWUpOwotCWlmIChwcmZyYW1lID09IE5VTEwpCisJaWYgKCFwcmZyYW1lKQogCQlnb3RvIF9leGl0X3JlY3ZfZnVuYzsKIAlwcmZyYW1lID0gcjg3MTJfcG9ydGN0cmwocGFkYXB0ZXIsIHByZnJhbWUpOwotCWlmIChwcmZyYW1lID09IE5VTEwpIHsKKwlpZiAoIXByZnJhbWUpIHsKIAkJcmV0dmFsID0gX0ZBSUw7CiAJCWdvdG8gX2V4aXRfcmVjdl9mdW5jOwogCX0KQEAgLTEwMjcsMTAgKzEwNDEsMTIgQEAKIAl0cmFuc2Zlcl9sZW4gPSBwc2tiLT5sZW47CiAJLyogVGVzdCB0aHJvdWdocHV0IHdpdGggTmV0Z2VhciAzNzAwIChObyBzZWN1cml0eSkgd2l0aCBDaGFyaW90IDNUM1IKIAkgKiBwYWlycy4gVGhlIHBhY2tldCBjb3VudCB3aWxsIGJlIGEgYmlnIG51bWJlciBzbyB0aGF0IHRoZSBjb250YWluaW5nCi0JICogcGFja2V0IHdpbGwgZWZmZWN0IHRoZSBSeCByZW9yZGVyaW5nLiAqLworCSAqIHBhY2tldCB3aWxsIGVmZmVjdCB0aGUgUnggcmVvcmRlcmluZy4KKwkgKi8KIAlpZiAodHJhbnNmZXJfbGVuIDwgcGt0X2xlbikgewogCQkvKiBJbiB0aGlzIGNhc2UsIGl0IG1lYW5zIHRoZSBNQVhfUkVDVkJVRl9TWiBpcyB0b28gc21hbGwgdG8KLQkJICogZ2V0IHRoZSBkYXRhIGZyb20gODcxMnUuICovCisJCSAqIGdldCB0aGUgZGF0YSBmcm9tIDg3MTJ1LgorCQkgKi8KIAkJcmV0dXJuIF9GQUlMOwogCX0KIAlkbyB7CkBAIC0xMDQ5LDcgKzEwNjUsNyBAQAogCQlpZiAoKGxlMzJfdG9fY3B1KHByeHN0YXQtPnJ4ZHcwKSA+PiAyMykgJiAweDAxKQogCQkJc2hpZnRfc3ogPSAyOwogCQlwcmVjdmZyYW1lID0gcjg3MTJfYWxsb2NfcmVjdmZyYW1lKHBmcmVlX3JlY3ZfcXVldWUpOwotCQlpZiAocHJlY3ZmcmFtZSA9PSBOVUxMKQorCQlpZiAoIXByZWN2ZnJhbWUpCiAJCQlnb3RvICBfZXhpdF9yZWN2YnVmMnJlY3ZmcmFtZTsKIAkJSU5JVF9MSVNUX0hFQUQoJnByZWN2ZnJhbWUtPnUuaGRyLmxpc3QpOwogCQlwcmVjdmZyYW1lLT51Lmhkci5wcmVjdmJ1ZiA9IE5VTEw7IC8qY2FuJ3QgYWNjZXNzIHRoZSBwcmVjdmJ1ZiovCkBAIC0xMDU3LDE0ICsxMDczLDE2IEBACiAJCXRtcF9sZW4gPSBwa3RfbGVuICsgZHJ2aW5mb19zeiArIFJYREVTQ19TSVpFOwogCQlwa3Rfb2Zmc2V0ID0gKHUxNilyb3VuZF91cCh0bXBfbGVuLCAxMjgpOwogCQkvKiBmb3IgZmlyc3QgZnJhZ21lbnQgcGFja2V0LCBkcml2ZXIgbmVlZCBhbGxvY2F0ZSAxNTM2ICsKLQkJICogZHJ2aW5mb19zeiArIFJYREVTQ19TSVpFIHRvIGRlZnJhZyBwYWNrZXQuICovCisJCSAqIGRydmluZm9fc3ogKyBSWERFU0NfU0laRSB0byBkZWZyYWcgcGFja2V0LgorCQkgKi8KIAkJaWYgKChtZiA9PSAxKSAmJiAoZnJhZyA9PSAwKSkKIAkJCS8qMTY1OCs2PTE2NjQsIDE2NjQgaXMgMTI4IGFsaWdubWVudC4qLwogCQkJYWxsb2Nfc3ogPSBtYXhfdCh1MTYsIHRtcF9sZW4sIDE2NTgpOwogCQllbHNlCiAJCQlhbGxvY19zeiA9IHRtcF9sZW47CiAJCS8qIDIgaXMgZm9yIElQIGhlYWRlciA0IGJ5dGVzIGFsaWdubWVudCBpbiBRb1MgcGFja2V0IGNhc2UuCi0JCSAqIDQgaXMgZm9yIHNrYi0+ZGF0YSA0IGJ5dGVzIGFsaWdubWVudC4gKi8KKwkJICogNCBpcyBmb3Igc2tiLT5kYXRhIDQgYnl0ZXMgYWxpZ25tZW50LgorCQkgKi8KIAkJYWxsb2Nfc3ogKz0gNjsKIAkJcGt0X2NvcHkgPSBuZXRkZXZfYWxsb2Nfc2tiKHBhZGFwdGVyLT5wbmV0ZGV2LCBhbGxvY19zeik7CiAJCWlmIChwa3RfY29weSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9yZWN2LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3JlY3YuaAppbmRleCBmZDllM2ZjLi4wYjBjMjczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3JlY3YuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3JlY3YuaApAQCAtNjEsNyArNjEsOCBAQAogc3RydWN0IHBoeV9jY2tfcnhfc3RhdHVzIHsKIAkvKiBGb3IgQ0NLIHJhdGUgZGVzY3JpcHRvci4gVGhpcyBpcyBhIHVuc2lnbmVkIDg6MSB2YXJpYWJsZS4KIAkgKiBMU0IgYml0IHByZXNlbnQgMC41LiBBbmQgTVNCIDcgYnRzIHByZXNlbnQgYSBzaWduZWQgdmFsdWUuCi0JICogUmFuZ2UgZnJvbSAtNjR+KzYzLjUuICovCisJICogUmFuZ2UgZnJvbSAtNjR+KzYzLjUuCisJICovCiAJdTgJYWRjX3B3ZGJfWFs0XTsKIAl1OAlzcV9ycHQ7CiAJdTgJY2NrX2FnY19ycHQ7CkBAIC0xMDMsNyArMTA0LDYgQEAKIAlzdHJ1Y3QgX2FkYXB0ZXIgICphZGFwdGVyOwogCXN0cnVjdCB1cmIgKnB1cmI7CiAJX3BrdCAqcHNrYjsKLQl1OCByZXVzZTsKIAl1OCAgaXJwX3BlbmRpbmc7CiAJdTMyICB0cmFuc2Zlcl9sZW47CiAJdWludCAgbGVuOwpAQCAtMTE2LDEzICsxMTYsMTMgQEAKIH07CiAKIC8qCi0JaGVhZCAgLS0tLS0+Ci0JCWRhdGEgIC0tLS0tPgotCQkJcGF5bG9hZAotCQl0YWlsICAtLS0tLT4KLQllbmQgICAtLS0tLT4KLQlsZW4gPSAodW5zaWduZWQgaW50ICkodGFpbCAtIGRhdGEpOwotKi8KKyAqCWhlYWQgIC0tLS0tPgorICoJCWRhdGEgIC0tLS0tPgorICoJCQlwYXlsb2FkCisgKgkJdGFpbCAgLS0tLS0+CisgKgllbmQgICAtLS0tLT4KKyAqCWxlbiA9ICh1bnNpZ25lZCBpbnQgKSh0YWlsIC0gZGF0YSk7CisgKi8KIHN0cnVjdCByZWN2X2ZyYW1lX2hkciB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCV9wa3QJKnBrdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfc3BlYy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9zcGVjLmgKaW5kZXggYWYxMWI0NC4uNTFlMDQyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9zcGVjLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9zcGVjLmgKQEAgLTgzLDcgKzgzLDggQEAKIAogI2RlZmluZSBDTURfQUREUl9NQVBQSU5HX1NISUZUCQkyCS8qU0RJTyBDTUQgQUREUiBNQVBQSU5HLAogCQkJCQkJICpzaGlmdCAyIGJpdCBmb3IgbWF0Y2gKLQkJCQkJCSAqIG9mZnNldFsxNDoyXSovCisJCQkJCQkgKiBvZmZzZXRbMTQ6Ml0KKwkJCQkJCSAqLwogCiAvKk9mZnNldCBmb3IgU0RJTyBMT0NBTCovCiAjZGVmaW5lCU9GRlNFVF9TRElPX0xPQ0FMCQkJCTB4MEZGRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9zeXNjZmdfYml0ZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3N5c2NmZ19iaXRkZWYuaAppbmRleCBlZWQwOWM4Li4yZTY2ZDI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3N5c2NmZ19iaXRkZWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3N5c2NmZ19iaXRkZWYuaApAQCAtNjgsMTEgKzY4LDEzIEBACiAjZGVmaW5lIFNZU19DTEtTRUwJCUJJVChTWVNfQ0xLU0VMX1NIVCkgLyogU3lzdGVtIENsb2NrIDgwTUh6Ki8KICNkZWZpbmUgUFNfQ0xLU0VMX1NIVAkJMQogI2RlZmluZSBQU19DTEtTRUwJCUJJVChQU19DTEtTRUxfU0hUKSAvKlN5c3RlbSBwb3dlciBzYXZlCi0JCQkJCQkgICAgKiBjbG9jayBzZWxlY3QuKi8KKwkJCQkJCSAgICAqIGNsb2NrIHNlbGVjdC4KKwkJCQkJCSAgICAqLwogI2RlZmluZSBDUFVfQ0xLU0VMX1NIVAkJMgogI2RlZmluZSBDUFVfQ0xLU0VMCQlCSVQoQ1BVX0NMS1NFTF9TSFQpIC8qIFN5c3RlbSBDbG9jayBzZWxlY3QsCiAJCQkJCQkgICAgICogMTogQUZFIHNvdXJjZSwKLQkJCQkJCSAgICAgKiAwOiBTeXN0ZW0gY2xvY2soTC1CdXMpKi8KKwkJCQkJCSAgICAgKiAwOiBTeXN0ZW0gY2xvY2soTC1CdXMpCisJCQkJCQkgICAgICovCiAjZGVmaW5lIElOVDMyS19FTl9TSFQJCTMKICNkZWZpbmUgSU5UMzJLX0VOCQlCSVQoSU5UMzJLX0VOX1NIVCkKICNkZWZpbmUgTUFDU0xQX1NIVAkJNApAQCAtODUsMTAgKzg3LDEyIEBACiAjZGVmaW5lIFJJTkdfQ0xLX0VOCQlCSVQoUklOR19DTEtfRU5fU0hUKQogI2RlZmluZSBTV0hXX1NFTF9TSFQJCTE0CiAjZGVmaW5lIFNXSFdfU0VMCQlCSVQoU1dIV19TRUxfU0hUKSAvKiBMb2FkIGRvbmUsCi0JCQkJCQkgICAqIGNvbnRyb2wgcGF0aCBzd2l0Y2guKi8KKwkJCQkJCSAgICogY29udHJvbCBwYXRoIHN3aXRjaC4KKwkJCQkJCSAgICovCiAjZGVmaW5lIEZXSFdfU0VMX1NIVAkJMTUKICNkZWZpbmUgRldIV19TRUwJCUJJVChGV0hXX1NFTF9TSFQpIC8qIFNsZWVwIGV4aXQsCi0JCQkJCQkgICAqIGNvbnRyb2wgcGF0aCBzd2l0Y2guKi8KKwkJCQkJCSAgICogY29udHJvbCBwYXRoIHN3aXRjaC4KKwkJCQkJCSAgICovCiAKIC8qOTM0NkNSKi8KICNkZWZpbmUJX1ZQRElEWF9NU0sJCTB4RkYwMApAQCAtMTE4LDEwICsxMjIsMTIgQEAKICNkZWZpbmUJQUZFX01JU0NfRTMyX0VOCQlCSVQoQUZFX01JU0NfRTMyX0VOX1NIVCkKICNkZWZpbmUJQUZFX01JU0NfTUJFTl9TSFQJMQogI2RlZmluZQlBRkVfTUlTQ19NQkVOCQlCSVQoQUZFX01JU0NfTUJFTl9TSFQpLyogRW5hYmxlIEFGRSBNYWNybwotCQkJCQkJICAgICAgICogQmxvY2sncyBNYmlhcy4qLworCQkJCQkJICAgICAgICogQmxvY2sncyBNYmlhcy4KKwkJCQkJCSAgICAgICAqLwogI2RlZmluZQlBRkVfTUlTQ19CR0VOX1NIVAkwCiAjZGVmaW5lCUFGRV9NSVNDX0JHRU4JCUJJVChBRkVfTUlTQ19CR0VOX1NIVCkvKiBFbmFibGUgQUZFIE1hY3JvCi0JCQkJCQkgICAgICAgKiBCbG9jaydzIEJhbmRnYXAuKi8KKwkJCQkJCSAgICAgICAqIEJsb2NrJ3MgQmFuZGdhcC4KKwkJCQkJCSAgICAgICAqLwogCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMTQ5LDEwICsxNTUsMTIgQEAKIAogLyogRUZVU0VfQ1RSTCovCiAjZGVmaW5lIEVGX0ZMQUcJCQlCSVQoMzEpCQkvKiBBY2Nlc3MgRmxhZywgV3JpdGU6MTsKLQkJCQkJCSAqCSAgICAgICAgUmVhZDowKi8KKwkJCQkJCSAqCSAgICAgICAgUmVhZDowCisJCQkJCQkgKi8KICNkZWZpbmUgRUZfUEdQRAkJCTB4NzAwMDAwMDAJLyogRS1mdXNlIFByb2dyYW0gdGltZSovCiAjZGVmaW5lIEVGX1JEVAkJCTB4MEYwMDAwMDAJLyogRS1mdXNlIHJlYWQgdGltZTogaW4gdGhlCi0JCQkJCQkgKiB1bml0IG9mIGN5Y2xlIHRpbWUqLworCQkJCQkJICogdW5pdCBvZiBjeWNsZSB0aW1lCisJCQkJCQkgKi8KICNkZWZpbmUgRUZfUEROX0VOCQlCSVQoMTkpCQkvKiBFRnVzZSBQb3dlciBkb3duIGVuYWJsZSovCiAjZGVmaW5lIEFMRF9FTgkJCUJJVCgxOCkJCS8qIEF1dG9sb2FkIEVuYWJsZSovCiAjZGVmaW5lIEVGX0FERFIJCQkweDAwMDNGRjAwCS8qIEFjY2VzcyBBZGRyZXNzKi8KQEAgLTE2NCw3ICsxNzIsOCBAQAogLyogRUZVU0VfQ0xLX0NUUkwqLwogI2RlZmluZSBFRlVTRV9DTEtfRU4JCUJJVCgxKQkJLyogRS1GdXNlIENsb2NrIEVuYWJsZSovCiAjZGVmaW5lIEVGVVNFX0NMS19TRUwJCUJJVCgwKQkJLyogRS1GdXNlIENsb2NrIFNlbGVjdCwKLQkJCQkJCSAqIDA6NTAwSywgMTo0ME0qLworCQkJCQkJICogMDo1MDBLLCAxOjQwTQorCQkJCQkJICovCiAKICNlbmRpZgkvKl9fUlRMODcxMl9TWVNDRkdfQklUREVGX0hfXyovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfeG1pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl94bWl0LmMKaW5kZXggN2UwYjk0NS4uYzRmMDNhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl94bWl0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl94bWl0LmMKQEAgLTUzNSw3ICs1MzUsOCBAQAogCQkgKiBzZXFudW0gcGVyIHRpZC4gYWJvdXQgdXNiIHVzaW5nIDQtZW5kcG9pbnQsIHFzZWwgcG9pbnRzIG91dAogCQkgKiB0aGUgY29ycmVjdCBtYXBwaW5nIGJldHdlZW4gQUMmRW5kcG9pbnQsCiAJCSAqIHRoZSBwdXJwb3NlIGlzIHRoYXQgY29ycmVjdCBtYXBwaW5nIGxldHMgdGhlIE1BQyByZWxlYXNlCi0JCSAqIHRoZSBBQyBRdWV1ZSBsaXN0IGNvcnJlY3RseS4gKi8KKwkJICogdGhlIEFDIFF1ZXVlIGxpc3QgY29ycmVjdGx5LgorCQkgKi8KIAkJcHR4ZGVzYy0+dHhkdzMgPSBjcHVfdG9fbGUzMigocGF0dHJpYi0+cHJpb3JpdHkgPDwgU0VRX1NIVCkgJgogCQkJCSAweDBmZmYwMDAwKTsKIAkJaWYgKChwYXR0cmliLT5ldGhlcl90eXBlICE9IDB4ODg4ZSkgJiYKQEAgLTU4Niw3ICs1ODcsOCBAQAogCQkgKiBwZXIgdGlkLiBhYm91dCB1c2IgdXNpbmcgNC1lbmRwb2ludCwgcXNlbCBwb2ludHMgb3V0IHRoZQogCQkgKiBjb3JyZWN0IG1hcHBpbmcgYmV0d2VlbiBBQyZFbmRwb2ludCwKIAkJICogdGhlIHB1cnBvc2UgaXMgdGhhdCBjb3JyZWN0IG1hcHBpbmcgbGV0IHRoZSBNQUMgcmVsZWFzZXMKLQkJICogdGhlIEFDIFF1ZXVlIGxpc3QgY29ycmVjdGx5LiAqLworCQkgKiB0aGUgQUMgUXVldWUgbGlzdCBjb3JyZWN0bHkuCisJCSAqLwogCQlwdHhkZXNjLT50eGR3MyA9IGNwdV90b19sZTMyKChwYXR0cmliLT5wcmlvcml0eSA8PCBTRVFfU0hUKSAmCiAJCQkJCSAgICAgIDB4MGZmZjAwMDApOwogCQkvKiBvZmZzZXQgMTYgKi8KQEAgLTYyNyw3ICs2MjksNyBAQAogCiAJcGh3eG1pdHMgPSBweG1pdHByaXYtPmh3eG1pdHM7CiAJaHdlbnRyeSA9IHB4bWl0cHJpdi0+aHd4bWl0X2VudHJ5OwotCWlmIChweG1pdGJ1ZiA9PSBOVUxMKSB7CisJaWYgKCFweG1pdGJ1ZikgewogCQlweG1pdGJ1ZiA9IHI4NzEyX2FsbG9jX3htaXRidWYocHhtaXRwcml2KTsKIAkJaWYgKCFweG1pdGJ1ZikKIAkJCXJldHVybiBmYWxzZTsKQEAgLTY4Niw3ICs2ODgsOCBAQAogCQkJCXJlcyA9IHI4NzEyX3htaXRmcmFtZV9jb2FsZXNjZShwYWRhcHRlciwKIAkJCQkJcHhtaXRmcmFtZS0+cGt0LCBweG1pdGZyYW1lKTsKIAkJCS8qIGFsd2F5cyByZXR1cm4gbmRpc19wYWNrZXQgYWZ0ZXIKLQkJCSAqIHI4NzEyX3htaXRmcmFtZV9jb2FsZXNjZSAqLworCQkJICogcjg3MTJfeG1pdGZyYW1lX2NvYWxlc2NlCisJCQkgKi8KIAkJCXI4NzEyX3htaXRfY29tcGxldGUocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpOwogCQl9CiAJCWlmIChyZXMgPT0gX1NVQ0NFU1MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2NtZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9jbWQuYwppbmRleCBhZWQwM2NmLi5iN2VlNWU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2NtZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfY21kLmMKQEAgLTUxLDE0ICs1MSwxNCBAQAogI2luY2x1ZGUgIm1sbWVfb3NkZXAuaCIKIAogLyoKLUNhbGxlciBhbmQgdGhlIHI4NzEyX2NtZF90aHJlYWQgY2FuIHByb3RlY3QgY21kX3EgYnkgc3Bpbl9sb2NrLgotTm8gaXJxc2F2ZSBpcyBuZWNlc3NhcnkuCi0qLworICogQ2FsbGVyIGFuZCB0aGUgcjg3MTJfY21kX3RocmVhZCBjYW4gcHJvdGVjdCBjbWRfcSBieSBzcGluX2xvY2suCisgKiBObyBpcnFzYXZlIGlzIG5lY2Vzc2FyeS4KKyAqLwogCiBzdGF0aWMgc2ludCBfaW5pdF9jbWRfcHJpdihzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2KQogewotCXNlbWFfaW5pdCgmKHBjbWRwcml2LT5jbWRfcXVldWVfc2VtYSksIDApOwotCXNlbWFfaW5pdCgmKHBjbWRwcml2LT50ZXJtaW5hdGVfY21kdGhyZWFkX3NlbWEpLCAwKTsKKwlpbml0X2NvbXBsZXRpb24oJnBjbWRwcml2LT5jbWRfcXVldWVfY29tcCk7CisJaW5pdF9jb21wbGV0aW9uKCZwY21kcHJpdi0+dGVybWluYXRlX2NtZHRocmVhZF9jb21wKTsKIAogCV9pbml0X3F1ZXVlKCYocGNtZHByaXYtPmNtZF9xdWV1ZSkpOwogCkBAIC02NiwxMyArNjYsMTMgQEAKIAlwY21kcHJpdi0+Y21kX3NlcSA9IDE7CiAJcGNtZHByaXYtPmNtZF9hbGxvY2F0ZWRfYnVmID0ga21hbGxvYyhNQVhfQ01EU1ogKyBDTURCVUZGX0FMSUdOX1NaLAogCQkJCQkgICAgICBHRlBfQVRPTUlDKTsKLQlpZiAocGNtZHByaXYtPmNtZF9hbGxvY2F0ZWRfYnVmID09IE5VTEwpCisJaWYgKCFwY21kcHJpdi0+Y21kX2FsbG9jYXRlZF9idWYpCiAJCXJldHVybiBfRkFJTDsKIAlwY21kcHJpdi0+Y21kX2J1ZiA9IHBjbWRwcml2LT5jbWRfYWxsb2NhdGVkX2J1ZiAgKyAgQ01EQlVGRl9BTElHTl9TWiAtCiAJCQkgICAgKChhZGRyX3QpKHBjbWRwcml2LT5jbWRfYWxsb2NhdGVkX2J1ZikgJgogCQkJICAgIChDTURCVUZGX0FMSUdOX1NaIC0gMSkpOwogCXBjbWRwcml2LT5yc3BfYWxsb2NhdGVkX2J1ZiA9IGttYWxsb2MoTUFYX1JTUFNaICsgNCwgR0ZQX0FUT01JQyk7Ci0JaWYgKHBjbWRwcml2LT5yc3BfYWxsb2NhdGVkX2J1ZiA9PSBOVUxMKQorCWlmICghcGNtZHByaXYtPnJzcF9hbGxvY2F0ZWRfYnVmKQogCQlyZXR1cm4gX0ZBSUw7CiAJcGNtZHByaXYtPnJzcF9idWYgPSBwY21kcHJpdi0+cnNwX2FsbG9jYXRlZF9idWYgICsgIDQgLQogCQkJICAgICgoYWRkcl90KShwY21kcHJpdi0+cnNwX2FsbG9jYXRlZF9idWYpICYgMyk7CkBAIC04OCw3ICs4OCw3IEBACiAJcGV2dHByaXYtPmV2ZW50X3NlcSA9IDA7CiAJcGV2dHByaXYtPmV2dF9hbGxvY2F0ZWRfYnVmID0ga21hbGxvYyhNQVhfRVZUU1ogKyA0LCBHRlBfQVRPTUlDKTsKIAotCWlmIChwZXZ0cHJpdi0+ZXZ0X2FsbG9jYXRlZF9idWYgPT0gTlVMTCkKKwlpZiAoIXBldnRwcml2LT5ldnRfYWxsb2NhdGVkX2J1ZikKIAkJcmV0dXJuIF9GQUlMOwogCXBldnRwcml2LT5ldnRfYnVmID0gcGV2dHByaXYtPmV2dF9hbGxvY2F0ZWRfYnVmICArICA0IC0KIAkJCSAgICAoKGFkZHJfdCkocGV2dHByaXYtPmV2dF9hbGxvY2F0ZWRfYnVmKSAmIDMpOwpAQCAtMTEwLDIwICsxMTAsMjAgQEAKIH0KIAogLyoKLUNhbGxpbmcgQ29udGV4dDoKLQotX2VucXVldWVfY21kIGNhbiBvbmx5IGJlIGNhbGxlZCBiZXR3ZWVuIGtlcm5lbCB0aHJlYWQsCi1zaW5jZSBvbmx5IHNwaW5fbG9jayBpcyB1c2VkLgotCi1JU1IvQ2FsbC1CYWNrIGZ1bmN0aW9ucyBjYW4ndCBjYWxsIHRoaXMgc3ViLWZ1bmN0aW9uLgotCi0qLworICogQ2FsbGluZyBDb250ZXh0OgorICoKKyAqIF9lbnF1ZXVlX2NtZCBjYW4gb25seSBiZSBjYWxsZWQgYmV0d2VlbiBrZXJuZWwgdGhyZWFkLAorICogc2luY2Ugb25seSBzcGluX2xvY2sgaXMgdXNlZC4KKyAqCisgKiBJU1IvQ2FsbC1CYWNrIGZ1bmN0aW9ucyBjYW4ndCBjYWxsIHRoaXMgc3ViLWZ1bmN0aW9uLgorICoKKyAqLwogCiBzdGF0aWMgc2ludCBfZW5xdWV1ZV9jbWQoc3RydWN0ICBfX3F1ZXVlICpxdWV1ZSwgc3RydWN0IGNtZF9vYmogKm9iaikKIHsKIAl1bnNpZ25lZCBsb25nIGlycUw7CiAKLQlpZiAob2JqID09IE5VTEwpCisJaWYgKCFvYmopCiAJCXJldHVybiBfU1VDQ0VTUzsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcXVldWUtPmxvY2ssIGlycUwpOwogCWxpc3RfYWRkX3RhaWwoJm9iai0+bGlzdCwgJnF1ZXVlLT5xdWV1ZSk7CkBAIC0xNzIsNyArMTcyLDcgQEAKIAlpZiAocGNtZHByaXYtPnBhZGFwdGVyLT5lZXByb21wcml2LmJhdXRvbG9hZF9mYWlsX2ZsYWcpCiAJCXJldHVybiBfRkFJTDsKIAlyZXMgPSBfZW5xdWV1ZV9jbWQoJnBjbWRwcml2LT5jbWRfcXVldWUsIG9iaik7Ci0JdXAoJnBjbWRwcml2LT5jbWRfcXVldWVfc2VtYSk7CisJY29tcGxldGUoJnBjbWRwcml2LT5jbWRfcXVldWVfY29tcCk7CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtMTgxLDcgKzE4MSw3IEBACiAJdW5zaWduZWQgbG9uZyBpcnFMOwogCXN0cnVjdCAgX19xdWV1ZSAqcXVldWU7CiAKLQlpZiAob2JqID09IE5VTEwpCisJaWYgKCFvYmopCiAJCXJldHVybiBfU1VDQ0VTUzsKIAlpZiAocGNtZHByaXYtPnBhZGFwdGVyLT5lZXByb21wcml2LmJhdXRvbG9hZF9mYWlsX2ZsYWcpCiAJCXJldHVybiBfRkFJTDsKQEAgLTE4OSw3ICsxODksNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZS0+bG9jaywgaXJxTCk7CiAJbGlzdF9hZGRfdGFpbCgmb2JqLT5saXN0LCAmcXVldWUtPnF1ZXVlKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZS0+bG9jaywgaXJxTCk7Ci0JdXAoJnBjbWRwcml2LT5jbWRfcXVldWVfc2VtYSk7CisJY29tcGxldGUoJnBjbWRwcml2LT5jbWRfcXVldWVfY29tcCk7CiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCkBAIC0yMTEsMTEgKzIxMSwxMSBAQAogfQogCiAvKgotcjg3MTJfc2l0ZXN1cnZleV9jbWQofikKLQkjIyMgTk9URTojIyMjICghISEhKQotCU1VU1QgVEFLRSBDQVJFIFRIQVQgQkVGT1JFIENBTExJTkcgVEhJUyBGVU5DLAotCSBZT1UgU0hPVUxEIEhBVkUgTE9DS0VEIHBtbG1lcHJpdi0+bG9jawotKi8KKyAqCXI4NzEyX3NpdGVzdXJ2ZXlfY21kKH4pCisgKgkJIyMjIE5PVEU6IyMjIyAoISEhISkKKyAqCQlNVVNUIFRBS0UgQ0FSRSBUSEFUIEJFRk9SRSBDQUxMSU5HIFRISVMgRlVOQywKKyAqCQlZT1UgU0hPVUxEIEhBVkUgTE9DS0VEIHBtbG1lcHJpdi0+bG9jaworICovCiB1OCByODcxMl9zaXRlc3VydmV5X2NtZChzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyLAogCQkJc3RydWN0IG5kaXNfODAyXzExX3NzaWQgKnBzc2lkKQogewpAQCAtNDc3LDcgKzQ3Nyw3IEBACiAJCX0KIAl9CiAJcHNlY25ldHdvcmsgPSAmcHNlY3VyaXR5cHJpdi0+c2VjX2JzczsKLQlpZiAocHNlY25ldHdvcmsgPT0gTlVMTCkgeworCWlmICghcHNlY25ldHdvcmspIHsKIAkJa2ZyZWUocGNtZCk7CiAJCXJldHVybiBfRkFJTDsKIAl9CkBAIC00OTEsOCArNDkxLDkgQEAKIAkJbWVtY3B5KCZwc2VjdXJpdHlwcml2LT5hdXRoZW50aWNhdG9yX2llWzFdLAogCQkJJnBzZWNuZXR3b3JrLT5JRXNbMTJdLCAoMjU2IC0gMSkpOwogCXBzZWNuZXR3b3JrLT5JRUxlbmd0aCA9IDA7Ci0JLyogSWYgdGhlIGRyaXZlciB3YW50cyB0byB1c2UgdGhlIGJzc2lkIHRvIGNyZWF0ZSB0aGUgY29ubmVjdGlvbi4KLQkgKiBJZiBub3QsICB3ZSBjb3B5IHRoZSBjb25uZWN0aW5nIEFQJ3MgTUFDIGFkZHJlc3MgdG8gaXQgc28gdGhhdAorCS8qCisJICogSWYgdGhlIGRyaXZlciB3YW50cyB0byB1c2UgdGhlIGJzc2lkIHRvIGNyZWF0ZSB0aGUgY29ubmVjdGlvbi4KKwkgKiBJZiBub3QsIHdlIGNvcHkgdGhlIGNvbm5lY3RpbmcgQVAncyBNQUMgYWRkcmVzcyB0byBpdCBzbyB0aGF0CiAJICogdGhlIGRyaXZlciBqdXN0IGhhcyB0aGUgYnNzaWQgaW5mb3JtYXRpb24gZm9yIFBNS0lETGlzdCBzZWFyY2hpbmcuCiAJICovCiAJaWYgKCFwbWxtZXByaXYtPmFzc29jX2J5X2Jzc2lkKQpAQCAtNTE5LDcgKzUyMCw4IEBACiAJCX0KIAl9CiAJaWYgKHByZWdpc3RyeXByaXYtPmh0X2VuYWJsZSkgewotCQkvKiBGb3IgV0VQIG1vZGUsIHdlIHdpbGwgdXNlIHRoZSBiZyBtb2RlIHRvIGRvIHRoZSBjb25uZWN0aW9uCisJCS8qCisJCSAqIEZvciBXRVAgbW9kZSwgd2Ugd2lsbCB1c2UgdGhlIGJnIG1vZGUgdG8gZG8gdGhlIGNvbm5lY3Rpb24KIAkJICogdG8gYXZvaWQgc29tZSBJT1QgaXNzdWVzLCBlc3BlY2lhbGx5IGZvciBSZWFsdGVrIDgxOTJ1CiAJCSAqIFNvZnRBUC4KIAkJICovCkBAIC04ODIsMTYgKzg4NCwxNiBAQAogCQlpZiAoIXBzdGEpIHsKIAkJCXBzdGEgPSByODcxMl9hbGxvY19zdGFpbmZvKCZwYWRhcHRlci0+c3RhcHJpdiwKIAkJCQkJCSAgIHBuZXR3b3JrLT5NYWNBZGRyZXNzKTsKLQkJCWlmIChwc3RhID09IE5VTEwpCisJCQlpZiAoIXBzdGEpCiAJCQkJZ290byBjcmVhdGVic3NfY21kX2ZhaWw7CiAJCX0KIAkJcjg3MTJfaW5kaWNhdGVfY29ubmVjdChwYWRhcHRlcik7CiAJfSBlbHNlIHsKIAkJcHdsYW4gPSBfcjg3MTJfYWxsb2NfbmV0d29yayhwbWxtZXByaXYpOwotCQlpZiAocHdsYW4gPT0gTlVMTCkgeworCQlpZiAoIXB3bGFuKSB7CiAJCQlwd2xhbiA9IHI4NzEyX2dldF9vbGRlc3Rfd2xhbl9uZXR3b3JrKAogCQkJCSZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUpOwotCQkJaWYgKHB3bGFuID09IE5VTEwpCisJCQlpZiAoIXB3bGFuKQogCQkJCWdvdG8gY3JlYXRlYnNzX2NtZF9mYWlsOwogCQkJcHdsYW4tPmxhc3Rfc2Nhbm5lZCA9IGppZmZpZXM7CiAJCX0gZWxzZQpAQCAtOTA0LDggKzkwNiwxMCBAQAogCQkJKHI4NzEyX2dldF93bGFuX2Jzc2lkX2V4X3N6KHBuZXR3b3JrKSkpOwogCQlpZiAocG1sbWVwcml2LT5md19zdGF0ZSAmIF9GV19VTkRFUl9MSU5LSU5HKQogCQkJcG1sbWVwcml2LT5md19zdGF0ZSBePSBfRldfVU5ERVJfTElOS0lORzsKLQkJLyogd2Ugd2lsbCBzZXQgX0ZXX0xJTktFRCB3aGVuIHRoZXJlIGlzIG9uZSBtb3JlIHNhdCB0bwotCQkgKiBqb2luIHVzIChzdGFzc29jX2V2ZW50X2NhbGxiYWNrKSAqLworCQkvKgorCQkgKiB3ZSB3aWxsIHNldCBfRldfTElOS0VEIHdoZW4gdGhlcmUgaXMgb25lIG1vcmUgc2F0IHRvCisJCSAqIGpvaW4gdXMgKHN0YXNzb2NfZXZlbnRfY2FsbGJhY2spCisJCSAqLwogCX0KIGNyZWF0ZWJzc19jbWRfZmFpbDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbWxtZXByaXYtPmxvY2ssIGlycUwpOwpAQCAtOTIxLDcgKzkyNSw3IEBACiAJc3RydWN0IHN0YV9pbmZvICpwc3RhID0gcjg3MTJfZ2V0X3N0YWluZm8ocHN0YXByaXYsCiAJCQkJCQkgIHBzZXRzdGFrZXlfcnNwLT5hZGRyKTsKIAotCWlmIChwc3RhID09IE5VTEwpCisJaWYgKCFwc3RhKQogCQlnb3RvIGV4aXQ7CiAJcHN0YS0+YWlkID0gcHN0YS0+bWFjX2lkID0gcHNldHN0YWtleV9yc3AtPmtleWlkOyAvKkNBTV9JRChDQU1fRU5UUlkpKi8KIGV4aXQ6CkBAIC05NDEsNyArOTQ1LDcgQEAKIAlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSByODcxMl9nZXRfc3RhaW5mbyhwc3RhcHJpdiwKIAkJCQkJCSAgcGFzc29jc3RhX3Bhcm0tPmFkZHIpOwogCi0JaWYgKHBzdGEgPT0gTlVMTCkKKwlpZiAoIXBzdGEpCiAJCXJldHVybjsKIAlwc3RhLT5haWQgPSBwc3RhLT5tYWNfaWQgPSBwYXNzb2NzdGFfcnNwLT5jYW1faWQ7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBtbG1lcHJpdi0+bG9jaywgaXJxTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2NtZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9jbWQuaAppbmRleCBlNGEyYTUwLi4zMjg0ZGNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2NtZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfY21kLmgKQEAgLTUwLDggKzUwLDggQEAKIH07CiAKIHN0cnVjdCBjbWRfcHJpdiB7Ci0Jc3RydWN0IHNlbWFwaG9yZSBjbWRfcXVldWVfc2VtYTsKLQlzdHJ1Y3Qgc2VtYXBob3JlIHRlcm1pbmF0ZV9jbWR0aHJlYWRfc2VtYTsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjbWRfcXVldWVfY29tcDsKKwlzdHJ1Y3QgY29tcGxldGlvbiB0ZXJtaW5hdGVfY21kdGhyZWFkX2NvbXA7CiAJc3RydWN0ICBfX3F1ZXVlCWNtZF9xdWV1ZTsKIAl1OCBjbWRfc2VxOwogCXU4ICpjbWRfYnVmOwkvKnNoYWxsIGJlIG5vbi1wYWdlZCwgYW5kIDQgYnl0ZXMgYWxpZ25lZCovCkBAIC0xODUsMTAgKzE4NSwxMiBAQAogICovCiBzdHJ1Y3Qgc2V0a2V5X3Bhcm0gewogCXU4CWFsZ29yaXRobTsJLyogZW5jcnlwdGlvbiBhbGdvcml0aG0sIGNvdWxkIGJlIG5vbmUsIHdlcDQwLAotCQkJCSAqIFRLSVAsIENDTVAsIHdlcDEwNCAqLworCQkJCSAqIFRLSVAsIENDTVAsIHdlcDEwNAorCQkJCSAqLwogCXU4CWtleWlkOwogCXU4CWdycGtleTsJCS8qIDE6IHRoaXMgaXMgdGhlIGdycGtleSBmb3IgODAyLjF4LgotCQkJCSAqIDA6IHRoaXMgaXMgdGhlIHVuaWNhc3Qga2V5IGZvciA4MDIuMXggKi8KKwkJCQkgKiAwOiB0aGlzIGlzIHRoZSB1bmljYXN0IGtleSBmb3IgODAyLjF4CisJCQkJICovCiAJdTgJa2V5WzE2XTsJLyogdGhpcyBjb3VsZCBiZSA0MCBvciAxMDQgKi8KIH07CiAKQEAgLTIxNSwxNSArMjE3LDE1IEBACiB9OwogCiAvKgotQ2FsbGVyIEFkLUhvYy9BUAotCi1Db21tYW5kIC1Sc3AoQUlEID09IENBTUlEKSBtb2RlCi0KLVRoaXMgaXMgdG8gZm9yY2UgZncgdG8gYWRkIGFuIHN0YV9kYXRhIGVudHJ5IHBlciBkcml2ZXIncyByZXF1ZXN0LgotCi1GVyB3aWxsIHdyaXRlIGFuIGNhbSBlbnRyeSBhc3NvY2lhdGVkIHdpdGggaXQuCi0KLSovCisgKglDYWxsZXIgQWQtSG9jL0FQCisgKgorICoJQ29tbWFuZCAtUnNwKEFJRCA9PSBDQU1JRCkgbW9kZQorICoKKyAqCVRoaXMgaXMgdG8gZm9yY2UgZncgdG8gYWRkIGFuIHN0YV9kYXRhIGVudHJ5IHBlciBkcml2ZXIncyByZXF1ZXN0LgorICoKKyAqCUZXIHdpbGwgd3JpdGUgYW4gY2FtIGVudHJ5IGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAqCisgKi8KIHN0cnVjdCBzZXRfYXNzb2NzdGFfcGFybSB7CiAJdTgJYWRkcltFVEhfQUxFTl07CiB9OwpAQCAtMjM0LDI3ICsyMzYsMjcgQEAKIH07CiAKIC8qCi0JQ2FsbGVyIEFkLUhvYy9BUAotCi0JQ29tbWFuZCBtb2RlCi0KLQlUaGlzIGlzIHRvIGZvcmNlIGZ3IHRvIGRlbCBhbiBzdGFfZGF0YSBlbnRyeSBwZXIgZHJpdmVyJ3MgcmVxdWVzdAotCi0JRlcgd2lsbCBpbnZhbGlkYXRlIHRoZSBjYW0gZW50cnkgYXNzb2NpYXRlZCB3aXRoIGl0LgotCi0qLworICoJQ2FsbGVyIEFkLUhvYy9BUAorICoKKyAqCUNvbW1hbmQgbW9kZQorICoKKyAqCVRoaXMgaXMgdG8gZm9yY2UgZncgdG8gZGVsIGFuIHN0YV9kYXRhIGVudHJ5IHBlciBkcml2ZXIncyByZXF1ZXN0CisgKgorICoJRlcgd2lsbCBpbnZhbGlkYXRlIHRoZSBjYW0gZW50cnkgYXNzb2NpYXRlZCB3aXRoIGl0LgorICoKKyAqLwogc3RydWN0IGRlbF9hc3NvY3N0YV9wYXJtIHsKIAl1OAlhZGRyW0VUSF9BTEVOXTsKIH07CiAKIC8qCi1DYWxsZXIgTW9kZTogQVAvQWQtSG9DKE0pCi0KLU5vdGVzOiBUbyBub3RpZnkgZncgdGhhdCBnaXZlbiBzdGFpZCBoYXMgY2hhbmdlZCBpdHMgcG93ZXIgc3RhdGUKLQotQ29tbWFuZCBNb2RlCi0KLSovCisgKglDYWxsZXIgTW9kZTogQVAvQWQtSG9DKE0pCisgKgorICoJTm90ZXM6IFRvIG5vdGlmeSBmdyB0aGF0IGdpdmVuIHN0YWlkIGhhcyBjaGFuZ2VkIGl0cyBwb3dlciBzdGF0ZQorICoKKyAqCUNvbW1hbmQgTW9kZQorICoKKyAqLwogc3RydWN0IHNldHN0YXB3cnN0YXRlX3Bhcm0gewogCXU4CXN0YWlkOwogCXU4CXN0YXR1czsKQEAgLTI2MiwyNSArMjY0LDI1IEBACiB9OwogCiAvKgotQ2FsbGVyIE1vZGU6IEFueQotCi1Ob3RlczogVG8gc2V0dXAgdGhlIGJhc2ljIHJhdGUgb2YgUlRMODcxMQotCi1Db21tYW5kIE1vZGUKLQotKi8KKyAqCUNhbGxlciBNb2RlOiBBbnkKKyAqCisgKglOb3RlczogVG8gc2V0dXAgdGhlIGJhc2ljIHJhdGUgb2YgUlRMODcxMQorICoKKyAqCUNvbW1hbmQgTW9kZQorICoKKyAqLwogc3RydWN0CXNldGJhc2ljcmF0ZV9wYXJtIHsKIAl1OAliYXNpY3JhdGVzW051bVJhdGVzXTsKIH07CiAKIC8qCi1DYWxsZXIgTW9kZTogQW55Ci0KLU5vdGVzOiBUbyByZWFkIHRoZSBjdXJyZW50IGJhc2ljIHJhdGUKLQotQ29tbWFuZC1Sc3AgTW9kZQotCi0qLworICoJQ2FsbGVyIE1vZGU6IEFueQorICoKKyAqCU5vdGVzOiBUbyByZWFkIHRoZSBjdXJyZW50IGJhc2ljIHJhdGUKKyAqCisgKglDb21tYW5kLVJzcCBNb2RlCisgKgorICovCiBzdHJ1Y3QgZ2V0YmFzaWNyYXRlX3Bhcm0gewogCXUzMiByc3ZkOwogfTsKQEAgLTI5MCwxMyArMjkyLDEzIEBACiB9OwogCiAvKgotQ2FsbGVyIE1vZGU6IEFueQotCi1Ob3RlczogVG8gc2V0dXAgdGhlIGRhdGEgcmF0ZSBvZiBSVEw4NzExCi0KLUNvbW1hbmQgTW9kZQotCi0qLworICoJQ2FsbGVyIE1vZGU6IEFueQorICoKKyAqCU5vdGVzOiBUbyBzZXR1cCB0aGUgZGF0YSByYXRlIG9mIFJUTDg3MTEKKyAqCisgKglDb21tYW5kIE1vZGUKKyAqCisgKi8KIHN0cnVjdCBzZXRkYXRhcmF0ZV9wYXJtIHsKIAl1OAltYWNfaWQ7CiAJdTgJZGF0YXJhdGVzW051bVJhdGVzXTsKQEAgLTMzMiwxMyArMzM0LDEzIEBACiB9OwogCiAvKgotQ2FsbGVyIE1vZGU6IEFueQotCi1Ob3RlczogVG8gcmVhZCB0aGUgY3VycmVudCBkYXRhIHJhdGUKLQotQ29tbWFuZC1Sc3AgTW9kZQotCi0qLworICoJQ2FsbGVyIE1vZGU6IEFueQorICoKKyAqCU5vdGVzOiBUbyByZWFkIHRoZSBjdXJyZW50IGRhdGEgcmF0ZQorICoKKyAqCUNvbW1hbmQtUnNwIE1vZGUKKyAqCisgKi8KIHN0cnVjdCBnZXRkYXRhcmF0ZV9wYXJtIHsKIAl1MzIgcnN2ZDsKIApAQCAtMzQ5LDM2ICszNTEsMzYgQEAKIAogCiAvKgotQ2FsbGVyIE1vZGU6IEFueQotQVA6IEFQIGNhbiB1c2UgdGhlIGluZm8gZm9yIHRoZSBjb250ZW50cyBvZiBiZWFjb24gZnJhbWUKLUluZnJhOiBTVEEgY2FuIHVzZSB0aGUgaW5mbyB3aGVuIHNpdGVzdXJ2ZXlpbmcKLUFkLUhvQyhNKTogTGlrZSBBUAotQWQtSG9DKEMpOiBMaWtlIFNUQQotCi0KLU5vdGVzOiBUbyBzZXQgdGhlIHBoeSBjYXBhYmlsaXR5IG9mIHRoZSBOSUMKLQotQ29tbWFuZCBNb2RlCi0KLSovCisgKglDYWxsZXIgTW9kZTogQW55CisgKglBUDogQVAgY2FuIHVzZSB0aGUgaW5mbyBmb3IgdGhlIGNvbnRlbnRzIG9mIGJlYWNvbiBmcmFtZQorICoJSW5mcmE6IFNUQSBjYW4gdXNlIHRoZSBpbmZvIHdoZW4gc2l0ZXN1cnZleWluZworICoJQWQtSG9DKE0pOiBMaWtlIEFQCisgKglBZC1Ib0MoQyk6IExpa2UgU1RBCisgKgorICoKKyAqCU5vdGVzOiBUbyBzZXQgdGhlIHBoeSBjYXBhYmlsaXR5IG9mIHRoZSBOSUMKKyAqCisgKglDb21tYW5kIE1vZGUKKyAqCisgKi8KIAogLyoKLUNhbGxlciBNb2RlOiBBbnkKLQotTm90ZXM6IFRvIHNldCB0aGUgY2hhbm5lbC9tb2RlbS9iYW5kCi1UaGlzIGNvbW1hbmQgd2lsbCBiZSB1c2VkIHdoZW4gY2hhbm5lbC9tb2RlbS9iYW5kIGlzIGNoYW5nZWQuCi0KLUNvbW1hbmQgTW9kZQotCi0qLworICoJQ2FsbGVyIE1vZGU6IEFueQorICoKKyAqCU5vdGVzOiBUbyBzZXQgdGhlIGNoYW5uZWwvbW9kZW0vYmFuZAorICoJVGhpcyBjb21tYW5kIHdpbGwgYmUgdXNlZCB3aGVuIGNoYW5uZWwvbW9kZW0vYmFuZCBpcyBjaGFuZ2VkLgorICoKKyAqCUNvbW1hbmQgTW9kZQorICoKKyAqLwogLyoKLUNhbGxlciBNb2RlOiBBbnkKLQotTm90ZXM6IFRvIGdldCB0aGUgY3VycmVudCBzZXR0aW5nIG9mIGNoYW5uZWwvbW9kZW0vYmFuZAotCi1Db21tYW5kLVJzcCBNb2RlCi0KLSovCisgKglDYWxsZXIgTW9kZTogQW55CisgKgorICoJTm90ZXM6IFRvIGdldCB0aGUgY3VycmVudCBzZXR0aW5nIG9mIGNoYW5uZWwvbW9kZW0vYmFuZAorICoKKyAqCUNvbW1hbmQtUnNwIE1vZGUKKyAqCisgKi8KIHN0cnVjdAlnZXRwaHlfcnNwIHsKIAl1OAlyZmNoYW5uZWw7CiAJdTgJbW9kZW07CkBAIC00MjgsNTggKzQzMCw1OCBAQAogfTsKIAogLyoKLQlOb3RlczogVGhpcyBjb21tYW5kIGlzIHVzZWQgZm9yIEgyQy9DMkggbG9vcGJhY2sgdGVzdGluZwotCi0JbWFjWzBdID09IDAKLQk9PT4gQ01EIG1vZGUsIHJldHVybiBIMkNfU1VDQ0VTUy4KLQlUaGUgZm9sbG93aW5nIGNvbmRpdGlvbiBtdXN0IGJlIHR1cmUgdW5kZXIgQ01EIG1vZGUKLQkJbWFjWzFdID09IG1hY1s0XSwgbWFjWzJdID09IG1hY1szXSwgbWFjWzBdPW1hY1s1XT0gMDsKLQkJczAgPT0gMHgxMjM0LCBzMSA9PSAweGFiY2QsIHcwID09IDB4Nzg1NjM0MTIsIHcxID09IDB4NWFhNWRlZjc7Ci0JCXMyID09IChiMSA8PCA4IHwgYjApOwotCi0JbWFjWzBdID09IDEKLQk9PT4gQ01EX1JTUCBtb2RlLCByZXR1cm4gSDJDX1NVQ0NFU1NfUlNQCi0KLQlUaGUgcnNwIGxheW91dCBzaGFsbCBiZToKLQlyc3A6CQkJcGFybToKLQkJbWFjWzBdICA9ICAgbWFjWzVdOwotCQltYWNbMV0gID0gICBtYWNbNF07Ci0JCW1hY1syXSAgPSAgIG1hY1szXTsKLQkJbWFjWzNdICA9ICAgbWFjWzJdOwotCQltYWNbNF0gID0gICBtYWNbMV07Ci0JCW1hY1s1XSAgPSAgIG1hY1swXTsKLQkJczAJCT0gICBzMTsKLQkJczEJCT0gICBzd2FwMTYoczApOwotCQl3MAkJPQlzd2FwMzIodzEpOwotCQliMAkJPQliMQotCQlzMgkJPQlzMCArIHMxCi0JCWIxCQk9CWIwCi0JCXcxCQk9CXcwCi0KLQltYWNbMF0gPT0JMgotCT09PiBDTURfRVZFTlQgbW9kZSwgcmV0dXJuCUgyQ19TVUNDRVNTCi0JVGhlIGV2ZW50IGxheW91dCBzaGFsbCBiZToKLQlldmVudDoJICAgICBwYXJtOgotCW1hY1swXSAgPSAgIG1hY1s1XTsKLQltYWNbMV0gID0gICBtYWNbNF07Ci0JbWFjWzJdICA9ICAgZXZlbnQncyBzZXF1ZW5jZSBudW1iZXIsIHN0YXJ0aW5nIGZyb20gMSB0byBwYXJtJ3MgbWFyY1szXQotCW1hY1szXSAgPSAgIG1hY1syXTsKLQltYWNbNF0gID0gICBtYWNbMV07Ci0JbWFjWzVdICA9ICAgbWFjWzBdOwotCXMwCQk9ICAgc3dhcDE2KHMwKSAtIGV2ZW50Lm1hY1syXTsKLQlzMQkJPSAgIHMxICsgZXZlbnQubWFjWzJdOwotCXcwCQk9CXN3YXAzMih3MCk7Ci0JYjAJCT0JYjEKLQlzMgkJPQlzMCArIGV2ZW50Lm1hY1syXQotCWIxCQk9CWIwCi0JdzEJCT0Jc3dhcDMyKHcxKSAtIGV2ZW50Lm1hY1syXTsKLQotCXBhcm0tPm1hY1szXSBpcyB0aGUgdG90YWwgZXZlbnQgY291bnRzIHRoYXQgaG9zdCByZXF1ZXN0ZWQuCi0KLQotCWV2ZW50IHdpbGwgYmUgdGhlIHNhbWUgd2l0aCB0aGUgY21kJ3MgcGFyYW0uCi0KLSovCisgKglOb3RlczogVGhpcyBjb21tYW5kIGlzIHVzZWQgZm9yIEgyQy9DMkggbG9vcGJhY2sgdGVzdGluZworICoKKyAqCW1hY1swXSA9PSAwCisgKgk9PT4gQ01EIG1vZGUsIHJldHVybiBIMkNfU1VDQ0VTUy4KKyAqCVRoZSBmb2xsb3dpbmcgY29uZGl0aW9uIG11c3QgYmUgdHVyZSB1bmRlciBDTUQgbW9kZQorICoJCW1hY1sxXSA9PSBtYWNbNF0sIG1hY1syXSA9PSBtYWNbM10sIG1hY1swXT1tYWNbNV09IDA7CisgKgkJczAgPT0gMHgxMjM0LCBzMSA9PSAweGFiY2QsIHcwID09IDB4Nzg1NjM0MTIsIHcxID09IDB4NWFhNWRlZjc7CisgKgkJczIgPT0gKGIxIDw8IDggfCBiMCk7CisgKgorICoJbWFjWzBdID09IDEKKyAqCT09PiBDTURfUlNQIG1vZGUsIHJldHVybiBIMkNfU1VDQ0VTU19SU1AKKyAqCisgKglUaGUgcnNwIGxheW91dCBzaGFsbCBiZToKKyAqCXJzcDoJCQlwYXJtOgorICoJCW1hY1swXSAgPSAgIG1hY1s1XTsKKyAqCQltYWNbMV0gID0gICBtYWNbNF07CisgKgkJbWFjWzJdICA9ICAgbWFjWzNdOworICoJCW1hY1szXSAgPSAgIG1hY1syXTsKKyAqCQltYWNbNF0gID0gICBtYWNbMV07CisgKgkJbWFjWzVdICA9ICAgbWFjWzBdOworICoJCXMwCQk9ICAgczE7CisgKgkJczEJCT0gICBzd2FwMTYoczApOworICoJCXcwCQk9CXN3YXAzMih3MSk7CisgKgkJYjAJCT0JYjEKKyAqCQlzMgkJPQlzMCArIHMxCisgKgkJYjEJCT0JYjAKKyAqCQl3MQkJPQl3MAorICoKKyAqCW1hY1swXSA9PQkyCisgKgk9PT4gQ01EX0VWRU5UIG1vZGUsIHJldHVybglIMkNfU1VDQ0VTUworICoJVGhlIGV2ZW50IGxheW91dCBzaGFsbCBiZToKKyAqCWV2ZW50OgkgICAgIHBhcm06CisgKgltYWNbMF0gID0gICBtYWNbNV07CisgKgltYWNbMV0gID0gICBtYWNbNF07CisgKgltYWNbMl0gID0gICBldmVudCdzIHNlcXVlbmNlIG51bWJlciwgc3RhcnRpbmcgZnJvbSAxIHRvIHBhcm0ncyBtYXJjWzNdCisgKgltYWNbM10gID0gICBtYWNbMl07CisgKgltYWNbNF0gID0gICBtYWNbMV07CisgKgltYWNbNV0gID0gICBtYWNbMF07CisgKglzMAkJPSAgIHN3YXAxNihzMCkgLSBldmVudC5tYWNbMl07CisgKglzMQkJPSAgIHMxICsgZXZlbnQubWFjWzJdOworICoJdzAJCT0Jc3dhcDMyKHcwKTsKKyAqCWIwCQk9CWIxCisgKglzMgkJPQlzMCArIGV2ZW50Lm1hY1syXQorICoJYjEJCT0JYjAKKyAqCXcxCQk9CXN3YXAzMih3MSkgLSBldmVudC5tYWNbMl07CisgKgorICoJcGFybS0+bWFjWzNdIGlzIHRoZSB0b3RhbCBldmVudCBjb3VudHMgdGhhdCBob3N0IHJlcXVlc3RlZC4KKyAqCisgKgorICoJZXZlbnQgd2lsbCBiZSB0aGUgc2FtZSB3aXRoIHRoZSBjbWQncyBwYXJhbS4KKyAqCisgKi8KIAogLyogQ01EIHBhcmFtIEZvcm1hcnQgZm9yIERSViBJTlRFUk5BTCBDTUQgSERMKi8KIHN0cnVjdCBkcnZpbnRfY21kX3Bhcm0gewpAQCAtNTcwLDcgKzU3Miw4IEBACiAJdTgJYmNuX3J4X2VuOwogCXU4CWJjbl9wYXNzX2NudDsJICAvKiBmdyByZXBvcnQgb25lIGJlYWNvbiBpbmZvcm1hdGlvbiB0bwogCQkJCSAgICogZHJpdmVyICB3aGVuIGl0IHJlY2VpdmVzIGJjbl9wYXNzX2NudAotCQkJCSAgICogIGJlYWNvbnMuICovCisJCQkJICAgKiBiZWFjb25zLgorCQkJCSAgICovCiAJdTgJYmNuX3RvOwkJICAvKiBiZWFjb24gVE8gKG1zKS4gwqHCpz0wwqHCqCBubyBsaW1pdC4qLwogCXUxNgliY25faXR2OwogCXU4CWFwcF9pdHY7IC8qIG9ubHkgZm9yIFZPSVAgbW9kZS4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaHQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaHQuaAppbmRleCA0MTg3MmQ5Li41MTNmNDU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2h0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9odC5oCkBAIC0zNiw3ICszNiw4IEBACiAJdW5zaWduZWQgaW50CXR4X2Ftc2R1X2VuYWJsZTsvKmZvciBlbmFibGUgVHggQS1NU0RVICovCiAJdW5zaWduZWQgaW50CXR4X2FtZHN1X21heGxlbjsgLyogMTogOGssIDA6NGsgOyBkZWZhdWx0OjhrLCBmb3IgdHggKi8KIAl1bnNpZ25lZCBpbnQJcnhfYW1wZHVfbWF4bGVuOyAvKiBmb3IgcnggcmVvcmRlcmluZyBjdHJsIHdpbl9zeiwKLQkJCQkJICAqICB1cGRhdGVkIHdoZW4gam9pbl9jYWxsYmFjay4gKi8KKwkJCQkJICAqIHVwZGF0ZWQgd2hlbiBqb2luX2NhbGxiYWNrLgorCQkJCQkgICovCiAJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgaHRfY2FwOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9pb2N0bC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9pb2N0bC5oCmluZGV4IGM5MjE4YmUuLjA4YmNiM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaW9jdGwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2lvY3RsLmgKQEAgLTY4LDcgKzY4LDggQEAKIAogc3RydWN0IG9pZF9vYmpfcHJpdiB7CiAJdW5zaWduZWQgY2hhcglkYmc7IC8qIDA6IHdpdGhvdXQgT0lEIGRlYnVnIG1lc3NhZ2UKLQkJCSAgICAgICogMTogd2l0aCBPSUQgZGVidWcgbWVzc2FnZSAqLworCQkJICAgICAgKiAxOiB3aXRoIE9JRCBkZWJ1ZyBtZXNzYWdlCisJCQkgICAgICAqLwogCXVpbnQgKCpvaWRmdW5zKShzdHJ1Y3Qgb2lkX3Bhcl9wcml2ICpwb2lkX3Bhcl9wcml2KTsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaW9jdGxfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaW9jdGxfbGludXguYwppbmRleCBlMjA1YWRmLi40NzVlNzkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2lvY3RsX2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9pb2N0bF9saW51eC5jCkBAIC0xOTc2LDkgKzE5NzYsOSBAQAogCWlmIChwZGF0YS0+bGVuZ3RoID49IDMyKSB7CiAJCWlmIChjb3B5X2Zyb21fdXNlcihkYXRhLCBwZGF0YS0+cG9pbnRlciwgMzIpKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICAgICAgZGF0YVszMl0gPSAwOworCQlkYXRhWzMyXSA9IDA7CiAJfSBlbHNlIHsKLQkJIHJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJc3Bpbl9sb2NrX2lycXNhdmUoJihwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayksIGlycUwpOwogCXBoZWFkID0gJnF1ZXVlLT5xdWV1ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaW9jdGxfc2V0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2lvY3RsX3NldC5jCmluZGV4IDU2NzYwY2QuLjBhYWYyYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaW9jdGxfc2V0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9pb2N0bF9zZXQuYwpAQCAtMTQwLDcgKzE0MCw4IEBACiAJCSAgICBFVEhfQUxFTikpIHsKIAkJCWlmICghY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkpCiAJCQkJZ290byBfQWJvcnRfU2V0X0JTU0lEOyAvKiBkcml2ZXIgaXMgaW4KLQkJCQkJCSogV0lGSV9BREhPQ19NQVNURVJfU1RBVEUgKi8KKwkJCQkJCSogV0lGSV9BREhPQ19NQVNURVJfU1RBVEUKKwkJCQkJCSovCiAJCX0gZWxzZSB7CiAJCQlyODcxMl9kaXNhc3NvY19jbWQocGFkYXB0ZXIpOwogCQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkKQEAgLTIwMyw3ICsyMDQsOCBAQAogCQkJCQl9CiAJCQkJfSBlbHNlIHsKIAkJCQkJZ290byBfQWJvcnRfU2V0X1NTSUQ7IC8qIGRyaXZlciBpcyBpbgotCQkJCQkJICAqIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFICovCisJCQkJCQkqIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFCisJCQkJCQkqLwogCQkJCX0KIAkJCX0KIAkJfSBlbHNlIHsKQEAgLTI1NCwxMiArMjU2LDE0IEBACiAJCSAgICAoKnBvbGRfc3RhdGUgPT0gTmRpczgwMl8xMUlCU1MpKSB7CiAJCQkvKiB3aWxsIGNsciBMaW5rZWRfc3RhdGUgYmVmb3JlIHRoaXMgZnVuY3Rpb24sCiAJCQkgKiB3ZSBtdXN0IGhhdmUgY2hlY2tlZCB3aGV0aGVyIGlzc3VlIGRpcy1hc3NvY19jbWQgb3IKLQkJCSAqIG5vdCAqLworCQkJICogbm90CisJCQkgKi8KIAkJCXI4NzEyX2luZF9kaXNjb25uZWN0KHBhZGFwdGVyKTsKIAkJfQogCQkqcG9sZF9zdGF0ZSA9IG5ldHdvcmt0eXBlOwogCQkvKiBjbGVhciBXSUZJX1NUQVRJT05fU1RBVEU7IFdJRklfQVBfU1RBVEU7IFdJRklfQURIT0NfU1RBVEU7Ci0JCSAqIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFICovCisJCSAqIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFCisJCSAqLwogCQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFIHwgV0lGSV9BUF9TVEFURSB8CiAJCQkgICAgICBXSUZJX0FESE9DX1NUQVRFIHwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpOwogCQlzd2l0Y2ggKG5ldHdvcmt0eXBlKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2xlZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9sZWQuaAppbmRleCBlYjYxMjA1Li5hZGZiYzQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2xlZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbGVkLmgKQEAgLTcyLDE0ICs3MiwxNyBAQAogCVNXX0xFRF9NT0RFMCwgLyogU1cgY29udHJvbCAxIExFRCB2aWEgR1BJTzAuIEl0IGlzIGRlZmF1bHQgb3B0aW9uLiAqLwogCVNXX0xFRF9NT0RFMSwgLyogMiBMRURzLCB0aHJvdWdoIExFRDAgYW5kIExFRDEuIEZvciBBTFBIQS4gKi8KIAlTV19MRURfTU9ERTIsIC8qIFNXIGNvbnRyb2wgMSBMRUQgdmlhIEdQSU8wLAotCQkgICAgICAgKiBjdXN0b20gZm9yIEF6V2F2ZSA4MTg3IG1pbmljYXJkLiAqLworCQkgICAgICAgKiBjdXN0b20gZm9yIEF6V2F2ZSA4MTg3IG1pbmljYXJkLgorCQkgICAgICAgKi8KIAlTV19MRURfTU9ERTMsIC8qIFNXIGNvbnRyb2wgMSBMRUQgdmlhIEdQSU8wLAotCQkgICAgICAgKiAgY3VzdG9taXplZCBmb3IgU2VyY29tbSBQcmludGVyIFNlcnZlciBjYXNlLiovCisJCSAgICAgICAqIGN1c3RvbWl6ZWQgZm9yIFNlcmNvbW0gUHJpbnRlciBTZXJ2ZXIgY2FzZS4KKwkJICAgICAgICovCiAJU1dfTEVEX01PREU0LCAvKmZvciBFZGltYXggLyBCZWxraW4qLwogCVNXX0xFRF9NT0RFNSwgLypmb3IgU2VyY29tbSAvIEJlbGtpbiovCiAJU1dfTEVEX01PREU2LCAvKmZvciBXTkMgLyBDb3JlZ2EqLwogCUhXX0xFRCwgLyogSFcgY29udHJvbCAyIExFRHMsIExFRDAgYW5kIExFRDEgKHRoZXJlIGFyZSA0IGRpZmZlcmVudAotCQkgKiBjb250cm9sIG1vZGVzLCBzZWUgTUFDLkNPTkZJRzEgZm9yIGRldGFpbHMuKSovCisJCSAqIGNvbnRyb2wgbW9kZXMsIHNlZSBNQUMuQ09ORklHMSBmb3IgZGV0YWlscy4pCisJCSAqLwogfTsKIAogc3RydWN0IExFRF84NzF4IHsKQEAgLTk2LDcgKzk5LDggQEAKIAl1OAkJCWJMZWRXUFNCbGlua0luUHJvZ3Jlc3M7CiAJdTMyCQkJQmxpbmtUaW1lczsgLyogTm8uIHRpbWVzIHRvIHRvZ2dsZSBmb3IgYmxpbmsuKi8KIAl1MzIJCQlCbGlua2luZ0xlZFN0YXRlOyAvKiBOZXh0IHN0YXRlIGZvciBibGlua2luZywKLQkJCQkJCSAgICogZWl0aGVyIExFRF9PTiBvciBPRkYuKi8KKwkJCQkJCSAgICogZWl0aGVyIExFRF9PTiBvciBPRkYuCisJCQkJCQkgICAqLwogCiAJc3RydWN0IHRpbWVyX2xpc3QJQmxpbmtUaW1lcjsgLyogVGltZXIgb2JqZWN0IGZvciBsZWQgYmxpbmtpbmcuKi8KIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJQmxpbmtXb3JrSXRlbTsgLyogV29ya2l0ZW0gdXNlZCBieSBCbGlua1RpbWVyICovCkBAIC0xMTUsNyArMTE5LDggQEAKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIEludGVyZmFjZSB0byBtYW5pcHVsYXRlIExFRCBvYmplY3RzLgotICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLwogdm9pZCByODcxMl9Jbml0U3dMZWRzKHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIpOwogdm9pZCByODcxMl9EZUluaXRTd0xlZHMoc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlcik7CiB2b2lkIExlZENvbnRyb2w4NzF4KHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIsIGVudW0gTEVEX0NUTF9NT0RFIExlZEFjdGlvbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X21sbWUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbWxtZS5jCmluZGV4IDc3MmJmOWYuLmMxZmVlZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbWxtZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbWxtZS5jCkBAIC00MDMsNyArNDAzLDggQEAKIAogCiAJLyogSWYgd2UgZGlkbid0IGZpbmQgYSBtYXRjaCwgdGhlbiBnZXQgYSBuZXcgbmV0d29yayBzbG90IHRvIGluaXRpYWxpemUKLQkgKiB3aXRoIHRoaXMgYmVhY29uJ3MgaW5mb3JtYXRpb24gKi8KKwkgKiB3aXRoIHRoaXMgYmVhY29uJ3MgaW5mb3JtYXRpb24KKwkgKi8KIAlpZiAoZW5kX29mX3F1ZXVlX3NlYXJjaChwaGVhZCwgcGxpc3QpKSB7CiAJCWlmIChsaXN0X2VtcHR5KCZwbWxtZXByaXYtPmZyZWVfYnNzX3Bvb2wucXVldWUpKSB7CiAJCQkvKiBJZiB0aGVyZSBhcmUgbm8gbW9yZSBzbG90cywgZXhwaXJlIHRoZSBvbGRlc3QgKi8KQEAgLTkyNiw3ICs5MjcsOCBAQAogCWlmIChwc3RhICE9IE5VTEwpIHsKIAkJLyp0aGUgc3RhIGhhdmUgYmVlbiBpbiBzdGFfaW5mb19xdWV1ZSA9PiBkbyBub3RoaW5nCiAJCSAqKGJldHdlZW4gZHJ2IGhhcyByZWNlaXZlZCB0aGlzIGV2ZW50IGJlZm9yZSBhbmQKLQkJICogIGZ3IGhhdmUgbm90IHlldCB0byBzZXQga2V5IHRvIENBTV9FTlRSWSkgKi8KKwkJICogZncgaGF2ZSBub3QgeWV0IHRvIHNldCBrZXkgdG8gQ0FNX0VOVFJZKQorCQkgKi8KIAkJcmV0dXJuOwogCX0KIApAQCAtMTE3MSw3ICsxMTczLDggQEAKIAkJICAgICBwbWxtZXByaXYtPmFzc29jX3NzaWQuU3NpZExlbmd0aCkpKSB7CiAJCQlpZiAocG1sbWVwcml2LT5hc3NvY19ieV9yc3NpKSB7CiAJCQkJLyogaWYgdGhlIHNzaWQgaXMgdGhlIHNhbWUsIHNlbGVjdCB0aGUgYnNzCi0JCQkJICogIHdoaWNoIGhhcyB0aGUgbWF4IHJzc2kqLworCQkJCSAqIHdoaWNoIGhhcyB0aGUgbWF4IHJzc2kKKwkJCQkgKi8KIAkJCQlpZiAocG5ldHdvcmtfbWF4X3Jzc2kpIHsKIAkJCQkJaWYgKHBuZXR3b3JrLT5uZXR3b3JrLlJzc2kgPgogCQkJCQkgICAgcG5ldHdvcmtfbWF4X3Jzc2ktPm5ldHdvcmsuUnNzaSkKQEAgLTEzNTIsNyArMTM1NSw4IEBACiAJCWkgPSAtMTsgLyogQ291bGQgbm90IGZpbmQuICovCiAJfSBlbHNlIHsKIAkJOyAvKiBUaGVyZSBpcyBvbmUgUHJlLUF1dGhlbnRpY2F0aW9uIEtleSBmb3IgdGhlCi0JCSAgICogc3BlY2lmaWMgQlNTSUQuICovCisJCSAgICogc3BlY2lmaWMgQlNTSUQuCisJCSAgICovCiAJfQogCXJldHVybiBpOwogfQpAQCAtMTQzMCw3ICsxNDM0LDggQEAKIAlpZiAobWF0Y2gpIHsKIAkJaWYgKHNlY19pZVswXSA9PSBfV1BBX0lFX0lEXykgewogCQkJLyogcGFyc2luZyBTU04gSUUgdG8gc2VsZWN0IHJlcXVpcmVkIGVuY3J5cHRpb24KLQkJCSAqIGFsZ29yaXRobSwgYW5kIHNldCB0aGUgYmMvbWMgZW5jcnlwdGlvbiBhbGdvcml0aG0gKi8KKwkJCSAqIGFsZ29yaXRobSwgYW5kIHNldCB0aGUgYmMvbWMgZW5jcnlwdGlvbiBhbGdvcml0aG0KKwkJCSAqLwogCQkJd2hpbGUgKHRydWUpIHsKIAkJCQkvKmNoZWNrIHdwYV9vdWkgdGFnKi8KIAkJCQlpZiAobWVtY21wKCZzZWNfaWVbMl0sICZ3cGFfb3VpWzBdLCA0KSkgewpAQCAtMTQ0NCw3ICsxNDQ5LDggQEAKIAkJCQl9CiAJCQkJaWYgKCFtZW1jbXAoJnNlY19pZVs4XSwgJndwYV9vdWlbMF0sIDMpKSB7CiAJCQkJCS8qIGdldCBiYy9tYyBlbmNyeXB0aW9uIHR5cGUgKGdyb3VwCi0JCQkJCSAqIGtleSB0eXBlKSovCisJCQkJCSAqIGtleSB0eXBlKQorCQkJCQkgKi8KIAkJCQkJc3dpdGNoIChzZWNfaWVbMTFdKSB7CiAJCQkJCWNhc2UgMHgwOiAvKm5vbmUqLwogCQkJCQkJcHNlY3VyaXR5cHJpdi0+WEdycFByaXZhY3kgPQpAQCAtMTQ4Miw3ICsxNDg4LDggQEAKIAkJCQkJfSAvKmVsc2UgdGhlIHVuY3N0X291aSBpcyBtYXRjaCovCiAJCQkJfSBlbHNlIHsgLyptaXhlZCBtb2RlLCB1bmljYXN0X2VuY190eXBlID4gMSovCiAJCQkJCS8qc2VsZWN0IHRoZSB1bmNzdF9vdWkgYW5kIHJlbW92ZQotCQkJCQkgKiB0aGUgb3RoZXIgdW5jc3Rfb3VpKi8KKwkJCQkJICogdGhlIG90aGVyIHVuY3N0X291aQorCQkJCQkgKi8KIAkJCQkJY250ID0gc2VjX2llWzEyXTsKIAkJCQkJcmVtb3ZlX2NudCA9IChjbnQgLSAxKSAqIDQ7CiAJCQkJCXNlY19pZVsxMl0gPSAweDAxOwpAQCAtMTQ5OSw3ICsxNTA2LDggQEAKIAkJfQogCQlpZiAoYXV0aG1vZGUgPT0gX1dQQTJfSUVfSURfKSB7CiAJCQkvKiBwYXJzaW5nIFJTTiBJRSB0byBzZWxlY3QgcmVxdWlyZWQgZW5jcnlwdGlvbgotCQkJICogYWxnb3JpdGhtLCBhbmQgc2V0IHRoZSBiYy9tYyBlbmNyeXB0aW9uIGFsZ29yaXRobSAqLworCQkJICogYWxnb3JpdGhtLCBhbmQgc2V0IHRoZSBiYy9tYyBlbmNyeXB0aW9uIGFsZ29yaXRobQorCQkJICovCiAJCQl3aGlsZSAodHJ1ZSkgewogCQkJCWlmICgoc2VjX2llWzJdICE9IDB4MDEpIHx8IChzZWNfaWVbM10gIT0gMHgwKSkgewogCQkJCQkvKklFIFZlciBlcnJvciovCkBAIC0xNTQzLDcgKzE1NTEsOCBAQAogCQkJCQl9IC8qZWxzZSB0aGUgdW5jc3Rfb3VpIGlzIG1hdGNoKi8KIAkJCQl9IGVsc2UgeyAvKm1peGVkIG1vZGUsIHVuaWNhc3RfZW5jX3R5cGUgPiAxKi8KIAkJCQkJLypzZWxlY3QgdGhlIHVuY3N0X291aSBhbmQgcmVtb3ZlIHRoZQotCQkJCQkgKiBvdGhlciB1bmNzdF9vdWkqLworCQkJCQkgKiBvdGhlciB1bmNzdF9vdWkKKwkJCQkJICovCiAJCQkJCWNudCA9IHNlY19pZVs4XTsKIAkJCQkJcmVtb3ZlX2NudCA9IChjbnQgLSAxKSAqIDQ7CiAJCQkJCXNlY19pZVs4XSA9IDB4MDE7CkBAIC0xNjY3LDcgKzE2NzYsOCBAQAogCXN0cnVjdCBodF9wcml2CQkqcGh0cHJpdiA9ICZwbWxtZXByaXYtPmh0cHJpdjsKIAogCS8qIHRvZG86IGlmIHlvdSB3YW50IHRvIGRvIHNvbWV0aGluZyBpby9yZWcvaHcgc2V0dGluZyBiZWZvcmUgam9pbl9ic3MsCi0JICogcGxlYXNlIGFkZCBjb2RlIGhlcmUgKi8KKwkgKiBwbGVhc2UgYWRkIGNvZGUgaGVyZQorCSAqLwogCXBodHByaXYtPmFtcGR1X2VuYWJsZSA9IGZhbHNlOy8qcmVzZXQgdG8gZGlzYWJsZWQqLwogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQogCQlwaHRwcml2LT5iYWRkYmFyZXFfaXNzdWVkW2ldID0gZmFsc2U7LypyZXNldCBpdCovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X21sbWUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbWxtZS5oCmluZGV4IDYxZTBlYjcuLmRkYWFhYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbWxtZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbWxtZS5oCkBAIC00NywxNiArNDcsMjAgQEAKICNkZWZpbmUgICBXSUZJX0FESE9DX01BU1RFUl9TVEFURSAweDAwMDAwMDQwCiAjZGVmaW5lICAgV0lGSV9VTkRFUl9MSU5LSU5HCTB4MDAwMDAwODAKICNkZWZpbmUgV0lGSV9TSVRFX01PTklUT1IJMHgwMDAwMDgwMAkvKiB0byBpbmRpY2F0ZSB0aGUgc3RhdGlvbgotCQkJCQkJICogaXMgdW5kZXIgc2l0ZSBzdXJ2ZXlpbmcqLworCQkJCQkJICogaXMgdW5kZXIgc2l0ZSBzdXJ2ZXlpbmcKKwkJCQkJCSAqLwogI2RlZmluZQlXSUZJX01QX1NUQVRFCQkweDAwMDEwMDAwCiAjZGVmaW5lCVdJRklfTVBfQ1RYX0JBQ0tHUk9VTkQJMHgwMDAyMDAwMAkvKiBpbiBjb250LiB0eCBiYWNrZ3JvdW5kKi8KICNkZWZpbmUJV0lGSV9NUF9DVFhfU1QJCTB4MDAwNDAwMDAJLyogaW4gY29udC4gdHggd2l0aAotCQkJCQkJICogIHNpbmdsZS10b25lKi8KKwkJCQkJCSAqIHNpbmdsZS10b25lCisJCQkJCQkgKi8KICNkZWZpbmUJV0lGSV9NUF9DVFhfQkFDS0dST1VORF9QRU5ESU5HCTB4MDAwODAwMDAgLyogcGVuZGluZyBpbiBjb250LCB0eAotCQkJCQkqIGJhY2tncm91bmQgZHVlIHRvIG91dCBvZiBza2IqLworCQkJCQkJICAgICogYmFja2dyb3VuZCBkdWUgdG8gb3V0IG9mIHNrYgorCQkJCQkJICAgICovCiAjZGVmaW5lCVdJRklfTVBfQ1RYX0NDS19IVwkweDAwMTAwMDAwCS8qIGluIGNvbnRpbnVvdXMgdHgqLwogI2RlZmluZQlXSUZJX01QX0NUWF9DQ0tfQ1MJMHgwMDIwMDAwMAkvKiBpbiBjb250LCB0eCB3aXRoIGNhcnJpZXIKLQkJCQkJCSAqIHN1cHByZXNzaW9uKi8KKwkJCQkJCSAqIHN1cHByZXNzaW9uCisJCQkJCQkgKi8KICNkZWZpbmUgICBXSUZJX01QX0xQQktfU1RBVEUJMHgwMDQwMDAwMAogCiAjZGVmaW5lIF9GV19VTkRFUl9MSU5LSU5HCVdJRklfVU5ERVJfTElOS0lORwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tcC5jCmluZGV4IDVlNGZkYTEuLjNjMTBhMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X21wLmMKQEAgLTM3Niw3ICszNzYsOCBAQAogCQkvKiBVc2UgUEhZX1JFRy50eHQgZGVmYXVsdCB2YWx1ZS4gRG8gbm90IG5lZWQgdG8gY2hhbmdlLgogCQkgKiBDb3JyZWN0IHRoZSB0eCBwb3dlciBmb3IgQ0NLIHJhdGUgaW4gNDBNLgogCQkgKiBTZXQgQ29udHJvbCBjaGFubmVsIHRvIHVwcGVyIG9yIGxvd2VyLiBUaGVzZSBzZXR0aW5ncyBhcmUKLQkJICogcmVxdWlyZWQgb25seSBmb3IgNDBNSHogKi8KKwkJICogcmVxdWlyZWQgb25seSBmb3IgNDBNSHoKKwkJICovCiAJCXNldF9iYl9yZWcocEFkYXB0ZXIsIHJDQ0swX1N5c3RlbSwgYkNDS1NpZGVCYW5kLAogCQkJICAgKEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkUgPj4gMSkpOwogCQlzZXRfYmJfcmVnKHBBZGFwdGVyLCByT0ZETTFfTFNURiwgMHhDMDAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X21wLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X21wLmgKaW5kZXggM2YzYjJlNy4uOGRmNDUyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tcC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbXAuaApAQCAtMTA4LDcgKzEwOCw4IEBACiAJdW5zaWduZWQgY2hhciBuZXR3b3JrX21hY2FkZHJbNl07CiAJLypUZXN0aW5nIEZsYWcqLwogCXUzMiBtb2RlOy8qMCBmb3Igbm9ybWFsIHR5cGUgcGFja2V0LAotCQkgICogMSBmb3IgbG9vcGJhY2sgcGFja2V0ICgxNmJ5dGVzIFRYQ01EKSovCisJCSAgKiAxIGZvciBsb29wYmFjayBwYWNrZXQgKDE2Ynl0ZXMgVFhDTUQpCisJCSAgKi8KIAlzaW50IHByZXZfZndfc3RhdGU7CiAJdTggKnBhbGxvY2F0ZWRfbXBfeG1pdGZyYW1lX2J1ZjsKIAl1OCAqcG1wX3htdGZyYW1lX2J1ZjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbXBfaW9jdGwuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbXBfaW9jdGwuaAppbmRleCA4ZGM4OTgwLi4xMTAyNDUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X21wX2lvY3RsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tcF9pb2N0bC5oCkBAIC0xNTgsMjggKzE1OCwzNyBAQAogCXsxLCBvaWRfbnVsbF9mdW5jdGlvbn0sCQkvKjB4MDUJT0lEX1JUX1BST19TRVRfU0NSQU1CTEVSKi8KIAl7MSwgb2lkX251bGxfZnVuY3Rpb259LAkJLyoweDA2CU9JRF9SVF9QUk9fU0VUX0ZJTFRFUl9CQiovCiAJezEsIG9pZF9udWxsX2Z1bmN0aW9ufSwJCS8qMHgwNwotCQkJCQkgKiBPSURfUlRfUFJPX1NFVF9NQU5VQUxfRElWRVJTX0JCKi8KKwkJCQkJICogT0lEX1JUX1BST19TRVRfTUFOVUFMX0RJVkVSU19CQgorCQkJCQkgKi8KIAl7MSwgb2lkX3J0X3Byb19zZXRfY2hhbm5lbF9kaXJlY3RfY2FsbF9oZGx9LAkvKjB4MDgqLwogCXsxLCBvaWRfbnVsbF9mdW5jdGlvbn0sCQkvKjB4MDkKLQkJCQkqIE9JRF9SVF9QUk9fU0VUX1NMRUVQX01PREVfRElSRUNUX0NBTEwqLworCQkJCSogT0lEX1JUX1BST19TRVRfU0xFRVBfTU9ERV9ESVJFQ1RfQ0FMTAorCQkJCSovCiAJezEsIG9pZF9udWxsX2Z1bmN0aW9ufSwJCS8qMHgwQQotCQkJCSogT0lEX1JUX1BST19TRVRfV0FLRV9NT0RFX0RJUkVDVF9DQUxMKi8KKwkJCQkqIE9JRF9SVF9QUk9fU0VUX1dBS0VfTU9ERV9ESVJFQ1RfQ0FMTAorCQkJCSovCiAJezEsIG9pZF9ydF9wcm9fc2V0X2NvbnRpbnVvdXNfdHhfaGRsfSwJLyoweDBCCi0JCQkJKiBPSURfUlRfUFJPX1NFVF9UWF9DT05USU5VT1VTX0RJUkVDVF9DQUxMKi8KKwkJCQkqIE9JRF9SVF9QUk9fU0VUX1RYX0NPTlRJTlVPVVNfRElSRUNUX0NBTEwKKwkJCQkqLwogCXsxLCBvaWRfcnRfcHJvX3NldF9zaW5nbGVfY2Fycmllcl90eF9oZGx9LCAvKjB4MEMKLQkJCQkqIE9JRF9SVF9QUk9fU0VUX1NJTkdMRV9DQVJSSUVSX1RYX0NPTlRJTlVPVVMqLworCQkJCSogT0lEX1JUX1BST19TRVRfU0lOR0xFX0NBUlJJRVJfVFhfQ09OVElOVU9VUworCQkJCSovCiAJezEsIG9pZF9udWxsX2Z1bmN0aW9ufSwJCS8qMHgwRAotCQkJCSogT0lEX1JUX1BST19TRVRfVFhfQU5URU5OQV9CQiovCisJCQkJKiBPSURfUlRfUFJPX1NFVF9UWF9BTlRFTk5BX0JCCisJCQkJKi8KIAl7MSwgb2lkX3J0X3Byb19zZXRfYW50ZW5uYV9iYl9oZGx9LAkJLyoweDBFKi8KIAl7MSwgb2lkX251bGxfZnVuY3Rpb259LAkJLyoweDBGCU9JRF9SVF9QUk9fU0VUX0NSX1NDUkFNQkxFUiovCiAJezEsIG9pZF9udWxsX2Z1bmN0aW9ufSwJCS8qMHgxMAlPSURfUlRfUFJPX1NFVF9DUl9ORVdfRklMVEVSKi8KIAl7MSwgb2lkX3J0X3Byb19zZXRfdHhfcG93ZXJfY29udHJvbF9oZGx9LCAvKjB4MTEKLQkJCQkqIE9JRF9SVF9QUk9fU0VUX1RYX1BPV0VSX0NPTlRST0wqLworCQkJCSogT0lEX1JUX1BST19TRVRfVFhfUE9XRVJfQ09OVFJPTAorCQkJCSovCiAJezEsIG9pZF9udWxsX2Z1bmN0aW9ufSwJCS8qMHgxMglPSURfUlRfUFJPX1NFVF9DUl9UWF9DT05GSUcqLwogCXsxLCBvaWRfbnVsbF9mdW5jdGlvbn0sCQkvKjB4MTMKLQkJCQkJICogT0lEX1JUX1BST19HRVRfVFhfUE9XRVJfQ09OVFJPTCovCisJCQkJCSAqIE9JRF9SVF9QUk9fR0VUX1RYX1BPV0VSX0NPTlRST0wKKwkJCQkJICovCiAJezEsIG9pZF9udWxsX2Z1bmN0aW9ufSwJCS8qMHgxNAotCQkJCQkgKiBPSURfUlRfUFJPX0dFVF9DUl9TSUdOQUxfUVVBTElUWSovCisJCQkJCSAqIE9JRF9SVF9QUk9fR0VUX0NSX1NJR05BTF9RVUFMSVRZCisJCQkJCSAqLwogCXsxLCBvaWRfbnVsbF9mdW5jdGlvbn0sCQkvKjB4MTUJT0lEX1JUX1BST19TRVRfQ1JfU0VUUE9JTlQqLwogCXsxLCBvaWRfbnVsbF9mdW5jdGlvbn0sCQkvKjB4MTYJT0lEX1JUX1BST19TRVRfSU5URUdSQVRPUiovCiAJezEsIG9pZF9udWxsX2Z1bmN0aW9ufSwJCS8qMHgxNwlPSURfUlRfUFJPX1NFVF9TSUdOQUxfUVVBTElUWSovCkBAIC0yMDMsMTMgKzIxMiwxNyBAQAogCXsxLCBvaWRfcnRfcHJvX3F1ZXJ5X3J4X3BhY2tldF9yZWNlaXZlZF9oZGx9LAkvKjB4MjYqLwogCXsxLCBvaWRfcnRfcHJvX3F1ZXJ5X3J4X3BhY2tldF9jcmMzMl9lcnJvcl9oZGx9LC8qMHgyNyovCiAJezEsIG9pZF9udWxsX2Z1bmN0aW9ufSwJCS8qMHgyOAotCQkJCQkgKk9JRF9SVF9QUk9fUVVFUllfQ1VSUkVOVF9BRERSRVNTKi8KKwkJCQkJICpPSURfUlRfUFJPX1FVRVJZX0NVUlJFTlRfQUREUkVTUworCQkJCQkgKi8KIAl7MSwgb2lkX251bGxfZnVuY3Rpb259LAkJLyoweDI5Ci0JCQkJCSAqT0lEX1JUX1BST19RVUVSWV9QRVJNQU5FTlRfQUREUkVTUyovCisJCQkJCSAqT0lEX1JUX1BST19RVUVSWV9QRVJNQU5FTlRfQUREUkVTUworCQkJCQkgKi8KIAl7MSwgb2lkX251bGxfZnVuY3Rpb259LAkJLyoweDJBCi0JCQkJICpPSURfUlRfUFJPX1NFVF9QSElMSVBTX1JGX1BBUkFNRVRFUlMqLworCQkJCSAqT0lEX1JUX1BST19TRVRfUEhJTElQU19SRl9QQVJBTUVURVJTCisJCQkJICovCiAJezEsIG9pZF9ydF9wcm9fc2V0X2NhcnJpZXJfc3VwcHJlc3Npb25fdHhfaGRsfSwvKjB4MkIKLQkJCQkgKk9JRF9SVF9QUk9fU0VUX0NBUlJJRVJfU1VQUFJFU1NJT05fVFgqLworCQkJCSAqT0lEX1JUX1BST19TRVRfQ0FSUklFUl9TVVBQUkVTU0lPTl9UWAorCQkJCSAqLwogCXsxLCBvaWRfbnVsbF9mdW5jdGlvbn0sCQkvKjB4MkMJT0lEX1JUX1BST19SRUNFSVZFX1BBQ0tFVCovCiAJezEsIG9pZF9udWxsX2Z1bmN0aW9ufSwJCS8qMHgyRAlPSURfUlRfUFJPX1dSSVRFX0VFUFJPTV9CWVRFKi8KIAl7MSwgb2lkX251bGxfZnVuY3Rpb259LAkJLyoweDJFCU9JRF9SVF9QUk9fUkVBRF9FRVBST01fQllURSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X21wX3BoeV9yZWdkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbXBfcGh5X3JlZ2RlZi5oCmluZGV4IDJlOTEyMGEuLjExYmNmYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbXBfcGh5X3JlZ2RlZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbXBfcGh5X3JlZ2RlZi5oCkBAIC04Miw3ICs4Miw4IEBACiAgKiAzLiBQYWdlOCgweDgwMCkKICAqLwogI2RlZmluZQlyRlBHQTBfUkZNT0QJCQkweDgwMAkvKlJGIG1vZGUgJiBDQ0sgVHhTQyBSRgotCQkJCQkJICogQlcgU2V0dGluZz8/ICovCisJCQkJCQkgKiBCVyBTZXR0aW5nPz8KKwkJCQkJCSAqLwogI2RlZmluZQlyRlBHQTBfVHhJbmZvCQkJMHg4MDQJLyogU3RhdHVzIHJlcG9ydD8/ICovCiAjZGVmaW5lCXJGUEdBMF9QU0RGdW5jdGlvbgkJMHg4MDgKICNkZWZpbmUJckZQR0EwX1R4R2FpblN0YWdlCQkweDgwYwkvKiBTZXQgVFggUFdSIGluaXQgZ2Fpbj8gKi8KQEAgLTExOSw3ICsxMjAsOCBAQAogCiAjZGVmaW5lCXJGUEdBMF9BbmFsb2dQYXJhbWV0ZXIxCQkweDg4MAkvKiBDcnlzdGFsIGNhcCBzZXR0aW5nCiAJCQkJCQkgKiBSRi1SL1cgcHJvdGVjdGlvbgotCQkJCQkJICogZm9yIHBhcmFtZXRlcjQ/PyAqLworCQkJCQkJICogZm9yIHBhcmFtZXRlcjQ/PworCQkJCQkJICovCiAjZGVmaW5lCXJGUEdBMF9BbmFsb2dQYXJhbWV0ZXIyCQkweDg4NAogI2RlZmluZQlyRlBHQTBfQW5hbG9nUGFyYW1ldGVyMwkJMHg4ODgJLyogVXNlbGVzcyBub3cgKi8KICNkZWZpbmUJckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjQJCTB4ODhjCkBAIC0xNDYsNyArMTQ4LDggQEAKICAqIDUuIFBhZ2VBKDB4QTAwKQogICoKICAqIFNldCBDb250cm9sIGNoYW5uZWwgdG8gdXBwZXIgb3IgbG93ZXIuCi0gKiBUaGVzZSBzZXR0aW5ncyBhcmUgcmVxdWlyZWQgb25seSBmb3IgNDBNSHogKi8KKyAqIFRoZXNlIHNldHRpbmdzIGFyZSByZXF1aXJlZCBvbmx5IGZvciA0ME1IegorICovCiAjZGVmaW5lCXJDQ0swX1N5c3RlbQkJCTB4YTAwCiAKICNkZWZpbmUJckNDSzBfQUZFU2V0dGluZwkJMHhhMDQJLyogRGlzYWJsZSBpbml0IGdhaW4gbm93ICovCkBAIC0xNTUsMjAgKzE1OCwyMyBAQAogI2RlZmluZQlyQ0NLMF9SeEFHQzEJCQkweGEwYwogLyogQUdDIGRlZmF1bHQgdmFsdWUsIHNhdHVyYXRpb24gbGV2ZWwKICAqIEFudGVubmEgRGl2ZXJzaXR5LCBSWCBBR0MsIExOQSBUaHJlc2hvbGQsIFJYIExOQSBUaHJlc2hvbGQgdXNlbGVzcyBub3cuCi0gKiBOb3QgdGhlIHNhbWUgYXMgOTAgc2VyaWVzICovCisgKiBOb3QgdGhlIHNhbWUgYXMgOTAgc2VyaWVzCisgKi8KICNkZWZpbmUJckNDSzBfUnhBR0MyCQkJMHhhMTAJLyogQUdDICYgREFHQyAqLwogCiAjZGVmaW5lCXJDQ0swX1J4SFAJCQkweGExNAogCiAjZGVmaW5lCXJDQ0swX0RTUFBhcmFtZXRlcjEJCTB4YTE4CS8qIFRpbWluZyByZWNvdmVyeSAmIENoYW5uZWwKLQkJCQkJCSAqIGVzdGltYXRpb24gdGhyZXNob2xkICovCisJCQkJCQkgKiBlc3RpbWF0aW9uIHRocmVzaG9sZAorCQkJCQkJICovCiAjZGVmaW5lCXJDQ0swX0RTUFBhcmFtZXRlcjIJCTB4YTFjCS8qIFNRIHRocmVzaG9sZCAqLwogCiAjZGVmaW5lCXJDQ0swX1R4RmlsdGVyMQkJCTB4YTIwCiAjZGVmaW5lCXJDQ0swX1R4RmlsdGVyMgkJCTB4YTI0CiAjZGVmaW5lCXJDQ0swX0RlYnVnUG9ydAkJCTB4YTI4CS8qIGRlYnVnIHBvcnQgYW5kIFR4IGZpbHRlcjMgKi8KICNkZWZpbmUJckNDSzBfRmFsc2VBbGFybVJlcG9ydAkJMHhhMmMJLyogMHhhMmQgdXNlbGVzcyBub3cgMHhhMzAtYTRmCi0JCQkJCQkgKiBjaGFubmVsIHJlcG9ydCAqLworCQkJCQkJICogY2hhbm5lbCByZXBvcnQKKwkJCQkJCSAqLwogI2RlZmluZQlyQ0NLMF9UUlNTSVJlcG9ydAkJMHhhNTAKICNkZWZpbmUJckNDSzBfUnhSZXBvcnQJCQkweGE1NCAgIC8qIDB4YTU3ICovCiAjZGVmaW5lCXJDQ0swX0ZBQ291bnRlckxvd2VyCQkweGE1YyAgIC8qIDB4YTViICovCkBAIC0xOTMsMTEgKzE5OSwxMyBAQAogI2RlZmluZQlyT0ZETTBfWERSeElRSW1iYWxhbmNlCQkweGMyYwogCiAjZGVmaW5lCXJPRkRNMF9SeERldGVjdG9yMQkJMHhjMzAgIC8qIFBELEJXICYgU0JEIERNIHR1bmUKLQkJCQkJCSogaW5pdCBnYWluICovCisJCQkJCQkqIGluaXQgZ2FpbgorCQkJCQkJKi8KICNkZWZpbmUJck9GRE0wX1J4RGV0ZWN0b3IyCQkweGMzNCAgLyogU0JEICYgRmFtZSBTeW5jLiAqLwogI2RlZmluZQlyT0ZETTBfUnhEZXRlY3RvcjMJCTB4YzM4ICAvKiBGcmFtZSBTeW5jLiAqLwogI2RlZmluZQlyT0ZETTBfUnhEZXRlY3RvcjQJCTB4YzNjICAvKiBQRCwgU0JELCBGcmFtZSBTeW5jICYKLQkJCQkJCSogU2hvcnQtR0kgKi8KKwkJCQkJCSogU2hvcnQtR0kKKwkJCQkJCSovCiAKICNkZWZpbmUJck9GRE0wX1J4RFNQCQkJMHhjNDAgIC8qIFJ4IFN5bmMgUGF0aCAqLwogI2RlZmluZQlyT0ZETTBfQ0ZPYW5kREFHQwkJMHhjNDQgIC8qIENGTyAmIERBR0MgKi8KQEAgLTI4Myw3ICsyOTEsOCBAQAogI2RlZmluZQlyVHhBR0NfTWNzMTVfTWNzMTIJCTB4ZTFjCiAKIC8qIEFuYWxvZy0gY29udHJvbCBpbiBSWF9XQUlUX0NDQSA6IFJFRzogRUUwCi0gKiBbQW5hbG9nLSBQb3dlciAmIENvbnRyb2wgUmVnaXN0ZXJdICovCisgKiBbQW5hbG9nLSBQb3dlciAmIENvbnRyb2wgUmVnaXN0ZXJdCisgKi8KICNkZWZpbmUJCXJSeF9XYWl0X0NDQ0EJCTB4ZTcwCiAjZGVmaW5lCXJBbmFwYXJfQ3RybF9CQgkJCTB4ZWUwCiAKQEAgLTM3MSw3ICszODAsOCBAQAogLyoKICAqIEJpdCBNYXNrCiAgKgotICogMS4gUGFnZTEoMHgxMDApICovCisgKiAxLiBQYWdlMSgweDEwMCkKKyAqLwogI2RlZmluZQliQkJSZXNldEIJCQkweDEwMAkvKiBVc2VsZXNzIG5vdz8gKi8KICNkZWZpbmUJYkdsb2JhbFJlc2V0QgkJCTB4MjAwCiAjZGVmaW5lCWJPRkRNVHhTdGFydAkJCTB4NApAQCAtOTE4LDcgKzkyOCw4IEBACiAjZGVmaW5lCWJQZXN1ZG9Ob2lzZVN0YXRlX0QgICAgICAweGZmZmYwMDAwCiAKIC8qIDcuIFJGIFJlZ2lzdGVyCi0gKiBaZWJyYTEgKi8KKyAqIFplYnJhMQorICovCiAjZGVmaW5lCWJaZWJyYTFfSFNTSUVuYWJsZSAgICAgICAgMHg4CQkvKiBVc2VsZXNzICovCiAjZGVmaW5lCWJaZWJyYTFfVFJ4Q29udHJvbCAgICAgICAgMHhjMDAKICNkZWZpbmUJYlplYnJhMV9UUnhHYWluU2V0dGluZyAgICAweDA3ZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9wd3JjdHJsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3B3cmN0cmwuYwppbmRleCBiZjEwZDZkLi5kNDY0YzEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3B3cmN0cmwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3B3cmN0cmwuYwpAQCAtNTIsNyArNTIsOCBAQAogCQlwd3Jwcml2LT5jcHdtID0gdmFsODsKIAkJYnJlYWs7CiAJY2FzZSBQU19TVEFURV9TMjovKiBvbmx5IGZvciBVU0Igbm9ybWFsIHBvd2Vyc2F2ZSBtb2RlIHVzZSwKLQkJCSAgKiB0ZW1wIG1hcmsgc29tZSBjb2RlLiAqLworCQkJICAqIHRlbXAgbWFyayBzb21lIGNvZGUuCisJCQkgICovCiAJY2FzZSBQU19TVEFURV9TMzoKIAljYXNlIFBTX1NUQVRFX1M0OgogCQlwd3Jwcml2LT5jcHdtID0gdmFsODsKQEAgLTEwMywxNCArMTA0LDE0IEBACiAJaWYgKHB3cnByaXYtPmNwd21fdG9nID09ICgocHJlcG9ydHB3cnN0YXRlLT5zdGF0ZSkgJiAweDgwKSkKIAkJcmV0dXJuOwogCWRlbF90aW1lcigmcGFkYXB0ZXItPnB3cmN0cmxwcml2LnJwd21fY2hlY2tfdGltZXIpOwotCV9lbnRlcl9wd3Jsb2NrKCZwd3Jwcml2LT5sb2NrKTsKKwltdXRleF9sb2NrKCZwd3Jwcml2LT5tdXRleF9sb2NrKTsKIAlwd3Jwcml2LT5jcHdtID0gKHByZXBvcnRwd3JzdGF0ZS0+c3RhdGUpICYgMHhmOwogCWlmIChwd3Jwcml2LT5jcHdtID49IFBTX1NUQVRFX1MyKSB7CiAJCWlmIChwd3Jwcml2LT5hbGl2ZXMgJiBDTURfQUxJVkUpCi0JCQl1cCgmKHBjbWRwcml2LT5jbWRfcXVldWVfc2VtYSkpOworCQkJY29tcGxldGUoJihwY21kcHJpdi0+Y21kX3F1ZXVlX2NvbXApKTsKIAl9CiAJcHdycHJpdi0+Y3B3bV90b2cgPSAocHJlcG9ydHB3cnN0YXRlLT5zdGF0ZSkgJiAweDgwOwotCXVwKCZwd3Jwcml2LT5sb2NrKTsKKwltdXRleF91bmxvY2soJnB3cnByaXYtPm11dGV4X2xvY2spOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcmVnaXN0ZXJfdGFza19hbGl2ZShzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3JjdHJsLCB1aW50IHRhZykKQEAgLTE0MSwxMCArMTQyLDEwIEBACiAJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IGNvbnRhaW5lcl9vZihwd3Jwcml2LAogCQkJCSAgICBzdHJ1Y3QgX2FkYXB0ZXIsIHB3cmN0cmxwcml2KTsKIAlpZiAoIXB3cnByaXYtPmJTbGVlcCkgewotCQlfZW50ZXJfcHdybG9jaygmcHdycHJpdi0+bG9jayk7CisJCW11dGV4X2xvY2soJnB3cnByaXYtPm11dGV4X2xvY2spOwogCQlpZiAocHdycHJpdi0+cHdyX21vZGUgPT0gUFNfTU9ERV9BQ1RJVkUpCiAJCQlyODcxMl9zZXRfcnB3bShwYWRhcHRlciwgUFNfU1RBVEVfUzQpOwotCQl1cCgmcHdycHJpdi0+bG9jayk7CisJCW11dGV4X3VubG9jaygmcHdycHJpdi0+bXV0ZXhfbG9jayk7CiAJfQogfQogCkBAIC0xNTUsMTEgKzE1NiwxMSBAQAogCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBjb250YWluZXJfb2YocHdycHJpdiwKIAkJCQkgICAgc3RydWN0IF9hZGFwdGVyLCBwd3JjdHJscHJpdik7CiAJaWYgKHB3cnByaXYtPmNwd20gIT0gcHdycHJpdi0+cnB3bSkgewotCQlfZW50ZXJfcHdybG9jaygmcHdycHJpdi0+bG9jayk7CisJCW11dGV4X2xvY2soJnB3cnByaXYtPm11dGV4X2xvY2spOwogCQlyODcxMl9yZWFkOChwYWRhcHRlciwgU0RJT19IQ1BXTSk7CiAJCXB3cnByaXYtPnJwd21fcmV0cnkgPSAxOwogCQlyODcxMl9zZXRfcnB3bShwYWRhcHRlciwgcHdycHJpdi0+cnB3bSk7Ci0JCXVwKCZwd3Jwcml2LT5sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZwd3Jwcml2LT5tdXRleF9sb2NrKTsKIAl9CiB9CiAKQEAgLTE3NSw3ICsxNzYsNyBAQAogCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cmN0cmxwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKIAogCW1lbXNldCgodW5zaWduZWQgY2hhciAqKXB3cmN0cmxwcml2LCAwLCBzaXplb2Yoc3RydWN0IHB3cmN0cmxfcHJpdikpOwotCXNlbWFfaW5pdCgmcHdyY3RybHByaXYtPmxvY2ssIDEpOworCW11dGV4X2luaXQoJnB3cmN0cmxwcml2LT5tdXRleF9sb2NrKTsKIAlwd3JjdHJscHJpdi0+Y3B3bSA9IFBTX1NUQVRFX1M0OwogCXB3cmN0cmxwcml2LT5wd3JfbW9kZSA9IFBTX01PREVfQUNUSVZFOwogCXB3cmN0cmxwcml2LT5zbWFydF9wcyA9IDA7CkBAIC0yMDcsMTMgKzIwOCwxMyBAQAogCXVpbnQgcmVzID0gX1NVQ0NFU1M7CiAJc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdyY3RybCA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7CiAKLQlfZW50ZXJfcHdybG9jaygmcHdyY3RybC0+bG9jayk7CisJbXV0ZXhfbG9jaygmcHdyY3RybC0+bXV0ZXhfbG9jayk7CiAJcmVnaXN0ZXJfdGFza19hbGl2ZShwd3JjdHJsLCBDTURfQUxJVkUpOwogCWlmIChwd3JjdHJsLT5jcHdtIDwgUFNfU1RBVEVfUzIpIHsKIAkJcjg3MTJfc2V0X3Jwd20ocGFkYXB0ZXIsIFBTX1NUQVRFX1MzKTsKIAkJcmVzID0gX0ZBSUw7CiAJfQotCXVwKCZwd3JjdHJsLT5sb2NrKTsKKwltdXRleF91bmxvY2soJnB3cmN0cmwtPm11dGV4X2xvY2spOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTIyOSw3ICsyMzAsNyBAQAogewogCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cmN0cmwgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwogCi0JX2VudGVyX3B3cmxvY2soJnB3cmN0cmwtPmxvY2spOworCW11dGV4X2xvY2soJnB3cmN0cmwtPm11dGV4X2xvY2spOwogCXVucmVnaXN0ZXJfdGFza19hbGl2ZShwd3JjdHJsLCBDTURfQUxJVkUpOwogCWlmICgocHdyY3RybC0+Y3B3bSA+IFBTX1NUQVRFX1MyKSAmJgogCSAgIChwd3JjdHJsLT5wd3JfbW9kZSA+IFBTX01PREVfQUNUSVZFKSkgewpAQCAtMjM5LDUgKzI0MCw1IEBACiAJCQlyODcxMl9zZXRfcnB3bShwYWRhcHRlciwgUFNfU1RBVEVfUzApOwogCQl9CiAJfQotCXVwKCZwd3JjdHJsLT5sb2NrKTsKKwltdXRleF91bmxvY2soJnB3cmN0cmwtPm11dGV4X2xvY2spOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9wd3JjdHJsLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3B3cmN0cmwuaAppbmRleCBkYmZiNTU1Li5jODJmZGY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3B3cmN0cmwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3B3cmN0cmwuaApAQCAtODcsMTYgKzg3LDEyIEBACiAJdW5zaWduZWQgc2hvcnQgcnN2ZDsKIH07CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfZW50ZXJfcHdybG9jayhzdHJ1Y3Qgc2VtYXBob3JlICpwbG9jaykKLXsKLQlfZG93bl9zZW1hKHBsb2NrKTsKLX0KLQogc3RydWN0CXB3cmN0cmxfcHJpdiB7Ci0Jc3RydWN0IHNlbWFwaG9yZSBsb2NrOworCXN0cnVjdCBtdXRleCBtdXRleF9sb2NrOwogCS8qdm9sYXRpbGUqLyB1OCBycHdtOyAvKiByZXF1ZXN0ZWQgcG93ZXIgc3RhdGUgZm9yIGZ3ICovCiAJLyogZncgY3VycmVudCBwb3dlciBzdGF0ZS4gdXBkYXRlZCB3aGVuIDEuIHJlYWQgZnJvbSBIQ1BXTSBvcgotCSAqIDIuIGRyaXZlciBsb3dlcnMgcG93ZXIgbGV2ZWwgKi8KKwkgKiAyLiBkcml2ZXIgbG93ZXJzIHBvd2VyIGxldmVsCisJICovCiAJLyp2b2xhdGlsZSovIHU4IGNwd207CiAJLyp2b2xhdGlsZSovIHU4IHRvZzsgLyogdG9nZ2xpbmcgKi8KIAkvKnZvbGF0aWxlKi8gdTggY3B3bV90b2c7IC8qIHRvZ2dsaW5nICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3JlY3YuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcmVjdi5jCmluZGV4IDIzYzE0MzguLmNiZDJlNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcmVjdi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcmVjdi5jCkBAIC0yNjUsNyArMjY1LDggQEAKIAogCQlpZiAoKHBzdGEgIT0gTlVMTCkgJiYgKHBzdGEtPmllZWU4MDIxeF9ibG9ja2VkKSkgewogCQkJLyogYmxvY2tlZAotCQkJICogb25seSBhY2NlcHQgRUFQT0wgZnJhbWUgKi8KKwkJCSAqIG9ubHkgYWNjZXB0IEVBUE9MIGZyYW1lCisJCQkgKi8KIAkJCWlmIChldGhlcl90eXBlID09IDB4ODg4ZSkgewogCQkJCXBydG5mcmFtZSA9IHByZWN2X2ZyYW1lOwogCQkJfSBlbHNlIHsKQEAgLTI3Nyw3ICsyNzgsOCBAQAogCQl9IGVsc2UgewogCQkJLyogYWxsb3dlZAogCQkJICogY2hlY2sgZGVjcnlwdGlvbiBzdGF0dXMsIGFuZCBkZWNyeXB0IHRoZQotCQkJICogZnJhbWUgaWYgbmVlZGVkICovCisJCQkgKiBmcmFtZSBpZiBuZWVkZWQKKwkJCSAqLwogCQkJcHJ0bmZyYW1lID0gcHJlY3ZfZnJhbWU7CiAJCQkvKiBjaGVjayBpcyB0aGUgRUFQT0wgZnJhbWUgb3Igbm90IChSZWtleSkgKi8KIAkJCWlmIChldGhlcl90eXBlID09IDB4ODg4ZSkgewpAQCAtMzM0LDE5ICszMzYsMjIgQEAKIAkJc3RhX2FkZHIgPSBwYXR0cmliLT5zcmM7CiAJfSBlbHNlIGlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSkgewogCQkvKiBGb3IgU3RhdGlvbiBtb2RlLCBzYSBhbmQgYnNzaWQgc2hvdWxkIGFsd2F5cyBiZSBCU1NJRCwKLQkJICogYW5kIERBIGlzIG15IG1hYy1hZGRyZXNzICovCisJCSAqIGFuZCBEQSBpcyBteSBtYWMtYWRkcmVzcworCQkgKi8KIAkJaWYgKG1lbWNtcChwYXR0cmliLT5ic3NpZCwgcGF0dHJpYi0+c3JjLCBFVEhfQUxFTikpCiAJCQlyZXR1cm4gX0ZBSUw7CiAJICAgICAgIHN0YV9hZGRyID0gcGF0dHJpYi0+YnNzaWQ7CiAJfSBlbHNlIGlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpIHsKIAkJaWYgKGJtY2FzdCkgewogCQkJLyogRm9yIEFQIG1vZGUsIGlmIERBID09IE1DQVNULCB0aGVuIEJTU0lEIHNob3VsZAotCQkJICogYmUgYWxzbyBNQ0FTVCAqLworCQkJICogYmUgYWxzbyBNQ0FTVAorCQkJICovCiAJCQlpZiAoIUlTX01DQVNUKHBhdHRyaWItPmJzc2lkKSkKIAkJCQlyZXR1cm4gX0ZBSUw7CiAJCX0gZWxzZSB7IC8qIG5vdCBtYy1mcmFtZSAqLwogCQkJLyogRm9yIEFQIG1vZGUsIGlmIERBIGlzIG5vbi1NQ0FTVCwgdGhlbiBpdCBtdXN0IGJlCi0JCQkgKiAgQlNTSUQsIGFuZCBic3NpZCA9PSBCU1NJRCAqLworCQkJICogQlNTSUQsIGFuZCBic3NpZCA9PSBCU1NJRAorCQkJICovCiAJCQlpZiAobWVtY21wKHBhdHRyaWItPmJzc2lkLCBwYXR0cmliLT5kc3QsIEVUSF9BTEVOKSkKIAkJCQlyZXR1cm4gX0ZBSUw7CiAJCQlzdGFfYWRkciA9IHBhdHRyaWItPnNyYzsKQEAgLTM5MSw3ICszOTYsOCBAQAogCQlpZiAoKEdldEZyYW1lU3ViVHlwZShwdHIpKSA9PSBXSUZJX0RBVEFfTlVMTCkKIAkJCXJldHVybiBfRkFJTDsKIAkJLyogZHJvcCBRb1MtU3ViVHlwZSBEYXRhLCBpbmNsdWRpbmcgUW9TIE5VTEwsCi0JCSAqIGV4Y2x1ZGluZyBRb1MtRGF0YSAqLworCQkgKiBleGNsdWRpbmcgUW9TLURhdGEKKwkJICovCiAJCWlmICgoR2V0RnJhbWVTdWJUeXBlKHB0cikgJiBXSUZJX1FPU19EQVRBX1RZUEUpID09CiAJCSAgICAgV0lGSV9RT1NfREFUQV9UWVBFKSB7CiAJCQlpZiAoR2V0RnJhbWVTdWJUeXBlKHB0cikgJiAoQklUKDQpIHwgQklUKDUpIHwgQklUKDYpKSkKQEAgLTQ0NSw3ICs0NTEsOCBAQAogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpIHsKIAkJLyogRm9yIEFQIG1vZGUsIGlmIERBIGlzIG5vbi1NQ0FTVCwgdGhlbiBpdCBtdXN0IGJlIEJTU0lELAogCQkgKiBhbmQgYnNzaWQgPT0gQlNTSUQKLQkJICogRm9yIEFQIG1vZGUsIFJBPUJTU0lELCBUWD1TVEEoU1JDX0FERFIpLCBBMz1EU1RfQUREUiAqLworCQkgKiBGb3IgQVAgbW9kZSwgUkE9QlNTSUQsIFRYPVNUQShTUkNfQUREUiksIEEzPURTVF9BRERSCisJCSAqLwogCQlpZiAobWVtY21wKHBhdHRyaWItPmJzc2lkLCBteWJzc2lkLCBFVEhfQUxFTikpCiAJCQlyZXR1cm4gX0ZBSUw7CiAJCSpwc3RhID0gcjg3MTJfZ2V0X3N0YWluZm8ocHN0YXByaXYsIHBhdHRyaWItPnNyYyk7CkBAIC02MTksNyArNjI2LDggQEAKIAkgICAgKG1lbWNtcChwc25hcF90eXBlLCAodm9pZCAqKVNOQVBfRVRIX1RZUEVfQVBQTEVUQUxLX0FBUlAsIDIpKSkgfHwKIAkgICAgICFtZW1jbXAocHNuYXAsICh2b2lkICopYnJpZGdlX3R1bm5lbF9oZWFkZXIsIFNOQVBfU0laRSkpIHsKIAkJLyogcmVtb3ZlIFJGQzEwNDIgb3IgQnJpZGdlLVR1bm5lbCBlbmNhcHN1bGF0aW9uIGFuZAotCQkgKiByZXBsYWNlIEV0aGVyVHlwZSAqLworCQkgKiByZXBsYWNlIEV0aGVyVHlwZQorCQkgKi8KIAkJYnNuYXBoZHIgPSB0cnVlOwogCX0gZWxzZSB7CiAJCS8qIExlYXZlIEV0aGVybmV0IGhlYWRlciBwYXJ0IG9mIGhkciBhbmQgZnVsbCBwYXlsb2FkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3JlY3YuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcmVjdi5oCmluZGV4IDc3NDg3YmIuLmY0MTk5NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcmVjdi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcmVjdi5oCkBAIC0xNTMsNyArMTUzLDggQEAKIHN0YXRpYyBpbmxpbmUgdTggKnJlY3ZmcmFtZV9wdWxsKHVuaW9uIHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsIHNpbnQgc3opCiB7CiAJLyogdXNlZCBmb3IgZXh0cmFjdCBzeiBieXRlcyBmcm9tIHJ4X2RhdGEsIHVwZGF0ZSByeF9kYXRhIGFuZCByZXR1cm4KLQkgKiAgdGhlIHVwZGF0ZWQgcnhfZGF0YSB0byB0aGUgY2FsbGVyICovCisJICogdGhlIHVwZGF0ZWQgcnhfZGF0YSB0byB0aGUgY2FsbGVyCisJICovCiAJaWYgKHByZWN2ZnJhbWUgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAJcHJlY3ZmcmFtZS0+dS5oZHIucnhfZGF0YSArPSBzejsKQEAgLTE2OSw3ICsxNzAsOCBAQAogewogCS8qIHVzZWQgZm9yIGFwcGVuZCBzeiBieXRlcyBmcm9tIHB0ciB0byByeF90YWlsLCB1cGRhdGUgcnhfdGFpbCBhbmQKIAkgKiByZXR1cm4gdGhlIHVwZGF0ZWQgcnhfdGFpbCB0byB0aGUgY2FsbGVyCi0JICogYWZ0ZXIgcHV0dGluZywgcnhfdGFpbCBtdXN0IGJlIHN0aWxsIGxhcmdlciB0aGFuIHJ4X2VuZC4gKi8KKwkgKiBhZnRlciBwdXR0aW5nLCByeF90YWlsIG11c3QgYmUgc3RpbGwgbGFyZ2VyIHRoYW4gcnhfZW5kLgorCSAqLwogCWlmIChwcmVjdmZyYW1lID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCXByZWN2ZnJhbWUtPnUuaGRyLnJ4X3RhaWwgKz0gc3o7CkBAIC0xODYsNyArMTg4LDggQEAKIAkvKiBybXYgZGF0YSBmcm9tIHJ4X3RhaWwgKGJ5IHlpdHNlbikKIAkgKiB1c2VkIGZvciBleHRyYWN0IHN6IGJ5dGVzIGZyb20gcnhfZW5kLCB1cGRhdGUgcnhfZW5kIGFuZCByZXR1cm4gdGhlCiAJICogdXBkYXRlZCByeF9lbmQgdG8gdGhlIGNhbGxlcgotCSAqIGFmdGVyIHB1bGxpbmcsIHJ4X2VuZCBtdXN0IGJlIHN0aWxsIGxhcmdlciB0aGFuIHJ4X2RhdGEuICovCisJICogYWZ0ZXIgcHVsbGluZywgcnhfZW5kIG11c3QgYmUgc3RpbGwgbGFyZ2VyIHRoYW4gcnhfZGF0YS4KKwkgKi8KIAlpZiAocHJlY3ZmcmFtZSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAlwcmVjdmZyYW1lLT51Lmhkci5yeF90YWlsIC09IHN6OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9zZWN1cml0eS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9zZWN1cml0eS5oCmluZGV4IDIyOTVmMGUuLmZhOTUyZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfc2VjdXJpdHkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3NlY3VyaXR5LmgKQEAgLTkwLDE4ICs5MCwyMyBAQAogCiBzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiB7CiAJdTMyIEF1dGhBbGdydGhtOwkJLyogODAyLjExIGF1dGgsIGNvdWxkIGJlIG9wZW4sIHNoYXJlZCwKLQkJCQkJICogODAyMXggYW5kIGF1dGhzd2l0Y2ggKi8KKwkJCQkJICogODAyMXggYW5kIGF1dGhzd2l0Y2gKKwkJCQkJICovCiAJdTMyIFByaXZhY3lBbGdydGhtOwkJLyogVGhpcyBzcGVjaWZ5IHRoZSBwcml2YWN5IGZvciBzaGFyZWQKLQkJCQkJICogYXV0aC4gYWxnb3JpdGhtLiAqLworCQkJCQkgKiBhdXRoLiBhbGdvcml0aG0uCisJCQkJCSAqLwogCXUzMiBQcml2YWN5S2V5SW5kZXg7CQkvKiB0aGlzIGlzIG9ubHkgdmFsaWQgZm9yIGxlZ2VuZGFyeQotCQkJCQkgKiB3ZXAsIDB+MyBmb3Iga2V5IGlkLiAqLworCQkJCQkgKiB3ZXAsIDB+MyBmb3Iga2V5IGlkLgorCQkJCQkgKi8KIAl1bmlvbiBLZXl0eXBlIERlZktleVs0XTsJLyogdGhpcyBpcyBvbmx5IHZhbGlkIGZvciBkZWYuIGtleSAqLwogCXUzMiBEZWZLZXlsZW5bNF07CiAJdTMyIFhHcnBQcml2YWN5OwkJLyogVGhpcyBzcGVjaWZ5IHRoZSBwcml2YWN5IGFsZ3RobS4KLQkJCQkJICogdXNlZCBmb3IgR3JwIGtleSAqLworCQkJCQkgKiB1c2VkIGZvciBHcnAga2V5CisJCQkJCSAqLwogCXUzMiBYR3JwS2V5aWQ7CQkJLyoga2V5IGlkIHVzZWQgZm9yIEdycCBLZXkgKi8KIAl1bmlvbiBLZXl0eXBlCVhHcnBLZXlbMl07CS8qIDgwMi4xeCBHcm91cCBLZXksIGZvcgotCQkJCQkgKiBpbngwIGFuZCBpbngxICovCisJCQkJCSAqIGlueDAgYW5kIGlueDEKKwkJCQkJICovCiAJdW5pb24gS2V5dHlwZQlYR3JwdHhtaWNrZXlbMl07CiAJdW5pb24gS2V5dHlwZQlYR3JwcnhtaWNrZXlbMl07CiAJdW5pb24gcG40OCBHcnB0eHBuOwkJLyogUE40OCB1c2VkIGZvciBHcnAgS2V5IHhtaXQuICovCkBAIC0xMTgsOSArMTIzLDExIEBACiAJczMyCXN3X2VuY3J5cHQ7CS8qIGZyb20gcmVnaXN0cnlfcHJpdiAqLwogCXMzMglzd19kZWNyeXB0OwkvKiBmcm9tIHJlZ2lzdHJ5X3ByaXYgKi8KIAlzMzIJaHdfZGVjcnlwdGVkOwkvKiBpZiB0aGUgcnggcGFja2V0cyBpcyBod19kZWNyeXB0ZWQ9PWZhbHNlLAotCQkJCSAqIGl0IG1lYW5zIHRoZSBodyBoYXMgbm90IGJlZW4gcmVhZHkuICovCisJCQkJICogaXQgbWVhbnMgdGhlIGh3IGhhcyBub3QgYmVlbiByZWFkeS4KKwkJCQkgKi8KIAl1MzIgbmRpc2F1dGh0eXBlOwkvKiBrZWVwcyB0aGUgYXV0aF90eXBlICYgZW5jX3N0YXR1cyBmcm9tIHVwcGVyCi0JCQkJICogbGF5ZXIgaW9jdGwod3BhX3N1cHBsaWNhbnQgb3Igd3pjKSAqLworCQkJCSAqIGxheWVyIGlvY3RsKHdwYV9zdXBwbGljYW50IG9yIHd6YykKKwkJCQkgKi8KIAl1MzIgbmRpc2VuY3J5cHRzdGF0dXM7CiAJc3RydWN0IHdsYW5fYnNzaWRfZXggc2VjX2JzczsgIC8qIGZvciBqb2luYnNzIChoMmMgYnVmZmVyKSB1c2FnZSAqLwogCXN0cnVjdCBORElTXzgwMl8xMV9XRVAgbmRpc3dlcDsKQEAgLTEzNiw3ICsxNDMsOCBAQAogCXUzMiBidGtpcF9jb3VudGVybWVhc3VyZV90aW1lOwogCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCSAqIEZvciBXUEEyIFByZS1BdXRoZW50aWNhdGlvbi4KLQkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICoqLwogCXN0cnVjdCBSVF9QTUtJRF9MSVNUCQlQTUtJRExpc3RbTlVNX1BNS0lEX0NBQ0hFXTsKIAl1OAkJCQlQTUtJREluZGV4OwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfc3RhX21ndC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9zdGFfbWd0LmMKaW5kZXggZTExY2UyOC4uZTJkNzVlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9zdGFfbWd0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9zdGFfbWd0LmMKQEAgLTE4OCw3ICsxODgsOCBAQAogCV9yODcxMl9pbml0X3N0YV94bWl0X3ByaXYoJnBzdGEtPnN0YV94bWl0cHJpdik7CiAJX3I4NzEyX2luaXRfc3RhX3JlY3ZfcHJpdigmcHN0YS0+c3RhX3JlY3Zwcml2KTsKIAkvKiBmb3IgQS1NUERVIFJ4IHJlb3JkZXJpbmcgYnVmZmVyIGNvbnRyb2wsCi0JICogY2FuY2VsIHJlb3JkZXJpbmdfY3RybF90aW1lciAqLworCSAqIGNhbmNlbCByZW9yZGVyaW5nX2N0cmxfdGltZXIKKwkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogCQlwcmVvcmRlcl9jdHJsID0gJnBzdGEtPnJlY3ZyZW9yZGVyX2N0cmxbaV07CiAJCWRlbF90aW1lcigmcHJlb3JkZXJfY3RybC0+cmVvcmRlcmluZ19jdHJsX3RpbWVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfeG1pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF94bWl0LmMKaW5kZXggOTkyNTZiYS4uYmUzODM2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF94bWl0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF94bWl0LmMKQEAgLTIwNCw3ICsyMDQsOCBAQAogCiB7CiAJLypJZiBkcml2ZXIgeG1pdCBBUlAgcGFja2V0LCBkcml2ZXIgY2FuIHNldCBwcyBtb2RlIHRvIGluaXRpYWwKLQkgKiBzZXR0aW5nLiBJdCBzdGFuZHMgZm9yIGdldHRpbmcgREhDUCBvciBmaXggSVAuKi8KKwkgKiBzZXR0aW5nLiBJdCBzdGFuZHMgZm9yIGdldHRpbmcgREhDUCBvciBmaXggSVAuCisJICovCiAJaWYgKHBhdHRyaWItPmV0aGVyX3R5cGUgPT0gMHgwODA2KSB7CiAJCWlmIChwYWRhcHRlci0+cHdyY3RybHByaXYucHdyX21vZGUgIT0KIAkJICAgIHBhZGFwdGVyLT5yZWdpc3RyeXByaXYucG93ZXJfbWdudCkgewpAQCAtMjMyLDcgKzIzMyw4IEBACiAJCWlmIChwYXR0cmliLT5ldGhlcl90eXBlICE9IDB4ODcxMikKIAkJCXJldHVybiBfRkFJTDsKIAkJLyogZm9yIG1wIHN0b3JpbmcgdGhlIHR4Y21kIHBlciBwYWNrZXQsCi0JCSAqIGFjY29yZGluZyB0byB0aGUgaW5mbyBvZiB0eGNtZCB0byB1cGRhdGUgcGF0dHJpYiAqLworCQkgKiBhY2NvcmRpbmcgdG8gdGhlIGluZm8gb2YgdHhjbWQgdG8gdXBkYXRlIHBhdHRyaWIKKwkJICovCiAJCS8qZ2V0IE1QX1RYREVTQ19TSVpFIGJ5dGVzIHR4Y21kIHBlciBwYWNrZXQqLwogCQlfcjg3MTJfcGt0ZmlsZV9yZWFkKCZwa3RmaWxlLCAodTggKikmdHhkZXNjLCBUWERFU0NfU0laRSk7CiAJCW1lbWNweShwYXR0cmliLT5yYSwgcGF0dHJpYi0+ZHN0LCBFVEhfQUxFTik7CkBAIC0yNDQsNyArMjQ2LDggQEAKIAlpZiAocGF0dHJpYi0+ZXRoZXJfdHlwZSA9PSBFVEhfUF9JUCkgewogCQkvKiBUaGUgZm9sbG93aW5nIGlzIGZvciBESENQIGFuZCBBUlAgcGFja2V0LCB3ZSB1c2UgY2NrMU0gdG8KIAkJICogdHggdGhlc2UgcGFja2V0cyBhbmQgbGV0IExQUyBhd2FrZSBzb21lIHRpbWUKLQkJICogdG8gcHJldmVudCBESENQIHByb3RvY29sIGZhaWwgKi8KKwkJICogdG8gcHJldmVudCBESENQIHByb3RvY29sIGZhaWwKKwkJICovCiAJCXU4IHRtcFsyNF07CiAKIAkJX3I4NzEyX3BrdGZpbGVfcmVhZCgmcGt0ZmlsZSwgJnRtcFswXSwgMjQpOwpAQCAtMjU1LDcgKzI1OCw4IEBACiAJCQkJCSgodG1wWzIxXSA9PSA2NykgJiYgKHRtcFsyM10gPT0gNjgpKSkgewogCQkJCQkvKiA2OCA6IFVEUCBCT09UUCBjbGllbnQKIAkJCQkJICogNjcgOiBVRFAgQk9PVFAgc2VydmVyCi0JCQkJCSAqIFVzZSBsb3cgcmF0ZSB0byBzZW5kIERIQ1AgcGFja2V0LiovCisJCQkJCSAqIFVzZSBsb3cgcmF0ZSB0byBzZW5kIERIQ1AgcGFja2V0LgorCQkJCQkgKi8KIAkJCQkJcGF0dHJpYi0+ZGhjcF9wa3QgPSAxOwogCQkJCX0KIAkJCX0KQEAgLTMzNyw3ICszNDEsOCBAQAogCWVsc2UKIAkJcGF0dHJpYi0+YnN3ZW5jID0gZmFsc2U7CiAJLyogaWYgaW4gTVBfU1RBVEUsIHVwZGF0ZSBwa3RfYXR0cmliIGZyb20gbXBfdHhjbWQsIGFuZCBvdmVyd3JpdGUKLQkgKiBzb21lIHNldHRpbmdzIGFib3ZlLiovCisJICogc29tZSBzZXR0aW5ncyBhYm92ZS4KKwkgKi8KIAlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfTVBfU1RBVEUpKQogCQlwYXR0cmliLT5wcmlvcml0eSA9ICh0eGRlc2MudHhkdzEgPj4gUVNFTF9TSFQpICYgMHgxZjsKIAlyZXR1cm4gX1NVQ0NFU1M7CkBAIC00MzgsNyArNDQzLDggQEAKIAkJCX0KIAkJCXI4NzEyX3NlY2dldG1pYygmbWljZGF0YSwgJihtaWNbMF0pKTsKIAkJCS8qIGFkZCBtaWMgY29kZSAgYW5kIGFkZCB0aGUgbWljIGNvZGUgbGVuZ3RoIGluCi0JCQkgKiBsYXN0X3R4Y21kc3ogKi8KKwkJCSAqIGxhc3RfdHhjbWRzegorCQkJICovCiAJCQltZW1jcHkocGF5bG9hZCwgJihtaWNbMF0pLCA4KTsKIAkJCXBhdHRyaWItPmxhc3RfdHhjbWRzeiArPSA4OwogCQkJcGF5bG9hZCA9IHBheWxvYWQgLSBwYXR0cmliLT5sYXN0X3R4Y21kc3ogKyA4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF94bWl0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3htaXQuaAppbmRleCBhOTYzM2MzLi5kODk5ZDBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3htaXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3htaXQuaApAQCAtNTgsNyArNTgsOCBAQAogfSB3aGlsZSAoMCkKIAogLyogRml4ZWQgdGhlIEJpZyBFbmRpYW4gYnVnIHdoZW4gZG9pbmcgdGhlIFR4LgotICogVGhlIExpbmtzeXMgV1JINTRHIHdpbGwgY2hlY2sgdGhpcy4qLworICogVGhlIExpbmtzeXMgV1JINTRHIHdpbGwgY2hlY2sgdGhpcy4KKyAqLwogI2RlZmluZSBUS0lQX0lWKHBhdHRyaWJfaXYsIHR4cG4sIGtleWlkeClcCiBkbyB7IFwKIAlwYXR0cmliX2l2WzBdID0gdHhwbi5fYnl0ZV8uVFNDMTtcCkBAIC0xMDUsNyArMTA2LDggQEAKIAl1MTYJc2VxbnVtOwogCXUxNglldGhlcl90eXBlOwogCXUxNglwa3RsZW47CQkvKiB0aGUgb3JpZ2luYWwgODAyLjMgcGt0IHJhd19kYXRhIGxlbgotCQkJCSAqIChub3QgaW5jbHVkZSBldGhlcl9oZHIgZGF0YSkgKi8KKwkJCQkgKiAobm90IGluY2x1ZGUgZXRoZXJfaGRyIGRhdGEpCisJCQkJICovCiAJdTE2CWxhc3RfdHhjbWRzejsKIAogCXU4CXBrdF9oZHJsZW47CS8qdGhlIG9yaWdpbmFsIDgwMi4zIHBrdCBoZWFkZXIgbGVuKi8KQEAgLTExOSw3ICsxMjEsOCBAQAogCiAJdTgJcHJpb3JpdHk7CiAJdTgJZW5jcnlwdDsJLyogd2hlbiAwIGluZGljYXRlIG5vIGVuY3J5cHQuIHdoZW4gbm9uLXplcm8sCi0JCQkJICogaW5kaWNhdGUgdGhlIGVuY3J5cHQgYWxnb3JpdGhtKi8KKwkJCQkgKiBpbmRpY2F0ZSB0aGUgZW5jcnlwdCBhbGdvcml0aG0KKwkJCQkgKi8KIAl1OAlpdl9sZW47CiAJdTgJaWN2X2xlbjsKIAl1bnNpZ25lZCBjaGFyIGl2WzhdOwpAQCAtMTc2LDcgKzE3OSw4IEBACiAJc3BpbmxvY2tfdCBsb2NrOwogCXNpbnQJb3B0aW9uOwogCXNpbnQJYXBzZF9zZXR0aW5nOwkvKiBXaGVuIGJpdCBtYXNrIGlzIG9uLCB0aGUgYXNzb2NpYXRlZCBlZGNhCi0JCQkJICogcXVldWUgc3VwcG9ydHMgQVBTRC4qLworCQkJCSAqIHF1ZXVlIHN1cHBvcnRzIEFQU0QuCisJCQkJICovCiAJc3RydWN0IHR4X3NlcnZxCWJlX3E7CS8qIHByaW9yaXR5ID09IDAsMyAqLwogCXN0cnVjdCB0eF9zZXJ2cQlia19xOwkvKiBwcmlvcml0eSA9PSAxLDIqLwogCXN0cnVjdCB0eF9zZXJ2cQl2aV9xOwkvKnByaW9yaXR5ID09IDQsNSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2JfaGFsaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvdXNiX2hhbGluaXQuYwppbmRleCBhZDIxZGYxLi4wYjE1OTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2JfaGFsaW5pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3VzYl9oYWxpbml0LmMKQEAgLTE5Niw3ICsxOTYsOCBAQAogCQltc2xlZXAoMjApOwogCQkvKiBSZXZpc2VkIFBPUywgKi8KIAkJLyogRW5hYmxlIEFGRSBNYWNybyBCbG9jaydzIEJhbmRnYXAgYW5kIEVuYWJsZSBBRkUgTWFjcm8KLQkJICogQmxvY2sncyBNYmlhcyAqLworCQkgKiBCbG9jaydzIE1iaWFzCisJCSAqLwogCQlyODcxMl93cml0ZTgocGFkYXB0ZXIsIFNQUzBfQ1RSTCArIDEsIDB4NTMpOwogCQlyODcxMl93cml0ZTgocGFkYXB0ZXIsIFNQUzBfQ1RSTCwgMHg1Nyk7CiAJCXZhbDggPSByODcxMl9yZWFkOChwYWRhcHRlciwgQUZFX01JU0MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvdXNiX2ludGYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3VzYl9pbnRmLmMKaW5kZXggYzFhMGNhNDkuLjg5N2Q0NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3VzYl9pbnRmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvdXNiX2ludGYuYwpAQCAtMzAxLDcgKzMwMSw4IEBACiAJLypkaXNhYmxlX2h3X2ludGVycnVwdCovCiAJaWYgKCFwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkgewogCQkvKmRldmljZSBzdGlsbCBleGlzdHMsIHNvIGRyaXZlciBjYW4gZG8gaS9vIG9wZXJhdGlvbgotCQkgKiBUT0RPOiAqLworCQkgKiBUT0RPOgorCQkgKi8KIAl9CiAKIAkvKiBjYW5jZWwgaW4gaXJwICovCkBAIC0zNjgsNyArMzY5LDcgQEAKICAqCiAgKiBub3RlczogZHJ2X2luaXQoKSBpcyBjYWxsZWQgd2hlbiB0aGUgYnVzIGRyaXZlciBoYXMgbG9jYXRlZCBhIGNhcmQgZm9yIHVzCiAgKiB0byBzdXBwb3J0LiBXZSBhY2NlcHQgdGhlIG5ldyBkZXZpY2UgYnkgcmV0dXJuaW5nIDAuCi0qLworICovCiBzdGF0aWMgaW50IHI4NzF4dV9kcnZfaW5pdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqcHVzYl9pbnRmLAogCQkJICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKnBkaWQpCiB7CkBAIC02MTEsNyArNjEyLDggQEAKIH0KIAogLyogcm1tb2QgbW9kdWxlICYgdW5wbHVnKFN1cnByaXNlUmVtb3ZlZCkgd2lsbCBjYWxsIHI4NzF4dV9kZXZfcmVtb3ZlKCkKLSAqID0+IGhvdyB0byByZWNvZ25pemUgYm90aCAqLworICogPT4gaG93IHRvIHJlY29nbml6ZSBib3RoCisgKi8KIHN0YXRpYyB2b2lkIHI4NzF4dV9kZXZfcmVtb3ZlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICpwdXNiX2ludGYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKHB1c2JfaW50Zik7CkBAIC02MzUsMTIgKzYzNywxNCBAQAogCQlyODcxMl9mcmVlX2Rydl9zdyhwYWRhcHRlcik7CiAKIAkJLyogZGVjcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgdXNiIGRldmljZSBzdHJ1Y3R1cmUKLQkJICogd2hlbiBkaXNjb25uZWN0ICovCisJCSAqIHdoZW4gZGlzY29ubmVjdAorCQkgKi8KIAkJdXNiX3B1dF9kZXYodWRldik7CiAJfQogCS8qIElmIHdlIGRpZG4ndCB1bnBsdWcgdXNiIGRvbmdsZSBhbmQgcmVtb3ZlL2luc2VydCBtb2R1bGUsIGRyaXZlcgogCSAqIGZhaWxzIG9uIHNpdGVzdXJ2ZXkgZm9yIHRoZSBmaXJzdCB0aW1lIHdoZW4gZGV2aWNlIGlzIHVwLgotCSAqIFJlc2V0IHVzYiBwb3J0IGZvciBzaXRlc3VydmV5IGZhaWwgaXNzdWUuICovCisJICogUmVzZXQgdXNiIHBvcnQgZm9yIHNpdGVzdXJ2ZXkgZmFpbCBpc3N1ZS4KKwkgKi8KIAlpZiAodWRldi0+c3RhdGUgIT0gVVNCX1NUQVRFX05PVEFUVEFDSEVEKQogCQl1c2JfcmVzZXRfZGV2aWNlKHVkZXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvdXNiX29wc19saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvdXNiX29wc19saW51eC5jCmluZGV4IDZmMTIzNDUuLmZjNmJiMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3VzYl9vcHNfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2Jfb3BzX2xpbnV4LmMKQEAgLTUwLDcgKzUwLDcgQEAKIAlwaW50ZnByaXYtPnBpb3J3X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CiAJaWYgKCFwaW50ZnByaXYtPnBpb3J3X3VyYikKIAkJcmV0dXJuIF9GQUlMOwotCXNlbWFfaW5pdCgmKHBpbnRmcHJpdi0+aW9fcmV0ZXZ0KSwgMCk7CisJaW5pdF9jb21wbGV0aW9uKCZwaW50ZnByaXYtPmlvX3JldGV2dF9jb21wKTsKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKQEAgLTE2Myw3ICsxNjMsNyBAQAogCQllbHNlCiAJCQlwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCA9IHRydWU7CiAJfQotCXVwKCZwaW50ZnByaXYtPmlvX3JldGV2dCk7CisJY29tcGxldGUoJnBpbnRmcHJpdi0+aW9fcmV0ZXZ0X2NvbXApOwogfQogCiB2b2lkIHI4NzEyX3VzYl93cml0ZV9tZW0oc3RydWN0IGludGZfaGRsICpwaW50ZmhkbCwgdTMyIGFkZHIsIHUzMiBjbnQsIHU4ICp3bWVtKQpAQCAtMTg3LDcgKzE4Nyw3IEBACiAJCQkgIHdtZW0sIGNudCwgdXNiX3dyaXRlX21lbV9jb21wbGV0ZSwKIAkJCSAgcGlvX3F1ZXVlKTsKIAl1c2Jfc3VibWl0X3VyYihwaW9yd191cmIsIEdGUF9BVE9NSUMpOwotCV9kb3duX3NlbWEoJnBpbnRmcHJpdi0+aW9fcmV0ZXZ0KTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJnBpbnRmcHJpdi0+aW9fcmV0ZXZ0X2NvbXApOwogfQogCiBzdGF0aWMgdm9pZCByODcxMl91c2JfcmVhZF9wb3J0X2NvbXBsZXRlKHN0cnVjdCB1cmIgKnB1cmIpCkBAIC0yMDIsMjYgKzIwMiwyMyBAQAogCWlmIChwdXJiLT5zdGF0dXMgPT0gMCkgeyAvKiBTVUNDRVNTICovCiAJCWlmICgocHVyYi0+YWN0dWFsX2xlbmd0aCA+IChNQVhfUkVDVkJVRl9TWikpIHx8CiAJCSAgICAocHVyYi0+YWN0dWFsX2xlbmd0aCA8IFJYREVTQ19TSVpFKSkgewotCQkJcHJlY3ZidWYtPnJldXNlID0gdHJ1ZTsKIAkJCXI4NzEyX3JlYWRfcG9ydChwYWRhcHRlciwgcHJlY3Zwcml2LT5mZl9od2FkZHIsIDAsCiAJCQkJICAodW5zaWduZWQgY2hhciAqKXByZWN2YnVmKTsKIAkJfSBlbHNlIHsKKwkJCV9wa3QgKnBza2IgPSBwcmVjdmJ1Zi0+cHNrYjsKKwogCQkJcHJlY3ZidWYtPnRyYW5zZmVyX2xlbiA9IHB1cmItPmFjdHVhbF9sZW5ndGg7CiAJCQlwYnVmID0gKHVpbnQgKilwcmVjdmJ1Zi0+cGJ1ZjsKIAkJCWlzZXZ0ID0gbGUzMl90b19jcHUoKihwYnVmICsgMSkpICYgMHgxZmY7CiAJCQlpZiAoKGlzZXZ0ICYgMHgxZmYpID09IDB4MWZmKSB7CiAJCQkJcjg3MTJfcnhjbWRfZXZlbnRfaGRsKHBhZGFwdGVyLCBwYnVmKTsKLQkJCQlwcmVjdmJ1Zi0+cmV1c2UgPSB0cnVlOworCQkJCXNrYl9xdWV1ZV90YWlsKCZwcmVjdnByaXYtPnJ4X3NrYl9xdWV1ZSwgcHNrYik7CiAJCQkJcjg3MTJfcmVhZF9wb3J0KHBhZGFwdGVyLCBwcmVjdnByaXYtPmZmX2h3YWRkciwKIAkJCQkJCTAsICh1bnNpZ25lZCBjaGFyICopcHJlY3ZidWYpOwogCQkJfSBlbHNlIHsKLQkJCQlfcGt0ICpwc2tiID0gcHJlY3ZidWYtPnBza2I7Ci0KIAkJCQlza2JfcHV0KHBza2IsIHB1cmItPmFjdHVhbF9sZW5ndGgpOwogCQkJCXNrYl9xdWV1ZV90YWlsKCZwcmVjdnByaXYtPnJ4X3NrYl9xdWV1ZSwgcHNrYik7CiAJCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmcHJlY3Zwcml2LT5yZWN2X3Rhc2tsZXQpOwotCQkJCXByZWN2YnVmLT5wc2tiID0gTlVMTDsKLQkJCQlwcmVjdmJ1Zi0+cmV1c2UgPSBmYWxzZTsKIAkJCQlyODcxMl9yZWFkX3BvcnQocGFkYXB0ZXIsIHByZWN2cHJpdi0+ZmZfaHdhZGRyLAogCQkJCQkJMCwgKHVuc2lnbmVkIGNoYXIgKilwcmVjdmJ1Zik7CiAJCQl9CkBAIC0yNDEsNyArMjM4LDYgQEAKIAkJCX0KIAkJCS8qIEZhbGwgdGhyb3VnaC4gKi8KIAkJY2FzZSAtRVBST1RPOgotCQkJcHJlY3ZidWYtPnJldXNlID0gdHJ1ZTsKIAkJCXI4NzEyX3JlYWRfcG9ydChwYWRhcHRlciwgcHJlY3Zwcml2LT5mZl9od2FkZHIsIDAsCiAJCQkJICAodW5zaWduZWQgY2hhciAqKXByZWN2YnVmKTsKIAkJCWJyZWFrOwpAQCAtMjcwLDUxICsyNjYsNDMgQEAKIAlzdHJ1Y3QgdXNiX2RldmljZSAqcHVzYmQgPSBwZHZvYmotPnB1c2JkZXY7CiAKIAlpZiAoYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwgYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCB8fAotCSAgICBhZGFwdGVyLT5wd3JjdHJscHJpdi5wbnBfYnN0b3BfdHJ4KQorCSAgICBhZGFwdGVyLT5wd3JjdHJscHJpdi5wbnBfYnN0b3BfdHJ4IHx8ICFwcmVjdmJ1ZikKIAkJcmV0dXJuIF9GQUlMOwotCWlmIChwcmVjdmJ1Zi0+cmV1c2UgfHwgIXByZWN2YnVmLT5wc2tiKSB7Ci0JCXByZWN2YnVmLT5wc2tiID0gc2tiX2RlcXVldWUoJnByZWN2cHJpdi0+ZnJlZV9yZWN2X3NrYl9xdWV1ZSk7Ci0JCWlmIChwcmVjdmJ1Zi0+cHNrYiAhPSBOVUxMKQotCQkJcHJlY3ZidWYtPnJldXNlID0gdHJ1ZTsKKwlyODcxMl9pbml0X3JlY3ZidWYoYWRhcHRlciwgcHJlY3ZidWYpOworCS8qIFRyeSB0byB1c2Ugc2tiIGZyb20gdGhlIGZyZWUgcXVldWUgKi8KKwlwcmVjdmJ1Zi0+cHNrYiA9IHNrYl9kZXF1ZXVlKCZwcmVjdnByaXYtPmZyZWVfcmVjdl9za2JfcXVldWUpOworCisJaWYgKCFwcmVjdmJ1Zi0+cHNrYikgeworCQlwcmVjdmJ1Zi0+cHNrYiA9IG5ldGRldl9hbGxvY19za2IoYWRhcHRlci0+cG5ldGRldiwKKwkJCQkgTUFYX1JFQ1ZCVUZfU1ogKyBSRUNWQlVGRl9BTElHTl9TWik7CisJCWlmICghcHJlY3ZidWYtPnBza2IpCisJCQlyZXR1cm4gX0ZBSUw7CisJCXRtcGFkZHIgPSAoYWRkcl90KXByZWN2YnVmLT5wc2tiLT5kYXRhOworCQlhbGlnbm1lbnQgPSB0bXBhZGRyICYgKFJFQ1ZCVUZGX0FMSUdOX1NaIC0gMSk7CisJCXNrYl9yZXNlcnZlKHByZWN2YnVmLT5wc2tiLAorCQkJICAgIChSRUNWQlVGRl9BTElHTl9TWiAtIGFsaWdubWVudCkpOworCQlwcmVjdmJ1Zi0+cGhlYWQgPSBwcmVjdmJ1Zi0+cHNrYi0+aGVhZDsKKwkJcHJlY3ZidWYtPnBkYXRhID0gcHJlY3ZidWYtPnBza2ItPmRhdGE7CisJCXByZWN2YnVmLT5wdGFpbCA9IHNrYl90YWlsX3BvaW50ZXIocHJlY3ZidWYtPnBza2IpOworCQlwcmVjdmJ1Zi0+cGVuZCA9IHNrYl9lbmRfcG9pbnRlcihwcmVjdmJ1Zi0+cHNrYik7CisJCXByZWN2YnVmLT5wYnVmID0gcHJlY3ZidWYtPnBza2ItPmRhdGE7CisJfSBlbHNlIHsgLyogc2tiIGlzIHJldXNlZCAqLworCQlwcmVjdmJ1Zi0+cGhlYWQgPSBwcmVjdmJ1Zi0+cHNrYi0+aGVhZDsKKwkJcHJlY3ZidWYtPnBkYXRhID0gcHJlY3ZidWYtPnBza2ItPmRhdGE7CisJCXByZWN2YnVmLT5wdGFpbCA9IHNrYl90YWlsX3BvaW50ZXIocHJlY3ZidWYtPnBza2IpOworCQlwcmVjdmJ1Zi0+cGVuZCA9IHNrYl9lbmRfcG9pbnRlcihwcmVjdmJ1Zi0+cHNrYik7CisJCXByZWN2YnVmLT5wYnVmID0gcHJlY3ZidWYtPnBza2ItPmRhdGE7CiAJfQotCWlmIChwcmVjdmJ1ZiAhPSBOVUxMKSB7Ci0JCXI4NzEyX2luaXRfcmVjdmJ1ZihhZGFwdGVyLCBwcmVjdmJ1Zik7Ci0JCS8qIHJlLWFzc2lnbiBmb3IgbGludXggYmFzZWQgb24gc2tiICovCi0JCWlmICghcHJlY3ZidWYtPnJldXNlIHx8ICFwcmVjdmJ1Zi0+cHNrYikgewotCQkJcHJlY3ZidWYtPnBza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKGFkYXB0ZXItPnBuZXRkZXYsCi0JCQkJCSBNQVhfUkVDVkJVRl9TWiArIFJFQ1ZCVUZGX0FMSUdOX1NaKTsKLQkJCWlmICghcHJlY3ZidWYtPnBza2IpCi0JCQkJcmV0dXJuIF9GQUlMOwotCQkJdG1wYWRkciA9IChhZGRyX3QpcHJlY3ZidWYtPnBza2ItPmRhdGE7Ci0JCQlhbGlnbm1lbnQgPSB0bXBhZGRyICYgKFJFQ1ZCVUZGX0FMSUdOX1NaIC0gMSk7Ci0JCQlza2JfcmVzZXJ2ZShwcmVjdmJ1Zi0+cHNrYiwKLQkJCQkgICAgKFJFQ1ZCVUZGX0FMSUdOX1NaIC0gYWxpZ25tZW50KSk7Ci0JCQlwcmVjdmJ1Zi0+cGhlYWQgPSBwcmVjdmJ1Zi0+cHNrYi0+aGVhZDsKLQkJCXByZWN2YnVmLT5wZGF0YSA9IHByZWN2YnVmLT5wc2tiLT5kYXRhOwotCQkJcHJlY3ZidWYtPnB0YWlsID0gc2tiX3RhaWxfcG9pbnRlcihwcmVjdmJ1Zi0+cHNrYik7Ci0JCQlwcmVjdmJ1Zi0+cGVuZCA9IHNrYl9lbmRfcG9pbnRlcihwcmVjdmJ1Zi0+cHNrYik7Ci0JCQlwcmVjdmJ1Zi0+cGJ1ZiA9IHByZWN2YnVmLT5wc2tiLT5kYXRhOwotCQl9IGVsc2UgeyAvKiByZXVzZSBza2IgKi8KLQkJCXByZWN2YnVmLT5waGVhZCA9IHByZWN2YnVmLT5wc2tiLT5oZWFkOwotCQkJcHJlY3ZidWYtPnBkYXRhID0gcHJlY3ZidWYtPnBza2ItPmRhdGE7Ci0JCQlwcmVjdmJ1Zi0+cHRhaWwgPSBza2JfdGFpbF9wb2ludGVyKHByZWN2YnVmLT5wc2tiKTsKLQkJCXByZWN2YnVmLT5wZW5kID0gc2tiX2VuZF9wb2ludGVyKHByZWN2YnVmLT5wc2tiKTsKLQkJCXByZWN2YnVmLT5wYnVmID0gcHJlY3ZidWYtPnBza2ItPmRhdGE7Ci0JCQlwcmVjdmJ1Zi0+cmV1c2UgPSBmYWxzZTsKLQkJfQotCQlwdXJiID0gcHJlY3ZidWYtPnB1cmI7Ci0JCS8qIHRyYW5zbGF0ZSBETUEgRklGTyBhZGRyIHRvIHBpcGVoYW5kbGUgKi8KLQkJcGlwZSA9IGZmYWRkcjJwaXBlaGRsKHBkdm9iaiwgYWRkcik7Ci0JCXVzYl9maWxsX2J1bGtfdXJiKHB1cmIsIHB1c2JkLCBwaXBlLAotCQkJCSAgcHJlY3ZidWYtPnBidWYsIE1BWF9SRUNWQlVGX1NaLAotCQkJCSAgcjg3MTJfdXNiX3JlYWRfcG9ydF9jb21wbGV0ZSwKLQkJCQkgIHByZWN2YnVmKTsKLQkJZXJyID0gdXNiX3N1Ym1pdF91cmIocHVyYiwgR0ZQX0FUT01JQyk7Ci0JCWlmICgoZXJyKSAmJiAoZXJyICE9ICgtRVBFUk0pKSkKLQkJCXJldCA9IF9GQUlMOwotCX0gZWxzZSB7CisJcHVyYiA9IHByZWN2YnVmLT5wdXJiOworCS8qIHRyYW5zbGF0ZSBETUEgRklGTyBhZGRyIHRvIHBpcGVoYW5kbGUgKi8KKwlwaXBlID0gZmZhZGRyMnBpcGVoZGwocGR2b2JqLCBhZGRyKTsKKwl1c2JfZmlsbF9idWxrX3VyYihwdXJiLCBwdXNiZCwgcGlwZSwKKwkJCSAgcHJlY3ZidWYtPnBidWYsIE1BWF9SRUNWQlVGX1NaLAorCQkJICByODcxMl91c2JfcmVhZF9wb3J0X2NvbXBsZXRlLAorCQkJICBwcmVjdmJ1Zik7CisJZXJyID0gdXNiX3N1Ym1pdF91cmIocHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKChlcnIpICYmIChlcnIgIT0gKC1FUEVSTSkpKQogCQlyZXQgPSBfRkFJTDsKLQl9CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvd2lmaS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvd2lmaS5oCmluZGV4IDdhMzUyYzQuLmI4YWY5NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3dpZmkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi93aWZpLmgKQEAgLTM3Niw3ICszNzYsOCBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCQlCZWxvdyBpcyBmb3IgdGhlIHNlY3VyaXR5IHJlbGF0ZWQgZGVmaW5pdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogI2RlZmluZSBfUkVTRVJWRURfRlJBTUVfVFlQRV8JMAogI2RlZmluZSBfU0tCX0ZSQU1FX1RZUEVfCTIKICNkZWZpbmUgX1BSRV9BTExPQ01FTV8JCTEKQEAgLTQyMCw3ICs0MjEsOCBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJCQkJQmVsb3cgaXMgdGhlIGZpeGVkIGVsZW1lbnRzLi4uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogI2RlZmluZSBfQVVUSF9BTEdNX05VTV8JCQkyCiAjZGVmaW5lIF9BVVRIX1NFUV9OVU1fCQkJMgogI2RlZmluZSBfQkVBQ09OX0lURVJWQUxfCQkyCkBAIC00NDgsMjAgKzQ1MCwyMyBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCQkJQmVsb3cgaXMgdGhlIGRlZmluaXRpb24gZm9yIDgwMi4xMWkgLyA4MDIuMXgKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAjZGVmaW5lIF9JRUVFODAyMVhfTUdUXwkJCTEJLypXUEEgKi8KICNkZWZpbmUgX0lFRUU4MDIxWF9QU0tfCQkJMgkvKiBXUEEgd2l0aCBwcmUtc2hhcmVkIGtleSAqLwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCQkJQmVsb3cgaXMgdGhlIGRlZmluaXRpb24gZm9yIFdNTQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KICNkZWZpbmUgX1dNTV9JRV9MZW5ndGhfCQkJCTcgIC8qIGZvciBXTU0gU1RBICovCiAjZGVmaW5lIF9XTU1fUGFyYV9FbGVtZW50X0xlbmd0aF8JCTI0CiAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQkJCUJlbG93IGlzIHRoZSBkZWZpbml0aW9uIGZvciA4MDIuMTFuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogCiAvKiBibG9jay1hY2sgcGFyYW1ldGVycyAqLwogI2RlZmluZSBJRUVFODAyMTFfQUREQkFfUEFSQU1fUE9MSUNZX01BU0sgMHgwMDAyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi93bGFuX2Jzc2RlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvd2xhbl9ic3NkZWYuaAppbmRleCBmZGE1NzA3Li44NmE4OGI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi93bGFuX2Jzc2RlZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3dsYW5fYnNzZGVmLmgKQEAgLTE3MSw3ICsxNzEsOCBAQAogc3RydWN0IE5ESVNfODAyXzExX1dFUCB7CiAJdTMyIExlbmd0aDsJCSAgLyogTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlICovCiAJdTMyIEtleUluZGV4OwkJICAvKiAwIGlzIHRoZSBwZXItY2xpZW50IGtleSwKLQkJCQkgICAqIDEtTiBhcmUgdGhlIGdsb2JhbCBrZXlzICovCisJCQkJICAgKiAxLU4gYXJlIHRoZSBnbG9iYWwga2V5cworCQkJCSAgICovCiAJdTMyIEtleUxlbmd0aDsJCSAgLyogbGVuZ3RoIG9mIGtleSBpbiBieXRlcyAqLwogCXU4ICBLZXlNYXRlcmlhbFsxNl07ICAgICAgLyogdmFyaWFibGUgbGVuZ3RoIGRlcGVuZGluZyBvbiBhYm92ZSBmaWVsZCAqLwogfTsKQEAgLTE5NCw3ICsxOTUsOCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlpbnQJbmV0d29ya190eXBlOwkvKnJlZmVyIHRvIGllZWU4MDIxMS5oIGZvciBXSVJFTEVTU18xMUEvQi9HICovCiAJaW50CWZpeGVkOwkJLyogc2V0IHRvIGZpeGVkIHdoZW4gbm90IHRvIGJlIHJlbW92ZWQgYXNpCi0JCQkJICogc2l0ZS1zdXJ2ZXlpbmcgKi8KKwkJCQkgKiBzaXRlLXN1cnZleWluZworCQkJCSAqLwogCXVuc2lnbmVkIGludAlsYXN0X3NjYW5uZWQ7IC8qdGltZXN0YW1wIGZvciB0aGUgbmV0d29yayAqLwogCWludAlhaWQ7CQkvKndpbGwgb25seSBiZSB2YWxpZCB3aGVuIGEgQlNTIGlzIGpvaW5lZC4gKi8KIAlpbnQJam9pbl9yZXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi94bWl0X2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi94bWl0X2xpbnV4LmMKaW5kZXggNjk1ZjliOS4uNGVlNDEzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIveG1pdF9saW51eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3htaXRfbGludXguYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rbWVtbGVhay5oPgogCiAjaW5jbHVkZSAib3NkZXBfc2VydmljZS5oIgogI2luY2x1ZGUgImRydl90eXBlcy5oIgpAQCAtOTEsNyArOTIsOCBAQAogCX0gZWxzZSB7CiAJCS8qICJXaGVuIHByaW9yaXR5IHByb2Nlc3Npbmcgb2YgZGF0YSBmcmFtZXMgaXMgc3VwcG9ydGVkLAogCQkgKiBhIFNUQSdzIFNNRSBzaG91bGQgc2VuZCBFQVBPTC1LZXkgZnJhbWVzIGF0IHRoZSBoaWdoZXN0Ci0JCSAqIHByaW9yaXR5LiIgKi8KKwkJICogcHJpb3JpdHkuIgorCQkgKi8KIAogCQlpZiAocGF0dHJpYi0+ZXRoZXJfdHlwZSA9PSAweDg4OGUpCiAJCQlVc2VyUHJpb3JpdHkgPSA3OwpAQCAtMTMyLDYgKzEzNCw3IEBACiAJCQluZXRkZXZfZXJyKHBhZGFwdGVyLT5wbmV0ZGV2LCAicHhtaXRidWYtPnB4bWl0X3VyYltpXSA9PSBOVUxMXG4iKTsKIAkJCXJldHVybiBfRkFJTDsKIAkJfQorCQlrbWVtbGVha19ub3RfbGVhayhweG1pdGJ1Zi0+cHhtaXRfdXJiW2ldKTsKIAl9CiAJcmV0dXJuIF9TVUNDRVNTOwogfQpAQCAtMTYyLDE2ICsxNjUsMTYgQEAKIAlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYocG5ldGRldik7CiAJc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJihwYWRhcHRlci0+eG1pdHByaXYpOwogCi0JaWYgKCFyODcxMl9pZl91cChwYWRhcHRlcikpIHsKKwlpZiAoIXI4NzEyX2lmX3VwKHBhZGFwdGVyKSkKIAkJZ290byBfeG1pdF9lbnRyeV9kcm9wOwotCX0KKwogCXB4bWl0ZnJhbWUgPSByODcxMl9hbGxvY194bWl0ZnJhbWUocHhtaXRwcml2KTsKLQlpZiAoIXB4bWl0ZnJhbWUpIHsKKwlpZiAoIXB4bWl0ZnJhbWUpCiAJCWdvdG8gX3htaXRfZW50cnlfZHJvcDsKLQl9Ci0JaWYgKCghcjg3MTJfdXBkYXRlX2F0dHJpYihwYWRhcHRlciwgcGt0LCAmcHhtaXRmcmFtZS0+YXR0cmliKSkpIHsKKworCWlmICgoIXI4NzEyX3VwZGF0ZV9hdHRyaWIocGFkYXB0ZXIsIHBrdCwgJnB4bWl0ZnJhbWUtPmF0dHJpYikpKQogCQlnb3RvIF94bWl0X2VudHJ5X2Ryb3A7Ci0JfQorCiAJcGFkYXB0ZXItPmxlZHByaXYuTGVkQ29udHJvbEhhbmRsZXIocGFkYXB0ZXIsIExFRF9DVExfVFgpOwogCXB4bWl0ZnJhbWUtPnBrdCA9IHBrdDsKIAlpZiAocjg3MTJfcHJlX3htaXQocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L0tjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3N2MxYWIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9LY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotY29uZmlnIFI4NzIzQVUKLQl0cmlzdGF0ZSAiUmVhbHRlayBSVEw4NzIzQVUgV2lyZWxlc3MgTEFOIE5JQyBkcml2ZXIgKGRlcHJlY2F0ZWQpIgotCWRlcGVuZHMgb24gVVNCICYmIFdMQU4gJiYgUkZLSUxMCi0Jc2VsZWN0IFdJUkVMRVNTX0VYVAotCXNlbGVjdCBXRVhUX1BSSVYKLQlzZWxlY3QgQ0ZHODAyMTEKLQlkZWZhdWx0IG4KLQktLS1oZWxwLS0tCi0JVGhpcyBvcHRpb24gYWRkcyB0aGUgUmVhbHRlayBSVEw4NzIzQVUgVVNCIGRldmljZSBzdWNoIGFzIGZvdW5kIGluCi0JdGhlIExlbm92byBZb2dhIDEzIHRhYmxldC4gSWYgYnVpbHQgYXMgYSBtb2R1bGUsIGl0IHdpbGwgYmUgY2FsbGVkIHI4NzIzYXUuCi0KLQlOb3RlOiBUaGlzIGRyaXZlciBpcyBkZXByZWNhdGVkIGFuZCBzY2hlZHVsZWQgdG8gYmUgcmVtb3ZlZCBpbiBhCi0JZnV0dXJlIGtlcm5lbCByZWxlYXNlLiBQbGVhc2UgdXNlIHJ0bDh4eHh1IGluc3RlYWQuCi0KLWlmIFI4NzIzQVUKLQotY29uZmlnIDg3MjNBVV9BUF9NT0RFCi0JYm9vbCAiUmVhbHRlayBSVEw4NzIzQVUgQVAgbW9kZSIKLQlkZWZhdWx0IHkKLQktLS1oZWxwLS0tCi0JVGhpcyBvcHRpb24gZW5hYmxlcyBBY2Nlc3MgUG9pbnQgbW9kZS4gVW5sZXNzIHlvdSBrbm93IHRoYXQgeW91ciBzeXN0ZW0KLQl3aWxsIG5ldmVyIGJlIHVzZWQgYXMgYW4gQVAsIG9yIHRoZSB0YXJnZXQgc3lzdGVtIGhhcyBsaW1pdGVkIG1lbW9yeSwKLQkiWSIgc2hvdWxkIGJlIHNlbGVjdGVkLgotCi1jb25maWcgODcyM0FVX0JUX0NPRVhJU1QKLQlib29sICJSZWFsdGVrIFJUTDg3MjNBVSBCbHVlVG9vdGggQ29leGlzdGVuY2UiCi0JZGVmYXVsdCB5Ci0JLS0taGVscC0tLQotCVRoaXMgb3B0aW9uIGVuYWJsZXMgaWNvZXhpc3RlbmNlIHdpdGggQmx1ZVRvb3RoIGNvbW11bmljYXRpb25zIGZvciB0aGUgcjg3MjNhdSBkcml2ZXIuCi0JVW5sZXNzIHlvdSBrbm93IHRoYXQgdGhpcyBkcml2ZXIgd2lsbCBuZXZlciBieSB1c2VkIHdpdGggQlQsIG9yIHRoZSB0YXJnZXQgc3lzdGVtIGhhcwotCWxpbWl0ZWQgbWVtb3J5LCAiWSIgc2hvdWxkIGJlIHNlbGVjdGVkLgotCi1lbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlODk4OTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLXI4NzIzYXUteSA6PQkJCQlcCi0JCWNvcmUvcnR3X2NtZC5vCQlcCi0JCWNvcmUvcnR3X2VmdXNlLm8JXAotCQljb3JlL3J0d19pZWVlODAyMTEubwlcCi0JCWNvcmUvcnR3X21sbWUubwkJXAotCQljb3JlL3J0d19tbG1lX2V4dC5vCVwKLQkJY29yZS9ydHdfcHdyY3RybC5vCVwKLQkJY29yZS9ydHdfcmVjdi5vCQlcCi0JCWNvcmUvcnR3X3NlY3VyaXR5Lm8JXAotCQljb3JlL3J0d19zcmVzZXQubwlcCi0JCWNvcmUvcnR3X3N0YV9tZ3QubwlcCi0JCWNvcmUvcnR3X3htaXQubwkJXAotCQljb3JlL3J0d193bGFuX3V0aWwubwlcCi0JCWhhbC9oYWxfY29tLm8JCVwKLQkJaGFsL2hhbF9pbnRmLm8JCVwKLQkJaGFsL0hhbDg3MjNQd3JTZXEubwlcCi0JCWhhbC9IYWw4NzIzVUhXSW1nX0NFLm8JXAotCQloYWwvSGFsRE1PdXRTcmM4NzIzQV9DRS5vIFwKLQkJaGFsL0hhbEhXSW1nODcyM0FfQkIubwlcCi0JCWhhbC9IYWxIV0ltZzg3MjNBX01BQy5vCVwKLQkJaGFsL0hhbEhXSW1nODcyM0FfUkYubwlcCi0JCWhhbC9IYWxQd3JTZXFDbWQubwlcCi0JCWhhbC9vZG1fUmVnQ29uZmlnODcyM0EubyBcCi0JCWhhbC9vZG1fZGVidWcubwkJXAotCQloYWwvb2RtX2ludGVyZmFjZS5vCVwKLQkJaGFsL29kbV9IV0NvbmZpZy5vCVwKLQkJaGFsL29kbS5vCQlcCi0JCWhhbC9ydGw4NzIzYV9jbWQubwlcCi0JCWhhbC9ydGw4NzIzYV9kbS5vCVwKLQkJaGFsL3J0bDg3MjNhX2hhbF9pbml0Lm8JXAotCQloYWwvcnRsODcyM2FfcGh5Y2ZnLm8JXAotCQloYWwvcnRsODcyM2FfcmY2MDUyLm8JXAotCQloYWwvcnRsODcyM2FfcnhkZXNjLm8JXAotCQloYWwvcnRsODcyM2Ffc3Jlc2V0Lm8JXAotCQloYWwvcnRsODcyM2F1X3JlY3YubwlcCi0JCWhhbC9ydGw4NzIzYXVfeG1pdC5vCVwKLQkJaGFsL3VzYl9oYWxpbml0Lm8JXAotCQloYWwvdXNiX29wc19saW51eC5vCVwKLQkJb3NfZGVwL2lvY3RsX2NmZzgwMjExLm8JXAotCQlvc19kZXAvbWxtZV9saW51eC5vCVwKLQkJb3NfZGVwL29zX2ludGZzLm8JXAotCQlvc19kZXAvcmVjdl9saW51eC5vCVwKLQkJb3NfZGVwL3VzYl9pbnRmLm8JXAotCQlvc19kZXAvdXNiX29wc19saW51eC5vCVwKLQkJb3NfZGVwL3htaXRfbGludXgubwotCi1yODcyM2F1LSQoQ09ORklHXzg3MjNBVV9CVF9DT0VYSVNUKSArPSBoYWwvcnRsODcyM2FfYnQtY29leGlzdC5vCi1yODcyM2F1LSQoQ09ORklHXzg3MjNBVV9BUF9NT0RFKSArPSBjb3JlL3J0d19hcC5vCi0KLW9iai0kKENPTkZJR19SODcyM0FVKQk6PSByODcyM2F1Lm8KLQotY2NmbGFncy15ICs9ICQoY2FsbCBjYy1vcHRpb24sLVd0eXBlLWxpbWl0cywpCi1jY2ZsYWdzLXkgKz0gLURfX0NIRUNLX0VORElBTl9fIC1JJChzcmMpL2luY2x1ZGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvVE9ETwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJiODZlNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L1RPRE8KKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1UT0RPOgotLSBmaW5kIGFuZCByZW1vdmUgY29kZSB2YWxpZCBvbmx5IGZvciA1IEhHei4gTWFueSBvZiB0aGUgb2J2aW91cwotICBvbmVzIGhhdmUgYmVlbiByZW1vdmVkLCBidXQgdGhpbmdzIGxpa2UgY2hhbm5lbCA+IDE0IHN0aWxsIGV4aXN0LgotLSBmaW5kIGFuZCByZW1vdmUgYW55IGNvZGUgZm9yIG90aGVyIGNoaXBzIHRoYXQgaXMgbGVmdCBvdmVyCi0tIGNvbnZlcnQgYW55IHJlbWFpbmluZyB1bnVzdWFsIHZhcmlhYmxlIHR5cGVzCi0tIGZpbmQgY29kZXMgdGhhdCBjYW4gdXNlICVwTSBhbmQgJU5waCBmb3JtYXR0aW5nCi0tIGNoZWNrcGF0Y2gucGwgZml4ZXMgLSBtb3N0IG9mIHRoZSByZW1haW5pbmcgb25lcyBhcmUgbGluZXMgdG9vIGxvbmcuIE1hbnkKLSAgb2YgdGhlbSB3aWxsIHJlcXVpcmUgcmVmYWN0b3JpbmcKLS0gbWVyZ2UgUmVhbHRlaydzIGJ1Z2ZpeGVzIGFuZCBuZXcgZmVhdHVyZXMgaW50byB0aGUgZHJpdmVyCi0tIHN3aXRjaCB0byB1c2UgTUFDODAyMTEKLQotQSBtYWM4MDIxMSBkcml2ZXIgZm9yIHRoaXMgaGFyZHdhcmUgYWxyZWFkeSB3YXMgaW50ZWdyYXRlZCBhdAotZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGw4eHh4dS8KLQotUGxlYXNlIHNlbmQgYW55IHBhdGNoZXMgdG8gR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAbGludXhmb3VuZGF0aW9uLm9yZz4sCi1KZXMgU29yZW5zZW4gPEplcy5Tb3JlbnNlbkByZWRoYXQuY29tPiwgYW5kIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X2FwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X2FwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZDY4NmQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19hcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTczOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEyIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX1JUV19BUF9DXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgotI2luY2x1ZGUgPHdpZmkuaD4KLSNpbmNsdWRlIDxydGw4NzIzYV9jbWQuaD4KLSNpbmNsdWRlIDxydGw4NzIzYV9oYWwuaD4KLSNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+Ci0jaW5jbHVkZSA8cnR3X21sbWVfZXh0Lmg+Ci0KLXZvaWQgaW5pdF9tbG1lX2FwX2luZm8yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IHdsYW5fYWNsX3Bvb2wgKnBhY2xfbGlzdCA9ICZwc3RhcHJpdi0+YWNsX2xpc3Q7Ci0KLQlzcGluX2xvY2tfaW5pdCgmcG1sbWVwcml2LT5iY25fdXBkYXRlX2xvY2spOwotCi0JLyogZm9yIEFDTCAqLwotCV9ydHdfaW5pdF9xdWV1ZTIzYSgmcGFjbF9saXN0LT5hY2xfbm9kZV9xKTsKLQotCXN0YXJ0X2FwX21vZGUyM2EocGFkYXB0ZXIpOwotfQotCi12b2lkIGZyZWVfbWxtZV9hcF9pbmZvMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhID0gTlVMTDsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCXBtbG1lcHJpdi0+dXBkYXRlX2JjbiA9IGZhbHNlOwotCXBtbG1lZXh0LT5ic3RhcnRfYnNzID0gZmFsc2U7Ci0KLQlydHdfc3RhX2ZsdXNoMjNhKHBhZGFwdGVyKTsKLQotCXBtbG1laW5mby0+c3RhdGUgPSBNU1JfTk9MSU5LOwotCi0JLyogZnJlZV9hc3NvY19zdGFfcmVzb3VyY2VzICovCi0JcnR3X2ZyZWVfYWxsX3N0YWluZm8yM2EocGFkYXB0ZXIpOwotCi0JLyogZnJlZSBiYy9tYyBzdGFfaW5mbyAqLwotCXBzdGEgPSBydHdfZ2V0X2JjbWNfc3RhaW5mbzIzYShwYWRhcHRlcik7Ci0Jc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0JcnR3X2ZyZWVfc3RhaW5mbzIzYShwYWRhcHRlciwgcHN0YSk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlX0JDTlRJTShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmtfbWxtZWV4dCA9ICZwbWxtZWluZm8tPm5ldHdvcms7Ci0JdW5zaWduZWQgY2hhciAqcGllID0gcG5ldHdvcmtfbWxtZWV4dC0+SUVzOwotCXU4ICpwLCAqZHN0X2llLCAqcHJlbWFpbmRlcl9pZSA9IE5VTEwsICpwYmFja3VwX3JlbWFpbmRlcl9pZSA9IE5VTEw7Ci0JdWludCBvZmZzZXQsIHRtcF9sZW4sIHRpbV9pZWxlbiwgdGltX2llX29mZnNldCwgcmVtYWluZGVyX2llbGVuOwotCi0JcCA9IHJ0d19nZXRfaWUyM2EocGllLCBXTEFOX0VJRF9USU0sICZ0aW1faWVsZW4sCi0JCQkgIHBuZXR3b3JrX21sbWVleHQtPklFTGVuZ3RoKTsKLQlpZiAocCAhPSBOVUxMICYmIHRpbV9pZWxlbiA+IDApIHsKLQkJdGltX2llbGVuICs9IDI7Ci0KLQkJcHJlbWFpbmRlcl9pZSA9IHArdGltX2llbGVuOwotCi0JCXRpbV9pZV9vZmZzZXQgPSAoaW50KShwIC0gcGllKTsKLQotCQlyZW1haW5kZXJfaWVsZW4gPSBwbmV0d29ya19tbG1lZXh0LT5JRUxlbmd0aCAtIHRpbV9pZV9vZmZzZXQgLSB0aW1faWVsZW47Ci0KLQkJLyogYXBwZW5kIFRJTSBJRSBmcm9tIGRzdF9pZSBvZmZzZXQgKi8KLQkJZHN0X2llID0gcDsKLQl9IGVsc2UgewotCQl0aW1faWVsZW4gPSAwOwotCi0JCS8qIGNhbGN1bGF0ZSBoZWFkX2xlbiAqLwotCQlvZmZzZXQgPSAwOwotCi0JCS8qIGdldCBzc2lkX2llIGxlbiAqLwotCQlwID0gcnR3X2dldF9pZTIzYShwaWUsIFdMQU5fRUlEX1NTSUQsCi0JCQkJICAmdG1wX2xlbiwgcG5ldHdvcmtfbWxtZWV4dC0+SUVMZW5ndGgpOwotCQlpZiAocCAhPSBOVUxMKQotCQkJb2Zmc2V0ICs9IHRtcF9sZW4rMjsKLQotCQkvKiAgZ2V0IHN1cHBvcnRlZCByYXRlcyBsZW4gKi8KLQkJcCA9IHJ0d19nZXRfaWUyM2EocGllLCBXTEFOX0VJRF9TVVBQX1JBVEVTLAotCQkJCSAgJnRtcF9sZW4sIHBuZXR3b3JrX21sbWVleHQtPklFTGVuZ3RoKTsKLQkJaWYgKHAgIT0gIE5VTEwpCi0JCQlvZmZzZXQgKz0gdG1wX2xlbisyOwotCi0JCS8qIERTIFBhcmFtZXRlciBTZXQgSUUsIGxlbiA9IDMgKi8KLQkJb2Zmc2V0ICs9IDM7Ci0KLQkJcHJlbWFpbmRlcl9pZSA9IHBpZSArIG9mZnNldDsKLQotCQlyZW1haW5kZXJfaWVsZW4gPSBwbmV0d29ya19tbG1lZXh0LT5JRUxlbmd0aCAtIG9mZnNldCAtIHRpbV9pZWxlbjsKLQotCQkvKiBhcHBlbmQgVElNIElFIGZyb20gb2Zmc2V0ICovCi0JCWRzdF9pZSA9IHBpZSArIG9mZnNldDsKLQl9Ci0KLQlpZiAocmVtYWluZGVyX2llbGVuID4gMCkgewotCQlwYmFja3VwX3JlbWFpbmRlcl9pZSA9IGttYWxsb2MocmVtYWluZGVyX2llbGVuLCBHRlBfQVRPTUlDKTsKLQkJaWYgKHBiYWNrdXBfcmVtYWluZGVyX2llICYmIHByZW1haW5kZXJfaWUpCi0JCQltZW1jcHkocGJhY2t1cF9yZW1haW5kZXJfaWUsIHByZW1haW5kZXJfaWUsIHJlbWFpbmRlcl9pZWxlbik7Ci0JfQotCi0JKmRzdF9pZSsrID0gV0xBTl9FSURfVElNOwotCi0JaWYgKChwc3RhcHJpdi0+dGltX2JpdG1hcCYweGZmMDApICYmIChwc3RhcHJpdi0+dGltX2JpdG1hcCYweDAwZmMpKQotCQl0aW1faWVsZW4gPSA1OwotCWVsc2UKLQkJdGltX2llbGVuID0gNDsKLQotCSpkc3RfaWUrKyA9IHRpbV9pZWxlbjsKLQotCSpkc3RfaWUrKyA9IDA7IC8qIERUSU0gY291bnQgKi8KLQkqZHN0X2llKysgPSAxOyAvKiBEVElNIHBlcmlvZCAqLwotCi0JaWYgKHBzdGFwcml2LT50aW1fYml0bWFwICYgQklUKDApKSAvKiBmb3IgYmMvbWMgZnJhbWVzICovCi0JCSpkc3RfaWUrKyA9IEJJVCgwKTsJICAgLyogYml0bWFwIGN0cmwgKi8KLQllbHNlCi0JCSpkc3RfaWUrKyA9IDA7Ci0KLQlpZiAodGltX2llbGVuID09IDQpIHsKLQkJKmRzdF9pZSsrID0gcHN0YXByaXYtPnRpbV9iaXRtYXAgJiAweGZmOwotCX0gZWxzZSBpZiAodGltX2llbGVuID09IDUpIHsKLQkJcHV0X3VuYWxpZ25lZF9sZTE2KHBzdGFwcml2LT50aW1fYml0bWFwLCBkc3RfaWUpOwotCQlkc3RfaWUgKz0gMjsKLQl9Ci0KLQkvKiBjb3B5IHJlbWFpbmRlciBJRSAqLwotCWlmIChwYmFja3VwX3JlbWFpbmRlcl9pZSkgewotCQltZW1jcHkoZHN0X2llLCBwYmFja3VwX3JlbWFpbmRlcl9pZSwgcmVtYWluZGVyX2llbGVuKTsKLQotCQlrZnJlZShwYmFja3VwX3JlbWFpbmRlcl9pZSk7Ci0JfQotCi0Jb2Zmc2V0ID0gICh1aW50KShkc3RfaWUgLSBwaWUpOwotCXBuZXR3b3JrX21sbWVleHQtPklFTGVuZ3RoID0gb2Zmc2V0ICsgcmVtYWluZGVyX2llbGVuOwotCi0Jc2V0X3R4X2JlYWNvbl9jbWQyM2EocGFkYXB0ZXIpOwotfQotCi1zdGF0aWMgdTggY2hrX3N0YV9pc19hbGl2ZShzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0JdTggcmV0ID0gZmFsc2U7Ci0KLQlpZiAoKHBzdGEtPnN0YV9zdGF0cy5sYXN0X3J4X2RhdGFfcGt0cyArCi0JICAgIHBzdGEtPnN0YV9zdGF0cy5sYXN0X3J4X2N0cmxfcGt0cykgIT0KLQkgICAgKHBzdGEtPnN0YV9zdGF0cy5yeF9kYXRhX3BrdHMgKyBwc3RhLT5zdGFfc3RhdHMucnhfY3RybF9wa3RzKSkKLQkJcmV0ID0gdHJ1ZTsKLQotCXN0YV91cGRhdGVfbGFzdF9yeF9wa3RzKHBzdGEpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBleHBpcmVfdGltZW91dF9jaGsyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQl1OCB1cGRhdGVkID0gMDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEsICpwdG1wOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0JdTggY2hrX2FsaXZlX251bSA9IDA7Ci0Jc3RydWN0IHN0YV9pbmZvICpjaGtfYWxpdmVfbGlzdFtOVU1fU1RBXTsKLQlpbnQgaTsKLQotCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPmF1dGhfbGlzdF9sb2NrKTsKLQlwaGVhZCA9ICZwc3RhcHJpdi0+YXV0aF9saXN0OwotCS8qIGNoZWNrIGF1dGhfcXVldWUgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHN0YSwgcHRtcCwgcGhlYWQsIGF1dGhfbGlzdCkgewotCQlpZiAocHN0YS0+ZXhwaXJlX3RvID4gMCkgewotCQkJcHN0YS0+ZXhwaXJlX3RvLS07Ci0JCQlpZiAocHN0YS0+ZXhwaXJlX3RvID09IDApIHsKLQkJCQlsaXN0X2RlbF9pbml0KCZwc3RhLT5hdXRoX2xpc3QpOwotCQkJCXBzdGFwcml2LT5hdXRoX2xpc3RfY250LS07Ci0KLQkJCQlEQkdfODcyM0EoImF1dGggZXhwaXJlICVwTVxuIiwgcHN0YS0+aHdhZGRyKTsKLQotCQkJCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+YXV0aF9saXN0X2xvY2spOwotCi0JCQkJc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0JCQkJcnR3X2ZyZWVfc3RhaW5mbzIzYShwYWRhcHRlciwgcHN0YSk7Ci0JCQkJc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLQotCQkJCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPmF1dGhfbGlzdF9sb2NrKTsKLQkJCX0KLQkJfQotCX0KLQlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPmF1dGhfbGlzdF9sb2NrKTsKLQotCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKLQlwaGVhZCA9ICZwc3RhcHJpdi0+YXNvY19saXN0OwotCS8qIGNoZWNrIGFzb2NfcXVldWUgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHN0YSwgcHRtcCwgcGhlYWQsIGFzb2NfbGlzdCkgewotCQlpZiAoY2hrX3N0YV9pc19hbGl2ZShwc3RhKSB8fCAhcHN0YS0+ZXhwaXJlX3RvKSB7Ci0JCQlwc3RhLT5leHBpcmVfdG8gPSBwc3RhcHJpdi0+ZXhwaXJlX3RvOwotCQkJcHN0YS0+a2VlcF9hbGl2ZV90cnljbnQgPSAwOwotCQl9IGVsc2UgewotCQkJcHN0YS0+ZXhwaXJlX3RvLS07Ci0JCX0KLQotCQlpZiAocHN0YS0+ZXhwaXJlX3RvIDw9IDApIHsKLQkJCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0KLQkJCWlmIChwYWRhcHRlci0+cmVnaXN0cnlwcml2LndpZmlfc3BlYyA9PSAxKSB7Ci0JCQkJcHN0YS0+ZXhwaXJlX3RvID0gcHN0YXByaXYtPmV4cGlyZV90bzsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKHBzdGEtPnN0YXRlICYgV0lGSV9TTEVFUF9TVEFURSkgewotCQkJCWlmICghKHBzdGEtPnN0YXRlICYgV0lGSV9TVEFfQUxJVkVfQ0hLX1NUQVRFKSkgewotCQkJCQkvKgotCQkJCQkgKiBjaGVjayBpZiBhbGl2ZSBieSBhbm90aGVyIG1ldGhvZAotCQkJCQkgKiBpZiBzdGF0aW9uIGlzIGF0IHBzIG1vZGUuCi0JCQkJCSAqLwotCQkJCQlwc3RhLT5leHBpcmVfdG8gPSBwc3RhcHJpdi0+ZXhwaXJlX3RvOwotCQkJCQlwc3RhLT5zdGF0ZSB8PSBXSUZJX1NUQV9BTElWRV9DSEtfU1RBVEU7Ci0JCQkJCS8qCi0JCQkJCSAqIHVwZGF0ZSBiY24gd2l0aCB0aW1fYml0bWFwCi0JCQkJCSAqIGZvciB0aGlzIHN0YXRpb24KLQkJCQkJICovCi0JCQkJCXBzdGFwcml2LT50aW1fYml0bWFwIHw9IENIS0JJVChwc3RhLT5haWQpOwotCQkJCQl1cGRhdGVfYmVhY29uMjNhKHBhZGFwdGVyLCBXTEFOX0VJRF9USU0sIE5VTEwsIGZhbHNlKTsKLQotCQkJCQlpZiAoIXBtbG1lZXh0LT5hY3RpdmVfa2VlcF9hbGl2ZV9jaGVjaykKLQkJCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHBtbG1lZXh0LT5hY3RpdmVfa2VlcF9hbGl2ZV9jaGVjaykgewotCQkJCWNoa19hbGl2ZV9saXN0W2Noa19hbGl2ZV9udW0rK10gPSBwc3RhOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlsaXN0X2RlbF9pbml0KCZwc3RhLT5hc29jX2xpc3QpOwotCQkJcHN0YXByaXYtPmFzb2NfbGlzdF9jbnQtLTsKLQotCQkJREJHXzg3MjNBKCJhc29jIGV4cGlyZSAlcE0sIHN0YXRlID0gMHgleFxuIiwKLQkJCQkgIHBzdGEtPmh3YWRkciwgcHN0YS0+c3RhdGUpOwotCQkJdXBkYXRlZCA9IGFwX2ZyZWVfc3RhMjNhKHBhZGFwdGVyLCBwc3RhLCBmYWxzZSwgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcpOwotCQl9IGVsc2UgewotCQkJLyoKLQkJCSAqIFRPRE86IEFnaW5nIG1lY2hhbmlzbSB0byBkaWdlc3QgZnJhbWVzIGluCi0JCQkgKiBzbGVlcF9xIHRvIGF2b2lkIHJ1bm5pbmcgb3V0IG9mIHhtaXRmcmFtZQotCQkJICovCi0JCQlpZiAocHN0YS0+c2xlZXBxX2xlbiA+IChOUl9YTUlURlJBTUUvcHN0YXByaXYtPmFzb2NfbGlzdF9jbnQpCi0JCQkJJiYgcGFkYXB0ZXItPnhtaXRwcml2LmZyZWVfeG1pdGZyYW1lX2NudCA8ICgoTlJfWE1JVEZSQU1FL3BzdGFwcml2LT5hc29jX2xpc3RfY250KS8yKQotCQkJKSB7Ci0JCQkJREJHXzg3MjNBKCIlcyBzdGE6JXBNLCBzbGVlcHFfbGVuOiV1LCBmcmVlX3htaXRmcmFtZV9jbnQ6JXUsIGFzb2NfbGlzdF9jbnQ6JXUsIGNsZWFyIHNsZWVwX3FcbiIsCi0JCQkJCSAgX19mdW5jX18sCi0JCQkJCSAgcHN0YS0+aHdhZGRyLAotCQkJCQkgIHBzdGEtPnNsZWVwcV9sZW4sCi0JCQkJCSAgcGFkYXB0ZXItPnhtaXRwcml2LmZyZWVfeG1pdGZyYW1lX2NudCwKLQkJCQkJICBwc3RhcHJpdi0+YXNvY19saXN0X2NudCk7Ci0JCQkJd2FrZXVwX3N0YV90b194bWl0MjNhKHBhZGFwdGVyLCBwc3RhKTsKLQkJCX0KLQkJfQotCX0KLQlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKLQotCWlmIChjaGtfYWxpdmVfbnVtKSB7Ci0KLQkJdTggYmFja3VwX29wZXJfY2hhbm5lbCA9IDA7Ci0JCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0JCS8qCi0JCSAqIHN3aXRjaCB0byBjb3JyZWN0IGNoYW5uZWwgb2YgY3VycmVudAotCQkgKiBuZXR3b3JrIGJlZm9yZSBpc3N1ZSBrZWVwLWFsaXZlIGZyYW1lcwotCQkgKi8KLQkJaWYgKHJ0d19nZXRfb3Blcl9jaDIzYShwYWRhcHRlcikgIT0gcG1sbWVleHQtPmN1cl9jaGFubmVsKSB7Ci0JCQliYWNrdXBfb3Blcl9jaGFubmVsID0gcnR3X2dldF9vcGVyX2NoMjNhKHBhZGFwdGVyKTsKLQkJCVNlbGVjdENoYW5uZWwyM2EocGFkYXB0ZXIsIHBtbG1lZXh0LT5jdXJfY2hhbm5lbCk7Ci0JCX0KLQotCS8qIGlzc3VlIG51bGwgZGF0YSB0byBjaGVjayBzdGEgYWxpdmUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY2hrX2FsaXZlX251bTsgaSsrKSB7Ci0KLQkJaW50IHJldCA9IF9GQUlMOwotCi0JCXBzdGEgPSBjaGtfYWxpdmVfbGlzdFtpXTsKLQkJaWYgKCEocHN0YS0+c3RhdGUgJiBfRldfTElOS0VEKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChwc3RhLT5zdGF0ZSAmIFdJRklfU0xFRVBfU1RBVEUpCi0JCQlyZXQgPSBpc3N1ZV9udWxsZGF0YTIzYShwYWRhcHRlciwgcHN0YS0+aHdhZGRyLCAwLCAxLCA1MCk7Ci0JCWVsc2UKLQkJCXJldCA9IGlzc3VlX251bGxkYXRhMjNhKHBhZGFwdGVyLCBwc3RhLT5od2FkZHIsIDAsIDMsIDUwKTsKLQotCQlwc3RhLT5rZWVwX2FsaXZlX3RyeWNudCsrOwotCQlpZiAocmV0ID09IF9TVUNDRVNTKSB7Ci0JCQlEQkdfODcyM0EoImFzb2MgY2hlY2ssIHN0YSglcE0pIGlzIGFsaXZlXG4iLAotCQkJCSAgcHN0YS0+aHdhZGRyKTsKLQkJCXBzdGEtPmV4cGlyZV90byA9IHBzdGFwcml2LT5leHBpcmVfdG87Ci0JCQlwc3RhLT5rZWVwX2FsaXZlX3RyeWNudCA9IDA7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIGlmIChwc3RhLT5rZWVwX2FsaXZlX3RyeWNudCA8PSAzKSB7Ci0JCQlEQkdfODcyM0EoImFjayBjaGVjayBmb3IgYXNvYyBleHBpcmUsIGtlZXBfYWxpdmVfdHJ5Y250ID0lZFxuIiwgcHN0YS0+a2VlcF9hbGl2ZV90cnljbnQpOwotCQkJcHN0YS0+ZXhwaXJlX3RvID0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJcHN0YS0+a2VlcF9hbGl2ZV90cnljbnQgPSAwOwotCi0JCURCR184NzIzQSgiYXNvYyBleHBpcmUgJXBNLCBzdGF0ZSA9IDB4JXhcbiIsCi0JCQkgIHBzdGEtPmh3YWRkciwgcHN0YS0+c3RhdGUpOwotCQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0JCWlmICghbGlzdF9lbXB0eSgmcHN0YS0+YXNvY19saXN0KSkgewotCQkJbGlzdF9kZWxfaW5pdCgmcHN0YS0+YXNvY19saXN0KTsKLQkJCXBzdGFwcml2LT5hc29jX2xpc3RfY250LS07Ci0JCQl1cGRhdGVkID0gYXBfZnJlZV9zdGEyM2EocGFkYXB0ZXIsIHBzdGEsIGZhbHNlLCBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0KLQl9Ci0KLQlpZiAoYmFja3VwX29wZXJfY2hhbm5lbCA+IDApIC8qIGJhY2sgdG8gb3JpZ2luYWwgb3BlcmF0aW9uIGNoYW5uZWwgKi8KLQkJU2VsZWN0Q2hhbm5lbDIzYShwYWRhcHRlciwgYmFja3VwX29wZXJfY2hhbm5lbCk7Ci19Ci0KLQlhc3NvY2lhdGVkX2NsaWVudHNfdXBkYXRlMjNhKHBhZGFwdGVyLCB1cGRhdGVkKTsKLX0KLQotdm9pZCBhZGRfUkFUaWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhLCB1OCByc3NpX2xldmVsKQotewotCWludCBpOwotCXU4IHJmX3R5cGU7Ci0JdTMyIGluaXRfcmF0ZSA9IDA7Ci0JdW5zaWduZWQgY2hhciBzdGFfYmFuZCA9IDAsIHJhaWQsIHNob3J0R0lyYXRlID0gZmFsc2U7Ci0JdW5zaWduZWQgY2hhciBsaW1pdDsKLQl1bnNpZ25lZCBpbnQgdHhfcmFfYml0bWFwID0gMDsKLQlzdHJ1Y3QgaHRfcHJpdiAqcHN0YV9odCA9IE5VTEw7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcGN1cl9uZXR3b3JrID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yazsKLQotCWlmIChwc3RhKQotCQlwc3RhX2h0ID0gJnBzdGEtPmh0cHJpdjsKLQllbHNlCi0JCXJldHVybjsKLQotCWlmICghKHBzdGEtPnN0YXRlICYgX0ZXX0xJTktFRCkpCi0JCXJldHVybjsKLQotCS8qIGIvZyBtb2RlIHJhX2JpdG1hcCAqLwotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocHN0YS0+YnNzcmF0ZXNldCk7IGkrKykgewotCQlpZiAocHN0YS0+YnNzcmF0ZXNldFtpXSkKLQkJCXR4X3JhX2JpdG1hcCB8PSBydHdfZ2V0X2JpdF92YWx1ZV9mcm9tX2llZWVfdmFsdWUyM2EocHN0YS0+YnNzcmF0ZXNldFtpXSYweDdmKTsKLQl9Ci0JLyogbiBtb2RlIHJhX2JpdG1hcCAqLwotCWlmIChwc3RhX2h0LT5odF9vcHRpb24pIHsKLQkJcmZfdHlwZSA9IHJ0bDg3MjNhX2dldF9yZl90eXBlKHBhZGFwdGVyKTsKLQotCQlpZiAocmZfdHlwZSA9PSBSRl8yVDJSKQotCQkJbGltaXQgPSAxNjsgLyogMlIgKi8KLQkJZWxzZQotCQkJbGltaXQgPSA4OyAgLyogMVIgKi8KLQotCQlmb3IgKGkgPSAwOyBpIDwgbGltaXQ7IGkrKykgewotCQkJaWYgKHBzdGFfaHQtPmh0X2NhcC5tY3MucnhfbWFza1tpIC8gOF0gJiBCSVQoaSAlIDgpKQotCQkJCXR4X3JhX2JpdG1hcCB8PSBCSVQoaSArIDEyKTsKLQkJfQotCi0JCS8qIG1heCBzaG9ydCBHSSByYXRlICovCi0JCXNob3J0R0lyYXRlID0gcHN0YV9odC0+c2dpOwotCX0KLQotCWlmIChwY3VyX25ldHdvcmstPkRTQ29uZmlnID4gMTQpIHsKLQkJLyogIDVHIGJhbmQgKi8KLQkJaWYgKHR4X3JhX2JpdG1hcCAmIDB4ZmZmZjAwMCkKLQkJCXN0YV9iYW5kIHw9IFdJUkVMRVNTXzExXzVOIHwgV0lSRUxFU1NfMTFBOwotCQllbHNlCi0JCQlzdGFfYmFuZCB8PSBXSVJFTEVTU18xMUE7Ci0JfSBlbHNlIHsKLQkJaWYgKHR4X3JhX2JpdG1hcCAmIDB4ZmZmZjAwMCkKLQkJCXN0YV9iYW5kIHw9IFdJUkVMRVNTXzExXzI0TiB8IFdJUkVMRVNTXzExRyB8IFdJUkVMRVNTXzExQjsKLQkJZWxzZSBpZiAodHhfcmFfYml0bWFwICYgMHhmZjApCi0JCQlzdGFfYmFuZCB8PSBXSVJFTEVTU18xMUcgfCBXSVJFTEVTU18xMUI7Ci0JCWVsc2UKLQkJCXN0YV9iYW5kIHw9IFdJUkVMRVNTXzExQjsKLQl9Ci0KLQlwc3RhLT53aXJlbGVzc19tb2RlID0gc3RhX2JhbmQ7Ci0KLQlyYWlkID0gbmV0d29ya3R5cGVfdG9fcmFpZDIzYShzdGFfYmFuZCk7Ci0JaW5pdF9yYXRlID0gZ2V0X2hpZ2hlc3RfcmF0ZV9pZHgyM2EodHhfcmFfYml0bWFwJjB4MGZmZmZmZmYpJjB4M2Y7Ci0KLQlpZiAocHN0YS0+YWlkIDwgTlVNX1NUQSkgewotCQl1OCBhcmc7Ci0KLQkJYXJnID0gcHN0YS0+bWFjX2lkJjB4MWY7Ci0KLQkJYXJnIHw9IEJJVCg3KTsgLyogc3VwcG9ydCBlbnRyeSAyfjMxICovCi0KLQkJaWYgKHNob3J0R0lyYXRlID09IHRydWUpCi0JCQlhcmcgfD0gQklUKDUpOwotCi0JCXR4X3JhX2JpdG1hcCB8PSAoKHJhaWQ8PDI4KSYweGYwMDAwMDAwKTsKLQotCQlEQkdfODcyM0EoIiVzID0+IG1hY19pZDolZCAsIHJhaWQ6JWQgLCBiaXRtYXAgPSAweCV4LCBhcmcgPSAiCi0JCQkgICIweCV4XG4iLAotCQkJICBfX2Z1bmNfXywgcHN0YS0+bWFjX2lkLCByYWlkLCB0eF9yYV9iaXRtYXAsIGFyZyk7Ci0KLQkJLyogYml0bWFwWzA6MjddID0gdHhfcmF0ZV9iaXRtYXAgKi8KLQkJLyogYml0bWFwWzI4OjMxXT0gUmF0ZSBBZGFwdGl2ZSBpZCAqLwotCQkvKiBhcmdbMDo0XSA9IG1hY2lkICovCi0JCS8qIGFyZ1s1XSA9IFNob3J0IEdJICovCi0JCXJ0bDg3MjNhX2FkZF9yYXRlYXRpZChwYWRhcHRlciwgdHhfcmFfYml0bWFwLCBhcmcsIHJzc2lfbGV2ZWwpOwotCi0JCWlmIChzaG9ydEdJcmF0ZSA9PSB0cnVlKQotCQkJaW5pdF9yYXRlIHw9IEJJVCg2KTsKLQotCQkvKiBzZXQgcmFfaWQsIGluaXRfcmF0ZSAqLwotCQlwc3RhLT5yYWlkID0gcmFpZDsKLQkJcHN0YS0+aW5pdF9yYXRlID0gaW5pdF9yYXRlOwotCi0JfSBlbHNlCi0JCURCR184NzIzQSgic3RhdGlvbiBhaWQgJWQgZXhjZWVkIHRoZSBtYXggbnVtYmVyXG4iLCBwc3RhLT5haWQpOwotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfYm1jX3N0YShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXUzMiBpbml0X3JhdGUgPSAwOwotCXVuc2lnbmVkIGNoYXIgbmV0d29ya190eXBlLCByYWlkOwotCWludCBpLCBzdXBwb3J0UmF0ZU51bSA9IDA7Ci0JdW5zaWduZWQgaW50IHR4X3JhX2JpdG1hcCA9IDA7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcGN1cl9uZXR3b3JrID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yazsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBydHdfZ2V0X2JjbWNfc3RhaW5mbzIzYShwYWRhcHRlcik7Ci0KLQlpZiAocHN0YSkgewotCQlwc3RhLT5haWQgPSAwOyAvKiBkZWZhdWx0IHNldCB0byAwICovCi0JCXBzdGEtPm1hY19pZCA9IHBzdGEtPmFpZCArIDE7Ci0KLQkJcHN0YS0+cW9zX29wdGlvbiA9IDA7Ci0JCXBzdGEtPmh0cHJpdi5odF9vcHRpb24gPSBmYWxzZTsKLQotCQlwc3RhLT5pZWVlODAyMXhfYmxvY2tlZCA9IDA7Ci0KLQkJbWVtc2V0KCh2b2lkICopJnBzdGEtPnN0YV9zdGF0cywgMCwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc3RhaW5mb19zdGF0cykpOwotCi0JCS8qIHByZXBhcmUgZm9yIGFkZF9SQVRpZDIzYSAqLwotCQlzdXBwb3J0UmF0ZU51bSA9IHJ0d19nZXRfcmF0ZXNldF9sZW4yM2EoKHU4ICopJnBjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMpOwotCQluZXR3b3JrX3R5cGUgPSBydHdfY2hlY2tfbmV0d29ya190eXBlMjNhKCh1OCAqKSZwY3VyX25ldHdvcmstPlN1cHBvcnRlZFJhdGVzLCBzdXBwb3J0UmF0ZU51bSwgMSk7Ci0KLQkJbWVtY3B5KHBzdGEtPmJzc3JhdGVzZXQsICZwY3VyX25ldHdvcmstPlN1cHBvcnRlZFJhdGVzLCBzdXBwb3J0UmF0ZU51bSk7Ci0JCXBzdGEtPmJzc3JhdGVsZW4gPSBzdXBwb3J0UmF0ZU51bTsKLQotCQkvKiBiL2cgbW9kZSByYV9iaXRtYXAgKi8KLQkJZm9yIChpID0gMDsgaSA8IHN1cHBvcnRSYXRlTnVtOyBpKyspIHsKLQkJCWlmIChwc3RhLT5ic3NyYXRlc2V0W2ldKQotCQkJCXR4X3JhX2JpdG1hcCB8PSBydHdfZ2V0X2JpdF92YWx1ZV9mcm9tX2llZWVfdmFsdWUyM2EocHN0YS0+YnNzcmF0ZXNldFtpXSYweDdmKTsKLQkJfQotCi0JCWlmIChwY3VyX25ldHdvcmstPkRTQ29uZmlnID4gMTQpIHsKLQkJCS8qIGZvcmNlIHRvIEEgbW9kZS4gNUcgZG9lc24ndCBzdXBwb3J0IENDSyByYXRlcyAqLwotCQkJbmV0d29ya190eXBlID0gV0lSRUxFU1NfMTFBOwotCQkJdHhfcmFfYml0bWFwID0gMHgxNTA7IC8qIDYsIDEyLCAyNCBNYnBzICovCi0JCX0gZWxzZSB7Ci0JCQkvKiBmb3JjZSB0byBiIG1vZGUgKi8KLQkJCW5ldHdvcmtfdHlwZSA9IFdJUkVMRVNTXzExQjsKLQkJCXR4X3JhX2JpdG1hcCA9IDB4ZjsKLQkJfQotCi0JCXJhaWQgPSBuZXR3b3JrdHlwZV90b19yYWlkMjNhKG5ldHdvcmtfdHlwZSk7Ci0JCWluaXRfcmF0ZSA9IGdldF9oaWdoZXN0X3JhdGVfaWR4MjNhKHR4X3JhX2JpdG1hcCYweDBmZmZmZmZmKSYweDNmOwotCi0JCS8qIGFwIG1vZGUgKi8KLQkJcnRsODcyM2FfU2V0SGFsT0RNVmFyKHBhZGFwdGVyLCBIQUxfT0RNX1NUQV9JTkZPLCBwc3RhLCB0cnVlKTsKLQotCQl7Ci0JCQl1OCBhcmc7Ci0KLQkJCWFyZyA9IHBzdGEtPm1hY19pZCYweDFmOwotCi0JCQlhcmcgfD0gQklUKDcpOwotCi0JCQl0eF9yYV9iaXRtYXAgfD0gKChyYWlkPDwyOCkmMHhmMDAwMDAwMCk7Ci0KLQkJCURCR184NzIzQSgidXBkYXRlX2JtY19zdGEsIG1hc2sgPSAweCV4LCBhcmcgPSAweCV4XG4iLCB0eF9yYV9iaXRtYXAsIGFyZyk7Ci0KLQkJCS8qIGJpdG1hcFswOjI3XSA9IHR4X3JhdGVfYml0bWFwICovCi0JCQkvKiBiaXRtYXBbMjg6MzFdPSBSYXRlIEFkYXB0aXZlIGlkICovCi0JCQkvKiBhcmdbMDo0XSA9IG1hY2lkICovCi0JCQkvKiBhcmdbNV0gPSBTaG9ydCBHSSAqLwotCQkJcnRsODcyM2FfYWRkX3JhdGVhdGlkKHBhZGFwdGVyLCB0eF9yYV9iaXRtYXAsIGFyZywgMCk7Ci0JCX0KLQotCQkvKiBzZXQgcmFfaWQsIGluaXRfcmF0ZSAqLwotCQlwc3RhLT5yYWlkID0gcmFpZDsKLQkJcHN0YS0+aW5pdF9yYXRlID0gaW5pdF9yYXRlOwotCi0JCXNwaW5fbG9ja19iaCgmcHN0YS0+bG9jayk7Ci0JCXBzdGEtPnN0YXRlID0gX0ZXX0xJTktFRDsKLQkJc3Bpbl91bmxvY2tfYmgoJnBzdGEtPmxvY2spOwotCi0JfSBlbHNlCi0JCURCR184NzIzQSgiYWRkX1JBVGlkMjNhX2JtY19zdGEgZXJyb3IhXG4iKTsKLX0KLQotLyoKLSAqIEFJRDogMX5NQVggZm9yIHN0YSBhbmQgMCBmb3IgYmMvbWMgaW4gYXAvYWRob2MgbW9kZQotICogTUFDX0lEID0gQUlEKzEgZm9yIHN0YSBpbiBhcC9hZGhvYyBtb2RlCi0gKiBNQUNfSUQgPSAxIGZvciBiYy9tYyBmb3Igc3RhL2FwL2FkaG9jCi0gKiBNQUNfSUQgPSAwIGZvciBic3NpZCBmb3Igc3RhL2FwL2FkaG9jCi0gKiBDQU1fSUQgPSAwfjMgZm9yIGRlZmF1bHQga2V5LCBjbWRfaWQgPSBtYWNpZCArIDMsIG1hY2lkID0gYWlkICsgMTsKLSAqLwotdm9pZCB1cGRhdGVfc3RhX2luZm8yM2FfYXBtb2RlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSkKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgaHRfcHJpdiAqcGh0cHJpdl9hcCA9ICZwbWxtZXByaXYtPmh0cHJpdjsKLQlzdHJ1Y3QgaHRfcHJpdiAqcGh0cHJpdl9zdGEgPSAmcHN0YS0+aHRwcml2OwotCS8qIHNldCBpbnRmX3RhZyB0byBpZjEgKi8KLQotCXBzdGEtPm1hY19pZCA9IHBzdGEtPmFpZCsxOwotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCS8qIGFwIG1vZGUgKi8KLQlydGw4NzIzYV9TZXRIYWxPRE1WYXIocGFkYXB0ZXIsIEhBTF9PRE1fU1RBX0lORk8sIHBzdGEsIHRydWUpOwotCi0JaWYgKHBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG0gPT0gZG90MTFBdXRoQWxncnRobV84MDIxWCkKLQkJcHN0YS0+aWVlZTgwMjF4X2Jsb2NrZWQgPSB0cnVlOwotCWVsc2UKLQkJcHN0YS0+aWVlZTgwMjF4X2Jsb2NrZWQgPSBmYWxzZTsKLQotCS8qIHVwZGF0ZSBzdGEncyBjYXAgKi8KLQotCS8qIEVSUCAqLwotCVZDU191cGRhdGUyM2EocGFkYXB0ZXIsIHBzdGEpOwotCS8qIEhUIHJlbGF0ZWQgY2FwICovCi0JaWYgKHBodHByaXZfc3RhLT5odF9vcHRpb24pIHsKLQkJLyogY2hlY2sgaWYgc3RhIHN1cHBvcnRzIHJ4IGFtcGR1ICovCi0JCXBodHByaXZfc3RhLT5hbXBkdV9lbmFibGUgPSBwaHRwcml2X2FwLT5hbXBkdV9lbmFibGU7Ci0KLQkJLyogY2hlY2sgaWYgc3RhIHN1cHBvcnQgcyBTaG9ydCBHSSAqLwotCQlpZiAoKHBodHByaXZfc3RhLT5odF9jYXAuY2FwX2luZm8gJiBwaHRwcml2X2FwLT5odF9jYXAuY2FwX2luZm8pICYgY3B1X3RvX2xlMTYoSUVFRTgwMjExX0hUX0NBUF9TR0lfMjB8SUVFRTgwMjExX0hUX0NBUF9TR0lfNDApKQotCQkJcGh0cHJpdl9zdGEtPnNnaSA9IHRydWU7Ci0KLQkJLyogYndtb2RlICovCi0JCWlmICgocGh0cHJpdl9zdGEtPmh0X2NhcC5jYXBfaW5mbyAmIHBodHByaXZfYXAtPmh0X2NhcC5jYXBfaW5mbykgJiBjcHVfdG9fbGUxNihJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCkpIHsKLQkJCS8qIHBodHByaXZfc3RhLT5id21vZGUgPSBIVF9DSEFOTkVMX1dJRFRIXzQwOyAqLwotCQkJcGh0cHJpdl9zdGEtPmJ3bW9kZSA9IHBtbG1lZXh0LT5jdXJfYndtb2RlOwotCQkJcGh0cHJpdl9zdGEtPmNoX29mZnNldCA9IHBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0OwotCi0JCX0KLQotCQlwc3RhLT5xb3Nfb3B0aW9uID0gdHJ1ZTsKLQotCX0gZWxzZSB7Ci0JCXBodHByaXZfc3RhLT5hbXBkdV9lbmFibGUgPSBmYWxzZTsKLQotCQlwaHRwcml2X3N0YS0+c2dpID0gZmFsc2U7Ci0JCXBodHByaXZfc3RhLT5id21vZGUgPSBIVF9DSEFOTkVMX1dJRFRIXzIwOwotCQlwaHRwcml2X3N0YS0+Y2hfb2Zmc2V0ID0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRTsKLQl9Ci0KLQkvKiBSeCBBTVBEVSAqLwotCXNlbmRfZGVsYmEyM2EocGFkYXB0ZXIsIDAsIHBzdGEtPmh3YWRkcik7IC8qIHJlY2lwaWVudCAqLwotCi0JLyogVFggQU1QRFUgKi8KLQlzZW5kX2RlbGJhMjNhKHBhZGFwdGVyLCAxLCBwc3RhLT5od2FkZHIpOyAvKiBvcmlnaW5hdG9yICovCi0JcGh0cHJpdl9zdGEtPmFnZ19lbmFibGVfYml0bWFwID0gMHgwOy8qIHJlc2V0ICovCi0JcGh0cHJpdl9zdGEtPmNhbmRpZGF0ZV90aWRfYml0bWFwID0gMHgwOy8qIHJlc2V0ICovCi0KLQkvKiB0b2RvOiBpbml0IG90aGVyIHZhcmlhYmxlcyAqLwotCi0JbWVtc2V0KCh2b2lkICopJnBzdGEtPnN0YV9zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBzdGFpbmZvX3N0YXRzKSk7Ci0KLQlzcGluX2xvY2tfYmgoJnBzdGEtPmxvY2spOwotCXBzdGEtPnN0YXRlIHw9IF9GV19MSU5LRUQ7Ci0Jc3Bpbl91bmxvY2tfYmgoJnBzdGEtPmxvY2spOwotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfaHdfaHRfcGFyYW0oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1bnNpZ25lZCBjaGFyIG1heF9BTVBEVV9sZW47Ci0JdW5zaWduZWQgY2hhciBtaW5fTVBEVV9zcGFjaW5nOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JLyoKLQkgKiBoYW5kbGUgQS1NUERVIHBhcmFtZXRlciBmaWVsZAotCSAqIEFNUERVX3BhcmEgWzE6MF06TWF4IEFNUERVIExlbiA9PiAwOjhrLCAxOjE2aywgMjozMmssIDM6NjRrCi0JICogQU1QRFVfcGFyYSBbNDoyXTpNaW4gTVBEVSBTdGFydCBTcGFjaW5nCi0JKi8KLQltYXhfQU1QRFVfbGVuID0gcG1sbWVpbmZvLT5odF9jYXAuYW1wZHVfcGFyYW1zX2luZm8gJgotCQlJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9GQUNUT1I7Ci0KLQltaW5fTVBEVV9zcGFjaW5nID0gKHBtbG1laW5mby0+aHRfY2FwLmFtcGR1X3BhcmFtc19pbmZvICYKLQkJCSAgICBJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9ERU5TSVRZKSA+PiAyOwotCi0JcnRsODcyM2Ffc2V0X2FtcGR1X21pbl9zcGFjZShwYWRhcHRlciwgbWluX01QRFVfc3BhY2luZyk7Ci0JcnRsODcyM2Ffc2V0X2FtcGR1X2ZhY3RvcihwYWRhcHRlciwgbWF4X0FNUERVX2xlbik7Ci0KLQkvKiBDb25maWcgU00gUG93ZXIgU2F2ZSBzZXR0aW5nICovCi0JcG1sbWVpbmZvLT5TTV9QUyA9IChsZTE2X3RvX2NwdShwbWxtZWluZm8tPmh0X2NhcC5jYXBfaW5mbykgJgotCQkJICAgIElFRUU4MDIxMV9IVF9DQVBfU01fUFMpID4+IDI7Ci0JaWYgKHBtbG1laW5mby0+U01fUFMgPT0gV0xBTl9IVF9DQVBfU01fUFNfU1RBVElDKQotCQlEQkdfODcyM0EoIiVzKCk6IFdMQU5fSFRfQ0FQX1NNX1BTX1NUQVRJQ1xuIiwgX19mdW5jX18pOwotfQotCi1zdGF0aWMgdm9pZCBzdGFydF9ic3NfbmV0d29yayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcGJ1ZikKLXsKLQljb25zdCB1OCAqcDsKLQl1OCB2YWw4LCBjdXJfY2hhbm5lbCwgY3VyX2J3bW9kZSwgY3VyX2NoX29mZnNldDsKLQl1MTYgYmNuX2ludGVydmFsOwotCXUzMiBhY3Bhcm07Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwbmV0d29yayA9ICZwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcms7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmtfbWxtZWV4dCA9ICZwbWxtZWluZm8tPm5ldHdvcms7Ci0Jc3RydWN0IGllZWU4MDIxMV9odF9vcGVyYXRpb24gKnBodF9pbmZvID0gTlVMTDsKLQotCWJjbl9pbnRlcnZhbCA9ICh1MTYpcG5ldHdvcmstPmJlYWNvbl9pbnRlcnZhbDsKLQljdXJfY2hhbm5lbCA9IHBuZXR3b3JrLT5EU0NvbmZpZzsKLQljdXJfYndtb2RlID0gSFRfQ0hBTk5FTF9XSURUSF8yMDsKLQljdXJfY2hfb2Zmc2V0ID0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRTsKLQotCS8qCi0JICogY2hlY2sgaWYgdGhlcmUgaXMgd3BzIGllCi0JICogaWYgdGhlcmUgaXMgd3BzaWUgaW4gYmVhY29uIHRoZSBob3N0YXBkIHdpbGwKLQkgKiB1cGRhdGUgYmVhY29uIHR3aWNlIHdoZW4gc3RhdGluZyBob3N0YXBkCi0JICogYW5kIGF0IGZpcnN0IHRpbWUgdGhlIHNlY3VyaXR5Ci0JICogaWUgKFJTTi9XUEEgSUUpIHdpbGwgbm90IGluY2x1ZGUgaW4gYmVhY29uCi0JICovCi0JaWYgKCFjZmc4MDIxMV9maW5kX3ZlbmRvcl9pZShXTEFOX09VSV9NSUNST1NPRlQsCi0JCQkJICAgICBXTEFOX09VSV9UWVBFX01JQ1JPU09GVF9XUFMsCi0JCQkJICAgICBwbmV0d29yay0+SUVzLAotCQkJCSAgICAgcG5ldHdvcmstPklFTGVuZ3RoKSkKLQkJcG1sbWVleHQtPmJzdGFydF9ic3MgPSB0cnVlOwotCi0JLyogdG9kbzogdXBkYXRlIHdtbSwgaHQgY2FwICovCi0JLyogcG1sbWVpbmZvLT5XTU1fZW5hYmxlOyAqLwotCS8qIHBtbG1laW5mby0+SFRfZW5hYmxlOyAqLwotCWlmIChwbWxtZXByaXYtPnFvc19vcHRpb24pCi0JCXBtbG1laW5mby0+V01NX2VuYWJsZSA9IHRydWU7Ci0JaWYgKHBtbG1lcHJpdi0+aHRwcml2Lmh0X29wdGlvbikgewotCQlwbWxtZWluZm8tPldNTV9lbmFibGUgPSB0cnVlOwotCQlwbWxtZWluZm8tPkhUX2VuYWJsZSA9IHRydWU7Ci0KLQkJdXBkYXRlX2h3X2h0X3BhcmFtKHBhZGFwdGVyKTsKLQl9Ci0KLQlpZiAocG1sbWVwcml2LT5jdXJfbmV0d29yay5qb2luX3JlcyAhPSB0cnVlKSB7Ci0JCS8qCi0JCSAqIHNldHRpbmcgb25seSBhdCBmaXJzdCB0aW1lCi0JCSAqIFdFUCBLZXkgd2lsbCBiZSBzZXQgYmVmb3JlIHRoaXMKLQkJICogZnVuY3Rpb24sIGRvIG5vdCBjbGVhciBDQU0uCi0JCSAqLwotCQlpZiAocHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSAhPQotCQkgICAgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgJiYKLQkJICAgIHBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gIT0KLQkJICAgIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkKLQkJCWZsdXNoX2FsbF9jYW1fZW50cnkyM2EocGFkYXB0ZXIpOwkvKiBjbGVhciBDQU0gKi8KLQl9Ci0KLQkvKiBzZXQgTVNSIHRvIEFQX01vZGUgKi8KLQlydGw4NzIzYV9zZXRfbWVkaWFfc3RhdHVzKHBhZGFwdGVyLCBNU1JfQVApOwotCi0JLyogU2V0IEJTU0lEIFJFRyAqLwotCWh3X3Zhcl9zZXRfYnNzaWQocGFkYXB0ZXIsIHBuZXR3b3JrLT5NYWNBZGRyZXNzKTsKLQotCS8qIFNldCBFRENBIHBhcmFtIHJlZyAqLwotCWFjcGFybSA9IDB4MDAyRjMyMTc7IC8qIFZPICovCi0JcnRsODcyM2Ffc2V0X2FjX3BhcmFtX3ZvKHBhZGFwdGVyLCBhY3Bhcm0pOwotCWFjcGFybSA9IDB4MDA1RTQzMTc7IC8qIFZJICovCi0JcnRsODcyM2Ffc2V0X2FjX3BhcmFtX3ZpKHBhZGFwdGVyLCBhY3Bhcm0pOwotCWFjcGFybSA9IDB4MDA1ZWE0MmI7Ci0JcnRsODcyM2Ffc2V0X2FjX3BhcmFtX2JlKHBhZGFwdGVyLCBhY3Bhcm0pOwotCWFjcGFybSA9IDB4MDAwMEE0NDQ7IC8qIEJLICovCi0JcnRsODcyM2Ffc2V0X2FjX3BhcmFtX2JrKHBhZGFwdGVyLCBhY3Bhcm0pOwotCi0JLyogU2V0IFNlY3VyaXR5ICovCi0JdmFsOCA9IChwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtID09IGRvdDExQXV0aEFsZ3J0aG1fODAyMVgpID8KLQkJMHhjYyA6IDB4Y2Y7Ci0JcnRsODcyM2Ffc2V0X3NlY19jZmcocGFkYXB0ZXIsIHZhbDgpOwotCi0JLyogQmVhY29uIENvbnRyb2wgcmVsYXRlZCByZWdpc3RlciAqLwotCXJ0bDg3MjNhX3NldF9iZWFjb25faW50ZXJ2YWwocGFkYXB0ZXIsIGJjbl9pbnRlcnZhbCk7Ci0KLQlVcGRhdGVCcmF0ZVRibDIzYShwYWRhcHRlciwgcG5ldHdvcmstPlN1cHBvcnRlZFJhdGVzKTsKLQlIYWxTZXRCcmF0ZUNmZzIzYShwYWRhcHRlciwgcG5ldHdvcmstPlN1cHBvcnRlZFJhdGVzKTsKLQotCWlmICghcG1sbWVwcml2LT5jdXJfbmV0d29yay5qb2luX3JlcykgewotCQkvKiBzZXR0aW5nIG9ubHkgYXQgIGZpcnN0IHRpbWUgKi8KLQotCQkvKiBkaXNhYmxlIGR5bmFtaWMgZnVuY3Rpb25zLCBzdWNoIGFzIGhpZ2ggcG93ZXIsIERJRyAqLwotCi0JCS8qIHR1cm4gb24gYWxsIGR5bmFtaWMgZnVuY3Rpb25zICovCi0JCXJ0bDg3MjNhX29kbV9zdXBwb3J0X2FiaWxpdHlfc2V0KHBhZGFwdGVyLAotCQkJCQkJIERZTkFNSUNfQUxMX0ZVTkNfRU5BQkxFKTsKLQl9Ci0JLyogc2V0IGNoYW5uZWwsIGJ3bW9kZSAqLwotCi0JcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfSFRfT1BFUkFUSU9OLCBwbmV0d29yay0+SUVzLAotCQkJICAgICBwbmV0d29yay0+SUVMZW5ndGgpOwotCWlmIChwICYmIHBbMV0pIHsKLQkJcGh0X2luZm8gPSAoc3RydWN0IGllZWU4MDIxMV9odF9vcGVyYXRpb24gKikocCArIDIpOwotCi0JCWlmIChwcmVncHJpdi0+Y2J3NDBfZW5hYmxlICYmIHBodF9pbmZvLT5odF9wYXJhbSAmCi0JCSAgICBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBTl9XSURUSF9BTlkpIHsKLQkJCS8qIHN3aXRjaCB0byB0aGUgNDBNIEh6IG1vZGUgKi8KLQkJCWN1cl9id21vZGUgPSBIVF9DSEFOTkVMX1dJRFRIXzQwOwotCQkJc3dpdGNoIChwaHRfaW5mby0+aHRfcGFyYW0gJgotCQkJCUlFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX09GRlNFVCkgewotCQkJY2FzZSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRToKLQkJCQkvKgotCQkJCSAqIHBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0ID0KLQkJCQkgKiBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfTE9XRVI7Ci0JCQkJICovCi0JCQkJY3VyX2NoX29mZnNldCA9IEhBTF9QUklNRV9DSE5MX09GRlNFVF9MT1dFUjsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQkVMT1c6Ci0JCQkJY3VyX2NoX29mZnNldCA9IEhBTF9QUklNRV9DSE5MX09GRlNFVF9VUFBFUjsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJY3VyX2NoX29mZnNldCA9IEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoKLQkgKiBUT0RPOiBuZWVkIHRvIGp1ZGdlIHRoZSBwaHkgcGFyYW1ldGVycwotCSAqIG9uIGNvbmN1cnJlbnQgbW9kZSBmb3Igc2luZ2xlIHBoeQotCSAqLwotCXNldF9jaGFubmVsX2J3bW9kZTIzYShwYWRhcHRlciwgY3VyX2NoYW5uZWwsIGN1cl9jaF9vZmZzZXQsIGN1cl9id21vZGUpOwotCi0JREJHXzg3MjNBKCJDSCA9JWQsIEJXID0lZCwgb2Zmc2V0ID0lZFxuIiwgY3VyX2NoYW5uZWwsIGN1cl9id21vZGUsCi0JCSAgY3VyX2NoX29mZnNldCk7Ci0KLQlwbWxtZWV4dC0+Y3VyX2NoYW5uZWwgPSBjdXJfY2hhbm5lbDsKLQlwbWxtZWV4dC0+Y3VyX2J3bW9kZSA9IGN1cl9id21vZGU7Ci0JcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQgPSBjdXJfY2hfb2Zmc2V0OwotCXBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSA9IHBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29ya190eXBlOwotCi0JLyogdXBkYXRlIGN1cl93aXJlbGVzc19tb2RlICovCi0JdXBkYXRlX3dpcmVsZXNzX21vZGUyM2EocGFkYXB0ZXIpOwotCi0JLyogdXBkYXRlIGNhcGFiaWxpdHkgYWZ0ZXIgY3VyX3dpcmVsZXNzX21vZGUgdXBkYXRlZCAqLwotCXVwZGF0ZV9jYXBpbmZvMjNhKHBhZGFwdGVyLCBwbmV0d29yay0+Y2FwYWJpbGl0eSk7Ci0KLQkvKiBsZXQgcG5ldHdvcmtfbWxtZWV4dCA9PSBwbmV0d29ya19tbG1lLiAqLwotCW1lbWNweShwbmV0d29ya19tbG1lZXh0LCBwbmV0d29yaywgcG5ldHdvcmstPkxlbmd0aCk7Ci0KLQlpZiAocG1sbWVleHQtPmJzdGFydF9ic3MpIHsKLQkJdXBkYXRlX2JlYWNvbjIzYShwYWRhcHRlciwgV0xBTl9FSURfVElNLCBOVUxMLCBmYWxzZSk7Ci0KLQkJLyogaXNzdWUgYmVhY29uIGZyYW1lICovCi0JCWlmIChzZW5kX2JlYWNvbjIzYShwYWRhcHRlcikgPT0gX0ZBSUwpCi0JCQlEQkdfODcyM0EoImlzc3VlX2JlYWNvbjIzYSwgZmFpbCFcbiIpOwotCX0KLQotCS8qIHVwZGF0ZSBiYy9tYyBzdGFfaW5mbyAqLwotCXVwZGF0ZV9ibWNfc3RhKHBhZGFwdGVyKTsKLX0KLQotaW50IHJ0d19jaGVja19iZWFjb25fZGF0YTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsIHVuc2lnbmVkIGludCBsZW4pCi17Ci0JaW50IHJldCA9IF9TVUNDRVNTOwotCXU4ICpwOwotCXU4ICpwSFRfY2Fwc19pZSA9IE5VTEw7Ci0JdTggKnBIVF9pbmZvX2llID0gTlVMTDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBOVUxMOwotCXUxNiBodF9jYXAgPSBmYWxzZTsKLQl1aW50IGllX2xlbiA9IDA7Ci0JaW50IGdyb3VwX2NpcGhlciwgcGFpcndpc2VfY2lwaGVyOwotCXU4IGNoYW5uZWwsIG5ldHdvcmtfdHlwZSwgc3VwcG9ydFJhdGVbTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYXTsKLQlpbnQgc3VwcG9ydFJhdGVOdW0gPSAwOwotCXU4IFdNTV9QQVJBX0lFW10gPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwMSwgMHgwMX07Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdpc3RyeXByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKnBic3NfbmV0d29yayA9ICZwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcms7Ci0JdTggKmllID0gcGJzc19uZXR3b3JrLT5JRXM7Ci0JdTggKnBidWYgPSBtZ210LT51LmJlYWNvbi52YXJpYWJsZTsKLQotCWxlbiAtPSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYmVhY29uLnZhcmlhYmxlKTsKLQkvKiBTU0lEICovCi0JLyogU3VwcG9ydGVkIHJhdGVzICovCi0JLyogRFMgUGFyYW1zICovCi0JLyogV0xBTl9FSURfQ09VTlRSWSAqLwotCS8qIEVSUCBJbmZvcm1hdGlvbiBlbGVtZW50ICovCi0JLyogRXh0ZW5kZWQgc3VwcG9ydGVkIHJhdGVzICovCi0JLyogV1BBL1dQQTIgKi8KLQkvKiBXaS1GaSBXaXJlbGVzcyBNdWx0aW1lZGlhIEV4dGVuc2lvbnMgKi8KLQkvKiBodF9jYXBhYiwgaHRfb3BlciAqLwotCS8qIFdQUyBJRSAqLwotCi0JREJHXzg3MjNBKCIlcywgbGVuID0lZFxuIiwgX19mdW5jX18sIGxlbik7Ci0KLQlpZiAoIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkKLQkJcmV0dXJuIF9GQUlMOwotCi0JaWYgKGxlbiA+IE1BWF9JRV9TWikKLQkJcmV0dXJuIF9GQUlMOwotCi0JcGJzc19uZXR3b3JrLT5JRUxlbmd0aCA9IGxlbjsKLQotCW1lbXNldChpZSwgMCwgTUFYX0lFX1NaKTsKLQotCW1lbWNweShpZSwgcGJ1ZiwgcGJzc19uZXR3b3JrLT5JRUxlbmd0aCk7Ci0KLQlpZiAocGJzc19uZXR3b3JrLT5pZm1vZGUgIT0gTkw4MDIxMV9JRlRZUEVfQVAgJiYKLQkgICAgcGJzc19uZXR3b3JrLT5pZm1vZGUgIT0gTkw4MDIxMV9JRlRZUEVfUDJQX0dPKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQlwYnNzX25ldHdvcmstPlJzc2kgPSAwOwotCi0JbWVtY3B5KHBic3NfbmV0d29yay0+TWFjQWRkcmVzcywgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpLCBFVEhfQUxFTik7Ci0KLQkvKiBTU0lEICovCi0JcCA9IHJ0d19nZXRfaWUyM2EoaWUsIFdMQU5fRUlEX1NTSUQsICZpZV9sZW4sIHBic3NfbmV0d29yay0+SUVMZW5ndGgpOwotCWlmIChwICYmIGllX2xlbiA+IDApIHsKLQkJbWVtc2V0KCZwYnNzX25ldHdvcmstPlNzaWQsIDAsIHNpemVvZihzdHJ1Y3QgY2ZnODAyMTFfc3NpZCkpOwotCQltZW1jcHkocGJzc19uZXR3b3JrLT5Tc2lkLnNzaWQsIChwICsgMiksIGllX2xlbik7Ci0JCXBic3NfbmV0d29yay0+U3NpZC5zc2lkX2xlbiA9IGllX2xlbjsKLQl9Ci0KLQkvKiBjaGFubmVsICovCi0JY2hhbm5lbCA9IDA7Ci0JcCA9IHJ0d19nZXRfaWUyM2EoaWUsIFdMQU5fRUlEX0RTX1BBUkFNUywgJmllX2xlbiwKLQkJCSAgcGJzc19uZXR3b3JrLT5JRUxlbmd0aCk7Ci0JaWYgKHAgJiYgaWVfbGVuID4gMCkKLQkJY2hhbm5lbCA9ICoocCArIDIpOwotCi0JcGJzc19uZXR3b3JrLT5EU0NvbmZpZyA9IGNoYW5uZWw7Ci0KLQltZW1zZXQoc3VwcG9ydFJhdGUsIDAsIE5ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWCk7Ci0JLyogIGdldCBzdXBwb3J0ZWQgcmF0ZXMgKi8KLQlwID0gcnR3X2dldF9pZTIzYShpZSwgV0xBTl9FSURfU1VQUF9SQVRFUywgJmllX2xlbiwKLQkJCSAgcGJzc19uZXR3b3JrLT5JRUxlbmd0aCk7Ci0JaWYgKHApIHsKLQkJbWVtY3B5KHN1cHBvcnRSYXRlLCBwKzIsIGllX2xlbik7Ci0JCXN1cHBvcnRSYXRlTnVtID0gaWVfbGVuOwotCX0KLQotCS8qIGdldCBleHRfc3VwcG9ydGVkIHJhdGVzICovCi0JcCA9IHJ0d19nZXRfaWUyM2EoaWUsIFdMQU5fRUlEX0VYVF9TVVBQX1JBVEVTLAotCQkJICAmaWVfbGVuLCBwYnNzX25ldHdvcmstPklFTGVuZ3RoKTsKLQlpZiAocCkgewotCQltZW1jcHkoc3VwcG9ydFJhdGUrc3VwcG9ydFJhdGVOdW0sIHArMiwgaWVfbGVuKTsKLQkJc3VwcG9ydFJhdGVOdW0gKz0gaWVfbGVuOwotCX0KLQotCW5ldHdvcmtfdHlwZSA9IHJ0d19jaGVja19uZXR3b3JrX3R5cGUyM2Eoc3VwcG9ydFJhdGUsCi0JCQkJCQkgc3VwcG9ydFJhdGVOdW0sIGNoYW5uZWwpOwotCi0JcnR3X3NldF9zdXBwb3J0ZWRfcmF0ZTIzYShwYnNzX25ldHdvcmstPlN1cHBvcnRlZFJhdGVzLCBuZXR3b3JrX3R5cGUpOwotCi0JLyogcGFyc2luZyBFUlBfSUUgKi8KLQlwID0gcnR3X2dldF9pZTIzYShpZSwgV0xBTl9FSURfRVJQX0lORk8sICZpZV9sZW4sCi0JCQkgIHBic3NfbmV0d29yay0+SUVMZW5ndGgpOwotCWlmIChwICYmIGllX2xlbiA+IDApCi0JCUVSUF9JRV9oYW5kbGVyMjNhKHBhZGFwdGVyLCBwKTsKLQotCS8qIHVwZGF0ZSBwcml2YWN5L3NlY3VyaXR5ICovCi0JaWYgKHBic3NfbmV0d29yay0+Y2FwYWJpbGl0eSAmIEJJVCg0KSkKLQkJcGJzc19uZXR3b3JrLT5Qcml2YWN5ID0gMTsKLQllbHNlCi0JCXBic3NfbmV0d29yay0+UHJpdmFjeSA9IDA7Ci0KLQlwc2VjdXJpdHlwcml2LT53cGFfcHNrID0gMDsKLQotCS8qIHdwYTIgKi8KLQlncm91cF9jaXBoZXIgPSAwOyBwYWlyd2lzZV9jaXBoZXIgPSAwOwotCXBzZWN1cml0eXByaXYtPndwYTJfZ3JvdXBfY2lwaGVyID0gMDsKLQlwc2VjdXJpdHlwcml2LT53cGEyX3BhaXJ3aXNlX2NpcGhlciA9IDA7Ci0JcCA9IHJ0d19nZXRfaWUyM2EoaWUsIFdMQU5fRUlEX1JTTiwgJmllX2xlbiwKLQkJCSAgcGJzc19uZXR3b3JrLT5JRUxlbmd0aCk7Ci0JaWYgKHAgJiYgaWVfbGVuID4gMCkgewotCQlpZiAocnR3X3BhcnNlX3dwYTJfaWUyM2EocCwgaWVfbGVuKzIsICZncm91cF9jaXBoZXIsCi0JCQkJCSAmcGFpcndpc2VfY2lwaGVyLCBOVUxMKSA9PSBfU1VDQ0VTUykgewotCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSA9IGRvdDExQXV0aEFsZ3J0aG1fODAyMVg7Ci0KLQkJCXBzZWN1cml0eXByaXYtPmRvdDgwMjF4YWxnID0gMTsgLyogcHNrLCB0b2RvOjgwMi4xeCAqLwotCQkJcHNlY3VyaXR5cHJpdi0+d3BhX3BzayB8PSBCSVQoMSk7Ci0KLQkJCXBzZWN1cml0eXByaXYtPndwYTJfZ3JvdXBfY2lwaGVyID0gZ3JvdXBfY2lwaGVyOwotCQkJcHNlY3VyaXR5cHJpdi0+d3BhMl9wYWlyd2lzZV9jaXBoZXIgPSBwYWlyd2lzZV9jaXBoZXI7Ci0JCX0KLQl9Ci0KLQkvKiB3cGEgKi8KLQlpZV9sZW4gPSAwOwotCWdyb3VwX2NpcGhlciA9IDA7Ci0JcGFpcndpc2VfY2lwaGVyID0gMDsKLQlwc2VjdXJpdHlwcml2LT53cGFfZ3JvdXBfY2lwaGVyID0gMDsKLQlwc2VjdXJpdHlwcml2LT53cGFfcGFpcndpc2VfY2lwaGVyID0gMDsKLQlmb3IgKHAgPSBpZTsgOyBwICs9IChpZV9sZW4gKyAyKSkgewotCQlwID0gcnR3X2dldF9pZTIzYShwLCBXTEFOX0VJRF9WRU5ET1JfU1BFQ0lGSUMsICZpZV9sZW4sCi0JCQkJICBwYnNzX25ldHdvcmstPklFTGVuZ3RoIC0gKGllX2xlbiArIDIpKTsKLQkJaWYgKChwKSAmJiAoIW1lbWNtcChwKzIsIFJUV19XUEFfT1VJMjNBX1RZUEUsIDQpKSkgewotCQkJaWYgKHJ0d19wYXJzZV93cGFfaWUyM2EocCwgaWVfbGVuKzIsICZncm91cF9jaXBoZXIsCi0JCQkJCQkmcGFpcndpc2VfY2lwaGVyLCBOVUxMKSA9PSBfU1VDQ0VTUykgewotCQkJCXBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG0gPSBkb3QxMUF1dGhBbGdydGhtXzgwMjFYOwotCi0JCQkJLyogcHNrLCAgdG9kbzo4MDIuMXggKi8KLQkJCQlwc2VjdXJpdHlwcml2LT5kb3Q4MDIxeGFsZyA9IDE7Ci0KLQkJCQlwc2VjdXJpdHlwcml2LT53cGFfcHNrIHw9IEJJVCgwKTsKLQotCQkJCXBzZWN1cml0eXByaXYtPndwYV9ncm91cF9jaXBoZXIgPSBncm91cF9jaXBoZXI7Ci0JCQkJcHNlY3VyaXR5cHJpdi0+d3BhX3BhaXJ3aXNlX2NpcGhlciA9IHBhaXJ3aXNlX2NpcGhlcjsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKCFwIHx8ICFpZV9sZW4pCi0JCQlicmVhazsKLQl9Ci0KLQkvKiB3bW0gKi8KLQlpZV9sZW4gPSAwOwotCXBtbG1lcHJpdi0+cW9zX29wdGlvbiA9IDA7Ci0JaWYgKHByZWdpc3RyeXByaXYtPndtbV9lbmFibGUpIHsKLQkJZm9yIChwID0gaWU7IDsgcCArPSAoaWVfbGVuICsgMikpIHsKLQkJCXAgPSBydHdfZ2V0X2llMjNhKHAsIFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQywgJmllX2xlbiwKLQkJCQkJICAocGJzc19uZXR3b3JrLT5JRUxlbmd0aCAtCi0JCQkJCSAgIChpZV9sZW4gKyAyKSkpOwotCQkJaWYgKChwKSAmJiAhbWVtY21wKHArMiwgV01NX1BBUkFfSUUsIDYpKSB7Ci0JCQkJcG1sbWVwcml2LT5xb3Nfb3B0aW9uID0gMTsKLQotCQkJCSoocCArIDgpIHw9IEJJVCg3KTsvKiBRb1MgSW5mbzpzdXBwb3J0IFUtQVBTRCAqLwotCi0JCQkJLyogZGlzYWJsZSBhbGwgQUNNIGJpdHMgc2luY2UgdGhlIFdNTSBhZG1pc3Npb24KLQkJCQkgKiBjb250cm9sIGlzIG5vdCBzdXBwb3J0ZWQKLQkJCQkgKi8KLQkJCQkqKHAgKyAxMCkgJj0gfkJJVCg0KTsgLyogQkUgKi8KLQkJCQkqKHAgKyAxNCkgJj0gfkJJVCg0KTsgLyogQksgKi8KLQkJCQkqKHAgKyAxOCkgJj0gfkJJVCg0KTsgLyogVkkgKi8KLQkJCQkqKHAgKyAyMikgJj0gfkJJVCg0KTsgLyogVk8gKi8KLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICgocCA9PSBOVUxMKSB8fCAoaWVfbGVuID09IDApKQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCS8qIHBhcnNpbmcgSFRfQ0FQX0lFICovCi0JcCA9IHJ0d19nZXRfaWUyM2EoaWUsIFdMQU5fRUlEX0hUX0NBUEFCSUxJVFksICZpZV9sZW4sCi0JCQkgIHBic3NfbmV0d29yay0+SUVMZW5ndGgpOwotCWlmIChwICYmIGllX2xlbiA+IDApIHsKLQkJdTggcmZfdHlwZTsKLQotCQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqcGh0X2NhcCA9IChzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqKShwKzIpOwotCi0JCXBIVF9jYXBzX2llID0gcDsKLQotCQlodF9jYXAgPSB0cnVlOwotCQluZXR3b3JrX3R5cGUgfD0gV0lSRUxFU1NfMTFfMjROOwotCi0JCXJmX3R5cGUgPSBydGw4NzIzYV9nZXRfcmZfdHlwZShwYWRhcHRlcik7Ci0KLQkJaWYgKChwc2VjdXJpdHlwcml2LT53cGFfcGFpcndpc2VfY2lwaGVyICYgV1BBX0NJUEhFUl9DQ01QKSB8fAotCQkgICAgKHBzZWN1cml0eXByaXYtPndwYTJfcGFpcndpc2VfY2lwaGVyICYgV1BBX0NJUEhFUl9DQ01QKSkKLQkJCXBodF9jYXAtPmFtcGR1X3BhcmFtc19pbmZvIHw9IChJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9ERU5TSVRZICYgKDB4MDc8PDIpKTsKLQkJZWxzZQotCQkJcGh0X2NhcC0+YW1wZHVfcGFyYW1zX2luZm8gfD0gKElFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0RFTlNJVFkmMHgwMCk7Ci0KLQkJLyogc2V0ICBNYXggUnggQU1QRFUgc2l6ZSAgdG8gNjRLICovCi0JCXBodF9jYXAtPmFtcGR1X3BhcmFtc19pbmZvIHw9IChJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9GQUNUT1IgJiAweDAzKTsKLQotCQlpZiAocmZfdHlwZSA9PSBSRl8xVDFSKSB7Ci0JCQlwaHRfY2FwLT5tY3MucnhfbWFza1swXSA9IDB4ZmY7Ci0JCQlwaHRfY2FwLT5tY3MucnhfbWFza1sxXSA9IDB4MDsKLQkJfQotCi0JCW1lbWNweSgmcG1sbWVwcml2LT5odHByaXYuaHRfY2FwLCBwKzIsIGllX2xlbik7Ci0JfQotCi0JLyogcGFyc2luZyBIVF9JTkZPX0lFICovCi0JcCA9IHJ0d19nZXRfaWUyM2EoaWUsIFdMQU5fRUlEX0hUX09QRVJBVElPTiwgJmllX2xlbiwKLQkJCSAgcGJzc19uZXR3b3JrLT5JRUxlbmd0aCk7Ci0JaWYgKHAgJiYgaWVfbGVuID4gMCkKLQkJcEhUX2luZm9faWUgPSBwOwotCi0JcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrX3R5cGUgPSBuZXR3b3JrX3R5cGU7Ci0KLQlwbWxtZXByaXYtPmh0cHJpdi5odF9vcHRpb24gPSBmYWxzZTsKLQotCS8qIGh0X2NhcCAqLwotCWlmIChwcmVnaXN0cnlwcml2LT5odF9lbmFibGUgJiYgaHRfY2FwKSB7Ci0JCXBtbG1lcHJpdi0+aHRwcml2Lmh0X29wdGlvbiA9IHRydWU7Ci0JCXBtbG1lcHJpdi0+cW9zX29wdGlvbiA9IDE7Ci0KLQkJaWYgKHByZWdpc3RyeXByaXYtPmFtcGR1X2VuYWJsZSA9PSAxKQotCQkJcG1sbWVwcml2LT5odHByaXYuYW1wZHVfZW5hYmxlID0gdHJ1ZTsKLQotCQlIVF9jYXBzX2hhbmRsZXIyM2EocGFkYXB0ZXIsIHBIVF9jYXBzX2llKTsKLQotCQlIVF9pbmZvX2hhbmRsZXIyM2EocGFkYXB0ZXIsIHBIVF9pbmZvX2llKTsKLQl9Ci0KLQlwYnNzX25ldHdvcmstPkxlbmd0aCA9IGdldF93bGFuX2Jzc2lkX2V4X3N6KHBic3NfbmV0d29yayk7Ci0KLQkvKiBpc3N1ZSBiZWFjb24gdG8gc3RhcnQgYnNzIG5ldHdvcmsgKi8KLQlzdGFydF9ic3NfbmV0d29yayhwYWRhcHRlciwgKHU4ICopcGJzc19uZXR3b3JrKTsKLQotCS8qIGFsbG9jIHN0YV9pbmZvIGZvciBhcCBpdHNlbGYgKi8KLQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKCZwYWRhcHRlci0+c3RhcHJpdiwgcGJzc19uZXR3b3JrLT5NYWNBZGRyZXNzKTsKLQlpZiAoIXBzdGEpIHsKLQkJcHN0YSA9IHJ0d19hbGxvY19zdGFpbmZvMjNhKCZwYWRhcHRlci0+c3RhcHJpdiwKLQkJCQkJICAgIHBic3NfbmV0d29yay0+TWFjQWRkcmVzcywKLQkJCQkJICAgIEdGUF9LRVJORUwpOwotCQlpZiAoIXBzdGEpCi0JCQlyZXR1cm4gX0ZBSUw7Ci0JfQotCS8qIGZpeCBidWcgb2YgZmx1c2hfY2FtX2VudHJ5IGF0IFNUT1AgQVAgbW9kZSAqLwotCXBzdGEtPnN0YXRlIHw9IFdJRklfQVBfU1RBVEU7Ci0JcnR3X2luZGljYXRlX2Nvbm5lY3QyM2EocGFkYXB0ZXIpOwotCi0JLyogZm9yIGNoZWNrIGlmIGFscmVhZHkgc2V0IGJlYWNvbiAqLwotCXBtbG1lcHJpdi0+Y3VyX25ldHdvcmsuam9pbl9yZXMgPSB0cnVlOwotCi0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBydHdfc2V0X21hY2FkZHJfYWNsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGludCBtb2RlKQotewotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IHdsYW5fYWNsX3Bvb2wgKnBhY2xfbGlzdCA9ICZwc3RhcHJpdi0+YWNsX2xpc3Q7Ci0KLQlEQkdfODcyM0EoIiVzLCBtb2RlID0lZFxuIiwgX19mdW5jX18sIG1vZGUpOwotCi0JcGFjbF9saXN0LT5tb2RlID0gbW9kZTsKLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlX2Jjbl9lcnBpbmZvX2llKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwbmV0d29yayA9ICZwbWxtZWluZm8tPm5ldHdvcms7Ci0JdW5zaWduZWQgY2hhciAqcCwgKmllID0gcG5ldHdvcmstPklFczsKLQl1MzIgbGVuID0gMDsKLQotCURCR184NzIzQSgiJXMsIEVSUF9lbmFibGUgPSVkXG4iLCBfX2Z1bmNfXywgcG1sbWVpbmZvLT5FUlBfZW5hYmxlKTsKLQotCWlmICghcG1sbWVpbmZvLT5FUlBfZW5hYmxlKQotCQlyZXR1cm47Ci0KLQkvKiBwYXJzaW5nIEVSUF9JRSAqLwotCXAgPSBydHdfZ2V0X2llMjNhKGllLCBXTEFOX0VJRF9FUlBfSU5GTywgJmxlbiwgcG5ldHdvcmstPklFTGVuZ3RoKTsKLQlpZiAocCAmJiBsZW4gPiAwKSB7Ci0JCWlmIChwbWxtZXByaXYtPm51bV9zdGFfbm9uX2VycCA9PSAxKQotCQkJcFsyXSB8PSBXTEFOX0VSUF9OT05fRVJQX1BSRVNFTlQgfAotCQkJCVdMQU5fRVJQX1VTRV9QUk9URUNUSU9OOwotCQllbHNlCi0JCQlwWzJdICY9IH4oV0xBTl9FUlBfTk9OX0VSUF9QUkVTRU5UIHwKLQkJCQkgIFdMQU5fRVJQX1VTRV9QUk9URUNUSU9OKTsKLQotCQlpZiAocG1sbWVwcml2LT5udW1fc3RhX25vX3Nob3J0X3ByZWFtYmxlID4gMCkKLQkJCXBbMl0gfD0gV0xBTl9FUlBfQkFSS0VSX1BSRUFNQkxFOwotCQllbHNlCi0JCQlwWzJdICY9IH4oV0xBTl9FUlBfQkFSS0VSX1BSRUFNQkxFKTsKLQotCQlFUlBfSUVfaGFuZGxlcjIzYShwYWRhcHRlciwgcCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfYmNuX3dwYV9pZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlX2Jjbl93bW1faWUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9iY25fd3BzX2llKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfYmNuX3AycF9pZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfYmNuX3ZlbmRvcl9zcGVjX2llKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpvdWkpCi17Ci0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotCi0JaWYgKCFtZW1jbXAoUlRXX1dQQV9PVUkyM0FfVFlQRSwgb3VpLCA0KSkKLQkJdXBkYXRlX2Jjbl93cGFfaWUocGFkYXB0ZXIpOwotCWVsc2UgaWYgKCFtZW1jbXAoV01NX09VSTIzQSwgb3VpLCA0KSkKLQkJdXBkYXRlX2Jjbl93bW1faWUocGFkYXB0ZXIpOwotCWVsc2UgaWYgKCFtZW1jbXAoV1BTX09VSTIzQSwgb3VpLCA0KSkKLQkJdXBkYXRlX2Jjbl93cHNfaWUocGFkYXB0ZXIpOwotCWVsc2UgaWYgKCFtZW1jbXAoUDJQX09VSTIzQSwgb3VpLCA0KSkKLQkJdXBkYXRlX2Jjbl9wMnBfaWUocGFkYXB0ZXIpOwotCWVsc2UKLQkJREJHXzg3MjNBKCJ1bmtub3duIE9VSSB0eXBlIVxuIik7Ci19Ci0KLXZvaWQgdXBkYXRlX2JlYWNvbjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBpZV9pZCwgdTggKm91aSwgdTggdHgpCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dDsKLQkvKiBzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvOyAqLwotCi0JLyogREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOyAqLwotCi0JaWYgKCFwYWRhcHRlcikKLQkJcmV0dXJuOwotCi0JcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0JLyogcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsgKi8KLQotCWlmIChmYWxzZSA9PSBwbWxtZWV4dC0+YnN0YXJ0X2JzcykKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmJjbl91cGRhdGVfbG9jayk7Ci0KLQlzd2l0Y2ggKGllX2lkKSB7Ci0JY2FzZSBXTEFOX0VJRF9USU06Ci0JCXVwZGF0ZV9CQ05USU0ocGFkYXB0ZXIpOwotCQlicmVhazsKLQotCWNhc2UgV0xBTl9FSURfRVJQX0lORk86Ci0JCXVwZGF0ZV9iY25fZXJwaW5mb19pZShwYWRhcHRlcik7Ci0JCWJyZWFrOwotCi0JY2FzZSBXTEFOX0VJRF9WRU5ET1JfU1BFQ0lGSUM6Ci0JCXVwZGF0ZV9iY25fdmVuZG9yX3NwZWNfaWUocGFkYXB0ZXIsIG91aSk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JcG1sbWVwcml2LT51cGRhdGVfYmNuID0gdHJ1ZTsKLQotCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmJjbl91cGRhdGVfbG9jayk7Ci0KLQlpZiAodHgpCi0JCXNldF90eF9iZWFjb25fY21kMjNhKHBhZGFwdGVyKTsKLX0KLQotLyoKLSAqIG9wX21vZGUKLSAqIFNldCB0byAwIChIVCBwdXJlKSB1bmRlciB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqCS0gYWxsIFNUQXMgaW4gdGhlIEJTUyBhcmUgMjAvNDAgTUh6IEhUIGluIDIwLzQwIE1IeiBCU1Mgb3IKLSAqCS0gYWxsIFNUQXMgaW4gdGhlIEJTUyBhcmUgMjAgTUh6IEhUIGluIDIwIE1IeiBCU1MKLSAqIFNldCB0byAxIChIVCBub24tbWVtYmVyIHByb3RlY3Rpb24pIGlmIHRoZXJlIG1heSBiZSBub24tSFQgU1RBcwotICoJaW4gYm90aCB0aGUgcHJpbWFyeSBhbmQgdGhlIHNlY29uZGFyeSBjaGFubmVsCi0gKiBTZXQgdG8gMiBpZiBvbmx5IEhUIFNUQXMgYXJlIGFzc29jaWF0ZWQgaW4gQlNTLAotICoJaG93ZXZlciBhbmQgYXQgbGVhc3Qgb25lIDIwIE1IeiBIVCBTVEEgaXMgYXNzb2NpYXRlZAotICogU2V0IHRvIDMgKEhUIG1peGVkIG1vZGUpIHdoZW4gb25lIG9yIG1vcmUgbm9uLUhUIFNUQXMgYXJlIGFzc29jaWF0ZWQKLSAqCShjdXJyZW50bHkgbm9uLUdGIEhUIHN0YXRpb24gaXMgY29uc2lkZXJlZCBhcyBub24tSFQgU1RBIGFsc28pCi0qLwotc3RhdGljIGludCBydHdfaHRfb3BlcmF0aW9uX3VwZGF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXUxNiBjdXJfb3BfbW9kZSwgbmV3X29wX21vZGU7Ci0JaW50IG9wX21vZGVfY2hhbmdlcyA9IDA7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgaHRfcHJpdiAqcGh0cHJpdl9hcCA9ICZwbWxtZXByaXYtPmh0cHJpdjsKLQotCWlmIChwbWxtZXByaXYtPmh0cHJpdi5odF9vcHRpb24pCi0JCXJldHVybiAwOwotCi0JLyogaWYgKCFpZmFjZS0+Y29uZi0+aWVlZTgwMjExbiB8fCBpZmFjZS0+Y29uZi0+aHRfb3BfbW9kZV9maXhlZCkgKi8KLQkvKglyZXR1cm4gMDsgKi8KLQotCURCR184NzIzQSgiJXMgY3VycmVudCBvcGVyYXRpb24gbW9kZSA9IDB4JVhcbiIsCi0JCSAgIF9fZnVuY19fLCBwbWxtZXByaXYtPmh0X29wX21vZGUpOwotCi0JaWYgKCEocG1sbWVwcml2LT5odF9vcF9tb2RlICYgSUVFRTgwMjExX0hUX09QX01PREVfTk9OX0dGX1NUQV9QUlNOVCkKLQkgICAgJiYgcG1sbWVwcml2LT5udW1fc3RhX2h0X25vX2dmKSB7Ci0JCXBtbG1lcHJpdi0+aHRfb3BfbW9kZSB8PQotCQkJSUVFRTgwMjExX0hUX09QX01PREVfTk9OX0dGX1NUQV9QUlNOVDsKLQkJb3BfbW9kZV9jaGFuZ2VzKys7Ci0JfSBlbHNlIGlmICgocG1sbWVwcml2LT5odF9vcF9tb2RlICYKLQkJICAgIElFRUU4MDIxMV9IVF9PUF9NT0RFX05PTl9HRl9TVEFfUFJTTlQpICYmCi0JCSAgIHBtbG1lcHJpdi0+bnVtX3N0YV9odF9ub19nZiA9PSAwKSB7Ci0JCXBtbG1lcHJpdi0+aHRfb3BfbW9kZSAmPQotCQkJfklFRUU4MDIxMV9IVF9PUF9NT0RFX05PTl9HRl9TVEFfUFJTTlQ7Ci0JCW9wX21vZGVfY2hhbmdlcysrOwotCX0KLQotCWlmICghKHBtbG1lcHJpdi0+aHRfb3BfbW9kZSAmIElFRUU4MDIxMV9IVF9PUF9NT0RFX05PTl9IVF9TVEFfUFJTTlQpICYmCi0JICAgIChwbWxtZXByaXYtPm51bV9zdGFfbm9faHQgfHwgcG1sbWVwcml2LT5vbGJjX2h0KSkgewotCQlwbWxtZXByaXYtPmh0X29wX21vZGUgfD0gSUVFRTgwMjExX0hUX09QX01PREVfTk9OX0hUX1NUQV9QUlNOVDsKLQkJb3BfbW9kZV9jaGFuZ2VzKys7Ci0JfSBlbHNlIGlmICgocG1sbWVwcml2LT5odF9vcF9tb2RlICYKLQkJICAgIElFRUU4MDIxMV9IVF9PUF9NT0RFX05PTl9IVF9TVEFfUFJTTlQpICYmCi0JCSAgIChwbWxtZXByaXYtPm51bV9zdGFfbm9faHQgPT0gMCAmJiAhcG1sbWVwcml2LT5vbGJjX2h0KSkgewotCQlwbWxtZXByaXYtPmh0X29wX21vZGUgJj0KLQkJCX5JRUVFODAyMTFfSFRfT1BfTU9ERV9OT05fSFRfU1RBX1BSU05UOwotCQlvcF9tb2RlX2NoYW5nZXMrKzsKLQl9Ci0KLQkvKgotCSAqIE5vdGU6IGN1cnJlbnRseSB3ZSBzd2l0Y2ggdG8gdGhlIE1JWEVEIG9wIG1vZGUgaWYgSFQgbm9uLWdyZWVuZmllbGQKLQkgKiBzdGF0aW9uIGlzIGFzc29jaWF0ZWQuIFByb2JhYmx5IGl0J3MgYSB0aGVvcmV0aWNhbCBjYXNlLCBzaW5jZQotCSAqIGl0IGxvb2tzIGxpa2UgYWxsIGtub3duIEhUIFNUQXMgc3VwcG9ydCBncmVlbmZpZWxkLgotCSAqLwotCWlmIChwbWxtZXByaXYtPm51bV9zdGFfbm9faHQgfHwKLQkgICAgKHBtbG1lcHJpdi0+aHRfb3BfbW9kZSAmIElFRUU4MDIxMV9IVF9PUF9NT0RFX05PTl9HRl9TVEFfUFJTTlQpKQotCQluZXdfb3BfbW9kZSA9IElFRUU4MDIxMV9IVF9PUF9NT0RFX1BST1RFQ1RJT05fTk9OSFRfTUlYRUQ7Ci0JZWxzZSBpZiAoKGxlMTZfdG9fY3B1KHBodHByaXZfYXAtPmh0X2NhcC5jYXBfaW5mbykgJgotCQkgIElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIXzIwXzQwKSAmJgotCQkgcG1sbWVwcml2LT5udW1fc3RhX2h0XzIwbWh6KQotCQluZXdfb3BfbW9kZSA9IElFRUU4MDIxMV9IVF9PUF9NT0RFX1BST1RFQ1RJT05fMjBNSFo7Ci0JZWxzZSBpZiAocG1sbWVwcml2LT5vbGJjX2h0KQotCQluZXdfb3BfbW9kZSA9IElFRUU4MDIxMV9IVF9PUF9NT0RFX1BST1RFQ1RJT05fTk9OTUVNQkVSOwotCWVsc2UKLQkJbmV3X29wX21vZGUgPSBJRUVFODAyMTFfSFRfT1BfTU9ERV9QUk9URUNUSU9OX05PTkU7Ci0KLQljdXJfb3BfbW9kZSA9IHBtbG1lcHJpdi0+aHRfb3BfbW9kZSAmIElFRUU4MDIxMV9IVF9PUF9NT0RFX1BST1RFQ1RJT047Ci0JaWYgKGN1cl9vcF9tb2RlICE9IG5ld19vcF9tb2RlKSB7Ci0JCXBtbG1lcHJpdi0+aHRfb3BfbW9kZSAmPSB+SUVFRTgwMjExX0hUX09QX01PREVfUFJPVEVDVElPTjsKLQkJcG1sbWVwcml2LT5odF9vcF9tb2RlIHw9IG5ld19vcF9tb2RlOwotCQlvcF9tb2RlX2NoYW5nZXMrKzsKLQl9Ci0KLQlEQkdfODcyM0EoIiVzIG5ldyBvcGVyYXRpb24gbW9kZSA9IDB4JVggY2hhbmdlcyA9JWRcbiIsCi0JCSAgIF9fZnVuY19fLCBwbWxtZXByaXYtPmh0X29wX21vZGUsIG9wX21vZGVfY2hhbmdlcyk7Ci0KLQlyZXR1cm4gb3BfbW9kZV9jaGFuZ2VzOwotfQotCi12b2lkIGFzc29jaWF0ZWRfY2xpZW50c191cGRhdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggdXBkYXRlZCkKLXsKLQkvKiB1cGRhdGUgYXNzb2NpYXRlZCBzdGF0aW9ucyBjYXAuICovCi0JaWYgKHVwZGF0ZWQgPT0gdHJ1ZSkgewotCQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQkJc3RydWN0IHN0YV9pbmZvICpwc3RhLCAqcHRtcDsKLQkJc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQotCQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0JCXBoZWFkID0gJnBzdGFwcml2LT5hc29jX2xpc3Q7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwc3RhLCBwdG1wLCBwaGVhZCwgYXNvY19saXN0KQotCQkJVkNTX3VwZGF0ZTIzYShwYWRhcHRlciwgcHN0YSk7Ci0JCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwotCX0KLX0KLQotLyogY2FsbGVkID4gVFNSIExFVkVMIGZvciBVU0Igb3IgU0RJTyBJbnRlcmZhY2UgKi8KLXZvaWQgYnNzX2NhcF91cGRhdGVfb25fc3RhX2pvaW4yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKQotewotCXU4IGJlYWNvbl91cGRhdGVkID0gZmFsc2U7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCi0JaWYgKCEocHN0YS0+ZmxhZ3MgJiBXTEFOX1NUQV9TSE9SVF9QUkVBTUJMRSkpIHsKLQkJaWYgKCFwc3RhLT5ub19zaG9ydF9wcmVhbWJsZV9zZXQpIHsKLQkJCXBzdGEtPm5vX3Nob3J0X3ByZWFtYmxlX3NldCA9IDE7Ci0KLQkJCXBtbG1lcHJpdi0+bnVtX3N0YV9ub19zaG9ydF9wcmVhbWJsZSsrOwotCi0JCQlpZiAoKHBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSA+IFdJUkVMRVNTXzExQikgJiYKLQkJCQkocG1sbWVwcml2LT5udW1fc3RhX25vX3Nob3J0X3ByZWFtYmxlID09IDEpKSB7Ci0JCQkJYmVhY29uX3VwZGF0ZWQgPSB0cnVlOwotCQkJCXVwZGF0ZV9iZWFjb24yM2EocGFkYXB0ZXIsIDB4RkYsIE5VTEwsIHRydWUpOwotCQkJfQotCi0JCX0KLQl9IGVsc2UgewotCQlpZiAocHN0YS0+bm9fc2hvcnRfcHJlYW1ibGVfc2V0KSB7Ci0JCQlwc3RhLT5ub19zaG9ydF9wcmVhbWJsZV9zZXQgPSAwOwotCi0JCQlwbWxtZXByaXYtPm51bV9zdGFfbm9fc2hvcnRfcHJlYW1ibGUtLTsKLQotCQkJaWYgKChwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgPiBXSVJFTEVTU18xMUIpICYmCi0JCQkJKHBtbG1lcHJpdi0+bnVtX3N0YV9ub19zaG9ydF9wcmVhbWJsZSA9PSAwKSkgewotCQkJCWJlYWNvbl91cGRhdGVkID0gdHJ1ZTsKLQkJCQl1cGRhdGVfYmVhY29uMjNhKHBhZGFwdGVyLCAweEZGLCBOVUxMLCB0cnVlKTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JaWYgKHBzdGEtPmZsYWdzICYgV0xBTl9TVEFfTk9ORVJQKSB7Ci0JCWlmICghcHN0YS0+bm9uZXJwX3NldCkgewotCQkJcHN0YS0+bm9uZXJwX3NldCA9IDE7Ci0KLQkJCXBtbG1lcHJpdi0+bnVtX3N0YV9ub25fZXJwKys7Ci0KLQkJCWlmIChwbWxtZXByaXYtPm51bV9zdGFfbm9uX2VycCA9PSAxKSB7Ci0JCQkJYmVhY29uX3VwZGF0ZWQgPSB0cnVlOwotCQkJCXVwZGF0ZV9iZWFjb24yM2EocGFkYXB0ZXIsIFdMQU5fRUlEX0VSUF9JTkZPLCBOVUxMLCB0cnVlKTsKLQkJCX0KLQkJfQotCi0JfSBlbHNlIHsKLQkJaWYgKHBzdGEtPm5vbmVycF9zZXQpIHsKLQkJCXBzdGEtPm5vbmVycF9zZXQgPSAwOwotCi0JCQlwbWxtZXByaXYtPm51bV9zdGFfbm9uX2VycC0tOwotCi0JCQlpZiAocG1sbWVwcml2LT5udW1fc3RhX25vbl9lcnAgPT0gMCkgewotCQkJCWJlYWNvbl91cGRhdGVkID0gdHJ1ZTsKLQkJCQl1cGRhdGVfYmVhY29uMjNhKHBhZGFwdGVyLCBXTEFOX0VJRF9FUlBfSU5GTywgTlVMTCwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCWlmICghKHBzdGEtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVF9USU1FKSkgewotCQlpZiAoIXBzdGEtPm5vX3Nob3J0X3Nsb3RfdGltZV9zZXQpIHsKLQkJCXBzdGEtPm5vX3Nob3J0X3Nsb3RfdGltZV9zZXQgPSAxOwotCi0JCQlwbWxtZXByaXYtPm51bV9zdGFfbm9fc2hvcnRfc2xvdF90aW1lKys7Ci0KLQkJCWlmICgocG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlID4gV0lSRUxFU1NfMTFCKSAmJgotCQkJCSAocG1sbWVwcml2LT5udW1fc3RhX25vX3Nob3J0X3Nsb3RfdGltZSA9PSAxKSkgewotCQkJCWJlYWNvbl91cGRhdGVkID0gdHJ1ZTsKLQkJCQl1cGRhdGVfYmVhY29uMjNhKHBhZGFwdGVyLCAweEZGLCBOVUxMLCB0cnVlKTsKLQkJCX0KLQotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKHBzdGEtPm5vX3Nob3J0X3Nsb3RfdGltZV9zZXQpIHsKLQkJCXBzdGEtPm5vX3Nob3J0X3Nsb3RfdGltZV9zZXQgPSAwOwotCi0JCQlwbWxtZXByaXYtPm51bV9zdGFfbm9fc2hvcnRfc2xvdF90aW1lLS07Ci0KLQkJCWlmICgocG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlID4gV0lSRUxFU1NfMTFCKSAmJgotCQkJCSAocG1sbWVwcml2LT5udW1fc3RhX25vX3Nob3J0X3Nsb3RfdGltZSA9PSAwKSkgewotCQkJCWJlYWNvbl91cGRhdGVkID0gdHJ1ZTsKLQkJCQl1cGRhdGVfYmVhY29uMjNhKHBhZGFwdGVyLCAweEZGLCBOVUxMLCB0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQotCWlmIChwc3RhLT5mbGFncyAmIFdMQU5fU1RBX0hUKSB7Ci0JCXUxNiBodF9jYXBhYiA9IGxlMTZfdG9fY3B1KHBzdGEtPmh0cHJpdi5odF9jYXAuY2FwX2luZm8pOwotCi0JCURCR184NzIzQSgiSFQ6IFNUQSAlcE0gSFQgQ2FwYWJpbGl0aWVzIEluZm86IDB4JTA0eFxuIiwKLQkJCSAgcHN0YS0+aHdhZGRyLCBodF9jYXBhYik7Ci0KLQkJaWYgKHBzdGEtPm5vX2h0X3NldCkgewotCQkJcHN0YS0+bm9faHRfc2V0ID0gMDsKLQkJCXBtbG1lcHJpdi0+bnVtX3N0YV9ub19odC0tOwotCQl9Ci0KLQkJaWYgKChodF9jYXBhYiAmIElFRUU4MDIxMV9IVF9DQVBfR1JOX0ZMRCkgPT0gMCkgewotCQkJaWYgKCFwc3RhLT5ub19odF9nZl9zZXQpIHsKLQkJCQlwc3RhLT5ub19odF9nZl9zZXQgPSAxOwotCQkJCXBtbG1lcHJpdi0+bnVtX3N0YV9odF9ub19nZisrOwotCQkJfQotCQkJREJHXzg3MjNBKCIlcyBTVEEgJXBNIC0gbm8gZ3JlZW5maWVsZCwgbnVtIG9mIG5vbi1nZiBzdGF0aW9ucyAlZFxuIiwKLQkJCQkgIF9fZnVuY19fLCBwc3RhLT5od2FkZHIsCi0JCQkJICBwbWxtZXByaXYtPm51bV9zdGFfaHRfbm9fZ2YpOwotCQl9Ci0KLQkJaWYgKChodF9jYXBhYiAmIElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIXzIwXzQwKSA9PSAwKSB7Ci0JCQlpZiAoIXBzdGEtPmh0XzIwbWh6X3NldCkgewotCQkJCXBzdGEtPmh0XzIwbWh6X3NldCA9IDE7Ci0JCQkJcG1sbWVwcml2LT5udW1fc3RhX2h0XzIwbWh6Kys7Ci0JCQl9Ci0JCQlEQkdfODcyM0EoIiVzIFNUQSAlcE0gLSAyMCBNSHogSFQsIG51bSBvZiAyME1IeiBIVCBTVEFzICVkXG4iLAotCQkJCSAgX19mdW5jX18sIHBzdGEtPmh3YWRkciwKLQkJCQkgIHBtbG1lcHJpdi0+bnVtX3N0YV9odF8yMG1oeik7Ci0JCX0KLQotCX0gZWxzZSB7Ci0JCWlmICghcHN0YS0+bm9faHRfc2V0KSB7Ci0JCQlwc3RhLT5ub19odF9zZXQgPSAxOwotCQkJcG1sbWVwcml2LT5udW1fc3RhX25vX2h0Kys7Ci0JCX0KLQkJaWYgKHBtbG1lcHJpdi0+aHRwcml2Lmh0X29wdGlvbikgewotCQkJREJHXzg3MjNBKCIlcyBTVEEgJXBNIC0gbm8gSFQsIG51bSBvZiBub24tSFQgc3RhdGlvbnMgJWRcbiIsCi0JCQkJICBfX2Z1bmNfXywgcHN0YS0+aHdhZGRyLAotCQkJCSAgcG1sbWVwcml2LT5udW1fc3RhX25vX2h0KTsKLQkJfQotCX0KLQotCWlmIChydHdfaHRfb3BlcmF0aW9uX3VwZGF0ZShwYWRhcHRlcikgPiAwKSB7Ci0JCXVwZGF0ZV9iZWFjb24yM2EocGFkYXB0ZXIsIFdMQU5fRUlEX0hUX0NBUEFCSUxJVFksIE5VTEwsIGZhbHNlKTsKLQkJdXBkYXRlX2JlYWNvbjIzYShwYWRhcHRlciwgV0xBTl9FSURfSFRfT1BFUkFUSU9OLCBOVUxMLCB0cnVlKTsKLQl9Ci0KLQkvKiB1cGRhdGUgYXNzb2NpYXRlZCBzdGF0aW9ucyBjYXAuICovCi0JYXNzb2NpYXRlZF9jbGllbnRzX3VwZGF0ZTIzYShwYWRhcHRlciwgIGJlYWNvbl91cGRhdGVkKTsKLQotCURCR184NzIzQSgiJXMsIHVwZGF0ZWQgPSVkXG4iLCBfX2Z1bmNfXywgYmVhY29uX3VwZGF0ZWQpOwotfQotCi11OCBic3NfY2FwX3VwZGF0ZV9vbl9zdGFfbGVhdmUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKQotewotCXU4IGJlYWNvbl91cGRhdGVkID0gZmFsc2U7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCi0JaWYgKCFwc3RhKQotCQlyZXR1cm4gYmVhY29uX3VwZGF0ZWQ7Ci0KLQlpZiAocHN0YS0+bm9fc2hvcnRfcHJlYW1ibGVfc2V0KSB7Ci0JCXBzdGEtPm5vX3Nob3J0X3ByZWFtYmxlX3NldCA9IDA7Ci0JCXBtbG1lcHJpdi0+bnVtX3N0YV9ub19zaG9ydF9wcmVhbWJsZS0tOwotCQlpZiAocG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlID4gV0lSRUxFU1NfMTFCCi0JCSAgICAmJiBwbWxtZXByaXYtPm51bV9zdGFfbm9fc2hvcnRfcHJlYW1ibGUgPT0gMCkgewotCQkJYmVhY29uX3VwZGF0ZWQgPSB0cnVlOwotCQkJdXBkYXRlX2JlYWNvbjIzYShwYWRhcHRlciwgMHhGRiwgTlVMTCwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlpZiAocHN0YS0+bm9uZXJwX3NldCkgewotCQlwc3RhLT5ub25lcnBfc2V0ID0gMDsKLQkJcG1sbWVwcml2LT5udW1fc3RhX25vbl9lcnAtLTsKLQkJaWYgKHBtbG1lcHJpdi0+bnVtX3N0YV9ub25fZXJwID09IDApIHsKLQkJCWJlYWNvbl91cGRhdGVkID0gdHJ1ZTsKLQkJCXVwZGF0ZV9iZWFjb24yM2EocGFkYXB0ZXIsIFdMQU5fRUlEX0VSUF9JTkZPLAotCQkJCQkgTlVMTCwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlpZiAocHN0YS0+bm9fc2hvcnRfc2xvdF90aW1lX3NldCkgewotCQlwc3RhLT5ub19zaG9ydF9zbG90X3RpbWVfc2V0ID0gMDsKLQkJcG1sbWVwcml2LT5udW1fc3RhX25vX3Nob3J0X3Nsb3RfdGltZS0tOwotCQlpZiAocG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlID4gV0lSRUxFU1NfMTFCCi0JCSAgICAmJiBwbWxtZXByaXYtPm51bV9zdGFfbm9fc2hvcnRfc2xvdF90aW1lID09IDApIHsKLQkJCWJlYWNvbl91cGRhdGVkID0gdHJ1ZTsKLQkJCXVwZGF0ZV9iZWFjb24yM2EocGFkYXB0ZXIsIDB4RkYsIE5VTEwsIHRydWUpOwotCQl9Ci0JfQotCi0JaWYgKHBzdGEtPm5vX2h0X2dmX3NldCkgewotCQlwc3RhLT5ub19odF9nZl9zZXQgPSAwOwotCQlwbWxtZXByaXYtPm51bV9zdGFfaHRfbm9fZ2YtLTsKLQl9Ci0KLQlpZiAocHN0YS0+bm9faHRfc2V0KSB7Ci0JCXBzdGEtPm5vX2h0X3NldCA9IDA7Ci0JCXBtbG1lcHJpdi0+bnVtX3N0YV9ub19odC0tOwotCX0KLQotCWlmIChwc3RhLT5odF8yMG1oel9zZXQpIHsKLQkJcHN0YS0+aHRfMjBtaHpfc2V0ID0gMDsKLQkJcG1sbWVwcml2LT5udW1fc3RhX2h0XzIwbWh6LS07Ci0JfQotCi0JaWYgKHJ0d19odF9vcGVyYXRpb25fdXBkYXRlKHBhZGFwdGVyKSA+IDApIHsKLQkJdXBkYXRlX2JlYWNvbjIzYShwYWRhcHRlciwgV0xBTl9FSURfSFRfQ0FQQUJJTElUWSwgTlVMTCwgZmFsc2UpOwotCQl1cGRhdGVfYmVhY29uMjNhKHBhZGFwdGVyLCBXTEFOX0VJRF9IVF9PUEVSQVRJT04sIE5VTEwsIHRydWUpOwotCX0KLQotCS8qIHVwZGF0ZSBhc3NvY2lhdGVkIHN0YXRpb25zIGNhcC4gKi8KLQotCURCR184NzIzQSgiJXMsIHVwZGF0ZWQgPSVkXG4iLCBfX2Z1bmNfXywgYmVhY29uX3VwZGF0ZWQpOwotCi0JcmV0dXJuIGJlYWNvbl91cGRhdGVkOwotfQotCi11OCBhcF9mcmVlX3N0YTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEsIGJvb2wgYWN0aXZlLCB1MTYgcmVhc29uKQotewotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0JdTggYmVhY29uX3VwZGF0ZWQgPSBmYWxzZTsKLQotCWlmICghcHN0YSkKLQkJcmV0dXJuIGJlYWNvbl91cGRhdGVkOwotCi0JaWYgKGFjdGl2ZSkgewotCQkvKiB0ZWFyIGRvd24gUnggQU1QRFUgKi8KLQkJc2VuZF9kZWxiYTIzYShwYWRhcHRlciwgMCwgcHN0YS0+aHdhZGRyKTsgLyogcmVjaXBpZW50ICovCi0KLQkJLyogdGVhciBkb3duIFRYIEFNUERVICovCi0JCXNlbmRfZGVsYmEyM2EocGFkYXB0ZXIsIDEsIHBzdGEtPmh3YWRkcik7IC8qIG9yaWdpbmF0b3IgKi8KLQotCQlpc3N1ZV9kZWF1dGgyM2EocGFkYXB0ZXIsIHBzdGEtPmh3YWRkciwgcmVhc29uKTsKLQl9Ci0KLQlwc3RhLT5odHByaXYuYWdnX2VuYWJsZV9iaXRtYXAgPSAweDA7CSAvKiByZXNldCAqLwotCXBzdGEtPmh0cHJpdi5jYW5kaWRhdGVfdGlkX2JpdG1hcCA9IDB4MDsgLyogcmVzZXQgKi8KLQotCS8qIHJlcG9ydF9kZWxfc3RhX2V2ZW50MjNhKHBhZGFwdGVyLCBwc3RhLT5od2FkZHIsIHJlYXNvbik7ICovCi0KLQkvKiBjbGVhciBjYW0gZW50cnkgLyBrZXkgKi8KLQkvKiBjbGVhcl9jYW1fZW50cnkyM2EocGFkYXB0ZXIsIChwc3RhLT5tYWNfaWQgKyAzKSk7ICovCi0JcnR3X2NsZWFyc3Rha2V5X2NtZDIzYShwYWRhcHRlciwgKHU4ICopcHN0YSwgKHU4KShwc3RhLT5tYWNfaWQgKyAzKSwKLQkJCSAgICAgICB0cnVlKTsKLQotCXNwaW5fbG9ja19iaCgmcHN0YS0+bG9jayk7Ci0JcHN0YS0+c3RhdGUgJj0gfl9GV19MSU5LRUQ7Ci0Jc3Bpbl91bmxvY2tfYmgoJnBzdGEtPmxvY2spOwotCi0JcnR3X2NmZzgwMjExX2luZGljYXRlX3N0YV9kaXNhc3NvYyhwYWRhcHRlciwgcHN0YS0+aHdhZGRyLCByZWFzb24pOwotCi0JcmVwb3J0X2RlbF9zdGFfZXZlbnQyM2EocGFkYXB0ZXIsIHBzdGEtPmh3YWRkciwgcmVhc29uKTsKLQotCWJlYWNvbl91cGRhdGVkID0gYnNzX2NhcF91cGRhdGVfb25fc3RhX2xlYXZlMjNhKHBhZGFwdGVyLCBwc3RhKTsKLQotCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotCXJ0d19mcmVlX3N0YWluZm8yM2EocGFkYXB0ZXIsIHBzdGEpOwotCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0KLQlyZXR1cm4gYmVhY29uX3VwZGF0ZWQ7Ci19Ci0KLWludCBydHdfc3RhX2ZsdXNoMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhLCAqcHRtcDsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0JdTggYmNfYWRkcltFVEhfQUxFTl0gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07Ci0JdTggY2hrX2FsaXZlX251bSA9IDA7Ci0Jc3RydWN0IHN0YV9pbmZvICpjaGtfYWxpdmVfbGlzdFtOVU1fU1RBXTsKLQlpbnQgaTsKLQotCURCR184NzIzQSgiJXMoJXMpXG4iLCBfX2Z1bmNfXywgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUpOwotCi0JaWYgKChwbWxtZWluZm8tPnN0YXRlJjB4MDMpICE9IE1TUl9BUCkKLQkJcmV0dXJuIDA7Ci0KLQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0JcGhlYWQgPSAmcHN0YXByaXYtPmFzb2NfbGlzdDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHN0YSwgcHRtcCwgcGhlYWQsIGFzb2NfbGlzdCkgewotCQkvKiBSZW1vdmUgc3RhIGZyb20gYXNvY19saXN0ICovCi0JCWxpc3RfZGVsX2luaXQoJnBzdGEtPmFzb2NfbGlzdCk7Ci0JCXBzdGFwcml2LT5hc29jX2xpc3RfY250LS07Ci0KLQkJLyogS2VlcCBzdGEgZm9yIGFwX2ZyZWVfc3RhMjNhKCkgYmV5b25kIHRoaXMgYXNvY19saXN0IGxvb3AgKi8KLQkJY2hrX2FsaXZlX2xpc3RbY2hrX2FsaXZlX251bSsrXSA9IHBzdGE7Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwotCi0JLyogRm9yIGVhY2ggc3RhIGluIGNoa19hbGl2ZV9saXN0LCBjYWxsIGFwX2ZyZWVfc3RhMjNhICovCi0JZm9yIChpID0gMDsgaSA8IGNoa19hbGl2ZV9udW07IGkrKykKLQkJYXBfZnJlZV9zdGEyM2EocGFkYXB0ZXIsIGNoa19hbGl2ZV9saXN0W2ldLCB0cnVlLAotCQkJICAgICAgIFdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HKTsKLQotCWlzc3VlX2RlYXV0aDIzYShwYWRhcHRlciwgYmNfYWRkciwgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcpOwotCi0JYXNzb2NpYXRlZF9jbGllbnRzX3VwZGF0ZTIzYShwYWRhcHRlciwgdHJ1ZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogY2FsbGVkID4gVFNSIExFVkVMIGZvciBVU0Igb3IgU0RJTyBJbnRlcmZhY2UgKi8KLXZvaWQgc3RhX2luZm9fdXBkYXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSkKLXsKLQlpbnQgZmxhZ3MgPSBwc3RhLT5mbGFnczsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCi0JLyogdXBkYXRlIHdtbSBjYXAuICovCi0JaWYgKFdMQU5fU1RBX1dNRSZmbGFncykKLQkJcHN0YS0+cW9zX29wdGlvbiA9IDE7Ci0JZWxzZQotCQlwc3RhLT5xb3Nfb3B0aW9uID0gMDsKLQotCWlmIChwbWxtZXByaXYtPnFvc19vcHRpb24gPT0gMCkKLQkJcHN0YS0+cW9zX29wdGlvbiA9IDA7Ci0KLQkvKiB1cGRhdGUgODAyLjExbiBodCBjYXAuICovCi0JaWYgKFdMQU5fU1RBX0hUJmZsYWdzKSB7Ci0JCXBzdGEtPmh0cHJpdi5odF9vcHRpb24gPSB0cnVlOwotCQlwc3RhLT5xb3Nfb3B0aW9uID0gMTsKLQl9IGVsc2UgewotCQlwc3RhLT5odHByaXYuaHRfb3B0aW9uID0gZmFsc2U7Ci0JfQotCi0JaWYgKCFwbWxtZXByaXYtPmh0cHJpdi5odF9vcHRpb24pCi0JCXBzdGEtPmh0cHJpdi5odF9vcHRpb24gPSBmYWxzZTsKLQotCXVwZGF0ZV9zdGFfaW5mbzIzYV9hcG1vZGUyM2EocGFkYXB0ZXIsIHBzdGEpOwotfQotCi0vKiBjYWxsZWQgPj0gVFNSIExFVkVMIGZvciBVU0Igb3IgU0RJTyBJbnRlcmZhY2UgKi8KLXZvaWQgYXBfc3RhX2luZm9fZGVmZXJfdXBkYXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSkKLXsKLQlpZiAocHN0YS0+c3RhdGUgJiBfRldfTElOS0VEKSB7Ci0JCS8qIGFkZCByYXRpZCAqLwotCQlhZGRfUkFUaWQyM2EocGFkYXB0ZXIsIHBzdGEsIDApOy8qIERNX1JBVFJfU1RBX0lOSVQgKi8KLQl9Ci19Ci0KLS8qIHJlc3RvcmUgaHcgc2V0dGluZyBmcm9tIHN3IGRhdGEgc3RydWN0dXJlcyAqLwotdm9pZCBydHdfYXBfcmVzdG9yZV9uZXR3b3JrKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEsICpwdG1wOwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0JdTggY2hrX2FsaXZlX251bSA9IDA7Ci0Jc3RydWN0IHN0YV9pbmZvICpjaGtfYWxpdmVfbGlzdFtOVU1fU1RBXTsKLQlpbnQgaTsKLQotCXJ0d19zZXRvcG1vZGVfY21kMjNhKHBhZGFwdGVyLCBOTDgwMjExX0lGVFlQRV9BUCk7Ci0KLQlzZXRfY2hhbm5lbF9id21vZGUyM2EocGFkYXB0ZXIsIHBtbG1lZXh0LT5jdXJfY2hhbm5lbCwgcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQsIHBtbG1lZXh0LT5jdXJfYndtb2RlKTsKLQotCXN0YXJ0X2Jzc19uZXR3b3JrKHBhZGFwdGVyLCAodTggKikmbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmspOwotCi0JaWYgKHBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFQcml2YWN5QWxncnRobSA9PQotCSAgICBXTEFOX0NJUEhFUl9TVUlURV9US0lQIHx8Ci0JICAgIHBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFQcml2YWN5QWxncnRobSA9PQotCSAgICBXTEFOX0NJUEhFUl9TVUlURV9DQ01QKSB7Ci0JCS8qIHJlc3RvcmUgZ3JvdXAga2V5LCBXRVAga2V5cyBpcyByZXN0b3JlZCBpbiBpcHNfbGVhdmUyM2EoKSAqLwotCQlydHdfc2V0X2tleTIzYShwYWRhcHRlciwgcHNlY3VyaXR5cHJpdiwKLQkJCSAgICAgICBwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwS2V5aWQsIDApOwotCX0KLQotCS8qIHBlciBzdGEgcGFpcndpc2Uga2V5IGFuZCBzZXR0aW5ncyAqLwotCWlmIChwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG0gIT0KLQkgICAgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCAmJgotCSAgICBwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG0gIT0KLQkgICAgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUCkgewotCQlyZXR1cm47Ci0JfQotCi0Jc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwotCXBoZWFkID0gJnBzdGFwcml2LT5hc29jX2xpc3Q7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBzdGEsIHB0bXAsIHBoZWFkLCBhc29jX2xpc3QpCi0JCWNoa19hbGl2ZV9saXN0W2Noa19hbGl2ZV9udW0rK10gPSBwc3RhOwotCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwotCi0JZm9yIChpID0gMDsgaSA8IGNoa19hbGl2ZV9udW07IGkrKykgewotCQlwc3RhID0gY2hrX2FsaXZlX2xpc3RbaV07Ci0KLQkJaWYgKHBzdGEtPnN0YXRlICYgX0ZXX0xJTktFRCkgewotCQkJVXBkYXRlX1JBX0VudHJ5MjNhKHBhZGFwdGVyLCBwc3RhKTsKLQkJCS8qIHBhaXJ3aXNlIGtleSAqLwotCQkJcnR3X3NldHN0YWtleV9jbWQyM2EocGFkYXB0ZXIsICh1bnNpZ25lZCBjaGFyICopcHN0YSwgdHJ1ZSk7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgc3RhcnRfYXBfbW9kZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCWludCBpOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCB3bGFuX2FjbF9wb29sICpwYWNsX2xpc3QgPSAmcHN0YXByaXYtPmFjbF9saXN0OwotCi0JcG1sbWVwcml2LT51cGRhdGVfYmNuID0gZmFsc2U7Ci0KLQkvKiBpbml0X21sbWVfYXBfaW5mbzIzYShwYWRhcHRlcik7ICovCi0JcG1sbWVleHQtPmJzdGFydF9ic3MgPSBmYWxzZTsKLQotCXBtbG1lcHJpdi0+bnVtX3N0YV9ub25fZXJwID0gMDsKLQotCXBtbG1lcHJpdi0+bnVtX3N0YV9ub19zaG9ydF9zbG90X3RpbWUgPSAwOwotCi0JcG1sbWVwcml2LT5udW1fc3RhX25vX3Nob3J0X3ByZWFtYmxlID0gMDsKLQotCXBtbG1lcHJpdi0+bnVtX3N0YV9odF9ub19nZiA9IDA7Ci0JcG1sbWVwcml2LT5udW1fc3RhX25vX2h0ID0gMDsKLQlwbWxtZXByaXYtPm51bV9zdGFfaHRfMjBtaHogPSAwOwotCi0JcG1sbWVwcml2LT5vbGJjID0gZmFsc2U7Ci0KLQlwbWxtZXByaXYtPm9sYmNfaHQgPSBmYWxzZTsKLQotCXBtbG1lcHJpdi0+aHRfb3BfbW9kZSA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX1NUQTsgaSsrKQotCQlwc3RhcHJpdi0+c3RhX2FpZFtpXSA9IE5VTEw7Ci0KLQkvKiBmb3IgQUNMICovCi0JSU5JVF9MSVNUX0hFQUQoJnBhY2xfbGlzdC0+YWNsX25vZGVfcS5xdWV1ZSk7Ci0JcGFjbF9saXN0LT5udW0gPSAwOwotCXBhY2xfbGlzdC0+bW9kZSA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IE5VTV9BQ0w7IGkrKykgewotCQlJTklUX0xJU1RfSEVBRCgmcGFjbF9saXN0LT5hY2xub2RlW2ldLmxpc3QpOwotCQlwYWNsX2xpc3QtPmFjbG5vZGVbaV0udmFsaWQgPSBmYWxzZTsKLQl9Ci19Ci0KLXZvaWQgc3RvcF9hcF9tb2RlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0Jc3RydWN0IHJ0d193bGFuX2FjbF9ub2RlICpwYWNsbm9kZSwgKnB0bXA7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhID0gTlVMTDsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3Qgd2xhbl9hY2xfcG9vbCAqcGFjbF9saXN0ID0gJnBzdGFwcml2LT5hY2xfbGlzdDsKLQlzdHJ1Y3QgcnR3X3F1ZXVlICpwYWNsX25vZGVfcSA9ICZwYWNsX2xpc3QtPmFjbF9ub2RlX3E7Ci0KLQlwbWxtZXByaXYtPnVwZGF0ZV9iY24gPSBmYWxzZTsKLQlwbWxtZWV4dC0+YnN0YXJ0X2JzcyA9IGZhbHNlOwotCi0JLyoKLQkgKiByZXNldCBhbmQgaW5pdCBzZWN1cml0eSBwcml2ICwgdGhpcyBjYW4KLQkgKiByZWZpbmUgd2l0aCBydHdfcmVzZXRfc2VjdXJpdHlwcml2MjNhCi0JICovCi0JbWVtc2V0KCh1bnNpZ25lZCBjaGFyICopJnBhZGFwdGVyLT5zZWN1cml0eXByaXYsIDAsIHNpemVvZihzdHJ1Y3Qgc2VjdXJpdHlfcHJpdikpOwotCXBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2F1dGh0eXBlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKLQlwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNlbmNyeXB0c3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCi0JLyogZm9yIEFDTCAqLwotCXNwaW5fbG9ja19iaCgmcGFjbF9ub2RlX3EtPmxvY2spOwotCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwYWNsX25vZGVfcSk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhY2xub2RlLCBwdG1wLCBwaGVhZCwgbGlzdCkgewotCQlpZiAocGFjbG5vZGUtPnZhbGlkID09IHRydWUpIHsKLQkJCXBhY2xub2RlLT52YWxpZCA9IGZhbHNlOwotCQkJbGlzdF9kZWxfaW5pdCgmcGFjbG5vZGUtPmxpc3QpOwotCQkJcGFjbF9saXN0LT5udW0tLTsKLQkJfQotCX0KLQlzcGluX3VubG9ja19iaCgmcGFjbF9ub2RlX3EtPmxvY2spOwotCi0JREJHXzg3MjNBKCIlcywgZnJlZSBhY2xfbm9kZV9xdWV1ZSwgbnVtID0lZFxuIiwKLQkJICBfX2Z1bmNfXywgcGFjbF9saXN0LT5udW0pOwotCi0JcnR3X3N0YV9mbHVzaDIzYShwYWRhcHRlcik7Ci0KLQkvKiBmcmVlX2Fzc29jX3N0YV9yZXNvdXJjZXMgKi8KLQlydHdfZnJlZV9hbGxfc3RhaW5mbzIzYShwYWRhcHRlcik7Ci0KLQlwc3RhID0gcnR3X2dldF9iY21jX3N0YWluZm8yM2EocGFkYXB0ZXIpOwotCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotCXJ0d19mcmVlX3N0YWluZm8yM2EocGFkYXB0ZXIsIHBzdGEpOwotCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0KLQlydHdfaW5pdF9iY21jX3N0YWluZm8yM2EocGFkYXB0ZXIpOwotCi0JcnR3MjNhX2ZyZWVfbWxtZV9wcml2X2llX2RhdGEocG1sbWVwcml2KTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfY21kLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X2NtZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDRlMGYwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfY21kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfUlRXX0NNRF9DXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPHJlY3Zfb3NkZXAuaD4KLSNpbmNsdWRlIDxtbG1lX29zZGVwLmg+Ci0jaW5jbHVkZSA8cnRsODcyM2FfY21kLmg+Ci0jaW5jbHVkZSA8cnR3X3NyZXNldC5oPgotCi1zdGF0aWMgc3RydWN0IGNtZF9oZGwgd2xhbmNtZHNbXSA9IHsKLQlHRU5fRFJWX0NNRF9IQU5ETEVSKDAsIE5VTEwpIC8qMCovCi0JR0VOX0RSVl9DTURfSEFORExFUigwLCBOVUxMKQotCUdFTl9EUlZfQ01EX0hBTkRMRVIoMCwgTlVMTCkKLQlHRU5fRFJWX0NNRF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX0RSVl9DTURfSEFORExFUigwLCBOVUxMKQotCUdFTl9EUlZfQ01EX0hBTkRMRVIoMCwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUigwLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUigwLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpIC8qMTAqLwotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUigwLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgd2xhbl9ic3NpZF9leCksIGpvaW5fY21kX2hkbDIzYSkgLyoxNCovCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBkaXNjb25uZWN0X3Bhcm0pLCBkaXNjb25uZWN0X2hkbDIzYSkKLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IHdsYW5fYnNzaWRfZXgpLCBjcmVhdGVic3NfaGRsMjNhKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgc2V0b3Btb2RlX3Bhcm0pLCBzZXRvcG1vZGVfaGRsMjNhKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgc2l0ZXN1cnZleV9wYXJtKSwgc2l0ZXN1cnZleV9jbWRfaGRsMjNhKSAvKjE4Ki8KLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IHNldGF1dGhfcGFybSksIHNldGF1dGhfaGRsMjNhKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgc2V0a2V5X3Bhcm0pLCBzZXRrZXlfaGRsMjNhKSAvKjIwKi8KLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IHNldF9zdGFrZXlfcGFybSksIHNldF9zdGFrZXlfaGRsMjNhKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgc2V0X2Fzc29jc3RhX3Bhcm0pLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3QgZGVsX2Fzc29jc3RhX3Bhcm0pLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgc2V0c3RhcHdyc3RhdGVfcGFybSksIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBzZXRiYXNpY3JhdGVfcGFybSksIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBnZXRiYXNpY3JhdGVfcGFybSksIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBzZXRkYXRhcmF0ZV9wYXJtKSwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IGdldGRhdGFyYXRlX3Bhcm0pLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgc2V0cGh5aW5mb19wYXJtKSwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IGdldHBoeWluZm9fcGFybSksIE5VTEwpICAvKjMwKi8KLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IHNldHBoeV9wYXJtKSwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IGdldHBoeV9wYXJtKSwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUigwLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUigwLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUigwLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCS8qNDAqLwotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUigwLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBhZGRCYVJlcV9wYXJtKSwgYWRkX2JhX2hkbDIzYSkKLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IHNldF9jaF9wYXJtKSwgc2V0X2NoX2hkbDIzYSkgLyogNDYgKi8KLQlHRU5fTUxNRV9FWFRfSEFORExFUigwLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUigwLCBOVUxMKSAvKjUwKi8KLQlHRU5fTUxNRV9FWFRfSEFORExFUigwLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUigwLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3QgVHhfQmVhY29uX3BhcmFtKSwgdHhfYmVhY29uX2hkbDIzYSkgLyo1NSovCi0KLQlHRU5fTUxNRV9FWFRfSEFORExFUigwLCBtbG1lX2V2dF9oZGwyM2EpIC8qNTYqLwotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIHJ0d19kcnZleHRyYV9jbWRfaGRsMjNhKSAvKjU3Ki8KLQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIGgyY19tc2dfaGRsMjNhKSAvKjU4Ki8KLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IFNldENoYW5uZWxQbGFuX3BhcmFtKSwgc2V0X2NocGxhbl9oZGwyM2EpIC8qNTkqLwotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3QgTGVkQmxpbmtfcGFyYW0pLCBsZWRfYmxpbmtfaGRsMjNhKSAvKjYwKi8KLQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3QgU2V0Q2hhbm5lbFN3aXRjaF9wYXJhbSksIHNldF9jc2FfaGRsMjNhKSAvKjYxKi8KLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IFRETFNvcHRpb25fcGFyYW0pLCB0ZGxzX2hkbDIzYSkgLyo2MiovCi19OwotCi1zdHJ1Y3QgX2NtZF9jYWxsYmFjawlydHdfY21kX2NhbGxiYWNrW10gPSB7Ci0Je0dFTl9DTURfQ09ERShfUmVhZF9NQUNSRUcpLCBOVUxMfSwgLyowKi8KLQl7R0VOX0NNRF9DT0RFKF9Xcml0ZV9NQUNSRUcpLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9SZWFkX0JCUkVHKSwgJnJ0d19nZXRiYnJmcmVnX2NtZHJzcF9jYWxsYmFjazIzYX0sCi0Je0dFTl9DTURfQ09ERShfV3JpdGVfQkJSRUcpLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9SZWFkX1JGUkVHKSwgJnJ0d19nZXRiYnJmcmVnX2NtZHJzcF9jYWxsYmFjazIzYX0sCi0Je0dFTl9DTURfQ09ERShfV3JpdGVfUkZSRUcpLCBOVUxMfSwgLyo1Ki8KLQl7R0VOX0NNRF9DT0RFKF9SZWFkX0VFUFJPTSksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX1dyaXRlX0VFUFJPTSksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX1JlYWRfRUZVU0UpLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9Xcml0ZV9FRlVTRSksIE5VTEx9LAotCi0Je0dFTl9DTURfQ09ERShfUmVhZF9DQU0pLAlOVUxMfSwJLyoxMCovCi0Je0dFTl9DTURfQ09ERShfV3JpdGVfQ0FNKSwJIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX3NldEJDTklUViksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX3NldE1CSURDRkcpLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9Kb2luQnNzKSwgJnJ0d19qb2luYnNzX2NtZDIzYV9jYWxsYmFja30sICAvKjE0Ki8KLQl7R0VOX0NNRF9DT0RFKF9EaXNDb25uZWN0KSwgJnJ0d19kaXNhc3NvY19jbWQyM2FfY2FsbGJhY2t9LCAvKjE1Ki8KLQl7R0VOX0NNRF9DT0RFKF9DcmVhdGVCc3MpLCAmcnR3X2NyZWF0ZWJzc19jbWQyM2FfY2FsbGJhY2t9LAotCXtHRU5fQ01EX0NPREUoX1NldE9wTW9kZSksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX1NpdGVTdXJ2ZXkpLCAmcnR3X3N1cnZleV9jbWRfY2FsbGJhY2syM2F9LCAvKjE4Ki8KLQl7R0VOX0NNRF9DT0RFKF9TZXRBdXRoKSwgTlVMTH0sCi0KLQl7R0VOX0NNRF9DT0RFKF9TZXRLZXkpLCBOVUxMfSwJLyoyMCovCi0Je0dFTl9DTURfQ09ERShfU2V0U3RhS2V5KSwgJnJ0d19zZXRzdGFLZXlfY21kcnNwX2NhbGxiYWNrMjNhfSwKLQl7R0VOX0NNRF9DT0RFKF9TZXRBc3NvY1N0YSksICZydHdfc2V0YXNzb2NzdGFfY21kcnNwX2NhbGxiYWNrMjNhfSwKLQl7R0VOX0NNRF9DT0RFKF9EZWxBc3NvY1N0YSksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX1NldFN0YVB3clN0YXRlKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfU2V0QmFzaWNSYXRlKSwgTlVMTH0sIC8qMjUqLwotCXtHRU5fQ01EX0NPREUoX0dldEJhc2ljUmF0ZSksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX1NldERhdGFSYXRlKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfR2V0RGF0YVJhdGUpLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9TZXRQaHlJbmZvKSwgTlVMTH0sCi0KLQl7R0VOX0NNRF9DT0RFKF9HZXRQaHlJbmZvKSwgTlVMTH0sIC8qMzAqLwotCXtHRU5fQ01EX0NPREUoX1NldFBoeSksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX0dldFBoeSksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX3JlYWRSc3NpKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfcmVhZEdhaW4pLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9TZXRBdGltKSwgTlVMTH0sIC8qMzUqLwotCXtHRU5fQ01EX0NPREUoX1NldFB3ck1vZGUpLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9Kb2luYnNzUnB0KSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfU2V0UmFUYWJsZSksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX0dldFJhVGFibGUpLCBOVUxMfSwKLQotCXtHRU5fQ01EX0NPREUoX0dldENDWFJlcG9ydCksIE5VTEx9LCAvKjQwKi8KLQl7R0VOX0NNRF9DT0RFKF9HZXREVE1SZXBvcnQpLAlOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9HZXRUWFJhdGVTdGF0aXN0aWNzKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfU2V0VXNiU3VzcGVuZCksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX1NldEgyY0xiayksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX0FkZEJBUmVxKSwgTlVMTH0sIC8qNDUqLwotCXtHRU5fQ01EX0NPREUoX1NldENoYW5uZWwpLCBOVUxMfSwJCS8qNDYqLwotCXtHRU5fQ01EX0NPREUoX1NldFR4UG93ZXIpLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9Td2l0Y2hBbnRlbm5hKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfU2V0Q3J5c3RhbENhcCksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX1NldFNpbmdsZUNhcnJpZXJUeCksIE5VTEx9LAkvKjUwKi8KLQotCXtHRU5fQ01EX0NPREUoX1NldFNpbmdsZVRvbmVUeCksIE5VTEx9LCAvKjUxKi8KLQl7R0VOX0NNRF9DT0RFKF9TZXRDYXJyaWVyU3VwcHJlc3Npb25UeCksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX1NldENvbnRpbnVvdXNUeCksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX1N3aXRjaEJhbmR3aWR0aCksIE5VTEx9LAkJLyo1NCovCi0Je0dFTl9DTURfQ09ERShfVFhfQmVhY29uKSwgTlVMTH0sLyo1NSovCi0KLQl7R0VOX0NNRF9DT0RFKF9TZXRfTUxNRV9FVlQpLCBOVUxMfSwvKjU2Ki8KLQl7R0VOX0NNRF9DT0RFKF9TZXRfRHJ2X0V4dHJhKSwgTlVMTH0sLyo1NyovCi0Je0dFTl9DTURfQ09ERShfU2V0X0gyQ19NU0cpLCBOVUxMfSwvKjU4Ki8KLQl7R0VOX0NNRF9DT0RFKF9TZXRDaGFubmVsUGxhbiksIE5VTEx9LC8qNTkqLwotCXtHRU5fQ01EX0NPREUoX0xlZEJsaW5rKSwgTlVMTH0sLyo2MCovCi0KLQl7R0VOX0NNRF9DT0RFKF9TZXRDaGFubmVsU3dpdGNoKSwgTlVMTH0sLyo2MSovCi0Je0dFTl9DTURfQ09ERShfVERMUyksIE5VTEx9LC8qNjIqLwotfTsKLQotLyoKLUNhbGxlciBhbmQgdGhlIHJ0d19jbWRfdGhyZWFkMjNhIGNhbiBwcm90ZWN0IGNtZF9xIGJ5IHNwaW5fbG9jay4KLU5vIGlycXNhdmUgaXMgbmVjZXNzYXJ5LgotKi8KLQotaW50IHJ0d19pbml0X2NtZF9wcml2MjNhKHN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYpCi17Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0JcGNtZHByaXYtPmNtZF9pc3N1ZWRfY250ID0gMDsKLQlwY21kcHJpdi0+Y21kX2RvbmVfY250ID0gMDsKLQlwY21kcHJpdi0+cnNwX2NudCA9IDA7Ci0KLQlwY21kcHJpdi0+d3EgPSBhbGxvY193b3JrcXVldWUoInJ0bDg3MjNhdV9jbWQiLCAwLCAxKTsKLQlpZiAoIXBjbWRwcml2LT53cSkKLQkJcmVzID0gX0ZBSUw7Ci0KLQlyZXR1cm4gcmVzOwotfQotCi0vKiBmb3J3YXJkIGRlZmluaXRpb24gKi8KLQotc3RhdGljIHZvaWQgcnR3X2lycV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci0KLXUzMiBydHdfaW5pdF9ldnRfcHJpdjIzYShzdHJ1Y3QgZXZ0X3ByaXYgKnBldnRwcml2KQotewotCXBldnRwcml2LT53cSA9IGFsbG9jX3dvcmtxdWV1ZSgicnRsODcyM2F1X2V2dCIsIDAsIDEpOwotCi0JSU5JVF9XT1JLKCZwZXZ0cHJpdi0+aXJxX3drLCBydHdfaXJxX3dvcmspOwotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi12b2lkIHJ0d19mcmVlX2V2dF9wcml2MjNhKHN0cnVjdCBldnRfcHJpdiAqcGV2dHByaXYpCi17Ci0JY2FuY2VsX3dvcmtfc3luYygmcGV2dHByaXYtPmlycV93ayk7Ci19Ci0KLXN0YXRpYyBpbnQgcnR3X2NtZF9maWx0ZXIoc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdiwgc3RydWN0IGNtZF9vYmogKmNtZF9vYmopCi17Ci0JLyogc2V0IHRvIHRydWUgdG8gYWxsb3cgZW5xdWV1aW5nIGNtZCB3aGVuIGh3X2luaXRfY29tcGxldGVkIGlzIGZhbHNlICovCi0JdTggYkFsbG93ID0gZmFsc2U7Ci0KLQlpZiAoY21kX29iai0+Y21kY29kZSA9PSBHRU5fQ01EX0NPREUoX1NldENoYW5uZWxQbGFuKSkKLQkJYkFsbG93ID0gdHJ1ZTsKLQotCWlmIChwY21kcHJpdi0+cGFkYXB0ZXItPmh3X2luaXRfY29tcGxldGVkID09IGZhbHNlICYmIGJBbGxvdyA9PSBmYWxzZSkKLQkJcmV0dXJuIF9GQUlMOwotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIHZvaWQgcnR3X2NtZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci0KLWludCBydHdfZW5xdWV1ZV9jbWQyM2Eoc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdiwgc3RydWN0IGNtZF9vYmogKmNtZF9vYmopCi17Ci0JaW50IHJlcyA9IF9GQUlMOwotCi0JaWYgKCFjbWRfb2JqKQotCQlnb3RvIGV4aXQ7Ci0KLQljbWRfb2JqLT5wYWRhcHRlciA9IHBjbWRwcml2LT5wYWRhcHRlcjsKLQotCXJlcyA9IHJ0d19jbWRfZmlsdGVyKHBjbWRwcml2LCBjbWRfb2JqKTsKLQlpZiAocmVzID09IF9GQUlMKSB7Ci0JCXJ0d19mcmVlX2NtZF9vYmoyM2EoY21kX29iaik7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlJTklUX1dPUksoJmNtZF9vYmotPndvcmssIHJ0d19jbWRfd29yayk7Ci0KLQlyZXMgPSBxdWV1ZV93b3JrKHBjbWRwcml2LT53cSwgJmNtZF9vYmotPndvcmspOwotCi0JaWYgKCFyZXMpIHsKLQkJbmV0ZGV2X2VycihwY21kcHJpdi0+cGFkYXB0ZXItPnBuZXRkZXYsCi0JCQkgICAiJXM6IENhbGwgdG8gcXVldWVfd29yaygpIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXMgPSBfRkFJTDsKLQl9IGVsc2UKLQkJcmVzID0gX1NVQ0NFU1M7Ci1leGl0OgotCi0JcmV0dXJuIHJlczsKLX0KLQotdm9pZCBydHdfZnJlZV9jbWRfb2JqMjNhKHN0cnVjdCBjbWRfb2JqICpwY21kKQotewotCi0JaWYgKHBjbWQtPmNtZGNvZGUgIT0gX0pvaW5Cc3NfQ01EXyAmJgotCSAgICBwY21kLT5jbWRjb2RlICE9IF9DcmVhdGVCc3NfQ01EXykgewotCQkvKiBmcmVlIHBhcm1idWYgaW4gY21kX29iaiAqLwotCQlrZnJlZShwY21kLT5wYXJtYnVmKTsKLQl9Ci0KLQlpZiAocGNtZC0+cnNwKSB7Ci0JCWlmIChwY21kLT5yc3BzeiAhPSAwKSB7Ci0JCQkvKiBmcmVlIHJzcCBpbiBjbWRfb2JqICovCi0JCQlrZnJlZShwY21kLT5yc3ApOwotCQl9Ci0JfQotCi0Ja2ZyZWUocGNtZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJ0d19jbWRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0JaW50ICgqY21kX2hkbCkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotCXZvaWQgKCpwY21kX2NhbGxiYWNrKShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmRldiwgc3RydWN0IGNtZF9vYmogKnBjbWQpOwotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXY7Ci0Jc3RydWN0IGNtZF9vYmogKnBjbWQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGNtZF9vYmosIHdvcmspOwotCi0JcGNtZHByaXYgPSAmcGNtZC0+cGFkYXB0ZXItPmNtZHByaXY7Ci0KLQlpZiAocnR3X2NtZF9maWx0ZXIocGNtZHByaXYsIHBjbWQpID09IF9GQUlMKSB7Ci0JCXBjbWQtPnJlcyA9IEgyQ19EUk9QUEVEOwotCQlnb3RvIHBvc3RfcHJvY2VzczsKLQl9Ci0KLQlwY21kcHJpdi0+Y21kX2lzc3VlZF9jbnQrKzsKLQotCXBjbWQtPmNtZHN6ID0gQUxJR04ocGNtZC0+Y21kc3osIDQpOwotCi0JaWYgKHBjbWQtPmNtZGNvZGUgPCAoc2l6ZW9mKHdsYW5jbWRzKS9zaXplb2Yoc3RydWN0IGNtZF9oZGwpKSkgewotCQljbWRfaGRsID0gd2xhbmNtZHNbcGNtZC0+Y21kY29kZV0uaDJjZnVuczsKLQotCQlpZiAoY21kX2hkbCkKLQkJCXBjbWQtPnJlcyA9IGNtZF9oZGwocGNtZC0+cGFkYXB0ZXIsIHBjbWQtPnBhcm1idWYpOwotCQllbHNlCi0JCQlwY21kLT5yZXMgPSBIMkNfRFJPUFBFRDsKLQl9IGVsc2UKLQkJcGNtZC0+cmVzID0gSDJDX1BBUkFNRVRFUlNfRVJST1I7Ci0KLXBvc3RfcHJvY2VzczoKLQkvKiBjYWxsIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBwb3N0LXByb2Nlc3NlZCAqLwotCWlmIChwY21kLT5jbWRjb2RlIDwgQVJSQVlfU0laRShydHdfY21kX2NhbGxiYWNrKSkgewotCQlwY21kX2NhbGxiYWNrID0JcnR3X2NtZF9jYWxsYmFja1twY21kLT5jbWRjb2RlXS5jYWxsYmFjazsKLQkJaWYgKCFwY21kX2NhbGxiYWNrKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2luZm9fLAotCQkJCSAibWxtZV9jbWRfaGRsKCk6IHBjbWRfY2FsbGJhY2sgPSAweCVwLCBjbWRjb2RlID0gMHgleFxuIiwKLQkJCQkgcGNtZF9jYWxsYmFjaywgcGNtZC0+Y21kY29kZSk7Ci0JCQlydHdfZnJlZV9jbWRfb2JqMjNhKHBjbWQpOwotCQl9IGVsc2UgewotCQkJLyogbmVlZCBjb25zaWRlciB0aGF0IGZyZWUgY21kX29iaiBpbgotCQkJICAgcnR3X2NtZF9jYWxsYmFjayAqLwotCQkJcGNtZF9jYWxsYmFjayhwY21kLT5wYWRhcHRlciwgcGNtZCk7Ci0JCX0KLQl9IGVsc2UgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIiVzOiBjbWRjb2RlID0gMHgleCBjYWxsYmFjayBub3QgZGVmaW5lZCFcbiIsCi0JCQkgX19mdW5jX18sIHBjbWQtPmNtZGNvZGUpOwotCQlydHdfZnJlZV9jbWRfb2JqMjNhKHBjbWQpOwotCX0KLX0KLQotCi1pbnQgcnR3X3NpdGVzdXJ2ZXlfY21kMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgIHN0cnVjdCBjZmc4MDIxMV9zc2lkICpzc2lkLCBpbnQgc3NpZF9udW0sCi0JCQkgIHN0cnVjdCBydHdfaWVlZTgwMjExX2NoYW5uZWwgKmNoLCBpbnQgY2hfbnVtKQotewotCWludCByZXMgPSBfRkFJTDsKLQlzdHJ1Y3QgY21kX29iaiAqcGgyYzsKLQlzdHJ1Y3Qgc2l0ZXN1cnZleV9wYXJtICpwc3VydmV5UGFyYTsKLQlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKQotCQlydHdfbHBzX2N0cmxfd2tfY21kMjNhKHBhZGFwdGVyLCBMUFNfQ1RSTF9TQ0FOLCAxKTsKLQotCXBoMmMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaiksIEdGUF9BVE9NSUMpOwotCWlmICghcGgyYykKLQkJcmV0dXJuIF9GQUlMOwotCi0JcHN1cnZleVBhcmEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2l0ZXN1cnZleV9wYXJtKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwc3VydmV5UGFyYSkgewotCQlrZnJlZShwaDJjKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCXJ0d19mcmVlX25ldHdvcmtfcXVldWUyM2EocGFkYXB0ZXIpOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9pbmZvXywKLQkJICIlczogZmx1c2ggbmV0d29yayBxdWV1ZVxuIiwgX19mdW5jX18pOwotCi0JaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHN1cnZleVBhcmEsCi0JCQkJICAgR0VOX0NNRF9DT0RFKF9TaXRlU3VydmV5KSk7Ci0KLQkvKiBwc3VydmV5UGFyYS0+YnNzbGltaXQgPSA0ODsgKi8KLQlwc3VydmV5UGFyYS0+c2Nhbl9tb2RlID0gcG1sbWVwcml2LT5zY2FuX21vZGU7Ci0KLQkvKiBwcmVwYXJlIHNzaWQgbGlzdCAqLwotCWlmIChzc2lkKSB7Ci0JCWludCBpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBzc2lkX251bSAmJiBpIDwgUlRXX1NTSURfU0NBTl9BTU9VTlQ7IGkrKykgewotCQkJaWYgKHNzaWRbaV0uc3NpZF9sZW4pIHsKLQkJCQltZW1jcHkoJnBzdXJ2ZXlQYXJhLT5zc2lkW2ldLCAmc3NpZFtpXSwKLQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjZmc4MDIxMV9zc2lkKSk7Ci0JCQkJcHN1cnZleVBhcmEtPnNzaWRfbnVtKys7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBwcmVwYXJlIGNoYW5uZWwgbGlzdCAqLwotCWlmIChjaCkgewotCQlpbnQgaTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgY2hfbnVtICYmIGkgPCBSVFdfQ0hBTk5FTF9TQ0FOX0FNT1VOVDsgaSsrKSB7Ci0JCQlpZiAoY2hbaV0uaHdfdmFsdWUgJiYKLQkJCSAgICAhKGNoW2ldLmZsYWdzICYgSUVFRTgwMjExX0NIQU5fRElTQUJMRUQpKSB7Ci0JCQkJbWVtY3B5KCZwc3VydmV5UGFyYS0+Y2hbaV0sICZjaFtpXSwKLQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2NoYW5uZWwpKTsKLQkJCQlwc3VydmV5UGFyYS0+Y2hfbnVtKys7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzZXRfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9TVVJWRVkpOwotCi0JcmVzID0gcnR3X2VucXVldWVfY21kMjNhKHBjbWRwcml2LCBwaDJjKTsKLQotCWlmIChyZXMgPT0gX1NVQ0NFU1MpIHsKLQkJbW9kX3RpbWVyKCZwbWxtZXByaXYtPnNjYW5fdG9fdGltZXIsIGppZmZpZXMgKwotCQkJICBtc2Vjc190b19qaWZmaWVzKFNDQU5OSU5HX1RJTUVPVVQpKTsKLQotCQlwbWxtZXByaXYtPnNjYW5faW50ZXJ2YWwgPSBTQ0FOX0lOVEVSVkFMOy8qICAzMCoyIHNlYyA9IDYwc2VjICovCi0JfSBlbHNlCi0JCV9jbHJfZndzdGF0ZV8ocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKTsKLQotCXJldHVybiByZXM7Ci19Ci0KLXZvaWQgcnR3X2dldGJicmZyZWdfY21kcnNwX2NhbGxiYWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgICAgIHN0cnVjdCBjbWRfb2JqICpwY21kKQotewotCWtmcmVlKHBjbWQtPnBhcm1idWYpOwotCWtmcmVlKHBjbWQpOwotfQotCi1pbnQgcnR3X2NyZWF0ZWJzc19jbWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGNtZF9vYmogKnBjbWQ7Ci0Jc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwZGV2X25ldHdvcms7Ci0JdTggcmVzID0gX1NVQ0NFU1M7Ci0KLQlwZGV2X25ldHdvcmsgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5kZXZfbmV0d29yazsKLQotCWlmIChwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZF9sZW4gPT0gMCkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2luZm9fLAotCQkJICJjcmVhdGVic3MgZm9yIEFueSBTU2lkOiVzXG4iLAotCQkJIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkKTsKLQl9IGVsc2UgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2luZm9fLAotCQkJICJjcmVhdGVic3MgZm9yIFNTaWQ6JXNcbiIsCi0JCQkgcG1sbWVwcml2LT5hc3NvY19zc2lkLnNzaWQpOwotCX0KLQotCXBjbWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaiksIEdGUF9BVE9NSUMpOwotCWlmICghcGNtZCkgewotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXBjbWQtPmNtZGNvZGUgPSBfQ3JlYXRlQnNzX0NNRF87Ci0JcGNtZC0+cGFybWJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopcGRldl9uZXR3b3JrOwotCXBjbWQtPmNtZHN6ID0gZ2V0X3dsYW5fYnNzaWRfZXhfc3oocGRldl9uZXR3b3JrKTsKLQlwY21kLT5yc3AgPSBOVUxMOwotCXBjbWQtPnJzcHN6ID0gMDsKLQotCXBkZXZfbmV0d29yay0+TGVuZ3RoID0gcGNtZC0+Y21kc3o7Ci0KLQlyZXMgPSBydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBjbWQpOwotCi1leGl0OgotCi0JcmV0dXJuIHJlczsKLX0KLQotaW50IHJ0d19qb2luYnNzX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgICAgc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmspCi17Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwc2VjbmV0d29yazsKLQlzdHJ1Y3QgY21kX29iaiAqcGNtZDsKLQlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCXN0cnVjdCBodF9wcml2ICpwaHRwcml2ID0gJnBtbG1lcHJpdi0+aHRwcml2OwotCWVudW0gbmw4MDIxMV9pZnR5cGUgaWZtb2RlOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlpZm1vZGUgPSBwbmV0d29yay0+bmV0d29yay5pZm1vZGU7Ci0KLQlpZiAocG1sbWVwcml2LT5hc3NvY19zc2lkLnNzaWRfbGVuID09IDApIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9pbmZvXywKLQkJCSAiK0pvaW4gY21kOiBBbnkgU1NpZFxuIik7Ci0JfSBlbHNlIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9ub3RpY2VfLAotCQkJICIrSm9pbiBjbWQ6IFNTaWQgPVslc11cbiIsCi0JCQkgcG1sbWVwcml2LT5hc3NvY19zc2lkLnNzaWQpOwotCX0KLQotCXBjbWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaiksIEdGUF9BVE9NSUMpOwotCWlmICghcGNtZCkgewotCQlyZXMgPSBfRkFJTDsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9lcnJfLAotCQkJICJydHdfam9pbmJzc19jbWQyM2E6IG1lbW9yeSBhbGxvY2F0ZSBmb3IgY21kX29iaiBmYWlsISEhXG4iKTsKLQkJZ290byBleGl0OwotCX0KLQotCS8qIGZvciBoaWRkZW4gYXAgdG8gc2V0IGZ3X3N0YXRlIGhlcmUgKi8KLQlpZiAoIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEV8V0lGSV9BREhPQ19TVEFURSkpIHsKLQkJc3dpdGNoIChpZm1vZGUpIHsKLQkJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKLQkJCXNldF9md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19TVEFURSk7Ci0JCQlicmVhazsKLQkJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UOgotCQljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046Ci0JCQlzZXRfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHNlY25ldHdvcmsgPSAmcHNlY3VyaXR5cHJpdi0+c2VjX2JzczsKLQlpZiAoIXBzZWNuZXR3b3JrKSB7Ci0JCWtmcmVlKHBjbWQpOwotCQlyZXMgPSBfRkFJTDsKLQotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2Vycl8sCi0JCQkgInJ0d19qb2luYnNzX2NtZDIzYSA6cHNlY25ldHdvcmsgPT0gTlVMTCEhIVxuIik7Ci0KLQkJZ290byBleGl0OwotCX0KLQotCW1lbXNldChwc2VjbmV0d29yaywgMCwgc2l6ZW9mKHN0cnVjdCB3bGFuX2Jzc2lkX2V4KSk7Ci0KLQltZW1jcHkocHNlY25ldHdvcmssICZwbmV0d29yay0+bmV0d29yaywKLQkgICAgICAgZ2V0X3dsYW5fYnNzaWRfZXhfc3ooJnBuZXR3b3JrLT5uZXR3b3JrKSk7Ci0KLQlwc2VjbmV0d29yay0+SUVMZW5ndGggPSAwOwotCS8qICBBZGRlZCBieSBBbGJlcnQgMjAwOS8wMi8xOCAqLwotCS8qICBJZiB0aGUgdGhlIGRyaXZlciB3YW50cyB0byB1c2UgdGhlIGJzc2lkIHRvIGNyZWF0ZSB0aGUKLQkgKiAgY29ubmVjdGlvbi4gSWYgbm90LCAgd2UgaGF2ZSB0byBjb3B5IHRoZSBjb25uZWN0aW5nIEFQJ3MKLQkgKiAgTUFDIGFkZHJlc3MgdG8gaXQgc28gdGhhdCB0aGUgZHJpdmVyIGp1c3QgaGFzIHRoZSBic3NpZAotCSAqICBpbmZvcm1hdGlvbiBmb3IgUE1LSURMaXN0IHNlYXJjaGluZy4gKi8KLQotCWlmIChwbWxtZXByaXYtPmFzc29jX2J5X2Jzc2lkID09IGZhbHNlKQotCQlldGhlcl9hZGRyX2NvcHkoJnBtbG1lcHJpdi0+YXNzb2NfYnNzaWRbMF0sCi0JCQkJJnBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3NbMF0pOwotCi0JcHNlY25ldHdvcmstPklFTGVuZ3RoID0KLQkJcnR3X3Jlc3RydWN0X3NlY19pZTIzYShwYWRhcHRlciwgJnBuZXR3b3JrLT5uZXR3b3JrLklFc1swXSwKLQkJCQkgICAgICAgJnBzZWNuZXR3b3JrLT5JRXNbMF0sCi0JCQkJICAgICAgIHBuZXR3b3JrLT5uZXR3b3JrLklFTGVuZ3RoKTsKLQotCXBtbG1lcHJpdi0+cW9zX29wdGlvbiA9IDA7Ci0KLQlpZiAocHJlZ2lzdHJ5cHJpdi0+d21tX2VuYWJsZSkgewotCQl1MzIgdG1wX2xlbjsKLQotCQl0bXBfbGVuID0gcnR3X3Jlc3RydWN0X3dtbV9pZTIzYShwYWRhcHRlciwKLQkJCQkJCSAmcG5ldHdvcmstPm5ldHdvcmsuSUVzWzBdLAotCQkJCQkJICZwc2VjbmV0d29yay0+SUVzWzBdLAotCQkJCQkJIHBuZXR3b3JrLT5uZXR3b3JrLklFTGVuZ3RoLAotCQkJCQkJIHBzZWNuZXR3b3JrLT5JRUxlbmd0aCk7Ci0KLQkJaWYgKHBzZWNuZXR3b3JrLT5JRUxlbmd0aCAhPSB0bXBfbGVuKSB7Ci0JCQlwc2VjbmV0d29yay0+SUVMZW5ndGggPSB0bXBfbGVuOwotCQkJLyogVGhlcmUgaXMgV01NIElFIGluIHRoaXMgY29ycmVzcC4gYmVhY29uICovCi0JCQlwbWxtZXByaXYtPnFvc19vcHRpb24gPSAxOwotCQl9IGVsc2UgewotCQkJLyogVGhlcmUgaXMgbm8gV01NIElFIGluIHRoaXMgY29ycmVzcC4gYmVhY29uICovCi0JCQlwbWxtZXByaXYtPnFvc19vcHRpb24gPSAwOwotCQl9Ci0JfQotCi0JcGh0cHJpdi0+aHRfb3B0aW9uID0gZmFsc2U7Ci0JaWYgKHByZWdpc3RyeXByaXYtPmh0X2VuYWJsZSkgewotCQl1MzIgYWxnbyA9IHBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFQcml2YWN5QWxncnRobTsKLQkJLyoJQWRkZWQgYnkgQWxiZXJ0IDIwMTAvMDYvMjMgKi8KLQkJLyoJRm9yIHRoZSBXRVAgbW9kZSwgd2Ugd2lsbCB1c2UgdGhlIGJnIG1vZGUgdG8gZG8KLQkJCXRoZSBjb25uZWN0aW9uIHRvIGF2b2lkIHNvbWUgSU9UIGlzc3VlLiAqLwotCQkvKglFc3BlY2lhbGx5IGZvciBSZWFsdGVrIDgxOTJ1IFNvZnRBUC4gKi8KLQkJaWYgKGFsZ28gIT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgJiYKLQkJICAgIGFsZ28gIT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0ICYmCi0JCSAgICBhbGdvICE9IFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVApIHsKLQkJCS8qIHJ0d19yZXN0cnVjdHVyZV9odF9pZTIzYSAqLwotCQkJcnR3X3Jlc3RydWN0dXJlX2h0X2llMjNhKHBhZGFwdGVyLAotCQkJCQkJICZwbmV0d29yay0+bmV0d29yay5JRXNbMF0sCi0JCQkJCQkgJnBzZWNuZXR3b3JrLT5JRXNbMF0sCi0JCQkJCQkgcG5ldHdvcmstPm5ldHdvcmsuSUVMZW5ndGgsCi0JCQkJCQkgJnBzZWNuZXR3b3JrLT5JRUxlbmd0aCk7Ci0JCX0KLQl9Ci0KLQlwbWxtZWluZm8tPmFzc29jX0FQX3ZlbmRvciA9Ci0JCWNoZWNrX2Fzc29jX0FQMjNhKHBuZXR3b3JrLT5uZXR3b3JrLklFcywKLQkJCQkgIHBuZXR3b3JrLT5uZXR3b3JrLklFTGVuZ3RoKTsKLQotCWlmIChwbWxtZWluZm8tPmFzc29jX0FQX3ZlbmRvciA9PSBIVF9JT1RfUEVFUl9URU5EQSkKLQkJcGFkYXB0ZXItPnB3cmN0cmxwcml2LnNtYXJ0X3BzID0gMDsKLQllbHNlCi0JCXBhZGFwdGVyLT5wd3JjdHJscHJpdi5zbWFydF9wcyA9Ci0JCQlwYWRhcHRlci0+cmVnaXN0cnlwcml2LnNtYXJ0X3BzOwotCi0JREJHXzg3MjNBKCIlczogc21hcnRfcHMgPSVkXG4iLCBfX2Z1bmNfXywKLQkJICBwYWRhcHRlci0+cHdyY3RybHByaXYuc21hcnRfcHMpOwotCi0JLyogZ2V0IGNtZHN6IGJlZm9yZSBlbmRpYW4gY29udmVyc2lvbiAqLwotCXBjbWQtPmNtZHN6ID0gZ2V0X3dsYW5fYnNzaWRfZXhfc3oocHNlY25ldHdvcmspOwotCi0JcGNtZC0+Y21kY29kZSA9IF9Kb2luQnNzX0NNRF87LyogR0VOX0NNRF9DT0RFKF9Kb2luQnNzKSAqLwotCXBjbWQtPnBhcm1idWYgPSAodW5zaWduZWQgY2hhciAqKXBzZWNuZXR3b3JrOwotCXBjbWQtPnJzcCA9IE5VTEw7Ci0JcGNtZC0+cnNwc3ogPSAwOwotCi0JcmVzID0gcnR3X2VucXVldWVfY21kMjNhKHBjbWRwcml2LCBwY21kKTsKLWV4aXQ6Ci0KLQlyZXR1cm4gcmVzOwotfQotCi1pbnQgcnR3X2Rpc2Fzc29jX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgZGVhdXRoX3RpbWVvdXRfbXMsCi0JCQlib29sIGVucXVldWUpCi17Ci0Jc3RydWN0IGNtZF9vYmogKmNtZG9iaiA9IE5VTEw7Ci0Jc3RydWN0IGRpc2Nvbm5lY3RfcGFybSAqcGFyYW0gPSBOVUxMOwotCXN0cnVjdCBjbWRfcHJpdiAqY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKLQlpbnQgcmVzID0gX1NVQ0NFU1M7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X25vdGljZV8sCi0JCSAiK3J0d19kaXNhc3NvY19jbWQyM2FcbiIpOwotCi0JLyogcHJlcGFyZSBjbWQgcGFyYW1ldGVyICovCi0JcGFyYW0gPSBremFsbG9jKHNpemVvZigqcGFyYW0pLCBHRlBfQVRPTUlDKTsKLQlpZiAocGFyYW0gPT0gTlVMTCkgewotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQlwYXJhbS0+ZGVhdXRoX3RpbWVvdXRfbXMgPSBkZWF1dGhfdGltZW91dF9tczsKLQotCWlmIChlbnF1ZXVlKSB7Ci0JCS8qIG5lZWQgZW5xdWV1ZSwgcHJlcGFyZSBjbWRfb2JqIGFuZCBlbnF1ZXVlICovCi0JCWNtZG9iaiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7Ci0JCWlmICghY21kb2JqKSB7Ci0JCQlyZXMgPSBfRkFJTDsKLQkJCWtmcmVlKHBhcmFtKTsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChjbWRvYmosIHBhcmFtLCBfRGlzQ29ubmVjdF9DTURfKTsKLQkJcmVzID0gcnR3X2VucXVldWVfY21kMjNhKGNtZHByaXYsIGNtZG9iaik7Ci0JfSBlbHNlIHsKLQkJLyogbm8gbmVlZCB0byBlbnF1ZXVlLCBkbyB0aGUgY21kIGhkbCBkaXJlY3RseSBhbmQKLQkJICAgZnJlZSBjbWQgcGFyYW1ldGVyICovCi0JCWlmIChkaXNjb25uZWN0X2hkbDIzYShwYWRhcHRlciwgKHU4ICopcGFyYW0pICE9IEgyQ19TVUNDRVNTKQotCQkJcmVzID0gX0ZBSUw7Ci0JCWtmcmVlKHBhcmFtKTsKLQl9Ci0KLWV4aXQ6Ci0JcmV0dXJuIHJlczsKLX0KLQotaW50IHJ0d19zZXRvcG1vZGVfY21kMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgZW51bSBubDgwMjExX2lmdHlwZSBpZm1vZGUpCi17Ci0Jc3RydWN0CWNtZF9vYmogKnBoMmM7Ci0Jc3RydWN0CXNldG9wbW9kZV9wYXJtICpwc2V0b3A7Ci0Jc3RydWN0CWNtZF9wcml2ICAgKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQotCXBoMmMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaiksIEdGUF9LRVJORUwpOwotCWlmICghcGgyYykgewotCQlyZXMgPSBmYWxzZTsKLQkJZ290byBleGl0OwotCX0KLQlwc2V0b3AgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2V0b3Btb2RlX3Bhcm0pLCBHRlBfS0VSTkVMKTsKLQotCWlmICghcHNldG9wKSB7Ci0JCWtmcmVlKHBoMmMpOwotCQlyZXMgPSBmYWxzZTsKLQkJZ290byBleGl0OwotCX0KLQotCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHBzZXRvcCwgX1NldE9wTW9kZV9DTURfKTsKLQlwc2V0b3AtPm1vZGUgPSBpZm1vZGU7Ci0KLQlyZXMgPSBydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBoMmMpOwotZXhpdDoKLQlyZXR1cm4gcmVzOwotfQotCi1pbnQgcnR3X3NldHN0YWtleV9jbWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnBzdGEsIHU4IHVuaWNhc3Rfa2V5KQotewotCXN0cnVjdCBjbWRfb2JqICpwaDJjOwotCXN0cnVjdCBzZXRfc3Rha2V5X3Bhcm0gKnBzZXRzdGFrZXlfcGFyYTsKLQlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwotCXN0cnVjdCBzZXRfc3Rha2V5X3JzcCAqcHNldHN0YWtleV9yc3AgPSBOVUxMOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSA9IChzdHJ1Y3Qgc3RhX2luZm8gKilwc3RhOwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQotCXBoMmMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaiksIEdGUF9LRVJORUwpOwotCWlmICghcGgyYykgewotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXBzZXRzdGFrZXlfcGFyYSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXRfc3Rha2V5X3Bhcm0pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBzZXRzdGFrZXlfcGFyYSkgewotCQlrZnJlZShwaDJjKTsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwc2V0c3Rha2V5X3JzcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXRfc3Rha2V5X3JzcCksIEdGUF9LRVJORUwpOwotCWlmICghcHNldHN0YWtleV9yc3ApIHsKLQkJa2ZyZWUocGgyYyk7Ci0JCWtmcmVlKHBzZXRzdGFrZXlfcGFyYSk7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHNldHN0YWtleV9wYXJhLCBfU2V0U3RhS2V5X0NNRF8pOwotCXBoMmMtPnJzcCA9ICh1OCAqKSBwc2V0c3Rha2V5X3JzcDsKLQlwaDJjLT5yc3BzeiA9IHNpemVvZihzdHJ1Y3Qgc2V0X3N0YWtleV9yc3ApOwotCi0JZXRoZXJfYWRkcl9jb3B5KHBzZXRzdGFrZXlfcGFyYS0+YWRkciwgc3RhLT5od2FkZHIpOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpKSB7Ci0JCXBzZXRzdGFrZXlfcGFyYS0+YWxnb3JpdGhtID0KLQkJCSh1bnNpZ25lZCBjaGFyKXBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG07Ci0JfSBlbHNlIHsKLQkJR0VUX0VOQ1JZX0FMR08ocHNlY3VyaXR5cHJpdiwgc3RhLCBwc2V0c3Rha2V5X3BhcmEtPmFsZ29yaXRobSwKLQkJCSAgICAgICBmYWxzZSk7Ci0JfQotCi0JaWYgKHVuaWNhc3Rfa2V5ID09IHRydWUpIHsKLQkJbWVtY3B5KCZwc2V0c3Rha2V5X3BhcmEtPmtleSwgJnN0YS0+ZG90MTE4MDIxeF9VbmNzdEtleSwgMTYpOwotCX0gZWxzZSB7Ci0JCWludCBpZHggPSBwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwS2V5aWQ7Ci0KLQkJbWVtY3B5KCZwc2V0c3Rha2V5X3BhcmEtPmtleSwKLQkJICAgICAgICZwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwS2V5W2lkeF0uc2tleSwgMTYpOwotCX0KLQotCS8qIGplZmY6IHNldCB0aGlzIGJlY2F1c2UgYXQgbGVhc3Qgc3cga2V5IGlzIHJlYWR5ICovCi0JcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idXNldGtpcGtleSA9IDE7Ci0KLQlyZXMgPSBydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBoMmMpOwotCi1leGl0OgotCi0JcmV0dXJuIHJlczsKLX0KLQotaW50IHJ0d19jbGVhcnN0YWtleV9jbWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnBzdGEsIHU4IGVudHJ5LAotCQkJICAgdTggZW5xdWV1ZSkKLXsKLQlzdHJ1Y3QgY21kX29iaiAqcGgyYzsKLQlzdHJ1Y3Qgc2V0X3N0YWtleV9wYXJtICpwc2V0c3Rha2V5X3BhcmE7Ci0Jc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKLQlzdHJ1Y3Qgc2V0X3N0YWtleV9yc3AgKnBzZXRzdGFrZXlfcnNwID0gTlVMTDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSA9IChzdHJ1Y3Qgc3RhX2luZm8gKilwc3RhOwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQotCWlmICghZW5xdWV1ZSkgewotCQljbGVhcl9jYW1fZW50cnkyM2EocGFkYXB0ZXIsIGVudHJ5KTsKLQl9IGVsc2UgewotCQlwaDJjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFwaDJjKSB7Ci0JCQlyZXMgPSBfRkFJTDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCi0JCXBzZXRzdGFrZXlfcGFyYSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXRfc3Rha2V5X3Bhcm0pLAotCQkJCQkgIEdGUF9LRVJORUwpOwotCQlpZiAoIXBzZXRzdGFrZXlfcGFyYSkgewotCQkJa2ZyZWUocGgyYyk7Ci0JCQlyZXMgPSBfRkFJTDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCi0JCXBzZXRzdGFrZXlfcnNwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNldF9zdGFrZXlfcnNwKSwKLQkJCQkJIEdGUF9LRVJORUwpOwotCQlpZiAoIXBzZXRzdGFrZXlfcnNwKSB7Ci0JCQlrZnJlZShwaDJjKTsKLQkJCWtmcmVlKHBzZXRzdGFrZXlfcGFyYSk7Ci0JCQlyZXMgPSBfRkFJTDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCi0JCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHBzZXRzdGFrZXlfcGFyYSwKLQkJCQkJICAgX1NldFN0YUtleV9DTURfKTsKLQkJcGgyYy0+cnNwID0gKHU4ICopIHBzZXRzdGFrZXlfcnNwOwotCQlwaDJjLT5yc3BzeiA9IHNpemVvZihzdHJ1Y3Qgc2V0X3N0YWtleV9yc3ApOwotCi0JCWV0aGVyX2FkZHJfY29weShwc2V0c3Rha2V5X3BhcmEtPmFkZHIsIHN0YS0+aHdhZGRyKTsKLQotCQlwc2V0c3Rha2V5X3BhcmEtPmFsZ29yaXRobSA9IDA7Ci0KLQkJcHNldHN0YWtleV9wYXJhLT5pZCA9IGVudHJ5OwotCi0JCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZDIzYShwY21kcHJpdiwgcGgyYyk7Ci0JfQotZXhpdDoKLQlyZXR1cm4gcmVzOwotfQotCi1pbnQgcnR3X2FkZGJhcmVxX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB0aWQsIHU4ICphZGRyKQotewotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7Ci0Jc3RydWN0IGNtZF9vYmogKnBoMmM7Ci0Jc3RydWN0IGFkZEJhUmVxX3Bhcm0gKnBhZGRiYXJlcV9wYXJtOwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQotCWlmICh0aWQgPj0gTUFYVElEKSB7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcGgyYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwaDJjKSB7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcGFkZGJhcmVxX3Bhcm0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWRkQmFSZXFfcGFybSksIEdGUF9BVE9NSUMpOwotCWlmICghcGFkZGJhcmVxX3Bhcm0pIHsKLQkJa2ZyZWUocGgyYyk7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcGFkZGJhcmVxX3Bhcm0tPnRpZCA9IHRpZDsKLQlldGhlcl9hZGRyX2NvcHkocGFkZGJhcmVxX3Bhcm0tPmFkZHIsIGFkZHIpOwotCi0JaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcGFkZGJhcmVxX3Bhcm0sCi0JCQkJICAgR0VOX0NNRF9DT0RFKF9BZGRCQVJlcSkpOwotCi0JcmVzID0gcnR3X2VucXVldWVfY21kMjNhKHBjbWRwcml2LCBwaDJjKTsKLWV4aXQ6Ci0JcmV0dXJuIHJlczsKLX0KLQotaW50IHJ0d19keW5hbWljX2Noa193a19jbWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgY21kX29iaiAqcGgyYzsKLQlzdHJ1Y3QgZHJ2ZXh0cmFfY21kX3Bhcm0gKnBkcnZleHRyYV9jbWRfcGFybTsKLQlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQotCXBoMmMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaiksIEdGUF9BVE9NSUMpOwotCWlmICghcGgyYykgewotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXBkcnZleHRyYV9jbWRfcGFybSA9IGt6YWxsb2Moc2l6ZW9mKCpwZHJ2ZXh0cmFfY21kX3Bhcm0pLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXBkcnZleHRyYV9jbWRfcGFybSkgewotCQlrZnJlZShwaDJjKTsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwZHJ2ZXh0cmFfY21kX3Bhcm0tPmVjX2lkID0gRFlOQU1JQ19DSEtfV0tfQ0lEOwotCXBkcnZleHRyYV9jbWRfcGFybS0+dHlwZV9zaXplID0gMDsKLQlwZHJ2ZXh0cmFfY21kX3Bhcm0tPnBidWYgPSAodTggKilwYWRhcHRlcjsKLQotCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHBkcnZleHRyYV9jbWRfcGFybSwKLQkJCQkgICBHRU5fQ01EX0NPREUoX1NldF9EcnZfRXh0cmEpKTsKLQotCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZDIzYShwY21kcHJpdiwgcGgyYyk7Ci1leGl0OgotCi0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIHZvaWQgdHJhZmZpY19zdGF0dXNfd2F0Y2hkb2coc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1OCBiRW50ZXJQUzsKLQl1OCBiQnVzeVRyYWZmaWMgPSBmYWxzZSwgYlR4QnVzeVRyYWZmaWMgPSBmYWxzZSwgYlJ4QnVzeVRyYWZmaWMgPSBmYWxzZTsKLQl1OCBiSGlnaGVyQnVzeVRyYWZmaWMgPSBmYWxzZSwgYkhpZ2hlckJ1c3lSeFRyYWZmaWMgPSBmYWxzZTsKLQl1OCBiSGlnaGVyQnVzeVR4VHJhZmZpYyA9IGZhbHNlOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0JaW50IEJ1c3lUaHJlc2hvbGQgPSAxMDA7Ci0Jc3RydWN0IHJ0X2xpbmtfZGV0ZWN0ICpsZGkgPSAmcG1sbWVwcml2LT5MaW5rRGV0ZWN0SW5mbzsKLQotCS8qICAqLwotCS8qICBEZXRlcm1pbmUgaWYgb3VyIHRyYWZmaWMgaXMgYnVzeSBub3cgKi8KLQkvKiAgKi8KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKSB7Ci0JCWlmIChydGw4NzIzYV9CVF9jb2V4aXN0KHBhZGFwdGVyKSkKLQkJCUJ1c3lUaHJlc2hvbGQgPSA1MDsKLQkJZWxzZSBpZiAobGRpLT5iQnVzeVRyYWZmaWMpCi0JCQlCdXN5VGhyZXNob2xkID0gNzU7Ci0JCS8qICBpZiB3ZSByYWlzZSBiQnVzeVRyYWZmaWMgaW4gbGFzdCB3YXRjaGRvZywgdXNpbmcKLQkJICAgIGxvd2VyIHRocmVzaG9sZC4gKi8KLQkJaWYgKGxkaS0+TnVtUnhPa0luUGVyaW9kID4gQnVzeVRocmVzaG9sZCB8fAotCQkgICAgbGRpLT5OdW1UeE9rSW5QZXJpb2QgPiBCdXN5VGhyZXNob2xkKSB7Ci0JCQliQnVzeVRyYWZmaWMgPSB0cnVlOwotCi0JCQlpZiAobGRpLT5OdW1SeE9rSW5QZXJpb2QgPiBsZGktPk51bVR4T2tJblBlcmlvZCkKLQkJCQliUnhCdXN5VHJhZmZpYyA9IHRydWU7Ci0JCQllbHNlCi0JCQkJYlR4QnVzeVRyYWZmaWMgPSB0cnVlOwotCQl9Ci0KLQkJLyogIEhpZ2hlciBUeC9SeCBkYXRhLiAqLwotCQlpZiAobGRpLT5OdW1SeE9rSW5QZXJpb2QgPiA0MDAwIHx8Ci0JCSAgICBsZGktPk51bVR4T2tJblBlcmlvZCA+IDQwMDApIHsKLQkJCWJIaWdoZXJCdXN5VHJhZmZpYyA9IHRydWU7Ci0KLQkJCWlmIChsZGktPk51bVJ4T2tJblBlcmlvZCA+IGxkaS0+TnVtVHhPa0luUGVyaW9kKQotCQkJCWJIaWdoZXJCdXN5UnhUcmFmZmljID0gdHJ1ZTsKLQkJCWVsc2UKLQkJCQliSGlnaGVyQnVzeVR4VHJhZmZpYyA9IHRydWU7Ci0JCX0KLQotCQlpZiAoIXJ0bDg3MjNhX0JUX2NvZXhpc3QocGFkYXB0ZXIpIHx8Ci0JCSAgICAhcnRsODcyM2FfQlRfdXNpbmdfYW50ZW5uYV8xKHBhZGFwdGVyKSkgewotCQkvKiAgY2hlY2sgdHJhZmZpYyBmb3IgIHBvd2Vyc2F2aW5nLiAqLwotCQkJaWYgKCgobGRpLT5OdW1SeFVuaWNhc3RPa0luUGVyaW9kICsKLQkJCSAgICAgIGxkaS0+TnVtVHhPa0luUGVyaW9kKSA+IDgpIHx8Ci0JCQkgICAgbGRpLT5OdW1SeFVuaWNhc3RPa0luUGVyaW9kID4gMikKLQkJCQliRW50ZXJQUyA9IGZhbHNlOwotCQkJZWxzZQotCQkJCWJFbnRlclBTID0gdHJ1ZTsKLQotCQkJLyogIExlaXN1cmVQUyBvbmx5IHdvcmsgaW4gaW5mcmEgbW9kZS4gKi8KLQkJCWlmIChiRW50ZXJQUykKLQkJCQlMUFNfRW50ZXIyM2EocGFkYXB0ZXIpOwotCQkJZWxzZQotCQkJCUxQU19MZWF2ZTIzYShwYWRhcHRlcik7Ci0JCX0KLQl9IGVsc2UKLQkJTFBTX0xlYXZlMjNhKHBhZGFwdGVyKTsKLQotCWxkaS0+TnVtUnhPa0luUGVyaW9kID0gMDsKLQlsZGktPk51bVR4T2tJblBlcmlvZCA9IDA7Ci0JbGRpLT5OdW1SeFVuaWNhc3RPa0luUGVyaW9kID0gMDsKLQlsZGktPmJCdXN5VHJhZmZpYyA9IGJCdXN5VHJhZmZpYzsKLQlsZGktPmJUeEJ1c3lUcmFmZmljID0gYlR4QnVzeVRyYWZmaWM7Ci0JbGRpLT5iUnhCdXN5VHJhZmZpYyA9IGJSeEJ1c3lUcmFmZmljOwotCWxkaS0+YkhpZ2hlckJ1c3lUcmFmZmljID0gYkhpZ2hlckJ1c3lUcmFmZmljOwotCWxkaS0+YkhpZ2hlckJ1c3lSeFRyYWZmaWMgPSBiSGlnaGVyQnVzeVJ4VHJhZmZpYzsKLQlsZGktPmJIaWdoZXJCdXN5VHhUcmFmZmljID0gYkhpZ2hlckJ1c3lUeFRyYWZmaWM7Ci19Ci0KLXN0YXRpYyB2b2lkIGR5bmFtaWNfY2hrX3drX2hkbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcGJ1ZiwgaW50IHN6KQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdjsKLQotCXBhZGFwdGVyID0gKHN0cnVjdCBydHdfYWRhcHRlciAqKXBidWY7Ci0JcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpCi0JCWV4cGlyZV90aW1lb3V0X2NoazIzYShwYWRhcHRlcik7Ci0jZW5kaWYKLQotCXJ0bDg3MjNhX3NyZXNldF94bWl0X3N0YXR1c19jaGVjayhwYWRhcHRlcik7Ci0KLQlsaW5rZWRfc3RhdHVzX2NoazIzYShwYWRhcHRlcik7Ci0JdHJhZmZpY19zdGF0dXNfd2F0Y2hkb2cocGFkYXB0ZXIpOwotCi0JcnRsODcyM2FfSGFsRG1XYXRjaERvZyhwYWRhcHRlcik7Ci0KLQkvKiAgKi8KLQkvKiAgQlQtQ29leGlzdCAqLwotCS8qICAqLwotCXJ0bDg3MjNhX0JUX2RvX2NvZXhpc3QocGFkYXB0ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBscHNfY3RybF93a19oZGwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggbHBzX2N0cmxfdHlwZSkKLXsKLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3Jwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXU4IG1zdGF0dXM7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFKSB8fAotCSAgICBjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19TVEFURSkpCi0JCXJldHVybjsKLQotCXN3aXRjaCAobHBzX2N0cmxfdHlwZSkgewotCWNhc2UgTFBTX0NUUkxfU0NBTjoKLQkJcnRsODcyM2FfQlRfd2lmaXNjYW5fbm90aWZ5KHBhZGFwdGVyLCB0cnVlKTsKLQkJaWYgKCFydGw4NzIzYV9CVF91c2luZ19hbnRlbm5hXzEocGFkYXB0ZXIpKSB7Ci0JCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKQotCQkJCUxQU19MZWF2ZTIzYShwYWRhcHRlcik7Ci0JCQl9Ci0JCWJyZWFrOwotCWNhc2UgTFBTX0NUUkxfSk9JTkJTUzoKLQkJTFBTX0xlYXZlMjNhKHBhZGFwdGVyKTsKLQkJYnJlYWs7Ci0JY2FzZSBMUFNfQ1RSTF9DT05ORUNUOgotCQltc3RhdHVzID0gMTsvKiBjb25uZWN0ICovCi0JCS8qICBSZXNldCBMUFMgU2V0dGluZyAqLwotCQlwYWRhcHRlci0+cHdyY3RybHByaXYuTHBzSWRsZUNvdW50ID0gMDsKLQkJcnRsODcyM2Ffc2V0X0Z3Sm9pbkJzc1JlcG9ydF9jbWQocGFkYXB0ZXIsIDEpOwotCQlydGw4NzIzYV9CVF9tZWRpYXN0YXR1c19ub3RpZnkocGFkYXB0ZXIsIG1zdGF0dXMpOwotCQlicmVhazsKLQljYXNlIExQU19DVFJMX0RJU0NPTk5FQ1Q6Ci0JCW1zdGF0dXMgPSAwOy8qIGRpc2Nvbm5lY3QgKi8KLQkJcnRsODcyM2FfQlRfbWVkaWFzdGF0dXNfbm90aWZ5KHBhZGFwdGVyLCBtc3RhdHVzKTsKLQkJaWYgKCFydGw4NzIzYV9CVF91c2luZ19hbnRlbm5hXzEocGFkYXB0ZXIpKQotCQkJTFBTX0xlYXZlMjNhKHBhZGFwdGVyKTsKLQkJcnRsODcyM2Ffc2V0X0Z3Sm9pbkJzc1JlcG9ydF9jbWQocGFkYXB0ZXIsIDApOwotCQlicmVhazsKLQljYXNlIExQU19DVFJMX1NQRUNJQUxfUEFDS0VUOgotCQlwd3Jwcml2LT5EZWxheUxQU0xhc3RUaW1lU3RhbXAgPSBqaWZmaWVzOwotCQlydGw4NzIzYV9CVF9zcGVjaWFscGFja2V0X25vdGlmeShwYWRhcHRlcik7Ci0JCWlmICghcnRsODcyM2FfQlRfdXNpbmdfYW50ZW5uYV8xKHBhZGFwdGVyKSkKLQkJCUxQU19MZWF2ZTIzYShwYWRhcHRlcik7Ci0JCWJyZWFrOwotCWNhc2UgTFBTX0NUUkxfTEVBVkU6Ci0JCXJ0bDg3MjNhX0JUX2xwc19sZWF2ZShwYWRhcHRlcik7Ci0JCWlmICghcnRsODcyM2FfQlRfdXNpbmdfYW50ZW5uYV8xKHBhZGFwdGVyKSkKLQkJCUxQU19MZWF2ZTIzYShwYWRhcHRlcik7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotfQotCi1pbnQgcnR3X2xwc19jdHJsX3drX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgdTggbHBzX2N0cmxfdHlwZSwgdTggZW5xdWV1ZSkKLXsKLQlzdHJ1Y3QgY21kX29iaiAqcGgyYzsKLQlzdHJ1Y3QgZHJ2ZXh0cmFfY21kX3Bhcm0gKnBkcnZleHRyYV9jbWRfcGFybTsKLQlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQotCWlmIChlbnF1ZXVlKSB7Ci0JCXBoMmMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaiksIEdGUF9BVE9NSUMpOwotCQlpZiAoIXBoMmMpIHsKLQkJCXJlcyA9IF9GQUlMOwotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJcGRydmV4dHJhX2NtZF9wYXJtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRydmV4dHJhX2NtZF9wYXJtKSwKLQkJCQkJICAgICBHRlBfQVRPTUlDKTsKLQkJaWYgKCFwZHJ2ZXh0cmFfY21kX3Bhcm0pIHsKLQkJCWtmcmVlKHBoMmMpOwotCQkJcmVzID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCQlwZHJ2ZXh0cmFfY21kX3Bhcm0tPmVjX2lkID0gTFBTX0NUUkxfV0tfQ0lEOwotCQlwZHJ2ZXh0cmFfY21kX3Bhcm0tPnR5cGVfc2l6ZSA9IGxwc19jdHJsX3R5cGU7Ci0JCXBkcnZleHRyYV9jbWRfcGFybS0+cGJ1ZiA9IE5VTEw7Ci0KLQkJaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcGRydmV4dHJhX2NtZF9wYXJtLAotCQkJCQkgICBHRU5fQ01EX0NPREUoX1NldF9EcnZfRXh0cmEpKTsKLQotCQlyZXMgPSBydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBoMmMpOwotCX0gZWxzZQotCQlscHNfY3RybF93a19oZGwocGFkYXB0ZXIsIGxwc19jdHJsX3R5cGUpOwotZXhpdDoKLQotCXJldHVybiByZXM7Ci19Ci0KLWludCBydHdfcHNfY21kMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGNtZF9vYmogKnBwc2NtZDsKLQlzdHJ1Y3QgZHJ2ZXh0cmFfY21kX3Bhcm0gKnBkcnZleHRyYV9jbWRfcGFybTsKLQlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQotCXBwc2NtZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwcHNjbWQpIHsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwZHJ2ZXh0cmFfY21kX3Bhcm0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHJ2ZXh0cmFfY21kX3Bhcm0pLAotCQkJCSAgICAgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwZHJ2ZXh0cmFfY21kX3Bhcm0pIHsKLQkJa2ZyZWUocHBzY21kKTsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwZHJ2ZXh0cmFfY21kX3Bhcm0tPmVjX2lkID0gUE9XRVJfU0FWSU5HX0NUUkxfV0tfQ0lEOwotCXBkcnZleHRyYV9jbWRfcGFybS0+cGJ1ZiA9IE5VTEw7Ci0JaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocHBzY21kLCBwZHJ2ZXh0cmFfY21kX3Bhcm0sCi0JCQkJICAgR0VOX0NNRF9DT0RFKF9TZXRfRHJ2X0V4dHJhKSk7Ci0KLQlyZXMgPSBydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBwc2NtZCk7Ci1leGl0OgotCi0JcmV0dXJuIHJlczsKLX0KLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCi1zdGF0aWMgdm9pZCBydHdfY2hrX2hpX3F1ZXVlX2hkbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCWludCBjbnQgPSAwOwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YV9ibWM7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQotCXBzdGFfYm1jID0gcnR3X2dldF9iY21jX3N0YWluZm8yM2EocGFkYXB0ZXIpOwotCWlmICghcHN0YV9ibWMpCi0JCXJldHVybjsKLQotCWlmIChwc3RhX2JtYy0+c2xlZXBxX2xlbiA9PSAwKSB7Ci0JCWJvb2wgdmFsOwotCi0JCXZhbCA9IHJ0bDg3MjNhX2Noa19oaV9xdWV1ZV9lbXB0eShwYWRhcHRlcik7Ci0KLQkJd2hpbGUgKCF2YWwpIHsKLQkJCW1zbGVlcCgxMDApOwotCi0JCQljbnQrKzsKLQotCQkJaWYgKGNudCA+IDEwKQotCQkJCWJyZWFrOwotCi0JCQl2YWwgPSBydGw4NzIzYV9jaGtfaGlfcXVldWVfZW1wdHkocGFkYXB0ZXIpOwotCQl9Ci0KLQkJaWYgKGNudCA8PSAxMCkgewotCQkJcHN0YXByaXYtPnRpbV9iaXRtYXAgJj0gfkJJVCgwKTsKLQkJCXBzdGFwcml2LT5zdGFfZHpfYml0bWFwICY9IH5CSVQoMCk7Ci0KLQkJCXVwZGF0ZV9iZWFjb24yM2EocGFkYXB0ZXIsIFdMQU5fRUlEX1RJTSwgTlVMTCwgZmFsc2UpOwotCQl9IGVsc2UgLyogcmUgY2hlY2sgYWdhaW4gKi8KLQkJCXJ0d19jaGtfaGlfcXVldWVfY21kMjNhKHBhZGFwdGVyKTsKLQl9Ci19Ci0KLWludCBydHdfY2hrX2hpX3F1ZXVlX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBjbWRfb2JqICpwaDJjOwotCXN0cnVjdCBkcnZleHRyYV9jbWRfcGFybSAqcGRydmV4dHJhX2NtZF9wYXJtOwotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0JcGgyYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwaDJjKSB7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcGRydmV4dHJhX2NtZF9wYXJtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRydmV4dHJhX2NtZF9wYXJtKSwKLQkJCQkgICAgIEdGUF9BVE9NSUMpOwotCWlmICghcGRydmV4dHJhX2NtZF9wYXJtKSB7Ci0JCWtmcmVlKHBoMmMpOwotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXBkcnZleHRyYV9jbWRfcGFybS0+ZWNfaWQgPSBDSEVDS19ISVFfV0tfQ0lEOwotCXBkcnZleHRyYV9jbWRfcGFybS0+dHlwZV9zaXplID0gMDsKLQlwZHJ2ZXh0cmFfY21kX3Bhcm0tPnBidWYgPSBOVUxMOwotCi0JaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcGRydmV4dHJhX2NtZF9wYXJtLAotCQkJCSAgIEdFTl9DTURfQ09ERShfU2V0X0Rydl9FeHRyYSkpOwotCi0JcmVzID0gcnR3X2VucXVldWVfY21kMjNhKHBjbWRwcml2LCBwaDJjKTsKLWV4aXQ6Ci0KLQlyZXR1cm4gcmVzOwotfQotI2VuZGlmCi0KLWludCBydHdfYzJoX3drX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqYzJoX2V2dCkKLXsKLQlzdHJ1Y3QgY21kX29iaiAqcGgyYzsKLQlzdHJ1Y3QgZHJ2ZXh0cmFfY21kX3Bhcm0gKnBkcnZleHRyYV9jbWRfcGFybTsKLQlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQotCXBoMmMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaiksIEdGUF9BVE9NSUMpOwotCWlmICghcGgyYykgewotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXBkcnZleHRyYV9jbWRfcGFybSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkcnZleHRyYV9jbWRfcGFybSksCi0JCQkJICAgICBHRlBfQVRPTUlDKTsKLQlpZiAoIXBkcnZleHRyYV9jbWRfcGFybSkgewotCQlrZnJlZShwaDJjKTsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwZHJ2ZXh0cmFfY21kX3Bhcm0tPmVjX2lkID0gQzJIX1dLX0NJRDsKLQlwZHJ2ZXh0cmFfY21kX3Bhcm0tPnR5cGVfc2l6ZSA9IGMyaF9ldnQ/MTY6MDsKLQlwZHJ2ZXh0cmFfY21kX3Bhcm0tPnBidWYgPSBjMmhfZXZ0OwotCi0JaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcGRydmV4dHJhX2NtZF9wYXJtLAotCQkJCSAgIEdFTl9DTURfQ09ERShfU2V0X0Rydl9FeHRyYSkpOwotCi0JcmVzID0gcnR3X2VucXVldWVfY21kMjNhKHBjbWRwcml2LCBwaDJjKTsKLQotZXhpdDoKLQotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQgYzJoX2V2dF9oZGwoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgYzJoX2V2dF9oZHIgKmMyaF9ldnQpCi17Ci0JaW50IHJldCA9IF9GQUlMOwotCXU4IGJ1ZlsxNl07Ci0KLQlpZiAoIWMyaF9ldnQpIHsKLQkJLyogTm8gYzJoIGV2ZW50IGluIGNtZF9vYmosIHJlYWQgYzJoIGV2ZW50IGJlZm9yZSBoYW5kbGluZyovCi0JCWlmIChjMmhfZXZ0X3JlYWQyM2EoYWRhcHRlciwgYnVmKSA9PSBfU1VDQ0VTUykgewotCQkJYzJoX2V2dCA9IChzdHJ1Y3QgYzJoX2V2dF9oZHIgKilidWY7Ci0KLQkJCXJldCA9IGMyaF9oYW5kbGVyXzg3MjNhKGFkYXB0ZXIsIGMyaF9ldnQpOwotCQl9Ci0JfSBlbHNlCi0JCXJldCA9IGMyaF9oYW5kbGVyXzg3MjNhKGFkYXB0ZXIsIGMyaF9ldnQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgcnR3X2lycV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgZXZ0X3ByaXYgKmV2dHByaXY7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyOwotCi0JZXZ0cHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZXZ0X3ByaXYsIGlycV93ayk7Ci0JYWRhcHRlciA9IGNvbnRhaW5lcl9vZihldnRwcml2LCBzdHJ1Y3QgcnR3X2FkYXB0ZXIsIGV2dHByaXYpOwotCi0JYzJoX2V2dF9jbGVhcjIzYShhZGFwdGVyKTsKLX0KLQotdm9pZCBydHdfZXZ0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBldnRfd29yayAqZXdvcms7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyOwotCi0JZXdvcmsgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGV2dF93b3JrLCB3b3JrKTsKLQlhZGFwdGVyID0gZXdvcmstPmFkYXB0ZXI7Ci0KLQljMmhfZXZ0X2NsZWFyMjNhKGFkYXB0ZXIpOwotCi0JaWYgKCFjMmhfZXZ0X2V4aXN0KCZld29yay0+dS5jMmhfZXZ0KSkgewotCQlrZnJlZShld29yayk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoYzJoX2lkX2ZpbHRlcl9jY3hfODcyM2EoZXdvcmstPnUuYzJoX2V2dC5pZCkgPT0gdHJ1ZSkgewotCQkvKiBIYW5kbGUgQ0NYIHJlcG9ydCBoZXJlICovCi0JCWMyaF9oYW5kbGVyXzg3MjNhKGFkYXB0ZXIsICZld29yay0+dS5jMmhfZXZ0KTsKLQkJa2ZyZWUoZXdvcmspOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIEVucXVldWUgaW50byBjbWRfdGhyZWFkIGZvciBvdGhlcnMuCi0JCSAqIGV3b3JrIHdpbGwgYmUgdHVybmVkIGludG8gYSBjMmhfZXZ0IGFuZCBmcmVlZCBvbmNlIGl0Ci0JCSAqIGhhcyBiZWVuIGNvbnN1bWVkLgotCQkgKi8KLQkJcnR3X2MyaF93a19jbWQyM2EoYWRhcHRlciwgKHU4ICopJmV3b3JrLT51LmMyaF9ldnQpOwotCX0KLX0KLQotaW50IHJ0d19kcnZleHRyYV9jbWRfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKQotewotCWNvbnN0IHN0cnVjdCBkcnZleHRyYV9jbWRfcGFybSAqcGRydmV4dHJhX2NtZDsKLQotCWlmICghcGJ1ZikKLQkJcmV0dXJuIEgyQ19QQVJBTUVURVJTX0VSUk9SOwotCi0JcGRydmV4dHJhX2NtZCA9IChzdHJ1Y3QgZHJ2ZXh0cmFfY21kX3Bhcm0gKilwYnVmOwotCi0Jc3dpdGNoIChwZHJ2ZXh0cmFfY21kLT5lY19pZCkgewotCWNhc2UgRFlOQU1JQ19DSEtfV0tfQ0lEOgotCQlkeW5hbWljX2Noa193a19oZGwocGFkYXB0ZXIsIHBkcnZleHRyYV9jbWQtPnBidWYsCi0JCQkJICAgcGRydmV4dHJhX2NtZC0+dHlwZV9zaXplKTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TQVZJTkdfQ1RSTF9XS19DSUQ6Ci0JCXJ0d19wc19wcm9jZXNzb3IyM2EocGFkYXB0ZXIpOwotCQlicmVhazsKLQljYXNlIExQU19DVFJMX1dLX0NJRDoKLQkJbHBzX2N0cmxfd2tfaGRsKHBhZGFwdGVyLCAodTgpcGRydmV4dHJhX2NtZC0+dHlwZV9zaXplKTsKLQkJYnJlYWs7Ci0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0JY2FzZSBDSEVDS19ISVFfV0tfQ0lEOgotCQlydHdfY2hrX2hpX3F1ZXVlX2hkbChwYWRhcHRlcik7Ci0JCWJyZWFrOwotI2VuZGlmIC8qIENPTkZJR184NzIzQVVfQVBfTU9ERSAqLwotCWNhc2UgQzJIX1dLX0NJRDoKLQkJYzJoX2V2dF9oZGwocGFkYXB0ZXIsCi0JCQkgICAgKHN0cnVjdCBjMmhfZXZ0X2hkciAqKXBkcnZleHRyYV9jbWQtPnBidWYpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCWlmIChwZHJ2ZXh0cmFfY21kLT5wYnVmICYmIChwZHJ2ZXh0cmFfY21kLT50eXBlX3NpemUgPiAwKSkgewotCQlrZnJlZShwZHJ2ZXh0cmFfY21kLT5wYnVmKTsKLQkJLyoKLQkJICogTm8gbmVlZCB0byBzZXQgcGRydmV4dHJhX2NtZC0+cGJ1ZiA9IE5VTEwgYXMgd2Ugd2VyZQotCQkgKiBvcGVyYXRpbmcgb24gYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBwY21kLT5wYXJtYnVmCi0JCSAqIGNyZWF0ZWQgaW4gcnR3X2NtZF93b3JrKCkuCi0JCSAqLwotCX0KLQotCXJldHVybiBIMkNfU1VDQ0VTUzsKLX0KLQotdm9pZCBydHdfc3VydmV5X2NtZF9jYWxsYmFjazIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCXN0cnVjdCBjbWRfb2JqICpwY21kKQotewotCXN0cnVjdAltbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlpZiAocGNtZC0+cmVzID09IEgyQ19EUk9QUEVEKSB7Ci0JCS8qIFRPRE86IGNhbmNlbCB0aW1lciBhbmQgZG8gdGltZW91dCBoYW5kbGVyIGRpcmVjdGx5Li4uICovCi0JCS8qIG5lZWQgdG8gbWFrZSB0aW1lb3V0IGhhbmRsZXJPUyBpbmRlcGVuZGVudCAqLwotCQltb2RfdGltZXIoJnBtbG1lcHJpdi0+c2Nhbl90b190aW1lciwKLQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMSkpOwotCX0gZWxzZSBpZiAocGNtZC0+cmVzICE9IEgyQ19TVUNDRVNTKSB7Ci0JCW1vZF90aW1lcigmcG1sbWVwcml2LT5zY2FuX3RvX3RpbWVyLAotCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxKSk7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywKLQkJCSAiKioqKioqKipFcnJvcjogTWdudEFjdHJ0d19zZXRfODAyXzExX2Jzc2lkMjNhX0xJU1RfU0NBTiBGYWlsICoqKioqKioqKioqKlxuIik7Ci0JfQotCi0JLyogIGZyZWUgY21kICovCi0JcnR3X2ZyZWVfY21kX29iajIzYShwY21kKTsKLX0KLQotdm9pZCBydHdfZGlzYXNzb2NfY21kMjNhX2NhbGxiYWNrKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICBzdHJ1Y3QgY21kX29iaiAqcGNtZCkKLXsKLQlzdHJ1Y3QJbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCi0JaWYgKHBjbWQtPnJlcyAhPSBIMkNfU1VDQ0VTUykgewotCQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0JCXNldF9md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCk7Ci0JCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIioqKkVycm9yOiBkaXNjb25uZWN0X2NtZF9jYWxsYmFjayBGYWlsICoqKlxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiAgZnJlZSBjbWQgKi8KLQlydHdfZnJlZV9jbWRfb2JqMjNhKHBjbWQpOwotfQotCi12b2lkIHJ0d19qb2luYnNzX2NtZDIzYV9jYWxsYmFjayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSBzdHJ1Y3QgY21kX29iaiAqcGNtZCkKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCi0JaWYgKHBjbWQtPnJlcyA9PSBIMkNfRFJPUFBFRCkgewotCQkvKiBUT0RPOiBjYW5jZWwgdGltZXIgYW5kIGRvIHRpbWVvdXQgaGFuZGxlciBkaXJlY3RseS4uLiAqLwotCQkvKiBuZWVkIHRvIG1ha2UgdGltZW91dCBoYW5kbGVyT1MgaW5kZXBlbmRlbnQgKi8KLQkJbW9kX3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLAotCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxKSk7Ci0JfSBlbHNlIGlmIChwY21kLT5yZXMgIT0gSDJDX1NVQ0NFU1MpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9lcnJfLAotCQkJICIqKioqKioqKkVycm9yOnJ0d19zZWxlY3RfYW5kX2pvaW5fZnJvbV9zY2FubmVkX3F1ZXVlIFdhaXQgU2VtYSAgRmFpbCAqKioqKioqKioqKipcbiIpOwotCQltb2RfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsCi0JCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEpKTsKLQl9Ci0KLQlydHdfZnJlZV9jbWRfb2JqMjNhKHBjbWQpOwotfQotCi12b2lkIHJ0d19jcmVhdGVic3NfY21kMjNhX2NhbGxiYWNrKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgc3RydWN0IGNtZF9vYmogKnBjbWQpCi17Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCXN0cnVjdCB3bGFuX25ldHdvcmsgKnB3bGFuOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKnBuZXR3b3JrID0gKHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICopcGNtZC0+cGFybWJ1ZjsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICp0Z3RfbmV0d29yayA9ICZwbWxtZXByaXYtPmN1cl9uZXR3b3JrOwotCXN0cnVjdCBydHdfcXVldWUgKnNjYW5uZWRfcXVldWUgPSAmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlOwotCi0JaWYgKHBjbWQtPnJlcyAhPSBIMkNfU1VDQ0VTUykgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIioqKioqKioqRXJyb3I6IHJ0d19jcmVhdGVic3NfY21kMjNhX2NhbGxiYWNrICBGYWlsICoqKioqKioqKioqKlxuIik7Ci0JCW1vZF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwKLQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMSkpOwotCX0KLQotCWRlbF90aW1lcl9zeW5jKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyKTsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpIHsKLQkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYSgmcGFkYXB0ZXItPnN0YXByaXYsCi0JCQkJCSAgcG5ldHdvcmstPk1hY0FkZHJlc3MpOwotCQlpZiAoIXBzdGEpIHsKLQkJCXBzdGEgPSBydHdfYWxsb2Nfc3RhaW5mbzIzYSgmcGFkYXB0ZXItPnN0YXByaXYsCi0JCQkJCQkgICAgcG5ldHdvcmstPk1hY0FkZHJlc3MsCi0JCQkJCQkgICAgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIXBzdGEpIHsKLQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2Vycl8sCi0JCQkJCSAiQ2FuJ3QgYWxsb2Mgc3RhX2luZm8gd2hlbiBjcmVhdGVic3NfY21kX2NhbGxiYWNrXG4iKTsKLQkJCQlnb3RvIGNyZWF0ZWJzc19jbWRfZmFpbDsKLQkJCX0KLQkJfQotCi0JCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLQkJcnR3X2luZGljYXRlX2Nvbm5lY3QyM2EocGFkYXB0ZXIpOwotCQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLQl9IGVsc2UgewotCQlwd2xhbiA9IHJ0d19hbGxvY19uZXR3b3JrKHBtbG1lcHJpdiwgR0ZQX0tFUk5FTCk7Ci0JCXNwaW5fbG9ja19iaCgmc2Nhbm5lZF9xdWV1ZS0+bG9jayk7Ci0JCWlmICghcHdsYW4pIHsKLQkJCXB3bGFuID0gcnR3X2dldF9vbGRlc3Rfd2xhbl9uZXR3b3JrMjNhKHNjYW5uZWRfcXVldWUpOwotCQkJaWYgKCFwd2xhbikgewotCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywKLQkJCQkJICJFcnJvcjogIGNhbid0IGdldCBwd2xhbiBpbiBydHcyM2Ffam9pbmJzc19ldmVudF9jYlxuIik7Ci0JCQkJc3Bpbl91bmxvY2tfYmgoJnNjYW5uZWRfcXVldWUtPmxvY2spOwotCQkJCWdvdG8gY3JlYXRlYnNzX2NtZF9mYWlsOwotCQkJfQotCQkJcHdsYW4tPmxhc3Rfc2Nhbm5lZCA9IGppZmZpZXM7Ci0JCX0gZWxzZSB7Ci0JCQlsaXN0X2FkZF90YWlsKCZwd2xhbi0+bGlzdCwKLQkJCQkgICAgICAmc2Nhbm5lZF9xdWV1ZS0+cXVldWUpOwotCQl9Ci0KLQkJcG5ldHdvcmstPkxlbmd0aCA9IGdldF93bGFuX2Jzc2lkX2V4X3N6KHBuZXR3b3JrKTsKLQkJbWVtY3B5KCZwd2xhbi0+bmV0d29yaywgcG5ldHdvcmssIHBuZXR3b3JrLT5MZW5ndGgpOwotCQkvKiBwd2xhbi0+Zml4ZWQgPSB0cnVlOyAqLwotCi0JCS8qIGxpc3RfYWRkX3RhaWwoJnB3bGFuLT5saXN0LAotCQkgICAmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLnF1ZXVlKTsgKi8KLQotCQkvKiAgY29weSBwZGV2X25ldHdvcmsgaW5mb3JtYXRpb24gdG8KLQkJICAgIHBtbG1lcHJpdi0+Y3VyX25ldHdvcmsgKi8KLQkJbWVtY3B5KCZ0Z3RfbmV0d29yay0+bmV0d29yaywgcG5ldHdvcmssCi0JCSAgICAgICBnZXRfd2xhbl9ic3NpZF9leF9zeihwbmV0d29yaykpOwotCi0JCS8qICByZXNldCBEU0NvbmZpZyAqLwotCi0JCWNscl9md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpOwotCi0JCS8qICB3ZSB3aWxsIHNldCBfRldfTElOS0VEIHdoZW4gdGhlcmUgaXMgb25lIG1vcmUgc2F0IHRvCi0JCSAgICBqb2luIHVzIChydHdfc3Rhc3NvY19ldmVudF9jYWxsYmFjazIzYSkgKi8KLQkJc3Bpbl91bmxvY2tfYmgoJnNjYW5uZWRfcXVldWUtPmxvY2spOwotCX0KLQotY3JlYXRlYnNzX2NtZF9mYWlsOgotCi0JcnR3X2ZyZWVfY21kX29iajIzYShwY21kKTsKLX0KLQotdm9pZCBydHdfc2V0c3RhS2V5X2NtZHJzcF9jYWxsYmFjazIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICAgIHN0cnVjdCBjbWRfb2JqICpwY21kKQotewotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXY7Ci0Jc3RydWN0IHNldF9zdGFrZXlfcnNwICpwc2V0c3Rha2V5X3JzcDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0KLQlwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQlwc2V0c3Rha2V5X3JzcCA9IChzdHJ1Y3Qgc2V0X3N0YWtleV9yc3AgKikgKHBjbWQtPnJzcCk7Ci0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgcHNldHN0YWtleV9yc3AtPmFkZHIpOwotCi0JaWYgKCFwc3RhKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywKLQkJCSAiRVJST1I6IHJ0d19zZXRzdGFLZXlfY21kcnNwX2NhbGxiYWNrMjNhID0+IGNhbid0IGdldCBzdGFfaW5mb1xuIik7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLWV4aXQ6Ci0KLQlydHdfZnJlZV9jbWRfb2JqMjNhKHBjbWQpOwotfQotCi12b2lkIHJ0d19zZXRhc3NvY3N0YV9jbWRyc3BfY2FsbGJhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkJc3RydWN0IGNtZF9vYmogKnBjbWQpCi17Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBzZXRfYXNzb2NzdGFfcGFybSAqcGFzc29jc3RhX3Bhcm07Ci0Jc3RydWN0IHNldF9hc3NvY3N0YV9yc3AgKnBhc3NvY3N0YV9yc3A7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCi0JcGFzc29jc3RhX3Bhcm0gPSAoc3RydWN0IHNldF9hc3NvY3N0YV9wYXJtICopKHBjbWQtPnBhcm1idWYpOwotCXBhc3NvY3N0YV9yc3AgPSAoc3RydWN0IHNldF9hc3NvY3N0YV9yc3AgKikgKHBjbWQtPnJzcCk7Ci0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgcGFzc29jc3RhX3Bhcm0tPmFkZHIpOwotCi0JaWYgKHBzdGEgPT0gTlVMTCkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIkVSUk9SOiBzZXRhc3NvY3N0YV9jbWRyc3BfY2FsbGJhYyA9PiBjYW4ndCBnZXQgc3RhX2luZm9cbiIpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcHN0YS0+YWlkID0gcHN0YS0+bWFjX2lkID0gcGFzc29jc3RhX3JzcC0+Y2FtX2lkOwotCi0Jc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX01QX1NUQVRFKSAmJgotCSAgICBjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpKQotCQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpOwotCi0Jc2V0X2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKTsKLQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLQotZXhpdDoKLQlydHdfZnJlZV9jbWRfb2JqMjNhKHBjbWQpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19lZnVzZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19lZnVzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTllZjQxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfZWZ1c2UuYworKysgL2Rldi9udWxsCkBAIC0xLDUzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX1JUV19FRlVTRV9DXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotCi0jaW5jbHVkZSA8cnR3X2VmdXNlLmg+Ci0jaW5jbHVkZSA8cnRsODcyM2FfaGFsLmg+Ci0jaW5jbHVkZSA8dXNiX29wc19saW51eC5oPgotCi0jZGVmaW5lIFJFR19FRlVTRV9DVFJMCQkweDAwMzAKLSNkZWZpbmUgRUZVU0VfQ1RSTAkJUkVHX0VGVVNFX0NUUkwJLyogRS1GdXNlIENvbnRyb2wgKi8KLQotI2RlZmluZSBWT0xUQUdFX1YyNQkJMHgwMwotI2RlZmluZSBMRE9FMjVfU0hJRlQJCTI4Ci0KLS8qCi0gKiBXaGVuIHdlIHdhbnQgdG8gZW5hYmxlIHdyaXRlIG9wZXJhdGlvbiwgd2Ugc2hvdWxkIGNoYW5nZSB0bwotICogcHdyIG9uIHN0YXRlLiBXaGVuIHdlIHN0b3Agd3JpdGUsIHdlIHNob3VsZCBzd2l0Y2ggdG8gNTAwayBtb2RlCi0gKiBhbmQgZGlzYWJsZSBMRE8gMi41Vi4KLSAqLwotc3RhdGljIHZvaWQgRWZ1c2VfUG93ZXJTd2l0Y2goc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgIHU4IGJXcml0ZSwgdTggUHdyU3RhdGUpCi17Ci0JdTggdGVtcHZhbDsKLQl1MTYgdG1wVjE2OwotCi0JaWYgKFB3clN0YXRlID09IHRydWUpIHsKLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0VGVVNFX0FDQ0VTUywgRUZVU0VfQUNDRVNTX09OKTsKLQotCQkvKgotCQkgKiAxLjJWIFBvd2VyOiBGcm9tIFZERE9OIHdpdGggUG93ZXIKLQkJICogQ3V0KDB4MDAwMGhbMTVdKSwgZGVmYXVsdCB2YWxpZAotCQkgKi8KLQkJdG1wVjE2ID0gcnRsODcyM2F1X3JlYWQxNihwYWRhcHRlciwgUkVHX1NZU19JU09fQ1RSTCk7Ci0JCWlmICghKHRtcFYxNiAmIFBXQ19FVjEyVikpIHsKLQkJCXRtcFYxNiB8PSBQV0NfRVYxMlY7Ci0JCQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX1NZU19JU09fQ1RSTCwgdG1wVjE2KTsKLQkJfQotCQkvKiBSZXNldDogMHgwMDAwaFsyOF0sIGRlZmF1bHQgdmFsaWQgKi8KLQkJdG1wVjE2ID0gcnRsODcyM2F1X3JlYWQxNihwYWRhcHRlciwgUkVHX1NZU19GVU5DX0VOKTsKLQkJaWYgKCEodG1wVjE2ICYgRkVOX0VMRFIpKSB7Ci0JCQl0bXBWMTYgfD0gRkVOX0VMRFI7Ci0JCQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX1NZU19GVU5DX0VOLCB0bXBWMTYpOwotCQl9Ci0KLQkJLyoKLQkJICogQ2xvY2s6IEdhdGVkKDB4MDAwOGhbNV0pIDhNKDB4MDAwOGhbMV0pCi0JCSAqIGNsb2NrIGZyb20gQU5BLCBkZWZhdWx0IHZhbGlkCi0JCSAqLwotCQl0bXBWMTYgPSBydGw4NzIzYXVfcmVhZDE2KHBhZGFwdGVyLCBSRUdfU1lTX0NMS1IpOwotCQlpZiAoKCEodG1wVjE2ICYgTE9BREVSX0NMS19FTikpIHx8ICghKHRtcFYxNiAmIEFOQThNKSkpIHsKLQkJCXRtcFYxNiB8PSAoTE9BREVSX0NMS19FTiB8IEFOQThNKTsKLQkJCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfU1lTX0NMS1IsIHRtcFYxNik7Ci0JCX0KLQotCQlpZiAoYldyaXRlID09IHRydWUpIHsKLQkJCS8qICBFbmFibGUgTERPIDIuNVYgYmVmb3JlIHJlYWQvd3JpdGUgYWN0aW9uICovCi0JCQl0ZW1wdmFsID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBFRlVTRV9URVNUICsgMyk7Ci0JCQl0ZW1wdmFsICY9IDB4MEY7Ci0JCQl0ZW1wdmFsIHw9IChWT0xUQUdFX1YyNSA8PCA0KTsKLQkJCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIEVGVVNFX1RFU1QgKyAzLAotCQkJCQkgdGVtcHZhbCB8IDB4ODApOwotCQl9Ci0JfSBlbHNlIHsKLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0VGVVNFX0FDQ0VTUywgRUZVU0VfQUNDRVNTX09GRik7Ci0KLQkJaWYgKGJXcml0ZSA9PSB0cnVlKSB7Ci0JCQkvKiAgRGlzYWJsZSBMRE8gMi41ViBhZnRlciByZWFkL3dyaXRlIGFjdGlvbiAqLwotCQkJdGVtcHZhbCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgRUZVU0VfVEVTVCArIDMpOwotCQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgRUZVU0VfVEVTVCArIDMsCi0JCQkJCSB0ZW1wdmFsICYgMHg3Rik7Ci0JCX0KLQl9Ci19Ci0KLXUxNiBFZnVzZV9HZXRDdXJyZW50U2l6ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1OCBlZnVzZVR5cGUpCi17Ci0JdTE2IHJldCA9IDA7Ci0KLQlpZiAoZWZ1c2VUeXBlID09IEVGVVNFX1dJRkkpCi0JCXJldCA9IHJ0bDg3MjNhX0VmdXNlR2V0Q3VycmVudFNpemVfV2lGaShwQWRhcHRlcik7Ci0JZWxzZQotCQlyZXQgPSBydGw4NzIzYV9FZnVzZUdldEN1cnJlbnRTaXplX0JUKHBBZGFwdGVyKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIEdldCBjdXJyZW50IGVmdXNlIGFyZWEgZW5hYmxlZCB3b3JkICovCi11OCBFZnVzZV9DYWxjdWxhdGVXb3JkQ250czIzYSh1OCB3b3JkX2VuKQotewotCXJldHVybiBod2VpZ2h0OCgofndvcmRfZW4pICYgMHhmKTsKLX0KLQotLyoKLSAqIERlc2NyaXB0aW9uOiBFeGVjdXRlIEUtRnVzZSByZWFkIGJ5dGUgb3BlcmF0aW9uLgotICoKLSAqIEFzc3VtcHRpb25zOiAxLiBCb290IGZyb20gRS1GdXNlIGFuZCBzdWNjZXNzZnVsbHkgYXV0by1sb2FkLgotICogICAgICAgICAgICAgIDIuIFBBU1NJVkVfTEVWRUwgKFVTQiBpbnRlcmZhY2UpCi0gKi8KLXZvaWQgUmVhZEVGdXNlQnl0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHUxNiBfb2Zmc2V0LCB1OCAqcGJ1ZikKLXsKLQl1MzIJdmFsdWUzMjsKLQl1OAlyZWFkYnl0ZTsKLQl1MTYJcmV0cnk7Ci0KLQkvKiBXcml0ZSBBZGRyZXNzICovCi0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBFRlVTRV9DVFJMKzEsIChfb2Zmc2V0ICYgMHhmZikpOwotCXJlYWRieXRlID0gcnRsODcyM2F1X3JlYWQ4KEFkYXB0ZXIsIEVGVVNFX0NUUkwrMik7Ci0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBFRlVTRV9DVFJMKzIsCi0JCQkgKChfb2Zmc2V0ID4+IDgpICYgMHgwMykgfCAocmVhZGJ5dGUgJiAweGZjKSk7Ci0KLQkvKiBXcml0ZSBiaXQgMzIgMCAqLwotCXJlYWRieXRlID0gcnRsODcyM2F1X3JlYWQ4KEFkYXB0ZXIsIEVGVVNFX0NUUkwrMyk7Ci0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBFRlVTRV9DVFJMKzMsIHJlYWRieXRlICYgMHg3Zik7Ci0KLQkvKiBDaGVjayBiaXQgMzIgcmVhZC1yZWFkeSAqLwotCXJldHJ5ID0gMDsKLQl2YWx1ZTMyID0gcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCBFRlVTRV9DVFJMKTsKLQl3aGlsZSAoISgodmFsdWUzMiA+PiAyNCkgJiAweDgwKSAmJiByZXRyeSA8IDEwMDAwKSB7Ci0JCXZhbHVlMzIgPSBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIEVGVVNFX0NUUkwpOwotCQlyZXRyeSsrOwotCX0KLQotCS8qCi0JICogQWRkZWQgc3VnZ2VzdGVkIGRlbGF5LiBUaGlzIGZpeGVzIHRoZSBwcm9ibGVtIHRoYXQKLQkgKiBFZnVzZSByZWFkIGVycm9yIGluIGhpZ2ggdGVtcGVyYXR1cmUgY29uZGl0aW9uLgotCSAqIERlc2lnbmVyIHNheXMgdGhhdCB0aGVyZSBzaGFsbCBiZSBzb21lIGRlbGF5IGFmdGVyCi0JICogcmVhZHkgYml0IGlzIHNldCwgb3IgdGhlIHJlc3VsdCB3aWxsIGFsd2F5cyBzdGF5Ci0JICogb24gbGFzdCBkYXRhIHdlIHJlYWQuCi0JICovCi0JdWRlbGF5KDUwKTsKLQl2YWx1ZTMyID0gcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCBFRlVTRV9DVFJMKTsKLQotCSpwYnVmID0gKHU4KSh2YWx1ZTMyICYgMHhmZik7Ci19Ci0KLXZvaWQgRUZVU0VfR2V0RWZ1c2VEZWZpbml0aW9uMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHU4IGVmdXNlVHlwZSwKLQkJCQkgdTggdHlwZSwgdm9pZCAqcE91dCkKLXsKLQl1OCAqcHUxVG1wOwotCXUxNiAqcHUyVG1wOwotCXU4ICpwTWF4X3NlY3Rpb247Ci0KLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIFRZUEVfRUZVU0VfTUFYX1NFQ1RJT046Ci0JCXBNYXhfc2VjdGlvbiA9IHBPdXQ7Ci0KLQkJaWYgKGVmdXNlVHlwZSA9PSBFRlVTRV9XSUZJKQotCQkJKnBNYXhfc2VjdGlvbiA9IEVGVVNFX01BWF9TRUNUSU9OXzg3MjNBOwotCQllbHNlCi0JCQkqcE1heF9zZWN0aW9uID0gRUZVU0VfQlRfTUFYX1NFQ1RJT047Ci0JCWJyZWFrOwotCi0JY2FzZSBUWVBFX0VGVVNFX1JFQUxfQ09OVEVOVF9MRU46Ci0JCXB1MlRtcCA9IHBPdXQ7Ci0KLQkJaWYgKGVmdXNlVHlwZSA9PSBFRlVTRV9XSUZJKQotCQkJKnB1MlRtcCA9IEVGVVNFX1JFQUxfQ09OVEVOVF9MRU5fODcyM0E7Ci0JCWVsc2UKLQkJCSpwdTJUbXAgPSBFRlVTRV9CVF9SRUFMX0NPTlRFTlRfTEVOOwotCQlicmVhazsKLQotCWNhc2UgVFlQRV9BVkFJTEFCTEVfRUZVU0VfQllURVNfQkFOSzoKLQkJcHUyVG1wID0gcE91dDsKLQotCQlpZiAoZWZ1c2VUeXBlID09IEVGVVNFX1dJRkkpCi0JCQkqcHUyVG1wID0gKEVGVVNFX1JFQUxfQ09OVEVOVF9MRU5fODcyM0EgLQotCQkJCSAgIEVGVVNFX09PQl9QUk9URUNUX0JZVEVTKTsKLQkJZWxzZQotCQkJKnB1MlRtcCA9IChFRlVTRV9CVF9SRUFMX0JBTktfQ09OVEVOVF9MRU4gLQotCQkJCSAgIEVGVVNFX1BST1RFQ1RfQllURVNfQkFOSyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBUWVBFX0FWQUlMQUJMRV9FRlVTRV9CWVRFU19UT1RBTDoKLQkJcHUyVG1wID0gcE91dDsKLQotCQlpZiAoZWZ1c2VUeXBlID09IEVGVVNFX1dJRkkpCi0JCQkqcHUyVG1wID0gKEVGVVNFX1JFQUxfQ09OVEVOVF9MRU5fODcyM0EgLQotCQkJCSAgIEVGVVNFX09PQl9QUk9URUNUX0JZVEVTKTsKLQkJZWxzZQotCQkJKnB1MlRtcCA9IChFRlVTRV9CVF9SRUFMX0NPTlRFTlRfTEVOIC0KLQkJCQkgICAoRUZVU0VfUFJPVEVDVF9CWVRFU19CQU5LICogMykpOwotCQlicmVhazsKLQotCWNhc2UgVFlQRV9FRlVTRV9NQVBfTEVOOgotCQlwdTJUbXAgPSBwT3V0OwotCi0JCWlmIChlZnVzZVR5cGUgPT0gRUZVU0VfV0lGSSkKLQkJCSpwdTJUbXAgPSBFRlVTRV9NQVBfTEVOXzg3MjNBOwotCQllbHNlCi0JCQkqcHUyVG1wID0gRUZVU0VfQlRfTUFQX0xFTjsKLQkJYnJlYWs7Ci0KLQljYXNlIFRZUEVfRUZVU0VfUFJPVEVDVF9CWVRFU19CQU5LOgotCQlwdTFUbXAgPSBwT3V0OwotCi0JCWlmIChlZnVzZVR5cGUgPT0gRUZVU0VfV0lGSSkKLQkJCSpwdTFUbXAgPSBFRlVTRV9PT0JfUFJPVEVDVF9CWVRFUzsKLQkJZWxzZQotCQkJKnB1MVRtcCA9IEVGVVNFX1BST1RFQ1RfQllURVNfQkFOSzsKLQkJYnJlYWs7Ci0KLQljYXNlIFRZUEVfRUZVU0VfQ09OVEVOVF9MRU5fQkFOSzoKLQkJcHUyVG1wID0gcE91dDsKLQotCQlpZiAoZWZ1c2VUeXBlID09IEVGVVNFX1dJRkkpCi0JCQkqcHUyVG1wID0gRUZVU0VfUkVBTF9DT05URU5UX0xFTl84NzIzQTsKLQkJZWxzZQotCQkJKnB1MlRtcCA9IEVGVVNFX0JUX1JFQUxfQkFOS19DT05URU5UX0xFTjsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwdTFUbXAgPSBwT3V0OwotCQkqcHUxVG1wID0gMDsKLQkJYnJlYWs7Ci0JfQotfQotCi0vKiBDb3B5IGZyb20gV01BQyBmb3IgRUZVU0UgcmVhZCAxIGJ5dGUuICovCi11OCBFRlVTRV9SZWFkMUJ5dGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1MTYgQWRkcmVzcykKLXsKLQl1OAlkYXRhOwotCXU4CUJ5dGV0ZW1wID0gezB4MDB9OwotCXU4CXRlbXAgPSB7MHgwMH07Ci0JdTMyCWsgPSAwOwotCXUxNgljb250ZW50TGVuID0gMDsKLQotCUVGVVNFX0dldEVmdXNlRGVmaW5pdGlvbjIzYShBZGFwdGVyLCBFRlVTRV9XSUZJLAotCQkJCSBUWVBFX0VGVVNFX1JFQUxfQ09OVEVOVF9MRU4sCi0JCQkJICh2b2lkICopJmNvbnRlbnRMZW4pOwotCi0JaWYgKEFkZHJlc3MgPCBjb250ZW50TGVuKSB7IC8qIEUtZnVzZSA1MTJCeXRlICovCi0JCS8qIFdyaXRlIEUtZnVzZSBSZWdpc3RlciBhZGRyZXNzIGJpdDB+NyAqLwotCQl0ZW1wID0gQWRkcmVzcyAmIDB4RkY7Ci0JCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgRUZVU0VfQ1RSTCsxLCB0ZW1wKTsKLQkJQnl0ZXRlbXAgPSBydGw4NzIzYXVfcmVhZDgoQWRhcHRlciwgRUZVU0VfQ1RSTCsyKTsKLQkJLyogV3JpdGUgRS1mdXNlIFJlZ2lzdGVyIGFkZHJlc3MgYml0OH45ICovCi0JCXRlbXAgPSAoKEFkZHJlc3MgPj4gOCkgJiAweDAzKSB8IChCeXRldGVtcCAmIDB4RkMpOwotCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIEVGVVNFX0NUUkwrMiwgdGVtcCk7Ci0KLQkJLyogV3JpdGUgMHgzMFszMV09IDAgKi8KLQkJQnl0ZXRlbXAgPSBydGw4NzIzYXVfcmVhZDgoQWRhcHRlciwgRUZVU0VfQ1RSTCszKTsKLQkJdGVtcCA9IEJ5dGV0ZW1wICYgMHg3RjsKLQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBFRlVTRV9DVFJMKzMsIHRlbXApOwotCi0JCS8qIFdhaXQgV3JpdGUtcmVhZHkgKDB4MzBbMzFdPSAxKSAqLwotCQlCeXRldGVtcCA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBFRlVTRV9DVFJMKzMpOwotCQl3aGlsZSAoIShCeXRldGVtcCAmIDB4ODApKSB7Ci0JCQlCeXRldGVtcCA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBFRlVTRV9DVFJMKzMpOwotCQkJaysrOwotCQkJaWYgKGsgPT0gMTAwMCkgewotCQkJCWsgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWRhdGEgPSBydGw4NzIzYXVfcmVhZDgoQWRhcHRlciwgRUZVU0VfQ1RSTCk7Ci0JCXJldHVybiBkYXRhOwotCX0KLQlyZXR1cm4gMHhGRjsKLX0KLQotLyogUmVhZCBvbmUgYnl0ZSBmcm9tIHJlYWwgRWZ1c2UuICovCi1pbnQgZWZ1c2VfT25lQnl0ZVJlYWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTE2IGFkZHIsIHU4ICpkYXRhKQotewotCXU4CXRtcGlkeCA9IDA7Ci0JaW50CWJSZXN1bHQ7Ci0KLQkvKiAgLS0tLS0tLS0tLS0tLS0tLS1lLWZ1c2UgcmVnIGN0cmwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCS8qIGFkZHJlc3MgKi8KLQlydGw4NzIzYXVfd3JpdGU4KHBBZGFwdGVyLCBFRlVTRV9DVFJMICsgMSwgKHU4KShhZGRyICYgMHhmZikpOwotCXJ0bDg3MjNhdV93cml0ZTgocEFkYXB0ZXIsIEVGVVNFX0NUUkwgKyAyLAotCQkJICgodTgpKChhZGRyID4+IDgpICYgMHgwMykpIHwKLQkJCSAocnRsODcyM2F1X3JlYWQ4KHBBZGFwdGVyLCBFRlVTRV9DVFJMICsgMikgJiAweEZDKSk7Ci0KLQlydGw4NzIzYXVfd3JpdGU4KHBBZGFwdGVyLCBFRlVTRV9DVFJMICsgMywgMHg3Mik7IC8qIHJlYWQgY21kICovCi0KLQl3aGlsZSAoISgweDgwICYgcnRsODcyM2F1X3JlYWQ4KHBBZGFwdGVyLCBFRlVTRV9DVFJMICsgMykpICYmCi0JICAgICAgICh0bXBpZHggPCAxMDApKQotCQl0bXBpZHgrKzsKLQlpZiAodG1waWR4IDwgMTAwKSB7Ci0JCSpkYXRhID0gcnRsODcyM2F1X3JlYWQ4KHBBZGFwdGVyLCBFRlVTRV9DVFJMKTsKLQkJYlJlc3VsdCA9IF9TVUNDRVNTOwotCX0gZWxzZSB7Ci0JCSpkYXRhID0gMHhmZjsKLQkJYlJlc3VsdCA9IF9GQUlMOwotCX0KLQlyZXR1cm4gYlJlc3VsdDsKLX0KLQotLyogV3JpdGUgb25lIGJ5dGUgdG8gcmVhbGQgRWZ1c2UuICovCi1pbnQgZWZ1c2VfT25lQnl0ZVdyaXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHUxNiBhZGRyLCB1OCBkYXRhKQotewotCXU4CXRtcGlkeCA9IDA7Ci0JaW50CWJSZXN1bHQ7Ci0KLQkvKiByZXR1cm4JMDsgKi8KLQotCS8qICAtLS0tLS0tLS0tLS0tLS0tLWUtZnVzZSByZWcgY3RybCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0JLyogYWRkcmVzcyAqLwotCXJ0bDg3MjNhdV93cml0ZTgocEFkYXB0ZXIsIEVGVVNFX0NUUkwgKyAxLCAodTgpKGFkZHIgJiAweGZmKSk7Ci0JcnRsODcyM2F1X3dyaXRlOChwQWRhcHRlciwgRUZVU0VfQ1RSTCArIDIsCi0JCQkgKHJ0bDg3MjNhdV9yZWFkOChwQWRhcHRlciwgRUZVU0VfQ1RSTCArIDIpICYgMHhGQykgfAotCQkJICh1OCkoKGFkZHIgPj4gOCkgJiAweDAzKSk7Ci0JcnRsODcyM2F1X3dyaXRlOChwQWRhcHRlciwgRUZVU0VfQ1RSTCwgZGF0YSk7IC8qIGRhdGEgKi8KLQotCXJ0bDg3MjNhdV93cml0ZTgocEFkYXB0ZXIsIEVGVVNFX0NUUkwgKyAzLCAweEYyKTsgLyogd3JpdGUgY21kICovCi0KLQl3aGlsZSAoKDB4ODAgJiBydGw4NzIzYXVfcmVhZDgocEFkYXB0ZXIsIEVGVVNFX0NUUkwgKyAzKSkgJiYKLQkgICAgICAgKHRtcGlkeCA8IDEwMCkpIHsKLQkJdG1waWR4Kys7Ci0JfQotCi0JaWYgKHRtcGlkeCA8IDEwMCkKLQkJYlJlc3VsdCA9IF9TVUNDRVNTOwotCWVsc2UKLQkJYlJlc3VsdCA9IF9GQUlMOwotCi0JcmV0dXJuIGJSZXN1bHQ7Ci19Ci0KLS8qIFJlYWQgYWxsb3dlZCB3b3JkIGluIGN1cnJlbnQgZWZ1c2Ugc2VjdGlvbiBkYXRhLiAqLwotdm9pZCBlZnVzZV9Xb3JkRW5hYmxlRGF0YVJlYWQyM2EodTggd29yZF9lbiwgdTggKnNvdXJkYXRhLCB1OCAqdGFyZ2V0ZGF0YSkKLXsKLQlpZiAoISh3b3JkX2VuJkJJVCgwKSkpIHsKLQkJdGFyZ2V0ZGF0YVswXSA9IHNvdXJkYXRhWzBdOwotCQl0YXJnZXRkYXRhWzFdID0gc291cmRhdGFbMV07Ci0JfQotCWlmICghKHdvcmRfZW4mQklUKDEpKSkgewotCQl0YXJnZXRkYXRhWzJdID0gc291cmRhdGFbMl07Ci0JCXRhcmdldGRhdGFbM10gPSBzb3VyZGF0YVszXTsKLQl9Ci0JaWYgKCEod29yZF9lbiZCSVQoMikpKSB7Ci0JCXRhcmdldGRhdGFbNF0gPSBzb3VyZGF0YVs0XTsKLQkJdGFyZ2V0ZGF0YVs1XSA9IHNvdXJkYXRhWzVdOwotCX0KLQlpZiAoISh3b3JkX2VuJkJJVCgzKSkpIHsKLQkJdGFyZ2V0ZGF0YVs2XSA9IHNvdXJkYXRhWzZdOwotCQl0YXJnZXRkYXRhWzddID0gc291cmRhdGFbN107Ci0JfQotfQotCi1zdGF0aWMgaW50IGVmdXNlX3JlYWQ4KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiBhZGRyZXNzLCB1OCAqdmFsdWUpCi17Ci0JcmV0dXJuIGVmdXNlX09uZUJ5dGVSZWFkMjNhKHBhZGFwdGVyLCBhZGRyZXNzLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgZWZ1c2Vfd3JpdGU4KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiBhZGRyZXNzLCB1OCAqdmFsdWUpCi17Ci0JcmV0dXJuIGVmdXNlX09uZUJ5dGVXcml0ZTIzYShwYWRhcHRlciwgYWRkcmVzcywgKnZhbHVlKTsKLX0KLQotLyogcmVhZC93cml0ZSByYXcgZWZ1c2UgZGF0YSAqLwotaW50IHJ0d19lZnVzZV9hY2Nlc3MyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYldyaXRlLCB1MTYgc3RhcnRfYWRkciwKLQkJCXUxNiBjbnRzLCB1OCAqZGF0YSkKLXsKLQlpbnQgaSA9IDA7Ci0JdTE2IHJlYWxfY29udGVudF9sZW4gPSAwLCBtYXhfYXZhaWxhYmxlX3NpemUgPSAwOwotCWludCByZXMgPSBfRkFJTDsKLQlpbnQgKCpydzgpKHN0cnVjdCBydHdfYWRhcHRlciAqLCB1MTYsIHU4Kik7Ci0KLQlFRlVTRV9HZXRFZnVzZURlZmluaXRpb24yM2EocGFkYXB0ZXIsIEVGVVNFX1dJRkksCi0JCQkJIFRZUEVfRUZVU0VfUkVBTF9DT05URU5UX0xFTiwKLQkJCQkgKHZvaWQgKikmcmVhbF9jb250ZW50X2xlbik7Ci0JRUZVU0VfR2V0RWZ1c2VEZWZpbml0aW9uMjNhKHBhZGFwdGVyLCBFRlVTRV9XSUZJLAotCQkJCSBUWVBFX0FWQUlMQUJMRV9FRlVTRV9CWVRFU19UT1RBTCwKLQkJCQkgKHZvaWQgKikmbWF4X2F2YWlsYWJsZV9zaXplKTsKLQotCWlmIChzdGFydF9hZGRyID4gcmVhbF9jb250ZW50X2xlbikKLQkJcmV0dXJuIF9GQUlMOwotCi0JaWYgKHRydWUgPT0gYldyaXRlKSB7Ci0JCWlmICgoc3RhcnRfYWRkciArIGNudHMpID4gbWF4X2F2YWlsYWJsZV9zaXplKQotCQkJcmV0dXJuIF9GQUlMOwotCQlydzggPSAmZWZ1c2Vfd3JpdGU4OwotCX0gZWxzZQotCQlydzggPSAmZWZ1c2VfcmVhZDg7Ci0KLQlFZnVzZV9Qb3dlclN3aXRjaChwYWRhcHRlciwgYldyaXRlLCB0cnVlKTsKLQotCS8qIGUtZnVzZSBvbmUgYnl0ZSByZWFkL3dyaXRlICovCi0JZm9yIChpID0gMDsgaSA8IGNudHM7IGkrKykgewotCQlpZiAoc3RhcnRfYWRkciA+PSByZWFsX2NvbnRlbnRfbGVuKSB7Ci0JCQlyZXMgPSBfRkFJTDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcmVzID0gcnc4KHBhZGFwdGVyLCBzdGFydF9hZGRyKyssIGRhdGErKyk7Ci0JCWlmIChyZXMgPT0gX0ZBSUwpCi0JCQlicmVhazsKLQl9Ci0KLQlFZnVzZV9Qb3dlclN3aXRjaChwYWRhcHRlciwgYldyaXRlLCBmYWxzZSk7Ci0KLQlyZXR1cm4gcmVzOwotfQotCi11MTYgZWZ1c2VfR2V0TWF4U2l6ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXUxNiBtYXhfc2l6ZTsKLQotCUVGVVNFX0dldEVmdXNlRGVmaW5pdGlvbjIzYShwYWRhcHRlciwgRUZVU0VfV0lGSSwKLQkJCQkgVFlQRV9BVkFJTEFCTEVfRUZVU0VfQllURVNfVE9UQUwsCi0JCQkJICh2b2lkICopJm1heF9zaXplKTsKLQlyZXR1cm4gbWF4X3NpemU7Ci19Ci0KLWludCBydHdfZWZ1c2VfbWFwX3JlYWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgdTE2IGFkZHIsIHUxNiBjbnRzLCB1OCAqZGF0YSkKLXsKLQl1MTYgbWFwTGVuID0gMDsKLQotCUVGVVNFX0dldEVmdXNlRGVmaW5pdGlvbjIzYShwYWRhcHRlciwgRUZVU0VfV0lGSSwKLQkJCQkgVFlQRV9FRlVTRV9NQVBfTEVOLCAodm9pZCAqKSZtYXBMZW4pOwotCi0JaWYgKChhZGRyICsgY250cykgPiBtYXBMZW4pCi0JCXJldHVybiBfRkFJTDsKLQotCUVmdXNlX1Bvd2VyU3dpdGNoKHBhZGFwdGVyLCBmYWxzZSwgdHJ1ZSk7Ci0KLQlydGw4NzIzYV9yZWFkZWZ1c2UocGFkYXB0ZXIsIEVGVVNFX1dJRkksIGFkZHIsIGNudHMsIGRhdGEpOwotCi0JRWZ1c2VfUG93ZXJTd2l0Y2gocGFkYXB0ZXIsIGZhbHNlLCBmYWxzZSk7Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLWludCBydHdfQlRfZWZ1c2VfbWFwX3JlYWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgdTE2IGFkZHIsIHUxNiBjbnRzLCB1OCAqZGF0YSkKLXsKLQl1MTYgbWFwTGVuID0gMDsKLQotCUVGVVNFX0dldEVmdXNlRGVmaW5pdGlvbjIzYShwYWRhcHRlciwgRUZVU0VfQlQsCi0JCQkJIFRZUEVfRUZVU0VfTUFQX0xFTiwgKHZvaWQgKikmbWFwTGVuKTsKLQotCWlmICgoYWRkciArIGNudHMpID4gbWFwTGVuKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQlFZnVzZV9Qb3dlclN3aXRjaChwYWRhcHRlciwgZmFsc2UsIHRydWUpOwotCi0JcnRsODcyM2FfcmVhZGVmdXNlKHBhZGFwdGVyLCBFRlVTRV9CVCwgYWRkciwgY250cywgZGF0YSk7Ci0KLQlFZnVzZV9Qb3dlclN3aXRjaChwYWRhcHRlciwgZmFsc2UsIGZhbHNlKTsKLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotLyogUmVhZCBBbGwgRWZ1c2UgY29udGVudCAqLwotc3RhdGljIHZvaWQgRWZ1c2VfUmVhZEFsbE1hcChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1OCBlZnVzZVR5cGUsCi0JCQkgICAgIHU4ICpFZnVzZSkKLXsKLQl1MTYJbWFwTGVuID0gMDsKLQotCUVmdXNlX1Bvd2VyU3dpdGNoKHBBZGFwdGVyLCBmYWxzZSwgdHJ1ZSk7Ci0KLQlFRlVTRV9HZXRFZnVzZURlZmluaXRpb24yM2EocEFkYXB0ZXIsIGVmdXNlVHlwZSwgVFlQRV9FRlVTRV9NQVBfTEVOLAotCQkJCSAodm9pZCAqKSZtYXBMZW4pOwotCi0JcnRsODcyM2FfcmVhZGVmdXNlKHBBZGFwdGVyLCBlZnVzZVR5cGUsIDAsIG1hcExlbiwgRWZ1c2UpOwotCi0JRWZ1c2VfUG93ZXJTd2l0Y2gocEFkYXB0ZXIsIGZhbHNlLCBmYWxzZSk7Ci19Ci0KLS8qCi0gKiBGdW5jdGlvbnM6CWVmdXNlX1NoYWRvd1JlYWQxQnl0ZQotICoJCWVmdXNlX1NoYWRvd1JlYWQyQnl0ZQotICoJCWVmdXNlX1NoYWRvd1JlYWQ0Qnl0ZQotICoKLSAqIFJlYWQgZnJvbSBlZnVzZSBpbml0IG1hcCBieSBvbmUvdHdvL2ZvdXIgYnl0ZXMKLSAqLwotc3RhdGljIHZvaWQgZWZ1c2VfU2hhZG93UmVhZDFCeXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHUxNiBPZmZzZXQsCi0JCQkJICB1OCAqVmFsdWUpCi17Ci0Jc3RydWN0IGVlcHJvbV9wcml2ICpwRUVQUk9NID0gR0VUX0VFUFJPTV9FRlVTRV9QUklWKHBBZGFwdGVyKTsKLQotCSpWYWx1ZSA9IHBFRVBST00tPmVmdXNlX2VlcHJvbV9kYXRhW09mZnNldF07Ci19Ci0KLXN0YXRpYyB2b2lkIGVmdXNlX1NoYWRvd1JlYWQyQnl0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1MTYgT2Zmc2V0LAotCQkJCSAgdTE2ICpWYWx1ZSkKLXsKLQlzdHJ1Y3QgZWVwcm9tX3ByaXYgKnBFRVBST00gPSBHRVRfRUVQUk9NX0VGVVNFX1BSSVYocEFkYXB0ZXIpOwotCi0JKlZhbHVlID0gcEVFUFJPTS0+ZWZ1c2VfZWVwcm9tX2RhdGFbT2Zmc2V0XTsKLQkqVmFsdWUgfD0gcEVFUFJPTS0+ZWZ1c2VfZWVwcm9tX2RhdGFbT2Zmc2V0KzFdPDw4OwotfQotCi1zdGF0aWMgdm9pZCBlZnVzZV9TaGFkb3dSZWFkNEJ5dGUoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTE2IE9mZnNldCwKLQkJCQkgIHUzMiAqVmFsdWUpCi17Ci0Jc3RydWN0IGVlcHJvbV9wcml2ICpwRUVQUk9NID0gR0VUX0VFUFJPTV9FRlVTRV9QUklWKHBBZGFwdGVyKTsKLQotCSpWYWx1ZSA9IHBFRVBST00tPmVmdXNlX2VlcHJvbV9kYXRhW09mZnNldF07Ci0JKlZhbHVlIHw9IHBFRVBST00tPmVmdXNlX2VlcHJvbV9kYXRhW09mZnNldCsxXTw8ODsKLQkqVmFsdWUgfD0gcEVFUFJPTS0+ZWZ1c2VfZWVwcm9tX2RhdGFbT2Zmc2V0KzJdPDwxNjsKLQkqVmFsdWUgfD0gcEVFUFJPTS0+ZWZ1c2VfZWVwcm9tX2RhdGFbT2Zmc2V0KzNdPDwyNDsKLX0KLQotLyogVHJhbnNmZXIgY3VycmVudCBFRlVTRSBjb250ZW50IHRvIHNoYWRvdyBpbml0IGFuZCBtb2RpZnkgbWFwLiAqLwotdm9pZCBFRlVTRV9TaGFkb3dNYXBVcGRhdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTggZWZ1c2VUeXBlKQotewotCXN0cnVjdCBlZXByb21fcHJpdiAqcEVFUFJPTSA9IEdFVF9FRVBST01fRUZVU0VfUFJJVihwQWRhcHRlcik7Ci0JdTE2CW1hcExlbiA9IDA7Ci0KLQlFRlVTRV9HZXRFZnVzZURlZmluaXRpb24yM2EocEFkYXB0ZXIsIGVmdXNlVHlwZSwKLQkJCQkgVFlQRV9FRlVTRV9NQVBfTEVOLCAodm9pZCAqKSZtYXBMZW4pOwotCi0JaWYgKHBFRVBST00tPmJhdXRvbG9hZF9mYWlsX2ZsYWcgPT0gdHJ1ZSkKLQkJbWVtc2V0KHBFRVBST00tPmVmdXNlX2VlcHJvbV9kYXRhLCAweEZGLCBtYXBMZW4pOwotCWVsc2UKLQkJRWZ1c2VfUmVhZEFsbE1hcChwQWRhcHRlciwgZWZ1c2VUeXBlLAotCQkJCSBwRUVQUk9NLT5lZnVzZV9lZXByb21fZGF0YSk7Ci19Ci0KLS8qIFJlYWQgZnJvbSBlZnVzZSBpbml0IG1hcCAqLwotdm9pZCBFRlVTRV9TaGFkb3dSZWFkMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHU4IFR5cGUsCi0JCQkgdTE2IE9mZnNldCwgdTMyICpWYWx1ZSkKLXsKLQlpZiAoVHlwZSA9PSAxKQotCQllZnVzZV9TaGFkb3dSZWFkMUJ5dGUocEFkYXB0ZXIsIE9mZnNldCwgKHU4ICopVmFsdWUpOwotCWVsc2UgaWYgKFR5cGUgPT0gMikKLQkJZWZ1c2VfU2hhZG93UmVhZDJCeXRlKHBBZGFwdGVyLCBPZmZzZXQsICh1MTYgKilWYWx1ZSk7Ci0JZWxzZSBpZiAoVHlwZSA9PSA0KQotCQllZnVzZV9TaGFkb3dSZWFkNEJ5dGUocEFkYXB0ZXIsIE9mZnNldCwgKHUzMiAqKVZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfaWVlZTgwMjExLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X2llZWU4MDIxMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2E2NDkwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfaWVlZTgwMjExLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9JRUVFODAyMTFfQwotCi0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaWVlZTgwMjExLmg+Ci0jaW5jbHVkZSA8aWVlZTgwMjExLmg+Ci0jaW5jbHVkZSA8d2lmaS5oPgotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDx3bGFuX2Jzc2RlZi5oPgotCi11OCBSVFdfV1BBX09VSTIzQV9UWVBFW10gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDEgfTsKLXUxNiBSVFdfV1BBX1ZFUlNJT04yM0EgPSAxOwotdTggV1BBX0FVVEhfS0VZX01HTVRfTk9ORTIzQVtdID0geyAweDAwLCAweDUwLCAweGYyLCAwIH07Ci11OCBXUEFfQVVUSF9LRVlfTUdNVF9VTlNQRUNfODAyXzFYMjNBW10gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDEgfTsKLXU4IFdQQV9BVVRIX0tFWV9NR01UX1BTS19PVkVSXzgwMl8xWDIzQVtdID0geyAweDAwLCAweDUwLCAweGYyLCAyIH07Ci11OCBXUEFfQ0lQSEVSX1NVSVRFX05PTkUyM0FbXSA9IHsgMHgwMCwgMHg1MCwgMHhmMiwgMCB9OwotdTggV1BBX0NJUEhFUl9TVUlURV9XRVA0MDIzQVtdID0geyAweDAwLCAweDUwLCAweGYyLCAxIH07Ci11OCBXUEFfQ0lQSEVSX1NVSVRFX1RLSVAyM0FbXSA9IHsgMHgwMCwgMHg1MCwgMHhmMiwgMiB9OwotdTggV1BBX0NJUEhFUl9TVUlURV9XUkFQMjNBW10gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDMgfTsKLXU4IFdQQV9DSVBIRVJfU1VJVEVfQ0NNUDIzQVtdID0geyAweDAwLCAweDUwLCAweGYyLCA0IH07Ci11OCBXUEFfQ0lQSEVSX1NVSVRFX1dFUDEwNDIzQVtdID0geyAweDAwLCAweDUwLCAweGYyLCA1IH07Ci0KLXU4IFJTTl9BVVRIX0tFWV9NR01UX1VOU1BFQ184MDJfMVgyM0FbXSA9IHsgMHgwMCwgMHgwZiwgMHhhYywgMSB9OwotdTggUlNOX0FVVEhfS0VZX01HTVRfUFNLX09WRVJfODAyXzFYMjNBW10gPSB7IDB4MDAsIDB4MGYsIDB4YWMsIDIgfTsKLXU4IFJTTl9DSVBIRVJfU1VJVEVfTk9ORTIzQVtdID0geyAweDAwLCAweDBmLCAweGFjLCAwIH07Ci11OCBSU05fQ0lQSEVSX1NVSVRFX1dFUDQwMjNBW10gPSB7IDB4MDAsIDB4MGYsIDB4YWMsIDEgfTsKLXU4IFJTTl9DSVBIRVJfU1VJVEVfVEtJUDIzQVtdID0geyAweDAwLCAweDBmLCAweGFjLCAyIH07Ci11OCBSU05fQ0lQSEVSX1NVSVRFX1dSQVAyM0FbXSA9IHsgMHgwMCwgMHgwZiwgMHhhYywgMyB9OwotdTggUlNOX0NJUEhFUl9TVUlURV9DQ01QMjNBW10gPSB7IDB4MDAsIDB4MGYsIDB4YWMsIDQgfTsKLXU4IFJTTl9DSVBIRVJfU1VJVEVfV0VQMTA0MjNBW10gPSB7IDB4MDAsIDB4MGYsIDB4YWMsIDUgfTsKLS8qICAqLwotLyogIGZvciBhZGhvYy1tYXN0ZXIgdG8gZ2VuZXJhdGUgaWUgYW5kIHByb3ZpZGUgc3VwcG9ydGVkLXJhdGUgdG8gZncgKi8KLS8qICAqLwotCi1zdGF0aWMgdTggV0lGSV9DQ0tSQVRFU1tdID0gewotCUlFRUU4MDIxMV9DQ0tfUkFURV8xTUIgfCBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLLAotCUlFRUU4MDIxMV9DQ0tfUkFURV8yTUIgfCBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLLAotCUlFRUU4MDIxMV9DQ0tfUkFURV81TUIgfCBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLLAotCUlFRUU4MDIxMV9DQ0tfUkFURV8xMU1CIHwgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSwotfTsKLQotc3RhdGljIHU4IFdJRklfT0ZETVJBVEVTW10gPSB7Ci0JSUVFRTgwMjExX09GRE1fUkFURV82TUIsCi0JSUVFRTgwMjExX09GRE1fUkFURV85TUIsCi0JSUVFRTgwMjExX09GRE1fUkFURV8xMk1CLAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfMThNQiwKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUIsCi0JSUVFRTgwMjExX09GRE1fUkFURV8zNk1CLAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQiwKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUIKLX07Ci0KLWludCBydHdfZ2V0X2JpdF92YWx1ZV9mcm9tX2llZWVfdmFsdWUyM2EodTggdmFsKQotewotCXVuc2lnbmVkIGNoYXIgZG90MTFfcmF0ZV90YWJsZVtdPQotCQl7MiwgNCwgMTEsIDIyLCAxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4LCAwfTsKLQotCWludCBpID0gMDsKLQotCXdoaWxlIChkb3QxMV9yYXRlX3RhYmxlW2ldICE9IDApIHsKLQkJaWYgKGRvdDExX3JhdGVfdGFibGVbaV0gPT0gdmFsKQotCQkJcmV0dXJuIEJJVChpKTsKLQkJaSsrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGJvb2wgcnR3X2lzX2Nja3JhdGVzX2luY2x1ZGVkKHU4ICpyYXRlKQotewotCXUzMiBpID0gMDsKLQotCXdoaWxlIChyYXRlW2ldKSB7Ci0JCWlmICgocmF0ZVtpXSAmIDB4N2YpID09IDIgfHwgKHJhdGVbaV0gJiAweDdmKSA9PSA0IHx8Ci0JCSAgICAocmF0ZVtpXSAmIDB4N2YpID09IDExIHx8IChyYXRlW2ldICYgMHg3ZikgPT0gMjIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaSsrOwotCX0KLQotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgcnR3X2lzX2Nja3JhdGVzb25seV9pbmNsdWRlZCh1OCAqcmF0ZSkKLXsKLQl1MzIgaSA9IDA7Ci0KLQl3aGlsZSAocmF0ZVtpXSkgewotCQlpZiAoKHJhdGVbaV0gJiAweDdmKSAhPSAyICYmIChyYXRlW2ldICYgMHg3ZikgIT0gNCAmJgotCQkgICAgKHJhdGVbaV0gJiAweDdmKSAhPSAxMSAmJiAocmF0ZVtpXSAmIDB4N2YpICE9IDIyKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWkrKzsKLQl9Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotaW50IHJ0d19jaGVja19uZXR3b3JrX3R5cGUyM2EodW5zaWduZWQgY2hhciAqcmF0ZSwgaW50IHJhdGVsZW4sIGludCBjaGFubmVsKQotewotCWlmIChjaGFubmVsID4gMTQpIHsKLQkJaWYgKHJ0d19pc19jY2tyYXRlc19pbmNsdWRlZChyYXRlKSkKLQkJCXJldHVybiBXSVJFTEVTU19JTlZBTElEOwotCQllbHNlCi0JCQlyZXR1cm4gV0lSRUxFU1NfMTFBOwotCX0gZWxzZSB7ICAvKiAgY291bGQgYmUgcHVyZSBCLCBwdXJlIEcsIG9yIEIvRyAqLwotCQlpZiAocnR3X2lzX2Nja3JhdGVzb25seV9pbmNsdWRlZChyYXRlKSkKLQkJCXJldHVybiBXSVJFTEVTU18xMUI7Ci0JCWVsc2UgaWYgKHJ0d19pc19jY2tyYXRlc19pbmNsdWRlZChyYXRlKSkKLQkJCXJldHVybglXSVJFTEVTU18xMUJHOwotCQllbHNlCi0JCQlyZXR1cm4gV0lSRUxFU1NfMTFHOwotCX0KLX0KLQotLyogIHJ0d19zZXRfaWUyM2Egd2lsbCB1cGRhdGUgZnJhbWUgbGVuZ3RoICovCi11OCAqcnR3X3NldF9pZTIzYSh1OCAqcGJ1ZiwgaW50IGluZGV4LCB1aW50IGxlbiwgY29uc3QgdTggKnNvdXJjZSwgdWludCAqZnJsZW4pCi17Ci0KLQkqcGJ1ZiA9ICh1OClpbmRleDsKLQotCSoocGJ1ZiArIDEpID0gKHU4KWxlbjsKLQotCWlmIChsZW4gPiAwKQotCQltZW1jcHkoKHZvaWQgKikocGJ1ZiArIDIpLCAodm9pZCAqKXNvdXJjZSwgbGVuKTsKLQotCSpmcmxlbiA9ICpmcmxlbiArIChsZW4gKyAyKTsKLQotCXJldHVybiBwYnVmICsgbGVuICsgMjsKLX0KLQotaW5saW5lIHU4ICpydHdfc2V0X2llMjNhX2NoX3N3aXRjaCAodTggKmJ1ZiwgdTMyICpidWZfbGVuLCB1OCBjaF9zd2l0Y2hfbW9kZSwKLQkJCQl1OCBuZXdfY2gsIHU4IGNoX3N3aXRjaF9jbnQpCi17Ci0JdTggaWVfZGF0YVszXTsKLQotCWllX2RhdGFbMF0gPSBjaF9zd2l0Y2hfbW9kZTsKLQlpZV9kYXRhWzFdID0gbmV3X2NoOwotCWllX2RhdGFbMl0gPSBjaF9zd2l0Y2hfY250OwotCXJldHVybiBydHdfc2V0X2llMjNhKGJ1ZiwgV0xBTl9FSURfQ0hBTk5FTF9TV0lUQ0gsICAzLCBpZV9kYXRhLCBidWZfbGVuKTsKLX0KLQotaW5saW5lIHU4IGhhbF9jaF9vZmZzZXRfdG9fc2Vjb25kYXJ5X2NoX29mZnNldDIzYSh1OCBjaF9vZmZzZXQpCi17Ci0JaWYgKGNoX29mZnNldCA9PSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfTE9XRVIpCi0JCXJldHVybiBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19CRUxPVzsKLQllbHNlIGlmIChjaF9vZmZzZXQgPT0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX1VQUEVSKQotCQlyZXR1cm4gSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQUJPVkU7Ci0KLQlyZXR1cm4gSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfTk9ORTsKLX0KLQotaW5saW5lIHU4ICpydHdfc2V0X2llMjNhX3NlY29uZGFyeV9jaF9vZmZzZXQodTggKmJ1ZiwgdTMyICpidWZfbGVuLAotCQkJCQkgIHU4IHNlY29uZGFyeV9jaF9vZmZzZXQpCi17Ci0JcmV0dXJuIHJ0d19zZXRfaWUyM2EoYnVmLCBXTEFOX0VJRF9TRUNPTkRBUllfQ0hBTk5FTF9PRkZTRVQsCi0JCQkgIDEsICZzZWNvbmRhcnlfY2hfb2Zmc2V0LCBidWZfbGVuKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbmRleDogdGhlIGluZm9ybWF0aW9uIGVsZW1lbnQgaWQgaW5kZXgsIGxpbWl0IGlzIHRoZSBsaW1pdCBmb3Igc2VhcmNoCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi11OCAqcnR3X2dldF9pZTIzYSh1OCAqcGJ1ZiwgaW50IGluZGV4LCBpbnQgKmxlbiwgaW50IGxpbWl0KQotewotCWludCB0bXAsIGk7Ci0JdTggKnA7Ci0KLQlpZiAobGltaXQgPCAxKSB7Ci0KLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcCA9IHBidWY7Ci0JaSA9IDA7Ci0JKmxlbiA9IDA7Ci0Jd2hpbGUgKDEpIHsKLQkJaWYgKCpwID09IGluZGV4KSB7Ci0JCQkqbGVuID0gKihwICsgMSk7Ci0JCQlyZXR1cm4gcDsKLQkJfSBlbHNlIHsKLQkJCXRtcCA9ICoocCArIDEpOwotCQkJcCArPSAodG1wICsgMik7Ci0JCQlpICs9ICh0bXAgKyAyKTsKLQkJfQotCQlpZiAoaSA+PSBsaW1pdCkKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi0vKioKLSAqIHJ0d19nZXRfaWUyM2FfZXggLSBTZWFyY2ggc3BlY2lmaWMgSUUgZnJvbSBhIHNlcmllcyBvZiBJRXMKLSAqIEBpbl9pZTogQWRkcmVzcyBvZiBJRXMgdG8gc2VhcmNoCi0gKiBAaW5fbGVuOiBMZW5ndGggbGltaXQgZnJvbSBpbl9pZQotICogQGVpZDogRWxlbWVudCBJRCB0byBtYXRjaAotICogQG91aTogT1VJIHRvIG1hdGNoCi0gKiBAb3VpX2xlbjogT1VJIGxlbmd0aAotICogQGllOiBJZiBub3QgTlVMTCBhbmQgdGhlIHNwZWNpZmljIElFIGlzIGZvdW5kLCB0aGUgSUUgd2lsbCBiZSBjb3BpZWQKLSAqICAgICAgdG8gdGhlIGJ1ZiBzdGFydGluZyBmcm9tIHRoZSBzcGVjaWZpYyBJRQotICogQGllbGVuOiBJZiBub3QgTlVMTCBhbmQgdGhlIHNwZWNpZmljIElFIGlzIGZvdW5kLCB3aWxsIHNldCB0byB0aGUgbGVuZ3RoCi0gKiAgICAgICAgIG9mIHRoZSBlbnRpcmUgSUUKLSAqCi0gKiBSZXR1cm5zOiBUaGUgYWRkcmVzcyBvZiB0aGUgc3BlY2lmaWMgSUUgZm91bmQsIG9yIE5VTEwKLSAqLwotdTggKnJ0d19nZXRfaWUyM2FfZXgodTggKmluX2llLCB1aW50IGluX2xlbiwgdTggZWlkLCB1OCAqb3VpLCB1OCBvdWlfbGVuLAotCQkgIHU4ICppZSwgdWludCAqaWVsZW4pCi17Ci0JdWludCBjbnQ7Ci0JdTggKnRhcmdldF9pZSA9IE5VTEw7Ci0KLQlpZiAoaWVsZW4pCi0JCSppZWxlbiA9IDA7Ci0KLQlpZiAoIWluX2llIHx8IGluX2xlbiA8PSAwKQotCQlyZXR1cm4gdGFyZ2V0X2llOwotCi0JY250ID0gMDsKLQotCXdoaWxlIChjbnQgPCBpbl9sZW4pIHsKLQkJaWYgKGVpZCA9PSBpbl9pZVtjbnRdICYmCi0JCSAgICAoIW91aSB8fCAhbWVtY21wKCZpbl9pZVtjbnQrMl0sIG91aSwgb3VpX2xlbikpKSB7Ci0JCQl0YXJnZXRfaWUgPSAmaW5faWVbY250XTsKLQotCQkJaWYgKGllKQotCQkJCW1lbWNweShpZSwgJmluX2llW2NudF0sIGluX2llW2NudCsxXSsyKTsKLQotCQkJaWYgKGllbGVuKQotCQkJCSppZWxlbiA9IGluX2llW2NudCsxXSsyOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSB7Ci0JCQljbnQgKz0gaW5faWVbY250ICsgMV0gKyAyOyAvKiBnb3RvIG5leHQgKi8KLQkJfQotCX0KLQotCXJldHVybiB0YXJnZXRfaWU7Ci19Ci0KLS8qKgotICogcnR3X2llc19yZW1vdmVfaWUyM2EgLSBGaW5kIG1hdGNoaW5nIElFcyBhbmQgcmVtb3ZlCi0gKiBAaWVzOiBBZGRyZXNzIG9mIElFcyB0byBzZWFyY2gKLSAqIEBpZXNfbGVuOiBQb2ludGVyIG9mIGxlbmd0aCBvZiBpZXMsIHdpbGwgdXBkYXRlIHRvIG5ldyBsZW5ndGgKLSAqIEBvZmZzZXQ6IFRoZSBvZmZzZXQgdG8gc3RhcnQgc2VhcmNoCi0gKiBAZWlkOiBFbGVtZW50IElEIHRvIG1hdGNoCi0gKiBAb3VpOiBPVUkgdG8gbWF0Y2gKLSAqIEBvdWlfbGVuOiBPVUkgbGVuZ3RoCi0gKgotICogUmV0dXJuczogX1NVQ0NFU1M6IGllcyBpcyB1cGRhdGVkLCBfRkFJTDogbm90IHVwZGF0ZWQKLSAqLwotaW50IHJ0d19pZXNfcmVtb3ZlX2llMjNhKHU4ICppZXMsIHVpbnQgKmllc19sZW4sIHVpbnQgb2Zmc2V0LCB1OCBlaWQsCi0JCSAgICAgIHU4ICpvdWksIHU4IG91aV9sZW4pCi17Ci0JaW50IHJldCA9IF9GQUlMOwotCXU4ICp0YXJnZXRfaWU7Ci0JdTMyIHRhcmdldF9pZWxlbjsKLQl1OCAqc3RhcnQ7Ci0JdWludCBzZWFyY2hfbGVuOwotCi0JaWYgKCFpZXMgfHwgIWllc19sZW4gfHwgKmllc19sZW4gPD0gb2Zmc2V0KQotCQlnb3RvIGV4aXQ7Ci0KLQlzdGFydCA9IGllcyArIG9mZnNldDsKLQlzZWFyY2hfbGVuID0gKmllc19sZW4gLSBvZmZzZXQ7Ci0KLQl3aGlsZSAoMSkgewotCQl0YXJnZXRfaWUgPSBydHdfZ2V0X2llMjNhX2V4KHN0YXJ0LCBzZWFyY2hfbGVuLCBlaWQsIG91aSwgb3VpX2xlbiwKLQkJCQkJICBOVUxMLCAmdGFyZ2V0X2llbGVuKTsKLQkJaWYgKHRhcmdldF9pZSAmJiB0YXJnZXRfaWVsZW4pIHsKLQkJCXU4IGJ1ZltNQVhfSUVfU1pdID0gezB9OwotCQkJdTggKnJlbWFpbl9pZXMgPSB0YXJnZXRfaWUgKyB0YXJnZXRfaWVsZW47Ci0JCQl1aW50IHJlbWFpbl9sZW4gPSBzZWFyY2hfbGVuIC0gKHJlbWFpbl9pZXMgLSBzdGFydCk7Ci0KLQkJCW1lbWNweShidWYsIHJlbWFpbl9pZXMsIHJlbWFpbl9sZW4pOwotCQkJbWVtY3B5KHRhcmdldF9pZSwgYnVmLCByZW1haW5fbGVuKTsKLQkJCSppZXNfbGVuID0gKmllc19sZW4gLSB0YXJnZXRfaWVsZW47Ci0JCQlyZXQgPSBfU1VDQ0VTUzsKLQotCQkJc3RhcnQgPSB0YXJnZXRfaWU7Ci0JCQlzZWFyY2hfbGVuID0gcmVtYWluX2xlbjsKLQkJfSBlbHNlIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIHJ0d19zZXRfc3VwcG9ydGVkX3JhdGUyM2EodTggKlN1cHBvcnRlZFJhdGVzLCB1aW50IG1vZGUpCi17Ci0KLQotCW1lbXNldChTdXBwb3J0ZWRSYXRlcywgMCwgTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYKTsKLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgV0lSRUxFU1NfMTFCOgotCQltZW1jcHkoU3VwcG9ydGVkUmF0ZXMsIFdJRklfQ0NLUkFURVMsIElFRUU4MDIxMV9DQ0tfUkFURV9MRU4pOwotCQlicmVhazsKLQotCWNhc2UgV0lSRUxFU1NfMTFHOgotCWNhc2UgV0lSRUxFU1NfMTFBOgotCWNhc2UgV0lSRUxFU1NfMTFfNU46Ci0JY2FzZSBXSVJFTEVTU18xMUFfNU46LyogVG9kbzogbm8gYmFzaWMgcmF0ZSBmb3Igb2ZkbSA/ICovCi0JCW1lbWNweShTdXBwb3J0ZWRSYXRlcywgV0lGSV9PRkRNUkFURVMsCi0JCSAgICAgICBJRUVFODAyMTFfTlVNX09GRE1fUkFURVNMRU4pOwotCQlicmVhazsKLQotCWNhc2UgV0lSRUxFU1NfMTFCRzoKLQljYXNlIFdJUkVMRVNTXzExR18yNE46Ci0JY2FzZSBXSVJFTEVTU18xMV8yNE46Ci0JY2FzZSBXSVJFTEVTU18xMUJHXzI0TjoKLQkJbWVtY3B5KFN1cHBvcnRlZFJhdGVzLCBXSUZJX0NDS1JBVEVTLCBJRUVFODAyMTFfQ0NLX1JBVEVfTEVOKTsKLQkJbWVtY3B5KFN1cHBvcnRlZFJhdGVzICsgSUVFRTgwMjExX0NDS19SQVRFX0xFTiwgV0lGSV9PRkRNUkFURVMsCi0JCSAgICAgICBJRUVFODAyMTFfTlVNX09GRE1fUkFURVNMRU4pOwotCQlicmVhazsKLQl9Ci0KLX0KLQotdWludCBydHdfZ2V0X3JhdGVzZXRfbGVuMjNhKHU4ICpyYXRlc2V0KQotewotCXVpbnQgaSA9IDA7Ci0KLQl3aGlsZSgxKSB7Ci0JCWlmIChyYXRlc2V0W2ldID09IDApCi0JCQlicmVhazsKLQotCQlpZiAoaSA+IDEyKQotCQkJYnJlYWs7Ci0KLQkJaSsrOwotCX0KLQotCXJldHVybiBpOwotfQotCi1pbnQgcnR3X2dlbmVyYXRlX2llMjNhKHN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVnaXN0cnlwcml2KQotewotCXU4CXdpcmVsZXNzX21vZGU7Ci0JaW50CXN6ID0gMCwgcmF0ZUxlbjsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcGRldl9uZXR3b3JrID0gJnByZWdpc3RyeXByaXYtPmRldl9uZXR3b3JrOwotCXU4CSppZSA9IHBkZXZfbmV0d29yay0+SUVzOwotCXUxNgljYXA7Ci0KLQlwZGV2X25ldHdvcmstPnRzZiA9IDA7Ci0KLQljYXAgPSBXTEFOX0NBUEFCSUxJVFlfSUJTUzsKLQotCWlmIChwcmVnaXN0cnlwcml2LT5wcmVhbWJsZSA9PSBQUkVBTUJMRV9TSE9SVCkKLQkJY2FwIHw9IFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRTsKLQotCWlmIChwZGV2X25ldHdvcmstPlByaXZhY3kpCi0JCWNhcCB8PSBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWTsKLQotCXBkZXZfbmV0d29yay0+Y2FwYWJpbGl0eSA9IGNhcDsKLQotCS8qIFNTSUQgKi8KLQlpZSA9IHJ0d19zZXRfaWUyM2EoaWUsIFdMQU5fRUlEX1NTSUQsIHBkZXZfbmV0d29yay0+U3NpZC5zc2lkX2xlbiwKLQkJCXBkZXZfbmV0d29yay0+U3NpZC5zc2lkLCAmc3opOwotCi0JLyogc3VwcG9ydGVkIHJhdGVzICovCi0JaWYgKHByZWdpc3RyeXByaXYtPndpcmVsZXNzX21vZGUgPT0gV0lSRUxFU1NfMTFBQkdOKSB7Ci0JCWlmIChwZGV2X25ldHdvcmstPkRTQ29uZmlnID4gMTQpCi0JCQl3aXJlbGVzc19tb2RlID0gV0lSRUxFU1NfMTFBXzVOOwotCQllbHNlCi0JCQl3aXJlbGVzc19tb2RlID0gV0lSRUxFU1NfMTFCR18yNE47Ci0JfSBlbHNlIHsKLQkJd2lyZWxlc3NfbW9kZSA9IHByZWdpc3RyeXByaXYtPndpcmVsZXNzX21vZGU7Ci0JfQotCi0JcnR3X3NldF9zdXBwb3J0ZWRfcmF0ZTIzYShwZGV2X25ldHdvcmstPlN1cHBvcnRlZFJhdGVzLCB3aXJlbGVzc19tb2RlKSA7Ci0KLQlyYXRlTGVuID0gcnR3X2dldF9yYXRlc2V0X2xlbjIzYShwZGV2X25ldHdvcmstPlN1cHBvcnRlZFJhdGVzKTsKLQotCWlmIChyYXRlTGVuID4gOCkgewotCQlpZSA9IHJ0d19zZXRfaWUyM2EoaWUsIFdMQU5fRUlEX1NVUFBfUkFURVMsIDgsCi0JCQkJcGRldl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcywgJnN6KTsKLQkJLyogaWUgPSBydHdfc2V0X2llMjNhKGllLCBfRVhUX1NVUFBPUlRFRFJBVEVTX0lFXywgKHJhdGVMZW4gLSA4KSwgKHBkZXZfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMgKyA4KSwgJnN6KTsgKi8KLQl9IGVsc2UgewotCQlpZSA9IHJ0d19zZXRfaWUyM2EoaWUsIFdMQU5fRUlEX1NVUFBfUkFURVMsIHJhdGVMZW4sCi0JCQkJcGRldl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcywgJnN6KTsKLQl9Ci0KLQkvKiBEUyBwYXJhbWV0ZXIgc2V0ICovCi0JaWUgPSBydHdfc2V0X2llMjNhKGllLCBXTEFOX0VJRF9EU19QQVJBTVMsIDEsCi0JCQkgICAodTggKikmcGRldl9uZXR3b3JrLT5EU0NvbmZpZywgJnN6KTsKLQotCS8qIElCU1MgUGFyYW1ldGVyIFNldCAqLwotCi0JaWUgPSBydHdfc2V0X2llMjNhKGllLCBXTEFOX0VJRF9JQlNTX1BBUkFNUywgMiwKLQkJCSAgICh1OCAqKSZwZGV2X25ldHdvcmstPkFUSU1XaW5kb3csICZzeik7Ci0KLQlpZiAocmF0ZUxlbiA+IDgpIHsKLQkJaWUgPSBydHdfc2V0X2llMjNhKGllLCBXTEFOX0VJRF9FWFRfU1VQUF9SQVRFUywgKHJhdGVMZW4gLSA4KSwKLQkJCQkocGRldl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcyArIDgpLCAmc3opOwotCX0KLQotCi0KLQkvKiByZXR1cm4gX1NVQ0NFU1M7ICovCi0KLQlyZXR1cm4gc3o7Ci19Ci0KLXN0YXRpYyBpbnQgcnR3X2dldF93cGFfY2lwaGVyX3N1aXRlKGNvbnN0IHU4ICpzKQotewotCWlmICghbWVtY21wKHMsIFdQQV9DSVBIRVJfU1VJVEVfTk9ORTIzQSwgV1BBX1NFTEVDVE9SX0xFTikpCi0JCXJldHVybiBXUEFfQ0lQSEVSX05PTkU7Ci0JaWYgKCFtZW1jbXAocywgV1BBX0NJUEhFUl9TVUlURV9XRVA0MDIzQSwgV1BBX1NFTEVDVE9SX0xFTikpCi0JCXJldHVybiBXUEFfQ0lQSEVSX1dFUDQwOwotCWlmICghbWVtY21wKHMsIFdQQV9DSVBIRVJfU1VJVEVfVEtJUDIzQSwgV1BBX1NFTEVDVE9SX0xFTikpCi0JCXJldHVybiBXUEFfQ0lQSEVSX1RLSVA7Ci0JaWYgKCFtZW1jbXAocywgV1BBX0NJUEhFUl9TVUlURV9DQ01QMjNBLCBXUEFfU0VMRUNUT1JfTEVOKSkKLQkJcmV0dXJuIFdQQV9DSVBIRVJfQ0NNUDsKLQlpZiAoIW1lbWNtcChzLCBXUEFfQ0lQSEVSX1NVSVRFX1dFUDEwNDIzQSwgV1BBX1NFTEVDVE9SX0xFTikpCi0JCXJldHVybiBXUEFfQ0lQSEVSX1dFUDEwNDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJ0d19nZXRfd3BhMl9jaXBoZXJfc3VpdGUoY29uc3QgdTggKnMpCi17Ci0JaWYgKCFtZW1jbXAocywgUlNOX0NJUEhFUl9TVUlURV9OT05FMjNBLCBSU05fU0VMRUNUT1JfTEVOKSkKLQkJcmV0dXJuIFdQQV9DSVBIRVJfTk9ORTsKLQlpZiAoIW1lbWNtcChzLCBSU05fQ0lQSEVSX1NVSVRFX1dFUDQwMjNBLCBSU05fU0VMRUNUT1JfTEVOKSkKLQkJcmV0dXJuIFdQQV9DSVBIRVJfV0VQNDA7Ci0JaWYgKCFtZW1jbXAocywgUlNOX0NJUEhFUl9TVUlURV9US0lQMjNBLCBSU05fU0VMRUNUT1JfTEVOKSkKLQkJcmV0dXJuIFdQQV9DSVBIRVJfVEtJUDsKLQlpZiAoIW1lbWNtcChzLCBSU05fQ0lQSEVSX1NVSVRFX0NDTVAyM0EsIFJTTl9TRUxFQ1RPUl9MRU4pKQotCQlyZXR1cm4gV1BBX0NJUEhFUl9DQ01QOwotCWlmICghbWVtY21wKHMsIFJTTl9DSVBIRVJfU1VJVEVfV0VQMTA0MjNBLCBSU05fU0VMRUNUT1JfTEVOKSkKLQkJcmV0dXJuIFdQQV9DSVBIRVJfV0VQMTA0OwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBydHdfcGFyc2Vfd3BhX2llMjNhKGNvbnN0IHU4ICp3cGFfaWUsIGludCB3cGFfaWVfbGVuLCBpbnQgKmdyb3VwX2NpcGhlciwKLQkJCWludCAqcGFpcndpc2VfY2lwaGVyLCBpbnQgKmlzXzgwMjF4KQotewotCWludCBpLCByZXQgPSBfU1VDQ0VTUzsKLQlpbnQgbGVmdCwgY291bnQ7Ci0JY29uc3QgdTggKnBvczsKLQotCWlmICh3cGFfaWVfbGVuIDw9IDApIHsKLQkJLyogTm8gV1BBIElFIC0gZmFpbCBzaWxlbnRseSAqLwotCQlyZXR1cm4gX0ZBSUw7Ci0JfQotCi0JaWYgKHdwYV9pZVsxXSAhPSAodTgpKHdwYV9pZV9sZW4gLSAyKSkKLQkJcmV0dXJuIF9GQUlMOwotCi0JcG9zID0gd3BhX2llOwotCi0JcG9zICs9IDg7Ci0JbGVmdCA9IHdwYV9pZV9sZW4gLSA4OwotCi0JLyogZ3JvdXBfY2lwaGVyICovCi0JaWYgKGxlZnQgPj0gV1BBX1NFTEVDVE9SX0xFTikgewotCi0JCSpncm91cF9jaXBoZXIgPSBydHdfZ2V0X3dwYV9jaXBoZXJfc3VpdGUocG9zKTsKLQotCQlwb3MgKz0gV1BBX1NFTEVDVE9SX0xFTjsKLQkJbGVmdCAtPSBXUEFfU0VMRUNUT1JfTEVOOwotCX0gZWxzZSBpZiAobGVmdCA+IDApIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCSAiJXM6IGllIGxlbmd0aCBtaXNtYXRjaCwgJXUgdG9vIG11Y2hcbiIsCi0JCQkgX19mdW5jX18sIGxlZnQpOwotCi0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQkvKiBwYWlyd2lzZV9jaXBoZXIgKi8KLQlpZiAobGVmdCA+PSAyKSB7Ci0gICAgICAgICAgICAgICAgLyogY291bnQgPSBsZTE2X3RvX2NwdSgqKHUxNiopcG9zKTsgKi8KLQkJY291bnQgPSBnZXRfdW5hbGlnbmVkX2xlMTYocG9zKTsKLQkJcG9zICs9IDI7Ci0JCWxlZnQgLT0gMjsKLQotCQlpZiAoY291bnQgPT0gMCB8fCBsZWZ0IDwgY291bnQgKiBXUEFfU0VMRUNUT1JfTEVOKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJCSAiJXM6IGllIGNvdW50IGJvdGNoIChwYWlyd2lzZSksIGNvdW50ICV1IGxlZnQgJXVcbiIsCi0JCQkJIF9fZnVuY19fLCBjb3VudCwgbGVmdCk7Ci0JCQlyZXR1cm4gX0ZBSUw7Ci0JCX0KLQotCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJKnBhaXJ3aXNlX2NpcGhlciB8PSBydHdfZ2V0X3dwYV9jaXBoZXJfc3VpdGUocG9zKTsKLQotCQkJcG9zICs9IFdQQV9TRUxFQ1RPUl9MRU47Ci0JCQlsZWZ0IC09IFdQQV9TRUxFQ1RPUl9MRU47Ci0JCX0KLQl9IGVsc2UgaWYgKGxlZnQgPT0gMSkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICIlczogaWUgdG9vIHNob3J0IChmb3Iga2V5IG1nbXQpXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQlpZiAoaXNfODAyMXgpIHsKLQkJaWYgKGxlZnQgPj0gNikgewotCQkJcG9zICs9IDI7Ci0JCQlpZiAoIW1lbWNtcChwb3MsIFJUV19XUEFfT1VJMjNBX1RZUEUsIDQpKSB7Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAiJXMgOiB0aGVyZSBoYXMgODAyLjF4IGF1dGhcbiIsCi0JCQkJCSBfX2Z1bmNfXyk7Ci0JCQkJKmlzXzgwMjF4ID0gMTsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBydHdfcGFyc2Vfd3BhMl9pZTIzYShjb25zdCB1OCAqcnNuX2llLCBpbnQgcnNuX2llX2xlbiwgaW50ICpncm91cF9jaXBoZXIsCi0JCSAgICAgIGludCAqcGFpcndpc2VfY2lwaGVyLCBpbnQgKmlzXzgwMjF4KQotewotCWludCBpLCByZXQgPSBfU1VDQ0VTUzsKLQlpbnQgbGVmdCwgY291bnQ7Ci0JY29uc3QgdTggKnBvczsKLQl1OCBTVUlURV8xWFs0XSA9IHsweDAwLCAweDBmLCAweGFjLCAweDAxfTsKLQotCWlmIChyc25faWVfbGVuIDw9IDApIHsKLQkJLyogTm8gUlNOIElFIC0gZmFpbCBzaWxlbnRseSAqLwotCQlyZXR1cm4gX0ZBSUw7Ci0JfQotCi0JaWYgKCpyc25faWUgIT0gV0xBTl9FSURfUlNOIHx8ICoocnNuX2llKzEpICE9ICh1OCkocnNuX2llX2xlbiAtIDIpKSB7Ci0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQlwb3MgPSByc25faWU7Ci0JcG9zICs9IDQ7Ci0JbGVmdCA9IHJzbl9pZV9sZW4gLSA0OwotCi0JLyogZ3JvdXBfY2lwaGVyICovCi0JaWYgKGxlZnQgPj0gUlNOX1NFTEVDVE9SX0xFTikgewotCQkqZ3JvdXBfY2lwaGVyID0gcnR3X2dldF93cGEyX2NpcGhlcl9zdWl0ZShwb3MpOwotCi0JCXBvcyArPSBSU05fU0VMRUNUT1JfTEVOOwotCQlsZWZ0IC09IFJTTl9TRUxFQ1RPUl9MRU47Ci0JfSBlbHNlIGlmIChsZWZ0ID4gMCkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICIlczogaWUgbGVuZ3RoIG1pc21hdGNoLCAldSB0b28gbXVjaFxuIiwKLQkJCSBfX2Z1bmNfXywgbGVmdCk7Ci0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQkvKiBwYWlyd2lzZV9jaXBoZXIgKi8KLQlpZiAobGVmdCA+PSAyKSB7Ci0JICAgICAgICAvKiBjb3VudCA9IGxlMTZfdG9fY3B1KCoodTE2Kilwb3MpOyAqLwotCQljb3VudCA9IGdldF91bmFsaWduZWRfbGUxNihwb3MpOwotCQlwb3MgKz0gMjsKLQkJbGVmdCAtPSAyOwotCi0JCWlmIChjb3VudCA9PSAwIHx8IGxlZnQgPCBjb3VudCAqIFJTTl9TRUxFQ1RPUl9MRU4pIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkJICIlczogaWUgY291bnQgYm90Y2ggKHBhaXJ3aXNlKSwgY291bnQgJXUgbGVmdCAldVxuIiwKLQkJCQkgX19mdW5jX18sIGNvdW50LCBsZWZ0KTsKLQkJCXJldHVybiBfRkFJTDsKLQkJfQotCi0JCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkqcGFpcndpc2VfY2lwaGVyIHw9IHJ0d19nZXRfd3BhMl9jaXBoZXJfc3VpdGUocG9zKTsKLQotCQkJcG9zICs9IFJTTl9TRUxFQ1RPUl9MRU47Ci0JCQlsZWZ0IC09IFJTTl9TRUxFQ1RPUl9MRU47Ci0JCX0KLQl9IGVsc2UgaWYgKGxlZnQgPT0gMSkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICIlczogaWUgdG9vIHNob3J0IChmb3Iga2V5IG1nbXQpXG4iLCAgX19mdW5jX18pOwotCi0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQlpZiAoaXNfODAyMXgpIHsKLQkJaWYgKGxlZnQgPj0gNikgewotCQkJcG9zICs9IDI7Ci0JCQlpZiAoIW1lbWNtcChwb3MsIFNVSVRFXzFYLCA0KSkgewotCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkJCQkgIiVzICgpOiB0aGVyZSBoYXMgODAyLjF4IGF1dGhcbiIsCi0JCQkJCSBfX2Z1bmNfXyk7Ci0JCQkJKmlzXzgwMjF4ID0gMTsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogcnR3X2dldF93cHNfYXR0cjIzYSAtIFNlYXJjaCBhIHNwZWNpZmljIFdQUyBhdHRyaWJ1dGUgZnJvbSBhIGdpdmVuIFdQUyBJRQotICogQHdwc19pZTogQWRkcmVzcyBvZiBXUFMgSUUgdG8gc2VhcmNoCi0gKiBAd3BzX2llbGVuOiBMZW5ndGggbGltaXQgZnJvbSB3cHNfaWUKLSAqIEB0YXJnZXRfYXR0cl9pZDogVGhlIGF0dHJpYnV0ZSBJRCBvZiBXUFMgYXR0cmlidXRlIHRvIHNlYXJjaAotICogQGJ1Zl9hdHRyOiBJZiBub3QgTlVMTCBhbmQgdGhlIFdQUyBhdHRyaWJ1dGUgaXMgZm91bmQsIFdQUyBhdHRyaWJ1dGUKLSAqICAgICAgICAgICAgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIGJ1ZiBzdGFydGluZyBmcm9tIGJ1Zl9hdHRyCi0gKiBAbGVuX2F0dHI6IElmIG5vdCBOVUxMIGFuZCB0aGUgV1BTIGF0dHJpYnV0ZSBpcyBmb3VuZCwgd2lsbCBzZXQgdG8gdGhlCi0gKiAgICAgICAgICAgIGxlbmd0aCBvZiB0aGUgZW50aXJlIFdQUyBhdHRyaWJ1dGUKLSAqCi0gKiBSZXR1cm5zOiB0aGUgYWRkcmVzcyBvZiB0aGUgc3BlY2lmaWMgV1BTIGF0dHJpYnV0ZSBmb3VuZCwgb3IgTlVMTAotICovCi1jb25zdCB1OCAqcnR3X2dldF93cHNfYXR0cjIzYShjb25zdCB1OCAqd3BzX2llLCB1aW50IHdwc19pZWxlbiwKLQkJCSAgICAgIHUxNiB0YXJnZXRfYXR0cl9pZCwgdTggKmJ1Zl9hdHRyLCB1MzIgKmxlbl9hdHRyKQotewotCWNvbnN0IHU4ICphdHRyX3B0ciA9IE5VTEw7Ci0JY29uc3QgdTggKnRhcmdldF9hdHRyX3B0ciA9IE5VTEw7Ci0JdTggd3BzX291aVs0XSA9IHsweDAwLCAweDUwLCAweEYyLCAweDA0fTsKLQotCWlmIChsZW5fYXR0cikKLQkJKmxlbl9hdHRyID0gMDsKLQotCWlmICh3cHNfaWVbMF0gIT0gV0xBTl9FSURfVkVORE9SX1NQRUNJRklDIHx8Ci0JICAgIG1lbWNtcCh3cHNfaWUgKyAyLCB3cHNfb3VpLCA0KSkgewotCQlyZXR1cm4gYXR0cl9wdHI7Ci0JfQotCi0JLyogIDYgPSAxKEVsZW1lbnQgSUQpICsgMShMZW5ndGgpICsgNChXUFMgT1VJKSAqLwotCWF0dHJfcHRyID0gd3BzX2llICsgNjsgLyogZ290byBmaXJzdCBhdHRyICovCi0KLQl3aGlsZSAoYXR0cl9wdHIgLSB3cHNfaWUgPCB3cHNfaWVsZW4pIHsKLQkJLyogIDQgPSAyKEF0dHJpYnV0ZSBJRCkgKyAyKExlbmd0aCkgKi8KLQkJdTE2IGF0dHJfaWQgPSBnZXRfdW5hbGlnbmVkX2JlMTYoYXR0cl9wdHIpOwotCQl1MTYgYXR0cl9kYXRhX2xlbiA9IGdldF91bmFsaWduZWRfYmUxNihhdHRyX3B0ciArIDIpOwotCQl1MTYgYXR0cl9sZW4gPSBhdHRyX2RhdGFfbGVuICsgNDsKLQotCQkvKiBEQkdfODcyM0EoIiVzIGF0dHJfcHRyOiVwLCBpZDoldSwgbGVuZ3RoOiV1XG4iLCBfX2Z1bmNfXywgYXR0cl9wdHIsIGF0dHJfaWQsIGF0dHJfZGF0YV9sZW4pOyAqLwotCQlpZiAoYXR0cl9pZCA9PSB0YXJnZXRfYXR0cl9pZCkgewotCQkJdGFyZ2V0X2F0dHJfcHRyID0gYXR0cl9wdHI7Ci0KLQkJCWlmIChidWZfYXR0cikKLQkJCQltZW1jcHkoYnVmX2F0dHIsIGF0dHJfcHRyLCBhdHRyX2xlbik7Ci0KLQkJCWlmIChsZW5fYXR0cikKLQkJCQkqbGVuX2F0dHIgPSBhdHRyX2xlbjsKLQotCQkJYnJlYWs7Ci0JCX0gZWxzZSB7Ci0JCQlhdHRyX3B0ciArPSBhdHRyX2xlbjsgLyogZ290byBuZXh0ICovCi0JCX0KLQl9Ci0KLQlyZXR1cm4gdGFyZ2V0X2F0dHJfcHRyOwotfQotCi0vKioKLSAqIHJ0d19nZXRfd3BzX2F0dHJfY29udGVudDIzYSAtIFNlYXJjaCBhIHNwZWNpZmljIFdQUyBhdHRyaWJ1dGUgY29udGVudAotICogZnJvbSBhIGdpdmVuIFdQUyBJRQotICogQHdwc19pZTogQWRkcmVzcyBvZiBXUFMgSUUgdG8gc2VhcmNoCi0gKiBAd3BzX2llbGVuOiBMZW5ndGggbGltaXQgZnJvbSB3cHNfaWUKLSAqIEB0YXJnZXRfYXR0cl9pZDogVGhlIGF0dHJpYnV0ZSBJRCBvZiBXUFMgYXR0cmlidXRlIHRvIHNlYXJjaAotICogQGJ1Zl9jb250ZW50OiBJZiBub3QgTlVMTCBhbmQgdGhlIFdQUyBhdHRyaWJ1dGUgaXMgZm91bmQsIFdQUyBhdHRyaWJ1dGUKLSAqICAgICAgICAgICAgICAgY29udGVudCB3aWxsIGJlIGNvcGllZCB0byB0aGUgYnVmIHN0YXJ0aW5nIGZyb20gYnVmX2NvbnRlbnQKLSAqIEBsZW5fY29udGVudDogSWYgbm90IE5VTEwgYW5kIHRoZSBXUFMgYXR0cmlidXRlIGlzIGZvdW5kLCB3aWxsIHNldCB0byB0aGUKLSAqICAgICAgICAgICAgICAgbGVuZ3RoIG9mIHRoZSBXUFMgYXR0cmlidXRlIGNvbnRlbnQKLSAqCi0gKiBSZXR1cm5zOiB0aGUgYWRkcmVzcyBvZiB0aGUgc3BlY2lmaWMgV1BTIGF0dHJpYnV0ZSBjb250ZW50IGZvdW5kLCBvciBOVUxMCi0gKi8KLWNvbnN0IHU4ICpydHdfZ2V0X3dwc19hdHRyX2NvbnRlbnQyM2EoY29uc3QgdTggKndwc19pZSwgdWludCB3cHNfaWVsZW4sCi0JCQkJICAgICAgdTE2IHRhcmdldF9hdHRyX2lkLCB1OCAqYnVmX2NvbnRlbnQpCi17Ci0JY29uc3QgdTggKmF0dHJfcHRyOwotCXUzMiBhdHRyX2xlbjsKLQotCWF0dHJfcHRyID0gcnR3X2dldF93cHNfYXR0cjIzYSh3cHNfaWUsIHdwc19pZWxlbiwgdGFyZ2V0X2F0dHJfaWQsCi0JCQkJICAgIE5VTEwsICZhdHRyX2xlbik7Ci0KLQlpZiAoYXR0cl9wdHIgJiYgYXR0cl9sZW4pIHsKLQkJaWYgKGJ1Zl9jb250ZW50KQotCQkJbWVtY3B5KGJ1Zl9jb250ZW50LCBhdHRyX3B0ciArIDQsIGF0dHJfbGVuIC0gNCk7Ci0KLQkJcmV0dXJuIGF0dHJfcHRyICsgNDsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCBydHdfZ2V0X2NpcGhlcl9pbmZvKHN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrKQotewotCWNvbnN0IHU4ICpwYnVmOwotCWludCBncm91cF9jaXBoZXIgPSAwLCBwYWlyd2lzZV9jaXBoZXIgPSAwLCBpczgwMjF4ID0gMDsKLQlpbnQgcmV0ID0gX0ZBSUw7Ci0JaW50IHIsIHBsZW47Ci0JY2hhciAqcGllOwotCi0JcGllID0gcG5ldHdvcmstPm5ldHdvcmsuSUVzOwotCXBsZW4gPSBwbmV0d29yay0+bmV0d29yay5JRUxlbmd0aDsKLQotCXBidWYgPSBjZmc4MDIxMV9maW5kX3ZlbmRvcl9pZShXTEFOX09VSV9NSUNST1NPRlQsCi0JCQkJICAgICAgIFdMQU5fT1VJX1RZUEVfTUlDUk9TT0ZUX1dQQSwgcGllLCBwbGVuKTsKLQotCWlmIChwYnVmICYmIHBidWZbMV0gPiAwKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkJICJydHdfZ2V0X2NpcGhlcl9pbmZvOiB3cGFfaWVsZW46ICVkXG4iLCBwYnVmWzFdKTsKLQkJciA9IHJ0d19wYXJzZV93cGFfaWUyM2EocGJ1ZiwgcGJ1ZlsxXSArIDIsICZncm91cF9jaXBoZXIsCi0JCQkJICAgICAmcGFpcndpc2VfY2lwaGVyLCAmaXM4MDIxeCk7Ci0JCWlmIChyID09IF9TVUNDRVNTKSB7Ci0JCQlwbmV0d29yay0+QmNuSW5mby5wYWlyd2lzZV9jaXBoZXIgPSBwYWlyd2lzZV9jaXBoZXI7Ci0JCQlwbmV0d29yay0+QmNuSW5mby5ncm91cF9jaXBoZXIgPSBncm91cF9jaXBoZXI7Ci0JCQlwbmV0d29yay0+QmNuSW5mby5pc184MDIxeCA9IGlzODAyMXg7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJCQkgIiVzOiBwbmV0d29yay0+cGFpcndpc2VfY2lwaGVyOiAlZCwgaXNfODAyMXggaXMgJWRcbiIsCi0JCQkJIF9fZnVuY19fLCBwbmV0d29yay0+QmNuSW5mby5wYWlyd2lzZV9jaXBoZXIsCi0JCQkJIHBuZXR3b3JrLT5CY25JbmZvLmlzXzgwMjF4KTsKLQkJCXJldCA9IF9TVUNDRVNTOwotCQl9Ci0JfSBlbHNlIHsKLQkJcGJ1ZiA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfUlNOLCBwaWUsIHBsZW4pOwotCi0JCWlmIChwYnVmICYmIHBidWZbMV0gPiAwKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJCQkgImdldCBSU04gSUVcbiIpOwotCQkJciA9IHJ0d19wYXJzZV93cGEyX2llMjNhKHBidWYsIHBidWZbMV0gKyAyLAotCQkJCQkgICAgICAmZ3JvdXBfY2lwaGVyLCAmcGFpcndpc2VfY2lwaGVyLAotCQkJCQkgICAgICAmaXM4MDIxeCk7Ci0JCQlpZiAociA9PSBfU1VDQ0VTUykgewotCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkJCQkgImdldCBSU04gSUUgIE9LISEhXG4iKTsKLQkJCQlwbmV0d29yay0+QmNuSW5mby5wYWlyd2lzZV9jaXBoZXIgPQotCQkJCQlwYWlyd2lzZV9jaXBoZXI7Ci0JCQkJcG5ldHdvcmstPkJjbkluZm8uZ3JvdXBfY2lwaGVyID0gZ3JvdXBfY2lwaGVyOwotCQkJCXBuZXR3b3JrLT5CY25JbmZvLmlzXzgwMjF4ID0gaXM4MDIxeDsKLQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJCQkJICIlczogcG5ldHdvcmstPnBhaXJ3aXNlX2NpcGhlcjogJWQscG5ldHdvcmstPmdyb3VwX2NpcGhlciBpcyAlZCwgaXNfODAyMXggaXMgJWRcbiIsCi0JCQkJCSBfX2Z1bmNfXywKLQkJCQkJIHBuZXR3b3JrLT5CY25JbmZvLnBhaXJ3aXNlX2NpcGhlciwKLQkJCQkJIHBuZXR3b3JrLT5CY25JbmZvLmdyb3VwX2NpcGhlciwKLQkJCQkJIHBuZXR3b3JrLT5CY25JbmZvLmlzXzgwMjF4KTsKLQkJCQlyZXQgPSBfU1VDQ0VTUzsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgcnR3X2dldF9iY25faW5mbzIzYShzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yaykKLXsKLQl1OCBiZW5jcnlwdCA9IDA7Ci0JaW50IHBpZV9sZW47Ci0JdTggKnBpZTsKLQljb25zdCB1OCAqcDsKLQotCWlmIChwbmV0d29yay0+bmV0d29yay5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpIHsKLQkJYmVuY3J5cHQgPSAxOwotCQlwbmV0d29yay0+bmV0d29yay5Qcml2YWN5ID0gMTsKLQl9IGVsc2UKLQkJcG5ldHdvcmstPkJjbkluZm8uZW5jcnlwX3Byb3RvY29sID0gRU5DUllQX1BST1RPQ09MX09QRU5TWVM7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJICIlczogc3NpZCA9JXNcbiIsIF9fZnVuY19fLCBwbmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWQpOwotCi0JcGllID0gcG5ldHdvcmstPm5ldHdvcmsuSUVzOwotCXBpZV9sZW4gPSBwbmV0d29yay0+bmV0d29yay5JRUxlbmd0aDsKLQotCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX1JTTiwgcGllLCBwaWVfbGVuKTsKLQlpZiAocCAmJiBwWzFdKSB7Ci0JCXBuZXR3b3JrLT5CY25JbmZvLmVuY3J5cF9wcm90b2NvbCA9IEVOQ1JZUF9QUk9UT0NPTF9XUEEyOwotCX0gZWxzZSBpZiAoY2ZnODAyMTFfZmluZF92ZW5kb3JfaWUoV0xBTl9PVUlfTUlDUk9TT0ZULAotCQkJCQkgICBXTEFOX09VSV9UWVBFX01JQ1JPU09GVF9XUEEsCi0JCQkJCSAgIHBpZSwgcGllX2xlbikpIHsKLQkJcG5ldHdvcmstPkJjbkluZm8uZW5jcnlwX3Byb3RvY29sID0gRU5DUllQX1BST1RPQ09MX1dQQTsKLQl9IGVsc2UgewotCQlpZiAoYmVuY3J5cHQpCi0JCQlwbmV0d29yay0+QmNuSW5mby5lbmNyeXBfcHJvdG9jb2wgPSBFTkNSWVBfUFJPVE9DT0xfV0VQOwotCX0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJICIlczogcG5ldHdvcmstPmVuY3J5cF9wcm90b2NvbCBpcyAleFxuIiwgX19mdW5jX18sCi0JCSBwbmV0d29yay0+QmNuSW5mby5lbmNyeXBfcHJvdG9jb2wpOwotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkgIiVzOiBwbmV0d29yay0+ZW5jcnlwX3Byb3RvY29sIGlzICV4XG4iLCBfX2Z1bmNfXywKLQkJIHBuZXR3b3JrLT5CY25JbmZvLmVuY3J5cF9wcm90b2NvbCk7Ci0JcnR3X2dldF9jaXBoZXJfaW5mbyhwbmV0d29yayk7Ci0KLQkvKiBnZXQgYndtb2RlIGFuZCBjaF9vZmZzZXQgKi8KLX0KLQotLyogc2hvdyBNQ1MgcmF0ZSwgdW5pdDogMTAwS2JwcyAqLwotdTE2IHJ0d19tY3NfcmF0ZTIzYSh1OCByZl90eXBlLCB1OCBid180ME1IeiwgdTggc2hvcnRfR0lfMjAsIHU4IHNob3J0X0dJXzQwLAotCQkgICAgc3RydWN0IGllZWU4MDIxMV9tY3NfaW5mbyAqbWNzKQotewotCXUxNiBtYXhfcmF0ZSA9IDA7Ci0KLQlpZiAocmZfdHlwZSA9PSBSRl8xVDFSKSB7Ci0JCWlmIChtY3MtPnJ4X21hc2tbMF0gJiBCSVQoNykpCi0JCQltYXhfcmF0ZSA9IChid180ME1IeikgPyAoKHNob3J0X0dJXzQwKT8xNTAwOjEzNTApOgotCQkJCSgoc2hvcnRfR0lfMjApPzcyMjo2NTApOwotCQllbHNlIGlmIChtY3MtPnJ4X21hc2tbMF0gJiBCSVQoNikpCi0JCQltYXhfcmF0ZSA9IChid180ME1IeikgPyAoKHNob3J0X0dJXzQwKT8xMzUwOjEyMTUpOgotCQkJCSgoc2hvcnRfR0lfMjApPzY1MDo1ODUpOwotCQllbHNlIGlmIChtY3MtPnJ4X21hc2tbMF0gJiBCSVQoNSkpCi0JCQltYXhfcmF0ZSA9IChid180ME1IeikgPyAoKHNob3J0X0dJXzQwKT8xMjAwOjEwODApOgotCQkJCSgoc2hvcnRfR0lfMjApPzU3ODo1MjApOwotCQllbHNlIGlmIChtY3MtPnJ4X21hc2tbMF0gJiBCSVQoNCkpCi0JCQltYXhfcmF0ZSA9IChid180ME1IeikgPyAoKHNob3J0X0dJXzQwKT85MDA6ODEwKToKLQkJCQkoKHNob3J0X0dJXzIwKT80MzM6MzkwKTsKLQkJZWxzZSBpZiAobWNzLT5yeF9tYXNrWzBdICYgQklUKDMpKQotCQkJbWF4X3JhdGUgPSAoYndfNDBNSHopID8gKChzaG9ydF9HSV80MCk/NjAwOjU0MCk6Ci0JCQkJKChzaG9ydF9HSV8yMCk/Mjg5OjI2MCk7Ci0JCWVsc2UgaWYgKG1jcy0+cnhfbWFza1swXSAmIEJJVCgyKSkKLQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzQ1MDo0MDUpOgotCQkJCSgoc2hvcnRfR0lfMjApPzIxNzoxOTUpOwotCQllbHNlIGlmIChtY3MtPnJ4X21hc2tbMF0gJiBCSVQoMSkpCi0JCQltYXhfcmF0ZSA9IChid180ME1IeikgPyAoKHNob3J0X0dJXzQwKT8zMDA6MjcwKToKLQkJCQkoKHNob3J0X0dJXzIwKT8xNDQ6MTMwKTsKLQkJZWxzZSBpZiAobWNzLT5yeF9tYXNrWzBdICYgQklUKDApKQotCQkJbWF4X3JhdGUgPSAoYndfNDBNSHopID8gKChzaG9ydF9HSV80MCk/MTUwOjEzNSk6Ci0JCQkJKChzaG9ydF9HSV8yMCk/NzI6NjUpOwotCX0gZWxzZSB7Ci0JCWlmIChtY3MtPnJ4X21hc2tbMV0pIHsKLQkJCWlmIChtY3MtPnJ4X21hc2tbMV0gJiBCSVQoNykpCi0JCQkJbWF4X3JhdGUgPSAoYndfNDBNSHopID8gKChzaG9ydF9HSV80MCk/MzAwMDoyNzAwKTooKHNob3J0X0dJXzIwKT8xNDQ0OjEzMDApOwotCQkJZWxzZSBpZiAobWNzLT5yeF9tYXNrWzFdICYgQklUKDYpKQotCQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzI3MDA6MjQzMCk6KChzaG9ydF9HSV8yMCk/MTMwMDoxMTcwKTsKLQkJCWVsc2UgaWYgKG1jcy0+cnhfbWFza1sxXSAmIEJJVCg1KSkKLQkJCQltYXhfcmF0ZSA9IChid180ME1IeikgPyAoKHNob3J0X0dJXzQwKT8yNDAwOjIxNjApOigoc2hvcnRfR0lfMjApPzExNTY6MTA0MCk7Ci0JCQllbHNlIGlmIChtY3MtPnJ4X21hc2tbMV0gJiBCSVQoNCkpCi0JCQkJbWF4X3JhdGUgPSAoYndfNDBNSHopID8gKChzaG9ydF9HSV80MCk/MTgwMDoxNjIwKTooKHNob3J0X0dJXzIwKT84Njc6NzgwKTsKLQkJCWVsc2UgaWYgKG1jcy0+cnhfbWFza1sxXSAmIEJJVCgzKSkKLQkJCQltYXhfcmF0ZSA9IChid180ME1IeikgPyAoKHNob3J0X0dJXzQwKT8xMjAwOjEwODApOigoc2hvcnRfR0lfMjApPzU3ODo1MjApOwotCQkJZWxzZSBpZiAobWNzLT5yeF9tYXNrWzFdICYgQklUKDIpKQotCQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzkwMDo4MTApOigoc2hvcnRfR0lfMjApPzQzMzozOTApOwotCQkJZWxzZSBpZiAobWNzLT5yeF9tYXNrWzFdICYgQklUKDEpKQotCQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzYwMDo1NDApOigoc2hvcnRfR0lfMjApPzI4OToyNjApOwotCQkJZWxzZSBpZiAobWNzLT5yeF9tYXNrWzFdICYgQklUKDApKQotCQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzMwMDoyNzApOigoc2hvcnRfR0lfMjApPzE0NDoxMzApOwotCQl9IGVsc2UgewotCQkJaWYgKG1jcy0+cnhfbWFza1swXSAmIEJJVCg3KSkKLQkJCQltYXhfcmF0ZSA9IChid180ME1IeikgPyAoKHNob3J0X0dJXzQwKT8xNTAwOjEzNTApOigoc2hvcnRfR0lfMjApPzcyMjo2NTApOwotCQkJZWxzZSBpZiAobWNzLT5yeF9tYXNrWzBdICYgQklUKDYpKQotCQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzEzNTA6MTIxNSk6KChzaG9ydF9HSV8yMCk/NjUwOjU4NSk7Ci0JCQllbHNlIGlmIChtY3MtPnJ4X21hc2tbMF0gJiBCSVQoNSkpCi0JCQkJbWF4X3JhdGUgPSAoYndfNDBNSHopID8gKChzaG9ydF9HSV80MCk/MTIwMDoxMDgwKTooKHNob3J0X0dJXzIwKT81Nzg6NTIwKTsKLQkJCWVsc2UgaWYgKG1jcy0+cnhfbWFza1swXSAmIEJJVCg0KSkKLQkJCQltYXhfcmF0ZSA9IChid180ME1IeikgPyAoKHNob3J0X0dJXzQwKT85MDA6ODEwKTooKHNob3J0X0dJXzIwKT80MzM6MzkwKTsKLQkJCWVsc2UgaWYgKG1jcy0+cnhfbWFza1swXSAmIEJJVCgzKSkKLQkJCQltYXhfcmF0ZSA9IChid180ME1IeikgPyAoKHNob3J0X0dJXzQwKT82MDA6NTQwKTooKHNob3J0X0dJXzIwKT8yODk6MjYwKTsKLQkJCWVsc2UgaWYgKG1jcy0+cnhfbWFza1swXSAmIEJJVCgyKSkKLQkJCQltYXhfcmF0ZSA9IChid180ME1IeikgPyAoKHNob3J0X0dJXzQwKT80NTA6NDA1KTooKHNob3J0X0dJXzIwKT8yMTc6MTk1KTsKLQkJCWVsc2UgaWYgKG1jcy0+cnhfbWFza1swXSAmIEJJVCgxKSkKLQkJCQltYXhfcmF0ZSA9IChid180ME1IeikgPyAoKHNob3J0X0dJXzQwKT8zMDA6MjcwKTooKHNob3J0X0dJXzIwKT8xNDQ6MTMwKTsKLQkJCWVsc2UgaWYgKG1jcy0+cnhfbWFza1swXSAmIEJJVCgwKSkKLQkJCQltYXhfcmF0ZSA9IChid180ME1IeikgPyAoKHNob3J0X0dJXzQwKT8xNTA6MTM1KTooKHNob3J0X0dJXzIwKT83Mjo2NSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIG1heF9yYXRlOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19tbG1lLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X21sbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc4NmZjNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X21sbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDIzMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9SVFdfTUxNRV9DXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPHJlY3Zfb3NkZXAuaD4KLSNpbmNsdWRlIDx4bWl0X29zZGVwLmg+Ci0jaW5jbHVkZSA8aGFsX2ludGYuaD4KLSNpbmNsdWRlIDxtbG1lX29zZGVwLmg+Ci0jaW5jbHVkZSA8c3RhX2luZm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pZWVlODAyMTEuaD4KLSNpbmNsdWRlIDx3aWZpLmg+Ci0jaW5jbHVkZSA8d2xhbl9ic3NkZWYuaD4KLSNpbmNsdWRlIDxydHdfc3Jlc2V0Lmg+Ci0KLXN0YXRpYyBzdHJ1Y3Qgd2xhbl9uZXR3b3JrICoKLXJ0d19zZWxlY3RfY2FuZGlkYXRlX2Zyb21fcXVldWUoc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2KTsKLXN0YXRpYyBpbnQgcnR3X2RvX2pvaW4oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLXN0YXRpYyB2b2lkIHJ0d19pbml0X21sbWVfdGltZXIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCi0Jc2V0dXBfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsIHJ0dzIzYV9qb2luX3RvX2hhbmRsZXIsCi0JCSAgICAodW5zaWduZWQgbG9uZylwYWRhcHRlcik7Ci0KLQlzZXR1cF90aW1lcigmcG1sbWVwcml2LT5zY2FuX3RvX3RpbWVyLCBydHdfc2Nhbl90aW1lb3V0X2hhbmRsZXIyM2EsCi0JCSAgICAodW5zaWduZWQgbG9uZylwYWRhcHRlcik7Ci0KLQlzZXR1cF90aW1lcigmcG1sbWVwcml2LT5keW5hbWljX2Noa190aW1lciwKLQkJICAgIHJ0d19keW5hbWljX2NoZWNrX3RpbWVyX2hhbmRsZXIsICh1bnNpZ25lZCBsb25nKXBhZGFwdGVyKTsKLQotCXNldHVwX3RpbWVyKCZwbWxtZXByaXYtPnNldF9zY2FuX2RlbnlfdGltZXIsCi0JCSAgICBydHdfc2V0X3NjYW5fZGVueV90aW1lcl9oZGwsICh1bnNpZ25lZCBsb25nKXBhZGFwdGVyKTsKLX0KLQotaW50IHJ0d19pbml0X21sbWVfcHJpdjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlwbWxtZXByaXYtPm5pY19oZGwgPSBwYWRhcHRlcjsKLQotCXBtbG1lcHJpdi0+Zndfc3RhdGUgPSAwOwotCXBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yay5pZm1vZGUgPSBOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRDsKLQkvKiAgMTogYWN0aXZlLCAwOiBwYXNpdmUuIE1heWJlIHNvbWVkYXkgd2Ugc2hvdWxkIHJlbmFtZSB0aGlzCi0JICAgIHZhcmFibGUgdG8gImFjdGl2ZV9tb2RlIiAoSmVmZikgKi8KLQlwbWxtZXByaXYtPnNjYW5fbW9kZSA9IFNDQU5fQUNUSVZFOwotCi0Jc3Bpbl9sb2NrX2luaXQoJnBtbG1lcHJpdi0+bG9jayk7Ci0JX3J0d19pbml0X3F1ZXVlMjNhKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUpOwotCi0JbWVtc2V0KCZwbWxtZXByaXYtPmFzc29jX3NzaWQsIDAsIHNpemVvZihzdHJ1Y3QgY2ZnODAyMTFfc3NpZCkpOwotCi0JcnR3X2NsZWFyX3NjYW5fZGVueShwYWRhcHRlcik7Ci0KLQlydHdfaW5pdF9tbG1lX3RpbWVyKHBhZGFwdGVyKTsKLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLXN0YXRpYyB2b2lkIHJ0d19mcmVlX21sbWVfaWVfZGF0YSh1OCAqKnBwaWUsIHUzMiAqcGxlbikKLXsKLQlpZiAoKnBwaWUpIHsKLQkJa2ZyZWUoKnBwaWUpOwotCQkqcGxlbiA9IDA7Ci0JCSpwcGllID0gTlVMTDsKLQl9Ci19Ci0jZW5kaWYKLQotdm9pZCBydHcyM2FfZnJlZV9tbG1lX3ByaXZfaWVfZGF0YShzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYpCi17Ci0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0Ja2ZyZWUocG1sbWVwcml2LT5hc3NvY19yZXEpOwotCWtmcmVlKHBtbG1lcHJpdi0+YXNzb2NfcnNwKTsKLQlydHdfZnJlZV9tbG1lX2llX2RhdGEoJnBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZSwKLQkJCSAgICAgICZwbWxtZXByaXYtPndwc19wcm9iZV9yZXFfaWVfbGVuKTsKLSNlbmRpZgotfQotCi12b2lkIHJ0d19mcmVlX21sbWVfcHJpdjIzYShzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYpCi17Ci0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJICJydHdfZnJlZV9tbG1lX3ByaXYyM2FcbiIpOwotCi0JcnR3MjNhX2ZyZWVfbWxtZV9wcml2X2llX2RhdGEocG1sbWVwcml2KTsKLX0KLQotc3RydWN0IHdsYW5fbmV0d29yayAqcnR3X2FsbG9jX25ldHdvcmsoc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2LCBnZnBfdCBnZnApCi17Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcms7Ci0KLQlwbmV0d29yayA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3bGFuX25ldHdvcmspLCBnZnApOwotCWlmIChwbmV0d29yaykgewotCQlJTklUX0xJU1RfSEVBRCgmcG5ldHdvcmstPmxpc3QpOwotCQlwbmV0d29yay0+bmV0d29ya190eXBlID0gMDsKLQkJcG5ldHdvcmstPmZpeGVkID0gZmFsc2U7Ci0JCXBuZXR3b3JrLT5sYXN0X3NjYW5uZWQgPSBqaWZmaWVzOwotCQlwbmV0d29yay0+am9pbl9yZXMgPSAwOwotCX0KLQotCXJldHVybiBwbmV0d29yazsKLX0KLQotc3RhdGljIHZvaWQgX3J0d19mcmVlX25ldHdvcmsyM2Eoc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2LAotCQkJCSBzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yaykKLXsKLQlpZiAoIXBuZXR3b3JrKQotCQlyZXR1cm47Ci0KLQlpZiAocG5ldHdvcmstPmZpeGVkID09IHRydWUpCi0JCXJldHVybjsKLQotCWxpc3RfZGVsX2luaXQoJnBuZXR3b3JrLT5saXN0KTsKLQotCWtmcmVlKHBuZXR3b3JrKTsKLX0KLQotLyoKLSByZXR1cm4gdGhlIHdsYW5fbmV0d29yayB3aXRoIHRoZSBtYXRjaGluZyBhZGRyCi0KLSBTaGFsbCBiZSBjYWxsZWQgdW5kZXIgYXRvbWljIGNvbnRleHQuLi4gdG8gYXZvaWQgcG9zc2libGUgcmFjaW5nIGNvbmRpdGlvbi4uLgotKi8KLXN0cnVjdCB3bGFuX25ldHdvcmsgKgotcnR3X2ZpbmRfbmV0d29yazIzYShzdHJ1Y3QgcnR3X3F1ZXVlICpzY2FubmVkX3F1ZXVlLCB1OCAqYWRkcikKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZCwgKnBsaXN0OwotCXN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrID0gTlVMTDsKLQotCWlmIChpc196ZXJvX2V0aGVyX2FkZHIoYWRkcikpIHsKLQkJcG5ldHdvcmsgPSBOVUxMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogc3Bpbl9sb2NrX2JoKCZzY2FubmVkX3F1ZXVlLT5sb2NrKTsgKi8KLQotCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChzY2FubmVkX3F1ZXVlKTsKLQlwbGlzdCA9IHBoZWFkLT5uZXh0OwotCi0Jd2hpbGUgKHBsaXN0ICE9IHBoZWFkKSB7Ci0JCXBuZXR3b3JrID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKLQotCQlpZiAoZXRoZXJfYWRkcl9lcXVhbChhZGRyLCBwbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzKSkKLQkJCWJyZWFrOwotCi0JCXBsaXN0ID0gcGxpc3QtPm5leHQ7Ci0JfQotCi0JaWYgKHBsaXN0ID09IHBoZWFkKQotCQlwbmV0d29yayA9IE5VTEw7Ci0KLQkvKiBzcGluX3VubG9ja19iaCgmc2Nhbm5lZF9xdWV1ZS0+bG9jayk7ICovCi0KLWV4aXQ6Ci0KLQlyZXR1cm4gcG5ldHdvcms7Ci19Ci0KLXZvaWQgcnR3X2ZyZWVfbmV0d29ya19xdWV1ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkOwotCXN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrLCAqcHRtcDsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBydHdfcXVldWUgKnNjYW5uZWRfcXVldWUgPSAmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlOwotCi0Jc3Bpbl9sb2NrX2JoKCZzY2FubmVkX3F1ZXVlLT5sb2NrKTsKLQlwaGVhZCA9IGdldF9saXN0X2hlYWQoc2Nhbm5lZF9xdWV1ZSk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBuZXR3b3JrLCBwdG1wLCBwaGVhZCwgbGlzdCkKLQkJX3J0d19mcmVlX25ldHdvcmsyM2EocG1sbWVwcml2LCBwbmV0d29yayk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnNjYW5uZWRfcXVldWUtPmxvY2spOwotfQotCi1pbnQgcnR3X2lmX3VwMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JaW50IHJlczsKLQotCWlmIChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgfHwKLQkgICAgIWNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCQkgInJ0d19pZl91cDIzYTpiRHJpdmVyU3RvcHBlZCglZCkgT1IgYlN1cnByaXNlUmVtb3ZlZCglZClcbiIsCi0JCQkgcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkLCBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCk7Ci0JCXJlcyA9IGZhbHNlOwotCX0gZWxzZQotCQlyZXMgPSAgdHJ1ZTsKLQotCXJldHVybiByZXM7Ci19Ci0KLXZvaWQgcnR3X2dlbmVyYXRlX3JhbmRvbV9pYnNzMjNhKHU4ICpwaWJzcykKLXsKLQl1bnNpZ25lZCBsb25nIGN1cnRpbWUgPSBqaWZmaWVzOwotCi0JcGlic3NbMF0gPSAweDAyOyAgLyogaW4gYWQtaG9jIG1vZGUgYml0MSBtdXN0IHNldCB0byAxICovCi0JcGlic3NbMV0gPSAweDExOwotCXBpYnNzWzJdID0gMHg4NzsKLQlwaWJzc1szXSA9IGN1cnRpbWUgJiAweGZmOy8qIHBbMF07ICovCi0JcGlic3NbNF0gPSAoY3VydGltZSA+PiA4KSAmIDB4ZmY7LyogcFsxXTsgKi8KLQlwaWJzc1s1XSA9IChjdXJ0aW1lID4+IDE2KSAmIDB4ZmY7LyogcFsyXTsgKi8KLX0KLQotdm9pZCBydHdfc2V0X3JvYW1pbmcoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCB1OCB0b19yb2FtaW5nKQotewotCWlmICh0b19yb2FtaW5nID09IDApCi0JCWFkYXB0ZXItPm1sbWVwcml2LnRvX2pvaW4gPSBmYWxzZTsKLQlhZGFwdGVyLT5tbG1lcHJpdi50b19yb2FtaW5nID0gdG9fcm9hbWluZzsKLX0KLQotc3RhdGljIHZvaWQgX3J0d19yb2FtaW5nKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgc3RydWN0IHdsYW5fbmV0d29yayAqdGd0X25ldHdvcmspCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yazsKLQlpbnQgZG9fam9pbl9yOwotCi0JaWYgKHRndF9uZXR3b3JrKQotCQlwbmV0d29yayA9IHRndF9uZXR3b3JrOwotCWVsc2UKLQkJcG5ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yazsKLQotCWlmIChwYWRhcHRlci0+bWxtZXByaXYudG9fcm9hbWluZyA+IDApIHsKLQkJREJHXzg3MjNBKCJyb2FtaW5nIGZyb20gJXMoJXBNKSwgbGVuZ3RoOiVkXG4iLAotCQkJICBwbmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWQsCi0JCQkgIHBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsCi0JCQkgIHBuZXR3b3JrLT5uZXR3b3JrLlNzaWQuc3NpZF9sZW4pOwotCQltZW1jcHkoJnBtbG1lcHJpdi0+YXNzb2Nfc3NpZCwgJnBuZXR3b3JrLT5uZXR3b3JrLlNzaWQsCi0JCSAgICAgICBzaXplb2Yoc3RydWN0IGNmZzgwMjExX3NzaWQpKTsKLQotCQlwbWxtZXByaXYtPmFzc29jX2J5X2Jzc2lkID0gZmFsc2U7Ci0KLQkJd2hpbGUgKDEpIHsKLQkJCWRvX2pvaW5fciA9IHJ0d19kb19qb2luKHBhZGFwdGVyKTsKLQkJCWlmIChkb19qb2luX3IgPT0gX1NVQ0NFU1MpCi0JCQkJYnJlYWs7Ci0JCQllbHNlIHsKLQkJCQlEQkdfODcyM0EoInJvYW1pbmcgZG9fam9pbiByZXR1cm4gJWRcbiIsCi0JCQkJCSAgZG9fam9pbl9yKTsKLQkJCQlwbWxtZXByaXYtPnRvX3JvYW1pbmctLTsKLQotCQkJCWlmIChwYWRhcHRlci0+bWxtZXByaXYudG9fcm9hbWluZyA+IDApCi0JCQkJCWNvbnRpbnVlOwotCQkJCWVsc2UgewotCQkJCQlEQkdfODcyM0EoIiVzKCVkKSAtdG8gcm9hbWluZyBmYWlsLCAiCi0JCQkJCQkgICJpbmRpY2F0ZV9kaXNjb25uZWN0XG4iLAotCQkJCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJCQlydHdfaW5kaWNhdGVfZGlzY29ubmVjdDIzYShwYWRhcHRlcik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KLQotdm9pZCBydHcyM2Ffcm9hbWluZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgc3RydWN0IHdsYW5fbmV0d29yayAqdGd0X25ldHdvcmspCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLQlfcnR3X3JvYW1pbmcocGFkYXB0ZXIsIHRndF9uZXR3b3JrKTsKLQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgcnR3X2ZyZWVfbmV0d29ya19ub2xvY2soc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2LAotCQkJCSAgICBzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yaykKLXsKLQlfcnR3X2ZyZWVfbmV0d29yazIzYShwbWxtZXByaXYsIHBuZXR3b3JrKTsKLX0KLQotYm9vbCBydHdfaXNfc2FtZV9pYnNzMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJCSBzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yaykKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJmFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQotCWlmIChwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtICE9IDAgJiYKLQkgICAgcG5ldHdvcmstPm5ldHdvcmsuUHJpdmFjeSA9PSAwKQotCQlyZXQgPSBmYWxzZTsKLQllbHNlIGlmIChwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtID09IDAgJiYKLQkJIHBuZXR3b3JrLT5uZXR3b3JrLlByaXZhY3kgPT0gMSkKLQkJcmV0ID0gZmFsc2U7Ci0JZWxzZQotCQlyZXQgPSB0cnVlOwotCi0JcmV0dXJuIHJldDsKLX0KLQotaW5saW5lIGludCBpc19zYW1lX2VzcyhzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqYSwgc3RydWN0IHdsYW5fYnNzaWRfZXggKmIpOwotaW5saW5lIGludCBpc19zYW1lX2VzcyhzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqYSwgc3RydWN0IHdsYW5fYnNzaWRfZXggKmIpCi17Ci0JcmV0dXJuIChhLT5Tc2lkLnNzaWRfbGVuID09IGItPlNzaWQuc3NpZF9sZW4pICYmCi0JCSFtZW1jbXAoYS0+U3NpZC5zc2lkLCBiLT5Tc2lkLnNzaWQsIGEtPlNzaWQuc3NpZF9sZW4pOwotfQotCi1pbnQgaXNfc2FtZV9uZXR3b3JrMjNhKHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpzcmMsIHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpkc3QpCi17Ci0JdTE2IHNfY2FwLCBkX2NhcDsKLQotCXNfY2FwID0gc3JjLT5jYXBhYmlsaXR5OwotCWRfY2FwID0gZHN0LT5jYXBhYmlsaXR5OwotCi0JcmV0dXJuICgoc3JjLT5Tc2lkLnNzaWRfbGVuID09IGRzdC0+U3NpZC5zc2lkX2xlbikgJiYKLQkJLyoJKHNyYy0+RFNDb25maWcgPT0gZHN0LT5EU0NvbmZpZykgJiYgKi8KLQkJZXRoZXJfYWRkcl9lcXVhbChzcmMtPk1hY0FkZHJlc3MsIGRzdC0+TWFjQWRkcmVzcykgJiYKLQkJIW1lbWNtcChzcmMtPlNzaWQuc3NpZCwgZHN0LT5Tc2lkLnNzaWQsIHNyYy0+U3NpZC5zc2lkX2xlbikgJiYKLQkJKHNfY2FwICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpID09Ci0JCShkX2NhcCAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSAmJgotCQkoc19jYXAgJiBXTEFOX0NBUEFCSUxJVFlfRVNTKSA9PSAoZF9jYXAgJiBXTEFOX0NBUEFCSUxJVFlfRVNTKSk7Ci19Ci0KLXN0cnVjdCB3bGFuX25ldHdvcmsgKgotcnR3X2dldF9vbGRlc3Rfd2xhbl9uZXR3b3JrMjNhKHN0cnVjdCBydHdfcXVldWUgKnNjYW5uZWRfcXVldWUpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqcHdsYW47Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqb2xkZXN0ID0gTlVMTDsKLQotCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChzY2FubmVkX3F1ZXVlKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHB3bGFuLCBwaGVhZCwgbGlzdCkgewotCQlpZiAocHdsYW4tPmZpeGVkICE9IHRydWUpIHsKLQkJCWlmICghb2xkZXN0IHx8IHRpbWVfYWZ0ZXIob2xkZXN0LT5sYXN0X3NjYW5uZWQsCi0JCQkJCQkgIHB3bGFuLT5sYXN0X3NjYW5uZWQpKQotCQkJCW9sZGVzdCA9IHB3bGFuOwotCQl9Ci0JfQotCi0JcmV0dXJuIG9sZGVzdDsKLX0KLQotdm9pZCB1cGRhdGVfbmV0d29yazIzYShzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqZHN0LCBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqc3JjLAotCQkgICAgICAgc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgYm9vbCB1cGRhdGVfaWUpCi17Ci0JdTggc3Nfb3JpID0gZHN0LT5TaWduYWxTdHJlbmd0aDsKLQl1OCBzcV9vcmkgPSBkc3QtPlNpZ25hbFF1YWxpdHk7Ci0JbG9uZyByc3NpX29yaSA9IGRzdC0+UnNzaTsKLQotCXU4IHNzX3NtcCA9IHNyYy0+U2lnbmFsU3RyZW5ndGg7Ci0JdTggc3Ffc21wID0gc3JjLT5TaWduYWxRdWFsaXR5OwotCWxvbmcgcnNzaV9zbXAgPSBzcmMtPlJzc2k7Ci0KLQl1OCBzc19maW5hbDsKLQl1OCBzcV9maW5hbDsKLQlsb25nIHJzc2lfZmluYWw7Ci0KLQlEQkdfODcyM0EoIiVzICVzKCVwTSwgY2gldSkgc3Nfb3JpOiUzdSwgc3Ffb3JpOiUzdSwgcnNzaV9vcmk6JTNsZCwgIgotCQkgICJzc19zbXA6JTN1LCBzcV9zbXA6JTN1LCByc3NpX3NtcDolM2xkXG4iLAotCQkgIF9fZnVuY19fLCBzcmMtPlNzaWQuc3NpZCwgc3JjLT5NYWNBZGRyZXNzLAotCQkgIHNyYy0+RFNDb25maWcsIHNzX29yaSwgc3Ffb3JpLCByc3NpX29yaSwKLQkJICBzc19zbXAsIHNxX3NtcCwgcnNzaV9zbXAKLQkpOwotCi0JLyogVGhlIHJ1bGUgYmVsb3cgaXMgMS81IGZvciBzYW1wbGUgdmFsdWUsIDQvNSBmb3IgaGlzdG9yeSB2YWx1ZSAqLwotCWlmIChjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIF9GV19MSU5LRUQpICYmCi0JICAgIGlzX3NhbWVfbmV0d29yazIzYSgmcGFkYXB0ZXItPm1sbWVwcml2LmN1cl9uZXR3b3JrLm5ldHdvcmssIHNyYykpIHsKLQkJLyogVGFrZSB0aGUgcmVjdnByaXYncyB2YWx1ZSBmb3IgdGhlIGNvbm5lY3RlZCBBUCovCi0JCXNzX2ZpbmFsID0gcGFkYXB0ZXItPnJlY3Zwcml2LnNpZ25hbF9zdHJlbmd0aDsKLQkJc3FfZmluYWwgPSBwYWRhcHRlci0+cmVjdnByaXYuc2lnbmFsX3F1YWw7Ci0JCS8qIHRoZSByc3NpIHZhbHVlIGhlcmUgaXMgdW5kZWNvcmF0ZWQsIGFuZCB3aWxsIGJlCi0JCSAgIHVzZWQgZm9yIGFudGVubmEgZGl2ZXJzaXR5ICovCi0JCWlmIChzcV9zbXAgIT0gMTAxKSAvKiBmcm9tIHRoZSByaWdodCBjaGFubmVsICovCi0JCQlyc3NpX2ZpbmFsID0gKHNyYy0+UnNzaStkc3QtPlJzc2kqNCkvNTsKLQkJZWxzZQotCQkJcnNzaV9maW5hbCA9IHJzc2lfb3JpOwotCX0gZWxzZSB7Ci0JCWlmIChzcV9zbXAgIT0gMTAxKSB7IC8qIGZyb20gdGhlIHJpZ2h0IGNoYW5uZWwgKi8KLQkJCXNzX2ZpbmFsID0gKCh1MzIpc3JjLT5TaWduYWxTdHJlbmd0aCArCi0JCQkJICAgICh1MzIpZHN0LT5TaWduYWxTdHJlbmd0aCAqIDQpIC8gNTsKLQkJCXNxX2ZpbmFsID0gKCh1MzIpc3JjLT5TaWduYWxRdWFsaXR5ICsKLQkJCQkgICAgKHUzMilkc3QtPlNpZ25hbFF1YWxpdHkgKiA0KSAvIDU7Ci0JCQlyc3NpX2ZpbmFsID0gc3JjLT5Sc3NpK2RzdC0+UnNzaSAqIDQgLyA1OwotCQl9IGVsc2UgewotCQkJLyogYnNzIGluZm8gbm90IHJlY2VpdmluZyBmcm9tIHRoZSByaWdodCBjaGFubmVsLCB1c2UKLQkJCSAgIHRoZSBvcmlnaW5hbCBSWCBzaWduYWwgaW5mb3MgKi8KLQkJCXNzX2ZpbmFsID0gZHN0LT5TaWduYWxTdHJlbmd0aDsKLQkJCXNxX2ZpbmFsID0gZHN0LT5TaWduYWxRdWFsaXR5OwotCQkJcnNzaV9maW5hbCA9IGRzdC0+UnNzaTsKLQkJfQotCi0JfQotCi0JaWYgKHVwZGF0ZV9pZSkKLQkJbWVtY3B5KGRzdCwgc3JjLCBnZXRfd2xhbl9ic3NpZF9leF9zeihzcmMpKTsKLQotCWRzdC0+U2lnbmFsU3RyZW5ndGggPSBzc19maW5hbDsKLQlkc3QtPlNpZ25hbFF1YWxpdHkgPSBzcV9maW5hbDsKLQlkc3QtPlJzc2kgPSByc3NpX2ZpbmFsOwotCi0JREJHXzg3MjNBKCIlcyAlcyglcE0pLCBTaWduYWxTdHJlbmd0aDoldSwgU2lnbmFsUXVhbGl0eToldSwgIgotCQkgICJSYXdSU1NJOiVsZFxuIiwgIF9fZnVuY19fLCBkc3QtPlNzaWQuc3NpZCwgZHN0LT5NYWNBZGRyZXNzLAotCQkgIGRzdC0+U2lnbmFsU3RyZW5ndGgsIGRzdC0+U2lnbmFsUXVhbGl0eSwgZHN0LT5Sc3NpKTsKLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlX2N1cnJlbnRfbmV0d29yayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJICAgc3RydWN0IHdsYW5fYnNzaWRfZXggKnBuZXR3b3JrKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkgJiYKLQkgICAgaXNfc2FtZV9uZXR3b3JrMjNhKCZwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmssIHBuZXR3b3JrKSkgewotCQl1cGRhdGVfbmV0d29yazIzYSgmcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLAotCQkJCSAgcG5ldHdvcmssIGFkYXB0ZXIsIHRydWUpOwotCi0JCXJ0d191cGRhdGVfcHJvdGVjdGlvbjIzYShhZGFwdGVyLAotCQkJCQkgcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLklFcywKLQkJCQkJIHBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yay5JRUxlbmd0aCk7Ci0JfQotfQotCi0vKgotCi1DYWxsZXIgbXVzdCBob2xkIHBtbG1lcHJpdi0+bG9jayBmaXJzdC4KLQotKi8KLXN0YXRpYyB2b2lkIHJ0d191cGRhdGVfc2Nhbm5lZF9uZXR3b3JrKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJCQkgICAgICAgc3RydWN0IHdsYW5fYnNzaWRfZXggKnRhcmdldCkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwbGlzdCwgKnBoZWFkOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yayA9IE5VTEw7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqb2xkZXN0ID0gTlVMTDsKLQlzdHJ1Y3QgcnR3X3F1ZXVlICpxdWV1ZSA9ICZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWU7Ci0JdTMyIGJzc2lkX2V4X3N6OwotCWludCBmb3VuZCA9IDA7Ci0KLQlzcGluX2xvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKLQlwaGVhZCA9IGdldF9saXN0X2hlYWQocXVldWUpOwotCWxpc3RfZm9yX2VhY2gocGxpc3QsIHBoZWFkKSB7Ci0JCXBuZXR3b3JrID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrLCBsaXN0KTsKLQotCQlpZiAoaXNfc2FtZV9uZXR3b3JrMjNhKCZwbmV0d29yay0+bmV0d29yaywgdGFyZ2V0KSkgewotCQkJZm91bmQgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKCFvbGRlc3QgfHwgdGltZV9hZnRlcihvbGRlc3QtPmxhc3Rfc2Nhbm5lZCwKLQkJCQkJICBwbmV0d29yay0+bGFzdF9zY2FubmVkKSkKLQkJCW9sZGVzdCA9IHBuZXR3b3JrOwotCX0KLQotCS8qIElmIHdlIGRpZG4ndCBmaW5kIGEgbWF0Y2gsIHRoZW4gZ2V0IGEgbmV3IG5ldHdvcmsgc2xvdCB0byBpbml0aWFsaXplCi0JICogd2l0aCB0aGlzIGJlYWNvbidzIGluZm9ybWF0aW9uICovCi0JaWYgKCFmb3VuZCkgewotCQlwbmV0d29yayA9IHJ0d19hbGxvY19uZXR3b3JrKHBtbG1lcHJpdiwgR0ZQX0FUT01JQyk7Ci0JCWlmICghcG5ldHdvcmspIHsKLQkJCWlmICghb2xkZXN0KSB7Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCQkJICJzb21ldGhpbmcgd3JvbmcgaGVyZVxuIik7Ci0JCQkJZ290byBleGl0OwotCQkJfQotCQkJcG5ldHdvcmsgPSBvbGRlc3Q7Ci0JCX0gZWxzZQotCQkJbGlzdF9hZGRfdGFpbCgmcG5ldHdvcmstPmxpc3QsICZxdWV1ZS0+cXVldWUpOwotCi0JCWJzc2lkX2V4X3N6ID0gZ2V0X3dsYW5fYnNzaWRfZXhfc3oodGFyZ2V0KTsKLQkJdGFyZ2V0LT5MZW5ndGggPSBic3NpZF9leF9zejsKLQkJbWVtY3B5KCZwbmV0d29yay0+bmV0d29yaywgdGFyZ2V0LCBic3NpZF9leF9zeik7Ci0KLQkJLyogIHZhcmlhYmxlIGluaXRpYWxpemUgKi8KLQkJcG5ldHdvcmstPmZpeGVkID0gZmFsc2U7Ci0JCXBuZXR3b3JrLT5sYXN0X3NjYW5uZWQgPSBqaWZmaWVzOwotCi0JCXBuZXR3b3JrLT5uZXR3b3JrX3R5cGUgPSAwOwotCQlwbmV0d29yay0+am9pbl9yZXMgPSAwOwotCi0JCS8qIGJzcyBpbmZvIG5vdCByZWNlaXZpbmcgZnJvbSB0aGUgcmlnaHQgY2hhbm5lbCAqLwotCQlpZiAocG5ldHdvcmstPm5ldHdvcmsuU2lnbmFsUXVhbGl0eSA9PSAxMDEpCi0JCQlwbmV0d29yay0+bmV0d29yay5TaWduYWxRdWFsaXR5ID0gMDsKLQl9IGVsc2UgewotCQkvKgotCQkgKiB3ZSBoYXZlIGFuIGVudHJ5IGFuZCB3ZSBhcmUgZ29pbmcgdG8gdXBkYXRlIGl0LiBCdXQKLQkJICogdGhpcyBlbnRyeSBtYXkgYmUgYWxyZWFkeSBleHBpcmVkLiBJbiB0aGlzIGNhc2Ugd2UKLQkJICogZG8gdGhlIHNhbWUgYXMgd2UgZm91bmQgYSBuZXcgbmV0IGFuZCBjYWxsIHRoZQotCQkgKiBuZXdfbmV0IGhhbmRsZXIKLQkJICovCi0JCWJvb2wgdXBkYXRlX2llID0gdHJ1ZTsKLQotCQlwbmV0d29yay0+bGFzdF9zY2FubmVkID0gamlmZmllczsKLQotCQkvKiB0YXJnZXQucmVzZXJ2ZWQgPT0gMSwgbWVhbnMgdGhhdCBzY2FubmVkIG5ldHdvcmsgaXMKLQkJICogYSBiY24gZnJhbWUuICovCi0JCWlmIChwbmV0d29yay0+bmV0d29yay5JRUxlbmd0aCA+IHRhcmdldC0+SUVMZW5ndGggJiYKLQkJICAgIHRhcmdldC0+cmVzZXJ2ZWQgPT0gMSkKLQkJCXVwZGF0ZV9pZSA9IGZhbHNlOwotCi0JCXVwZGF0ZV9uZXR3b3JrMjNhKCZwbmV0d29yay0+bmV0d29yaywgdGFyZ2V0LCBhZGFwdGVyLAotCQkJCSAgdXBkYXRlX2llKTsKLQl9Ci0KLWV4aXQ6Ci0Jc3Bpbl91bmxvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgcnR3X2FkZF9uZXR3b3JrKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJCSAgICBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmspCi17Ci0JdXBkYXRlX2N1cnJlbnRfbmV0d29yayhhZGFwdGVyLCBwbmV0d29yayk7Ci0JcnR3X3VwZGF0ZV9zY2FubmVkX25ldHdvcmsoYWRhcHRlciwgcG5ldHdvcmspOwotfQotCi0vKiBzZWxlY3QgdGhlIGRlc2lyZWQgbmV0d29yayBiYXNlZCBvbiB0aGUgY2FwYWJpbGl0eSBvZiB0aGUgKGkpYnNzLiAqLwotLyogIGNoZWNrIGl0ZW1zOiAoMSkgc2VjdXJpdHkgKi8KLS8qCQkJICAgKDIpIG5ldHdvcmtfdHlwZSAqLwotLyoJCQkgICAoMykgV01NICovCi0vKgkJCSAgICg0KSBIVCAqLwotLyogICAgICAgICAgICAgICAgICAgICAgKDUpIG90aGVycyAqLwotc3RhdGljIGludCBydHdfaXNfZGVzaXJlZF9uZXR3b3JrKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJCQkgIHN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrKQotewotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJmFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7Ci0JdTMyIGRlc2lyZWRfZW5jbW9kZTsKLQl1MzIgcHJpdmFjeTsKLQlpbnQgYnNlbGVjdGVkID0gdHJ1ZTsKLQotCWRlc2lyZWRfZW5jbW9kZSA9IHBzZWN1cml0eXByaXYtPm5kaXNlbmNyeXB0c3RhdHVzOwotCXByaXZhY3kgPSBwbmV0d29yay0+bmV0d29yay5Qcml2YWN5OwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1VOREVSX1dQUykpIHsKLQkJaWYgKGNmZzgwMjExX2ZpbmRfdmVuZG9yX2llKFdMQU5fT1VJX01JQ1JPU09GVCwKLQkJCQkJICAgIFdMQU5fT1VJX1RZUEVfTUlDUk9TT0ZUX1dQQSwKLQkJCQkJICAgIHBuZXR3b3JrLT5uZXR3b3JrLklFcywKLQkJCQkJICAgIHBuZXR3b3JrLT5uZXR3b3JrLklFTGVuZ3RoKSkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCWlmIChhZGFwdGVyLT5yZWdpc3RyeXByaXYud2lmaV9zcGVjID09IDEpIHsKLQkJLyogZm9yICBjb3JyZWN0IGZsb3cgb2YgODAyMVggIHRvIGRvLi4uLiAqLwotCQlpZiAoZGVzaXJlZF9lbmNtb2RlID09IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQgJiYKLQkJICAgIHByaXZhY3kgIT0gMCkKLQkJCWJzZWxlY3RlZCA9IGZhbHNlOwotCX0KLQotCWlmIChkZXNpcmVkX2VuY21vZGUgIT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCAmJiBwcml2YWN5ID09IDApIHsKLQkJREJHXzg3MjNBKCJkZXNpcmVkX2VuY21vZGU6ICVkLCBwcml2YWN5OiAlZFxuIiwKLQkJCSAgZGVzaXJlZF9lbmNtb2RlLCBwcml2YWN5KTsKLQkJYnNlbGVjdGVkID0gZmFsc2U7Ci0JfQotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX1NUQVRFKSkgewotCQlpZiAocG5ldHdvcmstPm5ldHdvcmsuaWZtb2RlICE9Ci0JCSAgICBwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmsuaWZtb2RlKQotCQkJYnNlbGVjdGVkID0gZmFsc2U7Ci0JfQotCi0JcmV0dXJuIGJzZWxlY3RlZDsKLX0KLQotdm9pZCBydHdfc3VydmV5X2V2ZW50X2NiMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0JdTMyIGxlbjsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcms7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBzdXJ2ZXlfZXZlbnQgKnN1cnZleSA9IChzdHJ1Y3Qgc3VydmV5X2V2ZW50ICopcGJ1ZjsKLQotCXBuZXR3b3JrID0gc3VydmV5LT5ic3M7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJICJydHdfc3VydmV5X2V2ZW50X2NiMjNhLCBzc2lkPSVzXG4iLCBwbmV0d29yay0+U3NpZC5zc2lkKTsKLQotCWxlbiA9IGdldF93bGFuX2Jzc2lkX2V4X3N6KHBuZXR3b3JrKTsKLQlpZiAobGVuID4gKHNpemVvZihzdHJ1Y3Qgd2xhbl9ic3NpZF9leCkpKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIioqKipydHdfc3VydmV5X2V2ZW50X2NiMjNhOiByZXR1cm4gYSB3cm9uZyBic3MgKioqXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLQotCS8qICB1cGRhdGUgSUJTU19uZXR3b3JrICdzIHRpbWVzdGFtcCAqLwotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpKSB7Ci0JCWlmIChldGhlcl9hZGRyX2VxdWFsKHBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yay5NYWNBZGRyZXNzLAotCQkJCSAgICAgcG5ldHdvcmstPk1hY0FkZHJlc3MpKSB7Ci0JCQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICppYnNzX3dsYW47Ci0KLQkJCXBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yay5iZWFjb25faW50ZXJ2YWwgPQotCQkJCXBuZXR3b3JrLT5iZWFjb25faW50ZXJ2YWw7Ci0JCQlwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmsuY2FwYWJpbGl0eSA9Ci0JCQkJcG5ldHdvcmstPmNhcGFiaWxpdHk7Ci0JCQlwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmsudHNmID0gcG5ldHdvcmstPnRzZjsKLQkJCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwotCQkJaWJzc193bGFuID0gcnR3X2ZpbmRfbmV0d29yazIzYSgKLQkJCQkmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLAotCQkJCXBuZXR3b3JrLT5NYWNBZGRyZXNzKTsKLQkJCWlmIChpYnNzX3dsYW4pIHsKLQkJCQlwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmsuYmVhY29uX2ludGVydmFsID0KLQkJCQkJaWJzc193bGFuLT5uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbDsKLQkJCQlwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmsuY2FwYWJpbGl0eSA9Ci0JCQkJCWlic3Nfd2xhbi0+bmV0d29yay5jYXBhYmlsaXR5OwotCQkJCXBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yay50c2YgPQotCQkJCQlpYnNzX3dsYW4tPm5ldHdvcmsudHNmOwotCQkJCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7Ci0JCQkJZ290byBleGl0OwotCQkJfQotCQkJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKLQkJfQotCX0KLQotCS8qICBsb2NrIHBtbG1lcHJpdi0+bG9jayB3aGVuIHlvdSBhY2Nlc3NpbmcgbmV0d29ya19xICovCi0JaWYgKCFjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpKSB7Ci0JCWlmIChwbmV0d29yay0+U3NpZC5zc2lkWzBdID09IDApCi0JCQlwbmV0d29yay0+U3NpZC5zc2lkX2xlbiA9IDA7Ci0KLQkJcnR3X2FkZF9uZXR3b3JrKGFkYXB0ZXIsIHBuZXR3b3JrKTsKLQl9Ci0KLWV4aXQ6Ci0KLQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLQotCWtmcmVlKHN1cnZleS0+YnNzKTsKLQlzdXJ2ZXktPmJzcyA9IE5VTEw7Ci19Ci0KLXZvaWQKLXJ0d19zdXJ2ZXlkb25lX2V2ZW50X2NhbGxiYWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlpbnQgcmV0OwotCi0Jc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCi0JaWYgKHBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZSkgewotCQlwbWxtZXByaXYtPndwc19wcm9iZV9yZXFfaWVfbGVuID0gMDsKLQkJa2ZyZWUocG1sbWVwcml2LT53cHNfcHJvYmVfcmVxX2llKTsKLQkJcG1sbWVwcml2LT53cHNfcHJvYmVfcmVxX2llID0gTlVMTDsKLQl9Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJICJydHdfc3VydmV5ZG9uZV9ldmVudF9jYWxsYmFjazIzYTogZndfc3RhdGU6JXhcbiIsCi0JCSBnZXRfZndzdGF0ZShwbWxtZXByaXYpKTsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSkpIHsKLQkJZGVsX3RpbWVyX3N5bmMoJnBtbG1lcHJpdi0+c2Nhbl90b190aW1lcik7Ci0KLQkJX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIF9GV19VTkRFUl9TVVJWRVkpOwotCX0gZWxzZSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIm5pYyBzdGF0dXMgPSV4LCBzdXJ2ZXkgZG9uZSBldmVudCBjb21lcyB0b28gbGF0ZSFcbiIsCi0JCQkgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSk7Ci0JfQotCi0JcnR3X3NldF9zaWduYWxfc3RhdF90aW1lcigmYWRhcHRlci0+cmVjdnByaXYpOwotCi0JaWYgKHBtbG1lcHJpdi0+dG9fam9pbiA9PSB0cnVlKSB7Ci0JCXNldF9md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpOwotCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfU1RBVEUpKSB7Ci0JCQlyZXQgPSBydHdfc2VsZWN0X2FuZF9qb2luX2Zyb21fc2Nhbm5lZF9xdWV1ZTIzYSgKLQkJCQlwbWxtZXByaXYpOwotCQkJaWYgKHJldCAhPSBfU1VDQ0VTUykKLQkJCQlydHdfZG9fam9pbl9hZGhvYyhhZGFwdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBtbG1lcHJpdi0+dG9fam9pbiA9IGZhbHNlOwotCQkJcmV0ID0gcnR3X3NlbGVjdF9hbmRfam9pbl9mcm9tX3NjYW5uZWRfcXVldWUyM2EoCi0JCQkJcG1sbWVwcml2KTsKLQkJCWlmIChyZXQgIT0gX1NVQ0NFU1MpIHsKLQkJCQlEQkdfODcyM0EoInRyeV90b19qb2luLCBidXQgc2VsZWN0IHNjYW5uaW5nICIKLQkJCQkJICAicXVldWUgZmFpbCwgdG9fcm9hbWluZzolZFxuIiwKLQkJCQkJICBhZGFwdGVyLT5tbG1lcHJpdi50b19yb2FtaW5nKTsKLQkJCQlpZiAoYWRhcHRlci0+bWxtZXByaXYudG9fcm9hbWluZykgewotCQkJCQlpZiAoLS1wbWxtZXByaXYtPnRvX3JvYW1pbmcgPT0gMCB8fAotCQkJCQkgICAgcnR3X3NpdGVzdXJ2ZXlfY21kMjNhKAotCQkJCQkJICAgIGFkYXB0ZXIsCi0JCQkJCQkgICAgJnBtbG1lcHJpdi0+YXNzb2Nfc3NpZCwgMSwKLQkJCQkJCSAgICBOVUxMLCAwKSAhPSBfU1VDQ0VTUykgewotCQkJCQkJcnR3X3NldF9yb2FtaW5nKGFkYXB0ZXIsIDApOwotCQkJCQkJcnR3X2ZyZWVfYXNzb2NfcmVzb3VyY2VzMjNhKAotCQkJCQkJCWFkYXB0ZXIsIDEpOwotCQkJCQkJcnR3X2luZGljYXRlX2Rpc2Nvbm5lY3QyM2EoCi0JCQkJCQkJYWRhcHRlcik7Ci0JCQkJCX0gZWxzZQotCQkJCQkJcG1sbWVwcml2LT50b19qb2luID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKTsKLQkJCX0KLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCi0JcnR3X29zX3htaXRfc2NoZWR1bGUyM2EoYWRhcHRlcik7Ci0KLQlpZiAocG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLmJzc19jbnQgPT0gMCkKLQkJcnR3X3NyZXNldF9yZXNldChhZGFwdGVyKTsKLQotCXJ0d19jZmc4MDIxMV9zdXJ2ZXlkb25lX2V2ZW50X2NhbGxiYWNrKGFkYXB0ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBmcmVlX3NjYW5xdWV1ZShzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYpCi17Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmssICpwdGVtcDsKLQlzdHJ1Y3QgcnR3X3F1ZXVlICpzY2FuX3F1ZXVlID0gJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X25vdGljZV8sICIrZnJlZV9zY2FucXVldWVcbiIpOwotCXNwaW5fbG9ja19iaCgmc2Nhbl9xdWV1ZS0+bG9jayk7Ci0JcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHNjYW5fcXVldWUpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwbmV0d29yaywgcHRlbXAsIHBoZWFkLCBsaXN0KSB7Ci0JCXBuZXR3b3JrLT5maXhlZCA9IGZhbHNlOwotCQlfcnR3X2ZyZWVfbmV0d29yazIzYShwbWxtZXByaXYsIHBuZXR3b3JrKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnNjYW5fcXVldWUtPmxvY2spOwotfQotCi0vKgotICpydHdfZnJlZV9hc3NvY19yZXNvdXJjZXMyM2E6IHRoZSBjYWxsZXIgaGFzIHRvIGxvY2sgcG1sbWVwcml2LT5sb2NrCi0gKi8KLXZvaWQgcnR3X2ZyZWVfYXNzb2NfcmVzb3VyY2VzMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJCQkgaW50IGxvY2tfc2Nhbm5lZF9xdWV1ZSkKLXsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwd2xhbjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCB3bGFuX25ldHdvcmsgKnRndF9uZXR3b3JrID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcms7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfbm90aWNlXywKLQkJICIrcnR3X2ZyZWVfYXNzb2NfcmVzb3VyY2VzMjNhXG4iKTsKLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJICJ0Z3RfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzPSVwTSBzc2lkPSVzXG4iLAotCQkgdGd0X25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcywKLQkJIHRndF9uZXR3b3JrLT5uZXR3b3JrLlNzaWQuc3NpZCk7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURXxXSUZJX0FQX1NUQVRFKSkgewotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKCZhZGFwdGVyLT5zdGFwcml2LAotCQkJCQkgIHRndF9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpOwotCi0JCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotCQlydHdfZnJlZV9zdGFpbmZvMjNhKGFkYXB0ZXIsICBwc3RhKTsKLQkJc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLQl9Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfU1RBVEUgfAotCQkJICBXSUZJX0FESE9DX01BU1RFUl9TVEFURXxXSUZJX0FQX1NUQVRFKSkgewotCQlydHdfZnJlZV9hbGxfc3RhaW5mbzIzYShhZGFwdGVyKTsKLQotCQlwc3RhID0gcnR3X2dldF9iY21jX3N0YWluZm8yM2EoYWRhcHRlcik7Ci0JCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotCQlydHdfZnJlZV9zdGFpbmZvMjNhKGFkYXB0ZXIsIHBzdGEpOwotCQlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotCi0JCXJ0d19pbml0X2JjbWNfc3RhaW5mbzIzYShhZGFwdGVyKTsKLQl9Ci0KLQlpZiAobG9ja19zY2FubmVkX3F1ZXVlKQotCQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKLQotCXB3bGFuID0gcnR3X2ZpbmRfbmV0d29yazIzYSgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLAotCQkJCSAgICB0Z3RfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzKTsKLQlpZiAocHdsYW4pCi0JCXB3bGFuLT5maXhlZCA9IGZhbHNlOwotCWVsc2UKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCSAicnR3X2ZyZWVfYXNzb2NfcmVzb3VyY2VzMjNhIDogcHdsYW49PSBOVUxMXG4iKTsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpICYmCi0JICAgIGFkYXB0ZXItPnN0YXByaXYuYXNvY19zdGFfY291bnQgPT0gMSkKLQkJcnR3X2ZyZWVfbmV0d29ya19ub2xvY2socG1sbWVwcml2LCBwd2xhbik7Ci0KLQlpZiAobG9ja19zY2FubmVkX3F1ZXVlKQotCQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwotCi0JcG1sbWVwcml2LT5rZXlfbWFzayA9IDA7Ci19Ci0KLS8qCi0qcnR3X2luZGljYXRlX2Nvbm5lY3QyM2E6IHRoZSBjYWxsZXIgaGFzIHRvIGxvY2sgcG1sbWVwcml2LT5sb2NrCi0qLwotdm9pZCBydHdfaW5kaWNhdGVfY29ubmVjdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkgIitydHdfaW5kaWNhdGVfY29ubmVjdDIzYVxuIik7Ci0KLQlwbWxtZXByaXYtPnRvX2pvaW4gPSBmYWxzZTsKLQotCWlmICghY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBfRldfTElOS0VEKSkgewotCQlzZXRfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpOwotCi0JCXJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9jb25uZWN0KHBhZGFwdGVyKTsKLQotCQluZXRpZl9jYXJyaWVyX29uKHBhZGFwdGVyLT5wbmV0ZGV2KTsKLQotCQlpZiAocGFkYXB0ZXItPnBpZFsyXSAhPSAwKQotCQkJa2lsbF9waWQoZmluZF92cGlkKHBhZGFwdGVyLT5waWRbMl0pLCBTSUdBTFJNLCAxKTsKLQl9Ci0KLQlydHdfc2V0X3JvYW1pbmcocGFkYXB0ZXIsIDApOwotCi0JcnR3X3NldF9zY2FuX2RlbnkocGFkYXB0ZXIsIDMwMDApOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJICItcnR3X2luZGljYXRlX2Nvbm5lY3QyM2E6IGZ3X3N0YXRlPTB4JTA4eFxuIiwKLQkJIGdldF9md3N0YXRlKHBtbG1lcHJpdikpOwotfQotCi0vKgotICpydHdfaW5kaWNhdGVfZGlzY29ubmVjdDIzYTogdGhlIGNhbGxlciBoYXMgdG8gbG9jayBwbWxtZXByaXYtPmxvY2sKLSAqLwotdm9pZCBydHdfaW5kaWNhdGVfZGlzY29ubmVjdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkgIitydHdfaW5kaWNhdGVfZGlzY29ubmVjdDIzYVxuIik7Ci0KLQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkd8V0lGSV9VTkRFUl9XUFMpOwotCi0JLyogREJHXzg3MjNBKCJjbGVhciB3cHMgd2hlbiAlc1xuIiwgX19mdW5jX18pOyAqLwotCi0JaWYgKHBhZGFwdGVyLT5tbG1lcHJpdi50b19yb2FtaW5nID4gMCkKLQkJX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIF9GV19MSU5LRUQpOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgX0ZXX0xJTktFRCkgfHwKLQkgICAgcGFkYXB0ZXItPm1sbWVwcml2LnRvX3JvYW1pbmcgPD0gMCkgewotCQlydHdfb3NfaW5kaWNhdGVfZGlzY29ubmVjdDIzYShwYWRhcHRlcik7Ci0KLQkJLyogc2V0IGlwc19kZW55X3RpbWUgdG8gYXZvaWQgZW50ZXIgSVBTIGJlZm9yZSBMUFMgbGVhdmUgKi8KLQkJcGFkYXB0ZXItPnB3cmN0cmxwcml2Lmlwc19kZW55X3RpbWUgPQotCQkJamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMzAwMCk7Ci0KLQkJX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIF9GV19MSU5LRUQpOwotCi0JCXJ0d19jbGVhcl9zY2FuX2RlbnkocGFkYXB0ZXIpOwotCX0KLQotCXJ0d19scHNfY3RybF93a19jbWQyM2EocGFkYXB0ZXIsIExQU19DVFJMX0RJU0NPTk5FQ1QsIDEpOwotfQotCi12b2lkIHJ0d19zY2FuX2Fib3J0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcikKLXsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0KLQlzdGFydCA9IGppZmZpZXM7Ci0JcG1sbWVleHQtPnNjYW5fYWJvcnQgPSB0cnVlOwotCXdoaWxlIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSkgJiYKLQkgICAgICAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gc3RhcnQpIDw9IDIwMCkgewotCQlpZiAoYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwgYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkKLQkJCWJyZWFrOwotCi0JCURCR184NzIzQSgiJXMoJXMpOiBmd19zdGF0ZSA9IF9GV19VTkRFUl9TVVJWRVkhXG4iLAotCQkJICBfX2Z1bmNfXywgYWRhcHRlci0+cG5ldGRldi0+bmFtZSk7Ci0JCW1zbGVlcCgyMCk7Ci0JfQotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKSkgewotCQlpZiAoIWFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkICYmICFhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKQotCQkJREJHXzg3MjNBKCIlcyglcyk6IHdhaXRpbmcgZm9yIHNjYW5fYWJvcnQgdGltZSBvdXQhXG4iLAotCQkJCSAgX19mdW5jX18sIGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUpOwotCQlydHdfY2ZnODAyMTFfaW5kaWNhdGVfc2Nhbl9kb25lKHdkZXZfdG9fcHJpdihhZGFwdGVyLT5ydHdfd2RldiksCi0JCQkJCQl0cnVlKTsKLQl9Ci0JcG1sbWVleHQtPnNjYW5fYWJvcnQgPSBmYWxzZTsKLX0KLQotc3RhdGljIHN0cnVjdCBzdGFfaW5mbyAqCi1ydHdfam9pbmJzc191cGRhdGVfc3RhaW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmspCi17Ci0JaW50IGk7Ci0Jc3RydWN0IHN0YV9pbmZvICpibWNfc3RhLCAqcHN0YTsKLQlzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmw7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQotCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIHBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpOwotCWlmICghcHN0YSkKLQkJcHN0YSA9IHJ0d19hbGxvY19zdGFpbmZvMjNhKHBzdGFwcml2LAotCQkJCQkgICAgcG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcywKLQkJCQkJICAgIEdGUF9BVE9NSUMpOwotCi0JaWYgKHBzdGEpIHsgLyogdXBkYXRlIHB0YXJnZXRfc3RhICovCi0JCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCQlwc3RhLT5haWQgID0gcG5ldHdvcmstPmpvaW5fcmVzOwotCQlwc3RhLT5tYWNfaWQgPSAwOwotCi0JCS8qIHN0YSBtb2RlICovCi0JCXJ0bDg3MjNhX1NldEhhbE9ETVZhcihwYWRhcHRlciwgSEFMX09ETV9TVEFfSU5GTywgcHN0YSwgdHJ1ZSk7Ci0KLQkJLyogc2VjdXJpdHkgcmVsYXRlZCAqLwotCQlpZiAocGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMUF1dGhBbGdydGhtID09Ci0JCSAgICBkb3QxMUF1dGhBbGdydGhtXzgwMjFYKSB7Ci0JCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmJpbnN0YWxsR3Jwa2V5ID0gMDsKLQkJCXBhZGFwdGVyLT5zZWN1cml0eXByaXYuYnVzZXRraXBrZXkgPSAwOwotCi0JCQlwc3RhLT5pZWVlODAyMXhfYmxvY2tlZCA9IHRydWU7Ci0JCQlwc3RhLT5kb3QxMTgwMjFYUHJpdmFjeSA9Ci0JCQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lBbGdydGhtOwotCi0JCQltZW1zZXQoJnBzdGEtPmRvdDExODAyMXhfVW5jc3RLZXksIDAsCi0JCQkgICAgICAgc2l6ZW9mICh1bmlvbiBLZXl0eXBlKSk7Ci0KLQkJCW1lbXNldCgmcHN0YS0+ZG90MTF0a2lwcnhtaWNrZXksIDAsCi0JCQkgICAgICAgc2l6ZW9mICh1bmlvbiBLZXl0eXBlKSk7Ci0JCQltZW1zZXQoJnBzdGEtPmRvdDExdGtpcHR4bWlja2V5LCAwLAotCQkJICAgICAgIHNpemVvZiAodW5pb24gS2V5dHlwZSkpOwotCi0JCQltZW1zZXQoJnBzdGEtPmRvdDExdHhwbiwgMCwgc2l6ZW9mICh1bmlvbiBwbjQ4KSk7Ci0JCQltZW1zZXQoJnBzdGEtPmRvdDExcnhwbiwgMCwgc2l6ZW9mICh1bmlvbiBwbjQ4KSk7Ci0JCX0KLQotCQkvKglDb21tZW50ZWQgYnkgQWxiZXJ0IDIwMTIvMDcvMjEgKi8KLQkJLyoJV2hlbiBkb2luZyB0aGUgV1BTLCB0aGUgd3BzX2llX2xlbiB3b24ndCBlcXVhbCB0byAwICovCi0JCS8qCUFuZCB0aGUgV2ktRmkgZHJpdmVyIHNob3VsZG4ndCBhbGxvdyB0aGUgZGF0YSBwYWNrZXQKLQkJCXRvIGJlIHRyYW5zbWl0dGVkLiAqLwotCQlpZiAocGFkYXB0ZXItPnNlY3VyaXR5cHJpdi53cHNfaWVfbGVuICE9IDApIHsKLQkJCXBzdGEtPmllZWU4MDIxeF9ibG9ja2VkID0gdHJ1ZTsKLQkJCXBhZGFwdGVyLT5zZWN1cml0eXByaXYud3BzX2llX2xlbiA9IDA7Ci0JCX0KLQotCQkvKiBmb3IgQS1NUERVIFJ4IHJlb3JkZXJpbmcgYnVmZmVyIGNvbnRyb2wgZm9yIGJtY19zdGEgJgotCQkgKiBzdGFfaW5mbyAqLwotCQkvKiBpZiBBLU1QRFUgUnggaXMgZW5hYmxlZCwgcmVzZXR0aW5nCi0JCSAgIHJ4X29yZGVyaW5nX2N0cmwgd3N0YXJ0X2IoaW5kaWNhdGVfc2VxKSB0byBkZWZhdWx0Ci0JCSAgIHZhbHVlID0gMHhmZmZmICovCi0JCS8qIHRvZG86IGNoZWNrIGlmIEFQIGNhbiBzZW5kIEEtTVBEVSBwYWNrZXRzICovCi0JCWZvciAoaSA9IDA7IGkgPCAxNiA7IGkrKykgewotCQkJLyogcHJlb3JkZXJfY3RybCA9ICZwcmVjdnByaXYtPnJlY3ZyZW9yZGVyX2N0cmxbaV07ICovCi0JCQlwcmVvcmRlcl9jdHJsID0gJnBzdGEtPnJlY3ZyZW9yZGVyX2N0cmxbaV07Ci0JCQlwcmVvcmRlcl9jdHJsLT5lbmFibGUgPSBmYWxzZTsKLQkJCXByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSA9IDB4ZmZmZjsKLQkJCXByZW9yZGVyX2N0cmwtPndlbmRfYiA9IDB4ZmZmZjsKLQkJCS8qIG1heF9hbXBkdV9zejsgZXguIDMyKGtieXRlcykgLT4gd3NpemVfYiA9IDMyICovCi0JCQlwcmVvcmRlcl9jdHJsLT53c2l6ZV9iID0gNjQ7Ci0JCX0KLQotCQlibWNfc3RhID0gcnR3X2dldF9iY21jX3N0YWluZm8yM2EocGFkYXB0ZXIpOwotCQlpZiAoYm1jX3N0YSkgewotCQkJZm9yIChpID0gMDsgaSA8IDE2IDsgaSsrKSB7Ci0JCQkJcHJlb3JkZXJfY3RybCA9ICZibWNfc3RhLT5yZWN2cmVvcmRlcl9jdHJsW2ldOwotCQkJCXByZW9yZGVyX2N0cmwtPmVuYWJsZSA9IGZhbHNlOwotCQkJCXByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSA9IDB4ZmZmZjsKLQkJCQlwcmVvcmRlcl9jdHJsLT53ZW5kX2IgPSAweGZmZmY7Ci0JCQkJLyogbWF4X2FtcGR1X3N6OyBleC4gMzIoa2J5dGVzKSAtPgotCQkJCSAgIHdzaXplX2IgPSAzMiAqLwotCQkJCXByZW9yZGVyX2N0cmwtPndzaXplX2IgPSA2NDsKLQkJCX0KLQkJfQotCi0JCS8qIG1pc2MuICovCi0JCXVwZGF0ZV9zdGFfaW5mbzIzYShwYWRhcHRlciwgcHN0YSk7Ci0KLQl9Ci0KLQlyZXR1cm4gcHN0YTsKLX0KLQotLyogcG5ldHdvcmsgOiByZXR1cm5zIGZyb20gcnR3MjNhX2pvaW5ic3NfZXZlbnRfY2IgKi8KLS8qIHB0YXJnZXRfd2xhbjogZm91bmQgZnJvbSBzY2FubmVkX3F1ZXVlICovCi1zdGF0aWMgdm9pZAotcnR3X2pvaW5ic3NfdXBkYXRlX25ldHdvcmsyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgIHN0cnVjdCB3bGFuX25ldHdvcmsgKnB0YXJnZXRfd2xhbiwKLQkJCSAgICAgIHN0cnVjdCB3bGFuX25ldHdvcmsgICpwbmV0d29yaykKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCB3bGFuX25ldHdvcmsgKmN1cl9uZXR3b3JrID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcms7Ci0KLQlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJICJmd19zdGF0ZToleCwgQlNTSUQ6JXBNXG4iLAotCQkgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSwKLQkJIHBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpOwotCi0JLyogIHdoeSBub3QgdXNlIHB0YXJnZXRfd2xhbj8/ICovCi0JbWVtY3B5KCZjdXJfbmV0d29yay0+bmV0d29yaywgJnBuZXR3b3JrLT5uZXR3b3JrLAotCSAgICAgICBwbmV0d29yay0+bmV0d29yay5MZW5ndGgpOwotCS8qICBzb21lIElFcyBpbiBwbmV0d29yayBpcyB3cm9uZywgc28gd2Ugc2hvdWxkIHVzZSBwdGFyZ2V0X3dsYW4gSUVzICovCi0JY3VyX25ldHdvcmstPm5ldHdvcmsuSUVMZW5ndGggPSBwdGFyZ2V0X3dsYW4tPm5ldHdvcmsuSUVMZW5ndGg7Ci0JbWVtY3B5KCZjdXJfbmV0d29yay0+bmV0d29yay5JRXNbMF0sICZwdGFyZ2V0X3dsYW4tPm5ldHdvcmsuSUVzWzBdLAotCSAgICAgICBNQVhfSUVfU1opOwotCi0JY3VyX25ldHdvcmstPm5ldHdvcmsuY2FwYWJpbGl0eSA9IHB0YXJnZXRfd2xhbi0+bmV0d29yay5jYXBhYmlsaXR5OwotCWN1cl9uZXR3b3JrLT5uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCA9Ci0JCXB0YXJnZXRfd2xhbi0+bmV0d29yay5iZWFjb25faW50ZXJ2YWw7Ci0JY3VyX25ldHdvcmstPm5ldHdvcmsudHNmID0gcHRhcmdldF93bGFuLT5uZXR3b3JrLnRzZjsKLQotCXJ0d19zZXRfc2lnbmFsX3N0YXRfdGltZXIoJnBhZGFwdGVyLT5yZWN2cHJpdik7Ci0JcGFkYXB0ZXItPnJlY3Zwcml2LnNpZ25hbF9zdHJlbmd0aCA9Ci0JCXB0YXJnZXRfd2xhbi0+bmV0d29yay5TaWduYWxTdHJlbmd0aDsKLQlwYWRhcHRlci0+cmVjdnByaXYuc2lnbmFsX3F1YWwgPSBwdGFyZ2V0X3dsYW4tPm5ldHdvcmsuU2lnbmFsUXVhbGl0eTsKLQkvKgotCSAqIHRoZSBwdGFyZ2V0X3dsYW4tPm5ldHdvcmsuUnNzaSBpcyByYXcgZGF0YSwgd2UgdXNlCi0JICogcHRhcmdldF93bGFuLT5uZXR3b3JrLlNpZ25hbFN0cmVuZ3RoIGluc3RlYWQgKGhhcyBzY2FsZWQpCi0JICovCi0JREJHXzg3MjNBKCIlcyBzaWduYWxfc3RyZW5ndGg6JTN1LCBzaWduYWxfcXVhbDolM3VcbiIsCi0JCSAgX19mdW5jX18sIHBhZGFwdGVyLT5yZWN2cHJpdi5zaWduYWxfc3RyZW5ndGgsCi0JCSAgcGFkYXB0ZXItPnJlY3Zwcml2LnNpZ25hbF9xdWFsKTsKLQlydHdfc2V0X3NpZ25hbF9zdGF0X3RpbWVyKCZwYWRhcHRlci0+cmVjdnByaXYpOwotCi0JLyogdXBkYXRlIGZ3X3N0YXRlIHdpbGwgY2xyIF9GV19VTkRFUl9MSU5LSU5HIGhlcmUgaW5kaXJlY3RseSAqLwotCXN3aXRjaCAocG5ldHdvcmstPm5ldHdvcmsuaWZtb2RlKSB7Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UOgotCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKLQkJaWYgKHBtbG1lcHJpdi0+Zndfc3RhdGUgJiBXSUZJX1VOREVSX1dQUykKLQkJCXBtbG1lcHJpdi0+Zndfc3RhdGUgPSBXSUZJX1NUQVRJT05fU1RBVEV8V0lGSV9VTkRFUl9XUFM7Ci0JCWVsc2UKLQkJCXBtbG1lcHJpdi0+Zndfc3RhdGUgPSBXSUZJX1NUQVRJT05fU1RBVEU7Ci0JCWJyZWFrOwotCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6Ci0JCXBtbG1lcHJpdi0+Zndfc3RhdGUgPSBXSUZJX0FESE9DX1NUQVRFOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwbWxtZXByaXYtPmZ3X3N0YXRlID0gV0lGSV9OVUxMX1NUQVRFOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICJJbnZhbGlkIG5ldHdvcmtfbW9kZVxuIik7Ci0JCWJyZWFrOwotCX0KLQotCXJ0d191cGRhdGVfcHJvdGVjdGlvbjIzYShwYWRhcHRlciwgY3VyX25ldHdvcmstPm5ldHdvcmsuSUVzLAotCQkJCSBjdXJfbmV0d29yay0+bmV0d29yay5JRUxlbmd0aCk7Ci0KLQlydHdfdXBkYXRlX2h0X2NhcDIzYShwYWRhcHRlciwgY3VyX25ldHdvcmstPm5ldHdvcmsuSUVzLAotCQkJICAgICBjdXJfbmV0d29yay0+bmV0d29yay5JRUxlbmd0aCk7Ci19Ci0KLS8qCi0gKiBOb3RlczoKLSAqIHRoZSBmdW5jdGlvbiBjb3VsZCBiZSA+IHBhc3NpdmVfbGV2ZWwgKHRoZSBzYW1lIGNvbnRleHQgYXMgUnggdGFza2xldCkKLSAqIHBuZXR3b3JrIDogcmV0dXJucyBmcm9tIHJ0dzIzYV9qb2luYnNzX2V2ZW50X2NiCi0gKiBwdGFyZ2V0X3dsYW46IGZvdW5kIGZyb20gc2Nhbm5lZF9xdWV1ZQotICogaWYgam9pbl9yZXMgPiAwLCBmb3IgKGZ3X3N0YXRlPT1XSUZJX1NUQVRJT05fU1RBVEUpLAotICogd2UgY2hlY2sgaWYgICJwdGFyZ2V0X3N0YSIgJiAicHRhcmdldF93bGFuIiBleGlzdC4KLSAqIGlmIGpvaW5fcmVzID4gMCwgZm9yIChmd19zdGF0ZT09V0lGSV9BREhPQ19TVEFURSksCi0gKiB3ZSBvbmx5IGNoZWNrIGlmICJwdGFyZ2V0X3dsYW4iIGV4aXN0LgotICogaWYgam9pbl9yZXMgPiAwLCB1cGRhdGUgImN1cl9uZXR3b3JrLT5uZXR3b3JrIiBmcm9tICJwbmV0d29yay0+bmV0d29yayIKLSAqIGlmIChwdGFyZ2V0X3dsYW4gIT1OVUxMKS4KLSAqLwotCi12b2lkIHJ0d19qb2luYnNzX2V2ZW50X3ByZWhhbmRsZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICpwYnVmKQotewotCXN0cnVjdCBzdGFfaW5mbyAqcHRhcmdldF9zdGEsICpwY3VyX3N0YTsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJmFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrID0gKHN0cnVjdCB3bGFuX25ldHdvcmsgKilwYnVmOwotCXN0cnVjdCB3bGFuX25ldHdvcmsgKmN1cl9uZXR3b3JrID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcms7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqcGN1cl93bGFuLCAqcHRhcmdldF93bGFuID0gTlVMTDsKLQlib29sIHRoZV9zYW1lX21hY2FkZHI7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJICJqb2luYnNzIGV2ZW50IGNhbGwgYmFjayByZWNlaXZlZCB3aXRoIHJlcz0lZFxuIiwKLQkJIHBuZXR3b3JrLT5qb2luX3Jlcyk7Ci0KLQlpZiAocG1sbWVwcml2LT5hc3NvY19zc2lkLnNzaWRfbGVuID09IDApIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCSAiQEBAQEAgICBqb2luYnNzIGV2ZW50IGNhbGwgYmFjayAgZm9yIEFueSBTU2lkXG4iKTsKLQl9IGVsc2UgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICJAQEBAQCAgIHJ0dzIzYV9qb2luYnNzX2V2ZW50X2NiIGZvciBTU2lkOiVzXG4iLAotCQkJIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkKTsKLQl9Ci0KLQlpZiAoZXRoZXJfYWRkcl9lcXVhbChwbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLAotCQkJICAgICBjdXJfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzKSkKLQkJdGhlX3NhbWVfbWFjYWRkciA9IHRydWU7Ci0JZWxzZQotCQl0aGVfc2FtZV9tYWNhZGRyID0gZmFsc2U7Ci0KLQlwbmV0d29yay0+bmV0d29yay5MZW5ndGggPSBnZXRfd2xhbl9ic3NpZF9leF9zeigmcG5ldHdvcmstPm5ldHdvcmspOwotCWlmIChwbmV0d29yay0+bmV0d29yay5MZW5ndGggPiBzaXplb2Yoc3RydWN0IHdsYW5fYnNzaWRfZXgpKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIioqKmpvaW5ic3NfZXZ0X2NhbGxiYWNrIHJldHVybiBhIHdyb25nIGJzcyAqKipcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0Jc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCSAicnR3MjNhX2pvaW5ic3NfZXZlbnRfY2IgISEgX2VudGVyX2NyaXRpY2FsXG4iKTsKLQotCWlmIChwbmV0d29yay0+am9pbl9yZXMgPiAwKSB7Ci0JCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwotCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKSkgewotCQkJLyogczEuIGZpbmQgcHRhcmdldF93bGFuICovCi0JCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKSB7Ci0JCQkJaWYgKHRoZV9zYW1lX21hY2FkZHIpIHsKLQkJCQkJcHRhcmdldF93bGFuID0gcnR3X2ZpbmRfbmV0d29yazIzYSgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLCBjdXJfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzKTsKLQkJCQl9IGVsc2UgewotCQkJCQlwY3VyX3dsYW4gPSBydHdfZmluZF9uZXR3b3JrMjNhKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUsIGN1cl9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpOwotCQkJCQlpZiAocGN1cl93bGFuKQotCQkJCQkJcGN1cl93bGFuLT5maXhlZCA9IGZhbHNlOwotCi0JCQkJCXBjdXJfc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBjdXJfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzKTsKLQkJCQkJaWYgKHBjdXJfc3RhKSB7Ci0JCQkJCQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLQkJCQkJCXJ0d19mcmVlX3N0YWluZm8yM2EoYWRhcHRlciwKLQkJCQkJCQkJICAgIHBjdXJfc3RhKTsKLQkJCQkJCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0JCQkJCX0KLQotCQkJCQlwdGFyZ2V0X3dsYW4gPSBydHdfZmluZF9uZXR3b3JrMjNhKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUsIHBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpOwotCQkJCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsCi0JCQkJCQkJICBXSUZJX1NUQVRJT05fU1RBVEUpKSB7Ci0JCQkJCQlpZiAocHRhcmdldF93bGFuKQotCQkJCQkJCXB0YXJnZXRfd2xhbi0+Zml4ZWQgPQotCQkJCQkJCQl0cnVlOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9IGVsc2UgewotCQkJCXB0YXJnZXRfd2xhbiA9IHJ0d19maW5kX25ldHdvcmsyM2EoCi0JCQkJCSZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUsCi0JCQkJCXBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpOwotCQkJCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwKLQkJCQkJCSAgV0lGSV9TVEFUSU9OX1NUQVRFKSkgewotCQkJCQlpZiAocHRhcmdldF93bGFuKQotCQkJCQkJcHRhcmdldF93bGFuLT5maXhlZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQkvKiBzMi4gdXBkYXRlIGN1cl9uZXR3b3JrICovCi0JCQlpZiAocHRhcmdldF93bGFuKQotCQkJCXJ0d19qb2luYnNzX3VwZGF0ZV9uZXR3b3JrMjNhKGFkYXB0ZXIsCi0JCQkJCQkJICAgICAgcHRhcmdldF93bGFuLAotCQkJCQkJCSAgICAgIHBuZXR3b3JrKTsKLQkJCWVsc2UgewotCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkJCSAiQ2FuJ3QgZmluZCBwdGFyZ2V0X3dsYW4gd2hlbiBqb2luYnNzX2V2ZW50IGNhbGxiYWNrXG4iKTsKLQkJCQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwotCQkJCWdvdG8gaWdub3JlX2pvaW5ic3NfY2FsbGJhY2s7Ci0JCQl9Ci0KLQkJCS8qIHMzLiBmaW5kIHB0YXJnZXRfc3RhICYgdXBkYXRlIHB0YXJnZXRfc3RhIGFmdGVyCi0JCQkgICB1cGRhdGUgY3VyX25ldHdvcmsgb25seSBmb3Igc3RhdGlvbiBtb2RlICovCi0JCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkpIHsKLQkJCQlwdGFyZ2V0X3N0YSA9IHJ0d19qb2luYnNzX3VwZGF0ZV9zdGFpbmZvKAotCQkJCQlhZGFwdGVyLCBwbmV0d29yayk7Ci0JCQkJaWYgKCFwdGFyZ2V0X3N0YSkgewotCQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywKLQkJCQkJCSBfZHJ2X2Vycl8sCi0JCQkJCQkgIkNhbid0IHVwZGF0ZSBzdGFpbmZvIHdoZW4gam9pbmJzc19ldmVudCBjYWxsYmFja1xuIik7Ci0JCQkJCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7Ci0JCQkJCWdvdG8gaWdub3JlX2pvaW5ic3NfY2FsbGJhY2s7Ci0JCQkJfQotCQkJfQotCi0JCQkvKiBzNC4gaW5kaWNhdGUgY29ubmVjdCAqLwotCQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpKQotCQkJCXJ0d19pbmRpY2F0ZV9jb25uZWN0MjNhKGFkYXB0ZXIpOwotCQkJZWxzZSB7Ci0JCQkJLyogYWRob2MgbW9kZSB3aWxsIHJ0d19pbmRpY2F0ZV9jb25uZWN0MjNhCi0JCQkJICAgd2hlbiBydHdfc3Rhc3NvY19ldmVudF9jYWxsYmFjazIzYSAqLwotCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkJCQkgImFkaG9jIG1vZGUsIGZ3X3N0YXRlOiV4XG4iLAotCQkJCQkgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSk7Ci0JCQl9Ci0KLQkJCS8qIHM1LiBDYW5jbGUgYXNzb2NfdGltZXIgKi8KLQkJCWRlbF90aW1lcl9zeW5jKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyKTsKLQotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCQkJICJDYW5jbGUgYXNzb2NfdGltZXJcbiIpOwotCQl9IGVsc2UgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCQkgInJ0dzIzYV9qb2luYnNzX2V2ZW50X2NiIGVycjogZndfc3RhdGU6JXhcbiIsCi0JCQkJIGdldF9md3N0YXRlKHBtbG1lcHJpdikpOwotCQkJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKLQkJCWdvdG8gaWdub3JlX2pvaW5ic3NfY2FsbGJhY2s7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKLQl9IGVsc2UgaWYgKHBuZXR3b3JrLT5qb2luX3JlcyA9PSAtNCkgewotCQlydHdfcmVzZXRfc2VjdXJpdHlwcml2MjNhKGFkYXB0ZXIpOwotCQltb2RfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsCi0JCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEpKTsKLQotCQkvKiBydHdfZnJlZV9hc3NvY19yZXNvdXJjZXMyM2EoYWRhcHRlciwgMSk7ICovCi0KLQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORykpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJmYWlsISBjbGVhciBfRldfVU5ERVJfTElOS0lORyBeXl5md19zdGF0ZT0leFxuIiwKLQkJCQkgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSk7Ci0JCQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogaWYgam9pbl9yZXMgPCAwIChqb2luIGZhaWxzKSwgdGhlbiB0cnkgYWdhaW4gKi8KLQkJbW9kX3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLAotCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxKSk7Ci0JCV9jbHJfZndzdGF0ZV8ocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORyk7Ci0JfQotCi1pZ25vcmVfam9pbmJzc19jYWxsYmFjazoKLQotCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotfQotCi12b2lkIHJ0dzIzYV9qb2luYnNzX2V2ZW50X2NiKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmsgPSAoc3RydWN0IHdsYW5fbmV0d29yayAqKXBidWY7Ci0KLQltbG1lZXh0X2pvaW5ic3NfZXZlbnRfY2FsbGJhY2syM2EoYWRhcHRlciwgcG5ldHdvcmstPmpvaW5fcmVzKTsKLQotCXJ0d19vc194bWl0X3NjaGVkdWxlMjNhKGFkYXB0ZXIpOwotfQotCi12b2lkIHJ0d19zdGFzc29jX2V2ZW50X2NhbGxiYWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgc3Rhc3NvY19ldmVudCAqcHN0YXNzb2MgPSAoc3RydWN0IHN0YXNzb2NfZXZlbnQgKilwYnVmOwotCXN0cnVjdCB3bGFuX25ldHdvcmsgKmN1cl9uZXR3b3JrID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcms7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqcHRhcmdldF93bGFuOwotCi0JaWYgKHJ0d19hY2Nlc3NfY3RybDIzYShhZGFwdGVyLCBwc3Rhc3NvYy0+bWFjYWRkcikgPT0gZmFsc2UpCi0JCXJldHVybjsKLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpIHsKLQkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYSgmYWRhcHRlci0+c3RhcHJpdiwgcHN0YXNzb2MtPm1hY2FkZHIpOwotCQlpZiAocHN0YSkgewotCQkJLyogYnNzX2NhcF91cGRhdGVfb25fc3RhX2pvaW4yM2EoYWRhcHRlciwgcHN0YSk7ICovCi0JCQkvKiBzdGFfaW5mb191cGRhdGUyM2EoYWRhcHRlciwgcHN0YSk7ICovCi0JCQlhcF9zdGFfaW5mb19kZWZlcl91cGRhdGUyM2EoYWRhcHRlciwgcHN0YSk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLSNlbmRpZgotCS8qIGZvciBBRC1IT0MgbW9kZSAqLwotCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EoJmFkYXB0ZXItPnN0YXByaXYsIHBzdGFzc29jLT5tYWNhZGRyKTsKLQlpZiAocHN0YSAhPSBOVUxMKSB7Ci0JCS8qIHRoZSBzdGEgaGF2ZSBiZWVuIGluIHN0YV9pbmZvX3F1ZXVlID0+IGRvIG5vdGhpbmcgKi8KLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCSAiRXJyb3I6IHJ0d19zdGFzc29jX2V2ZW50X2NhbGxiYWNrMjNhOiBzdGEgaGFzIGJlZW4gaW4gc3RhX2hhc2hfcXVldWVcbiIpOwotCQkvKiBiZXR3ZWVuIGRydiBoYXMgcmVjZWl2ZWQgdGhpcyBldmVudCBiZWZvcmUgYW5kCi0JCSAgIGZ3IGhhdmUgbm90IHlldCB0byBzZXQga2V5IHRvIENBTV9FTlRSWSkgKi8KLQkJcmV0dXJuOwotCX0KLQotCXBzdGEgPSBydHdfYWxsb2Nfc3RhaW5mbzIzYSgmYWRhcHRlci0+c3RhcHJpdiwgcHN0YXNzb2MtPm1hY2FkZHIsCi0JCUdGUF9LRVJORUwpOwotCWlmICghcHN0YSkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICJDYW4ndCBhbGxvYyBzdGFfaW5mbyB3aGVuIHJ0d19zdGFzc29jX2V2ZW50X2NhbGxiYWNrMjNhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIHRvIGRvIDogaW5pdCBzdGFfaW5mbyB2YXJpYWJsZSAqLwotCXBzdGEtPnFvc19vcHRpb24gPSAwOwotCXBzdGEtPm1hY19pZCA9ICh1aW50KXBzdGFzc29jLT5jYW1faWQ7Ci0JLyogcHN0YS0+YWlkID0gKHVpbnQpcHN0YXNzb2MtPmNhbV9pZDsgKi8KLQlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JLyogZm9yIGFkLWhvYyBtb2RlICovCi0JcnRsODcyM2FfU2V0SGFsT0RNVmFyKGFkYXB0ZXIsIEhBTF9PRE1fU1RBX0lORk8sIHBzdGEsIHRydWUpOwotCi0JaWYgKGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMUF1dGhBbGdydGhtID09IGRvdDExQXV0aEFsZ3J0aG1fODAyMVgpCi0JCXBzdGEtPmRvdDExODAyMVhQcml2YWN5ID0KLQkJCWFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lBbGdydGhtOwotCi0JcHN0YS0+aWVlZTgwMjF4X2Jsb2NrZWQgPSBmYWxzZTsKLQotCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpIHx8Ci0JICAgIGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX1NUQVRFKSkgewotCQlpZiAoYWRhcHRlci0+c3RhcHJpdi5hc29jX3N0YV9jb3VudCA9PSAyKSB7Ci0JCQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKLQkJCXB0YXJnZXRfd2xhbiA9Ci0JCQkJcnR3X2ZpbmRfbmV0d29yazIzYSgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLAotCQkJCQkJICAgIGN1cl9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpOwotCQkJaWYgKHB0YXJnZXRfd2xhbikKLQkJCQlwdGFyZ2V0X3dsYW4tPmZpeGVkID0gdHJ1ZTsKLQkJCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7Ci0JCQkvKiAgYSBzdGEgKyBiYy9tY19zdGFpbmZvIChub3QgSWJzc19zdGFpbmZvKSAqLwotCQkJcnR3X2luZGljYXRlX2Nvbm5lY3QyM2EoYWRhcHRlcik7Ci0JCX0KLQl9Ci0KLQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLQotCW1sbWVleHRfc3RhX2FkZF9ldmVudF9jYWxsYmFjazIzYShhZGFwdGVyLCBwc3RhKTsKLX0KLQotdm9pZCBydHdfc3RhZGVsX2V2ZW50X2NhbGxiYWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0JaW50IG1hY19pZDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqcHdsYW47Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKnBkZXZfbmV0d29yazsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHN0YWRlbF9ldmVudCAqcHN0YWRlbCA9IChzdHJ1Y3Qgc3RhZGVsX2V2ZW50ICopcGJ1ZjsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJmFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqdGd0X25ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yazsKLQotCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EoJmFkYXB0ZXItPnN0YXByaXYsIHBzdGFkZWwtPm1hY2FkZHIpOwotCWlmIChwc3RhKQotCQltYWNfaWQgPSBwc3RhLT5tYWNfaWQ7Ci0JZWxzZQotCQltYWNfaWQgPSBwc3RhZGVsLT5tYWNfaWQ7Ci0KLQlEQkdfODcyM0EoIiVzKG1hY19pZD0lZCk9JXBNXG4iLCBfX2Z1bmNfXywgbWFjX2lkLCBwc3RhZGVsLT5tYWNhZGRyKTsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpCi0JCXJldHVybjsKLQotCW1sbWVleHRfc3RhX2RlbF9ldmVudF9jYWxsYmFjazIzYShhZGFwdGVyKTsKLQotCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSkgewotCQlpZiAoYWRhcHRlci0+bWxtZXByaXYudG9fcm9hbWluZyA+IDApIHsKLQkJCS8qIHRoaXMgc3RhZGVsX2V2ZW50IGlzIGNhdXNlZCBieSByb2FtaW5nLAotCQkJICAgZGVjcmVhc2UgdG9fcm9hbWluZyAqLwotCQkJcG1sbWVwcml2LT50b19yb2FtaW5nLS07Ci0JCX0gZWxzZSBpZiAoYWRhcHRlci0+bWxtZXByaXYudG9fcm9hbWluZyA9PSAwKQotCQkJcnR3X3NldF9yb2FtaW5nKGFkYXB0ZXIsIGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5tYXhfcm9hbWluZ190aW1lcyk7Ci0JCWlmICgqKCh1MTYgKilwc3RhZGVsLT5yc3ZkKSAhPSBXTEFOX1JFQVNPTl9FWFBJUkFUSU9OX0NISykKLQkJCXJ0d19zZXRfcm9hbWluZyhhZGFwdGVyLCAwKTsgLyogZG9uJ3Qgcm9hbSAqLwotCi0JCXJ0d19mcmVlX3VjX3N3ZGVjX3BlbmRpbmdfcXVldWUyM2EoYWRhcHRlcik7Ci0KLQkJcnR3X2ZyZWVfYXNzb2NfcmVzb3VyY2VzMjNhKGFkYXB0ZXIsIDEpOwotCQlydHdfaW5kaWNhdGVfZGlzY29ubmVjdDIzYShhZGFwdGVyKTsKLQkJc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7Ci0JCS8qICByZW1vdmUgdGhlIG5ldHdvcmsgZW50cnkgaW4gc2Nhbm5lZF9xdWV1ZSAqLwotCQlwd2xhbiA9IHJ0d19maW5kX25ldHdvcmsyM2EoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZSwKLQkJCQkJICAgIHRndF9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpOwotCQlpZiAocHdsYW4pIHsKLQkJCXB3bGFuLT5maXhlZCA9IGZhbHNlOwotCQkJcnR3X2ZyZWVfbmV0d29ya19ub2xvY2socG1sbWVwcml2LCBwd2xhbik7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKLQotCQlfcnR3X3JvYW1pbmcoYWRhcHRlciwgdGd0X25ldHdvcmspOwotCX0KLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpIHx8Ci0JICAgIGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX1NUQVRFKSkgewotCi0JCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotCQlydHdfZnJlZV9zdGFpbmZvMjNhKGFkYXB0ZXIsICBwc3RhKTsKLQkJc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLQotCQkvKiBhIHN0YSArIGJjL21jX3N0YWluZm8gKG5vdCBJYnNzX3N0YWluZm8pICovCi0JCWlmIChhZGFwdGVyLT5zdGFwcml2LmFzb2Nfc3RhX2NvdW50ID09IDEpIHsKLQkJCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwotCQkJLyogZnJlZSBvbGQgaWJzcyBuZXR3b3JrICovCi0JCQkvKiBwd2xhbiA9IHJ0d19maW5kX25ldHdvcmsyM2EoCi0JCQkgICAmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLCBwc3RhZGVsLT5tYWNhZGRyKTsgKi8KLQkJCXB3bGFuID0gcnR3X2ZpbmRfbmV0d29yazIzYSgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLAotCQkJCQkJICAgIHRndF9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpOwotCQkJaWYgKHB3bGFuKSB7Ci0JCQkJcHdsYW4tPmZpeGVkID0gZmFsc2U7Ci0JCQkJcnR3X2ZyZWVfbmV0d29ya19ub2xvY2socG1sbWVwcml2LCBwd2xhbik7Ci0JCQl9Ci0JCQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwotCQkJLyogcmUtY3JlYXRlIGlic3MgKi8KLQkJCXBkZXZfbmV0d29yayA9ICZhZGFwdGVyLT5yZWdpc3RyeXByaXYuZGV2X25ldHdvcms7Ci0KLQkJCW1lbWNweShwZGV2X25ldHdvcmssICZ0Z3RfbmV0d29yay0+bmV0d29yaywKLQkJCSAgICAgICBnZXRfd2xhbl9ic3NpZF9leF9zeigmdGd0X25ldHdvcmstPm5ldHdvcmspKTsKLQotCQkJcnR3X2RvX2pvaW5fYWRob2MoYWRhcHRlcik7Ci0JCX0KLQl9Ci0KLQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLX0KLQotLyoKLSogcnR3MjNhX2pvaW5fdG9faGFuZGxlciAtIFRpbWVvdXQvZmFpbHVyZSBoYW5kbGVyIGZvciBDTUQgSm9pbkJzcwotKiBAYWRhcHRlcjogcG9pbnRlciB0byBfYWRhcHRlciBzdHJ1Y3R1cmUKLSovCi12b2lkIHJ0dzIzYV9qb2luX3RvX2hhbmRsZXIgKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IHJ0d19hZGFwdGVyICopZGF0YTsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7Ci0JaW50IGRvX2pvaW5fcjsKLQotCURCR184NzIzQSgiJXMsIGZ3X3N0YXRlPSV4XG4iLCBfX2Z1bmNfXywgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSk7Ci0KLQlpZiAoYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwgYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCi0JaWYgKGFkYXB0ZXItPm1sbWVwcml2LnRvX3JvYW1pbmcgPiAwKSB7Ci0JCS8qIGpvaW4gdGltZW91dCBjYXVzZWQgYnkgcm9hbWluZyAqLwotCQl3aGlsZSAoMSkgewotCQkJcG1sbWVwcml2LT50b19yb2FtaW5nLS07Ci0JCQlpZiAoYWRhcHRlci0+bWxtZXByaXYudG9fcm9hbWluZyAhPSAwKSB7Ci0JCQkJLyogdHJ5IGFub3RoZXIgKi8KLQkJCQlEQkdfODcyM0EoIiVzIHRyeSBhbm90aGVyIHJvYW1pbmdcbiIsIF9fZnVuY19fKTsKLQkJCQlkb19qb2luX3IgPSBydHdfZG9fam9pbihhZGFwdGVyKTsKLQkJCQlpZiAoZG9fam9pbl9yICE9IF9TVUNDRVNTKSB7Ci0JCQkJCURCR184NzIzQSgiJXMgcm9hbWluZyBkb19qb2luIHJldHVybiAiCi0JCQkJCQkgICIlZFxuIiwgX19mdW5jX18gLCBkb19qb2luX3IpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCURCR184NzIzQSgiJXMgV2UndmUgdHJ5IHJvYW1pbmcgYnV0IGZhaWxcbiIsCi0JCQkJCSAgX19mdW5jX18pOwotCQkJCXJ0d19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhKGFkYXB0ZXIpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJcnR3X2luZGljYXRlX2Rpc2Nvbm5lY3QyM2EoYWRhcHRlcik7Ci0JCWZyZWVfc2NhbnF1ZXVlKHBtbG1lcHJpdik7LyogICovCi0KLQkJLyogaW5kaWNhdGUgZGlzY29ubmVjdCBmb3IgdGhlIGNhc2UgdGhhdCBqb2luX3RpbWVvdXQgYW5kCi0JCSAgIGNoZWNrX2Z3c3RhdGUgIT0gRldfTElOS0VEICovCi0JCXJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9kaXNjb25uZWN0KGFkYXB0ZXIpOwotCX0KLQotCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCi19Ci0KLS8qCi0qIHJ0d19zY2FuX3RpbWVvdXRfaGFuZGxlcjIzYSAtIFRpbWVvdXQvRmFpbHVyZSBoYW5kbGVyIGZvciBDTUQgU2l0ZVN1cnZleQotKiBAZGF0YTogcG9pbnRlciB0byBfYWRhcHRlciBzdHJ1Y3R1cmUKLSovCi12b2lkIHJ0d19zY2FuX3RpbWVvdXRfaGFuZGxlcjIzYSh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBydHdfYWRhcHRlciAqKWRhdGE7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCi0JREJHXzg3MjNBKCIlcyglcyk6IGZ3X3N0YXRlID0leFxuIiwgX19mdW5jX18sIGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsCi0JCSAgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSk7Ci0KLQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0KLQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSk7Ci0KLQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLQotCXJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9zY2FuX2RvbmUod2Rldl90b19wcml2KGFkYXB0ZXItPnJ0d193ZGV2KSwgdHJ1ZSk7Ci19Ci0KLXZvaWQgcnR3X2R5bmFtaWNfY2hlY2tfdGltZXJfaGFuZGxlcih1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBydHdfYWRhcHRlciAqKWRhdGE7Ci0KLQlpZiAoYWRhcHRlci0+aHdfaW5pdF9jb21wbGV0ZWQgPT0gZmFsc2UpCi0JCWdvdG8gb3V0OwotCi0JaWYgKGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkID09IHRydWUgfHwKLQkgICAgYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCA9PSB0cnVlKQotCQlnb3RvIG91dDsKLQotCWlmIChhZGFwdGVyLT5uZXRfY2xvc2VkID09IHRydWUpCi0JCWdvdG8gb3V0OwotCi0JcnR3X2R5bmFtaWNfY2hrX3drX2NtZDIzYShhZGFwdGVyKTsKLQotb3V0OgotCW1vZF90aW1lcigmYWRhcHRlci0+bWxtZXByaXYuZHluYW1pY19jaGtfdGltZXIsCi0JCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjAwMCkpOwotfQotCi1pbmxpbmUgYm9vbCBydHdfaXNfc2Nhbl9kZW55KHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICptbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKLQotCXJldHVybiAoYXRvbWljX3JlYWQoJm1sbWVwcml2LT5zZXRfc2Nhbl9kZW55KSAhPSAwKSA/IHRydWUgOiBmYWxzZTsKLX0KLQotdm9pZCBydHdfY2xlYXJfc2Nhbl9kZW55KHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICptbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKLQotCWF0b21pY19zZXQoJm1sbWVwcml2LT5zZXRfc2Nhbl9kZW55LCAwKTsKLX0KLQotdm9pZCBydHdfc2V0X3NjYW5fZGVueV90aW1lcl9oZGwodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKilkYXRhOwotCi0JcnR3X2NsZWFyX3NjYW5fZGVueShhZGFwdGVyKTsKLX0KLQotdm9pZCBydHdfc2V0X3NjYW5fZGVueShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBtcykKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICptbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKLQotCWF0b21pY19zZXQoJm1sbWVwcml2LT5zZXRfc2Nhbl9kZW55LCAxKTsKLQltb2RfdGltZXIoJm1sbWVwcml2LT5zZXRfc2Nhbl9kZW55X3RpbWVyLAotCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKG1zKSk7Ci19Ci0KLSNpZiBkZWZpbmVkKElFRUU4MDIxMV9TQ0FOX1JFU1VMVF9FWFBJUkUpCi0jZGVmaW5lIFJUV19TQ0FOX1JFU1VMVF9FWFBJUkUgIFwKLQkoKElFRUU4MDIxMV9TQ0FOX1JFU1VMVF9FWFBJUkUgLyAoSFoqMTAwMCkpIC0gMTAwMCkgLyogMzAwMCAtMTAwMCAqLwotI2Vsc2UKLSNkZWZpbmUgUlRXX1NDQU5fUkVTVUxUX0VYUElSRSAyMDAwCi0jZW5kaWYKLQotLyoKLSogU2VsZWN0IGEgbmV3IGpvaW4gY2FuZGlkYXRlIGZyb20gdGhlIG9yaWdpbmFsIEBwYXJhbSBjYW5kaWRhdGUgYW5kCi0qICAgICBAcGFyYW0gY29tcGV0aXRvcgotKiBAcmV0dXJuIHRydWU6IGNhbmRpZGF0ZSBpcyB1cGRhdGVkCi0qIEByZXR1cm4gZmFsc2U6IGNhbmRpZGF0ZSBpcyBub3QgdXBkYXRlZAotKi8KLXN0YXRpYyBpbnQgcnR3X2NoZWNrX2pvaW5fY2FuZGlkYXRlKHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiwKLQkJCQkgICAgc3RydWN0IHdsYW5fbmV0d29yayAqKmNhbmRpZGF0ZSwKLQkJCQkgICAgc3RydWN0IHdsYW5fbmV0d29yayAqY29tcGV0aXRvcikKLXsKLQlpbnQgdXBkYXRlZCA9IGZhbHNlOwotCXN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcjsKLQotCWFkYXB0ZXIgPSBjb250YWluZXJfb2YocG1sbWVwcml2LCBzdHJ1Y3QgcnR3X2FkYXB0ZXIsIG1sbWVwcml2KTsKLQotCS8qIGNoZWNrIGJzc2lkLCBpZiBuZWVkZWQgKi8KLQlpZiAocG1sbWVwcml2LT5hc3NvY19ieV9ic3NpZCA9PSB0cnVlKSB7Ci0JCWlmICghZXRoZXJfYWRkcl9lcXVhbChjb21wZXRpdG9yLT5uZXR3b3JrLk1hY0FkZHJlc3MsCi0JCQkJICAgICAgcG1sbWVwcml2LT5hc3NvY19ic3NpZCkpCi0JCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogY2hlY2sgc3NpZCwgaWYgbmVlZGVkICovCi0JaWYgKHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkX2xlbikgewotCQlpZiAoY29tcGV0aXRvci0+bmV0d29yay5Tc2lkLnNzaWRfbGVuICE9Ci0JCSAgICBwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZF9sZW4gfHwKLQkJICAgIG1lbWNtcChjb21wZXRpdG9yLT5uZXR3b3JrLlNzaWQuc3NpZCwKLQkJCSAgIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkLAotCQkJICAgcG1sbWVwcml2LT5hc3NvY19zc2lkLnNzaWRfbGVuKSkKLQkJCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAocnR3X2lzX2Rlc2lyZWRfbmV0d29yayhhZGFwdGVyLCBjb21wZXRpdG9yKSA9PSBmYWxzZSkKLQkJZ290byBleGl0OwotCi0JaWYgKGFkYXB0ZXItPm1sbWVwcml2LnRvX3JvYW1pbmcgPiAwKSB7Ci0JCXVuc2lnbmVkIGludCBwYXNzZWQ7Ci0KLQkJcGFzc2VkID0gamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gY29tcGV0aXRvci0+bGFzdF9zY2FubmVkKTsKLQkJaWYgKHBhc3NlZCA+PSBSVFdfU0NBTl9SRVNVTFRfRVhQSVJFIHx8Ci0JCSAgICBpc19zYW1lX2VzcygmY29tcGV0aXRvci0+bmV0d29yaywKLQkJCQkmcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrKSA9PSBmYWxzZSkKLQkJCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAoISpjYW5kaWRhdGUgfHwKLQkgICAgKCpjYW5kaWRhdGUpLT5uZXR3b3JrLlJzc2k8Y29tcGV0aXRvci0+bmV0d29yay5Sc3NpKSB7Ci0JCSpjYW5kaWRhdGUgPSBjb21wZXRpdG9yOwotCQl1cGRhdGVkID0gdHJ1ZTsKLQl9Ci0KLQlpZiAodXBkYXRlZCkgewotCQlEQkdfODcyM0EoIltieV9ic3NpZDoldV1bYXNzb2Nfc3NpZDolc11bdG9fcm9hbWluZzoldV0gbmV3IGNhbmRpZGF0ZTogJXMoJXBNKSByc3NpOiVkXG4iLAotCQkJICBwbWxtZXByaXYtPmFzc29jX2J5X2Jzc2lkLAotCQkJICBwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZCwKLQkJCSAgYWRhcHRlci0+bWxtZXByaXYudG9fcm9hbWluZywKLQkJCSAgKCpjYW5kaWRhdGUpLT5uZXR3b3JrLlNzaWQuc3NpZCwKLQkJCSAgKCpjYW5kaWRhdGUpLT5uZXR3b3JrLk1hY0FkZHJlc3MsCi0JCQkgIChpbnQpKCpjYW5kaWRhdGUpLT5uZXR3b3JrLlJzc2kpOwotCX0KLQotZXhpdDoKLQlyZXR1cm4gdXBkYXRlZDsKLX0KLQotLyoKLUNhbGxpbmcgY29udGV4dDoKLVRoZSBjYWxsZXIgb2YgdGhlIHN1Yi1yb3V0aW5lIHdpbGwgYmUgaW4gY3JpdGljYWwgc2VjdGlvbi4uLgotCi1UaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgZm9sbG93aW5nIHNwaW5sb2NrCi0KLXBtbG1lcHJpdi0+bG9jawotCi0qLwotCi1zdGF0aWMgaW50IHJ0d19kb19qb2luKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlpbnQgcmV0OwotCi0JcG1sbWVwcml2LT5jdXJfbmV0d29yay5qb2luX3JlcyA9IC0yOwotCi0Jc2V0X2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORyk7Ci0KLQlwbWxtZXByaXYtPnRvX2pvaW4gPSB0cnVlOwotCi0JcmV0ID0gcnR3X3NlbGVjdF9hbmRfam9pbl9mcm9tX3NjYW5uZWRfcXVldWUyM2EocG1sbWVwcml2KTsKLQlpZiAocmV0ID09IF9TVUNDRVNTKSB7Ci0JCXBtbG1lcHJpdi0+dG9fam9pbiA9IGZhbHNlOwotCX0gZWxzZSB7Ci0JCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19TVEFURSkpIHsKLQkJCS8qIHN3aXRjaCB0byBBREhPQ19NQVNURVIgKi8KLQkJCXJldCA9IHJ0d19kb19qb2luX2FkaG9jKHBhZGFwdGVyKTsKLQkJCWlmIChyZXQgIT0gX1NVQ0NFU1MpCi0JCQkJZ290byBleGl0OwotCQl9IGVsc2UgewotCQkJLyogIGNhbid0IGFzc29jaWF0ZSA7IHJlc2V0IHVuZGVyLWxpbmtpbmcgKi8KLQkJCV9jbHJfZndzdGF0ZV8ocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORyk7Ci0KLQkJCXJldCA9IF9GQUlMOwotCQkJcG1sbWVwcml2LT50b19qb2luID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCB3bGFuX25ldHdvcmsgKgotcnR3X3NlbGVjdF9jYW5kaWRhdGVfZnJvbV9xdWV1ZShzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYpCi17Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmssICpwdG1wLCAqY2FuZGlkYXRlID0gTlVMTDsKLQlzdHJ1Y3QgcnR3X3F1ZXVlICpxdWV1ZSA9ICZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWU7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0KLQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKLQlwaGVhZCA9IGdldF9saXN0X2hlYWQocXVldWUpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwbmV0d29yaywgcHRtcCwgcGhlYWQsIGxpc3QpCi0JCXJ0d19jaGVja19qb2luX2NhbmRpZGF0ZShwbWxtZXByaXYsICZjYW5kaWRhdGUsIHBuZXR3b3JrKTsKLQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwotCi0JcmV0dXJuIGNhbmRpZGF0ZTsKLX0KLQotCi1pbnQgcnR3X2RvX2pvaW5fYWRob2Moc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcGRldl9uZXR3b3JrOwotCXU4ICppYnNzOwotCWludCByZXQ7Ci0KLQlwZGV2X25ldHdvcmsgPSAmYWRhcHRlci0+cmVnaXN0cnlwcml2LmRldl9uZXR3b3JrOwotCWlic3MgPSBhZGFwdGVyLT5yZWdpc3RyeXByaXYuZGV2X25ldHdvcmsuTWFjQWRkcmVzczsKLQotCV9jbHJfZndzdGF0ZV8ocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKTsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCSAic3dpdGNoaW5nIHRvIGFkaG9jIG1hc3RlclxuIik7Ci0KLQltZW1jcHkoJnBkZXZfbmV0d29yay0+U3NpZCwgJnBtbG1lcHJpdi0+YXNzb2Nfc3NpZCwKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjZmc4MDIxMV9zc2lkKSk7Ci0KLQlydHdfdXBkYXRlX3JlZ2lzdHJ5cHJpdl9kZXZfbmV0d29yazIzYShhZGFwdGVyKTsKLQlydHdfZ2VuZXJhdGVfcmFuZG9tX2lic3MyM2EoaWJzcyk7Ci0KLQlwbWxtZXByaXYtPmZ3X3N0YXRlID0gV0lGSV9BREhPQ19NQVNURVJfU1RBVEU7Ci0KLQlyZXQgPSBydHdfY3JlYXRlYnNzX2NtZDIzYShhZGFwdGVyKTsKLQlpZiAocmV0ICE9IF9TVUNDRVNTKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIkVycm9yID0+cnR3X2NyZWF0ZWJzc19jbWQyM2Egc3RhdHVzIEZBSUxcbiIpOwotCX0gZWxzZSAgewotCQlwbWxtZXByaXYtPnRvX2pvaW4gPSBmYWxzZTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgcnR3X2RvX2pvaW5fbmV0d29yayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpjYW5kaWRhdGUpCi17Ci0JaW50IHJldDsKLQotCS8qICBjaGVjayBmb3Igc2l0dWF0aW9uIG9mICBfRldfTElOS0VEICovCi0JaWYgKGNoZWNrX2Z3c3RhdGUoJmFkYXB0ZXItPm1sbWVwcml2LCBfRldfTElOS0VEKSkgewotCQlEQkdfODcyM0EoIiVzOiBfRldfTElOS0VEIHdoaWxlIGFza19mb3Jfam9pbmJzcyFcbiIsIF9fZnVuY19fKTsKLQotCQlydHdfZGlzYXNzb2NfY21kMjNhKGFkYXB0ZXIsIDAsIHRydWUpOwotCQlydHdfaW5kaWNhdGVfZGlzY29ubmVjdDIzYShhZGFwdGVyKTsKLQkJcnR3X2ZyZWVfYXNzb2NfcmVzb3VyY2VzMjNhKGFkYXB0ZXIsIDApOwotCX0KLQlzZXRfZndzdGF0ZSgmYWRhcHRlci0+bWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKTsKLQotCXJldCA9IHJ0d19qb2luYnNzX2NtZDIzYShhZGFwdGVyLCBjYW5kaWRhdGUpOwotCi0JaWYgKHJldCA9PSBfU1VDQ0VTUykKLQkJbW9kX3RpbWVyKCZhZGFwdGVyLT5tbG1lcHJpdi5hc3NvY190aW1lciwKLQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoTUFYX0pPSU5fVElNRU9VVCkpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IHJ0d19zZWxlY3RfYW5kX2pvaW5fZnJvbV9zY2FubmVkX3F1ZXVlMjNhKHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdikKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXI7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqY2FuZGlkYXRlID0gTlVMTDsKLQlpbnQgcmV0OwotCi0JYWRhcHRlciA9IHBtbG1lcHJpdi0+bmljX2hkbDsKLQotCWNhbmRpZGF0ZSA9IHJ0d19zZWxlY3RfY2FuZGlkYXRlX2Zyb21fcXVldWUocG1sbWVwcml2KTsKLQlpZiAoIWNhbmRpZGF0ZSkgewotCQlEQkdfODcyM0EoIiVzOiByZXR1cm4gX0ZBSUwoY2FuZGlkYXRlID09IE5VTEwpXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfSBlbHNlIHsKLQkJREJHXzg3MjNBKCIlczogY2FuZGlkYXRlOiAlcyglcE0sIGNoOiV1KVxuIiwKLQkJCSAgX19mdW5jX18sCi0JCQkgIGNhbmRpZGF0ZS0+bmV0d29yay5Tc2lkLnNzaWQsCi0JCQkgIGNhbmRpZGF0ZS0+bmV0d29yay5NYWNBZGRyZXNzLAotCQkJICBjYW5kaWRhdGUtPm5ldHdvcmsuRFNDb25maWcpOwotCX0KLQotCXJldCA9IHJ0d19kb19qb2luX25ldHdvcmsoYWRhcHRlciwgY2FuZGlkYXRlKTsKLQotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgcnR3X3NldF9hdXRoMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJICAgIHN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2KQotewotCXN0cnVjdCBjbWRfb2JqICpwY21kOwotCXN0cnVjdCBzZXRhdXRoX3Bhcm0gKnBzZXRhdXRocGFybTsKLQlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJmFkYXB0ZXItPmNtZHByaXY7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0JcGNtZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwY21kKSB7Ci0JCXJlcyA9IF9GQUlMOyAgLyogdHJ5IGFnYWluICovCi0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwc2V0YXV0aHBhcm0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2V0YXV0aF9wYXJtKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwc2V0YXV0aHBhcm0pIHsKLQkJa2ZyZWUocGNtZCk7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcHNldGF1dGhwYXJtLT5tb2RlID0gKHVuc2lnbmVkIGNoYXIpcHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobTsKLQotCXBjbWQtPmNtZGNvZGUgPSBfU2V0QXV0aF9DTURfOwotCXBjbWQtPnBhcm1idWYgPSAodW5zaWduZWQgY2hhciAqKXBzZXRhdXRocGFybTsKLQlwY21kLT5jbWRzeiA9ICAoc2l6ZW9mKHN0cnVjdCBzZXRhdXRoX3Bhcm0pKTsKLQlwY21kLT5yc3AgPSBOVUxMOwotCXBjbWQtPnJzcHN6ID0gMDsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCSAiYWZ0ZXIgZW5xdWV1ZSBzZXRfYXV0aF9jbWQsIGF1dGhfbW9kZT0leFxuIiwKLQkJIHBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG0pOwotCi0JcmVzID0gcnR3X2VucXVldWVfY21kMjNhKHBjbWRwcml2LCBwY21kKTsKLQotZXhpdDoKLQotCXJldHVybiByZXM7Ci19Ci0KLWludCBydHdfc2V0X2tleTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCSAgIHN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2LCBpbnQga2V5aWQsIHU4IHNldF90eCkKLXsKLQl1OCBrZXlsZW47Ci0Jc3RydWN0IGNtZF9vYmogKnBjbWQ7Ci0Jc3RydWN0IHNldGtleV9wYXJtICpwc2V0a2V5cGFybTsKLQlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJmFkYXB0ZXItPmNtZHByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQotCWlmIChrZXlpZCA+PSA0KSB7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcGNtZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwY21kKSB7Ci0JCXJlcyA9IF9GQUlMOyAgLyogdHJ5IGFnYWluICovCi0JCWdvdG8gZXhpdDsKLQl9Ci0JcHNldGtleXBhcm0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2V0a2V5X3Bhcm0pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBzZXRrZXlwYXJtKSB7Ci0JCWtmcmVlKHBjbWQpOwotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCWlmIChwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtID09IGRvdDExQXV0aEFsZ3J0aG1fODAyMVgpIHsKLQkJcHNldGtleXBhcm0tPmFsZ29yaXRobSA9ICh1bnNpZ25lZCBjaGFyKQotCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycFByaXZhY3k7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgInJ0d19zZXRfa2V5MjNhOiBwc2V0a2V5cGFybS0+YWxnb3JpdGhtID0gKHVuc2lnbmVkIGNoYXIpcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycFByaXZhY3kgPSVkXG4iLAotCQkJIHBzZXRrZXlwYXJtLT5hbGdvcml0aG0pOwotCX0gZWxzZSB7Ci0JCXBzZXRrZXlwYXJtLT5hbGdvcml0aG0gPSAodTgpcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobTsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCSAicnR3X3NldF9rZXkyM2E6IHBzZXRrZXlwYXJtLT5hbGdvcml0aG0gPSAodTgpcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSA9JWRcbiIsCi0JCQkgcHNldGtleXBhcm0tPmFsZ29yaXRobSk7Ci0JfQotCXBzZXRrZXlwYXJtLT5rZXlpZCA9IGtleWlkOy8qIDB+MyAqLwotCXBzZXRrZXlwYXJtLT5zZXRfdHggPSBzZXRfdHg7Ci0JaWYgKGlzX3dlcF9lbmMocHNldGtleXBhcm0tPmFsZ29yaXRobSkpCi0JCXBtbG1lcHJpdi0+a2V5X21hc2sgfD0gQklUKHBzZXRrZXlwYXJtLT5rZXlpZCk7Ci0KLQlEQkdfODcyM0EoIj09PiBydHdfc2V0X2tleTIzYSBhbGdvcml0aG0oJXgpLCBrZXlpZCgleCksIGtleV9tYXNrKCV4KVxuIiwKLQkJICBwc2V0a2V5cGFybS0+YWxnb3JpdGhtLCBwc2V0a2V5cGFybS0+a2V5aWQsCi0JCSAgcG1sbWVwcml2LT5rZXlfbWFzayk7Ci0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJICJydHdfc2V0X2tleTIzYTogcHNldGtleXBhcm0tPmFsZ29yaXRobSA9JWQgcHNldGtleXBhcm0tPmtleWlkID0gKHU4KWtleWlkID0lZFxuIiwKLQkJIHBzZXRrZXlwYXJtLT5hbGdvcml0aG0sIGtleWlkKTsKLQotCXN3aXRjaCAocHNldGtleXBhcm0tPmFsZ29yaXRobSkgewotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6Ci0JCWtleWxlbiA9IDU7Ci0JCW1lbWNweSgmcHNldGtleXBhcm0tPmtleVswXSwKLQkJICAgICAgICZwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXksIGtleWxlbik7Ci0JCWJyZWFrOwotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgotCQlrZXlsZW4gPSAxMzsKLQkJbWVtY3B5KCZwc2V0a2V5cGFybS0+a2V5WzBdLAotCQkgICAgICAgJnBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLmtleSwga2V5bGVuKTsKLQkJYnJlYWs7Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgotCQlrZXlsZW4gPSAxNjsKLQkJbWVtY3B5KCZwc2V0a2V5cGFybS0+a2V5LAotCQkgICAgICAgJnBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlba2V5aWRdLCBrZXlsZW4pOwotCQlwc2V0a2V5cGFybS0+Z3Jwa2V5ID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgotCQlrZXlsZW4gPSAxNjsKLQkJbWVtY3B5KCZwc2V0a2V5cGFybS0+a2V5LAotCQkgICAgICAgJnBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlba2V5aWRdLCBrZXlsZW4pOwotCQlwc2V0a2V5cGFybS0+Z3Jwa2V5ID0gMTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCSAicnR3X3NldF9rZXkyM2E6cHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSA9ICV4IChtdXN0IGJlIDEgb3IgMiBvciA0IG9yIDUpXG4iLAotCQkJIHBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0pOwotCQlyZXMgPSBfRkFJTDsKLQkJa2ZyZWUocGNtZCk7Ci0JCWtmcmVlKHBzZXRrZXlwYXJtKTsKLQkJZ290byBleGl0OwotCX0KLQotCXBjbWQtPmNtZGNvZGUgPSBfU2V0S2V5X0NNRF87Ci0JcGNtZC0+cGFybWJ1ZiA9ICh1OCAqKXBzZXRrZXlwYXJtOwotCXBjbWQtPmNtZHN6ID0gIChzaXplb2Yoc3RydWN0IHNldGtleV9wYXJtKSk7Ci0JcGNtZC0+cnNwID0gTlVMTDsKLQlwY21kLT5yc3BzeiA9IDA7Ci0KLQkvKiBzZW1hX2luaXQoJnBjbWQtPmNtZF9zZW0sIDApOyAqLwotCi0JcmVzID0gcnR3X2VucXVldWVfY21kMjNhKHBjbWRwcml2LCBwY21kKTsKLQotZXhpdDoKLQotCXJldHVybiByZXM7Ci19Ci0KLS8qIGFkanVzdCBJRXMgZm9yIHJ0d19qb2luYnNzX2NtZDIzYSBpbiBXTU0gKi8KLWludCBydHdfcmVzdHJ1Y3Rfd21tX2llMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgdTggKmluX2llLAotCQkJICAgdTggKm91dF9pZSwgdWludCBpbl9sZW4sIHVpbnQgaW5pdGlhbF9vdXRfbGVuKQotewotCWludCBpZWxlbmd0aDsKLQljb25zdCB1OCAqcDsKLQotCWllbGVuZ3RoID0gaW5pdGlhbF9vdXRfbGVuOwotCi0JcCA9IGNmZzgwMjExX2ZpbmRfdmVuZG9yX2llKFdMQU5fT1VJX01JQ1JPU09GVCwKLQkJCQkgICAgV0xBTl9PVUlfVFlQRV9NSUNST1NPRlRfV01NLAotCQkJCSAgICBpbl9pZSwgaW5fbGVuKTsKLQotCWlmIChwICYmIHBbMV0pIHsKLQkJbWVtY3B5KG91dF9pZSArIGluaXRpYWxfb3V0X2xlbiwgcCwgOSk7Ci0KLQkJb3V0X2llW2luaXRpYWxfb3V0X2xlbiArIDFdID0gNzsKLQkJb3V0X2llW2luaXRpYWxfb3V0X2xlbiArIDZdID0gMDsKLQkJb3V0X2llW2luaXRpYWxfb3V0X2xlbiArIDhdID0gMDsKLQotCQlpZWxlbmd0aCArPSA5OwotCX0KLQotCXJldHVybiBpZWxlbmd0aDsKLX0KLQotLyogICovCi0vKiAgUG9ydGVkIGZyb20gODE4NTogSXNJblByZUF1dGhLZXlMaXN0KCkuCi0gICAgKFJlbmFtZWQgZnJvbSBTZWNJc0luUHJlQXV0aEtleUxpc3QoKSwgMjAwNi0xMC0xMy4pICovCi0vKiAgQWRkZWQgYnkgQW5uaWUsIDIwMDYtMDUtMDcuICovCi0vKiAgKi8KLS8qICBTZWFyY2ggYnkgQlNTSUQsICovCi0vKiAgUmV0dXJuIFZhbHVlOiAqLwotLyoJCS0xCTppZiB0aGVyZSBpcyBubyBwcmUtYXV0aCBrZXkgaW4gdGhlICB0YWJsZSAqLwotLyoJCT49IDAJOmlmIHRoZXJlIGlzIHByZS1hdXRoIGtleSwgYW5kICAgcmV0dXJuIHRoZSBlbnRyeSBpZCAqLwotLyogICovCi0vKiAgKi8KLQotc3RhdGljIGludCBTZWNJc0luUE1LSURMaXN0KHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwgdTggKmJzc2lkKQotewotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJkFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlpbnQgaSA9IDA7Ci0KLQlkbyB7Ci0JCWlmIChwc2VjdXJpdHlwcml2LT5QTUtJRExpc3RbaV0uYlVzZWQgJiYKLSAgICAgICAgICAgICAgICAgICAgZXRoZXJfYWRkcl9lcXVhbChwc2VjdXJpdHlwcml2LT5QTUtJRExpc3RbaV0uQnNzaWQsIGJzc2lkKSkgewotCQkJYnJlYWs7Ci0JCX0gZWxzZSB7Ci0JCQlpKys7Ci0JCQkvKiBjb250aW51ZTsgKi8KLQkJfQotCX0gd2hpbGUgKGkgPCBOVU1fUE1LSURfQ0FDSEUpOwotCi0JaWYgKGkgPT0gTlVNX1BNS0lEX0NBQ0hFKQotCQlpID0gLTE7LyogIENvdWxkIG5vdCBmaW5kLiAqLwotCWVsc2UgewotCQkvKiAgVGhlcmUgaXMgb25lIFByZS1BdXRoZW50aWNhdGlvbiBLZXkgZm9yCi0JCSAgICB0aGUgc3BlY2lmaWMgQlNTSUQuICovCi0JfQotCi0JcmV0dXJuIGk7Ci19Ci0KLS8qICAqLwotLyogIENoZWNrIHRoZSBSU04gSUUgbGVuZ3RoICovCi0vKiAgSWYgdGhlIFJTTiBJRSBsZW5ndGggPD0gMjAsIHRoZSBSU04gSUUgZGlkbid0IGluY2x1ZGUKLSAgICB0aGUgUE1LSUQgaW5mb3JtYXRpb24gKi8KLS8qICAwLTExdGggZWxlbWVudCBpbiB0aGUgYXJyYXkgYXJlIHRoZSBmaXhlZCBJRSAqLwotLyogIDEydGggZWxlbWVudCBpbiB0aGUgYXJyYXkgaXMgdGhlIElFICovCi0vKiAgMTN0aCBlbGVtZW50IGluIHRoZSBhcnJheSBpcyB0aGUgSUUgbGVuZ3RoICovCi0vKiAgKi8KLQotc3RhdGljIGludCBydHdfYXBwZW5kX3Bta2lkKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwgaW50IGlFbnRyeSwKLQkJCSAgICB1OCAqaWUsIHVpbnQgaWVfbGVuKQotewotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJkFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQotCWlmIChpZVsxXSA8PSAyMCkgewotCQkvKiAgVGhlIFJTTiBJRSBkaWRuJ3QgaW5jbHVkZSB0aGUgUE1LIElELAotCQkgICAgYXBwZW5kIHRoZSBQTUsgaW5mb3JtYXRpb24gKi8KLQkJCWllW2llX2xlbl0gPSAxOwotCQkJaWVfbGVuKys7Ci0JCQlpZVtpZV9sZW5dID0gMDsJLyogUE1LSUQgY291bnQgPSAweDAxMDAgKi8KLQkJCWllX2xlbisrOwotCQkJbWVtY3B5KCZpZVtpZV9sZW5dLAotCQkJICAgICAgICZwc2VjdXJpdHlwcml2LT5QTUtJRExpc3RbaUVudHJ5XS5QTUtJRCwgMTYpOwotCi0JCQlpZV9sZW4gKz0gMTY7Ci0JCQlpZVsxXSArPSAxODsvKiBQTUtJRCBsZW5ndGggPSAyKzE2ICovCi0JfQotCXJldHVybiBpZV9sZW47Ci19Ci0KLWludCBydHdfcmVzdHJ1Y3Rfc2VjX2llMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgdTggKmluX2llLCB1OCAqb3V0X2llLAotCQkJICAgdWludCBpbl9sZW4pCi17Ci0JdTggYXV0aG1vZGU7Ci0JdWludCBpZWxlbmd0aDsKLQlpbnQgaUVudHJ5OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0JdWludCBuZGlzYXV0aG1vZGUgPSBwc2VjdXJpdHlwcml2LT5uZGlzYXV0aHR5cGU7Ci0JdWludCBuZGlzc2VjdXJpdHl0eXBlID0gcHNlY3VyaXR5cHJpdi0+bmRpc2VuY3J5cHRzdGF0dXM7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9ub3RpY2VfLAotCQkgIitydHdfcmVzdHJ1Y3Rfc2VjX2llMjNhOiBuZGlzYXV0aG1vZGU9JWQgbmRpc3NlY3VyaXR5dHlwZT0lZFxuIiwKLQkJIG5kaXNhdXRobW9kZSwgbmRpc3NlY3VyaXR5dHlwZSk7Ci0KLQlpZWxlbmd0aCA9IDA7Ci0JaWYgKG5kaXNhdXRobW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEgfHwKLQkgICAgbmRpc2F1dGhtb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSykKLQkJYXV0aG1vZGUgPSBXTEFOX0VJRF9WRU5ET1JfU1BFQ0lGSUM7Ci0JaWYgKG5kaXNhdXRobW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyIHx8Ci0JICAgIG5kaXNhdXRobW9kZSA9PSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLKQotCQlhdXRobW9kZSA9IFdMQU5fRUlEX1JTTjsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9VTkRFUl9XUFMpKSB7Ci0JCW1lbWNweShvdXRfaWUgKyBpZWxlbmd0aCwgcHNlY3VyaXR5cHJpdi0+d3BzX2llLAotCQkgICAgICAgcHNlY3VyaXR5cHJpdi0+d3BzX2llX2xlbik7Ci0KLQkJaWVsZW5ndGggKz0gcHNlY3VyaXR5cHJpdi0+d3BzX2llX2xlbjsKLQl9IGVsc2UgaWYgKGF1dGhtb2RlID09IFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQyB8fAotCQkgICBhdXRobW9kZSA9PSBXTEFOX0VJRF9SU04pIHsKLQkJLyogY29weSBSU04gb3IgU1NOICovCi0JCW1lbWNweSgmb3V0X2llW2llbGVuZ3RoXSwgJnBzZWN1cml0eXByaXYtPnN1cHBsaWNhbnRfaWVbMF0sCi0JCSAgICAgICBwc2VjdXJpdHlwcml2LT5zdXBwbGljYW50X2llWzFdICsgMik7Ci0JCWllbGVuZ3RoICs9IHBzZWN1cml0eXByaXYtPnN1cHBsaWNhbnRfaWVbMV0gKyAyOwotCX0KLQotCWlFbnRyeSA9IFNlY0lzSW5QTUtJRExpc3QoYWRhcHRlciwgcG1sbWVwcml2LT5hc3NvY19ic3NpZCk7Ci0JaWYgKGlFbnRyeSA8IDApCi0JCXJldHVybiBpZWxlbmd0aDsKLQllbHNlIHsKLQkJaWYgKGF1dGhtb2RlID09IFdMQU5fRUlEX1JTTikKLQkJCWllbGVuZ3RoID0gcnR3X2FwcGVuZF9wbWtpZChhZGFwdGVyLCBpRW50cnksCi0JCQkJCQkgICAgb3V0X2llLCBpZWxlbmd0aCk7Ci0JfQotCi0JcmV0dXJuIGllbGVuZ3RoOwotfQotCi12b2lkIHJ0d19pbml0X3JlZ2lzdHJ5cHJpdl9kZXZfbmV0d29yazIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdpc3RyeXByaXYgPSAmYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCXN0cnVjdCBlZXByb21fcHJpdiAqcGVlcHJpdiA9ICZhZGFwdGVyLT5lZXByb21wcml2OwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICAgICpwZGV2X25ldHdvcmsgPSAmcHJlZ2lzdHJ5cHJpdi0+ZGV2X25ldHdvcms7Ci0JdTggKm15aHdhZGRyID0gbXlpZChwZWVwcml2KTsKLQotCWV0aGVyX2FkZHJfY29weShwZGV2X25ldHdvcmstPk1hY0FkZHJlc3MsIG15aHdhZGRyKTsKLQotCW1lbWNweSgmcGRldl9uZXR3b3JrLT5Tc2lkLCAmcHJlZ2lzdHJ5cHJpdi0+c3NpZCwKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjZmc4MDIxMV9zc2lkKSk7Ci0KLQlwZGV2X25ldHdvcmstPmJlYWNvbl9pbnRlcnZhbCA9IDEwMDsKLX0KLQotdm9pZCBydHdfdXBkYXRlX3JlZ2lzdHJ5cHJpdl9kZXZfbmV0d29yazIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JaW50IHN6ID0gMDsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiA9ICZhZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKnBkZXZfbmV0d29yayA9ICZwcmVnaXN0cnlwcml2LT5kZXZfbmV0d29yazsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqY3VyX25ldHdvcmsgPSAmYWRhcHRlci0+bWxtZXByaXYuY3VyX25ldHdvcms7Ci0JLyogc3RydWN0CXhtaXRfcHJpdgkqcHhtaXRwcml2ID0gJmFkYXB0ZXItPnhtaXRwcml2OyAqLwotCi0JcGRldl9uZXR3b3JrLT5Qcml2YWN5ID0KLQkJKHBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gPiAwID8gMSA6IDApOwotCi0JcGRldl9uZXR3b3JrLT5Sc3NpID0gMDsKLQotCXBkZXZfbmV0d29yay0+RFNDb25maWcgPSBwcmVnaXN0cnlwcml2LT5jaGFubmVsOwotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkgInByZWdpc3RyeXByaXYtPmNoYW5uZWwgPSVkLCBwZGV2X25ldHdvcmstPkRTQ29uZmlnID0gMHgleFxuIiwKLQkJIHByZWdpc3RyeXByaXYtPmNoYW5uZWwsIHBkZXZfbmV0d29yay0+RFNDb25maWcpOwotCi0JaWYgKGN1cl9uZXR3b3JrLT5uZXR3b3JrLmlmbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKLQkJcGRldl9uZXR3b3JrLT5BVElNV2luZG93ID0gMDsKLQotCXBkZXZfbmV0d29yay0+aWZtb2RlID0gY3VyX25ldHdvcmstPm5ldHdvcmsuaWZtb2RlOwotCi0JLyogIDEuIFN1cHBvcnRlZCByYXRlcyAqLwotCS8qICAyLiBJRSAqLwotCi0Jc3ogPSBydHdfZ2VuZXJhdGVfaWUyM2EocHJlZ2lzdHJ5cHJpdik7Ci0KLQlwZGV2X25ldHdvcmstPklFTGVuZ3RoID0gc3o7Ci0KLQlwZGV2X25ldHdvcmstPkxlbmd0aCA9Ci0JCWdldF93bGFuX2Jzc2lkX2V4X3N6KHBkZXZfbmV0d29yayk7Ci0KLQkvKiBub3RlczogdHJhbnNsYXRlIElFTGVuZ3RoICYgTGVuZ3RoIGFmdGVyIGFzc2lnbiB0aGUKLQkgICBMZW5ndGggdG8gY21kc3ogaW4gY3JlYXRlYnNzX2NtZCgpOyAqLwotCS8qIHBkZXZfbmV0d29yay0+SUVMZW5ndGggPSBjcHVfdG9fbGUzMihzeik7ICovCi19Ci0KLS8qIHRoZSBmdW5jdGlvbiBpcyBhdCBwYXNzaXZlX2xldmVsICovCi12b2lkIHJ0d19qb2luYnNzX3Jlc2V0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTggdGhyZXNob2xkOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IGh0X3ByaXYgKnBodHByaXYgPSAmcG1sbWVwcml2LT5odHByaXY7Ci0KLQkvKiB0b2RvOiBpZiB5b3Ugd2FudCB0byBkbyBzb21ldGhpbmcgaW8vcmVnL2h3IHNldHRpbmcKLQkgICBiZWZvcmUgam9pbl9ic3MsIHBsZWFzZSBhZGQgY29kZSBoZXJlICovCi0KLQlwbWxtZXByaXYtPm51bV9Gb3J0eU1IekludG9sZXJhbnQgPSAwOwotCi0JcG1sbWVwcml2LT5udW1fc3RhX25vX2h0ID0gMDsKLQotCXBodHByaXYtPmFtcGR1X2VuYWJsZSA9IGZhbHNlOy8qIHJlc2V0IHRvIGRpc2FibGVkICovCi0KLQkvKiAgVEggPSAxID0+IG1lYW5zIHRoYXQgaW52YWxpZGF0ZSB1c2IgcnggYWdncmVnYXRpb24gKi8KLQkvKiAgVEggPSAwID0+IG1lYW5zIHRoYXQgdmFsaWRhdGUgdXNiIHJ4IGFnZ3JlZ2F0aW9uLCB1c2UgaW5pdCB2YWx1ZS4gKi8KLQlpZiAocGh0cHJpdi0+aHRfb3B0aW9uKSB7Ci0JCWlmIChwYWRhcHRlci0+cmVnaXN0cnlwcml2LndpZmlfc3BlYyA9PSAxKQotCQkJdGhyZXNob2xkID0gMTsKLQkJZWxzZQotCQkJdGhyZXNob2xkID0gMDsKLQl9IGVsc2UKLQkJdGhyZXNob2xkID0gMTsKLQotCXJ0bDg3MjNhX3NldF9yeGRtYV9hZ2dfcGdfdGgocGFkYXB0ZXIsIHRocmVzaG9sZCk7Ci19Ci0KLS8qIHRoZSBmdW5jdGlvbiBpcyA+PSBwYXNzaXZlX2xldmVsICovCi1ib29sIHJ0d19yZXN0cnVjdHVyZV9odF9pZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqaW5faWUsCi0JCQkgICAgICB1OCAqb3V0X2llLCB1aW50IGluX2xlbiwgdWludCAqcG91dF9sZW4pCi17Ci0JdTMyIG91dF9sZW47Ci0JaW50IG1heF9yeF9hbXBkdV9mYWN0b3I7Ci0JdW5zaWduZWQgY2hhciAqcGZyYW1lOwotCWNvbnN0IHU4ICpwOwotCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwIGh0X2NhcGllOwotCXU4IFdNTV9JRVs3XSA9IHsweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAwLCAweDAxLCAweDAwfTsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBodF9wcml2ICpwaHRwcml2ID0gJnBtbG1lcHJpdi0+aHRwcml2OwotCi0JcGh0cHJpdi0+aHRfb3B0aW9uID0gZmFsc2U7Ci0KLQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9IVF9DQVBBQklMSVRZLCBpbl9pZSwgaW5fbGVuKTsKLQotCWlmIChwICYmIHBbMV0gPiAwKSB7Ci0JCXUzMiByeF9wYWNrZXRfb2Zmc2V0LCBtYXhfcmVjdmJ1Zl9zejsKLQotCQlpZiAocG1sbWVwcml2LT5xb3Nfb3B0aW9uID09IDApIHsKLQkJCW91dF9sZW4gPSAqcG91dF9sZW47Ci0JCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKG91dF9pZSArIG91dF9sZW4sCi0JCQkJCSAgICAgICBXTEFOX0VJRF9WRU5ET1JfU1BFQ0lGSUMsCi0JCQkJCSAgICAgICBzaXplb2YoV01NX0lFKSwgV01NX0lFLAotCQkJCQkgICAgICAgcG91dF9sZW4pOwotCi0JCQlwbWxtZXByaXYtPnFvc19vcHRpb24gPSAxOwotCQl9Ci0KLQkJb3V0X2xlbiA9ICpwb3V0X2xlbjsKLQotCQltZW1zZXQoJmh0X2NhcGllLCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXApKTsKLQotCQlodF9jYXBpZS5jYXBfaW5mbyA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIXzIwXzQwIHwKLQkJCUlFRUU4MDIxMV9IVF9DQVBfU0dJXzIwIHwgSUVFRTgwMjExX0hUX0NBUF9TR0lfNDAgfAotCQkJSUVFRTgwMjExX0hUX0NBUF9UWF9TVEJDIHwgSUVFRTgwMjExX0hUX0NBUF9EU1NTQ0NLNDApOwotCi0JCUdldEhhbERlZlZhcjgxOTJDVXNiKHBhZGFwdGVyLCBIQUxfREVGX1JYX1BBQ0tFVF9PRkZTRVQsCi0JCQkJICAgICAmcnhfcGFja2V0X29mZnNldCk7Ci0JCUdldEhhbERlZlZhcjgxOTJDVXNiKHBhZGFwdGVyLCBIQUxfREVGX01BWF9SRUNWQlVGX1NaLAotCQkJCSAgICAgJm1heF9yZWN2YnVmX3N6KTsKLQotCQlHZXRIYWxEZWZWYXI4MTkyQ1VzYihwYWRhcHRlciwgSFdfVkFSX01BWF9SWF9BTVBEVV9GQUNUT1IsCi0JCQkJICAgICAmbWF4X3J4X2FtcGR1X2ZhY3Rvcik7Ci0JCWh0X2NhcGllLmFtcGR1X3BhcmFtc19pbmZvID0gbWF4X3J4X2FtcGR1X2ZhY3RvciAmIDB4MDM7Ci0KLQkJaWYgKHBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFQcml2YWN5QWxncnRobSA9PQotCQkgICAgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUCkKLQkJCWh0X2NhcGllLmFtcGR1X3BhcmFtc19pbmZvIHw9Ci0JCQkJKElFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0RFTlNJVFkmICgweDA3IDw8IDIpKTsKLQkJZWxzZQotCQkJaHRfY2FwaWUuYW1wZHVfcGFyYW1zX2luZm8gfD0KLQkJCQkoSUVFRTgwMjExX0hUX0FNUERVX1BBUk1fREVOU0lUWSAmIDB4MDApOwotCi0JCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2Eob3V0X2llICsgb3V0X2xlbiwgV0xBTl9FSURfSFRfQ0FQQUJJTElUWSwKLQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSwKLQkJCQkgICAgKHVuc2lnbmVkIGNoYXIgKikmaHRfY2FwaWUsIHBvdXRfbGVuKTsKLQotCQlwaHRwcml2LT5odF9vcHRpb24gPSB0cnVlOwotCi0JCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0hUX09QRVJBVElPTiwgaW5faWUsIGluX2xlbik7Ci0JCWlmIChwICYmIChwWzFdID09IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X29wZXJhdGlvbikpKSB7Ci0JCQlvdXRfbGVuID0gKnBvdXRfbGVuOwotCQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShvdXRfaWUgKyBvdXRfbGVuLAotCQkJCQkgICAgICAgV0xBTl9FSURfSFRfT1BFUkFUSU9OLAotCQkJCQkgICAgICAgcFsxXSwgcCArIDIgLCBwb3V0X2xlbik7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcGh0cHJpdi0+aHRfb3B0aW9uOwotfQotCi0vKiB0aGUgZnVuY3Rpb24gaXMgPiBwYXNzaXZlX2xldmVsIChpbiBjcml0aWNhbF9zZWN0aW9uKSAqLwotdm9pZCBydHdfdXBkYXRlX2h0X2NhcDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcGllLCB1aW50IGllX2xlbikKLXsKLQl1OCBtYXhfYW1wZHVfc3o7Ci0JY29uc3QgdTggKnA7Ci0Jc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKnBodF9jYXBpZTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h0X29wZXJhdGlvbiAqcGh0X2FkZHRpbmZvOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IGh0X3ByaXYgKnBodHByaXYgPSAmcG1sbWVwcml2LT5odHByaXY7Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdpc3RyeXByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JaWYgKCFwaHRwcml2LT5odF9vcHRpb24pCi0JCXJldHVybjsKLQotCWlmICgoIXBtbG1laW5mby0+SFRfaW5mb19lbmFibGUpIHx8ICghcG1sbWVpbmZvLT5IVF9jYXBzX2VuYWJsZSkpCi0JCXJldHVybjsKLQotCURCR184NzIzQSgiK3J0d191cGRhdGVfaHRfY2FwMjNhKClcbiIpOwotCi0JLyogbWF5YmUgbmVlZHMgY2hlY2sgaWYgYXAgc3VwcG9ydHMgcnggYW1wZHUuICovCi0JaWYgKCFwaHRwcml2LT5hbXBkdV9lbmFibGUgJiYgcHJlZ2lzdHJ5cHJpdi0+YW1wZHVfZW5hYmxlID09IDEpIHsKLQkJaWYgKHByZWdpc3RyeXByaXYtPndpZmlfc3BlYyA9PSAxKQotCQkJcGh0cHJpdi0+YW1wZHVfZW5hYmxlID0gZmFsc2U7Ci0JCWVsc2UKLQkJCXBodHByaXYtPmFtcGR1X2VuYWJsZSA9IHRydWU7Ci0JfSBlbHNlIGlmIChwcmVnaXN0cnlwcml2LT5hbXBkdV9lbmFibGUgPT0gMikKLQkJcGh0cHJpdi0+YW1wZHVfZW5hYmxlID0gdHJ1ZTsKLQotCS8qIGNoZWNrIE1heCBSeCBBLU1QRFUgU2l6ZSAqLwotCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0hUX0NBUEFCSUxJVFksIHBpZSwgaWVfbGVuKTsKLQotCWlmIChwICYmIHBbMV0gPiAwKSB7Ci0JCXBodF9jYXBpZSA9IChzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqKShwICsgMik7Ci0JCW1heF9hbXBkdV9zeiA9IHBodF9jYXBpZS0+YW1wZHVfcGFyYW1zX2luZm8gJgotCQkJSUVFRTgwMjExX0hUX0FNUERVX1BBUk1fRkFDVE9SOwotCQkvKiAgbWF4X2FtcGR1X3N6IChrYnl0ZXMpOyAqLwotCQltYXhfYW1wZHVfc3ogPSAxIDw8IChtYXhfYW1wZHVfc3ogKyAzKTsKLQotCQlwaHRwcml2LT5yeF9hbXBkdV9tYXhsZW4gPSBtYXhfYW1wZHVfc3o7Ci0JfQotCi0JcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfSFRfT1BFUkFUSU9OLCBwaWUsIGllX2xlbik7Ci0JaWYgKHAgJiYgcFsxXSA+IDApIHsKLQkJcGh0X2FkZHRpbmZvID0gKHN0cnVjdCBpZWVlODAyMTFfaHRfb3BlcmF0aW9uICopKHAgKyAyKTsKLQkJLyogdG9kbzogKi8KLQl9Ci0KLQkvKiB1cGRhdGUgY3VyX2J3bW9kZSAmIGN1cl9jaF9vZmZzZXQgKi8KLQlpZiAocHJlZ2lzdHJ5cHJpdi0+Y2J3NDBfZW5hYmxlICYmCi0JICAgIHBtbG1laW5mby0+aHRfY2FwLmNhcF9pbmZvICYKLQkgICAgY3B1X3RvX2xlMTYoSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDApICYmCi0JICAgIHBtbG1laW5mby0+SFRfaW5mby5odF9wYXJhbSAmIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFOX1dJRFRIX0FOWSkgewotCQlpbnQgaTsKLQkJdTggcmZfdHlwZTsKLQotCQlyZl90eXBlID0gcnRsODcyM2FfZ2V0X3JmX3R5cGUocGFkYXB0ZXIpOwotCi0JCS8qIHVwZGF0ZSB0aGUgTUNTIHJhdGVzICovCi0JCWZvciAoaSA9IDA7IGkgPCBJRUVFODAyMTFfSFRfTUNTX01BU0tfTEVOOyBpKyspIHsKLQkJCWlmIChyZl90eXBlID09IFJGXzFUMVIgfHwgcmZfdHlwZSA9PSBSRl8xVDJSKQotCQkJCXBtbG1laW5mby0+aHRfY2FwLm1jcy5yeF9tYXNrW2ldICY9Ci0JCQkJCU1DU19yYXRlXzFSMjNBW2ldOwotCQkJZWxzZQotCQkJCXBtbG1laW5mby0+aHRfY2FwLm1jcy5yeF9tYXNrW2ldICY9Ci0JCQkJCU1DU19yYXRlXzJSMjNBW2ldOwotCQl9Ci0JCS8qIHN3aXRjaCB0byB0aGUgNDBNIEh6IG1vZGUgYWNjb3JkaW5nIHRvIHRoZSBBUCAqLwotCQlwbWxtZWV4dC0+Y3VyX2J3bW9kZSA9IEhUX0NIQU5ORUxfV0lEVEhfNDA7Ci0JCXN3aXRjaCAocG1sbWVpbmZvLT5IVF9pbmZvLmh0X3BhcmFtICYKLQkJCUlFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX09GRlNFVCkgewotCQljYXNlIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0FCT1ZFOgotCQkJcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQgPSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfTE9XRVI7Ci0JCQlicmVhazsKLQotCQljYXNlIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0JFTE9XOgotCQkJcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQgPSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfVVBQRVI7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQgPQotCQkJCUhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkU7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qICAqLwotCS8qICBDb25maWcgU00gUG93ZXIgU2F2ZSBzZXR0aW5nICovCi0JLyogICovCi0JcG1sbWVpbmZvLT5TTV9QUyA9Ci0JCShsZTE2X3RvX2NwdShwbWxtZWluZm8tPmh0X2NhcC5jYXBfaW5mbykgJgotCQkgSUVFRTgwMjExX0hUX0NBUF9TTV9QUykgPj4gSUVFRTgwMjExX0hUX0NBUF9TTV9QU19TSElGVDsKLQlpZiAocG1sbWVpbmZvLT5TTV9QUyA9PSBXTEFOX0hUX0NBUF9TTV9QU19TVEFUSUMpCi0JCURCR184NzIzQSgiJXMoKTogV0xBTl9IVF9DQVBfU01fUFNfU1RBVElDXG4iLCBfX2Z1bmNfXyk7Ci0KLQkvKiAgKi8KLQkvKiAgQ29uZmlnIGN1cnJlbnQgSFQgUHJvdGVjdGlvbiBtb2RlLiAqLwotCS8qICAqLwotCXBtbG1laW5mby0+SFRfcHJvdGVjdGlvbiA9Ci0JCWxlMTZfdG9fY3B1KHBtbG1laW5mby0+SFRfaW5mby5vcGVyYXRpb25fbW9kZSkgJgotCQlJRUVFODAyMTFfSFRfT1BfTU9ERV9QUk9URUNUSU9OOwotfQotCi12b2lkIHJ0d19pc3N1ZV9hZGRiYXJlcV9jbWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgICBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKLXsKLQl1OCBpc3N1ZWQ7Ci0JaW50IHByaW9yaXR5OwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQlzdHJ1Y3QgaHRfcHJpdgkqcGh0cHJpdjsKLQlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZweG1pdGZyYW1lLT5hdHRyaWI7Ci0JczMyIGJtY3N0ID0gaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocGF0dHJpYi0+cmEpOwotCi0JaWYgKGJtY3N0IHx8IHBhZGFwdGVyLT5tbG1lcHJpdi5MaW5rRGV0ZWN0SW5mby5OdW1UeE9rSW5QZXJpb2QgPCAxMDApCi0JCXJldHVybjsKLQotCXByaW9yaXR5ID0gcGF0dHJpYi0+cHJpb3JpdHk7Ci0KLQlpZiAocGF0dHJpYi0+cHN0YSkKLQkJcHN0YSA9IHBhdHRyaWItPnBzdGE7Ci0JZWxzZSB7Ci0JCURCR184NzIzQSgiJXMsIGNhbGwgcnR3X2dldF9zdGFpbmZvMjNhKClcbiIsIF9fZnVuY19fKTsKLQkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYSgmcGFkYXB0ZXItPnN0YXByaXYsIHBhdHRyaWItPnJhKTsKLQl9Ci0KLQlpZiAoIXBzdGEpIHsKLQkJREJHXzg3MjNBKCIlcywgcHN0YSA9PSBOVUxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghKHBzdGEtPnN0YXRlICZfRldfTElOS0VEKSkgewotCQlEQkdfODcyM0EoIiVzLCBwc3RhLT5zdGF0ZSgweCV4KSAhPSBfRldfTElOS0VEXG4iLAotCQkJICBfX2Z1bmNfXywgcHN0YS0+c3RhdGUpOwotCQlyZXR1cm47Ci0JfQotCi0JcGh0cHJpdiA9ICZwc3RhLT5odHByaXY7Ci0KLQlpZiAocGh0cHJpdi0+aHRfb3B0aW9uICYmIHBodHByaXYtPmFtcGR1X2VuYWJsZSkgewotCQlpc3N1ZWQgPSAocGh0cHJpdi0+YWdnX2VuYWJsZV9iaXRtYXA+PnByaW9yaXR5KSYweDE7Ci0JCWlzc3VlZCB8PSAocGh0cHJpdi0+Y2FuZGlkYXRlX3RpZF9iaXRtYXA+PnByaW9yaXR5KSYweDE7Ci0KLQkJaWYgKGlzc3VlZCA9PSAwKSB7Ci0JCQlEQkdfODcyM0EoInJ0d19pc3N1ZV9hZGRiYXJlcV9jbWQyM2EsIHAgPSVkXG4iLAotCQkJCSAgcHJpb3JpdHkpOwotCQkJcHN0YS0+aHRwcml2LmNhbmRpZGF0ZV90aWRfYml0bWFwIHw9IEJJVChwcmlvcml0eSk7Ci0JCQlydHdfYWRkYmFyZXFfY21kMjNhKHBhZGFwdGVyLCAodTgpIHByaW9yaXR5LAotCQkJCQkgICAgcGF0dHJpYi0+cmEpOwotCQl9Ci0JfQotfQotCi1pbnQgcnR3X2xpbmtlZF9jaGVjayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCWlmIChjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIFdJRklfQVBfU1RBVEUpIHx8Ci0JICAgIGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwKLQkJCSAgV0lGSV9BREhPQ19TVEFURXxXSUZJX0FESE9DX01BU1RFUl9TVEFURSkpIHsKLQkJaWYgKHBhZGFwdGVyLT5zdGFwcml2LmFzb2Nfc3RhX2NvdW50ID4gMikKLQkJCXJldHVybiB0cnVlOwotCX0gZWxzZSB7CS8qIFN0YXRpb24gbW9kZSAqLwotCQlpZiAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBfRldfTElOS0VEKSkKLQkJCXJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X21sbWVfZXh0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X21sbWVfZXh0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZDE1NDAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19tbG1lX2V4dC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEyIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX1JUV19NTE1FX0VYVF9DXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPHdpZmkuaD4KLSNpbmNsdWRlIDxydHdfbWxtZV9leHQuaD4KLSNpbmNsdWRlIDx3bGFuX2Jzc2RlZi5oPgotI2luY2x1ZGUgPG1sbWVfb3NkZXAuaD4KLSNpbmNsdWRlIDxyZWN2X29zZGVwLmg+Ci0jaW5jbHVkZSA8bGludXgvaWVlZTgwMjExLmg+Ci0jaW5jbHVkZSA8cnRsODcyM2FfaGFsLmg+Ci0KLXN0YXRpYyBpbnQgT25Bc3NvY1JlcTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwotc3RhdGljIGludCBPbkFzc29jUnNwMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdGF0aWMgaW50IE9uUHJvYmVSZXEyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLXN0YXRpYyBpbnQgT25Qcm9iZVJzcDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwotc3RhdGljIGludCBEb1Jlc2VydmVkMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdGF0aWMgaW50IE9uQmVhY29uMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdGF0aWMgaW50IE9uQXRpbTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwotc3RhdGljIGludCBPbkRpc2Fzc29jMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdGF0aWMgaW50IE9uQXV0aDIzYUNsaWVudDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwotc3RhdGljIGludCBPbkRlQXV0aDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwotc3RhdGljIGludCBPbkFjdGlvbjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwotCi1zdGF0aWMgaW50IG9uX2FjdGlvbl9zcGN0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdGF0aWMgaW50IE9uQWN0aW9uMjNhX3FvcyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwotc3RhdGljIGludCBPbkFjdGlvbjIzYV9kbHMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLXN0YXRpYyBpbnQgT25BY3Rpb24yM2FfYmFjazIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwotc3RhdGljIGludCBvbl9hY3Rpb25fcHVibGljMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdGF0aWMgaW50IE9uQWN0aW9uMjNhX2h0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdGF0aWMgaW50IE9uQWN0aW9uMjNhX3dtbShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwotc3RhdGljIGludCBPbkFjdGlvbjIzYV9wMnAoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLQotc3RhdGljIHZvaWQgaXNzdWVfYXNzb2NyZXEoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1zdGF0aWMgdm9pZCBpc3N1ZV9wcm9iZXJlcShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgc3RydWN0IGNmZzgwMjExX3NzaWQgKnBzc2lkLCB1OCAqZGEpOwotc3RhdGljIGludCBpc3N1ZV9wcm9iZXJlcV9leChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICBzdHJ1Y3QgY2ZnODAyMTFfc3NpZCAqcHNzaWQsCi0JCQkgICAgIHU4ICpkYSwgaW50IHRyeV9jbnQsIGludCB3YWl0X21zKTsKLXN0YXRpYyB2b2lkIGlzc3VlX3Byb2JlcnNwKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgKmRhKTsKLXN0YXRpYyB2b2lkIGlzc3VlX2F1dGgoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhLAotCQkgICAgICAgdW5zaWduZWQgc2hvcnQgc3RhdHVzKTsKLXN0YXRpYyBpbnQgaXNzdWVfZGVhdXRoX2V4KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpkYSwKLQkJCSAgIHVuc2lnbmVkIHNob3J0IHJlYXNvbiwgaW50IHRyeV9jbnQsIGludCB3YWl0X21zKTsKLXN0YXRpYyB2b2lkIHN0YXJ0X2NsbnRfYXNzb2Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1zdGF0aWMgdm9pZCBzdGFydF9jbG50X2F1dGgoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1zdGF0aWMgdm9pZCBzdGFydF9jbG50X2pvaW4oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1zdGF0aWMgdm9pZCBzdGFydF9jcmVhdGVfaWJzcyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXN0YXRpYyBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqY29sbGVjdF9ic3NfaW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCQkgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi1zdGF0aWMgaW50IE9uQXV0aDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwotc3RhdGljIHZvaWQgaXNzdWVfYXNzb2Nyc3Aoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdW5zaWduZWQgc2hvcnQgc3RhdHVzLAotCQkJICAgc3RydWN0IHN0YV9pbmZvICpwc3RhdCwgdTE2IHBrdF90eXBlKTsKLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IG1sbWVfaGFuZGxlciBtbG1lX3N0YV90YmxbXT17Ci0JeyJPbkFzc29jUmVxMjNhIiwJCSZPbkFzc29jUmVxMjNhfSwKLQl7Ik9uQXNzb2NSc3AyM2EiLAkJJk9uQXNzb2NSc3AyM2F9LAotCXsiT25SZUFzc29jUmVxIiwJJk9uQXNzb2NSZXEyM2F9LAotCXsiT25SZUFzc29jUnNwIiwJJk9uQXNzb2NSc3AyM2F9LAotCXsiT25Qcm9iZVJlcTIzYSIsCQkmT25Qcm9iZVJlcTIzYX0sCi0JeyJPblByb2JlUnNwMjNhIiwJCSZPblByb2JlUnNwMjNhfSwKLQotCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJCQliZWxvdyAyIGFyZSByZXNlcnZlZAotCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQl7IkRvUmVzZXJ2ZWQyM2EiLAkJJkRvUmVzZXJ2ZWQyM2F9LAotCXsiRG9SZXNlcnZlZDIzYSIsCQkmRG9SZXNlcnZlZDIzYX0sCi0JeyJPbkJlYWNvbjIzYSIsCQkmT25CZWFjb24yM2F9LAotCXsiT25BVElNIiwJCSZPbkF0aW0yM2F9LAotCXsiT25EaXNhc3NvYzIzYSIsCQkmT25EaXNhc3NvYzIzYX0sCi0JeyJPbkF1dGgyM2EiLAkJJk9uQXV0aDIzYUNsaWVudDIzYX0sCi0JeyJPbkRlQXV0aDIzYSIsCQkmT25EZUF1dGgyM2F9LAotCXsiT25BY3Rpb24yM2EiLAkJJk9uQWN0aW9uMjNhfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWN0aW9uX2hhbmRsZXIgT25BY3Rpb24yM2FfdGJsW109ewotCXtXTEFOX0NBVEVHT1JZX1NQRUNUUlVNX01HTVQsICJBQ1RJT05fU1BFQ1RSVU1fTUdNVCIsIG9uX2FjdGlvbl9zcGN0MjNhfSwKLQl7V0xBTl9DQVRFR09SWV9RT1MsICJBQ1RJT05fUU9TIiwgJk9uQWN0aW9uMjNhX3Fvc30sCi0Je1dMQU5fQ0FURUdPUllfRExTLCAiQUNUSU9OX0RMUyIsICZPbkFjdGlvbjIzYV9kbHN9LAotCXtXTEFOX0NBVEVHT1JZX0JBQ0ssICJBQ1RJT05fQkFDSyIsICZPbkFjdGlvbjIzYV9iYWNrMjNhfSwKLQl7V0xBTl9DQVRFR09SWV9QVUJMSUMsICJBQ1RJT05fUFVCTElDIiwgb25fYWN0aW9uX3B1YmxpYzIzYX0sCi0Je1dMQU5fQ0FURUdPUllfSFQsICJBQ1RJT05fSFQiLAkmT25BY3Rpb24yM2FfaHR9LAotCXtXTEFOX0NBVEVHT1JZX1NBX1FVRVJZLCAiQUNUSU9OX1NBX1FVRVJZIiwgJkRvUmVzZXJ2ZWQyM2F9LAotCXtXTEFOX0NBVEVHT1JZX1dNTSwgIkFDVElPTl9XTU0iLCAmT25BY3Rpb24yM2Ffd21tfSwKLQl7V0xBTl9DQVRFR09SWV9WRU5ET1JfU1BFQ0lGSUMsICJBQ1RJT05fUDJQIiwgJk9uQWN0aW9uMjNhX3AycH0sCi19OwotCi1zdGF0aWMgdTgJbnVsbF9hZGRyW0VUSF9BTEVOXT0gezAsIDAsIDAsIDAsIDAsIDB9OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLU9VSSBkZWZpbml0aW9ucyBmb3IgdGhlIHZlbmRvciBzcGVjaWZpYyBJRQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdW5zaWduZWQgY2hhciBXTU1fT1VJMjNBW10gPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwMn07Ci11bnNpZ25lZCBjaGFyIFdQU19PVUkyM0FbXSA9IHsweDAwLCAweDUwLCAweGYyLCAweDA0fTsKLXVuc2lnbmVkIGNoYXIgUDJQX09VSTIzQVtdID0gezB4NTAsIDB4NkYsIDB4OUEsIDB4MDl9OwotdW5zaWduZWQgY2hhciBXRkRfT1VJMjNBW10gPSB7MHg1MCwgMHg2RiwgMHg5QSwgMHgwQX07Ci0KLXVuc2lnbmVkIGNoYXIgV01NX0lORk9fT1VJMjNBW10gPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwMCwgMHgwMX07Ci11bnNpZ25lZCBjaGFyIFdNTV9QQVJBX09VSTIzQVtdID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDEsIDB4MDF9OwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBSRUFMVEVLXzk2Ql9JRVtdID0gezB4MDAsIDB4ZTAsIDB4NGMsIDB4MDIsIDB4MDEsIDB4MjB9OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLU1DUyByYXRlIGRlZmluaXRpb25zCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bnNpZ25lZCBjaGFyIE1DU19yYXRlXzJSMjNBWzE2XSA9IHsKLQkweGZmLCAweGZmLCAweDAsIDB4MCwgMHgwMSwgMHgwLCAweDAsIDB4MCwKLQkweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MH07Ci11bnNpZ25lZCBjaGFyIE1DU19yYXRlXzFSMjNBWzE2XSA9IHsKLQkweGZmLCAweDAwLCAweDAsIDB4MCwgMHgwMSwgMHgwLCAweDAsIDB4MCwKLQkweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MH07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotQ2hhbm5lbFBsYW4gZGVmaW5pdGlvbnMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHN0cnVjdCBydF9jaGFubmVsX3BsYW5fMmcgUlRXX0NoYW5uZWxQbGFuMkdbUlRfQ0hBTk5FTF9ET01BSU5fMkdfTUFYXSA9IHsKLQkvKiAgMHgwMCwgUlRfQ0hBTk5FTF9ET01BSU5fMkdfV09STEQgLCBQYXNzaXZlIHNjYW4gQ0ggMTIsIDEzICovCi0Je3sxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxM30sIDEzfSwKLQkvKiAgMHgwMSwgUlRfQ0hBTk5FTF9ET01BSU5fMkdfRVRTSTEgKi8KLQl7ezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzfSwgMTN9LAotCS8qICAweDAyLCBSVF9DSEFOTkVMX0RPTUFJTl8yR19GQ0MxICovCi0Je3sxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTF9LCAxMX0sCi0JLyogIDB4MDMsIFJUX0NIQU5ORUxfRE9NQUlOXzJHX01JS0sxICovCi0Je3sxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTR9LCAxNH0sCi0JLyogIDB4MDQsIFJUX0NIQU5ORUxfRE9NQUlOXzJHX0VUU0kyICovCi0Je3sxMCwgMTEsIDEyLCAxM30sIDR9LAotCS8qICAweDA1LCBSVF9DSEFOTkVMX0RPTUFJTl8yR19OVUxMICovCi0Je3t9LCAwfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcnRfY2hhbm5lbF9wbGFuXzVnIFJUV19DaGFubmVsUGxhbjVHW1JUX0NIQU5ORUxfRE9NQUlOXzVHX01BWF0gPSB7Ci0JLyogIDB4MDAsIFJUX0NIQU5ORUxfRE9NQUlOXzVHX05VTEwgKi8KLQl7e30sIDB9LAotCS8qICAweDAxLCBSVF9DSEFOTkVMX0RPTUFJTl81R19FVFNJMSAqLwotCXt7MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsCi0JICAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDB9LCAxOX0sCi0JLyogIDB4MDIsIFJUX0NIQU5ORUxfRE9NQUlOXzVHX0VUU0kyICovCi0Je3szNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwKLQkgIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9LCAyNH0sCi0JLyogIDB4MDMsIFJUX0NIQU5ORUxfRE9NQUlOXzVHX0VUU0kzICovCi0Je3szNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwKLQkgIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX0sIDIyfSwKLQkvKiAgMHgwNCwgUlRfQ0hBTk5FTF9ET01BSU5fNUdfRkNDMSAqLwotCXt7MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsCi0JICAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fSwgMjR9LAotCS8qICAweDA1LCBSVF9DSEFOTkVMX0RPTUFJTl81R19GQ0MyICovCi0Je3szNiwgNDAsIDQ0LCA0OCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9LCA5fSwKLQkvKiAgMHgwNiwgUlRfQ0hBTk5FTF9ET01BSU5fNUdfRkNDMyAqLwotCXt7MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX0sIDEzfSwKLQkvKiAgMHgwNywgUlRfQ0hBTk5FTF9ET01BSU5fNUdfRkNDNCAqLwotCXt7MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxNDksIDE1MywgMTU3LCAxNjF9LCAxMn0sCi0JLyogIDB4MDgsIFJUX0NIQU5ORUxfRE9NQUlOXzVHX0ZDQzUgKi8KLQl7ezE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fSwgNX0sCi0JLyogIDB4MDksIFJUX0NIQU5ORUxfRE9NQUlOXzVHX0ZDQzYgKi8KLQl7ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NH0sIDh9LAotCS8qICAweDBBLCBSVF9DSEFOTkVMX0RPTUFJTl81R19GQ0M3X0lDMSAqLwotCXt7MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsCi0JICAxMTYsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX0sIDIwfSwKLQkvKiAgMHgwQiwgUlRfQ0hBTk5FTF9ET01BSU5fNUdfS0NDMSAqLwotCXt7MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsCi0JICAxMTYsIDEyMCwgMTI0LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX0sIDIwfSwKLQkvKiAgMHgwQywgUlRfQ0hBTk5FTF9ET01BSU5fNUdfTUtLMSAqLwotCXt7MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsCi0JICAxMTYsIDEyMCwgMTI0LCAxMjgsIDEzMiwgMTM2LCAxNDB9LCAxOX0sCi0JLyogIDB4MEQsIFJUX0NIQU5ORUxfRE9NQUlOXzVHX01LSzIgKi8KLQl7ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NH0sIDh9LAotCS8qICAweDBFLCBSVF9DSEFOTkVMX0RPTUFJTl81R19NS0szICovCi0Je3sxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH0sIDExfSwKLQkvKiAgMHgwRiwgUlRfQ0hBTk5FTF9ET01BSU5fNUdfTkNDMSAqLwotCXt7NTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLCAxMTYsIDEzNiwgMTQwLCAxNDksCi0JICAxNTMsIDE1NywgMTYxLCAxNjV9LCAxNX0sCi0JLyogIDB4MTAsIFJUX0NIQU5ORUxfRE9NQUlOXzVHX05DQzIgKi8KLQl7ezU2LCA2MCwgNjQsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fSwgOH0sCi0KLQkvKiAgRHJpdmVyIHNlbGYgZGVmaW5lZCBmb3Igb2xkIGNoYW5uZWwgcGxhbiBDb21wYXRpYmxlLAotCSAgICBSZW1lbWJlciB0byBtb2RpZnkgaWYgaGF2ZSBuZXcgY2hhbm5lbCBwbGFuIGRlZmluaXRpb24gPT09PT0gKi8KLQkvKiAgMHgxMSwgUlRfQ0hBTk5FTF9ET01BSU5fNUdfRkNDICovCi0Je3szNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwKLQkgIDExNiwgMTMyLCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9LCAyMX0sCi0JLyogIDB4MTIsIFJUX0NIQU5ORUxfRE9NQUlOXzVHX0pBUEFOX05PX0RGUyAqLwotCXt7MzYsIDQwLCA0NCwgNDh9LCA0fSwKLQkvKiAgMHgxMywgUlRfQ0hBTk5FTF9ET01BSU5fNUdfRkNDNF9OT19ERlMgKi8KLQl7ezM2LCA0MCwgNDQsIDQ4LCAxNDksIDE1MywgMTU3LCAxNjF9LCA4fSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcnRfY2hhbm5lbF9wbGFuX21hcCBSVFdfQ2hhbm5lbFBsYW5NYXBbUlRfQ0hBTk5FTF9ET01BSU5fTUFYXSA9IHsKLQkvKiAgMHgwMCB+IDB4MUYgLCBPbGQgRGVmaW5lID09PT09ICovCi0JezB4MDIsIDB4MTF9LAkvKiAweDAwLCBSVF9DSEFOTkVMX0RPTUFJTl9GQ0MgKi8KLQl7MHgwMiwgMHgwQX0sCS8qIDB4MDEsIFJUX0NIQU5ORUxfRE9NQUlOX0lDICovCi0JezB4MDEsIDB4MDF9LAkvKiAweDAyLCBSVF9DSEFOTkVMX0RPTUFJTl9FVFNJICovCi0JezB4MDEsIDB4MDB9LAkvKiAweDAzLCBSVF9DSEFOTkVMX0RPTUFJTl9TUEFJTiAqLwotCXsweDAxLCAweDAwfSwJLyogMHgwNCwgUlRfQ0hBTk5FTF9ET01BSU5fRlJBTkNFICovCi0JezB4MDMsIDB4MDB9LAkvKiAweDA1LCBSVF9DSEFOTkVMX0RPTUFJTl9NS0sgKi8KLQl7MHgwMywgMHgwMH0sCS8qIDB4MDYsIFJUX0NIQU5ORUxfRE9NQUlOX01LSzEgKi8KLQl7MHgwMSwgMHgwOX0sCS8qIDB4MDcsIFJUX0NIQU5ORUxfRE9NQUlOX0lTUkFFTCAqLwotCXsweDAzLCAweDA5fSwJLyogMHgwOCwgUlRfQ0hBTk5FTF9ET01BSU5fVEVMRUMgKi8KLQl7MHgwMywgMHgwMH0sCS8qIDB4MDksIFJUX0NIQU5ORUxfRE9NQUlOX0dMT0JBTF9ET0FNSU4gKi8KLQl7MHgwMCwgMHgwMH0sCS8qIDB4MEEsIFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX1dJREVfMTMgKi8KLQl7MHgwMiwgMHgwRn0sCS8qIDB4MEIsIFJUX0NIQU5ORUxfRE9NQUlOX1RBSVdBTiAqLwotCXsweDAxLCAweDA4fSwJLyogMHgwQywgUlRfQ0hBTk5FTF9ET01BSU5fQ0hJTkEgKi8KLQl7MHgwMiwgMHgwNn0sCS8qIDB4MEQsIFJUX0NIQU5ORUxfRE9NQUlOX1NJTkdBUE9SRV9JTkRJQV9NRVhJQ08gKi8KLQl7MHgwMiwgMHgwQn0sCS8qIDB4MEUsIFJUX0NIQU5ORUxfRE9NQUlOX0tPUkVBICovCi0JezB4MDIsIDB4MDl9LAkvKiAweDBGLCBSVF9DSEFOTkVMX0RPTUFJTl9UVVJLRVkgKi8KLQl7MHgwMSwgMHgwMX0sCS8qIDB4MTAsIFJUX0NIQU5ORUxfRE9NQUlOX0pBUEFOICovCi0JezB4MDIsIDB4MDV9LAkvKiAweDExLCBSVF9DSEFOTkVMX0RPTUFJTl9GQ0NfTk9fREZTICovCi0JezB4MDEsIDB4MTJ9LAkvKiAweDEyLCBSVF9DSEFOTkVMX0RPTUFJTl9KQVBBTl9OT19ERlMgKi8KLQl7MHgwMCwgMHgwNH0sCS8qIDB4MTMsIFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX1dJREVfNUcgKi8KLQl7MHgwMiwgMHgxMH0sCS8qIDB4MTQsIFJUX0NIQU5ORUxfRE9NQUlOX1RBSVdBTl9OT19ERlMgKi8KLQl7MHgwMCwgMHgxMn0sCS8qIDB4MTUsIFJUX0NIQU5ORUxfRE9NQUlOX0VUU0lfTk9fREZTICovCi0JezB4MDAsIDB4MTN9LAkvKiAweDE2LCBSVF9DSEFOTkVMX0RPTUFJTl9LT1JFQV9OT19ERlMgKi8KLQl7MHgwMywgMHgxMn0sCS8qIDB4MTcsIFJUX0NIQU5ORUxfRE9NQUlOX0pBUEFOX05PX0RGUyAqLwotCXsweDA1LCAweDA4fSwJLyogMHgxOCwgUlRfQ0hBTk5FTF9ET01BSU5fUEFLSVNUQU5fTk9fREZTICovCi0JezB4MDIsIDB4MDh9LAkvKiAweDE5LCBSVF9DSEFOTkVMX0RPTUFJTl9UQUlXQU4yX05PX0RGUyAqLwotCXsweDAwLCAweDAwfSwJLyogMHgxQSwgKi8KLQl7MHgwMCwgMHgwMH0sCS8qIDB4MUIsICovCi0JezB4MDAsIDB4MDB9LAkvKiAweDFDLCAqLwotCXsweDAwLCAweDAwfSwJLyogMHgxRCwgKi8KLQl7MHgwMCwgMHgwMH0sCS8qIDB4MUUsICovCi0JezB4MDUsIDB4MDR9LAkvKiAweDFGLCBSVF9DSEFOTkVMX0RPTUFJTl9XT1JMRF9XSURFX09OTFlfNUcgKi8KLQkvKiAgMHgyMCB+IDB4N0YgLCBOZXcgRGVmaW5lID09PT09ICovCi0JezB4MDAsIDB4MDB9LAkvKiAweDIwLCBSVF9DSEFOTkVMX0RPTUFJTl9XT1JMRF9OVUxMICovCi0JezB4MDEsIDB4MDB9LAkvKiAweDIxLCBSVF9DSEFOTkVMX0RPTUFJTl9FVFNJMV9OVUxMICovCi0JezB4MDIsIDB4MDB9LAkvKiAweDIyLCBSVF9DSEFOTkVMX0RPTUFJTl9GQ0MxX05VTEwgKi8KLQl7MHgwMywgMHgwMH0sCS8qIDB4MjMsIFJUX0NIQU5ORUxfRE9NQUlOX01LSzFfTlVMTCAqLwotCXsweDA0LCAweDAwfSwJLyogMHgyNCwgUlRfQ0hBTk5FTF9ET01BSU5fRVRTSTJfTlVMTCAqLwotCXsweDAyLCAweDA0fSwJLyogMHgyNSwgUlRfQ0hBTk5FTF9ET01BSU5fRkNDMV9GQ0MxICovCi0JezB4MDAsIDB4MDF9LAkvKiAweDI2LCBSVF9DSEFOTkVMX0RPTUFJTl9XT1JMRF9FVFNJMSAqLwotCXsweDAzLCAweDBDfSwJLyogMHgyNywgUlRfQ0hBTk5FTF9ET01BSU5fTUtLMV9NS0sxICovCi0JezB4MDAsIDB4MEJ9LAkvKiAweDI4LCBSVF9DSEFOTkVMX0RPTUFJTl9XT1JMRF9LQ0MxICovCi0JezB4MDAsIDB4MDV9LAkvKiAweDI5LCBSVF9DSEFOTkVMX0RPTUFJTl9XT1JMRF9GQ0MyICovCi0JezB4MDAsIDB4MDB9LAkvKiAweDJBLCAqLwotCXsweDAwLCAweDAwfSwJLyogMHgyQiwgKi8KLQl7MHgwMCwgMHgwMH0sCS8qIDB4MkMsICovCi0JezB4MDAsIDB4MDB9LAkvKiAweDJELCAqLwotCXsweDAwLCAweDAwfSwJLyogMHgyRSwgKi8KLQl7MHgwMCwgMHgwMH0sCS8qIDB4MkYsICovCi0JezB4MDAsIDB4MDZ9LAkvKiAweDMwLCBSVF9DSEFOTkVMX0RPTUFJTl9XT1JMRF9GQ0MzICovCi0JezB4MDAsIDB4MDd9LAkvKiAweDMxLCBSVF9DSEFOTkVMX0RPTUFJTl9XT1JMRF9GQ0M0ICovCi0JezB4MDAsIDB4MDh9LAkvKiAweDMyLCBSVF9DSEFOTkVMX0RPTUFJTl9XT1JMRF9GQ0M1ICovCi0JezB4MDAsIDB4MDl9LAkvKiAweDMzLCBSVF9DSEFOTkVMX0RPTUFJTl9XT1JMRF9GQ0M2ICovCi0JezB4MDIsIDB4MEF9LAkvKiAweDM0LCBSVF9DSEFOTkVMX0RPTUFJTl9GQ0MxX0ZDQzcgKi8KLQl7MHgwMCwgMHgwMn0sCS8qIDB4MzUsIFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX0VUU0kyICovCi0JezB4MDAsIDB4MDN9LAkvKiAweDM2LCBSVF9DSEFOTkVMX0RPTUFJTl9XT1JMRF9FVFNJMyAqLwotCXsweDAzLCAweDBEfSwJLyogMHgzNywgUlRfQ0hBTk5FTF9ET01BSU5fTUtLMV9NS0syICovCi0JezB4MDMsIDB4MEV9LAkvKiAweDM4LCBSVF9DSEFOTkVMX0RPTUFJTl9NS0sxX01LSzMgKi8KLQl7MHgwMiwgMHgwRn0sCS8qIDB4MzksIFJUX0NIQU5ORUxfRE9NQUlOX0ZDQzFfTkNDMSAqLwotCXsweDAwLCAweDAwfSwJLyogMHgzQSwgKi8KLQl7MHgwMCwgMHgwMH0sCS8qIDB4M0IsICovCi0JezB4MDAsIDB4MDB9LAkvKiAweDNDLCAqLwotCXsweDAwLCAweDAwfSwJLyogMHgzRCwgKi8KLQl7MHgwMCwgMHgwMH0sCS8qIDB4M0UsICovCi0JezB4MDAsIDB4MDB9LAkvKiAweDNGLCAqLwotCXsweDAyLCAweDEwfSwJLyogMHg0MCwgUlRfQ0hBTk5FTF9ET01BSU5fRkNDMV9OQ0MyICovCi0JezB4MDMsIDB4MDB9LAkvKiAweDQxLCBSVF9DSEFOTkVMX0RPTUFJTl9HTE9CQUxfRE9BTUlOXzJHICovCi19OwotCi1zdGF0aWMgc3RydWN0IHJ0X2NoYW5uZWxfcGxhbl9tYXAgUlRXX0NIQU5ORUxfUExBTl9NQVBfUkVBTFRFS19ERUZJTkUgPQotezB4MDMsIDB4MDJ9OyAvKiB1c2UgdGhlIGNvbmJpbmF0aW9uIGZvciBtYXggY2hhbm5lbCBudW1iZXJzICovCi0KLXN0YXRpYyB2b2lkIGR1bW15X2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZndldmVudCB3bGFuZXZlbnRzW10gPQotewotCXswLCAmZHVtbXlfZXZlbnRfY2FsbGJhY2t9LAkvKjAqLwotCXswLCBOVUxMfSwKLQl7MCwgTlVMTH0sCi0JezAsIE5VTEx9LAotCXswLCBOVUxMfSwKLQl7MCwgTlVMTH0sCi0JezAsIE5VTEx9LAotCXswLCBOVUxMfSwKLQl7MCwgJnJ0d19zdXJ2ZXlfZXZlbnRfY2IyM2F9LAkJLyo4Ki8KLQl7c2l6ZW9mIChzdHJ1Y3Qgc3VydmV5ZG9uZV9ldmVudCksICZydHdfc3VydmV5ZG9uZV9ldmVudF9jYWxsYmFjazIzYX0sCi0JezAsICZydHcyM2Ffam9pbmJzc19ldmVudF9jYn0sCQkvKjEwKi8KLQl7c2l6ZW9mKHN0cnVjdCBzdGFzc29jX2V2ZW50KSwgJnJ0d19zdGFzc29jX2V2ZW50X2NhbGxiYWNrMjNhfSwKLQl7c2l6ZW9mKHN0cnVjdCBzdGFkZWxfZXZlbnQpLCAmcnR3X3N0YWRlbF9ldmVudF9jYWxsYmFjazIzYX0sCi0JezAsICZkdW1teV9ldmVudF9jYWxsYmFja30sCi0JezAsICZkdW1teV9ldmVudF9jYWxsYmFja30sCi0JezAsIE5VTEx9LAkvKjE1Ki8KLQl7MCwgTlVMTH0sCi0JezAsIE5VTEx9LAotCXswLCBOVUxMfSwKLQl7MCwgJmR1bW15X2V2ZW50X2NhbGxiYWNrfSwKLQl7MCwgTlVMTH0sCSAvKjIwKi8KLQl7MCwgTlVMTH0sCi0JezAsIE5VTEx9LAotCXswLCAmZHVtbXlfZXZlbnRfY2FsbGJhY2t9LAotCXswLCBOVUxMfSwKLX07Ci0KLQotc3RhdGljIHZvaWQgcnR3X2NvcnJlY3RfVFNGKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JaHdfdmFyX3NldF9jb3JyZWN0X3RzZihwYWRhcHRlcik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ydHdfdXBkYXRlX1RTRihzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQsIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCkKLXsKLQlwbWxtZWV4dC0+VFNGVmFsdWUgPSBnZXRfdW5hbGlnbmVkX2xlNjQoJm1nbXQtPnUuYmVhY29uLnRpbWVzdGFtcCk7Ci19Ci0KLS8qCi0gKiBTZWFyY2ggdGhlIEBwYXJhbSBjaGFubmVsX251bSBpbiBnaXZlbiBAcGFyYW0gY2hhbm5lbF9zZXQKLSAqIEBjaF9zZXQ6IHRoZSBnaXZlbiBjaGFubmVsIHNldAotICogQGNoOiB0aGUgZ2l2ZW4gY2hhbm5lbCBudW1iZXIKLSAqCi0gKiByZXR1cm4gdGhlIGluZGV4IG9mIGNoYW5uZWxfbnVtIGluIGNoYW5uZWxfc2V0LCAtMSBpZiBub3QgZm91bmQKLSAqLwotaW50IHJ0d19jaF9zZXRfc2VhcmNoX2NoMjNhKHN0cnVjdCBydF9jaGFubmVsX2luZm8gKmNoX3NldCwgY29uc3QgdTMyIGNoKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgY2hfc2V0W2ldLiBDaGFubmVsTnVtICE9IDA7IGkrKykgewotCQlpZiAoY2ggPT0gY2hfc2V0W2ldLkNoYW5uZWxOdW0pCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoaSA+PSBjaF9zZXRbaV0uQ2hhbm5lbE51bSkKLQkJcmV0dXJuIC0xOwotCXJldHVybiBpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1Gb2xsb3dpbmcgYXJlIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgZm9yIFdpRmkgTUxNRQotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW50IGluaXRfaHdfbWxtZV9leHQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCi0Jc2V0X2NoYW5uZWxfYndtb2RlMjNhKHBhZGFwdGVyLCBwbWxtZWV4dC0+Y3VyX2NoYW5uZWwsCi0JCQkgICAgICBwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCwgcG1sbWVleHQtPmN1cl9id21vZGUpOwotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIHZvaWQgaW5pdF9tbG1lX2V4dF9wcml2MjNhX3ZhbHVlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQl1bnNpZ25lZCBjaGFyCW1peGVkX2RhdGFyYXRlW051bVJhdGVzXSA9IHsKLQkJXzFNX1JBVEVfLCBfMk1fUkFURV8sIF81TV9SQVRFXywgXzExTV9SQVRFXywgXzZNX1JBVEVfLAotCQlfOU1fUkFURV8sIF8xMk1fUkFURV8sIF8xOE1fUkFURV8sIF8yNE1fUkFURV8sIF8zNk1fUkFURV8sCi0JCV80OE1fUkFURV8sIF81NE1fUkFURV8sIDB4ZmZ9OwotCXVuc2lnbmVkIGNoYXIJbWl4ZWRfYmFzaWNyYXRlW051bVJhdGVzXSA9IHsKLQkJXzFNX1JBVEVfLCBfMk1fUkFURV8sIF81TV9SQVRFXywgXzExTV9SQVRFXywgXzZNX1JBVEVfLAotCQlfMTJNX1JBVEVfLCBfMjRNX1JBVEVfLCAweGZmLH07Ci0KLQlhdG9taWNfc2V0KCZwbWxtZWV4dC0+ZXZlbnRfc2VxLCAwKTsKLQkvKiByZXNldCB0byB6ZXJvIHdoZW4gZGlzY29ubmVjdCBhdCBjbGllbnQgbW9kZSAqLwotCXBtbG1lZXh0LT5tZ250X3NlcSA9IDA7Ci0KLQlwbWxtZWV4dC0+Y3VyX2NoYW5uZWwgPSBwYWRhcHRlci0+cmVnaXN0cnlwcml2LmNoYW5uZWw7Ci0JcG1sbWVleHQtPmN1cl9id21vZGUgPSBIVF9DSEFOTkVMX1dJRFRIXzIwOwotCXBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0ID0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRTsKLQotCXBtbG1lZXh0LT5yZXRyeSA9IDA7Ci0KLQlwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgPSBwYWRhcHRlci0+cmVnaXN0cnlwcml2LndpcmVsZXNzX21vZGU7Ci0KLQltZW1jcHkocG1sbWVleHQtPmRhdGFyYXRlLCBtaXhlZF9kYXRhcmF0ZSwgTnVtUmF0ZXMpOwotCW1lbWNweShwbWxtZWV4dC0+YmFzaWNyYXRlLCBtaXhlZF9iYXNpY3JhdGUsIE51bVJhdGVzKTsKLQotCWlmIChwbWxtZWV4dC0+Y3VyX2NoYW5uZWwgPiAxNCkKLQkJcG1sbWVleHQtPnR4X3JhdGUgPSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQjsKLQllbHNlCi0JCXBtbG1lZXh0LT50eF9yYXRlID0gSUVFRTgwMjExX0NDS19SQVRFXzFNQjsKLQotCXBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5zdGF0ZSA9IFNDQU5fRElTQUJMRTsKLQlwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuY2hhbm5lbF9pZHggPSAwOwotCXBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5ic3NfY250ID0gMDsKLQlwbWxtZWV4dC0+c2Nhbl9hYm9ydCA9IGZhbHNlOwotCi0JcG1sbWVpbmZvLT5zdGF0ZSA9IE1TUl9OT0xJTks7Ci0JcG1sbWVpbmZvLT5yZWF1dGhfY291bnQgPSAwOwotCXBtbG1laW5mby0+cmVhc3NvY19jb3VudCA9IDA7Ci0JcG1sbWVpbmZvLT5saW5rX2NvdW50ID0gMDsKLQlwbWxtZWluZm8tPmF1dGhfc2VxID0gMDsKLQlwbWxtZWluZm8tPmF1dGhfYWxnbyA9IGRvdDExQXV0aEFsZ3J0aG1fT3BlbjsKLQlwbWxtZWluZm8tPmtleV9pbmRleCA9IDA7Ci0JcG1sbWVpbmZvLT5pdiA9IDA7Ci0KLQlwbWxtZWluZm8tPmVuY19hbGdvID0gMDsKLQlwbWxtZWluZm8tPmF1dGhNb2RlVG9nZ2xlID0gMDsKLQotCW1lbXNldChwbWxtZWluZm8tPmNoZ190eHQsIDAsIDEyOCk7Ci0KLQlwbWxtZWluZm8tPnNsb3RUaW1lID0gU0hPUlRfU0xPVF9USU1FOwotCXBtbG1laW5mby0+cHJlYW1ibGVfbW9kZSA9IFBSRUFNQkxFX0FVVE87Ci0KLQlwbWxtZWluZm8tPmRpYWxvZ1Rva2VuID0gMDsKLQotCXBtbG1lZXh0LT5hY3Rpb25fcHVibGljX3J4c2VxID0gMHhmZmZmOwotCXBtbG1lZXh0LT5hY3Rpb25fcHVibGljX2RpYWxvZ190b2tlbiA9IDB4ZmY7Ci19Ci0KLXN0YXRpYyBpbnQgaGFzX2NoYW5uZWwoc3RydWN0IHJ0X2NoYW5uZWxfaW5mbyAqY2hhbm5lbF9zZXQsCi0JCSAgICAgICB1OCBjaGFuc2V0X3NpemUsIHU4IGNoYW4pIHsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBjaGFuc2V0X3NpemU7IGkrKykgewotCQlpZiAoY2hhbm5lbF9zZXRbaV0uQ2hhbm5lbE51bSA9PSBjaGFuKQotCQkJcmV0dXJuIDE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGluaXRfY2hhbm5lbF9saXN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICBzdHJ1Y3QgcnRfY2hhbm5lbF9pbmZvICpjaGFubmVsX3NldCwKLQkJCSAgICAgIHU4IGNoYW5zZXRfc2l6ZSwKLQkJCSAgICAgIHN0cnVjdCBwMnBfY2hhbm5lbHMgKmNoYW5uZWxfbGlzdCkKLXsKLQlzdHJ1Y3QgcDJwX29wZXJfY2xhc3NfbWFwIG9wX2NsYXNzW10gPSB7Ci0JCXsgSUVFRTgwMjExRywgIDgxLCAgIDEsICAxMywgIDEsIEJXMjAgfSwKLQkJeyBJRUVFODAyMTFHLCAgODIsICAxNCwgIDE0LCAgMSwgQlcyMCB9LAotCQl7IElFRUU4MDIxMUEsIDExNSwgIDM2LCAgNDgsICA0LCBCVzIwIH0sCi0JCXsgSUVFRTgwMjExQSwgMTE2LCAgMzYsICA0NCwgIDgsIEJXNDBQTFVTIH0sCi0JCXsgSUVFRTgwMjExQSwgMTE3LCAgNDAsICA0OCwgIDgsIEJXNDBNSU5VUyB9LAotCQl7IElFRUU4MDIxMUEsIDEyNCwgMTQ5LCAxNjEsICA0LCBCVzIwIH0sCi0JCXsgSUVFRTgwMjExQSwgMTI1LCAxNDksIDE2OSwgIDQsIEJXMjAgfSwKLQkJeyBJRUVFODAyMTFBLCAxMjYsIDE0OSwgMTU3LCAgOCwgQlc0MFBMVVMgfSwKLQkJeyBJRUVFODAyMTFBLCAxMjcsIDE1MywgMTYxLCAgOCwgQlc0ME1JTlVTIH0sCi0JCXsgLTEsIDAsIDAsIDAsIDAsIEJXMjAgfQotCX07Ci0KLQlpbnQgY2xhLCBvcDsKLQotCWNsYSA9IDA7Ci0KLQlmb3IgKG9wID0gMDsgb3BfY2xhc3Nbb3BdLm9wX2NsYXNzOyBvcCsrKSB7Ci0JCXU4IGNoOwotCQlzdHJ1Y3QgcDJwX29wZXJfY2xhc3NfbWFwICpvID0gJm9wX2NsYXNzW29wXTsKLQkJc3RydWN0IHAycF9yZWdfY2xhc3MgKnJlZyA9IE5VTEw7Ci0KLQkJZm9yIChjaCA9IG8tPm1pbl9jaGFuOyBjaCA8PSBvLT5tYXhfY2hhbjsgY2ggKz0gby0+aW5jKSB7Ci0JCQlpZiAoIWhhc19jaGFubmVsKGNoYW5uZWxfc2V0LCBjaGFuc2V0X3NpemUsIGNoKSkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKCgwID09IHBhZGFwdGVyLT5yZWdpc3RyeXByaXYuaHRfZW5hYmxlKSAmJgotCQkJICAgIChvLT5pbmMgPT0gOCkpCi0JCQkJY29udGludWU7Ci0KLQkJCWlmICgoMCA9PSAocGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5jYnc0MF9lbmFibGUgJiBCSVQoMSkpKSAmJgotCQkJCSgoQlc0ME1JTlVTID09IG8tPmJ3KSB8fCAoQlc0MFBMVVMgPT0gby0+YncpKSkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKHJlZyA9PSBOVUxMKSB7Ci0JCQkJcmVnID0gJmNoYW5uZWxfbGlzdC0+cmVnX2NsYXNzW2NsYV07Ci0JCQkJY2xhKys7Ci0JCQkJcmVnLT5yZWdfY2xhc3MgPSBvLT5vcF9jbGFzczsKLQkJCQlyZWctPmNoYW5uZWxzID0gMDsKLQkJCX0KLQkJCXJlZy0+Y2hhbm5lbFtyZWctPmNoYW5uZWxzXSA9IGNoOwotCQkJcmVnLT5jaGFubmVscysrOwotCQl9Ci0JfQotCWNoYW5uZWxfbGlzdC0+cmVnX2NsYXNzZXMgPSBjbGE7Ci19Ci0KLXN0YXRpYyB1OCBpbml0X2NoYW5uZWxfc2V0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGNwbGFuLAotCQkJICAgc3RydWN0IHJ0X2NoYW5uZWxfaW5mbyAqY19zZXQpCi17Ci0JdTggaSwgY2hfc2l6ZSA9IDA7Ci0JdTggYjVHQmFuZCA9IGZhbHNlLCBiMl80R0JhbmQgPSBmYWxzZTsKLQl1OCBJbmRleDJHID0gMCwgSW5kZXg1RyA9IDA7Ci0KLQltZW1zZXQoY19zZXQsIDAsIHNpemVvZihzdHJ1Y3QgcnRfY2hhbm5lbF9pbmZvKSAqIE1BWF9DSEFOTkVMX05VTSk7Ci0KLQlpZiAoY3BsYW4gPj0gUlRfQ0hBTk5FTF9ET01BSU5fTUFYICYmCi0JICAgIGNwbGFuICE9IFJUX0NIQU5ORUxfRE9NQUlOX1JFQUxURUtfREVGSU5FKSB7Ci0JCURCR184NzIzQSgiQ2hhbm5lbFBsYW4gSUQgJXggZXJyb3IgISEhISFcbiIsIGNwbGFuKTsKLQkJcmV0dXJuIGNoX3NpemU7Ci0JfQotCi0JaWYgKHBhZGFwdGVyLT5yZWdpc3RyeXByaXYud2lyZWxlc3NfbW9kZSAmIFdJUkVMRVNTXzExRykgewotCQliMl80R0JhbmQgPSB0cnVlOwotCQlpZiAoUlRfQ0hBTk5FTF9ET01BSU5fUkVBTFRFS19ERUZJTkUgPT0gY3BsYW4pCi0JCQlJbmRleDJHID0gUlRXX0NIQU5ORUxfUExBTl9NQVBfUkVBTFRFS19ERUZJTkUuSW5kZXgyRzsKLQkJZWxzZQotCQkJSW5kZXgyRyA9IFJUV19DaGFubmVsUGxhbk1hcFtjcGxhbl0uSW5kZXgyRzsKLQl9Ci0KLQlpZiAocGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi53aXJlbGVzc19tb2RlICYgV0lSRUxFU1NfMTFBKSB7Ci0JCWI1R0JhbmQgPSB0cnVlOwotCQlpZiAoUlRfQ0hBTk5FTF9ET01BSU5fUkVBTFRFS19ERUZJTkUgPT0gY3BsYW4pCi0JCQlJbmRleDVHID0gUlRXX0NIQU5ORUxfUExBTl9NQVBfUkVBTFRFS19ERUZJTkUuSW5kZXg1RzsKLQkJZWxzZQotCQkJSW5kZXg1RyA9IFJUV19DaGFubmVsUGxhbk1hcFtjcGxhbl0uSW5kZXg1RzsKLQl9Ci0KLQlpZiAoYjJfNEdCYW5kKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBSVFdfQ2hhbm5lbFBsYW4yR1tJbmRleDJHXS5MZW47IGkrKykgewotCQkJY19zZXRbY2hfc2l6ZV0uQ2hhbm5lbE51bSA9Ci0JCQkJUlRXX0NoYW5uZWxQbGFuMkdbSW5kZXgyR10uQ2hhbm5lbFtpXTsKLQotCQkJaWYgKChSVF9DSEFOTkVMX0RPTUFJTl9HTE9CQUxfRE9BTUlOID09IGNwbGFuKSB8fAotCQkJICAgIC8qIENoYW5uZWwgMX4xMSBpcyBhY3RpdmUsIGFuZCAxMn4xNCBpcyBwYXNzaXZlICovCi0JCQkgICAgUlRfQ0hBTk5FTF9ET01BSU5fR0xPQkFMX0RPQU1JTl8yRyA9PSBjcGxhbikgewotCQkJCWlmIChjX3NldFtjaF9zaXplXS5DaGFubmVsTnVtID49IDEgJiYKLQkJCQkgICAgY19zZXRbY2hfc2l6ZV0uQ2hhbm5lbE51bSA8PSAxMSkKLQkJCQkJY19zZXRbY2hfc2l6ZV0uU2NhblR5cGUgPSBTQ0FOX0FDVElWRTsKLQkJCQllbHNlIGlmIChjX3NldFtjaF9zaXplXS5DaGFubmVsTnVtID49IDEyICYmCi0JCQkJCSBjX3NldFtjaF9zaXplXS5DaGFubmVsTnVtICA8PSAxNCkKLQkJCQkJY19zZXRbY2hfc2l6ZV0uU2NhblR5cGUgPSBTQ0FOX1BBU1NJVkU7Ci0JCQl9IGVsc2UgaWYgKFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX1dJREVfMTMgPT0gY3BsYW4gfHwKLQkJCQkgICBSVF9DSEFOTkVMX0RPTUFJTl9XT1JMRF9XSURFXzVHID09IGNwbGFuIHx8Ci0JCQkJICAgUlRfQ0hBTk5FTF9ET01BSU5fMkdfV09STEQgPT0gSW5kZXgyRykgewotCQkJCS8qICBjaGFubmVsIDEyfjEzLCBwYXNzaXZlIHNjYW4gKi8KLQkJCQlpZiAoY19zZXRbY2hfc2l6ZV0uQ2hhbm5lbE51bSA8PSAxMSkKLQkJCQkJY19zZXRbY2hfc2l6ZV0uU2NhblR5cGUgPSBTQ0FOX0FDVElWRTsKLQkJCQllbHNlCi0JCQkJCWNfc2V0W2NoX3NpemVdLlNjYW5UeXBlID0gU0NBTl9QQVNTSVZFOwotCQkJfSBlbHNlCi0JCQkJY19zZXRbY2hfc2l6ZV0uU2NhblR5cGUgPSBTQ0FOX0FDVElWRTsKLQotCQkJY2hfc2l6ZSsrOwotCQl9Ci0JfQotCi0JaWYgKGI1R0JhbmQpIHsKLQkJZm9yIChpID0gMDsgaSA8IFJUV19DaGFubmVsUGxhbjVHW0luZGV4NUddLkxlbjsgaSsrKSB7Ci0JCQlpZiAoUlRXX0NoYW5uZWxQbGFuNUdbSW5kZXg1R10uQ2hhbm5lbFtpXSA8PSA0OCB8fAotCQkJICAgIFJUV19DaGFubmVsUGxhbjVHW0luZGV4NUddLkNoYW5uZWxbaV0gPj0gMTQ5KSB7Ci0JCQkJY19zZXRbY2hfc2l6ZV0uQ2hhbm5lbE51bSA9Ci0JCQkJCVJUV19DaGFubmVsUGxhbjVHW0luZGV4NUddLkNoYW5uZWxbaV07Ci0JCQkJaWYgKFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX1dJREVfNUcgPT0gY3BsYW4pIHsKLQkJCQkJLyogcGFzc2l2ZSBzY2FuIGZvciBhbGwgNUcgY2hhbm5lbHMgKi8KLQkJCQkJY19zZXRbY2hfc2l6ZV0uU2NhblR5cGUgPQotCQkJCQkJU0NBTl9QQVNTSVZFOwotCQkJCX0gZWxzZQotCQkJCQljX3NldFtjaF9zaXplXS5TY2FuVHlwZSA9Ci0JCQkJCQlTQ0FOX0FDVElWRTsKLQkJCQlEQkdfODcyM0EoIiVzKCk6IGNoYW5uZWxfc2V0WyVkXS5DaGFubmVsTnVtID0gIgotCQkJCQkgICIlZFxuIiwgX19mdW5jX18sIGNoX3NpemUsCi0JCQkJCSAgY19zZXRbY2hfc2l6ZV0uQ2hhbm5lbE51bSk7Ci0JCQkJY2hfc2l6ZSsrOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIGNoX3NpemU7Ci19Ci0KLWludCBpbml0X21sbWVfZXh0X3ByaXYyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCXBtbG1lZXh0LT5wYWRhcHRlciA9IHBhZGFwdGVyOwotCi0JaW5pdF9tbG1lX2V4dF9wcml2MjNhX3ZhbHVlKHBhZGFwdGVyKTsKLQlwbWxtZWluZm8tPmJBY2NlcHRBZGRiYVJlcSA9IHByZWdpc3RyeXByaXYtPmJBY2NlcHRBZGRiYVJlcTsKLQotCWluaXRfbWxtZV9leHRfdGltZXIyM2EocGFkYXB0ZXIpOwotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0JaW5pdF9tbG1lX2FwX2luZm8yM2EocGFkYXB0ZXIpOwotI2VuZGlmCi0KLQlwbWxtZWV4dC0+bWF4X2NoYW5fbnVtcyA9IGluaXRfY2hhbm5lbF9zZXQocGFkYXB0ZXIsCi0JCQkJCQkgICBwbWxtZXByaXYtPkNoYW5uZWxQbGFuLAotCQkJCQkJICAgcG1sbWVleHQtPmNoYW5uZWxfc2V0KTsKLQlpbml0X2NoYW5uZWxfbGlzdChwYWRhcHRlciwgcG1sbWVleHQtPmNoYW5uZWxfc2V0LAotCQkJICBwbWxtZWV4dC0+bWF4X2NoYW5fbnVtcywgJnBtbG1lZXh0LT5jaGFubmVsX2xpc3QpOwotCi0JcG1sbWVleHQtPmNoYW5fc2Nhbl90aW1lID0gU1VSVkVZX1RPOwotCXBtbG1lZXh0LT5tbG1lZXh0X2luaXQgPSB0cnVlOwotCi0JcG1sbWVleHQtPmFjdGl2ZV9rZWVwX2FsaXZlX2NoZWNrID0gdHJ1ZTsKLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXZvaWQgZnJlZV9tbG1lX2V4dF9wcml2MjNhIChzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IHBtbG1lZXh0LT5wYWRhcHRlcjsKLQotCWlmICghcGFkYXB0ZXIpCi0JCXJldHVybjsKLQotCWlmIChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPT0gdHJ1ZSkgewotCQlkZWxfdGltZXJfc3luYygmcG1sbWVleHQtPnN1cnZleV90aW1lcik7Ci0JCWRlbF90aW1lcl9zeW5jKCZwbWxtZWV4dC0+bGlua190aW1lcik7Ci0JCS8qIGRlbF90aW1lcl9zeW5jKCZwbWxtZWV4dC0+QUREQkFfdGltZXIpOyAqLwotCX0KLX0KLQotc3RhdGljIHZvaWQKLV9tZ3RfZGlzcGF0Y2hlcjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgbWxtZV9oYW5kbGVyICpwdGFibGUsCi0JCSAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZfZnJhbWUtPnBrdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKLQotCWlmIChwdGFibGUtPmZ1bmMpIHsKLQkJLyogcmVjZWl2ZSB0aGUgZnJhbWVzIHRoYXQgcmEoYTEpIGlzIG15IGFkZHJlc3MKLQkJICAgb3IgcmEoYTEpIGlzIGJjIGFkZHJlc3MuICovCi0JCWlmICghZXRoZXJfYWRkcl9lcXVhbChoZHItPmFkZHIxLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdikpJiYKLQkJICAgICFpc19icm9hZGNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSkKLQkJCXJldHVybjsKLQotCQlwdGFibGUtPmZ1bmMocGFkYXB0ZXIsIHByZWN2X2ZyYW1lKTsKLQl9Ci19Ci0KLXZvaWQgbWd0X2Rpc3BhdGNoZXIyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQlzdHJ1Y3QgbWxtZV9oYW5kbGVyICpwdGFibGU7Ci0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLSNlbmRpZiAvKiBDT05GSUdfODcyM0FVX0FQX01PREUgKi8KLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZfZnJhbWUtPnBrdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIHNrYi0+ZGF0YTsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0JdTE2IHN0eXBlOwotCWludCBpbmRleDsKLQotCWlmICghaWVlZTgwMjExX2lzX21nbXQobWdtdC0+ZnJhbWVfY29udHJvbCkpCi0JCXJldHVybjsKLQotCS8qIHJlY2VpdmUgdGhlIGZyYW1lcyB0aGF0IHJhKGExKSBpcyBteSBhZGRyZXNzIG9yIHJhKGExKSBpcwotCSAgIGJjIGFkZHJlc3MuICovCi0JaWYgKCFldGhlcl9hZGRyX2VxdWFsKG1nbXQtPmRhLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdikpICYmCi0JICAgICFpc19icm9hZGNhc3RfZXRoZXJfYWRkcihtZ210LT5kYSkpCi0JCXJldHVybjsKLQotCXB0YWJsZSA9IG1sbWVfc3RhX3RibDsKLQotCXN0eXBlID0gbGUxNl90b19jcHUobWdtdC0+ZnJhbWVfY29udHJvbCkgJiBJRUVFODAyMTFfRkNUTF9TVFlQRTsKLQlpbmRleCA9IHN0eXBlID4+IDQ7Ci0KLQlpZiAoaW5kZXggPiAxMykgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICJDdXJyZW50bHkgd2UgZG8gbm90IHN1cHBvcnQgcmVzZXJ2ZWQgc3ViLWZyLXR5cGUgPSVkXG4iLAotCQkJIGluZGV4KTsKLQkJcmV0dXJuOwotCX0KLQlwdGFibGUgKz0gaW5kZXg7Ci0KLQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKCZwYWRhcHRlci0+c3RhcHJpdiwgbWdtdC0+c2EpOwotCi0JaWYgKHBzdGEpIHsKLQkJaWYgKGllZWU4MDIxMV9oYXNfcmV0cnkobWdtdC0+ZnJhbWVfY29udHJvbCkpIHsKLQkJCWlmIChwcmVjdl9mcmFtZS0+YXR0cmliLnNlcV9udW0gPT0KLQkJCSAgICBwc3RhLT5SeE1nbXRGcmFtZVNlcU51bSkgewotCQkJCS8qIGRyb3AgdGhlIGR1cGxpY2F0ZSBtYW5hZ2VtZW50IGZyYW1lICovCi0JCQkJREJHXzg3MjNBKCJEcm9wIGR1cGxpY2F0ZSBtYW5hZ2VtZW50IGZyYW1lICIKLQkJCQkJICAid2l0aCBzZXFfbnVtID0gJWQuXG4iLAotCQkJCQkgIHByZWN2X2ZyYW1lLT5hdHRyaWIuc2VxX251bSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXBzdGEtPlJ4TWdtdEZyYW1lU2VxTnVtID0gcHJlY3ZfZnJhbWUtPmF0dHJpYi5zZXFfbnVtOwotCX0KLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCXN3aXRjaCAoc3R5cGUpIHsKLQljYXNlIElFRUU4MDIxMV9TVFlQRV9BVVRIOgotCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpKQotCQkJcHRhYmxlLT5mdW5jID0gJk9uQXV0aDIzYTsKLQkJZWxzZQotCQkJcHRhYmxlLT5mdW5jID0gJk9uQXV0aDIzYUNsaWVudDIzYTsKLQkJLyogcGFzcyB0aHJvdWdoICovCi0JY2FzZSBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVROgotCWNhc2UgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVROgotCQlfbWd0X2Rpc3BhdGNoZXIyM2EocGFkYXB0ZXIsIHB0YWJsZSwgcHJlY3ZfZnJhbWUpOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVE6Ci0JCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpCi0JCQlfbWd0X2Rpc3BhdGNoZXIyM2EocGFkYXB0ZXIsIHB0YWJsZSwgcHJlY3ZfZnJhbWUpOwotCQllbHNlCi0JCQlfbWd0X2Rpc3BhdGNoZXIyM2EocGFkYXB0ZXIsIHB0YWJsZSwgcHJlY3ZfZnJhbWUpOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9TVFlQRV9CRUFDT046Ci0JCV9tZ3RfZGlzcGF0Y2hlcjIzYShwYWRhcHRlciwgcHRhYmxlLCBwcmVjdl9mcmFtZSk7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FDVElPTjoKLQkJLyogaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkgKi8KLQkJX21ndF9kaXNwYXRjaGVyMjNhKHBhZGFwdGVyLCBwdGFibGUsIHByZWN2X2ZyYW1lKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJX21ndF9kaXNwYXRjaGVyMjNhKHBhZGFwdGVyLCBwdGFibGUsIHByZWN2X2ZyYW1lKTsKLQkJYnJlYWs7Ci0JfQotI2Vsc2UKLQlfbWd0X2Rpc3BhdGNoZXIyM2EocGFkYXB0ZXIsIHB0YWJsZSwgcHJlY3ZfZnJhbWUpOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLUZvbGxvd2luZyBhcmUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyBmb3IgZWFjaCBzdWJ0eXBlIG9mIHRoZSBtYW5hZ2VtZW50IGZyYW1lcwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludAotT25Qcm9iZVJlcTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0JY29uc3QgdTggKmllOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqY3VyID0gJnBtbG1laW5mby0+bmV0d29yazsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZfZnJhbWUtPnBrdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIHNrYi0+ZGF0YTsKLQlpbnQgbGVuID0gc2tiLT5sZW47Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkpCi0JCXJldHVybiBfU1VDQ0VTUzsKLQotCWlmICghY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpICYmCi0JICAgICFjaGVja19md3N0YXRlKHBtbG1lcHJpdiwKLQkJCSAgIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFIHwgV0lGSV9BUF9TVEFURSkpCi0JCXJldHVybiBfU1VDQ0VTUzsKLQotCWlmICh1bmxpa2VseSghaWVlZTgwMjExX2lzX3Byb2JlX3JlcShtZ210LT5mcmFtZV9jb250cm9sKSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlY2VpdmVkIG5vbiBwcm9iZSByZXF1ZXN0IGZyYW1lXG4iLAotCQkgICAgICAgX19mdW5jX18pOwotCQlyZXR1cm4gX0ZBSUw7Ci0JfQotCi0JbGVuIC09IG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5wcm9iZV9yZXEudmFyaWFibGUpOwotCi0JaWUgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX1NTSUQsIG1nbXQtPnUucHJvYmVfcmVxLnZhcmlhYmxlLCBsZW4pOwotCi0JLyogY2hlY2sgKHdpbGRjYXJkKSBTU0lEICovCi0JaWYgKCFpZSkKLQkJZ290byBvdXQ7Ci0KLQlpZiAoKGllWzFdICYmIG1lbWNtcChpZSArIDIsIGN1ci0+U3NpZC5zc2lkLCBjdXItPlNzaWQuc3NpZF9sZW4pKSB8fAotCSAgICAoaWVbMV0gPT0gMCAmJiBwbWxtZWluZm8tPmhpZGRlbl9zc2lkX21vZGUpKSB7Ci0JCXJldHVybiBfU1VDQ0VTUzsKLQl9Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpICYmCi0JICAgIHBtbG1lcHJpdi0+Y3VyX25ldHdvcmsuam9pbl9yZXMpCi0JCWlzc3VlX3Byb2JlcnNwKHBhZGFwdGVyLCBtZ210LT5zYSk7Ci0KLW91dDoKLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQKLU9uUHJvYmVSc3AyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0KLQlpZiAocG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnN0YXRlID09IFNDQU5fUFJPQ0VTUykgewotCQlyZXBvcnRfc3VydmV5X2V2ZW50MjNhKHBhZGFwdGVyLCBwcmVjdl9mcmFtZSk7Ci0JCXJldHVybiBfU1VDQ0VTUzsKLQl9Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQKLU9uQmVhY29uMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQlpbnQgY2FtX2lkeDsKLQlzdHJ1Y3Qgc3RhX2luZm8JKnBzdGE7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBzdGFfcHJpdgkqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByZWN2X2ZyYW1lLT5wa3Q7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKSBza2ItPmRhdGE7Ci0JaW50IHBrdF9sZW4gPSBza2ItPmxlbjsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcGJzczsKLQlpbnQgcmV0ID0gX1NVQ0NFU1M7Ci0JdTggKnAsICpwaWU7Ci0JaW50IHBpZV9sZW47Ci0JdTMyIGllbGVuID0gMDsKLQotCXBpZSA9IG1nbXQtPnUuYmVhY29uLnZhcmlhYmxlOwotCXBpZV9sZW4gPSBwa3RfbGVuIC0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LmJlYWNvbi52YXJpYWJsZSk7Ci0JcCA9IHJ0d19nZXRfaWUyM2EocGllLCBXTEFOX0VJRF9FWFRfU1VQUF9SQVRFUywgJmllbGVuLCBwaWVfbGVuKTsKLQlpZiAocCAmJiBpZWxlbiA+IDApIHsKLQkJaWYgKHBbMSArIGllbGVuXSA9PSAweDJEICYmIHBbMiArIGllbGVuXSAhPSAweDJEKSB7Ci0JCQkvKiBJbnZhbGlkIHZhbHVlIDB4MkQgaXMgZGV0ZWN0ZWQgaW4gRXh0ZW5kZWQgU3VwcG9ydGVkCi0JCQkgKiBSYXRlcyAoRVNSKSBJRS4gVHJ5IHRvIGZpeCB0aGUgSUUgbGVuZ3RoIHRvIGF2b2lkCi0JCQkgKiBmYWlsZWQgQmVhY29uIHBhcnNpbmcuCi0JCQkgKi8KLQkJCURCR184NzIzQSgiW1dJRklEQkddIEVycm9yIGluIEVTUiBJRSBpcyBkZXRlY3RlZCBpbiAiCi0JCQkJICAiQmVhY29uIG9mIEJTU0lEOiAlcE0uIEZpeCB0aGUgbGVuZ3RoIG9mICIKLQkJCQkgICJFU1IgSUUgdG8gYXZvaWQgZmFpbGVkIEJlYWNvbiBwYXJzaW5nLlxuIiwKLQkJCQkgIG1nbXQtPmJzc2lkKTsKLQkJCXBbMV0gPSBpZWxlbiAtIDE7Ci0JCX0KLQl9Ci0KLQlpZiAocG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnN0YXRlID09IFNDQU5fUFJPQ0VTUykgewotCQlyZXBvcnRfc3VydmV5X2V2ZW50MjNhKHBhZGFwdGVyLCBwcmVjdl9mcmFtZSk7Ci0JCXJldHVybiBfU1VDQ0VTUzsKLQl9Ci0KLQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwobWdtdC0+YnNzaWQsCi0JCQkgICAgICBnZXRfbXlfYnNzaWQyM2EoJnBtbG1laW5mby0+bmV0d29yaykpKQotCQlnb3RvIG91dDsKLQotCWlmIChwbWxtZWluZm8tPnN0YXRlICYgV0lGSV9GV19BVVRIX05VTEwpIHsKLQkJLyogd2Ugc2hvdWxkIHVwZGF0ZSBjdXJyZW50IG5ldHdvcmsgYmVmb3JlIGF1dGgsCi0JCSAgIG9yIHNvbWUgSUUgaXMgd3JvbmcgKi8KLQkJcGJzcyA9IGNvbGxlY3RfYnNzX2luZm8ocGFkYXB0ZXIsIHByZWN2X2ZyYW1lKTsKLQkJaWYgKHBic3MpIHsKLQkJCXVwZGF0ZV9uZXR3b3JrMjNhKCZwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmssIHBic3MsCi0JCQkJCSAgcGFkYXB0ZXIsIHRydWUpOwotCQkJcnR3X2dldF9iY25faW5mbzIzYSgmcG1sbWVwcml2LT5jdXJfbmV0d29yayk7Ci0JCQlrZnJlZShwYnNzKTsKLQkJfQotCi0JCS8qIGNoZWNrIHRoZSB2ZW5kb3Igb2YgdGhlIGFzc29jIEFQICovCi0JCXBtbG1laW5mby0+YXNzb2NfQVBfdmVuZG9yID0KLQkJCWNoZWNrX2Fzc29jX0FQMjNhKCh1OCAqKSZtZ210LT51LmJlYWNvbiwgcGt0X2xlbiAtCi0JCQkJCSAgb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1KSk7Ci0KLQkJLyogdXBkYXRlIFRTRiBWYWx1ZSAqLwotCQlydHdfdXBkYXRlX1RTRihwbWxtZWV4dCwgbWdtdCk7Ci0KLQkJLyogc3RhcnQgYXV0aCAqLwotCQlzdGFydF9jbG50X2F1dGgocGFkYXB0ZXIpOwotCi0JCXJldHVybiBfU1VDQ0VTUzsKLQl9Ci0KLQlpZiAoKChwbWxtZWluZm8tPnN0YXRlICYgMHgwMykgPT0gTVNSX0FQKSAmJgotCSAgICAocG1sbWVpbmZvLT5zdGF0ZSAmIFdJRklfRldfQVNTT0NfU1VDQ0VTUykpIHsKLQkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgbWdtdC0+c2EpOwotCQlpZiAocHN0YSkgewotCQkJcmV0ID0gcnR3X2NoZWNrX2Jjbl9pbmZvMjNhKHBhZGFwdGVyLCBtZ210LCBwa3RfbGVuKTsKLQkJCWlmIChyZXQgIT0gX1NVQ0NFU1MpIHsKLQkJCQlEQkdfODcyM0FfTEVWRUwoX2Rydl9hbHdheXNfLCAiYXAgaGFzIGNoYW5nZWQsICIKLQkJCQkJCSJkaXNjb25uZWN0IG5vd1xuIik7Ci0JCQkJcmVjZWl2ZV9kaXNjb25uZWN0MjNhKHBhZGFwdGVyLCBwbWxtZWluZm8tPm5ldHdvcmsuTWFjQWRkcmVzcywgNjU1MzUpOwotCQkJCXJldHVybiBfU1VDQ0VTUzsKLQkJCX0KLQkJCS8qIHVwZGF0ZSBXTU0sIEVSUCBpbiB0aGUgYmVhY29uICovCi0JCQkvKiB0b2RvOiB0aGUgdGltZXIgaXMgdXNlZCBpbnN0ZWFkIG9mCi0JCQkgICB0aGUgbnVtYmVyIG9mIHRoZSBiZWFjb24gcmVjZWl2ZWQgKi8KLQkJCWlmICgoc3RhX3J4X3BrdHMocHN0YSkgJiAweGYpID09IDApIHsKLQkJCQkvKiBEQkdfODcyM0EoInVwZGF0ZV9iY25faW5mb1xuIik7ICovCi0JCQkJdXBkYXRlX2JlYWNvbjIzYV9pbmZvKHBhZGFwdGVyLCBtZ210LAotCQkJCQkJICAgICAgcGt0X2xlbiwgcHN0YSk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKChwbWxtZWluZm8tPnN0YXRlJjB4MDMpID09IE1TUl9BREhPQykgewotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBtZ210LT5zYSk7Ci0JCWlmIChwc3RhKSB7Ci0JCQkvKiB1cGRhdGUgV01NLCBFUlAgaW4gdGhlIGJlYWNvbiAqLwotCQkJLyogdG9kbzogdGhlIHRpbWVyIGlzIHVzZWQgaW5zdGVhZCBvZiB0aGUKLQkJCSAgIG51bWJlciBvZiB0aGUgYmVhY29uIHJlY2VpdmVkICovCi0JCQlpZiAoKHN0YV9yeF9wa3RzKHBzdGEpICYgMHhmKSA9PSAwKSB7Ci0JCQkJLyogREJHXzg3MjNBKCJ1cGRhdGVfYmNuX2luZm9cbiIpOyAqLwotCQkJCXVwZGF0ZV9iZWFjb24yM2FfaW5mbyhwYWRhcHRlciwgbWdtdCwKLQkJCQkJCSAgICAgIHBrdF9sZW4sIHBzdGEpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLyogYWxsb2NhdGUgYSBuZXcgQ0FNIGVudHJ5IGZvciBJQlNTIHN0YXRpb24gKi8KLQkJCWNhbV9pZHggPSBhbGxvY2F0ZV9md19zdGFfZW50cnkyM2EocGFkYXB0ZXIpOwotCQkJaWYgKGNhbV9pZHggPT0gTlVNX1NUQSkKLQkJCQlnb3RvIG91dDsKLQotCQkJLyogZ2V0IHN1cHBvcnRlZCByYXRlICovCi0JCQlpZiAodXBkYXRlX3N0YV9zdXBwb3J0X3JhdGUyM2EocGFkYXB0ZXIsIHBpZSwgcGllX2xlbiwKLQkJCQkJCSAgICAgICBjYW1faWR4KSA9PSBfRkFJTCkgewotCQkJCXBtbG1laW5mby0+Rldfc3RhX2luZm9bY2FtX2lkeF0uc3RhdHVzID0gMDsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQotCQkJLyogdXBkYXRlIFRTRiBWYWx1ZSAqLwotCQkJcnR3X3VwZGF0ZV9UU0YocG1sbWVleHQsIG1nbXQpOwotCi0JCQkvKiByZXBvcnQgc3RhIGFkZCBldmVudCAqLwotCQkJcmVwb3J0X2FkZF9zdGFfZXZlbnQyM2EocGFkYXB0ZXIsIG1nbXQtPnNhLAotCQkJCQkJY2FtX2lkeCk7Ci0JCX0KLQl9Ci0KLW91dDoKLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotc3RhdGljIGludAotT25BdXRoMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQlzdGF0aWMgc3RydWN0IHN0YV9pbmZvIHN0YXQ7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhdCA9IE5VTEw7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByZWN2X2ZyYW1lLT5wa3Q7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKSBza2ItPmRhdGE7Ci0JdTggKnBmcmFtZTsKLQljb25zdCB1OCAqcDsKLQl1bnNpZ25lZCBjaGFyICpzYTsKLQl1MTYgYXV0aF9tb2RlLCBzZXEsIGFsZ29yaXRobTsKLQlpbnQgc3RhdHVzLCBsZW4gPSBza2ItPmxlbjsKLQotCWlmICgocG1sbWVpbmZvLT5zdGF0ZSAmIDB4MDMpICE9IE1TUl9BUCkKLQkJcmV0dXJuIF9GQUlMOwotCi0JREJHXzg3MjNBKCIrT25BdXRoMjNhXG4iKTsKLQotCXNhID0gbWdtdC0+c2E7Ci0KLQlhdXRoX21vZGUgPSBwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtOwotCi0JcGZyYW1lID0gbWdtdC0+dS5hdXRoLnZhcmlhYmxlOwotCWxlbiA9IHNrYi0+bGVuIC0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LmF1dGgudmFyaWFibGUpOwotCi0Jc2VxID0gbGUxNl90b19jcHUobWdtdC0+dS5hdXRoLmF1dGhfdHJhbnNhY3Rpb24pOwotCWFsZ29yaXRobSA9IGxlMTZfdG9fY3B1KG1nbXQtPnUuYXV0aC5hdXRoX2FsZyk7Ci0KLQlEQkdfODcyM0EoImF1dGggYWxnID0leCwgc2VxID0lWFxuIiwgYWxnb3JpdGhtLCBzZXEpOwotCi0JaWYgKGF1dGhfbW9kZSA9PSAyICYmCi0JICAgIHBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gIT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgJiYKLQkgICAgcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSAhPSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQpCi0JCWF1dGhfbW9kZSA9IDA7Ci0KLQkvKiAgcnggYSBzaGFyZWQta2V5IGF1dGggYnV0IHNoYXJlZCBub3QgZW5hYmxlZCwgb3IgKi8KLQkvKiAgcnggYSBvcGVuLXN5c3RlbSBhdXRoIGJ1dCBzaGFyZWQta2V5IGlzIGVuYWJsZWQgKi8KLQlpZiAoKGFsZ29yaXRobSAhPSBXTEFOX0FVVEhfT1BFTiAmJiBhdXRoX21vZGUgPT0gMCkgfHwKLQkgICAgKGFsZ29yaXRobSA9PSBXTEFOX0FVVEhfT1BFTiAmJiBhdXRoX21vZGUgPT0gMSkpIHsKLQkJREJHXzg3MjNBKCJhdXRoIHJlamVjdGVkIGR1ZSB0byBiYWQgYWxnIFthbGcgPSVkLCBhdXRoX21pYiAiCi0JCQkgICI9JWRdICUwMlglMDJYJTAyWCUwMlglMDJYJTAyWFxuIiwKLQkJCSAgYWxnb3JpdGhtLCBhdXRoX21vZGUsCi0JCQkgIHNhWzBdLCBzYVsxXSwgc2FbMl0sIHNhWzNdLCBzYVs0XSwgc2FbNV0pOwotCi0JCXN0YXR1cyA9IFdMQU5fU1RBVFVTX05PVF9TVVBQT1JURURfQVVUSF9BTEc7Ci0KLQkJZ290byBhdXRoX2ZhaWw7Ci0JfQotCi0JaWYgKHJ0d19hY2Nlc3NfY3RybDIzYShwYWRhcHRlciwgc2EpID09IGZhbHNlKSB7Ci0JCXN0YXR1cyA9IFdMQU5fU1RBVFVTX0FQX1VOQUJMRV9UT19IQU5ETEVfTkVXX1NUQTsKLQkJZ290byBhdXRoX2ZhaWw7Ci0JfQotCi0JcHN0YXQgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIHNhKTsKLQlpZiAoIXBzdGF0KSB7Ci0JCS8qICBhbGxvY2F0ZSBhIG5ldyBvbmUgKi8KLQkJREJHXzg3MjNBKCJnb2luZyB0byBhbGxvYyBzdGFpbmZvIGZvciBzYSA9JXBNXG4iLCBzYSk7Ci0JCXBzdGF0ID0gcnR3X2FsbG9jX3N0YWluZm8yM2EocHN0YXByaXYsIHNhLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFwc3RhdCkgewotCQkJREJHXzg3MjNBKCIgRXhjZWVkIHRoZSB1cHBlciBsaW1pdCBvZiBzdXBwb3J0ZWQgIgotCQkJCSAgImNsaWVudHMuLi5cbiIpOwotCQkJc3RhdHVzID0gV0xBTl9TVEFUVVNfQVBfVU5BQkxFX1RPX0hBTkRMRV9ORVdfU1RBOwotCQkJZ290byBhdXRoX2ZhaWw7Ci0JCX0KLQotCQlwc3RhdC0+c3RhdGUgPSBXSUZJX0ZXX0FVVEhfTlVMTDsKLQkJcHN0YXQtPmF1dGhfc2VxID0gMDsKLQotCQkvKiBwc3RhdC0+ZmxhZ3MgPSAwOyAqLwotCQkvKiBwc3RhdC0+Y2FwYWJpbGl0eSA9IDA7ICovCi0JfSBlbHNlIHsKLQkJc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwotCQlpZiAoIWxpc3RfZW1wdHkoJnBzdGF0LT5hc29jX2xpc3QpKSB7Ci0JCQlsaXN0X2RlbF9pbml0KCZwc3RhdC0+YXNvY19saXN0KTsKLQkJCXBzdGFwcml2LT5hc29jX2xpc3RfY250LS07Ci0JCQlpZiAocHN0YXQtPmV4cGlyZV90byA+IDApIHsKLQkJCQkvKiBUT0RPOiBTVEEgcmVfYXV0aCB3aXRoaW4gZXhwaXJlX3RvICovCi0JCQl9Ci0JCX0KLQkJc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0KLQkJaWYgKHNlcSA9PSAxKSB7Ci0JCQkvKiBUT0RPOiBTVEEgcmVfYXV0aCBhbmQgYXV0aCB0aW1lb3V0ICovCi0JCX0KLQl9Ci0KLQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5hdXRoX2xpc3RfbG9jayk7Ci0JaWYgKGxpc3RfZW1wdHkoJnBzdGF0LT5hdXRoX2xpc3QpKSB7Ci0JCWxpc3RfYWRkX3RhaWwoJnBzdGF0LT5hdXRoX2xpc3QsICZwc3RhcHJpdi0+YXV0aF9saXN0KTsKLQkJcHN0YXByaXYtPmF1dGhfbGlzdF9jbnQrKzsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5hdXRoX2xpc3RfbG9jayk7Ci0KLQlpZiAocHN0YXQtPmF1dGhfc2VxID09IDApCi0JCXBzdGF0LT5leHBpcmVfdG8gPSBwc3RhcHJpdi0+YXV0aF90bzsKLQotCWlmICgocHN0YXQtPmF1dGhfc2VxICsgMSkgIT0gc2VxKSB7Ci0JCURCR184NzIzQSgiKDEpYXV0aCByZWplY3RlZCBiZWNhdXNlIG91dCBvZiBzZXEgW3J4X3NlcSA9JWQsICIKLQkJCSAgImV4cF9zZXEgPSVkXSFcbiIsIHNlcSwgcHN0YXQtPmF1dGhfc2VxKzEpOwotCQlzdGF0dXMgPSBXTEFOX1NUQVRVU19VTktOT1dOX0FVVEhfVFJBTlNBQ1RJT047Ci0JCWdvdG8gYXV0aF9mYWlsOwotCX0KLQotCWlmIChhbGdvcml0aG0gPT0gV0xBTl9BVVRIX09QRU4gJiYgKGF1dGhfbW9kZSA9PSAwIHx8IGF1dGhfbW9kZSA9PSAyKSkgewotCQlpZiAoc2VxID09IDEpIHsKLQkJCXBzdGF0LT5zdGF0ZSAmPSB+V0lGSV9GV19BVVRIX05VTEw7Ci0JCQlwc3RhdC0+c3RhdGUgfD0gV0lGSV9GV19BVVRIX1NVQ0NFU1M7Ci0JCQlwc3RhdC0+ZXhwaXJlX3RvID0gcHN0YXByaXYtPmFzc29jX3RvOwotCQkJcHN0YXQtPmF1dGhhbGcgPSBhbGdvcml0aG07Ci0JCX0gZWxzZSB7Ci0JCQlEQkdfODcyM0EoIigyKWF1dGggcmVqZWN0ZWQgYmVjYXVzZSBvdXQgb2Ygc2VxICIKLQkJCQkgICJbcnhfc2VxID0lZCwgZXhwX3NlcSA9JWRdIVxuIiwKLQkJCQkgIHNlcSwgcHN0YXQtPmF1dGhfc2VxKzEpOwotCQkJc3RhdHVzID0gV0xBTl9TVEFUVVNfVU5LTk9XTl9BVVRIX1RSQU5TQUNUSU9OOwotCQkJZ290byBhdXRoX2ZhaWw7Ci0JCX0KLQl9IGVsc2UgeyAvKiAgc2hhcmVkIHN5c3RlbSBvciBhdXRvIGF1dGhlbnRpY2F0aW9uICovCi0JCWlmIChzZXEgPT0gMSkgewotCQkJLyogcHJlcGFyZSBmb3IgdGhlIGNoYWxsZW5naW5nIHR4dC4uLiAqLwotCQkJcHN0YXQtPnN0YXRlICY9IH5XSUZJX0ZXX0FVVEhfTlVMTDsKLQkJCXBzdGF0LT5zdGF0ZSB8PSBXSUZJX0ZXX0FVVEhfU1RBVEU7Ci0JCQlwc3RhdC0+YXV0aGFsZyA9IGFsZ29yaXRobTsKLQkJCXBzdGF0LT5hdXRoX3NlcSA9IDI7Ci0JCX0gZWxzZSBpZiAoc2VxID09IDMpIHsKLQkJCS8qIGNoZWNraW5nIGZvciBjaGFsbGVuZ2luZyB0eHQuLi4gKi8KLQkJCURCR184NzIzQSgiY2hlY2tpbmcgZm9yIGNoYWxsZW5naW5nIHR4dC4uLlxuIik7Ci0KLQkJCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0NIQUxMRU5HRSwgcGZyYW1lLCBsZW4pOwotCQkJaWYgKCFwIHx8IHBbMV0gPD0gMCkgewotCQkJCURCR184NzIzQSgiYXV0aCByZWplY3RlZCBiZWNhdXNlIGNoYWxsZW5nZSAiCi0JCQkJCSAgImZhaWx1cmUhKDEpXG4iKTsKLQkJCQlzdGF0dXMgPSBXTEFOX1NUQVRVU19DSEFMTEVOR0VfRkFJTDsKLQkJCQlnb3RvIGF1dGhfZmFpbDsKLQkJCX0KLQotCQkJaWYgKCFtZW1jbXAocCArIDIsIHBzdGF0LT5jaGdfdHh0LCAxMjgpKSB7Ci0JCQkJcHN0YXQtPnN0YXRlICY9IH5XSUZJX0ZXX0FVVEhfU1RBVEU7Ci0JCQkJcHN0YXQtPnN0YXRlIHw9IFdJRklfRldfQVVUSF9TVUNDRVNTOwotCQkJCS8qICBjaGFsbGVuZ2luZyB0eHQgaXMgY29ycmVjdC4uLiAqLwotCQkJCXBzdGF0LT5leHBpcmVfdG8gPSAgcHN0YXByaXYtPmFzc29jX3RvOwotCQkJfSBlbHNlIHsKLQkJCQlEQkdfODcyM0EoImF1dGggcmVqZWN0ZWQgYmVjYXVzZSBjaGFsbGVuZ2UgIgotCQkJCQkgICJmYWlsdXJlIVxuIik7Ci0JCQkJc3RhdHVzID0gV0xBTl9TVEFUVVNfQ0hBTExFTkdFX0ZBSUw7Ci0JCQkJZ290byBhdXRoX2ZhaWw7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlEQkdfODcyM0EoIigzKWF1dGggcmVqZWN0ZWQgYmVjYXVzZSBvdXQgb2Ygc2VxICIKLQkJCQkgICJbcnhfc2VxID0lZCwgZXhwX3NlcSA9JWRdIVxuIiwKLQkJCQkgIHNlcSwgcHN0YXQtPmF1dGhfc2VxKzEpOwotCQkJc3RhdHVzID0gV0xBTl9TVEFUVVNfVU5LTk9XTl9BVVRIX1RSQU5TQUNUSU9OOwotCQkJZ290byBhdXRoX2ZhaWw7Ci0JCX0KLQl9Ci0KLQkvKiAgTm93LCB3ZSBhcmUgZ29pbmcgdG8gaXNzdWVfYXV0aC4uLiAqLwotCXBzdGF0LT5hdXRoX3NlcSA9IHNlcSArIDE7Ci0KLQlpc3N1ZV9hdXRoKHBhZGFwdGVyLCBwc3RhdCwgV0xBTl9TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlpZiAocHN0YXQtPnN0YXRlICYgV0lGSV9GV19BVVRIX1NVQ0NFU1MpCi0JCXBzdGF0LT5hdXRoX3NlcSA9IDA7Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci0KLWF1dGhfZmFpbDoKLQotCWlmIChwc3RhdCkKLQkJcnR3X2ZyZWVfc3RhaW5mbzIzYShwYWRhcHRlciwgcHN0YXQpOwotCi0JcHN0YXQgPSAmc3RhdDsKLQltZW1zZXQoKGNoYXIgKilwc3RhdCwgJ1wwJywgc2l6ZW9mKHN0YXQpKTsKLQlwc3RhdC0+YXV0aF9zZXEgPSAyOwotCWV0aGVyX2FkZHJfY29weShwc3RhdC0+aHdhZGRyLCBzYSk7Ci0KLQlpc3N1ZV9hdXRoKHBhZGFwdGVyLCBwc3RhdCwgKHVuc2lnbmVkIHNob3J0KXN0YXR1cyk7Ci0KLQlyZXR1cm4gX0ZBSUw7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludAotT25BdXRoMjNhQ2xpZW50MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQl1bnNpZ25lZCBpbnQgc2VxLCBzdGF0dXMsIGFsZ3RobTsKLQl1bnNpZ25lZCBpbnQgZ28yYXNvYyA9IDA7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZfZnJhbWUtPnBrdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIHNrYi0+ZGF0YTsKLQljb25zdCB1OCAqcDsKLQl1OCAqcGllOwotCWludCBwbGVuID0gc2tiLT5sZW47Ci0KLQlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQkvKiBjaGVjayBBMSBtYXRjaGVzIG9yIG5vdCAqLwotCWlmICghZXRoZXJfYWRkcl9lcXVhbChteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdiksIG1nbXQtPmRhKSkKLQkJcmV0dXJuIF9TVUNDRVNTOwotCi0JaWYgKCEocG1sbWVpbmZvLT5zdGF0ZSAmIFdJRklfRldfQVVUSF9TVEFURSkpCi0JCXJldHVybiBfU1VDQ0VTUzsKLQotCXBpZSA9IG1nbXQtPnUuYXV0aC52YXJpYWJsZTsKLQlwbGVuIC09IG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5hdXRoLnZhcmlhYmxlKTsKLQotCWFsZ3RobSA9IGxlMTZfdG9fY3B1KG1nbXQtPnUuYXV0aC5hdXRoX2FsZyk7Ci0Jc2VxID0gbGUxNl90b19jcHUobWdtdC0+dS5hdXRoLmF1dGhfdHJhbnNhY3Rpb24pOwotCXN0YXR1cyA9IGxlMTZfdG9fY3B1KG1nbXQtPnUuYXV0aC5zdGF0dXNfY29kZSk7Ci0KLQlpZiAoc3RhdHVzKSB7Ci0JCURCR184NzIzQSgiY2xudCBhdXRoIGZhaWwsIHN0YXR1czogJWRcbiIsIHN0YXR1cyk7Ci0JCS8qICBwbWxtZWluZm8tPmF1dGhfYWxnbyA9PSBkb3QxMUF1dGhBbGdydGhtX0F1dG8pICovCi0JCWlmIChzdGF0dXMgPT0gV0xBTl9TVEFUVVNfTk9UX1NVUFBPUlRFRF9BVVRIX0FMRykgewotCQkJaWYgKHBtbG1laW5mby0+YXV0aF9hbGdvID09IGRvdDExQXV0aEFsZ3J0aG1fU2hhcmVkKQotCQkJCXBtbG1laW5mby0+YXV0aF9hbGdvID0gZG90MTFBdXRoQWxncnRobV9PcGVuOwotCQkJZWxzZQotCQkJCXBtbG1laW5mby0+YXV0aF9hbGdvID0gZG90MTFBdXRoQWxncnRobV9TaGFyZWQ7Ci0JCQkvKiBwbWxtZWluZm8tPnJlYXV0aF9jb3VudCA9IDA7ICovCi0JCX0KLQotCQlzZXRfbGlua190aW1lcihwbWxtZWV4dCwgMSk7Ci0JCWdvdG8gYXV0aGNsbnRfZmFpbDsKLQl9Ci0KLQlpZiAoc2VxID09IDIpIHsKLQkJaWYgKHBtbG1laW5mby0+YXV0aF9hbGdvID09IGRvdDExQXV0aEFsZ3J0aG1fU2hhcmVkKSB7Ci0JCQkvKiAgbGVnZW5kYXJ5IHNoYXJlZCBzeXN0ZW0gKi8KLQkJCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0NIQUxMRU5HRSwgcGllLCBwbGVuKTsKLQotCQkJaWYgKCFwKSB7Ci0JCQkJLyogREJHXzg3MjNBKCJtYXJjOiBubyBjaGFsbGVuZ2UgdGV4dD9cbiIpOyAqLwotCQkJCWdvdG8gYXV0aGNsbnRfZmFpbDsKLQkJCX0KLQotCQkJbWVtY3B5KCh2b2lkICopKHBtbG1laW5mby0+Y2hnX3R4dCksIHAgKyAyLCBwWzFdKTsKLQkJCXBtbG1laW5mby0+YXV0aF9zZXEgPSAzOwotCQkJaXNzdWVfYXV0aChwYWRhcHRlciwgTlVMTCwgMCk7Ci0JCQlzZXRfbGlua190aW1lcihwbWxtZWV4dCwgUkVBVVRIX1RPKTsKLQotCQkJcmV0dXJuIF9TVUNDRVNTOwotCQl9IGVsc2UgewotCQkJLyogIG9wZW4gc3lzdGVtICovCi0JCQlnbzJhc29jID0gMTsKLQkJfQotCX0gZWxzZSBpZiAoc2VxID09IDQpIHsKLQkJaWYgKHBtbG1laW5mby0+YXV0aF9hbGdvID09IGRvdDExQXV0aEFsZ3J0aG1fU2hhcmVkKQotCQkJZ28yYXNvYyA9IDE7Ci0JCWVsc2UKLQkJCWdvdG8gYXV0aGNsbnRfZmFpbDsKLQl9IGVsc2UgewotCQkvKiAgdGhpcyBpcyBhbHNvIGlsbGVnYWwgKi8KLQkJLyogREJHXzg3MjNBKCJtYXJjOiBjbG50IGF1dGggZmFpbGVkIGR1ZSB0byBpbGxlZ2FsIHNlcSA9JXhcbiIsCi0JCSAgIHNlcSk7ICovCi0JCWdvdG8gYXV0aGNsbnRfZmFpbDsKLQl9Ci0KLQlpZiAoZ28yYXNvYykgewotCQlEQkdfODcyM0FfTEVWRUwoX2Rydl9hbHdheXNfLCAiYXV0aCBzdWNjZXNzLCBzdGFydCBhc3NvY1xuIik7Ci0JCXN0YXJ0X2NsbnRfYXNzb2MocGFkYXB0ZXIpOwotCQlyZXR1cm4gX1NVQ0NFU1M7Ci0JfQotCi1hdXRoY2xudF9mYWlsOgotCi0JLyogcG1sbWVpbmZvLT5zdGF0ZSAmPSB+KFdJRklfRldfQVVUSF9TVEFURSk7ICovCi0KLQlyZXR1cm4gX0ZBSUw7Ci19Ci0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLXN0YXRpYyBpbnQgcnR3X3ZhbGlkYXRlX3ZlbmRvcl9zcGVjaWZpY19pZXMoY29uc3QgdTggKnBvcywgaW50IGVsZW4pCi17Ci0JdW5zaWduZWQgaW50IG91aTsKLQotCS8qIGZpcnN0IDMgYnl0ZXMgaW4gdmVuZG9yIHNwZWNpZmljIGluZm9ybWF0aW9uIGVsZW1lbnQgYXJlIHRoZSBJRUVFCi0JICogT1VJIG9mIHRoZSB2ZW5kb3IuIFRoZSBmb2xsb3dpbmcgYnl0ZSBpcyB1c2VkIGEgdmVuZG9yIHNwZWNpZmljCi0JICogc3ViLXR5cGUuICovCi0JaWYgKGVsZW4gPCA0KSB7Ci0JCURCR184NzIzQSgic2hvcnQgdmVuZG9yIHNwZWNpZmljIGluZm9ybWF0aW9uIGVsZW1lbnQgIgotCQkJICAiaWdub3JlZCAobGVuID0laSlcbiIsIGVsZW4pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlvdWkgPSBSVFdfR0VUX0JFMjQocG9zKTsKLQlzd2l0Y2ggKG91aSkgewotCWNhc2UgV0xBTl9PVUlfTUlDUk9TT0ZUOgotCQkvKiBNaWNyb3NvZnQvV2ktRmkgaW5mb3JtYXRpb24gZWxlbWVudHMgYXJlIGZ1cnRoZXIgdHlwZWQgYW5kCi0JCSAqIHN1YnR5cGVkICovCi0JCXN3aXRjaCAocG9zWzNdKSB7Ci0JCWNhc2UgV0xBTl9PVUlfVFlQRV9NSUNST1NPRlRfV1BBOgotCQkJLyogTWljcm9zb2Z0IE9VSSAoMDA6NTA6RjIpIHdpdGggT1VJIFR5cGUgMToKLQkJCSAqIHJlYWwgV1BBIGluZm9ybWF0aW9uIGVsZW1lbnQgKi8KLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fT1VJX1RZUEVfTUlDUk9TT0ZUX1dNTToKLQkJCWlmIChlbGVuIDwgNSkgewotCQkJCURCR184NzIzQSgic2hvcnQgV01FIGluZm9ybWF0aW9uIGVsZW1lbnQgIgotCQkJCQkgICJpZ25vcmVkIChsZW4gPSVpKVxuIiwgZWxlbik7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCQlzd2l0Y2ggKHBvc1s0XSkgewotCQkJY2FzZSBXTUVfT1VJX1NVQlRZUEVfSU5GT1JNQVRJT05fRUxFTUVOVDoKLQkJCWNhc2UgV01FX09VSV9TVUJUWVBFX1BBUkFNRVRFUl9FTEVNRU5UOgotCQkJCWJyZWFrOwotCQkJY2FzZSBXTUVfT1VJX1NVQlRZUEVfVFNQRUNfRUxFTUVOVDoKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJREJHXzg3MjNBKCJ1bmtub3duIFdNRSBpbmZvcm1hdGlvbiBlbGVtZW50ICIKLQkJCQkJICAiaWdub3JlZCAoc3VidHlwZSA9JWQgbGVuID0laSlcbiIsCi0JCQkJCSAgIHBvc1s0XSwgZWxlbik7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX09VSV9UWVBFX01JQ1JPU09GVF9XUFM6Ci0JCQkvKiBXaS1GaSBQcm90ZWN0ZWQgU2V0dXAgKFdQUykgSUUgKi8KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJREJHXzg3MjNBKCJVbmtub3duIE1pY3Jvc29mdCBpbmZvcm1hdGlvbiBlbGVtZW50ICIKLQkJCQkgICJpZ25vcmVkICh0eXBlID0lZCBsZW4gPSVpKVxuIiwKLQkJCQkgIHBvc1szXSwgZWxlbik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgT1VJX0JST0FEQ09NOgotCQlzd2l0Y2ggKHBvc1szXSkgewotCQljYXNlIFZFTkRPUl9IVF9DQVBBQl9PVUlfVFlQRToKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJREJHXzg3MjNBKCJVbmtub3duIEJyb2FkY29tIGluZm9ybWF0aW9uIGVsZW1lbnQgIgotCQkJCSAgImlnbm9yZWQgKHR5cGUgPSVkIGxlbiA9JWkpXG4iLCBwb3NbM10sIGVsZW4pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlEQkdfODcyM0EoInVua25vd24gdmVuZG9yIHNwZWNpZmljIGluZm9ybWF0aW9uIGVsZW1lbnQgIgotCQkJICAiaWdub3JlZCAodmVuZG9yIE9VSSAlMDJ4OiUwMng6JTAyeCBsZW4gPSVpKVxuIiwKLQkJCSAgIHBvc1swXSwgcG9zWzFdLCBwb3NbMl0sIGVsZW4pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBydHdfdmFsaWRhdGVfZnJhbWVfaWVzKGNvbnN0IHU4ICpzdGFydCwgdWludCBsZW4pCi17Ci0JY29uc3QgdTggKnBvcyA9IHN0YXJ0OwotCWludCBsZWZ0ID0gbGVuOwotCWludCB1bmtub3duID0gMDsKLQotCXdoaWxlIChsZWZ0ID49IDIpIHsKLQkJdTggaWQsIGVsZW47Ci0KLQkJaWQgPSAqcG9zKys7Ci0JCWVsZW4gPSAqcG9zKys7Ci0JCWxlZnQgLT0gMjsKLQotCQlpZiAoZWxlbiA+IGxlZnQpIHsKLQkJCURCR184NzIzQSgiJXM6IElFRUUgODAyLjExIGZhaWxlZCAoaWQgPSVkIGVsZW4gPSVkICIKLQkJCQkgICJsZWZ0ID0laSlcbiIsIF9fZnVuY19fLCBpZCwgZWxlbiwgbGVmdCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCXN3aXRjaCAoaWQpIHsKLQkJY2FzZSBXTEFOX0VJRF9TU0lEOgotCQljYXNlIFdMQU5fRUlEX1NVUFBfUkFURVM6Ci0JCWNhc2UgV0xBTl9FSURfRkhfUEFSQU1TOgotCQljYXNlIFdMQU5fRUlEX0RTX1BBUkFNUzoKLQkJY2FzZSBXTEFOX0VJRF9DRl9QQVJBTVM6Ci0JCWNhc2UgV0xBTl9FSURfVElNOgotCQljYXNlIFdMQU5fRUlEX0lCU1NfUEFSQU1TOgotCQljYXNlIFdMQU5fRUlEX0NIQUxMRU5HRToKLQkJY2FzZSBXTEFOX0VJRF9FUlBfSU5GTzoKLQkJY2FzZSBXTEFOX0VJRF9FWFRfU1VQUF9SQVRFUzoKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQzoKLQkJCWlmIChydHdfdmFsaWRhdGVfdmVuZG9yX3NwZWNpZmljX2llcyhwb3MsIGVsZW4pKQotCQkJCXVua25vd24rKzsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX1JTTjoKLQkJY2FzZSBXTEFOX0VJRF9QV1JfQ0FQQUJJTElUWToKLQkJY2FzZSBXTEFOX0VJRF9TVVBQT1JURURfQ0hBTk5FTFM6Ci0JCWNhc2UgV0xBTl9FSURfTU9CSUxJVFlfRE9NQUlOOgotCQljYXNlIFdMQU5fRUlEX0ZBU1RfQlNTX1RSQU5TSVRJT046Ci0JCWNhc2UgV0xBTl9FSURfVElNRU9VVF9JTlRFUlZBTDoKLQkJY2FzZSBXTEFOX0VJRF9IVF9DQVBBQklMSVRZOgotCQljYXNlIFdMQU5fRUlEX0hUX09QRVJBVElPTjoKLQkJZGVmYXVsdDoKLQkJCXVua25vd24rKzsKLQkJCURCR184NzIzQSgiJXMgSUVFRSA4MDIuMTEgaWdub3JlZCB1bmtub3duIGVsZW1lbnQgIgotCQkJCSAgIihpZCA9JWQgZWxlbiA9JWQpXG4iLCBfX2Z1bmNfXywgaWQsIGVsZW4pOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlsZWZ0IC09IGVsZW47Ci0JCXBvcyArPSBlbGVuOwotCX0KLQotCWlmIChsZWZ0KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQKLU9uQXNzb2NSZXEyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCXUxNiBjYXBhYl9pbmZvLCBsaXN0ZW5faW50ZXJ2YWw7Ci0Jc3RydWN0IHN0YV9pbmZvCSpwc3RhdDsKLQl1bnNpZ25lZCBjaGFyIHJlYXNzb2M7Ci0JaW50IGksIHdwYV9pZV9sZW4sIGxlZnQ7Ci0JdW5zaWduZWQgY2hhciBzdXBwb3J0UmF0ZVsxNl07Ci0JaW50IHN1cHBvcnRSYXRlTnVtOwotCXVuc2lnbmVkIHNob3J0IHN0YXR1cyA9IFdMQU5fU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKmN1ciA9ICZwbWxtZWluZm8tPm5ldHdvcms7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZfZnJhbWUtPnBrdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIHNrYi0+ZGF0YTsKLQljb25zdCB1OCAqcG9zLCAqcCwgKndwYV9pZSwgKndwc19pZTsKLQl1OCAqcGZyYW1lID0gc2tiLT5kYXRhOwotCXVpbnQgcGt0X2xlbiA9IHNrYi0+bGVuOwotCWludCByOwotCi0JaWYgKChwbWxtZWluZm8tPnN0YXRlICYgMHgwMykgIT0gTVNSX0FQKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQlsZWZ0ID0gcGt0X2xlbiAtIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0JaWYgKGllZWU4MDIxMV9pc19hc3NvY19yZXEobWdtdC0+ZnJhbWVfY29udHJvbCkpIHsKLQkJcmVhc3NvYyA9IDA7Ci0JCXBvcyA9IG1nbXQtPnUuYXNzb2NfcmVxLnZhcmlhYmxlOwotCQlsZWZ0IC09IG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5hc3NvY19yZXEudmFyaWFibGUpOwotCX0gZWxzZSB7IC8qICBXSUZJX1JFQVNTT0NSRVEgKi8KLQkJcmVhc3NvYyA9IDE7Ci0JCXBvcyA9IG1nbXQtPnUucmVhc3NvY19yZXEudmFyaWFibGU7Ci0JCWxlZnQgLT0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LnJlYXNzb2NfcmVxLnZhcmlhYmxlKTsKLQl9Ci0KLQlpZiAobGVmdCA8IDApIHsKLQkJREJHXzg3MjNBKCJoYW5kbGVfYXNzb2MocmVhc3NvYyA9JWQpIC0gdG9vIHNob3J0IHBheWxvYWQgIgotCQkJICAiKGxlbiA9JWx1KVxuIiwgcmVhc3NvYywgKHVuc2lnbmVkIGxvbmcpcGt0X2xlbik7Ci0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQlwc3RhdCA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgbWdtdC0+c2EpOwotCWlmICghcHN0YXQpIHsKLQkJc3RhdHVzID0gV0xBTl9SRUFTT05fQ0xBU1MyX0ZSQU1FX0ZST01fTk9OQVVUSF9TVEE7Ci0JCWdvdG8gYXNvY19jbGFzczJfZXJyb3I7Ci0JfQotCi0JLyogVGhlc2UgdHdvIGFyZSBsb2NhdGVkIGF0IHRoZSBzYW1lIG9mZnNldHMgd2hldGhlciBpdCdzIGFuCi0JICogYXNzb2NfcmVxIG9yIGEgcmVhc3NvY19yZXEgKi8KLQljYXBhYl9pbmZvID0gZ2V0X3VuYWxpZ25lZF9sZTE2KCZtZ210LT51LmFzc29jX3JlcS5jYXBhYl9pbmZvKTsKLQlsaXN0ZW5faW50ZXJ2YWwgPQotCQlnZXRfdW5hbGlnbmVkX2xlMTYoJm1nbXQtPnUuYXNzb2NfcmVxLmxpc3Rlbl9pbnRlcnZhbCk7Ci0KLQlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQkvKiAgY2hlY2sgaWYgdGhpcyBzdGF0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBhdXRoZW50aWNhdGVkL2Fzc29jYXRlZCAqLwotCWlmICghKHBzdGF0LT5zdGF0ZSAmIFdJRklfRldfQVVUSF9TVUNDRVNTKSkgewotCQlpZiAoIShwc3RhdC0+c3RhdGUgJiBXSUZJX0ZXX0FTU09DX1NVQ0NFU1MpKSB7Ci0JCQlzdGF0dXMgPSBXTEFOX1JFQVNPTl9DTEFTUzJfRlJBTUVfRlJPTV9OT05BVVRIX1NUQTsKLQkJCWdvdG8gYXNvY19jbGFzczJfZXJyb3I7Ci0JCX0gZWxzZSB7Ci0JCQlwc3RhdC0+c3RhdGUgJj0gKH5XSUZJX0ZXX0FTU09DX1NVQ0NFU1MpOwotCQkJcHN0YXQtPnN0YXRlIHw9IFdJRklfRldfQVNTT0NfU1RBVEU7Ci0JCX0KLQl9IGVsc2UgewotCQlwc3RhdC0+c3RhdGUgJj0gKH5XSUZJX0ZXX0FVVEhfU1VDQ0VTUyk7Ci0JCXBzdGF0LT5zdGF0ZSB8PSBXSUZJX0ZXX0FTU09DX1NUQVRFOwotCX0KLQotCXBzdGF0LT5jYXBhYmlsaXR5ID0gY2FwYWJfaW5mbzsKLQotCS8qIG5vdyBwYXJzZSBhbGwgaWVlZTgwMl8xMSBpZSB0byBwb2ludCB0byBlbGVtcyAqLwotCi0JaWYgKHJ0d192YWxpZGF0ZV9mcmFtZV9pZXMocG9zLCBsZWZ0KSkgewotCQlEQkdfODcyM0EoIlNUQSAlcE0gc2VudCBpbnZhbGlkIGFzc29jaWF0aW9uIHJlcXVlc3RcbiIsCi0JCQkgIHBzdGF0LT5od2FkZHIpOwotCQlzdGF0dXMgPSBXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFOwotCQlnb3RvIE9uQXNzb2NSZXEyM2FGYWlsOwotCX0KLQotCS8qICBub3cgd2Ugc2hvdWxkIGNoZWNrIGFsbCB0aGUgZmllbGRzLi4uICovCi0JLyogIGNoZWNraW5nIFNTSUQgKi8KLQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9TU0lELCBwb3MsIGxlZnQpOwotCWlmICghcCB8fCBwWzFdID09IDApIHsKLQkJLyogIGJyb2FkY2FzdCBzc2lkLCBob3dldmVyIGl0IGlzIG5vdCBhbGxvd2VkIGluIGFzc29jcmVxICovCi0JCURCR184NzIzQSgiU1RBICVwTSBzZW50IGludmFsaWQgYXNzb2NpYXRpb24gcmVxdWVzdCBsYWNraW5nIGFuIFNTSURcbiIsCi0JCQkgIHBzdGF0LT5od2FkZHIpOwotCQlzdGF0dXMgPSBXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFOwotCQlnb3RvIE9uQXNzb2NSZXEyM2FGYWlsOwotCX0gZWxzZSB7Ci0JCS8qICBjaGVjayBpZiBzc2lkIG1hdGNoICovCi0JCWlmIChtZW1jbXAocCArIDIsIGN1ci0+U3NpZC5zc2lkLCBjdXItPlNzaWQuc3NpZF9sZW4pKQotCQkJc3RhdHVzID0gV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRTsKLQotCQlpZiAocFsxXSAhPSBjdXItPlNzaWQuc3NpZF9sZW4pCi0JCQlzdGF0dXMgPSBXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFOwotCX0KLQotCWlmIChzdGF0dXMgIT0gV0xBTl9TVEFUVVNfU1VDQ0VTUykKLQkJZ290byBPbkFzc29jUmVxMjNhRmFpbDsKLQotCS8qICBjaGVjayBpZiB0aGUgc3VwcG9ydGVkIHJhdGUgaXMgb2sgKi8KLQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9TVVBQX1JBVEVTLCBwb3MsIGxlZnQpOwotCWlmICghcCkgewotCQlEQkdfODcyM0EoIlJ4IGEgc3RhIGFzc29jLXJlcSB3aGljaCBzdXBwb3J0ZWQgcmF0ZSBpcyAiCi0JCQkgICJlbXB0eSFcbiIpOwotCQkvKiAgdXNlIG91ciBvd24gcmF0ZSBzZXQgYXMgc3RhdG9pbiB1c2VkICovCi0JCS8qIG1lbWNweShzdXBwb3J0UmF0ZSwgQVBfQlNTUkFURSwgQVBfQlNTUkFURV9MRU4pOyAqLwotCQkvKiBzdXBwb3J0UmF0ZU51bSA9IEFQX0JTU1JBVEVfTEVOOyAqLwotCi0JCXN0YXR1cyA9IFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkU7Ci0JCWdvdG8gT25Bc3NvY1JlcTIzYUZhaWw7Ci0JfSBlbHNlIHsKLQkJbWVtY3B5KHN1cHBvcnRSYXRlLCBwICsgMiwgcFsxXSk7Ci0JCXN1cHBvcnRSYXRlTnVtID0gcFsxXTsKLQotCQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9FWFRfU1VQUF9SQVRFUywgcG9zLCBsZWZ0KTsKLQkJaWYgKHApIHsKLQkJCWlmIChzdXBwb3J0UmF0ZU51bSA8PSBzaXplb2Yoc3VwcG9ydFJhdGUpKSB7Ci0JCQkJbWVtY3B5KHN1cHBvcnRSYXRlK3N1cHBvcnRSYXRlTnVtLCBwICsgMiwgcFsxXSk7Ci0JCQkJc3VwcG9ydFJhdGVOdW0gKz0gcFsxXTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIHRvZG86IG1hc2sgc3VwcG9ydFJhdGUgYmV0d2VlbiBBUCAmIFNUQSAtPiBtb3ZlIHRvIHVwZGF0ZSByYWlkICovCi0JLyogZ2V0X21hdGNoZWRfcmF0ZShwbWxtZWV4dCwgc3VwcG9ydFJhdGUsICZzdXBwb3J0UmF0ZU51bSwgMCk7ICovCi0KLQkvKiB1cGRhdGUgc3RhdGlvbiBzdXBwb3J0UmF0ZSAqLwotCXBzdGF0LT5ic3NyYXRlbGVuID0gc3VwcG9ydFJhdGVOdW07Ci0JbWVtY3B5KHBzdGF0LT5ic3NyYXRlc2V0LCBzdXBwb3J0UmF0ZSwgc3VwcG9ydFJhdGVOdW0pOwotCVVwZGF0ZTIzYVRibEZvclNvZnRBUChwc3RhdC0+YnNzcmF0ZXNldCwgcHN0YXQtPmJzc3JhdGVsZW4pOwotCi0JLyogY2hlY2sgUlNOL1dQQS9XUFMgKi8KLQlwc3RhdC0+ZG90ODAyMXhhbGcgPSAwOwotCXBzdGF0LT53cGFfcHNrID0gMDsKLQlwc3RhdC0+d3BhX2dyb3VwX2NpcGhlciA9IDA7Ci0JcHN0YXQtPndwYTJfZ3JvdXBfY2lwaGVyID0gMDsKLQlwc3RhdC0+d3BhX3BhaXJ3aXNlX2NpcGhlciA9IDA7Ci0JcHN0YXQtPndwYTJfcGFpcndpc2VfY2lwaGVyID0gMDsKLQltZW1zZXQocHN0YXQtPndwYV9pZSwgMCwgc2l6ZW9mKHBzdGF0LT53cGFfaWUpKTsKLQotCXdwYV9pZSA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfUlNOLCBwb3MsIGxlZnQpOwotCWlmICghd3BhX2llKQotCQl3cGFfaWUgPSBjZmc4MDIxMV9maW5kX3ZlbmRvcl9pZShXTEFOX09VSV9NSUNST1NPRlQsCi0JCQkJCQkgV0xBTl9PVUlfVFlQRV9NSUNST1NPRlRfV1BBLAotCQkJCQkJIHBvcywgbGVmdCk7Ci0JaWYgKHdwYV9pZSkgewotCQlpbnQgZ3JvdXBfY2lwaGVyID0gMCwgcGFpcndpc2VfY2lwaGVyID0gMDsKLQotCQl3cGFfaWVfbGVuID0gd3BhX2llWzFdOwotCQlpZiAocHNlY3VyaXR5cHJpdi0+d3BhX3BzayAmIEJJVCgxKSkgewotCQkJciA9IHJ0d19wYXJzZV93cGEyX2llMjNhKHdwYV9pZSwgd3BhX2llX2xlbiArIDIsCi0JCQkJCQkgJmdyb3VwX2NpcGhlciwKLQkJCQkJCSAmcGFpcndpc2VfY2lwaGVyLCBOVUxMKTsKLQkJCWlmIChyID09IF9TVUNDRVNTKSB7Ci0JCQkJcHN0YXQtPmRvdDgwMjF4YWxnID0gMTsvKiBwc2ssICB0b2RvOjgwMi4xeCAqLwotCQkJCXBzdGF0LT53cGFfcHNrIHw9IEJJVCgxKTsKLQotCQkJCXBzdGF0LT53cGEyX2dyb3VwX2NpcGhlciA9IGdyb3VwX2NpcGhlciAmCi0JCQkJCXBzZWN1cml0eXByaXYtPndwYTJfZ3JvdXBfY2lwaGVyOwotCQkJCXBzdGF0LT53cGEyX3BhaXJ3aXNlX2NpcGhlciA9IHBhaXJ3aXNlX2NpcGhlciAmCi0JCQkJCXBzZWN1cml0eXByaXYtPndwYTJfcGFpcndpc2VfY2lwaGVyOwotCQkJfSBlbHNlCi0JCQkJc3RhdHVzID0gV0xBTl9TVEFUVVNfSU5WQUxJRF9JRTsKLQkJfSBlbHNlIGlmIChwc2VjdXJpdHlwcml2LT53cGFfcHNrICYgQklUKDApKSB7Ci0JCQlyID0gcnR3X3BhcnNlX3dwYV9pZTIzYSh3cGFfaWUsIHdwYV9pZV9sZW4gKyAyLAotCQkJCQkJJmdyb3VwX2NpcGhlciwgJnBhaXJ3aXNlX2NpcGhlciwKLQkJCQkJCU5VTEwpOwotCQkJaWYgKHIgPT0gX1NVQ0NFU1MpIHsKLQkJCQlwc3RhdC0+ZG90ODAyMXhhbGcgPSAxOy8qIHBzaywgIHRvZG86ODAyLjF4ICovCi0JCQkJcHN0YXQtPndwYV9wc2sgfD0gQklUKDApOwotCi0JCQkJcHN0YXQtPndwYV9ncm91cF9jaXBoZXIgPSBncm91cF9jaXBoZXIgJgotCQkJCQlwc2VjdXJpdHlwcml2LT53cGFfZ3JvdXBfY2lwaGVyOwotCQkJCXBzdGF0LT53cGFfcGFpcndpc2VfY2lwaGVyID0gcGFpcndpc2VfY2lwaGVyICYKLQkJCQkJcHNlY3VyaXR5cHJpdi0+d3BhX3BhaXJ3aXNlX2NpcGhlcjsKLQkJCX0gZWxzZQotCQkJCXN0YXR1cyA9IFdMQU5fU1RBVFVTX0lOVkFMSURfSUU7Ci0JCX0gZWxzZSB7Ci0JCQl3cGFfaWUgPSBOVUxMOwotCQkJd3BhX2llX2xlbiA9IDA7Ci0JCX0KLQkJaWYgKHdwYV9pZSAmJiBzdGF0dXMgPT0gV0xBTl9TVEFUVVNfU1VDQ0VTUykgewotCQkJaWYgKCFwc3RhdC0+d3BhX2dyb3VwX2NpcGhlcikKLQkJCQlzdGF0dXMgPSBXTEFOX1NUQVRVU19JTlZBTElEX0dST1VQX0NJUEhFUjsKLQotCQkJaWYgKCFwc3RhdC0+d3BhX3BhaXJ3aXNlX2NpcGhlcikKLQkJCQlzdGF0dXMgPSBXTEFOX1NUQVRVU19JTlZBTElEX1BBSVJXSVNFX0NJUEhFUjsKLQkJfQotCX0KLQotCWlmIChzdGF0dXMgIT0gV0xBTl9TVEFUVVNfU1VDQ0VTUykKLQkJZ290byBPbkFzc29jUmVxMjNhRmFpbDsKLQotCXBzdGF0LT5mbGFncyAmPSB+KFdMQU5fU1RBX1dQUyB8IFdMQU5fU1RBX01BWUJFX1dQUyk7Ci0KLQl3cHNfaWUgPSBjZmc4MDIxMV9maW5kX3ZlbmRvcl9pZShXTEFOX09VSV9NSUNST1NPRlQsCi0JCQkJCSBXTEFOX09VSV9UWVBFX01JQ1JPU09GVF9XUFMsCi0JCQkJCSBwb3MsIGxlZnQpOwotCi0JaWYgKCF3cGFfaWUpIHsKLQkJaWYgKHdwc19pZSkgewotCQkJREJHXzg3MjNBKCJTVEEgaW5jbHVkZWQgV1BTIElFIGluIChSZSlBc3NvY2lhdGlvbiAiCi0JCQkJICAiUmVxdWVzdCAtIGFzc3VtZSBXUFMgaXMgdXNlZFxuIik7Ci0JCQlwc3RhdC0+ZmxhZ3MgfD0gV0xBTl9TVEFfV1BTOwotCQl9IGVsc2UgewotCQkJREJHXzg3MjNBKCJTVEEgZGlkIG5vdCBpbmNsdWRlIFdQQS9SU04gSUUgaW4gKFJlKSIKLQkJCQkgICAiQXNzb2NpYXRpb24gUmVxdWVzdCAtIHBvc3NpYmxlIFdQUyB1c2VcbiIpOwotCQkJcHN0YXQtPmZsYWdzIHw9IFdMQU5fU1RBX01BWUJFX1dQUzsKLQkJfQotCX0gZWxzZSB7Ci0JCWludCBjb3B5X2xlbjsKLQotCQlpZiAocHNlY3VyaXR5cHJpdi0+d3BhX3BzayA9PSAwKSB7Ci0JCQlEQkdfODcyM0EoIlNUQSAlcE06IFdQQS9SU04gSUUgaW4gYXNzb2NpYXRpb24gcmVxdWVzdCwgYnV0IEFQIGRvbid0IHN1cHBvcnQgV1BBL1JTTlxuIiwKLQkJCQkgIHBzdGF0LT5od2FkZHIpOwotCi0JCQlzdGF0dXMgPSBXTEFOX1NUQVRVU19JTlZBTElEX0lFOwotCi0JCQlnb3RvIE9uQXNzb2NSZXEyM2FGYWlsOwotCQl9Ci0KLQkJaWYgKHdwc19pZSkgewotCQkJREJHXzg3MjNBKCJTVEEgaW5jbHVkZWQgV1BTIElFIGluIChSZSlBc3NvY2lhdGlvbiAiCi0JCQkJICAiUmVxdWVzdCAtIFdQUyBpcyB1c2VkXG4iKTsKLQkJCXBzdGF0LT5mbGFncyB8PSBXTEFOX1NUQV9XUFM7Ci0JCQljb3B5X2xlbiA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQljb3B5X2xlbiA9ICgod3BhX2llX2xlbiArIDIpID4gc2l6ZW9mKHBzdGF0LT53cGFfaWUpKSA/Ci0JCQkJc2l6ZW9mKHBzdGF0LT53cGFfaWUpIDogKHdwYV9pZV9sZW4gKyAyKTsKLQkJfQotCi0JCWlmIChjb3B5X2xlbiA+IDApCi0JCQltZW1jcHkocHN0YXQtPndwYV9pZSwgd3BhX2llIC0gMiwgY29weV9sZW4pOwotCX0KLQotCS8qICBjaGVjayBpZiB0aGVyZSBpcyBXTU0gSUUgJiBzdXBwb3J0IFdXTS1QUyAqLwotCXBzdGF0LT5mbGFncyAmPSB+V0xBTl9TVEFfV01FOwotCXBzdGF0LT5xb3Nfb3B0aW9uID0gMDsKLQlwc3RhdC0+cW9zX2luZm8gPSAwOwotCXBzdGF0LT5oYXNfbGVnYWN5X2FjID0gdHJ1ZTsKLQlwc3RhdC0+dWFwc2Rfdm8gPSAwOwotCXBzdGF0LT51YXBzZF92aSA9IDA7Ci0JcHN0YXQtPnVhcHNkX2JlID0gMDsKLQlwc3RhdC0+dWFwc2RfYmsgPSAwOwotCWlmIChwbWxtZXByaXYtPnFvc19vcHRpb24pIHsKLQkJY29uc3QgdTggKmVuZCA9IHBvcyArIGxlZnQ7Ci0KLQkJcCA9IHBvczsKLQotCQlmb3IgKDs7KSB7Ci0JCQlsZWZ0ID0gZW5kIC0gcDsKLQkJCXAgPSBjZmc4MDIxMV9maW5kX3ZlbmRvcl9pZShXTEFOX09VSV9NSUNST1NPRlQsCi0JCQkJCQkgICAgV0xBTl9PVUlfVFlQRV9NSUNST1NPRlRfV01NLAotCQkJCQkJICAgIHAsIGxlZnQpOwotCQkJaWYgKHApIHsKLQkJCQlwc3RhdC0+ZmxhZ3MgfD0gV0xBTl9TVEFfV01FOwotCi0JCQkJcHN0YXQtPnFvc19vcHRpb24gPSAxOwotCQkJCXBzdGF0LT5xb3NfaW5mbyA9ICoocCArIDgpOwotCi0JCQkJcHN0YXQtPm1heF9zcF9sZW4gPQotCQkJCQkocHN0YXQtPnFvc19pbmZvID4+IDUpICYgMHgzOwotCi0JCQkJaWYgKChwc3RhdC0+cW9zX2luZm8gJiAweGYpICE9IDB4ZikKLQkJCQkJcHN0YXQtPmhhc19sZWdhY3lfYWMgPSB0cnVlOwotCQkJCWVsc2UKLQkJCQkJcHN0YXQtPmhhc19sZWdhY3lfYWMgPSBmYWxzZTsKLQotCQkJCWlmIChwc3RhdC0+cW9zX2luZm8gJiAweGYpIHsKLQkJCQkJaWYgKHBzdGF0LT5xb3NfaW5mbyAmIEJJVCgwKSkKLQkJCQkJCXBzdGF0LT51YXBzZF92byA9IEJJVCgwKXxCSVQoMSk7Ci0JCQkJCWVsc2UKLQkJCQkJCXBzdGF0LT51YXBzZF92byA9IDA7Ci0KLQkJCQkJaWYgKHBzdGF0LT5xb3NfaW5mbyAmIEJJVCgxKSkKLQkJCQkJCXBzdGF0LT51YXBzZF92aSA9IEJJVCgwKXxCSVQoMSk7Ci0JCQkJCWVsc2UKLQkJCQkJCXBzdGF0LT51YXBzZF92aSA9IDA7Ci0KLQkJCQkJaWYgKHBzdGF0LT5xb3NfaW5mbyAmIEJJVCgyKSkKLQkJCQkJCXBzdGF0LT51YXBzZF9iayA9IEJJVCgwKXxCSVQoMSk7Ci0JCQkJCWVsc2UKLQkJCQkJCXBzdGF0LT51YXBzZF9iayA9IDA7Ci0KLQkJCQkJaWYgKHBzdGF0LT5xb3NfaW5mbyAmIEJJVCgzKSkKLQkJCQkJCXBzdGF0LT51YXBzZF9iZSA9IEJJVCgwKXxCSVQoMSk7Ci0JCQkJCWVsc2UKLQkJCQkJCXBzdGF0LT51YXBzZF9iZSA9IDA7Ci0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXAgPSBwICsgcFsxXSArIDI7Ci0JCX0KLQl9Ci0KLQkvKiBzYXZlIEhUIGNhcGFiaWxpdGllcyBpbiB0aGUgc3RhIG9iamVjdCAqLwotCW1lbXNldCgmcHN0YXQtPmh0cHJpdi5odF9jYXAsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCkpOwotCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0hUX0NBUEFCSUxJVFksIHBvcywgbGVmdCk7Ci0KLQlpZiAocCAmJiBwWzFdID49IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCkpIHsKLQkJcHN0YXQtPmZsYWdzIHw9IFdMQU5fU1RBX0hUOwotCi0JCXBzdGF0LT5mbGFncyB8PSBXTEFOX1NUQV9XTUU7Ci0KLQkJbWVtY3B5KCZwc3RhdC0+aHRwcml2Lmh0X2NhcCwgcCArIDIsCi0JCSAgICAgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXApKTsKLQl9IGVsc2UKLQkJcHN0YXQtPmZsYWdzICY9IH5XTEFOX1NUQV9IVDsKLQotCWlmICghcG1sbWVwcml2LT5odHByaXYuaHRfb3B0aW9uICYmIHBzdGF0LT5mbGFncyAmIFdMQU5fU1RBX0hUKXsKLQkJc3RhdHVzID0gV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRTsKLQkJZ290byBPbkFzc29jUmVxMjNhRmFpbDsKLQl9Ci0KLQlpZiAocHN0YXQtPmZsYWdzICYgV0xBTl9TVEFfSFQgJiYKLQkgICAgKHBzdGF0LT53cGEyX3BhaXJ3aXNlX2NpcGhlciAmIFdQQV9DSVBIRVJfVEtJUCB8fAotCSAgICAgcHN0YXQtPndwYV9wYWlyd2lzZV9jaXBoZXIgJiBXUEFfQ0lQSEVSX1RLSVApKSB7Ci0JCURCR184NzIzQSgiSFQ6ICVwTSB0cmllZCB0byB1c2UgVEtJUCB3aXRoIEhUIGFzc29jaWF0aW9uXG4iLAotCQkJICBwc3RhdC0+aHdhZGRyKTsKLQotCQkvKiBzdGF0dXMgPSBXTEFOX1NUQVRVU19DSVBIRVJfUkVKRUNURURfUEVSX1BPTElDWTsgKi8KLQkJLyogZ290byBPbkFzc29jUmVxMjNhRmFpbDsgKi8KLQl9Ci0KLQlwc3RhdC0+ZmxhZ3MgfD0gV0xBTl9TVEFfTk9ORVJQOwotCWZvciAoaSA9IDA7IGkgPCBwc3RhdC0+YnNzcmF0ZWxlbjsgaSsrKSB7Ci0JCWlmICgocHN0YXQtPmJzc3JhdGVzZXRbaV0gJiAweDdmKSA+IDIyKSB7Ci0JCQlwc3RhdC0+ZmxhZ3MgJj0gfldMQU5fU1RBX05PTkVSUDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKHBzdGF0LT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFKQotCQlwc3RhdC0+ZmxhZ3MgfD0gV0xBTl9TVEFfU0hPUlRfUFJFQU1CTEU7Ci0JZWxzZQotCQlwc3RhdC0+ZmxhZ3MgJj0gfldMQU5fU1RBX1NIT1JUX1BSRUFNQkxFOwotCi0JaWYgKHN0YXR1cyAhPSBXTEFOX1NUQVRVU19TVUNDRVNTKQotCQlnb3RvIE9uQXNzb2NSZXEyM2FGYWlsOwotCi0JLyogVE9ETzogaWRlbnRpZnlfcHJvcHJpZXRhcnlfdmVuZG9yX2llKCk7ICovCi0JLyogIFJlYWx0ZWsgcHJvcHJpZXRhcnkgSUUgKi8KLQkvKiAgaWRlbnRpZnkgaWYgdGhpcyBpcyBCcm9hZGNvbSBzdGEgKi8KLQkvKiAgaWRlbnRpZnkgaWYgdGhpcyBpcyByYWxpbmsgc3RhICovCi0JLyogIEN1c3RvbWVyIHByb3ByaWV0YXJ5IElFICovCi0KLQkvKiBnZXQgYSB1bmlxdWUgQUlEICovCi0JaWYgKHBzdGF0LT5haWQgPiAwKSB7Ci0JCURCR184NzIzQSgiICBvbGQgQUlEICVkXG4iLCBwc3RhdC0+YWlkKTsKLQl9IGVsc2UgewotCQlmb3IgKHBzdGF0LT5haWQgPSAxOyBwc3RhdC0+YWlkIDw9IE5VTV9TVEE7IHBzdGF0LT5haWQrKykKLQkJCWlmIChwc3RhcHJpdi0+c3RhX2FpZFtwc3RhdC0+YWlkIC0gMV0gPT0gTlVMTCkKLQkJCQlicmVhazsKLQotCQlpZiAocHN0YXQtPmFpZCA+IE5VTV9TVEEpCi0JCQlwc3RhdC0+YWlkID0gTlVNX1NUQTsKLQkJaWYgKHBzdGF0LT5haWQgPiBwc3RhcHJpdi0+bWF4X251bV9zdGEpIHsKLQotCQkJcHN0YXQtPmFpZCA9IDA7Ci0KLQkJCURCR184NzIzQSgiICBubyByb29tIGZvciBtb3JlIEFJRHNcbiIpOwotCi0JCQlzdGF0dXMgPSBXTEFOX1NUQVRVU19BUF9VTkFCTEVfVE9fSEFORExFX05FV19TVEE7Ci0KLQkJCWdvdG8gT25Bc3NvY1JlcTIzYUZhaWw7Ci0JCX0gZWxzZSB7Ci0JCQlwc3RhcHJpdi0+c3RhX2FpZFtwc3RhdC0+YWlkIC0gMV0gPSBwc3RhdDsKLQkJCURCR184NzIzQSgiYWxsb2NhdGUgbmV3IEFJRCA9ICglZClcbiIsIHBzdGF0LT5haWQpOwotCQl9Ci0JfQotCi0JcHN0YXQtPnN0YXRlICY9IH5XSUZJX0ZXX0FTU09DX1NUQVRFOwotCXBzdGF0LT5zdGF0ZSB8PSBXSUZJX0ZXX0FTU09DX1NVQ0NFU1M7Ci0KLQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5hdXRoX2xpc3RfbG9jayk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZwc3RhdC0+YXV0aF9saXN0KSkgewotCQlsaXN0X2RlbF9pbml0KCZwc3RhdC0+YXV0aF9saXN0KTsKLQkJcHN0YXByaXYtPmF1dGhfbGlzdF9jbnQtLTsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5hdXRoX2xpc3RfbG9jayk7Ci0KLQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0JaWYgKGxpc3RfZW1wdHkoJnBzdGF0LT5hc29jX2xpc3QpKSB7Ci0JCXBzdGF0LT5leHBpcmVfdG8gPSBwc3RhcHJpdi0+ZXhwaXJlX3RvOwotCQlsaXN0X2FkZF90YWlsKCZwc3RhdC0+YXNvY19saXN0LCAmcHN0YXByaXYtPmFzb2NfbGlzdCk7Ci0JCXBzdGFwcml2LT5hc29jX2xpc3RfY250Kys7Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwotCi0JLyogIG5vdyB0aGUgc3RhdGlvbiBpcyBxdWFsaWZpZWQgdG8gam9pbiBvdXIgQlNTLi4uICovCi0JaWYgKHBzdGF0LT5zdGF0ZSAmIFdJRklfRldfQVNTT0NfU1VDQ0VTUyAmJgotCSAgICBzdGF0dXMgPT0gV0xBTl9TVEFUVVNfU1VDQ0VTUykgewotCQkvKiAxIGJzc19jYXBfdXBkYXRlICYgc3RhX2luZm9fdXBkYXRlMjNhICovCi0JCWJzc19jYXBfdXBkYXRlX29uX3N0YV9qb2luMjNhKHBhZGFwdGVyLCBwc3RhdCk7Ci0JCXN0YV9pbmZvX3VwZGF0ZTIzYShwYWRhcHRlciwgcHN0YXQpOwotCi0JCS8qIGlzc3VlIGFzc29jIHJzcCBiZWZvcmUgbm90aWZ5IHN0YXRpb24gam9pbiBldmVudC4gKi8KLQkJaWYgKGllZWU4MDIxMV9pc19hc3NvY19yZXEobWdtdC0+ZnJhbWVfY29udHJvbCkpCi0JCQlpc3N1ZV9hc3NvY3JzcChwYWRhcHRlciwgc3RhdHVzLCBwc3RhdCwKLQkJCQkgICAgICAgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFU1ApOwotCQllbHNlCi0JCQlpc3N1ZV9hc3NvY3JzcChwYWRhcHRlciwgc3RhdHVzLCBwc3RhdCwKLQkJCQkgICAgICAgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVTUCk7Ci0KLQkJLyogMiAtIHJlcG9ydCB0byB1cHBlciBsYXllciAqLwotCQlEQkdfODcyM0EoImluZGljYXRlX3N0YV9qb2luX2V2ZW50IHRvIHVwcGVyIGxheWVyIC0gaG9zdGFwZFxuIik7Ci0JCXJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9zdGFfYXNzb2MocGFkYXB0ZXIsIHBmcmFtZSwgcGt0X2xlbik7Ci0KLQkJLyogMy0oMSkgcmVwb3J0IHN0YSBhZGQgZXZlbnQgKi8KLQkJcmVwb3J0X2FkZF9zdGFfZXZlbnQyM2EocGFkYXB0ZXIsIHBzdGF0LT5od2FkZHIsIHBzdGF0LT5haWQpOwotCX0KLQotCXJldHVybiBfU1VDQ0VTUzsKLQotYXNvY19jbGFzczJfZXJyb3I6Ci0KLQlpc3N1ZV9kZWF1dGgyM2EocGFkYXB0ZXIsIG1nbXQtPnNhLCBzdGF0dXMpOwotCXJldHVybiBfRkFJTDsKLQotT25Bc3NvY1JlcTIzYUZhaWw6Ci0KLQlwc3RhdC0+YWlkID0gMDsKLQlpZiAoaWVlZTgwMjExX2lzX2Fzc29jX3JlcShtZ210LT5mcmFtZV9jb250cm9sKSkKLQkJaXNzdWVfYXNzb2Nyc3AocGFkYXB0ZXIsIHN0YXR1cywgcHN0YXQsCi0JCQkgICAgICAgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFU1ApOwotCWVsc2UKLQkJaXNzdWVfYXNzb2Nyc3AocGFkYXB0ZXIsIHN0YXR1cywgcHN0YXQsCi0JCQkgICAgICAgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVTUCk7Ci0KLSNlbmRpZiAvKiBDT05GSUdfODcyM0FVX0FQX01PREUgKi8KLQotCXJldHVybiBfRkFJTDsKLX0KLQotc3RhdGljIGludAotT25Bc3NvY1JzcDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCBza19idWZmICpza2IgPSBwcmVjdl9mcmFtZS0+cGt0OwotCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqcG1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIHNrYi0+ZGF0YTsKLQlpbnQgcmVzOwotCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKLQljb25zdCB1OCAqcCwgKnBpZTsKLQl1OCAqcGZyYW1lID0gc2tiLT5kYXRhOwotCWludCBwa3RfbGVuID0gc2tiLT5sZW47Ci0JaW50IHBpZWxlbjsKLQotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCS8qIGNoZWNrIEExIG1hdGNoZXMgb3Igbm90ICovCi0JaWYgKCFldGhlcl9hZGRyX2VxdWFsKG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwgcG1nbXQtPmRhKSkKLQkJcmV0dXJuIF9TVUNDRVNTOwotCi0JaWYgKCEocG1sbWVpbmZvLT5zdGF0ZSAmIChXSUZJX0ZXX0FVVEhfU1VDQ0VTUyB8IFdJRklfRldfQVNTT0NfU1RBVEUpKSkKLQkJcmV0dXJuIF9TVUNDRVNTOwotCi0JaWYgKHBtbG1laW5mby0+c3RhdGUgJiBXSUZJX0ZXX0FTU09DX1NVQ0NFU1MpCi0JCXJldHVybiBfU1VDQ0VTUzsKLQotCWRlbF90aW1lcl9zeW5jKCZwbWxtZWV4dC0+bGlua190aW1lcik7Ci0KLQkvKiBzdGF0dXMgKi8KLQlzdGF0dXMgPSBsZTE2X3RvX2NwdShwbWdtdC0+dS5hc3NvY19yZXNwLnN0YXR1c19jb2RlKTsKLQlpZiAoc3RhdHVzID4gMCkJewotCQlEQkdfODcyM0EoImFzc29jIHJlamVjdCwgc3RhdHVzIGNvZGU6ICVkXG4iLCBzdGF0dXMpOwotCQlwbWxtZWluZm8tPnN0YXRlID0gTVNSX05PTElOSzsKLQkJcmVzID0gLTQ7Ci0JCWdvdG8gcmVwb3J0X2Fzc29jX3Jlc3VsdDsKLQl9Ci0KLQkvKiBnZXQgY2FwYWJpbGl0aWVzICovCi0JcG1sbWVpbmZvLT5jYXBhYmlsaXR5ID0gbGUxNl90b19jcHUocG1nbXQtPnUuYXNzb2NfcmVzcC5jYXBhYl9pbmZvKTsKLQotCS8qIHNldCBzbG90IHRpbWUgKi8KLQlwbWxtZWluZm8tPnNsb3RUaW1lID0gKHBtbG1laW5mby0+Y2FwYWJpbGl0eSAmIEJJVCgxMCkpPyA5OiAyMDsKLQotCS8qIEFJRCAqLwotCXJlcyA9IHBtbG1laW5mby0+YWlkID0gbGUxNl90b19jcHUocG1nbXQtPnUuYXNzb2NfcmVzcC5haWQpICYgMHgzZmZmOwotCi0JcGllID0gcGZyYW1lICsgb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LmFzc29jX3Jlc3AudmFyaWFibGUpOwotCXBpZWxlbiA9IHBrdF9sZW4gLQotCQlvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYXNzb2NfcmVzcC52YXJpYWJsZSk7Ci0KLQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9IVF9DQVBBQklMSVRZLAotCQkJICAgICBwbWdtdC0+dS5hc3NvY19yZXNwLnZhcmlhYmxlLCBwaWVsZW4pOwotCWlmIChwICYmIHBbMV0pCi0JCUhUX2NhcHNfaGFuZGxlcjIzYShwYWRhcHRlciwgcCk7Ci0KLQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9IVF9PUEVSQVRJT04sCi0JCQkgICAgIHBtZ210LT51LmFzc29jX3Jlc3AudmFyaWFibGUsIHBpZWxlbik7Ci0JaWYgKHAgJiYgcFsxXSkKLQkJSFRfaW5mb19oYW5kbGVyMjNhKHBhZGFwdGVyLCBwKTsKLQotCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0VSUF9JTkZPLAotCQkJICAgICBwbWdtdC0+dS5hc3NvY19yZXNwLnZhcmlhYmxlLCBwaWVsZW4pOwotCWlmIChwICYmIHBbMV0pCi0JCUVSUF9JRV9oYW5kbGVyMjNhKHBhZGFwdGVyLCBwKTsKLQotCXBpZSA9IHBmcmFtZSArIG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5hc3NvY19yZXNwLnZhcmlhYmxlKTsKLQl3aGlsZSAodHJ1ZSkgewotCQlwID0gY2ZnODAyMTFfZmluZF92ZW5kb3JfaWUoV0xBTl9PVUlfTUlDUk9TT0ZULAotCQkJCQkgICAgV0xBTl9PVUlfVFlQRV9NSUNST1NPRlRfV01NLAotCQkJCQkgICAgcGllLCBwZnJhbWUgKyBwa3RfbGVuIC0gcGllKTsKLQkJaWYgKCFwKQotCQkJYnJlYWs7Ci0KLQkJcGllID0gcCArIHBbMV0gKyAyOwotCQkvKiBpZiB0aGlzIElFIGlzIHRvbyBzaG9ydCwgdHJ5IHRoZSBuZXh0ICovCi0JCWlmIChwWzFdIDw9IDQpCi0JCQljb250aW51ZTsKLQkJLyogaWYgdGhpcyBJRSBpcyBXTU0gcGFyYW1zLCB3ZSBmb3VuZCB3aGF0IHdlIHdhbnRlZCAqLwotCQlpZiAocFs2XSA9PSAxKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKHAgJiYgcFsxXSkKLQkJV01NX3BhcmFtX2hhbmRsZXIyM2EocGFkYXB0ZXIsIHApOwotCi0JcG1sbWVpbmZvLT5zdGF0ZSAmPSB+V0lGSV9GV19BU1NPQ19TVEFURTsKLQlwbWxtZWluZm8tPnN0YXRlIHw9IFdJRklfRldfQVNTT0NfU1VDQ0VTUzsKLQotCS8qIFVwZGF0ZSBCYXNpYyBSYXRlIFRhYmxlIGZvciBzcGVjLCAyMDEwLTEyLTI4ICwgYnkgdGhvbWFzICovCi0JVXBkYXRlQnJhdGVUYmwyM2EocGFkYXB0ZXIsIHBtbG1laW5mby0+bmV0d29yay5TdXBwb3J0ZWRSYXRlcyk7Ci0KLXJlcG9ydF9hc3NvY19yZXN1bHQ6Ci0JcG1sbWVwcml2LT5hc3NvY19yc3BfbGVuID0gMDsKLQlpZiAocmVzID4gMCkgewotCQlrZnJlZShwbWxtZXByaXYtPmFzc29jX3JzcCk7Ci0JCXBtbG1lcHJpdi0+YXNzb2NfcnNwID0ga21hbGxvYyhwa3RfbGVuLCBHRlBfQVRPTUlDKTsKLQkJaWYgKHBtbG1lcHJpdi0+YXNzb2NfcnNwKSB7Ci0JCQltZW1jcHkocG1sbWVwcml2LT5hc3NvY19yc3AsIHBmcmFtZSwgcGt0X2xlbik7Ci0JCQlwbWxtZXByaXYtPmFzc29jX3JzcF9sZW4gPSBwa3RfbGVuOwotCQl9Ci0JfSBlbHNlCi0JCWtmcmVlKHBtbG1lcHJpdi0+YXNzb2NfcnNwKTsKLQotCXJlcG9ydF9qb2luX3JlczIzYShwYWRhcHRlciwgcmVzKTsKLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludAotT25EZUF1dGgyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCXVuc2lnbmVkIHNob3J0IHJlYXNvbjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByZWN2X2ZyYW1lLT5wa3Q7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKSBza2ItPmRhdGE7Ci0KLQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwobWdtdC0+YnNzaWQsCi0JCQkgICAgICBnZXRfbXlfYnNzaWQyM2EoJnBtbG1laW5mby0+bmV0d29yaykpKQotCQlyZXR1cm4gX1NVQ0NFU1M7Ci0KLQlyZWFzb24gPSBsZTE2X3RvX2NwdShtZ210LT51LmRlYXV0aC5yZWFzb25fY29kZSk7Ci0KLQlEQkdfODcyM0EoIiVzIFJlYXNvbiBjb2RlKCVkKVxuIiwgX19mdW5jX18sIHJlYXNvbik7Ci0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpKSB7Ci0JCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQkJc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQotCQlEQkdfODcyM0FfTEVWRUwoX2Rydl9hbHdheXNfLCAiYXAgcmVjdiBkZWF1dGggcmVhc29uIGNvZGUoJWQpICIKLQkJCQkic3RhOiVwTVxuIiwgcmVhc29uLCBtZ210LT5zYSk7Ci0KLQkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgbWdtdC0+c2EpOwotCQlpZiAocHN0YSkgewotCQkJdTggdXBkYXRlZCA9IDA7Ci0KLQkJCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKLQkJCWlmICghbGlzdF9lbXB0eSgmcHN0YS0+YXNvY19saXN0KSkgewotCQkJCWxpc3RfZGVsX2luaXQoJnBzdGEtPmFzb2NfbGlzdCk7Ci0JCQkJcHN0YXByaXYtPmFzb2NfbGlzdF9jbnQtLTsKLQkJCQl1cGRhdGVkID0gYXBfZnJlZV9zdGEyM2EocGFkYXB0ZXIsIHBzdGEsCi0JCQkJCQkgICAgICBmYWxzZSwgcmVhc29uKTsKLQkJCX0KLQkJCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwotCi0JCQlhc3NvY2lhdGVkX2NsaWVudHNfdXBkYXRlMjNhKHBhZGFwdGVyLCB1cGRhdGVkKTsKLQkJfQotCi0JCXJldHVybiBfU1VDQ0VTUzsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJREJHXzg3MjNBX0xFVkVMKF9kcnZfYWx3YXlzXywgInN0YSByZWN2IGRlYXV0aCByZWFzb24gY29kZSglZCkgIgotCQkJCSJzdGE6JXBNXG4iLCByZWFzb24sIG1nbXQtPmJzc2lkKTsKLQotCQlyZWNlaXZlX2Rpc2Nvbm5lY3QyM2EocGFkYXB0ZXIsIG1nbXQtPmJzc2lkLCByZWFzb24pOwotCX0KLQlwbWxtZXByaXYtPkxpbmtEZXRlY3RJbmZvLmJCdXN5VHJhZmZpYyA9IGZhbHNlOwotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50Ci1PbkRpc2Fzc29jMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQl1bnNpZ25lZCBzaG9ydCByZWFzb247Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCBza19idWZmICpza2IgPSBwcmVjdl9mcmFtZS0+cGt0OwotCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgc2tiLT5kYXRhOwotCi0JaWYgKCFldGhlcl9hZGRyX2VxdWFsKG1nbXQtPmJzc2lkLAotCQkJICAgICAgZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspKSkKLQkJcmV0dXJuIF9TVUNDRVNTOwotCi0JcmVhc29uID0gbGUxNl90b19jcHUobWdtdC0+dS5kaXNhc3NvYy5yZWFzb25fY29kZSk7Ci0KLQlEQkdfODcyM0EoIiVzIFJlYXNvbiBjb2RlKCVkKVxuIiwgX19mdW5jX18sIHJlYXNvbik7Ci0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpKSB7Ci0JCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQkJc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQotCQlEQkdfODcyM0FfTEVWRUwoX2Rydl9hbHdheXNfLCAiYXAgcmVjdiBkaXNhc3NvYyByZWFzb24gY29kZSglZCkiCi0JCQkJIiBzdGE6JXBNXG4iLCByZWFzb24sIG1nbXQtPnNhKTsKLQotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBtZ210LT5zYSk7Ci0JCWlmIChwc3RhKSB7Ci0JCQl1OCB1cGRhdGVkID0gMDsKLQotCQkJc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwotCQkJaWYgKCFsaXN0X2VtcHR5KCZwc3RhLT5hc29jX2xpc3QpKSB7Ci0JCQkJbGlzdF9kZWxfaW5pdCgmcHN0YS0+YXNvY19saXN0KTsKLQkJCQlwc3RhcHJpdi0+YXNvY19saXN0X2NudC0tOwotCQkJCXVwZGF0ZWQgPSBhcF9mcmVlX3N0YTIzYShwYWRhcHRlciwgcHN0YSwKLQkJCQkJCQkgZmFsc2UsIHJlYXNvbik7Ci0JCQl9Ci0JCQlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKLQotCQkJYXNzb2NpYXRlZF9jbGllbnRzX3VwZGF0ZTIzYShwYWRhcHRlciwgdXBkYXRlZCk7Ci0JCX0KLQotCQlyZXR1cm4gX1NVQ0NFU1M7Ci0JfSBlbHNlCi0jZW5kaWYKLQl7Ci0JCURCR184NzIzQV9MRVZFTChfZHJ2X2Fsd2F5c18sICJhcCByZWN2IGRpc2Fzc29jIHJlYXNvbiAiCi0JCQkJImNvZGUoJWQpIHN0YTolcE1cbiIsIHJlYXNvbiwgbWdtdC0+YnNzaWQpOwotCi0JCXJlY2VpdmVfZGlzY29ubmVjdDIzYShwYWRhcHRlciwgbWdtdC0+YnNzaWQsIHJlYXNvbik7Ci0JfQotCXBtbG1lcHJpdi0+TGlua0RldGVjdEluZm8uYkJ1c3lUcmFmZmljID0gZmFsc2U7Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50Ci1PbkF0aW0yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQKLW9uX2FjdGlvbl9zcGN0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQlyZXR1cm4gX0ZBSUw7Ci19Ci0KLXN0YXRpYyBpbnQKLU9uQWN0aW9uMjNhX3FvcyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50Ci1PbkFjdGlvbjIzYV9kbHMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCBPbkFjdGlvbjIzYV9iYWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCXU4ICphZGRyOwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IE5VTEw7Ci0Jc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsICpwcmVvcmRlcl9jdHJsOwotCXVuc2lnbmVkIGNoYXIgY2F0ZWdvcnksIGFjdGlvbjsKLQl1bnNpZ25lZCBzaG9ydCB0aWQsIHN0YXR1cywgY2FwYWIsIHBhcmFtcywgcmVhc29uX2NvZGUgPSAwOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByZWN2X2ZyYW1lLT5wa3Q7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKSBza2ItPmRhdGE7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQotCS8qIGNoZWNrIFJBIG1hdGNoZXMgb3Igbm90ICovCi0JaWYgKCFldGhlcl9hZGRyX2VxdWFsKG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwgbWdtdC0+ZGEpKQotCQlyZXR1cm4gX1NVQ0NFU1M7Ci0KLQlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoKHBtbG1laW5mby0+c3RhdGUmMHgwMykgIT0gTVNSX0FQKQotCQlpZiAoIShwbWxtZWluZm8tPnN0YXRlICYgV0lGSV9GV19BU1NPQ19TVUNDRVNTKSkKLQkJCXJldHVybiBfU1VDQ0VTUzsKLQotCWFkZHIgPSBtZ210LT5zYTsKLQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBhZGRyKTsKLQotCWlmICghcHN0YSkKLQkJcmV0dXJuIF9TVUNDRVNTOwotCi0JY2F0ZWdvcnkgPSBtZ210LT51LmFjdGlvbi5jYXRlZ29yeTsKLQlpZiAoY2F0ZWdvcnkgPT0gV0xBTl9DQVRFR09SWV9CQUNLKSB7IC8qICByZXByZXNlbnRpbmcgQmxvY2sgQWNrICovCi0JCWlmICghcG1sbWVpbmZvLT5IVF9lbmFibGUpCi0JCQlyZXR1cm4gX1NVQ0NFU1M7Ci0JCS8qIGFjdGlvbl9jb2RlIGlzIGxvY2F0ZWQgaW4gdGhlIHNhbWUgcGxhY2UgZm9yIGFsbAotCQkgICBhY3Rpb24gZXZlbnRzLCBzbyBwaWNrIGFueSAqLwotCQlhY3Rpb24gPSBtZ210LT51LmFjdGlvbi51LndtZV9hY3Rpb24uYWN0aW9uX2NvZGU7Ci0JCURCR184NzIzQSgiJXMsIGFjdGlvbiA9JWRcbiIsIF9fZnVuY19fLCBhY3Rpb24pOwotCQlzd2l0Y2ggKGFjdGlvbikgewotCQljYXNlIFdMQU5fQUNUSU9OX0FEREJBX1JFUTogLyogQUREQkEgcmVxdWVzdCAqLwotCQkJbWVtY3B5KCZwbWxtZWluZm8tPkFEREJBX3JlcSwKLQkJCSAgICAgICAmbWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXEuZGlhbG9nX3Rva2VuLAotCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgQUREQkFfcmVxdWVzdCkpOwotCQkJcHJvY2Vzc19hZGRiYV9yZXEyM2EocGFkYXB0ZXIsCi0JCQkJCSAgICAgKHU4ICopJnBtbG1laW5mby0+QUREQkFfcmVxLCBhZGRyKTsKLQkJCWlmIChwbWxtZWluZm8tPmJBY2NlcHRBZGRiYVJlcSA9PSB0cnVlKQotCQkJCWlzc3VlX2FjdGlvbl9CQTIzYShwYWRhcHRlciwgYWRkciwKLQkJCQkJCSAgIFdMQU5fQUNUSU9OX0FEREJBX1JFU1AsIDApOwotCQkJZWxzZSB7Ci0JCQkJLyogcmVqZWN0IEFEREJBIFJlcSAqLwotCQkJCWlzc3VlX2FjdGlvbl9CQTIzYShwYWRhcHRlciwgYWRkciwKLQkJCQkJCSAgIFdMQU5fQUNUSU9OX0FEREJBX1JFU1AsIDM3KTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fQUNUSU9OX0FEREJBX1JFU1A6IC8qIEFEREJBIHJlc3BvbnNlICovCi0JCQlzdGF0dXMgPSBnZXRfdW5hbGlnbmVkX2xlMTYoCi0JCQkJJm1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVzcC5zdGF0dXMpOwotCQkJY2FwYWIgPSBnZXRfdW5hbGlnbmVkX2xlMTYoCi0JCQkJJm1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVzcC5jYXBhYik7Ci0JCQl0aWQgPSAoY2FwYWIgJiBJRUVFODAyMTFfQUREQkFfUEFSQU1fVElEX01BU0spID4+IDI7Ci0JCQlpZiAoc3RhdHVzID09IDApIHsJLyogc3VjY2Vzc2Z1bCAqLwotCQkJCURCR184NzIzQSgiYWdnX2VuYWJsZSBmb3IgVElEID0lZFxuIiwgdGlkKTsKLQkJCQlwc3RhLT5odHByaXYuYWdnX2VuYWJsZV9iaXRtYXAgfD0gQklUKHRpZCk7Ci0JCQkJcHN0YS0+aHRwcml2LmNhbmRpZGF0ZV90aWRfYml0bWFwICY9IH5CSVQodGlkKTsKLQkJCX0gZWxzZQotCQkJCXBzdGEtPmh0cHJpdi5hZ2dfZW5hYmxlX2JpdG1hcCAmPSB+QklUKHRpZCk7Ci0JCQlicmVhazsKLQotCQljYXNlIFdMQU5fQUNUSU9OX0RFTEJBOiAvKiBERUxCQSAqLwotCQkJcGFyYW1zID0gZ2V0X3VuYWxpZ25lZF9sZTE2KAotCQkJCSZtZ210LT51LmFjdGlvbi51LmRlbGJhLnBhcmFtcyk7Ci0JCQl0aWQgPSBwYXJhbXMgPj4gMTI7Ci0KLQkJCWlmIChwYXJhbXMgJiBJRUVFODAyMTFfREVMQkFfUEFSQU1fSU5JVElBVE9SX01BU0spIHsKLQkJCQlwcmVvcmRlcl9jdHJsID0gJnBzdGEtPnJlY3ZyZW9yZGVyX2N0cmxbdGlkXTsKLQkJCQlwcmVvcmRlcl9jdHJsLT5lbmFibGUgPSBmYWxzZTsKLQkJCQlwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEgPSAweGZmZmY7Ci0JCQl9IGVsc2UgewotCQkJCXBzdGEtPmh0cHJpdi5hZ2dfZW5hYmxlX2JpdG1hcCAmPSB+QklUKHRpZCk7Ci0JCQkJcHN0YS0+aHRwcml2LmNhbmRpZGF0ZV90aWRfYml0bWFwICY9IH5CSVQodGlkKTsKLQkJCX0KLQkJCXJlYXNvbl9jb2RlID0gZ2V0X3VuYWxpZ25lZF9sZTE2KAotCQkJCSZtZ210LT51LmFjdGlvbi51LmRlbGJhLnJlYXNvbl9jb2RlKTsKLQkJCS8qIHRvZG86IGhvdyB0byBub3RpZnkgdGhlIGhvc3Qgd2hpbGUgcmVjZWl2aW5nCi0JCQkgICBERUxFVEUgQkEgKi8KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IG9uX2FjdGlvbl9wdWJsaWMyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByZWN2X2ZyYW1lLT5wa3Q7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7Ci0JdTggKnBmcmFtZSA9IHNrYi0+ZGF0YTsKLQlpbnQgZnJlcSwgY2hhbm5lbDsKLQotCS8qIGNoZWNrIFJBIG1hdGNoZXMgb3Igbm90ICovCi0JaWYgKCFldGhlcl9hZGRyX2VxdWFsKG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwgaGRyLT5hZGRyMSkpCi0JCXJldHVybiBfRkFJTDsKLQotCWNoYW5uZWwgPSBydHdfZ2V0X29wZXJfY2gyM2EocGFkYXB0ZXIpOwotCi0JaWYgKGNoYW5uZWwgPD0gUlRXX0NIX01BWF8yR19DSEFOTkVMKQotCQlmcmVxID0gaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGNoYW5uZWwsCi0JCQkJCQkgICAgICBOTDgwMjExX0JBTkRfMkdIWik7Ci0JZWxzZQotCQlmcmVxID0gaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGNoYW5uZWwsCi0JCQkJCQkgICAgICBOTDgwMjExX0JBTkRfNUdIWik7Ci0KLQlpZiAoY2ZnODAyMTFfcnhfbWdtdChwYWRhcHRlci0+cnR3X3dkZXYsIGZyZXEsIDAsIHBmcmFtZSwKLQkJCSAgICAgc2tiLT5sZW4sIDApKQotCQlyZXR1cm4gX1NVQ0NFU1M7Ci0KLQlyZXR1cm4gX0ZBSUw7Ci19Ci0KLXN0YXRpYyBpbnQKLU9uQWN0aW9uMjNhX2h0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQKLU9uQWN0aW9uMjNhX3dtbShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50Ci1PbkFjdGlvbjIzYV9wMnAoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludAotT25BY3Rpb24yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCWludCBpOwotCXU4IGNhdGVnb3J5OwotCXN0cnVjdCBhY3Rpb25faGFuZGxlciAqcHRhYmxlOwotCXN0cnVjdCBza19idWZmICpza2IgPSBwcmVjdl9mcmFtZS0+cGt0OwotCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgc2tiLT5kYXRhOwotCi0JY2F0ZWdvcnkgPSBtZ210LT51LmFjdGlvbi5jYXRlZ29yeTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKE9uQWN0aW9uMjNhX3RibCk7IGkrKykgewotCQlwdGFibGUgPSAmT25BY3Rpb24yM2FfdGJsW2ldOwotCi0JCWlmIChjYXRlZ29yeSA9PSBwdGFibGUtPm51bSkKLQkJCXB0YWJsZS0+ZnVuYyhwYWRhcHRlciwgcHJlY3ZfZnJhbWUpOwotCX0KLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCBEb1Jlc2VydmVkMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RydWN0IHhtaXRfZnJhbWUgKmFsbG9jX21ndHhtaXRmcmFtZTIzYShzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYpCi17Ci0Jc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWU7Ci0Jc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1ZjsKLQotCXBtZ250ZnJhbWUgPSBydHdfYWxsb2NfeG1pdGZyYW1lMjNhX2V4dChweG1pdHByaXYpOwotCi0JaWYgKCFwbWdudGZyYW1lKSB7Ci0JCURCR184NzIzQSgiJXMoJXMpOiBhbGxvYyB4bWl0ZnJhbWUgZmFpbFxuIiwgX19mdW5jX18sCi0JCQkgIHB4bWl0cHJpdi0+YWRhcHRlci0+cG5ldGRldi0+bmFtZSk7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlweG1pdGJ1ZiA9IHJ0d19hbGxvY194bWl0YnVmMjNhX2V4dChweG1pdHByaXYpOwotCWlmICghcHhtaXRidWYpIHsKLQkJREJHXzg3MjNBKCIlcyglcyk6IGFsbG9jIHhtaXRidWYgZmFpbFxuIiwgX19mdW5jX18sCi0JCQkgIHB4bWl0cHJpdi0+YWRhcHRlci0+cG5ldGRldi0+bmFtZSk7Ci0JCXJ0d19mcmVlX3htaXRmcmFtZTIzYShweG1pdHByaXYsIHBtZ250ZnJhbWUpOwotCQlwbWdudGZyYW1lID0gTlVMTDsKLQkJZ290byBleGl0OwotCX0KLQotCXBtZ250ZnJhbWUtPmZyYW1lX3RhZyA9IE1HTlRfRlJBTUVUQUc7Ci0JcG1nbnRmcmFtZS0+cHhtaXRidWYgPSBweG1pdGJ1ZjsKLQlwbWdudGZyYW1lLT5idWZfYWRkciA9IHB4bWl0YnVmLT5wYnVmOwotCXB4bWl0YnVmLT5wcml2X2RhdGEgPSBwbWdudGZyYW1lOwotCi1leGl0OgotCXJldHVybiBwbWdudGZyYW1lOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1Gb2xsb3dpbmcgYXJlIHNvbWUgVFggZnVuY3Rpb25zIGZvciBXaUZpIE1MTUUKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgdXBkYXRlX21nbnRfdHhfcmF0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCByYXRlKQotewotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0KLQlwbWxtZWV4dC0+dHhfcmF0ZSA9IHJhdGU7Ci0JREJHXzg3MjNBKCIlcygpOiByYXRlID0gJXhcbiIsIF9fZnVuY19fLCByYXRlKTsKLX0KLQotdm9pZCB1cGRhdGVfbWdudGZyYW1lX2F0dHJpYjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliKQotewotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0KLQltZW1zZXQoKHU4ICopcGF0dHJpYiwgMCwgc2l6ZW9mKHN0cnVjdCBwa3RfYXR0cmliKSk7Ci0KLQlwYXR0cmliLT5oZHJsZW4gPSAyNDsKLQlwYXR0cmliLT5ucl9mcmFncyA9IDE7Ci0JcGF0dHJpYi0+cHJpb3JpdHkgPSA3OwotCXBhdHRyaWItPm1hY19pZCA9IDA7Ci0JcGF0dHJpYi0+cXNlbCA9IDB4MTI7Ci0KLQlwYXR0cmliLT5wa3RsZW4gPSAwOwotCi0JaWYgKHBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSAmIFdJUkVMRVNTXzExQikKLQkJcGF0dHJpYi0+cmFpZCA9IDY7LyogYiBtb2RlICovCi0JZWxzZQotCQlwYXR0cmliLT5yYWlkID0gNTsvKiBhL2cgbW9kZSAqLwotCi0JcGF0dHJpYi0+ZW5jcnlwdCA9IDA7Ci0JcGF0dHJpYi0+YnN3ZW5jID0gZmFsc2U7Ci0KLQlwYXR0cmliLT5xb3NfZW4gPSBmYWxzZTsKLQlwYXR0cmliLT5odF9lbiA9IGZhbHNlOwotCXBhdHRyaWItPmJ3bW9kZSA9IEhUX0NIQU5ORUxfV0lEVEhfMjA7Ci0JcGF0dHJpYi0+Y2hfb2Zmc2V0ID0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRTsKLQlwYXR0cmliLT5zZ2kgPSBmYWxzZTsKLQotCXBhdHRyaWItPnNlcW51bSA9IHBtbG1lZXh0LT5tZ250X3NlcTsKLQotCXBhdHRyaWItPnJldHJ5X2N0cmwgPSB0cnVlOwotfQotCi12b2lkIGR1bXBfbWdudGZyYW1lMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCSAgICAgICBzdHJ1Y3QgeG1pdF9mcmFtZSAqcG1nbnRmcmFtZSkKLXsKLQlpZiAocGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgPT0gdHJ1ZSB8fAotCSAgICBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPT0gdHJ1ZSkKLQkJcmV0dXJuOwotCi0JcnRsODcyM2F1X21nbnRfeG1pdChwYWRhcHRlciwgcG1nbnRmcmFtZSk7Ci19Ci0KLWludCBkdW1wX21nbnRmcmFtZTIzYV9hbmRfd2FpdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICAgIHN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lLCBpbnQgdGltZW91dF9tcykKLXsKLQlpbnQgcmV0ID0gX0ZBSUw7Ci0JdW5zaWduZWQgbG9uZyBpcnFMOwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1ZiA9IHBtZ250ZnJhbWUtPnB4bWl0YnVmOwotCXN0cnVjdCBzdWJtaXRfY3R4IHNjdHg7Ci0KLQlpZiAocGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgPT0gdHJ1ZSB8fAotCSAgICBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPT0gdHJ1ZSkKLQkJcmV0dXJuIHJldDsKLQotCXJ0d19zY3R4X2luaXQyM2EoJnNjdHgsIHRpbWVvdXRfbXMpOwotCXB4bWl0YnVmLT5zY3R4ID0gJnNjdHg7Ci0KLQlyZXQgPSBydGw4NzIzYXVfbWdudF94bWl0KHBhZGFwdGVyLCBwbWdudGZyYW1lKTsKLQotCWlmIChyZXQgPT0gX1NVQ0NFU1MpCi0JCXJldCA9IHJ0d19zY3R4X3dhaXQyM2EoJnNjdHgpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnB4bWl0cHJpdi0+bG9ja19zY3R4LCBpcnFMKTsKLQlweG1pdGJ1Zi0+c2N0eCA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHhtaXRwcml2LT5sb2NrX3NjdHgsIGlycUwpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IGR1bXBfbWdudGZyYW1lMjNhX2FuZF93YWl0X2FjazIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICAgIHN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lKQotewotCWludCByZXQgPSBfRkFJTDsKLQl1MzIgdGltZW91dF9tcyA9IDUwMDsvKiAgIDUwMG1zICovCi0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQotCWlmIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCA9PSB0cnVlIHx8Ci0JICAgIHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCA9PSB0cnVlKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQltdXRleF9sb2NrKCZweG1pdHByaXYtPmFja190eF9tdXRleCk7Ci0JcHhtaXRwcml2LT5hY2tfdHggPSB0cnVlOwotCi0JcG1nbnRmcmFtZS0+YWNrX3JlcG9ydCA9IDE7Ci0JaWYgKHJ0bDg3MjNhdV9tZ250X3htaXQocGFkYXB0ZXIsIHBtZ250ZnJhbWUpID09IF9TVUNDRVNTKQotCQlyZXQgPSBydHdfYWNrX3R4X3dhaXQyM2EocHhtaXRwcml2LCB0aW1lb3V0X21zKTsKLQotCXB4bWl0cHJpdi0+YWNrX3R4ID0gZmFsc2U7Ci0JbXV0ZXhfdW5sb2NrKCZweG1pdHByaXYtPmFja190eF9tdXRleCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHVwZGF0ZV9oaWRkZW5fc3NpZCh1OCAqaWVzLCB1MzIgaWVzX2xlbiwgdTggaGlkZGVuX3NzaWRfbW9kZSkKLXsKLQl1OCAqc3NpZF9pZTsKLQlpbnQgc3NpZF9sZW5fb3JpOwotCWludCBsZW5fZGlmZiA9IDA7Ci0JdTggKm5leHRfaWU7Ci0JdTMyIHJlbWFpbl9sZW47Ci0KLQlzc2lkX2llID0gcnR3X2dldF9pZTIzYShpZXMsICBXTEFOX0VJRF9TU0lELCAmc3NpZF9sZW5fb3JpLCBpZXNfbGVuKTsKLQotCS8qIERCR184NzIzQSgiJXMgaGlkZGVuX3NzaWRfbW9kZToldSwgc3NpZF9pZTolcCwgc3NpZF9sZW5fb3JpOiVkXG4iLAotCSAgIF9fZnVuY19fLCBoaWRkZW5fc3NpZF9tb2RlLCBzc2lkX2llLCBzc2lkX2xlbl9vcmkpOyAqLwotCi0JaWYgKHNzaWRfaWUgJiYgc3NpZF9sZW5fb3JpID4gMCkgewotCQlzd2l0Y2ggKGhpZGRlbl9zc2lkX21vZGUpIHsKLQkJY2FzZSAxOgotCQkJbmV4dF9pZSA9IHNzaWRfaWUgKyAyICsgc3NpZF9sZW5fb3JpOwotCQkJcmVtYWluX2xlbiA9IGllc19sZW4gLShuZXh0X2llLWllcyk7Ci0KLQkJCXNzaWRfaWVbMV0gPSAwOwotCQkJbWVtY3B5KHNzaWRfaWUrMiwgbmV4dF9pZSwgcmVtYWluX2xlbik7Ci0JCQlsZW5fZGlmZiAtPSBzc2lkX2xlbl9vcmk7Ci0KLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQltZW1zZXQoJnNzaWRfaWVbMl0sIDAsIHNzaWRfbGVuX29yaSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIGxlbl9kaWZmOwotfQotCi12b2lkIGlzc3VlX2JlYWNvbjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBpbnQgdGltZW91dF9tcykKLXsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcG1nbnRmcmFtZTsKLQlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYjsKLQl1bnNpZ25lZCBjaGFyICpwZnJhbWU7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwotCXVuc2lnbmVkIGludCByYXRlX2xlbjsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqY3VyX25ldHdvcmsgPSAmcG1sbWVpbmZvLT5uZXR3b3JrOwotCXU4IGJjX2FkZHJbXSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKLQljb25zdCB1OCAqd3BzX2llOwotCXU4IHNyID0gMDsKLQlpbnQgbGVuX2RpZmY7Ci0KLQkvKiBEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7ICovCi0KLQlwbWdudGZyYW1lID0gYWxsb2NfbWd0eG1pdGZyYW1lMjNhKHB4bWl0cHJpdik7Ci0JaWYgKCFwbWdudGZyYW1lKSB7Ci0JCURCR184NzIzQSgiJXMsIGFsbG9jIG1nbnQgZnJhbWUgZmFpbFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5iY25fdXBkYXRlX2xvY2spOwotI2VuZGlmCi0KLQkvKiB1cGRhdGUgYXR0cmlidXRlICovCi0JcGF0dHJpYiA9ICZwbWdudGZyYW1lLT5hdHRyaWI7Ci0JdXBkYXRlX21nbnRmcmFtZV9hdHRyaWIyM2EocGFkYXB0ZXIsIHBhdHRyaWIpOwotCXBhdHRyaWItPnFzZWwgPSAweDEwOwotCi0JbWVtc2V0KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCAwLCBXTEFOSERSX09GRlNFVCArIFRYREVTQ19PRkZTRVQpOwotCi0JcGZyYW1lID0gKHU4ICopKHBtZ250ZnJhbWUtPmJ1Zl9hZGRyKSArIFRYREVTQ19PRkZTRVQ7Ci0JbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKilwZnJhbWU7Ci0KLQltZ210LT5mcmFtZV9jb250cm9sID0KLQkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfCBJRUVFODAyMTFfU1RZUEVfQkVBQ09OKTsKLQltZ210LT5zZXFfY3RybCA9IDA7Ci0KLQlldGhlcl9hZGRyX2NvcHkobWdtdC0+ZGEsIGJjX2FkZHIpOwotCWV0aGVyX2FkZHJfY29weShtZ210LT5zYSwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpKTsKLQlldGhlcl9hZGRyX2NvcHkobWdtdC0+YnNzaWQsIGdldF9teV9ic3NpZDIzYShjdXJfbmV0d29yaykpOwotCi0JLyogdGltZXN0YW1wIHdpbGwgYmUgaW5zZXJ0ZWQgYnkgaGFyZHdhcmUgKi8KLQotCXB1dF91bmFsaWduZWRfbGUxNihjdXJfbmV0d29yay0+YmVhY29uX2ludGVydmFsLAotCQkJICAgJm1nbXQtPnUuYmVhY29uLmJlYWNvbl9pbnQpOwotCi0JcHV0X3VuYWxpZ25lZF9sZTE2KGN1cl9uZXR3b3JrLT5jYXBhYmlsaXR5LAotCQkJICAgJm1nbXQtPnUuYmVhY29uLmNhcGFiX2luZm8pOwotCi0JcGZyYW1lID0gbWdtdC0+dS5iZWFjb24udmFyaWFibGU7Ci0JcGF0dHJpYi0+cGt0bGVuID0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LmJlYWNvbi52YXJpYWJsZSk7Ci0KLQlpZiAoKHBtbG1laW5mby0+c3RhdGUgJiAweDAzKSA9PSBNU1JfQVApIHsKLQkJdTggKmllYnVmOwotCQlpbnQgYnVmbGVuOwotCQkvKiBEQkdfODcyM0EoImllIGxlbiA9JWRcbiIsIGN1cl9uZXR3b3JrLT5JRUxlbmd0aCk7ICovCi0JCW1lbWNweShwZnJhbWUsIGN1cl9uZXR3b3JrLT5JRXMsIGN1cl9uZXR3b3JrLT5JRUxlbmd0aCk7Ci0JCWxlbl9kaWZmID0gdXBkYXRlX2hpZGRlbl9zc2lkKHBmcmFtZSwgY3VyX25ldHdvcmstPklFTGVuZ3RoLAotCQkJCQkgICAgICBwbWxtZWluZm8tPmhpZGRlbl9zc2lkX21vZGUpOwotCQlwZnJhbWUgKz0gKGN1cl9uZXR3b3JrLT5JRUxlbmd0aCtsZW5fZGlmZik7Ci0JCXBhdHRyaWItPnBrdGxlbiArPSAoY3VyX25ldHdvcmstPklFTGVuZ3RoK2xlbl9kaWZmKTsKLQotCQlpZWJ1ZiA9IG1nbXQtPnUuYmVhY29uLnZhcmlhYmxlOwotCQlidWZsZW4gPSBwYXR0cmliLT5wa3RsZW4gLQotCQkJb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LmJlYWNvbi52YXJpYWJsZSk7Ci0JCXdwc19pZSA9IGNmZzgwMjExX2ZpbmRfdmVuZG9yX2llKFdMQU5fT1VJX01JQ1JPU09GVCwKLQkJCQkJCSBXTEFOX09VSV9UWVBFX01JQ1JPU09GVF9XUFMsCi0JCQkJCQkgaWVidWYsIGJ1Zmxlbik7Ci0KLQkJaWYgKHdwc19pZSAmJiB3cHNfaWVbMV0gPiAwKSB7Ci0JCQlydHdfZ2V0X3dwc19hdHRyX2NvbnRlbnQyM2Eod3BzX2llLCB3cHNfaWVbMV0sCi0JCQkJCQkgICAgV1BTX0FUVFJfU0VMRUNURURfUkVHSVNUUkFSLAotCQkJCQkJICAgICh1OCAqKSZzcik7Ci0JCX0KLQkJaWYgKHNyICE9IDApCi0JCQlzZXRfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfVU5ERVJfV1BTKTsKLQkJZWxzZQotCQkJX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIFdJRklfVU5ERVJfV1BTKTsKLQotCQlnb3RvIF9pc3N1ZV9iY247Ci0JfQotCi0JLyogIFNTSUQgKi8KLQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfU1NJRCwKLQkJCSAgICAgICBjdXJfbmV0d29yay0+U3NpZC5zc2lkX2xlbiwKLQkJCSAgICAgICBjdXJfbmV0d29yay0+U3NpZC5zc2lkLCAmcGF0dHJpYi0+cGt0bGVuKTsKLQotCS8qICBzdXBwb3J0ZWQgcmF0ZXMuLi4gKi8KLQlyYXRlX2xlbiA9IHJ0d19nZXRfcmF0ZXNldF9sZW4yM2EoY3VyX25ldHdvcmstPlN1cHBvcnRlZFJhdGVzKTsKLQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfU1VQUF9SQVRFUywKLQkJCSAgICAgICAoKHJhdGVfbGVuID4gOCk/IDg6IHJhdGVfbGVuKSwKLQkJCSAgICAgICBjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMsICZwYXR0cmliLT5wa3RsZW4pOwotCi0JLyogIERTIHBhcmFtZXRlciBzZXQgKi8KLQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfRFNfUEFSQU1TLCAxLCAodW5zaWduZWQgY2hhciAqKQotCQkJICAgICAgICZjdXJfbmV0d29yay0+RFNDb25maWcsICZwYXR0cmliLT5wa3RsZW4pOwotCi0JLyogaWYgKChwbWxtZWluZm8tPnN0YXRlJjB4MDMpID09IE1TUl9BREhPQykgKi8KLQl7Ci0JCXU4IGVycGluZm8gPSAwOwotCQl1MzIgQVRJTVdpbmRvdzsKLQkJLyogIElCU1MgUGFyYW1ldGVyIFNldC4uLiAqLwotCQkvKiBBVElNV2luZG93ID0gY3VyLT5BVElNV2luZG93OyAqLwotCQlBVElNV2luZG93ID0gMDsKLQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX0lCU1NfUEFSQU1TLCAyLAotCQkJCSAgICAgICAodW5zaWduZWQgY2hhciAqKSZBVElNV2luZG93LAotCQkJCSAgICAgICAmcGF0dHJpYi0+cGt0bGVuKTsKLQotCQkvKiBFUlAgSUUgKi8KLQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX0VSUF9JTkZPLCAxLAotCQkJCSAgICAgICAmZXJwaW5mbywgJnBhdHRyaWItPnBrdGxlbik7Ci0JfQotCi0JLyogIEVYVEVSTkRFRCBTVVBQT1JURUQgUkFURSAqLwotCWlmIChyYXRlX2xlbiA+IDgpCi0JCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9FWFRfU1VQUF9SQVRFUywKLQkJCQkgICAgICAgcmF0ZV9sZW4gLSA4LAotCQkJCSAgICAgICBjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMgKyA4LAotCQkJCSAgICAgICAmcGF0dHJpYi0+cGt0bGVuKTsKLQotCS8qIHRvZG86SFQgZm9yIGFkaG9jICovCi0KLV9pc3N1ZV9iY246Ci0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQlwbWxtZXByaXYtPnVwZGF0ZV9iY24gPSBmYWxzZTsKLQotCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmJjbl91cGRhdGVfbG9jayk7Ci0jZW5kaWYKLQotCWlmICgocGF0dHJpYi0+cGt0bGVuICsgVFhERVNDX1NJWkUpID4gNTEyKSB7Ci0JCURCR184NzIzQSgiYmVhY29uIGZyYW1lIHRvbyBsYXJnZVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlwYXR0cmliLT5sYXN0X3R4Y21kc3ogPSBwYXR0cmliLT5wa3RsZW47Ci0KLQkvKiBEQkdfODcyM0EoImlzc3VlIGJjbl9zeiA9JWRcbiIsIHBhdHRyaWItPmxhc3RfdHhjbWRzeik7ICovCi0JaWYgKHRpbWVvdXRfbXMgPiAwKQotCQlkdW1wX21nbnRmcmFtZTIzYV9hbmRfd2FpdChwYWRhcHRlciwgcG1nbnRmcmFtZSwgdGltZW91dF9tcyk7Ci0JZWxzZQotCQlkdW1wX21nbnRmcmFtZTIzYShwYWRhcHRlciwgcG1nbnRmcmFtZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGlzc3VlX3Byb2JlcnNwKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgKmRhKQotewotCXN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lOwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwotCXVuc2lnbmVkIGNoYXIgKnBmcmFtZTsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7Ci0JdW5zaWduZWQgY2hhciAqbWFjLCAqYnNzaWQ7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQljb25zdCB1OCAqcHdwc19pZTsKLQl1OCAqc3NpZF9pZTsKLQlpbnQgc3NpZF9pZWxlbjsKLQlpbnQgc3NpZF9pZWxlbl9kaWZmOwotCXU4IGJ1ZltNQVhfSUVfU1pdOwotI2VuZGlmCi0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqY3VyX25ldHdvcmsgPSAmcG1sbWVpbmZvLT5uZXR3b3JrOwotCXVuc2lnbmVkIGludCByYXRlX2xlbjsKLQotCS8qIERCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsgKi8KLQotCWlmIChjdXJfbmV0d29yay0+SUVMZW5ndGggPiBNQVhfSUVfU1opCi0JCXJldHVybjsKLQotCXBtZ250ZnJhbWUgPSBhbGxvY19tZ3R4bWl0ZnJhbWUyM2EocHhtaXRwcml2KTsKLQlpZiAoIXBtZ250ZnJhbWUpIHsKLQkJREJHXzg3MjNBKCIlcywgYWxsb2MgbWdudCBmcmFtZSBmYWlsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiB1cGRhdGUgYXR0cmlidXRlICovCi0JcGF0dHJpYiA9ICZwbWdudGZyYW1lLT5hdHRyaWI7Ci0JdXBkYXRlX21nbnRmcmFtZV9hdHRyaWIyM2EocGFkYXB0ZXIsIHBhdHRyaWIpOwotCi0JbWVtc2V0KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCAwLCBXTEFOSERSX09GRlNFVCArIFRYREVTQ19PRkZTRVQpOwotCi0JcGZyYW1lID0gKHU4ICopcG1nbnRmcmFtZS0+YnVmX2FkZHIgKyBUWERFU0NfT0ZGU0VUOwotCW1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopcGZyYW1lOwotCi0JbWFjID0gbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpOwotCWJzc2lkID0gY3VyX25ldHdvcmstPk1hY0FkZHJlc3M7Ci0KLQltZ210LT5mcmFtZV9jb250cm9sID0KLQkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfCBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCk7Ci0KLQlldGhlcl9hZGRyX2NvcHkobWdtdC0+ZGEsIGRhKTsKLQlldGhlcl9hZGRyX2NvcHkobWdtdC0+c2EsIG1hYyk7Ci0JZXRoZXJfYWRkcl9jb3B5KG1nbXQtPmJzc2lkLCBic3NpZCk7Ci0KLQltZ210LT5zZXFfY3RybCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TTl9UT19TRVEocG1sbWVleHQtPm1nbnRfc2VxKSk7Ci0JcG1sbWVleHQtPm1nbnRfc2VxKys7Ci0KLQlwYXR0cmliLT5oZHJsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwotCi0JLyogdGltZXN0YW1wIHdpbGwgYmUgaW5zZXJ0ZWQgYnkgaGFyZHdhcmUgKi8KLQlwdXRfdW5hbGlnbmVkX2xlMTYoY3VyX25ldHdvcmstPmJlYWNvbl9pbnRlcnZhbCwKLQkJCSAgICZtZ210LT51LnByb2JlX3Jlc3AuYmVhY29uX2ludCk7Ci0KLQlwdXRfdW5hbGlnbmVkX2xlMTYoY3VyX25ldHdvcmstPmNhcGFiaWxpdHksCi0JCQkgICAmbWdtdC0+dS5wcm9iZV9yZXNwLmNhcGFiX2luZm8pOwotCi0JcGZyYW1lID0gbWdtdC0+dS5wcm9iZV9yZXNwLnZhcmlhYmxlOwotCXBhdHRyaWItPnBrdGxlbiA9Ci0JCW9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5wcm9iZV9yZXNwLnZhcmlhYmxlKTsKLQotCS8qIGJlbG93IGZvciBhZC1ob2MgbW9kZSAqLwotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0JaWYgKChwbWxtZWluZm8tPnN0YXRlICYgMHgwMykgPT0gTVNSX0FQKSB7Ci0JCXB3cHNfaWUgPSBjZmc4MDIxMV9maW5kX3ZlbmRvcl9pZShXTEFOX09VSV9NSUNST1NPRlQsCi0JCQkJCQkgIFdMQU5fT1VJX1RZUEVfTUlDUk9TT0ZUX1dQUywKLQkJCQkJCSAgY3VyX25ldHdvcmstPklFcywKLQkJCQkJCSAgY3VyX25ldHdvcmstPklFTGVuZ3RoKTsKLQotCQltZW1jcHkocGZyYW1lLCBjdXJfbmV0d29yay0+SUVzLCBjdXJfbmV0d29yay0+SUVMZW5ndGgpOwotCQlwZnJhbWUgKz0gY3VyX25ldHdvcmstPklFTGVuZ3RoOwotCQlwYXR0cmliLT5wa3RsZW4gKz0gY3VyX25ldHdvcmstPklFTGVuZ3RoOwotCi0JCS8qIHJldHJpZXZlIFNTSUQgSUUgZnJvbSBjdXJfbmV0d29yay0+U3NpZCAqLwotCi0JCXNzaWRfaWUgPSBydHdfZ2V0X2llMjNhKG1nbXQtPnUucHJvYmVfcmVzcC52YXJpYWJsZSwKLQkJCQkJV0xBTl9FSURfU1NJRCwgJnNzaWRfaWVsZW4sCi0JCQkJCXBmcmFtZSAtIG1nbXQtPnUucHJvYmVfcmVzcC52YXJpYWJsZSk7Ci0KLQkJc3NpZF9pZWxlbl9kaWZmID0gY3VyX25ldHdvcmstPlNzaWQuc3NpZF9sZW4gLSBzc2lkX2llbGVuOwotCi0JCWlmIChzc2lkX2llICYmIGN1cl9uZXR3b3JrLT5Tc2lkLnNzaWRfbGVuKSB7Ci0JCQl1aW50IHJlbWFpbmRlcl9pZWxlbjsKLQkJCXU4ICpyZW1haW5kZXJfaWU7Ci0KLQkJCXJlbWFpbmRlcl9pZSA9IHNzaWRfaWUgKyAyOwotCi0JCQlyZW1haW5kZXJfaWVsZW4gPSBwZnJhbWUgLSByZW1haW5kZXJfaWU7Ci0KLQkJCURCR184NzIzQV9MRVZFTChfZHJ2X3dhcm5pbmdfLCAiJXMoJXMpOiAiCi0JCQkJCSJyZW1haW5kZXJfaWVsZW4gPiBNQVhfSUVfU1pcbiIsCi0JCQkJCV9fZnVuY19fLCBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSk7Ci0JCQlpZiAocmVtYWluZGVyX2llbGVuID4gTUFYX0lFX1NaKQotCQkJCXJlbWFpbmRlcl9pZWxlbiA9IE1BWF9JRV9TWjsKLQotCQkJbWVtY3B5KGJ1ZiwgcmVtYWluZGVyX2llLCByZW1haW5kZXJfaWVsZW4pOwotCQkJbWVtY3B5KHJlbWFpbmRlcl9pZSArIHNzaWRfaWVsZW5fZGlmZiwgYnVmLAotCQkJICAgICAgIHJlbWFpbmRlcl9pZWxlbik7Ci0JCQkqKHNzaWRfaWUgKyAxKSA9IGN1cl9uZXR3b3JrLT5Tc2lkLnNzaWRfbGVuOwotCQkJbWVtY3B5KHNzaWRfaWUgKyAyLCBjdXJfbmV0d29yay0+U3NpZC5zc2lkLAotCQkJICAgICAgIGN1cl9uZXR3b3JrLT5Tc2lkLnNzaWRfbGVuKTsKLQotCQkJcGZyYW1lICs9IHNzaWRfaWVsZW5fZGlmZjsKLQkJCXBhdHRyaWItPnBrdGxlbiArPSBzc2lkX2llbGVuX2RpZmY7Ci0JCX0KLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJLyogIFNTSUQgKi8KLQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX1NTSUQsCi0JCQkJICAgICAgIGN1cl9uZXR3b3JrLT5Tc2lkLnNzaWRfbGVuLAotCQkJCSAgICAgICBjdXJfbmV0d29yay0+U3NpZC5zc2lkLAotCQkJCSAgICAgICAmcGF0dHJpYi0+cGt0bGVuKTsKLQotCQkvKiAgc3VwcG9ydGVkIHJhdGVzLi4uICovCi0JCXJhdGVfbGVuID0gcnR3X2dldF9yYXRlc2V0X2xlbjIzYShjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMpOwotCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfU1VQUF9SQVRFUywKLQkJCQkgICAgICAgKChyYXRlX2xlbiA+IDgpPyA4OiByYXRlX2xlbiksCi0JCQkJICAgICAgIGN1cl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcywKLQkJCQkgICAgICAgJnBhdHRyaWItPnBrdGxlbik7Ci0KLQkJLyogIERTIHBhcmFtZXRlciBzZXQgKi8KLQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX0RTX1BBUkFNUywgMSwKLQkJCQkgICAgICAgKHVuc2lnbmVkIGNoYXIgKikmY3VyX25ldHdvcmstPkRTQ29uZmlnLAotCQkJCSAgICAgICAmcGF0dHJpYi0+cGt0bGVuKTsKLQotCQlpZiAoKHBtbG1laW5mby0+c3RhdGUgJiAweDAzKSA9PSBNU1JfQURIT0MpIHsKLQkJCXU4IGVycGluZm8gPSAwOwotCQkJdTMyIEFUSU1XaW5kb3c7Ci0JCQkvKiAgSUJTUyBQYXJhbWV0ZXIgU2V0Li4uICovCi0JCQkvKiBBVElNV2luZG93ID0gY3VyLT5BVElNV2luZG93OyAqLwotCQkJQVRJTVdpbmRvdyA9IDA7Ci0JCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfSUJTU19QQVJBTVMsIDIsCi0JCQkJCSAgICAgICAodW5zaWduZWQgY2hhciAqKSZBVElNV2luZG93LAotCQkJCQkgICAgICAgJnBhdHRyaWItPnBrdGxlbik7Ci0KLQkJCS8qIEVSUCBJRSAqLwotCQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX0VSUF9JTkZPLCAxLAotCQkJCQkgICAgICAgJmVycGluZm8sICZwYXR0cmliLT5wa3RsZW4pOwotCQl9Ci0KLQkJLyogIEVYVEVSTkRFRCBTVVBQT1JURUQgUkFURSAqLwotCQlpZiAocmF0ZV9sZW4gPiA4KQotCQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX0VYVF9TVVBQX1JBVEVTLAotCQkJCQkgICAgICAgcmF0ZV9sZW4gLSA4LAotCQkJCQkgICAgICAgY3VyX25ldHdvcmstPlN1cHBvcnRlZFJhdGVzICsgOCwKLQkJCQkJICAgICAgICZwYXR0cmliLT5wa3RsZW4pOwotCi0JCS8qIHRvZG86SFQgZm9yIGFkaG9jICovCi0JfQotCi0JcGF0dHJpYi0+bGFzdF90eGNtZHN6ID0gcGF0dHJpYi0+cGt0bGVuOwotCi0JZHVtcF9tZ250ZnJhbWUyM2EocGFkYXB0ZXIsIHBtZ250ZnJhbWUpOwotfQotCi1zdGF0aWMgaW50IF9pc3N1ZV9wcm9iZXJlcShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgc3RydWN0IGNmZzgwMjExX3NzaWQgKnBzc2lkLCB1OCAqZGEsIGludCB3YWl0X2FjaykKLXsKLQlpbnQgcmV0ID0gX0ZBSUw7Ci0Jc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWU7Ci0Jc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWI7Ci0JdW5zaWduZWQgY2hhciAqcGZyYW1lOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpwd2xhbmhkcjsKLQl1bnNpZ25lZCBjaGFyICptYWM7Ci0JdW5zaWduZWQgY2hhciBic3NyYXRlW051bVJhdGVzXTsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlpbnQgYnNzcmF0ZV9sZW4gPSAwOwotCXU4IGJjX2FkZHJbXSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X25vdGljZV8sCi0JCSAiKyVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlwbWdudGZyYW1lID0gYWxsb2NfbWd0eG1pdGZyYW1lMjNhKHB4bWl0cHJpdik7Ci0JaWYgKCFwbWdudGZyYW1lKQotCQlnb3RvIGV4aXQ7Ci0KLQkvKiB1cGRhdGUgYXR0cmlidXRlICovCi0JcGF0dHJpYiA9ICZwbWdudGZyYW1lLT5hdHRyaWI7Ci0JdXBkYXRlX21nbnRmcmFtZV9hdHRyaWIyM2EocGFkYXB0ZXIsIHBhdHRyaWIpOwotCi0JbWVtc2V0KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCAwLCBXTEFOSERSX09GRlNFVCArIFRYREVTQ19PRkZTRVQpOwotCi0JcGZyYW1lID0gKHU4ICopKHBtZ250ZnJhbWUtPmJ1Zl9hZGRyKSArIFRYREVTQ19PRkZTRVQ7Ci0JcHdsYW5oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilwZnJhbWU7Ci0KLQltYWMgPSBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdik7Ci0KLQlwd2xhbmhkci0+ZnJhbWVfY29udHJvbCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9NR01UIHwKLQkJCQkJICAgICAgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUSk7Ci0KLQlpZiAoZGEpIHsKLQkJLyoJdW5pY2FzdCBwcm9iZSByZXF1ZXN0IGZyYW1lICovCi0JCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjEsIGRhKTsKLQkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMywgZGEpOwotCX0gZWxzZSB7Ci0JCS8qCWJyb2FkY2FzdCBwcm9iZSByZXF1ZXN0IGZyYW1lICovCi0JCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjEsIGJjX2FkZHIpOwotCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBiY19hZGRyKTsKLQl9Ci0KLQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIyLCBtYWMpOwotCi0JcHdsYW5oZHItPnNlcV9jdHJsID0KLQkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NOX1RPX1NFUShwbWxtZWV4dC0+bWdudF9zZXEpKTsKLQotCXBtbG1lZXh0LT5tZ250X3NlcSsrOwotCi0JcGZyYW1lICs9IHNpemVvZiAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwotCXBhdHRyaWItPnBrdGxlbiA9IHNpemVvZiAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwotCi0JaWYgKHBzc2lkKQotCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfU1NJRCwgcHNzaWQtPnNzaWRfbGVuLAotCQkJCSAgICAgICBwc3NpZC0+c3NpZCwgJnBhdHRyaWItPnBrdGxlbik7Ci0JZWxzZQotCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfU1NJRCwgMCwgTlVMTCwKLQkJCQkgICAgICAgJnBhdHRyaWItPnBrdGxlbik7Ci0KLQlnZXRfcmF0ZV9zZXQyM2EocGFkYXB0ZXIsIGJzc3JhdGUsICZic3NyYXRlX2xlbik7Ci0KLQlpZiAoYnNzcmF0ZV9sZW4gPiA4KSB7Ci0JCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9TVVBQX1JBVEVTLCA4LAotCQkJCSAgICAgICBic3NyYXRlLCAmcGF0dHJpYi0+cGt0bGVuKTsKLQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX0VYVF9TVVBQX1JBVEVTLAotCQkJCSAgICAgICAoYnNzcmF0ZV9sZW4gLSA4KSwgKGJzc3JhdGUgKyA4KSwKLQkJCQkgICAgICAgJnBhdHRyaWItPnBrdGxlbik7Ci0JfSBlbHNlIHsKLQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX1NVUFBfUkFURVMsCi0JCQkJICAgICAgIGJzc3JhdGVfbGVuLCBic3NyYXRlLCAmcGF0dHJpYi0+cGt0bGVuKTsKLQl9Ci0KLQkvKiBhZGQgd3BzX2llIGZvciB3cHMyLjAgKi8KLQlpZiAocG1sbWVwcml2LT53cHNfcHJvYmVfcmVxX2llX2xlbj4wICYmIHBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZSkgewotCQltZW1jcHkocGZyYW1lLCBwbWxtZXByaXYtPndwc19wcm9iZV9yZXFfaWUsCi0JCSAgICAgICBwbWxtZXByaXYtPndwc19wcm9iZV9yZXFfaWVfbGVuKTsKLQkJcGZyYW1lICs9IHBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZV9sZW47Ci0JCXBhdHRyaWItPnBrdGxlbiArPSBwbWxtZXByaXYtPndwc19wcm9iZV9yZXFfaWVfbGVuOwotCX0KLQotCXBhdHRyaWItPmxhc3RfdHhjbWRzeiA9IHBhdHRyaWItPnBrdGxlbjsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X25vdGljZV8sCi0JCSAiaXNzdWluZyBwcm9iZV9yZXEsIHR4X2xlbiA9JWRcbiIsIHBhdHRyaWItPmxhc3RfdHhjbWRzeik7Ci0KLQlpZiAod2FpdF9hY2spIHsKLQkJcmV0ID0gZHVtcF9tZ250ZnJhbWUyM2FfYW5kX3dhaXRfYWNrMjNhKHBhZGFwdGVyLCBwbWdudGZyYW1lKTsKLQl9IGVsc2UgewotCQlkdW1wX21nbnRmcmFtZTIzYShwYWRhcHRlciwgcG1nbnRmcmFtZSk7Ci0JCXJldCA9IF9TVUNDRVNTOwotCX0KLQotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaXNzdWVfcHJvYmVyZXEoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgIHN0cnVjdCBjZmc4MDIxMV9zc2lkICpwc3NpZCwgdTggKmRhKQotewotCV9pc3N1ZV9wcm9iZXJlcShwYWRhcHRlciwgcHNzaWQsIGRhLCBmYWxzZSk7Ci19Ci0KLXN0YXRpYyBpbnQgaXNzdWVfcHJvYmVyZXFfZXgoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgc3RydWN0IGNmZzgwMjExX3NzaWQgKnBzc2lkLCB1OCAqZGEsCi0JCQkgICAgIGludCB0cnlfY250LCBpbnQgd2FpdF9tcykKLXsKLQlpbnQgcmV0OwotCWludCBpID0gMDsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gamlmZmllczsKLQotCWRvIHsKLQkJcmV0ID0gX2lzc3VlX3Byb2JlcmVxKHBhZGFwdGVyLCBwc3NpZCwgZGEsCi0JCQkJICAgICAgd2FpdF9tcyA+IDAgPyB0cnVlIDogZmFsc2UpOwotCi0JCWkrKzsKLQotCQlpZiAocGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8IHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKQotCQkJYnJlYWs7Ci0KLQkJaWYgKGkgPCB0cnlfY250ICYmIHdhaXRfbXMgPiAwICYmIHJldCA9PSBfRkFJTCkKLQkJCW1zbGVlcCh3YWl0X21zKTsKLQotCX0gd2hpbGUoKGkgPCB0cnlfY250KSAmJiAoKHJldCA9PSBfRkFJTCkgfHwgKHdhaXRfbXMgPT0gMCkpKTsKLQotCWlmIChyZXQgIT0gX0ZBSUwpIHsKLQkJcmV0ID0gX1NVQ0NFU1M7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAodHJ5X2NudCAmJiB3YWl0X21zKSB7Ci0JCWlmIChkYSkKLQkJCURCR184NzIzQSgiJXMoJXMpOiB0byAlcE0sIGNoOiV1JXMsICVkLyVkIGluICV1IG1zXG4iLAotCQkJCSAgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLAotCQkJCSAgZGEsIHJ0d19nZXRfb3Blcl9jaDIzYShwYWRhcHRlciksCi0JCQkJICByZXQgPT0gX1NVQ0NFU1MgPyAiLCBhY2tlZCIgOiAiIiwgaSwgdHJ5X2NudCwKLQkJCQkgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0KSk7Ci0JCWVsc2UKLQkJCURCR184NzIzQSgiJXMoJXMpOiwgY2g6JXUlcywgJWQvJWQgaW4gJXUgbXNcbiIsCi0JCQkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsCi0JCQkJICBydHdfZ2V0X29wZXJfY2gyM2EocGFkYXB0ZXIpLAotCQkJCSAgcmV0ID09IF9TVUNDRVNTID8gIiwgYWNrZWQiIDogIiIsIGksIHRyeV9jbnQsCi0JCQkJICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkpOwotCX0KLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogIGlmIHBzdGEgPT0gTlVMTCwgaW5kaWF0ZSB3ZSBhcmUgc3RhdGlvbihjbGllbnQpIG5vdy4uLiAqLwotc3RhdGljIHZvaWQgaXNzdWVfYXV0aChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEsCi0JCSAgICAgICB1bnNpZ25lZCBzaG9ydCBzdGF0dXMpCi17Ci0Jc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWU7Ci0Jc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWI7Ci0JdW5zaWduZWQgY2hhciAqcGZyYW1lOwotCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdDsKLQl1bnNpZ25lZCBpbnQgdmFsMzI7Ci0JdTE2IGF1dGhfYWxnbzsKLQlpbnQgdXNlX3NoYXJlZF9rZXkgPSAwOwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCXBtZ250ZnJhbWUgPSBhbGxvY19tZ3R4bWl0ZnJhbWUyM2EocHhtaXRwcml2KTsKLQlpZiAoIXBtZ250ZnJhbWUpCi0JCXJldHVybjsKLQotCS8qIHVwZGF0ZSBhdHRyaWJ1dGUgKi8KLQlwYXR0cmliID0gJnBtZ250ZnJhbWUtPmF0dHJpYjsKLQl1cGRhdGVfbWdudGZyYW1lX2F0dHJpYjIzYShwYWRhcHRlciwgcGF0dHJpYik7Ci0KLQltZW1zZXQocG1nbnRmcmFtZS0+YnVmX2FkZHIsIDAsIFdMQU5IRFJfT0ZGU0VUICsgVFhERVNDX09GRlNFVCk7Ci0KLQlwZnJhbWUgPSAodTggKikocG1nbnRmcmFtZS0+YnVmX2FkZHIpICsgVFhERVNDX09GRlNFVDsKLQltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKXBmcmFtZTsKLQotCW1nbXQtPmZyYW1lX2NvbnRyb2wgPQotCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8IElFRUU4MDIxMV9TVFlQRV9BVVRIKTsKLQltZ210LT5zZXFfY3RybCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TTl9UT19TRVEocG1sbWVleHQtPm1nbnRfc2VxKSk7Ci0JcG1sbWVleHQtPm1nbnRfc2VxKys7Ci0KLQlwYXR0cmliLT5wa3RsZW4gPSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYXV0aC52YXJpYWJsZSk7Ci0KLQlpZiAocHN0YSkgeyAvKiAgZm9yIEFQIG1vZGUgKi8KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQkJdW5zaWduZWQgc2hvcnQgdmFsMTY7Ci0KLQkJZXRoZXJfYWRkcl9jb3B5KG1nbXQtPmRhLCBwc3RhLT5od2FkZHIpOwotCQlldGhlcl9hZGRyX2NvcHkobWdtdC0+c2EsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSk7Ci0JCWV0aGVyX2FkZHJfY29weShtZ210LT5ic3NpZCwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpKTsKLQotCQkvKiAgc2V0dGluZyBhdXRoIGFsZ28gbnVtYmVyICovCi0JCXZhbDE2ID0gKHUxNilwc3RhLT5hdXRoYWxnOwotCi0JCWlmIChzdGF0dXMgIT0gV0xBTl9TVEFUVVNfU1VDQ0VTUykKLQkJCXZhbDE2ID0gMDsKLQotCQlpZiAodmFsMTYpCi0JCQl1c2Vfc2hhcmVkX2tleSA9IDE7Ci0KLQkJbWdtdC0+dS5hdXRoLmF1dGhfYWxnID0gY3B1X3RvX2xlMTYodmFsMTYpOwotCi0JCS8qICBzZXR0aW5nIGF1dGggc2VxIG51bWJlciAqLwotCQltZ210LT51LmF1dGguYXV0aF90cmFuc2FjdGlvbiA9Ci0JCQljcHVfdG9fbGUxNigodTE2KXBzdGEtPmF1dGhfc2VxKTsKLQotCQkvKiAgc2V0dGluZyBzdGF0dXMgY29kZS4uLiAqLwotCQltZ210LT51LmF1dGguc3RhdHVzX2NvZGUgPSBjcHVfdG9fbGUxNihzdGF0dXMpOwotCi0JCXBmcmFtZSA9IG1nbXQtPnUuYXV0aC52YXJpYWJsZTsKLQkJLyogIGFkZGVkIGNoYWxsZW5naW5nIHRleHQuLi4gKi8KLQkJaWYgKChwc3RhLT5hdXRoX3NlcSA9PSAyKSAmJgotCQkgICAgKHBzdGEtPnN0YXRlICYgV0lGSV9GV19BVVRIX1NUQVRFKSAmJiAodXNlX3NoYXJlZF9rZXkgPT0gMSkpCi0JCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfQ0hBTExFTkdFLCAxMjgsCi0JCQkJCSAgICAgICBwc3RhLT5jaGdfdHh0LCAmcGF0dHJpYi0+cGt0bGVuKTsKLSNlbmRpZgotCX0gZWxzZSB7Ci0JCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqaXZfbWdtdDsKLQotCQlldGhlcl9hZGRyX2NvcHkobWdtdC0+ZGEsIGdldF9teV9ic3NpZDIzYSgmcG1sbWVpbmZvLT5uZXR3b3JrKSk7Ci0JCWV0aGVyX2FkZHJfY29weShtZ210LT5zYSwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpKTsKLQkJZXRoZXJfYWRkcl9jb3B5KG1nbXQtPmJzc2lkLAotCQkJCWdldF9teV9ic3NpZDIzYSgmcG1sbWVpbmZvLT5uZXR3b3JrKSk7Ci0KLQkJLyogIHNldHRpbmcgYXV0aCBhbGdvIG51bWJlciAqLwotCQkvKiAgMDpPUEVOIFN5c3RlbSwgMTpTaGFyZWQga2V5ICovCi0JCWlmIChwbWxtZWluZm8tPmF1dGhfYWxnbyA9PSBkb3QxMUF1dGhBbGdydGhtX1NoYXJlZCkgewotCQkJdXNlX3NoYXJlZF9rZXkgPSAxOwotCQkJYXV0aF9hbGdvID0gV0xBTl9BVVRIX1NIQVJFRF9LRVk7Ci0JCX0gZWxzZQotCQkJYXV0aF9hbGdvID0gV0xBTl9BVVRIX09QRU47Ci0KLQkJLyogREJHXzg3MjNBKCIlcyBhdXRoX2FsZ28gPSAlcyBhdXRoX3NlcSA9JWRcbiIsIF9fZnVuY19fLAotCQkgICAocG1sbWVpbmZvLT5hdXRoX2FsZ28gPT0gMCk/Ik9QRU4iOiJTSEFSRUQiLAotCQkgICBwbWxtZWluZm8tPmF1dGhfc2VxKTsgKi8KLQotCQkvKiBzZXR0aW5nIElWIGZvciBhdXRoIHNlcSAjMyAqLwotCQlpZiAoKHBtbG1laW5mby0+YXV0aF9zZXEgPT0gMykgJiYKLQkJICAgIChwbWxtZWluZm8tPnN0YXRlICYgV0lGSV9GV19BVVRIX1NUQVRFKSAmJgotCQkgICAgKHVzZV9zaGFyZWRfa2V5ID09IDEpKSB7Ci0JCQl1MzIgKnBpdiA9ICh1MzIgKikmbWdtdC0+dS5hdXRoOwotCi0JCQlpdl9tZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKShwZnJhbWUgKyA0KTsKLQkJCS8qIERCR184NzIzQSgiPT0+IGl2KCVkKSwga2V5X2luZGV4KCVkKVxuIiwKLQkJCSAgIHBtbG1laW5mby0+aXYsIHBtbG1laW5mby0+a2V5X2luZGV4KTsgKi8KLQkJCXZhbDMyID0gKHBtbG1laW5mby0+aXYgJiAweDNmZmZmZmZmKSB8Ci0JCQkJKHBtbG1laW5mby0+a2V5X2luZGV4IDw8IDMwKTsKLQkJCXBtbG1laW5mby0+aXYrKzsKLQkJCXB1dF91bmFsaWduZWRfbGUzMih2YWwzMiwgcGl2KTsKLQotCQkJcGF0dHJpYi0+cGt0bGVuICs9IDQ7Ci0KLQkJCXBhdHRyaWItPml2X2xlbiA9IElFRUU4MDIxMV9XRVBfSVZfTEVOOwotCQl9IGVsc2UKLQkJCWl2X21nbXQgPSBtZ210OwotCi0JCWl2X21nbXQtPnUuYXV0aC5hdXRoX2FsZyA9IGNwdV90b19sZTE2KGF1dGhfYWxnbyk7Ci0KLQkJLyogIHNldHRpbmcgYXV0aCBzZXEgbnVtYmVyICovCi0JCWl2X21nbXQtPnUuYXV0aC5hdXRoX3RyYW5zYWN0aW9uID0KLQkJCWNwdV90b19sZTE2KHBtbG1laW5mby0+YXV0aF9zZXEpOwotCi0JCS8qICBzZXR0aW5nIHN0YXR1cyBjb2RlLi4uICovCi0JCWl2X21nbXQtPnUuYXV0aC5zdGF0dXNfY29kZSA9IGNwdV90b19sZTE2KHN0YXR1cyk7Ci0KLQkJcGZyYW1lID0gaXZfbWdtdC0+dS5hdXRoLnZhcmlhYmxlOwotCi0JCS8qICB0aGVuIGNoZWNraW5nIHRvIHNlZSBpZiBzZW5kaW5nIGNoYWxsZW5naW5nIHRleHQuLi4gKi8KLQkJaWYgKChwbWxtZWluZm8tPmF1dGhfc2VxID09IDMpICYmCi0JCSAgICAocG1sbWVpbmZvLT5zdGF0ZSAmIFdJRklfRldfQVVUSF9TVEFURSkgJiYKLQkJICAgICh1c2Vfc2hhcmVkX2tleSA9PSAxKSkgewotCQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX0NIQUxMRU5HRSwgMTI4LAotCQkJCQkgICAgICAgcG1sbWVpbmZvLT5jaGdfdHh0LAotCQkJCQkgICAgICAgJnBhdHRyaWItPnBrdGxlbik7Ci0KLQkJCW1nbXQtPmZyYW1lX2NvbnRyb2wgfD0KLQkJCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9QUk9URUNURUQpOwotCi0JCQlwYXR0cmliLT5oZHJsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwotCi0JCQlwYXR0cmliLT5lbmNyeXB0ID0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA7Ci0KLQkJCXBhdHRyaWItPmljdl9sZW4gPSBJRUVFODAyMTFfV0VQX0lDVl9MRU47Ci0KLQkJCXBhdHRyaWItPnBrdGxlbiArPSBwYXR0cmliLT5pY3ZfbGVuOwotCQl9Ci0JfQotCi0JcGF0dHJpYi0+bGFzdF90eGNtZHN6ID0gcGF0dHJpYi0+cGt0bGVuOwotCi0JcnR3X3dlcF9lbmNyeXB0MjNhKHBhZGFwdGVyLCBwbWdudGZyYW1lKTsKLQlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JZHVtcF9tZ250ZnJhbWUyM2EocGFkYXB0ZXIsIHBtZ250ZnJhbWUpOwotfQotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi1zdGF0aWMgdm9pZCBpc3N1ZV9hc3NvY3JzcChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBzaG9ydCBzdGF0dXMsCi0JCQkgICBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGF0LCB1MTYgcGt0X3R5cGUpCi17Ci0Jc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWU7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwotCXVuc2lnbmVkIGNoYXIgKnBmcmFtZTsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmsgPSAmcG1sbWVpbmZvLT5uZXR3b3JrOwotCWNvbnN0IHU4ICpwOwotCXU4ICppZSA9IHBuZXR3b3JrLT5JRXM7Ci0KLQlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlwbWdudGZyYW1lID0gYWxsb2NfbWd0eG1pdGZyYW1lMjNhKHB4bWl0cHJpdik7Ci0JaWYgKCFwbWdudGZyYW1lKQotCQlyZXR1cm47Ci0KLQkvKiB1cGRhdGUgYXR0cmlidXRlICovCi0JcGF0dHJpYiA9ICZwbWdudGZyYW1lLT5hdHRyaWI7Ci0JdXBkYXRlX21nbnRmcmFtZV9hdHRyaWIyM2EocGFkYXB0ZXIsIHBhdHRyaWIpOwotCi0JbWVtc2V0KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCAwLCBXTEFOSERSX09GRlNFVCArIFRYREVTQ19PRkZTRVQpOwotCi0JcGZyYW1lID0gKHU4ICopKHBtZ250ZnJhbWUtPmJ1Zl9hZGRyKSArIFRYREVTQ19PRkZTRVQ7Ci0JbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKilwZnJhbWU7Ci0KLQltZ210LT5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfCBwa3RfdHlwZSk7Ci0KLQlldGhlcl9hZGRyX2NvcHkobWdtdC0+ZGEsIHBzdGF0LT5od2FkZHIpOwotCWV0aGVyX2FkZHJfY29weShtZ210LT5zYSwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpKTsKLQlldGhlcl9hZGRyX2NvcHkobWdtdC0+YnNzaWQsIGdldF9teV9ic3NpZDIzYSgmcG1sbWVpbmZvLT5uZXR3b3JrKSk7Ci0KLQltZ210LT5zZXFfY3RybCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TTl9UT19TRVEocG1sbWVleHQtPm1nbnRfc2VxKSk7Ci0KLQlwbWxtZWV4dC0+bWdudF9zZXErKzsKLQotCXBhdHRyaWItPmhkcmxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0JcGF0dHJpYi0+cGt0bGVuID0KLQkJb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LmFzc29jX3Jlc3AudmFyaWFibGUpOwotCi0JbWdtdC0+dS5hc3NvY19yZXNwLmNhcGFiX2luZm8gPSBjcHVfdG9fbGUxNihwbmV0d29yay0+Y2FwYWJpbGl0eSk7Ci0JbWdtdC0+dS5hc3NvY19yZXNwLnN0YXR1c19jb2RlID0gY3B1X3RvX2xlMTYoc3RhdHVzKTsKLQltZ210LT51LmFzc29jX3Jlc3AuYWlkID0gY3B1X3RvX2xlMTYocHN0YXQtPmFpZCB8IEJJVCgxNCkgfCBCSVQoMTUpKTsKLQotCXBmcmFtZSA9IG1nbXQtPnUuYXNzb2NfcmVzcC52YXJpYWJsZTsKLQotCWlmIChwc3RhdC0+YnNzcmF0ZWxlbiA8PSA4KSB7Ci0JCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9TVVBQX1JBVEVTLAotCQkJCSAgICAgICBwc3RhdC0+YnNzcmF0ZWxlbiwgcHN0YXQtPmJzc3JhdGVzZXQsCi0JCQkJICAgICAgICZwYXR0cmliLT5wa3RsZW4pOwotCX0gZWxzZSB7Ci0JCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9TVVBQX1JBVEVTLCA4LAotCQkJCSAgICAgICBwc3RhdC0+YnNzcmF0ZXNldCwgJnBhdHRyaWItPnBrdGxlbik7Ci0JCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9FWFRfU1VQUF9SQVRFUywKLQkJCQkgICAgICAgcHN0YXQtPmJzc3JhdGVsZW4gLSA4LAotCQkJCSAgICAgICBwc3RhdC0+YnNzcmF0ZXNldCArIDgsICZwYXR0cmliLT5wa3RsZW4pOwotCX0KLQotCWlmIChwc3RhdC0+ZmxhZ3MgJiBXTEFOX1NUQV9IVCAmJiBwbWxtZXByaXYtPmh0cHJpdi5odF9vcHRpb24pIHsKLQkJLyogRklMTCBIVCBDQVAgSU5GTyBJRSAqLwotCQkvKiBwID0gaG9zdGFwZF9laWRfaHRfY2FwYWJpbGl0aWVzX2luZm8oaGFwZCwgcCk7ICovCi0JCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0hUX0NBUEFCSUxJVFksIGllLAotCQkJCSAgICAgcG5ldHdvcmstPklFTGVuZ3RoKTsKLQkJaWYgKHAgJiYgcFsxXSkgewotCQkJbWVtY3B5KHBmcmFtZSwgcCwgcFsxXSArIDIpOwotCQkJcGZyYW1lICs9IChwWzFdICsgMik7Ci0JCQlwYXR0cmliLT5wa3RsZW4gKz0gKHBbMV0gKyAyKTsKLQkJfQotCi0JCS8qIEZJTEwgSFQgQUREIElORk8gSUUgKi8KLQkJLyogcCA9IGhvc3RhcGRfZWlkX2h0X29wZXJhdGlvbihoYXBkLCBwKTsgKi8KLQkJcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfSFRfT1BFUkFUSU9OLCBpZSwKLQkJCQkgICAgIHBuZXR3b3JrLT5JRUxlbmd0aCk7Ci0JCWlmIChwICYmIHBbMV0gPiAwKSB7Ci0JCQltZW1jcHkocGZyYW1lLCBwLCBwWzFdICsgMik7Ci0JCQlwZnJhbWUgKz0gKHBbMV0gKyAyKTsKLQkJCXBhdHRyaWItPnBrdGxlbiArPSAocFsxXSArIDIpOwotCQl9Ci0JfQotCi0JLyogRklMTCBXTU0gSUUgKi8KLQlpZiAocHN0YXQtPmZsYWdzICYgV0xBTl9TVEFfV01FICYmIHBtbG1lcHJpdi0+cW9zX29wdGlvbikgewotCQl1bnNpZ25lZCBjaGFyIFdNTV9QQVJBX0lFW10gPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwKLQkJCQkJICAgICAgIDB4MDEsIDB4MDF9OwotCQlpbnQgaWVfbGVuID0gMDsKLQotCQlmb3IgKHAgPSBpZTsgOyBwICs9IChpZV9sZW4gKyAyKSkgewotCQkJcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfVkVORE9SX1NQRUNJRklDLCBwLAotCQkJCQkgICAgIHBuZXR3b3JrLT5JRUxlbmd0aCAtIChpZV9sZW4gKyAyKSk7Ci0JCQlpZiAocCkKLQkJCQlpZV9sZW4gPSBwWzFdOwotCQkJZWxzZQotCQkJCWllX2xlbiA9IDA7Ci0JCQlpZiAocCAmJiAhbWVtY21wKHAgKyAyLCBXTU1fUEFSQV9JRSwgNikpIHsKLQkJCQltZW1jcHkocGZyYW1lLCBwLCBpZV9sZW4gKyAyKTsKLQkJCQlwZnJhbWUgKz0gKGllX2xlbiArIDIpOwotCQkJCXBhdHRyaWItPnBrdGxlbiArPSAoaWVfbGVuICsgMik7Ci0KLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKCFwIHx8IGllX2xlbiA9PSAwKQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKHBtbG1laW5mby0+YXNzb2NfQVBfdmVuZG9yID09IEhUX0lPVF9QRUVSX1JFQUxURUspIHsKLQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQywgNiwKLQkJCQkgICAgICAgUkVBTFRFS185NkJfSUUsICZwYXR0cmliLT5wa3RsZW4pOwotCX0KLQotCXBhdHRyaWItPmxhc3RfdHhjbWRzeiA9IHBhdHRyaWItPnBrdGxlbjsKLQotCWR1bXBfbWdudGZyYW1lMjNhKHBhZGFwdGVyLCBwbWdudGZyYW1lKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBpc3N1ZV9hc3NvY3JlcShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCWludCByZXQgPSBfRkFJTDsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcG1nbnRmcmFtZTsKLQlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYjsKLQl1bnNpZ25lZCBjaGFyICpwZnJhbWU7Ci0JY29uc3QgdTggKnA7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwotCXVuc2lnbmVkIGludCBpLCBqLCBpbmRleCA9IDA7Ci0JdW5zaWduZWQgY2hhciByZl90eXBlLCBic3NyYXRlW051bVJhdGVzXSwgc3RhX2Jzc3JhdGVbTnVtUmF0ZXNdOwotCXN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVncHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCWludCBic3NyYXRlX2xlbiA9IDAsIHN0YV9ic3NyYXRlX2xlbiA9IDAsIHBpZV9sZW47Ci0JdTggKnBpZTsKLQotCXBtZ250ZnJhbWUgPSBhbGxvY19tZ3R4bWl0ZnJhbWUyM2EocHhtaXRwcml2KTsKLQlpZiAoIXBtZ250ZnJhbWUpCi0JCWdvdG8gZXhpdDsKLQotCS8qIHVwZGF0ZSBhdHRyaWJ1dGUgKi8KLQlwYXR0cmliID0gJnBtZ250ZnJhbWUtPmF0dHJpYjsKLQl1cGRhdGVfbWdudGZyYW1lX2F0dHJpYjIzYShwYWRhcHRlciwgcGF0dHJpYik7Ci0KLQltZW1zZXQocG1nbnRmcmFtZS0+YnVmX2FkZHIsIDAsIFdMQU5IRFJfT0ZGU0VUICsgVFhERVNDX09GRlNFVCk7Ci0KLQlwZnJhbWUgPSAodTggKilwbWdudGZyYW1lLT5idWZfYWRkciArIFRYREVTQ19PRkZTRVQ7Ci0JbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKilwZnJhbWU7Ci0KLQltZ210LT5mcmFtZV9jb250cm9sID0KLQkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfCBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVRKTsKLQotCWV0aGVyX2FkZHJfY29weShtZ210LT5kYSwgZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspKTsKLQlldGhlcl9hZGRyX2NvcHkobWdtdC0+c2EsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSk7Ci0JZXRoZXJfYWRkcl9jb3B5KG1nbXQtPmJzc2lkLCBnZXRfbXlfYnNzaWQyM2EoJnBtbG1laW5mby0+bmV0d29yaykpOwotCi0JbWdtdC0+c2VxX2N0cmwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU05fVE9fU0VRKHBtbG1lZXh0LT5tZ250X3NlcSkpOwotCXBtbG1lZXh0LT5tZ250X3NlcSsrOwotCi0JLyogY2FwcyAqLwotCXB1dF91bmFsaWduZWRfbGUxNihwbWxtZWluZm8tPm5ldHdvcmsuY2FwYWJpbGl0eSwKLQkJCSAgICZtZ210LT51LmFzc29jX3JlcS5jYXBhYl9pbmZvKTsKLQkvKiB0b2RvOiBsaXN0ZW4gaW50ZXJ2YWwgZm9yIHBvd2VyIHNhdmluZyAqLwotCXB1dF91bmFsaWduZWRfbGUxNigzLCAmbWdtdC0+dS5hc3NvY19yZXEubGlzdGVuX2ludGVydmFsKTsKLQotCXBmcmFtZSA9IG1nbXQtPnUuYXNzb2NfcmVxLnZhcmlhYmxlOwotCXBhdHRyaWItPnBrdGxlbiA9IG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5hc3NvY19yZXEudmFyaWFibGUpOwotCi0JLyogU1NJRCAqLwotCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9TU0lELAotCQkJICAgICAgIHBtbG1laW5mby0+bmV0d29yay5Tc2lkLnNzaWRfbGVuLAotCQkJICAgICAgIHBtbG1laW5mby0+bmV0d29yay5Tc2lkLnNzaWQsICZwYXR0cmliLT5wa3RsZW4pOwotCi0JLyogc3VwcG9ydGVkIHJhdGUgJiBleHRlbmRlZCBzdXBwb3J0ZWQgcmF0ZSAqLwotCi0JZ2V0X3JhdGVfc2V0MjNhKHBhZGFwdGVyLCBzdGFfYnNzcmF0ZSwgJnN0YV9ic3NyYXRlX2xlbik7Ci0JLyogREJHXzg3MjNBKCJzdGFfYnNzcmF0ZV9sZW4gPSVkXG4iLCBzdGFfYnNzcmF0ZV9sZW4pOyAqLwotCi0JLyogIGZvciBKQVBBTiwgY2hhbm5lbCAxNCBjYW4gb25seSB1c2VzIEIgTW9kZShDQ0spICovCi0JaWYgKHBtbG1lZXh0LT5jdXJfY2hhbm5lbCA9PSAxNCkKLQkJc3RhX2Jzc3JhdGVfbGVuID0gNDsKLQotCS8qIGZvciAoaSA9IDA7IGkgPCBzdGFfYnNzcmF0ZV9sZW47IGkrKykgeyAqLwotCS8qCURCR184NzIzQSgic3RhX2Jzc3JhdGVbJWRdPSUwMlhcbiIsIGksIHN0YV9ic3NyYXRlW2ldKTsgKi8KLQkvKiAgKi8KLQotCWZvciAoaSA9IDA7IGkgPCBORElTXzgwMl8xMV9MRU5HVEhfUkFURVNfRVg7IGkrKykgewotCQlpZiAocG1sbWVpbmZvLT5uZXR3b3JrLlN1cHBvcnRlZFJhdGVzW2ldID09IDApCi0JCQlicmVhazsKLQkJREJHXzg3MjNBKCJuZXR3b3JrLlN1cHBvcnRlZFJhdGVzWyVkXT0lMDJYXG4iLCBpLAotCQkJICBwbWxtZWluZm8tPm5ldHdvcmsuU3VwcG9ydGVkUmF0ZXNbaV0pOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBORElTXzgwMl8xMV9MRU5HVEhfUkFURVNfRVg7IGkrKykgewotCQlpZiAocG1sbWVpbmZvLT5uZXR3b3JrLlN1cHBvcnRlZFJhdGVzW2ldID09IDApCi0JCQlicmVhazsKLQotCQkvKiAgQ2hlY2sgaWYgdGhlIEFQJ3Mgc3VwcG9ydGVkIHJhdGVzIGFyZSBhbHNvCi0JCSAgICBzdXBwb3J0ZWQgYnkgU1RBLiAqLwotCQlmb3IgKGogPSAwOyBqIDwgc3RhX2Jzc3JhdGVfbGVuOyBqKyspIHsKLQkJCSAvKiAgQXZvaWQgdGhlIHByb3ByaWV0YXJ5IGRhdGEgcmF0ZSAoMjJNYnBzKSBvZgotCQkJICAgICBIYW5kbGluayBXU0ctNDAwMCBBUCAqLwotCQkJaWYgKChwbWxtZWluZm8tPm5ldHdvcmsuU3VwcG9ydGVkUmF0ZXNbaV0gfAotCQkJICAgICBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLKSA9PQotCQkJICAgIChzdGFfYnNzcmF0ZVtqXSB8IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0spKSB7Ci0JCQkJLyogREJHXzg3MjNBKCJtYXRjaCBpID0gJWQsIGogPSVkXG4iLCBpLCBqKTsgKi8KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChqID09IHN0YV9ic3NyYXRlX2xlbikgewotCQkJLyogIHRoZSByYXRlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgU1RBICovCi0JCQlEQkdfODcyM0EoIiVzKCk6IHRoZSByYXRlWyVkXT0lMDJYIGlzIG5vdCBzdXBwb3J0ZWQgYnkgIgotCQkJCSAgIlNUQSFcbiIsIF9fZnVuY19fLCBpLAotCQkJCSAgcG1sbWVpbmZvLT5uZXR3b3JrLlN1cHBvcnRlZFJhdGVzW2ldKTsKLQkJfSBlbHNlIHsKLQkJCS8qICB0aGUgcmF0ZSBpcyBzdXBwb3J0ZWQgYnkgU1RBICovCi0JCQlic3NyYXRlW2luZGV4KytdID0gcG1sbWVpbmZvLT5uZXR3b3JrLlN1cHBvcnRlZFJhdGVzW2ldOwotCQl9Ci0JfQotCi0JYnNzcmF0ZV9sZW4gPSBpbmRleDsKLQlEQkdfODcyM0EoImJzc3JhdGVfbGVuID0gJWRcbiIsIGJzc3JhdGVfbGVuKTsKLQotCWlmIChic3NyYXRlX2xlbiA9PSAwKSB7Ci0JCXJ0d19mcmVlX3htaXRidWYyM2EocHhtaXRwcml2LCBwbWdudGZyYW1lLT5weG1pdGJ1Zik7Ci0JCXJ0d19mcmVlX3htaXRmcmFtZTIzYShweG1pdHByaXYsIHBtZ250ZnJhbWUpOwotCQlnb3RvIGV4aXQ7IC8qIGRvbid0IGNvbm5lY3QgdG8gQVAgaWYgbm8gam9pbnQgc3VwcG9ydGVkIHJhdGUgKi8KLQl9Ci0KLQlpZiAoYnNzcmF0ZV9sZW4gPiA4KSB7Ci0JCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9TVVBQX1JBVEVTLCA4LAotCQkJCSAgICAgICBic3NyYXRlLCAmcGF0dHJpYi0+cGt0bGVuKTsKLQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX0VYVF9TVVBQX1JBVEVTLAotCQkJCSAgICAgICAoYnNzcmF0ZV9sZW4gLSA4KSwgKGJzc3JhdGUgKyA4KSwKLQkJCQkgICAgICAgJnBhdHRyaWItPnBrdGxlbik7Ci0JfSBlbHNlCi0JCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9TVVBQX1JBVEVTLAotCQkJCSAgICAgICBic3NyYXRlX2xlbiwgYnNzcmF0ZSwgJnBhdHRyaWItPnBrdGxlbik7Ci0KLQkvKiBSU04gKi8KLQotCXBpZSA9IHBtbG1laW5mby0+bmV0d29yay5JRXM7Ci0JcGllX2xlbiA9IHBtbG1laW5mby0+bmV0d29yay5JRUxlbmd0aDsKLQotCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX1JTTiwgcGllLCBwaWVfbGVuKTsKLQlpZiAocCkKLQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX1JTTiwgcFsxXSwgcCArIDIsCi0JCQkJICAgICAgICZwYXR0cmliLT5wa3RsZW4pOwotCi0JLyogSFQgY2FwcyAqLwotCWlmIChwYWRhcHRlci0+bWxtZXByaXYuaHRwcml2Lmh0X29wdGlvbikgewotCQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9IVF9DQVBBQklMSVRZLCBwaWUsIHBpZV9sZW4pOwotCi0JCWlmIChwICYmICFpc19hcF9pbl90a2lwMjNhKHBhZGFwdGVyKSkgewotCQkJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmNhcCA9ICZwbWxtZWluZm8tPmh0X2NhcDsKLQotCQkJbWVtY3B5KGNhcCwgcCArIDIsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCkpOwotCi0JCQkvKiB0byBkaXNhYmxlIDQwTSBIeiBzdXBwb3J0IHdoaWxlIGdkX2J3XzQwTUh6X2VuID0gMCAqLwotCQkJaWYgKHByZWdwcml2LT5jYnc0MF9lbmFibGUgPT0gMCkgewotCQkJCWNhcC0+Y2FwX2luZm8gJj0gfmNwdV90b19sZTE2KAotCQkJCQlJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCB8Ci0JCQkJCUlFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIXzIwXzQwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FwLT5jYXBfaW5mbyB8PSBjcHVfdG9fbGUxNigKLQkJCQkJSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDApOwotCQkJfQotCi0JCQkvKiB0b2RvOiBkaXNhYmxlIFNNIHBvd2VyIHNhdmUgbW9kZSAqLwotCQkJY2FwLT5jYXBfaW5mbyB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfSFRfQ0FQX1NNX1BTKTsKLQotCQkJcmZfdHlwZSA9IHJ0bDg3MjNhX2dldF9yZl90eXBlKHBhZGFwdGVyKTsKLQkJCS8qIHN3aXRjaCAocHJlZ3ByaXYtPnJmX2NvbmZpZykgKi8KLQkJCXN3aXRjaCAocmZfdHlwZSkgewotCQkJY2FzZSBSRl8xVDFSOgotCQkJCS8qIFJYIFNUQkMgT25lIHNwYXRpYWwgc3RyZWFtICovCi0JCQkJaWYgKHByZWdwcml2LT5yeF9zdGJjKQotCQkJCQljYXAtPmNhcF9pbmZvIHw9IGNwdV90b19sZTE2KDEgPDwgSUVFRTgwMjExX0hUX0NBUF9SWF9TVEJDX1NISUZUKTsKLQotCQkJCW1lbWNweSgmY2FwLT5tY3MsIE1DU19yYXRlXzFSMjNBLCAxNik7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgUkZfMlQyUjoKLQkJCWNhc2UgUkZfMVQyUjoKLQkJCWRlZmF1bHQ6Ci0JCQkJLyogZW5hYmxlIGZvciAyLjQvNSBHSHogKi8KLQkJCQlpZiAocHJlZ3ByaXYtPnJ4X3N0YmMgPT0gMHgzIHx8Ci0JCQkJICAgIChwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgJgotCQkJCSAgICAgV0lSRUxFU1NfMTFfMjROICYmCi0JCQkJICAgICAvKiBlbmFibGUgZm9yIDIuNEdIeiAqLwotCQkJCSAgICAgcHJlZ3ByaXYtPnJ4X3N0YmMgPT0gMHgxKSB8fAotCQkJCSAgICAocG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlICYKLQkJCQkgICAgIFdJUkVMRVNTXzExXzVOICYmCi0JCQkJICAgICBwcmVncHJpdi0+cnhfc3RiYyA9PSAweDIpIHx8Ci0JCQkJICAgIC8qIGVuYWJsZSBmb3IgNUdIeiAqLwotCQkJCSAgICBwcmVncHJpdi0+d2lmaV9zcGVjID09IDEpIHsKLQkJCQkJREJHXzg3MjNBKCJkZWNsYXJlIHN1cHBvcnRpbmcgUlggIgotCQkJCQkJICAiU1RCQ1xuIik7Ci0JCQkJCS8qIFJYIFNUQkMgdHdvIHNwYXRpYWwgc3RyZWFtICovCi0JCQkJCWNhcC0+Y2FwX2luZm8gfD0gY3B1X3RvX2xlMTYoMiA8PCBJRUVFODAyMTFfSFRfQ0FQX1JYX1NUQkNfU0hJRlQpOwotCQkJCX0KLQkJCQltZW1jcHkoJmNhcC0+bWNzLCBNQ1NfcmF0ZV8yUjIzQSwgMTYpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAocnRsODcyM2FfQlRfY29leGlzdChwYWRhcHRlcikgJiYKLQkJCSAgICBydGw4NzIzYV9CVF91c2luZ19hbnRlbm5hXzEocGFkYXB0ZXIpKSB7Ci0JCQkJLyogIHNldCB0byA4SyAqLwotCQkJCWNhcC0+YW1wZHVfcGFyYW1zX2luZm8gJj0KLQkJCQkJfklFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0ZBQ1RPUjsKLS8qCQkJCWNhcC0+YW1wZHVfcGFyYW1zX2luZm8gfD0gTUFYX0FNUERVX0ZBQ1RPUl84SyAqLwotCQkJfQotCi0JCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfSFRfQ0FQQUJJTElUWSwKLQkJCQkJICAgICAgIHBbMV0sICh1OCAqKSZwbWxtZWluZm8tPmh0X2NhcCwKLQkJCQkJICAgICAgICZwYXR0cmliLT5wa3RsZW4pOwotCQl9Ci0JfQotCi0JLyogdmVuZG9yIHNwZWNpZmljIElFLCBzdWNoIGFzIFdQQSwgV01NLCBXUFMgKi8KLQlmb3IgKGkgPSAwOyAgaSA8IHBtbG1laW5mby0+bmV0d29yay5JRUxlbmd0aDspIHsKLQkJcCA9IHBtbG1laW5mby0+bmV0d29yay5JRXMgKyBpOwotCi0JCXN3aXRjaCAocFswXSkgewotCQljYXNlIFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQzoKLQkJCWlmICghbWVtY21wKHAgKyAyLCBSVFdfV1BBX09VSTIzQV9UWVBFLCA0KSB8fAotCQkJICAgICFtZW1jbXAocCArIDIsIFdNTV9PVUkyM0EsIDQpIHx8Ci0JCQkgICAgIW1lbWNtcChwICsgMiwgV1BTX09VSTIzQSwgNCkpIHsKLQkJCQl1OCBwbGVuID0gcFsxXTsKLQotCQkJCWlmICghcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi53aWZpX3NwZWMpIHsKLQkJCQkJLyogQ29tbWVudGVkIGJ5IEt1cnQgMjAxMTA2MjkgKi8KLQkJCQkJLyogSW4gc29tZSBvbGRlciBBUHMsIFdQUyBoYW5kc2hha2UgKi8KLQkJCQkJLyogd291bGQgYmUgZmFpbCBpZiB3ZSBhcHBlbmQgdmVuZGVyCi0JCQkJCSAgIGV4dGVuc2lvbnMgaW5mb3JtYXRpb25zIHRvIEFQICovCi0JCQkJCWlmICghbWVtY21wKHAgKyAyLCBXUFNfT1VJMjNBLCA0KSkKLQkJCQkJCXBsZW4gPSAxNDsKLQkJCQl9Ci0JCQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsCi0JCQkJCQkgICAgICAgV0xBTl9FSURfVkVORE9SX1NQRUNJRklDLAotCQkJCQkJICAgICAgIHBsZW4sIHAgKyAyLAotCQkJCQkJICAgICAgICZwYXR0cmliLT5wa3RsZW4pOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaSArPSBwWzFdICsgMjsKLQl9Ci0KLQlpZiAocG1sbWVpbmZvLT5hc3NvY19BUF92ZW5kb3IgPT0gSFRfSU9UX1BFRVJfUkVBTFRFSykKLQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQywgNiwKLQkJCQkgICAgICAgUkVBTFRFS185NkJfSUUsICZwYXR0cmliLT5wa3RsZW4pOwotCi0JcGF0dHJpYi0+bGFzdF90eGNtZHN6ID0gcGF0dHJpYi0+cGt0bGVuOwotCWR1bXBfbWdudGZyYW1lMjNhKHBhZGFwdGVyLCBwbWdudGZyYW1lKTsKLQotCXJldCA9IF9TVUNDRVNTOwotCi1leGl0OgotCXBtbG1lcHJpdi0+YXNzb2NfcmVxX2xlbiA9IDA7Ci0JaWYgKHJldCA9PSBfU1VDQ0VTUykgewotCQlrZnJlZShwbWxtZXByaXYtPmFzc29jX3JlcSk7Ci0JCXBtbG1lcHJpdi0+YXNzb2NfcmVxID0ga21hbGxvYyhwYXR0cmliLT5wa3RsZW4sIEdGUF9BVE9NSUMpOwotCQlpZiAocG1sbWVwcml2LT5hc3NvY19yZXEpIHsKLQkJCW1lbWNweShwbWxtZXByaXYtPmFzc29jX3JlcSwgbWdtdCwgcGF0dHJpYi0+cGt0bGVuKTsKLQkJCXBtbG1lcHJpdi0+YXNzb2NfcmVxX2xlbiA9IHBhdHRyaWItPnBrdGxlbjsKLQkJfQotCX0gZWxzZQotCQlrZnJlZShwbWxtZXByaXYtPmFzc29jX3JlcSk7Ci19Ci0KLS8qIHdoZW4gd2FpdF9hY2sgaXMgdHJ1ZSwgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGF0IHByb2Nlc3MgY29udGV4dCAqLwotc3RhdGljIGludCBfaXNzdWVfbnVsbGRhdGEyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdW5zaWduZWQgY2hhciAqZGEsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgcG93ZXJfbW9kZSwgaW50IHdhaXRfYWNrKQotewotCWludCByZXQgPSBfRkFJTDsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcG1nbnRmcmFtZTsKLQlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYjsKLQl1bnNpZ25lZCBjaGFyICpwZnJhbWU7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKnB3bGFuaGRyOwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQ7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbzsKLQotCS8qIERCR184NzIzQSgiJXM6JWRcbiIsIF9fZnVuY19fLCBwb3dlcl9tb2RlKTsgKi8KLQotCWlmICghcGFkYXB0ZXIpCi0JCWdvdG8gZXhpdDsKLQotCXB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0JcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlwbWdudGZyYW1lID0gYWxsb2NfbWd0eG1pdGZyYW1lMjNhKHB4bWl0cHJpdik7Ci0JaWYgKCFwbWdudGZyYW1lKQotCQlnb3RvIGV4aXQ7Ci0KLQkvKiB1cGRhdGUgYXR0cmlidXRlICovCi0JcGF0dHJpYiA9ICZwbWdudGZyYW1lLT5hdHRyaWI7Ci0JdXBkYXRlX21nbnRmcmFtZV9hdHRyaWIyM2EocGFkYXB0ZXIsIHBhdHRyaWIpOwotCXBhdHRyaWItPnJldHJ5X2N0cmwgPSBmYWxzZTsKLQotCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKLQotCXBmcmFtZSA9ICh1OCAqKShwbWdudGZyYW1lLT5idWZfYWRkcikgKyBUWERFU0NfT0ZGU0VUOwotCXB3bGFuaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopcGZyYW1lOwotCi0JcHdsYW5oZHItPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfREFUQSB8Ci0JCQkJCSAgICAgIElFRUU4MDIxMV9TVFlQRV9OVUxMRlVOQyk7Ci0KLQlpZiAoKHBtbG1laW5mby0+c3RhdGUmMHgwMykgPT0gTVNSX0FQKQotCQlwd2xhbmhkci0+ZnJhbWVfY29udHJvbCB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9GUk9NRFMpOwotCWVsc2UgaWYgKChwbWxtZWluZm8tPnN0YXRlJjB4MDMpID09IE1TUl9JTkZSQSkKLQkJcHdsYW5oZHItPmZyYW1lX2NvbnRyb2wgfD0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfVE9EUyk7Ci0KLQlpZiAocG93ZXJfbW9kZSkKLQkJcHdsYW5oZHItPmZyYW1lX2NvbnRyb2wgfD0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfUE0pOwotCi0JZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMSwgZGEpOwotCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjIsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSk7Ci0JZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMywgZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspKTsKLQotCXB3bGFuaGRyLT5zZXFfY3RybCA9Ci0JCWNwdV90b19sZTE2KElFRUU4MDIxMV9TTl9UT19TRVEocG1sbWVleHQtPm1nbnRfc2VxKSk7Ci0JcG1sbWVleHQtPm1nbnRfc2VxKys7Ci0KLQlwZnJhbWUgKz0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKLQlwYXR0cmliLT5wa3RsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwotCi0JcGF0dHJpYi0+bGFzdF90eGNtZHN6ID0gcGF0dHJpYi0+cGt0bGVuOwotCi0JaWYgKHdhaXRfYWNrKQotCQlyZXQgPSBkdW1wX21nbnRmcmFtZTIzYV9hbmRfd2FpdF9hY2syM2EocGFkYXB0ZXIsIHBtZ250ZnJhbWUpOwotCWVsc2UgewotCQlkdW1wX21nbnRmcmFtZTIzYShwYWRhcHRlciwgcG1nbnRmcmFtZSk7Ci0JCXJldCA9IF9TVUNDRVNTOwotCX0KLQotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi0vKiB3aGVuIHdhaXRfbXMgPjAgLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYXQgcHJvY2VzcyBjb250ZXh0ICovCi0vKiBkYSA9PSBOVUxMIGZvciBzdGF0aW9uIG1vZGUgKi8KLWludCBpc3N1ZV9udWxsZGF0YTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBjaGFyICpkYSwKLQkJICAgICAgdW5zaWduZWQgaW50IHBvd2VyX21vZGUsIGludCB0cnlfY250LCBpbnQgd2FpdF9tcykKLXsKLQlpbnQgcmV0OwotCWludCBpID0gMDsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gamlmZmllczsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JLyogZGEgPT0gTlVMTCwgYXNzdW1lIGl0J3MgbnVsbCBkYXRhIGZvciBzdGEgdG8gYXAqLwotCWlmIChkYSA9PSBOVUxMKQotCQlkYSA9IGdldF9teV9ic3NpZDIzYSgmcG1sbWVpbmZvLT5uZXR3b3JrKTsKLQotCWRvIHsKLQkJcmV0ID0gX2lzc3VlX251bGxkYXRhMjNhKHBhZGFwdGVyLCBkYSwgcG93ZXJfbW9kZSwKLQkJCQkJIHdhaXRfbXMgPiAwID8gdHJ1ZSA6IGZhbHNlKTsKLQotCQlpKys7Ci0KLQkJaWYgKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkKLQkJCWJyZWFrOwotCi0JCWlmIChpIDwgdHJ5X2NudCAmJiB3YWl0X21zID4gMCAmJiByZXQgPT0gX0ZBSUwpCi0JCQltc2xlZXAod2FpdF9tcyk7Ci0KLQl9IHdoaWxlKChpIDwgdHJ5X2NudCkgJiYgKChyZXQgPT0gX0ZBSUwpIHx8ICh3YWl0X21zID09IDApKSk7Ci0KLQlpZiAocmV0ICE9IF9GQUlMKSB7Ci0JCXJldCA9IF9TVUNDRVNTOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKHRyeV9jbnQgJiYgd2FpdF9tcykgewotCQlpZiAoZGEpCi0JCQlEQkdfODcyM0EoIiVzKCVzKTogdG8gJXBNLCBjaDoldSVzLCAlZC8lZCBpbiAldSBtc1xuIiwKLQkJCQkgIF9fZnVuY19fLCBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwKLQkJCQkgIGRhLCBydHdfZ2V0X29wZXJfY2gyM2EocGFkYXB0ZXIpLAotCQkJCSAgcmV0ID09IF9TVUNDRVNTID8gIiwgYWNrZWQiIDogIiIsIGksIHRyeV9jbnQsCi0JCQkJICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkpOwotCQllbHNlCi0JCQlEQkdfODcyM0EoIiVzKCVzKTosIGNoOiV1JXMsICVkLyVkIGluICV1IG1zXG4iLAotCQkJCSAgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLAotCQkJCSAgcnR3X2dldF9vcGVyX2NoMjNhKHBhZGFwdGVyKSwKLQkJCQkgIHJldCA9PSBfU1VDQ0VTUyA/ICIsIGFja2VkIiA6ICIiLCBpLCB0cnlfY250LAotCQkJCSAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gc3RhcnQpKTsKLQl9Ci1leGl0OgotCXJldHVybiByZXQ7Ci19Ci0KLS8qIHdoZW4gd2FpdF9hY2sgaXMgdHJ1ZSwgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGF0IHByb2Nlc3MgY29udGV4dCAqLwotc3RhdGljIGludCBfaXNzdWVfcW9zX251bGxkYXRhMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICB1bnNpZ25lZCBjaGFyICpkYSwgdTE2IHRpZCwgaW50IHdhaXRfYWNrKQotewotCWludCByZXQgPSBfRkFJTDsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcG1nbnRmcmFtZTsKLQlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYjsKLQl1bnNpZ25lZCBjaGFyICpwZnJhbWU7Ci0Jc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyICpwd2xhbmhkcjsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlwbWdudGZyYW1lID0gYWxsb2NfbWd0eG1pdGZyYW1lMjNhKHB4bWl0cHJpdik7Ci0JaWYgKCFwbWdudGZyYW1lKQotCQlnb3RvIGV4aXQ7Ci0KLQkvKiB1cGRhdGUgYXR0cmlidXRlICovCi0JcGF0dHJpYiA9ICZwbWdudGZyYW1lLT5hdHRyaWI7Ci0JdXBkYXRlX21nbnRmcmFtZV9hdHRyaWIyM2EocGFkYXB0ZXIsIHBhdHRyaWIpOwotCi0JcGF0dHJpYi0+aGRybGVuICs9IDI7Ci0JcGF0dHJpYi0+cW9zX2VuID0gdHJ1ZTsKLQlwYXR0cmliLT5lb3NwID0gMTsKLQlwYXR0cmliLT5hY2tfcG9saWN5ID0gMDsKLQlwYXR0cmliLT5tZGF0YSA9IDA7Ci0KLQltZW1zZXQocG1nbnRmcmFtZS0+YnVmX2FkZHIsIDAsIFdMQU5IRFJfT0ZGU0VUICsgVFhERVNDX09GRlNFVCk7Ci0KLQlwZnJhbWUgPSAodTggKikocG1nbnRmcmFtZS0+YnVmX2FkZHIpICsgVFhERVNDX09GRlNFVDsKLQlwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX3Fvc19oZHIgKilwZnJhbWU7Ci0KLQlwd2xhbmhkci0+ZnJhbWVfY29udHJvbCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9EQVRBIHwKLQkJCQkJICAgICAgSUVFRTgwMjExX1NUWVBFX1FPU19OVUxMRlVOQyk7Ci0KLQlpZiAoKHBtbG1laW5mby0+c3RhdGUmMHgwMykgPT0gTVNSX0FQKQotCQlwd2xhbmhkci0+ZnJhbWVfY29udHJvbCB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9GUk9NRFMpOwotCWVsc2UgaWYgKChwbWxtZWluZm8tPnN0YXRlJjB4MDMpID09IE1TUl9JTkZSQSkKLQkJcHdsYW5oZHItPmZyYW1lX2NvbnRyb2wgfD0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfVE9EUyk7Ci0KLQlpZiAocGF0dHJpYi0+bWRhdGEpCi0JCXB3bGFuaGRyLT5mcmFtZV9jb250cm9sIHw9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX01PUkVEQVRBKTsKLQotCXB3bGFuaGRyLT5xb3NfY3RybCA9IGNwdV90b19sZTE2KHRpZCAmIElFRUU4MDIxMV9RT1NfQ1RMX1RJRF9NQVNLKTsKLQlwd2xhbmhkci0+cW9zX2N0cmwgfD0gY3B1X3RvX2xlMTYoKHBhdHRyaWItPmFja19wb2xpY3kgPDwgNSkgJgotCQkJCQkgIElFRUU4MDIxMV9RT1NfQ1RMX0FDS19QT0xJQ1lfTUFTSyk7Ci0JaWYgKHBhdHRyaWItPmVvc3ApCi0JCXB3bGFuaGRyLT5xb3NfY3RybCB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfUU9TX0NUTF9FT1NQKTsKLQotCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjEsIGRhKTsKLQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdikpOwotCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjMsIGdldF9teV9ic3NpZDIzYSgmcG1sbWVpbmZvLT5uZXR3b3JrKSk7Ci0KLQlwd2xhbmhkci0+c2VxX2N0cmwgPQotCQljcHVfdG9fbGUxNihJRUVFODAyMTFfU05fVE9fU0VRKHBtbG1lZXh0LT5tZ250X3NlcSkpOwotCXBtbG1lZXh0LT5tZ250X3NlcSsrOwotCi0JcGZyYW1lICs9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Fvc19oZHIpOwotCXBhdHRyaWItPnBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Fvc19oZHIpOwotCi0JcGF0dHJpYi0+bGFzdF90eGNtZHN6ID0gcGF0dHJpYi0+cGt0bGVuOwotCi0JaWYgKHdhaXRfYWNrKQotCQlyZXQgPSBkdW1wX21nbnRmcmFtZTIzYV9hbmRfd2FpdF9hY2syM2EocGFkYXB0ZXIsIHBtZ250ZnJhbWUpOwotCWVsc2UgewotCQlkdW1wX21nbnRmcmFtZTIzYShwYWRhcHRlciwgcG1nbnRmcmFtZSk7Ci0JCXJldCA9IF9TVUNDRVNTOwotCX0KLQotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi0vKiB3aGVuIHdhaXRfbXMgPjAgLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYXQgcHJvY2VzcyBjb250ZXh0ICovCi0vKiBkYSA9PSBOVUxMIGZvciBzdGF0aW9uIG1vZGUgKi8KLWludCBpc3N1ZV9xb3NfbnVsbGRhdGEyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdW5zaWduZWQgY2hhciAqZGEsCi0JCQkgIHUxNiB0aWQsIGludCB0cnlfY250LCBpbnQgd2FpdF9tcykKLXsKLQlpbnQgcmV0OwotCWludCBpID0gMDsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gamlmZmllczsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JLyogZGEgPT0gTlVMTCwgYXNzdW1lIGl0J3MgbnVsbCBkYXRhIGZvciBzdGEgdG8gYXAqLwotCWlmIChkYSA9PSBOVUxMKQotCQlkYSA9IGdldF9teV9ic3NpZDIzYSgmcG1sbWVpbmZvLT5uZXR3b3JrKTsKLQotCWRvIHsKLQkJcmV0ID0gX2lzc3VlX3Fvc19udWxsZGF0YTIzYShwYWRhcHRlciwgZGEsIHRpZCwKLQkJCQkJICAgICB3YWl0X21zID4gMCA/IHRydWUgOiBmYWxzZSk7Ci0KLQkJaSsrOwotCi0JCWlmIChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpCi0JCQlicmVhazsKLQotCQlpZiAoaSA8IHRyeV9jbnQgJiYgd2FpdF9tcyA+IDAgJiYgcmV0ID09IF9GQUlMKQotCQkJbXNsZWVwKHdhaXRfbXMpOwotCX0gd2hpbGUoKGkgPCB0cnlfY250KSAmJiAoKHJldCA9PSBfRkFJTCl8fCh3YWl0X21zID09IDApKSk7Ci0KLQlpZiAocmV0ICE9IF9GQUlMKSB7Ci0JCXJldCA9IF9TVUNDRVNTOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKHRyeV9jbnQgJiYgd2FpdF9tcykgewotCQlpZiAoZGEpCi0JCQlEQkdfODcyM0EoIiVzKCVzKTogdG8gJXBNLCBjaDoldSVzLCAlZC8lZCBpbiAldSBtc1xuIiwKLQkJCQkgIF9fZnVuY19fLCBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwKLQkJCQkgIGRhLCBydHdfZ2V0X29wZXJfY2gyM2EocGFkYXB0ZXIpLAotCQkJCSAgcmV0ID09IF9TVUNDRVNTID8gIiwgYWNrZWQiIDogIiIsIGksIHRyeV9jbnQsCi0JCQkJICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkpOwotCQllbHNlCi0JCQlEQkdfODcyM0EoIiVzKCVzKTosIGNoOiV1JXMsICVkLyVkIGluICV1IG1zXG4iLAotCQkJCSAgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLAotCQkJCSAgcnR3X2dldF9vcGVyX2NoMjNhKHBhZGFwdGVyKSwKLQkJCQkgIHJldCA9PSBfU1VDQ0VTUyA/ICIsIGFja2VkIiA6ICIiLCBpLCB0cnlfY250LAotCQkJCSAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gc3RhcnQpKTsKLQl9Ci1leGl0OgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgX2lzc3VlX2RlYXV0aChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBjaGFyICpkYSwKLQkJCSB1bnNpZ25lZCBzaG9ydCByZWFzb24sIHU4IHdhaXRfYWNrKQotewotCXN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lOwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwotCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdDsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0JaW50IHJldCA9IF9GQUlMOwotCi0JLyogREJHXzg3MjNBKCIlcyB0byAlcE1cbiIsIF9fZnVuY19fLCBkYSk7ICovCi0KLQlwbWdudGZyYW1lID0gYWxsb2NfbWd0eG1pdGZyYW1lMjNhKHB4bWl0cHJpdik7Ci0JaWYgKCFwbWdudGZyYW1lKQotCQlnb3RvIGV4aXQ7Ci0KLQkvKiB1cGRhdGUgYXR0cmlidXRlICovCi0JcGF0dHJpYiA9ICZwbWdudGZyYW1lLT5hdHRyaWI7Ci0JdXBkYXRlX21nbnRmcmFtZV9hdHRyaWIyM2EocGFkYXB0ZXIsIHBhdHRyaWIpOwotCXBhdHRyaWItPnJldHJ5X2N0cmwgPSBmYWxzZTsKLQotCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKLQotCW1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopKHBtZ250ZnJhbWUtPmJ1Zl9hZGRyICsgVFhERVNDX09GRlNFVCk7Ci0KLQltZ210LT5mcmFtZV9jb250cm9sID0KLQkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfCBJRUVFODAyMTFfU1RZUEVfREVBVVRIKTsKLQotCWV0aGVyX2FkZHJfY29weShtZ210LT5kYSwgZGEpOwotCWV0aGVyX2FkZHJfY29weShtZ210LT5zYSwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpKTsKLQlldGhlcl9hZGRyX2NvcHkobWdtdC0+YnNzaWQsIGdldF9teV9ic3NpZDIzYSgmcG1sbWVpbmZvLT5uZXR3b3JrKSk7Ci0KLQltZ210LT5zZXFfY3RybCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TTl9UT19TRVEocG1sbWVleHQtPm1nbnRfc2VxKSk7Ci0JcG1sbWVleHQtPm1nbnRfc2VxKys7Ci0KLQlwYXR0cmliLT5wa3RsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpICsgMjsKLQotCW1nbXQtPnUuZGVhdXRoLnJlYXNvbl9jb2RlID0gY3B1X3RvX2xlMTYocmVhc29uKTsKLQotCXBhdHRyaWItPmxhc3RfdHhjbWRzeiA9IHBhdHRyaWItPnBrdGxlbjsKLQotCWlmICh3YWl0X2FjaykKLQkJcmV0ID0gZHVtcF9tZ250ZnJhbWUyM2FfYW5kX3dhaXRfYWNrMjNhKHBhZGFwdGVyLCBwbWdudGZyYW1lKTsKLQllbHNlIHsKLQkJZHVtcF9tZ250ZnJhbWUyM2EocGFkYXB0ZXIsIHBtZ250ZnJhbWUpOwotCQlyZXQgPSBfU1VDQ0VTUzsKLQl9Ci0KLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IGlzc3VlX2RlYXV0aDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBjaGFyICpkYSwKLQkJICAgIHVuc2lnbmVkIHNob3J0IHJlYXNvbikKLXsKLQlEQkdfODcyM0EoIiVzIHRvICVwTVxuIiwgX19mdW5jX18sIGRhKTsKLQlyZXR1cm4gX2lzc3VlX2RlYXV0aChwYWRhcHRlciwgZGEsIHJlYXNvbiwgZmFsc2UpOwotfQotCi1zdGF0aWMgaW50IGlzc3VlX2RlYXV0aF9leChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqZGEsCi0JCQkgICB1bnNpZ25lZCBzaG9ydCByZWFzb24sIGludCB0cnlfY250LCBpbnQgd2FpdF9tcykKLXsKLQlpbnQgcmV0OwotCWludCBpID0gMDsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gamlmZmllczsKLQotCWRvIHsKLQkJcmV0ID0gX2lzc3VlX2RlYXV0aChwYWRhcHRlciwgZGEsIHJlYXNvbiwKLQkJCQkgICAgd2FpdF9tcyA+MCA/IHRydWUgOiBmYWxzZSk7Ci0KLQkJaSsrOwotCi0JCWlmIChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpCi0JCQlicmVhazsKLQotCQlpZiAoaSA8IHRyeV9jbnQgJiYgd2FpdF9tcyA+IDAgJiYgcmV0ID09IF9GQUlMKQotCQkJbXNsZWVwKHdhaXRfbXMpOwotCi0JfSB3aGlsZSgoaSA8IHRyeV9jbnQpICYmICgocmV0ID09IF9GQUlMKXx8KHdhaXRfbXMgPT0gMCkpKTsKLQotCWlmIChyZXQgIT0gX0ZBSUwpIHsKLQkJcmV0ID0gX1NVQ0NFU1M7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAodHJ5X2NudCAmJiB3YWl0X21zKSB7Ci0JCWlmIChkYSkKLQkJCURCR184NzIzQSgiJXMoJXMpOiB0byAlcE0sIGNoOiV1JXMsICVkLyVkIGluICV1IG1zXG4iLAotCQkJCSAgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLAotCQkJCSAgZGEsIHJ0d19nZXRfb3Blcl9jaDIzYShwYWRhcHRlciksCi0JCQkJICByZXQgPT0gX1NVQ0NFU1MgPyAiLCBhY2tlZCIgOiAiIiwgaSwgdHJ5X2NudCwKLQkJCQkgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0KSk7Ci0JCWVsc2UKLQkJCURCR184NzIzQSgiJXMoJXMpOiwgY2g6JXUlcywgJWQvJWQgaW4gJXUgbXNcbiIsCi0JCQkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsCi0JCQkJICBydHdfZ2V0X29wZXJfY2gyM2EocGFkYXB0ZXIpLAotCQkJCSAgcmV0ID09IF9TVUNDRVNTID8gIiwgYWNrZWQiIDogIiIsIGksIHRyeV9jbnQsCi0JCQkJICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkpOwotCX0KLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBpc3N1ZV9hY3Rpb25fc3BjdF9jaF9zd2l0Y2gyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgdTggKnJhLCB1OCBuZXdfY2gsIHU4IGNoX29mZnNldCkKLXsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcG1nbnRmcmFtZTsKLQlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYjsKLQl1bnNpZ25lZCBjaGFyICpwZnJhbWU7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQotCURCR184NzIzQSgiJXMoJXMpOiByYT0lcE0sIGNoOiV1LCBvZmZzZXQ6JXVcbiIsCi0JCSAgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLCByYSwgbmV3X2NoLCBjaF9vZmZzZXQpOwotCi0JcG1nbnRmcmFtZSA9IGFsbG9jX21ndHhtaXRmcmFtZTIzYShweG1pdHByaXYpOwotCWlmICghcG1nbnRmcmFtZSkKLQkJcmV0dXJuOwotCi0JLyogdXBkYXRlIGF0dHJpYnV0ZSAqLwotCXBhdHRyaWIgPSAmcG1nbnRmcmFtZS0+YXR0cmliOwotCXVwZGF0ZV9tZ250ZnJhbWVfYXR0cmliMjNhKHBhZGFwdGVyLCBwYXR0cmliKTsKLQotCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKLQotCW1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopKHBtZ250ZnJhbWUtPmJ1Zl9hZGRyICsgVFhERVNDX09GRlNFVCk7Ci0KLQltZ210LT5mcmFtZV9jb250cm9sID0KLQkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfCBJRUVFODAyMTFfU1RZUEVfQUNUSU9OKTsKLQotCWV0aGVyX2FkZHJfY29weShtZ210LT5kYSwgcmEpOyAvKiBSQSAqLwotCWV0aGVyX2FkZHJfY29weShtZ210LT5zYSwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpKTsgLyogVEEgKi8KLQlldGhlcl9hZGRyX2NvcHkobWdtdC0+YnNzaWQsIHJhKTsgLyogREEgPSBSQSAqLwotCi0JbWdtdC0+c2VxX2N0cmwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU05fVE9fU0VRKHBtbG1lZXh0LT5tZ250X3NlcSkpOwotCXBtbG1lZXh0LT5tZ250X3NlcSsrOwotCi0JbWdtdC0+dS5hY3Rpb24uY2F0ZWdvcnkgPSBXTEFOX0NBVEVHT1JZX1NQRUNUUlVNX01HTVQ7Ci0JbWdtdC0+dS5hY3Rpb24udS5jaGFuX3N3aXRjaC5hY3Rpb25fY29kZSA9IFdMQU5fQUNUSU9OX1NQQ1RfQ0hMX1NXSVRDSDsKLQotCXBmcmFtZSA9IG1nbXQtPnUuYWN0aW9uLnUuY2hhbl9zd2l0Y2gudmFyaWFibGU7Ci0JcGF0dHJpYi0+cGt0bGVuID0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LAotCQkJCSAgIHUuYWN0aW9uLnUuY2hhbl9zd2l0Y2gudmFyaWFibGUpOwotCi0JcGZyYW1lID0gcnR3X3NldF9pZTIzYV9jaF9zd2l0Y2ggKHBmcmFtZSwgJnBhdHRyaWItPnBrdGxlbiwgMCwKLQkJCQkJICBuZXdfY2gsIDApOwotCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2Ffc2Vjb25kYXJ5X2NoX29mZnNldChwZnJhbWUsICZwYXR0cmliLT5wa3RsZW4sCi0JCWhhbF9jaF9vZmZzZXRfdG9fc2Vjb25kYXJ5X2NoX29mZnNldDIzYShjaF9vZmZzZXQpKTsKLQotCXBhdHRyaWItPmxhc3RfdHhjbWRzeiA9IHBhdHRyaWItPnBrdGxlbjsKLQotCWR1bXBfbWdudGZyYW1lMjNhKHBhZGFwdGVyLCBwbWdudGZyYW1lKTsKLX0KLQotdm9pZCBpc3N1ZV9hY3Rpb25fQkEyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhZGRyLAotCQkJdW5zaWduZWQgY2hhciBhY3Rpb24sIHVuc2lnbmVkIHNob3J0IHN0YXR1cykKLXsKLQl1MTYgc3RhcnRfc2VxOwotCXUxNiBCQV9wYXJhX3NldDsKLQl1MTYgQkFfc3RhcnRpbmdfc2VxY3RybDsKLQl1MTYgQkFfcGFyYTsKLQlpbnQgbWF4X3J4X2FtcGR1X2ZhY3RvcjsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcG1nbnRmcmFtZTsKLQlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYjsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVncHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCXU4IHRlbmRhQVBNYWNbXSA9IHsweEM4LCAweDNBLCAweDM1fTsKLQotCURCR184NzIzQSgiJXMsIGFjdGlvbiA9JWQsIHN0YXR1cyA9JWRcbiIsIF9fZnVuY19fLCBhY3Rpb24sIHN0YXR1cyk7Ci0KLQlwbWdudGZyYW1lID0gYWxsb2NfbWd0eG1pdGZyYW1lMjNhKHB4bWl0cHJpdik7Ci0JaWYgKCFwbWdudGZyYW1lKQotCQlyZXR1cm47Ci0KLQkvKiB1cGRhdGUgYXR0cmlidXRlICovCi0JcGF0dHJpYiA9ICZwbWdudGZyYW1lLT5hdHRyaWI7Ci0JdXBkYXRlX21nbnRmcmFtZV9hdHRyaWIyM2EocGFkYXB0ZXIsIHBhdHRyaWIpOwotCi0JbWVtc2V0KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCAwLCBXTEFOSERSX09GRlNFVCArIFRYREVTQ19PRkZTRVQpOwotCi0JbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikocG1nbnRmcmFtZS0+YnVmX2FkZHIgKyBUWERFU0NfT0ZGU0VUKTsKLQotCW1nbXQtPmZyYW1lX2NvbnRyb2wgPQotCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8IElFRUU4MDIxMV9TVFlQRV9BQ1RJT04pOwotCi0JZXRoZXJfYWRkcl9jb3B5KG1nbXQtPmRhLCByYWRkcik7Ci0JZXRoZXJfYWRkcl9jb3B5KG1nbXQtPnNhLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdikpOwotCWV0aGVyX2FkZHJfY29weShtZ210LT5ic3NpZCwgZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspKTsKLQotCW1nbXQtPnNlcV9jdHJsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NOX1RPX1NFUShwbWxtZWV4dC0+bWdudF9zZXEpKTsKLQlwbWxtZWV4dC0+bWdudF9zZXErKzsKLQotCW1nbXQtPnUuYWN0aW9uLmNhdGVnb3J5ID0gV0xBTl9DQVRFR09SWV9CQUNLOwotCi0JcGF0dHJpYi0+cGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSArIDE7Ci0KLQlzd2l0Y2ggKGFjdGlvbikgewotCWNhc2UgV0xBTl9BQ1RJT05fQUREQkFfUkVROgotCQlwYXR0cmliLT5wa3RsZW4gKz0gc2l6ZW9mKG1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVxKTsKLQotCQltZ210LT51LmFjdGlvbi51LmFkZGJhX3JlcS5hY3Rpb25fY29kZSA9IGFjdGlvbjsKLQotCQlkbyB7Ci0JCQlwbWxtZWluZm8tPmRpYWxvZ1Rva2VuKys7Ci0JCX0gd2hpbGUgKHBtbG1laW5mby0+ZGlhbG9nVG9rZW4gPT0gMCk7Ci0KLQkJbWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXEuZGlhbG9nX3Rva2VuID0KLQkJCXBtbG1laW5mby0+ZGlhbG9nVG9rZW47Ci0KLQkJaWYgKHJ0bDg3MjNhX0JUX2NvZXhpc3QocGFkYXB0ZXIpICYmCi0JCSAgICBydGw4NzIzYV9CVF91c2luZ19hbnRlbm5hXzEocGFkYXB0ZXIpICYmCi0JCSAgICAocG1sbWVpbmZvLT5hc3NvY19BUF92ZW5kb3IgIT0gYnJvYWRjb21BUCB8fAotCQkgICAgIG1lbWNtcChyYWRkciwgdGVuZGFBUE1hYywgMykpKSB7Ci0JCQkvKiAgQS1NU0RVIE5PVCBTdXBwb3J0ZWQgKi8KLQkJCUJBX3BhcmFfc2V0ID0gMDsKLQkJCS8qICBpbW1lZGlhdGUgQmxvY2sgQWNrICovCi0JCQlCQV9wYXJhX3NldCB8PSAoMSA8PCAxKSAmCi0JCQkJSUVFRTgwMjExX0FEREJBX1BBUkFNX1BPTElDWV9NQVNLOwotCQkJLyogIFRJRCAqLwotCQkJQkFfcGFyYV9zZXQgfD0gKHN0YXR1cyA8PCAyKSAmCi0JCQkJSUVFRTgwMjExX0FEREJBX1BBUkFNX1RJRF9NQVNLOwotCQkJLyogIG1heCBidWZmZXIgc2l6ZSBpcyA4IE1TRFUgKi8KLQkJCUJBX3BhcmFfc2V0IHw9ICg4IDw8IDYpICYKLQkJCQlJRUVFODAyMTFfQUREQkFfUEFSQU1fQlVGX1NJWkVfTUFTSzsKLQkJfSBlbHNlIHsKLQkJCS8qIGltbWVkaWF0ZSBhY2sgJiA2NCBidWZmZXIgc2l6ZSAqLwotCQkJQkFfcGFyYV9zZXQgPSAweDEwMDIgfCAoKHN0YXR1cyAmIDB4ZikgPDwgMik7Ci0JCX0KLQotCQlwdXRfdW5hbGlnbmVkX2xlMTYoQkFfcGFyYV9zZXQsCi0JCQkJICAgJm1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVxLmNhcGFiKTsKLQotCQkvKiAgNW1zICovCi0JCXB1dF91bmFsaWduZWRfbGUxNig1MDAwLCAmbWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXEudGltZW91dCk7Ci0KLQkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgcmFkZHIpOwotCQlpZiAocHN0YSkgewotCQkJaW50IGlkeDsKLQotCQkJaWR4ID0gc3RhdHVzICYgMHgwNzsKLQkJCXN0YXJ0X3NlcSA9Ci0JCQkJKHBzdGEtPnN0YV94bWl0cHJpdi50eHNlcV90aWRbaWR4XSAmIDB4ZmZmKSArIDE7Ci0KLQkJCURCR184NzIzQSgiQkFfc3RhcnRpbmdfc2VxY3RybCA9ICVkIGZvciBUSUQgPSVkXG4iLAotCQkJCSAgc3RhcnRfc2VxLCBpZHgpOwotCi0JCQlwc3RhLT5CQV9zdGFydGluZ19zZXFjdHJsW2lkeF0gPSBzdGFydF9zZXE7Ci0KLQkJCUJBX3N0YXJ0aW5nX3NlcWN0cmwgPSBzdGFydF9zZXEgPDwgNDsKLQkJfSBlbHNlCi0JCQlCQV9zdGFydGluZ19zZXFjdHJsID0gMDsKLQotCQlwdXRfdW5hbGlnbmVkX2xlMTYoQkFfc3RhcnRpbmdfc2VxY3RybCwKLQkJCQkgICAmbWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXEuc3RhcnRfc2VxX251bSk7Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIFdMQU5fQUNUSU9OX0FEREJBX1JFU1A6Ci0JCXBhdHRyaWItPnBrdGxlbiArPSBzaXplb2YobWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXNwKTsKLQotCQltZ210LT51LmFjdGlvbi51LmFkZGJhX3Jlc3AuYWN0aW9uX2NvZGUgPSBhY3Rpb247Ci0JCW1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVzcC5kaWFsb2dfdG9rZW4gPQotCQkJcG1sbWVpbmZvLT5BRERCQV9yZXEuZGlhbG9nX3Rva2VuOwotCQlwdXRfdW5hbGlnbmVkX2xlMTYoc3RhdHVzLAotCQkJCSAgICZtZ210LT51LmFjdGlvbi51LmFkZGJhX3Jlc3Auc3RhdHVzKTsKLQotCQlHZXRIYWxEZWZWYXI4MTkyQ1VzYihwYWRhcHRlciwgSFdfVkFSX01BWF9SWF9BTVBEVV9GQUNUT1IsCi0JCQkJICAgICAmbWF4X3J4X2FtcGR1X2ZhY3Rvcik7Ci0KLQkJQkFfcGFyYSA9IGxlMTZfdG9fY3B1KHBtbG1laW5mby0+QUREQkFfcmVxLkJBX3BhcmFfc2V0KSAmIDB4M2Y7Ci0JCWlmIChtYXhfcnhfYW1wZHVfZmFjdG9yID09IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLKQotCQkJQkFfcGFyYV9zZXQgPSBCQV9wYXJhIHwgMHgxMDAwOyAvKiA2NCBidWZmZXIgc2l6ZSAqLwotCQllbHNlIGlmIChtYXhfcnhfYW1wZHVfZmFjdG9yID09IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfMzJLKQotCQkJQkFfcGFyYV9zZXQgPSBCQV9wYXJhIHwgMHgwODAwOyAvKiAzMiBidWZmZXIgc2l6ZSAqLwotCQllbHNlIGlmIChtYXhfcnhfYW1wZHVfZmFjdG9yID09IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfMTZLKQotCQkJQkFfcGFyYV9zZXQgPSBCQV9wYXJhIHwgMHgwNDAwOyAvKiAxNiBidWZmZXIgc2l6ZSAqLwotCQllbHNlIGlmIChtYXhfcnhfYW1wZHVfZmFjdG9yID09IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfOEspCi0JCQlCQV9wYXJhX3NldCA9IEJBX3BhcmEgfCAweDAyMDA7IC8qIDggYnVmZmVyIHNpemUgKi8KLQkJZWxzZQotCQkJQkFfcGFyYV9zZXQgPSBCQV9wYXJhIHwgMHgxMDAwOyAvKiA2NCBidWZmZXIgc2l6ZSAqLwotCi0JCWlmIChydGw4NzIzYV9CVF9jb2V4aXN0KHBhZGFwdGVyKSAmJgotCQkgICAgcnRsODcyM2FfQlRfdXNpbmdfYW50ZW5uYV8xKHBhZGFwdGVyKSAmJgotCQkgICAgKHBtbG1laW5mby0+YXNzb2NfQVBfdmVuZG9yICE9IGJyb2FkY29tQVAgfHwKLQkJICAgICBtZW1jbXAocmFkZHIsIHRlbmRhQVBNYWMsIDMpKSkgewotCQkJLyogIG1heCBidWZmZXIgc2l6ZSBpcyA4IE1TRFUgKi8KLQkJCUJBX3BhcmFfc2V0ICY9IH5JRUVFODAyMTFfQUREQkFfUEFSQU1fQlVGX1NJWkVfTUFTSzsKLQkJCUJBX3BhcmFfc2V0IHw9ICg4IDw8IDYpICYKLQkJCQlJRUVFODAyMTFfQUREQkFfUEFSQU1fQlVGX1NJWkVfTUFTSzsKLQkJfQotCi0JCWlmIChwcmVncHJpdi0+YW1wZHVfYW1zZHUgPT0gMCkvKiBkaXNhYmxlZCAqLwotCQkJQkFfcGFyYV9zZXQgJj0gfkJJVCgwKTsKLQkJZWxzZSBpZiAocHJlZ3ByaXYtPmFtcGR1X2Ftc2R1ID09IDEpLyogZW5hYmxlZCAqLwotCQkJQkFfcGFyYV9zZXQgfD0gQklUKDApOwotCi0JCXB1dF91bmFsaWduZWRfbGUxNihCQV9wYXJhX3NldCwKLQkJCQkgICAmbWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXNwLmNhcGFiKTsKLQotCQltZ210LT51LmFjdGlvbi51LmFkZGJhX3Jlc3AudGltZW91dAotCQkJPSBwbWxtZWluZm8tPkFEREJBX3JlcS5CQV90aW1lb3V0X3ZhbHVlOwotCi0JCXBhdHRyaWItPnBrdGxlbiArPSA4OwotCQlicmVhazsKLQljYXNlIFdMQU5fQUNUSU9OX0RFTEJBOgotCQlwYXR0cmliLT5wa3RsZW4gKz0gc2l6ZW9mKG1nbXQtPnUuYWN0aW9uLnUuZGVsYmEpOwotCi0JCW1nbXQtPnUuYWN0aW9uLnUuZGVsYmEuYWN0aW9uX2NvZGUgPSBhY3Rpb247Ci0JCUJBX3BhcmFfc2V0ID0gKHN0YXR1cyAmIDB4MUYpIDw8IDM7Ci0JCW1nbXQtPnUuYWN0aW9uLnUuZGVsYmEucGFyYW1zID0gY3B1X3RvX2xlMTYoQkFfcGFyYV9zZXQpOwotCQltZ210LT51LmFjdGlvbi51LmRlbGJhLnJlYXNvbl9jb2RlID0KLQkJCWNwdV90b19sZTE2KFdMQU5fUkVBU09OX1FTVEFfTk9UX1VTRSk7Ci0KLQkJcGF0dHJpYi0+cGt0bGVuICs9IDU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXBhdHRyaWItPmxhc3RfdHhjbWRzeiA9IHBhdHRyaWItPnBrdGxlbjsKLQotCWR1bXBfbWdudGZyYW1lMjNhKHBhZGFwdGVyLCBwbWdudGZyYW1lKTsKLX0KLQotaW50IHNlbmRfZGVsYmEyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggaW5pdGlhdG9yLCB1OCAqYWRkcikKLXsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IE5VTEw7Ci0JLyogc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsICpwcmVvcmRlcl9jdHJsOyAqLwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0JdTE2IHRpZDsKLQotCWlmICgocG1sbWVpbmZvLT5zdGF0ZSYweDAzKSAhPSBNU1JfQVApCi0JCWlmICghKHBtbG1laW5mby0+c3RhdGUgJiBXSUZJX0ZXX0FTU09DX1NVQ0NFU1MpKQotCQkJcmV0dXJuIF9TVUNDRVNTOwotCi0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgYWRkcik7Ci0JaWYgKHBzdGEgPT0gTlVMTCkKLQkJcmV0dXJuIF9TVUNDRVNTOwotCi0JaWYgKGluaXRpYXRvciA9PSAwKSB7ICAvKiAgcmVjaXBpZW50ICovCi0JCWZvciAodGlkID0gMDsgdGlkIDwgTUFYVElEOyB0aWQrKykgewotCQkJaWYgKHBzdGEtPnJlY3ZyZW9yZGVyX2N0cmxbdGlkXS5lbmFibGUgPT0gdHJ1ZSkgewotCQkJCURCR184NzIzQSgicnggYWdnIGRpc2FibGUgdGlkKCVkKVxuIiwgdGlkKTsKLQkJCQlpc3N1ZV9hY3Rpb25fQkEyM2EocGFkYXB0ZXIsIGFkZHIsIFdMQU5fQUNUSU9OX0RFTEJBLCAoKCh0aWQgPDwxKSB8aW5pdGlhdG9yKSYweDFGKSk7Ci0JCQkJcHN0YS0+cmVjdnJlb3JkZXJfY3RybFt0aWRdLmVuYWJsZSA9IGZhbHNlOwotCQkJCXBzdGEtPnJlY3ZyZW9yZGVyX2N0cmxbdGlkXS5pbmRpY2F0ZV9zZXEgPSAweGZmZmY7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKGluaXRpYXRvciA9PSAxKSB7IC8qICBvcmlnaW5hdG9yICovCi0JCWZvciAodGlkID0gMDsgdGlkIDwgTUFYVElEOyB0aWQrKykgewotCQkJaWYgKHBzdGEtPmh0cHJpdi5hZ2dfZW5hYmxlX2JpdG1hcCAmIEJJVCh0aWQpKSB7Ci0JCQkJREJHXzg3MjNBKCJ0eCBhZ2cgZGlzYWJsZSB0aWQoJWQpXG4iLCB0aWQpOwotCQkJCWlzc3VlX2FjdGlvbl9CQTIzYShwYWRhcHRlciwgYWRkciwgV0xBTl9BQ1RJT05fREVMQkEsICgoKHRpZCA8PDEpIHxpbml0aWF0b3IpJjB4MUYpKTsKLQkJCQlwc3RhLT5odHByaXYuYWdnX2VuYWJsZV9iaXRtYXAgJj0gfkJJVCh0aWQpOwotCQkJCXBzdGEtPmh0cHJpdi5jYW5kaWRhdGVfdGlkX2JpdG1hcCAmPSB+QklUKHRpZCk7Ci0KLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLWludCBzZW5kX2JlYWNvbjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCWJvb2wgYnhtaXRvazsKLQlpbnQgaXNzdWUgPSAwOwotCWludCBwb2xsID0gMDsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gamlmZmllczsKLQl1bnNpZ25lZCBpbnQgcGFzc2luZ190aW1lOwotCi0JcnRsODcyM2FfYmNuX3ZhbGlkKHBhZGFwdGVyKTsKLQlkbyB7Ci0JCWlzc3VlX2JlYWNvbjIzYShwYWRhcHRlciwgMTAwKTsKLQkJaXNzdWUrKzsKLQkJZG8gewotCQkJeWllbGQoKTsKLQkJCWJ4bWl0b2sgPSBydGw4NzIzYV9nZXRfYmNuX3ZhbGlkKHBhZGFwdGVyKTsKLQkJCXBvbGwrKzsKLQkJfSB3aGlsZSAoKHBvbGwgJSAxMCkgIT0gMCAmJiAhYnhtaXRvayAmJgotCQkJICFwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCAmJgotCQkJICFwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQpOwotCi0JfSB3aGlsZSAoIWJ4bWl0b2sgJiYgaXNzdWU8MTAwICYmICFwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCAmJgotCQkgIXBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCk7Ci0KLQlpZiAocGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgfHwgcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQlwYXNzaW5nX3RpbWUgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCk7Ci0KLQlpZiAoIWJ4bWl0b2spIHsKLQkJREJHXzg3MjNBKCIlcyBmYWlsISAldSBtc1xuIiwgX19mdW5jX18sIHBhc3NpbmdfdGltZSk7Ci0JCXJldHVybiBfRkFJTDsKLQl9IGVsc2UgewotCi0JCWlmIChwYXNzaW5nX3RpbWUgPiAxMDAgfHwgaXNzdWUgPiAzKQotCQkJREJHXzg3MjNBKCIlcyBzdWNjZXNzLCBpc3N1ZTolZCwgcG9sbDolZCwgJXUgbXNcbiIsCi0JCQkJICBfX2Z1bmNfXywgaXNzdWUsIHBvbGwsIHBhc3NpbmdfdGltZSk7Ci0JCXJldHVybiBfU1VDQ0VTUzsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLUZvbGxvd2luZyBhcmUgc29tZSB1dGl0aXR5IGZ1bmN0aW9ucyBmb3IgV2lGaSBNTE1FCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1ib29sIElzTGVnYWw1R0NoYW5uZWwoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1OCBjaGFubmVsKQotewotCi0JaW50IGkgPSAwOwotCXU4IENoYW5uZWxfNUdbNDVdID0gezM2LCAzOCwgNDAsIDQyLCA0NCwgNDYsIDQ4LCA1MCwgNTIsIDU0LCA1NiwgNTgsCi0JCQkgICAgIDYwLCA2MiwgNjQsIDEwMCwgMTAyLCAxMDQsIDEwNiwgMTA4LCAxMTAsIDExMiwKLQkJCSAgICAgMTE0LCAxMTYsIDExOCwgMTIwLCAxMjIsIDEyNCwgMTI2LCAxMjgsIDEzMCwgMTMyLAotCQkJICAgICAxMzQsIDEzNiwgMTM4LCAxNDAsIDE0OSwgMTUxLCAxNTMsIDE1NSwgMTU3LCAxNTksCi0JCQkgICAgIDE2MSwgMTYzLCAxNjV9OwotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoQ2hhbm5lbF81Ryk7IGkrKykKLQkJaWYgKGNoYW5uZWwgPT0gQ2hhbm5lbF81R1tpXSkKLQkJCXJldHVybiB0cnVlOwotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQgcnR3X3NpdGVfc3VydmV5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdW5zaWduZWQgY2hhciBzdXJ2ZXlfY2hhbm5lbCA9IDA7Ci0JZW51bSBydF9zY2FuX3R5cGUgU2NhblR5cGUgPSBTQ0FOX1BBU1NJVkU7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9jaGFubmVsICpjaDsKLQotCWlmIChwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuY2hhbm5lbF9pZHggPAotCSAgICBwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuY2hfbnVtKSB7Ci0JCWNoID0gJnBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5jaFtwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuY2hhbm5lbF9pZHhdOwotCQlzdXJ2ZXlfY2hhbm5lbCA9IGNoLT5od192YWx1ZTsKLQkJU2NhblR5cGUgPSAoY2gtPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fTk9fSVIpID8KLQkJCVNDQU5fUEFTU0lWRSA6IFNDQU5fQUNUSVZFOwotCX0KLQotCWlmIChzdXJ2ZXlfY2hhbm5lbCAhPSAwKSB7Ci0JCS8qIFBBVVNFIDQtQUMgUXVldWUgd2hlbiBzaXRlX3N1cnZleSAqLwotCQlpZiAocG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLmNoYW5uZWxfaWR4ID09IDApCi0JCQlzZXRfY2hhbm5lbF9id21vZGUyM2EocGFkYXB0ZXIsIHN1cnZleV9jaGFubmVsLAotCQkJCQkgICAgICBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFLAotCQkJCQkgICAgICBIVF9DSEFOTkVMX1dJRFRIXzIwKTsKLQkJZWxzZQotCQkJU2VsZWN0Q2hhbm5lbDIzYShwYWRhcHRlciwgc3VydmV5X2NoYW5uZWwpOwotCi0JCWlmIChTY2FuVHlwZSA9PSBTQ0FOX0FDVElWRSkgLyogb2JleSB0aGUgY2hhbm5lbCBwbGFuIHNldHRpbmcuLi4gKi8KLQkJewotCQkJaW50IGk7Ci0KLQkJCWZvciAoaSA9IDA7aTxSVFdfU1NJRF9TQ0FOX0FNT1VOVDtpKyspIHsKLQkJCQlpZiAocG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnNzaWRbaV0uc3NpZF9sZW4pIHsKLQkJCQkJLyogdG9kbzogdG8gaXNzdWUgdHdvIHByb2JlIHJlcT8/PyAqLwotCQkJCQlpc3N1ZV9wcm9iZXJlcShwYWRhcHRlciwgJnBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5zc2lkW2ldLCBOVUxMKTsKLQkJCQkJLyogbXNsZWVwKFNVUlZFWV9UTz4+MSk7ICovCi0JCQkJCWlzc3VlX3Byb2JlcmVxKHBhZGFwdGVyLCAmcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnNzaWRbaV0sIE5VTEwpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5zY2FuX21vZGUgPT0gU0NBTl9BQ1RJVkUpIHsKLQkJCQkvKiB0b2RvOiB0byBpc3N1ZSB0d28gcHJvYmUgcmVxPz8/ICovCi0JCQkJaXNzdWVfcHJvYmVyZXEocGFkYXB0ZXIsIE5VTEwsIE5VTEwpOwotCQkJCS8qIG1zbGVlcChTVVJWRVlfVE8+PjEpOyAqLwotCQkJCWlzc3VlX3Byb2JlcmVxKHBhZGFwdGVyLCBOVUxMLCBOVUxMKTsKLQkJCX0KLQkJfQotCi0JCXNldF9zdXJ2ZXlfdGltZXIocG1sbWVleHQsIHBtbG1lZXh0LT5jaGFuX3NjYW5fdGltZSk7Ci0JfSBlbHNlIHsKLQkJLyoJY2hhbm5lbCBudW1iZXIgaXMgMCBvciB0aGlzIGNoYW5uZWwgaXMgbm90IHZhbGlkLiAqLwotCQlwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuc3RhdGUgPSBTQ0FOX0NPTVBMRVRFOwotCi0JCS8qIHN3aXRjaCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBjaGFubmVsICovCi0KLQkJc2V0X2NoYW5uZWxfYndtb2RlMjNhKHBhZGFwdGVyLCBwbWxtZWV4dC0+Y3VyX2NoYW5uZWwsCi0JCQkJICAgICAgcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQsCi0JCQkJICAgICAgcG1sbWVleHQtPmN1cl9id21vZGUpOwotCi0JCS8qIGZsdXNoIDQtQUMgUXVldWUgYWZ0ZXIgcnR3X3NpdGVfc3VydmV5ICovCi0JCS8qIHZhbDggPSAwOyAqLwotCi0JCS8qIGNvbmZpZyBNU1IgKi8KLQkJcnRsODcyM2Ffc2V0X21lZGlhX3N0YXR1cyhwYWRhcHRlciwgcG1sbWVpbmZvLT5zdGF0ZSAmIDB4Myk7Ci0KLQkJLyogcmVzdG9yZSBSWCBHQUlOICovCi0JCXJ0bDg3MjNhX3NldF9pbml0aWFsX2dhaW4ocGFkYXB0ZXIsIDB4ZmYpOwotCQkvKiB0dXJuIG9uIGR5bmFtaWMgZnVuY3Rpb25zICovCi0JCXJ0bDg3MjNhX29kbV9zdXBwb3J0X2FiaWxpdHlfcmVzdG9yZShwYWRhcHRlcik7Ci0KLQkJaWYgKGlzX2NsaWVudF9hc3NvY2lhdGVkX3RvX2FwMjNhKHBhZGFwdGVyKSA9PSB0cnVlKQotCQkJaXNzdWVfbnVsbGRhdGEyM2EocGFkYXB0ZXIsIE5VTEwsIDAsIDMsIDUwMCk7Ci0KLQkJcnRsODcyM2FfbWxtZV9zaXRlc3VydmV5KHBhZGFwdGVyLCAwKTsKLQotCQlyZXBvcnRfc3VydmV5ZG9uZV9ldmVudDIzYShwYWRhcHRlcik7Ci0KLQkJcG1sbWVleHQtPmNoYW5fc2Nhbl90aW1lID0gU1VSVkVZX1RPOwotCQlwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuc3RhdGUgPSBTQ0FOX0RJU0FCTEU7Ci0JfQotfQotCi0vKiBjb2xsZWN0IGJzcyBpbmZvIGZyb20gQmVhY29uIGFuZCBQcm9iZSByZXF1ZXN0L3Jlc3BvbnNlIGZyYW1lcy4gKi8KLXN0YXRpYyBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqY29sbGVjdF9ic3NfaW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCQkgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByZWN2X2ZyYW1lLT5wa3Q7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKSBza2ItPmRhdGE7Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdpc3RyeXByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpic3NpZDsKLQljb25zdCB1OCAqcDsKLQl1OCAqcGllOwotCXVuc2lnbmVkIGludCBsZW5ndGg7Ci0JaW50IGk7Ci0KLQlsZW5ndGggPSBza2ItPmxlbjsKLQotCWJzc2lkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdsYW5fYnNzaWRfZXgpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWJzc2lkKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChpZWVlODAyMTFfaXNfYmVhY29uKG1nbXQtPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCWxlbmd0aCAtPSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYmVhY29uLnZhcmlhYmxlKTsKLQkJcGllID0gbWdtdC0+dS5iZWFjb24udmFyaWFibGU7Ci0JCWJzc2lkLT5yZXNlcnZlZCA9IDE7Ci0JCWJzc2lkLT5jYXBhYmlsaXR5ID0KLQkJCWdldF91bmFsaWduZWRfbGUxNigmbWdtdC0+dS5iZWFjb24uY2FwYWJfaW5mbyk7Ci0JCWJzc2lkLT5iZWFjb25faW50ZXJ2YWwgPQotCQkJZ2V0X3VuYWxpZ25lZF9sZTE2KCZtZ210LT51LmJlYWNvbi5iZWFjb25faW50KTsKLQkJYnNzaWQtPnRzZiA9IGdldF91bmFsaWduZWRfbGU2NCgmbWdtdC0+dS5iZWFjb24udGltZXN0YW1wKTsKLQl9IGVsc2UgaWYgKGllZWU4MDIxMV9pc19wcm9iZV9yZXEobWdtdC0+ZnJhbWVfY29udHJvbCkpIHsKLQkJbGVuZ3RoIC09IG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5wcm9iZV9yZXEudmFyaWFibGUpOwotCQlwaWUgPSBtZ210LT51LnByb2JlX3JlcS52YXJpYWJsZTsKLQkJYnNzaWQtPnJlc2VydmVkID0gMjsKLQkJYnNzaWQtPmNhcGFiaWxpdHkgPSAwOwotCQlic3NpZC0+YmVhY29uX2ludGVydmFsID0KLQkJCXBhZGFwdGVyLT5yZWdpc3RyeXByaXYuZGV2X25ldHdvcmsuYmVhY29uX2ludGVydmFsOwotCQlic3NpZC0+dHNmID0gMDsKLQl9IGVsc2UgaWYgKGllZWU4MDIxMV9pc19wcm9iZV9yZXNwKG1nbXQtPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCWxlbmd0aCAtPQotCQkJb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LnByb2JlX3Jlc3AudmFyaWFibGUpOwotCQlwaWUgPSBtZ210LT51LnByb2JlX3Jlc3AudmFyaWFibGU7Ci0JCWJzc2lkLT5yZXNlcnZlZCA9IDM7Ci0JCWJzc2lkLT5jYXBhYmlsaXR5ID0KLQkJCWdldF91bmFsaWduZWRfbGUxNigmbWdtdC0+dS5wcm9iZV9yZXNwLmNhcGFiX2luZm8pOwotCQlic3NpZC0+YmVhY29uX2ludGVydmFsID0KLQkJCWdldF91bmFsaWduZWRfbGUxNigmbWdtdC0+dS5wcm9iZV9yZXNwLmJlYWNvbl9pbnQpOwotCQlic3NpZC0+dHNmID0gZ2V0X3VuYWxpZ25lZF9sZTY0KCZtZ210LT51LnByb2JlX3Jlc3AudGltZXN0YW1wKTsKLQl9IGVsc2UgewotCQlsZW5ndGggLT0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LmJlYWNvbi52YXJpYWJsZSk7Ci0JCXBpZSA9IG1nbXQtPnUuYmVhY29uLnZhcmlhYmxlOwotCQlic3NpZC0+cmVzZXJ2ZWQgPSAwOwotCQlic3NpZC0+Y2FwYWJpbGl0eSA9Ci0JCQlnZXRfdW5hbGlnbmVkX2xlMTYoJm1nbXQtPnUuYmVhY29uLmNhcGFiX2luZm8pOwotCQlic3NpZC0+YmVhY29uX2ludGVydmFsID0KLQkJCXBhZGFwdGVyLT5yZWdpc3RyeXByaXYuZGV2X25ldHdvcmsuYmVhY29uX2ludGVydmFsOwotCQlic3NpZC0+dHNmID0gMDsKLQl9Ci0KLQlpZiAobGVuZ3RoID4gTUFYX0lFX1NaKSB7Ci0JCS8qIERCR184NzIzQSgiSUUgdG9vIGxvbmcgZm9yIHN1cnZleSBldmVudFxuIik7ICovCi0JCWtmcmVlKGJzc2lkKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JYnNzaWQtPkxlbmd0aCA9IG9mZnNldG9mKHN0cnVjdCB3bGFuX2Jzc2lkX2V4LCBJRXMpICsgbGVuZ3RoOwotCi0JLyogYmVsb3cgaXMgdG8gY29weSB0aGUgaW5mb3JtYXRpb24gZWxlbWVudCAqLwotCWJzc2lkLT5JRUxlbmd0aCA9IGxlbmd0aDsKLQltZW1jcHkoYnNzaWQtPklFcywgcGllLCBic3NpZC0+SUVMZW5ndGgpOwotCi0JLyogZ2V0IHRoZSBzaWduYWwgc3RyZW5ndGggKi8KLQkvKiAgaW4gZEJNLnJhdyBkYXRhICovCi0JYnNzaWQtPlJzc2kgPSBwcmVjdl9mcmFtZS0+YXR0cmliLnBoeV9pbmZvLlJlY3ZTaWduYWxQb3dlcjsKLQlic3NpZC0+U2lnbmFsUXVhbGl0eSA9Ci0JCXByZWN2X2ZyYW1lLT5hdHRyaWIucGh5X2luZm8uU2lnbmFsUXVhbGl0eTsvKiBpbiBwZXJjZW50YWdlICovCi0JYnNzaWQtPlNpZ25hbFN0cmVuZ3RoID0KLQkJcHJlY3ZfZnJhbWUtPmF0dHJpYi5waHlfaW5mby5TaWduYWxTdHJlbmd0aDsvKiBpbiBwZXJjZW50YWdlICovCi0KLQkvKiAgY2hlY2tpbmcgU1NJRCAqLwotCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX1NTSUQsIGJzc2lkLT5JRXMsIGJzc2lkLT5JRUxlbmd0aCk7Ci0KLQlpZiAoIXApIHsKLQkJREJHXzg3MjNBKCJtYXJjOiBjYW5ub3QgZmluZCBTU0lEIGZvciBzdXJ2ZXkgZXZlbnRcbiIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JaWYgKHBbMV0gPiBJRUVFODAyMTFfTUFYX1NTSURfTEVOKSB7Ci0JCURCR184NzIzQSgiJXMoKS0lZDogSUUgdG9vIGxvbmcgKCVkKSBmb3Igc3VydmV5ICIKLQkJCSAgImV2ZW50XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHBbMV0pOwotCQlnb3RvIGZhaWw7Ci0JfQotCW1lbWNweShic3NpZC0+U3NpZC5zc2lkLCBwICsgMiwgcFsxXSk7Ci0JYnNzaWQtPlNzaWQuc3NpZF9sZW4gPSBwWzFdOwotCi0JLyogY2hlY2tpbmcgcmF0ZSBpbmZvLi4uICovCi0JaSA9IDA7Ci0JcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfU1VQUF9SQVRFUywgYnNzaWQtPklFcywgYnNzaWQtPklFTGVuZ3RoKTsKLQlpZiAocCkgewotCQlpZiAocFsxXSA+IE5ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWCkgewotCQkJREJHXzg3MjNBKCIlcygpLSVkOiBJRSB0b28gbG9uZyAoJWQpIGZvciBzdXJ2ZXkgIgotCQkJCSAgImV2ZW50XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHBbMV0pOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCW1lbWNweShic3NpZC0+U3VwcG9ydGVkUmF0ZXMsIHAgKyAyLCBwWzFdKTsKLQkJaSA9IHBbMV07Ci0JfQotCi0JcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfRVhUX1NVUFBfUkFURVMsIGJzc2lkLT5JRXMsCi0JCQkgICAgIGJzc2lkLT5JRUxlbmd0aCk7Ci0JaWYgKHApIHsKLQkJaWYgKHBbMV0gPiAoTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYLWkpKSB7Ci0JCQlEQkdfODcyM0EoIiVzKCktJWQ6IElFIHRvbyBsb25nICglZCkgZm9yIHN1cnZleSAiCi0JCQkJICAiZXZlbnRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcFsxXSk7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJbWVtY3B5KGJzc2lkLT5TdXBwb3J0ZWRSYXRlcyArIGksIHAgKyAyLCBwWzFdKTsKLQl9Ci0KLQkvKiAgQ2hlY2tpbmcgZm9yIERTQ29uZmlnICovCi0JcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfRFNfUEFSQU1TLCBic3NpZC0+SUVzLCBic3NpZC0+SUVMZW5ndGgpOwotCi0JYnNzaWQtPkRTQ29uZmlnID0gMDsKLQotCWlmIChwKSB7Ci0JCWJzc2lkLT5EU0NvbmZpZyA9IHBbMl07Ci0JfSBlbHNlIHsvKiAgSW4gNUcsIHNvbWUgYXAgZG8gbm90IGhhdmUgRFNTRVQgSUUgKi8KLQkJLyogIGNoZWNraW5nIEhUIGluZm8gZm9yIGNoYW5uZWwgKi8KLQkJcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfSFRfT1BFUkFUSU9OLCBic3NpZC0+SUVzLAotCQkJCSAgICAgYnNzaWQtPklFTGVuZ3RoKTsKLQkJaWYgKHApIHsKLQkJCXN0cnVjdCBpZWVlODAyMTFfaHRfb3BlcmF0aW9uICpIVF9pbmZvID0KLQkJCQkoc3RydWN0IGllZWU4MDIxMV9odF9vcGVyYXRpb24gKikocCArIDIpOwotCQkJYnNzaWQtPkRTQ29uZmlnID0gSFRfaW5mby0+cHJpbWFyeV9jaGFuOwotCQl9IGVsc2UgLyogIHVzZSBjdXJyZW50IGNoYW5uZWwgKi8KLQkJCWJzc2lkLT5EU0NvbmZpZyA9IHJ0d19nZXRfb3Blcl9jaDIzYShwYWRhcHRlcik7Ci0JfQotCi0JaWYgKGllZWU4MDIxMV9pc19wcm9iZV9yZXEobWdtdC0+ZnJhbWVfY29udHJvbCkpIHsKLQkJLyogIEZJWE1FICovCi0JCWJzc2lkLT5pZm1vZGUgPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOwotCQlldGhlcl9hZGRyX2NvcHkoYnNzaWQtPk1hY0FkZHJlc3MsIG1nbXQtPnNhKTsKLQkJYnNzaWQtPlByaXZhY3kgPSAxOwotCQlyZXR1cm4gYnNzaWQ7Ci0JfQotCi0JaWYgKGJzc2lkLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0VTUykgewotCQlic3NpZC0+aWZtb2RlID0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTjsKLQkJZXRoZXJfYWRkcl9jb3B5KGJzc2lkLT5NYWNBZGRyZXNzLCBtZ210LT5zYSk7Ci0JfSBlbHNlIHsKLQkJYnNzaWQtPmlmbW9kZSA9IE5MODAyMTFfSUZUWVBFX0FESE9DOwotCQlldGhlcl9hZGRyX2NvcHkoYnNzaWQtPk1hY0FkZHJlc3MsIG1nbXQtPmJzc2lkKTsKLQl9Ci0KLQlpZiAoYnNzaWQtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkKLQkJYnNzaWQtPlByaXZhY3kgPSAxOwotCWVsc2UKLQkJYnNzaWQtPlByaXZhY3kgPSAwOwotCi0JYnNzaWQtPkFUSU1XaW5kb3cgPSAwOwotCi0JLyogMjAvNDAgQlNTIENvZXhpc3RlbmNlIGNoZWNrICovCi0JaWYgKHByZWdpc3RyeXByaXYtPndpZmlfc3BlYyA9PSAxICYmCi0JICAgIHBtbG1laW5mby0+Yndtb2RlX3VwZGF0ZWQgPT0gZmFsc2UpIHsKLQkJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9IVF9DQVBBQklMSVRZLCBic3NpZC0+SUVzLAotCQkJCSAgICAgYnNzaWQtPklFTGVuZ3RoKTsKLQkJaWYgKHAgJiYgcFsxXSA+IDApIHsKLQkJCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpwSFRfY2FwczsKLQotCQkJcEhUX2NhcHMgPSAoc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKikocCArIDIpOwotCi0JCQlpZiAocEhUX2NhcHMtPmNhcF9pbmZvICYKLQkJCSAgICBjcHVfdG9fbGUxNihJRUVFODAyMTFfSFRfQ0FQXzQwTUhaX0lOVE9MRVJBTlQpKQotCQkJCXBtbG1lcHJpdi0+bnVtX0ZvcnR5TUh6SW50b2xlcmFudCsrOwotCQl9IGVsc2UKLQkJCXBtbG1lcHJpdi0+bnVtX3N0YV9ub19odCsrOwotCX0KLQotCi0JLyogIG1hcmsgYnNzIGluZm8gcmVjZWl2aW5nIGZyb20gbmVhcmJ5IGNoYW5uZWwgYXMgU2lnbmFsUXVhbGl0eSAxMDEgKi8KLQlpZiAoYnNzaWQtPkRTQ29uZmlnICE9IHJ0d19nZXRfb3Blcl9jaDIzYShwYWRhcHRlcikpCi0JCWJzc2lkLT5TaWduYWxRdWFsaXR5ID0gMTAxOwotCi0JcmV0dXJuIGJzc2lkOwotZmFpbDoKLQlrZnJlZSAoYnNzaWQpOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBzdGFydF9jcmVhdGVfaWJzcyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXVuc2lnbmVkIHNob3J0IGNhcHM7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmsgPSAmcG1sbWVpbmZvLT5uZXR3b3JrOwotCi0JcG1sbWVleHQtPmN1cl9jaGFubmVsID0gKHU4KXBuZXR3b3JrLT5EU0NvbmZpZzsKLQlwbWxtZWluZm8tPmJjbl9pbnRlcnZhbCA9IHBuZXR3b3JrLT5iZWFjb25faW50ZXJ2YWw7Ci0KLQkvKiB1cGRhdGUgd2lyZWxlc3MgbW9kZSAqLwotCXVwZGF0ZV93aXJlbGVzc19tb2RlMjNhKHBhZGFwdGVyKTsKLQotCS8qIHVwZGF0ZSBjYXBhYmlsaXR5ICovCi0JY2FwcyA9IHBuZXR3b3JrLT5jYXBhYmlsaXR5OwotCXVwZGF0ZV9jYXBpbmZvMjNhKHBhZGFwdGVyLCBjYXBzKTsKLQlpZiAoY2FwcyAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSB7CS8qIGFkaG9jIG1hc3RlciAqLwotCQlydGw4NzIzYV9zZXRfc2VjX2NmZyhwYWRhcHRlciwgMHhjZik7Ci0KLQkJLyogc3dpdGNoIGNoYW5uZWwgKi8KLQkJLyogU2VsZWN0Q2hhbm5lbDIzYShwYWRhcHRlciwgcG1sbWVleHQtPmN1cl9jaGFubmVsLCBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFKTsgKi8KLQkJc2V0X2NoYW5uZWxfYndtb2RlMjNhKHBhZGFwdGVyLCBwbWxtZWV4dC0+Y3VyX2NoYW5uZWwsIEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkUsIEhUX0NIQU5ORUxfV0lEVEhfMjApOwotCi0JCXJ0bDg3MjNhX1NldEJlYWNvblJlbGF0ZWRSZWdpc3RlcnMocGFkYXB0ZXIpOwotCi0JCS8qIHNldCBtc3IgdG8gTVNSX0FESE9DICovCi0JCXBtbG1laW5mby0+c3RhdGUgPSBNU1JfQURIT0M7Ci0JCXJ0bDg3MjNhX3NldF9tZWRpYV9zdGF0dXMocGFkYXB0ZXIsIHBtbG1laW5mby0+c3RhdGUgJiAweDMpOwotCi0JCS8qIGlzc3VlIGJlYWNvbiAqLwotCQlpZiAoc2VuZF9iZWFjb24yM2EocGFkYXB0ZXIpID09IF9GQUlMKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJCSAiaXNzdWluZyBiZWFjb24gZnJhbWUgZmFpbC4uLi5cbiIpOwotCi0JCQlyZXBvcnRfam9pbl9yZXMyM2EocGFkYXB0ZXIsIC0xKTsKLQkJCXBtbG1laW5mby0+c3RhdGUgPSBNU1JfTk9MSU5LOwotCQl9IGVsc2UgewotCQkJaHdfdmFyX3NldF9ic3NpZChwYWRhcHRlciwgcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5kZXZfbmV0d29yay5NYWNBZGRyZXNzKTsKLQkJCWh3X3Zhcl9zZXRfbWxtZV9qb2luKHBhZGFwdGVyLCAwKTsKLQotCQkJcmVwb3J0X2pvaW5fcmVzMjNhKHBhZGFwdGVyLCAxKTsKLQkJCXBtbG1laW5mby0+c3RhdGUgfD0gV0lGSV9GV19BU1NPQ19TVUNDRVNTOwotCQl9Ci0JfSBlbHNlIHsKLQkJREJHXzg3MjNBKCIlczogaW52YWxpZCBjYXA6JXhcbiIsIF9fZnVuY19fLCBjYXBzKTsKLQkJcmV0dXJuOwotCX0KLX0KLQotc3RhdGljIHZvaWQgc3RhcnRfY2xudF9qb2luKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdW5zaWduZWQgc2hvcnQgY2FwczsKLQl1OCB2YWw4OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKnBuZXR3b3JrID0gJnBtbG1laW5mby0+bmV0d29yazsKLQlpbnQgYmVhY29uX3RpbWVvdXQ7Ci0KLQlwbWxtZWV4dC0+Y3VyX2NoYW5uZWwgPSAodTgpcG5ldHdvcmstPkRTQ29uZmlnOwotCXBtbG1laW5mby0+YmNuX2ludGVydmFsID0gcG5ldHdvcmstPmJlYWNvbl9pbnRlcnZhbDsKLQotCS8qIHVwZGF0ZSB3aXJlbGVzcyBtb2RlICovCi0JdXBkYXRlX3dpcmVsZXNzX21vZGUyM2EocGFkYXB0ZXIpOwotCi0JLyogdXBkYXRlIGNhcGFiaWxpdHkgKi8KLQljYXBzID0gcG5ldHdvcmstPmNhcGFiaWxpdHk7Ci0JdXBkYXRlX2NhcGluZm8yM2EocGFkYXB0ZXIsIGNhcHMpOwotCWlmIChjYXBzICYgV0xBTl9DQVBBQklMSVRZX0VTUykgewotCQkvKiBzd2l0Y2ggY2hhbm5lbCAqLwotCQlzZXRfY2hhbm5lbF9id21vZGUyM2EocGFkYXB0ZXIsIHBtbG1lZXh0LT5jdXJfY2hhbm5lbCwgcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQsIHBtbG1lZXh0LT5jdXJfYndtb2RlKTsKLQotCQlydGw4NzIzYV9zZXRfbWVkaWFfc3RhdHVzKHBhZGFwdGVyLCBNU1JfSU5GUkEpOwotCi0JCXZhbDggPSAocG1sbWVpbmZvLT5hdXRoX2FsZ28gPT0gZG90MTFBdXRoQWxncnRobV84MDIxWCkgPwotCQkJMHhjYzogMHhjZjsKLQotCQlydGw4NzIzYV9zZXRfc2VjX2NmZyhwYWRhcHRlciwgdmFsOCk7Ci0KLQkJLyogc3dpdGNoIGNoYW5uZWwgKi8KLQkJLyogc2V0X2NoYW5uZWxfYndtb2RlMjNhKHBhZGFwdGVyLCBwbWxtZWV4dC0+Y3VyX2NoYW5uZWwsIHBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0LCBwbWxtZWV4dC0+Y3VyX2J3bW9kZSk7ICovCi0KLQkJLyogaGVyZSB3YWl0IGZvciByZWNlaXZpbmcgdGhlIGJlYWNvbiB0byBzdGFydCBhdXRoICovCi0JCS8qIGFuZCBlbmFibGUgYSB0aW1lciAqLwotCQliZWFjb25fdGltZW91dCA9IGRlY2lkZV93YWl0X2Zvcl9iZWFjb25fdGltZW91dDIzYShwbWxtZWluZm8tPmJjbl9pbnRlcnZhbCk7Ci0JCXNldF9saW5rX3RpbWVyKHBtbG1lZXh0LCBiZWFjb25fdGltZW91dCk7Ci0JCW1vZF90aW1lcigmcGFkYXB0ZXItPm1sbWVwcml2LmFzc29jX3RpbWVyLCBqaWZmaWVzICsKLQkJCSAgbXNlY3NfdG9famlmZmllcygoUkVBVVRIX1RPICogUkVBVVRIX0xJTUlUKSArIChSRUFTU09DX1RPKlJFQVNTT0NfTElNSVQpICsgYmVhY29uX3RpbWVvdXQpKTsKLQkJcG1sbWVpbmZvLT5zdGF0ZSA9IFdJRklfRldfQVVUSF9OVUxMIHwgTVNSX0lORlJBOwotCX0gZWxzZSBpZiAoY2FwcyAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSB7CS8qIGFkaG9jIGNsaWVudCAqLwotCQlydGw4NzIzYV9zZXRfbWVkaWFfc3RhdHVzKHBhZGFwdGVyLCBNU1JfQURIT0MpOwotCi0JCXJ0bDg3MjNhX3NldF9zZWNfY2ZnKHBhZGFwdGVyLCAweGNmKTsKLQotCQkvKiBzd2l0Y2ggY2hhbm5lbCAqLwotCQlzZXRfY2hhbm5lbF9id21vZGUyM2EocGFkYXB0ZXIsIHBtbG1lZXh0LT5jdXJfY2hhbm5lbCwgcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQsIHBtbG1lZXh0LT5jdXJfYndtb2RlKTsKLQotCQlydGw4NzIzYV9TZXRCZWFjb25SZWxhdGVkUmVnaXN0ZXJzKHBhZGFwdGVyKTsKLQotCQlwbWxtZWluZm8tPnN0YXRlID0gTVNSX0FESE9DOwotCi0JCXJlcG9ydF9qb2luX3JlczIzYShwYWRhcHRlciwgMSk7Ci0JfSBlbHNlIHsKLQkJLyogREJHXzg3MjNBKCJtYXJjOiBpbnZhbGlkIGNhcDoleFxuIiwgY2Fwcyk7ICovCi0JCXJldHVybjsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHN0YXJ0X2NsbnRfYXV0aChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlkZWxfdGltZXJfc3luYygmcG1sbWVleHQtPmxpbmtfdGltZXIpOwotCi0JcG1sbWVpbmZvLT5zdGF0ZSAmPSAofldJRklfRldfQVVUSF9OVUxMKTsKLQlwbWxtZWluZm8tPnN0YXRlIHw9IFdJRklfRldfQVVUSF9TVEFURTsKLQotCXBtbG1laW5mby0+YXV0aF9zZXEgPSAxOwotCXBtbG1laW5mby0+cmVhdXRoX2NvdW50ID0gMDsKLQlwbWxtZWluZm8tPnJlYXNzb2NfY291bnQgPSAwOwotCXBtbG1laW5mby0+bGlua19jb3VudCA9IDA7Ci0JcG1sbWVleHQtPnJldHJ5ID0gMDsKLQotCS8qICBCZWNhdXNlIG9mIEFQJ3Mgbm90IHJlY2VpdmluZyBkZWF1dGggYmVmb3JlICovCi0JLyogIEFQIG1heTogMSlub3QgcmVzcG9uc2UgYXV0aCBvciAyKWRlYXV0aCB1cyBhZnRlciBsaW5rIGlzIGNvbXBsZXRlICovCi0JLyogIGlzc3VlIGRlYXV0aCBiZWZvcmUgaXNzdWluZyBhdXRoIHRvIGRlYWwgd2l0aCB0aGUgc2l0dWF0aW9uICovCi0JLyoJQ29tbWVudGVkIGJ5IEFsYmVydCAyMDEyLzA3LzIxICovCi0JLyoJRm9yIHRoZSBXaW44IFAyUCBjb25uZWN0aW9uLCBpdCB3aWxsIGJlIGhhcmQgdG8gaGF2ZSBhCi0JCXN1Y2Nlc3NmdWwgY29ubmVjdGlvbiBpZiB0aGlzIFdpLUZpIGRvZXNuJ3QgY29ubmVjdCB0byBpdC4gKi8KLQlpc3N1ZV9kZWF1dGgyM2EocGFkYXB0ZXIsICgmcG1sbWVpbmZvLT5uZXR3b3JrKS0+TWFjQWRkcmVzcywKLQkJCVdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HKTsKLQotCURCR184NzIzQV9MRVZFTChfZHJ2X2Fsd2F5c18sICJzdGFydCBhdXRoXG4iKTsKLQlpc3N1ZV9hdXRoKHBhZGFwdGVyLCBOVUxMLCAwKTsKLQotCXNldF9saW5rX3RpbWVyKHBtbG1lZXh0LCBSRUFVVEhfVE8pOwotfQotCi1zdGF0aWMgdm9pZCBzdGFydF9jbG50X2Fzc29jKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCWRlbF90aW1lcl9zeW5jKCZwbWxtZWV4dC0+bGlua190aW1lcik7Ci0KLQlwbWxtZWluZm8tPnN0YXRlICY9ICh+KFdJRklfRldfQVVUSF9OVUxMIHwgV0lGSV9GV19BVVRIX1NUQVRFKSk7Ci0JcG1sbWVpbmZvLT5zdGF0ZSB8PSAoV0lGSV9GV19BVVRIX1NVQ0NFU1MgfCBXSUZJX0ZXX0FTU09DX1NUQVRFKTsKLQotCWlzc3VlX2Fzc29jcmVxKHBhZGFwdGVyKTsKLQotCXNldF9saW5rX3RpbWVyKHBtbG1lZXh0LCBSRUFTU09DX1RPKTsKLX0KLQotaW50IHJlY2VpdmVfZGlzY29ubmVjdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICB1bnNpZ25lZCBjaGFyICpNYWNBZGRyLCB1bnNpZ25lZCBzaG9ydCByZWFzb24pCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCS8qIGNoZWNrIEEzICovCi0JaWYgKCFldGhlcl9hZGRyX2VxdWFsKE1hY0FkZHIsIGdldF9teV9ic3NpZDIzYSgmcG1sbWVpbmZvLT5uZXR3b3JrKSkpCi0JCXJldHVybiBfU1VDQ0VTUzsKLQotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCWlmICgocG1sbWVpbmZvLT5zdGF0ZSYweDAzKSA9PSBNU1JfSU5GUkEpIHsKLQkJaWYgKHBtbG1laW5mby0+c3RhdGUgJiBXSUZJX0ZXX0FTU09DX1NVQ0NFU1MpIHsKLQkJCXBtbG1laW5mby0+c3RhdGUgPSBNU1JfTk9MSU5LOwotCQkJcmVwb3J0X2RlbF9zdGFfZXZlbnQyM2EocGFkYXB0ZXIsIE1hY0FkZHIsIHJlYXNvbik7Ci0KLQkJfSBlbHNlIGlmIChwbWxtZWluZm8tPnN0YXRlICYgV0lGSV9GV19MSU5LSU5HX1NUQVRFKSB7Ci0JCQlwbWxtZWluZm8tPnN0YXRlID0gTVNSX05PTElOSzsKLQkJCXJlcG9ydF9qb2luX3JlczIzYShwYWRhcHRlciwgLTIpOwotCQl9Ci0JfQotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgdm9pZCBwcm9jZXNzXzgwMjExZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgc3RydWN0IHdsYW5fYnNzaWRfZXggKmJzc2lkKQotewotCXN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVnaXN0cnlwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dDsKLQlzdHJ1Y3QgcnRfY2hhbm5lbF9pbmZvICpjaHBsYW5fbmV3OwotCXU4IGNoYW5uZWw7Ci0JdTggaTsKLQotCXByZWdpc3RyeXByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQlwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0KLQkvKiAgQWRqdXN0IGNoYW5uZWwgcGxhbiBieSBBUCBDb3VudHJ5IElFICovCi0JaWYgKHByZWdpc3RyeXByaXYtPmVuYWJsZTgwMjExZCAmJgotCSAgICAhcG1sbWVleHQtPnVwZGF0ZV9jaGFubmVsX3BsYW5fYnlfYXBfZG9uZSkgewotCQljb25zdCB1OCAqaWUsICpwOwotCQlzdHJ1Y3QgcnRfY2hhbm5lbF9wbGFuIGNocGxhbl9hcDsKLQkJc3RydWN0IHJ0X2NoYW5uZWxfaW5mbyBjaHBsYW5fc3RhW01BWF9DSEFOTkVMX05VTV07Ci0JCXU4IGNvdW50cnlbNF07Ci0JCXU4IGZjbjsgLyogIGZpcnN0IGNoYW5uZWwgbnVtYmVyICovCi0JCXU4IG5vYzsgLyogIG51bWJlciBvZiBjaGFubmVsICovCi0JCXU4IGosIGs7Ci0KLQkJaWUgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0NPVU5UUlksIGJzc2lkLT5JRXMsCi0JCQkJICAgICAgYnNzaWQtPklFTGVuZ3RoKTsKLQkJaWYgKCFpZSB8fCBpZVsxXSA8IElFRUU4MDIxMV9DT1VOVFJZX0lFX01JTl9MRU4pCi0JCQlyZXR1cm47Ci0KLQkJcCA9IGllICsgMjsKLQkJaWUgKz0gaWVbMV07Ci0JCWllICs9IDI7Ci0KLQkJbWVtY3B5KGNvdW50cnksIHAsIDMpOwotCQljb3VudHJ5WzNdID0gJ1wwJzsKLQotCQlwICs9IDM7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X25vdGljZV8sCi0JCQkgIiVzOiA4MDIuMTFkIGNvdW50cnkgPSVzXG4iLCBfX2Z1bmNfXywgY291bnRyeSk7Ci0KLQkJaSA9IDA7Ci0JCXdoaWxlICgoaWUgLSBwKSA+PSAzKSB7Ci0JCQlmY24gPSAqKHArKyk7Ci0JCQlub2MgPSAqKHArKyk7Ci0JCQlwKys7Ci0KLQkJCWZvciAoaiA9IDA7IGogPCBub2M7IGorKykgewotCQkJCWlmIChmY24gPD0gMTQpCi0JCQkJCWNoYW5uZWwgPSBmY24gKyBqOyAvKiAgMi40IEdIeiAqLwotCQkJCWVsc2UKLQkJCQkJY2hhbm5lbCA9IGZjbiArIGogKiA0OyAvKiAgNSBHSHogKi8KLQotCQkJCWNocGxhbl9hcC5DaGFubmVsW2krK10gPSBjaGFubmVsOwotCQkJfQotCQl9Ci0JCWNocGxhbl9hcC5MZW4gPSBpOwotCi0JCW1lbWNweShjaHBsYW5fc3RhLCBwbWxtZWV4dC0+Y2hhbm5lbF9zZXQsIHNpemVvZihjaHBsYW5fc3RhKSk7Ci0JCW1lbXNldChwbWxtZWV4dC0+Y2hhbm5lbF9zZXQsIDAsIHNpemVvZihwbWxtZWV4dC0+Y2hhbm5lbF9zZXQpKTsKLQkJY2hwbGFuX25ldyA9IHBtbG1lZXh0LT5jaGFubmVsX3NldDsKLQotCQlpID0gaiA9IGsgPSAwOwotCQlpZiAocHJlZ2lzdHJ5cHJpdi0+d2lyZWxlc3NfbW9kZSAmIFdJUkVMRVNTXzExRykgewotCQkJZG8gewotCQkJCWlmIChpID09IE1BWF9DSEFOTkVMX05VTSB8fAotCQkJCSAgICBjaHBsYW5fc3RhW2ldLkNoYW5uZWxOdW0gPT0gMCB8fAotCQkJCSAgICBjaHBsYW5fc3RhW2ldLkNoYW5uZWxOdW0gPiAxNCkKLQkJCQkJYnJlYWs7Ci0KLQkJCQlpZiAoaiA9PSBjaHBsYW5fYXAuTGVuIHx8Ci0JCQkJICAgIGNocGxhbl9hcC5DaGFubmVsW2pdID4gMTQpCi0JCQkJCWJyZWFrOwotCi0JCQkJaWYgKGNocGxhbl9zdGFbaV0uQ2hhbm5lbE51bSA9PQotCQkJCSAgICBjaHBsYW5fYXAuQ2hhbm5lbFtqXSkgewotCQkJCQljaHBsYW5fbmV3W2tdLkNoYW5uZWxOdW0gPQotCQkJCQkJY2hwbGFuX2FwLkNoYW5uZWxbal07Ci0JCQkJCWNocGxhbl9uZXdba10uU2NhblR5cGUgPSBTQ0FOX0FDVElWRTsKLQkJCQkJaSsrOwotCQkJCQlqKys7Ci0JCQkJCWsrKzsKLQkJCQl9IGVsc2UgaWYgKGNocGxhbl9zdGFbaV0uQ2hhbm5lbE51bSA8Ci0JCQkJCSAgIGNocGxhbl9hcC5DaGFubmVsW2pdKSB7Ci0JCQkJCWNocGxhbl9uZXdba10uQ2hhbm5lbE51bSA9Ci0JCQkJCQljaHBsYW5fc3RhW2ldLkNoYW5uZWxOdW07Ci0JCQkJCWNocGxhbl9uZXdba10uU2NhblR5cGUgPQotCQkJCQkJU0NBTl9QQVNTSVZFOwotCQkJCQlpKys7Ci0JCQkJCWsrKzsKLQkJCQl9IGVsc2UgaWYgKGNocGxhbl9zdGFbaV0uQ2hhbm5lbE51bSA+Ci0JCQkJCSAgIGNocGxhbl9hcC5DaGFubmVsW2pdKSB7Ci0JCQkJCWNocGxhbl9uZXdba10uQ2hhbm5lbE51bSA9Ci0JCQkJCQljaHBsYW5fYXAuQ2hhbm5lbFtqXTsKLQkJCQkJY2hwbGFuX25ld1trXS5TY2FuVHlwZSA9Ci0JCQkJCQlTQ0FOX0FDVElWRTsKLQkJCQkJaisrOwotCQkJCQlrKys7Ci0JCQkJfQotCQkJfSB3aGlsZSAoMSk7Ci0KLQkJCS8qICBjaGFuZ2UgQVAgbm90IHN1cHBvcnQgY2hhbm5lbCB0byBQYXNzaXZlIHNjYW4gKi8KLQkJCXdoaWxlIChpIDwgTUFYX0NIQU5ORUxfTlVNICYmCi0JCQkgICAgICAgY2hwbGFuX3N0YVtpXS5DaGFubmVsTnVtICE9IDAgJiYKLQkJCSAgICAgICBjaHBsYW5fc3RhW2ldLkNoYW5uZWxOdW0gPD0gMTQpIHsKLQkJCQljaHBsYW5fbmV3W2tdLkNoYW5uZWxOdW0gPQotCQkJCQljaHBsYW5fc3RhW2ldLkNoYW5uZWxOdW07Ci0JCQkJY2hwbGFuX25ld1trXS5TY2FuVHlwZSA9IFNDQU5fUEFTU0lWRTsKLQkJCQlpKys7Ci0JCQkJaysrOwotCQkJfQotCi0JCQkvKiAgYWRkIGNoYW5uZWwgQVAgc3VwcG9ydGVkICovCi0JCQl3aGlsZSAoaiA8IGNocGxhbl9hcC5MZW4gJiYgY2hwbGFuX2FwLkNoYW5uZWxbal0gPD0gMTQpewotCQkJCWNocGxhbl9uZXdba10uQ2hhbm5lbE51bSA9IGNocGxhbl9hcC5DaGFubmVsW2pdOwotCQkJCWNocGxhbl9uZXdba10uU2NhblR5cGUgPSBTQ0FOX0FDVElWRTsKLQkJCQlqKys7Ci0JCQkJaysrOwotCQkJfQotCQl9IGVsc2UgewotCQkJLyogIGtlZXAgb3JpZ2luYWwgU1RBIDIuNEcgY2hhbm5lbCBwbGFuICovCi0JCQl3aGlsZSAoaSA8IE1BWF9DSEFOTkVMX05VTSAmJgotCQkJICAgICAgIGNocGxhbl9zdGFbaV0uQ2hhbm5lbE51bSAhPSAwICYmCi0JCQkgICAgICAgY2hwbGFuX3N0YVtpXS5DaGFubmVsTnVtIDw9IDE0KSB7Ci0JCQkJY2hwbGFuX25ld1trXS5DaGFubmVsTnVtID0KLQkJCQkJY2hwbGFuX3N0YVtpXS5DaGFubmVsTnVtOwotCQkJCWNocGxhbl9uZXdba10uU2NhblR5cGUgPSBjaHBsYW5fc3RhW2ldLlNjYW5UeXBlOwotCQkJCWkrKzsKLQkJCQlrKys7Ci0JCQl9Ci0KLQkJCS8qICBza2lwIEFQIDIuNEcgY2hhbm5lbCBwbGFuICovCi0JCQl3aGlsZSAoaiA8IGNocGxhbl9hcC5MZW4gJiYgY2hwbGFuX2FwLkNoYW5uZWxbal0gPD0gMTQpCi0JCQkJaisrOwotCQl9Ci0KLQkJaWYgKHByZWdpc3RyeXByaXYtPndpcmVsZXNzX21vZGUgJiBXSVJFTEVTU18xMUEpIHsKLQkJCWRvIHsKLQkJCQlpZiAoaSA9PSBNQVhfQ0hBTk5FTF9OVU0gfHwKLQkJCQkgICAgY2hwbGFuX3N0YVtpXS5DaGFubmVsTnVtID09IDApCi0JCQkJCWJyZWFrOwotCi0JCQkJaWYgKGogPT0gY2hwbGFuX2FwLkxlbiB8fAotCQkJCSAgICBjaHBsYW5fYXAuQ2hhbm5lbFtqXSA9PSAwKQotCQkJCQlicmVhazsKLQotCQkJCWlmIChjaHBsYW5fc3RhW2ldLkNoYW5uZWxOdW0gPT0KLQkJCQkgICAgY2hwbGFuX2FwLkNoYW5uZWxbal0pIHsKLQkJCQkJY2hwbGFuX25ld1trXS5DaGFubmVsTnVtID0KLQkJCQkJCWNocGxhbl9hcC5DaGFubmVsW2pdOwotCQkJCQljaHBsYW5fbmV3W2tdLlNjYW5UeXBlID0gU0NBTl9BQ1RJVkU7Ci0JCQkJCWkrKzsKLQkJCQkJaisrOwotCQkJCQlrKys7Ci0JCQkJfSBlbHNlIGlmIChjaHBsYW5fc3RhW2ldLkNoYW5uZWxOdW0gPAotCQkJCQkgICBjaHBsYW5fYXAuQ2hhbm5lbFtqXSkgewotCQkJCQljaHBsYW5fbmV3W2tdLkNoYW5uZWxOdW0gPQotCQkJCQkJY2hwbGFuX3N0YVtpXS5DaGFubmVsTnVtOwotCQkJCQljaHBsYW5fbmV3W2tdLlNjYW5UeXBlID0gU0NBTl9QQVNTSVZFOwotCQkJCQlpKys7Ci0JCQkJCWsrKzsKLQkJCQl9IGVsc2UgaWYgKGNocGxhbl9zdGFbaV0uQ2hhbm5lbE51bSA+Ci0JCQkJCSAgIGNocGxhbl9hcC5DaGFubmVsW2pdKSB7Ci0JCQkJCWNocGxhbl9uZXdba10uQ2hhbm5lbE51bSA9Ci0JCQkJCQljaHBsYW5fYXAuQ2hhbm5lbFtqXTsKLQkJCQkJY2hwbGFuX25ld1trXS5TY2FuVHlwZSA9IFNDQU5fQUNUSVZFOwotCQkJCQlqKys7Ci0JCQkJCWsrKzsKLQkJCQl9Ci0JCQl9IHdoaWxlICgxKTsKLQotCQkJLyogIGNoYW5nZSBBUCBub3Qgc3VwcG9ydCBjaGFubmVsIHRvIFBhc3NpdmUgc2NhbiAqLwotCQkJd2hpbGUgKGkgPCBNQVhfQ0hBTk5FTF9OVU0gJiYKLQkJCSAgICAgICBjaHBsYW5fc3RhW2ldLkNoYW5uZWxOdW0gIT0gMCkgewotCQkJCWNocGxhbl9uZXdba10uQ2hhbm5lbE51bSA9Ci0JCQkJCWNocGxhbl9zdGFbaV0uQ2hhbm5lbE51bTsKLQkJCQljaHBsYW5fbmV3W2tdLlNjYW5UeXBlID0gU0NBTl9QQVNTSVZFOwotCQkJCWkrKzsKLQkJCQlrKys7Ci0JCQl9Ci0KLQkJCS8qICBhZGQgY2hhbm5lbCBBUCBzdXBwb3J0ZWQgKi8KLQkJCXdoaWxlIChqIDwgY2hwbGFuX2FwLkxlbiAmJiBjaHBsYW5fYXAuQ2hhbm5lbFtqXSAhPSAwKSB7Ci0JCQkJY2hwbGFuX25ld1trXS5DaGFubmVsTnVtID0gY2hwbGFuX2FwLkNoYW5uZWxbal07Ci0JCQkJY2hwbGFuX25ld1trXS5TY2FuVHlwZSA9IFNDQU5fQUNUSVZFOwotCQkJCWorKzsKLQkJCQlrKys7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKiAga2VlcCBvcmlnaW5hbCBTVEEgNUcgY2hhbm5lbCBwbGFuICovCi0JCQl3aGlsZSAoaSA8IE1BWF9DSEFOTkVMX05VTSAmJgotCQkJICAgICAgIGNocGxhbl9zdGFbaV0uQ2hhbm5lbE51bSAhPSAwKSB7Ci0JCQkJY2hwbGFuX25ld1trXS5DaGFubmVsTnVtID0KLQkJCQkJY2hwbGFuX3N0YVtpXS5DaGFubmVsTnVtOwotCQkJCWNocGxhbl9uZXdba10uU2NhblR5cGUgPSBjaHBsYW5fc3RhW2ldLlNjYW5UeXBlOwotCQkJCWkrKzsKLQkJCQlrKys7Ci0JCQl9Ci0JCX0KLQkJcG1sbWVleHQtPnVwZGF0ZV9jaGFubmVsX3BsYW5fYnlfYXBfZG9uZSA9IDE7Ci0JfQotCi0JLyogIElmIGNoYW5uZWwgaXMgdXNlZCBieSBBUCwgc2V0IGNoYW5uZWwgc2NhbiB0eXBlIHRvIGFjdGl2ZSAqLwotCWNoYW5uZWwgPSBic3NpZC0+RFNDb25maWc7Ci0JY2hwbGFuX25ldyA9IHBtbG1lZXh0LT5jaGFubmVsX3NldDsKLQlpID0gMDsKLQl3aGlsZSAoaSA8IE1BWF9DSEFOTkVMX05VTSAmJiBjaHBsYW5fbmV3W2ldLkNoYW5uZWxOdW0gIT0gMCkgewotCQlpZiAoY2hwbGFuX25ld1tpXS5DaGFubmVsTnVtID09IGNoYW5uZWwpIHsKLQkJCWlmIChjaHBsYW5fbmV3W2ldLlNjYW5UeXBlID09IFNDQU5fUEFTU0lWRSkgewotCQkJCS8qIDVHIEJuYWQgMiwgMyAoREZTKSBkb2Vzbid0IGNoYW5nZQotCQkJCSAgIHRvIGFjdGl2ZSBzY2FuICovCi0JCQkJaWYgKGNoYW5uZWwgPj0gNTIgJiYgY2hhbm5lbCA8PSAxNDQpCi0JCQkJCWJyZWFrOwotCi0JCQkJY2hwbGFuX25ld1tpXS5TY2FuVHlwZSA9IFNDQU5fQUNUSVZFOwotCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X25vdGljZV8sCi0JCQkJCSAiJXM6IGNoYW5nZSBjaGFubmVsICVkIHNjYW4gdHlwZSBmcm9tIHBhc3NpdmUgdG8gYWN0aXZlXG4iLAotCQkJCQkgX19mdW5jX18sIGNoYW5uZWwpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJaSsrOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotRm9sbG93aW5nIGFyZSB0aGUgZnVuY3Rpb25zIHRvIHJlcG9ydCBldmVudHMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgcmVwb3J0X3N1cnZleV9ldmVudDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQlzdHJ1Y3QgY21kX29iaiAqcGNtZF9vYmo7Ci0JdTggKnBldnRjbWQ7Ci0JdTMyIGNtZHN6OwotCXN0cnVjdCBzdXJ2ZXlfZXZlbnQgKnBzdXJ2ZXlfZXZ0OwotCXN0cnVjdCBDMkhFdmVudF9IZWFkZXIgKnBjMmhfZXZ0X2hkcjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQ7Ci0Jc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdjsKLQotCWlmICghcGFkYXB0ZXIpCi0JCXJldHVybjsKLQotCXBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKLQotCXBjbWRfb2JqID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXBjbWRfb2JqKQotCQlyZXR1cm47Ci0KLQljbWRzeiA9IHNpemVvZihzdHJ1Y3Qgc3VydmV5X2V2ZW50KSArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKTsKLQlwZXZ0Y21kID0ga3phbGxvYyhjbWRzeiwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwZXZ0Y21kKSB7Ci0JCWtmcmVlKHBjbWRfb2JqKTsKLQkJcmV0dXJuOwotCX0KLQotCXBjbWRfb2JqLT5jbWRjb2RlID0gR0VOX0NNRF9DT0RFKF9TZXRfTUxNRV9FVlQpOwotCXBjbWRfb2JqLT5jbWRzeiA9IGNtZHN6OwotCXBjbWRfb2JqLT5wYXJtYnVmID0gcGV2dGNtZDsKLQotCXBjbWRfb2JqLT5yc3AgPSBOVUxMOwotCXBjbWRfb2JqLT5yc3BzeiAgPSAwOwotCi0JcGMyaF9ldnRfaGRyID0gKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIgKikocGV2dGNtZCk7Ci0JcGMyaF9ldnRfaGRyLT5sZW4gPSBzaXplb2Yoc3RydWN0IHN1cnZleV9ldmVudCk7Ci0JcGMyaF9ldnRfaGRyLT5JRCA9IEdFTl9FVlRfQ09ERShfU3VydmV5KTsKLQlwYzJoX2V2dF9oZHItPnNlcSA9IGF0b21pY19pbmNfcmV0dXJuKCZwbWxtZWV4dC0+ZXZlbnRfc2VxKTsKLQotCXBzdXJ2ZXlfZXZ0ID0gKHN0cnVjdCBzdXJ2ZXlfZXZlbnQqKShwZXZ0Y21kICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpKTsKLQotCXBzdXJ2ZXlfZXZ0LT5ic3MgPSBjb2xsZWN0X2Jzc19pbmZvKHBhZGFwdGVyLCBwcmVjdl9mcmFtZSk7Ci0JaWYgKCFwc3VydmV5X2V2dC0+YnNzKSB7Ci0JCWtmcmVlKHBjbWRfb2JqKTsKLQkJa2ZyZWUocGV2dGNtZCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwcm9jZXNzXzgwMjExZChwYWRhcHRlciwgcHN1cnZleV9ldnQtPmJzcyk7Ci0KLQlydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBjbWRfb2JqKTsKLQotCXBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5ic3NfY250Kys7Ci19Ci0KLXZvaWQgcmVwb3J0X3N1cnZleWRvbmVfZXZlbnQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgY21kX29iaiAqcGNtZF9vYmo7Ci0JdTggKnBldnRjbWQ7Ci0JdTMyIGNtZHN6OwotCXN0cnVjdCBzdXJ2ZXlkb25lX2V2ZW50ICpwc3VydmV5ZG9uZV9ldnQ7Ci0Jc3RydWN0IEMySEV2ZW50X0hlYWRlciAqcGMyaF9ldnRfaGRyOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKLQotCXBjbWRfb2JqID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXBjbWRfb2JqKQotCQlyZXR1cm47Ci0KLQljbWRzeiA9IHNpemVvZihzdHJ1Y3Qgc3VydmV5ZG9uZV9ldmVudCkgKyBzaXplb2Yoc3RydWN0IEMySEV2ZW50X0hlYWRlcik7Ci0JcGV2dGNtZCA9IGt6YWxsb2MoY21kc3osIEdGUF9BVE9NSUMpOwotCWlmICghcGV2dGNtZCkgewotCQlrZnJlZShwY21kX29iaik7Ci0JCXJldHVybjsKLQl9Ci0KLQlwY21kX29iai0+Y21kY29kZSA9IEdFTl9DTURfQ09ERShfU2V0X01MTUVfRVZUKTsKLQlwY21kX29iai0+Y21kc3ogPSBjbWRzejsKLQlwY21kX29iai0+cGFybWJ1ZiA9IHBldnRjbWQ7Ci0KLQlwY21kX29iai0+cnNwID0gTlVMTDsKLQlwY21kX29iai0+cnNwc3ogID0gMDsKLQotCXBjMmhfZXZ0X2hkciA9IChzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyICopKHBldnRjbWQpOwotCXBjMmhfZXZ0X2hkci0+bGVuID0gc2l6ZW9mKHN0cnVjdCBzdXJ2ZXlkb25lX2V2ZW50KTsKLQlwYzJoX2V2dF9oZHItPklEID0gR0VOX0VWVF9DT0RFKF9TdXJ2ZXlEb25lKTsKLQlwYzJoX2V2dF9oZHItPnNlcSA9IGF0b21pY19pbmNfcmV0dXJuKCZwbWxtZWV4dC0+ZXZlbnRfc2VxKTsKLQotCXBzdXJ2ZXlkb25lX2V2dCA9IChzdHJ1Y3Qgc3VydmV5ZG9uZV9ldmVudCopKHBldnRjbWQgKyBzaXplb2Yoc3RydWN0IEMySEV2ZW50X0hlYWRlcikpOwotCXBzdXJ2ZXlkb25lX2V2dC0+YnNzX2NudCA9IHBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5ic3NfY250OwotCi0JREJHXzg3MjNBKCJzdXJ2ZXkgZG9uZSBldmVudCgleClcbiIsIHBzdXJ2ZXlkb25lX2V2dC0+YnNzX2NudCk7Ci0KLQlydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBjbWRfb2JqKTsKLX0KLQotdm9pZCByZXBvcnRfam9pbl9yZXMyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgaW50IHJlcykKLXsKLQlzdHJ1Y3QgY21kX29iaiAqcGNtZF9vYmo7Ci0JdTggKnBldnRjbWQ7Ci0JdTMyIGNtZHN6OwotCXN0cnVjdCBqb2luYnNzX2V2ZW50CQkqcGpvaW5ic3NfZXZ0OwotCXN0cnVjdCBDMkhFdmVudF9IZWFkZXIJKnBjMmhfZXZ0X2hkcjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkJKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwotCi0JcGNtZF9vYmogPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaiksIEdGUF9BVE9NSUMpOwotCWlmICghcGNtZF9vYmopCi0JCXJldHVybjsKLQotCWNtZHN6ID0gc2l6ZW9mKHN0cnVjdCBqb2luYnNzX2V2ZW50KSArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKTsKLQlwZXZ0Y21kID0ga3phbGxvYyhjbWRzeiwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwZXZ0Y21kKSB7Ci0JCWtmcmVlKHBjbWRfb2JqKTsKLQkJcmV0dXJuOwotCX0KLQotCXBjbWRfb2JqLT5jbWRjb2RlID0gR0VOX0NNRF9DT0RFKF9TZXRfTUxNRV9FVlQpOwotCXBjbWRfb2JqLT5jbWRzeiA9IGNtZHN6OwotCXBjbWRfb2JqLT5wYXJtYnVmID0gcGV2dGNtZDsKLQotCXBjbWRfb2JqLT5yc3AgPSBOVUxMOwotCXBjbWRfb2JqLT5yc3BzeiAgPSAwOwotCi0JcGMyaF9ldnRfaGRyID0gKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIgKikocGV2dGNtZCk7Ci0JcGMyaF9ldnRfaGRyLT5sZW4gPSBzaXplb2Yoc3RydWN0IGpvaW5ic3NfZXZlbnQpOwotCXBjMmhfZXZ0X2hkci0+SUQgPSBHRU5fRVZUX0NPREUoX0pvaW5Cc3MpOwotCXBjMmhfZXZ0X2hkci0+c2VxID0gYXRvbWljX2luY19yZXR1cm4oJnBtbG1lZXh0LT5ldmVudF9zZXEpOwotCi0JcGpvaW5ic3NfZXZ0ID0gKHN0cnVjdCBqb2luYnNzX2V2ZW50KikocGV2dGNtZCArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKSk7Ci0JbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopJnBqb2luYnNzX2V2dC0+bmV0d29yay5uZXR3b3JrLAotCSAgICAgICAmcG1sbWVpbmZvLT5uZXR3b3JrLCBzaXplb2Yoc3RydWN0IHdsYW5fYnNzaWRfZXgpKTsKLQlwam9pbmJzc19ldnQtPm5ldHdvcmsuam9pbl9yZXMgPSByZXM7Ci0KLQlEQkdfODcyM0EoInJlcG9ydF9qb2luX3JlczIzYSglZClcbiIsIHJlcyk7Ci0KLQlydHdfam9pbmJzc19ldmVudF9wcmVoYW5kbGUyM2EocGFkYXB0ZXIsICh1OCAqKSZwam9pbmJzc19ldnQtPm5ldHdvcmspOwotCi0JcnR3X2VucXVldWVfY21kMjNhKHBjbWRwcml2LCBwY21kX29iaik7Ci19Ci0KLXZvaWQgcmVwb3J0X2RlbF9zdGFfZXZlbnQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgdW5zaWduZWQgY2hhciAqTWFjQWRkciwgdW5zaWduZWQgc2hvcnQgcmVhc29uKQotewotCXN0cnVjdCBjbWRfb2JqICpwY21kX29iajsKLQl1OCAqcGV2dGNtZDsKLQl1MzIgY21kc3o7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCWludCBtYWNfaWQ7Ci0Jc3RydWN0IHN0YWRlbF9ldmVudCAqcGRlbF9zdGFfZXZ0OwotCXN0cnVjdCBDMkhFdmVudF9IZWFkZXIgKnBjMmhfZXZ0X2hkcjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7Ci0KLQlwY21kX29iaiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwY21kX29iaikKLQkJcmV0dXJuOwotCi0JY21kc3ogPSBzaXplb2Yoc3RydWN0IHN0YWRlbF9ldmVudCkgKyBzaXplb2Yoc3RydWN0IEMySEV2ZW50X0hlYWRlcik7Ci0JcGV2dGNtZCA9IGt6YWxsb2MoY21kc3osIEdGUF9BVE9NSUMpOwotCWlmICghcGV2dGNtZCkgewotCQlrZnJlZShwY21kX29iaik7Ci0JCXJldHVybjsKLQl9Ci0KLQlwY21kX29iai0+Y21kY29kZSA9IEdFTl9DTURfQ09ERShfU2V0X01MTUVfRVZUKTsKLQlwY21kX29iai0+Y21kc3ogPSBjbWRzejsKLQlwY21kX29iai0+cGFybWJ1ZiA9IHBldnRjbWQ7Ci0KLQlwY21kX29iai0+cnNwID0gTlVMTDsKLQlwY21kX29iai0+cnNwc3ogID0gMDsKLQotCXBjMmhfZXZ0X2hkciA9IChzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyICopKHBldnRjbWQpOwotCXBjMmhfZXZ0X2hkci0+bGVuID0gc2l6ZW9mKHN0cnVjdCBzdGFkZWxfZXZlbnQpOwotCXBjMmhfZXZ0X2hkci0+SUQgPSBHRU5fRVZUX0NPREUoX0RlbFNUQSk7Ci0JcGMyaF9ldnRfaGRyLT5zZXEgPSBhdG9taWNfaW5jX3JldHVybigmcG1sbWVleHQtPmV2ZW50X3NlcSk7Ci0KLQlwZGVsX3N0YV9ldnQgPSAoc3RydWN0IHN0YWRlbF9ldmVudCopKHBldnRjbWQgKyBzaXplb2Yoc3RydWN0IEMySEV2ZW50X0hlYWRlcikpOwotCWV0aGVyX2FkZHJfY29weSgodW5zaWduZWQgY2hhciAqKSZwZGVsX3N0YV9ldnQtPm1hY2FkZHIsIE1hY0FkZHIpOwotCW1lbWNweSgodW5zaWduZWQgY2hhciAqKXBkZWxfc3RhX2V2dC0+cnN2ZCwgKHVuc2lnbmVkIGNoYXIgKikmcmVhc29uLAotCSAgICAgICAyKTsKLQotCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EoJnBhZGFwdGVyLT5zdGFwcml2LCBNYWNBZGRyKTsKLQlpZiAocHN0YSkKLQkJbWFjX2lkID0gKGludClwc3RhLT5tYWNfaWQ7Ci0JZWxzZQotCQltYWNfaWQgPSAtMTsKLQotCXBkZWxfc3RhX2V2dC0+bWFjX2lkID0gbWFjX2lkOwotCi0JREJHXzg3MjNBKCJyZXBvcnRfZGVsX3N0YV9ldmVudDIzYTogZGVsZXRlIFNUQSwgbWFjX2lkID0lZFxuIiwgbWFjX2lkKTsKLQotCXJ0d19lbnF1ZXVlX2NtZDIzYShwY21kcHJpdiwgcGNtZF9vYmopOwotfQotCi12b2lkIHJlcG9ydF9hZGRfc3RhX2V2ZW50MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgIHVuc2lnbmVkIGNoYXIgKk1hY0FkZHIsIGludCBjYW1faWR4KQotewotCXN0cnVjdCBjbWRfb2JqICpwY21kX29iajsKLQl1OCAqcGV2dGNtZDsKLQl1MzIgY21kc3o7Ci0Jc3RydWN0IHN0YXNzb2NfZXZlbnQgKnBhZGRfc3RhX2V2dDsKLQlzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyICpwYzJoX2V2dF9oZHI7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwotCi0JcGNtZF9vYmogPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaiksIEdGUF9BVE9NSUMpOwotCWlmICghcGNtZF9vYmopCi0JCXJldHVybjsKLQotCWNtZHN6ID0gc2l6ZW9mKHN0cnVjdCBzdGFzc29jX2V2ZW50KSArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKTsKLQlwZXZ0Y21kID0ga3phbGxvYyhjbWRzeiwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwZXZ0Y21kKSB7Ci0JCWtmcmVlKHBjbWRfb2JqKTsKLQkJcmV0dXJuOwotCX0KLQotCXBjbWRfb2JqLT5jbWRjb2RlID0gR0VOX0NNRF9DT0RFKF9TZXRfTUxNRV9FVlQpOwotCXBjbWRfb2JqLT5jbWRzeiA9IGNtZHN6OwotCXBjbWRfb2JqLT5wYXJtYnVmID0gcGV2dGNtZDsKLQotCXBjbWRfb2JqLT5yc3AgPSBOVUxMOwotCXBjbWRfb2JqLT5yc3BzeiAgPSAwOwotCi0JcGMyaF9ldnRfaGRyID0gKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIgKikocGV2dGNtZCk7Ci0JcGMyaF9ldnRfaGRyLT5sZW4gPSBzaXplb2Yoc3RydWN0IHN0YXNzb2NfZXZlbnQpOwotCXBjMmhfZXZ0X2hkci0+SUQgPSBHRU5fRVZUX0NPREUoX0FkZFNUQSk7Ci0JcGMyaF9ldnRfaGRyLT5zZXEgPSBhdG9taWNfaW5jX3JldHVybigmcG1sbWVleHQtPmV2ZW50X3NlcSk7Ci0KLQlwYWRkX3N0YV9ldnQgPSAoc3RydWN0IHN0YXNzb2NfZXZlbnQqKShwZXZ0Y21kICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpKTsKLQlldGhlcl9hZGRyX2NvcHkoKHVuc2lnbmVkIGNoYXIgKikmcGFkZF9zdGFfZXZ0LT5tYWNhZGRyLCBNYWNBZGRyKTsKLQlwYWRkX3N0YV9ldnQtPmNhbV9pZCA9IGNhbV9pZHg7Ci0KLQlEQkdfODcyM0EoInJlcG9ydF9hZGRfc3RhX2V2ZW50MjNhOiBhZGQgU1RBXG4iKTsKLQotCXJ0d19lbnF1ZXVlX2NtZDIzYShwY21kcHJpdiwgcGNtZF9vYmopOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1Gb2xsb3dpbmcgYXJlIHRoZSBldmVudCBjYWxsYmFjayBmdW5jdGlvbnMKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIGZvciBzdGEvYWRob2MgbW9kZSAqLwotdm9pZCB1cGRhdGVfc3RhX2luZm8yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCS8qIEVSUCAqLwotCVZDU191cGRhdGUyM2EocGFkYXB0ZXIsIHBzdGEpOwotCi0JLyogSFQgKi8KLQlpZiAocG1sbWVwcml2LT5odHByaXYuaHRfb3B0aW9uKSB7Ci0JCXBzdGEtPmh0cHJpdi5odF9vcHRpb24gPSB0cnVlOwotCi0JCXBzdGEtPmh0cHJpdi5hbXBkdV9lbmFibGUgPSBwbWxtZXByaXYtPmh0cHJpdi5hbXBkdV9lbmFibGU7Ci0KLQkJaWYgKHN1cHBvcnRfc2hvcnRfR0kyM2EocGFkYXB0ZXIsICZwbWxtZWluZm8tPmh0X2NhcCkpCi0JCQlwc3RhLT5odHByaXYuc2dpID0gdHJ1ZTsKLQotCQlwc3RhLT5xb3Nfb3B0aW9uID0gdHJ1ZTsKLQotCX0gZWxzZSB7Ci0JCXBzdGEtPmh0cHJpdi5odF9vcHRpb24gPSBmYWxzZTsKLQotCQlwc3RhLT5odHByaXYuYW1wZHVfZW5hYmxlID0gZmFsc2U7Ci0KLQkJcHN0YS0+aHRwcml2LnNnaSA9IGZhbHNlOwotCQlwc3RhLT5xb3Nfb3B0aW9uID0gZmFsc2U7Ci0KLQl9Ci0JcHN0YS0+aHRwcml2LmJ3bW9kZSA9IHBtbG1lZXh0LT5jdXJfYndtb2RlOwotCXBzdGEtPmh0cHJpdi5jaF9vZmZzZXQgPSBwbWxtZWV4dC0+Y3VyX2NoX29mZnNldDsKLQotCXBzdGEtPmh0cHJpdi5hZ2dfZW5hYmxlX2JpdG1hcCA9IDB4MDsvKiByZXNldCAqLwotCXBzdGEtPmh0cHJpdi5jYW5kaWRhdGVfdGlkX2JpdG1hcCA9IDB4MDsvKiByZXNldCAqLwotCi0JLyogUW9TICovCi0JaWYgKHBtbG1lcHJpdi0+cW9zX29wdGlvbikKLQkJcHN0YS0+cW9zX29wdGlvbiA9IHRydWU7Ci0KLQlwc3RhLT5zdGF0ZSA9IF9GV19MSU5LRUQ7Ci19Ci0KLXZvaWQgbWxtZWV4dF9qb2luYnNzX2V2ZW50X2NhbGxiYWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgICAgIGludCBqb2luX3JlcykKLXsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEsICpwc3RhX2JtYzsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpjdXJfbmV0d29yayA9ICZwbWxtZWluZm8tPm5ldHdvcms7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQotCWlmIChqb2luX3JlcyA8IDApIHsKLQkJaHdfdmFyX3NldF9tbG1lX2pvaW4ocGFkYXB0ZXIsIDEpOwotCQlod192YXJfc2V0X2Jzc2lkKHBhZGFwdGVyLCBudWxsX2FkZHIpOwotCi0JCS8qIHJlc3RvcmUgdG8gaW5pdGlhbCBzZXR0aW5nLiAqLwotCQl1cGRhdGVfdHhfYmFzaWNfcmF0ZTIzYShwYWRhcHRlciwKLQkJCQkJcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi53aXJlbGVzc19tb2RlKTsKLQotCQlnb3RvIGV4aXRfbWxtZWV4dF9qb2luYnNzX2V2ZW50X2NhbGxiYWNrMjNhOwotCX0KLQotCWlmICgocG1sbWVpbmZvLT5zdGF0ZSYweDAzKSA9PSBNU1JfQURIT0MpIHsKLQkJLyogZm9yIGJjL21jICovCi0JCXBzdGFfYm1jID0gcnR3X2dldF9iY21jX3N0YWluZm8yM2EocGFkYXB0ZXIpOwotCQlpZiAocHN0YV9ibWMpIHsKLQkJCXBtbG1laW5mby0+Rldfc3RhX2luZm9bcHN0YV9ibWMtPm1hY19pZF0ucHN0YSA9IHBzdGFfYm1jOwotCQkJdXBkYXRlX2JtY19zdGFfc3VwcG9ydF9yYXRlMjNhKHBhZGFwdGVyLCBwc3RhX2JtYy0+bWFjX2lkKTsKLQkJCVVwZGF0ZV9SQV9FbnRyeTIzYShwYWRhcHRlciwgcHN0YV9ibWMpOwotCQl9Ci0JfQotCi0JLyogdHVybiBvbiBkeW5hbWljIGZ1bmN0aW9ucyAqLwotCXJ0bDg3MjNhX29kbV9zdXBwb3J0X2FiaWxpdHlfc2V0KHBhZGFwdGVyLCBEWU5BTUlDX0FMTF9GVU5DX0VOQUJMRSk7Ci0KLQkvKiAgdXBkYXRlIElPVC1yZWxlYXRlZCBpc3N1ZSAqLwotCXVwZGF0ZV9JT1RfaW5mbzIzYShwYWRhcHRlcik7Ci0KLQlIYWxTZXRCcmF0ZUNmZzIzYShwYWRhcHRlciwgY3VyX25ldHdvcmstPlN1cHBvcnRlZFJhdGVzKTsKLQotCS8qIEJDTiBpbnRlcnZhbCAqLwotCXJ0bDg3MjNhX3NldF9iZWFjb25faW50ZXJ2YWwocGFkYXB0ZXIsIHBtbG1laW5mby0+YmNuX2ludGVydmFsKTsKLQotCS8qIHVwZGF0ZSBjYXBhYmlsaXR5ICovCi0JdXBkYXRlX2NhcGluZm8yM2EocGFkYXB0ZXIsIHBtbG1laW5mby0+Y2FwYWJpbGl0eSk7Ci0KLQkvKiBXTU0sIFVwZGF0ZSBFRENBIHBhcmFtICovCi0JV01NT25Bc3NvY1JzcDIzYShwYWRhcHRlcik7Ci0KLQkvKiBIVCAqLwotCUhUT25Bc3NvY1JzcDIzYShwYWRhcHRlcik7Ci0KLQkvKiBTZXQgY3VyX2NoYW5uZWwmY3VyX2J3bW9kZSZjdXJfY2hfb2Zmc2V0ICovCi0Jc2V0X2NoYW5uZWxfYndtb2RlMjNhKHBhZGFwdGVyLCBwbWxtZWV4dC0+Y3VyX2NoYW5uZWwsIHBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0LCBwbWxtZWV4dC0+Y3VyX2J3bW9kZSk7Ci0KLQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBjdXJfbmV0d29yay0+TWFjQWRkcmVzcyk7Ci0JaWYgKHBzdGEpIHsgLyogb25seSBmb3IgaW5mcmEuIG1vZGUgKi8KLQkJcG1sbWVpbmZvLT5GV19zdGFfaW5mb1twc3RhLT5tYWNfaWRdLnBzdGEgPSBwc3RhOwotCi0JCS8qIERCR184NzIzQSgic2V0X3N0YV9yYXRlMjNhXG4iKTsgKi8KLQotCQlwc3RhLT53aXJlbGVzc19tb2RlID0gcG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlOwotCi0JCS8qIHNldCBwZXIgc3RhIHJhdGUgYWZ0ZXIgdXBkYXRpbmcgSFQgY2FwLiAqLwotCQlzZXRfc3RhX3JhdGUyM2EocGFkYXB0ZXIsIHBzdGEpOwotCX0KLQotCWh3X3Zhcl9zZXRfbWxtZV9qb2luKHBhZGFwdGVyLCAyKTsKLQotCWlmICgocG1sbWVpbmZvLT5zdGF0ZSYweDAzKSA9PSBNU1JfSU5GUkEpIHsKLQkJLyogIGNvcnJlY3RpbmcgVFNGICovCi0JCXJ0d19jb3JyZWN0X1RTRihwYWRhcHRlcik7Ci0KLQkJLyogc2V0X2xpbmtfdGltZXIocG1sbWVleHQsIERJU0NPTk5FQ1RfVE8pOyAqLwotCX0KLQotCXJ0d19scHNfY3RybF93a19jbWQyM2EocGFkYXB0ZXIsIExQU19DVFJMX0NPTk5FQ1QsIDApOwotCi1leGl0X21sbWVleHRfam9pbmJzc19ldmVudF9jYWxsYmFjazIzYToKLQlEQkdfODcyM0EoIj0+JXNcbiIsIF9fZnVuY19fKTsKLX0KLQotdm9pZCBtbG1lZXh0X3N0YV9hZGRfZXZlbnRfY2FsbGJhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgICAgc3RydWN0IHN0YV9pbmZvICpwc3RhKQotewotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoKHBtbG1laW5mby0+c3RhdGUgJiAweDAzKSA9PSBNU1JfQURIT0MpIHsKLQkvKiBhZGhvYyBtYXN0ZXIgb3Igc3RhX2NvdW50PjEgKi8KLQkJaWYgKHBtbG1laW5mby0+c3RhdGUgJiBXSUZJX0ZXX0FTU09DX1NVQ0NFU1MpIHsKLQkJCS8qIG5vdGhpbmcgdG8gZG8gKi8KLQkJfSBlbHNlIHsgLyogYWRob2MgY2xpZW50ICovCi0JCQkvKiAgY29ycmVjdGluZyBUU0YgKi8KLQkJCXJ0d19jb3JyZWN0X1RTRihwYWRhcHRlcik7Ci0KLQkJCS8qIHN0YXJ0IGJlYWNvbiAqLwotCQkJaWYgKHNlbmRfYmVhY29uMjNhKHBhZGFwdGVyKSAhPSBfU1VDQ0VTUykgewotCQkJCXBtbG1laW5mby0+Rldfc3RhX2luZm9bcHN0YS0+bWFjX2lkXS5zdGF0dXMgPSAwOwotCi0JCQkJcG1sbWVpbmZvLT5zdGF0ZSBePSBNU1JfQURIT0M7Ci0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCXBtbG1laW5mby0+c3RhdGUgfD0gV0lGSV9GV19BU1NPQ19TVUNDRVNTOwotCQl9Ci0JCWh3X3Zhcl9zZXRfbWxtZV9qb2luKHBhZGFwdGVyLCAyKTsKLQl9Ci0KLQlwbWxtZWluZm8tPkZXX3N0YV9pbmZvW3BzdGEtPm1hY19pZF0ucHN0YSA9IHBzdGE7Ci0KLQkvKiByYXRlIHJhZGFwdGl2ZSAqLwotCVVwZGF0ZV9SQV9FbnRyeTIzYShwYWRhcHRlciwgcHN0YSk7Ci0KLQkvKiB1cGRhdGUgYWRob2Mgc3RhX2luZm8gKi8KLQl1cGRhdGVfc3RhX2luZm8yM2EocGFkYXB0ZXIsIHBzdGEpOwotfQotCi12b2lkIG1sbWVleHRfc3RhX2RlbF9ldmVudF9jYWxsYmFjazIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlpZiAoaXNfY2xpZW50X2Fzc29jaWF0ZWRfdG9fYXAyM2EocGFkYXB0ZXIpIHx8Ci0JICAgIGlzX0lCU1NfZW1wdHkyM2EocGFkYXB0ZXIpKSB7Ci0JCS8qIHNldF9vcG1vZGVfY21kKHBhZGFwdGVyLCBpbmZyYV9jbGllbnRfd2l0aF9tbG1lKTsgKi8KLQotCQlod192YXJfc2V0X21sbWVfZGlzY29ubmVjdChwYWRhcHRlcik7Ci0JCWh3X3Zhcl9zZXRfYnNzaWQocGFkYXB0ZXIsIG51bGxfYWRkcik7Ci0KLQkJLyogcmVzdG9yZSB0byBpbml0aWFsIHNldHRpbmcuICovCi0JCXVwZGF0ZV90eF9iYXNpY19yYXRlMjNhKHBhZGFwdGVyLAotCQkJCQlwYWRhcHRlci0+cmVnaXN0cnlwcml2LndpcmVsZXNzX21vZGUpOwotCi0JCS8qIHN3aXRjaCB0byB0aGUgMjBNIEh6IG1vZGUgYWZ0ZXIgZGlzY29ubmVjdCAqLwotCQlwbWxtZWV4dC0+Y3VyX2J3bW9kZSA9IEhUX0NIQU5ORUxfV0lEVEhfMjA7Ci0JCXBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0ID0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRTsKLQotCQlzZXRfY2hhbm5lbF9id21vZGUyM2EocGFkYXB0ZXIsIHBtbG1lZXh0LT5jdXJfY2hhbm5lbCwKLQkJCQkgICAgICBwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCwKLQkJCQkgICAgICBwbWxtZWV4dC0+Y3VyX2J3bW9kZSk7Ci0KLQkJZmx1c2hfYWxsX2NhbV9lbnRyeTIzYShwYWRhcHRlcik7Ci0KLQkJcG1sbWVpbmZvLT5zdGF0ZSA9IE1TUl9OT0xJTks7Ci0KLQkJLyogc2V0IE1TUiB0byBubyBsaW5rIHN0YXRlIC0+IGluZnJhLiBtb2RlICovCi0JCXJ0bDg3MjNhX3NldF9tZWRpYV9zdGF0dXMocGFkYXB0ZXIsIE1TUl9JTkZSQSk7Ci0KLQkJZGVsX3RpbWVyX3N5bmMoJnBtbG1lZXh0LT5saW5rX3RpbWVyKTsKLQl9Ci19Ci0KLXN0YXRpYyB1OCBjaGtfYXBfaXNfYWxpdmUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKQotewotCXU4IHJldCA9IGZhbHNlOwotCi0JaWYgKHN0YV9yeF9kYXRhX3BrdHMocHN0YSkgPT0gc3RhX2xhc3RfcnhfZGF0YV9wa3RzKHBzdGEpICYmCi0JICAgIHN0YV9yeF9iZWFjb25fcGt0cyhwc3RhKSA9PSBzdGFfbGFzdF9yeF9iZWFjb25fcGt0cyhwc3RhKSAmJgotCSAgICBzdGFfcnhfcHJvYmVyc3BfcGt0cyhwc3RhKSA9PSBzdGFfbGFzdF9yeF9wcm9iZXJzcF9wa3RzKHBzdGEpKQotCQlyZXQgPSBmYWxzZTsKLQllbHNlCi0JCXJldCA9IHRydWU7Ci0KLQlzdGFfdXBkYXRlX2xhc3RfcnhfcGt0cyhwc3RhKTsKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIGxpbmtlZF9zdGF0dXNfY2hrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTMyIGk7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCi0JaWYgKGlzX2NsaWVudF9hc3NvY2lhdGVkX3RvX2FwMjNhKHBhZGFwdGVyKSkgewotCQkvKiBsaW5rZWQgaW5mcmFzdHJ1Y3R1cmUgY2xpZW50IG1vZGUgKi8KLQotCQlpbnQgdHhfY2hrID0gX1NVQ0NFU1MsIHJ4X2NoayA9IF9TVUNDRVNTOwotCQlpbnQgcnhfY2hrX2xpbWl0OwotCi0JCXJ4X2Noa19saW1pdCA9IDQ7Ci0KLQkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwKLQkJCQkJICBwbWxtZWluZm8tPm5ldHdvcmsuTWFjQWRkcmVzcyk7Ci0JCWlmIChwc3RhKSB7Ci0JCQlib29sIGlzX3AycF9lbmFibGUgPSBmYWxzZTsKLQotCQkJaWYgKGNoa19hcF9pc19hbGl2ZShwYWRhcHRlciwgcHN0YSkgPT0gZmFsc2UpCi0JCQkJcnhfY2hrID0gX0ZBSUw7Ci0KLQkJCWlmIChweG1pdHByaXYtPmxhc3RfdHhfcGt0cyA9PSBweG1pdHByaXYtPnR4X3BrdHMpCi0JCQkJdHhfY2hrID0gX0ZBSUw7Ci0KLQkJCWlmIChwbWxtZWV4dC0+YWN0aXZlX2tlZXBfYWxpdmVfY2hlY2sgJiYKLQkJCSAgICAocnhfY2hrID09IF9GQUlMIHx8IHR4X2NoayA9PSBfRkFJTCkpIHsKLQkJCQl1OCBiYWNrdXBfb3Blcl9jaGFubmVsID0gMDsKLQotCQkJCS8qIHN3aXRjaCB0byBjb3JyZWN0IGNoYW5uZWwgb2YgY3VycmVudAotCQkJCSAgIG5ldHdvcmsgIGJlZm9yZSBpc3N1ZSBrZWVwLWFsaXZlIGZyYW1lcyAqLwotCQkJCWlmIChydHdfZ2V0X29wZXJfY2gyM2EocGFkYXB0ZXIpICE9Ci0JCQkJICAgIHBtbG1lZXh0LT5jdXJfY2hhbm5lbCkgewotCQkJCQliYWNrdXBfb3Blcl9jaGFubmVsID0KLQkJCQkJCXJ0d19nZXRfb3Blcl9jaDIzYShwYWRhcHRlcik7Ci0JCQkJCVNlbGVjdENoYW5uZWwyM2EocGFkYXB0ZXIsCi0JCQkJCQkJIHBtbG1lZXh0LT5jdXJfY2hhbm5lbCk7Ci0JCQkJfQotCi0JCQkJaWYgKHJ4X2NoayAhPSBfU1VDQ0VTUykKLQkJCQkJaXNzdWVfcHJvYmVyZXFfZXgocGFkYXB0ZXIsICZwbWxtZWluZm8tPm5ldHdvcmsuU3NpZCwgcHN0YS0+aHdhZGRyLCAzLCAxKTsKLQotCQkJCWlmICgodHhfY2hrICE9IF9TVUNDRVNTICYmCi0JCQkJICAgICBwbWxtZWluZm8tPmxpbmtfY291bnQrKyA9PSAweGYpIHx8Ci0JCQkJICAgIHJ4X2NoayAhPSBfU1VDQ0VTUykgewotCQkJCQl0eF9jaGsgPSBpc3N1ZV9udWxsZGF0YTIzYShwYWRhcHRlciwKLQkJCQkJCQkJICAgcHN0YS0+aHdhZGRyLAotCQkJCQkJCQkgICAwLCAzLCAxKTsKLQkJCQkJLyogaWYgdHggYWNrZWQgYW5kIHAycCBkaXNhYmxlZCwKLQkJCQkJICAgc2V0IHJ4X2NoayBfU1VDQ0VTUyB0byByZXNldCByZXRyeQotCQkJCQkgICBjb3VudCAqLwotCQkJCQlpZiAodHhfY2hrID09IF9TVUNDRVNTICYmCi0JCQkJCSAgICAhaXNfcDJwX2VuYWJsZSkKLQkJCQkJCXJ4X2NoayA9IF9TVUNDRVNTOwotCQkJCX0KLQotCQkJCS8qIGJhY2sgdG8gdGhlIG9yaWdpbmFsIG9wZXJhdGlvbiBjaGFubmVsICovCi0JCQkJaWYgKGJhY2t1cF9vcGVyX2NoYW5uZWw+MCkKLQkJCQkJU2VsZWN0Q2hhbm5lbDIzYShwYWRhcHRlciwKLQkJCQkJCQkgYmFja3VwX29wZXJfY2hhbm5lbCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChyeF9jaGsgIT0gX1NVQ0NFU1MpIHsKLQkJCQkJaWYgKHBtbG1lZXh0LT5yZXRyeSA9PSAwKSB7Ci0JCQkJCQlpc3N1ZV9wcm9iZXJlcShwYWRhcHRlciwgJnBtbG1laW5mby0+bmV0d29yay5Tc2lkLCBwbWxtZWluZm8tPm5ldHdvcmsuTWFjQWRkcmVzcyk7Ci0JCQkJCQlpc3N1ZV9wcm9iZXJlcShwYWRhcHRlciwgJnBtbG1laW5mby0+bmV0d29yay5Tc2lkLCBwbWxtZWluZm8tPm5ldHdvcmsuTWFjQWRkcmVzcyk7Ci0JCQkJCQlpc3N1ZV9wcm9iZXJlcShwYWRhcHRlciwgJnBtbG1laW5mby0+bmV0d29yay5Tc2lkLCBwbWxtZWluZm8tPm5ldHdvcmsuTWFjQWRkcmVzcyk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAodHhfY2hrICE9IF9TVUNDRVNTICYmCi0JCQkJICAgIHBtbG1laW5mby0+bGlua19jb3VudCsrID09IDB4ZikKLQkJCQkJdHhfY2hrID0gaXNzdWVfbnVsbGRhdGEyM2EocGFkYXB0ZXIsCi0JCQkJCQkJCSAgIE5VTEwsIDAsIDEsCi0JCQkJCQkJCSAgIDApOwotCQkJfQotCi0JCQlpZiAocnhfY2hrID09IF9GQUlMKSB7Ci0JCQkJcG1sbWVleHQtPnJldHJ5Kys7Ci0JCQkJaWYgKHBtbG1lZXh0LT5yZXRyeSA+IHJ4X2Noa19saW1pdCkgewotCQkJCQlEQkdfODcyM0FfTEVWRUwoX2Rydl9hbHdheXNfLAotCQkJCQkJCSIlcyglcyk6IGRpc2Nvbm5lY3Qgb3IgIgotCQkJCQkJCSJyb2FtaW5nXG4iLCBfX2Z1bmNfXywKLQkJCQkJCQlwYWRhcHRlci0+cG5ldGRldi0+bmFtZSk7Ci0JCQkJCXJlY2VpdmVfZGlzY29ubmVjdDIzYShwYWRhcHRlciwgcG1sbWVpbmZvLT5uZXR3b3JrLk1hY0FkZHJlc3MsCi0JCQkJCQlXTEFOX1JFQVNPTl9FWFBJUkFUSU9OX0NISyk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQlwbWxtZWV4dC0+cmV0cnkgPSAwOwotCi0JCQlpZiAodHhfY2hrID09IF9GQUlMKQotCQkJCXBtbG1laW5mby0+bGlua19jb3VudCAmPSAweGY7Ci0JCQllbHNlIHsKLQkJCQlweG1pdHByaXYtPmxhc3RfdHhfcGt0cyA9IHB4bWl0cHJpdi0+dHhfcGt0czsKLQkJCQlwbWxtZWluZm8tPmxpbmtfY291bnQgPSAwOwotCQkJfQotCi0JCX0KLQl9IGVsc2UgaWYgKGlzX2NsaWVudF9hc3NvY2lhdGVkX3RvX2lic3MyM2EocGFkYXB0ZXIpKSB7Ci0JCS8qIGxpbmtlZCBJQlNTIG1vZGUgKi8KLQkJLyogZm9yIGVhY2ggYXNzb2MgbGlzdCBlbnRyeSB0byBjaGVjayB0aGUgcnggcGt0IGNvdW50ZXIgKi8KLQkJZm9yIChpID0gSUJTU19TVEFSVF9NQUNfSUQ7IGkgPCBOVU1fU1RBOyBpKyspIHsKLQkJCWlmIChwbWxtZWluZm8tPkZXX3N0YV9pbmZvW2ldLnN0YXR1cyA9PSAxKSB7Ci0JCQkJcHN0YSA9IHBtbG1laW5mby0+Rldfc3RhX2luZm9baV0ucHN0YTsKLQotCQkJCWlmICghcHN0YSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlpZiAocG1sbWVpbmZvLT5GV19zdGFfaW5mb1tpXS5yeF9wa3QgPT0KLQkJCQkgICAgc3RhX3J4X3BrdHMocHN0YSkpIHsKLQotCQkJCQlpZiAocG1sbWVpbmZvLT5GV19zdGFfaW5mb1tpXS5yZXRyeTwzKSB7Ci0JCQkJCQlwbWxtZWluZm8tPkZXX3N0YV9pbmZvW2ldLnJldHJ5Kys7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwbWxtZWluZm8tPkZXX3N0YV9pbmZvW2ldLnJldHJ5ID0gMDsKLQkJCQkJCXBtbG1laW5mby0+Rldfc3RhX2luZm9baV0uc3RhdHVzID0gMDsKLQkJCQkJCXJlcG9ydF9kZWxfc3RhX2V2ZW50MjNhKHBhZGFwdGVyLCBwc3RhLT5od2FkZHIsCi0JCQkJCQkJNjU1MzUvKiAgaW5kaWNhdGUgZGlzY29ubmVjdCBjYXVzZWQgYnkgbm8gcnggKi8KLQkJCQkJCSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlwbWxtZWluZm8tPkZXX3N0YV9pbmZvW2ldLnJldHJ5ID0gMDsKLQkJCQkJcG1sbWVpbmZvLT5GV19zdGFfaW5mb1tpXS5yeF9wa3QgPSAodTMyKXN0YV9yeF9wa3RzKHBzdGEpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvKiBzZXRfbGlua190aW1lcihwbWxtZWV4dCwgRElTQ09OTkVDVF9UTyk7ICovCi0JfQotfQotCi1zdGF0aWMgdm9pZCBzdXJ2ZXlfdGltZXJfaGRsKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBydHdfYWRhcHRlciAqKWRhdGE7Ci0Jc3RydWN0IGNtZF9vYmogKnBoMmM7Ci0Jc3RydWN0IHNpdGVzdXJ2ZXlfcGFybSAqcHN1cnZleVBhcmE7Ci0Jc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCi0JLyogaXNzdWUgcnR3X3NpdGVzdXJ2ZXlfY21kMjNhICovCi0JaWYgKHBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5zdGF0ZSA+IFNDQU5fU1RBUlQpIHsKLQkJaWYgKHBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5zdGF0ZSA9PSAgU0NBTl9QUk9DRVNTKQotCQkJcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLmNoYW5uZWxfaWR4Kys7Ci0KLQkJaWYgKHBtbG1lZXh0LT5zY2FuX2Fib3J0ID09IHRydWUpIHsKLQkJCXBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5jaGFubmVsX2lkeCA9Ci0JCQkJcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLmNoX251bTsKLQkJCURCR184NzIzQSgiJXMgaWR4OiVkXG4iLCBfX2Z1bmNfXywKLQkJCQkgIHBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5jaGFubmVsX2lkeCk7Ci0KLQkJCXBtbG1lZXh0LT5zY2FuX2Fib3J0ID0gZmFsc2U7LyogcmVzZXQgKi8KLQkJfQotCi0JCXBoMmMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaiksIEdGUF9BVE9NSUMpOwotCQlpZiAoIXBoMmMpCi0JCQlnb3RvIGV4aXRfc3VydmV5X3RpbWVyX2hkbDsKLQotCQlwc3VydmV5UGFyYSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzaXRlc3VydmV5X3Bhcm0pLAotCQkJCQlHRlBfQVRPTUlDKTsKLQkJaWYgKCFwc3VydmV5UGFyYSkgewotCQkJa2ZyZWUocGgyYyk7Ci0JCQlnb3RvIGV4aXRfc3VydmV5X3RpbWVyX2hkbDsKLQkJfQotCi0JCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHBzdXJ2ZXlQYXJhLAotCQkJCQkgICBHRU5fQ01EX0NPREUoX1NpdGVTdXJ2ZXkpKTsKLQkJcnR3X2VucXVldWVfY21kMjNhKHBjbWRwcml2LCBwaDJjKTsKLQl9Ci0KLWV4aXRfc3VydmV5X3RpbWVyX2hkbDoKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIGxpbmtfdGltZXJfaGRsKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBydHdfYWRhcHRlciAqKWRhdGE7Ci0JLyogc3RhdGljIHVuc2lnbmVkIGludAkJcnhfcGt0ID0gMDsgKi8KLQkvKiBzdGF0aWMgdTY0CQkJCXR4X2NudCA9IDA7ICovCi0JLyogc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsgKi8KLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCS8qIHN0cnVjdCBzdGFfcHJpdgkJKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OyAqLwotCi0JaWYgKHBtbG1laW5mby0+c3RhdGUgJiBXSUZJX0ZXX0FVVEhfTlVMTCkgewotCQlEQkdfODcyM0EoImxpbmtfdGltZXJfaGRsOm5vIGJlYWNvbiB3aGlsZSBjb25uZWN0aW5nXG4iKTsKLQkJcG1sbWVpbmZvLT5zdGF0ZSA9IE1TUl9OT0xJTks7Ci0JCXJlcG9ydF9qb2luX3JlczIzYShwYWRhcHRlciwgLTMpOwotCX0gZWxzZSBpZiAocG1sbWVpbmZvLT5zdGF0ZSAmIFdJRklfRldfQVVUSF9TVEFURSkgewotCQkvKiByZS1hdXRoIHRpbWVyICovCi0JCWlmICgrK3BtbG1laW5mby0+cmVhdXRoX2NvdW50ID4gUkVBVVRIX0xJTUlUKSB7Ci0JCQkvKiBpZiAocG1sbWVpbmZvLT5hdXRoX2FsZ28gIT0gZG90MTFBdXRoQWxncnRobV9BdXRvKSAqLwotCQkJLyogICovCi0JCQkJcG1sbWVpbmZvLT5zdGF0ZSA9IDA7Ci0JCQkJcmVwb3J0X2pvaW5fcmVzMjNhKHBhZGFwdGVyLCAtMSk7Ci0JCQkJcmV0dXJuOwotCQkJLyogICovCi0JCQkvKiBlbHNlICovCi0JCQkvKiAgKi8KLQkJCS8qIHBtbG1laW5mby0+YXV0aF9hbGdvID0gZG90MTFBdXRoQWxncnRobV9TaGFyZWQ7ICovCi0JCQkvKiBwbWxtZWluZm8tPnJlYXV0aF9jb3VudCA9IDA7ICovCi0JCQkvKiAgKi8KLQkJfQotCi0JCURCR184NzIzQSgibGlua190aW1lcl9oZGw6IGF1dGggdGltZW91dCBhbmQgdHJ5IGFnYWluXG4iKTsKLQkJcG1sbWVpbmZvLT5hdXRoX3NlcSA9IDE7Ci0JCWlzc3VlX2F1dGgocGFkYXB0ZXIsIE5VTEwsIDApOwotCQlzZXRfbGlua190aW1lcihwbWxtZWV4dCwgUkVBVVRIX1RPKTsKLQl9IGVsc2UgaWYgKHBtbG1laW5mby0+c3RhdGUgJiBXSUZJX0ZXX0FTU09DX1NUQVRFKSB7Ci0JCS8qIHJlLWFzc29jIHRpbWVyICovCi0JCWlmICgrK3BtbG1laW5mby0+cmVhc3NvY19jb3VudCA+IFJFQVNTT0NfTElNSVQpIHsKLQkJCXBtbG1laW5mby0+c3RhdGUgPSBNU1JfTk9MSU5LOwotCQkJcmVwb3J0X2pvaW5fcmVzMjNhKHBhZGFwdGVyLCAtMik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlEQkdfODcyM0EoImxpbmtfdGltZXJfaGRsOiBhc3NvYyB0aW1lb3V0IGFuZCB0cnkgYWdhaW5cbiIpOwotCQlpc3N1ZV9hc3NvY3JlcShwYWRhcHRlcik7Ci0JCXNldF9saW5rX3RpbWVyKHBtbG1lZXh0LCBSRUFTU09DX1RPKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGFkZGJhX3RpbWVyX2hkbCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhID0gKHN0cnVjdCBzdGFfaW5mbyAqKWRhdGE7Ci0Jc3RydWN0IGh0X3ByaXYgKnBodHByaXY7Ci0KLQlpZiAoIXBzdGEpCi0JCXJldHVybjsKLQotCXBodHByaXYgPSAmcHN0YS0+aHRwcml2OwotCi0JaWYgKHBodHByaXYtPmh0X29wdGlvbiAmJiBwaHRwcml2LT5hbXBkdV9lbmFibGUpIHsKLQkJaWYgKHBodHByaXYtPmNhbmRpZGF0ZV90aWRfYml0bWFwKQotCQkJcGh0cHJpdi0+Y2FuZGlkYXRlX3RpZF9iaXRtYXAgPSAweDA7Ci0JfQotfQotCi12b2lkIGluaXRfYWRkYmFfcmV0cnlfdGltZXIyM2Eoc3RydWN0IHN0YV9pbmZvICpwc3RhKQotewotCXNldHVwX3RpbWVyKCZwc3RhLT5hZGRiYV9yZXRyeV90aW1lciwgYWRkYmFfdGltZXJfaGRsLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpcHN0YSk7Ci19Ci0KLXZvaWQgaW5pdF9tbG1lX2V4dF90aW1lcjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0KLQlzZXR1cF90aW1lcigmcG1sbWVleHQtPnN1cnZleV90aW1lciwgc3VydmV5X3RpbWVyX2hkbCwKLQkJICAgICh1bnNpZ25lZCBsb25nKXBhZGFwdGVyKTsKLQotCXNldHVwX3RpbWVyKCZwbWxtZWV4dC0+bGlua190aW1lciwgbGlua190aW1lcl9oZGwsCi0JCSAgICAodW5zaWduZWQgbG9uZylwYWRhcHRlcik7Ci19Ci0KLWludCBOVUxMX2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLQlyZXR1cm4gSDJDX1NVQ0NFU1M7Ci19Ci0KLWludCBzZXRvcG1vZGVfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKQotewotCWVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZTsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCWNvbnN0IHN0cnVjdCBzZXRvcG1vZGVfcGFybSAqcHNldG9wID0gKHN0cnVjdCBzZXRvcG1vZGVfcGFybSAqKXBidWY7Ci0KLQlzd2l0Y2ggKHBzZXRvcC0+bW9kZSkgewotCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0dPOgotCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6Ci0JCXBtbG1laW5mby0+c3RhdGUgPSBNU1JfQVA7Ci0JCXR5cGUgPSBNU1JfQVA7Ci0JCWJyZWFrOwotCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVDoKLQljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046Ci0JCS8qICBjbGVhciBzdGF0ZSAqLwotCQlwbWxtZWluZm8tPnN0YXRlICY9IH4oQklUKDApfEJJVCgxKSk7Ci0JCS8qIHNldCB0byBTVEFUSU9OX1NUQVRFICovCi0JCXBtbG1laW5mby0+c3RhdGUgfD0gTVNSX0lORlJBOwotCQl0eXBlID0gTVNSX0lORlJBOwotCQlicmVhazsKLQljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgotCQl0eXBlID0gTVNSX0FESE9DOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQl0eXBlID0gTVNSX05PTElOSzsKLQkJYnJlYWs7Ci0JfQotCi0JaHdfdmFyX3NldF9vcG1vZGUocGFkYXB0ZXIsIHR5cGUpOwotCS8qIFNldF9ORVRZUEUwX01TUihwYWRhcHRlciwgdHlwZSk7ICovCi0KLQlyZXR1cm4gSDJDX1NVQ0NFU1M7Ci19Ci0KLWludCBjcmVhdGVic3NfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKQotewotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKnBuZXR3b3JrID0gJnBtbG1laW5mby0+bmV0d29yazsKLQljb25zdCBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcHBhcm0gPSAoc3RydWN0IHdsYW5fYnNzaWRfZXggKilwYnVmOwotCS8qIHUzMglpbml0aWFsZ2FpbjsgKi8KLQotCWlmIChwcGFybS0+aWZtb2RlID09IE5MODAyMTFfSUZUWVBFX0FQIHx8Ci0JICAgIHBwYXJtLT5pZm1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfUDJQX0dPKSB7Ci0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0JCWlmIChwbWxtZWluZm8tPnN0YXRlID09IE1TUl9BUCkgewotCQkJLyogdG9kbzogKi8KLQkJCXJldHVybiBIMkNfU1VDQ0VTUzsKLQkJfQotI2VuZGlmCi0JfQotCi0JLyogYmVsb3cgaXMgZm9yIGFkLWhvYyBtYXN0ZXIgKi8KLQlpZiAocHBhcm0tPmlmbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgewotCQlydHdfam9pbmJzc19yZXNldDIzYShwYWRhcHRlcik7Ci0KLQkJcG1sbWVleHQtPmN1cl9id21vZGUgPSBIVF9DSEFOTkVMX1dJRFRIXzIwOwotCQlwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCA9IEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkU7Ci0JCXBtbG1laW5mby0+RVJQX2VuYWJsZSA9IDA7Ci0JCXBtbG1laW5mby0+V01NX2VuYWJsZSA9IDA7Ci0JCXBtbG1laW5mby0+SFRfZW5hYmxlID0gMDsKLQkJcG1sbWVpbmZvLT5IVF9jYXBzX2VuYWJsZSA9IDA7Ci0JCXBtbG1laW5mby0+SFRfaW5mb19lbmFibGUgPSAwOwotCi0JCS8qIGRpc2FibGUgZHluYW1pYyBmdW5jdGlvbnMsIHN1Y2ggYXMgaGlnaCBwb3dlciwgRElHICovCi0JCXJ0bDg3MjNhX29kbV9zdXBwb3J0X2FiaWxpdHlfYmFja3VwKHBhZGFwdGVyKTsKLQotCQlydGw4NzIzYV9vZG1fc3VwcG9ydF9hYmlsaXR5X2NscihwYWRhcHRlciwKLQkJCQkJCSBEWU5BTUlDX0ZVTkNfRElTQUJMRSk7Ci0KLQkJLyogY2FuY2VsIGxpbmsgdGltZXIgKi8KLQkJZGVsX3RpbWVyX3N5bmMoJnBtbG1lZXh0LT5saW5rX3RpbWVyKTsKLQotCQkvKiBjbGVhciBDQU0gKi8KLQkJZmx1c2hfYWxsX2NhbV9lbnRyeTIzYShwYWRhcHRlcik7Ci0KLQkJaWYgKHBwYXJtLT5JRUxlbmd0aCA+IE1BWF9JRV9TWikvKiBDaGVjayBwYnVmLT5JRUxlbmd0aCAqLwotCQkJcmV0dXJuIEgyQ19QQVJBTUVURVJTX0VSUk9SOwotCi0JCW1lbWNweShwbmV0d29yaywgcHBhcm0sIHNpemVvZihzdHJ1Y3Qgd2xhbl9ic3NpZF9leCkpOwotCi0JCXN0YXJ0X2NyZWF0ZV9pYnNzKHBhZGFwdGVyKTsKLQl9Ci0KLQlyZXR1cm4gSDJDX1NVQ0NFU1M7Ci19Ci0KLWludCBqb2luX2NtZF9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmsgPSAmcG1sbWVpbmZvLT5uZXR3b3JrOwotCWNvbnN0IHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwcGFybSA9IChzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqKXBidWY7Ci0Jc3RydWN0IGllZWU4MDIxMV9odF9vcGVyYXRpb24gKnBodF9pbmZvOwotCXUzMiBpOwotCXU4ICpwOwotCS8qIHUzMglpbml0aWFsZ2FpbjsgKi8KLQkvKiB1MzIJYWNwYXJtOyAqLwotCi0JLyogY2hlY2sgYWxyZWFkeSBjb25uZWN0aW5nIHRvIEFQIG9yIG5vdCAqLwotCWlmIChwbWxtZWluZm8tPnN0YXRlICYgV0lGSV9GV19BU1NPQ19TVUNDRVNTKSB7Ci0JCWlmIChwbWxtZWluZm8tPnN0YXRlICYgTVNSX0lORlJBKQotCQkJaXNzdWVfZGVhdXRoX2V4KHBhZGFwdGVyLCBwbmV0d29yay0+TWFjQWRkcmVzcywKLQkJCQkJV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcsIDUsIDEwMCk7Ci0KLQkJcG1sbWVpbmZvLT5zdGF0ZSA9IE1TUl9OT0xJTks7Ci0KLQkJLyogY2xlYXIgQ0FNICovCi0JCWZsdXNoX2FsbF9jYW1fZW50cnkyM2EocGFkYXB0ZXIpOwotCi0JCWRlbF90aW1lcl9zeW5jKCZwbWxtZWV4dC0+bGlua190aW1lcik7Ci0KLQkJLyogc2V0IE1TUiB0byBub2xpbmsgLT4gaW5mcmEuIG1vZGUgKi8KLQkJcnRsODcyM2Ffc2V0X21lZGlhX3N0YXR1cyhwYWRhcHRlciwgTVNSX0lORlJBKTsKLQotCQlod192YXJfc2V0X21sbWVfZGlzY29ubmVjdChwYWRhcHRlcik7Ci0JfQotCi0JcnR3X2pvaW5ic3NfcmVzZXQyM2EocGFkYXB0ZXIpOwotCi0JcG1sbWVleHQtPmN1cl9id21vZGUgPSBIVF9DSEFOTkVMX1dJRFRIXzIwOwotCXBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0ID0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRTsKLQlwbWxtZWluZm8tPkVSUF9lbmFibGUgPSAwOwotCXBtbG1laW5mby0+V01NX2VuYWJsZSA9IDA7Ci0JcG1sbWVpbmZvLT5IVF9lbmFibGUgPSAwOwotCXBtbG1laW5mby0+SFRfY2Fwc19lbmFibGUgPSAwOwotCXBtbG1laW5mby0+SFRfaW5mb19lbmFibGUgPSAwOwotCXBtbG1laW5mby0+Yndtb2RlX3VwZGF0ZWQgPSBmYWxzZTsKLQkvKiBwbWxtZWluZm8tPmFzc29jX0FQX3ZlbmRvciA9IEhUX0lPVF9QRUVSX01BWDsgKi8KLQotCWlmIChwcGFybS0+SUVMZW5ndGggPiBNQVhfSUVfU1opLyogQ2hlY2sgcGJ1Zi0+SUVMZW5ndGggKi8KLQkJcmV0dXJuIEgyQ19QQVJBTUVURVJTX0VSUk9SOwotCi0JbWVtY3B5KHBuZXR3b3JrLCBwYnVmLCBzaXplb2Yoc3RydWN0IHdsYW5fYnNzaWRfZXgpKTsKLQotCS8qIENoZWNrIEFQIHZlbmRvciB0byBtb3ZlIHJ0d19qb2luYnNzX2NtZDIzYSgpICovCi0JLyogcG1sbWVpbmZvLT5hc3NvY19BUF92ZW5kb3IgPSBjaGVja19hc3NvY19BUDIzYShwbmV0d29yay0+SUVzLAotCSAgIHBuZXR3b3JrLT5JRUxlbmd0aCk7ICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgcG5ldHdvcmstPklFTGVuZ3RoOykgewotCQlwID0gcG5ldHdvcmstPklFcyArIGk7Ci0KLQkJc3dpdGNoIChwWzBdKSB7Ci0JCWNhc2UgV0xBTl9FSURfVkVORE9SX1NQRUNJRklDOi8qIEdldCBXTU0gSUUuICovCi0JCQlpZiAoIW1lbWNtcChwICsgMiwgV01NX09VSTIzQSwgNCkpCi0JCQkJcG1sbWVpbmZvLT5XTU1fZW5hYmxlID0gMTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgV0xBTl9FSURfSFRfQ0FQQUJJTElUWToJLyogR2V0IEhUIENhcCBJRS4gKi8KLQkJCXBtbG1laW5mby0+SFRfY2Fwc19lbmFibGUgPSAxOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBXTEFOX0VJRF9IVF9PUEVSQVRJT046CS8qIEdldCBIVCBJbmZvIElFLiAqLwotCQkJcG1sbWVpbmZvLT5IVF9pbmZvX2VuYWJsZSA9IDE7Ci0KLQkJCS8qIHNwZWMgY2FzZSBvbmx5IGZvciBjaXNjbydzIGFwIGJlY2F1c2UgY2lzY28ncyBhcAotCQkJICogaXNzdWUgYXNzb2MgcnNwIHVzaW5nIG1jcyByYXRlIEA0ME1IeiBvciBAMjBNSHogKi8KLQkJCXBodF9pbmZvID0gKHN0cnVjdCBpZWVlODAyMTFfaHRfb3BlcmF0aW9uICopKHAgKyAyKTsKLQotCQkJaWYgKHByZWdwcml2LT5jYnc0MF9lbmFibGUgJiYKLQkJCSAgICAocGh0X2luZm8tPmh0X3BhcmFtICYKLQkJCSAgICAgSUVFRTgwMjExX0hUX1BBUkFNX0NIQU5fV0lEVEhfQU5ZKSkgewotCQkJCS8qIHN3aXRjaCB0byB0aGUgNDBNIEh6IG1vZGUgYWNjb3JkaW5nIHRvIEFQICovCi0JCQkJcG1sbWVleHQtPmN1cl9id21vZGUgPSBIVF9DSEFOTkVMX1dJRFRIXzQwOwotCQkJCXN3aXRjaCAocGh0X2luZm8tPmh0X3BhcmFtICYKLQkJCQkJSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfT0ZGU0VUKSB7Ci0JCQkJY2FzZSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRToKLQkJCQkJcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQgPQotCQkJCQkJSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0xPV0VSOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQkVMT1c6Ci0JCQkJCXBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0ID0KLQkJCQkJCUhBTF9QUklNRV9DSE5MX09GRlNFVF9VUFBFUjsKLQkJCQkJYnJlYWs7Ci0KLQkJCQlkZWZhdWx0OgotCQkJCQlwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCA9Ci0JCQkJCQlIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlEQkdfODcyM0EoInNldCBjaC9idyBiZWZvcmUgY29ubmVjdGVkXG4iKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCi0JCWkgKz0gKHBbMV0gKyAyKTsKLQl9Ci0KLQlod192YXJfc2V0X2Jzc2lkKHBhZGFwdGVyLCBwbWxtZWluZm8tPm5ldHdvcmsuTWFjQWRkcmVzcyk7Ci0JaHdfdmFyX3NldF9tbG1lX2pvaW4ocGFkYXB0ZXIsIDApOwotCi0JLyogY2FuY2VsIGxpbmsgdGltZXIgKi8KLQlkZWxfdGltZXJfc3luYygmcG1sbWVleHQtPmxpbmtfdGltZXIpOwotCi0Jc3RhcnRfY2xudF9qb2luKHBhZGFwdGVyKTsKLQotCXJldHVybiBIMkNfU1VDQ0VTUzsKLX0KLQotaW50IGRpc2Nvbm5lY3RfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKQotewotCWNvbnN0IHN0cnVjdCBkaXNjb25uZWN0X3Bhcm0gKnBhcmFtID0gKHN0cnVjdCBkaXNjb25uZWN0X3Bhcm0gKilwYnVmOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKnBuZXR3b3JrID0gJnBtbG1laW5mby0+bmV0d29yazsKLQotCWlmIChpc19jbGllbnRfYXNzb2NpYXRlZF90b19hcDIzYShwYWRhcHRlcikpIHsKLQkJaXNzdWVfZGVhdXRoX2V4KHBhZGFwdGVyLCBwbmV0d29yay0+TWFjQWRkcmVzcywKLQkJCQlXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORywKLQkJCQlwYXJhbS0+ZGVhdXRoX3RpbWVvdXRfbXMvMTAwLCAxMDApOwotCX0KLQotCS8qIHNldF9vcG1vZGVfY21kKHBhZGFwdGVyLCBpbmZyYV9jbGllbnRfd2l0aF9tbG1lKTsgKi8KLQotCS8qIHBtbG1laW5mby0+c3RhdGUgPSBNU1JfTk9MSU5LOyAqLwotCi0JaHdfdmFyX3NldF9tbG1lX2Rpc2Nvbm5lY3QocGFkYXB0ZXIpOwotCWh3X3Zhcl9zZXRfYnNzaWQocGFkYXB0ZXIsIG51bGxfYWRkcik7Ci0KLQkvKiByZXN0b3JlIHRvIGluaXRpYWwgc2V0dGluZy4gKi8KLQl1cGRhdGVfdHhfYmFzaWNfcmF0ZTIzYShwYWRhcHRlciwgcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi53aXJlbGVzc19tb2RlKTsKLQotCWlmICgocG1sbWVpbmZvLT5zdGF0ZSAmIDB4MDMpID09IE1TUl9BREhPQyB8fAotCSAgICAocG1sbWVpbmZvLT5zdGF0ZSAmIDB4MDMpID09IE1TUl9BUCkKLQkJcnRsODcyM2Ffc2V0X2Jjbl9mdW5jKHBhZGFwdGVyLCAwKTsJLyogU3RvcCBCQ04gKi8KLQotCS8qIHNldCBNU1IgdG8gbm8gbGluayBzdGF0ZSAtPiBpbmZyYS4gbW9kZSAqLwotCXJ0bDg3MjNhX3NldF9tZWRpYV9zdGF0dXMocGFkYXB0ZXIsIE1TUl9JTkZSQSk7Ci0KLQlwbWxtZWluZm8tPnN0YXRlID0gTVNSX05PTElOSzsKLQotCS8qIHN3aXRjaCB0byB0aGUgMjBNIEh6IG1vZGUgYWZ0ZXIgZGlzY29ubmVjdCAqLwotCXBtbG1lZXh0LT5jdXJfYndtb2RlID0gSFRfQ0hBTk5FTF9XSURUSF8yMDsKLQlwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCA9IEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkU7Ci0KLQlzZXRfY2hhbm5lbF9id21vZGUyM2EocGFkYXB0ZXIsIHBtbG1lZXh0LT5jdXJfY2hhbm5lbCwKLQkJCSAgICAgIHBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0LCBwbWxtZWV4dC0+Y3VyX2J3bW9kZSk7Ci0KLQlmbHVzaF9hbGxfY2FtX2VudHJ5MjNhKHBhZGFwdGVyKTsKLQotCWRlbF90aW1lcl9zeW5jKCZwbWxtZWV4dC0+bGlua190aW1lcik7Ci0KLQlydHdfZnJlZV91Y19zd2RlY19wZW5kaW5nX3F1ZXVlMjNhKHBhZGFwdGVyKTsKLQotCXJldHVybiBIMkNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludAotcnR3X3NjYW5fY2hfZGVjaXNpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICAgICBzdHJ1Y3QgcnR3X2llZWU4MDIxMV9jaGFubmVsICpvdXQsIHUzMiBvdXRfbnVtLAotCQkgICAgIGNvbnN0IHN0cnVjdCBydHdfaWVlZTgwMjExX2NoYW5uZWwgKmluLCB1MzIgaW5fbnVtKQotewotCWludCBpLCBqOwotCWludCBzY2FuX2NoX251bSA9IDA7Ci0JaW50IHNldF9pZHg7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQotCS8qIGNsZWFyIG91dCBmaXJzdCAqLwotCW1lbXNldChvdXQsIDAsIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9jaGFubmVsKSpvdXRfbnVtKTsKLQotCS8qIGFjcXVpcmUgY2hhbm5lbHMgZnJvbSBpbiAqLwotCWogPSAwOwotCWZvciAoaSA9IDA7aTxpbl9udW07aSsrKSB7Ci0JCWlmIChpbltpXS5od192YWx1ZSAmJgotCQkgICAgIShpbltpXS5mbGFncyAmIElFRUU4MDIxMV9DSEFOX0RJU0FCTEVEKSAmJgotCQkgICAgKHNldF9pZHggPSBydHdfY2hfc2V0X3NlYXJjaF9jaDIzYShwbWxtZWV4dC0+Y2hhbm5lbF9zZXQsCi0JCQkJCQkgICAgICAgaW5baV0uaHdfdmFsdWUpKSA+PSAwKSB7Ci0JCQltZW1jcHkoJm91dFtqXSwgJmluW2ldLAotCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9jaGFubmVsKSk7Ci0KLQkJCWlmIChwbWxtZWV4dC0+Y2hhbm5lbF9zZXRbc2V0X2lkeF0uU2NhblR5cGUgPT0KLQkJCSAgICBTQ0FOX1BBU1NJVkUpCi0JCQkJb3V0W2pdLmZsYWdzICY9IElFRUU4MDIxMV9DSEFOX05PX0lSOwotCi0JCQlqKys7Ci0JCX0KLQkJaWYgKGo+PSBvdXRfbnVtKQotCQkJYnJlYWs7Ci0JfQotCi0JLyogaWYgb3V0IGlzIGVtcHR5LCB1c2UgY2hhbm5lbF9zZXQgYXMgZGVmYXVsdCAqLwotCWlmIChqID09IDApIHsKLQkJZm9yIChpID0gMDtpPHBtbG1lZXh0LT5tYXhfY2hhbl9udW1zO2krKykgewotCQkJb3V0W2ldLmh3X3ZhbHVlID0gcG1sbWVleHQtPmNoYW5uZWxfc2V0W2ldLkNoYW5uZWxOdW07Ci0KLQkJCWlmIChwbWxtZWV4dC0+Y2hhbm5lbF9zZXRbaV0uU2NhblR5cGUgPT0gU0NBTl9QQVNTSVZFKQotCQkJCW91dFtpXS5mbGFncyAmPSBJRUVFODAyMTFfQ0hBTl9OT19JUjsKLQotCQkJaisrOwotCQl9Ci0JfQotCi0JaWYgKHBhZGFwdGVyLT5zZXRiYW5kID09IEdIWl8yNCkgewkJCS8qICAyLjRHICovCi0JCWZvciAoaSA9IDA7IGkgPCBqIDsgaSsrKSB7Ci0JCQlpZiAob3V0W2ldLmh3X3ZhbHVlID4gMzUpCi0JCQkJbWVtc2V0KCZvdXRbaV0sIDAsCi0JCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9jaGFubmVsKSk7Ci0JCQllbHNlCi0JCQkJc2Nhbl9jaF9udW0rKzsKLQkJfQotCQlqID0gc2Nhbl9jaF9udW07Ci0JfSBlbHNlIGlmICAocGFkYXB0ZXItPnNldGJhbmQgPT0gR0haXzUwKSB7CQkvKiAgNUcgKi8KLQkJZm9yIChpID0gMDsgaSA8IGogOyBpKyspIHsKLQkJCWlmIChvdXRbaV0uaHdfdmFsdWUgPiAzNSkgewotCQkJCW1lbWNweSgmb3V0W3NjYW5fY2hfbnVtKytdLCAmb3V0W2ldLAotCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfY2hhbm5lbCkpOwotCQkJfQotCQl9Ci0JCWogPSBzY2FuX2NoX251bTsKLQl9IGVsc2UKLQkJe30KLQotCXJldHVybiBqOwotfQotCi1pbnQgc2l0ZXN1cnZleV9jbWRfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKQotewotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0JY29uc3Qgc3RydWN0IHNpdGVzdXJ2ZXlfcGFybSAqcHBhcm0gPSAoc3RydWN0IHNpdGVzdXJ2ZXlfcGFybSAqKXBidWY7Ci0JdTggYmRlbGF5c2NhbiA9IGZhbHNlOwotCXUzMiBpbml0aWFsZ2FpbjsKLQl1MzIgaTsKLQotCWlmIChwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuc3RhdGUgPT0gU0NBTl9ESVNBQkxFKSB7Ci0JCXBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5zdGF0ZSA9IFNDQU5fU1RBUlQ7Ci0JCXBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5ic3NfY250ID0gMDsKLQkJcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLmNoYW5uZWxfaWR4ID0gMDsKLQotCQlmb3IgKGkgPSAwOyBpIDwgUlRXX1NTSURfU0NBTl9BTU9VTlQ7IGkrKykgewotCQkJaWYgKHBwYXJtLT5zc2lkW2ldLnNzaWRfbGVuKSB7Ci0JCQkJbWVtY3B5KHBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5zc2lkW2ldLnNzaWQsCi0JCQkJICAgICAgIHBwYXJtLT5zc2lkW2ldLnNzaWQsCi0JCQkJICAgICAgIElFRUU4MDIxMV9NQVhfU1NJRF9MRU4pOwotCQkJCXBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5zc2lkW2ldLnNzaWRfbGVuID0KLQkJCQkJcHBhcm0tPnNzaWRbaV0uc3NpZF9sZW47Ci0JCQl9IGVsc2UgewotCQkJCXBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5zc2lkW2ldLnNzaWRfbGVuID0gMDsKLQkJCX0KLQkJfQotCi0JCXBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5jaF9udW0gPQotCQkJcnR3X3NjYW5fY2hfZGVjaXNpb24ocGFkYXB0ZXIsCi0JCQkJCSAgICAgcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLmNoLAotCQkJCQkgICAgIFJUV19DSEFOTkVMX1NDQU5fQU1PVU5ULAotCQkJCQkgICAgIHBwYXJtLT5jaCwgcHBhcm0tPmNoX251bSk7Ci0KLQkJcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnNjYW5fbW9kZSA9IHBwYXJtLT5zY2FuX21vZGU7Ci0KLQkJLyogaXNzdWUgbnVsbCBkYXRhIGlmIGFzc29jaWF0aW5nIHRvIHRoZSBBUCAqLwotCQlpZiAoaXNfY2xpZW50X2Fzc29jaWF0ZWRfdG9fYXAyM2EocGFkYXB0ZXIpKSB7Ci0JCQlwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuc3RhdGUgPSBTQ0FOX1RYTlVMTDsKLQotCQkJLyogc3dpdGNoIHRvIGNvcnJlY3QgY2hhbm5lbCBvZiBjdXJyZW50IG5ldHdvcmsKLQkJCSAgIGJlZm9yZSBpc3N1ZSBrZWVwLWFsaXZlIGZyYW1lcyAqLwotCQkJaWYgKHJ0d19nZXRfb3Blcl9jaDIzYShwYWRhcHRlcikgIT0KLQkJCSAgICBwbWxtZWV4dC0+Y3VyX2NoYW5uZWwpCi0JCQkJU2VsZWN0Q2hhbm5lbDIzYShwYWRhcHRlciwKLQkJCQkJCSBwbWxtZWV4dC0+Y3VyX2NoYW5uZWwpOwotCi0JCQlpc3N1ZV9udWxsZGF0YTIzYShwYWRhcHRlciwgTlVMTCwgMSwgMywgNTAwKTsKLQotCQkJYmRlbGF5c2NhbiA9IHRydWU7Ci0JCX0KLQotCQlpZiAoYmRlbGF5c2NhbikgewotCQkJLyogZGVsYXkgNTBtcyB0byBwcm90ZWN0IG51bGxkYXRhKDEpLiAqLwotCQkJc2V0X3N1cnZleV90aW1lcihwbWxtZWV4dCwgNTApOwotCQkJcmV0dXJuIEgyQ19TVUNDRVNTOwotCQl9Ci0JfQotCi0JaWYgKHBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5zdGF0ZSA9PSBTQ0FOX1NUQVJUIHx8Ci0JICAgIHBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5zdGF0ZSA9PSBTQ0FOX1RYTlVMTCkgewotCQkvKiBkaXNhYmxlIGR5bmFtaWMgZnVuY3Rpb25zLCBzdWNoIGFzIGhpZ2ggcG93ZXIsIERJRyAqLwotCQlydGw4NzIzYV9vZG1fc3VwcG9ydF9hYmlsaXR5X2JhY2t1cChwYWRhcHRlcik7Ci0JCXJ0bDg3MjNhX29kbV9zdXBwb3J0X2FiaWxpdHlfY2xyKHBhZGFwdGVyLAotCQkJCQkJIERZTkFNSUNfRlVOQ19ESVNBQkxFKTsKLQotCQkvKiBjb25maWcgdGhlIGluaXRpYWwgZ2FpbiB1bmRlciBzY2FubmluZywgbmVlZCB0bwotCQkgICB3cml0ZSB0aGUgQkIgcmVnaXN0ZXJzICovCi0JCWlmICh3ZGV2X3RvX3ByaXYocGFkYXB0ZXItPnJ0d193ZGV2KS0+cDJwX2VuYWJsZWQgPT0gdHJ1ZSkKLQkJCWluaXRpYWxnYWluID0gMHgzMDsKLQkJZWxzZQotCQkJaW5pdGlhbGdhaW4gPSAweDFFOwotCi0JCXJ0bDg3MjNhX3NldF9pbml0aWFsX2dhaW4ocGFkYXB0ZXIsIGluaXRpYWxnYWluKTsKLQotCQkvKiBzZXQgTVNSIHRvIG5vIGxpbmsgc3RhdGUgKi8KLQkJcnRsODcyM2Ffc2V0X21lZGlhX3N0YXR1cyhwYWRhcHRlciwgTVNSX05PTElOSyk7Ci0KLQkJcnRsODcyM2FfbWxtZV9zaXRlc3VydmV5KHBhZGFwdGVyLCAxKTsKLQotCQlwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuc3RhdGUgPSBTQ0FOX1BST0NFU1M7Ci0JfQotCi0JcnR3X3NpdGVfc3VydmV5KHBhZGFwdGVyKTsKLQotCXJldHVybiBIMkNfU1VDQ0VTUzsKLX0KLQotaW50IHNldGF1dGhfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKQotewotCWNvbnN0IHN0cnVjdCBzZXRhdXRoX3Bhcm0gKnBwYXJtID0gKHN0cnVjdCBzZXRhdXRoX3Bhcm0gKilwYnVmOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlpZiAocHBhcm0tPm1vZGUgPCA0KQotCQlwbWxtZWluZm8tPmF1dGhfYWxnbyA9IHBwYXJtLT5tb2RlOwotCi0JcmV0dXJuIEgyQ19TVUNDRVNTOwotfQotCi1pbnQgc2V0a2V5X2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLQl1bnNpZ25lZCBzaG9ydCBjdHJsOwotCWNvbnN0IHN0cnVjdCBzZXRrZXlfcGFybSAqcHBhcm0gPSAoc3RydWN0IHNldGtleV9wYXJtICopcGJ1ZjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXVuc2lnbmVkIGNoYXIgbnVsbF9zdGFbXSA9IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKLQotCS8qIG1haW4gdHgga2V5IGZvciB3ZXAuICovCi0JaWYgKHBwYXJtLT5zZXRfdHgpCi0JCXBtbG1laW5mby0+a2V5X2luZGV4ID0gcHBhcm0tPmtleWlkOwotCi0JLyogd3JpdGUgY2FtICovCi0JY3RybCA9IEJJVCgxNSkgfCAocHBhcm0tPmFsZ29yaXRobSkgPDwgMiB8IHBwYXJtLT5rZXlpZDsKLQotCURCR184NzIzQV9MRVZFTChfZHJ2X2Fsd2F5c18sICJzZXQgZ3JvdXAga2V5IHRvIGh3OiBhbGc6JWQoV0VQNDAtMSAiCi0JCQkiV0VQMTA0LTUgVEtJUC0yIEFFUy00KSBrZXlpZDolZFxuIiwKLQkJCXBwYXJtLT5hbGdvcml0aG0sIHBwYXJtLT5rZXlpZCk7Ci0JcnRsODcyM2FfY2FtX3dyaXRlKHBhZGFwdGVyLCBwcGFybS0+a2V5aWQsIGN0cmwsIG51bGxfc3RhLCBwcGFybS0+a2V5KTsKLQotCS8qIGFsbG93IG11bHRpY2FzdCBwYWNrZXRzIHRvIGRyaXZlciAqLwotCXJ0bDg3MjNhX29uX3Jjcl9hbShwYWRhcHRlcik7Ci0KLQlyZXR1cm4gSDJDX1NVQ0NFU1M7Ci19Ci0KLWludCBzZXRfc3Rha2V5X2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLQl1MTYgY3RybCA9IDA7Ci0JdTggY2FtX2lkOy8qIGNhbV9lbnRyeSAqLwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0JY29uc3Qgc3RydWN0IHNldF9zdGFrZXlfcGFybSAqcHBhcm0gPSAoc3RydWN0IHNldF9zdGFrZXlfcGFybSAqKXBidWY7Ci0KLQkvKiBjYW1fZW50cnk6ICovCi0JLyogMH4zIGZvciBkZWZhdWx0IGtleSAqLwotCi0JLyogZm9yIGNvbmN1cnJlbnQgbW9kZSAoYXArc3RhKTogKi8KLQkvKiBkZWZhdWx0IGtleSBpcyBkaXNhYmxlLCB1c2luZyBzdyBlbmNyeXB0L2RlY3J5cHQgKi8KLQkvKiBjYW1fZW50cnkgPSA0ICBmb3Igc3RhIG1vZGUgKG1hY2lkID0gMCkgKi8KLQkvKiBjYW1fZW50cnkobWFjaWQrMykgPSA1IH4gTiBmb3IgYXAgbW9kZSAoYWlkID0gMX5OLCBtYWNpZCA9IDIgfk4pICovCi0KLQkvKiBmb3IgY29uY3VycmVudCBtb2RlIChzdGErc3RhKTogKi8KLQkvKiBkZWZhdWx0IGtleSBpcyBkaXNhYmxlLCB1c2luZyBzdyBlbmNyeXB0L2RlY3J5cHQgKi8KLQkvKiBjYW1fZW50cnkgPSA0IG1hcHBpbmcgdG8gbWFjaWQgPSAwICovCi0JLyogY2FtX2VudHJ5ID0gNSBtYXBwaW5nIHRvIG1hY2lkID0gMiAqLwotCi0JY2FtX2lkID0gNDsKLQotCURCR184NzIzQV9MRVZFTChfZHJ2X2Fsd2F5c18sICJzZXQgcGFpcndpc2Uga2V5IHRvIGh3OiBhbGc6JWQoV0VQNDAtMSAiCi0JCQkiV0VQMTA0LTUgVEtJUC0yIEFFUy00KSBjYW1pZDolZFxuIiwKLQkJCXBwYXJtLT5hbGdvcml0aG0sIGNhbV9pZCk7Ci0JaWYgKChwbWxtZWluZm8tPnN0YXRlICYgMHgwMykgPT0gTVNSX0FQKSB7Ci0JCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQkJc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQotCQlpZiAocHBhcm0tPmFsZ29yaXRobSA9PSAwKSB7CS8qICBjbGVhciBjYW0gZW50cnkgKi8KLQkJCWNsZWFyX2NhbV9lbnRyeTIzYShwYWRhcHRlciwgcHBhcm0tPmlkKTsKLQkJCXJldHVybiBIMkNfU1VDQ0VTU19SU1A7Ci0JCX0KLQotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBwcGFybS0+YWRkcik7Ci0JCWlmIChwc3RhKSB7Ci0JCQljdHJsID0gQklUKDE1KSB8IChwcGFybS0+YWxnb3JpdGhtIDw8IDIpOwotCi0JCQlEQkdfODcyM0EoInI4NzF4X3NldF9zdGFrZXlfaGRsMjNhKCk6IGVuY19hbGdvcml0aG0gIgotCQkJCSAgIj0lZFxuIiwgcHBhcm0tPmFsZ29yaXRobSk7Ci0KLQkJCWlmIChwc3RhLT5tYWNfaWQgPCAxIHx8IHBzdGEtPm1hY19pZCA+IChOVU1fU1RBIC0gNCkpIHsKLQkJCQlEQkdfODcyM0EoInI4NzF4X3NldF9zdGFrZXlfaGRsMjNhKCk6c2V0X3N0YWtleSIKLQkJCQkJICAiIGZhaWxlZCwgbWFjX2lkKGFpZCkgPSVkXG4iLAotCQkJCQkgIHBzdGEtPm1hY19pZCk7Ci0JCQkJcmV0dXJuIEgyQ19SRUpFQ1RFRDsKLQkJCX0KLQotCQkJLyogMH4zIGZvciBkZWZhdWx0IGtleSwgY21kX2lkID0gbWFjaWQgKyAzLAotCQkJICAgbWFjaWQgPSBhaWQrMTsgKi8KLQkJCWNhbV9pZCA9IHBzdGEtPm1hY19pZCArIDM7Ci0KLQkJCURCR184NzIzQSgiV3JpdGUgQ0FNLCBtYWNfYWRkciA9JXBNLCAiCi0JCQkJICAiY2FtX2VudHJ5ID0lZFxuIiwgcHBhcm0tPmFkZHIsIGNhbV9pZCk7Ci0KLQkJCXJ0bDg3MjNhX2NhbV93cml0ZShwYWRhcHRlciwgY2FtX2lkLCBjdHJsLAotCQkJCQkgICBwcGFybS0+YWRkciwgcHBhcm0tPmtleSk7Ci0KLQkJCXJldHVybiBIMkNfU1VDQ0VTU19SU1A7Ci0JCX0gZWxzZSB7Ci0JCQlEQkdfODcyM0EoInI4NzF4X3NldF9zdGFrZXlfaGRsMjNhKCk6IHN0YSBoYXMgYmVlbiAiCi0JCQkJICAiZnJlZVxuIik7Ci0JCQlyZXR1cm4gSDJDX1JFSkVDVEVEOwotCQl9Ci0JfQotCi0JLyogYmVsb3cgZm9yIHN0YSBtb2RlICovCi0KLQlpZiAocHBhcm0tPmFsZ29yaXRobSA9PSAwKSB7CS8qICBjbGVhciBjYW0gZW50cnkgKi8KLQkJY2xlYXJfY2FtX2VudHJ5MjNhKHBhZGFwdGVyLCBwcGFybS0+aWQpOwotCQlyZXR1cm4gSDJDX1NVQ0NFU1M7Ci0JfQotCi0JY3RybCA9IEJJVCgxNSkgfCAocHBhcm0tPmFsZ29yaXRobSA8PCAyKTsKLQotCXJ0bDg3MjNhX2NhbV93cml0ZShwYWRhcHRlciwgY2FtX2lkLCBjdHJsLCBwcGFybS0+YWRkciwgcHBhcm0tPmtleSk7Ci0KLQlwbWxtZWluZm8tPmVuY19hbGdvID0gcHBhcm0tPmFsZ29yaXRobTsKLQotCXJldHVybiBIMkNfU1VDQ0VTUzsKLX0KLQotaW50IGFkZF9iYV9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0JY29uc3Qgc3RydWN0IGFkZEJhUmVxX3Bhcm0gKnBwYXJtID0gKHN0cnVjdCBhZGRCYVJlcV9wYXJtICopcGJ1ZjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQotCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EoJnBhZGFwdGVyLT5zdGFwcml2LCBwcGFybS0+YWRkcik7Ci0KLQlpZiAoIXBzdGEpCi0JCXJldHVybiBIMkNfU1VDQ0VTUzsKLQotCWlmICgoKHBtbG1laW5mby0+c3RhdGUgJiBXSUZJX0ZXX0FTU09DX1NVQ0NFU1MpICYmCi0JICAgICBwbWxtZWluZm8tPkhUX2VuYWJsZSkgfHwKLQkgICAgKHBtbG1laW5mby0+c3RhdGUgJiAweDAzKSA9PSBNU1JfQVApIHsKLQkJaXNzdWVfYWN0aW9uX0JBMjNhKHBhZGFwdGVyLCBwcGFybS0+YWRkciwKLQkJCQkgICBXTEFOX0FDVElPTl9BRERCQV9SRVEsICh1MTYpcHBhcm0tPnRpZCk7Ci0JCW1vZF90aW1lcigmcHN0YS0+YWRkYmFfcmV0cnlfdGltZXIsCi0JCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKEFEREJBX1RPKSk7Ci0JfSBlbHNlCi0JCXBzdGEtPmh0cHJpdi5jYW5kaWRhdGVfdGlkX2JpdG1hcCAmPSB+QklUKHBwYXJtLT50aWQpOwotCi0JcmV0dXJuIEgyQ19TVUNDRVNTOwotfQotCi1pbnQgc2V0X3R4X2JlYWNvbl9jbWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgY21kX29iaiAqcGgyYzsKLQlzdHJ1Y3QgVHhfQmVhY29uX3BhcmFtICpwdHhCZWFjb25fcGFybTsKLQlzdHJ1Y3QgY21kX3ByaXYJKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0JdTggcmVzID0gX1NVQ0NFU1M7Ci0JaW50IGxlbl9kaWZmID0gMDsKLQotCXBoMmMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaiksIEdGUF9BVE9NSUMpOwotCWlmICghcGgyYykgewotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXB0eEJlYWNvbl9wYXJtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IFR4X0JlYWNvbl9wYXJhbSksIEdGUF9BVE9NSUMpOwotCWlmICghcHR4QmVhY29uX3Bhcm0pIHsKLQkJa2ZyZWUocGgyYyk7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JbWVtY3B5KCZwdHhCZWFjb25fcGFybS0+bmV0d29yaywgJnBtbG1laW5mby0+bmV0d29yaywKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCB3bGFuX2Jzc2lkX2V4KSk7Ci0KLQlsZW5fZGlmZiA9IHVwZGF0ZV9oaWRkZW5fc3NpZChwdHhCZWFjb25fcGFybS0+bmV0d29yay5JRXMsCi0JCQkJICAgICAgcHR4QmVhY29uX3Bhcm0tPm5ldHdvcmsuSUVMZW5ndGgsCi0JCQkJICAgICAgcG1sbWVpbmZvLT5oaWRkZW5fc3NpZF9tb2RlKTsKLQlwdHhCZWFjb25fcGFybS0+bmV0d29yay5JRUxlbmd0aCArPSBsZW5fZGlmZjsKLQotCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHB0eEJlYWNvbl9wYXJtLAotCQkJCSAgIEdFTl9DTURfQ09ERShfVFhfQmVhY29uKSk7Ci0KLQlyZXMgPSBydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBoMmMpOwotCi1leGl0OgotCXJldHVybiByZXM7Ci19Ci0KLWludCBtbG1lX2V2dF9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0JdTggZXZ0X2NvZGUsIGV2dF9zZXE7Ci0JdTE2IGV2dF9zejsKLQljb25zdCBzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyICpjMmg7Ci0Jdm9pZCAoKmV2ZW50X2NhbGxiYWNrKShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmRldiwgY29uc3QgdTggKnBidWYpOwotCi0JYzJoID0gKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIgKilwYnVmOwotCWV2dF9zeiA9IGMyaC0+bGVuOwotCWV2dF9zZXEgPSBjMmgtPnNlcTsKLQlldnRfY29kZSA9IGMyaC0+SUQ7Ci0KLQkvKiAgY2hlY2tpbmcgaWYgZXZlbnQgY29kZSBpcyB2YWxpZCAqLwotCWlmIChldnRfY29kZSA+PSBNQVhfQzJIRVZUKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywKLQkJCSAiRXZlbnQgQ29kZSglZCkgbWlzbWF0Y2ghXG4iLCBldnRfY29kZSk7Ci0JCWdvdG8gX2Fib3J0X2V2ZW50XzsKLQl9Ci0KLQkvKiAgY2hlY2tpbmcgaWYgZXZlbnQgc2l6ZSBtYXRjaCB0aGUgZXZlbnQgcGFybSBzaXplICovCi0JaWYgKHdsYW5ldmVudHNbZXZ0X2NvZGVdLnBhcm1zaXplICE9IDAgJiYKLQkgICAgd2xhbmV2ZW50c1tldnRfY29kZV0ucGFybXNpemUgIT0gZXZ0X3N6KSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywKLQkJCSAiRXZlbnQoJWQpIFBhcm0gU2l6ZSBtaXNtYXRjaCAoJWQgdnMgJWQpIVxuIiwKLQkJCSBldnRfY29kZSwgd2xhbmV2ZW50c1tldnRfY29kZV0ucGFybXNpemUsIGV2dF9zeik7Ci0JCWdvdG8gX2Fib3J0X2V2ZW50XzsKLQl9Ci0KLQlldmVudF9jYWxsYmFjayA9IHdsYW5ldmVudHNbZXZ0X2NvZGVdLmV2ZW50X2NhbGxiYWNrOwotCWV2ZW50X2NhbGxiYWNrKHBhZGFwdGVyLCBwYnVmICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpKTsKLQotX2Fib3J0X2V2ZW50XzoKLQotCXJldHVybiBIMkNfU1VDQ0VTUzsKLX0KLQotaW50IGgyY19tc2dfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKQotewotCWlmICghcGJ1ZikKLQkJcmV0dXJuIEgyQ19QQVJBTUVURVJTX0VSUk9SOwotCi0JcmV0dXJuIEgyQ19TVUNDRVNTOwotfQotCi1pbnQgdHhfYmVhY29uX2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLQlpZiAoc2VuZF9iZWFjb24yM2EocGFkYXB0ZXIpID09IF9GQUlMKSB7Ci0JCURCR184NzIzQSgiaXNzdWVfYmVhY29uMjNhLCBmYWlsIVxuIik7Ci0JCXJldHVybiBIMkNfUEFSQU1FVEVSU19FUlJPUjsKLQl9Ci0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0JZWxzZSB7IC8qIHR4IGJjL21jIGZyYW1lcyBhZnRlciB1cGRhdGUgVElNICovCi0JCXN0cnVjdCBzdGFfaW5mbyAqcHN0YV9ibWM7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkOwotCQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSwgKnB0bXA7Ci0JCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0JCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0KLQkJLyogZm9yIEJDL01DIEZyYW1lcyAqLwotCQlwc3RhX2JtYyA9IHJ0d19nZXRfYmNtY19zdGFpbmZvMjNhKHBhZGFwdGVyKTsKLQkJaWYgKCFwc3RhX2JtYykKLQkJCXJldHVybiBIMkNfU1VDQ0VTUzsKLQotCQlpZiAocHN0YXByaXYtPnRpbV9iaXRtYXAgJiBCSVQoMCkgJiYgcHN0YV9ibWMtPnNsZWVwcV9sZW4gPiAwKSB7Ci0JCQltc2xlZXAoMTApOy8qICAxMG1zLCBBVElNKEhJUSkgV2luZG93cyAqLwotCQkJLyogc3Bpbl9sb2NrX2JoKCZwc3RhX2JtYy0+c2xlZXBfcS5sb2NrKTsgKi8KLQkJCXNwaW5fbG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLQotCQkJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKCZwc3RhX2JtYy0+c2xlZXBfcSk7Ci0KLQkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShweG1pdGZyYW1lLCBwdG1wLAotCQkJCQkJIHBoZWFkLCBsaXN0KSB7Ci0KLQkJCQlsaXN0X2RlbF9pbml0KCZweG1pdGZyYW1lLT5saXN0KTsKLQotCQkJCXBzdGFfYm1jLT5zbGVlcHFfbGVuLS07Ci0JCQkJaWYgKHBzdGFfYm1jLT5zbGVlcHFfbGVuPjApCi0JCQkJCXB4bWl0ZnJhbWUtPmF0dHJpYi5tZGF0YSA9IDE7Ci0JCQkJZWxzZQotCQkJCQlweG1pdGZyYW1lLT5hdHRyaWIubWRhdGEgPSAwOwotCi0JCQkJcHhtaXRmcmFtZS0+YXR0cmliLnRyaWdnZXJlZCA9IDE7Ci0KLQkJCQlweG1pdGZyYW1lLT5hdHRyaWIucXNlbCA9IDB4MTE7LyogSElRICovCi0KLQkJCQlydGw4NzIzYXVfaGFsX3htaXRmcmFtZV9lbnF1ZXVlKHBhZGFwdGVyLAotCQkJCQkJCQlweG1pdGZyYW1lKTsKLQkJCX0KLQkJCS8qIHNwaW5fdW5sb2NrX2JoKCZwc3RhX2JtYy0+c2xlZXBfcS5sb2NrKTsgKi8KLQkJCXNwaW5fdW5sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwotCQl9Ci0JfQotI2VuZGlmCi0KLQlyZXR1cm4gSDJDX1NVQ0NFU1M7Ci19Ci0KLWludCBzZXRfY2hfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKQotewotCWNvbnN0IHN0cnVjdCBzZXRfY2hfcGFybSAqc2V0X2NoX3Bhcm07Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQotCWlmICghcGJ1ZikKLQkJcmV0dXJuIEgyQ19QQVJBTUVURVJTX0VSUk9SOwotCi0Jc2V0X2NoX3Bhcm0gPSAoc3RydWN0IHNldF9jaF9wYXJtICopcGJ1ZjsKLQotCURCR184NzIzQSgiJXMoJXMpOiBjaDoldSwgYnc6JXUsIGNoX29mZnNldDoldVxuIiwgX19mdW5jX18sCi0JCSAgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsIHNldF9jaF9wYXJtLT5jaCwKLQkJICBzZXRfY2hfcGFybS0+YncsIHNldF9jaF9wYXJtLT5jaF9vZmZzZXQpOwotCi0JcG1sbWVleHQtPmN1cl9jaGFubmVsID0gc2V0X2NoX3Bhcm0tPmNoOwotCXBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0ID0gc2V0X2NoX3Bhcm0tPmNoX29mZnNldDsKLQlwbWxtZWV4dC0+Y3VyX2J3bW9kZSA9IHNldF9jaF9wYXJtLT5idzsKLQotCXNldF9jaGFubmVsX2J3bW9kZTIzYShwYWRhcHRlciwgc2V0X2NoX3Bhcm0tPmNoLAotCQkJICAgICAgc2V0X2NoX3Bhcm0tPmNoX29mZnNldCwgc2V0X2NoX3Bhcm0tPmJ3KTsKLQotCXJldHVybiBIMkNfU1VDQ0VTUzsKLX0KLQotaW50IHNldF9jaHBsYW5faGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKQotewotCWNvbnN0IHN0cnVjdCBTZXRDaGFubmVsUGxhbl9wYXJhbSAqc2V0Q2hhbm5lbFBsYW5fcGFyYW07Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQotCWlmICghcGJ1ZikKLQkJcmV0dXJuIEgyQ19QQVJBTUVURVJTX0VSUk9SOwotCi0Jc2V0Q2hhbm5lbFBsYW5fcGFyYW0gPSAoc3RydWN0IFNldENoYW5uZWxQbGFuX3BhcmFtICopcGJ1ZjsKLQotCXBtbG1lZXh0LT5tYXhfY2hhbl9udW1zID0KLQkJaW5pdF9jaGFubmVsX3NldChwYWRhcHRlciwgc2V0Q2hhbm5lbFBsYW5fcGFyYW0tPmNoYW5uZWxfcGxhbiwKLQkJCQkgcG1sbWVleHQtPmNoYW5uZWxfc2V0KTsKLQlpbml0X2NoYW5uZWxfbGlzdChwYWRhcHRlciwgcG1sbWVleHQtPmNoYW5uZWxfc2V0LAotCQkJICBwbWxtZWV4dC0+bWF4X2NoYW5fbnVtcywgJnBtbG1lZXh0LT5jaGFubmVsX2xpc3QpOwotCi0JcmV0dXJuIEgyQ19TVUNDRVNTOwotfQotCi1pbnQgbGVkX2JsaW5rX2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLQlzdHJ1Y3QgTGVkQmxpbmtfcGFyYW0gKmxlZEJsaW5rX3BhcmFtOwotCi0JaWYgKCFwYnVmKQotCQlyZXR1cm4gSDJDX1BBUkFNRVRFUlNfRVJST1I7Ci0KLQlsZWRCbGlua19wYXJhbSA9IChzdHJ1Y3QgTGVkQmxpbmtfcGFyYW0gKilwYnVmOwotCi0JcmV0dXJuIEgyQ19TVUNDRVNTOwotfQotCi1pbnQgc2V0X2NzYV9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0JcmV0dXJuIEgyQ19SRUpFQ1RFRDsKLX0KLQotLyogIFRETFNfV1JDUgkJOiB3cml0ZSBSQ1IgREFUQSBCSVQgKi8KLS8qICBURExTX1NEX1BUSQkJOiBpc3N1ZSBwZWVyIHRyYWZmaWMgaW5kaWNhdGlvbiAqLwotLyogIFRETFNfQ1NfT0ZGCQk6IGdvIGJhY2sgdG8gdGhlIGNoYW5uZWwgbGlua2VkIHdpdGggQVAsCi0JCQkgIHRlcm1pbmF0aW5nIGNoYW5uZWwgc3dpdGNoIHByb2NlZHVyZSAqLwotLyogIFRETFNfSU5JVF9DSF9TRU4JOiBpbml0IGNoYW5uZWwgc2Vuc2luZywgcmVjZWl2ZSBhbGwgZGF0YSBhbmQKLQkJCSAgbWdudCBmcmFtZSAqLwotLyogIFRETFNfRE9ORV9DSF9TRU4JOiBjaGFubmVsIHNlbnNpbmcgYW5kIHJlcG9ydCBjYW5kaWRhdGUgY2hhbm5lbCAqLwotLyogIFRETFNfT0ZGX0NICQk6IGZpcnN0IHRpbWUgc2V0IGNoYW5uZWwgdG8gb2ZmIGNoYW5uZWwgKi8KLS8qICBURExTX0JBU0VfQ0gJOiBnbyBiYWNrIHRwIHRoZSBjaGFubmVsIGxpbmtlZCB3aXRoIEFQIHdoZW4gc2V0Ci0JCQkgIGJhc2UgY2hhbm5lbCBhcyB0YXJnZXQgY2hhbm5lbCAqLwotLyogIFRETFNfUF9PRkZfQ0gJOiBwZXJpb2RpY2FsbHkgZ28gdG8gb2ZmIGNoYW5uZWwgKi8KLS8qICBURExTX1BfQkFTRV9DSAk6IHBlcmlvZGljYWxseSBnbyBiYWNrIHRvIGJhc2UgY2hhbm5lbCAqLwotLyogIFRETFNfUlNfUkNSCQk6IHJlc3RvcmUgUkNSICovCi0vKiAgVERMU19DS0FMVl9QSDEJOiBjaGVjayBhbGl2ZSB0aW1lciBwaGFzZTEgKi8KLS8qICBURExTX0NLQUxWX1BIMgk6IGNoZWNrIGFsaXZlIHRpbWVyIHBoYXNlMiAqLwotLyogIFRETFNfRlJFRV9TVEEJOiBmcmVlIHRkbHMgc3RhICovCi1pbnQgdGRsc19oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0JcmV0dXJuIEgyQ19SRUpFQ1RFRDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfcHdyY3RybC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19wd3JjdHJsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ODhhMTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19wd3JjdHJsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9SVFdfUFdSQ1RSTF9DXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPG9zZGVwX2ludGYuaD4KLSNpbmNsdWRlIDxydGw4NzIzYV9jbWQuaD4KLSNpbmNsdWRlIDxydHdfc3Jlc2V0Lmg+Ci0KLSNpbmNsdWRlIDxydGw4NzIzYV9idF9pbnRmLmg+Ci0jaW5jbHVkZSA8dXNiX29wc19saW51eC5oPgotCi12b2lkIGlwc19lbnRlcjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cnByaXYgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwotCi0JZG93bigmcHdycHJpdi0+bG9jayk7Ci0KLQlwd3Jwcml2LT5iaXBzX3Byb2Nlc3NpbmcgPSB0cnVlOwotCi0JLyogIHN5biBpcHNfbW9kZSB3aXRoIHJlcXVlc3QgKi8KLQlwd3Jwcml2LT5pcHNfbW9kZSA9IHB3cnByaXYtPmlwc19tb2RlX3JlcTsKLQotCXB3cnByaXYtPmlwc19lbnRlcjIzYV9jbnRzKys7Ci0JREJHXzg3MjNBKCI9PT5pcHNfZW50ZXIyM2EgY250czolZFxuIiwgcHdycHJpdi0+aXBzX2VudGVyMjNhX2NudHMpOwotCXJ0bDg3MjNhX0JUX2Rpc2FibGVfY29leGlzdChwYWRhcHRlcik7Ci0KLQlpZiAocHdycHJpdi0+Y2hhbmdlX3JmcHdyc3RhdGUgPT0gcmZfb2ZmKSB7Ci0JCXB3cnByaXYtPmJwb3dlcl9zYXZpbmcgPSB0cnVlOwotCQlEQkdfODcyM0FfTEVWRUwoX2Rydl9hbHdheXNfLCAibm9saW5rZWQgcG93ZXIgc2F2ZSBlbnRlclxuIik7Ci0KLQkJaWYgKHB3cnByaXYtPmlwc19tb2RlID09IElQU19MRVZFTF8yKQotCQkJcHdycHJpdi0+YmtlZXBmd2FsaXZlID0gdHJ1ZTsKLQotCQlydHdfaXBzX3B3cl9kb3duMjNhKHBhZGFwdGVyKTsKLQkJcHdycHJpdi0+cmZfcHdyc3RhdGUgPSByZl9vZmY7Ci0JfQotCXB3cnByaXYtPmJpcHNfcHJvY2Vzc2luZyA9IGZhbHNlOwotCi0JdXAoJnB3cnByaXYtPmxvY2spOwotfQotCi1pbnQgaXBzX2xlYXZlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCWludCByZXN1bHQgPSBfU1VDQ0VTUzsKLQlpbnQga2V5aWQ7Ci0KLQlkb3duKCZwd3Jwcml2LT5sb2NrKTsKLQotCWlmIChwd3Jwcml2LT5yZl9wd3JzdGF0ZSA9PSByZl9vZmYgJiYgIXB3cnByaXYtPmJpcHNfcHJvY2Vzc2luZykgewotCQlwd3Jwcml2LT5iaXBzX3Byb2Nlc3NpbmcgPSB0cnVlOwotCQlwd3Jwcml2LT5jaGFuZ2VfcmZwd3JzdGF0ZSA9IHJmX29uOwotCQlwd3Jwcml2LT5pcHNfbGVhdmUyM2FfY250cysrOwotCQlEQkdfODcyM0EoIj09Pmlwc19sZWF2ZTIzYSBjbnRzOiVkXG4iLAotCQkJICBwd3Jwcml2LT5pcHNfbGVhdmUyM2FfY250cyk7Ci0KLQkJcmVzdWx0ID0gcnR3X2lwc19wd3JfdXAyM2EocGFkYXB0ZXIpOwotCQlpZiAocmVzdWx0ID09IF9TVUNDRVNTKQotCQkJcHdycHJpdi0+cmZfcHdyc3RhdGUgPSByZl9vbjsKLQotCQlEQkdfODcyM0FfTEVWRUwoX2Rydl9hbHdheXNfLCAibm9saW5rZWQgcG93ZXIgc2F2ZSBsZWF2ZVxuIik7Ci0KLQkJaWYgKHBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gPT0KLQkJICAgIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwIHx8Ci0JCSAgICBwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtID09Ci0JCSAgICBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQpIHsKLQkJCURCR184NzIzQSgiPT0+JXMsIGNoYW5uZWwoJWQpLCBwcm9jZXNzaW5nKCV4KVxuIiwKLQkJCQkgIF9fZnVuY19fLCBwYWRhcHRlci0+bWxtZWV4dHByaXYuY3VyX2NoYW5uZWwsCi0JCQkJICBwd3Jwcml2LT5iaXBzX3Byb2Nlc3NpbmcpOwotCQkJc2V0X2NoYW5uZWxfYndtb2RlMjNhKHBhZGFwdGVyLAotCQkJCQkgICAgICBwYWRhcHRlci0+bWxtZWV4dHByaXYuY3VyX2NoYW5uZWwsCi0JCQkJCSAgICAgIEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkUsCi0JCQkJCSAgICAgIEhUX0NIQU5ORUxfV0lEVEhfMjApOwotCQkJZm9yIChrZXlpZCA9IDA7IGtleWlkIDwgNDsga2V5aWQrKykgewotCQkJCWlmIChwbWxtZXByaXYtPmtleV9tYXNrICYgQklUKGtleWlkKSkgewotCQkJCQlpZiAoa2V5aWQgPT0KLQkJCQkJICAgIHBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUtleUluZGV4KQotCQkJCQkJcmVzdWx0ID0gcnR3X3NldF9rZXkyM2EocGFkYXB0ZXIsIHBzZWN1cml0eXByaXYsIGtleWlkLCAxKTsKLQkJCQkJZWxzZQotCQkJCQkJcmVzdWx0ID0gcnR3X3NldF9rZXkyM2EocGFkYXB0ZXIsIHBzZWN1cml0eXByaXYsIGtleWlkLCAwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlEQkdfODcyM0EoIj09PiBpcHNfbGVhdmUyM2EuLi4uLkxFRCgweCUwOHgpLi4uXG4iLAotCQkJICBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCAweDRjKSk7Ci0JCXB3cnByaXYtPmJpcHNfcHJvY2Vzc2luZyA9IGZhbHNlOwotCi0JCXB3cnByaXYtPmJrZWVwZndhbGl2ZSA9IGZhbHNlOwotCQlwd3Jwcml2LT5icG93ZXJfc2F2aW5nID0gZmFsc2U7Ci0JfQotCi0JdXAoJnB3cnByaXYtPmxvY2spOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1zdGF0aWMgYm9vbCBydHdfcHdyX3VuYXNzb2NpYXRlZF9pZGxlKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRfcHJpdiA9ICZhZGFwdGVyLT54bWl0cHJpdjsKLQotCWJvb2wgcmV0ID0gZmFsc2U7Ci0KLQlpZiAodGltZV9hZnRlcl9lcShhZGFwdGVyLT5wd3JjdHJscHJpdi5pcHNfZGVueV90aW1lLCBqaWZmaWVzKSkKLQkJZ290byBleGl0OwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FTT0NfU1RBVEV8V0lGSV9TSVRFX01PTklUT1IpIHx8Ci0JICAgIGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1VOREVSX0xJTktJTkd8V0lGSV9VTkRFUl9XUFMpIHx8Ci0JICAgIGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSB8fAotCSAgICBjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEV8V0lGSV9BREhPQ19TVEFURSkpewotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKHB4bWl0X3ByaXYtPmZyZWVfeG1pdGJ1Zl9jbnQgIT0gTlJfWE1JVEJVRkYgfHwKLQkJcHhtaXRfcHJpdi0+ZnJlZV94bWl0X2V4dGJ1Zl9jbnQgIT0gTlJfWE1JVF9FWFRCVUZGKSB7Ci0JCURCR184NzIzQV9MRVZFTChfZHJ2X2Fsd2F5c18sCi0JCQkJIlRoZXJlIGFyZSBzb21lIHBrdHMgdG8gdHJhbnNtaXRcbiIpOwotCQlEQkdfODcyM0FfTEVWRUwoX2Rydl9pbmZvXywgImZyZWVfeG1pdGJ1Zl9jbnQ6ICVkLCAiCi0JCQkJImZyZWVfeG1pdF9leHRidWZfY250OiAlZFxuIiwKLQkJCQlweG1pdF9wcml2LT5mcmVlX3htaXRidWZfY250LAotCQkJCXB4bWl0X3ByaXYtPmZyZWVfeG1pdF9leHRidWZfY250KTsKLQkJZ290byBleGl0OwotCX0KLQotCXJldCA9IHRydWU7Ci0KLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBydHdfcHNfcHJvY2Vzc29yMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCXB3cnByaXYtPnBzX3Byb2Nlc3NpbmcgPSB0cnVlOwotCi0JaWYgKHB3cnByaXYtPmJpcHNfcHJvY2Vzc2luZyA9PSB0cnVlKQotCQlnb3RvIGV4aXQ7Ci0KLQlpZiAocHdycHJpdi0+aXBzX21vZGVfcmVxID09IElQU19OT05FKQotCQlnb3RvIGV4aXQ7Ci0KLQlpZiAoIXJ0d19wd3JfdW5hc3NvY2lhdGVkX2lkbGUocGFkYXB0ZXIpKQotCQlnb3RvIGV4aXQ7Ci0KLQlpZiAocHdycHJpdi0+cmZfcHdyc3RhdGUgPT0gcmZfb24gJiYKLQkgICAgKHB3cnByaXYtPnB3cl9zdGF0ZV9jaGVja19jbnRzICUgNCkgPT0gMCkgewotCQlEQkdfODcyM0EoIj09PiVzIC5md19zdGF0ZSgleClcbiIsIF9fZnVuY19fLAotCQkJICBnZXRfZndzdGF0ZShwbWxtZXByaXYpKTsKLQkJcHdycHJpdi0+Y2hhbmdlX3JmcHdyc3RhdGUgPSByZl9vZmY7Ci0JCWlwc19lbnRlcjIzYShwYWRhcHRlcik7Ci0JfQotZXhpdDoKLQlydHdfc2V0X3B3cl9zdGF0ZV9jaGVja190aW1lcigmcGFkYXB0ZXItPnB3cmN0cmxwcml2KTsKLQlwd3Jwcml2LT5wc19wcm9jZXNzaW5nID0gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIHB3cl9zdGF0ZV9jaGVja19oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBydHdfYWRhcHRlciAqKWRhdGE7Ci0KLQlydHdfcHNfY21kMjNhKHBhZGFwdGVyKTsKLX0KLQotLyoKLSAqCi0gKiBQYXJhbWV0ZXJzCi0gKiAgIHBhZGFwdGVyCi0gKiAgIHBzbHYJcG93ZXIgc3RhdGUgbGV2ZWwsIG9ubHkgY291bGQgYmUgUFNfU1RBVEVfUzAgfiBQU19TVEFURV9TNAotICoKLSAqLwotdm9pZCBydHdfc2V0X3Jwd20yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggcHNsdikKLXsKLQl1OCBycHdtOwotCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cnByaXYgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwotCi0JcHNsdiA9IFBTX1NUQVRFKHBzbHYpOwotCi0JaWYgKHB3cnByaXYtPmJ0Y29leF9yZm9uKSB7Ci0JCWlmIChwc2x2IDwgUFNfU1RBVEVfUzQpCi0JCQlwc2x2ID0gUFNfU1RBVEVfUzM7Ci0JfQotCi0JaWYgKHB3cnByaXYtPnJwd20gPT0gcHNsdikgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcHdyY3RybF9jXywgX2Rydl9lcnJfLAotCQkJICIlczogQWxyZWFkeSBzZXQgcnB3bVsweCUwMlhdLCBuZXcgPSAweCUwMlghXG4iLAotCQkJIF9fZnVuY19fLCBwd3Jwcml2LT5ycHdtLCBwc2x2KTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCA9PSB0cnVlIHx8Ci0JICAgIHBhZGFwdGVyLT5od19pbml0X2NvbXBsZXRlZCA9PSBmYWxzZSkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcHdyY3RybF9jXywgX2Rydl9lcnJfLAotCQkJICIlczogU3VycHJpc2VSZW1vdmVkKCVkKSBod19pbml0X2NvbXBsZXRlZCglZClcbiIsCi0JCQkgX19mdW5jX18sIHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkLAotCQkJIHBhZGFwdGVyLT5od19pbml0X2NvbXBsZXRlZCk7Ci0KLQkJcHdycHJpdi0+Y3B3bSA9IFBTX1NUQVRFX1M0OwotCi0JCXJldHVybjsKLQl9Ci0KLQlpZiAocGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkID09IHRydWUpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3B3cmN0cmxfY18sIF9kcnZfZXJyXywKLQkJCSAiJXM6IGNoYW5nZSBwb3dlciBzdGF0ZSgweCUwMlgpIHdoZW4gRHJpdmVyU3RvcHBlZFxuIiwKLQkJCSBfX2Z1bmNfXywgcHNsdik7Ci0KLQkJaWYgKHBzbHYgPCBQU19TVEFURV9TMikgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3B3cmN0cmxfY18sIF9kcnZfZXJyXywKLQkJCQkgIiVzOiBSZWplY3QgdG8gZW50ZXIgUFNfU1RBVEUoMHglMDJYKSBsb3dlciB0aGFuIFMyIHdoZW4gRHJpdmVyU3RvcHBlZCEhXG4iLAotCQkJCSBfX2Z1bmNfXywgcHNsdik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlycHdtID0gcHNsdiB8IHB3cnByaXYtPnRvZzsKLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcHdyY3RybF9jXywgX2Rydl9ub3RpY2VfLAotCQkgInJ0d19zZXRfcnB3bTIzYTogcnB3bSA9IDB4JTAyeCBjcHdtID0gMHglMDJ4XG4iLAotCQkgcnB3bSwgcHdycHJpdi0+Y3B3bSk7Ci0KLQlwd3Jwcml2LT5ycHdtID0gcHNsdjsKLQotCXJ0bDg3MjNhX3NldF9ycHdtKHBhZGFwdGVyLCBycHdtKTsKLQotCXB3cnByaXYtPnRvZyArPSAweDgwOwotCXB3cnByaXYtPmNwd20gPSBwc2x2OwotfQotCi1zdGF0aWMgYm9vbCBQU19SRFlfQ0hFQ0soc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1bnNpZ25lZCBsb25nIGRlbHRhX3RpbWU7Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCWRlbHRhX3RpbWUgPSBqaWZmaWVzIC0gcHdycHJpdi0+RGVsYXlMUFNMYXN0VGltZVN0YW1wOwotCi0JaWYgKGRlbHRhX3RpbWUgPCBMUFNfREVMQVlfVElNRSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JaWYgKCFjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkgfHwKLQkgICAgY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9TVVJWRVkpIHx8Ci0JICAgIGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSB8fAotCSAgICBjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpIHx8Ci0JICAgIGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX1NUQVRFKSkKLQkJcmV0dXJuIGZhbHNlOwotCWlmIChwd3Jwcml2LT5iSW5TdXNwZW5kKQotCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKHBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFBdXRoQWxncnRobSA9PSBkb3QxMUF1dGhBbGdydGhtXzgwMjFYICYmCi0JICAgICFwYWRhcHRlci0+c2VjdXJpdHlwcml2LmJpbnN0YWxsR3Jwa2V5KSB7Ci0JCURCR184NzIzQSgiR3JvdXAgaGFuZHNoYWtlIHN0aWxsIGluIHByb2dyZXNzICEhIVxuIik7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JaWYgKCFydHdfY2ZnODAyMTFfcHdyX21nbXQocGFkYXB0ZXIpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBydHdfc2V0X3BzX21vZGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggcHNfbW9kZSwKLQkJCXU4IHNtYXJ0X3BzLCB1OCBiY25fYW50X21vZGUpCi17Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcHdyY3RybF9jXywgX2Rydl9ub3RpY2VfLAotCQkgIiVzOiBQb3dlck1vZGUgPSVkIFNtYXJ0X1BTID0lZFxuIiwKLQkJIF9fZnVuY19fLCBwc19tb2RlLCBzbWFydF9wcyk7Ci0KLQlpZiAocHNfbW9kZSA+IFBNX0NhcmRfRGlzYWJsZSkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcHdyY3RybF9jXywgX2Rydl9lcnJfLAotCQkJICJwc19tb2RlOiVkIGVycm9yXG4iLCBwc19tb2RlKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwd3Jwcml2LT5wd3JfbW9kZSA9PSBwc19tb2RlKSB7Ci0JCWlmIChQU19NT0RFX0FDVElWRSA9PSBwc19tb2RlKQotCQkJcmV0dXJuOwotCi0JCWlmIChwd3Jwcml2LT5zbWFydF9wcyA9PSBzbWFydF9wcyAmJgotCQkgICAgcHdycHJpdi0+YmNuX2FudF9tb2RlID09IGJjbl9hbnRfbW9kZSkKLQkJCXJldHVybjsKLQl9Ci0KLQlpZiAocHNfbW9kZSA9PSBQU19NT0RFX0FDVElWRSkgewotCQlEQkdfODcyM0EoInJ0d19zZXRfcHNfbW9kZTIzYTogTGVhdmUgODAyLjExIHBvd2VyIHNhdmVcbiIpOwotCi0JCXB3cnByaXYtPnB3cl9tb2RlID0gcHNfbW9kZTsKLQkJcnR3X3NldF9ycHdtMjNhKHBhZGFwdGVyLCBQU19TVEFURV9TNCk7Ci0JCXJ0bDg3MjNhX3NldF9Gd1B3ck1vZGVfY21kKHBhZGFwdGVyLCBwc19tb2RlKTsKLQkJcHdycHJpdi0+YkZ3Q3VycmVudEluUFNNb2RlID0gZmFsc2U7Ci0JfSBlbHNlIHsKLQkJaWYgKFBTX1JEWV9DSEVDSyhwYWRhcHRlcikgfHwKLQkJICAgIHJ0bDg3MjNhX0JUX3VzaW5nX2FudGVubmFfMShwYWRhcHRlcikpIHsKLQkJCURCR184NzIzQSgiJXM6IEVudGVyIDgwMi4xMSBwb3dlciBzYXZlXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJCXB3cnByaXYtPmJGd0N1cnJlbnRJblBTTW9kZSA9IHRydWU7Ci0JCQlwd3Jwcml2LT5wd3JfbW9kZSA9IHBzX21vZGU7Ci0JCQlwd3Jwcml2LT5zbWFydF9wcyA9IHNtYXJ0X3BzOwotCQkJcHdycHJpdi0+YmNuX2FudF9tb2RlID0gYmNuX2FudF9tb2RlOwotCQkJcnRsODcyM2Ffc2V0X0Z3UHdyTW9kZV9jbWQocGFkYXB0ZXIsIHBzX21vZGUpOwotCi0JCQlydHdfc2V0X3Jwd20yM2EocGFkYXB0ZXIsIFBTX1NUQVRFX1MyKTsKLQkJfQotCX0KLX0KLQotLyoKLSAqIFJldHVybjoKLSAqCTA6CUxlYXZlIE9LCi0gKgktMToJVGltZW91dAotICoJLTI6CU90aGVyIGVycm9yCi0gKi8KLXMzMiBMUFNfUkZfT05fY2hlY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIGRlbGF5X21zKQotewotCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZSwgZW5kX3RpbWU7Ci0JdTggYkF3YWtlID0gZmFsc2U7Ci0JczMyIGVyciA9IDA7Ci0KLQlzdGFydF90aW1lID0gamlmZmllczsKLQllbmRfdGltZSA9IHN0YXJ0X3RpbWUgKyBtc2Vjc190b19qaWZmaWVzKGRlbGF5X21zKTsKLQotCXdoaWxlICgxKSB7Ci0JCWJBd2FrZSA9IHJ0bDg3MjNhX2dldF9md2xwc19yZl9vbihwYWRhcHRlcik7Ci0JCWlmIChiQXdha2UgPT0gdHJ1ZSkKLQkJCWJyZWFrOwotCi0JCWlmIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCA9PSB0cnVlKSB7Ci0JCQllcnIgPSAtMjsKLQkJCURCR184NzIzQSgiJXM6IGRldmljZSBzdXJwcmlzZSByZW1vdmVkISFcbiIsIF9fZnVuY19fKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZW5kX3RpbWUpKSB7Ci0JCQllcnIgPSAtMTsKLQkJCURCR184NzIzQSgiJXM6IFdhaXQgZm9yIEZXIExQUyBsZWF2ZSBtb3JlIHRoYW4gJXUgIgotCQkJCSAgIm1zIVxuIiwgX19mdW5jX18sIGRlbGF5X21zKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXVkZWxheSgxMDApOwotCX0KLQotCXJldHVybiBlcnI7Ci19Ci0KLS8qCURlc2NyaXB0aW9uOiAqLwotLyoJCUVudGVyIHRoZSBsZWlzdXJlIHBvd2VyIHNhdmUgbW9kZS4gKi8KLXZvaWQgTFBTX0VudGVyMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0KLQlpZiAoIVBTX1JEWV9DSEVDSyhwYWRhcHRlcikpCi0JCXJldHVybjsKLQotCWlmIChwd3Jwcml2LT5iTGVpc3VyZVBzKSB7Ci0JCS8qICBJZGxlIGZvciBhIHdoaWxlIGlmIHdlIGNvbm5lY3QgdG8gQVAgYSB3aGlsZSBhZ28uICovCi0JCWlmIChwd3Jwcml2LT5McHNJZGxlQ291bnQgPj0gMikgeyAvKiAgIDQgU2VjICovCi0JCQlpZiAocHdycHJpdi0+cHdyX21vZGUgPT0gUFNfTU9ERV9BQ1RJVkUpIHsKLQkJCQlwd3Jwcml2LT5icG93ZXJfc2F2aW5nID0gdHJ1ZTsKLQkJCQlEQkdfODcyM0EoIiVzIHNtYXJ0X3BzOiVkXG4iLCBfX2Z1bmNfXywKLQkJCQkJICBwd3Jwcml2LT5zbWFydF9wcyk7Ci0JCQkJLyogRm9yIFRlbmRhIFczMTFSIElPVCBpc3N1ZSAqLwotCQkJCXJ0d19zZXRfcHNfbW9kZTIzYShwYWRhcHRlciwKLQkJCQkJCSAgIHB3cnByaXYtPnBvd2VyX21nbnQsCi0JCQkJCQkgICBwd3Jwcml2LT5zbWFydF9wcywgMCk7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJcHdycHJpdi0+THBzSWRsZUNvdW50Kys7Ci0JfQotfQotCi0vKglEZXNjcmlwdGlvbjogKi8KLS8qCQlMZWF2ZSB0aGUgbGVpc3VyZSBwb3dlciBzYXZlIG1vZGUuICovCi12b2lkIExQU19MZWF2ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotI2RlZmluZSBMUFNfTEVBVkVfVElNRU9VVF9NUyAxMDAKLQotCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cnByaXYgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwotCi0JaWYgKHB3cnByaXYtPmJMZWlzdXJlUHMpIHsKLQkJaWYgKHB3cnByaXYtPnB3cl9tb2RlICE9IFBTX01PREVfQUNUSVZFKSB7Ci0JCQlydHdfc2V0X3BzX21vZGUyM2EocGFkYXB0ZXIsIFBTX01PREVfQUNUSVZFLCAwLCAwKTsKLQotCQkJaWYgKHB3cnByaXYtPnB3cl9tb2RlID09IFBTX01PREVfQUNUSVZFKQotCQkJCUxQU19SRl9PTl9jaGVjazIzYShwYWRhcHRlciwKLQkJCQkJCSAgIExQU19MRUFWRV9USU1FT1VUX01TKTsKLQkJfQotCX0KLQotCXB3cnByaXYtPmJwb3dlcl9zYXZpbmcgPSBmYWxzZTsKLX0KLQotLyogIERlc2NyaXB0aW9uOiBMZWF2ZSBhbGwgcG93ZXIgc2F2ZSBtb2RlOiBMUFMsIEZ3TFBTLCBJUFMgaWYgbmVlZGVkLiAqLwotLyogIE1vdmUgY29kZSB0byBmdW5jdGlvbiBieSB0eW5saS4gMjAxMC4wMy4yNi4gKi8KLXZvaWQgTGVhdmVBbGxQb3dlclNhdmVNb2RlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmQWRhcHRlci0+bWxtZXByaXY7Ci0JdTggZW5xdWV1ZSA9IDA7Ci0KLQkvKiBEQkdfODcyM0EoIiVzLi4uLi5cbiIsIF9fZnVuY19fKTsgKi8KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKQotCQlydHdfbHBzX2N0cmxfd2tfY21kMjNhKEFkYXB0ZXIsIExQU19DVFJMX0xFQVZFLCBlbnF1ZXVlKTsKLX0KLQotdm9pZCBydHdfaW5pdF9wd3JjdHJsX3ByaXYyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3JjdHJscHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0KLQlzZW1hX2luaXQoJnB3cmN0cmxwcml2LT5sb2NrLCAxKTsKLQlwd3JjdHJscHJpdi0+cmZfcHdyc3RhdGUgPSByZl9vbjsKLQlwd3JjdHJscHJpdi0+aXBzX2VudGVyMjNhX2NudHMgPSAwOwotCXB3cmN0cmxwcml2LT5pcHNfbGVhdmUyM2FfY250cyA9IDA7Ci0JcHdyY3RybHByaXYtPmJpcHNfcHJvY2Vzc2luZyA9IGZhbHNlOwotCi0JcHdyY3RybHByaXYtPmlwc19tb2RlID0gcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5pcHNfbW9kZTsKLQlwd3JjdHJscHJpdi0+aXBzX21vZGVfcmVxID0gcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5pcHNfbW9kZTsKLQotCXB3cmN0cmxwcml2LT5wd3Jfc3RhdGVfY2hlY2tfaW50ZXJ2YWwgPSBSVFdfUFdSX1NUQVRFX0NIS19JTlRFUlZBTDsKLQlwd3JjdHJscHJpdi0+cHdyX3N0YXRlX2NoZWNrX2NudHMgPSAwOwotCXB3cmN0cmxwcml2LT5iSW5TdXNwZW5kID0gZmFsc2U7Ci0JcHdyY3RybHByaXYtPmJrZWVwZndhbGl2ZSA9IGZhbHNlOwotCi0JcHdyY3RybHByaXYtPkxwc0lkbGVDb3VudCA9IDA7Ci0KLQkvKiAgUFNfTU9ERV9NSU47ICovCi0JcHdyY3RybHByaXYtPnBvd2VyX21nbnQgPSBwYWRhcHRlci0+cmVnaXN0cnlwcml2LnBvd2VyX21nbnQ7Ci0JcHdyY3RybHByaXYtPmJMZWlzdXJlUHMgPQotCQkoUFNfTU9ERV9BQ1RJVkUgIT0gcHdyY3RybHByaXYtPnBvd2VyX21nbnQpP3RydWU6ZmFsc2U7Ci0KLQlwd3JjdHJscHJpdi0+YkZ3Q3VycmVudEluUFNNb2RlID0gZmFsc2U7Ci0KLQlwd3JjdHJscHJpdi0+cnB3bSA9IDA7Ci0JcHdyY3RybHByaXYtPmNwd20gPSBQU19TVEFURV9TNDsKLQotCXB3cmN0cmxwcml2LT5wd3JfbW9kZSA9IFBTX01PREVfQUNUSVZFOwotCXB3cmN0cmxwcml2LT5zbWFydF9wcyA9IHBhZGFwdGVyLT5yZWdpc3RyeXByaXYuc21hcnRfcHM7Ci0JcHdyY3RybHByaXYtPmJjbl9hbnRfbW9kZSA9IDA7Ci0KLQlwd3JjdHJscHJpdi0+dG9nID0gMHg4MDsKLQotCXB3cmN0cmxwcml2LT5idGNvZXhfcmZvbiA9IGZhbHNlOwotCi0Jc2V0dXBfdGltZXIoJnB3cmN0cmxwcml2LT5wd3Jfc3RhdGVfY2hlY2tfdGltZXIsCi0JCSAgICBwd3Jfc3RhdGVfY2hlY2tfaGFuZGxlciwgKHVuc2lnbmVkIGxvbmcpcGFkYXB0ZXIpOwotfQotCi12b2lkIHJ0d19mcmVlX3B3cmN0cmxfcHJpdihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci19Ci0KLWlubGluZSB2b2lkIHJ0d19zZXRfaXBzX2RlbnkyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIG1zKQotewotCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cnByaXYgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwotCi0JcHdycHJpdi0+aXBzX2RlbnlfdGltZSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKG1zKTsKLX0KLQotLyoKLSogcnR3X3B3cl93YWtldXAgLSBXYWtlIHRoZSBOSUMgdXAgZnJvbTogMSlJUFMuIDIpVVNCIGF1dG9zdXNwZW5kCi0qIEBhZGFwdGVyOiBwb2ludGVyIHRvIF9hZGFwdGVyIHN0cnVjdHVyZQotKiBAaXBzX2RlZmZlcl9tczogdGhlIG1zIHdpbGwgcHJldmVudCBmcm9tIGZhbGxpbmcgaW50byBJUFMgYWZ0ZXIgd2FrZXVwCi0qIFJldHVybiBfU1VDQ0VTUyBvciBfRkFJTAotKi8KLQotaW50IF9ydHdfcHdyX3dha2V1cDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgaXBzX2RlZmZlcl9tcywgY29uc3QgY2hhciAqY2FsbGVyKQotewotCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cnByaXYgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0JaW50IHJldCA9IF9TVUNDRVNTOwotCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBqaWZmaWVzOwotCXVuc2lnbmVkIGxvbmcgbmV3X2RlbnlfdGltZTsKLQotCW5ld19kZW55X3RpbWUgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhpcHNfZGVmZmVyX21zKTsKLQotCWlmICh0aW1lX2JlZm9yZShwd3Jwcml2LT5pcHNfZGVueV90aW1lLCBuZXdfZGVueV90aW1lKSkKLQkJcHdycHJpdi0+aXBzX2RlbnlfdGltZSA9IG5ld19kZW55X3RpbWU7Ci0KLQlpZiAocHdycHJpdi0+cHNfcHJvY2Vzc2luZykgewotCQlEQkdfODcyM0EoIiVzIHdhaXQgcHNfcHJvY2Vzc2luZy4uLlxuIiwgX19mdW5jX18pOwotCQl3aGlsZSAocHdycHJpdi0+cHNfcHJvY2Vzc2luZyAmJgotCQkgICAgICAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gc3RhcnQpIDw9IDMwMDApCi0JCQltc2xlZXAoMTApOwotCQlpZiAocHdycHJpdi0+cHNfcHJvY2Vzc2luZykKLQkJCURCR184NzIzQSgiJXMgd2FpdCBwc19wcm9jZXNzaW5nIHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQkJZWxzZQotCQkJREJHXzg3MjNBKCIlcyB3YWl0IHBzX3Byb2Nlc3NpbmcgZG9uZVxuIiwgX19mdW5jX18pOwotCX0KLQotCWlmIChydHdfc3Jlc2V0X2lucHJvZ3Jlc3MocGFkYXB0ZXIpKSB7Ci0JCURCR184NzIzQSgiJXMgd2FpdCBzcmVzZXRfaW5wcm9ncmVzcy4uLlxuIiwgX19mdW5jX18pOwotCQl3aGlsZSAocnR3X3NyZXNldF9pbnByb2dyZXNzKHBhZGFwdGVyKSAmJgotCQkgICAgICAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gc3RhcnQpIDw9IDQwMDApCi0JCQltc2xlZXAoMTApOwotCQlpZiAocnR3X3NyZXNldF9pbnByb2dyZXNzKHBhZGFwdGVyKSkKLQkJCURCR184NzIzQSgiJXMgd2FpdCBzcmVzZXRfaW5wcm9ncmVzcyB0aW1lb3V0XG4iLAotCQkJCSAgX19mdW5jX18pOwotCQllbHNlCi0JCQlEQkdfODcyM0EoIiVzIHdhaXQgc3Jlc2V0X2lucHJvZ3Jlc3MgZG9uZVxuIiwgX19mdW5jX18pOwotCX0KLQotCWlmIChwd3Jwcml2LT5iSW5TdXNwZW5kKSB7Ci0JCURCR184NzIzQSgiJXMgd2FpdCBiSW5TdXNwZW5kLi4uXG4iLCBfX2Z1bmNfXyk7Ci0JCXdoaWxlIChwd3Jwcml2LT5iSW5TdXNwZW5kICYmCi0JCSAgICAgICAoamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gc3RhcnQpIDw9IDMwMDApKSB7Ci0JCQltc2xlZXAoMTApOwotCQl9Ci0JCWlmIChwd3Jwcml2LT5iSW5TdXNwZW5kKQotCQkJREJHXzg3MjNBKCIlcyB3YWl0IGJJblN1c3BlbmQgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQllbHNlCi0JCQlEQkdfODcyM0EoIiVzIHdhaXQgYkluU3VzcGVuZCBkb25lXG4iLCBfX2Z1bmNfXyk7Ci0JfQotCi0JLyogU3lzdGVtIHN1c3BlbmQgaXMgbm90IGFsbG93ZWQgdG8gd2FrZXVwICovCi0JaWYgKHB3cnByaXYtPmJJblN1c3BlbmQpIHsKLQkJcmV0ID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQkvKiBJIHRoaW5rIHRoaXMgc2hvdWxkIGJlIGNoZWNrIGluIElQUywgTFBTLCBhdXRvc3VzcGVuZCBmdW5jdGlvbnMuLi4gKi8KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKSB7Ci0JCXJldCA9IF9TVUNDRVNTOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKHJmX29mZiA9PSBwd3Jwcml2LT5yZl9wd3JzdGF0ZSkgewotCQlEQkdfODcyM0EoIiVzIGNhbGwgaXBzX2xlYXZlMjNhLi4uLlxuIiwgX19mdW5jX18pOwotCQlpZiAoaXBzX2xlYXZlMjNhKHBhZGFwdGVyKT09IF9GQUlMKSB7Ci0JCQlEQkdfODcyM0EoIj09PT09PT4gaXBzX2xlYXZlMjNhIGZhaWwuLi4uLi4uLi4uLi4uXG4iKTsKLQkJCXJldCA9IF9GQUlMOwotCQkJZ290byBleGl0OwotCQl9Ci0JfQotCi0JLyogVE9ETzogdGhlIGZvbGxvd2luZyBjaGVja2luZyBuZWVkIHRvIGJlIG1lcmdlZC4uLiAqLwotCWlmIChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwgIXBhZGFwdGVyLT5idXAgfHwKLQkgICAgIXBhZGFwdGVyLT5od19pbml0X2NvbXBsZXRlZCkgewotCQlEQkdfODcyM0EoIiVzOiBiRHJpdmVyU3RvcHBlZCA9JWQsIGJ1cCA9JWQsIGh3X2luaXRfY29tcGxldGVkICIKLQkJCSAgIj0ldVxuIiwgY2FsbGVyLCBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQsCi0JCQkgIHBhZGFwdGVyLT5idXAsIHBhZGFwdGVyLT5od19pbml0X2NvbXBsZXRlZCk7Ci0JCXJldCA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi1leGl0OgotCW5ld19kZW55X3RpbWUgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhpcHNfZGVmZmVyX21zKTsKLQlpZiAodGltZV9iZWZvcmUocHdycHJpdi0+aXBzX2RlbnlfdGltZSwgbmV3X2RlbnlfdGltZSkpCi0JCXB3cnByaXYtPmlwc19kZW55X3RpbWUgPSBuZXdfZGVueV90aW1lOwotCXJldHVybiByZXQ7Ci19Ci0KLWludCBydHdfcG1fc2V0X2xwczIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBtb2RlKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cmN0cmxwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKLQotCWlmIChtb2RlIDwgUFNfTU9ERV9OVU0pIHsKLQkJaWYgKHB3cmN0cmxwcml2LT5wb3dlcl9tZ250ICE9IG1vZGUpIHsKLQkJCWlmIChQU19NT0RFX0FDVElWRSA9PSBtb2RlKQotCQkJCUxlYXZlQWxsUG93ZXJTYXZlTW9kZTIzYShwYWRhcHRlcik7Ci0JCQllbHNlCi0JCQkJcHdyY3RybHByaXYtPkxwc0lkbGVDb3VudCA9IDI7Ci0JCQlwd3JjdHJscHJpdi0+cG93ZXJfbWdudCA9IG1vZGU7Ci0JCQlwd3JjdHJscHJpdi0+YkxlaXN1cmVQcyA9Ci0JCQkJKFBTX01PREVfQUNUSVZFICE9IHB3cmN0cmxwcml2LT5wb3dlcl9tZ250KSA/Ci0JCQkJdHJ1ZTpmYWxzZTsKLQkJfQotCX0gZWxzZQotCQlyZXQgPSAtRUlOVkFMOwotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IHJ0d19wbV9zZXRfaXBzMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IG1vZGUpCi17Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdyY3RybHByaXYgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwotCi0JaWYgKG1vZGUgIT0gSVBTX05PUk1BTCAmJiBtb2RlICE9IElQU19MRVZFTF8yICYmIG1vZGUgIT0gSVBTX05PTkUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcHdyY3RybHByaXYtPmlwc19tb2RlX3JlcSA9IG1vZGU7Ci0JaWYgKG1vZGUgPT0gSVBTX05PTkUpIHsKLQkJREJHXzg3MjNBKCIlcyAlc1xuIiwgX19mdW5jX18sICJJUFNfTk9ORSIpOwotCQlpZiAocGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgPT0gMCAmJgotCQkgICAgcnR3X3B3cl93YWtldXAocGFkYXB0ZXIpID09IF9GQUlMKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3JlY3YuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfcmVjdi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTBkYWJjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfcmVjdi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEyIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX1JUV19SRUNWX0NfCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPHJlY3Zfb3NkZXAuaD4KLSNpbmNsdWRlIDxtbG1lX29zZGVwLmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgotI2luY2x1ZGUgPHVzYl9vcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9pZWVlODAyMTEuaD4KLSNpbmNsdWRlIDx3aWZpLmg+Ci0jaW5jbHVkZSA8cnRsODcyM2FfcmVjdi5oPgotI2luY2x1ZGUgPHJ0bDg3MjNhX3htaXQuaD4KLQotdm9pZCBydHdfc2lnbmFsX3N0YXRfdGltZXJfaGRsMjNhKHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci0KLXZvaWQgX3J0d19pbml0X3N0YV9yZWN2X3ByaXYyM2Eoc3RydWN0IHN0YV9yZWN2X3ByaXYgKnBzdGFfcmVjdnByaXYpCi17Ci0KLQotCi0Jc3Bpbl9sb2NrX2luaXQoJnBzdGFfcmVjdnByaXYtPmxvY2spOwotCi0JLyogZm9yIChpID0gMDsgaTxNQVhfUlhfTlVNQkxLUzsgaSsrKSAqLwotCS8qCV9ydHdfaW5pdF9xdWV1ZTIzYSgmcHN0YV9yZWN2cHJpdi0+YmxrX3N0cm1zW2ldKTsgKi8KLQotCV9ydHdfaW5pdF9xdWV1ZTIzYSgmcHN0YV9yZWN2cHJpdi0+ZGVmcmFnX3EpOwotCi0KLX0KLQotaW50IF9ydHdfaW5pdF9yZWN2X3ByaXYyM2Eoc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2LAotCQkJc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZTsKLQlpbnQgaTsKLQlpbnQgcmVzID0gX1NVQ0NFU1M7Ci0KLQlzcGluX2xvY2tfaW5pdCgmcHJlY3Zwcml2LT5sb2NrKTsKLQotCV9ydHdfaW5pdF9xdWV1ZTIzYSgmcHJlY3Zwcml2LT5mcmVlX3JlY3ZfcXVldWUpOwotCV9ydHdfaW5pdF9xdWV1ZTIzYSgmcHJlY3Zwcml2LT5yZWN2X3BlbmRpbmdfcXVldWUpOwotCV9ydHdfaW5pdF9xdWV1ZTIzYSgmcHJlY3Zwcml2LT51Y19zd2RlY19wZW5kaW5nX3F1ZXVlKTsKLQotCXByZWN2cHJpdi0+YWRhcHRlciA9IHBhZGFwdGVyOwotCi0JZm9yIChpID0gMDsgaSA8IE5SX1JFQ1ZGUkFNRSA7IGkrKykgewotCQlwcmVjdmZyYW1lID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJlY3ZfZnJhbWUpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFwcmVjdmZyYW1lKQotCQkJYnJlYWs7Ci0JCUlOSVRfTElTVF9IRUFEKCZwcmVjdmZyYW1lLT5saXN0KTsKLQotCQlsaXN0X2FkZF90YWlsKCZwcmVjdmZyYW1lLT5saXN0LAotCQkJICAgICAgJnByZWN2cHJpdi0+ZnJlZV9yZWN2X3F1ZXVlLnF1ZXVlKTsKLQotCQlwcmVjdmZyYW1lLT5hZGFwdGVyID0gcGFkYXB0ZXI7Ci0JCXByZWN2ZnJhbWUrKzsKLQl9Ci0KLQlwcmVjdnByaXYtPmZyZWVfcmVjdmZyYW1lX2NudCA9IGk7Ci0JcHJlY3Zwcml2LT5yeF9wZW5kaW5nX2NudCA9IDE7Ci0KLQlyZXMgPSBydGw4NzIzYXVfaW5pdF9yZWN2X3ByaXYocGFkYXB0ZXIpOwotCi0Jc2V0dXBfdGltZXIoJnByZWN2cHJpdi0+c2lnbmFsX3N0YXRfdGltZXIsIHJ0d19zaWduYWxfc3RhdF90aW1lcl9oZGwyM2EsCi0JCSAgICAodW5zaWduZWQgbG9uZylwYWRhcHRlcik7Ci0KLQlwcmVjdnByaXYtPnNpZ25hbF9zdGF0X3NhbXBsaW5nX2ludGVydmFsID0gMTAwMDsgLyogbXMgKi8KLQotCXJ0d19zZXRfc2lnbmFsX3N0YXRfdGltZXIocHJlY3Zwcml2KTsKLQotCXJldHVybiByZXM7Ci19Ci0KLXZvaWQgX3J0d19mcmVlX3JlY3ZfcHJpdjIzYShzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IHByZWN2cHJpdi0+YWRhcHRlcjsKLQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwgKnB0bXA7Ci0KLQlydHdfZnJlZV91Y19zd2RlY19wZW5kaW5nX3F1ZXVlMjNhKHBhZGFwdGVyKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwcmVjdmZyYW1lLCBwdG1wLAotCQkJCSAmcHJlY3Zwcml2LT5mcmVlX3JlY3ZfcXVldWUucXVldWUsIGxpc3QpIHsKLQkJbGlzdF9kZWxfaW5pdCgmcHJlY3ZmcmFtZS0+bGlzdCk7Ci0JCWtmcmVlKHByZWN2ZnJhbWUpOwotCX0KLQotCXJ0bDg3MjNhdV9mcmVlX3JlY3ZfcHJpdihwYWRhcHRlcik7Ci19Ci0KLXN0cnVjdCByZWN2X2ZyYW1lICpydHdfYWxsb2NfcmVjdmZyYW1lMjNhKHN0cnVjdCBydHdfcXVldWUgKnBmcmVlX3JlY3ZfcXVldWUpCi17Ci0Jc3RydWN0IHJlY3ZfZnJhbWUgKnBmcmFtZTsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyOwotCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdjsKLQotCXNwaW5fbG9ja19iaCgmcGZyZWVfcmVjdl9xdWV1ZS0+bG9jayk7Ci0KLQlwZnJhbWUgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJnBmcmVlX3JlY3ZfcXVldWUtPnF1ZXVlLAotCQkJCQkgIHN0cnVjdCByZWN2X2ZyYW1lLCBsaXN0KTsKLQlpZiAocGZyYW1lKSB7Ci0JCWxpc3RfZGVsX2luaXQoJnBmcmFtZS0+bGlzdCk7Ci0JCXBhZGFwdGVyID0gcGZyYW1lLT5hZGFwdGVyOwotCQlpZiAocGFkYXB0ZXIpIHsKLQkJCXByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7Ci0JCQlpZiAocGZyZWVfcmVjdl9xdWV1ZSA9PSAmcHJlY3Zwcml2LT5mcmVlX3JlY3ZfcXVldWUpCi0JCQkJcHJlY3Zwcml2LT5mcmVlX3JlY3ZmcmFtZV9jbnQtLTsKLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrX2JoKCZwZnJlZV9yZWN2X3F1ZXVlLT5sb2NrKTsKLQotCXJldHVybiBwZnJhbWU7Ci19Ci0KLWludCBydHdfZnJlZV9yZWN2ZnJhbWUyM2Eoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IHByZWN2ZnJhbWUtPmFkYXB0ZXI7Ci0Jc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2ID0gJnBhZGFwdGVyLT5yZWN2cHJpdjsKLQlzdHJ1Y3QgcnR3X3F1ZXVlICpwZnJlZV9yZWN2X3F1ZXVlOwotCi0JaWYgKHByZWN2ZnJhbWUtPnBrdCkgewotCQlkZXZfa2ZyZWVfc2tiX2FueShwcmVjdmZyYW1lLT5wa3QpOy8qIGZyZWUgc2tiIGJ5IGRyaXZlciAqLwotCQlwcmVjdmZyYW1lLT5wa3QgPSBOVUxMOwotCX0KLQotCXBmcmVlX3JlY3ZfcXVldWUgPSAmcHJlY3Zwcml2LT5mcmVlX3JlY3ZfcXVldWU7Ci0Jc3Bpbl9sb2NrX2JoKCZwZnJlZV9yZWN2X3F1ZXVlLT5sb2NrKTsKLQotCWxpc3RfZGVsX2luaXQoJnByZWN2ZnJhbWUtPmxpc3QpOwotCi0JbGlzdF9hZGRfdGFpbCgmcHJlY3ZmcmFtZS0+bGlzdCwgZ2V0X2xpc3RfaGVhZChwZnJlZV9yZWN2X3F1ZXVlKSk7Ci0KLQlpZiAocGFkYXB0ZXIpIHsKLQkJaWYgKHBmcmVlX3JlY3ZfcXVldWUgPT0gJnByZWN2cHJpdi0+ZnJlZV9yZWN2X3F1ZXVlKQotCQkJcHJlY3Zwcml2LT5mcmVlX3JlY3ZmcmFtZV9jbnQrKzsKLQl9Ci0KLQlzcGluX3VubG9ja19iaCgmcGZyZWVfcmVjdl9xdWV1ZS0+bG9jayk7Ci0KLQotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1pbnQgcnR3X2VucXVldWVfcmVjdmZyYW1lMjNhKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCBzdHJ1Y3QgcnR3X3F1ZXVlICpxdWV1ZSkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gcHJlY3ZmcmFtZS0+YWRhcHRlcjsKLQlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYgPSAmcGFkYXB0ZXItPnJlY3Zwcml2OwotCi0Jc3Bpbl9sb2NrX2JoKCZxdWV1ZS0+bG9jayk7Ci0KLQlsaXN0X2RlbF9pbml0KCZwcmVjdmZyYW1lLT5saXN0KTsKLQotCWxpc3RfYWRkX3RhaWwoJnByZWN2ZnJhbWUtPmxpc3QsIGdldF9saXN0X2hlYWQocXVldWUpKTsKLQotCWlmIChwYWRhcHRlcikgewotCQlpZiAocXVldWUgPT0gJnByZWN2cHJpdi0+ZnJlZV9yZWN2X3F1ZXVlKQotCQkJcHJlY3Zwcml2LT5mcmVlX3JlY3ZmcmFtZV9jbnQrKzsKLQl9Ci0KLQlzcGluX3VubG9ja19iaCgmcXVldWUtPmxvY2spOwotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi0vKgotY2FsbGVyIDogZGVmcmFnIDsgcmVjdmZyYW1lX2Noa19kZWZyYWcyM2EgaW4gcmVjdl90aHJlYWQgIChwYXNzaXZlKQotcGZyYW1lcXVldWU6IGRlZnJhZ19xdWV1ZSA6IHdpbGwgYmUgYWNjZXNzZWQgaW4gcmVjdl90aHJlYWQgIChwYXNzaXZlKQotCi11c2luZyBzcGlubG9jayB0byBwcm90ZWN0Ci0KLSovCi0KLXN0YXRpYyB2b2lkIHJ0d19mcmVlX3JlY3ZmcmFtZTIzYV9xdWV1ZShzdHJ1Y3QgcnR3X3F1ZXVlICpwZnJhbWVxdWV1ZSkKLXsKLQlzdHJ1Y3QgcmVjdl9mcmFtZSAqaGRyLCAqcHRtcDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQotCXNwaW5fbG9jaygmcGZyYW1lcXVldWUtPmxvY2spOwotCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwZnJhbWVxdWV1ZSk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhkciwgcHRtcCwgcGhlYWQsIGxpc3QpCi0JCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYShoZHIpOwotCXNwaW5fdW5sb2NrKCZwZnJhbWVxdWV1ZS0+bG9jayk7Ci19Ci0KLXUzMiBydHdfZnJlZV91Y19zd2RlY19wZW5kaW5nX3F1ZXVlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcikKLXsKLQl1MzIgY250ID0gMDsKLQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcGVuZGluZ19mcmFtZTsKLQotCXdoaWxlICgocGVuZGluZ19mcmFtZSA9IHJ0d19hbGxvY19yZWN2ZnJhbWUyM2EoJmFkYXB0ZXItPnJlY3Zwcml2LnVjX3N3ZGVjX3BlbmRpbmdfcXVldWUpKSkgewotCQlydHdfZnJlZV9yZWN2ZnJhbWUyM2EocGVuZGluZ19mcmFtZSk7Ci0JCURCR184NzIzQSgiJXM6IGRlcXVldWUgdWNfc3dkZWNfcGVuZGluZ19xdWV1ZVxuIiwgX19mdW5jX18pOwotCQljbnQrKzsKLQl9Ci0KLQlyZXR1cm4gY250OwotfQotCi1zdHJ1Y3QgcmVjdl9idWYgKnJ0d19kZXF1ZXVlX3JlY3ZidWYyM2EgKHN0cnVjdCBydHdfcXVldWUgKnF1ZXVlKQotewotCXVuc2lnbmVkIGxvbmcgaXJxTDsKLQlzdHJ1Y3QgcmVjdl9idWYgKnByZWN2YnVmOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnF1ZXVlLT5sb2NrLCBpcnFMKTsKLQotCXByZWN2YnVmID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZxdWV1ZS0+cXVldWUsCi0JCQkJCSAgICBzdHJ1Y3QgcmVjdl9idWYsIGxpc3QpOwotCWlmIChwcmVjdmJ1ZikKLQkJbGlzdF9kZWxfaW5pdCgmcHJlY3ZidWYtPmxpc3QpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWUtPmxvY2ssIGlycUwpOwotCi0JcmV0dXJuIHByZWN2YnVmOwotfQotCi1pbnQgcmVjdmZyYW1lX2Noa21pYyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCSAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpOwotaW50IHJlY3ZmcmFtZV9jaGttaWMoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lKSB7Ci0KLQlpbnQJaSwgcmVzID0gX1NVQ0NFU1M7Ci0JdTMyCWRhdGFsZW47Ci0JdTgJbWljY29kZVs4XTsKLQl1OAlibWljX2VyciA9IGZhbHNlLCBicnB0X21pY2Vycm9yID0gdHJ1ZTsKLQl1OAkqcGZyYW1lLCAqcGF5bG9hZCwgKnBmcmFtZW1pYzsKLQl1OAkqbWlja2V5OwotCXN0cnVjdAlzdGFfaW5mbyAqc3RhaW5mbzsKLQlzdHJ1Y3QJcnhfcGt0X2F0dHJpYiAqcHJ4YXR0cmliID0gJnByZWN2ZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3QJc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0KLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQotCXN0YWluZm8gPSBydHdfZ2V0X3N0YWluZm8yM2EoJmFkYXB0ZXItPnN0YXByaXYsICZwcnhhdHRyaWItPnRhWzBdKTsKLQotCWlmIChwcnhhdHRyaWItPmVuY3J5cHQgPT0gV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJCSAicmVjdmZyYW1lX2Noa21pYzpwcnhhdHRyaWItPmVuY3J5cHQgPT0gV0xBTl9DSVBIRVJfU1VJVEVfVEtJUFxuIik7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJICJyZWN2ZnJhbWVfY2hrbWljOmRhID0gJXBNXG4iLCBwcnhhdHRyaWItPnJhKTsKLQotCQkvKiBjYWxjdWxhdGUgbWljIGNvZGUgKi8KLQkJaWYgKHN0YWluZm8gIT0gTlVMTCkgewotCQkJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHByeGF0dHJpYi0+cmEpKSB7Ci0JCQkJbWlja2V5ID0gJnBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnByeG1pY2tleVtwcnhhdHRyaWItPmtleV9pbmRleF0uc2tleVswXTsKLQotCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJCQkgInJlY3ZmcmFtZV9jaGttaWM6IGJjbWMga2V5XG4iKTsKLQotCQkJCWlmICghcHNlY3VyaXR5cHJpdi0+Ymluc3RhbGxHcnBrZXkpIHsKLQkJCQkJcmVzID0gX0ZBSUw7Ci0JCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLAotCQkJCQkJIF9kcnZfZXJyXywKLQkJCQkJCSAicmVjdmZyYW1lX2Noa21pYzpkaWRuJ3QgaW5zdGFsbCBncm91cCBrZXkhXG4iKTsKLQkJCQkJREJHXzg3MjNBKCJcbiByZWN2ZnJhbWVfY2hrbWljOmRpZG4ndCAiCi0JCQkJCQkgICJpbnN0YWxsIGdyb3VwIGtleSEhISEhIVxuIik7Ci0JCQkJCWdvdG8gZXhpdDsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCW1pY2tleSA9ICZzdGFpbmZvLT5kb3QxMXRraXByeG1pY2tleS5za2V5WzBdOwotCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJCSAicmVjdmZyYW1lX2Noa21pYzogdW5pY2FzdCBrZXlcbiIpOwotCQkJfQotCi0JCQkvKiBpY3ZfbGVuIGluY2x1ZGVkIHRoZSBtaWMgY29kZSAqLwotCQkJZGF0YWxlbiA9IHByZWN2ZnJhbWUtPnBrdC0+bGVuLXByeGF0dHJpYi0+Ci0JCQkJaGRybGVuLXByeGF0dHJpYi0+aXZfbGVuLXByeGF0dHJpYi0+aWN2X2xlbiAtIDg7Ci0JCQlwZnJhbWUgPSBwcmVjdmZyYW1lLT5wa3QtPmRhdGE7Ci0JCQlwYXlsb2FkID0gcGZyYW1lICsgcHJ4YXR0cmliLT5oZHJsZW4gKwotCQkJCXByeGF0dHJpYi0+aXZfbGVuOwotCi0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJCQkgInByeGF0dHJpYi0+aXZfbGVuID0lZCBwcnhhdHRyaWItPmljdl9sZW4gPSVkXG4iLAotCQkJCSBwcnhhdHRyaWItPml2X2xlbiwgcHJ4YXR0cmliLT5pY3ZfbGVuKTsKLQotCQkJLyogY2FyZSB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhICovCi0JCQlydHdfc2VjY2FsY3RraXBtaWMyM2EobWlja2V5LCBwZnJhbWUsIHBheWxvYWQsCi0JCQkJCSAgIGRhdGFsZW4sICZtaWNjb2RlWzBdLAotCQkJCQkgICAodW5zaWduZWQgY2hhcilwcnhhdHRyaWItPnByaW9yaXR5KTsKLQotCQkJcGZyYW1lbWljID0gcGF5bG9hZCArIGRhdGFsZW47Ci0KLQkJCWJtaWNfZXJyID0gZmFsc2U7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJCQlpZiAobWljY29kZVtpXSAhPSAqKHBmcmFtZW1pYyArIGkpKSB7Ci0JCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLAotCQkJCQkJIF9kcnZfZXJyXywKLQkJCQkJCSAicmVjdmZyYW1lX2Noa21pYzptaWNjb2RlWyVkXSglMDJ4KSAhPSAqKHBmcmFtZW1pYyslZCkoJTAyeClcbiIsCi0JCQkJCQkgaSwgbWljY29kZVtpXSwKLQkJCQkJCSBpLCAqKHBmcmFtZW1pYyArIGkpKTsKLQkJCQkJYm1pY19lcnIgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGJtaWNfZXJyID09IHRydWUpIHsKLQkJCQlpbnQgaTsKLQotCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJCSAiKihwZnJhbWVtaWMtOCktKihwZnJhbWVtaWMtMSkgPSUqcGhDXG4iLAotCQkJCQkgOCwgcGZyYW1lbWljIC0gOCk7Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkJICIqKHBmcmFtZW1pYy0xNiktKihwZnJhbWVtaWMtOSkgPSUqcGhDXG4iLAotCQkJCQkgOCwgcGZyYW1lbWljIC0gMTYpOwotCi0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkJICI9PT09PT0gZGVtcCBwYWNrZXQgKGxlbiA9JWQpID09PT09PVxuIiwKLQkJCQkJIHByZWN2ZnJhbWUtPnBrdC0+bGVuKTsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgcHJlY3ZmcmFtZS0+cGt0LT5sZW47IGkgPSBpICsgOCkgewotCQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywKLQkJCQkJCSBfZHJ2X2Vycl8sICIlKnBoQ1xuIiwKLQkJCQkJCSA4LCBwcmVjdmZyYW1lLT5wa3QtPmRhdGEgKyBpKTsKLQkJCQl9Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkJICI9PT09PT0gZGVtcCBwYWNrZXQgZW5kIFtsZW4gPSVkXT09PT09PVxuIiwKLQkJCQkJIHByZWN2ZnJhbWUtPnBrdC0+bGVuKTsKLQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCQkgImhyZGxlbiA9JWRcbiIsIHByeGF0dHJpYi0+aGRybGVuKTsKLQotCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJCSAicmEgPSAlcE0gcHNlY3VyaXR5cHJpdi0+Ymluc3RhbGxHcnBrZXkgPSVkXG4iLAotCQkJCQkgcHJ4YXR0cmliLT5yYSwKLQkJCQkJIHBzZWN1cml0eXByaXYtPmJpbnN0YWxsR3Jwa2V5KTsKLQotCQkJCS8qICBkb3VibGUgY2hlY2sga2V5X2luZGV4IGZvciBzb21lIHRpbWluZwotCQkJCSAgICBpc3N1ZSwgY2Fubm90IGNvbXBhcmUgd2l0aAotCQkJCSAgICBwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwS2V5aWQgYWxzbwotCQkJCSAgICBjYXVzZSB0aW1pbmcgaXNzdWUgKi8KLQkJCQlpZiAoKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHByeGF0dHJpYi0+cmEpKSAmJgotCQkJCSAgICAocHJ4YXR0cmliLT5rZXlfaW5kZXggIT0KLQkJCQkgICAgIHBtbG1laW5mby0+a2V5X2luZGV4KSkKLQkJCQkJYnJwdF9taWNlcnJvciA9IGZhbHNlOwotCi0JCQkJaWYgKChwcnhhdHRyaWItPmJkZWNyeXB0ZWQgPT0gdHJ1ZSkgJiYKLQkJCQkgICAgKGJycHRfbWljZXJyb3IgPT0gdHJ1ZSkpIHsKLQkJCQkJcnR3X2hhbmRsZV90a2lwX21pY19lcnIyM2EoYWRhcHRlciwgKHU4KWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHByeGF0dHJpYi0+cmEpKTsKLQkJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkJCSAibWljIGVycm9yIDpwcnhhdHRyaWItPmJkZWNyeXB0ZWQgPSVkXG4iLAotCQkJCQkJIHByeGF0dHJpYi0+YmRlY3J5cHRlZCk7Ci0JCQkJCURCR184NzIzQSgiIG1pYyBlcnJvciA6cHJ4YXR0cmliLT4iCi0JCQkJCQkgICJiZGVjcnlwdGVkID0lZFxuIiwKLQkJCQkJCSAgcHJ4YXR0cmliLT5iZGVjcnlwdGVkKTsKLQkJCQl9IGVsc2UgewotCQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywKLQkJCQkJCSBfZHJ2X2Vycl8sCi0JCQkJCQkgIm1pYyBlcnJvciA6cHJ4YXR0cmliLT5iZGVjcnlwdGVkID0lZFxuIiwKLQkJCQkJCSBwcnhhdHRyaWItPmJkZWNyeXB0ZWQpOwotCQkJCQlEQkdfODcyM0EoIiBtaWMgZXJyb3IgOnByeGF0dHJpYi0+IgotCQkJCQkJICAiYmRlY3J5cHRlZCA9JWRcbiIsCi0JCQkJCQkgIHByeGF0dHJpYi0+YmRlY3J5cHRlZCk7Ci0JCQkJfQotCi0JCQkJcmVzID0gX0ZBSUw7Ci0JCQl9IGVsc2UgewotCQkJCS8qIG1pYyBjaGVja2VkIG9rICovCi0JCQkJaWYgKCFwc2VjdXJpdHlwcml2LT5iY2hlY2tfZ3Jwa2V5ICYmCi0JCQkJICAgIGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHByeGF0dHJpYi0+cmEpKSB7Ci0JCQkJCXBzZWN1cml0eXByaXYtPmJjaGVja19ncnBrZXkgPSAxOwotCQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywKLQkJCQkJCSBfZHJ2X2Vycl8sCi0JCQkJCQkgInBzZWN1cml0eXByaXYtPmJjaGVja19ncnBrZXkgPSB0cnVlXG4iKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAicmVjdmZyYW1lX2Noa21pYzogcnR3X2dldF9zdGFpbmZvMjNhID09TlVMTCEhIVxuIik7Ci0JCX0KLQotCQlza2JfdHJpbShwcmVjdmZyYW1lLT5wa3QsIHByZWN2ZnJhbWUtPnBrdC0+bGVuIC0gOCk7Ci0JfQotCi1leGl0OgotCi0KLQotCXJldHVybiByZXM7Ci19Ci0KLS8qIGRlY3J5cHQgYW5kIHNldCB0aGUgaXZsZW4sIGljdmxlbiBvZiB0aGUgcmVjdl9mcmFtZSAqLwotc3RydWN0IHJlY3ZfZnJhbWUgKmRlY3J5cHRvcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwotc3RydWN0IHJlY3ZfZnJhbWUgKmRlY3J5cHRvcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnByeGF0dHJpYiA9ICZwcmVjdl9mcmFtZS0+YXR0cmliOwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0Jc3RydWN0IHJlY3ZfZnJhbWUgKnJldHVybl9wYWNrZXQgPSBwcmVjdl9mcmFtZTsKLQlpbnQgcmVzID0gX1NVQ0NFU1M7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJICJwcnhzdGF0LT5kZWNyeXB0ZWQgPSV4IHByeGF0dHJpYi0+ZW5jcnlwdCA9IDB4JTAzeFxuIiwKLQkJIHByeGF0dHJpYi0+YmRlY3J5cHRlZCwgcHJ4YXR0cmliLT5lbmNyeXB0KTsKLQotCWlmIChwcnhhdHRyaWItPmVuY3J5cHQgPiAwKSB7Ci0JCXU4ICppdiA9IHByZWN2X2ZyYW1lLT5wa3QtPmRhdGEgKyBwcnhhdHRyaWItPmhkcmxlbjsKLQotCQlwcnhhdHRyaWItPmtleV9pbmRleCA9ICgoKGl2WzNdKSA+PiA2KSAmIDB4Myk7Ci0KLQkJaWYgKHByeGF0dHJpYi0+a2V5X2luZGV4ID4gV0VQX0tFWVMpIHsKLQkJCURCR184NzIzQSgicHJ4YXR0cmliLT5rZXlfaW5kZXgoJWQpID4gV0VQX0tFWVNcbiIsCi0JCQkJICBwcnhhdHRyaWItPmtleV9pbmRleCk7Ci0KLQkJCXN3aXRjaCAocHJ4YXR0cmliLT5lbmNyeXB0KSB7Ci0JCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgotCQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6Ci0JCQkJcHJ4YXR0cmliLT5rZXlfaW5kZXggPQotCQkJCQlwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lLZXlJbmRleDsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDoKLQkJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKLQkJCWRlZmF1bHQ6Ci0JCQkJcHJ4YXR0cmliLT5rZXlfaW5kZXggPQotCQkJCQlwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwS2V5aWQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoKHByeGF0dHJpYi0+ZW5jcnlwdCA+IDApICYmICgocHJ4YXR0cmliLT5iZGVjcnlwdGVkID09IDApKSkgewotCQlwc2VjdXJpdHlwcml2LT5od19kZWNyeXB0ZWQgPSAwOwotCQlzd2l0Y2ggKHByeGF0dHJpYi0+ZW5jcnlwdCkgewotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKLQkJCXJ0d193ZXBfZGVjcnlwdDIzYShwYWRhcHRlciwgcHJlY3ZfZnJhbWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDoKLQkJCXJlcyA9IHJ0d190a2lwX2RlY3J5cHQyM2EocGFkYXB0ZXIsIHByZWN2X2ZyYW1lKTsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6Ci0JCQlyZXMgPSBydHdfYWVzX2RlY3J5cHQyM2EocGFkYXB0ZXIsIHByZWN2X2ZyYW1lKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgaWYgKHByeGF0dHJpYi0+YmRlY3J5cHRlZCA9PSAxICYmIHByeGF0dHJpYi0+ZW5jcnlwdCA+IDAgJiYKLQkJICAgKHBzZWN1cml0eXByaXYtPmJ1c2V0a2lwa2V5ID09IDEgfHwKLQkJICAgIHByeGF0dHJpYi0+ZW5jcnlwdCAhPSBXTEFOX0NJUEhFUl9TVUlURV9US0lQKSkgewotCQkJcHNlY3VyaXR5cHJpdi0+aHdfZGVjcnlwdGVkID0gMTsKLQl9Ci0KLQlpZiAocmVzID09IF9GQUlMKSB7Ci0JCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYShyZXR1cm5fcGFja2V0KTsKLQkJcmV0dXJuX3BhY2tldCA9IE5VTEw7Ci0JfQotCi0KLQotCXJldHVybiByZXR1cm5fcGFja2V0OwotfQotCi0vKiBzZXQgdGhlIHNlY3VyaXR5IGluZm9ybWF0aW9uIGluIHRoZSByZWN2X2ZyYW1lICovCi1zdGF0aWMgc3RydWN0IHJlY3ZfZnJhbWUgKnBvcnRjdHJsKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJCQkgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0JdTggKnBzdGFfYWRkciwgKnB0cjsKLQl1aW50IGF1dGhfYWxnOwotCXN0cnVjdCByZWN2X2ZyYW1lICpwZmhkcjsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA7Ci0Jc3RydWN0IHJlY3ZfZnJhbWUgKnBydG5mcmFtZTsKLQl1MTYgZXRoZXJfdHlwZTsKLQl1MTYgZWFwb2xfdHlwZSA9IEVUSF9QX1BBRTsvKiBmb3IgRnVuaWEgQkQncyBXUEEgaXNzdWUgKi8KLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYjsKLQotCXBzdGFwcml2ID0gJmFkYXB0ZXItPnN0YXByaXY7Ci0KLQlhdXRoX2FsZyA9IGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMUF1dGhBbGdydGhtOwotCi0JcGZoZHIgPSBwcmVjdl9mcmFtZTsKLQlwYXR0cmliID0gJnBmaGRyLT5hdHRyaWI7Ci0JcHN0YV9hZGRyID0gcGF0dHJpYi0+dGE7Ci0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgcHN0YV9hZGRyKTsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkgIiMjIyMjIyMjcG9ydGN0cmw6YWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExQXV0aEFsZ3J0aG0gPSVkXG4iLAotCQkgYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExQXV0aEFsZ3J0aG0pOwotCi0JcHJ0bmZyYW1lID0gcHJlY3ZfZnJhbWU7Ci0KLQlpZiAoYXV0aF9hbGcgPT0gZG90MTFBdXRoQWxncnRobV84MDIxWCkgewotCQkvKiBnZXQgZXRoZXJfdHlwZSAqLwotCQlwdHIgPSBwZmhkci0+cGt0LT5kYXRhICsgcGZoZHItPmF0dHJpYi5oZHJsZW47Ci0KLQkJZXRoZXJfdHlwZSA9IChwdHJbNl0gPDwgOCkgfCBwdHJbN107Ci0KLQkJaWYgKHBzdGEgJiYgcHN0YS0+aWVlZTgwMjF4X2Jsb2NrZWQpIHsKLQkJCS8qIGJsb2NrZWQgKi8KLQkJCS8qIG9ubHkgYWNjZXB0IEVBUE9MIGZyYW1lICovCi0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJCQkgIiMjIyMjIyMjcG9ydGN0cmw6cHN0YS0+aWVlZTgwMjF4X2Jsb2NrZWQgPT0xXG4iKTsKLQotCQkJaWYgKGV0aGVyX3R5cGUgIT0gZWFwb2xfdHlwZSkgewotCQkJCS8qIGZyZWUgdGhpcyBmcmFtZSAqLwotCQkJCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYShwcmVjdl9mcmFtZSk7Ci0JCQkJcHJ0bmZyYW1lID0gTlVMTDsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiBwcnRuZnJhbWU7Ci19Ci0KLWludCByZWN2X2RlY2FjaGUoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lLCB1OCBicmV0cnksCi0JCSBzdHJ1Y3Qgc3RhaW5mb19yeGNhY2hlICpwcnhjYWNoZSk7Ci1pbnQgcmVjdl9kZWNhY2hlKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSwgdTggYnJldHJ5LAotCQkgc3RydWN0IHN0YWluZm9fcnhjYWNoZSAqcHJ4Y2FjaGUpCi17Ci0JaW50IHRpZCA9IHByZWN2X2ZyYW1lLT5hdHRyaWIucHJpb3JpdHk7Ci0KLQl1MTYgc2VxX2N0cmwgPSAoKHByZWN2X2ZyYW1lLT5hdHRyaWIuc2VxX251bSAmIDB4ZmZmZikgPDwgNCkgfAotCQkocHJlY3ZfZnJhbWUtPmF0dHJpYi5mcmFnX251bSAmIDB4Zik7Ci0KLQotCi0JaWYgKHRpZCA+IDE1KSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X25vdGljZV8sCi0JCQkgInJlY3ZfZGVjYWNoZSwgKHRpZD4xNSkhIHNlcV9jdHJsID0gMHgleCwgdGlkID0gMHgleFxuIiwKLQkJCSBzZXFfY3RybCwgdGlkKTsKLQotCQlyZXR1cm4gX0ZBSUw7Ci0JfQotCi0JaWYgKDEpIHsgLyogaWYgKGJyZXRyeSkgKi8KLQkJaWYgKHNlcV9jdHJsID09IHByeGNhY2hlLT50aWRfcnhzZXFbdGlkXSkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfbm90aWNlXywKLQkJCQkgInJlY3ZfZGVjYWNoZSwgc2VxX2N0cmwgPSAweCV4LCB0aWQgPSAweCV4LCB0aWRfcnhzZXEgPSAweCV4XG4iLAotCQkJCSBzZXFfY3RybCwgdGlkLCBwcnhjYWNoZS0+dGlkX3J4c2VxW3RpZF0pOwotCi0JCQlyZXR1cm4gX0ZBSUw7Ci0JCX0KLQl9Ci0KLQlwcnhjYWNoZS0+dGlkX3J4c2VxW3RpZF0gPSBzZXFfY3RybDsKLQotCi0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXZvaWQgcHJvY2VzczIzYV9wd3JiaXRfZGF0YShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci12b2lkIHByb2Nlc3MyM2FfcHdyYml0X2RhdGEoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0JdW5zaWduZWQgY2hhciBwd3JiaXQ7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByZWN2X2ZyYW1lLT5wa3Q7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJlY3ZfZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQotCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIHBhdHRyaWItPnNyYyk7Ci0KLQlpZiAocHN0YSkgewotCQlwd3JiaXQgPSBpZWVlODAyMTFfaGFzX3BtKGhkci0+ZnJhbWVfY29udHJvbCk7Ci0KLQkJaWYgKHB3cmJpdCkgewotCQkJaWYgKCEocHN0YS0+c3RhdGUgJiBXSUZJX1NMRUVQX1NUQVRFKSkKLQkJCQlzdG9wX3N0YV94bWl0MjNhKHBhZGFwdGVyLCBwc3RhKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChwc3RhLT5zdGF0ZSAmIFdJRklfU0xFRVBfU1RBVEUpCi0JCQkJd2FrZXVwX3N0YV90b194bWl0MjNhKHBhZGFwdGVyLCBwc3RhKTsKLQkJfQotCX0KLQotI2VuZGlmCi19Ci0KLXZvaWQgcHJvY2Vzc193bW1wc19kYXRhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwotdm9pZCBwcm9jZXNzX3dtbXBzX2RhdGEoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmVjdl9mcmFtZS0+YXR0cmliOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCi0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgcGF0dHJpYi0+c3JjKTsKLQotCWlmICghcHN0YSkKLQkJcmV0dXJuOwotCi0KLQlpZiAoIXBzdGEtPnFvc19vcHRpb24pCi0JCXJldHVybjsKLQotCWlmICghKHBzdGEtPnFvc19pbmZvICYgMHhmKSkKLQkJcmV0dXJuOwotCi0JaWYgKHBzdGEtPnN0YXRlICYgV0lGSV9TTEVFUF9TVEFURSkgewotCQl1OCB3bW1wc19hYyA9IDA7Ci0KLQkJc3dpdGNoIChwYXR0cmliLT5wcmlvcml0eSkgewotCQljYXNlIDE6Ci0JCWNhc2UgMjoKLQkJCXdtbXBzX2FjID0gcHN0YS0+dWFwc2RfYmsgJiBCSVQoMSk7Ci0JCQlicmVhazsKLQkJY2FzZSA0OgotCQljYXNlIDU6Ci0JCQl3bW1wc19hYyA9IHBzdGEtPnVhcHNkX3ZpICYgQklUKDEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgNjoKLQkJY2FzZSA3OgotCQkJd21tcHNfYWMgPSBwc3RhLT51YXBzZF92byAmIEJJVCgxKTsKLQkJCWJyZWFrOwotCQljYXNlIDA6Ci0JCWNhc2UgMzoKLQkJZGVmYXVsdDoKLQkJCXdtbXBzX2FjID0gcHN0YS0+dWFwc2RfYmUgJiBCSVQoMSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmICh3bW1wc19hYykgewotCQkJaWYgKHBzdGEtPnNsZWVwcV9hY19sZW4gPiAwKSB7Ci0JCQkJLyogcHJvY2VzcyByZWNlaXZlZCB0cmlnZ2VyZWQgZnJhbWUgKi8KLQkJCQl4bWl0X2RlbGl2ZXJ5X2VuYWJsZWRfZnJhbWVzMjNhKHBhZGFwdGVyLCBwc3RhKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogaXNzdWUgb25lIHFvcyBudWxsIGZyYW1lIHdpdGggTW9yZSBkYXRhIGJpdCA9IDAgYW5kIHRoZSBFT1NQIGJpdCBzZXQgKD0gMSkgKi8KLQkJCQlpc3N1ZV9xb3NfbnVsbGRhdGEyM2EocGFkYXB0ZXIsIHBzdGEtPmh3YWRkciwKLQkJCQkJCSAgICh1MTYpcGF0dHJpYi0+cHJpb3JpdHksCi0JCQkJCQkgICAwLCAwKTsKLQkJCX0KLQkJfQotCX0KLQotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIGNvdW50X3J4X3N0YXRzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJmcmFtZSwgc3RydWN0IHN0YV9pbmZvICpzdGEpCi17Ci0JaW50IHN6OwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IE5VTEw7Ci0Jc3RydWN0IHN0YWluZm9fc3RhdHMgKnBzdGF0cyA9IE5VTEw7Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmIHByZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYgPSAmcGFkYXB0ZXItPnJlY3Zwcml2OwotCi0Jc3ogPSBwcmZyYW1lLT5wa3QtPmxlbjsKLQlwcmVjdnByaXYtPnJ4X2J5dGVzICs9IHN6OwotCi0JcGFkYXB0ZXItPm1sbWVwcml2LkxpbmtEZXRlY3RJbmZvLk51bVJ4T2tJblBlcmlvZCsrOwotCi0JaWYgKCghaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIocGF0dHJpYi0+ZHN0KSkgJiYKLQkgICAgKCFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5kc3QpKSkKLQkJcGFkYXB0ZXItPm1sbWVwcml2LkxpbmtEZXRlY3RJbmZvLk51bVJ4VW5pY2FzdE9rSW5QZXJpb2QrKzsKLQotCWlmIChzdGEpCi0JCXBzdGEgPSBzdGE7Ci0JZWxzZQotCQlwc3RhID0gcHJmcmFtZS0+cHN0YTsKLQotCWlmIChwc3RhKSB7Ci0JCXBzdGF0cyA9ICZwc3RhLT5zdGFfc3RhdHM7Ci0KLQkJcHN0YXRzLT5yeF9kYXRhX3BrdHMrKzsKLQkJcHN0YXRzLT5yeF9ieXRlcyArPSBzejsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgc3RhMnN0YV9kYXRhX2ZyYW1lKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJCSAgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSwKLQkJCSAgICAgIHN0cnVjdCBzdGFfaW5mbyoqcHN0YSkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZfZnJhbWUtPnBrdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKLQlpbnQgcmV0ID0gX1NVQ0NFU1M7Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmIHByZWN2X2ZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKLQl1OCAqbXlic3NpZCAgPSBnZXRfYnNzaWQocG1sbWVwcml2KTsKLQl1OCAqbXlod2FkZHIgPSBteWlkKCZhZGFwdGVyLT5lZXByb21wcml2KTsKLQl1OCAqc3RhX2FkZHIgPSBOVUxMOwotCWludCBibWNhc3QgPSBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5kc3QpOwotCi0KLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19TVEFURSkgfHwKLQkgICAgY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFKSkgewotCi0JCS8qICBmaWx0ZXIgcGFja2V0cyB0aGF0IFNBIGlzIG15c2VsZiBvciBtdWx0aWNhc3Qgb3IgYnJvYWRjYXN0ICovCi0JCWlmIChldGhlcl9hZGRyX2VxdWFsKG15aHdhZGRyLCBwYXR0cmliLT5zcmMpKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAiU0EgPT0gbXlzZWxmXG4iKTsKLQkJCXJldCA9IF9GQUlMOwotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJaWYgKCFldGhlcl9hZGRyX2VxdWFsKG15aHdhZGRyLCBwYXR0cmliLT5kc3QpICYmICFibWNhc3QpIHsKLQkJCXJldCA9IF9GQUlMOwotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJaWYgKGV0aGVyX2FkZHJfZXF1YWwocGF0dHJpYi0+YnNzaWQsICJceDBceDBceDBceDBceDBceDAiKSB8fAotCQkgICAgZXRoZXJfYWRkcl9lcXVhbChteWJzc2lkLCAiXHgwXHgwXHgwXHgwXHgwXHgwIikgfHwKLQkJICAgICFldGhlcl9hZGRyX2VxdWFsKHBhdHRyaWItPmJzc2lkLCBteWJzc2lkKSkgewotCQkJcmV0ID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCQlzdGFfYWRkciA9IHBhdHRyaWItPnNyYzsKLQl9IGVsc2UgaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpKSB7Ci0JCS8qICBGb3IgU3RhdGlvbiBtb2RlLCBzYSBhbmQgYnNzaWQgc2hvdWxkIGFsd2F5cyBiZSBCU1NJRCwKLQkJICAgIGFuZCBEQSBpcyBteSBtYWMtYWRkcmVzcyAqLwotCQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwocGF0dHJpYi0+YnNzaWQsIHBhdHRyaWItPnNyYykpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJic3NpZCAhPSBUQSB1bmRlciBTVEFUSU9OX01PREU7IGRyb3AgcGt0XG4iKTsKLQkJCXJldCA9IF9GQUlMOwotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJc3RhX2FkZHIgPSBwYXR0cmliLT5ic3NpZDsKLQotCX0gZWxzZSBpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpKSB7Ci0JCWlmIChibWNhc3QpIHsKLQkJCS8qICBGb3IgQVAgbW9kZSwgaWYgREEgPT0gTUNBU1QsIHRoZW4gQlNTSUQgc2hvdWxkIGJlIGFsc28gTUNBU1QgKi8KLQkJCWlmICghaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocGF0dHJpYi0+YnNzaWQpKSB7Ci0JCQkJcmV0ID0gX0ZBSUw7Ci0JCQkJZ290byBleGl0OwotCQkJfQotCQl9IGVsc2UgeyAvKiAgbm90IG1jLWZyYW1lICovCi0JCQkvKiAgRm9yIEFQIG1vZGUsIGlmIERBIGlzIG5vbi1NQ0FTVCwgdGhlbiBpdCBtdXN0Ci0JCQkgICAgYmUgQlNTSUQsIGFuZCBic3NpZCA9PSBCU1NJRCAqLwotCQkJaWYgKCFldGhlcl9hZGRyX2VxdWFsKHBhdHRyaWItPmJzc2lkLCBwYXR0cmliLT5kc3QpKSB7Ci0JCQkJcmV0ID0gX0ZBSUw7Ci0JCQkJZ290byBleGl0OwotCQkJfQotCi0JCQlzdGFfYWRkciA9IHBhdHRyaWItPnNyYzsKLQkJfQotCX0gZWxzZSBpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfTVBfU1RBVEUpKSB7Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT5kc3QsIGhkci0+YWRkcjEpOwotCQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+c3JjLCBoZHItPmFkZHIyKTsKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPmJzc2lkLCBoZHItPmFkZHIzKTsKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPnJhLCBwYXR0cmliLT5kc3QpOwotCQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+dGEsIHBhdHRyaWItPnNyYyk7Ci0KLQkJc3RhX2FkZHIgPSBteWJzc2lkOwotCX0gZWxzZSB7Ci0JCXJldCAgPSBfRkFJTDsKLQl9Ci0KLQlpZiAoYm1jYXN0KQotCQkqcHN0YSA9IHJ0d19nZXRfYmNtY19zdGFpbmZvMjNhKGFkYXB0ZXIpOwotCWVsc2UKLQkJKnBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIHN0YV9hZGRyKTsgLyogIGdldCBhcF9pbmZvICovCi0KLQlpZiAoKnBzdGEgPT0gTlVMTCkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJICJjYW4ndCBnZXQgcHN0YSB1bmRlciBzdGEyc3RhX2RhdGFfZnJhbWUgOyBkcm9wIHBrdFxuIik7Ci0JCXJldCA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi1leGl0OgotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IGFwMnN0YV9kYXRhX2ZyYW1lKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lLAotCQkgICAgICBzdHJ1Y3Qgc3RhX2luZm8gKipwc3RhKTsKLWludCBhcDJzdGFfZGF0YV9mcmFtZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCSAgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSwKLQkJICAgICAgc3RydWN0IHN0YV9pbmZvICoqcHN0YSkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZfZnJhbWUtPnBrdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICYgcHJlY3ZfZnJhbWUtPmF0dHJpYjsKLQlpbnQgcmV0ID0gX1NVQ0NFU1M7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKLQl1OCAqbXlic3NpZCAgPSBnZXRfYnNzaWQocG1sbWVwcml2KTsKLQl1OCAqbXlod2FkZHIgPSBteWlkKCZhZGFwdGVyLT5lZXByb21wcml2KTsKLQlpbnQgYm1jYXN0ID0gaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocGF0dHJpYi0+ZHN0KTsKLQotCi0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkgJiYKLQkgICAgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSB8fAotCSAgICAgY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKSkpIHsKLQotCQkvKiBmaWx0ZXIgcGFja2V0cyB0aGF0IFNBIGlzIG15c2VsZiBvciBtdWx0aWNhc3Qgb3IgYnJvYWRjYXN0ICovCi0JCWlmIChldGhlcl9hZGRyX2VxdWFsKG15aHdhZGRyLCBwYXR0cmliLT5zcmMpKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAiU0EgPT0gbXlzZWxmXG4iKTsKLQkJCXJldCA9IF9GQUlMOwotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJLyogIGRhIHNob3VsZCBiZSBmb3IgbWUgKi8KLQkJaWYgKCFldGhlcl9hZGRyX2VxdWFsKG15aHdhZGRyLCBwYXR0cmliLT5kc3QpICYmICFibWNhc3QpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAiYXAyc3RhX2RhdGFfZnJhbWU6ICBjb21wYXJlIERBIGZhaWxlZDsgREE9JXBNXG4iLAotCQkJCSBwYXR0cmliLT5kc3QpOwotCQkJcmV0ID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCQkvKiAgY2hlY2sgQlNTSUQgKi8KLQkJaWYgKGV0aGVyX2FkZHJfZXF1YWwocGF0dHJpYi0+YnNzaWQsICJceDBceDBceDBceDBceDBceDAiKSB8fAotCQkgICAgZXRoZXJfYWRkcl9lcXVhbChteWJzc2lkLCAiXHgwXHgwXHgwXHgwXHgwXHgwIikgfHwKLQkJICAgICFldGhlcl9hZGRyX2VxdWFsKHBhdHRyaWItPmJzc2lkLCBteWJzc2lkKSkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCi0JCQkJICJhcDJzdGFfZGF0YV9mcmFtZTogIGNvbXBhcmUgQlNTSUQgZmFpbGVkOyBCU1NJRD0lcE1cbiIsCi0JCQkJIHBhdHRyaWItPmJzc2lkKTsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAibXlic3NpZD0lcE1cbiIsIG15YnNzaWQpOwotCi0JCQlpZiAoIWJtY2FzdCkgewotCQkJCURCR184NzIzQSgiaXNzdWVfZGVhdXRoMjNhIHRvIHRoZSBub25hc3NvY2lhdGVkIGFwPSVwTSBmb3IgdGhlIHJlYXNvbig3KVxuIiwKLQkJCQkJICBwYXR0cmliLT5ic3NpZCk7Ci0JCQkJaXNzdWVfZGVhdXRoMjNhKGFkYXB0ZXIsIHBhdHRyaWItPmJzc2lkLAotCQkJCQkgICAgIFdMQU5fUkVBU09OX0NMQVNTM19GUkFNRV9GUk9NX05PTkFTU09DX1NUQSk7Ci0JCQl9Ci0KLQkJCXJldCA9IF9GQUlMOwotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJaWYgKGJtY2FzdCkKLQkJCSpwc3RhID0gcnR3X2dldF9iY21jX3N0YWluZm8yM2EoYWRhcHRlcik7Ci0JCWVsc2UKLQkJCS8qICBnZXQgYXBfaW5mbyAqLwotCQkJKnBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIHBhdHRyaWItPmJzc2lkKTsKLQotCQlpZiAoKnBzdGEgPT0gTlVMTCkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkgImFwMnN0YTogY2FuJ3QgZ2V0IHBzdGEgdW5kZXIgU1RBVElPTl9NT0RFOyBkcm9wIHBrdFxuIik7Ci0JCQlyZXQgPSBfRkFJTDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCi0JCWlmIChpZWVlODAyMTFfaXNfbnVsbGZ1bmMoaGRyLT5mcmFtZV9jb250cm9sKSkgewotCQkJLyogTm8gZGF0YSwgd2lsbCBub3QgaW5kaWNhdGUgdG8gdXBwZXIgbGF5ZXIsCi0JCQkgICB0ZW1wb3JpbHkgY291bnQgaXQgaGVyZSAqLwotCQkJY291bnRfcnhfc3RhdHMoYWRhcHRlciwgcHJlY3ZfZnJhbWUsICpwc3RhKTsKLQkJCXJldCA9IFJUV19SWF9IQU5ETEVEOwotCQkJZ290byBleGl0OwotCQl9Ci0KLQl9IGVsc2UgaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX01QX1NUQVRFKSAmJgotCQkgICBjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPmRzdCwgaGRyLT5hZGRyMSk7Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT5zcmMsIGhkci0+YWRkcjIpOwotCQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+YnNzaWQsIGhkci0+YWRkcjMpOwotCQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+cmEsIHBhdHRyaWItPmRzdCk7Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT50YSwgcGF0dHJpYi0+c3JjKTsKLQotCQkvKiAgKi8KLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPmJzc2lkLCAgbXlic3NpZCk7Ci0KLQkJLyogIGdldCBzdGFfaW5mbyAqLwotCQkqcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgcGF0dHJpYi0+YnNzaWQpOwotCQlpZiAoKnBzdGEgPT0gTlVMTCkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkgImNhbid0IGdldCBwc3RhIHVuZGVyIE1QX01PREUgOyBkcm9wIHBrdFxuIik7Ci0JCQlyZXQgPSBfRkFJTDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCX0gZWxzZSBpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpKSB7Ci0JCS8qIFNwZWNpYWwgY2FzZSAqLwotCQlyZXQgPSBSVFdfUlhfSEFORExFRDsKLQkJZ290byBleGl0OwotCX0gZWxzZSB7Ci0JCWlmIChldGhlcl9hZGRyX2VxdWFsKG15aHdhZGRyLCBwYXR0cmliLT5kc3QpICYmICFibWNhc3QpIHsKLQkJCSpwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBwYXR0cmliLT5ic3NpZCk7Ci0JCQlpZiAoKnBzdGEgPT0gTlVMTCkgewotCQkJCURCR184NzIzQSgiaXNzdWVfZGVhdXRoMjNhIHRvIHRoZSBhcD0lcE0gZm9yIHRoZSByZWFzb24oNylcbiIsCi0JCQkJCSAgcGF0dHJpYi0+YnNzaWQpOwotCi0JCQkJaXNzdWVfZGVhdXRoMjNhKGFkYXB0ZXIsIHBhdHRyaWItPmJzc2lkLAotCQkJCQkgICAgIFdMQU5fUkVBU09OX0NMQVNTM19GUkFNRV9GUk9NX05PTkFTU09DX1NUQSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXQgPSBfRkFJTDsKLQl9Ci0KLWV4aXQ6Ci0KLQotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IHN0YTJhcF9kYXRhX2ZyYW1lKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lLAotCQkgICAgICBzdHJ1Y3Qgc3RhX2luZm8gKipwc3RhKTsKLWludCBzdGEyYXBfZGF0YV9mcmFtZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCSAgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSwKLQkJICAgICAgc3RydWN0IHN0YV9pbmZvICoqcHN0YSkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZfZnJhbWUtPnBrdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICYgcHJlY3ZfZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJmFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCXVuc2lnbmVkIGNoYXIgKm15YnNzaWQgPSBnZXRfYnNzaWQocG1sbWVwcml2KTsKLQlpbnQgcmV0ID0gX1NVQ0NFU1M7Ci0KLQotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkgewotCQkvKiBGb3IgQVAgbW9kZSwgUkEgPSBCU1NJRCwgVFggPSBTVEEoU1JDX0FERFIpLCBBMyA9IERTVF9BRERSICovCi0JCWlmICghZXRoZXJfYWRkcl9lcXVhbChwYXR0cmliLT5ic3NpZCwgbXlic3NpZCkpIHsKLQkJCXJldCA9IF9GQUlMOwotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJKnBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIHBhdHRyaWItPnNyYyk7Ci0JCWlmICgqcHN0YSA9PSBOVUxMKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAiY2FuJ3QgZ2V0IHBzdGEgdW5kZXIgQVBfTU9ERTsgZHJvcCBwa3RcbiIpOwotCQkJREJHXzg3MjNBKCJpc3N1ZV9kZWF1dGgyM2EgdG8gc3RhPSVwTSBmb3IgdGhlIHJlYXNvbig3KVxuIiwKLQkJCQkgIHBhdHRyaWItPnNyYyk7Ci0KLQkJCWlzc3VlX2RlYXV0aDIzYShhZGFwdGVyLCBwYXR0cmliLT5zcmMsCi0JCQkJICAgICBXTEFOX1JFQVNPTl9DTEFTUzNfRlJBTUVfRlJPTV9OT05BU1NPQ19TVEEpOwotCi0JCQlyZXQgPSBSVFdfUlhfSEFORExFRDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCi0JCXByb2Nlc3MyM2FfcHdyYml0X2RhdGEoYWRhcHRlciwgcHJlY3ZfZnJhbWUpOwotCi0JCS8qIFdlIG9ubHkgZ2V0IGhlcmUgaWYgaXQncyBhIGRhdGEgZnJhbWUsIHNvIG5vIG5lZWQgdG8KLQkJICogY29uZmlybSBkYXRhIGZyYW1lIHR5cGUgZmlyc3QgKi8KLQkJaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhoZHItPmZyYW1lX2NvbnRyb2wpKQotCQkJcHJvY2Vzc193bW1wc19kYXRhKGFkYXB0ZXIsIHByZWN2X2ZyYW1lKTsKLQotCQlpZiAoaWVlZTgwMjExX2lzX251bGxmdW5jKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKLQkJCS8qIE5vIGRhdGEsIHdpbGwgbm90IGluZGljYXRlIHRvIHVwcGVyIGxheWVyLAotCQkJICAgdGVtcG9yaWx5IGNvdW50IGl0IGhlcmUgKi8KLQkJCWNvdW50X3J4X3N0YXRzKGFkYXB0ZXIsIHByZWN2X2ZyYW1lLCAqcHN0YSk7Ci0JCQlyZXQgPSBSVFdfUlhfSEFORExFRDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCX0gZWxzZSB7Ci0JCXU4ICpteWh3YWRkciA9IG15aWQoJmFkYXB0ZXItPmVlcHJvbXByaXYpOwotCi0JCWlmICghZXRoZXJfYWRkcl9lcXVhbChwYXR0cmliLT5yYSwgbXlod2FkZHIpKSB7Ci0JCQlyZXQgPSBSVFdfUlhfSEFORExFRDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCQlEQkdfODcyM0EoImlzc3VlX2RlYXV0aDIzYSB0byBzdGE9JXBNIGZvciB0aGUgcmVhc29uKDcpXG4iLAotCQkJICBwYXR0cmliLT5zcmMpOwotCQlpc3N1ZV9kZWF1dGgyM2EoYWRhcHRlciwgcGF0dHJpYi0+c3JjLAotCQkJICAgICBXTEFOX1JFQVNPTl9DTEFTUzNfRlJBTUVfRlJPTV9OT05BU1NPQ19TVEEpOwotCQlyZXQgPSBSVFdfUlhfSEFORExFRDsKLQkJZ290byBleGl0OwotCX0KLQotZXhpdDoKLQotCi0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZhbGlkYXRlX3JlY3ZfY3RybF9mcmFtZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJlY3ZfZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBza19idWZmICpza2IgPSBwcmVjdl9mcmFtZS0+cGt0OwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOwotCi0JaWYgKCFpZWVlODAyMTFfaXNfY3RsKGhkci0+ZnJhbWVfY29udHJvbCkpCi0JCXJldHVybiBfRkFJTDsKLQotCS8qIHJlY2VpdmUgdGhlIGZyYW1lcyB0aGF0IHJhKGExKSBpcyBteSBhZGRyZXNzICovCi0JaWYgKCFldGhlcl9hZGRyX2VxdWFsKGhkci0+YWRkcjEsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSkpCi0JCXJldHVybiBfRkFJTDsKLQotCS8qIG9ubHkgaGFuZGxlIHBzLXBvbGwgKi8KLQlpZiAoaWVlZTgwMjExX2lzX3BzcG9sbChoZHItPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCXN0cnVjdCBpZWVlODAyMTFfcHNwb2xsICpwc3AgPSAoc3RydWN0IGllZWU4MDIxMV9wc3BvbGwgKiloZHI7Ci0JCXUxNiBhaWQ7Ci0JCXU4IHdtbXBzX2FjID0gMDsKLQkJc3RydWN0IHN0YV9pbmZvICpwc3RhID0gTlVMTDsKLQotCQlhaWQgPSBsZTE2X3RvX2NwdShwc3AtPmFpZCkgJiAweDNmZmY7Ci0JCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIGhkci0+YWRkcjIpOwotCi0JCWlmICghcHN0YSB8fCBwc3RhLT5haWQgIT0gYWlkKQotCQkJcmV0dXJuIF9GQUlMOwotCi0JCS8qIGZvciByeCBwa3Qgc3RhdGlzdGljcyAqLwotCQlwc3RhLT5zdGFfc3RhdHMucnhfY3RybF9wa3RzKys7Ci0KLQkJc3dpdGNoIChwYXR0cmliLT5wcmlvcml0eSkgewotCQljYXNlIDE6Ci0JCWNhc2UgMjoKLQkJCXdtbXBzX2FjID0gcHN0YS0+dWFwc2RfYmsgJiBCSVQoMCk7Ci0JCQlicmVhazsKLQkJY2FzZSA0OgotCQljYXNlIDU6Ci0JCQl3bW1wc19hYyA9IHBzdGEtPnVhcHNkX3ZpICYgQklUKDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgNjoKLQkJY2FzZSA3OgotCQkJd21tcHNfYWMgPSBwc3RhLT51YXBzZF92byAmIEJJVCgwKTsKLQkJCWJyZWFrOwotCQljYXNlIDA6Ci0JCWNhc2UgMzoKLQkJZGVmYXVsdDoKLQkJCXdtbXBzX2FjID0gcHN0YS0+dWFwc2RfYmUgJiBCSVQoMCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmICh3bW1wc19hYykKLQkJCXJldHVybiBfRkFJTDsKLQotCQlpZiAocHN0YS0+c3RhdGUgJiBXSUZJX1NUQV9BTElWRV9DSEtfU1RBVEUpIHsKLQkJCURCR184NzIzQSgiJXMgYWxpdmUgY2hlY2stcnggcHMtcG9sbFxuIiwgX19mdW5jX18pOwotCQkJcHN0YS0+ZXhwaXJlX3RvID0gcHN0YXByaXYtPmV4cGlyZV90bzsKLQkJCXBzdGEtPnN0YXRlIF49IFdJRklfU1RBX0FMSVZFX0NIS19TVEFURTsKLQkJfQotCi0JCWlmICgocHN0YS0+c3RhdGUgJiBXSUZJX1NMRUVQX1NUQVRFKSAmJgotCQkgICAgKHBzdGFwcml2LT5zdGFfZHpfYml0bWFwICYgQ0hLQklUKHBzdGEtPmFpZCkpKSB7Ci0JCQlzdHJ1Y3QgbGlzdF9oZWFkICp4bWl0ZnJhbWVfcGhlYWQ7Ci0JCQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZTsKLQkJCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0KLQkJCXNwaW5fbG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLQotCQkJeG1pdGZyYW1lX3BoZWFkID0gZ2V0X2xpc3RfaGVhZCgmcHN0YS0+c2xlZXBfcSk7Ci0JCQlweG1pdGZyYW1lID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKHhtaXRmcmFtZV9waGVhZCwKLQkJCQkJCQkgICAgICBzdHJ1Y3QgeG1pdF9mcmFtZSwKLQkJCQkJCQkgICAgICBsaXN0KTsKLQkJCWlmIChweG1pdGZyYW1lKSB7Ci0JCQkJbGlzdF9kZWxfaW5pdCgmcHhtaXRmcmFtZS0+bGlzdCk7Ci0KLQkJCQlwc3RhLT5zbGVlcHFfbGVuLS07Ci0KLQkJCQlpZiAocHN0YS0+c2xlZXBxX2xlbj4wKQotCQkJCQlweG1pdGZyYW1lLT5hdHRyaWIubWRhdGEgPSAxOwotCQkJCWVsc2UKLQkJCQkJcHhtaXRmcmFtZS0+YXR0cmliLm1kYXRhID0gMDsKLQotCQkJCXB4bWl0ZnJhbWUtPmF0dHJpYi50cmlnZ2VyZWQgPSAxOwotCi0JCQkJcnRsODcyM2F1X2hhbF94bWl0ZnJhbWVfZW5xdWV1ZShwYWRhcHRlciwKLQkJCQkJCQkJcHhtaXRmcmFtZSk7Ci0KLQkJCQlpZiAocHN0YS0+c2xlZXBxX2xlbiA9PSAwKSB7Ci0JCQkJCXBzdGFwcml2LT50aW1fYml0bWFwICY9IH5DSEtCSVQocHN0YS0+YWlkKTsKLQkJCQkJdXBkYXRlX2JlYWNvbjIzYShwYWRhcHRlciwgV0xBTl9FSURfVElNLAotCQkJCQkJCSBOVUxMLCBmYWxzZSk7Ci0JCQkJfQotCi0JCQkJc3Bpbl91bmxvY2tfYmgoJnB4bWl0cHJpdi0+bG9jayk7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJc3Bpbl91bmxvY2tfYmgoJnB4bWl0cHJpdi0+bG9jayk7Ci0KLQkJCQlpZiAocHN0YXByaXYtPnRpbV9iaXRtYXAgJiBDSEtCSVQocHN0YS0+YWlkKSkgewotCQkJCQlpZiAocHN0YS0+c2xlZXBxX2xlbiA9PSAwKSB7Ci0JCQkJCQlEQkdfODcyM0EoIm5vIGJ1ZmZlcmVkIHBhY2tldHMgIgotCQkJCQkJCSAgInRvIHhtaXRcbiIpOwotCi0JCQkJCQkvKiBpc3N1ZSBudWxsZGF0YSB3aXRoIE1vcmUgZGF0YSBiaXQgPSAwIHRvIGluZGljYXRlIHdlIGhhdmUgbm8gYnVmZmVyZWQgcGFja2V0cyAqLwotCQkJCQkJaXNzdWVfbnVsbGRhdGEyM2EocGFkYXB0ZXIsCi0JCQkJCQkJICAgICAgIHBzdGEtPmh3YWRkciwKLQkJCQkJCQkgICAgICAgMCwgMCwgMCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlEQkdfODcyM0EoImVycm9yIXBzdGEtPnNsZWVwcSIKLQkJCQkJCQkgICJfbGVuID0lZFxuIiwKLQkJCQkJCQkgIHBzdGEtPnNsZWVwcV9sZW4pOwotCQkJCQkJcHN0YS0+c2xlZXBxX2xlbiA9IDA7Ci0JCQkJCX0KLQotCQkJCQlwc3RhcHJpdi0+dGltX2JpdG1hcCAmPSB+Q0hLQklUKHBzdGEtPmFpZCk7Ci0KLQkJCQkJdXBkYXRlX2JlYWNvbjIzYShwYWRhcHRlciwgV0xBTl9FSURfVElNLAotCQkJCQkJCSBOVUxMLCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0jZW5kaWYKLQlyZXR1cm4gX0ZBSUw7Ci19Ci0KLXN0cnVjdCByZWN2X2ZyYW1lICpyZWN2ZnJhbWVfY2hrX2RlZnJhZzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwotc3RhdGljIGludCB2YWxpZGF0ZV9yZWN2X21nbnRfZnJhbWUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJICIrdmFsaWRhdGVfcmVjdl9tZ250X2ZyYW1lXG4iKTsKLQotCXByZWN2X2ZyYW1lID0gcmVjdmZyYW1lX2Noa19kZWZyYWcyM2EocGFkYXB0ZXIsIHByZWN2X2ZyYW1lKTsKLQlpZiAocHJlY3ZfZnJhbWUgPT0gTlVMTCkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9ub3RpY2VfLAotCQkJICIlczogZnJhZ21lbnQgcGFja2V0XG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBfU1VDQ0VTUzsKLQl9Ci0KLQlza2IgPSBwcmVjdl9mcmFtZS0+cGt0OwotCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7Ci0KLQkJLyogZm9yIHJ4IHBrdCBzdGF0aXN0aWNzICovCi0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYSgmcGFkYXB0ZXItPnN0YXByaXYsIGhkci0+YWRkcjIpOwotCWlmIChwc3RhKSB7Ci0JCXBzdGEtPnN0YV9zdGF0cy5yeF9tZ250X3BrdHMrKzsKLQotCQlpZiAoaWVlZTgwMjExX2lzX2JlYWNvbihoZHItPmZyYW1lX2NvbnRyb2wpKQotCQkJcHN0YS0+c3RhX3N0YXRzLnJ4X2JlYWNvbl9wa3RzKys7Ci0JCWVsc2UgaWYgKGllZWU4MDIxMV9pc19wcm9iZV9yZXEoaGRyLT5mcmFtZV9jb250cm9sKSkKLQkJCXBzdGEtPnN0YV9zdGF0cy5yeF9wcm9iZXJlcV9wa3RzKys7Ci0JCWVsc2UgaWYgKGllZWU4MDIxMV9pc19wcm9iZV9yZXNwKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKLQkJCWlmIChldGhlcl9hZGRyX2VxdWFsKHBhZGFwdGVyLT5lZXByb21wcml2Lm1hY19hZGRyLAotCQkJCSAgICBoZHItPmFkZHIxKSkKLQkJCQlwc3RhLT5zdGFfc3RhdHMucnhfcHJvYmVyc3BfcGt0cysrOwotCQkJZWxzZSBpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkgfHwKLQkJCQkgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkpCi0JCQkJcHN0YS0+c3RhX3N0YXRzLnJ4X3Byb2JlcnNwX2JtX3BrdHMrKzsKLQkJCWVsc2UKLQkJCQlwc3RhLT5zdGFfc3RhdHMucnhfcHJvYmVyc3BfdW9fcGt0cysrOwotCQl9Ci0JfQotCi0JbWd0X2Rpc3BhdGNoZXIyM2EocGFkYXB0ZXIsIHByZWN2X2ZyYW1lKTsKLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCB2YWxpZGF0ZV9yZWN2X2RhdGFfZnJhbWUoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkJCSAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0JdTggYnJldHJ5OwotCXU4ICpwc2EsICpwZGE7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhID0gTlVMTDsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICYgcHJlY3ZfZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0JaW50IHJldCA9IF9TVUNDRVNTOwotCXN0cnVjdCBza19idWZmICpza2IgPSBwcmVjdl9mcmFtZS0+cGt0OwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOwotCi0KLQotCWJyZXRyeSA9IGllZWU4MDIxMV9oYXNfcmV0cnkoaGRyLT5mcmFtZV9jb250cm9sKTsKLQlwZGEgPSBpZWVlODAyMTFfZ2V0X0RBKGhkcik7Ci0JcHNhID0gaWVlZTgwMjExX2dldF9TQShoZHIpOwotCi0JZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPmRzdCwgcGRhKTsKLQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+c3JjLCBwc2EpOwotCi0Jc3dpdGNoIChoZHItPmZyYW1lX2NvbnRyb2wgJgotCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9UT0RTIHwgSUVFRTgwMjExX0ZDVExfRlJPTURTKSkgewotCWNhc2UgY3B1X3RvX2xlMTYoMCk6Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT5ic3NpZCwgaGRyLT5hZGRyMyk7Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT5yYSwgcGRhKTsKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPnRhLCBwc2EpOwotCQlyZXQgPSBzdGEyc3RhX2RhdGFfZnJhbWUoYWRhcHRlciwgcHJlY3ZfZnJhbWUsICZwc3RhKTsKLQkJYnJlYWs7Ci0KLQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX0ZST01EUyk6Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT5ic3NpZCwgaGRyLT5hZGRyMik7Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT5yYSwgcGRhKTsKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPnRhLCBoZHItPmFkZHIyKTsKLQkJcmV0ID0gYXAyc3RhX2RhdGFfZnJhbWUoYWRhcHRlciwgcHJlY3ZfZnJhbWUsICZwc3RhKTsKLQkJYnJlYWs7Ci0KLQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX1RPRFMpOgotCQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+YnNzaWQsIGhkci0+YWRkcjEpOwotCQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+cmEsIGhkci0+YWRkcjEpOwotCQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+dGEsIHBzYSk7Ci0JCXJldCA9IHN0YTJhcF9kYXRhX2ZyYW1lKGFkYXB0ZXIsIHByZWN2X2ZyYW1lLCAmcHN0YSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9UT0RTIHwgSUVFRTgwMjExX0ZDVExfRlJPTURTKToKLQkJLyoKLQkJICogVGhlcmUgaXMgbm8gQlNTSUQgaW4gdGhpcyBjYXNlLCBidXQgdGhlIGRyaXZlciBoYXMgYmVlbgotCQkgKiB1c2luZyBhZGRyMSBzbyBmYXIsIHNvIGtlZXAgaXQgZm9yIG5vdy4KLQkJICovCi0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT5ic3NpZCwgaGRyLT5hZGRyMSk7Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT5yYSwgaGRyLT5hZGRyMSk7Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT50YSwgaGRyLT5hZGRyMik7Ci0JCXJldCA9IF9GQUlMOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLCAiY2FzZSAzXG4iKTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKChyZXQgPT0gX0ZBSUwpIHx8IChyZXQgPT0gUlRXX1JYX0hBTkRMRUQpKQotCQlnb3RvIGV4aXQ7Ci0KLQlpZiAoIXBzdGEpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCSAiYWZ0ZXIgdG9fZnJfZHNfY2hrOyBwc3RhID09IE5VTExcbiIpOwotCQlyZXQgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXByZWN2X2ZyYW1lLT5wc3RhID0gcHN0YTsKLQotCXBhdHRyaWItPmhkcmxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0JaWYgKGllZWU4MDIxMV9oYXNfYTQoaGRyLT5mcmFtZV9jb250cm9sKSkKLQkJcGF0dHJpYi0+aGRybGVuICs9IEVUSF9BTEVOOwotCi0JLyogcGFyc2luZyBRQyBmaWVsZCAqLwotCWlmIChwYXR0cmliLT5xb3MgPT0gMSkgewotCQlfX2xlMTYgKnFwdHIgPSAoX19sZTE2ICopaWVlZTgwMjExX2dldF9xb3NfY3RsKGhkcik7Ci0JCXUxNiBxb3NfY3RybCA9IGxlMTZfdG9fY3B1KCpxcHRyKTsKLQotCQlwYXR0cmliLT5wcmlvcml0eSA9IHFvc19jdHJsICYgSUVFRTgwMjExX1FPU19DVExfVElEX01BU0s7Ci0JCXBhdHRyaWItPmFja19wb2xpY3kgPSAocW9zX2N0cmwgPj4gNSkgJiAzOwotCQlwYXR0cmliLT5hbXNkdSA9Ci0JCQkocW9zX2N0cmwgJiBJRUVFODAyMTFfUU9TX0NUTF9BX01TRFVfUFJFU0VOVCkgPj4gNzsKLQkJcGF0dHJpYi0+aGRybGVuICs9IElFRUU4MDIxMV9RT1NfQ1RMX0xFTjsKLQotCQlpZiAocGF0dHJpYi0+cHJpb3JpdHkgIT0gMCAmJiBwYXR0cmliLT5wcmlvcml0eSAhPSAzKSB7Ci0JCQlhZGFwdGVyLT5yZWN2cHJpdi5iSXNBbnlOb25CRVBrdHMgPSB0cnVlOwotCQl9Ci0JfSBlbHNlIHsKLQkJcGF0dHJpYi0+cHJpb3JpdHkgPSAwOwotCQlwYXR0cmliLT5hY2tfcG9saWN5ID0gMDsKLQkJcGF0dHJpYi0+YW1zZHUgPSAwOwotCX0KLQotCWlmIChwYXR0cmliLT5vcmRlcikgeyAvKiBIVC1DVFJMIDExbiAqLwotCQlwYXR0cmliLT5oZHJsZW4gKz0gNDsKLQl9Ci0KLQlwcmVjdl9mcmFtZS0+cHJlb3JkZXJfY3RybCA9ICZwc3RhLT5yZWN2cmVvcmRlcl9jdHJsW3BhdHRyaWItPnByaW9yaXR5XTsKLQotCS8qICBkZWNhY2hlLCBkcm9wIGR1cGxpY2F0ZSByZWN2IHBhY2tldHMgKi8KLQlpZiAocmVjdl9kZWNhY2hlKHByZWN2X2ZyYW1lLCBicmV0cnksICZwc3RhLT5zdGFfcmVjdnByaXYucnhjYWNoZSkgPT0KLQkgICAgX0ZBSUwpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCSAiZGVjYWNoZSA6IGRyb3AgcGt0XG4iKTsKLQkJcmV0ID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAocGF0dHJpYi0+cHJpdmFjeSkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJCSAidmFsaWRhdGVfcmVjdl9kYXRhX2ZyYW1lOnBhdHRyaWItPnByaXZhY3kgPSV4XG4iLAotCQkJIHBhdHRyaWItPnByaXZhY3kpOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJCSAiXl5eXl5eXl5eXl5pc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5yYSgweCUwMngpKSA9JWReXl5eXl5eXl5eXl5eXl42XG4iLAotCQkJIHBhdHRyaWItPnJhWzBdLAotCQkJIGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHBhdHRyaWItPnJhKSk7Ci0KLQkJR0VUX0VOQ1JZX0FMR08ocHNlY3VyaXR5cHJpdiwgcHN0YSwgcGF0dHJpYi0+ZW5jcnlwdCwKLQkJCSAgICAgICBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5yYSkpOwotCi0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJICJwYXR0cmliLT5lbmNyeXB0ID0lZFxuIiwgcGF0dHJpYi0+ZW5jcnlwdCk7Ci0KLQkJc3dpdGNoIChwYXR0cmliLT5lbmNyeXB0KSB7Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgotCQkJcGF0dHJpYi0+aXZfbGVuID0gSUVFRTgwMjExX1dFUF9JVl9MRU47Ci0JCQlwYXR0cmliLT5pY3ZfbGVuID0gSUVFRTgwMjExX1dFUF9JQ1ZfTEVOOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDoKLQkJCXBhdHRyaWItPml2X2xlbiA9IElFRUU4MDIxMV9US0lQX0lWX0xFTjsKLQkJCXBhdHRyaWItPmljdl9sZW4gPSBJRUVFODAyMTFfVEtJUF9JQ1ZfTEVOOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKLQkJCXBhdHRyaWItPml2X2xlbiA9IElFRUU4MDIxMV9DQ01QX0hEUl9MRU47Ci0JCQlwYXR0cmliLT5pY3ZfbGVuID0gSUVFRTgwMjExX0NDTVBfTUlDX0xFTjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcGF0dHJpYi0+aXZfbGVuID0gMDsKLQkJCXBhdHRyaWItPmljdl9sZW4gPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQlwYXR0cmliLT5lbmNyeXB0ID0gMDsKLQkJcGF0dHJpYi0+aXZfbGVuID0gMDsKLQkJcGF0dHJpYi0+aWN2X2xlbiA9IDA7Ci0JfQotCi1leGl0OgotCi0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGR1bXBfcnhfcGt0KHN0cnVjdCBza19idWZmICpza2IsIHUxNiB0eXBlLCBpbnQgbGV2ZWwpCi17Ci0JaW50IGk7Ci0JdTggKnB0cjsKLQotCWlmICgobGV2ZWwgPT0gMSkgfHwKLQkgICAgKChsZXZlbCA9PSAyKSAmJiAodHlwZSA9PSBJRUVFODAyMTFfRlRZUEVfTUdNVCkpIHx8Ci0JICAgICgobGV2ZWwgPT0gMykgJiYgKHR5cGUgPT0gSUVFRTgwMjExX0ZUWVBFX0RBVEEpKSkgewotCi0JCXB0ciA9IHNrYi0+ZGF0YTsKLQotCQlEQkdfODcyM0EoIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4iKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkgPSBpICsgOCkKLQkJCURCR184NzIzQSgiJSpwaEM6XG4iLCA4LCBwdHIgKyBpKTsKLQkJREJHXzg3MjNBKCIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIik7Ci0JfQotfQotCi1zdGF0aWMgaW50IHZhbGlkYXRlX3JlY3ZfZnJhbWUoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkJICAgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQkvKiBzaGFsbCBjaGVjayBmcmFtZSBzdWJ0eXBlLCB0byAvIGZyb20gZHMsIGRhLCBic3NpZCAqLwotCi0JLyogdGhlbiBjYWxsIGNoZWNrIGlmIHJ4IHNlcS9mcmFnLiBkdXBsaWNhdGVkLiAqLwotCXU4IHR5cGU7Ci0JdTggc3VidHlwZTsKLQlpbnQgcmV0dmFsID0gX1NVQ0NFU1M7Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmIHByZWN2X2ZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByZWN2X2ZyYW1lLT5wa3Q7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7Ci0JdTggdmVyOwotCXU4IGJEdW1wUnhQa3Q7Ci0JdTE2IHNlcV9jdHJsLCBmY3RsOwotCi0JZmN0bCA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY29udHJvbCk7Ci0JdmVyID0gZmN0bCAmIElFRUU4MDIxMV9GQ1RMX1ZFUlM7Ci0JdHlwZSA9IGZjdGwgJiBJRUVFODAyMTFfRkNUTF9GVFlQRTsKLQlzdWJ0eXBlID0gZmN0bCAmIElFRUU4MDIxMV9GQ1RMX1NUWVBFOwotCi0JLyogYWRkIHZlcnNpb24gY2hrICovCi0JaWYgKHZlciAhPSAwKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkgInZhbGlkYXRlX3JlY3ZfZGF0YV9mcmFtZSBmYWlsISAodmVyIT0gMClcbiIpOwotCQlyZXR2YWwgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXNlcV9jdHJsID0gbGUxNl90b19jcHUoaGRyLT5zZXFfY3RybCk7Ci0JcGF0dHJpYi0+ZnJhZ19udW0gPSBzZXFfY3RybCAmIElFRUU4MDIxMV9TQ1RMX0ZSQUc7Ci0JcGF0dHJpYi0+c2VxX251bSA9IHNlcV9jdHJsID4+IDQ7Ci0KLQlwYXR0cmliLT5wd19zYXZlID0gaWVlZTgwMjExX2hhc19wbShoZHItPmZyYW1lX2NvbnRyb2wpOwotCXBhdHRyaWItPm1mcmFnID0gaWVlZTgwMjExX2hhc19tb3JlZnJhZ3MoaGRyLT5mcmFtZV9jb250cm9sKTsKLQlwYXR0cmliLT5tZGF0YSA9IGllZWU4MDIxMV9oYXNfbW9yZWRhdGEoaGRyLT5mcmFtZV9jb250cm9sKTsKLQlwYXR0cmliLT5wcml2YWN5ID0gaWVlZTgwMjExX2hhc19wcm90ZWN0ZWQoaGRyLT5mcmFtZV9jb250cm9sKTsKLQlwYXR0cmliLT5vcmRlciA9IGllZWU4MDIxMV9oYXNfb3JkZXIoaGRyLT5mcmFtZV9jb250cm9sKTsKLQotCUdldEhhbERlZlZhcjgxOTJDVXNiKGFkYXB0ZXIsIEhBTF9ERUZfREJHX0RVTVBfUlhQS1QsICZiRHVtcFJ4UGt0KTsKLQotCWlmICh1bmxpa2VseShiRHVtcFJ4UGt0ID09IDEpKQotCQlkdW1wX3J4X3BrdChza2IsIHR5cGUsIGJEdW1wUnhQa3QpOwotCi0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBJRUVFODAyMTFfRlRZUEVfTUdNVDoKLQkJcmV0dmFsID0gdmFsaWRhdGVfcmVjdl9tZ250X2ZyYW1lKGFkYXB0ZXIsIHByZWN2X2ZyYW1lKTsKLQkJaWYgKHJldHZhbCA9PSBfRkFJTCkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkgInZhbGlkYXRlX3JlY3ZfbWdudF9mcmFtZSBmYWlsXG4iKTsKLQkJfQotCQlyZXR2YWwgPSBfRkFJTDsgLyogIG9ubHkgZGF0YSBmcmFtZSByZXR1cm4gX1NVQ0NFU1MgKi8KLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfRlRZUEVfQ1RMOgotCQlyZXR2YWwgPSB2YWxpZGF0ZV9yZWN2X2N0cmxfZnJhbWUoYWRhcHRlciwgcHJlY3ZfZnJhbWUpOwotCQlpZiAocmV0dmFsID09IF9GQUlMKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAidmFsaWRhdGVfcmVjdl9jdHJsX2ZyYW1lIGZhaWxcbiIpOwotCQl9Ci0JCXJldHZhbCA9IF9GQUlMOyAvKiAgb25seSBkYXRhIGZyYW1lIHJldHVybiBfU1VDQ0VTUyAqLwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9GVFlQRV9EQVRBOgotCQlwYXR0cmliLT5xb3MgPSAoc3VidHlwZSAmIElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQSkgPyAxIDogMDsKLQkJcmV0dmFsID0gdmFsaWRhdGVfcmVjdl9kYXRhX2ZyYW1lKGFkYXB0ZXIsIHByZWN2X2ZyYW1lKTsKLQkJaWYgKHJldHZhbCA9PSBfRkFJTCkgewotCQkJc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2ID0gJmFkYXB0ZXItPnJlY3Zwcml2OwotCi0JCQlwcmVjdnByaXYtPnJ4X2Ryb3ArKzsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJICJ2YWxpZGF0ZV9yZWN2X2RhdGFfZnJhbWUgZmFpbCEgdHlwZSA9IDB4JXhcbiIsIHR5cGUpOwotCQlyZXR2YWwgPSBfRkFJTDsKLQkJYnJlYWs7Ci0JfQotCi1leGl0OgotCXJldHVybiByZXR2YWw7Ci19Ci0KLS8qIHJlbW92ZSB0aGUgd2xhbmhkciBhbmQgYWRkIHRoZSBldGhfaGRyICovCi0KLXN0YXRpYyBpbnQgd2xhbmhkcl90b19ldGhoZHIgKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lKQotewotCXUxNglldGhfdHlwZSwgbGVuLCBoZHJsZW47Ci0JdTgJYnNuYXBoZHI7Ci0JdTgJKnBzbmFwOwotCXN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciA9IHByZWN2ZnJhbWUtPmFkYXB0ZXI7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCi0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByZWN2ZnJhbWUtPnBrdDsKLQl1OCAqcHRyOwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2ZnJhbWUtPmF0dHJpYjsKLQotCi0KLQlwdHIgPSBza2ItPmRhdGE7Ci0JaGRybGVuID0gcGF0dHJpYi0+aGRybGVuOwotCXBzbmFwID0gcHRyICsgaGRybGVuOwotCWV0aF90eXBlID0gKHBzbmFwWzZdIDw8IDgpIHwgcHNuYXBbN107Ci0JLyogY29udmVydCBoZHIgKyBwb3NzaWJsZSBMTEMgaGVhZGVycyBpbnRvIEV0aGVybmV0IGhlYWRlciAqLwotCWlmICgoZXRoZXJfYWRkcl9lcXVhbChwc25hcCwgcmZjMTA0Ml9oZWFkZXIpICYmCi0JICAgICBldGhfdHlwZSAhPSBFVEhfUF9BQVJQICYmIGV0aF90eXBlICE9IEVUSF9QX0lQWCkgfHwKLQkgICAgZXRoZXJfYWRkcl9lcXVhbChwc25hcCwgYnJpZGdlX3R1bm5lbF9oZWFkZXIpKSB7Ci0JCS8qIHJlbW92ZSBSRkMxMDQyIG9yIEJyaWRnZS1UdW5uZWwgZW5jYXBzdWxhdGlvbgotCQkgICBhbmQgcmVwbGFjZSBFdGhlclR5cGUgKi8KLQkJYnNuYXBoZHIgPSB0cnVlOwotCQloZHJsZW4gKz0gU05BUF9TSVpFOwotCX0gZWxzZSB7Ci0JCS8qIExlYXZlIEV0aGVybmV0IGhlYWRlciBwYXJ0IG9mIGhkciBhbmQgZnVsbCBwYXlsb2FkICovCi0JCWJzbmFwaGRyID0gZmFsc2U7Ci0JCWV0aF90eXBlID0gKHBzbmFwWzBdIDw8IDgpIHwgcHNuYXBbMV07Ci0JfQotCi0JbGVuID0gc2tiLT5sZW4gLSBoZHJsZW47Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJICI9PT0gcGF0dHJpYi0+aGRybGVuOiAleCwgIHBhdHRyaWItPml2X2xlbjoleCA9PT1cbiIsCi0JCSBwYXR0cmliLT5oZHJsZW4sICBwYXR0cmliLT5pdl9sZW4pOwotCi0JcGF0dHJpYi0+ZXRoX3R5cGUgPSBldGhfdHlwZTsKLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfTVBfU1RBVEUpKSB7Ci0JCXB0ciArPSBoZHJsZW47Ci0JCSpwdHIgPSAweDg3OwotCQkqKHB0ciArIDEpID0gMHgxMjsKLQotCQlldGhfdHlwZSA9IDB4ODcxMjsKLQkJLyogIGFwcGVuZCByeCBzdGF0dXMgZm9yIG1wIHRlc3QgcGFja2V0cyAqLwotCi0JCXB0ciA9IHNrYl9wdWxsKHNrYiwgKGhkcmxlbiAtIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSArIDIpIC0gMjQpOwotCQltZW1jcHkocHRyLCBza2ItPmhlYWQsIDI0KTsKLQkJcHRyICs9IDI0OwotCX0gZWxzZSB7Ci0JCXB0ciA9IHNrYl9wdWxsKHNrYiwgKGhkcmxlbiAtIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSArCi0JCQkJICAgICAoYnNuYXBoZHIgPyAyOjApKSk7Ci0JfQotCi0JZXRoZXJfYWRkcl9jb3B5KHB0ciwgcGF0dHJpYi0+ZHN0KTsKLQlldGhlcl9hZGRyX2NvcHkocHRyICsgRVRIX0FMRU4sIHBhdHRyaWItPnNyYyk7Ci0KLQlpZiAoIWJzbmFwaGRyKSB7Ci0JCXB1dF91bmFsaWduZWRfYmUxNihsZW4sIHB0ciArIDEyKTsKLQl9Ci0KLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotLyogcGVyZm9ybSBkZWZyYWcgKi8KLXN0cnVjdCByZWN2X2ZyYW1lICpyZWN2ZnJhbWVfZGVmcmFnKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJCQkgICAgc3RydWN0IHJ0d19xdWV1ZSAqZGVmcmFnX3EpOwotc3RydWN0IHJlY3ZfZnJhbWUgKnJlY3ZmcmFtZV9kZWZyYWcoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkJCSAgICBzdHJ1Y3QgcnR3X3F1ZXVlICpkZWZyYWdfcSkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQl1OCB3bGFuaGRyX29mZnNldDsKLQl1OCBjdXJmcmFnbnVtOwotCXN0cnVjdCByZWN2X2ZyYW1lICpwbmZoZHIsICpwdG1wOwotCXN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lLCAqcG5leHRyZnJhbWU7Ci0Jc3RydWN0IHJ0d19xdWV1ZSAqcGZyZWVfcmVjdl9xdWV1ZTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCi0JY3VyZnJhZ251bSA9IDA7Ci0JcGZyZWVfcmVjdl9xdWV1ZSA9ICZhZGFwdGVyLT5yZWN2cHJpdi5mcmVlX3JlY3ZfcXVldWU7Ci0KLQlwaGVhZCA9IGdldF9saXN0X2hlYWQoZGVmcmFnX3EpOwotCXByZnJhbWUgPSBsaXN0X2ZpcnN0X2VudHJ5KHBoZWFkLCBzdHJ1Y3QgcmVjdl9mcmFtZSwgbGlzdCk7Ci0JbGlzdF9kZWxfaW5pdCgmcHJmcmFtZS0+bGlzdCk7Ci0Jc2tiID0gcHJmcmFtZS0+cGt0OwotCi0JaWYgKGN1cmZyYWdudW0gIT0gcHJmcmFtZS0+YXR0cmliLmZyYWdfbnVtKSB7Ci0JCS8qIHRoZSBmaXJzdCBmcmFnbWVudCBudW1iZXIgbXVzdCBiZSAwICovCi0JCS8qIGZyZWUgdGhlIHdob2xlIHF1ZXVlICovCi0JCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYShwcmZyYW1lKTsKLQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhX3F1ZXVlKGRlZnJhZ19xKTsKLQotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQljdXJmcmFnbnVtKys7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG5maGRyLCBwdG1wLCBwaGVhZCwgbGlzdCkgewotCQlwbmV4dHJmcmFtZSA9IChzdHJ1Y3QgcmVjdl9mcmFtZSAqKXBuZmhkcjsKLQkJLyogY2hlY2sgdGhlIGZyYWdtZW50IHNlcXVlbmNlICAoMm5kIH5uIGZyYWdtZW50IGZyYW1lKSAqLwotCi0JCWlmIChjdXJmcmFnbnVtICE9IHBuZmhkci0+YXR0cmliLmZyYWdfbnVtKSB7Ci0JCQkvKiB0aGUgZnJhZ21lbnQgbnVtYmVyIG11c3QgYmUgaW5jcmVhc2luZwotCQkJICAgKGFmdGVyIGRlY2FjaGUpICovCi0JCQkvKiByZWxlYXNlIHRoZSBkZWZyYWdfcSAmIHByZnJhbWUgKi8KLQkJCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYShwcmZyYW1lKTsKLQkJCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYV9xdWV1ZShkZWZyYWdfcSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCi0JCWN1cmZyYWdudW0rKzsKLQotCQkvKiBjb3B5IHRoZSAybmR+biBmcmFnbWVudCBmcmFtZSdzIHBheWxvYWQgdG8gdGhlCi0JCSAgIGZpcnN0IGZyYWdtZW50ICovCi0JCS8qIGdldCB0aGUgMm5kfmxhc3QgZnJhZ21lbnQgZnJhbWUncyBwYXlsb2FkICovCi0KLQkJd2xhbmhkcl9vZmZzZXQgPSBwbmZoZHItPmF0dHJpYi5oZHJsZW4gKyBwbmZoZHItPmF0dHJpYi5pdl9sZW47Ci0KLQkJc2tiX3B1bGwocG5maGRyLT5wa3QsIHdsYW5oZHJfb2Zmc2V0KTsKLQotCQkvKiBhcHBlbmQgIHRvIGZpcnN0IGZyYWdtZW50IGZyYW1lJ3MgdGFpbAotCQkgICAoaWYgcHJpdmFjeSBmcmFtZSwgcHVsbCB0aGUgSUNWKSAqLwotCi0JCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSBwcmZyYW1lLT5hdHRyaWIuaWN2X2xlbik7Ci0KLQkJbWVtY3B5KHNrYl90YWlsX3BvaW50ZXIoc2tiKSwgcG5maGRyLT5wa3QtPmRhdGEsCi0JCSAgICAgICBwbmZoZHItPnBrdC0+bGVuKTsKLQotCQlza2JfcHV0KHNrYiwgcG5maGRyLT5wa3QtPmxlbik7Ci0KLQkJcHJmcmFtZS0+YXR0cmliLmljdl9sZW4gPSBwbmZoZHItPmF0dHJpYi5pY3ZfbGVuOwotCX0KLQotCS8qIGZyZWUgdGhlIGRlZnJhZ19xIHF1ZXVlIGFuZCByZXR1cm4gdGhlIHByZnJhbWUgKi8KLQlydHdfZnJlZV9yZWN2ZnJhbWUyM2FfcXVldWUoZGVmcmFnX3EpOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCi0JCSAiUGVyZm9ybWFuY2UgZGVmcmFnISEhISFcbiIpOwotCi0JcmV0dXJuIHByZnJhbWU7Ci19Ci0KLS8qIGNoZWNrIGlmIG5lZWQgdG8gZGVmcmFnLCBpZiBuZWVkZWQgcXVldWUgdGhlIGZyYW1lIHRvIGRlZnJhZ19xICovCi1zdHJ1Y3QgcmVjdl9mcmFtZSAqcmVjdmZyYW1lX2Noa19kZWZyYWcyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkJc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCXU4CWlzbWZyYWc7Ci0JdTgJZnJhZ251bTsKLQl1OAkqcHN0YV9hZGRyOwotCXN0cnVjdCByZWN2X2ZyYW1lICpwZmhkcjsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJ0bmZyYW1lID0gTlVMTDsKLQlzdHJ1Y3QgcnR3X3F1ZXVlICpwZnJlZV9yZWN2X3F1ZXVlLCAqcGRlZnJhZ19xOwotCi0KLQotCXBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCi0JcGZoZHIgPSBwcmVjdl9mcmFtZTsKLQotCXBmcmVlX3JlY3ZfcXVldWUgPSAmcGFkYXB0ZXItPnJlY3Zwcml2LmZyZWVfcmVjdl9xdWV1ZTsKLQotCS8qIG5lZWQgdG8gZGVmaW5lIHN0cnVjdCBvZiB3bGFuIGhlYWRlciBmcmFtZSBjdHJsICovCi0JaXNtZnJhZyA9IHBmaGRyLT5hdHRyaWIubWZyYWc7Ci0JZnJhZ251bSA9IHBmaGRyLT5hdHRyaWIuZnJhZ19udW07Ci0KLQlwc3RhX2FkZHIgPSBwZmhkci0+YXR0cmliLnRhOwotCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIHBzdGFfYWRkcik7Ci0JaWYgKCFwc3RhKSB7Ci0JCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPQotCQkJKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHBmaGRyLT5wa3QtPmRhdGE7Ci0JCWlmICghaWVlZTgwMjExX2lzX2RhdGEoaGRyLT5mcmFtZV9jb250cm9sKSkgewotCQkJcHN0YSA9IHJ0d19nZXRfYmNtY19zdGFpbmZvMjNhKHBhZGFwdGVyKTsKLQkJCXBkZWZyYWdfcSA9ICZwc3RhLT5zdGFfcmVjdnByaXYuZGVmcmFnX3E7Ci0JCX0gZWxzZQotCQkJcGRlZnJhZ19xID0gTlVMTDsKLQl9IGVsc2UKLQkJcGRlZnJhZ19xID0gJnBzdGEtPnN0YV9yZWN2cHJpdi5kZWZyYWdfcTsKLQotCWlmICgoaXNtZnJhZyA9PSAwKSAmJiAoZnJhZ251bSA9PSAwKSkgewotCQlwcnRuZnJhbWUgPSBwcmVjdl9mcmFtZTsvKiBpc24ndCBhIGZyYWdtZW50IGZyYW1lICovCi0JfQotCi0JaWYgKGlzbWZyYWcgPT0gMSkgewotCQkvKiAwfihuLTEpIGZyYWdtZW50IGZyYW1lICovCi0JCS8qIGVucXVldWUgdG8gZGVmcmFmX2cgKi8KLQkJaWYgKHBkZWZyYWdfcSAhPSBOVUxMKSB7Ci0JCQlpZiAoZnJhZ251bSA9PSAwKSB7Ci0JCQkJLyogdGhlIGZpcnN0IGZyYWdtZW50ICovCi0JCQkJaWYgKCFsaXN0X2VtcHR5KCZwZGVmcmFnX3EtPnF1ZXVlKSkgewotCQkJCQkvKiBmcmVlIGN1cnJlbnQgZGVmcmFnX3EgKi8KLQkJCQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhX3F1ZXVlKHBkZWZyYWdfcSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvKiBUaGVuIGVucXVldWUgdGhlIDB+KG4tMSkgZnJhZ21lbnQgaW50byB0aGUKLQkJCSAgIGRlZnJhZ19xICovCi0KLQkJCS8qIHNwaW5fbG9jaygmcGRlZnJhZ19xLT5sb2NrKTsgKi8KLQkJCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwZGVmcmFnX3EpOwotCQkJbGlzdF9hZGRfdGFpbCgmcGZoZHItPmxpc3QsIHBoZWFkKTsKLQkJCS8qIHNwaW5fdW5sb2NrKCZwZGVmcmFnX3EtPmxvY2spOyAqLwotCi0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJCQkgIkVucXVldXE6IGlzbWZyYWcgPSAlZCwgZnJhZ251bSA9ICVkXG4iLAotCQkJCSBpc21mcmFnLCBmcmFnbnVtKTsKLQotCQkJcHJ0bmZyYW1lID0gTlVMTDsKLQotCQl9IGVsc2UgewotCQkJLyogY2FuJ3QgZmluZCB0aGlzIHRhJ3MgZGVmcmFnX3F1ZXVlLAotCQkJICAgc28gZnJlZSB0aGlzIHJlY3ZfZnJhbWUgKi8KLQkJCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYShwcmVjdl9mcmFtZSk7Ci0JCQlwcnRuZnJhbWUgPSBOVUxMOwotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkgIkZyZWUgYmVjYXVzZSBwZGVmcmFnX3EgPT0gTlVMTDogaXNtZnJhZyA9ICVkLCBmcmFnbnVtID0gJWRcbiIsCi0JCQkJIGlzbWZyYWcsIGZyYWdudW0pOwotCQl9Ci0JfQotCi0JaWYgKChpc21mcmFnID09IDApICYmIChmcmFnbnVtICE9IDApKSB7Ci0JCS8qIHRoZSBsYXN0IGZyYWdtZW50IGZyYW1lICovCi0JCS8qIGVucXVldWUgdGhlIGxhc3QgZnJhZ21lbnQgKi8KLQkJaWYgKHBkZWZyYWdfcSAhPSBOVUxMKSB7Ci0JCQkvKiBzcGluX2xvY2soJnBkZWZyYWdfcS0+bG9jayk7ICovCi0JCQlwaGVhZCA9IGdldF9saXN0X2hlYWQocGRlZnJhZ19xKTsKLQkJCWxpc3RfYWRkX3RhaWwoJnBmaGRyLT5saXN0LCBwaGVhZCk7Ci0JCQkvKiBzcGluX3VubG9jaygmcGRlZnJhZ19xLT5sb2NrKTsgKi8KLQotCQkJLyogY2FsbCByZWN2ZnJhbWVfZGVmcmFnIHRvIGRlZnJhZyAqLwotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCi0JCQkJICJkZWZyYWc6IGlzbWZyYWcgPSAlZCwgZnJhZ251bSA9ICVkXG4iLAotCQkJCSBpc21mcmFnLCBmcmFnbnVtKTsKLQkJCXByZWN2X2ZyYW1lID0gcmVjdmZyYW1lX2RlZnJhZyhwYWRhcHRlciwgcGRlZnJhZ19xKTsKLQkJCXBydG5mcmFtZSA9IHByZWN2X2ZyYW1lOwotCQl9IGVsc2UgewotCQkJLyogY2FuJ3QgZmluZCB0aGlzIHRhJ3MgZGVmcmFnX3F1ZXVlLAotCQkJICAgc28gZnJlZSB0aGlzIHJlY3ZfZnJhbWUgKi8KLQkJCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYShwcmVjdl9mcmFtZSk7Ci0JCQlwcnRuZnJhbWUgPSBOVUxMOwotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkgIkZyZWUgYmVjYXVzZSBwZGVmcmFnX3EgPT0gTlVMTDogaXNtZnJhZyA9ICVkLCBmcmFnbnVtID0gJWRcbiIsCi0JCQkJIGlzbWZyYWcsIGZyYWdudW0pOwotCQl9Ci0KLQl9Ci0KLQlpZiAoKHBydG5mcmFtZSAhPSBOVUxMKSAmJiAocHJ0bmZyYW1lLT5hdHRyaWIucHJpdmFjeSkpCXsKLQkJLyogYWZ0ZXIgZGVmcmFnIHdlIG11c3QgY2hlY2sgdGtpcCBtaWMgY29kZSAqLwotCQlpZiAocmVjdmZyYW1lX2Noa21pYyhwYWRhcHRlciwgIHBydG5mcmFtZSkgPT0gX0ZBSUwpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJyZWN2ZnJhbWVfY2hrbWljKHBhZGFwdGVyLCAgcHJ0bmZyYW1lKSA9PV9GQUlMXG4iKTsKLQkJCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYShwcnRuZnJhbWUpOwotCQkJcHJ0bmZyYW1lID0gTlVMTDsKLQkJfQotCX0KLQotCi0KLQlyZXR1cm4gcHJ0bmZyYW1lOwotfQotCi1pbnQgYW1zZHVfdG9fbXNkdShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJmcmFtZSk7Ci1pbnQgYW1zZHVfdG9fbXNkdShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJmcmFtZSkKLXsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqc3ViX3NrYjsKLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHNrYl9saXN0OwotCi0JcGF0dHJpYiA9ICZwcmZyYW1lLT5hdHRyaWI7Ci0KLQlza2IgPSBwcmZyYW1lLT5wa3Q7Ci0Jc2tiX3B1bGwoc2tiLCBwcmZyYW1lLT5hdHRyaWIuaGRybGVuKTsKLQlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJnNrYl9saXN0KTsKLQotCWllZWU4MDIxMV9hbXNkdV90b184MDIzcyhza2IsICZza2JfbGlzdCwgTlVMTCwgMCwgMCwgZmFsc2UpOwotCi0Jd2hpbGUgKCFza2JfcXVldWVfZW1wdHkoJnNrYl9saXN0KSkgewotCQlzdWJfc2tiID0gX19za2JfZGVxdWV1ZSgmc2tiX2xpc3QpOwotCi0JCXN1Yl9za2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc3ViX3NrYiwgcGFkYXB0ZXItPnBuZXRkZXYpOwotCQlzdWJfc2tiLT5kZXYgPSBwYWRhcHRlci0+cG5ldGRldjsKLQotCQlzdWJfc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwotCi0JCW5ldGlmX3J4KHN1Yl9za2IpOwotCX0KLQotCXByZnJhbWUtPnBrdCA9IE5VTEw7Ci0JcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHByZnJhbWUpOwotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotaW50IGNoZWNrX2luZGljYXRlX3NlcShzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmwsIHUxNiBzZXFfbnVtKTsKLWludCBjaGVja19pbmRpY2F0ZV9zZXEoc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsICpwcmVvcmRlcl9jdHJsLCB1MTYgc2VxX251bSkKLXsKLQl1OAl3c2l6ZSA9IHByZW9yZGVyX2N0cmwtPndzaXplX2I7Ci0JdTE2CXdlbmQgPSAocHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxICsgd3NpemUgLTEpICYgMHhGRkY7Ci0KLQkvKiAgUnggUmVvcmRlciBpbml0aWFsaXplIGNvbmRpdGlvbi4gKi8KLQlpZiAocHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxID09IDB4RkZGRikKLQkJcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxID0gc2VxX251bTsKLQotCS8qICBEcm9wIG91dCB0aGUgcGFja2V0IHdoaWNoIFNlcU51bSBpcyBzbWFsbGVyIHRoYW4gV2luU3RhcnQgKi8KLQlpZiAoU05fTEVTUyhzZXFfbnVtLCBwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkvKiAgKi8KLQkvKiAgU2xpZGluZyB3aW5kb3cgbWFuaXB1bGF0aW9uLiBDb25kaXRpb25zIGluY2x1ZGVzOiAqLwotCS8qICAxLiBJbmNvbWluZyBTZXFOdW0gaXMgZXF1YWwgdG8gV2luU3RhcnQgPT5XaW5kb3cgc2hpZnQgMSAqLwotCS8qICAyLiBJbmNvbWluZyBTZXFOdW0gaXMgbGFyZ2VyIHRoYW4gdGhlIFdpbkVuZCA9PiBXaW5kb3cgc2hpZnQgTiAqLwotCS8qICAqLwotCWlmIChTTl9FUVVBTChzZXFfbnVtLCBwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEpKSB7Ci0JCXByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSA9Ci0JCQkocHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxICsgMSkgJiAweEZGRjsKLQl9IGVsc2UgaWYgKFNOX0xFU1Mod2VuZCwgc2VxX251bSkpIHsKLQkJLyogIGJvdW5kYXJ5IHNpdHVhdGlvbiwgd2hlbiBzZXFfbnVtIGNyb3NzIDB4RkZGICovCi0JCWlmIChzZXFfbnVtID49ICh3c2l6ZSAtIDEpKQotCQkJcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxID0gc2VxX251bSArIDEgLXdzaXplOwotCQllbHNlCi0JCQlwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEgPSAweEZGRiAtICh3c2l6ZSAtIChzZXFfbnVtICsgMSkpICsgMTsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbnQgZW5xdWV1ZV9yZW9yZGVyX3JlY3ZmcmFtZTIzYShzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmwsCi0JCQkJCXN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lKQotewotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3QgcnR3X3F1ZXVlICpwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWU7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQsICpwbGlzdCwgKnB0bXA7Ci0Jc3RydWN0IHJlY3ZfZnJhbWUgKmhkcjsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcG5leHRhdHRyaWI7Ci0KLQlwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUgPSAmcHJlb3JkZXJfY3RybC0+cGVuZGluZ19yZWN2ZnJhbWVfcXVldWU7Ci0JcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZSk7Ci0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocGxpc3QsIHB0bXAsIHBoZWFkKSB7Ci0JCWhkciA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHJlY3ZfZnJhbWUsIGxpc3QpOwotCQlwbmV4dGF0dHJpYiA9ICZoZHItPmF0dHJpYjsKLQotCQlpZiAoU05fTEVTUyhwbmV4dGF0dHJpYi0+c2VxX251bSwgcGF0dHJpYi0+c2VxX251bSkpIHsKLQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgaWYgKFNOX0VRVUFMKHBuZXh0YXR0cmliLT5zZXFfbnVtLCBwYXR0cmliLT5zZXFfbnVtKSkgewotCQkJLyogRHVwbGljYXRlIGVudHJ5IGlzIGZvdW5kISEgRG8gbm90IGluc2VydCBjdXJyZW50IGVudHJ5LiAqLwotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJYnJlYWs7Ci0JCX0KLQotCX0KLQotCWxpc3RfZGVsX2luaXQoJnByZnJhbWUtPmxpc3QpOwotCi0JbGlzdF9hZGRfdGFpbCgmcHJmcmFtZS0+bGlzdCwgcGxpc3QpOwotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLWludCByZWN2X2luZGljYXRlcGt0c19pbl9vcmRlcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICAgIHN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybCwKLQkJCSAgICAgICBpbnQgYmZvcmNlZCk7Ci1pbnQgcmVjdl9pbmRpY2F0ZXBrdHNfaW5fb3JkZXIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgICBzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmwsCi0JCQkgICAgICAgaW50IGJmb3JjZWQpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQsICpwbGlzdDsKLQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJmcmFtZTsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYjsKLQlpbnQgYlBrdEluQnVmID0gZmFsc2U7Ci0Jc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2OwotCXN0cnVjdCBydHdfcXVldWUgKnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZTsKLQotCXByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7Ci0JcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlID0gJnByZW9yZGVyX2N0cmwtPnBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlOwotCXBoZWFkID0JZ2V0X2xpc3RfaGVhZChwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUpOwotCXBsaXN0ID0gcGhlYWQtPm5leHQ7Ci0KLQkvKiAgSGFuZGxpbmcgc29tZSBjb25kaXRpb24gZm9yIGZvcmNlZCBpbmRpY2F0ZSBjYXNlLiAqLwotCWlmIChiZm9yY2VkKSB7Ci0JCWlmIChsaXN0X2VtcHR5KHBoZWFkKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwcmZyYW1lID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3QgcmVjdl9mcmFtZSwgbGlzdCk7Ci0JCXBhdHRyaWIgPSAmcHJmcmFtZS0+YXR0cmliOwotCQlwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEgPSBwYXR0cmliLT5zZXFfbnVtOwotCX0KLQotCS8qICBQcmVwYXJlIGluZGljYXRpb24gbGlzdCBhbmQgaW5kaWNhdGlvbi4gKi8KLQkvKiAgQ2hlY2sgaWYgdGhlcmUgaXMgYW55IHBhY2tldCBuZWVkIGluZGljYXRlLiAqLwotCXdoaWxlICghbGlzdF9lbXB0eShwaGVhZCkpIHsKLQotCQlwcmZyYW1lID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3QgcmVjdl9mcmFtZSwgbGlzdCk7Ci0JCXBhdHRyaWIgPSAmcHJmcmFtZS0+YXR0cmliOwotCi0JCWlmICghU05fTEVTUyhwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEsIHBhdHRyaWItPnNlcV9udW0pKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9ub3RpY2VfLAotCQkJCSAicmVjdl9pbmRpY2F0ZXBrdHNfaW5fb3JkZXI6IGluZGljYXRlID0lZCBzZXEgPSVkIGFtc2R1ID0lZFxuIiwKLQkJCQkgcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxLAotCQkJCSBwYXR0cmliLT5zZXFfbnVtLCBwYXR0cmliLT5hbXNkdSk7Ci0KLQkJCXBsaXN0ID0gcGxpc3QtPm5leHQ7Ci0JCQlsaXN0X2RlbF9pbml0KCZwcmZyYW1lLT5saXN0KTsKLQotCQkJaWYgKFNOX0VRVUFMKHByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSwKLQkJCQkgICAgIHBhdHRyaWItPnNlcV9udW0pKQl7Ci0JCQkJcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxID0KLQkJCQkJKHByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSArIDEpJjB4RkZGOwotCQkJfQotCi0JCQlpZiAoIXBhdHRyaWItPmFtc2R1KSB7Ci0JCQkJaWYgKChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPT0gZmFsc2UpICYmCi0JCQkJICAgIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCA9PSBmYWxzZSkpIHsKLQkJCQkJcnR3X3JlY3ZfaW5kaWNhdGVwa3QyM2EocGFkYXB0ZXIsIHByZnJhbWUpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGFtc2R1X3RvX21zZHUocGFkYXB0ZXIsIHByZnJhbWUpICE9Ci0JCQkJICAgIF9TVUNDRVNTKQotCQkJCQlydHdfZnJlZV9yZWN2ZnJhbWUyM2EocHJmcmFtZSk7Ci0JCQl9Ci0KLQkJCS8qIFVwZGF0ZSBsb2NhbCB2YXJpYWJsZXMuICovCi0JCQliUGt0SW5CdWYgPSBmYWxzZTsKLQotCQl9IGVsc2UgewotCQkJYlBrdEluQnVmID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQl9Ci0KLQl9Ci0KLQlyZXR1cm4gYlBrdEluQnVmOwotfQotCi1pbnQgcmVjdl9pbmRpY2F0ZXBrdF9yZW9yZGVyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lKTsKLWludCByZWN2X2luZGljYXRlcGt0X3Jlb3JkZXIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZnJhbWUpCi17Ci0JaW50IHJldHZhbCA9IF9TVUNDRVNTOwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliOwotCXN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybDsKLQlzdHJ1Y3QgcnR3X3F1ZXVlICpwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWU7Ci0KLQlwYXR0cmliID0gJnByZnJhbWUtPmF0dHJpYjsKLQlwcmVvcmRlcl9jdHJsID0gcHJmcmFtZS0+cHJlb3JkZXJfY3RybDsKLQlwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUgPSAmcHJlb3JkZXJfY3RybC0+cGVuZGluZ19yZWN2ZnJhbWVfcXVldWU7Ci0KLQlpZiAoIXBhdHRyaWItPmFtc2R1KSB7Ci0JCS8qIHMxLiAqLwotCQl3bGFuaGRyX3RvX2V0aGhkcihwcmZyYW1lKTsKLQotCQlpZiAoKHBhdHRyaWItPnFvcyE9IDEpIHx8IChwYXR0cmliLT5ldGhfdHlwZSA9PSBFVEhfUF9BUlApIHx8Ci0JCSAgICAocGF0dHJpYi0+YWNrX3BvbGljeSAhPSAwKSkgewotCQkJaWYgKChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPT0gZmFsc2UpICYmCi0JCQkgICAgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID09IGZhbHNlKSkgewotCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X25vdGljZV8sCi0JCQkJCSAiQEBAQCAgcmVjdl9pbmRpY2F0ZXBrdF9yZW9yZGVyIC1yZWN2X2Z1bmMgcmVjdl9pbmRpY2F0ZXBrdFxuIik7Ci0KLQkJCQlydHdfcmVjdl9pbmRpY2F0ZXBrdDIzYShwYWRhcHRlciwgcHJmcmFtZSk7Ci0JCQkJcmV0dXJuIF9TVUNDRVNTOwotCQkJfQotCi0JCQlyZXR1cm4gX0ZBSUw7Ci0JCX0KLQotCQlpZiAocHJlb3JkZXJfY3RybC0+ZW5hYmxlID09IGZhbHNlKSB7Ci0JCQkvKiBpbmRpY2F0ZSB0aGlzIHJlY3ZfZnJhbWUgKi8KLQkJCXByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSA9IHBhdHRyaWItPnNlcV9udW07Ci0JCQlydHdfcmVjdl9pbmRpY2F0ZXBrdDIzYShwYWRhcHRlciwgcHJmcmFtZSk7Ci0KLQkJCXByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSA9Ci0JCQkJKHByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSArIDEpICUgNDA5NjsKLQkJCXJldHVybiBfU1VDQ0VTUzsKLQkJfQotCX0gZWxzZSB7Ci0JCSAvKiB0ZW1wIGZpbHRlciAtPiBtZWFucyBkaWRuJ3Qgc3VwcG9ydCBBLU1TRFVzIGluIGEgQS1NUERVICovCi0JCWlmIChwcmVvcmRlcl9jdHJsLT5lbmFibGUgPT0gZmFsc2UpIHsKLQkJCXByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSA9IHBhdHRyaWItPnNlcV9udW07Ci0JCQlyZXR2YWwgPSBhbXNkdV90b19tc2R1KHBhZGFwdGVyLCBwcmZyYW1lKTsKLQotCQkJcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxID0KLQkJCQkocHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxICsgMSkgJSA0MDk2OwotCQkJcmV0dXJuIHJldHZhbDsKLQkJfQotCX0KLQotCXNwaW5fbG9ja19iaCgmcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlLT5sb2NrKTsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X25vdGljZV8sCi0JCSAicmVjdl9pbmRpY2F0ZXBrdF9yZW9yZGVyOiBpbmRpY2F0ZSA9JWQgc2VxID0lZFxuIiwKLQkJIHByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSwgcGF0dHJpYi0+c2VxX251bSk7Ci0KLQkvKiBzMi4gY2hlY2sgaWYgd2luc3RhcnRfYihpbmRpY2F0ZV9zZXEpIG5lZWRzIHRvIGJlZW4gdXBkYXRlZCAqLwotCWlmICghY2hlY2tfaW5kaWNhdGVfc2VxKHByZW9yZGVyX2N0cmwsIHBhdHRyaWItPnNlcV9udW0pKSB7Ci0JCWdvdG8gX2Vycl9leGl0OwotCX0KLQotCS8qIHMzLiBJbnNlcnQgYWxsIHBhY2tldCBpbnRvIFJlb3JkZXIgUXVldWUgdG8gbWFpbnRhaW4gaXRzIG9yZGVyaW5nLiAqLwotCWlmICghZW5xdWV1ZV9yZW9yZGVyX3JlY3ZmcmFtZTIzYShwcmVvcmRlcl9jdHJsLCBwcmZyYW1lKSkgewotCQlnb3RvIF9lcnJfZXhpdDsKLQl9Ci0KLQkvKiBzNC4gKi8KLQkvKiAgSW5kaWNhdGlvbiBwcm9jZXNzLiAqLwotCS8qICBBZnRlciBQYWNrZXQgZHJvcHBpbmcgYW5kIFNsaWRpbmcgV2luZG93IHNoaWZ0aW5nIGFzIGFib3ZlLAotCSAgICB3ZSBjYW4gbm93IGp1c3QgaW5kaWNhdGUgdGhlIHBhY2tldHMgKi8KLQkvKiAgd2l0aCB0aGUgU2VxTnVtIHNtYWxsZXIgdGhhbiBsYXRlc3QgV2luU3RhcnQgYW5kIGJ1ZmZlcgotCSAgICBvdGhlciBwYWNrZXRzLiAqLwotCS8qICAqLwotCS8qICBGb3IgUnggUmVvcmRlciBjb25kaXRpb246ICovCi0JLyogIDEuIEFsbCBwYWNrZXRzIHdpdGggU2VxTnVtIHNtYWxsZXIgdGhhbiBXaW5TdGFydCA9PiBJbmRpY2F0ZSAqLwotCS8qICAyLiBBbGwgcGFja2V0cyB3aXRoIFNlcU51bSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byBXaW5TdGFydCA9PgotCSAgICBCdWZmZXIgaXQuICovCi0JLyogICovCi0KLQlpZiAocmVjdl9pbmRpY2F0ZXBrdHNfaW5fb3JkZXIocGFkYXB0ZXIsIHByZW9yZGVyX2N0cmwsIGZhbHNlKSA9PSB0cnVlKSB7Ci0JCW1vZF90aW1lcigmcHJlb3JkZXJfY3RybC0+cmVvcmRlcmluZ19jdHJsX3RpbWVyLAotCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhSRU9SREVSX1dBSVRfVElNRSkpOwotCQlzcGluX3VubG9ja19iaCgmcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlLT5sb2NrKTsKLQl9IGVsc2UgewotCQlzcGluX3VubG9ja19iaCgmcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlLT5sb2NrKTsKLQkJZGVsX3RpbWVyX3N5bmMoJnByZW9yZGVyX2N0cmwtPnJlb3JkZXJpbmdfY3RybF90aW1lcik7Ci0JfQotCXJldHVybiBfU1VDQ0VTUzsKLQotX2Vycl9leGl0OgotCi0Jc3Bpbl91bmxvY2tfYmgoJnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZS0+bG9jayk7Ci0JcmV0dXJuIF9GQUlMOwotfQotCi12b2lkIHJ0d19yZW9yZGVyaW5nX2N0cmxfdGltZW91dF9oYW5kbGVyMjNhKHVuc2lnbmVkIGxvbmcgcGNvbnRleHQpCi17Ci0Jc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsICpwcmVvcmRlcl9jdHJsOwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXI7Ci0Jc3RydWN0IHJ0d19xdWV1ZSAqcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlOwotCi0JcHJlb3JkZXJfY3RybCA9IChzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKilwY29udGV4dDsKLQlwYWRhcHRlciA9IHByZW9yZGVyX2N0cmwtPnBhZGFwdGVyOwotCXBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZSA9ICZwcmVvcmRlcl9jdHJsLT5wZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZTsKLQotCWlmIChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpIHsKLQkJcmV0dXJuOwotCX0KLQotCXNwaW5fbG9ja19iaCgmcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlLT5sb2NrKTsKLQotCWlmIChyZWN2X2luZGljYXRlcGt0c19pbl9vcmRlcihwYWRhcHRlciwgcHJlb3JkZXJfY3RybCwgdHJ1ZSkgPT0gdHJ1ZSkgewotCQltb2RfdGltZXIoJnByZW9yZGVyX2N0cmwtPnJlb3JkZXJpbmdfY3RybF90aW1lciwKLQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoUkVPUkRFUl9XQUlUX1RJTUUpKTsKLQl9Ci0KLQlzcGluX3VubG9ja19iaCgmcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlLT5sb2NrKTsKLX0KLQotaW50IHByb2Nlc3NfcmVjdl9pbmRpY2F0ZXBrdHMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lKTsKLWludCBwcm9jZXNzX3JlY3ZfaW5kaWNhdGVwa3RzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJmcmFtZSkKLXsKLQlpbnQgcmV0dmFsID0gX1NVQ0NFU1M7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgaHRfcHJpdiAqcGh0cHJpdiA9ICZwbWxtZXByaXYtPmh0cHJpdjsKLQotCWlmIChwaHRwcml2LT5odF9vcHRpb24gPT0gdHJ1ZSkgeyAvKiBCL0cvTiBNb2RlICovCi0JCS8qICBpbmNsdWRpbmcgcGVyZm9ybSBBLU1QRFUgUnggT3JkZXJpbmcgQnVmZmVyIENvbnRyb2wgKi8KLQkJaWYgKHJlY3ZfaW5kaWNhdGVwa3RfcmVvcmRlcihwYWRhcHRlciwgcHJmcmFtZSkgIT0gX1NVQ0NFU1MpIHsKLQkJCWlmICgocGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkID09IGZhbHNlKSAmJgotCQkJICAgIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCA9PSBmYWxzZSkpIHsKLQkJCQlyZXR2YWwgPSBfRkFJTDsKLQkJCQlyZXR1cm4gcmV0dmFsOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsgLyogQi9HIG1vZGUgKi8KLQkJcmV0dmFsID0gd2xhbmhkcl90b19ldGhoZHIocHJmcmFtZSk7Ci0JCWlmIChyZXR2YWwgIT0gX1NVQ0NFU1MpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJ3bGFuaGRyX3RvX2V0aGhkcjogZHJvcCBwa3RcbiIpOwotCQkJcmV0dXJuIHJldHZhbDsKLQkJfQotCi0JCWlmICgocGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkID09IGZhbHNlKSAmJgotCQkgICAgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID09IGZhbHNlKSkgewotCQkJLyogaW5kaWNhdGUgdGhpcyByZWN2X2ZyYW1lICovCi0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9ub3RpY2VfLAotCQkJCSAiQEBAQCBwcm9jZXNzX3JlY3ZfaW5kaWNhdGVwa3RzLSByZWN2X2Z1bmMgcmVjdl9pbmRpY2F0ZXBrdFxuIik7Ci0JCQlydHdfcmVjdl9pbmRpY2F0ZXBrdDIzYShwYWRhcHRlciwgcHJmcmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9ub3RpY2VfLAotCQkJCSAiQEBAQCBwcm9jZXNzX3JlY3ZfaW5kaWNhdGVwa3RzLSByZWN2X2Z1bmMgZnJlZV9pbmRpY2F0ZXBrdFxuIik7Ci0KLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X25vdGljZV8sCi0JCQkJICJyZWN2X2Z1bmM6YkRyaXZlclN0b3BwZWQoJWQpIE9SIGJTdXJwcmlzZVJlbW92ZWQoJWQpXG4iLAotCQkJCSBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQsCi0JCQkJIHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKTsKLQkJCXJldHZhbCA9IF9GQUlMOwotCQkJcmV0dXJuIHJldHZhbDsKLQkJfQotCi0JfQotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIGludCByZWN2X2Z1bmNfcHJlaGFuZGxlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnJmcmFtZSkKLXsKLQlpbnQgcmV0OwotCi0JLyogY2hlY2sgdGhlIGZyYW1lIGNydGwgZmllbGQgYW5kIGRlY2FjaGUgKi8KLQlyZXQgPSB2YWxpZGF0ZV9yZWN2X2ZyYW1lKHBhZGFwdGVyLCByZnJhbWUpOwotCWlmIChyZXQgIT0gX1NVQ0NFU1MpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCi0JCQkgInJlY3ZfZnVuYzogdmFsaWRhdGVfcmVjdl9mcmFtZSBmYWlsISBkcm9wIHBrdFxuIik7Ci0JCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYShyZnJhbWUpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi1leGl0OgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcmVjdl9mdW5jX3Bvc3RoYW5kbGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJmcmFtZSkKLXsKLQlpbnQgcmV0ID0gX1NVQ0NFU1M7Ci0Jc3RydWN0IHJlY3ZfZnJhbWUgKm9yaWdfcHJmcmFtZSA9IHByZnJhbWU7Ci0Jc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2ID0gJnBhZGFwdGVyLT5yZWN2cHJpdjsKLQotCS8qICBEQVRBIEZSQU1FICovCi0JcHJmcmFtZSA9IGRlY3J5cHRvcihwYWRhcHRlciwgcHJmcmFtZSk7Ci0JaWYgKHByZnJhbWUgPT0gTlVMTCkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJICJkZWNyeXB0b3I6IGRyb3AgcGt0XG4iKTsKLQkJcmV0ID0gX0ZBSUw7Ci0JCWdvdG8gX3JlY3ZfZGF0YV9kcm9wOwotCX0KLQotCXByZnJhbWUgPSByZWN2ZnJhbWVfY2hrX2RlZnJhZzIzYShwYWRhcHRlciwgcHJmcmFtZSk7Ci0JaWYgKCFwcmZyYW1lKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkgInJlY3ZmcmFtZV9jaGtfZGVmcmFnMjNhOiBkcm9wIHBrdFxuIik7Ci0JCWdvdG8gX3JlY3ZfZGF0YV9kcm9wOwotCX0KLQotCS8qCi0JICogUHVsbCBvZmYgY3J5cHRvIGhlYWRlcnMKLQkgKi8KLQlpZiAocHJmcmFtZS0+YXR0cmliLml2X2xlbiA+IDApIHsKLQkJc2tiX3B1bGwocHJmcmFtZS0+cGt0LCBwcmZyYW1lLT5hdHRyaWIuaXZfbGVuKTsKLQl9Ci0KLQlpZiAocHJmcmFtZS0+YXR0cmliLmljdl9sZW4gPiAwKSB7Ci0JCXNrYl90cmltKHByZnJhbWUtPnBrdCwKLQkJCSBwcmZyYW1lLT5wa3QtPmxlbiAtIHByZnJhbWUtPmF0dHJpYi5pY3ZfbGVuKTsKLQl9Ci0KLQlwcmZyYW1lID0gcG9ydGN0cmwocGFkYXB0ZXIsIHByZnJhbWUpOwotCWlmICghcHJmcmFtZSkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJICJwb3J0Y3RybDogZHJvcCBwa3RcbiIpOwotCQlyZXQgPSBfRkFJTDsKLQkJZ290byBfcmVjdl9kYXRhX2Ryb3A7Ci0JfQotCi0JY291bnRfcnhfc3RhdHMocGFkYXB0ZXIsIHByZnJhbWUsIE5VTEwpOwotCi0JcmV0ID0gcHJvY2Vzc19yZWN2X2luZGljYXRlcGt0cyhwYWRhcHRlciwgcHJmcmFtZSk7Ci0JaWYgKHJldCAhPSBfU1VDQ0VTUykgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJICJyZWN2X2Z1bmM6IHByb2Nlc3NfcmVjdl9pbmRpY2F0ZXBrdHMgZmFpbCFcbiIpOwotCQlydHdfZnJlZV9yZWN2ZnJhbWUyM2Eob3JpZ19wcmZyYW1lKTsvKiBmcmVlIHRoaXMgcmVjdl9mcmFtZSAqLwotCQlnb3RvIF9yZWN2X2RhdGFfZHJvcDsKLQl9Ci0JcmV0dXJuIHJldDsKLQotX3JlY3ZfZGF0YV9kcm9wOgotCXByZWN2cHJpdi0+cnhfZHJvcCsrOwotCXJldHVybiByZXQ7Ci19Ci0KLWludCBydHdfcmVjdl9lbnRyeTIzYShzdHJ1Y3QgcmVjdl9mcmFtZSAqcmZyYW1lKQotewotCWludCByZXQsIHI7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IHJmcmFtZS0+YWRhcHRlcjsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcHJ4YXR0cmliID0gJnJmcmFtZS0+YXR0cmliOwotCXN0cnVjdCByZWN2X3ByaXYgKnJlY3Zwcml2ID0gJnBhZGFwdGVyLT5yZWN2cHJpdjsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCXN0cnVjdCBtbG1lX3ByaXYgKm1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCS8qIGNoZWNrIGlmIG5lZWQgdG8gaGFuZGxlIHVjX3N3ZGVjX3BlbmRpbmdfcXVldWUqLwotCWlmIChjaGVja19md3N0YXRlKG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpICYmCi0JICAgIHBzZWN1cml0eXByaXYtPmJ1c2V0a2lwa2V5KQl7Ci0JCXN0cnVjdCByZWN2X2ZyYW1lICpwZW5kaW5nX2ZyYW1lOwotCi0JCXdoaWxlICgocGVuZGluZ19mcmFtZSA9IHJ0d19hbGxvY19yZWN2ZnJhbWUyM2EoJnBhZGFwdGVyLT5yZWN2cHJpdi51Y19zd2RlY19wZW5kaW5nX3F1ZXVlKSkpIHsKLQkJCXIgPSByZWN2X2Z1bmNfcG9zdGhhbmRsZShwYWRhcHRlciwgcGVuZGluZ19mcmFtZSk7Ci0JCQlpZiAociA9PSBfU1VDQ0VTUykKLQkJCQlEQkdfODcyM0EoIiVzOiBkZXF1ZXVlIHVjX3N3ZGVjX3BlbmRpbmdfcXVldWVcbiIsIF9fZnVuY19fKTsKLQkJfQotCX0KLQotCXJldCA9IHJlY3ZfZnVuY19wcmVoYW5kbGUocGFkYXB0ZXIsIHJmcmFtZSk7Ci0KLQlpZiAocmV0ID09IF9TVUNDRVNTKSB7Ci0JCS8qIGNoZWNrIGlmIG5lZWQgdG8gZW5xdWV1ZSBpbnRvIHVjX3N3ZGVjX3BlbmRpbmdfcXVldWUqLwotCQlpZiAoY2hlY2tfZndzdGF0ZShtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSAmJgotCQkgICAgIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHByeGF0dHJpYi0+cmEpICYmCi0JCSAgICBwcnhhdHRyaWItPmVuY3J5cHQgPiAwICYmCi0JCSAgICAocHJ4YXR0cmliLT5iZGVjcnlwdGVkID09IDApICYmCi0JCSAgICAhaXNfd2VwX2VuYyhwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtKSAmJgotCQkgICAgIXBzZWN1cml0eXByaXYtPmJ1c2V0a2lwa2V5KSB7Ci0JCQlydHdfZW5xdWV1ZV9yZWN2ZnJhbWUyM2EocmZyYW1lLCAmcGFkYXB0ZXItPnJlY3Zwcml2LnVjX3N3ZGVjX3BlbmRpbmdfcXVldWUpOwotCQkJREJHXzg3MjNBKCIlczogbm8ga2V5LCBlbnF1ZXVlIHVjX3N3ZGVjX3BlbmRpbmdfcXVldWVcbiIsIF9fZnVuY19fKTsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCi0JCXJldCA9IHJlY3ZfZnVuY19wb3N0aGFuZGxlKHBhZGFwdGVyLCByZnJhbWUpOwotCi0JCXJlY3Zwcml2LT5yeF9wa3RzKys7Ci0JfQotCi1leGl0OgotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgcnR3X3NpZ25hbF9zdGF0X3RpbWVyX2hkbDIzYSh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBydHdfYWRhcHRlciAqKWRhdGE7Ci0Jc3RydWN0IHJlY3ZfcHJpdiAqcmVjdnByaXYgPSAmYWRhcHRlci0+cmVjdnByaXY7Ci0KLQl1MzIgdG1wX3MsIHRtcF9xOwotCXU4IGF2Z19zaWduYWxfc3RyZW5ndGggPSAwOwotCXU4IGF2Z19zaWduYWxfcXVhbCA9IDA7Ci0JdTMyIG51bV9zaWduYWxfc3RyZW5ndGggPSAwOwotCXUzMiBudW1fc2lnbmFsX3F1YWwgPSAwOwotCXU4IF9hbHBoYSA9IDM7CS8qIHRoaXMgdmFsdWUgaXMgYmFzZWQgb24gY29udmVyZ2luZ19jb25zdGFudCA9IDUwMDAgKi8KLQkJCS8qIGFuZCBzYW1wbGluZ19pbnRlcnZhbCA9IDEwMDAgKi8KLQotCWlmIChyZWN2cHJpdi0+c2lnbmFsX3N0cmVuZ3RoX2RhdGEudXBkYXRlX3JlcSA9PSAwKSB7Ci0JCS8qICB1cGRhdGVfcmVxIGlzIGNsZWFyLCBtZWFucyB3ZSBnb3QgcnggKi8KLQkJYXZnX3NpZ25hbF9zdHJlbmd0aCA9IHJlY3Zwcml2LT5zaWduYWxfc3RyZW5ndGhfZGF0YS5hdmdfdmFsOwotCQludW1fc2lnbmFsX3N0cmVuZ3RoID0gcmVjdnByaXYtPnNpZ25hbF9zdHJlbmd0aF9kYXRhLnRvdGFsX251bTsKLQkJLyogIGFmdGVyIGF2Z192YWxzIGFyZSBhY3F1aXJlZCwgd2UgY2FuIHJlLXN0YXQgKi8KLQkJLyogdGhlIHNpZ25hbCB2YWx1ZXMgKi8KLQkJcmVjdnByaXYtPnNpZ25hbF9zdHJlbmd0aF9kYXRhLnVwZGF0ZV9yZXEgPSAxOwotCX0KLQotCWlmIChyZWN2cHJpdi0+c2lnbmFsX3F1YWxfZGF0YS51cGRhdGVfcmVxID09IDApIHsKLQkJLyogIHVwZGF0ZV9yZXEgaXMgY2xlYXIsIG1lYW5zIHdlIGdvdCByeCAqLwotCQlhdmdfc2lnbmFsX3F1YWwgPSByZWN2cHJpdi0+c2lnbmFsX3F1YWxfZGF0YS5hdmdfdmFsOwotCQludW1fc2lnbmFsX3F1YWwgPSByZWN2cHJpdi0+c2lnbmFsX3F1YWxfZGF0YS50b3RhbF9udW07Ci0JCS8qICBhZnRlciBhdmdfdmFscyBhcmUgYWNxdWlyZWQsIHdlIGNhbiByZS1zdGF0ICovCi0JCS8qdGhlIHNpZ25hbCB2YWx1ZXMgKi8KLQkJcmVjdnByaXYtPnNpZ25hbF9xdWFsX2RhdGEudXBkYXRlX3JlcSA9IDE7Ci0JfQotCi0JLyogdXBkYXRlIHZhbHVlIG9mIHNpZ25hbF9zdHJlbmd0aCwgcnNzaSwgc2lnbmFsX3F1YWwgKi8KLQlpZiAoIWNoZWNrX2Z3c3RhdGUoJmFkYXB0ZXItPm1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKSkgewotCQl0bXBfcyA9IGF2Z19zaWduYWxfc3RyZW5ndGggKyAoX2FscGhhIC0gMSkgKgotCQkJIHJlY3Zwcml2LT5zaWduYWxfc3RyZW5ndGg7Ci0JCWlmICh0bXBfcyAlX2FscGhhKQotCQkJdG1wX3MgPSB0bXBfcyAvIF9hbHBoYSArIDE7Ci0JCWVsc2UKLQkJCXRtcF9zID0gdG1wX3MgLyBfYWxwaGE7Ci0JCWlmICh0bXBfcyA+IDEwMCkKLQkJCXRtcF9zID0gMTAwOwotCi0JCXRtcF9xID0gYXZnX3NpZ25hbF9xdWFsICsgKF9hbHBoYSAtIDEpICogcmVjdnByaXYtPnNpZ25hbF9xdWFsOwotCQlpZiAodG1wX3EgJV9hbHBoYSkKLQkJCXRtcF9xID0gdG1wX3EgLyBfYWxwaGEgKyAxOwotCQllbHNlCi0JCQl0bXBfcSA9IHRtcF9xIC8gX2FscGhhOwotCQlpZiAodG1wX3EgPiAxMDApCi0JCQl0bXBfcSA9IDEwMDsKLQotCQlyZWN2cHJpdi0+c2lnbmFsX3N0cmVuZ3RoID0gdG1wX3M7Ci0JCXJlY3Zwcml2LT5zaWduYWxfcXVhbCA9IHRtcF9xOwotCi0JCURCR184NzIzQSgiJXMgc2lnbmFsX3N0cmVuZ3RoOiUzdSwgc2lnbmFsX3F1YWw6JTN1LCAiCi0JCQkgICJudW1fc2lnbmFsX3N0cmVuZ3RoOiV1LCBudW1fc2lnbmFsX3F1YWw6JXVcbiIsCi0JCQkgIF9fZnVuY19fLCByZWN2cHJpdi0+c2lnbmFsX3N0cmVuZ3RoLAotCQkJICByZWN2cHJpdi0+c2lnbmFsX3F1YWwsIG51bV9zaWduYWxfc3RyZW5ndGgsCi0JCQkgIG51bV9zaWduYWxfcXVhbCk7Ci0JfQotCi0JcnR3X3NldF9zaWduYWxfc3RhdF90aW1lcihyZWN2cHJpdik7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3NlY3VyaXR5LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3NlY3VyaXR5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNGNmZGYxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfc2VjdXJpdHkuYworKysgL2Rldi9udWxsCkBAIC0xLDE2MzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lICBfUlRXX1NFQ1VSSVRZX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8d2lmaS5oPgotI2luY2x1ZGUgPG9zZGVwX2ludGYuaD4KLQotLyogV0VQIHJlbGF0ZWQgPT09PT0gKi8KLQotI2RlZmluZSBDUkMzMl9QT0xZIDB4MDRjMTFkYjcKLQotc3RydWN0IGFyYzRjb250ZXh0IHsKLQl1MzIgeDsKLQl1MzIgeTsKLQl1OCBzdGF0ZVsyNTZdOwotfTsKLQotc3RhdGljIHZvaWQgYXJjZm91cl9pbml0KHN0cnVjdCBhcmM0Y29udGV4dCAqcGFyYzRjdHgsIHU4ICprZXksIHUzMiBrZXlfbGVuKQotewotCXUzMiB0LCB1OwotCXUzMiBrZXlpbmRleDsKLQl1MzIgc3RhdGVpbmRleDsKLQl1OCAqc3RhdGU7Ci0JdTMyIGNvdW50ZXI7Ci0KLQlzdGF0ZSA9IHBhcmM0Y3R4LT5zdGF0ZTsKLQlwYXJjNGN0eC0+eCA9IDA7Ci0JcGFyYzRjdHgtPnkgPSAwOwotCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCAyNTY7IGNvdW50ZXIrKykKLQkJc3RhdGVbY291bnRlcl0gPSAodTgpY291bnRlcjsKLQlrZXlpbmRleCA9IDA7Ci0Jc3RhdGVpbmRleCA9IDA7Ci0JZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IDI1NjsgY291bnRlcisrKSB7Ci0JCXQgPSBzdGF0ZVtjb3VudGVyXTsKLQkJc3RhdGVpbmRleCA9IChzdGF0ZWluZGV4ICsga2V5W2tleWluZGV4XSArIHQpICYgMHhmZjsKLQkJdSA9IHN0YXRlW3N0YXRlaW5kZXhdOwotCQlzdGF0ZVtzdGF0ZWluZGV4XSA9ICh1OCl0OwotCQlzdGF0ZVtjb3VudGVyXSA9ICh1OCl1OwotCQlpZiAoKytrZXlpbmRleCA+PSBrZXlfbGVuKQotCQkJa2V5aW5kZXggPSAwOwotCX0KLQotfQotCi1zdGF0aWMgdTMyIGFyY2ZvdXJfYnl0ZShzdHJ1Y3QgYXJjNGNvbnRleHQgKnBhcmM0Y3R4KQotewotCXUzMiB4OwotCXUzMiB5OwotCXUzMiBzeCwgc3k7Ci0JdTggKnN0YXRlOwotCi0Jc3RhdGUgPSBwYXJjNGN0eC0+c3RhdGU7Ci0JeCA9IChwYXJjNGN0eC0+eCArIDEpICYgMHhmZjsKLQlzeCA9IHN0YXRlW3hdOwotCXkgPSAoc3ggKyBwYXJjNGN0eC0+eSkgJiAweGZmOwotCXN5ID0gc3RhdGVbeV07Ci0JcGFyYzRjdHgtPnggPSB4OwotCXBhcmM0Y3R4LT55ID0geTsKLQlzdGF0ZVt5XSA9ICh1OClzeDsKLQlzdGF0ZVt4XSA9ICh1OClzeTsKLQotCXJldHVybiBzdGF0ZVsoc3ggKyBzeSkgJiAweGZmXTsKLX0KLQotc3RhdGljIHZvaWQgYXJjZm91cl9lbmNyeXB0KHN0cnVjdCBhcmM0Y29udGV4dCAqcGFyYzRjdHgsIHU4ICpkZXN0LAotCQkJICAgIHU4ICpzcmMsIHUzMiBsZW4pCi17Ci0JdTMyIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCWRlc3RbaV0gPSBzcmNbaV0gXiAodW5zaWduZWQgY2hhcilhcmNmb3VyX2J5dGUocGFyYzRjdHgpOwotfQotCi1zdGF0aWMgaW50IGJjcmMzMmluaXRpYWxpemVkOwotc3RhdGljIHUzMiBjcmMzMl90YWJsZVsyNTZdOwotCi1zdGF0aWMgdTggY3JjMzJfcmV2ZXJzZUJpdCh1OCBkYXRhKQotewotCXU4IHJldHZhbCA9ICgoZGF0YSA8PCA3KSAmIDB4ODApIHwgKChkYXRhIDw8IDUpICYgMHg0MCkgfAotCQkoKGRhdGEgPDwgMykgJiAweDIwKSB8ICgoZGF0YSA8PCAxKSAmIDB4MTApIHwKLQkJKChkYXRhID4+IDEpICYgMHgwOCkgfCAoKGRhdGEgPj4gMykgJiAweDA0KSB8Ci0JCSgoZGF0YSA+PiA1KSAmIDB4MDIpIHwgKChkYXRhID4+IDcpICYgMHgwMSk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIHZvaWQgY3JjMzJfaW5pdCh2b2lkKQotewotCWludCBpLCBqOwotCXUzMiBjOwotCXU4ICpwLCAqcDE7Ci0JdTggazsKLQotCWlmIChiY3JjMzJpbml0aWFsaXplZCA9PSAxKQotCQlyZXR1cm47Ci0KLQlwID0gKHU4ICopICZjOwotCWMgPSAweDEyMzQwMDAwOwotCi0JZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSB7Ci0JCWsgPSBjcmMzMl9yZXZlcnNlQml0KCh1OClpKTsKLQotCQlmb3IgKGMgPSAoKHUzMilrKSA8PCAyNCwgaiA9IDg7IGogPiAwOyAtLWopCi0JCQljID0gYyAmIDB4ODAwMDAwMDAgPyAoYyA8PCAxKSBeIENSQzMyX1BPTFkgOiAoYyA8PCAxKTsKLQotCQlwMSA9ICh1OCAqKSZjcmMzMl90YWJsZVtpXTsKLQotCQlwMVswXSA9IGNyYzMyX3JldmVyc2VCaXQocFszXSk7Ci0JCXAxWzFdID0gY3JjMzJfcmV2ZXJzZUJpdChwWzJdKTsKLQkJcDFbMl0gPSBjcmMzMl9yZXZlcnNlQml0KHBbMV0pOwotCQlwMVszXSA9IGNyYzMyX3JldmVyc2VCaXQocFswXSk7Ci0JfQotCi0JYmNyYzMyaW5pdGlhbGl6ZWQgPSAxOwotfQotCi1zdGF0aWMgdTMyIGdldGNyYzMyKHU4ICpidWYsIGludCBsZW4pCi17Ci0JdTggKnA7Ci0JdTMyIGNyYzsKLQotCWlmIChiY3JjMzJpbml0aWFsaXplZCA9PSAwKQotCQljcmMzMl9pbml0KCk7Ci0KLQljcmMgPSAweGZmZmZmZmZmOyAvKiBwcmVsb2FkIHNoaWZ0IHJlZ2lzdGVyLCBwZXIgQ1JDLTMyIHNwZWMgKi8KLQotCWZvciAocCA9IGJ1ZjsgbGVuID4gMDsgKytwLCAtLWxlbikKLQkJY3JjID0gY3JjMzJfdGFibGVbKGNyYyBeICpwKSAmIDB4ZmZdIF4gKGNyYyA+PiA4KTsKLQotCXJldHVybiB+Y3JjOyAvKiB0cmFuc21pdCBjb21wbGVtZW50LCBwZXIgQ1JDLTMyIHNwZWMgKi8KLX0KLQotLyogTmVlZCB0byBjb25zaWRlciB0aGUgZnJhZ21lbnQgIHNpdHVhdGlvbiAqLwotdm9pZCBydHdfd2VwX2VuY3J5cHQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICAgICBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKLXsKLQkvKiAgZXhjbHVkZSBJQ1YgKi8KLQlfX2xlMzIgY3JjOwotCXN0cnVjdCBhcmM0Y29udGV4dCBteWNvbnRleHQ7Ci0JaW50IGN1cmZyYWdudW0sIGxlbmd0aCwgaW5kZXg7Ci0JdTMyIGtleWxlbmd0aDsKLQl1OCAqcGZyYW1lLCAqcGF5bG9hZCwgKml2OyAvKiB3ZXBrZXkgKi8KLQl1OCB3ZXBrZXlbMTZdOwotCXU4IGh3X2hkcl9vZmZzZXQgPSAwOwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliID0gJnB4bWl0ZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0KLQlpZiAoIXB4bWl0ZnJhbWUtPmJ1Zl9hZGRyKQotCQlyZXR1cm47Ci0KLQlod19oZHJfb2Zmc2V0ID0gVFhERVNDX09GRlNFVDsKLQotCXBmcmFtZSA9IHB4bWl0ZnJhbWUtPmJ1Zl9hZGRyICsgaHdfaGRyX29mZnNldDsKLQotCS8qIHN0YXJ0IHRvIGVuY3J5cHQgZWFjaCBmcmFnbWVudCAqLwotCWlmIChwYXR0cmliLT5lbmNyeXB0ICE9IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwICYmCi0JICAgIHBhdHRyaWItPmVuY3J5cHQgIT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KQotCQlyZXR1cm47Ci0KLQlpbmRleCA9IHBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUtleUluZGV4OwotCWtleWxlbmd0aCA9IHBzZWN1cml0eXByaXYtPndlcF9rZXlbaW5kZXhdLmtleWxlbjsKLQotCWZvciAoY3VyZnJhZ251bSA9IDA7IGN1cmZyYWdudW0gPCBwYXR0cmliLT5ucl9mcmFncyA7IGN1cmZyYWdudW0rKykgewotCQlpdiA9IHBmcmFtZSArIHBhdHRyaWItPmhkcmxlbjsKLQkJbWVtY3B5KCZ3ZXBrZXlbMF0sIGl2LCAzKTsKLQkJbWVtY3B5KCZ3ZXBrZXlbM10sICZwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2luZGV4XS5rZXksCi0JCSAgICAgICBrZXlsZW5ndGgpOwotCQlwYXlsb2FkID0gcGZyYW1lICsgcGF0dHJpYi0+aXZfbGVuICsgcGF0dHJpYi0+aGRybGVuOwotCi0JCWlmICgoY3VyZnJhZ251bSArIDEpID09IHBhdHRyaWItPm5yX2ZyYWdzKSB7Ci0JCQkvKiB0aGUgbGFzdCBmcmFnbWVudCAqLwotCQkJbGVuZ3RoID0gcGF0dHJpYi0+bGFzdF90eGNtZHN6IC0gcGF0dHJpYi0+aGRybGVuIC0KLQkJCQlwYXR0cmliLT5pdl9sZW4gLSBwYXR0cmliLT5pY3ZfbGVuOwotCi0JCQljcmMgPSBjcHVfdG9fbGUzMihnZXRjcmMzMihwYXlsb2FkLCBsZW5ndGgpKTsKLQotCQkJYXJjZm91cl9pbml0KCZteWNvbnRleHQsIHdlcGtleSwgMyArIGtleWxlbmd0aCk7Ci0JCQlhcmNmb3VyX2VuY3J5cHQoJm15Y29udGV4dCwgcGF5bG9hZCwgcGF5bG9hZCwgbGVuZ3RoKTsKLQkJCWFyY2ZvdXJfZW5jcnlwdCgmbXljb250ZXh0LCBwYXlsb2FkICsgbGVuZ3RoLAotCQkJCQkoY2hhciAqKSZjcmMsIDQpOwotCQl9IGVsc2UgewotCQkJbGVuZ3RoID0gcHhtaXRwcml2LT5mcmFnX2xlbiAtIHBhdHRyaWItPmhkcmxlbiAtCi0JCQkJcGF0dHJpYi0+aXZfbGVuIC0gcGF0dHJpYi0+aWN2X2xlbjsKLQkJCWNyYyA9IGNwdV90b19sZTMyKGdldGNyYzMyKHBheWxvYWQsIGxlbmd0aCkpOwotCQkJYXJjZm91cl9pbml0KCZteWNvbnRleHQsIHdlcGtleSwgMyArIGtleWxlbmd0aCk7Ci0JCQlhcmNmb3VyX2VuY3J5cHQoJm15Y29udGV4dCwgcGF5bG9hZCwgcGF5bG9hZCwgbGVuZ3RoKTsKLQkJCWFyY2ZvdXJfZW5jcnlwdCgmbXljb250ZXh0LCBwYXlsb2FkICsgbGVuZ3RoLAotCQkJCQkoY2hhciAqKSZjcmMsIDQpOwotCi0JCQlwZnJhbWUgKz0gcHhtaXRwcml2LT5mcmFnX2xlbjsKLQkJCXBmcmFtZSA9IFBUUl9BTElHTihwZnJhbWUsIDQpOwotCQl9Ci0JfQotCi19Ci0KLXZvaWQgcnR3X3dlcF9kZWNyeXB0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCSAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpCi17Ci0JLyogIGV4Y2x1ZGUgSUNWICovCi0JdTMyIGFjdHVhbF9jcmMsIGV4cGVjdGVkX2NyYzsKLQlzdHJ1Y3QgYXJjNGNvbnRleHQgbXljb250ZXh0OwotCWludCBsZW5ndGg7Ci0JdTMyIGtleWxlbmd0aDsKLQl1OCAqcGZyYW1lLCAqcGF5bG9hZCwgKml2LCB3ZXBrZXlbMTZdOwotCXU4IGtleWluZGV4OwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwcnhhdHRyaWIgPSAmcHJlY3ZmcmFtZS0+YXR0cmliOwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByZWN2ZnJhbWUtPnBrdDsKLQotCXBmcmFtZSA9IHNrYi0+ZGF0YTsKLQotCS8qIHN0YXJ0IHRvIGRlY3J5cHQgcmVjdmZyYW1lICovCi0JaWYgKHByeGF0dHJpYi0+ZW5jcnlwdCAhPSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCAmJgotCSAgICBwcnhhdHRyaWItPmVuY3J5cHQgIT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KQotCQlyZXR1cm47Ci0KLQlpdiA9IHBmcmFtZSArIHByeGF0dHJpYi0+aGRybGVuOwotCS8qIGtleWluZGV4ID0gKGl2WzNdJjB4Myk7ICovCi0Ja2V5aW5kZXggPSBwcnhhdHRyaWItPmtleV9pbmRleDsKLQlrZXlsZW5ndGggPSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWluZGV4XS5rZXlsZW47Ci0JbWVtY3B5KCZ3ZXBrZXlbMF0sIGl2LCAzKTsKLQkvKiBtZW1jcHkoJndlcGtleVszXSwgJnBzZWN1cml0eXByaXYtPmRvdDExRGVmS2V5W3BzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUtleUluZGV4XS5za2V5WzBdLCBrZXlsZW5ndGgpOyAqLwotCW1lbWNweSgmd2Vwa2V5WzNdLCAmcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpbmRleF0ua2V5LCBrZXlsZW5ndGgpOwotCWxlbmd0aCA9IHNrYi0+bGVuIC0gcHJ4YXR0cmliLT5oZHJsZW4gLSBwcnhhdHRyaWItPml2X2xlbjsKLQotCXBheWxvYWQgPSBwZnJhbWUgKyBwcnhhdHRyaWItPml2X2xlbiArIHByeGF0dHJpYi0+aGRybGVuOwotCi0JLyogZGVjcnlwdCBwYXlsb2FkIGluY2x1ZGUgaWN2ICovCi0JYXJjZm91cl9pbml0KCZteWNvbnRleHQsIHdlcGtleSwgMyArIGtleWxlbmd0aCk7Ci0JYXJjZm91cl9lbmNyeXB0KCZteWNvbnRleHQsIHBheWxvYWQsIHBheWxvYWQsIGxlbmd0aCk7Ci0KLQkvKiBjYWxjdWxhdGUgaWN2IGFuZCBjb21wYXJlIHRoZSBpY3YgKi8KLQlhY3R1YWxfY3JjID0gZ2V0Y3JjMzIocGF5bG9hZCwgbGVuZ3RoIC0gNCk7Ci0JZXhwZWN0ZWRfY3JjID0gZ2V0X3VuYWxpZ25lZF9sZTMyKCZwYXlsb2FkW2xlbmd0aCAtIDRdKTsKLQotCWlmIChhY3R1YWxfY3JjICE9IGV4cGVjdGVkX2NyYykgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywKLQkJCSAiJXM6aWN2IENSQyBtaXNtYXRjaDogIgotCQkJICJhY3R1YWw6ICUwOHgsIGV4cGVjdGVkOiAlMDh4XG4iLAotCQkJIF9fZnVuY19fLCBhY3R1YWxfY3JjLCBleHBlY3RlZF9jcmMpOwotCX0KLX0KLQotLyogMwkJPT09PT0gVEtJUCByZWxhdGVkID09PT09ICovCi0KLXN0YXRpYyB1MzIgc2VjbWljZ2V0dWludDMyKHU4ICpwKQotLyogIENvbnZlcnQgZnJvbSBCeXRlW10gdG8gdTMyIGluIGEgcG9ydGFibGUgd2F5ICovCi17Ci0JczMyIGk7Ci0JdTMyIHJlcyA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCQlyZXMgfD0gKCh1MzIpKCpwKyspKSA8PCAoOCAqIGkpOwotCi0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIHZvaWQgc2VjbWljcHV0dWludDMyKHU4ICpwLCB1MzIgdmFsKQotLyogIENvbnZlcnQgZnJvbSBsb25nIHRvIEJ5dGVbXSBpbiBhIHBvcnRhYmxlIHdheSAqLwotewotCWxvbmcgaTsKLQotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJKnArKyA9ICh1OCkgKHZhbCAmIDB4ZmYpOwotCQl2YWwgPj49IDg7Ci0JfQotCi19Ci0KLXN0YXRpYyB2b2lkIHNlY21pY2NsZWFyKHN0cnVjdCBtaWNfZGF0YSAqcG1pY2RhdGEpCi17Ci0vKiAgUmVzZXQgdGhlIHN0YXRlIHRvIHRoZSBlbXB0eSBtZXNzYWdlLiAqLwotCi0JcG1pY2RhdGEtPkwgPSBwbWljZGF0YS0+SzA7Ci0JcG1pY2RhdGEtPlIgPSBwbWljZGF0YS0+SzE7Ci0JcG1pY2RhdGEtPm5CeXRlc0luTSA9IDA7Ci0JcG1pY2RhdGEtPk0gPSAwOwotCi19Ci0KLXZvaWQgcnR3X3NlY21pY3NldGtleTIzYShzdHJ1Y3QgbWljX2RhdGEgKnBtaWNkYXRhLCB1OCAqa2V5KQotewotCS8qICBTZXQgdGhlIGtleSAqLwotCi0JcG1pY2RhdGEtPkswID0gc2VjbWljZ2V0dWludDMyKGtleSk7Ci0JcG1pY2RhdGEtPksxID0gc2VjbWljZ2V0dWludDMyKGtleSArIDQpOwotCS8qICBhbmQgcmVzZXQgdGhlIG1lc3NhZ2UgKi8KLQlzZWNtaWNjbGVhcihwbWljZGF0YSk7Ci0KLX0KLQotdm9pZCBydHdfc2VjbWljYXBwZW5kMjNhYnl0ZTIzYShzdHJ1Y3QgbWljX2RhdGEgKnBtaWNkYXRhLCB1OCBiKQotewotCi0JLyogIEFwcGVuZCB0aGUgYnl0ZSB0byBvdXIgd29yZC1zaXplZCBidWZmZXIgKi8KLQlwbWljZGF0YS0+TSB8PSAoKHVuc2lnbmVkIGxvbmcpYikgPDwgKDggKiBwbWljZGF0YS0+bkJ5dGVzSW5NKTsKLQlwbWljZGF0YS0+bkJ5dGVzSW5NKys7Ci0JLyogIFByb2Nlc3MgdGhlIHdvcmQgaWYgaXQgaXMgZnVsbC4gKi8KLQlpZiAocG1pY2RhdGEtPm5CeXRlc0luTSA+PSA0KSB7Ci0JCXBtaWNkYXRhLT5MIF49IHBtaWNkYXRhLT5NOwotCQlwbWljZGF0YS0+UiBePSBST0wzMihwbWljZGF0YS0+TCwgMTcpOwotCQlwbWljZGF0YS0+TCArPSBwbWljZGF0YS0+UjsKLQkJcG1pY2RhdGEtPlIgXj0gKChwbWljZGF0YS0+TCAmIDB4ZmYwMGZmMDApID4+IDgpIHwgKChwbWljZGF0YS0+TCAmIDB4MDBmZjAwZmYpIDw8IDgpOwotCQlwbWljZGF0YS0+TCArPSBwbWljZGF0YS0+UjsKLQkJcG1pY2RhdGEtPlIgXj0gUk9MMzIocG1pY2RhdGEtPkwsIDMpOwotCQlwbWljZGF0YS0+TCArPSBwbWljZGF0YS0+UjsKLQkJcG1pY2RhdGEtPlIgXj0gUk9SMzIocG1pY2RhdGEtPkwsIDIpOwotCQlwbWljZGF0YS0+TCArPSBwbWljZGF0YS0+UjsKLQkJLyogIENsZWFyIHRoZSBidWZmZXIgKi8KLQkJcG1pY2RhdGEtPk0gPSAwOwotCQlwbWljZGF0YS0+bkJ5dGVzSW5NID0gMDsKLQl9Ci0KLX0KLQotdm9pZCBydHdfc2VjbWljYXBwZW5kMjNhKHN0cnVjdCBtaWNfZGF0YSAqcG1pY2RhdGEsIHU4ICpzcmMsIHUzMiBuYnl0ZXMpCi17Ci0KLQkvKiAgVGhpcyBpcyBzaW1wbGUgKi8KLQl3aGlsZSAobmJ5dGVzID4gMCkgewotCQlydHdfc2VjbWljYXBwZW5kMjNhYnl0ZTIzYShwbWljZGF0YSwgKnNyYysrKTsKLQkJbmJ5dGVzLS07Ci0JfQotCi19Ci0KLXZvaWQgcnR3X3NlY2dldG1pYzIzYShzdHJ1Y3QgbWljX2RhdGEgKnBtaWNkYXRhLCB1OCAqZHN0KQotewotCi0JLyogIEFwcGVuZCB0aGUgbWluaW11bSBwYWRkaW5nICovCi0JcnR3X3NlY21pY2FwcGVuZDIzYWJ5dGUyM2EocG1pY2RhdGEsIDB4NWEpOwotCXJ0d19zZWNtaWNhcHBlbmQyM2FieXRlMjNhKHBtaWNkYXRhLCAwKTsKLQlydHdfc2VjbWljYXBwZW5kMjNhYnl0ZTIzYShwbWljZGF0YSwgMCk7Ci0JcnR3X3NlY21pY2FwcGVuZDIzYWJ5dGUyM2EocG1pY2RhdGEsIDApOwotCXJ0d19zZWNtaWNhcHBlbmQyM2FieXRlMjNhKHBtaWNkYXRhLCAwKTsKLQkvKiAgYW5kIHRoZW4gemVyb2VzIHVudGlsIHRoZSBsZW5ndGggaXMgYSBtdWx0aXBsZSBvZiA0ICovCi0Jd2hpbGUgKHBtaWNkYXRhLT5uQnl0ZXNJbk0gIT0gMCkKLQkJcnR3X3NlY21pY2FwcGVuZDIzYWJ5dGUyM2EocG1pY2RhdGEsIDApOwotCS8qICBUaGUgYXBwZW5kQnl0ZSBmdW5jdGlvbiBoYXMgYWxyZWFkeSBjb21wdXRlZCB0aGUgcmVzdWx0LiAqLwotCXNlY21pY3B1dHVpbnQzMihkc3QsIHBtaWNkYXRhLT5MKTsKLQlzZWNtaWNwdXR1aW50MzIoZHN0ICsgNCwgcG1pY2RhdGEtPlIpOwotCS8qICBSZXNldCB0byB0aGUgZW1wdHkgbWVzc2FnZS4gKi8KLQlzZWNtaWNjbGVhcihwbWljZGF0YSk7Ci0KLX0KLQotdm9pZCBydHdfc2VjY2FsY3RraXBtaWMyM2EodTggKmtleSwgdTggKmhlYWRlciwgdTggKmRhdGEsIHUzMiBkYXRhX2xlbiwKLQkJCSAgIHU4ICptaWNfY29kZSwgdTggcHJpKQotewotCi0Jc3RydWN0IG1pY19kYXRhIG1pY2RhdGE7Ci0JdTggcHJpb3JpdHlbNF0gPSB7MHgwLCAweDAsIDB4MCwgMHgwfTsKLQotCXJ0d19zZWNtaWNzZXRrZXkyM2EoJm1pY2RhdGEsIGtleSk7Ci0JcHJpb3JpdHlbMF0gPSBwcmk7Ci0KLQkvKiBNaWNoYWVsIE1JQyBwc2V1ZG8gaGVhZGVyOiBEQSwgU0EsIDMgeCAwLCBQcmlvcml0eSAqLwotCWlmIChoZWFkZXJbMV0mMSkgeyAvKiBUb0RTID09IDEgKi8KLQkJCXJ0d19zZWNtaWNhcHBlbmQyM2EoJm1pY2RhdGEsICZoZWFkZXJbMTZdLCA2KTsgLyogREEgKi8KLQkJaWYgKGhlYWRlclsxXSYyKSAvKiBGcm9tIERzID09IDEgKi8KLQkJCXJ0d19zZWNtaWNhcHBlbmQyM2EoJm1pY2RhdGEsICZoZWFkZXJbMjRdLCA2KTsKLQkJZWxzZQotCQkJcnR3X3NlY21pY2FwcGVuZDIzYSgmbWljZGF0YSwgJmhlYWRlclsxMF0sIDYpOwotCX0gZWxzZSB7IC8qIFRvRFMgPT0gMCAqLwotCQlydHdfc2VjbWljYXBwZW5kMjNhKCZtaWNkYXRhLCAmaGVhZGVyWzRdLCA2KTsgLyogREEgKi8KLQkJaWYgKGhlYWRlclsxXSYyKSAvKiBGcm9tIERzID09IDEgKi8KLQkJCXJ0d19zZWNtaWNhcHBlbmQyM2EoJm1pY2RhdGEsICZoZWFkZXJbMTZdLCA2KTsKLQkJZWxzZQotCQkJcnR3X3NlY21pY2FwcGVuZDIzYSgmbWljZGF0YSwgJmhlYWRlclsxMF0sIDYpOwotCi0JfQotCXJ0d19zZWNtaWNhcHBlbmQyM2EoJm1pY2RhdGEsICZwcmlvcml0eVswXSwgNCk7Ci0KLQlydHdfc2VjbWljYXBwZW5kMjNhKCZtaWNkYXRhLCBkYXRhLCBkYXRhX2xlbik7Ci0KLQlydHdfc2VjZ2V0bWljMjNhKCZtaWNkYXRhLCBtaWNfY29kZSk7Ci0KLX0KLQotLyogbWFjcm9zIGZvciBleHRyYWN0aW9uL2NyZWF0aW9uIG9mIHVuc2lnbmVkIGNoYXIvdW5zaWduZWQgc2hvcnQgdmFsdWVzICAqLwotI2RlZmluZSBSb3RSMSh2MTYpICAgKCgoKHYxNikgPj4gMSkgJiAweDdGRkYpIF4gKCgodjE2KSAmIDEpIDw8IDE1KSkKLSNkZWZpbmUgICBMbzgodjE2KSAgICgodTgpKCh2MTYpICAgICAgICYgMHgwMEZGKSkKLSNkZWZpbmUgICBIaTgodjE2KSAgICgodTgpKCgodjE2KSA+PiA4KSAmIDB4MDBGRikpCi0jZGVmaW5lICBMbzE2KHYzMikgICAoKHUxNikoKHYzMikgICAgICAgJiAweEZGRkYpKQotI2RlZmluZSAgSGkxNih2MzIpICAgKCh1MTYpKCgodjMyKSA+PiAxNikgJiAweEZGRkYpKQotI2RlZmluZSAgTWsxNihoaSwgbG8pICgobG8pIF4gKCgodTE2KShoaSkpIDw8IDgpKQotCi0vKiBzZWxlY3QgdGhlIE50aCAxNi1iaXQgd29yZCBvZiB0aGUgdGVtcG9yYWwga2V5IHVuc2lnbmVkIGNoYXIgYXJyYXkgVEtbXSAqLwotI2RlZmluZSAgVEsxNihOKSAgICAgTWsxNih0a1syICogKE4pICsgMV0sIHRrWzIgKiAoTildKQotCi0vKiBTLWJveCBsb29rdXA6IDE2IGJpdHMgLS0+IDE2IGJpdHMgKi8KLSNkZWZpbmUgX1NfKHYxNikgICAgIChTYm94MVswXVtMbzgodjE2KV0gXiBTYm94MVsxXVtIaTgodjE2KV0pCi0KLS8qIGZpeGVkIGFsZ29yaXRobSAicGFyYW1ldGVycyIgKi8KLSNkZWZpbmUgUEhBU0UxX0xPT1BfQ05UICAgOCAgICAvKiB0aGlzIG5lZWRzIHRvIGJlICJiaWcgZW5vdWdoIiAgICAgKi8KLSNkZWZpbmUgVEFfU0laRSAgICAgICAgICAgNiAgICAvKiAgNDgtYml0IHRyYW5zbWl0dGVyIGFkZHJlc3MgICAgICAgKi8KLSNkZWZpbmUgVEtfU0laRSAgICAgICAgICAxNiAgICAvKiAxMjgtYml0IHRlbXBvcmFsIGtleSAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgUDFLX1NJWkUgICAgICAgICAxMCAgICAvKiAgODAtYml0IFBoYXNlMSBrZXkgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgUkM0X0tFWV9TSVpFICAgICAxNiAgICAvKiAxMjgtYml0IFJDNEtFWSAoMTA0IGJpdHMgdW5rbm93bikgKi8KLQotLyogMi11bnNpZ25lZCBjaGFyIGJ5IDItdW5zaWduZWQgY2hhciBzdWJzZXQgb2YgdGhlIGZ1bGwgQUVTIFMtYm94IHRhYmxlICovCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgU2JveDFbMl1bMjU2XSA9IHsKLQkvKiBTYm94IGZvciBoYXNoIChjYW4gYmUgaW4gUk9NKSAqLwotCXsKLQkJMHhDNkE1LCAweEY4ODQsIDB4RUU5OSwgMHhGNjhELCAweEZGMEQsIDB4RDZCRCwgMHhERUIxLCAweDkxNTQsCi0JCTB4NjA1MCwgMHgwMjAzLCAweENFQTksIDB4NTY3RCwgMHhFNzE5LCAweEI1NjIsIDB4NERFNiwgMHhFQzlBLAotCQkweDhGNDUsIDB4MUY5RCwgMHg4OTQwLCAweEZBODcsIDB4RUYxNSwgMHhCMkVCLCAweDhFQzksIDB4RkIwQiwKLQkJMHg0MUVDLCAweEIzNjcsIDB4NUZGRCwgMHg0NUVBLCAweDIzQkYsIDB4NTNGNywgMHhFNDk2LCAweDlCNUIsCi0JCTB4NzVDMiwgMHhFMTFDLCAweDNEQUUsIDB4NEM2QSwgMHg2QzVBLCAweDdFNDEsIDB4RjUwMiwgMHg4MzRGLAotCQkweDY4NUMsIDB4NTFGNCwgMHhEMTM0LCAweEY5MDgsIDB4RTI5MywgMHhBQjczLCAweDYyNTMsIDB4MkEzRiwKLQkJMHgwODBDLCAweDk1NTIsIDB4NDY2NSwgMHg5RDVFLCAweDMwMjgsIDB4MzdBMSwgMHgwQTBGLCAweDJGQjUsCi0JCTB4MEUwOSwgMHgyNDM2LCAweDFCOUIsIDB4REYzRCwgMHhDRDI2LCAweDRFNjksIDB4N0ZDRCwgMHhFQTlGLAotCQkweDEyMUIsIDB4MUQ5RSwgMHg1ODc0LCAweDM0MkUsIDB4MzYyRCwgMHhEQ0IyLCAweEI0RUUsIDB4NUJGQiwKLQkJMHhBNEY2LCAweDc2NEQsIDB4Qjc2MSwgMHg3RENFLCAweDUyN0IsIDB4REQzRSwgMHg1RTcxLCAweDEzOTcsCi0JCTB4QTZGNSwgMHhCOTY4LCAweDAwMDAsIDB4QzEyQywgMHg0MDYwLCAweEUzMUYsIDB4NzlDOCwgMHhCNkVELAotCQkweEQ0QkUsIDB4OEQ0NiwgMHg2N0Q5LCAweDcyNEIsIDB4OTRERSwgMHg5OEQ0LCAweEIwRTgsIDB4ODU0QSwKLQkJMHhCQjZCLCAweEM1MkEsIDB4NEZFNSwgMHhFRDE2LCAweDg2QzUsIDB4OUFENywgMHg2NjU1LCAweDExOTQsCi0JCTB4OEFDRiwgMHhFOTEwLCAweDA0MDYsIDB4RkU4MSwgMHhBMEYwLCAweDc4NDQsIDB4MjVCQSwgMHg0QkUzLAotCQkweEEyRjMsIDB4NURGRSwgMHg4MEMwLCAweDA1OEEsIDB4M0ZBRCwgMHgyMUJDLCAweDcwNDgsIDB4RjEwNCwKLQkJMHg2M0RGLCAweDc3QzEsIDB4QUY3NSwgMHg0MjYzLCAweDIwMzAsIDB4RTUxQSwgMHhGRDBFLCAweEJGNkQsCi0JCTB4ODE0QywgMHgxODE0LCAweDI2MzUsIDB4QzMyRiwgMHhCRUUxLCAweDM1QTIsIDB4ODhDQywgMHgyRTM5LAotCQkweDkzNTcsIDB4NTVGMiwgMHhGQzgyLCAweDdBNDcsIDB4QzhBQywgMHhCQUU3LCAweDMyMkIsIDB4RTY5NSwKLQkJMHhDMEEwLCAweDE5OTgsIDB4OUVEMSwgMHhBMzdGLCAweDQ0NjYsIDB4NTQ3RSwgMHgzQkFCLCAweDBCODMsCi0JCTB4OENDQSwgMHhDNzI5LCAweDZCRDMsIDB4MjgzQywgMHhBNzc5LCAweEJDRTIsIDB4MTYxRCwgMHhBRDc2LAotCQkweERCM0IsIDB4NjQ1NiwgMHg3NDRFLCAweDE0MUUsIDB4OTJEQiwgMHgwQzBBLCAweDQ4NkMsIDB4QjhFNCwKLQkJMHg5RjVELCAweEJENkUsIDB4NDNFRiwgMHhDNEE2LCAweDM5QTgsIDB4MzFBNCwgMHhEMzM3LCAweEYyOEIsCi0JCTB4RDUzMiwgMHg4QjQzLCAweDZFNTksIDB4REFCNywgMHgwMThDLCAweEIxNjQsIDB4OUNEMiwgMHg0OUUwLAotCQkweEQ4QjQsIDB4QUNGQSwgMHhGMzA3LCAweENGMjUsIDB4Q0FBRiwgMHhGNDhFLCAweDQ3RTksIDB4MTAxOCwKLQkJMHg2RkQ1LCAweEYwODgsIDB4NEE2RiwgMHg1QzcyLCAweDM4MjQsIDB4NTdGMSwgMHg3M0M3LCAweDk3NTEsCi0JCTB4Q0IyMywgMHhBMTdDLCAweEU4OUMsIDB4M0UyMSwgMHg5NkRELCAweDYxREMsIDB4MEQ4NiwgMHgwRjg1LAotCQkweEUwOTAsIDB4N0M0MiwgMHg3MUM0LCAweENDQUEsIDB4OTBEOCwgMHgwNjA1LCAweEY3MDEsIDB4MUMxMiwKLQkJMHhDMkEzLCAweDZBNUYsIDB4QUVGOSwgMHg2OUQwLCAweDE3OTEsIDB4OTk1OCwgMHgzQTI3LCAweDI3QjksCi0JCTB4RDkzOCwgMHhFQjEzLCAweDJCQjMsIDB4MjIzMywgMHhEMkJCLCAweEE5NzAsIDB4MDc4OSwgMHgzM0E3LAotCQkweDJEQjYsIDB4M0MyMiwgMHgxNTkyLCAweEM5MjAsIDB4ODc0OSwgMHhBQUZGLCAweDUwNzgsIDB4QTU3QSwKLQkJMHgwMzhGLCAweDU5RjgsIDB4MDk4MCwgMHgxQTE3LCAweDY1REEsIDB4RDczMSwgMHg4NEM2LCAweEQwQjgsCi0JCTB4ODJDMywgMHgyOUIwLCAweDVBNzcsIDB4MUUxMSwgMHg3QkNCLCAweEE4RkMsIDB4NkRENiwgMHgyQzNBLAotCX0sCi0JeyAvKiBzZWNvbmQgaGFsZiBvZiB0YWJsZSBpcyB1bnNpZ25lZCBjaGFyLXJldmVyc2VkIHZlcnNpb24gb2YgZmlyc3QhICovCi0JCTB4QTVDNiwgMHg4NEY4LCAweDk5RUUsIDB4OERGNiwgMHgwREZGLCAweEJERDYsIDB4QjFERSwgMHg1NDkxLAotCQkweDUwNjAsIDB4MDMwMiwgMHhBOUNFLCAweDdENTYsIDB4MTlFNywgMHg2MkI1LCAweEU2NEQsIDB4OUFFQywKLQkJMHg0NThGLCAweDlEMUYsIDB4NDA4OSwgMHg4N0ZBLCAweDE1RUYsIDB4RUJCMiwgMHhDOThFLCAweDBCRkIsCi0JCTB4RUM0MSwgMHg2N0IzLCAweEZENUYsIDB4RUE0NSwgMHhCRjIzLCAweEY3NTMsIDB4OTZFNCwgMHg1QjlCLAotCQkweEMyNzUsIDB4MUNFMSwgMHhBRTNELCAweDZBNEMsIDB4NUE2QywgMHg0MTdFLCAweDAyRjUsIDB4NEY4MywKLQkJMHg1QzY4LCAweEY0NTEsIDB4MzREMSwgMHgwOEY5LCAweDkzRTIsIDB4NzNBQiwgMHg1MzYyLCAweDNGMkEsCi0JCTB4MEMwOCwgMHg1Mjk1LCAweDY1NDYsIDB4NUU5RCwgMHgyODMwLCAweEExMzcsIDB4MEYwQSwgMHhCNTJGLAotCQkweDA5MEUsIDB4MzYyNCwgMHg5QjFCLCAweDNEREYsIDB4MjZDRCwgMHg2OTRFLCAweENEN0YsIDB4OUZFQSwKLQkJMHgxQjEyLCAweDlFMUQsIDB4NzQ1OCwgMHgyRTM0LCAweDJEMzYsIDB4QjJEQywgMHhFRUI0LCAweEZCNUIsCi0JCTB4RjZBNCwgMHg0RDc2LCAweDYxQjcsIDB4Q0U3RCwgMHg3QjUyLCAweDNFREQsIDB4NzE1RSwgMHg5NzEzLAotCQkweEY1QTYsIDB4NjhCOSwgMHgwMDAwLCAweDJDQzEsIDB4NjA0MCwgMHgxRkUzLCAweEM4NzksIDB4RURCNiwKLQkJMHhCRUQ0LCAweDQ2OEQsIDB4RDk2NywgMHg0QjcyLCAweERFOTQsIDB4RDQ5OCwgMHhFOEIwLCAweDRBODUsCi0JCTB4NkJCQiwgMHgyQUM1LCAweEU1NEYsIDB4MTZFRCwgMHhDNTg2LCAweEQ3OUEsIDB4NTU2NiwgMHg5NDExLAotCQkweENGOEEsIDB4MTBFOSwgMHgwNjA0LCAweDgxRkUsIDB4RjBBMCwgMHg0NDc4LCAweEJBMjUsIDB4RTM0QiwKLQkJMHhGM0EyLCAweEZFNUQsIDB4QzA4MCwgMHg4QTA1LCAweEFEM0YsIDB4QkMyMSwgMHg0ODcwLCAweDA0RjEsCi0JCTB4REY2MywgMHhDMTc3LCAweDc1QUYsIDB4NjM0MiwgMHgzMDIwLCAweDFBRTUsIDB4MEVGRCwgMHg2REJGLAotCQkweDRDODEsIDB4MTQxOCwgMHgzNTI2LCAweDJGQzMsIDB4RTFCRSwgMHhBMjM1LCAweENDODgsIDB4MzkyRSwKLQkJMHg1NzkzLCAweEYyNTUsIDB4ODJGQywgMHg0NzdBLCAweEFDQzgsIDB4RTdCQSwgMHgyQjMyLCAweDk1RTYsCi0JCTB4QTBDMCwgMHg5ODE5LCAweEQxOUUsIDB4N0ZBMywgMHg2NjQ0LCAweDdFNTQsIDB4QUIzQiwgMHg4MzBCLAotCQkweENBOEMsIDB4MjlDNywgMHhEMzZCLCAweDNDMjgsIDB4NzlBNywgMHhFMkJDLCAweDFEMTYsIDB4NzZBRCwKLQkJMHgzQkRCLCAweDU2NjQsIDB4NEU3NCwgMHgxRTE0LCAweERCOTIsIDB4MEEwQywgMHg2QzQ4LCAweEU0QjgsCi0JCTB4NUQ5RiwgMHg2RUJELCAweEVGNDMsIDB4QTZDNCwgMHhBODM5LCAweEE0MzEsIDB4MzdEMywgMHg4QkYyLAotCQkweDMyRDUsIDB4NDM4QiwgMHg1OTZFLCAweEI3REEsIDB4OEMwMSwgMHg2NEIxLCAweEQyOUMsIDB4RTA0OSwKLQkJMHhCNEQ4LCAweEZBQUMsIDB4MDdGMywgMHgyNUNGLCAweEFGQ0EsIDB4OEVGNCwgMHhFOTQ3LCAweDE4MTAsCi0JCTB4RDU2RiwgMHg4OEYwLCAweDZGNEEsIDB4NzI1QywgMHgyNDM4LCAweEYxNTcsIDB4Qzc3MywgMHg1MTk3LAotCQkweDIzQ0IsIDB4N0NBMSwgMHg5Q0U4LCAweDIxM0UsIDB4REQ5NiwgMHhEQzYxLCAweDg2MEQsIDB4ODUwRiwKLQkJMHg5MEUwLCAweDQyN0MsIDB4QzQ3MSwgMHhBQUNDLCAweEQ4OTAsIDB4MDUwNiwgMHgwMUY3LCAweDEyMUMsCi0JCTB4QTNDMiwgMHg1RjZBLCAweEY5QUUsIDB4RDA2OSwgMHg5MTE3LCAweDU4OTksIDB4MjczQSwgMHhCOTI3LAotCQkweDM4RDksIDB4MTNFQiwgMHhCMzJCLCAweDMzMjIsIDB4QkJEMiwgMHg3MEE5LCAweDg5MDcsIDB4QTczMywKLQkJMHhCNjJELCAweDIyM0MsIDB4OTIxNSwgMHgyMEM5LCAweDQ5ODcsIDB4RkZBQSwgMHg3ODUwLCAweDdBQTUsCi0JCTB4OEYwMywgMHhGODU5LCAweDgwMDksIDB4MTcxQSwgMHhEQTY1LCAweDMxRDcsIDB4QzY4NCwgMHhCOEQwLAotCQkweEMzODIsIDB4QjAyOSwgMHg3NzVBLCAweDExMUUsIDB4Q0I3QiwgMHhGQ0E4LCAweEQ2NkQsIDB4M0EyQywKLQl9Ci19OwotCi0gLyoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogUm91dGluZTogUGhhc2UgMSAtLSBnZW5lcmF0ZSBQMUssIGdpdmVuIFRBLCBUSywgSVYzMgotKgotKiBJbnB1dHM6Ci0qICAgICB0a1tdICAgICAgPSB0ZW1wb3JhbCBrZXkgICAgICAgICAgICAgICAgICAgICAgICAgWzEyOCBiaXRzXQotKiAgICAgdGFbXSAgICAgID0gdHJhbnNtaXR0ZXIncyBNQUMgYWRkcmVzcyAgICAgICAgICAgIFsgNDggYml0c10KLSogICAgIGl2MzIgICAgICA9IHVwcGVyIDMyIGJpdHMgb2YgSVYgICAgICAgICAgICAgICAgICBbIDMyIGJpdHNdCi0qIE91dHB1dDoKLSogICAgIHAxa1tdICAgICA9IFBoYXNlIDEga2V5ICAgICAgICAgICAgICAgICAgICAgICAgICBbIDgwIGJpdHNdCi0qCi0qIE5vdGU6Ci0qICAgICBUaGlzIGZ1bmN0aW9uIG9ubHkgbmVlZHMgdG8gYmUgY2FsbGVkIGV2ZXJ5IDIqKjE2IHBhY2tldHMsCi0qICAgICBhbHRob3VnaCBpbiB0aGVvcnkgaXQgY291bGQgYmUgY2FsbGVkIGV2ZXJ5IHBhY2tldC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1zdGF0aWMgdm9pZCBwaGFzZTEodTE2ICpwMWssIGNvbnN0IHU4ICp0aywgY29uc3QgdTggKnRhLCB1MzIgaXYzMikKLXsKLQlpbnQgIGk7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSA4MCBiaXRzIG9mIFAxS1tdIGZyb20gSVYzMiBhbmQgVEFbMC4uNV0gKi8KLQlwMWtbMF0gICAgICA9IExvMTYoaXYzMik7Ci0JcDFrWzFdICAgICAgPSBIaTE2KGl2MzIpOwotCXAxa1syXSAgICAgID0gTWsxNih0YVsxXSwgdGFbMF0pOyAvKiB1c2UgVEFbXSBhcyBsaXR0bGUtZW5kaWFuICovCi0JcDFrWzNdICAgICAgPSBNazE2KHRhWzNdLCB0YVsyXSk7Ci0JcDFrWzRdICAgICAgPSBNazE2KHRhWzVdLCB0YVs0XSk7Ci0KLQkvKiBOb3cgY29tcHV0ZSBhbiB1bmJhbGFuY2VkIEZlaXN0ZWwgY2lwaGVyIHdpdGggODAtYml0IGJsb2NrICovCi0JLyogc2l6ZSBvbiB0aGUgODAtYml0IGJsb2NrIFAxS1tdLCB1c2luZyB0aGUgMTI4LWJpdCBrZXkgVEtbXSAqLwotCWZvciAoaSA9IDA7IGkgPCBQSEFTRTFfTE9PUF9DTlQ7IGkrKykgewotCQkvKiBFYWNoIGFkZCBvcGVyYXRpb24gaGVyZSBpcyBtb2QgMioqMTYgKi8KLQkJcDFrWzBdICs9IF9TXyhwMWtbNF0gXiBUSzE2KChpICYgMSkgKyAwKSk7Ci0JCXAxa1sxXSArPSBfU18ocDFrWzBdIF4gVEsxNigoaSAmIDEpICsgMikpOwotCQlwMWtbMl0gKz0gX1NfKHAxa1sxXSBeIFRLMTYoKGkgJiAxKSArIDQpKTsKLQkJcDFrWzNdICs9IF9TXyhwMWtbMl0gXiBUSzE2KChpICYgMSkgKyA2KSk7Ci0JCXAxa1s0XSArPSBfU18ocDFrWzNdIF4gVEsxNigoaSAmIDEpICsgMCkpOwotCQlwMWtbNF0gKz0gICh1bnNpZ25lZCBzaG9ydCkgaTsgLyogYXZvaWQgInNsaWRlIGF0dGFja3MiICovCi0JCX0KLQotfQotCi0vKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBSb3V0aW5lOiBQaGFzZSAyIC0tIGdlbmVyYXRlIFJDNEtFWSwgZ2l2ZW4gVEssIFAxSywgSVYxNgotKgotKiBJbnB1dHM6Ci0qICAgICB0a1tdICAgICAgPSBUZW1wb3JhbCBrZXkgICAgICAgICAgICAgICAgICAgICAgICAgWzEyOCBiaXRzXQotKiAgICAgcDFrW10gICAgID0gUGhhc2UgMSBvdXRwdXQga2V5ICAgICAgICAgICAgICAgICAgIFsgODAgYml0c10KLSogICAgIGl2MTYgICAgICA9IGxvdyAxNiBiaXRzIG9mIElWIGNvdW50ZXIgICAgICAgICAgICBbIDE2IGJpdHNdCi0qIE91dHB1dDoKLSogICAgIHJjNGtleVtdICA9IHRoZSBrZXkgdXNlZCB0byBlbmNyeXB0IHRoZSBwYWNrZXQgICBbMTI4IGJpdHNdCi0qCi0qIE5vdGU6Ci0qICAgICBUaGUgdmFsdWUge1RBLCBJVjMyLCBJVjE2fSBmb3IgUGhhc2UxL1BoYXNlMiBtdXN0IGJlIHVuaXF1ZQotKiAgICAgYWNyb3NzIGFsbCBwYWNrZXRzIHVzaW5nIHRoZSBzYW1lIGtleSBUSyB2YWx1ZS4gVGhlbiwgZm9yIGEKLSogICAgIGdpdmVuIHZhbHVlIG9mIFRLW10sIHRoaXMgVEtJUDQ4IGNvbnN0cnVjdGlvbiBndWFyYW50ZWVzIHRoYXQKLSogICAgIHRoZSBmaW5hbCBSQzRLRVkgdmFsdWUgaXMgdW5pcXVlIGFjcm9zcyBhbGwgcGFja2V0cy4KLSoKLSogU3VnZ2VzdGVkIGltcGxlbWVudGF0aW9uIG9wdGltaXphdGlvbjogaWYgUFBLW10gaXMgIm92ZXJsYWlkIgotKiAgICAgYXBwcm9wcmlhdGVseSBvbiBSQzRLRVlbXSwgdGhlcmUgaXMgbm8gbmVlZCBmb3IgdGhlIGZpbmFsCi0qICAgICBmb3IgbG9vcCBiZWxvdyB0aGF0IGNvcGllcyB0aGUgUFBLW10gcmVzdWx0IGludG8gUkM0S0VZW10uCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qLwotc3RhdGljIHZvaWQgcGhhc2UyKHU4ICpyYzRrZXksIGNvbnN0IHU4ICp0aywgY29uc3QgdTE2ICpwMWssIHUxNiBpdjE2KQotewotCWludCAgaTsKLQl1MTYgUFBLWzZdOyAvKiB0ZW1wb3Jhcnkga2V5IGZvciBtaXhpbmcgICAgKi8KLQotCS8qIE5vdGU6IGFsbCBhZGRzIGluIHRoZSBQUEtbXSBlcXVhdGlvbnMgYmVsb3cgYXJlIG1vZCAyKioxNiAqLwotCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCi0JCVBQS1tpXSA9IHAxa1tpXTsgLyogZmlyc3QsIGNvcHkgUDFLIHRvIFBQSyAqLwotCi0JUFBLWzVdID0gcDFrWzRdICsgaXYxNjsgLyogbmV4dCwgIGFkZCBpbiBJVjE2ICovCi0KLQkvKiBCaWplY3RpdmUgbm9uLWxpbmVhciBtaXhpbmcgb2YgdGhlIDk2IGJpdHMgb2YgUFBLWzAuLjVdICovCi0JUFBLWzBdICs9IF9TXyhQUEtbNV0gXiBUSzE2KDApKTsgLyogTWl4IGtleSBpbiBlYWNoICJyb3VuZCIgKi8KLQlQUEtbMV0gKz0gX1NfKFBQS1swXSBeIFRLMTYoMSkpOwotCVBQS1syXSArPSBfU18oUFBLWzFdIF4gVEsxNigyKSk7Ci0JUFBLWzNdICs9IF9TXyhQUEtbMl0gXiBUSzE2KDMpKTsKLQlQUEtbNF0gKz0gX1NfKFBQS1szXSBeIFRLMTYoNCkpOwotCVBQS1s1XSArPSBfU18oUFBLWzRdIF4gVEsxNig1KSk7IC8qIFRvdGFsICMgUy1ib3ggbG9va3VwcyA9PSA2ICovCi0KLQkvKiBGaW5hbCBzd2VlcDogYmlqZWN0aXZlLCAibGluZWFyIi4gUm90YXRlcyBraWxsIExTQiBjb3JyZWxhdGlvbnMgKi8KLQlQUEtbMF0gKz0gIFJvdFIxKFBQS1s1XSBeIFRLMTYoNikpOwotCVBQS1sxXSArPSAgUm90UjEoUFBLWzBdIF4gVEsxNig3KSk7IC8qIFVzZSBhbGwgb2YgVEtbXSBpbiBQaGFzZTIgKi8KLQlQUEtbMl0gKz0gIFJvdFIxKFBQS1sxXSk7Ci0JUFBLWzNdICs9ICBSb3RSMShQUEtbMl0pOwotCVBQS1s0XSArPSAgUm90UjEoUFBLWzNdKTsKLQlQUEtbNV0gKz0gIFJvdFIxKFBQS1s0XSk7Ci0JLyogTm90ZTogQXQgdGhpcyBwb2ludCwgZm9yIGEgZ2l2ZW4ga2V5IFRLWzAuLjE1XSwgdGhlIDk2LWJpdCBvdXRwdXQgKi8KLQkvKiAgICAgICB2YWx1ZSBQUEtbMC4uNV0gaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUsIGFzIGEgZnVuY3Rpb24gICAqLwotCS8qICAgICAgIG9mIHRoZSA5Ni1iaXQgImlucHV0IiB2YWx1ZSAgIHtUQSwgSVYzMiwgSVYxNn0uIFRoYXQgaXMsICAgICovCi0JLyogICAgICAgUDFLIGlzIG5vdyBhIGtleWVkIHBlcm11dGF0aW9uIG9mIHtUQSwgSVYzMiwgSVYxNn0uICAgICAgICAgKi8KLQotCS8qIFNldCBSQzRLRVlbMC4uM10sIHdoaWNoIGluY2x1ZGVzICJjbGVhcnRleHQiIHBvcnRpb24gb2YgUkM0IGtleSAgICovCi0JcmM0a2V5WzBdID0gSGk4KGl2MTYpOyAgICAgICAgICAgICAgICAgLyogUkM0S0VZWzAuLjJdIGlzIHRoZSBXRVAgSVYgKi8KLQlyYzRrZXlbMV0gPSAoSGk4KGl2MTYpIHwgMHgyMCkgJiAweDdGOyAvKiBIZWxwIGF2b2lkIHdlYWsgKEZNUykga2V5cyAqLwotCXJjNGtleVsyXSA9IExvOChpdjE2KTsKLQlyYzRrZXlbM10gPSBMbzgoKFBQS1s1XSBeIFRLMTYoMCkpID4+IDEpOwotCi0JLyogQ29weSA5NiBiaXRzIG9mIFBQS1swLi41XSB0byBSQzRLRVlbNC4uMTVdICAobGl0dGxlLWVuZGlhbikgKi8KLQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0JCXJjNGtleVs0ICsgMiAqIGldID0gTG84KFBQS1tpXSk7Ci0JCXJjNGtleVs1ICsgMiAqIGldID0gSGk4KFBQS1tpXSk7Ci0JfQotCi19Ci0KLS8qIFRoZSBobGVuIGlzbid0IGluY2x1ZGUgdGhlIElWICovCi1pbnQgcnR3X3RraXBfZW5jcnlwdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCi17Ci0JdTE2IHBubDsKLQl1MzIgcG5oOwotCXU4IHJjNGtleVsxNl07Ci0JdTggdHRrZXlbMTZdOwotCV9fbGUzMiBjcmM7Ci0JdTggaHdfaGRyX29mZnNldCA9IDA7Ci0Jc3RydWN0IGFyYzRjb250ZXh0IG15Y29udGV4dDsKLQlpbnQgY3VyZnJhZ251bSwgbGVuZ3RoOwotCXU4ICpwZnJhbWUsICpwYXlsb2FkLCAqaXYsICpwcndza2V5OwotCXVuaW9uIHBuNDggZG90MTF0eHBuOwotCXN0cnVjdCBzdGFfaW5mbyAqc3RhaW5mbzsKLQlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZweG1pdGZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQotCWlmIChwYXR0cmliLT5lbmNyeXB0ICE9IFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVApCi0JCXJldHVybiBfRkFJTDsKLQotCWlmICghcHhtaXRmcmFtZS0+YnVmX2FkZHIpCi0JCXJldHVybiBfRkFJTDsKLQotCWh3X2hkcl9vZmZzZXQgPSBUWERFU0NfT0ZGU0VUOwotCi0JcGZyYW1lID0gcHhtaXRmcmFtZS0+YnVmX2FkZHIgKyBod19oZHJfb2Zmc2V0OwotCi0JaWYgKHBhdHRyaWItPnBzdGEpCi0JCXN0YWluZm8gPSBwYXR0cmliLT5wc3RhOwotCWVsc2UgewotCQlEQkdfODcyM0EoIiVzLCBjYWxsIHJ0d19nZXRfc3RhaW5mbygpXG4iLCBfX2Z1bmNfXyk7Ci0JCXN0YWluZm8gPSBydHdfZ2V0X3N0YWluZm8yM2EoJnBhZGFwdGVyLT5zdGFwcml2LAotCQkJCQkgICAgICZwYXR0cmliLT5yYVswXSk7Ci0JfQotCi0JaWYgKCFzdGFpbmZvKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLAotCQkJICIlczogc3RhaW5mbyA9PSBOVUxMISEhXG4iLCBfX2Z1bmNfXyk7Ci0JCURCR184NzIzQSgiJXMsIHBzdGEgPT0gTlVMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywKLQkJICIlczogc3RhaW5mbyE9IE5VTEwhISFcbiIsIF9fZnVuY19fKTsKLQotCWlmICghKHN0YWluZm8tPnN0YXRlICYgX0ZXX0xJTktFRCkpIHsKLQkJREJHXzg3MjNBKCIlcywgcHN0YS0+c3RhdGUoMHgleCkgIT0gX0ZXX0xJTktFRFxuIiwgX19mdW5jX18sIHN0YWluZm8tPnN0YXRlKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5yYSkpCi0JCXByd3NrZXkgPSBwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwS2V5W3BzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlpZF0uc2tleTsKLQllbHNlCi0JCXByd3NrZXkgPSAmc3RhaW5mby0+ZG90MTE4MDIxeF9VbmNzdEtleS5za2V5WzBdOwotCi0JLyogNCBzdGFydCB0byBlbmNyeXB0IGVhY2ggZnJhZ21lbnQgKi8KLQlmb3IgKGN1cmZyYWdudW0gPSAwOyBjdXJmcmFnbnVtIDwgcGF0dHJpYi0+bnJfZnJhZ3M7IGN1cmZyYWdudW0rKykgewotCQlpdiA9IHBmcmFtZSArIHBhdHRyaWItPmhkcmxlbjsKLQkJcGF5bG9hZCA9IHBmcmFtZSArIHBhdHRyaWItPml2X2xlbiArIHBhdHRyaWItPmhkcmxlbjsKLQotCQlHRVRfVEtJUF9QTihpdiwgZG90MTF0eHBuKTsKLQotCQlwbmwgPSAodTE2KShkb3QxMXR4cG4udmFsKTsKLQkJcG5oID0gKHUzMikoZG90MTF0eHBuLnZhbD4+MTYpOwotCi0JCXBoYXNlMSgodTE2ICopJnR0a2V5WzBdLCBwcndza2V5LCAmcGF0dHJpYi0+dGFbMF0sIHBuaCk7Ci0KLQkJcGhhc2UyKCZyYzRrZXlbMF0sIHByd3NrZXksICh1MTYgKikmdHRrZXlbMF0sIHBubCk7Ci0KLQkJaWYgKChjdXJmcmFnbnVtICsgMSkgPT0gcGF0dHJpYi0+bnJfZnJhZ3MpIHsgLyogNCB0aGUgbGFzdCBmcmFnbWVudCAqLwotCQkJbGVuZ3RoID0gKHBhdHRyaWItPmxhc3RfdHhjbWRzeiAtCi0JCQkJICBwYXR0cmliLT5oZHJsZW4gLQotCQkJCSAgcGF0dHJpYi0+aXZfbGVuIC0KLQkJCQkgIHBhdHRyaWItPmljdl9sZW4pOwotCi0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfaW5mb18sCi0JCQkJICJwYXR0cmliLT5pdl9sZW4gPSV4LCBwYXR0cmliLT5pY3ZfbGVuID0leFxuIiwKLQkJCQkgcGF0dHJpYi0+aXZfbGVuLAotCQkJCSBwYXR0cmliLT5pY3ZfbGVuKTsKLQkJCWNyYyA9IGNwdV90b19sZTMyKGdldGNyYzMyKHBheWxvYWQsIGxlbmd0aCkpOwotCi0JCQlhcmNmb3VyX2luaXQoJm15Y29udGV4dCwgcmM0a2V5LCAxNik7Ci0JCQlhcmNmb3VyX2VuY3J5cHQoJm15Y29udGV4dCwgcGF5bG9hZCwgcGF5bG9hZCwgbGVuZ3RoKTsKLQkJCWFyY2ZvdXJfZW5jcnlwdCgmbXljb250ZXh0LCBwYXlsb2FkICsgbGVuZ3RoLAotCQkJCQkoY2hhciAqKSZjcmMsIDQpOwotCi0JCX0gZWxzZSB7Ci0JCQlsZW5ndGggPSAocHhtaXRwcml2LT5mcmFnX2xlbiAtCi0JCQkJICBwYXR0cmliLT5oZHJsZW4gLQotCQkJCSAgcGF0dHJpYi0+aXZfbGVuIC0KLQkJCQkgIHBhdHRyaWItPmljdl9sZW4pOwotCi0JCQljcmMgPSBjcHVfdG9fbGUzMihnZXRjcmMzMihwYXlsb2FkLCBsZW5ndGgpKTsKLQkJCWFyY2ZvdXJfaW5pdCgmbXljb250ZXh0LCByYzRrZXksIDE2KTsKLQkJCWFyY2ZvdXJfZW5jcnlwdCgmbXljb250ZXh0LCBwYXlsb2FkLCBwYXlsb2FkLCBsZW5ndGgpOwotCQkJYXJjZm91cl9lbmNyeXB0KCZteWNvbnRleHQsIHBheWxvYWQgKyBsZW5ndGgsCi0JCQkJCShjaGFyICopJmNyYywgNCk7Ci0KLQkJCXBmcmFtZSArPSBweG1pdHByaXYtPmZyYWdfbGVuOwotCQkJcGZyYW1lICA9IFBUUl9BTElHTihwZnJhbWUsIDQpOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJlczsKLX0KLQotLyogVGhlIGhsZW4gaXNuJ3QgaW5jbHVkZSB0aGUgSVYgKi8KLWludCBydHdfdGtpcF9kZWNyeXB0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSkKLXsKLQl1MTYgcG5sOwotCXUzMiBwbmg7Ci0JdTggcmM0a2V5WzE2XTsKLQl1OCB0dGtleVsxNl07Ci0JdTMyIGFjdHVhbF9jcmMsIGV4cGVjdGVkX2NyYzsKLQlzdHJ1Y3QgYXJjNGNvbnRleHQgbXljb250ZXh0OwotCWludCBsZW5ndGg7Ci0JdTggKnBmcmFtZSwgKnBheWxvYWQsICppdiwgKnByd3NrZXk7Ci0JdW5pb24gcG40OCBkb3QxMXR4cG47Ci0Jc3RydWN0IHN0YV9pbmZvICpzdGFpbmZvOwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwcnhhdHRyaWIgPSAmcHJlY3ZmcmFtZS0+YXR0cmliOwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByZWN2ZnJhbWUtPnBrdDsKLQlpbnQgcmVzID0gX1NVQ0NFU1M7Ci0KLQlpZiAocHJ4YXR0cmliLT5lbmNyeXB0ICE9IFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVApCi0JCXJldHVybiBfRkFJTDsKLQotCXBmcmFtZSA9IHNrYi0+ZGF0YTsKLQotCXN0YWluZm8gPSBydHdfZ2V0X3N0YWluZm8yM2EoJnBhZGFwdGVyLT5zdGFwcml2LAotCQkJCSAgICAgJnByeGF0dHJpYi0+dGFbMF0pOwotCWlmICghc3RhaW5mbykgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywKLQkJCSAiJXM6IHN0YWluZm8gPT0gTlVMTCEhIVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gX0ZBSUw7Ci0JfQotCi0JLyogNCBzdGFydCB0byBkZWNyeXB0IHJlY3ZmcmFtZSAqLwotCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwcnhhdHRyaWItPnJhKSkgewotCQlpZiAocHNlY3VyaXR5cHJpdi0+Ymluc3RhbGxHcnBrZXkgPT0gMCkgewotCQkJcmVzID0gX0ZBSUw7Ci0JCQlEQkdfODcyM0EoIiVzOnJ4IGJjL21jIHBhY2tldHMsIGJ1dCBkaWRuJ3QgaW5zdGFsbCBncm91cCBrZXkhISEhISEhISEhXG4iLCBfX2Z1bmNfXyk7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQkJcHJ3c2tleSA9IHBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlbcHJ4YXR0cmliLT5rZXlfaW5kZXhdLnNrZXk7Ci0JfSBlbHNlIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2Vycl8sCi0JCQkgIiVzOiBzdGFpbmZvIT0gTlVMTCEhIVxuIiwgX19mdW5jX18pOwotCQlwcndza2V5ID0gJnN0YWluZm8tPmRvdDExODAyMXhfVW5jc3RLZXkuc2tleVswXTsKLQl9Ci0KLQlpdiA9IHBmcmFtZSArIHByeGF0dHJpYi0+aGRybGVuOwotCXBheWxvYWQgPSBwZnJhbWUgKyBwcnhhdHRyaWItPml2X2xlbiArIHByeGF0dHJpYi0+aGRybGVuOwotCWxlbmd0aCA9IHNrYi0+bGVuIC0gcHJ4YXR0cmliLT5oZHJsZW4gLSBwcnhhdHRyaWItPml2X2xlbjsKLQotCUdFVF9US0lQX1BOKGl2LCBkb3QxMXR4cG4pOwotCi0JcG5sID0gKHUxNikoZG90MTF0eHBuLnZhbCk7Ci0JcG5oID0gKHUzMikoZG90MTF0eHBuLnZhbD4+MTYpOwotCi0JcGhhc2UxKCh1MTYgKikmdHRrZXlbMF0sIHByd3NrZXksICZwcnhhdHRyaWItPnRhWzBdLCBwbmgpOwotCXBoYXNlMigmcmM0a2V5WzBdLCBwcndza2V5LCAodW5zaWduZWQgc2hvcnQgKikmdHRrZXlbMF0sIHBubCk7Ci0KLQkvKiA0IGRlY3J5cHQgcGF5bG9hZCBpbmNsdWRlIGljdiAqLwotCWFyY2ZvdXJfaW5pdCgmbXljb250ZXh0LCByYzRrZXksIDE2KTsKLQlhcmNmb3VyX2VuY3J5cHQoJm15Y29udGV4dCwgcGF5bG9hZCwgcGF5bG9hZCwgbGVuZ3RoKTsKLQotCWFjdHVhbF9jcmMgPSBnZXRjcmMzMihwYXlsb2FkLCBsZW5ndGggLSA0KTsKLQlleHBlY3RlZF9jcmMgPSBnZXRfdW5hbGlnbmVkX2xlMzIoJnBheWxvYWRbbGVuZ3RoIC0gNF0pOwotCi0JaWYgKGFjdHVhbF9jcmMgIT0gZXhwZWN0ZWRfY3JjKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLAotCQkJICIlczppY3YgQ1JDIG1pc21hdGNoOiAiCi0JCQkgImFjdHVhbDogJTA4eCwgZXhwZWN0ZWQ6ICUwOHhcbiIsCi0JCQkgX19mdW5jX18sIGFjdHVhbF9jcmMsIGV4cGVjdGVkX2NyYyk7Ci0JCXJlcyA9IF9GQUlMOwotCX0KLQotZXhpdDoKLQlyZXR1cm4gcmVzOwotfQotCi0vKiAzCQkJPT09PT0gQUVTIHJlbGF0ZWQgPT09PT0gKi8KLQotI2RlZmluZSBNQVhfTVNHX1NJWkUJMjA0OAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqIFNCT1ggVGFibGUgKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgIHU4IHNib3hfdGFibGVbMjU2XSA9IHsKLQkweDYzLCAweDdjLCAweDc3LCAweDdiLCAweGYyLCAweDZiLCAweDZmLCAweGM1LAotCTB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYsCi0JMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCwKLQkweGFkLCAweGQ0LCAweGEyLCAweGFmLCAweDljLCAweGE0LCAweDcyLCAweGMwLAotCTB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MsCi0JMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNSwKLQkweDA0LCAweGM3LCAweDIzLCAweGMzLCAweDE4LCAweDk2LCAweDA1LCAweDlhLAotCTB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcsIDB4YjIsIDB4NzUsCi0JMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMCwKLQkweDUyLCAweDNiLCAweGQ2LCAweGIzLCAweDI5LCAweGUzLCAweDJmLCAweDg0LAotCTB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIsCi0JMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZiwKLQkweGQwLCAweGVmLCAweGFhLCAweGZiLCAweDQzLCAweDRkLCAweDMzLCAweDg1LAotCTB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgsCi0JMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNSwKLQkweGJjLCAweGI2LCAweGRhLCAweDIxLCAweDEwLCAweGZmLCAweGYzLCAweGQyLAotCTB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsIDB4NWYsIDB4OTcsIDB4NDQsIDB4MTcsCi0JMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3MywKLQkweDYwLCAweDgxLCAweDRmLCAweGRjLCAweDIyLCAweDJhLCAweDkwLCAweDg4LAotCTB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIsCi0JMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1YywKLQkweGMyLCAweGQzLCAweGFjLCAweDYyLCAweDkxLCAweDk1LCAweGU0LCAweDc5LAotCTB4ZTcsIDB4YzgsIDB4MzcsIDB4NmQsIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTksCi0JMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOCwKLQkweGJhLCAweDc4LCAweDI1LCAweDJlLCAweDFjLCAweGE2LCAweGI0LCAweGM2LAotCTB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQsIDB4OGIsIDB4OGEsCi0JMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZSwKLQkweDYxLCAweDM1LCAweDU3LCAweGI5LCAweDg2LCAweGMxLCAweDFkLCAweDllLAotCTB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQsCi0JMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZiwKLQkweDhjLCAweGExLCAweDg5LCAweDBkLCAweGJmLCAweGU2LCAweDQyLCAweDY4LAotCTB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTYKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqIEZ1bmN0aW9uIFByb3RvdHlwZXMgKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgY29uc3RydWN0X21pY19oZWFkZXIyKHU4ICptaWNfaGVhZGVyMiwgdTggKm1wZHUsIGludCBhNF9leGlzdHMsCi0JCQkJICBpbnQgcWNfZXhpc3RzKTsKLQotc3RhdGljIHZvaWQgeG9yXzEyOCh1OCAqYSwgdTggKmIsIHU4ICpvdXQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJb3V0W2ldID0gYVtpXSBeIGJbaV07Ci19Ci0KLXN0YXRpYyB2b2lkIHhvcl8zMih1OCAqYSwgdTggKmIsIHU4ICpvdXQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCQlvdXRbaV0gPSBhW2ldIF4gYltpXTsKLX0KLQotc3RhdGljIHU4IHNib3godTggYSkKLXsKLQlyZXR1cm4gc2JveF90YWJsZVsoaW50KWFdOwotfQotCi1zdGF0aWMgdm9pZCBuZXh0X2tleSh1OCAqa2V5LCBpbnQgcm91bmQpCi17Ci0JdTggcmNvbjsKLQl1OCBzYm94X2tleVs0XTsKLQl1OCByY29uX3RhYmxlWzEyXSA9IHsKLQkJMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwKLQkJMHgxYiwgMHgzNiwgMHgzNiwgMHgzNgotCX07Ci0KLQlzYm94X2tleVswXSA9IHNib3goa2V5WzEzXSk7Ci0Jc2JveF9rZXlbMV0gPSBzYm94KGtleVsxNF0pOwotCXNib3hfa2V5WzJdID0gc2JveChrZXlbMTVdKTsKLQlzYm94X2tleVszXSA9IHNib3goa2V5WzEyXSk7Ci0KLQlyY29uID0gcmNvbl90YWJsZVtyb3VuZF07Ci0KLQl4b3JfMzIoJmtleVswXSwgc2JveF9rZXksICZrZXlbMF0pOwotCWtleVswXSA9IGtleVswXSBeIHJjb247Ci0KLQl4b3JfMzIoJmtleVs0XSwgJmtleVswXSwgJmtleVs0XSk7Ci0JeG9yXzMyKCZrZXlbOF0sICZrZXlbNF0sICZrZXlbOF0pOwotCXhvcl8zMigma2V5WzEyXSwgJmtleVs4XSwgJmtleVsxMl0pOwotCi19Ci0KLXN0YXRpYyB2b2lkIGJ5dGVfc3ViKHU4ICppbiwgdTggKm91dCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotCQlvdXRbaV0gPSBzYm94KGluW2ldKTsKLX0KLQotc3RhdGljIHZvaWQgc2hpZnRfcm93KHU4ICppbiwgdTggKm91dCkKLXsKLQotCW91dFswXSA9ICBpblswXTsKLQlvdXRbMV0gPSAgaW5bNV07Ci0Jb3V0WzJdID0gIGluWzEwXTsKLQlvdXRbM10gPSAgaW5bMTVdOwotCW91dFs0XSA9ICBpbls0XTsKLQlvdXRbNV0gPSAgaW5bOV07Ci0Jb3V0WzZdID0gIGluWzE0XTsKLQlvdXRbN10gPSAgaW5bM107Ci0Jb3V0WzhdID0gIGluWzhdOwotCW91dFs5XSA9ICBpblsxM107Ci0Jb3V0WzEwXSA9IGluWzJdOwotCW91dFsxMV0gPSBpbls3XTsKLQlvdXRbMTJdID0gaW5bMTJdOwotCW91dFsxM10gPSBpblsxXTsKLQlvdXRbMTRdID0gaW5bNl07Ci0Jb3V0WzE1XSA9IGluWzExXTsKLQotfQotCi1zdGF0aWMgdm9pZCBtaXhfY29sdW1uKHU4ICppbiwgdTggKm91dCkKLXsKLQlpbnQgaTsKLQl1OCBhZGQxYls0XTsKLQl1OCBhZGQxYmY3WzRdOwotCXU4IHJvdGxbNF07Ci0JdTggc3dhcF9oYWxmc1s0XTsKLQl1OCBhbmRmN1s0XTsKLQl1OCByb3RyWzRdOwotCXU4IHRlbXBbNF07Ci0JdTggdGVtcGJbNF07Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCWlmICgoaW5baV0gJiAweDgwKSA9PSAweDgwKQotCQkJYWRkMWJbaV0gPSAweDFiOwotCQllbHNlCi0JCQlhZGQxYltpXSA9IDB4MDA7Ci0JfQotCi0Jc3dhcF9oYWxmc1swXSA9IGluWzJdOyAvKiBTd2FwIGhhbGZzICovCi0Jc3dhcF9oYWxmc1sxXSA9IGluWzNdOwotCXN3YXBfaGFsZnNbMl0gPSBpblswXTsKLQlzd2FwX2hhbGZzWzNdID0gaW5bMV07Ci0KLQlyb3RsWzBdID0gaW5bM107IC8qIFJvdGF0ZSBsZWZ0IDggYml0cyAqLwotCXJvdGxbMV0gPSBpblswXTsKLQlyb3RsWzJdID0gaW5bMV07Ci0Jcm90bFszXSA9IGluWzJdOwotCi0JYW5kZjdbMF0gPSBpblswXSAmIDB4N2Y7Ci0JYW5kZjdbMV0gPSBpblsxXSAmIDB4N2Y7Ci0JYW5kZjdbMl0gPSBpblsyXSAmIDB4N2Y7Ci0JYW5kZjdbM10gPSBpblszXSAmIDB4N2Y7Ci0KLQlmb3IgKGkgPSAzOyBpID4gMDsgaS0tKSB7IC8qIGxvZ2ljYWwgc2hpZnQgbGVmdCAxIGJpdCAqLwotCQlhbmRmN1tpXSA9IGFuZGY3W2ldIDw8IDE7Ci0JCWlmICgoYW5kZjdbaSAtIDFdICYgMHg4MCkgPT0gMHg4MCkKLQkJCWFuZGY3W2ldID0gKGFuZGY3W2ldIHwgMHgwMSk7Ci0JfQotCWFuZGY3WzBdID0gYW5kZjdbMF0gPDwgMTsKLQlhbmRmN1swXSA9IGFuZGY3WzBdICYgMHhmZTsKLQotCXhvcl8zMihhZGQxYiwgYW5kZjcsIGFkZDFiZjcpOwotCi0JeG9yXzMyKGluLCBhZGQxYmY3LCByb3RyKTsKLQotCXRlbXBbMF0gPSByb3RyWzBdOyAvKiBSb3RhdGUgcmlnaHQgOCBiaXRzICovCi0Jcm90clswXSA9IHJvdHJbMV07Ci0Jcm90clsxXSA9IHJvdHJbMl07Ci0Jcm90clsyXSA9IHJvdHJbM107Ci0Jcm90clszXSA9IHRlbXBbMF07Ci0KLQl4b3JfMzIoYWRkMWJmNywgcm90ciwgdGVtcCk7Ci0JeG9yXzMyKHN3YXBfaGFsZnMsIHJvdGwsIHRlbXBiKTsKLQl4b3JfMzIodGVtcCwgdGVtcGIsIG91dCk7Ci0KLX0KLQotc3RhdGljIHZvaWQgYWVzMTI4azEyOGQodTggKmtleSwgdTggKmRhdGEsIHU4ICpjaXBoZXJ0ZXh0KQotewotCWludCByb3VuZDsKLQlpbnQgaTsKLQl1OCBpbnRlcm1lZGlhdGVhWzE2XTsKLQl1OCBpbnRlcm1lZGlhdGViWzE2XTsKLQl1OCByb3VuZF9rZXlbMTZdOwotCi0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JCXJvdW5kX2tleVtpXSA9IGtleVtpXTsKLQotCWZvciAocm91bmQgPSAwOyByb3VuZCA8IDExOyByb3VuZCsrKSB7Ci0JCWlmIChyb3VuZCA9PSAwKSB7Ci0JCQl4b3JfMTI4KHJvdW5kX2tleSwgZGF0YSwgY2lwaGVydGV4dCk7Ci0JCQluZXh0X2tleShyb3VuZF9rZXksIHJvdW5kKTsKLQkJfSBlbHNlIGlmIChyb3VuZCA9PSAxMCkgewotCQkJYnl0ZV9zdWIoY2lwaGVydGV4dCwgaW50ZXJtZWRpYXRlYSk7Ci0JCQlzaGlmdF9yb3coaW50ZXJtZWRpYXRlYSwgaW50ZXJtZWRpYXRlYik7Ci0JCQl4b3JfMTI4KGludGVybWVkaWF0ZWIsIHJvdW5kX2tleSwgY2lwaGVydGV4dCk7Ci0JCX0gZWxzZSB7IC8qIDEgLSA5ICovCi0JCQlieXRlX3N1YihjaXBoZXJ0ZXh0LCBpbnRlcm1lZGlhdGVhKTsKLQkJCXNoaWZ0X3JvdyhpbnRlcm1lZGlhdGVhLCBpbnRlcm1lZGlhdGViKTsKLQkJCW1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbMF0sICZpbnRlcm1lZGlhdGVhWzBdKTsKLQkJCW1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbNF0sICZpbnRlcm1lZGlhdGVhWzRdKTsKLQkJCW1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbOF0sICZpbnRlcm1lZGlhdGVhWzhdKTsKLQkJCW1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbMTJdLCAmaW50ZXJtZWRpYXRlYVsxMl0pOwotCQkJeG9yXzEyOChpbnRlcm1lZGlhdGVhLCByb3VuZF9rZXksIGNpcGhlcnRleHQpOwotCQkJbmV4dF9rZXkocm91bmRfa2V5LCByb3VuZCk7Ci0JCX0KLQl9Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIGNvbnN0cnVjdF9taWNfaXYoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBCdWlsZHMgdGhlIE1JQyBJViBmcm9tIGhlYWRlciBmaWVsZHMgYW5kIFBOICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGNvbnN0cnVjdF9taWNfaXYodTggKm1pY19pdiwgaW50IHFjX2V4aXN0cywgaW50IGE0X2V4aXN0cywgdTggKm1wZHUsCi0JCQkgICAgIHVpbnQgcGF5bG9hZF9sZW5ndGgsIHU4ICpwbl92ZWN0b3IpCi17Ci0JaW50IGk7Ci0KLQltaWNfaXZbMF0gPSAweDU5OwotCWlmIChxY19leGlzdHMgJiYgYTRfZXhpc3RzKQotCQltaWNfaXZbMV0gPSBtcGR1WzMwXSAmIDB4MGY7IC8qIFFvU19UQyAgICAgICAgKi8KLQlpZiAocWNfZXhpc3RzICYmICFhNF9leGlzdHMpCi0JCW1pY19pdlsxXSA9IG1wZHVbMjRdICYgMHgwZjsgLyogbXV0ZSBiaXRzIDctNCAqLwotCWlmICghcWNfZXhpc3RzKQotCQltaWNfaXZbMV0gPSAweDAwOwotCWZvciAoaSA9IDI7IGkgPCA4OyBpKyspCi0JCW1pY19pdltpXSA9IG1wZHVbaSArIDhdOyAvKiBtaWNfaXZbMjo3XSA9IEEyWzA6NV0gPSBtcGR1WzEwOjE1XSAqLwotCWZvciAoaSA9IDg7IGkgPCAxNDsgaSsrKQotCQltaWNfaXZbaV0gPSBwbl92ZWN0b3JbMTMgLSBpXTsgLyogbWljX2l2Wzg6MTNdID0gUE5bNTowXSAqLwotCW1pY19pdlsxNF0gPSAodW5zaWduZWQgY2hhcikocGF5bG9hZF9sZW5ndGggLyAyNTYpOwotCW1pY19pdlsxNV0gPSAodW5zaWduZWQgY2hhcikocGF5bG9hZF9sZW5ndGggJSAyNTYpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogY29uc3RydWN0X21pY19oZWFkZXIxKCkgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEJ1aWxkcyB0aGUgZmlyc3QgTUlDIGhlYWRlciBibG9jayBmcm9tICAgICAgICovCi0vKiBoZWFkZXIgZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGNvbnN0cnVjdF9taWNfaGVhZGVyMSh1OCAqbWljX2hlYWRlcjEsIGludCBoZWFkZXJfbGVuZ3RoLCB1OCAqbXBkdSkKLXsKLQltaWNfaGVhZGVyMVswXSA9ICh1OCkoKGhlYWRlcl9sZW5ndGggLSAyKSAvIDI1Nik7Ci0JbWljX2hlYWRlcjFbMV0gPSAodTgpKChoZWFkZXJfbGVuZ3RoIC0gMikgJSAyNTYpOwotCW1pY19oZWFkZXIxWzJdID0gbXBkdVswXSAmIDB4Y2Y7IC8qIE11dGUgQ0YgcG9sbCAmIENGIGFjayBiaXRzICovCi0JbWljX2hlYWRlcjFbM10gPSBtcGR1WzFdICYgMHhjNzsgLyogTXV0ZSByZXRyeSwgbW9yZSBkYXRhIGFuZCBwd3IgbWd0IGJpdHMgKi8KLQltaWNfaGVhZGVyMVs0XSA9IG1wZHVbNF07IC8qIEExICovCi0JbWljX2hlYWRlcjFbNV0gPSBtcGR1WzVdOwotCW1pY19oZWFkZXIxWzZdID0gbXBkdVs2XTsKLQltaWNfaGVhZGVyMVs3XSA9IG1wZHVbN107Ci0JbWljX2hlYWRlcjFbOF0gPSBtcGR1WzhdOwotCW1pY19oZWFkZXIxWzldID0gbXBkdVs5XTsKLQltaWNfaGVhZGVyMVsxMF0gPSBtcGR1WzEwXTsgLyogQTIgKi8KLQltaWNfaGVhZGVyMVsxMV0gPSBtcGR1WzExXTsKLQltaWNfaGVhZGVyMVsxMl0gPSBtcGR1WzEyXTsKLQltaWNfaGVhZGVyMVsxM10gPSBtcGR1WzEzXTsKLQltaWNfaGVhZGVyMVsxNF0gPSBtcGR1WzE0XTsKLQltaWNfaGVhZGVyMVsxNV0gPSBtcGR1WzE1XTsKLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogY29uc3RydWN0X21pY19oZWFkZXIyKCkgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEJ1aWxkcyB0aGUgbGFzdCBNSUMgaGVhZGVyIGJsb2NrIGZyb20gICAgICAgICovCi0vKiBoZWFkZXIgZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGNvbnN0cnVjdF9taWNfaGVhZGVyMih1OCAqbWljX2hlYWRlcjIsIHU4ICptcGR1LCBpbnQgYTRfZXhpc3RzLAotCQkJCSAgaW50IHFjX2V4aXN0cykKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotCQltaWNfaGVhZGVyMltpXSA9IDB4MDA7Ci0KLQltaWNfaGVhZGVyMlswXSA9IG1wZHVbMTZdOyAvKiBBMyAqLwotCW1pY19oZWFkZXIyWzFdID0gbXBkdVsxN107Ci0JbWljX2hlYWRlcjJbMl0gPSBtcGR1WzE4XTsKLQltaWNfaGVhZGVyMlszXSA9IG1wZHVbMTldOwotCW1pY19oZWFkZXIyWzRdID0gbXBkdVsyMF07Ci0JbWljX2hlYWRlcjJbNV0gPSBtcGR1WzIxXTsKLQotCW1pY19oZWFkZXIyWzZdID0gMHgwMDsKLQltaWNfaGVhZGVyMls3XSA9IDB4MDA7IC8qIG1wZHVbMjNdOyAqLwotCi0JaWYgKCFxY19leGlzdHMgJiYgYTRfZXhpc3RzKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JCQltaWNfaGVhZGVyMls4K2ldID0gbXBkdVsyNCtpXTsgLyogQTQgKi8KLQl9Ci0KLQlpZiAocWNfZXhpc3RzICYmICFhNF9leGlzdHMpIHsKLQkJbWljX2hlYWRlcjJbOF0gPSBtcGR1WzI0XSAmIDB4MGY7IC8qIG11dGUgYml0cyAxNSAtIDQgKi8KLQkJbWljX2hlYWRlcjJbOV0gPSBtcGR1WzI1XSAmIDB4MDA7Ci0JfQotCi0JaWYgKHFjX2V4aXN0cyAmJiBhNF9leGlzdHMpIHsKLQkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQkJCW1pY19oZWFkZXIyWzgraV0gPSBtcGR1WzI0K2ldOyAvKiBBNCAqLwotCi0JCW1pY19oZWFkZXIyWzE0XSA9IG1wZHVbMzBdICYgMHgwZjsKLQkJbWljX2hlYWRlcjJbMTVdID0gbXBkdVszMV0gJiAweDAwOwotCX0KLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogY29uc3RydWN0X21pY19oZWFkZXIyKCkgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEJ1aWxkcyB0aGUgbGFzdCBNSUMgaGVhZGVyIGJsb2NrIGZyb20gICAgICAgICovCi0vKiBoZWFkZXIgZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGNvbnN0cnVjdF9jdHJfcHJlbG9hZCh1OCAqY3RyX3ByZWxvYWQsIGludCBhNF9leGlzdHMsIGludCBxY19leGlzdHMsCi0JCQkJICB1OCAqbXBkdSwgdTggKnBuX3ZlY3RvciwgaW50IGMpCi17Ci0JaW50IGkgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JCWN0cl9wcmVsb2FkW2ldID0gMHgwMDsKLQotCWkgPSAwOwotCi0JY3RyX3ByZWxvYWRbMF0gPSAweDAxOyAvKiBmbGFnICovCi0JaWYgKHFjX2V4aXN0cyAmJiBhNF9leGlzdHMpCi0JCWN0cl9wcmVsb2FkWzFdID0gbXBkdVszMF0gJiAweDBmOyAvKiBRb0NfQ29udHJvbCAqLwotCWlmIChxY19leGlzdHMgJiYgIWE0X2V4aXN0cykKLQkJY3RyX3ByZWxvYWRbMV0gPSBtcGR1WzI0XSAmIDB4MGY7Ci0KLQlmb3IgKGkgPSAyOyBpIDwgODsgaSsrKQotCQljdHJfcHJlbG9hZFtpXSA9IG1wZHVbaSArIDhdOyAvKiBjdHJfcHJlbG9hZFsyOjddID0gQTJbMDo1XSA9IG1wZHVbMTA6MTVdICovCi0JZm9yIChpID0gODsgaSA8IDE0OyBpKyspCi0JCWN0cl9wcmVsb2FkW2ldID0gcG5fdmVjdG9yWzEzIC0gaV07IC8qIGN0cl9wcmVsb2FkWzg6MTNdID0gUE5bNTowXSAqLwotCWN0cl9wcmVsb2FkWzE0XSA9ICAodW5zaWduZWQgY2hhcikgKGMgLyAyNTYpOyAvKiBDdHIgKi8KLQljdHJfcHJlbG9hZFsxNV0gPSAgKHVuc2lnbmVkIGNoYXIpIChjICUgMjU2KTsKLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogYml0d2lzZV94b3IoKSAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEEgMTI4IGJpdCwgYml0d2lzZSBleGNsdXNpdmUgb3IgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgYml0d2lzZV94b3IodTggKmluYSwgdTggKmluYiwgdTggKm91dCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotCQlvdXRbaV0gPSBpbmFbaV0gXiBpbmJbaV07Ci19Ci0KLXN0YXRpYyBpbnQgYWVzX2NpcGhlcih1OCAqa2V5LCB1aW50IGhkcmxlbiwgdTggKnBmcmFtZSwgdWludCBwbGVuKQotewotCXVpbnQgcWNfZXhpc3RzLCBhNF9leGlzdHMsIGksIGosIHBheWxvYWRfcmVtYWluZGVyLAotCSAgICAgbnVtX2Jsb2NrcywgcGF5bG9hZF9pbmRleDsKLQl1OCBwbl92ZWN0b3JbNl07Ci0JdTggbWljX2l2WzE2XTsKLQl1OCBtaWNfaGVhZGVyMVsxNl07Ci0JdTggbWljX2hlYWRlcjJbMTZdOwotCXU4IGN0cl9wcmVsb2FkWzE2XTsKLQkvKiBJbnRlcm1lZGlhdGUgQnVmZmVycyAqLwotCXU4IGNoYWluX2J1ZmZlclsxNl07Ci0JdTggYWVzX291dFsxNl07Ci0JdTggcGFkZGVkX2J1ZmZlclsxNl07Ci0JdTggbWljWzhdOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilwZnJhbWU7Ci0JdTE2IGZyc3VidHlwZSA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY29udHJvbCkgJiBJRUVFODAyMTFfRkNUTF9TVFlQRTsKLQotCW1lbXNldCgodm9pZCAqKW1pY19pdiwgMCwgMTYpOwotCW1lbXNldCgodm9pZCAqKW1pY19oZWFkZXIxLCAwLCAxNik7Ci0JbWVtc2V0KCh2b2lkICopbWljX2hlYWRlcjIsIDAsIDE2KTsKLQltZW1zZXQoKHZvaWQgKiljdHJfcHJlbG9hZCwgMCwgMTYpOwotCW1lbXNldCgodm9pZCAqKWNoYWluX2J1ZmZlciwgMCwgMTYpOwotCW1lbXNldCgodm9pZCAqKWFlc19vdXQsIDAsIDE2KTsKLQltZW1zZXQoKHZvaWQgKilwYWRkZWRfYnVmZmVyLCAwLCAxNik7Ci0KLQlpZiAoKGhkcmxlbiA9PSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpIHx8Ci0JICAgIChoZHJsZW4gPT0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcW9zX2hkcikpKSkKLQkJYTRfZXhpc3RzID0gMDsKLQllbHNlCi0JCWE0X2V4aXN0cyA9IDE7Ci0KLQlpZiAoaWVlZTgwMjExX2lzX2RhdGEoaGRyLT5mcmFtZV9jb250cm9sKSkgewotCQlpZiAoKGZyc3VidHlwZSA9PSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRkFDSykgfHwKLQkJICAgIChmcnN1YnR5cGUgPT0gSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZQT0xMKSB8fAotCQkgICAgKGZyc3VidHlwZSA9PSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRkFDS1BPTEwpKSB7Ci0JCQlxY19leGlzdHMgPSAxOwotCQkJaWYgKGhkcmxlbiAhPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyKSkKLQkJCQloZHJsZW4gKz0gMjsKLQkJfSBlbHNlIGlmICgoZnJzdWJ0eXBlID09IElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQSkgfHwKLQkJCSAgIChmcnN1YnR5cGUgPT0gSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBX0NGQUNLKSB8fAotCQkJICAgKGZyc3VidHlwZSA9PSBJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEFfQ0ZQT0xMKSB8fAotCQkJICAgKGZyc3VidHlwZSA9PSBJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEFfQ0ZBQ0tQT0xMKSkgewotCQkJaWYgKGhkcmxlbiAhPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyKSkKLQkJCQloZHJsZW4gKz0gMjsKLQkJCXFjX2V4aXN0cyA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlxY19leGlzdHMgPSAwOwotCQl9Ci0JfSBlbHNlIHsKLQkJcWNfZXhpc3RzID0gMDsKLQl9Ci0JcG5fdmVjdG9yWzBdID0gcGZyYW1lW2hkcmxlbl07Ci0JcG5fdmVjdG9yWzFdID0gcGZyYW1lW2hkcmxlbiArIDFdOwotCXBuX3ZlY3RvclsyXSA9IHBmcmFtZVtoZHJsZW4gKyA0XTsKLQlwbl92ZWN0b3JbM10gPSBwZnJhbWVbaGRybGVuICsgNV07Ci0JcG5fdmVjdG9yWzRdID0gcGZyYW1lW2hkcmxlbiArIDZdOwotCXBuX3ZlY3Rvcls1XSA9IHBmcmFtZVtoZHJsZW4gKyA3XTsKLQotCWNvbnN0cnVjdF9taWNfaXYobWljX2l2LCBxY19leGlzdHMsIGE0X2V4aXN0cywgcGZyYW1lLCBwbGVuLCBwbl92ZWN0b3IpOwotCi0JY29uc3RydWN0X21pY19oZWFkZXIxKG1pY19oZWFkZXIxLCBoZHJsZW4sIHBmcmFtZSk7Ci0JY29uc3RydWN0X21pY19oZWFkZXIyKG1pY19oZWFkZXIyLCBwZnJhbWUsIGE0X2V4aXN0cywgcWNfZXhpc3RzKTsKLQotCXBheWxvYWRfcmVtYWluZGVyID0gcGxlbiAlIDE2OwotCW51bV9ibG9ja3MgPSBwbGVuIC8gMTY7Ci0KLQkvKiBGaW5kIHN0YXJ0IG9mIHBheWxvYWQgKi8KLQlwYXlsb2FkX2luZGV4ID0gaGRybGVuICsgODsKLQotCS8qIENhbGN1bGF0ZSBNSUMgKi8KLQlhZXMxMjhrMTI4ZChrZXksIG1pY19pdiwgYWVzX291dCk7Ci0JYml0d2lzZV94b3IoYWVzX291dCwgbWljX2hlYWRlcjEsIGNoYWluX2J1ZmZlcik7Ci0JYWVzMTI4azEyOGQoa2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOwotCWJpdHdpc2VfeG9yKGFlc19vdXQsIG1pY19oZWFkZXIyLCBjaGFpbl9idWZmZXIpOwotCWFlczEyOGsxMjhkKGtleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKLQkJYml0d2lzZV94b3IoYWVzX291dCwgJnBmcmFtZVtwYXlsb2FkX2luZGV4XSwgY2hhaW5fYnVmZmVyKTsKLQotCQlwYXlsb2FkX2luZGV4ICs9IDE2OwotCQlhZXMxMjhrMTI4ZChrZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7Ci0JfQotCi0JLyogQWRkIG9uIHRoZSBmaW5hbCBwYXlsb2FkIGJsb2NrIGlmIGl0IG5lZWRzIHBhZGRpbmcgKi8KLQlpZiAocGF5bG9hZF9yZW1haW5kZXIgPiAwKSB7Ci0JCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKQotCQkJcGFkZGVkX2J1ZmZlcltqXSA9IDB4MDA7Ci0JCWZvciAoaiA9IDA7IGogPCBwYXlsb2FkX3JlbWFpbmRlcjsgaisrKQotCQkJcGFkZGVkX2J1ZmZlcltqXSA9IHBmcmFtZVtwYXlsb2FkX2luZGV4KytdOwotCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwYWRkZWRfYnVmZmVyLCBjaGFpbl9idWZmZXIpOwotCQlhZXMxMjhrMTI4ZChrZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7Ci0JfQotCi0JZm9yIChqID0gMDsgaiA8IDg7IGorKykKLQkJbWljW2pdID0gYWVzX291dFtqXTsKLQotCS8qIEluc2VydCBNSUMgaW50byBwYXlsb2FkICovCi0JZm9yIChqID0gMDsgaiA8IDg7IGorKykKLQkJcGZyYW1lW3BheWxvYWRfaW5kZXggKyBqXSA9IG1pY1tqXTsKLQotCXBheWxvYWRfaW5kZXggPSBoZHJsZW4gKyA4OwotCWZvciAoaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKLQkJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLCBhNF9leGlzdHMsIHFjX2V4aXN0cywKLQkJCQkgICAgICBwZnJhbWUsIHBuX3ZlY3RvciwgaSArIDEpOwotCQlhZXMxMjhrMTI4ZChrZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKLQkJYml0d2lzZV94b3IoYWVzX291dCwgJnBmcmFtZVtwYXlsb2FkX2luZGV4XSwgY2hhaW5fYnVmZmVyKTsKLQkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCi0JCQlwZnJhbWVbcGF5bG9hZF9pbmRleCsrXSA9IGNoYWluX2J1ZmZlcltqXTsKLQl9Ci0KLQlpZiAocGF5bG9hZF9yZW1haW5kZXIgPiAwKSB7Ci0JCS8qIElmIHRoZXJlIGlzIGEgc2hvcnQgZmluYWwgYmxvY2ssIHRoZW4gcGFkIGl0LAotCQkgKiBlbmNyeXB0IGl0IGFuZCBjb3B5IHRoZSB1bnBhZGRlZCBwYXJ0IGJhY2sKLQkJICovCi0JCWNvbnN0cnVjdF9jdHJfcHJlbG9hZChjdHJfcHJlbG9hZCwgYTRfZXhpc3RzLCBxY19leGlzdHMsIHBmcmFtZSwKLQkJCQkgICAgICBwbl92ZWN0b3IsIG51bV9ibG9ja3MgKyAxKTsKLQotCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKLQkJCXBhZGRlZF9idWZmZXJbal0gPSAweDAwOwotCQlmb3IgKGogPSAwOyBqIDwgcGF5bG9hZF9yZW1haW5kZXI7IGorKykKLQkJCXBhZGRlZF9idWZmZXJbal0gPSBwZnJhbWVbcGF5bG9hZF9pbmRleCArIGpdOwotCQlhZXMxMjhrMTI4ZChrZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKLQkJYml0d2lzZV94b3IoYWVzX291dCwgcGFkZGVkX2J1ZmZlciwgY2hhaW5fYnVmZmVyKTsKLQkJZm9yIChqID0gMDsgaiA8IHBheWxvYWRfcmVtYWluZGVyOyBqKyspCi0JCQlwZnJhbWVbcGF5bG9hZF9pbmRleCsrXSA9IGNoYWluX2J1ZmZlcltqXTsKLQl9Ci0KLQkvKiBFbmNyeXB0IHRoZSBNSUMgKi8KLQljb25zdHJ1Y3RfY3RyX3ByZWxvYWQoY3RyX3ByZWxvYWQsIGE0X2V4aXN0cywgcWNfZXhpc3RzLCBwZnJhbWUsCi0JCQkgICAgICBwbl92ZWN0b3IsIDApOwotCi0JZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCi0JCXBhZGRlZF9idWZmZXJbal0gPSAweDAwOwotCWZvciAoaiA9IDA7IGogPCA4OyBqKyspCi0JCXBhZGRlZF9idWZmZXJbal0gPSBwZnJhbWVbaiArIGhkcmxlbiArIDggKyBwbGVuXTsKLQotCWFlczEyOGsxMjhkKGtleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOwotCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7Ci0JZm9yIChqID0gMDsgaiA8IDg7IGorKykKLQkJcGZyYW1lW3BheWxvYWRfaW5kZXgrK10gPSBjaGFpbl9idWZmZXJbal07Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLWludCBydHdfYWVzX2VuY3J5cHQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICAgICAgIHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKQotewkvKiBleGNsdWRlIElDViAqLwotCS8qIEludGVybWVkaWF0ZSBCdWZmZXJzICovCi0JaW50IGN1cmZyYWdudW0sIGxlbmd0aDsKLQl1OCAqcGZyYW1lLCAqcHJ3c2tleTsKLQl1OCBod19oZHJfb2Zmc2V0ID0gMDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YWluZm87Ci0Jc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHhtaXRmcmFtZS0+YXR0cmliOwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlpbnQgcmVzID0gX1NVQ0NFU1M7Ci0KLQlpZiAoIXB4bWl0ZnJhbWUtPmJ1Zl9hZGRyKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQlod19oZHJfb2Zmc2V0ID0gVFhERVNDX09GRlNFVDsKLQotCXBmcmFtZSA9IHB4bWl0ZnJhbWUtPmJ1Zl9hZGRyICsgaHdfaGRyX29mZnNldDsKLQotCS8qIDQgc3RhcnQgdG8gZW5jcnlwdCBlYWNoIGZyYWdtZW50ICovCi0JaWYgKHBhdHRyaWItPmVuY3J5cHQgIT0gV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUCkKLQkJcmV0dXJuIF9GQUlMOwotCi0JaWYgKHBhdHRyaWItPnBzdGEpIHsKLQkJc3RhaW5mbyA9IHBhdHRyaWItPnBzdGE7Ci0JfSBlbHNlIHsKLQkJREJHXzg3MjNBKCIlcywgY2FsbCBydHdfZ2V0X3N0YWluZm8yM2EoKVxuIiwgX19mdW5jX18pOwotCQlzdGFpbmZvID0gcnR3X2dldF9zdGFpbmZvMjNhKCZwYWRhcHRlci0+c3RhcHJpdiwgJnBhdHRyaWItPnJhWzBdKTsKLQl9Ci0KLQlpZiAoIXN0YWluZm8pIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2Vycl8sCi0JCQkgIiVzOiBzdGFpbmZvID09IE5VTEwhISFcbiIsIF9fZnVuY19fKTsKLQkJREJHXzg3MjNBKCIlcywgcHN0YSA9PSBOVUxcbiIsIF9fZnVuY19fKTsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gb3V0OwotCX0KLQlpZiAoIShzdGFpbmZvLT5zdGF0ZSAmIF9GV19MSU5LRUQpKSB7Ci0JCURCR184NzIzQSgiJXMsIHBzdGEtPnN0YXRlKDB4JXgpICE9IF9GV19MSU5LRURcbiIsCi0JCQkgIF9fZnVuY19fLCBzdGFpbmZvLT5zdGF0ZSk7Ci0JCXJldHVybiBfRkFJTDsKLQl9Ci0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2Vycl8sCi0JCSAiJXM6IHN0YWluZm8hPSBOVUxMISEhXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocGF0dHJpYi0+cmEpKQotCQlwcndza2V5ID0gcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycEtleVtwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwS2V5aWRdLnNrZXk7Ci0JZWxzZQotCQlwcndza2V5ID0gJnN0YWluZm8tPmRvdDExODAyMXhfVW5jc3RLZXkuc2tleVswXTsKLQotCWZvciAoY3VyZnJhZ251bSA9IDA7IGN1cmZyYWdudW0gPCBwYXR0cmliLT5ucl9mcmFnczsgY3VyZnJhZ251bSsrKSB7Ci0JCS8qIDQgdGhlIGxhc3QgZnJhZ21lbnQgKi8KLQkJaWYgKChjdXJmcmFnbnVtICsgMSkgPT0gcGF0dHJpYi0+bnJfZnJhZ3MpIHsKLQkJCWxlbmd0aCA9IHBhdHRyaWItPmxhc3RfdHhjbWRzeiAtCi0JCQkJcGF0dHJpYi0+aGRybGVuLXBhdHRyaWItPml2X2xlbiAtCi0JCQkJcGF0dHJpYi0+aWN2X2xlbjsKLQotCQkJYWVzX2NpcGhlcihwcndza2V5LCBwYXR0cmliLT5oZHJsZW4sIHBmcmFtZSwgbGVuZ3RoKTsKLQkJfSBlbHNlIHsKLQkJCWxlbmd0aCA9IHB4bWl0cHJpdi0+ZnJhZ19sZW4tcGF0dHJpYi0+aGRybGVuIC0KLQkJCQlwYXR0cmliLT5pdl9sZW4gLSBwYXR0cmliLT5pY3ZfbGVuOwotCi0JCQlhZXNfY2lwaGVyKHByd3NrZXksIHBhdHRyaWItPmhkcmxlbiwgcGZyYW1lLCBsZW5ndGgpOwotCQkJcGZyYW1lICs9IHB4bWl0cHJpdi0+ZnJhZ19sZW47Ci0JCQlwZnJhbWUgPSBQVFJfQUxJR04ocGZyYW1lLCA0KTsKLQkJfQotCX0KLW91dDoKLQlyZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgaW50IGFlc19kZWNpcGhlcih1OCAqa2V5LCB1aW50IGhkcmxlbiwgdTggKnBmcmFtZSwgdWludCBwbGVuKQotewotCXN0YXRpYyB1OCBtZXNzYWdlW01BWF9NU0dfU0laRV07Ci0JdWludCBxY19leGlzdHMsIGE0X2V4aXN0cywgaSwgaiwgcGF5bG9hZF9yZW1haW5kZXIsCi0JICAgICBudW1fYmxvY2tzLCBwYXlsb2FkX2luZGV4OwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQl1OCBwbl92ZWN0b3JbNl07Ci0JdTggbWljX2l2WzE2XTsKLQl1OCBtaWNfaGVhZGVyMVsxNl07Ci0JdTggbWljX2hlYWRlcjJbMTZdOwotCXU4IGN0cl9wcmVsb2FkWzE2XTsKLQkvKiBJbnRlcm1lZGlhdGUgQnVmZmVycyAqLwotCXU4IGNoYWluX2J1ZmZlclsxNl07Ci0JdTggYWVzX291dFsxNl07Ci0JdTggcGFkZGVkX2J1ZmZlclsxNl07Ci0JdTggbWljWzhdOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilwZnJhbWU7Ci0JdTE2IGZyc3VidHlwZSA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY29udHJvbCkgJiBJRUVFODAyMTFfRkNUTF9TVFlQRTsKLQotCW1lbXNldCgodm9pZCAqKW1pY19pdiwgMCwgMTYpOwotCW1lbXNldCgodm9pZCAqKW1pY19oZWFkZXIxLCAwLCAxNik7Ci0JbWVtc2V0KCh2b2lkICopbWljX2hlYWRlcjIsIDAsIDE2KTsKLQltZW1zZXQoKHZvaWQgKiljdHJfcHJlbG9hZCwgMCwgMTYpOwotCW1lbXNldCgodm9pZCAqKWNoYWluX2J1ZmZlciwgMCwgMTYpOwotCW1lbXNldCgodm9pZCAqKWFlc19vdXQsIDAsIDE2KTsKLQltZW1zZXQoKHZvaWQgKilwYWRkZWRfYnVmZmVyLCAwLCAxNik7Ci0KLQkvKiBzdGFydCB0byBkZWNyeXB0IHRoZSBwYXlsb2FkICovCi0KLQludW1fYmxvY2tzID0gKHBsZW4gLSA4KSAvIDE2OyAvKiBwbGVuIGluY2x1ZGluZyBsbGMsIHBheWxvYWRfbGVuZ3RoIGFuZCBtaWMpICovCi0KLQlwYXlsb2FkX3JlbWFpbmRlciA9IChwbGVuIC0gOCkgJSAxNjsKLQotCXBuX3ZlY3RvclswXSAgPSBwZnJhbWVbaGRybGVuXTsKLQlwbl92ZWN0b3JbMV0gID0gcGZyYW1lW2hkcmxlbiArIDFdOwotCXBuX3ZlY3RvclsyXSAgPSBwZnJhbWVbaGRybGVuICsgNF07Ci0JcG5fdmVjdG9yWzNdICA9IHBmcmFtZVtoZHJsZW4gKyA1XTsKLQlwbl92ZWN0b3JbNF0gID0gcGZyYW1lW2hkcmxlbiArIDZdOwotCXBuX3ZlY3Rvcls1XSAgPSBwZnJhbWVbaGRybGVuICsgN107Ci0KLQlpZiAoKGhkcmxlbiA9PSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpIHx8Ci0JICAgIChoZHJsZW4gPT0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcW9zX2hkcikpKSkKLQkJYTRfZXhpc3RzID0gMDsKLQllbHNlCi0JCWE0X2V4aXN0cyA9IDE7Ci0KLQlpZiAoaWVlZTgwMjExX2lzX2RhdGEoaGRyLT5mcmFtZV9jb250cm9sKSkgewotCQlpZiAoKGZyc3VidHlwZSA9PSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRkFDSykgfHwKLQkJICAgIChmcnN1YnR5cGUgPT0gSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZQT0xMKSB8fAotCQkgICAgKGZyc3VidHlwZSA9PSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRkFDS1BPTEwpKSB7Ci0JCQlxY19leGlzdHMgPSAxOwotCQkJaWYgKGhkcmxlbiAhPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKQotCQkJCWhkcmxlbiArPSAyOwotCQl9IGVsc2UgaWYgKChmcnN1YnR5cGUgPT0gSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBKSB8fAotCQkJICAgKGZyc3VidHlwZSA9PSBJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEFfQ0ZBQ0spIHx8Ci0JCQkgICAoZnJzdWJ0eXBlID09IElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQV9DRlBPTEwpIHx8Ci0JCQkgICAoZnJzdWJ0eXBlID09IElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQV9DRkFDS1BPTEwpKSB7Ci0JCQlpZiAoaGRybGVuICE9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikpCi0JCQkJaGRybGVuICs9IDI7Ci0JCQlxY19leGlzdHMgPSAxOwotCQl9IGVsc2UgewotCQkJcWNfZXhpc3RzID0gMDsKLQkJfQotCX0gZWxzZSB7Ci0JCXFjX2V4aXN0cyA9IDA7Ci0JfQotCi0JLyogbm93LCBkZWNyeXB0IHBmcmFtZSB3aXRoIGhkcmxlbiBvZmZzZXQgYW5kIHBsZW4gbG9uZyAqLwotCi0JcGF5bG9hZF9pbmRleCA9IGhkcmxlbiArIDg7IC8qICA4IGlzIGZvciBleHRpdiAqLwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykgewotCQljb25zdHJ1Y3RfY3RyX3ByZWxvYWQoY3RyX3ByZWxvYWQsIGE0X2V4aXN0cywgcWNfZXhpc3RzLAotCQkJCSAgICAgIHBmcmFtZSwgcG5fdmVjdG9yLCBpICsgMSk7Ci0KLQkJYWVzMTI4azEyOGQoa2V5LCBjdHJfcHJlbG9hZCwgYWVzX291dCk7Ci0JCWJpdHdpc2VfeG9yKGFlc19vdXQsICZwZnJhbWVbcGF5bG9hZF9pbmRleF0sIGNoYWluX2J1ZmZlcik7Ci0KLQkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCi0JCQlwZnJhbWVbcGF5bG9hZF9pbmRleCsrXSA9IGNoYWluX2J1ZmZlcltqXTsKLQl9Ci0KLQlpZiAocGF5bG9hZF9yZW1haW5kZXIgPiAwKSB7Ci0JCS8qIElmIHRoZXJlIGlzIGEgc2hvcnQgZmluYWwgYmxvY2ssIHRoZW4gcGFkIGl0LAotCQkgKiBlbmNyeXB0IGl0IGFuZCBjb3B5IHRoZSB1bnBhZGRlZCBwYXJ0IGJhY2sKLQkJICovCi0JCWNvbnN0cnVjdF9jdHJfcHJlbG9hZChjdHJfcHJlbG9hZCwgYTRfZXhpc3RzLCBxY19leGlzdHMsIHBmcmFtZSwKLQkJCQkgICAgICBwbl92ZWN0b3IsIG51bV9ibG9ja3MgKyAxKTsKLQotCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKLQkJCXBhZGRlZF9idWZmZXJbal0gPSAweDAwOwotCQlmb3IgKGogPSAwOyBqIDwgcGF5bG9hZF9yZW1haW5kZXI7IGorKykKLQkJCXBhZGRlZF9idWZmZXJbal0gPSBwZnJhbWVbcGF5bG9hZF9pbmRleCArIGpdOwotCQlhZXMxMjhrMTI4ZChrZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKLQkJYml0d2lzZV94b3IoYWVzX291dCwgcGFkZGVkX2J1ZmZlciwgY2hhaW5fYnVmZmVyKTsKLQkJZm9yIChqID0gMDsgaiA8IHBheWxvYWRfcmVtYWluZGVyOyBqKyspCi0JCQlwZnJhbWVbcGF5bG9hZF9pbmRleCsrXSA9IGNoYWluX2J1ZmZlcltqXTsKLQl9Ci0KLQkvKiBzdGFydCB0byBjYWxjdWxhdGUgdGhlIG1pYyAqLwotCWlmICgoaGRybGVuICsgcGxlbiArIDgpIDw9IE1BWF9NU0dfU0laRSkKLQkJbWVtY3B5KG1lc3NhZ2UsIHBmcmFtZSwgKGhkcmxlbiArIHBsZW4gKyA4KSk7IC8qIDggaXMgZm9yIGV4dCBpdiBsZW4gKi8KLQotCXBuX3ZlY3RvclswXSA9IHBmcmFtZVtoZHJsZW5dOwotCXBuX3ZlY3RvclsxXSA9IHBmcmFtZVtoZHJsZW4gKyAxXTsKLQlwbl92ZWN0b3JbMl0gPSBwZnJhbWVbaGRybGVuICsgNF07Ci0JcG5fdmVjdG9yWzNdID0gcGZyYW1lW2hkcmxlbiArIDVdOwotCXBuX3ZlY3Rvcls0XSA9IHBmcmFtZVtoZHJsZW4gKyA2XTsKLQlwbl92ZWN0b3JbNV0gPSBwZnJhbWVbaGRybGVuICsgN107Ci0KLQljb25zdHJ1Y3RfbWljX2l2KG1pY19pdiwgcWNfZXhpc3RzLCBhNF9leGlzdHMsIG1lc3NhZ2UsCi0JCQkgcGxlbiAtIDgsIHBuX3ZlY3Rvcik7Ci0KLQljb25zdHJ1Y3RfbWljX2hlYWRlcjEobWljX2hlYWRlcjEsIGhkcmxlbiwgbWVzc2FnZSk7Ci0JY29uc3RydWN0X21pY19oZWFkZXIyKG1pY19oZWFkZXIyLCBtZXNzYWdlLCBhNF9leGlzdHMsIHFjX2V4aXN0cyk7Ci0KLQlwYXlsb2FkX3JlbWFpbmRlciA9IChwbGVuIC0gOCkgJSAxNjsKLQludW1fYmxvY2tzID0gKHBsZW4gLSA4KSAvIDE2OwotCi0JLyogRmluZCBzdGFydCBvZiBwYXlsb2FkICovCi0JcGF5bG9hZF9pbmRleCA9IGhkcmxlbiArIDg7Ci0KLQkvKiBDYWxjdWxhdGUgTUlDICovCi0JYWVzMTI4azEyOGQoa2V5LCBtaWNfaXYsIGFlc19vdXQpOwotCWJpdHdpc2VfeG9yKGFlc19vdXQsIG1pY19oZWFkZXIxLCBjaGFpbl9idWZmZXIpOwotCWFlczEyOGsxMjhkKGtleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKLQliaXR3aXNlX3hvcihhZXNfb3V0LCBtaWNfaGVhZGVyMiwgY2hhaW5fYnVmZmVyKTsKLQlhZXMxMjhrMTI4ZChrZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKSB7Ci0JCWJpdHdpc2VfeG9yKGFlc19vdXQsICZtZXNzYWdlW3BheWxvYWRfaW5kZXhdLCBjaGFpbl9idWZmZXIpOwotCi0JCXBheWxvYWRfaW5kZXggKz0gMTY7Ci0JCWFlczEyOGsxMjhkKGtleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKLQl9Ci0KLQkvKiBBZGQgb24gdGhlIGZpbmFsIHBheWxvYWQgYmxvY2sgaWYgaXQgbmVlZHMgcGFkZGluZyAqLwotCWlmIChwYXlsb2FkX3JlbWFpbmRlciA+IDApIHsKLQkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCi0JCQlwYWRkZWRfYnVmZmVyW2pdID0gMHgwMDsKLQkJZm9yIChqID0gMDsgaiA8IHBheWxvYWRfcmVtYWluZGVyOyBqKyspCi0JCQlwYWRkZWRfYnVmZmVyW2pdID0gbWVzc2FnZVtwYXlsb2FkX2luZGV4KytdOwotCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwYWRkZWRfYnVmZmVyLCBjaGFpbl9idWZmZXIpOwotCQlhZXMxMjhrMTI4ZChrZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7Ci0JfQotCi0JZm9yIChqID0gMCA7IGogPCA4OyBqKyspCi0JCW1pY1tqXSA9IGFlc19vdXRbal07Ci0KLQkvKiBJbnNlcnQgTUlDIGludG8gcGF5bG9hZCAqLwotCWZvciAoaiA9IDA7IGogPCA4OyBqKyspCi0JCW1lc3NhZ2VbcGF5bG9hZF9pbmRleCArIGpdID0gbWljW2pdOwotCi0JcGF5bG9hZF9pbmRleCA9IGhkcmxlbiArIDg7Ci0JZm9yIChpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykgewotCQljb25zdHJ1Y3RfY3RyX3ByZWxvYWQoY3RyX3ByZWxvYWQsIGE0X2V4aXN0cywgcWNfZXhpc3RzLAotCQkJCSAgICAgIG1lc3NhZ2UsIHBuX3ZlY3RvciwgaSArIDEpOwotCQlhZXMxMjhrMTI4ZChrZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKLQkJYml0d2lzZV94b3IoYWVzX291dCwgJm1lc3NhZ2VbcGF5bG9hZF9pbmRleF0sIGNoYWluX2J1ZmZlcik7Ci0JCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKQotCQkJbWVzc2FnZVtwYXlsb2FkX2luZGV4KytdID0gY2hhaW5fYnVmZmVyW2pdOwotCX0KLQotCWlmIChwYXlsb2FkX3JlbWFpbmRlciA+IDApIHsKLQkJLyogSWYgdGhlcmUgaXMgYSBzaG9ydCBmaW5hbCBibG9jaywgdGhlbiBwYWQgaXQsCi0JCSAqIGVuY3J5cHQgaXQgYW5kIGNvcHkgdGhlIHVucGFkZGVkIHBhcnQgYmFjawotCQkgKi8KLQkJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLCBhNF9leGlzdHMsIHFjX2V4aXN0cywKLQkJCQkgICAgICBtZXNzYWdlLCBwbl92ZWN0b3IsIG51bV9ibG9ja3MgKyAxKTsKLQotCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKLQkJCXBhZGRlZF9idWZmZXJbal0gPSAweDAwOwotCQlmb3IgKGogPSAwOyBqIDwgcGF5bG9hZF9yZW1haW5kZXI7IGorKykKLQkJCXBhZGRlZF9idWZmZXJbal0gPSBtZXNzYWdlW3BheWxvYWRfaW5kZXggKyBqXTsKLQkJYWVzMTI4azEyOGQoa2V5LCBjdHJfcHJlbG9hZCwgYWVzX291dCk7Ci0JCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7Ci0JCWZvciAoaiA9IDA7IGogPCBwYXlsb2FkX3JlbWFpbmRlcjsgaisrKQotCQkJbWVzc2FnZVtwYXlsb2FkX2luZGV4KytdID0gY2hhaW5fYnVmZmVyW2pdOwotCX0KLQotCS8qIEVuY3J5cHQgdGhlIE1JQyAqLwotCWNvbnN0cnVjdF9jdHJfcHJlbG9hZChjdHJfcHJlbG9hZCwgYTRfZXhpc3RzLCBxY19leGlzdHMsIG1lc3NhZ2UsCi0JCQkgICAgICBwbl92ZWN0b3IsIDApOwotCi0JZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCi0JCXBhZGRlZF9idWZmZXJbal0gPSAweDAwOwotCWZvciAoaiA9IDA7IGogPCA4OyBqKyspCi0JCXBhZGRlZF9idWZmZXJbal0gPSBtZXNzYWdlW2ogKyBoZHJsZW4gKyA4ICsgcGxlbiAtIDhdOwotCi0JYWVzMTI4azEyOGQoa2V5LCBjdHJfcHJlbG9hZCwgYWVzX291dCk7Ci0JYml0d2lzZV94b3IoYWVzX291dCwgcGFkZGVkX2J1ZmZlciwgY2hhaW5fYnVmZmVyKTsKLQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQotCQltZXNzYWdlW3BheWxvYWRfaW5kZXgrK10gPSBjaGFpbl9idWZmZXJbal07Ci0KLQkvKiBjb21wYXJlIHRoZSBtaWMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCWlmIChwZnJhbWVbaGRybGVuICsgOCArIHBsZW4gLSA4ICsgaV0gIT0gbWVzc2FnZVtoZHJsZW4gKyA4ICsgcGxlbiAtIDggKyBpXSkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICIlczptaWMgY2hlY2sgZXJyb3IgbWljWyVkXTogcGZyYW1lKCV4KSAhPSBtZXNzYWdlKCV4KVxuIiwKLQkJCQkgX19mdW5jX18sIGksCi0JCQkJIHBmcmFtZVtoZHJsZW4gKyA4ICsgcGxlbiAtIDggKyBpXSwKLQkJCQkgbWVzc2FnZVtoZHJsZW4gKyA4ICsgcGxlbiAtIDggKyBpXSk7Ci0JCQlEQkdfODcyM0EoIiVzOm1pYyBjaGVjayBlcnJvciBtaWNbJWRdOiBwZnJhbWUoJXgpICE9IG1lc3NhZ2UoJXgpXG4iLAotCQkJCSAgX19mdW5jX18sIGksCi0JCQkJICBwZnJhbWVbaGRybGVuICsgOCArIHBsZW4gLSA4ICsgaV0sCi0JCQkJICBtZXNzYWdlW2hkcmxlbiArIDggKyBwbGVuIC0gOCArIGldKTsKLQkJCXJlcyA9IF9GQUlMOwotCQl9Ci0JfQotCXJldHVybiByZXM7Ci19Ci0KLWludCBydHdfYWVzX2RlY3J5cHQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICAgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lKQotewkvKiAgZXhjbHVkZSBJQ1YgKi8KLQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YWluZm87Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnByeGF0dHJpYiA9ICZwcmVjdmZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZmcmFtZS0+cGt0OwotCWludCBsZW5ndGg7Ci0JdTggKnBmcmFtZSwgKnByd3NrZXk7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0JcGZyYW1lID0gc2tiLT5kYXRhOwotCS8qIDQgc3RhcnQgdG8gZW5jcnlwdCBlYWNoIGZyYWdtZW50ICovCi0JaWYgKHByeGF0dHJpYi0+ZW5jcnlwdCAhPSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQlzdGFpbmZvID0gcnR3X2dldF9zdGFpbmZvMjNhKCZwYWRhcHRlci0+c3RhcHJpdiwgJnByeGF0dHJpYi0+dGFbMF0pOwotCWlmICghc3RhaW5mbykgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywKLQkJCSAiJXM6IHN0YWluZm8gPT0gTlVMTCEhIVxuIiwgX19mdW5jX18pOwotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLAotCQkgIiVzOiBzdGFpbmZvIT0gTlVMTCEhIVxuIiwgX19mdW5jX18pOwotCi0JaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHByeGF0dHJpYi0+cmEpKSB7Ci0JCS8qIGluIGNvbmN1cnJlbnQgd2Ugc2hvdWxkIHVzZSBzdyBkZWNyeXB0IGluCi0JCSAqIGdyb3VwIGtleSwgc28gd2UgcmVtb3ZlIHRoaXMgbWVzc2FnZQotCQkgKi8KLQkJaWYgKCFwc2VjdXJpdHlwcml2LT5iaW5zdGFsbEdycGtleSkgewotCQkJcmVzID0gX0ZBSUw7Ci0JCQlEQkdfODcyM0EoIiVzOnJ4IGJjL21jIHBhY2tldHMsIGJ1dCBkaWRuJ3QgaW5zdGFsbCAiCi0JCQkJICAiZ3JvdXAga2V5ISEhISEhISEhIVxuIiwgX19mdW5jX18pOwotCQkJZ290byBleGl0OwotCQl9Ci0JCXByd3NrZXkgPSBwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwS2V5W3ByeGF0dHJpYi0+a2V5X2luZGV4XS5za2V5OwotCQlpZiAocHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycEtleWlkICE9IHByeGF0dHJpYi0+a2V5X2luZGV4KSB7Ci0JCQlEQkdfODcyM0EoIm5vdCBtYXRjaCBwYWNrZXRfaW5kZXggPSVkLCBpbnN0YWxsX2luZGV4ID0iCi0JCQkJICAiJWRcbiIsIHByeGF0dHJpYi0+a2V5X2luZGV4LAotCQkJCSAgcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycEtleWlkKTsKLQkJCXJlcyA9IF9GQUlMOwotCQkJZ290byBleGl0OwotCQl9Ci0JfSBlbHNlIHsKLQkJcHJ3c2tleSA9ICZzdGFpbmZvLT5kb3QxMTgwMjF4X1VuY3N0S2V5LnNrZXlbMF07Ci0JfQotCi0JbGVuZ3RoID0gc2tiLT5sZW4gLSBwcnhhdHRyaWItPmhkcmxlbiAtCXByeGF0dHJpYi0+aXZfbGVuOwotCi0JcmVzID0gYWVzX2RlY2lwaGVyKHByd3NrZXksIHByeGF0dHJpYi0+aGRybGVuLCBwZnJhbWUsIGxlbmd0aCk7Ci1leGl0OgotCXJldHVybiByZXM7Ci19Ci0KLXZvaWQgcnR3X3VzZV90a2lwa2V5X2hhbmRsZXIyM2Eodm9pZCAqZnVuY3Rpb25fY29udGV4dCkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gZnVuY3Rpb25fY29udGV4dDsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLAotCQkgIl5eXiVzIF5eXlxuIiwgX19mdW5jX18pOwotCXBhZGFwdGVyLT5zZWN1cml0eXByaXYuYnVzZXRraXBrZXkgPSAxOwotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLAotCQkgIl5eXiVzIHBhZGFwdGVyLT5zZWN1cml0eXByaXYuYnVzZXRraXBrZXkgPSVkXl5eXG4iLAotCQkgX19mdW5jX18sIHBhZGFwdGVyLT5zZWN1cml0eXByaXYuYnVzZXRraXBrZXkpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19zcmVzZXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfc3Jlc2V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YTI5ZDkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19zcmVzZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEyIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPHJ0d19zcmVzZXQuaD4KLSNpbmNsdWRlIDx1c2Jfb3BzX2xpbnV4Lmg+Ci0KLXZvaWQgcnR3X3NyZXNldF9pbml0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IHNyZXNldF9wcml2ICpwc3J0cHJpdiA9ICZwSGFsRGF0YS0+c3Jlc3Rwcml2OwotCi0JbXV0ZXhfaW5pdCgmcHNydHByaXYtPnNpbGVudHJlc2V0X211dGV4KTsKLQlwc3J0cHJpdi0+c2lsZW50X3Jlc2V0X2lucHJvZ3Jlc3MgPSBmYWxzZTsKLQlwc3J0cHJpdi0+bGFzdF90eF90aW1lID0gMDsKLQlwc3J0cHJpdi0+bGFzdF90eF9jb21wbGV0ZV90aW1lID0gMDsKLX0KLQotdm9pZCBydHdfc3Jlc2V0X3Jlc2V0X3ZhbHVlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IHNyZXNldF9wcml2ICpwc3J0cHJpdiA9ICZwSGFsRGF0YS0+c3Jlc3Rwcml2OwotCi0JcHNydHByaXYtPnNpbGVudF9yZXNldF9pbnByb2dyZXNzID0gZmFsc2U7Ci0JcHNydHByaXYtPmxhc3RfdHhfdGltZSA9IDA7Ci0JcHNydHByaXYtPmxhc3RfdHhfY29tcGxldGVfdGltZSA9IDA7Ci19Ci0KLWJvb2wgcnR3X3NyZXNldF9pbnByb2dyZXNzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwcmltYXJ5X2FkYXB0ZXIgPSBHRVRfUFJJTUFSWV9BREFQVEVSKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHByaW1hcnlfYWRhcHRlcik7Ci0KLQlyZXR1cm4gcEhhbERhdGEtPnNyZXN0cHJpdi5zaWxlbnRfcmVzZXRfaW5wcm9ncmVzczsKLX0KLQotc3RhdGljIHZvaWQgc3Jlc2V0X3Jlc3RvcmVfc2VjdXJpdHlfc3RhdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKm1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdi5tbG1leHRfaW5mbzsKLQl1OCB2YWw4OwotCi0JaWYgKHBtbG1laW5mby0+YXV0aF9hbGdvID09IGRvdDExQXV0aEFsZ3J0aG1fODAyMVgpCi0JCXZhbDggPSAweGNjOwotCWVsc2UKLQkJdmFsOCA9IDB4Y2Y7Ci0KLQlydGw4NzIzYV9zZXRfc2VjX2NmZyhwYWRhcHRlciwgdmFsOCk7Ci0KLQlpZiAocGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lBbGdydGhtID09Ci0JICAgIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVAgfHwKLQkgICAgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lBbGdydGhtID09Ci0JICAgIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVApIHsKLQkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgZ2V0X2Jzc2lkKG1sbWVwcml2KSk7Ci0JCWlmIChwc3RhID09IE5VTEwpIHsKLQkJCS8qIERFQlVHX0VSUigoIlNldCB3cGFfc2V0X2VuY3J5cHRpb246IE9idGFpbiBTdGFfaW5mbyBmYWlsXG4iKSk7ICovCi0JCX0gZWxzZSB7Ci0JCQkvKiBwYWlyd2lzZSBrZXkgKi8KLQkJCXJ0d19zZXRzdGFrZXlfY21kMjNhKHBhZGFwdGVyLCAodW5zaWduZWQgY2hhciAqKXBzdGEsIHRydWUpOwotCQkJLyogZ3JvdXAga2V5ICovCi0JCQlydHdfc2V0X2tleTIzYShwYWRhcHRlciwmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdiwgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMTgwMjFYR3JwS2V5aWQsIDApOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBzcmVzZXRfcmVzdG9yZV9uZXR3b3JrX3N0YXRpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICptbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYJKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQl1OCB0aHJlc2hvbGQ7Ci0KLQlydHdfc2V0b3Btb2RlX2NtZDIzYShwYWRhcHRlciwgTkw4MDIxMV9JRlRZUEVfU1RBVElPTik7Ci0KLQkvKiAgVEggPSAxID0+IG1lYW5zIHRoYXQgaW52YWxpZGF0ZSB1c2IgcnggYWdncmVnYXRpb24gKi8KLQkvKiAgVEggPSAwID0+IG1lYW5zIHRoYXQgdmFsaWRhdGUgdXNiIHJ4IGFnZ3JlZ2F0aW9uLCB1c2UgaW5pdCB2YWx1ZS4gKi8KLQlpZiAobWxtZXByaXYtPmh0cHJpdi5odF9vcHRpb24pIHsKLQkJaWYgKHBhZGFwdGVyLT5yZWdpc3RyeXByaXYud2lmaV9zcGVjID09IDEpCi0JCQl0aHJlc2hvbGQgPSAxOwotCQllbHNlCi0JCQl0aHJlc2hvbGQgPSAwOwotCX0gZWxzZQotCQl0aHJlc2hvbGQgPSAxOwotCi0JcnRsODcyM2Ffc2V0X3J4ZG1hX2FnZ19wZ190aChwYWRhcHRlciwgdGhyZXNob2xkKTsKLQotCXNldF9jaGFubmVsX2J3bW9kZTIzYShwYWRhcHRlciwgcG1sbWVleHQtPmN1cl9jaGFubmVsLAotCQkJICAgICAgcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQsIHBtbG1lZXh0LT5jdXJfYndtb2RlKTsKLQotCWh3X3Zhcl9zZXRfYnNzaWQocGFkYXB0ZXIsIHBtbG1laW5mby0+bmV0d29yay5NYWNBZGRyZXNzKTsKLQlod192YXJfc2V0X21sbWVfam9pbihwYWRhcHRlciwgMCk7Ci0KLQlydGw4NzIzYV9zZXRfbWVkaWFfc3RhdHVzKHBhZGFwdGVyLCBwbWxtZWluZm8tPnN0YXRlICYgMHgzKTsKLQotCW1sbWVleHRfam9pbmJzc19ldmVudF9jYWxsYmFjazIzYShwYWRhcHRlciwgMSk7Ci0JLyogcmVzdG9yZSBTZXF1ZW5jZSBOby4gKi8KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfTlFPU19TRVEsIHBhZGFwdGVyLT54bWl0cHJpdi5ucW9zX3Nzbik7Ci0KLQlzcmVzZXRfcmVzdG9yZV9zZWN1cml0eV9zdGF0aW9uKHBhZGFwdGVyKTsKLX0KLQotc3RhdGljIHZvaWQgc3Jlc2V0X3Jlc3RvcmVfbmV0d29ya19zdGF0dXMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICptbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSkgewotCQlEQkdfODcyM0EoIiVzKCVzKTogZndzdGF0ZToweCUwOHggLSBXSUZJX1NUQVRJT05fU1RBVEVcbiIsCi0JCQkgIF9fZnVuY19fLCBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwKLQkJCSAgZ2V0X2Z3c3RhdGUobWxtZXByaXYpKTsKLQkJc3Jlc2V0X3Jlc3RvcmVfbmV0d29ya19zdGF0aW9uKHBhZGFwdGVyKTsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQl9IGVsc2UgaWYgKGNoZWNrX2Z3c3RhdGUobWxtZXByaXYsIFdJRklfQVBfU1RBVEUpKSB7Ci0JCURCR184NzIzQSgiJXMoJXMpOiBmd3N0YXRlOjB4JTA4eCAtIFdJRklfQVBfU1RBVEVcbiIsCi0JCQkgIF9fZnVuY19fLCBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwKLQkJCSAgZ2V0X2Z3c3RhdGUobWxtZXByaXYpKTsKLQkJcnR3X2FwX3Jlc3RvcmVfbmV0d29yayhwYWRhcHRlcik7Ci0jZW5kaWYKLQl9IGVsc2UgaWYgKGNoZWNrX2Z3c3RhdGUobWxtZXByaXYsIFdJRklfQURIT0NfU1RBVEUpKSB7Ci0JCURCR184NzIzQSgiJXMoJXMpOiBmd3N0YXRlOjB4JTA4eCAtIFdJRklfQURIT0NfU1RBVEVcbiIsCi0JCQkgIF9fZnVuY19fLCBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwKLQkJCSAgZ2V0X2Z3c3RhdGUobWxtZXByaXYpKTsKLQl9IGVsc2UgewotCQlEQkdfODcyM0EoIiVzKCVzKTogZndzdGF0ZToweCUwOHggLSA/Pz9cbiIsIF9fZnVuY19fLAotCQkJICBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwgZ2V0X2Z3c3RhdGUobWxtZXByaXYpKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHNyZXNldF9zdG9wX2FkYXB0ZXIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCB4bWl0X3ByaXYJKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0KLQlpZiAocGFkYXB0ZXIgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JREJHXzg3MjNBKCIlcyglcylcbiIsIF9fZnVuY19fLCBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSk7Ci0KLQlpZiAoIXJ0d19uZXRpZl9xdWV1ZV9zdG9wcGVkKHBhZGFwdGVyLT5wbmV0ZGV2KSkKLQkJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKHBhZGFwdGVyLT5wbmV0ZGV2KTsKLQotCXJ0d19jYW5jZWxfYWxsX3RpbWVyMjNhKHBhZGFwdGVyKTsKLQotCS8qIFRPRE86IE9TIGFuZCBIQ0kgaW5kZXBlbmRlbnQgKi8KLQl0YXNrbGV0X2tpbGwoJnB4bWl0cHJpdi0+eG1pdF90YXNrbGV0KTsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSkpCi0JCXJ0d19zY2FuX2Fib3J0MjNhKHBhZGFwdGVyKTsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpKQotCQlydHcyM2Ffam9pbl90b19oYW5kbGVyKCh1bnNpZ25lZCBsb25nKXBhZGFwdGVyKTsKLX0KLQotc3RhdGljIHZvaWQgc3Jlc2V0X3N0YXJ0X2FkYXB0ZXIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCB4bWl0X3ByaXYJKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0KLQlpZiAocGFkYXB0ZXIgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JREJHXzg3MjNBKCIlcyglcylcbiIsIF9fZnVuY19fLCBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSk7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKQotCQlzcmVzZXRfcmVzdG9yZV9uZXR3b3JrX3N0YXR1cyhwYWRhcHRlcik7Ci0KLQkvKiBUT0RPOiBPUyBhbmQgSENJIGluZGVwZW5kZW50ICovCi0JdGFza2xldF9oaV9zY2hlZHVsZSgmcHhtaXRwcml2LT54bWl0X3Rhc2tsZXQpOwotCi0JbW9kX3RpbWVyKCZwYWRhcHRlci0+bWxtZXByaXYuZHluYW1pY19jaGtfdGltZXIsCi0JCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjAwMCkpOwotCi0JaWYgKHJ0d19uZXRpZl9xdWV1ZV9zdG9wcGVkKHBhZGFwdGVyLT5wbmV0ZGV2KSkKLQkJbmV0aWZfdHhfd2FrZV9hbGxfcXVldWVzKHBhZGFwdGVyLT5wbmV0ZGV2KTsKLX0KLQotdm9pZCBydHdfc3Jlc2V0X3Jlc2V0KHN0cnVjdCBydHdfYWRhcHRlciAqYWN0aXZlX2FkYXB0ZXIpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IEdFVF9QUklNQVJZX0FEQVBURVIoYWN0aXZlX2FkYXB0ZXIpOwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBzcmVzZXRfcHJpdiAqcHNydHByaXYgPSAmcEhhbERhdGEtPnNyZXN0cHJpdjsKLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3Jwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gamlmZmllczsKLQotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCW11dGV4X2xvY2soJnBzcnRwcml2LT5zaWxlbnRyZXNldF9tdXRleCk7Ci0JcHNydHByaXYtPnNpbGVudF9yZXNldF9pbnByb2dyZXNzID0gdHJ1ZTsKLQlwd3Jwcml2LT5jaGFuZ2VfcmZwd3JzdGF0ZSA9IHJmX29mZjsKLQotCXNyZXNldF9zdG9wX2FkYXB0ZXIocGFkYXB0ZXIpOwotCi0JaXBzX2VudGVyMjNhKHBhZGFwdGVyKTsKLQlpcHNfbGVhdmUyM2EocGFkYXB0ZXIpOwotCi0Jc3Jlc2V0X3N0YXJ0X2FkYXB0ZXIocGFkYXB0ZXIpOwotCXBzcnRwcml2LT5zaWxlbnRfcmVzZXRfaW5wcm9ncmVzcyA9IGZhbHNlOwotCW11dGV4X3VubG9jaygmcHNydHByaXYtPnNpbGVudHJlc2V0X211dGV4KTsKLQotCURCR184NzIzQSgiJXMgZG9uZSBpbiAlZCBtc1xuIiwgX19mdW5jX18sCi0JCSAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gc3RhcnQpKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfc3RhX21ndC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19zdGFfbWd0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5Yjc3OGMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19zdGFfbWd0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9SVFdfU1RBX01HVF9DXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPHJlY3Zfb3NkZXAuaD4KLSNpbmNsdWRlIDx4bWl0X29zZGVwLmg+Ci0jaW5jbHVkZSA8bWxtZV9vc2RlcC5oPgotI2luY2x1ZGUgPHN0YV9pbmZvLmg+Ci0jaW5jbHVkZSA8cnRsODcyM2FfaGFsLmg+Ci0KLXN0YXRpYyBjb25zdCB1OCBiY19hZGRyW0VUSF9BTEVOXSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKLQotc3RhdGljIHZvaWQgX3J0d19pbml0X3N0YWluZm8oc3RydWN0IHN0YV9pbmZvICpwc3RhKQotewotCW1lbXNldCgodTggKilwc3RhLCAwLCBzaXplb2Yoc3RydWN0IHN0YV9pbmZvKSk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnBzdGEtPmxvY2spOwotCUlOSVRfTElTVF9IRUFEKCZwc3RhLT5saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmcHN0YS0+aGFzaF9saXN0KTsKLQlfcnR3X2luaXRfcXVldWUyM2EoJnBzdGEtPnNsZWVwX3EpOwotCXBzdGEtPnNsZWVwcV9sZW4gPSAwOwotCV9ydHdfaW5pdF9zdGFfeG1pdF9wcml2MjNhKCZwc3RhLT5zdGFfeG1pdHByaXYpOwotCV9ydHdfaW5pdF9zdGFfcmVjdl9wcml2MjNhKCZwc3RhLT5zdGFfcmVjdnByaXYpOwotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCUlOSVRfTElTVF9IRUFEKCZwc3RhLT5hc29jX2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZwc3RhLT5hdXRoX2xpc3QpOwotCXBzdGEtPmV4cGlyZV90byA9IDA7Ci0JcHN0YS0+ZmxhZ3MgPSAwOwotCXBzdGEtPmNhcGFiaWxpdHkgPSAwOwotCXBzdGEtPmJwYWlyd2lzZV9rZXlfaW5zdGFsbGVkID0gZmFsc2U7Ci0JcHN0YS0+bm9uZXJwX3NldCA9IDA7Ci0JcHN0YS0+bm9fc2hvcnRfc2xvdF90aW1lX3NldCA9IDA7Ci0JcHN0YS0+bm9fc2hvcnRfcHJlYW1ibGVfc2V0ID0gMDsKLQlwc3RhLT5ub19odF9nZl9zZXQgPSAwOwotCXBzdGEtPm5vX2h0X3NldCA9IDA7Ci0JcHN0YS0+aHRfMjBtaHpfc2V0ID0gMDsKLQlwc3RhLT5rZWVwX2FsaXZlX3RyeWNudCA9IDA7Ci0jZW5kaWYJLyogIENPTkZJR184NzIzQVVfQVBfTU9ERSAqLwotfQotCi1pbnQgX3J0d19pbml0X3N0YV9wcml2MjNhKHN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYpCi17Ci0JaW50IGk7Ci0KLQlzcGluX2xvY2tfaW5pdCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotCXBzdGFwcml2LT5hc29jX3N0YV9jb3VudCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IE5VTV9TVEE7IGkrKykKLQkJSU5JVF9MSVNUX0hFQUQoJnBzdGFwcml2LT5zdGFfaGFzaFtpXSk7Ci0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQlwc3RhcHJpdi0+c3RhX2R6X2JpdG1hcCA9IDA7Ci0JcHN0YXByaXYtPnRpbV9iaXRtYXAgPSAwOwotCUlOSVRfTElTVF9IRUFEKCZwc3RhcHJpdi0+YXNvY19saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmcHN0YXByaXYtPmF1dGhfbGlzdCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnBzdGFwcml2LT5hdXRoX2xpc3RfbG9jayk7Ci0JcHN0YXByaXYtPmFzb2NfbGlzdF9jbnQgPSAwOwotCXBzdGFwcml2LT5hdXRoX2xpc3RfY250ID0gMDsKLQlwc3RhcHJpdi0+YXV0aF90byA9IDM7IC8qICAzKjIgPSA2IHNlYyAqLwotCXBzdGFwcml2LT5hc3NvY190byA9IDM7Ci0JLyogcHN0YXByaXYtPmV4cGlyZV90byA9IDkwMDsgIDkwMCoyID0gMTgwMCBzZWMgPSAzMCBtaW4sCi0JICAgIGV4cGlyZSBhZnRlciBubyBhbnkgdHJhZmZpYy4gKi8KLQkvKiBwc3RhcHJpdi0+ZXhwaXJlX3RvID0gMzA7ICAzMCoyID0gNjAgc2VjID0gMSBtaW4sCi0JICAgIGV4cGlyZSBhZnRlciBubyBhbnkgdHJhZmZpYy4gKi8KLQlwc3RhcHJpdi0+ZXhwaXJlX3RvID0gMzsgLyogIDMqMiA9IDYgc2VjICovCi0JcHN0YXByaXYtPm1heF9udW1fc3RhID0gTlVNX1NUQTsKLSNlbmRpZgotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotaW50IF9ydHdfZnJlZV9zdGFfcHJpdjIzYShzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2KQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkOwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSwgKnB0bXA7Ci0Jc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsICpwcmVvcmRlcl9jdHJsOwotCWludCBpbmRleDsKLQotCWlmIChwc3RhcHJpdikgewotCQkvKglkZWxldGUgYWxsIHJlb3JkZXJpbmdfY3RybF90aW1lcgkJKi8KLQkJc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0JCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9TVEE7IGluZGV4KyspIHsKLQkJCXBoZWFkID0gJnBzdGFwcml2LT5zdGFfaGFzaFtpbmRleF07Ci0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHN0YSwgcHRtcCwgcGhlYWQsIGhhc2hfbGlzdCkgewotCQkJCWludCBpOwotCi0JCQkJZm9yIChpID0gMDsgaSA8IDE2IDsgaSsrKSB7Ci0JCQkJCXByZW9yZGVyX2N0cmwgPSAmcHN0YS0+cmVjdnJlb3JkZXJfY3RybFtpXTsKLQkJCQkJZGVsX3RpbWVyX3N5bmMoJnByZW9yZGVyX2N0cmwtPnJlb3JkZXJpbmdfY3RybF90aW1lcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0JCS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0JfQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RydWN0IHN0YV9pbmZvICoKLXJ0d19hbGxvY19zdGFpbmZvMjNhKHN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYsIGNvbnN0IHU4ICpod2FkZHIsIGdmcF90IGdmcCkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkCSpwaGFzaF9saXN0OwotCXN0cnVjdCBzdGFfaW5mbwkqcHN0YTsKLQlzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmw7Ci0JczMyCWluZGV4OwotCWludCBpID0gMDsKLQl1MTYgIHdSeFNlcUluaXRpYWxWYWx1ZSA9IDB4ZmZmZjsKLQotCXBzdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3RhX2luZm8pLCBnZnApOwotCWlmICghcHN0YSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLQotCV9ydHdfaW5pdF9zdGFpbmZvKHBzdGEpOwotCi0JcHN0YS0+cGFkYXB0ZXIgPSBwc3RhcHJpdi0+cGFkYXB0ZXI7Ci0KLQlldGhlcl9hZGRyX2NvcHkocHN0YS0+aHdhZGRyLCBod2FkZHIpOwotCi0JaW5kZXggPSB3aWZpX21hY19oYXNoKGh3YWRkcik7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc3RhX21ndF9jXywgX2Rydl9pbmZvXywKLQkJICJydHdfYWxsb2Nfc3RhaW5mbzIzYTogaW5kZXggID0gJXhcbiIsIGluZGV4KTsKLQlpZiAoaW5kZXggPj0gTlVNX1NUQSkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc3RhX21ndF9jXywgX2Rydl9lcnJfLAotCQkJICJFUlJPUiA9PiBydHdfYWxsb2Nfc3RhaW5mbzIzYTogaW5kZXggPj0gTlVNX1NUQVxuIik7Ci0JCXBzdGEgPSBOVUxMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCXBoYXNoX2xpc3QgPSAmcHN0YXByaXYtPnN0YV9oYXNoW2luZGV4XTsKLQotCWxpc3RfYWRkX3RhaWwoJnBzdGEtPmhhc2hfbGlzdCwgcGhhc2hfbGlzdCk7Ci0KLQlwc3RhcHJpdi0+YXNvY19zdGFfY291bnQrKzsKLQotLyogIEZvciB0aGUgU01DIHJvdXRlciwgdGhlIHNlcXVlbmNlIG51bWJlciBvZiBmaXJzdCBwYWNrZXQgb2YgV1BTCi0gICAgIGhhbmRzaGFrZSB3aWxsIGJlIDAuICovCi0vKiAgSW4gdGhpcyBjYXNlLCB0aGlzIHBhY2tldCB3aWxsIGJlIGRyb3BwZWQgYnkgcmVjdl9kZWNhY2hlIGZ1bmN0aW9uCi0gICAgaWYgd2UgdXNlIHRoZSAweDAwIGFzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aWRfcnhzZXEgdmFyaWFibGUuICovCi0vKiAgU28sIHdlIGluaXRpYWxpemUgdGhlIHRpZF9yeHNlcSB2YXJpYWJsZSBhcyB0aGUgMHhmZmZmLiAqLwotCi0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JCW1lbWNweSgmcHN0YS0+c3RhX3JlY3Zwcml2LnJ4Y2FjaGUudGlkX3J4c2VxW2ldLAotCQkJJndSeFNlcUluaXRpYWxWYWx1ZSwgMik7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc3RhX21ndF9jXywgX2Rydl9pbmZvXywKLQkJICJhbGxvYyBudW1iZXJfJWQgc3RhaW5mbyAgd2l0aCBod2FkZHIgPSAlcE1cbiIsCi0JCSBwc3RhcHJpdi0+YXNvY19zdGFfY291bnQsIGh3YWRkcik7Ci0KLQlpbml0X2FkZGJhX3JldHJ5X3RpbWVyMjNhKHBzdGEpOwotCi0JLyogZm9yIEEtTVBEVSBSeCByZW9yZGVyaW5nIGJ1ZmZlciBjb250cm9sICovCi0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJcHJlb3JkZXJfY3RybCA9ICZwc3RhLT5yZWN2cmVvcmRlcl9jdHJsW2ldOwotCi0JCXByZW9yZGVyX2N0cmwtPnBhZGFwdGVyID0gcHN0YXByaXYtPnBhZGFwdGVyOwotCi0JCXByZW9yZGVyX2N0cmwtPmVuYWJsZSA9IGZhbHNlOwotCi0JCXByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSA9IDB4ZmZmZjsKLQkJcHJlb3JkZXJfY3RybC0+d2VuZF9iID0gMHhmZmZmOwotCQkvKiBwcmVvcmRlcl9jdHJsLT53c2l6ZV9iID0gKE5SX1JFQ1ZCVUZGLTIpOyAqLwotCQlwcmVvcmRlcl9jdHJsLT53c2l6ZV9iID0gNjQ7LyogNjQ7ICovCi0KLQkJX3J0d19pbml0X3F1ZXVlMjNhKCZwcmVvcmRlcl9jdHJsLT5wZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZSk7Ci0KLQkJcnR3X2luaXRfcmVjdl90aW1lcjIzYShwcmVvcmRlcl9jdHJsKTsKLQl9Ci0JLyogaW5pdCBmb3IgRE0gKi8KLQlwc3RhLT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPSAoLTEpOwotCXBzdGEtPnJzc2lfc3RhdC5VbmRlY29yYXRlZFNtb290aGVkQ0NLID0gKC0xKTsKLQotCS8qIGluaXQgZm9yIHRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgcmVjZWl2ZWQgbWFuYWdlbWVudCBmcmFtZSAqLwotCXBzdGEtPlJ4TWdtdEZyYW1lU2VxTnVtID0gMHhmZmZmOwotZXhpdDoKLQlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotCXJldHVybiBwc3RhOwotfQotCi0vKiAgdXNpbmcgcHN0YXByaXYtPnN0YV9oYXNoX2xvY2sgdG8gcHJvdGVjdCAqLwotaW50IHJ0d19mcmVlX3N0YWluZm8yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKQotewotCXN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybDsKLQlzdHJ1Y3QJc3RhX3htaXRfcHJpdgkqcHN0YXhtaXRwcml2OwotCXN0cnVjdAl4bWl0X3ByaXYJKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0CXN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3QgaHdfeG1pdCAqcGh3eG1pdDsKLQlpbnQgaTsKLQotCWlmICghcHN0YSkKLQkJZ290byBleGl0OwotCi0Jc3Bpbl9sb2NrX2JoKCZwc3RhLT5sb2NrKTsKLQlwc3RhLT5zdGF0ZSAmPSB+X0ZXX0xJTktFRDsKLQlzcGluX3VubG9ja19iaCgmcHN0YS0+bG9jayk7Ci0KLQlwc3RheG1pdHByaXYgPSAmcHN0YS0+c3RhX3htaXRwcml2OwotCi0Jc3Bpbl9sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwotCi0JcnR3X2ZyZWVfeG1pdGZyYW1lX3F1ZXVlMjNhKHB4bWl0cHJpdiwgJnBzdGEtPnNsZWVwX3EpOwotCXBzdGEtPnNsZWVwcV9sZW4gPSAwOwotCi0JLyogdm8gKi8KLQlydHdfZnJlZV94bWl0ZnJhbWVfcXVldWUyM2EocHhtaXRwcml2LCAmcHN0YXhtaXRwcml2LT52b19xLnN0YV9wZW5kaW5nKTsKLQlsaXN0X2RlbF9pbml0KCZwc3RheG1pdHByaXYtPnZvX3EudHhfcGVuZGluZyk7Ci0JcGh3eG1pdCA9IHB4bWl0cHJpdi0+aHd4bWl0czsKLQlwaHd4bWl0LT5hY2NudCAtPSBwc3RheG1pdHByaXYtPnZvX3EucWNudDsKLQlwc3RheG1pdHByaXYtPnZvX3EucWNudCA9IDA7Ci0KLQkvKiB2aSAqLwotCXJ0d19mcmVlX3htaXRmcmFtZV9xdWV1ZTIzYShweG1pdHByaXYsICZwc3RheG1pdHByaXYtPnZpX3Euc3RhX3BlbmRpbmcpOwotCWxpc3RfZGVsX2luaXQoJnBzdGF4bWl0cHJpdi0+dmlfcS50eF9wZW5kaW5nKTsKLQlwaHd4bWl0ID0gcHhtaXRwcml2LT5od3htaXRzKzE7Ci0JcGh3eG1pdC0+YWNjbnQgLT0gcHN0YXhtaXRwcml2LT52aV9xLnFjbnQ7Ci0JcHN0YXhtaXRwcml2LT52aV9xLnFjbnQgPSAwOwotCi0JLyogYmUgKi8KLQlydHdfZnJlZV94bWl0ZnJhbWVfcXVldWUyM2EocHhtaXRwcml2LCAmcHN0YXhtaXRwcml2LT5iZV9xLnN0YV9wZW5kaW5nKTsKLQlsaXN0X2RlbF9pbml0KCZwc3RheG1pdHByaXYtPmJlX3EudHhfcGVuZGluZyk7Ci0JcGh3eG1pdCA9IHB4bWl0cHJpdi0+aHd4bWl0cysyOwotCXBod3htaXQtPmFjY250IC09IHBzdGF4bWl0cHJpdi0+YmVfcS5xY250OwotCXBzdGF4bWl0cHJpdi0+YmVfcS5xY250ID0gMDsKLQotCS8qIGJrICovCi0JcnR3X2ZyZWVfeG1pdGZyYW1lX3F1ZXVlMjNhKHB4bWl0cHJpdiwgJnBzdGF4bWl0cHJpdi0+YmtfcS5zdGFfcGVuZGluZyk7Ci0JbGlzdF9kZWxfaW5pdCgmcHN0YXhtaXRwcml2LT5ia19xLnR4X3BlbmRpbmcpOwotCXBod3htaXQgPSBweG1pdHByaXYtPmh3eG1pdHMrMzsKLQlwaHd4bWl0LT5hY2NudCAtPSBwc3RheG1pdHByaXYtPmJrX3EucWNudDsKLQlwc3RheG1pdHByaXYtPmJrX3EucWNudCA9IDA7Ci0KLQlzcGluX3VubG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLQotCWxpc3RfZGVsX2luaXQoJnBzdGEtPmhhc2hfbGlzdCk7Ci0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3N0YV9tZ3RfY18sIF9kcnZfZXJyXywKLQkJICJmcmVlIG51bWJlcl8lZCBzdGFpbmZvICB3aXRoIGh3YWRkciA9ICVwTVxuIiwKLQkJIHBzdGFwcml2LT5hc29jX3N0YV9jb3VudCwgcHN0YS0+aHdhZGRyKTsKLQlwc3RhcHJpdi0+YXNvY19zdGFfY291bnQtLTsKLQotCS8qICByZS1pbml0IHN0YV9pbmZvOyAyMDA2MTExNCAgd2lsbCBiZSBpbml0IGluIGFsbG9jX3N0YWluZm8gKi8KLQkvKiBfcnR3X2luaXRfc3RhX3htaXRfcHJpdjIzYSgmcHN0YS0+c3RhX3htaXRwcml2KTsgKi8KLQkvKiBfcnR3X2luaXRfc3RhX3JlY3ZfcHJpdjIzYSgmcHN0YS0+c3RhX3JlY3Zwcml2KTsgKi8KLQotCWRlbF90aW1lcl9zeW5jKCZwc3RhLT5hZGRiYV9yZXRyeV90aW1lcik7Ci0KLQkvKiBmb3IgQS1NUERVIFJ4IHJlb3JkZXJpbmcgYnVmZmVyIGNvbnRyb2wsCi0JICAgY2FuY2VsIHJlb3JkZXJpbmdfY3RybF90aW1lciAqLwotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCXN0cnVjdCBsaXN0X2hlYWQJKnBoZWFkLCAqcGxpc3Q7Ci0JCXN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lOwotCQlzdHJ1Y3QgcnR3X3F1ZXVlICpwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWU7Ci0KLQkJcHJlb3JkZXJfY3RybCA9ICZwc3RhLT5yZWN2cmVvcmRlcl9jdHJsW2ldOwotCi0JCWRlbF90aW1lcl9zeW5jKCZwcmVvcmRlcl9jdHJsLT5yZW9yZGVyaW5nX2N0cmxfdGltZXIpOwotCi0JCXBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZSA9Ci0JCQkmcHJlb3JkZXJfY3RybC0+cGVuZGluZ19yZWN2ZnJhbWVfcXVldWU7Ci0KLQkJc3Bpbl9sb2NrX2JoKCZwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUtPmxvY2spOwotCQlwaGVhZCA9CQlnZXRfbGlzdF9oZWFkKHBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZSk7Ci0JCXBsaXN0ID0gcGhlYWQtPm5leHQ7Ci0KLQkJd2hpbGUgKCFsaXN0X2VtcHR5KHBoZWFkKSkgewotCQkJcHJmcmFtZSA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHJlY3ZfZnJhbWUsIGxpc3QpOwotCQkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKLQkJCWxpc3RfZGVsX2luaXQoJnByZnJhbWUtPmxpc3QpOwotCQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHByZnJhbWUpOwotCQl9Ci0JCXNwaW5fdW5sb2NrX2JoKCZwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUtPmxvY2spOwotCX0KLQlpZiAoIShwc3RhLT5zdGF0ZSAmIFdJRklfQVBfU1RBVEUpKQotCQlydGw4NzIzYV9TZXRIYWxPRE1WYXIocGFkYXB0ZXIsIEhBTF9PRE1fU1RBX0lORk8sIHBzdGEsIGZhbHNlKTsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5hdXRoX2xpc3RfbG9jayk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZwc3RhLT5hdXRoX2xpc3QpKSB7Ci0JCWxpc3RfZGVsX2luaXQoJnBzdGEtPmF1dGhfbGlzdCk7Ci0JCXBzdGFwcml2LT5hdXRoX2xpc3RfY250LS07Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+YXV0aF9saXN0X2xvY2spOwotCi0JcHN0YS0+ZXhwaXJlX3RvID0gMDsKLQotCXBzdGEtPnNsZWVwcV9hY19sZW4gPSAwOwotCXBzdGEtPnFvc19pbmZvID0gMDsKLQotCXBzdGEtPm1heF9zcF9sZW4gPSAwOwotCXBzdGEtPnVhcHNkX2JrID0gMDsKLQlwc3RhLT51YXBzZF9iZSA9IDA7Ci0JcHN0YS0+dWFwc2RfdmkgPSAwOwotCXBzdGEtPnVhcHNkX3ZvID0gMDsKLQotCXBzdGEtPmhhc19sZWdhY3lfYWMgPSAwOwotCi0JcHN0YXByaXYtPnN0YV9kel9iaXRtYXAgJj0gfkNIS0JJVChwc3RhLT5haWQpOwotCXBzdGFwcml2LT50aW1fYml0bWFwICY9IH5DSEtCSVQocHN0YS0+YWlkKTsKLQotCWlmICgocHN0YS0+YWlkID4gMCkgJiYgKHBzdGFwcml2LT5zdGFfYWlkW3BzdGEtPmFpZCAtIDFdID09IHBzdGEpKSB7Ci0JCXBzdGFwcml2LT5zdGFfYWlkW3BzdGEtPmFpZCAtIDFdID0gTlVMTDsKLQkJcHN0YS0+YWlkID0gMDsKLQl9Ci0jZW5kaWYJLyogIENPTkZJR184NzIzQVVfQVBfTU9ERSAqLwotCi0Ja2ZyZWUocHN0YSk7Ci1leGl0OgotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotLyogIGZyZWUgYWxsIHN0YWluZm8gd2hpY2ggaW4gc3RhX2hhc2hbYWxsXSAqLwotdm9pZCBydHdfZnJlZV9hbGxfc3RhaW5mbzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkOwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSwgKnB0bXA7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBiY21jX3N0YWluZm8gPSBydHdfZ2V0X2JjbWNfc3RhaW5mbzIzYShwYWRhcHRlcik7Ci0JczMyIGluZGV4OwotCi0JaWYgKHBzdGFwcml2LT5hc29jX3N0YV9jb3VudCA9PSAxKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fU1RBOyBpbmRleCsrKSB7Ci0JCXBoZWFkID0gJnBzdGFwcml2LT5zdGFfaGFzaFtpbmRleF07Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwc3RhLCBwdG1wLCBwaGVhZCwgaGFzaF9saXN0KSB7Ci0JCQlpZiAocGJjbWNfc3RhaW5mbyAhPSBwc3RhKQotCQkJCXJ0d19mcmVlX3N0YWluZm8yM2EocGFkYXB0ZXIsIHBzdGEpOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci19Ci0KLS8qIGFueSBzdGF0aW9uIGFsbG9jYXRlZCBjYW4gYmUgc2VhcmNoZWQgYnkgaGFzaCBsaXN0ICovCi1zdHJ1Y3Qgc3RhX2luZm8gKnJ0d19nZXRfc3RhaW5mbzIzYShzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2LCBjb25zdCB1OCAqaHdhZGRyKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkOwotCXN0cnVjdCBzdGFfaW5mbyAqcG9zLCAqcHN0YSA9IE5VTEw7Ci0JdTMyIGluZGV4OwotCWNvbnN0IHU4ICphZGRyOwotCi0JaWYgKCFod2FkZHIpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGh3YWRkcikpCi0JCWFkZHIgPSBiY19hZGRyOwotCWVsc2UKLQkJYWRkciA9IGh3YWRkcjsKLQotCWluZGV4ID0gd2lmaV9tYWNfaGFzaChhZGRyKTsKLQotCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotCXBoZWFkID0gJnBzdGFwcml2LT5zdGFfaGFzaFtpbmRleF07Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsIHBoZWFkLCBoYXNoX2xpc3QpIHsKLQkJcHN0YSA9IHBvczsKLQotCQkvKiAgaWYgZm91bmQgdGhlIG1hdGNoZWQgYWRkcmVzcyAqLwotCQlpZiAoZXRoZXJfYWRkcl9lcXVhbChwc3RhLT5od2FkZHIsIGFkZHIpKQotCQkJYnJlYWs7Ci0KLQkJcHN0YSA9IE5VTEw7Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0JcmV0dXJuIHBzdGE7Ci19Ci0KLWludCBydHdfaW5pdF9iY21jX3N0YWluZm8yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QJc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBzdGFfaW5mbwkJKnBzdGE7Ci0Jc3RydWN0IHR4X3NlcnZxCSpwdHhzZXJ2cTsKLQlpbnQgcmVzID0gX1NVQ0NFU1M7Ci0KLQlwc3RhID0gcnR3X2FsbG9jX3N0YWluZm8yM2EocHN0YXByaXYsIGJjX2FkZHIsIEdGUF9LRVJORUwpOwotCWlmICghcHN0YSkgewotCQlyZXMgPSBfRkFJTDsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3N0YV9tZ3RfY18sIF9kcnZfZXJyXywKLQkJCSAicnR3X2FsbG9jX3N0YWluZm8yM2EgZmFpbFxuIik7Ci0JCXJldHVybiByZXM7Ci0JfQotCS8qICBkZWZhdWx0IGJyb2FkY2FzdCAmIG11bHRpY2FzdCB1c2UgbWFjaWQgMSAqLwotCXBzdGEtPm1hY19pZCA9IDE7Ci0KLQlwdHhzZXJ2cSA9ICZwc3RhLT5zdGFfeG1pdHByaXYuYmVfcTsKLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXN0cnVjdCBzdGFfaW5mbyAqcnR3X2dldF9iY21jX3N0YWluZm8yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3Qgc3RhX2luZm8JCSpwc3RhOwotCXN0cnVjdCBzdGFfcHJpdgkJKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCi0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgYmNfYWRkcik7Ci0JcmV0dXJuIHBzdGE7Ci19Ci0KLWJvb2wgcnR3X2FjY2Vzc19jdHJsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICptYWNfYWRkcikKLXsKLQlib29sIHJlcyA9IHRydWU7Ci0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0Jc3RydWN0IHJ0d193bGFuX2FjbF9ub2RlICpwYWNsbm9kZTsKLQlib29sIG1hdGNoID0gZmFsc2U7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3Qgd2xhbl9hY2xfcG9vbCAqcGFjbF9saXN0ID0gJnBzdGFwcml2LT5hY2xfbGlzdDsKLQlzdHJ1Y3QgcnR3X3F1ZXVlICpwYWNsX25vZGVfcSA9ICZwYWNsX2xpc3QtPmFjbF9ub2RlX3E7Ci0KLQlzcGluX2xvY2tfYmgoJnBhY2xfbm9kZV9xLT5sb2NrKTsKLQlwaGVhZCA9IGdldF9saXN0X2hlYWQocGFjbF9ub2RlX3EpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkocGFjbG5vZGUsIHBoZWFkLCBsaXN0KSB7Ci0JCWlmIChldGhlcl9hZGRyX2VxdWFsKHBhY2xub2RlLT5hZGRyLCBtYWNfYWRkcikpIHsKLQkJCWlmIChwYWNsbm9kZS0+dmFsaWQpIHsKLQkJCQltYXRjaCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnBhY2xfbm9kZV9xLT5sb2NrKTsKLQotCWlmIChwYWNsX2xpc3QtPm1vZGUgPT0gMSkvKiBhY2NlcHQgdW5sZXNzIGluIGRlbnkgbGlzdCAqLwotCQlyZXMgPSAobWF0Y2gpID8gIGZhbHNlIDogdHJ1ZTsKLQllbHNlIGlmIChwYWNsX2xpc3QtPm1vZGUgPT0gMikvKiBkZW55IHVubGVzcyBpbiBhY2NlcHQgbGlzdCAqLwotCQlyZXMgPSAobWF0Y2gpID8gIHRydWUgOiBmYWxzZTsKLQllbHNlCi0JCSByZXMgPSB0cnVlOwotI2VuZGlmCi0JcmV0dXJuIHJlczsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfd2xhbl91dGlsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3dsYW5fdXRpbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTRjZjE3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfd2xhbl91dGlsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfUlRXX1dMQU5fVVRJTF9DXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgotI2luY2x1ZGUgPHdpZmkuaD4KLSNpbmNsdWRlIDxydGw4NzIzYV9zcGVjLmg+Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIEFSVEhFUk9TX09VSTFbXSA9IHsweDAwLCAweDAzLCAweDdmfTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIEFSVEhFUk9TX09VSTJbXSA9IHsweDAwLCAweDEzLCAweDc0fTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgQlJPQURDT01fT1VJMVtdID0gezB4MDAsIDB4MTAsIDB4MTh9Owotc3RhdGljIHVuc2lnbmVkIGNoYXIgQlJPQURDT01fT1VJMltdID0gezB4MDAsIDB4MGEsIDB4Zjd9OwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBDSVNDT19PVUlbXSA9IHsweDAwLCAweDQwLCAweDk2fTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIE1BUlZFTExfT1VJW10gPSB7MHgwMCwgMHg1MCwgMHg0M307Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBSQUxJTktfT1VJW10gPSB7MHgwMCwgMHgwYywgMHg0M307Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBSRUFMVEVLX09VSVtdID0gezB4MDAsIDB4ZTAsIDB4NGN9Owotc3RhdGljIHVuc2lnbmVkIGNoYXIgQUlSR09DQVBfT1VJW10gPSB7MHgwMCwgMHgwYSwgMHhmNX07Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBFUElHUkFNX09VSVtdID0gezB4MDAsIDB4OTAsIDB4NGN9OwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBXUEFfVEtJUF9DSVBIRVJbNF0gPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwMn07Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBSU05fVEtJUF9DSVBIRVJbNF0gPSB7MHgwMCwgMHgwZiwgMHhhYywgMHgwMn07Ci0KLSNkZWZpbmUgUjJUX1BIWV9ERUxBWQkJMAotCi0vKiBkZWZpbmUgV0FJVF9GT1JfQkNOX1RPX01JTgkzMDAwICovCi0jZGVmaW5lIFdBSVRfRk9SX0JDTl9UT19NSU4JNjAwMAotI2RlZmluZSBXQUlUX0ZPUl9CQ05fVE9fTUFYCTIwMDAwCi0KLXN0YXRpYyB1OCBydHdfYmFzaWNfcmF0ZV9jY2tbNF0gPSB7Ci0JSUVFRTgwMjExX0NDS19SQVRFXzFNQiB8IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0ssCi0JSUVFRTgwMjExX0NDS19SQVRFXzJNQiB8IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0ssCi0JSUVFRTgwMjExX0NDS19SQVRFXzVNQiB8IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0ssCi0JSUVFRTgwMjExX0NDS19SQVRFXzExTUIgfCBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLCi19OwotCi1zdGF0aWMgdTggcnR3X2Jhc2ljX3JhdGVfb2ZkbVszXSA9IHsKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzZNQiB8IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0ssCi0JSUVFRTgwMjExX09GRE1fUkFURV8xMk1CIHwgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSywKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUIgfCBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLCi19OwotCi1zdGF0aWMgdTggcnR3X2Jhc2ljX3JhdGVfbWl4WzddID0gewotCUlFRUU4MDIxMV9DQ0tfUkFURV8xTUIgfCBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLLAotCUlFRUU4MDIxMV9DQ0tfUkFURV8yTUIgfCBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLLAotCUlFRUU4MDIxMV9DQ0tfUkFURV81TUIgfCBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLLAotCUlFRUU4MDIxMV9DQ0tfUkFURV8xMU1CIHwgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSywKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzZNQiB8IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0ssCi0JSUVFRTgwMjExX09GRE1fUkFURV8xMk1CIHwgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSywKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUIgfCBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLCi19OwotCi1pbnQgY2NrcmF0ZXNfaW5jbHVkZWQyM2EodW5zaWduZWQgY2hhciAqcmF0ZSwgaW50IHJhdGVsZW4pCi17Ci0JaW50CWk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcmF0ZWxlbjsgaSsrKSB7Ci0JCWlmICAoKChyYXRlW2ldKSAmIDB4N2YpID09IDIgfHwgKChyYXRlW2ldKSAmIDB4N2YpID09IDQgfHwKLQkJICAgICAoKHJhdGVbaV0pICYgMHg3ZikgPT0gMTEgIHx8ICgocmF0ZVtpXSkgJiAweDdmKSA9PSAyMikKLQkJCXJldHVybiB0cnVlOwotCX0KLQotCXJldHVybiBmYWxzZTsKLX0KLQotaW50IGNja3JhdGVzb25seV9pbmNsdWRlZDIzYSh1bnNpZ25lZCBjaGFyICpyYXRlLCBpbnQgcmF0ZWxlbikKLXsKLQlpbnQJaTsKLQotCWZvciAoaSA9IDA7IGkgPCByYXRlbGVuOyBpKyspIHsKLQkJaWYgICgoKHJhdGVbaV0pICYgMHg3ZikgIT0gMiAmJiAoKHJhdGVbaV0pICYgMHg3ZikgIT0gNCAmJgotCQkgICAgICgocmF0ZVtpXSkgJiAweDdmKSAhPSAxMSAmJiAoKHJhdGVbaV0pICYgMHg3ZikgIT0gMjIpCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotdW5zaWduZWQgY2hhciBuZXR3b3JrdHlwZV90b19yYWlkMjNhKHVuc2lnbmVkIGNoYXIgbmV0d29ya190eXBlKQotewotCXVuc2lnbmVkIGNoYXIgcmFpZDsKLQotCXN3aXRjaCAobmV0d29ya190eXBlKSB7Ci0JY2FzZSBXSVJFTEVTU18xMUI6Ci0JCXJhaWQgPSBSQVRSX0lOWF9XSVJFTEVTU19COwotCQlicmVhazsKLQljYXNlIFdJUkVMRVNTXzExQToKLQljYXNlIFdJUkVMRVNTXzExRzoKLQkJcmFpZCA9IFJBVFJfSU5YX1dJUkVMRVNTX0c7Ci0JCWJyZWFrOwotCWNhc2UgV0lSRUxFU1NfMTFCRzoKLQkJcmFpZCA9IFJBVFJfSU5YX1dJUkVMRVNTX0dCOwotCQlicmVhazsKLQljYXNlIFdJUkVMRVNTXzExXzI0TjoKLQljYXNlIFdJUkVMRVNTXzExXzVOOgotCQlyYWlkID0gUkFUUl9JTlhfV0lSRUxFU1NfTjsKLQkJYnJlYWs7Ci0JY2FzZSBXSVJFTEVTU18xMUFfNU46Ci0JY2FzZSBXSVJFTEVTU18xMUdfMjROOgotCQlyYWlkID0gUkFUUl9JTlhfV0lSRUxFU1NfTkc7Ci0JCWJyZWFrOwotCWNhc2UgV0lSRUxFU1NfMTFCR18yNE46Ci0JCXJhaWQgPSBSQVRSX0lOWF9XSVJFTEVTU19OR0I7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJhaWQgPSBSQVRSX0lOWF9XSVJFTEVTU19HQjsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByYWlkOwotfQotCi11OCBqdWRnZV9uZXR3b3JrX3R5cGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSB1bnNpZ25lZCBjaGFyICpyYXRlLCBpbnQgcmF0ZWxlbikKLXsKLQl1OCBuZXR3b3JrX3R5cGUgPSAwOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlpZiAocG1sbWVleHQtPmN1cl9jaGFubmVsID4gMTQpIHsKLQkJaWYgKHBtbG1laW5mby0+SFRfZW5hYmxlKQotCQkJbmV0d29ya190eXBlID0gV0lSRUxFU1NfMTFfNU47Ci0JCW5ldHdvcmtfdHlwZSB8PSBXSVJFTEVTU18xMUE7Ci0JfSBlbHNlIHsKLQkJaWYgKHBtbG1laW5mby0+SFRfZW5hYmxlKQotCQkJbmV0d29ya190eXBlID0gV0lSRUxFU1NfMTFfMjROOwotCi0JCWlmICgoY2NrcmF0ZXNvbmx5X2luY2x1ZGVkMjNhKHJhdGUsIHJhdGVsZW4pKSA9PSB0cnVlKQotCQkJbmV0d29ya190eXBlIHw9IFdJUkVMRVNTXzExQjsKLQkJZWxzZSBpZiAoKGNja3JhdGVzX2luY2x1ZGVkMjNhKHJhdGUsIHJhdGVsZW4pKSA9PSB0cnVlKQotCQkJbmV0d29ya190eXBlIHw9IFdJUkVMRVNTXzExQkc7Ci0JCWVsc2UKLQkJCW5ldHdvcmtfdHlwZSB8PSBXSVJFTEVTU18xMUc7Ci0JfQotCXJldHVybgluZXR3b3JrX3R5cGU7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHJhdGV0YmxfdmFsXzJ3aWZpcmF0ZSh1bnNpZ25lZCBjaGFyIHJhdGUpCi17Ci0JdW5zaWduZWQgY2hhciB2YWwgPSAwOwotCi0Jc3dpdGNoIChyYXRlICYgMHg3ZikgewotCWNhc2UgMDoKLQkJdmFsID0gSUVFRTgwMjExX0NDS19SQVRFXzFNQjsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQl2YWwgPSBJRUVFODAyMTFfQ0NLX1JBVEVfMk1COwotCQlicmVhazsKLQljYXNlIDI6Ci0JCXZhbCA9IElFRUU4MDIxMV9DQ0tfUkFURV81TUI7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJdmFsID0gSUVFRTgwMjExX0NDS19SQVRFXzExTUI7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJdmFsID0gSUVFRTgwMjExX09GRE1fUkFURV82TUI7Ci0JCWJyZWFrOwotCWNhc2UgNToKLQkJdmFsID0gSUVFRTgwMjExX09GRE1fUkFURV85TUI7Ci0JCWJyZWFrOwotCWNhc2UgNjoKLQkJdmFsID0gSUVFRTgwMjExX09GRE1fUkFURV8xMk1COwotCQlicmVhazsKLQljYXNlIDc6Ci0JCXZhbCA9IElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQjsKLQkJYnJlYWs7Ci0JY2FzZSA4OgotCQl2YWwgPSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUI7Ci0JCWJyZWFrOwotCWNhc2UgOToKLQkJdmFsID0gSUVFRTgwMjExX09GRE1fUkFURV8zNk1COwotCQlicmVhazsKLQljYXNlIDEwOgotCQl2YWwgPSBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUI7Ci0JCWJyZWFrOwotCWNhc2UgMTE6Ci0JCXZhbCA9IElFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQjsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiB2YWw7Ci19Ci0KLXN0YXRpYyBpbnQgaXNfYmFzaWNyYXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgcmF0ZSkKLXsKLQlpbnQgaTsKLQl1bnNpZ25lZCBjaGFyIHZhbDsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCi0JZm9yIChpID0gMDsgaSA8IE51bVJhdGVzOyBpKyspIHsKLQkJdmFsID0gcG1sbWVleHQtPmJhc2ljcmF0ZVtpXTsKLQotCQlpZiAodmFsICE9IDB4ZmYgJiYgdmFsICE9IDB4ZmUpIHsKLQkJCWlmIChyYXRlID09IHJhdGV0YmxfdmFsXzJ3aWZpcmF0ZSh2YWwpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHJhdGV0YmwycmF0ZXNldChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICB1bnNpZ25lZCBjaGFyICpyYXRlc2V0KQotewotCWludCBpOwotCXVuc2lnbmVkIGNoYXIgcmF0ZTsKLQl1bnNpZ25lZCBpbnQgbGVuID0gMDsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCi0JZm9yIChpID0gMDsgaSA8IE51bVJhdGVzOyBpKyspIHsKLQkJcmF0ZSA9IHBtbG1lZXh0LT5kYXRhcmF0ZVtpXTsKLQotCQlzd2l0Y2ggKHJhdGUpIHsKLQkJY2FzZSAweGZmOgotCQkJcmV0dXJuIGxlbjsKLQkJY2FzZSAweGZlOgotCQkJY29udGludWU7Ci0JCWRlZmF1bHQ6Ci0JCQlyYXRlID0gcmF0ZXRibF92YWxfMndpZmlyYXRlKHJhdGUpOwotCi0JCQlpZiAoaXNfYmFzaWNyYXRlKHBhZGFwdGVyLCByYXRlKSA9PSB0cnVlKQotCQkJCXJhdGUgfD0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSzsKLQotCQkJcmF0ZXNldFtsZW5dID0gcmF0ZTsKLQkJCWxlbisrOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIGxlbjsKLX0KLQotdm9pZCBnZXRfcmF0ZV9zZXQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICAgICB1bnNpZ25lZCBjaGFyICpwYnNzcmF0ZSwgaW50ICpic3NyYXRlX2xlbikKLXsKLQl1bnNpZ25lZCBjaGFyIHN1cHBvcnRlZHJhdGVzW051bVJhdGVzXTsKLQotCW1lbXNldChzdXBwb3J0ZWRyYXRlcywgMCwgTnVtUmF0ZXMpOwotCSpic3NyYXRlX2xlbiA9IHJhdGV0YmwycmF0ZXNldChwYWRhcHRlciwgc3VwcG9ydGVkcmF0ZXMpOwotCW1lbWNweShwYnNzcmF0ZSwgc3VwcG9ydGVkcmF0ZXMsICpic3NyYXRlX2xlbik7Ci19Ci0KLXZvaWQgVXBkYXRlQnJhdGVUYmwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1OCAqbUJyYXRlc09TKQotewotCXU4IGk7Ci0JdTggcmF0ZTsKLQotCS8qICAxTSwgMk0sIDUuNU0sIDExTSwgNk0sIDEyTSwgMjRNIGFyZSBtYW5kYXRvcnkuICovCi0JZm9yIChpID0gMDsgaSA8IE5ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWDsgaSsrKSB7Ci0JCXJhdGUgPSBtQnJhdGVzT1NbaV0gJiAweDdmOwotCQlzd2l0Y2ggKHJhdGUpIHsKLQkJY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfMU1COgotCQljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8yTUI6Ci0JCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzVNQjoKLQkJY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQjoKLQkJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQjoKLQkJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUI6Ci0JCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8yNE1COgotCQkJbUJyYXRlc09TW2ldIHw9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0s7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi12b2lkIFVwZGF0ZTIzYVRibEZvclNvZnRBUCh1OCAqYnNzcmF0ZXNldCwgdTMyIGJzc3JhdGVsZW4pCi17Ci0JdTggaTsKLQl1OCByYXRlOwotCi0JZm9yIChpID0gMDsgaSA8IGJzc3JhdGVsZW47IGkrKykgewotCQlyYXRlID0gYnNzcmF0ZXNldFtpXSAmIDB4N2Y7Ci0JCXN3aXRjaCAocmF0ZSkgewotCQljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8xTUI6Ci0JCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzJNQjoKLQkJY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfNU1COgotCQljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1COgotCQkJYnNzcmF0ZXNldFtpXSB8PSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLWlubGluZSB1OCBydHdfZ2V0X29wZXJfY2gyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKQotewotCXJldHVybiBhZGFwdGVyX3RvX2R2b2JqKGFkYXB0ZXIpLT5vcGVyX2NoYW5uZWw7Ci19Ci0KLWlubGluZSB2b2lkIHJ0d19zZXRfb3Blcl9jaDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IGNoKQotewotCWFkYXB0ZXJfdG9fZHZvYmooYWRhcHRlciktPm9wZXJfY2hhbm5lbCA9IGNoOwotfQotCi1pbmxpbmUgdm9pZCBydHdfc2V0X29wZXJfYncyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCB1OCBidykKLXsKLQlhZGFwdGVyX3RvX2R2b2JqKGFkYXB0ZXIpLT5vcGVyX2J3bW9kZSA9IGJ3OwotfQotCi1pbmxpbmUgdm9pZCBydHdfc2V0X29wZXJfY2gyM2FvZmZzZXQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCB1OCBvZmZzZXQpCi17Ci0JYWRhcHRlcl90b19kdm9iaihhZGFwdGVyKS0+b3Blcl9jaF9vZmZzZXQgPSBvZmZzZXQ7Ci19Ci0KLXZvaWQgU2VsZWN0Q2hhbm5lbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBjaGFyIGNoYW5uZWwpCi17Ci0JbXV0ZXhfbG9jaygmYWRhcHRlcl90b19kdm9iaihwYWRhcHRlciktPnNldGNoX211dGV4KTsKLQotCS8qIHNhdmVkIGNoYW5uZWwgaW5mbyAqLwotCXJ0d19zZXRfb3Blcl9jaDIzYShwYWRhcHRlciwgY2hhbm5lbCk7Ci0KLQlQSFlfU3dDaG5sODcyM0EocGFkYXB0ZXIsIGNoYW5uZWwpOwotCi0JbXV0ZXhfdW5sb2NrKCZhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKS0+c2V0Y2hfbXV0ZXgpOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfYndtb2RlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIHNob3J0IGJ3bW9kZSwKLQkJICAgICAgIHVuc2lnbmVkIGNoYXIgY2hhbm5lbF9vZmZzZXQpCi17Ci0JbXV0ZXhfbG9jaygmYWRhcHRlcl90b19kdm9iaihwYWRhcHRlciktPnNldGJ3X211dGV4KTsKLQotCS8qIHNhdmVkIGJ3IGluZm8gKi8KLQlydHdfc2V0X29wZXJfYncyM2EocGFkYXB0ZXIsIGJ3bW9kZSk7Ci0JcnR3X3NldF9vcGVyX2NoMjNhb2Zmc2V0MjNhKHBhZGFwdGVyLCBjaGFubmVsX29mZnNldCk7Ci0KLQlQSFlfU2V0QldNb2RlMjNhODcyM0EocGFkYXB0ZXIsIChlbnVtIGh0X2NoYW5uZWxfd2lkdGgpYndtb2RlLAotCQkJICAgICAgY2hhbm5lbF9vZmZzZXQpOwotCi0JbXV0ZXhfdW5sb2NrKCZhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKS0+c2V0YndfbXV0ZXgpOwotfQotCi12b2lkIHNldF9jaGFubmVsX2J3bW9kZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBjaGFyIGNoYW5uZWwsCi0JCQkgICB1bnNpZ25lZCBjaGFyIGNoYW5uZWxfb2Zmc2V0LCB1bnNpZ25lZCBzaG9ydCBid21vZGUpCi17Ci0JdTggY2VudGVyX2NoOwotCi0JaWYgKGJ3bW9kZSA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwIHx8Ci0JICAgIGNoYW5uZWxfb2Zmc2V0ID09IEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkUpIHsKLQkJLyogU2VsZWN0Q2hhbm5lbDIzYShwYWRhcHRlciwgY2hhbm5lbCk7ICovCi0JCWNlbnRlcl9jaCA9IGNoYW5uZWw7Ci0JfSBlbHNlIHsKLQkJLyogc3dpdGNoIHRvIHRoZSBwcm9wZXIgY2hhbm5lbCAqLwotCQlpZiAoY2hhbm5lbF9vZmZzZXQgPT0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0xPV0VSKSB7Ci0JCQkvKiBTZWxlY3RDaGFubmVsMjNhKHBhZGFwdGVyLCBjaGFubmVsICsgMik7ICovCi0JCQljZW50ZXJfY2ggPSBjaGFubmVsICsgMjsKLQkJfSBlbHNlIHsKLQkJCS8qIFNlbGVjdENoYW5uZWwyM2EocGFkYXB0ZXIsIGNoYW5uZWwgLSAyKTsgKi8KLQkJCWNlbnRlcl9jaCA9IGNoYW5uZWwgLSAyOwotCQl9Ci0JfQotCi0JLyogc2V0IENoYW5uZWwgKi8KLQltdXRleF9sb2NrKCZhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKS0+c2V0Y2hfbXV0ZXgpOwotCi0JLyogc2F2ZWQgY2hhbm5lbC9idyBpbmZvICovCi0JcnR3X3NldF9vcGVyX2NoMjNhKHBhZGFwdGVyLCBjaGFubmVsKTsKLQlydHdfc2V0X29wZXJfYncyM2EocGFkYXB0ZXIsIGJ3bW9kZSk7Ci0JcnR3X3NldF9vcGVyX2NoMjNhb2Zmc2V0MjNhKHBhZGFwdGVyLCBjaGFubmVsX29mZnNldCk7Ci0KLQlQSFlfU3dDaG5sODcyM0EocGFkYXB0ZXIsIGNlbnRlcl9jaCk7IC8qICBzZXQgY2VudGVyIGNoYW5uZWwgKi8KLQotCW11dGV4X3VubG9jaygmYWRhcHRlcl90b19kdm9iaihwYWRhcHRlciktPnNldGNoX211dGV4KTsKLQotCXNldF9id21vZGUocGFkYXB0ZXIsIGJ3bW9kZSwgY2hhbm5lbF9vZmZzZXQpOwotfQotCi1pbmxpbmUgdTggKmdldF9teV9ic3NpZDIzYShzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmspCi17Ci0JcmV0dXJuIHBuZXR3b3JrLT5NYWNBZGRyZXNzOwotfQotCi1ib29sIGlzX2NsaWVudF9hc3NvY2lhdGVkX3RvX2FwMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm87Ci0KLQlpZiAoIXBhZGFwdGVyKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0JcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCWlmIChwbWxtZWluZm8tPnN0YXRlICYgV0lGSV9GV19BU1NPQ19TVUNDRVNTICYmCi0JICAgIChwbWxtZWluZm8tPnN0YXRlICYgMHgwMykgPT0gTVNSX0lORlJBKQotCQlyZXR1cm4gdHJ1ZTsKLQllbHNlCi0JCXJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBpc19jbGllbnRfYXNzb2NpYXRlZF90b19pYnNzMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCWlmIChwbWxtZWluZm8tPnN0YXRlICYgV0lGSV9GV19BU1NPQ19TVUNDRVNTICYmCi0JICAgIChwbWxtZWluZm8tPnN0YXRlICYgMHgwMykgPT0gTVNSX0FESE9DKQotCQlyZXR1cm4gdHJ1ZTsKLQllbHNlCi0JCXJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBpc19JQlNTX2VtcHR5MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCWZvciAoaSA9IElCU1NfU1RBUlRfTUFDX0lEOyBpIDwgTlVNX1NUQTsgaSsrKSB7Ci0JCWlmIChwbWxtZWluZm8tPkZXX3N0YV9pbmZvW2ldLnN0YXR1cyA9PSAxKQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXJldHVybiB0cnVlOwotfQotCi11bnNpZ25lZCBpbnQgZGVjaWRlX3dhaXRfZm9yX2JlYWNvbl90aW1lb3V0MjNhKHVuc2lnbmVkIGludCBiY25faW50ZXJ2YWwpCi17Ci0JaWYgKChiY25faW50ZXJ2YWwgPDwgMikgPCBXQUlUX0ZPUl9CQ05fVE9fTUlOKQotCQlyZXR1cm4gV0FJVF9GT1JfQkNOX1RPX01JTjsKLQllbHNlIGlmICgoYmNuX2ludGVydmFsIDw8IDIpID4gV0FJVF9GT1JfQkNOX1RPX01BWCkKLQkJcmV0dXJuIFdBSVRfRk9SX0JDTl9UT19NQVg7Ci0JZWxzZQotCQlyZXR1cm4gYmNuX2ludGVydmFsIDw8IDI7Ci19Ci0KLXZvaWQgY2xlYXJfY2FtX2VudHJ5MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGVudHJ5KQotewotCXVuc2lnbmVkIGNoYXIgbnVsbF9zdGFbXSA9IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKLQotCXVuc2lnbmVkIGNoYXIgbnVsbF9rZXlbXSA9IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCQkJCSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCQkJCSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKLQotCXJ0bDg3MjNhX2NhbV93cml0ZShwYWRhcHRlciwgZW50cnksIDAsIG51bGxfc3RhLCBudWxsX2tleSk7Ci19Ci0KLWludCBhbGxvY2F0ZV9md19zdGFfZW50cnkyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1bnNpZ25lZCBpbnQgbWFjX2lkOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlmb3IgKG1hY19pZCA9IElCU1NfU1RBUlRfTUFDX0lEOyBtYWNfaWQgPCBOVU1fU1RBOyBtYWNfaWQrKykgewotCQlpZiAocG1sbWVpbmZvLT5GV19zdGFfaW5mb1ttYWNfaWRdLnN0YXR1cyA9PSAwKSB7Ci0JCQlwbWxtZWluZm8tPkZXX3N0YV9pbmZvW21hY19pZF0uc3RhdHVzID0gMTsKLQkJCXBtbG1laW5mby0+Rldfc3RhX2luZm9bbWFjX2lkXS5yZXRyeSA9IDA7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiBtYWNfaWQ7Ci19Ci0KLXZvaWQgZmx1c2hfYWxsX2NhbV9lbnRyeTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlydGw4NzIzYV9jYW1faW52YWxpZGF0ZV9hbGwocGFkYXB0ZXIpOwotCi0JbWVtc2V0KHBtbG1laW5mby0+Rldfc3RhX2luZm8sIDAsIHNpemVvZihwbWxtZWluZm8tPkZXX3N0YV9pbmZvKSk7Ci19Ci0KLWludCBXTU1fcGFyYW1faGFuZGxlcjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcCkKLXsKLQkvKiBzdHJ1Y3QgcmVnaXN0cnlfcHJpdgkqcHJlZ3ByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsgKi8KLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlpZiAocG1sbWVwcml2LT5xb3Nfb3B0aW9uID09IDApIHsKLQkJcG1sbWVpbmZvLT5XTU1fZW5hYmxlID0gMDsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCXBtbG1laW5mby0+V01NX2VuYWJsZSA9IDE7Ci0JbWVtY3B5KCZwbWxtZWluZm8tPldNTV9wYXJhbSwgcCArIDIgKyA2LAotCSAgICAgICBzaXplb2Yoc3RydWN0IFdNTV9wYXJhX2VsZW1lbnQpKTsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBXTU1PbkFzc29jUnNwMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTggQUNJLCBBQ00sIEFJRlMsIEVDV01pbiwgRUNXTWF4LCBhU2lmc1RpbWU7Ci0JdTggYWNtX21hc2s7Ci0JdTE2IFRYT1A7Ci0JdTMyIGFjUGFybSwgaTsKLQl1MzIgZWRjYVs0XSwgaW54WzRdOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ3ByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQotCWlmIChwbWxtZWluZm8tPldNTV9lbmFibGUgPT0gMCkgewotCQlwYWRhcHRlci0+bWxtZXByaXYuYWNtX21hc2sgPSAwOwotCQlyZXR1cm47Ci0JfQotCi0JYWNtX21hc2sgPSAwOwotCi0JaWYgKHBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSA9PSBXSVJFTEVTU18xMUIpCi0JCWFTaWZzVGltZSA9IDEwOwotCWVsc2UKLQkJYVNpZnNUaW1lID0gMTY7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCUFDSSA9IChwbWxtZWluZm8tPldNTV9wYXJhbS5hY19wYXJhbVtpXS5BQ0lfQUlGU04gPj4gNSkgJiAweDAzOwotCQlBQ00gPSAocG1sbWVpbmZvLT5XTU1fcGFyYW0uYWNfcGFyYW1baV0uQUNJX0FJRlNOID4+IDQpICYgMHgwMTsKLQotCQkvKiBBSUZTID0gQUlGU04gKiBzbG90IHRpbWUgKyBTSUZTIC0gcjJ0IHBoeSBkZWxheSAqLwotCQlBSUZTID0gKHBtbG1laW5mby0+V01NX3BhcmFtLmFjX3BhcmFtW2ldLkFDSV9BSUZTTiAmIDB4MGYpICoKLQkJCXBtbG1laW5mby0+c2xvdFRpbWUgKyBhU2lmc1RpbWU7Ci0KLQkJRUNXTWluID0gcG1sbWVpbmZvLT5XTU1fcGFyYW0uYWNfcGFyYW1baV0uQ1cgJiAweDBmOwotCQlFQ1dNYXggPSAocG1sbWVpbmZvLT5XTU1fcGFyYW0uYWNfcGFyYW1baV0uQ1cgJiAweGYwKSA+PiA0OwotCQlUWE9QID0gbGUxNl90b19jcHUocG1sbWVpbmZvLT5XTU1fcGFyYW0uYWNfcGFyYW1baV0uVFhPUF9saW1pdCk7Ci0KLQkJYWNQYXJtID0gQUlGUyB8IChFQ1dNaW4gPDwgOCkgfCAoRUNXTWF4IDw8IDEyKSB8IChUWE9QIDw8IDE2KTsKLQotCQlzd2l0Y2ggKEFDSSkgewotCQljYXNlIDB4MDoKLQkJCXJ0bDg3MjNhX3NldF9hY19wYXJhbV9iZShwYWRhcHRlciwgYWNQYXJtKTsKLQkJCWFjbV9tYXNrIHw9IChBQ00/IEJJVCgxKTowKTsKLQkJCWVkY2FbWE1JVF9CRV9RVUVVRV0gPSBhY1Bhcm07Ci0JCQlicmVhazsKLQkJY2FzZSAweDE6Ci0JCQlydGw4NzIzYV9zZXRfYWNfcGFyYW1fYmsocGFkYXB0ZXIsIGFjUGFybSk7Ci0JCQkvKiBhY21fbWFzayB8PSAoQUNNPyBCSVQoMCk6MCk7ICovCi0JCQllZGNhW1hNSVRfQktfUVVFVUVdID0gYWNQYXJtOwotCQkJYnJlYWs7Ci0JCWNhc2UgMHgyOgotCQkJcnRsODcyM2Ffc2V0X2FjX3BhcmFtX3ZpKHBhZGFwdGVyLCBhY1Bhcm0pOwotCQkJYWNtX21hc2sgfD0gKEFDTT8gQklUKDIpOjApOwotCQkJZWRjYVtYTUlUX1ZJX1FVRVVFXSA9IGFjUGFybTsKLQkJCWJyZWFrOwotCQljYXNlIDB4MzoKLQkJCXJ0bDg3MjNhX3NldF9hY19wYXJhbV92byhwYWRhcHRlciwgYWNQYXJtKTsKLQkJCWFjbV9tYXNrIHw9IChBQ00/IEJJVCgzKTowKTsKLQkJCWVkY2FbWE1JVF9WT19RVUVVRV0gPSBhY1Bhcm07Ci0JCQlicmVhazsKLQkJfQotCi0JCURCR184NzIzQSgiV01NKCV4KTogJXgsICV4XG4iLCBBQ0ksIEFDTSwgYWNQYXJtKTsKLQl9Ci0KLQlpZiAocGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5hY21fbWV0aG9kID09IDEpCi0JCXJ0bDg3MjNhX3NldF9hY21fY3RybChwYWRhcHRlciwgYWNtX21hc2spOwotCWVsc2UKLQkJcGFkYXB0ZXItPm1sbWVwcml2LmFjbV9tYXNrID0gYWNtX21hc2s7Ci0KLQlpbnhbMF0gPSAwOyBpbnhbMV0gPSAxOyBpbnhbMl0gPSAyOyBpbnhbM10gPSAzOwotCi0JaWYgKHByZWdwcml2LT53aWZpX3NwZWMgPT0gMSkgewotCQl1MzIgaiwgY2hhbmdlX2lueCA9IGZhbHNlOwotCi0JCS8qIGVudHJ5IGluZHg6IDAtPnZvLCAxLT52aSwgMi0+YmUsIDMtPmJrLiAqLwotCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCQlmb3IgKGogPSBpKzE7IGogPCA0OyBqKyspIHsKLQkJCQkvKiBjb21wYXJlIENXIGFuZCBBSUZTICovCi0JCQkJaWYgKChlZGNhW2pdICYgMHhGRkZGKSA8IChlZGNhW2ldICYgMHhGRkZGKSkgewotCQkJCQljaGFuZ2VfaW54ID0gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKChlZGNhW2pdICYgMHhGRkZGKSA9PQotCQkJCQkgICAoZWRjYVtpXSAmIDB4RkZGRikpIHsKLQkJCQkJLyogY29tcGFyZSBUWE9QICovCi0JCQkJCWlmICgoZWRjYVtqXSA+PiAxNikgPiAoZWRjYVtpXSA+PiAxNikpCi0JCQkJCQljaGFuZ2VfaW54ID0gdHJ1ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoY2hhbmdlX2lueCkgewotCQkJCQlzd2FwKGVkY2FbaV0sIGVkY2Fbal0pOwotCQkJCQlzd2FwKGlueFtpXSwgaW54W2pdKTsKLQkJCQkJY2hhbmdlX2lueCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCWZvciAoaSA9IDA7IGk8NDsgaSsrKSB7Ci0JCXB4bWl0cHJpdi0+d21tX3BhcmFfc2VxW2ldID0gaW54W2ldOwotCQlEQkdfODcyM0EoIndtbV9wYXJhX3NlcSglZCk6ICVkXG4iLCBpLAotCQkJICBweG1pdHByaXYtPndtbV9wYXJhX3NlcVtpXSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBid21vZGVfdXBkYXRlX2NoZWNrKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwKQotewotCXN0cnVjdCBpZWVlODAyMTFfaHRfb3BlcmF0aW9uICpwSFRfaW5mbzsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdpc3RyeXByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQlzdHJ1Y3QgaHRfcHJpdiAqcGh0cHJpdiA9ICZwbWxtZXByaXYtPmh0cHJpdjsKLQl1bnNpZ25lZCBjaGFyIG5ld19id21vZGU7Ci0JdW5zaWduZWQgY2hhciBuZXdfY2hfb2Zmc2V0OwotCi0JaWYgKCFwKQotCQlyZXR1cm47Ci0JaWYgKCFwaHRwcml2LT5odF9vcHRpb24pCi0JCXJldHVybjsKLQlpZiAocFsxXSAhPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9vcGVyYXRpb24pKQotCQlyZXR1cm47Ci0KLQlwSFRfaW5mbyA9IChzdHJ1Y3QgaWVlZTgwMjExX2h0X29wZXJhdGlvbiAqKShwICsgMik7Ci0KLQlpZiAoKHBIVF9pbmZvLT5odF9wYXJhbSAmIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFOX1dJRFRIX0FOWSkgJiYKLQkgICAgcHJlZ2lzdHJ5cHJpdi0+Y2J3NDBfZW5hYmxlKSB7Ci0JCW5ld19id21vZGUgPSBIVF9DSEFOTkVMX1dJRFRIXzQwOwotCi0JCXN3aXRjaCAocEhUX2luZm8tPmh0X3BhcmFtICYgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfT0ZGU0VUKXsKLQkJY2FzZSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRToKLQkJCW5ld19jaF9vZmZzZXQgPSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfTE9XRVI7Ci0JCQlicmVhazsKLQkJY2FzZSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19CRUxPVzoKLQkJCW5ld19jaF9vZmZzZXQgPSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfVVBQRVI7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCW5ld19jaF9vZmZzZXQgPSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQluZXdfYndtb2RlID0gSFRfQ0hBTk5FTF9XSURUSF8yMDsKLQkJbmV3X2NoX29mZnNldCA9IEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkU7Ci0JfQotCi0JaWYgKG5ld19id21vZGUgIT0gcG1sbWVleHQtPmN1cl9id21vZGUgfHwKLQkgICAgbmV3X2NoX29mZnNldCAhPSBwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCkgewotCQlwbWxtZWluZm8tPmJ3bW9kZV91cGRhdGVkID0gdHJ1ZTsKLQotCQlwbWxtZWV4dC0+Y3VyX2J3bW9kZSA9IG5ld19id21vZGU7Ci0JCXBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0ID0gbmV3X2NoX29mZnNldDsKLQotCQkvKiB1cGRhdGUgSFQgaW5mbyBhbHNvICovCi0JCUhUX2luZm9faGFuZGxlcjIzYShwYWRhcHRlciwgcCk7Ci0JfSBlbHNlCi0JCXBtbG1laW5mby0+Yndtb2RlX3VwZGF0ZWQgPSBmYWxzZTsKLQotCWlmIChwbWxtZWluZm8tPmJ3bW9kZV91cGRhdGVkKSB7Ci0JCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQkJc3RydWN0IHdsYW5fYnNzaWRfZXggKmN1cl9uZXR3b3JrID0gJnBtbG1laW5mby0+bmV0d29yazsKLQkJc3RydWN0IHN0YV9wcml2CSpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQotCQkvKiBzZXRfY2hhbm5lbF9id21vZGUyM2EocGFkYXB0ZXIsIHBtbG1lZXh0LT5jdXJfY2hhbm5lbCwKLQkJICAgcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQsIHBtbG1lZXh0LT5jdXJfYndtb2RlKTsgKi8KLQotCQkvKiB1cGRhdGUgYXAncyBzdGFpbmZvICovCi0JCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIGN1cl9uZXR3b3JrLT5NYWNBZGRyZXNzKTsKLQkJaWYgKHBzdGEpIHsKLQkJCXN0cnVjdCBodF9wcml2ICpwaHRwcml2X3N0YSA9ICZwc3RhLT5odHByaXY7Ci0KLQkJCWlmIChwaHRwcml2X3N0YS0+aHRfb3B0aW9uKSB7Ci0JCQkJLyogIGJ3bW9kZSAqLwotCQkJCXBodHByaXZfc3RhLT5id21vZGUgPSBwbWxtZWV4dC0+Y3VyX2J3bW9kZTsKLQkJCQlwaHRwcml2X3N0YS0+Y2hfb2Zmc2V0ID0KLQkJCQkJcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQ7Ci0JCQl9IGVsc2UgewotCQkJCXBodHByaXZfc3RhLT5id21vZGUgPSBIVF9DSEFOTkVMX1dJRFRIXzIwOwotCQkJCXBodHByaXZfc3RhLT5jaF9vZmZzZXQgPQotCQkJCQlIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFOwotCQkJfQotCQl9Ci0JfQotfQotCi12b2lkIEhUX2NhcHNfaGFuZGxlcjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcCkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQl1OCByZl90eXBlOwotCXU4IG1heF9BTVBEVV9sZW4sIG1pbl9NUERVX3NwYWNpbmc7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBodF9wcml2ICpwaHRwcml2ID0gJnBtbG1lcHJpdi0+aHRwcml2OwotCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpjYXA7Ci0JdTggKmRzdGNhcDsKLQotCWlmICghcCkKLQkJcmV0dXJuOwotCi0JaWYgKCFwaHRwcml2LT5odF9vcHRpb24pCi0JCXJldHVybjsKLQotCXBtbG1laW5mby0+SFRfY2Fwc19lbmFibGUgPSAxOwotCi0JY2FwID0gJnBtbG1laW5mby0+aHRfY2FwOwotCWRzdGNhcCA9ICh1OCAqKWNhcDsKLQlmb3IgKGkgPSAwOyBpIDwgcFsxXTsgaSsrKSB7Ci0JCWlmIChpICE9IDIpIHsKLQkJCWRzdGNhcFtpXSAmPSBwW2kgKyAyXTsKLQkJfSBlbHNlIHsKLQkJCS8qIG1vZGlmeSBmcm9tICBmdyBieSBUaG9tYXMgMjAxMC8xMS8xNyAqLwotCQkJaWYgKChjYXAtPmFtcGR1X3BhcmFtc19pbmZvICYKLQkJCSAgICAgSUVFRTgwMjExX0hUX0FNUERVX1BBUk1fRkFDVE9SKSA+Ci0JCQkgICAgKHBbaSArIDJdICYgSUVFRTgwMjExX0hUX0FNUERVX1BBUk1fRkFDVE9SKSkKLQkJCQltYXhfQU1QRFVfbGVuID0gcFtpICsgMl0gJgotCQkJCQlJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9GQUNUT1I7Ci0JCQllbHNlCi0JCQkJbWF4X0FNUERVX2xlbiA9IGNhcC0+YW1wZHVfcGFyYW1zX2luZm8gJgotCQkJCQlJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9GQUNUT1I7Ci0KLQkJCWlmICgoY2FwLT5hbXBkdV9wYXJhbXNfaW5mbyAmCi0JCQkgICAgIElFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0RFTlNJVFkpID4KLQkJCSAgICAocFtpICsgMl0gJiBJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9ERU5TSVRZKSkKLQkJCQltaW5fTVBEVV9zcGFjaW5nID0gY2FwLT5hbXBkdV9wYXJhbXNfaW5mbyAmCi0JCQkJCUlFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0RFTlNJVFk7Ci0JCQllbHNlCi0JCQkJbWluX01QRFVfc3BhY2luZyA9IHBbaSArIDJdICYKLQkJCQkJSUVFRTgwMjExX0hUX0FNUERVX1BBUk1fREVOU0lUWTsKLQotCQkJY2FwLT5hbXBkdV9wYXJhbXNfaW5mbyA9Ci0JCQkJbWF4X0FNUERVX2xlbiB8IG1pbl9NUERVX3NwYWNpbmc7Ci0JCX0KLQl9Ci0KLQlyZl90eXBlID0gcnRsODcyM2FfZ2V0X3JmX3R5cGUocGFkYXB0ZXIpOwotCi0JLyogdXBkYXRlIHRoZSBNQ1MgcmF0ZXMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgSUVFRTgwMjExX0hUX01DU19NQVNLX0xFTjsgaSsrKSB7Ci0JCWlmIChyZl90eXBlID09IFJGXzFUMVIgfHwgcmZfdHlwZSA9PSBSRl8xVDJSKQotCQkJY2FwLT5tY3MucnhfbWFza1tpXSAmPSBNQ1NfcmF0ZV8xUjIzQVtpXTsKLQkJZWxzZQotCQkJY2FwLT5tY3MucnhfbWFza1tpXSAmPSBNQ1NfcmF0ZV8yUjIzQVtpXTsKLQl9Ci19Ci0KLXZvaWQgSFRfaW5mb19oYW5kbGVyMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwKQotewotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgaHRfcHJpdiAqcGh0cHJpdiA9ICZwbWxtZXByaXYtPmh0cHJpdjsKLQotCWlmICghcCkKLQkJcmV0dXJuOwotCi0JaWYgKCFwaHRwcml2LT5odF9vcHRpb24pCi0JCXJldHVybjsKLQotCWlmIChwWzFdICE9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X29wZXJhdGlvbikpCi0JCXJldHVybjsKLQotCXBtbG1laW5mby0+SFRfaW5mb19lbmFibGUgPSAxOwotCW1lbWNweSgmcG1sbWVpbmZvLT5IVF9pbmZvLCBwICsgMiwgcFsxXSk7Ci19Ci0KLXZvaWQgSFRPbkFzc29jUnNwMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdW5zaWduZWQgY2hhciBtYXhfQU1QRFVfbGVuOwotCXVuc2lnbmVkIGNoYXIgbWluX01QRFVfc3BhY2luZzsKLQkvKiBzdHJ1Y3QgcmVnaXN0cnlfcHJpdgkgKnByZWdwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7ICovCi0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCWlmIChwbWxtZWluZm8tPkhUX2luZm9fZW5hYmxlICYmIHBtbG1laW5mby0+SFRfY2Fwc19lbmFibGUpCi0JCXBtbG1laW5mby0+SFRfZW5hYmxlID0gMTsKLQllbHNlIHsKLQkJcG1sbWVpbmZvLT5IVF9lbmFibGUgPSAwOwotCQkvKiBzZXRfY2hhbm5lbF9id21vZGUyM2EocGFkYXB0ZXIsIHBtbG1lZXh0LT5jdXJfY2hhbm5lbCwKLQkJICAgcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQsIHBtbG1lZXh0LT5jdXJfYndtb2RlKTsgKi8KLQkJcmV0dXJuOwotCX0KLQotCS8qIGhhbmRsZSBBLU1QRFUgcGFyYW1ldGVyIGZpZWxkICovCi0JLyoKLQkJQU1QRFVfcGFyYSBbMTowXTpNYXggQU1QRFUgTGVuID0+IDA6OGsgLCAxOjE2aywgMjozMmssIDM6NjRrCi0JCUFNUERVX3BhcmEgWzQ6Ml06TWluIE1QRFUgU3RhcnQgU3BhY2luZwotCSovCi0JbWF4X0FNUERVX2xlbiA9IHBtbG1laW5mby0+aHRfY2FwLmFtcGR1X3BhcmFtc19pbmZvICYKLQkJSUVFRTgwMjExX0hUX0FNUERVX1BBUk1fRkFDVE9SOwotCi0JbWluX01QRFVfc3BhY2luZyA9Ci0JCShwbWxtZWluZm8tPmh0X2NhcC5hbXBkdV9wYXJhbXNfaW5mbyAmCi0JCSBJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9ERU5TSVRZKSA+PiAyOwotCi0JcnRsODcyM2Ffc2V0X2FtcGR1X21pbl9zcGFjZShwYWRhcHRlciwgbWluX01QRFVfc3BhY2luZyk7Ci0JcnRsODcyM2Ffc2V0X2FtcGR1X2ZhY3RvcihwYWRhcHRlciwgbWF4X0FNUERVX2xlbik7Ci19Ci0KLXZvaWQgRVJQX0lFX2hhbmRsZXIyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnApCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCWlmIChwWzFdID4gMSkKLQkJcmV0dXJuOwotCi0JcG1sbWVpbmZvLT5FUlBfZW5hYmxlID0gMTsKLQltZW1jcHkoJnBtbG1laW5mby0+RVJQX0lFLCBwICsgMiwgcFsxXSk7Ci19Ci0KLXZvaWQgVkNTX3VwZGF0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCXN3aXRjaCAocHJlZ3ByaXYtPnZydGxfY2Fycmllcl9zZW5zZSkgeyAvKiAwOm9mZiAxOm9uIDI6YXV0byAqLwotCWNhc2UgMDogLyogb2ZmICovCi0JCXBzdGEtPnJ0c2VuID0gMDsKLQkJcHN0YS0+Y3RzMnNlbGYgPSAwOwotCQlicmVhazsKLQljYXNlIDE6IC8qIG9uICovCi0JCWlmIChwcmVncHJpdi0+dmNzX3R5cGUgPT0gUlRTX0NUUykgewotCQkJcHN0YS0+cnRzZW4gPSAxOwotCQkJcHN0YS0+Y3RzMnNlbGYgPSAwOwotCQl9IGVsc2UgewotCQkJcHN0YS0+cnRzZW4gPSAwOwotCQkJcHN0YS0+Y3RzMnNlbGYgPSAxOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgMjogLyogYXV0byAqLwotCWRlZmF1bHQ6Ci0JCWlmIChwbWxtZWluZm8tPkVSUF9lbmFibGUgJiYgcG1sbWVpbmZvLT5FUlBfSUUgJiBCSVQoMSkpIHsKLQkJCWlmIChwcmVncHJpdi0+dmNzX3R5cGUgPT0gUlRTX0NUUykgewotCQkJCXBzdGEtPnJ0c2VuID0gMTsKLQkJCQlwc3RhLT5jdHMyc2VsZiA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCXBzdGEtPnJ0c2VuID0gMDsKLQkJCQlwc3RhLT5jdHMyc2VsZiA9IDE7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlwc3RhLT5ydHNlbiA9IDA7Ci0JCQlwc3RhLT5jdHMyc2VsZiA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotfQotCi1pbnQgcnR3X2NoZWNrX2Jjbl9pbmZvMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwKLQkJCSAgc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210LCB1MzIgcGt0X2xlbikKLXsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpjdXJfbmV0d29yayA9ICZBZGFwdGVyLT5tbG1lcHJpdi5jdXJfbmV0d29yazsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h0X29wZXJhdGlvbiAqcGh0X2luZm87Ci0JdW5zaWduZWQgc2hvcnQgdmFsMTY7Ci0JdTggY3J5cHRvLCBiY25fY2hhbm5lbDsKLQlpbnQgZ3JvdXBfY2lwaGVyID0gMCwgcGFpcndpc2VfY2lwaGVyID0gMCwgaXNfODAyMXggPSAwLCByOwotCWludCBwaWVfbGVuLCBzc2lkX2xlbiwgcHJpdmFjeTsKLQljb25zdCB1OCAqcCwgKnNzaWQ7Ci0KLQlpZiAoIWlzX2NsaWVudF9hc3NvY2lhdGVkX3RvX2FwMjNhKEFkYXB0ZXIpKQotCQlyZXR1cm4gX1NVQ0NFU1M7Ci0KLQlpZiAodW5saWtlbHkoIWllZWU4MDIxMV9pc19iZWFjb24obWdtdC0+ZnJhbWVfY29udHJvbCkpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByZWNlaXZlZCBhIG5vbiBiZWFjb24gZnJhbWUhXG4iLAotCQkgICAgICAgX19mdW5jX18pOwotCQlyZXR1cm4gX0ZBSUw7Ci0JfQotCi0JaWYgKCFldGhlcl9hZGRyX2VxdWFsKGN1cl9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsIG1nbXQtPmJzc2lkKSkgewotCQlEQkdfODcyM0EoIiVzOiBsaW5rZWQgYnV0IHJlY3Ygb3RoZXIgYnNzaWQgYmNuICVwTSAlcE1cbiIsCi0JCQkgIF9fZnVuY19fLCBtZ210LT5ic3NpZCwKLQkJCSAgY3VyX25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcyk7Ci0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQkvKiBjaGVjayBidyBhbmQgY2hhbm5lbCBvZmZzZXQgKi8KLQkvKiBwYXJzaW5nIEhUX0NBUF9JRSAqLwotCXBpZV9sZW4gPSBwa3RfbGVuIC0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LmJlYWNvbi52YXJpYWJsZSk7Ci0KLQkvKiBDaGVja2luZyBmb3IgY2hhbm5lbCAqLwotCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0RTX1BBUkFNUywgbWdtdC0+dS5iZWFjb24udmFyaWFibGUsCi0JCQkgICAgIHBpZV9sZW4pOwotCWlmIChwKQotCQliY25fY2hhbm5lbCA9IHBbMl07Ci0JZWxzZSB7Ci0JCS8qIEluIDVHLCBzb21lIGFwIGRvIG5vdCBoYXZlIERTU0VUIElFIGNoZWNraW5nIEhUCi0JCSAgIGluZm8gZm9yIGNoYW5uZWwgKi8KLQkJcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfSFRfT1BFUkFUSU9OLAotCQkJCSAgICAgbWdtdC0+dS5iZWFjb24udmFyaWFibGUsIHBpZV9sZW4pOwotCi0JCWlmIChwICYmIHBbMV0gPiAwKSB7Ci0JCQlwaHRfaW5mbyA9IChzdHJ1Y3QgaWVlZTgwMjExX2h0X29wZXJhdGlvbiAqKShwICsgMik7Ci0JCQliY25fY2hhbm5lbCA9IHBodF9pbmZvLT5wcmltYXJ5X2NoYW47Ci0JCX0gZWxzZSB7IC8qIHdlIGRvbid0IGZpbmQgY2hhbm5lbCBJRSwgc28gZG9uJ3QgY2hlY2sgaXQgKi8KLQkJCURCR184NzIzQSgiT29wczogJXMgd2UgZG9uJ3QgZmluZCBjaGFubmVsIElFLCBzbyBkb24ndCAiCi0JCQkJICAiY2hlY2sgaXRcbiIsIF9fZnVuY19fKTsKLQkJCWJjbl9jaGFubmVsID0gQWRhcHRlci0+bWxtZWV4dHByaXYuY3VyX2NoYW5uZWw7Ci0JCX0KLQl9Ci0JaWYgKGJjbl9jaGFubmVsICE9IEFkYXB0ZXItPm1sbWVleHRwcml2LmN1cl9jaGFubmVsKSB7Ci0JCURCR184NzIzQSgiJXMgYmVhY29uIGNoYW5uZWw6JWQgY3VyIGNoYW5uZWw6JWQgZGlzY29ubmVjdFxuIiwKLQkJCSAgX19mdW5jX18sIGJjbl9jaGFubmVsLAotCQkJICBBZGFwdGVyLT5tbG1lZXh0cHJpdi5jdXJfY2hhbm5lbCk7Ci0JCWdvdG8gX21pc21hdGNoOwotCX0KLQotCS8qIGNoZWNraW5nIFNTSUQgKi8KLQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9TU0lELCBtZ210LT51LmJlYWNvbi52YXJpYWJsZSwgcGllX2xlbik7Ci0JaWYgKHAgJiYgcFsxXSkgewotCQlzc2lkID0gcCArIDI7Ci0JCXNzaWRfbGVuID0gcFsxXTsKLQl9IGVsc2UgewotCQlEQkdfODcyM0EoIiVzIG1hcmM6IGNhbm5vdCBmaW5kIFNTSUQgZm9yIHN1cnZleSBldmVudFxuIiwKLQkJCSAgX19mdW5jX18pOwotCQlzc2lkID0gTlVMTDsKLQkJc3NpZF9sZW4gPSAwOwotCX0KLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkgIiVzIGJzc2lkLlNzaWQuU3NpZDolcyBic3NpZC5Tc2lkLlNzaWRMZW5ndGg6JWQgY3VyX25ldHdvcmstPm5ldHdvcmsuU3NpZC5Tc2lkOiVzIGxlbjolZFxuIiwKLQkJIF9fZnVuY19fLCBzc2lkLCBzc2lkX2xlbiwgY3VyX25ldHdvcmstPm5ldHdvcmsuU3NpZC5zc2lkLAotCQkgY3VyX25ldHdvcmstPm5ldHdvcmsuU3NpZC5zc2lkX2xlbik7Ci0KLQlpZiAoc3NpZF9sZW4gIT0gY3VyX25ldHdvcmstPm5ldHdvcmsuU3NpZC5zc2lkX2xlbiB8fCBzc2lkX2xlbiA+IDMyIHx8Ci0JICAgIChzc2lkX2xlbiAmJgotCSAgICAgbWVtY21wKHNzaWQsIGN1cl9uZXR3b3JrLT5uZXR3b3JrLlNzaWQuc3NpZCwgc3NpZF9sZW4pKSkgewotCQlEQkdfODcyM0EoIiVzKCksIFNTSUQgaXMgbm90IG1hdGNoIHJldHVybiBGQUlMXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gX21pc21hdGNoOwotCX0KLQotCS8qIGNoZWNrIGVuY3J5cHRpb24gaW5mbyAqLwotCXZhbDE2ID0gbGUxNl90b19jcHUobWdtdC0+dS5iZWFjb24uY2FwYWJfaW5mbyk7Ci0KLQlpZiAodmFsMTYgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkKLQkJcHJpdmFjeSA9IDE7Ci0JZWxzZQotCQlwcml2YWN5ID0gMDsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkgIiVzKCk6IGN1cl9uZXR3b3JrLT5uZXR3b3JrLlByaXZhY3kgaXMgJWQsIGJzc2lkLlByaXZhY3kgaXMgJWRcbiIsCi0JCSBfX2Z1bmNfXywgY3VyX25ldHdvcmstPm5ldHdvcmsuUHJpdmFjeSwgcHJpdmFjeSk7Ci0JaWYgKGN1cl9uZXR3b3JrLT5uZXR3b3JrLlByaXZhY3kgIT0gcHJpdmFjeSkgewotCQlEQkdfODcyM0EoIiVzKCksIHByaXZhY3kgaXMgbm90IG1hdGNoIHJldHVybiBGQUlMXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gX21pc21hdGNoOwotCX0KLQotCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX1JTTiwgbWdtdC0+dS5iZWFjb24udmFyaWFibGUsIHBpZV9sZW4pOwotCWlmIChwICYmIHBbMV0pIHsKLQkJY3J5cHRvID0gRU5DUllQX1BST1RPQ09MX1dQQTI7Ci0JCWlmIChwICYmIHBbMV0pIHsKLQkJCXIgPSBydHdfcGFyc2Vfd3BhMl9pZTIzYShwLCBwWzFdICsgMiwgJmdyb3VwX2NpcGhlciwKLQkJCQkJCSAmcGFpcndpc2VfY2lwaGVyLCAmaXNfODAyMXgpOwotCQkJaWYgKHIgPT0gX1NVQ0NFU1MpCi0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAiJXMgcG5ldHdvcmstPnBhaXJ3aXNlX2NpcGhlcjogJWQsIHBuZXR3b3JrLT5ncm91cF9jaXBoZXI6ICVkLCBpc184MDJ4IDogJWRcbiIsCi0JCQkJCSBfX2Z1bmNfXywgcGFpcndpc2VfY2lwaGVyLAotCQkJCQkgZ3JvdXBfY2lwaGVyLCBpc184MDIxeCk7Ci0JCQl9Ci0JfSBlbHNlIHsKLQkJcCA9IGNmZzgwMjExX2ZpbmRfdmVuZG9yX2llKFdMQU5fT1VJX01JQ1JPU09GVCwKLQkJCQkJICAgIFdMQU5fT1VJX1RZUEVfTUlDUk9TT0ZUX1dQQSwKLQkJCQkJICAgIG1nbXQtPnUuYmVhY29uLnZhcmlhYmxlLCBwaWVfbGVuKTsKLQkJaWYgKHAgJiYgcFsxXSkgewotCQkJY3J5cHRvID0gRU5DUllQX1BST1RPQ09MX1dQQTsKLQkJCXIgPSBydHdfcGFyc2Vfd3BhX2llMjNhKHAsIHBbMV0gKyAyLCAmZ3JvdXBfY2lwaGVyLAotCQkJCQkJJnBhaXJ3aXNlX2NpcGhlciwgJmlzXzgwMjF4KTsKLQkJCWlmIChyID09IF9TVUNDRVNTKQotCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkJCQkgIiVzIHBuZXR3b3JrLT5wYWlyd2lzZV9jaXBoZXI6ICVkLCBncm91cF9jaXBoZXIgaXMgJWQsIGlzXzgwMjF4IGlzICVkXG4iLAotCQkJCQkgX19mdW5jX18sIHBhaXJ3aXNlX2NpcGhlciwKLQkJCQkJIGdyb3VwX2NpcGhlciwgaXNfODAyMXgpOwotCQl9IGVsc2UgewotCQkJaWYgKHByaXZhY3kpCi0JCQkJY3J5cHRvID0gRU5DUllQX1BST1RPQ09MX1dFUDsKLQkJCWVsc2UKLQkJCQljcnlwdG8gPSBFTkNSWVBfUFJPVE9DT0xfT1BFTlNZUzsKLQkJfQotCX0KLQotCWlmIChjdXJfbmV0d29yay0+QmNuSW5mby5lbmNyeXBfcHJvdG9jb2wgIT0gY3J5cHRvKSB7Ci0JCURCR184NzIzQSgiJXMoKTogZW5jcnlwdGlvbiBtaXNtYXRjaCwgcmV0dXJuIEZBSUxcbiIsIF9fZnVuY19fKTsKLQkJZ290byBfbWlzbWF0Y2g7Ci0JfQotCi0JaWYgKGNyeXB0byA9PSBFTkNSWVBfUFJPVE9DT0xfV1BBIHx8IGNyeXB0byA9PSBFTkNSWVBfUFJPVE9DT0xfV1BBMikgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICIlcyBjdXJfbmV0d29yay0+Z3JvdXBfY2lwaGVyIGlzICVkOiAlZFxuIiwgX19mdW5jX18sCi0JCQkgY3VyX25ldHdvcmstPkJjbkluZm8uZ3JvdXBfY2lwaGVyLCBncm91cF9jaXBoZXIpOwotCQlpZiAocGFpcndpc2VfY2lwaGVyICE9IGN1cl9uZXR3b3JrLT5CY25JbmZvLnBhaXJ3aXNlX2NpcGhlciB8fAotCQkgICAgZ3JvdXBfY2lwaGVyICE9IGN1cl9uZXR3b3JrLT5CY25JbmZvLmdyb3VwX2NpcGhlcikgewotCQkJREJHXzg3MjNBKCIlcyBwYWlyd2lzZV9jaXBoZXIoJXg6JXgpIG9yIGdyb3VwX2NpcGhlciAiCi0JCQkJICAiKCV4OiV4KSBpcyBub3QgbWF0Y2gsIHJldHVybiBGQUlMXG4iLAotCQkJCSAgX19mdW5jX18sIHBhaXJ3aXNlX2NpcGhlciwKLQkJCQkgIGN1cl9uZXR3b3JrLT5CY25JbmZvLnBhaXJ3aXNlX2NpcGhlciwKLQkJCQkgIGdyb3VwX2NpcGhlciwKLQkJCQkgIGN1cl9uZXR3b3JrLT5CY25JbmZvLmdyb3VwX2NpcGhlcik7Ci0JCQlnb3RvIF9taXNtYXRjaDsKLQkJfQotCi0JCWlmIChpc184MDIxeCAhPSBjdXJfbmV0d29yay0+QmNuSW5mby5pc184MDIxeCkgewotCQkJREJHXzg3MjNBKCIlcyBhdXRoZW50aWNhdGlvbiBpcyBub3QgbWF0Y2gsIHJldHVybiAiCi0JCQkJICAiRkFJTFxuIiwgX19mdW5jX18pOwotCQkJZ290byBfbWlzbWF0Y2g7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci0KLV9taXNtYXRjaDoKLQotCXJldHVybiBfRkFJTDsKLX0KLQotdm9pZCB1cGRhdGVfYmVhY29uMjNhX2luZm8oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwKLQkJCSAgIHVpbnQgcGt0X2xlbiwgc3RydWN0IHN0YV9pbmZvICpwc3RhKQotewotCXVuc2lnbmVkIGludCBsZW47Ci0JY29uc3QgdTggKnA7Ci0KLQlsZW4gPSBwa3RfbGVuIC0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LmJlYWNvbi52YXJpYWJsZSk7Ci0KLQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9IVF9PUEVSQVRJT04sIG1nbXQtPnUuYmVhY29uLnZhcmlhYmxlLAotCQkJICAgICBsZW4pOwotCWlmIChwKQotCQlid21vZGVfdXBkYXRlX2NoZWNrKHBhZGFwdGVyLCBwKTsKLQotCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0VSUF9JTkZPLCBtZ210LT51LmJlYWNvbi52YXJpYWJsZSwgbGVuKTsKLQlpZiAocCkgewotCQlFUlBfSUVfaGFuZGxlcjIzYShwYWRhcHRlciwgcCk7Ci0JCVZDU191cGRhdGUyM2EocGFkYXB0ZXIsIHBzdGEpOwotCX0KLX0KLQotYm9vbCBpc19hcF9pbl90a2lwMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTMyIGk7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqY3VyX25ldHdvcmsgPSAmcG1sbWVpbmZvLT5uZXR3b3JrOwotCWNvbnN0IHU4ICpwOwotCi0JaWYgKGN1cl9uZXR3b3JrLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpIHsKLQkJZm9yIChpID0gMDsgaSA8IHBtbG1laW5mby0+bmV0d29yay5JRUxlbmd0aDspIHsKLQkJCXAgPSBwbWxtZWluZm8tPm5ldHdvcmsuSUVzICsgaTsKLQotCQkJc3dpdGNoIChwWzBdKSB7Ci0JCQljYXNlIFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQzoKLQkJCQlpZiAoIW1lbWNtcChwICsgMiwgUlRXX1dQQV9PVUkyM0FfVFlQRSwgNCkgJiYKLQkJCQkgICAgIW1lbWNtcChwICsgMiArIDEyLCBXUEFfVEtJUF9DSVBIRVIsIDQpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0xBTl9FSURfUlNOOgotCQkJCWlmICghbWVtY21wKHAgKyAyICsgOCwgUlNOX1RLSVBfQ0lQSEVSLCA0KSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQkJfQotCQkJaSArPSAocFsxXSArIDIpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9IGVsc2UKLQkJcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIHNob3VsZF9mb3JiaWRfbl9yYXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTMyIGk7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAgKmN1cl9uZXR3b3JrID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yazsKLQljb25zdCB1OCAqcDsKLQotCWlmIChjdXJfbmV0d29yay0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBjdXJfbmV0d29yay0+SUVMZW5ndGg7KSB7Ci0JCQlwID0gY3VyX25ldHdvcmstPklFcyArIGk7Ci0KLQkJCXN3aXRjaCAocFswXSkgewotCQkJY2FzZSBXTEFOX0VJRF9WRU5ET1JfU1BFQ0lGSUM6Ci0JCQkJaWYgKCFtZW1jbXAocCArIDIsIFJUV19XUEFfT1VJMjNBX1RZUEUsIDQpICYmCi0JCQkJICAgICghbWVtY21wKHAgKyAyICsgMTIsCi0JCQkJCSAgICAgV1BBX0NJUEhFUl9TVUlURV9DQ01QMjNBLCA0KSB8fAotCQkJCSAgICAgIW1lbWNtcChwICsgMiArIDE2LAotCQkJCQkgICAgIFdQQV9DSVBIRVJfU1VJVEVfQ0NNUDIzQSwgNCkpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdMQU5fRUlEX1JTTjoKLQkJCQlpZiAoIW1lbWNtcChwICsgMiArIDgsCi0JCQkJCSAgICBSU05fQ0lQSEVSX1NVSVRFX0NDTVAyM0EsIDQpIHx8Ci0JCQkJICAgICFtZW1jbXAocCArIDIgKyAxMiwKLQkJCQkJICAgIFJTTl9DSVBIRVJfU1VJVEVfQ0NNUDIzQSwgNCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaSArPSAocFsxXSArIDIpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0gZWxzZSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19Ci0KLWJvb2wgaXNfYXBfaW5fd2VwMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTMyIGk7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqY3VyX25ldHdvcmsgPSAmcG1sbWVpbmZvLT5uZXR3b3JrOwotCWNvbnN0IHU4ICpwOwotCi0JaWYgKGN1cl9uZXR3b3JrLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpIHsKLQkJZm9yIChpID0gMDsgaSA8IHBtbG1laW5mby0+bmV0d29yay5JRUxlbmd0aDspIHsKLQkJCXAgPSBwbWxtZWluZm8tPm5ldHdvcmsuSUVzICsgaTsKLQotCQkJc3dpdGNoIChwWzBdKSB7Ci0JCQljYXNlIFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQzoKLQkJCQlpZiAoIW1lbWNtcChwICsgMiwgUlRXX1dQQV9PVUkyM0FfVFlQRSwgNCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0xBTl9FSURfUlNOOgotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaSArPSAocFsxXSArIDIpOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfSBlbHNlCi0JCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGludCB3aWZpcmF0ZTJfcmF0ZXRibF9pbngyM2EodW5zaWduZWQgY2hhciByYXRlKQotewotCWludCBpbnggPSAwOwotCi0JcmF0ZSA9IHJhdGUgJiAweDdmOwotCi0Jc3dpdGNoIChyYXRlKSB7Ci0JY2FzZSA1NCoyOgotCQlpbnggPSAxMTsKLQkJYnJlYWs7Ci0JY2FzZSA0OCoyOgotCQlpbnggPSAxMDsKLQkJYnJlYWs7Ci0JY2FzZSAzNioyOgotCQlpbnggPSA5OwotCQlicmVhazsKLQljYXNlIDI0KjI6Ci0JCWlueCA9IDg7Ci0JCWJyZWFrOwotCWNhc2UgMTgqMjoKLQkJaW54ID0gNzsKLQkJYnJlYWs7Ci0JY2FzZSAxMioyOgotCQlpbnggPSA2OwotCQlicmVhazsKLQljYXNlIDkqMjoKLQkJaW54ID0gNTsKLQkJYnJlYWs7Ci0JY2FzZSA2KjI6Ci0JCWlueCA9IDQ7Ci0JCWJyZWFrOwotCWNhc2UgMTEqMjoKLQkJaW54ID0gMzsKLQkJYnJlYWs7Ci0JY2FzZSAxMToKLQkJaW54ID0gMjsKLQkJYnJlYWs7Ci0JY2FzZSAyKjI6Ci0JCWlueCA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgMSoyOgotCQlpbnggPSAwOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIGlueDsKLX0KLQotdW5zaWduZWQgaW50IHVwZGF0ZV9iYXNpY19yYXRlMjNhKHVuc2lnbmVkIGNoYXIgKnB0biwgdW5zaWduZWQgaW50IHB0bl9zeikKLXsKLQl1bnNpZ25lZCBpbnQgaSwgbnVtX29mX3JhdGU7Ci0JdW5zaWduZWQgaW50IG1hc2sgPSAwOwotCi0JbnVtX29mX3JhdGUgPSAocHRuX3N6ID4gTnVtUmF0ZXMpPyBOdW1SYXRlczogcHRuX3N6OwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9vZl9yYXRlOyBpKyspIHsKLQkJaWYgKCgqKHB0biArIGkpKSAmIDB4ODApCi0JCQltYXNrIHw9IDB4MSA8PCB3aWZpcmF0ZTJfcmF0ZXRibF9pbngyM2EoKihwdG4gKyBpKSk7Ci0JfQotCXJldHVybiBtYXNrOwotfQotCi11bnNpZ25lZCBpbnQgdXBkYXRlX3N1cHBvcnRlZF9yYXRlMjNhKHVuc2lnbmVkIGNoYXIgKnB0biwgdW5zaWduZWQgaW50IHB0bl9zeikKLXsKLQl1bnNpZ25lZCBpbnQgaSwgbnVtX29mX3JhdGU7Ci0JdW5zaWduZWQgaW50IG1hc2sgPSAwOwotCi0JbnVtX29mX3JhdGUgPSAocHRuX3N6ID4gTnVtUmF0ZXMpID8gTnVtUmF0ZXMgOiBwdG5fc3o7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX29mX3JhdGU7IGkrKykKLQkJbWFzayB8PSAweDEgPDwgd2lmaXJhdGUyX3JhdGV0YmxfaW54MjNhKCoocHRuICsgaSkpOwotCXJldHVybiBtYXNrOwotfQotCi11bnNpZ25lZCBpbnQgdXBkYXRlX01TQ19yYXRlMjNhKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpwSFRfY2FwcykKLXsKLQl1bnNpZ25lZCBpbnQgbWFzazsKLQotCW1hc2sgPSBwSFRfY2Fwcy0+bWNzLnJ4X21hc2tbMF0gPDwgMTIgfAotCQlwSFRfY2Fwcy0+bWNzLnJ4X21hc2tbMV0gPDwgMjA7Ci0KLQlyZXR1cm4gbWFzazsKLX0KLQotaW50IHN1cHBvcnRfc2hvcnRfR0kyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpwSFRfY2FwcykKLXsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXVuc2lnbmVkIGNoYXIgYml0X29mZnNldDsKLQotCWlmICghcG1sbWVpbmZvLT5IVF9lbmFibGUpCi0JCXJldHVybiBfRkFJTDsKLQlpZiAocG1sbWVpbmZvLT5hc3NvY19BUF92ZW5kb3IgPT0gSFRfSU9UX1BFRVJfUkFMSU5LKQotCQlyZXR1cm4gX0ZBSUw7Ci0JYml0X29mZnNldCA9IChwbWxtZWV4dC0+Y3VyX2J3bW9kZSAmIEhUX0NIQU5ORUxfV0lEVEhfNDApPyA2OiA1OwotCi0JaWYgKHBIVF9jYXBzLT5jYXBfaW5mbyAmIGNwdV90b19sZTE2KDB4MSA8PCBiaXRfb2Zmc2V0KSkKLQkJcmV0dXJuIF9TVUNDRVNTOwotCWVsc2UKLQkJcmV0dXJuIF9GQUlMOwotfQotCi11bnNpZ25lZCBjaGFyIGdldF9oaWdoZXN0X3JhdGVfaWR4MjNhKHUzMiBtYXNrKQotewotCWludCBpOwotCXVuc2lnbmVkIGNoYXIgcmF0ZV9pZHggPSAwOwotCi0JZm9yIChpID0gMjc7IGkgPj0gMDsgaS0tKSB7Ci0JCWlmIChtYXNrICYgQklUKGkpKSB7Ci0JCQlyYXRlX2lkeCA9IGk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gcmF0ZV9pZHg7Ci19Ci0KLXZvaWQgVXBkYXRlX1JBX0VudHJ5MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSkKLXsKLQlydHdfaGFsX3VwZGF0ZV9yYV9tYXNrMjNhKHBzdGEsIDApOwotfQotCi1zdGF0aWMgdm9pZCBlbmFibGVfcmF0ZV9hZGFwdGl2ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0JVXBkYXRlX1JBX0VudHJ5MjNhKHBhZGFwdGVyLCBwc3RhKTsKLX0KLQotdm9pZCBzZXRfc3RhX3JhdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKQotewotCS8qIHJhdGUgYWRhcHRpdmUgKi8KLQllbmFibGVfcmF0ZV9hZGFwdGl2ZShwYWRhcHRlciwgcHN0YSk7Ci19Ci0KLS8qICBVcGRhdGUgUlJTUiBhbmQgUmF0ZSBmb3IgVVNFUkFURSAqLwotdm9pZCB1cGRhdGVfdHhfYmFzaWNfcmF0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB3aXJlbGVzc21vZGUpCi17Ci0JdW5zaWduZWQgY2hhciBzdXBwb3J0ZWRfcmF0ZXNbTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYXTsKLQotCW1lbXNldChzdXBwb3J0ZWRfcmF0ZXMsIDAsIE5ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWCk7Ci0KLQlpZiAod2lyZWxlc3Ntb2RlID09IFdJUkVMRVNTXzExQikgewotCQltZW1jcHkoc3VwcG9ydGVkX3JhdGVzLCBydHdfYmFzaWNfcmF0ZV9jY2ssIDQpOwotCX0gZWxzZSBpZiAod2lyZWxlc3Ntb2RlICYgV0lSRUxFU1NfMTFCKSB7Ci0JCW1lbWNweShzdXBwb3J0ZWRfcmF0ZXMsIHJ0d19iYXNpY19yYXRlX21peCwgNyk7Ci0JfSBlbHNlIHsKLQkJbWVtY3B5KHN1cHBvcnRlZF9yYXRlcywgcnR3X2Jhc2ljX3JhdGVfb2ZkbSwgMyk7Ci0JfQotCi0JaWYgKHdpcmVsZXNzbW9kZSAmIFdJUkVMRVNTXzExQikKLQkJdXBkYXRlX21nbnRfdHhfcmF0ZTIzYShwYWRhcHRlciwgSUVFRTgwMjExX0NDS19SQVRFXzFNQik7Ci0JZWxzZQotCQl1cGRhdGVfbWdudF90eF9yYXRlMjNhKHBhZGFwdGVyLCBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQik7Ci0KLQlIYWxTZXRCcmF0ZUNmZzIzYShwYWRhcHRlciwgc3VwcG9ydGVkX3JhdGVzKTsKLX0KLQotdW5zaWduZWQgY2hhciBjaGVja19hc3NvY19BUDIzYSh1OCAqcGZyYW1lLCB1aW50IGxlbikKLXsKLQlpbnQgaTsKLQl1OCBlcGlncmFtX3ZlbmRvcl9mbGFnOwotCXU4IHJhbGlua192ZW5kb3JfZmxhZzsKLQljb25zdCB1OCAqcDsKLQotCWVwaWdyYW1fdmVuZG9yX2ZsYWcgPSAwOwotCXJhbGlua192ZW5kb3JfZmxhZyA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOykgewotCQlwID0gcGZyYW1lICsgaTsKLQotCQlzd2l0Y2ggKHBbMF0pIHsKLQkJY2FzZSBXTEFOX0VJRF9WRU5ET1JfU1BFQ0lGSUM6Ci0JCQlpZiAoIW1lbWNtcChwICsgMiwgQVJUSEVST1NfT1VJMSwgMykgfHwKLQkJCSAgICAhbWVtY21wKHAgKyAyLCBBUlRIRVJPU19PVUkyLCAzKSkgewotCQkJCURCR184NzIzQSgibGluayB0byBBcnRoZXJvcyBBUFxuIik7Ci0JCQkJcmV0dXJuIEhUX0lPVF9QRUVSX0FUSEVST1M7Ci0JCQl9IGVsc2UgaWYgKCFtZW1jbXAocCArIDIsIEJST0FEQ09NX09VSTEsIDMpIHx8Ci0JCQkJICAgIW1lbWNtcChwICsgMiwgQlJPQURDT01fT1VJMiwgMykpIHsKLQkJCQlEQkdfODcyM0EoImxpbmsgdG8gQnJvYWRjb20gQVBcbiIpOwotCQkJCXJldHVybiBIVF9JT1RfUEVFUl9CUk9BRENPTTsKLQkJCX0gZWxzZSBpZiAoIW1lbWNtcChwICsgMiwgTUFSVkVMTF9PVUksIDMpKSB7Ci0JCQkJREJHXzg3MjNBKCJsaW5rIHRvIE1hcnZlbGwgQVBcbiIpOwotCQkJCXJldHVybiBIVF9JT1RfUEVFUl9NQVJWRUxMOwotCQkJfSBlbHNlIGlmICghbWVtY21wKHAgKyAyLCBSQUxJTktfT1VJLCAzKSkgewotCQkJCWlmICghcmFsaW5rX3ZlbmRvcl9mbGFnKQotCQkJCQlyYWxpbmtfdmVuZG9yX2ZsYWcgPSAxOwotCQkJCWVsc2UgewotCQkJCQlEQkdfODcyM0EoImxpbmsgdG8gUmFsaW5rIEFQXG4iKTsKLQkJCQkJcmV0dXJuIEhUX0lPVF9QRUVSX1JBTElOSzsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKCFtZW1jbXAocCArIDIsIENJU0NPX09VSSwgMykpIHsKLQkJCQlEQkdfODcyM0EoImxpbmsgdG8gQ2lzY28gQVBcbiIpOwotCQkJCXJldHVybiBIVF9JT1RfUEVFUl9DSVNDTzsKLQkJCX0gZWxzZSBpZiAoIW1lbWNtcChwICsgMiwgUkVBTFRFS19PVUksIDMpKSB7Ci0JCQkJREJHXzg3MjNBKCJsaW5rIHRvIFJlYWx0ZWsgOTZCXG4iKTsKLQkJCQlyZXR1cm4gSFRfSU9UX1BFRVJfUkVBTFRFSzsKLQkJCX0gZWxzZSBpZiAoIW1lbWNtcChwICsgMiwgQUlSR09DQVBfT1VJLCAzKSkgewotCQkJCURCR184NzIzQSgibGluayB0byBBaXJnbyBDYXBcbiIpOwotCQkJCXJldHVybiBIVF9JT1RfUEVFUl9BSVJHTzsKLQkJCX0gZWxzZSBpZiAoIW1lbWNtcChwICsgMiwgRVBJR1JBTV9PVUksIDMpKSB7Ci0JCQkJZXBpZ3JhbV92ZW5kb3JfZmxhZyA9IDE7Ci0JCQkJaWYgKHJhbGlua192ZW5kb3JfZmxhZykgewotCQkJCQlEQkdfODcyM0EoImxpbmsgdG8gVGVuZGEgVzMxMVIgQVBcbiIpOwotCQkJCQlyZXR1cm4gSFRfSU9UX1BFRVJfVEVOREE7Ci0JCQkJfSBlbHNlCi0JCQkJCURCR184NzIzQSgiQ2FwdHVyZSBFUElHUkFNX09VSVxuIik7Ci0JCQl9IGVsc2UKLQkJCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaSArPSAocFsxXSArIDIpOwotCX0KLQotCWlmIChyYWxpbmtfdmVuZG9yX2ZsYWcgJiYgIWVwaWdyYW1fdmVuZG9yX2ZsYWcpIHsKLQkJREJHXzg3MjNBKCJsaW5rIHRvIFJhbGluayBBUFxuIik7Ci0JCXJldHVybiBIVF9JT1RfUEVFUl9SQUxJTks7Ci0JfSBlbHNlIGlmIChyYWxpbmtfdmVuZG9yX2ZsYWcgJiYgZXBpZ3JhbV92ZW5kb3JfZmxhZykgewotCQlEQkdfODcyM0EoImxpbmsgdG8gVGVuZGEgVzMxMVIgQVBcbiIpOwotCQlyZXR1cm4gSFRfSU9UX1BFRVJfVEVOREE7Ci0JfSBlbHNlIHsKLQkJREJHXzg3MjNBKCJsaW5rIHRvIG5ldyBBUFxuIik7Ci0JCXJldHVybiBIVF9JT1RfUEVFUl9VTktOT1dOOwotCX0KLX0KLQotdm9pZCB1cGRhdGVfSU9UX2luZm8yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0Jc3dpdGNoIChwbWxtZWluZm8tPmFzc29jX0FQX3ZlbmRvcikgewotCWNhc2UgSFRfSU9UX1BFRVJfTUFSVkVMTDoKLQkJcG1sbWVpbmZvLT50dXJib01vZGVfY3RzMnNlbGYgPSAxOwotCQlwbWxtZWluZm8tPnR1cmJvTW9kZV9ydHNlbiA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgSFRfSU9UX1BFRVJfUkFMSU5LOgotCQlwbWxtZWluZm8tPnR1cmJvTW9kZV9jdHMyc2VsZiA9IDA7Ci0JCXBtbG1laW5mby0+dHVyYm9Nb2RlX3J0c2VuID0gMTsKLQkJLyogZGlzYWJsZSBoaWdoIHBvd2VyICovCi0JCXJ0bDg3MjNhX29kbV9zdXBwb3J0X2FiaWxpdHlfY2xyKHBhZGFwdGVyLCAodTMyKQotCQkJCQkJIH5EWU5BTUlDX0JCX0RZTkFNSUNfVFhQV1IpOwotCQlicmVhazsKLQljYXNlIEhUX0lPVF9QRUVSX1JFQUxURUs6Ci0JCS8qIHJ0d193cml0ZTE2KHBhZGFwdGVyLCAweDRjYywgMHhmZmZmKTsgKi8KLQkJLyogcnR3X3dyaXRlMTYocGFkYXB0ZXIsIDB4NTQ2LCAweDAxYzApOyAqLwotCQkvKiBkaXNhYmxlIGhpZ2ggcG93ZXIgKi8KLQkJcnRsODcyM2Ffb2RtX3N1cHBvcnRfYWJpbGl0eV9jbHIocGFkYXB0ZXIsICh1MzIpCi0JCQkJCQkgfkRZTkFNSUNfQkJfRFlOQU1JQ19UWFBXUik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXBtbG1laW5mby0+dHVyYm9Nb2RlX2N0czJzZWxmID0gMDsKLQkJcG1sbWVpbmZvLT50dXJib01vZGVfcnRzZW4gPSAxOwotCQlicmVhazsKLQl9Ci19Ci0KLXZvaWQgdXBkYXRlX2NhcGluZm8yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1MTYgdXBkYXRlQ2FwKQotewotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZBZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCWlmICh1cGRhdGVDYXAgJiBjU2hvcnRQcmVhbWJsZSkgewotCQkvKiAgU2hvcnQgUHJlYW1ibGUgKi8KLQkJaWYgKHBtbG1laW5mby0+cHJlYW1ibGVfbW9kZSAhPSBQUkVBTUJMRV9TSE9SVCkgewotCQkJLyogIFBSRUFNQkxFX0xPTkcgb3IgUFJFQU1CTEVfQVVUTyAqLwotCQkJcG1sbWVpbmZvLT5wcmVhbWJsZV9tb2RlID0gUFJFQU1CTEVfU0hPUlQ7Ci0JCQlydGw4NzIzYV9hY2tfcHJlYW1ibGUoQWRhcHRlciwgdHJ1ZSk7Ci0JCX0KLQl9IGVsc2UgeyAvKiAgTG9uZyBQcmVhbWJsZSAqLwotCQlpZiAocG1sbWVpbmZvLT5wcmVhbWJsZV9tb2RlICE9IFBSRUFNQkxFX0xPTkcpIHsKLQkJCS8qICBQUkVBTUJMRV9TSE9SVCBvciBQUkVBTUJMRV9BVVRPICovCi0JCQlwbWxtZWluZm8tPnByZWFtYmxlX21vZGUgPSBQUkVBTUJMRV9MT05HOwotCQkJcnRsODcyM2FfYWNrX3ByZWFtYmxlKEFkYXB0ZXIsIGZhbHNlKTsKLQkJfQotCX0KLQlpZiAodXBkYXRlQ2FwICYgY0lCU1MpIHsKLQkJLyogRmlsZW46IFNlZSA4MDIuMTEtMjAwNyBwLjkxICovCi0JCXBtbG1laW5mby0+c2xvdFRpbWUgPSBOT05fU0hPUlRfU0xPVF9USU1FOwotCX0gZWxzZSB7Ci0JCS8qIEZpbGVuOiBTZWUgODAyLjExLTIwMDcgcC45MCAqLwotCQlpZiAocG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlICYKLQkJICAgIChXSVJFTEVTU18xMUcgfCBXSVJFTEVTU18xMV8yNE4pKSB7Ci0JCQlpZiAodXBkYXRlQ2FwICYgY1Nob3J0U2xvdFRpbWUpIHsgLyogIFNob3J0IFNsb3QgVGltZSAqLwotCQkJCWlmIChwbWxtZWluZm8tPnNsb3RUaW1lICE9IFNIT1JUX1NMT1RfVElNRSkKLQkJCQkJcG1sbWVpbmZvLT5zbG90VGltZSA9IFNIT1JUX1NMT1RfVElNRTsKLQkJCX0gZWxzZSB7IC8qICBMb25nIFNsb3QgVGltZSAqLwotCQkJCWlmIChwbWxtZWluZm8tPnNsb3RUaW1lICE9IE5PTl9TSE9SVF9TTE9UX1RJTUUpCi0JCQkJCXBtbG1laW5mby0+c2xvdFRpbWUgPQotCQkJCQkJTk9OX1NIT1JUX1NMT1RfVElNRTsKLQkJCX0KLQkJfSBlbHNlIGlmIChwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgJgotCQkJICAgKFdJUkVMRVNTXzExQSB8IFdJUkVMRVNTXzExXzVOKSkgewotCQkJcG1sbWVpbmZvLT5zbG90VGltZSA9IFNIT1JUX1NMT1RfVElNRTsKLQkJfSBlbHNlIHsKLQkJCS8qIEIgTW9kZSAqLwotCQkJcG1sbWVpbmZvLT5zbG90VGltZSA9IE5PTl9TSE9SVF9TTE9UX1RJTUU7Ci0JCX0KLQl9Ci0JcnRsODcyM2Ffc2V0X3Nsb3RfdGltZShBZGFwdGVyLCBwbWxtZWluZm8tPnNsb3RUaW1lKTsKLX0KLQotdm9pZCB1cGRhdGVfd2lyZWxlc3NfbW9kZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCWludCByYXRlbGVuLCBuZXR3b3JrX3R5cGUgPSAwOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKmN1cl9uZXR3b3JrID0gJnBtbG1laW5mby0+bmV0d29yazsKLQl1bnNpZ25lZCBjaGFyICpyYXRlID0gY3VyX25ldHdvcmstPlN1cHBvcnRlZFJhdGVzOwotCi0JcmF0ZWxlbiA9IHJ0d19nZXRfcmF0ZXNldF9sZW4yM2EoY3VyX25ldHdvcmstPlN1cHBvcnRlZFJhdGVzKTsKLQotCWlmICgocG1sbWVpbmZvLT5IVF9pbmZvX2VuYWJsZSkgJiYgKHBtbG1laW5mby0+SFRfY2Fwc19lbmFibGUpKQotCQlwbWxtZWluZm8tPkhUX2VuYWJsZSA9IDE7Ci0KLQlpZiAocG1sbWVleHQtPmN1cl9jaGFubmVsID4gMTQpIHsKLQkJaWYgKHBtbG1laW5mby0+SFRfZW5hYmxlKQotCQkJbmV0d29ya190eXBlID0gV0lSRUxFU1NfMTFfNU47Ci0JCW5ldHdvcmtfdHlwZSB8PSBXSVJFTEVTU18xMUE7Ci0JfSBlbHNlIHsKLQkJaWYgKHBtbG1laW5mby0+SFRfZW5hYmxlKQotCQkJbmV0d29ya190eXBlID0gV0lSRUxFU1NfMTFfMjROOwotCi0JCWlmIChjY2tyYXRlc29ubHlfaW5jbHVkZWQyM2EocmF0ZSwgcmF0ZWxlbikgPT0gdHJ1ZSkKLQkJCW5ldHdvcmtfdHlwZSB8PSBXSVJFTEVTU18xMUI7Ci0JCWVsc2UgaWYgKGNja3JhdGVzX2luY2x1ZGVkMjNhKHJhdGUsIHJhdGVsZW4pID09IHRydWUpCi0JCQluZXR3b3JrX3R5cGUgfD0gV0lSRUxFU1NfMTFCRzsKLQkJZWxzZQotCQkJbmV0d29ya190eXBlIHw9IFdJUkVMRVNTXzExRzsKLQl9Ci0KLQlwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgPQotCQluZXR3b3JrX3R5cGUgJiBwYWRhcHRlci0+cmVnaXN0cnlwcml2LndpcmVsZXNzX21vZGU7Ci0KLQkvKiAweDA4MDggLT4gZm9yIENDSywgMHgwYTBhIC0+IGZvciBPRkRNICovCi0JLyogY2hhbmdlIHRoaXMgdmFsdWUgaWYgaGF2aW5nIElPVCBpc3N1ZXMuICovCi0JcnRsODcyM2Ffc2V0X3Jlc3Bfc2lmcyhwYWRhcHRlciwgMHgwOCwgMHgwOCwgMHgwYSwgMHgwYSk7Ci0KLQlpZiAocG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlICYgV0lSRUxFU1NfMTFCKQotCQl1cGRhdGVfbWdudF90eF9yYXRlMjNhKHBhZGFwdGVyLCBJRUVFODAyMTFfQ0NLX1JBVEVfMU1CKTsKLQkgZWxzZQotCQl1cGRhdGVfbWdudF90eF9yYXRlMjNhKHBhZGFwdGVyLCBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQik7Ci19Ci0KLXZvaWQgdXBkYXRlX2JtY19zdGFfc3VwcG9ydF9yYXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiBtYWNfaWQpCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCWlmIChwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgJiBXSVJFTEVTU18xMUIpIHsKLQkJLyogIE9ubHkgQiwgQi9HLCBhbmQgQi9HL04gQVAgY291bGQgdXNlIENDSyByYXRlICovCi0JCW1lbWNweSgocG1sbWVpbmZvLT5GV19zdGFfaW5mb1ttYWNfaWRdLlN1cHBvcnRlZFJhdGVzKSwKLQkJICAgICAgIHJ0d19iYXNpY19yYXRlX2NjaywgNCk7Ci0JfSBlbHNlIHsKLQkJbWVtY3B5KHBtbG1laW5mby0+Rldfc3RhX2luZm9bbWFjX2lkXS5TdXBwb3J0ZWRSYXRlcywKLQkJICAgICAgIHJ0d19iYXNpY19yYXRlX29mZG0sIDMpOwotCX0KLX0KLQotaW50IHVwZGF0ZV9zdGFfc3VwcG9ydF9yYXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpwdmFyX2llLAotCQkJICAgICAgIHVpbnQgdmFyX2llX2xlbiwgaW50IGNhbV9pZHgpCi17Ci0JaW50IHN1cHBvcnRSYXRlTnVtID0gMDsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCWNvbnN0IHU4ICpwOwotCi0JcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfU1VQUF9SQVRFUywgcHZhcl9pZSwgdmFyX2llX2xlbik7Ci0JaWYgKCFwKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQltZW1jcHkocG1sbWVpbmZvLT5GV19zdGFfaW5mb1tjYW1faWR4XS5TdXBwb3J0ZWRSYXRlcywgcCArIDIsIHBbMV0pOwotCXN1cHBvcnRSYXRlTnVtID0gcFsxXTsKLQotCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0VYVF9TVVBQX1JBVEVTLCBwdmFyX2llLCB2YXJfaWVfbGVuKTsKLQlpZiAocCkKLQkJbWVtY3B5KHBtbG1laW5mby0+Rldfc3RhX2luZm9bY2FtX2lkeF0uU3VwcG9ydGVkUmF0ZXMgKwotCQkgICAgICAgc3VwcG9ydFJhdGVOdW0sIHAgKyAyLCBwWzFdKTsKLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXZvaWQgcHJvY2Vzc19hZGRiYV9yZXEyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgdTggKnBhZGRiYV9yZXEsIHU4ICphZGRyKQotewotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQl1MTYgdGlkLCBzdGFydF9zZXEsIHBhcmFtOwotCXN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybDsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBBRERCQV9yZXF1ZXN0ICpwcmVxID0gKHN0cnVjdCBBRERCQV9yZXF1ZXN0ICopcGFkZGJhX3JlcTsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgYWRkcik7Ci0KLQlpZiAocHN0YSkgewotCQlzdGFydF9zZXEgPSBsZTE2X3RvX2NwdShwcmVxLT5CQV9zdGFydGluZ19zZXFjdHJsKSA+PiA0OwotCi0JCXBhcmFtID0gbGUxNl90b19jcHUocHJlcS0+QkFfcGFyYV9zZXQpOwotCQl0aWQgPSAocGFyYW0gPj4gMikgJiAweDBmOwotCi0JCXByZW9yZGVyX2N0cmwgPSAmcHN0YS0+cmVjdnJlb3JkZXJfY3RybFt0aWRdOwotCi0JCXByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSA9IDB4ZmZmZjsKLQotCQlwcmVvcmRlcl9jdHJsLT5lbmFibGUgPSAocG1sbWVpbmZvLT5iQWNjZXB0QWRkYmFSZXEgPT0gdHJ1ZSkgPwotCQkJdHJ1ZSA6IGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfeG1pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d194bWl0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZTQwY2YuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d194bWl0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfUlRXX1hNSVRfQ18KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLSNpbmNsdWRlIDx3aWZpLmg+Ci0jaW5jbHVkZSA8b3NkZXBfaW50Zi5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8dXNiX29wcy5oPgotI2luY2x1ZGUgPHJ0bDg3MjNhX3htaXQuaD4KLQotc3RhdGljIHZvaWQgX2luaXRfdHhzZXJ2cShzdHJ1Y3QgdHhfc2VydnEgKnB0eHNlcnZxKQotewotCi0JSU5JVF9MSVNUX0hFQUQoJnB0eHNlcnZxLT50eF9wZW5kaW5nKTsKLQlfcnR3X2luaXRfcXVldWUyM2EoJnB0eHNlcnZxLT5zdGFfcGVuZGluZyk7Ci0JcHR4c2VydnEtPnFjbnQgPSAwOwotCi19Ci0KLXZvaWQJX3J0d19pbml0X3N0YV94bWl0X3ByaXYyM2Eoc3RydWN0IHN0YV94bWl0X3ByaXYgKnBzdGFfeG1pdHByaXYpCi17Ci0KLQlzcGluX2xvY2tfaW5pdCgmcHN0YV94bWl0cHJpdi0+bG9jayk7Ci0KLQkvKiBmb3IgKGkgPSAwIDsgaSA8IE1BWF9OVU1CTEtTOyBpKyspICovCi0JLyoJX2luaXRfdHhzZXJ2cSgmcHN0YV94bWl0cHJpdi0+YmxrX3FbaV0pOyAqLwotCi0JX2luaXRfdHhzZXJ2cSgmcHN0YV94bWl0cHJpdi0+YmVfcSk7Ci0JX2luaXRfdHhzZXJ2cSgmcHN0YV94bWl0cHJpdi0+YmtfcSk7Ci0JX2luaXRfdHhzZXJ2cSgmcHN0YV94bWl0cHJpdi0+dmlfcSk7Ci0JX2luaXRfdHhzZXJ2cSgmcHN0YV94bWl0cHJpdi0+dm9fcSk7Ci0JSU5JVF9MSVNUX0hFQUQoJnBzdGFfeG1pdHByaXYtPmxlZ2FjeV9keik7Ci0JSU5JVF9MSVNUX0hFQUQoJnBzdGFfeG1pdHByaXYtPmFwc2QpOwotCi19Ci0KLWludCBfcnR3X2luaXRfeG1pdF9wcml2MjNhKHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiwKLQkJCSAgIHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1ZjsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhmcmFtZTsKLQlpbnQgcmVzID0gX1NVQ0NFU1M7Ci0JdTMyIG1heF94bWl0X2V4dGJ1Zl9zaXplID0gTUFYX1hNSVRfRVhUQlVGX1NaOwotCXUzMiBudW1feG1pdF9leHRidWYgPSBOUl9YTUlUX0VYVEJVRkY7Ci0KLQlzcGluX2xvY2tfaW5pdCgmcHhtaXRwcml2LT5sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmcHhtaXRwcml2LT5sb2NrX3NjdHgpOwotCXNlbWFfaW5pdCgmcHhtaXRwcml2LT54bWl0X3NlbWEsIDApOwotCXNlbWFfaW5pdCgmcHhtaXRwcml2LT50ZXJtaW5hdGVfeG1pdHRocmVhZF9zZW1hLCAwKTsKLQotCXB4bWl0cHJpdi0+YWRhcHRlciA9IHBhZGFwdGVyOwotCi0JX3J0d19pbml0X3F1ZXVlMjNhKCZweG1pdHByaXYtPmJlX3BlbmRpbmcpOwotCV9ydHdfaW5pdF9xdWV1ZTIzYSgmcHhtaXRwcml2LT5ia19wZW5kaW5nKTsKLQlfcnR3X2luaXRfcXVldWUyM2EoJnB4bWl0cHJpdi0+dmlfcGVuZGluZyk7Ci0JX3J0d19pbml0X3F1ZXVlMjNhKCZweG1pdHByaXYtPnZvX3BlbmRpbmcpOwotCV9ydHdfaW5pdF9xdWV1ZTIzYSgmcHhtaXRwcml2LT5ibV9wZW5kaW5nKTsKLQotCV9ydHdfaW5pdF9xdWV1ZTIzYSgmcHhtaXRwcml2LT5mcmVlX3htaXRfcXVldWUpOwotCi0JZm9yIChpID0gMDsgaSA8IE5SX1hNSVRGUkFNRTsgaSsrKSB7Ci0JCXB4ZnJhbWUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgeG1pdF9mcmFtZSksIEdGUF9LRVJORUwpOwotCQlpZiAoIXB4ZnJhbWUpCi0JCQlicmVhazsKLQkJSU5JVF9MSVNUX0hFQUQoJnB4ZnJhbWUtPmxpc3QpOwotCi0JCXB4ZnJhbWUtPnBhZGFwdGVyID0gcGFkYXB0ZXI7Ci0JCXB4ZnJhbWUtPmZyYW1lX3RhZyA9IE5VTExfRlJBTUVUQUc7Ci0KLQkJbGlzdF9hZGRfdGFpbCgmcHhmcmFtZS0+bGlzdCwKLQkJCSAgICAgICZweG1pdHByaXYtPmZyZWVfeG1pdF9xdWV1ZS5xdWV1ZSk7Ci0JfQotCi0JcHhtaXRwcml2LT5mcmVlX3htaXRmcmFtZV9jbnQgPSBpOwotCi0JcHhtaXRwcml2LT5mcmFnX2xlbiA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKLQotCS8qIGluaXQgeG1pdF9idWYgKi8KLQlfcnR3X2luaXRfcXVldWUyM2EoJnB4bWl0cHJpdi0+ZnJlZV94bWl0YnVmX3F1ZXVlKTsKLQlJTklUX0xJU1RfSEVBRCgmcHhtaXRwcml2LT54bWl0YnVmX2xpc3QpOwotCV9ydHdfaW5pdF9xdWV1ZTIzYSgmcHhtaXRwcml2LT5wZW5kaW5nX3htaXRidWZfcXVldWUpOwotCi0JZm9yIChpID0gMDsgaSA8IE5SX1hNSVRCVUZGOyBpKyspIHsKLQkJcHhtaXRidWYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgeG1pdF9idWYpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFweG1pdGJ1ZikKLQkJCWdvdG8gZmFpbDsKLQkJSU5JVF9MSVNUX0hFQUQoJnB4bWl0YnVmLT5saXN0KTsKLQkJSU5JVF9MSVNUX0hFQUQoJnB4bWl0YnVmLT5saXN0Mik7Ci0KLQkJcHhtaXRidWYtPnBhZGFwdGVyID0gcGFkYXB0ZXI7Ci0KLQkJLyogVHggYnVmIGFsbG9jYXRpb24gbWF5IGZhaWwgc29tZXRpbWVzLCBzbyBzbGVlcCBhbmQgcmV0cnkuICovCi0JCXJlcyA9IHJ0d19vc194bWl0X3Jlc291cmNlX2FsbG9jMjNhKHBhZGFwdGVyLCBweG1pdGJ1ZiwKLQkJCQkJCSAoTUFYX1hNSVRCVUZfU1ogKyBYTUlUQlVGX0FMSUdOX1NaKSk7Ci0JCWlmIChyZXMgPT0gX0ZBSUwpIHsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCi0JCWxpc3RfYWRkX3RhaWwoJnB4bWl0YnVmLT5saXN0LAotCQkJICAgICAgJnB4bWl0cHJpdi0+ZnJlZV94bWl0YnVmX3F1ZXVlLnF1ZXVlKTsKLQkJbGlzdF9hZGRfdGFpbCgmcHhtaXRidWYtPmxpc3QyLAotCQkJICAgICAgJnB4bWl0cHJpdi0+eG1pdGJ1Zl9saXN0KTsKLQl9Ci0KLQlweG1pdHByaXYtPmZyZWVfeG1pdGJ1Zl9jbnQgPSBOUl9YTUlUQlVGRjsKLQotCS8qIGluaXQgeGZyYW1lX2V4dCBxdWV1ZSwgIHRoZSBzYW1lIGNvdW50IGFzIGV4dGJ1ZiAgKi8KLQlfcnR3X2luaXRfcXVldWUyM2EoJnB4bWl0cHJpdi0+ZnJlZV94ZnJhbWVfZXh0X3F1ZXVlKTsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1feG1pdF9leHRidWY7IGkrKykgewotCQlweGZyYW1lID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHhtaXRfZnJhbWUpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFweGZyYW1lKQotCQkJYnJlYWs7Ci0JCUlOSVRfTElTVF9IRUFEKCZweGZyYW1lLT5saXN0KTsKLQotCQlweGZyYW1lLT5wYWRhcHRlciA9IHBhZGFwdGVyOwotCQlweGZyYW1lLT5mcmFtZV90YWcgPSBOVUxMX0ZSQU1FVEFHOwotCi0JCXB4ZnJhbWUtPnBrdCA9IE5VTEw7Ci0KLQkJcHhmcmFtZS0+YnVmX2FkZHIgPSBOVUxMOwotCQlweGZyYW1lLT5weG1pdGJ1ZiA9IE5VTEw7Ci0KLQkJcHhmcmFtZS0+ZXh0X3RhZyA9IDE7Ci0KLQkJbGlzdF9hZGRfdGFpbCgmcHhmcmFtZS0+bGlzdCwKLQkJCSAgICAgICZweG1pdHByaXYtPmZyZWVfeGZyYW1lX2V4dF9xdWV1ZS5xdWV1ZSk7Ci0JfQotCXB4bWl0cHJpdi0+ZnJlZV94ZnJhbWVfZXh0X2NudCA9IGk7Ci0KLQkvKiAgSW5pdCB4bWl0IGV4dGVuc2lvbiBidWZmICovCi0JX3J0d19pbml0X3F1ZXVlMjNhKCZweG1pdHByaXYtPmZyZWVfeG1pdF9leHRidWZfcXVldWUpOwotCUlOSVRfTElTVF9IRUFEKCZweG1pdHByaXYtPnhtaXRleHRidWZfbGlzdCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX3htaXRfZXh0YnVmOyBpKyspIHsKLQkJcHhtaXRidWYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgeG1pdF9idWYpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFweG1pdGJ1ZikKLQkJCWdvdG8gZmFpbDsKLQkJSU5JVF9MSVNUX0hFQUQoJnB4bWl0YnVmLT5saXN0KTsKLQkJSU5JVF9MSVNUX0hFQUQoJnB4bWl0YnVmLT5saXN0Mik7Ci0KLQkJcHhtaXRidWYtPnBhZGFwdGVyID0gcGFkYXB0ZXI7Ci0KLQkJLyogVHggYnVmIGFsbG9jYXRpb24gbWF5IGZhaWwgc29tZXRpbWVzLCBzbyBzbGVlcCBhbmQgcmV0cnkuICovCi0JCXJlcyA9IHJ0d19vc194bWl0X3Jlc291cmNlX2FsbG9jMjNhKHBhZGFwdGVyLCBweG1pdGJ1ZiwKLQkJCQkJCSBtYXhfeG1pdF9leHRidWZfc2l6ZSArIFhNSVRCVUZfQUxJR05fU1opOwotCQlpZiAocmVzID09IF9GQUlMKSB7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCQlsaXN0X2FkZF90YWlsKCZweG1pdGJ1Zi0+bGlzdCwKLQkJCSAgICAgICZweG1pdHByaXYtPmZyZWVfeG1pdF9leHRidWZfcXVldWUucXVldWUpOwotCQlsaXN0X2FkZF90YWlsKCZweG1pdGJ1Zi0+bGlzdDIsCi0JCQkgICAgICAmcHhtaXRwcml2LT54bWl0ZXh0YnVmX2xpc3QpOwotCX0KLQotCXB4bWl0cHJpdi0+ZnJlZV94bWl0X2V4dGJ1Zl9jbnQgPSBudW1feG1pdF9leHRidWY7Ci0KLQlydHdfYWxsb2NfaHd4bWl0czIzYShwYWRhcHRlcik7Ci0JcnR3X2luaXRfaHd4bWl0czIzYShweG1pdHByaXYtPmh3eG1pdHMsIHB4bWl0cHJpdi0+aHd4bWl0X2VudHJ5KTsKLQotCWZvciAoaSA9IDA7IGkgPCA0OyBpICsrKQotCQlweG1pdHByaXYtPndtbV9wYXJhX3NlcVtpXSA9IGk7Ci0KLQlzZW1hX2luaXQoJnB4bWl0cHJpdi0+dHhfcmV0ZXZ0LCAwKTsKLQotCXB4bWl0cHJpdi0+YWNrX3R4ID0gZmFsc2U7Ci0JbXV0ZXhfaW5pdCgmcHhtaXRwcml2LT5hY2tfdHhfbXV0ZXgpOwotCXJ0d19zY3R4X2luaXQyM2EoJnB4bWl0cHJpdi0+YWNrX3R4X29wcywgMCk7Ci0JdGFza2xldF9pbml0KCZwYWRhcHRlci0+eG1pdHByaXYueG1pdF90YXNrbGV0LAotCQkgICAgICh2b2lkKCopKHVuc2lnbmVkIGxvbmcpKXJ0bDg3MjNhdV94bWl0X3Rhc2tsZXQsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpcGFkYXB0ZXIpOwotCi1leGl0OgotCi0JcmV0dXJuIHJlczsKLWZhaWw6Ci0JZ290byBleGl0OwotfQotCi12b2lkIF9ydHdfZnJlZV94bWl0X3ByaXYyM2Eoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2KQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBweG1pdHByaXYtPmFkYXB0ZXI7Ci0Jc3RydWN0IHhtaXRfZnJhbWUgKnB4ZnJhbWUsICpwdG1wOwotCXN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYsICpwdG1wMjsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShweGZyYW1lLCBwdG1wLAotCQkJCSAmcHhtaXRwcml2LT5mcmVlX3htaXRfcXVldWUucXVldWUsIGxpc3QpIHsKLQkJbGlzdF9kZWxfaW5pdCgmcHhmcmFtZS0+bGlzdCk7Ci0JCXJ0d19vc194bWl0X2NvbXBsZXRlMjNhKHBhZGFwdGVyLCBweGZyYW1lKTsKLQkJa2ZyZWUocHhmcmFtZSk7Ci0JfQotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB4bWl0YnVmLCBwdG1wMiwKLQkJCQkgJnB4bWl0cHJpdi0+eG1pdGJ1Zl9saXN0LCBsaXN0MikgewotCQlsaXN0X2RlbF9pbml0KCZweG1pdGJ1Zi0+bGlzdDIpOwotCQlydHdfb3NfeG1pdF9yZXNvdXJjZV9mcmVlMjNhKHBhZGFwdGVyLCBweG1pdGJ1Zik7Ci0JCWtmcmVlKHB4bWl0YnVmKTsKLQl9Ci0KLQkvKiBmcmVlIHhmcmFtZV9leHQgcXVldWUsICB0aGUgc2FtZSBjb3VudCBhcyBleHRidWYgICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB4ZnJhbWUsIHB0bXAsCi0JCQkJICZweG1pdHByaXYtPmZyZWVfeGZyYW1lX2V4dF9xdWV1ZS5xdWV1ZSwKLQkJCQkgbGlzdCkgewotCQlsaXN0X2RlbF9pbml0KCZweGZyYW1lLT5saXN0KTsKLQkJcnR3X29zX3htaXRfY29tcGxldGUyM2EocGFkYXB0ZXIsIHB4ZnJhbWUpOwotCQlrZnJlZShweGZyYW1lKTsKLQl9Ci0KLQkvKiAgZnJlZSB4bWl0IGV4dGVuc2lvbiBidWZmICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB4bWl0YnVmLCBwdG1wMiwKLQkJCQkgJnB4bWl0cHJpdi0+eG1pdGV4dGJ1Zl9saXN0LCBsaXN0MikgewotCQlsaXN0X2RlbF9pbml0KCZweG1pdGJ1Zi0+bGlzdDIpOwotCQlydHdfb3NfeG1pdF9yZXNvdXJjZV9mcmVlMjNhKHBhZGFwdGVyLCBweG1pdGJ1Zik7Ci0JCWtmcmVlKHB4bWl0YnVmKTsKLQl9Ci0KLQlydHdfZnJlZV9od3htaXRzMjNhKHBhZGFwdGVyKTsKLQltdXRleF9kZXN0cm95KCZweG1pdHByaXYtPmFja190eF9tdXRleCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9hdHRyaWJfdmNzX2luZm8oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCi17Ci0JdTMyCXN6OwotCXN0cnVjdCBwa3RfYXR0cmliCSpwYXR0cmliID0gJnB4bWl0ZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3Qgc3RhX2luZm8JKnBzdGEgPSBwYXR0cmliLT5wc3RhOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlpZiAocGF0dHJpYi0+cHN0YSkgewotCQlwc3RhID0gcGF0dHJpYi0+cHN0YTsKLQl9IGVsc2UgewotCQlEQkdfODcyM0EoIiVzLCBjYWxsIHJ0d19nZXRfc3RhaW5mbzIzYSgpXG4iLCBfX2Z1bmNfXyk7Ci0JCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EoJnBhZGFwdGVyLT5zdGFwcml2LCAmcGF0dHJpYi0+cmFbMF0pOwotCX0KLQotCWlmIChwc3RhID09IE5VTEwpIHsKLQkJREJHXzg3MjNBKCIlcywgcHN0YSA9PSBOVUxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghKHBzdGEtPnN0YXRlICZfRldfTElOS0VEKSkgewotCQlEQkdfODcyM0EoIiVzLCBwc3RhLT5zdGF0ZSgweCV4KSAhPSBfRldfTElOS0VEXG4iLCBfX2Z1bmNfXywgcHN0YS0+c3RhdGUpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHBhdHRyaWItPm5yX2ZyYWdzICE9IDEpCi0JCXN6ID0gcGFkYXB0ZXItPnhtaXRwcml2LmZyYWdfbGVuOwotCWVsc2UgLyogbm8gZnJhZyAqLwotCQlzeiA9IHBhdHRyaWItPmxhc3RfdHhjbWRzejsKLQotCS8qICAoMSkgUlRTX1RocmVzaG9sZCBpcyBjb21wYXJlZCB0byB0aGUgTVBEVSwgbm90IE1TRFUuICovCi0JLyogICgyKSBJZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBmcmFnIGluICB0aGlzIE1TRFUsIG9ubHkgdGhlIGZpcnN0IGZyYWcgdXNlcyBwcm90ZWN0aW9uIGZyYW1lLiAqLwotCS8qCQlPdGhlciBmcmFnbWVudHMgYXJlIHByb3RlY3RlZCBieSBwcmV2aW91cyBmcmFnbWVudC4gKi8KLQkvKgkJU28gd2Ugb25seSBuZWVkIHRvIGNoZWNrIHRoZSBsZW5ndGggb2YgZmlyc3QgZnJhZ21lbnQuICovCi0JaWYgKHBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSA8IFdJUkVMRVNTXzExXzI0TiAgfHwgcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi53aWZpX3NwZWMpIHsKLQkJaWYgKHN6ID4gcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5ydHNfdGhyZXNoKSB7Ci0JCQlwYXR0cmliLT52Y3NfbW9kZSA9IFJUU19DVFM7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocHN0YS0+cnRzZW4pCi0JCQkJcGF0dHJpYi0+dmNzX21vZGUgPSBSVFNfQ1RTOwotCQkJZWxzZSBpZiAocHN0YS0+Y3RzMnNlbGYpCi0JCQkJcGF0dHJpYi0+dmNzX21vZGUgPSBDVFNfVE9fU0VMRjsKLQkJCWVsc2UKLQkJCQlwYXR0cmliLT52Y3NfbW9kZSA9IE5PTkVfVkNTOwotCQl9Ci0JfSBlbHNlIHsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCS8qIElPVCBhY3Rpb24gKi8KLQkJCWlmIChwbWxtZWluZm8tPmFzc29jX0FQX3ZlbmRvciA9PSBIVF9JT1RfUEVFUl9BVEhFUk9TICYmCi0JCQkgICAgcGF0dHJpYi0+YW1wZHVfZW4gJiYKLQkJCSAgICBwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG0gPT0KLQkJCSAgICBXTEFOX0NJUEhFUl9TVUlURV9DQ01QKSB7Ci0JCQkJcGF0dHJpYi0+dmNzX21vZGUgPSBDVFNfVE9fU0VMRjsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyogY2hlY2sgRVJQIHByb3RlY3Rpb24gKi8KLQkJCWlmIChwc3RhLT5ydHNlbiB8fCBwc3RhLT5jdHMyc2VsZikgewotCQkJCWlmIChwc3RhLT5ydHNlbikKLQkJCQkJcGF0dHJpYi0+dmNzX21vZGUgPSBSVFNfQ1RTOwotCQkJCWVsc2UgaWYgKHBzdGEtPmN0czJzZWxmKQotCQkJCQlwYXR0cmliLT52Y3NfbW9kZSA9IENUU19UT19TRUxGOwotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8qIGNoZWNrIEhUIG9wIG1vZGUgKi8KLQkJCWlmIChwYXR0cmliLT5odF9lbikgewotCQkJCXU4IEhUT3BNb2RlID0gcG1sbWVpbmZvLT5IVF9wcm90ZWN0aW9uOwotCi0JCQkJaWYgKChwbWxtZWV4dC0+Y3VyX2J3bW9kZSAmJiAoSFRPcE1vZGUgPT0gMiB8fCBIVE9wTW9kZSA9PSAzKSkgfHwKLQkJCQkgICAgKCFwbWxtZWV4dC0+Y3VyX2J3bW9kZSAmJiBIVE9wTW9kZSA9PSAzKSkgewotCQkJCQlwYXR0cmliLT52Y3NfbW9kZSA9IFJUU19DVFM7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJLyogY2hlY2sgcnRzICovCi0JCQlpZiAoc3ogPiBwYWRhcHRlci0+cmVnaXN0cnlwcml2LnJ0c190aHJlc2gpIHsKLQkJCQlwYXR0cmliLT52Y3NfbW9kZSA9IFJUU19DVFM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8qIHRvIGRvIGxpc3Q6IGNoZWNrIE1JTU8gcG93ZXIgc2F2ZSBjb25kaXRpb24uICovCi0KLQkJCS8qIGNoZWNrIEFNUERVIGFnZ3JlZ2F0aW9uIGZvciBUWE9QICovCi0JCQlpZiAocGF0dHJpYi0+YW1wZHVfZW4pIHsKLQkJCQlwYXR0cmliLT52Y3NfbW9kZSA9IFJUU19DVFM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCXBhdHRyaWItPnZjc19tb2RlID0gTk9ORV9WQ1M7Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlX2F0dHJpYl9waHlfaW5mbyhzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYiwgc3RydWN0IHN0YV9pbmZvICpwc3RhKQotewotCS8qaWYgKHBzdGEtPnJ0c2VuKQotCQlwYXR0cmliLT52Y3NfbW9kZSA9IFJUU19DVFM7Ci0JZWxzZSBpZiAocHN0YS0+Y3RzMnNlbGYpCi0JCXBhdHRyaWItPnZjc19tb2RlID0gQ1RTX1RPX1NFTEY7Ci0JZWxzZQotCQlwYXR0cmliLT52Y3NfbW9kZSA9IE5PTkVfVkNTOyovCi0KLQlwYXR0cmliLT5tZGF0YSA9IDA7Ci0JcGF0dHJpYi0+ZW9zcCA9IDA7Ci0JcGF0dHJpYi0+dHJpZ2dlcmVkID0gMDsKLQotCS8qIHFvc19lbiwgaHRfZW4sIGluaXQgcmF0ZSwgLCBidywgY2hfb2Zmc2V0LCBzZ2kgKi8KLQlwYXR0cmliLT5xb3NfZW4gPSBwc3RhLT5xb3Nfb3B0aW9uOwotCi0JcGF0dHJpYi0+cmFpZCA9IHBzdGEtPnJhaWQ7Ci0JcGF0dHJpYi0+aHRfZW4gPSBwc3RhLT5odHByaXYuaHRfb3B0aW9uOwotCXBhdHRyaWItPmJ3bW9kZSA9IHBzdGEtPmh0cHJpdi5id21vZGU7Ci0JcGF0dHJpYi0+Y2hfb2Zmc2V0ID0gcHN0YS0+aHRwcml2LmNoX29mZnNldDsKLQlwYXR0cmliLT5zZ2kgPSBwc3RhLT5odHByaXYuc2dpOwotCXBhdHRyaWItPmFtcGR1X2VuID0gZmFsc2U7Ci0KLQlwYXR0cmliLT5yZXRyeV9jdHJsID0gZmFsc2U7Ci19Ci0KLXU4IHFvc19hY20yM2EodTggYWNtX21hc2ssIHU4IHByaW9yaXR5KQotewotCXU4IGNoYW5nZV9wcmlvcml0eSA9IHByaW9yaXR5OwotCi0Jc3dpdGNoIChwcmlvcml0eSkgewotCWNhc2UgMDoKLQljYXNlIDM6Ci0JCWlmIChhY21fbWFzayAmIEJJVCgxKSkKLQkJCWNoYW5nZV9wcmlvcml0eSA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQljYXNlIDI6Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQljYXNlIDU6Ci0JCWlmIChhY21fbWFzayAmIEJJVCgyKSkKLQkJCWNoYW5nZV9wcmlvcml0eSA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgNjoKLQljYXNlIDc6Ci0JCWlmIChhY21fbWFzayAmIEJJVCgzKSkKLQkJCWNoYW5nZV9wcmlvcml0eSA9IDU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCURCR184NzIzQSgicW9zX2FjbTIzYSgpOiBpbnZhbGlkIHBhdHRyaWItPnByaW9yaXR5OiAlZCEhIVxuIiwKLQkJCSAgcHJpb3JpdHkpOwotCQljaGFuZ2VfcHJpb3JpdHkgPSAwOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gY2hhbmdlX3ByaW9yaXR5OwotfQotCi1zdGF0aWMgdm9pZCBzZXRfcW9zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliKQotewotCXU4ICpwZnJhbWUgPSBza2ItPmRhdGE7Ci0Jc3RydWN0IGlwaGRyICppcF9oZHI7Ci0JdTggVXNlclByaW9yaXR5ID0gMDsKLQotCS8qICBnZXQgVXNlclByaW9yaXR5IGZyb20gSVAgaGRyICovCi0JaWYgKHBhdHRyaWItPmV0aGVyX3R5cGUgPT0gRVRIX1BfSVApIHsKLQkJaXBfaGRyID0gKHN0cnVjdCBpcGhkciAqKShwZnJhbWUgKyBFVEhfSExFTik7Ci0JCVVzZXJQcmlvcml0eSA9IGlwX2hkci0+dG9zID4+IDU7Ci0JfSBlbHNlIGlmIChwYXR0cmliLT5ldGhlcl90eXBlID09IEVUSF9QX1BBRSkgewotCQkvKiAgIldoZW4gcHJpb3JpdHkgcHJvY2Vzc2luZyBvZiBkYXRhIGZyYW1lcyBpcyBzdXBwb3J0ZWQsICovCi0JCS8qICBhIFNUQSdzIFNNRSBzaG91bGQgc2VuZCBFQVBPTC1LZXkgZnJhbWVzIGF0IHRoZSBoaWdoZXN0Ci0JCSAgICBwcmlvcml0eS4iICovCi0JCVVzZXJQcmlvcml0eSA9IDc7Ci0JfQotCi0JcGF0dHJpYi0+cHJpb3JpdHkgPSBVc2VyUHJpb3JpdHk7Ci0JcGF0dHJpYi0+aGRybGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcW9zX2hkcik7Ci0JcGF0dHJpYi0+dHlwZSA9IElFRUU4MDIxMV9GVFlQRV9EQVRBIHwgSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBOwotfQotCi1zdGF0aWMgaW50IHVwZGF0ZV9hdHRyaWIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYikKLXsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBOVUxMOwotCWludCBibWNhc3Q7Ci0Jc3RydWN0IHN0YV9wcml2CSpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCXN0cnVjdCBldGhoZHIgKmVoZHIgPSAoc3RydWN0IGV0aGhkciAqKSBza2ItPmRhdGE7Ci0KLQlwYXR0cmliLT5ldGhlcl90eXBlID0gbnRvaHMoZWhkci0+aF9wcm90byk7Ci0KLQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+ZHN0LCBlaGRyLT5oX2Rlc3QpOwotCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT5zcmMsIGVoZHItPmhfc291cmNlKTsKLQotCXBhdHRyaWItPnBjdHJsID0gMDsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19TVEFURSkgfHwKLQkgICAgY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFKSkgewotCQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+cmEsIHBhdHRyaWItPmRzdCk7Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT50YSwgcGF0dHJpYi0+c3JjKTsKLQl9IGVsc2UgaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpKSB7Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT5yYSwgZ2V0X2Jzc2lkKHBtbG1lcHJpdikpOwotCQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+dGEsIHBhdHRyaWItPnNyYyk7Ci0JfSBlbHNlIGlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpIHsKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPnJhLCBwYXR0cmliLT5kc3QpOwotCQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+dGEsIGdldF9ic3NpZChwbWxtZXByaXYpKTsKLQl9Ci0KLQlwYXR0cmliLT5wa3RsZW4gPSBza2ItPmxlbiAtIEVUSF9ITEVOOwotCi0JaWYgKHBhdHRyaWItPmV0aGVyX3R5cGUgPT0gRVRIX1BfSVApIHsKLQkJLyogIFRoZSBmb2xsb3dpbmcgaXMgZm9yIERIQ1AgYW5kIEFSUCBwYWNrZXQsIHdlIHVzZSBjY2sxTQotCQkgICAgdG8gdHggdGhlc2UgcGFja2V0cyBhbmQgbGV0IExQUyBhd2FrZSBzb21lIHRpbWUgKi8KLQkJLyogIHRvIHByZXZlbnQgREhDUCBwcm90b2NvbCBmYWlsICovCi0JCXBhdHRyaWItPmRoY3BfcGt0ID0gMDsKLQkJLyogTUlOSU1VTV9ESENQX1BBQ0tFVF9TSVpFKSB7ICovCi0JCWlmIChwYXR0cmliLT5wa3RsZW4gPiAyODIgKyAyNCkgewotCQkJaWYgKHBhdHRyaWItPmV0aGVyX3R5cGUgPT0gRVRIX1BfSVApIHsvKiAgSVAgaGVhZGVyICovCi0JCQkJdTggKnBmcmFtZSA9IHNrYi0+ZGF0YTsKLQotCQkJCXBmcmFtZSArPSBFVEhfSExFTjsKLQotCQkJCWlmICgocGZyYW1lWzIxXSA9PSA2OCAmJiBwZnJhbWVbMjNdID09IDY3KSB8fAotCQkJCSAgICAocGZyYW1lWzIxXSA9PSA2NyAmJiBwZnJhbWVbMjNdID09IDY4KSkgewotCQkJCQkvKiAgNjggOiBVRFAgQk9PVFAgY2xpZW50ICovCi0JCQkJCS8qICA2NyA6IFVEUCBCT09UUCBzZXJ2ZXIgKi8KLQkJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sCi0JCQkJCQkgX2Rydl9lcnJfLAotCQkJCQkJICI9PT09PT09PT09PT09PT09PT09PT09dXBkYXRlX2F0dHJpYjogZ2V0IERIQ1AgUGFja2V0XG4iKTsKLQkJCQkJcGF0dHJpYi0+ZGhjcF9wa3QgPSAxOwotCQkJCX0KLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAocGF0dHJpYi0+ZXRoZXJfdHlwZSA9PSBFVEhfUF9QQUUpIHsKLQkJREJHXzg3MjNBX0xFVkVMKF9kcnZfYWx3YXlzXywgInNlbmQgZWFwb2wgcGFja2V0XG4iKTsKLQl9Ci0KLQlpZiAoKHBhdHRyaWItPmV0aGVyX3R5cGUgPT0gRVRIX1BfUEFFKSB8fCAocGF0dHJpYi0+ZGhjcF9wa3QgPT0gMSkpIHsKLQkJcnR3X3NldF9zY2FuX2RlbnkocGFkYXB0ZXIsIDMwMDApOwotCX0KLQotCS8qICBJZiBFQVBPTCAsIEFSUCAsIE9SIERIQ1AgcGFja2V0LCBkcml2ZXIgbXVzdCBiZSBpbiBhY3RpdmUgbW9kZS4gKi8KLQlpZiAoKHBhdHRyaWItPmV0aGVyX3R5cGUgPT0gRVRIX1BfQVJQKSB8fAotCSAgICAocGF0dHJpYi0+ZXRoZXJfdHlwZSA9PSBFVEhfUF9QQUUpIHx8IChwYXR0cmliLT5kaGNwX3BrdCA9PSAxKSkgewotCQlydHdfbHBzX2N0cmxfd2tfY21kMjNhKHBhZGFwdGVyLCBMUFNfQ1RSTF9TUEVDSUFMX1BBQ0tFVCwgMSk7Ci0JfQotCi0JYm1jYXN0ID0gaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocGF0dHJpYi0+cmEpOwotCi0JLyogIGdldCBzdGFfaW5mbyAqLwotCWlmIChibWNhc3QpIHsKLQkJcHN0YSA9IHJ0d19nZXRfYmNtY19zdGFpbmZvMjNhKHBhZGFwdGVyKTsKLQl9IGVsc2UgewotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBwYXR0cmliLT5yYSk7Ci0JCWlmIChwc3RhID09IE5VTEwpIHsgLyogIGlmIHdlIGNhbm5vdCBnZXQgcHN0YSA9PiBkcnJwIHRoZSBwa3QgKi8KLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2FsZXJ0XywKLQkJCQkgInVwZGF0ZV9hdHRyaWIgPT4gZ2V0IHN0YV9pbmZvIGZhaWwsIHJhOiVwTVxuIiwKLQkJCQkgcGF0dHJpYi0+cmEpOwotCQkJcmVzID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0gZWxzZSBpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpICYmCi0JCQkgICAoIShwc3RhLT5zdGF0ZSAmIF9GV19MSU5LRUQpKSkgewotCQkJcmVzID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQl9Ci0KLQlpZiAocHN0YSkgewotCQlwYXR0cmliLT5tYWNfaWQgPSBwc3RhLT5tYWNfaWQ7Ci0JCS8qIERCR184NzIzQSgiJXMgPT0+IG1hY19pZCglZClcbiIsIF9fZnVuY19fLCBwYXR0cmliLT5tYWNfaWQpOyAqLwotCQlwYXR0cmliLT5wc3RhID0gcHN0YTsKLQl9IGVsc2UgewotCQkvKiAgaWYgd2UgY2Fubm90IGdldCBwc3RhID0+IGRyb3AgdGhlIHBrdCAqLwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9hbGVydF8sCi0JCQkgInVwZGF0ZV9hdHRyaWIgPT4gZ2V0IHN0YV9pbmZvIGZhaWwsIHJhOiVwTVxuIiwKLQkJCSBwYXR0cmliLT5yYSk7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcGF0dHJpYi0+YWNrX3BvbGljeSA9IDA7Ci0JLyogIGdldCBldGhlcl9oZHJfbGVuICovCi0KLQkvKiBwYXR0cmliLT5ldGhlcl90eXBlID09IDB4ODEwMCkgPyAoMTQgKyA0KTogMTQ7IHZsYW4gdGFnICovCi0JcGF0dHJpYi0+cGt0X2hkcmxlbiA9IEVUSF9ITEVOOwotCi0JcGF0dHJpYi0+aGRybGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKLQlwYXR0cmliLT50eXBlID0gSUVFRTgwMjExX0ZUWVBFX0RBVEE7Ci0JcGF0dHJpYi0+cHJpb3JpdHkgPSAwOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFIHwgV0lGSV9BREhPQ19TVEFURSB8Ci0JCQkgIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFKSkgewotCQlpZiAocHN0YS0+cW9zX29wdGlvbikKLQkJCXNldF9xb3Moc2tiLCBwYXR0cmliKTsKLQl9IGVsc2UgewotCQlpZiAocG1sbWVwcml2LT5xb3Nfb3B0aW9uKSB7Ci0JCQlzZXRfcW9zKHNrYiwgcGF0dHJpYik7Ci0KLQkJCWlmIChwbWxtZXByaXYtPmFjbV9tYXNrICE9IDApIHsKLQkJCQlwYXR0cmliLT5wcmlvcml0eSA9IHFvc19hY20yM2EocG1sbWVwcml2LT5hY21fbWFzaywKLQkJCQkJCQkgICAgcGF0dHJpYi0+cHJpb3JpdHkpOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKHBzdGEtPmllZWU4MDIxeF9ibG9ja2VkID09IHRydWUpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCSAicHN0YS0+aWVlZTgwMjF4X2Jsb2NrZWQgPT0gdHJ1ZVxuIik7Ci0KLQkJcGF0dHJpYi0+ZW5jcnlwdCA9IDA7Ci0KLQkJaWYgKChwYXR0cmliLT5ldGhlcl90eXBlICE9IEVUSF9QX1BBRSkgJiYKLQkJICAgICFjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9NUF9TVEFURSkpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJwc3RhLT5pZWVlODAyMXhfYmxvY2tlZCA9PSB0cnVlLCAgcGF0dHJpYi0+ZXRoZXJfdHlwZSglLjR4KSAhPSAweDg4OGVcbiIsCi0JCQkJIHBhdHRyaWItPmV0aGVyX3R5cGUpOwotCQkJcmVzID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQl9IGVsc2UgewotCQlHRVRfRU5DUllfQUxHTyhwc2VjdXJpdHlwcml2LCBwc3RhLCBwYXR0cmliLT5lbmNyeXB0LCBibWNhc3QpOwotCi0JCXN3aXRjaCAocHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSkgewotCQljYXNlIGRvdDExQXV0aEFsZ3J0aG1fT3BlbjoKLQkJY2FzZSBkb3QxMUF1dGhBbGdydGhtX1NoYXJlZDoKLQkJY2FzZSBkb3QxMUF1dGhBbGdydGhtX0F1dG86Ci0JCQlwYXR0cmliLT5rZXlfaWR4ID0KLQkJCQkodTgpcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5S2V5SW5kZXg7Ci0JCQlicmVhazsKLQkJY2FzZSBkb3QxMUF1dGhBbGdydGhtXzgwMjFYOgotCQkJaWYgKGJtY2FzdCkKLQkJCQlwYXR0cmliLT5rZXlfaWR4ID0KLQkJCQkJKHU4KXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlpZDsKLQkJCWVsc2UKLQkJCQlwYXR0cmliLT5rZXlfaWR4ID0gMDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcGF0dHJpYi0+a2V5X2lkeCA9IDA7Ci0JCQlicmVhazsKLQkJfQotCi0JfQotCi0Jc3dpdGNoIChwYXR0cmliLT5lbmNyeXB0KSB7Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKLQkJcGF0dHJpYi0+aXZfbGVuID0gSUVFRTgwMjExX1dFUF9JVl9MRU47Ci0JCXBhdHRyaWItPmljdl9sZW4gPSBJRUVFODAyMTFfV0VQX0lDVl9MRU47Ci0JCWJyZWFrOwotCi0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgotCQlwYXR0cmliLT5pdl9sZW4gPSBJRUVFODAyMTFfVEtJUF9JVl9MRU47Ci0JCXBhdHRyaWItPmljdl9sZW4gPSBJRUVFODAyMTFfVEtJUF9JQ1ZfTEVOOwotCi0JCWlmICghcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idXNldGtpcGtleSkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCQkgInBhZGFwdGVyLT5zZWN1cml0eXByaXYuYnVzZXRraXBrZXkoJWQpID09IGZhbHNlIGRyb3AgcGFja2V0XG4iLAotCQkJCSBwYWRhcHRlci0+c2VjdXJpdHlwcml2LmJ1c2V0a2lwa2V5KTsKLQkJCXJlcyA9IF9GQUlMOwotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJYnJlYWs7Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAicGF0dHJpYi0+ZW5jcnlwdCA9JWQgKFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVApXG4iLAotCQkJIHBhdHRyaWItPmVuY3J5cHQpOwotCQlwYXR0cmliLT5pdl9sZW4gPSBJRUVFODAyMTFfQ0NNUF9IRFJfTEVOOwotCQlwYXR0cmliLT5pY3ZfbGVuID0gSUVFRTgwMjExX0NDTVBfTUlDX0xFTjsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwYXR0cmliLT5pdl9sZW4gPSAwOwotCQlwYXR0cmliLT5pY3ZfbGVuID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCi0JCSAidXBkYXRlX2F0dHJpYjogZW5jcnlwdCA9JWRcbiIsIHBhdHRyaWItPmVuY3J5cHQpOwotCi0JaWYgKHBhdHRyaWItPmVuY3J5cHQgJiYgIXBzZWN1cml0eXByaXYtPmh3X2RlY3J5cHRlZCkgewotCQlwYXR0cmliLT5ic3dlbmMgPSB0cnVlOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJICJ1cGRhdGVfYXR0cmliOiBlbmNyeXB0ID0lZCBic3dlbmMgPSB0cnVlXG4iLAotCQkJIHBhdHRyaWItPmVuY3J5cHQpOwotCX0gZWxzZSB7Ci0JCXBhdHRyaWItPmJzd2VuYyA9IGZhbHNlOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAidXBkYXRlX2F0dHJpYjogYnN3ZW5jID0gZmFsc2VcbiIpOwotCX0KLQl1cGRhdGVfYXR0cmliX3BoeV9pbmZvKHBhdHRyaWIsIHBzdGEpOwotCi1leGl0OgotCi0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGludCB4bWl0ZnJhbWVfYWRkbWljKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpIHsKLQlzdHJ1Y3QgbWljX2RhdGEgbWljZGF0YTsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YWluZm87Ci0Jc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHhtaXRmcmFtZS0+YXR0cmliOwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlpbnQgY3VyZnJhZ251bSwgbGVuZ3RoOwotCXU4ICpwZnJhbWUsICpwYXlsb2FkLCBtaWNbOF07Ci0JdTggcHJpb3JpdHlbNF09IHsweDAsIDB4MCwgMHgwLCAweDB9OwotCXU4IGh3X2hkcl9vZmZzZXQgPSAwOwotCWludCBibWNzdCA9IGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHBhdHRyaWItPnJhKTsKLQotCWlmIChwYXR0cmliLT5wc3RhKSB7Ci0JCXN0YWluZm8gPSBwYXR0cmliLT5wc3RhOwotCX0gZWxzZSB7Ci0JCURCR184NzIzQSgiJXMsIGNhbGwgcnR3X2dldF9zdGFpbmZvMjNhKClcbiIsIF9fZnVuY19fKTsKLQkJc3RhaW5mbyA9IHJ0d19nZXRfc3RhaW5mbzIzYSgmcGFkYXB0ZXItPnN0YXByaXYsICZwYXR0cmliLT5yYVswXSk7Ci0JfQotCi0JaWYgKCFzdGFpbmZvKSB7Ci0JCURCR184NzIzQSgiJXMsIHBzdGEgPT0gTlVMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQlpZiAoIShzdGFpbmZvLT5zdGF0ZSAmX0ZXX0xJTktFRCkpIHsKLQkJREJHXzg3MjNBKCIlcywgcHN0YS0+c3RhdGUoMHgleCkgIT0gX0ZXX0xJTktFRFxuIiwKLQkJCSAgX19mdW5jX18sIHN0YWluZm8tPnN0YXRlKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCWh3X2hkcl9vZmZzZXQgPSBUWERFU0NfT0ZGU0VUOwotCi0JaWYgKHBhdHRyaWItPmVuY3J5cHQgPT0gV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCkgewotCQkvKiBlbmNvZGUgbWljIGNvZGUgKi8KLQkJaWYgKHN0YWluZm8pIHsKLQkJCXU4IG51bGxfa2V5WzE2XT17MHgwLCAweDAsIDB4MCwgMHgwLAotCQkJCQkgMHgwLCAweDAsIDB4MCwgMHgwLAotCQkJCQkgMHgwLCAweDAsIDB4MCwgMHgwLAotCQkJCQkgMHgwLCAweDAsIDB4MCwgMHgwfTsKLQotCQkJcGZyYW1lID0gcHhtaXRmcmFtZS0+YnVmX2FkZHIgKyBod19oZHJfb2Zmc2V0OwotCi0JCQlpZiAoYm1jc3QpIHsKLQkJCQlpZiAoIW1lbWNtcChwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwdHhtaWNrZXlbcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycEtleWlkXS5za2V5LCBudWxsX2tleSwgMTYpKSB7Ci0JCQkJCXJldHVybiBfRkFJTDsKLQkJCQl9Ci0JCQkJLyogc3RhcnQgdG8gY2FsY3VsYXRlIHRoZSBtaWMgY29kZSAqLwotCQkJCXJ0d19zZWNtaWNzZXRrZXkyM2EoJm1pY2RhdGEsIHBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnB0eG1pY2tleVtwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwS2V5aWRdLnNrZXkpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIW1lbWNtcCgmc3RhaW5mby0+ZG90MTF0a2lwdHhtaWNrZXkuc2tleVswXSwKLQkJCQkJICAgIG51bGxfa2V5LCAxNikpIHsKLQkJCQkJcmV0dXJuIF9GQUlMOwotCQkJCX0KLQkJCQkvKiBzdGFydCB0byBjYWxjdWxhdGUgdGhlIG1pYyBjb2RlICovCi0JCQkJcnR3X3NlY21pY3NldGtleTIzYSgmbWljZGF0YSwgJnN0YWluZm8tPmRvdDExdGtpcHR4bWlja2V5LnNrZXlbMF0pOwotCQkJfQotCi0JCQlpZiAocGZyYW1lWzFdICYgMSkgeyAgIC8qIFRvRFMgPT0gMSAqLwotCQkJCS8qIERBICovCi0JCQkJcnR3X3NlY21pY2FwcGVuZDIzYSgmbWljZGF0YSwgJnBmcmFtZVsxNl0sIDYpOwotCQkJCWlmIChwZnJhbWVbMV0gJiAyKSAgLyogRnJvbSBEcyA9PSAxICovCi0JCQkJCXJ0d19zZWNtaWNhcHBlbmQyM2EoJm1pY2RhdGEsCi0JCQkJCQkJICZwZnJhbWVbMjRdLCA2KTsKLQkJCQllbHNlCi0JCQkJCXJ0d19zZWNtaWNhcHBlbmQyM2EoJm1pY2RhdGEsCi0JCQkJCQkJICZwZnJhbWVbMTBdLCA2KTsKLQkJCX0gZWxzZSB7CS8qIFRvRFMgPT0gMCAqLwotCQkJCS8qIERBICovCi0JCQkJcnR3X3NlY21pY2FwcGVuZDIzYSgmbWljZGF0YSwgJnBmcmFtZVs0XSwgNik7Ci0JCQkJaWYgKHBmcmFtZVsxXSAmIDIpICAvKiBGcm9tIERzID09IDEgKi8KLQkJCQkJcnR3X3NlY21pY2FwcGVuZDIzYSgmbWljZGF0YSwKLQkJCQkJCQkgJnBmcmFtZVsxNl0sIDYpOwotCQkJCWVsc2UKLQkJCQkJcnR3X3NlY21pY2FwcGVuZDIzYSgmbWljZGF0YSwKLQkJCQkJCQkgJnBmcmFtZVsxMF0sIDYpOwotCQkJfQotCi0JCQkvKiBpZiAocG1sbWVwcml2LT5xb3Nfb3B0aW9uID09IDEpICovCi0JCQlpZiAocGF0dHJpYi0+cW9zX2VuKQotCQkJCXByaW9yaXR5WzBdID0gKHU4KXB4bWl0ZnJhbWUtPmF0dHJpYi5wcmlvcml0eTsKLQotCQkJcnR3X3NlY21pY2FwcGVuZDIzYSgmbWljZGF0YSwgJnByaW9yaXR5WzBdLCA0KTsKLQotCQkJcGF5bG9hZCA9IHBmcmFtZTsKLQotCQkJZm9yIChjdXJmcmFnbnVtID0gMDsgY3VyZnJhZ251bSA8IHBhdHRyaWItPm5yX2ZyYWdzOwotCQkJICAgICBjdXJmcmFnbnVtKyspIHsKLQkJCQlwYXlsb2FkID0gUFRSX0FMSUdOKHBheWxvYWQsIDQpOwotCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sCi0JCQkJCSAiPT09IGN1cmZyYWdudW0gPSVkLCBwZnJhbWUgPSAweCUuMngsIDB4JS4yeCwgMHglLjJ4LCAweCUuMngsIDB4JS4yeCwgMHglLjJ4LCAweCUuMngsIDB4JS4yeCwhISFcbiIsCi0JCQkJCSBjdXJmcmFnbnVtLCAqcGF5bG9hZCwgKihwYXlsb2FkICsgMSksCi0JCQkJCSAqKHBheWxvYWQgKyAyKSwgKihwYXlsb2FkICsgMyksCi0JCQkJCSAqKHBheWxvYWQgKyA0KSwgKihwYXlsb2FkICsgNSksCi0JCQkJCSAqKHBheWxvYWQgKyA2KSwgKihwYXlsb2FkICsgNykpOwotCi0JCQkJcGF5bG9hZCA9IHBheWxvYWQgKyBwYXR0cmliLT5oZHJsZW4gKwotCQkJCQlwYXR0cmliLT5pdl9sZW47Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCQkJICJjdXJmcmFnbnVtID0lZCBwYXR0cmliLT5oZHJsZW4gPSVkIHBhdHRyaWItPml2X2xlbiA9JWRcbiIsCi0JCQkJCSBjdXJmcmFnbnVtLAotCQkJCQkgcGF0dHJpYi0+aGRybGVuLCBwYXR0cmliLT5pdl9sZW4pOwotCQkJCWlmICgoY3VyZnJhZ251bSArIDEpID09IHBhdHRyaWItPm5yX2ZyYWdzKSB7Ci0JCQkJCWxlbmd0aCA9IHBhdHRyaWItPmxhc3RfdHhjbWRzeiAtCi0JCQkJCQlwYXR0cmliLT5oZHJsZW4gLQotCQkJCQkJcGF0dHJpYi0+aXZfbGVuIC0KLQkJCQkJCSgocGF0dHJpYi0+YnN3ZW5jKSA/Ci0JCQkJCQkgcGF0dHJpYi0+aWN2X2xlbiA6IDApOwotCQkJCQlydHdfc2VjbWljYXBwZW5kMjNhKCZtaWNkYXRhLCBwYXlsb2FkLAotCQkJCQkJCSBsZW5ndGgpOwotCQkJCQlwYXlsb2FkID0gcGF5bG9hZCArIGxlbmd0aDsKLQkJCQl9IGVsc2UgewotCQkJCQlsZW5ndGggPSBweG1pdHByaXYtPmZyYWdfbGVuIC0KLQkJCQkJCXBhdHRyaWItPmhkcmxlbiAtCi0JCQkJCQlwYXR0cmliLT5pdl9sZW4gLQotCQkJCQkJKChwYXR0cmliLT5ic3dlbmMpID8KLQkJCQkJCSBwYXR0cmliLT5pY3ZfbGVuIDogMCk7Ci0JCQkJCXJ0d19zZWNtaWNhcHBlbmQyM2EoJm1pY2RhdGEsIHBheWxvYWQsCi0JCQkJCQkJIGxlbmd0aCk7Ci0JCQkJCXBheWxvYWQgPSBwYXlsb2FkICsgbGVuZ3RoICsKLQkJCQkJCXBhdHRyaWItPmljdl9sZW47Ci0JCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLAotCQkJCQkJIF9kcnZfZXJyXywKLQkJCQkJCSAiY3VyZnJhZ251bSA9JWQgbGVuZ3RoID0lZCBwYXR0cmliLT5pY3ZfbGVuID0lZFxuIiwKLQkJCQkJCSBjdXJmcmFnbnVtLCBsZW5ndGgsCi0JCQkJCQkgcGF0dHJpYi0+aWN2X2xlbik7Ci0JCQkJfQotCQkJfQotCQkJcnR3X3NlY2dldG1pYzIzYSgmbWljZGF0YSwgJm1pY1swXSk7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJCSAieG1pdGZyYW1lX2FkZG1pYzogYmVmb3JlIGFkZCBtaWMgY29kZSEhXG4iKTsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJ4bWl0ZnJhbWVfYWRkbWljOiBwYXR0cmliLT5sYXN0X3R4Y21kc3ogPSVkISEhXG4iLAotCQkJCSBwYXR0cmliLT5sYXN0X3R4Y21kc3opOwotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCQkgInhtaXRmcmFtZV9hZGRtaWM6IG1pY1swXT0gMHglLjJ4ICwgbWljWzFdPTB4JS4yeCAsIG1pY1syXT0gMHglLjJ4ICwgbWljWzNdPSAweCUuMnhcbm1pY1s0XT0gMHglLjJ4ICwgbWljWzVdPSAweCUuMnggLCBtaWNbNl09IDB4JS4yeCAsIG1pY1s3XT0gMHglLjJ4ICEhISFcbiIsCi0JCQkJIG1pY1swXSwgbWljWzFdLCBtaWNbMl0sIG1pY1szXSwKLQkJCQkgbWljWzRdLCBtaWNbNV0sIG1pY1s2XSwgbWljWzddKTsKLQkJCS8qIGFkZCBtaWMgY29kZSAgYW5kIGFkZCB0aGUgbWljIGNvZGUgbGVuZ3RoCi0JCQkgICBpbiBsYXN0X3R4Y21kc3ogKi8KLQotCQkJbWVtY3B5KHBheWxvYWQsICZtaWNbMF0sIDgpOwotCQkJcGF0dHJpYi0+bGFzdF90eGNtZHN6ICs9IDg7Ci0KLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAiPT09PT09PT0gbGFzdCBwa3QgPT09PT09PT1cbiIpOwotCQkJcGF5bG9hZCA9IHBheWxvYWQgLSBwYXR0cmliLT5sYXN0X3R4Y21kc3ogKyA4OwotCQkJZm9yIChjdXJmcmFnbnVtID0gMDsgY3VyZnJhZ251bSA8IHBhdHRyaWItPmxhc3RfdHhjbWRzejsKLQkJCSAgICAgY3VyZnJhZ251bSA9IGN1cmZyYWdudW0gKyA4KSB7Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAiJS4yeCwgICUuMngsICAlLjJ4LCAgJS4yeCwgICUuMngsICAlLjJ4LCAgJS4yeCwgICUuMnhcbiIsCi0JCQkJCSAqKHBheWxvYWQgKyBjdXJmcmFnbnVtKSwKLQkJCQkJICoocGF5bG9hZCArIGN1cmZyYWdudW0gKyAxKSwKLQkJCQkJICoocGF5bG9hZCArIGN1cmZyYWdudW0gKyAyKSwKLQkJCQkJICoocGF5bG9hZCArIGN1cmZyYWdudW0gKyAzKSwKLQkJCQkJICoocGF5bG9hZCArIGN1cmZyYWdudW0gKyA0KSwKLQkJCQkJICoocGF5bG9hZCArIGN1cmZyYWdudW0gKyA1KSwKLQkJCQkJICoocGF5bG9hZCArIGN1cmZyYWdudW0gKyA2KSwKLQkJCQkJICoocGF5bG9hZCArIGN1cmZyYWdudW0gKyA3KSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJCSAieG1pdGZyYW1lX2FkZG1pYzogcnR3X2dldF9zdGFpbmZvMjNhID09TlVMTCEhIVxuIik7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQgeG1pdGZyYW1lX3N3ZW5jcnlwdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICAgIHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKQotewotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliID0gJnB4bWl0ZnJhbWUtPmF0dHJpYjsKLQotCS8qIGlmICgocHNlY3VyaXR5cHJpdi0+c3dfZW5jcnlwdCl8fChwYXR0cmliLT5ic3dlbmMpKSAqLwotCWlmIChwYXR0cmliLT5ic3dlbmMpIHsKLQkJLyogREJHXzg3MjNBKCJzdGFydCB4bWl0ZnJhbWVfc3dlbmNyeXB0XG4iKTsgKi8KLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfYWxlcnRfLAotCQkJICIjIyMgeG1pdGZyYW1lX3N3ZW5jcnlwdFxuIik7Ci0JCXN3aXRjaCAocGF0dHJpYi0+ZW5jcnlwdCkgewotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKLQkJCXJ0d193ZXBfZW5jcnlwdDIzYShwYWRhcHRlciwgcHhtaXRmcmFtZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgotCQkJcnR3X3RraXBfZW5jcnlwdDIzYShwYWRhcHRlciwgcHhtaXRmcmFtZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgotCQkJcnR3X2Flc19lbmNyeXB0MjNhKHBhZGFwdGVyLCBweG1pdGZyYW1lKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQl9Ci0KLQl9IGVsc2UgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9ub3RpY2VfLAotCQkJICIjIyMgeG1pdGZyYW1lX2h3ZW5jcnlwdFxuIik7Ci0JfQotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IHJ0d19tYWtlX3dsYW5oZHIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKmhkciwKLQkJCSAgICBzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqcHdsYW5oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKiloZHI7Ci0Jc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyICpxb3NoZHI7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQl1OCBxb3Nfb3B0aW9uID0gZmFsc2U7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCi0JaW50IGJtY3N0ID0gaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocGF0dHJpYi0+cmEpOwotCi0JaWYgKHBhdHRyaWItPnBzdGEpIHsKLQkJcHN0YSA9IHBhdHRyaWItPnBzdGE7Ci0JfSBlbHNlIHsKLQkJREJHXzg3MjNBKCIlcywgY2FsbCBydHdfZ2V0X3N0YWluZm8yM2EoKVxuIiwgX19mdW5jX18pOwotCQlpZiAoYm1jc3QpIHsKLQkJCXBzdGEgPSBydHdfZ2V0X2JjbWNfc3RhaW5mbzIzYShwYWRhcHRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKCZwYWRhcHRlci0+c3RhcHJpdiwgcGF0dHJpYi0+cmEpOwotCQl9Ci0JfQotCi0JaWYgKHBzdGEgPT0gTlVMTCkgewotCQlEQkdfODcyM0EoIiVzLCBwc3RhID09IE5VTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gX0ZBSUw7Ci0JfQotCi0JaWYgKCEocHN0YS0+c3RhdGUgJl9GV19MSU5LRUQpKSB7Ci0JCURCR184NzIzQSgiJXMsIHBzdGEtPnN0YXRlKDB4JXgpICE9IF9GV19MSU5LRURcbiIsIF9fZnVuY19fLCBwc3RhLT5zdGF0ZSk7Ci0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQltZW1zZXQoaGRyLCAwLCBXTEFOSERSX09GRlNFVCk7Ci0KLQlwd2xhbmhkci0+ZnJhbWVfY29udHJvbCA9IGNwdV90b19sZTE2KHBhdHRyaWItPnR5cGUpOwotCi0JaWYgKHBhdHRyaWItPnR5cGUgJiBJRUVFODAyMTFfRlRZUEVfREFUQSkgewotCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsICBXSUZJX1NUQVRJT05fU1RBVEUpKSB7Ci0JCQkvKiB0b19kcyA9IDEsIGZyX2RzID0gMDsgKi8KLQkJCS8qIERhdGEgdHJhbnNmZXIgdG8gQVAgKi8KLQkJCXB3bGFuaGRyLT5mcmFtZV9jb250cm9sIHw9Ci0JCQkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfVE9EUyk7Ci0JCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIxLCBnZXRfYnNzaWQocG1sbWVwcml2KSk7Ci0JCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIyLCBwYXR0cmliLT5zcmMpOwotCQkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMywgcGF0dHJpYi0+ZHN0KTsKLQotCQkJaWYgKHBtbG1lcHJpdi0+cW9zX29wdGlvbikKLQkJCQlxb3Nfb3B0aW9uID0gdHJ1ZTsKLQotCQl9IGVsc2UgaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCAgV0lGSV9BUF9TVEFURSkpIHsKLQkJCS8qIHRvX2RzID0gMCwgZnJfZHMgPSAxOyAqLwotCQkJcHdsYW5oZHItPmZyYW1lX2NvbnRyb2wgfD0KLQkJCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9GUk9NRFMpOwotCQkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMSwgcGF0dHJpYi0+ZHN0KTsKLQkJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjIsIGdldF9ic3NpZChwbWxtZXByaXYpKTsKLQkJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjMsIHBhdHRyaWItPnNyYyk7Ci0KLQkJCWlmIChwc3RhLT5xb3Nfb3B0aW9uKQotCQkJCXFvc19vcHRpb24gPSB0cnVlOwotCQl9IGVsc2UgaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX1NUQVRFKSB8fAotCQkJICAgY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFKSkgewotCQkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMSwgcGF0dHJpYi0+ZHN0KTsKLQkJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjIsIHBhdHRyaWItPnNyYyk7Ci0JCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBnZXRfYnNzaWQocG1sbWVwcml2KSk7Ci0KLQkJCWlmIChwc3RhLT5xb3Nfb3B0aW9uKQotCQkJCXFvc19vcHRpb24gPSB0cnVlOwotCQl9Ci0JCWVsc2UgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCQkgImZ3X3N0YXRlOiV4IGlzIG5vdCBhbGxvd2VkIHRvIHhtaXQgZnJhbWVcbiIsCi0JCQkJIGdldF9md3N0YXRlKHBtbG1lcHJpdikpOwotCQkJcmVzID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQkJaWYgKHBhdHRyaWItPm1kYXRhKQotCQkJcHdsYW5oZHItPmZyYW1lX2NvbnRyb2wgfD0KLQkJCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9NT1JFREFUQSk7Ci0JCWlmIChwYXR0cmliLT5lbmNyeXB0KQotCQkJcHdsYW5oZHItPmZyYW1lX2NvbnRyb2wgfD0KLQkJCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9QUk9URUNURUQpOwotCQlpZiAocW9zX29wdGlvbikgewotCQkJcW9zaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfcW9zX2hkciAqKWhkcjsKLQotCQkJcW9zaGRyLT5xb3NfY3RybCA9IGNwdV90b19sZTE2KAotCQkJCXBhdHRyaWItPnByaW9yaXR5ICYgSUVFRTgwMjExX1FPU19DVExfVElEX01BU0spOwotCi0JCQlxb3NoZHItPnFvc19jdHJsIHw9IGNwdV90b19sZTE2KAotCQkJCShwYXR0cmliLT5hY2tfcG9saWN5IDw8IDUpICYKLQkJCQlJRUVFODAyMTFfUU9TX0NUTF9BQ0tfUE9MSUNZX01BU0spOwotCi0JCQlpZiAocGF0dHJpYi0+ZW9zcCkKLQkJCQlxb3NoZHItPnFvc19jdHJsIHw9Ci0JCQkJCWNwdV90b19sZTE2KElFRUU4MDIxMV9RT1NfQ1RMX0VPU1ApOwotCQl9Ci0JCS8qIFRPRE86IGZpbGwgSFQgQ29udHJvbCBGaWVsZCAqLwotCi0JCS8qIFVwZGF0ZSBTZXEgTnVtIHdpbGwgYmUgaGFuZGxlZCBieSBmL3cgKi8KLQkJaWYgKHBzdGEpIHsKLQkJCXBzdGEtPnN0YV94bWl0cHJpdi50eHNlcV90aWRbcGF0dHJpYi0+cHJpb3JpdHldKys7Ci0JCQlwc3RhLT5zdGFfeG1pdHByaXYudHhzZXFfdGlkW3BhdHRyaWItPnByaW9yaXR5XSAmPSAweEZGRjsKLQkJCXBhdHRyaWItPnNlcW51bSA9IHBzdGEtPnN0YV94bWl0cHJpdi50eHNlcV90aWRbcGF0dHJpYi0+cHJpb3JpdHldOwotCQkJLyogV2UgZG9udCBuZWVkIHRvIHdvcnJ5IGFib3V0IGZyYWcgYml0cyBoZXJlICovCi0JCQlwd2xhbmhkci0+c2VxX2N0cmwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU05fVE9fU0VRKAotCQkJCQkJCSAgICAgIHBhdHRyaWItPnNlcW51bSkpOwotCQkJLyogY2hlY2sgaWYgZW5hYmxlIGFtcGR1ICovCi0JCQlpZiAocGF0dHJpYi0+aHRfZW4gJiYgcHN0YS0+aHRwcml2LmFtcGR1X2VuYWJsZSkgewotCQkJCWlmIChwYXR0cmliLT5wcmlvcml0eSA+PSAxNikKLQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEludmFsaWQgIgotCQkJCQkgICAgICAgInBhdHRyaWItPnByaW9yaXR5ICVpXG4iLAotCQkJCQkgICAgICAgX19mdW5jX18sIHBhdHRyaWItPnByaW9yaXR5KTsKLQkJCQlpZiAocHN0YS0+aHRwcml2LmFnZ19lbmFibGVfYml0bWFwICYKLQkJCQkgICAgQklUKHBhdHRyaWItPnByaW9yaXR5KSkKLQkJCQkJcGF0dHJpYi0+YW1wZHVfZW4gPSB0cnVlOwotCQkJfQotCQkJLyogcmUtY2hlY2sgaWYgZW5hYmxlIGFtcGR1IGJ5IEJBX3N0YXJ0aW5nX3NlcWN0cmwgKi8KLQkJCWlmIChwYXR0cmliLT5hbXBkdV9lbikgewotCQkJCXUxNiB0eF9zZXE7Ci0KLQkJCQl0eF9zZXEgPSBwc3RhLT5CQV9zdGFydGluZ19zZXFjdHJsW3BhdHRyaWItPnByaW9yaXR5ICYgMHgwZl07Ci0KLQkJCQkvKiBjaGVjayBCQV9zdGFydGluZ19zZXFjdHJsICovCi0JCQkJaWYgKFNOX0xFU1MocGF0dHJpYi0+c2VxbnVtLCB0eF9zZXEpKSB7Ci0JCQkJCS8qIERCR184NzIzQSgidHggYW1wZHUgc2VxbnVtKCVkKSA8IHR4X3NlcSglZClcbiIsIHBhdHRyaWItPnNlcW51bSwgdHhfc2VxKTsgKi8KLQkJCQkJcGF0dHJpYi0+YW1wZHVfZW4gPSBmYWxzZTsvKiBBR0cgQksgKi8KLQkJCQl9IGVsc2UgaWYgKFNOX0VRVUFMKHBhdHRyaWItPnNlcW51bSwgdHhfc2VxKSkgewotCQkJCQlwc3RhLT5CQV9zdGFydGluZ19zZXFjdHJsW3BhdHRyaWItPnByaW9yaXR5ICYgMHgwZl0gPSAodHhfc2VxKzEpJjB4ZmZmOwotCQkJCQlwYXR0cmliLT5hbXBkdV9lbiA9IHRydWU7LyogQUdHIEVOICovCi0JCQkJfSBlbHNlIHsKLQkJCQkJLyogREJHXzg3MjNBKCJ0eCBhbXBkdSBvdmVyIHJ1blxuIik7ICovCi0JCQkJCXBzdGEtPkJBX3N0YXJ0aW5nX3NlcWN0cmxbcGF0dHJpYi0+cHJpb3JpdHkgJiAweDBmXSA9IChwYXR0cmliLT5zZXFudW0rMSkmMHhmZmY7Ci0JCQkJCXBhdHRyaWItPmFtcGR1X2VuID0gdHJ1ZTsvKiBBR0cgRU4gKi8KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci1leGl0OgotCXJldHVybiByZXM7Ci19Ci0KLXMzMiBydHdfdHhmcmFtZXNfcGVuZGluZzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0KLQlyZXR1cm4gKCFsaXN0X2VtcHR5KCZweG1pdHByaXYtPmJlX3BlbmRpbmcucXVldWUpKSB8fAotCQkoIWxpc3RfZW1wdHkoJnB4bWl0cHJpdi0+YmtfcGVuZGluZy5xdWV1ZSkpIHx8Ci0JCSghbGlzdF9lbXB0eSgmcHhtaXRwcml2LT52aV9wZW5kaW5nLnF1ZXVlKSkgfHwKLQkJKCFsaXN0X2VtcHR5KCZweG1pdHByaXYtPnZvX3BlbmRpbmcucXVldWUpKTsKLX0KLQotczMyIHJ0d190eGZyYW1lc19zdGFfYWNfcGVuZGluZzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliKQotewotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQlzdHJ1Y3QgdHhfc2VydnEgKnB0eHNlcnZxOwotCWludCBwcmlvcml0eSA9IHBhdHRyaWItPnByaW9yaXR5OwotCi0JaWYgKHBhdHRyaWItPnBzdGEpIHsKLQkJcHN0YSA9IHBhdHRyaWItPnBzdGE7Ci0JfSBlbHNlIHsKLQkJREJHXzg3MjNBKCIlcywgY2FsbCBydHdfZ2V0X3N0YWluZm8yM2EoKVxuIiwgX19mdW5jX18pOwotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKCZwYWRhcHRlci0+c3RhcHJpdiwgJnBhdHRyaWItPnJhWzBdKTsKLQl9Ci0JaWYgKHBzdGEgPT0gTlVMTCkgewotCQlEQkdfODcyM0EoIiVzLCBwc3RhID09IE5VTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCEocHN0YS0+c3RhdGUgJl9GV19MSU5LRUQpKSB7Ci0JCURCR184NzIzQSgiJXMsIHBzdGEtPnN0YXRlKDB4JXgpICE9IF9GV19MSU5LRURcbiIsIF9fZnVuY19fLAotCQkJICBwc3RhLT5zdGF0ZSk7Ci0JCXJldHVybiAwOwotCX0KLQlzd2l0Y2ggKHByaW9yaXR5KSB7Ci0JY2FzZSAxOgotCWNhc2UgMjoKLQkJcHR4c2VydnEgPSAmcHN0YS0+c3RhX3htaXRwcml2LmJrX3E7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQljYXNlIDU6Ci0JCXB0eHNlcnZxID0gJnBzdGEtPnN0YV94bWl0cHJpdi52aV9xOwotCQlicmVhazsKLQljYXNlIDY6Ci0JY2FzZSA3OgotCQlwdHhzZXJ2cSA9ICZwc3RhLT5zdGFfeG1pdHByaXYudm9fcTsKLQkJYnJlYWs7Ci0JY2FzZSAwOgotCWNhc2UgMzoKLQlkZWZhdWx0OgotCQlwdHhzZXJ2cSA9ICZwc3RhLT5zdGFfeG1pdHByaXYuYmVfcTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBwdHhzZXJ2cS0+cWNudDsKLX0KLQotLyogTG9naWNhbCBMaW5rIENvbnRyb2woTExDKSBTdWJOZXR3b3JrIEF0dGFjaG1lbnQgUG9pbnQoU05BUCkgaGVhZGVyCi0gKiBJRUVFIExMQy9TTkFQIGhlYWRlciBjb250YWlucyA4IG9jdGV0cwotICogRmlyc3QgMyBvY3RldHMgY29tcHJpc2UgdGhlIExMQyBwb3J0aW9uCi0gKiBTTkFQIHBvcnRpb24sIDUgb2N0ZXRzLCBpcyBkaXZpZGVkIGludG8gdHdvIGZpZWxkczoKLSAqCU9yZ2FuaXphdGlvbmFsbHkgVW5pcXVlIElkZW50aWZpZXIoT1VJKSwgMyBvY3RldHMsCi0gKgl0eXBlLCBkZWZpbmVkIGJ5IHRoYXQgb3JnYW5pemF0aW9uLCAyIG9jdGV0cy4KLSAqLwotc3RhdGljIGludCBydHdfcHV0X3NuYXAodTggKmRhdGEsIHUxNiBoX3Byb3RvKQotewotCWlmIChoX3Byb3RvID09IEVUSF9QX0lQWCB8fCBoX3Byb3RvID09IEVUSF9QX0FBUlApCi0JCWV0aGVyX2FkZHJfY29weShkYXRhLCBicmlkZ2VfdHVubmVsX2hlYWRlcik7Ci0JZWxzZQotCQlldGhlcl9hZGRyX2NvcHkoZGF0YSwgcmZjMTA0Ml9oZWFkZXIpOwotCi0JZGF0YSArPSBFVEhfQUxFTjsKLQlwdXRfdW5hbGlnbmVkX2JlMTYoaF9wcm90bywgZGF0YSk7Ci0JcmV0dXJuIEVUSF9BTEVOICsgc2l6ZW9mKHUxNik7Ci19Ci0KLS8qCi0KLVRoaXMgc3ViLXJvdXRpbmUgd2lsbCBwZXJmb3JtIGFsbCB0aGUgZm9sbG93aW5nOgotCi0xLiByZW1vdmUgODAyLjMgaGVhZGVyLgotMi4gY3JlYXRlIHdsYW5faGVhZGVyLCBiYXNlZCBvbiB0aGUgaW5mbyBpbiBweG1pdGZyYW1lCi0zLiBhcHBlbmQgc3RhJ3MgaXYvZXh0LWl2Ci00LiBhcHBlbmQgTExDCi01LiBtb3ZlIGZyYWcgY2h1bmsgZnJvbSBwZnJhbWUgdG8gcHhtaXRmcmFtZS0+bWVtCi02LiBhcHBseSBzdy1lbmNyeXB0LCBpZiBuZWNlc3NhcnkuCi0KLSovCi1pbnQgcnR3X3htaXRmcmFtZV9jb2FsZXNjZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICAgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCi17Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHhtaXRmcmFtZS0+YXR0cmliOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7Ci0JczMyIGZyZ19pbngsIGZyZ19sZW4sIG1wZHVfbGVuLCBsbGNfc3osIG1lbV9zejsKLQl1OCAqcGZyYW1lLCAqbWVtX3N0YXJ0OwotCXU4IGh3X2hkcl9vZmZzZXQ7Ci0JdTggKnBidWZfc3RhcnQ7Ci0JdTggKnBkYXRhID0gc2tiLT5kYXRhOwotCWludCBkYXRhX2xlbiA9IHNrYi0+bGVuOwotCXMzMiBibWNzdCA9IGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHBhdHRyaWItPnJhKTsKLQlpbnQgcmVzID0gX1NVQ0NFU1M7Ci0KLQlpZiAocGF0dHJpYi0+cHN0YSkKLQkJcHN0YSA9IHBhdHRyaWItPnBzdGE7Ci0JZWxzZSB7Ci0JCURCR184NzIzQSgiJXMsIGNhbGwgcnR3X2dldF9zdGFpbmZvMjNhKClcbiIsIF9fZnVuY19fKTsKLQkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYSgmcGFkYXB0ZXItPnN0YXByaXYsIHBhdHRyaWItPnJhKTsKLQl9Ci0KLQlpZiAoIXBzdGEpIHsKLQkJREJHXzg3MjNBKCIlcywgcHN0YSA9PSBOVUxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCWlmICghKHBzdGEtPnN0YXRlICZfRldfTElOS0VEKSkgewotCQlEQkdfODcyM0EoIiVzLCBwc3RhLT5zdGF0ZSgweCV4KSAhPSBfRldfTElOS0VEXG4iLAotCQkJICBfX2Z1bmNfXywgcHN0YS0+c3RhdGUpOwotCQlyZXR1cm4gX0ZBSUw7Ci0JfQotCi0JaWYgKCFweG1pdGZyYW1lLT5idWZfYWRkcikgewotCQlEQkdfODcyM0EoIj09PiAlcyBidWZfYWRkciA9PSBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQlwYnVmX3N0YXJ0ID0gcHhtaXRmcmFtZS0+YnVmX2FkZHI7Ci0KLQlod19oZHJfb2Zmc2V0ID0gVFhERVNDX09GRlNFVDsKLQotCW1lbV9zdGFydCA9IHBidWZfc3RhcnQgKyBod19oZHJfb2Zmc2V0OwotCi0JaWYgKHJ0d19tYWtlX3dsYW5oZHIocGFkYXB0ZXIsIG1lbV9zdGFydCwgcGF0dHJpYikgPT0gX0ZBSUwpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCSAiJXM6IHJ0d19tYWtlX3dsYW5oZHIgZmFpbDsgZHJvcCBwa3RcbiIsIF9fZnVuY19fKTsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwZGF0YSArPSBwYXR0cmliLT5wa3RfaGRybGVuOwotCWRhdGFfbGVuIC09IHBhdHRyaWItPnBrdF9oZHJsZW47Ci0KLQlmcmdfaW54ID0gMDsKLQlmcmdfbGVuID0gcHhtaXRwcml2LT5mcmFnX2xlbiAtIDQ7LyogMjM0Ni00ID0gMjM0MiAqLwotCi0Jd2hpbGUgKDEpIHsKLQkJbGxjX3N6ID0gMDsKLQotCQltcGR1X2xlbiA9IGZyZ19sZW47Ci0KLQkJcGZyYW1lID0gbWVtX3N0YXJ0OwotCQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKiltZW1fc3RhcnQ7Ci0KLQkJcGZyYW1lICs9IHBhdHRyaWItPmhkcmxlbjsKLQkJbXBkdV9sZW4gLT0gcGF0dHJpYi0+aGRybGVuOwotCi0JCS8qIGFkZGluZyBpY3YsIGlmIG5lY2Vzc2FyeS4uLiAqLwotCQlpZiAocGF0dHJpYi0+aXZfbGVuKSB7Ci0JCQlpZiAocHN0YSkgewotCQkJCXN3aXRjaCAocGF0dHJpYi0+ZW5jcnlwdCkgewotCQkJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6Ci0JCQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6Ci0JCQkJCVdFUF9JVihwYXR0cmliLT5pdiwgcHN0YS0+ZG90MTF0eHBuLAotCQkJCQkgICAgICAgcGF0dHJpYi0+a2V5X2lkeCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDoKLQkJCQkJaWYgKGJtY3N0KQotCQkJCQkJVEtJUF9JVihwYXR0cmliLT5pdiwKLQkJCQkJCQlwc3RhLT5kb3QxMXR4cG4sCi0JCQkJCQkJcGF0dHJpYi0+a2V5X2lkeCk7Ci0JCQkJCWVsc2UKLQkJCQkJCVRLSVBfSVYocGF0dHJpYi0+aXYsCi0JCQkJCQkJcHN0YS0+ZG90MTF0eHBuLCAwKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgotCQkJCQlpZiAoYm1jc3QpCi0JCQkJCQlBRVNfSVYocGF0dHJpYi0+aXYsCi0JCQkJCQkgICAgICAgcHN0YS0+ZG90MTF0eHBuLAotCQkJCQkJICAgICAgIHBhdHRyaWItPmtleV9pZHgpOwotCQkJCQllbHNlCi0JCQkJCQlBRVNfSVYocGF0dHJpYi0+aXYsCi0JCQkJCQkgICAgICAgcHN0YS0+ZG90MTF0eHBuLCAwKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQltZW1jcHkocGZyYW1lLCBwYXR0cmliLT5pdiwgcGF0dHJpYi0+aXZfbGVuKTsKLQotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfbm90aWNlXywKLQkJCQkgInJ0d194bWlhZnJhbWVfY29hbGVzY2UyM2E6IGtleWlkID0lZCBwYXR0cmliLT5pdlszXT0lLjJ4IHBmcmFtZSA9JS4yeCAlLjJ4ICUuMnggJS4yeFxuIiwKLQkJCQkgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lLZXlJbmRleCwKLQkJCQkgcGF0dHJpYi0+aXZbM10sICpwZnJhbWUsICoocGZyYW1lKzEpLAotCQkJCSAqKHBmcmFtZSsyKSwgKihwZnJhbWUrMykpOwotCQkJcGZyYW1lICs9IHBhdHRyaWItPml2X2xlbjsKLQkJCW1wZHVfbGVuIC09IHBhdHRyaWItPml2X2xlbjsKLQkJfQotCQlpZiAoZnJnX2lueCA9PSAwKSB7Ci0JCQlsbGNfc3ogPSBydHdfcHV0X3NuYXAocGZyYW1lLCBwYXR0cmliLT5ldGhlcl90eXBlKTsKLQkJCXBmcmFtZSArPSBsbGNfc3o7Ci0JCQltcGR1X2xlbiAtPSBsbGNfc3o7Ci0JCX0KLQotCQlpZiAocGF0dHJpYi0+aWN2X2xlbiA+IDAgJiYgcGF0dHJpYi0+YnN3ZW5jKQotCQkJbXBkdV9sZW4gLT0gcGF0dHJpYi0+aWN2X2xlbjsKLQotCQlpZiAoYm1jc3QpCi0JCQkvKiAgZG9uJ3QgZG8gZnJhZ21lbnQgdG8gYnJvYWRjYXN0L211bHRpY2FzdCBwYWNrZXRzICovCi0JCQltZW1fc3ogPSBtaW5fdChzMzIsIGRhdGFfbGVuLCBwYXR0cmliLT5wa3RsZW4pOwotCQllbHNlCi0JCQltZW1fc3ogPSBtaW5fdChzMzIsIGRhdGFfbGVuLCBtcGR1X2xlbik7Ci0KLQkJbWVtY3B5KHBmcmFtZSwgcGRhdGEsIG1lbV9zeik7Ci0KLQkJcGZyYW1lICs9IG1lbV9zejsKLQkJcGRhdGEgKz0gbWVtX3N6OwotCQlkYXRhX2xlbiAtPSBtZW1fc3o7Ci0KLQkJaWYgKChwYXR0cmliLT5pY3ZfbGVuID4wKSAmJiAocGF0dHJpYi0+YnN3ZW5jKSkgewotCQkJbWVtY3B5KHBmcmFtZSwgcGF0dHJpYi0+aWN2LCBwYXR0cmliLT5pY3ZfbGVuKTsKLQkJCXBmcmFtZSArPSBwYXR0cmliLT5pY3ZfbGVuOwotCQl9Ci0KLQkJZnJnX2lueCsrOwotCi0JCWlmIChibWNzdCB8fCBkYXRhX2xlbiA8PSAwKSB7Ci0JCQlwYXR0cmliLT5ucl9mcmFncyA9IGZyZ19pbng7Ci0KLQkJCXBhdHRyaWItPmxhc3RfdHhjbWRzeiA9IHBhdHRyaWItPmhkcmxlbiArCi0JCQkJCQlwYXR0cmliLT5pdl9sZW4gKwotCQkJCQkJKChwYXR0cmliLT5ucl9mcmFncyA9PSAxKSA/Ci0JCQkJCQlsbGNfc3ogOiAwKSArCi0JCQkJCQkoKHBhdHRyaWItPmJzd2VuYykgPwotCQkJCQkJcGF0dHJpYi0+aWN2X2xlbiA6IDApICsgbWVtX3N6OwotCQkJaGRyLT5mcmFtZV9jb250cm9sICY9Ci0JCQkJfmNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUyk7Ci0KLQkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCQkgIiVzOiBUaGVyZSdyZSBzdGlsbCBzb21ldGhpbmcgaW4gcGFja2V0IVxuIiwKLQkJCQkgX19mdW5jX18pOwotCQl9Ci0JCWhkci0+ZnJhbWVfY29udHJvbCB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MpOwotCi0JCW1lbV9zdGFydCA9IFBUUl9BTElHTihwZnJhbWUsIDQpICsgaHdfaGRyX29mZnNldDsKLQkJbWVtY3B5KG1lbV9zdGFydCwgcGJ1Zl9zdGFydCArIGh3X2hkcl9vZmZzZXQsIHBhdHRyaWItPmhkcmxlbik7Ci0JfQotCi0JaWYgKHhtaXRmcmFtZV9hZGRtaWMocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpID09IF9GQUlMKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sCi0JCQkgInhtaXRmcmFtZV9hZGRtaWMocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpID09IF9GQUlMXG4iKTsKLQkJREJHXzg3MjNBKCJ4bWl0ZnJhbWVfYWRkbWljKHBhZGFwdGVyLCBweG1pdGZyYW1lKSA9PSBfRkFJTFxuIik7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JeG1pdGZyYW1lX3N3ZW5jcnlwdChwYWRhcHRlciwgcHhtaXRmcmFtZSk7Ci0KLQlpZiAoYm1jc3QgPT0gZmFsc2UpCi0JCXVwZGF0ZV9hdHRyaWJfdmNzX2luZm8ocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpOwotCWVsc2UKLQkJcGF0dHJpYi0+dmNzX21vZGUgPSBOT05FX1ZDUzsKLQotZXhpdDoKLQlyZXR1cm4gcmVzOwotfQotCi12b2lkIHJ0d191cGRhdGVfcHJvdGVjdGlvbjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqaWUsIHVpbnQgaWVfbGVuKQotewotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdpc3RyeXByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQl1aW50IHByb3RlY3Rpb247Ci0JY29uc3QgdTggKnA7Ci0KLQlzd2l0Y2ggKHByZWdpc3RyeXByaXYtPnZydGxfY2Fycmllcl9zZW5zZSkgewotCWNhc2UgRElTQUJMRV9WQ1M6Ci0JCXB4bWl0cHJpdi0+dmNzID0gTk9ORV9WQ1M7Ci0JCWJyZWFrOwotCWNhc2UgRU5BQkxFX1ZDUzoKLQkJYnJlYWs7Ci0JY2FzZSBBVVRPX1ZDUzoKLQlkZWZhdWx0OgotCQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9FUlBfSU5GTywgaWUsIGllX2xlbik7Ci0JCWlmICghcCkKLQkJCXB4bWl0cHJpdi0+dmNzID0gTk9ORV9WQ1M7Ci0JCWVsc2UgewotCQkJcHJvdGVjdGlvbiA9ICgqKHAgKyAyKSkgJiBCSVQoMSk7Ci0JCQlpZiAocHJvdGVjdGlvbikgewotCQkJCWlmIChwcmVnaXN0cnlwcml2LT52Y3NfdHlwZSA9PSBSVFNfQ1RTKQotCQkJCQlweG1pdHByaXYtPnZjcyA9IFJUU19DVFM7Ci0JCQkJZWxzZQotCQkJCQlweG1pdHByaXYtPnZjcyA9IENUU19UT19TRUxGOwotCQkJfSBlbHNlIHsKLQkJCQlweG1pdHByaXYtPnZjcyA9IE5PTkVfVkNTOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCX0KLX0KLQotdm9pZCBydHdfY291bnRfdHhfc3RhdHMyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUsIGludCBzeikKLXsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBOVUxMOwotCXN0cnVjdCBzdGFpbmZvX3N0YXRzICpwc3RhdHMgPSBOVUxMOwotCXN0cnVjdCB4bWl0X3ByaXYJKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdgkqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCWlmIChweG1pdGZyYW1lLT5mcmFtZV90YWcgPT0gREFUQV9GUkFNRVRBRykgewotCQlweG1pdHByaXYtPnR4X2J5dGVzICs9IHN6OwotCQlwbWxtZXByaXYtPkxpbmtEZXRlY3RJbmZvLk51bVR4T2tJblBlcmlvZCsrOwotCi0JCXBzdGEgPSBweG1pdGZyYW1lLT5hdHRyaWIucHN0YTsKLQkJaWYgKHBzdGEpIHsKLQkJCXBzdGF0cyA9ICZwc3RhLT5zdGFfc3RhdHM7Ci0JCQlwc3RhdHMtPnR4X3BrdHMrKzsKLQkJCXBzdGF0cy0+dHhfYnl0ZXMgKz0gc3o7Ci0JCX0KLQl9Ci19Ci0KLXN0cnVjdCB4bWl0X2J1ZiAqcnR3X2FsbG9jX3htaXRidWYyM2FfZXh0KHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdikKLXsKLQl1bnNpZ25lZCBsb25nIGlycUw7Ci0Jc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1ZiA9ICBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkOwotCXN0cnVjdCBydHdfcXVldWUgKnBmcmVlX3F1ZXVlID0gJnB4bWl0cHJpdi0+ZnJlZV94bWl0X2V4dGJ1Zl9xdWV1ZTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwZnJlZV9xdWV1ZS0+bG9jaywgaXJxTCk7Ci0KLQlwaGVhZCA9IGdldF9saXN0X2hlYWQocGZyZWVfcXVldWUpOwotCi0JaWYgKCFsaXN0X2VtcHR5KHBoZWFkKSkgewotCQlweG1pdGJ1ZiA9IGxpc3RfZmlyc3RfZW50cnkocGhlYWQsIHN0cnVjdCB4bWl0X2J1ZiwgbGlzdCk7Ci0KLQkJbGlzdF9kZWxfaW5pdCgmcHhtaXRidWYtPmxpc3QpOwotCi0JCXB4bWl0cHJpdi0+ZnJlZV94bWl0X2V4dGJ1Zl9jbnQtLTsKLQkJcHhtaXRidWYtPnByaXZfZGF0YSA9IE5VTEw7Ci0JCXB4bWl0YnVmLT5leHRfdGFnID0gdHJ1ZTsKLQotCQlpZiAocHhtaXRidWYtPnNjdHgpIHsKLQkJCURCR184NzIzQSgiJXMgcHhtaXRidWYtPnNjdHggaXMgbm90IE5VTExcbiIsIF9fZnVuY19fKTsKLQkJCXJ0dzIzYV9zY3R4X2RvbmVfZXJyKCZweG1pdGJ1Zi0+c2N0eCwgUlRXX1NDVFhfRE9ORV9CVUZfQUxMT0MpOwotCQl9Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZyZWVfcXVldWUtPmxvY2ssIGlycUwpOwotCi0JcmV0dXJuIHB4bWl0YnVmOwotfQotCi1pbnQgcnR3X2ZyZWVfeG1pdGJ1Zl9leHQyM2Eoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2LAotCQkJICAgIHN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYpCi17Ci0JdW5zaWduZWQgbG9uZyBpcnFMOwotCXN0cnVjdCBydHdfcXVldWUgKnBmcmVlX3F1ZXVlID0gJnB4bWl0cHJpdi0+ZnJlZV94bWl0X2V4dGJ1Zl9xdWV1ZTsKLQotCWlmIChweG1pdGJ1ZiA9PSBOVUxMKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGZyZWVfcXVldWUtPmxvY2ssIGlycUwpOwotCi0JbGlzdF9kZWxfaW5pdCgmcHhtaXRidWYtPmxpc3QpOwotCi0JbGlzdF9hZGRfdGFpbCgmcHhtaXRidWYtPmxpc3QsIGdldF9saXN0X2hlYWQocGZyZWVfcXVldWUpKTsKLQlweG1pdHByaXYtPmZyZWVfeG1pdF9leHRidWZfY250Kys7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZnJlZV9xdWV1ZS0+bG9jaywgaXJxTCk7Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXN0cnVjdCB4bWl0X2J1ZiAqcnR3X2FsbG9jX3htaXRidWYyM2Eoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2KQotewotCXVuc2lnbmVkIGxvbmcgaXJxTDsKLQlzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmID0gIE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0Jc3RydWN0IHJ0d19xdWV1ZSAqcGZyZWVfeG1pdGJ1Zl9xdWV1ZSA9ICZweG1pdHByaXYtPmZyZWVfeG1pdGJ1Zl9xdWV1ZTsKLQotCS8qIERCR184NzIzQSgiK3J0d19hbGxvY194bWl0YnVmMjNhXG4iKTsgKi8KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwZnJlZV94bWl0YnVmX3F1ZXVlLT5sb2NrLCBpcnFMKTsKLQotCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwZnJlZV94bWl0YnVmX3F1ZXVlKTsKLQotCWlmICghbGlzdF9lbXB0eShwaGVhZCkpIHsKLQkJcHhtaXRidWYgPSBsaXN0X2ZpcnN0X2VudHJ5KHBoZWFkLCBzdHJ1Y3QgeG1pdF9idWYsIGxpc3QpOwotCi0JCWxpc3RfZGVsX2luaXQoJnB4bWl0YnVmLT5saXN0KTsKLQotCQlweG1pdHByaXYtPmZyZWVfeG1pdGJ1Zl9jbnQtLTsKLQkJcHhtaXRidWYtPnByaXZfZGF0YSA9IE5VTEw7Ci0JCXB4bWl0YnVmLT5leHRfdGFnID0gZmFsc2U7Ci0JCXB4bWl0YnVmLT5mbGFncyA9IFhNSVRfVk9fUVVFVUU7Ci0KLQkJaWYgKHB4bWl0YnVmLT5zY3R4KSB7Ci0JCQlEQkdfODcyM0EoIiVzIHB4bWl0YnVmLT5zY3R4IGlzIG5vdCBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCQlydHcyM2Ffc2N0eF9kb25lX2VycigmcHhtaXRidWYtPnNjdHgsIFJUV19TQ1RYX0RPTkVfQlVGX0FMTE9DKTsKLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmcmVlX3htaXRidWZfcXVldWUtPmxvY2ssIGlycUwpOwotCi0JcmV0dXJuIHB4bWl0YnVmOwotfQotCi1pbnQgcnR3X2ZyZWVfeG1pdGJ1ZjIzYShzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYsIHN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYpCi17Ci0JdW5zaWduZWQgbG9uZyBpcnFMOwotCXN0cnVjdCBydHdfcXVldWUgKnBmcmVlX3htaXRidWZfcXVldWUgPSAmcHhtaXRwcml2LT5mcmVlX3htaXRidWZfcXVldWU7Ci0KLQkvKiBEQkdfODcyM0EoIitydHdfZnJlZV94bWl0YnVmMjNhXG4iKTsgKi8KLQotCWlmIChweG1pdGJ1ZiA9PSBOVUxMKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQlpZiAocHhtaXRidWYtPnNjdHgpIHsKLQkJREJHXzg3MjNBKCIlcyBweG1pdGJ1Zi0+c2N0eCBpcyBub3QgTlVMTFxuIiwgX19mdW5jX18pOwotCQlydHcyM2Ffc2N0eF9kb25lX2VycigmcHhtaXRidWYtPnNjdHgsIFJUV19TQ1RYX0RPTkVfQlVGX0ZSRUUpOwotCX0KLQotCWlmIChweG1pdGJ1Zi0+ZXh0X3RhZykgewotCQlydHdfZnJlZV94bWl0YnVmX2V4dDIzYShweG1pdHByaXYsIHB4bWl0YnVmKTsKLQl9IGVsc2UgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGZyZWVfeG1pdGJ1Zl9xdWV1ZS0+bG9jaywgaXJxTCk7Ci0KLQkJbGlzdF9kZWxfaW5pdCgmcHhtaXRidWYtPmxpc3QpOwotCi0JCWxpc3RfYWRkX3RhaWwoJnB4bWl0YnVmLT5saXN0LAotCQkJICAgICAgZ2V0X2xpc3RfaGVhZChwZnJlZV94bWl0YnVmX3F1ZXVlKSk7Ci0KLQkJcHhtaXRwcml2LT5mcmVlX3htaXRidWZfY250Kys7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmcmVlX3htaXRidWZfcXVldWUtPmxvY2ssIGlycUwpOwotCX0KLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIHZvaWQgcnR3X2luaXRfeG1pdGZyYW1lKHN0cnVjdCB4bWl0X2ZyYW1lICpweGZyYW1lKQotewotCWlmIChweGZyYW1lICE9ICBOVUxMKSB7Ci0JCS8qIGRlZmF1bHQgdmFsdWUgc2V0dGluZyAqLwotCQlweGZyYW1lLT5idWZfYWRkciA9IE5VTEw7Ci0JCXB4ZnJhbWUtPnB4bWl0YnVmID0gTlVMTDsKLQotCQltZW1zZXQoJnB4ZnJhbWUtPmF0dHJpYiwgMCwgc2l6ZW9mKHN0cnVjdCBwa3RfYXR0cmliKSk7Ci0JCS8qIHB4ZnJhbWUtPmF0dHJpYi5wc3RhID0gTlVMTDsgKi8KLQotCQlweGZyYW1lLT5mcmFtZV90YWcgPSBEQVRBX0ZSQU1FVEFHOwotCi0JCXB4ZnJhbWUtPnBrdCA9IE5VTEw7Ci0JCXB4ZnJhbWUtPnBrdF9vZmZzZXQgPSAxOy8qIGRlZmF1bHQgdXNlIHBrdF9vZmZzZXQgdG8gZmlsbCB0eCBkZXNjICovCi0KLQkJcHhmcmFtZS0+YWNrX3JlcG9ydCA9IDA7Ci0JfQotfQotCi0vKgotQ2FsbGluZyBjb250ZXh0OgotMS4gT1NfVFhFTlRSWQotMi4gUlhFTlRSWSAocnhfdGhyZWFkIG9yIFJYX0lTUi9SWF9DYWxsQmFjaykKLQotSWYgd2UgdHVybiBvbiBVU0VfUlhUSFJFQUQsIHRoZW4sIG5vIG5lZWQgZm9yIGNyaXRpY2FsIHNlY3Rpb24uCi1PdGhlcndpc2UsIHdlIG11c3QgdXNlIF9lbnRlci9fZXhpdCBjcml0aWNhbCB0byBwcm90ZWN0IGZyZWVfeG1pdF9xdWV1ZS4uLgotCi1NdXN0IGJlIHZlcnkgdmVyeSBjYXV0aW91cy4uLgotCi0qLwotc3RhdGljIHN0cnVjdCB4bWl0X2ZyYW1lICpydHdfYWxsb2NfeG1pdGZyYW1lKHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdikKLXsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhmcmFtZTsKLQlzdHJ1Y3QgcnR3X3F1ZXVlICpwZnJlZV94bWl0X3F1ZXVlID0gJnB4bWl0cHJpdi0+ZnJlZV94bWl0X3F1ZXVlOwotCi0Jc3Bpbl9sb2NrX2JoKCZwZnJlZV94bWl0X3F1ZXVlLT5sb2NrKTsKLQotCXB4ZnJhbWUgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJnBmcmVlX3htaXRfcXVldWUtPnF1ZXVlLAotCQkJCQkgICBzdHJ1Y3QgeG1pdF9mcmFtZSwgbGlzdCk7Ci0JaWYgKCFweGZyYW1lKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLAotCQkJICJydHdfYWxsb2NfeG1pdGZyYW1lOiVkXG4iLAotCQkJIHB4bWl0cHJpdi0+ZnJlZV94bWl0ZnJhbWVfY250KTsKLQl9IGVsc2UgewotCQlsaXN0X2RlbF9pbml0KCZweGZyYW1lLT5saXN0KTsKLQkJcHhtaXRwcml2LT5mcmVlX3htaXRmcmFtZV9jbnQtLTsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgInJ0d19hbGxvY194bWl0ZnJhbWUoKTpmcmVlX3htaXRmcmFtZV9jbnQgPSVkXG4iLAotCQkJIHB4bWl0cHJpdi0+ZnJlZV94bWl0ZnJhbWVfY250KTsKLQl9Ci0KLQlzcGluX3VubG9ja19iaCgmcGZyZWVfeG1pdF9xdWV1ZS0+bG9jayk7Ci0KLQlydHdfaW5pdF94bWl0ZnJhbWUocHhmcmFtZSk7Ci0KLQlyZXR1cm4gcHhmcmFtZTsKLX0KLQotc3RydWN0IHhtaXRfZnJhbWUgKnJ0d19hbGxvY194bWl0ZnJhbWUyM2FfZXh0KHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdikKLXsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhmcmFtZTsKLQlzdHJ1Y3QgcnR3X3F1ZXVlICpxdWV1ZSA9ICZweG1pdHByaXYtPmZyZWVfeGZyYW1lX2V4dF9xdWV1ZTsKLQotCXNwaW5fbG9ja19iaCgmcXVldWUtPmxvY2spOwotCi0JcHhmcmFtZSA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmcXVldWUtPnF1ZXVlLAotCQkJCQkgICBzdHJ1Y3QgeG1pdF9mcmFtZSwgbGlzdCk7Ci0JaWYgKCFweGZyYW1lKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLAotCQkJICJydHdfYWxsb2NfeG1pdGZyYW1lMjNhX2V4dDolZFxuIiwKLQkJCSBweG1pdHByaXYtPmZyZWVfeGZyYW1lX2V4dF9jbnQpOwotCX0gZWxzZSB7Ci0JCWxpc3RfZGVsX2luaXQoJnB4ZnJhbWUtPmxpc3QpOwotCQlweG1pdHByaXYtPmZyZWVfeGZyYW1lX2V4dF9jbnQtLTsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgInJ0d19hbGxvY194bWl0ZnJhbWUyM2FfZXh0KCk6ZnJlZV94bWl0ZnJhbWVfY250ID0lZFxuIiwKLQkJCSBweG1pdHByaXYtPmZyZWVfeGZyYW1lX2V4dF9jbnQpOwotCX0KLQotCXNwaW5fdW5sb2NrX2JoKCZxdWV1ZS0+bG9jayk7Ci0KLQlydHdfaW5pdF94bWl0ZnJhbWUocHhmcmFtZSk7Ci0KLQlyZXR1cm4gcHhmcmFtZTsKLX0KLQotczMyIHJ0d19mcmVlX3htaXRmcmFtZTIzYShzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYsIHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKQotewotCXN0cnVjdCBydHdfcXVldWUgKnF1ZXVlID0gTlVMTDsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gcHhtaXRwcml2LT5hZGFwdGVyOwotCXN0cnVjdCBza19idWZmICpwbmRpc19wa3QgPSBOVUxMOwotCi0JaWYgKHB4bWl0ZnJhbWUgPT0gTlVMTCkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJICI9PT09PT0gcnR3X2ZyZWVfeG1pdGZyYW1lMjNhKCk6cHhtaXRmcmFtZSA9PSBOVUxMISEhISEhISEhIVxuIik7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAocHhtaXRmcmFtZS0+cGt0KSB7Ci0JCXBuZGlzX3BrdCA9IHB4bWl0ZnJhbWUtPnBrdDsKLQkJcHhtaXRmcmFtZS0+cGt0ID0gTlVMTDsKLQl9Ci0KLQlpZiAocHhtaXRmcmFtZS0+ZXh0X3RhZyA9PSAwKQotCQlxdWV1ZSA9ICZweG1pdHByaXYtPmZyZWVfeG1pdF9xdWV1ZTsKLQllbHNlIGlmIChweG1pdGZyYW1lLT5leHRfdGFnID09IDEpCi0JCXF1ZXVlID0gJnB4bWl0cHJpdi0+ZnJlZV94ZnJhbWVfZXh0X3F1ZXVlOwotCi0JaWYgKCFxdWV1ZSkKLQkJZ290byBjaGVja19wa3RfY29tcGxldGU7Ci0Jc3Bpbl9sb2NrX2JoKCZxdWV1ZS0+bG9jayk7Ci0KLQlsaXN0X2RlbF9pbml0KCZweG1pdGZyYW1lLT5saXN0KTsKLQlsaXN0X2FkZF90YWlsKCZweG1pdGZyYW1lLT5saXN0LCBnZXRfbGlzdF9oZWFkKHF1ZXVlKSk7Ci0JaWYgKHB4bWl0ZnJhbWUtPmV4dF90YWcgPT0gMCkgewotCQlweG1pdHByaXYtPmZyZWVfeG1pdGZyYW1lX2NudCsrOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9kZWJ1Z18sCi0JCQkgInJ0d19mcmVlX3htaXRmcmFtZTIzYSgpOmZyZWVfeG1pdGZyYW1lX2NudCA9JWRcbiIsCi0JCQkgcHhtaXRwcml2LT5mcmVlX3htaXRmcmFtZV9jbnQpOwotCX0gZWxzZSBpZiAocHhtaXRmcmFtZS0+ZXh0X3RhZyA9PSAxKSB7Ci0JCXB4bWl0cHJpdi0+ZnJlZV94ZnJhbWVfZXh0X2NudCsrOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9kZWJ1Z18sCi0JCQkgInJ0d19mcmVlX3htaXRmcmFtZTIzYSgpOmZyZWVfeGZyYW1lX2V4dF9jbnQgPSVkXG4iLAotCQkJIHB4bWl0cHJpdi0+ZnJlZV94ZnJhbWVfZXh0X2NudCk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKLQotY2hlY2tfcGt0X2NvbXBsZXRlOgotCi0JaWYgKHBuZGlzX3BrdCkKLQkJcnR3X29zX3BrdF9jb21wbGV0ZTIzYShwYWRhcHRlciwgcG5kaXNfcGt0KTsKLQotZXhpdDoKLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotdm9pZCBydHdfZnJlZV94bWl0ZnJhbWVfcXVldWUyM2Eoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2LAotCQkJCSBzdHJ1Y3QgcnR3X3F1ZXVlICpwZnJhbWVxdWV1ZSkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSwgKnB0bXA7Ci0KLQlzcGluX2xvY2tfYmgoJnBmcmFtZXF1ZXVlLT5sb2NrKTsKLQlwaGVhZCA9IGdldF9saXN0X2hlYWQocGZyYW1lcXVldWUpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShweG1pdGZyYW1lLCBwdG1wLCBwaGVhZCwgbGlzdCkKLQkJcnR3X2ZyZWVfeG1pdGZyYW1lMjNhKHB4bWl0cHJpdiwgcHhtaXRmcmFtZSk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnBmcmFtZXF1ZXVlLT5sb2NrKTsKLQotfQotCi1pbnQgcnR3X3htaXRmcmFtZV9lbnF1ZXVlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgIHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKQotewotCWlmIChydHdfeG1pdDIzYV9jbGFzc2lmaWVyKHBhZGFwdGVyLCBweG1pdGZyYW1lKSA9PSBfRkFJTCkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJICJydHdfeG1pdGZyYW1lX2VucXVldWUyM2E6IGRyb3AgeG1pdCBwa3QgZm9yIGNsYXNzaWZpZXIgZmFpbFxuIik7Ci0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgeG1pdF9mcmFtZSAqCi1kZXF1ZXVlX29uZV94bWl0ZnJhbWUoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2LCBzdHJ1Y3QgaHdfeG1pdCAqcGh3eG1pdCwKLQkJICAgICAgc3RydWN0IHR4X3NlcnZxICpwdHhzZXJ2cSwgc3RydWN0IHJ0d19xdWV1ZSAqcGZyYW1lX3F1ZXVlKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkOwotCXN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lID0gTlVMTDsKLQotCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwZnJhbWVfcXVldWUpOwotCi0JaWYgKCFsaXN0X2VtcHR5KHBoZWFkKSkgewotCQlweG1pdGZyYW1lID0gbGlzdF9maXJzdF9lbnRyeShwaGVhZCwgc3RydWN0IHhtaXRfZnJhbWUsIGxpc3QpOwotCQlsaXN0X2RlbF9pbml0KCZweG1pdGZyYW1lLT5saXN0KTsKLQkJcHR4c2VydnEtPnFjbnQtLTsKLQl9Ci0JcmV0dXJuIHB4bWl0ZnJhbWU7Ci19Ci0KLXN0cnVjdCB4bWl0X2ZyYW1lICoKLXJ0d19kZXF1ZXVlX3hmcmFtZTIzYShzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYsIHN0cnVjdCBod194bWl0ICpwaHd4bWl0X2ksCi0JCSAgIGludCBlbnRyeSkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpzdGFfcGhlYWQ7Ci0Jc3RydWN0IGh3X3htaXQgKnBod3htaXQ7Ci0Jc3RydWN0IHR4X3NlcnZxICpwdHhzZXJ2cSA9IE5VTEwsICpwdG1wOwotCXN0cnVjdCBydHdfcXVldWUgKnBmcmFtZV9xdWV1ZSA9IE5VTEw7Ci0Jc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUgPSBOVUxMOwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBweG1pdHByaXYtPmFkYXB0ZXI7Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYJKnByZWdwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0JaW50IGksIGlueFs0XTsKLQotCWlueFswXSA9IDA7Ci0JaW54WzFdID0gMTsKLQlpbnhbMl0gPSAyOwotCWlueFszXSA9IDM7Ci0JaWYgKHByZWdwcml2LT53aWZpX3NwZWMgPT0gMSkgewotCQlpbnQgajsKLQotCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrKQotCQkJaW54W2pdID0gcHhtaXRwcml2LT53bW1fcGFyYV9zZXFbal07Ci0JfQotCi0Jc3Bpbl9sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwotCi0JZm9yIChpID0gMDsgaSA8IGVudHJ5OyBpKyspIHsKLQkJcGh3eG1pdCA9IHBod3htaXRfaSArIGlueFtpXTsKLQotCQlzdGFfcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHBod3htaXQtPnN0YV9xdWV1ZSk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwdHhzZXJ2cSwgcHRtcCwgc3RhX3BoZWFkLAotCQkJCQkgdHhfcGVuZGluZykgewotCQkJcGZyYW1lX3F1ZXVlID0gJnB0eHNlcnZxLT5zdGFfcGVuZGluZzsKLQotCQkJcHhtaXRmcmFtZSA9IGRlcXVldWVfb25lX3htaXRmcmFtZShweG1pdHByaXYsIHBod3htaXQsIHB0eHNlcnZxLCBwZnJhbWVfcXVldWUpOwotCi0JCQlpZiAocHhtaXRmcmFtZSkgewotCQkJCXBod3htaXQtPmFjY250LS07Ci0KLQkJCQkvKiBSZW1vdmUgc3RhIG5vZGUgd2hlbiB0aGVyZSBpcyBubyBwZW5kaW5nIHBhY2tldHMuICovCi0JCQkJLyogbXVzdCBiZSBkb25lIGFmdGVyIGdldF9uZXh0IGFuZAotCQkJCSAgIGJlZm9yZSBicmVhayAqLwotCQkJCWlmIChsaXN0X2VtcHR5KCZwZnJhbWVfcXVldWUtPnF1ZXVlKSkKLQkJCQkJbGlzdF9kZWxfaW5pdCgmcHR4c2VydnEtPnR4X3BlbmRpbmcpOwotCQkJCWdvdG8gZXhpdDsKLQkJCX0KLQkJfQotCX0KLWV4aXQ6Ci0Jc3Bpbl91bmxvY2tfYmgoJnB4bWl0cHJpdi0+bG9jayk7Ci0JcmV0dXJuIHB4bWl0ZnJhbWU7Ci19Ci0KLXN0cnVjdCB0eF9zZXJ2cSAqcnR3X2dldF9zdGFfcGVuZGluZzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEsIGludCB1cCwgdTggKmFjKQotewotCXN0cnVjdCB0eF9zZXJ2cSAqcHR4c2VydnEgPSBOVUxMOwotCi0Jc3dpdGNoICh1cCkgewotCWNhc2UgMToKLQljYXNlIDI6Ci0JCXB0eHNlcnZxID0gJnBzdGEtPnN0YV94bWl0cHJpdi5ia19xOwotCQkqKGFjKSA9IDM7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLAotCQkJICJydHdfZ2V0X3N0YV9wZW5kaW5nMjNhIDogQktcbiIpOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JY2FzZSA1OgotCQlwdHhzZXJ2cSA9ICZwc3RhLT5zdGFfeG1pdHByaXYudmlfcTsKLQkJKihhYykgPSAxOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAicnR3X2dldF9zdGFfcGVuZGluZzIzYSA6IFZJXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSA2OgotCWNhc2UgNzoKLQkJcHR4c2VydnEgPSAmcHN0YS0+c3RhX3htaXRwcml2LnZvX3E7Ci0JCSooYWMpID0gMDsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgInJ0d19nZXRfc3RhX3BlbmRpbmcyM2EgOiBWT1xuIik7Ci0JCWJyZWFrOwotCWNhc2UgMDoKLQljYXNlIDM6Ci0JZGVmYXVsdDoKLQkJcHR4c2VydnEgPSAmcHN0YS0+c3RhX3htaXRwcml2LmJlX3E7Ci0JCSooYWMpID0gMjsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgInJ0d19nZXRfc3RhX3BlbmRpbmcyM2EgOiBCRVxuIik7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcHR4c2VydnE7Ci19Ci0KLS8qCi0gKiBXaWxsIGVucXVldWUgcHhtaXRmcmFtZSB0byB0aGUgcHJvcGVyIHF1ZXVlLAotICogYW5kIGluZGljYXRlIGl0IHRvIHh4X3BlbmRpbmcgbGlzdC4uLi4uCi0gKi8KLWludCBydHdfeG1pdDIzYV9jbGFzc2lmaWVyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKLXsKLQlzdHJ1Y3Qgc3RhX2luZm8JKnBzdGE7Ci0Jc3RydWN0IHR4X3NlcnZxCSpwdHhzZXJ2cTsKLQlzdHJ1Y3QgcGt0X2F0dHJpYgkqcGF0dHJpYiA9ICZweG1pdGZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IHN0YV9wcml2CSpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3QgaHdfeG1pdAkqcGh3eG1pdHMgPSAgcGFkYXB0ZXItPnhtaXRwcml2Lmh3eG1pdHM7Ci0JdTgJYWNfaW5kZXg7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0JaWYgKHBhdHRyaWItPnBzdGEpIHsKLQkJcHN0YSA9IHBhdHRyaWItPnBzdGE7Ci0JfSBlbHNlIHsKLQkJREJHXzg3MjNBKCIlcywgY2FsbCBydHdfZ2V0X3N0YWluZm8yM2EoKVxuIiwgX19mdW5jX18pOwotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBwYXR0cmliLT5yYSk7Ci0JfQotCWlmIChwc3RhID09IE5VTEwpIHsKLQkJcmVzID0gX0ZBSUw7Ci0JCURCR184NzIzQSgicnR3X3htaXQyM2FfY2xhc3NpZmllcjogcHN0YSA9PSBOVUxMXG4iKTsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCSAicnR3X3htaXQyM2FfY2xhc3NpZmllcjogcHN0YSA9PSBOVUxMXG4iKTsKLQkJZ290byBleGl0OwotCX0KLQlpZiAoIShwc3RhLT5zdGF0ZSAmIF9GV19MSU5LRUQpKSB7Ci0JCURCR184NzIzQSgiJXMsIHBzdGEtPnN0YXRlKDB4JXgpICE9IF9GV19MSU5LRURcbiIsIF9fZnVuY19fLAotCQkJICBwc3RhLT5zdGF0ZSk7Ci0JCXJldHVybiBfRkFJTDsKLQl9Ci0JcHR4c2VydnEgPSBydHdfZ2V0X3N0YV9wZW5kaW5nMjNhKHBhZGFwdGVyLCBwc3RhLCBwYXR0cmliLT5wcmlvcml0eSwKLQkJCQkgICAgICAgKHU4ICopKCZhY19pbmRleCkpOwotCi0JaWYgKGxpc3RfZW1wdHkoJnB0eHNlcnZxLT50eF9wZW5kaW5nKSkgewotCQlsaXN0X2FkZF90YWlsKCZwdHhzZXJ2cS0+dHhfcGVuZGluZywKLQkJCSAgICAgIGdldF9saXN0X2hlYWQocGh3eG1pdHNbYWNfaW5kZXhdLnN0YV9xdWV1ZSkpOwotCX0KLQotCWxpc3RfYWRkX3RhaWwoJnB4bWl0ZnJhbWUtPmxpc3QsIGdldF9saXN0X2hlYWQoJnB0eHNlcnZxLT5zdGFfcGVuZGluZykpOwotCXB0eHNlcnZxLT5xY250Kys7Ci0JcGh3eG1pdHNbYWNfaW5kZXhdLmFjY250Kys7Ci1leGl0OgotCXJldHVybiByZXM7Ci19Ci0KLXZvaWQgcnR3X2FsbG9jX2h3eG1pdHMyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaHdfeG1pdCAqaHd4bWl0czsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCWludCBzaXplOwotCi0JcHhtaXRwcml2LT5od3htaXRfZW50cnkgPSBIV1hNSVRfRU5UUlk7Ci0KLQlzaXplID0gc2l6ZW9mKHN0cnVjdCBod194bWl0KSAqIChweG1pdHByaXYtPmh3eG1pdF9lbnRyeSArIDEpOwotCXB4bWl0cHJpdi0+aHd4bWl0cyA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0KLQlod3htaXRzID0gcHhtaXRwcml2LT5od3htaXRzOwotCi0JaWYgKHB4bWl0cHJpdi0+aHd4bWl0X2VudHJ5ID09IDUpIHsKLQkJLyogcHhtaXRwcml2LT5ibWNfdHhxdWV1ZS5oZWFkID0gMDsgKi8KLQkJLyogaHd4bWl0c1swXSAucGh3dHhxdWV1ZSA9ICZweG1pdHByaXYtPmJtY190eHF1ZXVlOyAqLwotCQlod3htaXRzWzBdIC5zdGFfcXVldWUgPSAmcHhtaXRwcml2LT5ibV9wZW5kaW5nOwotCi0JCS8qIHB4bWl0cHJpdi0+dm9fdHhxdWV1ZS5oZWFkID0gMDsgKi8KLQkJLyogaHd4bWl0c1sxXSAucGh3dHhxdWV1ZSA9ICZweG1pdHByaXYtPnZvX3R4cXVldWU7ICovCi0JCWh3eG1pdHNbMV0gLnN0YV9xdWV1ZSA9ICZweG1pdHByaXYtPnZvX3BlbmRpbmc7Ci0KLQkJLyogcHhtaXRwcml2LT52aV90eHF1ZXVlLmhlYWQgPSAwOyAqLwotCQkvKiBod3htaXRzWzJdIC5waHd0eHF1ZXVlID0gJnB4bWl0cHJpdi0+dmlfdHhxdWV1ZTsgKi8KLQkJaHd4bWl0c1syXSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+dmlfcGVuZGluZzsKLQotCQkvKiBweG1pdHByaXYtPmJrX3R4cXVldWUuaGVhZCA9IDA7ICovCi0JCS8qIGh3eG1pdHNbM10gLnBod3R4cXVldWUgPSAmcHhtaXRwcml2LT5ia190eHF1ZXVlOyAqLwotCQlod3htaXRzWzNdIC5zdGFfcXVldWUgPSAmcHhtaXRwcml2LT5ia19wZW5kaW5nOwotCi0JCS8qIHB4bWl0cHJpdi0+YmVfdHhxdWV1ZS5oZWFkID0gMDsgKi8KLQkJLyogaHd4bWl0c1s0XSAucGh3dHhxdWV1ZSA9ICZweG1pdHByaXYtPmJlX3R4cXVldWU7ICovCi0JCWh3eG1pdHNbNF0gLnN0YV9xdWV1ZSA9ICZweG1pdHByaXYtPmJlX3BlbmRpbmc7Ci0KLQl9IGVsc2UgaWYgKHB4bWl0cHJpdi0+aHd4bWl0X2VudHJ5ID09IDQpIHsKLQotCQkvKiBweG1pdHByaXYtPnZvX3R4cXVldWUuaGVhZCA9IDA7ICovCi0JCS8qIGh3eG1pdHNbMF0gLnBod3R4cXVldWUgPSAmcHhtaXRwcml2LT52b190eHF1ZXVlOyAqLwotCQlod3htaXRzWzBdIC5zdGFfcXVldWUgPSAmcHhtaXRwcml2LT52b19wZW5kaW5nOwotCi0JCS8qIHB4bWl0cHJpdi0+dmlfdHhxdWV1ZS5oZWFkID0gMDsgKi8KLQkJLyogaHd4bWl0c1sxXSAucGh3dHhxdWV1ZSA9ICZweG1pdHByaXYtPnZpX3R4cXVldWU7ICovCi0JCWh3eG1pdHNbMV0gLnN0YV9xdWV1ZSA9ICZweG1pdHByaXYtPnZpX3BlbmRpbmc7Ci0KLQkJLyogcHhtaXRwcml2LT5iZV90eHF1ZXVlLmhlYWQgPSAwOyAqLwotCQkvKiBod3htaXRzWzJdIC5waHd0eHF1ZXVlID0gJnB4bWl0cHJpdi0+YmVfdHhxdWV1ZTsgKi8KLQkJaHd4bWl0c1syXSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+YmVfcGVuZGluZzsKLQotCQkvKiBweG1pdHByaXYtPmJrX3R4cXVldWUuaGVhZCA9IDA7ICovCi0JCS8qIGh3eG1pdHNbM10gLnBod3R4cXVldWUgPSAmcHhtaXRwcml2LT5ia190eHF1ZXVlOyAqLwotCQlod3htaXRzWzNdIC5zdGFfcXVldWUgPSAmcHhtaXRwcml2LT5ia19wZW5kaW5nOwotCX0gZWxzZSB7Ci0KLQl9Ci19Ci0KLXZvaWQgcnR3X2ZyZWVfaHd4bWl0czIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBod194bWl0ICpod3htaXRzOwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0KLQlod3htaXRzID0gcHhtaXRwcml2LT5od3htaXRzOwotCWtmcmVlKGh3eG1pdHMpOwotfQotCi12b2lkIHJ0d19pbml0X2h3eG1pdHMyM2Eoc3RydWN0IGh3X3htaXQgKnBod3htaXQsIGludCBlbnRyeSkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBlbnRyeTsgaSsrLCBwaHd4bWl0KyspCi0JCXBod3htaXQtPmFjY250ID0gMDsKLX0KLQotdTMyIHJ0d19nZXRfZmZfaHdhZGRyMjNhKHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKQotewotCXUzMiBhZGRyOwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliID0gJnB4bWl0ZnJhbWUtPmF0dHJpYjsKLQotCXN3aXRjaCAocGF0dHJpYi0+cXNlbCkgewotCWNhc2UgMDoKLQljYXNlIDM6Ci0JCWFkZHIgPSBCRV9RVUVVRV9JTlg7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQljYXNlIDI6Ci0JCWFkZHIgPSBCS19RVUVVRV9JTlg7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQljYXNlIDU6Ci0JCWFkZHIgPSBWSV9RVUVVRV9JTlg7Ci0JCWJyZWFrOwotCWNhc2UgNjoKLQljYXNlIDc6Ci0JCWFkZHIgPSBWT19RVUVVRV9JTlg7Ci0JCWJyZWFrOwotCWNhc2UgMHgxMDoKLQkJYWRkciA9IEJDTl9RVUVVRV9JTlg7Ci0JCWJyZWFrOwotCWNhc2UgMHgxMTovKiBCQy9NQyBpbiBQUyAoSElRKSAqLwotCQlhZGRyID0gSElHSF9RVUVVRV9JTlg7Ci0JCWJyZWFrOwotCWNhc2UgMHgxMjoKLQlkZWZhdWx0OgotCQlhZGRyID0gTUdUX1FVRVVFX0lOWDsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGFkZHI7Ci19Ci0KLS8qCi0gKiBUaGUgbWFpbiB0cmFuc21pdCh0eCkgZW50cnkKLSAqCi0gKiBSZXR1cm4KLSAqCTEJZW5xdWV1ZQotICoJMAlzdWNjZXNzLCBoYXJkd2FyZSB3aWxsIGhhbmRsZSB0aGlzIHhtaXQgZnJhbWUocGFja2V0KQotICoJPDAJZmFpbAotICovCi1pbnQgcnR3X3htaXQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCXN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lID0gTlVMTDsKLQlpbnQgcmVzOwotCi0JcHhtaXRmcmFtZSA9IHJ0d19hbGxvY194bWl0ZnJhbWUocHhtaXRwcml2KTsKLQotCWlmIChweG1pdGZyYW1lID09IE5VTEwpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV94bWl0X29zZGVwX2NfLCBfZHJ2X2Vycl8sCi0JCQkgInJ0d194bWl0MjNhOiBubyBtb3JlIHB4bWl0ZnJhbWVcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmVzID0gdXBkYXRlX2F0dHJpYihwYWRhcHRlciwgc2tiLCAmcHhtaXRmcmFtZS0+YXR0cmliKTsKLQotCWlmIChyZXMgPT0gX0ZBSUwpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV94bWl0X29zZGVwX2NfLCBfZHJ2X2Vycl8sCi0JCQkgInJ0d194bWl0MjNhOiB1cGRhdGUgYXR0cmliIGZhaWxcbiIpOwotCQlydHdfZnJlZV94bWl0ZnJhbWUyM2EocHhtaXRwcml2LCBweG1pdGZyYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlweG1pdGZyYW1lLT5wa3QgPSBza2I7Ci0KLQlweG1pdGZyYW1lLT5hdHRyaWIucXNlbCA9IHB4bWl0ZnJhbWUtPmF0dHJpYi5wcmlvcml0eTsKLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCXNwaW5fbG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLQlpZiAoeG1pdGZyYW1lX2VucXVldWVfZm9yX3NsZWVwaW5nX3N0YTIzYShwYWRhcHRlciwgcHhtaXRmcmFtZSkpIHsKLQkJc3Bpbl91bmxvY2tfYmgoJnB4bWl0cHJpdi0+bG9jayk7Ci0JCXJldHVybiAxOwotCX0KLQlzcGluX3VubG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLSNlbmRpZgotCi0JaWYgKHJ0bDg3MjNhdV9oYWxfeG1pdChwYWRhcHRlciwgcHhtaXRmcmFtZSkgPT0gZmFsc2UpCi0JCXJldHVybiAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNpZiBkZWZpbmVkKENPTkZJR184NzIzQVVfQVBfTU9ERSkKLQotaW50IHhtaXRmcmFtZV9lbnF1ZXVlX2Zvcl9zbGVlcGluZ19zdGEyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCi17Ci0JaW50IHJldCA9IGZhbHNlOwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IE5VTEw7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZweG1pdGZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlpbnQgYm1jc3QgPSBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5yYSk7Ci0KLQlpZiAoIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkKLQkJcmV0dXJuIHJldDsKLQotCWlmIChwYXR0cmliLT5wc3RhKSB7Ci0JCXBzdGEgPSBwYXR0cmliLT5wc3RhOwotCX0gZWxzZSB7Ci0JCURCR184NzIzQSgiJXMsIGNhbGwgcnR3X2dldF9zdGFpbmZvMjNhKClcbiIsIF9fZnVuY19fKTsKLQkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgcGF0dHJpYi0+cmEpOwotCX0KLQotCWlmIChwc3RhID09IE5VTEwpIHsKLQkJREJHXzg3MjNBKCIlcywgcHN0YSA9PSBOVUxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCWlmICghKHBzdGEtPnN0YXRlICYgX0ZXX0xJTktFRCkpIHsKLQkJREJHXzg3MjNBKCIlcywgcHN0YS0+c3RhdGUoMHgleCkgIT0gX0ZXX0xJTktFRFxuIiwgX19mdW5jX18sCi0JCQkgIHBzdGEtPnN0YXRlKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCWlmIChwYXR0cmliLT50cmlnZ2VyZWQgPT0gMSkgewotCQlpZiAoYm1jc3QpCi0JCQlwYXR0cmliLT5xc2VsID0gMHgxMTsvKiBISVEgKi8KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAoYm1jc3QpIHsKLQkJc3Bpbl9sb2NrX2JoKCZwc3RhLT5zbGVlcF9xLmxvY2spOwotCi0JCWlmIChwc3RhcHJpdi0+c3RhX2R6X2JpdG1hcCkgewotCQkJLyogaWYgYW55b25lIHN0YSBpcyBpbiBwcyBtb2RlICovCi0JCQlsaXN0X2RlbF9pbml0KCZweG1pdGZyYW1lLT5saXN0KTsKLQotCQkJLyogc3Bpbl9sb2NrX2JoKCZwc3RhLT5zbGVlcF9xLmxvY2spOyAqLwotCi0JCQlsaXN0X2FkZF90YWlsKCZweG1pdGZyYW1lLT5saXN0LCBnZXRfbGlzdF9oZWFkKCZwc3RhLT5zbGVlcF9xKSk7Ci0KLQkJCXBzdGEtPnNsZWVwcV9sZW4rKzsKLQotCQkJcHN0YXByaXYtPnRpbV9iaXRtYXAgfD0gQklUKDApOy8qICAqLwotCQkJcHN0YXByaXYtPnN0YV9kel9iaXRtYXAgfD0gQklUKDApOwotCi0JCQkvKiBEQkdfODcyM0EoImVucXVldWUsIHNxX2xlbiA9JWQsIHRpbSA9JXhcbiIsIHBzdGEtPnNsZWVwcV9sZW4sIHBzdGFwcml2LT50aW1fYml0bWFwKTsgKi8KLQotCQkJLyogdHggYmMvbWMgcGFja2V0cyBhZnRlciB1cGRhdGUgYmNuICovCi0JCQl1cGRhdGVfYmVhY29uMjNhKHBhZGFwdGVyLCBXTEFOX0VJRF9USU0sIE5VTEwsIGZhbHNlKTsKLQotCQkJLyogc3Bpbl91bmxvY2tfYmgoJnBzdGEtPnNsZWVwX3EubG9jayk7ICovCi0KLQkJCXJldCA9IHRydWU7Ci0KLQkJfQotCi0JCXNwaW5fdW5sb2NrX2JoKCZwc3RhLT5zbGVlcF9xLmxvY2spOwotCi0JCXJldHVybiByZXQ7Ci0KLQl9Ci0KLQlzcGluX2xvY2tfYmgoJnBzdGEtPnNsZWVwX3EubG9jayk7Ci0KLQlpZiAocHN0YS0+c3RhdGUmV0lGSV9TTEVFUF9TVEFURSkgewotCQl1OCB3bW1wc19hYyA9IDA7Ci0KLQkJaWYgKHBzdGFwcml2LT5zdGFfZHpfYml0bWFwICYgQ0hLQklUKHBzdGEtPmFpZCkpIHsKLQkJCWxpc3RfZGVsX2luaXQoJnB4bWl0ZnJhbWUtPmxpc3QpOwotCi0JCQkvKiBzcGluX2xvY2tfYmgoJnBzdGEtPnNsZWVwX3EubG9jayk7ICovCi0KLQkJCWxpc3RfYWRkX3RhaWwoJnB4bWl0ZnJhbWUtPmxpc3QsIGdldF9saXN0X2hlYWQoJnBzdGEtPnNsZWVwX3EpKTsKLQotCQkJcHN0YS0+c2xlZXBxX2xlbisrOwotCi0JCQlzd2l0Y2ggKHBhdHRyaWItPnByaW9yaXR5KSB7Ci0JCQljYXNlIDE6Ci0JCQljYXNlIDI6Ci0JCQkJd21tcHNfYWMgPSBwc3RhLT51YXBzZF9iayAmIEJJVCgwKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNDoKLQkJCWNhc2UgNToKLQkJCQl3bW1wc19hYyA9IHBzdGEtPnVhcHNkX3ZpICYgQklUKDApOwotCQkJCWJyZWFrOwotCQkJY2FzZSA2OgotCQkJY2FzZSA3OgotCQkJCXdtbXBzX2FjID0gcHN0YS0+dWFwc2Rfdm8gJiBCSVQoMCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDA6Ci0JCQljYXNlIDM6Ci0JCQlkZWZhdWx0OgotCQkJCXdtbXBzX2FjID0gcHN0YS0+dWFwc2RfYmUgJiBCSVQoMCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmICh3bW1wc19hYykKLQkJCQlwc3RhLT5zbGVlcHFfYWNfbGVuKys7Ci0KLQkJCWlmICgoKHBzdGEtPmhhc19sZWdhY3lfYWMpICYmICghd21tcHNfYWMpKSB8fAotCQkJICAgKCghcHN0YS0+aGFzX2xlZ2FjeV9hYykgJiYgKHdtbXBzX2FjKSkpIHsKLQkJCQlwc3RhcHJpdi0+dGltX2JpdG1hcCB8PSBDSEtCSVQocHN0YS0+YWlkKTsKLQotCQkJCWlmIChwc3RhLT5zbGVlcHFfbGVuID09IDEpIHsKLQkJCQkJLyogdXBkYXRlIEJDTiBmb3IgVElNIElFICovCi0JCQkJCXVwZGF0ZV9iZWFjb24yM2EocGFkYXB0ZXIsIFdMQU5fRUlEX1RJTSwKLQkJCQkJCQkgTlVMTCwgZmFsc2UpOwotCQkJCX0KLQkJCX0KLQotCQkJLyogc3Bpbl91bmxvY2tfYmgoJnBzdGEtPnNsZWVwX3EubG9jayk7ICovCi0KLQkJCS8qIGlmIChwc3RhLT5zbGVlcHFfbGVuID4gKE5SX1hNSVRGUkFNRT4+MykpICovCi0JCQkvKiAgKi8KLQkJCS8qCXdha2V1cF9zdGFfdG9feG1pdDIzYShwYWRhcHRlciwgcHN0YSk7ICovCi0JCQkvKiAgKi8KLQotCQkJcmV0ID0gdHJ1ZTsKLQotCQl9Ci0KLQl9Ci0KLQlzcGluX3VubG9ja19iaCgmcHN0YS0+c2xlZXBfcS5sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZXF1ZXVlX3htaXRmcmFtZXNfdG9fc2xlZXBpbmdfcXVldWUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSwKLQkJCQkgICAgIHN0cnVjdCBydHdfcXVldWUgKnBmcmFtZXF1ZXVlKQotewotCWludCByZXQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0JdTggYWNfaW5kZXg7Ci0Jc3RydWN0IHR4X3NlcnZxCSpwdHhzZXJ2cTsKLQlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYjsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSwgKnB0bXA7Ci0Jc3RydWN0IGh3X3htaXQgKnBod3htaXRzID0gcGFkYXB0ZXItPnhtaXRwcml2Lmh3eG1pdHM7Ci0KLQlwaGVhZCA9IGdldF9saXN0X2hlYWQocGZyYW1lcXVldWUpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShweG1pdGZyYW1lLCBwdG1wLCBwaGVhZCwgbGlzdCkgewotCQlyZXQgPSB4bWl0ZnJhbWVfZW5xdWV1ZV9mb3Jfc2xlZXBpbmdfc3RhMjNhKHBhZGFwdGVyLCBweG1pdGZyYW1lKTsKLQotCQlpZiAocmV0ID09IHRydWUpIHsKLQkJCXBhdHRyaWIgPSAmcHhtaXRmcmFtZS0+YXR0cmliOwotCi0JCQlwdHhzZXJ2cSA9IHJ0d19nZXRfc3RhX3BlbmRpbmcyM2EocGFkYXB0ZXIsIHBzdGEsIHBhdHRyaWItPnByaW9yaXR5LCAodTggKikoJmFjX2luZGV4KSk7Ci0KLQkJCXB0eHNlcnZxLT5xY250LS07Ci0JCQlwaHd4bWl0c1thY19pbmRleF0uYWNjbnQtLTsKLQkJfSBlbHNlIHsKLQkJCS8qIERCR184NzIzQSgieG1pdGZyYW1lX2VucXVldWVfZm9yX3NsZWVwaW5nX3N0YTIzYSByZXR1cm4gZmFsc2VcbiIpOyAqLwotCQl9Ci0JfQotfQotCi12b2lkIHN0b3Bfc3RhX3htaXQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKQotewotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YV9ibWM7Ci0Jc3RydWN0IHN0YV94bWl0X3ByaXYgKnBzdGF4bWl0cHJpdjsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0KLQlwc3RheG1pdHByaXYgPSAmcHN0YS0+c3RhX3htaXRwcml2OwotCi0JLyogZm9yIEJDL01DIEZyYW1lcyAqLwotCXBzdGFfYm1jID0gcnR3X2dldF9iY21jX3N0YWluZm8yM2EocGFkYXB0ZXIpOwotCi0Jc3Bpbl9sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwotCi0JcHN0YS0+c3RhdGUgfD0gV0lGSV9TTEVFUF9TVEFURTsKLQotCXBzdGFwcml2LT5zdGFfZHpfYml0bWFwIHw9IENIS0JJVChwc3RhLT5haWQpOwotCi0JZGVxdWV1ZV94bWl0ZnJhbWVzX3RvX3NsZWVwaW5nX3F1ZXVlKHBhZGFwdGVyLCBwc3RhLCAmcHN0YXhtaXRwcml2LT52b19xLnN0YV9wZW5kaW5nKTsKLQlsaXN0X2RlbF9pbml0KCZwc3RheG1pdHByaXYtPnZvX3EudHhfcGVuZGluZyk7Ci0KLQlkZXF1ZXVlX3htaXRmcmFtZXNfdG9fc2xlZXBpbmdfcXVldWUocGFkYXB0ZXIsIHBzdGEsICZwc3RheG1pdHByaXYtPnZpX3Euc3RhX3BlbmRpbmcpOwotCWxpc3RfZGVsX2luaXQoJnBzdGF4bWl0cHJpdi0+dmlfcS50eF9wZW5kaW5nKTsKLQotCWRlcXVldWVfeG1pdGZyYW1lc190b19zbGVlcGluZ19xdWV1ZShwYWRhcHRlciwgcHN0YSwKLQkJCQkJICAgICAmcHN0YXhtaXRwcml2LT5iZV9xLnN0YV9wZW5kaW5nKTsKLQlsaXN0X2RlbF9pbml0KCZwc3RheG1pdHByaXYtPmJlX3EudHhfcGVuZGluZyk7Ci0KLQlkZXF1ZXVlX3htaXRmcmFtZXNfdG9fc2xlZXBpbmdfcXVldWUocGFkYXB0ZXIsIHBzdGEsCi0JCQkJCSAgICAgJnBzdGF4bWl0cHJpdi0+YmtfcS5zdGFfcGVuZGluZyk7Ci0JbGlzdF9kZWxfaW5pdCgmcHN0YXhtaXRwcml2LT5ia19xLnR4X3BlbmRpbmcpOwotCi0JLyogZm9yIEJDL01DIEZyYW1lcyAqLwotCXBzdGF4bWl0cHJpdiA9ICZwc3RhX2JtYy0+c3RhX3htaXRwcml2OwotCWRlcXVldWVfeG1pdGZyYW1lc190b19zbGVlcGluZ19xdWV1ZShwYWRhcHRlciwgcHN0YV9ibWMsCi0JCQkJCSAgICAgJnBzdGF4bWl0cHJpdi0+YmVfcS5zdGFfcGVuZGluZyk7Ci0JbGlzdF9kZWxfaW5pdCgmcHN0YXhtaXRwcml2LT5iZV9xLnR4X3BlbmRpbmcpOwotCi0Jc3Bpbl91bmxvY2tfYmgoJnB4bWl0cHJpdi0+bG9jayk7Ci19Ci0KLXZvaWQgd2FrZXVwX3N0YV90b194bWl0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSkKLXsKLQl1OCB1cGRhdGVfbWFzayA9IDAsIHdtbXBzX2FjID0gMDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGFfYm1jOwotCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkOwotCXN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lID0gTlVMTCwgKnB0bXA7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCi0Jc3Bpbl9sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwotCXBoZWFkID0gZ2V0X2xpc3RfaGVhZCgmcHN0YS0+c2xlZXBfcSk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB4bWl0ZnJhbWUsIHB0bXAsIHBoZWFkLCBsaXN0KSB7Ci0JCWxpc3RfZGVsX2luaXQoJnB4bWl0ZnJhbWUtPmxpc3QpOwotCi0JCXN3aXRjaCAocHhtaXRmcmFtZS0+YXR0cmliLnByaW9yaXR5KSB7Ci0JCWNhc2UgMToKLQkJY2FzZSAyOgotCQkJd21tcHNfYWMgPSBwc3RhLT51YXBzZF9iayAmIEJJVCgxKTsKLQkJCWJyZWFrOwotCQljYXNlIDQ6Ci0JCWNhc2UgNToKLQkJCXdtbXBzX2FjID0gcHN0YS0+dWFwc2RfdmkgJiBCSVQoMSk7Ci0JCQlicmVhazsKLQkJY2FzZSA2OgotCQljYXNlIDc6Ci0JCQl3bW1wc19hYyA9IHBzdGEtPnVhcHNkX3ZvICYgQklUKDEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMDoKLQkJY2FzZSAzOgotCQlkZWZhdWx0OgotCQkJd21tcHNfYWMgPSBwc3RhLT51YXBzZF9iZSAmIEJJVCgxKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcHN0YS0+c2xlZXBxX2xlbi0tOwotCQlpZiAocHN0YS0+c2xlZXBxX2xlbiA+IDApCi0JCQlweG1pdGZyYW1lLT5hdHRyaWIubWRhdGEgPSAxOwotCQllbHNlCi0JCQlweG1pdGZyYW1lLT5hdHRyaWIubWRhdGEgPSAwOwotCi0JCWlmICh3bW1wc19hYykgewotCQkJcHN0YS0+c2xlZXBxX2FjX2xlbi0tOwotCQkJaWYgKHBzdGEtPnNsZWVwcV9hY19sZW4gPiAwKSB7Ci0JCQkJcHhtaXRmcmFtZS0+YXR0cmliLm1kYXRhID0gMTsKLQkJCQlweG1pdGZyYW1lLT5hdHRyaWIuZW9zcCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCXB4bWl0ZnJhbWUtPmF0dHJpYi5tZGF0YSA9IDA7Ci0JCQkJcHhtaXRmcmFtZS0+YXR0cmliLmVvc3AgPSAxOwotCQkJfQotCQl9Ci0KLQkJcHhtaXRmcmFtZS0+YXR0cmliLnRyaWdnZXJlZCA9IDE7Ci0JCXJ0bDg3MjNhdV9oYWxfeG1pdGZyYW1lX2VucXVldWUocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpOwotCX0KLQotCWlmIChwc3RhLT5zbGVlcHFfbGVuID09IDApIHsKLQkJcHN0YXByaXYtPnRpbV9iaXRtYXAgJj0gfkNIS0JJVChwc3RhLT5haWQpOwotCi0JCS8qIHVwZGF0ZSBCQ04gZm9yIFRJTSBJRSAqLwotCQl1cGRhdGVfbWFzayA9IEJJVCgwKTsKLQotCQlpZiAocHN0YS0+c3RhdGUmV0lGSV9TTEVFUF9TVEFURSkKLQkJCXBzdGEtPnN0YXRlIF49IFdJRklfU0xFRVBfU1RBVEU7Ci0KLQkJaWYgKHBzdGEtPnN0YXRlICYgV0lGSV9TVEFfQUxJVkVfQ0hLX1NUQVRFKSB7Ci0JCQlwc3RhLT5leHBpcmVfdG8gPSBwc3RhcHJpdi0+ZXhwaXJlX3RvOwotCQkJcHN0YS0+c3RhdGUgXj0gV0lGSV9TVEFfQUxJVkVfQ0hLX1NUQVRFOwotCQl9Ci0KLQkJcHN0YXByaXYtPnN0YV9kel9iaXRtYXAgJj0gfkNIS0JJVChwc3RhLT5haWQpOwotCX0KLQkvKiBzcGluX3VubG9ja19iaCgmcHN0YS0+c2xlZXBfcS5sb2NrKTsgKi8KLQlzcGluX3VubG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLQotCS8qIGZvciBCQy9NQyBGcmFtZXMgKi8KLQlwc3RhX2JtYyA9IHJ0d19nZXRfYmNtY19zdGFpbmZvMjNhKHBhZGFwdGVyKTsKLQlpZiAoIXBzdGFfYm1jKQotCQlyZXR1cm47Ci0KLQlpZiAoKHBzdGFwcml2LT5zdGFfZHpfYml0bWFwJjB4ZmZmZSkgPT0gMHgwKSB7Ci0JCS8qIG5vIGFueSBzdGEgaW4gcHMgbW9kZSAqLwotCQlzcGluX2xvY2tfYmgoJnB4bWl0cHJpdi0+bG9jayk7Ci0JCXBoZWFkID0gZ2V0X2xpc3RfaGVhZCgmcHN0YV9ibWMtPnNsZWVwX3EpOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHhtaXRmcmFtZSwgcHRtcCwgcGhlYWQsIGxpc3QpIHsKLQkJCWxpc3RfZGVsX2luaXQoJnB4bWl0ZnJhbWUtPmxpc3QpOwotCi0JCQlwc3RhX2JtYy0+c2xlZXBxX2xlbi0tOwotCQkJaWYgKHBzdGFfYm1jLT5zbGVlcHFfbGVuID4gMCkKLQkJCQlweG1pdGZyYW1lLT5hdHRyaWIubWRhdGEgPSAxOwotCQkJZWxzZQotCQkJCXB4bWl0ZnJhbWUtPmF0dHJpYi5tZGF0YSA9IDA7Ci0KLQkJCXB4bWl0ZnJhbWUtPmF0dHJpYi50cmlnZ2VyZWQgPSAxOwotCQkJcnRsODcyM2F1X2hhbF94bWl0ZnJhbWVfZW5xdWV1ZShwYWRhcHRlciwgcHhtaXRmcmFtZSk7Ci0JCX0KLQkJaWYgKHBzdGFfYm1jLT5zbGVlcHFfbGVuID09IDApIHsKLQkJCXBzdGFwcml2LT50aW1fYml0bWFwICY9IH5CSVQoMCk7Ci0JCQlwc3RhcHJpdi0+c3RhX2R6X2JpdG1hcCAmPSB+QklUKDApOwotCi0JCQkvKiB1cGRhdGUgQkNOIGZvciBUSU0gSUUgKi8KLQkJCS8qIHVwZGF0ZV9CQ05USU0ocGFkYXB0ZXIpOyAqLwotCQkJdXBkYXRlX21hc2sgfD0gQklUKDEpOwotCQl9Ci0JCS8qIHNwaW5fdW5sb2NrX2JoKCZwc3RhX2JtYy0+c2xlZXBfcS5sb2NrKTsgKi8KLQkJc3Bpbl91bmxvY2tfYmgoJnB4bWl0cHJpdi0+bG9jayk7Ci0JfQotCi0JaWYgKHVwZGF0ZV9tYXNrKQotCQl1cGRhdGVfYmVhY29uMjNhKHBhZGFwdGVyLCBXTEFOX0VJRF9USU0sIE5VTEwsIGZhbHNlKTsKLX0KLQotdm9pZCB4bWl0X2RlbGl2ZXJ5X2VuYWJsZWRfZnJhbWVzMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0JdTggd21tcHNfYWMgPSAwOwotCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkOwotCXN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lLCAqcHRtcDsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0KLQkvKiBzcGluX2xvY2tfYmgoJnBzdGEtPnNsZWVwX3EubG9jayk7ICovCi0Jc3Bpbl9sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwotCXBoZWFkID0gZ2V0X2xpc3RfaGVhZCgmcHN0YS0+c2xlZXBfcSk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB4bWl0ZnJhbWUsIHB0bXAsIHBoZWFkLCBsaXN0KSB7Ci0JCXN3aXRjaCAocHhtaXRmcmFtZS0+YXR0cmliLnByaW9yaXR5KSB7Ci0JCWNhc2UgMToKLQkJY2FzZSAyOgotCQkJd21tcHNfYWMgPSBwc3RhLT51YXBzZF9iayAmIEJJVCgxKTsKLQkJCWJyZWFrOwotCQljYXNlIDQ6Ci0JCWNhc2UgNToKLQkJCXdtbXBzX2FjID0gcHN0YS0+dWFwc2RfdmkgJiBCSVQoMSk7Ci0JCQlicmVhazsKLQkJY2FzZSA2OgotCQljYXNlIDc6Ci0JCQl3bW1wc19hYyA9IHBzdGEtPnVhcHNkX3ZvICYgQklUKDEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMDoKLQkJY2FzZSAzOgotCQlkZWZhdWx0OgotCQkJd21tcHNfYWMgPSBwc3RhLT51YXBzZF9iZSAmIEJJVCgxKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKCF3bW1wc19hYykKLQkJCWNvbnRpbnVlOwotCi0JCWxpc3RfZGVsX2luaXQoJnB4bWl0ZnJhbWUtPmxpc3QpOwotCi0JCXBzdGEtPnNsZWVwcV9sZW4tLTsKLQkJcHN0YS0+c2xlZXBxX2FjX2xlbi0tOwotCi0JCWlmIChwc3RhLT5zbGVlcHFfYWNfbGVuID4gMCkgewotCQkJcHhtaXRmcmFtZS0+YXR0cmliLm1kYXRhID0gMTsKLQkJCXB4bWl0ZnJhbWUtPmF0dHJpYi5lb3NwID0gMDsKLQkJfSBlbHNlIHsKLQkJCXB4bWl0ZnJhbWUtPmF0dHJpYi5tZGF0YSA9IDA7Ci0JCQlweG1pdGZyYW1lLT5hdHRyaWIuZW9zcCA9IDE7Ci0JCX0KLQotCQlweG1pdGZyYW1lLT5hdHRyaWIudHJpZ2dlcmVkID0gMTsKLQotCQlydGw4NzIzYXVfaGFsX3htaXRmcmFtZV9lbnF1ZXVlKHBhZGFwdGVyLCBweG1pdGZyYW1lKTsKLQotCQlpZiAoKHBzdGEtPnNsZWVwcV9hY19sZW4gPT0gMCkgJiYgKCFwc3RhLT5oYXNfbGVnYWN5X2FjKSAmJgotCQkgICAgKHdtbXBzX2FjKSkgewotCQkJcHN0YXByaXYtPnRpbV9iaXRtYXAgJj0gfkNIS0JJVChwc3RhLT5haWQpOwotCi0JCQkvKiB1cGRhdGUgQkNOIGZvciBUSU0gSUUgKi8KLQkJCXVwZGF0ZV9iZWFjb24yM2EocGFkYXB0ZXIsIFdMQU5fRUlEX1RJTSwgTlVMTCwgZmFsc2UpOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwotfQotCi0jZW5kaWYKLQotdm9pZCBydHdfc2N0eF9pbml0MjNhKHN0cnVjdCBzdWJtaXRfY3R4ICpzY3R4LCBpbnQgdGltZW91dF9tcykKLXsKLQlzY3R4LT50aW1lb3V0X21zID0gdGltZW91dF9tczsKLQlpbml0X2NvbXBsZXRpb24oJnNjdHgtPmRvbmUpOwotCXNjdHgtPnN0YXR1cyA9IFJUV19TQ1RYX1NVQk1JVFRFRDsKLX0KLQotaW50IHJ0d19zY3R4X3dhaXQyM2Eoc3RydWN0IHN1Ym1pdF9jdHggKnNjdHgpCi17Ci0JaW50IHJldCA9IF9GQUlMOwotCXVuc2lnbmVkIGxvbmcgZXhwaXJlOwotCWludCBzdGF0dXMgPSAwOwotCi0JZXhwaXJlID0gc2N0eC0+dGltZW91dF9tcyA/IG1zZWNzX3RvX2ppZmZpZXMoc2N0eC0+dGltZW91dF9tcykgOgotCQkgTUFYX1NDSEVEVUxFX1RJTUVPVVQ7Ci0JaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnNjdHgtPmRvbmUsIGV4cGlyZSkpIHsKLQkJLyogdGltZW91dCwgZG8gc29tZXRoaW5nPz8gKi8KLQkJc3RhdHVzID0gUlRXX1NDVFhfRE9ORV9USU1FT1VUOwotCQlEQkdfODcyM0EoIiVzIHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKLQl9IGVsc2UgewotCQlzdGF0dXMgPSBzY3R4LT5zdGF0dXM7Ci0JfQotCi0JaWYgKHN0YXR1cyA9PSBSVFdfU0NUWF9ET05FX1NVQ0NFU1MpCi0JCXJldCA9IF9TVUNDRVNTOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGJvb2wgcnR3X3NjdHhfY2hrX3dhcmluZ19zdGF0dXMoaW50IHN0YXR1cykKLXsKLQlzd2l0Y2ggKHN0YXR1cykgewotCWNhc2UgUlRXX1NDVFhfRE9ORV9VTktOT1dOOgotCWNhc2UgUlRXX1NDVFhfRE9ORV9CVUZfQUxMT0M6Ci0JY2FzZSBSVFdfU0NUWF9ET05FX0JVRl9GUkVFOgotCWNhc2UgUlRXX1NDVFhfRE9ORV9EUlZfU1RPUDoKLQljYXNlIFJUV19TQ1RYX0RPTkVfREVWX1JFTU9WRToKLQkJcmV0dXJuIHRydWU7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KLQotdm9pZCBydHcyM2Ffc2N0eF9kb25lX2VycihzdHJ1Y3Qgc3VibWl0X2N0eCAqKnNjdHgsIGludCBzdGF0dXMpCi17Ci0JaWYgKCpzY3R4KSB7Ci0JCWlmIChydHdfc2N0eF9jaGtfd2FyaW5nX3N0YXR1cyhzdGF0dXMpKQotCQkJREJHXzg3MjNBKCIlcyBzdGF0dXM6JWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwotCQkoKnNjdHgpLT5zdGF0dXMgPSBzdGF0dXM7Ci0JCWNvbXBsZXRlKCYoKnNjdHgpLT5kb25lKTsKLQkJKnNjdHggPSBOVUxMOwotCX0KLX0KLQotaW50IHJ0d19hY2tfdHhfd2FpdDIzYShzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYsIHUzMiB0aW1lb3V0X21zKQotewotCXN0cnVjdCBzdWJtaXRfY3R4ICpwYWNrX3R4X29wcyA9ICZweG1pdHByaXYtPmFja190eF9vcHM7Ci0KLQlwYWNrX3R4X29wcy0+dGltZW91dF9tcyA9IHRpbWVvdXRfbXM7Ci0JcGFja190eF9vcHMtPnN0YXR1cyA9IFJUV19TQ1RYX1NVQk1JVFRFRDsKLQotCXJldHVybiBydHdfc2N0eF93YWl0MjNhKHBhY2tfdHhfb3BzKTsKLX0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsODcyM1B3clNlcS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsODcyM1B3clNlcS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDdmODZjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbDg3MjNQd3JTZXEuYworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiSGFsODcyM1B3clNlcS5oIgotCi0vKgotICAgIGRyaXZlcnMgc2hvdWxkIHBhcnNlIGJlbG93IGFycmF5cyBhbmQgZG8gdGhlIGNvcnJlc3BvbmRpbmcgYWN0aW9ucwotKi8KLS8qIDMgUG93ZXIgb24gIEFycmF5ICovCi1zdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg3MjNBVV9wb3dlcl9vbl9mbG93W1JUTDg3MjNBX1RSQU5TX0NBUkRFTVVfVE9fQUNUX1NURVBTK1JUTDg3MjNBX1RSQU5TX0VORF9TVEVQU10gPSB7Ci0JUlRMODcyM0FfVFJBTlNfQ0FSREVNVV9UT19BQ1QKLQlSVEw4NzIzQV9UUkFOU19FTkQKLX07Ci0KLS8qIDMgUmFkaW8gb2ZmIEdQSU8gQXJyYXkgKi8KLXN0cnVjdCB3bGFuX3B3cl9jZmcgcnRsODcyM0FVX3JhZGlvX29mZl9mbG93W1JUTDg3MjNBX1RSQU5TX0FDVF9UT19DQVJERU1VX1NURVBTK1JUTDg3MjNBX1RSQU5TX0VORF9TVEVQU10gPSB7Ci0JUlRMODcyM0FfVFJBTlNfQUNUX1RPX0NBUkRFTVUKLQlSVEw4NzIzQV9UUkFOU19FTkQKLX07Ci0KLS8qIDMgQ2FyZCBEaXNhYmxlIEFycmF5ICovCi1zdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg3MjNBVV9jYXJkX2Rpc2FibGVfZmxvd1tSVEw4NzIzQV9UUkFOU19BQ1RfVE9fQ0FSREVNVV9TVEVQUytSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX1BETl9TVEVQUytSVEw4NzIzQV9UUkFOU19FTkRfU1RFUFNdID0gewotCVJUTDg3MjNBX1RSQU5TX0FDVF9UT19DQVJERU1VCi0JUlRMODcyM0FfVFJBTlNfQ0FSREVNVV9UT19DQVJERElTCi0JUlRMODcyM0FfVFJBTlNfRU5ECi19OwotCi0vKiAzIENhcmQgRW5hYmxlIEFycmF5ICovCi1zdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg3MjNBVV9jYXJkX2VuYWJsZV9mbG93W1JUTDg3MjNBX1RSQU5TX0FDVF9UT19DQVJERU1VX1NURVBTK1JUTDg3MjNBX1RSQU5TX0NBUkRFTVVfVE9fUEROX1NURVBTK1JUTDg3MjNBX1RSQU5TX0VORF9TVEVQU10gPSB7Ci0JUlRMODcyM0FfVFJBTlNfQ0FSRERJU19UT19DQVJERU1VCi0JUlRMODcyM0FfVFJBTlNfQ0FSREVNVV9UT19BQ1QKLQlSVEw4NzIzQV9UUkFOU19FTkQKLX07Ci0KLS8qIDMgU3VzcGVuZCBBcnJheSAqLwotc3RydWN0IHdsYW5fcHdyX2NmZyBydGw4NzIzQVVfc3VzcGVuZF9mbG93W1JUTDg3MjNBX1RSQU5TX0FDVF9UT19DQVJERU1VX1NURVBTK1JUTDg3MjNBX1RSQU5TX0NBUkRFTVVfVE9fU1VTX1NURVBTK1JUTDg3MjNBX1RSQU5TX0VORF9TVEVQU10gPSB7Ci0JUlRMODcyM0FfVFJBTlNfQUNUX1RPX0NBUkRFTVUKLQlSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX1NVUwotCVJUTDg3MjNBX1RSQU5TX0VORAotfTsKLQotLyogMyBSZXN1bWUgQXJyYXkgKi8KLXN0cnVjdCB3bGFuX3B3cl9jZmcgcnRsODcyM0FVX3Jlc3VtZV9mbG93W1JUTDg3MjNBX1RSQU5TX0FDVF9UT19DQVJERU1VX1NURVBTK1JUTDg3MjNBX1RSQU5TX0NBUkRFTVVfVE9fU1VTX1NURVBTK1JUTDg3MjNBX1RSQU5TX0VORF9TVEVQU10gPSB7Ci0JUlRMODcyM0FfVFJBTlNfU1VTX1RPX0NBUkRFTVUKLQlSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX0FDVAotCVJUTDg3MjNBX1RSQU5TX0VORAotfTsKLQotLyogMyBIV1BETiBBcnJheSAqLwotc3RydWN0IHdsYW5fcHdyX2NmZyBydGw4NzIzQVVfaHdwZG5fZmxvd1tSVEw4NzIzQV9UUkFOU19BQ1RfVE9fQ0FSREVNVV9TVEVQUytSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX1BETl9TVEVQUytSVEw4NzIzQV9UUkFOU19FTkRfU1RFUFNdID0gewotCVJUTDg3MjNBX1RSQU5TX0FDVF9UT19DQVJERU1VCi0JUlRMODcyM0FfVFJBTlNfQ0FSREVNVV9UT19QRE4KLQlSVEw4NzIzQV9UUkFOU19FTkQKLX07Ci0KLS8qIDMgRW50ZXIgTFBTICovCi1zdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg3MjNBVV9lbnRlcl9scHNfZmxvd1tSVEw4NzIzQV9UUkFOU19BQ1RfVE9fTFBTX1NURVBTK1JUTDg3MjNBX1RSQU5TX0VORF9TVEVQU10gPSB7Ci0JLyogRlcgYmVoYXZpb3IgKi8KLQlSVEw4NzIzQV9UUkFOU19BQ1RfVE9fTFBTCi0JUlRMODcyM0FfVFJBTlNfRU5ECi19OwotCi0vKiAzIExlYXZlIExQUyAqLwotc3RydWN0IHdsYW5fcHdyX2NmZyBydGw4NzIzQVVfbGVhdmVfbHBzX2Zsb3dbUlRMODcyM0FfVFJBTlNfTFBTX1RPX0FDVF9TVEVQUytSVEw4NzIzQV9UUkFOU19FTkRfU1RFUFNdID0gewotCS8qIEZXIGJlaGF2aW9yICovCi0JUlRMODcyM0FfVFJBTlNfTFBTX1RPX0FDVAotCVJUTDg3MjNBX1RSQU5TX0VORAotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbDg3MjNVSFdJbWdfQ0UuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbDg3MjNVSFdJbWdfQ0UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4MzNkYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWw4NzIzVUhXSW1nX0NFLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qQ3JlYXRlZCBvbiAgMjAxMy8wMS8xNCwgMTU6NTEqLwotI2luY2x1ZGUgIm9kbV9wcmVjb21wLmgiCi0KLXUzMiBSdGw4NzIzVVBIWV9SRUdfQXJyYXlfUEdbUnRsODcyM1VQSFlfUkVHX0FycmF5X1BHTGVuZ3RoXSA9IHsKLQkweGUwMCwgMHhmZmZmZmZmZiwgMHgwYTBjMGMwYywKLQkweGUwNCwgMHhmZmZmZmZmZiwgMHgwMjA0MDYwOCwKLQkweGUwOCwgMHgwMDAwZmYwMCwgMHgwMDAwMDAwMCwKLQkweDg2YywgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKLQkweGUxMCwgMHhmZmZmZmZmZiwgMHgwYTBjMGQwZSwKLQkweGUxNCwgMHhmZmZmZmZmZiwgMHgwMjA0MDYwOCwKLQkweGUxOCwgMHhmZmZmZmZmZiwgMHgwYTBjMGQwZSwKLQkweGUxYywgMHhmZmZmZmZmZiwgMHgwMjA0MDYwOCwKLQkweDgzMCwgMHhmZmZmZmZmZiwgMHgwYTBjMGMwYywKLQkweDgzNCwgMHhmZmZmZmZmZiwgMHgwMjA0MDYwOCwKLQkweDgzOCwgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKLQkweDg2YywgMHgwMDAwMDBmZiwgMHgwMDAwMDAwMCwKLQkweDgzYywgMHhmZmZmZmZmZiwgMHgwYTBjMGQwZSwKLQkweDg0OCwgMHhmZmZmZmZmZiwgMHgwMjA0MDYwOCwKLQkweDg0YywgMHhmZmZmZmZmZiwgMHgwYTBjMGQwZSwKLQkweDg2OCwgMHhmZmZmZmZmZiwgMHgwMjA0MDYwOCwKLQkweGUwMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUwNCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUwOCwgMHgwMDAwZmYwMCwgMHgwMDAwMDAwMCwKLQkweDg2YywgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKLQkweGUxMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUxNCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUxOCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUxYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDgzMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDgzNCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDgzOCwgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKLQkweDg2YywgMHgwMDAwMDBmZiwgMHgwMDAwMDAwMCwKLQkweDgzYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDg0OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDg0YywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDg2OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUwMCwgMHhmZmZmZmZmZiwgMHgwNDA0MDQwNCwKLQkweGUwNCwgMHhmZmZmZmZmZiwgMHgwMDAyMDIwNCwKLQkweGUwOCwgMHgwMDAwZmYwMCwgMHgwMDAwMDAwMCwKLQkweDg2YywgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKLQkweGUxMCwgMHhmZmZmZmZmZiwgMHgwNjA2MDYwNiwKLQkweGUxNCwgMHhmZmZmZmZmZiwgMHgwMDAyMDQwNiwKLQkweGUxOCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUxYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDgzMCwgMHhmZmZmZmZmZiwgMHgwNDA0MDQwNCwKLQkweDgzNCwgMHhmZmZmZmZmZiwgMHgwMDAyMDIwNCwKLQkweDgzOCwgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKLQkweDg2YywgMHgwMDAwMDBmZiwgMHgwMDAwMDAwMCwKLQkweDgzYywgMHhmZmZmZmZmZiwgMHgwNjA2MDYwNiwKLQkweDg0OCwgMHhmZmZmZmZmZiwgMHgwMDAyMDQwNiwKLQkweDg0YywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDg2OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUwMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUwNCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUwOCwgMHgwMDAwZmYwMCwgMHgwMDAwMDAwMCwKLQkweDg2YywgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKLQkweGUxMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUxNCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUxOCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUxYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDgzMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDgzNCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDgzOCwgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKLQkweDg2YywgMHgwMDAwMDBmZiwgMHgwMDAwMDAwMCwKLQkweDgzYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDg0OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDg0YywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDg2OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUwMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUwNCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUwOCwgMHgwMDAwZmYwMCwgMHgwMDAwMDAwMCwKLQkweDg2YywgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKLQkweGUxMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUxNCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUxOCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUxYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDgzMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDgzNCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDgzOCwgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKLQkweDg2YywgMHgwMDAwMDBmZiwgMHgwMDAwMDAwMCwKLQkweDgzYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDg0OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDg0YywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDg2OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUwMCwgMHhmZmZmZmZmZiwgMHgwNDA0MDQwNCwKLQkweGUwNCwgMHhmZmZmZmZmZiwgMHgwMDAyMDIwNCwKLQkweGUwOCwgMHgwMDAwZmYwMCwgMHgwMDAwMDAwMCwKLQkweDg2YywgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKLQkweGUxMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUxNCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUxOCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUxYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDgzMCwgMHhmZmZmZmZmZiwgMHgwNDA0MDQwNCwKLQkweDgzNCwgMHhmZmZmZmZmZiwgMHgwMDAyMDIwNCwKLQkweDgzOCwgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKLQkweDg2YywgMHgwMDAwMDBmZiwgMHgwMDAwMDAwMCwKLQkweDgzYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDg0OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDg0YywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDg2OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUwMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUwNCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUwOCwgMHgwMDAwZmYwMCwgMHgwMDAwMDAwMCwKLQkweDg2YywgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKLQkweGUxMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUxNCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUxOCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweGUxYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDgzMCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDgzNCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDgzOCwgMHhmZmZmZmYwMCwgMHgwMDAwMDAwMCwKLQkweDg2YywgMHgwMDAwMDBmZiwgMHgwMDAwMDAwMCwKLQkweDgzYywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDg0OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDg0YywgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQkweDg2OCwgMHhmZmZmZmZmZiwgMHgwMDAwMDAwMCwKLQl9OwotCi11MzIgUnRsODcyM1VNQUNQSFlfQXJyYXlfUEdbUnRsODcyM1VNQUNQSFlfQXJyYXlfUEdMZW5ndGhdID0gewotCTB4MCwKLX07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWxETU91dFNyYzg3MjNBX0NFLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWxETU91dFNyYzg3MjNBX0NFLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmOWVjOWUwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbERNT3V0U3JjODcyM0FfQ0UuYworKysgL2Rldi9udWxsCkBAIC0xLDEwOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgRGVzY3JpcHRpb246ICovCi0vKiAgVGhpcyBmaWxlIGlzIGZvciA5MkNFLzkyQ1UgZHluYW1pYyBtZWNoYW5pc20gb25seSAqLwotCi0vKiAgaW5jbHVkZSBmaWxlcyAqLwotCi0jaW5jbHVkZSAib2RtX3ByZWNvbXAuaCIKLSNpbmNsdWRlIDx1c2Jfb3BzX2xpbnV4Lmg+Ci0KLSNkZWZpbmUJCURQS19ERUxUQV9NQVBQSU5HX05VTQkxMwotI2RlZmluZQkJaW5kZXhfbWFwcGluZ19IUF9OVU0JMTUKLS8qIDA5MTIxMiBjaGl5b2tvbGluICovCi1zdGF0aWMgdm9pZAotb2RtX1RYUG93ZXJUcmFja2luZ0NhbGxiYWNrX1RoZXJtYWxNZXRlcl85MkMoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0Jc3RydWN0IGRtX3ByaXYgKnBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKLQl1OCBUaGVybWFsVmFsdWUgPSAwLCBkZWx0YSwgZGVsdGFfTENLLCBkZWx0YV9JUUssIGRlbHRhX0hQOwotCWludCBlbGVfQSwgZWxlX0QsIFRlbXBDQ2ssIFgsIHZhbHVlMzI7Ci0JaW50IFksIGVsZV9DOwotCXM4IE9GRE1faW5kZXhbMl0sIENDS19pbmRleCA9IDAsIE9GRE1faW5kZXhfb2xkWzJdID0gezB9OwotCXM4IENDS19pbmRleF9vbGQgPSAwOwotCWludCBpID0gMDsKLQl1OCBPRkRNX21pbl9pbmRleCA9IDYsIHJmOyAvKiBPRkRNIEJCIFN3aW5nIHNob3VsZCBiZSBsZXNzIHRoYW4gKzMuMGRCKi8KLQl1OCBUaGVybWFsVmFsdWVfSFBfY291bnQgPSAwOwotCXUzMiBUaGVybWFsVmFsdWVfSFAgPSAwOwotCXMzMiBpbmRleF9tYXBwaW5nX0hQW2luZGV4X21hcHBpbmdfSFBfTlVNXSA9IHsKLQkJMCwgMSwgMywgNCwgNiwKLQkJNywgOSwgMTAsIDEyLCAxMywKLQkJMTUsIDE2LCAxOCwgMTksIDIxCi0JfTsKLQlzOCBpbmRleF9IUDsKLQotCXBkbXByaXYtPlRYUG93ZXJUcmFja2luZ0NhbGxiYWNrQ250Kys7CS8qIGNvc2EgYWRkIGZvciBkZWJ1ZyAqLwotCXBkbXByaXYtPmJUWFBvd2VyVHJhY2tpbmdJbml0ID0gdHJ1ZTsKLQotCWlmIChwSGFsRGF0YS0+Q3VycmVudENoYW5uZWwgPT0gMTQgJiYgIXBkbXByaXYtPmJDQ0tpbkNIMTQpCi0JCXBkbXByaXYtPmJDQ0tpbkNIMTQgPSB0cnVlOwotCWVsc2UgaWYgKHBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbCAhPSAxNCAmJiBwZG1wcml2LT5iQ0NLaW5DSDE0KQotCQlwZG1wcml2LT5iQ0NLaW5DSDE0ID0gZmFsc2U7Ci0KLQlUaGVybWFsVmFsdWUgPSAodTgpUEhZX1F1ZXJ5UkZSZWcoQWRhcHRlciwgUkZfUEFUSF9BLCBSRl9UX01FVEVSLAotCQkJCQkgIDB4MWYpOy8qICAweDI0OiBSRiBSZWdbNDowXQkgKi8KLQotCXJ0bDg3MjNhX3BoeV9hcF9jYWxpYnJhdGUoQWRhcHRlciwgKFRoZXJtYWxWYWx1ZSAtCi0JCQkJICBwSGFsRGF0YS0+RUVQUk9NVGhlcm1hbE1ldGVyKSk7Ci0KLQlpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gUkZfMlQyUikKLQkJcmYgPSAyOwotCWVsc2UKLQkJcmYgPSAxOwotCi0JaWYgKFRoZXJtYWxWYWx1ZSkgewotCQkvKiBRdWVyeSBPRkRNIHBhdGggQSBkZWZhdWx0IHNldHRpbmcJICovCi0JCWVsZV9EID0gcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCByT0ZETTBfWEFUeElRSW1iYWxhbmNlKSAmCi0JCQliTWFza09GRE1fRDsKLQkJZm9yIChpID0gMDsgaSA8IE9GRE1fVEFCTEVfU0laRV85MkM7IGkrKykgewotCQkJLyogZmluZCB0aGUgaW5kZXggKi8KLQkJCWlmIChlbGVfRCA9PSAoT0ZETVN3aW5nVGFibGUyM0FbaV0mYk1hc2tPRkRNX0QpKSB7Ci0JCQkJT0ZETV9pbmRleF9vbGRbMF0gPSAodTgpaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCS8qIFF1ZXJ5IE9GRE0gcGF0aCBCIGRlZmF1bHQgc2V0dGluZyAgKi8KLQkJaWYgKHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzJUMlIpIHsKLQkJCWVsZV9EID0gcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLAotCQkJCQkJIHJPRkRNMF9YQlR4SVFJbWJhbGFuY2UpOwotCQkJZWxlX0QgJj0gYk1hc2tPRkRNX0Q7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgT0ZETV9UQUJMRV9TSVpFXzkyQzsgaSsrKSB7CS8qIGZpbmQgdGhlIGluZGV4ICAqLwotCQkJCWlmIChlbGVfRCA9PSAoT0ZETVN3aW5nVGFibGUyM0FbaV0mYk1hc2tPRkRNX0QpKSB7Ci0JCQkJCU9GRE1faW5kZXhfb2xkWzFdID0gKHU4KWk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qIFF1ZXJ5IENDSyBkZWZhdWx0IHNldHRpbmcgRnJvbSAweGEyNCAqLwotCQlUZW1wQ0NrID0gcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCByQ0NLMF9UeEZpbHRlcjIpICYgYk1hc2tDQ0s7Ci0JCWZvciAoaSA9IDAgOyBpIDwgQ0NLX1RBQkxFX1NJWkUgOyBpKyspIHsKLQkJCWlmIChwZG1wcml2LT5iQ0NLaW5DSDE0KSB7Ci0JCQkJaWYgKCFtZW1jbXAoJlRlbXBDQ2ssCi0JCQkJCSAgICAmQ0NLU3dpbmdUYWJsZV9DaDE0MjNBW2ldWzJdLCA0KSkgewotCQkJCQlDQ0tfaW5kZXhfb2xkID0gKHU4KWk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCFtZW1jbXAoJlRlbXBDQ2ssCi0JCQkJCSAgICAmQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxMzIzQVtpXVsyXSwgNCkpIHsKLQkJCQkJQ0NLX2luZGV4X29sZCA9ICh1OClpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIXBkbXByaXYtPlRoZXJtYWxWYWx1ZSkgewotCQkJcGRtcHJpdi0+VGhlcm1hbFZhbHVlID0gcEhhbERhdGEtPkVFUFJPTVRoZXJtYWxNZXRlcjsKLQkJCXBkbXByaXYtPlRoZXJtYWxWYWx1ZV9MQ0sgPSBUaGVybWFsVmFsdWU7Ci0JCQlwZG1wcml2LT5UaGVybWFsVmFsdWVfSVFLID0gVGhlcm1hbFZhbHVlOwotCQkJcGRtcHJpdi0+VGhlcm1hbFZhbHVlX0RQSyA9IHBIYWxEYXRhLT5FRVBST01UaGVybWFsTWV0ZXI7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCByZjsgaSsrKSB7Ci0JCQkJcGRtcHJpdi0+T0ZETV9pbmRleF9IUFtpXSA9IE9GRE1faW5kZXhfb2xkW2ldOwotCQkJCXBkbXByaXYtPk9GRE1faW5kZXhbaV0gPSBPRkRNX2luZGV4X29sZFtpXTsKLQkJCX0KLQkJCXBkbXByaXYtPkNDS19pbmRleF9IUCA9IENDS19pbmRleF9vbGQ7Ci0JCQlwZG1wcml2LT5DQ0tfaW5kZXggPSBDQ0tfaW5kZXhfb2xkOwotCQl9Ci0KLQkJaWYgKHBIYWxEYXRhLT5Cb2FyZFR5cGUgPT0gQk9BUkRfVVNCX0hpZ2hfUEEpIHsKLQkJCXBkbXByaXYtPlRoZXJtYWxWYWx1ZV9IUFtwZG1wcml2LT5UaGVybWFsVmFsdWVfSFBfaW5kZXhdID0gVGhlcm1hbFZhbHVlOwotCQkJcGRtcHJpdi0+VGhlcm1hbFZhbHVlX0hQX2luZGV4Kys7Ci0JCQlpZiAocGRtcHJpdi0+VGhlcm1hbFZhbHVlX0hQX2luZGV4ID09IEhQX1RIRVJNQUxfTlVNKQotCQkJCXBkbXByaXYtPlRoZXJtYWxWYWx1ZV9IUF9pbmRleCA9IDA7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCBIUF9USEVSTUFMX05VTTsgaSsrKSB7Ci0JCQkJaWYgKHBkbXByaXYtPlRoZXJtYWxWYWx1ZV9IUFtpXSkgewotCQkJCQlUaGVybWFsVmFsdWVfSFAgKz0gcGRtcHJpdi0+VGhlcm1hbFZhbHVlX0hQW2ldOwotCQkJCQlUaGVybWFsVmFsdWVfSFBfY291bnQrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChUaGVybWFsVmFsdWVfSFBfY291bnQpCi0JCQkJVGhlcm1hbFZhbHVlID0gKHU4KShUaGVybWFsVmFsdWVfSFAgLyBUaGVybWFsVmFsdWVfSFBfY291bnQpOwotCQl9Ci0KLQkJZGVsdGEgPSAoVGhlcm1hbFZhbHVlID4gcGRtcHJpdi0+VGhlcm1hbFZhbHVlKSA/Ci0JCQkoVGhlcm1hbFZhbHVlIC0gcGRtcHJpdi0+VGhlcm1hbFZhbHVlKSA6Ci0JCQkocGRtcHJpdi0+VGhlcm1hbFZhbHVlIC0gVGhlcm1hbFZhbHVlKTsKLQkJaWYgKHBIYWxEYXRhLT5Cb2FyZFR5cGUgPT0gQk9BUkRfVVNCX0hpZ2hfUEEpIHsKLQkJCWlmIChwZG1wcml2LT5iRG9uZVR4cG93ZXIpCi0JCQkJZGVsdGFfSFAgPSAoVGhlcm1hbFZhbHVlID4gcGRtcHJpdi0+VGhlcm1hbFZhbHVlKSA/Ci0JCQkJCSAgIChUaGVybWFsVmFsdWUgLSBwZG1wcml2LT5UaGVybWFsVmFsdWUpIDoKLQkJCQkJICAgKHBkbXByaXYtPlRoZXJtYWxWYWx1ZSAtIFRoZXJtYWxWYWx1ZSk7Ci0JCQllbHNlCi0JCQkJZGVsdGFfSFAgPSBUaGVybWFsVmFsdWUgPiBwSGFsRGF0YS0+RUVQUk9NVGhlcm1hbE1ldGVyID8KLQkJCQkJICAgKFRoZXJtYWxWYWx1ZSAtIHBIYWxEYXRhLT5FRVBST01UaGVybWFsTWV0ZXIpIDoKLQkJCQkJICAgKHBIYWxEYXRhLT5FRVBST01UaGVybWFsTWV0ZXIgLSBUaGVybWFsVmFsdWUpOwotCQl9IGVsc2UgewotCQkJZGVsdGFfSFAgPSAwOwotCQl9Ci0JCWRlbHRhX0xDSyA9IChUaGVybWFsVmFsdWUgPiBwZG1wcml2LT5UaGVybWFsVmFsdWVfTENLKSA/Ci0JCQkgICAgKFRoZXJtYWxWYWx1ZSAtIHBkbXByaXYtPlRoZXJtYWxWYWx1ZV9MQ0spIDoKLQkJCSAgICAocGRtcHJpdi0+VGhlcm1hbFZhbHVlX0xDSyAtIFRoZXJtYWxWYWx1ZSk7Ci0JCWRlbHRhX0lRSyA9IChUaGVybWFsVmFsdWUgPiBwZG1wcml2LT5UaGVybWFsVmFsdWVfSVFLKSA/Ci0JCQkgICAgKFRoZXJtYWxWYWx1ZSAtIHBkbXByaXYtPlRoZXJtYWxWYWx1ZV9JUUspIDoKLQkJCSAgICAocGRtcHJpdi0+VGhlcm1hbFZhbHVlX0lRSyAtIFRoZXJtYWxWYWx1ZSk7Ci0KLQkJaWYgKGRlbHRhX0xDSyA+IDEpIHsKLQkJCXBkbXByaXYtPlRoZXJtYWxWYWx1ZV9MQ0sgPSBUaGVybWFsVmFsdWU7Ci0JCQlydGw4NzIzYV9waHlfbGNfY2FsaWJyYXRlKEFkYXB0ZXIpOwotCQl9Ci0KLQkJaWYgKChkZWx0YSA+IDAgfHwgZGVsdGFfSFAgPiAwKSAmJiBwZG1wcml2LT5UeFBvd2VyVHJhY2tDb250cm9sKSB7Ci0JCQlpZiAocEhhbERhdGEtPkJvYXJkVHlwZSA9PSBCT0FSRF9VU0JfSGlnaF9QQSkgewotCQkJCXBkbXByaXYtPmJEb25lVHhwb3dlciA9IHRydWU7Ci0JCQkJZGVsdGFfSFAgPSBUaGVybWFsVmFsdWUgPiBwSGFsRGF0YS0+RUVQUk9NVGhlcm1hbE1ldGVyID8KLQkJCQkJICAgKFRoZXJtYWxWYWx1ZSAtIHBIYWxEYXRhLT5FRVBST01UaGVybWFsTWV0ZXIpIDoKLQkJCQkJICAgKHBIYWxEYXRhLT5FRVBST01UaGVybWFsTWV0ZXIgLSBUaGVybWFsVmFsdWUpOwotCi0JCQkJaWYgKGRlbHRhX0hQID4gaW5kZXhfbWFwcGluZ19IUF9OVU0tMSkKLQkJCQkJaW5kZXhfSFAgPSBpbmRleF9tYXBwaW5nX0hQW2luZGV4X21hcHBpbmdfSFBfTlVNLTFdOwotCQkJCWVsc2UKLQkJCQkJaW5kZXhfSFAgPSBpbmRleF9tYXBwaW5nX0hQW2RlbHRhX0hQXTsKLQotCQkJCWlmIChUaGVybWFsVmFsdWUgPiBwSGFsRGF0YS0+RUVQUk9NVGhlcm1hbE1ldGVyKSB7Ci0JCQkJCS8qIHNldCBsYXJnZXIgVHggcG93ZXIgKi8KLQkJCQkJZm9yIChpID0gMDsgaSA8IHJmOyBpKyspCi0JCQkJCQlPRkRNX2luZGV4W2ldID0gcGRtcHJpdi0+T0ZETV9pbmRleF9IUFtpXSAtIGluZGV4X0hQOwotCQkJCQlDQ0tfaW5kZXggPSBwZG1wcml2LT5DQ0tfaW5kZXhfSFAgLSBpbmRleF9IUDsKLQkJCQl9IGVsc2UgewotCQkJCQlmb3IgKGkgPSAwOyBpIDwgcmY7IGkrKykKLQkJCQkJCU9GRE1faW5kZXhbaV0gPSBwZG1wcml2LT5PRkRNX2luZGV4X0hQW2ldICsgaW5kZXhfSFA7Ci0JCQkJCUNDS19pbmRleCA9IHBkbXByaXYtPkNDS19pbmRleF9IUCArIGluZGV4X0hQOwotCQkJCX0KLQotCQkJCWRlbHRhX0hQID0gKFRoZXJtYWxWYWx1ZSA+IHBkbXByaXYtPlRoZXJtYWxWYWx1ZSkgPwotCQkJCQkgICAoVGhlcm1hbFZhbHVlIC0gcGRtcHJpdi0+VGhlcm1hbFZhbHVlKSA6Ci0JCQkJCSAgIChwZG1wcml2LT5UaGVybWFsVmFsdWUgLSBUaGVybWFsVmFsdWUpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoVGhlcm1hbFZhbHVlID4gcGRtcHJpdi0+VGhlcm1hbFZhbHVlKSB7Ci0JCQkJCWZvciAoaSA9IDA7IGkgPCByZjsgaSsrKQotCQkJCQkJcGRtcHJpdi0+T0ZETV9pbmRleFtpXSAtPSBkZWx0YTsKLQkJCQkJcGRtcHJpdi0+Q0NLX2luZGV4IC09IGRlbHRhOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZvciAoaSA9IDA7IGkgPCByZjsgaSsrKQotCQkJCQkJcGRtcHJpdi0+T0ZETV9pbmRleFtpXSArPSBkZWx0YTsKLQkJCQkJcGRtcHJpdi0+Q0NLX2luZGV4ICs9IGRlbHRhOwotCQkJCX0KLQkJCX0KLQotCQkJLyogbm8gYWRqdXN0ICovCi0JCQlpZiAocEhhbERhdGEtPkJvYXJkVHlwZSAhPSBCT0FSRF9VU0JfSGlnaF9QQSkgewotCQkJCWlmIChUaGVybWFsVmFsdWUgPiBwSGFsRGF0YS0+RUVQUk9NVGhlcm1hbE1ldGVyKSB7Ci0JCQkJCWZvciAoaSA9IDA7IGkgPCByZjsgaSsrKQotCQkJCQkJT0ZETV9pbmRleFtpXSA9IHBkbXByaXYtPk9GRE1faW5kZXhbaV0rMTsKLQkJCQkJQ0NLX2luZGV4ID0gcGRtcHJpdi0+Q0NLX2luZGV4KzE7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZm9yIChpID0gMDsgaSA8IHJmOyBpKyspCi0JCQkJCQlPRkRNX2luZGV4W2ldID0gcGRtcHJpdi0+T0ZETV9pbmRleFtpXTsKLQkJCQkJQ0NLX2luZGV4ID0gcGRtcHJpdi0+Q0NLX2luZGV4OwotCQkJCX0KLQkJCX0KLQkJCWZvciAoaSA9IDA7IGkgPCByZjsgaSsrKSB7Ci0JCQkJaWYgKE9GRE1faW5kZXhbaV0gPiAoT0ZETV9UQUJMRV9TSVpFXzkyQy0xKSkKLQkJCQkJT0ZETV9pbmRleFtpXSA9IChPRkRNX1RBQkxFX1NJWkVfOTJDLTEpOwotCQkJCWVsc2UgaWYgKE9GRE1faW5kZXhbaV0gPCBPRkRNX21pbl9pbmRleCkKLQkJCQkJT0ZETV9pbmRleFtpXSA9IE9GRE1fbWluX2luZGV4OwotCQkJfQotCi0JCQlpZiAoQ0NLX2luZGV4ID4gKENDS19UQUJMRV9TSVpFLTEpKQotCQkJCUNDS19pbmRleCA9IENDS19UQUJMRV9TSVpFLTE7Ci0JCQllbHNlIGlmIChDQ0tfaW5kZXggPCAwKQotCQkJCUNDS19pbmRleCA9IDA7Ci0JCX0KLQotCQlpZiAocGRtcHJpdi0+VHhQb3dlclRyYWNrQ29udHJvbCAmJgotCQkgICAgKGRlbHRhICE9IDAgfHwgZGVsdGFfSFAgIT0gMCkpIHsKLQkJCS8qIEFkdWpzdCBPRkRNIEFudF9BIGFjY29yZGluZyB0byBJUUsgcmVzdWx0ICovCi0JCQllbGVfRCA9IChPRkRNU3dpbmdUYWJsZTIzQVtPRkRNX2luZGV4WzBdXSAmIDB4RkZDMDAwMDApPj4yMjsKLQkJCVggPSBwZG1wcml2LT5SZWdFOTQ7Ci0JCQlZID0gcGRtcHJpdi0+UmVnRTlDOwotCi0JCQlpZiAoWCAhPSAwKSB7Ci0JCQkJaWYgKChYICYgMHgwMDAwMDIwMCkgIT0gMCkKLQkJCQkJWCA9IFggfCAweEZGRkZGQzAwOwotCQkJCWVsZV9BID0gKChYICogZWxlX0QpPj44KSYweDAwMDAwM0ZGOwotCi0JCQkJLyogbmV3IGVsZW1lbnQgQyA9IGVsZW1lbnQgRCB4IFkgKi8KLQkJCQlpZiAoKFkgJiAweDAwMDAwMjAwKSAhPSAwKQotCQkJCQlZID0gWSB8IDB4RkZGRkZDMDA7Ci0JCQkJZWxlX0MgPSAoKFkgKiBlbGVfRCk+PjgpJjB4MDAwMDAzRkY7Ci0KLQkJCQkvKiB3cml0ZSBuZXcgZWxlbWVudHMgQSwgQywgRCB0byByZWdDODAgYW5kIHJlZ0M5NCwgZWxlbWVudCBCIGlzIGFsd2F5cyAwICovCi0JCQkJdmFsdWUzMiA9IChlbGVfRDw8MjIpfCgoZWxlX0MmMHgzRik8PDE2KXxlbGVfQTsKLQkJCQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLAotCQkJCQkJICByT0ZETTBfWEFUeElRSW1iYWxhbmNlLAotCQkJCQkJICB2YWx1ZTMyKTsKLQotCQkJCXZhbHVlMzIgPSAoZWxlX0MmMHgwMDAwMDNDMCk+PjY7Ci0JCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJPRkRNMF9YQ1R4QUZFLCBiTWFza0g0Qml0cywgdmFsdWUzMik7Ci0KLQkJCQl2YWx1ZTMyID0gKChYICogZWxlX0QpPj43KSYweDAxOwotCQkJCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByT0ZETTBfRUNDQVRocmVzaG9sZCwKLQkJCQkJICAgICBCSVQoMzEpLCB2YWx1ZTMyKTsKLQotCQkJCXZhbHVlMzIgPSAoKFkgKiBlbGVfRCk+PjcpJjB4MDE7Ci0JCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJPRkRNMF9FQ0NBVGhyZXNob2xkLAotCQkJCQkgICAgIEJJVCgyOSksIHZhbHVlMzIpOwotCQkJfSBlbHNlIHsKLQkJCQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLAotCQkJCQkJICByT0ZETTBfWEFUeElRSW1iYWxhbmNlLAotCQkJCQkJICBPRkRNU3dpbmdUYWJsZTIzQVtPRkRNX2luZGV4WzBdXSk7Ci0JCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJPRkRNMF9YQ1R4QUZFLAotCQkJCQkgICAgIGJNYXNrSDRCaXRzLCAweDAwKTsKLQkJCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgck9GRE0wX0VDQ0FUaHJlc2hvbGQsCi0JCQkJCSAgICAgQklUKDMxKSB8IEJJVCgyOSksIDB4MDApOwotCQkJfQotCi0JCQkvKiBBZGp1c3QgQ0NLIGFjY29yZGluZyB0byBJUUsgcmVzdWx0ICovCi0JCQlpZiAoIXBkbXByaXYtPmJDQ0tpbkNIMTQpIHsKLQkJCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4YTIyLCBDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzMjNBW0NDS19pbmRleF1bMF0pOwotCQkJCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhhMjMsIENDS1N3aW5nVGFibGVfQ2gxX0NoMTMyM0FbQ0NLX2luZGV4XVsxXSk7Ci0JCQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweGEyNCwgQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxMzIzQVtDQ0tfaW5kZXhdWzJdKTsKLQkJCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4YTI1LCBDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzMjNBW0NDS19pbmRleF1bM10pOwotCQkJCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhhMjYsIENDS1N3aW5nVGFibGVfQ2gxX0NoMTMyM0FbQ0NLX2luZGV4XVs0XSk7Ci0JCQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweGEyNywgQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxMzIzQVtDQ0tfaW5kZXhdWzVdKTsKLQkJCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4YTI4LCBDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzMjNBW0NDS19pbmRleF1bNl0pOwotCQkJCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhhMjksIENDS1N3aW5nVGFibGVfQ2gxX0NoMTMyM0FbQ0NLX2luZGV4XVs3XSk7Ci0JCQl9IGVsc2UgewotCQkJCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhhMjIsIENDS1N3aW5nVGFibGVfQ2gxNDIzQVtDQ0tfaW5kZXhdWzBdKTsKLQkJCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4YTIzLCBDQ0tTd2luZ1RhYmxlX0NoMTQyM0FbQ0NLX2luZGV4XVsxXSk7Ci0JCQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweGEyNCwgQ0NLU3dpbmdUYWJsZV9DaDE0MjNBW0NDS19pbmRleF1bMl0pOwotCQkJCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhhMjUsIENDS1N3aW5nVGFibGVfQ2gxNDIzQVtDQ0tfaW5kZXhdWzNdKTsKLQkJCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4YTI2LCBDQ0tTd2luZ1RhYmxlX0NoMTQyM0FbQ0NLX2luZGV4XVs0XSk7Ci0JCQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweGEyNywgQ0NLU3dpbmdUYWJsZV9DaDE0MjNBW0NDS19pbmRleF1bNV0pOwotCQkJCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhhMjgsIENDS1N3aW5nVGFibGVfQ2gxNDIzQVtDQ0tfaW5kZXhdWzZdKTsKLQkJCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4YTI5LCBDQ0tTd2luZ1RhYmxlX0NoMTQyM0FbQ0NLX2luZGV4XVs3XSk7Ci0JCQl9Ci0KLQkJCWlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSBSRl8yVDJSKSB7Ci0JCQkJZWxlX0QgPSAoT0ZETVN3aW5nVGFibGUyM0FbKHU4KU9GRE1faW5kZXhbMV1dICYgMHhGRkMwMDAwMCk+PjIyOwotCi0JCQkJLyogbmV3IGVsZW1lbnQgQSA9IGVsZW1lbnQgRCB4IFggKi8KLQkJCQlYID0gcGRtcHJpdi0+UmVnRUI0OwotCQkJCVkgPSBwZG1wcml2LT5SZWdFQkM7Ci0KLQkJCQlpZiAoWCAhPSAwKSB7Ci0JCQkJCWlmICgoWCAmIDB4MDAwMDAyMDApICE9IDApCS8qIGNvbnNpZGVyIG1pbnVzICovCi0JCQkJCQlYID0gWCB8IDB4RkZGRkZDMDA7Ci0JCQkJCWVsZV9BID0gKChYICogZWxlX0QpPj44KSYweDAwMDAwM0ZGOwotCi0JCQkJCS8qIG5ldyBlbGVtZW50IEMgPSBlbGVtZW50IEQgeCBZICovCi0JCQkJCWlmICgoWSAmIDB4MDAwMDAyMDApICE9IDApCi0JCQkJCQlZID0gWSB8IDB4RkZGRkZDMDA7Ci0JCQkJCWVsZV9DID0gKChZICogZWxlX0QpPj44KSYweDAwMDAzRkY7Ci0KLQkJCQkJLyogd3JpdGUgbmV3IGVsZW1lbnRzIEEsIEMsIEQgdG8gcmVnQzg4IGFuZCByZWdDOUMsIGVsZW1lbnQgQiBpcyBhbHdheXMgMCAqLwotCQkJCQl2YWx1ZTMyID0gKGVsZV9EPDwyMil8KChlbGVfQyYweDNGKTw8MTYpIHwgZWxlX0E7Ci0JCQkJCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIHJPRkRNMF9YQlR4SVFJbWJhbGFuY2UsIHZhbHVlMzIpOwotCi0JCQkJCXZhbHVlMzIgPSAoZWxlX0MmMHgwMDAwMDNDMCk+PjY7Ci0JCQkJCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByT0ZETTBfWERUeEFGRSwgYk1hc2tINEJpdHMsIHZhbHVlMzIpOwotCi0JCQkJCXZhbHVlMzIgPSAoKFggKiBlbGVfRCk+PjcpJjB4MDE7Ci0JCQkJCVBIWV9TZXRCQlJlZyhBZGFwdGVyLAotCQkJCQkJICAgICByT0ZETTBfRUNDQVRocmVzaG9sZCwKLQkJCQkJCSAgICAgQklUKDI3KSwgdmFsdWUzMik7Ci0KLQkJCQkJdmFsdWUzMiA9ICgoWSAqIGVsZV9EKT4+NykmMHgwMTsKLQkJCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsCi0JCQkJCQkgICAgIHJPRkRNMF9FQ0NBVGhyZXNob2xkLAotCQkJCQkJICAgICBCSVQoMjUpLCB2YWx1ZTMyKTsKLQkJCQl9IGVsc2UgewotCQkJCQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLAotCQkJCQkJCSAgck9GRE0wX1hCVHhJUUltYmFsYW5jZSwKLQkJCQkJCQkgIE9GRE1Td2luZ1RhYmxlMjNBW09GRE1faW5kZXhbMV1dKTsKLQkJCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsCi0JCQkJCQkgICAgIHJPRkRNMF9YRFR4QUZFLAotCQkJCQkJICAgICBiTWFza0g0Qml0cywgMHgwMCk7Ci0JCQkJCVBIWV9TZXRCQlJlZyhBZGFwdGVyLAotCQkJCQkJICAgICByT0ZETTBfRUNDQVRocmVzaG9sZCwKLQkJCQkJCSAgICAgQklUKDI3KSB8IEJJVCgyNSksIDB4MDApOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCWlmIChkZWx0YV9JUUsgPiAzKSB7Ci0JCQlwZG1wcml2LT5UaGVybWFsVmFsdWVfSVFLID0gVGhlcm1hbFZhbHVlOwotCQkJcnRsODcyM2FfcGh5X2lxX2NhbGlicmF0ZShBZGFwdGVyLCBmYWxzZSk7Ci0JCX0KLQotCQkvKiB1cGRhdGUgdGhlcm1hbCBtZXRlciB2YWx1ZSAqLwotCQlpZiAocGRtcHJpdi0+VHhQb3dlclRyYWNrQ29udHJvbCkKLQkJCXBkbXByaXYtPlRoZXJtYWxWYWx1ZSA9IFRoZXJtYWxWYWx1ZTsKLQl9Ci0JcGRtcHJpdi0+VFhQb3dlcmNvdW50ID0gMDsKLX0KLQotLyoJRGVzY3JpcHRpb246ICovCi0vKgkJLSBEaXNwYXRjaCBUeFBvd2VyIFRyYWNraW5nIGRpcmVjdCBjYWxsIE9OTFkgZm9yIDkycy4gKi8KLS8qCQktIFdlIHNoYWxsIE5PVCBzY2hlZHVsZSBXb3JraXRlbSB3aXRoaW4gUEFTU0lWRSBMRVZFTCwgd2hpY2ggd2lsbCBjYXVzZSBzeXN0ZW0gcmVzb3VyY2UgKi8KLS8qCQkgICBsZWFrYWdlIHVuZGVyIHNvbWUgcGxhdGZvcm0uICovCi0vKglBc3N1bXB0aW9uOiAqLwotLyoJCVBBU1NJVkVfTEVWRUwgd2hlbiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkLiAqLwotc3RhdGljIHZvaWQgT0RNX1RYUG93ZXJUcmFja2luZzkyQ0RpcmVjdENhbGwoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCW9kbV9UWFBvd2VyVHJhY2tpbmdDYWxsYmFja19UaGVybWFsTWV0ZXJfOTJDKEFkYXB0ZXIpOwotfQotCi12b2lkIHJ0bDg3MjNhX29kbV9jaGVja190eF9wb3dlcl90cmFja2luZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlzdHJ1Y3QgZG1fcHJpdiAqcGRtcHJpdiA9ICZwSGFsRGF0YS0+ZG1wcml2OwotCi0JaWYgKCFwZG1wcml2LT5UTV9UcmlnZ2VyKSB7CQkvKiBhdCBsZWFzdCBkZWxheSAxIHNlYyAqLwotCQlQSFlfU2V0UkZSZWcoQWRhcHRlciwgUkZfUEFUSF9BLCBSRl9UX01FVEVSLCBiUkZSZWdPZmZzZXRNYXNrLCAweDYwKTsKLQotCQlwZG1wcml2LT5UTV9UcmlnZ2VyID0gMTsKLQkJcmV0dXJuOwotCX0gZWxzZSB7Ci0JCU9ETV9UWFBvd2VyVHJhY2tpbmc5MkNEaXJlY3RDYWxsKEFkYXB0ZXIpOwotCQlwZG1wcml2LT5UTV9UcmlnZ2VyID0gMDsKLQl9Ci19Ci0KLS8qCUlRSyAqLwotI2RlZmluZSBNQVhfVE9MRVJBTkNFCQk1Ci0jZGVmaW5lIElRS19ERUxBWV9USU1FCQkxCS8qIG1zICovCi0KLXN0YXRpYyB1OCBfUEhZX1BhdGhBX0lRSyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCBib29sIGNvbmZpZ1BhdGhCKQotewotCXUzMiByZWdFQUMsIHJlZ0U5NCwgcmVnRTlDLCByZWdFQTQ7Ci0JdTggcmVzdWx0ID0gMHgwMDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBBZGFwdGVyKTsKLQotCS8qIHBhdGgtQSBJUUsgc2V0dGluZyAqLwotCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByVHhfSVFLX1RvbmVfQSwgMHgxMDAwOGMxZik7Ci0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJSeF9JUUtfVG9uZV9BLCAweDEwMDA4YzFmKTsKLQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgclR4X0lRS19QSV9BLCAweDgyMTQwMTAyKTsKLQotCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByUnhfSVFLX1BJX0EsIGNvbmZpZ1BhdGhCID8gMHgyODE2MDIwMiA6Ci0JCUlTXzgxeHhDX1ZFTkRPUl9VTUNfQl9DVVQocEhhbERhdGEtPlZlcnNpb25JRCk/MHgyODE2MDIwMjoweDI4MTYwNTAyKTsKLQotCS8qIHBhdGgtQiBJUUsgc2V0dGluZyAqLwotCWlmIChjb25maWdQYXRoQikgewotCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgclR4X0lRS19Ub25lX0IsIDB4MTAwMDhjMjIpOwotCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgclJ4X0lRS19Ub25lX0IsIDB4MTAwMDhjMjIpOwotCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgclR4X0lRS19QSV9CLCAweDgyMTQwMTAyKTsKLQkJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJSeF9JUUtfUElfQiwgMHgyODE2MDIwMik7Ci0JfQotCi0JLyogTE8gY2FsaWJyYXRpb24gc2V0dGluZyAqLwotCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCBySVFLX0FHQ19Sc3AsIDB4MDAxMDI4ZDEpOwotCi0JLyogT25lIHNob3QsIHBhdGggQSBMT0sgJiBJUUsgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgcklRS19BR0NfUHRzLCAweGY5MDAwMDAwKTsKLQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgcklRS19BR0NfUHRzLCAweGY4MDAwMDAwKTsKLQotCS8qICBkZWxheSB4IG1zICovCi0JLyogUGxhdGZvcm1TdGFsbEV4ZWN1dGlvbihJUUtfREVMQVlfVElNRSoxMDAwKTsgKi8KLQl1ZGVsYXkoSVFLX0RFTEFZX1RJTUUqMTAwMCk7Ci0KLQkvKiAgQ2hlY2sgZmFpbGVkICovCi0JcmVnRUFDID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclJ4X1Bvd2VyX0FmdGVyX0lRS19BXzIpOwotCXJlZ0U5NCA9IHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJUeF9Qb3dlcl9CZWZvcmVfSVFLX0EpOwotCXJlZ0U5QyA9IHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJUeF9Qb3dlcl9BZnRlcl9JUUtfQSk7Ci0JcmVnRUE0ID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclJ4X1Bvd2VyX0JlZm9yZV9JUUtfQV8yKTsKLQotCWlmICghKHJlZ0VBQyAmIEJJVCgyOCkpICYmCi0JICAgICgoKHJlZ0U5NCAmIDB4MDNGRjAwMDApPj4xNikgIT0gMHgxNDIpICYmCi0JICAgICgoKHJlZ0U5QyAmIDB4MDNGRjAwMDApPj4xNikgIT0gMHg0MikpCi0JCXJlc3VsdCB8PSAweDAxOwotCWVsc2UJCQkvKiBpZiBUeCBub3QgT0ssIGlnbm9yZSBSeCAqLwotCQlyZXR1cm4gcmVzdWx0OwotCi0JaWYgKCEocmVnRUFDICYgQklUKDI3KSkgJiYgLyogaWYgVHggaXMgT0ssIGNoZWNrIHdoZXRoZXIgUnggaXMgT0sgKi8KLQkgICAgKCgocmVnRUE0ICYgMHgwM0ZGMDAwMCk+PjE2KSAhPSAweDEzMikgJiYKLQkgICAgKCgocmVnRUFDICYgMHgwM0ZGMDAwMCk+PjE2KSAhPSAweDM2KSkKLQkJcmVzdWx0IHw9IDB4MDI7Ci0JZWxzZQotCQlEQkdfODcyM0EoIlBhdGggQSBSeCBJUUsgZmFpbCEhXG4iKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdTggX1BIWV9QYXRoQl9JUUsoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlcikKLXsKLQl1MzIgcmVnRUFDLCByZWdFQjQsIHJlZ0VCQywgcmVnRUM0LCByZWdFQ0M7Ci0JdTggcmVzdWx0ID0gMHgwMDsKLQotCS8qIE9uZSBzaG90LCBwYXRoIEIgTE9LICYgSVFLICovCi0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJJUUtfQUdDX0NvbnQsIDB4MDAwMDAwMDIpOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCBySVFLX0FHQ19Db250LCAweDAwMDAwMDAwKTsKLQotCS8qICBkZWxheSB4IG1zICovCi0JdWRlbGF5KElRS19ERUxBWV9USU1FKjEwMDApOwotCi0JLyogIENoZWNrIGZhaWxlZCAqLwotCXJlZ0VBQyA9IHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJSeF9Qb3dlcl9BZnRlcl9JUUtfQV8yKTsKLQlyZWdFQjQgPSBydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByVHhfUG93ZXJfQmVmb3JlX0lRS19CKTsKLQlyZWdFQkMgPSBydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByVHhfUG93ZXJfQWZ0ZXJfSVFLX0IpOwotCXJlZ0VDNCA9IHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJSeF9Qb3dlcl9CZWZvcmVfSVFLX0JfMik7Ci0JcmVnRUNDID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclJ4X1Bvd2VyX0FmdGVyX0lRS19CXzIpOwotCi0JaWYgKCEocmVnRUFDICYgQklUKDMxKSkgJiYKLQkgICAgKCgocmVnRUI0ICYgMHgwM0ZGMDAwMCk+PjE2KSAhPSAweDE0MikgJiYKLQkgICAgKCgocmVnRUJDICYgMHgwM0ZGMDAwMCk+PjE2KSAhPSAweDQyKSkKLQkJcmVzdWx0IHw9IDB4MDE7Ci0JZWxzZQotCQlyZXR1cm4gcmVzdWx0OwotCi0JaWYgKCEocmVnRUFDICYgQklUKDMwKSkgJiYKLQkgICAgKCgocmVnRUM0ICYgMHgwM0ZGMDAwMCk+PjE2KSAhPSAweDEzMikgJiYKLQkgICAgKCgocmVnRUNDICYgMHgwM0ZGMDAwMCk+PjE2KSAhPSAweDM2KSkKLQkJcmVzdWx0IHw9IDB4MDI7Ci0JZWxzZQotCQlEQkdfODcyM0EoIlBhdGggQiBSeCBJUUsgZmFpbCEhXG4iKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdm9pZCBfUEhZX1BhdGhBRmlsbElRS01hdHJpeChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLAotCWJvb2wgYklRS09LLAotCWludCByZXN1bHRbXVs4XSwKLQl1OCBmaW5hbF9jYW5kaWRhdGUsCi0JYm9vbCBiVHhPbmx5Ci0JKQotewotCXUzMiBPbGR2YWxfMCwgWCwgVFgwX0EsIHJlZzsKLQlzMzIgWSwgVFgwX0M7Ci0KLQlEQkdfODcyM0EoIlBhdGggQSBJUSBDYWxpYnJhdGlvbiAlcyAhXG4iLCAoYklRS09LKT8iU3VjY2VzcyI6IkZhaWxlZCIpOwotCi0JaWYgKGZpbmFsX2NhbmRpZGF0ZSA9PSAweEZGKSB7Ci0JCXJldHVybjsKLQl9IGVsc2UgaWYgKGJJUUtPSykgewotCQlPbGR2YWxfMCA9IHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UpOwotCQlPbGR2YWxfMCA9IChPbGR2YWxfMCA+PiAyMikgJiAweDNGRjsKLQotCQlYID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bMF07Ci0JCWlmICgoWCAmIDB4MDAwMDAyMDApICE9IDApCi0JCQlYID0gWCB8IDB4RkZGRkZDMDA7Ci0JCVRYMF9BID0gKFggKiBPbGR2YWxfMCkgPj4gODsKLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByT0ZETTBfWEFUeElRSW1iYWxhbmNlLCAweDNGRiwgVFgwX0EpOwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9FQ0NBVGhyZXNob2xkLCBCSVQoMzEpLAotCQkJICAgICAoKFggKiBPbGR2YWxfMD4+NykgJiAweDEpKTsKLQotCQlZID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bMV07Ci0JCWlmICgoWSAmIDB4MDAwMDAyMDApICE9IDApCi0JCQlZID0gWSB8IDB4RkZGRkZDMDA7Ci0JCVRYMF9DID0gKFkgKiBPbGR2YWxfMCkgPj4gODsKLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByT0ZETTBfWENUeEFGRSwgMHhGMDAwMDAwMCwKLQkJCSAgICAgKChUWDBfQyYweDNDMCk+PjYpKTsKLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByT0ZETTBfWEFUeElRSW1iYWxhbmNlLCAweDAwM0YwMDAwLAotCQkJICAgICAoVFgwX0MmMHgzRikpOwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9FQ0NBVGhyZXNob2xkLCBCSVQoMjkpLAotCQkJICAgICAoKFkgKiBPbGR2YWxfMD4+NykgJiAweDEpKTsKLQotCQlpZiAoYlR4T25seSkgewotCQkJREJHXzg3MjNBKCJfUEhZX1BhdGhBRmlsbElRS01hdHJpeCBvbmx5IFR4IE9LXG4iKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXJlZyA9IHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdWzJdOwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9YQVJ4SVFJbWJhbGFuY2UsIDB4M0ZGLCByZWcpOwotCi0JCXJlZyA9IHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdWzNdICYgMHgzRjsKLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByT0ZETTBfWEFSeElRSW1iYWxhbmNlLCAweEZDMDAsIHJlZyk7Ci0KLQkJcmVnID0gKHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdWzNdID4+IDYpICYgMHhGOwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9SeElRRXh0QW50YSwgMHhGMDAwMDAwMCwgcmVnKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9QSFlfUGF0aEJGaWxsSVFLTWF0cml4KHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIGJvb2wgYklRS09LLCBpbnQgcmVzdWx0W11bOF0sIHU4IGZpbmFsX2NhbmRpZGF0ZSwgYm9vbCBiVHhPbmx5KQotewotCXUzMiBPbGR2YWxfMSwgWCwgVFgxX0EsIHJlZzsKLQlzMzIgWSwgVFgxX0M7Ci0KLQlEQkdfODcyM0EoIlBhdGggQiBJUSBDYWxpYnJhdGlvbiAlcyAhXG4iLCAoYklRS09LKT8iU3VjY2VzcyI6IkZhaWxlZCIpOwotCi0JaWYgKGZpbmFsX2NhbmRpZGF0ZSA9PSAweEZGKSB7Ci0JCXJldHVybjsKLQl9IGVsc2UgaWYgKGJJUUtPSykgewotCQlPbGR2YWxfMSA9IHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJPRkRNMF9YQlR4SVFJbWJhbGFuY2UpOwotCQlPbGR2YWxfMSA9IChPbGR2YWxfMSA+PiAyMikgJiAweDNGRjsKLQotCQlYID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bNF07Ci0JCWlmICgoWCAmIDB4MDAwMDAyMDApICE9IDApCi0JCQlYID0gWCB8IDB4RkZGRkZDMDA7Ci0JCVRYMV9BID0gKFggKiBPbGR2YWxfMSkgPj4gODsKLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByT0ZETTBfWEJUeElRSW1iYWxhbmNlLCAweDNGRiwgVFgxX0EpOwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9FQ0NBVGhyZXNob2xkLCBCSVQoMjcpLAotCQkJICAgICAoKFggKiBPbGR2YWxfMSA+PiA3KSAmIDB4MSkpOwotCi0JCVkgPSByZXN1bHRbZmluYWxfY2FuZGlkYXRlXVs1XTsKLQkJaWYgKChZICYgMHgwMDAwMDIwMCkgIT0gMCkKLQkJCVkgPSBZIHwgMHhGRkZGRkMwMDsKLQkJVFgxX0MgPSAoWSAqIE9sZHZhbF8xKSA+PiA4OwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9YRFR4QUZFLCAweEYwMDAwMDAwLAotCQkJICAgICAoKFRYMV9DICYgMHgzQzApID4+IDYpKTsKLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByT0ZETTBfWEJUeElRSW1iYWxhbmNlLCAweDAwM0YwMDAwLAotCQkJICAgICAoVFgxX0MgJiAweDNGKSk7Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX0VDQ0FUaHJlc2hvbGQsIEJJVCgyNSksCi0JCQkgICAgICgoWSAqIE9sZHZhbF8xID4+IDcpICYgMHgxKSk7Ci0KLQkJaWYgKGJUeE9ubHkpCi0JCQlyZXR1cm47Ci0KLQkJcmVnID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bNl07Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX1hCUnhJUUltYmFsYW5jZSwgMHgzRkYsIHJlZyk7Ci0KLQkJcmVnID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bN10gJiAweDNGOwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9YQlJ4SVFJbWJhbGFuY2UsIDB4RkMwMCwgcmVnKTsKLQotCQlyZWcgPSAocmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bN10gPj4gNikgJiAweEY7Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX0FHQ1JTU0lUYWJsZSwgMHgwMDAwRjAwMCwgcmVnKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9QSFlfU2F2ZUFEREFSZWdpc3RlcnMoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTMyICpBRERBUmVnLCB1MzIgKkFEREFCYWNrdXAsIHUzMiBSZWdpc3Rlck51bSkKLXsKLQl1MzIgaTsKLQotCWZvciAoaSA9IDAgOyBpIDwgUmVnaXN0ZXJOdW0gOyBpKyspIHsKLQkJQUREQUJhY2t1cFtpXSA9IHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIEFEREFSZWdbaV0pOwotCX0KLX0KLQotc3RhdGljIHZvaWQgX1BIWV9TYXZlTUFDUmVnaXN0ZXJzKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHUzMiAqTUFDUmVnLAotCQkJCSAgdTMyICpNQUNCYWNrdXApCi17Ci0JdTMyIGk7Ci0KLQlmb3IgKGkgPSAwIDsgaSA8IChJUUtfTUFDX1JFR19OVU0gLSAxKTsgaSsrKSB7Ci0JCU1BQ0JhY2t1cFtpXSA9IHJ0bDg3MjNhdV9yZWFkOChwQWRhcHRlciwgTUFDUmVnW2ldKTsKLQl9Ci0JTUFDQmFja3VwW2ldID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgTUFDUmVnW2ldKTsKLX0KLQotc3RhdGljIHZvaWQgX1BIWV9SZWxvYWRBRERBUmVnaXN0ZXJzKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsCi0JCQkJICAgICB1MzIgKkFEREFSZWcsIHUzMiAqQUREQUJhY2t1cCwKLQkJCQkgICAgIHUzMiBSZWdpZXN0ZXJOdW0pCi17Ci0JdTMyIGk7Ci0KLQlmb3IgKGkgPSAwIDsgaSA8IFJlZ2llc3Rlck51bSA7IGkrKykgewotCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgQUREQVJlZ1tpXSwgQUREQUJhY2t1cFtpXSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfUEhZX1JlbG9hZE1BQ1JlZ2lzdGVycyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLAotCQkJCSAgICB1MzIgKk1BQ1JlZywgdTMyICpNQUNCYWNrdXApCi17Ci0JdTMyIGk7Ci0KLQlmb3IgKGkgPSAwIDsgaSA8IChJUUtfTUFDX1JFR19OVU0gLSAxKTsgaSsrKQotCQlydGw4NzIzYXVfd3JpdGU4KHBBZGFwdGVyLCBNQUNSZWdbaV0sICh1OClNQUNCYWNrdXBbaV0pOwotCi0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIE1BQ1JlZ1tpXSwgTUFDQmFja3VwW2ldKTsKLX0KLQotc3RhdGljIHZvaWQgX1BIWV9QYXRoQUREQU9uKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHUzMiAqQUREQVJlZywKLQkJCSAgICBib29sIGlzUGF0aEFPbiwgYm9vbCBpczJUKQotewotCXUzMiBwYXRoT247Ci0JdTMyIGk7Ci0KLQlwYXRoT24gPSBpc1BhdGhBT24gPyAweDA0ZGIyNWE0IDogMHgwYjFiMjVhNDsKLQlpZiAoIWlzMlQpIHsKLQkJcGF0aE9uID0gMHgwYmRiMjVhMDsKLQkJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIEFEREFSZWdbMF0sIDB4MGIxYjI1YTApOwotCX0gZWxzZSB7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCBBRERBUmVnWzBdLCBwYXRoT24pOwotCX0KLQotCWZvciAoaSA9IDEgOyBpIDwgSVFLX0FEREFfUkVHX05VTSA7IGkrKykKLQkJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIEFEREFSZWdbaV0sIHBhdGhPbik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9QSFlfTUFDU2V0dGluZ0NhbGlicmF0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsCi0JCQkJICAgICAgIHUzMiAqTUFDUmVnLCB1MzIgKk1BQ0JhY2t1cCkKLXsKLQl1MzIgaSA9IDA7Ci0KLQlydGw4NzIzYXVfd3JpdGU4KHBBZGFwdGVyLCBNQUNSZWdbaV0sIDB4M0YpOwotCi0JZm9yIChpID0gMSA7IGkgPCAoSVFLX01BQ19SRUdfTlVNIC0gMSk7IGkrKykgewotCQlydGw4NzIzYXVfd3JpdGU4KHBBZGFwdGVyLCBNQUNSZWdbaV0sCi0JCQkJICh1OCkoTUFDQmFja3VwW2ldICYgfkJJVCgzKSkpOwotCX0KLQlydGw4NzIzYXVfd3JpdGU4KHBBZGFwdGVyLCBNQUNSZWdbaV0sICh1OCkoTUFDQmFja3VwW2ldICYgfkJJVCg1KSkpOwotfQotCi1zdGF0aWMgdm9pZCBfUEhZX1BhdGhBU3RhbmRCeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyKQotewotCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByRlBHQTBfSVFLLCAweDApOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCAweDg0MCwgMHgwMDAxMDAwMCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJGUEdBMF9JUUssIDB4ODA4MDAwMDApOwotfQotCi1zdGF0aWMgdm9pZCBfUEhZX1BJTW9kZVN3aXRjaChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCBib29sIFBJTW9kZSkKLXsKLQl1MzIgbW9kZTsKLQotCW1vZGUgPSBQSU1vZGUgPyAweDAxMDAwMTAwIDogMHgwMTAwMDAwMDsKLQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgMHg4MjAsIG1vZGUpOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCAweDgyOCwgbW9kZSk7Ci19Ci0KLS8qCi1yZXR1cm4gZmFsc2UgPT4gZG8gSVFLIGFnYWluCi0qLwotc3RhdGljIGJvb2wgX1BIWV9TaW11bGFyaXR5Q29tcGFyZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCBpbnQgcmVzdWx0W11bOF0sIHU4IGMxLCB1OCBjMikKLXsKLQl1MzIgaSwgaiwgZGlmZiwgU2ltdWxhcml0eUJpdE1hcCwgYm91bmQgPSAwOwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocEFkYXB0ZXIpOwotCXU4IGZpbmFsX2NhbmRpZGF0ZVsyXSA9IHsweEZGLCAweEZGfTsJLyogZm9yIHBhdGggQSBhbmQgcGF0aCBCICovCi0JYm9vbCBiUmVzdWx0ID0gdHJ1ZTsKLQotCWlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSBSRl8yVDJSKQotCQlib3VuZCA9IDg7Ci0JZWxzZQotCQlib3VuZCA9IDQ7Ci0KLQlTaW11bGFyaXR5Qml0TWFwID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBib3VuZDsgaSsrKSB7Ci0JCWRpZmYgPSAocmVzdWx0W2MxXVtpXSA+IHJlc3VsdFtjMl1baV0pID8gKHJlc3VsdFtjMV1baV0gLSByZXN1bHRbYzJdW2ldKSA6IChyZXN1bHRbYzJdW2ldIC0gcmVzdWx0W2MxXVtpXSk7Ci0JCWlmIChkaWZmID4gTUFYX1RPTEVSQU5DRSkgewotCQkJaWYgKChpID09IDIgfHwgaSA9PSA2KSAmJiAhU2ltdWxhcml0eUJpdE1hcCkgewotCQkJCWlmIChyZXN1bHRbYzFdW2ldK3Jlc3VsdFtjMV1baSsxXSA9PSAwKQotCQkJCQlmaW5hbF9jYW5kaWRhdGVbKGkvNCldID0gYzI7Ci0JCQkJZWxzZSBpZiAocmVzdWx0W2MyXVtpXStyZXN1bHRbYzJdW2krMV0gPT0gMCkKLQkJCQkJZmluYWxfY2FuZGlkYXRlWyhpLzQpXSA9IGMxOwotCQkJCWVsc2UKLQkJCQkJU2ltdWxhcml0eUJpdE1hcCA9IFNpbXVsYXJpdHlCaXRNYXB8KDE8PGkpOwotCQkJfSBlbHNlIHsKLQkJCQlTaW11bGFyaXR5Qml0TWFwID0gU2ltdWxhcml0eUJpdE1hcHwoMTw8aSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoU2ltdWxhcml0eUJpdE1hcCA9PSAwKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCAoYm91bmQvNCk7IGkrKykgewotCQkJaWYgKGZpbmFsX2NhbmRpZGF0ZVtpXSAhPSAweEZGKSB7Ci0JCQkJZm9yIChqID0gaSo0OyBqIDwgKGkrMSkqNC0yOyBqKyspCi0JCQkJCXJlc3VsdFszXVtqXSA9IHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVbaV1dW2pdOwotCQkJCWJSZXN1bHQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYlJlc3VsdDsKLQl9IGVsc2UgaWYgKCEoU2ltdWxhcml0eUJpdE1hcCAmIDB4MEYpKSB7Ci0JCS8qIHBhdGggQSBPSyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCQkJcmVzdWx0WzNdW2ldID0gcmVzdWx0W2MxXVtpXTsKLQkJcmV0dXJuIGZhbHNlOwotCX0gZWxzZSBpZiAoIShTaW11bGFyaXR5Qml0TWFwICYgMHhGMCkgJiYgcEhhbERhdGEtPnJmX3R5cGUgPT0gUkZfMlQyUikgewotCQkvKiBwYXRoIEIgT0sgKi8KLQkJZm9yIChpID0gNDsgaSA8IDg7IGkrKykKLQkJCXJlc3VsdFszXVtpXSA9IHJlc3VsdFtjMV1baV07Ci0JCXJldHVybiBmYWxzZTsKLQl9IGVsc2UgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfUEhZX0lRQ2FsaWJyYXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIGludCByZXN1bHRbXVs4XSwgdTggdCwgYm9vbCBpczJUKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocEFkYXB0ZXIpOwotCXN0cnVjdCBkbV9wcml2ICpwZG1wcml2ID0gJnBIYWxEYXRhLT5kbXByaXY7Ci0JdTMyIGk7Ci0JdTggUGF0aEFPSywgUGF0aEJPSzsKLQl1MzIgQUREQV9SRUdbSVFLX0FEREFfUkVHX05VTV0gPSB7Ci0JCXJGUEdBMF9YQ0RfU3dpdGNoQ29udHJvbCwgckJsdWVfVG9vdGgsCi0JCXJSeF9XYWl0X0NDQSwgclR4X0NDS19SRk9OLAotCQlyVHhfQ0NLX0JCT04sIHJUeF9PRkRNX1JGT04sCi0JCXJUeF9PRkRNX0JCT04sIHJUeF9Ub19SeCwKLQkJclR4X1RvX1R4LCByUnhfQ0NLLAotCQlyUnhfT0ZETSwgclJ4X1dhaXRfUklGUywKLQkJclJ4X1RPX1J4LCByU3RhbmRieSwKLQkJclNsZWVwLCByUE1QRF9BTkFFTgotCX07Ci0KLQl1MzIgSVFLX01BQ19SRUdbSVFLX01BQ19SRUdfTlVNXSA9IHsKLQkJUkVHX1RYUEFVU0UsIFJFR19CQ05fQ1RSTCwKLQkJUkVHX0JDTl9DVFJMXzEsIFJFR19HUElPX01VWENGRwotCX07Ci0KLQl1MzIgSVFLX0JCX1JFR185MkNbSVFLX0JCX1JFR19OVU1dID0gewotCQlyT0ZETTBfVFJ4UGF0aEVuYWJsZSwgck9GRE0wX1RSTXV4UGFyLAotCQlyRlBHQTBfWENEX1JGSW50ZXJmYWNlU1csIHJDb25maWdfQW50QSwgckNvbmZpZ19BbnRCLAotCQlyRlBHQTBfWEFCX1JGSW50ZXJmYWNlU1csIHJGUEdBMF9YQV9SRkludGVyZmFjZU9FLAotCQlyRlBHQTBfWEJfUkZJbnRlcmZhY2VPRSwgckZQR0EwX1JGTU9ECi0JfTsKLQotCWNvbnN0IHUzMiByZXRyeUNvdW50ID0gMjsKLQotCS8qICBOb3RlOiBJUSBjYWxpYnJhdGlvbiBtdXN0IGJlIHBlcmZvcm1lZCBhZnRlciBsb2FkaW5nICAqLwotCS8qCQlQSFlfUkVHLnR4dCAsIGFuZCByYWRpb19hLCByYWRpb19iLnR4dAkgKi8KLQotCXUzMiBiYnZhbHVlOwotCi0JaWYgKHQgPT0gMCkgewotCQliYnZhbHVlID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgckZQR0EwX1JGTU9EKTsKLQotCQkvKiAgU2F2ZSBBRERBIHBhcmFtZXRlcnMsIHR1cm4gUGF0aCBBIEFEREEgb24gKi8KLQkJX1BIWV9TYXZlQUREQVJlZ2lzdGVycyhwQWRhcHRlciwgQUREQV9SRUcsIHBkbXByaXYtPkFEREFfYmFja3VwLCBJUUtfQUREQV9SRUdfTlVNKTsKLQkJX1BIWV9TYXZlTUFDUmVnaXN0ZXJzKHBBZGFwdGVyLCBJUUtfTUFDX1JFRywgcGRtcHJpdi0+SVFLX01BQ19iYWNrdXApOwotCQlfUEhZX1NhdmVBRERBUmVnaXN0ZXJzKHBBZGFwdGVyLCBJUUtfQkJfUkVHXzkyQywgcGRtcHJpdi0+SVFLX0JCX2JhY2t1cCwgSVFLX0JCX1JFR19OVU0pOwotCX0KLQlfUEhZX1BhdGhBRERBT24ocEFkYXB0ZXIsIEFEREFfUkVHLCB0cnVlLCBpczJUKTsKLQotCWlmICh0ID09IDApCi0JCXBkbXByaXYtPmJSZlBpRW5hYmxlID0gKHU4KQotCQkJUEhZX1F1ZXJ5QkJSZWcocEFkYXB0ZXIsIHJGUEdBMF9YQV9IU1NJUGFyYW1ldGVyMSwKLQkJCQkgICAgICAgQklUKDgpKTsKLQotCWlmICghcGRtcHJpdi0+YlJmUGlFbmFibGUpIHsKLQkJLyogIFN3aXRjaCBCQiB0byBQSSBtb2RlIHRvIGRvIElRIENhbGlicmF0aW9uLiAqLwotCQlfUEhZX1BJTW9kZVN3aXRjaChwQWRhcHRlciwgdHJ1ZSk7Ci0JfQotCi0JUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByRlBHQTBfUkZNT0QsIEJJVCgyNCksIDB4MDApOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByT0ZETTBfVFJ4UGF0aEVuYWJsZSwgMHgwM2EwNTYwMCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJPRkRNMF9UUk11eFBhciwgMHgwMDA4MDBlNCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJGUEdBMF9YQ0RfUkZJbnRlcmZhY2VTVywgMHgyMjIwNDAwMCk7Ci0JUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByRlBHQTBfWEFCX1JGSW50ZXJmYWNlU1csIEJJVCgxMCksIDB4MDEpOwotCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgckZQR0EwX1hBQl9SRkludGVyZmFjZVNXLCBCSVQoMjYpLCAweDAxKTsKLQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJGUEdBMF9YQV9SRkludGVyZmFjZU9FLCBCSVQoMTApLCAweDAwKTsKLQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJGUEdBMF9YQl9SRkludGVyZmFjZU9FLCBCSVQoMTApLCAweDAwKTsKLQotCWlmIChpczJUKSB7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLAotCQkJCSAgckZQR0EwX1hBX0xTU0lQYXJhbWV0ZXIsIDB4MDAwMTAwMDApOwotCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwKLQkJCQkgIHJGUEdBMF9YQl9MU1NJUGFyYW1ldGVyLCAweDAwMDEwMDAwKTsKLQl9Ci0KLQkvKiBNQUMgc2V0dGluZ3MgKi8KLQlfUEhZX01BQ1NldHRpbmdDYWxpYnJhdGlvbihwQWRhcHRlciwgSVFLX01BQ19SRUcsIHBkbXByaXYtPklRS19NQUNfYmFja3VwKTsKLQotCS8qIFBhZ2UgQiBpbml0ICovCi0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJDb25maWdfQW50QSwgMHgwMDA4MDAwMCk7Ci0KLQlpZiAoaXMyVCkKLQkJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJDb25maWdfQW50QiwgMHgwMDA4MDAwMCk7Ci0KLQkvKiAgSVEgY2FsaWJyYXRpb24gc2V0dGluZyAqLwotCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByRlBHQTBfSVFLLCAweDgwODAwMDAwKTsKLQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgclR4X0lRSywgMHgwMTAwN2MwMCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJSeF9JUUssIDB4MDEwMDQ4MDApOwotCi0JZm9yIChpID0gMCA7IGkgPCByZXRyeUNvdW50IDsgaSsrKSB7Ci0JCVBhdGhBT0sgPSBfUEhZX1BhdGhBX0lRSyhwQWRhcHRlciwgaXMyVCk7Ci0JCWlmIChQYXRoQU9LID09IDB4MDMpIHsKLQkJCQlEQkdfODcyM0EoIlBhdGggQSBJUUsgU3VjY2VzcyEhXG4iKTsKLQkJCQlyZXN1bHRbdF1bMF0gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclR4X1Bvd2VyX0JlZm9yZV9JUUtfQSkmMHgzRkYwMDAwKT4+MTY7Ci0JCQkJcmVzdWx0W3RdWzFdID0gKHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJUeF9Qb3dlcl9BZnRlcl9JUUtfQSkmMHgzRkYwMDAwKT4+MTY7Ci0JCQkJcmVzdWx0W3RdWzJdID0gKHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJSeF9Qb3dlcl9CZWZvcmVfSVFLX0FfMikmMHgzRkYwMDAwKT4+MTY7Ci0JCQkJcmVzdWx0W3RdWzNdID0gKHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJSeF9Qb3dlcl9BZnRlcl9JUUtfQV8yKSYweDNGRjAwMDApPj4xNjsKLQkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKGkgPT0gKHJldHJ5Q291bnQtMSkgJiYgUGF0aEFPSyA9PSAweDAxKSB7Ci0JCQkvKiBUeCBJUUsgT0sgKi8KLQkJCURCR184NzIzQSgiUGF0aCBBIElRSyBPbmx5ICBUeCBTdWNjZXNzISFcbiIpOwotCi0JCQlyZXN1bHRbdF1bMF0gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclR4X1Bvd2VyX0JlZm9yZV9JUUtfQSkmMHgzRkYwMDAwKT4+MTY7Ci0JCQlyZXN1bHRbdF1bMV0gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclR4X1Bvd2VyX0FmdGVyX0lRS19BKSYweDNGRjAwMDApPj4xNjsKLQkJfQotCX0KLQotCWlmICgweDAwID09IFBhdGhBT0spIHsKLQkJREJHXzg3MjNBKCJQYXRoIEEgSVFLIGZhaWxlZCEhXG4iKTsKLQl9Ci0KLQlpZiAoaXMyVCkgewotCQlfUEhZX1BhdGhBU3RhbmRCeShwQWRhcHRlcik7Ci0KLQkJLyogIFR1cm4gUGF0aCBCIEFEREEgb24gKi8KLQkJX1BIWV9QYXRoQUREQU9uKHBBZGFwdGVyLCBBRERBX1JFRywgZmFsc2UsIGlzMlQpOwotCi0JCWZvciAoaSA9IDAgOyBpIDwgcmV0cnlDb3VudCA7IGkrKykgewotCQkJUGF0aEJPSyA9IF9QSFlfUGF0aEJfSVFLKHBBZGFwdGVyKTsKLQkJCWlmIChQYXRoQk9LID09IDB4MDMpIHsKLQkJCQlEQkdfODcyM0EoIlBhdGggQiBJUUsgU3VjY2VzcyEhXG4iKTsKLQkJCQlyZXN1bHRbdF1bNF0gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclR4X1Bvd2VyX0JlZm9yZV9JUUtfQikmMHgzRkYwMDAwKT4+MTY7Ci0JCQkJcmVzdWx0W3RdWzVdID0gKHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJUeF9Qb3dlcl9BZnRlcl9JUUtfQikmMHgzRkYwMDAwKT4+MTY7Ci0JCQkJcmVzdWx0W3RdWzZdID0gKHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJSeF9Qb3dlcl9CZWZvcmVfSVFLX0JfMikmMHgzRkYwMDAwKT4+MTY7Ci0JCQkJcmVzdWx0W3RdWzddID0gKHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJSeF9Qb3dlcl9BZnRlcl9JUUtfQl8yKSYweDNGRjAwMDApPj4xNjsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSBpZiAoaSA9PSAocmV0cnlDb3VudCAtIDEpICYmIFBhdGhCT0sgPT0gMHgwMSkgewotCQkJCS8qIFR4IElRSyBPSyAqLwotCQkJCURCR184NzIzQSgiUGF0aCBCIE9ubHkgVHggSVFLIFN1Y2Nlc3MhIVxuIik7Ci0JCQkJcmVzdWx0W3RdWzRdID0gKHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJUeF9Qb3dlcl9CZWZvcmVfSVFLX0IpJjB4M0ZGMDAwMCk+PjE2OwotCQkJCXJlc3VsdFt0XVs1XSA9IChydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByVHhfUG93ZXJfQWZ0ZXJfSVFLX0IpJjB4M0ZGMDAwMCk+PjE2OwotCQkJfQotCQl9Ci0KLQkJaWYgKDB4MDAgPT0gUGF0aEJPSykgewotCQkJREJHXzg3MjNBKCJQYXRoIEIgSVFLIGZhaWxlZCEhXG4iKTsKLQkJfQotCX0KLQotCS8qIEJhY2sgdG8gQkIgbW9kZSwgbG9hZCBvcmlnaW5hbCB2YWx1ZSAqLwotCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByRlBHQTBfSVFLLCAwKTsKLQotCWlmICh0ICE9IDApIHsKLQkJaWYgKCFwZG1wcml2LT5iUmZQaUVuYWJsZSkgewotCQkJLyogIFN3aXRjaCBiYWNrIEJCIHRvIFNJIG1vZGUgYWZ0ZXIgZmluaXNoIElRIENhbGlicmF0aW9uLiAqLwotCQkJX1BIWV9QSU1vZGVTd2l0Y2gocEFkYXB0ZXIsIGZhbHNlKTsKLQkJfQotCi0JCS8qICBSZWxvYWQgQUREQSBwb3dlciBzYXZpbmcgcGFyYW1ldGVycyAqLwotCQlfUEhZX1JlbG9hZEFEREFSZWdpc3RlcnMocEFkYXB0ZXIsIEFEREFfUkVHLCBwZG1wcml2LT5BRERBX2JhY2t1cCwgSVFLX0FEREFfUkVHX05VTSk7Ci0KLQkJLyogIFJlbG9hZCBNQUMgcGFyYW1ldGVycyAqLwotCQlfUEhZX1JlbG9hZE1BQ1JlZ2lzdGVycyhwQWRhcHRlciwgSVFLX01BQ19SRUcsIHBkbXByaXYtPklRS19NQUNfYmFja3VwKTsKLQotCQkvKiAgUmVsb2FkIEJCIHBhcmFtZXRlcnMgKi8KLQkJX1BIWV9SZWxvYWRBRERBUmVnaXN0ZXJzKHBBZGFwdGVyLCBJUUtfQkJfUkVHXzkyQywgcGRtcHJpdi0+SVFLX0JCX2JhY2t1cCwgSVFLX0JCX1JFR19OVU0pOwotCi0JCS8qICBSZXN0b3JlIFJYIGluaXRpYWwgZ2FpbiAqLwotCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwKLQkJCQkgIHJGUEdBMF9YQV9MU1NJUGFyYW1ldGVyLCAweDAwMDMyZWQzKTsKLQkJaWYgKGlzMlQpIHsKLQkJCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLAotCQkJCQkgIHJGUEdBMF9YQl9MU1NJUGFyYW1ldGVyLCAweDAwMDMyZWQzKTsKLQkJfQotCi0JCS8qIGxvYWQgMHhlMzAgSVFDIGRlZmF1bHQgdmFsdWUgKi8KLQkJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJUeF9JUUtfVG9uZV9BLCAweDAxMDA4YzAwKTsKLQkJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJSeF9JUUtfVG9uZV9BLCAweDAxMDA4YzAwKTsKLQotCX0KLX0KLQotc3RhdGljIHZvaWQgX1BIWV9MQ0NhbGlicmF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCBib29sIGlzMlQpCi17Ci0JdTggdG1wUmVnOwotCXUzMiBSRl9BbW9kZSA9IDAsIFJGX0Jtb2RlID0gMCwgTENfQ2FsOwotCi0JLyogQ2hlY2sgY29udGludW91cyBUWCBhbmQgUGFja2V0IFRYICovCi0JdG1wUmVnID0gcnRsODcyM2F1X3JlYWQ4KHBBZGFwdGVyLCAweGQwMyk7Ci0KLQlpZiAoKHRtcFJlZyYweDcwKSAhPSAwKSB7Ci0JCS8qIERlYWwgd2l0aCBjb250aXN1b3VzIFRYIGNhc2UgKi8KLQkJLyogZGlzYWJsZSBhbGwgY29udGludW91cyBUWCAqLwotCQlydGw4NzIzYXVfd3JpdGU4KHBBZGFwdGVyLCAweGQwMywgdG1wUmVnJjB4OEYpOwotCX0gZWxzZSB7Ci0JCS8qICBEZWFsIHdpdGggUGFja2V0IFRYIGNhc2UgKi8KLQkJLyogIGJsb2NrIGFsbCBxdWV1ZXMgKi8KLQkJcnRsODcyM2F1X3dyaXRlOChwQWRhcHRlciwgUkVHX1RYUEFVU0UsIDB4RkYpOwotCX0KLQotCWlmICgodG1wUmVnJjB4NzApICE9IDApIHsKLQkJLyogMS4gUmVhZCBvcmlnaW5hbCBSRiBtb2RlICovCi0JCS8qIFBhdGgtQSAqLwotCQlSRl9BbW9kZSA9IFBIWV9RdWVyeVJGUmVnKHBBZGFwdGVyLCBSRl9QQVRIX0EsIFJGX0FDLCBiTWFzazEyQml0cyk7Ci0KLQkJLyogUGF0aC1CICovCi0JCWlmIChpczJUKQotCQkJUkZfQm1vZGUgPSBQSFlfUXVlcnlSRlJlZyhwQWRhcHRlciwgUkZfUEFUSF9CLCBSRl9BQywgYk1hc2sxMkJpdHMpOwotCi0JCS8qIDIuIFNldCBSRiBtb2RlID0gc3RhbmRieSBtb2RlICovCi0JCS8qIFBhdGgtQSAqLwotCQlQSFlfU2V0UkZSZWcocEFkYXB0ZXIsIFJGX1BBVEhfQSwgUkZfQUMsIGJNYXNrMTJCaXRzLCAoUkZfQW1vZGUmMHg4RkZGRil8MHgxMDAwMCk7Ci0KLQkJLyogUGF0aC1CICovCi0JCWlmIChpczJUKQotCQkJUEhZX1NldFJGUmVnKHBBZGFwdGVyLCBSRl9QQVRIX0IsIFJGX0FDLCBiTWFzazEyQml0cywgKFJGX0Jtb2RlJjB4OEZGRkYpfDB4MTAwMDApOwotCX0KLQotCS8qIDMuIFJlYWQgUkYgcmVnMTggKi8KLQlMQ19DYWwgPSBQSFlfUXVlcnlSRlJlZyhwQWRhcHRlciwgUkZfUEFUSF9BLCBSRl9DSE5MQlcsIGJNYXNrMTJCaXRzKTsKLQotCS8qIDQuIFNldCBMQyBjYWxpYnJhdGlvbiBiZWdpbiAqLwotCVBIWV9TZXRSRlJlZyhwQWRhcHRlciwgUkZfUEFUSF9BLCBSRl9DSE5MQlcsIGJNYXNrMTJCaXRzLCBMQ19DYWx8MHgwODAwMCk7Ci0KLQltc2xlZXAoMTAwKTsKLQotCS8qIFJlc3RvcmUgb3JpZ2luYWwgc2l0dWF0aW9uICovCi0JaWYgKCh0bXBSZWcmMHg3MCkgIT0gMCkgewkvKiBEZWFsIHdpdGggY29udHVvdXMgVFggY2FzZSAgKi8KLQkJLyogUGF0aC1BICovCi0JCXJ0bDg3MjNhdV93cml0ZTgocEFkYXB0ZXIsIDB4ZDAzLCB0bXBSZWcpOwotCQlQSFlfU2V0UkZSZWcocEFkYXB0ZXIsIFJGX1BBVEhfQSwgUkZfQUMsIGJNYXNrMTJCaXRzLCBSRl9BbW9kZSk7Ci0KLQkJLyogUGF0aC1CICovCi0JCWlmIChpczJUKQotCQkJUEhZX1NldFJGUmVnKHBBZGFwdGVyLCBSRl9QQVRIX0IsIFJGX0FDLCBiTWFzazEyQml0cywgUkZfQm1vZGUpOwotCX0gZWxzZSAvKiAgRGVhbCB3aXRoIFBhY2tldCBUWCBjYXNlICovCi0JCXJ0bDg3MjNhdV93cml0ZTgocEFkYXB0ZXIsIFJFR19UWFBBVVNFLCAweDAwKTsKLX0KLQotLyogQW5hbG9nIFByZS1kaXN0b3J0aW9uIGNhbGlicmF0aW9uICovCi0jZGVmaW5lCQlBUEtfQkJfUkVHX05VTQk4Ci0jZGVmaW5lCQlBUEtfQ1VSVkVfUkVHX05VTSA0Ci0jZGVmaW5lCQlQQVRIX05VTQkJMgotCi12b2lkIHJ0bDg3MjNhX3BoeV9pcV9jYWxpYnJhdGUoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgYm9vbCBiUmVDb3ZlcnkpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwQWRhcHRlcik7Ci0Jc3RydWN0IGRtX3ByaXYgKnBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKLQlzMzIgcmVzdWx0WzRdWzhdOwkvKiBsYXN0IGlzIGZpbmFsIHJlc3VsdCAqLwotCXU4IGksIGZpbmFsX2NhbmRpZGF0ZTsKLQlib29sIGJQYXRoQU9LLCBiUGF0aEJPSzsKLQlzMzIgUmVnRTk0LCBSZWdFOUMsIFJlZ0VBNCwgUmVnRUFDLCBSZWdFQjQsIFJlZ0VCQywgUmVnRUM0OwotCXMzMiBSZWdFQ0MsIFJlZ1RtcCA9IDA7Ci0JYm9vbCBpczEyc2ltdWxhciwgaXMxM3NpbXVsYXIsIGlzMjNzaW11bGFyOwotCWJvb2wgYlN0YXJ0Q29udFR4ID0gZmFsc2UsIGJTaW5nbGVUb25lID0gZmFsc2U7Ci0JYm9vbCBiQ2FycmllclN1cHByZXNzaW9uID0gZmFsc2U7Ci0JdTMyIElRS19CQl9SRUdfOTJDW0lRS19CQl9SRUdfTlVNXSA9IHsKLQkJck9GRE0wX1hBUnhJUUltYmFsYW5jZSwgck9GRE0wX1hCUnhJUUltYmFsYW5jZSwKLQkJck9GRE0wX0VDQ0FUaHJlc2hvbGQsIHJPRkRNMF9BR0NSU1NJVGFibGUsCi0JCXJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsIHJPRkRNMF9YQlR4SVFJbWJhbGFuY2UsCi0JCXJPRkRNMF9YQ1R4QUZFLCByT0ZETTBfWERUeEFGRSwKLQkJck9GRE0wX1J4SVFFeHRBbnRhCi0JfTsKLQotCS8qIGlnbm9yZSBJUUsgd2hlbiBjb250aW51b3VzIFR4ICovCi0JaWYgKGJTdGFydENvbnRUeCB8fCBiU2luZ2xlVG9uZSB8fCBiQ2FycmllclN1cHByZXNzaW9uKQotCQlyZXR1cm47Ci0KLQlpZiAoYlJlQ292ZXJ5KSB7Ci0JCV9QSFlfUmVsb2FkQUREQVJlZ2lzdGVycyhwQWRhcHRlciwgSVFLX0JCX1JFR185MkMsIHBkbXByaXYtPklRS19CQl9iYWNrdXBfcmVjb3ZlciwgOSk7Ci0JCXJldHVybjsKLQl9Ci0JREJHXzg3MjNBKCJJUUs6U3RhcnQhISFcbiIpOwotCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQlyZXN1bHRbMF1baV0gPSAwOwotCQlyZXN1bHRbMV1baV0gPSAwOwotCQlyZXN1bHRbMl1baV0gPSAwOwotCQlyZXN1bHRbM11baV0gPSAwOwotCX0KLQlmaW5hbF9jYW5kaWRhdGUgPSAweGZmOwotCWJQYXRoQU9LID0gZmFsc2U7Ci0JYlBhdGhCT0sgPSBmYWxzZTsKLQlpczEyc2ltdWxhciA9IGZhbHNlOwotCWlzMjNzaW11bGFyID0gZmFsc2U7Ci0JaXMxM3NpbXVsYXIgPSBmYWxzZTsKLQotCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJaWYgKHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzJUMlIpCi0JCQlfUEhZX0lRQ2FsaWJyYXRlKHBBZGFwdGVyLCByZXN1bHQsIGksIHRydWUpOwotCQllbHNlIC8qICBGb3IgODhDIDFUMVIgKi8KLQkJCV9QSFlfSVFDYWxpYnJhdGUocEFkYXB0ZXIsIHJlc3VsdCwgaSwgZmFsc2UpOwotCi0JCWlmIChpID09IDEpIHsKLQkJCWlzMTJzaW11bGFyID0gX1BIWV9TaW11bGFyaXR5Q29tcGFyZShwQWRhcHRlciwgcmVzdWx0LCAwLCAxKTsKLQkJCWlmIChpczEyc2ltdWxhcikgewotCQkJCWZpbmFsX2NhbmRpZGF0ZSA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaSA9PSAyKSB7Ci0JCQlpczEzc2ltdWxhciA9IF9QSFlfU2ltdWxhcml0eUNvbXBhcmUocEFkYXB0ZXIsIHJlc3VsdCwgMCwgMik7Ci0JCQlpZiAoaXMxM3NpbXVsYXIpIHsKLQkJCQlmaW5hbF9jYW5kaWRhdGUgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpczIzc2ltdWxhciA9IF9QSFlfU2ltdWxhcml0eUNvbXBhcmUocEFkYXB0ZXIsIHJlc3VsdCwgMSwgMik7Ci0JCQlpZiAoaXMyM3NpbXVsYXIpIHsKLQkJCQlmaW5hbF9jYW5kaWRhdGUgPSAxOwotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQkJCQlSZWdUbXAgKz0gcmVzdWx0WzNdW2ldOwotCi0JCQkJaWYgKFJlZ1RtcCAhPSAwKQotCQkJCQlmaW5hbF9jYW5kaWRhdGUgPSAzOwotCQkJCWVsc2UKLQkJCQkJZmluYWxfY2FuZGlkYXRlID0gMHhGRjsKLQkJCX0KLQkJfQotCX0KLQotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJUmVnRTk0ID0gcmVzdWx0W2ldWzBdOwotCQlSZWdFOUMgPSByZXN1bHRbaV1bMV07Ci0JCVJlZ0VBNCA9IHJlc3VsdFtpXVsyXTsKLQkJUmVnRUFDID0gcmVzdWx0W2ldWzNdOwotCQlSZWdFQjQgPSByZXN1bHRbaV1bNF07Ci0JCVJlZ0VCQyA9IHJlc3VsdFtpXVs1XTsKLQkJUmVnRUM0ID0gcmVzdWx0W2ldWzZdOwotCQlSZWdFQ0MgPSByZXN1bHRbaV1bN107Ci0JfQotCi0JaWYgKGZpbmFsX2NhbmRpZGF0ZSAhPSAweGZmKSB7Ci0JCVJlZ0U5NCA9IHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdWzBdOwotCQlwZG1wcml2LT5SZWdFOTQgPSAgUmVnRTk0OwotCQlSZWdFOUMgPSByZXN1bHRbZmluYWxfY2FuZGlkYXRlXVsxXTsKLQkJcGRtcHJpdi0+UmVnRTlDID0gUmVnRTlDOwotCQlSZWdFQTQgPSByZXN1bHRbZmluYWxfY2FuZGlkYXRlXVsyXTsKLQkJUmVnRUFDID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bM107Ci0JCVJlZ0VCNCA9IHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdWzRdOwotCQlwZG1wcml2LT5SZWdFQjQgPSBSZWdFQjQ7Ci0JCVJlZ0VCQyA9IHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdWzVdOwotCQlwZG1wcml2LT5SZWdFQkMgPSBSZWdFQkM7Ci0JCVJlZ0VDNCA9IHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdWzZdOwotCQlSZWdFQ0MgPSByZXN1bHRbZmluYWxfY2FuZGlkYXRlXVs3XTsKLQkJREJHXzg3MjNBKCJJUUs6IGZpbmFsX2NhbmRpZGF0ZSBpcyAleFxuIiwgZmluYWxfY2FuZGlkYXRlKTsKLQkJREJHXzg3MjNBKCJJUUs6IFJlZ0U5NCA9JXggUmVnRTlDID0leCBSZWdFQTQgPSV4IFJlZ0VBQyA9JXggUmVnRUI0ID0leCBSZWdFQkMgPSV4IFJlZ0VDNCA9JXggUmVnRUNDID0leFxuICIsCi0JCQkgIFJlZ0U5NCwgUmVnRTlDLCBSZWdFQTQsIFJlZ0VBQywgUmVnRUI0LCBSZWdFQkMsIFJlZ0VDNCwgUmVnRUNDKTsKLQkJYlBhdGhBT0sgPSBiUGF0aEJPSyA9IHRydWU7Ci0JfSBlbHNlIHsKLQkJUmVnRTk0ID0gUmVnRUI0ID0gcGRtcHJpdi0+UmVnRTk0ID0gcGRtcHJpdi0+UmVnRUI0ID0gMHgxMDA7CS8qIFggZGVmYXVsdCB2YWx1ZSAqLwotCQlSZWdFOUMgPSBSZWdFQkMgPSBwZG1wcml2LT5SZWdFOUMgPSBwZG1wcml2LT5SZWdFQkMgPSAweDA7CQkvKiBZIGRlZmF1bHQgdmFsdWUgKi8KLQl9Ci0KLQlpZiAoKFJlZ0U5NCAhPSAwKS8qJiYoUmVnRUE0ICE9IDApKi8pCi0JCV9QSFlfUGF0aEFGaWxsSVFLTWF0cml4KHBBZGFwdGVyLCBiUGF0aEFPSywgcmVzdWx0LCBmaW5hbF9jYW5kaWRhdGUsIChSZWdFQTQgPT0gMCkpOwotCi0JaWYgKHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzJUMlIpIHsKLQkJaWYgKChSZWdFQjQgIT0gMCkvKiYmKFJlZ0VDNCAhPSAwKSovKQotCQkJX1BIWV9QYXRoQkZpbGxJUUtNYXRyaXgocEFkYXB0ZXIsIGJQYXRoQk9LLCByZXN1bHQsCi0JCQkJCQlmaW5hbF9jYW5kaWRhdGUsIChSZWdFQzQgPT0gMCkpOwotCX0KLQotCV9QSFlfU2F2ZUFEREFSZWdpc3RlcnMocEFkYXB0ZXIsIElRS19CQl9SRUdfOTJDLCBwZG1wcml2LT5JUUtfQkJfYmFja3VwX3JlY292ZXIsIDkpOwotfQotCi12b2lkIHJ0bDg3MjNhX3BoeV9sY19jYWxpYnJhdGUoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBBZGFwdGVyKTsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcEFkYXB0ZXItPm1sbWVleHRwcml2OwotCWJvb2wgYlN0YXJ0Q29udFR4ID0gZmFsc2UsIGJTaW5nbGVUb25lID0gZmFsc2UsIGJDYXJyaWVyU3VwcHJlc3Npb24gPSBmYWxzZTsKLQotCS8qIGlnbm9yZSBJUUsgd2hlbiBjb250aW51b3VzIFR4ICovCi0JaWYgKGJTdGFydENvbnRUeCB8fCBiU2luZ2xlVG9uZSB8fCBiQ2FycmllclN1cHByZXNzaW9uKQotCQlyZXR1cm47Ci0KLQlpZiAocG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnN0YXRlID09IFNDQU5fUFJPQ0VTUykKLQkJcmV0dXJuOwotCi0JaWYgKHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzJUMlIpCi0JCV9QSFlfTENDYWxpYnJhdGUocEFkYXB0ZXIsIHRydWUpOwotCWVsc2UJLyogIEZvciA4OEMgMVQxUiAqLwotCQlfUEhZX0xDQ2FsaWJyYXRlKHBBZGFwdGVyLCBmYWxzZSk7Ci19Ci0KLXZvaWQKLXJ0bDg3MjNhX3BoeV9hcF9jYWxpYnJhdGUoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgY2hhciBkZWx0YSkKLXsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbEhXSW1nODcyM0FfQkIuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbEhXSW1nODcyM0FfQkIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQzZWE2Yy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWxIV0ltZzg3MjNBX0JCLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0qIG1vcmUgZGV0YWlscy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm9kbV9wcmVjb21wLmgiCi0KLXN0YXRpYyBib29sIENoZWNrQ29uZGl0aW9uKGNvbnN0IHUzMiAgQ29uZGl0aW9uLCBjb25zdCB1MzIgIEhleCkKLXsKLQl1MzIgX2JvYXJkICAgICA9IChIZXggJiAweDAwMDAwMEZGKTsKLQl1MzIgX2ludGVyZmFjZSA9IChIZXggJiAweDAwMDBGRjAwKSA+PiA4OwotCXUzMiBfcGxhdGZvcm0gID0gKEhleCAmIDB4MDBGRjAwMDApID4+IDE2OwotCXUzMiBjb25kID0gQ29uZGl0aW9uOwotCi0JaWYgKENvbmRpdGlvbiA9PSAweENEQ0RDRENEKQotCQlyZXR1cm4gdHJ1ZTsKLQotCWNvbmQgPSBDb25kaXRpb24gJiAweDAwMDAwMEZGOwotCWlmICgoX2JvYXJkID09IGNvbmQpICYmIGNvbmQgIT0gMHgwMCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JY29uZCA9IENvbmRpdGlvbiAmIDB4MDAwMEZGMDA7Ci0JY29uZCA+Pj0gODsKLQlpZiAoKF9pbnRlcmZhY2UgJiBjb25kKSA9PSAwICYmIGNvbmQgIT0gMHgwNykKLQkJcmV0dXJuIGZhbHNlOwotCi0JY29uZCA9IENvbmRpdGlvbiAmIDB4MDBGRjAwMDA7Ci0JY29uZCA+Pj0gMTY7Ci0JaWYgKChfcGxhdGZvcm0gJiBjb25kKSA9PSAwICYmIGNvbmQgIT0gMHgwRikKLQkJcmV0dXJuIGZhbHNlOwotCXJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgQUdDX1RBQl8xVC5UWFQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHUzMiBBcnJheV9BR0NfVEFCXzFUXzg3MjNBW10gPSB7Ci0JMHhDNzgsIDB4N0IwMDAwMDEsCi0JMHhDNzgsIDB4N0IwMTAwMDEsCi0JMHhDNzgsIDB4N0IwMjAwMDEsCi0JMHhDNzgsIDB4N0IwMzAwMDEsCi0JMHhDNzgsIDB4N0IwNDAwMDEsCi0JMHhDNzgsIDB4N0IwNTAwMDEsCi0JMHhDNzgsIDB4N0EwNjAwMDEsCi0JMHhDNzgsIDB4NzkwNzAwMDEsCi0JMHhDNzgsIDB4NzgwODAwMDEsCi0JMHhDNzgsIDB4NzcwOTAwMDEsCi0JMHhDNzgsIDB4NzYwQTAwMDEsCi0JMHhDNzgsIDB4NzUwQjAwMDEsCi0JMHhDNzgsIDB4NzQwQzAwMDEsCi0JMHhDNzgsIDB4NzMwRDAwMDEsCi0JMHhDNzgsIDB4NzIwRTAwMDEsCi0JMHhDNzgsIDB4NzEwRjAwMDEsCi0JMHhDNzgsIDB4NzAxMDAwMDEsCi0JMHhDNzgsIDB4NkYxMTAwMDEsCi0JMHhDNzgsIDB4NkUxMjAwMDEsCi0JMHhDNzgsIDB4NkQxMzAwMDEsCi0JMHhDNzgsIDB4NkMxNDAwMDEsCi0JMHhDNzgsIDB4NkIxNTAwMDEsCi0JMHhDNzgsIDB4NkExNjAwMDEsCi0JMHhDNzgsIDB4NjkxNzAwMDEsCi0JMHhDNzgsIDB4NjgxODAwMDEsCi0JMHhDNzgsIDB4NjcxOTAwMDEsCi0JMHhDNzgsIDB4NjYxQTAwMDEsCi0JMHhDNzgsIDB4NjUxQjAwMDEsCi0JMHhDNzgsIDB4NjQxQzAwMDEsCi0JMHhDNzgsIDB4NjMxRDAwMDEsCi0JMHhDNzgsIDB4NjIxRTAwMDEsCi0JMHhDNzgsIDB4NjExRjAwMDEsCi0JMHhDNzgsIDB4NjAyMDAwMDEsCi0JMHhDNzgsIDB4NDkyMTAwMDEsCi0JMHhDNzgsIDB4NDgyMjAwMDEsCi0JMHhDNzgsIDB4NDcyMzAwMDEsCi0JMHhDNzgsIDB4NDYyNDAwMDEsCi0JMHhDNzgsIDB4NDUyNTAwMDEsCi0JMHhDNzgsIDB4NDQyNjAwMDEsCi0JMHhDNzgsIDB4NDMyNzAwMDEsCi0JMHhDNzgsIDB4NDIyODAwMDEsCi0JMHhDNzgsIDB4NDEyOTAwMDEsCi0JMHhDNzgsIDB4NDAyQTAwMDEsCi0JMHhDNzgsIDB4MjYyQjAwMDEsCi0JMHhDNzgsIDB4MjUyQzAwMDEsCi0JMHhDNzgsIDB4MjQyRDAwMDEsCi0JMHhDNzgsIDB4MjMyRTAwMDEsCi0JMHhDNzgsIDB4MjIyRjAwMDEsCi0JMHhDNzgsIDB4MjEzMDAwMDEsCi0JMHhDNzgsIDB4MjAzMTAwMDEsCi0JMHhDNzgsIDB4MDYzMjAwMDEsCi0JMHhDNzgsIDB4MDUzMzAwMDEsCi0JMHhDNzgsIDB4MDQzNDAwMDEsCi0JMHhDNzgsIDB4MDMzNTAwMDEsCi0JMHhDNzgsIDB4MDIzNjAwMDEsCi0JMHhDNzgsIDB4MDEzNzAwMDEsCi0JMHhDNzgsIDB4MDAzODAwMDEsCi0JMHhDNzgsIDB4MDAzOTAwMDEsCi0JMHhDNzgsIDB4MDAzQTAwMDEsCi0JMHhDNzgsIDB4MDAzQjAwMDEsCi0JMHhDNzgsIDB4MDAzQzAwMDEsCi0JMHhDNzgsIDB4MDAzRDAwMDEsCi0JMHhDNzgsIDB4MDAzRTAwMDEsCi0JMHhDNzgsIDB4MDAzRjAwMDEsCi0JMHhDNzgsIDB4N0I0MDAwMDEsCi0JMHhDNzgsIDB4N0I0MTAwMDEsCi0JMHhDNzgsIDB4N0I0MjAwMDEsCi0JMHhDNzgsIDB4N0I0MzAwMDEsCi0JMHhDNzgsIDB4N0I0NDAwMDEsCi0JMHhDNzgsIDB4N0I0NTAwMDEsCi0JMHhDNzgsIDB4N0E0NjAwMDEsCi0JMHhDNzgsIDB4Nzk0NzAwMDEsCi0JMHhDNzgsIDB4Nzg0ODAwMDEsCi0JMHhDNzgsIDB4Nzc0OTAwMDEsCi0JMHhDNzgsIDB4NzY0QTAwMDEsCi0JMHhDNzgsIDB4NzU0QjAwMDEsCi0JMHhDNzgsIDB4NzQ0QzAwMDEsCi0JMHhDNzgsIDB4NzM0RDAwMDEsCi0JMHhDNzgsIDB4NzI0RTAwMDEsCi0JMHhDNzgsIDB4NzE0RjAwMDEsCi0JMHhDNzgsIDB4NzA1MDAwMDEsCi0JMHhDNzgsIDB4NkY1MTAwMDEsCi0JMHhDNzgsIDB4NkU1MjAwMDEsCi0JMHhDNzgsIDB4NkQ1MzAwMDEsCi0JMHhDNzgsIDB4NkM1NDAwMDEsCi0JMHhDNzgsIDB4NkI1NTAwMDEsCi0JMHhDNzgsIDB4NkE1NjAwMDEsCi0JMHhDNzgsIDB4Njk1NzAwMDEsCi0JMHhDNzgsIDB4Njg1ODAwMDEsCi0JMHhDNzgsIDB4Njc1OTAwMDEsCi0JMHhDNzgsIDB4NjY1QTAwMDEsCi0JMHhDNzgsIDB4NjU1QjAwMDEsCi0JMHhDNzgsIDB4NjQ1QzAwMDEsCi0JMHhDNzgsIDB4NjM1RDAwMDEsCi0JMHhDNzgsIDB4NjI1RTAwMDEsCi0JMHhDNzgsIDB4NjE1RjAwMDEsCi0JMHhDNzgsIDB4NjA2MDAwMDEsCi0JMHhDNzgsIDB4NDk2MTAwMDEsCi0JMHhDNzgsIDB4NDg2MjAwMDEsCi0JMHhDNzgsIDB4NDc2MzAwMDEsCi0JMHhDNzgsIDB4NDY2NDAwMDEsCi0JMHhDNzgsIDB4NDU2NTAwMDEsCi0JMHhDNzgsIDB4NDQ2NjAwMDEsCi0JMHhDNzgsIDB4NDM2NzAwMDEsCi0JMHhDNzgsIDB4NDI2ODAwMDEsCi0JMHhDNzgsIDB4NDE2OTAwMDEsCi0JMHhDNzgsIDB4NDA2QTAwMDEsCi0JMHhDNzgsIDB4MjY2QjAwMDEsCi0JMHhDNzgsIDB4MjU2QzAwMDEsCi0JMHhDNzgsIDB4MjQ2RDAwMDEsCi0JMHhDNzgsIDB4MjM2RTAwMDEsCi0JMHhDNzgsIDB4MjI2RjAwMDEsCi0JMHhDNzgsIDB4MjE3MDAwMDEsCi0JMHhDNzgsIDB4MjA3MTAwMDEsCi0JMHhDNzgsIDB4MDY3MjAwMDEsCi0JMHhDNzgsIDB4MDU3MzAwMDEsCi0JMHhDNzgsIDB4MDQ3NDAwMDEsCi0JMHhDNzgsIDB4MDM3NTAwMDEsCi0JMHhDNzgsIDB4MDI3NjAwMDEsCi0JMHhDNzgsIDB4MDE3NzAwMDEsCi0JMHhDNzgsIDB4MDA3ODAwMDEsCi0JMHhDNzgsIDB4MDA3OTAwMDEsCi0JMHhDNzgsIDB4MDA3QTAwMDEsCi0JMHhDNzgsIDB4MDA3QjAwMDEsCi0JMHhDNzgsIDB4MDA3QzAwMDEsCi0JMHhDNzgsIDB4MDA3RDAwMDEsCi0JMHhDNzgsIDB4MDA3RTAwMDEsCi0JMHhDNzgsIDB4MDA3RjAwMDEsCi0JMHhDNzgsIDB4MzgwMDAwMUUsCi0JMHhDNzgsIDB4MzgwMTAwMUUsCi0JMHhDNzgsIDB4MzgwMjAwMUUsCi0JMHhDNzgsIDB4MzgwMzAwMUUsCi0JMHhDNzgsIDB4MzgwNDAwMUUsCi0JMHhDNzgsIDB4MzgwNTAwMUUsCi0JMHhDNzgsIDB4MzgwNjAwMUUsCi0JMHhDNzgsIDB4MzgwNzAwMUUsCi0JMHhDNzgsIDB4MzgwODAwMUUsCi0JMHhDNzgsIDB4M0MwOTAwMUUsCi0JMHhDNzgsIDB4M0UwQTAwMUUsCi0JMHhDNzgsIDB4NDAwQjAwMUUsCi0JMHhDNzgsIDB4NDQwQzAwMUUsCi0JMHhDNzgsIDB4NDgwRDAwMUUsCi0JMHhDNzgsIDB4NEMwRTAwMUUsCi0JMHhDNzgsIDB4NTAwRjAwMUUsCi0JMHhDNzgsIDB4NTIxMDAwMUUsCi0JMHhDNzgsIDB4NTYxMTAwMUUsCi0JMHhDNzgsIDB4NUExMjAwMUUsCi0JMHhDNzgsIDB4NUUxMzAwMUUsCi0JMHhDNzgsIDB4NjAxNDAwMUUsCi0JMHhDNzgsIDB4NjAxNTAwMUUsCi0JMHhDNzgsIDB4NjAxNjAwMUUsCi0JMHhDNzgsIDB4NjIxNzAwMUUsCi0JMHhDNzgsIDB4NjIxODAwMUUsCi0JMHhDNzgsIDB4NjIxOTAwMUUsCi0JMHhDNzgsIDB4NjIxQTAwMUUsCi0JMHhDNzgsIDB4NjIxQjAwMUUsCi0JMHhDNzgsIDB4NjIxQzAwMUUsCi0JMHhDNzgsIDB4NjIxRDAwMUUsCi0JMHhDNzgsIDB4NjIxRTAwMUUsCi0JMHhDNzgsIDB4NjIxRjAwMUUsCi19OwotCi0jZGVmaW5lIFJFQURfTkVYVF9QQUlSKHYxLCB2MiwgaSkJCQlcCi0JZG8gewkJCQkJCVwKLQkJaSArPSAyOyB2MSA9IEFycmF5W2ldOyB2MiA9IEFycmF5W2krMV07CVwKLQl9IHdoaWxlICgwKQotCi12b2lkIE9ETV9SZWFkQW5kQ29uZmlnX0FHQ19UQUJfMVRfODcyM0Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCXUzMiBoZXg7Ci0JdTMyIGk7Ci0JdTggcGxhdGZvcm0gPSAweDA0OwotCXU4IGJvYXJkID0gcERNX09kbS0+Qm9hcmRUeXBlOwotCXUzMiBBcnJheUxlbiA9IEFSUkFZX1NJWkUoQXJyYXlfQUdDX1RBQl8xVF84NzIzQSk7Ci0JdTMyICpBcnJheSA9IEFycmF5X0FHQ19UQUJfMVRfODcyM0E7Ci0KLQloZXggPSBib2FyZDsKLQloZXggKz0gT0RNX0lUUkZfVVNCIDw8IDg7Ci0JaGV4ICs9IHBsYXRmb3JtIDw8IDE2OwotCWhleCArPSAweEZGMDAwMDAwOwotCWZvciAoaSA9IDA7IGkgPCBBcnJheUxlbjsgaSArPSAyKSB7Ci0JCXUzMiB2MSA9IEFycmF5W2ldOwotCQl1MzIgdjIgPSBBcnJheVtpKzFdOwotCi0JCS8qICBUaGlzIChvZmZzZXQsIGRhdGEpIHBhaXIgbWVldHMgdGhlIGNvbmRpdGlvbi4gKi8KLQkJaWYgKHYxIDwgMHhDRENEQ0RDRCkgewotCQkJb2RtX0NvbmZpZ0JCX0FHQ184NzIzQShwRE1fT2RtLCB2MSwgdjIpOwotCQkJY29udGludWU7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIUNoZWNrQ29uZGl0aW9uKEFycmF5W2ldLCBoZXgpKSB7Ci0JCQkJLyogRGlzY2FyZCB0aGUgZm9sbG93aW5nIChvZmZzZXQsIGRhdGEpIHBhaXJzICovCi0JCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmCi0JCQkJICAgICAgIHYyICE9IDB4Q0RFRiAmJgotCQkJCSAgICAgICB2MiAhPSAweENEQ0QgJiYgaSA8IEFycmF5TGVuIC0gMikKLQkJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQlpIC09IDI7IC8qICBwcmV2ZW50IGZyb20gZm9yLWxvb3AgKz0gMiAqLwotCQkJfSBlbHNlIHsKLQkJCQkvKiAgQ29uZmlndXJlIG1hdGNoZWQgcGFpcnMgYW5kIHNraXAgdG8KLQkJCQkgICAgZW5kIG9mIGlmLWVsc2UuICovCi0JCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmCi0JCQkJICAgICAgIHYyICE9IDB4Q0RFRiAmJgotCQkJCSAgICAgICB2MiAhPSAweENEQ0QgJiYgaSA8IEFycmF5TGVuIC0gMikgewotCQkJCQlvZG1fQ29uZmlnQkJfQUdDXzg3MjNBKHBETV9PZG0sIHYxLCB2Mik7Ci0JCQkJCVJFQURfTkVYVF9QQUlSKHYxLCB2MiwgaSk7Ci0JCQkJfQotCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYgaSA8IEFycmF5TGVuIC0gMikKLQkJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFBIWV9SRUdfMVQuVFhUCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB1MzIgQXJyYXlfUEhZX1JFR18xVF84NzIzQVtdID0gewotCTB4ODAwLCAweDgwMDQwMDAwLAotCTB4ODA0LCAweDAwMDAwMDAzLAotCTB4ODA4LCAweDAwMDBGQzAwLAotCTB4ODBDLCAweDAwMDAwMDBBLAotCTB4ODEwLCAweDEwMDAxMzMxLAotCTB4ODE0LCAweDAyMEMzRDEwLAotCTB4ODE4LCAweDAyMjAwMzg1LAotCTB4ODFDLCAweDAwMDAwMDAwLAotCTB4ODIwLCAweDAxMDAwMTAwLAotCTB4ODI0LCAweDAwMzkwMDA0LAotCTB4ODI4LCAweDAwMDAwMDAwLAotCTB4ODJDLCAweDAwMDAwMDAwLAotCTB4ODMwLCAweDAwMDAwMDAwLAotCTB4ODM0LCAweDAwMDAwMDAwLAotCTB4ODM4LCAweDAwMDAwMDAwLAotCTB4ODNDLCAweDAwMDAwMDAwLAotCTB4ODQwLCAweDAwMDEwMDAwLAotCTB4ODQ0LCAweDAwMDAwMDAwLAotCTB4ODQ4LCAweDAwMDAwMDAwLAotCTB4ODRDLCAweDAwMDAwMDAwLAotCTB4ODUwLCAweDAwMDAwMDAwLAotCTB4ODU0LCAweDAwMDAwMDAwLAotCTB4ODU4LCAweDU2OUE1NjlBLAotCTB4ODVDLCAweDAwMUIyNUE0LAotCTB4ODYwLCAweDY2RjYwMTEwLAotCTB4ODY0LCAweDA2MUYwMTMwLAotCTB4ODY4LCAweDAwMDAwMDAwLAotCTB4ODZDLCAweDMyMzIzMjAwLAotCTB4ODcwLCAweDA3MDAwNzYwLAotCTB4ODc0LCAweDIyMDA0MDAwLAotCTB4ODc4LCAweDAwMDAwODA4LAotCTB4ODdDLCAweDAwMDAwMDAwLAotCTB4ODgwLCAweEMwMDgzMDcwLAotCTB4ODg0LCAweDAwMDAwNEQ1LAotCTB4ODg4LCAweDAwMDAwMDAwLAotCTB4ODhDLCAweENDQzAwMEMwLAotCTB4ODkwLCAweDAwMDAwODAwLAotCTB4ODk0LCAweEZGRkZGRkZFLAotCTB4ODk4LCAweDQwMzAyMDEwLAotCTB4ODlDLCAweDAwNzA2MDUwLAotCTB4OTAwLCAweDAwMDAwMDAwLAotCTB4OTA0LCAweDAwMDAwMDIzLAotCTB4OTA4LCAweDAwMDAwMDAwLAotCTB4OTBDLCAweDgxMTIxMTExLAotCTB4QTAwLCAweDAwRDA0N0M4LAotCTB4QTA0LCAweDgwRkYwMDBDLAotCTB4QTA4LCAweDhDODM4MzAwLAotCTB4QTBDLCAweDJFNjgxMjBGLAotCTB4QTEwLCAweDk1MDBCQjc4LAotCTB4QTE0LCAweDExMTQ0MDI4LAotCTB4QTE4LCAweDAwODgxMTE3LAotCTB4QTFDLCAweDg5MTQwRjAwLAotCTB4QTIwLCAweDFBMUIwMDAwLAotCTB4QTI0LCAweDA5MEUxMzE3LAotCTB4QTI4LCAweDAwMDAwMjA0LAotCTB4QTJDLCAweDAwRDMwMDAwLAotCTB4QTcwLCAweDEwMUZCRjAwLAotCTB4QTc0LCAweDAwMDAwMDA3LAotCTB4QTc4LCAweDAwMDAwOTAwLAotCTB4QzAwLCAweDQ4MDcxRDQwLAotCTB4QzA0LCAweDAzQTA1NjExLAotCTB4QzA4LCAweDAwMDAwMEU0LAotCTB4QzBDLCAweDZDNkM2QzZDLAotCTB4QzEwLCAweDA4ODAwMDAwLAotCTB4QzE0LCAweDQwMDAwMTAwLAotCTB4QzE4LCAweDA4ODAwMDAwLAotCTB4QzFDLCAweDQwMDAwMTAwLAotCTB4QzIwLCAweDAwMDAwMDAwLAotCTB4QzI0LCAweDAwMDAwMDAwLAotCTB4QzI4LCAweDAwMDAwMDAwLAotCTB4QzJDLCAweDAwMDAwMDAwLAotCTB4QzMwLCAweDY5RTlBQzQ0LAotCTB4RkYwRjAxMUYsIDB4QUJDRCwKLQkweEMzNCwgMHg0Njk2NTJDRiwKLQkweENEQ0RDRENELCAweENEQ0QsCi0JMHhDMzQsIDB4NDY5NjUyQUYsCi0JMHhGRjBGMDExRiwgMHhERUFELAotCTB4QzM4LCAweDQ5Nzk1OTk0LAotCTB4QzNDLCAweDBBOTc5NzFDLAotCTB4QzQwLCAweDFGN0M0MDNGLAotCTB4QzQ0LCAweDAwMDEwMEI3LAotCTB4QzQ4LCAweEVDMDIwMTA3LAotCTB4QzRDLCAweDAwN0YwMzdGLAotCTB4QzUwLCAweDY5NTQzNDIwLAotCTB4QzU0LCAweDQzQkMwMDk0LAotCTB4QzU4LCAweDY5NTQzNDIwLAotCTB4QzVDLCAweDQzM0MwMDk0LAotCTB4QzYwLCAweDAwMDAwMDAwLAotCTB4RkYwRjAxMUYsIDB4QUJDRCwKLQkweEM2NCwgMHg3MTE2ODQ4QiwKLQkweENEQ0RDRENELCAweENEQ0QsCi0JMHhDNjQsIDB4NzExMjg0OEIsCi0JMHhGRjBGMDExRiwgMHhERUFELAotCTB4QzY4LCAweDQ3QzAwQkZGLAotCTB4QzZDLCAweDAwMDAwMDM2LAotCTB4QzcwLCAweDJDN0YwMDBELAotCTB4Qzc0LCAweDAxODYxMERCLAotCTB4Qzc4LCAweDAwMDAwMDFGLAotCTB4QzdDLCAweDAwQjkxNjEyLAotCTB4QzgwLCAweDQwMDAwMTAwLAotCTB4Qzg0LCAweDIwRjYwMDAwLAotCTB4Qzg4LCAweDQwMDAwMTAwLAotCTB4QzhDLCAweDIwMjAwMDAwLAotCTB4QzkwLCAweDAwMTIxODIwLAotCTB4Qzk0LCAweDAwMDAwMDAwLAotCTB4Qzk4LCAweDAwMTIxODIwLAotCTB4QzlDLCAweDAwMDA3RjdGLAotCTB4Q0EwLCAweDAwMDAwMDAwLAotCTB4Q0E0LCAweDAwMDAwMDgwLAotCTB4Q0E4LCAweDAwMDAwMDAwLAotCTB4Q0FDLCAweDAwMDAwMDAwLAotCTB4Q0IwLCAweDAwMDAwMDAwLAotCTB4Q0I0LCAweDAwMDAwMDAwLAotCTB4Q0I4LCAweDAwMDAwMDAwLAotCTB4Q0JDLCAweDI4MDAwMDAwLAotCTB4Q0MwLCAweDAwMDAwMDAwLAotCTB4Q0M0LCAweDAwMDAwMDAwLAotCTB4Q0M4LCAweDAwMDAwMDAwLAotCTB4Q0NDLCAweDAwMDAwMDAwLAotCTB4Q0QwLCAweDAwMDAwMDAwLAotCTB4Q0Q0LCAweDAwMDAwMDAwLAotCTB4Q0Q4LCAweDY0QjIyNDI3LAotCTB4Q0RDLCAweDAwNzY2OTMyLAotCTB4Q0UwLCAweDAwMjIyMjIyLAotCTB4Q0U0LCAweDAwMDAwMDAwLAotCTB4Q0U4LCAweDM3NjQ0MzAyLAotCTB4Q0VDLCAweDJGOTdENDBDLAotCTB4RDAwLCAweDAwMDgwNzQwLAotCTB4RDA0LCAweDAwMDIwNDAxLAotCTB4RDA4LCAweDAwMDA5MDdGLAotCTB4RDBDLCAweDIwMDEwMjAxLAotCTB4RDEwLCAweEEwNjMzMzMzLAotCTB4RDE0LCAweDMzMzNCQzQzLAotCTB4RDE4LCAweDdBOEY1QjZCLAotCTB4RDJDLCAweENDOTc5OTc1LAotCTB4RDMwLCAweDAwMDAwMDAwLAotCTB4RDM0LCAweDgwNjA4MDAwLAotCTB4RDM4LCAweDAwMDAwMDAwLAotCTB4RDNDLCAweDAwMDI3MjkzLAotCTB4RDQwLCAweDAwMDAwMDAwLAotCTB4RDQ0LCAweDAwMDAwMDAwLAotCTB4RDQ4LCAweDAwMDAwMDAwLAotCTB4RDRDLCAweDAwMDAwMDAwLAotCTB4RDUwLCAweDY0MzcxNDBBLAotCTB4RDU0LCAweDAwMDAwMDAwLAotCTB4RDU4LCAweDAwMDAwMDAwLAotCTB4RDVDLCAweDMwMDMyMDY0LAotCTB4RDYwLCAweDQ2NTNERTY4LAotCTB4RDY0LCAweDA0NTE4QTNDLAotCTB4RDY4LCAweDAwMDAyMTAxLAotCTB4RDZDLCAweDJBMjAxQzE2LAotCTB4RDcwLCAweDE4MTIzNjJFLAotCTB4RDc0LCAweDMyMkMyMjIwLAotCTB4RDc4LCAweDAwMEUzQzI0LAotCTB4RTAwLCAweDJBMkEyQTJBLAotCTB4RTA0LCAweDJBMkEyQTJBLAotCTB4RTA4LCAweDAzOTAyQTJBLAotCTB4RTEwLCAweDJBMkEyQTJBLAotCTB4RTE0LCAweDJBMkEyQTJBLAotCTB4RTE4LCAweDJBMkEyQTJBLAotCTB4RTFDLCAweDJBMkEyQTJBLAotCTB4RTI4LCAweDAwMDAwMDAwLAotCTB4RTMwLCAweDEwMDBEQzFGLAotCTB4RTM0LCAweDEwMDA4QzFGLAotCTB4RTM4LCAweDAyMTQwMTAyLAotCTB4RTNDLCAweDY4MTYwNEMyLAotCTB4RTQwLCAweDAxMDA3QzAwLAotCTB4RTQ0LCAweDAxMDA0ODAwLAotCTB4RTQ4LCAweEZCMDAwMDAwLAotCTB4RTRDLCAweDAwMDAyOEQxLAotCTB4RTUwLCAweDEwMDBEQzFGLAotCTB4RTU0LCAweDEwMDA4QzFGLAotCTB4RTU4LCAweDAyMTQwMTAyLAotCTB4RTVDLCAweDI4MTYwRDA1LAotCTB4RTYwLCAweDAwMDAwMDA4LAotCTB4RTY4LCAweDAwMUIyNUE0LAotCTB4RTZDLCAweDYzMUIyNUEwLAotCTB4RTcwLCAweDYzMUIyNUEwLAotCTB4RTc0LCAweDA4MUIyNUEwLAotCTB4RTc4LCAweDA4MUIyNUEwLAotCTB4RTdDLCAweDA4MUIyNUEwLAotCTB4RTgwLCAweDA4MUIyNUEwLAotCTB4RTg0LCAweDYzMUIyNUEwLAotCTB4RTg4LCAweDA4MUIyNUEwLAotCTB4RThDLCAweDYzMUIyNUEwLAotCTB4RUQwLCAweDYzMUIyNUEwLAotCTB4RUQ0LCAweDYzMUIyNUEwLAotCTB4RUQ4LCAweDYzMUIyNUEwLAotCTB4RURDLCAweDAwMUIyNUEwLAotCTB4RUUwLCAweDAwMUIyNUEwLAotCTB4RUVDLCAweDZCMUIyNUEwLAotCTB4RjE0LCAweDAwMDAwMDAzLAotCTB4RjRDLCAweDAwMDAwMDAwLAotCTB4RjAwLCAweDAwMDAwMzAwLAotfTsKLQotdm9pZCBPRE1fUmVhZEFuZENvbmZpZ19QSFlfUkVHXzFUXzg3MjNBKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKLQl1MzIgaGV4ID0gMDsKLQl1MzIgaSA9IDA7Ci0JdTggIHBsYXRmb3JtID0gMHgwNDsKLQl1OCAgYm9hcmQgPSBwRE1fT2RtLT5Cb2FyZFR5cGU7Ci0JdTMyIEFycmF5TGVuID0gQVJSQVlfU0laRShBcnJheV9QSFlfUkVHXzFUXzg3MjNBKTsKLQl1MzIgKkFycmF5ID0gQXJyYXlfUEhZX1JFR18xVF84NzIzQTsKLQotCWhleCArPSBib2FyZDsKLQloZXggKz0gT0RNX0lUUkZfVVNCIDw8IDg7Ci0JaGV4ICs9IHBsYXRmb3JtIDw8IDE2OwotCWhleCArPSAweEZGMDAwMDAwOwotCWZvciAoaSA9IDA7IGkgPCBBcnJheUxlbjsgaSArPSAyKSB7Ci0JCXUzMiB2MSA9IEFycmF5W2ldOwotCQl1MzIgdjIgPSBBcnJheVtpKzFdOwotCi0JCS8qICBUaGlzIChvZmZzZXQsIGRhdGEpIHBhaXIgbWVldHMgdGhlIGNvbmRpdGlvbi4gKi8KLQkJaWYgKHYxIDwgMHhDRENEQ0RDRCkgewotCQkJb2RtX0NvbmZpZ0JCX1BIWV84NzIzQShwRE1fT2RtLCB2MSwgdjIpOwotCQkJY29udGludWU7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIUNoZWNrQ29uZGl0aW9uKEFycmF5W2ldLCBoZXgpKSB7Ci0JCQkJLyogRGlzY2FyZCB0aGUgZm9sbG93aW5nIChvZmZzZXQsIGRhdGEpIHBhaXJzICovCi0JCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmCi0JCQkJICAgICAgIHYyICE9IDB4Q0RFRiAmJgotCQkJCSAgICAgICB2MiAhPSAweENEQ0QgJiYgaSA8IEFycmF5TGVuIC0gMikKLQkJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQlpIC09IDI7IC8qICBwcmV2ZW50IGZyb20gZm9yLWxvb3AgKz0gMiAqLwotCQkJfSBlbHNlIHsKLQkJCQkvKiAgQ29uZmlndXJlIG1hdGNoZWQgcGFpcnMgYW5kIHNraXAgdG8KLQkJCQkgICAgZW5kIG9mIGlmLWVsc2UuICovCi0JCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmCi0JCQkJICAgICAgIHYyICE9IDB4Q0RFRiAmJgotCQkJCSAgICAgICB2MiAhPSAweENEQ0QgJiYgaSA8IEFycmF5TGVuIC0gMikgewotCQkJCQlvZG1fQ29uZmlnQkJfUEhZXzg3MjNBKHBETV9PZG0sIHYxLCB2Mik7Ci0JCQkJCVJFQURfTkVYVF9QQUlSKHYxLCB2MiwgaSk7Ci0JCQkJfQotCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYgaSA8IEFycmF5TGVuIC0gMikKLQkJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFBIWV9SRUdfTVAuVFhUCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB1MzIgQXJyYXlfUEhZX1JFR19NUF84NzIzQVtdID0gewotCTB4QzMwLCAweDY5RTlBQzRBLAotCTB4QzNDLCAweDBBOTc5NzE4LAotfTsKLQotdm9pZCBPRE1fUmVhZEFuZENvbmZpZ19QSFlfUkVHX01QXzg3MjNBKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKLQl1MzIgaGV4ID0gMDsKLQl1MzIgaTsKLQl1OCBwbGF0Zm9ybSA9IDB4MDQ7Ci0JdTggYm9hcmQgPSBwRE1fT2RtLT5Cb2FyZFR5cGU7Ci0JdTMyIEFycmF5TGVuID0gQVJSQVlfU0laRShBcnJheV9QSFlfUkVHX01QXzg3MjNBKTsKLQl1MzIgKkFycmF5ID0gQXJyYXlfUEhZX1JFR19NUF84NzIzQTsKLQotCWhleCArPSBib2FyZDsKLQloZXggKz0gT0RNX0lUUkZfVVNCIDw8IDg7Ci0JaGV4ICs9IHBsYXRmb3JtIDw8IDE2OwotCWhleCArPSAweEZGMDAwMDAwOwotCWZvciAoaSA9IDA7IGkgPCBBcnJheUxlbjsgaSArPSAyKSB7Ci0JCXUzMiB2MSA9IEFycmF5W2ldOwotCQl1MzIgdjIgPSBBcnJheVtpKzFdOwotCi0JCS8qICBUaGlzIChvZmZzZXQsIGRhdGEpIHBhaXIgbWVldHMgdGhlIGNvbmRpdGlvbi4gKi8KLQkJaWYgKHYxIDwgMHhDRENEQ0RDRCkgewotCQkJb2RtX0NvbmZpZ0JCX1BIWV84NzIzQShwRE1fT2RtLCB2MSwgdjIpOwotCQkJY29udGludWU7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIUNoZWNrQ29uZGl0aW9uKEFycmF5W2ldLCBoZXgpKSB7Ci0JCQkJLyogRGlzY2FyZCB0aGUgZm9sbG93aW5nIChvZmZzZXQsIGRhdGEpIHBhaXJzICovCi0JCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmCi0JCQkJICAgICAgIHYyICE9IDB4Q0RFRiAmJgotCQkJCSAgICAgICB2MiAhPSAweENEQ0QgJiYgaSA8IEFycmF5TGVuIC0gMikKLQkJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQlpIC09IDI7IC8qICBwcmV2ZW50IGZyb20gZm9yLWxvb3AgKz0gMiAqLwotCQkJfSBlbHNlIHsKLQkJCQkvKiBDb25maWd1cmUgbWF0Y2hlZCBwYWlycyBhbmQgc2tpcCB0bwotCQkJCSAgIGVuZCBvZiBpZi1lbHNlLiAqLwotCQkJCVJFQURfTkVYVF9QQUlSKHYxLCB2MiwgaSk7Ci0JCQkJd2hpbGUgKHYyICE9IDB4REVBRCAmJgotCQkJCSAgICAgICB2MiAhPSAweENERUYgJiYKLQkJCQkgICAgICAgdjIgIT0gMHhDRENEICYmIGkgPCBBcnJheUxlbiAtIDIpIHsKLQkJCQkJb2RtX0NvbmZpZ0JCX1BIWV84NzIzQShwRE1fT2RtLCB2MSwgdjIpOwotCQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwotCQkJCX0KLQkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmIGkgPCBBcnJheUxlbiAtIDIpCi0JCQkJCVJFQURfTkVYVF9QQUlSKHYxLCB2MiwgaSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWxIV0ltZzg3MjNBX01BQy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsSFdJbWc4NzIzQV9NQUMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJmNjg1OS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWxIV0ltZzg3MjNBX01BQy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0qIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0qIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0qIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotKiBtb3JlIGRldGFpbHMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJvZG1fcHJlY29tcC5oIgotCi1zdGF0aWMgYm9vbCBDaGVja0NvbmRpdGlvbihjb25zdCB1MzIgIENvbmRpdGlvbiwgY29uc3QgdTMyICBIZXgpCi17Ci0JdTMyIF9ib2FyZCAgICAgPSAoSGV4ICYgMHgwMDAwMDBGRik7Ci0JdTMyIF9pbnRlcmZhY2UgPSAoSGV4ICYgMHgwMDAwRkYwMCkgPj4gODsKLQl1MzIgX3BsYXRmb3JtICA9IChIZXggJiAweDAwRkYwMDAwKSA+PiAxNjsKLQl1MzIgY29uZCA9IENvbmRpdGlvbjsKLQotCWlmIChDb25kaXRpb24gPT0gMHhDRENEQ0RDRCkKLQkJcmV0dXJuIHRydWU7Ci0KLQljb25kID0gQ29uZGl0aW9uICYgMHgwMDAwMDBGRjsKLQlpZiAoKF9ib2FyZCA9PSBjb25kKSAmJiBjb25kICE9IDB4MDApCi0JCXJldHVybiBmYWxzZTsKLQotCWNvbmQgPSBDb25kaXRpb24gJiAweDAwMDBGRjAwOwotCWNvbmQgPj49IDg7Ci0JaWYgKChfaW50ZXJmYWNlICYgY29uZCkgPT0gMCAmJiBjb25kICE9IDB4MDcpCi0JCXJldHVybiBmYWxzZTsKLQotCWNvbmQgPSBDb25kaXRpb24gJiAweDAwRkYwMDAwOwotCWNvbmQgPj49IDE2OwotCWlmICgoX3BsYXRmb3JtICYgY29uZCkgPT0gMCAmJiBjb25kICE9IDB4MEYpCi0JCXJldHVybiBmYWxzZTsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BQ19SRUcuVFhUCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB1MzIgQXJyYXlfTUFDX1JFR184NzIzQVtdID0gewotCQkweDQyMCwgMHgwMDAwMDA4MCwKLQkJMHg0MjMsIDB4MDAwMDAwMDAsCi0JCTB4NDMwLCAweDAwMDAwMDAwLAotCQkweDQzMSwgMHgwMDAwMDAwMCwKLQkJMHg0MzIsIDB4MDAwMDAwMDAsCi0JCTB4NDMzLCAweDAwMDAwMDAxLAotCQkweDQzNCwgMHgwMDAwMDAwNCwKLQkJMHg0MzUsIDB4MDAwMDAwMDUsCi0JCTB4NDM2LCAweDAwMDAwMDA2LAotCQkweDQzNywgMHgwMDAwMDAwNywKLQkJMHg0MzgsIDB4MDAwMDAwMDAsCi0JCTB4NDM5LCAweDAwMDAwMDAwLAotCQkweDQzQSwgMHgwMDAwMDAwMCwKLQkJMHg0M0IsIDB4MDAwMDAwMDEsCi0JCTB4NDNDLCAweDAwMDAwMDA0LAotCQkweDQzRCwgMHgwMDAwMDAwNSwKLQkJMHg0M0UsIDB4MDAwMDAwMDYsCi0JCTB4NDNGLCAweDAwMDAwMDA3LAotCQkweDQ0MCwgMHgwMDAwMDA1RCwKLQkJMHg0NDEsIDB4MDAwMDAwMDEsCi0JCTB4NDQyLCAweDAwMDAwMDAwLAotCQkweDQ0NCwgMHgwMDAwMDAxNSwKLQkJMHg0NDUsIDB4MDAwMDAwRjAsCi0JCTB4NDQ2LCAweDAwMDAwMDBGLAotCQkweDQ0NywgMHgwMDAwMDAwMCwKLQkJMHg0NTgsIDB4MDAwMDAwNDEsCi0JCTB4NDU5LCAweDAwMDAwMEE4LAotCQkweDQ1QSwgMHgwMDAwMDA3MiwKLQkJMHg0NUIsIDB4MDAwMDAwQjksCi0JCTB4NDYwLCAweDAwMDAwMDY2LAotCQkweDQ2MSwgMHgwMDAwMDA2NiwKLQkJMHg0NjIsIDB4MDAwMDAwMDgsCi0JCTB4NDYzLCAweDAwMDAwMDAzLAotCQkweDRDOCwgMHgwMDAwMDBGRiwKLQkJMHg0QzksIDB4MDAwMDAwMDgsCi0JCTB4NENDLCAweDAwMDAwMEZGLAotCQkweDRDRCwgMHgwMDAwMDBGRiwKLQkJMHg0Q0UsIDB4MDAwMDAwMDEsCi0JCTB4NTAwLCAweDAwMDAwMDI2LAotCQkweDUwMSwgMHgwMDAwMDBBMiwKLQkJMHg1MDIsIDB4MDAwMDAwMkYsCi0JCTB4NTAzLCAweDAwMDAwMDAwLAotCQkweDUwNCwgMHgwMDAwMDAyOCwKLQkJMHg1MDUsIDB4MDAwMDAwQTMsCi0JCTB4NTA2LCAweDAwMDAwMDVFLAotCQkweDUwNywgMHgwMDAwMDAwMCwKLQkJMHg1MDgsIDB4MDAwMDAwMkIsCi0JCTB4NTA5LCAweDAwMDAwMEE0LAotCQkweDUwQSwgMHgwMDAwMDA1RSwKLQkJMHg1MEIsIDB4MDAwMDAwMDAsCi0JCTB4NTBDLCAweDAwMDAwMDRGLAotCQkweDUwRCwgMHgwMDAwMDBBNCwKLQkJMHg1MEUsIDB4MDAwMDAwMDAsCi0JCTB4NTBGLCAweDAwMDAwMDAwLAotCQkweDUxMiwgMHgwMDAwMDAxQywKLQkJMHg1MTQsIDB4MDAwMDAwMEEsCi0JCTB4NTE1LCAweDAwMDAwMDEwLAotCQkweDUxNiwgMHgwMDAwMDAwQSwKLQkJMHg1MTcsIDB4MDAwMDAwMTAsCi0JCTB4NTFBLCAweDAwMDAwMDE2LAotCQkweDUyNCwgMHgwMDAwMDAwRiwKLQkJMHg1MjUsIDB4MDAwMDAwNEYsCi0JCTB4NTQ2LCAweDAwMDAwMDQwLAotCQkweDU0NywgMHgwMDAwMDAwMCwKLQkJMHg1NTAsIDB4MDAwMDAwMTAsCi0JCTB4NTUxLCAweDAwMDAwMDEwLAotCQkweDU1OSwgMHgwMDAwMDAwMiwKLQkJMHg1NUEsIDB4MDAwMDAwMDIsCi0JCTB4NTVELCAweDAwMDAwMEZGLAotCQkweDYwNSwgMHgwMDAwMDAzMCwKLQkJMHg2MDgsIDB4MDAwMDAwMEUsCi0JCTB4NjA5LCAweDAwMDAwMDJBLAotCQkweDY1MiwgMHgwMDAwMDAyMCwKLQkJMHg2M0MsIDB4MDAwMDAwMEEsCi0JCTB4NjNELCAweDAwMDAwMDBBLAotCQkweDYzRSwgMHgwMDAwMDAwRSwKLQkJMHg2M0YsIDB4MDAwMDAwMEUsCi0JCTB4NjZFLCAweDAwMDAwMDA1LAotCQkweDcwMCwgMHgwMDAwMDAyMSwKLQkJMHg3MDEsIDB4MDAwMDAwNDMsCi0JCTB4NzAyLCAweDAwMDAwMDY1LAotCQkweDcwMywgMHgwMDAwMDA4NywKLQkJMHg3MDgsIDB4MDAwMDAwMjEsCi0JCTB4NzA5LCAweDAwMDAwMDQzLAotCQkweDcwQSwgMHgwMDAwMDA2NSwKLQkJMHg3MEIsIDB4MDAwMDAwODcsCi19OwotCi12b2lkIE9ETV9SZWFkQW5kQ29uZmlnX01BQ19SRUdfODcyM0Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCSNkZWZpbmUgUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKQkJCVwKLQkJIGRvIHsJCQkJCQlcCi0JCQlpICs9IDI7IHYxID0gQXJyYXlbaV07IHYyID0gQXJyYXlbaSsxXTsJXAotCQkgfSB3aGlsZSAoMCkKLQotCXUzMiAgICAgaGV4ICAgICAgICAgPSAwOwotCXUzMiAgICAgaSAgICAgICAgICAgPSAwOwotCXU4ICAgICBwbGF0Zm9ybSAgICA9IDB4MDQ7Ci0JdTggICAgIGJvYXJkICAgICAgID0gcERNX09kbS0+Qm9hcmRUeXBlOwotCXUzMiAgICAgQXJyYXlMZW4gICAgPSBBUlJBWV9TSVpFKEFycmF5X01BQ19SRUdfODcyM0EpOwotCXUzMiAqQXJyYXkgICAgICAgPSBBcnJheV9NQUNfUkVHXzg3MjNBOwotCi0JaGV4ICs9IGJvYXJkOwotCWhleCArPSBPRE1fSVRSRl9VU0IgPDwgODsKLQloZXggKz0gcGxhdGZvcm0gPDwgMTY7Ci0JaGV4ICs9IDB4RkYwMDAwMDA7Ci0JZm9yIChpID0gMDsgaSA8IEFycmF5TGVuOyBpICs9IDIpIHsKLQkJdTMyIHYxID0gQXJyYXlbaV07Ci0JCXUzMiB2MiA9IEFycmF5W2krMV07Ci0KLQkJLyogIFRoaXMgKG9mZnNldCwgZGF0YSkgcGFpciBtZWV0cyB0aGUgY29uZGl0aW9uLiAqLwotCQlpZiAodjEgPCAweENEQ0RDRENEKSB7Ci0JCQlvZG1fQ29uZmlnTUFDXzg3MjNBKHBETV9PZG0sIHYxLCAodTgpdjIpOwotCQkJY29udGludWU7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIUNoZWNrQ29uZGl0aW9uKEFycmF5W2ldLCBoZXgpKSB7Ci0JCQkJLyogRGlzY2FyZCB0aGUgZm9sbG93aW5nIChvZmZzZXQsIGRhdGEpIHBhaXJzLiAqLwotCQkJCVJFQURfTkVYVF9QQUlSKHYxLCB2MiwgaSk7Ci0JCQkJd2hpbGUgKHYyICE9IDB4REVBRCAmJgotCQkJCSAgICAgICB2MiAhPSAweENERUYgJiYKLQkJCQkgICAgICAgdjIgIT0gMHhDRENEICYmIGkgPCBBcnJheUxlbiAtIDIpCi0JCQkJCVJFQURfTkVYVF9QQUlSKHYxLCB2MiwgaSk7Ci0JCQkJaSAtPSAyOyAvKiAgcHJldmVudCBmcm9tIGZvci1sb29wICs9IDIgKi8KLQkJCX0gZWxzZSB7Ci0JCQkJLyogIENvbmZpZ3VyZSBtYXRjaGVkIHBhaXJzIGFuZCBza2lwIHRvIGVuZCBvZiBpZi1lbHNlLiAqLwotCQkJCVJFQURfTkVYVF9QQUlSKHYxLCB2MiwgaSk7Ci0JCQkJd2hpbGUgKHYyICE9IDB4REVBRCAmJgotCQkJCSAgICAgICB2MiAhPSAweENERUYgJiYKLQkJCQkgICAgICAgdjIgIT0gMHhDRENEICYmIGkgPCBBcnJheUxlbiAtIDIpIHsKLQkJCQkJb2RtX0NvbmZpZ01BQ184NzIzQShwRE1fT2RtLCB2MSwgKHU4KXYyKTsKLQkJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQl9Ci0KLQkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmIGkgPCBBcnJheUxlbiAtIDIpCi0JCQkJCVJFQURfTkVYVF9QQUlSKHYxLCB2MiwgaSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWxIV0ltZzg3MjNBX1JGLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWxIV0ltZzg3MjNBX1JGLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NmYzZWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsSFdJbWc4NzIzQV9SRi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0qIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0qIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0qIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotKiBtb3JlIGRldGFpbHMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJvZG1fcHJlY29tcC5oIgotCi1zdGF0aWMgYm9vbCBDaGVja0NvbmRpdGlvbihjb25zdCB1MzIgIENvbmRpdGlvbiwgY29uc3QgdTMyICBIZXgpCi17Ci0JdTMyIF9ib2FyZCAgICAgPSAoSGV4ICYgMHgwMDAwMDBGRik7Ci0JdTMyIF9pbnRlcmZhY2UgPSAoSGV4ICYgMHgwMDAwRkYwMCkgPj4gODsKLQl1MzIgX3BsYXRmb3JtICA9IChIZXggJiAweDAwRkYwMDAwKSA+PiAxNjsKLQl1MzIgY29uZCA9IENvbmRpdGlvbjsKLQotCWlmIChDb25kaXRpb24gPT0gMHhDRENEQ0RDRCkKLQkJcmV0dXJuIHRydWU7Ci0KLQljb25kID0gQ29uZGl0aW9uICYgMHgwMDAwMDBGRjsKLQlpZiAoKF9ib2FyZCA9PSBjb25kKSAmJiBjb25kICE9IDB4MDApCi0JCXJldHVybiBmYWxzZTsKLQotCWNvbmQgPSBDb25kaXRpb24gJiAweDAwMDBGRjAwOwotCWNvbmQgPj49IDg7Ci0JaWYgKChfaW50ZXJmYWNlICYgY29uZCkgPT0gMCAmJiBjb25kICE9IDB4MDcpCi0JCXJldHVybiBmYWxzZTsKLQotCWNvbmQgPSBDb25kaXRpb24gJiAweDAwRkYwMDAwOwotCWNvbmQgPj49IDE2OwotCWlmICgoX3BsYXRmb3JtICYgY29uZCkgPT0gMCAmJiBjb25kICE9IDB4MEYpCi0JCXJldHVybiBmYWxzZTsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhZGlvQV8xVC5UWFQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHUzMiBBcnJheV9SYWRpb0FfMVRfODcyM0FbXSA9IHsKLQkweDAwMCwgMHgwMDAzMDE1OSwKLQkweDAwMSwgMHgwMDAzMTI4NCwKLQkweDAwMiwgMHgwMDA5ODAwMCwKLQkweEZGMEYwMTFGLCAweEFCQ0QsCi0JMHgwMDMsIDB4MDAwMThDNjMsCi0JMHhDRENEQ0RDRCwgMHhDRENELAotCTB4MDAzLCAweDAwMDM5QzYzLAotCTB4RkYwRjAxMUYsIDB4REVBRCwKLQkweDAwNCwgMHgwMDAyMTBFNywKLQkweDAwOSwgMHgwMDAyMDQ0RiwKLQkweDAwQSwgMHgwMDAxQTNGMSwKLQkweDAwQiwgMHgwMDAxNDc4NywKLQkweDAwQywgMHgwMDA4OTZGRSwKLQkweDAwRCwgMHgwMDAwRTAyQywKLQkweDAwRSwgMHgwMDAzOUNFNywKLQkweDAwRiwgMHgwMDAwMDQ1MSwKLQkweDAxOSwgMHgwMDAwMDAwMCwKLQkweDAxQSwgMHgwMDAzMDM1NSwKLQkweDAxQiwgMHgwMDA2MEEwMCwKLQkweDAxQywgMHgwMDBGQzM3OCwKLQkweDAxRCwgMHgwMDBBMTI1MCwKLQkweDAxRSwgMHgwMDAwMDI0RiwKLQkweDAxRiwgMHgwMDAwMDAwMCwKLQkweDAyMCwgMHgwMDAwQjYxNCwKLQkweDAyMSwgMHgwMDA2QzAwMCwKLQkweDAyMiwgMHgwMDAwMDAwMCwKLQkweDAyMywgMHgwMDAwMTU1OCwKLQkweDAyNCwgMHgwMDAwMDA2MCwKLQkweDAyNSwgMHgwMDAwMDQ4MywKLQkweDAyNiwgMHgwMDA0RjAwMCwKLQkweDAyNywgMHgwMDBFQzdEOSwKLQkweDAyOCwgMHgwMDA1NzczMCwKLQkweDAyOSwgMHgwMDAwNDc4MywKLQkweDAyQSwgMHgwMDAwMDAwMSwKLQkweDAyQiwgMHgwMDAyMTMzNCwKLQkweDAyQSwgMHgwMDAwMDAwMCwKLQkweDAyQiwgMHgwMDAwMDA1NCwKLQkweDAyQSwgMHgwMDAwMDAwMSwKLQkweDAyQiwgMHgwMDAwMDgwOCwKLQkweDAyQiwgMHgwMDA1MzMzMywKLQkweDAyQywgMHgwMDAwMDAwQywKLQkweDAyQSwgMHgwMDAwMDAwMiwKLQkweDAyQiwgMHgwMDAwMDgwOCwKLQkweDAyQiwgMHgwMDA1QjMzMywKLQkweDAyQywgMHgwMDAwMDAwRCwKLQkweDAyQSwgMHgwMDAwMDAwMywKLQkweDAyQiwgMHgwMDAwMDgwOCwKLQkweDAyQiwgMHgwMDA2MzMzMywKLQkweDAyQywgMHgwMDAwMDAwRCwKLQkweDAyQSwgMHgwMDAwMDAwNCwKLQkweDAyQiwgMHgwMDAwMDgwOCwKLQkweDAyQiwgMHgwMDA2QjMzMywKLQkweDAyQywgMHgwMDAwMDAwRCwKLQkweDAyQSwgMHgwMDAwMDAwNSwKLQkweDAyQiwgMHgwMDAwMDgwOCwKLQkweDAyQiwgMHgwMDA3MzMzMywKLQkweDAyQywgMHgwMDAwMDAwRCwKLQkweDAyQSwgMHgwMDAwMDAwNiwKLQkweDAyQiwgMHgwMDAwMDcwOSwKLQkweDAyQiwgMHgwMDA1QjMzMywKLQkweDAyQywgMHgwMDAwMDAwRCwKLQkweDAyQSwgMHgwMDAwMDAwNywKLQkweDAyQiwgMHgwMDAwMDcwOSwKLQkweDAyQiwgMHgwMDA2MzMzMywKLQkweDAyQywgMHgwMDAwMDAwRCwKLQkweDAyQSwgMHgwMDAwMDAwOCwKLQkweDAyQiwgMHgwMDAwMDYwQSwKLQkweDAyQiwgMHgwMDA0QjMzMywKLQkweDAyQywgMHgwMDAwMDAwRCwKLQkweDAyQSwgMHgwMDAwMDAwOSwKLQkweDAyQiwgMHgwMDAwMDYwQSwKLQkweDAyQiwgMHgwMDA1MzMzMywKLQkweDAyQywgMHgwMDAwMDAwRCwKLQkweDAyQSwgMHgwMDAwMDAwQSwKLQkweDAyQiwgMHgwMDAwMDYwQSwKLQkweDAyQiwgMHgwMDA1QjMzMywKLQkweDAyQywgMHgwMDAwMDAwRCwKLQkweDAyQSwgMHgwMDAwMDAwQiwKLQkweDAyQiwgMHgwMDAwMDYwQSwKLQkweDAyQiwgMHgwMDA2MzMzMywKLQkweDAyQywgMHgwMDAwMDAwRCwKLQkweDAyQSwgMHgwMDAwMDAwQywKLQkweDAyQiwgMHgwMDAwMDYwQSwKLQkweDAyQiwgMHgwMDA2QjMzMywKLQkweDAyQywgMHgwMDAwMDAwRCwKLQkweDAyQSwgMHgwMDAwMDAwRCwKLQkweDAyQiwgMHgwMDAwMDYwQSwKLQkweDAyQiwgMHgwMDA3MzMzMywKLQkweDAyQywgMHgwMDAwMDAwRCwKLQkweDAyQSwgMHgwMDAwMDAwRSwKLQkweDAyQiwgMHgwMDAwMDUwQiwKLQkweDAyQiwgMHgwMDA2NjY2NiwKLQkweDAyQywgMHgwMDAwMDAxQSwKLQkweDAyQSwgMHgwMDBFMDAwMCwKLQkweDAxMCwgMHgwMDA0MDAwRiwKLQkweDAxMSwgMHgwMDBFMzFGQywKLQkweDAxMCwgMHgwMDA2MDAwRiwKLQkweDAxMSwgMHgwMDBGRjlGOCwKLQkweDAxMCwgMHgwMDAyMDAwRiwKLQkweDAxMSwgMHgwMDAyMDNGOSwKLQkweDAxMCwgMHgwMDAzMDAwRiwKLQkweDAxMSwgMHgwMDBGRjUwMCwKLQkweDAxMCwgMHgwMDAwMDAwMCwKLQkweDAxMSwgMHgwMDAwMDAwMCwKLQkweDAxMCwgMHgwMDA4MDAwRiwKLQkweDAxMSwgMHgwMDAzRjEwMCwKLQkweDAxMCwgMHgwMDA5MDAwRiwKLQkweDAxMSwgMHgwMDAyMzEwMCwKLQkweDAxMiwgMHgwMDAzMjAwMCwKLQkweDAxMiwgMHgwMDA3MTAwMCwKLQkweDAxMiwgMHgwMDBCMDAwMCwKLQkweDAxMiwgMHgwMDBGQzAwMCwKLQkweDAxMywgMHgwMDAyODdCMywKLQkweDAxMywgMHgwMDAyNDRCNywKLQkweDAxMywgMHgwMDAyMDRBQiwKLQkweDAxMywgMHgwMDAxQzQ5RiwKLQkweDAxMywgMHgwMDAxODQ5MywKLQkweDAxMywgMHgwMDAxNDI5QiwKLQkweDAxMywgMHgwMDAxMDI5OSwKLQkweDAxMywgMHgwMDAwQzI5QywKLQkweDAxMywgMHgwMDAwODFBMCwKLQkweDAxMywgMHgwMDAwNDBBQywKLQkweDAxMywgMHgwMDAwMDAyMCwKLQkweDAxNCwgMHgwMDAxOTQ0QywKLQkweDAxNCwgMHgwMDA1OTQ0NCwKLQkweDAxNCwgMHgwMDA5OTQ0QywKLQkweDAxNCwgMHgwMDBEOTQ0NCwKLQkweEZGMEYwMTFGLCAweEFCQ0QsCi0JMHgwMTUsIDB4MDAwMEY0MjQsCi0JMHgwMTUsIDB4MDAwNEY0MjQsCi0JMHgwMTUsIDB4MDAwOEY0MjQsCi0JMHgwMTUsIDB4MDAwQ0Y0MjQsCi0JMHhDRENEQ0RDRCwgMHhDRENELAotCTB4MDE1LCAweDAwMDBGNDc0LAotCTB4MDE1LCAweDAwMDRGNDc3LAotCTB4MDE1LCAweDAwMDhGNDU1LAotCTB4MDE1LCAweDAwMENGNDU1LAotCTB4RkYwRjAxMUYsIDB4REVBRCwKLQkweDAxNiwgMHgwMDAwMDMzOSwKLQkweDAxNiwgMHgwMDA0MDMzOSwKLQkweDAxNiwgMHgwMDA4MDMzOSwKLQkweEZGMEYwMTFGLCAweEFCQ0QsCi0JMHgwMTYsIDB4MDAwQzAzNTYsCi0JMHhDRENEQ0RDRCwgMHhDRENELAotCTB4MDE2LCAweDAwMEMwMzY2LAotCTB4RkYwRjAxMUYsIDB4REVBRCwKLQkweDAwMCwgMHgwMDAxMDE1OSwKLQkweDAxOCwgMHgwMDAwRjQwMSwKLQkweDBGRSwgMHgwMDAwMDAwMCwKLQkweDBGRSwgMHgwMDAwMDAwMCwKLQkweDAxRiwgMHgwMDAwMDAwMywKLQkweDBGRSwgMHgwMDAwMDAwMCwKLQkweDBGRSwgMHgwMDAwMDAwMCwKLQkweDAxRSwgMHgwMDAwMDI0NywKLQkweDAxRiwgMHgwMDAwMDAwMCwKLQkweDAwMCwgMHgwMDAzMDE1OSwKLX07Ci0KLXZvaWQgT0RNX1JlYWRBbmRDb25maWdfUmFkaW9BXzFUXzg3MjNBKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKLQkjZGVmaW5lIFJFQURfTkVYVF9QQUlSKHYxLCB2MiwgaSkJCQlcCi0JCSBkbyB7CQkJCQkJXAotCQkJIGkgKz0gMjsgdjEgPSBBcnJheVtpXTsgdjIgPSBBcnJheVtpKzFdO1wKLQkJIH0gd2hpbGUgKDApCi0KLQl1MzIgICAgIGhleCAgICAgICAgID0gMDsKLQl1MzIgICAgIGkgICAgICAgICAgID0gMDsKLQl1OCAgICAgcGxhdGZvcm0gICAgPSAweDA0OwotCXU4ICAgICBib2FyZCAgICAgICA9IHBETV9PZG0tPkJvYXJkVHlwZTsKLQl1MzIgICAgIEFycmF5TGVuICAgID0gQVJSQVlfU0laRShBcnJheV9SYWRpb0FfMVRfODcyM0EpOwotCXUzMiAqQXJyYXkgPSBBcnJheV9SYWRpb0FfMVRfODcyM0E7Ci0KLQloZXggKz0gYm9hcmQ7Ci0JaGV4ICs9IE9ETV9JVFJGX1VTQiA8PCA4OwotCWhleCArPSBwbGF0Zm9ybSA8PCAxNjsKLQloZXggKz0gMHhGRjAwMDAwMDsKLQotCWZvciAoaSA9IDA7IGkgPCBBcnJheUxlbjsgaSArPSAyKSB7Ci0JCXUzMiB2MSA9IEFycmF5W2ldOwotCQl1MzIgdjIgPSBBcnJheVtpKzFdOwotCi0JCS8qICBUaGlzIChvZmZzZXQsIGRhdGEpIHBhaXIgbWVldHMgdGhlIGNvbmRpdGlvbi4gKi8KLQkJaWYgKHYxIDwgMHhDRENEQ0RDRCkgewotCQkJb2RtX0NvbmZpZ1JGUmVnXzg3MjNBKHBETV9PZG0sIHYxLCB2MiwgUkZfUEFUSF9BLCB2MSk7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIHsKLQkJCWlmICghQ2hlY2tDb25kaXRpb24oQXJyYXlbaV0sIGhleCkpIHsKLQkJCQkvKiAgRGlzY2FyZCB0aGUgZm9sbG93aW5nIChvZmZzZXQsIGRhdGEpIHBhaXJzLiAqLwotCQkJCVJFQURfTkVYVF9QQUlSKHYxLCB2MiwgaSk7Ci0JCQkJd2hpbGUgKHYyICE9IDB4REVBRCAmJgotCQkJCSAgICAgICB2MiAhPSAweENERUYgJiYKLQkJCQkgICAgICAgdjIgIT0gMHhDRENEICYmIGkgPCBBcnJheUxlbiAtIDIpCi0JCQkJCVJFQURfTkVYVF9QQUlSKHYxLCB2MiwgaSk7Ci0JCQkJaSAtPSAyOyAvKiAgcHJldmVudCBmcm9tIGZvci1sb29wICs9IDIgKi8KLQkJCX0gZWxzZSB7Ci0JCQkJLyogIENvbmZpZ3VyZSBtYXRjaGVkIHBhaXJzIGFuZCBza2lwIHRvIGVuZCBvZiBpZi1lbHNlLiAqLwotCQkJCVJFQURfTkVYVF9QQUlSKHYxLCB2MiwgaSk7Ci0JCQkJd2hpbGUgKHYyICE9IDB4REVBRCAmJgotCQkJCSAgICAgICB2MiAhPSAweENERUYgJiYKLQkJCQkgICAgICAgdjIgIT0gMHhDRENEICYmIGkgPCBBcnJheUxlbiAtIDIpIHsKLQkJCQkJb2RtX0NvbmZpZ1JGUmVnXzg3MjNBKHBETV9PZG0sIHYxLCB2MiwKLQkJCQkJCQkgICAgICBSRl9QQVRIX0EsIHYxKTsKLQkJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQl9Ci0KLQkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmIGkgPCBBcnJheUxlbiAtIDIpCi0JCQkJCVJFQURfTkVYVF9QQUlSKHYxLCB2MiwgaSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWxQd3JTZXFDbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbFB3clNlcUNtZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTNkOTZlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbFB3clNlcUNtZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyorKwotQ29weXJpZ2h0IChjKSBSZWFsdGVrIFNlbWljb25kdWN0b3IgQ29ycC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotTW9kdWxlIE5hbWU6Ci0JSGFsUHdyU2VxQ21kLmMKLQotQWJzdHJhY3Q6Ci0JSW1wbGVtZW50IEhXIFBvd2VyIHNlcXVlbmNlIGNvbmZpZ3VyYXRpb24gQ01EIGhhbmRsaW5nIHJvdXRpbmUgZm9yCi0JUmVhbHRlayBkZXZpY2VzLgotCi1NYWpvciBDaGFuZ2UgSGlzdG9yeToKLQlXaGVuICAgICAgIFdobyAgICAgICAgICAgICAgIFdoYXQKLQktLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkyMDExLTEwLTI2IEx1Y2FzICAgICAgICAgICAgTW9kaWZ5IHRvIGJlIGNvbXBhdGlibGUgd2l0aCBTRDQtQ0UgZHJpdmVyLgotCTIwMTEtMDctMDcgUm9nZXIgICAgICAgICAgICBDcmVhdGUuCi0KLS0tKi8KLSNpbmNsdWRlIDxIYWxQd3JTZXFDbWQuaD4KLSNpbmNsdWRlIDx1c2Jfb3BzX2xpbnV4Lmg+Ci0KLS8qICAqLwotLyoJRGVzY3JpcHRpb246ICovCi0vKgkJVGhpcyByb3V0aW5lIGRlYWwgd2l0aCB0aGUgUG93ZXIgQ29uZmlndXJhdGlvbiBDTURzIHBhcnNpbmcKLQkJZm9yIFJUTDg3MjMvUlRMODE4OEUgU2VyaWVzIElDLiAqLwotLyogICovCi0vKglBc3N1bXB0aW9uOiAqLwotLyoJCVdlIHNob3VsZCBmb2xsb3cgc3BlY2lmaWMgZm9ybWF0IHdoaWNoIHdhcyByZWxlYXNlZCBmcm9tCi0JCUhXIFNELiAqLwotLyogICovCi0vKgkyMDExLjA3LjA3LCBhZGRlZCBieSBSb2dlci4gKi8KLS8qICAqLwotdTggSGFsUHdyU2VxQ21kUGFyc2luZzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBDdXRWZXJzaW9uLAotCQkgICAgICAgdTggRmFiVmVyc2lvbiwgdTggSW50ZXJmYWNlVHlwZSwKLQkJICAgICAgIHN0cnVjdCB3bGFuX3B3cl9jZmcgUHdyU2VxQ21kW10pCi17Ci0Jc3RydWN0IHdsYW5fcHdyX2NmZyBQd3JDZmdDbWQ7Ci0JdTggYlBvbGxpbmdCaXQ7Ci0JdTMyIEFyeUlkeCA9IDA7Ci0JdTggdmFsdWU7Ci0JdTMyIG9mZnNldDsKLQl1MzIgcG9sbGluZ0NvdW50ID0gMDsJLyogIHBvbGxpbmcgYXV0b2xvYWQgZG9uZS4gKi8KLQl1MzIgbWF4UG9sbGluZ0NudCA9IDUwMDA7Ci0KLQlkbyB7Ci0JCVB3ckNmZ0NtZCA9IFB3clNlcUNtZFtBcnlJZHhdOwotCi0JCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgIkhhbFB3clNlcUNtZFBhcnNpbmcyM2E6IG9mZnNldCglI3gpIGN1dF9tc2soJSN4KSBmYWJfbXNrKCUjeCkgaW50ZXJmYWNlX21zayglI3gpIGJhc2UoJSN4KSBjbWQoJSN4KSBtc2soJSN4KSB2YWx1ZSglI3gpXG4iLAotCQkJIEdFVF9QV1JfQ0ZHX09GRlNFVChQd3JDZmdDbWQpLAotCQkJIEdFVF9QV1JfQ0ZHX0NVVF9NQVNLKFB3ckNmZ0NtZCksCi0JCQkgR0VUX1BXUl9DRkdfRkFCX01BU0soUHdyQ2ZnQ21kKSwKLQkJCSBHRVRfUFdSX0NGR19JTlRGX01BU0soUHdyQ2ZnQ21kKSwKLQkJCSBHRVRfUFdSX0NGR19CQVNFKFB3ckNmZ0NtZCksCi0JCQkgR0VUX1BXUl9DRkdfQ01EKFB3ckNmZ0NtZCksCi0JCQkgR0VUX1BXUl9DRkdfTUFTSyhQd3JDZmdDbWQpLAotCQkJIEdFVF9QV1JfQ0ZHX1ZBTFVFKFB3ckNmZ0NtZCkpOwotCi0JCS8qIDIgT25seSBIYW5kbGUgdGhlIGNvbW1hbmQgd2hvc2UgRkFCLCBDVVQsIGFuZCBJbnRlcmZhY2UgYXJlCi0JCSAgIG1hdGNoZWQgKi8KLQkJaWYgKChHRVRfUFdSX0NGR19GQUJfTUFTSyhQd3JDZmdDbWQpICYgRmFiVmVyc2lvbikgJiYKLQkJICAgIChHRVRfUFdSX0NGR19DVVRfTUFTSyhQd3JDZmdDbWQpICYgQ3V0VmVyc2lvbikgJiYKLQkJICAgIChHRVRfUFdSX0NGR19JTlRGX01BU0soUHdyQ2ZnQ21kKSAmIEludGVyZmFjZVR5cGUpKSB7Ci0JCQlzd2l0Y2ggKEdFVF9QV1JfQ0ZHX0NNRChQd3JDZmdDbWQpKSB7Ci0JCQljYXNlIFBXUl9DTURfUkVBRDoKLQkJCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJCQkgIkhhbFB3clNlcUNtZFBhcnNpbmcyM2E6IFBXUl9DTURfUkVBRFxuIik7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgUFdSX0NNRF9XUklURToKLQkJCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJCQkgIkhhbFB3clNlcUNtZFBhcnNpbmcyM2E6IFBXUl9DTURfV1JJVEVcbiIpOwotCQkJCW9mZnNldCA9IEdFVF9QV1JfQ0ZHX09GRlNFVChQd3JDZmdDbWQpOwotCi0JCQkJLyogIFJlYWQgdGhlIHZhbHVlIGZyb20gc3lzdGVtIHJlZ2lzdGVyICovCi0JCQkJdmFsdWUgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIG9mZnNldCk7Ci0KLQkJCQl2YWx1ZSAmPSB+KEdFVF9QV1JfQ0ZHX01BU0soUHdyQ2ZnQ21kKSk7Ci0JCQkJdmFsdWUgfD0gKEdFVF9QV1JfQ0ZHX1ZBTFVFKFB3ckNmZ0NtZCkgJgotCQkJCQkgIEdFVF9QV1JfQ0ZHX01BU0soUHdyQ2ZnQ21kKSk7Ci0KLQkJCQkvKiAgV3JpdGUgdGhlIHZhbHVlIGJhY2sgdG8gc3lzdGVtIHJlZ2lzdGVyICovCi0JCQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgb2Zmc2V0LCB2YWx1ZSk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgUFdSX0NNRF9QT0xMSU5HOgotCQkJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAiSGFsUHdyU2VxQ21kUGFyc2luZzIzYTogUFdSX0NNRF9QT0xMSU5HXG4iKTsKLQotCQkJCWJQb2xsaW5nQml0ID0gZmFsc2U7Ci0JCQkJb2Zmc2V0ID0gR0VUX1BXUl9DRkdfT0ZGU0VUKFB3ckNmZ0NtZCk7Ci0JCQkJZG8gewotCQkJCQl2YWx1ZSA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwKLQkJCQkJCQkJb2Zmc2V0KTsKLQotCQkJCQl2YWx1ZSAmPSBHRVRfUFdSX0NGR19NQVNLKFB3ckNmZ0NtZCk7Ci0JCQkJCWlmICh2YWx1ZSA9PQotCQkJCQkgICAgKEdFVF9QV1JfQ0ZHX1ZBTFVFKFB3ckNmZ0NtZCkgJgotCQkJCQkgICAgIEdFVF9QV1JfQ0ZHX01BU0soUHdyQ2ZnQ21kKSkpCi0JCQkJCQliUG9sbGluZ0JpdCA9IHRydWU7Ci0JCQkJCWVsc2UKLQkJCQkJCXVkZWxheSgxMCk7Ci0KLQkJCQkJaWYgKHBvbGxpbmdDb3VudCsrID4gbWF4UG9sbGluZ0NudCkgewotCQkJCQkJREJHXzg3MjNBKCJGYWlsIHRvIHBvbGxpbmcgIgotCQkJCQkJCSAgIk9mZnNldFslI3hdXG4iLAotCQkJCQkJCSAgb2Zmc2V0KTsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0gd2hpbGUgKCFiUG9sbGluZ0JpdCk7Ci0KLQkJCQlicmVhazsKLQotCQkJY2FzZSBQV1JfQ01EX0RFTEFZOgotCQkJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAiSGFsUHdyU2VxQ21kUGFyc2luZzIzYTogUFdSX0NNRF9ERUxBWVxuIik7Ci0JCQkJaWYgKEdFVF9QV1JfQ0ZHX1ZBTFVFKFB3ckNmZ0NtZCkgPT0KLQkJCQkgICAgUFdSU0VRX0RFTEFZX1VTKQotCQkJCQl1ZGVsYXkoR0VUX1BXUl9DRkdfT0ZGU0VUKFB3ckNmZ0NtZCkpOwotCQkJCWVsc2UKLQkJCQkJdWRlbGF5KEdFVF9QV1JfQ0ZHX09GRlNFVChQd3JDZmdDbWQpICoKLQkJCQkJICAgICAgIDEwMDApOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFBXUl9DTURfRU5EOgotCQkJCS8qICBXaGVuIHRoaXMgY29tbWFuZCBpcyBwYXJzZWQsIGVuZAotCQkJCSAgICB0aGUgcHJvY2VzcyAqLwotCQkJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAiSGFsUHdyU2VxQ21kUGFyc2luZzIzYTogUFdSX0NNRF9FTkRcbiIpOwotCQkJCXJldHVybiB0cnVlOwotCi0JCQlkZWZhdWx0OgotCQkJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfZXJyXywKLQkJCQkJICJIYWxQd3JTZXFDbWRQYXJzaW5nMjNhOiBVbmtub3duIENNRCEhXG4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCUFyeUlkeCsrOwkvKiBBZGQgQXJyYXkgSW5kZXggKi8KLQl9IHdoaWxlICgxKTsKLQotCXJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvaGFsX2NvbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvaGFsX2NvbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDdiMTFiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL2hhbF9jb20uYworKysgL2Rldi9udWxsCkBAIC0xLDg1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxoYWxfaW50Zi5oPgotI2luY2x1ZGUgPGhhbF9jb20uaD4KLSNpbmNsdWRlIDxydGw4NzIzYV9oYWwuaD4KLSNpbmNsdWRlIDx1c2Jfb3BzX2xpbnV4Lmg+Ci0KLSNkZWZpbmUgX0hBTF9JTklUX0NfCi0KLSNkZWZpbmUJRUVQUk9NX0NIQU5ORUxfUExBTl9CWV9IV19NQVNLCTB4ODAKLQotLyogcmV0dXJuIHRoZSBmaW5hbCBjaGFubmVsIHBsYW4gZGVjaXNpb24gKi8KLS8qIGh3X2NoYW5uZWxfcGxhbjogIGNoYW5uZWwgcGxhbiBmcm9tIEhXIChlZnVzZS9lZXByb20pICovCi0vKiBzd19jaGFubmVsX3BsYW46ICBjaGFubmVsIHBsYW4gZnJvbSBTVyAocmVnaXN0cnkvbW9kdWxlIHBhcmFtKSAqLwotLyogZGVmX2NoYW5uZWxfcGxhbjogY2hhbm5lbCBwbGFuIHVzZWQgd2hlbiB0aGUgZm9ybWVyIHR3byBpcyBpbnZhbGlkICovCi11OCBoYWxfY29tX2dldF9jaGFubmVsX3BsYW4yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggaHdfY2hhbm5lbF9wbGFuLAotCQkJICAgIHU4IHN3X2NoYW5uZWxfcGxhbiwgdTggZGVmX2NoYW5uZWxfcGxhbiwKLQkJCSAgICBib29sIEF1dG9Mb2FkRmFpbCkKLXsKLQl1OCBzd0NvbmZpZzsKLQl1OCBjaG5sUGxhbjsKLQotCXN3Q29uZmlnID0gdHJ1ZTsKLQlpZiAoIUF1dG9Mb2FkRmFpbCkgewotCQlpZiAoIXJ0d19pc19jaGFubmVsX3BsYW5fdmFsaWQoc3dfY2hhbm5lbF9wbGFuKSkKLQkJCXN3Q29uZmlnID0gZmFsc2U7Ci0JCWlmIChod19jaGFubmVsX3BsYW4gJiBFRVBST01fQ0hBTk5FTF9QTEFOX0JZX0hXX01BU0spCi0JCQlzd0NvbmZpZyA9IGZhbHNlOwotCX0KLQotCWlmIChzd0NvbmZpZyA9PSB0cnVlKQotCQljaG5sUGxhbiA9IHN3X2NoYW5uZWxfcGxhbjsKLQllbHNlCi0JCWNobmxQbGFuID0gaHdfY2hhbm5lbF9wbGFuICYgKH5FRVBST01fQ0hBTk5FTF9QTEFOX0JZX0hXX01BU0spOwotCi0JaWYgKCFydHdfaXNfY2hhbm5lbF9wbGFuX3ZhbGlkKGNobmxQbGFuKSkKLQkJY2hubFBsYW4gPSBkZWZfY2hhbm5lbF9wbGFuOwotCi0JcmV0dXJuIGNobmxQbGFuOwotfQotCi11OCBNUmF0ZVRvSHdSYXRlMjNhKHU4IHJhdGUpCi17Ci0JdTggcmV0ID0gREVTQ19SQVRFMU07Ci0KLQlzd2l0Y2ggKHJhdGUpIHsKLQkJLyogIENDSyBhbmQgT0ZETSBub24tSFQgcmF0ZXMgKi8KLQljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8xTUI6Ci0JCXJldCA9IERFU0NfUkFURTFNOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8yTUI6Ci0JCXJldCA9IERFU0NfUkFURTJNOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV81TUI6Ci0JCXJldCA9IERFU0NfUkFURTVfNU07Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzExTUI6Ci0JCXJldCA9IERFU0NfUkFURTExTTsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQjoKLQkJcmV0ID0gREVTQ19SQVRFNk07Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV85TUI6Ci0JCXJldCA9IERFU0NfUkFURTlNOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQjoKLQkJcmV0ID0gREVTQ19SQVRFMTJNOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQjoKLQkJcmV0ID0gREVTQ19SQVRFMThNOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQjoKLQkJcmV0ID0gREVTQ19SQVRFMjRNOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQjoKLQkJcmV0ID0gREVTQ19SQVRFMzZNOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQjoKLQkJcmV0ID0gREVTQ19SQVRFNDhNOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQjoKLQkJcmV0ID0gREVTQ19SQVRFNTRNOwotCQlicmVhazsKLQotCQkvKiAgSFQgcmF0ZXMgc2luY2UgaGVyZSAqLwotCQkvKiBjYXNlIE1HTl9NQ1MwOglyZXQgPSBERVNDX1JBVEVNQ1MwOyAgICBicmVhazsgKi8KLQkJLyogY2FzZSBNR05fTUNTMToJcmV0ID0gREVTQ19SQVRFTUNTMTsgICAgYnJlYWs7ICovCi0JCS8qIGNhc2UgTUdOX01DUzI6CXJldCA9IERFU0NfUkFURU1DUzI7ICAgIGJyZWFrOyAqLwotCQkvKiBjYXNlIE1HTl9NQ1MzOglyZXQgPSBERVNDX1JBVEVNQ1MzOyAgICBicmVhazsgKi8KLQkJLyogY2FzZSBNR05fTUNTNDoJcmV0ID0gREVTQ19SQVRFTUNTNDsgICAgYnJlYWs7ICovCi0JCS8qIGNhc2UgTUdOX01DUzU6CXJldCA9IERFU0NfUkFURU1DUzU7ICAgIGJyZWFrOyAqLwotCQkvKiBjYXNlIE1HTl9NQ1M2OglyZXQgPSBERVNDX1JBVEVNQ1M2OyAgICBicmVhazsgKi8KLQkJLyogY2FzZSBNR05fTUNTNzoJcmV0ID0gREVTQ19SQVRFTUNTNzsgICAgYnJlYWs7ICovCi0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBIYWxTZXRCcmF0ZUNmZzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqbUJyYXRlc09TKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXU4IGksIGlzX2JyYXRlLCBicmF0ZTsKLQl1MTYgYnJhdGVfY2ZnID0gMDsKLQl1OCByYXRlX2luZGV4OwotCi0JZm9yIChpID0gMDsgaSA8IE5ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWDsgaSsrKSB7Ci0JCWlzX2JyYXRlID0gbUJyYXRlc09TW2ldICYgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSzsKLQkJYnJhdGUgPSBtQnJhdGVzT1NbaV0gJiAweDdmOwotCi0JCWlmIChpc19icmF0ZSkgewotCQkJc3dpdGNoIChicmF0ZSkgewotCQkJY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfMU1COgotCQkJCWJyYXRlX2NmZyB8PSBSQVRFXzFNOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfMk1COgotCQkJCWJyYXRlX2NmZyB8PSBSQVRFXzJNOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfNU1COgotCQkJCWJyYXRlX2NmZyB8PSBSQVRFXzVfNU07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1COgotCQkJCWJyYXRlX2NmZyB8PSBSQVRFXzExTTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV82TUI6Ci0JCQkJYnJhdGVfY2ZnIHw9IFJBVEVfNk07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1COgotCQkJCWJyYXRlX2NmZyB8PSBSQVRFXzlNOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUI6Ci0JCQkJYnJhdGVfY2ZnIHw9IFJBVEVfMTJNOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUI6Ci0JCQkJYnJhdGVfY2ZnIHw9IFJBVEVfMThNOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUI6Ci0JCQkJYnJhdGVfY2ZnIHw9IFJBVEVfMjRNOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUI6Ci0JCQkJYnJhdGVfY2ZnIHw9IFJBVEVfMzZNOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUI6Ci0JCQkJYnJhdGVfY2ZnIHw9IFJBVEVfNDhNOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUI6Ci0JCQkJYnJhdGVfY2ZnIHw9IFJBVEVfNTRNOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyogIDIwMDcuMDEuMTYsIGJ5IEVtaWx5ICovCi0JLyogIFNlbGVjdCBSUlNSIChpbiBMZWdhY3ktT0ZETSBhbmQgQ0NLKSAqLwotCS8qICBGb3IgODE5MCwgd2Ugc2VsZWN0IG9ubHkgMjRNLCAxMk0sIDZNLCAxMU0sIDUuNU0sIDJNLAotCSAgICBhbmQgMU0gZnJvbSB0aGUgQmFzaWMgcmF0ZS4gKi8KLQkvKiAgV2UgZG8gbm90IHVzZSBvdGhlciByYXRlcy4gKi8KLQkvKiAyMDExLjAzLjMwIGFkZCBieSBMdWtlIExlZSAqLwotCS8qIENDSyAyTSBBQ0sgc2hvdWxkIGJlIGRpc2FibGVkIGZvciBzb21lIEJDTSBhbmQgQXRoZXJvcyBBUCBJT1QgKi8KLQkvKiBiZWNhdXNlIENDSyAyTSBoYXMgcG9vciBUWEVWTSAqLwotCS8qIENDSyA1LjVNICYgMTFNIEFDSyBzaG91bGQgYmUgZW5hYmxlZCBmb3IgYmV0dGVyCi0JICAgcGVyZm9ybWFuY2UgKi8KLQotCWJyYXRlX2NmZyA9IChicmF0ZV9jZmcgfCAweGQpICYgMHgxNWQ7Ci0JcEhhbERhdGEtPkJhc2ljUmF0ZVNldCA9IGJyYXRlX2NmZzsKLQlicmF0ZV9jZmcgfD0gMHgwMTsJLyogIGRlZmF1bHQgZW5hYmxlIDFNIEFDSyByYXRlICovCi0JREJHXzg3MjNBKCJIV19WQVJfQkFTSUNfUkFURTogQnJhdGVDZmcoJSN4KVxuIiwgYnJhdGVfY2ZnKTsKLQotCS8qICBTZXQgUlJTUiByYXRlIHRhYmxlLiAqLwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19SUlNSLCBicmF0ZV9jZmcgJiAweGZmKTsKLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfUlJTUiArIDEsIChicmF0ZV9jZmcgPj4gOCkgJiAweGZmKTsKLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfUlJTUiArIDIsCi0JCQkgcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBSRUdfUlJTUiArIDIpICYgMHhmMCk7Ci0KLQlyYXRlX2luZGV4ID0gMDsKLQkvKiAgU2V0IFJUUyBpbml0aWFsIHJhdGUgKi8KLQl3aGlsZSAoYnJhdGVfY2ZnID4gMHgxKSB7Ci0JCWJyYXRlX2NmZyA+Pj0gMTsKLQkJcmF0ZV9pbmRleCsrOwotCX0KLQkJLyogIFppdiAtIENoZWNrICovCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0lOSVJUU19SQVRFX1NFTCwgcmF0ZV9pbmRleCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9PbmVPdXRQaXBlTWFwcGluZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyKQotewotCXN0cnVjdCBkdm9ial9wcml2ICpwZHZvYmpwcml2ID0gYWRhcHRlcl90b19kdm9iaihwQWRhcHRlcik7Ci0KLQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzBdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOwkvKiBWTyAqLwotCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbMV0gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMF07CS8qIFZJICovCi0JcGR2b2JqcHJpdi0+UXVldWUyUGlwZVsyXSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsJLyogQkUgKi8KLQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzNdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOwkvKiBCSyAqLwotCi0JcGR2b2JqcHJpdi0+UXVldWUyUGlwZVs0XSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsJLyogQkNOICovCi0JcGR2b2JqcHJpdi0+UXVldWUyUGlwZVs1XSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsJLyogTUdUICovCi0JcGR2b2JqcHJpdi0+UXVldWUyUGlwZVs2XSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsJLyogSElHSCAqLwotCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbN10gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMF07CS8qIFRYQ01EICovCi19Ci0KLXN0YXRpYyB2b2lkIF9Ud29PdXRQaXBlTWFwcGluZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCBib29sIGJXSUZJQ2ZnKQotewotCXN0cnVjdCBkdm9ial9wcml2ICpwZHZvYmpwcml2ID0gYWRhcHRlcl90b19kdm9iaihwQWRhcHRlcik7Ci0KLQlpZiAoYldJRklDZmcpIHsJCS8qIFdNTSAqLwotCQkvKiAgICBCSywgICBCRSwgICBWSSwgICBWTywgICBCQ04sICBDTUQsICBNR1QsIEhJR0gsIEhDQ0EgKi8KLQkJLyogICAgIDAsICAgIDEsICAgIDAsICAgIDEsICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwIH07ICovCi0JCS8qIDA6SCwgMTpMICovCi0JCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbMF0gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMV07IC8qIFZPICovCi0JCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbMV0gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMF07IC8qIFZJICovCi0JCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbMl0gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMV07IC8qIEJFICovCi0JCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbM10gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMF07IC8qIEJLICovCi0KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVs0XSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsgLyogQkNOICovCi0JCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbNV0gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMF07IC8qIE1HVCAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzZdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOyAvKiBISUdIICovCi0JCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbN10gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMF07IC8qIFRYQ01EKi8KLQl9IGVsc2UgewkJLyogdHlwaWNhbCBzZXR0aW5nICovCi0JCS8qICAgIEJLLCAgIEJFLCAgIFZJLCAgIFZPLCAgIEJDTiwgIENNRCwgIE1HVCwgSElHSCwgSENDQSAqLwotCQkvKiAgICAgMSwgICAgMSwgICAgMCwgICAgMCwgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAgfTsgKi8KLQkJLyogMDpILCAxOkwgKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVswXSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsgLyogVk8gKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVsxXSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsgLyogVkkgKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVsyXSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVsxXTsgLyogQkUgKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVszXSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVsxXTsgLyogQksgKi8KLQotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzRdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOyAvKiBCQ04gKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVs1XSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsgLyogTUdUICovCi0JCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbNl0gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMF07IC8qIEhJR0ggKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVs3XSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsgLyogVFhDTUQqLwotCX0KLX0KLQotc3RhdGljIHZvaWQgX1RocmVlT3V0UGlwZU1hcHBpbmcoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgYm9vbCBiV0lGSUNmZykKLXsKLQlzdHJ1Y3QgZHZvYmpfcHJpdiAqcGR2b2JqcHJpdiA9IGFkYXB0ZXJfdG9fZHZvYmoocEFkYXB0ZXIpOwotCi0JaWYgKGJXSUZJQ2ZnKSB7CQkvKiBmb3IgV01NICovCi0JCS8qICAgIEJLLCAgIEJFLCAgIFZJLCAgIFZPLCAgIEJDTiwgIENNRCwgIE1HVCwgSElHSCwgSENDQSAqLwotCQkvKiAgICAgMSwgICAgMiwgICAgMSwgICAgMCwgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAgfTsgKi8KLQkJLyogMDpILCAxOk4sIDI6TCAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzBdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOyAvKiBWTyAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzFdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzFdOyAvKiBWSSAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzJdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzJdOyAvKiBCRSAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzNdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzFdOyAvKiBCSyAqLwotCi0JCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbNF0gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMF07IC8qIEJDTiAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzVdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOyAvKiBNR1QgKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVs2XSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsgLyogSElHSCAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzddID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOyAvKiBUWENNRCovCi0JfSBlbHNlIHsJCS8qIHR5cGljYWwgc2V0dGluZyAqLwotCQkvKiAgICBCSywgICBCRSwgICBWSSwgICBWTywgICBCQ04sICBDTUQsICBNR1QsIEhJR0gsIEhDQ0EgKi8KLQkJLyogICAgIDIsICAgIDIsICAgIDEsICAgIDAsICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwIH07ICovCi0JCS8qIDA6SCwgMTpOLCAyOkwgKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVswXSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsgLyogVk8gKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVsxXSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVsxXTsgLyogVkkgKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVsyXSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVsyXTsgLyogQkUgKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVszXSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVsyXTsgLyogQksgKi8KLQotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzRdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOyAvKiBCQ04gKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVs1XSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsgLyogTUdUICovCi0JCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbNl0gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMF07IC8qIEhJR0ggKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVs3XSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsgLyogVFhDTUQqLwotCX0KLX0KLQotYm9vbCBIYWxfTWFwcGluZ091dFBpcGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTggTnVtT3V0UGlwZSkKLXsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiA9ICZwQWRhcHRlci0+cmVnaXN0cnlwcml2OwotCWJvb2wgYldJRklDZmcgPSAocHJlZ2lzdHJ5cHJpdi0+d2lmaV9zcGVjKSA/IHRydWUgOiBmYWxzZTsKLQlib29sIHJlc3VsdCA9IHRydWU7Ci0KLQlzd2l0Y2ggKE51bU91dFBpcGUpIHsKLQljYXNlIDI6Ci0JCV9Ud29PdXRQaXBlTWFwcGluZyhwQWRhcHRlciwgYldJRklDZmcpOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCV9UaHJlZU91dFBpcGVNYXBwaW5nKHBBZGFwdGVyLCBiV0lGSUNmZyk7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJX09uZU91dFBpcGVNYXBwaW5nKHBBZGFwdGVyKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmVzdWx0ID0gZmFsc2U7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qCi0qIEMySCBldmVudCBmb3JtYXQ6Ci0qIEZpZWxkCSBUUklHR0VSCQlDT05URU5UCSAgIENNRF9TRVEJQ01EX0xFTgkJIENNRF9JRAotKiBCSVRTCSBbMTI3OjEyMF0JWzExOToxNl0gICAgICBbMTU6OF0JCSAgWzc6NF0JCSAgIFszOjBdCi0qLwotCi12b2lkIGMyaF9ldnRfY2xlYXIyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKQotewotCXJ0bDg3MjNhdV93cml0ZTgoYWRhcHRlciwgUkVHX0MySEVWVF9DTEVBUiwgQzJIX0VWVF9IT1NUX0NMT1NFKTsKLX0KLQotaW50IGMyaF9ldnRfcmVhZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICpidWYpCi17Ci0JaW50IHJldCA9IF9GQUlMOwotCXN0cnVjdCBjMmhfZXZ0X2hkciAqYzJoX2V2dDsKLQlpbnQgaTsKLQl1OCB0cmlnZ2VyOwotCi0JaWYgKGJ1ZiA9PSBOVUxMKQotCQlnb3RvIGV4aXQ7Ci0KLQl0cmlnZ2VyID0gcnRsODcyM2F1X3JlYWQ4KGFkYXB0ZXIsIFJFR19DMkhFVlRfQ0xFQVIpOwotCi0JaWYgKHRyaWdnZXIgPT0gQzJIX0VWVF9IT1NUX0NMT1NFKQotCQlnb3RvIGV4aXQ7CS8qIE5vdCByZWFkeSAqLwotCWlmICh0cmlnZ2VyICE9IEMySF9FVlRfRldfQ0xPU0UpCi0JCWdvdG8gY2xlYXJfZXZ0OwkvKiBOb3QgYSB2YWxpZCB2YWx1ZSAqLwotCi0JYzJoX2V2dCA9IChzdHJ1Y3QgYzJoX2V2dF9oZHIgKilidWY7Ci0KLQltZW1zZXQoYzJoX2V2dCwgMCwgMTYpOwotCi0JKmJ1ZiA9IHJ0bDg3MjNhdV9yZWFkOChhZGFwdGVyLCBSRUdfQzJIRVZUX01TR19OT1JNQUwpOwotCSooYnVmICsgMSkgPSBydGw4NzIzYXVfcmVhZDgoYWRhcHRlciwgUkVHX0MySEVWVF9NU0dfTk9STUFMICsgMSk7Ci0KLQlSVF9QUklOVF9EQVRBKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sICJjMmhfZXZ0X3JlYWQyM2EoKTogIiwKLQkJICAgICAgJmMyaF9ldnQsIHNpemVvZihjMmhfZXZ0KSk7Ci0KLQlpZiAoMCkgewotCQlEQkdfODcyM0EoIiVzIGlkOiV1LCBsZW46JXUsIHNlcToldSwgdHJpZ2dlcjoweCUwMnhcbiIsCi0JCQkgIF9fZnVuY19fLCBjMmhfZXZ0LT5pZCwgYzJoX2V2dC0+cGxlbiwgYzJoX2V2dC0+c2VxLAotCQkJICB0cmlnZ2VyKTsKLQl9Ci0KLQkvKiBSZWFkIHRoZSBjb250ZW50ICovCi0JZm9yIChpID0gMDsgaSA8IGMyaF9ldnQtPnBsZW47IGkrKykKLQkJYzJoX2V2dC0+cGF5bG9hZFtpXSA9IHJ0bDg3MjNhdV9yZWFkOChhZGFwdGVyLAotCQkJCQkJUkVHX0MySEVWVF9NU0dfTk9STUFMICsKLQkJCQkJCXNpemVvZigqYzJoX2V2dCkgKyBpKTsKLQotCVJUX1BSSU5UX0RBVEEoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJICAgICAgImMyaF9ldnRfcmVhZDIzYSgpOiBDb21tYW5kIENvbnRlbnQ6XG4iLCBjMmhfZXZ0LT5wYXlsb2FkLAotCQkgICAgICBjMmhfZXZ0LT5wbGVuKTsKLQotCXJldCA9IF9TVUNDRVNTOwotCi1jbGVhcl9ldnQ6Ci0JLyoKLQkgKiBDbGVhciBldmVudCB0byBub3RpZnkgRlcgd2UgaGF2ZSByZWFkIHRoZSBjb21tYW5kLgotCSAqIElmIHRoaXMgZmllbGQgaXNuJ3QgY2xlYXIsIHRoZSBGVyB3b24ndCB1cGRhdGUgdGhlCi0JICogbmV4dCBjb21tYW5kIG1lc3NhZ2UuCi0JICovCi0JYzJoX2V2dF9jbGVhcjIzYShhZGFwdGVyKTsKLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZAotcnRsODcyM2Ffc2V0X2FtcGR1X21pbl9zcGFjZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBNaW5TcGFjaW5nVG9TZXQpCi17Ci0JdTggU2VjTWluU3BhY2U7Ci0KLQlpZiAoTWluU3BhY2luZ1RvU2V0IDw9IDcpIHsKLQkJc3dpdGNoIChwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG0pIHsKLQkJY2FzZSAwOgotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6Ci0JCQlTZWNNaW5TcGFjZSA9IDA7Ci0JCQlicmVhazsKLQotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgotCQkJU2VjTWluU3BhY2UgPSA2OwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlTZWNNaW5TcGFjZSA9IDc7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChNaW5TcGFjaW5nVG9TZXQgPCBTZWNNaW5TcGFjZSkKLQkJCU1pblNwYWNpbmdUb1NldCA9IFNlY01pblNwYWNlOwotCi0JCU1pblNwYWNpbmdUb1NldCB8PQotCQkJcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBSRUdfQU1QRFVfTUlOX1NQQUNFKSAmIDB4Zjg7Ci0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19BTVBEVV9NSU5fU1BBQ0UsCi0JCQkJIE1pblNwYWNpbmdUb1NldCk7Ci0JfQotfQotCi12b2lkIHJ0bDg3MjNhX3NldF9hbXBkdV9mYWN0b3Ioc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggRmFjdG9yVG9TZXQpCi17Ci0JdTggUmVnVG9TZXRfTm9ybWFsWzRdID0geyAweDQxLCAweGE4LCAweDcyLCAweGI5IH07Ci0JdTggTWF4QWdnTnVtOwotCXU4ICpwUmVnVG9TZXQ7Ci0JdTggaW5kZXggPSAwOwotCi0JcFJlZ1RvU2V0ID0gUmVnVG9TZXRfTm9ybWFsOwkvKiAgMHhiOTcyYTg0MTsgKi8KLQotCWlmIChydGw4NzIzYV9CVF9lbmFibGVkKHBhZGFwdGVyKSAmJgotCSAgICBydGw4NzIzYV9CVF91c2luZ19hbnRlbm5hXzEocGFkYXB0ZXIpKQotCQlNYXhBZ2dOdW0gPSAweDg7Ci0JZWxzZQotCQlNYXhBZ2dOdW0gPSAweEY7Ci0KLQlpZiAoRmFjdG9yVG9TZXQgPD0gMykgewotCQlGYWN0b3JUb1NldCA9IDEgPDwgKEZhY3RvclRvU2V0ICsgMik7Ci0JCWlmIChGYWN0b3JUb1NldCA+IE1heEFnZ051bSkKLQkJCUZhY3RvclRvU2V0ID0gTWF4QWdnTnVtOwotCi0JCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IDQ7IGluZGV4KyspIHsKLQkJCWlmICgocFJlZ1RvU2V0W2luZGV4XSAmIDB4ZjApID4gKEZhY3RvclRvU2V0IDw8IDQpKQotCQkJCXBSZWdUb1NldFtpbmRleF0gPSAocFJlZ1RvU2V0W2luZGV4XSAmIDB4MGYpIHwKLQkJCQkJKEZhY3RvclRvU2V0IDw8IDQpOwotCi0JCQlpZiAoKHBSZWdUb1NldFtpbmRleF0gJiAweDBmKSA+IEZhY3RvclRvU2V0KQotCQkJCXBSZWdUb1NldFtpbmRleF0gPSAocFJlZ1RvU2V0W2luZGV4XSAmIDB4ZjApIHwKLQkJCQkJRmFjdG9yVG9TZXQ7Ci0KLQkJCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19BR0dMRU5fTE1UICsgaW5kZXgsCi0JCQkJCSBwUmVnVG9TZXRbaW5kZXhdKTsKLQkJfQotCX0KLX0KLQotdm9pZCBydGw4NzIzYV9zZXRfYWNtX2N0cmwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggY3RybCkKLXsKLQl1OCBod2N0cmwgPSAwOwotCi0JaWYgKGN0cmwgIT0gMCkgewotCQlod2N0cmwgfD0gQWNtSHdfSHdFbjsKLQotCQlpZiAoY3RybCAmIEJJVCgxKSkJLyogIEJFICovCi0JCQlod2N0cmwgfD0gQWNtSHdfQmVxRW47Ci0KLQkJaWYgKGN0cmwgJiBCSVQoMikpCS8qICBWSSAqLwotCQkJaHdjdHJsIHw9IEFjbUh3X1ZpcUVuOwotCi0JCWlmIChjdHJsICYgQklUKDMpKQkvKiAgVk8gKi8KLQkJCWh3Y3RybCB8PSBBY21Id19Wb3FFbjsKLQl9Ci0KLQlEQkdfODcyM0EoIltIV19WQVJfQUNNX0NUUkxdIFdyaXRlIDB4JTAyWFxuIiwgaHdjdHJsKTsKLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfQUNNSFdDVFJMLCBod2N0cmwpOwotfQotCi12b2lkIHJ0bDg3MjNhX3NldF9tZWRpYV9zdGF0dXMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggc3RhdHVzKQotewotCXU4IHZhbDg7Ci0KLQl2YWw4ID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBNU1IpICYgMHgwYzsKLQl2YWw4IHw9IHN0YXR1czsKLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBNU1IsIHZhbDgpOwotfQotCi12b2lkIHJ0bDg3MjNhX3NldF9tZWRpYV9zdGF0dXMxKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHN0YXR1cykKLXsKLQl1OCB2YWw4OwotCi0JdmFsOCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgTVNSKSAmIDB4MDM7Ci0JdmFsOCB8PSBzdGF0dXMgPDwgMjsKLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBNU1IsIHZhbDgpOwotfQotCi12b2lkIHJ0bDg3MjNhX3NldF9iY25fZnVuYyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB2YWwpCi17Ci0JaWYgKHZhbCkKLQkJU2V0QmNuQ3RybFJlZzIzYShwYWRhcHRlciwgRU5fQkNOX0ZVTkNUSU9OIHwgRU5fVFhCQ05fUlBULCAwKTsKLQllbHNlCi0JCVNldEJjbkN0cmxSZWcyM2EocGFkYXB0ZXIsIDAsIEVOX0JDTl9GVU5DVElPTiB8IEVOX1RYQkNOX1JQVCk7Ci19Ci0KLXZvaWQgcnRsODcyM2FfY2hlY2tfYnNzaWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggdmFsKQotewotCXUzMiB2YWwzMjsKLQotCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgUkVHX1JDUik7Ci0JaWYgKHZhbCkKLQkJdmFsMzIgfD0gUkNSX0NCU1NJRF9EQVRBIHwgUkNSX0NCU1NJRF9CQ047Ci0JZWxzZQotCQl2YWwzMiAmPSB+KFJDUl9DQlNTSURfREFUQSB8IFJDUl9DQlNTSURfQkNOKTsKLQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgUkVHX1JDUiwgdmFsMzIpOwotfQotCi12b2lkIHJ0bDg3MjNhX21sbWVfc2l0ZXN1cnZleShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBmbGFnKQotewotCWlmIChmbGFnKSB7CS8qIHVuZGVyIHNpdGVzdXJ2ZXkgKi8KLQkJdTMyIHYzMjsKLQotCQkvKiAgY29uZmlnIFJDUiB0byByZWNlaXZlIGRpZmZlcmVudCBCU1NJRCAmIG5vdAotCQkgICAgdG8gcmVjZWl2ZSBkYXRhIGZyYW1lICovCi0JCXYzMiA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIFJFR19SQ1IpOwotCQl2MzIgJj0gfihSQ1JfQ0JTU0lEX0JDTik7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfUkNSLCB2MzIpOwotCQkvKiAgcmVqZWN0IGFsbCBkYXRhIGZyYW1lICovCi0JCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfUlhGTFRNQVAyLCAwKTsKLQotCQkvKiAgZGlzYWJsZSB1cGRhdGUgVFNGICovCi0JCVNldEJjbkN0cmxSZWcyM2EocGFkYXB0ZXIsIERJU19UU0ZfVURULCAwKTsKLQl9IGVsc2UgewkvKiBzaXRlc3VydmV5IGRvbmUgKi8KLQotCQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvOwotCQl1MzIgdjMyOwotCi0JCXBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQkJaWYgKChpc19jbGllbnRfYXNzb2NpYXRlZF90b19hcDIzYShwYWRhcHRlcikgPT0gdHJ1ZSkgfHwKLQkJICAgICgocG1sbWVpbmZvLT5zdGF0ZSAmIDB4MDMpID09IE1TUl9BREhPQykgfHwKLQkJICAgICgocG1sbWVpbmZvLT5zdGF0ZSAmIDB4MDMpID09IE1TUl9BUCkpIHsKLQkJCS8qICBlbmFibGUgdG8gcnggZGF0YSBmcmFtZSAqLwotCQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19SWEZMVE1BUDIsIDB4RkZGRik7Ci0KLQkJCS8qICBlbmFibGUgdXBkYXRlIFRTRiAqLwotCQkJU2V0QmNuQ3RybFJlZzIzYShwYWRhcHRlciwgMCwgRElTX1RTRl9VRFQpOwotCQl9Ci0KLQkJdjMyID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgUkVHX1JDUik7Ci0JCXYzMiB8PSBSQ1JfQ0JTU0lEX0JDTjsKLQkJcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIFJFR19SQ1IsIHYzMik7Ci0JfQotCi0JcnRsODcyM2FfQlRfd2lmaXNjYW5fbm90aWZ5KHBhZGFwdGVyLCBmbGFnID8gdHJ1ZSA6IGZhbHNlKTsKLX0KLQotdm9pZCBydGw4NzIzYV9vbl9yY3JfYW0oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgUkVHX1JDUiwKLQkJICAgIHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIFJFR19SQ1IpIHwgUkNSX0FNKTsKLQlEQkdfODcyM0EoIiVzLCAlZCwgUkNSID0gJXhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJICBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfUkNSKSk7Ci19Ci0KLXZvaWQgcnRsODcyM2Ffb2ZmX3Jjcl9hbShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfUkNSLAotCQkgICAgcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgUkVHX1JDUikgJiAoflJDUl9BTSkpOwotCURCR184NzIzQSgiJXMsICVkLCBSQ1IgPSAleFxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQkgIHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIFJFR19SQ1IpKTsKLX0KLQotdm9pZCBydGw4NzIzYV9zZXRfc2xvdF90aW1lKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHNsb3R0aW1lKQotewotCXU4IHUxYkFJRlMsIGFTaWZzVGltZTsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1NMT1QsIHNsb3R0aW1lKTsKLQotCWlmIChwbWxtZWluZm8tPldNTV9lbmFibGUgPT0gMCkgewotCQlpZiAocG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlID09IFdJUkVMRVNTXzExQikKLQkJCWFTaWZzVGltZSA9IDEwOwotCQllbHNlCi0JCQlhU2lmc1RpbWUgPSAxNjsKLQotCQl1MWJBSUZTID0gYVNpZnNUaW1lICsgKDIgKiBwbWxtZWluZm8tPnNsb3RUaW1lKTsKLQotCQkvKiAgPFJvZ2VyX0VYUD4gVGVtcG9yYXJ5IHJlbW92ZWQsIDIwMDguMDYuMjAuICovCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19FRENBX1ZPX1BBUkFNLCB1MWJBSUZTKTsKLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0VEQ0FfVklfUEFSQU0sIHUxYkFJRlMpOwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfRURDQV9CRV9QQVJBTSwgdTFiQUlGUyk7Ci0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19FRENBX0JLX1BBUkFNLCB1MWJBSUZTKTsKLQl9Ci19Ci0KLXZvaWQgcnRsODcyM2FfYWNrX3ByZWFtYmxlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJTaG9ydFByZWFtYmxlKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXU4IHJlZ1RtcDsKLQotCS8qICBKb3NlcGggbWFya2VkIG91dCBmb3IgTmV0Z2VhciAzNTAwIFRLSVAKLQkgICAgY2hhbm5lbCA3IGlzc3VlLihUZW1wb3JhcmlseSkgKi8KLQlyZWdUbXAgPSAocEhhbERhdGEtPm5DdXI0ME1oelByaW1lU0MpIDw8IDU7Ci0JLyogcmVnVG1wID0gMDsgKi8KLQlpZiAoYlNob3J0UHJlYW1ibGUpCi0JCXJlZ1RtcCB8PSAweDgwOwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19SUlNSICsgMiwgcmVnVG1wKTsKLX0KLQotdm9pZCBydGw4NzIzYV9zZXRfc2VjX2NmZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBzZWMpCi17Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1NFQ0NGRywgc2VjKTsKLX0KLQotdm9pZCBydGw4NzIzYV9jYW1fZW1wdHlfZW50cnkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggdWNJbmRleCkKLXsKLQl1OCBpOwotCXUzMiB1bENvbW1hbmQgPSAwOwotCXUzMiB1bENvbnRlbnQgPSAwOwotCXUzMiB1bEVuY0FsZ28gPSBDQU1fQUVTOwotCi0JZm9yIChpID0gMDsgaSA8IENBTV9DT05URU5UX0NPVU5UOyBpKyspIHsKLQkJLyogIGZpbGxlZCBpZCBpbiBDQU0gY29uZmlnIDIgYnl0ZSAqLwotCQlpZiAoaSA9PSAwKSB7Ci0JCQl1bENvbnRlbnQgfD0gKHVjSW5kZXggJiAweDAzKSB8Ci0JCQkJKCh1MTYpICh1bEVuY0FsZ28pIDw8IDIpOwotCQkJLyogdWxDb250ZW50IHw9IENBTV9WQUxJRDsgKi8KLQkJfSBlbHNlIHsKLQkJCXVsQ29udGVudCA9IDA7Ci0JCX0KLQkJLyogIHBvbGxpbmcgYml0LCBhbmQgTm8gV3JpdGUgZW5hYmxlLCBhbmQgYWRkcmVzcyAqLwotCQl1bENvbW1hbmQgPSBDQU1fQ09OVEVOVF9DT1VOVCAqIHVjSW5kZXggKyBpOwotCQl1bENvbW1hbmQgPSB1bENvbW1hbmQgfCBDQU1fUE9MTElOSUcgfCBDQU1fV1JJVEU7Ci0JCS8qICB3cml0ZSBjb250ZW50IDAgaXMgZXF1YWxsIHRvIG1hcmsgaW52YWxpZCAqLwotCQkvKiBkZWxheV9tcyg0MCk7ICovCi0JCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBXQ0FNSSwgdWxDb250ZW50KTsKLQkJLyogZGVsYXlfbXMoNDApOyAqLwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgUkVHX0NBTUNNRCwgdWxDb21tYW5kKTsKLQl9Ci19Ci0KLXZvaWQgcnRsODcyM2FfY2FtX2ludmFsaWRhdGVfYWxsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIFJFR19DQU1DTUQsIENBTV9QT0xMSU5JRyB8IEJJVCgzMCkpOwotfQotCi12b2lkIHJ0bDg3MjNhX2NhbV93cml0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJdTggZW50cnksIHUxNiBjdHJsLCBjb25zdCB1OCAqbWFjLCBjb25zdCB1OCAqa2V5KQotewotCXUzMiBjbWQ7Ci0JdW5zaWduZWQgaW50IGksIHZhbCwgYWRkcjsKLQlpbnQgajsKLQotCWFkZHIgPSBlbnRyeSA8PCAzOwotCi0JZm9yIChqID0gNTsgaiA+PSAwOyBqLS0pIHsKLQkJc3dpdGNoIChqKSB7Ci0JCWNhc2UgMDoKLQkJCXZhbCA9IGN0cmwgfCAobWFjWzBdIDw8IDE2KSB8IChtYWNbMV0gPDwgMjQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCXZhbCA9IG1hY1syXSB8IChtYWNbM10gPDwgOCkgfAotCQkJCShtYWNbNF0gPDwgMTYpIHwgKG1hY1s1XSA8PCAyNCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWkgPSAoaiAtIDIpIDw8IDI7Ci0JCQl2YWwgPSBrZXlbaV0gfCAoa2V5W2krMV0gPDwgOCkgfAotCQkJCShrZXlbaSsyXSA8PCAxNikgfCAoa2V5W2krM10gPDwgMjQpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgV0NBTUksIHZhbCk7Ci0JCWNtZCA9IENBTV9QT0xMSU5JRyB8IENBTV9XUklURSB8IChhZGRyICsgaik7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfQ0FNQ01ELCBjbWQpOwotCi0JCS8qIERCR184NzIzQSgiJXMgPT4gY2FtIHdyaXRlOiAleCwgJXhcbiIsIF9fZnVuY19fLCBjbWQsIHZhbCk7Ki8KLQl9Ci19Ci0KLXZvaWQgcnRsODcyM2FfZmlmb19jbGVhbnVwKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0jZGVmaW5lIFJXX1JFTEVBU0VfRU4JCUJJVCgxOCkKLSNkZWZpbmUgUlhETUFfSURMRQkJQklUKDE3KQotCi0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0JdTggdHJ5Y250ID0gMTAwOwotCi0JLyogIHBhdXNlIHR4ICovCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1RYUEFVU0UsIDB4ZmYpOwotCi0JLyogIGtlZXAgc24gKi8KLQlwYWRhcHRlci0+eG1pdHByaXYubnFvc19zc24gPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19OUU9TX1NFUSk7Ci0KLQlpZiAocHdycHJpdi0+YmtlZXBmd2FsaXZlICE9IHRydWUpIHsKLQkJdTMyIHYzMjsKLQotCQkvKiAgUlggRE1BIHN0b3AgKi8KLQkJdjMyID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgUkVHX1JYUEtUX05VTSk7Ci0JCXYzMiB8PSBSV19SRUxFQVNFX0VOOwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgUkVHX1JYUEtUX05VTSwgdjMyKTsKLQkJZG8gewotCQkJdjMyID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwKLQkJCQkJICAgICAgIFJFR19SWFBLVF9OVU0pICYgUlhETUFfSURMRTsKLQkJCWlmICghdjMyKQotCQkJCWJyZWFrOwotCQl9IHdoaWxlICh0cnljbnQtLSk7Ci0JCWlmICh0cnljbnQgPT0gMCkKLQkJCURCR184NzIzQSgiU3RvcCBSWCBETUEgZmFpbGVkLi4uLi4uXG4iKTsKLQotCQkvKiAgUlFQTiBMb2FkIDAgKi8KLQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19SUVBOX05QUSwgMCk7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfUlFQTiwgMHg4MDAwMDAwMCk7Ci0JCW1kZWxheSgxMCk7Ci0JfQotfQotCi12b2lkIHJ0bDg3MjNhX2Jjbl92YWxpZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCS8qIEJDTl9WQUxJRCwgQklUMTYgb2YgUkVHX1RERUNUUkwgPSBCSVQwIG9mIFJFR19UREVDVFJMKzIsCi0JICAgd3JpdGUgMSB0byBjbGVhciwgQ2xlYXIgYnkgc3cgKi8KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfVERFQ1RSTCArIDIsCi0JCQkgcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBSRUdfVERFQ1RSTCArIDIpIHwgQklUKDApKTsKLX0KLQotYm9vbCBydGw4NzIzYV9nZXRfYmNuX3ZhbGlkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JYm9vbCByZXR2YWw7Ci0KLQlyZXR2YWwgPSAocnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBSRUdfVERFQ1RSTCArIDIpICYgQklUKDApKSA/IHRydWUgOiBmYWxzZTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLXZvaWQgcnRsODcyM2Ffc2V0X2JlYWNvbl9pbnRlcnZhbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MTYgaW50ZXJ2YWwpCi17Ci0JcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19CQ05fSU5URVJWQUwsIGludGVydmFsKTsKLX0KLQotdm9pZCBydGw4NzIzYV9zZXRfcmVzcF9zaWZzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgdTggcjJ0MSwgdTggcjJ0MiwgdTggdDJ0MSwgdTggdDJ0MikKLXsKLQkvKiBTSUZTX1RpbWVyID0gMHgwYTBhMDgwODsgKi8KLQkvKiBSRVNQX1NJRlMgZm9yIENDSyAqLwotCS8qICBTSUZTX1QyVF9DQ0sgKDB4MDgpICovCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1IyVF9TSUZTLCByMnQxKTsKLQkvKiBTSUZTX1IyVF9DQ0soMHgwOCkgKi8KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfUjJUX1NJRlMgKyAxLCByMnQyKTsKLQkvKiBSRVNQX1NJRlMgZm9yIE9GRE0gKi8KLQkvKiBTSUZTX1QyVF9PRkRNICgweDBhKSAqLwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19UMlRfU0lGUywgdDJ0MSk7Ci0JLyogU0lGU19SMlRfT0ZETSgweDBhKSAqLwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19UMlRfU0lGUyArIDEsIHQydDIpOwotfQotCi12b2lkIHJ0bDg3MjNhX3NldF9hY19wYXJhbV92byhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgdm8pCi17Ci0JcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIFJFR19FRENBX1ZPX1BBUkFNLCB2byk7Ci19Ci0KLXZvaWQgcnRsODcyM2Ffc2V0X2FjX3BhcmFtX3ZpKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiB2aSkKLXsKLQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgUkVHX0VEQ0FfVklfUEFSQU0sIHZpKTsKLX0KLQotdm9pZCBydGw4NzIzYV9zZXRfYWNfcGFyYW1fYmUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIGJlKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JcEhhbERhdGEtPkFjUGFyYW1fQkUgPSBiZTsKLQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgUkVHX0VEQ0FfQkVfUEFSQU0sIGJlKTsKLX0KLQotdm9pZCBydGw4NzIzYV9zZXRfYWNfcGFyYW1fYmsoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIGJrKQotewotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfRURDQV9CS19QQVJBTSwgYmspOwotfQotCi12b2lkIHJ0bDg3MjNhX3NldF9yeGRtYV9hZ2dfcGdfdGgoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggdmFsKQotewotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19SWERNQV9BR0dfUEdfVEgsIHZhbCk7Ci19Ci0KLXZvaWQgcnRsODcyM2Ffc2V0X2luaXRpYWxfZ2FpbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgcnhfZ2FpbikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgZGlnX3QgKnBEaWdUYWJsZSA9ICZwSGFsRGF0YS0+b2RtcHJpdi5ETV9EaWdUYWJsZTsKLQotCWlmIChyeF9nYWluID09IDB4ZmYpCS8qIHJlc3RvcmUgcnggZ2FpbiAqLwotCQlPRE1fV3JpdGVfRElHMjNhKCZwSGFsRGF0YS0+b2RtcHJpdiwgcERpZ1RhYmxlLT5CYWNrdXBJR1ZhbHVlKTsKLQllbHNlIHsKLQkJcERpZ1RhYmxlLT5CYWNrdXBJR1ZhbHVlID0gcERpZ1RhYmxlLT5DdXJJR1ZhbHVlOwotCQlPRE1fV3JpdGVfRElHMjNhKCZwSGFsRGF0YS0+b2RtcHJpdiwgcnhfZ2Fpbik7Ci0JfQotfQotCi12b2lkIHJ0bDg3MjNhX29kbV9zdXBwb3J0X2FiaWxpdHlfcmVzdG9yZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JcEhhbERhdGEtPm9kbXByaXYuU3VwcG9ydEFiaWxpdHkgPSBwSGFsRGF0YS0+b2RtcHJpdi5CS19TdXBwb3J0QWJpbGl0eTsKLX0KLQotdm9pZCBydGw4NzIzYV9vZG1fc3VwcG9ydF9hYmlsaXR5X2JhY2t1cChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JcEhhbERhdGEtPm9kbXByaXYuQktfU3VwcG9ydEFiaWxpdHkgPSBwSGFsRGF0YS0+b2RtcHJpdi5TdXBwb3J0QWJpbGl0eTsKLX0KLQotdm9pZCBydGw4NzIzYV9vZG1fc3VwcG9ydF9hYmlsaXR5X3NldChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgdmFsKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JaWYgKHZhbCA9PSBEWU5BTUlDX0FMTF9GVU5DX0VOQUJMRSkKLQkJcEhhbERhdGEtPm9kbXByaXYuU3VwcG9ydEFiaWxpdHkgPSBwSGFsRGF0YS0+ZG1wcml2LkluaXRPRE1GbGFnOwotCWVsc2UKLQkJcEhhbERhdGEtPm9kbXByaXYuU3VwcG9ydEFiaWxpdHkgfD0gdmFsOwotfQotCi12b2lkIHJ0bDg3MjNhX29kbV9zdXBwb3J0X2FiaWxpdHlfY2xyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiB2YWwpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlwSGFsRGF0YS0+b2RtcHJpdi5TdXBwb3J0QWJpbGl0eSAmPSB2YWw7Ci19Ci0KLXZvaWQgcnRsODcyM2Ffc2V0X3Jwd20oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggdmFsKQotewotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19VU0JfSFJQV00sIHZhbCk7Ci19Ci0KLXU4IHJ0bDg3MjNhX2dldF9yZl90eXBlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlyZXR1cm4gcEhhbERhdGEtPnJmX3R5cGU7Ci19Ci0KLWJvb2wgcnRsODcyM2FfZ2V0X2Z3bHBzX3JmX29uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JYm9vbCByZXR2YWw7Ci0JdTMyIHZhbFJDUjsKLQotCS8qICBXaGVuIHdlIGhhbHQgTklDLCB3ZSBzaG91bGQgY2hlY2sgaWYgRlcgTFBTIGlzIGxlYXZlLiAqLwotCi0JaWYgKChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCA9PSB0cnVlKSB8fAotCSAgICAocGFkYXB0ZXItPnB3cmN0cmxwcml2LnJmX3B3cnN0YXRlID09IHJmX29mZikpIHsKLQkJLyogIElmIGl0IGlzIGluIEhXL1NXIFJhZGlvIE9GRiBvciBJUFMgc3RhdGUsIHdlIGRvCi0JCSAgICBub3QgY2hlY2sgRncgTFBTIExlYXZlLCBiZWNhdXNlIEZ3IGlzIHVubG9hZC4gKi8KLQkJcmV0dmFsID0gdHJ1ZTsKLQl9IGVsc2UgewotCQl2YWxSQ1IgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfUkNSKTsKLQkJaWYgKHZhbFJDUiAmIDB4MDAwNzAwMDApCi0JCQlyZXR2YWwgPSBmYWxzZTsKLQkJZWxzZQotCQkJcmV0dmFsID0gdHJ1ZTsKLQl9Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1ib29sIHJ0bDg3MjNhX2Noa19oaV9xdWV1ZV9lbXB0eShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXUzMiBoZ3E7Ci0KLQloZ3EgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfSEdRX0lORk9STUFUSU9OKTsKLQotCXJldHVybiAoKGhncSAmIDB4MDAwMGZmMDApID09IDApID8gdHJ1ZSA6IGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvaGFsX2ludGYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL2hhbF9pbnRmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzODNlNjkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvaGFsX2ludGYuYworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIF9IQUxfSU5URl9DXwotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLQotI2luY2x1ZGUgPGhhbF9pbnRmLmg+Ci0KLSNpbmNsdWRlIDxydGw4NzIzYV9oYWwuaD4KLQotdm9pZCBydHdfaGFsX3VwZGF0ZV9yYV9tYXNrMjNhKHN0cnVjdCBzdGFfaW5mbyAqcHN0YSwgdTggcnNzaV9sZXZlbCkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdjsKLQotCWlmICghcHN0YSkKLQkJcmV0dXJuOwotCi0JcGFkYXB0ZXIgPSBwc3RhLT5wYWRhcHRlcjsKLQotCXBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpKSB7Ci0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0JCWFkZF9SQVRpZDIzYShwYWRhcHRlciwgcHN0YSwgcnNzaV9sZXZlbCk7Ci0jZW5kaWYKLQl9IGVsc2UKLQkJcnRsODcyM2FfdXBkYXRlX3JhbWFzayhwYWRhcHRlciwgcHN0YS0+bWFjX2lkLCByc3NpX2xldmVsKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL29kbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNzljMzQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAib2RtX3ByZWNvbXAuaCIKLSNpbmNsdWRlICJ1c2Jfb3BzX2xpbnV4LmgiCi0KLXN0YXRpYyBjb25zdCB1MTYgZEJfSW52ZXJ0X1RhYmxlWzhdWzEyXSA9IHsKLQl7MSwgMSwgMSwgMiwgMiwgMiwgMiwgMywgMywgMywgNCwgNH0sCi0JezQsIDUsIDYsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTMsIDE0LCAxNn0sCi0JezE4LCAyMCwgMjIsIDI1LCAyOCwgMzIsIDM1LCA0MCwgNDUsIDUwLCA1NiwgNjN9LAotCXs3MSwgNzksIDg5LCAxMDAsIDExMiwgMTI2LCAxNDEsIDE1OCwgMTc4LCAyMDAsIDIyNCwgMjUxfSwKLQl7MjgyLCAzMTYsIDM1NSwgMzk4LCA0NDcsIDUwMSwgNTYyLCA2MzEsIDcwOCwgNzk0LCA4OTEsIDEwMDB9LAotCXsxMTIyLCAxMjU5LCAxNDEzLCAxNTg1LCAxNzc4LCAxOTk1LCAyMjM5LCAyNTEyLCAyODE4LCAzMTYyLCAzNTQ4LCAzOTgxfSwKLQl7NDQ2NywgNTAxMiwgNTYyMywgNjMxMCwgNzA3OSwgNzk0MywgODkxMywgMTAwMDAsIDExMjIwLCAxMjU4OSwgMTQxMjUsIDE1ODQ5fSwKLQl7MTc3ODMsIDE5OTUzLCAyMjM4NywgMjUxMTksIDI4MTg0LCAzMTYyMywgMzU0ODEsIDM5ODExLCA0NDY2OCwgNTAxMTksIDU2MjM0LCA2NTUzNX0KLX07Ci0KLXN0YXRpYyB1MzIgRURDQVBhcmFtW0hUX0lPVF9QRUVSX01BWF1bM10gPSB7ICAgICAgICAgIC8qICBVTAkJCURMICovCi0JezB4NWVhNDJiLCAweDVlYTQyYiwgMHg1ZWE0MmJ9LCAvKiAwOnVua25vd24gQVAgKi8KLQl7MHhhNDRmLCAweDVlYTQ0ZiwgMHg1ZTQzMWN9LCAvKiAgMTpyZWFsdGVrIEFQICovCi0JezB4NWVhNDJiLCAweDVlYTQyYiwgMHg1ZWE0MmJ9LCAvKiAgMjp1bmtub3duIEFQID0+IHJlYWx0ZWtfOTJTRSAqLwotCXsweDVlYTMyYiwgMHg1ZWE0MmIsIDB4NWU0MzIyfSwgLyogIDM6YnJvYWRjb20gQVAgKi8KLQl7MHg1ZWE0MjIsIDB4MDBhNDRmLCAweDAwYTQ0Zn0sIC8qICA0OnJhbGluayBBUCAqLwotCXsweDVlYTMyMiwgMHgwMGE2MzAsIDB4MDBhNDRmfSwgLyogIDU6YXRoZXJvcyBBUCAqLwotCXsweDVlNDMyMiwgMHg1ZTQzMjIsIDB4NWU0MzIyfSwvKiAgNjpjaXNjbyBBUCAqLwotCXsweDVlYTQ0ZiwgMHgwMGE0NGYsIDB4NWVhNDJifSwgLyogIDg6bWFydmVsbCBBUCAqLwotCXsweDVlYTQyYiwgMHg1ZWE0MmIsIDB4NWVhNDJifSwgLyogIDEwOnVua25vd24gQVAgPT4gOTJVIEFQICovCi0JezB4NWVhNDJiLCAweGE2MzAsIDB4NWU0MzFjfSwgLyogIDExOmFpcmdvY2FwIEFQICovCi19OwotCi0vKiAgRURDQSBQYXJhbWV0ZXIgZm9yIEFQL0FEU0wgICBieSBNaW5nemhpIDIwMTEtMTEtMjIgKi8KLQotLyogIEdsb2JhbCB2YXIgKi8KLXUzMiBPRkRNU3dpbmdUYWJsZTIzQVtPRkRNX1RBQkxFX1NJWkVfOTJEXSA9IHsKLQkweDdmODAwMWZlLCAvKiAgMCwgKzYuMGRCICovCi0JMHg3ODgwMDFlMiwgLyogIDEsICs1LjVkQiAqLwotCTB4NzFjMDAxYzcsIC8qICAyLCArNS4wZEIgKi8KLQkweDZiODAwMWFlLCAvKiAgMywgKzQuNWRCICovCi0JMHg2NTQwMDE5NSwgLyogIDQsICs0LjBkQiAqLwotCTB4NWZjMDAxN2YsIC8qICA1LCArMy41ZEIgKi8KLQkweDVhNDAwMTY5LCAvKiAgNiwgKzMuMGRCICovCi0JMHg1NTQwMDE1NSwgLyogIDcsICsyLjVkQiAqLwotCTB4NTA4MDAxNDIsIC8qICA4LCArMi4wZEIgKi8KLQkweDRjMDAwMTMwLCAvKiAgOSwgKzEuNWRCICovCi0JMHg0N2MwMDExZiwgLyogIDEwLCArMS4wZEIgKi8KLQkweDQzYzAwMTBmLCAvKiAgMTEsICswLjVkQiAqLwotCTB4NDAwMDAxMDAsIC8qICAxMiwgKzBkQiAqLwotCTB4M2M4MDAwZjIsIC8qICAxMywgLTAuNWRCICovCi0JMHgzOTAwMDBlNCwgLyogIDE0LCAtMS4wZEIgKi8KLQkweDM1YzAwMGQ3LCAvKiAgMTUsIC0xLjVkQiAqLwotCTB4MzJjMDAwY2IsIC8qICAxNiwgLTIuMGRCICovCi0JMHgzMDAwMDBjMCwgLyogIDE3LCAtMi41ZEIgKi8KLQkweDJkNDAwMGI1LCAvKiAgMTgsIC0zLjBkQiAqLwotCTB4MmFjMDAwYWIsIC8qICAxOSwgLTMuNWRCICovCi0JMHgyODgwMDBhMiwgLyogIDIwLCAtNC4wZEIgKi8KLQkweDI2MDAwMDk4LCAvKiAgMjEsIC00LjVkQiAqLwotCTB4MjQwMDAwOTAsIC8qICAyMiwgLTUuMGRCICovCi0JMHgyMjAwMDA4OCwgLyogIDIzLCAtNS41ZEIgKi8KLQkweDIwMDAwMDgwLCAvKiAgMjQsIC02LjBkQiAqLwotCTB4MWU0MDAwNzksIC8qICAyNSwgLTYuNWRCICovCi0JMHgxYzgwMDA3MiwgLyogIDI2LCAtNy4wZEIgKi8KLQkweDFiMDAwMDZjLCAvKiAgMjcuIC03LjVkQiAqLwotCTB4MTk4MDAwNjYsIC8qICAyOCwgLTguMGRCICovCi0JMHgxODAwMDA2MCwgLyogIDI5LCAtOC41ZEIgKi8KLQkweDE2YzAwMDViLCAvKiAgMzAsIC05LjBkQiAqLwotCTB4MTU4MDAwNTYsIC8qICAzMSwgLTkuNWRCICovCi0JMHgxNDQwMDA1MSwgLyogIDMyLCAtMTAuMGRCICovCi0JMHgxMzAwMDA0YywgLyogIDMzLCAtMTAuNWRCICovCi0JMHgxMjAwMDA0OCwgLyogIDM0LCAtMTEuMGRCICovCi0JMHgxMTAwMDA0NCwgLyogIDM1LCAtMTEuNWRCICovCi0JMHgxMDAwMDA0MCwgLyogIDM2LCAtMTIuMGRCICovCi0JMHgwZjAwMDAzYywvKiAgMzcsIC0xMi41ZEIgKi8KLQkweDBlNDAwMDM5LC8qICAzOCwgLTEzLjBkQiAqLwotCTB4MGQ4MDAwMzYsLyogIDM5LCAtMTMuNWRCICovCi0JMHgwY2MwMDAzMywvKiAgNDAsIC0xNC4wZEIgKi8KLQkweDBjMDAwMDMwLC8qICA0MSwgLTE0LjVkQiAqLwotCTB4MGI0MDAwMmQsLyogIDQyLCAtMTUuMGRCICovCi19OwotCi11OCBDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzMjNBW0NDS19UQUJMRV9TSVpFXVs4XSA9IHsKLQl7MHgzNiwgMHgzNSwgMHgyZSwgMHgyNSwgMHgxYywgMHgxMiwgMHgwOSwgMHgwNH0sIC8qICAwLCArMGRCICovCi0JezB4MzMsIDB4MzIsIDB4MmIsIDB4MjMsIDB4MWEsIDB4MTEsIDB4MDgsIDB4MDR9LCAvKiAgMSwgLTAuNWRCICovCi0JezB4MzAsIDB4MmYsIDB4MjksIDB4MjEsIDB4MTksIDB4MTAsIDB4MDgsIDB4MDN9LCAvKiAgMiwgLTEuMGRCICovCi0JezB4MmQsIDB4MmQsIDB4MjcsIDB4MWYsIDB4MTgsIDB4MGYsIDB4MDgsIDB4MDN9LCAvKiAgMywgLTEuNWRCICovCi0JezB4MmIsIDB4MmEsIDB4MjUsIDB4MWUsIDB4MTYsIDB4MGUsIDB4MDcsIDB4MDN9LCAvKiAgNCwgLTIuMGRCICovCi0JezB4MjgsIDB4MjgsIDB4MjIsIDB4MWMsIDB4MTUsIDB4MGQsIDB4MDcsIDB4MDN9LCAvKiAgNSwgLTIuNWRCICovCi0JezB4MjYsIDB4MjUsIDB4MjEsIDB4MWIsIDB4MTQsIDB4MGQsIDB4MDYsIDB4MDN9LCAvKiAgNiwgLTMuMGRCICovCi0JezB4MjQsIDB4MjMsIDB4MWYsIDB4MTksIDB4MTMsIDB4MGMsIDB4MDYsIDB4MDN9LCAvKiAgNywgLTMuNWRCICovCi0JezB4MjIsIDB4MjEsIDB4MWQsIDB4MTgsIDB4MTEsIDB4MGIsIDB4MDYsIDB4MDJ9LCAvKiAgOCwgLTQuMGRCICovCi0JezB4MjAsIDB4MjAsIDB4MWIsIDB4MTYsIDB4MTEsIDB4MDgsIDB4MDUsIDB4MDJ9LCAvKiAgOSwgLTQuNWRCICovCi0JezB4MWYsIDB4MWUsIDB4MWEsIDB4MTUsIDB4MTAsIDB4MGEsIDB4MDUsIDB4MDJ9LCAvKiAgMTAsIC01LjBkQiAqLwotCXsweDFkLCAweDFjLCAweDE4LCAweDE0LCAweDBmLCAweDBhLCAweDA1LCAweDAyfSwgLyogIDExLCAtNS41ZEIgKi8KLQl7MHgxYiwgMHgxYSwgMHgxNywgMHgxMywgMHgwZSwgMHgwOSwgMHgwNCwgMHgwMn0sIC8qICAxMiwgLTYuMGRCICovCi0JezB4MWEsIDB4MTksIDB4MTYsIDB4MTIsIDB4MGQsIDB4MDksIDB4MDQsIDB4MDJ9LCAvKiAgMTMsIC02LjVkQiAqLwotCXsweDE4LCAweDE3LCAweDE1LCAweDExLCAweDBjLCAweDA4LCAweDA0LCAweDAyfSwgLyogIDE0LCAtNy4wZEIgKi8KLQl7MHgxNywgMHgxNiwgMHgxMywgMHgxMCwgMHgwYywgMHgwOCwgMHgwNCwgMHgwMn0sIC8qICAxNSwgLTcuNWRCICovCi0JezB4MTYsIDB4MTUsIDB4MTIsIDB4MGYsIDB4MGIsIDB4MDcsIDB4MDQsIDB4MDF9LCAvKiAgMTYsIC04LjBkQiAqLwotCXsweDE0LCAweDE0LCAweDExLCAweDBlLCAweDBiLCAweDA3LCAweDAzLCAweDAyfSwgLyogIDE3LCAtOC41ZEIgKi8KLQl7MHgxMywgMHgxMywgMHgxMCwgMHgwZCwgMHgwYSwgMHgwNiwgMHgwMywgMHgwMX0sIC8qICAxOCwgLTkuMGRCICovCi0JezB4MTIsIDB4MTIsIDB4MGYsIDB4MGMsIDB4MDksIDB4MDYsIDB4MDMsIDB4MDF9LCAvKiAgMTksIC05LjVkQiAqLwotCXsweDExLCAweDExLCAweDBmLCAweDBjLCAweDA5LCAweDA2LCAweDAzLCAweDAxfSwgLyogIDIwLCAtMTAuMGRCICovCi0JezB4MTAsIDB4MTAsIDB4MGUsIDB4MGIsIDB4MDgsIDB4MDUsIDB4MDMsIDB4MDF9LCAvKiAgMjEsIC0xMC41ZEIgKi8KLQl7MHgwZiwgMHgwZiwgMHgwZCwgMHgwYiwgMHgwOCwgMHgwNSwgMHgwMywgMHgwMX0sIC8qICAyMiwgLTExLjBkQiAqLwotCXsweDBlLCAweDBlLCAweDBjLCAweDBhLCAweDA4LCAweDA1LCAweDAyLCAweDAxfSwgLyogIDIzLCAtMTEuNWRCICovCi0JezB4MGQsIDB4MGQsIDB4MGMsIDB4MGEsIDB4MDcsIDB4MDUsIDB4MDIsIDB4MDF9LCAvKiAgMjQsIC0xMi4wZEIgKi8KLQl7MHgwZCwgMHgwYywgMHgwYiwgMHgwOSwgMHgwNywgMHgwNCwgMHgwMiwgMHgwMX0sIC8qICAyNSwgLTEyLjVkQiAqLwotCXsweDBjLCAweDBjLCAweDBhLCAweDA5LCAweDA2LCAweDA0LCAweDAyLCAweDAxfSwgLyogIDI2LCAtMTMuMGRCICovCi0JezB4MGIsIDB4MGIsIDB4MGEsIDB4MDgsIDB4MDYsIDB4MDQsIDB4MDIsIDB4MDF9LCAvKiAgMjcsIC0xMy41ZEIgKi8KLQl7MHgwYiwgMHgwYSwgMHgwOSwgMHgwOCwgMHgwNiwgMHgwNCwgMHgwMiwgMHgwMX0sIC8qICAyOCwgLTE0LjBkQiAqLwotCXsweDBhLCAweDBhLCAweDA5LCAweDA3LCAweDA1LCAweDAzLCAweDAyLCAweDAxfSwgLyogIDI5LCAtMTQuNWRCICovCi0JezB4MGEsIDB4MDksIDB4MDgsIDB4MDcsIDB4MDUsIDB4MDMsIDB4MDIsIDB4MDF9LCAvKiAgMzAsIC0xNS4wZEIgKi8KLQl7MHgwOSwgMHgwOSwgMHgwOCwgMHgwNiwgMHgwNSwgMHgwMywgMHgwMSwgMHgwMX0sIC8qICAzMSwgLTE1LjVkQiAqLwotCXsweDA5LCAweDA4LCAweDA3LCAweDA2LCAweDA0LCAweDAzLCAweDAxLCAweDAxfQkvKiAgMzIsIC0xNi4wZEIgKi8KLX07Ci0KLXU4IENDS1N3aW5nVGFibGVfQ2gxNDIzQVtDQ0tfVEFCTEVfU0laRV1bOF0gPSB7Ci0JezB4MzYsIDB4MzUsIDB4MmUsIDB4MWIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMCwgKzBkQiAqLwotCXsweDMzLCAweDMyLCAweDJiLCAweDE5LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDEsIC0wLjVkQiAqLwotCXsweDMwLCAweDJmLCAweDI5LCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDIsIC0xLjBkQiAqLwotCXsweDJkLCAweDJkLCAweDE3LCAweDE3LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDMsIC0xLjVkQiAqLwotCXsweDJiLCAweDJhLCAweDI1LCAweDE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDQsIC0yLjBkQiAqLwotCXsweDI4LCAweDI4LCAweDI0LCAweDE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDUsIC0yLjVkQiAqLwotCXsweDI2LCAweDI1LCAweDIxLCAweDEzLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDYsIC0zLjBkQiAqLwotCXsweDI0LCAweDIzLCAweDFmLCAweDEyLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDcsIC0zLjVkQiAqLwotCXsweDIyLCAweDIxLCAweDFkLCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDgsIC00LjBkQiAqLwotCXsweDIwLCAweDIwLCAweDFiLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDksIC00LjVkQiAqLwotCXsweDFmLCAweDFlLCAweDFhLCAweDBmLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDEwLCAtNS4wZEIgKi8KLQl7MHgxZCwgMHgxYywgMHgxOCwgMHgwZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qICAxMSwgLTUuNWRCICovCi0JezB4MWIsIDB4MWEsIDB4MTcsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMTIsIC02LjBkQiAqLwotCXsweDFhLCAweDE5LCAweDE2LCAweDBkLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDEzLCAtNi41ZEIgKi8KLQl7MHgxOCwgMHgxNywgMHgxNSwgMHgwYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qICAxNCwgLTcuMGRCICovCi0JezB4MTcsIDB4MTYsIDB4MTMsIDB4MGIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMTUsIC03LjVkQiAqLwotCXsweDE2LCAweDE1LCAweDEyLCAweDBiLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDE2LCAtOC4wZEIgKi8KLQl7MHgxNCwgMHgxNCwgMHgxMSwgMHgwYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qICAxNywgLTguNWRCICovCi0JezB4MTMsIDB4MTMsIDB4MTAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMTgsIC05LjBkQiAqLwotCXsweDEyLCAweDEyLCAweDBmLCAweDA5LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDE5LCAtOS41ZEIgKi8KLQl7MHgxMSwgMHgxMSwgMHgwZiwgMHgwOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qICAyMCwgLTEwLjBkQiAqLwotCXsweDEwLCAweDEwLCAweDBlLCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDIxLCAtMTAuNWRCICovCi0JezB4MGYsIDB4MGYsIDB4MGQsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMjIsIC0xMS4wZEIgKi8KLQl7MHgwZSwgMHgwZSwgMHgwYywgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qICAyMywgLTExLjVkQiAqLwotCXsweDBkLCAweDBkLCAweDBjLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDI0LCAtMTIuMGRCICovCi0JezB4MGQsIDB4MGMsIDB4MGIsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMjUsIC0xMi41ZEIgKi8KLQl7MHgwYywgMHgwYywgMHgwYSwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qICAyNiwgLTEzLjBkQiAqLwotCXsweDBiLCAweDBiLCAweDBhLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDI3LCAtMTMuNWRCICovCi0JezB4MGIsIDB4MGEsIDB4MDksIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMjgsIC0xNC4wZEIgKi8KLQl7MHgwYSwgMHgwYSwgMHgwOSwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qICAyOSwgLTE0LjVkQiAqLwotCXsweDBhLCAweDA5LCAweDA4LCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDMwLCAtMTUuMGRCICovCi0JezB4MDksIDB4MDksIDB4MDgsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMzEsIC0xNS41ZEIgKi8KLQl7MHgwOSwgMHgwOCwgMHgwNywgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0JLyogIDMyLCAtMTYuMGRCICovCi19OwotCi0vKiAgTG9jYWwgRnVuY3Rpb24gcHJlZGVmaW5lLiAqLwotCi0vKiBTVEFSVC0tLS0tLS0tLS0tLUNPTU1PTiBJTkZPIFJFTEFURUQtLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgb2RtX0NvbW1vbkluZm9TZWxmSW5pdDIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotCi1zdGF0aWMgdm9pZCBvZG1fQ29tbW9uSW5mb1NlbGZVcGRhdGUoc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSk7Ci0KLXZvaWQgb2RtX0NtbkluZm9Jbml0X0RlYnVnMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci0KLXZvaWQgb2RtX0NtbkluZm9VcGRhdGVfRGVidWcyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotLyogU1RBUlQtLS0tLS0tLS0tLS0tLS1ESUctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgb2RtX0ZhbHNlQWxhcm1Db3VudGVyU3RhdGlzdGljczIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotCi12b2lkIG9kbV9ESUcyM2FJbml0KHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci0KLXZvaWQgb2RtX0RJRzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpOwotCi12b2lkIG9kbV9DQ0tQYWNrZXREZXRlY3Rpb25UaHJlc2gyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLS8qIEVORC0tLS0tLS0tLS0tLS0tLURJRy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBTVEFSVC0tLS0tLS1CQiBQT1dFUiBTQVZFLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgb2RtMjNhX0R5bkJCUFNJbml0KHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci0KLQotLyogRU5ELS0tLS0tLS0tQkIgUE9XRVIgU0FWRS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXZvaWQgb2RtX0R5bmFtaWNUeFBvd2VyMjNhSW5pdChzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotCi1zdGF0aWMgdm9pZCBvZG1fUlNTSU1vbml0b3JDaGVjayhzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotdm9pZCBvZG1fRHluYW1pY1R4UG93ZXIyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotc3RhdGljIHZvaWQgb2RtX1JlZnJlc2hSYXRlQWRhcHRpdmVNYXNrKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci0KLXZvaWQgb2RtX1JhdGVBZGFwdGl2ZU1hc2tJbml0MjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci0KLXN0YXRpYyB2b2lkIG9kbV9UWFBvd2VyVHJhY2tpbmdJbml0KHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci0KLXN0YXRpYyB2b2lkIG9kbV9FZGNhVHVyYm9DaGVjazIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotc3RhdGljIHZvaWQgT0RNX0VkY2FUdXJib0luaXQyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotI2RlZmluZQkJUnhEZWZhdWx0QW50MQkJMHg2NWE5Ci0jZGVmaW5lCVJ4RGVmYXVsdEFudDIJCTB4NTY5YQotCi1ib29sIG9kbV9TdGFEZWZBbnRTZWwoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLAotCXUzMiBPRkRNX0FudDFfQ250LAotCXUzMiBPRkRNX0FudDJfQ250LAotCXUzMiBDQ0tfQW50MV9DbnQsCi0JdTMyIENDS19BbnQyX0NudCwKLQl1OCAqcERlZkFudAotCSk7Ci0KLXZvaWQgb2RtX1NldFJ4SWRsZUFudChzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sCi0JdTggQW50LAotCWJvb2wgICBiRHVhbFBhdGgKLSk7Ci0KLS8qIDMgRXhwb3J0IEludGVyZmFjZSAqLwotCi0vKiAgMjAxMS8wOS8yMSBNSCBBZGQgdG8gZGVzY3JpYmUgZGlmZmVyZW50IHRlYW0gbmVjZXNzYXJ5IHJlc291cmNlIGFsbG9jYXRlPz8gKi8KLXZvaWQgT0RNMjNhX0RNSW5pdChzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCi17Ci0JLyogRm9yIGFsbCBJQyBzZXJpZXMgKi8KLQlvZG1fQ29tbW9uSW5mb1NlbGZJbml0MjNhKHBETV9PZG0pOwotCW9kbV9DbW5JbmZvSW5pdF9EZWJ1ZzIzYShwRE1fT2RtKTsKLQlvZG1fRElHMjNhSW5pdChwRE1fT2RtKTsKLQlvZG1fUmF0ZUFkYXB0aXZlTWFza0luaXQyM2EocERNX09kbSk7Ci0KLQlvZG0yM2FfRHluQkJQU0luaXQocERNX09kbSk7Ci0Jb2RtX0R5bmFtaWNUeFBvd2VyMjNhSW5pdChwRE1fT2RtKTsKLQlvZG1fVFhQb3dlclRyYWNraW5nSW5pdChwRE1fT2RtKTsKLQlPRE1fRWRjYVR1cmJvSW5pdDIzYShwRE1fT2RtKTsKLX0KLQotLyogIDIwMTEvMDkvMjAgTUggVGhpcyBpcyB0aGUgZW50cnkgcG9pbnRlciBmb3IgYWxsIHRlYW0gdG8gZXhlY3V0ZSBIVyBvdXQgc291cmNlIERNLiAqLwotLyogIFlvdSBjYW4gbm90IGFkZCBhbnkgZHVtbXkgZnVuY3Rpb24gaGVyZSwgYmUgY2FyZSwgeW91IGNhbiBvbmx5IHVzZSBETSBzdHJ1Y3R1cmUgKi8KLS8qICB0byBwZXJmb3JtIGFueSBuZXcgT0RNX0RNLiAqLwotdm9pZCBPRE1fRE1XYXRjaGRvZzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdGVyKTsKLQlzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0gPSAmcEhhbERhdGEtPm9kbXByaXY7Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdyY3RybHByaXYgPSAmYWRhcHRlci0+cHdyY3RybHByaXY7Ci0KLQkvKiAyMDEyLjA1LjAzIEx1a2U6IEZvciBhbGwgSUMgc2VyaWVzICovCi0Jb2RtX0NtbkluZm9VcGRhdGVfRGVidWcyM2EocERNX09kbSk7Ci0Jb2RtX0NvbW1vbkluZm9TZWxmVXBkYXRlKHBIYWxEYXRhKTsKLQlvZG1fRmFsc2VBbGFybUNvdW50ZXJTdGF0aXN0aWNzMjNhKHBETV9PZG0pOwotCW9kbV9SU1NJTW9uaXRvckNoZWNrKHBETV9PZG0pOwotCi0JLyogODcyM0Egb3IgODE4OUVTIHBsYXRmb3JtICovCi0JLyogTmVpbENoZW4tLTIwMTItLTA4LS0yNC0tICovCi0JLyogRml4IExlYXZlIExQUyBpc3N1ZSAqLwotCWlmICgocERNX09kbS0+QWRhcHRlci0+cHdyY3RybHByaXYucHdyX21vZGUgIT0gUFNfTU9ERV9BQ1RJVkUpICYmLyogIGluIExQUyBtb2RlICovCi0JICAgIChwRE1fT2RtLT5TdXBwb3J0SUNUeXBlICYgT0RNX1JUTDg3MjNBKSkgewotCQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELCAoIi0tLS1TdGVwMTogb2RtX0RJRzIzYSBpcyBpbiBMUFMgbW9kZVxuIikpOwotCQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELCAoIi0tLVN0ZXAyOiA4NzIzQVMgaXMgaW4gTFBTIG1vZGVcbiIpKTsKLQkJCW9kbV9ESUcyM2FieVJTU0lfTFBTKHBETV9PZG0pOwotCX0gZWxzZSB7Ci0JCW9kbV9ESUcyM2EoYWRhcHRlcik7Ci0JfQotCi0Jb2RtX0NDS1BhY2tldERldGVjdGlvblRocmVzaDIzYShwRE1fT2RtKTsKLQotCWlmIChwd3JjdHJscHJpdi0+YnBvd2VyX3NhdmluZykKLQkJcmV0dXJuOwotCi0Jb2RtX1JlZnJlc2hSYXRlQWRhcHRpdmVNYXNrKHBETV9PZG0pOwotCi0KLQlvZG1fRWRjYVR1cmJvQ2hlY2syM2EocERNX09kbSk7Ci19Ci0KLS8qICAqLwotLyogIEluaXQgLy4uIEZpeGVkIEhXIHZhbHVlLiBPbmx5IGluaXQgdGltZS4gKi8KLS8qICAqLwotdm9pZCBPRE1fQ21uSW5mb0luaXQyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLAotCQllbnVtIG9kbV9jbW5pbmZvIENtbkluZm8sCi0JCXUzMiBWYWx1ZQotCSkKLXsKLQkvKiBPRE1fUlRfVFJBQ0UocERNX09kbSwpOyAqLwotCi0JLyogICovCi0JLyogIFRoaXMgc2VjdGlvbiBpcyB1c2VkIGZvciBpbml0IHZhbHVlICovCi0JLyogICovCi0Jc3dpdGNoCShDbW5JbmZvKSB7Ci0JLyogIEZpeGVkIE9ETSB2YWx1ZS4gKi8KLQljYXNlCU9ETV9DTU5JTkZPX01QX1RFU1RfQ0hJUDoKLQkJcERNX09kbS0+YklzTVBDaGlwID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0lDX1RZUEU6Ci0JCXBETV9PZG0tPlN1cHBvcnRJQ1R5cGUgPSBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19DVVRfVkVSOgotCQlwRE1fT2RtLT5DdXRWZXJzaW9uID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0ZBQl9WRVI6Ci0JCXBETV9PZG0tPkZhYlZlcnNpb24gPSAodTgpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fQk9BUkRfVFlQRToKLQkJcERNX09kbS0+Qm9hcmRUeXBlID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0VYVF9MTkE6Ci0JCXBETV9PZG0tPkV4dExOQSA9ICh1OClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19FWFRfUEE6Ci0JCXBETV9PZG0tPkV4dFBBID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0VYVF9UUlNXOgotCQlwRE1fT2RtLT5FeHRUUlNXID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0JJTkhDVF9URVNUOgotCQlwRE1fT2RtLT5iSW5IY3RUZXN0ID0gKGJvb2wpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fQldJRklfVEVTVDoKLQkJcERNX09kbS0+YldJRklUZXN0ID0gKGJvb2wpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fU01BUlRfQ09OQ1VSUkVOVDoKLQkJcERNX09kbS0+YkR1YWxNYWNTbWFydENvbmN1cnJlbnQgPSAoYm9vbClWYWx1ZTsKLQkJYnJlYWs7Ci0JLyogVG8gcmVtb3ZlIHRoZSBjb21waWxlciB3YXJuaW5nLCBtdXN0IGFkZCBhbiBlbXB0eSBkZWZhdWx0IHN0YXRlbWVudCB0byBoYW5kbGUgdGhlIG90aGVyIHZhbHVlcy4gKi8KLQlkZWZhdWx0OgotCQkvKiBkbyBub3RoaW5nICovCi0JCWJyZWFrOwotCX0KLX0KLQotdm9pZCBPRE1fQ21uSW5mb1B0ckFycmF5SG9vazIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIGVudW0gb2RtX2NtbmluZm8gQ21uSW5mbywKLQkJCQl1MTYgSW5kZXgsIHZvaWQgKnBWYWx1ZSkKLXsKLQkvKiAgSG9vayBjYWxsIGJ5IHJlZmVyZW5jZSBwb2ludGVyLiAqLwotCXN3aXRjaAkoQ21uSW5mbykgewotCS8qICBEeW5hbWljIGNhbGwgYnkgcmVmZXJlbmNlIHBvaW50ZXIuICovCi0JY2FzZQlPRE1fQ01OSU5GT19TVEFfU1RBVFVTOgotCQlwRE1fT2RtLT5wT0RNX1N0YUluZm9bSW5kZXhdID0gKHN0cnVjdCBzdGFfaW5mbyAqKXBWYWx1ZTsKLQkJYnJlYWs7Ci0JLyogVG8gcmVtb3ZlIHRoZSBjb21waWxlciB3YXJuaW5nLCBtdXN0IGFkZCBhbiBlbXB0eSBkZWZhdWx0IHN0YXRlbWVudCB0byBoYW5kbGUgdGhlIG90aGVyIHZhbHVlcy4gKi8KLQlkZWZhdWx0OgotCQkvKiBkbyBub3RoaW5nICovCi0JCWJyZWFrOwotCX0KLX0KLQotLyogIFVwZGF0ZSBCYW5kL0NIYW5uZWwvLi4gVGhlIHZhbHVlcyBhcmUgZHluYW1pYyBidXQgbm9uLXBlci1wYWNrZXQuICovCi12b2lkIE9ETV9DbW5JbmZvVXBkYXRlMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTMyIENtbkluZm8sIHU2NCBWYWx1ZSkKLXsKLQkvKiAgVGhpcyBpbml0IHZhcmlhYmxlIG1heSBiZSBjaGFuZ2VkIGluIHJ1biB0aW1lLiAqLwotCXN3aXRjaAkoQ21uSW5mbykgewotCWNhc2UJT0RNX0NNTklORk9fV0lGSV9ESVJFQ1Q6Ci0JCXBETV9PZG0tPmJXSUZJX0RpcmVjdCA9IChib29sKVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1dJRklfRElTUExBWToKLQkJcERNX09kbS0+YldJRklfRGlzcGxheSA9IChib29sKVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0xJTks6Ci0JCXBETV9PZG0tPmJMaW5rZWQgPSAoYm9vbClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19SU1NJX01JTjoKLQkJcERNX09kbS0+UlNTSV9NaW4gPSAodTgpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fREJHX0NPTVA6Ci0JCXBETV9PZG0tPkRlYnVnQ29tcG9uZW50cyA9IFZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0RCR19MRVZFTDoKLQkJcERNX09kbS0+RGVidWdMZXZlbCA9ICh1MzIpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fUkFfVEhSRVNIT0xEX0hJR0g6Ci0JCXBETV9PZG0tPlJhdGVBZGFwdGl2ZS5IaWdoUlNTSVRocmVzaCA9ICh1OClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19SQV9USFJFU0hPTERfTE9XOgotCQlwRE1fT2RtLT5SYXRlQWRhcHRpdmUuTG93UlNTSVRocmVzaCA9ICh1OClWYWx1ZTsKLQkJYnJlYWs7Ci0JfQotCi19Ci0KLXZvaWQgb2RtX0NvbW1vbkluZm9TZWxmSW5pdDIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCi17Ci0JdTMyIHZhbDMyOwotCi0JdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKHBETV9PZG0tPkFkYXB0ZXIsIHJGUEdBMF9YQV9IU1NJUGFyYW1ldGVyMik7Ci0JaWYgKHZhbDMyICYgQklUKDkpKQotCQlwRE1fT2RtLT5iQ2NrSGlnaFBvd2VyID0gdHJ1ZTsKLQllbHNlCi0JCXBETV9PZG0tPmJDY2tIaWdoUG93ZXIgPSBmYWxzZTsKLQotCXBETV9PZG0tPlJGUGF0aFJ4RW5hYmxlID0KLQkJcnRsODcyM2F1X3JlYWQzMihwRE1fT2RtLT5BZGFwdGVyLCByT0ZETTBfVFJ4UGF0aEVuYWJsZSkgJiAweDBGOwotCi0JT0RNX0luaXREZWJ1Z1NldHRpbmcyM2EocERNX09kbSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG9kbV9Db21tb25JbmZvU2VsZlVwZGF0ZShzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhKQotewotCXN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSA9ICZwSGFsRGF0YS0+b2RtcHJpdjsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBFbnRyeTsKLQl1OCBFbnRyeUNudCA9IDA7Ci0JdTggaTsKLQotCWZvciAoaSA9IDA7IGkgPCBPRE1fQVNTT0NJQVRFX0VOVFJZX05VTTsgaSsrKSB7Ci0JCXBFbnRyeSA9IHBETV9PZG0tPnBPRE1fU3RhSW5mb1tpXTsKLQkJaWYgKHBFbnRyeSkKLQkJCUVudHJ5Q250Kys7Ci0JfQotCWlmIChFbnRyeUNudCA9PSAxKQotCQlwRE1fT2RtLT5iT25lRW50cnlPbmx5ID0gdHJ1ZTsKLQllbHNlCi0JCXBETV9PZG0tPmJPbmVFbnRyeU9ubHkgPSBmYWxzZTsKLX0KLQotdm9pZCBvZG1fQ21uSW5mb0luaXRfRGVidWcyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJvZG1fQ21uSW5mb0luaXRfRGVidWcyM2EgPT0+XG4iKSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIlN1cHBvcnRBYmlsaXR5ID0gMHgleFxuIiwgcERNX09kbS0+U3VwcG9ydEFiaWxpdHkpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgiU3VwcG9ydElDVHlwZSA9IDB4JXhcbiIsIHBETV9PZG0tPlN1cHBvcnRJQ1R5cGUpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgiQ3V0VmVyc2lvbiA9JWRcbiIsIHBETV9PZG0tPkN1dFZlcnNpb24pKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgiRmFiVmVyc2lvbiA9JWRcbiIsIHBETV9PZG0tPkZhYlZlcnNpb24pKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgiQm9hcmRUeXBlID0lZFxuIiwgcERNX09kbS0+Qm9hcmRUeXBlKSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIkV4dExOQSA9JWRcbiIsIHBETV9PZG0tPkV4dExOQSkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJFeHRQQSA9JWRcbiIsIHBETV9PZG0tPkV4dFBBKSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIkV4dFRSU1cgPSVkXG4iLCBwRE1fT2RtLT5FeHRUUlNXKSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoImJJbkhjdFRlc3QgPSVkXG4iLCBwRE1fT2RtLT5iSW5IY3RUZXN0KSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoImJXSUZJVGVzdCA9JWRcbiIsIHBETV9PZG0tPmJXSUZJVGVzdCkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJiRHVhbE1hY1NtYXJ0Q29uY3VycmVudCA9JWRcbiIsIHBETV9PZG0tPmJEdWFsTWFjU21hcnRDb25jdXJyZW50KSk7Ci0KLX0KLQotdm9pZCBvZG1fQ21uSW5mb1VwZGF0ZV9EZWJ1ZzIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCi17Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIm9kbV9DbW5JbmZvVXBkYXRlX0RlYnVnMjNhID09PlxuIikpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJiV0lGSV9EaXJlY3QgPSVkXG4iLCBwRE1fT2RtLT5iV0lGSV9EaXJlY3QpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgiYldJRklfRGlzcGxheSA9JWRcbiIsIHBETV9PZG0tPmJXSUZJX0Rpc3BsYXkpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgiYkxpbmtlZCA9JWRcbiIsIHBETV9PZG0tPmJMaW5rZWQpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgiUlNTSV9NaW4gPSVkXG4iLCBwRE1fT2RtLT5SU1NJX01pbikpOwotfQotCi12b2lkIE9ETV9Xcml0ZV9ESUcyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLAl1OCBDdXJyZW50SUdJKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0Jc3RydWN0IGRpZ190ICpwRE1fRGlnVGFibGUgPSAmcERNX09kbS0+RE1fRGlnVGFibGU7Ci0JdTMyIHZhbDMyOwotCi0JaWYgKHBETV9EaWdUYWJsZS0+Q3VySUdWYWx1ZSAhPSBDdXJyZW50SUdJKSB7Ci0JCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX0lHSV9BXzExTik7Ci0JCXZhbDMyICY9IH5PRE1fQklUX0lHSV8xMU47Ci0JCXZhbDMyIHw9IEN1cnJlbnRJR0k7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIE9ETV9SRUdfSUdJX0FfMTFOLCB2YWwzMik7Ci0JCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9ESUcsIE9ETV9EQkdfTE9VRCwKLQkJCSAgICAgKCJDdXJyZW50SUdJKDB4JTAyeCkuIFxuIiwgQ3VycmVudElHSSkpOwotCQlwRE1fRGlnVGFibGUtPkN1cklHVmFsdWUgPSBDdXJyZW50SUdJOwotCX0KLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsCi0JCSAgICAgKCJPRE1fV3JpdGVfRElHMjNhKCk6Q3VycmVudElHSSA9IDB4JXggXG4iLCBDdXJyZW50SUdJKSk7Ci19Ci0KLS8qIE5lZWQgTFBTIG1vZGUgZm9yIENFIHBsYXRmb3JtIC0tMjAxMi0tMDgtLTI0LS0tICovCi0vKiA4NzIzQVMvODE4OUVTICovCi12b2lkIG9kbV9ESUcyM2FieVJTU0lfTFBTKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQlzdHJ1Y3QgZmFsc2VfYWxhcm1fc3RhdHMgKnBGYWxzZUFsbUNudCA9ICZwRE1fT2RtLT5GYWxzZUFsbUNudDsKLQl1OCBSU1NJX0xvd2VyID0gRE1fRElHX01JTl9OSUM7ICAgLyogMHgxRSBvciAweDFDICovCi0JdTggYkZ3Q3VycmVudEluUFNNb2RlID0gZmFsc2U7Ci0JdTggQ3VycmVudElHSSA9IHBETV9PZG0tPlJTU0lfTWluOwotCi0JaWYgKCEocERNX09kbS0+U3VwcG9ydElDVHlwZSAmIE9ETV9SVEw4NzIzQSkpCi0JCXJldHVybjsKLQotCUN1cnJlbnRJR0kgPSBDdXJyZW50SUdJK1JTU0lfT0ZGU0VUX0RJRzsKLQliRndDdXJyZW50SW5QU01vZGUgPSBwQWRhcHRlci0+cHdyY3RybHByaXYuYkZ3Q3VycmVudEluUFNNb2RlOwotCi0JLyogIFVzaW5nIEZXIFBTIG1vZGUgdG8gbWFrZSBJR0kgKi8KLQlpZiAoYkZ3Q3VycmVudEluUFNNb2RlKSB7Ci0JCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9ESUcsIE9ETV9EQkdfTE9VRCwKLQkJCSAgICAgKCItLS1OZWlsLS0tb2RtX0RJRzIzYSBpcyBpbiBMUFMgbW9kZVxuIikpOwotCQkvKiBBZGp1c3QgYnkgIEZBIGluIExQUyBNT0RFICovCi0JCWlmIChwRmFsc2VBbG1DbnQtPkNudF9hbGwgPiBETV9ESUdfRkFfVEgyX0xQUykKLQkJCUN1cnJlbnRJR0kgPSBDdXJyZW50SUdJKzI7Ci0JCWVsc2UgaWYgKHBGYWxzZUFsbUNudC0+Q250X2FsbCA+IERNX0RJR19GQV9USDFfTFBTKQotCQkJQ3VycmVudElHSSA9IEN1cnJlbnRJR0krMTsKLQkJZWxzZSBpZiAocEZhbHNlQWxtQ250LT5DbnRfYWxsIDwgRE1fRElHX0ZBX1RIMF9MUFMpCi0JCQlDdXJyZW50SUdJID0gQ3VycmVudElHSS0xOwotCX0gZWxzZSB7Ci0JCUN1cnJlbnRJR0kgPSBSU1NJX0xvd2VyOwotCX0KLQotCS8qIExvd2VyIGJvdW5kIGNoZWNraW5nICovCi0KLQkvKiBSU1NJIExvd2VyIGJvdW5kIGNoZWNrICovCi0JaWYgKChwRE1fT2RtLT5SU1NJX01pbi0xMCkgPiBETV9ESUdfTUlOX05JQykKLQkJUlNTSV9Mb3dlciA9IChwRE1fT2RtLT5SU1NJX01pbi0xMCk7Ci0JZWxzZQotCQlSU1NJX0xvd2VyID0gRE1fRElHX01JTl9OSUM7Ci0KLQkvKiBVcHBlciBhbmQgTG93ZXIgQm91bmQgY2hlY2tpbmcgKi8KLQkgaWYgKEN1cnJlbnRJR0kgPiBETV9ESUdfTUFYX05JQykKLQkJQ3VycmVudElHSSA9IERNX0RJR19NQVhfTklDOwotCSBlbHNlIGlmIChDdXJyZW50SUdJIDwgUlNTSV9Mb3dlcikKLQkJQ3VycmVudElHSSA9IFJTU0lfTG93ZXI7Ci0KLQlPRE1fV3JpdGVfRElHMjNhKHBETV9PZG0sIEN1cnJlbnRJR0kpOwotfQotCi12b2lkIG9kbV9ESUcyM2FJbml0KHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKLQlzdHJ1Y3QgZGlnX3QgKnBETV9EaWdUYWJsZSA9ICZwRE1fT2RtLT5ETV9EaWdUYWJsZTsKLQl1MzIgdmFsMzI7Ci0KLQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIocERNX09kbS0+QWRhcHRlciwgT0RNX1JFR19JR0lfQV8xMU4pOwotCXBETV9EaWdUYWJsZS0+Q3VySUdWYWx1ZSA9IHZhbDMyICYgT0RNX0JJVF9JR0lfMTFOOwotCi0JcERNX0RpZ1RhYmxlLT5Sc3NpTG93VGhyZXNoCT0gRE1fRElHX1RIUkVTSF9MT1c7Ci0JcERNX0RpZ1RhYmxlLT5Sc3NpSGlnaFRocmVzaAk9IERNX0RJR19USFJFU0hfSElHSDsKLQlwRE1fRGlnVGFibGUtPkZBTG93VGhyZXNoCT0gRE1fRkFMU0VBTEFSTV9USFJFU0hfTE9XOwotCXBETV9EaWdUYWJsZS0+RkFIaWdoVGhyZXNoCT0gRE1fRkFMU0VBTEFSTV9USFJFU0hfSElHSDsKLQlpZiAocERNX09kbS0+Qm9hcmRUeXBlID09IE9ETV9CT0FSRF9ISUdIUFdSKSB7Ci0JCXBETV9EaWdUYWJsZS0+cnhfZ2Fpbl9yYW5nZV9tYXggPSBETV9ESUdfTUFYX05JQzsKLQkJcERNX0RpZ1RhYmxlLT5yeF9nYWluX3JhbmdlX21pbiA9IERNX0RJR19NSU5fTklDOwotCX0gZWxzZSB7Ci0JCXBETV9EaWdUYWJsZS0+cnhfZ2Fpbl9yYW5nZV9tYXggPSBETV9ESUdfTUFYX05JQzsKLQkJcERNX0RpZ1RhYmxlLT5yeF9nYWluX3JhbmdlX21pbiA9IERNX0RJR19NSU5fTklDOwotCX0KLQlwRE1fRGlnVGFibGUtPkJhY2tvZmZWYWwgPSBETV9ESUdfQkFDS09GRl9ERUZBVUxUOwotCXBETV9EaWdUYWJsZS0+QmFja29mZlZhbF9yYW5nZV9tYXggPSBETV9ESUdfQkFDS09GRl9NQVg7Ci0JcERNX0RpZ1RhYmxlLT5CYWNrb2ZmVmFsX3JhbmdlX21pbiA9IERNX0RJR19CQUNLT0ZGX01JTjsKLQlwRE1fRGlnVGFibGUtPlByZUNDS19DQ0FUaHJlcyA9IDB4RkY7Ci0JcERNX0RpZ1RhYmxlLT5DdXJDQ0tfQ0NBVGhyZXMgPSAweDgzOwotCXBETV9EaWdUYWJsZS0+Rm9yYmlkZGVuSUdJID0gRE1fRElHX01JTl9OSUM7Ci0JcERNX0RpZ1RhYmxlLT5MYXJnZUZBSGl0ID0gMDsKLQlwRE1fRGlnVGFibGUtPlJlY292ZXJfY250ID0gMDsKLQlwRE1fRGlnVGFibGUtPkRJR19EeW5hbWljX01JTl8wID0gRE1fRElHX01JTl9OSUM7Ci0JcERNX0RpZ1RhYmxlLT5ESUdfRHluYW1pY19NSU5fMSA9IERNX0RJR19NSU5fTklDOwotCXBETV9EaWdUYWJsZS0+Yk1lZGlhQ29ubmVjdF8wID0gZmFsc2U7Ci0JcERNX0RpZ1RhYmxlLT5iTWVkaWFDb25uZWN0XzEgPSBmYWxzZTsKLX0KLQotdm9pZCBvZG1fRElHMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0ZXIpOwotCXN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSA9ICZwSGFsRGF0YS0+b2RtcHJpdjsKLQlzdHJ1Y3QgZGlnX3QgKnBETV9EaWdUYWJsZSA9ICZwRE1fT2RtLT5ETV9EaWdUYWJsZTsKLQlzdHJ1Y3QgZmFsc2VfYWxhcm1fc3RhdHMgKnBGYWxzZUFsbUNudCA9ICZwRE1fT2RtLT5GYWxzZUFsbUNudDsKLQl1OCBESUdfRHluYW1pY19NSU47Ci0JdTggRElHX01heE9mTWluOwotCWJvb2wgRmlyc3RDb25uZWN0LCBGaXJzdERpc0Nvbm5lY3Q7Ci0JdTggZG1fZGlnX21heCwgZG1fZGlnX21pbjsKLQl1OCBDdXJyZW50SUdJID0gcERNX0RpZ1RhYmxlLT5DdXJJR1ZhbHVlOwotCi0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELAotCQkgICAgICgib2RtX0RJRzIzYSgpID09PlxuIikpOwotCWlmIChhZGFwdGVyLT5tbG1lcHJpdi5iU2NhbkluUHJvY2VzcykgewotCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsCi0JCQkgICAgICgib2RtX0RJRzIzYSgpIFJldHVybjogSW4gU2NhbiBQcm9ncmVzcyBcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCURJR19EeW5hbWljX01JTiA9IHBETV9EaWdUYWJsZS0+RElHX0R5bmFtaWNfTUlOXzA7Ci0JRmlyc3RDb25uZWN0ID0gKHBETV9PZG0tPmJMaW5rZWQpICYmICghcERNX0RpZ1RhYmxlLT5iTWVkaWFDb25uZWN0XzApOwotCUZpcnN0RGlzQ29ubmVjdCA9ICghcERNX09kbS0+YkxpbmtlZCkgJiYKLQkJKHBETV9EaWdUYWJsZS0+Yk1lZGlhQ29ubmVjdF8wKTsKLQotCS8qIDEgQm91bmRhcnkgRGVjaXNpb24gKi8KLQlpZiAoKHBETV9PZG0tPlN1cHBvcnRJQ1R5cGUgJiBPRE1fUlRMODcyM0EpICYmCi0JICAgIChwRE1fT2RtLT5Cb2FyZFR5cGUgPT0gT0RNX0JPQVJEX0hJR0hQV1IgfHwgcERNX09kbS0+RXh0TE5BKSkgewotCQlkbV9kaWdfbWF4ID0gRE1fRElHX01BWF9OSUNfSFA7Ci0JCWRtX2RpZ19taW4gPSBETV9ESUdfTUlOX05JQ19IUDsKLQkJRElHX01heE9mTWluID0gRE1fRElHX01BWF9BUF9IUDsKLQl9IGVsc2UgewotCQlkbV9kaWdfbWF4ID0gRE1fRElHX01BWF9OSUM7Ci0JCWRtX2RpZ19taW4gPSBETV9ESUdfTUlOX05JQzsKLQkJRElHX01heE9mTWluID0gRE1fRElHX01BWF9BUDsKLQl9Ci0KLQlpZiAocERNX09kbS0+YkxpbmtlZCkgewotCSAgICAgIC8qIDIgODcyM0EgU2VyaWVzLCBvZmZzZXQgbmVlZCB0byBiZSAxMCAqLwotCQlpZiAocERNX09kbS0+U3VwcG9ydElDVHlwZSA9PSBPRE1fUlRMODcyM0EpIHsKLQkJCS8qIDIgVXBwZXIgQm91bmQgKi8KLQkJCWlmICgocERNX09kbS0+UlNTSV9NaW4gKyAxMCkgPiBETV9ESUdfTUFYX05JQykKLQkJCQlwRE1fRGlnVGFibGUtPnJ4X2dhaW5fcmFuZ2VfbWF4ID0gRE1fRElHX01BWF9OSUM7Ci0JCQllbHNlIGlmICgocERNX09kbS0+UlNTSV9NaW4gKyAxMCkgPCBETV9ESUdfTUlOX05JQykKLQkJCQlwRE1fRGlnVGFibGUtPnJ4X2dhaW5fcmFuZ2VfbWF4ID0gRE1fRElHX01JTl9OSUM7Ci0JCQllbHNlCi0JCQkJcERNX0RpZ1RhYmxlLT5yeF9nYWluX3JhbmdlX21heCA9IHBETV9PZG0tPlJTU0lfTWluICsgMTA7Ci0KLQkJCS8qIDIgSWYgQlQgaXMgQ29uY3VycmVudCwgbmVlZCB0byBzZXQgTG93ZXIgQm91bmQgKi8KLQkJCURJR19EeW5hbWljX01JTiA9IERNX0RJR19NSU5fTklDOwotCQl9IGVsc2UgewotCQkJLyogMiBNb2RpZnkgRElHIHVwcGVyIGJvdW5kICovCi0JCQlpZiAoKHBETV9PZG0tPlJTU0lfTWluICsgMjApID4gZG1fZGlnX21heCkKLQkJCQlwRE1fRGlnVGFibGUtPnJ4X2dhaW5fcmFuZ2VfbWF4ID0gZG1fZGlnX21heDsKLQkJCWVsc2UgaWYgKChwRE1fT2RtLT5SU1NJX01pbiArIDIwKSA8IGRtX2RpZ19taW4pCi0JCQkJcERNX0RpZ1RhYmxlLT5yeF9nYWluX3JhbmdlX21heCA9IGRtX2RpZ19taW47Ci0JCQllbHNlCi0JCQkJcERNX0RpZ1RhYmxlLT5yeF9nYWluX3JhbmdlX21heCA9IHBETV9PZG0tPlJTU0lfTWluICsgMjA7Ci0KLQkJCS8qIDIgTW9kaWZ5IERJRyBsb3dlciBib3VuZCAqLwotCQkJaWYgKHBETV9PZG0tPmJPbmVFbnRyeU9ubHkpIHsKLQkJCQlpZiAocERNX09kbS0+UlNTSV9NaW4gPCBkbV9kaWdfbWluKQotCQkJCQlESUdfRHluYW1pY19NSU4gPSBkbV9kaWdfbWluOwotCQkJCWVsc2UgaWYgKHBETV9PZG0tPlJTU0lfTWluID4gRElHX01heE9mTWluKQotCQkJCQlESUdfRHluYW1pY19NSU4gPSBESUdfTWF4T2ZNaW47Ci0JCQkJZWxzZQotCQkJCQlESUdfRHluYW1pY19NSU4gPSBwRE1fT2RtLT5SU1NJX01pbjsKLQkJCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsCi0JCQkJCSAgICAgKCJvZG1fRElHMjNhKCkgOiBiT25lRW50cnlPbmx5ID0gdHJ1ZSwgIERJR19EeW5hbWljX01JTiA9IDB4JXhcbiIsCi0JCQkJCSAgICAgRElHX0R5bmFtaWNfTUlOKSk7Ci0JCQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELAotCQkJCQkgICAgICgib2RtX0RJRzIzYSgpIDogcERNX09kbS0+UlNTSV9NaW4gPSVkXG4iLAotCQkJCQkgICAgIHBETV9PZG0tPlJTU0lfTWluKSk7Ci0JCQl9IGVsc2UgewotCQkJCURJR19EeW5hbWljX01JTiA9IGRtX2RpZ19taW47Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlwRE1fRGlnVGFibGUtPnJ4X2dhaW5fcmFuZ2VfbWF4ID0gZG1fZGlnX21heDsKLQkJRElHX0R5bmFtaWNfTUlOID0gZG1fZGlnX21pbjsKLQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELCAoIm9kbV9ESUcyM2EoKSA6IE5vIExpbmtcbiIpKTsKLQl9Ci0KLQkvKiAxIE1vZGlmeSBESUcgbG93ZXIgYm91bmQsIGRlYWwgd2l0aCBhYm5vcm1hbGx5IGxhcmdlIGZhbHNlIGFsYXJtICovCi0JaWYgKHBGYWxzZUFsbUNudC0+Q250X2FsbCA+IDEwMDAwKSB7Ci0JCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9ESUcsIE9ETV9EQkdfTE9VRCwKLQkJCSAgICAgKCJkbV9ESUcoKTogQWJub3JuYWxseSBmYWxzZSBhbGFybSBjYXNlLiBcbiIpKTsKLQotCQlpZiAocERNX0RpZ1RhYmxlLT5MYXJnZUZBSGl0ICE9IDMpCi0JCQlwRE1fRGlnVGFibGUtPkxhcmdlRkFIaXQrKzsKLQkJaWYgKHBETV9EaWdUYWJsZS0+Rm9yYmlkZGVuSUdJIDwgQ3VycmVudElHSSkgewotCQkJcERNX0RpZ1RhYmxlLT5Gb3JiaWRkZW5JR0kgPSBDdXJyZW50SUdJOwotCQkJcERNX0RpZ1RhYmxlLT5MYXJnZUZBSGl0ID0gMTsKLQkJfQotCi0JCWlmIChwRE1fRGlnVGFibGUtPkxhcmdlRkFIaXQgPj0gMykgewotCQkJaWYgKChwRE1fRGlnVGFibGUtPkZvcmJpZGRlbklHSSsxKSA+IHBETV9EaWdUYWJsZS0+cnhfZ2Fpbl9yYW5nZV9tYXgpCi0JCQkJcERNX0RpZ1RhYmxlLT5yeF9nYWluX3JhbmdlX21pbiA9IHBETV9EaWdUYWJsZS0+cnhfZ2Fpbl9yYW5nZV9tYXg7Ci0JCQllbHNlCi0JCQkJcERNX0RpZ1RhYmxlLT5yeF9nYWluX3JhbmdlX21pbiA9IChwRE1fRGlnVGFibGUtPkZvcmJpZGRlbklHSSArIDEpOwotCQkJcERNX0RpZ1RhYmxlLT5SZWNvdmVyX2NudCA9IDM2MDA7IC8qIDM2MDAgPSAyaHIgKi8KLQkJfQotCX0gZWxzZSB7Ci0JCS8qIFJlY292ZXJ5IG1lY2hhbmlzbSBmb3IgSUdJIGxvd2VyIGJvdW5kICovCi0JCWlmIChwRE1fRGlnVGFibGUtPlJlY292ZXJfY250ICE9IDApIHsKLQkJCXBETV9EaWdUYWJsZS0+UmVjb3Zlcl9jbnQtLTsKLQkJfSBlbHNlIHsKLQkJCWlmIChwRE1fRGlnVGFibGUtPkxhcmdlRkFIaXQgPCAzKSB7Ci0JCQkJaWYgKChwRE1fRGlnVGFibGUtPkZvcmJpZGRlbklHSSAtIDEpIDwgRElHX0R5bmFtaWNfTUlOKSB7Ci0JCQkJCXBETV9EaWdUYWJsZS0+Rm9yYmlkZGVuSUdJID0gRElHX0R5bmFtaWNfTUlOOyAvKiBETV9ESUdfTUlOOyAqLwotCQkJCQlwRE1fRGlnVGFibGUtPnJ4X2dhaW5fcmFuZ2VfbWluID0gRElHX0R5bmFtaWNfTUlOOyAvKiBETV9ESUdfTUlOOyAqLwotCQkJCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsCi0JCQkJCQkgICAgICgib2RtX0RJRzIzYSgpOiBOb3JtYWwgQ2FzZTogQXQgTG93ZXIgQm91bmRcbiIpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlwRE1fRGlnVGFibGUtPkZvcmJpZGRlbklHSS0tOwotCQkJCQlwRE1fRGlnVGFibGUtPnJ4X2dhaW5fcmFuZ2VfbWluID0gKHBETV9EaWdUYWJsZS0+Rm9yYmlkZGVuSUdJICsgMSk7Ci0JCQkJCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9ESUcsIE9ETV9EQkdfTE9VRCwKLQkJCQkJCSAgICAgKCJvZG1fRElHMjNhKCk6IE5vcm1hbCBDYXNlOiBBcHByb2FjaCBMb3dlciBCb3VuZFxuIikpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcERNX0RpZ1RhYmxlLT5MYXJnZUZBSGl0ID0gMDsKLQkJCX0KLQkJfQotCX0KLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsICgib2RtX0RJRzIzYSgpOiBwRE1fRGlnVGFibGUtPkxhcmdlRkFIaXQgPSVkXG4iLCBwRE1fRGlnVGFibGUtPkxhcmdlRkFIaXQpKTsKLQotCS8qIDEgQWRqdXN0IGluaXRpYWwgZ2FpbiBieSBmYWxzZSBhbGFybSAqLwotCWlmIChwRE1fT2RtLT5iTGlua2VkKSB7Ci0JCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9ESUcsIE9ETV9EQkdfTE9VRCwgKCJvZG1fRElHMjNhKCk6IERJRyBBZnRlckxpbmtcbiIpKTsKLQkJaWYgKEZpcnN0Q29ubmVjdCkgewotCQkJQ3VycmVudElHSSA9IHBETV9PZG0tPlJTU0lfTWluOwotCQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELCAoIkRJRzogRmlyc3QgQ29ubmVjdFxuIikpOwotCQl9IGVsc2UgewotCQkJaWYgKHBGYWxzZUFsbUNudC0+Q250X2FsbCA+IERNX0RJR19GQV9USDIpCi0JCQkJQ3VycmVudElHSSA9IEN1cnJlbnRJR0kgKyA0Oy8qIHBETV9EaWdUYWJsZS0+Q3VySUdWYWx1ZSA9IHBETV9EaWdUYWJsZS0+UHJlSUdWYWx1ZSsyOyAqLwotCQkJZWxzZSBpZiAocEZhbHNlQWxtQ250LT5DbnRfYWxsID4gRE1fRElHX0ZBX1RIMSkKLQkJCQlDdXJyZW50SUdJID0gQ3VycmVudElHSSArIDI7LyogcERNX0RpZ1RhYmxlLT5DdXJJR1ZhbHVlID0gcERNX0RpZ1RhYmxlLT5QcmVJR1ZhbHVlKzE7ICovCi0JCQllbHNlIGlmIChwRmFsc2VBbG1DbnQtPkNudF9hbGwgPCBETV9ESUdfRkFfVEgwKQotCQkJCUN1cnJlbnRJR0kgPSBDdXJyZW50SUdJIC0gMjsvKiBwRE1fRGlnVGFibGUtPkN1cklHVmFsdWUgPSBwRE1fRGlnVGFibGUtPlByZUlHVmFsdWUtMTsgKi8KLQkJfQotCX0gZWxzZSB7Ci0JCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9ESUcsIE9ETV9EQkdfTE9VRCwgKCJvZG1fRElHMjNhKCk6IERJRyBCZWZvcmVMaW5rXG4iKSk7Ci0JCWlmIChGaXJzdERpc0Nvbm5lY3QpIHsKLQkJCUN1cnJlbnRJR0kgPSBwRE1fRGlnVGFibGUtPnJ4X2dhaW5fcmFuZ2VfbWluOwotCQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELCAoIm9kbV9ESUcyM2EoKTogRmlyc3QgRGlzQ29ubmVjdCBcbiIpKTsKLQkJfSBlbHNlIHsKLQkJCS8qIDIwMTIuMDMuMzAgTHVrZUxlZTogZW5hYmxlIERJRyBiZWZvcmUgbGluayBidXQgd2l0aCB2ZXJ5IGhpZ2ggdGhyZXNob2xkcyAqLwotCQkJaWYgKHBGYWxzZUFsbUNudC0+Q250X2FsbCA+IDEwMDAwKQotCQkJCUN1cnJlbnRJR0kgPSBDdXJyZW50SUdJICsgMjsvKiBwRE1fRGlnVGFibGUtPkN1cklHVmFsdWUgPSBwRE1fRGlnVGFibGUtPlByZUlHVmFsdWUrMjsgKi8KLQkJCWVsc2UgaWYgKHBGYWxzZUFsbUNudC0+Q250X2FsbCA+IDgwMDApCi0JCQkJQ3VycmVudElHSSA9IEN1cnJlbnRJR0kgKyAxOy8qIHBETV9EaWdUYWJsZS0+Q3VySUdWYWx1ZSA9IHBETV9EaWdUYWJsZS0+UHJlSUdWYWx1ZSsxOyAqLwotCQkJZWxzZSBpZiAocEZhbHNlQWxtQ250LT5DbnRfYWxsIDwgNTAwKQotCQkJCUN1cnJlbnRJR0kgPSBDdXJyZW50SUdJIC0gMTsvKiBwRE1fRGlnVGFibGUtPkN1cklHVmFsdWUgPSBwRE1fRGlnVGFibGUtPlByZUlHVmFsdWUtMTsgKi8KLQkJCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9ESUcsIE9ETV9EQkdfTE9VRCwgKCJvZG1fRElHMjNhKCk6IEVuZ2xhbmQgRElHIFxuIikpOwotCQl9Ci0JfQotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9ESUcsIE9ETV9EQkdfTE9VRCwgKCJvZG1fRElHMjNhKCk6IERJRyBFbmQgQWRqdXN0IElHSVxuIikpOwotCS8qIDEgQ2hlY2sgaW5pdGlhbCBnYWluIGJ5IHVwcGVyL2xvd2VyIGJvdW5kICovCi0JaWYgKEN1cnJlbnRJR0kgPiBwRE1fRGlnVGFibGUtPnJ4X2dhaW5fcmFuZ2VfbWF4KQotCQlDdXJyZW50SUdJID0gcERNX0RpZ1RhYmxlLT5yeF9nYWluX3JhbmdlX21heDsKLQlpZiAoQ3VycmVudElHSSA8IHBETV9EaWdUYWJsZS0+cnhfZ2Fpbl9yYW5nZV9taW4pCi0JCUN1cnJlbnRJR0kgPSBwRE1fRGlnVGFibGUtPnJ4X2dhaW5fcmFuZ2VfbWluOwotCi0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELCAoIm9kbV9ESUcyM2EoKTogcnhfZ2Fpbl9yYW5nZV9tYXggPSAweCV4LCByeF9nYWluX3JhbmdlX21pbiA9IDB4JXhcbiIsCi0JCXBETV9EaWdUYWJsZS0+cnhfZ2Fpbl9yYW5nZV9tYXgsIHBETV9EaWdUYWJsZS0+cnhfZ2Fpbl9yYW5nZV9taW4pKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsICgib2RtX0RJRzIzYSgpOiBUb3RhbEZBID0lZFxuIiwgcEZhbHNlQWxtQ250LT5DbnRfYWxsKSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELCAoIm9kbV9ESUcyM2EoKTogQ3VySUdWYWx1ZSA9IDB4JXhcbiIsIEN1cnJlbnRJR0kpKTsKLQotCS8qIDIgSGlnaCBwb3dlciBSU1NJIHRocmVzaG9sZCAqLwotCi0JT0RNX1dyaXRlX0RJRzIzYShwRE1fT2RtLCBDdXJyZW50SUdJKTsvKiBPRE1fV3JpdGVfRElHMjNhKHBETV9PZG0sIHBETV9EaWdUYWJsZS0+Q3VySUdWYWx1ZSk7ICovCi0JcERNX0RpZ1RhYmxlLT5iTWVkaWFDb25uZWN0XzAgPSBwRE1fT2RtLT5iTGlua2VkOwotCXBETV9EaWdUYWJsZS0+RElHX0R5bmFtaWNfTUlOXzAgPSBESUdfRHluYW1pY19NSU47Ci19Ci0KLS8qIDMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAzIEZBU0xFIEFMQVJNIENIRUNLICovCi0vKiAzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi12b2lkIG9kbV9GYWxzZUFsYXJtQ291bnRlclN0YXRpc3RpY3MyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0Jc3RydWN0IGZhbHNlX2FsYXJtX3N0YXRzICpGYWxzZUFsbUNudCA9ICZwRE1fT2RtLT5GYWxzZUFsbUNudDsKLQl1MzIgcmV0X3ZhbHVlLCB2YWwzMjsKLQotCS8qIGhvbGQgb2ZkbSBjb3VudGVyICovCi0JLyogaG9sZCBwYWdlIEMgY291bnRlciAqLwotCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfSE9MRENfMTFOKTsKLQl2YWwzMiB8PSBCSVQoMzEpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9IT0xEQ18xMU4sIHZhbDMyKTsKLQkvKiBob2xkIHBhZ2UgRCBjb3VudGVyICovCi0JdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9SU1REXzExTik7Ci0JdmFsMzIgfD0gQklUKDMxKTsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfUlNURF8xMU4sIHZhbDMyKTsKLQlyZXRfdmFsdWUgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9UWVBFMV8xMU4pOwotCUZhbHNlQWxtQ250LT5DbnRfRmFzdF9Gc3luYyA9IChyZXRfdmFsdWUmMHhmZmZmKTsKLQlGYWxzZUFsbUNudC0+Q250X1NCX1NlYXJjaF9mYWlsID0gKHJldF92YWx1ZSAmIDB4ZmZmZjAwMDApPj4xNjsKLQlyZXRfdmFsdWUgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9UWVBFMl8xMU4pOwotCUZhbHNlQWxtQ250LT5DbnRfT0ZETV9DQ0EgPSAocmV0X3ZhbHVlJjB4ZmZmZik7Ci0JRmFsc2VBbG1DbnQtPkNudF9QYXJpdHlfRmFpbCA9IChyZXRfdmFsdWUgJiAweGZmZmYwMDAwKT4+MTY7Ci0JcmV0X3ZhbHVlID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfVFlQRTNfMTFOKTsKLQlGYWxzZUFsbUNudC0+Q250X1JhdGVfSWxsZWdhbCA9IChyZXRfdmFsdWUmMHhmZmZmKTsKLQlGYWxzZUFsbUNudC0+Q250X0NyYzhfZmFpbCA9IChyZXRfdmFsdWUgJiAweGZmZmYwMDAwKT4+MTY7Ci0JcmV0X3ZhbHVlID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfVFlQRTRfMTFOKTsKLQlGYWxzZUFsbUNudC0+Q250X01jc19mYWlsID0gKHJldF92YWx1ZSYweGZmZmYpOwotCi0JRmFsc2VBbG1DbnQtPkNudF9PZmRtX2ZhaWwgPSBGYWxzZUFsbUNudC0+Q250X1Bhcml0eV9GYWlsICsKLQkJRmFsc2VBbG1DbnQtPkNudF9SYXRlX0lsbGVnYWwgKwotCQlGYWxzZUFsbUNudC0+Q250X0NyYzhfZmFpbCArCi0JCUZhbHNlQWxtQ250LT5DbnRfTWNzX2ZhaWwgKwotCQlGYWxzZUFsbUNudC0+Q250X0Zhc3RfRnN5bmMgKwotCQlGYWxzZUFsbUNudC0+Q250X1NCX1NlYXJjaF9mYWlsOwotCS8qIGhvbGQgY2NrIGNvdW50ZXIgKi8KLQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19DQ0tfRkFfUlNUXzExTik7Ci0JdmFsMzIgfD0gKEJJVCgxMikgfCBCSVQoMTQpKTsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCBPRE1fUkVHX0NDS19GQV9SU1RfMTFOLCB2YWwzMik7Ci0KLQlyZXRfdmFsdWUgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfQ0NLX0ZBX0xTQl8xMU4pICYgMHhmZjsKLQlGYWxzZUFsbUNudC0+Q250X0Nja19mYWlsID0gcmV0X3ZhbHVlOwotCXJldF92YWx1ZSA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19DQ0tfRkFfTVNCXzExTikgPj4gMTY7Ci0JRmFsc2VBbG1DbnQtPkNudF9DY2tfZmFpbCArPSAocmV0X3ZhbHVlICYgMHhmZjAwKTsKLQotCXJldF92YWx1ZSA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19DQ0tfQ0NBX0NOVF8xMU4pOwotCUZhbHNlQWxtQ250LT5DbnRfQ0NLX0NDQSA9Ci0JCSgocmV0X3ZhbHVlJjB4RkYpPDw4KSB8ICgocmV0X3ZhbHVlJjB4RkYwMCk+PjgpOwotCi0JRmFsc2VBbG1DbnQtPkNudF9hbGwgPSAoRmFsc2VBbG1DbnQtPkNudF9GYXN0X0ZzeW5jICsKLQkJCQlGYWxzZUFsbUNudC0+Q250X1NCX1NlYXJjaF9mYWlsICsKLQkJCQlGYWxzZUFsbUNudC0+Q250X1Bhcml0eV9GYWlsICsKLQkJCQlGYWxzZUFsbUNudC0+Q250X1JhdGVfSWxsZWdhbCArCi0JCQkJRmFsc2VBbG1DbnQtPkNudF9DcmM4X2ZhaWwgKwotCQkJCUZhbHNlQWxtQ250LT5DbnRfTWNzX2ZhaWwgKwotCQkJCUZhbHNlQWxtQ250LT5DbnRfQ2NrX2ZhaWwpOwotCi0JRmFsc2VBbG1DbnQtPkNudF9DQ0FfYWxsID0KLQkJRmFsc2VBbG1DbnQtPkNudF9PRkRNX0NDQSArIEZhbHNlQWxtQ250LT5DbnRfQ0NLX0NDQTsKLQotCWlmIChwRE1fT2RtLT5TdXBwb3J0SUNUeXBlID49IE9ETV9SVEw4NzIzQSkgewotCQkvKiByZXNldCBmYWxzZSBhbGFybSBjb3VudGVyIHJlZ2lzdGVycyAqLwotCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1JTVENfMTFOKTsKLQkJdmFsMzIgfD0gQklUKDMxKTsKLQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1JTVENfMTFOLCB2YWwzMik7Ci0JCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfUlNUQ18xMU4pOwotCQl2YWwzMiAmPSB+QklUKDMxKTsKLQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1JTVENfMTFOLCB2YWwzMik7Ci0KLQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9SU1REXzExTik7Ci0JCXZhbDMyIHw9IEJJVCgyNyk7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9SU1REXzExTiwgdmFsMzIpOwotCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1JTVERfMTFOKTsKLQkJdmFsMzIgJj0gfkJJVCgyNyk7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9SU1REXzExTiwgdmFsMzIpOwotCi0JCS8qIHVwZGF0ZSBvZmRtIGNvdW50ZXIgKi8KLQkJIC8qIHVwZGF0ZSBwYWdlIEMgY291bnRlciAqLwotCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX0hPTERDXzExTik7Ci0JCXZhbDMyICY9IH5CSVQoMzEpOwotCQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfSE9MRENfMTFOLCB2YWwzMik7Ci0KLQkJIC8qIHVwZGF0ZSBwYWdlIEQgY291bnRlciAqLwotCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1JTVERfMTFOKTsKLQkJdmFsMzIgJj0gfkJJVCgzMSk7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9SU1REXzExTiwgdmFsMzIpOwotCi0JCS8qIHJlc2V0IENDSyBDQ0EgY291bnRlciAqLwotCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19DQ0tfRkFfUlNUXzExTik7Ci0JCXZhbDMyICY9IH4oQklUKDEyKSB8IEJJVCgxMykgfCBCSVQoMTQpIHwgQklUKDE1KSk7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIE9ETV9SRUdfQ0NLX0ZBX1JTVF8xMU4sIHZhbDMyKTsKLQotCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19DQ0tfRkFfUlNUXzExTik7Ci0JCXZhbDMyIHw9IChCSVQoMTMpIHwgQklUKDE1KSk7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIE9ETV9SRUdfQ0NLX0ZBX1JTVF8xMU4sIHZhbDMyKTsKLQl9Ci0KLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRkFfQ05ULCBPRE1fREJHX0xPVUQsCi0JCSAgICAgKCJFbnRlciBvZG1fRmFsc2VBbGFybUNvdW50ZXJTdGF0aXN0aWNzMjNhXG4iKSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0ZBX0NOVCwgT0RNX0RCR19MT1VELAotCQkgICAgICgiQ250X0Zhc3RfRnN5bmMgPSVkLCBDbnRfU0JfU2VhcmNoX2ZhaWwgPSVkXG4iLAotCQkgICAgICBGYWxzZUFsbUNudC0+Q250X0Zhc3RfRnN5bmMsCi0JCSAgICAgIEZhbHNlQWxtQ250LT5DbnRfU0JfU2VhcmNoX2ZhaWwpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRkFfQ05ULCBPRE1fREJHX0xPVUQsCi0JCSAgICAgKCJDbnRfUGFyaXR5X0ZhaWwgPSVkLCBDbnRfUmF0ZV9JbGxlZ2FsID0lZFxuIiwKLQkJICAgICAgRmFsc2VBbG1DbnQtPkNudF9QYXJpdHlfRmFpbCwKLQkJICAgICAgRmFsc2VBbG1DbnQtPkNudF9SYXRlX0lsbGVnYWwpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRkFfQ05ULCBPRE1fREJHX0xPVUQsCi0JCSAgICAgKCJDbnRfQ3JjOF9mYWlsID0lZCwgQ250X01jc19mYWlsID0lZFxuIiwKLQkJICAgICAgRmFsc2VBbG1DbnQtPkNudF9DcmM4X2ZhaWwsIEZhbHNlQWxtQ250LT5DbnRfTWNzX2ZhaWwpKTsKLQotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9GQV9DTlQsIE9ETV9EQkdfTE9VRCwKLQkJICAgICAoIkNudF9DY2tfZmFpbCA9JWRcbiIsIEZhbHNlQWxtQ250LT5DbnRfQ2NrX2ZhaWwpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRkFfQ05ULCBPRE1fREJHX0xPVUQsCi0JCSAgICAgKCJDbnRfT2ZkbV9mYWlsID0lZFxuIiwgRmFsc2VBbG1DbnQtPkNudF9PZmRtX2ZhaWwpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRkFfQ05ULCBPRE1fREJHX0xPVUQsCi0JCSAgICAgKCJUb3RhbCBGYWxzZSBBbGFybSA9JWRcbiIsIEZhbHNlQWxtQ250LT5DbnRfYWxsKSk7Ci19Ci0KLS8qIDMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAzIENDSyBQYWNrZXQgRGV0ZWN0IFRocmVzaG9sZCAqLwotLyogMyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotdm9pZCBvZG1fQ0NLUGFja2V0RGV0ZWN0aW9uVGhyZXNoMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKLQlzdHJ1Y3QgZmFsc2VfYWxhcm1fc3RhdHMgKkZhbHNlQWxtQ250ID0gJnBETV9PZG0tPkZhbHNlQWxtQ250OwotCXU4IEN1ckNDS19DQ0FUaHJlczsKLQotCWlmIChwRE1fT2RtLT5FeHRMTkEpCi0JCXJldHVybjsKLQotCWlmIChwRE1fT2RtLT5iTGlua2VkKSB7Ci0JCWlmIChwRE1fT2RtLT5SU1NJX01pbiA+IDI1KSB7Ci0JCQlDdXJDQ0tfQ0NBVGhyZXMgPSAweGNkOwotCQl9IGVsc2UgaWYgKHBETV9PZG0tPlJTU0lfTWluIDw9IDI1ICYmIHBETV9PZG0tPlJTU0lfTWluID4gMTApIHsKLQkJCUN1ckNDS19DQ0FUaHJlcyA9IDB4ODM7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoRmFsc2VBbG1DbnQtPkNudF9DY2tfZmFpbCA+IDEwMDApCi0JCQkJQ3VyQ0NLX0NDQVRocmVzID0gMHg4MzsKLQkJCWVsc2UKLQkJCQlDdXJDQ0tfQ0NBVGhyZXMgPSAweDQwOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKEZhbHNlQWxtQ250LT5DbnRfQ2NrX2ZhaWwgPiAxMDAwKQotCQkJQ3VyQ0NLX0NDQVRocmVzID0gMHg4MzsKLQkJZWxzZQotCQkJQ3VyQ0NLX0NDQVRocmVzID0gMHg0MDsKLQl9Ci0KLQlPRE1fV3JpdGVfQ0NLX0NDQV9UaHJlczIzYShwRE1fT2RtLCBDdXJDQ0tfQ0NBVGhyZXMpOwotfQotCi12b2lkIE9ETV9Xcml0ZV9DQ0tfQ0NBX1RocmVzMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTggQ3VyQ0NLX0NDQVRocmVzKQotewotCXN0cnVjdCBkaWdfdCAqcERNX0RpZ1RhYmxlID0gJnBETV9PZG0tPkRNX0RpZ1RhYmxlOwotCi0JaWYgKHBETV9EaWdUYWJsZS0+Q3VyQ0NLX0NDQVRocmVzICE9IEN1ckNDS19DQ0FUaHJlcykKLQkJcnRsODcyM2F1X3dyaXRlOChwRE1fT2RtLT5BZGFwdGVyLCBPRE1fUkVHKENDS19DQ0EsIHBETV9PZG0pLAotCQkJCSBDdXJDQ0tfQ0NBVGhyZXMpOwotCXBETV9EaWdUYWJsZS0+UHJlQ0NLX0NDQVRocmVzID0gcERNX0RpZ1RhYmxlLT5DdXJDQ0tfQ0NBVGhyZXM7Ci0JcERNX0RpZ1RhYmxlLT5DdXJDQ0tfQ0NBVGhyZXMgPSBDdXJDQ0tfQ0NBVGhyZXM7Ci19Ci0KLS8qIDMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAzIEJCIFBvd2VyIFNhdmUgKi8KLS8qIDMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi12b2lkIG9kbTIzYV9EeW5CQlBTSW5pdChzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCi17Ci0Jc3RydWN0IGR5bmFtaWNfcHdyX3NhdiAqcERNX1BTVGFibGUgPSAmcERNX09kbS0+RE1fUFNUYWJsZTsKLQotCXBETV9QU1RhYmxlLT5QcmVDQ0FTdGF0ZSA9IENDQV9NQVg7Ci0JcERNX1BTVGFibGUtPkN1ckNDQVN0YXRlID0gQ0NBX01BWDsKLQlwRE1fUFNUYWJsZS0+UHJlUkZTdGF0ZSA9IFJGX01BWDsKLQlwRE1fUFNUYWJsZS0+Q3VyUkZTdGF0ZSA9IFJGX01BWDsKLQlwRE1fUFNUYWJsZS0+UnNzaV92YWxfbWluID0gMDsKLQlwRE1fUFNUYWJsZS0+aW5pdGlhbGl6ZSA9IDA7Ci19Ci0KLQotdm9pZCBPRE1fUkZfU2F2aW5nMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTggYkZvcmNlSW5Ob3JtYWwpCi17Ci0Jc3RydWN0IGR5bmFtaWNfcHdyX3NhdiAqcERNX1BTVGFibGUgPSAmcERNX09kbS0+RE1fUFNUYWJsZTsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwotCXUzMiB2YWwzMjsKLQl1OCBSc3NpX1VwX2JvdW5kID0gMzA7Ci0JdTggUnNzaV9Mb3dfYm91bmQgPSAyNTsKLQlpZiAocERNX1BTVGFibGUtPmluaXRpYWxpemUgPT0gMCkgewotCi0JCXBETV9QU1RhYmxlLT5SZWc4NzQgPQotCQkJcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweDg3NCkgJiAweDFDQzAwMDsKLQkJcERNX1BTVGFibGUtPlJlZ0M3MCA9Ci0JCQlydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4YzcwKSAmIEJJVCgzKTsKLQkJcERNX1BTVGFibGUtPlJlZzg1QyA9Ci0JCQlydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODVjKSAmIDB4RkYwMDAwMDA7Ci0JCXBETV9QU1RhYmxlLT5SZWdBNzQgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4YTc0KSAmIDB4RjAwMDsKLQkJcERNX1BTVGFibGUtPmluaXRpYWxpemUgPSAxOwotCX0KLQotCWlmICghYkZvcmNlSW5Ob3JtYWwpIHsKLQkJaWYgKHBETV9PZG0tPlJTU0lfTWluICE9IDB4RkYpIHsKLQkJCWlmIChwRE1fUFNUYWJsZS0+UHJlUkZTdGF0ZSA9PSBSRl9Ob3JtYWwpIHsKLQkJCQlpZiAocERNX09kbS0+UlNTSV9NaW4gPj0gUnNzaV9VcF9ib3VuZCkKLQkJCQkJcERNX1BTVGFibGUtPkN1clJGU3RhdGUgPSBSRl9TYXZlOwotCQkJCWVsc2UKLQkJCQkJcERNX1BTVGFibGUtPkN1clJGU3RhdGUgPSBSRl9Ob3JtYWw7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChwRE1fT2RtLT5SU1NJX01pbiA8PSBSc3NpX0xvd19ib3VuZCkKLQkJCQkJcERNX1BTVGFibGUtPkN1clJGU3RhdGUgPSBSRl9Ob3JtYWw7Ci0JCQkJZWxzZQotCQkJCQlwRE1fUFNUYWJsZS0+Q3VyUkZTdGF0ZSA9IFJGX1NhdmU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlwRE1fUFNUYWJsZS0+Q3VyUkZTdGF0ZSA9IFJGX01BWDsKLQkJfQotCX0gZWxzZSB7Ci0JCXBETV9QU1RhYmxlLT5DdXJSRlN0YXRlID0gUkZfTm9ybWFsOwotCX0KLQotCWlmIChwRE1fUFNUYWJsZS0+UHJlUkZTdGF0ZSAhPSBwRE1fUFNUYWJsZS0+Q3VyUkZTdGF0ZSkgewotCQlpZiAocERNX1BTVGFibGUtPkN1clJGU3RhdGUgPT0gUkZfU2F2ZSkgewotCQkJLyogIDx0eW5saV9ub3RlPiA4NzIzIFJTU0kgcmVwb3J0IHdpbGwgYmUgd3JvbmcuCi0JCQkgKiBTZXQgMHg4NzRbNV09IDEgd2hlbiBlbnRlciBCQiBwb3dlciBzYXZpbmcgbW9kZS4gKi8KLQkJCS8qICBTdWdnZXN0ZWQgYnkgU0QzIFl1LU5hbi4gMjAxMS4wMS4yMC4gKi8KLQkJCS8qIFJlZzg3NFs1XT0gMWInMSAqLwotCQkJaWYgKHBETV9PZG0tPlN1cHBvcnRJQ1R5cGUgPT0gT0RNX1JUTDg3MjNBKSB7Ci0JCQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODc0KTsKLQkJCQl2YWwzMiB8PSBCSVQoNSk7Ci0JCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4NzQsIHZhbDMyKTsKLQkJCX0KLQkJCS8qIFJlZzg3NFsyMDoxOF09IDMnYjAxMCAqLwotCQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODc0KTsKLQkJCXZhbDMyICY9IH4oQklUKDE4KSB8IEJJVCgyMCkpOwotCQkJdmFsMzIgfD0gQklUKDE5KTsKLQkJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIDB4ODc0LCB2YWwzMik7Ci0JCQkvKiBSZWdDNzBbM109IDEnYjAgKi8KLQkJCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweGM3MCk7Ci0JCQl2YWwzMiAmPSB+QklUKDMpOwotCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHhjNzAsIHZhbDMyKTsKLQkJCS8qIFJlZzg1Q1szMToyNF09IDB4NjMgKi8KLQkJCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweDg1Yyk7Ci0JCQl2YWwzMiAmPSAweDAwZmZmZmZmOwotCQkJdmFsMzIgfD0gMHg2MzAwMDAwMDsKLQkJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIDB4ODVjLCB2YWwzMik7Ci0JCQkvKiBSZWc4NzRbMTU6MTRdPSAyJ2IxMCAqLwotCQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODc0KTsKLQkJCXZhbDMyICY9IH5CSVQoMTQpOwotCQkJdmFsMzIgfD0gQklUKDE1KTsKLQkJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIDB4ODc0LCB2YWwzMik7Ci0JCQkvKiBSZWdBNzVbNzo0XT0gMHgzICovCi0JCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHhhNzQpOwotCQkJdmFsMzIgJj0gfihCSVQoMTQpIHwgQklUKDE1KSk7Ci0JCQl2YWwzMiB8PSAoQklUKDEyKSB8IEJJVCgxMykpOwotCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHhhNzQsIHZhbDMyKTsKLQkJCS8qIFJlZzgxOFsyOF09IDEnYjAgKi8KLQkJCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweDgxOCk7Ci0JCQl2YWwzMiAmPSB+QklUKDI4KTsKLQkJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIDB4ODE4LCB2YWwzMik7Ci0JCQkvKiBSZWc4MThbMjhdPSAxJ2IxICovCi0JCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHg4MTgpOwotCQkJdmFsMzIgfD0gQklUKDI4KTsKLQkJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIDB4ODE4LCB2YWwzMik7Ci0JCX0gZWxzZSB7Ci0JCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHg4NzQpOwotCQkJdmFsMzIgfD0gcERNX1BTVGFibGUtPlJlZzg3NDsKLQkJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIDB4ODc0LCB2YWwzMik7Ci0KLQkJCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweGM3MCk7Ci0JCQl2YWwzMiB8PSBwRE1fUFNUYWJsZS0+UmVnQzcwOwotCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHhjNzAsIHZhbDMyKTsKLQotCQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODVjKTsKLQkJCXZhbDMyIHw9IHBETV9QU1RhYmxlLT5SZWc4NUM7Ci0JCQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCAweDg1YywgdmFsMzIpOwotCi0JCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHhhNzQpOwotCQkJdmFsMzIgfD0gcERNX1BTVGFibGUtPlJlZ0E3NDsKLQkJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIDB4YTc0LCB2YWwzMik7Ci0KLQkJCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweDgxOCk7Ci0JCQl2YWwzMiAmPSB+QklUKDI4KTsKLQkJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIDB4ODE4LCB2YWwzMik7Ci0KLQkJCS8qIFJlZzg3NFs1XT0gMWInMCAqLwotCQkJaWYgKHBETV9PZG0tPlN1cHBvcnRJQ1R5cGUgPT0gT0RNX1JUTDg3MjNBKSB7Ci0JCQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODc0KTsKLQkJCQl2YWwzMiAmPSB+QklUKDUpOwotCQkJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIDB4ODc0LCB2YWwzMik7Ci0JCQl9Ci0JCX0KLQkJcERNX1BTVGFibGUtPlByZVJGU3RhdGUgPSBwRE1fUFNUYWJsZS0+Q3VyUkZTdGF0ZTsKLQl9Ci19Ci0KLS8qIDMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAzIFJBVFIgTUFTSyAqLwotLyogMyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qIDMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAzIFJhdGUgQWRhcHRpdmUgKi8KLS8qIDMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLXZvaWQgb2RtX1JhdGVBZGFwdGl2ZU1hc2tJbml0MjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKLQlzdHJ1Y3Qgb2RtX3JhdGVfYWRhcHQgKnBPZG1SQSA9ICZwRE1fT2RtLT5SYXRlQWRhcHRpdmU7Ci0KLQlwT2RtUkEtPlR5cGUgPSBETV9UeXBlX0J5RHJpdmVyOwotCi0JcE9kbVJBLT5SQVRSU3RhdGUgPSBETV9SQVRSX1NUQV9JTklUOwotCXBPZG1SQS0+SGlnaFJTU0lUaHJlc2ggPSA1MDsKLQlwT2RtUkEtPkxvd1JTU0lUaHJlc2ggPSAyMDsKLX0KLQotdTMyIE9ETV9HZXRfUmF0ZV9CaXRtYXAyM2Eoc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSwgdTMyIG1hY2lkLAotCQkJICAgdTMyIHJhX21hc2ssIHU4IHJzc2lfbGV2ZWwpCi17Ci0Jc3RydWN0IGRtX29kbV90ICpwRE1fT2RtID0gJnBIYWxEYXRhLT5vZG1wcml2OwotCXN0cnVjdCBzdGFfaW5mbyAqcEVudHJ5OwotCXUzMiByYXRlX2JpdG1hcCA9IDB4MGZmZmZmZmY7Ci0JdTggV2lyZWxlc3NNb2RlOwotCi0JcEVudHJ5ID0gcERNX09kbS0+cE9ETV9TdGFJbmZvW21hY2lkXTsKLQlpZiAoIXBFbnRyeSkKLQkJcmV0dXJuIHJhX21hc2s7Ci0KLQlXaXJlbGVzc01vZGUgPSBwRW50cnktPndpcmVsZXNzX21vZGU7Ci0KLQlzd2l0Y2ggKFdpcmVsZXNzTW9kZSkgewotCWNhc2UgT0RNX1dNX0I6Ci0JCWlmIChyYV9tYXNrICYgMHgwMDAwMDAwYykJCS8qIDExTSBvciA1LjVNIGVuYWJsZSAqLwotCQkJcmF0ZV9iaXRtYXAgPSAweDAwMDAwMDBkOwotCQllbHNlCi0JCQlyYXRlX2JpdG1hcCA9IDB4MDAwMDAwMGY7Ci0JCWJyZWFrOwotCWNhc2UgKE9ETV9XTV9BfE9ETV9XTV9HKToKLQkJaWYgKHJzc2lfbGV2ZWwgPT0gRE1fUkFUUl9TVEFfSElHSCkKLQkJCXJhdGVfYml0bWFwID0gMHgwMDAwMGYwMDsKLQkJZWxzZQotCQkJcmF0ZV9iaXRtYXAgPSAweDAwMDAwZmYwOwotCQlicmVhazsKLQljYXNlIChPRE1fV01fQnxPRE1fV01fRyk6Ci0JCWlmIChyc3NpX2xldmVsID09IERNX1JBVFJfU1RBX0hJR0gpCi0JCQlyYXRlX2JpdG1hcCA9IDB4MDAwMDBmMDA7Ci0JCWVsc2UgaWYgKHJzc2lfbGV2ZWwgPT0gRE1fUkFUUl9TVEFfTUlERExFKQotCQkJcmF0ZV9iaXRtYXAgPSAweDAwMDAwZmYwOwotCQllbHNlCi0JCQlyYXRlX2JpdG1hcCA9IDB4MDAwMDBmZjU7Ci0JCWJyZWFrOwotCWNhc2UgKE9ETV9XTV9CfE9ETV9XTV9HfE9ETV9XTV9OMjRHKToKLQljYXNlIChPRE1fV01fQXxPRE1fV01fQnxPRE1fV01fR3xPRE1fV01fTjI0Ryk6Ci0JCWlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSBSRl8xVDJSIHx8Ci0JCSAgICBwSGFsRGF0YS0+cmZfdHlwZSA9PSBSRl8xVDFSKSB7Ci0JCQlpZiAocnNzaV9sZXZlbCA9PSBETV9SQVRSX1NUQV9ISUdIKSB7Ci0JCQkJcmF0ZV9iaXRtYXAgPSAweDAwMGYwMDAwOwotCQkJfSBlbHNlIGlmIChyc3NpX2xldmVsID09IERNX1JBVFJfU1RBX01JRERMRSkgewotCQkJCXJhdGVfYml0bWFwID0gMHgwMDBmZjAwMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbEJXID09Ci0JCQkJICAgIEhUX0NIQU5ORUxfV0lEVEhfNDApCi0JCQkJCXJhdGVfYml0bWFwID0gMHgwMDBmZjAxNTsKLQkJCQllbHNlCi0JCQkJCXJhdGVfYml0bWFwID0gMHgwMDBmZjAwNTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChyc3NpX2xldmVsID09IERNX1JBVFJfU1RBX0hJR0gpIHsKLQkJCQlyYXRlX2JpdG1hcCA9IDB4MGY4ZjAwMDA7Ci0JCQl9IGVsc2UgaWYgKHJzc2lfbGV2ZWwgPT0gRE1fUkFUUl9TVEFfTUlERExFKSB7Ci0JCQkJcmF0ZV9iaXRtYXAgPSAweDBmOGZmMDAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAocEhhbERhdGEtPkN1cnJlbnRDaGFubmVsQlcgPT0KLQkJCQkgICAgSFRfQ0hBTk5FTF9XSURUSF80MCkKLQkJCQkJcmF0ZV9iaXRtYXAgPSAweDBmOGZmMDE1OwotCQkJCWVsc2UKLQkJCQkJcmF0ZV9iaXRtYXAgPSAweDBmOGZmMDA1OwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIGNhc2UgV0lSRUxFU1NfMTFfMjROOiAqLwotCQkvKiBjYXNlIFdJUkVMRVNTXzExXzVOOiAqLwotCQlpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gUkZfMVQyUikKLQkJCXJhdGVfYml0bWFwID0gMHgwMDBmZmZmZjsKLQkJZWxzZQotCQkJcmF0ZV9iaXRtYXAgPSAweDBmZmZmZmZmOwotCQlicmVhazsKLQl9Ci0KLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfUkFfTUFTSywgT0RNX0RCR19MT1VELAotCSgiID09PiByc3NpX2xldmVsOjB4JTAyeCwgV2lyZWxlc3NNb2RlOjB4JTAyeCwgcmF0ZV9iaXRtYXA6MHglMDh4IFxuIiwKLQkgcnNzaV9sZXZlbCwgV2lyZWxlc3NNb2RlLCByYXRlX2JpdG1hcCkpOwotCi0JcmV0dXJuIHJhdGVfYml0bWFwOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBGdW5jdGlvbjoJb2RtX1JlZnJlc2hSYXRlQWRhcHRpdmVNYXNrKCkKLSAqCi0gKiBPdmVydmlldzoJVXBkYXRlIHJhdGUgdGFibGUgbWFzayBhY2NvcmRpbmcgdG8gcnNzaQotICoKLSAqIElucHV0OgkJTk9ORQotICoKLSAqIE91dHB1dDoJCU5PTkUKLSAqCi0gKiBSZXR1cm46CQlOT05FCi0gKgotICogUmV2aXNlZCBIaXN0b3J5OgotICpXaGVuCQlXaG8JCVJlbWFyawotICowNS8yNy8yMDA5CWhwZmFuCUNyZWF0ZSBWZXJzaW9uIDAuCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgb2RtX1JlZnJlc2hSYXRlQWRhcHRpdmVNYXNrKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQl1MzIgc21vb3RoZWQ7Ci0JdTggaTsKLQotCWlmIChwQWRhcHRlci0+YkRyaXZlclN0b3BwZWQpIHsKLQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX1JBX01BU0ssIE9ETV9EQkdfVFJBQ0UsCi0JCQkgICAgICgiPC0tLS0gJXM6IGRyaXZlciBpcyBnb2luZyB0byB1bmxvYWRcbiIsCi0JCQkgICAgICBfX2Z1bmNfXykpOwotCQlyZXR1cm47Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IE9ETV9BU1NPQ0lBVEVfRU5UUllfTlVNOyBpKyspIHsKLQkJc3RydWN0IHN0YV9pbmZvICpwc3RhdCA9IHBETV9PZG0tPnBPRE1fU3RhSW5mb1tpXTsKLQkJaWYgKHBzdGF0KSB7Ci0JCQlzbW9vdGhlZCA9IHBzdGF0LT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7Ci0JCQlpZiAoT0RNX1JBU3RhdGVDaGVjazIzYShwRE1fT2RtLCBzbW9vdGhlZCwgZmFsc2UsCi0JCQkJCQkmcHN0YXQtPnJzc2lfbGV2ZWwpKSB7Ci0JCQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX1JBX01BU0ssCi0JCQkJCSAgICAgT0RNX0RCR19MT1VELAotCQkJCQkgICAgICgiUlNTSTolZCwgUlNTSV9MRVZFTDolZFxuIiwKLQkJCQkJICAgICAgc21vb3RoZWQsCi0JCQkJCSAgICAgIHBzdGF0LT5yc3NpX2xldmVsKSk7Ci0JCQkJcnR3X2hhbF91cGRhdGVfcmFfbWFzazIzYShwc3RhdCwKLQkJCQkJCQkgIHBzdGF0LT5yc3NpX2xldmVsKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotLyogIFJldHVybiBWYWx1ZTogYm9vbCAqLwotLyogIC0gdHJ1ZTogUkFUUlN0YXRlIGlzIGNoYW5nZWQuICovCi1ib29sIE9ETV9SQVN0YXRlQ2hlY2syM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCBzMzIgUlNTSSwgYm9vbCBiRm9yY2VVcGRhdGUsCi0JCQkgdTggKnBSQVRSU3RhdGUpCi17Ci0Jc3RydWN0IG9kbV9yYXRlX2FkYXB0ICpwUkEgPSAmcERNX09kbS0+UmF0ZUFkYXB0aXZlOwotCWNvbnN0IHU4IEdvVXBHYXAgPSA1OwotCXU4IEhpZ2hSU1NJVGhyZXNoRm9yUkEgPSBwUkEtPkhpZ2hSU1NJVGhyZXNoOwotCXU4IExvd1JTU0lUaHJlc2hGb3JSQSA9IHBSQS0+TG93UlNTSVRocmVzaDsKLQl1OCBSQVRSU3RhdGU7Ci0KLQkvKiAgVGhyZXNob2xkIEFkanVzdG1lbnQ6ICovCi0JLyogIHdoZW4gUlNTSSBzdGF0ZSB0cmVuZHMgdG8gZ28gdXAgb25lIG9yIHR3byBsZXZlbHMsIG1ha2Ugc3VyZSBSU1NJIGlzIGhpZ2ggZW5vdWdoLiAqLwotCS8qICBIZXJlIEdvVXBHYXAgaXMgYWRkZWQgdG8gc29sdmUgdGhlIGJvdW5kYXJ5J3MgbGV2ZWwgYWx0ZXJuYXRpb24gaXNzdWUuICovCi0Jc3dpdGNoICgqcFJBVFJTdGF0ZSkgewotCWNhc2UgRE1fUkFUUl9TVEFfSU5JVDoKLQljYXNlIERNX1JBVFJfU1RBX0hJR0g6Ci0JCWJyZWFrOwotCWNhc2UgRE1fUkFUUl9TVEFfTUlERExFOgotCQlIaWdoUlNTSVRocmVzaEZvclJBICs9IEdvVXBHYXA7Ci0JCWJyZWFrOwotCWNhc2UgRE1fUkFUUl9TVEFfTE9XOgotCQlIaWdoUlNTSVRocmVzaEZvclJBICs9IEdvVXBHYXA7Ci0JCUxvd1JTU0lUaHJlc2hGb3JSQSArPSBHb1VwR2FwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlPRE1fUlRfQVNTRVJUKHBETV9PZG0sIGZhbHNlLCAoIndyb25nIHJzc2kgbGV2ZWwgc2V0dGluZyAlZCAhIiwKLQkJCQkJICAgICAgICpwUkFUUlN0YXRlKSk7Ci0JCWJyZWFrOwotCX0KLQotCS8qICBEZWNpZGUgUkFUUlN0YXRlIGJ5IFJTU0kuICovCi0JaWYgKFJTU0kgPiBIaWdoUlNTSVRocmVzaEZvclJBKQotCQlSQVRSU3RhdGUgPSBETV9SQVRSX1NUQV9ISUdIOwotCWVsc2UgaWYgKFJTU0kgPiBMb3dSU1NJVGhyZXNoRm9yUkEpCi0JCVJBVFJTdGF0ZSA9IERNX1JBVFJfU1RBX01JRERMRTsKLQllbHNlCi0JCVJBVFJTdGF0ZSA9IERNX1JBVFJfU1RBX0xPVzsKLQotCWlmICgqcFJBVFJTdGF0ZSAhPSBSQVRSU3RhdGUgfHwgYkZvcmNlVXBkYXRlKSB7Ci0JCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9SQV9NQVNLLCBPRE1fREJHX0xPVUQsCi0JCQkgICAgICgiUlNTSSBMZXZlbCAlZCAtPiAlZFxuIiwgKnBSQVRSU3RhdGUsIFJBVFJTdGF0ZSkpOwotCQkqcFJBVFJTdGF0ZSA9IFJBVFJTdGF0ZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotLyogMyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qIDMgRHluYW1pYyBUeCBQb3dlciAqLwotLyogMyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotdm9pZCBvZG1fRHluYW1pY1R4UG93ZXIyM2FJbml0KHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0Jc3RydWN0IGRtX3ByaXYgKnBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKLQotCS8qCi0JICogVGhpcyBpcyBuZXZlciBjaGFuZ2VkLCBzbyB3ZSBzaG91bGQgYmUgYWJsZSB0byBjbGVhbiB1cCB0aGUKLQkgKiBjb2RlIGNoZWNraW5nIGZvciBkaWZmZXJlbnQgdmFsdWVzIGluIHJ0bDg3MjNhX3JmNjA1Mi5jCi0JICovCi0JcGRtcHJpdi0+RHluYW1pY1R4SGlnaFBvd2VyTHZsID0gVHhIaWdoUHdyTGV2ZWxfTm9ybWFsOwotfQotCi1zdGF0aWMgdm9pZAotRmluZE1pbmltdW1SU1NJKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwQWRhcHRlcik7Ci0Jc3RydWN0IGRtX3ByaXYgKnBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKLQlzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0gPSAmcEhhbERhdGEtPm9kbXByaXY7Ci0KLQkvKiAxIDEuRGV0ZXJtaW5lIHRoZSBtaW5pbXVtIFJTU0kgKi8KLQotCWlmICghcERNX09kbS0+YkxpbmtlZCAmJiAhcGRtcHJpdi0+RW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQikKLQkJcGRtcHJpdi0+TWluVW5kZWNvcmF0ZWRQV0RCRm9yRE0gPSAwOwotCWVsc2UKLQkJcGRtcHJpdi0+TWluVW5kZWNvcmF0ZWRQV0RCRm9yRE0gPQotCQkJcGRtcHJpdi0+RW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQjsKLX0KLQotc3RhdGljIHZvaWQgb2RtX1JTU0lNb25pdG9yQ2hlY2soc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlzdHJ1Y3QgZG1fcHJpdiAqcGRtcHJpdiA9ICZwSGFsRGF0YS0+ZG1wcml2OwotCWludCBpOwotCWludCBNYXhEQiA9IDAsIE1pbkRCID0gMHhmZjsKLQl1OCBzdGFfY250ID0gMDsKLQl1MzIgdG1wZGI7Ci0JdTMyIFBXREJfcnNzaVtOVU1fU1RBXSA9IHswfTsvKiAwfjE1XTpNQUNJRCwgWzE2fjMxXTpQV0RCX3Jzc2kgKi8KLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0KLQlpZiAoIXBETV9PZG0tPmJMaW5rZWQpCi0JCXJldHVybjsKLQotCWZvciAoaSA9IDA7IGkgPCBPRE1fQVNTT0NJQVRFX0VOVFJZX05VTTsgaSsrKSB7Ci0JCXBzdGEgPSBwRE1fT2RtLT5wT0RNX1N0YUluZm9baV07Ci0JCWlmIChwc3RhKSB7Ci0JCQlpZiAocHN0YS0+cnNzaV9zdGF0LlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCIDwgTWluREIpCi0JCQkJTWluREIgPSBwc3RhLT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7Ci0KLQkJCWlmIChwc3RhLT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPiBNYXhEQikKLQkJCQlNYXhEQiA9IHBzdGEtPnJzc2lfc3RhdC5VbmRlY29yYXRlZFNtb290aGVkUFdEQjsKLQotCQkJaWYgKHBzdGEtPnJzc2lfc3RhdC5VbmRlY29yYXRlZFNtb290aGVkUFdEQiAhPSAtMSkgewotCQkJCXRtcGRiID0gcHN0YS0+cnNzaV9zdGF0LlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOwotCQkJCVBXREJfcnNzaVtzdGFfY250KytdID0gcHN0YS0+bWFjX2lkIHwKLQkJCQkJKHRtcGRiIDw8IDE2KTsKLQkJCX0KLQkJfQotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBzdGFfY250OyBpKyspIHsKLQkJaWYgKFBXREJfcnNzaVtpXSAhPSAoMCkpCi0JCQlydGw4NzIzYV9zZXRfcnNzaV9jbWQoQWRhcHRlciwgUFdEQl9yc3NpW2ldKTsKLQl9Ci0KLQlwZG1wcml2LT5FbnRyeU1heFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID0gTWF4REI7Ci0KLQlpZiAoTWluREIgIT0gMHhmZikgLyogIElmIGFzc29jaWF0ZWQgZW50cnkgaXMgZm91bmQgKi8KLQkJcGRtcHJpdi0+RW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IE1pbkRCOwotCWVsc2UKLQkJcGRtcHJpdi0+RW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IDA7Ci0KLQlGaW5kTWluaW11bVJTU0koQWRhcHRlcik7LyogZ2V0IHBkbXByaXYtPk1pblVuZGVjb3JhdGVkUFdEQkZvckRNICovCi0KLQlPRE1fQ21uSW5mb1VwZGF0ZTIzYSgmcEhhbERhdGEtPm9kbXByaXYsIE9ETV9DTU5JTkZPX1JTU0lfTUlOLAotCQkJICAgICBwZG1wcml2LT5NaW5VbmRlY29yYXRlZFBXREJGb3JETSk7Ci19Ci0KLS8qIGVuZGlmICovCi0vKiAzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogMyBUeCBQb3dlciBUcmFja2luZyAqLwotLyogMyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotc3RhdGljIHZvaWQgb2RtX1RYUG93ZXJUcmFja2luZ0luaXQoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlzdHJ1Y3QgZG1fcHJpdiAqcGRtcHJpdiA9ICZwSGFsRGF0YS0+ZG1wcml2OwotCi0JcGRtcHJpdi0+YlRYUG93ZXJUcmFja2luZyA9IHRydWU7Ci0JcGRtcHJpdi0+VFhQb3dlcmNvdW50ID0gMDsKLQlwZG1wcml2LT5iVFhQb3dlclRyYWNraW5nSW5pdCA9IGZhbHNlOwotCXBkbXByaXYtPlR4UG93ZXJUcmFja0NvbnRyb2wgPSB0cnVlOwotCU1TR184NzIzQSgicGRtcHJpdi0+VHhQb3dlclRyYWNrQ29udHJvbCA9ICVkXG4iLAotCQkgIHBkbXByaXYtPlR4UG93ZXJUcmFja0NvbnRyb2wpOwotCi0JcERNX09kbS0+UkZDYWxpYnJhdGVJbmZvLlR4UG93ZXJUcmFja0NvbnRyb2wgPSB0cnVlOwotfQotCi0vKiBFRENBIFR1cmJvICovCi1zdGF0aWMgdm9pZCBPRE1fRWRjYVR1cmJvSW5pdDIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQotCXBETV9PZG0tPkRNX0VEQ0FfVGFibGUuYkN1cnJlbnRUdXJib0VEQ0EgPSBmYWxzZTsKLQlBZGFwdGVyLT5yZWN2cHJpdi5iSXNBbnlOb25CRVBrdHMgPSBmYWxzZTsKLQotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9FRENBX1RVUkJPLCBPRE1fREJHX0xPVUQsCi0JCSAgICAgKCJPcmdpbmlhbCBWTyBQQVJBTTogMHgleFxuIiwKLQkJICAgICAgcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCBPRE1fRURDQV9WT19QQVJBTSkpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRURDQV9UVVJCTywgT0RNX0RCR19MT1VELAotCQkgICAgICgiT3JnaW5pYWwgVkkgUEFSQU06IDB4JXhcbiIsCi0JCSAgICAgIHJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgT0RNX0VEQ0FfVklfUEFSQU0pKSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0VEQ0FfVFVSQk8sIE9ETV9EQkdfTE9VRCwKLQkJICAgICAoIk9yZ2luaWFsIEJFIFBBUkFNOiAweCV4XG4iLAotCQkgICAgICBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIE9ETV9FRENBX0JFX1BBUkFNKSkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9FRENBX1RVUkJPLCBPRE1fREJHX0xPVUQsCi0JCSAgICAgKCJPcmdpbmlhbCBCSyBQQVJBTTogMHgleFxuIiwKLQkJICAgICAgcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCBPRE1fRURDQV9CS19QQVJBTSkpKTsKLX0KLQotc3RhdGljIHZvaWQgb2RtX0VkY2FUdXJib0NoZWNrMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJkFkYXB0ZXItPnhtaXRwcml2OwotCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICZBZGFwdGVyLT5yZWN2cHJpdjsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ3ByaXYgPSAmQWRhcHRlci0+cmVnaXN0cnlwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZBZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQl1MzIgdHJhZmZpY0luZGV4OwotCXUzMiBlZGNhX3BhcmFtOwotCXU2NCBjdXJfdHhfYnl0ZXM7Ci0JdTY0IGN1cl9yeF9ieXRlczsKLQotCS8qICBGb3IgQVAvQURTTCB1c2Ugc3RydWN0IHJ0bDg3MjNhX3ByaXYgKiAqLwotCS8qICBGb3IgQ0UvTklDIHVzZSBzdHJ1Y3QgcnR3X2FkYXB0ZXIgKiAqLwotCi0JLyoKLQkgKiAyMDExLzA5LzI5IE1IIEluIEhXIGludGVncmF0aW9uIGZpcnN0IHN0YWdlLCB3ZSBwcm92aWRlIDQKLQkgKiBkaWZmZXJlbnQgaGFuZGxlIHRvIG9wZXJhdGUgYXQgdGhlIHNhbWUgdGltZS4gSW4gdGhlIHN0YWdlMi8zLAotCSAqIHdlIG5lZWQgdG8gcHJpdmUgdW5pdmVyc2FsIGludGVyZmFjZSBhbmQgbWVyZ2UgYWxsIEhXIGR5bmFtaWMKLQkgKiBtZWNoYW5pc20uCi0JICovCi0KLQlpZiAoKHByZWdwcml2LT53aWZpX3NwZWMgPT0gMSkpLyogIChwbWxtZWluZm8tPkhUX2VuYWJsZSA9PSAwKSkgKi8KLQkJZ290byBkbV9DaGVja0VkY2FUdXJib19FWElUOwotCi0JaWYgKHBtbG1laW5mby0+YXNzb2NfQVBfdmVuZG9yID49ICBIVF9JT1RfUEVFUl9NQVgpCi0JCWdvdG8gZG1fQ2hlY2tFZGNhVHVyYm9fRVhJVDsKLQotCWlmIChydGw4NzIzYV9CVF9kaXNhYmxlX0VEQ0FfdHVyYm8oQWRhcHRlcikpCi0JCWdvdG8gZG1fQ2hlY2tFZGNhVHVyYm9fRVhJVDsKLQotCS8qICBDaGVjayBpZiB0aGUgc3RhdHVzIG5lZWRzIHRvIGJlIGNoYW5nZWQuICovCi0JaWYgKCFwcmVjdnByaXYtPmJJc0FueU5vbkJFUGt0cykgewotCQljdXJfdHhfYnl0ZXMgPSBweG1pdHByaXYtPnR4X2J5dGVzIC0gcHhtaXRwcml2LT5sYXN0X3R4X2J5dGVzOwotCQljdXJfcnhfYnl0ZXMgPSBwcmVjdnByaXYtPnJ4X2J5dGVzIC0gcHJlY3Zwcml2LT5sYXN0X3J4X2J5dGVzOwotCi0JCS8qIHRyYWZmaWMsIFRYIG9yIFJYICovCi0JCWlmICgocG1sbWVpbmZvLT5hc3NvY19BUF92ZW5kb3IgPT0gSFRfSU9UX1BFRVJfUkFMSU5LKSB8fAotCQkgICAgKHBtbG1laW5mby0+YXNzb2NfQVBfdmVuZG9yID09IEhUX0lPVF9QRUVSX0FUSEVST1MpKSB7Ci0JCQlpZiAoY3VyX3R4X2J5dGVzID4gKGN1cl9yeF9ieXRlcyA8PCAyKSkgewotCQkJCS8qICBVcGxpbmsgVFAgaXMgcHJlc2VudC4gKi8KLQkJCQl0cmFmZmljSW5kZXggPSBVUF9MSU5LOwotCQkJfSBlbHNlIHsgLyogIEJhbGFuY2UgVFAgaXMgcHJlc2VudC4gKi8KLQkJCQl0cmFmZmljSW5kZXggPSBET1dOX0xJTks7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoY3VyX3J4X2J5dGVzID4gKGN1cl90eF9ieXRlcyA8PCAyKSkgewotCQkJCS8qICBEb3dubGluayBUUCBpcyBwcmVzZW50LiAqLwotCQkJCXRyYWZmaWNJbmRleCA9IERPV05fTElOSzsKLQkJCX0gZWxzZSB7IC8qICBCYWxhbmNlIFRQIGlzIHByZXNlbnQuICovCi0JCQkJdHJhZmZpY0luZGV4ID0gVVBfTElOSzsKLQkJCX0KLQkJfQotCi0JCWlmICgocERNX09kbS0+RE1fRURDQV9UYWJsZS5wcnZfdHJhZmZpY19pZHggIT0gdHJhZmZpY0luZGV4KSB8fAotCQkgICAgKCFwRE1fT2RtLT5ETV9FRENBX1RhYmxlLmJDdXJyZW50VHVyYm9FRENBKSkgewotCQkJaWYgKChwbWxtZWluZm8tPmFzc29jX0FQX3ZlbmRvciA9PSBIVF9JT1RfUEVFUl9DSVNDTykgJiYKLQkJCSAgICAocG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlICYgV0lSRUxFU1NfMTFfMjROKSkKLQkJCQllZGNhX3BhcmFtID0gRURDQVBhcmFtW3BtbG1laW5mby0+YXNzb2NfQVBfdmVuZG9yXVt0cmFmZmljSW5kZXhdOwotCQkJZWxzZQotCQkJCWVkY2FfcGFyYW0gPSBFRENBUGFyYW1bSFRfSU9UX1BFRVJfVU5LTk9XTl1bdHJhZmZpY0luZGV4XTsKLQkJCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19FRENBX0JFX1BBUkFNLAotCQkJCQkgIGVkY2FfcGFyYW0pOwotCi0JCQlwRE1fT2RtLT5ETV9FRENBX1RhYmxlLnBydl90cmFmZmljX2lkeCA9IHRyYWZmaWNJbmRleDsKLQkJfQotCi0JCXBETV9PZG0tPkRNX0VEQ0FfVGFibGUuYkN1cnJlbnRUdXJib0VEQ0EgPSB0cnVlOwotCX0gZWxzZSB7Ci0JCS8qICBUdXJuIE9mZiBFRENBIHR1cmJvIGhlcmUuICovCi0JCS8qICBSZXN0b3JlIG9yaWdpbmFsIEVEQ0EgYWNjb3JkaW5nIHRvIHRoZSBkZWNsYXJhdGlvbiBvZiBBUC4gKi8KLQkJaWYgKHBETV9PZG0tPkRNX0VEQ0FfVGFibGUuYkN1cnJlbnRUdXJib0VEQ0EpIHsKLQkJCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19FRENBX0JFX1BBUkFNLAotCQkJCQkgIHBIYWxEYXRhLT5BY1BhcmFtX0JFKTsKLQkJCXBETV9PZG0tPkRNX0VEQ0FfVGFibGUuYkN1cnJlbnRUdXJib0VEQ0EgPSBmYWxzZTsKLQkJfQotCX0KLQotZG1fQ2hlY2tFZGNhVHVyYm9fRVhJVDoKLQkvKiAgU2V0IHZhcmlhYmxlcyBmb3IgbmV4dCB0aW1lLiAqLwotCXByZWN2cHJpdi0+YklzQW55Tm9uQkVQa3RzID0gZmFsc2U7Ci0JcHhtaXRwcml2LT5sYXN0X3R4X2J5dGVzID0gcHhtaXRwcml2LT50eF9ieXRlczsKLQlwcmVjdnByaXYtPmxhc3RfcnhfYnl0ZXMgPSBwcmVjdnByaXYtPnJ4X2J5dGVzOwotfQotCi11MzIgR2V0UFNERGF0YShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHVuc2lnbmVkIGludCBwb2ludCwKLQkgICAgICAgdTggaW5pdGlhbF9nYWluX3BzZCkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwotCXUzMiBwc2RfcmVwb3J0LCB2YWwzMjsKLQotCS8qIFNldCBEQ08gZnJlcXVlbmN5IGluZGV4LCBvZmZzZXQgPSAoNDBNSHovU2FtcGxlUHRzKSpwb2ludCAqLwotCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweDgwOCk7Ci0JdmFsMzIgJj0gfjB4M2ZmOwotCXZhbDMyIHw9IChwb2ludCAmIDB4M2ZmKTsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCAweDgwOCwgdmFsMzIpOwotCi0JLyogU3RhcnQgUFNEIGNhbGN1bGF0aW9uLCBSZWc4MDhbMjJdPSAwLT4xICovCi0JdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODA4KTsKLQl2YWwzMiB8PSBCSVQoMjIpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIDB4ODA4LCB2YWwzMik7Ci0JLyogTmVlZCB0byB3YWl0IGZvciBIVyBQU0QgcmVwb3J0ICovCi0JdWRlbGF5KDMwKTsKLQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHg4MDgpOwotCXZhbDMyICY9IH5CSVQoMjIpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIDB4ODA4LCB2YWwzMik7Ci0JLyogUmVhZCBQU0QgcmVwb3J0LCBSZWc4QjRbMTU6MF0gKi8KLQlwc2RfcmVwb3J0ID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweDhCNCkgJiAweDAwMDBGRkZGOwotCi0JcHNkX3JlcG9ydCA9ICh1MzIpKENvbnZlcnRUb19kQjIzYShwc2RfcmVwb3J0KSkgKwotCQkodTMyKShpbml0aWFsX2dhaW5fcHNkLTB4MWMpOwotCi0JcmV0dXJuIHBzZF9yZXBvcnQ7Ci19Ci0KLXUzMiBDb252ZXJ0VG9fZEIyM2EodTMyIFZhbHVlKQotewotCXU4IGk7Ci0JdTggajsKLQl1MzIgZEI7Ci0KLQlWYWx1ZSA9IFZhbHVlICYgMHhGRkZGOwotCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQlpZiAoVmFsdWUgPD0gZEJfSW52ZXJ0X1RhYmxlW2ldWzExXSkKLQkJCWJyZWFrOwotCX0KLQotCWlmIChpID49IDgpCi0JCXJldHVybiA5NjsJLyogIG1heGltdW0gOTYgZEIgKi8KLQotCWZvciAoaiA9IDA7IGogPCAxMjsgaisrKSB7Ci0JCWlmIChWYWx1ZSA8PSBkQl9JbnZlcnRfVGFibGVbaV1bal0pCi0JCQlicmVhazsKLQl9Ci0KLQlkQiA9IGkqMTIgKyBqICsgMTsKLQotCXJldHVybiBkQjsKLX0KLQotLyogICovCi0vKiAgRGVzY3JpcHRpb246ICovCi0vKiBTZXQgU2luZ2xlL0R1YWwgQW50ZW5uYSBkZWZhdWx0IHNldHRpbmcgZm9yIHByb2R1Y3RzIHRoYXQgZG8gbm90Ci0gKiBkbyBkZXRlY3Rpb24gaW4gYWR2YW5jZS4gKi8KLS8qICAqLwotLyogIEFkZGVkIGJ5IEpvc2VwaCwgMjAxMi4wMy4yMiAqLwotLyogICovCi12b2lkIE9ETV9TaW5nbGVEdWFsQW50ZW5uYURlZmF1bHRTZXR0aW5nKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKLQlzdHJ1Y3Qgc3dfYW50X3N3ICpwRE1fU1dBVF9UYWJsZSA9ICZwRE1fT2RtLT5ETV9TV0FUX1RhYmxlOwotCi0JcERNX1NXQVRfVGFibGUtPkFOVEFfT04gPSB0cnVlOwotCXBETV9TV0FUX1RhYmxlLT5BTlRCX09OID0gdHJ1ZTsKLX0KLQotLyogMiA4NzIzQSBBTlQgREVURUNUICovCi0KLXN0YXRpYyB2b2lkIG9kbV9QSFlfU2F2ZUFGRVJlZ2lzdGVycyhzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiAqQUZFUmVnLAotCQkJCSAgICAgdTMyICpBRkVCYWNrdXAsIHUzMiBSZWdpc3Rlck51bSkKLXsKLQl1MzIgaTsKLQotCWZvciAoaSA9IDAgOyBpIDwgUmVnaXN0ZXJOdW0gOyBpKyspCi0JCUFGRUJhY2t1cFtpXSA9IHJ0bDg3MjNhdV9yZWFkMzIocERNX09kbS0+QWRhcHRlciwgQUZFUmVnW2ldKTsKLX0KLQotc3RhdGljIHZvaWQgb2RtX1BIWV9SZWxvYWRBRkVSZWdpc3RlcnMoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1MzIgKkFGRVJlZywKLQkJCQkgICAgICAgdTMyICpBRkVCYWNrdXAsIHUzMiBSZWdpZXN0ZXJOdW0pCi17Ci0JdTMyIGk7Ci0KLQlmb3IgKGkgPSAwIDsgaSA8IFJlZ2llc3Rlck51bTsgaSsrKQotCQlydGw4NzIzYXVfd3JpdGUzMihwRE1fT2RtLT5BZGFwdGVyLCBBRkVSZWdbaV0sIEFGRUJhY2t1cFtpXSk7Ci19Ci0KLS8qIDIgODcyM0EgQU5UIERFVEVDVCAqLwotLyogIERlc2NyaXB0aW9uOiAqLwotLyogSW1wbGVtZW50IElRSyBzaW5nbGUgdG9uZSBmb3IgUkYgRFBLIGxvb3BiYWNrIGFuZCBCQiBQU0Qgc2Nhbm5pbmcuICovCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNvb3BlcmF0ZWQgd2l0aCBCQiB0ZWFtIE5laWwuICovCi1ib29sIE9ETV9TaW5nbGVEdWFsQW50ZW5uYURldGVjdGlvbihzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHU4IG1vZGUpCi17Ci0Jc3RydWN0IHN3X2FudF9zdyAqcERNX1NXQVRfVGFibGUgPSAmcERNX09kbS0+RE1fU1dBVF9UYWJsZTsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwotCXUzMiBDdXJyZW50Q2hhbm5lbCwgUmZMb29wUmVnOwotCXU4IG47Ci0JdTMyIFJlZzg4YywgUmVnYzA4LCBSZWc4NzQsIFJlZ2M1MCwgdmFsMzI7Ci0JdTggaW5pdGlhbF9nYWluID0gMHg1YTsKLQl1MzIgUFNEX3JlcG9ydF90bXA7Ci0JdTMyIEFudEFfcmVwb3J0ID0gMHgwLCBBbnRCX3JlcG9ydCA9IDB4MCwgQW50T19yZXBvcnQgPSAweDA7Ci0JYm9vbCBiUmVzdWx0ID0gdHJ1ZTsKLQl1MzIgQUZFX0JhY2t1cFsxNl07Ci0JdTMyIEFGRV9SRUdfODcyM0FbMTZdID0gewotCQlyUnhfV2FpdF9DQ0EsIHJUeF9DQ0tfUkZPTiwKLQkJclR4X0NDS19CQk9OLCByVHhfT0ZETV9SRk9OLAotCQlyVHhfT0ZETV9CQk9OLCByVHhfVG9fUngsCi0JCXJUeF9Ub19UeCwgclJ4X0NDSywKLQkJclJ4X09GRE0sIHJSeF9XYWl0X1JJRlMsCi0JCXJSeF9UT19SeCwgclN0YW5kYnksCi0JCXJTbGVlcCwgclBNUERfQU5BRU4sCi0JCXJGUEdBMF9YQ0RfU3dpdGNoQ29udHJvbCwgckJsdWVfVG9vdGh9OwotCi0JaWYgKCEocERNX09kbS0+U3VwcG9ydElDVHlwZSAmIE9ETV9SVEw4NzIzQSkpCi0JCXJldHVybiBiUmVzdWx0OwotCi0JaWYgKCEocERNX09kbS0+U3VwcG9ydEFiaWxpdHkmT0RNX0JCX0FOVF9ESVYpKQotCQlyZXR1cm4gYlJlc3VsdDsKLQkvKiAxIEJhY2t1cCBDdXJyZW50IFJGL0JCIFNldHRpbmdzICovCi0KLQlDdXJyZW50Q2hhbm5lbCA9IE9ETV9HZXRSRlJlZyhwRE1fT2RtLCBSRl9QQVRIX0EsIE9ETV9DSEFOTkVMLAotCQkJCSAgICAgIGJSRlJlZ09mZnNldE1hc2spOwotCVJmTG9vcFJlZyA9IE9ETV9HZXRSRlJlZyhwRE1fT2RtLCBSRl9QQVRIX0EsIDB4MDAsIGJSRlJlZ09mZnNldE1hc2spOwotCS8qICBjaGFuZ2UgdG8gQW50ZW5uYSBBICovCi0JdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIHJGUEdBMF9YQV9SRkludGVyZmFjZU9FKTsKLQl2YWwzMiAmPSB+MHgzMDA7Ci0JdmFsMzIgfD0gMHgxMDA7CQkvKiBFbmFibGUgYW50ZW5uYSBBICovCi0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UsIHZhbDMyKTsKLQotCS8qICBTdGVwIDE6IFVTRSBJUUsgdG8gdHJhbnNtaXR0ZXIgc2luZ2xlIHRvbmUgKi8KLQotCXVkZWxheSgxMCk7Ci0KLQkvKiBTdG9yZSBBIFBhdGggUmVnaXN0ZXIgODhjLCBjMDgsIDg3NCwgYzUwICovCi0JUmVnODhjID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyNCk7Ci0JUmVnYzA4ID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCByT0ZETTBfVFJNdXhQYXIpOwotCVJlZzg3NCA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgckZQR0EwX1hDRF9SRkludGVyZmFjZVNXKTsKLQlSZWdjNTAgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIHJPRkRNMF9YQUFHQ0NvcmUxKTsKLQotCS8qICBTdG9yZSBBRkUgUmVnaXN0ZXJzICovCi0Jb2RtX1BIWV9TYXZlQUZFUmVnaXN0ZXJzKHBETV9PZG0sIEFGRV9SRUdfODcyM0EsIEFGRV9CYWNrdXAsIDE2KTsKLQotCS8qIFNldCBQU0QgMTI4IHB0cyAqLwotCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCByRlBHQTBfUFNERnVuY3Rpb24pOwotCXZhbDMyICY9IH4oQklUKDE0KSB8IEJJVCgxNSkpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJGUEdBMF9QU0RGdW5jdGlvbiwgdmFsMzIpOwotCi0JLyogIFRvIFNFVCBDSDEgdG8gZG8gKi8KLQlPRE1fU2V0UkZSZWcocERNX09kbSwgUkZfUEFUSF9BLCBPRE1fQ0hBTk5FTCwgYlJGUmVnT2Zmc2V0TWFzaywgMHgwMSk7Ci0KLQkvKiAgQUZFIGFsbCBvbiBzdGVwICovCi0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclJ4X1dhaXRfQ0NBLCAweDZGREIyNUE0KTsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByVHhfQ0NLX1JGT04sIDB4NkZEQjI1QTQpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJUeF9DQ0tfQkJPTiwgMHg2RkRCMjVBNCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclR4X09GRE1fUkZPTiwgMHg2RkRCMjVBNCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclR4X09GRE1fQkJPTiwgMHg2RkRCMjVBNCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclR4X1RvX1J4LCAweDZGREIyNUE0KTsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByVHhfVG9fVHgsIDB4NkZEQjI1QTQpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJSeF9DQ0ssIDB4NkZEQjI1QTQpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJSeF9PRkRNLCAweDZGREIyNUE0KTsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByUnhfV2FpdF9SSUZTLCAweDZGREIyNUE0KTsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByUnhfVE9fUngsIDB4NkZEQjI1QTQpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJTdGFuZGJ5LCAweDZGREIyNUE0KTsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByU2xlZXAsIDB4NkZEQjI1QTQpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJQTVBEX0FOQUVOLCAweDZGREIyNUE0KTsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByRlBHQTBfWENEX1N3aXRjaENvbnRyb2wsIDB4NkZEQjI1QTQpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJCbHVlX1Rvb3RoLCAweDZGREIyNUE0KTsKLQotCS8qICAzIHdpcmUgRGlzYWJsZSAqLwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXI0LCAweENDRjAwMEMwKTsKLQotCS8qIEJCIElRSyBTZXR0aW5nICovCi0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgck9GRE0wX1RSTXV4UGFyLCAweDAwMDgwMEU0KTsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByRlBHQTBfWENEX1JGSW50ZXJmYWNlU1csIDB4MjIyMDgwMDApOwotCi0JLyogSVFLIHNldHRpbmcgdG9uZUAgNC4zNE1oeiAqLwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJUeF9JUUtfVG9uZV9BLCAweDEwMDA4QzFDKTsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByVHhfSVFLLCAweDAxMDA3YzAwKTsKLQotCS8qIFBhZ2UgQiBpbml0ICovCi0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgckNvbmZpZ19BbnRBLCAweDAwMDgwMDAwKTsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByQ29uZmlnX0FudEEsIDB4MGY2MDAwMDApOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJSeF9JUUssIDB4MDEwMDQ4MDApOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJSeF9JUUtfVG9uZV9BLCAweDEwMDA4YzFmKTsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByVHhfSVFLX1BJX0EsIDB4ODIxNTAwMDgpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJSeF9JUUtfUElfQSwgMHgyODE1MDAwOCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgcklRS19BR0NfUnNwLCAweDAwMTAyOGQwKTsKLQotCS8qIFJGIGxvb3AgU2V0dGluZyAqLwotCU9ETV9TZXRSRlJlZyhwRE1fT2RtLCBSRl9QQVRIX0EsIDB4MCwgMHhGRkZGRiwgMHg1MDAwOCk7Ci0KLQkvKiBJUUsgU2luZ2xlIHRvbmUgc3RhcnQgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByRlBHQTBfSVFLLCAweDgwODAwMDAwKTsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCBySVFLX0FHQ19QdHMsIDB4ZjgwMDAwMDApOwotCXVkZWxheSgxMDAwKTsKLQlQU0RfcmVwb3J0X3RtcCA9IDB4MDsKLQotCWZvciAobiA9IDA7IG4gPCAyOyBuKyspIHsKLQkJUFNEX3JlcG9ydF90bXAgPSAgR2V0UFNERGF0YShwRE1fT2RtLCAxNCwgaW5pdGlhbF9nYWluKTsKLQkJaWYgKFBTRF9yZXBvcnRfdG1wID4gQW50QV9yZXBvcnQpCi0JCQlBbnRBX3JlcG9ydCA9IFBTRF9yZXBvcnRfdG1wOwotCX0KLQotCVBTRF9yZXBvcnRfdG1wID0gMHgwOwotCi0JdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIHJGUEdBMF9YQV9SRkludGVyZmFjZU9FKTsKLQl2YWwzMiAmPSB+MHgzMDA7Ci0JdmFsMzIgfD0gMHgyMDA7CQkvKiBFbmFibGUgYW50ZW5uYSBCICovCi0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UsIHZhbDMyKTsKLQl1ZGVsYXkoMTApOwotCi0JZm9yIChuID0gMDsgbiA8IDI7IG4rKykgewotCQlQU0RfcmVwb3J0X3RtcCA9ICBHZXRQU0REYXRhKHBETV9PZG0sIDE0LCBpbml0aWFsX2dhaW4pOwotCQlpZiAoUFNEX3JlcG9ydF90bXAgPiBBbnRCX3JlcG9ydCkKLQkJCUFudEJfcmVwb3J0ID0gUFNEX3JlcG9ydF90bXA7Ci0JfQotCi0JLyogIGNoYW5nZSB0byBvcGVuIGNhc2UgKi8KLQkvKiAgY2hhbmdlIHRvIEFudCBBIGFuZCBCIGFsbCBvcGVuIGNhc2UgKi8KLQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UpOwotCXZhbDMyICY9IH4weDMwMDsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByRlBHQTBfWEFfUkZJbnRlcmZhY2VPRSwgdmFsMzIpOwotCXVkZWxheSgxMCk7Ci0KLQlmb3IgKG4gPSAwOyBuIDwgMjsgbisrKSB7Ci0JCVBTRF9yZXBvcnRfdG1wID0gIEdldFBTRERhdGEocERNX09kbSwgMTQsIGluaXRpYWxfZ2Fpbik7Ci0JCWlmIChQU0RfcmVwb3J0X3RtcCA+IEFudE9fcmVwb3J0KQotCQkJQW50T19yZXBvcnQgPSBQU0RfcmVwb3J0X3RtcDsKLQl9Ci0KLQkvKiBDbG9zZSBJUUsgU2luZ2xlIFRvbmUgZnVuY3Rpb24gKi8KLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByRlBHQTBfSVFLLCAweDAwMDAwMDAwKTsKLQlQU0RfcmVwb3J0X3RtcCA9IDB4MDsKLQotCS8qIDEgUmV0dXJuIHRvIGFudGFubmEgQSAqLwotCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCByRlBHQTBfWEFfUkZJbnRlcmZhY2VPRSk7Ci0JdmFsMzIgJj0gfjB4MzAwOwotCXZhbDMyIHw9IDB4MTAwOwkJLyogRW5hYmxlIGFudGVubmEgQSAqLwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJGUEdBMF9YQV9SRkludGVyZmFjZU9FLCB2YWwzMik7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjQsIFJlZzg4Yyk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgck9GRE0wX1RSTXV4UGFyLCBSZWdjMDgpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJGUEdBMF9YQ0RfUkZJbnRlcmZhY2VTVywgUmVnODc0KTsKLQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgck9GRE0wX1hBQUdDQ29yZTEpOwotCXZhbDMyICY9IH4weDdmOwotCXZhbDMyIHw9IDB4NDA7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgck9GRE0wX1hBQUdDQ29yZTEsIHZhbDMyKTsKLQotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJPRkRNMF9YQUFHQ0NvcmUxLCBSZWdjNTApOwotCU9ETV9TZXRSRlJlZyhwRE1fT2RtLCBSRl9QQVRIX0EsIFJGX0NITkxCVywgYlJGUmVnT2Zmc2V0TWFzaywKLQkJICAgICBDdXJyZW50Q2hhbm5lbCk7Ci0JT0RNX1NldFJGUmVnKHBETV9PZG0sIFJGX1BBVEhfQSwgMHgwMCwgYlJGUmVnT2Zmc2V0TWFzaywgUmZMb29wUmVnKTsKLQotCS8qIFJlbG9hZCBBRkUgUmVnaXN0ZXJzICovCi0Jb2RtX1BIWV9SZWxvYWRBRkVSZWdpc3RlcnMocERNX09kbSwgQUZFX1JFR184NzIzQSwgQUZFX0JhY2t1cCwgMTYpOwotCi0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0FOVF9ESVYsIE9ETV9EQkdfTE9VRCwKLQkJICAgICAoInBzZF9yZXBvcnRfQVslZF09ICVkIFxuIiwgMjQxNiwgQW50QV9yZXBvcnQpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQU5UX0RJViwgT0RNX0RCR19MT1VELAotCQkgICAgICgicHNkX3JlcG9ydF9CWyVkXT0gJWQgXG4iLCAyNDE2LCBBbnRCX3JlcG9ydCkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9BTlRfRElWLCBPRE1fREJHX0xPVUQsCi0JCSAgICAgKCJwc2RfcmVwb3J0X09bJWRdPSAlZCBcbiIsIDI0MTYsIEFudE9fcmVwb3J0KSk7Ci0KLQkvKiAyIFRlc3QgQW50IEIgYmFzZWQgb24gQW50IEEgaXMgT04gKi8KLQlpZiAobW9kZSA9PSBBTlRURVNUQikgewotCQlpZiAoQW50QV9yZXBvcnQgPj0gMTAwKSB7Ci0JCQlpZiAoQW50Ql9yZXBvcnQgPiAoQW50QV9yZXBvcnQrMSkpIHsKLQkJCQlwRE1fU1dBVF9UYWJsZS0+QU5UQl9PTiA9IGZhbHNlOwotCQkJCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9BTlRfRElWLCBPRE1fREJHX0xPVUQsICgiT0RNX1NpbmdsZUR1YWxBbnRlbm5hRGV0ZWN0aW9uKCk6IFNpbmdsZSBBbnRlbm5hIEFcbiIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcERNX1NXQVRfVGFibGUtPkFOVEJfT04gPSB0cnVlOwotCQkJCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9BTlRfRElWLCBPRE1fREJHX0xPVUQsICgiT0RNX1NpbmdsZUR1YWxBbnRlbm5hRGV0ZWN0aW9uKCk6IER1YWwgQW50ZW5uYSBpcyBBIGFuZCBCXG4iKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQU5UX0RJViwgT0RNX0RCR19MT1VELCAoIk9ETV9TaW5nbGVEdWFsQW50ZW5uYURldGVjdGlvbigpOiBOZWVkIHRvIGNoZWNrIGFnYWluXG4iKSk7Ci0JCQlwRE1fU1dBVF9UYWJsZS0+QU5UQl9PTiA9IGZhbHNlOyAvKiAgU2V0IEFudGVubmEgQiBvZmYgYXMgZGVmYXVsdCAqLwotCQkJYlJlc3VsdCA9IGZhbHNlOwotCQl9Ci0JfSBlbHNlIGlmIChtb2RlID09IEFOVFRFU1RBTEwpIHsKLQkJLyogMiBUZXN0IEFudCBBIGFuZCBCIGJhc2VkIG9uIERQRFQgT3BlbiAqLwotCQlpZiAoKEFudE9fcmVwb3J0ID49IDEwMCkgJiAoQW50T19yZXBvcnQgPCAxMTgpKSB7Ci0JCQlpZiAoQW50QV9yZXBvcnQgPiAoQW50T19yZXBvcnQrMSkpIHsKLQkJCQlwRE1fU1dBVF9UYWJsZS0+QU5UQV9PTiA9IGZhbHNlOwotCQkJCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9BTlRfRElWLAotCQkJCQkgICAgIE9ETV9EQkdfTE9VRCwgKCJBbnQgQSBpcyBPRkYiKSk7Ci0JCQl9IGVsc2UgewotCQkJCXBETV9TV0FUX1RhYmxlLT5BTlRBX09OID0gdHJ1ZTsKLQkJCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQU5UX0RJViwKLQkJCQkJICAgICBPRE1fREJHX0xPVUQsICgiQW50IEEgaXMgT04iKSk7Ci0JCQl9Ci0KLQkJCWlmIChBbnRCX3JlcG9ydCA+IChBbnRPX3JlcG9ydCsyKSkgewotCQkJCXBETV9TV0FUX1RhYmxlLT5BTlRCX09OID0gZmFsc2U7Ci0JCQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0FOVF9ESVYsCi0JCQkJCSAgICAgT0RNX0RCR19MT1VELCAoIkFudCBCIGlzIE9GRiIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcERNX1NXQVRfVGFibGUtPkFOVEJfT04gPSB0cnVlOwotCQkJCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9BTlRfRElWLAotCQkJCQkgICAgIE9ETV9EQkdfTE9VRCwgKCJBbnQgQiBpcyBPTiIpKTsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9BTlRfRElWLCBPRE1fREJHX0xPVUQsCi0JCSgiT0RNX1NpbmdsZUR1YWxBbnRlbm5hRGV0ZWN0aW9uKCk6IE5lZWQgdG8gY2hlY2sgYWdhaW5cbiIpKTsKLQkJLyogIFNldCBBbnRlbm5hIEEgb24gYXMgZGVmYXVsdCAqLwotCQlwRE1fU1dBVF9UYWJsZS0+QU5UQV9PTiA9IHRydWU7Ci0JCS8qICBTZXQgQW50ZW5uYSBCIG9mZiBhcyBkZWZhdWx0ICovCi0JCXBETV9TV0FUX1RhYmxlLT5BTlRCX09OID0gZmFsc2U7Ci0JCWJSZXN1bHQgPSBmYWxzZTsKLQl9Ci0KLQlyZXR1cm4gYlJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL29kbV9IV0NvbmZpZy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX0hXQ29uZmlnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NjJmNjEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX0hXQ29uZmlnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qICAqLwotLyogIGluY2x1ZGUgZmlsZXMgKi8KLS8qICAqLwotCi0jaW5jbHVkZSAib2RtX3ByZWNvbXAuaCIKLQotc3RhdGljIHU4IG9kbV9RdWVyeVJ4UHdyUGVyY2VudGFnZShzOCBBbnRQb3dlcikKLXsKLQlpZiAoKEFudFBvd2VyIDw9IC0xMDApIHx8IChBbnRQb3dlciA+PSAyMCkpCi0JCXJldHVybgkwOwotCWVsc2UgaWYgKEFudFBvd2VyID49IDApCi0JCXJldHVybgkxMDA7Ci0JZWxzZQotCQlyZXR1cm4JMTAwICsgQW50UG93ZXI7Ci19Ci0KLXN0YXRpYyBzMzIgb2RtX1NpZ25hbFNjYWxlTWFwcGluZ185MkNTZXJpZXMoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCBzMzIgQ3VyclNpZykKLXsKLQlzMzIgUmV0U2lnID0gMDsKLQotCWlmIChDdXJyU2lnID49IDUxICYmIEN1cnJTaWcgPD0gMTAwKQotCQlSZXRTaWcgPSAxMDA7Ci0JZWxzZSBpZiAoQ3VyclNpZyA+PSA0MSAmJiBDdXJyU2lnIDw9IDUwKQotCQlSZXRTaWcgPSA4MCArICgoQ3VyclNpZyAtIDQwKSoyKTsKLQllbHNlIGlmIChDdXJyU2lnID49IDMxICYmIEN1cnJTaWcgPD0gNDApCi0JCVJldFNpZyA9IDY2ICsgKEN1cnJTaWcgLSAzMCk7Ci0JZWxzZSBpZiAoQ3VyclNpZyA+PSAyMSAmJiBDdXJyU2lnIDw9IDMwKQotCQlSZXRTaWcgPSA1NCArIChDdXJyU2lnIC0gMjApOwotCWVsc2UgaWYgKEN1cnJTaWcgPj0gMTAgJiYgQ3VyclNpZyA8PSAyMCkKLQkJUmV0U2lnID0gNDIgKyAoKChDdXJyU2lnIC0gMTApICogMikgLyAzKTsKLQllbHNlIGlmIChDdXJyU2lnID49IDUgJiYgQ3VyclNpZyA8PSA5KQotCQlSZXRTaWcgPSAyMiArICgoKEN1cnJTaWcgLSA1KSAqIDMpIC8gMik7Ci0JZWxzZSBpZiAoQ3VyclNpZyA+PSAxICYmIEN1cnJTaWcgPD0gNCkKLQkJUmV0U2lnID0gNiArICgoKEN1cnJTaWcgLSAxKSAqIDMpIC8gMik7Ci0JZWxzZQotCQlSZXRTaWcgPSBDdXJyU2lnOwotCi0JcmV0dXJuIFJldFNpZzsKLX0KLQotc3RhdGljIHMzMiBvZG1fU2lnbmFsU2NhbGVNYXBwaW5nKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgczMyIEN1cnJTaWcpCi17Ci0JcmV0dXJuIG9kbV9TaWduYWxTY2FsZU1hcHBpbmdfOTJDU2VyaWVzKHBETV9PZG0sIEN1cnJTaWcpOwotfQotCi1zdGF0aWMgdTgKLW9kbV9FVk1kYlRvUGVyY2VudGFnZSgKLQlzOCBWYWx1ZQotICApCi17Ci0JLyogICovCi0JLyogIC0zM2RCfjBkQiB0byAwJX45OSUgKi8KLQkvKiAgKi8KLQlzOCByZXRfdmFsOwotCi0JcmV0X3ZhbCA9IFZhbHVlOwotCi0JaWYgKHJldF92YWwgPj0gMCkKLQkJcmV0X3ZhbCA9IDA7Ci0JaWYgKHJldF92YWwgPD0gLTMzKQotCQlyZXRfdmFsID0gLTMzOwotCi0JcmV0X3ZhbCA9IDAgLSByZXRfdmFsOwotCXJldF92YWwgKj0gMzsKLQotCWlmIChyZXRfdmFsID09IDk5KQotCQlyZXRfdmFsID0gMTAwOwotCi0JcmV0dXJuIHJldF92YWw7Ci19Ci0KLXN0YXRpYyB2b2lkIG9kbV9SeFBoeVN0YXR1czkyQ1Nlcmllc19QYXJzaW5nKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwKLQkJCQkJICAgICBzdHJ1Y3QgcGh5X2luZm8gKnBQaHlJbmZvLAotCQkJCQkgICAgIHU4ICpwUGh5U3RhdHVzLAotCQkJCQkgICAgIHN0cnVjdCBvZG1fcGFja2V0X2luZm8gKnBQa3RpbmZvKQotewotCXN0cnVjdCBwaHlfc3RhdHVzX3JwdCAqcFBoeVN0YVJwdCA9IChzdHJ1Y3QgcGh5X3N0YXR1c19ycHQgKilwUGh5U3RhdHVzOwotCXU4IGksIE1heF9zcGF0aWFsX3N0cmVhbTsKLQlzOCByeF9wd3JbNF0sIHJ4X3B3cl9hbGwgPSAwOwotCXU4IEVWTSwgUFdEQl9BTEwgPSAwLCBQV0RCX0FMTF9CVDsKLQl1OCBSU1NJLCB0b3RhbF9yc3NpID0gMDsKLQl1OCBpc0NDS3JhdGUgPSAwOwotCXU4IHJmX3J4X251bSA9IDA7Ci0JdTggY2NrX2hpZ2hwd3IgPSAwOwotCi0JaXNDQ0tyYXRlID0gKHBQa3RpbmZvLT5SYXRlIDw9IERFU0M5MkNfUkFURTExTSkgPyB0cnVlIDogZmFsc2U7Ci0JcFBoeUluZm8tPlJ4TUlNT1NpZ25hbFF1YWxpdHlbUkZfUEFUSF9BXSA9IC0xOwotCXBQaHlJbmZvLT5SeE1JTU9TaWduYWxRdWFsaXR5W1JGX1BBVEhfQl0gPSAtMTsKLQotCWlmIChpc0NDS3JhdGUpIHsKLQkJdTggcmVwb3J0OwotCQl1OCBjY2tfYWdjX3JwdDsKLQotCQlwRE1fT2RtLT5QaHlEYmdJbmZvLk51bVFyeVBoeVN0YXR1c0NDSysrOwotCQkvKiAgKDEpSGFyZHdhcmUgZG9lcyBub3QgcHJvdmlkZSBSU1NJIGZvciBDQ0sgKi8KLQkJLyogICgyKVBXREIsIEF2ZXJhZ2UgUFdEQiBjYWNsdWF0ZWQgYnkgaGFyZHdhcmUgKGZvciByYXRlIGFkYXB0aXZlKSAqLwotCi0JCWNja19oaWdocHdyID0gcERNX09kbS0+YkNja0hpZ2hQb3dlcjsKLQotCQljY2tfYWdjX3JwdCA9ICBwUGh5U3RhUnB0LT5jY2tfYWdjX3JwdF9vZmRtX2Nmb3Nob19hOwotCi0JCS8qIFRoZSBSU1NJIGZvcm11bGEgc2hvdWxkIGJlIG1vZGlmaWVkIGFjY29yZGluZyB0byB0aGUgZ2FpbiB0YWJsZSAqLwotCQlpZiAoIWNja19oaWdocHdyKSB7Ci0JCQlyZXBvcnQgPSAoY2NrX2FnY19ycHQgJiAweGMwKT4+NjsKLQkJCXN3aXRjaCAocmVwb3J0KSB7Ci0JCQkvKiAgTW9kaWZ5IHRoZSBSRiBSTkEgZ2FpbiB2YWx1ZSB0byAtNDAsIC0yMCwgLTIsIDE0IGJ5IEplbnl1J3Mgc3VnZ2VzdGlvbiAqLwotCQkJLyogIE5vdGU6IGRpZmZlcmVudCBSRiB3aXRoIHRoZSBkaWZmZXJlbnQgUk5BIGdhaW4uICovCi0JCQljYXNlIDB4MzoKLQkJCQlyeF9wd3JfYWxsID0gLTQ2IC0gKGNja19hZ2NfcnB0ICYgMHgzZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDB4MjoKLQkJCQlyeF9wd3JfYWxsID0gLTI2IC0gKGNja19hZ2NfcnB0ICYgMHgzZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDB4MToKLQkJCQlyeF9wd3JfYWxsID0gLTEyIC0gKGNja19hZ2NfcnB0ICYgMHgzZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDB4MDoKLQkJCQlyeF9wd3JfYWxsID0gMTYgLSAoY2NrX2FnY19ycHQgJiAweDNlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJlcG9ydCA9IChjY2tfYWdjX3JwdCAmIDB4NjApPj41OwotCQkJc3dpdGNoIChyZXBvcnQpIHsKLQkJCWNhc2UgMHgzOgotCQkJCXJ4X3B3cl9hbGwgPSAtNDYgLSAoKGNja19hZ2NfcnB0ICYgMHgxZik8PDEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAweDI6Ci0JCQkJcnhfcHdyX2FsbCA9IC0yNiAtICgoY2NrX2FnY19ycHQgJiAweDFmKTw8MSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDB4MToKLQkJCQlyeF9wd3JfYWxsID0gLTEyIC0gKChjY2tfYWdjX3JwdCAmIDB4MWYpPDwxKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMHgwOgotCQkJCXJ4X3B3cl9hbGwgPSAxNiAtICgoY2NrX2FnY19ycHQgJiAweDFmKTw8MSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlQV0RCX0FMTCA9IG9kbV9RdWVyeVJ4UHdyUGVyY2VudGFnZShyeF9wd3JfYWxsKTsKLQotCQkvKiBNb2RpZmljYXRpb24gZm9yIGV4dC1MTkEgYm9hcmQgKi8KLQkJaWYgKHBETV9PZG0tPkJvYXJkVHlwZSA9PSBPRE1fQk9BUkRfSElHSFBXUikgewotCQkJaWYgKChjY2tfYWdjX3JwdD4+NykgPT0gMCkgewotCQkJCVBXREJfQUxMID0gKFBXREJfQUxMID4gOTQpID8gMTAwIDogKFBXREJfQUxMKzYpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoUFdEQl9BTEwgPiAzOCkKLQkJCQkJUFdEQl9BTEwgLT0gMTY7Ci0JCQkJZWxzZQotCQkJCQlQV0RCX0FMTCA9IChQV0RCX0FMTCA8PSAxNikgPyAoUFdEQl9BTEw+PjIpIDogKFBXREJfQUxMLTEyKTsKLQkJCX0KLQotCQkJLyogQ0NLIG1vZGlmaWNhdGlvbiAqLwotCQkJaWYgKFBXREJfQUxMID4gMjUgJiYgUFdEQl9BTEwgPD0gNjApCi0JCQkJUFdEQl9BTEwgKz0gNjsKLQkJfSBlbHNlIHsgLyogTW9kaWZpY2F0aW9uIGZvciBpbnQtTE5BIGJvYXJkICovCi0JCQlpZiAoUFdEQl9BTEwgPiA5OSkKLQkJCQlQV0RCX0FMTCAtPSA4OwotCQkJZWxzZSBpZiAoUFdEQl9BTEwgPiA1MCAmJiBQV0RCX0FMTCA8PSA2OCkKLQkJCQlQV0RCX0FMTCArPSA0OwotCQl9Ci0JCXBQaHlJbmZvLT5SeFBXREJBbGwgPSBQV0RCX0FMTDsKLQkJcFBoeUluZm8tPkJUUnhSU1NJUGVyY2VudGFnZSA9IFBXREJfQUxMOwotCQlwUGh5SW5mby0+UmVjdlNpZ25hbFBvd2VyID0gcnhfcHdyX2FsbDsKLQkJLyogICgzKSBHZXQgU2lnbmFsIFF1YWxpdHkgKEVWTSkgKi8KLQkJaWYgKHBQa3RpbmZvLT5iUGFja2V0TWF0Y2hCU1NJRCkgewotCQkJdTgJU1EsIFNRX3JwdDsKLQotCQkJU1FfcnB0ID0gcFBoeVN0YVJwdC0+Y2NrX3NpZ19xdWFsX29mZG1fcHdkYl9hbGw7Ci0KLQkJCWlmIChTUV9ycHQgPiA2NCkKLQkJCQlTUSA9IDA7Ci0JCQllbHNlIGlmIChTUV9ycHQgPCAyMCkKLQkJCQlTUSA9IDEwMDsKLQkJCWVsc2UKLQkJCQlTUSA9ICgoNjQtU1FfcnB0KSAqIDEwMCkgLyA0NDsKLQotCQkJcFBoeUluZm8tPlNpZ25hbFF1YWxpdHkgPSBTUTsKLQkJCXBQaHlJbmZvLT5SeE1JTU9TaWduYWxRdWFsaXR5W1JGX1BBVEhfQV0gPSBTUTsKLQkJCXBQaHlJbmZvLT5SeE1JTU9TaWduYWxRdWFsaXR5W1JGX1BBVEhfQl0gPSAtMTsKLQkJfQotCX0gZWxzZSB7IC8qIGlzIE9GRE0gcmF0ZSAqLwotCQlwRE1fT2RtLT5QaHlEYmdJbmZvLk51bVFyeVBoeVN0YXR1c09GRE0rKzsKLQotCQkvKiAgKDEpR2V0IFJTU0kgZm9yIEhUIHJhdGUgKi8KLQotCQlmb3IgKGkgPSBSRl9QQVRIX0E7IGkgPCBSRl9QQVRIX01BWDsgaSsrKSB7Ci0JCQkvKiAgMjAwOC8wMS8zMCBNSCB3ZSB3aWxsIGp1ZGdlIFJGIFJYIHBhdGggbm93LiAqLwotCQkJaWYgKHBETV9PZG0tPlJGUGF0aFJ4RW5hYmxlICYgQklUKGkpKQotCQkJCXJmX3J4X251bSsrOwotCi0JCQlyeF9wd3JbaV0gPSAoKHBQaHlTdGFScHQtPnBhdGhfYWdjW2ldLmdhaW4gJiAweDNGKSoyKSAtIDExMDsKLQotCQkJcFBoeUluZm8tPlJ4UHdyW2ldID0gcnhfcHdyW2ldOwotCi0JCQkvKiBUcmFuc2xhdGUgREJNIHRvIHBlcmNlbnRhZ2UuICovCi0JCQlSU1NJID0gb2RtX1F1ZXJ5UnhQd3JQZXJjZW50YWdlKHJ4X3B3cltpXSk7Ci0JCQl0b3RhbF9yc3NpICs9IFJTU0k7Ci0KLQkJCS8qIE1vZGlmaWNhdGlvbiBmb3IgZXh0LUxOQSBib2FyZCAqLwotCQkJaWYgKHBETV9PZG0tPkJvYXJkVHlwZSA9PSBPRE1fQk9BUkRfSElHSFBXUikgewotCQkJCWlmICgocFBoeVN0YVJwdC0+cGF0aF9hZ2NbaV0udHJzdykgPT0gMSkKLQkJCQkJUlNTSSA9IChSU1NJID4gOTQpID8gMTAwIDogKFJTU0krNik7Ci0JCQkJZWxzZQotCQkJCQlSU1NJID0gKFJTU0kgPD0gMTYpID8gKFJTU0k+PjMpIDogKFJTU0ktMTYpOwotCi0JCQkJaWYgKChSU1NJIDw9IDM0KSAmJiAoUlNTSSA+PSA0KSkKLQkJCQkJUlNTSSAtPSA0OwotCQkJfQotCi0JCQlwUGh5SW5mby0+UnhNSU1PU2lnbmFsU3RyZW5ndGhbaV0gPSAodTgpIFJTU0k7Ci0KLQkJCS8qIEdldCBSeCBzbnIgdmFsdWUgaW4gREIgKi8KLQkJCXBQaHlJbmZvLT5SeFNOUltpXSA9IHBETV9PZG0tPlBoeURiZ0luZm8uUnhTTlJkQltpXSA9IChzMzIpKHBQaHlTdGFScHQtPnBhdGhfcnhzbnJbaV0vMik7Ci0JCX0KLQotCQkvKiAgKDIpUFdEQiwgQXZlcmFnZSBQV0RCIGNhY2x1YXRlZCBieSBoYXJkd2FyZSAoZm9yIHJhdGUgYWRhcHRpdmUpICovCi0JCXJ4X3B3cl9hbGwgPSAoKChwUGh5U3RhUnB0LT5jY2tfc2lnX3F1YWxfb2ZkbV9wd2RiX2FsbCkgPj4gMSkgJiAweDdmKS0xMTA7Ci0KLQkJUFdEQl9BTEwgPSBvZG1fUXVlcnlSeFB3clBlcmNlbnRhZ2UocnhfcHdyX2FsbCk7Ci0JCVBXREJfQUxMX0JUID0gUFdEQl9BTEw7Ci0KLQkJcFBoeUluZm8tPlJ4UFdEQkFsbCA9IFBXREJfQUxMOwotCQlwUGh5SW5mby0+QlRSeFJTU0lQZXJjZW50YWdlID0gUFdEQl9BTExfQlQ7Ci0JCXBQaHlJbmZvLT5SeFBvd2VyID0gcnhfcHdyX2FsbDsKLQkJcFBoeUluZm8tPlJlY3ZTaWduYWxQb3dlciA9IHJ4X3B3cl9hbGw7Ci0KLQkJLyogICgzKUVWTSBvZiBIVCByYXRlICovCi0JCWlmIChwUGt0aW5mby0+UmF0ZSA+PSBERVNDOTJDX1JBVEVNQ1M4ICYmIHBQa3RpbmZvLT5SYXRlIDw9IERFU0M5MkNfUkFURU1DUzE1KQotCQkJTWF4X3NwYXRpYWxfc3RyZWFtID0gMjsgLyogYm90aCBzcGF0aWFsIHN0cmVhbSBtYWtlIHNlbnNlICovCi0JCWVsc2UKLQkJCU1heF9zcGF0aWFsX3N0cmVhbSA9IDE7IC8qIG9ubHkgc3BhdGlhbCBzdHJlYW0gMSBtYWtlcyBzZW5zZSAqLwotCi0JCWZvciAoaSA9IDA7IGkgPCBNYXhfc3BhdGlhbF9zdHJlYW07IGkrKykgewotCQkJLyogIERvIG5vdCB1c2Ugc2hpZnQgb3BlcmF0aW9uIGxpa2UgInJ4X2V2bVggPj49IDEiIGJlY2F1c2UgdGhlIGNvbXBpbG9yIG9mIGZyZWUgYnVpbGQgZW52aXJvbm1lbnQgKi8KLQkJCS8qICBmaWxsIG1vc3Qgc2lnbmlmaWNhbnQgYml0IHRvICJ6ZXJvIiB3aGVuIGRvaW5nIHNoaWZ0aW5nIG9wZXJhdGlvbiB3aGljaCBtYXkgY2hhbmdlIGEgbmVnYXRpdmUgKi8KLQkJCS8qICB2YWx1ZSB0byBwb3NpdGl2ZSBvbmUsIHRoZW4gdGhlIGRibSB2YWx1ZSAod2hpY2ggaXMgc3VwcG9zZWQgdG8gYmUgbmVnYXRpdmUpICBpcyBub3QgY29ycmVjdCBhbnltb3JlLiAqLwotCQkJRVZNID0gb2RtX0VWTWRiVG9QZXJjZW50YWdlKChwUGh5U3RhUnB0LT5zdHJlYW1fcnhldm1baV0pKTsJLyogZGJtICovCi0KLQkJCWlmIChwUGt0aW5mby0+YlBhY2tldE1hdGNoQlNTSUQpIHsKLQkJCQlpZiAoaSA9PSBSRl9QQVRIX0EpIHsKLQkJCQkJLyogIEZpbGwgdmFsdWUgaW4gUkZELCBHZXQgdGhlIGZpcnN0IHNwYXRpYWwgc3RyZWFtIG9ubHkgKi8KLQkJCQkJcFBoeUluZm8tPlNpZ25hbFF1YWxpdHkgPSAodTgpKEVWTSAmIDB4ZmYpOwotCQkJCX0KLQkJCQlwUGh5SW5mby0+UnhNSU1PU2lnbmFsUXVhbGl0eVtpXSA9ICh1OCkoRVZNICYgMHhmZik7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyogVUkgQlNTIExpc3Qgc2lnbmFsIHN0cmVuZ3RoKGluIHBlcmNlbnRhZ2UpLCBtYWtlIGl0IGdvb2QgbG9va2luZywgZnJvbSAwfjEwMC4gKi8KLQkvKiBJdCBpcyBhc3NpZ25lZCB0byB0aGUgQlNTIExpc3QgaW4gR2V0VmFsdWVGcm9tQmVhY29uT3JQcm9iZVJzcCgpLiAqLwotCWlmIChpc0NDS3JhdGUpIHsKLQkJcFBoeUluZm8tPlNpZ25hbFN0cmVuZ3RoID0gKHU4KShvZG1fU2lnbmFsU2NhbGVNYXBwaW5nKHBETV9PZG0sIFBXREJfQUxMKSk7LyogUFdEQl9BTEw7ICovCi0JfSBlbHNlIHsKLQkJaWYgKHJmX3J4X251bSAhPSAwKQotCQkJcFBoeUluZm8tPlNpZ25hbFN0cmVuZ3RoID0gKHU4KShvZG1fU2lnbmFsU2NhbGVNYXBwaW5nKHBETV9PZG0sIHRvdGFsX3Jzc2kgLz0gcmZfcnhfbnVtKSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBvZG1fUHJvY2Vzc19SU1NJRm9yRE0oc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLAotCQkJCSAgc3RydWN0IHBoeV9pbmZvICpwUGh5SW5mbywKLQkJCQkgIHN0cnVjdCBvZG1fcGFja2V0X2luZm8gKnBQa3RpbmZvKQotewotCXMzMiBVbmRlY29yYXRlZFNtb290aGVkUFdEQiwgVW5kZWNvcmF0ZWRTbW9vdGhlZENDSzsKLQlzMzIgVW5kZWNvcmF0ZWRTbW9vdGhlZE9GRE0sIFJTU0lfQXZlOwotCXU4IGlzQ0NLcmF0ZSA9IDA7Ci0JdTggUlNTSV9tYXgsIFJTU0lfbWluLCBpOwotCXUzMiBPRkRNX3BrdCA9IDA7Ci0JdTMyIFdlaWdodGluZyA9IDA7Ci0Jc3RydWN0IHN0YV9pbmZvICpwRW50cnk7Ci0KLQlpZiAocFBrdGluZm8tPlN0YXRpb25JRCA9PSAweEZGKQotCQlyZXR1cm47Ci0KLQlwRW50cnkgPSBwRE1fT2RtLT5wT0RNX1N0YUluZm9bcFBrdGluZm8tPlN0YXRpb25JRF07Ci0JaWYgKCFwRW50cnkpCi0JCXJldHVybjsKLQlpZiAoKCFwUGt0aW5mby0+YlBhY2tldE1hdGNoQlNTSUQpKQotCQlyZXR1cm47Ci0KLQlpc0NDS3JhdGUgPSAocFBrdGluZm8tPlJhdGUgPD0gREVTQzkyQ19SQVRFMTFNKSA/IHRydWUgOiBmYWxzZTsKLQotCS8qIFNtYXJ0IEFudGVubmEgRGVidWcgTWVzc2FnZS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQlVbmRlY29yYXRlZFNtb290aGVkQ0NLID0gIHBFbnRyeS0+cnNzaV9zdGF0LlVuZGVjb3JhdGVkU21vb3RoZWRDQ0s7Ci0JVW5kZWNvcmF0ZWRTbW9vdGhlZE9GRE0gPSBwRW50cnktPnJzc2lfc3RhdC5VbmRlY29yYXRlZFNtb290aGVkT0ZETTsKLQlVbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IHBFbnRyeS0+cnNzaV9zdGF0LlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOwotCi0JaWYgKHBQa3RpbmZvLT5iUGFja2V0VG9TZWxmIHx8IHBQa3RpbmZvLT5iUGFja2V0QmVhY29uKSB7Ci0JCWlmICghaXNDQ0tyYXRlKSB7IC8qIG9mZG0gcmF0ZSAqLwotCQkJaWYgKHBQaHlJbmZvLT5SeE1JTU9TaWduYWxTdHJlbmd0aFtSRl9QQVRIX0JdID09IDApIHsKLQkJCQlSU1NJX0F2ZSA9IHBQaHlJbmZvLT5SeE1JTU9TaWduYWxTdHJlbmd0aFtSRl9QQVRIX0FdOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAocFBoeUluZm8tPlJ4TUlNT1NpZ25hbFN0cmVuZ3RoW1JGX1BBVEhfQV0gPiBwUGh5SW5mby0+UnhNSU1PU2lnbmFsU3RyZW5ndGhbUkZfUEFUSF9CXSkgewotCQkJCQlSU1NJX21heCA9IHBQaHlJbmZvLT5SeE1JTU9TaWduYWxTdHJlbmd0aFtSRl9QQVRIX0FdOwotCQkJCQlSU1NJX21pbiA9IHBQaHlJbmZvLT5SeE1JTU9TaWduYWxTdHJlbmd0aFtSRl9QQVRIX0JdOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVJTU0lfbWF4ID0gcFBoeUluZm8tPlJ4TUlNT1NpZ25hbFN0cmVuZ3RoW1JGX1BBVEhfQl07Ci0JCQkJCVJTU0lfbWluID0gcFBoeUluZm8tPlJ4TUlNT1NpZ25hbFN0cmVuZ3RoW1JGX1BBVEhfQV07Ci0JCQkJfQotCQkJCWlmICgoUlNTSV9tYXggLSBSU1NJX21pbikgPCAzKQotCQkJCQlSU1NJX0F2ZSA9IFJTU0lfbWF4OwotCQkJCWVsc2UgaWYgKChSU1NJX21heCAtIFJTU0lfbWluKSA8IDYpCi0JCQkJCVJTU0lfQXZlID0gUlNTSV9tYXggLSAxOwotCQkJCWVsc2UgaWYgKChSU1NJX21heCAtIFJTU0lfbWluKSA8IDEwKQotCQkJCQlSU1NJX0F2ZSA9IFJTU0lfbWF4IC0gMjsKLQkJCQllbHNlCi0JCQkJCVJTU0lfQXZlID0gUlNTSV9tYXggLSAzOwotCQkJfQotCi0JCQkvKiAxIFByb2Nlc3MgT0ZETSBSU1NJICovCi0JCQlpZiAoVW5kZWNvcmF0ZWRTbW9vdGhlZE9GRE0gPD0gMCkgewotCQkJCS8qICBpbml0aWFsaXplICovCi0JCQkJVW5kZWNvcmF0ZWRTbW9vdGhlZE9GRE0gPSBwUGh5SW5mby0+UnhQV0RCQWxsOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAocFBoeUluZm8tPlJ4UFdEQkFsbCA+ICh1MzIpVW5kZWNvcmF0ZWRTbW9vdGhlZE9GRE0pIHsKLQkJCQkJVW5kZWNvcmF0ZWRTbW9vdGhlZE9GRE0gPQotCQkJCQkJCSgoKFVuZGVjb3JhdGVkU21vb3RoZWRPRkRNKSooUnhfU21vb3RoX0ZhY3Rvci0xKSkgKwotCQkJCQkJCShSU1NJX0F2ZSkpIC8gKFJ4X1Ntb290aF9GYWN0b3IpOwotCQkJCQlVbmRlY29yYXRlZFNtb290aGVkT0ZETSA9IFVuZGVjb3JhdGVkU21vb3RoZWRPRkRNICsgMTsKLQkJCQl9IGVsc2UgewotCQkJCQlVbmRlY29yYXRlZFNtb290aGVkT0ZETSA9Ci0JCQkJCQkJKCgoVW5kZWNvcmF0ZWRTbW9vdGhlZE9GRE0pKihSeF9TbW9vdGhfRmFjdG9yLTEpKSArCi0JCQkJCQkJKFJTU0lfQXZlKSkgLyAoUnhfU21vb3RoX0ZhY3Rvcik7Ci0JCQkJfQotCQkJfQotCQkJcEVudHJ5LT5yc3NpX3N0YXQuUGFja2V0TWFwID0KLQkJCQkocEVudHJ5LT5yc3NpX3N0YXQuUGFja2V0TWFwPDwxKSB8IEJJVCgwKTsKLQkJfSBlbHNlIHsKLQkJCVJTU0lfQXZlID0gcFBoeUluZm8tPlJ4UFdEQkFsbDsKLQotCQkJLyogMSBQcm9jZXNzIENDSyBSU1NJICovCi0JCQlpZiAoVW5kZWNvcmF0ZWRTbW9vdGhlZENDSyA8PSAwKSB7Ci0JCQkJLyogIGluaXRpYWxpemUgKi8KLQkJCQlVbmRlY29yYXRlZFNtb290aGVkQ0NLID0gcFBoeUluZm8tPlJ4UFdEQkFsbDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHBQaHlJbmZvLT5SeFBXREJBbGwgPiAodTMyKVVuZGVjb3JhdGVkU21vb3RoZWRDQ0spIHsKLQkJCQkJVW5kZWNvcmF0ZWRTbW9vdGhlZENDSyA9Ci0JCQkJCQkJKCgoVW5kZWNvcmF0ZWRTbW9vdGhlZENDSykqKFJ4X1Ntb290aF9GYWN0b3ItMSkpICsKLQkJCQkJCQkocFBoeUluZm8tPlJ4UFdEQkFsbCkpIC8gKFJ4X1Ntb290aF9GYWN0b3IpOwotCQkJCQlVbmRlY29yYXRlZFNtb290aGVkQ0NLID0gVW5kZWNvcmF0ZWRTbW9vdGhlZENDSyArIDE7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJVW5kZWNvcmF0ZWRTbW9vdGhlZENDSyA9Ci0JCQkJCQkJKCgoVW5kZWNvcmF0ZWRTbW9vdGhlZENDSykqKFJ4X1Ntb290aF9GYWN0b3ItMSkpICsKLQkJCQkJCQkocFBoeUluZm8tPlJ4UFdEQkFsbCkpIC8gKFJ4X1Ntb290aF9GYWN0b3IpOwotCQkJCX0KLQkJCX0KLQkJCXBFbnRyeS0+cnNzaV9zdGF0LlBhY2tldE1hcCA9IHBFbnRyeS0+cnNzaV9zdGF0LlBhY2tldE1hcDw8MTsKLQkJfQotCi0JCS8qIDIwMTEuMDcuMjggTHVrZUxlZTogbW9kaWZpZWQgdG8gcHJldmVudCB1bnN0YWJsZSBDQ0sgUlNTSSAqLwotCQlpZiAocEVudHJ5LT5yc3NpX3N0YXQuVmFsaWRCaXQgPj0gNjQpCi0JCQlwRW50cnktPnJzc2lfc3RhdC5WYWxpZEJpdCA9IDY0OwotCQllbHNlCi0JCQlwRW50cnktPnJzc2lfc3RhdC5WYWxpZEJpdCsrOwotCi0JCWZvciAoaSA9IDA7IGkgPCBwRW50cnktPnJzc2lfc3RhdC5WYWxpZEJpdDsgaSsrKQotCQkJT0ZETV9wa3QgKz0KLQkJCQkodTgpKHBFbnRyeS0+cnNzaV9zdGF0LlBhY2tldE1hcD4+aSkgJiBCSVQoMCk7Ci0KLQkJaWYgKHBFbnRyeS0+cnNzaV9zdGF0LlZhbGlkQml0ID09IDY0KSB7Ci0JCQlXZWlnaHRpbmcgPSAoKE9GRE1fcGt0PDw0KSA+IDY0KT82NDooT0ZETV9wa3Q8PDQpOwotCQkJVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPSAoV2VpZ2h0aW5nKlVuZGVjb3JhdGVkU21vb3RoZWRPRkRNKyg2NC1XZWlnaHRpbmcpKlVuZGVjb3JhdGVkU21vb3RoZWRDQ0spPj42OwotCQl9IGVsc2UgewotCQkJaWYgKHBFbnRyeS0+cnNzaV9zdGF0LlZhbGlkQml0ICE9IDApCi0JCQkJVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPSAoT0ZETV9wa3QqVW5kZWNvcmF0ZWRTbW9vdGhlZE9GRE0rKHBFbnRyeS0+cnNzaV9zdGF0LlZhbGlkQml0LU9GRE1fcGt0KSpVbmRlY29yYXRlZFNtb290aGVkQ0NLKS9wRW50cnktPnJzc2lfc3RhdC5WYWxpZEJpdDsKLQkJCWVsc2UKLQkJCQlVbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IDA7Ci0JCX0KLQkJcEVudHJ5LT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZENDSyA9IFVuZGVjb3JhdGVkU21vb3RoZWRDQ0s7Ci0JCXBFbnRyeS0+cnNzaV9zdGF0LlVuZGVjb3JhdGVkU21vb3RoZWRPRkRNID0gVW5kZWNvcmF0ZWRTbW9vdGhlZE9GRE07Ci0JCXBFbnRyeS0+cnNzaV9zdGF0LlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID0gVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7Ci0JfQotfQotCi12b2lkIE9ETV9QaHlTdGF0dXNRdWVyeTIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHN0cnVjdCBwaHlfaW5mbyAqcFBoeUluZm8sCi0JCQkgICB1OCAqcFBoeVN0YXR1cywgc3RydWN0IG9kbV9wYWNrZXRfaW5mbyAqcFBrdGluZm8pCi17Ci0Jb2RtX1J4UGh5U3RhdHVzOTJDU2VyaWVzX1BhcnNpbmcocERNX09kbSwgcFBoeUluZm8sCi0JCQkJCSBwUGh5U3RhdHVzLCBwUGt0aW5mbyk7Ci0KLQlvZG1fUHJvY2Vzc19SU1NJRm9yRE0ocERNX09kbSwgcFBoeUluZm8sIHBQa3RpbmZvKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL29kbV9SZWdDb25maWc4NzIzQS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX1JlZ0NvbmZpZzg3MjNBLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2M2M2Y2IuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX1JlZ0NvbmZpZzg3MjNBLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm9kbV9wcmVjb21wLmgiCi0jaW5jbHVkZSAidXNiX29wc19saW51eC5oIgotCi12b2lkCi1vZG1fQ29uZmlnUkZSZWdfODcyM0EoCi0Jc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLAotCXUzMgkJCQkJQWRkciwKLQl1MzIJCQkJCURhdGEsCi0JZW51bSBSRl9SQURJT19QQVRIICAgICBSRl9QQVRILAotCXUzMgkJCQkgICAgUmVnQWRkcgotCSkKLXsKLQlpZiAoQWRkciA9PSAweGZlKSB7Ci0JCW1zbGVlcCg1MCk7Ci0JfSBlbHNlIGlmIChBZGRyID09IDB4ZmQpIHsKLQkJbWRlbGF5KDUpOwotCX0gZWxzZSBpZiAoQWRkciA9PSAweGZjKSB7Ci0JCW1kZWxheSgxKTsKLQl9IGVsc2UgaWYgKEFkZHIgPT0gMHhmYikgewotCQl1ZGVsYXkoNTApOwotCX0gZWxzZSBpZiAoQWRkciA9PSAweGZhKSB7Ci0JCXVkZWxheSg1KTsKLQl9IGVsc2UgaWYgKEFkZHIgPT0gMHhmOSkgewotCQl1ZGVsYXkoMSk7Ci0JfSBlbHNlIHsKLQkJT0RNX1NldFJGUmVnKHBETV9PZG0sIFJGX1BBVEgsIFJlZ0FkZHIsIGJSRlJlZ09mZnNldE1hc2ssIERhdGEpOwotCQkvKiAgQWRkIDF1cyBkZWxheSBiZXR3ZWVuIEJCL1JGIHJlZ2lzdGVyIHNldHRpbmcuICovCi0JCXVkZWxheSgxKTsKLQl9Ci19Ci0KLXZvaWQgb2RtX0NvbmZpZ01BQ184NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBhZGRyLCB1OAlkYXRhKQotewotCXJ0bDg3MjNhdV93cml0ZTgocERNX09kbS0+QWRhcHRlciwgYWRkciwgZGF0YSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0lOSVQsIE9ETV9EQkdfTE9VRCwKLQkJICAgICAoIj09PT4gJXM6IFtNQUNfUkVHXSAlMDhYICUwOFhcbiIsIF9fZnVuY19fLCBhZGRyLCBkYXRhKSk7Ci19Ci0KLXZvaWQgb2RtX0NvbmZpZ0JCX0FHQ184NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBhZGRyLCB1MzIgZGF0YSkKLXsKLQlydGw4NzIzYXVfd3JpdGUzMihwRE1fT2RtLT5BZGFwdGVyLCBhZGRyLCBkYXRhKTsKLQkvKiAgQWRkIDF1cyBkZWxheSBiZXR3ZWVuIEJCL1JGIHJlZ2lzdGVyIHNldHRpbmcuICovCi0JdWRlbGF5KDEpOwotCi0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0lOSVQsIE9ETV9EQkdfTE9VRCwKLQkJICAgICAoIj09PT4gJXM6IFtBR0NfVEFCXSAlMDhYICUwOFhcbiIsIF9fZnVuY19fLCBhZGRyLCBkYXRhKSk7Ci19Ci0KLXZvaWQKLW9kbV9Db25maWdCQl9QSFlfODcyM0Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1MzIgYWRkciwgdTMyIGRhdGEpCi17Ci0JaWYgKGFkZHIgPT0gMHhmZSkKLQkJbXNsZWVwKDUwKTsKLQllbHNlIGlmIChhZGRyID09IDB4ZmQpCi0JCW1kZWxheSg1KTsKLQllbHNlIGlmIChhZGRyID09IDB4ZmMpCi0JCW1kZWxheSgxKTsKLQllbHNlIGlmIChhZGRyID09IDB4ZmIpCi0JCXVkZWxheSg1MCk7Ci0JZWxzZSBpZiAoYWRkciA9PSAweGZhKQotCQl1ZGVsYXkoNSk7Ci0JZWxzZSBpZiAoYWRkciA9PSAweGY5KQotCQl1ZGVsYXkoMSk7Ci0JZWxzZSBpZiAoYWRkciA9PSAweGEyNCkKLQkJcERNX09kbS0+UkZDYWxpYnJhdGVJbmZvLlJlZ0EyNCA9IGRhdGE7Ci0JcnRsODcyM2F1X3dyaXRlMzIocERNX09kbS0+QWRhcHRlciwgYWRkciwgZGF0YSk7Ci0KLQkvKiAgQWRkIDF1cyBkZWxheSBiZXR3ZWVuIEJCL1JGIHJlZ2lzdGVyIHNldHRpbmcuICovCi0JdWRlbGF5KDEpOwotCi0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0lOSVQsIE9ETV9EQkdfTE9VRCwKLQkJICAgICAoIj09PT4gJXM6IFtQSFlfUkVHXSAlMDhYICUwOFhcbiIsIF9fZnVuY19fLCBhZGRyLCBkYXRhKSk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG1fZGVidWcuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL29kbV9kZWJ1Zy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjJiZGRhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL29kbV9kZWJ1Zy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJvZG1fcHJlY29tcC5oIgotCi12b2lkIE9ETV9Jbml0RGVidWdTZXR0aW5nMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKLQlwRE1fT2RtLT5EZWJ1Z0xldmVsID0gT0RNX0RCR19UUkFDRTsKLQlwRE1fT2RtLT5EZWJ1Z0NvbXBvbmVudHMgPSAwOwotfQotCi11MzIgR2xvYmFsRGVidWdMZXZlbDIzQTsKLQotdm9pZCBydF90cmFjZShpbnQgY29tcCwgaW50IGxldmVsLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLQlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsKLQl2YV9saXN0IGFyZ3M7Ci0KLQl2YV9zdGFydChhcmdzLCBmbXQpOwotCi0JdmFmLmZtdCA9IGZtdDsKLQl2YWYudmEgPSAmYXJnczsKLQotCXByX2luZm8oRFJJVkVSX1BSRUZJWCAiIFsweCUwOHgsJWRdICVwViIsIGNvbXAsIGxldmVsLCAmdmFmKTsKLQotCXZhX2VuZChhcmdzKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL29kbV9pbnRlcmZhY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL29kbV9pbnRlcmZhY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhmNjc5MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG1faW50ZXJmYWNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogICovCi0vKiAgaW5jbHVkZSBmaWxlcyAqLwotLyogICovCi0KLSNpbmNsdWRlICJvZG1fcHJlY29tcC5oIgotLyogICovCi0vKiAgT0RNIElPIFJlbGF0aXZlIEFQSS4gKi8KLS8qICAqLwotI2luY2x1ZGUgPHVzYl9vcHNfbGludXguaD4KLQotdm9pZCBPRE1fU2V0UkZSZWcoCi0Jc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLAotCWVudW0gUkZfUkFESU9fUEFUSAllUkZQYXRoLAotCXUzMgkJCQlSZWdBZGRyLAotCXUzMgkJCQlCaXRNYXNrLAotCXUzMgkJCQlEYXRhCi0JKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0KLQlQSFlfU2V0UkZSZWcoQWRhcHRlciwgZVJGUGF0aCwgUmVnQWRkciwgQml0TWFzaywgRGF0YSk7Ci19Ci0KLXUzMiBPRE1fR2V0UkZSZWcoCi0Jc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLAotCWVudW0gUkZfUkFESU9fUEFUSAllUkZQYXRoLAotCXUzMgkJCQlSZWdBZGRyLAotCXUzMgkJCQlCaXRNYXNrCi0JKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0KLQlyZXR1cm4gUEhZX1F1ZXJ5UkZSZWcoQWRhcHRlciwgZVJGUGF0aCwgUmVnQWRkciwgQml0TWFzayk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9idC1jb2V4aXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9idC1jb2V4aXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2JkN2EuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfYnQtY29leGlzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEyNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICpwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLSNpbmNsdWRlIDxydGw4NzIzYV9oYWwuaD4KLSNpbmNsdWRlIDx1c2Jfb3BzX2xpbnV4Lmg+Ci0KLSNkZWZpbmUgRElTX1BTX1JYX0JDTgotCi11MzIgQlRDb2V4RGJnTGV2ZWwgPSBfYnRfZGJnX29mZl87Ci0KLSNkZWZpbmUgUlRQUklOVChfQ29tcCwgX0xldmVsLCBGbXQpXAotZG8ge1wKLQlpZiAoKEJUQ29leERiZ0xldmVsID09IF9idF9kYmdfb25fKSkge1wKLQkJcHJpbnRrIEZtdDtcCi0JfQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBSVFBSSU5UX0FERFIoZGJndHlwZSwgZGJnZmxhZywgcHJpbnRzdHIsIF9QdHIpXAotaWYgKChCVENvZXhEYmdMZXZlbCA9PSBfYnRfZGJnX29uXykpIHtcCi0JdTMyIF9faTsJCQkJCQlcCi0JdTggKnB0ciA9ICh1OCAqKV9QdHI7CVwKLQlwcmludGsgcHJpbnRzdHI7CQkJCVwKLQlwcmludGsoIiAiKTsJCQkJCVwKLQlmb3IgKF9faSA9IDA7IF9faSA8IDY7IF9faSsrKQkJXAotCQlwcmludGsoIiUwMlglcyIsIHB0cltfX2ldLCAoX19pID09IDUpPyIiOiItIik7CQlcCi0JcHJpbnRrKCJcbiIpOwkJCQkJCQlcCi19Ci0jZGVmaW5lIFJUUFJJTlRfREFUQShkYmd0eXBlLCBkYmdmbGFnLCBfVGl0bGVTdHJpbmcsIF9IZXhEYXRhLCBfSGV4RGF0YUxlbilcCi1pZiAoKEJUQ29leERiZ0xldmVsID09IF9idF9kYmdfb25fKSkge1wKLQl1MzIgX19pOwkJCQkJCVwKLQl1OCAqcHRyID0gKHU4ICopX0hleERhdGE7CQkJCVwKLQlwcmludGsoX1RpdGxlU3RyaW5nKTsJCQkJCVwKLQlmb3IgKF9faSA9IDA7IF9faSA8ICh1MzIpX0hleERhdGFMZW47IF9faSsrKSB7CQlcCi0JCXByaW50aygiJTAyWCVzIiwgcHRyW19faV0sICgoKF9faSArIDEpICUgNCkgPT0gMCk/IiAgIjoiICIpO1wKLQkJaWYgKCgoX19pICsgMSkgJSAxNikgPT0gMCkJCQlcCi0JCQlwcmludGsoIlxuIik7CQkJCVwKLQl9CQkJCQkJCQlcCi0JcHJpbnRrKCJcbiIpOwkJCQkJCQlcCi19Ci0vKiAgQWRkZWQgYnkgQW5uaWUsIDIwMDUtMTEtMjIuICovCi0jZGVmaW5lIE1BWF9TVFJfTEVOCTY0Ci0vKiAgSSB3YW50IHRvIHNlZSBBU0NJSSAzMyB0byAxMjYgb25seS4gT3RoZXJ3aXNlLCBJIHByaW50ICc/Jy4gKi8KLSNkZWZpbmUgUFJJTlRBQkxFKF9jaCkJKF9jaCA+PSAnICcgJiYgX2NoIDw9ICd+JykKLSNkZWZpbmUgUlRfUFJJTlRfU1RSKF9Db21wLCBfTGV2ZWwsIF9UaXRsZVN0cmluZywgX1B0ciwgX0xlbikJCVwKLQl7CQkJCQkJCQlcCi0JCXUzMiBfX2k7CQkJCQkJXAotCQl1OCBidWZmZXJbTUFYX1NUUl9MRU5dOwkJCQkJXAotCQl1MzIgbGVuZ3RoID0gKF9MZW4gPCBNQVhfU1RSX0xFTikgPyBfTGVuIDogKE1BWF9TVFJfTEVOLTEpO1wKLQkJbWVtc2V0KGJ1ZmZlciwgMCwgTUFYX1NUUl9MRU4pOwkJCQlcCi0JCW1lbWNweShidWZmZXIsICh1OCAqKV9QdHIsIGxlbmd0aCk7CQkJXAotCQlmb3IgKF9faSA9IDA7IF9faSA8IGxlbmd0aDsgX19pKyspIHsJCQlcCi0JCQlpZiAoIVBSSU5UQUJMRShidWZmZXJbX19pXSkpCQkJXAotCQkJCWJ1ZmZlcltfX2ldID0gJz8nOwkJCVwKLQkJfQkJCQkJCQlcCi0JCWJ1ZmZlcltsZW5ndGhdID0gJ1wwJzsJCQkJCVwKLQkJcHJpbnRrKF9UaXRsZVN0cmluZyk7CQkJCQlcCi0JCXByaW50aygiOiAlZCwgPCVzPlxuIiwgX0xlbiwgYnVmZmVyKTsJCQlcCi0JfQotCi0jZGVmaW5lIERDTURfUHJpbnRmKC4uLikKLSNkZWZpbmUgUlRfQVNTRVJUKC4uLikKLQotCi0jZGVmaW5lIEdldERlZmF1bHRBZGFwdGVyKHBhZGFwdGVyKQlwYWRhcHRlcgotCi0jZGVmaW5lIFBsYXRmb3JtWmVyb01lbW9yeShwdHIsIHN6KQltZW1zZXQocHRyLCAwLCBzeikKLQotI2RlZmluZSBHRVRfVU5ERUNPUkFURURfQVZFUkFHRV9SU1NJKHBhZGFwdGVyKQlcCi0JCQkoR0VUX0hBTF9EQVRBKHBhZGFwdGVyKS0+ZG1wcml2LkVudHJ5TWluVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIpCi0jZGVmaW5lIFJUX1JGX0NIQU5HRV9TT1VSQ0UgdTMyCi0KLWVudW0gewotCVJUX0pPSU5fSU5GUkEgICA9IDEsCi0JUlRfSk9JTl9JQlNTICA9IDIsCi0JUlRfU1RBUlRfSUJTUyA9IDMsCi0JUlRfTk9fQUNUSU9OICA9IDQsCi19OwotCi0vKiAgcG93ZXIgc2F2aW5nICovCi0KLS8qICA9PT09PSBCZWxvdyB0aGlzIGxpbmUgaXMgc3luYyBmcm9tIFNENyBkcml2ZXIgQ09NTU9NL0JULmMgPT09PT0gKi8KLQotc3RhdGljIHU4IEJUX09wZXJhdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JaWYgKHBCdE1nbnQtPkJ0T3BlcmF0aW9uT24pCi0JCXJldHVybiB0cnVlOwotCWVsc2UKLQkJcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgdTggQlRfSXNMZWdhbENoYW5uZWwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggY2hhbm5lbCkKLXsKLQlzdHJ1Y3QgcnRfY2hhbm5lbF9pbmZvICpwQ2hhbm5lTGlzdCA9IE5VTEw7Ci0JdTggY2hhbm5lbExlbiwgaTsKLQotCXBDaGFubmVMaXN0ID0gcGFkYXB0ZXItPm1sbWVleHRwcml2LmNoYW5uZWxfc2V0OwotCWNoYW5uZWxMZW4gPSBwYWRhcHRlci0+bWxtZWV4dHByaXYubWF4X2NoYW5fbnVtczsKLQotCWZvciAoaSA9IDA7IGkgPCBjaGFubmVsTGVuOyBpKyspIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLAotCQkJKCJDaGVjayBpZiBjaG5sKCVkKSBpbiBjaGFubmVsIHBsYW4gY29udGFpbnMgYnQgdGFyZ2V0IGNobmwoJWQpIGZvciBCVCBjb25uZWN0aW9uXG4iLAotCQkJIHBDaGFubmVMaXN0W2ldLkNoYW5uZWxOdW0sIGNoYW5uZWwpKTsKLQkJaWYgKChjaGFubmVsID09IHBDaGFubmVMaXN0W2ldLkNoYW5uZWxOdW0pIHx8Ci0JCSAgICAoY2hhbm5lbCA9PSBwQ2hhbm5lTGlzdFtpXS5DaGFubmVsTnVtICsgMikpCi0JCQlyZXR1cm4gY2hhbm5lbDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgQlRfU2lnbmFsQ29tcGVuc2F0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpyc3NpX3dpZmksIHU4ICpyc3NpX2J0KQotewotCUJURE1fU2lnbmFsQ29tcGVuc2F0aW9uKHBhZGFwdGVyLCByc3NpX3dpZmksIHJzc2lfYnQpOwotfQotCi12b2lkIHJ0bDg3MjNhX0JUX3dpZmlzY2FuX25vdGlmeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBzY2FuVHlwZSkKLXsKLQlCVEhDSV9XaWZpU2Nhbk5vdGlmeShwYWRhcHRlciwgc2NhblR5cGUpOwotCUJURE1fQ2hlY2tBbnRTZWxNb2RlKHBhZGFwdGVyKTsKLQlCVERNX1dpZmlTY2FuTm90aWZ5KHBhZGFwdGVyLCBzY2FuVHlwZSk7Ci19Ci0KLXZvaWQgcnRsODcyM2FfQlRfd2lmaWFzc29jaWF0ZV9ub3RpZnkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYWN0aW9uKQotewotCS8qICBhY3Rpb24gOiAqLwotCS8qICB0cnVlID0gYXNzb2NpYXRlIHN0YXJ0ICovCi0JLyogIGZhbHNlID0gYXNzb2NpYXRlIGZpbmlzaGVkICovCi0JaWYgKGFjdGlvbikKLQkJQlRETV9DaGVja0FudFNlbE1vZGUocGFkYXB0ZXIpOwotCi0JQlRETV9XaWZpQXNzb2NpYXRlTm90aWZ5KHBhZGFwdGVyLCBhY3Rpb24pOwotfQotCi12b2lkIEJUX0hhbHRQcm9jZXNzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JQlRETV9Gb3JIYWx0KHBhZGFwdGVyKTsKLX0KLQotLyogID09PT09IEVuZCBvZiBzeW5jIGZyb20gU0Q3IGRyaXZlciBDT01NT00vQlQuYyA9PT09PSAqLwotCi0jZGVmaW5lIGk2NGZtdAkJImxsIgotI2RlZmluZSBVSU5UNjRfQyh2KSAgKHYpCi0KLSNkZWZpbmUgRmlsbE9jdGV0U3RyaW5nKF9vcywgX29jdGV0LCBfbGVuKQkJXAotCShfb3MpLk9jdGV0ID0gKHU4ICopKF9vY3RldCk7CQkJXAotCShfb3MpLkxlbmd0aCA9IChfbGVuKTsKLQotc3RhdGljIGVudW0gcnRfc3RhdHVzIFBsYXRmb3JtSW5kaWNhdGVCVEV2ZW50KAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jdm9pZAkJCQkJCSpwRXZudERhdGEsCi0JdTMyCQkJCQkJZGF0YUxlbgotCSkKLXsKLQllbnVtIHJ0X3N0YXR1cwlydF9zdGF0dXMgPSBSVF9TVEFUVVNfRkFJTFVSRTsKLQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVF9ERVRBSUwsICgiQlQgZXZlbnQgc3RhcnQsICVkIGJ5dGVzIGRhdGEgdG8gVHJhbnNmZXJyZWQhIVxuIiwgZGF0YUxlbikpOwotCVJUUFJJTlRfREFUQShGSU9DVEwsIElPQ1RMX0JUX0VWRU5UX0RFVEFJTCwgIlRvIHRyYW5zZmVyIEhleCBEYXRhIDpcbiIsCi0JCXBFdm50RGF0YSwgZGF0YUxlbik7Ci0KLQlCVF9FdmVudFBhcnNlKHBhZGFwdGVyLCBwRXZudERhdGEsIGRhdGFMZW4pOwotCi0JcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IExpbnV4IGhhcyBubyB3YXkgdG8gcmVwb3J0IEJUIGV2ZW50ISFcbiIsIF9fZnVuY19fKTsKLQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVF9ERVRBSUwsICgiQlQgZXZlbnQgZW5kLCAlc1xuIiwKLQkJKHJ0X3N0YXR1cyA9PSBSVF9TVEFUVVNfU1VDQ0VTUykgPyAiU1VDQ0VTUyIgOiAiRkFJTCIpKTsKLQotCXJldHVybiBydF9zdGF0dXM7Ci19Ci0KLS8qICA9PT09PSBCZWxvdyB0aGlzIGxpbmUgaXMgc3luYyBmcm9tIFNENyBkcml2ZXIgQ09NTU9NL2J0X2hjaS5jID09PT09ICovCi0KLXN0YXRpYyB1OCBidGhjaV9HZXRMb2NhbENoYW5uZWwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlyZXR1cm4gcGFkYXB0ZXItPm1sbWVleHRwcml2LmN1cl9jaGFubmVsOwotfQotCi1zdGF0aWMgdTggYnRoY2lfR2V0Q3VycmVudEVudHJ5TnVtKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IFBoeUhhbmRsZSkKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXU4IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0JUX0FTT0NfRU5UUllfTlVNOyBpKyspIHsKLQkJaWYgKChwQlRJbmZvLT5CdEFzb2NFbnRyeVtpXS5iVXNlZCkgJiYKLQkJICAgIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtpXS5QaHlMaW5rQ21kRGF0YS5CdFBoeUxpbmtoYW5kbGUgPT0gUGh5SGFuZGxlKSkKLQkJCXJldHVybiBpOwotCX0KLQotCXJldHVybiAweEZGOwotfQotCi1zdGF0aWMgdm9pZCBidGhjaV9EZWNpZGVCVENoYW5uZWwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggRW50cnlOdW0pCi17Ci0vKlBNR05UX0lORk8gcE1nbnRJbmZvID0gJnBhZGFwdGVyLT5NZ250SW5mbzsgKi8KLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXY7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbzsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudDsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm87Ci0Jc3RydWN0IGNobmxfdHhwb3dlcl90cmlwbGUgKnBUcmlwbGVfc3ViYmFuZCA9IE5VTEw7Ci0Jc3RydWN0IGNvbW1vbl90cmlwbGUgKnBUcmlwbGU7Ci0JdTggaSwgaiwgbG9jYWxjaG5sLCBmaXJzdFJlbW90ZUxlZ2FsQ2hubEluVHJpcGxldCA9IDA7Ci0JdTggcmVndWxhdG9yeV9za2lwTGVuID0gMDsKLQl1OCBzdWJiYW5kVHJpcGxldENudCA9IDA7Ci0KLQlwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0JcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0JcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0KLQlwQnRNZ250LT5DaGVja0NobmxJc1N1aXQgPSB0cnVlOwotCWxvY2FsY2hubCA9IGJ0aGNpX0dldExvY2FsQ2hhbm5lbChwYWRhcHRlcik7Ci0KLQlwVHJpcGxlID0gKHN0cnVjdCBjb21tb25fdHJpcGxlICopCi0JCSZwQnRIY2lJbmZvLT5CVFByZUNobmxsaXN0W0NPVU5UUllfU1RSX0xFTl07Ci0KLQkvKiAgY29udGFpbnMgY291bnRyeSBzdHJpbmcsIGxlbiBpcyAzICovCi0JZm9yIChpID0gMDsgaSA8IChwQnRIY2lJbmZvLT5CdFByZUNobmxMaXN0TGVuLUNPVU5UUllfU1RSX0xFTik7IGkgKz0gMywgcFRyaXBsZSsrKSB7Ci0JCS8qICAqLwotCQkvKiAgY2hlY2sgZXZlcnkgdHJpcGxldCwgYW4gdHJpcGxldCBtYXkgYmUgKi8KLQkJLyogIHJlZ3VsYXRvcnkgZXh0ZW5zaW9uIGlkZW50aWZpZXIgb3Igc3ViLWJhbmQgdHJpcGxldCAqLwotCQkvKiAgKi8KLQkJaWYgKHBUcmlwbGUtPmJ5dGVfMXN0ID09IDB4YzkpIHsKLQkJCS8qICBSZWd1bGF0b3J5IEV4dGVuc2lvbiBJZGVudGlmaWVyLCBza2lwIGl0ICovCi0JCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwKLQkJCQkoIkZpbmQgUmVndWxhdG9yeSBJRCwgcmVndWxhdG9yeSBjbGFzcyA9ICVkXG4iLCBwVHJpcGxlLT5ieXRlXzJuZCkpOwotCQkJcmVndWxhdG9yeV9za2lwTGVuICs9IDM7Ci0JCQlwVHJpcGxlX3N1YmJhbmQgPSBOVUxMOwotCQkJY29udGludWU7Ci0JCX0gZWxzZSB7CS8qICBTdWItYmFuZCB0cmlwbGV0ICovCi0JCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCJGaW5kIFN1Yi1iYW5kIHRyaXBsZXQgXG4iKSk7Ci0JCQlzdWJiYW5kVHJpcGxldENudCsrOwotCQkJcFRyaXBsZV9zdWJiYW5kID0gKHN0cnVjdCBjaG5sX3R4cG93ZXJfdHJpcGxlICopcFRyaXBsZTsKLQkJCS8qICBpZiByZW1vdGUgZmlyc3QgbGVnYWwgY2hhbm5lbCBub3QgZm91bmQsIHRoZW4gZmluZCBmaXJzdCByZW1vdGUgY2hhbm5lbCAqLwotCQkJLyogIGFuZCBpdCdzIGxlZ2FsIGZvciBvdXIgY2hhbm5lbCBwbGFuLiAqLwotCi0JCQkvKiAgc2VhcmNoIHRoZSBzdWItYmFuZCB0cmlwbGV0IGFuZCBmaW5kIGlmIHJlbW90ZSBjaGFubmVsIGlzIGxlZ2FsIHRvIG91ciBjaGFubmVsIHBsYW4uICovCi0JCQlmb3IgKGogPSBwVHJpcGxlX3N1YmJhbmQtPkZpcnN0Q2hubDsgaiA8IChwVHJpcGxlX3N1YmJhbmQtPkZpcnN0Q2hubCtwVHJpcGxlX3N1YmJhbmQtPk51bUNobmxzKTsgaisrKSB7Ci0JCQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTUR8SU9DVExfQlRfTE9HTyksICgiIENoZWNrIGlmIGNobmwoJWQpIGlzIGxlZ2FsXG4iLCBqKSk7Ci0JCQkJaWYgKEJUX0lzTGVnYWxDaGFubmVsKHBhZGFwdGVyLCBqKSkgewotCQkJCQkvKiAgcmVtb3RlIGNoYW5uZWwgaXMgbGVnYWwgZm9yIG91ciBjaGFubmVsIHBsYW4uICovCi0JCQkJCWZpcnN0UmVtb3RlTGVnYWxDaG5sSW5UcmlwbGV0ID0gajsKLQkJCQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTUR8SU9DVExfQlRfTE9HTyksCi0JCQkJCQkoIkZpbmQgZmlyc3QgcmVtb3RlIGxlZ2FsIGNoYW5uZWwgOiAlZFxuIiwKLQkJCQkJCWZpcnN0UmVtb3RlTGVnYWxDaG5sSW5UcmlwbGV0KSk7Ci0KLQkJCQkJLyogIElmIHdlIGZpbmQgYSByZW1vdGUgbGVnYWwgY2hhbm5lbCBpbiB0aGUgc3ViLWJhbmQgdHJpcGxldCAqLwotCQkJCQkvKiAgYW5kIG9ubHkgQlQgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZChsb2NhbCBub3QgY29ubmVjdCB0byBhbnkgQVAgb3IgSUJTUyksICovCi0JCQkJCS8qICB0aGVuIHdlIGp1c3Qgc3dpdGNoIGNoYW5uZWwgdG8gcmVtb3RlIGNoYW5uZWwuICovCi0JCQkJCWlmICghKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FTT0NfU1RBVEV8V0lGSV9BREhPQ19TVEFURXxXSUZJX0FQX1NUQVRFKSB8fAotCQkJCQkgICAgQlRIQ0lfSHNDb25uZWN0aW9uRXN0YWJsaXNoZWQocGFkYXB0ZXIpKSkgewotCQkJCQkJcEJ0TWdudC0+QlRDaGFubmVsID0gZmlyc3RSZW1vdGVMZWdhbENobmxJblRyaXBsZXQ7Ci0JCQkJCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCJSZW1vdGUgbGVnYWwgY2hhbm5lbCAoJWQpIGlzIHNlbGVjdGVkLCBMb2NhbCBub3QgY29ubmVjdCB0byBhbnkhIVxuIiwgcEJ0TWdudC0+QlRDaGFubmVsKSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoKGxvY2FsY2hubCA+PSBmaXJzdFJlbW90ZUxlZ2FsQ2hubEluVHJpcGxldCkgJiYKLQkJCQkJCSAgICAobG9jYWxjaG5sIDwgKHBUcmlwbGVfc3ViYmFuZC0+Rmlyc3RDaG5sK3BUcmlwbGVfc3ViYmFuZC0+TnVtQ2hubHMpKSkgewotCQkJCQkJCXBCdE1nbnQtPkJUQ2hhbm5lbCA9IGxvY2FsY2hubDsKLQkJCQkJCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCJMb2NhbCBjaGFubmVsICglZCkgaXMgc2VsZWN0ZWQsIHdpZmkgb3IgQlQgY29ubmVjdGlvbiBleGlzdHNcbiIsIHBCdE1nbnQtPkJUQ2hhbm5lbCkpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoc3ViYmFuZFRyaXBsZXRDbnQpIHsKLQkJLyogaWYgYW55IHByZWZlcnJlZCBjaGFubmVsIHRyaXBsZXQgZXhpc3RzICovCi0JCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIlRoZXJlIGFyZSAlZCBzdWIgYmFuZCB0cmlwbGV0IGV4aXN0cywgIiwgc3ViYmFuZFRyaXBsZXRDbnQpKTsKLQkJaWYgKGZpcnN0UmVtb3RlTGVnYWxDaG5sSW5UcmlwbGV0ID09IDApIHsKLQkJCS8qIG5vIGxlZ2FsIGNoYW5uZWwgaXMgZm91bmQsIHJlamVjdCB0aGUgY29ubmVjdGlvbi4gKi8KLQkJCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIm5vIGxlZ2FsIGNoYW5uZWwgaXMgZm91bmQhIVxuIikpOwotCQl9IGVsc2UgewotCQkJLyogIFJlbW90ZSBMZWdhbCBjaGFubmVsIGlzIGZvdW5kIGJ1dCBub3QgbWF0Y2ggdG8gbG9jYWwgKi8KLQkJCS8qIHdpZmkgY29ubmVjdGlvbiBleGlzdHMpLCBzbyByZWplY3QgdGhlIGNvbm5lY3Rpb24uICovCi0JCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwKLQkJCQkoIlJlbW90ZSBMZWdhbCBjaGFubmVsIGlzIGZvdW5kIGJ1dCBub3QgbWF0Y2ggdG8gbG9jYWwod2lmaSBjb25uZWN0aW9uIGV4aXN0cykhIVxuIikpOwotCQl9Ci0JCXBCdE1nbnQtPkNoZWNrQ2hubElzU3VpdCA9IGZhbHNlOwotCX0gZWxzZSB7Ci0JCS8qICBUaGVyZSBhcmUgbm90IGFueSBwcmVmZXJyZWQgY2hhbm5lbCB0cmlwbGV0IGV4aXN0cyAqLwotCQkvKiAgVXNlIGN1cnJlbnQgbGVnYWwgY2hhbm5lbCBhcyB0aGUgYnQgY2hhbm5lbC4gKi8KLQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTUR8SU9DVExfQlRfTE9HTyksICgiTm8gc3ViIGJhbmQgdHJpcGxldCBleGlzdHMhIVxuIikpOwotCX0KLQlwQnRNZ250LT5CVENoYW5uZWwgPSBsb2NhbGNobmw7Ci0JUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTUR8SU9DVExfQlRfTE9HTyksICgiTG9jYWwgY2hhbm5lbCAoJWQpIGlzIHNlbGVjdGVkISFcbiIsIHBCdE1nbnQtPkJUQ2hhbm5lbCkpOwotfQotCi0vKiBTdWNjZXNzOnJldHVybiB0cnVlICovCi0vKiBGYWlsOnJldHVybiBmYWxzZSAqLwotc3RhdGljIHU4IGJ0aGNpX0dldEFzc29jSW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBFbnRyeU51bSkKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbzsKLQl1OCB0ZW1wQnVmWzI1Nl07Ci0JdTggaSA9IDA7Ci0JdTggQmFzZU1lbW9yeVNoaWZ0ID0gMDsKLQl1MTYJVG90YWxMZW4gPSAwOwotCXN0cnVjdCBhbXBfYXNzb2Nfc3RydWN0dXJlICpwQW1wQXNvYzsKLQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiR2V0QXNzb2NJbmZvIHN0YXJ0XG4iKSk7Ci0JcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQotCWlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQW1wQXNvY0NtZERhdGEuTGVuU29GYXIgPT0gMCkgewotCQlpZiAocEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkFtcEFzb2NDbWREYXRhLkFNUEFzc29jUmVtTGVuIDwgKE1BWF9BTVBfQVNTT0NfRlJBR19MRU4pKQotCQkJVG90YWxMZW4gPSBwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQW1wQXNvY0NtZERhdGEuQU1QQXNzb2NSZW1MZW47Ci0JCWVsc2UgaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BbXBBc29jQ21kRGF0YS5BTVBBc3NvY1JlbUxlbiA9PSAoTUFYX0FNUF9BU1NPQ19GUkFHX0xFTikpCi0JCQlUb3RhbExlbiA9IE1BWF9BTVBfQVNTT0NfRlJBR19MRU47Ci0JfSBlbHNlIGlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQW1wQXNvY0NtZERhdGEuTGVuU29GYXIgPiAwKQotCQlUb3RhbExlbiA9IHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BbXBBc29jQ21kRGF0YS5MZW5Tb0ZhcjsKLQotCXdoaWxlICgocEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkFtcEFzb2NDbWREYXRhLkxlblNvRmFyID49IEJhc2VNZW1vcnlTaGlmdCkgfHwgVG90YWxMZW4gPiBCYXNlTWVtb3J5U2hpZnQpIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9ERVRBSUwsICgiR2V0QXNzb2NJbmZvLCBUb3RhbExlbiA9JWQsIEJhc2VNZW1vcnlTaGlmdCA9JWRcbiIsIFRvdGFsTGVuLCBCYXNlTWVtb3J5U2hpZnQpKTsKLQkJbWVtY3B5KHRlbXBCdWYsCi0JCQkodTggKilwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQW1wQXNvY0NtZERhdGEuQU1QQXNzb2NmcmFnbWVudCtCYXNlTWVtb3J5U2hpZnQsCi0JCQlUb3RhbExlbi1CYXNlTWVtb3J5U2hpZnQpOwotCQlSVFBSSU5UX0RBVEEoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfREVUQUlMLCAiR2V0QXNzb2NJbmZvIDpcbiIsCi0JCQl0ZW1wQnVmLCBUb3RhbExlbi1CYXNlTWVtb3J5U2hpZnQpOwotCi0JCXBBbXBBc29jID0gKHN0cnVjdCBhbXBfYXNzb2Nfc3RydWN0dXJlICopdGVtcEJ1ZjsKLQkJbGUxNl90b19jcHVzKCZwQW1wQXNvYy0+TGVuZ3RoKTsKLQkJQmFzZU1lbW9yeVNoaWZ0ICs9IDMgKyBwQW1wQXNvYy0+TGVuZ3RoOwotCi0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiVHlwZUlEID0gMHgleCwgIiwgcEFtcEFzb2MtPlR5cGVJRCkpOwotCQlSVFBSSU5UX0RBVEEoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICJIZXggRGF0YTogXG4iLCBwQW1wQXNvYy0+RGF0YSwgcEFtcEFzb2MtPkxlbmd0aCk7Ci0JCXN3aXRjaCAocEFtcEFzb2MtPlR5cGVJRCkgewotCQljYXNlIEFNUF9NQUNfQUREUjoKLQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiPT0+IEFNUF9NQUNfQUREUlxuIikpOwotCQkJaWYgKHBBbXBBc29jLT5MZW5ndGggPiA2KQotCQkJCXJldHVybiBmYWxzZTsKLQkJCW1lbWNweShwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQlRSZW1vdGVNQUNBZGRyLCBwQW1wQXNvYy0+RGF0YSwgNik7Ci0JCQlSVFBSSU5UX0FERFIoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiUmVtb3RlIE1hYyBhZGRyZXNzIFxuIiksIHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5CVFJlbW90ZU1BQ0FkZHIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQU1QX1BSRUZFUlJFRF9DSEFOTkVMX0xJU1Q6Ci0JCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIj09PiBBTVBfUFJFRkVSUkVEX0NIQU5ORUxfTElTVFxuIikpOwotCQkJcEJ0SGNpSW5mby0+QnRQcmVDaG5sTGlzdExlbiA9IHBBbXBBc29jLT5MZW5ndGg7Ci0JCQltZW1jcHkocEJ0SGNpSW5mby0+QlRQcmVDaG5sbGlzdCwKLQkJCQlwQW1wQXNvYy0+RGF0YSwKLQkJCQlwQnRIY2lJbmZvLT5CdFByZUNobmxMaXN0TGVuKTsKLQkJCVJUUFJJTlRfREFUQShGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgIlByZWZlcnJlZCBjaGFubmVsIGxpc3QgOiBcbiIsIHBCdEhjaUluZm8tPkJUUHJlQ2hubGxpc3QsIHBCdEhjaUluZm8tPkJ0UHJlQ2hubExpc3RMZW4pOwotCQkJYnRoY2lfRGVjaWRlQlRDaGFubmVsKHBhZGFwdGVyLCBFbnRyeU51bSk7Ci0JCQlicmVhazsKLQkJY2FzZSBBTVBfQ09OTkVDVEVEX0NIQU5ORUw6Ci0JCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIj09PiBBTVBfQ09OTkVDVEVEX0NIQU5ORUxcbiIpKTsKLQkJCXBCdEhjaUluZm8tPkJUQ29ubmVjdENobmxMaXN0TGVuID0gcEFtcEFzb2MtPkxlbmd0aDsKLQkJCW1lbWNweShwQnRIY2lJbmZvLT5CVENvbm5lY3RDaG5sbGlzdCwKLQkJCQlwQW1wQXNvYy0+RGF0YSwKLQkJCQlwQnRIY2lJbmZvLT5CVENvbm5lY3RDaG5sTGlzdExlbik7Ci0JCQlicmVhazsKLQkJY2FzZSBBTVBfODAyMTFfUEFMX0NBUF9MSVNUOgotCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCI9PT4gQU1QXzgwMjExX1BBTF9DQVBfTElTVFxuIikpOwotCQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkJUQ2FwYWJpbGl0eSA9ICoodTMyICopKHBBbXBBc29jLT5EYXRhKTsKLQkJCWlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQlRDYXBhYmlsaXR5ICYgMHgwMDAwMDAwMSkgewotCQkJCS8qICBUT0RPOiAqLwotCi0JCQkJLyogU2lnbmlmaWVzIFBBTCBjYXBhYmxlIG9mIHV0aWxpemluZyByZWNlaXZlZCBhY3Rpdml0eSByZXBvcnRzLiAqLwotCQkJfQotCQkJaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5CVENhcGFiaWxpdHkgJiAweDAwMDAwMDAyKSB7Ci0JCQkJLyogIFRPRE86ICovCi0JCQkJLyogU2lnbmlmaWVzIFBBTCBpcyBjYXBhYmxlIG9mIHV0aWxpemluZyBzY2hlZHVsaW5nIGluZm9ybWF0aW9uIHJlY2VpdmVkIGluIGFuIGFjdGl2aXR5IHJlcG9ydHMuICovCi0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBBTVBfODAyMTFfUEFMX1ZJU0lPTjoKLQkJCXBCdEhjaUluZm8tPkJUUGFsVmVyc2lvbiA9ICoodTggKikocEFtcEFzb2MtPkRhdGEpOwotCQkJcEJ0SGNpSW5mby0+QlRQYWxDb21wYW55SUQgPSAqKHUxNiAqKSgoKHU4ICopKHBBbXBBc29jLT5EYXRhKSkrMSk7Ci0JCQlwQnRIY2lJbmZvLT5CVFBhbHN1YnZlcnNpb24gPSAqKHUxNiAqKSgoKHU4ICopKHBBbXBBc29jLT5EYXRhKSkrMyk7Ci0JCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCI9PT4gQU1QXzgwMjExX1BBTF9WSVNJT04gUGFsVmVyc2lvbiAgMHgleCwgUGFsQ29tcGFueUlEICAweCV4LCBQYWxzdWJ2ZXJzaW9uIDB4JXhcbiIsCi0JCQkJcEJ0SGNpSW5mby0+QlRQYWxWZXJzaW9uLAotCQkJCXBCdEhjaUluZm8tPkJUUGFsQ29tcGFueUlELAotCQkJCXBCdEhjaUluZm8tPkJUUGFsc3VidmVyc2lvbikpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIj09PiBVbnN1cHBvcnQgVHlwZUlEICEhXG4iKSk7Ci0JCQlicmVhazsKLQkJfQotCQlpKys7Ci0JfQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiR2V0QXNzb2NJbmZvIGVuZFxuIikpOwotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB1OCBidGhjaV9BZGRFbnRyeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm87Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQ7Ci0JdTggaTsKLQotCXBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0JcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0JUX0FTT0NfRU5UUllfTlVNOyBpKyspIHsKLQkJaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W2ldLmJVc2VkID09IGZhbHNlKSB7Ci0JCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtpXS5iVXNlZCA9IHRydWU7Ci0JCQlwQnRNZ250LT5DdXJyZW50Q29ubmVjdEVudHJ5TnVtID0gaTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKGkgPT0gTUFYX0JUX0FTT0NfRU5UUllfTlVNKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJidGhjaV9BZGRFbnRyeSgpLCBBZGQgZW50cnkgZmFpbCEhXG4iKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB1OCBidGhjaV9EaXNjYXJkVHhQYWNrZXRzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiBMTEgpCi17Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgdTgKLWJ0aGNpX0NoZWNrTG9nTGlua0JlaGF2aW9yKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IGhjaV9mbG93X3NwZWMJCQlUeEZsb3dTcGVjCi0JKQotewotCXU4IElEID0gVHhGbG93U3BlYy5JZGVudGlmaWVyOwotCXU4IFNlcnZpY2VUeXBlID0gVHhGbG93U3BlYy5TZXJ2aWNlVHlwZTsKLQl1MTYJTWF4U0RVU2l6ZSA9IFR4Rmxvd1NwZWMuTWF4aW11bVNEVVNpemU7Ci0JdTMyCVNEVUludGVyQXJyaXZhdGltZSA9IFR4Rmxvd1NwZWMuU0RVSW50ZXJBcnJpdmFsVGltZTsKLQl1OCBtYXRjaCA9IGZhbHNlOwotCi0Jc3dpdGNoIChJRCkgewotCWNhc2UgMToKLQkJaWYgKFNlcnZpY2VUeXBlID09IEJUX0xMX0JFKSB7Ci0JCQltYXRjaCA9IHRydWU7Ci0JCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0VWRU5UfElPQ1RMX0JUX0xPR08pLCAoIkxvZ2ljYWwgTGluayBUeXBlID0gIFRYIGJlc3QgZWZmb3J0IGZsb3dzcGVjXG4iKSk7Ci0JCX0gZWxzZSBpZiAoKFNlcnZpY2VUeXBlID09IEJUX0xMX0dVKSAmJiAoTWF4U0RVU2l6ZSA9PSAweGZmZmYpKSB7Ci0JCQltYXRjaCA9IHRydWU7Ci0JCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0VWRU5UfElPQ1RMX0JUX0xPR08pLCAoIkxvZ2ljYWwgTGluayBUeXBlID0gIFJYIGd1YXJhbnRlZWQgbGF0ZW5jeSBmbG93c3BlY1xuIikpOwotCQl9IGVsc2UgaWYgKChTZXJ2aWNlVHlwZSA9PSBCVF9MTF9HVSkgJiYgKE1heFNEVVNpemUgPT0gMjUwMCkpIHsKLQkJCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfRVZFTlR8SU9DVExfQlRfTE9HTyksICgiTG9naWNhbCBMaW5rIFR5cGUgPSAgUlggZ3VhcmFudGVlZCBMYXJnZSBsYXRlbmN5IGZsb3dzcGVjXG4iKSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlpZiAoU2VydmljZVR5cGUgPT0gQlRfTExfQkUpIHsKLQkJCW1hdGNoID0gdHJ1ZTsKLQkJCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfRVZFTlR8SU9DVExfQlRfTE9HTyksICgiTG9naWNhbCBMaW5rIFR5cGUgPSAgUlggYmVzdCBlZmZvcnQgZmxvd3NwZWNcbiIpKTsKLQotCQl9Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJaWYgKChTZXJ2aWNlVHlwZSA9PSBCVF9MTF9HVSkgJiYgKE1heFNEVVNpemUgPT0gMTQ5MikpIHsKLQkJCW1hdGNoID0gdHJ1ZTsKLQkJCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfRVZFTlR8SU9DVExfQlRfTE9HTyksICgiTG9naWNhbCBMaW5rIFR5cGUgPSAgVFggZ3VhcmFudGVlZCBsYXRlbmN5IGZsb3dzcGVjXG4iKSk7Ci0JCX0gZWxzZSBpZiAoKFNlcnZpY2VUeXBlID09IEJUX0xMX0dVKSAmJiAoTWF4U0RVU2l6ZSA9PSAyNTAwKSkgewotCQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVHxJT0NUTF9CVF9MT0dPKSwgKCJMb2dpY2FsIExpbmsgVHlwZSA9ICBUWCBndWFyYW50ZWVkIExhcmdlIGxhdGVuY3kgZmxvd3NwZWNcbiIpKTsKLQkJfQotCQlicmVhazsKLQljYXNlIDQ6Ci0JCWlmIChTZXJ2aWNlVHlwZSA9PSBCVF9MTF9CRSkgewotCQkJaWYgKChTRFVJbnRlckFycml2YXRpbWUgPT0gMHhmZmZmZmZmZikgJiYgKFNlcnZpY2VUeXBlID09IEJUX0xMX0JFKSAmJiAoTWF4U0RVU2l6ZSA9PSAxNDkyKSkgewotCQkJCW1hdGNoID0gdHJ1ZTsKLQkJCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0VWRU5UfElPQ1RMX0JUX0xPR08pLCAoIkxvZ2ljYWwgTGluayBUeXBlID0gIFRYL1JYIGFnZ3JlZ2F0ZWQgYmVzdCBlZmZvcnQgZmxvd3NwZWNcbiIpKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChTZXJ2aWNlVHlwZSA9PSBCVF9MTF9HVSkgewotCQkJaWYgKFNEVUludGVyQXJyaXZhdGltZSA9PSAxMDApIHsKLQkJCQltYXRjaCA9IHRydWU7Ci0JCQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVHxJT0NUTF9CVF9MT0dPKSwgKCJMb2dpY2FsIExpbmsgVHlwZSA9ICBUWC9SWCBndWFyYW50ZWVkIGJhbmR3aWR0aCBmbG93c3BlY1xuIikpOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfRVZFTlR8SU9DVExfQlRfTE9HTyksICgiTG9naWNhbCBMaW5rIFR5cGUgPSAgVW5rbm93IFR5cGUgISEhISEhISFcbiIpKTsKLQkJYnJlYWs7Ci0JfQotCi0JUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTUR8SU9DVExfQlRfTE9HTyksCi0JCSgiSUQgPSAweCV4LCBTZXJ2aWNlVHlwZSA9IDB4JXgsIE1heGltdW1TRFVTaXplID0gMHgleCwgU0RVSW50ZXJBcnJpdmFsVGltZSA9IDB4JXgsIEFjY2Vzc0xhdGVuY3kgPSAweCV4LCBGbHVzaFRpbWVvdXQgPSAweCV4XG4iLAotCQlUeEZsb3dTcGVjLklkZW50aWZpZXIsIFR4Rmxvd1NwZWMuU2VydmljZVR5cGUsIE1heFNEVVNpemUsCi0JCVNEVUludGVyQXJyaXZhdGltZSwgVHhGbG93U3BlYy5BY2Nlc3NMYXRlbmN5LCBUeEZsb3dTcGVjLkZsdXNoVGltZW91dCkpOwotCXJldHVybiBtYXRjaDsKLX0KLQotc3RhdGljIHUxNiBidGhjaV9Bc3NvY01BQ0FkZHIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdm9pZAkqcGJ1ZikKLXsKLQlzdHJ1Y3QgYW1wX2Fzc29jX3N0cnVjdHVyZSAqcEFzc29TdHJjID0gKHN0cnVjdCBhbXBfYXNzb2Nfc3RydWN0dXJlICopcGJ1ZjsKLQlwQXNzb1N0cmMtPlR5cGVJRCA9IEFNUF9NQUNfQUREUjsKLQlwQXNzb1N0cmMtPkxlbmd0aCA9IDB4MDY7Ci0JbWVtY3B5KCZwQXNzb1N0cmMtPkRhdGFbMF0sIHBhZGFwdGVyLT5lZXByb21wcml2Lm1hY19hZGRyLCA2KTsKLQlSVFBSSU5UX0RBVEEoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0hDSUNNRF9ERVRBSUx8SU9DVExfQlRfTE9HTyksCi0JCSAgICAgKCJBc3NvY01BQ0FkZHIgOiBcbiIpLCBwQXNzb1N0cmMsIHBBc3NvU3RyYy0+TGVuZ3RoKzMpOwotCi0JcmV0dXJuIHBBc3NvU3RyYy0+TGVuZ3RoICsgMzsKLX0KLQotc3RhdGljIHUxNgotYnRoY2lfUEFMQ2FwYWJpbGl0aWVzKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jdm9pZAkqcGJ1ZgotCSkKLXsKLQlzdHJ1Y3QgYW1wX2Fzc29jX3N0cnVjdHVyZSAqcEFzc29TdHJjID0gKHN0cnVjdCBhbXBfYXNzb2Nfc3RydWN0dXJlICopcGJ1ZjsKLQotCXBBc3NvU3RyYy0+VHlwZUlEID0gQU1QXzgwMjExX1BBTF9DQVBfTElTVDsKLQlwQXNzb1N0cmMtPkxlbmd0aCA9IDB4MDQ7Ci0KLQlwQXNzb1N0cmMtPkRhdGFbMF0gPSAweDAwOwotCXBBc3NvU3RyYy0+RGF0YVsxXSA9IDB4MDA7Ci0KLQlSVFBSSU5UX0RBVEEoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfREVUQUlMLCAoIlBBTENhcGFiaWxpdGllczpcbiIpLCBwQXNzb1N0cmMsIHBBc3NvU3RyYy0+TGVuZ3RoKzMpOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9MT0dPLCAoIlBBTENhcGFiaWxpdGllcyBcbiIpKTsKLQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9MT0dPLCAoIiBUeXBlSUQgPSAweCV4LFxuIExlbmd0aCA9IDB4JXgsXG4gQ29udGVudCA9IDB4MDAwMFxuIiwKLQkJcEFzc29TdHJjLT5UeXBlSUQsCi0JCXBBc3NvU3RyYy0+TGVuZ3RoKSk7Ci0KLQlyZXR1cm4gcEFzc29TdHJjLT5MZW5ndGggKyAzOwotfQotCi1zdGF0aWMgdTE2IGJ0aGNpX0Fzc29jUHJlZmVycmVkQ2hhbm5lbExpc3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkJICAgdm9pZCAqcGJ1ZiwgdTggRW50cnlOdW0pCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbzsKLQlzdHJ1Y3QgYW1wX2Fzc29jX3N0cnVjdHVyZSAqcEFzc29TdHJjOwotCXN0cnVjdCBhbXBfcHJlZl9jaG5sX3JlZ3VsYXRvcnkgKnBSZWc7Ci0Jc3RydWN0IGNobmxfdHhwb3dlcl90cmlwbGUgKnBUcmlwbGU7Ci0JY2hhciBjdHJTdHJpbmdbM10gPSB7J1gnLCAnWCcsICdYJ307Ci0JdTMyIGxlbiA9IDA7Ci0JdTggcHJlZmVycmVkQ2hubDsKLQotCXBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0JcEFzc29TdHJjID0gKHN0cnVjdCBhbXBfYXNzb2Nfc3RydWN0dXJlICopcGJ1ZjsKLQlwUmVnID0gKHN0cnVjdCBhbXBfcHJlZl9jaG5sX3JlZ3VsYXRvcnkgKikmcEFzc29TdHJjLT5EYXRhWzNdOwotCi0JcHJlZmVycmVkQ2hubCA9IGJ0aGNpX0dldExvY2FsQ2hhbm5lbChwYWRhcHRlcik7Ci0JcEFzc29TdHJjLT5UeXBlSUQgPSBBTVBfUFJFRkVSUkVEX0NIQU5ORUxfTElTVDsKLQotCS8qICBsb2NhbGUgdW5rbm93biAqLwotCW1lbWNweSgmcEFzc29TdHJjLT5EYXRhWzBdLCAmY3RyU3RyaW5nWzBdLCAzKTsKLQlwUmVnLT5yZVhJZCA9IDIwMTsKLQlwUmVnLT5yZWd1bGF0b3J5Q2xhc3MgPSAyNTQ7Ci0JcFJlZy0+Y292ZXJhZ2VDbGFzcyA9IDA7Ci0JbGVuICs9IDY7Ci0JUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTUQgfCBJT0NUTF9CVF9MT0dPKSwgKCJQUkVGRVJSRURfQ0hOTF9MSVNUXG4iKSk7Ci0JUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTUQgfCBJT0NUTF9CVF9MT0dPKSwgKCJYWFgsIDIwMSwgMjU0LCAwXG4iKSk7Ci0JLyogIGF0IHRoZSBmb2xsb3dpbmcsIGNobmwgMX4xMSBzaG91bGQgYmUgY29udGFpbmVkICovCi0JcFRyaXBsZSA9IChzdHJ1Y3QgY2hubF90eHBvd2VyX3RyaXBsZSAqKSZwQXNzb1N0cmMtPkRhdGFbbGVuXTsKLQotCS8qICAoMSkgaWYgYW55IHdpZmkgb3IgYnQgSFMgY29ubmVjdGlvbiBleGlzdHMgKi8KLQlpZiAoKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BTVBSb2xlID09IEFNUF9CVEFQX0NSRUFUT1IpIHx8Ci0JICAgIChjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIFdJRklfQVNPQ19TVEFURSB8Ci0JCQkgICBXSUZJX0FESE9DX1NUQVRFIHwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUgfAotCQkJICAgV0lGSV9BUF9TVEFURSkpIHx8Ci0JICAgIEJUSENJX0hzQ29ubmVjdGlvbkVzdGFibGlzaGVkKHBhZGFwdGVyKSkgewotCQlwVHJpcGxlLT5GaXJzdENobmwgPSBwcmVmZXJyZWRDaG5sOwotCQlwVHJpcGxlLT5OdW1DaG5scyA9IDE7Ci0JCXBUcmlwbGUtPk1heFR4UG93ZXJJbkRibSA9IDIwOwotCQlsZW4gKz0gMzsKLQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTUQgfCBJT0NUTF9CVF9MT0dPKSwgKCJGaXJzdCBDaGFubmVsID0gJWQsIENoYW5uZWwgTnVtID0gJWQsIE1heERibSA9ICVkXG4iLAotCQkJcFRyaXBsZS0+Rmlyc3RDaG5sLAotCQkJcFRyaXBsZS0+TnVtQ2hubHMsCi0JCQlwVHJpcGxlLT5NYXhUeFBvd2VySW5EYm0pKTsKLQl9Ci0KLQlwQXNzb1N0cmMtPkxlbmd0aCA9ICh1MTYpbGVuOwotCVJUUFJJTlRfREFUQShGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJBc3NvY1ByZWZlcnJlZENoYW5uZWxMaXN0IDogXG4iKSwgcEFzc29TdHJjLCBwQXNzb1N0cmMtPkxlbmd0aCszKTsKLQotCXJldHVybiBwQXNzb1N0cmMtPkxlbmd0aCArIDM7Ci19Ci0KLXN0YXRpYyB1MTYgYnRoY2lfQXNzb2NQQUxWZXIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdm9pZCAqcGJ1ZikKLXsKLQlzdHJ1Y3QgYW1wX2Fzc29jX3N0cnVjdHVyZSAqcEFzc29TdHJjID0gKHN0cnVjdCBhbXBfYXNzb2Nfc3RydWN0dXJlICopcGJ1ZjsKLQl1OCAqcHUxVG1wOwotCXUxNgkqcHUyVG1wOwotCi0JcEFzc29TdHJjLT5UeXBlSUQgPSBBTVBfODAyMTFfUEFMX1ZJU0lPTjsKLQlwQXNzb1N0cmMtPkxlbmd0aCA9IDB4NTsKLQlwdTFUbXAgPSAmcEFzc29TdHJjLT5EYXRhWzBdOwotCSpwdTFUbXAgPSAweDE7CS8qICBQQUwgVmVyc2lvbiAqLwotCXB1MlRtcCA9ICh1MTYgKikmcEFzc29TdHJjLT5EYXRhWzFdOwotCSpwdTJUbXAgPSAweDVEOwkvKiAgU0lHIENvbXBhbnkgaWRlbnRpZmllciBvZiA4MDIuMTEgUEFMIHZlbmRvciAqLwotCXB1MlRtcCA9ICh1MTYgKikmcEFzc29TdHJjLT5EYXRhWzNdOwotCSpwdTJUbXAgPSAweDE7CS8qICBQQUwgU3ViLXZlcnNpb24gc3BlY2lmaWVyICovCi0KLQlSVFBSSU5UX0RBVEEoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfREVUQUlMLCAoIkFzc29jUEFMVmVyIDogXG4iKSwgcEFzc29TdHJjLCBwQXNzb1N0cmMtPkxlbmd0aCszKTsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfTE9HTywgKCJBc3NvY1BBTFZlciBcbiIpKTsKLQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9MT0dPLCAoIiBUeXBlSUQgPSAweCV4LFxuIExlbmd0aCA9IDB4JXgsXG4gUEFMIFZlcnNpb24gPSAweDAxLFxuIFBBTCB2ZW5kb3IgPSAweDAxLFxuIFBBTCBTdWItdmVyc2lvbiBzcGVjaWZpZXIgPSAweDAxXG4iLAotCQlwQXNzb1N0cmMtPlR5cGVJRCwKLQkJcEFzc29TdHJjLT5MZW5ndGgpKTsKLQlyZXR1cm4gcEFzc29TdHJjLT5MZW5ndGggKyAzOwotfQotCi1zdGF0aWMgdTggYnRoY2lfQ2hlY2tSZlN0YXRlQmVmb3JlQ29ubmVjdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm87Ci0JZW51bSBydF9yZl9wb3dlcl9zdGF0ZQkJUmZTdGF0ZTsKLQotCXBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0KLQlSZlN0YXRlID0gcGFkYXB0ZXItPnB3cmN0cmxwcml2LnJmX3B3cnN0YXRlOwotCi0JaWYgKFJmU3RhdGUgIT0gcmZfb24pIHsKLQkJbW9kX3RpbWVyKCZwQlRJbmZvLT5CVFBzRGlzYWJsZVRpbWVyLAotCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1MCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBidGhjaV9SZXNwb25kZXJTdGFydFRvU2NhbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotfQotCi1zdGF0aWMgdTggYnRoY2lfUGh5TGlua0Nvbm5lY3Rpb25JblByb2dyZXNzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IFBoeUxpbmtIYW5kbGUpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbzsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudDsKLQotCXBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0JcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlpZiAocEJ0TWdudC0+YlBoeUxpbmtJblByb2dyZXNzICYmCi0JCShwQnRNZ250LT5CdEN1cnJlbnRQaHlMaW5raGFuZGxlID09IFBoeUxpbmtIYW5kbGUpKQotCQlyZXR1cm4gdHJ1ZTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aGNpX1Jlc2V0Rmxvd1NwZWMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggRW50cnlOdW0sIHU4IGluZGV4KQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVGluZm87Ci0KLQlwQlRpbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCi0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2luZGV4XS5CdExvZ0xpbmtoYW5kbGUgPSAwOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpbmRleF0uQnRQaHlMaW5raGFuZGxlID0gMDsKLQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaW5kZXhdLmJMTENvbXBsZXRlRXZlbnRJc1NldCA9IGZhbHNlOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpbmRleF0uYkxMQ2FuY2VsQ01ESXNTZXRhbmRDb21wbGV0ZSA9IGZhbHNlOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpbmRleF0uQnRUeEZsb3dTcGVjSUQgPSAwOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpbmRleF0uVHhQYWNrZXRDb3VudCA9IDA7Ci0KLQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaW5kZXhdLlR4X0Zsb3dfU3BlYy5JZGVudGlmaWVyID0gMHgwMTsKLQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaW5kZXhdLlR4X0Zsb3dfU3BlYy5TZXJ2aWNlVHlwZSA9IFNFUlZJQ0VfQkVTVF9FRkZPUlQ7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2luZGV4XS5UeF9GbG93X1NwZWMuTWF4aW11bVNEVVNpemUgPSAweGZmZmY7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2luZGV4XS5UeF9GbG93X1NwZWMuU0RVSW50ZXJBcnJpdmFsVGltZSA9IDB4ZmZmZmZmZmY7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2luZGV4XS5UeF9GbG93X1NwZWMuQWNjZXNzTGF0ZW5jeSA9IDB4ZmZmZmZmZmY7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2luZGV4XS5UeF9GbG93X1NwZWMuRmx1c2hUaW1lb3V0ID0gMHhmZmZmZmZmZjsKLQotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpbmRleF0uUnhfRmxvd19TcGVjLklkZW50aWZpZXIgPSAweDAxOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpbmRleF0uUnhfRmxvd19TcGVjLlNlcnZpY2VUeXBlID0gU0VSVklDRV9CRVNUX0VGRk9SVDsKLQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaW5kZXhdLlJ4X0Zsb3dfU3BlYy5NYXhpbXVtU0RVU2l6ZSA9IDB4ZmZmZjsKLQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaW5kZXhdLlJ4X0Zsb3dfU3BlYy5TRFVJbnRlckFycml2YWxUaW1lID0gMHhmZmZmZmZmZjsKLQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaW5kZXhdLlJ4X0Zsb3dfU3BlYy5BY2Nlc3NMYXRlbmN5ID0gMHhmZmZmZmZmZjsKLQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaW5kZXhdLlJ4X0Zsb3dfU3BlYy5GbHVzaFRpbWVvdXQgPSAweGZmZmZmZmZmOwotfQotCi1zdGF0aWMgdm9pZCBidGhjaV9SZXNldEVudHJ5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IEVudHJ5TnVtKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVGluZm87Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQ7Ci0JdTggajsKLQotCXBCVGluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0JcEJ0TWdudCA9ICZwQlRpbmZvLT5CdE1nbnQ7Ci0KLQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uYlVzZWQgPSBmYWxzZTsKLQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQnRDdXJyZW50U3RhdGUgPSBIQ0lfU1RBVEVfRElTQ09OTkVDVEVEOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5CdE5leHRTdGF0ZSA9IEhDSV9TVEFURV9ESVNDT05ORUNURUQ7Ci0KLQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQW1wQXNvY0NtZERhdGEuQU1QQXNzb2NSZW1MZW4gPSAwOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BbXBBc29jQ21kRGF0YS5CdFBoeUxpbmtoYW5kbGUgPSAwOwotCWlmIChwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQW1wQXNvY0NtZERhdGEuQU1QQXNzb2NmcmFnbWVudCAhPSBOVUxMKQotCQltZW1zZXQocEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkFtcEFzb2NDbWREYXRhLkFNUEFzc29jZnJhZ21lbnQsIDAsIFRPVEFMX0FMTE9DSUFURV9BU1NPQ19MRU4pOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BbXBBc29jQ21kRGF0YS5MZW5Tb0ZhciA9IDA7Ci0KLQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRBTVBLZXlUeXBlID0gMDsKLQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRQaHlMaW5raGFuZGxlID0gMDsKLQltZW1zZXQocEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkJ0QU1QS2V5LCAwLAotCSAgICAgICBwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRBTVBLZXlMZW4pOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdEFNUEtleUxlbiA9IDA7Ci0KLQkvKiAweDY0MDsgMC42MjVtcyoxNjAwID0gMTAwMG1zLCAwLjYyNW1zKjE2MDAwID0gMTAwMDBtcyAqLwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5MaW5rU3VwZXJ2ZXJzaW9uVGltZW91dCA9IDB4M2U4MDsKLQotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BTVBSb2xlID0gQU1QX0JUQVBfTk9ORTsKLQotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5tQXNzb2MgPSBmYWxzZTsKLQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uYjR3YXlTdWNjZXNzID0gZmFsc2U7Ci0KLQkvKiAgUmVzZXQgQlQgV1BBICovCi0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLktleVJlcGxheUNvdW50ZXIgPSAwOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5CVFdQQUF1dGhTdGF0ZSA9IFNUQVRFX1dQQV9BVVRIX1VOSU5JVElBTElaRUQ7Ci0KLQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uYlNlbmRTdXBlcnZpc2lvblBhY2tldCA9IGZhbHNlOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Ob1J4UGt0Q250ID0gMDsKLQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uU2hvcnRSYW5nZU1vZGUgPSAwOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5yeFN1dnBQa3RDbnQgPSAwOwotCi0JZm9yIChqID0gMDsgaiA8IE1BWF9MT0dJQ0FMX0xJTktfTlVNOyBqKyspCi0JCWJ0aGNpX1Jlc2V0Rmxvd1NwZWMocGFkYXB0ZXIsIEVudHJ5TnVtLCBqKTsKLQotCXBCdE1nbnQtPkJUQXV0aENvdW50ID0gMDsKLQlwQnRNZ250LT5CVEFzb2NDb3VudCA9IDA7Ci0JcEJ0TWdudC0+QlRDdXJyZW50Q29ubmVjdFR5cGUgPSBCVF9ESVNDT05ORUNUOwotCXBCdE1nbnQtPkJUUmVjZWl2ZUNvbm5lY3RQa3QgPSBCVF9ESVNDT05ORUNUOwotCi0JSEFMQlRfUmVtb3ZlS2V5KHBhZGFwdGVyLCBFbnRyeU51bSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aGNpX1JlbW92ZUVudHJ5QnlFbnRyeU51bShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBFbnRyeU51bSkKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQotCWJ0aGNpX1Jlc2V0RW50cnkocGFkYXB0ZXIsIEVudHJ5TnVtKTsKLQotCWlmIChwQnRNZ250LT5DdXJyZW50QlRDb25uZWN0aW9uQ250ID4gMCkKLQkJcEJ0TWdudC0+Q3VycmVudEJUQ29ubmVjdGlvbkNudC0tOwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIltCVCBGbGFnXSwgQ3VycmVudEJUQ29ubmVjdGlvbkNudCA9ICVkISFcbiIsCi0JCXBCdE1nbnQtPkN1cnJlbnRCVENvbm5lY3Rpb25DbnQpKTsKLQotCWlmIChwQnRNZ250LT5DdXJyZW50QlRDb25uZWN0aW9uQ250ID4gMCkgewotCQlwQnRNZ250LT5CdE9wZXJhdGlvbk9uID0gdHJ1ZTsKLQl9IGVsc2UgewotCQlwQnRNZ250LT5CdE9wZXJhdGlvbk9uID0gZmFsc2U7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJbQlQgRmxhZ10sIEJ0IE9wZXJhdGlvbiBPRkYhIVxuIikpOwotCX0KLQotCWlmICghcEJ0TWdudC0+QnRPcGVyYXRpb25PbikgewotCQlkZWxfdGltZXJfc3luYygmcEJUSW5mby0+QlRIQ0lEaXNjYXJkQWNsRGF0YVRpbWVyKTsKLQkJZGVsX3RpbWVyX3N5bmMoJnBCVEluZm8tPkJUQmVhY29uVGltZXIpOwotCQlwQnRNZ250LT5iU3RhcnRTZW5kU3VwZXJ2aXNpb25Qa3QgPSBmYWxzZTsKLQl9Ci19Ci0KLXN0YXRpYyB1OAotYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKAotCXU4ICpwYnVmLAotCXUxNgkJT0dGLAotCXUxNgkJT0NGLAotCWVudW0gaGNpX3N0YXR1cwlzdGF0dXMKLQkpCi17Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKilwYnVmOwotCXU4IE51bUhDSV9Db21tID0gMHgxOwotCi0JUFBhY2tldElycEV2ZW50LT5FdmVudENvZGUgPSBIQ0lfRVZFTlRfQ09NTUFORF9DT01QTEVURTsKLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMF0gPSBOdW1IQ0lfQ29tbTsJLyogcGFja2V0ICMgKi8KLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMV0gPSBIQ0lPUENPREVMT1coT0NGLCBPR0YpOwotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVsyXSA9IEhDSU9QQ09ERUhJR0hUKE9DRiwgT0dGKTsKLQotCWlmIChPR0YgPT0gT0dGX0VYVEVOU0lPTikgewotCQlpZiAoT0NGID09IEhDSV9TRVRfUlNTSV9WQUxVRSkgewotCQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVF9QRVJJT0RJQ0FMKSwKLQkJCQkoIltCVCBldmVudF0sIENvbW1hbmRDb21wbGV0ZSwgTnVtX0hDSV9Db21tID0gMHgleCwgT3Bjb2RlID0gMHglMDJ4JTAyeCwgc3RhdHVzID0gMHgleCwgT0dGID0gMHgleCwgT0NGID0gMHgleFxuIiwKLQkJCQlOdW1IQ0lfQ29tbSwgKEhDSU9QQ09ERUhJR0hUKE9DRiwgT0dGKSksIChIQ0lPUENPREVMT1coT0NGLCBPR0YpKSwgc3RhdHVzLCBPR0YsIE9DRikpOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTURfRVhUKSwKLQkJCQkoIltCVCBldmVudF0sIENvbW1hbmRDb21wbGV0ZSwgTnVtX0hDSV9Db21tID0gMHgleCwgT3Bjb2RlID0gMHglMDJ4JTAyeCwgc3RhdHVzID0gMHgleCwgT0dGID0gMHgleCwgT0NGID0gMHgleFxuIiwKLQkJCQlOdW1IQ0lfQ29tbSwgKEhDSU9QQ09ERUhJR0hUKE9DRiwgT0dGKSksIChIQ0lPUENPREVMT1coT0NGLCBPR0YpKSwgc3RhdHVzLCBPR0YsIE9DRikpOwotCQl9Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVHxJT0NUTF9CVF9MT0dPKSwKLQkJCSgiW0JUIGV2ZW50XSwgQ29tbWFuZENvbXBsZXRlLCBOdW1fSENJX0NvbW0gPSAweCV4LCBPcGNvZGUgPSAweCUwMnglMDJ4LCBzdGF0dXMgPSAweCV4LCBPR0YgPSAweCV4LCBPQ0YgPSAweCV4XG4iLAotCQkJTnVtSENJX0NvbW0sIChIQ0lPUENPREVISUdIVChPQ0YsIE9HRikpLCAoSENJT1BDT0RFTE9XKE9DRiwgT0dGKSksIHN0YXR1cywgT0dGLCBPQ0YpKTsKLQl9Ci0JcmV0dXJuIDM7Ci19Ci0KLXN0YXRpYyB1OCBidGhjaV9FeHRlbnNpb25FdmVudEhlYWRlclJ0ayh1OCAqcGJ1ZiwgdTggZXh0ZW5zaW9uRXZlbnQpCi17Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKilwYnVmOwotCVBQYWNrZXRJcnBFdmVudC0+RXZlbnRDb2RlID0gSENJX0VWRU5UX0VYVEVOU0lPTl9SVEs7Ci0JUFBhY2tldElycEV2ZW50LT5EYXRhWzBdID0gZXh0ZW5zaW9uRXZlbnQ7CS8qIGV4dGVuc2lvbiBldmVudCBjb2RlICovCi0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGVudW0gcnRfc3RhdHVzCi1idGhjaV9JbmRpY2F0ZUV2ZW50KAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jdm9pZAkJKnBFdm50RGF0YSwKLQl1MzIJCWRhdGFMZW4KLQkpCi17Ci0JcmV0dXJuIFBsYXRmb3JtSW5kaWNhdGVCVEV2ZW50KHBhZGFwdGVyLCBwRXZudERhdGEsIGRhdGFMZW4pOwotfQotCi1zdGF0aWMgdm9pZAotYnRoY2lfRXZlbnRXcml0ZVJlbW90ZUFtcEFzc29jKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JZW51bSBoY2lfc3RhdHVzCXN0YXR1cywKLQl1OCBQTEhhbmRsZQotCSkKLXsKLQl1OCBsb2NhbEJ1ZltUbXBMb2NhbEJ1ZlNpemVdID0gIiI7Ci0JdTggKnBSZXRQYXI7Ci0JdTggbGVuID0gMDsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQlQbGF0Zm9ybVplcm9NZW1vcnkoJmxvY2FsQnVmWzBdLCBUbXBMb2NhbEJ1ZlNpemUpOwotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJT0dGX1NUQVRVU19QQVJBTUVURVJTLAotCQlIQ0lfV1JJVEVfUkVNT1RFX0FNUF9BU1NPQywKLQkJc3RhdHVzKTsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCJQaHlMaW5rSGFuZGxlID0gMHgleCwgc3RhdHVzID0gJWRcbiIsIFBMSGFuZGxlLCBzdGF0dXMpKTsKLQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCXBSZXRQYXJbMV0gPSBQTEhhbmRsZTsKLQlsZW4gKz0gMjsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotfQotCi1zdGF0aWMgdm9pZAotYnRoY2lfRXZlbnRFbmhhbmNlZEZsdXNoQ29tcGxldGUoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQl1MTYJCQkJCUxMSAotCSkKLXsKLQl1OCBsb2NhbEJ1Zls0XSA9ICIiOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVCwgKCJFdmVudEVuaGFuY2VkRmx1c2hDb21wbGV0ZSwgTExIID0gMHgleFxuIiwgTExIKSk7Ci0KLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCVBQYWNrZXRJcnBFdmVudC0+RXZlbnRDb2RlID0gSENJX0VWRU5UX0VOSEFOQ0VEX0ZMVVNIX0NPTVBMRVRFOwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gMjsKLQkvKiBMb2dpY2FsIGxpbmsgaGFuZGxlICovCi0JUFBhY2tldElycEV2ZW50LT5EYXRhWzBdID0gVFdPQllURV9MT1dCWVRFKExMSCk7Ci0JUFBhY2tldElycEV2ZW50LT5EYXRhWzFdID0gVFdPQllURV9ISUdIVEJZVEUoTExIKTsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgNCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9FdmVudFNob3J0UmFuZ2VNb2RlQ2hhbmdlQ29tcGxldGUoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQllbnVtIGhjaV9zdGF0dXMJCQkJSGNpU3RhdHVzLAotCXU4IAkJU2hvcnRSYW5nZVN0YXRlLAotCXU4IAkJRW50cnlOdW0KLQkpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCXU4IGxvY2FsQnVmWzVdID0gIiI7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JaWYgKCEocEJ0SGNpSW5mby0+QlRFdmVudE1hc2tQYWdlMiAmIEVNUDJfSENJX0VWRU5UX1NIT1JUX1JBTkdFX01PREVfQ0hBTkdFX0NPTVBMRVRFKSkgewotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfRVZFTlQsCi0JCQkoIltCVCBldmVudF0sIFNob3J0IFJhbmdlIE1vZGUgQ2hhbmdlIENvbXBsZXRlLCBJZ25vcmUgdG8gc2VuZCB0aGlzIGV2ZW50IGR1ZSB0byBldmVudCBtYXNrIHBhZ2UgMlxuIikpOwotCQlyZXR1cm47Ci0JfQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVCwgKCJbQlQgZXZlbnRdLCBTaG9ydCBSYW5nZSBNb2RlIENoYW5nZSBDb21wbGV0ZSwgU3RhdHVzID0gJWRcbiAsIFBMSCA9IDB4JXhcbiwgU2hvcnRfUmFuZ2VfTW9kZV9TdGF0ZSA9IDB4JXhcbiIsCi0JCUhjaVN0YXR1cywgcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkJ0UGh5TGlua2hhbmRsZSwgU2hvcnRSYW5nZVN0YXRlKSk7Ci0KLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCVBQYWNrZXRJcnBFdmVudC0+RXZlbnRDb2RlID0gSENJX0VWRU5UX1NIT1JUX1JBTkdFX01PREVfQ0hBTkdFX0NPTVBMRVRFOwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gMzsKLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMF0gPSBIY2lTdGF0dXM7Ci0JUFBhY2tldElycEV2ZW50LT5EYXRhWzFdID0gcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkJ0UGh5TGlua2hhbmRsZTsKLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMl0gPSBTaG9ydFJhbmdlU3RhdGU7Ci0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCA1KTsKLX0KLQotc3RhdGljIHZvaWQgYnRoY2lfRXZlbnRTZW5kRmxvd1NwZWNNb2RpZnlDb21wbGV0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCQkJICBlbnVtIGhjaV9zdGF0dXMgSGNpU3RhdHVzLAotCQkJCQkJICB1MTYgbG9naWNIYW5kbGUpCi17Ci0JdTggbG9jYWxCdWZbNV0gPSAiIjsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCi0JaWYgKCEocEJ0SGNpSW5mby0+QlRFdmVudE1hc2tQYWdlMiAmIEVNUDJfSENJX0VWRU5UX0ZMT1dfU1BFQ19NT0RJRllfQ09NUExFVEUpKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfRVZFTlR8SU9DVExfQlRfTE9HTyksCi0JCQkoIltCVCBldmVudF0sIEZsb3cgU3BlYyBNb2RpZnkgQ29tcGxldGUsIElnbm9yZSB0byBzZW5kIHRoaXMgZXZlbnQgZHVlIHRvIGV2ZW50IG1hc2sgcGFnZSAyXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0JUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVHxJT0NUTF9CVF9MT0dPKSwKLQkJKCJbQlQgZXZlbnRdLCBGbG93IFNwZWMgTW9kaWZ5IENvbXBsZXRlLCBzdGF0dXMgPSAweCV4LCBMTEggPSAweCV4XG4iLCBIY2lTdGF0dXMsIGxvZ2ljSGFuZGxlKSk7Ci0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQlQUGFja2V0SXJwRXZlbnQtPkV2ZW50Q29kZSA9IEhDSV9FVkVOVF9GTE9XX1NQRUNfTU9ESUZZX0NPTVBMRVRFOwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gMzsKLQotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVswXSA9IEhjaVN0YXR1czsKLQkvKiBMb2dpY2FsIGxpbmsgaGFuZGxlICovCi0JUFBhY2tldElycEV2ZW50LT5EYXRhWzFdID0gVFdPQllURV9MT1dCWVRFKGxvZ2ljSGFuZGxlKTsKLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMl0gPSBUV09CWVRFX0hJR0hUQllURShsb2dpY0hhbmRsZSk7Ci0KLQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIDUpOwotfQotCi1zdGF0aWMgdm9pZAotYnRoY2lfRXZlbnRFeHRXaWZpU2Nhbk5vdGlmeSgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXU4IAkJCXNjYW5UeXBlCi0JKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXU4IGxlbiA9IDA7Ci0JdTggbG9jYWxCdWZbN10gPSAiIjsKLQl1OCAqcFJldFBhcjsKLQl1OCAqcHUxVGVtcDsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQlpZiAoIXBCdE1nbnQtPkJ0T3BlcmF0aW9uT24pCi0JCXJldHVybjsKLQotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQlsZW4gKz0gYnRoY2lfRXh0ZW5zaW9uRXZlbnRIZWFkZXJSdGsoJmxvY2FsQnVmWzBdLCBIQ0lfRVZFTlRfRVhUX1dJRklfU0NBTl9OT1RJRlkpOwotCi0JLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCXB1MVRlbXAgPSAodTggKikmcFJldFBhclswXTsKLQkqcHUxVGVtcCA9IHNjYW5UeXBlOwotCWxlbiArPSAxOwotCi0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQlpZiAoYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMikgPT0gUlRfU1RBVFVTX1NVQ0NFU1MpIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0VWRU5ULCAoIltCVCBldmVudF0sIFdpZmkgc2NhbiBub3RpZnksIHNjYW4gdHlwZSA9ICVkXG4iLAotCQkJc2NhblR5cGUpKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9FdmVudEFNUFJlY2VpdmVyUmVwb3J0KAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JdTggUmVhc29uCi0JKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQotCWlmIChwQnRIY2lJbmZvLT5iVGVzdE5lZWRSZXBvcnQpIHsKLQkJdTggbG9jYWxCdWZbMjBdID0gIiI7Ci0JCXUzMgkqcHU0VGVtcDsKLQkJdTE2CSpwdTJUZW1wOwotCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVHxJT0NUTF9CVF9MT0dPKSwgKCIgSENJX0VWRU5UX0FNUF9SRUNFSVZFUl9SRVBPUlRcbiIpKTsKLQkJUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQkJUFBhY2tldElycEV2ZW50LT5FdmVudENvZGUgPSBIQ0lfRVZFTlRfQU1QX1JFQ0VJVkVSX1JFUE9SVDsKLQkJUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSAyOwotCi0JCVBQYWNrZXRJcnBFdmVudC0+RGF0YVswXSA9IHBCdEhjaUluZm8tPlRlc3RDdHJUeXBlOwotCi0JCVBQYWNrZXRJcnBFdmVudC0+RGF0YVsxXSA9IFJlYXNvbjsKLQotCQlwdTRUZW1wID0gKHUzMiAqKSZQUGFja2V0SXJwRXZlbnQtPkRhdGFbMl07Ci0JCSpwdTRUZW1wID0gcEJ0SGNpSW5mby0+VGVzdEV2ZW50VHlwZTsKLQotCQlwdTJUZW1wID0gKHUxNiAqKSZQUGFja2V0SXJwRXZlbnQtPkRhdGFbNl07Ci0JCSpwdTJUZW1wID0gcEJ0SGNpSW5mby0+VGVzdE51bU9mRnJhbWU7Ci0KLQkJcHUyVGVtcCA9ICh1MTYgKikmUFBhY2tldElycEV2ZW50LT5EYXRhWzhdOwotCQkqcHUyVGVtcCA9IHBCdEhjaUluZm8tPlRlc3ROdW1PZkVyckZyYW1lOwotCi0JCXB1NFRlbXAgPSAodTMyICopJlBQYWNrZXRJcnBFdmVudC0+RGF0YVsxMF07Ci0JCSpwdTRUZW1wID0gcEJ0SGNpSW5mby0+VGVzdE51bU9mQml0czsKLQotCQlwdTRUZW1wID0gKHUzMiAqKSZQUGFja2V0SXJwRXZlbnQtPkRhdGFbMTRdOwotCQkqcHU0VGVtcCA9IHBCdEhjaUluZm8tPlRlc3ROdW1PZkVyckJpdHM7Ci0KLQkJYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCAyMCk7Ci0KLQkJLyogUmV0dXJuIHRvIElkZWwgc3RhdGUgd2l0aCBSWCBhbmQgVFggb2ZmLiAqLwotCi0JfQotCi0JcEJ0SGNpSW5mby0+VGVzdE51bU9mRnJhbWUgPSAweDAwOwotfQotCi1zdGF0aWMgdm9pZAotYnRoY2lfRXZlbnRDaGFubmVsU2VsZWN0ZWQoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQl1OCAJRW50cnlOdW0KLQkpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCXU4IGxvY2FsQnVmWzNdID0gIiI7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JaWYgKCEocEJ0SGNpSW5mby0+QlRFdmVudE1hc2tQYWdlMiAmIEVNUDJfSENJX0VWRU5UX0NIQU5ORUxfU0VMRUNUKSkgewotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfRVZFTlQsCi0JCQkoIltCVCBldmVudF0sIENoYW5uZWwgU2VsZWN0ZWQsIElnbm9yZSB0byBzZW5kIHRoaXMgZXZlbnQgZHVlIHRvIGV2ZW50IG1hc2sgcGFnZSAyXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfRVZFTlR8SU9DVExfU1RBVEUsCi0JCSgiW0JUIGV2ZW50XSwgQ2hhbm5lbCBTZWxlY3RlZCwgUGh5TGlua0hhbmRsZSAlZFxuIiwKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkJ0UGh5TGlua2hhbmRsZSkpOwotCi0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQlQUGFja2V0SXJwRXZlbnQtPkV2ZW50Q29kZSA9IEhDSV9FVkVOVF9DSEFOTkVMX1NFTEVDVDsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IDE7Ci0JUFBhY2tldElycEV2ZW50LT5EYXRhWzBdID0gcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkJ0UGh5TGlua2hhbmRsZTsKLQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIDMpOwotfQotCi1zdGF0aWMgdm9pZAotYnRoY2lfRXZlbnREaXNjb25uZWN0UGh5TGlua0NvbXBsZXRlKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JZW51bSBoY2lfc3RhdHVzCQkJCUhjaVN0YXR1cywKLQllbnVtIGhjaV9zdGF0dXMJCQkJUmVhc29uLAotCXU4IAkJRW50cnlOdW0KLQkpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCXU4IGxvY2FsQnVmWzVdID0gIiI7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JaWYgKCEocEJ0SGNpSW5mby0+QlRFdmVudE1hc2tQYWdlMiAmIEVNUDJfSENJX0VWRU5UX0RJU0NPTk5FQ1RfUEhZX0xJTktfQ09NUExFVEUpKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVCwKLQkJCSgiW0JUIGV2ZW50XSwgRGlzY29ubmVjdCBQaHlzaWNhbCBMaW5rIENvbXBsZXRlLCBJZ25vcmUgdG8gc2VuZCB0aGlzIGV2ZW50IGR1ZSB0byBldmVudCBtYXNrIHBhZ2UgMlxuIikpOwotCQlyZXR1cm47Ci0JfQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVCwKLQkJKCJbQlQgZXZlbnRdLCBEaXNjb25uZWN0IFBoeXNpY2FsIExpbmsgQ29tcGxldGUsIFN0YXR1cyA9IDB4JXgsIFBMSCA9IDB4JXggUmVhc29uID0gMHgleFxuIiwKLQkJSGNpU3RhdHVzLCBwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRQaHlMaW5raGFuZGxlLCBSZWFzb24pKTsKLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCVBQYWNrZXRJcnBFdmVudC0+RXZlbnRDb2RlID0gSENJX0VWRU5UX0RJU0NPTk5FQ1RfUEhZX0xJTktfQ09NUExFVEU7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSAzOwotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVswXSA9IEhjaVN0YXR1czsKLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMV0gPSBwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRQaHlMaW5raGFuZGxlOwotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVsyXSA9IFJlYXNvbjsKLQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIDUpOwotfQotCi1zdGF0aWMgdm9pZAotYnRoY2lfRXZlbnRQaHlzaWNhbExpbmtDb21wbGV0ZSgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCWVudW0gaGNpX3N0YXR1cwkJCQlIY2lTdGF0dXMsCi0JdTggCQlFbnRyeU51bSwKLQl1OCAJCVBMSGFuZGxlCi0JKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0Jc3RydWN0IGJ0X2RnYiAqcEJ0RGJnID0gJnBCVEluZm8tPkJ0RGJnOwotCXU4IGxvY2FsQnVmWzRdID0gIiI7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCXU4IFBMX2hhbmRsZTsKLQotCXBCdE1nbnQtPmJQaHlMaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwotCXBCdERiZy0+ZGJnSGNpSW5mby5oY2lDbWRQaHlMaW5rU3RhdHVzID0gSGNpU3RhdHVzOwotCWlmICghKHBCdEhjaUluZm8tPkJURXZlbnRNYXNrUGFnZTIgJiBFTVAyX0hDSV9FVkVOVF9QSFlfTElOS19DT01QTEVURSkpIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0VWRU5ULAotCQkJKCJbQlQgZXZlbnRdLCBQaHlzaWNhbCBMaW5rIENvbXBsZXRlLCBJZ25vcmUgdG8gc2VuZCB0aGlzIGV2ZW50IGR1ZSB0byBldmVudCBtYXNrIHBhZ2UgMlxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKEVudHJ5TnVtID09IDB4ZmYpIHsKLQkJLyogIGNvbm5lY3Rpb24gbm90IHN0YXJ0ZWQgeWV0LCBqdXN0IHVzZSB0aGUgaW5wdXQgcGh5c2ljYWwgbGluayBoYW5kbGUgdG8gcmVzcG9uc2UuICovCi0JCVBMX2hhbmRsZSA9IFBMSGFuZGxlOwotCX0gZWxzZSB7Ci0JCS8qICBjb25uZWN0aW9uIGlzIHVuZGVyIHByb2dyZXNzLCB1c2UgdGhlIHBoeSBsaW5rIGhhbmRsZSB3ZSByZWNvcmRlZC4gKi8KLQkJUExfaGFuZGxlICA9IHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdFBoeUxpbmtoYW5kbGU7Ci0JCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5iTmVlZFBoeXNMaW5rQ29tcGxldGVFdmVudCA9IGZhbHNlOwotCX0KLQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVCwgKCJbQlQgZXZlbnRdLCBQaHlzaWNhbCBMaW5rIENvbXBsZXRlLCBTdGF0dXMgPSAweCV4IFBoeUxpbmtIYW5kbGUgPSAweCV4XG4iLCBIY2lTdGF0dXMsCi0JCVBMX2hhbmRsZSkpOwotCi0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQlQUGFja2V0SXJwRXZlbnQtPkV2ZW50Q29kZSA9IEhDSV9FVkVOVF9QSFlfTElOS19DT01QTEVURTsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IDI7Ci0KLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMF0gPSBIY2lTdGF0dXM7Ci0JUFBhY2tldElycEV2ZW50LT5EYXRhWzFdID0gUExfaGFuZGxlOwotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgNCk7Ci0KLX0KLQotc3RhdGljIHZvaWQKLWJ0aGNpX0V2ZW50Q29tbWFuZFN0YXR1cygKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXU4IAkJT0dGLAotCXUxNgkJCQkJT0NGLAotCWVudW0gaGNpX3N0YXR1cwkJCQlIY2lTdGF0dXMKLQkpCi17Ci0KLQl1OCBsb2NhbEJ1Zls2XSA9ICIiOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQl1OCBOdW1fSGNpX0NvbW0gPSAweDE7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0VWRU5ULAotCQkoIltCVCBldmVudF0sIENvbW1hbmRTdGF0dXMsIE9wY29kZSA9IDB4JTAyeCUwMngsIE9HRiA9IDB4JXgsICBPQ0YgPSAweCV4LCBTdGF0dXMgPSAweCV4LCBOdW1fSENJX0NPTU0gPSAweCV4XG4iLAotCQkoSENJT1BDT0RFSElHSFQoT0NGLCBPR0YpKSwgKEhDSU9QQ09ERUxPVyhPQ0YsIE9HRikpLCBPR0YsIE9DRiwgSGNpU3RhdHVzLCBOdW1fSGNpX0NvbW0pKTsKLQotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0JUFBhY2tldElycEV2ZW50LT5FdmVudENvZGUgPSBIQ0lfRVZFTlRfQ09NTUFORF9TVEFUVVM7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSA0OwotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVswXSA9IEhjaVN0YXR1czsJLyogY3VycmVudCBwZW5kaW5nICovCi0JUFBhY2tldElycEV2ZW50LT5EYXRhWzFdID0gTnVtX0hjaV9Db21tOwkvKiBwYWNrZXQgIyAqLwotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVsyXSA9IEhDSU9QQ09ERUxPVyhPQ0YsIE9HRik7Ci0JUFBhY2tldElycEV2ZW50LT5EYXRhWzNdID0gSENJT1BDT0RFSElHSFQoT0NGLCBPR0YpOwotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCA2KTsKLQotfQotCi1zdGF0aWMgdm9pZAotYnRoY2lfRXZlbnRMb2dpY2FsTGlua0NvbXBsZXRlKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JZW51bSBoY2lfc3RhdHVzCQkJCUhjaVN0YXR1cywKLQl1OCAJCVBoeUxpbmtIYW5kbGUsCi0JdTE2CQkJCQlMb2dMaW5rSGFuZGxlLAotCXU4IAkJTG9nTGlua0luZGV4LAotCXU4IAkJRW50cnlOdW0KLQkpCi17Ci0vKlBNR05UX0lORk8gcE1nbnRJbmZvID0gJnBhZGFwdGVyLT5NZ250SW5mbzsgKi8KLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0JdTggbG9jYWxCdWZbN10gPSAiIjsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQlpZiAoIShwQnRIY2lJbmZvLT5CVEV2ZW50TWFza1BhZ2UyICYgRU1QMl9IQ0lfRVZFTlRfTE9HSUNBTF9MSU5LX0NPTVBMRVRFKSkgewotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfRVZFTlQsCi0JCQkoIltCVCBldmVudF0sIExvZ2ljYWwgTGluayBDb21wbGV0ZSwgSWdub3JlIHRvIHNlbmQgdGhpcyBldmVudCBkdWUgdG8gZXZlbnQgbWFzayBwYWdlIDJcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfRVZFTlQsICgiW0JUIGV2ZW50XSwgTG9naWNhbCBMaW5rIENvbXBsZXRlLCBQaHlMaW5rSGFuZGxlID0gMHgleCwgIExvZ0xpbmtIYW5kbGUgPSAweCV4LCBTdGF0dXMgPSAweCV4XG4iLAotCQlQaHlMaW5rSGFuZGxlLCBMb2dMaW5rSGFuZGxlLCBIY2lTdGF0dXMpKTsKLQotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0JUFBhY2tldElycEV2ZW50LT5FdmVudENvZGUgPSBIQ0lfRVZFTlRfTE9HSUNBTF9MSU5LX0NPTVBMRVRFOwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gNTsKLQotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVswXSA9IEhjaVN0YXR1czsvKiBzdGF0dXMgY29kZSAqLwotCS8qIExvZ2ljYWwgbGluayBoYW5kbGUgKi8KLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMV0gPSBUV09CWVRFX0xPV0JZVEUoTG9nTGlua0hhbmRsZSk7Ci0JUFBhY2tldElycEV2ZW50LT5EYXRhWzJdID0gVFdPQllURV9ISUdIVEJZVEUoTG9nTGlua0hhbmRsZSk7Ci0JLyogUGh5c2ljYWwgbGluayBoYW5kbGUgKi8KLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbM10gPSBUV09CWVRFX0xPV0JZVEUoUGh5TGlua0hhbmRsZSk7Ci0JLyogY29ycmVzcG9uZGluZyBUeCBmbG93IHNwZWMgSUQgKi8KLQlpZiAoSGNpU3RhdHVzID09IEhDSV9TVEFUVVNfU1VDQ0VTUykgewotCQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbNF0gPQotCQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW0xvZ0xpbmtJbmRleF0uVHhfRmxvd19TcGVjLklkZW50aWZpZXI7Ci0JfSBlbHNlIHsKLQkJUFBhY2tldElycEV2ZW50LT5EYXRhWzRdID0gMHgwOwotCX0KLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgNyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9FdmVudERpc2Nvbm5lY3RMb2dpY2FsTGlua0NvbXBsZXRlKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JZW51bSBoY2lfc3RhdHVzCQkJCUhjaVN0YXR1cywKLQl1MTYJCQkJCUxvZ0xpbmtIYW5kbGUsCi0JZW51bSBoY2lfc3RhdHVzCQkJCVJlYXNvbgotCSkKLXsKLQl1OCBsb2NhbEJ1Zls2XSA9ICIiOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQlpZiAoIShwQnRIY2lJbmZvLT5CVEV2ZW50TWFza1BhZ2UyICYgRU1QMl9IQ0lfRVZFTlRfRElTQ09OTkVDVF9MT0dJQ0FMX0xJTktfQ09NUExFVEUpKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVCwgKCJbQlQgZXZlbnRdLCBEaXNjb25uZWN0IExvZ2ljYWwgTGluayBDb21wbGV0ZSwgSWdub3JlIHRvIHNlbmQgdGhpcyBldmVudCBkdWUgdG8gZXZlbnQgbWFzayBwYWdlIDJcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfRVZFTlQsICgiW0JUIGV2ZW50XSwgRGlzY29ubmVjdCBMb2dpY2FsIExpbmsgQ29tcGxldGUsIFN0YXR1cyA9IDB4JXgsIExMSCA9IDB4JXggUmVhc29uID0gMHgleFxuIiwgSGNpU3RhdHVzLCBMb2dMaW5rSGFuZGxlLCBSZWFzb24pKTsKLQotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0JUFBhY2tldElycEV2ZW50LT5FdmVudENvZGUgPSBIQ0lfRVZFTlRfRElTQ09OTkVDVF9MT0dJQ0FMX0xJTktfQ09NUExFVEU7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSA0OwotCi0JUFBhY2tldElycEV2ZW50LT5EYXRhWzBdID0gSGNpU3RhdHVzOwotCS8qIExvZ2ljYWwgbGluayBoYW5kbGUgKi8KLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMV0gPSBUV09CWVRFX0xPV0JZVEUoTG9nTGlua0hhbmRsZSk7Ci0JUFBhY2tldElycEV2ZW50LT5EYXRhWzJdID0gVFdPQllURV9ISUdIVEJZVEUoTG9nTGlua0hhbmRsZSk7Ci0JLyogRGlzY29ubmVjdCByZWFzb24gKi8KLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbM10gPSBSZWFzb247Ci0KLQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIDYpOwotfQotCi1zdGF0aWMgdm9pZAotYnRoY2lfRXZlbnRGbHVzaE9jY3VycmVkKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JdTE2CQkJCQlMb2dMaW5rSGFuZGxlCi0JKQotewotCXU4IGxvY2FsQnVmWzRdID0gIiI7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVCwgKCJidGhjaV9FdmVudEZsdXNoT2NjdXJyZWQoKSwgTExIID0gMHgleFxuIiwgTG9nTGlua0hhbmRsZSkpOwotCi0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQlQUGFja2V0SXJwRXZlbnQtPkV2ZW50Q29kZSA9IEhDSV9FVkVOVF9GTFVTSF9PQ0NSVUVEOwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gMjsKLQkvKiBMb2dpY2FsIGxpbmsgaGFuZGxlICovCi0JUFBhY2tldElycEV2ZW50LT5EYXRhWzBdID0gVFdPQllURV9MT1dCWVRFKExvZ0xpbmtIYW5kbGUpOwotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVsxXSA9IFRXT0JZVEVfSElHSFRCWVRFKExvZ0xpbmtIYW5kbGUpOwotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCA0KTsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQnVpbGRQaHlzaWNhbExpbmsoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZCwKLQl1MTYJT0NGCi0pCi17Ci0JZW51bSBoY2lfc3RhdHVzCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0JdTggRW50cnlOdW0sIFBMSDsKLQotCS8qIFNlbmQgSENJIENvbW1hbmQgc3RhdHVzIGV2ZW50IHRvIEFNUC4gKi8KLQlidGhjaV9FdmVudENvbW1hbmRTdGF0dXMocGFkYXB0ZXIsCi0JCQlMSU5LX0NPTlRST0xfQ09NTUFORFMsCi0JCQlPQ0YsCi0JCQlIQ0lfU1RBVFVTX1NVQ0NFU1MpOwotCi0JUExIID0gKigodTggKilwSGNpQ21kLT5EYXRhKTsKLQotCS8qICBDaGVjayBpZiByZXNvdXJjZSBvciBidCBjb25uZWN0aW9uIGlzIHVuZGVyIHByb2dyZXNzLCBpZiB5ZXMsIHJlamVjdCB0aGUgbGluayBjcmVhdGlvbi4gKi8KLQlpZiAoIWJ0aGNpX0FkZEVudHJ5KHBhZGFwdGVyKSkgewotCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX0NPTk5FQ1RfUkpUX0xJTUlUX1JFU09VUkNFOwotCQlidGhjaV9FdmVudFBoeXNpY2FsTGlua0NvbXBsZXRlKHBhZGFwdGVyLCBzdGF0dXMsIElOVkFMSURfRU5UUllfTlVNLCBQTEgpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCUVudHJ5TnVtID0gcEJ0TWdudC0+Q3VycmVudENvbm5lY3RFbnRyeU51bTsKLQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRQaHlMaW5raGFuZGxlID0gUExIOwotCXBCdE1nbnQtPkJ0Q3VycmVudFBoeUxpbmtoYW5kbGUgPSBQTEg7Ci0KLQlpZiAocEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkFtcEFzb2NDbWREYXRhLkFNUEFzc29jZnJhZ21lbnQgPT0gTlVMTCkgewotCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCJDcmVhdGUvQWNjZXB0IFBoeXNpY2FsTGluaywgQU1QIGNvbnRyb2xsZXIgaXMgYnVzeVxuIikpOwotCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX0NPTlRST0xMRVJfQlVTWTsKLQkJYnRoY2lfRXZlbnRQaHlzaWNhbExpbmtDb21wbGV0ZShwYWRhcHRlciwgc3RhdHVzLCBJTlZBTElEX0VOVFJZX05VTSwgUExIKTsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQkvKiAgUmVjb3JkIEtleSBhbmQgdGhlIGluZm8gKi8KLQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRBTVBLZXlMZW4gPSAoKigodTggKilwSGNpQ21kLT5EYXRhKzEpKTsKLQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRBTVBLZXlUeXBlID0gKCooKHU4ICopcEhjaUNtZC0+RGF0YSsyKSk7Ci0JbWVtY3B5KHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdEFNUEtleSwKLQkJKCgodTggKilwSGNpQ21kLT5EYXRhKzMpKSwgcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkJ0QU1QS2V5TGVuKTsKLQltZW1jcHkocEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBNSywgcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkJ0QU1QS2V5LCBQTUtfTEVOKTsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkJ1aWxkUGh5c2ljYWxMaW5rLCBFbnRyeU51bSA9ICVkLCBQTEggPSAweCV4ICBLZXlMZW4gPSAweCV4LCBLZXlUeXBlID0gMHgleFxuIiwKLQkJRW50cnlOdW0sIHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdFBoeUxpbmtoYW5kbGUsCi0JCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdEFNUEtleUxlbiwKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkJ0QU1QS2V5VHlwZSkpOwotCVJUUFJJTlRfREFUQShGSU9DVEwsIChJT0NUTF9CVF9MT0dPfElPQ1RMX0JUX0hDSUNNRCksICgiQnRBTVBLZXlcbiIpLCBwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRBTVBLZXksCi0JCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdEFNUEtleUxlbik7Ci0JUlRQUklOVF9EQVRBKEZJT0NUTCwgKElPQ1RMX0JUX0xPR098SU9DVExfQlRfSENJQ01EKSwgKCJQTUtcbiIpLCBwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUE1LLAotCQlQTUtfTEVOKTsKLQotCWlmIChPQ0YgPT0gSENJX0NSRUFURV9QSFlTSUNBTF9MSU5LKSB7Ci0JCS8qIFRoZXNlIG1hY3JvcyByZXF1aXJlIGJyYWNlcyAqLwotCQlCVEhDSV9TTV9XSVRIX0lORk8ocGFkYXB0ZXIsIEhDSV9TVEFURV9ESVNDT05ORUNURUQsIFNUQVRFX0NNRF9DUkVBVEVfUEhZX0xJTkssIEVudHJ5TnVtKTsKLQl9IGVsc2UgaWYgKE9DRiA9PSBIQ0lfQUNDRVBUX1BIWVNJQ0FMX0xJTkspIHsKLQkJQlRIQ0lfU01fV0lUSF9JTkZPKHBhZGFwdGVyLCBIQ0lfU1RBVEVfRElTQ09OTkVDVEVELCBTVEFURV9DTURfQUNDRVBUX1BIWV9MSU5LLCBFbnRyeU51bSk7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIHZvaWQKLWJ0aGNpX0J1aWxkTG9naWNhbExpbmsoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZCwKLQl1MTYgT0NGCi0JKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUaW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRpbmZvLT5CdE1nbnQ7Ci0JdTggUGh5TGlua0hhbmRsZSwgRW50cnlOdW07Ci0Jc3RhdGljIHUxNiBBc3NpZ25Mb2dIYW5kbGUgPSAxOwotCi0Jc3RydWN0IGhjaV9mbG93X3NwZWMJVHhGbG93U3BlYzsKLQlzdHJ1Y3QgaGNpX2Zsb3dfc3BlYwlSeEZsb3dTcGVjOwotCXUzMglNYXhTRFVTaXplLCBBcnJpdmVUaW1lLCBCYW5kd2lkdGg7Ci0KLQlQaHlMaW5rSGFuZGxlID0gKigodTggKilwSGNpQ21kLT5EYXRhKTsKLQotCUVudHJ5TnVtID0gYnRoY2lfR2V0Q3VycmVudEVudHJ5TnVtKHBhZGFwdGVyLCBQaHlMaW5rSGFuZGxlKTsKLQotCW1lbWNweSgmVHhGbG93U3BlYywKLQkJJnBIY2lDbWQtPkRhdGFbMV0sIHNpemVvZihzdHJ1Y3QgaGNpX2Zsb3dfc3BlYykpOwotCW1lbWNweSgmUnhGbG93U3BlYywKLQkJJnBIY2lDbWQtPkRhdGFbMTddLCBzaXplb2Yoc3RydWN0IGhjaV9mbG93X3NwZWMpKTsKLQotCU1heFNEVVNpemUgPSBUeEZsb3dTcGVjLk1heGltdW1TRFVTaXplOwotCUFycml2ZVRpbWUgPSBUeEZsb3dTcGVjLlNEVUludGVyQXJyaXZhbFRpbWU7Ci0KLQlpZiAoYnRoY2lfQ2hlY2tMb2dMaW5rQmVoYXZpb3IocGFkYXB0ZXIsIFR4Rmxvd1NwZWMpICYmIGJ0aGNpX0NoZWNrTG9nTGlua0JlaGF2aW9yKHBhZGFwdGVyLCBSeEZsb3dTcGVjKSkKLQkJQmFuZHdpZHRoID0gQlRUT1RBTEJBTkRXSURUSDsKLQllbHNlIGlmIChNYXhTRFVTaXplID09IDB4ZmZmZiAmJiBBcnJpdmVUaW1lID09IDB4ZmZmZmZmZmYpCi0JCUJhbmR3aWR0aCA9IEJUVE9UQUxCQU5EV0lEVEg7Ci0JZWxzZQotCQlCYW5kd2lkdGggPSBNYXhTRFVTaXplKjgqMTAwMC8oQXJyaXZlVGltZSsyNDQpOwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwKLQkJKCJCdWlsZExvZ2ljYWxMaW5rLCBQaHlMaW5rSGFuZGxlID0gMHgleCwgTWF4aW11bVNEVVNpemUgPSAweCV4LCBTRFVJbnRlckFycml2YWxUaW1lID0gMHgleCwgQmFuZHdpZHRoID0gMHgleFxuIiwKLQkJUGh5TGlua0hhbmRsZSwgTWF4U0RVU2l6ZSwgQXJyaXZlVGltZSwgQmFuZHdpZHRoKSk7Ci0KLQlpZiAoRW50cnlOdW0gPT0gMHhmZikgewotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkludmFsaWQgUGh5c2ljYWwgTGluayBoYW5kbGUgPSAweCV4LCBzdGF0dXMgPSBIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lELCByZXR1cm5cbiIsIFBoeUxpbmtIYW5kbGUpKTsKLQkJc3RhdHVzID0gSENJX1NUQVRVU19VTktOT1dfQ09OTkVDVF9JRDsKLQotCQkvKiBXaGVuIHdlIHJlY2VpdmUgQ3JlYXRlL0FjY2VwdCBsb2dpY2FsIGxpbmsgY29tbWFuZCwgd2Ugc2hvdWxkIHNlbmQgY29tbWFuZCBzdGF0dXMgZXZlbnQgZmlyc3QuICovCi0JCWJ0aGNpX0V2ZW50Q29tbWFuZFN0YXR1cyhwYWRhcHRlciwKLQkJCUxJTktfQ09OVFJPTF9DT01NQU5EUywKLQkJCU9DRiwKLQkJCXN0YXR1cyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoIXBCdE1nbnQtPmJMb2dMaW5rSW5Qcm9ncmVzcykgewotCQlpZiAoYnRoY2lfUGh5TGlua0Nvbm5lY3Rpb25JblByb2dyZXNzKHBhZGFwdGVyLCBQaHlMaW5rSGFuZGxlKSkgewotCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJQaHlzaWNhbCBsaW5rIGNvbm5lY3Rpb24gaW4gcHJvZ3Jlc3MsIHN0YXR1cyA9IEhDSV9TVEFUVVNfQ01EX0RJU0FMTE9XLCByZXR1cm5cbiIpKTsKLQkJCXN0YXR1cyA9IEhDSV9TVEFUVVNfQ01EX0RJU0FMTE9XOwotCi0JCQlwQnRNZ250LT5iUGh5TGlua0luUHJvZ3Jlc3NTdGFydExMID0gdHJ1ZTsKLQkJCS8qIFdoZW4gd2UgcmVjZWl2ZSBDcmVhdGUvQWNjZXB0IGxvZ2ljYWwgbGluayBjb21tYW5kLCB3ZSBzaG91bGQgc2VuZCBjb21tYW5kIHN0YXR1cyBldmVudCBmaXJzdC4gKi8KLQkJCWJ0aGNpX0V2ZW50Q29tbWFuZFN0YXR1cyhwYWRhcHRlciwKLQkJCQlMSU5LX0NPTlRST0xfQ09NTUFORFMsCi0JCQkJT0NGLAotCQkJCXN0YXR1cyk7Ci0KLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChCYW5kd2lkdGggPiBCVFRPVEFMQkFORFdJRFRIKSB7Ci0JCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoInN0YXR1cyA9IEhDSV9TVEFUVVNfUU9TX1JFSkVDVCwgQmFuZHdpZHRoID0gMHgleCwgcmV0dXJuXG4iLCBCYW5kd2lkdGgpKTsKLQkJCXN0YXR1cyA9IEhDSV9TVEFUVVNfUU9TX1JFSkVDVDsKLQotCQkJLyogV2hlbiB3ZSByZWNlaXZlIENyZWF0ZS9BY2NlcHQgbG9naWNhbCBsaW5rIGNvbW1hbmQsIHdlIHNob3VsZCBzZW5kIGNvbW1hbmQgc3RhdHVzIGV2ZW50IGZpcnN0LiAqLwotCQkJYnRoY2lfRXZlbnRDb21tYW5kU3RhdHVzKHBhZGFwdGVyLAotCQkJCUxJTktfQ09OVFJPTF9DT01NQU5EUywKLQkJCQlPQ0YsCi0JCQkJc3RhdHVzKTsKLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgic3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTXG4iKSk7Ci0JCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0KLQkJCS8qIFdoZW4gd2UgcmVjZWl2ZSBDcmVhdGUvQWNjZXB0IGxvZ2ljYWwgbGluayBjb21tYW5kLCB3ZSBzaG91bGQgc2VuZCBjb21tYW5kIHN0YXR1cyBldmVudCBmaXJzdC4gKi8KLQkJCWJ0aGNpX0V2ZW50Q29tbWFuZFN0YXR1cyhwYWRhcHRlciwKLQkJCQlMSU5LX0NPTlRST0xfQ09NTUFORFMsCi0JCQkJT0NGLAotCQkJCXN0YXR1cyk7Ci0KLQkJfQotCi0JCWlmIChwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQnRDdXJyZW50U3RhdGUgIT0gSENJX1NUQVRFX0NPTk5FQ1RFRCkgewotCQkJYnRoY2lfRXZlbnRMb2dpY2FsTGlua0NvbXBsZXRlKHBhZGFwdGVyLAotCQkJCUhDSV9TVEFUVVNfQ01EX0RJU0FMTE9XLCAwLCAwLCAwLCBFbnRyeU51bSk7Ci0JCX0gZWxzZSB7Ci0JCQl1OCBpLCBmaW5kID0gMDsKLQotCQkJcEJ0TWdudC0+YkxvZ0xpbmtJblByb2dyZXNzID0gdHJ1ZTsKLQotCQkJLyogIGZpbmQgYW4gdW51c2VkIGxvZ2ljYWwgbGluayBpbmRleCBhbmQgY29weSB0aGUgZGF0YSAqLwotCQkJZm9yIChpID0gMDsgaSA8IE1BWF9MT0dJQ0FMX0xJTktfTlVNOyBpKyspIHsKLQkJCQlpZiAocEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2ldLkJ0TG9nTGlua2hhbmRsZSA9PSAwKSB7Ci0JCQkJCWVudW0gaGNpX3N0YXR1cyBMb2dDb21wRXZlbnRzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0KLQkJCQkJcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2ldLkJ0UGh5TGlua2hhbmRsZSA9ICooKHU4ICopcEhjaUNtZC0+RGF0YSk7Ci0JCQkJCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpXS5CdExvZ0xpbmtoYW5kbGUgPSBBc3NpZ25Mb2dIYW5kbGU7Ci0JCQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiQnVpbGRMb2dpY2FsTGluaywgRW50cnlOdW0gPSAlZCwgcGh5c2ljYWwgbGluayBoYW5kbGUgPSAweCV4LCBsb2dpY2FsIGxpbmsgaGFuZGxlID0gMHgleFxuIiwKLQkJCQkJCUVudHJ5TnVtLCBwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRQaHlMaW5raGFuZGxlLAotCQkJCQkJCQkgIHBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpXS5CdExvZ0xpbmtoYW5kbGUpKTsKLQkJCQkJbWVtY3B5KCZwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaV0uVHhfRmxvd19TcGVjLAotCQkJCQkJJlR4Rmxvd1NwZWMsIHNpemVvZihzdHJ1Y3QgaGNpX2Zsb3dfc3BlYykpOwotCQkJCQltZW1jcHkoJnBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpXS5SeF9GbG93X1NwZWMsCi0JCQkJCQkmUnhGbG93U3BlYywgc2l6ZW9mKHN0cnVjdCBoY2lfZmxvd19zcGVjKSk7Ci0KLQkJCQkJcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2ldLmJMTENvbXBsZXRlRXZlbnRJc1NldCA9IGZhbHNlOwotCi0JCQkJCWlmIChwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaV0uYkxMQ2FuY2VsQ01ESXNTZXRhbmRDb21wbGV0ZSkKLQkJCQkJCUxvZ0NvbXBFdmVudHN0YXR1cyA9IEhDSV9TVEFUVVNfVU5LTk9XX0NPTk5FQ1RfSUQ7Ci0JCQkJCWJ0aGNpX0V2ZW50TG9naWNhbExpbmtDb21wbGV0ZShwYWRhcHRlciwKLQkJCQkJCUxvZ0NvbXBFdmVudHN0YXR1cywKLQkJCQkJCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpXS5CdFBoeUxpbmtoYW5kbGUsCi0JCQkJCQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaV0uQnRMb2dMaW5raGFuZGxlLCBpLCBFbnRyeU51bSk7Ci0KLQkJCQkJcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2ldLmJMTENvbXBsZXRlRXZlbnRJc1NldCA9IHRydWU7Ci0KLQkJCQkJZmluZCA9IDE7Ci0JCQkJCXBCdE1nbnQtPkJ0Q3VycmVudExvZ0xpbmtoYW5kbGUgPSBBc3NpZ25Mb2dIYW5kbGU7Ci0JCQkJCUFzc2lnbkxvZ0hhbmRsZSsrOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghZmluZCkgewotCQkJCWJ0aGNpX0V2ZW50TG9naWNhbExpbmtDb21wbGV0ZShwYWRhcHRlciwKLQkJCQkJSENJX1NUQVRVU19DT05ORUNUX1JKVF9MSU1JVF9SRVNPVVJDRSwgMCwgMCwgMCwgRW50cnlOdW0pOwotCQkJfQotCQkJcEJ0TWdudC0+YkxvZ0xpbmtJblByb2dyZXNzID0gZmFsc2U7Ci0JCX0KLQl9IGVsc2UgewotCQlidGhjaV9FdmVudExvZ2ljYWxMaW5rQ29tcGxldGUocGFkYXB0ZXIsCi0JCQlIQ0lfU1RBVFVTX0NPTlRST0xMRVJfQlVTWSwgMCwgMCwgMCwgRW50cnlOdW0pOwotCX0KLQotfQotCi1zdGF0aWMgdm9pZAotYnRoY2lfU3RhcnRCZWFjb25BbmRDb25uZWN0KAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQsCi0JdTggQ3VycmVudEFzc29jTnVtCi0JKQotewotLypQTUdOVF9JTkZPIHBNZ250SW5mbyA9ICZwYWRhcHRlci0+TWdudEluZm87ICovCi0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIlN0YXJ0QmVhY29uQW5kQ29ubmVjdCwgQ3VycmVudEFzc29jTnVtID0lZCwgQU1QUm9sZSA9JWRcbiIsCi0JCUN1cnJlbnRBc3NvY051bSwKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbQ3VycmVudEFzc29jTnVtXS5BTVBSb2xlKSk7Ci0KLQlpZiAoIXBCdE1nbnQtPkNoZWNrQ2hubElzU3VpdCkgewotCQlidGhjaV9FdmVudFBoeXNpY2FsTGlua0NvbXBsZXRlKHBhZGFwdGVyLCBIQ0lfU1RBVFVTX0NPTk5FQ1RfUkVKX05PVF9TVUlUX0NITkxfRk9VTkQsIEN1cnJlbnRBc3NvY051bSwgSU5WQUxJRF9QTF9IQU5ETEUpOwotCQlidGhjaV9SZW1vdmVFbnRyeUJ5RW50cnlOdW0ocGFkYXB0ZXIsIEN1cnJlbnRBc3NvY051bSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocEJUSW5mby0+QnRBc29jRW50cnlbQ3VycmVudEFzc29jTnVtXS5BTVBSb2xlID09IEFNUF9CVEFQX0NSRUFUT1IpIHsKLQkJc25wcmludGYoKGNoYXIgKilwQlRJbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50QXNzb2NOdW1dLkJUU3NpZEJ1ZiwgMzIsCi0JCQkgIkFNUC0lcE1GIiwgcGFkYXB0ZXItPmVlcHJvbXByaXYubWFjX2FkZHIpOwotCX0gZWxzZSBpZiAocEJUSW5mby0+QnRBc29jRW50cnlbQ3VycmVudEFzc29jTnVtXS5BTVBSb2xlID09IEFNUF9CVEFQX0pPSU5FUikgewotCQlzbnByaW50ZigoY2hhciAqKXBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQlRTc2lkQnVmLCAzMiwKLQkJCSAiQU1QLSVwTUYiLCBwQlRJbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50QXNzb2NOdW1dLkJUUmVtb3RlTUFDQWRkcik7Ci0JfQotCi0JRmlsbE9jdGV0U3RyaW5nKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQlRTc2lkLCBwQlRJbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50QXNzb2NOdW1dLkJUU3NpZEJ1ZiwgMjEpOwotCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQlRTc2lkLkxlbmd0aCA9IDIxOwotCi0JLyogVG8gYXZvaWQgc2V0IHRoZSBzdGFydCBhcCBvciBjb25uZWN0IHR3aWNlLCBvciB0aGUgb3JpZ2luYWwgY29ubmVjdGlvbiB3aWxsIGJlIGRpc2Nvbm5lY3RlZC4gKi8KLQlpZiAoIXBCdE1nbnQtPmJCVENvbm5lY3RJblByb2dyZXNzKSB7Ci0JCXBCdE1nbnQtPmJCVENvbm5lY3RJblByb2dyZXNzID0gdHJ1ZTsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIltCVCBGbGFnXSwgQlQgQ29ubmVjdCBpbiBwcm9ncmVzcyBPTiEhXG4iKSk7Ci0JCUJUSENJX1NNX1dJVEhfSU5GTyhwYWRhcHRlciwgSENJX1NUQVRFX1NUQVJUSU5HLCBTVEFURV9DTURfTUFDX1NUQVJUX0NPTVBMRVRFLCBDdXJyZW50QXNzb2NOdW0pOwotCi0JCS8qICAyMDEwMDMyNSBKb3NlcGg6IENoZWNrIFJGIE9OL09GRi4gKi8KLQkJLyogIElmIFJGIE9GRiwgaXQgcmVzY2hlZHVsZSBjb25uZWN0aW5nIG9wZXJhdGlvbiBhZnRlciA1MG1zLiAqLwotCQlpZiAoIWJ0aGNpX0NoZWNrUmZTdGF0ZUJlZm9yZUNvbm5lY3QocGFkYXB0ZXIpKQotCQkJcmV0dXJuOwotCi0JCWlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50QXNzb2NOdW1dLkFNUFJvbGUgPT0gQU1QX0JUQVBfQ1JFQVRPUikgewotCQkJLyogVGhlc2UgbWFjcm9zIG5lZWQgYnJhY2VzICovCi0JCQlCVEhDSV9TTV9XSVRIX0lORk8ocGFkYXB0ZXIsIEhDSV9TVEFURV9DT05ORUNUSU5HLCBTVEFURV9DTURfTUFDX0NPTk5FQ1RfQ09NUExFVEUsIEN1cnJlbnRBc3NvY051bSk7Ci0JCX0gZWxzZSBpZiAocEJUSW5mby0+QnRBc29jRW50cnlbQ3VycmVudEFzc29jTnVtXS5BTVBSb2xlID09IEFNUF9CVEFQX0pPSU5FUikgewotCQkJYnRoY2lfUmVzcG9uZGVyU3RhcnRUb1NjYW4ocGFkYXB0ZXIpOwotCQl9Ci0JfQotCVJUX1BSSU5UX1NUUihfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9ub3RpY2VfLAotCQkgICAgICJTdGFydEJlYWNvbkFuZENvbm5lY3QsIFNTSUQ6XG4iLAotCQkgICAgIHBCVEluZm8tPkJ0QXNvY0VudHJ5W3BCdE1nbnQtPkN1cnJlbnRDb25uZWN0RW50cnlOdW1dLkJUU3NpZC5PY3RldCwKLQkJICAgICBwQlRJbmZvLT5CdEFzb2NFbnRyeVtwQnRNZ250LT5DdXJyZW50Q29ubmVjdEVudHJ5TnVtXS5CVFNzaWQuTGVuZ3RoKTsKLX0KLQotc3RhdGljIHZvaWQgYnRoY2lfUmVzZXRCdE1nbnQoc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQpCi17Ci0JcEJ0TWdudC0+QnRPcGVyYXRpb25PbiA9IGZhbHNlOwotCXBCdE1nbnQtPmJCVENvbm5lY3RJblByb2dyZXNzID0gZmFsc2U7Ci0JcEJ0TWdudC0+YkxvZ0xpbmtJblByb2dyZXNzID0gZmFsc2U7Ci0JcEJ0TWdudC0+YlBoeUxpbmtJblByb2dyZXNzID0gZmFsc2U7Ci0JcEJ0TWdudC0+YlBoeUxpbmtJblByb2dyZXNzU3RhcnRMTCA9IGZhbHNlOwotCXBCdE1nbnQtPkRpc2Nvbm5lY3RFbnRyeU51bSA9IDB4ZmY7Ci0JcEJ0TWdudC0+YlN0YXJ0U2VuZFN1cGVydmlzaW9uUGt0ID0gZmFsc2U7Ci0JcEJ0TWdudC0+Sm9pbmVyTmVlZFNlbmRBdXRoID0gZmFsc2U7Ci0JcEJ0TWdudC0+Q3VycmVudEJUQ29ubmVjdGlvbkNudCA9IDA7Ci0JcEJ0TWdudC0+QlRDdXJyZW50Q29ubmVjdFR5cGUgPSBCVF9ESVNDT05ORUNUOwotCXBCdE1nbnQtPkJUUmVjZWl2ZUNvbm5lY3RQa3QgPSBCVF9ESVNDT05ORUNUOwotCXBCdE1nbnQtPkJUQXV0aENvdW50ID0gMDsKLQlwQnRNZ250LT5idExvZ29UZXN0ID0gMDsKLX0KLQotc3RhdGljIHZvaWQgYnRoY2lfUmVzZXRCdEhjaUluZm8oc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvKQotewotCXBCdEhjaUluZm8tPkJURXZlbnRNYXNrID0gMDsKLQlwQnRIY2lJbmZvLT5CVEV2ZW50TWFza1BhZ2UyID0gMDsKLQlwQnRIY2lJbmZvLT5Db25uQWNjZXB0VGltZW91dCA9ICAxMDAwMDsKLQlwQnRIY2lJbmZvLT5QYWdlVGltZW91dCAgPSAgMHgzMDsKLQlwQnRIY2lJbmZvLT5Mb2NhdGlvbkRvbWFpbkF3YXJlID0gMHgwOwotCXBCdEhjaUluZm8tPkxvY2F0aW9uRG9tYWluID0gMHg1ODU4OwotCXBCdEhjaUluZm8tPkxvY2F0aW9uRG9tYWluT3B0aW9ucyA9IDB4NTg7Ci0JcEJ0SGNpSW5mby0+TG9jYXRpb25PcHRpb25zID0gMHgwOwotCXBCdEhjaUluZm8tPkZsb3dDb250cm9sTW9kZSA9IDB4MTsJLyogIDA6UGFja2V0IGJhc2VkIGRhdGEgZmxvdyBjb250cm9sIG1vZGUoQlIvRURSKSwgMTogRGF0YSBibG9jayBiYXNlZCBkYXRhIGZsb3cgY29udHJvbCBtb2RlKEFNUCkuICovCi0KLQlwQnRIY2lJbmZvLT5lbkZsdXNoX0xMSCA9IDA7Ci0JcEJ0SGNpSW5mby0+RkxUT19MTEggPSAwOwotCi0JLyogVGVzdCBjb21tYW5kIG9ubHkgKi8KLQlwQnRIY2lJbmZvLT5iVGVzdElzRW5kID0gdHJ1ZTsKLQlwQnRIY2lJbmZvLT5iSW5UZXN0TW9kZSA9IGZhbHNlOwotCXBCdEhjaUluZm8tPmJUZXN0TmVlZFJlcG9ydCA9IGZhbHNlOwotCXBCdEhjaUluZm8tPlRlc3RTY2VuYXJpbyA9IDB4ZmY7Ci0JcEJ0SGNpSW5mby0+VGVzdFJlcG9ydEludGVydmFsID0gMHgwMTsKLQlwQnRIY2lJbmZvLT5UZXN0Q3RyVHlwZSA9IDB4NWQ7Ci0JcEJ0SGNpSW5mby0+VGVzdEV2ZW50VHlwZSA9IDB4MDA7Ci0JcEJ0SGNpSW5mby0+VGVzdE51bU9mRnJhbWUgPSAwOwotCXBCdEhjaUluZm8tPlRlc3ROdW1PZkVyckZyYW1lID0gMDsKLQlwQnRIY2lJbmZvLT5UZXN0TnVtT2ZCaXRzID0gMDsKLQlwQnRIY2lJbmZvLT5UZXN0TnVtT2ZFcnJCaXRzID0gMDsKLX0KLQotc3RhdGljIHZvaWQgYnRoY2lfUmVzZXRCdFNlYyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgYnRfc2VjdXJpdHkgKnBCdFNlYykKLXsKLS8qUE1HTlRfSU5GTwlwTWdudEluZm8gPSAmcGFkYXB0ZXItPk1nbnRJbmZvOyAqLwotCi0JLyogIFNldCBCVCB1c2VkIEhXIG9yIFNXIGVuY3J5cHQgISEgKi8KLQlpZiAoR0VUX0hBTF9EQVRBKHBhZGFwdGVyKS0+YkJUTW9kZSkKLQkJcEJ0U2VjLT5iVXNlZEh3RW5jcnlwdCA9IHRydWU7Ci0JZWxzZQotCQlwQnRTZWMtPmJVc2VkSHdFbmNyeXB0ID0gZmFsc2U7Ci0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2luZm9fLAotCQkgIiVzOiBiVXNlZEh3RW5jcnlwdCA9JWRcbiIsIF9fZnVuY19fLCBwQnRTZWMtPmJVc2VkSHdFbmNyeXB0KTsKLQotCXBCdFNlYy0+UlNOSUUuT2N0ZXQgPSBwQnRTZWMtPlJTTklFQnVmOwotfQotCi1zdGF0aWMgdm9pZCBidGhjaV9SZXNldEJ0RXh0SW5mbyhzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCkKLXsKLQl1OCBpOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9CVF9BU09DX0VOVFJZX05VTTsgaSsrKSB7Ci0JCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5Db25uZWN0SGFuZGxlID0gMDsKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkluY29taW5nVHJhZmZpY01vZGUgPSAwOwotCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uT3V0Z29pbmdUcmFmZmljTW9kZSA9IDA7Ci0JCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5CVFByb2ZpbGUgPSBCVF9QUk9GSUxFX05PTkU7Ci0JCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5CVENvcmVTcGVjID0gQlRfU1BFQ18yXzFfRURSOwotCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQlRfUlNTSSA9IDA7Ci0JCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5UcmFmZmljUHJvZmlsZSA9IEJUX1BST0ZJTEVfTk9ORTsKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLmxpbmtSb2xlID0gQlRfTElOS19NQVNURVI7Ci0JfQotCi0JcEJ0TWdudC0+RXh0Q29uZmlnLkN1cnJlbnRDb25uZWN0SGFuZGxlID0gMDsKLQlwQnRNZ250LT5FeHRDb25maWcuQ3VycmVudEluY29taW5nVHJhZmZpY01vZGUgPSAwOwotCXBCdE1nbnQtPkV4dENvbmZpZy5DdXJyZW50T3V0Z29pbmdUcmFmZmljTW9kZSA9IDA7Ci0JcEJ0TWdudC0+RXh0Q29uZmlnLk1JTl9CVF9SU1NJID0gMDsKLQlwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGUgPSAwOwotCXBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZlNDTyA9IDA7Ci0JcEJ0TWdudC0+RXh0Q29uZmlnLkN1cnJlbnRCVFN0YXR1cyA9IDA7Ci0JcEJ0TWdudC0+RXh0Q29uZmlnLkhDSUV4dGVuc2lvblZlciA9IDA7Ci0KLQlwQnRNZ250LT5FeHRDb25maWcuYk1hbnVhbENvbnRyb2wgPSBmYWxzZTsKLQlwQnRNZ250LT5FeHRDb25maWcuYkJUQnVzeSA9IGZhbHNlOwotCXBCdE1nbnQtPkV4dENvbmZpZy5iQlRBMkRQQnVzeSA9IGZhbHNlOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzIGJ0aGNpX0NtZFJlc2V0KHN0cnVjdCBydHdfYWRhcHRlciAqX3BhZGFwdGVyLCB1OCBiTmVlZFNlbmRFdmVudCkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXI7Ci0vKlBNR05UX0lORk8gcE1nbnRJbmZvID0gJnBhZGFwdGVyLT5NZ250SW5mbzsgKi8KLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250OwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbzsKLQlzdHJ1Y3QgYnRfc2VjdXJpdHkgKnBCdFNlYzsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmc7Ci0JdTggaTsKLQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiYnRoY2lfQ21kUmVzZXQoKVxuIikpOwotCi0JcGFkYXB0ZXIgPSBHZXREZWZhdWx0QWRhcHRlcihfcGFkYXB0ZXIpOwotCXBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0JcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0JcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0JcEJ0U2VjID0gJnBCVEluZm8tPkJ0U2VjOwotCXBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQotCXBCVEluZm8tPnBhZGFwdGVyID0gcGFkYXB0ZXI7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0JUX0FTT0NfRU5UUllfTlVNOyBpKyspCi0JCWJ0aGNpX1Jlc2V0RW50cnkocGFkYXB0ZXIsIGkpOwotCi0JYnRoY2lfUmVzZXRCdE1nbnQocEJ0TWdudCk7Ci0JYnRoY2lfUmVzZXRCdEhjaUluZm8ocEJ0SGNpSW5mbyk7Ci0JYnRoY2lfUmVzZXRCdFNlYyhwYWRhcHRlciwgcEJ0U2VjKTsKLQotCXBCdE1nbnQtPkJUQ2hhbm5lbCA9IEJUX0RlZmF1bHRfQ2hubDsKLQlwQnRNZ250LT5DaGVja0NobmxJc1N1aXQgPSB0cnVlOwotCi0JcEJUSW5mby0+QlRCZWFjb25UbXJPbiA9IGZhbHNlOwotCi0JcEJ0TWdudC0+YkNyZWF0ZVNwcG9ydFFvcyA9IHRydWU7Ci0KLQlkZWxfdGltZXJfc3luYygmcEJUSW5mby0+QlRIQ0lEaXNjYXJkQWNsRGF0YVRpbWVyKTsKLQlkZWxfdGltZXJfc3luYygmcEJUSW5mby0+QlRCZWFjb25UaW1lcik7Ci0KLQlIQUxCVF9TZXRSdHNDdHNOb0xlbkxpbWl0KHBhZGFwdGVyKTsKLQkvKiAgKi8KLQkvKiAgTWF5YmUgd2UgbmVlZCB0byB0YWtlIGNhcmUgR3JvdXAgIT0gQUVTIGNhc2UgISEgKi8KLQkvKiAgbm93IHdlIFBhaXJ3aXNlIGFuZCBHcm91cCBhbGwgdXNlZCBBRVMgISEgKi8KLQotCWJ0aGNpX1Jlc2V0QnRFeHRJbmZvKHBCdE1nbnQpOwotCi0JLyogc2VuZCBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IGhlcmUgd2hlbiBhbGwgZGF0YSBhcmUgcmVjZWl2ZWQuICovCi0JaWYgKGJOZWVkU2VuZEV2ZW50KSB7Ci0JCXU4IGxvY2FsQnVmWzZdID0gIiI7Ci0JCXU4ICpwUmV0UGFyOwotCQl1OCBsZW4gPSAwOwotCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkJUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJCU9HRl9TRVRfRVZFTlRfTUFTS19DT01NQU5ELAotCQkJSENJX1JFU0VULAotCQkJc3RhdHVzKTsKLQotCQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JCWxlbiArPSAxOwotCQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRXcml0ZVJlbW90ZUFNUEFzc29jKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9kZ2IgKnBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQl1OCBDdXJyZW50QXNzb2NOdW07Ci0JdTggUGh5TGlua0hhbmRsZTsKLQotCXBCdERiZy0+ZGJnSGNpSW5mby5oY2lDbWRDbnRXcml0ZVJlbW90ZUFtcEFzc29jKys7Ci0JUGh5TGlua0hhbmRsZSA9ICooKHU4ICopcEhjaUNtZC0+RGF0YSk7Ci0JQ3VycmVudEFzc29jTnVtID0gYnRoY2lfR2V0Q3VycmVudEVudHJ5TnVtKHBhZGFwdGVyLCBQaHlMaW5rSGFuZGxlKTsKLQotCWlmIChDdXJyZW50QXNzb2NOdW0gPT0gMHhmZikgewotCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCJXcml0ZVJlbW90ZUFNUEFzc29jLCBObyBzdWNoIEhhbmRsZSBpbiB0aGUgRW50cnlcbiIpKTsKLQkJc3RhdHVzID0gSENJX1NUQVRVU19VTktOT1dfQ09OTkVDVF9JRDsKLQkJYnRoY2lfRXZlbnRXcml0ZVJlbW90ZUFtcEFzc29jKHBhZGFwdGVyLCBzdGF0dXMsIFBoeUxpbmtIYW5kbGUpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCWlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50QXNzb2NOdW1dLkFtcEFzb2NDbWREYXRhLkFNUEFzc29jZnJhZ21lbnQgPT0gTlVMTCkgewotCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCJXcml0ZVJlbW90ZUFNUEFzc29jLCBBTVAgY29udHJvbGxlciBpcyBidXN5XG4iKSk7Ci0JCXN0YXR1cyA9IEhDSV9TVEFUVVNfQ09OVFJPTExFUl9CVVNZOwotCQlidGhjaV9FdmVudFdyaXRlUmVtb3RlQW1wQXNzb2MocGFkYXB0ZXIsIHN0YXR1cywgUGh5TGlua0hhbmRsZSk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcEJUSW5mby0+QnRBc29jRW50cnlbQ3VycmVudEFzc29jTnVtXS5BbXBBc29jQ21kRGF0YS5CdFBoeUxpbmtoYW5kbGUgPSBQaHlMaW5rSGFuZGxlOy8qIHU4ICopcEhjaUNtZC0+RGF0YSk7ICovCi0JcEJUSW5mby0+QnRBc29jRW50cnlbQ3VycmVudEFzc29jTnVtXS5BbXBBc29jQ21kRGF0YS5MZW5Tb0ZhciA9ICooKHUxNiAqKSgodTggKilwSGNpQ21kLT5EYXRhKzEpKTsKLQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50QXNzb2NOdW1dLkFtcEFzb2NDbWREYXRhLkFNUEFzc29jUmVtTGVuID0gKigodTE2ICopKCh1OCAqKXBIY2lDbWQtPkRhdGErMykpOwotCi0JUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTURfREVUQUlMfElPQ1RMX0JUX0xPR08pLCAoIldyaXRlUmVtb3RlQU1QQXNzb2MsIExlblNvRmFyID0gMHgleCwgQXNzb2NSZW1MZW4gPSAweCV4XG4iLAotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50QXNzb2NOdW1dLkFtcEFzb2NDbWREYXRhLkxlblNvRmFyLAotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50QXNzb2NOdW1dLkFtcEFzb2NDbWREYXRhLkFNUEFzc29jUmVtTGVuKSk7Ci0KLQlSVFBSSU5UX0RBVEEoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EX0RFVEFJTHxJT0NUTF9CVF9MT0dPKSwKLQkJICAgICAoIldyaXRlUmVtb3RlQU1QQXNzb2MgZnJhZ21lbnQgXG4iKSwKLQkJICAgICBwSGNpQ21kLT5EYXRhLAotCQkgICAgIHBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQW1wQXNvY0NtZERhdGEuQU1QQXNzb2NSZW1MZW4rNSk7Ci0JaWYgKChwQlRJbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50QXNzb2NOdW1dLkFtcEFzb2NDbWREYXRhLkFNUEFzc29jUmVtTGVuKSA+IE1BWF9BTVBfQVNTT0NfRlJBR19MRU4pIHsKLQkJbWVtY3B5KCgodTggKilwQlRJbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50QXNzb2NOdW1dLkFtcEFzb2NDbWREYXRhLkFNUEFzc29jZnJhZ21lbnQrKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQW1wQXNvY0NtZERhdGEuTGVuU29GYXIqKHNpemVvZih1OCkpKSksCi0JCQkodTggKilwSGNpQ21kLT5EYXRhKzUsCi0JCQlNQVhfQU1QX0FTU09DX0ZSQUdfTEVOKTsKLQl9IGVsc2UgewotCQltZW1jcHkoKHU4ICopKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQW1wQXNvY0NtZERhdGEuQU1QQXNzb2NmcmFnbWVudCkrKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQW1wQXNvY0NtZERhdGEuTGVuU29GYXIqKHNpemVvZih1OCkpKSwKLQkJCSgodTggKilwSGNpQ21kLT5EYXRhKzUpLAotCQkJKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQW1wQXNvY0NtZERhdGEuQU1QQXNzb2NSZW1MZW4pKTsKLQotCQlSVFBSSU5UX0RBVEEoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EX0RFVEFJTHxJT0NUTF9CVF9MT0dPKSwgIldyaXRlUmVtb3RlQU1QQXNzb2MgOlxuIiwKLQkJCXBIY2lDbWQtPkRhdGErNSwgcEJUSW5mby0+QnRBc29jRW50cnlbQ3VycmVudEFzc29jTnVtXS5BbXBBc29jQ21kRGF0YS5BTVBBc3NvY1JlbUxlbik7Ci0KLQkJaWYgKCFidGhjaV9HZXRBc3NvY0luZm8ocGFkYXB0ZXIsIEN1cnJlbnRBc3NvY051bSkpCi0JCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX0lOVkFMSURfSENJX0NNRF9QQVJBX1ZBTFVFOwotCi0JCWJ0aGNpX0V2ZW50V3JpdGVSZW1vdGVBbXBBc3NvYyhwYWRhcHRlciwgc3RhdHVzLCBQaHlMaW5rSGFuZGxlKTsKLQotCQlidGhjaV9TdGFydEJlYWNvbkFuZENvbm5lY3QocGFkYXB0ZXIsIHBIY2lDbWQsIEN1cnJlbnRBc3NvY051bSk7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyogNy4zLjEzICovCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzIGJ0aGNpX0NtZFJlYWRDb25uZWN0aW9uQWNjZXB0VGltZW91dChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCWVudW0gaGNpX3N0YXR1cwkJc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotLypQTUdOVF9JTkZPCQlwTWdudEluZm8gPSAmcGFkYXB0ZXItPk1nbnRJbmZvOyAqLwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQl1OCBsb2NhbEJ1Zls4XSA9ICIiOwotCXU4ICpwUmV0UGFyOwotCXU4IGxlbiA9IDA7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCXUxNiAqcHUyVGVtcDsKLQotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJT0dGX1NFVF9FVkVOVF9NQVNLX0NPTU1BTkQsCi0JCUhDSV9SRUFEX0NPTk5FQ1RJT05fQUNDRVBUX1RJTUVPVVQsCi0JCXN0YXR1cyk7Ci0KLQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCXB1MlRlbXAgPSAodTE2ICopJnBSZXRQYXJbMV07CQkvKiAgQ29ubl9BY2NlcHRfVGltZW91dCAqLwotCSpwdTJUZW1wID0gcEJ0SGNpSW5mby0+Q29ubkFjY2VwdFRpbWVvdXQ7Ci0JbGVuICs9IDM7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLS8qIDcuMy4xNCAqLwotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kV3JpdGVDb25uZWN0aW9uQWNjZXB0VGltZW91dCgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCWVudW0gaGNpX3N0YXR1cwkJc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQl1MTYJKnB1MlRlbXA7Ci0JdTggbG9jYWxCdWZbNl0gPSAiIjsKLQl1OCAqcFJldFBhcjsKLQl1OCBsZW4gPSAwOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCXB1MlRlbXAgPSAodTE2ICopJnBIY2lDbWQtPkRhdGFbMF07Ci0JcEJ0SGNpSW5mby0+Q29ubkFjY2VwdFRpbWVvdXQgPSAqcHUyVGVtcDsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0RFVEFJTCwgKCJDb25uQWNjZXB0VGltZW91dCA9IDB4JXgiLAotCQlwQnRIY2lJbmZvLT5Db25uQWNjZXB0VGltZW91dCkpOwotCi0JLyogc2VuZCBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IGhlcmUgd2hlbiBhbGwgZGF0YSBhcmUgcmVjZWl2ZWQuICovCi0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQlPR0ZfU0VUX0VWRU5UX01BU0tfQ09NTUFORCwKLQkJSENJX1dSSVRFX0NPTk5FQ1RJT05fQUNDRVBUX1RJTUVPVVQsCi0JCXN0YXR1cyk7Ci0KLQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCWxlbiArPSAxOwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRSZWFkUGFnZVRpbWVvdXQoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMJCXN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0JdTggbG9jYWxCdWZbOF0gPSAiIjsKLQl1OCAqcFJldFBhcjsKLQl1OCBsZW4gPSAwOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQl1MTYgKnB1MlRlbXA7Ci0KLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCU9HRl9TRVRfRVZFTlRfTUFTS19DT01NQU5ELAotCQlIQ0lfUkVBRF9QQUdFX1RJTUVPVVQsCi0JCXN0YXR1cyk7Ci0KLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIlJlYWQgUGFnZVRpbWVvdXQgPSAweCV4XG4iLCBwQnRIY2lJbmZvLT5QYWdlVGltZW91dCkpOwotCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JcHUyVGVtcCA9ICh1MTYgKikmcFJldFBhclsxXTsJCS8qICBQYWdlX1RpbWVvdXQgKi8KLQkqcHUyVGVtcCA9IHBCdEhjaUluZm8tPlBhZ2VUaW1lb3V0OwotCWxlbiArPSAzOwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRXcml0ZVBhZ2VUaW1lb3V0KAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCXUxNgkqcHUyVGVtcDsKLQotCXB1MlRlbXAgPSAodTE2ICopJnBIY2lDbWQtPkRhdGFbMF07Ci0JcEJ0SGNpSW5mby0+UGFnZVRpbWVvdXQgPSAqcHUyVGVtcDsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIldyaXRlIFBhZ2VUaW1lb3V0ID0gMHgleFxuIiwKLQkJcEJ0SGNpSW5mby0+UGFnZVRpbWVvdXQpKTsKLQotCS8qIHNlbmQgY29tbWFuZCBjb21wbGV0ZSBldmVudCBoZXJlIHdoZW4gYWxsIGRhdGEgYXJlIHJlY2VpdmVkLiAqLwotCXsKLQkJdTggbG9jYWxCdWZbNl0gPSAiIjsKLQkJdTggKnBSZXRQYXI7Ci0JCXU4IGxlbiA9IDA7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQkJT0dGX1NFVF9FVkVOVF9NQVNLX0NPTU1BTkQsCi0JCQlIQ0lfV1JJVEVfUEFHRV9USU1FT1VULAotCQkJc3RhdHVzKTsKLQotCQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JCWxlbiArPSAxOwotCQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRSZWFkTGlua1N1cGVydmlzaW9uVGltZW91dCgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCWVudW0gaGNpX3N0YXR1cwlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUaW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQl1OCBwaHlzaWNhbExpbmtIYW5kbGUsIEVudHJ5TnVtOwotCi0JcGh5c2ljYWxMaW5rSGFuZGxlID0gKigodTggKilwSGNpQ21kLT5EYXRhKTsKLQotCUVudHJ5TnVtID0gYnRoY2lfR2V0Q3VycmVudEVudHJ5TnVtKHBhZGFwdGVyLCBwaHlzaWNhbExpbmtIYW5kbGUpOwotCi0JaWYgKEVudHJ5TnVtID09IDB4ZmYpIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJSZWFkTGlua1N1cGVydmlzaW9uVGltZW91dCwgTm8gc3VjaCBIYW5kbGUgaW4gdGhlIEVudHJ5XG4iKSk7Ci0JCXN0YXR1cyA9IEhDSV9TVEFUVVNfVU5LTk9XX0NPTk5FQ1RfSUQ7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JaWYgKHBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdFBoeUxpbmtoYW5kbGUgIT0gcGh5c2ljYWxMaW5rSGFuZGxlKQotCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lEOwotCi0JewotCQl1OCBsb2NhbEJ1ZlsxMF0gPSAiIjsKLQkJdTggKnBSZXRQYXI7Ci0JCXU4IGxlbiA9IDA7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQkJdTE2ICpwdTJUZW1wOwotCi0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQkJbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCQlPR0ZfU0VUX0VWRU5UX01BU0tfQ09NTUFORCwKLQkJCUhDSV9SRUFEX0xJTktfU1VQRVJWSVNJT05fVElNRU9VVCwKLQkJCXN0YXR1cyk7Ci0KLQkJLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQkJcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQkJcFJldFBhclswXSA9IHN0YXR1czsKLQkJcFJldFBhclsxXSA9IHBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdFBoeUxpbmtoYW5kbGU7Ci0JCXBSZXRQYXJbMl0gPSAwOwotCQlwdTJUZW1wID0gKHUxNiAqKSZwUmV0UGFyWzNdOwkJLyogIENvbm5fQWNjZXB0X1RpbWVvdXQgKi8KLQkJKnB1MlRlbXAgPSBwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuTGlua1N1cGVydmVyc2lvblRpbWVvdXQ7Ci0JCWxlbiArPSA1OwotCQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRXcml0ZUxpbmtTdXBlcnZpc2lvblRpbWVvdXQoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMJc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVGluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0JdTggcGh5c2ljYWxMaW5rSGFuZGxlLCBFbnRyeU51bTsKLQotCXBoeXNpY2FsTGlua0hhbmRsZSA9ICooKHU4ICopcEhjaUNtZC0+RGF0YSk7Ci0KLQlFbnRyeU51bSA9IGJ0aGNpX0dldEN1cnJlbnRFbnRyeU51bShwYWRhcHRlciwgcGh5c2ljYWxMaW5rSGFuZGxlKTsKLQotCWlmIChFbnRyeU51bSA9PSAweGZmKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiV3JpdGVMaW5rU3VwZXJ2aXNpb25UaW1lb3V0LCBObyBzdWNoIEhhbmRsZSBpbiB0aGUgRW50cnlcbiIpKTsKLQkJc3RhdHVzID0gSENJX1NUQVRVU19VTktOT1dfQ09OTkVDVF9JRDsKLQl9IGVsc2UgewotCQlpZiAocEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkJ0UGh5TGlua2hhbmRsZSAhPSBwaHlzaWNhbExpbmtIYW5kbGUpIHsKLQkJCXN0YXR1cyA9IEhDSV9TVEFUVVNfVU5LTk9XX0NPTk5FQ1RfSUQ7Ci0JCX0gZWxzZSB7Ci0JCQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuTGlua1N1cGVydmVyc2lvblRpbWVvdXQgPSAqKCh1MTYgKikoKCh1OCAqKXBIY2lDbWQtPkRhdGEpKzIpKTsKLQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJCVCBXcml0ZSBMaW5rU3VwZXJ2ZXJzaW9uVGltZW91dFslZF0gPSAweCV4XG4iLAotCQkJCUVudHJ5TnVtLCBwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuTGlua1N1cGVydmVyc2lvblRpbWVvdXQpKTsKLQkJfQotCX0KLQotCXsKLQkJdTggbG9jYWxCdWZbOF0gPSAiIjsKLQkJdTggKnBSZXRQYXI7Ci0JCXU4IGxlbiA9IDA7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQkJT0dGX1NFVF9FVkVOVF9NQVNLX0NPTU1BTkQsCi0JCQlIQ0lfV1JJVEVfTElOS19TVVBFUlZJU0lPTl9USU1FT1VULAotCQkJc3RhdHVzKTsKLQotCQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCQlwUmV0UGFyWzBdID0gc3RhdHVzOwotCQlwUmV0UGFyWzFdID0gcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkJ0UGh5TGlua2hhbmRsZTsKLQkJcFJldFBhclsyXSA9IDA7Ci0JCWxlbiArPSAzOwotCQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRFbmhhbmNlZEZsdXNoKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUaW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUaW5mby0+QnRIY2lJbmZvOwotCXUxNgkJbG9naWNIYW5kbGU7Ci0JdTggUGFja2V0X1R5cGU7Ci0KLQlsb2dpY0hhbmRsZSA9ICooKHUxNiAqKSZwSGNpQ21kLT5EYXRhWzBdKTsKLQlQYWNrZXRfVHlwZSA9IHBIY2lDbWQtPkRhdGFbMl07Ci0KLQlpZiAoUGFja2V0X1R5cGUgIT0gMCkKLQkJc3RhdHVzID0gSENJX1NUQVRVU19JTlZBTElEX0hDSV9DTURfUEFSQV9WQUxVRTsKLQllbHNlCi0JCXBCdEhjaUluZm8tPmVuRmx1c2hfTExIID0gbG9naWNIYW5kbGU7Ci0KLQlpZiAoYnRoY2lfRGlzY2FyZFR4UGFja2V0cyhwYWRhcHRlciwgcEJ0SGNpSW5mby0+ZW5GbHVzaF9MTEgpKQotCQlidGhjaV9FdmVudEZsdXNoT2NjdXJyZWQocGFkYXB0ZXIsIHBCdEhjaUluZm8tPmVuRmx1c2hfTExIKTsKLQotCS8qICBzaG91bGQgc2VuZCBjb21tYW5kIHN0YXR1cyBldmVudCAqLwotCWJ0aGNpX0V2ZW50Q29tbWFuZFN0YXR1cyhwYWRhcHRlciwKLQkJCU9HRl9TRVRfRVZFTlRfTUFTS19DT01NQU5ELAotCQkJSENJX0VOSEFOQ0VEX0ZMVVNILAotCQkJc3RhdHVzKTsKLQotCWlmIChwQnRIY2lJbmZvLT5lbkZsdXNoX0xMSCkgewotCQlidGhjaV9FdmVudEVuaGFuY2VkRmx1c2hDb21wbGV0ZShwYWRhcHRlciwgcEJ0SGNpSW5mby0+ZW5GbHVzaF9MTEgpOwotCQlwQnRIY2lJbmZvLT5lbkZsdXNoX0xMSCA9IDA7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kUmVhZExvZ2ljYWxMaW5rQWNjZXB0VGltZW91dCgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCWVudW0gaGNpX3N0YXR1cwkJc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotLypQTUdOVF9JTkZPCQlwTWdudEluZm8gPSAmcGFkYXB0ZXItPk1nbnRJbmZvOyAqLwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQl1OCBsb2NhbEJ1Zls4XSA9ICIiOwotCXU4ICpwUmV0UGFyOwotCXU4IGxlbiA9IDA7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCXUxNiAqcHUyVGVtcDsKLQotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJT0dGX1NFVF9FVkVOVF9NQVNLX0NPTU1BTkQsCi0JCUhDSV9SRUFEX0xPR0lDQUxfTElOS19BQ0NFUFRfVElNRU9VVCwKLQkJc3RhdHVzKTsKLQotCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQlwUmV0UGFyWzBdID0gc3RhdHVzOwotCi0JcHUyVGVtcCA9ICh1MTYgKikmcFJldFBhclsxXTsJCS8qICBDb25uX0FjY2VwdF9UaW1lb3V0ICovCi0JKnB1MlRlbXAgPSBwQnRIY2lJbmZvLT5Mb2dpY2FsQWNjZXB0VGltZW91dDsKLQlsZW4gKz0gMzsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kV3JpdGVMb2dpY2FsTGlua0FjY2VwdFRpbWVvdXQoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMJCXN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLS8qUE1HTlRfSU5GTwkJcE1nbnRJbmZvID0gJnBhZGFwdGVyLT5NZ250SW5mbzsgKi8KLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0JdTggbG9jYWxCdWZbNl0gPSAiIjsKLQl1OCAqcFJldFBhcjsKLQl1OCBsZW4gPSAwOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCXBCdEhjaUluZm8tPkxvZ2ljYWxBY2NlcHRUaW1lb3V0ID0gKigodTE2ICopcEhjaUNtZC0+RGF0YSk7Ci0KLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCU9HRl9TRVRfRVZFTlRfTUFTS19DT01NQU5ELAotCQlIQ0lfV1JJVEVfTE9HSUNBTF9MSU5LX0FDQ0VQVF9USU1FT1VULAotCQlzdGF0dXMpOwotCi0JLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCXBSZXRQYXJbMF0gPSBzdGF0dXM7Ci0KLQlsZW4gKz0gMTsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFNldEV2ZW50TWFzaygKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCWVudW0gaGNpX3N0YXR1cwkJc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotLypQTUdOVF9JTkZPCQlwTWdudEluZm8gPSAmcGFkYXB0ZXItPk1nbnRJbmZvOyAqLwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQl1OCAqcHU4VGVtcDsKLQl1OCBsb2NhbEJ1Zls2XSA9ICIiOwotCXU4ICpwUmV0UGFyOwotCXU4IGxlbiA9IDA7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JcHU4VGVtcCA9ICh1OCAqKSZwSGNpQ21kLT5EYXRhWzBdOwotCXBCdEhjaUluZm8tPkJURXZlbnRNYXNrID0gKnB1OFRlbXA7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9ERVRBSUwsICgiQlRFdmVudE1hc2sgPSAweCUiaTY0Zm10InhcbiIsCi0JCXBCdEhjaUluZm8tPkJURXZlbnRNYXNrKSk7Ci0KLQkvKiBzZW5kIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgaGVyZSB3aGVuIGFsbCBkYXRhIGFyZSByZWNlaXZlZC4gKi8KLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCU9HRl9TRVRfRVZFTlRfTUFTS19DT01NQU5ELAotCQlIQ0lfU0VUX0VWRU5UX01BU0ssCi0JCXN0YXR1cyk7Ci0KLQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCWxlbiArPSAxOwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi0vKiAgNy4zLjY5ICovCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRTZXRFdmVudE1hc2tQYWdlMigKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCWVudW0gaGNpX3N0YXR1cwkJc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQl1OCAqcHU4VGVtcDsKLQl1OCBsb2NhbEJ1Zls2XSA9ICIiOwotCXU4ICpwUmV0UGFyOwotCXU4IGxlbiA9IDA7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JcHU4VGVtcCA9ICh1OCAqKSZwSGNpQ21kLT5EYXRhWzBdOwotCXBCdEhjaUluZm8tPkJURXZlbnRNYXNrUGFnZTIgPSAqcHU4VGVtcDsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRF9ERVRBSUx8SU9DVExfQlRfTE9HTyksICgiQlRFdmVudE1hc2tQYWdlMiA9IDB4JSJpNjRmbXQieFxuIiwKLQkJcEJ0SGNpSW5mby0+QlRFdmVudE1hc2tQYWdlMikpOwotCi0JLyogc2VuZCBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IGhlcmUgd2hlbiBhbGwgZGF0YSBhcmUgcmVjZWl2ZWQuICovCi0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQlPR0ZfU0VUX0VWRU5UX01BU0tfQ09NTUFORCwKLQkJSENJX1NFVF9FVkVOVF9NQVNLX1BBR0VfMiwKLQkJc3RhdHVzKTsKLQotCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JbGVuICs9IDE7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFJlYWRMb2NhdGlvbkRhdGEoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMJCXN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0JdTggbG9jYWxCdWZbMTJdID0gIiI7Ci0JdTggKnBSZXRQYXI7Ci0JdTggbGVuID0gMDsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0JdTE2ICpwdTJUZW1wOwotCi0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQlPR0ZfU0VUX0VWRU5UX01BU0tfQ09NTUFORCwKLQkJSENJX1JFQURfTE9DQVRJT05fREFUQSwKLQkJc3RhdHVzKTsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkRvbWFpbkF3YXJlID0gMHgleFxuIiwgcEJ0SGNpSW5mby0+TG9jYXRpb25Eb21haW5Bd2FyZSkpOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiRG9tYWluID0gMHgleFxuIiwgcEJ0SGNpSW5mby0+TG9jYXRpb25Eb21haW4pKTsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkRvbWFpbk9wdGlvbnMgPSAweCV4XG4iLCBwQnRIY2lJbmZvLT5Mb2NhdGlvbkRvbWFpbk9wdGlvbnMpKTsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIk9wdGlvbnMgPSAweCV4XG4iLCBwQnRIY2lJbmZvLT5Mb2NhdGlvbk9wdGlvbnMpKTsKLQotCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQlwUmV0UGFyWzBdID0gc3RhdHVzOwotCi0JcFJldFBhclsxXSA9IHBCdEhjaUluZm8tPkxvY2F0aW9uRG9tYWluQXdhcmU7CS8qIDB4MDsJIExvY2F0aW9uX0RvbWFpbl9Bd2FyZSAqLwotCXB1MlRlbXAgPSAodTE2ICopJnBSZXRQYXJbMl07CQkJCQkvKiAgTG9jYXRpb25fRG9tYWluICovCi0JKnB1MlRlbXAgPSBwQnRIY2lJbmZvLT5Mb2NhdGlvbkRvbWFpbjsJCS8qIDB4NTg1ODsgKi8KLQlwUmV0UGFyWzRdID0gcEJ0SGNpSW5mby0+TG9jYXRpb25Eb21haW5PcHRpb25zOwkvKiAweDU4OwlMb2NhdGlvbl9Eb21haW5fT3B0aW9ucyAqLwotCXBSZXRQYXJbNV0gPSBwQnRIY2lJbmZvLT5Mb2NhdGlvbk9wdGlvbnM7CQkvKiAweDA7CUxvY2F0aW9uX09wdGlvbnMgKi8KLQlsZW4gKz0gNjsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFdyaXRlTG9jYXRpb25EYXRhKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0JdTE2CSpwdTJUZW1wOwotCXU4IGxvY2FsQnVmWzZdID0gIiI7Ci0JdTggKnBSZXRQYXI7Ci0JdTggbGVuID0gMDsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQlwQnRIY2lJbmZvLT5Mb2NhdGlvbkRvbWFpbkF3YXJlID0gcEhjaUNtZC0+RGF0YVswXTsKLQlwdTJUZW1wID0gKHUxNiAqKSZwSGNpQ21kLT5EYXRhWzFdOwotCXBCdEhjaUluZm8tPkxvY2F0aW9uRG9tYWluID0gKnB1MlRlbXA7Ci0JcEJ0SGNpSW5mby0+TG9jYXRpb25Eb21haW5PcHRpb25zID0gcEhjaUNtZC0+RGF0YVszXTsKLQlwQnRIY2lJbmZvLT5Mb2NhdGlvbk9wdGlvbnMgPSBwSGNpQ21kLT5EYXRhWzRdOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiRG9tYWluQXdhcmUgPSAweCV4XG4iLCBwQnRIY2lJbmZvLT5Mb2NhdGlvbkRvbWFpbkF3YXJlKSk7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJEb21haW4gPSAweCV4XG4iLCBwQnRIY2lJbmZvLT5Mb2NhdGlvbkRvbWFpbikpOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiRG9tYWluT3B0aW9ucyA9IDB4JXhcbiIsIHBCdEhjaUluZm8tPkxvY2F0aW9uRG9tYWluT3B0aW9ucykpOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiT3B0aW9ucyA9IDB4JXhcbiIsIHBCdEhjaUluZm8tPkxvY2F0aW9uT3B0aW9ucykpOwotCi0JLyogc2VuZCBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IGhlcmUgd2hlbiBhbGwgZGF0YSBhcmUgcmVjZWl2ZWQuICovCi0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQlPR0ZfU0VUX0VWRU5UX01BU0tfQ09NTUFORCwKLQkJSENJX1dSSVRFX0xPQ0FUSU9OX0RBVEEsCi0JCXN0YXR1cyk7Ci0KLQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCWxlbiArPSAxOwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRSZWFkRmxvd0NvbnRyb2xNb2RlKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0JdTggbG9jYWxCdWZbN10gPSAiIjsKLQl1OCAqcFJldFBhcjsKLQl1OCBsZW4gPSAwOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJT0dGX1NFVF9FVkVOVF9NQVNLX0NPTU1BTkQsCi0JCUhDSV9SRUFEX0ZMT1dfQ09OVFJPTF9NT0RFLAotCQlzdGF0dXMpOwotCi0JLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCXBSZXRQYXJbMF0gPSBzdGF0dXM7Ci0JcFJldFBhclsxXSA9IHBCdEhjaUluZm8tPkZsb3dDb250cm9sTW9kZTsJLyogIEZsb3cgQ29udHJvbCBNb2RlICovCi0JbGVuICs9IDI7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRXcml0ZUZsb3dDb250cm9sTW9kZSgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCXU4IGxvY2FsQnVmWzZdID0gIiI7Ci0JdTggKnBSZXRQYXI7Ci0JdTggbGVuID0gMDsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQlwQnRIY2lJbmZvLT5GbG93Q29udHJvbE1vZGUgPSBwSGNpQ21kLT5EYXRhWzBdOwotCi0JLyogc2VuZCBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IGhlcmUgd2hlbiBhbGwgZGF0YSBhcmUgcmVjZWl2ZWQuICovCi0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQlPR0ZfU0VUX0VWRU5UX01BU0tfQ09NTUFORCwKLQkJSENJX1dSSVRFX0ZMT1dfQ09OVFJPTF9NT0RFLAotCQlzdGF0dXMpOwotCi0JLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkvKiBzdGF0dXMgKi8KLQlsZW4gKz0gMTsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kUmVhZEJlc3RFZmZvcnRGbHVzaFRpbWVvdXQoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVGluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0JdTE2IGksIGosIGxvZ2ljSGFuZGxlOwotCXUzMiBCZXN0RWZmb3J0Rmx1c2hUaW1lb3V0ID0gMHhmZmZmZmZmZjsKLQl1OCBmaW5kID0gMDsKLQotCWxvZ2ljSGFuZGxlID0gKigodTE2ICopcEhjaUNtZC0+RGF0YSk7Ci0JLyogIGZpbmQgYW4gbWF0Y2hlZCBsb2dpY2FsIGxpbmsgaW5kZXggYW5kIGNvcHkgdGhlIGRhdGEgKi8KLQlmb3IgKGogPSAwOyBqIDwgTUFYX0JUX0FTT0NfRU5UUllfTlVNOyBqKyspIHsKLQkJZm9yIChpID0gMDsgaSA8IE1BWF9MT0dJQ0FMX0xJTktfTlVNOyBpKyspIHsKLQkJCWlmIChwQlRpbmZvLT5CdEFzb2NFbnRyeVtqXS5Mb2dMaW5rQ21kRGF0YVtpXS5CdExvZ0xpbmtoYW5kbGUgPT0gbG9naWNIYW5kbGUpIHsKLQkJCQlCZXN0RWZmb3J0Rmx1c2hUaW1lb3V0ID0gcEJUaW5mby0+QnRBc29jRW50cnlbal0uTG9nTGlua0NtZERhdGFbaV0uQmVzdEVmZm9ydEZsdXNoVGltZW91dDsKLQkJCQlmaW5kID0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCWlmICghZmluZCkKLQkJc3RhdHVzID0gSENJX1NUQVRVU19VTktOT1dfQ09OTkVDVF9JRDsKLQotCXsKLQkJdTggbG9jYWxCdWZbMTBdID0gIiI7Ci0JCXU4ICpwUmV0UGFyOwotCQl1OCBsZW4gPSAwOwotCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0JCXUzMiAqcHU0VGVtcDsKLQotCQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQkJT0dGX1NFVF9FVkVOVF9NQVNLX0NPTU1BTkQsCi0JCQlIQ0lfUkVBRF9CRVNUX0VGRk9SVF9GTFVTSF9USU1FT1VULAotCQkJc3RhdHVzKTsKLQotCQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCQlwUmV0UGFyWzBdID0gc3RhdHVzOwotCQlwdTRUZW1wID0gKHUzMiAqKSZwUmV0UGFyWzFdOwkvKiAgQmVzdF9FZmZvcnRfRmx1c2hfVGltZW91dCAqLwotCQkqcHU0VGVtcCA9IEJlc3RFZmZvcnRGbHVzaFRpbWVvdXQ7Ci0JCWxlbiArPSA1OwotCQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQl9Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kV3JpdGVCZXN0RWZmb3J0Rmx1c2hUaW1lb3V0KAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRpbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXUxNiBpLCBqLCBsb2dpY0hhbmRsZTsKLQl1MzIgQmVzdEVmZm9ydEZsdXNoVGltZW91dCA9IDB4ZmZmZmZmZmY7Ci0JdTggZmluZCA9IDA7Ci0KLQlsb2dpY0hhbmRsZSA9ICooKHUxNiAqKXBIY2lDbWQtPkRhdGEpOwotCUJlc3RFZmZvcnRGbHVzaFRpbWVvdXQgPSAqKCh1MzIgKikocEhjaUNtZC0+RGF0YSsxKSk7Ci0KLQkvKiAgZmluZCBhbiBtYXRjaGVkIGxvZ2ljYWwgbGluayBpbmRleCBhbmQgY29weSB0aGUgZGF0YSAqLwotCWZvciAoaiA9IDA7IGogPCBNQVhfQlRfQVNPQ19FTlRSWV9OVU07IGorKykgewotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0xPR0lDQUxfTElOS19OVU07IGkrKykgewotCQkJaWYgKHBCVGluZm8tPkJ0QXNvY0VudHJ5W2pdLkxvZ0xpbmtDbWREYXRhW2ldLkJ0TG9nTGlua2hhbmRsZSA9PSBsb2dpY0hhbmRsZSkgewotCQkJCXBCVGluZm8tPkJ0QXNvY0VudHJ5W2pdLkxvZ0xpbmtDbWREYXRhW2ldLkJlc3RFZmZvcnRGbHVzaFRpbWVvdXQgPSBCZXN0RWZmb3J0Rmx1c2hUaW1lb3V0OwotCQkJCWZpbmQgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKCFmaW5kKQotCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lEOwotCi0JewotCQl1OCBsb2NhbEJ1Zls2XSA9ICIiOwotCQl1OCAqcFJldFBhcjsKLQkJdTggbGVuID0gMDsKLQkJc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQkJbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCQlPR0ZfU0VUX0VWRU5UX01BU0tfQ09NTUFORCwKLQkJCUhDSV9XUklURV9CRVNUX0VGRk9SVF9GTFVTSF9USU1FT1VULAotCQkJc3RhdHVzKTsKLQotCQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCQlwUmV0UGFyWzBdID0gc3RhdHVzOwotCQlsZW4gKz0gMTsKLQkJUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQkJYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JfQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFNob3J0UmFuZ2VNb2RlKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXU4IFBoeUxpbmtIYW5kbGUsIEVudHJ5TnVtLCBTaG9ydFJhbmdlTW9kZTsKLQotCVBoeUxpbmtIYW5kbGUgPSBwSGNpQ21kLT5EYXRhWzBdOwotCVNob3J0UmFuZ2VNb2RlID0gcEhjaUNtZC0+RGF0YVsxXTsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIlBMSCA9IDB4JXgsIFNob3J0X1JhbmdlX01vZGUgPSAweCV4XG4iLCBQaHlMaW5rSGFuZGxlLCBTaG9ydFJhbmdlTW9kZSkpOwotCi0JRW50cnlOdW0gPSBidGhjaV9HZXRDdXJyZW50RW50cnlOdW0ocGFkYXB0ZXIsIFBoeUxpbmtIYW5kbGUpOwotCWlmIChFbnRyeU51bSAhPSAweGZmKSB7Ci0JCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5TaG9ydFJhbmdlTW9kZSA9IFNob3J0UmFuZ2VNb2RlOwotCX0gZWxzZSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiTm8gc3VjaCBQTEgoMHgleClcbiIsIFBoeUxpbmtIYW5kbGUpKTsKLQkJc3RhdHVzID0gSENJX1NUQVRVU19VTktOT1dfQ09OTkVDVF9JRDsKLQl9Ci0KLQlidGhjaV9FdmVudENvbW1hbmRTdGF0dXMocGFkYXB0ZXIsCi0JCQlPR0ZfU0VUX0VWRU5UX01BU0tfQ09NTUFORCwKLQkJCUhDSV9TSE9SVF9SQU5HRV9NT0RFLAotCQkJc3RhdHVzKTsKLQotCWJ0aGNpX0V2ZW50U2hvcnRSYW5nZU1vZGVDaGFuZ2VDb21wbGV0ZShwYWRhcHRlciwgc3RhdHVzLCBTaG9ydFJhbmdlTW9kZSwgRW50cnlOdW0pOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cyBidGhjaV9DbWRSZWFkTG9jYWxTdXBwb3J0ZWRDb21tYW5kcyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0JdTggbG9jYWxCdWZbVG1wTG9jYWxCdWZTaXplXSA9ICIiOwotCXU4ICpwUmV0UGFyLCAqcFN1cHBvcnRlZENtZHM7Ci0JdTggbGVuID0gMDsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkvKiAgc2VuZCBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IGhlcmUgd2hlbiBhbGwgZGF0YSBhcmUgcmVjZWl2ZWQuICovCi0JUGxhdGZvcm1aZXJvTWVtb3J5KCZsb2NhbEJ1ZlswXSwgVG1wTG9jYWxCdWZTaXplKTsKLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCU9HRl9JTkZPUk1BVElPTkFMX1BBUkFNRVRFUlMsCi0JCUhDSV9SRUFEX0xPQ0FMX1NVUFBPUlRFRF9DT01NQU5EUywKLQkJc3RhdHVzKTsKLQotCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JbGVuICs9IDE7Ci0JcFN1cHBvcnRlZENtZHMgPSAmcFJldFBhclsxXTsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCJPY3RldFs1XT0gMHhjMFxuQml0IFs2XT0gU2V0IEV2ZW50IE1hc2ssIFs3XT0gUmVzZXRcbiIpKTsKLQlwU3VwcG9ydGVkQ21kc1s1XSA9IDB4YzA7Ci0JUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTUR8SU9DVExfQlRfTE9HTyksICgiT2N0ZXRbNl09IDB4MDFcbkJpdCBbMF09IFNldCBFdmVudCBGaWx0ZXJcbiIpKTsKLQlwU3VwcG9ydGVkQ21kc1s2XSA9IDB4MDE7Ci0JUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTUR8SU9DVExfQlRfTE9HTyksICgiT2N0ZXRbN109IDB4MGNcbkJpdCBbMl09IFJlYWQgQ29ubmVjdGlvbiBBY2NlcHQgVGltZW91dCwgWzNdPSBXcml0ZSBDb25uZWN0aW9uIEFjY2VwdCBUaW1lb3V0XG4iKSk7Ci0JcFN1cHBvcnRlZENtZHNbN10gPSAweDBjOwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIk9jdGV0WzEwXT0gMHg4MFxuQml0IFs3XT0gSG9zdCBOdW1iZXIgT2YgQ29tcGxldGVkIFBhY2tldHNcbiIpKTsKLQlwU3VwcG9ydGVkQ21kc1sxMF0gPSAweDgwOwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIk9jdGV0WzExXT0gMHgwM1xuQml0IFswXT0gUmVhZCBMaW5rIFN1cGVydmlzaW9uIFRpbWVvdXQsIFsxXT0gV3JpdGUgTGluayBTdXBlcnZpc2lvbiBUaW1lb3V0XG4iKSk7Ci0JcFN1cHBvcnRlZENtZHNbMTFdID0gMHgwMzsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCJPY3RldFsxNF09IDB4YThcbkJpdCBbM109IFJlYWQgTG9jYWwgVmVyc2lvbiBJbmZvcm1hdGlvbiwgWzVdPSBSZWFkIExvY2FsIFN1cHBvcnRlZCBGZWF0dXJlcywgWzddPSBSZWFkIEJ1ZmZlciBTaXplXG4iKSk7Ci0JcFN1cHBvcnRlZENtZHNbMTRdID0gMHhhODsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCJPY3RldFsxNV09IDB4MWNcbkJpdCBbMl09IFJlYWQgRmFpbGVkIENvbnRhY3QgQ291bnQsIFszXT0gUmVzZXQgRmFpbGVkIENvbnRhY3QgQ291bnQsIFs0XT0gR2V0IExpbmsgUXVhbGl0eVxuIikpOwotCXBTdXBwb3J0ZWRDbWRzWzE1XSA9IDB4MWM7Ci0JLyogcFN1cHBvcnRlZENtZHNbMTZdID0gMHgwNDsgKi8KLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCJPY3RldFsxOV09IDB4NDBcbkJpdCBbNl09IEVuaGFuY2VkIEZsdXNoXG4iKSk7Ci0JcFN1cHBvcnRlZENtZHNbMTldID0gMHg0MDsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCJPY3RldFsyMV09IDB4ZmZcbkJpdCBbMF09IENyZWF0ZSBQaHlzaWNhbCBMaW5rLCBbMV09IEFjY2VwdCBQaHlzaWNhbCBMaW5rLCBbMl09IERpc2Nvbm5lY3QgUGh5c2ljYWwgTGluaywgWzNdPSBDcmVhdGUgTG9naWNhbCBMaW5rXG4iKSk7Ci0JUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTUR8SU9DVExfQlRfTE9HTyksICgiCVs0XT0gQWNjZXB0IExvZ2ljYWwgTGluaywgWzVdPSBEaXNjb25uZWN0IExvZ2ljYWwgTGluaywgWzZdPSBMb2dpY2FsIExpbmsgQ2FuY2VsLCBbN109IEZsb3cgU3BlYyBNb2RpZnlcbiIpKTsKLQlwU3VwcG9ydGVkQ21kc1syMV0gPSAweGZmOwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIk9jdGV0WzIyXT0gMHhmZlxuQml0IFswXT0gUmVhZCBMb2dpY2FsIExpbmsgQWNjZXB0IFRpbWVvdXQsIFsxXT0gV3JpdGUgTG9naWNhbCBMaW5rIEFjY2VwdCBUaW1lb3V0LCBbMl09IFNldCBFdmVudCBNYXNrIFBhZ2UgMiwgWzNdPSBSZWFkIExvY2F0aW9uIERhdGFcbiIpKTsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCIJWzRdPSBXcml0ZSBMb2NhdGlvbiBEYXRhLCBbNV09IFJlYWQgTG9jYWwgQU1QIEluZm8sIFs2XT0gUmVhZCBMb2NhbCBBTVBfQVNTT0MsIFs3XT0gV3JpdGUgUmVtb3RlIEFNUF9BU1NPQ1xuIikpOwotCXBTdXBwb3J0ZWRDbWRzWzIyXSA9IDB4ZmY7Ci0JUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTUR8SU9DVExfQlRfTE9HTyksICgiT2N0ZXRbMjNdPSAweDA3XG5CaXQgWzBdPSBSZWFkIEZsb3cgQ29udHJvbCBNb2RlLCBbMV09IFdyaXRlIEZsb3cgQ29udHJvbCBNb2RlLCBbMl09IFJlYWQgRGF0YSBCbG9jayBTaXplXG4iKSk7Ci0JcFN1cHBvcnRlZENtZHNbMjNdID0gMHgwNzsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCJPY3RldFsyNF09IDB4MWNcbkJpdCBbMl09IFJlYWQgQmVzdCBFZmZvcnQgRmx1c2ggVGltZW91dCwgWzNdPSBXcml0ZSBCZXN0IEVmZm9ydCBGbHVzaCBUaW1lb3V0LCBbNF09IFNob3J0IFJhbmdlIE1vZGVcbiIpKTsKLQlwU3VwcG9ydGVkQ21kc1syNF0gPSAweDFjOwotCWxlbiArPSA2NDsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cyBidGhjaV9DbWRSZWFkTG9jYWxTdXBwb3J0ZWRGZWF0dXJlcyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0JdTggbG9jYWxCdWZbVG1wTG9jYWxCdWZTaXplXSA9ICIiOwotCXU4ICpwUmV0UGFyOwotCXU4IGxlbiA9IDA7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JLyogc2VuZCBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IGhlcmUgd2hlbiBhbGwgZGF0YSBhcmUgcmVjZWl2ZWQuICovCi0JUGxhdGZvcm1aZXJvTWVtb3J5KCZsb2NhbEJ1ZlswXSwgVG1wTG9jYWxCdWZTaXplKTsKLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCU9HRl9JTkZPUk1BVElPTkFMX1BBUkFNRVRFUlMsCi0JCUhDSV9SRUFEX0xPQ0FMX1NVUFBPUlRFRF9GRUFUVVJFUywKLQkJc3RhdHVzKTsKLQotCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JbGVuICs9IDk7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzIGJ0aGNpX0NtZFJlYWRMb2NhbEFNUEFzc29jKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmcgPSAmcEJUSW5mby0+QnREYmc7Ci0JdTggUGh5TGlua0hhbmRsZSwgRW50cnlOdW07Ci0KLQlwQnREYmctPmRiZ0hjaUluZm8uaGNpQ21kQ250UmVhZExvY2FsQW1wQXNzb2MrKzsKLQlQaHlMaW5rSGFuZGxlID0gKigodTggKilwSGNpQ21kLT5EYXRhKTsKLQlFbnRyeU51bSA9IGJ0aGNpX0dldEN1cnJlbnRFbnRyeU51bShwYWRhcHRlciwgUGh5TGlua0hhbmRsZSk7Ci0KLQlpZiAoKEVudHJ5TnVtID09IDB4ZmYpICYmIFBoeUxpbmtIYW5kbGUgIT0gMCkgewotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIlJlYWRMb2NhbEFNUEFzc29jLCBFbnRyeU51bSA9ICVkICAhISEhISwgcGh5c2ljYWwgbGluayBoYW5kbGUgPSAweCV4XG4iLAotCQlFbnRyeU51bSwgUGh5TGlua0hhbmRsZSkpOwotCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lEOwotCX0gZWxzZSBpZiAocEJ0TWdudC0+YlBoeUxpbmtJblByb2dyZXNzU3RhcnRMTCkgewotCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lEOwotCQlwQnRNZ250LT5iUGh5TGlua0luUHJvZ3Jlc3NTdGFydExMID0gZmFsc2U7Ci0JfSBlbHNlIHsKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkFtcEFzb2NDbWREYXRhLkJ0UGh5TGlua2hhbmRsZSA9ICooKHU4ICopcEhjaUNtZC0+RGF0YSk7Ci0JCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BbXBBc29jQ21kRGF0YS5MZW5Tb0ZhciA9ICooKHUxNiAqKSgodTggKilwSGNpQ21kLT5EYXRhKzEpKTsKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkFtcEFzb2NDbWREYXRhLk1heFJlbW90ZUFTU09DTGVuID0gKigodTE2ICopKCh1OCAqKXBIY2lDbWQtPkRhdGErMykpOwotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0RFVEFJTCwgKCJSZWFkTG9jYWxBTVBBc3NvYywgTGVuU29GYXIgPSVkLCBNYXhSZW1vdGVBU1NPQ0xlbiA9JWRcbiIsCi0JCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQW1wQXNvY0NtZERhdGEuTGVuU29GYXIsCi0JCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQW1wQXNvY0NtZERhdGEuTWF4UmVtb3RlQVNTT0NMZW4pKTsKLQl9Ci0KLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIlJlYWRMb2NhbEFNUEFzc29jLCBFbnRyeU51bSA9ICVkICAhISEhISwgcGh5c2ljYWwgbGluayBoYW5kbGUgPSAweCV4LCBMZW5ndGhTb0ZhciA9ICV4ICBcbiIsCi0JCUVudHJ5TnVtLCBQaHlMaW5rSGFuZGxlLCBwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQW1wQXNvY0NtZERhdGEuTGVuU29GYXIpKTsKLQotCS8qIHNlbmQgY29tbWFuZCBjb21wbGV0ZSBldmVudCBoZXJlIHdoZW4gYWxsIGRhdGEgYXJlIHJlY2VpdmVkLiAqLwotCXsKLQkJc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JCS8qIFBWT0lEIGJ1ZmZlciA9IHBhZGFwdGVyLT5JcnBIQ0lMb2NhbGJ1Zi5QdHI7ICovCi0JCXU4IGxvY2FsQnVmW1RtcExvY2FsQnVmU2l6ZV0gPSAiIjsKLQkJdTE2CSpwUmVtYWluTGVuOwotCQl1MzIJdG90YWxMZW4gPSAwOwotCQl1MTYJdHlwZUxlbiA9IDAsIHJlbWFpbkxlbiA9IDAsIHJldF9pbmRleCA9IDA7Ci0JCXU4ICpwUmV0UGFyOwotCi0JCVBsYXRmb3JtWmVyb01lbW9yeSgmbG9jYWxCdWZbMF0sIFRtcExvY2FsQnVmU2l6ZSk7Ci0JCS8qIFBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKGJ1ZmZlcik7ICovCi0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQkJdG90YWxMZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJCU9HRl9TVEFUVVNfUEFSQU1FVEVSUywKLQkJCUhDSV9SRUFEX0xPQ0FMX0FNUF9BU1NPQywKLQkJCXN0YXR1cyk7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiUmVhZExvY2FsQU1QQXNzb2MsIFJlbWFpbmluZ19MZW4gPSVkICBcbiIsIHJlbWFpbkxlbikpOwotCQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVt0b3RhbExlbl07Ci0JCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkvKiBzdGF0dXMgKi8KLQkJcFJldFBhclsxXSA9ICooKHU4ICopcEhjaUNtZC0+RGF0YSk7Ci0JCXBSZW1haW5MZW4gPSAodTE2ICopJnBSZXRQYXJbMl07CS8qIEFNUF9BU1NPQ19SZW1haW5pbmdfTGVuZ3RoICovCi0JCXRvdGFsTGVuICs9IDQ7CS8qIDBdflszXSAqLwotCQlyZXRfaW5kZXggPSA0OwotCi0JCXR5cGVMZW4gPSBidGhjaV9Bc3NvY01BQ0FkZHIocGFkYXB0ZXIsICZwUmV0UGFyW3JldF9pbmRleF0pOwotCQl0b3RhbExlbiArPSB0eXBlTGVuOwotCQlyZW1haW5MZW4gKz0gdHlwZUxlbjsKLQkJcmV0X2luZGV4ICs9IHR5cGVMZW47Ci0JCXR5cGVMZW4gPSBidGhjaV9Bc3NvY1ByZWZlcnJlZENoYW5uZWxMaXN0KHBhZGFwdGVyLCAmcFJldFBhcltyZXRfaW5kZXhdLCBFbnRyeU51bSk7Ci0JCXRvdGFsTGVuICs9IHR5cGVMZW47Ci0JCXJlbWFpbkxlbiArPSB0eXBlTGVuOwotCQlyZXRfaW5kZXggKz0gdHlwZUxlbjsKLQkJdHlwZUxlbiA9IGJ0aGNpX1BBTENhcGFiaWxpdGllcyhwYWRhcHRlciwgJnBSZXRQYXJbcmV0X2luZGV4XSk7Ci0JCXRvdGFsTGVuICs9IHR5cGVMZW47Ci0JCXJlbWFpbkxlbiArPSB0eXBlTGVuOwotCQlyZXRfaW5kZXggKz0gdHlwZUxlbjsKLQkJdHlwZUxlbiA9IGJ0aGNpX0Fzc29jUEFMVmVyKHBhZGFwdGVyLCAmcFJldFBhcltyZXRfaW5kZXhdKTsKLQkJdG90YWxMZW4gKz0gdHlwZUxlbjsKLQkJcmVtYWluTGVuICs9IHR5cGVMZW47Ci0JCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gKHU4KXRvdGFsTGVuOwotCQkqcFJlbWFpbkxlbiA9IHJlbWFpbkxlbjsJLyogIEFNUF9BU1NPQ19SZW1haW5pbmdfTGVuZ3RoICovCi0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiUmVhZExvY2FsQU1QQXNzb2MsIFJlbWFpbmluZ19MZW4gPSVkICBcbiIsIHJlbWFpbkxlbikpOwotCQlSVFBSSU5UX0RBVEEoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EX0RFVEFJTHxJT0NUTF9CVF9MT0dPKSwgKCJBTVBfQVNTT0NfZnJhZ21lbnQgOiBcbiIpLCBQUGFja2V0SXJwRXZlbnQtPkRhdGEsIHRvdGFsTGVuKTsKLQotCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIHRvdGFsTGVuKzIpOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMgYnRoY2lfQ21kUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCSAgICAgICBzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZCkKLXsKLQotCWVudW0gaGNpX3N0YXR1cwkJc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQl1OCBsb2NhbEJ1ZltUbXBMb2NhbEJ1ZlNpemVdID0gIiI7Ci0JdTggKnBSZXRQYXI7Ci0JdTggbGVuID0gMDsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0JdTE2IGhhbmRsZTsKLQotCWhhbmRsZSA9ICooKHUxNiAqKXBIY2lDbWQtPkRhdGEpOwotCS8qIHNlbmQgY29tbWFuZCBjb21wbGV0ZSBldmVudCBoZXJlIHdoZW4gYWxsIGRhdGEgYXJlIHJlY2VpdmVkLiAqLwotCVBsYXRmb3JtWmVyb01lbW9yeSgmbG9jYWxCdWZbMF0sIFRtcExvY2FsQnVmU2l6ZSk7Ci0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQlPR0ZfU1RBVFVTX1BBUkFNRVRFUlMsCi0JCUhDSV9SRUFEX0ZBSUxFRF9DT05UQUNUX0NPVU5URVIsCi0JCXN0YXR1cyk7Ci0KLQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCXBSZXRQYXJbMV0gPSBUV09CWVRFX0xPV0JZVEUoaGFuZGxlKTsKLQlwUmV0UGFyWzJdID0gVFdPQllURV9ISUdIVEJZVEUoaGFuZGxlKTsKLQlwUmV0UGFyWzNdID0gVFdPQllURV9MT1dCWVRFKHBCdEhjaUluZm8tPkZhaWxDb250YWN0Q291bnQpOwotCXBSZXRQYXJbNF0gPSBUV09CWVRFX0hJR0hUQllURShwQnRIY2lJbmZvLT5GYWlsQ29udGFjdENvdW50KTsKLQlsZW4gKz0gNTsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kUmVzZXRGYWlsZWRDb250YWN0Q291bnRlcigKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCWVudW0gaGNpX3N0YXR1cwkJc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotLypQTUdOVF9JTkZPCQlwTWdudEluZm8gPSAmcGFkYXB0ZXItPk1nbnRJbmZvOyAqLwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQl1MTYJCWhhbmRsZTsKLQl1OCBsb2NhbEJ1ZltUbXBMb2NhbEJ1ZlNpemVdID0gIiI7Ci0JdTggKnBSZXRQYXI7Ci0JdTggbGVuID0gMDsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQloYW5kbGUgPSAqKCh1MTYgKilwSGNpQ21kLT5EYXRhKTsKLQlwQnRIY2lJbmZvLT5GYWlsQ29udGFjdENvdW50ID0gMDsKLQotCS8qIHNlbmQgY29tbWFuZCBjb21wbGV0ZSBldmVudCBoZXJlIHdoZW4gYWxsIGRhdGEgYXJlIHJlY2VpdmVkLiAqLwotCVBsYXRmb3JtWmVyb01lbW9yeSgmbG9jYWxCdWZbMF0sIFRtcExvY2FsQnVmU2l6ZSk7Ci0JLyogUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoYnVmZmVyKTsgKi8KLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCU9HRl9TVEFUVVNfUEFSQU1FVEVSUywKLQkJSENJX1JFU0VUX0ZBSUxFRF9DT05UQUNUX0NPVU5URVIsCi0JCXN0YXR1cyk7Ci0KLQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCXBSZXRQYXJbMV0gPSBUV09CWVRFX0xPV0JZVEUoaGFuZGxlKTsKLQlwUmV0UGFyWzJdID0gVFdPQllURV9ISUdIVEJZVEUoaGFuZGxlKTsKLQlsZW4gKz0gMzsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLS8qICAqLwotLyogIEJUIDMuMCtIUyBbVm9sIDJdIDcuNC4xICovCi0vKiAgKi8KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFJlYWRMb2NhbFZlcnNpb25JbmZvcm1hdGlvbigKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyCi0JKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0JLyogc2VuZCBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IGhlcmUgd2hlbiBhbGwgZGF0YSBhcmUgcmVjZWl2ZWQuICovCi0JdTggbG9jYWxCdWZbVG1wTG9jYWxCdWZTaXplXSA9ICIiOwotCXU4ICpwUmV0UGFyOwotCXU4IGxlbiA9IDA7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCXUxNiAqcHUyVGVtcDsKLQotCVBsYXRmb3JtWmVyb01lbW9yeSgmbG9jYWxCdWZbMF0sIFRtcExvY2FsQnVmU2l6ZSk7Ci0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQlPR0ZfSU5GT1JNQVRJT05BTF9QQVJBTUVURVJTLAotCQlIQ0lfUkVBRF9MT0NBTF9WRVJTSU9OX0lORk9STUFUSU9OLAotCQlzdGF0dXMpOwotCi0JLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkvKiBzdGF0dXMgKi8KLQlwUmV0UGFyWzFdID0gMHgwNTsJCQkvKiAgSENJX1ZlcnNpb24gKi8KLQlwdTJUZW1wID0gKHUxNiAqKSZwUmV0UGFyWzJdOwkJLyogIEhDSV9SZXZpc2lvbiAqLwotCSpwdTJUZW1wID0gMHgwMDAxOwotCXBSZXRQYXJbNF0gPSAweDA1OwkJCS8qICBMTVAvUEFMX1ZlcnNpb24gKi8KLQlwdTJUZW1wID0gKHUxNiAqKSZwUmV0UGFyWzVdOwkJLyogIE1hbnVmYWN0dXJlcl9OYW1lICovCi0JKnB1MlRlbXAgPSAweDAwNWQ7Ci0JcHUyVGVtcCA9ICh1MTYgKikmcFJldFBhcls3XTsJCS8qICBMTVAvUEFMX1N1YnZlcnNpb24gKi8KLQkqcHUyVGVtcCA9IDB4MDAwMTsKLQlsZW4gKz0gOTsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EX0RFVEFJTHxJT0NUTF9CVF9MT0dPKSwgKCJMT0NBTF9WRVJTSU9OX0lORk9STUFUSU9OXG4iKSk7Ci0JUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTURfREVUQUlMfElPQ1RMX0JUX0xPR08pLCAoIlN0YXR1cyAgJXhcbiIsIHN0YXR1cykpOwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EX0RFVEFJTHxJT0NUTF9CVF9MT0dPKSwgKCJIQ0lfVmVyc2lvbiA9IDB4MDVcbiIpKTsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRF9ERVRBSUx8SU9DVExfQlRfTE9HTyksICgiSENJX1JldmlzaW9uID0gMHgwMDAxXG4iKSk7Ci0JUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTURfREVUQUlMfElPQ1RMX0JUX0xPR08pLCAoIkxNUC9QQUxfVmVyc2lvbiA9IDB4MDVcbiIpKTsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRF9ERVRBSUx8SU9DVExfQlRfTE9HTyksICgiTWFudWZhY3R1cmVyX05hbWUgPSAweDAwMDFcbiIpKTsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRF9ERVRBSUx8SU9DVExfQlRfTE9HTyksICgiTE1QL1BBTF9TdWJ2ZXJzaW9uID0gMHgwMDAxXG4iKSk7Ci0KLQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLS8qIDcuNC43ICovCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzIGJ0aGNpX0NtZFJlYWREYXRhQmxvY2tTaXplKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JZW51bSBoY2lfc3RhdHVzCQkJc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXU4IGxvY2FsQnVmW1RtcExvY2FsQnVmU2l6ZV0gPSAiIjsKLQl1OCAqcFJldFBhcjsKLQl1OCBsZW4gPSAwOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQl1MTYgKnB1MlRlbXA7Ci0KLQlQbGF0Zm9ybVplcm9NZW1vcnkoJmxvY2FsQnVmWzBdLCBUbXBMb2NhbEJ1ZlNpemUpOwotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJT0dGX0lORk9STUFUSU9OQUxfUEFSQU1FVEVSUywKLQkJSENJX1JFQURfREFUQV9CTE9DS19TSVpFLAotCQlzdGF0dXMpOwotCi0JLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCXBSZXRQYXJbMF0gPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7CS8qIHN0YXR1cyAqLwotCXB1MlRlbXAgPSAodTE2ICopJnBSZXRQYXJbMV07CQkvKiAgTWF4X0FDTF9EYXRhX1BhY2tldF9MZW5ndGggKi8KLQkqcHUyVGVtcCA9IE1heDgwMjExUEFMUERVU2l6ZTsKLQotCXB1MlRlbXAgPSAodTE2ICopJnBSZXRQYXJbM107CQkvKiAgRGF0YV9CbG9ja19MZW5ndGggKi8KLQkqcHUyVGVtcCA9IE1heDgwMjExUEFMUERVU2l6ZTsKLQlwdTJUZW1wID0gKHUxNiAqKSZwUmV0UGFyWzVdOwkJLyogIFRvdGFsX051bV9EYXRhX0Jsb2NrcyAqLwotCSpwdTJUZW1wID0gQlRUb3RhbERhdGFCbG9ja051bTsKLQlsZW4gKz0gNzsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyogIDcuNC41ICovCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzIGJ0aGNpX0NtZFJlYWRCdWZmZXJTaXplKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQl1OCBsb2NhbEJ1ZltUbXBMb2NhbEJ1ZlNpemVdID0gIiI7Ci0JdTggKnBSZXRQYXI7Ci0JdTggbGVuID0gMDsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0JdTE2ICpwdTJUZW1wOwotCi0JUGxhdGZvcm1aZXJvTWVtb3J5KCZsb2NhbEJ1ZlswXSwgVG1wTG9jYWxCdWZTaXplKTsKLQkvKiBQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKShidWZmZXIpOyAqLwotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJT0dGX0lORk9STUFUSU9OQUxfUEFSQU1FVEVSUywKLQkJSENJX1JFQURfQlVGRkVSX1NJWkUsCi0JCXN0YXR1cyk7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJTeW5jaHJvbm91c19EYXRhX1BhY2tldF9MZW5ndGggPSAweCV4XG4iLCBCVFN5bkRhdGFQYWNrZXRMZW5ndGgpKTsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIlRvdGFsX051bV9BQ0xfRGF0YV9QYWNrZXRzID0gMHgleFxuIiwgQlRUb3RhbERhdGFCbG9ja051bSkpOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiVG90YWxfTnVtX1N5bmNocm9ub3VzX0RhdGFfUGFja2V0cyA9IDB4JXhcbiIsIEJUVG90YWxEYXRhQmxvY2tOdW0pKTsKLQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCXB1MlRlbXAgPSAodTE2ICopJnBSZXRQYXJbMV07CQkvKiAgSENfQUNMX0RhdGFfUGFja2V0X0xlbmd0aCAqLwotCSpwdTJUZW1wID0gTWF4ODAyMTFQQUxQRFVTaXplOwotCi0JcFJldFBhclszXSA9IEJUU3luRGF0YVBhY2tldExlbmd0aDsJLyogIEhDX1N5bmNocm9ub3VzX0RhdGFfUGFja2V0X0xlbmd0aCAqLwotCXB1MlRlbXAgPSAodTE2ICopJnBSZXRQYXJbNF07CQkvKiAgSENfVG90YWxfTnVtX0FDTF9EYXRhX1BhY2tldHMgKi8KLQkqcHUyVGVtcCA9IEJUVG90YWxEYXRhQmxvY2tOdW07Ci0JcHUyVGVtcCA9ICh1MTYgKikmcFJldFBhcls2XTsJCS8qICBIQ19Ub3RhbF9OdW1fU3luY2hyb25vdXNfRGF0YV9QYWNrZXRzICovCi0JKnB1MlRlbXAgPSBCVFRvdGFsRGF0YUJsb2NrTnVtOwotCWxlbiArPSA4OwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzIGJ0aGNpX0NtZFJlYWRMb2NhbEFNUEluZm8oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQllbnVtIGhjaV9zdGF0dXMJc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnBwd3JjdHJsID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKLQl1OCBsb2NhbEJ1ZltUbXBMb2NhbEJ1ZlNpemVdID0gIiI7Ci0JdTggKnBSZXRQYXI7Ci0JdTggbGVuID0gMDsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0JdTE2ICpwdTJUZW1wOwotCXUzMiAqcHU0VGVtcDsKLQl1MzIJVG90YWxCYW5kd2lkdGggPSBCVFRPVEFMQkFORFdJRFRILCBNYXhCYW5kR1VCYW5kd2lkdGggPSBCVE1BWEJBTkRHVUJBTkRXSURUSDsKLQl1OCBDb250cm9sVHlwZSA9IDB4MDEsIEFtcFN0YXR1cyA9IDB4MDE7Ci0JdTMyCU1heEZsdXNoVGltZW91dCA9IDEwMDAwLCBCZXN0RWZmb3J0Rmx1c2hUaW1lb3V0ID0gNTAwMDsKLQl1MTYgTWF4UERVU2l6ZSA9IE1heDgwMjExUEFMUERVU2l6ZSwgUGFsQ2FwID0gMHgxLCBBbXBBc3NvY0xlbiA9IE1heDgwMjExQU1QQVNTT0NMZW4sIE1pbkxhdGVuY3kgPSAyMDsKLQotCWlmICgocHB3cmN0cmwtPnJmb2ZmX3JlYXNvbiAmIFJGX0NIQU5HRV9CWV9IVykgfHwKLQkgICAgKHBwd3JjdHJsLT5yZm9mZl9yZWFzb24gJiBSRl9DSEFOR0VfQllfU1cpKSB7Ci0JCUFtcFN0YXR1cyA9IEFNUF9TVEFUVVNfTk9fQ0FQQUNJVFlfRk9SX0JUOwotCX0KLQotCVBsYXRmb3JtWmVyb01lbW9yeSgmbG9jYWxCdWZbMF0sIFRtcExvY2FsQnVmU2l6ZSk7Ci0JLyogUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoYnVmZmVyKTsgKi8KLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCU9HRl9TVEFUVVNfUEFSQU1FVEVSUywKLQkJSENJX1JFQURfTE9DQUxfQU1QX0lORk8sCi0JCXN0YXR1cyk7Ci0KLQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JcFJldFBhclswXSA9IHN0YXR1czsJCQkvKiBzdGF0dXMgKi8KLQlwUmV0UGFyWzFdID0gQW1wU3RhdHVzOwkJCS8qICBBTVBfU3RhdHVzICovCi0JcHU0VGVtcCA9ICh1MzIgKikmcFJldFBhclsyXTsJCS8qICBUb3RhbF9CYW5kd2lkdGggKi8KLQkqcHU0VGVtcCA9IFRvdGFsQmFuZHdpZHRoOwkJLyogMHgxOWJmY2MwMDsweDc1MzA7ICovCi0JcHU0VGVtcCA9ICh1MzIgKikmcFJldFBhcls2XTsJCS8qICBNYXhfR3VhcmFudGVlZF9CYW5kd2lkdGggKi8KLQkqcHU0VGVtcCA9IE1heEJhbmRHVUJhbmR3aWR0aDsJCS8qIDB4MTliZmNjMDA7MHg0ZTIwOyAqLwotCXB1NFRlbXAgPSAodTMyICopJnBSZXRQYXJbMTBdOwkJLyogIE1pbl9MYXRlbmN5ICovCi0JKnB1NFRlbXAgPSBNaW5MYXRlbmN5OwkJCS8qIDE1MDsgKi8KLQlwdTRUZW1wID0gKHUzMiAqKSZwUmV0UGFyWzE0XTsJCS8qICBNYXhfUERVX1NpemUgKi8KLQkqcHU0VGVtcCA9IE1heFBEVVNpemU7Ci0JcFJldFBhclsxOF0gPSBDb250cm9sVHlwZTsJCS8qICBDb250cm9sbGVyX1R5cGUgKi8KLQlwdTJUZW1wID0gKHUxNiAqKSZwUmV0UGFyWzE5XTsJCS8qICBQQUxfQ2FwYWJpbGl0aWVzICovCi0JKnB1MlRlbXAgPSBQYWxDYXA7Ci0JcHUyVGVtcCA9ICh1MTYgKikmcFJldFBhclsyMV07CQkvKiAgQU1QX0FTU09DX0xlbmd0aCAqLwotCSpwdTJUZW1wID0gQW1wQXNzb2NMZW47Ci0JcHU0VGVtcCA9ICh1MzIgKikmcFJldFBhclsyM107CQkvKiAgTWF4X0ZsdXNoX1RpbWVvdXQgKi8KLQkqcHU0VGVtcCA9IE1heEZsdXNoVGltZW91dDsKLQlwdTRUZW1wID0gKHUzMiAqKSZwUmV0UGFyWzI3XTsJCS8qICBCZXN0X0VmZm9ydF9GbHVzaF9UaW1lb3V0ICovCi0JKnB1NFRlbXAgPSBCZXN0RWZmb3J0Rmx1c2hUaW1lb3V0OwotCWxlbiArPSAzMTsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkFtcFN0YXR1cyA9IDB4JXhcbiIsCi0JCUFtcFN0YXR1cykpOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiVG90YWxCYW5kd2lkdGggPSAweCV4LCBNYXhCYW5kR1VCYW5kd2lkdGggPSAweCV4LCBNaW5MYXRlbmN5ID0gMHgleCwgXG4gTWF4UERVU2l6ZSA9IDB4JXgsIENvbnRyb2xUeXBlID0gMHgleFxuIiwKLQkJVG90YWxCYW5kd2lkdGgsIE1heEJhbmRHVUJhbmR3aWR0aCwgTWluTGF0ZW5jeSwgTWF4UERVU2l6ZSwgQ29udHJvbFR5cGUpKTsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIlBhbENhcCA9IDB4JXgsIEFtcEFzc29jTGVuID0gMHgleCwgTWF4Rmx1c2hUaW1lb3V0ID0gMHgleCwgQmVzdEVmZm9ydEZsdXNoVGltZW91dCA9IDB4JXhcbiIsCi0JCVBhbENhcCwgQW1wQXNzb2NMZW4sIE1heEZsdXNoVGltZW91dCwgQmVzdEVmZm9ydEZsdXNoVGltZW91dCkpOwotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZENyZWF0ZVBoeXNpY2FsTGluaygKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2RnYiAqcEJ0RGJnID0gJnBCVEluZm8tPkJ0RGJnOwotCi0JcEJ0RGJnLT5kYmdIY2lJbmZvLmhjaUNtZENudENyZWF0ZVBoeUxpbmsrKzsKLQotCXJldHVybiBidGhjaV9CdWlsZFBoeXNpY2FsTGluayhwYWRhcHRlciwKLQkJcEhjaUNtZCwgSENJX0NSRUFURV9QSFlTSUNBTF9MSU5LKTsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kUmVhZExpbmtRdWFsaXR5KAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzCQkJc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0JdTE2CQkJCVBMSDsKLQl1OCAJRW50cnlOdW0sIExpbmtRdWFsaXR5ID0gMHg1NTsKLQotCVBMSCA9ICooKHUxNiAqKSZwSGNpQ21kLT5EYXRhWzBdKTsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIlBMSCA9IDB4JXhcbiIsIFBMSCkpOwotCi0JRW50cnlOdW0gPSBidGhjaV9HZXRDdXJyZW50RW50cnlOdW0ocGFkYXB0ZXIsICh1OClQTEgpOwotCWlmIChFbnRyeU51bSA9PSAweGZmKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiTm8gc3VjaCBQTEgoMHgleClcbiIsIFBMSCkpOwotCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lEOwotCX0KLQotCXsKLQkJdTggbG9jYWxCdWZbMTFdID0gIiI7Ci0JCXU4ICpwUmV0UGFyOwotCQl1OCBsZW4gPSAwOwotCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkJUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJCU9HRl9TVEFUVVNfUEFSQU1FVEVSUywKLQkJCUhDSV9SRUFEX0xJTktfUVVBTElUWSwKLQkJCXN0YXR1cyk7Ci0KLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCIgUExIID0gMHgleFxuIExpbmsgUXVhbGl0eSA9IDB4JXhcbiIsIFBMSCwgTGlua1F1YWxpdHkpKTsKLQotCQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJCS8qIHN0YXR1cyAqLwotCQkqKCh1MTYgKikmcFJldFBhclsxXSkgPSBwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRQaHlMaW5raGFuZGxlOwkvKiAgSGFuZGxlICovCi0JCXBSZXRQYXJbM10gPSAweDU1OwkvKiBMaW5rIFF1YWlsdHkgKi8KLQkJbGVuICs9IDQ7Ci0JCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZENyZWF0ZUxvZ2ljYWxMaW5rKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmcgPSAmcEJUSW5mby0+QnREYmc7Ci0KLQlwQnREYmctPmRiZ0hjaUluZm8uaGNpQ21kQ250Q3JlYXRlTG9nTGluaysrOwotCi0JYnRoY2lfQnVpbGRMb2dpY2FsTGluayhwYWRhcHRlciwgcEhjaUNtZCwKLQkJSENJX0NSRUFURV9MT0dJQ0FMX0xJTkspOwotCi0JcmV0dXJuIEhDSV9TVEFUVVNfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kQWNjZXB0TG9naWNhbExpbmsoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9kZ2IgKnBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQotCXBCdERiZy0+ZGJnSGNpSW5mby5oY2lDbWRDbnRBY2NlcHRMb2dMaW5rKys7Ci0KLQlidGhjaV9CdWlsZExvZ2ljYWxMaW5rKHBhZGFwdGVyLCBwSGNpQ21kLAotCQlIQ0lfQUNDRVBUX0xPR0lDQUxfTElOSyk7Ci0KLQlyZXR1cm4gSENJX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWREaXNjb25uZWN0TG9naWNhbExpbmsoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotLypQTUdOVF9JTkZPIHBNZ250SW5mbyA9ICZwYWRhcHRlci0+TWdudEluZm87ICovCi0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUaW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRpbmZvLT5CdE1nbnQ7Ci0Jc3RydWN0IGJ0X2RnYiAqcEJ0RGJnID0gJnBCVGluZm8tPkJ0RGJnOwotCXUxNglsb2dpY0hhbmRsZTsKLQl1OCBpLCBqLCBmaW5kID0gMCwgTG9nTGlua0NvdW50ID0gMDsKLQotCXBCdERiZy0+ZGJnSGNpSW5mby5oY2lDbWRDbnREaXNjb25uZWN0TG9nTGluaysrOwotCi0JbG9naWNIYW5kbGUgPSAqKCh1MTYgKilwSGNpQ21kLT5EYXRhKTsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkRpc2Nvbm5lY3RMb2dpY2FsTGluaywgbG9naWNIYW5kbGUgPSAweCV4XG4iLCBsb2dpY0hhbmRsZSkpOwotCi0JLyogIGZpbmQgYW4gY3JlYXRlZCBsb2dpY2FsIGxpbmsgaW5kZXggYW5kIGNsZWFyIHRoZSBkYXRhICovCi0JZm9yIChqID0gMDsgaiA8IE1BWF9CVF9BU09DX0VOVFJZX05VTTsgaisrKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBNQVhfTE9HSUNBTF9MSU5LX05VTTsgaSsrKSB7Ci0JCQlpZiAocEJUaW5mby0+QnRBc29jRW50cnlbal0uTG9nTGlua0NtZERhdGFbaV0uQnRMb2dMaW5raGFuZGxlID09IGxvZ2ljSGFuZGxlKSB7Ci0JCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJEaXNjb25uZWN0TG9naWNhbExpbmssIGxvZ2ljSGFuZGxlIGlzIG1hdGNoZWQgIDB4JXhcbiIsIGxvZ2ljSGFuZGxlKSk7Ci0JCQkJYnRoY2lfUmVzZXRGbG93U3BlYyhwYWRhcHRlciwgaiwgaSk7Ci0JCQkJZmluZCA9IDE7Ci0JCQkJcEJ0TWdudC0+RGlzY29ubmVjdEVudHJ5TnVtID0gajsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCWlmICghZmluZCkKLQkJc3RhdHVzID0gSENJX1NUQVRVU19VTktOT1dfQ09OTkVDVF9JRDsKLQotCS8qICBUbyBjaGVjayBlYWNoICovCi0JZm9yIChpID0gMDsgaSA8IE1BWF9MT0dJQ0FMX0xJTktfTlVNOyBpKyspIHsKLQkJaWYgKHBCVGluZm8tPkJ0QXNvY0VudHJ5W3BCdE1nbnQtPkRpc2Nvbm5lY3RFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaV0uQnRMb2dMaW5raGFuZGxlICE9IDApCi0JCQlMb2dMaW5rQ291bnQrKzsKLQl9Ci0KLQkvKiBXaGVuIHdlIHJlY2VpdmUgQ3JlYXRlIGxvZ2ljYWwgbGluayBjb21tYW5kLCB3ZSBzaG91bGQgc2VuZCBjb21tYW5kIHN0YXR1cyBldmVudCBmaXJzdC4gKi8KLQlidGhjaV9FdmVudENvbW1hbmRTdGF0dXMocGFkYXB0ZXIsCi0JCQlMSU5LX0NPTlRST0xfQ09NTUFORFMsCi0JCQlIQ0lfRElTQ09OTkVDVF9MT0dJQ0FMX0xJTkssCi0JCQlzdGF0dXMpOwotCS8qICAqLwotCS8qIFdoZW4gd2UgZGV0ZXJtaW5lcyB0aGUgbG9naWNhbCBsaW5rIGlzIGVzdGFibGlzaGVkLCB3ZSBzaG91bGQgc2VuZCBjb21tYW5kIGNvbXBsZXRlIGV2ZW50LiAqLwotCS8qICAqLwotCWlmIChzdGF0dXMgPT0gSENJX1NUQVRVU19TVUNDRVNTKSB7Ci0JCWJ0aGNpX0V2ZW50RGlzY29ubmVjdExvZ2ljYWxMaW5rQ29tcGxldGUocGFkYXB0ZXIsIHN0YXR1cywKLQkJCWxvZ2ljSGFuZGxlLCBIQ0lfU1RBVFVTX0NPTk5FQ1RfVEVSTUlOQVRFX0xPQ0FMX0hPU1QpOwotCX0KLQotCWlmIChMb2dMaW5rQ291bnQgPT0gMCkKLQkJbW9kX3RpbWVyKCZwQlRpbmZvLT5CVERpc2Nvbm5lY3RQaHlMaW5rVGltZXIsCi0JCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMCkpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kTG9naWNhbExpbmtDYW5jZWwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgIHN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUaW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRpbmZvLT5CdE1nbnQ7Ci0JdTggQ3VycmVudEVudHJ5TnVtLCBDdXJyZW50TG9nRW50cnlOdW07Ci0KLQl1OCBwaHlzaWNhbExpbmtIYW5kbGUsIFR4Rmxvd1NwZWNJRCwgaTsKLQl1MTYJQ3VycmVudExvZ2ljYWxIYW5kbGU7Ci0KLQlwaHlzaWNhbExpbmtIYW5kbGUgPSAqKCh1OCAqKXBIY2lDbWQtPkRhdGEpOwotCVR4Rmxvd1NwZWNJRCA9ICooKCh1OCAqKXBIY2lDbWQtPkRhdGEpKzEpOwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJMb2dpY2FsTGlua0NhbmNlbCwgcGh5c2ljYWxMaW5rSGFuZGxlID0gMHgleCwgVHhGbG93U3BlY0lEID0gMHgleFxuIiwKLQkJcGh5c2ljYWxMaW5rSGFuZGxlLCBUeEZsb3dTcGVjSUQpKTsKLQotCUN1cnJlbnRFbnRyeU51bSA9IHBCdE1nbnQtPkN1cnJlbnRDb25uZWN0RW50cnlOdW07Ci0JQ3VycmVudExvZ2ljYWxIYW5kbGUgPSBwQnRNZ250LT5CdEN1cnJlbnRMb2dMaW5raGFuZGxlOwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJDdXJyZW50RW50cnlOdW0gPSAweCV4LCBDdXJyZW50TG9naWNhbEhhbmRsZSA9IDB4JXhcbiIsCi0JCUN1cnJlbnRFbnRyeU51bSwgQ3VycmVudExvZ2ljYWxIYW5kbGUpKTsKLQotCUN1cnJlbnRMb2dFbnRyeU51bSA9IDB4ZmY7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9MT0dJQ0FMX0xJTktfTlVNOyBpKyspIHsKLQkJaWYgKChDdXJyZW50TG9naWNhbEhhbmRsZSA9PSBwQlRpbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50RW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2ldLkJ0TG9nTGlua2hhbmRsZSkgJiYKLQkJCShwaHlzaWNhbExpbmtIYW5kbGUgPT0gcEJUaW5mby0+QnRBc29jRW50cnlbQ3VycmVudEVudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpXS5CdFBoeUxpbmtoYW5kbGUpKSB7Ci0JCQlDdXJyZW50TG9nRW50cnlOdW0gPSBpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoQ3VycmVudExvZ0VudHJ5TnVtID09IDB4ZmYpIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJMb2dpY2FsTGlua0NhbmNlbCwgQ3VycmVudExvZ0VudHJ5TnVtID09IDB4ZmYgISEhIVxuIikpOwotCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lEOwotCQlyZXR1cm4gc3RhdHVzOwotCX0gZWxzZSB7Ci0JCWlmIChwQlRpbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50RW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW0N1cnJlbnRMb2dFbnRyeU51bV0uYkxMQ29tcGxldGVFdmVudElzU2V0KSB7Ci0JCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkxvZ2ljYWxMaW5rQ2FuY2VsLCBMTENvbXBsZXRlRXZlbnRJc1NldCEhISFcbiIpKTsKLQkJCXN0YXR1cyA9IEhDSV9TVEFUVVNfQUNMX0NPTk5FQ1RfRVhJU1RTOwotCQl9Ci0JfQotCi0JewotCQl1OCBsb2NhbEJ1Zls4XSA9ICIiOwotCQl1OCAqcFJldFBhcjsKLQkJdTggbGVuID0gMDsKLQkJc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQkJbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCQlMSU5LX0NPTlRST0xfQ09NTUFORFMsCi0JCQlIQ0lfTE9HSUNBTF9MSU5LX0NBTkNFTCwKLQkJCXN0YXR1cyk7Ci0KLQkJLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQkJcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQkJcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCQlwUmV0UGFyWzFdID0gcEJUaW5mby0+QnRBc29jRW50cnlbQ3VycmVudEVudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtDdXJyZW50TG9nRW50cnlOdW1dLkJ0UGh5TGlua2hhbmRsZTsKLQkJcFJldFBhclsyXSA9IHBCVGluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbQ3VycmVudExvZ0VudHJ5TnVtXS5CdFR4Rmxvd1NwZWNJRDsKLQkJbGVuICs9IDM7Ci0JCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCX0KLQotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbQ3VycmVudExvZ0VudHJ5TnVtXS5iTExDYW5jZWxDTURJc1NldGFuZENvbXBsZXRlID0gdHJ1ZTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZEZsb3dTcGVjTW9kaWZ5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZCkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotLypQTUdOVF9JTkZPIHBNZ250SW5mbyA9ICZwYWRhcHRlci0+TWdudEluZm87ICovCi0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUaW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQl1OCBpLCBqLCBmaW5kID0gMDsKLQl1MTYgbG9naWNIYW5kbGU7Ci0KLQlsb2dpY0hhbmRsZSA9ICooKHUxNiAqKXBIY2lDbWQtPkRhdGEpOwotCS8qICBmaW5kIGFuIG1hdGNoZWQgbG9naWNhbCBsaW5rIGluZGV4IGFuZCBjb3B5IHRoZSBkYXRhICovCi0JZm9yIChqID0gMDsgaiA8IE1BWF9CVF9BU09DX0VOVFJZX05VTTsgaisrKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBNQVhfTE9HSUNBTF9MSU5LX05VTTsgaSsrKSB7Ci0JCQlpZiAocEJUaW5mby0+QnRBc29jRW50cnlbal0uTG9nTGlua0NtZERhdGFbaV0uQnRMb2dMaW5raGFuZGxlID09IGxvZ2ljSGFuZGxlKSB7Ci0JCQkJbWVtY3B5KCZwQlRpbmZvLT5CdEFzb2NFbnRyeVtqXS5Mb2dMaW5rQ21kRGF0YVtpXS5UeF9GbG93X1NwZWMsCi0JCQkJCSZwSGNpQ21kLT5EYXRhWzJdLCBzaXplb2Yoc3RydWN0IGhjaV9mbG93X3NwZWMpKTsKLQkJCQltZW1jcHkoJnBCVGluZm8tPkJ0QXNvY0VudHJ5W2pdLkxvZ0xpbmtDbWREYXRhW2ldLlJ4X0Zsb3dfU3BlYywKLQkJCQkJJnBIY2lDbWQtPkRhdGFbMThdLCBzaXplb2Yoc3RydWN0IGhjaV9mbG93X3NwZWMpKTsKLQotCQkJCWJ0aGNpX0NoZWNrTG9nTGlua0JlaGF2aW9yKHBhZGFwdGVyLCBwQlRpbmZvLT5CdEFzb2NFbnRyeVtqXS5Mb2dMaW5rQ21kRGF0YVtpXS5UeF9GbG93X1NwZWMpOwotCQkJCWZpbmQgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9MT0dPLCAoIkZsb3dTcGVjTW9kaWZ5LCBMTEggPSAweCV4LCBcbiIsIGxvZ2ljSGFuZGxlKSk7Ci0KLQkvKiBXaGVuIHdlIHJlY2VpdmUgRmxvdyBTcGVjIE1vZGlmeSBjb21tYW5kLCB3ZSBzaG91bGQgc2VuZCBjb21tYW5kIHN0YXR1cyBldmVudCBmaXJzdC4gKi8KLQlidGhjaV9FdmVudENvbW1hbmRTdGF0dXMocGFkYXB0ZXIsCi0JCUxJTktfQ09OVFJPTF9DT01NQU5EUywKLQkJSENJX0ZMT1dfU1BFQ19NT0RJRlksCi0JCUhDSV9TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlpZiAoIWZpbmQpCi0JCXN0YXR1cyA9IEhDSV9TVEFUVVNfVU5LTk9XX0NPTk5FQ1RfSUQ7Ci0KLQlidGhjaV9FdmVudFNlbmRGbG93U3BlY01vZGlmeUNvbXBsZXRlKHBhZGFwdGVyLCBzdGF0dXMsIGxvZ2ljSGFuZGxlKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZEFjY2VwdFBoeXNpY2FsTGluayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgIHN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2RnYiAqcEJ0RGJnID0gJnBCVEluZm8tPkJ0RGJnOwotCi0JcEJ0RGJnLT5kYmdIY2lJbmZvLmhjaUNtZENudEFjY2VwdFBoeUxpbmsrKzsKLQotCXJldHVybiBidGhjaV9CdWlsZFBoeXNpY2FsTGluayhwYWRhcHRlciwKLQkJcEhjaUNtZCwgSENJX0FDQ0VQVF9QSFlTSUNBTF9MSU5LKTsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kRGlzY29ubmVjdFBoeXNpY2FsTGluayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kKQotewotCWVudW0gaGNpX3N0YXR1cwlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmcgPSAmcEJUSW5mby0+QnREYmc7Ci0JdTggUExILCBDdXJyZW50RW50cnlOdW0sIFBoeXNMaW5rRGlzY29ubmVjdFJlYXNvbjsKLQotCXBCdERiZy0+ZGJnSGNpSW5mby5oY2lDbWRDbnREaXNjb25uZWN0UGh5TGluaysrOwotCi0JUExIID0gKigodTggKilwSGNpQ21kLT5EYXRhKTsKLQlQaHlzTGlua0Rpc2Nvbm5lY3RSZWFzb24gPSAqKCh1OCAqKXBIY2lDbWQtPkRhdGErMSk7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfRElTQ09OTkVDVF9QSFlTSUNBTF9MSU5LICBQaHlIYW5kbGUgPSAweCV4LCBSZWFzb24gPSAweCV4XG4iLAotCQlQTEgsIFBoeXNMaW5rRGlzY29ubmVjdFJlYXNvbikpOwotCi0JQ3VycmVudEVudHJ5TnVtID0gYnRoY2lfR2V0Q3VycmVudEVudHJ5TnVtKHBhZGFwdGVyLCBQTEgpOwotCi0JaWYgKEN1cnJlbnRFbnRyeU51bSA9PSAweGZmKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsCi0JCQkoIkRpc2Nvbm5lY3RQaHlzaWNhbExpbmssIE5vIHN1Y2ggSGFuZGxlIGluIHRoZSBFbnRyeVxuIikpOwotCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lEOwotCX0gZWxzZSB7Ci0JCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRFbnRyeU51bV0uUGh5TGlua0Rpc2Nvbm5lY3RSZWFzb24gPQotCQkJKGVudW0gaGNpX3N0YXR1cylQaHlzTGlua0Rpc2Nvbm5lY3RSZWFzb247Ci0JfQotCS8qIFNlbmQgSENJIENvbW1hbmQgc3RhdHVzIGV2ZW50IHRvIEFNUC4gKi8KLQlidGhjaV9FdmVudENvbW1hbmRTdGF0dXMocGFkYXB0ZXIsIExJTktfQ09OVFJPTF9DT01NQU5EUywKLQkJCQkgSENJX0RJU0NPTk5FQ1RfUEhZU0lDQUxfTElOSywgc3RhdHVzKTsKLQotCWlmIChzdGF0dXMgIT0gSENJX1NUQVRVU19TVUNDRVNTKQotCQlyZXR1cm4gc3RhdHVzOwotCi0JLyogVGhlIG1hY3JvcyBiZWxvdyByZXF1aXJlIHsgYW5kIH0gaW4gdGhlIGlmIHN0YXRlbWVudCAqLwotCWlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50RW50cnlOdW1dLkJ0Q3VycmVudFN0YXRlID09IEhDSV9TVEFURV9ESVNDT05ORUNURUQpIHsKLQkJQlRIQ0lfU01fV0lUSF9JTkZPKHBhZGFwdGVyLCBIQ0lfU1RBVEVfRElTQ09OTkVDVEVELCBTVEFURV9DTURfRElTQ09OTkVDVF9QSFlfTElOSywgQ3VycmVudEVudHJ5TnVtKTsKLQl9IGVsc2UgewotCQlCVEhDSV9TTV9XSVRIX0lORk8ocGFkYXB0ZXIsIEhDSV9TVEFURV9ESVNDT05ORUNUSU5HLCBTVEFURV9DTURfRElTQ09OTkVDVF9QSFlfTElOSywgQ3VycmVudEVudHJ5TnVtKTsKLQl9Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kU2V0QUNMTGlua0RhdGFGbG93TW9kZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0JdTggbG9jYWxCdWZbOF0gPSAiIjsKLQl1OCAqcFJldFBhcjsKLQl1OCBsZW4gPSAwOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQl1MTYgKnB1MlRlbXA7Ci0KLQlwQnRNZ250LT5FeHRDb25maWcuQ3VycmVudENvbm5lY3RIYW5kbGUgPSAqKCh1MTYgKilwSGNpQ21kLT5EYXRhKTsKLQlwQnRNZ250LT5FeHRDb25maWcuQ3VycmVudEluY29taW5nVHJhZmZpY01vZGUgPSAqKCh1OCAqKXBIY2lDbWQtPkRhdGEpKzI7Ci0JcEJ0TWdudC0+RXh0Q29uZmlnLkN1cnJlbnRPdXRnb2luZ1RyYWZmaWNNb2RlID0gKigodTggKilwSGNpQ21kLT5EYXRhKSszOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIkNvbm5lY3Rpb24gSGFuZGxlID0gMHgleCwgSW5jb21pbmcgVHJhZmZpYyBtb2RlID0gMHgleCwgT3V0Z29pbmcgVHJhZmZpYyBtb2RlID0gMHgleCIsCi0JCXBCdE1nbnQtPkV4dENvbmZpZy5DdXJyZW50Q29ubmVjdEhhbmRsZSwKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLkN1cnJlbnRJbmNvbWluZ1RyYWZmaWNNb2RlLAotCQlwQnRNZ250LT5FeHRDb25maWcuQ3VycmVudE91dGdvaW5nVHJhZmZpY01vZGUpKTsKLQotCi0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQlPR0ZfRVhURU5TSU9OLAotCQlIQ0lfU0VUX0FDTF9MSU5LX0RBVEFfRkxPV19NT0RFLAotCQlzdGF0dXMpOwotCi0JLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkvKiBzdGF0dXMgKi8KLQotCXB1MlRlbXAgPSAodTE2ICopJnBSZXRQYXJbMV07Ci0JKnB1MlRlbXAgPSBwQnRNZ250LT5FeHRDb25maWcuQ3VycmVudENvbm5lY3RIYW5kbGU7Ci0JbGVuICs9IDM7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRTZXRBQ0xMaW5rU3RhdHVzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgIHN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0Jc3RydWN0IGJ0X2RnYiAqcEJ0RGJnID0gJnBCVEluZm8tPkJ0RGJnOwotCXU4IGk7Ci0JdTggKnBUcmlwbGU7Ci0KLQlwQnREYmctPmRiZ0hjaUluZm8uaGNpQ21kQ250U2V0QWNsTGlua1N0YXR1cysrOwotCVJUUFJJTlRfREFUQShGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICJTZXRBQ0xMaW5rU3RhdHVzLCBIZXggRGF0YSA6XG4iLAotCQkJJnBIY2lDbWQtPkRhdGFbMF0sIHBIY2lDbWQtPkxlbmd0aCk7Ci0KLQkvKiAgT25seSBDb3JlIFN0YWNrIHYyNTEgYW5kIGxhdGVyIHZlcnNpb24gc3VwcG9ydCB0aGlzIGNvbW1hbmQuICovCi0JcEJ0TWdudC0+YlN1cHBvcnRQcm9maWxlID0gdHJ1ZTsKLQotCXBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSA9ICooKHU4ICopcEhjaUNtZC0+RGF0YSk7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiTnVtYmVyT2ZIYW5kbGUgPSAweCV4XG4iLCBwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGUpKTsKLQotCXBUcmlwbGUgPSAmcEhjaUNtZC0+RGF0YVsxXTsKLQlmb3IgKGkgPSAwOyBpIDwgcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlOyBpKyspIHsKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkNvbm5lY3RIYW5kbGUgPSAqKCh1MTYgKikmcFRyaXBsZVswXSk7Ci0JCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5JbmNvbWluZ1RyYWZmaWNNb2RlID0gcFRyaXBsZVsyXTsKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLk91dGdvaW5nVHJhZmZpY01vZGUgPSBwVHJpcGxlWzNdOwotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwKLQkJCSgiQ29ubmVjdGlvbl9IYW5kbGUgPSAweCV4LCBJbmNvbWluZyBUcmFmZmljIG1vZGUgPSAweCV4LCBPdXRnb2luZyBUcmFmZmljIE1vZGUgPSAweCV4XG4iLAotCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkNvbm5lY3RIYW5kbGUsCi0JCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uSW5jb21pbmdUcmFmZmljTW9kZSwKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5PdXRnb2luZ1RyYWZmaWNNb2RlKSk7Ci0JCXBUcmlwbGUgKz0gNDsKLQl9Ci0KLQl7Ci0JCXU4IGxvY2FsQnVmWzZdID0gIiI7Ci0JCXU4ICpwUmV0UGFyOwotCQl1OCBsZW4gPSAwOwotCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkJUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJCU9HRl9FWFRFTlNJT04sCi0JCQlIQ0lfU0VUX0FDTF9MSU5LX1NUQVRVUywKLQkJCXN0YXR1cyk7Ci0KLQkJLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQkJcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQkJcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCi0JCWxlbiArPSAxOwotCQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRTZXRTQ09MaW5rU3RhdHVzKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmcgPSAmcEJUSW5mby0+QnREYmc7Ci0KLQlwQnREYmctPmRiZ0hjaUluZm8uaGNpQ21kQ250U2V0U2NvTGlua1N0YXR1cysrOwotCXBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZlNDTyA9ICooKHU4ICopcEhjaUNtZC0+RGF0YSk7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiTnVtYmVyT2ZTQ08gPSAweCV4XG4iLAotCQlwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZTQ08pKTsKLQotCXsKLQkJdTggbG9jYWxCdWZbNl0gPSAiIjsKLQkJdTggKnBSZXRQYXI7Ci0JCXU4IGxlbiA9IDA7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQkJT0dGX0VYVEVOU0lPTiwKLQkJCUhDSV9TRVRfU0NPX0xJTktfU1RBVFVTLAotCQkJc3RhdHVzKTsKLQotCQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0KLQkJbGVuICs9IDE7Ci0JCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFNldFJTU0lWYWx1ZSgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0JczgJCW1pbl9idF9yc3NpID0gMDsKLQl1OCBpOwotCWZvciAoaSA9IDA7IGkgPCBwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGU7IGkrKykgewotCQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkNvbm5lY3RIYW5kbGUgPT0gKigodTE2ICopJnBIY2lDbWQtPkRhdGFbMF0pKSB7Ci0JCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQlRfUlNTSSA9IChzOCkocEhjaUNtZC0+RGF0YVsyXSk7Ci0JCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfRVZFTlRfUEVSSU9ESUNBTCwKLQkJCSgiQ29ubmVjdGlvbl9IYW5kbGUgPSAweCV4LCBSU1NJID0gJWQgXG4iLAotCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkNvbm5lY3RIYW5kbGUsCi0JCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQlRfUlNTSSkpOwotCQl9Ci0JCS8qICBnZXQgdGhlIG1pbmltdW0gYnQgcnNzaSB2YWx1ZSAqLwotCQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkJUX1JTU0kgPD0gbWluX2J0X3Jzc2kpCi0JCQltaW5fYnRfcnNzaSA9IHBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5CVF9SU1NJOwotCX0KLQotCXBCdE1nbnQtPkV4dENvbmZpZy5NSU5fQlRfUlNTSSA9IG1pbl9idF9yc3NpOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbYnQgcnNzaV0sIHRoZSBtaW4gcnNzaSBpcyAlZFxuIiwgbWluX2J0X3Jzc2kpKTsKLQotCXsKLQkJdTggbG9jYWxCdWZbNl0gPSAiIjsKLQkJdTggKnBSZXRQYXI7Ci0JCXU4IGxlbiA9IDA7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQkJT0dGX0VYVEVOU0lPTiwKLQkJCUhDSV9TRVRfUlNTSV9WQUxVRSwKLQkJCXN0YXR1cyk7Ci0KLQkJLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQkJcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQkJcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCi0JCWxlbiArPSAxOwotCQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRTZXRDdXJyZW50Qmx1ZXRvb3RoU3RhdHVzKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzCXN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLS8qUE1HTlRfSU5GTwlwTWdudEluZm8gPSAmcGFkYXB0ZXItPk1nbnRJbmZvOyAqLwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JcEJ0TWdudC0+RXh0Q29uZmlnLkN1cnJlbnRCVFN0YXR1cyA9ICooKHU4ICopJnBIY2lDbWQtPkRhdGFbMF0pOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIlNldEN1cnJlbnRCbHVldG9vdGhTdGF0dXMsIEN1cnJlbnRCVFN0YXR1cyA9IDB4JXhcbiIsCi0JCXBCdE1nbnQtPkV4dENvbmZpZy5DdXJyZW50QlRTdGF0dXMpKTsKLQotCXsKLQkJdTggbG9jYWxCdWZbNl0gPSAiIjsKLQkJdTggKnBSZXRQYXI7Ci0JCXU4IGxlbiA9IDA7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQkJT0dGX0VYVEVOU0lPTiwKLQkJCUhDSV9TRVRfQ1VSUkVOVF9CTFVFVE9PVEhfU1RBVFVTLAotCQkJc3RhdHVzKTsKLQotCQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JCWxlbiArPSAxOwotCi0JCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZEV4dGVuc2lvblZlcnNpb25Ob3RpZnkoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMJc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXN0cnVjdCBidF9kZ2IgKnBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQotCXBCdERiZy0+ZGJnSGNpSW5mby5oY2lDbWRDbnRFeHRlbnNpb25WZXJzaW9uTm90aWZ5Kys7Ci0JUlRQUklOVF9EQVRBKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgIkV4dGVuc2lvblZlcnNpb25Ob3RpZnksIEhleCBEYXRhIDpcbiIsCi0JCQkmcEhjaUNtZC0+RGF0YVswXSwgcEhjaUNtZC0+TGVuZ3RoKTsKLQotCXBCdE1nbnQtPkV4dENvbmZpZy5IQ0lFeHRlbnNpb25WZXIgPSAqKCh1MTYgKikmcEhjaUNtZC0+RGF0YVswXSk7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiSENJRXh0ZW5zaW9uVmVyID0gMHgleFxuIiwgcEJ0TWdudC0+RXh0Q29uZmlnLkhDSUV4dGVuc2lvblZlcikpOwotCi0JewotCQl1OCBsb2NhbEJ1Zls2XSA9ICIiOwotCQl1OCAqcFJldFBhcjsKLQkJdTggbGVuID0gMDsKLQkJc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQkJbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCQlPR0ZfRVhURU5TSU9OLAotCQkJSENJX0VYVEVOU0lPTl9WRVJTSU9OX05PVElGWSwKLQkJCXN0YXR1cyk7Ci0KLQkJLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQkJcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQkJcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCi0JCWxlbiArPSAxOwotCQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRMaW5rU3RhdHVzTm90aWZ5KAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzCXN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmcgPSAmcEJUSW5mby0+QnREYmc7Ci0JdTggaTsKLQl1OCAqcFRyaXBsZTsKLQotCXBCdERiZy0+ZGJnSGNpSW5mby5oY2lDbWRDbnRMaW5rU3RhdHVzTm90aWZ5Kys7Ci0JUlRQUklOVF9EQVRBKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgIkxpbmtTdGF0dXNOb3RpZnksIEhleCBEYXRhIDpcbiIsCi0JCQkmcEhjaUNtZC0+RGF0YVswXSwgcEhjaUNtZC0+TGVuZ3RoKTsKLQotCS8qICBDdXJyZW50IG9ubHkgUlRMODcyMyBzdXBwb3J0IHRoaXMgY29tbWFuZC4gKi8KLQlwQnRNZ250LT5iU3VwcG9ydFByb2ZpbGUgPSB0cnVlOwotCi0JcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlID0gKigodTggKilwSGNpQ21kLT5EYXRhKTsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJOdW1iZXJPZkhhbmRsZSA9IDB4JXhcbiIsIHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSkpOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIkhDSUV4dGVuc2lvblZlciA9ICVkXG4iLCBwQnRNZ250LT5FeHRDb25maWcuSENJRXh0ZW5zaW9uVmVyKSk7Ci0KLQlwVHJpcGxlID0gJnBIY2lDbWQtPkRhdGFbMV07Ci0JZm9yIChpID0gMDsgaSA8IHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZTsgaSsrKSB7Ci0JCWlmIChwQnRNZ250LT5FeHRDb25maWcuSENJRXh0ZW5zaW9uVmVyIDwgMSkgewotCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkNvbm5lY3RIYW5kbGUgPSAqKCh1MTYgKikmcFRyaXBsZVswXSk7Ci0JCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQlRQcm9maWxlID0gcFRyaXBsZVsyXTsKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5CVENvcmVTcGVjID0gcFRyaXBsZVszXTsKLQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULAotCQkJCSgiQ29ubmVjdGlvbl9IYW5kbGUgPSAweCV4LCBCVFByb2ZpbGUgPSVkLCBCVFNwZWMgPSVkXG4iLAotCQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5Db25uZWN0SGFuZGxlLAotCQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5CVFByb2ZpbGUsCi0JCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkJUQ29yZVNwZWMpKTsKLQkJCXBUcmlwbGUgKz0gNDsKLQkJfSBlbHNlIGlmIChwQnRNZ250LT5FeHRDb25maWcuSENJRXh0ZW5zaW9uVmVyID49IDEpIHsKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5Db25uZWN0SGFuZGxlID0gKigodTE2ICopJnBUcmlwbGVbMF0pOwotCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkJUUHJvZmlsZSA9IHBUcmlwbGVbMl07Ci0JCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQlRDb3JlU3BlYyA9IHBUcmlwbGVbM107Ci0JCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0ubGlua1JvbGUgPSBwVHJpcGxlWzRdOwotCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsCi0JCQkJKCJDb25uZWN0aW9uX0hhbmRsZSA9IDB4JXgsIEJUUHJvZmlsZSA9JWQsIEJUU3BlYyA9JWQsIExpbmtSb2xlID0lZFxuIiwKLQkJCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQ29ubmVjdEhhbmRsZSwKLQkJCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQlRQcm9maWxlLAotCQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5CVENvcmVTcGVjLAotCQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5saW5rUm9sZSkpOwotCQkJcFRyaXBsZSArPSA1OwotCQl9Ci0KLQl9Ci0JQlRIQ0lfVXBkYXRlQlRQcm9maWxlUlRLVG9Nb3RvKHBhZGFwdGVyKTsKLQl7Ci0JCXU4IGxvY2FsQnVmWzZdID0gIiI7Ci0JCXU4ICpwUmV0UGFyOwotCQl1OCBsZW4gPSAwOwotCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkJUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJCU9HRl9FWFRFTlNJT04sCi0JCQlIQ0lfTElOS19TVEFUVVNfTk9USUZZLAotCQkJc3RhdHVzKTsKLQotCQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0KLQkJbGVuICs9IDE7Ci0JCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZEJ0T3BlcmF0aW9uTm90aWZ5KAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzCXN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQotCVJUUFJJTlRfREFUQShGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICJCdCBPcGVyYXRpb24gbm90aWZ5LCBIZXggRGF0YSA6XG4iLAotCQkJJnBIY2lDbWQtPkRhdGFbMF0sIHBIY2lDbWQtPkxlbmd0aCk7Ci0KLQlwQnRNZ250LT5FeHRDb25maWcuYnRPcGVyYXRpb25Db2RlID0gKigodTggKilwSGNpQ21kLT5EYXRhKTsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJidE9wZXJhdGlvbkNvZGUgPSAweCV4XG4iLCBwQnRNZ250LT5FeHRDb25maWcuYnRPcGVyYXRpb25Db2RlKSk7Ci0Jc3dpdGNoIChwQnRNZ250LT5FeHRDb25maWcuYnRPcGVyYXRpb25Db2RlKSB7Ci0JY2FzZSBIQ0lfQlRfT1BfTk9ORToKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiW2J0IG9wZXJhdGlvbl0gOiBPcGVyYXRpb24gTm9uZSEhXG4iKSk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX0JUX09QX0lOUVVJUllfU1RBUlQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIltidCBvcGVyYXRpb25dIDogSW5xdWlyZSBzdGFydCEhXG4iKSk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX0JUX09QX0lOUVVJUllfRklOSVNIOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJbYnQgb3BlcmF0aW9uXSA6IElucXVpcmUgZmluaXNoZWQhIVxuIikpOwotCQlicmVhazsKLQljYXNlIEhDSV9CVF9PUF9QQUdJTkdfU1RBUlQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIltidCBvcGVyYXRpb25dIDogUGFnaW5nIGlzIHN0YXJ0ZWQhIVxuIikpOwotCQlicmVhazsKLQljYXNlIEhDSV9CVF9PUF9QQUdJTkdfU1VDQ0VTUzoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiW2J0IG9wZXJhdGlvbl0gOiBQYWdpbmcgY29tcGxldGUgc3VjY2Vzc2Z1bGx5ISFcbiIpKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfQlRfT1BfUEFHSU5HX1VOU1VDQ0VTUzoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiW2J0IG9wZXJhdGlvbl0gOiBQYWdpbmcgY29tcGxldGUgdW5zdWNjZXNzZnVsbHkhIVxuIikpOwotCQlicmVhazsKLQljYXNlIEhDSV9CVF9PUF9QQUlSSU5HX1NUQVJUOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJbYnQgb3BlcmF0aW9uXSA6IFBhaXJpbmcgc3RhcnQhIVxuIikpOwotCQlicmVhazsKLQljYXNlIEhDSV9CVF9PUF9QQUlSSU5HX0ZJTklTSDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiW2J0IG9wZXJhdGlvbl0gOiBQYWlyaW5nIGZpbmlzaGVkISFcbiIpKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfQlRfT1BfQlRfREVWX0VOQUJMRToKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiW2J0IG9wZXJhdGlvbl0gOiBCVCBEZXZpY2UgaXMgZW5hYmxlZCEhXG4iKSk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX0JUX09QX0JUX0RFVl9ESVNBQkxFOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJbYnQgb3BlcmF0aW9uXSA6IEJUIERldmljZSBpcyBkaXNhYmxlZCEhXG4iKSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIltidCBvcGVyYXRpb25dIDogVW5rbm93biwgZXJyb3IhIVxuIikpOwotCQlicmVhazsKLQl9Ci0JQlRETV9BZGp1c3RGb3JCdE9wZXJhdGlvbihwYWRhcHRlcik7Ci0JewotCQl1OCBsb2NhbEJ1Zls2XSA9ICIiOwotCQl1OCAqcFJldFBhcjsKLQkJdTggbGVuID0gMDsKLQkJc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQkJbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCQlPR0ZfRVhURU5TSU9OLAotCQkJSENJX0JUX09QRVJBVElPTl9OT1RJRlksCi0JCQlzdGF0dXMpOwotCi0JCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkvKiBzdGF0dXMgKi8KLQotCQlsZW4gKz0gMTsKLQkJUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQkJYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kRW5hYmxlV2lmaVNjYW5Ob3RpZnkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgIHN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kKQotewotCWVudW0gaGNpX3N0YXR1cwlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlSVFBSSU5UX0RBVEEoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAiRW5hYmxlIFdpZmkgc2NhbiBub3RpZnksIEhleCBEYXRhIDpcbiIsCi0JCQkmcEhjaUNtZC0+RGF0YVswXSwgcEhjaUNtZC0+TGVuZ3RoKTsKLQotCXBCdE1nbnQtPkV4dENvbmZpZy5iRW5hYmxlV2lmaVNjYW5Ob3RpZnkgPSAqKCh1OCAqKXBIY2lDbWQtPkRhdGEpOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoImJFbmFibGVXaWZpU2Nhbk5vdGlmeSA9ICVkXG4iLCBwQnRNZ250LT5FeHRDb25maWcuYkVuYWJsZVdpZmlTY2FuTm90aWZ5KSk7Ci0KLQl7Ci0JCXU4IGxvY2FsQnVmWzZdID0gIiI7Ci0JCXU4ICpwUmV0UGFyOwotCQl1OCBsZW4gPSAwOwotCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkJUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJCU9HRl9FWFRFTlNJT04sCi0JCQlIQ0lfRU5BQkxFX1dJRklfU0NBTl9OT1RJRlksCi0JCQlzdGF0dXMpOwotCi0JCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkvKiBzdGF0dXMgKi8KLQotCQlsZW4gKz0gMTsKLQkJUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQkJYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kV0lGSUN1cnJlbnRDaGFubmVsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXU4IGNobmwgPSBwbWxtZWV4dC0+Y3VyX2NoYW5uZWw7Ci0KLQlpZiAocG1sbWVleHQtPmN1cl9id21vZGUgPT0gSFRfQ0hBTk5FTF9XSURUSF80MCkgewotCQlpZiAocG1sbWVleHQtPmN1cl9jaF9vZmZzZXQgPT0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX1VQUEVSKQotCQkJY2hubCArPSAyOwotCQllbHNlIGlmIChwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCA9PSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfTE9XRVIpCi0JCQljaG5sIC09IDI7Ci0JfQotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiQ3VycmVudCBDaGFubmVsICA9IDB4JXhcbiIsIGNobmwpKTsKLQotCXsKLQkJdTggbG9jYWxCdWZbOF0gPSAiIjsKLQkJdTggKnBSZXRQYXI7Ci0JCXU4IGxlbiA9IDA7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQkJT0dGX0VYVEVOU0lPTiwKLQkJCUhDSV9XSUZJX0NVUlJFTlRfQ0hBTk5FTCwKLQkJCXN0YXR1cyk7Ci0KLQkJLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQkJcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQkJcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCQlwUmV0UGFyWzFdID0gY2hubDsJCQkvKiBjdXJyZW50IGNoYW5uZWwgKi8KLQkJbGVuICs9IDI7Ci0JCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFdJRklDdXJyZW50QmFuZHdpZHRoKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICBzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZCkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCWVudW0gaHRfY2hhbm5lbF93aWR0aCBidzsKLQl1OCBDdXJyZW50QlcgPSAwOwotCi0JYncgPSBwYWRhcHRlci0+bWxtZWV4dHByaXYuY3VyX2J3bW9kZTsKLQotCWlmIChidyA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwKQotCQlDdXJyZW50QlcgPSAwOwotCWVsc2UgaWYgKGJ3ID09IEhUX0NIQU5ORUxfV0lEVEhfNDApCi0JCUN1cnJlbnRCVyA9IDE7Ci0KLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJDdXJyZW50IEJXID0gMHgleFxuIiwKLQkJQ3VycmVudEJXKSk7Ci0KLQl7Ci0JCXU4IGxvY2FsQnVmWzhdID0gIiI7Ci0JCXU4ICpwUmV0UGFyOwotCQl1OCBsZW4gPSAwOwotCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkJUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJCU9HRl9FWFRFTlNJT04sCi0JCQlIQ0lfV0lGSV9DVVJSRU5UX0JBTkRXSURUSCwKLQkJCXN0YXR1cyk7Ci0KLQkJLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQkJcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQkJcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCQlwUmV0UGFyWzFdID0gQ3VycmVudEJXOwkJLyogY3VycmVudCBCVyAqLwotCQlsZW4gKz0gMjsKLQkJUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQkJYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kV0lGSUNvbm5lY3Rpb25TdGF0dXMoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXU4IGNvbm5lY3RTdGF0dXMgPSBIQ0lfV0lGSV9OT1RfQ09OTkVDVEVEOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpIHsKLQkJaWYgKHBhZGFwdGVyLT5zdGFwcml2LmFzb2Nfc3RhX2NvdW50ID49IDMpCi0JCQljb25uZWN0U3RhdHVzID0gSENJX1dJRklfQ09OTkVDVEVEOwotCQllbHNlCi0JCQljb25uZWN0U3RhdHVzID0gSENJX1dJRklfTk9UX0NPTk5FQ1RFRDsKLQl9IGVsc2UgaWYgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9BREhPQ19TVEFURXxXSUZJX0FESE9DX01BU1RFUl9TVEFURXxXSUZJX0FTT0NfU1RBVEUpKSB7Ci0JCWNvbm5lY3RTdGF0dXMgPSBIQ0lfV0lGSV9DT05ORUNURUQ7Ci0JfSBlbHNlIGlmIChjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIFdJRklfVU5ERVJfTElOS0lORykpIHsKLQkJY29ubmVjdFN0YXR1cyA9IEhDSV9XSUZJX0NPTk5FQ1RfSU5fUFJPR1JFU1M7Ci0JfSBlbHNlIHsKLQkJY29ubmVjdFN0YXR1cyA9IEhDSV9XSUZJX05PVF9DT05ORUNURUQ7Ci0JfQotCi0JewotCQl1OCBsb2NhbEJ1Zls4XSA9ICIiOwotCQl1OCAqcFJldFBhcjsKLQkJdTggbGVuID0gMDsKLQkJc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQkJbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCQlPR0ZfRVhURU5TSU9OLAotCQkJSENJX1dJRklfQ09OTkVDVElPTl9TVEFUVVMsCi0JCQlzdGF0dXMpOwotCi0JCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkJLyogc3RhdHVzICovCi0JCXBSZXRQYXJbMV0gPSBjb25uZWN0U3RhdHVzOwkvKiBjb25uZWN0IHN0YXR1cyAqLwotCQlsZW4gKz0gMjsKLQkJUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQkJYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kRW5hYmxlRGV2aWNlVW5kZXJUZXN0TW9kZSgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCi0JcEJ0SGNpSW5mby0+YkluVGVzdE1vZGUgPSB0cnVlOwotCXBCdEhjaUluZm8tPmJUZXN0SXNFbmQgPSBmYWxzZTsKLQotCS8qIHNlbmQgY29tbWFuZCBjb21wbGV0ZSBldmVudCBoZXJlIHdoZW4gYWxsIGRhdGEgYXJlIHJlY2VpdmVkLiAqLwotCXsKLQkJdTggbG9jYWxCdWZbNl0gPSAiIjsKLQkJdTggKnBSZXRQYXI7Ci0JCXU4IGxlbiA9IDA7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQkJT0dGX1RFU1RJTkdfQ09NTUFORFMsCi0JCQlIQ0lfRU5BQkxFX0RFVklDRV9VTkRFUl9URVNUX01PREUsCi0JCQlzdGF0dXMpOwotCi0JCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkvKiBzdGF0dXMgKi8KLQkJbGVuICs9IDE7Ci0JCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZEFNUFRlc3RFbmQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICAgIHN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCi0JaWYgKCFwQnRIY2lJbmZvLT5iSW5UZXN0TW9kZSkgewotCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0VWRU5UfElPQ1RMX0JUX0xPR08pLCAoIk5vdCBpbiBUZXN0IG1vZGUsIHJldHVybiBzdGF0dXMgPSBIQ0lfU1RBVFVTX0NNRF9ESVNBTExPV1xuIikpOwotCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX0NNRF9ESVNBTExPVzsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwQnRIY2lJbmZvLT5iVGVzdElzRW5kID0gdHJ1ZTsKLQotCWRlbF90aW1lcl9zeW5jKCZwQlRJbmZvLT5CVFRlc3RTZW5kUGFja2V0VGltZXIpOwotCi0JcnRsODcyM2FfY2hlY2tfYnNzaWQocGFkYXB0ZXIsIHRydWUpOwotCi0JLyogc2VuZCBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IGhlcmUgd2hlbiBhbGwgZGF0YSBhcmUgcmVjZWl2ZWQuICovCi0JewotCQl1OCBsb2NhbEJ1Zls0XSA9ICIiOwotCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVHxJT0NUTF9CVF9MT0dPKSwgKCJBTVAgVGVzdCBFbmQgRXZlbnQgXG4iKSk7Ci0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0JCVBQYWNrZXRJcnBFdmVudC0+RXZlbnRDb2RlID0gSENJX0VWRU5UX0FNUF9URVNUX0VORDsKLQkJUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSAyOwotCi0JCVBQYWNrZXRJcnBFdmVudC0+RGF0YVswXSA9IHN0YXR1czsKLQkJUFBhY2tldElycEV2ZW50LT5EYXRhWzFdID0gcEJ0SGNpSW5mby0+VGVzdFNjZW5hcmlvOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgNCk7Ci0JfQotCi0JYnRoY2lfRXZlbnRBTVBSZWNlaXZlclJlcG9ydChwYWRhcHRlciwgMHgwMSk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRBTVBUZXN0Q29tbWFuZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0KLQlpZiAoIXBCdEhjaUluZm8tPmJJblRlc3RNb2RlKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfRVZFTlR8SU9DVExfQlRfTE9HTyksICgiTm90IGluIFRlc3QgbW9kZSwgcmV0dXJuIHN0YXR1cyA9IEhDSV9TVEFUVVNfQ01EX0RJU0FMTE9XXG4iKSk7Ci0JCXN0YXR1cyA9IEhDSV9TVEFUVVNfQ01EX0RJU0FMTE9XOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXBCdEhjaUluZm8tPlRlc3RTY2VuYXJpbyA9ICooKHU4ICopcEhjaUNtZC0+RGF0YSk7Ci0KLQlpZiAocEJ0SGNpSW5mby0+VGVzdFNjZW5hcmlvID09IDB4MDEpCi0JCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfRVZFTlR8SU9DVExfQlRfTE9HTyksICgiVFggU2luZ2xlIFRlc3QgXG4iKSk7Ci0JZWxzZSBpZiAocEJ0SGNpSW5mby0+VGVzdFNjZW5hcmlvID09IDB4MDIpCi0JCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfRVZFTlR8SU9DVExfQlRfTE9HTyksICgiUmVjZWl2ZSBGcmFtZSBUZXN0IFxuIikpOwotCWVsc2UKLQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVHxJT0NUTF9CVF9MT0dPKSwgKCJObyBTdWNoIFRlc3QgISEhISEhISEhISEhISEhISEhIFxuIikpOwotCi0JaWYgKHBCdEhjaUluZm8tPmJUZXN0SXNFbmQpIHsKLQkJdTggbG9jYWxCdWZbNV0gPSAiIjsKLQkJc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfRVZFTlR8SU9DVExfQlRfTE9HTyksICgiQU1QIFRlc3QgRW5kIEV2ZW50IFxuIikpOwotCQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCQlQUGFja2V0SXJwRXZlbnQtPkV2ZW50Q29kZSA9IEhDSV9FVkVOVF9BTVBfVEVTVF9FTkQ7Ci0JCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gMjsKLQotCQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMF0gPSBzdGF0dXM7Ci0JCVBQYWNrZXRJcnBFdmVudC0+RGF0YVsxXSA9IHBCdEhjaUluZm8tPlRlc3RTY2VuYXJpbyA7Ci0KLQkJYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCA0KTsKLQotCQkvKiBSZXR1cm4gdG8gSWRlbCBzdGF0ZSB3aXRoIFJYIGFuZCBUWCBvZmYuICovCi0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQkvKiAgc2hvdWxkIHNlbmQgY29tbWFuZCBzdGF0dXMgZXZlbnQgKi8KLQlidGhjaV9FdmVudENvbW1hbmRTdGF0dXMocGFkYXB0ZXIsCi0JCQlPR0ZfVEVTVElOR19DT01NQU5EUywKLQkJCUhDSV9BTVBfVEVTVF9DT01NQU5ELAotCQkJc3RhdHVzKTsKLQotCS8qIFRoZSBIQ0lfQU1QX1N0YXJ0IFRlc3QgRXZlbnQgc2hhbGwgYmUgZ2VuZXJhdGVkIHdoZW4gdGhlICovCi0JLyogSENJX0FNUF9UZXN0X0NvbW1hbmQgaGFzIGNvbXBsZXRlZCBhbmQgdGhlIGZpcnN0IGRhdGEgaXMgcmVhZHkgdG8gYmUgc2VudCAqLwotCS8qIG9yIHJlY2VpdmVkLiAqLwotCi0JewotCQl1OCBsb2NhbEJ1Zls1XSA9ICIiOwotCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVHxJT0NUTF9CVF9MT0dPKSwgKCIgSENJX0FNUF9TdGFydCBUZXN0IEV2ZW50IFxuIikpOwotCQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCQlQUGFja2V0SXJwRXZlbnQtPkV2ZW50Q29kZSA9IEhDSV9FVkVOVF9BTVBfU1RBUlRfVEVTVDsKLQkJUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSAyOwotCi0JCVBQYWNrZXRJcnBFdmVudC0+RGF0YVswXSA9IHN0YXR1czsKLQkJUFBhY2tldElycEV2ZW50LT5EYXRhWzFdID0gcEJ0SGNpSW5mby0+VGVzdFNjZW5hcmlvIDsKLQotCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIDQpOwotCi0JCS8qIFJldHVybiB0byBJZGVsIHN0YXRlIHdpdGggUlggYW5kIFRYIG9mZi4gKi8KLQl9Ci0KLQlpZiAocEJ0SGNpSW5mby0+VGVzdFNjZW5hcmlvID09IDB4MDEpIHsKLQkJLyoKLQkJCVdoZW4gaW4gYSB0cmFuc21pdHRlciB0ZXN0IHNjZW5hcmlvIGFuZCB0aGUgZnJhbWVzL2J1cnN0cyBjb3VudCBoYXZlIGJlZW4KLQkJCXRyYW5zbWl0dGVkIHRoZSBIQ0lfQU1QX1Rlc3RfRW5kIGV2ZW50IHNoYWxsIGJlIHNlbnQuCi0JCSovCi0JCW1vZF90aW1lcigmcEJUSW5mby0+QlRUZXN0U2VuZFBhY2tldFRpbWVyLAotCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1MCkpOwotCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0VWRU5UfElPQ1RMX0JUX0xPR08pLCAoIlRYIFNpbmdsZSBUZXN0IFxuIikpOwotCX0gZWxzZSBpZiAocEJ0SGNpSW5mby0+VGVzdFNjZW5hcmlvID09IDB4MDIpIHsKLQkJcnRsODcyM2FfY2hlY2tfYnNzaWQocGFkYXB0ZXIsIGZhbHNlKTsKLQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVHxJT0NUTF9CVF9MT0dPKSwgKCJSZWNlaXZlIEZyYW1lIFRlc3QgXG4iKSk7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kRW5hYmxlQU1QUmVjZWl2ZXJSZXBvcnRzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICBzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZCkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQotCWlmICghcEJ0SGNpSW5mby0+YkluVGVzdE1vZGUpIHsKLQkJc3RhdHVzID0gSENJX1NUQVRVU19DTURfRElTQUxMT1c7Ci0JCS8qIHNlbmQgY29tbWFuZCBjb21wbGV0ZSBldmVudCBoZXJlIHdoZW4gYWxsIGRhdGEgYXJlIHJlY2VpdmVkLiAqLwotCQl7Ci0JCQl1OCBsb2NhbEJ1Zls2XSA9ICIiOwotCQkJdTggKnBSZXRQYXI7Ci0JCQl1OCBsZW4gPSAwOwotCQkJc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JCQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JCQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJCQlPR0ZfVEVTVElOR19DT01NQU5EUywKLQkJCQlIQ0lfRU5BQkxFX0FNUF9SRUNFSVZFUl9SRVBPUlRTLAotCQkJCXN0YXR1cyk7Ci0KLQkJCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JCQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCQkJcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCQkJbGVuICs9IDE7Ci0JCQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCQkJYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwQnRIY2lJbmZvLT5iVGVzdE5lZWRSZXBvcnQgPSAqKCh1OCAqKXBIY2lDbWQtPkRhdGEpOwotCXBCdEhjaUluZm8tPlRlc3RSZXBvcnRJbnRlcnZhbCA9ICgqKCh1OCAqKXBIY2lDbWQtPkRhdGErMikpOwotCi0JYnRoY2lfRXZlbnRBTVBSZWNlaXZlclJlcG9ydChwYWRhcHRlciwgMHgwMCk7Ci0KLQkvKiBzZW5kIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgaGVyZSB3aGVuIGFsbCBkYXRhIGFyZSByZWNlaXZlZC4gKi8KLQl7Ci0JCXU4IGxvY2FsQnVmWzZdID0gIiI7Ci0JCXU4ICpwUmV0UGFyOwotCQl1OCBsZW4gPSAwOwotCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkJUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJCU9HRl9URVNUSU5HX0NPTU1BTkRTLAotCQkJSENJX0VOQUJMRV9BTVBfUkVDRUlWRVJfUkVQT1JUUywKLQkJCXN0YXR1cyk7Ci0KLQkJLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQkJcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQkJcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCQlsZW4gKz0gMTsKLQkJUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQkJYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kSG9zdEJ1ZmZlclNpemUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXU4IGxvY2FsQnVmWzZdID0gIiI7Ci0JdTggKnBSZXRQYXI7Ci0JdTggbGVuID0gMDsKLQotCXBCVEluZm8tPkJ0QXNvY0VudHJ5W3BCdE1nbnQtPkN1cnJlbnRDb25uZWN0RW50cnlOdW1dLkFDTFBhY2tldHNEYXRhLkFDTERhdGFQYWNrZXRMZW4gPSAqKCh1MTYgKilwSGNpQ21kLT5EYXRhKTsKLQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtwQnRNZ250LT5DdXJyZW50Q29ubmVjdEVudHJ5TnVtXS5TeW5jRGF0YVBhY2tldExlbiA9ICooKHU4ICopKHBIY2lDbWQtPkRhdGErMikpOwotCXBCVEluZm8tPkJ0QXNvY0VudHJ5W3BCdE1nbnQtPkN1cnJlbnRDb25uZWN0RW50cnlOdW1dLlRvdGFsTnVtQUNMRGF0YVBhY2tldHMgPSAqKCh1MTYgKikocEhjaUNtZC0+RGF0YSszKSk7Ci0JcEJUSW5mby0+QnRBc29jRW50cnlbcEJ0TWdudC0+Q3VycmVudENvbm5lY3RFbnRyeU51bV0uVG90YWxTeW5jTnVtRGF0YVBhY2tldHMgPSAqKCh1MTYgKikocEhjaUNtZC0+RGF0YSs1KSk7Ci0KLQkvKiBzZW5kIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgaGVyZSB3aGVuIGFsbCBkYXRhIGFyZSByZWNlaXZlZC4gKi8KLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCU9HRl9TRVRfRVZFTlRfTUFTS19DT01NQU5ELAotCQlIQ0lfSE9TVF9CVUZGRVJfU0laRSwKLQkJc3RhdHVzKTsKLQotCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JbGVuICs9IDE7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX1Vua25vd25DTUQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfVU5LTk9XX0hDSV9DTUQ7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmcgPSAmcEJUSW5mby0+QnREYmc7Ci0KLQlwQnREYmctPmRiZ0hjaUluZm8uaGNpQ21kQ250VW5rbm93bisrOwotCWJ0aGNpX0V2ZW50Q29tbWFuZFN0YXR1cyhwYWRhcHRlciwKLQkJCSh1OClwSGNpQ21kLT5PR0YsCi0JCQlwSGNpQ21kLT5PQ0YsCi0JCQlzdGF0dXMpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfSGFuZGxlT0dGSW5mb3JtYXRpb25hbFBhcmFtZXRlcnMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgICAgc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQotCXN3aXRjaCAocEhjaUNtZC0+T0NGKSB7Ci0JY2FzZSBIQ0lfUkVBRF9MT0NBTF9WRVJTSU9OX0lORk9STUFUSU9OOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9SRUFEX0xPQ0FMX1ZFUlNJT05fSU5GT1JNQVRJT05cbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kUmVhZExvY2FsVmVyc2lvbkluZm9ybWF0aW9uKHBhZGFwdGVyKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfUkVBRF9MT0NBTF9TVVBQT1JURURfQ09NTUFORFM6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1JFQURfTE9DQUxfU1VQUE9SVEVEX0NPTU1BTkRTXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFJlYWRMb2NhbFN1cHBvcnRlZENvbW1hbmRzKHBhZGFwdGVyKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfUkVBRF9MT0NBTF9TVVBQT1JURURfRkVBVFVSRVM6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1JFQURfTE9DQUxfU1VQUE9SVEVEX0ZFQVRVUkVTXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFJlYWRMb2NhbFN1cHBvcnRlZEZlYXR1cmVzKHBhZGFwdGVyKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfUkVBRF9CVUZGRVJfU0laRToKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfUkVBRF9CVUZGRVJfU0laRVxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRSZWFkQnVmZmVyU2l6ZShwYWRhcHRlcik7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1JFQURfREFUQV9CTE9DS19TSVpFOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9SRUFEX0RBVEFfQkxPQ0tfU0laRVxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRSZWFkRGF0YUJsb2NrU2l6ZShwYWRhcHRlcik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiYnRoY2lfSGFuZGxlT0dGSW5mb3JtYXRpb25hbFBhcmFtZXRlcnMoKSwgVW5rbm93biBjYXNlID0gMHgleFxuIiwgcEhjaUNtZC0+T0NGKSk7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1VOS05PV05fQ09NTUFORFxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9Vbmtub3duQ01EKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0hhbmRsZU9HRlNldEV2ZW50TWFza0NNRChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICAgIHN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0KLQlzd2l0Y2ggKHBIY2lDbWQtPk9DRikgewotCWNhc2UgSENJX1NFVF9FVkVOVF9NQVNLOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9TRVRfRVZFTlRfTUFTS1xuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRTZXRFdmVudE1hc2socGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9SRVNFVDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfUkVTRVRcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kUmVzZXQocGFkYXB0ZXIsIHRydWUpOwotCQlicmVhazsKLQljYXNlIEhDSV9SRUFEX0NPTk5FQ1RJT05fQUNDRVBUX1RJTUVPVVQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1JFQURfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVFxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRSZWFkQ29ubmVjdGlvbkFjY2VwdFRpbWVvdXQocGFkYXB0ZXIpOwotCQlicmVhazsKLQljYXNlIEhDSV9TRVRfRVZFTlRfRklMVEVSOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9TRVRfRVZFTlRfRklMVEVSXG4iKSk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1dSSVRFX0NPTk5FQ1RJT05fQUNDRVBUX1RJTUVPVVQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1dSSVRFX0NPTk5FQ1RJT05fQUNDRVBUX1RJTUVPVVRcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kV3JpdGVDb25uZWN0aW9uQWNjZXB0VGltZW91dChwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1JFQURfUEFHRV9USU1FT1VUOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9SRUFEX1BBR0VfVElNRU9VVFxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRSZWFkUGFnZVRpbWVvdXQocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9XUklURV9QQUdFX1RJTUVPVVQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1dSSVRFX1BBR0VfVElNRU9VVFxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRXcml0ZVBhZ2VUaW1lb3V0KHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfSE9TVF9OVU1CRVJfT0ZfQ09NUExFVEVEX1BBQ0tFVFM6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX0hPU1RfTlVNQkVSX09GX0NPTVBMRVRFRF9QQUNLRVRTXG4iKSk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1JFQURfTElOS19TVVBFUlZJU0lPTl9USU1FT1VUOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9SRUFEX0xJTktfU1VQRVJWSVNJT05fVElNRU9VVFxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRSZWFkTGlua1N1cGVydmlzaW9uVGltZW91dChwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1dSSVRFX0xJTktfU1VQRVJWSVNJT05fVElNRU9VVDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfV1JJVEVfTElOS19TVVBFUlZJU0lPTl9USU1FT1VUXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFdyaXRlTGlua1N1cGVydmlzaW9uVGltZW91dChwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX0VOSEFOQ0VEX0ZMVVNIOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9FTkhBTkNFRF9GTFVTSFxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRFbmhhbmNlZEZsdXNoKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfUkVBRF9MT0dJQ0FMX0xJTktfQUNDRVBUX1RJTUVPVVQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1JFQURfTE9HSUNBTF9MSU5LX0FDQ0VQVF9USU1FT1VUXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFJlYWRMb2dpY2FsTGlua0FjY2VwdFRpbWVvdXQocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9XUklURV9MT0dJQ0FMX0xJTktfQUNDRVBUX1RJTUVPVVQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1dSSVRFX0xPR0lDQUxfTElOS19BQ0NFUFRfVElNRU9VVFxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRXcml0ZUxvZ2ljYWxMaW5rQWNjZXB0VGltZW91dChwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1NFVF9FVkVOVF9NQVNLX1BBR0VfMjoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfU0VUX0VWRU5UX01BU0tfUEFHRV8yXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFNldEV2ZW50TWFza1BhZ2UyKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfUkVBRF9MT0NBVElPTl9EQVRBOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9SRUFEX0xPQ0FUSU9OX0RBVEFcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kUmVhZExvY2F0aW9uRGF0YShwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1dSSVRFX0xPQ0FUSU9OX0RBVEE6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1dSSVRFX0xPQ0FUSU9OX0RBVEFcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kV3JpdGVMb2NhdGlvbkRhdGEocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9SRUFEX0ZMT1dfQ09OVFJPTF9NT0RFOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9SRUFEX0ZMT1dfQ09OVFJPTF9NT0RFXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFJlYWRGbG93Q29udHJvbE1vZGUocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9XUklURV9GTE9XX0NPTlRST0xfTU9ERToKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfV1JJVEVfRkxPV19DT05UUk9MX01PREVcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kV3JpdGVGbG93Q29udHJvbE1vZGUocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9SRUFEX0JFU1RfRUZGT1JUX0ZMVVNIX1RJTUVPVVQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1JFQURfQkVTVF9FRkZPUlRfRkxVU0hfVElNRU9VVFxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRSZWFkQmVzdEVmZm9ydEZsdXNoVGltZW91dChwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1dSSVRFX0JFU1RfRUZGT1JUX0ZMVVNIX1RJTUVPVVQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1dSSVRFX0JFU1RfRUZGT1JUX0ZMVVNIX1RJTUVPVVRcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kV3JpdGVCZXN0RWZmb3J0Rmx1c2hUaW1lb3V0KHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfU0hPUlRfUkFOR0VfTU9ERToKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfU0hPUlRfUkFOR0VfTU9ERVxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRTaG9ydFJhbmdlTW9kZShwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX0hPU1RfQlVGRkVSX1NJWkU6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX0hPU1RfQlVGRkVSX1NJWkVcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kSG9zdEJ1ZmZlclNpemUocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoImJ0aGNpX0hhbmRsZU9HRlNldEV2ZW50TWFza0NNRCgpLCBVbmtub3duIGNhc2UgPSAweCV4XG4iLCBwSGNpQ21kLT5PQ0YpKTsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfVU5LTk9XTl9DT01NQU5EXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX1Vua25vd25DTUQocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfSGFuZGxlT0dGU3RhdHVzUGFyYW1ldGVycyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0KLQlzd2l0Y2ggKHBIY2lDbWQtPk9DRikgewotCWNhc2UgSENJX1JFQURfRkFJTEVEX0NPTlRBQ1RfQ09VTlRFUjoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfUkVBRF9GQUlMRURfQ09OVEFDVF9DT1VOVEVSXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFJlYWRGYWlsZWRDb250YWN0Q291bnRlcihwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1JFU0VUX0ZBSUxFRF9DT05UQUNUX0NPVU5URVI6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1JFU0VUX0ZBSUxFRF9DT05UQUNUX0NPVU5URVJcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kUmVzZXRGYWlsZWRDb250YWN0Q291bnRlcihwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1JFQURfTElOS19RVUFMSVRZOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9SRUFEX0xJTktfUVVBTElUWVxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRSZWFkTGlua1F1YWxpdHkocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9SRUFEX1JTU0k6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1JFQURfUlNTSVxuIikpOwotCQlicmVhazsKLQljYXNlIEhDSV9SRUFEX0xPQ0FMX0FNUF9JTkZPOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9SRUFEX0xPQ0FMX0FNUF9JTkZPXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFJlYWRMb2NhbEFNUEluZm8ocGFkYXB0ZXIpOwotCQlicmVhazsKLQljYXNlIEhDSV9SRUFEX0xPQ0FMX0FNUF9BU1NPQzoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfUkVBRF9MT0NBTF9BTVBfQVNTT0NcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kUmVhZExvY2FsQU1QQXNzb2MocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9XUklURV9SRU1PVEVfQU1QX0FTU09DOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9XUklURV9SRU1PVEVfQU1QX0FTU09DXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFdyaXRlUmVtb3RlQU1QQXNzb2MocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoImJ0aGNpX0hhbmRsZU9HRlN0YXR1c1BhcmFtZXRlcnMoKSwgVW5rbm93biBjYXNlID0gMHgleFxuIiwgcEhjaUNtZC0+T0NGKSk7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1VOS05PV05fQ09NTUFORFxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9Vbmtub3duQ01EKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0hhbmRsZU9HRkxpbmtDb250cm9sQ01EKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICBzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZCkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCi0Jc3dpdGNoIChwSGNpQ21kLT5PQ0YpIHsKLQljYXNlIEhDSV9DUkVBVEVfUEhZU0lDQUxfTElOSzoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfQ1JFQVRFX1BIWVNJQ0FMX0xJTktcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kQ3JlYXRlUGh5c2ljYWxMaW5rKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfQUNDRVBUX1BIWVNJQ0FMX0xJTks6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX0FDQ0VQVF9QSFlTSUNBTF9MSU5LXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZEFjY2VwdFBoeXNpY2FsTGluayhwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX0RJU0NPTk5FQ1RfUEhZU0lDQUxfTElOSzoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfRElTQ09OTkVDVF9QSFlTSUNBTF9MSU5LXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZERpc2Nvbm5lY3RQaHlzaWNhbExpbmsocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9DUkVBVEVfTE9HSUNBTF9MSU5LOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9DUkVBVEVfTE9HSUNBTF9MSU5LXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZENyZWF0ZUxvZ2ljYWxMaW5rKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfQUNDRVBUX0xPR0lDQUxfTElOSzoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfQUNDRVBUX0xPR0lDQUxfTElOS1xuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRBY2NlcHRMb2dpY2FsTGluayhwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX0RJU0NPTk5FQ1RfTE9HSUNBTF9MSU5LOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9ESVNDT05ORUNUX0xPR0lDQUxfTElOS1xuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWREaXNjb25uZWN0TG9naWNhbExpbmsocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9MT0dJQ0FMX0xJTktfQ0FOQ0VMOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9MT0dJQ0FMX0xJTktfQ0FOQ0VMXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZExvZ2ljYWxMaW5rQ2FuY2VsKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfRkxPV19TUEVDX01PRElGWToKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfRkxPV19TUEVDX01PRElGWVxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRGbG93U3BlY01vZGlmeShwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiYnRoY2lfSGFuZGxlT0dGTGlua0NvbnRyb2xDTUQoKSwgVW5rbm93biBjYXNlID0gMHgleFxuIiwgcEhjaUNtZC0+T0NGKSk7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1VOS05PV05fQ09NTUFORFxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9Vbmtub3duQ01EKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0hhbmRsZU9HRlRlc3RpbmdDTUQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzd2l0Y2ggKHBIY2lDbWQtPk9DRikgewotCWNhc2UgSENJX0VOQUJMRV9ERVZJQ0VfVU5ERVJfVEVTVF9NT0RFOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9FTkFCTEVfREVWSUNFX1VOREVSX1RFU1RfTU9ERVxuIikpOwotCQlidGhjaV9DbWRFbmFibGVEZXZpY2VVbmRlclRlc3RNb2RlKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfQU1QX1RFU1RfRU5EOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9BTVBfVEVTVF9FTkRcbiIpKTsKLQkJYnRoY2lfQ21kQU1QVGVzdEVuZChwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX0FNUF9URVNUX0NPTU1BTkQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX0FNUF9URVNUX0NPTU1BTkRcbiIpKTsKLQkJYnRoY2lfQ21kQU1QVGVzdENvbW1hbmQocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9FTkFCTEVfQU1QX1JFQ0VJVkVSX1JFUE9SVFM6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX0VOQUJMRV9BTVBfUkVDRUlWRVJfUkVQT1JUU1xuIikpOwotCQlidGhjaV9DbWRFbmFibGVBTVBSZWNlaXZlclJlcG9ydHMocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9VTktOT1dOX0NPTU1BTkRcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfVW5rbm93bkNNRChwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9IYW5kbGVPR0ZFeHRlbnNpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSBzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZCkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN3aXRjaCAocEhjaUNtZC0+T0NGKSB7Ci0JY2FzZSBIQ0lfU0VUX0FDTF9MSU5LX0RBVEFfRkxPV19NT0RFOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJIQ0lfU0VUX0FDTF9MSU5LX0RBVEFfRkxPV19NT0RFXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFNldEFDTExpbmtEYXRhRmxvd01vZGUocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9TRVRfQUNMX0xJTktfU1RBVFVTOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJIQ0lfU0VUX0FDTF9MSU5LX1NUQVRVU1xuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRTZXRBQ0xMaW5rU3RhdHVzKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfU0VUX1NDT19MSU5LX1NUQVRVUzoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiSENJX1NFVF9TQ09fTElOS19TVEFUVVNcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kU2V0U0NPTGlua1N0YXR1cyhwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1NFVF9SU1NJX1ZBTFVFOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfRVZFTlRfUEVSSU9ESUNBTCwgKCJIQ0lfU0VUX1JTU0lfVkFMVUVcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kU2V0UlNTSVZhbHVlKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfU0VUX0NVUlJFTlRfQkxVRVRPT1RIX1NUQVRVUzoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiSENJX1NFVF9DVVJSRU5UX0JMVUVUT09USF9TVEFUVVNcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kU2V0Q3VycmVudEJsdWV0b290aFN0YXR1cyhwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCS8qIFRoZSBmb2xsb3dpbmcgaXMgZm9yIFJUSzg3MjMgKi8KLQotCWNhc2UgSENJX0VYVEVOU0lPTl9WRVJTSU9OX05PVElGWToKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiSENJX0VYVEVOU0lPTl9WRVJTSU9OX05PVElGWVxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRFeHRlbnNpb25WZXJzaW9uTm90aWZ5KHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfTElOS19TVEFUVVNfTk9USUZZOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJIQ0lfTElOS19TVEFUVVNfTk9USUZZXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZExpbmtTdGF0dXNOb3RpZnkocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9CVF9PUEVSQVRJT05fTk9USUZZOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJIQ0lfQlRfT1BFUkFUSU9OX05PVElGWVxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRCdE9wZXJhdGlvbk5vdGlmeShwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX0VOQUJMRV9XSUZJX1NDQU5fTk9USUZZOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJIQ0lfRU5BQkxFX1dJRklfU0NBTl9OT1RJRllcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kRW5hYmxlV2lmaVNjYW5Ob3RpZnkocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQotCS8qIFRoZSBmb2xsb3dpbmcgaXMgZm9yIElWVCAqLwotCWNhc2UgSENJX1dJRklfQ1VSUkVOVF9DSEFOTkVMOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJIQ0lfV0lGSV9DVVJSRU5UX0NIQU5ORUxcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kV0lGSUN1cnJlbnRDaGFubmVsKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfV0lGSV9DVVJSRU5UX0JBTkRXSURUSDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiSENJX1dJRklfQ1VSUkVOVF9CQU5EV0lEVEhcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kV0lGSUN1cnJlbnRCYW5kd2lkdGgocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9XSUZJX0NPTk5FQ1RJT05fU1RBVFVTOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJIQ0lfV0lGSV9DT05ORUNUSU9OX1NUQVRVU1xuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRXSUZJQ29ubmVjdGlvblN0YXR1cyhwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiSENJX1VOS05PV05fQ09NTUFORFxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9Vbmtub3duQ01EKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9TdGF0ZVN0YXJ0aW5nKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCSAgICBlbnVtIGhjaV9zdGF0ZV93aXRoX2NtZCBTdGF0ZUNtZCwgdTggRW50cnlOdW0pCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiW0JUIHN0YXRlXSwgW1N0YXJ0aW5nXSwgIikpOwotCXN3aXRjaCAoU3RhdGVDbWQpIHsKLQljYXNlIFNUQVRFX0NNRF9DT05ORUNUX0FDQ0VQVF9USU1FT1VUOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU1RBVEVfQ01EX0NPTk5FQ1RfQUNDRVBUX1RJTUVPVVRcbiIpKTsKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeXNMaW5rQ29tcGxldGVTdGF0dXMgPSBIQ0lfU1RBVFVTX0NPTk5FQ1RfQUNDRVBUX1RJTUVPVVQ7Ci0JCXBCdE1nbnQtPmJOZWVkTm90aWZ5QU1QTm9DYXAgPSB0cnVlOwotCQlCVEhDSV9EaXNjb25uZWN0UGVlcihwYWRhcHRlciwgRW50cnlOdW0pOwotCQlicmVhazsKLQljYXNlIFNUQVRFX0NNRF9ESVNDT05ORUNUX1BIWV9MSU5LOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU1RBVEVfQ01EX0RJU0NPTk5FQ1RfUEhZX0xJTktcbiIpKTsKLQotCQlidGhjaV9FdmVudERpc2Nvbm5lY3RQaHlMaW5rQ29tcGxldGUocGFkYXB0ZXIsCi0JCUhDSV9TVEFUVVNfU1VDQ0VTUywKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtEaXNjb25uZWN0UmVhc29uLAotCQlFbnRyeU51bSk7Ci0KLQkJZGVsX3RpbWVyX3N5bmMoJnBCVEluZm8tPkJUSENJSm9pblRpbWVvdXRUaW1lcik7Ci0KLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeXNMaW5rQ29tcGxldGVTdGF0dXMgPSBIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lEOwotCi0JCUJUSENJX0Rpc2Nvbm5lY3RQZWVyKHBhZGFwdGVyLCBFbnRyeU51bSk7Ci0JCWJyZWFrOwotCWNhc2UgU1RBVEVfQ01EX01BQ19TVEFSVF9DT01QTEVURToKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIlNUQVRFX0NNRF9NQUNfU1RBUlRfQ09NUExFVEVcbiIpKTsKLQkJaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BTVBSb2xlID09IEFNUF9CVEFQX0NSRUFUT1IpCi0JCQlidGhjaV9FdmVudENoYW5uZWxTZWxlY3RlZChwYWRhcHRlciwgRW50cnlOdW0pOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU3RhdGUgY29tbWFuZCglZCkgaXMgV3JvbmcgISEhXG4iLCBTdGF0ZUNtZCkpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9TdGF0ZUNvbm5lY3Rpbmcoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICAgICAgZW51bSBoY2lfc3RhdGVfd2l0aF9jbWQgU3RhdGVDbWQsIHU4IEVudHJ5TnVtKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIltCVCBzdGF0ZV0sIFtDb25uZWN0aW5nXSwgIikpOwotCXN3aXRjaCAoU3RhdGVDbWQpIHsKLQljYXNlIFNUQVRFX0NNRF9DT05ORUNUX0FDQ0VQVF9USU1FT1VUOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU1RBVEVfQ01EX0NPTk5FQ1RfQUNDRVBUX1RJTUVPVVRcbiIpKTsKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeXNMaW5rQ29tcGxldGVTdGF0dXMgPSBIQ0lfU1RBVFVTX0NPTk5FQ1RfQUNDRVBUX1RJTUVPVVQ7Ci0JCXBCdE1nbnQtPmJOZWVkTm90aWZ5QU1QTm9DYXAgPSB0cnVlOwotCQlCVEhDSV9EaXNjb25uZWN0UGVlcihwYWRhcHRlciwgRW50cnlOdW0pOwotCQlicmVhazsKLQljYXNlIFNUQVRFX0NNRF9NQUNfQ09OTkVDVF9DT01QTEVURToKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIlNUQVRFX0NNRF9NQUNfQ09OTkVDVF9DT01QTEVURVxuIikpOwotCi0JCWlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQU1QUm9sZSA9PSBBTVBfQlRBUF9KT0lORVIpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9pbmZvXywKLQkJCQkgIlN0YXRlQ29ubmVjdGluZ1xuIik7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTVEFURV9DTURfRElTQ09OTkVDVF9QSFlfTElOSzoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIlNUQVRFX0NNRF9ESVNDT05ORUNUX1BIWV9MSU5LXG4iKSk7Ci0KLQkJYnRoY2lfRXZlbnREaXNjb25uZWN0UGh5TGlua0NvbXBsZXRlKHBhZGFwdGVyLAotCQlIQ0lfU1RBVFVTX1NVQ0NFU1MsCi0JCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rRGlzY29ubmVjdFJlYXNvbiwKLQkJRW50cnlOdW0pOwotCi0JCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlzTGlua0NvbXBsZXRlU3RhdHVzID0gSENJX1NUQVRVU19VTktOT1dfQ09OTkVDVF9JRDsKLQotCQlkZWxfdGltZXJfc3luYygmcEJUSW5mby0+QlRIQ0lKb2luVGltZW91dFRpbWVyKTsKLQotCQlCVEhDSV9EaXNjb25uZWN0UGVlcihwYWRhcHRlciwgRW50cnlOdW0pOwotCi0JCWJyZWFrOwotCWNhc2UgU1RBVEVfQ01EX01BQ19DT05ORUNUX0NBTkNFTF9JTkRJQ0FURToKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIlNUQVRFX0NNRF9NQUNfQ09OTkVDVF9DQU5DRUxfSU5ESUNBVEVcbiIpKTsKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeXNMaW5rQ29tcGxldGVTdGF0dXMgPSBIQ0lfU1RBVFVTX0NPTlRST0xMRVJfQlVTWTsKLQkJLyogIEJlY2F1c2UgdGhpcyBzdGF0ZSBjbWQgaXMgY2F1c2VkIGJ5IHRoZSBCVEhDSV9FdmVudEFNUFN0YXR1c0NoYW5nZSgpLCAqLwotCQkvKiAgd2UgZG9uJ3QgbmVlZCB0byBzZW5kIGV2ZW50IGluIHRoZSBmb2xsb3dpbmcgQlRIQ0lfRGlzY29ubmVjdFBlZXIoKSBhZ2Fpbi4gKi8KLQkJcEJ0TWdudC0+Yk5lZWROb3RpZnlBTVBOb0NhcCA9IGZhbHNlOwotCQlCVEhDSV9EaXNjb25uZWN0UGVlcihwYWRhcHRlciwgRW50cnlOdW0pOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU3RhdGUgY29tbWFuZCglZCkgaXMgV3JvbmcgISEhXG4iLCBTdGF0ZUNtZCkpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9TdGF0ZUNvbm5lY3RlZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgIGVudW0gaGNpX3N0YXRlX3dpdGhfY21kIFN0YXRlQ21kLCB1OCBFbnRyeU51bSkKLXsKLS8qUE1HTlRfSU5GTyBwTWdudEluZm8gPSAmcGFkYXB0ZXItPk1nbnRJbmZvOyAqLwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXU4IGk7Ci0JdTE2IGxvZ2ljSGFuZGxlID0gMDsKLQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJbQlQgc3RhdGVdLCBbQ29ubmVjdGVkXSwgIikpOwotCXN3aXRjaCAoU3RhdGVDbWQpIHsKLQljYXNlIFNUQVRFX0NNRF9ESVNDT05ORUNUX1BIWV9MSU5LOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU1RBVEVfQ01EX0RJU0NPTk5FQ1RfUEhZX0xJTktcbiIpKTsKLQotCQkvKiBXaGVuIHdlIGFyZSB0cnlpbmcgdG8gZGlzY29ubmVjdCB0aGUgcGh5IGxpbmssIHdlIHNob3VsZCBkaXNjb25uZWN0IGxvZyBsaW5rIGZpcnN0LCAqLwotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0xPR0lDQUxfTElOS19OVU07IGkrKykgewotCQkJaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YS0+QnRMb2dMaW5raGFuZGxlICE9IDApIHsKLQkJCQlsb2dpY0hhbmRsZSA9IHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YS0+QnRMb2dMaW5raGFuZGxlOwotCi0JCQkJYnRoY2lfRXZlbnREaXNjb25uZWN0TG9naWNhbExpbmtDb21wbGV0ZShwYWRhcHRlciwgSENJX1NUQVRVU19TVUNDRVNTLAotCQkJCQlsb2dpY0hhbmRsZSwgcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtEaXNjb25uZWN0UmVhc29uKTsKLQotCQkJCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YS0+QnRMb2dMaW5raGFuZGxlID0gMDsKLQkJCX0KLQkJfQotCi0JCWJ0aGNpX0V2ZW50RGlzY29ubmVjdFBoeUxpbmtDb21wbGV0ZShwYWRhcHRlciwKLQkJSENJX1NUQVRVU19TVUNDRVNTLAotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0Rpc2Nvbm5lY3RSZWFzb24sCi0JCUVudHJ5TnVtKTsKLQotCQlkZWxfdGltZXJfc3luYygmcEJUSW5mby0+QlRIQ0lKb2luVGltZW91dFRpbWVyKTsKLQotCQlCVEhDSV9EaXNjb25uZWN0UGVlcihwYWRhcHRlciwgRW50cnlOdW0pOwotCQlicmVhazsKLQotCWNhc2UgU1RBVEVfQ01EX01BQ19ESVNDT05ORUNUX0lORElDQVRFOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU1RBVEVfQ01EX01BQ19ESVNDT05ORUNUX0lORElDQVRFXG4iKSk7Ci0KLQkJYnRoY2lfRXZlbnREaXNjb25uZWN0UGh5TGlua0NvbXBsZXRlKHBhZGFwdGVyLAotCQlIQ0lfU1RBVFVTX1NVQ0NFU1MsCi0JCS8qICBUT0RPOiBSZW1vdGUgSG9zdCBub3QgbG9jYWwgaG9zdCAqLwotCQlIQ0lfU1RBVFVTX0NPTk5FQ1RfVEVSTUlOQVRFX0xPQ0FMX0hPU1QsCi0JCUVudHJ5TnVtKTsKLQkJQlRIQ0lfRGlzY29ubmVjdFBlZXIocGFkYXB0ZXIsIEVudHJ5TnVtKTsKLQotCQlicmVhazsKLQljYXNlIFNUQVRFX0NNRF9FTlRFUl9TVEFURToKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIlNUQVRFX0NNRF9FTlRFUl9TVEFURVxuIikpOwotCi0JCWlmIChwQnRNZ250LT5iQlRDb25uZWN0SW5Qcm9ncmVzcykgewotCQkJcEJ0TWdudC0+YkJUQ29ubmVjdEluUHJvZ3Jlc3MgPSBmYWxzZTsKLQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJbQlQgRmxhZ10sIEJUIENvbm5lY3QgaW4gcHJvZ3Jlc3MgT0ZGISFcbiIpKTsKLQkJfQotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQnRDdXJyZW50U3RhdGUgPSBIQ0lfU1RBVEVfQ09OTkVDVEVEOwotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uYjR3YXlTdWNjZXNzID0gdHJ1ZTsKLQkJcEJ0TWdudC0+YlN0YXJ0U2VuZFN1cGVydmlzaW9uUGt0ID0gdHJ1ZTsKLQotCQkvKiAgZm9yIHJhdGUgYWRhcHRpdmUgKi8KLQotCQlydGw4NzIzYV91cGRhdGVfcmFtYXNrKHBhZGFwdGVyLAotCQkJCSAgICAgICBNQVhfRldfU1VQUE9SVF9NQUNJRF9OVU0tMS1FbnRyeU51bSwgMCk7Ci0KLQkJSGFsU2V0QnJhdGVDZmcyM2EocGFkYXB0ZXIsIHBhZGFwdGVyLT5tbG1lcHJpdi5jdXJfbmV0d29yay5uZXR3b3JrLlN1cHBvcnRlZFJhdGVzKTsKLQkJQlRETV9TZXRGd0NobmxJbmZvKHBhZGFwdGVyLCBSVF9NRURJQV9DT05ORUNUKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIlN0YXRlIGNvbW1hbmQoJWQpIGlzIFdyb25nICEhIVxuIiwgU3RhdGVDbWQpKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotYnRoY2lfU3RhdGVBdXRoKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGVudW0gaGNpX3N0YXRlX3dpdGhfY21kIFN0YXRlQ21kLAotCQl1OCBFbnRyeU51bSkKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJbQlQgc3RhdGVdLCBbQXV0aGVudGljYXRpbmddLCAiKSk7Ci0Jc3dpdGNoIChTdGF0ZUNtZCkgewotCWNhc2UgU1RBVEVfQ01EX0NPTk5FQ1RfQUNDRVBUX1RJTUVPVVQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTVEFURV9DTURfQ09OTkVDVF9BQ0NFUFRfVElNRU9VVFxuIikpOwotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5c0xpbmtDb21wbGV0ZVN0YXR1cyA9IEhDSV9TVEFUVVNfQ09OTkVDVF9BQ0NFUFRfVElNRU9VVDsKLQkJcEJ0TWdudC0+Yk5lZWROb3RpZnlBTVBOb0NhcCA9IHRydWU7Ci0JCUJUSENJX0Rpc2Nvbm5lY3RQZWVyKHBhZGFwdGVyLCBFbnRyeU51bSk7Ci0JCWJyZWFrOwotCWNhc2UgU1RBVEVfQ01EX0RJU0NPTk5FQ1RfUEhZX0xJTks6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTVEFURV9DTURfRElTQ09OTkVDVF9QSFlfTElOS1xuIikpOwotCQlidGhjaV9FdmVudERpc2Nvbm5lY3RQaHlMaW5rQ29tcGxldGUocGFkYXB0ZXIsCi0JCUhDSV9TVEFUVVNfU1VDQ0VTUywKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtEaXNjb25uZWN0UmVhc29uLAotCQlFbnRyeU51bSk7Ci0KLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeXNMaW5rQ29tcGxldGVTdGF0dXMgPSBIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lEOwotCi0JCWRlbF90aW1lcl9zeW5jKCZwQlRJbmZvLT5CVEhDSUpvaW5UaW1lb3V0VGltZXIpOwotCi0JCUJUSENJX0Rpc2Nvbm5lY3RQZWVyKHBhZGFwdGVyLCBFbnRyeU51bSk7Ci0JCWJyZWFrOwotCWNhc2UgU1RBVEVfQ01EXzRXQVlfRkFJTEVEOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU1RBVEVfQ01EXzRXQVlfRkFJTEVEXG4iKSk7Ci0KLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeXNMaW5rQ29tcGxldGVTdGF0dXMgPSBIQ0lfU1RBVFVTX0FVVEhfRkFJTDsKLQkJcEJ0TWdudC0+Yk5lZWROb3RpZnlBTVBOb0NhcCA9IHRydWU7Ci0KLQkJQlRIQ0lfRGlzY29ubmVjdFBlZXIocGFkYXB0ZXIsIEVudHJ5TnVtKTsKLQotCQlkZWxfdGltZXJfc3luYygmcEJUSW5mby0+QlRIQ0lKb2luVGltZW91dFRpbWVyKTsKLQkJYnJlYWs7Ci0JY2FzZSBTVEFURV9DTURfNFdBWV9TVUNDRVNTRUQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTVEFURV9DTURfNFdBWV9TVUNDRVNTRURcbiIpKTsKLQotCQlidGhjaV9FdmVudFBoeXNpY2FsTGlua0NvbXBsZXRlKHBhZGFwdGVyLCBIQ0lfU1RBVFVTX1NVQ0NFU1MsIEVudHJ5TnVtLCBJTlZBTElEX1BMX0hBTkRMRSk7Ci0KLQkJZGVsX3RpbWVyX3N5bmMoJnBCVEluZm8tPkJUSENJSm9pblRpbWVvdXRUaW1lcik7Ci0KLQkJQlRIQ0lfU01fV0lUSF9JTkZPKHBhZGFwdGVyLCBIQ0lfU1RBVEVfQ09OTkVDVEVELCBTVEFURV9DTURfRU5URVJfU1RBVEUsIEVudHJ5TnVtKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIlN0YXRlIGNvbW1hbmQoJWQpIGlzIFdyb25nICEhIVxuIiwgU3RhdGVDbWQpKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotYnRoY2lfU3RhdGVEaXNjb25uZWN0aW5nKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgZW51bSBoY2lfc3RhdGVfd2l0aF9jbWQgU3RhdGVDbWQsIHU4IEVudHJ5TnVtKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIltCVCBzdGF0ZV0sIFtEaXNjb25uZWN0aW5nXSwgIikpOwotCXN3aXRjaCAoU3RhdGVDbWQpIHsKLQljYXNlIFNUQVRFX0NNRF9NQUNfQ09OTkVDVF9DQU5DRUxfSU5ESUNBVEU6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTVEFURV9DTURfTUFDX0NPTk5FQ1RfQ0FOQ0VMX0lORElDQVRFXG4iKSk7Ci0JCWlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uYk5lZWRQaHlzTGlua0NvbXBsZXRlRXZlbnQpIHsKLQkJCWJ0aGNpX0V2ZW50UGh5c2ljYWxMaW5rQ29tcGxldGUocGFkYXB0ZXIsCi0JCQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeXNMaW5rQ29tcGxldGVTdGF0dXMsCi0JCQkJRW50cnlOdW0sIElOVkFMSURfUExfSEFORExFKTsKLQkJfQotCi0JCWlmIChwQnRNZ250LT5iQlRDb25uZWN0SW5Qcm9ncmVzcykgewotCQkJcEJ0TWdudC0+YkJUQ29ubmVjdEluUHJvZ3Jlc3MgPSBmYWxzZTsKLQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJbQlQgRmxhZ10sIEJUIENvbm5lY3QgaW4gcHJvZ3Jlc3MgT0ZGISFcbiIpKTsKLQkJfQotCi0JCUJUSENJX1NNX1dJVEhfSU5GTyhwYWRhcHRlciwgSENJX1NUQVRFX0RJU0NPTk5FQ1RFRCwgU1RBVEVfQ01EX0VOVEVSX1NUQVRFLCBFbnRyeU51bSk7Ci0JCWJyZWFrOwotCWNhc2UgU1RBVEVfQ01EX0RJU0NPTk5FQ1RfUEhZX0xJTks6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTVEFURV9DTURfRElTQ09OTkVDVF9QSFlfTElOS1xuIikpOwotCi0JCWJ0aGNpX0V2ZW50RGlzY29ubmVjdFBoeUxpbmtDb21wbGV0ZShwYWRhcHRlciwKLQkJSENJX1NUQVRVU19TVUNDRVNTLAotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0Rpc2Nvbm5lY3RSZWFzb24sCi0JCUVudHJ5TnVtKTsKLQotCQlkZWxfdGltZXJfc3luYygmcEJUSW5mby0+QlRIQ0lKb2luVGltZW91dFRpbWVyKTsKLQotCQlCVEhDSV9EaXNjb25uZWN0UGVlcihwYWRhcHRlciwgRW50cnlOdW0pOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU3RhdGUgY29tbWFuZCglZCkgaXMgV3JvbmcgISEhXG4iLCBTdGF0ZUNtZCkpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9TdGF0ZURpc2Nvbm5lY3RlZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJZW51bSBoY2lfc3RhdGVfd2l0aF9jbWQgU3RhdGVDbWQsIHU4IEVudHJ5TnVtKQotewotLypQTUdOVF9JTkZPIHBNZ250SW5mbyA9ICZwYWRhcHRlci0+TWdudEluZm87ICovCi0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJbQlQgc3RhdGVdLCBbRGlzY29ubmVjdGVkXSwgIikpOwotCXN3aXRjaCAoU3RhdGVDbWQpIHsKLQljYXNlIFNUQVRFX0NNRF9DUkVBVEVfUEhZX0xJTks6Ci0JY2FzZSBTVEFURV9DTURfQUNDRVBUX1BIWV9MSU5LOgotCQlpZiAoU3RhdGVDbWQgPT0gU1RBVEVfQ01EX0NSRUFURV9QSFlfTElOSykKLQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTVEFURV9DTURfQ1JFQVRFX1BIWV9MSU5LXG4iKSk7Ci0JCWVsc2UKLQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTVEFURV9DTURfQUNDRVBUX1BIWV9MSU5LXG4iKSk7Ci0KLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIltCVCBQU10sIERpc2FibGUgSVBTIGFuZCBMUFNcbiIpKTsKLQkJaXBzX2xlYXZlMjNhKHBhZGFwdGVyKTsKLQkJTFBTX0xlYXZlMjNhKHBhZGFwdGVyKTsKLQotCQlwQnRNZ250LT5iUGh5TGlua0luUHJvZ3Jlc3MgPSB0cnVlOwotCQlwQnRNZ250LT5CVEN1cnJlbnRDb25uZWN0VHlwZSA9IEJUX0RJU0NPTk5FQ1Q7Ci0JCXBCdE1nbnQtPkN1cnJlbnRCVENvbm5lY3Rpb25DbnQrKzsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIltCVCBGbGFnXSwgQ3VycmVudEJUQ29ubmVjdGlvbkNudCA9ICVkXG4iLAotCQkJcEJ0TWdudC0+Q3VycmVudEJUQ29ubmVjdGlvbkNudCkpOwotCQlwQnRNZ250LT5CdE9wZXJhdGlvbk9uID0gdHJ1ZTsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIltCVCBGbGFnXSwgQnQgT3BlcmF0aW9uIE9OISEgQ3VycmVudENvbm5lY3RFbnRyeU51bSA9ICVkXG4iLAotCQkJcEJ0TWdudC0+Q3VycmVudENvbm5lY3RFbnRyeU51bSkpOwotCi0JCWlmIChwQnRNZ250LT5iQlRDb25uZWN0SW5Qcm9ncmVzcykgewotCQkJYnRoY2lfRXZlbnRQaHlzaWNhbExpbmtDb21wbGV0ZShwYWRhcHRlciwgSENJX1NUQVRVU19DT05UUk9MTEVSX0JVU1ksIElOVkFMSURfRU5UUllfTlVNLCBwQnRNZ250LT5CdEN1cnJlbnRQaHlMaW5raGFuZGxlKTsKLQkJCWJ0aGNpX1JlbW92ZUVudHJ5QnlFbnRyeU51bShwYWRhcHRlciwgRW50cnlOdW0pOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKFN0YXRlQ21kID09IFNUQVRFX0NNRF9DUkVBVEVfUEhZX0xJTkspCi0JCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQU1QUm9sZSA9IEFNUF9CVEFQX0NSRUFUT1I7Ci0JCWVsc2UKLQkJCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BTVBSb2xlID0gQU1QX0JUQVBfSk9JTkVSOwotCi0JCS8qICAxLiBNQUMgbm90IHlldCBpbiBzZWxlY3RlZCBjaGFubmVsICovCi0JCXdoaWxlIChjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIFdJRklfQVNPQ19TVEFURXxXSUZJX1NJVEVfTU9OSVRPUikpIHsKLQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTY2FuL1JvYW1pbmcvV2lmaSBMaW5rIGlzIGluIFByb2dyZXNzLCB3YWl0IDIwMCBtc1xuIikpOwotCQkJbWRlbGF5KDIwMCk7Ci0JCX0KLQkJLyogIDIuIE1BQyBhbHJlYWR5IGluIHNlbGVjdGVkIGNoYW5uZWwgKi8KLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIkNoYW5uZWwgaXMgUmVhZHlcbiIpKTsKLQkJbW9kX3RpbWVyKCZwQlRJbmZvLT5CVEhDSUpvaW5UaW1lb3V0VGltZXIsCi0JCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKHBCdEhjaUluZm8tPkNvbm5BY2NlcHRUaW1lb3V0KSk7Ci0KLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLmJOZWVkUGh5c0xpbmtDb21wbGV0ZUV2ZW50ID0gdHJ1ZTsKLQkJYnJlYWs7Ci0JY2FzZSBTVEFURV9DTURfRElTQ09OTkVDVF9QSFlfTElOSzoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIlNUQVRFX0NNRF9ESVNDT05ORUNUX1BIWV9MSU5LXG4iKSk7Ci0KLQkJZGVsX3RpbWVyX3N5bmMoJnBCVEluZm8tPkJUSENJSm9pblRpbWVvdXRUaW1lcik7Ci0KLQkJYnRoY2lfRXZlbnREaXNjb25uZWN0UGh5TGlua0NvbXBsZXRlKHBhZGFwdGVyLAotCQlIQ0lfU1RBVFVTX1NVQ0NFU1MsCi0JCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rRGlzY29ubmVjdFJlYXNvbiwKLQkJRW50cnlOdW0pOwotCi0JCWlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uYk5lZWRQaHlzTGlua0NvbXBsZXRlRXZlbnQpIHsKLQkJCWJ0aGNpX0V2ZW50UGh5c2ljYWxMaW5rQ29tcGxldGUocGFkYXB0ZXIsCi0JCQkJSENJX1NUQVRVU19VTktOT1dfQ09OTkVDVF9JRCwKLQkJCQlFbnRyeU51bSwgSU5WQUxJRF9QTF9IQU5ETEUpOwotCQl9Ci0KLQkJaWYgKHBCdE1nbnQtPmJCVENvbm5lY3RJblByb2dyZXNzKSB7Ci0JCQlwQnRNZ250LT5iQlRDb25uZWN0SW5Qcm9ncmVzcyA9IGZhbHNlOwotCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIltCVCBGbGFnXSwgQlQgQ29ubmVjdCBpbiBwcm9ncmVzcyBPRkYhIVxuIikpOwotCQl9Ci0JCUJUSENJX1NNX1dJVEhfSU5GTyhwYWRhcHRlciwgSENJX1NUQVRFX0RJU0NPTk5FQ1RFRCwgU1RBVEVfQ01EX0VOVEVSX1NUQVRFLCBFbnRyeU51bSk7Ci0JCWJ0aGNpX1JlbW92ZUVudHJ5QnlFbnRyeU51bShwYWRhcHRlciwgRW50cnlOdW0pOwotCQlicmVhazsKLQljYXNlIFNUQVRFX0NNRF9FTlRFUl9TVEFURToKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIlNUQVRFX0NNRF9FTlRFUl9TVEFURVxuIikpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU3RhdGUgY29tbWFuZCglZCkgaXMgV3JvbmcgISEhXG4iLCBTdGF0ZUNtZCkpOwotCQlicmVhazsKLQl9Ci19Ci0KLXZvaWQgQlRIQ0lfRXZlbnRQYXJzZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB2b2lkICpwRXZudERhdGEsIHUzMiBkYXRhTGVuKQotewotfQotCi11OCBCVEhDSV9Ic0Nvbm5lY3Rpb25Fc3RhYmxpc2hlZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXU4IGJCdENvbm5lY3Rpb25FeGlzdCA9IGZhbHNlOwotCXN0cnVjdCBidF8zMGluZm8gKnBCdGluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0JdTggaTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfQlRfQVNPQ19FTlRSWV9OVU07IGkrKykgewotCQlpZiAocEJ0aW5mby0+QnRBc29jRW50cnlbaV0uYjR3YXlTdWNjZXNzKSB7Ci0JCQliQnRDb25uZWN0aW9uRXhpc3QgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLS8qUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIiBCVEhDSV9Ic0Nvbm5lY3Rpb25Fc3RhYmxpc2hlZCgpLCBjb25uZWN0aW9uIGV4aXN0ID0gJWRcbiIsIGJCdENvbm5lY3Rpb25FeGlzdCkpOyAqLwotCi0JcmV0dXJuIGJCdENvbm5lY3Rpb25FeGlzdDsKLX0KLQotc3RhdGljIHU4Ci1CVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJZW51bSBidF90cmFmZmljX21vZGVfcHJvZmlsZSBQcm9maWxlKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXU4IElzUFJvZmlsZSA9IGZhbHNlOwotCXU4IGkgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZTsgaSsrKSB7Ci0JCWlmIChwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uVHJhZmZpY1Byb2ZpbGUgPT0gUHJvZmlsZSkgewotCQkJSXNQUm9maWxlID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIElzUFJvZmlsZTsKLX0KLQotdm9pZCBCVEhDSV9VcGRhdGVCVFByb2ZpbGVSVEtUb01vdG8oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQl1OCBpID0gMDsKLQotCXBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZlNDTyA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlOyBpKyspIHsKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLlRyYWZmaWNQcm9maWxlID0gQlRfUFJPRklMRV9OT05FOwotCi0JCWlmIChwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQlRQcm9maWxlID09IEJUX1BST0ZJTEVfU0NPKQotCQkJcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mU0NPKys7Ci0KLQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLlRyYWZmaWNQcm9maWxlID0gcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkJUUHJvZmlsZTsKLQkJc3dpdGNoIChwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uVHJhZmZpY1Byb2ZpbGUpIHsKLQkJY2FzZSBCVF9QUk9GSUxFX1NDTzoKLQkJCWJyZWFrOwotCQljYXNlIEJUX1BST0ZJTEVfUEFOOgotCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkluY29taW5nVHJhZmZpY01vZGUgPSBCVF9NT1RPUl9FWFRfQkU7Ci0JCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uT3V0Z29pbmdUcmFmZmljTW9kZSA9IEJUX01PVE9SX0VYVF9CRTsKLQkJCWJyZWFrOwotCQljYXNlIEJUX1BST0ZJTEVfQTJEUDoKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5JbmNvbWluZ1RyYWZmaWNNb2RlID0gQlRfTU9UT1JfRVhUX0dVTEI7Ci0JCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uT3V0Z29pbmdUcmFmZmljTW9kZSA9IEJUX01PVE9SX0VYVF9HVUxCOwotCQkJYnJlYWs7Ci0JCWNhc2UgQlRfUFJPRklMRV9ISUQ6Ci0JCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uSW5jb21pbmdUcmFmZmljTW9kZSA9IEJUX01PVE9SX0VYVF9HVUw7Ci0JCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uT3V0Z29pbmdUcmFmZmljTW9kZSA9IEJUX01PVE9SX0VYVF9CRTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJUSywgTnVtYmVyT2ZIYW5kbGUgPSAlZCwgTnVtYmVyT2ZTQ08gPSAlZFxuIiwKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlLCBwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZTQ08pKTsKLX0KLQotdm9pZCBCVEhDSV9XaWZpU2Nhbk5vdGlmeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBzY2FuVHlwZSkKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQotCWlmIChwQnRNZ250LT5FeHRDb25maWcuYkVuYWJsZVdpZmlTY2FuTm90aWZ5KQotCQlidGhjaV9FdmVudEV4dFdpZmlTY2FuTm90aWZ5KHBhZGFwdGVyLCBzY2FuVHlwZSk7Ci19Ci0KLXZvaWQKLUJUSENJX1N0YXRlTWFjaGluZSgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXU4IAkJU3RhdGVUb0VudGVyLAotCWVudW0gaGNpX3N0YXRlX3dpdGhfY21kCQlTdGF0ZUNtZCwKLQl1OCAJCUVudHJ5TnVtCi0JKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JaWYgKEVudHJ5TnVtID09IDB4ZmYpIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIiBTdGF0ZU1hY2hpbmUsIGVycm9yIEVudHJ5TnVtID0gMHgleCBcbiIsIEVudHJ5TnVtKSk7Ci0JCXJldHVybjsKLQl9Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIiBTdGF0ZU1hY2hpbmUsIEVudHJ5TnVtID0gMHgleCwgQ3VycmVudFN0YXRlID0gMHgleCwgQnROZXh0U3RhdGUgPSAweCV4LCAgU3RhdGVDbWQgPSAweCV4ICwgU3RhdGVUb0VudGVyID0gMHgleFxuIiwKLQkJRW50cnlOdW0sIHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5CdEN1cnJlbnRTdGF0ZSwgcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkJ0TmV4dFN0YXRlLCBTdGF0ZUNtZCwgU3RhdGVUb0VudGVyKSk7Ci0KLQlpZiAocEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkJ0TmV4dFN0YXRlICYgU3RhdGVUb0VudGVyKSB7Ci0JCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5CdEN1cnJlbnRTdGF0ZSA9IFN0YXRlVG9FbnRlcjsKLQotCQlzd2l0Y2ggKFN0YXRlVG9FbnRlcikgewotCQljYXNlIEhDSV9TVEFURV9TVEFSVElORzoKLQkJCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5CdE5leHRTdGF0ZSA9IEhDSV9TVEFURV9ESVNDT05ORUNUSU5HIHwgSENJX1NUQVRFX0NPTk5FQ1RJTkc7Ci0JCQlidGhjaV9TdGF0ZVN0YXJ0aW5nKHBhZGFwdGVyLCBTdGF0ZUNtZCwgRW50cnlOdW0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgSENJX1NUQVRFX0NPTk5FQ1RJTkc6Ci0JCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQnROZXh0U3RhdGUgPSBIQ0lfU1RBVEVfQ09OTkVDVElORyB8IEhDSV9TVEFURV9ESVNDT05ORUNUSU5HIHwgSENJX1NUQVRFX0FVVEhFTlRJQ0FUSU5HOwotCQkJYnRoY2lfU3RhdGVDb25uZWN0aW5nKHBhZGFwdGVyLCBTdGF0ZUNtZCwgRW50cnlOdW0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgSENJX1NUQVRFX0FVVEhFTlRJQ0FUSU5HOgotCQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkJ0TmV4dFN0YXRlID0gSENJX1NUQVRFX0RJU0NPTk5FQ1RJTkcgfCBIQ0lfU1RBVEVfQ09OTkVDVEVEOwotCQkJYnRoY2lfU3RhdGVBdXRoKHBhZGFwdGVyLCBTdGF0ZUNtZCwgRW50cnlOdW0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgSENJX1NUQVRFX0NPTk5FQ1RFRDoKLQkJCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5CdE5leHRTdGF0ZSA9IEhDSV9TVEFURV9DT05ORUNURUQgfCBIQ0lfU1RBVEVfRElTQ09OTkVDVElORzsKLQkJCWJ0aGNpX1N0YXRlQ29ubmVjdGVkKHBhZGFwdGVyLCBTdGF0ZUNtZCwgRW50cnlOdW0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgSENJX1NUQVRFX0RJU0NPTk5FQ1RJTkc6Ci0JCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQnROZXh0U3RhdGUgPSBIQ0lfU1RBVEVfRElTQ09OTkVDVEVEIHwgSENJX1NUQVRFX0RJU0NPTk5FQ1RJTkc7Ci0JCQlidGhjaV9TdGF0ZURpc2Nvbm5lY3RpbmcocGFkYXB0ZXIsIFN0YXRlQ21kLCBFbnRyeU51bSk7Ci0JCQlicmVhazsKLQkJY2FzZSBIQ0lfU1RBVEVfRElTQ09OTkVDVEVEOgotCQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkJ0TmV4dFN0YXRlID0gSENJX1NUQVRFX0RJU0NPTk5FQ1RFRCB8IEhDSV9TVEFURV9TVEFSVElORyB8IEhDSV9TVEFURV9DT05ORUNUSU5HOwotCQkJYnRoY2lfU3RhdGVEaXNjb25uZWN0ZWQocGFkYXB0ZXIsIFN0YXRlQ21kLCBFbnRyeU51bSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCIgU3RhdGVNYWNoaW5lLCBVbmtub3duIHN0YXRlIHRvIGVudGVyISEhXG4iKSk7Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCIgU3RhdGVNYWNoaW5lLCBXcm9uZyBzdGF0ZSB0byBlbnRlclxuIikpOwotCX0KLQotCS8qICAyMDEwMDMyNSBKb3NlcGg6IERpc2FibGUvRW5hYmxlIElQUy9MUFMgYWNjb3JkaW5nIHRvIEJUIHN0YXR1cy4gKi8KLQlpZiAoIXBCdE1nbnQtPmJCVENvbm5lY3RJblByb2dyZXNzICYmICFwQnRNZ250LT5CdE9wZXJhdGlvbk9uKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJbQlQgUFNdLCBpcHNfZW50ZXIyM2EoKVxuIikpOwotCQlpcHNfZW50ZXIyM2EocGFkYXB0ZXIpOwotCX0KLX0KLQotdm9pZCBCVEhDSV9EaXNjb25uZWN0UGVlcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBFbnRyeU51bSkKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiIEJUSENJX0Rpc2Nvbm5lY3RQZWVyKClcbiIpKTsKLQotCUJUSENJX1NNX1dJVEhfSU5GTyhwYWRhcHRlciwgSENJX1NUQVRFX0RJU0NPTk5FQ1RJTkcsIFNUQVRFX0NNRF9NQUNfQ09OTkVDVF9DQU5DRUxfSU5ESUNBVEUsIEVudHJ5TnVtKTsKLQotCWlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uYlVzZWQpIHsKLS8qQlRQS1RfU2VuZERlYXV0aGVudGljYXRpb24ocGFkYXB0ZXIsIHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5CVFJlbW90ZU1BQ0FkZHIsIHVuc3BlY19yZWFzb24pOyBub3QgcG9ydGluZyB5ZXQgKi8KLQl9Ci0KLQlpZiAocEJ0TWdudC0+YkJUQ29ubmVjdEluUHJvZ3Jlc3MpIHsKLQkJcEJ0TWdudC0+YkJUQ29ubmVjdEluUHJvZ3Jlc3MgPSBmYWxzZTsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIltCVCBGbGFnXSwgQlQgQ29ubmVjdCBpbiBwcm9ncmVzcyBPRkYhIVxuIikpOwotCX0KLQotCWJ0aGNpX1JlbW92ZUVudHJ5QnlFbnRyeU51bShwYWRhcHRlciwgRW50cnlOdW0pOwotCi0JaWYgKHBCdE1nbnQtPmJOZWVkTm90aWZ5QU1QTm9DYXApIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIltCVCBBTVBTdGF0dXNdLCBzZXQgdG8gaW52YWxpZCBpbiBCVEhDSV9EaXNjb25uZWN0UGVlcigpXG4iKSk7Ci0JCUJUSENJX0V2ZW50QU1QU3RhdHVzQ2hhbmdlKHBhZGFwdGVyLCBBTVBfU1RBVFVTX05PX0NBUEFDSVRZX0ZPUl9CVCk7Ci0JfQotfQotCi12b2lkIEJUSENJX0V2ZW50TnVtT2ZDb21wbGV0ZWREYXRhQmxvY2tzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0vKlBNR05UX0lORk8gcE1nbnRJbmZvID0gJnBhZGFwdGVyLT5NZ250SW5mbzsgKi8KLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0JdTggbG9jYWxCdWZbVG1wTG9jYWxCdWZTaXplXSA9ICIiOwotCXU4ICpwUmV0UGFyLCAqcFRyaXBsZTsKLQl1OCBsZW4gPSAwLCBpLCBqLCBoYW5kbGVOdW0gPSAwOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQl1MTYgKnB1MlRlbXAsICpwUGFja2V0cywgKnBIYW5kbGUsICpwRGJsb2NrczsKLQl1OCBzZW50ID0gMDsKLQotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQlpZiAoIShwQnRIY2lJbmZvLT5CVEV2ZW50TWFza1BhZ2UyICYgRU1QMl9IQ0lfRVZFTlRfTlVNX09GX0NPTVBMRVRFX0RBVEFfQkxPQ0tTKSkgewotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfRVZFTlQsICgiW0JUIGV2ZW50XSwgTnVtIE9mIENvbXBsZXRlZCBEYXRhQmxvY2tzLCBJZ25vcmUgdG8gc2VuZCBOdW1PZkNvbXBsZXRlZERhdGFCbG9ja3NFdmVudCBkdWUgdG8gZXZlbnQgbWFzayBwYWdlIDJcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbMF07Ci0JcFRyaXBsZSA9ICZwUmV0UGFyWzNdOwotCWZvciAoaiA9IDA7IGogPCBNQVhfQlRfQVNPQ19FTlRSWV9OVU07IGorKykgewotCi0JCWZvciAoaSA9IDA7IGkgPCBNQVhfTE9HSUNBTF9MSU5LX05VTTsgaSsrKSB7Ci0JCQlpZiAocEJUSW5mby0+QnRBc29jRW50cnlbal0uTG9nTGlua0NtZERhdGFbaV0uQnRMb2dMaW5raGFuZGxlKSB7Ci0JCQkJaGFuZGxlTnVtKys7Ci0JCQkJcEhhbmRsZSA9ICh1MTYgKikmcFRyaXBsZVswXTsJLyogIEhhbmRsZVtpXSAqLwotCQkJCXBQYWNrZXRzID0gKHUxNiAqKSZwVHJpcGxlWzJdOwkvKiAgTnVtX09mX0NvbXBsZXRlZF9QYWNrZXRzW2ldICovCi0JCQkJcERibG9ja3MgPSAodTE2ICopJnBUcmlwbGVbNF07CS8qICBOdW1fT2ZfQ29tcGxldGVkX0Jsb2Nrc1tpXSAqLwotCQkJCSpwSGFuZGxlID0gcEJUSW5mby0+QnRBc29jRW50cnlbal0uTG9nTGlua0NtZERhdGFbaV0uQnRMb2dMaW5raGFuZGxlOwotCQkJCSpwUGFja2V0cyA9ICh1MTYpcEJUSW5mby0+QnRBc29jRW50cnlbal0uTG9nTGlua0NtZERhdGFbaV0uVHhQYWNrZXRDb3VudDsKLQkJCQkqcERibG9ja3MgPSAodTE2KXBCVEluZm8tPkJ0QXNvY0VudHJ5W2pdLkxvZ0xpbmtDbWREYXRhW2ldLlR4UGFja2V0Q291bnQ7Ci0JCQkJaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W2pdLkxvZ0xpbmtDbWREYXRhW2ldLlR4UGFja2V0Q291bnQpIHsKLQkJCQkJc2VudCA9IDE7Ci0JCQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVF9ERVRBSUwsCi0JCQkJCQkoIltCVCBldmVudF0sIE51bSBPZiBDb21wbGV0ZWQgRGF0YUJsb2NrcywgSGFuZGxlID0gMHgleCwgTnVtX09mX0NvbXBsZXRlZF9QYWNrZXRzID0gMHgleCwgTnVtX09mX0NvbXBsZXRlZF9CbG9ja3MgPSAweCV4XG4iLAotCQkJCQkqcEhhbmRsZSwgKnBQYWNrZXRzLCAqcERibG9ja3MpKTsKLQkJCQl9Ci0JCQkJcEJUSW5mby0+QnRBc29jRW50cnlbal0uTG9nTGlua0NtZERhdGFbaV0uVHhQYWNrZXRDb3VudCA9IDA7Ci0JCQkJbGVuICs9IDY7Ci0JCQkJcFRyaXBsZSArPSBsZW47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwUmV0UGFyWzJdID0gaGFuZGxlTnVtOwkJCQkvKiAgTnVtYmVyX29mX0hhbmRsZXMgKi8KLQlsZW4gKz0gMTsKLQlwdTJUZW1wID0gKHUxNiAqKSZwUmV0UGFyWzBdOwotCSpwdTJUZW1wID0gQlRUb3RhbERhdGFCbG9ja051bTsKLQlsZW4gKz0gMjsKLQotCVBQYWNrZXRJcnBFdmVudC0+RXZlbnRDb2RlID0gSENJX0VWRU5UX05VTV9PRl9DT01QTEVURV9EQVRBX0JMT0NLUzsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQlpZiAoaGFuZGxlTnVtICYmIHNlbnQpCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotfQotCi12b2lkIEJUSENJX0V2ZW50QU1QU3RhdHVzQ2hhbmdlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IEFNUF9TdGF0dXMpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCXU4IGxlbiA9IDA7Ci0JdTggbG9jYWxCdWZbN10gPSAiIjsKLQl1OCAqcFJldFBhcjsKLQotCWlmIChBTVBfU3RhdHVzID09IEFNUF9TVEFUVVNfTk9fQ0FQQUNJVFlfRk9SX0JUKSB7Ci0JCXBCdE1nbnQtPkJUTmVlZEFNUFN0YXR1c0NoZyA9IHRydWU7Ci0JCXBCdE1nbnQtPmJOZWVkTm90aWZ5QU1QTm9DYXAgPSBmYWxzZTsKLQotCQlCVEhDSV9EaXNjb25uZWN0QWxsKHBhZGFwdGVyKTsKLQl9IGVsc2UgaWYgKEFNUF9TdGF0dXMgPT0gQU1QX1NUQVRVU19GVUxMX0NBUEFDSVRZX0ZPUl9CVCkgewotCQlwQnRNZ250LT5CVE5lZWRBTVBTdGF0dXNDaGcgPSBmYWxzZTsKLQl9Ci0KLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbMF07Ci0KLQlwUmV0UGFyWzBdID0gMDsJLyogIFN0YXR1cyAqLwotCWxlbiArPSAxOwotCXBSZXRQYXJbMV0gPSBBTVBfU3RhdHVzOwkvKiAgQU1QX1N0YXR1cyAqLwotCWxlbiArPSAxOwotCi0JUFBhY2tldElycEV2ZW50LT5FdmVudENvZGUgPSBIQ0lfRVZFTlRfQU1QX1NUQVRVU19DSEFOR0U7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0JaWYgKGJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpID09IFJUX1NUQVRVU19TVUNDRVNTKQotCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0VWRU5UfElPQ1RMX1NUQVRFKSwgKCJbQlQgZXZlbnRdLCBBTVAgU3RhdHVzIENoYW5nZSwgQU1QX1N0YXR1cyA9ICVkXG4iLCBBTVBfU3RhdHVzKSk7Ci19Ci0KLXZvaWQgQlRIQ0lfRGlzY29ubmVjdEFsbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0JdTggaTsKLQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCIgRGlzY29ubmVjdEFMTCgpXG4iKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0JUX0FTT0NfRU5UUllfTlVNOyBpKyspIHsKLQkJaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W2ldLmI0d2F5U3VjY2VzcykgewotCQkJQlRIQ0lfU01fV0lUSF9JTkZPKHBhZGFwdGVyLCBIQ0lfU1RBVEVfQ09OTkVDVEVELCBTVEFURV9DTURfRElTQ09OTkVDVF9QSFlfTElOSywgaSk7Ci0JCX0gZWxzZSBpZiAocEJUSW5mby0+QnRBc29jRW50cnlbaV0uYlVzZWQpIHsKLQkJCWlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtpXS5CdEN1cnJlbnRTdGF0ZSA9PSBIQ0lfU1RBVEVfQ09OTkVDVElORykgewotCQkJCUJUSENJX1NNX1dJVEhfSU5GTyhwYWRhcHRlciwgSENJX1NUQVRFX0NPTk5FQ1RJTkcsIFNUQVRFX0NNRF9NQUNfQ09OTkVDVF9DQU5DRUxfSU5ESUNBVEUsIGkpOwotCQkJfSBlbHNlIGlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtpXS5CdEN1cnJlbnRTdGF0ZSA9PSBIQ0lfU1RBVEVfRElTQ09OTkVDVElORykgewotCQkJCUJUSENJX1NNX1dJVEhfSU5GTyhwYWRhcHRlciwgSENJX1NUQVRFX0RJU0NPTk5FQ1RJTkcsIFNUQVRFX0NNRF9NQUNfQ09OTkVDVF9DQU5DRUxfSU5ESUNBVEUsIGkpOwotCQkJfQotCQl9Ci0JfQotfQotCi1lbnVtIGhjaV9zdGF0dXMKLUJUSENJX0hhbmRsZUhDSUNNRCgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCWVudW0gaGNpX3N0YXR1cwlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmcgPSAmcEJUSW5mby0+QnREYmc7Ci0KLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIlxuIikpOwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EX0RFVEFJTHxJT0NUTF9CVF9MT0dPKSwgKCJIQ0kgQ29tbWFuZCBzdGFydCwgT0dGID0gMHgleCwgT0NGID0gMHgleCwgTGVuZ3RoID0gMHgleFxuIiwKLQkJcEhjaUNtZC0+T0dGLCBwSGNpQ21kLT5PQ0YsIHBIY2lDbWQtPkxlbmd0aCkpOwotCWlmIChwSGNpQ21kLT5MZW5ndGgpIHsKLQkJUlRQUklOVF9EQVRBKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRF9ERVRBSUx8SU9DVExfQlRfTE9HTyksICJIQ0kgQ29tbWFuZCwgSGV4IERhdGEgOlxuIiwKLQkJCSZwSGNpQ21kLT5EYXRhWzBdLCBwSGNpQ21kLT5MZW5ndGgpOwotCX0KLQlpZiAocEhjaUNtZC0+T0dGID09IE9HRl9FWFRFTlNJT04pIHsKLQkJaWYgKHBIY2lDbWQtPk9DRiA9PSBIQ0lfU0VUX1JTU0lfVkFMVUUpCi0JCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfRVZFTlRfUEVSSU9ESUNBTCwgKCJbQlQgY21kXSwgIikpOwotCQllbHNlCi0JCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJbQlQgY21kXSwgIikpOwotCX0gZWxzZSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiW0JUIGNtZF0sICIpKTsKLQl9Ci0KLQlwQnREYmctPmRiZ0hjaUluZm8uaGNpQ21kQ250Kys7Ci0KLQlzd2l0Y2ggKHBIY2lDbWQtPk9HRikgewotCWNhc2UgTElOS19DT05UUk9MX0NPTU1BTkRTOgotCQlzdGF0dXMgPSBidGhjaV9IYW5kbGVPR0ZMaW5rQ29udHJvbENNRChwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSE9MRF9NT0RFX0NPTU1BTkQ6Ci0JCWJyZWFrOwotCWNhc2UgT0dGX1NFVF9FVkVOVF9NQVNLX0NPTU1BTkQ6Ci0JCXN0YXR1cyA9IGJ0aGNpX0hhbmRsZU9HRlNldEV2ZW50TWFza0NNRChwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgT0dGX0lORk9STUFUSU9OQUxfUEFSQU1FVEVSUzoKLQkJc3RhdHVzID0gYnRoY2lfSGFuZGxlT0dGSW5mb3JtYXRpb25hbFBhcmFtZXRlcnMocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIE9HRl9TVEFUVVNfUEFSQU1FVEVSUzoKLQkJc3RhdHVzID0gYnRoY2lfSGFuZGxlT0dGU3RhdHVzUGFyYW1ldGVycyhwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgT0dGX1RFU1RJTkdfQ09NTUFORFM6Ci0JCXN0YXR1cyA9IGJ0aGNpX0hhbmRsZU9HRlRlc3RpbmdDTUQocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIE9HRl9FWFRFTlNJT046Ci0JCXN0YXR1cyA9IGJ0aGNpX0hhbmRsZU9HRkV4dGVuc2lvbihwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJIENvbW1hbmQoKSwgVW5rbm93biBPR0YgPSAweCV4XG4iLCBwSGNpQ21kLT5PR0YpKTsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfVU5LTk9XTl9DT01NQU5EXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX1Vua25vd25DTUQocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQl9Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9ERVRBSUwsICgiSENJIENvbW1hbmQgZXhlY3V0aW9uIGVuZCEhXG4iKSk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi0vKiAgPT09PT0gRW5kIG9mIHN5bmMgZnJvbSBTRDcgZHJpdmVyIENPTU1PTS9idF9oY2kuYyA9PT09PSAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgQnRTdGF0ZVN0cmluZ1tdID0gewotCSJCVF9ESVNBQkxFRCIsCi0JIkJUX05PX0NPTk5FQ1RJT04iLAotCSJCVF9DT05ORUNUX0lETEUiLAotCSJCVF9JTlFfT1JfUEFHIiwKLQkiQlRfQUNMX09OTFlfQlVTWSIsCi0JIkJUX1NDT19PTkxZX0JVU1kiLAotCSJCVF9BQ0xfU0NPX0JVU1kiLAotCSJCVF9BQ0xfSU5RX09SX1BBRyIsCi0JIkJUX1NUQVRFX05PVF9ERUZJTkVEIgotfTsKLQotLyogID09PT09IEJlbG93IHRoaXMgbGluZSBpcyBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvQlRDb2V4aXN0L0hhbEJ0Yzg3MjMxQW50LmMgPT09PT0gKi8KLQotc3RhdGljIHZvaWQgYnRkbV9TZXRGd0lnbm9yZVdsYW5BY3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYkVuYWJsZSkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQl1OCBIMkNfUGFyYW1ldGVyWzFdID0gezB9OwotCi0JaWYgKGJFbmFibGUpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBCVCBJZ25vcmUgV2xhbl9BY3QgISFcbiIpKTsKLQkJSDJDX1BhcmFtZXRlclswXSB8PSBCSVQoMCk7CQkvKiAgZnVuY3Rpb24gZW5hYmxlICovCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJGV0NvZXhpc3RBbGxPZmYgPSBmYWxzZTsKLQl9IGVsc2UgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEJUIGRvbid0IGlnbm9yZSBXbGFuX0FjdCAhIVxuIikpOwotCX0KLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgc2V0IEZXIGZvciBCVCBJZ25vcmUgV2xhbl9BY3QsIHdyaXRlIDB4MjUgPSAweCUwMnhcbiIsCi0JCUgyQ19QYXJhbWV0ZXJbMF0pKTsKLQotCUZpbGxIMkNDbWQocGFkYXB0ZXIsIEJUX0lHTk9SRV9XTEFOX0FDVF9FSUQsIDEsIEgyQ19QYXJhbWV0ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBidGRtX05vdGlmeUZ3U2NhbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBzY2FuVHlwZSkKLXsKLQl1OCBIMkNfUGFyYW1ldGVyWzFdID0gezB9OwotCi0JaWYgKHNjYW5UeXBlID09IHRydWUpCi0JCUgyQ19QYXJhbWV0ZXJbMF0gPSAweDE7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIE5vdGlmeSBGVyBmb3Igd2lmaSBzY2FuLCB3cml0ZSAweDNiID0gMHglMDJ4XG4iLAotCQlIMkNfUGFyYW1ldGVyWzBdKSk7Ci0KLQlGaWxsSDJDQ21kKHBhZGFwdGVyLCAweDNiLCAxLCBIMkNfUGFyYW1ldGVyKTsKLX0KLQotc3RhdGljIHZvaWQgYnRkbV8xQW50U2V0UFNNb2RlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICAgdTggZW5hYmxlLCB1OCBzbWFydHBzLCB1OCBtb2RlKQotewotCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cmN0cmw7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEN1cnJlbnQgTFBTKCVzLCAlZCksIHNtYXJ0cHMgPSVkXG4iLCBlbmFibGUgPT0gdHJ1ZT8iT04iOiJPRkYiLCBtb2RlLCBzbWFydHBzKSk7Ci0KLQlwd3JjdHJsID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKLQotCWlmIChlbmFibGUgPT0gdHJ1ZSkgewotCQlydHdfc2V0X3BzX21vZGUyM2EocGFkYXB0ZXIsIFBTX01PREVfTUlOLCBzbWFydHBzLCBtb2RlKTsKLQl9IGVsc2UgewotCQlydHdfc2V0X3BzX21vZGUyM2EocGFkYXB0ZXIsIFBTX01PREVfQUNUSVZFLCAwLCAwKTsKLQkJTFBTX1JGX09OX2NoZWNrMjNhKHBhZGFwdGVyLCAxMDApOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYnRkbV8xQW50VFNGU3dpdGNoKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGVuYWJsZSkKLXsKLQl1OCBvbGRWYWwsIG5ld1ZhbDsKLQotCW9sZFZhbCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgMHg1NTApOwotCi0JaWYgKGVuYWJsZSkKLQkJbmV3VmFsID0gb2xkVmFsIHwgRU5fQkNOX0ZVTkNUSU9OOwotCWVsc2UKLQkJbmV3VmFsID0gb2xkVmFsICYgfkVOX0JDTl9GVU5DVElPTjsKLQotCWlmIChvbGRWYWwgIT0gbmV3VmFsKQotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCAweDU1MCwgbmV3VmFsKTsKLX0KLQotc3RhdGljIHU4IGJ0ZG1fSXMxQW50UHNUZG1hU3RhdGVDaGFuZ2Uoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8xYW50ICpwQnRkbTg3MjMgPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTFBbnQ7Ci0KLQlpZiAoKHBCdGRtODcyMy0+YlByZVBzVGRtYU9uICE9IHBCdGRtODcyMy0+YkN1clBzVGRtYU9uKSB8fAotCQkocEJ0ZG04NzIzLT5wcmVQc1RkbWEgIT0gcEJ0ZG04NzIzLT5jdXJQc1RkbWEpKQotCQlyZXR1cm4gdHJ1ZTsKLQllbHNlCi0JCXJldHVybiBmYWxzZTsKLX0KLQotLyogIEJlZm9yZSBlbnRlciBURE1BLCBtYWtlIHN1cmUgUG93ZXIgU2F2aW5nIGlzIGVuYWJsZSEgKi8KLXN0YXRpYyB2b2lkCi1idGRtXzFBbnRQc1RkbWEoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQl1OCBiVHVybk9uLAotCXU4IHR5cGUKLQkpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMWFudCAqcEJ0ZG04NzIzID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0xQW50OwotCi0JcEJ0ZG04NzIzLT5iQ3VyUHNUZG1hT24gPSBiVHVybk9uOwotCXBCdGRtODcyMy0+Y3VyUHNUZG1hID0gdHlwZTsKLQlpZiAoYlR1cm5PbikgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSAxOgkvKiAgQTJEUCBMZXZlbC0xIG9yIEZUUC9PUFAgKi8KLQkJZGVmYXVsdDoKLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkgewotCQkJCS8qICB3aWRlIGR1cmF0aW9uIGZvciBXaUZpICovCi0JCQkJQlRETV9TZXRGdzNhKHBhZGFwdGVyLCAweGQzLCAweDFhLCAweDFhLCAweDAsIDB4NTgpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMjoJLyogIEEyRFAgTGV2ZWwtMiAqLwotCQkJaWYgKGJ0ZG1fSXMxQW50UHNUZG1hU3RhdGVDaGFuZ2UocGFkYXB0ZXIpKSB7Ci0JCQkJLyogIG5vcm1hbCBkdXJhdGlvbiBmb3IgV2lGaSAqLwotCQkJCUJURE1fU2V0RnczYShwYWRhcHRlciwgMHhkMywgMHgxMiwgMHgxMiwgMHgwLCAweDU4KTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDM6CS8qICBCVCBGVFAvT1BQICovCi0JCQlpZiAoYnRkbV9JczFBbnRQc1RkbWFTdGF0ZUNoYW5nZShwYWRhcHRlcikpIHsKLQkJCQkvKiAgbm9ybWFsIGR1cmF0aW9uIGZvciBXaUZpICovCi0JCQkJQlRETV9TZXRGdzNhKHBhZGFwdGVyLCAweGQzLCAweDMwLCAweDAzLCAweDEwLCAweDU4KTsKLQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgNDoJLyogIGZvciB3aWZpIHNjYW4gJiBCVCBpcyBjb25uZWN0ZWQgKi8KLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkgewotCQkJCS8qICBwcm90ZWN0IDMgYmVhY29ucyBpbiAzLWJlYWNvbiBwZXJpb2QgJiBubyBUeCBwYXVzZSBhdCBCVCBzbG90ICovCi0JCQkJQlRETV9TZXRGdzNhKHBhZGFwdGVyLCAweDkzLCAweDE1LCAweDAzLCAweDE0LCAweDApOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgNToJLyogIGZvciBXaUZpIGNvbm5lY3RlZC1idXN5ICYgQlQgaXMgTm9uLUNvbm5lY3RlZC1JZGxlICovCi0JCQlpZiAoYnRkbV9JczFBbnRQc1RkbWFTdGF0ZUNoYW5nZShwYWRhcHRlcikpIHsKLQkJCQkvKiAgU0NPIG1vZGUsIEFudCBmaXhlZCBhdCBXaUZpLCBXTEFOX0FjdCB0b2dnbGUgKi8KLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4NjEsIDB4MTUsIDB4MDMsIDB4MzEsIDB4MDApOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgOToJLyogIEFDTCBoaWdoLXJldHJ5IHR5cGUgLSAyICovCi0JCQlpZiAoYnRkbV9JczFBbnRQc1RkbWFTdGF0ZUNoYW5nZShwYWRhcHRlcikpIHsKLQkJCQkvKiAgbmFycm93IGR1cmF0aW9uIGZvciBXaUZpICovCi0JCQkJQlRETV9TZXRGdzNhKHBhZGFwdGVyLCAweGQzLCAweGEsIDB4YSwgMHgwLCAweDU4KTsgLyogbmFycm93IGR1cmF0aW9uIGZvciBXaUZpICovCi0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAxMDogLyogIGZvciBXaUZpIGNvbm5lY3QgaWRsZSAmIEJUIEFDTCBidXN5IG9yIFdpRmkgQ29ubmVjdGVkLUJ1c3kgJiBCVCBpcyBJbnF1aXJ5ICovCi0JCQlpZiAoYnRkbV9JczFBbnRQc1RkbWFTdGF0ZUNoYW5nZShwYWRhcHRlcikpCi0JCQkJQlRETV9TZXRGdzNhKHBhZGFwdGVyLCAweDEzLCAweGEsIDB4YSwgMHgwLCAweDQwKTsKLQkJCWJyZWFrOwotCQljYXNlIDExOiAvKiAgQUNMIGhpZ2gtcmV0cnkgdHlwZSAtIDMgKi8KLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkgewotCQkJCS8qICBuYXJyb3cgZHVyYXRpb24gZm9yIFdpRmkgKi8KLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4ZDMsIDB4MDUsIDB4MDUsIDB4MDAsIDB4NTgpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMTI6IC8qICBmb3IgV2lGaSBDb25uZWN0ZWQtQnVzeSAmIEJUIGlzIENvbm5lY3RlZC1JZGxlICovCi0JCQlpZiAoYnRkbV9JczFBbnRQc1RkbWFTdGF0ZUNoYW5nZShwYWRhcHRlcikpIHsKLQkJCQkvKiAgQWxsb3cgSGlnaC1QcmkgQlQgKi8KLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4ZWIsIDB4MGEsIDB4MDMsIDB4MzEsIDB4MTgpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMjA6IC8qICBXaUZpIG9ubHkgYnVzeSAsIFRETUEgbW9kZSBmb3IgcG93ZXIgc2F2aW5nICovCi0JCQlpZiAoYnRkbV9JczFBbnRQc1RkbWFTdGF0ZUNoYW5nZShwYWRhcHRlcikpCi0JCQkJQlRETV9TZXRGdzNhKHBhZGFwdGVyLCAweDEzLCAweDI1LCAweDI1LCAweDAwLCAweDAwKTsKLQkJCWJyZWFrOwotCQljYXNlIDI3OiAvKiAgV2lGaSBESENQL1NpdGUgU3VydmV5ICYgQlQgU0NPIGJ1c3kgKi8KLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkKLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4YTMsIDB4MjUsIDB4MDMsIDB4MzEsIDB4OTgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjg6IC8qICBXaUZpIERIQ1AvU2l0ZSBTdXJ2ZXkgJiBCVCBpZGxlICovCi0JCQlpZiAoYnRkbV9JczFBbnRQc1RkbWFTdGF0ZUNoYW5nZShwYWRhcHRlcikpCi0JCQkJQlRETV9TZXRGdzNhKHBhZGFwdGVyLCAweDY5LCAweDI1LCAweDAzLCAweDMxLCAweDAwKTsKLQkJCWJyZWFrOwotCQljYXNlIDI5OiAvKiAgV2lGaSBESENQL1NpdGUgU3VydmV5ICYgQlQgQUNMIGJ1c3kgKi8KLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkgewotCQkJCUJURE1fU2V0RnczYShwYWRhcHRlciwgMHhlYiwgMHgxYSwgMHgxYSwgMHgwMSwgMHgxOCk7Ci0JCQkJcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIDB4NmMwLCAweDVhZmE1YWZhKTsKLQkJCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHg2YzQsIDB4NWFmYTVhZmEpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMzA6IC8qICBXaUZpIGlkbGUgJiBCVCBJbnF1aXJ5ICovCi0JCQlpZiAoYnRkbV9JczFBbnRQc1RkbWFTdGF0ZUNoYW5nZShwYWRhcHRlcikpCi0JCQkJQlRETV9TZXRGdzNhKHBhZGFwdGVyLCAweDkzLCAweDE1LCAweDAzLCAweDE0LCAweDAwKTsKLQkJCWJyZWFrOwotCQljYXNlIDMxOiAgLyogIEJUIEhJRCAqLwotCQkJaWYgKGJ0ZG1fSXMxQW50UHNUZG1hU3RhdGVDaGFuZ2UocGFkYXB0ZXIpKQotCQkJCUJURE1fU2V0RnczYShwYWRhcHRlciwgMHhkMywgMHgxYSwgMHgxYSwgMHgwMCwgMHg1OCk7Ci0JCQlicmVhazsKLQkJY2FzZSAzMjogIC8qICBCVCBTQ08gJiBJbnF1aXJ5ICovCi0JCQlpZiAoYnRkbV9JczFBbnRQc1RkbWFTdGF0ZUNoYW5nZShwYWRhcHRlcikpCi0JCQkJQlRETV9TZXRGdzNhKHBhZGFwdGVyLCAweGFiLCAweDBhLCAweDAzLCAweDExLCAweDk4KTsKLQkJCWJyZWFrOwotCQljYXNlIDMzOiAgLyogIEJUIFNDTyAmIFdpRmkgc2l0ZSBzdXJ2ZXkgKi8KLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkKLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4YTMsIDB4MjUsIDB4MDMsIDB4MzAsIDB4OTgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzQ6ICAvKiAgQlQgSElEICYgV2lGaSBzaXRlIHN1cnZleSAqLwotCQkJaWYgKGJ0ZG1fSXMxQW50UHNUZG1hU3RhdGVDaGFuZ2UocGFkYXB0ZXIpKQotCQkJCUJURE1fU2V0RnczYShwYWRhcHRlciwgMHhkMywgMHgxYSwgMHgxYSwgMHgwMCwgMHgxOCk7Ci0JCQlicmVhazsKLQkJY2FzZSAzNTogIC8qICBCVCBISUQgJiBXaUZpIENvbm5lY3RpbmcgKi8KLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkKLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4ZTMsIDB4MWEsIDB4MWEsIDB4MDAsIDB4MTgpOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiAgZGlzYWJsZSBQUy1URE1BICovCi0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlIDg6Ci0JCQlpZiAoYnRkbV9JczFBbnRQc1RkbWFTdGF0ZUNoYW5nZShwYWRhcHRlcikpIHsKLQkJCQkvKiAgQW50ZW5uYSBjb250cm9sIGJ5IFBUQSwgMHg4NzAgPSAweDMxMCAqLwotCQkJCUJURE1fU2V0RnczYShwYWRhcHRlciwgMHg4LCAweDAsIDB4MCwgMHgwLCAweDApOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMDoKLQkJZGVmYXVsdDoKLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkgewotCQkJCS8qICBBbnRlbm5hIGNvbnRyb2wgYnkgUFRBLCAweDg3MCA9IDB4MzEwICovCi0JCQkJQlRETV9TZXRGdzNhKHBhZGFwdGVyLCAweDAsIDB4MCwgMHgwLCAweDgsIDB4MCk7Ci0JCQl9Ci0JCQkvKiAgU3dpdGNoIEFudGVubmEgdG8gQlQgKi8KLQkJCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCAweDg2MCwgMHgyMTApOwotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCAweDg2MCA9IDB4MjEwLCBTd2l0Y2ggQW50ZW5uYSB0byBCVFxuIikpOwotCQkJYnJlYWs7Ci0JCWNhc2UgOToKLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkgewotCQkJCS8qICBBbnRlbm5hIGNvbnRyb2wgYnkgUFRBLCAweDg3MCA9IDB4MzEwICovCi0JCQkJQlRETV9TZXRGdzNhKHBhZGFwdGVyLCAweDAsIDB4MCwgMHgwLCAweDgsIDB4MCk7Ci0JCQl9Ci0JCQkvKiAgU3dpdGNoIEFudGVubmEgdG8gV2lGaSAqLwotCQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIDB4ODYwLCAweDExMCk7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIDB4ODYwID0gMHgxMTAsIFN3aXRjaCBBbnRlbm5hIHRvIFdpRmlcbiIpKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBDdXJyZW50IFRETUEoJXMsICVkKVxuIiwKLQkJcEJ0ZG04NzIzLT5iQ3VyUHNUZG1hT24/Ik9OIjoiT0ZGIiwgcEJ0ZG04NzIzLT5jdXJQc1RkbWEpKTsKLQotCS8qICB1cGRhdGUgcHJlIHN0YXRlICovCi0JcEJ0ZG04NzIzLT5iUHJlUHNUZG1hT24gPSBwQnRkbTg3MjMtPmJDdXJQc1RkbWFPbjsKLQlwQnRkbTg3MjMtPnByZVBzVGRtYSA9IHBCdGRtODcyMy0+Y3VyUHNUZG1hOwotfQotCi1zdGF0aWMgdm9pZAotX2J0ZG1fMUFudFNldFBTVERNQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBiUFNFbiwgdTggc21hcnRwcywKLQkJICAgIHU4IHBzT3B0aW9uLCB1OCBiVERNQU9uLCB1OCB0ZG1hVHlwZSkKLXsKLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3JjdHJsOwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMWFudCAqcEJ0ZG04NzIzOwotCXU4IHBzTW9kZTsKLQl1OCBiU3dpdGNoUFM7Ci0KLQlpZiAoIWNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSAmJgotCSAgICAoZ2V0X2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdikgIT0gV0lGSV9OVUxMX1NUQVRFKSkgewotCQlidGRtXzFBbnRQc1RkbWEocGFkYXB0ZXIsIGJURE1BT24sIHRkbWFUeXBlKTsKLQkJcmV0dXJuOwotCX0KLQlwc09wdGlvbiAmPSB+QklUKDApOwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkoIltCVENvZXhdLCBTZXQgTFBTKCVzLCAlZCkgVERNQSglcywgJWQpXG4iLAotCQliUFNFbiA9PSB0cnVlPyJPTiI6Ik9GRiIsIHBzT3B0aW9uLAotCQliVERNQU9uID09IHRydWU/Ik9OIjoiT0ZGIiwgdGRtYVR5cGUpKTsKLQotCXB3cmN0cmwgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlwQnRkbTg3MjMgPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTFBbnQ7Ci0KLQlpZiAoYlBTRW4pIHsKLQkJaWYgKHBCdGRtODcyMy0+YldpRmlIYWx0KSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEVuYWJsZSBQUyBGYWlsLCBXaUZpIGluIEhhbHQhIVxuIikpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHB3cmN0cmwtPmJJblN1c3BlbmQpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgRW5hYmxlIFBTIEZhaWwsIFdpRmkgaW4gU3VzcGVuZCEhXG4iKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAocGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEVuYWJsZSBQUyBGYWlsLCBXaUZpIGRyaXZlciBzdG9wcGVkISFcbiIpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBFbmFibGUgUFMgRmFpbCwgV2lGaSBTdXJwcmlzZSBSZW1vdmVkISFcbiIpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXBzTW9kZSA9IFBTX01PREVfTUlOOwotCX0gZWxzZSB7Ci0JCXBzTW9kZSA9IFBTX01PREVfQUNUSVZFOwotCQlwc09wdGlvbiA9IDA7Ci0JfQotCi0JaWYgKHBzTW9kZSAhPSBwd3JjdHJsLT5wd3JfbW9kZSkgewotCQliU3dpdGNoUFMgPSB0cnVlOwotCX0gZWxzZSBpZiAocHNNb2RlICE9IFBTX01PREVfQUNUSVZFKSB7Ci0JCWlmIChwc09wdGlvbiAhPSBwd3JjdHJsLT5iY25fYW50X21vZGUpCi0JCQliU3dpdGNoUFMgPSB0cnVlOwotCQllbHNlIGlmIChzbWFydHBzICE9IHB3cmN0cmwtPnNtYXJ0X3BzKQotCQkJYlN3aXRjaFBTID0gdHJ1ZTsKLQkJZWxzZQotCQkJYlN3aXRjaFBTID0gZmFsc2U7Ci0JfSBlbHNlIHsKLQkJYlN3aXRjaFBTID0gZmFsc2U7Ci0JfQotCi0JaWYgKGJTd2l0Y2hQUykgewotCQkvKiAgZGlzYWJsZSBURE1BICovCi0JCWlmIChwQnRkbTg3MjMtPmJDdXJQc1RkbWFPbikgewotCQkJaWYgKCFiVERNQU9uKSB7Ci0JCQkJYnRkbV8xQW50UHNUZG1hKHBhZGFwdGVyLCBmYWxzZSwgdGRtYVR5cGUpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIXJ0bDg3MjNhX0JUX2VuYWJsZWQocGFkYXB0ZXIpIHx8Ci0JCQkJICAgIChwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5jMmhCdEluZm8gPT0gQlRfSU5GT19TVEFURV9OT19DT05ORUNUSU9OKSB8fAotCQkJCSAgICAocEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYzJoQnRJbmZvID09IEJUX0lORk9fU1RBVEVfQ09OTkVDVF9JRExFKSB8fAotCQkJCSAgICAodGRtYVR5cGUgPT0gMjkpKQotCQkJCQlidGRtXzFBbnRQc1RkbWEocGFkYXB0ZXIsIGZhbHNlLCA5KTsKLQkJCQllbHNlCi0JCQkJCWJ0ZG1fMUFudFBzVGRtYShwYWRhcHRlciwgZmFsc2UsIDApOwotCQkJfQotCQl9Ci0KLQkJLyogIGNoYW5nZSBQb3dlciBTYXZlIFN0YXRlICovCi0JCWJ0ZG1fMUFudFNldFBTTW9kZShwYWRhcHRlciwgYlBTRW4sIHNtYXJ0cHMsIHBzT3B0aW9uKTsKLQl9Ci0KLQlidGRtXzFBbnRQc1RkbWEocGFkYXB0ZXIsIGJURE1BT24sIHRkbWFUeXBlKTsKLX0KLQotc3RhdGljIHZvaWQKLWJ0ZG1fMUFudFNldFBTVERNQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBiUFNFbiwKLQkJICAgdTggcHNPcHRpb24sIHU4IGJURE1BT24sIHU4IHRkbWFUeXBlKQotewotCV9idGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIGJQU0VuLCAwLCBwc09wdGlvbiwgYlRETUFPbiwgdGRtYVR5cGUpOwotfQotCi1zdGF0aWMgdm9pZCBidGRtXzFBbnRXaWZpUGFyYUFkanVzdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBiRW5hYmxlKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBidGRtXzg3MjNhXzFhbnQgKnBCdGRtODcyMyA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMUFudDsKLQotCWlmIChiRW5hYmxlKSB7Ci0JCXBCdGRtODcyMy0+Y3VyV2lmaVBhcmEgPSAxOwotCQlpZiAocEJ0ZG04NzIzLT5wcmVXaWZpUGFyYSAhPSBwQnRkbTg3MjMtPmN1cldpZmlQYXJhKQotCQkJQlRETV9TZXRTd1BlbmFsdHlUeFJhdGVBZGFwdGl2ZShwYWRhcHRlciwgQlRfVFhfUkFURV9BREFQVElWRV9MT1dfUEVOQUxUWSk7Ci0JfSBlbHNlIHsKLQkJcEJ0ZG04NzIzLT5jdXJXaWZpUGFyYSA9IDI7Ci0JCWlmIChwQnRkbTg3MjMtPnByZVdpZmlQYXJhICE9IHBCdGRtODcyMy0+Y3VyV2lmaVBhcmEpCi0JCQlCVERNX1NldFN3UGVuYWx0eVR4UmF0ZUFkYXB0aXZlKHBhZGFwdGVyLCBCVF9UWF9SQVRFX0FEQVBUSVZFX05PUk1BTCk7Ci0JfQotCi19Ci0KLXN0YXRpYyB2b2lkIGJ0ZG1fMUFudFB0YVBhcmFSZWxvYWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQkvKiAgUFRBIHBhcmFtZXRlciAqLwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIDB4NmNjLCAweDApOwkJLyogIDEtQW50IGNvZXggKi8KLQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHg2YzgsIDB4ZmZmZik7CS8qICB3aWZpIGJyZWFrIHRhYmxlICovCi0JcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIDB4NmM0LCAweDU1NTU1NTU1KTsJLyogIGNvZXggdGFibGUgKi8KLQotCS8qICBBbnRlbm5hIHN3aXRjaCBjb250cm9sIHBhcmFtZXRlciAqLwotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweDg1OCwgMHhhYWFhYWFhYSk7Ci0JaWYgKElTXzg3MjNBX0FfQ1VUKEdFVF9IQUxfREFUQShwYWRhcHRlciktPlZlcnNpb25JRCkpIHsKLQkJLyogIFNQRFQoY29ubmVjdGVkIHdpdGggVFJTVykgY29udHJvbCBieSBoYXJkd2FyZSBQVEEgKi8KLQkJcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIDB4ODcwLCAweDApOwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCAweDQwLCAweDI0KTsKLQl9IGVsc2UgewotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCAweDQwLCAweDIwKTsKLQkJLyogIHNldCBhbnRlbm5hIGF0IGJ0IHNpZGUgaWYgQU5UU1cgaXMgc29mdHdhcmUgY29udHJvbCAqLwotCQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgMHg4NjAsIDB4MjEwKTsKLQkJLyogIFNQRFQoY29ubmVjdGVkIHdpdGggVFJTVykgY29udHJvbCBieSBoYXJkd2FyZSBQVEEgKi8KLQkJcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIDB4ODcwLCAweDMwMCk7Ci0JCS8qICBBTlRTVyBrZWVwIGJ5IEdOVF9CVCAqLwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHg4NzQsIDB4MjI4MDQwMDApOwotCX0KLQotCS8qICBjb2V4aXN0ZW5jZSBwYXJhbWV0ZXJzICovCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgMHg3NzgsIDB4MSk7CS8qICBlbmFibGUgUlRLIG1vZGUgUFRBICovCi0KLQkvKiAgQlQgZG9uJ3QgaWdub3JlIFdMQU5fQWN0ICovCi0JYnRkbV9TZXRGd0lnbm9yZVdsYW5BY3QocGFkYXB0ZXIsIGZhbHNlKTsKLX0KLQotLyoKLSAqIFJldHVybgotICoxOiB1cGdyYWRlIChhZGQgV2lGaSBkdXJhdGlvbiB0aW1lKQotICowOiBrZWVwCi0gKi0xOiBkb3duZ3JhZGUgKGFkZCBCVCBkdXJhdGlvbiB0aW1lKQotICovCi1zdGF0aWMgczggYnRkbV8xQW50VGRtYUp1ZGdlbWVudChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCByZXRyeSkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXN0cnVjdCBidGRtXzg3MjNhXzFhbnQgKnBCdGRtODcyMzsKLQlzdGF0aWMgczggdXAsIGRuLCBtID0gMSwgV2FpdENvdW50OwotCXM4IHJldDsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlwQnRkbTg3MjMgPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTFBbnQ7Ci0JcmV0ID0gMDsKLQotCWlmIChwQnRkbTg3MjMtPnBzVGRtYU1vbml0b3JDbnQgPT0gMCkgewotCQl1cCA9IDA7Ci0JCWRuID0gMDsKLQkJbSA9IDE7Ci0JCVdhaXRDb3VudCA9IDA7Ci0JfSBlbHNlIHsKLQkJV2FpdENvdW50Kys7Ci0JfQotCi0JaWYgKHJldHJ5ID09IDApIHsKLQkvKiAgbm8gcmV0cnkgaW4gdGhlIGxhc3QgMi1zZWNvbmQgZHVyYXRpb24gKi8KLQkJdXArKzsKLQkJZG4tLTsKLQkJaWYgKGRuIDwgMCkKLQkJCWRuID0gMDsKLQkJaWYgKHVwID49IDMqbSkgewotCQkJLyogIHJldHJ5ID0gMCBpbiBjb25zZWN1dGl2ZSAzbSooMnMpLCBhZGQgV2lGaSBkdXJhdGlvbiAqLwotCQkJcmV0ID0gMTsKLQkJCXVwID0gMDsKLQkJCWRuID0gMDsKLQkJCVdhaXRDb3VudCA9IDA7Ci0JCX0KLQl9IGVsc2UgaWYgKHJldHJ5IDw9IDMpIHsKLQkJLyogIHJldHJ5PD0gMyBpbiB0aGUgbGFzdCAyLXNlY29uZCBkdXJhdGlvbiAqLwotCQl1cC0tOwotCQlkbisrOwotCQlpZiAodXAgPCAwKQotCQkJdXAgPSAwOwotCi0JCWlmIChkbiA9PSAyKSB7Ci0JCQkvKiAgcmV0cnk8PSAzIGluIGNvbnNlY3V0aXZlIDIqKDJzKSwgbWludXMgV2lGaSBkdXJhdGlvbiAoYWRkIEJUIGR1cmF0aW9uKSAqLwotCQkJcmV0ID0gLTE7Ci0KLQkJCS8qICByZWNvcmQgaG93IG1hbnkgdGltZSBkb3duZ3JhZCBXaUZpIGR1cmF0aW9uICovCi0JCQlpZiAoV2FpdENvdW50IDw9IDIpCi0JCQkJbSsrOwotCQkJZWxzZQotCQkJCW0gPSAxOwotCQkJLyogIHRoZSBtYXggbnVtYmVyIG9mIG0gaXMgMjAgKi8KLQkJCS8qICB0aGUgbG9uZ2VzdCB0aW1lIG9mIHVwZ3JhZGUgV2lGaSBkdXJhdGlvbiBpcyAyMCozKjJzID0gMTIwcyAqLwotCQkJaWYgKG0gPj0gMjApCi0JCQkJbSA9IDIwOwotCQkJdXAgPSAwOwotCQkJZG4gPSAwOwotCQkJV2FpdENvdW50ID0gMDsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qICByZXRyeSBjb3VudCA+IDMgKi8KLQkJLyogIHJldHJ5PjMsIG1pbnVzIFdpRmkgZHVyYXRpb24gKGFkZCBCVCBkdXJhdGlvbikgKi8KLQkJcmV0ID0gLTE7Ci0KLQkJLyogIHJlY29yZCBob3cgbWFueSB0aW1lIGRvd25ncmFkIFdpRmkgZHVyYXRpb24gKi8KLQkJaWYgKFdhaXRDb3VudCA9PSAxKQotCQkJbSsrOwotCQllbHNlCi0JCQltID0gMTsKLQkJaWYgKG0gPj0gMjApCi0JCQltID0gMjA7Ci0KLQkJdXAgPSAwOwotCQlkbiA9IDA7Ci0JCVdhaXRDb3VudCA9IDA7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0ZG1fMUFudFRkbWFEdXJhdGlvbkFkanVzdEZvckFDTChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBidGRtXzg3MjNhXzFhbnQgKnBCdGRtODcyMyA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMUFudDsKLQotCWlmIChwQnRkbTg3MjMtPnBzVGRtYUdsb2JhbENudCAhPSBwQnRkbTg3MjMtPnBzVGRtYU1vbml0b3JDbnQpIHsKLQkJcEJ0ZG04NzIzLT5wc1RkbWFNb25pdG9yQ250ID0gMDsKLQkJcEJ0ZG04NzIzLT5wc1RkbWFHbG9iYWxDbnQgPSAwOwotCX0KLQlpZiAocEJ0ZG04NzIzLT5wc1RkbWFNb25pdG9yQ250ID09IDApIHsKLQkJYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCB0cnVlLCAwLCB0cnVlLCAyKTsKLQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAyOwotCX0gZWxzZSB7Ci0JCS8qICBOb3cgd2Ugb25seSBoYXZlIDQgbGV2ZWwgUHMgVGRtYSwgKi8KLQkJLyogIGlmIHRoYXQncyBub3QgdGhlIGZvbGxvd2luZyA0IGxldmVsKHdpbGwgY2hhbmdlZCBieSB3aWZpIHNjYW4sIGRoY3AuLi4pLCAqLwotCQkvKiAgdGhlbiB3ZSBoYXZlIHRvIGFkanVzdCBpdCBiYWNrIHRvIHRoZSBwcmV2aW91cyByZWNvcmQgb25lLiAqLwotCQlpZiAoKHBCdGRtODcyMy0+Y3VyUHNUZG1hICE9IDEpICYmCi0JCSAgICAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgIT0gMikgJiYKLQkJICAgIChwQnRkbTg3MjMtPmN1clBzVGRtYSAhPSA5KSAmJgotCQkgICAgKHBCdGRtODcyMy0+Y3VyUHNUZG1hICE9IDExKSkgewotCQkJYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCB0cnVlLCAwLCB0cnVlLCBwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzMzIganVkZ2U7Ci0KLQkJCWp1ZGdlID0gYnRkbV8xQW50VGRtYUp1ZGdlbWVudChwYWRhcHRlciwgcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRSZXRyeUNudCk7Ci0JCQlpZiAoanVkZ2UgPT0gLTEpIHsKLQkJCQlpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMSkgewotCQkJCQkvKiAgRGVjcmVhc2UgV2lGaSBkdXJhdGlvbiBmb3IgaGlnaCBCVCByZXRyeSAqLwotCQkJCQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRJbmZvRXh0KQotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA5OwotCQkJCQllbHNlCi0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDI7Ci0JCQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgdHJ1ZSwgMCwgdHJ1ZSwgcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUpOwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMikgewotCQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIHRydWUsIDAsIHRydWUsIDkpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDk7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA5KSB7Ci0JCQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgdHJ1ZSwgMCwgdHJ1ZSwgMTEpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDExOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoanVkZ2UgPT0gMSkgewotCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMSkgewotCQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIHRydWUsIDAsIHRydWUsIDkpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDk7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA5KSB7Ci0JCQkJCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idEluZm9FeHQpCi0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDk7Ci0JCQkJCWVsc2UKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMjsKLQkJCQkJYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCB0cnVlLCAwLCB0cnVlLCBwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSk7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAyKSB7Ci0JCQkJCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idEluZm9FeHQpCi0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDk7Ci0JCQkJCWVsc2UKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTsKLQkJCQkJYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCB0cnVlLCAwLCB0cnVlLCBwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKLQkJCSgiW0JUQ29leF0sIEFDTCBjdXJyZW50IFRETUEoJXMsICVkKVxuIiwKLQkJCShwQnRkbTg3MjMtPmJDdXJQc1RkbWFPbiA/ICJPTiIgOiAiT0ZGIiksIHBCdGRtODcyMy0+Y3VyUHNUZG1hKSk7Ci0JfQotCXBCdGRtODcyMy0+cHNUZG1hTW9uaXRvckNudCsrOwotfQotCi1zdGF0aWMgdm9pZCBidGRtXzFBbnRDb2V4UHJvY2Vzc0ZvcldpZmlDb25uZWN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2OwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IGJ0X2NvZXhpc3RfODcyM2EgKnBCdENvZXg7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMWFudCAqcEJ0ZG04NzIzOwotCXU4IEJ0U3RhdGU7Ci0KLQlwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlwQnRDb2V4ID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzOwotCXBCdGRtODcyMyA9ICZwQnRDb2V4LT5idGRtMUFudDsKLQlCdFN0YXRlID0gcEJ0Q29leC0+YzJoQnRJbmZvOwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBXaUZpIGlzICVzXG4iLAotCQkJCUJURE1fSXNXaWZpQnVzeShwYWRhcHRlcik/IkJ1c3kiOiJJRExFIikpOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQlQgaXMgJXNcbiIsCi0JCQkJQnRTdGF0ZVN0cmluZ1tCdFN0YXRlXSkpOwotCi0JcGFkYXB0ZXItPnB3cmN0cmxwcml2LmJ0Y29leF9yZm9uID0gZmFsc2U7Ci0KLQlpZiAoIUJURE1fSXNXaWZpQnVzeShwYWRhcHRlcikgJiYKLQkgICAgIWNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkgJiYKLQkgICAgKEJ0U3RhdGUgPT0gQlRfSU5GT19TVEFURV9OT19DT05ORUNUSU9OIHx8Ci0JICAgICBCdFN0YXRlID09IEJUX0lORk9fU1RBVEVfQ09OTkVDVF9JRExFKSkgewotCQlzd2l0Y2ggKEJ0U3RhdGUpIHsKLQkJY2FzZSBCVF9JTkZPX1NUQVRFX05PX0NPTk5FQ1RJT046Ci0JCQlfYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCB0cnVlLCAyLCAweDI2LCBmYWxzZSwgOSk7Ci0JCQlicmVhazsKLQkJY2FzZSBCVF9JTkZPX1NUQVRFX0NPTk5FQ1RfSURMRToKLQkJCV9idGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIHRydWUsIDIsIDB4MjYsIGZhbHNlLCAwKTsKLQkJCWJyZWFrOwotCQl9Ci0JfSBlbHNlIHsKLQkJc3dpdGNoIChCdFN0YXRlKSB7Ci0JCWNhc2UgQlRfSU5GT19TVEFURV9OT19DT05ORUNUSU9OOgotCQljYXNlIEJUX0lORk9fU1RBVEVfQ09OTkVDVF9JRExFOgotCQkJLyogIFdpRmkgaXMgQnVzeSAqLwotCQkJYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCBmYWxzZSwgMCwgdHJ1ZSwgNSk7Ci0JCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHg2YzAsIDB4NWE1YTVhNWEpOwotCQkJcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIDB4NmM0LCAweDVhNWE1YTVhKTsKLQkJCWJyZWFrOwotCQljYXNlIEJUX0lORk9fU1RBVEVfQUNMX0lOUV9PUl9QQUc6Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCQkJKCJbQlRDb2V4XSwgQlQgUFJPRklMRSBpcyAiCi0JCQkJICJCVF9JTkZPX1NUQVRFX0FDTF9JTlFfT1JfUEFHXG4iKSk7Ci0JCWNhc2UgQlRfSU5GT19TVEFURV9JTlFfT1JfUEFHOgotCQkJcGFkYXB0ZXItPnB3cmN0cmxwcml2LmJ0Y29leF9yZm9uID0gdHJ1ZTsKLQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgdHJ1ZSwgMCwgdHJ1ZSwgMzApOwotCQkJYnJlYWs7Ci0JCWNhc2UgQlRfSU5GT19TVEFURV9TQ09fT05MWV9CVVNZOgotCQljYXNlIEJUX0lORk9fU1RBVEVfQUNMX1NDT19CVVNZOgotCQkJaWYgKHRydWUgPT0gcEJ0Q29leC0+YkMyaEJ0SW5xdWlyeVBhZ2UpCi0JCQkJYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCBmYWxzZSwgMCwKLQkJCQkJCSAgIHRydWUsIDMyKTsKLQkJCWVsc2UgewotI2lmZGVmIEJUQ09FWF9DTUNDX1RFU1QKLQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIGZhbHNlLCAwLAotCQkJCQkJICAgdHJ1ZSwgMjMpOwotI2Vsc2UgLyogICFCVENPRVhfQ01DQ19URVNUICovCi0JCQkJYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCBmYWxzZSwgMCwKLQkJCQkJCSAgIGZhbHNlLCA4KTsKLQkJCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHg2YzAsIDB4NWE1YTVhNWEpOwotCQkJCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweDZjNCwgMHg1YTVhNWE1YSk7Ci0jZW5kaWYgLyogICFCVENPRVhfQ01DQ19URVNUICovCi0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBCVF9JTkZPX1NUQVRFX0FDTF9PTkxZX0JVU1k6Ci0JCQlwYWRhcHRlci0+cHdyY3RybHByaXYuYnRjb2V4X3Jmb24gPSB0cnVlOwotCQkJaWYgKHBCdENvZXgtPmMyaEJ0UHJvZmlsZSA9PSBCVF9JTkZPX0hJRCkgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKLQkJCQkJKCJbQlRDb2V4XSwgQlQgUFJPRklMRSBpcyBISURcbiIpKTsKLQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIHRydWUsIDAsIHRydWUsIDMxKTsKLQkJCX0gZWxzZSBpZiAocEJ0Q29leC0+YzJoQnRQcm9maWxlID09IEJUX0lORk9fRlRQKSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkJCQkoIltCVENvZXhdLCBCVCBQUk9GSUxFIGlzIEZUUC9PUFBcbiIpKTsKLQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIHRydWUsIDAsIHRydWUsIDMpOwotCQkJfSBlbHNlIGlmIChwQnRDb2V4LT5jMmhCdFByb2ZpbGUgPT0gKEJUX0lORk9fQTJEUHxCVF9JTkZPX0ZUUCkpIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCQkJCSgiW0JUQ29leF0sIEJUIFBST0ZJTEUgaXMgQTJEUF9GVFBcbiIpKTsKLQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIHRydWUsIDAsIHRydWUsIDExKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHBCdENvZXgtPmMyaEJ0UHJvZmlsZSA9PSBCVF9JTkZPX0EyRFApCi0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKLQkJCQkJCSgiW0JUQ29leF0sIEJUIFBST0ZJTEUgaXMgIgotCQkJCQkJICJBMkRQXG4iKSk7Ci0JCQkJZWxzZQotCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCQkJCQkoIltCVENvZXhdLCBCVCBQUk9GSUxFIGlzICIKLQkJCQkJCSAiVU5LTk9XTigweCUwMlgpISBVc2UgQTJEUCAiCi0JCQkJCQkgIlByb2ZpbGVcbiIsCi0JCQkJCQkgcEJ0Q29leC0+YzJoQnRQcm9maWxlKSk7Ci0JCQkJYnRkbV8xQW50VGRtYUR1cmF0aW9uQWRqdXN0Rm9yQUNMKHBhZGFwdGVyKTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcEJ0ZG04NzIzLT5wc1RkbWFHbG9iYWxDbnQrKzsKLX0KLQotc3RhdGljIHZvaWQKLWJ0ZG1fMUFudFVwZGF0ZUhhbFJBTWFzayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgbWFjX2lkLCB1MzIgZmlsdGVyKQotewotCXU4IGluaXRfcmF0ZSA9IDA7Ci0JdTggcmFpZCwgYXJnOwotCXUzMiBtYXNrOwotCXU4IHNob3J0R0lyYXRlID0gZmFsc2U7Ci0JaW50IHN1cHBvcnRSYXRlTnVtID0gMDsKLQlzdHJ1Y3Qgc3RhX2luZm8JKnBzdGE7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQlzdHJ1Y3QgZG1fcHJpdiAqcGRtcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQ7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbzsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqY3VyX25ldHdvcms7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sICVzLCBNQUNJRCA9JWQsIGZpbHRlciA9IDB4JTA4eCEhXG4iLAotCQkJCV9fZnVuY19fLCBtYWNfaWQsIGZpbHRlcikpOwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKLQlwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0JcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQljdXJfbmV0d29yayA9ICZwbWxtZWluZm8tPm5ldHdvcms7Ci0KLQlpZiAobWFjX2lkID49IE5VTV9TVEEpIHsgLyogQ0FNX1NJWkUgKi8KLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCAlcywgTUFDSUQgPSVkIGlsbGVnYWwhIVxuIiwKLQkJCQkJX19mdW5jX18sIG1hY19pZCkpOwotCQlyZXR1cm47Ci0JfQotCi0JcHN0YSA9IHBtbG1laW5mby0+Rldfc3RhX2luZm9bbWFjX2lkXS5wc3RhOwotCWlmICghcHN0YSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sICVzLCBDYW4ndCBmaW5kIHN0YXRpb24hIVxuIiwKLQkJCQkJX19mdW5jX18pKTsKLQkJcmV0dXJuOwotCX0KLQotCXJhaWQgPSBwc3RhLT5yYWlkOwotCi0Jc3dpdGNoIChtYWNfaWQpIHsKLQljYXNlIDA6LyogIGZvciBpbmZyYSBtb2RlICovCi0JCXN1cHBvcnRSYXRlTnVtID0KLQkJCXJ0d19nZXRfcmF0ZXNldF9sZW4yM2EoY3VyX25ldHdvcmstPlN1cHBvcnRlZFJhdGVzKTsKLQkJbWFzayA9IHVwZGF0ZV9zdXBwb3J0ZWRfcmF0ZTIzYShjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMsCi0JCQkJCQlzdXBwb3J0UmF0ZU51bSk7Ci0JCW1hc2sgfD0gKHBtbG1laW5mby0+SFRfZW5hYmxlKSA/Ci0JCQl1cGRhdGVfTVNDX3JhdGUyM2EoJnBtbG1laW5mby0+aHRfY2FwKTowOwotCQlpZiAoc3VwcG9ydF9zaG9ydF9HSTIzYShwYWRhcHRlciwgJnBtbG1laW5mby0+aHRfY2FwKSkKLQkJCXNob3J0R0lyYXRlID0gdHJ1ZTsKLQkJYnJlYWs7Ci0JY2FzZSAxOi8qIGZvciBicm9hZGNhc3QvbXVsdGljYXN0ICovCi0JCXN1cHBvcnRSYXRlTnVtID0gcnR3X2dldF9yYXRlc2V0X2xlbjIzYSgKLQkJCXBtbG1laW5mby0+Rldfc3RhX2luZm9bbWFjX2lkXS5TdXBwb3J0ZWRSYXRlcyk7Ci0JCW1hc2sgPSB1cGRhdGVfYmFzaWNfcmF0ZTIzYShjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMsCi0JCQkJCSAgICBzdXBwb3J0UmF0ZU51bSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6IC8qIGZvciBlYWNoIHN0YSBpbiBJQlNTICovCi0JCXN1cHBvcnRSYXRlTnVtID0gcnR3X2dldF9yYXRlc2V0X2xlbjIzYSgKLQkJCXBtbG1laW5mby0+Rldfc3RhX2luZm9bbWFjX2lkXS5TdXBwb3J0ZWRSYXRlcyk7Ci0JCW1hc2sgPSB1cGRhdGVfc3VwcG9ydGVkX3JhdGUyM2EoY3VyX25ldHdvcmstPlN1cHBvcnRlZFJhdGVzLAotCQkJCQkJc3VwcG9ydFJhdGVOdW0pOwotCQlicmVhazsKLQl9Ci0JbWFzayB8PSAoKHJhaWQ8PDI4KSYweGYwMDAwMDAwKTsKLQltYXNrICY9IDB4ZmZmZmZmZmY7Ci0JbWFzayAmPSB+ZmlsdGVyOwotCWluaXRfcmF0ZSA9IGdldF9oaWdoZXN0X3JhdGVfaWR4MjNhKG1hc2spJjB4M2Y7Ci0KLQlhcmcgPSBtYWNfaWQmMHgxZjsvKiBNQUNJRCAqLwotCWFyZyB8PSBCSVQoNyk7Ci0JaWYgKHRydWUgPT0gc2hvcnRHSXJhdGUpCi0JCWFyZyB8PSBCSVQoNSk7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCSgiW0JUQ29leF0sIFVwZGF0ZSBGVyBSQUlEIGVudHJ5LCBNQVNLID0gMHglMDh4LCAiCi0JCSAiYXJnID0gMHglMDJ4XG4iLCBtYXNrLCBhcmcpKTsKLQotCXJ0bDg3MjNhX3NldF9yYWlkX2NtZChwYWRhcHRlciwgbWFzaywgYXJnKTsKLQotCXBzdGEtPmluaXRfcmF0ZSA9IGluaXRfcmF0ZTsKLQlwZG1wcml2LT5JTklEQVRBX1JBVEVbbWFjX2lkXSA9IGluaXRfcmF0ZTsKLX0KLQotc3RhdGljIHZvaWQKLWJ0ZG1fMUFudFVwZGF0ZUhhbFJBTWFza0ZvclNDTyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBmb3JjZVVwZGF0ZSkKLXsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8xYW50ICpwQnRkbTg3MjM7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdjsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqY3VyX25ldHdvcms7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCXUzMiBtYWNpZDsKLQl1MzIgZmlsdGVyID0gMDsKLQotCXBCdGRtODcyMyA9ICZHRVRfSEFMX0RBVEEocGFkYXB0ZXIpLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0xQW50OwotCi0JaWYgKHBCdGRtODcyMy0+YlJBQ2hhbmdlZCA9PSB0cnVlICYmIGZvcmNlVXBkYXRlID09IGZhbHNlKQotCQlyZXR1cm47Ci0KLQlwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQljdXJfbmV0d29yayA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXYubWxtZXh0X2luZm8ubmV0d29yazsKLQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBjdXJfbmV0d29yay0+TWFjQWRkcmVzcyk7Ci0JbWFjaWQgPSBwc3RhLT5tYWNfaWQ7Ci0KLQlmaWx0ZXIgfD0gQklUKF8xTV9SQVRFXyk7Ci0JZmlsdGVyIHw9IEJJVChfMk1fUkFURV8pOwotCWZpbHRlciB8PSBCSVQoXzVNX1JBVEVfKTsKLQlmaWx0ZXIgfD0gQklUKF8xMU1fUkFURV8pOwotCWZpbHRlciB8PSBCSVQoXzZNX1JBVEVfKTsKLQlmaWx0ZXIgfD0gQklUKF85TV9SQVRFXyk7Ci0KLQlidGRtXzFBbnRVcGRhdGVIYWxSQU1hc2socGFkYXB0ZXIsIG1hY2lkLCBmaWx0ZXIpOwotCi0JcEJ0ZG04NzIzLT5iUkFDaGFuZ2VkID0gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQgYnRkbV8xQW50UmVjb3ZlckhhbFJBTWFzayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBidGRtXzg3MjNhXzFhbnQgKnBCdGRtODcyMzsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2OwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpjdXJfbmV0d29yazsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0KLQlwQnRkbTg3MjMgPSAmR0VUX0hBTF9EQVRBKHBhZGFwdGVyKS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMUFudDsKLQotCWlmIChwQnRkbTg3MjMtPmJSQUNoYW5nZWQgPT0gZmFsc2UpCi0JCXJldHVybjsKLQotCXBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCWN1cl9uZXR3b3JrID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdi5tbG1leHRfaW5mby5uZXR3b3JrOwotCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIGN1cl9uZXR3b3JrLT5NYWNBZGRyZXNzKTsKLQotCVVwZGF0ZV9SQV9FbnRyeTIzYShwYWRhcHRlciwgcHN0YSk7Ci0KLQlwQnRkbTg3MjMtPmJSQUNoYW5nZWQgPSBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQKLWJ0ZG1fMUFudEJUU3RhdGVDaGFuZ2VIYW5kbGVyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICBlbnVtIGJ0X3N0YXRlXzFhbnQgb2xkU3RhdGUsCi0JCQkgICAgICBlbnVtIGJ0X3N0YXRlXzFhbnQgbmV3U3RhdGUpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwaGFsZGF0YTsKLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEJUIHN0YXRlIGNoYW5nZSwgJXMgPT4gJXNcbiIsCi0JCQkJQnRTdGF0ZVN0cmluZ1tvbGRTdGF0ZV0sCi0JCQkJQnRTdGF0ZVN0cmluZ1tuZXdTdGF0ZV0pKTsKLQotCS8qICBCVCBkZWZhdWx0IGlnbm9yZSB3bGFuIGFjdGl2ZSwgKi8KLQkvKiAgV2lGaSBNVVNUIGRpc2FibGUgdGhpcyB3aGVuIEJUIGlzIGVuYWJsZSAqLwotCWlmIChuZXdTdGF0ZSA+IEJUX0lORk9fU1RBVEVfRElTQUJMRUQpCi0JCWJ0ZG1fU2V0RndJZ25vcmVXbGFuQWN0KHBhZGFwdGVyLCBmYWxzZSk7Ci0KLQlpZiAoKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSkgJiYKLQkgICAgKEJURE1fSXNXaWZpQ29ubmVjdGlvbkV4aXN0KHBhZGFwdGVyKSkpIHsKLQkJaWYgKChuZXdTdGF0ZSA9PSBCVF9JTkZPX1NUQVRFX1NDT19PTkxZX0JVU1kpIHx8Ci0JCSAgICAobmV3U3RhdGUgPT0gQlRfSU5GT19TVEFURV9BQ0xfU0NPX0JVU1kpKSB7Ci0JCQlidGRtXzFBbnRVcGRhdGVIYWxSQU1hc2tGb3JTQ08ocGFkYXB0ZXIsIGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCS8qICBSZWNvdmVyIG9yaWdpbmFsIFJBIHNldHRpbmcgKi8KLQkJCWJ0ZG1fMUFudFJlY292ZXJIYWxSQU1hc2socGFkYXB0ZXIpOwotCQl9Ci0JfSBlbHNlIHsKLQkJcGhhbGRhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCQlwaGFsZGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMUFudC5iUkFDaGFuZ2VkID0gZmFsc2U7Ci0JfQotCi0JaWYgKG9sZFN0YXRlID09IG5ld1N0YXRlKQotCQlyZXR1cm47Ci0KLQlpZiAob2xkU3RhdGUgPT0gQlRfSU5GT19TVEFURV9BQ0xfT05MWV9CVVNZKSB7Ci0JCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqSGFsID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQkJSGFsLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0xQW50LnBzVGRtYU1vbml0b3JDbnQgPSAwOwotCQlIYWwtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTFBbnQucHNUZG1hTW9uaXRvckNudEZvclNDTyA9IDA7Ci0JfQotCi0JaWYgKChvbGRTdGF0ZSA9PSBCVF9JTkZPX1NUQVRFX1NDT19PTkxZX0JVU1kpIHx8Ci0JICAgIChvbGRTdGF0ZSA9PSBCVF9JTkZPX1NUQVRFX0FDTF9TQ09fQlVTWSkpIHsKLQkJc3RydWN0IGhhbF9kYXRhXzg3MjNhICpIYWwgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCQlIYWwtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTFBbnQucHNUZG1hTW9uaXRvckNudEZvclNDTyA9IDA7Ci0JfQotCi0JLyogIEFjdGl2ZSAyQW50IG1lY2hhbmlzbSB3aGVuIEJUIENvbm5lY3RlZCAqLwotCWlmICgob2xkU3RhdGUgPT0gQlRfSU5GT19TVEFURV9ESVNBQkxFRCkgfHwKLQkgICAgKG9sZFN0YXRlID09IEJUX0lORk9fU1RBVEVfTk9fQ09OTkVDVElPTikpIHsKLQkJaWYgKChuZXdTdGF0ZSAhPSBCVF9JTkZPX1NUQVRFX0RJU0FCTEVEKSAmJgotCQkgICAgKG5ld1N0YXRlICE9IEJUX0lORk9fU1RBVEVfTk9fQ09OTkVDVElPTikpIHsKLQkJCUJURE1fU2V0U3dSZlJ4THBmQ29ybmVyKHBhZGFwdGVyLAotCQkJCQkJQlRfUkZfUlhfTFBGX0NPUk5FUl9TSFJJTkspOwotCQkJQlRETV9BR0NUYWJsZShwYWRhcHRlciwgQlRfQUdDVEFCTEVfT04pOwotCQkJQlRETV9CQkJhY2tPZmZMZXZlbChwYWRhcHRlciwgQlRfQkJfQkFDS09GRl9PTik7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoKG5ld1N0YXRlID09IEJUX0lORk9fU1RBVEVfRElTQUJMRUQpIHx8Ci0JCSAgICAobmV3U3RhdGUgPT0gQlRfSU5GT19TVEFURV9OT19DT05ORUNUSU9OKSkgewotCQkJQlRETV9TZXRTd1JmUnhMcGZDb3JuZXIocGFkYXB0ZXIsCi0JCQkJCQlCVF9SRl9SWF9MUEZfQ09STkVSX1JFU1VNRSk7Ci0JCQlCVERNX0FHQ1RhYmxlKHBhZGFwdGVyLCBCVF9BR0NUQUJMRV9PRkYpOwotCQkJQlRETV9CQkJhY2tPZmZMZXZlbChwYWRhcHRlciwgQlRfQkJfQkFDS09GRl9PRkYpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBidGRtXzFBbnRCdENvZXhpc3RIYW5kbGVyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQlzdHJ1Y3QgYnRfY29leGlzdF84NzIzYSAqcEJ0Q29leDg3MjM7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMWFudCAqcEJ0ZG04NzIzOwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBCdENvZXg4NzIzID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzOwotCXBCdGRtODcyMyA9ICZwQnRDb2V4ODcyMy0+YnRkbTFBbnQ7Ci0JcGFkYXB0ZXItPnB3cmN0cmxwcml2LmJ0Y29leF9yZm9uID0gZmFsc2U7Ci0JaWYgKCFydGw4NzIzYV9CVF9lbmFibGVkKHBhZGFwdGVyKSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEJUIGlzIGRpc2FibGVkXG4iKSk7Ci0KLQkJaWYgKEJURE1fSXNXaWZpQ29ubmVjdGlvbkV4aXN0KHBhZGFwdGVyKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkJCSgiW0JUQ29leF0sIHdpZmkgaXMgY29ubmVjdGVkXG4iKSk7Ci0KLQkJCWlmIChCVERNX0lzV2lmaUJ1c3kocGFkYXB0ZXIpKSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkJCQkoIltCVENvZXhdLCBXaWZpIGlzIGJ1c3lcbiIpKTsKLQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIGZhbHNlLCAwLAotCQkJCQkJICAgZmFsc2UsIDkpOwotCQkJfSBlbHNlIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCQkJCSgiW0JUQ29leF0sIFdpZmkgaXMgaWRsZVxuIikpOwotCQkJCV9idGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIHRydWUsIDIsIDEsCi0JCQkJCQkgICAgZmFsc2UsIDkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkJCSgiW0JUQ29leF0sIHdpZmkgaXMgZGlzY29ubmVjdGVkXG4iKSk7Ci0KLQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgZmFsc2UsIDAsIGZhbHNlLCA5KTsKLQkJfQotCX0gZWxzZSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQlQgaXMgZW5hYmxlZFxuIikpOwotCi0JCWlmIChCVERNX0lzV2lmaUNvbm5lY3Rpb25FeGlzdChwYWRhcHRlcikpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKLQkJCQkoIltCVENvZXhdLCB3aWZpIGlzIGNvbm5lY3RlZFxuIikpOwotCi0JCQlidGRtXzFBbnRXaWZpUGFyYUFkanVzdChwYWRhcHRlciwgdHJ1ZSk7Ci0JCQlidGRtXzFBbnRDb2V4UHJvY2Vzc0ZvcldpZmlDb25uZWN0KHBhZGFwdGVyKTsKLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKLQkJCQkoIltCVENvZXhdLCB3aWZpIGlzIGRpc2Nvbm5lY3RlZFxuIikpOwotCi0JCQkvKiAgQW50ZW5uYSBzd2l0Y2ggYXQgQlQgc2lkZSgweDg3MCA9IDB4MzAwLAotCQkJICAgIDB4ODYwID0gMHgyMTApIGFmdGVyIFBTVERNQSBvZmYgKi8KLQkJCWJ0ZG1fMUFudFdpZmlQYXJhQWRqdXN0KHBhZGFwdGVyLCBmYWxzZSk7Ci0JCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIGZhbHNlLCAwLCBmYWxzZSwgMCk7Ci0JCX0KLQl9Ci0KLQlidGRtXzFBbnRCVFN0YXRlQ2hhbmdlSGFuZGxlcihwYWRhcHRlciwgcEJ0Q29leDg3MjMtPnByZWMyaEJ0SW5mbywKLQkJCQkgICAgICBwQnRDb2V4ODcyMy0+YzJoQnRJbmZvKTsKLQlwQnRDb2V4ODcyMy0+cHJlYzJoQnRJbmZvID0gcEJ0Q29leDg3MjMtPmMyaEJ0SW5mbzsKLX0KLQotdm9pZCBCVERNXzFBbnRTaWduYWxDb21wZW5zYXRpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgdTggKnJzc2lfd2lmaSwgdTggKnJzc2lfYnQpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8xYW50ICpwQnRkbTg3MjM7Ci0JdTggUlNTSV9XaUZpX0NtcG5zdG4sIFJTU0lfQlRfQ21wbnN0bjsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlwQnRkbTg3MjMgPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTFBbnQ7Ci0JUlNTSV9XaUZpX0NtcG5zdG4gPSAwOwotCVJTU0lfQlRfQ21wbnN0biA9IDA7Ci0KLQlzd2l0Y2ggKHBCdGRtODcyMy0+Y3VyUHNUZG1hKSB7Ci0JY2FzZSAxOiAvKiAgV2lGaSA1Mm1zICovCi0JCVJTU0lfV2lGaV9DbXBuc3RuID0gMTE7IC8qICAyMiowLjQ4ICovCi0JCWJyZWFrOwotCWNhc2UgMjogLyogIFdpRmkgMzZtcyAqLwotCQlSU1NJX1dpRmlfQ21wbnN0biA9IDE0OyAvKiAgMjIqMC42NCAqLwotCQlicmVhazsKLQljYXNlIDk6IC8qICBXaUZpIDIwbXMgKi8KLQkJUlNTSV9XaUZpX0NtcG5zdG4gPSAxODsgLyogIDIyKjAuODAgKi8KLQkJYnJlYWs7Ci0JY2FzZSAxMTogLyogIFdpRmkgMTBtcyAqLwotCQlSU1NJX1dpRmlfQ21wbnN0biA9IDIwOyAvKiAgMjIqMC45MCAqLwotCQlicmVhazsKLQljYXNlIDQ6IC8qICBXaUZpIDIxbXMgKi8KLQkJUlNTSV9XaUZpX0NtcG5zdG4gPSAxNzsgLyogIDIyKjAuNzkgKi8KLQkJYnJlYWs7Ci0JY2FzZSAxNjogLyogIFdpRmkgMjRtcyAqLwotCQlSU1NJX1dpRmlfQ21wbnN0biA9IDE4OyAvKiAgMjIqMC43NiAqLwotCQlicmVhazsKLQljYXNlIDE4OiAvKiAgV2lGaSAzN21zICovCi0JCVJTU0lfV2lGaV9DbXBuc3RuID0gMTQ7IC8qICAyMiowLjY0ICovCi0JCWJyZWFrOwotCWNhc2UgMjM6IC8qIExldmVsLTEsIEFudGVubmEgc3dpdGNoIHRvIEJUIGF0IGFsbCB0aW1lICovCi0JY2FzZSAyNDogLyogTGV2ZWwtMiwgQW50ZW5uYSBzd2l0Y2ggdG8gQlQgYXQgYWxsIHRpbWUgKi8KLQljYXNlIDI1OiAvKiBMZXZlbC0zYSwgQW50ZW5uYSBzd2l0Y2ggdG8gQlQgYXQgYWxsIHRpbWUgKi8KLQljYXNlIDI2OiAvKiBMZXZlbC0zYiwgQW50ZW5uYSBzd2l0Y2ggdG8gQlQgYXQgYWxsIHRpbWUgKi8KLQljYXNlIDI3OiAvKiBMZXZlbC0zYiwgQW50ZW5uYSBzd2l0Y2ggdG8gQlQgYXQgYWxsIHRpbWUgKi8KLQljYXNlIDMzOiAvKiBCVCBTQ08gJiBXaUZpIHNpdGUgc3VydmV5ICovCi0JCVJTU0lfV2lGaV9DbXBuc3RuID0gMjI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCWlmIChyc3NpX3dpZmkgJiYgUlNTSV9XaUZpX0NtcG5zdG4pIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkJKCJbQlRDb2V4XSwgMUFudFNnbmxDbXBuc3RuLCBjYXNlICVkLCBXaUZpQ21wbnN0biAiCi0JCQkgIj0lZCglZCA9PiAlZClcbiIsIHBCdGRtODcyMy0+Y3VyUHNUZG1hLAotCQkJIFJTU0lfV2lGaV9DbXBuc3RuLCAqcnNzaV93aWZpLAotCQkJICpyc3NpX3dpZmkrUlNTSV9XaUZpX0NtcG5zdG4pKTsKLQkJKnJzc2lfd2lmaSArPSBSU1NJX1dpRmlfQ21wbnN0bjsKLQl9Ci0KLQlpZiAocnNzaV9idCAmJiBSU1NJX0JUX0NtcG5zdG4pIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkJKCJbQlRDb2V4XSwgMUFudFNnbmxDbXBuc3RuLCBjYXNlICVkLCBCVENtcG5zdG4gIgotCQkJICI9JWQoJWQgPT4gJWQpXG4iLCBwQnRkbTg3MjMtPmN1clBzVGRtYSwKLQkJCSBSU1NJX0JUX0NtcG5zdG4sICpyc3NpX2J0LCAqcnNzaV9idCtSU1NJX0JUX0NtcG5zdG4pKTsKLQkJKnJzc2lfYnQgKz0gUlNTSV9CVF9DbXBuc3RuOwotCX0KLX0KLQotc3RhdGljIHZvaWQgQlRETV8xQW50UGFyYUluaXQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXN0cnVjdCBidF9jb2V4aXN0Xzg3MjNhICpwQnRDb2V4OwotCXN0cnVjdCBidGRtXzg3MjNhXzFhbnQgKnBCdGRtODcyMzsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlwQnRDb2V4ID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzOwotCXBCdGRtODcyMyA9ICZwQnRDb2V4LT5idGRtMUFudDsKLQotCS8qICBFbmFibGUgY291bnRlciBzdGF0aXN0aWNzICovCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgMHg3NmUsIDB4NCk7Ci0JYnRkbV8xQW50UHRhUGFyYVJlbG9hZChwYWRhcHRlcik7Ci0KLQlwQnRkbTg3MjMtPndpZmlSc3NpVGhyZXNoID0gNDg7Ci0KLQlwQnRkbTg3MjMtPmJXaUZpSGFsdCA9IGZhbHNlOwotCXBCdGRtODcyMy0+YlJBQ2hhbmdlZCA9IGZhbHNlOwotCi0JaWYgKChwQnRDb2V4LT5jMmhCdEluZm8gIT0gQlRfSU5GT19TVEFURV9ESVNBQkxFRCkgJiYKLQkgICAgKHBCdENvZXgtPmMyaEJ0SW5mbyAhPSBCVF9JTkZPX1NUQVRFX05PX0NPTk5FQ1RJT04pKSB7Ci0JCUJURE1fU2V0U3dSZlJ4THBmQ29ybmVyKHBhZGFwdGVyLCBCVF9SRl9SWF9MUEZfQ09STkVSX1NIUklOSyk7Ci0JCUJURE1fQUdDVGFibGUocGFkYXB0ZXIsIEJUX0FHQ1RBQkxFX09OKTsKLQkJQlRETV9CQkJhY2tPZmZMZXZlbChwYWRhcHRlciwgQlRfQkJfQkFDS09GRl9PTik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBCVERNXzFBbnRGb3JIYWx0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIlxuW0JUQ29leF0sIDFBbnQgZm9yIGhhbHRcbiIpKTsKLQotCUdFVF9IQUxfREFUQShwYWRhcHRlciktPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTFBbnQuYldpRmlIYWx0ID0KLQkJdHJ1ZTsKLQotCWJ0ZG1fMUFudFdpZmlQYXJhQWRqdXN0KHBhZGFwdGVyLCBmYWxzZSk7Ci0KLQkvKiAgZG9uJ3QgdXNlIGJ0ZG1fMUFudFNldFBTVERNQSgpIGhlcmUgKi8KLQkvKiAgaXQgd2lsbCBjYWxsIHJ0d19zZXRfcHNfbW9kZTIzYSgpIGFuZCByZXF1ZXN0IHB3cnByaXYtPmxvY2suICovCi0JLyogIFRoaXMgd2lsbCBsZWFkIHRvIGRlYWRsb2NrLCBpZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBJUFMgKi8KLQkvKiAgTHVjYXNAMjAxMzAyMDUgKi8KLQlidGRtXzFBbnRQc1RkbWEocGFkYXB0ZXIsIGZhbHNlLCAwKTsKLQotCWJ0ZG1fU2V0RndJZ25vcmVXbGFuQWN0KHBhZGFwdGVyLCB0cnVlKTsKLX0KLQotc3RhdGljIHZvaWQgQlRETV8xQW50THBzTGVhdmUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiXG5bQlRDb2V4XSwgMUFudCBmb3IgTFBTIExlYXZlXG4iKSk7Ci0KLQkvKiAgUHJldmVudCBmcm9tIGVudGVyaW5nIExQUyBhZ2FpbiAqLwotCUdFVF9IQUxfREFUQShwYWRhcHRlciktPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTFBbnQuYldpRmlIYWx0ID0KLQkJdHJ1ZTsKLQotCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgZmFsc2UsIDAsIGZhbHNlLCA4KTsKLS8qYnRkbV8xQW50UHNUZG1hKHBhZGFwdGVyLCBmYWxzZSwgOCk7ICovCi19Ci0KLXN0YXRpYyB2b2lkIEJURE1fMUFudFdpZmlBc3NvY2lhdGVOb3RpZnkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggdHlwZSkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKLQkJKCJcbltCVENvZXhdLCAxQW50IGZvciBhc3NvY2lhdGUsIHR5cGUgPSVkXG4iLCB0eXBlKSk7Ci0KLQlpZiAodHlwZSkgewotCQlydGw4NzIzYV9DaGVja0FudGVubmFfU2VsZWN0aW9uKHBhZGFwdGVyKTsKLQkJaWYgKCFydGw4NzIzYV9CVF9lbmFibGVkKHBhZGFwdGVyKSkKLQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgZmFsc2UsIDAsIGZhbHNlLCA5KTsKLQkJZWxzZSB7Ci0JCQlzdHJ1Y3QgYnRfY29leGlzdF84NzIzYSAqcEJ0Q29leDsKLQkJCXU4IEJ0U3RhdGU7Ci0KLQkJCXBCdENvZXggPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjM7Ci0JCQlCdFN0YXRlID0gcEJ0Q29leC0+YzJoQnRJbmZvOwotCi0JCQlidGRtXzFBbnRUU0ZTd2l0Y2gocGFkYXB0ZXIsIHRydWUpOwotCi0JCQlpZiAoQnRTdGF0ZSA9PSBCVF9JTkZPX1NUQVRFX05PX0NPTk5FQ1RJT04gfHwKLQkJCSAgICBCdFN0YXRlID09IEJUX0lORk9fU1RBVEVfQ09OTkVDVF9JRExFKSB7Ci0JCQkJYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCBmYWxzZSwgMCwKLQkJCQkJCSAgIHRydWUsIDI4KTsKLQkJCX0gZWxzZSBpZiAoQnRTdGF0ZSA9PSBCVF9JTkZPX1NUQVRFX1NDT19PTkxZX0JVU1kgfHwKLQkJCQkgICBCdFN0YXRlID09IEJUX0lORk9fU1RBVEVfQUNMX1NDT19CVVNZKSB7Ci0JCQkJYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCBmYWxzZSwgMCwKLQkJCQkJCSAgIGZhbHNlLCA4KTsKLQkJCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHg2YzAsIDB4NWE1YTVhNWEpOwotCQkJCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweDZjNCwgMHg1YTVhNWE1YSk7Ci0JCQl9IGVsc2UgaWYgKEJ0U3RhdGUgPT0gQlRfSU5GT19TVEFURV9BQ0xfT05MWV9CVVNZIHx8Ci0JCQkJICAgQnRTdGF0ZSA9PSBCVF9JTkZPX1NUQVRFX0FDTF9JTlFfT1JfUEFHKSB7Ci0JCQkJaWYgKHBCdENvZXgtPmMyaEJ0UHJvZmlsZSA9PSBCVF9JTkZPX0hJRCkKLQkJCQkJYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCBmYWxzZSwgMCwKLQkJCQkJCQkgICB0cnVlLCAzNSk7Ci0JCQkJZWxzZQotCQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIGZhbHNlLCAwLAotCQkJCQkJCSAgIHRydWUsIDI5KTsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCWlmICghcnRsODcyM2FfQlRfZW5hYmxlZChwYWRhcHRlcikpIHsKLQkJCWlmICghQlRETV9Jc1dpZmlDb25uZWN0aW9uRXhpc3QocGFkYXB0ZXIpKSB7Ci0JCQkJYnRkbV8xQW50UHNUZG1hKHBhZGFwdGVyLCBmYWxzZSwgMCk7Ci0JCQkJYnRkbV8xQW50VFNGU3dpdGNoKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQotCQlidGRtXzFBbnRCdENvZXhpc3RIYW5kbGVyKHBhZGFwdGVyKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1CVERNXzFBbnRNZWRpYVN0YXR1c05vdGlmeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgZW51bSBydF9tZWRpYV9zdGF0dXMgbXN0YXR1cykKLXsKLQlzdHJ1Y3QgYnRfY29leGlzdF84NzIzYSAqcEJ0Q29leDsKLQotCXBCdENvZXggPSAmR0VUX0hBTF9EQVRBKHBhZGFwdGVyKS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMzsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKLQkJKCJcblxuW0JUQ29leF0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpKTsKLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIE1lZGlhU3RhdHVzLCBXaUZpICVzICEhXG4iLAotCQkJbXN0YXR1cyA9PSBSVF9NRURJQV9DT05ORUNUPyJDT05ORUNUIjoiRElTQ09OTkVDVCIpKTsKLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpKTsKLQotCWlmIChSVF9NRURJQV9DT05ORUNUID09IG1zdGF0dXMpIHsKLQkJaWYgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSkgewotCQkJaWYgKHBCdENvZXgtPmMyaEJ0SW5mbyA9PSBCVF9JTkZPX1NUQVRFX1NDT19PTkxZX0JVU1kgfHwKLQkJCSAgICBwQnRDb2V4LT5jMmhCdEluZm8gPT0gQlRfSU5GT19TVEFURV9BQ0xfU0NPX0JVU1kpCi0JCQkJYnRkbV8xQW50VXBkYXRlSGFsUkFNYXNrRm9yU0NPKHBhZGFwdGVyLCB0cnVlKTsKLQkJfQotCi0JCXBhZGFwdGVyLT5wd3JjdHJscHJpdi5EZWxheUxQU0xhc3RUaW1lU3RhbXAgPSBqaWZmaWVzOwotCQlCVERNXzFBbnRGb3JEaGNwKHBhZGFwdGVyKTsKLQl9IGVsc2UgewotCQkvKiBEQkdfODcyM0EoIiVzIHJ0bDg3MjNhX0RlaW5pdEFudGVubmFfU2VsZWN0aW9uXG4iLAotCQkgICBfX2Z1bmNfXyk7ICovCi0JCXJ0bDg3MjNhX0RlaW5pdEFudGVubmFfU2VsZWN0aW9uKHBhZGFwdGVyKTsKLQkJYnRkbV8xQW50QnRDb2V4aXN0SGFuZGxlcihwYWRhcHRlcik7Ci0JCXBCdENvZXgtPmJ0ZG0xQW50LmJSQUNoYW5nZWQgPSBmYWxzZTsKLQl9Ci19Ci0KLXZvaWQgQlRETV8xQW50Rm9yRGhjcChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0JdTggQnRTdGF0ZTsKLQlzdHJ1Y3QgYnRfY29leGlzdF84NzIzYSAqcEJ0Q29leDsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8xYW50ICpwQnRkbTg3MjM7Ci0KLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JcEJ0Q29leCA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMzsKLQlCdFN0YXRlID0gcEJ0Q29leC0+YzJoQnRJbmZvOwotCXBCdGRtODcyMyA9ICZwQnRDb2V4LT5idGRtMUFudDsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJcbltCVENvZXhdLCAxQW50IGZvciBESENQXG4iKSk7Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCAxQW50IGZvciBESENQLCBXaUZpIGlzICVzXG4iLAotCQkJCUJURE1fSXNXaWZpQnVzeShwYWRhcHRlcik/IkJ1c3kiOiJJRExFIikpOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgMUFudCBmb3IgREhDUCwgJXNcbiIsCi0JCQkJQnRTdGF0ZVN0cmluZ1tCdFN0YXRlXSkpOwotCi0JQlRETV8xQW50V2lmaUFzc29jaWF0ZU5vdGlmeShwYWRhcHRlciwgdHJ1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIEJURE1fMUFudFdpZmlTY2FuTm90aWZ5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHNjYW5UeXBlKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0JdTggQnRTdGF0ZTsKLQlzdHJ1Y3QgYnRfY29leGlzdF84NzIzYSAqcEJ0Q29leDsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8xYW50ICpwQnRkbTg3MjM7Ci0KLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JQnRTdGF0ZSA9IHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmMyaEJ0SW5mbzsKLQlwQnRDb2V4ID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzOwotCXBCdGRtODcyMyA9ICZwQnRDb2V4LT5idGRtMUFudDsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJcbltCVENvZXhdLCAxQW50IGZvciB3aWZpIHNjYW4gPSVkISFcbiIsCi0JCQkJc2NhblR5cGUpKTsKLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIDFBbnQgZm9yIHdpZmkgc2NhbiwgV2lGaSBpcyAlc1xuIiwKLQkJCQlCVERNX0lzV2lmaUJ1c3kocGFkYXB0ZXIpPyJCdXN5IjoiSURMRSIpKTsKLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIDFBbnQgZm9yIHdpZmkgc2NhbiwgJXNcbiIsCi0JCQkJQnRTdGF0ZVN0cmluZ1tCdFN0YXRlXSkpOwotCi0JaWYgKHNjYW5UeXBlKSB7Ci0JCXJ0bDg3MjNhX0NoZWNrQW50ZW5uYV9TZWxlY3Rpb24ocGFkYXB0ZXIpOwotCQlpZiAoIXJ0bDg3MjNhX0JUX2VuYWJsZWQocGFkYXB0ZXIpKSB7Ci0JCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIGZhbHNlLCAwLCBmYWxzZSwgOSk7Ci0JCX0gZWxzZSBpZiAoQlRETV9Jc1dpZmlDb25uZWN0aW9uRXhpc3QocGFkYXB0ZXIpID09IGZhbHNlKSB7Ci0JCQlCVERNXzFBbnRXaWZpQXNzb2NpYXRlTm90aWZ5KHBhZGFwdGVyLCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWlmICgoQnRTdGF0ZSA9PSBCVF9JTkZPX1NUQVRFX1NDT19PTkxZX0JVU1kpIHx8Ci0JCQkgICAgKEJ0U3RhdGUgPT0gQlRfSU5GT19TVEFURV9BQ0xfU0NPX0JVU1kpKSB7Ci0JCQkJaWYgKHBCdENvZXgtPmJDMmhCdElucXVpcnlQYWdlKSB7Ci0JCQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgZmFsc2UsIDAsCi0JCQkJCQkJICAgdHJ1ZSwgMzIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXBhZGFwdGVyLT5wd3JjdHJscHJpdi5idGNvZXhfcmZvbiA9Ci0JCQkJCQl0cnVlOwotCQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIHRydWUsIDAsCi0JCQkJCQkJICAgdHJ1ZSwgMzMpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAodHJ1ZSA9PSBwQnRDb2V4LT5iQzJoQnRJbnF1aXJ5UGFnZSkgewotCQkJCXBhZGFwdGVyLT5wd3JjdHJscHJpdi5idGNvZXhfcmZvbiA9IHRydWU7Ci0JCQkJYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCB0cnVlLCAwLCB0cnVlLCAzMCk7Ci0JCQl9IGVsc2UgaWYgKEJ0U3RhdGUgPT0gQlRfSU5GT19TVEFURV9BQ0xfT05MWV9CVVNZKSB7Ci0JCQkJcGFkYXB0ZXItPnB3cmN0cmxwcml2LmJ0Y29leF9yZm9uID0gdHJ1ZTsKLQkJCQlpZiAocEJ0Q29leC0+YzJoQnRQcm9maWxlID09IEJUX0lORk9fSElEKQotCQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIHRydWUsIDAsCi0JCQkJCQkJICAgdHJ1ZSwgMzQpOwotCQkJCWVsc2UKLQkJCQkJYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCB0cnVlLCAwLAotCQkJCQkJCSAgIHRydWUsIDQpOwotCQkJfSBlbHNlIHsKLQkJCQlwYWRhcHRlci0+cHdyY3RybHByaXYuYnRjb2V4X3Jmb24gPSB0cnVlOwotCQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgdHJ1ZSwgMCwgdHJ1ZSwgNSk7Ci0JCQl9Ci0JCX0KLQotCQlidGRtX05vdGlmeUZ3U2NhbihwYWRhcHRlciwgMSk7Ci0JfSBlbHNlIHsKLQkJLyogIFdpRmlfRmluaXNoX1NjYW4gKi8KLQkJYnRkbV9Ob3RpZnlGd1NjYW4ocGFkYXB0ZXIsIDApOwotCQlidGRtXzFBbnRCdENvZXhpc3RIYW5kbGVyKHBhZGFwdGVyKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIEJURE1fMUFudEZ3QzJoQnRJbmZvODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm87Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQ7Ci0Jc3RydWN0IGJ0X2NvZXhpc3RfODcyM2EgKnBCdENvZXg7Ci0JdTggdTF0bXAsIGJ0U3RhdGU7Ci0KLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQlwQnRDb2V4ID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzOwotCi0JdTF0bXAgPSBwQnRDb2V4LT5jMmhCdEluZm9PcmlnaW5hbDsKLQkvKiAgc2NvIEJVU1kgYml0IGlzIG5vdCB1c2VkIG9uIHZvaWNlIG92ZXIgUENNIHBsYXRmb3JtICovCi0JYnRTdGF0ZSA9IHUxdG1wICYgMHhGOwotCXBCdENvZXgtPmMyaEJ0UHJvZmlsZSA9IHUxdG1wICYgMHhFMDsKLQotCS8qICBkZWZhdWx0IHNldCBidCB0byBpZGxlIHN0YXRlLiAqLwotCXBCdE1nbnQtPkV4dENvbmZpZy5iQlRCdXN5ID0gZmFsc2U7Ci0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfQlRfSURMRTsKLQotCS8qICBjaGVjayBCSVQyIGZpcnN0ID09PiBjaGVjayBpZiBidCBpcyB1bmRlciBpbnF1aXJ5IG9yIHBhZ2Ugc2NhbiAqLwotCWlmIChidFN0YXRlICYgQklUKDIpKQotCQlwQnRDb2V4LT5iQzJoQnRJbnF1aXJ5UGFnZSA9IHRydWU7Ci0JZWxzZQotCQlwQnRDb2V4LT5iQzJoQnRJbnF1aXJ5UGFnZSA9IGZhbHNlOwotCWJ0U3RhdGUgJj0gfkJJVCgyKTsKLQotCWlmICghKGJ0U3RhdGUgJiBCSVQoMCkpKQotCQlwQnRDb2V4LT5jMmhCdEluZm8gPSBCVF9JTkZPX1NUQVRFX05PX0NPTk5FQ1RJT047Ci0JZWxzZSB7Ci0JCWlmIChidFN0YXRlID09IDB4MSkKLQkJCXBCdENvZXgtPmMyaEJ0SW5mbyA9IEJUX0lORk9fU1RBVEVfQ09OTkVDVF9JRExFOwotCQllbHNlIGlmIChidFN0YXRlID09IDB4OSkgewotCQkJaWYgKHBCdENvZXgtPmJDMmhCdElucXVpcnlQYWdlID09IHRydWUpCi0JCQkJcEJ0Q29leC0+YzJoQnRJbmZvID0KLQkJCQkJQlRfSU5GT19TVEFURV9BQ0xfSU5RX09SX1BBRzsKLQkJCWVsc2UKLQkJCQlwQnRDb2V4LT5jMmhCdEluZm8gPQotCQkJCQlCVF9JTkZPX1NUQVRFX0FDTF9PTkxZX0JVU1k7Ci0JCQlwQnRNZ250LT5FeHRDb25maWcuYkJUQnVzeSA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoYnRTdGF0ZSA9PSAweDMpIHsKLQkJCXBCdENvZXgtPmMyaEJ0SW5mbyA9IEJUX0lORk9fU1RBVEVfU0NPX09OTFlfQlVTWTsKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5iQlRCdXN5ID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChidFN0YXRlID09IDB4YikgewotCQkJcEJ0Q29leC0+YzJoQnRJbmZvID0gQlRfSU5GT19TVEFURV9BQ0xfU0NPX0JVU1k7Ci0JCQlwQnRNZ250LT5FeHRDb25maWcuYkJUQnVzeSA9IHRydWU7Ci0JCX0gZWxzZQotCQkJcEJ0Q29leC0+YzJoQnRJbmZvID0gQlRfSU5GT19TVEFURV9NQVg7Ci0JCWlmIChwQnRNZ250LT5FeHRDb25maWcuYkJUQnVzeSkKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPQotCQkJCX5CVF9DT0VYX1NUQVRFX0JUX0lETEU7Ci0JfQotCi0JaWYgKEJUX0lORk9fU1RBVEVfTk9fQ09OTkVDVElPTiA9PSBwQnRDb2V4LT5jMmhCdEluZm8gfHwKLQkgICAgQlRfSU5GT19TVEFURV9DT05ORUNUX0lETEUgPT0gcEJ0Q29leC0+YzJoQnRJbmZvKSB7Ci0JCWlmIChwQnRDb2V4LT5iQzJoQnRJbnF1aXJ5UGFnZSkKLQkJCXBCdENvZXgtPmMyaEJ0SW5mbyA9IEJUX0lORk9fU1RBVEVfSU5RX09SX1BBRzsKLQl9Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQzJIXSwgJXMoJWQpXG4iLAotCQkJQnRTdGF0ZVN0cmluZ1twQnRDb2V4LT5jMmhCdEluZm9dLCBwQnRDb2V4LT5jMmhCdEluZm8pKTsKLQotCWlmIChwQnRDb2V4LT5jMmhCdFByb2ZpbGUgIT0gQlRfSU5GT19ISUQpCi0JCXBCdENvZXgtPmMyaEJ0UHJvZmlsZSAmPSB+QlRfSU5GT19ISUQ7Ci19Ci0KLXZvaWQgQlRETV8xQW50QnRDb2V4aXN0ODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXY7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQl1bnNpZ25lZCBsb25nIGRlbHRhX3RpbWU7Ci0KLQlwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TSVRFX01PTklUT1IpKSB7Ci0JCS8qICBhbHJlYWR5IGRvbmUgaW4gQlRETV8xQW50Rm9yU2NhbigpICovCi0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKLQkJCSgiW0JUQ29leF0sIHdpZmkgaXMgdW5kZXIgc2NhbiBwcm9ncmVzcyEhXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfVU5ERVJfTElOS0lORykpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkJKCJbQlRDb2V4XSwgd2lmaSBpcyB1bmRlciBsaW5rIHByb2dyZXNzISFcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qICB1bmRlciBESENQKFNwZWNpYWwgcGFja2V0KSAqLwotCWRlbHRhX3RpbWUgPSBqaWZmaWVzIC0gcGFkYXB0ZXItPnB3cmN0cmxwcml2LkRlbGF5TFBTTGFzdFRpbWVTdGFtcDsKLQlkZWx0YV90aW1lID0gamlmZmllc190b19tc2VjcyhkZWx0YV90aW1lKTsKLQlpZiAoZGVsdGFfdGltZSA8IDUwMCkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIHdpZmkgaXMgdW5kZXIgREhDUCAiCi0JCQkJCSJwcm9ncmVzcyglbGkgbXMpISFcbiIsIGRlbHRhX3RpbWUpKTsKLQkJcmV0dXJuOwotCX0KLQotCUJURE1fQ2hlY2tXaUZpU3RhdGUocGFkYXB0ZXIpOwotCi0JYnRkbV8xQW50QnRDb2V4aXN0SGFuZGxlcihwYWRhcHRlcik7Ci19Ci0KLS8qICA9PT09PSBFbmQgb2Ygc3luYyBmcm9tIFNENyBkcml2ZXIgSEFML0JUQ29leGlzdC9IYWxCdGM4NzIzMUFudC5jID09PT09ICovCi0KLS8qICA9PT09PSBCZWxvdyB0aGlzIGxpbmUgaXMgc3luYyBmcm9tIFNENyBkcml2ZXIgSEFML0JUQ29leGlzdC9IYWxCdGM4NzIzMkFudC5jID09PT09ICovCi0KLS8qICBsb2NhbCBmdW5jdGlvbiBzdGFydCB3aXRoIGJ0ZG1fICovCi1zdGF0aWMgdTggYnRkbV9BY3Rpb25BbGdvcml0aG0oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8yYW50ICpwQnRkbTg3MjMgPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTJBbnQ7Ci0JdTggYlNjb0V4aXN0ID0gZmFsc2UsIGJCdExpbmtFeGlzdCA9IGZhbHNlLCBiQnRIc01vZGVFeGlzdCA9IGZhbHNlOwotCXU4IGFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX1VOREVGSU5FRDsKLQotCWlmIChwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGUpCi0JCWJCdExpbmtFeGlzdCA9IHRydWU7Ci0JaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZlNDTykKLQkJYlNjb0V4aXN0ID0gdHJ1ZTsKLQlpZiAoQlRfSHNDb25uZWN0aW9uRXN0YWJsaXNoZWQocGFkYXB0ZXIpKQotCQliQnRIc01vZGVFeGlzdCA9IHRydWU7Ci0KLQkvKiAgaGVyZSB3ZSBnZXQgQlQgc3RhdHVzIGZpcnN0ICovCi0JLyogIDEpIGluaXRpYWxpemUgKi8KLQlwQnRkbTg3MjMtPmJ0U3RhdHVzID0gQlRfMkFOVF9CVF9TVEFUVVNfSURMRTsKLQotCWlmICgoYlNjb0V4aXN0KSB8fCAoYkJ0SHNNb2RlRXhpc3QpIHx8Ci0JICAgIChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9ISUQpKSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFNDTyBvciBISUQgb3IgSFMgZXhpc3RzLCBzZXQgQlQgbm9uLWlkbGUgISEhXG4iKSk7Ci0JCXBCdGRtODcyMy0+YnRTdGF0dXMgPSBCVF8yQU5UX0JUX1NUQVRVU19OT05fSURMRTsKLQl9IGVsc2UgewotCQkvKiAgQTJkcCBwcm9maWxlICovCi0JCWlmICgocEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlID09IDEpICYmCi0JCSAgICAoQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfQTJEUCkpKSB7Ci0JCQlpZiAoQlRETV9CdFR4UnhDb3VudGVyTChwYWRhcHRlcikgPCAxMDApIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEEyRFAsIGxvdyBwcmlvcml0eSB0eCtyeCA8IDEwMCwgc2V0IEJUIGNvbm5lY3RlZC1pZGxlISEhXG4iKSk7Ci0JCQkJcEJ0ZG04NzIzLT5idFN0YXR1cyA9IEJUXzJBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFOwotCQkJfSBlbHNlIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEEyRFAsIGxvdyBwcmlvcml0eSB0eCtyeCA+PSAxMDAsIHNldCBCVCBub24taWRsZSEhIVxuIikpOwotCQkJCXBCdGRtODcyMy0+YnRTdGF0dXMgPSBCVF8yQU5UX0JUX1NUQVRVU19OT05fSURMRTsKLQkJCX0KLQkJfQotCQkvKiAgUGFuIHByb2ZpbGUgKi8KLQkJaWYgKChwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGUgPT0gMSkgJiYKLQkJICAgIChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9QQU4pKSkgewotCQkJaWYgKEJURE1fQnRUeFJ4Q291bnRlckwocGFkYXB0ZXIpIDwgNjAwKSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBQQU4sIGxvdyBwcmlvcml0eSB0eCtyeCA8IDYwMCwgc2V0IEJUIGNvbm5lY3RlZC1pZGxlISEhXG4iKSk7Ci0JCQkJcEJ0ZG04NzIzLT5idFN0YXR1cyA9IEJUXzJBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMubG93UHJpb3JpdHlUeCkgewotCQkJCQlpZiAoKHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmxvd1ByaW9yaXR5UnggLwotCQkJCQkgICAgcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMubG93UHJpb3JpdHlUeCkgPiA5KSB7Ci0JCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFBBTiwgbG93IHByaW9yaXR5IHJ4L3R4ID4gOSwgc2V0IEJUIGNvbm5lY3RlZC1pZGxlISEhXG4iKSk7Ci0JCQkJCQlwQnRkbTg3MjMtPmJ0U3RhdHVzID0gQlRfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoQlRfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgIT0gcEJ0ZG04NzIzLT5idFN0YXR1cykgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgUEFOLCBzZXQgQlQgbm9uLWlkbGUhISFcbiIpKTsKLQkJCQlwQnRkbTg3MjMtPmJ0U3RhdHVzID0gQlRfMkFOVF9CVF9TVEFUVVNfTk9OX0lETEU7Ci0JCQl9Ci0JCX0KLQkJLyogIFBhbitBMmRwIHByb2ZpbGUgKi8KLQkJaWYgKChwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGUgPT0gMikgJiYKLQkJICAgIChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9BMkRQKSkgJiYKLQkJICAgIChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9QQU4pKSkgewotCQkJaWYgKEJURE1fQnRUeFJ4Q291bnRlckwocGFkYXB0ZXIpIDwgNjAwKSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBQQU4rQTJEUCwgbG93IHByaW9yaXR5IHR4K3J4IDwgNjAwLCBzZXQgQlQgY29ubmVjdGVkLWlkbGUhISFcbiIpKTsKLQkJCQlwQnRkbTg3MjMtPmJ0U3RhdHVzID0gQlRfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEU7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5sb3dQcmlvcml0eVR4KSB7Ci0JCQkJCWlmICgocEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMubG93UHJpb3JpdHlSeCAvCi0JCQkJCSAgICBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5sb3dQcmlvcml0eVR4KSA+IDkpIHsKLQkJCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgUEFOK0EyRFAsIGxvdyBwcmlvcml0eSByeC90eCA+IDksIHNldCBCVCBjb25uZWN0ZWQtaWRsZSEhIVxuIikpOwotCQkJCQkJcEJ0ZG04NzIzLT5idFN0YXR1cyA9IEJUXzJBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKEJUXzJBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFICE9IHBCdGRtODcyMy0+YnRTdGF0dXMpIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFBBTitBMkRQLCBzZXQgQlQgbm9uLWlkbGUhISFcbiIpKTsKLQkJCQlwQnRkbTg3MjMtPmJ0U3RhdHVzID0gQlRfMkFOVF9CVF9TVEFUVVNfTk9OX0lETEU7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKEJUXzJBTlRfQlRfU1RBVFVTX0lETEUgIT0gcEJ0ZG04NzIzLT5idFN0YXR1cykKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLmJCVEJ1c3kgPSB0cnVlOwotCWVsc2UKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLmJCVEJ1c3kgPSBmYWxzZTsKLQotCWlmICghYkJ0TGlua0V4aXN0KSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgTm8gcHJvZmlsZSBleGlzdHMhISFcbiIpKTsKLQkJcmV0dXJuIGFsZ29yaXRobTsKLQl9Ci0KLQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlID09IDEpIHsKLQkJaWYgKGJTY29FeGlzdCkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gb25seVxuIikpOwotCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fU0NPOwotCQl9IGVsc2UgewotCQkJaWYgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX0hJRCkpIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEhJRCBvbmx5XG4iKSk7Ci0JCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fSElEOwotCQkJfSBlbHNlIGlmIChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9BMkRQKSkgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQTJEUCBvbmx5XG4iKSk7Ci0JCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fQTJEUDsKLQkJCX0gZWxzZSBpZiAoQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfUEFOKSkgewotCQkJCWlmIChiQnRIc01vZGVFeGlzdCkgewotCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFBBTihIUykgb25seVxuIikpOwotCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19QQU5IUzsKLQkJCQl9IGVsc2UgewotCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFBBTihFRFIpIG9ubHlcbiIpKTsKLQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fUEFORURSOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBFcnJvciEhISBOTyBtYXRjaGVkIHByb2ZpbGUgZm9yIE51bWJlck9mSGFuZGxlID0lZCBcbiIsCi0JCQkJcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlKSk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSA9PSAyKSB7Ci0JCWlmIChiU2NvRXhpc3QpIHsKLQkJCWlmIChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9ISUQpKSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBISURcbiIpKTsKLQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19ISUQ7Ci0JCQl9IGVsc2UgaWYgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX0EyRFApKSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBFcnJvciEhISBTQ08gKyBBMkRQXG4iKSk7Ci0JCQl9IGVsc2UgaWYgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX1BBTikpIHsKLQkJCQlpZiAoYkJ0SHNNb2RlRXhpc3QpIHsKLQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBQQU4oSFMpXG4iKSk7Ci0JCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX1NDTzsKLQkJCQl9IGVsc2UgewotCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIFBBTihFRFIpXG4iKSk7Ci0JCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEVycm9yISEhIFNDTyBleGlzdHMgYnV0IHdoeSBOTyBtYXRjaGVkIEFDTCBwcm9maWxlIGZvciBOdW1iZXJPZkhhbmRsZSA9JWRcbiIsCi0JCQkJcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfSElEKSAmJgotCQkJICAgIEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX0EyRFApKSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBISUQgKyBBMkRQXG4iKSk7Ci0JCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fSElEX0EyRFA7Ci0JCX0gZWxzZSBpZiAoQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfSElEKSAmJgotCQkJICAgQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfUEFOKSkgewotCQkJCWlmIChiQnRIc01vZGVFeGlzdCkgewotCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIFBBTihIUylcbiIpKTsKLQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fSElEX0EyRFA7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBISUQgKyBQQU4oRURSKVxuIikpOwotCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfUEFOKSAmJgotCQkJCSAgIEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX0EyRFApKSB7Ci0JCQkJaWYgKGJCdEhzTW9kZUV4aXN0KSB7Ci0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQTJEUCArIFBBTihIUylcbiIpKTsKLQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fQTJEUDsKLQkJCQl9IGVsc2UgewotCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEEyRFAgKyBQQU4oRURSKVxuIikpOwotCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19QQU5FRFJfQTJEUDsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgRXJyb3IhISEgTk8gbWF0Y2hlZCBwcm9maWxlIGZvciBOdW1iZXJPZkhhbmRsZSA9JWRcbiIsCi0JCQkJCXBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSkpOwotCQkJfQotCQl9Ci0JfSBlbHNlIGlmIChwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGUgPT0gMykgewotCQlpZiAoYlNjb0V4aXN0KSB7Ci0JCQlpZiAoQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfSElEKSAmJgotCQkJICAgIEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX0EyRFApKSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBFcnJvciEhISBTQ08gKyBISUQgKyBBMkRQXG4iKSk7Ci0JCQl9IGVsc2UgaWYgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX0hJRCkgJiYKLQkJCQkgICBCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9QQU4pKSB7Ci0JCQkJaWYgKGJCdEhzTW9kZUV4aXN0KSB7Ci0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgSElEICsgUEFOKEhTKVxuIikpOwotCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19ISURfQTJEUDsKLQkJCQl9IGVsc2UgewotCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEhJRCArIFBBTihFRFIpXG4iKSk7Ci0JCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9QQU4pICYmCi0JCQkJICAgQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfQTJEUCkpIHsKLQkJCQlpZiAoYkJ0SHNNb2RlRXhpc3QpIHsKLQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBFcnJvciEhISBTQ08gKyBBMkRQICsgUEFOKEhTKVxuIikpOwotCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19TQ087Ci0JCQkJfSBlbHNlIHsKLQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBFcnJvciEhISBTQ08gKyBBMkRQICsgUEFOKEVEUilcbiIpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgRXJyb3IhISEgU0NPIGV4aXN0cyBidXQgd2h5IE5PIG1hdGNoZWQgcHJvZmlsZSBmb3IgTnVtYmVyT2ZIYW5kbGUgPSVkXG4iLAotCQkJCQlwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGUpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9ISUQpICYmCi0JCQkgICAgQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfUEFOKSAmJgotCQkJICAgIEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX0EyRFApKSB7Ci0JCQkJaWYgKGJCdEhzTW9kZUV4aXN0KSB7Ci0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgQTJEUCArIFBBTihIUylcbiIpKTsKLQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fSElEX0EyRFBfUEFOSFM7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBISUQgKyBBMkRQICsgUEFOKEVEUilcbiIpKTsKLQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fSElEX0EyRFBfUEFORURSOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBFcnJvciEhISBOTyBtYXRjaGVkIHByb2ZpbGUgZm9yIE51bWJlck9mSGFuZGxlID0lZFxuIiwKLQkJCQkJcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlKSk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSA+PSAzKSB7Ci0JCWlmIChiU2NvRXhpc3QpIHsKLQkJCWlmIChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9ISUQpICYmCi0JCQkgICAgQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfUEFOKSAmJgotCQkJICAgIEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX0EyRFApKSB7Ci0JCQkJaWYgKGJCdEhzTW9kZUV4aXN0KQotCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEVycm9yISEhIFNDTyArIEhJRCArIEEyRFAgKyBQQU4oSFMpXG4iKSk7Ci0JCQkJZWxzZQotCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEVycm9yISEhIFNDTyArIEhJRCArIEEyRFAgKyBQQU4oRURSKVxuIikpOwotCQkJfSBlbHNlIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEVycm9yISEhIFNDTyBleGlzdHMgYnV0IHdoeSBOTyBtYXRjaGVkIHByb2ZpbGUgZm9yIE51bWJlck9mSGFuZGxlID0lZFxuIiwKLQkJCQkJcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEVycm9yISEhIE5PIG1hdGNoZWQgcHJvZmlsZSBmb3IgTnVtYmVyT2ZIYW5kbGUgPSVkXG4iLAotCQkJCXBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSkpOwotCQl9Ci0JfQotCXJldHVybiBhbGdvcml0aG07Ci19Ci0KLXN0YXRpYyB1OCBidGRtX05lZWRUb0RlY0J0UHdyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JdTggYlJldCA9IGZhbHNlOwotCi0JaWYgKEJUX09wZXJhdGlvbihwYWRhcHRlcikpIHsKLQkJaWYgKHBIYWxEYXRhLT5kbXByaXYuRW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQiA+IDQ3KSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiTmVlZCB0byBkZWNyZWFzZSBidCBwb3dlciBmb3IgSFMgbW9kZSEhXG4iKSk7Ci0JCQliUmV0ID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJOTyBOZWVkIHRvIGRlY3JlYXNlIGJ0IHBvd2VyIGZvciBIUyBtb2RlISFcbiIpKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChCVERNX0lzV2lmaUNvbm5lY3Rpb25FeGlzdChwYWRhcHRlcikpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJOZWVkIHRvIGRlY3JlYXNlIGJ0IHBvd2VyIGZvciBXaWZpIGlzIGNvbm5lY3RlZCEhXG4iKSk7Ci0JCQliUmV0ID0gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gYlJldDsKLX0KLQotc3RhdGljIHZvaWQKLWJ0ZG1fU2V0Q29leFRhYmxlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiB2YWwweDZjMCwKLQkJICB1MzIgdmFsMHg2YzgsIHU4IHZhbDB4NmNjKQotewotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJzZXQgY29leCB0YWJsZSwgc2V0IDB4NmMwID0gMHgleFxuIiwgdmFsMHg2YzApKTsKLQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHg2YzAsIHZhbDB4NmMwKTsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJzZXQgY29leCB0YWJsZSwgc2V0IDB4NmM4ID0gMHgleFxuIiwgdmFsMHg2YzgpKTsKLQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHg2YzgsIHZhbDB4NmM4KTsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJzZXQgY29leCB0YWJsZSwgc2V0IDB4NmNjID0gMHgleFxuIiwgdmFsMHg2Y2MpKTsKLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCAweDZjYywgdmFsMHg2Y2MpOwotfQotCi1zdGF0aWMgdm9pZAotYnRkbV9TZXRTd0Z1bGxUaW1lRGFjU3dpbmcoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYlN3RGFjU3dpbmdPbiwKLQkJCSAgIHUzMiBzd0RhY1N3aW5nTHZsKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JaWYgKGJTd0RhY1N3aW5nT24pIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBTd0RhY1N3aW5nID0gMHgleFxuIiwgc3dEYWNTd2luZ0x2bCkpOwotCQlQSFlfU2V0QkJSZWcocGFkYXB0ZXIsIDB4ODgwLCAweGZmMDAwMDAwLCBzd0RhY1N3aW5nTHZsKTsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYlNXQ29leGlzdEFsbE9mZiA9IGZhbHNlOwotCX0gZWxzZSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgU3dEYWNTd2luZyBPZmYhXG4iKSk7Ci0JCVBIWV9TZXRCQlJlZyhwYWRhcHRlciwgMHg4ODAsIDB4ZmYwMDAwMDAsIDB4YzApOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLWJ0ZG1fU2V0RndEYWNTd2luZ0xldmVsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGRhY1N3aW5nTHZsKQotewotCXU4IEgyQ19QYXJhbWV0ZXJbMV0gPSB7MH07Ci0KLQlIMkNfUGFyYW1ldGVyWzBdID0gZGFjU3dpbmdMdmw7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFNldCBEYWMgU3dpbmcgTGV2ZWwgPSAweCV4XG4iLCBkYWNTd2luZ0x2bCkpOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgd3JpdGUgMHgyOSA9IDB4JXhcbiIsIEgyQ19QYXJhbWV0ZXJbMF0pKTsKLQotCUZpbGxIMkNDbWQocGFkYXB0ZXIsIDB4MjksIDEsIEgyQ19QYXJhbWV0ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBidGRtXzJBbnREZWNCdFB3cihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBiRGVjQnRQd3IpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMmFudCAqcEJ0ZG04NzIzID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0yQW50OwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkoIltCVENvZXhdLCBEZWMgQlQgcG93ZXIgPSAlc1xuIiwKLQkJKChiRGVjQnRQd3IpID8gIk9OIiA6ICJPRkYiKSkpOwotCXBCdGRtODcyMy0+YkN1ckRlY0J0UHdyID0gYkRlY0J0UHdyOwotCi0JaWYgKHBCdGRtODcyMy0+YlByZURlY0J0UHdyID09IHBCdGRtODcyMy0+YkN1ckRlY0J0UHdyKQotCQlyZXR1cm47Ci0KLQlCVERNX1NldEZ3RGVjQnRQd3IocGFkYXB0ZXIsIHBCdGRtODcyMy0+YkN1ckRlY0J0UHdyKTsKLQotCXBCdGRtODcyMy0+YlByZURlY0J0UHdyID0gcEJ0ZG04NzIzLT5iQ3VyRGVjQnRQd3I7Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGRtXzJBbnRGd0RhY1N3aW5nTHZsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGZ3RGFjU3dpbmdMdmwpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMmFudCAqcEJ0ZG04NzIzID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0yQW50OwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBzZXQgRlcgRGFjIFN3aW5nIGxldmVsID0gJWRcbiIsICBmd0RhY1N3aW5nTHZsKSk7Ci0JcEJ0ZG04NzIzLT5jdXJGd0RhY1N3aW5nTHZsID0gZndEYWNTd2luZ0x2bDsKLQotCS8qIFJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgcHJlRndEYWNTd2luZ0x2bCA9JWQsIGN1ckZ3RGFjU3dpbmdMdmwgPSVkXG4iLCAqLwotCS8qcEJ0ZG04NzIzLT5wcmVGd0RhY1N3aW5nTHZsLCBwQnRkbTg3MjMtPmN1ckZ3RGFjU3dpbmdMdmwpKTsgKi8KLQotCWlmIChwQnRkbTg3MjMtPnByZUZ3RGFjU3dpbmdMdmwgPT0gcEJ0ZG04NzIzLT5jdXJGd0RhY1N3aW5nTHZsKQotCQlyZXR1cm47Ci0KLQlidGRtX1NldEZ3RGFjU3dpbmdMZXZlbChwYWRhcHRlciwgcEJ0ZG04NzIzLT5jdXJGd0RhY1N3aW5nTHZsKTsKLQotCXBCdGRtODcyMy0+cHJlRndEYWNTd2luZ0x2bCA9IHBCdGRtODcyMy0+Y3VyRndEYWNTd2luZ0x2bDsKLX0KLQotc3RhdGljIHZvaWQKLWJ0ZG1fMkFudFJmU2hyaW5rKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJSeFJmU2hyaW5rT24pCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMmFudCAqcEJ0ZG04NzIzID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0yQW50OwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkoIltCVENvZXhdLCB0dXJuIFJ4IFJGIFNocmluayA9ICVzXG4iLAotCQkoKGJSeFJmU2hyaW5rT24pID8gIk9OIiA6ICJPRkYiKSkpOwotCXBCdGRtODcyMy0+YkN1clJmUnhMcGZTaHJpbmsgPSBiUnhSZlNocmlua09uOwotCi0JLyogUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBiUHJlUmZSeExwZlNocmluayA9JWQsIGJDdXJSZlJ4THBmU2hyaW5rID0lZFxuIiwgKi8KLQkvKnBCdGRtODcyMy0+YlByZVJmUnhMcGZTaHJpbmssIHBCdGRtODcyMy0+YkN1clJmUnhMcGZTaHJpbmspKTsgKi8KLQotCWlmIChwQnRkbTg3MjMtPmJQcmVSZlJ4THBmU2hyaW5rID09IHBCdGRtODcyMy0+YkN1clJmUnhMcGZTaHJpbmspCi0JCXJldHVybjsKLQotCUJURE1fU2V0U3dSZlJ4THBmQ29ybmVyKHBhZGFwdGVyLCAodTgpcEJ0ZG04NzIzLT5iQ3VyUmZSeExwZlNocmluayk7Ci0KLQlwQnRkbTg3MjMtPmJQcmVSZlJ4THBmU2hyaW5rID0gcEJ0ZG04NzIzLT5iQ3VyUmZSeExwZlNocmluazsKLX0KLQotc3RhdGljIHZvaWQKLWJ0ZG1fMkFudExvd1BlbmFsdHlSYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBiTG93UGVuYWx0eVJhKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBidGRtXzg3MjNhXzJhbnQgKnBCdGRtODcyMyA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMkFudDsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKLQkJKCJbQlRDb2V4XSwgdHVybiBMb3dQZW5hbHR5UkEgPSAlc1xuIiwKLQkJKChiTG93UGVuYWx0eVJhKSA/ICJPTiIgOiAiT0ZGIikpKTsKLQlwQnRkbTg3MjMtPmJDdXJMb3dQZW5hbHR5UmEgPSBiTG93UGVuYWx0eVJhOwotCi0JLyogUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBiUHJlTG93UGVuYWx0eVJhID0lZCwgYkN1ckxvd1BlbmFsdHlSYSA9JWRcbiIsICovCi0JLypwQnRkbTg3MjMtPmJQcmVMb3dQZW5hbHR5UmEsIHBCdGRtODcyMy0+YkN1ckxvd1BlbmFsdHlSYSkpOyAqLwotCi0JaWYgKHBCdGRtODcyMy0+YlByZUxvd1BlbmFsdHlSYSA9PSBwQnRkbTg3MjMtPmJDdXJMb3dQZW5hbHR5UmEpCi0JCXJldHVybjsKLQotCUJURE1fU2V0U3dQZW5hbHR5VHhSYXRlQWRhcHRpdmUocGFkYXB0ZXIsICh1OClwQnRkbTg3MjMtPmJDdXJMb3dQZW5hbHR5UmEpOwotCi0JcEJ0ZG04NzIzLT5iUHJlTG93UGVuYWx0eVJhID0gcEJ0ZG04NzIzLT5iQ3VyTG93UGVuYWx0eVJhOwotfQotCi1zdGF0aWMgdm9pZAotYnRkbV8yQW50RGFjU3dpbmcoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICB1OCBiRGFjU3dpbmdPbiwgdTMyIGRhY1N3aW5nTHZsKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBidGRtXzg3MjNhXzJhbnQgKnBCdGRtODcyMyA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMkFudDsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKLQkJKCJbQlRDb2V4XSwgdHVybiBEYWNTd2luZyA9JXMsIGRhY1N3aW5nTHZsID0gMHgleFxuIiwKLQkJKGJEYWNTd2luZ09uID8gIk9OIiA6ICJPRkYiKSwgZGFjU3dpbmdMdmwpKTsKLQlwQnRkbTg3MjMtPmJDdXJEYWNTd2luZ09uID0gYkRhY1N3aW5nT247Ci0JcEJ0ZG04NzIzLT5jdXJEYWNTd2luZ0x2bCA9IGRhY1N3aW5nTHZsOwotCi0JaWYgKChwQnRkbTg3MjMtPmJQcmVEYWNTd2luZ09uID09IHBCdGRtODcyMy0+YkN1ckRhY1N3aW5nT24pICYmCi0JICAgIChwQnRkbTg3MjMtPnByZURhY1N3aW5nTHZsID09IHBCdGRtODcyMy0+Y3VyRGFjU3dpbmdMdmwpKQotCQlyZXR1cm47Ci0KLQltZGVsYXkoMzApOwotCWJ0ZG1fU2V0U3dGdWxsVGltZURhY1N3aW5nKHBhZGFwdGVyLCBiRGFjU3dpbmdPbiwgZGFjU3dpbmdMdmwpOwotCi0JcEJ0ZG04NzIzLT5iUHJlRGFjU3dpbmdPbiA9IHBCdGRtODcyMy0+YkN1ckRhY1N3aW5nT247Ci0JcEJ0ZG04NzIzLT5wcmVEYWNTd2luZ0x2bCA9IHBCdGRtODcyMy0+Y3VyRGFjU3dpbmdMdmw7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0ZG1fMkFudEFkY0JhY2tPZmYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYkFkY0JhY2tPZmYpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMmFudCAqcEJ0ZG04NzIzID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0yQW50OwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkoIltCVENvZXhdLCB0dXJuIEFkY0JhY2tPZmYgPSAlc1xuIiwKLQkJKChiQWRjQmFja09mZikgPyAiT04iIDogIk9GRiIpKSk7Ci0JcEJ0ZG04NzIzLT5iQ3VyQWRjQmFja09mZiA9IGJBZGNCYWNrT2ZmOwotCi0JaWYgKHBCdGRtODcyMy0+YlByZUFkY0JhY2tPZmYgPT0gcEJ0ZG04NzIzLT5iQ3VyQWRjQmFja09mZikKLQkJcmV0dXJuOwotCi0JQlRETV9CQkJhY2tPZmZMZXZlbChwYWRhcHRlciwgKHU4KXBCdGRtODcyMy0+YkN1ckFkY0JhY2tPZmYpOwotCi0JcEJ0ZG04NzIzLT5iUHJlQWRjQmFja09mZiA9IHBCdGRtODcyMy0+YkN1ckFkY0JhY2tPZmY7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0ZG1fMkFudEFnY1RhYmxlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJBZ2NUYWJsZUVuKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBidGRtXzg3MjNhXzJhbnQgKnBCdGRtODcyMyA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMkFudDsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKLQkJKCJbQlRDb2V4XSwgJXMgQWdjIFRhYmxlXG4iLCAoKGJBZ2NUYWJsZUVuKSA/ICJFbmFibGUiIDogIkRpc2FibGUiKSkpOwotCXBCdGRtODcyMy0+YkN1ckFnY1RhYmxlRW4gPSBiQWdjVGFibGVFbjsKLQotCS8qIFJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgYlByZUFnY1RhYmxlRW4gPSVkLCBiQ3VyQWdjVGFibGVFbiA9JWRcbiIsICovCi0JLypwQnRkbTg3MjMtPmJQcmVBZ2NUYWJsZUVuLCBwQnRkbTg3MjMtPmJDdXJBZ2NUYWJsZUVuKSk7ICovCi0KLQlpZiAocEJ0ZG04NzIzLT5iUHJlQWdjVGFibGVFbiA9PSBwQnRkbTg3MjMtPmJDdXJBZ2NUYWJsZUVuKQotCQlyZXR1cm47Ci0KLQlCVERNX0FHQ1RhYmxlKHBhZGFwdGVyLCAodTgpYkFnY1RhYmxlRW4pOwotCi0JcEJ0ZG04NzIzLT5iUHJlQWdjVGFibGVFbiA9IHBCdGRtODcyMy0+YkN1ckFnY1RhYmxlRW47Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGRtXzJBbnRDb2V4VGFibGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICAgdTMyIHZhbDB4NmMwLCB1MzIgdmFsMHg2YzgsIHU4IHZhbDB4NmNjKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBidGRtXzg3MjNhXzJhbnQgKnBCdGRtODcyMyA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMkFudDsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgd3JpdGUgQ29leCBUYWJsZSAweDZjMCA9IDB4JXgsIDB4NmM4ID0gMHgleCwgMHg2Y2MgPSAweCV4XG4iLAotCQl2YWwweDZjMCwgdmFsMHg2YzgsIHZhbDB4NmNjKSk7Ci0JcEJ0ZG04NzIzLT5jdXJWYWwweDZjMCA9IHZhbDB4NmMwOwotCXBCdGRtODcyMy0+Y3VyVmFsMHg2YzggPSB2YWwweDZjODsKLQlwQnRkbTg3MjMtPmN1clZhbDB4NmNjID0gdmFsMHg2Y2M7Ci0KLQkvKiBSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIHByZVZhbDB4NmMwID0gMHgleCwgcHJlVmFsMHg2YzggPSAweCV4LCBwcmVWYWwweDZjYyA9IDB4JXggISFcbiIsICovCi0JLypwQnRkbTg3MjMtPnByZVZhbDB4NmMwLCBwQnRkbTg3MjMtPnByZVZhbDB4NmM4LCBwQnRkbTg3MjMtPnByZVZhbDB4NmNjKSk7ICovCi0JLyogUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBjdXJWYWwweDZjMCA9IDB4JXgsIGN1clZhbDB4NmM4ID0gMHgleCwgY3VyVmFsMHg2Y2MgPSAweCV4ICEhXG4iLCAqLwotCS8qcEJ0ZG04NzIzLT5jdXJWYWwweDZjMCwgcEJ0ZG04NzIzLT5jdXJWYWwweDZjOCwgcEJ0ZG04NzIzLT5jdXJWYWwweDZjYykpOyAqLwotCi0JaWYgKChwQnRkbTg3MjMtPnByZVZhbDB4NmMwID09IHBCdGRtODcyMy0+Y3VyVmFsMHg2YzApICYmCi0JICAgIChwQnRkbTg3MjMtPnByZVZhbDB4NmM4ID09IHBCdGRtODcyMy0+Y3VyVmFsMHg2YzgpICYmCi0JICAgIChwQnRkbTg3MjMtPnByZVZhbDB4NmNjID09IHBCdGRtODcyMy0+Y3VyVmFsMHg2Y2MpKQotCQlyZXR1cm47Ci0KLQlidGRtX1NldENvZXhUYWJsZShwYWRhcHRlciwgdmFsMHg2YzAsIHZhbDB4NmM4LCB2YWwweDZjYyk7Ci0KLQlwQnRkbTg3MjMtPnByZVZhbDB4NmMwID0gcEJ0ZG04NzIzLT5jdXJWYWwweDZjMDsKLQlwQnRkbTg3MjMtPnByZVZhbDB4NmM4ID0gcEJ0ZG04NzIzLT5jdXJWYWwweDZjODsKLQlwQnRkbTg3MjMtPnByZVZhbDB4NmNjID0gcEJ0ZG04NzIzLT5jdXJWYWwweDZjYzsKLX0KLQotc3RhdGljIHZvaWQgYnRkbV8yQW50SWdub3JlV2xhbkFjdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBiRW5hYmxlKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBidGRtXzg3MjNhXzJhbnQgKnBCdGRtODcyMyA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMkFudDsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKLQkJKCJbQlRDb2V4XSwgdHVybiBJZ25vcmUgV2xhbkFjdCAlc1xuIiwgKGJFbmFibGUgPyAiT04iIDogIk9GRiIpKSk7Ci0JcEJ0ZG04NzIzLT5iQ3VySWdub3JlV2xhbkFjdCA9IGJFbmFibGU7Ci0KLQotCWlmIChwQnRkbTg3MjMtPmJQcmVJZ25vcmVXbGFuQWN0ID09IHBCdGRtODcyMy0+YkN1cklnbm9yZVdsYW5BY3QpCi0JCXJldHVybjsKLQotCWJ0ZG1fU2V0RndJZ25vcmVXbGFuQWN0KHBhZGFwdGVyLCBiRW5hYmxlKTsKLQlwQnRkbTg3MjMtPmJQcmVJZ25vcmVXbGFuQWN0ID0gcEJ0ZG04NzIzLT5iQ3VySWdub3JlV2xhbkFjdDsKLX0KLQotc3RhdGljIHZvaWQKLWJ0ZG1fMkFudFNldEZ3M2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYnl0ZTEsIHU4IGJ5dGUyLAotCQkgdTggYnl0ZTMsIHU4IGJ5dGU0LCB1OCBieXRlNSkKLXsKLQl1OCBIMkNfUGFyYW1ldGVyWzVdID0gezB9OwotCi0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQkvKiAgYnl0ZTFbMTowXSAhPSAwIG1lYW5zIGVuYWJsZSBwc3RkbWEgKi8KLQkvKiAgZm9yIDJBbnQgYnQgY29leGlzdCwgaWYgYnl0ZTEgIT0gMCBtZWFucyBlbmFibGUgcHN0ZG1hICovCi0JaWYgKGJ5dGUxKQotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5iRldDb2V4aXN0QWxsT2ZmID0gZmFsc2U7Ci0JSDJDX1BhcmFtZXRlclswXSA9IGJ5dGUxOwotCUgyQ19QYXJhbWV0ZXJbMV0gPSBieXRlMjsKLQlIMkNfUGFyYW1ldGVyWzJdID0gYnl0ZTM7Ci0JSDJDX1BhcmFtZXRlclszXSA9IGJ5dGU0OwotCUgyQ19QYXJhbWV0ZXJbNF0gPSBieXRlNTsKLQotCXBIYWxEYXRhLT5idF9jb2V4aXN0LmZ3M2FWYWxbMF0gPSBieXRlMTsKLQlwSGFsRGF0YS0+YnRfY29leGlzdC5mdzNhVmFsWzFdID0gYnl0ZTI7Ci0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuZnczYVZhbFsyXSA9IGJ5dGUzOwotCXBIYWxEYXRhLT5idF9jb2V4aXN0LmZ3M2FWYWxbM10gPSBieXRlNDsKLQlwSGFsRGF0YS0+YnRfY29leGlzdC5mdzNhVmFsWzRdID0gYnl0ZTU7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEZXIHdyaXRlIDB4M2EoNWJ5dGVzKSA9IDB4JXglMDh4XG4iLAotCQlIMkNfUGFyYW1ldGVyWzBdLAotCQlIMkNfUGFyYW1ldGVyWzFdPDwyNHxIMkNfUGFyYW1ldGVyWzJdPDwxNnxIMkNfUGFyYW1ldGVyWzNdPDw4fEgyQ19QYXJhbWV0ZXJbNF0pKTsKLQotCUZpbGxIMkNDbWQocGFkYXB0ZXIsIDB4M2EsIDUsIEgyQ19QYXJhbWV0ZXIpOwotCX0KLQotc3RhdGljIHZvaWQgYnRkbV8yQW50UHNUZG1hKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJUdXJuT24sIHU4IHR5cGUpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMmFudCAqcEJ0ZG04NzIzID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0yQW50OwotCXUzMgkJCWJ0VHhSeENudCA9IDA7Ci0JdTggYlR1cm5PbkJ5Q250ID0gZmFsc2U7Ci0JdTggcHNUZG1hVHlwZUJ5Q250ID0gMDsKLQotCWJ0VHhSeENudCA9IEJURE1fQnRUeFJ4Q291bnRlckgocGFkYXB0ZXIpK0JURE1fQnRUeFJ4Q291bnRlckwocGFkYXB0ZXIpOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQlQgVHhSeCBDb3VudGVycyA9ICVkXG4iLCBidFR4UnhDbnQpKTsKLQlpZiAoYnRUeFJ4Q250ID4gMzAwMCkgewotCQliVHVybk9uQnlDbnQgPSB0cnVlOwotCQlwc1RkbWFUeXBlQnlDbnQgPSA4OwotCi0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKLQkJCSgiW0JUQ29leF0sIEZvciBCVFR4UnhDb3VudGVycywgdHVybiAlcyBQUyBURE1BLCB0eXBlID0lZFxuIiwKLQkJCShiVHVybk9uQnlDbnQgPyAiT04iIDogIk9GRiIpLCBwc1RkbWFUeXBlQnlDbnQpKTsKLQkJcEJ0ZG04NzIzLT5iQ3VyUHNUZG1hT24gPSBiVHVybk9uQnlDbnQ7Ci0JCXBCdGRtODcyMy0+Y3VyUHNUZG1hID0gcHNUZG1hVHlwZUJ5Q250OwotCX0gZWxzZSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKLQkJCSgiW0JUQ29leF0sIHR1cm4gJXMgUFMgVERNQSwgdHlwZSA9JWRcbiIsCi0JCQkoYlR1cm5PbiA/ICJPTiIgOiAiT0ZGIiksIHR5cGUpKTsKLQkJcEJ0ZG04NzIzLT5iQ3VyUHNUZG1hT24gPSBiVHVybk9uOwotCQlwQnRkbTg3MjMtPmN1clBzVGRtYSA9IHR5cGU7Ci0JfQotCi0JaWYgKChwQnRkbTg3MjMtPmJQcmVQc1RkbWFPbiA9PSBwQnRkbTg3MjMtPmJDdXJQc1RkbWFPbikgJiYKLQkgICAgKHBCdGRtODcyMy0+cHJlUHNUZG1hID09IHBCdGRtODcyMy0+Y3VyUHNUZG1hKSkKLQkJcmV0dXJuOwotCi0JaWYgKGJUdXJuT24pIHsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgMToKLQkJZGVmYXVsdDoKLQkJCWJ0ZG1fMkFudFNldEZ3M2EocGFkYXB0ZXIsIDB4ZTMsIDB4MWEsIDB4MWEsIDB4YTEsIDB4OTgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCWJ0ZG1fMkFudFNldEZ3M2EocGFkYXB0ZXIsIDB4ZTMsIDB4MTIsIDB4MTIsIDB4YTEsIDB4OTgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCWJ0ZG1fMkFudFNldEZ3M2EocGFkYXB0ZXIsIDB4ZTMsIDB4YSwgMHhhLCAweGExLCAweDk4KTsKLQkJCWJyZWFrOwotCQljYXNlIDQ6Ci0JCQlidGRtXzJBbnRTZXRGdzNhKHBhZGFwdGVyLCAweGEzLCAweDUsIDB4NSwgMHhhMSwgMHg4MCk7Ci0JCQlicmVhazsKLQkJY2FzZSA1OgotCQkJYnRkbV8yQW50U2V0RnczYShwYWRhcHRlciwgMHhlMywgMHgxYSwgMHgxYSwgMHgyMCwgMHg5OCk7Ci0JCQlicmVhazsKLQkJY2FzZSA2OgotCQkJYnRkbV8yQW50U2V0RnczYShwYWRhcHRlciwgMHhlMywgMHgxMiwgMHgxMiwgMHgyMCwgMHg5OCk7Ci0JCQlicmVhazsKLQkJY2FzZSA3OgotCQkJYnRkbV8yQW50U2V0RnczYShwYWRhcHRlciwgMHhlMywgMHhhLCAweGEsIDB4MjAsIDB4OTgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgODoKLQkJCWJ0ZG1fMkFudFNldEZ3M2EocGFkYXB0ZXIsIDB4YTMsIDB4NSwgMHg1LCAweDIwLCAweDgwKTsKLQkJCWJyZWFrOwotCQljYXNlIDk6Ci0JCQlidGRtXzJBbnRTZXRGdzNhKHBhZGFwdGVyLCAweGUzLCAweDFhLCAweDFhLCAweGExLCAweDk4KTsKLQkJCWJyZWFrOwotCQljYXNlIDEwOgotCQkJYnRkbV8yQW50U2V0RnczYShwYWRhcHRlciwgMHhlMywgMHgxMiwgMHgxMiwgMHhhMSwgMHg5OCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMToKLQkJCWJ0ZG1fMkFudFNldEZ3M2EocGFkYXB0ZXIsIDB4ZTMsIDB4YSwgMHhhLCAweGExLCAweDk4KTsKLQkJCWJyZWFrOwotCQljYXNlIDEyOgotCQkJYnRkbV8yQW50U2V0RnczYShwYWRhcHRlciwgMHhlMywgMHg1LCAweDUsIDB4YTEsIDB4OTgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTM6Ci0JCQlidGRtXzJBbnRTZXRGdzNhKHBhZGFwdGVyLCAweGUzLCAweDFhLCAweDFhLCAweDIwLCAweDk4KTsKLQkJCWJyZWFrOwotCQljYXNlIDE0OgotCQkJYnRkbV8yQW50U2V0RnczYShwYWRhcHRlciwgMHhlMywgMHgxMiwgMHgxMiwgMHgyMCwgMHg5OCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxNToKLQkJCWJ0ZG1fMkFudFNldEZ3M2EocGFkYXB0ZXIsIDB4ZTMsIDB4YSwgMHhhLCAweDIwLCAweDk4KTsKLQkJCWJyZWFrOwotCQljYXNlIDE2OgotCQkJYnRkbV8yQW50U2V0RnczYShwYWRhcHRlciwgMHhlMywgMHg1LCAweDUsIDB4MjAsIDB4OTgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTc6Ci0JCQlidGRtXzJBbnRTZXRGdzNhKHBhZGFwdGVyLCAweGEzLCAweDJmLCAweDJmLCAweDIwLCAweDgwKTsKLQkJCWJyZWFrOwotCQljYXNlIDE4OgotCQkJYnRkbV8yQW50U2V0RnczYShwYWRhcHRlciwgMHhlMywgMHg1LCAweDUsIDB4YTEsIDB4OTgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTk6Ci0JCQlidGRtXzJBbnRTZXRGdzNhKHBhZGFwdGVyLCAweGUzLCAweDI1LCAweDI1LCAweGExLCAweDk4KTsKLQkJCWJyZWFrOwotCQljYXNlIDIwOgotCQkJYnRkbV8yQW50U2V0RnczYShwYWRhcHRlciwgMHhlMywgMHgyNSwgMHgyNSwgMHgyMCwgMHg5OCk7Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qICBkaXNhYmxlIFBTIHRkbWEgKi8KLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgMDoKLQkJCWJ0ZG1fMkFudFNldEZ3M2EocGFkYXB0ZXIsIDB4MCwgMHgwLCAweDAsIDB4OCwgMHgwKTsKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQlidGRtXzJBbnRTZXRGdzNhKHBhZGFwdGVyLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJ0ZG1fMkFudFNldEZ3M2EocGFkYXB0ZXIsIDB4MCwgMHgwLCAweDAsIDB4OCwgMHgwKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogIHVwZGF0ZSBwcmUgc3RhdGUgKi8KLQlwQnRkbTg3MjMtPmJQcmVQc1RkbWFPbiA9ICBwQnRkbTg3MjMtPmJDdXJQc1RkbWFPbjsKLQlwQnRkbTg3MjMtPnByZVBzVGRtYSA9IHBCdGRtODcyMy0+Y3VyUHNUZG1hOwotfQotCi1zdGF0aWMgdm9pZCBidGRtXzJBbnRCdElucXVpcnlQYWdlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JYnRkbV8yQW50Q29leFRhYmxlKHBhZGFwdGVyLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7Ci0JYnRkbV8yQW50SWdub3JlV2xhbkFjdChwYWRhcHRlciwgZmFsc2UpOwotCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgOCk7Ci19Ci0KLXN0YXRpYyB1OCBidGRtX0hvbGRGb3JCdElucVBhZ2Uoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQl1MzIgY3VyVGltZSA9IGppZmZpZXM7Ci0KLQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYkMyaEJ0SW5xdWlyeVBhZ2UpIHsKLQkJLyogIGJ0IGlucXVpcnkgb3IgcGFnZSBpcyBzdGFydGVkLiAqLwotCQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRJbnFQYWdlU3RhcnRUaW1lID09IDApIHsKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0SW5xUGFnZVN0YXJ0VGltZSA9IGN1clRpbWU7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEJUIElucXVpcnkvcGFnZSBpcyBzdGFydGVkIGF0IHRpbWUgOiAweCVseCBcbiIsCi0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idElucVBhZ2VTdGFydFRpbWUpKTsKLQkJfQotCX0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEJUIElucXVpcnkvcGFnZSBzdGFydGVkIHRpbWUgOiAweCVseCwgY3VyVGltZSA6IDB4JXggXG4iLAotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idElucVBhZ2VTdGFydFRpbWUsIGN1clRpbWUpKTsKLQotCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idElucVBhZ2VTdGFydFRpbWUpIHsKLQkJaWYgKCgoY3VyVGltZSAtIHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0SW5xUGFnZVN0YXJ0VGltZSkvMTAwMDAwMCkgPj0gMTApIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQlQgSW5xdWlyeS9wYWdlID49IDEwc2VjISEhIikpOwotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRJbnFQYWdlU3RhcnRUaW1lID0gMDsKLQkJfQotCX0KLQotCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idElucVBhZ2VTdGFydFRpbWUpIHsKLQkJYnRkbV8yQW50Q29leFRhYmxlKHBhZGFwdGVyLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7Ci0JCWJ0ZG1fMkFudElnbm9yZVdsYW5BY3QocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA4KTsKLQkJcmV0dXJuIHRydWU7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KLQotc3RhdGljIHU4IGJ0ZG1fSXMyQW50ODcyM0FDb21tb25BY3Rpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8yYW50ICpwQnRkbTg3MjMgPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTJBbnQ7Ci0JdTggYkNvbW1vbiA9IGZhbHNlOwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIiVzIDpCVERNX0lzV2lmaUNvbm5lY3Rpb25FeGlzdCA9JXggY2hlY2tfZndzdGF0ZSA9JXggcG1sbWVwcml2LT5md19zdGF0ZSA9IDB4JXhcbiIsIF9fZnVuY19fLCBCVERNX0lzV2lmaUNvbm5lY3Rpb25FeGlzdChwYWRhcHRlciksIGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgKF9GV19VTkRFUl9TVVJWRVl8X0ZXX1VOREVSX0xJTktJTkcpKSwgcGFkYXB0ZXItPm1sbWVwcml2LmZ3X3N0YXRlKSk7Ci0KLQlpZiAoKCFCVERNX0lzV2lmaUNvbm5lY3Rpb25FeGlzdChwYWRhcHRlcikpICYmCi0JICAgICghY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCAoX0ZXX1VOREVSX1NVUlZFWXxfRldfVU5ERVJfTElOS0lORykpKSAmJgotCSAgICAoQlRfMkFOVF9CVF9TVEFUVVNfSURMRSA9PSBwQnRkbTg3MjMtPmJ0U3RhdHVzKSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSBpZGxlICsgQnQgaWRsZSEhXG4iKSk7Ci0KLQkJYnRkbV8yQW50TG93UGVuYWx0eVJhKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCWJ0ZG1fMkFudFJmU2hyaW5rKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCWJ0ZG1fMkFudENvZXhUYWJsZShwYWRhcHRlciwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwotCi0JCWJ0ZG1fMkFudElnbm9yZVdsYW5BY3QocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCBmYWxzZSwgMCk7Ci0JCWJ0ZG1fMkFudEZ3RGFjU3dpbmdMdmwocGFkYXB0ZXIsIDB4MjApOwotCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgZmFsc2UpOwotCi0JCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQotCQliQ29tbW9uID0gdHJ1ZTsKLQl9IGVsc2UgaWYgKCgoQlRETV9Jc1dpZmlDb25uZWN0aW9uRXhpc3QocGFkYXB0ZXIpKSB8fAotCQkgICAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCAoX0ZXX1VOREVSX1NVUlZFWXxfRldfVU5ERVJfTElOS0lORykpKSkgJiYKLQkJICAgKEJUXzJBTlRfQlRfU1RBVFVTX0lETEUgPT0gcEJ0ZG04NzIzLT5idFN0YXR1cykpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgbm9uLWlkbGUgKyBCVCBpZGxlISFcbiIpKTsKLQotCQlidGRtXzJBbnRMb3dQZW5hbHR5UmEocGFkYXB0ZXIsIHRydWUpOwotCQlidGRtXzJBbnRSZlNocmluayhwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnRDb2V4VGFibGUocGFkYXB0ZXIsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKLQotCQlidGRtXzJBbnRJZ25vcmVXbGFuQWN0KHBhZGFwdGVyLCBmYWxzZSk7Ci0JCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgZmFsc2UsIDApOwotCQlidGRtXzJBbnRGd0RhY1N3aW5nTHZsKHBhZGFwdGVyLCAweDIwKTsKLQkJYnRkbV8yQW50RGVjQnRQd3IocGFkYXB0ZXIsIHRydWUpOwotCi0JCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQotCQliQ29tbW9uID0gdHJ1ZTsKLQl9IGVsc2UgaWYgKCghQlRETV9Jc1dpZmlDb25uZWN0aW9uRXhpc3QocGFkYXB0ZXIpKSAmJgotCQkgICAoIWNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgKF9GV19VTkRFUl9TVVJWRVl8X0ZXX1VOREVSX0xJTktJTkcpKSkgJiYKLQkJICAgKEJUXzJBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFID09IHBCdGRtODcyMy0+YnRTdGF0dXMpKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIGlkbGUgKyBCdCBjb25uZWN0ZWQgaWRsZSEhXG4iKSk7Ci0KLQkJYnRkbV8yQW50TG93UGVuYWx0eVJhKHBhZGFwdGVyLCB0cnVlKTsKLQkJYnRkbV8yQW50UmZTaHJpbmsocGFkYXB0ZXIsIHRydWUpOwotCQlidGRtXzJBbnRDb2V4VGFibGUocGFkYXB0ZXIsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKLQotCQlidGRtXzJBbnRJZ25vcmVXbGFuQWN0KHBhZGFwdGVyLCBmYWxzZSk7Ci0JCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgZmFsc2UsIDApOwotCQlidGRtXzJBbnRGd0RhY1N3aW5nTHZsKHBhZGFwdGVyLCAweDIwKTsKLQkJYnRkbV8yQW50RGVjQnRQd3IocGFkYXB0ZXIsIGZhbHNlKTsKLQotCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0KLQkJYkNvbW1vbiA9IHRydWU7Ci0JfSBlbHNlIGlmICgoKEJURE1fSXNXaWZpQ29ubmVjdGlvbkV4aXN0KHBhZGFwdGVyKSkgfHwKLQkJICAgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgKF9GV19VTkRFUl9TVVJWRVl8X0ZXX1VOREVSX0xJTktJTkcpKSkpICYmCi0JCSAgIChCVF8yQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRSA9PSBwQnRkbTg3MjMtPmJ0U3RhdHVzKSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSBub24taWRsZSArIEJ0IGNvbm5lY3RlZCBpZGxlISFcbiIpKTsKLQotCQlidGRtXzJBbnRMb3dQZW5hbHR5UmEocGFkYXB0ZXIsIHRydWUpOwotCQlidGRtXzJBbnRSZlNocmluayhwYWRhcHRlciwgdHJ1ZSk7Ci0JCWJ0ZG1fMkFudENvZXhUYWJsZShwYWRhcHRlciwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwotCi0JCWJ0ZG1fMkFudElnbm9yZVdsYW5BY3QocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCBmYWxzZSwgMCk7Ci0JCWJ0ZG1fMkFudEZ3RGFjU3dpbmdMdmwocGFkYXB0ZXIsIDB4MjApOwotCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgdHJ1ZSk7Ci0KLQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCi0JCWJDb21tb24gPSB0cnVlOwotCX0gZWxzZSBpZiAoKCFCVERNX0lzV2lmaUNvbm5lY3Rpb25FeGlzdChwYWRhcHRlcikpICYmCi0JCSAgICghY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCAoX0ZXX1VOREVSX1NVUlZFWXxfRldfVU5ERVJfTElOS0lORykpKSAmJgotCQkgICAoQlRfMkFOVF9CVF9TVEFUVVNfTk9OX0lETEUgPT0gcEJ0ZG04NzIzLT5idFN0YXR1cykpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgaWRsZSArIEJUIG5vbi1pZGxlISFcbiIpKTsKLQotCQlidGRtXzJBbnRMb3dQZW5hbHR5UmEocGFkYXB0ZXIsIHRydWUpOwotCQlidGRtXzJBbnRSZlNocmluayhwYWRhcHRlciwgdHJ1ZSk7Ci0JCWJ0ZG1fMkFudENvZXhUYWJsZShwYWRhcHRlciwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwotCi0JCWJ0ZG1fMkFudElnbm9yZVdsYW5BY3QocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCBmYWxzZSwgMCk7Ci0JCWJ0ZG1fMkFudEZ3RGFjU3dpbmdMdmwocGFkYXB0ZXIsIDB4MjApOwotCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgZmFsc2UpOwotCi0JCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQotCQliQ29tbW9uID0gdHJ1ZTsKLQl9IGVsc2UgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSBub24taWRsZSArIEJUIG5vbi1pZGxlISFcbiIpKTsKLQkJYnRkbV8yQW50TG93UGVuYWx0eVJhKHBhZGFwdGVyLCB0cnVlKTsKLQkJYnRkbV8yQW50UmZTaHJpbmsocGFkYXB0ZXIsIHRydWUpOwotCQlidGRtXzJBbnRDb2V4VGFibGUocGFkYXB0ZXIsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKLQkJYnRkbV8yQW50SWdub3JlV2xhbkFjdChwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnRGd0RhY1N3aW5nTHZsKHBhZGFwdGVyLCAweDIwKTsKLQotCQliQ29tbW9uID0gZmFsc2U7Ci0JfQotCXJldHVybiBiQ29tbW9uOwotfQotCi1zdGF0aWMgdm9pZAotYnRkbV8yQW50VGRtYUR1cmF0aW9uQWRqdXN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJTY29IaWQsCi0JCQkgICAgdTggYlR4UGF1c2UsIHU4IG1heEludGVydmFsKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBidGRtXzg3MjNhXzJhbnQgKnBCdGRtODcyMyA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMkFudDsKLQlzdGF0aWMgczMyCQl1cCwgZG4sIG0sIG4sIFdhaXRDb3VudDsKLQlzMzIJCQlyZXN1bHQ7ICAgLyogMDogbm8gY2hhbmdlLCArMTogaW5jcmVhc2UgV2lGaSBkdXJhdGlvbiwgLTE6IGRlY3JlYXNlIFdpRmkgZHVyYXRpb24gKi8KLQl1OCByZXRyeUNvdW50ID0gMDsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgVGRtYUR1cmF0aW9uQWRqdXN0KClcbiIpKTsKLQotCWlmIChwQnRkbTg3MjMtPmJSZXNldFRkbWFBZGp1c3QpIHsKLQkJcEJ0ZG04NzIzLT5iUmVzZXRUZG1hQWRqdXN0ID0gZmFsc2U7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgZmlyc3QgcnVuIFRkbWFEdXJhdGlvbkFkanVzdCgpISFcbiIpKTsKLQkJaWYgKGJTY29IaWQpIHsKLQkJCWlmIChiVHhQYXVzZSkgewotCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTUpOwotCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTU7Ci0JCQl9IGVsc2UgewotCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTEpOwotCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTE7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoYlR4UGF1c2UpIHsKLQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDcpOwotCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNzsKLQkJCX0gZWxzZSB7Ci0JCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAzKTsKLQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDM7Ci0JCQl9Ci0JCX0KLQkJdXAgPSAwOwotCQlkbiA9IDA7Ci0JCW0gPSAxOwotCQluID0gMzsKLQkJcmVzdWx0ID0gMDsKLQkJV2FpdENvdW50ID0gMDsKLQl9IGVsc2UgewotCQkvKiBhY2NxdWlyZSB0aGUgQlQgVFJ4IHJldHJ5IGNvdW50IGZyb20gQlRfSW5mbyBieXRlMiAqLwotCQlyZXRyeUNvdW50ID0gcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRSZXRyeUNudDsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCByZXRyeUNvdW50ID0gJWRcbiIsIHJldHJ5Q291bnQpKTsKLQkJcmVzdWx0ID0gMDsKLQkJV2FpdENvdW50Kys7Ci0KLQkJaWYgKHJldHJ5Q291bnQgPT0gMCkgeyAgLyogIG5vIHJldHJ5IGluIHRoZSBsYXN0IDItc2Vjb25kIGR1cmF0aW9uICovCi0JCQl1cCsrOwotCQkJZG4tLTsKLQotCQkJaWYgKGRuIDw9IDApCi0JCQkJZG4gPSAwOwotCi0JCQlpZiAodXAgPj0gbikgewkvKiAgaWYgs3PE8iBuIK3TMqztIHJldHJ5IGNvdW50rLAwLCCraL3VvGVXaUZpIGR1cmF0aW9uICovCi0JCQkJV2FpdENvdW50ID0gMDsKLQkJCQluID0gMzsKLQkJCQl1cCA9IDA7Ci0JCQkJZG4gPSAwOwotCQkJCXJlc3VsdCA9IDE7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBJbmNyZWFzZSB3aWZpIGR1cmF0aW9uISFcbiIpKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChyZXRyeUNvdW50IDw9IDMpIHsJLyogIDw9IDMgcmV0cnkgaW4gdGhlIGxhc3QgMi1zZWNvbmQgZHVyYXRpb24gKi8KLQkJCXVwLS07Ci0JCQlkbisrOwotCi0JCQlpZiAodXAgPD0gMCkKLQkJCQl1cCA9IDA7Ci0KLQkJCWlmIChkbiA9PSAyKSB7CS8qICBpZiCzc8TyIDIgrdMyrO0gcmV0cnkgY291bnQ8IDMsIKtovdWvtldpRmkgZHVyYXRpb24gKi8KLQkJCQlpZiAoV2FpdENvdW50IDw9IDIpCi0JCQkJCW0rKzsgLyogIMHXp0ukQKq9pmKo4q3TbGV2ZWykpKjTpl4gKi8KLQkJCQllbHNlCi0JCQkJCW0gPSAxOwotCi0JCQkJaWYgKG0gPj0gMjApIC8qIG0gs8ykaq3IID0gMjAgJyCzzKRqMTIwrO0gcmVjaGVja6xPp1+91b7jIFdpRmkgZHVyYXRpb24uICovCi0JCQkJCW0gPSAyMDsKLQotCQkJCW4gPSAzKm07Ci0JCQkJdXAgPSAwOwotCQkJCWRuID0gMDsKLQkJCQlXYWl0Q291bnQgPSAwOwotCQkJCXJlc3VsdCA9IC0xOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgRGVjcmVhc2Ugd2lmaSBkdXJhdGlvbiBmb3IgcmV0cnlDb3VudGVyPDMhIVxuIikpOwotCQkJfQotCQl9IGVsc2UgeyAgLyogcmV0cnkgY291bnQgPiAzLCClda1uMaa4IHJldHJ5IGNvdW50ID4gMywgq2i91a+2V2lGaSBkdXJhdGlvbiAqLwotCQkJaWYgKFdhaXRDb3VudCA9PSAxKQotCQkJCW0rKzsgLyogIMHXp0ukQKq9pmKo4q3TbGV2ZWykpKjTpl4gKi8KLQkJCWVsc2UKLQkJCQltID0gMTsKLQotCQkJaWYgKG0gPj0gMjApIC8qIG0gs8ykaq3IID0gMjAgJyCzzKRqMTIwrO0gcmVjaGVja6xPp1+91b7jIFdpRmkgZHVyYXRpb24uICovCi0JCQkJbSA9IDIwOwotCQkJbiA9IDMqbTsKLQkJCXVwID0gMDsKLQkJCWRuID0gMDsKLQkJCVdhaXRDb3VudCA9IDA7Ci0JCQlyZXN1bHQgPSAtMTsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgRGVjcmVhc2Ugd2lmaSBkdXJhdGlvbiBmb3IgcmV0cnlDb3VudGVyPjMhIVxuIikpOwotCQl9Ci0KLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBtYXggSW50ZXJ2YWwgPSAlZFxuIiwgbWF4SW50ZXJ2YWwpKTsKLQkJaWYgKG1heEludGVydmFsID09IDEpIHsKLQkJCWlmIChiVHhQYXVzZSkgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgVHhQYXVzZSA9IDFcbiIpKTsKLQkJCQlpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMSkgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDUpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDU7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAyKSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNik7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNjsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDMpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA3KTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA3OwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNCkgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDgpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDg7Ci0JCQkJfQotCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA5KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTMpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDEzOwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTApIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNCk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTQ7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMSkgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE1KTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNTsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDEyKSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTYpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE2OwotCQkJCX0KLQotCQkJCWlmIChyZXN1bHQgPT0gLTEpIHsKLQkJCQkJaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDUpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNik7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDY7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNikgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA3KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNzsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA3KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDgpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA4OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDEzKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE0KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTQ7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTQpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTUpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNTsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxNSkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNik7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE2OwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChyZXN1bHQgPT0gMSkgewotCQkJCQlpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gOCkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA3KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNzsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA3KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDYpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA2OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDYpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNSk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDU7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTYpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTUpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNTsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxNSkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNCk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE0OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDE0KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDEzKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgVHhQYXVzZSA9IDBcbiIpKTsKLQkJCQlpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNSkgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDEpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA2KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMik7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMjsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDcpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAzKTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAzOwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gOCkgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDQpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDQ7Ci0JCQkJfQotCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMykgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDkpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDk7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxNCkgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDEwKTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMDsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDE1KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTEpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDExOwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTYpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMik7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTI7Ci0JCQkJfQotCi0JCQkJaWYgKHJlc3VsdCA9PSAtMSkgewotCQkJCQlpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMSkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAyKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMjsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAyKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDMpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAzOwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDMpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNCk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDQ7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gOSkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMCk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDEwOwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDEwKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDExKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTE7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTEpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTIpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMjsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAocmVzdWx0ID09IDEpIHsKLQkJCQkJaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDQpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMyk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDM7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMykgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAyKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMjsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAyKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDEpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxOwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDEyKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDExKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTE7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTEpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTApOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMDsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMCkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA5KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gOTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChtYXhJbnRlcnZhbCA9PSAyKSB7Ci0JCQlpZiAoYlR4UGF1c2UpIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFR4UGF1c2UgPSAxXG4iKSk7Ci0JCQkJaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDEpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA2KTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA2OwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMikgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDYpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDY7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAzKSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNyk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNzsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDQpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA4KTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA4OwotCQkJCX0KLQkJCQlpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gOSkgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE0KTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNDsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDEwKSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTQpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE0OwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTEpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNSk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTU7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMikgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE2KTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNjsKLQkJCQl9Ci0JCQkJaWYgKHJlc3VsdCA9PSAtMSkgewotCQkJCQlpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNSkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA2KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNjsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA2KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDcpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA3OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDcpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgOCk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDg7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTMpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTQpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNDsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxNCkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNSk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE1OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDE1KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE2KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTY7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHJlc3VsdCA9PSAxKSB7Ci0JCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA4KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDcpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA3OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDcpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNik7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDY7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNikgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA2KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNjsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxNikgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNSk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE1OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDE1KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE0KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTQ7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTQpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTQpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNDsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBUeFBhdXNlID0gMFxuIikpOwotCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA1KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMik7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMjsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDYpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAyKTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAyOwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNykgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDMpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDM7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA4KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNCk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNDsKLQkJCQl9Ci0JCQkJaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDEzKSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTApOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDEwOwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTQpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMCk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTA7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxNSkgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDExKTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDE2KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTIpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDEyOwotCQkJCX0KLQkJCQlpZiAocmVzdWx0ID09IC0xKSB7Ci0JCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDIpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAyOwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDIpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMyk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDM7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMykgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA0KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNDsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA5KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDEwKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTA7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTApIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTEpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMSkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMik7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDEyOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChyZXN1bHQgPT0gMSkgewotCQkJCQlpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNCkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAzKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMzsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAzKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDIpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAyOwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDIpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMik7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDI7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTIpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTEpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMSkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMCk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDEwOwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDEwKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDEwKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTA7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobWF4SW50ZXJ2YWwgPT0gMykgewotCQkJaWYgKGJUeFBhdXNlKSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBUeFBhdXNlID0gMVxuIikpOwotCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxKSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNyk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNzsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDIpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA3KTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA3OwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMykgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDcpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDc7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA0KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgOCk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gODsKLQkJCQl9Ci0JCQkJaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDkpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNSk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTU7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMCkgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE1KTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNTsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDExKSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTUpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE1OwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTIpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNik7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTY7Ci0JCQkJfQotCQkJCWlmIChyZXN1bHQgPT0gLTEpIHsKLQkJCQkJaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDUpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNyk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDc7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNikgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA3KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNzsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA3KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDgpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA4OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDEzKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE1KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTU7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTQpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTUpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNTsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxNSkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNik7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE2OwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChyZXN1bHQgPT0gMSkgewotCQkJCQlpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gOCkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA3KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNzsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA3KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDcpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA3OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDYpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNyk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDc7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTYpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTUpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNTsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxNSkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNSk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE1OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDE0KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE1KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgVHhQYXVzZSA9IDBcbiIpKTsKLQkJCQlpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNSkgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDMpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDM7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA2KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMyk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMzsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDcpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAzKTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAzOwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gOCkgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDQpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDQ7Ci0JCQkJfQotCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMykgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDExKTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDE0KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTEpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDExOwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTUpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMSk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTE7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxNikgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDEyKTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMjsKLQkJCQl9Ci0JCQkJaWYgKHJlc3VsdCA9PSAtMSkgewotCQkJCQlpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMSkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAzKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMzsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAyKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDMpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAzOwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDMpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNCk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDQ7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gOSkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMSk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDExOwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDEwKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDExKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTE7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTEpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTIpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMjsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAocmVzdWx0ID09IDEpIHsKLQkJCQkJaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDQpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMyk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDM7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMykgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAzKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMzsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAyKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDMpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAzOwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDEyKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDExKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTE7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTEpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTEpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMCkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMSk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDExOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgUHNUZG1hIHR5cGUgOiByZWNvcmRQc1RkbWEgPSVkXG4iLCBwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSkpOwotCS8qICBpZiBjdXJyZW50IFBzVGRtYSBub3QgbWF0Y2ggd2l0aCB0aGUgcmVjb3JkZWQgb25lICh3aGVuIHNjYW4sIGRoY3AuLi4pLCAqLwotCS8qICB0aGVuIHdlIGhhdmUgdG8gYWRqdXN0IGl0IGJhY2sgdG8gdGhlIHByZXZpb3VzIHJlY29yZCBvbmUuICovCi0JaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hICE9IHBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgUHNUZG1hIHR5cGUgZGlzbWF0Y2ghISEsIGN1clBzVGRtYSA9JWQsIHJlY29yZFBzVGRtYSA9JWRcbiIsCi0JCQlwQnRkbTg3MjMtPmN1clBzVGRtYSwgcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUpKTsKLQotCQlpZiAoIWNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWXxfRldfVU5ERVJfTElOS0lORykpCi0JCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIHBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlKTsKLQkJZWxzZQotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCByb2FtaW5nL2xpbmsvc2NhbiBpcyB1bmRlciBwcm9ncmVzcywgd2lsbCBhZGp1c3QgbmV4dCB0aW1lISEhXG4iKSk7Ci0JfQotfQotCi0vKiAgZGVmYXVsdCBBY3Rpb24gKi8KLS8qICBTQ08gb25seSBvciBTQ08rUEFOKEhTKSAqLwotc3RhdGljIHZvaWQgYnRkbV8yQW50ODcyM0FTQ09BY3Rpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1OCBidFJzc2lTdGF0ZSwgYnRSc3NpU3RhdGUxOwotCi0JaWYgKGJ0ZG1fTmVlZFRvRGVjQnRQd3IocGFkYXB0ZXIpKQotCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgdHJ1ZSk7Ci0JZWxzZQotCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgZmFsc2UpOwotCi0JaWYgKEJURE1fSXNIVDQwKHBhZGFwdGVyKSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiSFQ0MFxuIikpOwotCQlidFJzc2lTdGF0ZSA9IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlKHBhZGFwdGVyLCAyLCAzNywgMCk7Ci0JCS8qICBmdyBtZWNoYW5pc20gKi8KLQkJaWYgKChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX0hJR0gpIHx8Ci0JCSAgICAoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpLTEgaGlnaCBcbiIpKTsKLQkJCVBsYXRmb3JtRUZJT1dyaXRlMUJ5dGUocGFkYXB0ZXIsIDB4ODgzLCAweDQwKTsKLQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTEpOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaS0xIGxvdyBcbiIpKTsKLQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTUpOwotCQl9Ci0KLQkJLyogIHN3IG1lY2hhbmlzbSAqLwotCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCB0cnVlKTsKLQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQl9IGVsc2UgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiSFQyMCBvciBMZWdhY3lcbiIpKTsKLQkJYnRSc3NpU3RhdGUgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZShwYWRhcHRlciwgMiwgMzcsIDApOwotCQlidFJzc2lTdGF0ZTEgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZTEocGFkYXB0ZXIsIDIsIDI3LCAwKTsKLQotCQkvKiAgZncgbWVjaGFuaXNtICovCi0JCWlmICgoYnRSc3NpU3RhdGUxID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpLTEgaGlnaCBcbiIpKTsKLQkJCVBsYXRmb3JtRUZJT1dyaXRlMUJ5dGUocGFkYXB0ZXIsIDB4ODgzLCAweDQwKTsKLQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTEpOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaS0xIGxvdyBcbiIpKTsKLQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTUpOwotCQl9Ci0KLQkJLyogIHN3IG1lY2hhbmlzbSAqLwotCQlpZiAoKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgaGlnaCBcbiIpKTsKLQkJCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCB0cnVlKTsKLQkJCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIHRydWUpOwotCQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgbG93IFxuIikpOwotCQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIGZhbHNlKTsKLQkJCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0ZG1fMkFudDg3MjNBSElEQWN0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTggYnRSc3NpU3RhdGUsIGJ0UnNzaVN0YXRlMTsKLQotCWlmIChidGRtX05lZWRUb0RlY0J0UHdyKHBhZGFwdGVyKSkKLQkJYnRkbV8yQW50RGVjQnRQd3IocGFkYXB0ZXIsIHRydWUpOwotCWVsc2UKLQkJYnRkbV8yQW50RGVjQnRQd3IocGFkYXB0ZXIsIGZhbHNlKTsKLQotCWlmIChCVERNX0lzSFQ0MChwYWRhcHRlcikpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkhUNDBcbiIpKTsKLQkJYnRSc3NpU3RhdGUgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZShwYWRhcHRlciwgMiwgMzcsIDApOwotCQkJLyogIGZ3IG1lY2hhbmlzbSAqLwotCQlpZiAoKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2ktMSBoaWdoIFxuIikpOwotCQkJUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwYWRhcHRlciwgMHg4ODMsIDB4NDApOwotCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA5KTsKLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2ktMSBsb3cgXG4iKSk7Ci0JCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDEzKTsKLQkJfQotCi0JCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCX0gZWxzZSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJIVDIwIG9yIExlZ2FjeVxuIikpOwotCQlidFJzc2lTdGF0ZSA9IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlKHBhZGFwdGVyLCAyLCAzNywgMCk7Ci0JCWJ0UnNzaVN0YXRlMSA9IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlMShwYWRhcHRlciwgMiwgMjcsIDApOwotCi0JCS8qICBmdyBtZWNoYW5pc20gKi8KLQkJaWYgKChidFJzc2lTdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlMSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2ktMSBoaWdoIFxuIikpOwotCQkJUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwYWRhcHRlciwgMHg4ODMsIDB4NDApOwotCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA5KTsKLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2ktMSBsb3cgXG4iKSk7Ci0JCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDEzKTsKLQkJfQotCi0JCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJaWYgKChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX0hJR0gpIHx8Ci0JCSAgICAoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGhpZ2ggXG4iKSk7Ci0JCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgdHJ1ZSk7Ci0JCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCB0cnVlKTsKLQkJCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGxvdyBcbiIpKTsKLQkJCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCQl9Ci0JfQotfQotCi0vKiBBMkRQIG9ubHkgLyBQQU4oRURSKSBvbmx5LyBBMkRQK1BBTihIUykgKi8KLXN0YXRpYyB2b2lkIGJ0ZG1fMkFudDg3MjNBQTJEUEFjdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXU4IGJ0UnNzaVN0YXRlLCBidFJzc2lTdGF0ZTE7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JdTggYnRJbmZvRXh0ID0gcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRJbmZvRXh0OwotCi0JaWYgKGJ0ZG1fTmVlZFRvRGVjQnRQd3IocGFkYXB0ZXIpKQotCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgdHJ1ZSk7Ci0JZWxzZQotCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgZmFsc2UpOwotCi0JaWYgKEJURE1fSXNIVDQwKHBhZGFwdGVyKSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiSFQ0MFxuIikpOwotCQlidFJzc2lTdGF0ZSA9IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlKHBhZGFwdGVyLCAyLCAzNywgMCk7Ci0KLQkJLyogIGZ3IG1lY2hhbmlzbSAqLwotCQlpZiAoKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgaGlnaCBcbiIpKTsKLQkJCVBsYXRmb3JtRUZJT1dyaXRlMUJ5dGUocGFkYXB0ZXIsIDB4ODgzLCAweDQwKTsKLQotCQkJaWYgKGJ0SW5mb0V4dCZCSVQoMCkpIHsJLyogYTJkcCByYXRlLCAxOmJhc2ljIC8wOmVkciAqLwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGJhc2ljIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50VGRtYUR1cmF0aW9uQWRqdXN0KHBhZGFwdGVyLCBmYWxzZSwgZmFsc2UsIDMpOwotCQkJfSBlbHNlIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiYTJkcCBlZHIgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRUZG1hRHVyYXRpb25BZGp1c3QocGFkYXB0ZXIsIGZhbHNlLCBmYWxzZSwgMSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGxvdyBcbiIpKTsKLQkJCWlmIChidEluZm9FeHQmQklUKDApKSB7CS8qIGEyZHAgcmF0ZSwgMTpiYXNpYyAvMDplZHIgKi8KLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiYTJkcCBiYXNpYyByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFRkbWFEdXJhdGlvbkFkanVzdChwYWRhcHRlciwgZmFsc2UsIHRydWUsIDMpOwotCQkJfSBlbHNlIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiYTJkcCBlZHIgcmF0ZSBcbiIpKTsKLQkJCWJ0ZG1fMkFudFRkbWFEdXJhdGlvbkFkanVzdChwYWRhcHRlciwgZmFsc2UsIHRydWUsIDEpOwotCQkJfQotCQl9Ci0KLQkJLyogIHN3IG1lY2hhbmlzbSAqLwotCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCB0cnVlKTsKLQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQl9IGVsc2UgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiSFQyMCBvciBMZWdhY3lcbiIpKTsKLQkJYnRSc3NpU3RhdGUgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZShwYWRhcHRlciwgMiwgMzcsIDApOwotCQlidFJzc2lTdGF0ZTEgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZTEocGFkYXB0ZXIsIDIsIDI3LCAwKTsKLQotCQkvKiAgZncgbWVjaGFuaXNtICovCi0JCWlmICgoYnRSc3NpU3RhdGUxID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpLTEgaGlnaCBcbiIpKTsKLQkJCVBsYXRmb3JtRUZJT1dyaXRlMUJ5dGUocGFkYXB0ZXIsIDB4ODgzLCAweDQwKTsKLQkJCWlmIChidEluZm9FeHQmQklUKDApKSB7CS8qIGEyZHAgcmF0ZSwgMTpiYXNpYyAvMDplZHIgKi8KLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiYTJkcCBiYXNpYyByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFRkbWFEdXJhdGlvbkFkanVzdChwYWRhcHRlciwgZmFsc2UsIGZhbHNlLCAzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgZWRyIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50VGRtYUR1cmF0aW9uQWRqdXN0KHBhZGFwdGVyLCBmYWxzZSwgZmFsc2UsIDEpOwotCQkJfQotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaS0xIGxvdyBcbiIpKTsKLQkJCWlmIChidEluZm9FeHQmQklUKDApKSB7CS8qIGEyZHAgcmF0ZSwgMTpiYXNpYyAvMDplZHIgKi8KLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiYTJkcCBiYXNpYyByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFRkbWFEdXJhdGlvbkFkanVzdChwYWRhcHRlciwgZmFsc2UsIHRydWUsIDMpOwotCQkJfSBlbHNlIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiYTJkcCBlZHIgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRUZG1hRHVyYXRpb25BZGp1c3QocGFkYXB0ZXIsIGZhbHNlLCB0cnVlLCAxKTsKLQkJCX0KLQkJfQotCi0JCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJaWYgKChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX0hJR0gpIHx8Ci0JCSAgICAoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGhpZ2ggXG4iKSk7Ci0JCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgdHJ1ZSk7Ci0JCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCB0cnVlKTsKLQkJCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGxvdyBcbiIpKTsKLQkJCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBidGRtXzJBbnQ4NzIzQVBBTkVEUkFjdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXU4IGJ0UnNzaVN0YXRlLCBidFJzc2lTdGF0ZTE7Ci0KLQlpZiAoYnRkbV9OZWVkVG9EZWNCdFB3cihwYWRhcHRlcikpCi0JCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCB0cnVlKTsKLQllbHNlCi0JCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCBmYWxzZSk7Ci0KLQlpZiAoQlRETV9Jc0hUNDAocGFkYXB0ZXIpKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJIVDQwXG4iKSk7Ci0JCWJ0UnNzaVN0YXRlID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUocGFkYXB0ZXIsIDIsIDM3LCAwKTsKLQotCQkvKiAgZncgbWVjaGFuaXNtICovCi0JCWlmICgoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBoaWdoIFxuIikpOwotCQkJUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwYWRhcHRlciwgMHg4ODMsIDB4NDApOwotCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAyKTsKLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgbG93IFxuIikpOwotCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA2KTsKLQkJfQotCi0JCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgdHJ1ZSk7Ci0JCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkhUMjAgb3IgTGVnYWN5XG4iKSk7Ci0JCWJ0UnNzaVN0YXRlID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUocGFkYXB0ZXIsIDIsIDM3LCAwKTsKLQkJYnRSc3NpU3RhdGUxID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUxKHBhZGFwdGVyLCAyLCAyNywgMCk7Ci0KLQkJLyogIGZ3IG1lY2hhbmlzbSAqLwotCQlpZiAoKGJ0UnNzaVN0YXRlMSA9PSBCVF9SU1NJX1NUQVRFX0hJR0gpIHx8Ci0JCSAgICAoYnRSc3NpU3RhdGUxID09IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaS0xIGhpZ2ggXG4iKSk7Ci0JCQlQbGF0Zm9ybUVGSU9Xcml0ZTFCeXRlKHBhZGFwdGVyLCAweDg4MywgMHg0MCk7Ci0JCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDIpOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaS0xIGxvdyBcbiIpKTsKLQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNik7Ci0JCX0KLQotCQkvKiAgc3cgbWVjaGFuaXNtICovCi0JCWlmICgoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBoaWdoIFxuIikpOwotCQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIHRydWUpOwotCQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgdHJ1ZSk7Ci0JCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBsb3cgXG4iKSk7Ci0JCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgZmFsc2UpOwotCQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgZmFsc2UpOwotCQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQkJfQotCX0KLX0KLQotLyogUEFOKEhTKSBvbmx5ICovCi1zdGF0aWMgdm9pZCBidGRtXzJBbnQ4NzIzQVBBTkhTQWN0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTggYnRSc3NpU3RhdGU7Ci0KLQlpZiAoQlRETV9Jc0hUNDAocGFkYXB0ZXIpKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJIVDQwXG4iKSk7Ci0JCWJ0UnNzaVN0YXRlID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUocGFkYXB0ZXIsIDIsIDQ3LCAwKTsKLQkJLyogIGZ3IG1lY2hhbmlzbSAqLwotCQlpZiAoKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgaGlnaCBcbiIpKTsKLQkJCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgbG93IFxuIikpOwotCQkJYnRkbV8yQW50RGVjQnRQd3IocGFkYXB0ZXIsIGZhbHNlKTsKLQkJfQotCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIGZhbHNlLCAwKTsKLQotCQkvKiAgc3cgbWVjaGFuaXNtICovCi0JCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIHRydWUpOwotCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCX0gZWxzZSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJIVDIwIG9yIExlZ2FjeVxuIikpOwotCQlidFJzc2lTdGF0ZSA9IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlKHBhZGFwdGVyLCAyLCA0NywgMCk7Ci0KLQkJaWYgKChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX0hJR0gpIHx8Ci0JCSAgICAoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGhpZ2hcbiIpKTsKLQkJCS8qICBmdyBtZWNoYW5pc20gKi8KLQkJCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCB0cnVlKTsKLQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgZmFsc2UsIDApOwotCi0JCQkvKiAgc3cgbWVjaGFuaXNtICovCi0JCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgdHJ1ZSk7Ci0JCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCB0cnVlKTsKLQkJCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGxvd1xuIikpOwotCQkJLyogIGZ3IG1lY2hhbmlzbSAqLwotCQkJYnRkbV8yQW50RGVjQnRQd3IocGFkYXB0ZXIsIGZhbHNlKTsKLQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgZmFsc2UsIDApOwotCi0JCQkvKiAgc3cgbWVjaGFuaXNtICovCi0JCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgZmFsc2UpOwotCQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgZmFsc2UpOwotCQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQkJfQotCX0KLX0KLQotLyogUEFOKEVEUikrQTJEUCAqLwotc3RhdGljIHZvaWQgYnRkbV8yQW50ODcyM0FQQU5FRFJBMkRQQWN0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTggYnRSc3NpU3RhdGUsIGJ0UnNzaVN0YXRlMSwgYnRJbmZvRXh0OwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JYnRJbmZvRXh0ID0gcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRJbmZvRXh0OwotCi0JaWYgKGJ0ZG1fTmVlZFRvRGVjQnRQd3IocGFkYXB0ZXIpKQotCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgdHJ1ZSk7Ci0JZWxzZQotCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgZmFsc2UpOwotCi0JaWYgKEJURE1fSXNIVDQwKHBhZGFwdGVyKSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiSFQ0MFxuIikpOwotCQlidFJzc2lTdGF0ZSA9IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlKHBhZGFwdGVyLCAyLCAzNywgMCk7Ci0KLQkJaWYgKChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX0hJR0gpIHx8Ci0JCSAgICAoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGhpZ2ggXG4iKSk7Ci0JCQkvKiAgZncgbWVjaGFuaXNtICovCi0JCQlQbGF0Zm9ybUVGSU9Xcml0ZTFCeXRlKHBhZGFwdGVyLCAweDg4MywgMHg0MCk7Ci0KLQkJCWlmIChidEluZm9FeHQmQklUKDApKSB7CS8qIGEyZHAgcmF0ZSwgMTpiYXNpYyAvMDplZHIgKi8KLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiYTJkcCBiYXNpYyByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNCk7Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGVkciByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGxvdyBcbiIpKTsKLQkJCS8qICBmdyBtZWNoYW5pc20gKi8KLQkJCWlmIChidEluZm9FeHQmQklUKDApKSB7CS8qIGEyZHAgcmF0ZSwgMTpiYXNpYyAvMDplZHIgKi8KLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiYTJkcCBiYXNpYyByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgOCk7Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGVkciByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNik7Ci0JCQl9Ci0JCX0KLQotCQkvKiAgc3cgbWVjaGFuaXNtICovCi0JCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIHRydWUpOwotCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCX0gZWxzZSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJIVDIwIG9yIExlZ2FjeVxuIikpOwotCQlidFJzc2lTdGF0ZSA9IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlKHBhZGFwdGVyLCAyLCAzNywgMCk7Ci0JCWJ0UnNzaVN0YXRlMSA9IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlMShwYWRhcHRlciwgMiwgMjcsIDApOwotCi0JCWlmICgoYnRSc3NpU3RhdGUxID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpLTEgaGlnaCBcbiIpKTsKLQkJCVBsYXRmb3JtRUZJT1dyaXRlMUJ5dGUocGFkYXB0ZXIsIDB4ODgzLCAweDQwKTsKLQkJCS8qICBmdyBtZWNoYW5pc20gKi8KLQkJCWlmIChidEluZm9FeHQmQklUKDApKSB7CS8qIGEyZHAgcmF0ZSwgMTpiYXNpYyAvMDplZHIgKi8KLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiYTJkcCBiYXNpYyByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNCk7Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGVkciByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpLTEgbG93IFxuIikpOwotCQkJLyogIGZ3IG1lY2hhbmlzbSAqLwotCQkJaWYgKGJ0SW5mb0V4dCZCSVQoMCkpIHsJLyogYTJkcCByYXRlLCAxOmJhc2ljIC8wOmVkciAqLwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGJhc2ljIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgZWRyIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA2KTsKLQkJCX0KLQkJfQotCi0JCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJaWYgKChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX0hJR0gpIHx8Ci0JCSAgICAoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGhpZ2ggXG4iKSk7Ci0JCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgdHJ1ZSk7Ci0JCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCB0cnVlKTsKLQkJCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGxvdyBcbiIpKTsKLQkJCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBidGRtXzJBbnQ4NzIzQVBBTkVEUkhJREFjdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXU4IGJ0UnNzaVN0YXRlLCBidFJzc2lTdGF0ZTE7Ci0KLQlpZiAoYnRkbV9OZWVkVG9EZWNCdFB3cihwYWRhcHRlcikpCi0JCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCB0cnVlKTsKLQllbHNlCi0JCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCBmYWxzZSk7Ci0KLQlpZiAoQlRETV9Jc0hUNDAocGFkYXB0ZXIpKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJIVDQwXG4iKSk7Ci0JCWJ0UnNzaVN0YXRlID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUocGFkYXB0ZXIsIDIsIDM3LCAwKTsKLQkJLyogIGZ3IG1lY2hhbmlzbSAqLwotCQlpZiAoKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgaGlnaCBcbiIpKTsKLQkJCVBsYXRmb3JtRUZJT1dyaXRlMUJ5dGUocGFkYXB0ZXIsIDB4ODgzLCAweDQwKTsKLQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTApOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBsb3cgXG4iKSk7Ci0JCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE0KTsKLQkJfQotCi0JCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgdHJ1ZSk7Ci0JCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkhUMjAgb3IgTGVnYWN5XG4iKSk7Ci0JCWJ0UnNzaVN0YXRlID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUocGFkYXB0ZXIsIDIsIDM3LCAwKTsKLQkJYnRSc3NpU3RhdGUxID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUxKHBhZGFwdGVyLCAyLCAyNywgMCk7Ci0KLQkJLyogIGZ3IG1lY2hhbmlzbSAqLwotCQlpZiAoKGJ0UnNzaVN0YXRlMSA9PSBCVF9SU1NJX1NUQVRFX0hJR0gpIHx8Ci0JCSAgICAoYnRSc3NpU3RhdGUxID09IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaS0xIGhpZ2ggXG4iKSk7Ci0JCQlQbGF0Zm9ybUVGSU9Xcml0ZTFCeXRlKHBhZGFwdGVyLCAweDg4MywgMHg0MCk7Ci0JCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDEwKTsKLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2ktMSBsb3cgXG4iKSk7Ci0JCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE0KTsKLQkJfQotCi0JCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJaWYgKChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX0hJR0gpIHx8Ci0JCSAgICAoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGhpZ2ggXG4iKSk7Ci0JCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgdHJ1ZSk7Ci0JCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCB0cnVlKTsKLQkJCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGxvdyBcbiIpKTsKLQkJCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCQl9Ci0JfQotfQotCi0vKiAgSElEK0EyRFArUEFOKEVEUikgKi8KLXN0YXRpYyB2b2lkIGJ0ZG1fMkFudDg3MjNBSElEQTJEUFBBTkVEUkFjdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXU4IGJ0UnNzaVN0YXRlLCBidFJzc2lTdGF0ZTEsIGJ0SW5mb0V4dDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWJ0SW5mb0V4dCA9IHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0SW5mb0V4dDsKLQotCWlmIChidGRtX05lZWRUb0RlY0J0UHdyKHBhZGFwdGVyKSkKLQkJYnRkbV8yQW50RGVjQnRQd3IocGFkYXB0ZXIsIHRydWUpOwotCWVsc2UKLQkJYnRkbV8yQW50RGVjQnRQd3IocGFkYXB0ZXIsIGZhbHNlKTsKLQotCWlmIChCVERNX0lzSFQ0MChwYWRhcHRlcikpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkhUNDBcbiIpKTsKLQkJYnRSc3NpU3RhdGUgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZShwYWRhcHRlciwgMiwgMzcsIDApOwotCQlpZiAoKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgaGlnaCBcbiIpKTsKLQkJCVBsYXRmb3JtRUZJT1dyaXRlMUJ5dGUocGFkYXB0ZXIsIDB4ODgzLCAweDQwKTsKLQotCQkJaWYgKGJ0SW5mb0V4dCZCSVQoMCkpIHsJLyogYTJkcCByYXRlLCAxOmJhc2ljIC8wOmVkciAqLwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGJhc2ljIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMik7Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGVkciByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTApOwotCQkJfQotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBsb3cgXG4iKSk7Ci0JCQlpZiAoYnRJbmZvRXh0JkJJVCgwKSkgewkvKiBhMmRwIHJhdGUsIDE6YmFzaWMgLzA6ZWRyICovCi0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgYmFzaWMgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE2KTsKLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgZWRyIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNCk7Ci0JCQl9Ci0JCX0KLQotCQkvKiAgc3cgbWVjaGFuaXNtICovCi0JCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIHRydWUpOwotCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCX0gZWxzZSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJIVDIwIG9yIExlZ2FjeVxuIikpOwotCQlidFJzc2lTdGF0ZTEgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZTEocGFkYXB0ZXIsIDIsIDM3LCAwKTsKLQkJYnRSc3NpU3RhdGUgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZShwYWRhcHRlciwgMiwgMjcsIDApOwotCQlpZiAoKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgaGlnaCBcbiIpKTsKLQkJCVBsYXRmb3JtRUZJT1dyaXRlMUJ5dGUocGFkYXB0ZXIsIDB4ODgzLCAweDQwKTsKLQotCQkJaWYgKGJ0SW5mb0V4dCZCSVQoMCkpIHsJLyogYTJkcCByYXRlLCAxOmJhc2ljIC8wOmVkciAqLwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGJhc2ljIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMik7Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGVkciByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTApOwotCQkJfQotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBsb3cgXG4iKSk7Ci0JCQlpZiAoYnRJbmZvRXh0JkJJVCgwKSkgewkvKiBhMmRwIHJhdGUsIDE6YmFzaWMgLzA6ZWRyICovCi0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgYmFzaWMgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE2KTsKLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgZWRyIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNCk7Ci0JCQl9Ci0JCX0KLQotCQkvKiAgc3cgbWVjaGFuaXNtICovCi0JCWlmICgoYnRSc3NpU3RhdGUxID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpLTEgaGlnaCBcbiIpKTsKLQkJCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCB0cnVlKTsKLQkJCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIHRydWUpOwotCQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2ktMSBoaWdoIFxuIikpOwotCQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIGZhbHNlKTsKLQkJCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0ZG1fMkFudDg3MjNBSElEQTJEUEFjdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXU4IGJ0UnNzaVN0YXRlLCBidFJzc2lTdGF0ZTEsIGJ0SW5mb0V4dDsKLQotCWJ0SW5mb0V4dCA9IHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0SW5mb0V4dDsKLQotCWlmIChidGRtX05lZWRUb0RlY0J0UHdyKHBhZGFwdGVyKSkKLQkJYnRkbV8yQW50RGVjQnRQd3IocGFkYXB0ZXIsIHRydWUpOwotCWVsc2UKLQkJYnRkbV8yQW50RGVjQnRQd3IocGFkYXB0ZXIsIGZhbHNlKTsKLQotCWlmIChCVERNX0lzSFQ0MChwYWRhcHRlcikpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkhUNDBcbiIpKTsKLQkJYnRSc3NpU3RhdGUgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZShwYWRhcHRlciwgMiwgMzcsIDApOwotCQlpZiAoKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgaGlnaCBcbiIpKTsKLQkJCVBsYXRmb3JtRUZJT1dyaXRlMUJ5dGUocGFkYXB0ZXIsIDB4ODgzLCAweDQwKTsKLQotCQkJaWYgKGJ0SW5mb0V4dCZCSVQoMCkpIHsJLyogYTJkcCByYXRlLCAxOmJhc2ljIC8wOmVkciAqLwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGJhc2ljIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50VGRtYUR1cmF0aW9uQWRqdXN0KHBhZGFwdGVyLCB0cnVlLCBmYWxzZSwgMyk7Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGVkciByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFRkbWFEdXJhdGlvbkFkanVzdChwYWRhcHRlciwgdHJ1ZSwgZmFsc2UsIDEpOwotCQkJfQotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBsb3cgXG4iKSk7Ci0JCQlpZiAoYnRJbmZvRXh0JkJJVCgwKSkgewkvKiBhMmRwIHJhdGUsIDE6YmFzaWMgLzA6ZWRyICovCi0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgYmFzaWMgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRUZG1hRHVyYXRpb25BZGp1c3QocGFkYXB0ZXIsIHRydWUsIHRydWUsIDMpOwotCQkJfSBlbHNlIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiYTJkcCBlZHIgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRUZG1hRHVyYXRpb25BZGp1c3QocGFkYXB0ZXIsIHRydWUsIHRydWUsIDEpOwotCQkJfQotCQl9Ci0JCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgdHJ1ZSk7Ci0JCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkhUMjAgb3IgTGVnYWN5XG4iKSk7Ci0JCWJ0UnNzaVN0YXRlID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUocGFkYXB0ZXIsIDIsIDM3LCAwKTsKLQkJYnRSc3NpU3RhdGUxID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUocGFkYXB0ZXIsIDIsIDI3LCAwKTsKLQotCQlpZiAoKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgaGlnaCBcbiIpKTsKLQkJCVBsYXRmb3JtRUZJT1dyaXRlMUJ5dGUocGFkYXB0ZXIsIDB4ODgzLCAweDQwKTsKLQotCQkJaWYgKGJ0SW5mb0V4dCZCSVQoMCkpIHsJLyogYTJkcCByYXRlLCAxOmJhc2ljIC8wOmVkciAqLwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGJhc2ljIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50VGRtYUR1cmF0aW9uQWRqdXN0KHBhZGFwdGVyLCB0cnVlLCBmYWxzZSwgMyk7Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGVkciByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFRkbWFEdXJhdGlvbkFkanVzdChwYWRhcHRlciwgdHJ1ZSwgZmFsc2UsIDEpOwotCQkJfQotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBsb3cgXG4iKSk7Ci0JCQlpZiAoYnRJbmZvRXh0JkJJVCgwKSkgewkvKiBhMmRwIHJhdGUsIDE6YmFzaWMgLzA6ZWRyICovCi0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgYmFzaWMgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRUZG1hRHVyYXRpb25BZGp1c3QocGFkYXB0ZXIsIHRydWUsIHRydWUsIDMpOwotCQkJfSBlbHNlIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiYTJkcCBlZHIgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRUZG1hRHVyYXRpb25BZGp1c3QocGFkYXB0ZXIsIHRydWUsIHRydWUsIDEpOwotCQkJfQotCQl9Ci0JCWlmICgoYnRSc3NpU3RhdGUxID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpLTEgaGlnaCBcbiIpKTsKLQkJCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCB0cnVlKTsKLQkJCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIHRydWUpOwotCQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2ktMSBsb3cgXG4iKSk7Ci0JCQkvKiAgc3cgbWVjaGFuaXNtICovCi0JCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgZmFsc2UpOwotCQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgZmFsc2UpOwotCQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgYnRkbV8yQW50ODcyM0FBMmRwKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JdTggYnRSc3NpU3RhdGUsIGJ0UnNzaVN0YXRlMSwgYnRJbmZvRXh0OwotCi0JYnRJbmZvRXh0ID0gcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRJbmZvRXh0OwotCi0JaWYgKGJ0ZG1fTmVlZFRvRGVjQnRQd3IocGFkYXB0ZXIpKQotCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgdHJ1ZSk7Ci0JZWxzZQotCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgZmFsc2UpOwotCS8qICBjb2V4IHRhYmxlICovCi0JYnRkbV8yQW50Q29leFRhYmxlKHBhZGFwdGVyLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7Ci0JYnRkbV8yQW50SWdub3JlV2xhbkFjdChwYWRhcHRlciwgZmFsc2UpOwotCi0JaWYgKEJURE1fSXNIVDQwKHBhZGFwdGVyKSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiSFQ0MFxuIikpOwotCQlidFJzc2lTdGF0ZSA9IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlKHBhZGFwdGVyLCAyLCAzNywgMCk7Ci0JCS8qICBmdyBtZWNoYW5pc20gKi8KLQkJaWYgKChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX0hJR0gpIHx8Ci0JCSAgICAoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpLTEgaGlnaCBcbiIpKTsKLQkJCVBsYXRmb3JtRUZJT1dyaXRlMUJ5dGUocGFkYXB0ZXIsIDB4ODgzLCAweDQwKTsKLQkJCWJ0ZG1fMkFudFRkbWFEdXJhdGlvbkFkanVzdChwYWRhcHRlciwgZmFsc2UsIGZhbHNlLCAxKTsKLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2ktMSBsb3cgXG4iKSk7Ci0JCQlidGRtXzJBbnRUZG1hRHVyYXRpb25BZGp1c3QocGFkYXB0ZXIsIGZhbHNlLCB0cnVlLCAxKTsKLQkJfQotCi0JCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgdHJ1ZSk7Ci0JCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkhUMjAgb3IgTGVnYWN5XG4iKSk7Ci0JCWJ0UnNzaVN0YXRlID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUocGFkYXB0ZXIsIDIsIDQ3LCAwKTsKLQkJYnRSc3NpU3RhdGUxID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUxKHBhZGFwdGVyLCAyLCAyNywgMCk7Ci0KLQkJLyogIGZ3IG1lY2hhbmlzbSAqLwotCQlpZiAoKGJ0UnNzaVN0YXRlMSA9PSBCVF9SU1NJX1NUQVRFX0hJR0gpIHx8Ci0JCSAgICAoYnRSc3NpU3RhdGUxID09IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaS0xIGhpZ2ggXG4iKSk7Ci0JCQlQbGF0Zm9ybUVGSU9Xcml0ZTFCeXRlKHBhZGFwdGVyLCAweDg4MywgMHg0MCk7Ci0JCQlidGRtXzJBbnRUZG1hRHVyYXRpb25BZGp1c3QocGFkYXB0ZXIsIGZhbHNlLCBmYWxzZSwgMSk7Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpLTEgbG93IFxuIikpOwotCQkJYnRkbV8yQW50VGRtYUR1cmF0aW9uQWRqdXN0KHBhZGFwdGVyLCBmYWxzZSwgdHJ1ZSwgMSk7Ci0JCX0KLQotCQkvKiAgc3cgbWVjaGFuaXNtICovCi0JCWlmICgoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBoaWdoIFxuIikpOwotCQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIHRydWUpOwotCQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgdHJ1ZSk7Ci0JCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBsb3cgXG4iKSk7Ci0JCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgZmFsc2UpOwotCQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgZmFsc2UpOwotCQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQkJfQotCX0KLX0KLQotLyogIGV4dGVybiBmdW5jdGlvbiBzdGFydCB3aXRoIEJURE1fICovCi1zdGF0aWMgdm9pZCBCVERNXzJBbnRQYXJhSW5pdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCi0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMmFudCAqcEJ0ZG04NzIzID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0yQW50OwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCAyQW50IFBhcmFtZXRlciBJbml0ISFcbiIpKTsKLQotCS8qICBFbmFibGUgY291bnRlciBzdGF0aXN0aWNzICovCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgMHg3NmUsIDB4NCk7Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgMHg3NzgsIDB4Myk7Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgMHg0MCwgMHgyMCk7Ci0KLQkvKiAgZm9yY2UgdG8gcmVzZXQgY29leCBtZWNoYW5pc20gKi8KLQlwQnRkbTg3MjMtPnByZVZhbDB4NmMwID0gMHgwOwotCWJ0ZG1fMkFudENvZXhUYWJsZShwYWRhcHRlciwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwotCi0JcEJ0ZG04NzIzLT5iUHJlUHNUZG1hT24gPSB0cnVlOwotCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgZmFsc2UsIDApOwotCi0JcEJ0ZG04NzIzLT5wcmVGd0RhY1N3aW5nTHZsID0gMHgxMDsKLQlidGRtXzJBbnRGd0RhY1N3aW5nTHZsKHBhZGFwdGVyLCAweDIwKTsKLQotCXBCdGRtODcyMy0+YlByZURlY0J0UHdyID0gdHJ1ZTsKLQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgZmFsc2UpOwotCi0JcEJ0ZG04NzIzLT5iUHJlQWdjVGFibGVFbiA9IHRydWU7Ci0JYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQotCXBCdGRtODcyMy0+YlByZUFkY0JhY2tPZmYgPSB0cnVlOwotCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIGZhbHNlKTsKLQotCXBCdGRtODcyMy0+YlByZUxvd1BlbmFsdHlSYSA9IHRydWU7Ci0JYnRkbV8yQW50TG93UGVuYWx0eVJhKHBhZGFwdGVyLCBmYWxzZSk7Ci0KLQlwQnRkbTg3MjMtPmJQcmVSZlJ4THBmU2hyaW5rID0gdHJ1ZTsKLQlidGRtXzJBbnRSZlNocmluayhwYWRhcHRlciwgZmFsc2UpOwotCi0JcEJ0ZG04NzIzLT5iUHJlRGFjU3dpbmdPbiA9IHRydWU7Ci0JYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQotCXBCdGRtODcyMy0+YlByZUlnbm9yZVdsYW5BY3QgPSB0cnVlOwotCWJ0ZG1fMkFudElnbm9yZVdsYW5BY3QocGFkYXB0ZXIsIGZhbHNlKTsKLX0KLQotc3RhdGljIHZvaWQgQlRETV8yQW50SHdDb2V4QWxsT2ZmODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlidGRtXzJBbnRDb2V4VGFibGUocGFkYXB0ZXIsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKLX0KLQotc3RhdGljIHZvaWQgQlRETV8yQW50RndDb2V4QWxsT2ZmODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlidGRtXzJBbnRJZ25vcmVXbGFuQWN0KHBhZGFwdGVyLCBmYWxzZSk7Ci0JYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCBmYWxzZSwgMCk7Ci0JYnRkbV8yQW50RndEYWNTd2luZ0x2bChwYWRhcHRlciwgMHgyMCk7Ci0JYnRkbV8yQW50RGVjQnRQd3IocGFkYXB0ZXIsIGZhbHNlKTsKLX0KLQotc3RhdGljIHZvaWQgQlRETV8yQW50U3dDb2V4QWxsT2ZmODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgZmFsc2UpOwotCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIGZhbHNlKTsKLQlidGRtXzJBbnRMb3dQZW5hbHR5UmEocGFkYXB0ZXIsIGZhbHNlKTsKLQlidGRtXzJBbnRSZlNocmluayhwYWRhcHRlciwgZmFsc2UpOwotCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIEJURE1fMkFudEZ3QzJoQnRJbmZvODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8yYW50ICpwQnRkbTg3MjMgPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTJBbnQ7Ci0JdTggYnRJbmZvID0gMDsKLQl1OCBhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19VTkRFRklORUQ7Ci0JdTggYkJ0TGlua0V4aXN0ID0gZmFsc2UsIGJCdEhzTW9kZUV4aXN0ID0gZmFsc2U7Ci0KLQlidEluZm8gPSBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5jMmhCdEluZm9PcmlnaW5hbDsKLQlwQnRkbTg3MjMtPmJ0U3RhdHVzID0gQlRfMkFOVF9CVF9TVEFUVVNfSURMRTsKLQotCS8qICBjaGVjayBCSVQyIGZpcnN0ID09PiBjaGVjayBpZiBidCBpcyB1bmRlciBpbnF1aXJ5IG9yIHBhZ2Ugc2NhbiAqLwotCWlmIChidEluZm8gJiBCSVQoMikpIHsKLQkJaWYgKCFwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5iQzJoQnRJbnF1aXJ5UGFnZSkgewotCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmJIb2xkRm9yQnRPcGVyYXRpb24gPSB0cnVlOwotCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmJIb2xkUGVyaW9kQ250ID0gMTsKLQkJCWJ0ZG1fMkFudEJ0SW5xdWlyeVBhZ2UocGFkYXB0ZXIpOwotCQl9IGVsc2UgewotCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmJIb2xkUGVyaW9kQ250Kys7Ci0JCQlidGRtX0hvbGRGb3JCdElucVBhZ2UocGFkYXB0ZXIpOwotCQl9Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJDMmhCdElucXVpcnlQYWdlID0gdHJ1ZTsKLQotCX0gZWxzZSB7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJDMmhCdElucXVpcnlQYWdlID0gZmFsc2U7Ci0JCXBCdE1nbnQtPkV4dENvbmZpZy5iSG9sZEZvckJ0T3BlcmF0aW9uID0gZmFsc2U7Ci0JCXBCdE1nbnQtPkV4dENvbmZpZy5iSG9sZFBlcmlvZENudCA9IDA7Ci0KLQl9Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkoIltCVEMySF0sIHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJDMmhCdElucXVpcnlQYWdlID0leCBwQnRNZ250LT5FeHRDb25maWcuYkhvbGRQZXJpb2RDbnQgPSV4IHBCdE1nbnQtPkV4dENvbmZpZy5iSG9sZEZvckJ0T3BlcmF0aW9uID0leFxuIiwKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYkMyaEJ0SW5xdWlyeVBhZ2UsCi0JCXBCdE1nbnQtPkV4dENvbmZpZy5iSG9sZFBlcmlvZENudCwKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLmJIb2xkRm9yQnRPcGVyYXRpb24pKTsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKLQkJKCJbQlRDMkhdLCAgIGJ0SW5mbyA9JXggICBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5jMmhCdEluZm9PcmlnaW5hbCA9JXhcbiIsCi0JCWJ0SW5mbywgcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYzJoQnRJbmZvT3JpZ2luYWwpKTsKLQlpZiAoYnRJbmZvJkJUX0lORk9fQUNMKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDMkhdLCBCVEluZm86IGJDb25uZWN0ID0gdHJ1ZSAgIGJ0SW5mbyA9JXhcbiIsIGJ0SW5mbykpOwotCQliQnRMaW5rRXhpc3QgPSB0cnVlOwotCQlpZiAoKChidEluZm8mKEJUX0lORk9fRlRQfEJUX0lORk9fQTJEUHxCVF9JTkZPX0hJRHxCVF9JTkZPX1NDT19CVVNZKSkgIT0gMCkgfHwKLQkJICAgIHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0UmV0cnlDbnQgPiAwKSB7Ci0JCQlwQnRkbTg3MjMtPmJ0U3RhdHVzID0gQlRfMkFOVF9CVF9TVEFUVVNfTk9OX0lETEU7Ci0JCX0gZWxzZSB7Ci0JCQlwQnRkbTg3MjMtPmJ0U3RhdHVzID0gQlRfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEU7Ci0JCX0KLQotCQlpZiAoYnRJbmZvJkJUX0lORk9fU0NPIHx8IGJ0SW5mbyZCVF9JTkZPX1NDT19CVVNZKSB7Ci0JCQlpZiAoYnRJbmZvJkJUX0lORk9fRlRQIHx8IGJ0SW5mbyZCVF9JTkZPX0EyRFAgfHwgYnRJbmZvJkJUX0lORk9fSElEKSB7Ci0JCQkJc3dpdGNoIChidEluZm8mMHhlMCkgewotCQkJCWNhc2UgQlRfSU5GT19ISUQ6Ci0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgSElEXG4iKSk7Ci0JCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX0hJRDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBCVF9JTkZPX0EyRFA6Ci0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgRXJyb3IhISEgU0NPICsgQTJEUFxuIikpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEJUX0lORk9fRlRQOgotCQkJCQlpZiAoYkJ0SHNNb2RlRXhpc3QpIHsKLQkJCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgUEFOKEhTKVxuIikpOwotCQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fU0NPOwotCQkJCQl9IGVsc2UgewotCQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBQQU4oRURSKVxuIikpOwotCQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIChCVF9JTkZPX0hJRCB8IEJUX0lORk9fQTJEUCk6Ci0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgQTJEUFxuIikpOwotCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19ISURfQTJEUDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAoQlRfSU5GT19ISUQgfCBCVF9JTkZPX0ZUUCk6Ci0JCQkJCWlmIChiQnRIc01vZGVFeGlzdCkgewotCQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBISUQgKyBQQU4oSFMpXG4iKSk7Ci0JCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19ISURfQTJEUDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgUEFOKEVEUilcbiIpKTsKLQkJCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAoQlRfSU5GT19BMkRQIHwgQlRfSU5GT19GVFApOgotCQkJCQlpZiAoYkJ0SHNNb2RlRXhpc3QpIHsKLQkJCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQTJEUCArIFBBTihIUylcbiIpKTsKLQkJCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX0EyRFA7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEEyRFAgKyBQQU4oRURSKVxuIikpOwotCQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fUEFORURSX0EyRFA7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAoQlRfSU5GT19ISUQgfCBCVF9JTkZPX0EyRFAgfCBCVF9JTkZPX0ZUUCk6Ci0JCQkJCWlmIChiQnRIc01vZGVFeGlzdCkgewotCQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBISUQgKyBBMkRQICsgUEFOKEhTKVxuIikpOwotCQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fSElEX0EyRFA7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIEEyRFAgKyBQQU4oRURSKVxuIikpOwotCQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fSElEX0EyRFBfUEFORURSOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gb25seVxuIikpOwotCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX1NDTzsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgbm9uIFNDT1xuIikpOwotCQkJc3dpdGNoIChidEluZm8mMHhlMCkgewotCQkJY2FzZSBCVF9JTkZPX0hJRDoKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEhJRFxuIikpOwotCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX0hJRDsKLQkJCQlicmVhazsKLQkJCWNhc2UgQlRfSU5GT19BMkRQOgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgIEEyRFBcbiIpKTsKLQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19BMkRQOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCVF9JTkZPX0ZUUDoKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFBBTihFRFIpXG4iKSk7Ci0JCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKLQkJCQlicmVhazsKLQkJCWNhc2UgKEJUX0lORk9fSElEIHwgQlRfSU5GT19BMkRQKToKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIEEyRFBcbiIpKTsKLQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19ISURfQTJEUDsKLQkJCQlicmVhazsKLQkJCWNhc2UgKEJUX0lORk9fSElEfEJUX0lORk9fRlRQKToKLQkJCQlpZiAoYkJ0SHNNb2RlRXhpc3QpIHsKLQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBISUQgKyBQQU4oSFMpXG4iKSk7Ci0JCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgUEFOKEVEUilcbiIpKTsKLQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIChCVF9JTkZPX0EyRFB8QlRfSU5GT19GVFApOgotCQkJCWlmIChiQnRIc01vZGVFeGlzdCkgewotCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEEyRFAgKyBQQU4oSFMpXG4iKSk7Ci0JCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX0EyRFA7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBBMkRQICsgUEFOKEVEUilcbiIpKTsKLQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fUEFORURSX0EyRFA7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAoQlRfSU5GT19ISUR8QlRfSU5GT19BMkRQfEJUX0lORk9fRlRQKToKLQkJCQlpZiAoYkJ0SHNNb2RlRXhpc3QpIHsKLQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBISUQgKyBBMkRQICsgUEFOKEhTKVxuIikpOwotCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19ISURfQTJEUDsKLQkJCQl9IGVsc2UgewotCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIEEyRFAgKyBQQU4oRURSKVxuIikpOwotCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19ISURfQTJEUF9QQU5FRFI7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCi0JCX0KLQl9IGVsc2UgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQzJIXSwgQlRJbmZvOiBiQ29ubmVjdCA9IGZhbHNlXG4iKSk7Ci0JCXBCdGRtODcyMy0+YnRTdGF0dXMgPSBCVF8yQU5UX0JUX1NUQVRVU19JRExFOwotCX0KLQotCXBCdGRtODcyMy0+Y3VyQWxnb3JpdGhtID0gYWxnb3JpdGhtOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQWxnb3JpdGhtID0gJWQgXG4iLCBwQnRkbTg3MjMtPmN1ckFsZ29yaXRobSkpOwotCi0vKiBGcm9tICovCi0JQlRETV9DaGVja1dpRmlTdGF0ZShwYWRhcHRlcik7Ci0JaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iTWFudWFsQ29udHJvbCkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQWN0aW9uIE1hbnVhbCBjb250cm9sLCB3b24ndCBleGVjdXRlIGJ0IGNvZXhpc3QgbWVjaGFuaXNtISFcbiIpKTsKLQkJcmV0dXJuOwotCX0KLX0KLQotdm9pZCBCVERNXzJBbnRCdENvZXhpc3Q4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXN0cnVjdCBidF9kZ2IgKnBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQl1OCBidEluZm9PcmlnaW5hbCA9IDA7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMmFudCAqcEJ0ZG04NzIzID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0yQW50OwotCi0JaWYgKEJURE1fQnRQcm9maWxlU3VwcG9ydChwYWRhcHRlcikpIHsKLQkJaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iSG9sZEZvckJ0T3BlcmF0aW9uKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQWN0aW9uIGZvciBCVCBPcGVyYXRpb24gYWRqdXN0ISFcbiIpKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLmJIb2xkUGVyaW9kQ250KSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiSG9sZCBCVCBpbnF1aXJ5L3BhZ2Ugc2NhbiBzZXR0aW5nIChjbnQgPSAlZCkhIVxuIiwKLQkJCQlwQnRNZ250LT5FeHRDb25maWcuYkhvbGRQZXJpb2RDbnQpKTsKLQkJCWlmIChwQnRNZ250LT5FeHRDb25maWcuYkhvbGRQZXJpb2RDbnQgPj0gMTEpIHsKLQkJCQlwQnRNZ250LT5FeHRDb25maWcuYkhvbGRQZXJpb2RDbnQgPSAwOwotCQkJCS8qICBuZXh0IHRpbWUgdGhlIGNvZXhpc3QgcGFyYW1ldGVycyBzaG91bGQgYmUgcmVzZXQgYWdhaW4uICovCi0JCQl9IGVsc2UgewotCQkJCXBCdE1nbnQtPkV4dENvbmZpZy5iSG9sZFBlcmlvZENudCsrOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHBCdERiZy0+ZGJnQ3RybCkKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRGJnIGNvbnRyb2xdLCAiKSk7Ci0KLQkJcEJ0ZG04NzIzLT5jdXJBbGdvcml0aG0gPSBidGRtX0FjdGlvbkFsZ29yaXRobShwYWRhcHRlcik7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQWxnb3JpdGhtID0gJWQgXG4iLCBwQnRkbTg3MjMtPmN1ckFsZ29yaXRobSkpOwotCi0JCWlmIChidGRtX0lzMkFudDg3MjNBQ29tbW9uQWN0aW9uKHBhZGFwdGVyKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkFjdGlvbiAyLUFudCBjb21tb24uXG4iKSk7Ci0JCQlwQnRkbTg3MjMtPmJSZXNldFRkbWFBZGp1c3QgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJaWYgKHBCdGRtODcyMy0+Y3VyQWxnb3JpdGhtICE9IHBCdGRtODcyMy0+cHJlQWxnb3JpdGhtKSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBwcmVBbGdvcml0aG0gPSVkLCBjdXJBbGdvcml0aG0gPSVkXG4iLAotCQkJCXBCdGRtODcyMy0+cHJlQWxnb3JpdGhtLCBwQnRkbTg3MjMtPmN1ckFsZ29yaXRobSkpOwotCQkJCXBCdGRtODcyMy0+YlJlc2V0VGRtYUFkanVzdCA9IHRydWU7Ci0JCQl9Ci0JCQlzd2l0Y2ggKHBCdGRtODcyMy0+Y3VyQWxnb3JpdGhtKSB7Ci0JCQljYXNlIEJUXzJBTlRfQ09FWF9BTEdPX1NDTzoKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQWN0aW9uIDItQW50LCBhbGdvcml0aG0gPSBTQ08uXG4iKSk7Ci0JCQkJYnRkbV8yQW50ODcyM0FTQ09BY3Rpb24ocGFkYXB0ZXIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCVF8yQU5UX0NPRVhfQUxHT19ISUQ6Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gSElELlxuIikpOwotCQkJCWJ0ZG1fMkFudDg3MjNBSElEQWN0aW9uKHBhZGFwdGVyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQlRfMkFOVF9DT0VYX0FMR09fQTJEUDoKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQWN0aW9uIDItQW50LCBhbGdvcml0aG0gPSBBMkRQLlxuIikpOwotCQkJCWJ0ZG1fMkFudDg3MjNBQTJEUEFjdGlvbihwYWRhcHRlcik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJUXzJBTlRfQ09FWF9BTEdPX1BBTkVEUjoKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQWN0aW9uIDItQW50LCBhbGdvcml0aG0gPSBQQU4oRURSKS5cbiIpKTsKLQkJCQlidGRtXzJBbnQ4NzIzQVBBTkVEUkFjdGlvbihwYWRhcHRlcik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJUXzJBTlRfQ09FWF9BTEdPX1BBTkhTOgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IEhTIG1vZGUuXG4iKSk7Ci0JCQkJYnRkbV8yQW50ODcyM0FQQU5IU0FjdGlvbihwYWRhcHRlcik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJUXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9BMkRQOgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IFBBTitBMkRQLlxuIikpOwotCQkJCWJ0ZG1fMkFudDg3MjNBUEFORURSQTJEUEFjdGlvbihwYWRhcHRlcik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJUXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ6Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gUEFOKEVEUikrSElELlxuIikpOwotCQkJCWJ0ZG1fMkFudDg3MjNBUEFORURSSElEQWN0aW9uKHBhZGFwdGVyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQlRfMkFOVF9DT0VYX0FMR09fSElEX0EyRFBfUEFORURSOgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IEhJRCtBMkRQK1BBTi5cbiIpKTsKLQkJCQlidGRtXzJBbnQ4NzIzQUhJREEyRFBQQU5FRFJBY3Rpb24ocGFkYXB0ZXIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCVF8yQU5UX0NPRVhfQUxHT19ISURfQTJEUDoKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQWN0aW9uIDItQW50LCBhbGdvcml0aG0gPSBISUQrQTJEUC5cbiIpKTsKLQkJCQlidGRtXzJBbnQ4NzIzQUhJREEyRFBBY3Rpb24ocGFkYXB0ZXIpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQWN0aW9uIDItQW50LCBhbGdvcml0aG0gPSAwLlxuIikpOwotCQkJCWJ0ZG1fMkFudDg3MjNBQTJEUEFjdGlvbihwYWRhcHRlcik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlwQnRkbTg3MjMtPnByZUFsZ29yaXRobSA9IHBCdGRtODcyMy0+Y3VyQWxnb3JpdGhtOwotCQl9Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdIEdldCBidCBpbmZvIGJ5IGZ3ISFcbiIpKTsKLQkJLyogbXNnIHNob3dzIGMyaCByc3AgZm9yIGJ0X2luZm8gaXMgcmVjZWl2ZWQgb3Igbm90LiAqLwotCQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYkMyaEJ0SW5mb1JlcVNlbnQpCi0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0gYzJoIGZvciBidEluZm8gbm90IHJjdmQgeWV0ISFcbiIpKTsKLQotCQlidEluZm9PcmlnaW5hbCA9IHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmMyaEJ0SW5mb09yaWdpbmFsOwotCi0JCWlmIChwQnRNZ250LT5FeHRDb25maWcuYkhvbGRGb3JCdE9wZXJhdGlvbikgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkFjdGlvbiBmb3IgQlQgT3BlcmF0aW9uIGFkanVzdCEhXG4iKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iSG9sZFBlcmlvZENudCkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkJCSgiSG9sZCBCVCBpbnF1aXJ5L3BhZ2Ugc2NhbiBzZXR0aW5nIChjbnQgPSAlZCkhIVxuIiwKLQkJCQlwQnRNZ250LT5FeHRDb25maWcuYkhvbGRQZXJpb2RDbnQpKTsKLQkJCWlmIChwQnRNZ250LT5FeHRDb25maWcuYkhvbGRQZXJpb2RDbnQgPj0gMTEpIHsKLQkJCQlwQnRNZ250LT5FeHRDb25maWcuYkhvbGRQZXJpb2RDbnQgPSAwOwotCQkJCS8qICBuZXh0IHRpbWUgdGhlIGNvZXhpc3QgcGFyYW1ldGVycyBzaG91bGQgYmUgcmVzZXQgYWdhaW4uICovCi0JCQl9IGVsc2UgewotCQkJCSBwQnRNZ250LT5FeHRDb25maWcuYkhvbGRQZXJpb2RDbnQrKzsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChwQnREYmctPmRiZ0N0cmwpCi0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RiZyBjb250cm9sXSwgIikpOwotCQlpZiAoYnRkbV9JczJBbnQ4NzIzQUNvbW1vbkFjdGlvbihwYWRhcHRlcikpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJBY3Rpb24gMi1BbnQgY29tbW9uLlxuIikpOwotCQkJcEJ0ZG04NzIzLT5iUmVzZXRUZG1hQWRqdXN0ID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCWlmIChwQnRkbTg3MjMtPmN1ckFsZ29yaXRobSAhPSBwQnRkbTg3MjMtPnByZUFsZ29yaXRobSkgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKLQkJCQkJKCJbQlRDb2V4XSwgcHJlQWxnb3JpdGhtID0lZCwgY3VyQWxnb3JpdGhtID0lZFxuIiwKLQkJCQkJcEJ0ZG04NzIzLT5wcmVBbGdvcml0aG0sCi0JCQkJCXBCdGRtODcyMy0+Y3VyQWxnb3JpdGhtKSk7Ci0JCQkJcEJ0ZG04NzIzLT5iUmVzZXRUZG1hQWRqdXN0ID0gdHJ1ZTsKLQkJCX0KLQkJCXN3aXRjaCAocEJ0ZG04NzIzLT5jdXJBbGdvcml0aG0pIHsKLQkJCWNhc2UgQlRfMkFOVF9DT0VYX0FMR09fU0NPOgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IFNDTy5cbiIpKTsKLQkJCQlidGRtXzJBbnQ4NzIzQVNDT0FjdGlvbihwYWRhcHRlcik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJUXzJBTlRfQ09FWF9BTEdPX0hJRDoKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQWN0aW9uIDItQW50LCBhbGdvcml0aG0gPSBISUQuXG4iKSk7Ci0JCQkJYnRkbV8yQW50ODcyM0FISURBY3Rpb24ocGFkYXB0ZXIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCVF8yQU5UX0NPRVhfQUxHT19BMkRQOgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IEEyRFAuXG4iKSk7Ci0JCQkJYnRkbV8yQW50ODcyM0FBMmRwKHBhZGFwdGVyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQlRfMkFOVF9DT0VYX0FMR09fUEFORURSOgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IFBBTihFRFIpLlxuIikpOwotCQkJCWJ0ZG1fMkFudDg3MjNBUEFORURSQWN0aW9uKHBhZGFwdGVyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQlRfMkFOVF9DT0VYX0FMR09fUEFOSFM6Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gSFMgbW9kZS5cbiIpKTsKLQkJCQlidGRtXzJBbnQ4NzIzQVBBTkhTQWN0aW9uKHBhZGFwdGVyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQlRfMkFOVF9DT0VYX0FMR09fUEFORURSX0EyRFA6Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gUEFOK0EyRFAuXG4iKSk7Ci0JCQkJYnRkbV8yQW50ODcyM0FQQU5FRFJBMkRQQWN0aW9uKHBhZGFwdGVyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQlRfMkFOVF9DT0VYX0FMR09fUEFORURSX0hJRDoKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQWN0aW9uIDItQW50LCBhbGdvcml0aG0gPSBQQU4oRURSKStISUQuXG4iKSk7Ci0JCQkJYnRkbV8yQW50ODcyM0FQQU5FRFJISURBY3Rpb24ocGFkYXB0ZXIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCVF8yQU5UX0NPRVhfQUxHT19ISURfQTJEUF9QQU5FRFI6Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gSElEK0EyRFArUEFOLlxuIikpOwotCQkJCWJ0ZG1fMkFudDg3MjNBSElEQTJEUFBBTkVEUkFjdGlvbihwYWRhcHRlcik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJUXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IEhJRCtBMkRQLlxuIikpOwotCQkJCWJ0ZG1fMkFudDg3MjNBSElEQTJEUEFjdGlvbihwYWRhcHRlcik7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IDAuXG4iKSk7Ci0JCQkJYnRkbV8yQW50ODcyM0FBMkRQQWN0aW9uKHBhZGFwdGVyKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXBCdGRtODcyMy0+cHJlQWxnb3JpdGhtID0gcEJ0ZG04NzIzLT5jdXJBbGdvcml0aG07Ci0JCX0KLQl9Ci19Ci0KLS8qICA9PT09PSBFbmQgb2Ygc3luYyBmcm9tIFNENyBkcml2ZXIgSEFML0JUQ29leGlzdC9IYWxCdGM4NzIzMkFudC5jID09PT09ICovCi0KLS8qICA9PT09PSBCZWxvdyB0aGlzIGxpbmUgaXMgc3luYyBmcm9tIFNENyBkcml2ZXIgSEFML0JUQ29leGlzdC9IYWxCdGM4NzIzLmMgPT09PT0gKi8KLQotc3RhdGljIHU4IGJ0Q29leERiZ0J1ZltCVF9UTVBfQlVGX1NJWkVdOwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgQnRQcm9maWxlU3RyaW5nW10gPSB7Ci0JIk5PTkUiLAotCSJBMkRQIiwKLQkiUEFOIiwKLQkiSElEIiwKLQkiU0NPIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBCdFNwZWNTdHJpbmdbXSA9IHsKLQkiMS4wYiIsCi0JIjEuMSIsCi0JIjEuMiIsCi0JIjIuMCtFRFIiLAotCSIyLjErRURSIiwKLQkiMy4wK0hTIiwKLQkiNC4wIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBCdExpbmtSb2xlU3RyaW5nW10gPSB7Ci0JIk1hc3RlciIsCi0JIlNsYXZlIiwKLX07Ci0KLXN0YXRpYyB1OCBidGRtX0J0V2lmaUFudE51bShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9jb2V4aXN0Xzg3MjNhICpwQnRDb2V4ID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzOwotCi0JaWYgKEFudF94MiA9PSBwSGFsRGF0YS0+YnRfY29leGlzdC5CVF9BbnRfTnVtKSB7Ci0JCWlmIChBbnRfeDIgPT0gcEJ0Q29leC0+VG90YWxBbnROdW0pCi0JCQlyZXR1cm4gQW50X3gyOwotCQllbHNlCi0JCQlyZXR1cm4gQW50X3gxOwotCX0gZWxzZSB7Ci0JCXJldHVybiBBbnRfeDE7Ci0JfQotCXJldHVybiBBbnRfeDI7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0ZG1fQnRId0NvdW50ZXJzTW9uaXRvcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXUzMglyZWdIUFR4UngsIHJlZ0xQVHhSeCwgdTRUbXA7Ci0JdTMyCXJlZ0hQVHggPSAwLCByZWdIUFJ4ID0gMCwgcmVnTFBUeCA9IDAsIHJlZ0xQUnggPSAwOwotCi0JcmVnSFBUeFJ4ID0gUkVHX0hJR0hfUFJJT1JJVFlfVFhSWDsKLQlyZWdMUFR4UnggPSBSRUdfTE9XX1BSSU9SSVRZX1RYUlg7Ci0KLQl1NFRtcCA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIHJlZ0hQVHhSeCk7Ci0JcmVnSFBUeCA9IHU0VG1wICYgYk1hc2tMV29yZDsKLQlyZWdIUFJ4ID0gKHU0VG1wICYgYk1hc2tIV29yZCk+PjE2OwotCi0JdTRUbXAgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCByZWdMUFR4UngpOwotCXJlZ0xQVHggPSB1NFRtcCAmIGJNYXNrTFdvcmQ7Ci0JcmVnTFBSeCA9ICh1NFRtcCAmIGJNYXNrSFdvcmQpPj4xNjsKLQotCXBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmhpZ2hQcmlvcml0eVR4ID0gcmVnSFBUeDsKLQlwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5oaWdoUHJpb3JpdHlSeCA9IHJlZ0hQUng7Ci0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMubG93UHJpb3JpdHlUeCA9IHJlZ0xQVHg7Ci0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMubG93UHJpb3JpdHlSeCA9IHJlZ0xQUng7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiSGlnaCBQcmlvcml0eSBUeC9SeCA9ICVkIC8gJWRcbiIsIHJlZ0hQVHgsIHJlZ0hQUngpKTsKLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiTG93IFByaW9yaXR5IFR4L1J4ID0gJWQgLyAlZFxuIiwgcmVnTFBUeCwgcmVnTFBSeCkpOwotCi0JLyogIHJlc2V0IGNvdW50ZXIgKi8KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCAweDc2ZSwgMHhjKTsKLX0KLQotLyogIFRoaXMgZnVuY3Rpb24gY2hlY2sgaWYgODcyMyBidCBpcyBkaXNhYmxlZCAqLwotc3RhdGljIHZvaWQgYnRkbV9CdEVuYWJsZURpc2FibGVDaGVjazg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTggYnRBbGlmZSA9IHRydWU7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLSNpZmRlZiBDSEVDS19CVF9FWElTVF9GUk9NX1JFRwotCXU4IHZhbDg7Ci0KLQkvKiAgb3g2OFsyOF09IDEgPT4gQlQgZW5hYmxlOyBvdGhlcndpc2UgZGlzYWJsZSAqLwotCXZhbDggPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIDB4NkIpOwotCWlmICghKHZhbDggJiBCSVQoNCkpKQotCQlidEFsaWZlID0gZmFsc2U7Ci0KLQlpZiAoYnRBbGlmZSkKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkN1ckJ0RGlzYWJsZWQgPSBmYWxzZTsKLQllbHNlCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJDdXJCdERpc2FibGVkID0gdHJ1ZTsKLSNlbHNlCi0JaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmhpZ2hQcmlvcml0eVR4ID09IDAgJiYKLQkgICAgcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuaGlnaFByaW9yaXR5UnggPT0gMCAmJgotCSAgICBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5sb3dQcmlvcml0eVR4ID09IDAgJiYKLQkgICAgcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMubG93UHJpb3JpdHlSeCA9PSAwKQotCQlidEFsaWZlID0gZmFsc2U7Ci0JaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmhpZ2hQcmlvcml0eVR4ID09IDB4ZWFlYSAmJgotCSAgICBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5oaWdoUHJpb3JpdHlSeCA9PSAweGVhZWEgJiYKLQkgICAgcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMubG93UHJpb3JpdHlUeCA9PSAweGVhZWEgJiYKLQkgICAgcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMubG93UHJpb3JpdHlSeCA9PSAweGVhZWEpCi0JCWJ0QWxpZmUgPSBmYWxzZTsKLQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuaGlnaFByaW9yaXR5VHggPT0gMHhmZmZmICYmCi0JICAgIHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmhpZ2hQcmlvcml0eVJ4ID09IDB4ZmZmZiAmJgotCSAgICBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5sb3dQcmlvcml0eVR4ID09IDB4ZmZmZiAmJgotCSAgICBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5sb3dQcmlvcml0eVJ4ID09IDB4ZmZmZikKLQkJYnRBbGlmZSA9IGZhbHNlOwotCWlmIChidEFsaWZlKSB7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJ0QWN0aXZlWmVyb0NudCA9IDA7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJDdXJCdERpc2FibGVkID0gZmFsc2U7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCI4NzIzQSBCVCBpcyBlbmFibGVkICEhXG4iKSk7Ci0JfSBlbHNlIHsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYnRBY3RpdmVaZXJvQ250Kys7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCI4NzIzQSBidCBhbGwgY291bnRlcnMgPSAwLCAlZCB0aW1lcyEhXG4iLAotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJ0QWN0aXZlWmVyb0NudCkpOwotCQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuYnRBY3RpdmVaZXJvQ250ID49IDIpIHsKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJDdXJCdERpc2FibGVkID0gdHJ1ZTsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCI4NzIzQSBCVCBpcyBkaXNhYmxlZCAhIVxuIikpOwotCQl9Ci0JfQotI2VuZGlmCi0KLQlpZiAoIXBIYWxEYXRhLT5idF9jb2V4aXN0LmJDdXJCdERpc2FibGVkKSB7Ci0JCWlmIChCVERNX0lzV2lmaUNvbm5lY3Rpb25FeGlzdChwYWRhcHRlcikpCi0JCQlCVERNX1NldEZ3Q2hubEluZm8ocGFkYXB0ZXIsIFJUX01FRElBX0NPTk5FQ1QpOwotCQllbHNlCi0JCQlCVERNX1NldEZ3Q2hubEluZm8ocGFkYXB0ZXIsIFJUX01FRElBX0RJU0NPTk5FQ1QpOwotCX0KLQotCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5iUHJlQnREaXNhYmxlZCAhPQotCSAgICBwSGFsRGF0YS0+YnRfY29leGlzdC5iQ3VyQnREaXNhYmxlZCkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiODcyM0EgQlQgaXMgZnJvbSAlcyB0byAlcyEhXG4iLAotCQkJKHBIYWxEYXRhLT5idF9jb2V4aXN0LmJQcmVCdERpc2FibGVkID8gImRpc2FibGVkIjoiZW5hYmxlZCIpLAotCQkJKHBIYWxEYXRhLT5idF9jb2V4aXN0LmJDdXJCdERpc2FibGVkID8gImRpc2FibGVkIjoiZW5hYmxlZCIpKSk7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJQcmVCdERpc2FibGVkID0gcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkN1ckJ0RGlzYWJsZWQ7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBidGRtX0JUQ29leGlzdDg3MjNBSGFuZGxlcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0KLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlpZiAoYnRkbV9CdFdpZmlBbnROdW0ocGFkYXB0ZXIpID09IEFudF94MikgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIDIgQW50IG1lY2hhbmlzbVxuIikpOwotCQlCVERNXzJBbnRCdENvZXhpc3Q4NzIzQShwYWRhcHRlcik7Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCAxIEFudCBtZWNoYW5pc21cbiIpKTsKLQkJQlRETV8xQW50QnRDb2V4aXN0ODcyM0EocGFkYXB0ZXIpOwotCX0KLQotCWlmICghQlRETV9Jc1NhbWVDb2V4aXN0U3RhdGUocGFkYXB0ZXIpKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQ29leGlzdCBTdGF0ZVtiaXRNYXBdIGNoYW5nZSBmcm9tIDB4JSJpNjRmbXQieCB0byAweCUiaTY0Zm10InhcbiIsCi0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5QcmV2aW91c1N0YXRlLAotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlKSk7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LlByZXZpb3VzU3RhdGUgPSBwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGU7Ci0KLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIlsiKSk7Ci0JCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJiBCVF9DT0VYX1NUQVRFX0JUMzApCi0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQlQgMy4wLCAiKSk7Ci0JCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJiBCVF9DT0VYX1NUQVRFX1dJRklfSFQyMCkKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJIVDIwLCAiKSk7Ci0JCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJiBCVF9DT0VYX1NUQVRFX1dJRklfSFQ0MCkKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJIVDQwLCAiKSk7Ci0JCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJiBCVF9DT0VYX1NUQVRFX1dJRklfTEVHQUNZKQotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkxlZ2FjeSwgIikpOwotCQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICYgQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfTE9XKQotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIlJzc2lfTG93LCAiKSk7Ci0JCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJiBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9NRURJVU0pCi0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiUnNzaV9NaWQsICIpKTsKLQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmIEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0hJR0gpCi0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiUnNzaV9IaWdoLCAiKSk7Ci0JCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJiBCVF9DT0VYX1NUQVRFX1dJRklfSURMRSkKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpX0lkbGUsICIpKTsKLQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmIEJUX0NPRVhfU1RBVEVfV0lGSV9VUExJTkspCi0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaV9VcGxpbmssICIpKTsKLQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmIEJUX0NPRVhfU1RBVEVfV0lGSV9ET1dOTElOSykKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpX0Rvd25saW5rLCAiKSk7Ci0JCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJiBCVF9DT0VYX1NUQVRFX0JUX0lETEUpCi0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQlRfaWRsZSwgIikpOwotCQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICYgQlRfQ09FWF9TVEFURV9QUk9GSUxFX0hJRCkKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJQUk9fSElELCAiKSk7Ci0JCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJiBCVF9DT0VYX1NUQVRFX1BST0ZJTEVfQTJEUCkKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJQUk9fQTJEUCwgIikpOwotCQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICYgQlRfQ09FWF9TVEFURV9QUk9GSUxFX1BBTikKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJQUk9fUEFOLCAiKSk7Ci0JCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJiBCVF9DT0VYX1NUQVRFX1BST0ZJTEVfU0NPKQotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIlBST19TQ08sICIpKTsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIl1cbiIpKTsKLQl9Ci19Ci0KLS8qICBleHRlcm4gZnVuY3Rpb24gc3RhcnQgd2l0aCBCVERNXyAqLwotdTMyIEJURE1fQnRUeFJ4Q291bnRlckgoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQl1MzIJY291bnRlcnM7Ci0KLQljb3VudGVycyA9IHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmhpZ2hQcmlvcml0eVR4KwotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5oaWdoUHJpb3JpdHlSeDsKLQlyZXR1cm4gY291bnRlcnM7Ci19Ci0KLXUzMiBCVERNX0J0VHhSeENvdW50ZXJMKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JdTMyCWNvdW50ZXJzOwotCi0JY291bnRlcnMgPSBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5sb3dQcmlvcml0eVR4KwotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5sb3dQcmlvcml0eVJ4OwotCXJldHVybiBjb3VudGVyczsKLX0KLQotdm9pZCBCVERNX1NldEZ3Q2hubEluZm8oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgZW51bSBydF9tZWRpYV9zdGF0dXMgbXN0YXR1cykKLXsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXU4IEgyQ19QYXJhbWV0ZXJbM10gPSB7MH07Ci0JdTggY2hubDsKLQotCS8qICBvcE1vZGUgKi8KLQlpZiAoUlRfTUVESUFfQ09OTkVDVCA9PSBtc3RhdHVzKQotCQlIMkNfUGFyYW1ldGVyWzBdID0gMHgxOwkvKiAgMDogZGlzY29ubmVjdGVkLCAxOmNvbm5lY3RlZCAqLwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9BU09DX1NUQVRFKSkgewotCQkvKiAgY2hhbm5lbCAqLwotCQljaG5sID0gcG1sbWVleHQtPmN1cl9jaGFubmVsOwotCQlpZiAoQlRETV9Jc0hUNDAocGFkYXB0ZXIpKSB7Ci0JCQlpZiAocG1sbWVleHQtPmN1cl9jaF9vZmZzZXQgPT0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX1VQUEVSKQotCQkJCWNobmwgLT0gMjsKLQkJCWVsc2UgaWYgKHBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0ID09IEhBTF9QUklNRV9DSE5MX09GRlNFVF9MT1dFUikKLQkJCQljaG5sICs9IDI7Ci0JCX0KLQkJSDJDX1BhcmFtZXRlclsxXSA9IGNobmw7Ci0JfSBlbHNlIHsJLyogIGNoZWNrIGlmIEhTIGxpbmsgaXMgZXhpc3RzICovCi0JCS8qICBjaGFubmVsICovCi0JCWlmIChCVF9PcGVyYXRpb24ocGFkYXB0ZXIpKQotCQkJSDJDX1BhcmFtZXRlclsxXSA9IHBCdE1nbnQtPkJUQ2hhbm5lbDsKLQkJZWxzZQotCQkJSDJDX1BhcmFtZXRlclsxXSA9IHBtbG1lZXh0LT5jdXJfY2hhbm5lbDsKLQl9Ci0KLQlpZiAoQlRETV9Jc0hUNDAocGFkYXB0ZXIpKQotCQlIMkNfUGFyYW1ldGVyWzJdID0gMHgzMDsKLQllbHNlCi0JCUgyQ19QYXJhbWV0ZXJbMl0gPSAweDIwOwotCi0JRmlsbEgyQ0NtZChwYWRhcHRlciwgMHgxOSwgMywgSDJDX1BhcmFtZXRlcik7Ci19Ci0KLXU4IEJURE1fSXNXaWZpQ29ubmVjdGlvbkV4aXN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTggYlJldCA9IGZhbHNlOwotCi0JaWYgKEJUSENJX0hzQ29ubmVjdGlvbkVzdGFibGlzaGVkKHBhZGFwdGVyKSkKLQkJYlJldCA9IHRydWU7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX0FTT0NfU1RBVEUpID09IHRydWUpCi0JCWJSZXQgPSB0cnVlOwotCi0JcmV0dXJuIGJSZXQ7Ci19Ci0KLXZvaWQgQlRETV9TZXRGdzNhKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JdTggYnl0ZTEsCi0JdTggYnl0ZTIsCi0JdTggYnl0ZTMsCi0JdTggYnl0ZTQsCi0JdTggYnl0ZTUKLQkpCi17Ci0JdTggSDJDX1BhcmFtZXRlcls1XSA9IHswfTsKLQotCWlmIChydGw4NzIzYV9CVF91c2luZ19hbnRlbm5hXzEocGFkYXB0ZXIpKSB7Ci0JCWlmICgoIWNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSkgJiYKLQkJICAgIChnZXRfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2KSAhPSBXSUZJX05VTExfU1RBVEUpKSB7Ci0JCQkvKiAgZm9yIHNvZnRhcCBtb2RlICovCi0JCQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQkJCXN0cnVjdCBidF9jb2V4aXN0Xzg3MjNhICpwQnRDb2V4ID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzOwotCQkJdTggQnRTdGF0ZSA9IHBCdENvZXgtPmMyaEJ0SW5mbzsKLQotCQkJaWYgKChCdFN0YXRlICE9IEJUX0lORk9fU1RBVEVfTk9fQ09OTkVDVElPTikgJiYKLQkJCSAgICAoQnRTdGF0ZSAhPSBCVF9JTkZPX1NUQVRFX0NPTk5FQ1RfSURMRSkpIHsKLQkJCQlpZiAoYnl0ZTEgJiBCSVQoNCkpIHsKLQkJCQkJYnl0ZTEgJj0gfkJJVCg0KTsKLQkJCQkJYnl0ZTEgfD0gQklUKDUpOwotCQkJCX0KLQotCQkJCWJ5dGU1IHw9IEJJVCg1KTsKLQkJCQlpZiAoYnl0ZTUgJiBCSVQoNikpCi0JCQkJCWJ5dGU1ICY9IH5CSVQoNik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlIMkNfUGFyYW1ldGVyWzBdID0gYnl0ZTE7Ci0JSDJDX1BhcmFtZXRlclsxXSA9IGJ5dGUyOwotCUgyQ19QYXJhbWV0ZXJbMl0gPSBieXRlMzsKLQlIMkNfUGFyYW1ldGVyWzNdID0gYnl0ZTQ7Ci0JSDJDX1BhcmFtZXRlcls0XSA9IGJ5dGU1OwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBGVyB3cml0ZSAweDNhKDVieXRlcykgPSAweCUwMnglMDh4XG4iLAotCQlIMkNfUGFyYW1ldGVyWzBdLAotCQlIMkNfUGFyYW1ldGVyWzFdPDwyNHxIMkNfUGFyYW1ldGVyWzJdPDwxNnxIMkNfUGFyYW1ldGVyWzNdPDw4fEgyQ19QYXJhbWV0ZXJbNF0pKTsKLQotCUZpbGxIMkNDbWQocGFkYXB0ZXIsIDB4M2EsIDUsIEgyQ19QYXJhbWV0ZXIpOwotfQotCi12b2lkIEJURE1fUXVlcnlCdEluZm9ybWF0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTggSDJDX1BhcmFtZXRlclsxXSA9IHswfTsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXN0cnVjdCBidF9jb2V4aXN0Xzg3MjNhICpwQnRDb2V4OwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBCdENvZXggPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjM7Ci0KLQlpZiAoIXJ0bDg3MjNhX0JUX2VuYWJsZWQocGFkYXB0ZXIpKSB7Ci0JCXBCdENvZXgtPmMyaEJ0SW5mbyA9IEJUX0lORk9fU1RBVEVfRElTQUJMRUQ7Ci0JCXBCdENvZXgtPmJDMmhCdEluZm9SZXFTZW50ID0gZmFsc2U7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocEJ0Q29leC0+YzJoQnRJbmZvID09IEJUX0lORk9fU1RBVEVfRElTQUJMRUQpCi0JCXBCdENvZXgtPmMyaEJ0SW5mbyA9IEJUX0lORk9fU1RBVEVfTk9fQ09OTkVDVElPTjsKLQotCWlmIChwQnRDb2V4LT5iQzJoQnRJbmZvUmVxU2VudCA9PSB0cnVlKQotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIGRpZG4ndCByZWN2IHByZXZpb3VzIEJ0SW5mbyByZXBvcnQhXG4iKSk7Ci0JZWxzZQotCQlwQnRDb2V4LT5iQzJoQnRJbmZvUmVxU2VudCA9IHRydWU7Ci0KLQlIMkNfUGFyYW1ldGVyWzBdIHw9IEJJVCgwKTsJLyogIHRyaWdnZXIgKi8KLQotLypSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFF1ZXJ5IEJ0IGluZm9ybWF0aW9uLCB3cml0ZSAweDM4ID0gMHgleFxuIiwgKi8KLS8qSDJDX1BhcmFtZXRlclswXSkpOyAqLwotCi0JRmlsbEgyQ0NtZChwYWRhcHRlciwgMHgzOCwgMSwgSDJDX1BhcmFtZXRlcik7Ci19Ci0KLXZvaWQgQlRETV9TZXRTd1JmUnhMcGZDb3JuZXIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggdHlwZSkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWlmIChCVF9SRl9SWF9MUEZfQ09STkVSX1NIUklOSyA9PSB0eXBlKSB7Ci0JCS8qIFNocmluayBSRiBSeCBMUEYgY29ybmVyICovCi0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJTaHJpbmsgUkYgUnggTFBGIGNvcm5lciEhXG4iKSk7Ci0JCVBIWV9TZXRSRlJlZyhwYWRhcHRlciwgUGF0aEEsIDB4MWUsIGJSRlJlZ09mZnNldE1hc2ssIDB4ZjBmZjcpOwotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5iU1dDb2V4aXN0QWxsT2ZmID0gZmFsc2U7Ci0JfSBlbHNlIGlmIChCVF9SRl9SWF9MUEZfQ09STkVSX1JFU1VNRSA9PSB0eXBlKSB7Ci0JCS8qIFJlc3VtZSBSRiBSeCBMUEYgY29ybmVyICovCi0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJSZXN1bWUgUkYgUnggTFBGIGNvcm5lciEhXG4iKSk7Ci0JCVBIWV9TZXRSRlJlZyhwYWRhcHRlciwgUGF0aEEsIDB4MWUsIGJSRlJlZ09mZnNldE1hc2ssIHBIYWxEYXRhLT5idF9jb2V4aXN0LkJ0UmZSZWdPcmlnaW4xRSk7Ci0JfQotfQotCi12b2lkCi1CVERNX1NldFN3UGVuYWx0eVR4UmF0ZUFkYXB0aXZlKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JdTggcmFUeXBlCi0JKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXU4IHRtcFUxOwotCi0JdG1wVTEgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIDB4NGZkKTsKLQl0bXBVMSB8PSBCSVQoMCk7Ci0JaWYgKEJUX1RYX1JBVEVfQURBUFRJVkVfTE9XX1BFTkFMVFkgPT0gcmFUeXBlKSB7Ci0JCXRtcFUxICY9IH5CSVQoMik7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJTV0NvZXhpc3RBbGxPZmYgPSBmYWxzZTsKLQl9IGVsc2UgaWYgKEJUX1RYX1JBVEVfQURBUFRJVkVfTk9STUFMID09IHJhVHlwZSkgewotCQl0bXBVMSB8PSBCSVQoMik7Ci0JfQotCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgMHg0ZmQsIHRtcFUxKTsKLX0KLQotdm9pZCBCVERNX1NldEZ3RGVjQnRQd3Ioc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYkRlY0J0UHdyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXU4IEgyQ19QYXJhbWV0ZXJbMV0gPSB7MH07Ci0KLQlIMkNfUGFyYW1ldGVyWzBdID0gMDsKLQotCWlmIChiRGVjQnRQd3IpIHsKLQkJSDJDX1BhcmFtZXRlclswXSB8PSBCSVQoMSk7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJGV0NvZXhpc3RBbGxPZmYgPSBmYWxzZTsKLQl9Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIGRlY3JlYXNlIEJ0IFBvd2VyIDogJXMsIHdyaXRlIDB4MjEgPSAweCV4XG4iLAotCQkoYkRlY0J0UHdyID8gIlllcyEhIiA6ICJObyEhIiksIEgyQ19QYXJhbWV0ZXJbMF0pKTsKLQotCUZpbGxIMkNDbWQocGFkYXB0ZXIsIDB4MjEsIDEsIEgyQ19QYXJhbWV0ZXIpOwotfQotCi11OCBCVERNX0J0UHJvZmlsZVN1cHBvcnQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1OCBiUmV0ID0gZmFsc2U7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlpZiAocEJ0TWdudC0+YlN1cHBvcnRQcm9maWxlICYmCi0JICAgICFwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5iRm9yY2VGd0J0SW5mbykKLQkJYlJldCA9IHRydWU7Ci0KLQlyZXR1cm4gYlJldDsKLX0KLQotc3RhdGljIHZvaWQgQlRETV9BZGp1c3RGb3JCdE9wZXJhdGlvbjg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JLyogQlRETV8yQW50QWRqdXN0Rm9yQnRPcGVyYXRpb244NzIzKHBhZGFwdGVyKTsgKi8KLX0KLQotc3RhdGljIHZvaWQgQlRETV9Gd0MyaEJ0UnNzaTg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICp0bXBCdWYpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JdTggcGVyY2VudCwgdTF0bXA7Ci0KLQl1MXRtcCA9IHRtcEJ1ZlswXTsKLQlwZXJjZW50ID0gdTF0bXAqMisxMDsKLQotCXBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0UnNzaSA9IHBlcmNlbnQ7Ci0vKlJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDMkhdLCBCVCBSU1NJID0lZFxuIiwgcGVyY2VudCkpOyAqLwotfQotCi12b2lkCi1ydGw4NzIzYV9md19jMmhfQlRfaW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqdG1wQnVmLCB1OCBsZW5ndGgpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250OwotCXN0cnVjdCBidF9jb2V4aXN0Xzg3MjNhICpwQnRDb2V4OwotCXU4IGk7Ci0KLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQlwQnRDb2V4ID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzOwotCi0JcEJ0Q29leC0+YkMyaEJ0SW5mb1JlcVNlbnQgPSBmYWxzZTsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDMkhdLCBCVCBpbmZvWyVkXT1bIiwgbGVuZ3RoKSk7Ci0KLQlwQnRDb2V4LT5idFJldHJ5Q250ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJc3dpdGNoIChpKSB7Ci0JCWNhc2UgMDoKLQkJCXBCdENvZXgtPmMyaEJ0SW5mb09yaWdpbmFsID0gdG1wQnVmW2ldOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCXBCdENvZXgtPmJ0UmV0cnlDbnQgPSB0bXBCdWZbaV07Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJQlRETV9Gd0MyaEJ0UnNzaTg3MjNBKHBhZGFwdGVyLCAmdG1wQnVmW2ldKTsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQlwQnRDb2V4LT5idEluZm9FeHQgPSB0bXBCdWZbaV0mQklUKDApOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaSA9PSBsZW5ndGgtMSkKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCIweCUwMnhdXG4iLCB0bXBCdWZbaV0pKTsKLQkJZWxzZQotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIjB4JTAyeCwgIiwgdG1wQnVmW2ldKSk7Ci0JfQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDMkhdLCBCVCBSU1NJID0lZFxuIiwgcEJ0Q29leC0+YnRSc3NpKSk7Ci0JaWYgKHBCdENvZXgtPmJ0SW5mb0V4dCkKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVEMySF0sIHBCdENvZXgtPmJ0SW5mb0V4dCA9JXhcbiIsIHBCdENvZXgtPmJ0SW5mb0V4dCkpOwotCi0JaWYgKGJ0ZG1fQnRXaWZpQW50TnVtKHBhZGFwdGVyKSA9PSBBbnRfeDEpCi0JCUJURE1fMUFudEZ3QzJoQnRJbmZvODcyM0EocGFkYXB0ZXIpOwotCWVsc2UKLQkJQlRETV8yQW50RndDMmhCdEluZm84NzIzQShwYWRhcHRlcik7Ci0KLQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLmJNYW51YWxDb250cm9sKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCIlczogQWN0aW9uIE1hbnVhbCBjb250cm9sISFcbiIsIF9fZnVuY19fKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlidGRtX0JUQ29leGlzdDg3MjNBSGFuZGxlcihwYWRhcHRlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIEJURE1fRGlzcGxheTg3MjNBQnRDb2V4SW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9jb2V4aXN0Xzg3MjNhICpwQnRDb2V4ID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXU4IHUxVG1wLCB1MVRtcDEsIHUxVG1wMiwgaSwgYnRJbmZvRXh0LCBwc1RkbWFDYXNlID0gMDsKLQl1MzIgdTRUbXBbNF07Ci0JdTggYW50TnVtID0gQW50X3gyOwotCi0Jc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuID09PT09PT09PT09PVtCVCBDb2V4aXN0IGluZm9dPT09PT09PT09PT09Iik7Ci0JRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQotCWlmICghcnRsODcyM2FfQlRfY29leGlzdChwYWRhcHRlcikpIHsKLQkJc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuIEJUIG5vdCBleGlzdHMgISEhIik7Ci0JCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0JCXJldHVybjsKLQl9Ci0KLQlhbnROdW0gPSBidGRtX0J0V2lmaUFudE51bShwYWRhcHRlcik7Ci0Jc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQvJWQgIiwgIkFudCBtZWNoYW5pc20gUEcvTm93IHJ1biA6IiwgXAotCQkoKHBIYWxEYXRhLT5idF9jb2V4aXN0LkJUX0FudF9OdW0gPT0gQW50X3gyKSA/IDIgOiAxKSwgKChhbnROdW0gPT0gQW50X3gyKSA/IDIgOiAxKSk7Ci0JRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQotCWlmIChwQnRNZ250LT5FeHRDb25maWcuYk1hbnVhbENvbnRyb2wpIHsKLQkJc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzIiwgIltBY3Rpb24gTWFudWFsIGNvbnRyb2xdISEiKTsKLQkJRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQl9IGVsc2UgewotCQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlcyAvICVkIiwgIkJUIHN0YWNrLyBoY2kgZXh0IHZlciIsIFwKLQkJCSgocEJ0TWdudC0+YlN1cHBvcnRQcm9maWxlKSA/ICJZZXMiIDogIk5vIiksIHBCdE1nbnQtPkV4dENvbmZpZy5IQ0lFeHRlbnNpb25WZXIpOwotCQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCX0KLQotCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXG4gJS0zNXMgPSAvICVkIiwgIkRvdDExIGNoYW5uZWwgLyBCVCBjaGFubmVsIiwgXAotCQlwQnRNZ250LT5CVENoYW5uZWwpOwotCQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCi0Jc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcbiAlLTM1cyA9ICVkIC8gJWQgLyAlZCIsICJXaWZpL0JUL0hTIHJzc2kiLCBcCi0JCUJURE1fR2V0UnhTUyhwYWRhcHRlciksCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0UnNzaSwKLQkJcEhhbERhdGEtPmRtcHJpdi5FbnRyeU1pblVuZGVjb3JhdGVkU21vb3RoZWRQV0RCKTsKLQkJCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0KLQlpZiAoIXBCdE1nbnQtPkV4dENvbmZpZy5iTWFudWFsQ29udHJvbCkgewotCQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxuICUtMzVzID0gJXMgLyAlcyAiLCAiV0lmaSBzdGF0dXMiLAotCQkJKChCVERNX0xlZ2FjeShwYWRhcHRlcikpID8gIkxlZ2FjeSIgOiAoKChCVERNX0lzSFQ0MChwYWRhcHRlcikpID8gIkhUNDAiIDogIkhUMjAiKSkpLAotCQkJKCghQlRETV9Jc1dpZmlCdXN5KHBhZGFwdGVyKSkgPyAiaWRsZSIgOiAoKEJURE1fSXNXaWZpVXBsaW5rKHBhZGFwdGVyKSkgPyAidXBsaW5rIiA6ICJkb3dubGluayIpKSk7Ci0JCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0KLQkJaWYgKHBCdE1nbnQtPmJTdXBwb3J0UHJvZmlsZSkgewotCQkJc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQgLyAlZCAvICVkIC8gJWQiLCAiU0NPL0hJRC9QQU4vQTJEUCIsCi0JCQkJKChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9TQ08pKSA/IDEgOiAwKSwKLQkJCQkoKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX0hJRCkpID8gMSA6IDApLAotCQkJCSgoQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfUEFOKSkgPyAxIDogMCksCi0JCQkJKChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9BMkRQKSkgPyAxIDogMCkpOwotCQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCi0JCQlmb3IgKGkgPSAwOyBpIDwgcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlOyBpKyspIHsKLQkJCQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLkhDSUV4dGVuc2lvblZlciA+PSAxKSB7Ci0JCQkJCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVzLyAlcy8gJXMiLCAiQnQgbGluayB0eXBlL3NwZWMvcm9sZSIsCi0JCQkJCQlCdFByb2ZpbGVTdHJpbmdbcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkJUUHJvZmlsZV0sCi0JCQkJCQlCdFNwZWNTdHJpbmdbcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkJUQ29yZVNwZWNdLAotCQkJCQkJQnRMaW5rUm9sZVN0cmluZ1twQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0ubGlua1JvbGVdKTsKLQkJCQkJRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQotCQkJCQlidEluZm9FeHQgPSBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idEluZm9FeHQ7Ci0JCQkJCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVzIiwgIkEyRFAgcmF0ZSIsIFwKLQkJCQkJCSAoYnRJbmZvRXh0ICYgQklUKDApKSA/Ci0JCQkJCQkgIkJhc2ljIHJhdGUiIDogIkVEUiByYXRlIik7Ci0JCQkJCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJXMvICVzIiwgIkJ0IGxpbmsgdHlwZS9zcGVjIiwgXAotCQkJCQkJQnRQcm9maWxlU3RyaW5nW3BCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5CVFByb2ZpbGVdLAotCQkJCQkJQnRTcGVjU3RyaW5nW3BCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5CVENvcmVTcGVjXSk7Ci0JCQkJCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyogIFN3IG1lY2hhbmlzbSAqLwotCWlmICghcEJ0TWdudC0+RXh0Q29uZmlnLmJNYW51YWxDb250cm9sKSB7Ci0JCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyIsICI9PT09PT09PT09PT1bU3cgQlQgQ29leCBtZWNoYW5pc21dPT09PT09PT09PT09Iik7Ci0JCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0JCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkICIsICJBR0MgVGFibGUiLCBcCi0JCQlwQnRDb2V4LT5idGRtMkFudC5iQ3VyQWdjVGFibGVFbik7Ci0JCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0JCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkICIsICJBREMgQmFja29mZiIsIFwKLQkJCXBCdENvZXgtPmJ0ZG0yQW50LmJDdXJBZGNCYWNrT2ZmKTsKLQkJRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQkJc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQgIiwgIkxvdyBwZW5hbHR5IFJBIiwgXAotCQkJcEJ0Q29leC0+YnRkbTJBbnQuYkN1ckxvd1BlbmFsdHlSYSk7Ci0JCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0JCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkICIsICJSRiBSeCBMUEYgU2hyaW5rIiwgXAotCQkJcEJ0Q29leC0+YnRkbTJBbnQuYkN1clJmUnhMcGZTaHJpbmspOwotCQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCX0KLQl1NFRtcFswXSA9IFBIWV9RdWVyeVJGUmVnKHBhZGFwdGVyLCBQYXRoQSwgMHgxZSwgMHhmZjApOwotCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgiLCAiUkYtQSwgMHgxZVsxMTo0XS9vcmlnaW5hbCB2YWwiLCBcCi0JCXU0VG1wWzBdLCBwSGFsRGF0YS0+YnRfY29leGlzdC5CdFJmUmVnT3JpZ2luMUUpOwotCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0KLQkvKiAgRncgbWVjaGFuaXNtICovCi0JaWYgKCFwQnRNZ250LT5FeHRDb25maWcuYk1hbnVhbENvbnRyb2wpIHsKLQkJc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzIiwgIj09PT09PT09PT09PVtGdyBCVCBDb2V4IG1lY2hhbmlzbV09PT09PT09PT09PT0iKTsKLQkJRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQl9Ci0JaWYgKCFwQnRNZ250LT5FeHRDb25maWcuYk1hbnVhbENvbnRyb2wpIHsKLQkJaWYgKGJ0ZG1fQnRXaWZpQW50TnVtKHBhZGFwdGVyKSA9PSBBbnRfeDEpCi0JCQlwc1RkbWFDYXNlID0gcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTFBbnQuY3VyUHNUZG1hOwotCQllbHNlCi0JCQlwc1RkbWFDYXNlID0gcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTJBbnQuY3VyUHNUZG1hOwotCQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlKnBoIGNhc2UtJWQiLAotCQkJICJQUyBURE1BKDB4M2EpIiwgNSwgcEhhbERhdGEtPmJ0X2NvZXhpc3QuZnczYVZhbCwgcHNUZG1hQ2FzZSk7Ci0JCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0KLQkJc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQgIiwgIkRlY3JlYXNlIEJ0IFBvd2VyIiwgXAotCQkJcEJ0Q29leC0+YnRkbTJBbnQuYkN1ckRlY0J0UHdyKTsKLQkJRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQl9Ci0JdTFUbXAgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIDB4Nzc4KTsKLQl1MVRtcDEgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIDB4NzgzKTsKLQl1MVRtcDIgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIDB4Nzk2KTsKLQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4LyAweCV4IiwgIjB4Nzc4LyAweDc4My8gMHg3OTYiLCBcCi0JCXUxVG1wLCB1MVRtcDEsIHUxVG1wMik7Ci0JRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQotCWlmICghcEJ0TWdudC0+RXh0Q29uZmlnLmJNYW51YWxDb250cm9sKSB7Ci0JCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXggLyAweCV4IiwgIlN3IERhY1N3aW5nIEN0cmwvVmFsIiwgXAotCQkJcEJ0Q29leC0+YnRkbTJBbnQuYkN1ckRhY1N3aW5nT24sIHBCdENvZXgtPmJ0ZG0yQW50LmN1ckRhY1N3aW5nTHZsKTsKLQkJRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQl9Ci0JdTRUbXBbMF0gPSAgcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgMHg4ODApOwotCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgiLCAiMHg4ODAiLCBcCi0JCXU0VG1wWzBdKTsKLQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCi0JLyogIEh3IG1lY2hhbmlzbSAqLwotCWlmICghcEJ0TWdudC0+RXh0Q29uZmlnLmJNYW51YWxDb250cm9sKSB7Ci0JCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyIsICI9PT09PT09PT09PT1bSHcgQlQgQ29leCBtZWNoYW5pc21dPT09PT09PT09PT09Iik7Ci0JCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0JfQotCi0JdTFUbXAgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIDB4NDApOwotCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgiLCAiMHg0MCIsIFwKLQkJdTFUbXApOwotCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0KLQl1NFRtcFswXSA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIDB4NTUwKTsKLQl1MVRtcCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgMHg1MjIpOwotCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvMHgleCIsICIweDU1MChiY24gY29udHJsKS8weDUyMiIsIFwKLQkJdTRUbXBbMF0sIHUxVG1wKTsKLQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCi0JdTRUbXBbMF0gPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCAweDQ4NCk7Ci0Jc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICIweDQ4NChyYXRlIGFkYXB0aXZlKSIsIFwKLQkJdTRUbXBbMF0pOwotCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0KLQl1NFRtcFswXSA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIDB4NTApOwotCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgiLCAiMHhjNTAoZGlnKSIsIFwKLQkJdTRUbXBbMF0pOwotCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0KLQl1NFRtcFswXSA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIDB4ZGEwKTsKLQl1NFRtcFsxXSA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIDB4ZGE0KTsKLQl1NFRtcFsyXSA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIDB4ZGE4KTsKLQl1NFRtcFszXSA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIDB4ZGFjKTsKLQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4LyAweCV4LyAweCV4IiwgIjB4ZGEwLzB4ZGE0LzB4ZGE4LzB4ZGFjKEZBIGNudCkiLCBcCi0JCXU0VG1wWzBdLCB1NFRtcFsxXSwgdTRUbXBbMl0sIHU0VG1wWzNdKTsKLQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCi0JdTRUbXBbMF0gPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCAweDZjMCk7Ci0JdTRUbXBbMV0gPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCAweDZjNCk7Ci0JdTRUbXBbMl0gPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCAweDZjOCk7Ci0JdTFUbXAgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIDB4NmNjKTsKLQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4LyAweCV4LyAweCV4LyAweCV4IiwgIjB4NmMwLzB4NmM0LzB4NmM4LzB4NmNjKGNvZXhUYWJsZSkiLCBcCi0JCXU0VG1wWzBdLCB1NFRtcFsxXSwgdTRUbXBbMl0sIHUxVG1wKTsKLQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCi0JLyogdTRUbXAgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCAweDc3MCk7ICovCi0Jc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQgLyAlZCIsICIweDc3MChIaSBwcmkgUnhbMzE6MTZdL1R4WzE1OjBdKSIsIFwKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuaGlnaFByaW9yaXR5UngsCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmhpZ2hQcmlvcml0eVR4KTsKLQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCS8qIHU0VG1wID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgMHg3NzQpOyAqLwotCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVkIC8gJWQiLCAiMHg3NzQoTG8gcHJpIFJ4WzMxOjE2XS9UeFsxNTowXSkiLCBcCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmxvd1ByaW9yaXR5UngsCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmxvd1ByaW9yaXR5VHgpOwotCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0KLQkvKiAgVHggbWdudCBxdWV1ZSBoYW5nIG9yIG5vdCwgMHg0MWIgc2hvdWxkID0gMHhmLCBleDogMHhkID09PmhhbmcgKi8KLQl1MVRtcCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgMHg0MWIpOwotCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgiLCAiMHg0MWIgKGhhbmcgY2hrID09IDB4ZikiLCBcCi0JCXUxVG1wKTsKLQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgiLCAibGFzdEhNRUJveE51bSIsIFwKLQkJcEhhbERhdGEtPkxhc3RITUVCb3hOdW0pOwotCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1CVERNXzg3MjNBU2lnbmFsQ29tcGVuc2F0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgIHU4ICpyc3NpX3dpZmksIHU4ICpyc3NpX2J0KQotewotCWlmIChidGRtX0J0V2lmaUFudE51bShwYWRhcHRlcikgPT0gQW50X3gxKQotCQlCVERNXzFBbnRTaWduYWxDb21wZW5zYXRpb24ocGFkYXB0ZXIsIHJzc2lfd2lmaSwgcnNzaV9idCk7Ci19Ci0KLXN0YXRpYyB2b2lkIEJURE1fODcyM0FJbml0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JaWYgKGJ0ZG1fQnRXaWZpQW50TnVtKHBhZGFwdGVyKSA9PSBBbnRfeDIpCi0JCUJURE1fMkFudFBhcmFJbml0KHBhZGFwdGVyKTsKLQllbHNlCi0JCUJURE1fMUFudFBhcmFJbml0KHBhZGFwdGVyKTsKLX0KLQotc3RhdGljIHZvaWQgQlRETV9IV0NvZXhBbGxPZmY4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iTWFudWFsQ29udHJvbCkKLQkJcmV0dXJuOwotCi0JaWYgKGJ0ZG1fQnRXaWZpQW50TnVtKHBhZGFwdGVyKSA9PSBBbnRfeDIpCi0JCUJURE1fMkFudEh3Q29leEFsbE9mZjg3MjNBKHBhZGFwdGVyKTsKLX0KLQotc3RhdGljIHZvaWQgQlRETV9GV0NvZXhBbGxPZmY4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iTWFudWFsQ29udHJvbCkKLQkJcmV0dXJuOwotCi0JaWYgKGJ0ZG1fQnRXaWZpQW50TnVtKHBhZGFwdGVyKSA9PSBBbnRfeDIpCi0JCUJURE1fMkFudEZ3Q29leEFsbE9mZjg3MjNBKHBhZGFwdGVyKTsKLX0KLQotc3RhdGljIHZvaWQgQlRETV9TV0NvZXhBbGxPZmY4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iTWFudWFsQ29udHJvbCkKLQkJcmV0dXJuOwotCi0JaWYgKGJ0ZG1fQnRXaWZpQW50TnVtKHBhZGFwdGVyKSA9PSBBbnRfeDIpCi0JCUJURE1fMkFudFN3Q29leEFsbE9mZjg3MjNBKHBhZGFwdGVyKTsKLX0KLQotc3RhdGljIHZvaWQKLUJURE1fU2V0ODcyM0FCdENvZXhDdXJyQW50TnVtKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGFudE51bSkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfY29leGlzdF84NzIzYSAqcEJ0Q29leCA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMzsKLQotCWlmIChhbnROdW0gPT0gMSkKLQkJcEJ0Q29leC0+VG90YWxBbnROdW0gPSBBbnRfeDE7Ci0JZWxzZSBpZiAoYW50TnVtID09IDIpCi0JCXBCdENvZXgtPlRvdGFsQW50TnVtID0gQW50X3gyOwotfQotCi12b2lkIHJ0bDg3MjNhX0JUX2xwc19sZWF2ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iTWFudWFsQ29udHJvbCkKLQkJcmV0dXJuOwotCi0JaWYgKGJ0ZG1fQnRXaWZpQW50TnVtKHBhZGFwdGVyKSA9PSBBbnRfeDEpCi0JCUJURE1fMUFudExwc0xlYXZlKHBhZGFwdGVyKTsKLX0KLQotc3RhdGljIHZvaWQgQlRETV9Gb3JIYWx0ODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQotCWlmIChwQnRNZ250LT5FeHRDb25maWcuYk1hbnVhbENvbnRyb2wpCi0JCXJldHVybjsKLQotCWlmIChidGRtX0J0V2lmaUFudE51bShwYWRhcHRlcikgPT0gQW50X3gxKQotCQlCVERNXzFBbnRGb3JIYWx0KHBhZGFwdGVyKTsKLX0KLQotc3RhdGljIHZvaWQgQlRETV9XaWZpU2Nhbk5vdGlmeTg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHNjYW5UeXBlKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iTWFudWFsQ29udHJvbCkKLQkJcmV0dXJuOwotCi0JaWYgKGJ0ZG1fQnRXaWZpQW50TnVtKHBhZGFwdGVyKSA9PSBBbnRfeDEpCi0JCUJURE1fMUFudFdpZmlTY2FuTm90aWZ5KHBhZGFwdGVyLCBzY2FuVHlwZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1CVERNX1dpZmlBc3NvY2lhdGVOb3RpZnk4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBhY3Rpb24pCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLmJNYW51YWxDb250cm9sKQotCQlyZXR1cm47Ci0KLQlpZiAoYnRkbV9CdFdpZmlBbnROdW0ocGFkYXB0ZXIpID09IEFudF94MSkKLQkJQlRETV8xQW50V2lmaUFzc29jaWF0ZU5vdGlmeShwYWRhcHRlciwgYWN0aW9uKTsKLX0KLQotc3RhdGljIHZvaWQKLUJURE1fTWVkaWFTdGF0dXNOb3RpZnk4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgIGVudW0gcnRfbWVkaWFfc3RhdHVzIG1zdGF0dXMpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIE1lZGlhU3RhdHVzTm90aWZ5LCAlc1xuIiwKLQkJbXN0YXR1cz8iY29ubmVjdCI6ImRpc2Nvbm5lY3QiKSk7Ci0KLQlCVERNX1NldEZ3Q2hubEluZm8ocGFkYXB0ZXIsIG1zdGF0dXMpOwotCi0JaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iTWFudWFsQ29udHJvbCkKLQkJcmV0dXJuOwotCi0JaWYgKGJ0ZG1fQnRXaWZpQW50TnVtKHBhZGFwdGVyKSA9PSBBbnRfeDEpCi0JCUJURE1fMUFudE1lZGlhU3RhdHVzTm90aWZ5KHBhZGFwdGVyLCBtc3RhdHVzKTsKLX0KLQotc3RhdGljIHZvaWQgQlRETV9Gb3JEaGNwODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQotCWlmIChwQnRNZ250LT5FeHRDb25maWcuYk1hbnVhbENvbnRyb2wpCi0JCXJldHVybjsKLQotCWlmIChidGRtX0J0V2lmaUFudE51bShwYWRhcHRlcikgPT0gQW50X3gxKQotCQlCVERNXzFBbnRGb3JEaGNwKHBhZGFwdGVyKTsKLX0KLQotYm9vbCBydGw4NzIzYV9CVF91c2luZ19hbnRlbm5hXzEoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlpZiAoYnRkbV9CdFdpZmlBbnROdW0ocGFkYXB0ZXIpID09IEFudF94MSkKLQkJcmV0dXJuIHRydWU7Ci0JZWxzZQotCQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIEJURE1fQlRDb2V4aXN0ODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm87Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQ7Ci0Jc3RydWN0IGJ0X2NvZXhpc3RfODcyM2EgKnBCdENvZXg7Ci0KLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQlwQnRDb2V4ID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzOwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBiZWFjb24gUlNTSSA9IDB4JXgoJWQpXG4iLAotCQlwSGFsRGF0YS0+ZG1wcml2LkVudHJ5TWluVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIsCi0JCXBIYWxEYXRhLT5kbXByaXYuRW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQikpOwotCi0JYnRkbV9CdEh3Q291bnRlcnNNb25pdG9yKHBhZGFwdGVyKTsKLQlidGRtX0J0RW5hYmxlRGlzYWJsZUNoZWNrODcyM0EocGFkYXB0ZXIpOwotCi0JaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iTWFudWFsQ29udHJvbCkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiJXM6IEFjdGlvbiBNYW51YWwgY29udHJvbCEhXG4iLCBfX2Z1bmNfXykpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHBCdENvZXgtPmJDMmhCdEluZm9SZXFTZW50KSB7Ci0JCWlmICghcnRsODcyM2FfQlRfZW5hYmxlZChwYWRhcHRlcikpIHsKLQkJCXBCdENvZXgtPmMyaEJ0SW5mbyA9IEJUX0lORk9fU1RBVEVfRElTQUJMRUQ7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocEJ0Q29leC0+YzJoQnRJbmZvID09IEJUX0lORk9fU1RBVEVfRElTQUJMRUQpCi0JCQkJcEJ0Q29leC0+YzJoQnRJbmZvID0gQlRfSU5GT19TVEFURV9OT19DT05ORUNUSU9OOwotCQl9Ci0KLQkJYnRkbV9CVENvZXhpc3Q4NzIzQUhhbmRsZXIocGFkYXB0ZXIpOwotCX0gZWxzZSBpZiAoIXJ0bDg3MjNhX0JUX2VuYWJsZWQocGFkYXB0ZXIpKSB7Ci0JCXBCdENvZXgtPmMyaEJ0SW5mbyA9IEJUX0lORk9fU1RBVEVfRElTQUJMRUQ7Ci0JCWJ0ZG1fQlRDb2V4aXN0ODcyM0FIYW5kbGVyKHBhZGFwdGVyKTsKLQl9Ci0KLQlCVERNX1F1ZXJ5QnRJbmZvcm1hdGlvbihwYWRhcHRlcik7Ci19Ci0KLS8qICA9PT09PSBFbmQgb2Ygc3luYyBmcm9tIFNENyBkcml2ZXIgSEFML0JUQ29leGlzdC9IYWxCdGM4NzIzLmMgPT09PT0gKi8KLQotLyogID09PT09IEJlbG93IHRoaXMgbGluZSBpcyBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvQlRDb2V4aXN0L0hhbEJ0Y0NzcjFBbnQuYyA9PT09PSAqLwotCi0vKiAgbG9jYWwgZnVuY3Rpb24gc3RhcnQgd2l0aCBidGRtXyAqLwotLyogIGV4dGVybiBmdW5jdGlvbiBzdGFydCB3aXRoIEJURE1fICovCi0KLXN0YXRpYyB2b2lkIEJURE1fU2V0QW50ZW5uYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB3aG8pCi17Ci19Ci0KLXZvaWQKLUJURE1fU2luZ2xlQW50KAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JdTggYlNpbmdsZUFudE9uLAotCXU4IGJJbnRlcnJ1cHRPbiwKLQl1OCBiTXVsdGlOQVZPbgotCSkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQl1OCBIMkNfUGFyYW1ldGVyWzNdID0gezB9OwotCi0JaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkJUX0FudF9OdW0gIT0gQW50X3gxKQotCQlyZXR1cm47Ci0KLQlIMkNfUGFyYW1ldGVyWzJdID0gMDsKLQlIMkNfUGFyYW1ldGVyWzFdID0gMDsKLQlIMkNfUGFyYW1ldGVyWzBdID0gMDsKLQotCWlmIChiSW50ZXJydXB0T24pIHsKLQkJSDJDX1BhcmFtZXRlclsyXSB8PSAweDAyOwkvKiBCSVQxICovCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJGV0NvZXhpc3RBbGxPZmYgPSBmYWxzZTsKLQl9Ci0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkludGVycnVwdE9uID0gYkludGVycnVwdE9uOwotCi0JaWYgKGJTaW5nbGVBbnRPbikgewotCQlIMkNfUGFyYW1ldGVyWzJdIHw9IDB4MTA7CS8qIEJJVDQgKi8KLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkZXQ29leGlzdEFsbE9mZiA9IGZhbHNlOwotCX0KLQlwSGFsRGF0YS0+YnRfY29leGlzdC5iU2luZ2xlQW50T24gPSBiU2luZ2xlQW50T247Ci0KLQlpZiAoYk11bHRpTkFWT24pIHsKLQkJSDJDX1BhcmFtZXRlclsyXSB8PSAweDIwOwkvKiBCSVQ1ICovCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJGV0NvZXhpc3RBbGxPZmYgPSBmYWxzZTsKLQl9Ci0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuYk11bHRpTkFWT24gPSBiTXVsdGlOQVZPbjsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgU2luZ2xlQW50ZW5uYSA9WyVzOiVzOiVzXSwgd3JpdGUgMHhlID0gMHgleFxuIiwKLQkJYlNpbmdsZUFudE9uPyJPTiI6Ik9GRiIsIGJJbnRlcnJ1cHRPbj8iT04iOiJPRkYiLCBiTXVsdGlOQVZPbj8iT04iOiJPRkYiLAotCQlIMkNfUGFyYW1ldGVyWzBdPDwxNnxIMkNfUGFyYW1ldGVyWzFdPDw4fEgyQ19QYXJhbWV0ZXJbMl0pKTsKLX0KLQotdm9pZCBCVERNX0NoZWNrQlRJZGxlQ2hhbmdlMUFudChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotLypQTUdOVF9JTkZPCQlwTWdudEluZm8gPSAmcGFkYXB0ZXItPk1nbnRJbmZvOyAqLwotCXU4IAlzdGF0ZUNoYW5nZSA9IGZhbHNlOwotCXUzMgkJCUJUX1BvbGxpbmcsIFJhdGlvX0FjdCwgUmF0aW9fU1RBOwotCXUzMgkJCQlCVF9BY3RpdmUsIEJUX1N0YXRlOwotCXUzMgkJCQlyZWdCVEFjdGl2ZSA9IDAsIHJlZ0JUU3RhdGUgPSAwLCByZWdCVFBvbGxpbmcgPSAwOwotCi0JaWYgKCFydGw4NzIzYV9CVF9jb2V4aXN0KHBhZGFwdGVyKSkKLQkJcmV0dXJuOwotCWlmIChwQnRNZ250LT5FeHRDb25maWcuYk1hbnVhbENvbnRyb2wpCi0JCXJldHVybjsKLQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuQlRfQ29leGlzdFR5cGUgIT0gQlRfQ1NSX0JDOCkKLQkJcmV0dXJuOwotCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5CVF9BbnRfTnVtICE9IEFudF94MSkKLQkJcmV0dXJuOwotCi0JLyogIFRoZSBmb2xsb3dpbmcgd2Ugb25seSBjb25zaWRlciBDU1IgQkM4IGFuZCBmdyB2ZXJzaW9uIHNob3VsZCBiZSA+PSA2MiAqLwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgRmlybXdhcmVWZXJzaW9uID0gMHgleCglZClcbiIsCi0JcEhhbERhdGEtPkZpcm13YXJlVmVyc2lvbiwgcEhhbERhdGEtPkZpcm13YXJlVmVyc2lvbikpOwotCXJlZ0JUQWN0aXZlID0gUkVHX0JUX0FDVElWRTsKLQlyZWdCVFN0YXRlID0gUkVHX0JUX1NUQVRFOwotCWlmIChwSGFsRGF0YS0+RmlybXdhcmVWZXJzaW9uID49IEZXX1ZFUl9CVF9SRUcxKQotCQlyZWdCVFBvbGxpbmcgPSBSRUdfQlRfUE9MTElORzE7Ci0JZWxzZQotCQlyZWdCVFBvbGxpbmcgPSBSRUdfQlRfUE9MTElORzsKLQotCUJUX0FjdGl2ZSA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIHJlZ0JUQWN0aXZlKTsKLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIEJUX0FjdGl2ZSgweCV4KSA9JXhcbiIsIHJlZ0JUQWN0aXZlLCBCVF9BY3RpdmUpKTsKLQlCVF9BY3RpdmUgPSBCVF9BY3RpdmUgJiAweDAwZmZmZmZmOwotCi0JQlRfU3RhdGUgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCByZWdCVFN0YXRlKTsKLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIEJUX1N0YXRlKDB4JXgpID0leFxuIiwgcmVnQlRTdGF0ZSwgQlRfU3RhdGUpKTsKLQlCVF9TdGF0ZSA9IEJUX1N0YXRlICYgMHgwMGZmZmZmZjsKLQotCUJUX1BvbGxpbmcgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCByZWdCVFBvbGxpbmcpOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgQlRfUG9sbGluZygweCV4KSA9JXhcbiIsIHJlZ0JUUG9sbGluZywgQlRfUG9sbGluZykpOwotCi0JaWYgKEJUX0FjdGl2ZSA9PSAweGZmZmZmZmZmICYmIEJUX1N0YXRlID09IDB4ZmZmZmZmZmYgJiYgQlRfUG9sbGluZyA9PSAweGZmZmZmZmZmKQotCQlyZXR1cm47Ci0JaWYgKEJUX1BvbGxpbmcgPT0gMCkKLQkJcmV0dXJuOwotCi0JUmF0aW9fQWN0ID0gQlRfQWN0aXZlKjEwMDAvQlRfUG9sbGluZzsKLQlSYXRpb19TVEEgPSBCVF9TdGF0ZSoxMDAwL0JUX1BvbGxpbmc7Ci0KLQlwSGFsRGF0YS0+YnRfY29leGlzdC5SYXRpb19UeCA9IFJhdGlvX0FjdDsKLQlwSGFsRGF0YS0+YnRfY29leGlzdC5SYXRpb19QUkkgPSBSYXRpb19TVEE7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJhdGlvX0FjdCA9JWRcbiIsIFJhdGlvX0FjdCkpOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUmF0aW9fU1RBID0lZFxuIiwgUmF0aW9fU1RBKSk7Ci0KLQlpZiAoUmF0aW9fU1RBIDwgNjAgJiYgUmF0aW9fQWN0IDwgNTAwKSB7CS8qICBCVCBQQU4gaWRsZSAqLwotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9CVF9QQU5fSURMRTsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX0JUX1BBTl9ET1dOTElOSzsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX0JUX1BBTl9VUExJTks7Ci0JfSBlbHNlIHsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX0JUX1BBTl9JRExFOwotCi0JCWlmIChSYXRpb19TVEEpIHsKLQkJCS8qICBDaGVjayBpZiBCVCBQQU4gKHVuZGVyIEJUIDIuMSkgaXMgdXBsaW5rIG9yIGRvd25saW5rICovCi0JCQlpZiAoKFJhdGlvX0FjdC9SYXRpb19TVEEpIDwgMikgewotCQkJCS8qICBCVCBQQU4gVXBsaW5rICovCi0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQlQyMVRyYWZmaWNTdGF0aXN0aWNzLmJUeEJ1c3lUcmFmZmljID0gdHJ1ZTsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9CVF9QQU5fVVBMSU5LOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkJUMjFUcmFmZmljU3RhdGlzdGljcy5iUnhCdXN5VHJhZmZpYyA9IGZhbHNlOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9CVF9QQU5fRE9XTkxJTks7Ci0JCQl9IGVsc2UgewotCQkJCS8qICBCVCBQQU4gZG93bmxpbmsgKi8KLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5CVDIxVHJhZmZpY1N0YXRpc3RpY3MuYlR4QnVzeVRyYWZmaWMgPSBmYWxzZTsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfQlRfUEFOX1VQTElOSzsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5CVDIxVHJhZmZpY1N0YXRpc3RpY3MuYlJ4QnVzeVRyYWZmaWMgPSB0cnVlOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX0JUX1BBTl9ET1dOTElOSzsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qICBCVCBQQU4gZG93bmxpbmsgKi8KLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkJUMjFUcmFmZmljU3RhdGlzdGljcy5iVHhCdXN5VHJhZmZpYyA9IGZhbHNlOwotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX0JUX1BBTl9VUExJTks7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5CVDIxVHJhZmZpY1N0YXRpc3RpY3MuYlJ4QnVzeVRyYWZmaWMgPSB0cnVlOwotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfQlRfUEFOX0RPV05MSU5LOwotCQl9Ci0JfQotCi0JLyogIENoZWNrIEJUIGlzIGlkbGUgb3Igbm90ICovCi0JaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSA9PSAwICYmCi0JICAgIHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZlNDTyA9PSAwKSB7Ci0JCXBCdE1nbnQtPkV4dENvbmZpZy5iQlRCdXN5ID0gZmFsc2U7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX0JUX0lETEU7Ci0JfSBlbHNlIHsKLQkJaWYgKFJhdGlvX1NUQSA8IDYwKSB7Ci0JCQlwQnRNZ250LT5FeHRDb25maWcuYkJUQnVzeSA9IGZhbHNlOwotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfQlRfSURMRTsKLQkJfSBlbHNlIHsKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5iQlRCdXN5ID0gdHJ1ZTsKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9CVF9JRExFOwotCQl9Ci0JfQotCi0JaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSA9PSAwICYmCi0JICAgIHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZlNDTyA9PSAwKSB7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9CVF9SU1NJX0xPVzsKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLk1JTl9CVF9SU1NJID0gMDsKLQkJQlRETV9TZXRBbnRlbm5hKHBhZGFwdGVyLCBCVERNX0FOVF9CVF9JRExFKTsKLQl9IGVsc2UgewotCQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLk1JTl9CVF9SU1NJIDw9IC01KSB7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9CVF9SU1NJX0xPVzsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgY29yZSBzdGFjayBub3RpZnkgYnQgcnNzaSBMb3dcbiIpKTsKLQkJfSBlbHNlIHsKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9CVF9SU1NJX0xPVzsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgY29yZSBzdGFjayBub3RpZnkgYnQgcnNzaSBOb3JtYWxcbiIpKTsKLQkJfQotCX0KLQotCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5iQlRCdXN5VHJhZmZpYyAhPSBwQnRNZ250LT5FeHRDb25maWcuYkJUQnVzeSkgewotCQkvKiAgQlQgaWRsZSBvciBCVCBub24taWRsZSAqLwotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5iQlRCdXN5VHJhZmZpYyA9IHBCdE1nbnQtPkV4dENvbmZpZy5iQlRCdXN5OwotCQlzdGF0ZUNoYW5nZSA9IHRydWU7Ci0JfQotCi0JaWYgKHN0YXRlQ2hhbmdlKSB7Ci0JCWlmICghcEJ0TWdudC0+RXh0Q29uZmlnLmJCVEJ1c3kpCi0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIEJUIGlzIGlkbGUgb3IgZGlzYWJsZVxuIikpOwotCQllbHNlCi0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIEJUIGlzIG5vbi1pZGxlXG4iKSk7Ci0JfQotCWlmICghcEJ0TWdudC0+RXh0Q29uZmlnLmJCVEJ1c3kpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBCVCBpcyBpZGxlIG9yIGRpc2FibGVcbiIpKTsKLQkJaWYgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9VTkRFUl9MSU5LSU5HfFdJRklfU0lURV9NT05JVE9SKSA9PSB0cnVlKQotCQkJQlRETV9TZXRBbnRlbm5hKHBhZGFwdGVyLCBCVERNX0FOVF9XSUZJKTsKLQl9Ci19Ci0KLS8qICA9PT09PSBFbmQgb2Ygc3luYyBmcm9tIFNENyBkcml2ZXIgSEFML0JUQ29leGlzdC9IYWxCdGNDc3IxQW50LmMgPT09PT0gKi8KLQotLyogID09PT09IEJlbG93IHRoaXMgbGluZSBpcyBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvQlRDb2V4aXN0L0hhbEJ0Y0NzcjJBbnQuYyA9PT09PSAqLwotCi0vKiAgbG9jYWwgZnVuY3Rpb24gc3RhcnQgd2l0aCBidGRtXyAqLwotCi0vKiAgTm90ZTogKi8KLS8qICBJbiB0aGUgZm9sbG93aW5nLCBGVyBzaG91bGQgYmUgZG9uZSBiZWZvcmUgU1cgbWVjaGFuaXNtLiAqLwotLyogIEJURE1fQmFsYW5jZSgpLCBCVERNX0RpbWluaXNoV2lGaSgpLCBCVF9OQVYoKSBzaG91bGQgYmUgZG9uZSAqLwotLyogIGJlZm9yZSBCVERNX0FHQ1RhYmxlKCksIEJURE1fQkJCYWNrT2ZmTGV2ZWwoKSwgYnRkbV9EYWNTd2luZygpLiAqLwotCi0vKiAgZXh0ZXJuIGZ1bmN0aW9uIHN0YXJ0IHdpdGggQlRETV8gKi8KLQotdm9pZAotQlRETV9EaW1pbmlzaFdpRmkoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQl1OCBiREFDT24sCi0JdTggYkludGVycnVwdE9uLAotCXU4IERBQ1N3aW5nTGV2ZWwsCi0JdTggYk5BVk9uCi0JKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXU4IEgyQ19QYXJhbWV0ZXJbM10gPSB7MH07Ci0KLQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuQlRfQW50X051bSAhPSBBbnRfeDIpCi0JCXJldHVybjsKLQotCWlmICgocEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICYgQlRfQ09FWF9TVEFURV9CVF9SU1NJX0xPVykgJiYKLQkgICAgKERBQ1N3aW5nTGV2ZWwgPT0gMHgyMCkpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVF1EaW1pbmlzaFdpRmkgMHgyMCBvcmlnaW5hbCwgYnV0IHNldCAweDE4IGZvciBMb3cgUlNTSSFcbiIpKTsKLQkJREFDU3dpbmdMZXZlbCA9IDB4MTg7Ci0JfQotCi0JSDJDX1BhcmFtZXRlclsyXSA9IDA7Ci0JSDJDX1BhcmFtZXRlclsxXSA9IERBQ1N3aW5nTGV2ZWw7Ci0JSDJDX1BhcmFtZXRlclswXSA9IDA7Ci0JaWYgKGJEQUNPbikgewotCQlIMkNfUGFyYW1ldGVyWzJdIHw9IDB4MDE7CS8qIEJJVDAgKi8KLQkJaWYgKGJJbnRlcnJ1cHRPbikKLQkJCUgyQ19QYXJhbWV0ZXJbMl0gfD0gMHgwMjsJLyogQklUMSAqLwotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5iRldDb2V4aXN0QWxsT2ZmID0gZmFsc2U7Ci0JfQotCWlmIChiTkFWT24pIHsKLQkJSDJDX1BhcmFtZXRlclsyXSB8PSAweDA4OwkvKiBCSVQzICovCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJGV0NvZXhpc3RBbGxPZmYgPSBmYWxzZTsKLQl9Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIGJEQUNPbiA9ICVzLCBiSW50ZXJydXB0T24gPSAlcywgd3JpdGUgMHhlID0gMHgleFxuIiwKLQkJYkRBQ09uPyJPTiI6Ik9GRiIsIGJJbnRlcnJ1cHRPbj8iT04iOiJPRkYiLAotCQlIMkNfUGFyYW1ldGVyWzBdPDwxNnxIMkNfUGFyYW1ldGVyWzFdPDw4fEgyQ19QYXJhbWV0ZXJbMl0pKTsKLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIGJOQVZPbiA9ICVzXG4iLAotCQliTkFWT24/Ik9OIjoiT0ZGIikpOwotfQotCi0vKiAgPT09PT0gRW5kIG9mIHN5bmMgZnJvbSBTRDcgZHJpdmVyIEhBTC9CVENvZXhpc3QvSGFsQnRjQ3NyMkFudC5jID09PT09ICovCi0KLS8qICA9PT09PSBCZWxvdyB0aGlzIGxpbmUgaXMgc3luYyBmcm9tIFNENyBkcml2ZXIgSEFML0JUQ29leGlzdC9IYWxCdENvZXhpc3QuYyA9PT09PSAqLwotCi0vKiAgbG9jYWwgZnVuY3Rpb24gKi8KLXN0YXRpYyB2b2lkIGJ0ZG1fUmVzZXRGV0NvZXhTdGF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlID0gMDsKLQlwSGFsRGF0YS0+YnRfY29leGlzdC5QcmV2aW91c1N0YXRlID0gMDsKLX0KLQotc3RhdGljIHZvaWQgYnRkbV9Jbml0QnRDb2V4aXN0RE0oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCS8qICAyMDEwMDQxNSBKb3NlcGg6IFJlc3RvcmUgUkYgcmVnaXN0ZXIgMHgxRSBhbmQgMHgxRiB2YWx1ZSBmb3IgZnVydGhlciB1c2FnZS4gKi8KLQlwSGFsRGF0YS0+YnRfY29leGlzdC5CdFJmUmVnT3JpZ2luMUUgPSBQSFlfUXVlcnlSRlJlZyhwYWRhcHRlciwgUGF0aEEsIFJGX1JDSzEsIGJSRlJlZ09mZnNldE1hc2spOwotCXBIYWxEYXRhLT5idF9jb2V4aXN0LkJ0UmZSZWdPcmlnaW4xRiA9IFBIWV9RdWVyeVJGUmVnKHBhZGFwdGVyLCBQYXRoQSwgUkZfUkNLMiwgMHhmMCk7Ci0KLQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgPSAwOwotCXBIYWxEYXRhLT5idF9jb2V4aXN0LlByZXZpb3VzU3RhdGUgPSAwOwotCi0JQlRETV84NzIzQUluaXQocGFkYXB0ZXIpOwotCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJJbml0bGl6ZWQgPSB0cnVlOwotfQotCi0vKiAgKi8KLS8qICBleHRlcm4gZnVuY3Rpb24gKi8KLS8qICAqLwotdm9pZCBCVERNX0NoZWNrQW50U2VsTW9kZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotfQotCi12b2lkIEJURE1fRndDMmhCdFJzc2koc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnRtcEJ1ZikKLXsKLQlCVERNX0Z3QzJoQnRSc3NpODcyM0EocGFkYXB0ZXIsIHRtcEJ1Zik7Ci19Ci0KLXZvaWQgQlRETV9EaXNwbGF5QnRDb2V4SW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCUJURE1fRGlzcGxheTg3MjNBQnRDb2V4SW5mbyhwYWRhcHRlcik7Ci19Ci0KLXZvaWQgQlRETV9SZWplY3RBUEFnZ3JlZ2F0ZWRQYWNrZXQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYlJlamVjdCkKLXsKLX0KLQotdTggQlRETV9Jc0hUNDAoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1OCBpc2h0NDAgPSB0cnVlOwotCWVudW0gaHRfY2hhbm5lbF93aWR0aCBidzsKLQotCWJ3ID0gcGFkYXB0ZXItPm1sbWVleHRwcml2LmN1cl9id21vZGU7Ci0KLQlpZiAoYncgPT0gSFRfQ0hBTk5FTF9XSURUSF8yMCkKLQkJaXNodDQwID0gZmFsc2U7Ci0JZWxzZSBpZiAoYncgPT0gSFRfQ0hBTk5FTF9XSURUSF80MCkKLQkJaXNodDQwID0gdHJ1ZTsKLQotCXJldHVybiBpc2h0NDA7Ci19Ci0KLXU4IEJURE1fTGVnYWN5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0OwotCXU4IGlzTGVnYWN5ID0gZmFsc2U7Ci0KLQlwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0JaWYgKChwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgPT0gV0lSRUxFU1NfMTFCKSB8fAotCQkocG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlID09IFdJUkVMRVNTXzExRykgfHwKLQkJKHBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSA9PSBXSVJFTEVTU18xMUJHKSkKLQkJaXNMZWdhY3kgPSB0cnVlOwotCi0JcmV0dXJuIGlzTGVnYWN5OwotfQotCi12b2lkIEJURE1fQ2hlY2tXaUZpU3RhdGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdjsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250OwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0JcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQotCWlmIChwbWxtZXByaXYtPkxpbmtEZXRlY3RJbmZvLmJCdXN5VHJhZmZpYykgewotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9JRExFOwotCi0JCWlmIChwbWxtZXByaXYtPkxpbmtEZXRlY3RJbmZvLmJUeEJ1c3lUcmFmZmljKQotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9VUExJTks7Ci0JCWVsc2UKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1VQTElOSzsKLQotCQlpZiAocG1sbWVwcml2LT5MaW5rRGV0ZWN0SW5mby5iUnhCdXN5VHJhZmZpYykKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1dJRklfRE9XTkxJTks7Ci0JCWVsc2UKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX0RPV05MSU5LOwotCX0gZWxzZSB7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1dJRklfSURMRTsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfVVBMSU5LOwotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9ET1dOTElOSzsKLQl9Ci0KLQlpZiAoQlRETV9MZWdhY3kocGFkYXB0ZXIpKSB7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1dJRklfTEVHQUNZOwotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9IVDIwOwotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9IVDQwOwotCX0gZWxzZSB7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX0xFR0FDWTsKLQkJaWYgKEJURE1fSXNIVDQwKHBhZGFwdGVyKSkgewotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9IVDQwOwotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfSFQyMDsKLQkJfSBlbHNlIHsKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1dJRklfSFQyMDsKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX0hUNDA7Ci0JCX0KLQl9Ci0KLQlpZiAocEJ0TWdudC0+QnRPcGVyYXRpb25PbikKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfQlQzMDsKLQllbHNlCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9CVDMwOwotfQotCi1zMzIgQlRETV9HZXRSeFNTKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0vKlBNR05UX0lORk8JCXBNZ250SW5mbyA9ICZwYWRhcHRlci0+TWdudEluZm87ICovCi0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2OwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0JczMyCQkJVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPSAwOwotCi0JcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKSB7Ci0JCVVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID0gR0VUX1VOREVDT1JBVEVEX0FWRVJBR0VfUlNTSShwYWRhcHRlcik7Ci0JfSBlbHNlIHsgLyogIGFzc29jaWF0ZWQgZW50cnkgcHdkYiAqLwotCQlVbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IHBIYWxEYXRhLT5kbXByaXYuRW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQjsKLQkJLyogcEhhbERhdGEtPkJUX0VudHJ5TWluVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgKi8KLQl9Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkJURE1fR2V0UnhTUygpID0gJWRcbiIsIFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCKSk7Ci0JcmV0dXJuIFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOwotfQotCi1zdGF0aWMgczMyIEJURE1fR2V0UnhCZWFjb25TUyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotLypQTUdOVF9JTkZPCQlwTWdudEluZm8gPSAmcGFkYXB0ZXItPk1nbnRJbmZvOyAqLwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdjsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXMzMgkJCXB3ZGJCZWFjb24gPSAwOwotCi0JcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKSB7Ci0JCS8qIHB3ZGJCZWFjb24gPSBwSGFsRGF0YS0+ZG1wcml2LlVuZGVjb3JhdGVkU21vb3RoZWRCZWFjb247ICovCi0JCXB3ZGJCZWFjb24gPSBwSGFsRGF0YS0+ZG1wcml2LkVudHJ5TWluVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7Ci0JfQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJCVERNX0dldFJ4QmVhY29uU1MoKSA9ICVkXG4iLCBwd2RiQmVhY29uKSk7Ci0JcmV0dXJuIHB3ZGJCZWFjb247Ci19Ci0KLS8qICBHZXQgYmVhY29uIHJzc2kgc3RhdGUgKi8KLXU4IEJURE1fQ2hlY2tDb2V4QmNuUnNzaVN0YXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGxldmVsTnVtLAotCQkJICAgICAgdTggUnNzaVRocmVzaCwgdTggUnNzaVRocmVzaDEpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JczMyIHB3ZGJCZWFjb24gPSAwOwotCXU4IGJjblJzc2lTdGF0ZSA9IDA7Ci0KLQlwd2RiQmVhY29uID0gQlRETV9HZXRSeEJlYWNvblNTKHBhZGFwdGVyKTsKLQotCWlmIChsZXZlbE51bSA9PSAyKSB7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfQkVBQ09OX01FRElVTTsKLQotCQlpZiAoKHBIYWxEYXRhLT5idF9jb2V4aXN0LnByZVJzc2lTdGF0ZUJlYWNvbiA9PSBCVF9SU1NJX1NUQVRFX0xPVykgfHwKLQkJICAgIChwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGVCZWFjb24gPT0gQlRfUlNTSV9TVEFURV9TVEFZX0xPVykpIHsKLQkJCWlmIChwd2RiQmVhY29uID49IChSc3NpVGhyZXNoK0JUX0ZXX0NPRVhfVEhSRVNIX1RPTCkpIHsKLQkJCQliY25Sc3NpU3RhdGUgPSBCVF9SU1NJX1NUQVRFX0hJR0g7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0JFQUNPTl9ISUdIOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfQkVBQ09OX0xPVzsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfQkVBQ09OIHN0YXRlIHN3aXRjaCB0byBIaWdoXG4iKSk7Ci0JCQl9IGVsc2UgewotCQkJCWJjblJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfU1RBWV9MT1c7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJX0JFQUNPTiBzdGF0ZSBzdGF5IGF0IExvd1xuIikpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHB3ZGJCZWFjb24gPCBSc3NpVGhyZXNoKSB7Ci0JCQkJYmNuUnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9MT1c7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0JFQUNPTl9MT1c7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9CRUFDT05fSElHSDsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfQkVBQ09OIHN0YXRlIHN3aXRjaCB0byBMb3dcbiIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYmNuUnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0g7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJX0JFQUNPTiBzdGF0ZSBzdGF5IGF0IEhpZ2hcbiIpKTsKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAobGV2ZWxOdW0gPT0gMykgewotCQlpZiAoUnNzaVRocmVzaCA+IFJzc2lUaHJlc2gxKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfQkVBQ09OIHRocmVzaCBlcnJvciEhXG4iKSk7Ci0JCQlyZXR1cm4gcEhhbERhdGEtPmJ0X2NvZXhpc3QucHJlUnNzaVN0YXRlQmVhY29uOwotCQl9Ci0KLQkJaWYgKChwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGVCZWFjb24gPT0gQlRfUlNTSV9TVEFURV9MT1cpIHx8Ci0JCSAgICAocEhhbERhdGEtPmJ0X2NvZXhpc3QucHJlUnNzaVN0YXRlQmVhY29uID09IEJUX1JTU0lfU1RBVEVfU1RBWV9MT1cpKSB7Ci0JCQlpZiAocHdkYkJlYWNvbiA+PSAoUnNzaVRocmVzaCtCVF9GV19DT0VYX1RIUkVTSF9UT0wpKSB7Ci0JCQkJYmNuUnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9NRURJVU07Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0JFQUNPTl9NRURJVU07Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9CRUFDT05fTE9XOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfQkVBQ09OX0hJR0g7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJX0JFQUNPTiBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKSk7Ci0JCQl9IGVsc2UgewotCQkJCWJjblJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfU1RBWV9MT1c7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJX0JFQUNPTiBzdGF0ZSBzdGF5IGF0IExvd1xuIikpOwotCQkJfQotCQl9IGVsc2UgaWYgKChwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGVCZWFjb24gPT0gQlRfUlNTSV9TVEFURV9NRURJVU0pIHx8Ci0JCQkgICAocEhhbERhdGEtPmJ0X2NvZXhpc3QucHJlUnNzaVN0YXRlQmVhY29uID09IEJUX1JTU0lfU1RBVEVfU1RBWV9NRURJVU0pKSB7Ci0JCQlpZiAocHdkYkJlYWNvbiA+PSAoUnNzaVRocmVzaDErQlRfRldfQ09FWF9USFJFU0hfVE9MKSkgewotCQkJCWJjblJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfSElHSDsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfQkVBQ09OX0hJR0g7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9CRUFDT05fTE9XOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfQkVBQ09OX01FRElVTTsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfQkVBQ09OIHN0YXRlIHN3aXRjaCB0byBIaWdoXG4iKSk7Ci0JCQl9IGVsc2UgaWYgKHB3ZGJCZWFjb24gPCBSc3NpVGhyZXNoKSB7Ci0JCQkJYmNuUnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9MT1c7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0JFQUNPTl9MT1c7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9CRUFDT05fSElHSDsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0JFQUNPTl9NRURJVU07Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJX0JFQUNPTiBzdGF0ZSBzd2l0Y2ggdG8gTG93XG4iKSk7Ci0JCQl9IGVsc2UgewotCQkJCWJjblJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfU1RBWV9NRURJVU07Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJX0JFQUNPTiBzdGF0ZSBzdGF5IGF0IE1lZGl1bVxuIikpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHB3ZGJCZWFjb24gPCBSc3NpVGhyZXNoMSkgewotCQkJCWJjblJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfTUVESVVNOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9CRUFDT05fTUVESVVNOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfQkVBQ09OX0hJR0g7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9CRUFDT05fTE9XOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSV9CRUFDT04gc3RhdGUgc3dpdGNoIHRvIE1lZGl1bVxuIikpOwotCQkJfSBlbHNlIHsKLQkJCQliY25Sc3NpU3RhdGUgPSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSDsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfQkVBQ09OIHN0YXRlIHN0YXkgYXQgSGlnaFxuIikpOwotCQkJfQotCQl9Ci0JfQotCi0JcEhhbERhdGEtPmJ0X2NvZXhpc3QucHJlUnNzaVN0YXRlQmVhY29uID0gYmNuUnNzaVN0YXRlOwotCi0JcmV0dXJuIGJjblJzc2lTdGF0ZTsKLX0KLQotdTggQlRETV9DaGVja0NvZXhSU1NJU3RhdGUxKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGxldmVsTnVtLAotCQkJICAgIHU4IFJzc2lUaHJlc2gsIHU4IFJzc2lUaHJlc2gxKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXMzMiBVbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IDA7Ci0JdTggYnRSc3NpU3RhdGUgPSAwOwotCi0JVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPSBCVERNX0dldFJ4U1MocGFkYXB0ZXIpOwotCi0JaWYgKGxldmVsTnVtID09IDIpIHsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV8xX01FRElVTTsKLQotCQlpZiAoKHBIYWxEYXRhLT5idF9jb2V4aXN0LnByZVJzc2lTdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9MT1cpIHx8Ci0JCSAgICAocEhhbERhdGEtPmJ0X2NvZXhpc3QucHJlUnNzaVN0YXRlMSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfTE9XKSkgewotCQkJaWYgKFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID49IChSc3NpVGhyZXNoK0JUX0ZXX0NPRVhfVEhSRVNIX1RPTCkpIHsKLQkJCQlidFJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfSElHSDsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9ISUdIOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9MT1c7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJXzEgc3RhdGUgc3dpdGNoIHRvIEhpZ2hcbiIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnRSc3NpU3RhdGUgPSBCVF9SU1NJX1NUQVRFX1NUQVlfTE9XOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSV8xIHN0YXRlIHN0YXkgYXQgTG93XG4iKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPCBSc3NpVGhyZXNoKSB7Ci0JCQkJYnRSc3NpU3RhdGUgPSBCVF9SU1NJX1NUQVRFX0xPVzsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9MT1c7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV8xX0hJR0g7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJXzEgc3RhdGUgc3dpdGNoIHRvIExvd1xuIikpOwotCQkJfSBlbHNlIHsKLQkJCQlidFJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSV8xIHN0YXRlIHN0YXkgYXQgSGlnaFxuIikpOwotCQkJfQotCQl9Ci0JfSBlbHNlIGlmIChsZXZlbE51bSA9PSAzKSB7Ci0JCWlmIChSc3NpVGhyZXNoID4gUnNzaVRocmVzaDEpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSV8xIHRocmVzaCBlcnJvciEhXG4iKSk7Ci0JCQlyZXR1cm4gcEhhbERhdGEtPmJ0X2NvZXhpc3QucHJlUnNzaVN0YXRlMTsKLQkJfQotCi0JCWlmICgocEhhbERhdGEtPmJ0X2NvZXhpc3QucHJlUnNzaVN0YXRlMSA9PSBCVF9SU1NJX1NUQVRFX0xPVykgfHwKLQkJICAgIChwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGUxID09IEJUX1JTU0lfU1RBVEVfU1RBWV9MT1cpKSB7Ci0JCQlpZiAoVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPj0gKFJzc2lUaHJlc2grQlRfRldfQ09FWF9USFJFU0hfVE9MKSkgewotCQkJCWJ0UnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9NRURJVU07Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJXzFfTUVESVVNOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9MT1c7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV8xX0hJR0g7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJXzEgc3RhdGUgc3dpdGNoIHRvIE1lZGl1bVxuIikpOwotCQkJfSBlbHNlIHsKLQkJCQlidFJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfU1RBWV9MT1c7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJXzEgc3RhdGUgc3RheSBhdCBMb3dcbiIpKTsKLQkJCX0KLQkJfSBlbHNlIGlmICgocEhhbERhdGEtPmJ0X2NvZXhpc3QucHJlUnNzaVN0YXRlMSA9PSBCVF9SU1NJX1NUQVRFX01FRElVTSkgfHwKLQkJCSAgIChwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGUxID09IEJUX1JTU0lfU1RBVEVfU1RBWV9NRURJVU0pKSB7Ci0JCQlpZiAoVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPj0gKFJzc2lUaHJlc2gxK0JUX0ZXX0NPRVhfVEhSRVNIX1RPTCkpIHsKLQkJCQlidFJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfSElHSDsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9ISUdIOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9MT1c7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV8xX01FRElVTTsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfMSBzdGF0ZSBzd2l0Y2ggdG8gSGlnaFxuIikpOwotCQkJfSBlbHNlIGlmIChVbmRlY29yYXRlZFNtb290aGVkUFdEQiA8IFJzc2lUaHJlc2gpIHsKLQkJCQlidFJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfTE9XOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV8xX0xPVzsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJXzFfSElHSDsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJXzFfTUVESVVNOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSV8xIHN0YXRlIHN3aXRjaCB0byBMb3dcbiIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnRSc3NpU3RhdGUgPSBCVF9SU1NJX1NUQVRFX1NUQVlfTUVESVVNOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSV8xIHN0YXRlIHN0YXkgYXQgTWVkaXVtXG4iKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPCBSc3NpVGhyZXNoMSkgewotCQkJCWJ0UnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9NRURJVU07Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJXzFfTUVESVVNOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9ISUdIOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9MT1c7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJXzEgc3RhdGUgc3dpdGNoIHRvIE1lZGl1bVxuIikpOwotCQkJfSBlbHNlIHsKLQkJCQlidFJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSV8xIHN0YXRlIHN0YXkgYXQgSGlnaFxuIikpOwotCQkJfQotCQl9Ci0JfQotCi0JcEhhbERhdGEtPmJ0X2NvZXhpc3QucHJlUnNzaVN0YXRlMSA9IGJ0UnNzaVN0YXRlOwotCi0JcmV0dXJuIGJ0UnNzaVN0YXRlOwotfQotCi11OCBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBsZXZlbE51bSwKLQkJCSAgIHU4IFJzc2lUaHJlc2gsIHU4IFJzc2lUaHJlc2gxKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXMzMiBVbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IDA7Ci0JdTggYnRSc3NpU3RhdGUgPSAwOwotCi0JVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPSBCVERNX0dldFJ4U1MocGFkYXB0ZXIpOwotCi0JaWYgKGxldmVsTnVtID09IDIpIHsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9NRURJVU07Ci0KLQkJaWYgKChwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9MT1cpIHx8Ci0JCSAgICAocEhhbERhdGEtPmJ0X2NvZXhpc3QucHJlUnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfU1RBWV9MT1cpKSB7Ci0JCQlpZiAoVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPj0gKFJzc2lUaHJlc2grQlRfRldfQ09FWF9USFJFU0hfVE9MKSkgewotCQkJCWJ0UnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9ISUdIOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9ISUdIOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfTE9XOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gSGlnaFxuIikpOwotCQkJfSBlbHNlIHsKLQkJCQlidFJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfU1RBWV9MT1c7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJIHN0YXRlIHN0YXkgYXQgTG93XG4iKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPCBSc3NpVGhyZXNoKSB7Ci0JCQkJYnRSc3NpU3RhdGUgPSBCVF9SU1NJX1NUQVRFX0xPVzsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfTE9XOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfSElHSDsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0kgc3RhdGUgc3dpdGNoIHRvIExvd1xuIikpOwotCQkJfSBlbHNlIHsKLQkJCQlidFJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSSBzdGF0ZSBzdGF5IGF0IEhpZ2hcbiIpKTsKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAobGV2ZWxOdW0gPT0gMykgewotCQlpZiAoUnNzaVRocmVzaCA+IFJzc2lUaHJlc2gxKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0kgdGhyZXNoIGVycm9yISFcbiIpKTsKLQkJCXJldHVybiBwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGU7Ci0JCX0KLQotCQlpZiAoKHBIYWxEYXRhLT5idF9jb2V4aXN0LnByZVJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX0xPVykgfHwKLQkJICAgIChwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0xPVykpIHsKLQkJCWlmIChVbmRlY29yYXRlZFNtb290aGVkUFdEQiA+PSAoUnNzaVRocmVzaCtCVF9GV19DT0VYX1RIUkVTSF9UT0wpKSB7Ci0JCQkJYnRSc3NpU3RhdGUgPSBCVF9SU1NJX1NUQVRFX01FRElVTTsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfTUVESVVNOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfTE9XOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfSElHSDsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0kgc3RhdGUgc3dpdGNoIHRvIE1lZGl1bVxuIikpOwotCQkJfSBlbHNlIHsKLQkJCQlidFJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfU1RBWV9MT1c7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJIHN0YXRlIHN0YXkgYXQgTG93XG4iKSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoKHBIYWxEYXRhLT5idF9jb2V4aXN0LnByZVJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX01FRElVTSkgfHwKLQkJCSAgIChwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9TVEFZX01FRElVTSkpIHsKLQkJCWlmIChVbmRlY29yYXRlZFNtb290aGVkUFdEQiA+PSAoUnNzaVRocmVzaDErQlRfRldfQ09FWF9USFJFU0hfVE9MKSkgewotCQkJCWJ0UnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9ISUdIOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9ISUdIOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfTE9XOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfTUVESVVNOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gSGlnaFxuIikpOwotCQkJfSBlbHNlIGlmIChVbmRlY29yYXRlZFNtb290aGVkUFdEQiA8IFJzc2lUaHJlc2gpIHsKLQkJCQlidFJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfTE9XOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9MT1c7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9ISUdIOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfTUVESVVNOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gTG93XG4iKSk7Ci0JCQl9IGVsc2UgewotCQkJCWJ0UnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX01FRElVTTsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0kgc3RhdGUgc3RheSBhdCBNZWRpdW1cbiIpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChVbmRlY29yYXRlZFNtb290aGVkUFdEQiA8IFJzc2lUaHJlc2gxKSB7Ci0JCQkJYnRSc3NpU3RhdGUgPSBCVF9SU1NJX1NUQVRFX01FRElVTTsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfTUVESVVNOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfSElHSDsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0xPVzsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0kgc3RhdGUgc3dpdGNoIHRvIE1lZGl1bVxuIikpOwotCQkJfSBlbHNlIHsKLQkJCQlidFJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSSBzdGF0ZSBzdGF5IGF0IEhpZ2hcbiIpKTsKLQkJCX0KLQkJfQotCX0KLQotCXBIYWxEYXRhLT5idF9jb2V4aXN0LnByZVJzc2lTdGF0ZSA9IGJ0UnNzaVN0YXRlOwotCi0JcmV0dXJuIGJ0UnNzaVN0YXRlOwotfQotCi1ib29sIHJ0bDg3MjNhX0JUX2Rpc2FibGVfRURDQV90dXJibyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250OwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0JdTggYkJ0Q2hhbmdlRURDQSA9IGZhbHNlOwotCXUzMiBFRENBX0JUX0JFID0gMHg1ZWE0MmIsIGN1cl9FRENBX3JlZzsKLQlib29sIGJSZXQgPSBmYWxzZTsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlwQnRNZ250ID0gJnBIYWxEYXRhLT5CdEluZm8uQnRNZ250OwotCi0JaWYgKCFydGw4NzIzYV9CVF9jb2V4aXN0KHBhZGFwdGVyKSkgewotCQliUmV0ID0gZmFsc2U7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0Lmxhc3RCdEVkY2EgPSAwOwotCQlyZXR1cm4gYlJldDsKLQl9Ci0JaWYgKCEoKHBCdE1nbnQtPmJTdXBwb3J0UHJvZmlsZSkgfHwKLQkgICAgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkJUX0NvZXhpc3RUeXBlID09IEJUX0NTUl9CQzgpKSkgewotCQliUmV0ID0gZmFsc2U7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0Lmxhc3RCdEVkY2EgPSAwOwotCQlyZXR1cm4gYlJldDsKLQl9Ci0KLQlpZiAocnRsODcyM2FfQlRfdXNpbmdfYW50ZW5uYV8xKHBhZGFwdGVyKSkgewotCQliUmV0ID0gZmFsc2U7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0Lmxhc3RCdEVkY2EgPSAwOwotCQlyZXR1cm4gYlJldDsKLQl9Ci0KLQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuZXhlY19jbnQgPCAzKQotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5leGVjX2NudCsrOwotCWVsc2UKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkVEQ0FJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkvKiAgV2hlbiBCVCBpcyBub24gaWRsZSAqLwotCWlmICghKHBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmIEJUX0NPRVhfU1RBVEVfQlRfSURMRSkpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkJUIHN0YXRlIG5vbiBpZGxlLCBzZXQgYnQgRURDQVxuIikpOwotCi0JCS8qIGFnZ3JfbnVtID0gMHgwOTA5OyAqLwotCQlpZiAocEhhbERhdGEtPm9kbXByaXYuRE1fRURDQV9UYWJsZS5iQ3VycmVudFR1cmJvRURDQSkgewotCQkJYkJ0Q2hhbmdlRURDQSA9IHRydWU7Ci0JCQlwSGFsRGF0YS0+b2RtcHJpdi5ETV9FRENBX1RhYmxlLmJDdXJyZW50VHVyYm9FRENBID0gZmFsc2U7Ci0JCQlwSGFsRGF0YS0+ZG1wcml2LnBydl90cmFmZmljX2lkeCA9IDM7Ci0JCX0KLQkJY3VyX0VEQ0FfcmVnID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgUkVHX0VEQ0FfQkVfUEFSQU0pOwotCi0JCWlmIChjdXJfRURDQV9yZWcgIT0gRURDQV9CVF9CRSkKLQkJCWJCdENoYW5nZUVEQ0EgPSB0cnVlOwotCQlpZiAoYkJ0Q2hhbmdlRURDQSB8fCAhcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkVEQ0FJbml0aWFsaXplZCkgewotCQkJcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIFJFR19FRENBX0JFX1BBUkFNLAotCQkJCQkgIEVEQ0FfQlRfQkUpOwotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QubGFzdEJ0RWRjYSA9IEVEQ0FfQlRfQkU7Ci0JCX0KLQkJYlJldCA9IHRydWU7Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkJUIHN0YXRlIGlkbGUsIHNldCBvcmlnaW5hbCBFRENBXG4iKSk7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0Lmxhc3RCdEVkY2EgPSAwOwotCQliUmV0ID0gZmFsc2U7Ci0JfQotCXJldHVybiBiUmV0OwotfQotCi12b2lkCi1CVERNX0JhbGFuY2UoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQl1OCBiQmFsYW5jZU9uLAotCXU4IG1zMCwKLQl1OCBtczEKLQkpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JdTggSDJDX1BhcmFtZXRlclszXSA9IHswfTsKLQotCWlmIChiQmFsYW5jZU9uKSB7Ci0JCUgyQ19QYXJhbWV0ZXJbMl0gPSAxOwotCQlIMkNfUGFyYW1ldGVyWzFdID0gbXMxOwotCQlIMkNfUGFyYW1ldGVyWzBdID0gbXMwOwotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5iRldDb2V4aXN0QWxsT2ZmID0gZmFsc2U7Ci0JfSBlbHNlIHsKLQkJSDJDX1BhcmFtZXRlclsyXSA9IDA7Ci0JCUgyQ19QYXJhbWV0ZXJbMV0gPSAwOwotCQlIMkNfUGFyYW1ldGVyWzBdID0gMDsKLQl9Ci0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkJhbGFuY2VPbiA9IGJCYWxhbmNlT247Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIEJhbGFuY2UgPVslczolZG1zOiVkbXNdLCB3cml0ZSAweGMgPSAweCV4XG4iLAotCQliQmFsYW5jZU9uPyJPTiI6Ik9GRiIsIG1zMCwgbXMxLAotCQlIMkNfUGFyYW1ldGVyWzBdPDwxNnxIMkNfUGFyYW1ldGVyWzFdPDw4fEgyQ19QYXJhbWV0ZXJbMl0pKTsKLQotCUZpbGxIMkNDbWQocGFkYXB0ZXIsIDB4YywgMywgSDJDX1BhcmFtZXRlcik7Ci19Ci0KLXZvaWQgQlRETV9BR0NUYWJsZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB0eXBlKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCWlmICh0eXBlID09IEJUX0FHQ1RBQkxFX09GRikgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUXUFHQ1RhYmxlIE9mZiFcbiIpKTsKLQkJcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIDB4Yzc4LCAweDY0MWMwMDAxKTsKLQkJcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIDB4Yzc4LCAweDYzMWQwMDAxKTsKLQkJcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIDB4Yzc4LCAweDYyMWUwMDAxKTsKLQkJcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIDB4Yzc4LCAweDYxMWYwMDAxKTsKLQkJcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIDB4Yzc4LCAweDYwMjAwMDAxKTsKLQotCQlQSFlfU2V0UkZSZWcocGFkYXB0ZXIsIFBhdGhBLCBSRl9SWF9BR0NfSFAsIGJSRlJlZ09mZnNldE1hc2ssIDB4MzIwMDApOwotCQlQSFlfU2V0UkZSZWcocGFkYXB0ZXIsIFBhdGhBLCBSRl9SWF9BR0NfSFAsIGJSRlJlZ09mZnNldE1hc2ssIDB4NzEwMDApOwotCQlQSFlfU2V0UkZSZWcocGFkYXB0ZXIsIFBhdGhBLCBSRl9SWF9BR0NfSFAsIGJSRlJlZ09mZnNldE1hc2ssIDB4YjAwMDApOwotCQlQSFlfU2V0UkZSZWcocGFkYXB0ZXIsIFBhdGhBLCBSRl9SWF9BR0NfSFAsIGJSRlJlZ09mZnNldE1hc2ssIDB4ZmMwMDApOwotCQlQSFlfU2V0UkZSZWcocGFkYXB0ZXIsIFBhdGhBLCBSRl9SWF9HMSwgYlJGUmVnT2Zmc2V0TWFzaywgMHgzMDM1NSk7Ci0KLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYjg3MjNhQWdjVGFibGVPbiA9IGZhbHNlOwotCX0gZWxzZSBpZiAodHlwZSA9PSBCVF9BR0NUQUJMRV9PTikgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUXUFHQ1RhYmxlIE9uIVxuIikpOwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHhjNzgsIDB4NGUxYzAwMDEpOwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHhjNzgsIDB4NGQxZDAwMDEpOwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHhjNzgsIDB4NGMxZTAwMDEpOwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHhjNzgsIDB4NGIxZjAwMDEpOwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHhjNzgsIDB4NGEyMDAwMDEpOwotCi0JCVBIWV9TZXRSRlJlZyhwYWRhcHRlciwgUGF0aEEsIFJGX1JYX0FHQ19IUCwgYlJGUmVnT2Zmc2V0TWFzaywgMHhkYzAwMCk7Ci0JCVBIWV9TZXRSRlJlZyhwYWRhcHRlciwgUGF0aEEsIFJGX1JYX0FHQ19IUCwgYlJGUmVnT2Zmc2V0TWFzaywgMHg5MDAwMCk7Ci0JCVBIWV9TZXRSRlJlZyhwYWRhcHRlciwgUGF0aEEsIFJGX1JYX0FHQ19IUCwgYlJGUmVnT2Zmc2V0TWFzaywgMHg1MTAwMCk7Ci0JCVBIWV9TZXRSRlJlZyhwYWRhcHRlciwgUGF0aEEsIFJGX1JYX0FHQ19IUCwgYlJGUmVnT2Zmc2V0TWFzaywgMHgxMjAwMCk7Ci0JCVBIWV9TZXRSRlJlZyhwYWRhcHRlciwgUGF0aEEsIFJGX1JYX0cxLCBiUkZSZWdPZmZzZXRNYXNrLCAweDAwMzU1KTsKLQotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5iODcyM2FBZ2NUYWJsZU9uID0gdHJ1ZTsKLQotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5iU1dDb2V4aXN0QWxsT2ZmID0gZmFsc2U7Ci0JfQotfQotCi12b2lkIEJURE1fQkJCYWNrT2ZmTGV2ZWwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggdHlwZSkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWlmICh0eXBlID09IEJUX0JCX0JBQ0tPRkZfT0ZGKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRdQkJCYWNrT2ZmTGV2ZWwgT2ZmIVxuIikpOwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHhjMDQsIDB4M2EwNTYxMSk7Ci0JfSBlbHNlIGlmICh0eXBlID09IEJUX0JCX0JBQ0tPRkZfT04pIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVF1CQkJhY2tPZmZMZXZlbCBPbiFcbiIpKTsKLQkJcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIDB4YzA0LCAweDNhMDc2MTEpOwotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5iU1dDb2V4aXN0QWxsT2ZmID0gZmFsc2U7Ci0JfQotfQotCi12b2lkIEJURE1fRldDb2V4QWxsT2ZmKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQlRETV9GV0NvZXhBbGxPZmYoKVxuIikpOwotCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5iRldDb2V4aXN0QWxsT2ZmKQotCQlyZXR1cm47Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkJURE1fRldDb2V4QWxsT2ZmKCksIHJlYWwgRG9cbiIpKTsKLQotCUJURE1fRldDb2V4QWxsT2ZmODcyM0EocGFkYXB0ZXIpOwotCi0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkZXQ29leGlzdEFsbE9mZiA9IHRydWU7Ci19Ci0KLXZvaWQgQlRETV9TV0NvZXhBbGxPZmYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJCVERNX1NXQ29leEFsbE9mZigpXG4iKSk7Ci0JaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LmJTV0NvZXhpc3RBbGxPZmYpCi0JCXJldHVybjsKLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQlRETV9TV0NvZXhBbGxPZmYoKSwgcmVhbCBEb1xuIikpOwotCUJURE1fU1dDb2V4QWxsT2ZmODcyM0EocGFkYXB0ZXIpOwotCi0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuYlNXQ29leGlzdEFsbE9mZiA9IHRydWU7Ci19Ci0KLXZvaWQgQlRETV9IV0NvZXhBbGxPZmYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJCVERNX0hXQ29leEFsbE9mZigpXG4iKSk7Ci0JaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LmJIV0NvZXhpc3RBbGxPZmYpCi0JCXJldHVybjsKLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQlRETV9IV0NvZXhBbGxPZmYoKSwgcmVhbCBEb1xuIikpOwotCi0JQlRETV9IV0NvZXhBbGxPZmY4NzIzQShwYWRhcHRlcik7Ci0KLQlwSGFsRGF0YS0+YnRfY29leGlzdC5iSFdDb2V4aXN0QWxsT2ZmID0gdHJ1ZTsKLX0KLQotdm9pZCBCVERNX0NvZXhBbGxPZmYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlCVERNX0ZXQ29leEFsbE9mZihwYWRhcHRlcik7Ci0JQlRETV9TV0NvZXhBbGxPZmYocGFkYXB0ZXIpOwotCUJURE1fSFdDb2V4QWxsT2ZmKHBhZGFwdGVyKTsKLX0KLQotdm9pZCBydGw4NzIzYV9CVF9kaXNhYmxlX2NvZXhpc3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwcHdyY3RybCA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0KLQlpZiAoIXJ0bDg3MjNhX0JUX2NvZXhpc3QocGFkYXB0ZXIpKQotCQlyZXR1cm47Ci0KLQkvKiAgODcyMyAxQW50IGRvZXNuJ3QgbmVlZCB0byB0dXJuIG9mZiBidCBjb2V4aXN0IG1lY2hhbmlzbS4gKi8KLQlpZiAocnRsODcyM2FfQlRfdXNpbmdfYW50ZW5uYV8xKHBhZGFwdGVyKSkKLQkJcmV0dXJuOwotCi0JLyogIEJlZm9yZSBlbnRlciBJUFMsIHR1cm4gb2ZmIEZXIEJUIENvLWV4aXN0IG1lY2hhbmlzbSAqLwotCWlmIChwcHdyY3RybC0+cmVnX3Jmb2ZmID09IHJmX29uKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRdW0RNXSwgQmVmb3JlIGVudGVyIElQUywgdHVybiBvZmYgYWxsIENvZXhpc3QgRE1cbiIpKTsKLQkJYnRkbV9SZXNldEZXQ29leFN0YXRlKHBhZGFwdGVyKTsKLQkJQlRETV9Db2V4QWxsT2ZmKHBhZGFwdGVyKTsKLQkJQlRETV9TZXRBbnRlbm5hKHBhZGFwdGVyLCBCVERNX0FOVF9CVCk7Ci0JfQotfQotCi12b2lkIEJURE1fU2lnbmFsQ29tcGVuc2F0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpyc3NpX3dpZmksIHU4ICpyc3NpX2J0KQotewotCUJURE1fODcyM0FTaWduYWxDb21wZW5zYXRpb24ocGFkYXB0ZXIsIHJzc2lfd2lmaSwgcnNzaV9idCk7Ci19Ci0KLXZvaWQgcnRsODcyM2FfQlRfZG9fY29leGlzdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JaWYgKCFydGw4NzIzYV9CVF9jb2V4aXN0KHBhZGFwdGVyKSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIEJUIG5vdCBleGlzdHMhIVxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCFwSGFsRGF0YS0+YnRfY29leGlzdC5iSW5pdGxpemVkKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgYnRkbV9Jbml0QnRDb2V4aXN0RE0oKVxuIikpOwotCQlidGRtX0luaXRCdENvZXhpc3RETShwYWRhcHRlcik7Ci0JfQotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIlxuXG5bRE1dW0JUXSwgQlRETSBzdGFydCEhXG4iKSk7Ci0KLQlCVERNX1BXREJNb25pdG9yKHBhZGFwdGVyKTsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgSFcgdHlwZSBpcyA4NzIzXG4iKSk7Ci0JQlRETV9CVENvZXhpc3Q4NzIzQShwYWRhcHRlcik7Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBCVERNIGVuZCEhXG5cbiIpKTsKLX0KLQotdm9pZCBCVERNX1VwZGF0ZUNvZXhTdGF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JaWYgKCFCVERNX0lzU2FtZUNvZXhpc3RTdGF0ZShwYWRhcHRlcikpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBDb2V4aXN0IFN0YXRlW2JpdE1hcF0gY2hhbmdlIGZyb20gMHglImk2NGZtdCJ4IHRvIDB4JSJpNjRmbXQieCwgIGNoYW5nZUJpdHMgPSAweCUiaTY0Zm10InhcbiIsCi0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5QcmV2aW91c1N0YXRlLAotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlLAotCQkJKHBIYWxEYXRhLT5idF9jb2V4aXN0LlByZXZpb3VzU3RhdGVecEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlKSkpOwotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5QcmV2aW91c1N0YXRlID0gcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlOwotCX0KLX0KLQotdTggQlRETV9Jc1NhbWVDb2V4aXN0U3RhdGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5QcmV2aW91c1N0YXRlID09IHBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9IGVsc2UgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIENvZXhpc3Qgc3RhdGUgY2hhbmdlZCEhXG4iKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19Ci0KLXZvaWQgQlRETV9QV0RCTW9uaXRvcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhHZXREZWZhdWx0QWRhcHRlcihwYWRhcHRlcikpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQl1OCBIMkNfUGFyYW1ldGVyWzNdID0gezB9OwotCXMzMiB0bXBCVEVudHJ5TWF4UFdEQiA9IDAsIHRtcEJURW50cnlNaW5QV0RCID0gMHhmZjsKLQl1OCBpOwotCi0JaWYgKHBCdE1nbnQtPkJ0T3BlcmF0aW9uT24pIHsKLQkJZm9yIChpID0gMDsgaSA8IE1BWF9CVF9BU09DX0VOVFJZX05VTTsgaSsrKSB7Ci0JCQlpZiAocEJUSW5mby0+QnRBc29jRW50cnlbaV0uYlVzZWQpIHsKLQkJCQlpZiAocEJUSW5mby0+QnRBc29jRW50cnlbaV0uVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPCB0bXBCVEVudHJ5TWluUFdEQikKLQkJCQkJdG1wQlRFbnRyeU1pblBXREIgPSBwQlRJbmZvLT5CdEFzb2NFbnRyeVtpXS5VbmRlY29yYXRlZFNtb290aGVkUFdEQjsKLQkJCQlpZiAocEJUSW5mby0+QnRBc29jRW50cnlbaV0uVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPiB0bXBCVEVudHJ5TWF4UFdEQikKLQkJCQkJdG1wQlRFbnRyeU1heFBXREIgPSBwQlRJbmZvLT5CdEFzb2NFbnRyeVtpXS5VbmRlY29yYXRlZFNtb290aGVkUFdEQjsKLQkJCQkvKiAgUmVwb3J0IGV2ZXJ5IEJUIGNvbm5lY3Rpb24gKEhTIG1vZGUpIFJTU0kgdG8gRlcgKi8KLQkJCQlIMkNfUGFyYW1ldGVyWzJdID0gKHU4KShwQlRJbmZvLT5CdEFzb2NFbnRyeVtpXS5VbmRlY29yYXRlZFNtb290aGVkUFdEQiAmIDB4RkYpOwotCQkJCUgyQ19QYXJhbWV0ZXJbMF0gPSAoTUFYX0ZXX1NVUFBPUlRfTUFDSURfTlVNLTEtaSk7Ci0JCQkJUlRQUklOVChGRE0sIERNX0JUMzAsICgiUlNTSSByZXBvcnQgZm9yIEJUWyVkXSwgSDJDX1BhciA9IDB4JXhcbiIsIGksIEgyQ19QYXJhbWV0ZXJbMF0pKTsKLQkJCQlGaWxsSDJDQ21kKHBhZGFwdGVyLCBSU1NJX1NFVFRJTkdfRUlELCAzLCBIMkNfUGFyYW1ldGVyKTsKLQkJCQlSVFBSSU5UX0FERFIoRkRNLCAoRE1fUFdEQnxETV9CVDMwKSwgKCJCVF9FbnRyeSBNYWMgOiIpLAotCQkJCQkgICAgIHBCVEluZm8tPkJ0QXNvY0VudHJ5W2ldLkJUUmVtb3RlTUFDQWRkcikKLQkJCQlSVFBSSU5UKEZETSwgKERNX1BXREJ8RE1fQlQzMCksCi0JCQkJCSgiQlQgcnggcHdkYlslZF0gPSAweCV4KCVkKVxuIiwgaSwKLQkJCQkJcEJUSW5mby0+QnRBc29jRW50cnlbaV0uVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIsCi0JCQkJCXBCVEluZm8tPkJ0QXNvY0VudHJ5W2ldLlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHRtcEJURW50cnlNYXhQV0RCICE9IDApIHsJLyogIElmIGFzc29jaWF0ZWQgZW50cnkgaXMgZm91bmQgKi8KLQkJCXBIYWxEYXRhLT5kbXByaXYuQlRfRW50cnlNYXhVbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IHRtcEJURW50cnlNYXhQV0RCOwotCQkJUlRQUklOVChGRE0sIChETV9QV0RCfERNX0JUMzApLCAoIkJUX0VudHJ5TWF4UFdEQiA9IDB4JXgoJWQpXG4iLAotCQkJCXRtcEJURW50cnlNYXhQV0RCLCB0bXBCVEVudHJ5TWF4UFdEQikpOwotCQl9IGVsc2UgewotCQkJcEhhbERhdGEtPmRtcHJpdi5CVF9FbnRyeU1heFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID0gMDsKLQkJfQotCQlpZiAodG1wQlRFbnRyeU1pblBXREIgIT0gMHhmZikgeyAvKiAgSWYgYXNzb2NpYXRlZCBlbnRyeSBpcyBmb3VuZCAqLwotCQkJcEhhbERhdGEtPmRtcHJpdi5CVF9FbnRyeU1pblVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID0gdG1wQlRFbnRyeU1pblBXREI7Ci0JCQlSVFBSSU5UKEZETSwgKERNX1BXREJ8RE1fQlQzMCksICgiQlRfRW50cnlNaW5QV0RCID0gMHgleCglZClcbiIsCi0JCQkJdG1wQlRFbnRyeU1pblBXREIsIHRtcEJURW50cnlNaW5QV0RCKSk7Ci0JCX0gZWxzZSB7Ci0JCQlwSGFsRGF0YS0+ZG1wcml2LkJUX0VudHJ5TWluVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPSAwOwotCQl9Ci0JfQotfQotCi11OCBCVERNX0lzQlRCdXN5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLmJCVEJ1c3kpCi0JCXJldHVybiB0cnVlOwotCWVsc2UKLQkJcmV0dXJuIGZhbHNlOwotfQotCi11OCBCVERNX0lzV2lmaUJ1c3koc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLS8qUE1HTlRfSU5GTwkJcE1nbnRJbmZvID0gJkdldERlZmF1bHRBZGFwdGVyKHBhZGFwdGVyKS0+TWdudEluZm87ICovCi0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJkdldERlZmF1bHRBZGFwdGVyKHBhZGFwdGVyKS0+bWxtZXByaXY7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfdHJhZmZpYyAqcEJ0VHJhZmZpYyA9ICZwQlRJbmZvLT5CdFRyYWZmaWM7Ci0KLQlpZiAocG1sbWVwcml2LT5MaW5rRGV0ZWN0SW5mby5iQnVzeVRyYWZmaWMgfHwKLQkJcEJ0VHJhZmZpYy0+QnQzMFRyYWZmaWNTdGF0aXN0aWNzLmJUeEJ1c3lUcmFmZmljIHx8Ci0JCXBCdFRyYWZmaWMtPkJ0MzBUcmFmZmljU3RhdGlzdGljcy5iUnhCdXN5VHJhZmZpYykKLQkJcmV0dXJuIHRydWU7Ci0JZWxzZQotCQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXU4IEJURE1fSXNDb2V4aXN0U3RhdGVDaGFuZ2VkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuUHJldmlvdXNTdGF0ZSA9PSBwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUpCi0JCXJldHVybiBmYWxzZTsKLQllbHNlCi0JCXJldHVybiB0cnVlOwotfQotCi11OCBCVERNX0lzV2lmaVVwbGluayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotLypQTUdOVF9JTkZPCQlwTWdudEluZm8gPSAmR2V0RGVmYXVsdEFkYXB0ZXIocGFkYXB0ZXIpLT5NZ250SW5mbzsgKi8KLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXY7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbzsKLQlzdHJ1Y3QgYnRfdHJhZmZpYyAqcEJ0VHJhZmZpYzsKLQotCXBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0JcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlwQnRUcmFmZmljID0gJnBCVEluZm8tPkJ0VHJhZmZpYzsKLQotCWlmICgocG1sbWVwcml2LT5MaW5rRGV0ZWN0SW5mby5iVHhCdXN5VHJhZmZpYykgfHwKLQkJKHBCdFRyYWZmaWMtPkJ0MzBUcmFmZmljU3RhdGlzdGljcy5iVHhCdXN5VHJhZmZpYykpCi0JCXJldHVybiB0cnVlOwotCWVsc2UKLQkJcmV0dXJuIGZhbHNlOwotfQotCi11OCBCVERNX0lzV2lmaURvd25saW5rKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0vKlBNR05UX0lORk8JCXBNZ250SW5mbyA9ICZHZXREZWZhdWx0QWRhcHRlcihwYWRhcHRlciktPk1nbnRJbmZvOyAqLwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdjsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvOwotCXN0cnVjdCBidF90cmFmZmljICpwQnRUcmFmZmljOwotCi0JcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXBCdFRyYWZmaWMgPSAmcEJUSW5mby0+QnRUcmFmZmljOwotCi0JaWYgKChwbWxtZXByaXYtPkxpbmtEZXRlY3RJbmZvLmJSeEJ1c3lUcmFmZmljKSB8fAotCQkocEJ0VHJhZmZpYy0+QnQzMFRyYWZmaWNTdGF0aXN0aWNzLmJSeEJ1c3lUcmFmZmljKSkKLQkJcmV0dXJuIHRydWU7Ci0JZWxzZQotCQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXU4IEJURE1fSXNCVEhTTW9kZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotLypQTUdOVF9JTkZPCQlwTWdudEluZm8gPSAmR2V0RGVmYXVsdEFkYXB0ZXIocGFkYXB0ZXIpLT5NZ250SW5mbzsgKi8KLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250OwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBCdE1nbnQgPSAmcEhhbERhdGEtPkJ0SW5mby5CdE1nbnQ7Ci0KLQlpZiAocEJ0TWdudC0+QnRPcGVyYXRpb25PbikKLQkJcmV0dXJuIHRydWU7Ci0JZWxzZQotCQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXU4IEJURE1fSXNCVFVwbGluayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkJUMjFUcmFmZmljU3RhdGlzdGljcy5iVHhCdXN5VHJhZmZpYykKLQkJcmV0dXJuIHRydWU7Ci0JZWxzZQotCQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXU4IEJURE1fSXNCVERvd25saW5rKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuQlQyMVRyYWZmaWNTdGF0aXN0aWNzLmJSeEJ1c3lUcmFmZmljKQotCQlyZXR1cm4gdHJ1ZTsKLQllbHNlCi0JCXJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBCVERNX0FkanVzdEZvckJ0T3BlcmF0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVF1bRE1dLCBCVERNX0FkanVzdEZvckJ0T3BlcmF0aW9uKClcbiIpKTsKLQlCVERNX0FkanVzdEZvckJ0T3BlcmF0aW9uODcyM0EocGFkYXB0ZXIpOwotfQotCi12b2lkIEJURE1fU2V0QnRDb2V4Q3VyckFudE51bShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBhbnROdW0pCi17Ci0JQlRETV9TZXQ4NzIzQUJ0Q29leEN1cnJBbnROdW0ocGFkYXB0ZXIsIGFudE51bSk7Ci19Ci0KLXZvaWQgQlRETV9Gb3JIYWx0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JaWYgKCFydGw4NzIzYV9CVF9jb2V4aXN0KHBhZGFwdGVyKSkKLQkJcmV0dXJuOwotCi0JQlRETV9Gb3JIYWx0ODcyM0EocGFkYXB0ZXIpOwotCUdFVF9IQUxfREFUQShwYWRhcHRlciktPmJ0X2NvZXhpc3QuYkluaXRsaXplZCA9IGZhbHNlOwotfQotCi12b2lkIEJURE1fV2lmaVNjYW5Ob3RpZnkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggc2NhblR5cGUpCi17Ci0JaWYgKCFydGw4NzIzYV9CVF9jb2V4aXN0KHBhZGFwdGVyKSkKLQkJcmV0dXJuOwotCi0JQlRETV9XaWZpU2Nhbk5vdGlmeTg3MjNBKHBhZGFwdGVyLCBzY2FuVHlwZSk7Ci19Ci0KLXZvaWQgQlRETV9XaWZpQXNzb2NpYXRlTm90aWZ5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGFjdGlvbikKLXsKLQlpZiAoIXJ0bDg3MjNhX0JUX2NvZXhpc3QocGFkYXB0ZXIpKQotCQlyZXR1cm47Ci0KLQlCVERNX1dpZmlBc3NvY2lhdGVOb3RpZnk4NzIzQShwYWRhcHRlciwgYWN0aW9uKTsKLX0KLQotdm9pZCBydGw4NzIzYV9CVF9tZWRpYXN0YXR1c19ub3RpZnkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgZW51bSBydF9tZWRpYV9zdGF0dXMgbXN0YXR1cykKLXsKLQlpZiAoIXJ0bDg3MjNhX0JUX2NvZXhpc3QocGFkYXB0ZXIpKQotCQlyZXR1cm47Ci0KLQlCVERNX01lZGlhU3RhdHVzTm90aWZ5ODcyM0EocGFkYXB0ZXIsIG1zdGF0dXMpOwotfQotCi12b2lkIHJ0bDg3MjNhX0JUX3NwZWNpYWxwYWNrZXRfbm90aWZ5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JaWYgKCFydGw4NzIzYV9CVF9jb2V4aXN0KHBhZGFwdGVyKSkKLQkJcmV0dXJuOwotCi0JQlRETV9Gb3JEaGNwODcyM0EocGFkYXB0ZXIpOwotfQotCi12b2lkIEJURE1fUmVzZXRBY3Rpb25Qcm9maWxlU3RhdGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+XAotCQkoQlRfQ09FWF9TVEFURV9QUk9GSUxFX0hJRHxCVF9DT0VYX1NUQVRFX1BST0ZJTEVfQTJEUHwKLQkJQlRfQ09FWF9TVEFURV9QUk9GSUxFX1BBTnxCVF9DT0VYX1NUQVRFX1BST0ZJTEVfU0NPKTsKLX0KLQotdTggQlRETV9Jc0FjdGlvblNDTyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbzsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudDsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmc7Ci0JdTggYlJldDsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQliUmV0ID0gZmFsc2U7Ci0KLQlpZiAocEJ0RGJnLT5kYmdDdHJsKSB7Ci0JCWlmIChwQnREYmctPmRiZ1Byb2ZpbGUgPT0gQlRfREJHX1BST0ZJTEVfU0NPKSB7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9QUk9GSUxFX1NDTzsKLQkJCWJSZXQgPSB0cnVlOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZlNDTyA+IDApIHsKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1BST0ZJTEVfU0NPOwotCQkJYlJldCA9IHRydWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIGJSZXQ7Ci19Ci0KLXU4IEJURE1fSXNBY3Rpb25ISUQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvOwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQ7Ci0Jc3RydWN0IGJ0X2RnYiAqcEJ0RGJnOwotCXU4IGJSZXQ7Ci0KLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQlwQnREYmcgPSAmcEJUSW5mby0+QnREYmc7Ci0JYlJldCA9IGZhbHNlOwotCi0JaWYgKHBCdERiZy0+ZGJnQ3RybCkgewotCQlpZiAocEJ0RGJnLT5kYmdQcm9maWxlID09IEJUX0RCR19QUk9GSUxFX0hJRCkgewotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfUFJPRklMRV9ISUQ7Ci0JCQliUmV0ID0gdHJ1ZTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9ISUQpICYmCi0JCSAgICBwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGUgPT0gMSkgewotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfUFJPRklMRV9ISUQ7Ci0JCQliUmV0ID0gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gYlJldDsKLX0KLQotdTggQlRETV9Jc0FjdGlvbkEyRFAoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm87Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQ7Ci0Jc3RydWN0IGJ0X2RnYiAqcEJ0RGJnOwotCXU4IGJSZXQ7Ci0KLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQlwQnREYmcgPSAmcEJUSW5mby0+QnREYmc7Ci0JYlJldCA9IGZhbHNlOwotCi0JaWYgKHBCdERiZy0+ZGJnQ3RybCkgewotCQlpZiAocEJ0RGJnLT5kYmdQcm9maWxlID09IEJUX0RCR19QUk9GSUxFX0EyRFApIHsKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1BST0ZJTEVfQTJEUDsKLQkJCWJSZXQgPSB0cnVlOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX0EyRFApICYmCi0JCSAgICBwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGUgPT0gMSkgewotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfUFJPRklMRV9BMkRQOwotCQkJYlJldCA9IHRydWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIGJSZXQ7Ci19Ci0KLXU4IEJURE1fSXNBY3Rpb25QQU4oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm87Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQ7Ci0Jc3RydWN0IGJ0X2RnYiAqcEJ0RGJnOwotCXU4IGJSZXQ7Ci0KLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQlwQnREYmcgPSAmcEJUSW5mby0+QnREYmc7Ci0JYlJldCA9IGZhbHNlOwotCi0JaWYgKHBCdERiZy0+ZGJnQ3RybCkgewotCQlpZiAocEJ0RGJnLT5kYmdQcm9maWxlID09IEJUX0RCR19QUk9GSUxFX1BBTikgewotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfUFJPRklMRV9QQU47Ci0JCQliUmV0ID0gdHJ1ZTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9QQU4pICYmCi0JCSAgICBwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGUgPT0gMSkgewotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfUFJPRklMRV9QQU47Ci0JCQliUmV0ID0gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gYlJldDsKLX0KLQotdTggQlRETV9Jc0FjdGlvbkhJREEyRFAoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm87Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQ7Ci0Jc3RydWN0IGJ0X2RnYiAqcEJ0RGJnOwotCXU4IGJSZXQ7Ci0KLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQlwQnREYmcgPSAmcEJUSW5mby0+QnREYmc7Ci0JYlJldCA9IGZhbHNlOwotCi0JaWYgKHBCdERiZy0+ZGJnQ3RybCkgewotCQlpZiAocEJ0RGJnLT5kYmdQcm9maWxlID09IEJUX0RCR19QUk9GSUxFX0hJRF9BMkRQKSB7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gKEJUX0NPRVhfU1RBVEVfUFJPRklMRV9ISUR8QlRfQ09FWF9TVEFURV9QUk9GSUxFX0EyRFApOwotCQkJYlJldCA9IHRydWU7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfSElEKSAmJgotCQkgICAgQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfQTJEUCkpIHsKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSAoQlRfQ09FWF9TVEFURV9QUk9GSUxFX0hJRHxCVF9DT0VYX1NUQVRFX1BST0ZJTEVfQTJEUCk7Ci0JCQliUmV0ID0gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gYlJldDsKLX0KLQotdTggQlRETV9Jc0FjdGlvbkhJRFBBTihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbzsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmc7Ci0JdTggYlJldDsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQliUmV0ID0gZmFsc2U7Ci0KLQlpZiAocEJ0RGJnLT5kYmdDdHJsKSB7Ci0JCWlmIChwQnREYmctPmRiZ1Byb2ZpbGUgPT0gQlRfREJHX1BST0ZJTEVfSElEX1BBTikgewotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IChCVF9DT0VYX1NUQVRFX1BST0ZJTEVfSElEfEJUX0NPRVhfU1RBVEVfUFJPRklMRV9QQU4pOwotCQkJYlJldCA9IHRydWU7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfSElEKSAmJgotCQkgICAgQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfUEFOKSkgewotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IChCVF9DT0VYX1NUQVRFX1BST0ZJTEVfSElEfEJUX0NPRVhfU1RBVEVfUFJPRklMRV9QQU4pOwotCQkJYlJldCA9IHRydWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIGJSZXQ7Ci19Ci0KLXU4IEJURE1fSXNBY3Rpb25QQU5BMkRQKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvOwotCXN0cnVjdCBidF9kZ2IgKnBCdERiZzsKLQl1OCBiUmV0OwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0JcEJ0RGJnID0gJnBCVEluZm8tPkJ0RGJnOwotCWJSZXQgPSBmYWxzZTsKLQotCWlmIChwQnREYmctPmRiZ0N0cmwpIHsKLQkJaWYgKHBCdERiZy0+ZGJnUHJvZmlsZSA9PSBCVF9EQkdfUFJPRklMRV9QQU5fQTJEUCkgewotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IChCVF9DT0VYX1NUQVRFX1BST0ZJTEVfUEFOfEJUX0NPRVhfU1RBVEVfUFJPRklMRV9BMkRQKTsKLQkJCWJSZXQgPSB0cnVlOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX1BBTikgJiYgQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfQTJEUCkpIHsKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSAoQlRfQ09FWF9TVEFURV9QUk9GSUxFX1BBTnxCVF9DT0VYX1NUQVRFX1BST0ZJTEVfQTJEUCk7Ci0JCQliUmV0ID0gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gYlJldDsKLX0KLQotYm9vbCBydGw4NzIzYV9CVF9lbmFibGVkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuYkN1ckJ0RGlzYWJsZWQpCi0JCXJldHVybiBmYWxzZTsKLQllbHNlCi0JCXJldHVybiB0cnVlOwotfQotCi0vKiAgPT09PT0gRW5kIG9mIHN5bmMgZnJvbSBTRDcgZHJpdmVyIEhBTC9CVENvZXhpc3QvSGFsQnRDb2V4aXN0LmMgPT09PT0gKi8KLQotLyogID09PT09IEJlbG93IHRoaXMgbGluZSBpcyBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvSGFsQlQuYyA9PT09PSAqLwotCi0vKiAgKi8KLS8qbG9jYWwgZnVuY3Rpb24gKi8KLS8qICAqLwotCi1zdGF0aWMgdm9pZCBoYWxidF9Jbml0SHdDb25maWc4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotfQotCi0vKiAgKi8KLS8qZXh0ZXJuIGZ1bmN0aW9uICovCi0vKiAgKi8KLXU4IEhBTEJUX0dldFBHQW50TnVtKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlyZXR1cm4gcEhhbERhdGEtPmJ0X2NvZXhpc3QuQlRfQW50X051bTsKLX0KLQotdm9pZCBIQUxCVF9TZXRLZXkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggRW50cnlOdW0pCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUaW5mbzsKLQlzdHJ1Y3QgYnRfYXNvY19lbnRyeSAqcEJ0QXNzb2NFbnRyeTsKLQl1MTYJCQkJdXNDb25maWcgPSAwOwotCi0JcEJUaW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlwQnRBc3NvY0VudHJ5ID0gJnBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXTsKLQotCXBCdEFzc29jRW50cnktPkh3Q0FNSW5kZXggPSBCVF9IV0NBTV9TVEFSICsgRW50cnlOdW07Ci0KLQl1c0NvbmZpZyA9IENBTV9WQUxJRCB8IChDQU1fQUVTIDw8IDIpOwotCXJ0bDg3MjNhX2NhbV93cml0ZShwYWRhcHRlciwgcEJ0QXNzb2NFbnRyeS0+SHdDQU1JbmRleCwgdXNDb25maWcsCi0JCQkgICBwQnRBc3NvY0VudHJ5LT5CVFJlbW90ZU1BQ0FkZHIsCi0JCQkgICBwQnRBc3NvY0VudHJ5LT5QVEsgKyBUS0lQX0VOQ19LRVlfUE9TKTsKLX0KLQotdm9pZCBIQUxCVF9SZW1vdmVLZXkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggRW50cnlOdW0pCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUaW5mbzsKLQlzdHJ1Y3QgYnRfYXNvY19lbnRyeSAqcEJ0QXNzb2NFbnRyeTsKLQotCXBCVGluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0JcEJ0QXNzb2NFbnRyeSA9ICZwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV07Ci0KLQlpZiAocEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkh3Q0FNSW5kZXggIT0gMCkgewotCQkvKiAgVG9EbyA6IGFkZCBOZXcgSEFMQlRfUmVtb3ZlS2V5IGZ1bmN0aW9uICEhICovCi0JCWlmIChwQnRBc3NvY0VudHJ5LT5Id0NBTUluZGV4ID49IEJUX0hXQ0FNX1NUQVIgJiYKLQkJICAgIHBCdEFzc29jRW50cnktPkh3Q0FNSW5kZXggPCBIQUxGX0NBTV9FTlRSWSkKLQkJCXJ0bDg3MjNhX2NhbV9lbXB0eV9lbnRyeShwYWRhcHRlciwKLQkJCQkJCSBwQnRBc3NvY0VudHJ5LT5Id0NBTUluZGV4KTsKLQkJcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkh3Q0FNSW5kZXggPSAwOwotCX0KLX0KLQotdm9pZCBydGw4NzIzYV9CVF9pbml0X2hhbF92YXJzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCXBIYWxEYXRhLT5idF9jb2V4aXN0LkJsdWV0b290aENvZXhpc3QgPSBwSGFsRGF0YS0+RUVQUk9NQmx1ZXRvb3RoQ29leGlzdDsKLQlwSGFsRGF0YS0+YnRfY29leGlzdC5CVF9BbnRfTnVtID0gcEhhbERhdGEtPkVFUFJPTUJsdWV0b290aEFudE51bTsKLQlwSGFsRGF0YS0+YnRfY29leGlzdC5CVF9Db2V4aXN0VHlwZSA9IHBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhUeXBlOwotCXBIYWxEYXRhLT5idF9jb2V4aXN0LkJUX0FudF9pc29sYXRpb24gPSBwSGFsRGF0YS0+RUVQUk9NQmx1ZXRvb3RoQW50SXNvbGF0aW9uOwotCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJ0X3JhZGlvc2hhcmVkdHlwZSA9IHBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhSYWRpb1NoYXJlZDsKLQotCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAiQlQgQ29leGlzdGFuY2UgPSAweCV4XG4iLCBydGw4NzIzYV9CVF9jb2V4aXN0KHBhZGFwdGVyKSk7Ci0KLQlpZiAocnRsODcyM2FfQlRfY29leGlzdChwYWRhcHRlcikpIHsKLQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkJUX0FudF9OdW0gPT0gQW50X3gyKSB7Ci0JCQlCVERNX1NldEJ0Q29leEN1cnJBbnROdW0ocGFkYXB0ZXIsIDIpOwotCQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCQkgIkJsdWVUb290aCBCVF9BbnRfTnVtID0gQW50eDJcbiIpOwotCQl9IGVsc2UgaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkJUX0FudF9OdW0gPT0gQW50X3gxKSB7Ci0JCQlCVERNX1NldEJ0Q29leEN1cnJBbnROdW0ocGFkYXB0ZXIsIDEpOwotCQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCQkgIkJsdWVUb290aCBCVF9BbnRfTnVtID0gQW50eDFcbiIpOwotCQl9Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJCVEJ1c3lUcmFmZmljID0gZmFsc2U7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJCVFRyYWZmaWNNb2RlU2V0ID0gZmFsc2U7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJCVE5vblRyYWZmaWNNb2RlU2V0ID0gZmFsc2U7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSA9IDA7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LlByZXZpb3VzU3RhdGUgPSAwOwotCi0JCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgImJ0X3JhZGlvc2hhcmVkVHlwZSA9IDB4JXhcbiIsCi0JCQkgcEhhbERhdGEtPmJ0X2NvZXhpc3QuYnRfcmFkaW9zaGFyZWR0eXBlKTsKLQl9Ci19Ci0KLWJvb2wgcnRsODcyM2FfQlRfY29leGlzdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkJsdWV0b290aENvZXhpc3QpCi0JCXJldHVybiB0cnVlOwotCWVsc2UKLQkJcmV0dXJuIGZhbHNlOwotfQotCi11OCBIQUxCVF9CVENoaXBUeXBlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlyZXR1cm4gcEhhbERhdGEtPmJ0X2NvZXhpc3QuQlRfQ29leGlzdFR5cGU7Ci19Ci0KLXZvaWQgcnRsODcyM2FfQlRfaW5pdF9od2NvbmZpZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCWhhbGJ0X0luaXRId0NvbmZpZzg3MjNBKHBhZGFwdGVyKTsKLQlydGw4NzIzYV9CVF9kb19jb2V4aXN0KHBhZGFwdGVyKTsKLX0KLQotdm9pZCBIQUxCVF9TZXRSdHNDdHNOb0xlbkxpbWl0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci19Ci0KLS8qICA9PT09PSBFbmQgb2Ygc3luYyBmcm9tIFNENyBkcml2ZXIgSEFML0hhbEJULmMgPT09PT0gKi8KLQotdm9pZCBydGw4NzIzYV9kdWFsX2FudGVubmFfZGV0ZWN0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQlzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG07Ci0Jc3RydWN0IHN3X2FudF9zdyAqcERNX1NXQVRfVGFibGU7Ci0JdTggaTsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlwRE1fT2RtID0gJnBIYWxEYXRhLT5vZG1wcml2OwotCXBETV9TV0FUX1RhYmxlID0gJnBETV9PZG0tPkRNX1NXQVRfVGFibGU7Ci0KLQkvKiAgKi8KLQkvKiAgPFJvZ2VyX05vdGVzPiBSVEw4NzIzQSBTaW5nbGUgYW5kIER1YWwgYW50ZW5uYSBkeW5hbWljIGRldGVjdGlvbgotCSAgICBtZWNoYW5pc20gd2hlbiBSRiBwb3dlciBzdGF0ZSBpcyBvbi4gKi8KLQkvKiAgV2Ugc2hvdWxkIHRha2UgcG93ZXIgdHJhY2tpbmcsIElRSywgTENLLCBSQ0sgUkYgcmVhZC93cml0ZQotCSAgICBvcGVyYXRpb24gaW50byBjb25zaWRlcmF0aW9uLiAqLwotCS8qICAyMDExLjEyLjE1LiAqLwotCS8qICAqLwotCWlmICghcEhhbERhdGEtPmJBbnRlbm5hRGV0ZWN0ZWQpIHsKLQkJdTggYnRBbnROdW0gPSBCVF9HZXRQR0FudE51bShwYWRhcHRlcik7Ci0KLQkJLyogIFNldCBkZWZhdWx0IGFudGVubmEgQiBzdGF0dXMgKi8KLQkJaWYgKGJ0QW50TnVtID09IEFudF94MikKLQkJCXBETV9TV0FUX1RhYmxlLT5BTlRCX09OID0gdHJ1ZTsKLQkJZWxzZSBpZiAoYnRBbnROdW0gPT0gQW50X3gxKQotCQkJcERNX1NXQVRfVGFibGUtPkFOVEJfT04gPSBmYWxzZTsKLQkJZWxzZQotCQkJcERNX1NXQVRfVGFibGUtPkFOVEJfT04gPSB0cnVlOwotCi0JCWlmIChwSGFsRGF0YS0+Q3VzdG9tZXJJRCAhPSBSVF9DSURfVE9TSElCQSkgewotCQkJZm9yIChpID0gMDsgaSA8IE1BWF9BTlRFTk5BX0RFVEVDVElPTl9DTlQ7IGkrKykgewotCQkJCWlmIChPRE1fU2luZ2xlRHVhbEFudGVubmFEZXRlY3Rpb24KLQkJCQkgICAgKCZwSGFsRGF0YS0+b2RtcHJpdiwgQU5UVEVTVEFMTCkgPT0gdHJ1ZSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8qICBTZXQgZGVmYXVsdCBhbnRlbm5hIG51bWJlciBmb3IgQlQgY29leGlzdGVuY2UgKi8KLQkJCWlmIChidEFudE51bSA9PSBBbnRfeDIpCi0JCQkJQlRfU2V0QnRDb2V4Q3VyckFudE51bShwYWRhcHRlciwKLQkJCQkJCSAgICAgICBwRE1fU1dBVF9UYWJsZS0+Ci0JCQkJCQkgICAgICAgQU5UQl9PTiA/IDIgOiAxKTsKLQkJfQotCQlwSGFsRGF0YS0+YkFudGVubmFEZXRlY3RlZCA9IHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfY21kLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9jbWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIzMGY0Yy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9jbWQuYworKysgL2Rldi9udWxsCkBAIC0xLDc1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEyIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX1JUTDg3MjNBX0NNRF9DXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPHJlY3Zfb3NkZXAuaD4KLSNpbmNsdWRlIDxtbG1lX29zZGVwLmg+Ci0jaW5jbHVkZSA8cnRsODcyM2FfaGFsLmg+Ci0jaW5jbHVkZSA8dXNiX29wc19saW51eC5oPgotCi0jZGVmaW5lIFJUTDkyQ19NQVhfSDJDX0JPWF9OVU1TCQk0Ci0jZGVmaW5lIFJUTDkyQ19NQVhfQ01EX0xFTgkJNQotI2RlZmluZSBNRVNTQUdFX0JPWF9TSVpFCQk0Ci0jZGVmaW5lIEVYX01FU1NBR0VfQk9YX1NJWkUJCTIKLQotc3RhdGljIHU4IF9pc19md19yZWFkX2NtZF9kb3duKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IG1zZ2JveF9udW0pCi17Ci0JdTggcmVhZF9kb3duID0gZmFsc2U7Ci0JaW50CXJldHJ5X2NudHMgPSAxMDA7Ci0JdTggdmFsaWQ7Ci0KLQlkbyB7Ci0JCXZhbGlkID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBSRUdfSE1FVEZSKSAmIEJJVChtc2dib3hfbnVtKTsKLQkJaWYgKDAgPT0gdmFsaWQpCi0JCQlyZWFkX2Rvd24gPSB0cnVlOwotCX0gd2hpbGUgKCghcmVhZF9kb3duKSAmJiAocmV0cnlfY250cy0tKSk7Ci0KLQlyZXR1cm4gcmVhZF9kb3duOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogSDJDIE1zZyBmb3JtYXQgOgotKnwgMzEgLSA4CQl8NwkJfCA2IC0gMAl8Ci0qfCBoMmNfbXNnCXxFeHRfYml0CXxDTURfSUQJfAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IEZpbGxIMkNDbWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggRWxlbWVudElELCB1MzIgQ21kTGVuLAotCSAgICAgICB1OCAqcENtZEJ1ZmZlcikKLXsKLQl1OCBiY21kX2Rvd24gPSBmYWxzZTsKLQlzMzIgcmV0cnlfY250cyA9IDEwMDsKLQl1OCBoMmNfYm94X251bTsKLQl1MzIgbXNnYm94X2FkZHI7Ci0JdTMyIG1zZ2JveF9leF9hZGRyOwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0JdTMyIGgyY19jbWQgPSAwOwotCXUxNiBoMmNfY21kX2V4ID0gMDsKLQlpbnQgcmV0ID0gX0ZBSUw7Ci0KLQlwYWRhcHRlciA9IEdFVF9QUklNQVJZX0FEQVBURVIocGFkYXB0ZXIpOwotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCW11dGV4X2xvY2soJmFkYXB0ZXJfdG9fZHZvYmoocGFkYXB0ZXIpLT5oMmNfZndjbWRfbXV0ZXgpOwotCi0JaWYgKCFwQ21kQnVmZmVyKQotCQlnb3RvIGV4aXQ7Ci0JaWYgKENtZExlbiA+IFJUTDkyQ19NQVhfQ01EX0xFTikKLQkJZ290byBleGl0OwotCWlmIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCA9PSB0cnVlKQotCQlnb3RvIGV4aXQ7Ci0KLQkvKiBwYXkgYXR0ZW50aW9uIHRvIGlmICByYWNlIGNvbmRpdGlvbiBoYXBwZW5lZCBpbiAgSDJDIGNtZCBzZXR0aW5nLiAqLwotCWRvIHsKLQkJaDJjX2JveF9udW0gPSBwSGFsRGF0YS0+TGFzdEhNRUJveE51bTsKLQotCQlpZiAoIV9pc19md19yZWFkX2NtZF9kb3duKHBhZGFwdGVyLCBoMmNfYm94X251bSkpIHsKLQkJCURCR184NzIzQSgiIGZ3IHJlYWQgY21kIGZhaWxlZC4uLlxuIik7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCQlpZiAoQ21kTGVuIDw9IDMpIHsKLQkJCW1lbWNweSgodTggKikoJmgyY19jbWQpKzEsIHBDbWRCdWZmZXIsIENtZExlbik7Ci0JCX0gZWxzZSB7Ci0JCQltZW1jcHkoKHU4ICopKCZoMmNfY21kX2V4KSwgcENtZEJ1ZmZlciwgRVhfTUVTU0FHRV9CT1hfU0laRSk7Ci0JCQltZW1jcHkoKHU4ICopKCZoMmNfY21kKSsxLCBwQ21kQnVmZmVyKzIsIChDbWRMZW4tRVhfTUVTU0FHRV9CT1hfU0laRSkpOwotCQkJKih1OCAqKSgmaDJjX2NtZCkgfD0gQklUKDcpOwotCQl9Ci0KLQkJKih1OCAqKSgmaDJjX2NtZCkgfD0gRWxlbWVudElEOwotCi0JCWlmIChoMmNfY21kICYgQklUKDcpKSB7Ci0JCQltc2dib3hfZXhfYWRkciA9IFJFR19ITUVCT1hfRVhUXzAgKyAoaDJjX2JveF9udW0gKiBFWF9NRVNTQUdFX0JPWF9TSVpFKTsKLQkJCWgyY19jbWRfZXggPSBsZTE2X3RvX2NwdShoMmNfY21kX2V4KTsKLQkJCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBtc2dib3hfZXhfYWRkciwgaDJjX2NtZF9leCk7Ci0JCX0KLQkJbXNnYm94X2FkZHIgPSBSRUdfSE1FQk9YXzAgKyAoaDJjX2JveF9udW0gKiBNRVNTQUdFX0JPWF9TSVpFKTsKLQkJaDJjX2NtZCA9IGxlMzJfdG9fY3B1KGgyY19jbWQpOwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgbXNnYm94X2FkZHIsIGgyY19jbWQpOwotCi0JCWJjbWRfZG93biA9IHRydWU7Ci0KLQkJcEhhbERhdGEtPkxhc3RITUVCb3hOdW0gPSAoaDJjX2JveF9udW0rMSkgJSBSVEw5MkNfTUFYX0gyQ19CT1hfTlVNUzsKLQotCX0gd2hpbGUgKCghYmNtZF9kb3duKSAmJiAocmV0cnlfY250cy0tKSk7Ci0KLQlyZXQgPSBfU1VDQ0VTUzsKLQotZXhpdDoKLQltdXRleF91bmxvY2soJmFkYXB0ZXJfdG9fZHZvYmoocGFkYXB0ZXIpLT5oMmNfZndjbWRfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KLWludCBydGw4NzIzYV9zZXRfcnNzaV9jbWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIHBhcmFtKQotewotCV9fbGUzMiBjbWQgPSBjcHVfdG9fbGUzMihwYXJhbSk7Ci0KLQlGaWxsSDJDQ21kKHBhZGFwdGVyLCBSU1NJX1NFVFRJTkdfRUlELCAzLCAodm9pZCAqKSZjbWQpOwotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1pbnQgcnRsODcyM2Ffc2V0X3JhaWRfY21kKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiBtYXNrLCB1OCBhcmcpCi17Ci0JdTggYnVmWzVdOwotCi0JbWVtc2V0KGJ1ZiwgMCwgNSk7Ci0JcHV0X3VuYWxpZ25lZF9sZTMyKG1hc2ssIGJ1Zik7Ci0JYnVmWzRdICA9IGFyZzsKLQotCUZpbGxIMkNDbWQocGFkYXB0ZXIsIE1BQ0lEX0NPTkZJR19FSUQsIDUsIGJ1Zik7Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLS8qIGJpdG1hcFswOjI3XSA9IHR4X3JhdGVfYml0bWFwICovCi0vKiBiaXRtYXBbMjg6MzFdPSBSYXRlIEFkYXB0aXZlIGlkICovCi0vKiBhcmdbMDo0XSA9IG1hY2lkICovCi0vKiBhcmdbNV0gPSBTaG9ydCBHSSAqLwotdm9pZCBydGw4NzIzYV9hZGRfcmF0ZWF0aWQoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTMyIGJpdG1hcCwgdTggYXJnLCB1OCByc3NpX2xldmVsKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocEFkYXB0ZXIpOwotCXU4IG1hY2lkID0gYXJnICYgMHgxZjsKLQl1MzIgcmFpZCA9IGJpdG1hcCAmIDB4ZjAwMDAwMDA7Ci0KLQliaXRtYXAgJj0gMHgwZmZmZmZmZjsKLQlpZiAocnNzaV9sZXZlbCAhPSBETV9SQVRSX1NUQV9JTklUKQotCQliaXRtYXAgPSBPRE1fR2V0X1JhdGVfQml0bWFwMjNhKHBIYWxEYXRhLCBtYWNpZCwgYml0bWFwLAotCQkJCQkJcnNzaV9sZXZlbCk7Ci0KLQliaXRtYXAgfD0gcmFpZDsKLQotCXJ0bDg3MjNhX3NldF9yYWlkX2NtZChwQWRhcHRlciwgYml0bWFwLCBhcmcpOwotfQotCi12b2lkIHJ0bDg3MjNhX3NldF9Gd1B3ck1vZGVfY21kKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IE1vZGUpCi17Ci0Jc3RydWN0IHNldHB3cm1vZGVfcGFybSBIMkNTZXRQd3JNb2RlOwotCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cnByaXYgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JREJHXzg3MjNBKCIlczogTW9kZSA9JWQgU21hcnRQUyA9JWQgVUFQU0QgPSVkIEJjbk1vZGUgPSAweCUwMnhcbiIsIF9fZnVuY19fLAotCQkJTW9kZSwgcHdycHJpdi0+c21hcnRfcHMsIHBhZGFwdGVyLT5yZWdpc3RyeXByaXYudWFwc2RfZW5hYmxlLCBwd3Jwcml2LT5iY25fYW50X21vZGUpOwotCi0JLyogIEZvcmVjZSBsZWF2ZSBSRiBsb3cgcG93ZXIgbW9kZSBmb3IgMVQxUiB0bwotCSAgICBwcmV2ZW50IGNvbmZpY3Rpbmcgc2V0dGluZyBpbiBGdyBwb3dlciAqLwotCS8qICBzYXZpbmcgc2VxdWVuY2UuIDIwMTAuMDYuMDcuIEFkZGVkIGJ5IHR5bmxpLgotCSAgICBTdWdnZXN0ZWQgYnkgU0QzIHlzY2hhbmcuICovCi0JaWYgKE1vZGUgIT0gUFNfTU9ERV9BQ1RJVkUgJiYgcEhhbERhdGEtPnJmX3R5cGUgIT0gUkZfMlQyUikKLQkJT0RNX1JGX1NhdmluZzIzYSgmcEhhbERhdGEtPm9kbXByaXYsIHRydWUpOwotCi0JSDJDU2V0UHdyTW9kZS5Nb2RlID0gTW9kZTsKLQlIMkNTZXRQd3JNb2RlLlNtYXJ0UFMgPSBwd3Jwcml2LT5zbWFydF9wczsKLQlIMkNTZXRQd3JNb2RlLkF3YWtlSW50ZXJ2YWwgPSAxOwotCUgyQ1NldFB3ck1vZGUuYkFsbFF1ZXVlVUFQU0QgPSBwYWRhcHRlci0+cmVnaXN0cnlwcml2LnVhcHNkX2VuYWJsZTsKLQlIMkNTZXRQd3JNb2RlLkJjbkFudE1vZGUgPSBwd3Jwcml2LT5iY25fYW50X21vZGU7Ci0KLQlGaWxsSDJDQ21kKHBhZGFwdGVyLCBTRVRfUFdSTU9ERV9FSUQsIHNpemVvZihIMkNTZXRQd3JNb2RlKSwgKHU4ICopJkgyQ1NldFB3ck1vZGUpOwotCi19Ci0KLXN0YXRpYyB2b2lkCi1Db25zdHJ1Y3RCZWFjb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnBmcmFtZSwgdTMyICpwTGVuZ3RoKQotewotCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdDsKLQl1MzIgcmF0ZV9sZW4sIHBrdGxlbjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpjdXJfbmV0d29yayA9ICZwbWxtZWluZm8tPm5ldHdvcms7Ci0JdTggYmNfYWRkcltdID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwotCi0JLyogREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOyAqLwotCi0JbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKilwZnJhbWU7Ci0KLQltZ210LT5mcmFtZV9jb250cm9sID0KLQkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfCBJRUVFODAyMTFfU1RZUEVfQkVBQ09OKTsKLQotCWV0aGVyX2FkZHJfY29weShtZ210LT5kYSwgYmNfYWRkcik7Ci0JZXRoZXJfYWRkcl9jb3B5KG1nbXQtPnNhLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdikpOwotCWV0aGVyX2FkZHJfY29weShtZ210LT5ic3NpZCwgZ2V0X215X2Jzc2lkMjNhKGN1cl9uZXR3b3JrKSk7Ci0KLQkvKiBBIEJlYWNvbiBmcmFtZSBzaG91bGRuJ3QgaGF2ZSBmcmFnbWVudCBiaXRzIHNldCAqLwotCW1nbXQtPnNlcV9jdHJsID0gMDsKLQotCS8qIHRpbWVzdGFtcCB3aWxsIGJlIGluc2VydGVkIGJ5IGhhcmR3YXJlICovCi0KLQlwdXRfdW5hbGlnbmVkX2xlMTYoY3VyX25ldHdvcmstPmJlYWNvbl9pbnRlcnZhbCwKLQkJCSAgICZtZ210LT51LmJlYWNvbi5iZWFjb25faW50KTsKLQotCXB1dF91bmFsaWduZWRfbGUxNihjdXJfbmV0d29yay0+Y2FwYWJpbGl0eSwKLQkJCSAgICZtZ210LT51LmJlYWNvbi5jYXBhYl9pbmZvKTsKLQotCXBmcmFtZSA9IG1nbXQtPnUuYmVhY29uLnZhcmlhYmxlOwotCXBrdGxlbiA9IG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5iZWFjb24udmFyaWFibGUpOwotCi0JaWYgKChwbWxtZWluZm8tPnN0YXRlJjB4MDMpID09IE1TUl9BUCkgewotCQkvKiBEQkdfODcyM0EoImllIGxlbiA9JWRcbiIsIGN1cl9uZXR3b3JrLT5JRUxlbmd0aCk7ICovCi0JCXBrdGxlbiArPSBjdXJfbmV0d29yay0+SUVMZW5ndGg7Ci0JCW1lbWNweShwZnJhbWUsIGN1cl9uZXR3b3JrLT5JRXMsIHBrdGxlbik7Ci0KLQkJZ290byBfQ29uc3RydWN0QmVhY29uOwotCX0KLQotCS8qIGJlbG93IGZvciBhZC1ob2MgbW9kZSAqLwotCi0JLyogIFNTSUQgKi8KLQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfU1NJRCwKLQkJCSAgICAgICBjdXJfbmV0d29yay0+U3NpZC5zc2lkX2xlbiwKLQkJCSAgICAgICBjdXJfbmV0d29yay0+U3NpZC5zc2lkLCAmcGt0bGVuKTsKLQotCS8qICBzdXBwb3J0ZWQgcmF0ZXMuLi4gKi8KLQlyYXRlX2xlbiA9IHJ0d19nZXRfcmF0ZXNldF9sZW4yM2EoY3VyX25ldHdvcmstPlN1cHBvcnRlZFJhdGVzKTsKLQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfU1VQUF9SQVRFUywgKChyYXRlX2xlbiA+IDgpID8KLQkJCSAgICAgICA4IDogcmF0ZV9sZW4pLCBjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMsICZwa3RsZW4pOwotCi0JLyogIERTIHBhcmFtZXRlciBzZXQgKi8KLQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfRFNfUEFSQU1TLCAxLCAodW5zaWduZWQgY2hhciAqKQotCQkJICAgICAgICZjdXJfbmV0d29yay0+RFNDb25maWcsICZwa3RsZW4pOwotCi0JaWYgKChwbWxtZWluZm8tPnN0YXRlJjB4MDMpID09IE1TUl9BREhPQykgewotCQl1MzIgQVRJTVdpbmRvdzsKLQkJLyogIElCU1MgUGFyYW1ldGVyIFNldC4uLiAqLwotCQkvKiBBVElNV2luZG93ID0gY3VyLT5BVElNV2luZG93OyAqLwotCQlBVElNV2luZG93ID0gMDsKLQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX0lCU1NfUEFSQU1TLCAyLAotCQkJCSAgICAgICAodW5zaWduZWQgY2hhciAqKSZBVElNV2luZG93LCAmcGt0bGVuKTsKLQl9Ci0KLQkvKiB0b2RvOiBFUlAgSUUgKi8KLQotCS8qICBFWFRFUk5ERUQgU1VQUE9SVEVEIFJBVEUgKi8KLQlpZiAocmF0ZV9sZW4gPiA4KQotCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfRVhUX1NVUFBfUkFURVMsCi0JCQkJICAgICAgIChyYXRlX2xlbiAtIDgpLAotCQkJCSAgICAgICAoY3VyX25ldHdvcmstPlN1cHBvcnRlZFJhdGVzICsgOCksCi0JCQkJICAgICAgICZwa3RsZW4pOwotCi0JLyogdG9kbzpIVCBmb3IgYWRob2MgKi8KLQotX0NvbnN0cnVjdEJlYWNvbjoKLQotCWlmICgocGt0bGVuICsgVFhERVNDX1NJWkUpID4gNTEyKSB7Ci0JCURCR184NzIzQSgiYmVhY29uIGZyYW1lIHRvbyBsYXJnZVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQkqcExlbmd0aCA9IHBrdGxlbjsKLQotCS8qIERCR184NzIzQSgiJXMgYmNuX3N6ID0lZFxuIiwgX19mdW5jX18sIHBrdGxlbik7ICovCi0KLX0KLQotc3RhdGljIHZvaWQgQ29uc3RydWN0UFNQb2xsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgdTggKnBmcmFtZSwgdTMyICpwTGVuZ3RoKQotewotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpwd2xhbmhkcjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JcHdsYW5oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilwZnJhbWU7Ci0KLQkvKiAgRnJhbWUgY29udHJvbC4gKi8KLQlwd2xhbmhkci0+ZnJhbWVfY29udHJvbCA9Ci0JCWNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9DVEwgfCBJRUVFODAyMTFfU1RZUEVfUFNQT0xMKTsKLQlwd2xhbmhkci0+ZnJhbWVfY29udHJvbCB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9QTSk7Ci0KLQkvKiAgQUlELiAqLwotCXB3bGFuaGRyLT5kdXJhdGlvbl9pZCA9IGNwdV90b19sZTE2KHBtbG1laW5mby0+YWlkIHwgMHhjMDAwKTsKLQotCS8qICBCU1NJRC4gKi8KLQltZW1jcHkocHdsYW5oZHItPmFkZHIxLCBnZXRfbXlfYnNzaWQyM2EoJnBtbG1laW5mby0+bmV0d29yayksIEVUSF9BTEVOKTsKLQotCS8qICBUQS4gKi8KLQltZW1jcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdiksIEVUSF9BTEVOKTsKLQotCSpwTGVuZ3RoID0gMTY7Ci19Ci0KLXN0YXRpYyB2b2lkCi1Db25zdHJ1Y3ROdWxsRnVuY3Rpb25EYXRhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpwZnJhbWUsCi0JCQkgIHUzMiAqcExlbmd0aCwgdTggKlN0YUFkZHIsIHU4IGJRb1MsIHU4IEFDLAotCQkJICB1OCBiRW9zcCwgdTggYkZvcmNlUG93ZXJTYXZlKQotewotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpwd2xhbmhkcjsKLQl1MzIgcGt0bGVuOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqY3VyX25ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yazsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JcHdsYW5oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilwZnJhbWU7Ci0KLQlwd2xhbmhkci0+ZnJhbWVfY29udHJvbCA9IDA7Ci0JcHdsYW5oZHItPnNlcV9jdHJsID0gMDsKLQotCWlmIChiRm9yY2VQb3dlclNhdmUpCi0JCXB3bGFuaGRyLT5mcmFtZV9jb250cm9sIHw9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX1BNKTsKLQotCXN3aXRjaCAoY3VyX25ldHdvcmstPm5ldHdvcmsuaWZtb2RlKSB7Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UOgotCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKLQkJcHdsYW5oZHItPmZyYW1lX2NvbnRyb2wgfD0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfVE9EUyk7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjEsCi0JCSAgICAgICBnZXRfbXlfYnNzaWQyM2EoJnBtbG1laW5mby0+bmV0d29yayksIEVUSF9BTEVOKTsKLQkJbWVtY3B5KHB3bGFuaGRyLT5hZGRyMiwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpLAotCQkgICAgICAgRVRIX0FMRU4pOwotCQltZW1jcHkocHdsYW5oZHItPmFkZHIzLCBTdGFBZGRyLCBFVEhfQUxFTik7Ci0JCWJyZWFrOwotCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0dPOgotCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6Ci0JCXB3bGFuaGRyLT5mcmFtZV9jb250cm9sIHw9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX0ZST01EUyk7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjEsIFN0YUFkZHIsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KHB3bGFuaGRyLT5hZGRyMiwKLQkJICAgICAgIGdldF9teV9ic3NpZDIzYSgmcG1sbWVpbmZvLT5uZXR3b3JrKSwgRVRIX0FMRU4pOwotCQltZW1jcHkocHdsYW5oZHItPmFkZHIzLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdiksCi0JCSAgICAgICBFVEhfQUxFTik7Ci0JCWJyZWFrOwotCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6Ci0JZGVmYXVsdDoKLQkJbWVtY3B5KHB3bGFuaGRyLT5hZGRyMSwgU3RhQWRkciwgRVRIX0FMRU4pOwotCQltZW1jcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdiksIEVUSF9BTEVOKTsKLQkJbWVtY3B5KHB3bGFuaGRyLT5hZGRyMywKLQkJICAgICAgIGdldF9teV9ic3NpZDIzYSgmcG1sbWVpbmZvLT5uZXR3b3JrKSwgRVRIX0FMRU4pOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoYlFvUyA9PSB0cnVlKSB7Ci0JCXN0cnVjdCBpZWVlODAyMTFfcW9zX2hkciAqcW9zaGRyOwotCQlxb3NoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyICopcGZyYW1lOwotCi0JCXFvc2hkci0+ZnJhbWVfY29udHJvbCB8PQotCQkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX0RBVEEgfAotCQkJCSAgICBJRUVFODAyMTFfU1RZUEVfUU9TX05VTExGVU5DKTsKLQotCQlxb3NoZHItPnFvc19jdHJsID0gY3B1X3RvX2xlMTYoQUMgJiBJRUVFODAyMTFfUU9TX0NUTF9USURfTUFTSyk7Ci0JCWlmIChiRW9zcCkKLQkJCXFvc2hkci0+cW9zX2N0cmwgfD0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1FPU19DVExfRU9TUCk7Ci0KLQkJcGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcW9zX2hkcik7Ci0JfSBlbHNlIHsKLQkJcHdsYW5oZHItPmZyYW1lX2NvbnRyb2wgfD0KLQkJCWNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9EQVRBIHwKLQkJCQkgICAgSUVFRTgwMjExX1NUWVBFX05VTExGVU5DKTsKLQotCQlwa3RsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwotCX0KLQotCSpwTGVuZ3RoID0gcGt0bGVuOwotfQotCi1zdGF0aWMgdm9pZCBDb25zdHJ1Y3RQcm9iZVJzcChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcGZyYW1lLAotCQkJICAgICAgdTMyICpwTGVuZ3RoLCB1OCAqU3RhQWRkciwgYm9vbCBiSGlkZVNTSUQpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwotCXU4ICptYWMsICpic3NpZDsKLQl1MzIgcGt0bGVuOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKmN1cl9uZXR3b3JrID0gJnBtbG1laW5mby0+bmV0d29yazsKLQotCS8qIERCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsgKi8KLQotCW1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopcGZyYW1lOwotCi0JbWFjID0gbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpOwotCWJzc2lkID0gY3VyX25ldHdvcmstPk1hY0FkZHJlc3M7Ci0KLQltZ210LT5mcmFtZV9jb250cm9sID0KLQkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfCBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCk7Ci0KLQltZ210LT5zZXFfY3RybCA9IDA7Ci0KLQltZW1jcHkobWdtdC0+ZGEsIFN0YUFkZHIsIEVUSF9BTEVOKTsKLQltZW1jcHkobWdtdC0+c2EsIG1hYywgRVRIX0FMRU4pOwotCW1lbWNweShtZ210LT5ic3NpZCwgYnNzaWQsIEVUSF9BTEVOKTsKLQotCXB1dF91bmFsaWduZWRfbGU2NChjdXJfbmV0d29yay0+dHNmLAotCQkJICAgJm1nbXQtPnUucHJvYmVfcmVzcC50aW1lc3RhbXApOwotCXB1dF91bmFsaWduZWRfbGUxNihjdXJfbmV0d29yay0+YmVhY29uX2ludGVydmFsLAotCQkJICAgJm1nbXQtPnUucHJvYmVfcmVzcC5iZWFjb25faW50KTsKLQlwdXRfdW5hbGlnbmVkX2xlMTYoY3VyX25ldHdvcmstPmNhcGFiaWxpdHksCi0JCQkgICAmbWdtdC0+dS5wcm9iZV9yZXNwLmNhcGFiX2luZm8pOwotCi0JcGt0bGVuID0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LnByb2JlX3Jlc3AudmFyaWFibGUpOwotCi0JaWYgKGN1cl9uZXR3b3JrLT5JRUxlbmd0aCA+IE1BWF9JRV9TWikKLQkJcmV0dXJuOwotCi0JbWVtY3B5KG1nbXQtPnUucHJvYmVfcmVzcC52YXJpYWJsZSwgY3VyX25ldHdvcmstPklFcywKLQkgICAgICAgY3VyX25ldHdvcmstPklFTGVuZ3RoKTsKLQlwa3RsZW4gKz0gKGN1cl9uZXR3b3JrLT5JRUxlbmd0aCk7Ci0KLQkqcExlbmd0aCA9IHBrdGxlbjsKLX0KLQotLyogICovCi0vKiAgRGVzY3JpcHRpb246IEZpbGwgdGhlIHJlc2VydmVkIHBhY2tldHMgdGhhdCBGVyB3aWxsIHVzZSB0byBSU1ZEIHBhZ2UuICovCi0vKgkJCU5vdyB3ZSBqdXN0IHNlbmQgNCB0eXBlcyBwYWNrZXQgdG8gcnN2ZCBwYWdlLiAqLwotLyoJCQkoMSlCZWFjb24sICgyKVBzLXBvbGwsICgzKU51bGwgZGF0YSwgKDQpUHJvYmVSc3AuICovCi0vKglJbnB1dDogKi8KLS8qCSAgICBiRExGaW5pc2hlZCAtIGZhbHNlOiBBdCB0aGUgZmlyc3QgdGltZSB3ZSB3aWxsIHNlbmQgYWxsIHRoZSBwYWNrZXRzIGFzIGEgbGFyZ2UgcGFja2V0IHRvIEh3LCAqLwotLyoJCQkJCQlzbyB3ZSBuZWVkIHRvIHNldCB0aGUgcGFja2V0IGxlbmd0aCB0byB0b3RhbCBsZW5naC4gKi8KLS8qCQkJICAgICAgdHJ1ZTogQXQgdGhlIHNlY29uZCB0aW1lLCB3ZSBzaG91bGQgc2VuZCB0aGUgZmlyc3QgcGFja2V0IChkZWZhdWx0OmJlYWNvbikgKi8KLS8qCQkJCQkJdG8gSHcgYWdhaW4gYW5kIHNldCB0aGUgbGVuZ2ggaW4gZGVzY3JpcHRvciB0byB0aGUgcmVhbCBiZWFjb24gbGVuZ2guICovCi0vKiAgMjAwOS4xMC4xNSBieSB0eW5saS4gKi8KLXN0YXRpYyB2b2lkIFNldEZ3UnN2ZFBhZ2VQa3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgYm9vbCBiRExGaW5pc2hlZCkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lOwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQ7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbzsKLQl1MzIgQmVhY29uTGVuZ3RoID0gMCwgUHJvYmVSc3BMZW5ndGggPSAwLCBQU1BvbGxMZW5ndGg7Ci0JdTMyIE51bGxEYXRhTGVuZ3RoLCBRb3NOdWxsTGVuZ3RoLCBCVFFvc051bGxMZW5ndGg7Ci0JdTggKlJlc2VydmVkUGFnZVBhY2tldDsKLQl1OCBQYWdlTnVtLCBQYWdlTmVlZCwgVHhEZXNjTGVuOwotCXUxNiBCdWZJbmRleDsKLQl1MzIgVG90YWxQYWNrZXRMZW47Ci0Jc3RydWN0IHJzdmRwYWdlX2xvYwlSc3ZkUGFnZUxvYzsKLQotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCVJlc2VydmVkUGFnZVBhY2tldCA9IGt6YWxsb2MoMTAwMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKFJlc2VydmVkUGFnZVBhY2tldCA9PSBOVUxMKSB7Ci0JCURCR184NzIzQSgiJXM6IGFsbG9jIFJlc2VydmVkUGFnZVBhY2tldCBmYWlsIVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0JcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlUeERlc2NMZW4gPSBUWERFU0NfU0laRTsKLQlQYWdlTnVtID0gMDsKLQotCS8qIDMgKDEpIGJlYWNvbiAqLwotCUJ1ZkluZGV4ID0gVFhERVNDX09GRlNFVDsKLQlDb25zdHJ1Y3RCZWFjb24ocGFkYXB0ZXIsICZSZXNlcnZlZFBhZ2VQYWNrZXRbQnVmSW5kZXhdLCAmQmVhY29uTGVuZ3RoKTsKLQotCS8qICBXaGVuIHdlIGNvdW50IHRoZSBmaXJzdCBwYWdlIHNpemUsIHdlIG5lZWQgdG8gcmVzZXJ2ZSBkZXNjcmlwdGlvbiBzaXplIGZvciB0aGUgUlNWRCAqLwotCS8qICBwYWNrZXQsIGl0IHdpbGwgYmUgZmlsbGVkIGluIGZyb250IG9mIHRoZSBwYWNrZXQgaW4gVFhQS1RCVUYuICovCi0JUGFnZU5lZWQgPSAodTgpUGFnZU51bV8xMjgoVHhEZXNjTGVuICsgQmVhY29uTGVuZ3RoKTsKLQkvKiAgVG8gcmVzZXJ2ZWQgMiBwYWdlcyBmb3IgYmVhY29uIGJ1ZmZlci4gMjAxMC4wNi4yNC4gKi8KLQlpZiAoUGFnZU5lZWQgPT0gMSkKLQkJUGFnZU5lZWQgKz0gMTsKLQlQYWdlTnVtICs9IFBhZ2VOZWVkOwotCXBIYWxEYXRhLT5Gd1JzdmRQYWdlU3RhcnRPZmZzZXQgPSBQYWdlTnVtOwotCi0JQnVmSW5kZXggKz0gUGFnZU5lZWQqMTI4OwotCi0JLyogMyAoMikgcHMtcG9sbCAqLwotCVJzdmRQYWdlTG9jLkxvY1BzUG9sbCA9IFBhZ2VOdW07Ci0JQ29uc3RydWN0UFNQb2xsKHBhZGFwdGVyLCAmUmVzZXJ2ZWRQYWdlUGFja2V0W0J1ZkluZGV4XSwgJlBTUG9sbExlbmd0aCk7Ci0JcnRsODcyM2FfZmlsbF9mYWtlX3R4ZGVzYyhwYWRhcHRlciwgJlJlc2VydmVkUGFnZVBhY2tldFtCdWZJbmRleC1UeERlc2NMZW5dLCBQU1BvbGxMZW5ndGgsIHRydWUsIGZhbHNlKTsKLQotCVBhZ2VOZWVkID0gKHU4KVBhZ2VOdW1fMTI4KFR4RGVzY0xlbiArIFBTUG9sbExlbmd0aCk7Ci0JUGFnZU51bSArPSBQYWdlTmVlZDsKLQotCUJ1ZkluZGV4ICs9IFBhZ2VOZWVkKjEyODsKLQotCS8qIDMgKDMpIG51bGwgZGF0YSAqLwotCVJzdmRQYWdlTG9jLkxvY051bGxEYXRhID0gUGFnZU51bTsKLQlDb25zdHJ1Y3ROdWxsRnVuY3Rpb25EYXRhKHBhZGFwdGVyLCAmUmVzZXJ2ZWRQYWdlUGFja2V0W0J1ZkluZGV4XSwKLQkJCQkgICZOdWxsRGF0YUxlbmd0aCwKLQkJCQkgIGdldF9teV9ic3NpZDIzYSgmcG1sbWVpbmZvLT5uZXR3b3JrKSwKLQkJCQkgIGZhbHNlLCAwLCAwLCBmYWxzZSk7Ci0JcnRsODcyM2FfZmlsbF9mYWtlX3R4ZGVzYyhwYWRhcHRlciwKLQkJCQkgICZSZXNlcnZlZFBhZ2VQYWNrZXRbQnVmSW5kZXgtVHhEZXNjTGVuXSwKLQkJCQkgIE51bGxEYXRhTGVuZ3RoLCBmYWxzZSwgZmFsc2UpOwotCi0JUGFnZU5lZWQgPSAodTgpUGFnZU51bV8xMjgoVHhEZXNjTGVuICsgTnVsbERhdGFMZW5ndGgpOwotCVBhZ2VOdW0gKz0gUGFnZU5lZWQ7Ci0KLQlCdWZJbmRleCArPSBQYWdlTmVlZCoxMjg7Ci0KLQkvKiAzICg0KSBwcm9iZSByZXNwb25zZSAqLwotCVJzdmRQYWdlTG9jLkxvY1Byb2JlUnNwID0gUGFnZU51bTsKLQlDb25zdHJ1Y3RQcm9iZVJzcCgKLQkJcGFkYXB0ZXIsCi0JCSZSZXNlcnZlZFBhZ2VQYWNrZXRbQnVmSW5kZXhdLAotCQkmUHJvYmVSc3BMZW5ndGgsCi0JCWdldF9teV9ic3NpZDIzYSgmcG1sbWVpbmZvLT5uZXR3b3JrKSwKLQkJZmFsc2UpOwotCXJ0bDg3MjNhX2ZpbGxfZmFrZV90eGRlc2MocGFkYXB0ZXIsICZSZXNlcnZlZFBhZ2VQYWNrZXRbQnVmSW5kZXgtVHhEZXNjTGVuXSwgUHJvYmVSc3BMZW5ndGgsIGZhbHNlLCBmYWxzZSk7Ci0KLQlQYWdlTmVlZCA9ICh1OClQYWdlTnVtXzEyOChUeERlc2NMZW4gKyBQcm9iZVJzcExlbmd0aCk7Ci0JUGFnZU51bSArPSBQYWdlTmVlZDsKLQotCUJ1ZkluZGV4ICs9IFBhZ2VOZWVkKjEyODsKLQotCS8qIDMgKDUpIFFvcyBudWxsIGRhdGEgKi8KLQlSc3ZkUGFnZUxvYy5Mb2NRb3NOdWxsID0gUGFnZU51bTsKLQlDb25zdHJ1Y3ROdWxsRnVuY3Rpb25EYXRhKAotCQlwYWRhcHRlciwKLQkJJlJlc2VydmVkUGFnZVBhY2tldFtCdWZJbmRleF0sCi0JCSZRb3NOdWxsTGVuZ3RoLAotCQlnZXRfbXlfYnNzaWQyM2EoJnBtbG1laW5mby0+bmV0d29yayksCi0JCXRydWUsIDAsIDAsIGZhbHNlKTsKLQlydGw4NzIzYV9maWxsX2Zha2VfdHhkZXNjKHBhZGFwdGVyLCAmUmVzZXJ2ZWRQYWdlUGFja2V0W0J1ZkluZGV4LVR4RGVzY0xlbl0sIFFvc051bGxMZW5ndGgsIGZhbHNlLCBmYWxzZSk7Ci0KLQlQYWdlTmVlZCA9ICh1OClQYWdlTnVtXzEyOChUeERlc2NMZW4gKyBRb3NOdWxsTGVuZ3RoKTsKLQlQYWdlTnVtICs9IFBhZ2VOZWVkOwotCi0JQnVmSW5kZXggKz0gUGFnZU5lZWQqMTI4OwotCi0JLyogMyAoNikgQlQgUW9zIG51bGwgZGF0YSAqLwotCVJzdmRQYWdlTG9jLkxvY0JUUW9zTnVsbCA9IFBhZ2VOdW07Ci0JQ29uc3RydWN0TnVsbEZ1bmN0aW9uRGF0YSgKLQkJcGFkYXB0ZXIsCi0JCSZSZXNlcnZlZFBhZ2VQYWNrZXRbQnVmSW5kZXhdLAotCQkmQlRRb3NOdWxsTGVuZ3RoLAotCQlnZXRfbXlfYnNzaWQyM2EoJnBtbG1laW5mby0+bmV0d29yayksCi0JCXRydWUsIDAsIDAsIGZhbHNlKTsKLQlydGw4NzIzYV9maWxsX2Zha2VfdHhkZXNjKHBhZGFwdGVyLCAmUmVzZXJ2ZWRQYWdlUGFja2V0W0J1ZkluZGV4LVR4RGVzY0xlbl0sIEJUUW9zTnVsbExlbmd0aCwgZmFsc2UsIHRydWUpOwotCi0JVG90YWxQYWNrZXRMZW4gPSBCdWZJbmRleCArIEJUUW9zTnVsbExlbmd0aDsKLQotCXBtZ250ZnJhbWUgPSBhbGxvY19tZ3R4bWl0ZnJhbWUyM2EocHhtaXRwcml2KTsKLQlpZiAocG1nbnRmcmFtZSA9PSBOVUxMKQotCQlnb3RvIGV4aXQ7Ci0KLQkvKiAgdXBkYXRlIGF0dHJpYnV0ZSAqLwotCXBhdHRyaWIgPSAmcG1nbnRmcmFtZS0+YXR0cmliOwotCXVwZGF0ZV9tZ250ZnJhbWVfYXR0cmliMjNhKHBhZGFwdGVyLCBwYXR0cmliKTsKLQlwYXR0cmliLT5xc2VsID0gMHgxMDsKLQlwYXR0cmliLT5wa3RsZW4gPSBwYXR0cmliLT5sYXN0X3R4Y21kc3ogPSBUb3RhbFBhY2tldExlbiAtIFRYREVTQ19PRkZTRVQ7Ci0JbWVtY3B5KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCBSZXNlcnZlZFBhZ2VQYWNrZXQsIFRvdGFsUGFja2V0TGVuKTsKLQotCXJ0bDg3MjNhdV9tZ250X3htaXQocGFkYXB0ZXIsIHBtZ250ZnJhbWUpOwotCi0JREJHXzg3MjNBKCIlczogU2V0IFJTVkQgcGFnZSBsb2NhdGlvbiB0byBGd1xuIiwgX19mdW5jX18pOwotCUZpbGxIMkNDbWQocGFkYXB0ZXIsIFJTVkRfUEFHRV9FSUQsIHNpemVvZihSc3ZkUGFnZUxvYyksICh1OCAqKSZSc3ZkUGFnZUxvYyk7Ci0KLWV4aXQ6Ci0Ja2ZyZWUoUmVzZXJ2ZWRQYWdlUGFja2V0KTsKLX0KLQotdm9pZCBydGw4NzIzYV9zZXRfRndKb2luQnNzUmVwb3J0X2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBtc3RhdHVzKQotewotCXN0cnVjdCBqb2luYnNzcnB0X3Bhcm0JSm9pbkJzc1JwdFBhcm07Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCURCR184NzIzQSgiJXMgbXN0YXR1cygleClcbiIsIF9fZnVuY19fLCBtc3RhdHVzKTsKLQotCWlmIChtc3RhdHVzID09IDEpIHsKLQkJYm9vbCBiUmVjb3ZlciA9IGZhbHNlOwotCQl1OCB2ODsKLQotCQkvKiAgV2Ugc2hvdWxkIHNldCBBSUQsIGNvcnJlY3QgVFNGLCBIVyBzZXEgZW5hYmxlIGJlZm9yZSBzZXQgSm9pbkJzc1JlcG9ydCB0byBGdyBpbiA4OC85MkMuICovCi0JCS8qICBTdWdnZXN0ZWQgYnkgZmlsZW4uIEFkZGVkIGJ5IHR5bmxpLiAqLwotCQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX0JDTl9QU1JfUlBULAotCQkJCSAgMHhDMDAwfHBtbG1laW5mby0+YWlkKTsKLQkJLyogIERvIG5vdCBzZXQgVFNGIGFnYWluIGhlcmUgb3IgdldpRmkgYmVhY29uIERNQSBJTlQgd2lsbCBub3Qgd29yay4gKi8KLQkJLyogY29ycmVjdF9UU0YyM2EocGFkYXB0ZXIsIHBtbG1lZXh0KTsgKi8KLQkJLyogIEh3IHNlcXVlbmRlIGVuYWJsZSBieSBkZWRhdWx0LiAyMDEwLjA2LjIzLiBieSB0eW5saS4gKi8KLQkJLyogcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19OUU9TX1NFUSwgKChwbWxtZWV4dC0+bWdudF9zZXErMTAwKSYweEZGRikpOyAqLwotCQkvKiBydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfSFdTRVFfQ1RSTCwgMHhGRik7ICovCi0KLQkJLyogIHNldCBSRUdfQ1IgYml0IDggKi8KLQkJdjggPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19DUisxKTsKLQkJdjggfD0gQklUKDApOyAvKiAgRU5TV0JDTiAqLwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCAgUkVHX0NSKzEsIHY4KTsKLQotCQkvKiAgRGlzYWJsZSBIdyBwcm90ZWN0aW9uIGZvciBhIHRpbWUgd2hpY2ggcmV2c2VyZCBmb3IgSHcgc2VuZGluZyBiZWFjb24uICovCi0JCS8qICBGaXggZG93bmxvYWQgcmVzZXJ2ZWQgcGFnZSBwYWNrZXQgZmFpbCB0aGF0IGFjY2VzcyBjb2xsaXNpb24gd2l0aCB0aGUgcHJvdGVjdGlvbiB0aW1lLiAqLwotCQkvKiAgMjAxMC4wNS4xMS4gQWRkZWQgYnkgdHlubGkuICovCi0vKgkJCVNldEJjbkN0cmxSZWcyM2EocGFkYXB0ZXIsIDAsIEJJVCgzKSk7ICovCi0vKgkJCVNldEJjbkN0cmxSZWcyM2EocGFkYXB0ZXIsIEJJVCg0KSwgMCk7ICovCi0JCVNldEJjbkN0cmxSZWcyM2EocGFkYXB0ZXIsIEJJVCg0KSwgQklUKDMpKTsKLQotCQkvKiAgU2V0IEZXSFdfVFhRX0NUUkwgMHg0MjJbNl09IDAgdG8gdGVsbCBIdyB0aGUgcGFja2V0IGlzIG5vdCBhIHJlYWwgYmVhY29uIGZyYW1lLiAqLwotCQlpZiAocEhhbERhdGEtPlJlZ0Z3SHdUeFFDdHJsICYgQklUKDYpKQotCQkJYlJlY292ZXIgPSB0cnVlOwotCi0JCS8qICBUbyB0ZWxsIEh3IHRoZSBwYWNrZXQgaXMgbm90IGEgcmVhbCBiZWFjb24gZnJhbWUuICovCi0JCS8qIFUxYlRtcCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgUkVHX0ZXSFdfVFhRX0NUUkwrMik7ICovCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19GV0hXX1RYUV9DVFJMICsgMiwKLQkJCQkgcEhhbERhdGEtPlJlZ0Z3SHdUeFFDdHJsICYgfkJJVCg2KSk7Ci0JCXBIYWxEYXRhLT5SZWdGd0h3VHhRQ3RybCAmPSB+QklUKDYpOwotCQlTZXRGd1JzdmRQYWdlUGt0KHBhZGFwdGVyLCAwKTsKLQotCQkvKiAgMjAxMC4wNS4xMS4gQWRkZWQgYnkgdHlubGkuICovCi0JCVNldEJjbkN0cmxSZWcyM2EocGFkYXB0ZXIsIEJJVCgzKSwgQklUKDQpKTsKLQotCQkvKiAgVG8gbWFrZSBzdXJlIHRoYXQgaWYgdGhlcmUgZXhpc3RzIGFuIGFkYXB0ZXIgd2hpY2ggd291bGQgbGlrZSB0byBzZW5kIGJlYWNvbi4gKi8KLQkJLyogIElmIGV4aXN0cywgdGhlIG9yaWdpYW5sIHZhbHVlIG9mIDB4NDIyWzZdIHdpbGwgYmUgMSwgd2Ugc2hvdWxkIGNoZWNrIHRoaXMgdG8gKi8KLQkJLyogIHByZXZlbnQgZnJvbSBzZXR0aW5nIDB4NDIyWzZdIHRvIDAgYWZ0ZXIgZG93bmxvYWQgcmVzZXJ2ZWQgcGFnZSwgb3IgaXQgd2lsbCBjYXVzZSAqLwotCQkvKiAgdGhlIGJlYWNvbiBjYW5ub3QgYmUgc2VudCBieSBIVy4gKi8KLQkJLyogIDIwMTAuMDYuMjMuIEFkZGVkIGJ5IHR5bmxpLiAqLwotCQlpZiAoYlJlY292ZXIpIHsKLQkJCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19GV0hXX1RYUV9DVFJMICsgMiwKLQkJCQkJIHBIYWxEYXRhLT5SZWdGd0h3VHhRQ3RybCB8IEJJVCg2KSk7Ci0JCQlwSGFsRGF0YS0+UmVnRndId1R4UUN0cmwgfD0gQklUKDYpOwotCQl9Ci0KLQkJLyogIENsZWFyIENSWzhdIG9yIGJlYWNvbiBwYWNrZXQgd2lsbCBub3QgYmUgc2VuZCB0byBUeEJ1ZiBhbnltb3JlLiAqLwotCQl2OCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgUkVHX0NSKzEpOwotCQl2OCAmPSB+QklUKDApOyAvKiAgfkVOU1dCQ04gKi8KLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0NSKzEsIHY4KTsKLQl9Ci0KLQlKb2luQnNzUnB0UGFybS5PcE1vZGUgPSBtc3RhdHVzOwotCi0JRmlsbEgyQ0NtZChwYWRhcHRlciwgSk9JTkJTU19SUFRfRUlELCBzaXplb2YoSm9pbkJzc1JwdFBhcm0pLCAodTggKikmSm9pbkJzc1JwdFBhcm0pOwotCi19Ci0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0JUX0NPRVhJU1QKLXN0YXRpYyB2b2lkIFNldEZ3UnN2ZFBhZ2VQa3RfQlRDb2V4KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcG1nbnRmcmFtZTsKLQlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYjsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm87Ci0JdTggZmFrZW1hY1s2XSA9IHsweDAwLCAweGUwLCAweDRjLCAweDAwLCAweDAwLCAweDAwfTsKLQl1MzIgTnVsbERhdGFMZW5ndGgsIEJUUW9zTnVsbExlbmd0aDsKLQl1OCAqUmVzZXJ2ZWRQYWdlUGFja2V0OwotCXU4IFBhZ2VOdW0sIFBhZ2VOZWVkLCBUeERlc2NMZW47Ci0JdTE2IEJ1ZkluZGV4OwotCXUzMiBUb3RhbFBhY2tldExlbjsKLQlzdHJ1Y3QgcnN2ZHBhZ2VfbG9jCVJzdmRQYWdlTG9jOwotCi0JREJHXzg3MjNBKCIrJXNcbiIsIF9fZnVuY19fKTsKLQotCVJlc2VydmVkUGFnZVBhY2tldCA9IGt6YWxsb2MoMTAyNCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKFJlc2VydmVkUGFnZVBhY2tldCA9PSBOVUxMKSB7Ci0JCURCR184NzIzQSgiJXM6IGFsbG9jIFJlc2VydmVkUGFnZVBhY2tldCBmYWlsIVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0JcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlUeERlc2NMZW4gPSBUWERFU0NfU0laRTsKLQlQYWdlTnVtID0gMDsKLQotCS8qIDMgKDEpIGJlYWNvbiAqLwotCUJ1ZkluZGV4ID0gVFhERVNDX09GRlNFVDsKLQkvKiAgc2tpcCBCZWFjb24gUGFja2V0ICovCi0JUGFnZU5lZWQgPSAzOwotCi0JUGFnZU51bSArPSBQYWdlTmVlZDsKLQlwSGFsRGF0YS0+RndSc3ZkUGFnZVN0YXJ0T2Zmc2V0ID0gUGFnZU51bTsKLQotCUJ1ZkluZGV4ICs9IFBhZ2VOZWVkKjEyODsKLQotCS8qIDMgKDMpIG51bGwgZGF0YSAqLwotCVJzdmRQYWdlTG9jLkxvY051bGxEYXRhID0gUGFnZU51bTsKLQlDb25zdHJ1Y3ROdWxsRnVuY3Rpb25EYXRhKAotCQlwYWRhcHRlciwKLQkJJlJlc2VydmVkUGFnZVBhY2tldFtCdWZJbmRleF0sCi0JCSZOdWxsRGF0YUxlbmd0aCwKLQkJZmFrZW1hYywKLQkJZmFsc2UsIDAsIDAsIGZhbHNlKTsKLQlydGw4NzIzYV9maWxsX2Zha2VfdHhkZXNjKHBhZGFwdGVyLCAmUmVzZXJ2ZWRQYWdlUGFja2V0W0J1ZkluZGV4LVR4RGVzY0xlbl0sIE51bGxEYXRhTGVuZ3RoLCBmYWxzZSwgZmFsc2UpOwotCi0JUGFnZU5lZWQgPSAodTgpUGFnZU51bV8xMjgoVHhEZXNjTGVuICsgTnVsbERhdGFMZW5ndGgpOwotCVBhZ2VOdW0gKz0gUGFnZU5lZWQ7Ci0KLQlCdWZJbmRleCArPSBQYWdlTmVlZCoxMjg7Ci0KLQkvKiAzICg2KSBCVCBRb3MgbnVsbCBkYXRhICovCi0JUnN2ZFBhZ2VMb2MuTG9jQlRRb3NOdWxsID0gUGFnZU51bTsKLQlDb25zdHJ1Y3ROdWxsRnVuY3Rpb25EYXRhKAotCQlwYWRhcHRlciwKLQkJJlJlc2VydmVkUGFnZVBhY2tldFtCdWZJbmRleF0sCi0JCSZCVFFvc051bGxMZW5ndGgsCi0JCWZha2VtYWMsCi0JCXRydWUsIDAsIDAsIGZhbHNlKTsKLQlydGw4NzIzYV9maWxsX2Zha2VfdHhkZXNjKHBhZGFwdGVyLCAmUmVzZXJ2ZWRQYWdlUGFja2V0W0J1ZkluZGV4LVR4RGVzY0xlbl0sIEJUUW9zTnVsbExlbmd0aCwgZmFsc2UsIHRydWUpOwotCi0JVG90YWxQYWNrZXRMZW4gPSBCdWZJbmRleCArIEJUUW9zTnVsbExlbmd0aDsKLQotCXBtZ250ZnJhbWUgPSBhbGxvY19tZ3R4bWl0ZnJhbWUyM2EocHhtaXRwcml2KTsKLQlpZiAocG1nbnRmcmFtZSA9PSBOVUxMKQotCQlnb3RvIGV4aXQ7Ci0KLQkvKiAgdXBkYXRlIGF0dHJpYnV0ZSAqLwotCXBhdHRyaWIgPSAmcG1nbnRmcmFtZS0+YXR0cmliOwotCXVwZGF0ZV9tZ250ZnJhbWVfYXR0cmliMjNhKHBhZGFwdGVyLCBwYXR0cmliKTsKLQlwYXR0cmliLT5xc2VsID0gMHgxMDsKLQlwYXR0cmliLT5wa3RsZW4gPSBwYXR0cmliLT5sYXN0X3R4Y21kc3ogPSBUb3RhbFBhY2tldExlbiAtIFRYREVTQ19PRkZTRVQ7Ci0JbWVtY3B5KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCBSZXNlcnZlZFBhZ2VQYWNrZXQsIFRvdGFsUGFja2V0TGVuKTsKLQotCXJ0bDg3MjNhdV9tZ250X3htaXQocGFkYXB0ZXIsIHBtZ250ZnJhbWUpOwotCi0JREJHXzg3MjNBKCIlczogU2V0IFJTVkQgcGFnZSBsb2NhdGlvbiB0byBGd1xuIiwgX19mdW5jX18pOwotCUZpbGxIMkNDbWQocGFkYXB0ZXIsIFJTVkRfUEFHRV9FSUQsIHNpemVvZihSc3ZkUGFnZUxvYyksICh1OCAqKSZSc3ZkUGFnZUxvYyk7Ci0KLWV4aXQ6Ci0Ja2ZyZWUoUmVzZXJ2ZWRQYWdlUGFja2V0KTsKLX0KLQotdm9pZCBydGw4NzIzYV9zZXRfQlRDb2V4X0FQX21vZGVfRndSc3ZkUGt0X2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0JdTggYlJlY292ZXIgPSBmYWxzZTsKLQotCURCR184NzIzQSgiKyVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQkvKiAgU2V0IEZXSFdfVFhRX0NUUkwgMHg0MjJbNl09IDAgdG8gdGVsbCBIdyB0aGUgcGFja2V0IGlzIG5vdCBhIHJlYWwgYmVhY29uIGZyYW1lLiAqLwotCWlmIChwSGFsRGF0YS0+UmVnRndId1R4UUN0cmwgJiBCSVQoNikpCi0JCWJSZWNvdmVyID0gdHJ1ZTsKLQotCS8qICBUbyB0ZWxsIEh3IHRoZSBwYWNrZXQgaXMgbm90IGEgcmVhbCBiZWFjb24gZnJhbWUuICovCi0JcEhhbERhdGEtPlJlZ0Z3SHdUeFFDdHJsICY9IH5CSVQoNik7Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0ZXSFdfVFhRX0NUUkwgKyAyLAotCQkJIHBIYWxEYXRhLT5SZWdGd0h3VHhRQ3RybCk7Ci0JU2V0RndSc3ZkUGFnZVBrdF9CVENvZXgocGFkYXB0ZXIpOwotCi0JLyogIFRvIG1ha2Ugc3VyZSB0aGF0IGlmIHRoZXJlIGV4aXN0cyBhbiBhZGFwdGVyIHdoaWNoIHdvdWxkIGxpa2UgdG8gc2VuZCBiZWFjb24uICovCi0JLyogIElmIGV4aXN0cywgdGhlIG9yaWdpYW5sIHZhbHVlIG9mIDB4NDIyWzZdIHdpbGwgYmUgMSwgd2Ugc2hvdWxkIGNoZWNrIHRoaXMgdG8gKi8KLQkvKiAgcHJldmVudCBmcm9tIHNldHRpbmcgMHg0MjJbNl0gdG8gMCBhZnRlciBkb3dubG9hZCByZXNlcnZlZCBwYWdlLCBvciBpdCB3aWxsIGNhdXNlICovCi0JLyogIHRoZSBiZWFjb24gY2Fubm90IGJlIHNlbnQgYnkgSFcuICovCi0JLyogIDIwMTAuMDYuMjMuIEFkZGVkIGJ5IHR5bmxpLiAqLwotCWlmIChiUmVjb3ZlcikgewotCQlwSGFsRGF0YS0+UmVnRndId1R4UUN0cmwgfD0gQklUKDYpOwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfRldIV19UWFFfQ1RSTCArIDIsCi0JCQkJIHBIYWxEYXRhLT5SZWdGd0h3VHhRQ3RybCk7Ci0JfQotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9kbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfZG0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU4MzFmMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9kbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICovCi0vKiAgRGVzY3JpcHRpb246ICovCi0vKiAgKi8KLS8qICBUaGlzIGZpbGUgaXMgZm9yIDkyQ0UvOTJDVSBkeW5hbWljIG1lY2hhbmlzbSBvbmx5ICovCi0vKiAgKi8KLS8qICAqLwotLyogICovCi0jZGVmaW5lIF9SVEw4NzIzQV9ETV9DXwotCi0vKiAgKi8KLS8qICBpbmNsdWRlIGZpbGVzICovCi0vKiAgKi8KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxydGw4NzIzYV9oYWwuaD4KLSNpbmNsdWRlIDx1c2Jfb3BzX2xpbnV4Lmg+Ci0KLS8qICAqLwotLyogIEdsb2JhbCB2YXIgKi8KLS8qICAqLwotCi1zdGF0aWMgdm9pZCBkbV9DaGVja1BiY0dQSU8oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1OAl0bXAxYnl0ZTsKLQl1OAliUGJjUHJlc3NlZCA9IGZhbHNlOwotCi0JaWYgKCFwYWRhcHRlci0+cmVnaXN0cnlwcml2Lmh3X3dwc19wYmMpCi0JCXJldHVybjsKLQotCXRtcDFieXRlID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBHUElPX0lPX1NFTCk7Ci0JdG1wMWJ5dGUgfD0gKEhBTF84MTkyQ19IV19HUElPX1dQU19CSVQpOwotCS8qIGVuYWJsZSBHUElPWzJdIGFzIG91dHB1dCBtb2RlICovCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgR1BJT19JT19TRUwsIHRtcDFieXRlKTsKLQotCXRtcDFieXRlICY9IH4oSEFMXzgxOTJDX0hXX0dQSU9fV1BTX0JJVCk7Ci0JLyogcmVzZXQgdGhlIGZsb2F0aW5nIHZvbHRhZ2UgbGV2ZWwgKi8KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCAgR1BJT19JTiwgdG1wMWJ5dGUpOwotCi0JdG1wMWJ5dGUgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIEdQSU9fSU9fU0VMKTsKLQl0bXAxYnl0ZSAmPSB+KEhBTF84MTkyQ19IV19HUElPX1dQU19CSVQpOwotCS8qIGVuYWJsZSBHUElPWzJdIGFzIGlucHV0IG1vZGUgKi8KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBHUElPX0lPX1NFTCwgdG1wMWJ5dGUpOwotCi0JdG1wMWJ5dGUgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIEdQSU9fSU4pOwotCi0JaWYgKHRtcDFieXRlID09IDB4ZmYpCi0JCXJldHVybjsKLQotCWlmICh0bXAxYnl0ZSZIQUxfODE5MkNfSFdfR1BJT19XUFNfQklUKQotCQliUGJjUHJlc3NlZCA9IHRydWU7Ci0KLQlpZiAoYlBiY1ByZXNzZWQpIHsKLQkJLyogIEhlcmUgd2Ugb25seSBzZXQgYlBiY1ByZXNzZWQgdG8gdHJ1ZSAqLwotCQkvKiAgQWZ0ZXIgdHJpZ2dlciBQQkMsIHRoZSB2YXJpYWJsZSB3aWxsIGJlIHNldCB0byBmYWxzZSAqLwotCQlEQkdfODcyM0EoIkNoZWNrUGJjR1BJTyAtIFBCQyBpcyBwcmVzc2VkXG4iKTsKLQotCQlpZiAocGFkYXB0ZXItPnBpZFswXSA9PSAwKSB7Ci0JCQkvKiAwIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGFuZCBpdCBtZWFucyB0aGUgYXBwbGljYXRpb24KLQkJCSAqIG1vbml0b3JzIHRoZSBIVyBQQkMgZG9lc24ndCBwcml2ZGUgaXRzIHBpZCB0byBkcml2ZXIuCi0JCQkgKi8KLQkJCXJldHVybjsKLQkJfQotCi0JCWtpbGxfcGlkKGZpbmRfdnBpZChwYWRhcHRlci0+cGlkWzBdKSwgU0lHVVNSMSwgMSk7Ci0JfQotfQotCi0vKiAgSW5pdGlhbGl6ZSBHUElPIHNldHRpbmcgcmVnaXN0ZXJzICovCi0vKiAgZnVuY3Rpb25zICovCi0KLXZvaWQgcnRsODcyM2FfaW5pdF9kbV9wcml2KHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCBkbV9wcml2CSpwZG1wcml2ID0gJnBIYWxEYXRhLT5kbXByaXY7Ci0Jc3RydWN0IGRtX29kbV90ICpwRE1fT2RtID0gJnBIYWxEYXRhLT5vZG1wcml2OwotCXU4IGN1dF92ZXIsIGZhYl92ZXI7Ci0KLQltZW1zZXQocGRtcHJpdiwgMCwgc2l6ZW9mKHN0cnVjdCBkbV9wcml2KSk7Ci0JbWVtc2V0KHBETV9PZG0sIDAsIHNpemVvZigqcERNX09kbSkpOwotCi0JcERNX09kbS0+QWRhcHRlciA9IEFkYXB0ZXI7Ci0KLQlPRE1fQ21uSW5mb0luaXQyM2EocERNX09kbSwgT0RNX0NNTklORk9fSUNfVFlQRSwgT0RNX1JUTDg3MjNBKTsKLQotCWlmIChJU184NzIzQV9BX0NVVChwSGFsRGF0YS0+VmVyc2lvbklEKSkgewotCQlmYWJfdmVyID0gT0RNX1VNQzsKLQkJY3V0X3ZlciA9IE9ETV9DVVRfQTsKLQl9IGVsc2UgaWYgKElTXzg3MjNBX0JfQ1VUKHBIYWxEYXRhLT5WZXJzaW9uSUQpKSB7Ci0JCWZhYl92ZXIgPSBPRE1fVU1DOwotCQljdXRfdmVyID0gT0RNX0NVVF9COwotCX0gZWxzZSB7Ci0JCWZhYl92ZXIgPSBPRE1fVFNNQzsKLQkJY3V0X3ZlciA9IE9ETV9DVVRfQTsKLQl9Ci0JT0RNX0NtbkluZm9Jbml0MjNhKHBETV9PZG0sIE9ETV9DTU5JTkZPX0ZBQl9WRVIsIGZhYl92ZXIpOwotCU9ETV9DbW5JbmZvSW5pdDIzYShwRE1fT2RtLCBPRE1fQ01OSU5GT19DVVRfVkVSLCBjdXRfdmVyKTsKLQlPRE1fQ21uSW5mb0luaXQyM2EocERNX09kbSwgT0RNX0NNTklORk9fTVBfVEVTVF9DSElQLCBJU19OT1JNQUxfQ0hJUChwSGFsRGF0YS0+VmVyc2lvbklEKSk7Ci0KLQlPRE1fQ21uSW5mb0luaXQyM2EocERNX09kbSwgT0RNX0NNTklORk9fQk9BUkRfVFlQRSwgcEhhbERhdGEtPkJvYXJkVHlwZSk7Ci0KLQlpZiAocEhhbERhdGEtPkJvYXJkVHlwZSA9PSBCT0FSRF9VU0JfSGlnaF9QQSkgewotCQlPRE1fQ21uSW5mb0luaXQyM2EocERNX09kbSwgT0RNX0NNTklORk9fRVhUX0xOQSwgdHJ1ZSk7Ci0JCU9ETV9DbW5JbmZvSW5pdDIzYShwRE1fT2RtLCBPRE1fQ01OSU5GT19FWFRfUEEsIHRydWUpOwotCX0KLQlPRE1fQ21uSW5mb0luaXQyM2EocERNX09kbSwgT0RNX0NNTklORk9fQldJRklfVEVTVCwgQWRhcHRlci0+cmVnaXN0cnlwcml2LndpZmlfc3BlYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIFVwZGF0ZV9PRE1fQ29tSW5mb184NzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0gPSAmcEhhbERhdGEtPm9kbXByaXY7Ci0Jc3RydWN0IGRtX3ByaXYJKnBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKLQlpbnQgaTsKLQlwZG1wcml2LT5Jbml0T0RNRmxhZyA9IDA7Ci0JLyogIFBvaW50ZXIgcmVmZXJlbmNlICovCi0JcnRsODcyM2Ffb2RtX3N1cHBvcnRfYWJpbGl0eV9zZXQoQWRhcHRlciwgRFlOQU1JQ19BTExfRlVOQ19FTkFCTEUpOwotCi0JZm9yIChpID0gMDsgaSA8IE5VTV9TVEE7IGkrKykKLQkJT0RNX0NtbkluZm9QdHJBcnJheUhvb2syM2EocERNX09kbSwgT0RNX0NNTklORk9fU1RBX1NUQVRVUywgaSwgTlVMTCk7Ci19Ci0KLXZvaWQgcnRsODcyM2FfSW5pdEhhbERtKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCBkbV9wcml2CSpwZG1wcml2ID0gJnBIYWxEYXRhLT5kbXByaXY7Ci0Jc3RydWN0IGRtX29kbV90ICpwRE1fT2RtID0gJnBIYWxEYXRhLT5vZG1wcml2OwotCXU4CWk7Ci0KLQlVcGRhdGVfT0RNX0NvbUluZm9fODcyM2EoQWRhcHRlcik7Ci0JT0RNMjNhX0RNSW5pdChwRE1fT2RtKTsKLQkvKiAgU2F2ZSBSRUdfSU5JREFUQV9SQVRFX1NFTCB2YWx1ZSBmb3IgVFhERVNDLiAqLwotCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCQlwZG1wcml2LT5JTklEQVRBX1JBVEVbaV0gPSBydGw4NzIzYXVfcmVhZDgoQWRhcHRlciwgUkVHX0lOSURBVEFfUkFURV9TRUwraSkgJiAweDNmOwotfQotCi12b2lkCi1ydGw4NzIzYV9IYWxEbVdhdGNoRG9nKAotCXN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcgotCSkKLXsKLQlib29sCQliRndDdXJyZW50SW5QU01vZGUgPSBmYWxzZTsKLQlib29sCQliRndQU0F3YWtlID0gdHJ1ZTsKLQl1OCBiTGlua2VkID0gZmFsc2U7Ci0JdTggaHdfaW5pdF9jb21wbGV0ZWQgPSBmYWxzZTsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCBkbV9wcml2CSpwZG1wcml2ID0gJnBIYWxEYXRhLT5kbXByaXY7Ci0KLQlod19pbml0X2NvbXBsZXRlZCA9IEFkYXB0ZXItPmh3X2luaXRfY29tcGxldGVkOwotCi0JaWYgKGh3X2luaXRfY29tcGxldGVkID09IGZhbHNlKQotCQlnb3RvIHNraXBfZG07Ci0KLQliRndDdXJyZW50SW5QU01vZGUgPSBBZGFwdGVyLT5wd3JjdHJscHJpdi5iRndDdXJyZW50SW5QU01vZGU7Ci0JYkZ3UFNBd2FrZSA9IHJ0bDg3MjNhX2dldF9md2xwc19yZl9vbihBZGFwdGVyKTsKLQotCWlmICghYkZ3Q3VycmVudEluUFNNb2RlICYmIGJGd1BTQXdha2UpIHsKLQkJLyogIFJlYWQgUkVHX0lOSURBVEFfUkFURV9TRUwgdmFsdWUgZm9yIFRYREVTQy4gKi8KLQkJaWYgKGNoZWNrX2Z3c3RhdGUoJkFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpKSB7Ci0JCQlwZG1wcml2LT5JTklEQVRBX1JBVEVbMF0gPSBydGw4NzIzYXVfcmVhZDgoQWRhcHRlciwgUkVHX0lOSURBVEFfUkFURV9TRUwpICYgMHgzZjsKLQkJfSBlbHNlIHsKLQkJCXU4CWk7Ci0JCQlmb3IgKGkgPSAxIDsgaSA8IChBZGFwdGVyLT5zdGFwcml2LmFzb2Nfc3RhX2NvdW50ICsgMSk7IGkrKykKLQkJCQlwZG1wcml2LT5JTklEQVRBX1JBVEVbaV0gPSBydGw4NzIzYXVfcmVhZDgoQWRhcHRlciwgKFJFR19JTklEQVRBX1JBVEVfU0VMK2kpKSAmIDB4M2Y7Ci0JCX0KLQl9Ci0KLQkvKiBPRE0gKi8KLQlpZiAocnR3X2xpbmtlZF9jaGVjayhBZGFwdGVyKSkKLQkJYkxpbmtlZCA9IHRydWU7Ci0KLQlPRE1fQ21uSW5mb1VwZGF0ZTIzYSgmcEhhbERhdGEtPm9kbXByaXYsIE9ETV9DTU5JTkZPX0xJTkssIGJMaW5rZWQpOwotCU9ETV9ETVdhdGNoZG9nMjNhKEFkYXB0ZXIpOwotCi1za2lwX2RtOgotCi0JLyogIENoZWNrIEdQSU8gdG8gZGV0ZXJtaW5lIGN1cnJlbnQgUkYgb24vb2ZmIGFuZCBQYmMgc3RhdHVzLiAqLwotCS8qICBDaGVjayBIYXJkd2FyZSBSYWRpbyBPTi9PRkYgb3Igbm90ICovCi0JZG1fQ2hlY2tQYmNHUElPKEFkYXB0ZXIpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfaGFsX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX2hhbF9pbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYTBhZjQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfaGFsX2luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDIwNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9IQUxfSU5JVF9DXwotCi0jaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLSNpbmNsdWRlIDxydHdfZWZ1c2UuaD4KLQotI2luY2x1ZGUgPHJ0bDg3MjNhX2hhbC5oPgotI2luY2x1ZGUgPHVzYl9vcHNfbGludXguaD4KLQotc3RhdGljIHZvaWQgX0ZXRG93bmxvYWRFbmFibGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgYm9vbCBlbmFibGUpCi17Ci0JdTggdG1wOwotCi0JaWYgKGVuYWJsZSkgewotCQkvKiAgODA1MSBlbmFibGUgKi8KLQkJdG1wID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBSRUdfU1lTX0ZVTkNfRU4gKyAxKTsKLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1NZU19GVU5DX0VOICsgMSwgdG1wIHwgMHgwNCk7Ci0KLQkJLyogIE1DVSBmaXJtd2FyZSBkb3dubG9hZCBlbmFibGUuICovCi0JCXRtcCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgUkVHX01DVUZXREwpOwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfTUNVRldETCwgdG1wIHwgMHgwMSk7Ci0KLQkJLyogIDgwNTEgcmVzZXQgKi8KLQkJdG1wID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBSRUdfTUNVRldETCArIDIpOwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfTUNVRldETCArIDIsIHRtcCAmIDB4ZjcpOwotCX0gZWxzZSB7Ci0JCS8qICBNQ1UgZmlybXdhcmUgZG93bmxvYWQgZGlzYWJsZS4gKi8KLQkJdG1wID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBSRUdfTUNVRldETCk7Ci0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19NQ1VGV0RMLCB0bXAgJiAweGZlKTsKLQotCQkvKiAgUmVzZXJ2ZWQgZm9yIGZ3IGV4dGVuc2lvbi4gKi8KLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX01DVUZXREwgKyAxLCAweDAwKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQKLV9QYWdlV3JpdGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIHBhZ2UsIHZvaWQgKmJ1ZmZlciwgdTMyIHNpemUpCi17Ci0JdTggdmFsdWU4OwotCXU4IHU4UGFnZSA9ICh1OCkgKHBhZ2UgJiAweDA3KTsKLQotCWlmIChzaXplID4gTUFYX1BBR0VfU0laRSkKLQkJcmV0dXJuIF9GQUlMOwotCi0JdmFsdWU4ID0gKHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgUkVHX01DVUZXREwgKyAyKSAmIDB4RjgpIHwgdThQYWdlOwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19NQ1VGV0RMICsgMiwgdmFsdWU4KTsKLQotCXJldHVybiBydGw4NzIzYXVfd3JpdGVOKHBhZGFwdGVyLCBGV184NzIzQV9TVEFSVF9BRERSRVNTLCBzaXplLCBidWZmZXIpOwotfQotCi1zdGF0aWMgaW50IF9Xcml0ZUZXKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHZvaWQgKmJ1ZmZlciwgdTMyIHNpemUpCi17Ci0JLyogIFNpbmNlIHdlIG5lZWQgZHluYW1pYyBkZWNpZGUgbWV0aG9kIG9mIGR3b25sb2FkIGZ3LCBzbyB3ZQotCSAgICBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gZ2V0IGNoaXAgdmVyc2lvbi4gKi8KLQkvKiAgV2UgY2FuIHJlbW92ZSBfUmVhZENoaXBWZXJzaW9uIGZyb20gUmVhZHBhZGFwdGVySW5mbzgxOTJDIGxhdGVyLiAqLwotCWludCByZXQgPSBfU1VDQ0VTUzsKLQl1MzIgcGFnZU51bXMsIHJlbWFpblNpemU7Ci0JdTMyIHBhZ2UsIG9mZnNldDsKLQl1OCAqYnVmZmVyUHRyID0gKHU4ICopIGJ1ZmZlcjsKLQotCXBhZ2VOdW1zID0gc2l6ZSAvIE1BWF9QQUdFX1NJWkU7Ci0JLyogUlRfQVNTRVJUKChwYWdlTnVtcyA8PSA0KSwKLQkgICAoIlBhZ2UgbnVtYmVycyBzaG91bGQgbm90IGdyZWF0ZXIgdGhlbiA0IFxuIikpOyAqLwotCXJlbWFpblNpemUgPSBzaXplICUgTUFYX1BBR0VfU0laRTsKLQotCWZvciAocGFnZSA9IDA7IHBhZ2UgPCBwYWdlTnVtczsgcGFnZSsrKSB7Ci0JCW9mZnNldCA9IHBhZ2UgKiBNQVhfUEFHRV9TSVpFOwotCQlyZXQgPSBfUGFnZVdyaXRlKHBhZGFwdGVyLCBwYWdlLCBidWZmZXJQdHIgKyBvZmZzZXQsCi0JCQkJIE1BWF9QQUdFX1NJWkUpOwotCi0JCWlmIChyZXQgPT0gX0ZBSUwpCi0JCQlnb3RvIGV4aXQ7Ci0JfQotCWlmIChyZW1haW5TaXplKSB7Ci0JCW9mZnNldCA9IHBhZ2VOdW1zICogTUFYX1BBR0VfU0laRTsKLQkJcGFnZSA9IHBhZ2VOdW1zOwotCQlyZXQgPSBfUGFnZVdyaXRlKHBhZGFwdGVyLCBwYWdlLCBidWZmZXJQdHIgKyBvZmZzZXQsCi0JCQkJIHJlbWFpblNpemUpOwotCi0JCWlmIChyZXQgPT0gX0ZBSUwpCi0JCQlnb3RvIGV4aXQ7Ci0JfQotCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAiX1dyaXRlRlcgRG9uZS0gZm9yIE5vcm1hbCBjaGlwLlxuIik7Ci0KLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfRldGcmVlVG9HbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXUzMiBjb3VudGVyID0gMDsKLQl1MzIgdmFsdWUzMjsKLQotCS8qICBwb2xsaW5nIENoZWNrU3VtIHJlcG9ydCAqLwotCWRvIHsKLQkJdmFsdWUzMiA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIFJFR19NQ1VGV0RMKTsKLQkJaWYgKHZhbHVlMzIgJiBGV0RMX0Noa1N1bV9ycHQpCi0JCQlicmVhazsKLQl9IHdoaWxlIChjb3VudGVyKysgPCBQT0xMSU5HX1JFQURZX1RJTUVPVVRfQ09VTlQpOwotCi0JaWYgKGNvdW50ZXIgPj0gUE9MTElOR19SRUFEWV9USU1FT1VUX0NPVU5UKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfZXJyXywKLQkJCSAiJXM6IGNoa3N1bSByZXBvcnQgZmFpbCEgUkVHX01DVUZXREw6MHglMDh4XG4iLAotCQkJIF9fZnVuY19fLCB2YWx1ZTMyKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkgIiVzOiBDaGVja3N1bSByZXBvcnQgT0shIFJFR19NQ1VGV0RMOjB4JTA4eFxuIiwgX19mdW5jX18sCi0JCSB2YWx1ZTMyKTsKLQotCXZhbHVlMzIgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfTUNVRldETCk7Ci0JdmFsdWUzMiB8PSBNQ1VGV0RMX1JEWTsKLQl2YWx1ZTMyICY9IH5XSU5USU5JX1JEWTsKLQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgUkVHX01DVUZXREwsIHZhbHVlMzIpOwotCi0JLyogIHBvbGxpbmcgZm9yIEZXIHJlYWR5ICovCi0JY291bnRlciA9IDA7Ci0JZG8gewotCQl2YWx1ZTMyID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgUkVHX01DVUZXREwpOwotCQlpZiAodmFsdWUzMiAmIFdJTlRJTklfUkRZKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAiJXM6IFBvbGxpbmcgRlcgcmVhZHkgc3VjY2VzcyEhIFJFR19NQ1VGV0RMOjB4JTA4eFxuIiwKLQkJCQkgX19mdW5jX18sIHZhbHVlMzIpOwotCQkJcmV0dXJuIF9TVUNDRVNTOwotCQl9Ci0JCXVkZWxheSg1KTsKLQl9IHdoaWxlIChjb3VudGVyKysgPCBQT0xMSU5HX1JFQURZX1RJTUVPVVRfQ09VTlQpOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLAotCQkgIiVzOiBQb2xsaW5nIEZXIHJlYWR5IGZhaWwhISBSRUdfTUNVRldETDoweCUwOHhcbiIsCi0JCSBfX2Z1bmNfXywgdmFsdWUzMik7Ci0JcmV0dXJuIF9GQUlMOwotfQotCi0jZGVmaW5lIElTX0ZXXzgxeHhDKHBhZGFwdGVyKQkoKChHRVRfSEFMX0RBVEEocGFkYXB0ZXIpKS0+RmlybXdhcmVTaWduYXR1cmUgJiAweEZGRjApID09IDB4ODhDMCkKLQotdm9pZCBydGw4NzIzYV9GaXJtd2FyZVNlbGZSZXNldChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXU4IHUxYlRtcDsKLQl1OCBEZWxheSA9IDEwMDsKLQotCWlmICghKElTX0ZXXzgxeHhDKHBhZGFwdGVyKSAmJgotCSAgICAgICgocEhhbERhdGEtPkZpcm13YXJlVmVyc2lvbiA8IDB4MjEpIHx8Ci0JICAgICAgIChwSGFsRGF0YS0+RmlybXdhcmVWZXJzaW9uID09IDB4MjEgJiYKLQkJcEhhbERhdGEtPkZpcm13YXJlU3ViVmVyc2lvbiA8IDB4MDEpKSkpIHsKLQkJLyogIGFmdGVyIDg4QyBGdyB2MzMuMSAqLwotCQkvKiAweDFjZiA9IDB4MjAuIEluZm9ybSA4MDUxIHRvIHJlc2V0LiAyMDA5LjEyLjI1LiB0eW5saV90ZXN0ICovCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19ITUVURlIgKyAzLCAweDIwKTsKLQotCQl1MWJUbXAgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19TWVNfRlVOQ19FTiArIDEpOwotCQl3aGlsZSAodTFiVG1wICYgQklUKDIpKSB7Ci0JCQlEZWxheS0tOwotCQkJaWYgKERlbGF5ID09IDApCi0JCQkJYnJlYWs7Ci0JCQl1ZGVsYXkoNTApOwotCQkJdTFiVG1wID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBSRUdfU1lTX0ZVTkNfRU4gKyAxKTsKLQkJfQotCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJICItJXM6IDgwNTEgcmVzZXQgc3VjY2VzcyAoJWQpXG4iLCBfX2Z1bmNfXywKLQkJCSBEZWxheSk7Ci0KLQkJaWYgKChEZWxheSA9PSAwKSkgewotCQkJLyogZm9yY2UgZmlybXdhcmUgcmVzZXQgKi8KLQkJCXUxYlRtcCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgUkVHX1NZU19GVU5DX0VOICsgMSk7Ci0JCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfU1lTX0ZVTkNfRU4gKyAxLAotCQkJCQkgdTFiVG1wICYgfkJJVCgyKSk7Ci0JCX0KLQl9Ci19Ci0KLS8qICAqLwotLyoJRGVzY3JpcHRpb246ICovCi0vKgkJRG93bmxvYWQgODE5MkMgZmlybXdhcmUgY29kZS4gKi8KLS8qICAqLwotLyogICovCi1pbnQgcnRsODcyM2FfRmlybXdhcmVEb3dubG9hZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCWludCBydFN0YXR1cyA9IF9TVUNDRVNTOwotCXU4IHdyaXRlRldfcmV0cnkgPSAwOwotCXVuc2lnbmVkIGxvbmcgZndkbF9zdGFydF90aW1lOwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBkdm9ial9wcml2ICpkdm9iaiA9IGFkYXB0ZXJfdG9fZHZvYmoocGFkYXB0ZXIpOwotCXN0cnVjdCBkZXZpY2UgKmRldmljZSA9IGR2b2JqX3RvX2Rldihkdm9iaik7Ci0Jc3RydWN0IHJ0Xzg3MjNhX2Zpcm13YXJlX2hkciAqcEZ3SGRyID0gTlVMTDsKLQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwotCWNoYXIgKmZ3X25hbWU7Ci0JdTggKmZpcm13YXJlX2J1ZiA9IE5VTEw7Ci0JdTggKmJ1ZjsKLQlpbnQgZndfc2l6ZTsKLQlzdGF0aWMgaW50IGxvZ192ZXJzaW9uOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywgIislc1xuIiwgX19mdW5jX18pOwotCi0JaWYgKElTXzg3MjNBX0FfQ1VUKHBIYWxEYXRhLT5WZXJzaW9uSUQpKSB7Ci0JCWZ3X25hbWUgPSAicnRsd2lmaS9ydGw4NzIzYXVmd19BLmJpbiI7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgInJ0bDg3MjNhX0Zpcm13YXJlRG93bmxvYWQ6IFI4NzIzRndJbWFnZUFycmF5X1VNQyBmb3IgUlRMODcyM0EgQSBDVVRcbiIpOwotCX0gZWxzZSBpZiAoSVNfODcyM0FfQl9DVVQocEhhbERhdGEtPlZlcnNpb25JRCkpIHsKLQkJLyogIFdMQU4gRncuICovCi0JCWlmIChwYWRhcHRlci0+cmVnaXN0cnlwcml2LndpZmlfc3BlYyA9PSAxKSB7Ci0JCQlmd19uYW1lID0gInJ0bHdpZmkvcnRsODcyM2F1ZndfQl9Ob0JULmJpbiI7Ci0JCQlEQkdfODcyM0EoIiBSdGw4NzIzX0Z3VU1DQkN1dEltYWdlQXJyYXlXaXRob3V0QlQgZm9yICIKLQkJCQkgICJSVEw4NzIzQSBCIENVVFxuIik7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocnRsODcyM2FfQlRfY29leGlzdChwYWRhcHRlcikpIHsKLQkJCQlmd19uYW1lID0gInJ0bHdpZmkvcnRsODcyM2F1ZndfQi5iaW4iOwotCQkJCURCR184NzIzQSgiIFJ0bDg3MjNfRndVTUNCQ3V0SW1hZ2VBcnJheVdpdGhCVCAiCi0JCQkJCSAgImZvciBSVEw4NzIzQSBCIENVVFxuIik7Ci0JCQl9IGVsc2UgewotCQkJCWZ3X25hbWUgPSAicnRsd2lmaS9ydGw4NzIzYXVmd19CX05vQlQuYmluIjsKLQkJCQlEQkdfODcyM0EoIiBSdGw4NzIzX0Z3VU1DQkN1dEltYWdlQXJyYXlXaXRob3V0ICIKLQkJCQkJICAiQlQgZm9yIFJUTDg3MjNBIEIgQ1VUXG4iKTsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCS8qICA8Um9nZXJfVE9ETz4gV2Ugc2hvdWxkIGRvd25sb2FkIHByb3BlciBSQU0gQ29kZSBoZXJlCi0JCSAgICB0byBtYXRjaCB0aGUgUk9NIGNvZGUuICovCi0JCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfZXJyXywKLQkJCSAiJXM6IHVua25vd24gdmVyc2lvbiFcbiIsIF9fZnVuY19fKTsKLQkJcnRTdGF0dXMgPSBfRkFJTDsKLQkJZ290byBFeGl0OwotCX0KLQotCXByX2luZm8oInJ0bDg3MjNhdTogTG9hZGluZyBmaXJtd2FyZSAlc1xuIiwgZndfbmFtZSk7Ci0JaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd19uYW1lLCBkZXZpY2UpKSB7Ci0JCXByX2VycigicnRsODcyM2F1OiByZXF1ZXN0X2Zpcm13YXJlIGxvYWQgZmFpbGVkXG4iKTsKLQkJcnRTdGF0dXMgPSBfRkFJTDsKLQkJZ290byBFeGl0OwotCX0KLQlpZiAoIWZ3KSB7Ci0JCXByX2VycigicnRsODcyM2F1OiBGaXJtd2FyZSAlcyBub3QgYXZhaWxhYmxlXG4iLCBmd19uYW1lKTsKLQkJcnRTdGF0dXMgPSBfRkFJTDsKLQkJZ290byBFeGl0OwotCX0KLQlmaXJtd2FyZV9idWYgPSBrbWVtZHVwKGZ3LT5kYXRhLCBmdy0+c2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JZndfc2l6ZSA9IGZ3LT5zaXplOwotCXJlbGVhc2VfZmlybXdhcmUoZncpOwotCWlmICghZmlybXdhcmVfYnVmKSB7Ci0JCXJ0U3RhdHVzID0gX0ZBSUw7Ci0JCWdvdG8gRXhpdDsKLQl9Ci0JYnVmID0gZmlybXdhcmVfYnVmOwotCi0JLyogIFRvIENoZWNrIEZ3IGhlYWRlci4gQWRkZWQgYnkgdHlubGkuIDIwMDkuMTIuMDQuICovCi0JcEZ3SGRyID0gKHN0cnVjdCBydF84NzIzYV9maXJtd2FyZV9oZHIgKilmaXJtd2FyZV9idWY7Ci0KLQlwSGFsRGF0YS0+RmlybXdhcmVWZXJzaW9uID0gbGUxNl90b19jcHUocEZ3SGRyLT5WZXJzaW9uKTsKLQlwSGFsRGF0YS0+RmlybXdhcmVTdWJWZXJzaW9uID0gcEZ3SGRyLT5TdWJ2ZXJzaW9uOwotCXBIYWxEYXRhLT5GaXJtd2FyZVNpZ25hdHVyZSA9IGxlMTZfdG9fY3B1KHBGd0hkci0+U2lnbmF0dXJlKTsKLQotCURCR184NzIzQSgiJXM6IGZ3X3ZlciA9JWQgZndfc3VidmVyID0lZCBzaWcgPSAweCV4XG4iLAotCQkgIF9fZnVuY19fLCBwSGFsRGF0YS0+RmlybXdhcmVWZXJzaW9uLAotCQkgIHBIYWxEYXRhLT5GaXJtd2FyZVN1YlZlcnNpb24sIHBIYWxEYXRhLT5GaXJtd2FyZVNpZ25hdHVyZSk7Ci0KLQlpZiAoIWxvZ192ZXJzaW9uKyspCi0JCXByX2luZm8oIiVzRmlybXdhcmUgVmVyc2lvbiAlZCwgU3ViVmVyc2lvbiAlZCwgU2lnbmF0dXJlICIKLQkJCSIweCV4XG4iLCBEUklWRVJfUFJFRklYLCBwSGFsRGF0YS0+RmlybXdhcmVWZXJzaW9uLAotCQkJcEhhbERhdGEtPkZpcm13YXJlU3ViVmVyc2lvbiwKLQkJCXBIYWxEYXRhLT5GaXJtd2FyZVNpZ25hdHVyZSk7Ci0KLQlpZiAoSVNfRldfSEVBREVSX0VYSVNUKHBGd0hkcikpIHsKLQkJLyogIFNoaWZ0IDMyIGJ5dGVzIGZvciBGVyBoZWFkZXIgKi8KLQkJYnVmID0gYnVmICsgMzI7Ci0JCWZ3X3NpemUgPSBmd19zaXplIC0gMzI7Ci0JfQotCi0JLyogIFN1Z2dlc3RlZCBieSBGaWxlbi4gSWYgODA1MSBpcyBydW5uaW5nIGluIFJBTSBjb2RlLCBkcml2ZXIgc2hvdWxkCi0JICAgIGluZm9ybSBGdyB0byByZXNldCBieSBpdHNlbGYsICovCi0JLyogIG9yIGl0IHdpbGwgY2F1c2UgZG93bmxvYWQgRncgZmFpbC4gMjAxMC4wMi4wMS4gYnkgdHlubGkuICovCi0JaWYgKHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgUkVHX01DVUZXREwpICYgUkFNX0RMX1NFTCkgewotCQkvKiA4MDUxIFJBTSBjb2RlICovCi0JCXJ0bDg3MjNhX0Zpcm13YXJlU2VsZlJlc2V0KHBhZGFwdGVyKTsKLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX01DVUZXREwsIDB4MDApOwotCX0KLQotCV9GV0Rvd25sb2FkRW5hYmxlKHBhZGFwdGVyLCB0cnVlKTsKLQlmd2RsX3N0YXJ0X3RpbWUgPSBqaWZmaWVzOwotCXdoaWxlICgxKSB7Ci0JCS8qIHJlc2V0IHRoZSBGV0RMIGNoa3N1bSAqLwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfTUNVRldETCwKLQkJCQkgcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBSRUdfTUNVRldETCkgfAotCQkJCSBGV0RMX0Noa1N1bV9ycHQpOwotCi0JCXJ0U3RhdHVzID0gX1dyaXRlRlcocGFkYXB0ZXIsIGJ1ZiwgZndfc2l6ZSk7Ci0KLQkJaWYgKHJ0U3RhdHVzID09IF9TVUNDRVNTIHx8Ci0JCSAgICAoamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gZndkbF9zdGFydF90aW1lKSA+IDUwMCAmJgotCQkgICAgIHdyaXRlRldfcmV0cnkrKyA+PSAzKSkKLQkJCWJyZWFrOwotCi0JCURCR184NzIzQSgiJXMgd3JpdGVGV19yZXRyeToldSwgdGltZSBhZnRlciBmd2RsX3N0YXJ0X3RpbWU6IgotCQkJICAiJXVtc1xuIiwgX19mdW5jX18sIHdyaXRlRldfcmV0cnksCi0JCQkgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIGZ3ZGxfc3RhcnRfdGltZSkpOwotCX0KLQlfRldEb3dubG9hZEVuYWJsZShwYWRhcHRlciwgZmFsc2UpOwotCWlmIChfU1VDQ0VTUyAhPSBydFN0YXR1cykgewotCQlEQkdfODcyM0EoIkRMIEZpcm13YXJlIGZhaWxlZCFcbiIpOwotCQlnb3RvIEV4aXQ7Ci0JfQotCi0JcnRTdGF0dXMgPSBfRldGcmVlVG9HbyhwYWRhcHRlcik7Ci0JaWYgKF9TVUNDRVNTICE9IHJ0U3RhdHVzKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfZXJyXywKLQkJCSAiREwgRmlybXdhcmUgZmFpbGVkIVxuIik7Ci0JCWdvdG8gRXhpdDsKLQl9Ci0JUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJICJGaXJtd2FyZSBpcyByZWFkeSB0byBydW4hXG4iKTsKLQotRXhpdDoKLQlrZnJlZShmaXJtd2FyZV9idWYpOwotCXJldHVybiBydFN0YXR1czsKLX0KLQotdm9pZCBydGw4NzIzYV9Jbml0aWFsaXplRmlybXdhcmVWYXJzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQkvKiAgSW5pdCBGdyBMUFMgcmVsYXRlZC4gKi8KLQlwYWRhcHRlci0+cHdyY3RybHByaXYuYkZ3Q3VycmVudEluUFNNb2RlID0gZmFsc2U7Ci0KLQkvKiAgSW5pdCBIMkMgY291bnRlci4gYnkgdHlubGkuIDIwMDkuMTIuMDkuICovCi0JcEhhbERhdGEtPkxhc3RITUVCb3hOdW0gPSAwOwotfQotCi0vKiAgKi8KLS8qCQkJCUVmdXNlIHJlbGF0ZWQgY29kZSAqLwotLyogICovCi1zdGF0aWMgdTgKLWhhbF9FZnVzZVN3aXRjaFRvQmFuayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBiYW5rKQotewotCXU4IGJSZXQgPSBmYWxzZTsKLQl1MzIgdmFsdWUzMiA9IDA7Ci0KLQlEQkdfODcyM0EoIiVzOiBFZnVzZSBzd2l0Y2ggYmFuayB0byAlZFxuIiwgX19mdW5jX18sIGJhbmspOwotCXZhbHVlMzIgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBFRlVTRV9URVNUKTsKLQliUmV0ID0gdHJ1ZTsKLQlzd2l0Y2ggKGJhbmspIHsKLQljYXNlIDA6Ci0JCXZhbHVlMzIgPSAodmFsdWUzMiAmIH5FRlVTRV9TRUxfTUFTSykgfAotCQkJRUZVU0VfU0VMKEVGVVNFX1dJRklfU0VMXzApOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCXZhbHVlMzIgPSAodmFsdWUzMiAmIH5FRlVTRV9TRUxfTUFTSykgfAotCQkJRUZVU0VfU0VMKEVGVVNFX0JUX1NFTF8wKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQl2YWx1ZTMyID0gKHZhbHVlMzIgJiB+RUZVU0VfU0VMX01BU0spIHwKLQkJCUVGVVNFX1NFTChFRlVTRV9CVF9TRUxfMSk7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJdmFsdWUzMiA9ICh2YWx1ZTMyICYgfkVGVVNFX1NFTF9NQVNLKSB8Ci0JCQlFRlVTRV9TRUwoRUZVU0VfQlRfU0VMXzIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQl2YWx1ZTMyID0gKHZhbHVlMzIgJiB+RUZVU0VfU0VMX01BU0spIHwKLQkJCUVGVVNFX1NFTChFRlVTRV9XSUZJX1NFTF8wKTsKLQkJYlJldCA9IGZhbHNlOwotCQlicmVhazsKLQl9Ci0JcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIEVGVVNFX1RFU1QsIHZhbHVlMzIpOwotCi0JcmV0dXJuIGJSZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1oYWxfUmVhZEVGdXNlX1dpRmkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICAgdTE2IF9vZmZzZXQsIHUxNiBfc2l6ZV9ieXRlLCB1OCAqcGJ1ZikKLXsKLQl1OCAqZWZ1c2VUYmwgPSBOVUxMOwotCXUxNiBlRnVzZV9BZGRyID0gMDsKLQl1OCBvZmZzZXQsIHdkZW47Ci0JdTggZWZ1c2VIZWFkZXIsIGVmdXNlRXh0SGRyLCBlZnVzZURhdGE7Ci0JdTE2IGksIHRvdGFsLCB1c2VkOwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JLyogIERvIE5PVCBleGNlc3MgdG90YWwgc2l6ZSBvZiBFRnVzZSB0YWJsZS4KLQkgICAgQWRkZWQgYnkgUm9nZXIsIDIwMDguMTEuMTAuICovCi0JaWYgKChfb2Zmc2V0ICsgX3NpemVfYnl0ZSkgPiBFRlVTRV9NQVBfTEVOXzg3MjNBKSB7Ci0JCURCR184NzIzQSgiJXM6IEludmFsaWQgb2Zmc2V0KCUjeCkgd2l0aCByZWFkIGJ5dGVzKCUjeCkhIVxuIiwKLQkJCSAgX19mdW5jX18sIF9vZmZzZXQsIF9zaXplX2J5dGUpOwotCQlyZXR1cm47Ci0JfQotCi0JZWZ1c2VUYmwgPSBrbWFsbG9jKEVGVVNFX01BUF9MRU5fODcyM0EsIEdGUF9LRVJORUwpOwotCWlmICghZWZ1c2VUYmwpCi0JCXJldHVybjsKLQkvKiAgMHhmZiB3aWxsIGJlIGVmdXNlIGRlZmF1bHQgdmFsdWUgaW5zdGVhZCBvZiAweDAwLiAqLwotCW1lbXNldChlZnVzZVRibCwgMHhGRiwgRUZVU0VfTUFQX0xFTl84NzIzQSk7Ci0KLQkvKiAgc3dpdGNoIGJhbmsgYmFjayB0byBiYW5rIDAgZm9yIGxhdGVyIEJUIGFuZCB3aWZpIHVzZS4gKi8KLQloYWxfRWZ1c2VTd2l0Y2hUb0JhbmsocGFkYXB0ZXIsIDApOwotCi0Jd2hpbGUgKEFWQUlMQUJMRV9FRlVTRV9BRERSKGVGdXNlX0FkZHIpKSB7Ci0JCVJlYWRFRnVzZUJ5dGUyM2EocGFkYXB0ZXIsIGVGdXNlX0FkZHIrKywgJmVmdXNlSGVhZGVyKTsKLQkJaWYgKGVmdXNlSGVhZGVyID09IDB4RkYpIHsKLQkJCURCR184NzIzQSgiJXM6IGRhdGEgZW5kIGF0IGFkZHJlc3MgPSUjeFxuIiwgX19mdW5jX18sCi0JCQkJICBlRnVzZV9BZGRyKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogIENoZWNrIFBHIGhlYWRlciBmb3Igc2VjdGlvbiBudW0uICovCi0JCWlmIChFWFRfSEVBREVSKGVmdXNlSGVhZGVyKSkgewkvKiBleHRlbmRlZCBoZWFkZXIgKi8KLQkJCW9mZnNldCA9IEdFVF9IRFJfT0ZGU0VUXzJfMChlZnVzZUhlYWRlcik7Ci0KLQkJCVJlYWRFRnVzZUJ5dGUyM2EocGFkYXB0ZXIsIGVGdXNlX0FkZHIrKywgJmVmdXNlRXh0SGRyKTsKLQkJCWlmIChBTExfV09SRFNfRElTQUJMRUQoZWZ1c2VFeHRIZHIpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlvZmZzZXQgfD0gKChlZnVzZUV4dEhkciAmIDB4RjApID4+IDEpOwotCQkJd2RlbiA9IGVmdXNlRXh0SGRyICYgMHgwRjsKLQkJfSBlbHNlIHsKLQkJCW9mZnNldCA9IChlZnVzZUhlYWRlciA+PiA0KSAmIDB4MGY7Ci0JCQl3ZGVuID0gZWZ1c2VIZWFkZXIgJiAweDBmOwotCQl9Ci0KLQkJaWYgKG9mZnNldCA8IEVGVVNFX01BWF9TRUNUSU9OXzg3MjNBKSB7Ci0JCQl1MTYgYWRkcjsKLQkJCS8qICBHZXQgd29yZCBlbmFibGUgdmFsdWUgZnJvbSBQRyBoZWFkZXIgKi8KLQotCQkJYWRkciA9IG9mZnNldCAqIFBHUEtUX0RBVEFfU0laRTsKLQkJCWZvciAoaSA9IDA7IGkgPCBFRlVTRV9NQVhfV09SRF9VTklUOyBpKyspIHsKLQkJCQkvKiBDaGVjayB3b3JkIGVuYWJsZSBjb25kaXRpb24gaW4gdGhlIHNlY3Rpb24gKi8KLQkJCQlpZiAoISh3ZGVuICYgKDB4MDEgPDwgaSkpKSB7Ci0JCQkJCVJlYWRFRnVzZUJ5dGUyM2EocGFkYXB0ZXIsIGVGdXNlX0FkZHIrKywKLQkJCQkJCSAgICAgICZlZnVzZURhdGEpOwotCQkJCQllZnVzZVRibFthZGRyXSA9IGVmdXNlRGF0YTsKLQotCQkJCQlSZWFkRUZ1c2VCeXRlMjNhKHBhZGFwdGVyLCBlRnVzZV9BZGRyKyssCi0JCQkJCQkgICAgICAmZWZ1c2VEYXRhKTsKLQkJCQkJZWZ1c2VUYmxbYWRkciArIDFdID0gZWZ1c2VEYXRhOwotCQkJCX0KLQkJCQlhZGRyICs9IDI7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlEQkdfODcyM0EoS0VSTl9FUlIgIiVzOiBvZmZzZXQoJWQpIGlzIGlsbGVnYWwhIVxuIiwKLQkJCQkgIF9fZnVuY19fLCBvZmZzZXQpOwotCQkJZUZ1c2VfQWRkciArPSBFZnVzZV9DYWxjdWxhdGVXb3JkQ250czIzYSh3ZGVuKSAqIDI7Ci0JCX0KLQl9Ci0KLQkvKiAgQ29weSBmcm9tIEVmdXNlIG1hcCB0byBvdXRwdXQgcG9pbnRlciBtZW1vcnkhISEgKi8KLQlmb3IgKGkgPSAwOyBpIDwgX3NpemVfYnl0ZTsgaSsrKQotCQlwYnVmW2ldID0gZWZ1c2VUYmxbX29mZnNldCArIGldOwotCi0JLyogIENhbGN1bGF0ZSBFZnVzZSB1dGlsaXphdGlvbiAqLwotCUVGVVNFX0dldEVmdXNlRGVmaW5pdGlvbjIzYShwYWRhcHRlciwgRUZVU0VfV0lGSSwKLQkJCQkgVFlQRV9BVkFJTEFCTEVfRUZVU0VfQllURVNfVE9UQUwsICZ0b3RhbCk7Ci0JdXNlZCA9IGVGdXNlX0FkZHIgLSAxOwotCXBIYWxEYXRhLT5FZnVzZVVzZWRCeXRlcyA9IHVzZWQ7Ci0KLQlrZnJlZShlZnVzZVRibCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1oYWxfUmVhZEVGdXNlX0JUKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCSB1MTYgX29mZnNldCwgdTE2IF9zaXplX2J5dGUsIHU4ICpwYnVmKQotewotCXU4ICplZnVzZVRibDsKLQl1OCBiYW5rOwotCXUxNiBlRnVzZV9BZGRyOwotCXU4IGVmdXNlSGVhZGVyLCBlZnVzZUV4dEhkciwgZWZ1c2VEYXRhOwotCXU4IG9mZnNldCwgd2RlbjsKLQl1MTYgaSwgdG90YWwsIHVzZWQ7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQkvKiAgRG8gTk9UIGV4Y2VzcyB0b3RhbCBzaXplIG9mIEVGdXNlIHRhYmxlLgotCSAgICBBZGRlZCBieSBSb2dlciwgMjAwOC4xMS4xMC4gKi8KLQlpZiAoKF9vZmZzZXQgKyBfc2l6ZV9ieXRlKSA+IEVGVVNFX0JUX01BUF9MRU4pIHsKLQkJREJHXzg3MjNBKCIlczogSW52YWxpZCBvZmZzZXQoJSN4KSB3aXRoIHJlYWQgYnl0ZXMoJSN4KSEhXG4iLAotCQkJICBfX2Z1bmNfXywgX29mZnNldCwgX3NpemVfYnl0ZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQllZnVzZVRibCA9IGttYWxsb2MoRUZVU0VfQlRfTUFQX0xFTiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFlZnVzZVRibCkKLQkJcmV0dXJuOwotCS8qICAweGZmIHdpbGwgYmUgZWZ1c2UgZGVmYXVsdCB2YWx1ZSBpbnN0ZWFkIG9mIDB4MDAuICovCi0JbWVtc2V0KGVmdXNlVGJsLCAweEZGLCBFRlVTRV9CVF9NQVBfTEVOKTsKLQotCUVGVVNFX0dldEVmdXNlRGVmaW5pdGlvbjIzYShwYWRhcHRlciwgRUZVU0VfQlQsCi0JCQkJIFRZUEVfQVZBSUxBQkxFX0VGVVNFX0JZVEVTX0JBTkssICZ0b3RhbCk7Ci0KLQlmb3IgKGJhbmsgPSAxOyBiYW5rIDwgRUZVU0VfTUFYX0JBTks7IGJhbmsrKykgewotCQlpZiAoaGFsX0VmdXNlU3dpdGNoVG9CYW5rKHBhZGFwdGVyLCBiYW5rKSA9PSBmYWxzZSkgewotCQkJREJHXzg3MjNBKCIlczogaGFsX0VmdXNlU3dpdGNoVG9CYW5rIEZhaWwhIVxuIiwKLQkJCQkgIF9fZnVuY19fKTsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCi0JCWVGdXNlX0FkZHIgPSAwOwotCi0JCXdoaWxlIChBVkFJTEFCTEVfRUZVU0VfQUREUihlRnVzZV9BZGRyKSkgewotCQkJUmVhZEVGdXNlQnl0ZTIzYShwYWRhcHRlciwgZUZ1c2VfQWRkcisrLCAmZWZ1c2VIZWFkZXIpOwotCQkJaWYgKGVmdXNlSGVhZGVyID09IDB4RkYpCi0JCQkJYnJlYWs7Ci0KLQkJCS8qICBDaGVjayBQRyBoZWFkZXIgZm9yIHNlY3Rpb24gbnVtLiAqLwotCQkJaWYgKEVYVF9IRUFERVIoZWZ1c2VIZWFkZXIpKSB7CS8qIGV4dGVuZGVkIGhlYWRlciAqLwotCQkJCW9mZnNldCA9IEdFVF9IRFJfT0ZGU0VUXzJfMChlZnVzZUhlYWRlcik7Ci0KLQkJCQlSZWFkRUZ1c2VCeXRlMjNhKHBhZGFwdGVyLCBlRnVzZV9BZGRyKyssCi0JCQkJCSAgICAgICZlZnVzZUV4dEhkcik7Ci0JCQkJaWYgKEFMTF9XT1JEU19ESVNBQkxFRChlZnVzZUV4dEhkcikpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJb2Zmc2V0IHw9ICgoZWZ1c2VFeHRIZHIgJiAweEYwKSA+PiAxKTsKLQkJCQl3ZGVuID0gZWZ1c2VFeHRIZHIgJiAweDBGOwotCQkJfSBlbHNlIHsKLQkJCQlvZmZzZXQgPSAoZWZ1c2VIZWFkZXIgPj4gNCkgJiAweDBmOwotCQkJCXdkZW4gPSBlZnVzZUhlYWRlciAmIDB4MGY7Ci0JCQl9Ci0KLQkJCWlmIChvZmZzZXQgPCBFRlVTRV9CVF9NQVhfU0VDVElPTikgewotCQkJCXUxNiBhZGRyOwotCi0JCQkJLyogIEdldCB3b3JkIGVuYWJsZSB2YWx1ZSBmcm9tIFBHIGhlYWRlciAqLwotCi0JCQkJYWRkciA9IG9mZnNldCAqIFBHUEtUX0RBVEFfU0laRTsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgRUZVU0VfTUFYX1dPUkRfVU5JVDsgaSsrKSB7Ci0JCQkJCS8qICBDaGVjayB3b3JkIGVuYWJsZSBjb25kaXRpb24gaW4KLQkJCQkJICAgIHRoZSBzZWN0aW9uICovCi0JCQkJCWlmICghKHdkZW4gJiAoMHgwMSA8PCBpKSkpIHsKLQkJCQkJCVJlYWRFRnVzZUJ5dGUyM2EocGFkYXB0ZXIsCi0JCQkJCQkJICAgICAgZUZ1c2VfQWRkcisrLAotCQkJCQkJCSAgICAgICZlZnVzZURhdGEpOwotCQkJCQkJZWZ1c2VUYmxbYWRkcl0gPSBlZnVzZURhdGE7Ci0KLQkJCQkJCVJlYWRFRnVzZUJ5dGUyM2EocGFkYXB0ZXIsCi0JCQkJCQkJICAgICAgZUZ1c2VfQWRkcisrLAotCQkJCQkJCSAgICAgICZlZnVzZURhdGEpOwotCQkJCQkJZWZ1c2VUYmxbYWRkciArIDFdID0gZWZ1c2VEYXRhOwotCQkJCQl9Ci0JCQkJCWFkZHIgKz0gMjsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCURCR184NzIzQShLRVJOX0VSUgotCQkJCQkgICIlczogb2Zmc2V0KCVkKSBpcyBpbGxlZ2FsISFcbiIsCi0JCQkJCSAgX19mdW5jX18sIG9mZnNldCk7Ci0JCQkJZUZ1c2VfQWRkciArPSBFZnVzZV9DYWxjdWxhdGVXb3JkQ250czIzYSh3ZGVuKSAqIDI7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoKGVGdXNlX0FkZHIgLSAxKSA8IHRvdGFsKSB7Ci0JCQlEQkdfODcyM0EoIiVzOiBiYW5rKCVkKSBkYXRhIGVuZCBhdCAlI3hcbiIsCi0JCQkJICBfX2Z1bmNfXywgYmFuaywgZUZ1c2VfQWRkciAtIDEpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKiAgc3dpdGNoIGJhbmsgYmFjayB0byBiYW5rIDAgZm9yIGxhdGVyIEJUIGFuZCB3aWZpIHVzZS4gKi8KLQloYWxfRWZ1c2VTd2l0Y2hUb0JhbmsocGFkYXB0ZXIsIDApOwotCi0JLyogIENvcHkgZnJvbSBFZnVzZSBtYXAgdG8gb3V0cHV0IHBvaW50ZXIgbWVtb3J5ISEhICovCi0JZm9yIChpID0gMDsgaSA8IF9zaXplX2J5dGU7IGkrKykKLQkJcGJ1ZltpXSA9IGVmdXNlVGJsW19vZmZzZXQgKyBpXTsKLQotCS8qICAqLwotCS8qICBDYWxjdWxhdGUgRWZ1c2UgdXRpbGl6YXRpb24uICovCi0JLyogICovCi0JRUZVU0VfR2V0RWZ1c2VEZWZpbml0aW9uMjNhKHBhZGFwdGVyLCBFRlVTRV9CVCwKLQkJCQkgVFlQRV9BVkFJTEFCTEVfRUZVU0VfQllURVNfVE9UQUwsICZ0b3RhbCk7Ci0JdXNlZCA9IChFRlVTRV9CVF9SRUFMX0JBTktfQ09OVEVOVF9MRU4gKiAoYmFuayAtIDEpKSArIGVGdXNlX0FkZHIgLSAxOwotCXBIYWxEYXRhLT5CVEVmdXNlVXNlZEJ5dGVzID0gdXNlZDsKLQotZXhpdDoKLQlrZnJlZShlZnVzZVRibCk7Ci19Ci0KLXZvaWQKLXJ0bDg3MjNhX3JlYWRlZnVzZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICB1OCBlZnVzZVR5cGUsIHUxNiBfb2Zmc2V0LCB1MTYgX3NpemVfYnl0ZSwgdTggKnBidWYpCi17Ci0JaWYgKGVmdXNlVHlwZSA9PSBFRlVTRV9XSUZJKQotCQloYWxfUmVhZEVGdXNlX1dpRmkocGFkYXB0ZXIsIF9vZmZzZXQsIF9zaXplX2J5dGUsIHBidWYpOwotCWVsc2UKLQkJaGFsX1JlYWRFRnVzZV9CVChwYWRhcHRlciwgX29mZnNldCwgX3NpemVfYnl0ZSwgcGJ1Zik7Ci19Ci0KLXUxNiBydGw4NzIzYV9FZnVzZUdldEN1cnJlbnRTaXplX1dpRmkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1MTYgZWZ1c2VfYWRkciA9IDA7Ci0JdTggaG9mZnNldCA9IDAsIGh3b3JkZW4gPSAwOwotCXU4IGVmdXNlX2RhdGEsIHdvcmRfY250cyA9IDA7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQllZnVzZV9hZGRyID0gcEhhbERhdGEtPkVmdXNlVXNlZEJ5dGVzOwotCi0JREJHXzg3MjNBKCIlczogc3RhcnRfZWZ1c2VfYWRkciA9IDB4JVhcbiIsIF9fZnVuY19fLCBlZnVzZV9hZGRyKTsKLQotCS8qICBzd2l0Y2ggYmFuayBiYWNrIHRvIGJhbmsgMCBmb3IgbGF0ZXIgQlQgYW5kIHdpZmkgdXNlLiAqLwotCWhhbF9FZnVzZVN3aXRjaFRvQmFuayhwYWRhcHRlciwgMCk7Ci0KLQl3aGlsZSAoQVZBSUxBQkxFX0VGVVNFX0FERFIoZWZ1c2VfYWRkcikpIHsKLQkJaWYgKGVmdXNlX09uZUJ5dGVSZWFkMjNhKHBhZGFwdGVyLCBlZnVzZV9hZGRyLCAmZWZ1c2VfZGF0YSkgPT0KLQkJICAgIF9GQUlMKSB7Ci0JCQlEQkdfODcyM0EoS0VSTl9FUlIgIiVzOiBlZnVzZV9PbmVCeXRlUmVhZDIzYSBGYWlsISAiCi0JCQkJICAiYWRkciA9IDB4JVggISFcbiIsIF9fZnVuY19fLCBlZnVzZV9hZGRyKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGVmdXNlX2RhdGEgPT0gMHhGRikKLQkJCWJyZWFrOwotCi0JCWlmIChFWFRfSEVBREVSKGVmdXNlX2RhdGEpKSB7Ci0JCQlob2Zmc2V0ID0gR0VUX0hEUl9PRkZTRVRfMl8wKGVmdXNlX2RhdGEpOwotCQkJZWZ1c2VfYWRkcisrOwotCQkJZWZ1c2VfT25lQnl0ZVJlYWQyM2EocGFkYXB0ZXIsIGVmdXNlX2FkZHIsICZlZnVzZV9kYXRhKTsKLQkJCWlmIChBTExfV09SRFNfRElTQUJMRUQoZWZ1c2VfZGF0YSkpCi0JCQkJY29udGludWU7Ci0KLQkJCWhvZmZzZXQgfD0gKChlZnVzZV9kYXRhICYgMHhGMCkgPj4gMSk7Ci0JCQlod29yZGVuID0gZWZ1c2VfZGF0YSAmIDB4MEY7Ci0JCX0gZWxzZSB7Ci0JCQlob2Zmc2V0ID0gKGVmdXNlX2RhdGEgPj4gNCkgJiAweDBGOwotCQkJaHdvcmRlbiA9IGVmdXNlX2RhdGEgJiAweDBGOwotCQl9Ci0KLQkJd29yZF9jbnRzID0gRWZ1c2VfQ2FsY3VsYXRlV29yZENudHMyM2EoaHdvcmRlbik7Ci0JCWVmdXNlX2FkZHIgKz0gKHdvcmRfY250cyAqIDIpICsgMTsKLQl9Ci0KLQlwSGFsRGF0YS0+RWZ1c2VVc2VkQnl0ZXMgPSBlZnVzZV9hZGRyOwotCi0JREJHXzg3MjNBKCIlczogQ3VycmVudFNpemUgPSVkXG4iLCBfX2Z1bmNfXywgZWZ1c2VfYWRkcik7Ci0KLQlyZXR1cm4gZWZ1c2VfYWRkcjsKLX0KLQotdTE2IHJ0bDg3MjNhX0VmdXNlR2V0Q3VycmVudFNpemVfQlQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1MTYgYnR1c2VkYnl0ZXM7Ci0JdTE2IGVmdXNlX2FkZHI7Ci0JdTggYmFuaywgc3RhcnRCYW5rOwotCXU4IGhvZmZzZXQgPSAwLCBod29yZGVuID0gMDsKLQl1OCBlZnVzZV9kYXRhLCB3b3JkX2NudHMgPSAwOwotCXUxNiByZXRVMiA9IDA7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlidHVzZWRieXRlcyA9IHBIYWxEYXRhLT5CVEVmdXNlVXNlZEJ5dGVzOwotCi0JZWZ1c2VfYWRkciA9ICh1MTYpICgoYnR1c2VkYnl0ZXMgJSBFRlVTRV9CVF9SRUFMX0JBTktfQ09OVEVOVF9MRU4pKTsKLQlzdGFydEJhbmsgPSAodTgpICgxICsgKGJ0dXNlZGJ5dGVzIC8gRUZVU0VfQlRfUkVBTF9CQU5LX0NPTlRFTlRfTEVOKSk7Ci0KLQlEQkdfODcyM0EoIiVzOiBzdGFydCBmcm9tIGJhbmsgPSVkIGFkZHIgPSAweCVYXG4iLCBfX2Z1bmNfXywgc3RhcnRCYW5rLAotCQkgIGVmdXNlX2FkZHIpOwotCi0JRUZVU0VfR2V0RWZ1c2VEZWZpbml0aW9uMjNhKHBhZGFwdGVyLCBFRlVTRV9CVCwKLQkJCQkgVFlQRV9BVkFJTEFCTEVfRUZVU0VfQllURVNfQkFOSywgJnJldFUyKTsKLQotCWZvciAoYmFuayA9IHN0YXJ0QmFuazsgYmFuayA8IEVGVVNFX01BWF9CQU5LOyBiYW5rKyspIHsKLQkJaWYgKGhhbF9FZnVzZVN3aXRjaFRvQmFuayhwYWRhcHRlciwgYmFuaykgPT0gZmFsc2UpIHsKLQkJCURCR184NzIzQShLRVJOX0VSUiAiJXM6IHN3aXRjaCBiYW5rKCVkKSBGYWlsISFcbiIsCi0JCQkJICBfX2Z1bmNfXywgYmFuayk7Ci0JCQliYW5rID0gRUZVU0VfTUFYX0JBTks7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qICBvbmx5IHdoZW4gYmFuayBpcyBzd2l0Y2hlZCB3ZSBoYXZlIHRvIHJlc2V0Ci0JCSAgICB0aGUgZWZ1c2VfYWRkci4gKi8KLQkJaWYgKGJhbmsgIT0gc3RhcnRCYW5rKQotCQkJZWZ1c2VfYWRkciA9IDA7Ci0KLQkJd2hpbGUgKEFWQUlMQUJMRV9FRlVTRV9BRERSKGVmdXNlX2FkZHIpKSB7Ci0JCQlpZiAoZWZ1c2VfT25lQnl0ZVJlYWQyM2EocGFkYXB0ZXIsIGVmdXNlX2FkZHIsCi0JCQkJCSAgICAgICZlZnVzZV9kYXRhKSA9PSBfRkFJTCkgewotCQkJCURCR184NzIzQShLRVJOX0VSUiAiJXM6IGVmdXNlX09uZUJ5dGVSZWFkMjNhIEZhaWwhIgotCQkJCQkgICIgYWRkciA9IDB4JVggISFcbiIsCi0JCQkJCSAgX19mdW5jX18sIGVmdXNlX2FkZHIpOwotCQkJCWJhbmsgPSBFRlVTRV9NQVhfQkFOSzsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKGVmdXNlX2RhdGEgPT0gMHhGRikKLQkJCQlicmVhazsKLQotCQkJaWYgKEVYVF9IRUFERVIoZWZ1c2VfZGF0YSkpIHsKLQkJCQlob2Zmc2V0ID0gR0VUX0hEUl9PRkZTRVRfMl8wKGVmdXNlX2RhdGEpOwotCQkJCWVmdXNlX2FkZHIrKzsKLQkJCQllZnVzZV9PbmVCeXRlUmVhZDIzYShwYWRhcHRlciwgZWZ1c2VfYWRkciwKLQkJCQkJCSAgJmVmdXNlX2RhdGEpOwotCQkJCWlmIChBTExfV09SRFNfRElTQUJMRUQoZWZ1c2VfZGF0YSkpIHsKLQkJCQkJZWZ1c2VfYWRkcisrOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlob2Zmc2V0IHw9ICgoZWZ1c2VfZGF0YSAmIDB4RjApID4+IDEpOwotCQkJCWh3b3JkZW4gPSBlZnVzZV9kYXRhICYgMHgwRjsKLQkJCX0gZWxzZSB7Ci0JCQkJaG9mZnNldCA9IChlZnVzZV9kYXRhID4+IDQpICYgMHgwRjsKLQkJCQlod29yZGVuID0gZWZ1c2VfZGF0YSAmIDB4MEY7Ci0JCQl9Ci0JCQl3b3JkX2NudHMgPSBFZnVzZV9DYWxjdWxhdGVXb3JkQ250czIzYShod29yZGVuKTsKLQkJCS8qIHJlYWQgbmV4dCBoZWFkZXIgKi8KLQkJCWVmdXNlX2FkZHIgKz0gKHdvcmRfY250cyAqIDIpICsgMTsKLQkJfQotCi0JCS8qICBDaGVjayBpZiB3ZSBuZWVkIHRvIGNoZWNrIG5leHQgYmFuayBlZnVzZSAqLwotCQlpZiAoZWZ1c2VfYWRkciA8IHJldFUyKQotCQkJYnJlYWs7CS8qICBkb24ndCBuZWVkIHRvIGNoZWNrIG5leHQgYmFuay4gKi8KLQl9Ci0KLQlyZXRVMiA9ICgoYmFuayAtIDEpICogRUZVU0VfQlRfUkVBTF9CQU5LX0NPTlRFTlRfTEVOKSArIGVmdXNlX2FkZHI7Ci0JcEhhbERhdGEtPkJURWZ1c2VVc2VkQnl0ZXMgPSByZXRVMjsKLQotCURCR184NzIzQSgiJXM6IEN1cnJlbnRTaXplID0lZFxuIiwgX19mdW5jX18sIHJldFUyKTsKLQlyZXR1cm4gcmV0VTI7Ci19Ci0KLXZvaWQgcnRsODcyM2FfcmVhZF9jaGlwX3ZlcnNpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1MzIgdmFsdWUzMjsKLQlzdHJ1Y3QgaGFsX3ZlcnNpb24gQ2hpcFZlcnNpb247Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCXZhbHVlMzIgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfU1lTX0NGRyk7Ci0JQ2hpcFZlcnNpb24uSUNUeXBlID0gQ0hJUF84NzIzQTsKLQlDaGlwVmVyc2lvbi5DaGlwVHlwZSA9ICgodmFsdWUzMiAmIFJUTF9JRCkgPyBURVNUX0NISVAgOiBOT1JNQUxfQ0hJUCk7Ci0JcEhhbERhdGEtPnJmX3R5cGUgPSBSRl8xVDFSOwotCUNoaXBWZXJzaW9uLlZlbmRvclR5cGUgPQotCQkoKHZhbHVlMzIgJiBWRU5ET1JfSUQpID8gQ0hJUF9WRU5ET1JfVU1DIDogQ0hJUF9WRU5ET1JfVFNNQyk7Ci0JQ2hpcFZlcnNpb24uQ1VUVmVyc2lvbiA9ICh2YWx1ZTMyICYgQ0hJUF9WRVJfUlRMX01BU0spID4+IENISVBfVkVSX1JUTF9TSElGVDsJLyogIElDIHZlcnNpb24gKENVVCkgKi8KLQotCS8qICBGb3IgcmVndWxhdG9yIG1vZGUuIGJ5IHR5bmxpLiAyMDExLjAxLjE0ICovCi0JcEhhbERhdGEtPlJlZ3VsYXRvck1vZGUgPSAoKHZhbHVlMzIgJiBTUFNfU0VMKSA/Ci0JCQkJICAgUlRfTERPX1JFR1VMQVRPUiA6IFJUX1NXSVRDSElOR19SRUdVTEFUT1IpOwotCi0JdmFsdWUzMiA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIFJFR19HUElPX09VVFNUUyk7Ci0JLyogIFJPTSBjb2RlIHZlcnNpb24uICovCi0JQ2hpcFZlcnNpb24uUk9NVmVyID0gKHZhbHVlMzIgJiBSRl9STF9JRCkgPj4gMjA7Ci0KLQkvKiAgRm9yIG11bHRpLWZ1bmN0aW9uIGNvbnNpZGVyYXRpb24uIEFkZGVkIGJ5IFJvZ2VyLCAyMDEwLjEwLjA2LiAqLwotCXBIYWxEYXRhLT5NdWx0aUZ1bmMgPSBSVF9NVUxUSV9GVU5DX05PTkU7Ci0JdmFsdWUzMiA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIFJFR19NVUxUSV9GVU5DX0NUUkwpOwotCXBIYWxEYXRhLT5NdWx0aUZ1bmMgfD0KLQkJKCh2YWx1ZTMyICYgV0xfRlVOQ19FTikgPyBSVF9NVUxUSV9GVU5DX1dJRkkgOiAwKTsKLQlwSGFsRGF0YS0+TXVsdGlGdW5jIHw9ICgodmFsdWUzMiAmIEJUX0ZVTkNfRU4pID8gUlRfTVVMVElfRlVOQ19CVCA6IDApOwotCXBIYWxEYXRhLT5NdWx0aUZ1bmMgfD0KLQkJKCh2YWx1ZTMyICYgR1BTX0ZVTkNfRU4pID8gUlRfTVVMVElfRlVOQ19HUFMgOiAwKTsKLQlwSGFsRGF0YS0+UG9sYXJpdHlDdGwgPQotCQkoKHZhbHVlMzIgJiBXTF9IV1BETl9TTCkgPyBSVF9QT0xBUklUWV9ISUdIX0FDVCA6Ci0JCSBSVF9QT0xBUklUWV9MT1dfQUNUKTsKLQlwSGFsRGF0YS0+VmVyc2lvbklEID0gQ2hpcFZlcnNpb247Ci0KLQlNU0dfODcyM0EoIlJGX1R5cGUgaXMgJXghIVxuIiwgcEhhbERhdGEtPnJmX3R5cGUpOwotfQotCi0vKiAgKi8KLS8qICAqLwotLyogIDIwMTAwMjA5IEpvc2VwaDogKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgb25seSBmb3IgOTJDIHRvIHNldCBSRUdfQkNOX0NUUkwoMHg1NTApIHJlZ2lzdGVyLiAqLwotLyogIFdlIGp1c3QgcmVzZXJ2ZSB0aGUgdmFsdWUgb2YgdGhlIHJlZ2lzdGVyIGluIHZhcmlhYmxlCi0gICAgcEhhbERhdGEtPlJlZ0JjbkN0cmxWYWwgYW5kIHRoZW4gb3BlcmF0ZSAqLwotLyogIHRoZSB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXIgdmlhIGF0b21pYyBvcGVyYXRpb24uICovCi0vKiAgVGhpcyBwcmV2ZW50cyBmcm9tIHJhY2UgY29uZGl0aW9uIHdoZW4gc2V0dGluZyB0aGlzIHJlZ2lzdGVyLiAqLwotLyogIFRoZSB2YWx1ZSBvZiBwSGFsRGF0YS0+UmVnQmNuQ3RybFZhbCBpcyBpbml0aWFsaXplZCBpbgotICAgIEh3Q29uZmlndXJlUlRMODE5MkNFKCkgZnVuY3Rpb24uICovCi0vKiAgKi8KLXZvaWQgU2V0QmNuQ3RybFJlZzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBTZXRCaXRzLCB1OCBDbGVhckJpdHMpCi17Ci0JdTggdmFsODsKLQotCXZhbDggPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19CQ05fQ1RSTCk7Ci0JdmFsOCB8PSBTZXRCaXRzOwotCXZhbDggJj0gfkNsZWFyQml0czsKLQotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19CQ05fQ1RSTCwgdmFsOCk7Ci19Ci0KLXZvaWQgcnRsODcyM2FfSW5pdEJlYWNvblBhcmFtZXRlcnMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX0JDTl9DVFJMLCAweDEwMTApOwotCi0JLyogIFRPRE86IFJlbW92ZSB0aGVzZSBtYWdpYyBudW1iZXIgKi8KLQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX1RCVFRfUFJPSElCSVQsIDB4NjQwNCk7CS8qICBtcyAqLwotCS8qICBGaXJtd2FyZSB3aWxsIGNvbnRyb2wgUkVHX0RSVkVSTFlJTlQgd2hlbiBwb3dlciBzYXZpbmcgaXMgZW5hYmxlLCAqLwotCS8qICBzbyBkb24ndCBzZXQgdGhpcyByZWdpc3RlciBvbiBTVEEgbW9kZS4gKi8KLQlpZiAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpID09IGZhbHNlKQotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfRFJWRVJMWUlOVCwKLQkJCQkgRFJJVkVSX0VBUkxZX0lOVF9USU1FKTsKLQkvKiAgMm1zICovCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0JDTkRNQVRJTSwgQkNOX0RNQV9BVElNRV9JTlRfVElNRSk7Ci0KLQkvKiAgU3VnZ2VzdGVkIGJ5IGRlc2lnbmVyIHRpbWNoZW4uIENoYW5nZSBiZWFjb24gQUlGUyB0byB0aGUKLQkgICAgbGFyZ2VzdCBudW1iZXIgYmVhY2F1c2UgdGVzdCBjaGlwIGRvZXMgbm90IGNvbnRlbnNpb24gYmVmb3JlCi0JICAgIHNlbmRpbmcgYmVhY29uLiBieSB0eW5saS4gMjAwOS4xMS4wMyAqLwotCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfQkNOVENGRywgMHg2NjBGKTsKLX0KLQotc3RhdGljIHZvaWQgUmVzdW1lVHhCZWFjb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCS8qICAyMDEwLjAzLjAxLiBNYXJrZWQgYnkgdHlubGkuIE5vIG5lZWQgdG8gY2FsbCB3b3JraXRlbSBiZWFjYXVzZQotCSAgICB3ZSByZWNvcmQgdGhlIHZhbHVlICovCi0JLyogIHdoaWNoIHNob3VsZCBiZSByZWFkIGZyb20gcmVnaXN0ZXIgdG8gYSBnbG9iYWwgdmFyaWFibGUuICovCi0KLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywgIitSZXN1bWVUeEJlYWNvblxuIik7Ci0KLQlwSGFsRGF0YS0+UmVnRndId1R4UUN0cmwgfD0gQklUKDYpOwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19GV0hXX1RYUV9DVFJMICsgMiwKLQkJCSBwSGFsRGF0YS0+UmVnRndId1R4UUN0cmwpOwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19UQlRUX1BST0hJQklUICsgMSwgMHhmZik7Ci0JcEhhbERhdGEtPlJlZ1JlZzU0MiB8PSBCSVQoMCk7Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1RCVFRfUFJPSElCSVQgKyAyLCBwSGFsRGF0YS0+UmVnUmVnNTQyKTsKLX0KLQotc3RhdGljIHZvaWQgU3RvcFR4QmVhY29uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQkvKiAgMjAxMC4wMy4wMS4gTWFya2VkIGJ5IHR5bmxpLiBObyBuZWVkIHRvIGNhbGwgd29ya2l0ZW0gYmVhY2F1c2UKLQkgICAgd2UgcmVjb3JkIHRoZSB2YWx1ZSAqLwotCS8qICB3aGljaCBzaG91bGQgYmUgcmVhZCBmcm9tIHJlZ2lzdGVyIHRvIGEgZ2xvYmFsIHZhcmlhYmxlLiAqLwotCi0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sICIrU3RvcFR4QmVhY29uXG4iKTsKLQotCXBIYWxEYXRhLT5SZWdGd0h3VHhRQ3RybCAmPSB+QklUKDYpOwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19GV0hXX1RYUV9DVFJMICsgMiwKLQkJCSBwSGFsRGF0YS0+UmVnRndId1R4UUN0cmwpOwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19UQlRUX1BST0hJQklUICsgMSwgMHg2NCk7Ci0JcEhhbERhdGEtPlJlZ1JlZzU0MiAmPSB+QklUKDApOwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19UQlRUX1BST0hJQklUICsgMiwgcEhhbERhdGEtPlJlZ1JlZzU0Mik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9CZWFjb25GdW5jdGlvbkVuYWJsZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBFbmFibGUsCi0JCQkJICB1OCBMaW5rZWQpCi17Ci0JU2V0QmNuQ3RybFJlZzIzYShwYWRhcHRlciwgRElTX1RTRl9VRFQgfCBFTl9CQ05fRlVOQ1RJT04gfCBESVNfQkNOUV9TVUIsCi0JCSAgICAgIDApOwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19SRF9DVFJMICsgMSwgMHg2Rik7Ci19Ci0KLXZvaWQgcnRsODcyM2FfU2V0QmVhY29uUmVsYXRlZFJlZ2lzdGVycyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXUzMiB2YWx1ZTMyOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQkvKiByZXNldCBUU0YsIGVuYWJsZSB1cGRhdGUgVFNGLCBjb3JyZWN0aW5nIFRTRiBPbiBCZWFjb24gKi8KLQotCS8qIFJFR19CQ05fSU5URVJWQUwgKi8KLQkvKiBSRUdfQkNORE1BVElNICovCi0JLyogUkVHX0FUSU1XTkQgKi8KLQkvKiBSRUdfVEJUVF9QUk9ISUJJVCAqLwotCS8qIFJFR19EUlZFUkxZSU5UICovCi0JLyogUkVHX0JDTl9NQVhfRVJSICovCi0JLyogUkVHX0JDTlRDRkcgKDB4NTEwKSAqLwotCS8qIFJFR19EVUFMX1RTRl9SU1QgKi8KLQkvKiBSRUdfQkNOX0NUUkwgKDB4NTUwKSAqLwotCi0JLyogICovCi0JLyogIEFUSU0gd2luZG93ICovCi0JLyogICovCi0JcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19BVElNV05ELCAyKTsKLQotCS8qICAqLwotCS8qICBCZWFjb24gaW50ZXJ2YWwgKGluIHVuaXQgb2YgVFUpLiAqLwotCS8qICAqLwotCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfQkNOX0lOVEVSVkFMLCBwbWxtZWluZm8tPmJjbl9pbnRlcnZhbCk7Ci0KLQlydGw4NzIzYV9Jbml0QmVhY29uUGFyYW1ldGVycyhwYWRhcHRlcik7Ci0KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfU0xPVCwgMHgwOSk7Ci0KLQkvKiAgKi8KLQkvKiAgUmVzZXQgVFNGIFRpbWVyIHRvIHplcm8sIGFkZGVkIGJ5IFJvZ2VyLiAyMDA4LjA2LjI0ICovCi0JLyogICovCi0JdmFsdWUzMiA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIFJFR19UQ1IpOwotCXZhbHVlMzIgJj0gflRTRlJTVDsKLQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgUkVHX1RDUiwgdmFsdWUzMik7Ci0KLQl2YWx1ZTMyIHw9IFRTRlJTVDsKLQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgUkVHX1RDUiwgdmFsdWUzMik7Ci0KLQkvKiAgTk9URTogRml4IHRlc3QgY2hpcCdzIGJ1ZyAoYWJvdXQgY29udGVudGlvbiB3aW5kb3dzJ3MgcmFuZG9tbmVzcykgKi8KLQlpZiAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX0FESE9DX1NUQVRFIHwKLQkJCSAgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUgfCBXSUZJX0FQX1NUQVRFKSA9PSB0cnVlKSB7Ci0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19SWFRTRl9PRkZTRVRfQ0NLLCAweDUwKTsKLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1JYVFNGX09GRlNFVF9PRkRNLCAweDUwKTsKLQl9Ci0KLQlfQmVhY29uRnVuY3Rpb25FbmFibGUocGFkYXB0ZXIsIHRydWUsIHRydWUpOwotCi0JUmVzdW1lVHhCZWFjb24ocGFkYXB0ZXIpOwotCVNldEJjbkN0cmxSZWcyM2EocGFkYXB0ZXIsIERJU19CQ05RX1NVQiwgMCk7Ci19Ci0KLXZvaWQgcnRsODcyM2FfU2V0SGFsT0RNVmFyKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwKLQkJCSAgIGVudW0gaGFsX29kbV92YXJpYWJsZSBlVmFyaWFibGUsCi0JCQkgICB2b2lkICpwVmFsdWUxLCBib29sIGJTZXQpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlzdHJ1Y3QgZG1fb2RtX3QgKnBvZG1wcml2ID0gJnBIYWxEYXRhLT5vZG1wcml2OwotCXN3aXRjaCAoZVZhcmlhYmxlKSB7Ci0JY2FzZSBIQUxfT0RNX1NUQV9JTkZPOgotCXsKLQkJc3RydWN0IHN0YV9pbmZvICpwc3RhID0gKHN0cnVjdCBzdGFfaW5mbyAqKXBWYWx1ZTE7Ci0KLQkJaWYgKGJTZXQpIHsKLQkJCURCR184NzIzQSgiU2V0IFNUQV8oJWQpIGluZm9cbiIsIHBzdGEtPm1hY19pZCk7Ci0JCQlPRE1fQ21uSW5mb1B0ckFycmF5SG9vazIzYShwb2RtcHJpdiwKLQkJCQkJCU9ETV9DTU5JTkZPX1NUQV9TVEFUVVMsCi0JCQkJCQlwc3RhLT5tYWNfaWQsIHBzdGEpOwotCQl9IGVsc2UgewotCQkJREJHXzg3MjNBKCJDbGVhbiBTVEFfKCVkKSBpbmZvXG4iLCBwc3RhLT5tYWNfaWQpOwotCQkJCU9ETV9DbW5JbmZvUHRyQXJyYXlIb29rMjNhKHBvZG1wcml2LAotCQkJCQkJCU9ETV9DTU5JTkZPX1NUQV9TVEFUVVMsCi0JCQkJCQkJcHN0YS0+bWFjX2lkLCBOVUxMKTsKLQkJfQotCX0KLQkJYnJlYWs7Ci0JY2FzZSBIQUxfT0RNX1AyUF9TVEFURToKLQkJT0RNX0NtbkluZm9VcGRhdGUyM2EocG9kbXByaXYsIE9ETV9DTU5JTkZPX1dJRklfRElSRUNULCBiU2V0KTsKLQkJYnJlYWs7Ci0JY2FzZSBIQUxfT0RNX1dJRklfRElTUExBWV9TVEFURToKLQkJT0RNX0NtbkluZm9VcGRhdGUyM2EocG9kbXByaXYsIE9ETV9DTU5JTkZPX1dJRklfRElTUExBWSwgYlNldCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLX0KLQotdm9pZCBydGw4NzIzYV9ub3RjaF9maWx0ZXIoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCBib29sIGVuYWJsZSkKLXsKLQlpZiAoZW5hYmxlKSB7Ci0JCURCR184NzIzQSgiRW5hYmxlIG5vdGNoIGZpbHRlclxuIik7Ci0JCXJ0bDg3MjNhdV93cml0ZTgoYWRhcHRlciwgck9GRE0wX1J4RFNQICsgMSwKLQkJCQkgcnRsODcyM2F1X3JlYWQ4KGFkYXB0ZXIsIHJPRkRNMF9SeERTUCArIDEpIHwKLQkJCQkgQklUKDEpKTsKLQl9IGVsc2UgewotCQlEQkdfODcyM0EoIkRpc2FibGUgbm90Y2ggZmlsdGVyXG4iKTsKLQkJcnRsODcyM2F1X3dyaXRlOChhZGFwdGVyLCByT0ZETTBfUnhEU1AgKyAxLAotCQkJICAgcnRsODcyM2F1X3JlYWQ4KGFkYXB0ZXIsIHJPRkRNMF9SeERTUCArIDEpICYKLQkJCQkgfkJJVCgxKSk7Ci0JfQotfQotCi1ib29sIGMyaF9pZF9maWx0ZXJfY2N4Xzg3MjNhKHU4IGlkKQotewotCWJvb2wgcmV0ID0gZmFsc2U7Ci0JaWYgKGlkID09IEMySF9DQ1hfVFhfUlBUKQotCQlyZXQgPSB0cnVlOwotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IGMyaF9oYW5kbGVyXzg3MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBjMmhfZXZ0X2hkciAqYzJoX2V2dCkKLXsKLQlpbnQgcmV0ID0gX1NVQ0NFU1M7Ci0JdTggaSA9IDA7Ci0KLQlpZiAoYzJoX2V2dCA9PSBOVUxMKSB7Ci0JCURCR184NzIzQSgiJXMgYzJoX2V2dCBpcyBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0Jc3dpdGNoIChjMmhfZXZ0LT5pZCkgewotCWNhc2UgQzJIX0RCRzoKLQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAiQzJIQ29tbWFuZEhhbmRsZXI6ICVzXG4iLCBjMmhfZXZ0LT5wYXlsb2FkKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEMySF9DQ1hfVFhfUlBUOgotCQloYW5kbGVfdHhycHRfY2N4Xzg3MjNhKHBhZGFwdGVyLCBjMmhfZXZ0LT5wYXlsb2FkKTsKLQkJYnJlYWs7Ci0JY2FzZSBDMkhfRVhUX1JBX1JQVDoKLQkJYnJlYWs7Ci0JY2FzZSBDMkhfSFdfSU5GT19FWENIOgotCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJICJbQlRdLCBDMkhfSFdfSU5GT19FWENIXG4iKTsKLQkJZm9yIChpID0gMDsgaSA8IGMyaF9ldnQtPnBsZW47IGkrKykgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCQkgIltCVF0sIHRtcEJ1ZlslZF09IDB4JXhcbiIsIGksCi0JCQkJIGMyaF9ldnQtPnBheWxvYWRbaV0pOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBDMkhfQzJIX0gyQ19URVNUOgotCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJICJbQlRdLCBDMkhfSDJDX1RFU1RcbiIpOwotCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJICJbQlRdLCB0bXBCdWZbMF0vWzFdL1syXS9bM10vWzRdPSAweCV4LyAweCV4LyAweCV4LyAweCV4LyAweCV4XG4iLAotCQkJIGMyaF9ldnQtPnBheWxvYWRbMF0sCi0JCQkgYzJoX2V2dC0+cGF5bG9hZFsxXSwgYzJoX2V2dC0+cGF5bG9hZFsyXSwKLQkJCSBjMmhfZXZ0LT5wYXlsb2FkWzNdLCBjMmhfZXZ0LT5wYXlsb2FkWzRdKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEMySF9CVF9JTkZPOgotCQlEQkdfODcyM0EoIiVzICwgIEdvdCAgQzJIX0JUX0lORk8gXG4iLCBfX2Z1bmNfXyk7Ci0JCXJ0bDg3MjNhX2Z3X2MyaF9CVF9pbmZvKHBhZGFwdGVyLAotCQkJCQljMmhfZXZ0LT5wYXlsb2FkLCBjMmhfZXZ0LT5wbGVuKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXQgPSBfRkFJTDsKLQkJYnJlYWs7Ci0JfQotCi1leGl0OgotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgaGFuZGxlX3R4cnB0X2NjeF84NzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIHZvaWQgKmJ1ZikKLXsKLQlzdHJ1Y3QgdHhycHRfY2N4Xzg3MjNhICp0eHJwdF9jY3ggPSBidWY7Ci0Jc3RydWN0IHN1Ym1pdF9jdHggKnBhY2tfdHhfb3BzID0gJmFkYXB0ZXItPnhtaXRwcml2LmFja190eF9vcHM7Ci0KLQlpZiAodHhycHRfY2N4LT5pbnRfY2N4ICYmIGFkYXB0ZXItPnhtaXRwcml2LmFja190eCkgewotCQlpZiAodHhycHRfY2N4LT5wa3Rfb2spCi0JCQlydHcyM2Ffc2N0eF9kb25lX2VycigmcGFja190eF9vcHMsCi0JCQkJCSAgICAgUlRXX1NDVFhfRE9ORV9TVUNDRVNTKTsKLQkJZWxzZQotCQkJcnR3MjNhX3NjdHhfZG9uZV9lcnIoJnBhY2tfdHhfb3BzLAotCQkJCQkgICAgIFJUV19TQ1RYX0RPTkVfQ0NYX1BLVF9GQUlMKTsKLQl9Ci19Ci0KLXZvaWQgcnRsODcyM2FfSW5pdEFudGVubmFfU2VsZWN0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTggdmFsOwotCi0JdmFsID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBSRUdfTEVEQ0ZHMik7Ci0JLyogIExldCA4MDUxIHRha2UgY29udHJvbCBhbnRlbm5hIHNldHRpbmcgKi8KLQl2YWwgfD0gQklUKDcpOwkJLyogIERQRFRfU0VMX0VOLCAweDRDWzIzXSAqLwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19MRURDRkcyLCB2YWwpOwotfQotCi12b2lkIHJ0bDg3MjNhX0NoZWNrQW50ZW5uYV9TZWxlY3Rpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1OCB2YWw7Ci0KLQl2YWwgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19MRURDRkcyKTsKLQkvKiAgTGV0IDgwNTEgdGFrZSBjb250cm9sIGFudGVubmEgc2V0dGluZyAqLwotCWlmICghKHZhbCAmIEJJVCg3KSkpIHsKLQkJdmFsIHw9IEJJVCg3KTsJLyogIERQRFRfU0VMX0VOLCAweDRDWzIzXSAqLwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfTEVEQ0ZHMiwgdmFsKTsKLQl9Ci19Ci0KLXZvaWQgcnRsODcyM2FfRGVpbml0QW50ZW5uYV9TZWxlY3Rpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1OCB2YWw7Ci0KLQl2YWwgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19MRURDRkcyKTsKLQkvKiAgTGV0IDgwNTEgdGFrZSBjb250cm9sIGFudGVubmEgc2V0dGluZyAqLwotCXZhbCAmPSB+QklUKDcpOwkJLyogIERQRFRfU0VMX0VOLCBjbGVhciAweDRDWzIzXSAqLwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19MRURDRkcyLCB2YWwpOwotfQotCi12b2lkIHJ0bDg3MjNhX2luaXRfZGVmYXVsdF92YWx1ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IGRtX3ByaXYgKnBkbXByaXY7Ci0JdTggaTsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlwZG1wcml2ID0gJnBIYWxEYXRhLT5kbXByaXY7Ci0KLQkvKiAgaW5pdCBkZWZhdWx0IHZhbHVlICovCi0JcEhhbERhdGEtPmJJUUtJbml0aWFsaXplZCA9IGZhbHNlOwotCWlmICghcGFkYXB0ZXItPnB3cmN0cmxwcml2LmJrZWVwZndhbGl2ZSkKLQkJcEhhbERhdGEtPkxhc3RITUVCb3hOdW0gPSAwOwotCi0JcEhhbERhdGEtPmJJUUtJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyogIGluaXQgZG0gZGVmYXVsdCB2YWx1ZSAqLwotCXBkbXByaXYtPlRNX1RyaWdnZXIgPSAwOwkvKiBmb3IgSVFLICovCi0vKglwZG1wcml2LT5iaW5pdGlhbGl6ZWQgPSBmYWxzZTsgKi8KLS8qCXBkbXByaXYtPnBydl90cmFmZmljX2lkeCA9IDM7ICovCi0vKglwZG1wcml2LT5pbml0aWFsaXplID0gMDsgKi8KLQotCXBkbXByaXYtPlRoZXJtYWxWYWx1ZV9IUF9pbmRleCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IEhQX1RIRVJNQUxfTlVNOyBpKyspCi0JCXBkbXByaXYtPlRoZXJtYWxWYWx1ZV9IUFtpXSA9IDA7Ci0KLQkvKiAgaW5pdCBFZnVzZSB2YXJpYWJsZXMgKi8KLQlwSGFsRGF0YS0+RWZ1c2VVc2VkQnl0ZXMgPSAwOwotCXBIYWxEYXRhLT5CVEVmdXNlVXNlZEJ5dGVzID0gMDsKLX0KLQotdTggR2V0RUVQUk9NU2l6ZTg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTggc2l6ZSA9IDA7Ci0JdTMyIGNyOwotCi0JY3IgPSBydGw4NzIzYXVfcmVhZDE2KHBhZGFwdGVyLCBSRUdfOTM0NkNSKTsKLQkvKiAgNjogRUVQUk9NIHVzZWQgaXMgOTNDNDYsIDQ6IGJvb3QgZnJvbSBFLUZ1c2UuICovCi0Jc2l6ZSA9IChjciAmIEJPT1RfRlJPTV9FRVBST00pID8gNiA6IDQ7Ci0KLQlNU0dfODcyM0EoIkVFUFJPTSB0eXBlIGlzICVzXG4iLCBzaXplID09IDQgPyAiRS1GVVNFIiA6ICI5M0M0NiIpOwotCi0JcmV0dXJuIHNpemU7Ci19Ci0KLS8qICAqLwotLyogICovCi0vKiAgTExUIFIvVy9Jbml0IGZ1bmN0aW9uICovCi0vKiAgKi8KLS8qICAqLwotc3RhdGljIGludCBfTExUV3JpdGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIGFkZHJlc3MsIHUzMiBkYXRhKQotewotCWludCBzdGF0dXMgPSBfU1VDQ0VTUzsKLQlzMzIgY291bnQgPSAwOwotCXUzMiB2YWx1ZSA9IF9MTFRfSU5JVF9BRERSKGFkZHJlc3MpIHwgX0xMVF9JTklUX0RBVEEoZGF0YSkgfAotCQkgICAgX0xMVF9PUChfTExUX1dSSVRFX0FDQ0VTUyk7Ci0JdTE2IExMVFJlZyA9IFJFR19MTFRfSU5JVDsKLQotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBMTFRSZWcsIHZhbHVlKTsKLQotCS8qIHBvbGxpbmcgKi8KLQlkbyB7Ci0JCXZhbHVlID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgTExUUmVnKTsKLQkJaWYgKF9MTFRfTk9fQUNUSVZFID09IF9MTFRfT1BfVkFMVUUodmFsdWUpKQotCQkJYnJlYWs7Ci0KLQkJaWYgKGNvdW50ID4gUE9MTElOR19MTFRfVEhSRVNIT0xEKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJGYWlsZWQgdG8gcG9sbGluZyB3cml0ZSBMTFQgZG9uZSBhdCBhZGRyZXNzICVkIVxuIiwKLQkJCQkgYWRkcmVzcyk7Ci0JCQlzdGF0dXMgPSBfRkFJTDsKLQkJCWJyZWFrOwotCQl9Ci0JfSB3aGlsZSAoY291bnQrKyk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1pbnQgSW5pdExMVFRhYmxlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiBib3VuZGFyeSkKLXsKLQlpbnQgc3RhdHVzID0gX1NVQ0NFU1M7Ci0JdTMyIGk7Ci0JdTMyIHR4cGt0YnVmX2JuZHkgPSBib3VuZGFyeTsKLQl1MzIgTGFzdF9FbnRyeV9PZl9UeFBrdEJ1ZiA9IExBU1RfRU5UUllfT0ZfVFhfUEtUX0JVRkZFUjsKLQotCWZvciAoaSA9IDA7IGkgPCAodHhwa3RidWZfYm5keSAtIDEpOyBpKyspIHsKLQkJc3RhdHVzID0gX0xMVFdyaXRlKHBhZGFwdGVyLCBpLCBpICsgMSk7Ci0JCWlmIChzdGF0dXMgIT0gX1NVQ0NFU1MpCi0JCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qICBlbmQgb2YgbGlzdCAqLwotCXN0YXR1cyA9IF9MTFRXcml0ZShwYWRhcHRlciwgKHR4cGt0YnVmX2JuZHkgLSAxKSwgMHhGRik7Ci0JaWYgKHN0YXR1cyAhPSBfU1VDQ0VTUykKLQkJcmV0dXJuIHN0YXR1czsKLQotCS8qICBNYWtlIHRoZSBvdGhlciBwYWdlcyBhcyByaW5nIGJ1ZmZlciAqLwotCS8qICBUaGlzIHJpbmcgYnVmZmVyIGlzIHVzZWQgYXMgYmVhY29uIGJ1ZmZlciBpZiB3ZSBjb25maWcgdGhpcwotCSAgICBNQUMgYXMgdHdvIE1BQyB0cmFuc2Zlci4gKi8KLQkvKiAgT3RoZXJ3aXNlIHVzZWQgYXMgbG9jYWwgbG9vcGJhY2sgYnVmZmVyLiAqLwotCWZvciAoaSA9IHR4cGt0YnVmX2JuZHk7IGkgPCBMYXN0X0VudHJ5X09mX1R4UGt0QnVmOyBpKyspIHsKLQkJc3RhdHVzID0gX0xMVFdyaXRlKHBhZGFwdGVyLCBpLCAoaSArIDEpKTsKLQkJaWYgKF9TVUNDRVNTICE9IHN0YXR1cykKLQkJCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyogIExldCBsYXN0IGVudHJ5IHBvaW50IHRvIHRoZSBzdGFydCBlbnRyeSBvZiByaW5nIGJ1ZmZlciAqLwotCXN0YXR1cyA9IF9MTFRXcml0ZShwYWRhcHRlciwgTGFzdF9FbnRyeV9PZl9UeFBrdEJ1ZiwgdHhwa3RidWZfYm5keSk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgdm9pZCBfRGlzYWJsZUdQSU8oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLWouIEdQSU9fUElOX0NUUkwgMHg0NFszMTowXT0gMHgwMDAKLWsuVmFsdWUgPSBHUElPX1BJTl9DVFJMWzc6MF0KLWwuIEdQSU9fUElOX0NUUkwgMHg0NFszMTowXSA9IDB4MDBGRjAwMDAgfCAodmFsdWUgPDw4KTsgd3JpdGUgZXh0ZXJuYWwgUElOIGxldmVsCi1tLiBHUElPX01VWENGRyAweDQyIFsxNTowXSA9IDB4MDc4MAotbi4gTEVEQ0ZHIDB4NENbMTU6MF0gPSAweDgwODAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQl1MzIgdmFsdWUzMjsKLQl1MzIgdTRiVG1wOwotCi0JLyogMS4gRGlzYWJsZSBHUElPWzc6MF0gKi8KLQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX0dQSU9fUElOX0NUUkwgKyAyLCAweDAwMDApOwotCXZhbHVlMzIgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfR1BJT19QSU5fQ1RSTCkgJiAweEZGRkYwMEZGOwotCXU0YlRtcCA9IHZhbHVlMzIgJiAweDAwMDAwMEZGOwotCXZhbHVlMzIgfD0gKCh1NGJUbXAgPDwgOCkgfCAweDAwRkYwMDAwKTsKLQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgUkVHX0dQSU9fUElOX0NUUkwsIHZhbHVlMzIpOwotCi0JLyogICovCi0JLyogIDxSb2dlcl9Ob3Rlcz4gRm9yIFJUTDg3MjN1IG11bHRpLWZ1bmN0aW9uIGNvbmZpZ3VyYXRpb24gd2hpY2gKLQkgICAgd2FzIGF1dG9sb2FkIGZyb20gRWZ1c2Ugb2Zmc2V0IDB4MGEgYW5kIDB4MGIsICovCi0JLyogIFdMQU4gSFcgR1BJT1s5XSwgR1BTIEhXIEdQSU9bMTBdIGFuZCBCVCBIVyBHUElPWzExXS4gKi8KLQkvKiAgQWRkZWQgYnkgUm9nZXIsIDIwMTAuMTAuMDcuICovCi0JLyogICovCi0JLyogMi4gRGlzYWJsZSBHUElPWzhdIGFuZCBHUElPWzEyXSAqLwotCi0JLyogIENvbmZpZ3VyZSBhbGwgcGlucyBhcyBpbnB1dCBtb2RlLiAqLwotCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfR1BJT19JT19TRUxfMiwgMHgwMDAwKTsKLQl2YWx1ZTMyID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgUkVHX0dQSU9fUElOX0NUUkxfMikgJiAweEZGRkYwMDFGOwotCXU0YlRtcCA9IHZhbHVlMzIgJiAweDAwMDAwMDFGOwotCS8qICBTZXQgcGluIDgsIDEwLCAxMSBhbmQgcGluIDEyIHRvIG91dHB1dCBtb2RlLiAqLwotCXZhbHVlMzIgfD0gKCh1NGJUbXAgPDwgOCkgfCAweDAwMUQwMDAwKTsKLQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgUkVHX0dQSU9fUElOX0NUUkxfMiwgdmFsdWUzMik7Ci0KLQkvKiAzLiBEaXNhYmxlIExFRDAgJiAxICovCi0JcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19MRURDRkcwLCAweDgwODApOwotfQkJCQkvKiBlbmQgb2YgX0Rpc2FibGVHUElPKCkgKi8KLQotc3RhdGljIHZvaWQgX0Rpc2FibGVSRkFGRUFuZFJlc2V0QkI4MTkyQyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1hLglUWFBBVVNFIDB4NTIyWzc6MF0gPSAweEZGCQlQYXVzZSBNQUMgVFggcXVldWUKLWIuCVJGIHBhdGggMCBvZmZzZXQgMHgwMCA9IDB4MDAJCWRpc2FibGUgUkYKLWMuCUFQU0RfQ1RSTCAweDYwMFs3OjBdID0gMHg0MAotZC4JU1lTX0ZVTkNfRU4gMHgwMls3OjBdID0gMHgxNgkJcmVzZXQgQkIgc3RhdGUgbWFjaGluZQotZS4JU1lTX0ZVTkNfRU4gMHgwMls3OjBdID0gMHgxNAkJcmVzZXQgQkIgc3RhdGUgbWFjaGluZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCXU4IHZhbHVlODsKLQotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19UWFBBVVNFLCAweEZGKTsKLQotCVBIWV9TZXRSRlJlZyhwYWRhcHRlciwgUkZfUEFUSF9BLCAweDAsIGJNYXNrQnl0ZTAsIDB4MCk7Ci0KLQl2YWx1ZTggPSBBUFNET0ZGOwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19BUFNEX0NUUkwsIHZhbHVlOCk7CS8qIDB4NDAgKi8KLQotCS8qICBTZXQgQkIgcmVzZXQgYXQgZmlyc3QgKi8KLQl2YWx1ZTggPSBGRU5fVVNCRCB8IEZFTl9VU0JBIHwgRkVOX0JCX0dMQl9SU1RuOwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19TWVNfRlVOQ19FTiwgdmFsdWU4KTsJLyogMHgxNiAqLwotCi0JLyogIFNldCBnbG9iYWwgcmVzZXQuICovCi0JdmFsdWU4ICY9IH5GRU5fQkJfR0xCX1JTVG47Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1NZU19GVU5DX0VOLCB2YWx1ZTgpOwkvKiAweDE0ICovCi0KLQkvKiAgMjAxMC8wOC8xMiBNSCBXZSBuZWVkIHRvIHNldCBCQi9HTEJBTCByZXNldCB0byBzYXZlIHBvd2VyCi0JICAgIGZvciBTUyBtb2RlLiAqLwotfQotCi1zdGF0aWMgdm9pZCBfUmVzZXREaWdpdGFsUHJvY2VkdXJlMV85MkMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkJYm9vbCBiV2l0aG91dEhXU00pCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlpZiAoSVNfRldfODF4eEMocGFkYXB0ZXIpICYmIChwSGFsRGF0YS0+RmlybXdhcmVWZXJzaW9uIDw9IDB4MjApKSB7Ci0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JZi4JTUNVRldETCAweDgwWzc6MF09IDAJCXJlc2V0IE1DVSByZWFkeSBzdGF0dXMKLQlnLglTWVNfRlVOQ19FTiAweDAyWzEwXT0gMAkJcmVzZXQgTUNVIHJlZ2lzdGVyLCAoODA1MSByZXNldCkKLQloLglTWVNfRlVOQ19FTiAweDAyWzE1LTEyXT0gNQlyZXNldCBNQUMgcmVnaXN0ZXIsIERDT1JFCi0JaS4gICAgIFNZU19GVU5DX0VOIDB4MDJbMTBdPSAxCQllbmFibGUgTUNVIHJlZ2lzdGVyLAotCQkJCQkJKDgwNTEgZW5hYmxlKQotCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkJdTE2IHZhbHUxNjsKLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX01DVUZXREwsIDApOwotCi0JCXZhbHUxNiA9IHJ0bDg3MjNhdV9yZWFkMTYocGFkYXB0ZXIsIFJFR19TWVNfRlVOQ19FTik7Ci0JCS8qIHJlc2V0IE1DVSAsIDgwNTEgKi8KLQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19TWVNfRlVOQ19FTiwKLQkJCQkgIHZhbHUxNiAmIH5GRU5fQ1BVRU4pOwotCi0JCXZhbHUxNiA9IHJ0bDg3MjNhdV9yZWFkMTYocGFkYXB0ZXIsIFJFR19TWVNfRlVOQ19FTikgJiAweDBGRkY7Ci0JCS8qIHJlc2V0IE1BQyAqLwotCQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX1NZU19GVU5DX0VOLAotCQkJCSAgdmFsdTE2IHwgRkVOX0hXUEROIHwgRkVOX0VMRFIpOwotCi0JCXZhbHUxNiA9IHJ0bDg3MjNhdV9yZWFkMTYocGFkYXB0ZXIsIFJFR19TWVNfRlVOQ19FTik7Ci0JCS8qIGVuYWJsZSBNQ1UgLCA4MDUxICovCi0JCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfU1lTX0ZVTkNfRU4sCi0JCQkJICB2YWx1MTYgfCBGRU5fQ1BVRU4pOwotCX0gZWxzZSB7Ci0JCXU4IHJldHJ5X2NudHMgPSAwOwotCQl1OCB2YWw4OwotCi0JCXZhbDggPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19NQ1VGV0RMKTsKLQotCQkvKiAgMjAxMC8wOC8xMiBNSCBGb3IgVVNCIFNTLCB3ZSBjYW4gbm90IHN0b3AgODA1MSB3aGVuIHdlCi0JCSAgICBhcmUgdHJ5aW5nIHRvIGVudGVyIElQUy9IVyZTVyByYWRpbyBvZmYuIEZvcgotCQkgICAgUzMvUzQvUzUvRGlzYWJsZSwgd2UgY2FuIHN0b3AgODA1MSBiZWNhdXNlICovCi0JCS8qICB3ZSB3aWxsIGluaXQgRlcgd2hlbiBwb3dlciBvbiBhZ2Fpbi4gKi8KLQkJLyogIElmIHdlIHdhbnQgdG8gU1MgbW9kZSwgd2UgY2FuIG5vdCByZXNldCA4MDUxLiAqLwotCQlpZiAoKHZhbDggJiBCSVQoMSkpICYmIHBhZGFwdGVyLT5iRldSZWFkeSkgewotCQkJLyogSUYgZncgaW4gUkFNIGNvZGUsIGRvIHJlc2V0ICovCi0JCQkvKiAgMjAxMC8wOC8yNSBNSCBBY2NvcmRpbmcgdG8gUkQgYWxmcmVkJ3MKLQkJCSAgICBzdWdnZXN0aW9uLCB3ZSBuZWVkIHRvIGRpc2FibGUgb3RoZXIgKi8KLQkJCS8qICBIUkNWIElOVCB0byBpbmZsdWVuY2UgODA1MSByZXNldC4gKi8KLQkJCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19GV0lNUiwgMHgyMCk7Ci0JCQkvKiAgMjAxMS8wMi8xNSBNSCBBY2NvcmRpbmcgdG8gQWxleCdzCi0JCQkgICAgc3VnZ2VzdGlvbiwgY2xvc2UgbWFzayB0byBwcmV2ZW50Ci0JCQkgICAgaW5jb3JyZWN0IEZXIHdyaXRlIG9wZXJhdGlvbi4gKi8KLQkJCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19GVElNUiwgMHgwMCk7Ci0JCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfRlNJTVIsIDB4MDApOwotCi0JCQkvKiA4MDUxIHJlc2V0IGJ5IHNlbGYgKi8KLQkJCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19ITUVURlIgKyAzLCAweDIwKTsKLQotCQkJd2hpbGUgKChyZXRyeV9jbnRzKysgPCAxMDApICYmCi0JCQkgICAgICAgKHJ0bDg3MjNhdV9yZWFkMTYocGFkYXB0ZXIsIFJFR19TWVNfRlVOQ19FTikgJgotCQkJCUZFTl9DUFVFTikpIHsKLQkJCQl1ZGVsYXkoNTApOwkvKiB1cyAqLwotCQkJfQotCi0JCQlpZiAocmV0cnlfY250cyA+PSAxMDApIHsKLQkJCQkvKiBSZXNldCBNQUMgYW5kIEVuYWJsZSA4MDUxICovCi0JCQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwKLQkJCQkJCSBSRUdfU1lTX0ZVTkNfRU4gKyAxLCAweDUwKTsKLQkJCQltZGVsYXkoMTApOwotCQkJfQotCQl9Ci0JCS8qIFJlc2V0IE1BQyBhbmQgRW5hYmxlIDgwNTEgKi8KLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1NZU19GVU5DX0VOICsgMSwgMHg1NCk7Ci0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19NQ1VGV0RMLCAwKTsKLQl9Ci0KLQlpZiAoYldpdGhvdXRIV1NNKSB7Ci0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCVdpdGhvdXQgSFcgYXV0byBzdGF0ZSBtYWNoaW5lCi0JZy4JU1lTX0NMS1IgMHgwOFsxNTowXSA9IDB4MzBBMwkJZGlzYWJsZSBNQUMgY2xvY2sKLQloLglBRkVfUExMX0NUUkwgMHgyOFs3OjBdID0gMHg4MAkJZGlzYWJsZSBBRkUgUExMCi0JaS4JQUZFX1hUQUxfQ1RSTCAweDI0WzE1OjBdID0gMHg4ODBGCWdhdGVkIEFGRSBESUdfQ0xPQ0sKLQlqLglTWVNfSVNPX0NUUkwgMHgwMFs3OjBdID0gMHhGOQkJaXNvbGF0ZWQgZGlnaXRhbCB0byBQT04KLQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCS8qIG1vZGlmeSB0byAweDcwQTMgYnkgU2NvdHQuICovCi0JCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfU1lTX0NMS1IsIDB4NzBBMyk7Ci0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19BRkVfUExMX0NUUkwsIDB4ODApOwotCQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX0FGRV9YVEFMX0NUUkwsIDB4ODgwRik7Ci0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19TWVNfSVNPX0NUUkwsIDB4RjkpOwotCX0gZWxzZSB7Ci0JCS8qICBEaXNhYmxlIGFsbCBSRi9CQiBwb3dlciAqLwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfUkZfQ1RSTCwgMHgwMCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfUmVzZXREaWdpdGFsUHJvY2VkdXJlMihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1rLglTWVNfRlVOQ19FTiAweDAzWzc6MF0gPSAweDQ0CQlkaXNhYmxlIEVMRFIgcnVuY3Rpb24KLWwuCVNZU19DTEtSIDB4MDhbMTU6MF0gPSAweDMwODMJCWRpc2FibGUgRUxEUiBjbG9jawotbS4JU1lTX0lTT19DVFJMIDB4MDFbNzowXSA9IDB4ODMJCWlzb2xhdGVkIEVMRFIgdG8gUE9OCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLyogbW9kaWZ5IHRvIDB4NzBhMyBieSBTY290dC4gKi8KLQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX1NZU19DTEtSLCAweDcwYTMpOwotCS8qIG1vZGlmeSB0byAweDgyIGJ5IFNjb3R0LiAqLwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19TWVNfSVNPX0NUUkwgKyAxLCAweDgyKTsKLX0KLQotc3RhdGljIHZvaWQgX0Rpc2FibGVBbmFsb2coc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgYm9vbCBiV2l0aG91dEhXU00pCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JdTE2IHZhbHVlMTY7Ci0JdTggdmFsdWU4OwotCi0JaWYgKGJXaXRob3V0SFdTTSkgewotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCW4uCUxET0ExNV9DVFJMIDB4MjBbNzowXSA9IDB4MDQJZGlzYWJsZSBBMTUgcG93ZXIKLQlvLglMRE9WMTJEX0NUUkwgMHgyMVs3OjBdID0gMHg1NAlkaXNhYmxlIGRpZ2l0YWwgY29yZSBwb3dlcgotCXIuCVdoZW4gZHJpdmVyIGNhbGwgZGlzYWJsZSwgdGhlIEFTSUMgd2lsbCB0dXJuIG9mZiByZW1haW5pbmcKLQkJY2xvY2sgYXV0b21hdGljYWxseQotCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfTERPQTE1X0NUUkwsIDB4MDQpOwotCQkvKiBydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfTERPVjEyRF9DVFJMLCAweDU0KTsgKi8KLQotCQl2YWx1ZTggPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19MRE9WMTJEX0NUUkwpOwotCQl2YWx1ZTggJj0gfkxEVjEyX0VOOwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfTERPVjEyRF9DVFJMLCB2YWx1ZTgpOwotCX0KLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCWguCVNQUzBfQ1RSTCAweDExWzc6MF0gPSAweDIzCQllbnRlciBQRk0gbW9kZQotCWkuCUFQU19GU01DTyAweDA0WzE1OjBdID0gMHg0ODAyCQlzZXQgVVNCIHN1c3BlbmQKLQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JdmFsdWU4ID0gMHgyMzsKLQlpZiAoSVNfODF4eENfVkVORE9SX1VNQ19CX0NVVChwSGFsRGF0YS0+VmVyc2lvbklEKSkKLQkJdmFsdWU4IHw9IEJJVCgzKTsKLQotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19TUFMwX0NUUkwsIHZhbHVlOCk7Ci0KLQlpZiAoYldpdGhvdXRIV1NNKSB7Ci0JCS8qIHZhbHVlMTYgfD0gKEFQRE1fSE9TVCB8IEZTTV9IU1VTIHwvUEZNX0FMRE4pOyAqLwotCQkvKiAgMjAxMC8wOC8zMSBBY2NvcmRpbmcgdG8gRmlsZW4gZGVzY3JpcHRpb24sIHdlIG5lZWQgdG8KLQkJICAgIHVzZSBIVyB0byBzaHV0IGRvd24gODA1MSBhdXRvbWF0aWNhbGx5LiAqLwotCQkvKiAgQmVjYXVzZSBzdXNwZW5kIG9wZXJhdGlvbiBuZWVkIHRoZSBhc2lzdGFuY2Ugb2YgODA1MQotCQkgICAgdG8gd2FpdCBmb3IgM21zLiAqLwotCQl2YWx1ZTE2ID0gQVBETV9IT1NUIHwgQUZTTV9IU1VTIHwgUEZNX0FMRE47Ci0JfSBlbHNlIHsKLQkJdmFsdWUxNiA9IEFQRE1fSE9TVCB8IEFGU01fSFNVUyB8IFBGTV9BTEROOwotCX0KLQotCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfQVBTX0ZTTUNPLCB2YWx1ZTE2KTsJLyogMHg0ODAyICovCi0KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfUlNWX0NUUkwsIDB4MGUpOwotfQotCi0vKiAgSFcgQXV0byBzdGF0ZSBtYWNoaW5lICovCi1pbnQgQ2FyZERpc2FibGVIV1NNKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHJlc2V0TUNVKQotewotCWlmIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkKLQkJcmV0dXJuIF9TVUNDRVNTOwotCi0JLyogIFJGIE9mZiBTZXF1ZW5jZSA9PT09ICovCi0JX0Rpc2FibGVSRkFGRUFuZFJlc2V0QkI4MTkyQyhwYWRhcHRlcik7Ci0KLQkvKiAgID09PT0gUmVzZXQgZGlnaXRhbCBzZXF1ZW5jZSAgID09PT09PSAqLwotCV9SZXNldERpZ2l0YWxQcm9jZWR1cmUxXzkyQyhwYWRhcHRlciwgZmFsc2UpOwotCi0JLyogICA9PT09IFB1bGwgR1BJTyBQSU4gdG8gYmFsYW5jZSBsZXZlbCBhbmQgTEVEIGNvbnRyb2wgPT09PT09ICovCi0JX0Rpc2FibGVHUElPKHBhZGFwdGVyKTsKLQotCS8qICAgPT09PSBEaXNhYmxlIGFuYWxvZyBzZXF1ZW5jZSA9PT0gKi8KLQlfRGlzYWJsZUFuYWxvZyhwYWRhcHRlciwgZmFsc2UpOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAiPT09PT09PiBDYXJkIGRpc2FibGUgZmluaXNoZWQuXG4iKTsKLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotLyogIHdpdGhvdXQgSFcgQXV0byBzdGF0ZSBtYWNoaW5lICovCi1pbnQgQ2FyZERpc2FibGVXaXRob3V0SFdTTShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCWlmIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkKLQkJcmV0dXJuIF9TVUNDRVNTOwotCi0JLyogIFJGIE9mZiBTZXF1ZW5jZSA9PT09ICovCi0JX0Rpc2FibGVSRkFGRUFuZFJlc2V0QkI4MTkyQyhwYWRhcHRlcik7Ci0KLQkvKiAgID09PT0gUmVzZXQgZGlnaXRhbCBzZXF1ZW5jZSAgID09PT09PSAqLwotCV9SZXNldERpZ2l0YWxQcm9jZWR1cmUxXzkyQyhwYWRhcHRlciwgdHJ1ZSk7Ci0KLQkvKiAgID09PT0gUHVsbCBHUElPIFBJTiB0byBiYWxhbmNlIGxldmVsIGFuZCBMRUQgY29udHJvbCA9PT09PT0gKi8KLQlfRGlzYWJsZUdQSU8ocGFkYXB0ZXIpOwotCi0JLyogICA9PT09IFJlc2V0IGRpZ2l0YWwgc2VxdWVuY2UgICA9PT09PT0gKi8KLQlfUmVzZXREaWdpdGFsUHJvY2VkdXJlMihwYWRhcHRlcik7Ci0KLQkvKiAgID09PT0gRGlzYWJsZSBhbmFsb2cgc2VxdWVuY2UgPT09ICovCi0JX0Rpc2FibGVBbmFsb2cocGFkYXB0ZXIsIHRydWUpOwotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi12b2lkIEhhbF9Jbml0UEdEYXRhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpQUk9NQ29udGVudCkKLXsKLQlzdHJ1Y3QgZWVwcm9tX3ByaXYgKnBFRVBST00gPSBHRVRfRUVQUk9NX0VGVVNFX1BSSVYocGFkYXB0ZXIpOwotCi0JaWYgKCFwRUVQUk9NLT5iYXV0b2xvYWRfZmFpbF9mbGFnKSB7CS8qICBhdXRvbG9hZCBPSy4gKi8KLQkJaWYgKCFwRUVQUk9NLT5FZXByb21PckVmdXNlKSB7Ci0JCQkvKiAgUmVhZCBFRlVTRSByZWFsIG1hcCB0byBzaGFkb3cuICovCi0JCQlFRlVTRV9TaGFkb3dNYXBVcGRhdGUyM2EocGFkYXB0ZXIsIEVGVVNFX1dJRkkpOwotCQkJbWVtY3B5KFBST01Db250ZW50LCBwRUVQUk9NLT5lZnVzZV9lZXByb21fZGF0YSwKLQkJCSAgICAgICBIV1NFVF9NQVhfU0laRSk7Ci0JCX0KLQl9IGVsc2UgewotCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9ub3RpY2VfLAotCQkJICJBdXRvTG9hZCBGYWlsIHJlcG9ydGVkIGZyb20gQ1I5MzQ2ISFcbiIpOwotCQkvKiB1cGRhdGUgdG8gZGVmYXVsdCB2YWx1ZSAweEZGICovCi0JCWlmICghcEVFUFJPTS0+RWVwcm9tT3JFZnVzZSkKLQkJCUVGVVNFX1NoYWRvd01hcFVwZGF0ZTIzYShwYWRhcHRlciwgRUZVU0VfV0lGSSk7Ci0JCW1lbWNweShQUk9NQ29udGVudCwgcEVFUFJPTS0+ZWZ1c2VfZWVwcm9tX2RhdGEsCi0JCSAgICAgICBIV1NFVF9NQVhfU0laRSk7Ci0JfQotfQotCi12b2lkIEhhbF9FZnVzZVBhcnNlSURDb2RlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpod2luZm8pCi17Ci0Jc3RydWN0IGVlcHJvbV9wcml2ICpwRUVQUk9NID0gR0VUX0VFUFJPTV9FRlVTRV9QUklWKHBhZGFwdGVyKTsKLS8qCXN0cnVjdCBoYWxfZGF0YV84NzIzYQkqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOyAqLwotCXUxNiBFRVBST01JZDsKLQotCS8qICBDaGVjbCAweDgxMjkgYWdhaW4gZm9yIG1ha2luZyBzdXJlIGF1dG9sb2FkIHN0YXR1cyEhICovCi0JRUVQUk9NSWQgPSBsZTE2X3RvX2NwdSgqKChfX2xlMTYgKikgaHdpbmZvKSk7Ci0JaWYgKEVFUFJPTUlkICE9IFJUTF9FRVBST01fSUQpIHsKLQkJREJHXzg3MjNBKCJFRVBST00gSUQoJSN4KSBpcyBpbnZhbGlkISFcbiIsIEVFUFJPTUlkKTsKLQkJcEVFUFJPTS0+YmF1dG9sb2FkX2ZhaWxfZmxhZyA9IHRydWU7Ci0JfSBlbHNlIHsKLQkJcEVFUFJPTS0+YmF1dG9sb2FkX2ZhaWxfZmxhZyA9IGZhbHNlOwotCX0KLQotCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAiRUVQUk9NIElEID0gMHglMDR4XG4iLCBFRVBST01JZCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1IYWxfUmVhZFBvd2VyVmFsdWVGcm9tUFJPTV84NzIzQShzdHJ1Y3QgdHhwb3dlcmluZm8gKnB3ckluZm8sCi0JCQkJIHU4ICpQUk9NQ29udGVudCwgYm9vbCBBdXRvTG9hZEZhaWwpCi17Ci0JdTMyIHJmUGF0aCwgZWVBZGRyLCBncm91cCwgcmZQYXRoTWF4ID0gMTsKLQotCW1lbXNldChwd3JJbmZvLCAwLCBzaXplb2YoKnB3ckluZm8pKTsKLQotCWlmIChBdXRvTG9hZEZhaWwpIHsKLQkJZm9yIChncm91cCA9IDA7IGdyb3VwIDwgTUFYX0NITkxfR1JPVVA7IGdyb3VwKyspIHsKLQkJCWZvciAocmZQYXRoID0gMDsgcmZQYXRoIDwgcmZQYXRoTWF4OyByZlBhdGgrKykgewotCQkJCXB3ckluZm8tPkNDS0luZGV4W3JmUGF0aF1bZ3JvdXBdID0KLQkJCQkJRUVQUk9NX0RlZmF1bHRfVHhQb3dlckxldmVsOwotCQkJCXB3ckluZm8tPkhUNDBfMVNJbmRleFtyZlBhdGhdW2dyb3VwXSA9Ci0JCQkJCUVFUFJPTV9EZWZhdWx0X1R4UG93ZXJMZXZlbDsKLQkJCQlwd3JJbmZvLT5IVDQwXzJTSW5kZXhEaWZmW3JmUGF0aF1bZ3JvdXBdID0KLQkJCQkJRUVQUk9NX0RlZmF1bHRfSFQ0MF8yU0RpZmY7Ci0JCQkJcHdySW5mby0+SFQyMEluZGV4RGlmZltyZlBhdGhdW2dyb3VwXSA9Ci0JCQkJCUVFUFJPTV9EZWZhdWx0X0hUMjBfRGlmZjsKLQkJCQlwd3JJbmZvLT5PRkRNSW5kZXhEaWZmW3JmUGF0aF1bZ3JvdXBdID0KLQkJCQkJRUVQUk9NX0RlZmF1bHRfTGVnYWN5SFRUeFBvd2VyRGlmZjsKLQkJCQlwd3JJbmZvLT5IVDQwTWF4T2Zmc2V0W3JmUGF0aF1bZ3JvdXBdID0KLQkJCQkJRUVQUk9NX0RlZmF1bHRfSFQ0MF9Qd3JNYXhPZmZzZXQ7Ci0JCQkJcHdySW5mby0+SFQyME1heE9mZnNldFtyZlBhdGhdW2dyb3VwXSA9Ci0JCQkJCUVFUFJPTV9EZWZhdWx0X0hUMjBfUHdyTWF4T2Zmc2V0OwotCQkJfQotCQl9Ci0JCXB3ckluZm8tPlRTU0lfQVswXSA9IEVFUFJPTV9EZWZhdWx0X1RTU0k7Ci0JCXJldHVybjsKLQl9Ci0KLQlmb3IgKHJmUGF0aCA9IDA7IHJmUGF0aCA8IHJmUGF0aE1heDsgcmZQYXRoKyspIHsKLQkJZm9yIChncm91cCA9IDA7IGdyb3VwIDwgTUFYX0NITkxfR1JPVVA7IGdyb3VwKyspIHsKLQkJCWVlQWRkciA9Ci0JCQkgICAgRUVQUk9NX0NDS19UWF9QV1JfSU5YXzg3MjNBICsgKHJmUGF0aCAqIDMpICsgZ3JvdXA7Ci0KLQkJCXB3ckluZm8tPkNDS0luZGV4W3JmUGF0aF1bZ3JvdXBdID0gUFJPTUNvbnRlbnRbZWVBZGRyXTsKLQkJCWlmIChwd3JJbmZvLT5DQ0tJbmRleFtyZlBhdGhdW2dyb3VwXSA+IDYzKQotCQkJCXB3ckluZm8tPkNDS0luZGV4W3JmUGF0aF1bZ3JvdXBdID0KLQkJCQkJRUVQUk9NX0RlZmF1bHRfVHhQb3dlckxldmVsOwotCi0JCQllZUFkZHIgPSBFRVBST01fSFQ0MF8xU19UWF9QV1JfSU5YXzg3MjNBICsKLQkJCQkocmZQYXRoICogMykgKyBncm91cDsKLQkJCXB3ckluZm8tPkhUNDBfMVNJbmRleFtyZlBhdGhdW2dyb3VwXSA9Ci0JCQkJUFJPTUNvbnRlbnRbZWVBZGRyXTsKLQkJCWlmIChwd3JJbmZvLT5IVDQwXzFTSW5kZXhbcmZQYXRoXVtncm91cF0gPiA2MykKLQkJCQlwd3JJbmZvLT5IVDQwXzFTSW5kZXhbcmZQYXRoXVtncm91cF0gPQotCQkJCQlFRVBST01fRGVmYXVsdF9UeFBvd2VyTGV2ZWw7Ci0JCX0KLQl9Ci0KLQlmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBNQVhfQ0hOTF9HUk9VUDsgZ3JvdXArKykgewotCQlmb3IgKHJmUGF0aCA9IDA7IHJmUGF0aCA8IHJmUGF0aE1heDsgcmZQYXRoKyspIHsKLQkJCXB3ckluZm8tPkhUNDBfMlNJbmRleERpZmZbcmZQYXRoXVtncm91cF0gPSAwOwotCQkJcHdySW5mby0+SFQyMEluZGV4RGlmZltyZlBhdGhdW2dyb3VwXSA9Ci0JCQkJKFBST01Db250ZW50Ci0JCQkJIFtFRVBST01fSFQyMF9UWF9QV1JfSU5YX0RJRkZfODcyM0EgKwotCQkJCSAgZ3JvdXBdID4+IChyZlBhdGggKiA0KSkgJiAweEY7Ci0JCQkvKiA0Yml0IHNpZ24gbnVtYmVyIHRvIDggYml0IHNpZ24gbnVtYmVyICovCi0JCQlpZiAocHdySW5mby0+SFQyMEluZGV4RGlmZltyZlBhdGhdW2dyb3VwXSAmIEJJVCgzKSkKLQkJCQlwd3JJbmZvLT5IVDIwSW5kZXhEaWZmW3JmUGF0aF1bZ3JvdXBdIHw9IDB4RjA7Ci0KLQkJCXB3ckluZm8tPk9GRE1JbmRleERpZmZbcmZQYXRoXVtncm91cF0gPQotCQkJCShQUk9NQ29udGVudFtFRVBST01fT0ZETV9UWF9QV1JfSU5YX0RJRkZfODcyM0EgKwotCQkJCQkgICAgIGdyb3VwXSA+PiAocmZQYXRoICogNCkpICYgMHhGOwotCi0JCQlwd3JJbmZvLT5IVDQwTWF4T2Zmc2V0W3JmUGF0aF1bZ3JvdXBdID0KLQkJCQkoUFJPTUNvbnRlbnRbRUVQUk9NX0hUNDBfTUFYX1BXUl9PRkZTRVRfODcyM0EgKwotCQkJCQkgICAgIGdyb3VwXSA+PiAocmZQYXRoICogNCkpICYgMHhGOwotCi0JCQlwd3JJbmZvLT5IVDIwTWF4T2Zmc2V0W3JmUGF0aF1bZ3JvdXBdID0KLQkJCQkoUFJPTUNvbnRlbnRbRUVQUk9NX0hUMjBfTUFYX1BXUl9PRkZTRVRfODcyM0EgKwotCQkJCQkgICAgIGdyb3VwXSA+PiAocmZQYXRoICogNCkpICYgMHhGOwotCQl9Ci0JfQotCi0JcHdySW5mby0+VFNTSV9BWzBdID0gUFJPTUNvbnRlbnRbRUVQUk9NX1RTU0lfQV84NzIzQV07Ci19Ci0KLXN0YXRpYyB1OCBIYWxfR2V0Q2hubEdyb3VwKHU4IGNobmwpCi17Ci0JdTggZ3JvdXAgPSAwOwotCi0JaWYgKGNobmwgPCAzKQkJLyogIENqYW5lbCAxLTMgKi8KLQkJZ3JvdXAgPSAwOwotCWVsc2UgaWYgKGNobmwgPCA5KQkvKiAgQ2hhbm5lbCA0LTkgKi8KLQkJZ3JvdXAgPSAxOwotCWVsc2UJCQkvKiAgQ2hhbm5lbCAxMC0xNCAqLwotCQlncm91cCA9IDI7Ci0KLQlyZXR1cm4gZ3JvdXA7Ci19Ci0KLXZvaWQKLUhhbF9FZnVzZVBhcnNldHhwb3dlcmluZm9fODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQl1OCAqUFJPTUNvbnRlbnQsIGJvb2wgQXV0b0xvYWRGYWlsKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCB0eHBvd2VyaW5mbyBwd3JJbmZvOwotCXU4IHJmUGF0aCwgY2gsIGdyb3VwLCByZlBhdGhNYXggPSAxOwotCXU4IHB3ciwgZGlmZjsKLQotCUhhbF9SZWFkUG93ZXJWYWx1ZUZyb21QUk9NXzg3MjNBKCZwd3JJbmZvLCBQUk9NQ29udGVudCwgQXV0b0xvYWRGYWlsKTsKLQlmb3IgKHJmUGF0aCA9IDA7IHJmUGF0aCA8IHJmUGF0aE1heDsgcmZQYXRoKyspIHsKLQkJZm9yIChjaCA9IDA7IGNoIDwgQ0hBTk5FTF9NQVhfTlVNQkVSOyBjaCsrKSB7Ci0JCQlncm91cCA9IEhhbF9HZXRDaG5sR3JvdXAoY2gpOwotCi0JCQlwSGFsRGF0YS0+VHhQd3JMZXZlbENja1tyZlBhdGhdW2NoXSA9Ci0JCQkJcHdySW5mby5DQ0tJbmRleFtyZlBhdGhdW2dyb3VwXTsKLQkJCXBIYWxEYXRhLT5UeFB3ckxldmVsSFQ0MF8xU1tyZlBhdGhdW2NoXSA9Ci0JCQkJcHdySW5mby5IVDQwXzFTSW5kZXhbcmZQYXRoXVtncm91cF07Ci0KLQkJCXBIYWxEYXRhLT5UeFB3ckh0MjBEaWZmW3JmUGF0aF1bY2hdID0KLQkJCQlwd3JJbmZvLkhUMjBJbmRleERpZmZbcmZQYXRoXVtncm91cF07Ci0JCQlwSGFsRGF0YS0+VHhQd3JMZWdhY3lIdERpZmZbcmZQYXRoXVtjaF0gPQotCQkJCXB3ckluZm8uT0ZETUluZGV4RGlmZltyZlBhdGhdW2dyb3VwXTsKLQkJCXBIYWxEYXRhLT5Qd3JHcm91cEhUMjBbcmZQYXRoXVtjaF0gPQotCQkJCXB3ckluZm8uSFQyME1heE9mZnNldFtyZlBhdGhdW2dyb3VwXTsKLQkJCXBIYWxEYXRhLT5Qd3JHcm91cEhUNDBbcmZQYXRoXVtjaF0gPQotCQkJCXB3ckluZm8uSFQ0ME1heE9mZnNldFtyZlBhdGhdW2dyb3VwXTsKLQotCQkJcHdyID0gcHdySW5mby5IVDQwXzFTSW5kZXhbcmZQYXRoXVtncm91cF07Ci0JCQlkaWZmID0gcHdySW5mby5IVDQwXzJTSW5kZXhEaWZmW3JmUGF0aF1bZ3JvdXBdOwotCi0JCQlwSGFsRGF0YS0+VHhQd3JMZXZlbEhUNDBfMlNbcmZQYXRoXVtjaF0gPQotCQkJICAgIChwd3IgPiBkaWZmKSA/IChwd3IgLSBkaWZmKSA6IDA7Ci0JCX0KLQl9Ci0JZm9yIChyZlBhdGggPSAwOyByZlBhdGggPCBSRl9QQVRIX01BWDsgcmZQYXRoKyspIHsKLQkJZm9yIChjaCA9IDA7IGNoIDwgQ0hBTk5FTF9NQVhfTlVNQkVSOyBjaCsrKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCQkgIlJGKCV1KS1DaCgldSkgW0NDSyAvIEhUNDBfMVMgLyBIVDQwXzJTXSA9IFsweCV4IC8gMHgleCAvIDB4JXhdXG4iLAotCQkJCSByZlBhdGgsIGNoLAotCQkJCSBwSGFsRGF0YS0+VHhQd3JMZXZlbENja1tyZlBhdGhdW2NoXSwKLQkJCQkgcEhhbERhdGEtPlR4UHdyTGV2ZWxIVDQwXzFTW3JmUGF0aF1bY2hdLAotCQkJCSBwSGFsRGF0YS0+VHhQd3JMZXZlbEhUNDBfMlNbcmZQYXRoXVtjaF0pOwotCi0JCX0KLQl9Ci0JZm9yIChjaCA9IDA7IGNoIDwgQ0hBTk5FTF9NQVhfTlVNQkVSOyBjaCsrKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJICJSRi1BIEh0MjAgdG8gSFQ0MCBEaWZmWyV1XSA9IDB4JXgoJWQpXG4iLCBjaCwKLQkJCSBwSGFsRGF0YS0+VHhQd3JIdDIwRGlmZltSRl9QQVRIX0FdW2NoXSwKLQkJCSBwSGFsRGF0YS0+VHhQd3JIdDIwRGlmZltSRl9QQVRIX0FdW2NoXSk7Ci0JfQotCWZvciAoY2ggPSAwOyBjaCA8IENIQU5ORUxfTUFYX05VTUJFUjsgY2grKykKLQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgIlJGLUEgTGVnYWN5IHRvIEh0NDAgRGlmZlsldV0gPSAweCV4XG4iLCBjaCwKLQkJCSBwSGFsRGF0YS0+VHhQd3JMZWdhY3lIdERpZmZbUkZfUEFUSF9BXVtjaF0pOwotCWZvciAoY2ggPSAwOyBjaCA8IENIQU5ORUxfTUFYX05VTUJFUjsgY2grKykgewotCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAiUkYtQiBIdDIwIHRvIEhUNDAgRGlmZlsldV0gPSAweCV4KCVkKVxuIiwgY2gsCi0JCQkgcEhhbERhdGEtPlR4UHdySHQyMERpZmZbUkZfUEFUSF9CXVtjaF0sCi0JCQkgcEhhbERhdGEtPlR4UHdySHQyMERpZmZbUkZfUEFUSF9CXVtjaF0pOwotCX0KLQlmb3IgKGNoID0gMDsgY2ggPCBDSEFOTkVMX01BWF9OVU1CRVI7IGNoKyspCi0JCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJICJSRi1CIExlZ2FjeSB0byBIVDQwIERpZmZbJXVdID0gMHgleFxuIiwgY2gsCi0JCQkgcEhhbERhdGEtPlR4UHdyTGVnYWN5SHREaWZmW1JGX1BBVEhfQl1bY2hdKTsKLQlpZiAoIUF1dG9Mb2FkRmFpbCkgewotCQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcmVnaXN0cnlfcGFyID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0JCWlmIChyZWdpc3RyeV9wYXItPnJlZ3VsYXRvcnlfdGlkID09IDB4ZmYpIHsKLQkJCWlmIChQUk9NQ29udGVudFtSRl9PUFRJT04xXzg3MjNBXSA9PSAweGZmKQotCQkJCXBIYWxEYXRhLT5FRVBST01SZWd1bGF0b3J5ID0gMDsKLQkJCWVsc2UKLQkJCQlwSGFsRGF0YS0+RUVQUk9NUmVndWxhdG9yeSA9Ci0JCQkJCVBST01Db250ZW50W1JGX09QVElPTjFfODcyM0FdICYgMHg3OwotCQl9IGVsc2UgewotCQkJcEhhbERhdGEtPkVFUFJPTVJlZ3VsYXRvcnkgPQotCQkJICAgIHJlZ2lzdHJ5X3Bhci0+cmVndWxhdG9yeV90aWQ7Ci0JCX0KLQl9IGVsc2UgewotCQlwSGFsRGF0YS0+RUVQUk9NUmVndWxhdG9yeSA9IDA7Ci0JfQotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkgIkVFUFJPTVJlZ3VsYXRvcnkgPSAweCV4XG4iLCBwSGFsRGF0YS0+RUVQUk9NUmVndWxhdG9yeSk7Ci0KLQlpZiAoIUF1dG9Mb2FkRmFpbCkKLQkJcEhhbERhdGEtPmJUWFBvd2VyRGF0YVJlYWRGcm9tRUVQT1JNID0gdHJ1ZTsKLX0KLQotdm9pZAotSGFsX0VmdXNlUGFyc2VCVENvZXhpc3RJbmZvXzg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICB1OCAqaHdpbmZvLCBib29sIEF1dG9Mb2FkRmFpbCkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQl1OCB0ZW1wdmFsOwotCXUzMiB0bXB1NDsKLQotCWlmICghQXV0b0xvYWRGYWlsKSB7Ci0JCXRtcHU0ID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgUkVHX01VTFRJX0ZVTkNfQ1RSTCk7Ci0JCWlmICh0bXB1NCAmIEJUX0ZVTkNfRU4pCi0JCQlwSGFsRGF0YS0+RUVQUk9NQmx1ZXRvb3RoQ29leGlzdCA9IDE7Ci0JCWVsc2UKLQkJCXBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhDb2V4aXN0ID0gMDsKLQkJcEhhbERhdGEtPkVFUFJPTUJsdWV0b290aFR5cGUgPSBCVF9SVEw4NzIzQTsKLQotCQkvKiAgVGhlIGZvbGxvd2luZyBuZWVkIHRvIGJlIGNoZWNrZWQgd2l0aCBuZXdlciB2ZXJzaW9uIG9mICovCi0JCS8qICBlZXByb20gc3BlYyAqLwotCQl0ZW1wdmFsID0gaHdpbmZvW1JGX09QVElPTjRfODcyM0FdOwotCQlwSGFsRGF0YS0+RUVQUk9NQmx1ZXRvb3RoQW50TnVtID0gKHRlbXB2YWwgJiAweDEpOwotCQlwSGFsRGF0YS0+RUVQUk9NQmx1ZXRvb3RoQW50SXNvbGF0aW9uID0gKHRlbXB2YWwgJiAweDEwKSA+PiA0OwotCQlwSGFsRGF0YS0+RUVQUk9NQmx1ZXRvb3RoUmFkaW9TaGFyZWQgPSAodGVtcHZhbCAmIDB4MjApID4+IDU7Ci0JfSBlbHNlIHsKLQkJcEhhbERhdGEtPkVFUFJPTUJsdWV0b290aENvZXhpc3QgPSAwOwotCQlwSGFsRGF0YS0+RUVQUk9NQmx1ZXRvb3RoVHlwZSA9IEJUX1JUTDg3MjNBOwotCQlwSGFsRGF0YS0+RUVQUk9NQmx1ZXRvb3RoQW50TnVtID0gQW50X3gyOwotCQlwSGFsRGF0YS0+RUVQUk9NQmx1ZXRvb3RoQW50SXNvbGF0aW9uID0gMDsKLQkJcEhhbERhdGEtPkVFUFJPTUJsdWV0b290aFJhZGlvU2hhcmVkID0gQlRfUmFkaW9fU2hhcmVkOwotCX0KLQotCXJ0bDg3MjNhX0JUX2luaXRfaGFsX3ZhcnMocGFkYXB0ZXIpOwotfQotCi12b2lkCi1IYWxfRWZ1c2VQYXJzZUVFUFJPTVZlcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJdTggKmh3aW5mbywgYm9vbCBBdXRvTG9hZEZhaWwpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlpZiAoIUF1dG9Mb2FkRmFpbCkKLQkJcEhhbERhdGEtPkVFUFJPTVZlcnNpb24gPSBod2luZm9bRUVQUk9NX1ZFUlNJT05fODcyM0FdOwotCWVsc2UKLQkJcEhhbERhdGEtPkVFUFJPTVZlcnNpb24gPSAxOwotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkgIkhhbF9FZnVzZVBhcnNlRUVQUk9NVmVyKCksIEVFVmVyID0gJWRcbiIsCi0JCSBwSGFsRGF0YS0+RUVQUk9NVmVyc2lvbik7Ci19Ci0KLXZvaWQKLXJ0bDg3MjNhX0VmdXNlUGFyc2VDaG5sUGxhbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgIHU4ICpod2luZm8sIGJvb2wgQXV0b0xvYWRGYWlsKQotewotCXBhZGFwdGVyLT5tbG1lcHJpdi5DaGFubmVsUGxhbiA9Ci0JCWhhbF9jb21fZ2V0X2NoYW5uZWxfcGxhbjIzYShwYWRhcHRlciwgaHdpbmZvID8KLQkJCQkJIGh3aW5mb1tFRVBST01fQ2hhbm5lbFBsYW5fODcyM0FdOjB4RkYsCi0JCQkJCSBwYWRhcHRlci0+cmVnaXN0cnlwcml2LmNoYW5uZWxfcGxhbiwKLQkJCQkJIFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX1dJREVfMTMsCi0JCQkJCSBBdXRvTG9hZEZhaWwpOwotCi0JREJHXzg3MjNBKCJtbG1lcHJpdi5DaGFubmVsUGxhbiA9IDB4JTAyeFxuIiwKLQkJICBwYWRhcHRlci0+bWxtZXByaXYuQ2hhbm5lbFBsYW4pOwotfQotCi12b2lkCi1IYWxfRWZ1c2VQYXJzZUN1c3RvbWVySUQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSB1OCAqaHdpbmZvLCBib29sIEF1dG9Mb2FkRmFpbCkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWlmICghQXV0b0xvYWRGYWlsKSB7Ci0JCXBIYWxEYXRhLT5FRVBST01DdXN0b21lcklEID0gaHdpbmZvW0VFUFJPTV9DdXN0b21JRF84NzIzQV07Ci0JCXBIYWxEYXRhLT5FRVBST01TdWJDdXN0b21lcklEID0KLQkJICAgIGh3aW5mb1tFRVBST01fU3ViQ3VzdG9tSURfODcyM0FdOwotCX0gZWxzZSB7Ci0JCXBIYWxEYXRhLT5FRVBST01DdXN0b21lcklEID0gMDsKLQkJcEhhbERhdGEtPkVFUFJPTVN1YkN1c3RvbWVySUQgPSAwOwotCX0KLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJICJFRVBST00gQ3VzdG9tZXIgSUQ6IDB4JTJ4XG4iLCBwSGFsRGF0YS0+RUVQUk9NQ3VzdG9tZXJJRCk7Ci0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAiRUVQUk9NIFN1YkN1c3RvbWVyIElEOiAweCUwMnhcbiIsCi0JCSBwSGFsRGF0YS0+RUVQUk9NU3ViQ3VzdG9tZXJJRCk7Ci19Ci0KLXZvaWQKLUhhbF9FZnVzZVBhcnNlQW50ZW5uYURpdmVyc2l0eShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICAgIHU4ICpod2luZm8sIGJvb2wgQXV0b0xvYWRGYWlsKQotewotfQotCi12b2lkCi1IYWxfRWZ1c2VQYXJzZVJhdGVJbmRpY2F0aW9uT3B0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgdTggKmh3aW5mbywgYm9vbCBBdXRvTG9hZEZhaWwpCi17Ci19Ci0KLXZvaWQKLUhhbF9FZnVzZVBhcnNlWHRhbF84NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLAotCQkJIHU4ICpod2luZm8sIHU4IEF1dG9Mb2FkRmFpbCkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBBZGFwdGVyKTsKLQotCWlmICghQXV0b0xvYWRGYWlsKSB7Ci0JCXBIYWxEYXRhLT5DcnlzdGFsQ2FwID0gaHdpbmZvW0VFUFJPTV9YVEFMX0tfODcyM0FdOwotCQlpZiAocEhhbERhdGEtPkNyeXN0YWxDYXAgPT0gMHhGRikKLQkJCXBIYWxEYXRhLT5DcnlzdGFsQ2FwID0gRUVQUk9NX0RlZmF1bHRfQ3J5c3RhbENhcF84NzIzQTsKLQl9IGVsc2UgewotCQlwSGFsRGF0YS0+Q3J5c3RhbENhcCA9IEVFUFJPTV9EZWZhdWx0X0NyeXN0YWxDYXBfODcyM0E7Ci0JfQotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkgIiVzOiBDcnlzdGFsQ2FwID0gMHglMnhcbiIsIF9fZnVuY19fLAotCQkgcEhhbERhdGEtPkNyeXN0YWxDYXApOwotfQotCi12b2lkCi1IYWxfRWZ1c2VQYXJzZVRoZXJtYWxNZXRlcl84NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSB1OCAqUFJPTUNvbnRlbnQsIGJvb2wgQXV0b2xvYWRGYWlsKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JLyogICovCi0JLyogIFRoZXJtYWxNZXRlciBmcm9tIEVFUFJPTSAqLwotCS8qICAqLwotCWlmICghQXV0b2xvYWRGYWlsKQotCQlwSGFsRGF0YS0+RUVQUk9NVGhlcm1hbE1ldGVyID0KLQkJICAgIFBST01Db250ZW50W0VFUFJPTV9USEVSTUFMX01FVEVSXzg3MjNBXTsKLQllbHNlCi0JCXBIYWxEYXRhLT5FRVBST01UaGVybWFsTWV0ZXIgPSBFRVBST01fRGVmYXVsdF9UaGVybWFsTWV0ZXI7Ci0KLQlpZiAoKHBIYWxEYXRhLT5FRVBST01UaGVybWFsTWV0ZXIgPT0gMHhmZikgfHwgQXV0b2xvYWRGYWlsKSB7Ci0JCXBIYWxEYXRhLT5iQVBLVGhlcm1hbE1ldGVySWdub3JlID0gdHJ1ZTsKLQkJcEhhbERhdGEtPkVFUFJPTVRoZXJtYWxNZXRlciA9IEVFUFJPTV9EZWZhdWx0X1RoZXJtYWxNZXRlcjsKLQl9Ci0KLQlEQkdfODcyM0EoIiVzOiBUaGVybWFsTWV0ZXIgPSAweCV4XG4iLCBfX2Z1bmNfXywKLQkJICBwSGFsRGF0YS0+RUVQUk9NVGhlcm1hbE1ldGVyKTsKLX0KLQotc3RhdGljIHZvaWQgcnRsODcyM2FfY2FsX3R4ZGVzY19jaGtzdW0oc3RydWN0IHR4X2Rlc2MgKnB0eGRlc2MpCi17Ci0JX19sZTE2ICp1c1B0ciA9IChfX2xlMTYgKilwdHhkZXNjOwotCXUzMiBjb3VudCA9IDE2OwkJLyogICgzMiBieXRlcyAvIDIgYnl0ZXMgcGVyIFhPUikgPT4gMTYgdGltZXMgKi8KLQl1MzIgaW5kZXg7Ci0JdTE2IGNoZWNrc3VtID0gMDsKLQotCS8qICBDbGVhciBmaXJzdCAqLwotCXB0eGRlc2MtPnR4ZHc3ICY9IGNwdV90b19sZTMyKDB4ZmZmZjAwMDApOwotCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KyspCi0JCWNoZWNrc3VtIF49IGxlMTZfdG9fY3B1KHVzUHRyW2luZGV4XSk7Ci0KLQlwdHhkZXNjLT50eGR3NyB8PSBjcHVfdG9fbGUzMihjaGVja3N1bSAmIDB4MDAwMGZmZmYpOwotfQotCi0vKgotICogIERlc2NyaXB0aW9uOiBJbiBub3JtYWwgY2hpcCwgd2Ugc2hvdWxkIHNlbmQgc29tZSBwYWNrZXQgdG8gSHcgd2hpY2gKLSAqICB3aWxsIGJlIHVzZWQgYnkgRncgaW4gRlcgTFBTIG1vZGUuIFRoZSBmdW5jdGlvbiBpcyB0byBmaWxsIHRoZSBUeAotICogZGVzY3JpcHRvciBvZiB0aGlzIHBhY2tldHMsIHRoZW4KLSAqLwotLyoJCQlGdyBjYW4gdGVsbCBIdyB0byBzZW5kIHRoZXNlIHBhY2tldCBkZXJlY3RseS4gKi8KLS8qICBBZGRlZCBieSB0eW5saS4gMjAwOS4xMC4xNS4gKi8KLS8qICAqLwotdm9pZCBydGw4NzIzYV9maWxsX2Zha2VfdHhkZXNjKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpwRGVzYywKLQkJCSAgICAgICB1MzIgQnVmZmVyTGVuLCB1OCBJc1BzUG9sbCwgdTggSXNCVFFvc051bGwpCi17Ci0Jc3RydWN0IHR4X2Rlc2MgKnB0eGRlc2M7Ci0KLQkvKiAgQ2xlYXIgYWxsIHN0YXR1cyAqLwotCXB0eGRlc2MgPSAoc3RydWN0IHR4X2Rlc2MgKilwRGVzYzsKLQltZW1zZXQocERlc2MsIDAsIFRYREVTQ19TSVpFKTsKLQotCS8qIG9mZnNldCAwICovCi0JLyogb3duLCBiRmlyc3RTZWcsIGJMYXN0U2VnOyAqLwotCXB0eGRlc2MtPnR4ZHcwIHw9IGNwdV90b19sZTMyKE9XTiB8IEZTRyB8IExTRyk7Ci0KLQkvKiAzMiBieXRlcyBmb3IgVFggRGVzYyAqLwotCXB0eGRlc2MtPnR4ZHcwIHw9IGNwdV90b19sZTMyKCgoVFhERVNDX1NJWkUgKyBPRkZTRVRfU1opIDw8Ci0JCQkJICAgICAgIE9GRlNFVF9TSFQpICYgMHgwMGZmMDAwMCk7Ci0KLQkvKiAgQnVmZmVyIHNpemUgKyBjb21tYW5kIGhlYWRlciAqLwotCXB0eGRlc2MtPnR4ZHcwIHw9IGNwdV90b19sZTMyKEJ1ZmZlckxlbiAmIDB4MDAwMGZmZmYpOwotCi0JLyogb2Zmc2V0IDQgKi8KLQkvKiAgRml4ZWQgcXVldWUgb2YgTWdudCBxdWV1ZSAqLwotCXB0eGRlc2MtPnR4ZHcxIHw9IGNwdV90b19sZTMyKChRU0xUX01HTlQgPDwgUVNFTF9TSFQpICYgMHgwMDAwMWYwMCk7Ci0KLQkvKiBTZXQgTkFWVVNFSERSIHRvIHByZXZlbnQgUHMtcG9sbCBBSWQgZmlsZWQgdG8gYmUgY2hhbmdlZAotCSAgIHRvIGVycm9yIHZsYXVlIGJ5IEh3LiAqLwotCWlmIChJc1BzUG9sbCkgewotCQlwdHhkZXNjLT50eGR3MSB8PSBjcHVfdG9fbGUzMihOQVZVU0VIRFIpOwotCX0gZWxzZSB7Ci0JCS8qICBIdyBzZXQgc2VxdWVuY2UgbnVtYmVyICovCi0JCXB0eGRlc2MtPnR4ZHc0IHw9IGNwdV90b19sZTMyKEJJVCg3KSk7Ci0JCS8qIHNldCBiaXQzIHRvIDEuIFN1dWdlc3RlZCBieSBUaW1DaGVuLiAyMDA5LjEyLjI5LiAqLwotCQlwdHhkZXNjLT50eGR3MyB8PSBjcHVfdG9fbGUzMigoOCA8PCAyOCkpOwotCX0KLQotCWlmICh0cnVlID09IElzQlRRb3NOdWxsKQotCQlwdHhkZXNjLT50eGR3MiB8PSBjcHVfdG9fbGUzMihCSVQoMjMpKTsJLyogIEJUIE5VTEwgKi8KLQotCS8qIG9mZnNldCAxNiAqLwotCXB0eGRlc2MtPnR4ZHc0IHw9IGNwdV90b19sZTMyKEJJVCg4KSk7CS8qIGRyaXZlciB1c2VzIHJhdGUgKi8KLQotCS8qICBVU0IgaW50ZXJmYWNlIGRyb3AgcGFja2V0IGlmIHRoZSBjaGVja3N1bSBvZiBkZXNjcmlwdG9yIGlzbid0Ci0JICAgIGNvcnJlY3QuICovCi0JLyogIFVzaW5nIHRoaXMgY2hlY2tzdW0gY2FuIGxldCBoYXJkd2FyZSByZWNvdmVyeSBmcm9tIHBhY2tldCBidWxrCi0JICAgIG91dCBlcnJvciAoZS5nLiBDYW5jZWwgVVJDLCBCdWxrIG91dCBlcnJvci4pLiAqLwotCXJ0bDg3MjNhX2NhbF90eGRlc2NfY2hrc3VtKHB0eGRlc2MpOwotfQotCi12b2lkIGh3X3Zhcl9zZXRfb3Btb2RlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IG1vZGUpCi17Ci0JdTggdmFsODsKLQotCWlmIChtb2RlID09IE1TUl9JTkZSQSB8fCBtb2RlID09IE1TUl9OT0xJTkspIHsKLQkJU3RvcFR4QmVhY29uKHBhZGFwdGVyKTsKLQotCQkvKiAgZGlzYWJsZSBhdGltIHduZCAqLwotCQl2YWw4ID0gRElTX1RTRl9VRFQgfCBFTl9CQ05fRlVOQ1RJT04gfCBESVNfQVRJTTsKLQkJU2V0QmNuQ3RybFJlZzIzYShwYWRhcHRlciwgdmFsOCwgfnZhbDgpOwotCX0gZWxzZSBpZiAobW9kZSA9PSBNU1JfQURIT0MpIHsKLQkJUmVzdW1lVHhCZWFjb24ocGFkYXB0ZXIpOwotCi0JCXZhbDggPSBESVNfVFNGX1VEVCB8IEVOX0JDTl9GVU5DVElPTiB8IERJU19CQ05RX1NVQjsKLQkJU2V0QmNuQ3RybFJlZzIzYShwYWRhcHRlciwgdmFsOCwgfnZhbDgpOwotCX0gZWxzZSBpZiAobW9kZSA9PSBNU1JfQVApIHsKLQkJLyogIGFkZCBOVUxMIERhdGEgYW5kIEJUIE5VTEwgRGF0YSBQYWNrZXRzIHRvIEZXIFJTVkQgUGFnZSAqLwotCQlydGw4NzIzYV9zZXRfQlRDb2V4X0FQX21vZGVfRndSc3ZkUGt0X2NtZChwYWRhcHRlcik7Ci0KLQkJUmVzdW1lVHhCZWFjb24ocGFkYXB0ZXIpOwotCi0JCXZhbDggPSBESVNfVFNGX1VEVCB8IERJU19CQ05RX1NVQjsKLQkJU2V0QmNuQ3RybFJlZzIzYShwYWRhcHRlciwgdmFsOCwgfnZhbDgpOwotCi0JCS8qICBTZXQgUkNSICovCi0JCS8qIHJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfUkNSLCAweDcwMDAyYThlKTsKLQkJICAgQ0JTU0lEX0RBVEEgbXVzdCBzZXQgdG8gMCAqLwotCQkvKiBDQlNTSURfREFUQSBtdXN0IHNldCB0byAwICovCi0JCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfUkNSLCAweDcwMDAyMjhlKTsKLQkJLyogIGVuYWJsZSB0byByeCBkYXRhIGZyYW1lICovCi0JCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfUlhGTFRNQVAyLCAweEZGRkYpOwotCQkvKiAgZW5hYmxlIHRvIHJ4IHBzLXBvbGwgKi8KLQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19SWEZMVE1BUDEsIDB4MDQwMCk7Ci0KLQkJLyogIEJlYWNvbiBDb250cm9sIHJlbGF0ZWQgcmVnaXN0ZXIgZm9yIGZpcnN0IHRpbWUgKi8KLQkJLyogIDJtcyAqLwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfQkNORE1BVElNLCAweDAyKTsKLQkJLyogIDVtcyAqLwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfRFJWRVJMWUlOVCwgMHgwNSk7Ci0JCS8qICAxMG1zIGZvciBwb3J0MCAqLwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfQVRJTVdORCwgMHgwYSk7Ci0JCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfQkNOVENGRywgMHgwMCk7Ci0JCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfVEJUVF9QUk9ISUJJVCwgMHhmZjA0KTsKLQkJLyogICszMjc2NyAofjMybXMpICovCi0JCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfVFNGVFJfU1lOX09GRlNFVCwgMHg3ZmZmKTsKLQotCQkvKiAgcmVzZXQgVFNGICovCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19EVUFMX1RTRl9SU1QsIEJJVCgwKSk7Ci0KLQkJLyogIGVuYWJsZSBCQ04gRnVuY3Rpb24gKi8KLQkJLyogIGRvbid0IGVuYWJsZSB1cGRhdGUgVFNGIChkdWUgdG8gVFNGIHVwZGF0ZSB3aGVuCi0JCSAgICBiZWFjb24vcHJvYmUgcnNwIGFyZSByZWNlaXZlZCkgKi8KLQkJdmFsOCA9IERJU19UU0ZfVURUIHwgRU5fQkNOX0ZVTkNUSU9OIHwKLQkJICAgICAgIEVOX1RYQkNOX1JQVCB8IERJU19CQ05RX1NVQjsKLQkJU2V0QmNuQ3RybFJlZzIzYShwYWRhcHRlciwgdmFsOCwgfnZhbDgpOwotCX0KLQotCXZhbDggPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIE1TUik7Ci0JdmFsOCA9ICh2YWw4ICYgMHhDKSB8IG1vZGU7Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgTVNSLCB2YWw4KTsKLX0KLQotdm9pZCBod192YXJfc2V0X21hY2FkZHIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnZhbCkKLXsKLQl1OCBpZHggPSAwOwotCXUzMiByZWdfbWFjaWQ7Ci0KLQlyZWdfbWFjaWQgPSBSRUdfTUFDSUQ7Ci0KLQlmb3IgKGlkeCA9IDA7IGlkeCA8IDY7IGlkeCsrKQotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCAocmVnX21hY2lkICsgaWR4KSwgdmFsW2lkeF0pOwotfQotCi12b2lkIGh3X3Zhcl9zZXRfYnNzaWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnZhbCkKLXsKLQl1OCBpZHggPSAwOwotCXUzMiByZWdfYnNzaWQ7Ci0KLQlyZWdfYnNzaWQgPSBSRUdfQlNTSUQ7Ci0KLQlmb3IgKGlkeCA9IDA7IGlkeCA8IDY7IGlkeCsrKQotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCAocmVnX2Jzc2lkICsgaWR4KSwgdmFsW2lkeF0pOwotfQotCi12b2lkIGh3X3Zhcl9zZXRfY29ycmVjdF90c2Yoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1NjQgdHNmOwotCXUzMiByZWdfdHNmdHI7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCS8qIHRzZiA9IHBtbG1lZXh0LT5UU0ZWYWx1ZSAtICgodTMyKXBtbG1lZXh0LT5UU0ZWYWx1ZSAlCi0JICAgKHBtbG1laW5mby0+YmNuX2ludGVydmFsKjEwMjQpKSAtIDEwMjQ7IHVzICovCi0JdHNmID0gcG1sbWVleHQtPlRTRlZhbHVlIC0KLQkJZG9fZGl2KHBtbG1lZXh0LT5UU0ZWYWx1ZSwKLQkJICAgICAgIChwbWxtZWluZm8tPmJjbl9pbnRlcnZhbCAqIDEwMjQpKSAtIDEwMjQ7CS8qIHVzICovCi0KLQlpZiAoKChwbWxtZWluZm8tPnN0YXRlICYgMHgwMykgPT0gTVNSX0FESE9DKSB8fAotCSAgICAoKHBtbG1laW5mby0+c3RhdGUgJiAweDAzKSA9PSBNU1JfQVApKSB7Ci0JCS8qIHBIYWxEYXRhLT5SZWdUeFBhdXNlIHw9IFNUT1BfQkNOUTtCSVQoNikgKi8KLQkJLyogcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1RYUEFVU0UsCi0JCSAgIChydGw4NzIzYXVfcmVhZDgoQWRhcHRlciwgUkVHX1RYUEFVU0UpfEJJVCg2KSkpOyAqLwotCQlTdG9wVHhCZWFjb24ocGFkYXB0ZXIpOwotCX0KLQotCXJlZ190c2Z0ciA9IFJFR19UU0ZUUjsKLQotCS8qICBkaXNhYmxlIHJlbGF0ZWQgVFNGIGZ1bmN0aW9uICovCi0JU2V0QmNuQ3RybFJlZzIzYShwYWRhcHRlciwgMCwgRU5fQkNOX0ZVTkNUSU9OKTsKLQotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCByZWdfdHNmdHIsIHRzZik7Ci0JcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIHJlZ190c2Z0ciArIDQsIHRzZiA+PiAzMik7Ci0KLQkvKiBlbmFibGUgcmVsYXRlZCBUU0YgZnVuY3Rpb24gKi8KLQlTZXRCY25DdHJsUmVnMjNhKHBhZGFwdGVyLCBFTl9CQ05fRlVOQ1RJT04sIDApOwotCi0JaWYgKCgocG1sbWVpbmZvLT5zdGF0ZSAmIDB4MDMpID09IE1TUl9BREhPQykgfHwKLQkgICAgKChwbWxtZWluZm8tPnN0YXRlICYgMHgwMykgPT0gTVNSX0FQKSkKLQkJUmVzdW1lVHhCZWFjb24ocGFkYXB0ZXIpOwotfQotCi12b2lkIGh3X3Zhcl9zZXRfbWxtZV9kaXNjb25uZWN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JLyogIHJlamVjdCBhbGwgZGF0YSBmcmFtZXMgKi8KLQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX1JYRkxUTUFQMiwgMCk7Ci0KLQkvKiAgcmVzZXQgVFNGICovCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0RVQUxfVFNGX1JTVCwgQklUKDApKTsKLQotCS8qICBkaXNhYmxlIHVwZGF0ZSBUU0YgKi8KLQlTZXRCY25DdHJsUmVnMjNhKHBhZGFwdGVyLCBESVNfVFNGX1VEVCwgMCk7Ci19Ci0KLXZvaWQgaHdfdmFyX3NldF9tbG1lX2pvaW4oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggdHlwZSkKLXsKLQl1OCBSZXRyeUxpbWl0ID0gMHgzMDsKLQotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlpZiAodHlwZSA9PSAwKSB7CS8qICBwcmVwYXJlIHRvIGpvaW4gKi8KLQkJdTMyIHYzMjsKLQotCQkvKiAgZW5hYmxlIHRvIHJ4IGRhdGEgZnJhbWUuQWNjZXB0IGFsbCBkYXRhIGZyYW1lICovCi0JCS8qIHJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfUkNSLAotCQkgICBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfUkNSKXxSQ1JfQURGKTsgKi8KLQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19SWEZMVE1BUDIsIDB4RkZGRik7Ci0KLQkJdjMyID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgUkVHX1JDUik7Ci0JCXYzMiB8PSBSQ1JfQ0JTU0lEX0RBVEEgfCBSQ1JfQ0JTU0lEX0JDTjsKLQkJcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIFJFR19SQ1IsIHYzMik7Ci0KLQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpID09IHRydWUpCi0JCQlSZXRyeUxpbWl0ID0KLQkJCSAgICAocEhhbERhdGEtPkN1c3RvbWVySUQgPT0gUlRfQ0lEX0NDWCkgPyA3IDogNDg7Ci0JCWVsc2UJCS8qICBBZC1ob2MgTW9kZSAqLwotCQkJUmV0cnlMaW1pdCA9IDB4NzsKLQl9IGVsc2UgaWYgKHR5cGUgPT0gMSkgewkvKiAgam9pbmJzc19ldmVudCBjYWxsYmFjayB3aGVuIGpvaW4gcmVzIDwgMCAqLwotCQkvKiAgY29uZmlnIFJDUiB0byByZWNlaXZlIGRpZmZlcmVudCBCU1NJRCAmIG5vdCB0bwotCQkgICAgcmVjZWl2ZSBkYXRhIGZyYW1lIGR1cmluZyBsaW5raW5nICovCi0JCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfUlhGTFRNQVAyLCAwKTsKLQl9IGVsc2UgaWYgKHR5cGUgPT0gMikgewkvKiAgc3RhIGFkZCBldmVudCBjYWxsYmFjayAqLwotCQkvKiAgZW5hYmxlIHVwZGF0ZSBUU0YgKi8KLQkJU2V0QmNuQ3RybFJlZzIzYShwYWRhcHRlciwgMCwgRElTX1RTRl9VRFQpOwotCi0JCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwKLQkJCQkgIFdJRklfQURIT0NfU1RBVEUgfCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkpIHsKLQkJCS8qICBmaXhlZCBiZWFjb24gaXNzdWUgZm9yIDgxOTFzdS4uLi4uLi4uLi4uICovCi0JCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCAweDU0MiwgMHgwMik7Ci0JCQlSZXRyeUxpbWl0ID0gMHg3OwotCQl9Ci0JfQotCi0JcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19STCwKLQkJCSAgUmV0cnlMaW1pdCA8PCBSRVRSWV9MSU1JVF9TSE9SVF9TSElGVCB8IFJldHJ5TGltaXQgPDwKLQkJCSAgUkVUUllfTElNSVRfTE9OR19TSElGVCk7Ci0KLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIDA6Ci0JCS8qICBwcmVwYXJlIHRvIGpvaW4gKi8KLQkJcnRsODcyM2FfQlRfd2lmaWFzc29jaWF0ZV9ub3RpZnkocGFkYXB0ZXIsIHRydWUpOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCS8qICBqb2luYnNzX2V2ZW50IGNhbGxiYWNrIHdoZW4gam9pbiByZXMgPCAwICovCi0JCXJ0bDg3MjNhX0JUX3dpZmlhc3NvY2lhdGVfbm90aWZ5KHBhZGFwdGVyLCBmYWxzZSk7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJLyogIHN0YSBhZGQgZXZlbnQgY2FsbGJhY2sgKi8KLS8qCQlCVF9XaWZpTWVkaWFTdGF0dXNOb3RpZnkocGFkYXB0ZXIsIFJUX01FRElBX0NPTk5FQ1QpOyAqLwotCQlicmVhazsKLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9waHljZmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX3BoeWNmZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmE2YzNlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX3BoeWNmZy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfUlRMODcyM0FfUEhZQ0ZHX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxydGw4NzIzYV9oYWwuaD4KLSNpbmNsdWRlIDx1c2Jfb3BzX2xpbnV4Lmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIExvY2FsIENvbnN0YW50LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIENoYW5uZWwgc3dpdGNoOlRoZSBzaXplIG9mIGNvbW1hbmQgdGFibGVzIGZvciBzd2l0Y2ggY2hhbm5lbCovCi0jZGVmaW5lIE1BWF9QUkVDTURfQ05UIDE2Ci0jZGVmaW5lIE1BWF9SRkRFUEVORENNRF9DTlQgMTYKLSNkZWZpbmUgTUFYX1BPU1RDTURfQ05UIDE2Ci0KLSNkZWZpbmUgTUFYX0RPWkVfV0FJVElOR19USU1FU185eCA2NAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBMb2NhbCBDb25zdGFudC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIGdsb2JhbCB2YXJpYWJsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgbG9jYWwgdmFyaWFibGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIGV4cG9ydCBmdW5jdGlvbiBwcm90b3R5cGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiAgUGxlYXNlIHJlZmVyIHRvIGhlYWRlciBmaWxlICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIGV4cG9ydCBmdW5jdGlvbiBwcm90b3R5cGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUZ1bmN0aW9uIEJvZHktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICAqLwotLyogIDEuIEJCIHJlZ2lzdGVyIFIvVyBBUEkgKi8KLS8qICAqLwotCi0vKioKLSogRnVuY3Rpb246CXBoeV9DYWxjdWxhdGVCaXRTaGlmdAotKgotKiBPdmVyVmlldzoJR2V0IHNoaWZ0ZWQgcG9zaXRpb24gb2YgdGhlIEJpdE1hc2sKLSoKLSogSW5wdXQ6Ci0qCQkJdTMyCQlCaXRNYXNrLAotKgotKiBPdXRwdXQ6CW5vbmUKLSogUmV0dXJuOgkJdTMyCQlSZXR1cm4gdGhlIHNoaWZ0IGJpdCBiaXQgcG9zaXRpb24gb2YgdGhlIG1hc2sKLSovCi1zdGF0aWMJdTMyIHBoeV9DYWxjdWxhdGVCaXRTaGlmdCh1MzIgQml0TWFzaykKLXsKLQl1MzIgaTsKLQotCWZvciAoaSA9IDA7IGkgPD0gMzE7IGkrKykgewotCQlpZiAoKChCaXRNYXNrPj5pKSAmIDB4MSkgPT0gMSkKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybiBpOwotfQotCi0vKioKLSogRnVuY3Rpb246CVBIWV9RdWVyeUJCUmVnCi0qCi0qIE92ZXJWaWV3OglSZWFkICJzZXBjaWZpYyBiaXRzIiBmcm9tIEJCIHJlZ2lzdGVyCi0qCi0qIElucHV0OgotKglzdHJ1Y3QgcnR3X2FkYXB0ZXIgKglBZGFwdGVyLAotKgl1MzIJCQlSZWdBZGRyLAlUYXJnZXQgYWRkcmVzcyB0byBiZSByZWFkYmFjawotKgl1MzIJCQlCaXRNYXNrCQlUYXJnZXQgYml0IHBvc2l0aW9uIGluIHRoZQotKgkJCQkJCXRhcmdldCBhZGRyZXNzIHRvIGJlIHJlYWRiYWNrCi0qIE91dHB1dDoKLSoJTm9uZQotKiBSZXR1cm46Ci0qCXUzMgkJCURhdGEJCVRoZSByZWFkYmFjayByZWdpc3RlciB2YWx1ZQotKiBOb3RlOgotKglUaGlzIGZ1bmN0aW9uIGlzIGVxdWFsIHRvICJHZXRSZWdTZXR0aW5nIiBpbiBQSFkgcHJvZ3JhbW1pbmcgZ3VpZGUKLSovCi11MzIKLVBIWV9RdWVyeUJCUmVnKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwgdTMyIFJlZ0FkZHIsIHUzMiBCaXRNYXNrKQotewotCXUzMglSZXR1cm5WYWx1ZSA9IDAsIE9yaWdpbmFsVmFsdWUsIEJpdFNoaWZ0OwotCi0JT3JpZ2luYWxWYWx1ZSA9IHJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgUmVnQWRkcik7Ci0JQml0U2hpZnQgPSBwaHlfQ2FsY3VsYXRlQml0U2hpZnQoQml0TWFzayk7Ci0JUmV0dXJuVmFsdWUgPSAoT3JpZ2luYWxWYWx1ZSAmIEJpdE1hc2spID4+IEJpdFNoaWZ0OwotCXJldHVybiBSZXR1cm5WYWx1ZTsKLX0KLQotLyoqCi0qIEZ1bmN0aW9uOglQSFlfU2V0QkJSZWcKLSoKLSogT3ZlclZpZXc6CVdyaXRlICJTcGVjaWZpYyBiaXRzIiB0byBCQiByZWdpc3RlciAocGFnZSA4fikKLSoKLSogSW5wdXQ6Ci0qCXN0cnVjdCBydHdfYWRhcHRlciAqCUFkYXB0ZXIsCi0qCXUzMgkJCVJlZ0FkZHIsCVRhcmdldCBhZGRyZXNzIHRvIGJlIG1vZGlmaWVkCi0qCXUzMgkJCUJpdE1hc2sJCVRhcmdldCBiaXQgcG9zaXRpb24gaW4gdGhlCi0qCQkJCQkJdGFyZ2V0IGFkZHJlc3MgdG8gYmUgbW9kaWZpZWQKLSoJdTMyCQkJRGF0YQkJVGhlIG5ldyByZWdpc3RlciB2YWx1ZSBpbiB0aGUKLSoJCQkJCQl0YXJnZXQgYml0IHBvc2l0aW9uIG9mIHRoZQotKgkJCQkJCSB0YXJnZXQgYWRkcmVzcwotKgotKiBPdXRwdXQ6Ci0qCU5vbmUKLSogUmV0dXJuOgotKglOb25lCi0qIE5vdGU6Ci0qCVRoaXMgZnVuY3Rpb24gaXMgZXF1YWwgdG8gIlB1dFJlZ1NldHRpbmciIGluIFBIWSBwcm9ncmFtbWluZyBndWlkZQotKi8KLQotdm9pZAotUEhZX1NldEJCUmVnKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwgdTMyIFJlZ0FkZHIsIHUzMiBCaXRNYXNrLCB1MzIJRGF0YSkKLXsKLQl1MzIgT3JpZ2luYWxWYWx1ZSwgQml0U2hpZnQ7Ci0KLQlpZiAoQml0TWFzayAhPSBiTWFza0RXb3JkKSB7LyogaWYgbm90ICJkb3VibGUgd29yZCIgd3JpdGUgKi8KLQkJT3JpZ2luYWxWYWx1ZSA9IHJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgUmVnQWRkcik7Ci0JCUJpdFNoaWZ0ID0gcGh5X0NhbGN1bGF0ZUJpdFNoaWZ0KEJpdE1hc2spOwotCQlEYXRhID0gKE9yaWdpbmFsVmFsdWUgJiAofkJpdE1hc2spKSB8IChEYXRhIDw8IEJpdFNoaWZ0KTsKLQl9Ci0KLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSZWdBZGRyLCBEYXRhKTsKLQotCS8qIFJUUFJJTlQoRlBIWSwgUEhZX0JCVywgKCJCQlcgTUFTSyA9IDB4JWx4IEFkZHJbMHglbHhdPSAweCVseFxuIiwgQml0TWFzaywgUmVnQWRkciwgRGF0YSkpOyAqLwotfQotCi0vKiAgKi8KLS8qICAyLiBSRiByZWdpc3RlciBSL1cgQVBJICovCi0vKiAgKi8KLQotLyoqCi0qIEZ1bmN0aW9uOglwaHlfUkZTZXJpYWxSZWFkCi0qCi0qIE92ZXJWaWV3OglSZWFkIHJlZ3N0ZXIgZnJvbSBSRiBjaGlwcwotKgotKiBJbnB1dDoKLSoJCXN0cnVjdCBydHdfYWRhcHRlciAqCQlBZGFwdGVyLAotKgkJZW51bSBSRl9SQURJT19QQVRICWVSRlBhdGgsCVJhZGlvIHBhdGggb2YgQS9CL0MvRAotKgkJdTMyIE9mZnNldCwJCQlUaGUgdGFyZ2V0IGFkZHJlc3MgdG8gYmUgcmVhZAotKgotKiBPdXRwdXQ6CU5vbmUKLSogUmV0dXJuOgl1MzIJCQlyZWJhY2sgdmFsdWUKLSogTm90ZToJCVRocmVyZSBhcmUgdGhyZWUgdHlwZXMgb2Ygc2VyaWFsIG9wZXJhdGlvbnM6Ci0qCQkxLiBTb2Z0d2FyZSBzZXJpYWwgd3JpdGUKLSoJCTIuIEhhcmR3YXJlIExTU0ktTG93IFNwZWVkIFNlcmlhbCBJbnRlcmZhY2UKLSoJCTMuIEhhcmR3YXJlIEhTU0ktSGlnaCBzcGVlZAotKgkJc2VyaWFsIHdyaXRlLiBEcml2ZXIgbmVlZCB0byBpbXBsZW1lbnQgKDEpIGFuZCAoMikuCi0qCQlUaGlzIGZ1bmN0aW9uIGlzIGVxdWFsIHRvIHRoZSBjb21iaW5hdGlvbiBvZiBSRl9SZWFkUmVnKCkgYW5kCi0qCQlSRkxTU0lSZWFkKCkKLSovCi1zdGF0aWMgdTMyCi1waHlfUkZTZXJpYWxSZWFkKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwgZW51bSBSRl9SQURJT19QQVRIIGVSRlBhdGgsCi0JCSB1MzIgT2Zmc2V0KQotewotCXUzMiByZXRWYWx1ZSA9IDA7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlzdHJ1Y3QgYmJfcmVnX2RlZmluZSAqcFBoeVJlZyA9ICZwSGFsRGF0YS0+UEhZUmVnRGVmW2VSRlBhdGhdOwotCXUzMiBOZXdPZmZzZXQ7Ci0JdTMyIHRtcGxvbmcsIHRtcGxvbmcyOwotCXU4IFJmUGlFbmFibGUgPSAwOwotCS8qICAqLwotCS8qICBNYWtlIHN1cmUgUkYgcmVnaXN0ZXIgb2Zmc2V0IGlzIGNvcnJlY3QgKi8KLQkvKiAgKi8KLQlPZmZzZXQgJj0gMHgzZjsKLQotCS8qICAqLwotCS8qICBTd2l0Y2ggcGFnZSBmb3IgODI1NiBSRiBJQyAqLwotCS8qICAqLwotCU5ld09mZnNldCA9IE9mZnNldDsKLQotCS8qICAyMDA5LzA2LzE3IE1IIFdlIGNhbiBub3QgZXhlY3V0ZSBJTyBmb3IgcG93ZXIgc2F2ZSBvcgotCSAgICBvdGhlciBhY2NpZGVudCBtb2RlLiAqLwotCS8qIGlmIChSVF9DQU5OT1RfSU8oQWRhcHRlcikpICovCi0JLyogICovCi0JLyoJUlRQUklOVChGUEhZLCBQSFlfUkZSLCAoInBoeV9SRlNlcmlhbFJlYWQgcmV0dXJuIGFsbCBvbmVcbiIpKTsgKi8KLQkvKglyZXR1cm4JMHhGRkZGRkZGRjsgKi8KLQkvKiAgKi8KLQotCS8qICBGb3IgOTJTIExTU0kgUmVhZCBSRkxTU0lSZWFkICovCi0JLyogIEZvciBSRiBBL0Igd3JpdGUgMHg4MjQvODJjKGRvZXMgbm90IHdvcmsgaW4gdGhlIGZ1dHVyZSkgKi8KLQkvKiAgV2UgbXVzdCB1c2UgMHg4MjQgZm9yIFJGIEEgYW5kIEIgdG8gZXhlY3V0ZSByZWFkIHRyaWdnZXIgKi8KLQl0bXBsb25nID0gcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCByRlBHQTBfWEFfSFNTSVBhcmFtZXRlcjIpOwotCWlmIChlUkZQYXRoID09IFJGX1BBVEhfQSkKLQkJdG1wbG9uZzIgPSB0bXBsb25nOwotCWVsc2UKLQkJdG1wbG9uZzIgPSBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIHBQaHlSZWctPnJmSFNTSVBhcmEyKTsKLQotCXRtcGxvbmcyID0gKHRtcGxvbmcyICYgfmJMU1NJUmVhZEFkZHJlc3MpIHwKLQkJKE5ld09mZnNldCA8PCAyMykgfCBiTFNTSVJlYWRFZGdlOwkvKiBUNjUgUkYgKi8KLQotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIHJGUEdBMF9YQV9IU1NJUGFyYW1ldGVyMiwKLQkJCSAgdG1wbG9uZyAmICh+YkxTU0lSZWFkRWRnZSkpOwotCXVkZWxheSgxMCk7LyogIFBsYXRmb3JtU3RhbGxFeGVjdXRpb24oMTApOyAqLwotCi0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgcFBoeVJlZy0+cmZIU1NJUGFyYTIsIHRtcGxvbmcyKTsKLQl1ZGVsYXkoMTAwKTsvKiBQbGF0Zm9ybVN0YWxsRXhlY3V0aW9uKDEwMCk7ICovCi0KLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCByRlBHQTBfWEFfSFNTSVBhcmFtZXRlcjIsCi0JCQkgIHRtcGxvbmcgfCBiTFNTSVJlYWRFZGdlKTsKLQl1ZGVsYXkoMTApOy8qIFBsYXRmb3JtU3RhbGxFeGVjdXRpb24oMTApOyAqLwotCi0JaWYgKGVSRlBhdGggPT0gUkZfUEFUSF9BKQotCQlSZlBpRW5hYmxlID0gKHU4KVBIWV9RdWVyeUJCUmVnKEFkYXB0ZXIsCi0JCQkJCQlyRlBHQTBfWEFfSFNTSVBhcmFtZXRlcjEsCi0JCQkJCQlCSVQoOCkpOwotCWVsc2UgaWYgKGVSRlBhdGggPT0gUkZfUEFUSF9CKQotCQlSZlBpRW5hYmxlID0gKHU4KVBIWV9RdWVyeUJCUmVnKEFkYXB0ZXIsCi0JCQkJCQlyRlBHQTBfWEJfSFNTSVBhcmFtZXRlcjEsCi0JCQkJCQlCSVQoOCkpOwotCi0JaWYgKFJmUGlFbmFibGUpCXsKLQkJLyogUmVhZCBmcm9tIEJCcmVnOGI4LCAxMiBiaXRzIGZvciA4MTkwLCAyMGJpdHMgZm9yIFQ2NSBSRiAqLwotCQlyZXRWYWx1ZSA9IFBIWV9RdWVyeUJCUmVnKEFkYXB0ZXIsIHBQaHlSZWctPnJmTFNTSVJlYWRCYWNrUGksCi0JCQkJCSAgYkxTU0lSZWFkQmFja0RhdGEpOwotCQkvKiBEQkdfODcyM0EoIlJlYWRiYWNrIGZyb20gUkYtUEkgOiAweCV4XG4iLCByZXRWYWx1ZSk7ICovCi0JfSBlbHNlIHsKLQkJLyogUmVhZCBmcm9tIEJCcmVnOGEwLCAxMiBiaXRzIGZvciA4MTkwLCAyMCBiaXRzIGZvciBUNjUgUkYgKi8KLQkJcmV0VmFsdWUgPSBQSFlfUXVlcnlCQlJlZyhBZGFwdGVyLCBwUGh5UmVnLT5yZkxTU0lSZWFkQmFjaywKLQkJCQkJICBiTFNTSVJlYWRCYWNrRGF0YSk7Ci0JCS8qIERCR184NzIzQSgiUmVhZGJhY2sgZnJvbSBSRi1TSSA6IDB4JXhcbiIsIHJldFZhbHVlKTsgKi8KLQl9Ci0JLyogREJHXzg3MjNBKCJSRlItJWQgQWRkclsweCV4XT0gMHgleFxuIiwgZVJGUGF0aCwgcFBoeVJlZy0+cmZMU1NJUmVhZEJhY2ssIHJldFZhbHVlKTsgKi8KLQotCXJldHVybiByZXRWYWx1ZTsKLX0KLQotLyoqCi0qIEZ1bmN0aW9uOglwaHlfUkZTZXJpYWxXcml0ZQotKgotKiBPdmVyVmlldzoJV3JpdGUgZGF0YSB0byBSRiByZWdpc3RlciAocGFnZSA4fikKLSoKLSogSW5wdXQ6Ci0qCXN0cnVjdCBydHdfYWRhcHRlciAqCQlBZGFwdGVyLAotKgllbnVtIFJGX1JBRElPX1BBVEgJZVJGUGF0aCwJUmFkaW8gcGF0aCBvZiBBL0IvQy9ECi0qCXUzMiBPZmZzZXQsCQkJVGhlIHRhcmdldCBhZGRyZXNzIHRvIGJlIHJlYWQKLSoJdTMyIERhdGEJCQlUaGUgbmV3IHJlZ2lzdGVyIERhdGEgaW4gdGhlIHRhcmdldAotKgkJCQkJYml0IHBvc2l0aW9uIG9mIHRoZSB0YXJnZXQgdG8gYmUgcmVhZAotKgotKiBPdXRwdXQ6Ci0qCU5vbmUKLSogUmV0dXJuOgotKglOb25lCi0qIE5vdGU6Ci0qCVRocmVyZSBhcmUgdGhyZWUgdHlwZXMgb2Ygc2VyaWFsIG9wZXJhdGlvbnM6Ci0qCQkxLiBTb2Z0d2FyZSBzZXJpYWwgd3JpdGUKLSoJCTIuIEhhcmR3YXJlIExTU0ktTG93IFNwZWVkIFNlcmlhbCBJbnRlcmZhY2UKLSoJCTMuIEhhcmR3YXJlIEhTU0ktSGlnaCBzcGVlZAotKgkJc2VyaWFsIHdyaXRlLiBEcml2ZXIgbmVlZCB0byBpbXBsZW1lbnQgKDEpIGFuZCAoMikuCi0qCQlUaGlzIGZ1bmN0aW9uIGlzIGVxdWFsIHRvIHRoZSBjb21iaW5hdGlvbiBvZiBSRl9SZWFkUmVnKCkgYW5kCi0qCQlSRkxTU0lSZWFkKCkKLSoKLSogTm90ZToJICBGb3IgUkY4MjU2IG9ubHkKLSogVGhlIHRvdGFsIGNvdW50IG9mIFJUTDgyNTYoWmVicmE0KSByZWdpc3RlciBpcyBhcm91bmQgMzYgYml0IGl0IG9ubHkgZW1wbG95cwotKiA0LWJpdCBSRiBhZGRyZXNzLiBSVEw4MjU2IHVzZXMgInJlZ2lzdGVyIG1vZGUgY29udHJvbCBiaXQiCi0qIChSZWcwMFsxMl0sIFJlZzAwWzEwXSkgdG8gYWNjZXNzIHJlZ2lzdGVyIGFkZHJlc3MgYmlnZ2VyIHRoYW4gMHhmLgotKiBTZWUgIkFwcGVuZGl4LTQgaW4gUEhZIENvbmZpZ3VyYXRpb24gcHJvZ3JhbW1pbmcgZ3VpZGUiIGZvciBtb3JlIGRldGFpbHMuCi0qIFRodXMsIHdlIGRlZmluZSBhIHN1Yi1maW5jdGlvbiBmb3IgUlRMODUyNiByZWdpc3RlciBhZGRyZXNzIGNvbnZlcnNpb24KLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogUmVnaXN0ZXIgTW9kZToJUmVnQ1RMWzFdCVJlZ0NUTFswXQlOb3RlCi0qCQkJKFJlZzAwWzEyXSkJKFJlZzAwWzEwXSkKLSogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSogUmVnX01vZGUwCQkwCQl4CQlSZWcgMCB+MTUoMHgwIH4gMHhmKQotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogUmVnX01vZGUxCQkxCQkwCQlSZWcgMTYgfjMwKDB4MSB+IDB4ZikKLSogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIFJlZ19Nb2RlMgkJMQkJMQkJUmVnIDMxIH4gNDUoMHgxIH4gMHhmKQotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoKLSoJMjAwOC8wOS8wMglNSAlBZGQgOTJTIFJGIGRlZmluaXRpb24KLSovCi1zdGF0aWMJdm9pZAotcGh5X1JGU2VyaWFsV3JpdGUoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCBlbnVtIFJGX1JBRElPX1BBVEggZVJGUGF0aCwKLQkJICB1MzIgT2Zmc2V0LCB1MzIgRGF0YSkKLXsKLQl1MzIgRGF0YUFuZEFkZHIgPSAwOwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0Jc3RydWN0IGJiX3JlZ19kZWZpbmUgKnBQaHlSZWcgPSAmcEhhbERhdGEtPlBIWVJlZ0RlZltlUkZQYXRoXTsKLQl1MzIgTmV3T2Zmc2V0OwotCi0JLyogIDIwMDkvMDYvMTcgTUggV2UgY2FuIG5vdCBleGVjdXRlIElPIGZvciBwb3dlciBzYXZlIG9yCi0JICAgIG90aGVyIGFjY2lkZW50IG1vZGUuICovCi0JLyogaWYgKFJUX0NBTk5PVF9JTyhBZGFwdGVyKSkgKi8KLQkvKiAgKi8KLQkvKglSVFBSSU5UKEZQSFksIFBIWV9SRlcsICgicGh5X1JGU2VyaWFsV3JpdGUgc3RvcFxuIikpOyAqLwotCS8qCXJldHVybjsgKi8KLQkvKiAgKi8KLQotCU9mZnNldCAmPSAweDNmOwotCi0JLyogICovCi0JLyogIFNoYWRvdyBVcGRhdGUgKi8KLQkvKiAgKi8KLQkvKiBQSFlfUkZTaGFkb3dXcml0ZShBZGFwdGVyLCBlUkZQYXRoLCBPZmZzZXQsIERhdGEpOyAqLwotCi0JLyogICovCi0JLyogIFN3aXRjaCBwYWdlIGZvciA4MjU2IFJGIElDICovCi0JLyogICovCi0JTmV3T2Zmc2V0ID0gT2Zmc2V0OwotCi0JLyogICovCi0JLyogIFB1dCB3cml0ZSBhZGRyIGluIFs1OjBdICBhbmQgd3JpdGUgZGF0YSBpbiBbMzE6MTZdICovCi0JLyogICovCi0JLyogRGF0YUFuZEFkZHIgPSAoRGF0YTw8MTYpIHwgKE5ld09mZnNldCYweDNmKTsgKi8KLQkvKiAgVDY1IFJGICovCi0JRGF0YUFuZEFkZHIgPSAoKE5ld09mZnNldDw8MjApIHwgKERhdGEmMHgwMDBmZmZmZikpICYgMHgwZmZmZmZmZjsKLQotCS8qICAqLwotCS8qICBXcml0ZSBPcGVyYXRpb24gKi8KLQkvKiAgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBwUGh5UmVnLT5yZjN3aXJlT2Zmc2V0LCBEYXRhQW5kQWRkcik7Ci19Ci0KLS8qKgotKiBGdW5jdGlvbjoJUEhZX1F1ZXJ5UkZSZWcKLSoKLSogT3ZlclZpZXc6CVF1ZXJ5ICJTcGVjaWZpYyBiaXRzIiB0byBSRiByZWdpc3RlciAocGFnZSA4fikKLSoKLSogSW5wdXQ6Ci0qCXN0cnVjdCBydHdfYWRhcHRlciAqCQlBZGFwdGVyLAotKgllbnVtIFJGX1JBRElPX1BBVEgJZVJGUGF0aCwJUmFkaW8gcGF0aCBvZiBBL0IvQy9ECi0qCXUzMiBSZWdBZGRyLAkJCVRoZSB0YXJnZXQgYWRkcmVzcyB0byBiZSByZWFkCi0qCXUzMkJpdE1hc2sJCQlUaGUgdGFyZ2V0IGJpdCBwb3NpdGlvbiBpbiB0aGUgdGFyZ2V0Ci0qCQkJCQlhZGRyZXNzCXRvIGJlIHJlYWQKLSoKLSogT3V0cHV0OgotKglOb25lCi0qIFJldHVybjoKLSoJdTMyCQkJCVJlYWRiYWNrIHZhbHVlCi0qIE5vdGU6Ci0qCVRoaXMgZnVuY3Rpb24gaXMgZXF1YWwgdG8gIkdldFJGUmVnU2V0dGluZyIgaW4gUEhZIHByb2dyYW1taW5nIGd1aWRlCi0qLwotdTMyCi1QSFlfUXVlcnlSRlJlZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIGVudW0gUkZfUkFESU9fUEFUSCBlUkZQYXRoLAotCSAgICAgICB1MzIgUmVnQWRkciwgdTMyIEJpdE1hc2spCi17Ci0JdTMyIE9yaWdpbmFsX1ZhbHVlLCBSZWFkYmFja19WYWx1ZSwgQml0U2hpZnQ7Ci0JLyogc3RydWN0IGhhbF9kYXRhXzg3MjNhCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsgKi8KLQkvKiB1OAlSRldhaXRDb3VudGVyID0gMDsgKi8KLQkvKiBfaXJxTAlpcnFMOyAqLwotCi0JT3JpZ2luYWxfVmFsdWUgPSBwaHlfUkZTZXJpYWxSZWFkKEFkYXB0ZXIsIGVSRlBhdGgsIFJlZ0FkZHIpOwotCi0JQml0U2hpZnQgPSAgcGh5X0NhbGN1bGF0ZUJpdFNoaWZ0KEJpdE1hc2spOwotCVJlYWRiYWNrX1ZhbHVlID0gKE9yaWdpbmFsX1ZhbHVlICYgQml0TWFzaykgPj4gQml0U2hpZnQ7Ci0KLQlyZXR1cm4gUmVhZGJhY2tfVmFsdWU7Ci19Ci0KLS8qKgotKiBGdW5jdGlvbjoJUEhZX1NldFJGUmVnCi0qCi0qIE92ZXJWaWV3OglXcml0ZSAiU3BlY2lmaWMgYml0cyIgdG8gUkYgcmVnaXN0ZXIgKHBhZ2UgOH4pCi0qCi0qIElucHV0OgotKglzdHJ1Y3QgcnR3X2FkYXB0ZXIgKgkJQWRhcHRlciwKLSoJZW51bSBSRl9SQURJT19QQVRICWVSRlBhdGgsCVJhZGlvIHBhdGggb2YgQS9CL0MvRAotKgl1MzIgUmVnQWRkciwJCQlUaGUgdGFyZ2V0IGFkZHJlc3MgdG8gYmUgbW9kaWZpZWQKLSoJdTMyIEJpdE1hc2sJCQlUaGUgdGFyZ2V0IGJpdCBwb3NpdGlvbiBpbiB0aGUgdGFyZ2V0Ci0qCQkJCQlhZGRyZXNzIHRvIGJlIG1vZGlmaWVkCi0qCXUzMiBEYXRhCQkJVGhlIG5ldyByZWdpc3RlciBEYXRhIGluIHRoZSB0YXJnZXQKLSoJCQkJCWJpdCBwb3NpdGlvbiBvZiB0aGUgdGFyZ2V0IGFkZHJlc3MKLSoKLSogT3V0cHV0OgotKglOb25lCi0qIFJldHVybjoKLSoJTm9uZQotKiBOb3RlOglUaGlzIGZ1bmN0aW9uIGlzIGVxdWFsIHRvICJQdXRSRlJlZ1NldHRpbmciIGluIFBIWSBwcm9ncmFtbWluZyBndWlkZQotKi8KLXZvaWQKLVBIWV9TZXRSRlJlZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIGVudW0gUkZfUkFESU9fUEFUSCBlUkZQYXRoLAotCSAgICAgdTMyIFJlZ0FkZHIsIHUzMiBCaXRNYXNrLCB1MzIgRGF0YSkKLXsKLQkvKiBzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOyAqLwotCS8qIHU4IFJGV2FpdENvdW50ZXIJPSAwOyAqLwotCXUzMiBPcmlnaW5hbF9WYWx1ZSwgQml0U2hpZnQ7Ci0KLQkvKiAgUkYgZGF0YSBpcyAxMiBiaXRzIG9ubHkgKi8KLQlpZiAoQml0TWFzayAhPSBiUkZSZWdPZmZzZXRNYXNrKSB7Ci0JCU9yaWdpbmFsX1ZhbHVlID0gcGh5X1JGU2VyaWFsUmVhZChBZGFwdGVyLCBlUkZQYXRoLCBSZWdBZGRyKTsKLQkJQml0U2hpZnQgPSAgcGh5X0NhbGN1bGF0ZUJpdFNoaWZ0KEJpdE1hc2spOwotCQlEYXRhID0gKE9yaWdpbmFsX1ZhbHVlICYgKH5CaXRNYXNrKSkgfCAoRGF0YSA8PCBCaXRTaGlmdCk7Ci0JfQotCi0JcGh5X1JGU2VyaWFsV3JpdGUoQWRhcHRlciwgZVJGUGF0aCwgUmVnQWRkciwgRGF0YSk7Ci19Ci0KLS8qICAzLiBJbml0aWFsIE1BQy9CQi9SRiBjb25maWcgYnkgcmVhZGluZyBNQUMvQkIvUkYgdHh0LiAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBGdW5jdGlvbjogICAgUEhZX01BQ0NvbmZpZzg3MjNBCi0gKgotICogT3ZlcnZpZXc6CUNvbmRpZyBNQUMgYnkgaGVhZGVyIGZpbGUgb3IgcGFyYW1ldGVyIGZpbGUuCi0gKgotICogSW5wdXQ6ICAgICAgIE5PTkUKLSAqCi0gKiBPdXRwdXQ6ICAgICAgTk9ORQotICoKLSAqIFJldHVybjogICAgICBOT05FCi0gKgotICogUmV2aXNlZCBIaXN0b3J5OgotICogIFdoZW4JCVdobwkJUmVtYXJrCi0gKiAgMDgvMTIvMjAwOAlNSEMJCUNyZWF0ZSBWZXJzaW9uIDAuCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IFBIWV9NQUNDb25maWc4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQotCS8qICAqLwotCS8qICBDb25maWcgTUFDICovCi0JLyogICovCi0JT0RNX1JlYWRBbmRDb25maWdfTUFDX1JFR184NzIzQSgmcEhhbERhdGEtPm9kbXByaXYpOwotCi0JLyogIDIwMTAuMDcuMTMgQU1QRFUgYWdncmVnYXRpb24gbnVtYmVyIDkgKi8KLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19NQVhfQUdHUl9OVU0sIDB4MEEpOwotCWlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSBSRl8yVDJSICYmCi0JICAgIEJPQVJEX1VTQl9ET05HTEUgPT0gcEhhbERhdGEtPkJvYXJkVHlwZSkKLQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweDQwLCAweDA0KTsKLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotLyoqCi0qIEZ1bmN0aW9uOglwaHlfSW5pdEJCUkZSZWdpc3RlckRlZmluaXRpb24KLSoKLSogT3ZlclZpZXc6CUluaXRpYWxpemUgUmVnaXN0ZXIgZGVmaW5pdGlvbiBvZmZzZXQgZm9yIFJhZGlvIFBhdGggQS9CL0MvRAotKgotKiBJbnB1dDoKLSoJCQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKgkJQWRhcHRlciwKLSoKLSogT3V0cHV0OglOb25lCi0qIFJldHVybjoJCU5vbmUKLSogTm90ZToKLSoJVGhlIGluaXRpYWxpemF0aW9uIHZhbHVlIGlzIGNvbnN0YW50IGFuZCBpdCBzaG91bGQgbmV2ZXIgYmUgY2hhbmdlcwotKi8KLXN0YXRpYwl2b2lkCi1waHlfSW5pdEJCUkZSZWdpc3RlckRlZmluaXRpb24oc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0KLQkvKiAgUkYgSW50ZXJmYWNlIFNvd3J0d2FyZSBDb250cm9sICovCi0JIC8qICAxNiBMU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NzAgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZpbnRmcyA9IHJGUEdBMF9YQUJfUkZJbnRlcmZhY2VTVzsKLQkgLyogIDE2IE1TQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDg3MCAoMTYtYml0IGZvciAweDg3MikgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZpbnRmcyA9IHJGUEdBMF9YQUJfUkZJbnRlcmZhY2VTVzsKLQotCS8qICBSRiBJbnRlcmZhY2UgUmVhZGJhY2sgVmFsdWUgKi8KLQkvKiAgMTYgTFNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4OEUwICovCi0JcEhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmaW50ZmkgPSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlUkI7Ci0JLyogIDE2IE1TQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDhFMCAoMTYtYml0IGZvciAweDhFMikgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZpbnRmaSA9IHJGUEdBMF9YQUJfUkZJbnRlcmZhY2VSQjsKLQotCS8qICBSRiBJbnRlcmZhY2UgT3V0cHV0IChhbmQgRW5hYmxlKSAqLwotCS8qICAxNiBMU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NjAgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZpbnRmbyA9IHJGUEdBMF9YQV9SRkludGVyZmFjZU9FOwotCSAvKiAgMTYgTFNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4ODY0ICovCi0JcEhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0JdLnJmaW50Zm8gPSByRlBHQTBfWEJfUkZJbnRlcmZhY2VPRTsKLQotCS8qICBSRiBJbnRlcmZhY2UgKE91dHB1dCBhbmQpICBFbmFibGUgKi8KLQkgLyogIDE2IE1TQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDg2MCAoMTYtYml0IGZvciAweDg2MikgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZpbnRmZSA9IHJGUEdBMF9YQV9SRkludGVyZmFjZU9FOwotCS8qICAxNiBNU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NjQgKDE2LWJpdCBmb3IgMHg4NjYpICovCi0JcEhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0JdLnJmaW50ZmUgPSByRlBHQTBfWEJfUkZJbnRlcmZhY2VPRTsKLQotCS8qIEFkZHIgb2YgTFNTSS4gV2lydGUgUkYgcmVnaXN0ZXIgYnkgZHJpdmVyICovCi0JcEhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmM3dpcmVPZmZzZXQgPSByRlBHQTBfWEFfTFNTSVBhcmFtZXRlcjsKLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmYzd2lyZU9mZnNldCA9IHJGUEdBMF9YQl9MU1NJUGFyYW1ldGVyOwotCi0JLyogIFJGIHBhcmFtZXRlciAqLwotCS8qIEJCIEJhbmQgU2VsZWN0ICovCi0JcEhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmTFNTSV9TZWxlY3QgPSByRlBHQTBfWEFCX1JGUGFyYW1ldGVyOwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZkxTU0lfU2VsZWN0ID0gckZQR0EwX1hBQl9SRlBhcmFtZXRlcjsKLQotCS8qICBUeCBBR0MgR2FpbiBTdGFnZSAoc2FtZSBmb3IgYWxsIHBhdGguIFNob3VsZCB3ZSByZW1vdmUgdGhpcz8pICovCi0JcEhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmVHhHYWluU3RhZ2UgPSByRlBHQTBfVHhHYWluU3RhZ2U7Ci0JcEhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0JdLnJmVHhHYWluU3RhZ2UgPSByRlBHQTBfVHhHYWluU3RhZ2U7Ci0KLQkvKiAgVHJhbmNlaXZlciBBfkQgSFNTSSBQYXJhbWV0ZXItMSAqLwotCS8qIHdpcmUgY29udHJvbCBwYXJhbWV0ZXIxICovCi0JcEhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmSFNTSVBhcmExID0gckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIxOwotCS8qIHdpcmUgY29udHJvbCBwYXJhbWV0ZXIxICovCi0JcEhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0JdLnJmSFNTSVBhcmExID0gckZQR0EwX1hCX0hTU0lQYXJhbWV0ZXIxOwotCi0JLyogIFRyYW5jZWl2ZXIgQX5EIEhTU0kgUGFyYW1ldGVyLTIgKi8KLQkvKiB3aXJlIGNvbnRyb2wgcGFyYW1ldGVyMiAqLwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9BXS5yZkhTU0lQYXJhMiA9IHJGUEdBMF9YQV9IU1NJUGFyYW1ldGVyMjsKLQkvKiB3aXJlIGNvbnRyb2wgcGFyYW1ldGVyMiAqLwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZkhTU0lQYXJhMiA9IHJGUEdBMF9YQl9IU1NJUGFyYW1ldGVyMjsKLQotCS8qICBSRiBzd2l0Y2ggQ29udHJvbCAqLwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9BXS5yZlN3aXRjaENvbnRyb2wgPQotCQlyRlBHQTBfWEFCX1N3aXRjaENvbnRyb2w7IC8qIFRSL0FudCBzd2l0Y2ggY29udHJvbCAqLwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZlN3aXRjaENvbnRyb2wgPQotCQlyRlBHQTBfWEFCX1N3aXRjaENvbnRyb2w7Ci0KLQkvKiAgQUdDIGNvbnRyb2wgMSAqLwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9BXS5yZkFHQ0NvbnRyb2wxID0gck9GRE0wX1hBQUdDQ29yZTE7Ci0JcEhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0JdLnJmQUdDQ29udHJvbDEgPSByT0ZETTBfWEJBR0NDb3JlMTsKLQotCS8qICBBR0MgY29udHJvbCAyICovCi0JcEhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmQUdDQ29udHJvbDIgPSByT0ZETTBfWEFBR0NDb3JlMjsKLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZBR0NDb250cm9sMiA9IHJPRkRNMF9YQkFHQ0NvcmUyOwotCi0JLyogIFJYIEFGRSBjb250cm9sIDEgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZSeElRSW1iYWxhbmNlID0gck9GRE0wX1hBUnhJUUltYmFsYW5jZTsKLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZSeElRSW1iYWxhbmNlID0gck9GRE0wX1hCUnhJUUltYmFsYW5jZTsKLQotCS8qICBSWCBBRkUgY29udHJvbCAxICovCi0JcEhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmUnhBRkUgPSByT0ZETTBfWEFSeEFGRTsKLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZSeEFGRSA9IHJPRkRNMF9YQlJ4QUZFOwotCi0JLyogIFR4IEFGRSBjb250cm9sIDEgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZUeElRSW1iYWxhbmNlID0gck9GRE0wX1hBVHhJUUltYmFsYW5jZTsKLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZUeElRSW1iYWxhbmNlID0gck9GRE0wX1hCVHhJUUltYmFsYW5jZTsKLQotCS8qICBUeCBBRkUgY29udHJvbCAyICovCi0JcEhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmVHhBRkUgPSByT0ZETTBfWEFUeEFGRTsKLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZUeEFGRSA9IHJPRkRNMF9YQlR4QUZFOwotCi0JLyogIFRyYW5jZWl2ZXIgTFNTSSBSZWFkYmFjayBTSSBtb2RlICovCi0JcEhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmTFNTSVJlYWRCYWNrID0gckZQR0EwX1hBX0xTU0lSZWFkQmFjazsKLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZMU1NJUmVhZEJhY2sgPSByRlBHQTBfWEJfTFNTSVJlYWRCYWNrOwotCi0JLyogIFRyYW5jZWl2ZXIgTFNTSSBSZWFkYmFjayBQSSBtb2RlICovCi0JcEhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmTFNTSVJlYWRCYWNrUGkgPQotCQlUcmFuc2NlaXZlckFfSFNQSV9SZWFkYmFjazsKLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZMU1NJUmVhZEJhY2tQaSA9Ci0JCVRyYW5zY2VpdmVyQl9IU1BJX1JlYWRiYWNrOwotfQotCi0vKiAgVGhlIGZvbGxvd2luZyBpcyBmb3IgSGlnaCBQb3dlciBQQSAqLwotc3RhdGljIHZvaWQKLXN0b3JlUHdySW5kZXhEaWZmUmF0ZU9mZnNldChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHUzMiBSZWdBZGRyLAotCQkJICAgIHUzMiBCaXRNYXNrLCB1MzIgRGF0YSkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCi0JaWYgKFJlZ0FkZHIgPT0gclR4QUdDX0FfUmF0ZTE4XzA2KSB7Ci0JCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzBdID0gRGF0YTsKLQl9Ci0JaWYgKFJlZ0FkZHIgPT0gclR4QUdDX0FfUmF0ZTU0XzI0KSB7Ci0JCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzFdID0gRGF0YTsKLQl9Ci0JaWYgKFJlZ0FkZHIgPT0gclR4QUdDX0FfQ0NLMV9NY3MzMikgewotCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVs2XSA9IERhdGE7Ci0JfQotCWlmIChSZWdBZGRyID09IHJUeEFHQ19CX0NDSzExX0FfQ0NLMl8xMSAmJiBCaXRNYXNrID09IDB4ZmZmZmZmMDApIHsKLQkJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3BIYWxEYXRhLT5wd3JHcm91cENudF1bN10gPSBEYXRhOwotCX0KLQlpZiAoUmVnQWRkciA9PSByVHhBR0NfQV9NY3MwM19NY3MwMCkgewotCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVsyXSA9IERhdGE7Ci0JfQotCWlmIChSZWdBZGRyID09IHJUeEFHQ19BX01jczA3X01jczA0KSB7Ci0JCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzNdID0gRGF0YTsKLQl9Ci0JaWYgKFJlZ0FkZHIgPT0gclR4QUdDX0FfTWNzMTFfTWNzMDgpIHsKLQkJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3BIYWxEYXRhLT5wd3JHcm91cENudF1bNF0gPSBEYXRhOwotCX0KLQlpZiAoUmVnQWRkciA9PSByVHhBR0NfQV9NY3MxNV9NY3MxMikgewotCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVs1XSA9IERhdGE7Ci0JfQotCWlmIChSZWdBZGRyID09IHJUeEFHQ19CX1JhdGUxOF8wNikgewotCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVs4XSA9IERhdGE7Ci0JfQotCWlmIChSZWdBZGRyID09IHJUeEFHQ19CX1JhdGU1NF8yNCkgewotCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVs5XSA9IERhdGE7Ci0JfQotCWlmIChSZWdBZGRyID09IHJUeEFHQ19CX0NDSzFfNTVfTWNzMzIpIHsKLQkJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3BIYWxEYXRhLT5wd3JHcm91cENudF1bMTRdID0gRGF0YTsKLQl9Ci0JaWYgKFJlZ0FkZHIgPT0gclR4QUdDX0JfQ0NLMTFfQV9DQ0syXzExICYmIEJpdE1hc2sgPT0gMHgwMDAwMDBmZikgewotCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVsxNV0gPSBEYXRhOwotCX0KLQlpZiAoUmVnQWRkciA9PSByVHhBR0NfQl9NY3MwM19NY3MwMCkgewotCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVsxMF0gPSBEYXRhOwotCX0KLQlpZiAoUmVnQWRkciA9PSByVHhBR0NfQl9NY3MwN19NY3MwNCkgewotCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVsxMV0gPSBEYXRhOwotCX0KLQlpZiAoUmVnQWRkciA9PSByVHhBR0NfQl9NY3MxMV9NY3MwOCkgewotCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVsxMl0gPSBEYXRhOwotCX0KLQlpZiAoUmVnQWRkciA9PSByVHhBR0NfQl9NY3MxNV9NY3MxMikgewotCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVsxM10gPSBEYXRhOwotCQlwSGFsRGF0YS0+cHdyR3JvdXBDbnQrKzsKLQl9Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEZ1bmN0aW9uOglwaHlfQ29uZmlnQkJXaXRoUGdIZWFkZXJGaWxlCi0gKgotICogT3ZlcnZpZXc6CUNvbmZpZyBQSFlfUkVHX1BHIGFycmF5Ci0gKgotICogSW5wdXQ6ICAgICAgIE5PTkUKLSAqCi0gKiBPdXRwdXQ6ICAgICAgTk9ORQotICoKLSAqIFJldHVybjogICAgICBOT05FCi0gKgotICogUmV2aXNlZCBIaXN0b3J5OgotICogV2hlbgkJV2hvCVJlbWFyawotICogMTEvMDYvMjAwOAlNSEMJQWRkIGxhdGVyISEhISEhLi4gUGxlYXNlIG1vZGlmeSBmb3IgbmV3IGZpbGVzISEhIQotICogMTEvMTAvMjAwOAl0eW5saQlNb2RpZnkgdG8gbWV3IGZpbGVzLgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljCWludAotcGh5X0NvbmZpZ0JCV2l0aFBnSGVhZGVyRmlsZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0JaW50IGk7Ci0JdTMyICpSdGw4MTlYUEhZX1JFR0FycmF5X1RhYmxlX1BHOwotCXUxNiBQSFlfUkVHQXJyYXlQR0xlbjsKLQotCVBIWV9SRUdBcnJheVBHTGVuID0gUnRsODcyM19QSFlfUkVHX0FycmF5X1BHTGVuZ3RoOwotCVJ0bDgxOVhQSFlfUkVHQXJyYXlfVGFibGVfUEcgPSAodTMyICopUnRsODcyM19QSFlfUkVHX0FycmF5X1BHOwotCi0JZm9yIChpID0gMDsgaSA8IFBIWV9SRUdBcnJheVBHTGVuOyBpID0gaSArIDMpIHsKLQkJc3RvcmVQd3JJbmRleERpZmZSYXRlT2Zmc2V0KEFkYXB0ZXIsCi0JCQkJCSAgICBSdGw4MTlYUEhZX1JFR0FycmF5X1RhYmxlX1BHW2ldLAotCQkJCQkgICAgUnRsODE5WFBIWV9SRUdBcnJheV9UYWJsZV9QR1tpKzFdLAotCQkJCQkgICAgUnRsODE5WFBIWV9SRUdBcnJheV9UYWJsZV9QR1tpKzJdKTsKLQl9Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyB2b2lkCi1waHlfQkI4MTkyQ19Db25maWdfMVQoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCS8qIGZvciBwYXRoIC0gQiAqLwotCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByRlBHQTBfVHhJbmZvLCAweDMsIDB4Mik7Ci0JUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMV9UeEluZm8sIDB4MzAwMDMzLCAweDIwMDAyMik7Ci0KLQkvKiAgMjAxMDA1MTkgSm9zZXBoOiBBZGQgZm9yIDFUMlIgY29uZmlnLiBTdWdnZXN0ZWQgYnkgS2V2aW4sCi0JICAgIEplbnl1IGFuZCBZdW5hbi4gKi8KLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgckNDSzBfQUZFU2V0dGluZywgYk1hc2tCeXRlMywgMHg0NSk7Ci0JUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJPRkRNMF9UUnhQYXRoRW5hYmxlLCBiTWFza0J5dGUwLCAweDIzKTsKLQkvKiAgQiBwYXRoIGZpcnN0IEFHQyAqLwotCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByT0ZETTBfQUdDUGFyYW1ldGVyMSwgMHgzMCwgMHgxKTsKLQotCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCAweGU3NCwgMHgwYzAwMDAwMCwgMHgyKTsKLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgMHhlNzgsIDB4MGMwMDAwMDAsIDB4Mik7Ci0JUEhZX1NldEJCUmVnKEFkYXB0ZXIsIDB4ZTdjLCAweDBjMDAwMDAwLCAweDIpOwotCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCAweGU4MCwgMHgwYzAwMDAwMCwgMHgyKTsKLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgMHhlODgsIDB4MGMwMDAwMDAsIDB4Mik7Ci19Ci0KLXN0YXRpYyBpbnQKLXBoeV9CQjg3MjNhX0NvbmZpZ19QYXJhRmlsZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0Jc3RydWN0IGVlcHJvbV9wcml2ICpwRUVQUk9NID0gR0VUX0VFUFJPTV9FRlVTRV9QUklWKEFkYXB0ZXIpOwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0JaW50IHJ0U3RhdHVzID0gX1NVQ0NFU1M7Ci0KLQkvKiAgKi8KLQkvKiAgMS4gUmVhZCBQSFlfUkVHLlRYVCBCQiBJTklUISEgKi8KLQkvKiAgV2Ugd2lsbCBzZXBhcmF0ZSBhcyA4OEMgLyA5MkMgYWNjb3JkaW5nIHRvIGNoaXAgdmVyc2lvbiAqLwotCS8qICAqLwotCU9ETV9SZWFkQW5kQ29uZmlnX1BIWV9SRUdfMVRfODcyM0EoJnBIYWxEYXRhLT5vZG1wcml2KTsKLQotCS8qICAqLwotCS8qICAyMDEwMDMxOCBKb3NlcGg6IENvbmZpZyAyVDJSIHRvIDFUMlIgaWYgbmVjZXNzYXJ5LiAqLwotCS8qICAqLwotCWlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSBSRl8xVDJSKSB7Ci0JCXBoeV9CQjgxOTJDX0NvbmZpZ18xVChBZGFwdGVyKTsKLQkJREJHXzg3MjNBKCJwaHlfQkI4NzIzYV9Db25maWdfUGFyYUZpbGUoKTpDb25maWcgdG8gMVQhIVxuIik7Ci0JfQotCi0JLyogICovCi0JLyogIDIuIElmIEVFUFJPTSBvciBFRlVTRSBhdXRvbG9hZCBPSywgV2UgbXVzdCBjb25maWcgYnkKLQkgICAgUEhZX1JFR19QRy50eHQgKi8KLQkvKiAgKi8KLQlpZiAocEVFUFJPTS0+YmF1dG9sb2FkX2ZhaWxfZmxhZyA9PSBmYWxzZSkgewotCQlwSGFsRGF0YS0+cHdyR3JvdXBDbnQgPSAwOwotCi0JCXJ0U3RhdHVzID0gcGh5X0NvbmZpZ0JCV2l0aFBnSGVhZGVyRmlsZShBZGFwdGVyKTsKLQl9Ci0KLQlpZiAocnRTdGF0dXMgIT0gX1NVQ0NFU1MpCi0JCWdvdG8gcGh5X0JCODE5MF9Db25maWdfUGFyYUZpbGVfRmFpbDsKLQotCS8qICAqLwotCS8qICAzLiBCQiBBR0MgdGFibGUgSW5pdGlhbGl6YXRpb24gKi8KLQkvKiAgKi8KLQlPRE1fUmVhZEFuZENvbmZpZ19BR0NfVEFCXzFUXzg3MjNBKCZwSGFsRGF0YS0+b2RtcHJpdik7Ci0KLXBoeV9CQjgxOTBfQ29uZmlnX1BhcmFGaWxlX0ZhaWw6Ci0KLQlyZXR1cm4gcnRTdGF0dXM7Ci19Ci0KLWludAotUEhZX0JCQ29uZmlnODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCWludCBydFN0YXR1cyA9IF9TVUNDRVNTOwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYQkqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0JdTggVG1wVTFCID0gMDsKLQl1OCBDcnlzdGFsQ2FwOwotCi0JcGh5X0luaXRCQlJGUmVnaXN0ZXJEZWZpbml0aW9uKEFkYXB0ZXIpOwotCi0JLyogIFN1Z2dlc3RlZCBieSBTY290dC4gdHlubGlfdGVzdC4gMjAxMC4xMi4zMC4gKi8KLQkvKiAxLiAweDI4WzFdID0gMSAqLwotCVRtcFUxQiA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBSRUdfQUZFX1BMTF9DVFJMKTsKLQl1ZGVsYXkoMik7Ci0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSRUdfQUZFX1BMTF9DVFJMLCBUbXBVMUIgfCBCSVQoMSkpOwotCXVkZWxheSgyKTsKLQotCS8qIDIuIDB4MjlbNzowXSA9IDB4RkYgKi8KLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19BRkVfUExMX0NUUkwrMSwgMHhmZik7Ci0JdWRlbGF5KDIpOwotCi0JLyogMy4gMHgwMlsxOjBdID0gMmInMTEgKi8KLQlUbXBVMUIgPSBydGw4NzIzYXVfcmVhZDgoQWRhcHRlciwgUkVHX1NZU19GVU5DX0VOKTsKLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19TWVNfRlVOQ19FTiwKLQkJCSAoVG1wVTFCIHwgRkVOX0JCX0dMQl9SU1RuIHwgRkVOX0JCUlNUQikpOwotCi0JLyogNC4gMHgyNVs2XSA9IDAgKi8KLQlUbXBVMUIgPSBydGw4NzIzYXVfcmVhZDgoQWRhcHRlciwgUkVHX0FGRV9YVEFMX0NUUkwgKyAxKTsKLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19BRkVfWFRBTF9DVFJMKzEsIFRtcFUxQiAmIH5CSVQoNikpOwotCi0JLyogNS4gMHgyNFsyMF0gPSAwCUFkdmlzZWQgYnkgU0QzIEFsZXggV2FuZy4gMjAxMS4wMi4wOS4gKi8KLQlUbXBVMUIgPSBydGw4NzIzYXVfcmVhZDgoQWRhcHRlciwgUkVHX0FGRV9YVEFMX0NUUkwrMik7Ci0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSRUdfQUZFX1hUQUxfQ1RSTCsyLCBUbXBVMUIgJiB+QklUKDQpKTsKLQotCS8qIDYuIDB4MWZbNzowXSA9IDB4MDcgKi8KLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19SRl9DVFJMLCAweDA3KTsKLQotCS8qICAqLwotCS8qICBDb25maWcgQkIgYW5kIEFHQyAqLwotCS8qICAqLwotCXJ0U3RhdHVzID0gcGh5X0JCODcyM2FfQ29uZmlnX1BhcmFGaWxlKEFkYXB0ZXIpOwotCi0vKiBvbmx5IGZvciBCLWN1dCAqLwotCWlmIChwSGFsRGF0YS0+RUVQUk9NVmVyc2lvbiA+PSAweDAxKSB7Ci0JCUNyeXN0YWxDYXAgPSBwSGFsRGF0YS0+Q3J5c3RhbENhcCAmIDB4M0Y7Ci0JCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCBSRUdfTUFDX1BIWV9DVFJMLCAweEZGRjAwMCwKLQkJCSAgICAgKENyeXN0YWxDYXAgfCAoQ3J5c3RhbENhcCA8PCA2KSkpOwotCX0KLQotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19MRE9BMTVfQ1RSTCwgMHgwMTU3MjUwNSk7Ci0JcmV0dXJuIHJ0U3RhdHVzOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBGdW5jdGlvbjogICAgU2V0VHhQb3dlckxldmVsODcyM0EoKQotICoKLSAqIE92ZXJ2aWV3OiAgICBUaGlzIGZ1bmN0aW9uIGlzIGV4cG9ydCB0byAiSGFsQ29tbW9uIiBtb3VkdWxlCi0gKgkJCVdlIG11c3QgY29uc2lkZXIgUkYgcGF0aCBsYXRlciEhISEhISEKLSAqCi0gKiBJbnB1dDogICAgICAgc3RydWN0IHJ0d19hZGFwdGVyICoJCUFkYXB0ZXIKLSAqCQkJdTgJCWNoYW5uZWwKLSAqCi0gKiBPdXRwdXQ6ICAgICAgTk9ORQotICoKLSAqIFJldHVybjogICAgICBOT05FCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBQSFlfU2V0VHhQb3dlckxldmVsODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1OCBjaGFubmVsKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0JdTggY2NrcHdyWzJdLCBvZmRtcHdyWzJdOwkvKiAgWzBdOlJGLUEsIFsxXTpSRi1CICovCi0JaW50IGkgPSBjaGFubmVsIC0gMTsKLQotCWlmIChwSGFsRGF0YS0+YlRYUG93ZXJEYXRhUmVhZEZyb21FRVBPUk0gPT0gZmFsc2UpCi0JCXJldHVybjsKLQotCS8qICAxLiBDQ0sgKi8KLQljY2twd3JbUkZfUEFUSF9BXSA9IHBIYWxEYXRhLT5UeFB3ckxldmVsQ2NrW1JGX1BBVEhfQV1baV07Ci0JY2NrcHdyW1JGX1BBVEhfQl0gPSBwSGFsRGF0YS0+VHhQd3JMZXZlbENja1tSRl9QQVRIX0JdW2ldOwotCi0JLyogIDIuIE9GRE0gZm9yIDFTIG9yIDJTICovCi0JaWYgKEdFVF9SRl9UWVBFKEFkYXB0ZXIpID09IFJGXzFUMlIgfHwKLQkgICAgR0VUX1JGX1RZUEUoQWRhcHRlcikgPT0gUkZfMVQxUikgewotCQkvKiAgUmVhZCBIVCA0MCBPRkRNIFRYIHBvd2VyICovCi0JCW9mZG1wd3JbUkZfUEFUSF9BXSA9IHBIYWxEYXRhLT5UeFB3ckxldmVsSFQ0MF8xU1tSRl9QQVRIX0FdW2ldOwotCQlvZmRtcHdyW1JGX1BBVEhfQl0gPSBwSGFsRGF0YS0+VHhQd3JMZXZlbEhUNDBfMVNbUkZfUEFUSF9CXVtpXTsKLQl9IGVsc2UgaWYgKEdFVF9SRl9UWVBFKEFkYXB0ZXIpID09IFJGXzJUMlIpIHsKLQkJLyogIFJlYWQgSFQgNDAgT0ZETSBUWCBwb3dlciAqLwotCQlvZmRtcHdyW1JGX1BBVEhfQV0gPSBwSGFsRGF0YS0+VHhQd3JMZXZlbEhUNDBfMlNbUkZfUEFUSF9BXVtpXTsKLQkJb2ZkbXB3cltSRl9QQVRIX0JdID0gcEhhbERhdGEtPlR4UHdyTGV2ZWxIVDQwXzJTW1JGX1BBVEhfQl1baV07Ci0JfQotCi0JcnRsODIzYV9waHlfcmY2MDUyc2V0Y2NrdHhwb3dlcihBZGFwdGVyLCAmY2NrcHdyWzBdKTsKLQlydGw4NzIzYV9QSFlfUkY2MDUyU2V0T0ZETVR4UG93ZXIoQWRhcHRlciwgJm9mZG1wd3JbMF0sIGNoYW5uZWwpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBGdW5jdGlvbjogICAgUEhZX1NldEJXTW9kZTIzYUNhbGxiYWNrODE5MkMoKQotICoKLSAqIE92ZXJ2aWV3OiAgICBUaW1lciBjYWxsYmFjayBmdW5jdGlvbiBmb3IgU2V0U2V0QldNb2RlMjNhCi0gKgotICogSW5wdXQ6CQlQUlRfVElNRVIJCXBUaW1lcgotICoKLSAqIE91dHB1dDogICAgICBOT05FCi0gKgotICogUmV0dXJuOiAgICAgIE5PTkUKLSAqCi0gKiBOb3RlOgotICoJKDEpIFdlIGRvIG5vdCB0YWtlIGogbW9kZSBpbnRvIGNvbnNpZGVyYXRpb24gbm93Ci0gKgkoMikgV2lsbCB0d28gd29ya2l0ZW0gb2YgInN3aXRjaCBjaGFubmVsIiBhbmQKLSAqCSAgICAic3dpdGNoIGNoYW5uZWwgYmFuZHdpZHRoIiBydW4gY29uY3VycmVudGx5PwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQKLV9QSFlfU2V0QldNb2RlMjNhOTJDKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXU4IHJlZ0J3T3BNb2RlOwotCXU4IHJlZ1JSU1JfUlNDOwotCi0JaWYgKEFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkKQotCQlyZXR1cm47Ci0KLQkvKiAzICovCi0JLyogMzwxPlNldCBNQUMgcmVnaXN0ZXIgKi8KLQkvKiAzICovCi0KLQlyZWdCd09wTW9kZSA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBSRUdfQldPUE1PREUpOwotCXJlZ1JSU1JfUlNDID0gcnRsODcyM2F1X3JlYWQ4KEFkYXB0ZXIsIFJFR19SUlNSKzIpOwotCi0Jc3dpdGNoIChwSGFsRGF0YS0+Q3VycmVudENoYW5uZWxCVykgewotCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF8yMDoKLQkJcmVnQndPcE1vZGUgfD0gQldfT1BNT0RFXzIwTUhaOwotCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19CV09QTU9ERSwgcmVnQndPcE1vZGUpOwotCQlicmVhazsKLQljYXNlIEhUX0NIQU5ORUxfV0lEVEhfNDA6Ci0JCXJlZ0J3T3BNb2RlICY9IH5CV19PUE1PREVfMjBNSFo7Ci0JCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX0JXT1BNT0RFLCByZWdCd09wTW9kZSk7Ci0JCXJlZ1JSU1JfUlNDID0gKHJlZ1JSU1JfUlNDICYgMHg5MCkgfAotCQkJKHBIYWxEYXRhLT5uQ3VyNDBNaHpQcmltZVNDIDw8IDUpOwotCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19SUlNSKzIsIHJlZ1JSU1JfUlNDKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQkvKiAzICovCi0JLyogMzwyPlNldCBQSFkgcmVsYXRlZCByZWdpc3RlciAqLwotCS8qIDMgKi8KLQlzd2l0Y2ggKHBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbEJXKSB7Ci0JCS8qIDIwIE1IeiBjaGFubmVsKi8KLQljYXNlIEhUX0NIQU5ORUxfV0lEVEhfMjA6Ci0JCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByRlBHQTBfUkZNT0QsIGJSRk1PRCwgMHgwKTsKLQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMV9SRk1PRCwgYlJGTU9ELCAweDApOwotCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjIsIEJJVCgxMCksIDEpOwotCi0JCWJyZWFrOwotCi0JCS8qIDQwIE1IeiBjaGFubmVsKi8KLQljYXNlIEhUX0NIQU5ORUxfV0lEVEhfNDA6Ci0JCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByRlBHQTBfUkZNT0QsIGJSRk1PRCwgMHgxKTsKLQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMV9SRk1PRCwgYlJGTU9ELCAweDEpOwotCi0JCS8qICBTZXQgQ29udHJvbCBjaGFubmVsIHRvIHVwcGVyIG9yIGxvd2VyLiBUaGVzZSBzZXR0aW5ncwotCQkgICAgYXJlIHJlcXVpcmVkIG9ubHkgZm9yIDQwTUh6ICovCi0JCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByQ0NLMF9TeXN0ZW0sIGJDQ0tTaWRlQmFuZCwKLQkJCSAgICAgKHBIYWxEYXRhLT5uQ3VyNDBNaHpQcmltZVNDID4+IDEpKTsKLQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJPRkRNMV9MU1RGLCAweEMwMCwKLQkJCSAgICAgcEhhbERhdGEtPm5DdXI0ME1oelByaW1lU0MpOwotCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjIsIEJJVCgxMCksIDApOwotCi0JCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCAweDgxOCwgQklUKDI2KSB8IEJJVCgyNyksCi0JCQkgICAgIChwSGFsRGF0YS0+bkN1cjQwTWh6UHJpbWVTQyA9PQotCQkJICAgICAgSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0xPV0VSKSA/IDI6MSk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCS8qIFNraXAgb3ZlciBzZXR0aW5nIG9mIEotbW9kZSBpbiBCQiByZWdpc3RlciBoZXJlLiBEZWZhdWx0IHZhbHVlCi0JICAgaXMgIk5vbmUgSiBtb2RlIi4gRW1pbHkgMjAwNzAzMTUgKi8KLQotCS8qICBBZGRlZCBpdCBmb3IgMjAvNDAgbWh6IHN3aXRjaCB0aW1lIGV2YWx1YXRpb24gYnkgZ3VhbmdhbiAwNzA1MzEgKi8KLQkvKiBOb3dMID0gUGxhdGZvcm1FRklPUmVhZDRCeXRlKEFkYXB0ZXIsIFRTRlIpOyAqLwotCS8qIE5vd0ggPSBQbGF0Zm9ybUVGSU9SZWFkNEJ5dGUoQWRhcHRlciwgVFNGUis0KTsgKi8KLQkvKiBFbmRUaW1lID0gKCh1NjQpTm93SCA8PCAzMikgKyBOb3dMOyAqLwotCi0JcnRsODcyM2FfcGh5X3JmNjA1MnNldF9idyhBZGFwdGVyLCBwSGFsRGF0YS0+Q3VycmVudENoYW5uZWxCVyk7Ci19Ci0KLSAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBGdW5jdGlvbjogICBTZXRCV01vZGUyM2E4MTkwUGNpKCkKLSAqCi0gKiBPdmVydmlldzogIFRoaXMgZnVuY3Rpb24gaXMgZXhwb3J0IHRvICJIYWxDb21tb24iIG1vdWR1bGUKLSAqCi0gKiBJbnB1dDoJCXN0cnVjdCBydHdfYWRhcHRlciAqCQkJQWRhcHRlcgotICoJCQllbnVtIGh0X2NoYW5uZWxfd2lkdGgJQmFuZHdpZHRoCTIwTSBvciA0ME0KLSAqCi0gKiBPdXRwdXQ6ICAgICAgTk9ORQotICoKLSAqIFJldHVybjogICAgICBOT05FCi0gKgotICogTm90ZToJCVdlIGRvIG5vdCB0YWtlIGogbW9kZSBpbnRvIGNvbnNpZGVyYXRpb24gbm93Ci0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkCi1QSFlfU2V0QldNb2RlMjNhODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLAotCQkgICBlbnVtIGh0X2NoYW5uZWxfd2lkdGggQmFuZHdpZHRoLCB1bnNpZ25lZCBjaGFyIE9mZnNldCkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCWVudW0gaHRfY2hhbm5lbF93aWR0aCB0bXBCVyA9IHBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbEJXOwotCi0JcEhhbERhdGEtPkN1cnJlbnRDaGFubmVsQlcgPSBCYW5kd2lkdGg7Ci0KLQlwSGFsRGF0YS0+bkN1cjQwTWh6UHJpbWVTQyA9IE9mZnNldDsKLQotCWlmICgoIUFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkKSAmJiAoIUFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpKQotCQlfUEhZX1NldEJXTW9kZTIzYTkyQyhBZGFwdGVyKTsKLQllbHNlCi0JCXBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbEJXID0gdG1wQlc7Ci19Ci0KLXN0YXRpYyB2b2lkIF9QSFlfU3dDaG5sODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1OCBjaGFubmVsKQotewotCWVudW0gUkZfUkFESU9fUEFUSCBlUkZQYXRoOwotCXUzMiBwYXJhbTEsIHBhcmFtMjsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCi0JLyogczEuIHByZSBjb21tb24gY29tbWFuZCAtIENtZElEX1NldFR4UG93ZXJMZXZlbCAqLwotCVBIWV9TZXRUeFBvd2VyTGV2ZWw4NzIzQShBZGFwdGVyLCBjaGFubmVsKTsKLQotCS8qIHMyLiBSRiBkZXBlbmRlbnQgY29tbWFuZCAtIENtZElEX1JGX1dyaXRlUmVnLAotCSAgIHBhcmFtMSA9IFJGX0NITkxCVywgcGFyYW0yID0gY2hhbm5lbCAqLwotCXBhcmFtMSA9IFJGX0NITkxCVzsKLQlwYXJhbTIgPSBjaGFubmVsOwotCWZvciAoZVJGUGF0aCA9IDA7IGVSRlBhdGggPCBwSGFsRGF0YS0+TnVtVG90YWxSRlBhdGg7IGVSRlBhdGgrKykgewotCQlwSGFsRGF0YS0+UmZSZWdDaG5sVmFsW2VSRlBhdGhdID0KLQkJCShwSGFsRGF0YS0+UmZSZWdDaG5sVmFsW2VSRlBhdGhdICYgMHhmZmZmZmMwMCkgfCBwYXJhbTI7Ci0JCVBIWV9TZXRSRlJlZyhBZGFwdGVyLCBlUkZQYXRoLCBwYXJhbTEsCi0JCQkgICAgIGJSRlJlZ09mZnNldE1hc2ssIHBIYWxEYXRhLT5SZlJlZ0NobmxWYWxbZVJGUGF0aF0pOwotCX0KLQotCS8qIHMzLiBwb3N0IGNvbW1vbiBjb21tYW5kIC0gQ21kSURfRW5kLCBOb25lICovCi19Ci0KLXZvaWQgUEhZX1N3Q2hubDg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwgdTggY2hhbm5lbCkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXU4IHRtcGNoYW5uZWwgPSBwSGFsRGF0YS0+Q3VycmVudENoYW5uZWw7Ci0JYm9vbCAgcmVzdWx0ID0gdHJ1ZTsKLQotCWlmIChjaGFubmVsID09IDApCi0JCWNoYW5uZWwgPSAxOwotCi0JcEhhbERhdGEtPkN1cnJlbnRDaGFubmVsID0gY2hhbm5lbDsKLQotCWlmICgoIUFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkKSAmJiAoIUFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpKSB7Ci0JCV9QSFlfU3dDaG5sODcyM0EoQWRhcHRlciwgY2hhbm5lbCk7Ci0KLQkJaWYgKCFyZXN1bHQpCi0JCQlwSGFsRGF0YS0+Q3VycmVudENoYW5uZWwgPSB0bXBjaGFubmVsOwotCX0gZWxzZSB7Ci0JCXBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbCA9IHRtcGNoYW5uZWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfcmY2MDUyLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9yZjYwNTIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRjMGZmMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9yZjYwNTIuYworKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKgotICogTW9kdWxlOglydGw4MTkyY19yZjYwNTIuYwkoU291cmNlIEMgRmlsZSkKLSAqCi0gKiBOb3RlOglQcm92aWRlIFJGIDYwNTIgc2VyaWVzIHJlbGF0aXZlIEFQSS4KLSAqCi0gKiBGdW5jdGlvbjoKLSAqCi0gKiBFeHBvcnQ6Ci0gKgotICogQWJicmV2OgotICoKLSAqIEhpc3Rvcnk6Ci0gKiBEYXRhCQkJV2hvCQlSZW1hcmsKLSAqCi0gKiAwOS8yNS8yMDA4CU1IQwkJQ3JlYXRlIGluaXRpYWwgdmVyc2lvbi4KLSAqIDExLzA1LzIwMDgJTUhDCQlBZGQgQVBJIGZvciB0dyBwb3dlciBzZXR0aW5nLgotICoKLSAqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgX1JUTDg3MjNBX1JGNjA1Ml9DXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotCi0jaW5jbHVkZSA8cnRsODcyM2FfaGFsLmg+Ci0jaW5jbHVkZSA8dXNiX29wc19saW51eC5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBGdW5jdGlvbjogICAgUEhZX1JGNjA1MlNldEJhbmR3aWR0aCgpCi0gKgotICogT3ZlcnZpZXc6ICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IFNldEJXTW9kZTIzYUNhbGxiYWNrODE5MFBjaSgpIG9ubHkKLSAqCi0gKiBJbnB1dDogICAgICAgc3RydWN0IHJ0d19hZGFwdGVyICoJCQkJQWRhcHRlcgotICoJCQlXSVJFTEVTU19CQU5EV0lEVEhfRQlCYW5kd2lkdGgJMjBNIG9yIDQwTQotICoKLSAqIE91dHB1dDogICAgICBOT05FCi0gKgotICogUmV0dXJuOiAgICAgIE5PTkUKLSAqCi0gKiBOb3RlOgkJRm9yIFJGIHR5cGUgMDIyMkQKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgcnRsODcyM2FfcGh5X3JmNjA1MnNldF9idyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsCi0JCQkgICAgICAgZW51bSBodF9jaGFubmVsX3dpZHRoIEJhbmR3aWR0aCkJLyogMjBNIG9yIDQwTSAqLwotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0KLQlzd2l0Y2ggKEJhbmR3aWR0aCkgewotCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF8yMDoKLQkJcEhhbERhdGEtPlJmUmVnQ2hubFZhbFswXSA9Ci0JCQkocEhhbERhdGEtPlJmUmVnQ2hubFZhbFswXSAmIDB4ZmZmZmYzZmYpIHwgMHgwNDAwOwotCQlQSFlfU2V0UkZSZWcoQWRhcHRlciwgUkZfUEFUSF9BLCBSRl9DSE5MQlcsIGJSRlJlZ09mZnNldE1hc2ssCi0JCQkgICAgIHBIYWxEYXRhLT5SZlJlZ0NobmxWYWxbMF0pOwotCQlicmVhazsKLQljYXNlIEhUX0NIQU5ORUxfV0lEVEhfNDA6Ci0JCXBIYWxEYXRhLT5SZlJlZ0NobmxWYWxbMF0gPQotCQkJKHBIYWxEYXRhLT5SZlJlZ0NobmxWYWxbMF0gJiAweGZmZmZmM2ZmKTsKLQkJUEhZX1NldFJGUmVnKEFkYXB0ZXIsIFJGX1BBVEhfQSwgUkZfQ0hOTEJXLCBiUkZSZWdPZmZzZXRNYXNrLAotCQkJICAgICBwSGFsRGF0YS0+UmZSZWdDaG5sVmFsWzBdKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBGdW5jdGlvbjoJUEhZX1JGNjA1MlNldENja1R4UG93ZXIKLSAqCi0gKiBPdmVydmlldzoKLSAqCi0gKiBJbnB1dDogICAgICAgTk9ORQotICoKLSAqIE91dHB1dDogICAgICBOT05FCi0gKgotICogUmV0dXJuOiAgICAgIE5PTkUKLSAqCi0gKiBSZXZpc2VkIEhpc3Rvcnk6Ci0gKiBXaGVuCQkJV2hvCQlSZW1hcmsKLSAqIDExLzA1LzIwMDgJTUhDCQlTaW11bGF0ZSA4MTkyc2VyaWVzLi4KLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXZvaWQgcnRsODIzYV9waHlfcmY2MDUyc2V0Y2NrdHhwb3dlcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsCi0JCQkJICAgICB1OCAqcFBvd2VybGV2ZWwpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlzdHJ1Y3QgZG1fcHJpdiAqcGRtcHJpdiA9ICZwSGFsRGF0YS0+ZG1wcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZBZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQl1MzIgVHhBR0NbMl0gPSB7MCwgMH0sIHRtcHZhbCA9IDA7Ci0JdTggaWR4MSwgaWR4MjsKLQl1OCAqcHRyOwotCi0JaWYgKHBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5zdGF0ZSA9PSBTQ0FOX1BST0NFU1MpIHsKLQkJVHhBR0NbUkZfUEFUSF9BXSA9IDB4M2YzZjNmM2Y7Ci0JCVR4QUdDW1JGX1BBVEhfQl0gPSAweDNmM2YzZjNmOwotCi0JCWZvciAoaWR4MSA9IFJGX1BBVEhfQTsgaWR4MSA8PSBSRl9QQVRIX0I7IGlkeDErKykgewotCQkJVHhBR0NbaWR4MV0gPSBwUG93ZXJsZXZlbFtpZHgxXSB8Ci0JCQkJKHBQb3dlcmxldmVsW2lkeDFdIDw8IDgpIHwKLQkJCQkocFBvd2VybGV2ZWxbaWR4MV0gPDwgMTYpIHwKLQkJCQkocFBvd2VybGV2ZWxbaWR4MV0gPDwgMjQpOwotCQkJLyoKLQkJCSAqIDIwMTAvMTAvMTggTUggRm9yIGV4dGVybmFsIFBBIG1vZHVsZS4gV2UgbmVlZAotCQkJICogdG8gbGltaXQgcG93ZXIgaW5kZXggdG8gYmUgbGVzcyB0aGFuIDB4MjAuCi0JCQkgKi8KLQkJCWlmIChUeEFHQ1tpZHgxXSA+IDB4MjAgJiYgcEhhbERhdGEtPkV4dGVybmFsUEEpCi0JCQkJVHhBR0NbaWR4MV0gPSAweDIwOwotCQl9Ci0JfSBlbHNlIHsKLS8qICAyMDEwMDQyNyBKb3NlcGg6IERyaXZlciBkeW5hbWljIFR4IHBvd2VyIHNoYWxsIG5vdCBhZmZlY3QgVHgKLSAqICBwb3dlci4gSXQgc2hhbGwgYmUgZGV0ZXJtaW5lZCBieSBwb3dlciB0cmFpbmluZyBtZWNoYW5pc20uICovCi0vKiAgQ3VycmVudGx5LCB3ZSBjYW5ub3QgZnVsbHkgZGlzYWJsZSBkcml2ZXIgZHluYW1pYyB0eCBwb3dlcgotICogIG1lY2hhbmlzbSBiZWNhdXNlIGl0IGlzIHJlZmVyZW5jZWQgYnkgQlQgY29leGlzdCBtZWNoYW5pc20uICovCi0vKiAgSW4gdGhlIGZ1dHVyZSwgdHdvIG1lY2hhbmlzbSBzaGFsbCBiZSBzZXBhcmF0ZWQgZnJvbSBlYWNoIG90aGVyCi0gKiAgYW5kIG1haW50YWluZWQgaW5kZXBlbmRlbnRseS4gVGhhbmtzIGZvciBMYW5oc2luJ3MgcmVtaW5kZXIuICovCi0JCWlmIChwZG1wcml2LT5EeW5hbWljVHhIaWdoUG93ZXJMdmwgPT0gVHhIaWdoUHdyTGV2ZWxfTGV2ZWwxKSB7Ci0JCQlUeEFHQ1tSRl9QQVRIX0FdID0gMHgxMDEwMTAxMDsKLQkJCVR4QUdDW1JGX1BBVEhfQl0gPSAweDEwMTAxMDEwOwotCQl9IGVsc2UgaWYgKHBkbXByaXYtPkR5bmFtaWNUeEhpZ2hQb3dlckx2bCA9PQotCQkJICAgVHhIaWdoUHdyTGV2ZWxfTGV2ZWwyKSB7Ci0JCQlUeEFHQ1tSRl9QQVRIX0FdID0gMHgwMDAwMDAwMDsKLQkJCVR4QUdDW1JGX1BBVEhfQl0gPSAweDAwMDAwMDAwOwotCQl9IGVsc2UgewotCQkJZm9yIChpZHgxID0gUkZfUEFUSF9BOyBpZHgxIDw9IFJGX1BBVEhfQjsgaWR4MSsrKSB7Ci0JCQkJVHhBR0NbaWR4MV0gPSBwUG93ZXJsZXZlbFtpZHgxXSB8Ci0JCQkJCShwUG93ZXJsZXZlbFtpZHgxXSA8PCA4KSB8Ci0JCQkJCShwUG93ZXJsZXZlbFtpZHgxXSA8PCAxNikgfAotCQkJCQkocFBvd2VybGV2ZWxbaWR4MV0gPDwgMjQpOwotCQkJfQotCi0JCQlpZiAocEhhbERhdGEtPkVFUFJPTVJlZ3VsYXRvcnkgPT0gMCkgewotCQkJCXRtcHZhbCA9IChwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbMF1bNl0pICsKLQkJCQkJCShwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbMF1bN108PDgpOwotCQkJCVR4QUdDW1JGX1BBVEhfQV0gKz0gdG1wdmFsOwotCi0JCQkJdG1wdmFsID0gKHBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFswXVsxNF0pICsKLQkJCQkJCShwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbMF1bMTVdPDwyNCk7Ci0JCQkJVHhBR0NbUkZfUEFUSF9CXSArPSB0bXB2YWw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlmb3IgKGlkeDEgPSBSRl9QQVRIX0E7IGlkeDEgPD0gUkZfUEFUSF9COyBpZHgxKyspIHsKLQkJcHRyID0gKHU4ICopKCZUeEFHQ1tpZHgxXSk7Ci0JCWZvciAoaWR4MiA9IDA7IGlkeDIgPCA0OyBpZHgyKyspIHsKLQkJCWlmICgqcHRyID4gUkY2MDUyX01BWF9UWF9QV1IpCi0JCQkJKnB0ciA9IFJGNjA1Ml9NQVhfVFhfUFdSOwotCQkJcHRyKys7Ci0JCX0KLQl9Ci0KLQkvKiAgcmYtQSBjY2sgdHggcG93ZXIgKi8KLQl0bXB2YWwgPSBUeEFHQ1tSRl9QQVRIX0FdICYgMHhmZjsKLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgclR4QUdDX0FfQ0NLMV9NY3MzMiwgYk1hc2tCeXRlMSwgdG1wdmFsKTsKLQl0bXB2YWwgPSBUeEFHQ1tSRl9QQVRIX0FdID4+IDg7Ci0JUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJUeEFHQ19CX0NDSzExX0FfQ0NLMl8xMSwgMHhmZmZmZmYwMCwgdG1wdmFsKTsKLQotCS8qICByZi1CIGNjayB0eCBwb3dlciAqLwotCXRtcHZhbCA9IFR4QUdDW1JGX1BBVEhfQl0gPj4gMjQ7Ci0JUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJUeEFHQ19CX0NDSzExX0FfQ0NLMl8xMSwgYk1hc2tCeXRlMCwgdG1wdmFsKTsKLQl0bXB2YWwgPSBUeEFHQ1tSRl9QQVRIX0JdICYgMHgwMGZmZmZmZjsKLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgclR4QUdDX0JfQ0NLMV81NV9NY3MzMiwgMHhmZmZmZmYwMCwgdG1wdmFsKTsKLX0JLyogUEhZX1JGNjA1MlNldENja1R4UG93ZXIgKi8KLQotLyogIHBvd2VyYmFzZTAgZm9yIE9GRE0gcmF0ZXMgKi8KLS8qICBwb3dlcmJhc2UxIGZvciBIVCBNQ1MgcmF0ZXMgKi8KLXN0YXRpYyB2b2lkIGdldFBvd2VyQmFzZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHU4ICpwUG93ZXJMZXZlbCwKLQkJCSB1OCBDaGFubmVsLCB1MzIgKk9mZG1CYXNlLCB1MzIgKk1DU0Jhc2UpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQl1MzIgb2ZkbSwgbWNzOwotCXU4IExlZ2FjeV9wd3JkaWZmID0gMDsKLQlzOCBIVDIwX3B3cmRpZmYgPSAwOwotCXU4IGksIHBvd2VybGV2ZWxbMl07Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCXBvd2VybGV2ZWxbaV0gPSBwUG93ZXJMZXZlbFtpXTsKLQkJTGVnYWN5X3B3cmRpZmYgPSBwSGFsRGF0YS0+VHhQd3JMZWdhY3lIdERpZmZbaV1bQ2hhbm5lbC0xXTsKLQkJb2ZkbSA9IHBvd2VybGV2ZWxbaV0gKyBMZWdhY3lfcHdyZGlmZjsKLQotCQlvZmRtID0gb2ZkbSA8PCAyNCB8IG9mZG0gPDwgMTYgfCBvZmRtIDw8IDggfCBvZmRtOwotCQkqKE9mZG1CYXNlICsgaSkgPSBvZmRtOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJLyogQ2hlY2sgSFQyMCB0byBIVDQwIGRpZmYgKi8KLQkJaWYgKHBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbEJXID09IEhUX0NIQU5ORUxfV0lEVEhfMjApIHsKLQkJCUhUMjBfcHdyZGlmZiA9IHBIYWxEYXRhLT5UeFB3ckh0MjBEaWZmW2ldW0NoYW5uZWwtMV07Ci0JCQlwb3dlcmxldmVsW2ldICs9IEhUMjBfcHdyZGlmZjsKLQkJfQotCQltY3MgPSBwb3dlcmxldmVsW2ldOwotCQltY3MgPSBtY3MgPDwgMjQgfCBtY3MgPDwgMTYgfCBtY3MgPDwgOCB8IG1jczsKLQkJKihNQ1NCYXNlICsgaSkgPSBtY3M7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotZ2V0VHhQb3dlcldyaXRlVmFsQnlSZWd1bGF0b3J5KHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwgdTggQ2hhbm5lbCwKLQkJCSAgICAgICB1OCBpbmRleCwgdTMyICpwb3dlckJhc2UwLCB1MzIgKnBvd2VyQmFzZTEsCi0JCQkgICAgICAgdTMyICpwT3V0V3JpdGVWYWwpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlzdHJ1Y3QgZG1fcHJpdgkqcGRtcHJpdiA9ICZwSGFsRGF0YS0+ZG1wcml2OwotCXU4IGksIGNobmxHcm91cCA9IDAsIHB3cl9kaWZmX2xpbWl0WzRdOwotCXUzMiB3cml0ZVZhbCwgY3VzdG9tZXJfbGltaXQsIHJmOwotCi0JLyogIEluZGV4IDAgJiAxID0gbGVnYWN5IE9GRE0sIDItNSA9IEhUX01DUyByYXRlICovCi0JZm9yIChyZiA9IDA7IHJmIDwgMjsgcmYrKykgewotCQlzd2l0Y2ggKHBIYWxEYXRhLT5FRVBST01SZWd1bGF0b3J5KSB7Ci0JCWNhc2UgMDoJLyogIFJlYWx0ZWsgYmV0dGVyIHBlcmZvcm1hbmNlICovCi0JCQkvKiAgaW5jcmVhc2UgcG93ZXIgZGlmZiBkZWZpbmVkIGJ5IFJlYWx0ZWsgZm9yCi0JCQkgKiAgbGFyZ2UgcG93ZXIgKi8KLQkJCWNobmxHcm91cCA9IDA7Ci0JCQl3cml0ZVZhbCA9IHBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtjaG5sR3JvdXBdW2luZGV4KyhyZj84OjApXSArCi0JCQkJKChpbmRleCA8IDIpID8gcG93ZXJCYXNlMFtyZl0gOiBwb3dlckJhc2UxW3JmXSk7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgkvKiAgUmVhbHRlayByZWd1bGF0b3J5ICovCi0JCQkvKiAgaW5jcmVhc2UgcG93ZXIgZGlmZiBkZWZpbmVkIGJ5IFJlYWx0ZWsgZm9yCi0JCQkgKiAgcmVndWxhdG9yeSAqLwotCQkJaWYgKHBIYWxEYXRhLT5wd3JHcm91cENudCA9PSAxKQotCQkJCWNobmxHcm91cCA9IDA7Ci0JCQlpZiAocEhhbERhdGEtPnB3ckdyb3VwQ250ID49IDMpIHsKLQkJCQlpZiAoQ2hhbm5lbCA8PSAzKQotCQkJCQljaG5sR3JvdXAgPSAwOwotCQkJCWVsc2UgaWYgKENoYW5uZWwgPj0gNCAmJiBDaGFubmVsIDw9IDkpCi0JCQkJCWNobmxHcm91cCA9IDE7Ci0JCQkJZWxzZSBpZiAoQ2hhbm5lbCA+IDkpCi0JCQkJCWNobmxHcm91cCA9IDI7Ci0KLQkJCQlpZiAocEhhbERhdGEtPkN1cnJlbnRDaGFubmVsQlcgPT0KLQkJCQkgICAgSFRfQ0hBTk5FTF9XSURUSF8yMCkKLQkJCQkJY2hubEdyb3VwKys7Ci0JCQkJZWxzZQotCQkJCQljaG5sR3JvdXAgKz0gNDsKLQkJCX0KLQkJCXdyaXRlVmFsID0gcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W2NobmxHcm91cF1baW5kZXgrKHJmPzg6MCldICsKLQkJCQkgICAoKGluZGV4IDwgMikgPyBwb3dlckJhc2UwW3JmXSA6Ci0JCQkJICAgIHBvd2VyQmFzZTFbcmZdKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6CS8qICBCZXR0ZXIgcmVndWxhdG9yeSAqLwotCQkJLyogIGRvbid0IGluY3JlYXNlIGFueSBwb3dlciBkaWZmICovCi0JCQl3cml0ZVZhbCA9IChpbmRleCA8IDIpID8gcG93ZXJCYXNlMFtyZl0gOgotCQkJCSAgICBwb3dlckJhc2UxW3JmXTsKLQkJCWJyZWFrOwotCQljYXNlIDM6CS8qICBDdXN0b21lciBkZWZpbmVkIHBvd2VyIGRpZmYuICovCi0JCQljaG5sR3JvdXAgPSAwOwotCi0JCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCQkJcHdyX2RpZmZfbGltaXRbaV0gPSAodTgpKChwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbY2hubEdyb3VwXVtpbmRleCArCi0JCQkJCQkgICAgKHJmID8gOCA6IDApXSYoMHg3ZiA8PCAoaSo4KSkpID4+IChpKjgpKTsKLQkJCQlpZiAocEhhbERhdGEtPkN1cnJlbnRDaGFubmVsQlcgPT0gSFRfQ0hBTk5FTF9XSURUSF80MCkgewotCQkJCQlpZiAocHdyX2RpZmZfbGltaXRbaV0gPiBwSGFsRGF0YS0+UHdyR3JvdXBIVDQwW3JmXVtDaGFubmVsLTFdKQotCQkJCQkJcHdyX2RpZmZfbGltaXRbaV0gPSBwSGFsRGF0YS0+UHdyR3JvdXBIVDQwW3JmXVtDaGFubmVsLTFdOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChwd3JfZGlmZl9saW1pdFtpXSA+IHBIYWxEYXRhLT5Qd3JHcm91cEhUMjBbcmZdW0NoYW5uZWwtMV0pCi0JCQkJCQlwd3JfZGlmZl9saW1pdFtpXSA9IHBIYWxEYXRhLT5Qd3JHcm91cEhUMjBbcmZdW0NoYW5uZWwtMV07Ci0JCQkJfQotCQkJfQotCQkJY3VzdG9tZXJfbGltaXQgPSAocHdyX2RpZmZfbGltaXRbM108PDI0KSB8IChwd3JfZGlmZl9saW1pdFsyXTw8MTYpIHwKLQkJCQkJCQkocHdyX2RpZmZfbGltaXRbMV08PDgpIHwgKHB3cl9kaWZmX2xpbWl0WzBdKTsKLQkJCXdyaXRlVmFsID0gY3VzdG9tZXJfbGltaXQgKyAoKGluZGV4PDIpP3Bvd2VyQmFzZTBbcmZdOnBvd2VyQmFzZTFbcmZdKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJY2hubEdyb3VwID0gMDsKLQkJCXdyaXRlVmFsID0gcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W2NobmxHcm91cF1baW5kZXgrKHJmPzg6MCldICsKLQkJCQkJKChpbmRleCA8IDIpID8gcG93ZXJCYXNlMFtyZl0gOiBwb3dlckJhc2UxW3JmXSk7Ci0JCQlicmVhazsKLQkJfQotCi0vKiAgMjAxMDA0MjcgSm9zZXBoOiBEcml2ZXIgZHluYW1pYyBUeCBwb3dlciBzaGFsbCBub3QgYWZmZWN0IFR4IHBvd2VyLgotICAgIEl0IHNoYWxsIGJlIGRldGVybWluZWQgYnkgcG93ZXIgdHJhaW5pbmcgbWVjaGFuaXNtLiAqLwotLyogIEN1cnJlbnRseSwgd2UgY2Fubm90IGZ1bGx5IGRpc2FibGUgZHJpdmVyIGR5bmFtaWMgdHggcG93ZXIgbWVjaGFuaXNtCi0gICAgYmVjYXVzZSBpdCBpcyByZWZlcmVuY2VkIGJ5IEJUIGNvZXhpc3QgbWVjaGFuaXNtLiAqLwotLyogIEluIHRoZSBmdXR1cmUsIHR3byBtZWNoYW5pc20gc2hhbGwgYmUgc2VwYXJhdGVkIGZyb20gZWFjaCBvdGhlciBhbmQKLSAgICBtYWludGFpbmVkIGluZGVwZW5kZW50bHkuIFRoYW5rcyBmb3IgTGFuaHNpbidzIHJlbWluZGVyLiAqLwotCi0JCWlmIChwZG1wcml2LT5EeW5hbWljVHhIaWdoUG93ZXJMdmwgPT0gVHhIaWdoUHdyTGV2ZWxfTGV2ZWwxKQotCQkJd3JpdGVWYWwgPSAweDE0MTQxNDE0OwotCQllbHNlIGlmIChwZG1wcml2LT5EeW5hbWljVHhIaWdoUG93ZXJMdmwgPT0KLQkJCSBUeEhpZ2hQd3JMZXZlbF9MZXZlbDIpCi0JCQl3cml0ZVZhbCA9IDB4MDAwMDAwMDA7Ci0KLQkJLyogMjAxMDA2MjggSm9zZXBoOiBIaWdoIHBvd2VyIG1vZGUgZm9yIEJULUNvZXhpc3QgbWVjaGFuaXNtLiAqLwotCQkvKiBUaGlzIG1lY2hhbmlzbSBpcyBvbmx5IGFwcGxpZWQgd2hlbgotCQkgICBEcml2ZXItSGlnaHBvd2VyLU1lY2hhbmlzbSBpcyBPRkYuICovCi0JCWlmIChwZG1wcml2LT5EeW5hbWljVHhIaWdoUG93ZXJMdmwgPT0gVHhIaWdoUHdyTGV2ZWxfQlQxKQotCQkJd3JpdGVWYWwgPSB3cml0ZVZhbCAtIDB4MDYwNjA2MDY7Ci0JCWVsc2UgaWYgKHBkbXByaXYtPkR5bmFtaWNUeEhpZ2hQb3dlckx2bCA9PSBUeEhpZ2hQd3JMZXZlbF9CVDIpCi0JCQl3cml0ZVZhbCA9IHdyaXRlVmFsOwotCQkqKHBPdXRXcml0ZVZhbCArIHJmKSA9IHdyaXRlVmFsOwotCX0KLX0KLQotc3RhdGljIHZvaWQgd3JpdGVPRkRNUG93ZXJSZWcoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1OCBpbmRleCwKLQkJCSAgICAgIHUzMiAqcFZhbHVlKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0JdTE2IFJlZ09mZnNldF9BWzZdID0gewotCQlyVHhBR0NfQV9SYXRlMThfMDYsIHJUeEFHQ19BX1JhdGU1NF8yNCwKLQkJclR4QUdDX0FfTWNzMDNfTWNzMDAsIHJUeEFHQ19BX01jczA3X01jczA0LAotCQlyVHhBR0NfQV9NY3MxMV9NY3MwOCwgclR4QUdDX0FfTWNzMTVfTWNzMTIKLQl9OwotCXUxNiBSZWdPZmZzZXRfQls2XSA9IHsKLQkJclR4QUdDX0JfUmF0ZTE4XzA2LCByVHhBR0NfQl9SYXRlNTRfMjQsCi0JCXJUeEFHQ19CX01jczAzX01jczAwLCByVHhBR0NfQl9NY3MwN19NY3MwNCwKLQkJclR4QUdDX0JfTWNzMTFfTWNzMDgsIHJUeEFHQ19CX01jczE1X01jczEyCi0JfTsKLQl1OCBpLCByZiwgcHdyX3ZhbFs0XTsKLQl1MzIgd3JpdGVWYWw7Ci0JdTE2IFJlZ09mZnNldDsKLQotCWZvciAocmYgPSAwOyByZiA8IDI7IHJmKyspIHsKLQkJd3JpdGVWYWwgPSBwVmFsdWVbcmZdOwotCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCQlwd3JfdmFsW2ldID0gKHU4KSgod3JpdGVWYWwgJgotCQkJCQkgICAoMHg3ZiA8PCAoaSAqIDgpKSkgPj4gKGkgKiA4KSk7Ci0JCQlpZiAocHdyX3ZhbFtpXSA+IFJGNjA1Ml9NQVhfVFhfUFdSKQotCQkJCXB3cl92YWxbaV0gID0gUkY2MDUyX01BWF9UWF9QV1I7Ci0JCX0KLQkJd3JpdGVWYWwgPSBwd3JfdmFsWzNdIDw8IDI0IHwgcHdyX3ZhbFsyXSA8PCAxNiB8Ci0JCQlwd3JfdmFsWzFdIDw8IDggfCBwd3JfdmFsWzBdOwotCi0JCWlmIChyZiA9PSAwKQotCQkJUmVnT2Zmc2V0ID0gUmVnT2Zmc2V0X0FbaW5kZXhdOwotCQllbHNlCi0JCQlSZWdPZmZzZXQgPSBSZWdPZmZzZXRfQltpbmRleF07Ci0KLQkJcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUmVnT2Zmc2V0LCB3cml0ZVZhbCk7Ci0KLQkJLyogIDIwMTAwNTExNSBKb3NlcGg6IFNldCBUeCBQb3dlciBkaWZmIGZvciBUeCBwb3dlcgotCQkgICAgdHJhaW5pbmcgbWVjaGFuaXNtLiAqLwotCQlpZiAoKChwSGFsRGF0YS0+cmZfdHlwZSA9PSBSRl8yVDJSKSAmJgotCQkgICAgKFJlZ09mZnNldCA9PSByVHhBR0NfQV9NY3MxNV9NY3MxMiB8fAotCQkgICAgIFJlZ09mZnNldCA9PSByVHhBR0NfQl9NY3MxNV9NY3MxMikpIHx8Ci0JCSAgICAoKHBIYWxEYXRhLT5yZl90eXBlICE9IFJGXzJUMlIpICYmCi0JCSAgICAgKFJlZ09mZnNldCA9PSByVHhBR0NfQV9NY3MwN19NY3MwNCB8fAotCQkgICAgICBSZWdPZmZzZXQgPT0gclR4QUdDX0JfTWNzMDdfTWNzMDQpKSkgewotCQkJd3JpdGVWYWwgPSBwd3JfdmFsWzNdOwotCQkJaWYgKFJlZ09mZnNldCA9PSByVHhBR0NfQV9NY3MxNV9NY3MxMiB8fAotCQkJICAgIFJlZ09mZnNldCA9PSByVHhBR0NfQV9NY3MwN19NY3MwNCkKLQkJCQlSZWdPZmZzZXQgPSAweGM5MDsKLQkJCWlmIChSZWdPZmZzZXQgPT0gclR4QUdDX0JfTWNzMTVfTWNzMTIgfHwKLQkJCSAgICBSZWdPZmZzZXQgPT0gclR4QUdDX0JfTWNzMDdfTWNzMDQpCi0JCQkJUmVnT2Zmc2V0ID0gMHhjOTg7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMikKLQkJCQkJd3JpdGVWYWwgPSAod3JpdGVWYWwgPiA4KSA/Ci0JCQkJCQkod3JpdGVWYWwgLSA4KSA6IDA7Ci0JCQkJZWxzZQotCQkJCQl3cml0ZVZhbCA9ICh3cml0ZVZhbCA+IDYpID8KLQkJCQkJCSh3cml0ZVZhbCAtIDYpIDogMDsKLQkJCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJlZ09mZnNldCArIGksCi0JCQkJCQkgKHU4KXdyaXRlVmFsKTsKLQkJCX0KLQkJfQotCX0KLX0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEZ1bmN0aW9uOglQSFlfUkY2MDUyU2V0T0ZETVR4UG93ZXIKLSAqCi0gKiBPdmVydmlldzoJRm9yIGxlZ2FjeSBhbmQgSFkgT0ZETSwgd2UgbXVzdCByZWFkIEVFUFJPTSBUWCBwb3dlciBpbmRleCBmb3IKLSAqCQlkaWZmZXJlbnQgY2hhbm5lbCBhbmQgcmVhZCBvcmlnaW5hbCB2YWx1ZSBpbiBUWCBwb3dlcgotICoJCXJlZ2lzdGVyIGFyZWEgZnJvbSAweGUwMC4gV2UgaW5jcmVhc2Ugb2Zmc2V0IGFuZAotICoJCW9yaWdpbmFsIHZhbHVlIHRvIGJlIGNvcnJlY3QgdHggcHdyLgotICoKLSAqIElucHV0OiAgICAgICBOT05FCi0gKgotICogT3V0cHV0OiAgICAgIE5PTkUKLSAqCi0gKiBSZXR1cm46ICAgICAgTk9ORQotICoKLSAqIFJldmlzZWQgSGlzdG9yeToKLSAqIFdoZW4JCQlSZW1hcmsKLSAqIDExLzA1LzIwMDgJTUhDCVNpbXVsYXRlIDgxOTIgc2VyaWVzIG1ldGhvZC4KLSAqIDAxLzA2LzIwMDkJTUhDCTEuIFByZXZlbnQgUGF0aCBCIHR4IHBvd2VyIG92ZXJmbG93IG9yCi0gKgkJCXVuZGVyZmxvdyBkdXJlIHRvIEEvQiBwd3IgZGlmZmVyZW5jZSBvcgotICoJCQlsZWdhY3kvSFQgcHdyIGRpZmYuCi0gKgkJCTIuIFdlIGNvbmNlcm4gd2l0aCBwYXRoIEIgbGVnYWN5L0hUIE9GRE0gZGlmZmVyZW5jZS4KLSAqIDAxLzIyLzIwMDkJTUhDCVN1cHBvcnQgbmV3IEVQUk8gZm9ybWF0IGZyb20gU0QzLgotICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgcnRsODcyM2FfUEhZX1JGNjA1MlNldE9GRE1UeFBvd2VyKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwKLQkJCQkgICAgICAgdTggKnBQb3dlckxldmVsLCB1OCBDaGFubmVsKQotewotCXUzMiB3cml0ZVZhbFsyXSwgcG93ZXJCYXNlMFsyXSwgcG93ZXJCYXNlMVsyXTsKLQl1OCBpbmRleCA9IDA7Ci0KLQlnZXRQb3dlckJhc2UoQWRhcHRlciwgcFBvd2VyTGV2ZWwsIENoYW5uZWwsCi0JCSAgICAgJnBvd2VyQmFzZTBbMF0sICZwb3dlckJhc2UxWzBdKTsKLQotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IDY7IGluZGV4KyspIHsKLQkJZ2V0VHhQb3dlcldyaXRlVmFsQnlSZWd1bGF0b3J5KEFkYXB0ZXIsIENoYW5uZWwsIGluZGV4LAotCQkJJnBvd2VyQmFzZTBbMF0sICZwb3dlckJhc2UxWzBdLCAmd3JpdGVWYWxbMF0pOwotCi0JCXdyaXRlT0ZETVBvd2VyUmVnKEFkYXB0ZXIsIGluZGV4LCAmd3JpdGVWYWxbMF0pOwotCX0KLX0KLQotc3RhdGljIGludCBwaHlfUkY2MDUyX0NvbmZpZ19QYXJhRmlsZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0JdTMyIHU0UmVnVmFsdWUgPSAwOwotCXU4IGVSRlBhdGg7Ci0Jc3RydWN0IGJiX3JlZ19kZWZpbmUgKnBQaHlSZWc7Ci0JaW50IHJ0U3RhdHVzID0gX1NVQ0NFU1M7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQotCS8qIDMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCS8qIDMgPDI+IEluaXRpYWxpemUgUkYgKi8KLQkvKiAzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQlmb3IgKGVSRlBhdGggPSAwOyBlUkZQYXRoIDwgcEhhbERhdGEtPk51bVRvdGFsUkZQYXRoOyBlUkZQYXRoKyspIHsKLQotCQlwUGh5UmVnID0gJnBIYWxEYXRhLT5QSFlSZWdEZWZbZVJGUGF0aF07Ci0KLQkJLyotLS0tU3RvcmUgb3JpZ2luYWwgUkZFTlYgY29udHJvbCB0eXBlLS0tLSovCi0JCXN3aXRjaCAoZVJGUGF0aCkgewotCQljYXNlIFJGX1BBVEhfQToKLQkJCXU0UmVnVmFsdWUgPSBQSFlfUXVlcnlCQlJlZyhBZGFwdGVyLCBwUGh5UmVnLT5yZmludGZzLAotCQkJCQkJICAgIGJSRlNJX1JGRU5WKTsKLQkJCWJyZWFrOwotCQljYXNlIFJGX1BBVEhfQjoKLQkJCXU0UmVnVmFsdWUgPSBQSFlfUXVlcnlCQlJlZyhBZGFwdGVyLCBwUGh5UmVnLT5yZmludGZzLAotCQkJCQkJICAgIGJSRlNJX1JGRU5WIDw8IDE2KTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyotLS0tU2V0IFJGX0VOViBlbmFibGUtLS0tKi8KLQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHBQaHlSZWctPnJmaW50ZmUsIGJSRlNJX1JGRU5WIDw8IDE2LCAweDEpOwotCQl1ZGVsYXkoMSk7LyogUGxhdGZvcm1TdGFsbEV4ZWN1dGlvbigxKTsgKi8KLQotCQkvKi0tLS1TZXQgUkZfRU5WIG91dHB1dCBoaWdoLS0tLSovCi0JCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCBwUGh5UmVnLT5yZmludGZvLCBiUkZTSV9SRkVOViwgMHgxKTsKLQkJdWRlbGF5KDEpOy8qIFBsYXRmb3JtU3RhbGxFeGVjdXRpb24oMSk7ICovCi0KLQkJLyogU2V0IGJpdCBudW1iZXIgb2YgQWRkcmVzcyBhbmQgRGF0YSBmb3IgUkYgcmVnaXN0ZXIgKi8KLQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHBQaHlSZWctPnJmSFNTSVBhcmEyLCBiM1dpcmVBZGRyZXNzTGVuZ3RoLAotCQkJICAgICAweDApOwkvKiAgU2V0IDEgdG8gNCBiaXRzIGZvciA4MjU1ICovCi0JCXVkZWxheSgxKTsvKiBQbGF0Zm9ybVN0YWxsRXhlY3V0aW9uKDEpOyAqLwotCi0JCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCBwUGh5UmVnLT5yZkhTU0lQYXJhMiwgYjNXaXJlRGF0YUxlbmd0aCwKLQkJCSAgICAgMHgwKTsJLyogIFNldCAwIHRvIDEyICBiaXRzIGZvciA4MjU1ICovCi0JCXVkZWxheSgxKTsvKiBQbGF0Zm9ybVN0YWxsRXhlY3V0aW9uKDEpOyAqLwotCi0JCS8qLS0tLUluaXRpYWxpemUgUkYgZm9tIGNvbm5maWd1cmF0aW9uIGZpbGUtLS0tKi8KLQkJc3dpdGNoIChlUkZQYXRoKSB7Ci0JCWNhc2UgUkZfUEFUSF9BOgotCQkJT0RNX1JlYWRBbmRDb25maWdfUmFkaW9BXzFUXzg3MjNBKCZwSGFsRGF0YS0+b2RtcHJpdik7Ci0JCQlicmVhazsKLQkJY2FzZSBSRl9QQVRIX0I6Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qLS0tLVJlc3RvcmUgUkZFTlYgY29udHJvbCB0eXBlLS0tLSovCi0JCXN3aXRjaCAoZVJGUGF0aCkgewotCQljYXNlIFJGX1BBVEhfQToKLQkJCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCBwUGh5UmVnLT5yZmludGZzLAotCQkJCSAgICAgYlJGU0lfUkZFTlYsIHU0UmVnVmFsdWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUkZfUEFUSF9COgotCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHBQaHlSZWctPnJmaW50ZnMsCi0JCQkJICAgICBiUkZTSV9SRkVOViA8PCAxNiwgdTRSZWdWYWx1ZSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChydFN0YXR1cyAhPSBfU1VDQ0VTUykgewotCQkJZ290byBwaHlfUkY2MDUyX0NvbmZpZ19QYXJhRmlsZV9GYWlsOwotCQl9Ci0JfQotcGh5X1JGNjA1Ml9Db25maWdfUGFyYUZpbGVfRmFpbDoKLQlyZXR1cm4gcnRTdGF0dXM7Ci19Ci0KLWludCBQSFlfUkY2MDUyX0NvbmZpZzg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCi0JLyogIEluaXRpYWxpemUgZ2VuZXJhbCBnbG9iYWwgdmFsdWUgKi8KLQkvKiAgVE9ETzogRXh0ZW5kIFJGX1BBVEhfQyBhbmQgUkZfUEFUSF9EIGluIHRoZSBmdXR1cmUgKi8KLQlpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gUkZfMVQxUikKLQkJcEhhbERhdGEtPk51bVRvdGFsUkZQYXRoID0gMTsKLQllbHNlCi0JCXBIYWxEYXRhLT5OdW1Ub3RhbFJGUGF0aCA9IDI7Ci0KLQkvKiAgQ29uZmlnIEJCIGFuZCBSRiAqLwotCXJldHVybiBwaHlfUkY2MDUyX0NvbmZpZ19QYXJhRmlsZShBZGFwdGVyKTsKLX0KLQotLyogRW5kIG9mIEhhbFJmNjA1Mi5jICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9yeGRlc2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX3J4ZGVzYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWI1ZWZlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX3J4ZGVzYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9SVEw4NzIzQV9SRURFU0NfQ18KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLSNpbmNsdWRlIDxydGw4NzIzYV9oYWwuaD4KLQotc3RhdGljIHZvaWQgcHJvY2Vzc19yc3NpKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgc3RydWN0IHJlY3ZfZnJhbWUgKnByZnJhbWUpCi17Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJmcmFtZS0+YXR0cmliOwotCXN0cnVjdCBzaWduYWxfc3RhdCAqc2lnbmFsX3N0YXQgPSAmcGFkYXB0ZXItPnJlY3Zwcml2LnNpZ25hbF9zdHJlbmd0aF9kYXRhOwotCi0JaWYgKHNpZ25hbF9zdGF0LT51cGRhdGVfcmVxKSB7Ci0JCXNpZ25hbF9zdGF0LT50b3RhbF9udW0gPSAwOwotCQlzaWduYWxfc3RhdC0+dG90YWxfdmFsID0gMDsKLQkJc2lnbmFsX3N0YXQtPnVwZGF0ZV9yZXEgPSAwOwotCX0KLQotCXNpZ25hbF9zdGF0LT50b3RhbF9udW0rKzsKLQlzaWduYWxfc3RhdC0+dG90YWxfdmFsICArPSBwYXR0cmliLT5waHlfaW5mby5TaWduYWxTdHJlbmd0aDsKLQlzaWduYWxfc3RhdC0+YXZnX3ZhbCA9IHNpZ25hbF9zdGF0LT50b3RhbF92YWwgLyBzaWduYWxfc3RhdC0+dG90YWxfbnVtOwotfQotCi1zdGF0aWMgdm9pZCBwcm9jZXNzX2xpbmtfcXVhbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZnJhbWUpCi17Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWI7Ci0Jc3RydWN0IHNpZ25hbF9zdGF0ICpzaWduYWxfc3RhdDsKLQotCWlmIChwcmZyYW1lID09IE5VTEwgfHwgcGFkYXB0ZXIgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JcGF0dHJpYiA9ICZwcmZyYW1lLT5hdHRyaWI7Ci0Jc2lnbmFsX3N0YXQgPSAmcGFkYXB0ZXItPnJlY3Zwcml2LnNpZ25hbF9xdWFsX2RhdGE7Ci0KLQlpZiAoc2lnbmFsX3N0YXQtPnVwZGF0ZV9yZXEpIHsKLQkJc2lnbmFsX3N0YXQtPnRvdGFsX251bSA9IDA7Ci0JCXNpZ25hbF9zdGF0LT50b3RhbF92YWwgPSAwOwotCQlzaWduYWxfc3RhdC0+dXBkYXRlX3JlcSA9IDA7Ci0JfQotCi0Jc2lnbmFsX3N0YXQtPnRvdGFsX251bSsrOwotCXNpZ25hbF9zdGF0LT50b3RhbF92YWwgICs9IHBhdHRyaWItPnBoeV9pbmZvLlNpZ25hbFF1YWxpdHk7Ci0Jc2lnbmFsX3N0YXQtPmF2Z192YWwgPSBzaWduYWxfc3RhdC0+dG90YWxfdmFsIC8gc2lnbmFsX3N0YXQtPnRvdGFsX251bTsKLX0KLQotLyogdm9pZCBydGw4NzIzYV9wcm9jZXNzX3BoeV9pbmZvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHVuaW9uIHJlY3ZfZnJhbWUgKnByZnJhbWUpICovCi12b2lkIHJ0bDg3MjNhX3Byb2Nlc3NfcGh5X2luZm8oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdm9pZCAqcHJmcmFtZSkKLXsKLQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSA9IHByZnJhbWU7Ci0JLyogIENoZWNrIFJTU0kgKi8KLQlwcm9jZXNzX3Jzc2kocGFkYXB0ZXIsIHByZWN2ZnJhbWUpOwotCS8qICBDaGVjayBFVk0gKi8KLQlwcm9jZXNzX2xpbmtfcXVhbChwYWRhcHRlciwgIHByZWN2ZnJhbWUpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2Ffc3Jlc2V0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9zcmVzZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M0NjI5NC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9zcmVzZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfUlRMODcyM0FfU1JFU0VUX0NfCi0KLSNpbmNsdWRlIDxydGw4NzIzYV9zcmVzZXQuaD4KLSNpbmNsdWRlIDxydGw4NzIzYV9oYWwuaD4KLSNpbmNsdWRlIDx1c2Jfb3BzX2xpbnV4Lmg+Ci0KLXZvaWQgcnRsODcyM2Ffc3Jlc2V0X3htaXRfc3RhdHVzX2NoZWNrKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IHNyZXNldF9wcml2ICpwc3J0cHJpdiA9ICZwSGFsRGF0YS0+c3Jlc3Rwcml2OwotCi0JdW5zaWduZWQgbG9uZyBjdXJyZW50X3RpbWU7Ci0Jc3RydWN0IHhtaXRfcHJpdgkqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQl1bnNpZ25lZCBpbnQgZGlmZl90aW1lOwotCXUzMiB0eGRtYV9zdGF0dXM7Ci0KLQl0eGRtYV9zdGF0dXMgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfVFhETUFfU1RBVFVTKTsKLQlpZiAodHhkbWFfc3RhdHVzICE9IDApIHsKLQkJREJHXzg3MjNBKCIlcyBSRUdfVFhETUFfU1RBVFVTOjB4JTA4eFxuIiwgX19mdW5jX18sIHR4ZG1hX3N0YXR1cyk7Ci0JCXJ0d19zcmVzZXRfcmVzZXQocGFkYXB0ZXIpOwotCX0KLQotCWN1cnJlbnRfdGltZSA9IGppZmZpZXM7Ci0KLQlpZiAoMCA9PSBweG1pdHByaXYtPmZyZWVfeG1pdGJ1Zl9jbnQgfHwgMCA9PSBweG1pdHByaXYtPmZyZWVfeG1pdF9leHRidWZfY250KSB7Ci0KLQkJZGlmZl90aW1lID0gamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gcHNydHByaXYtPmxhc3RfdHhfdGltZSk7Ci0KLQkJaWYgKGRpZmZfdGltZSA+IDIwMDApIHsKLQkJCWlmIChwc3J0cHJpdi0+bGFzdF90eF9jb21wbGV0ZV90aW1lID09IDApIHsKLQkJCQlwc3J0cHJpdi0+bGFzdF90eF9jb21wbGV0ZV90aW1lID0gY3VycmVudF90aW1lOwotCQkJfSBlbHNlIHsKLQkJCQlkaWZmX3RpbWUgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBwc3J0cHJpdi0+bGFzdF90eF9jb21wbGV0ZV90aW1lKTsKLQkJCQlpZiAoZGlmZl90aW1lID4gNDAwMCkgewotCQkJCQlEQkdfODcyM0EoIiVzIHR4IGhhbmdcbiIsIF9fZnVuY19fKTsKLQkJCQkJcnR3X3NyZXNldF9yZXNldChwYWRhcHRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2F1X3JlY3YuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhdV9yZWN2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZWM4NGIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2F1X3JlY3YuYworKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX1JUTDgxOTJDVV9SRUNWX0NfCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPHJlY3Zfb3NkZXAuaD4KLSNpbmNsdWRlIDxtbG1lX29zZGVwLmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgotI2luY2x1ZGUgPHVzYl9vcHMuaD4KLSNpbmNsdWRlIDx3aWZpLmg+Ci0jaW5jbHVkZSA8cnRsODcyM2FfaGFsLmg+Ci0KLWludCBydGw4NzIzYXVfaW5pdF9yZWN2X3ByaXYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYgPSAmcGFkYXB0ZXItPnJlY3Zwcml2OwotCWludCBpLCBzaXplLCByZXMgPSBfU1VDQ0VTUzsKLQlzdHJ1Y3QgcmVjdl9idWYgKnByZWN2YnVmOwotCXVuc2lnbmVkIGxvbmcgdG1wYWRkcjsKLQl1bnNpZ25lZCBsb25nIGFsaWdubWVudDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcHNrYjsKLQotCXRhc2tsZXRfaW5pdCgmcHJlY3Zwcml2LT5yZWN2X3Rhc2tsZXQsCi0JCSAgICAgKHZvaWQoKikodW5zaWduZWQgbG9uZykpcnRsODcyM2F1X3JlY3ZfdGFza2xldCwKLQkJICAgICAodW5zaWduZWQgbG9uZylwYWRhcHRlcik7Ci0KLQlwcmVjdnByaXYtPmludF9pbl91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghcHJlY3Zwcml2LT5pbnRfaW5fdXJiKQotCQlEQkdfODcyM0EoImFsbG9jX3VyYiBmb3IgaW50ZXJydXB0IGluIGVuZHBvaW50IGZhaWwgISEhIVxuIik7Ci0JcHJlY3Zwcml2LT5pbnRfaW5fYnVmID0ga3phbGxvYyhVU0JfSU5UUl9DT05URU5UX0xFTkdUSCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcmVjdnByaXYtPmludF9pbl9idWYpCi0JCURCR184NzIzQSgiYWxsb2NfbWVtIGZvciBpbnRlcnJ1cHQgaW4gZW5kcG9pbnQgZmFpbCAhISEhXG4iKTsKLQotCXNpemUgPSBOUl9SRUNWQlVGRiAqIHNpemVvZihzdHJ1Y3QgcmVjdl9idWYpOwotCXByZWN2cHJpdi0+cHJlY3ZfYnVmID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByZWN2cHJpdi0+cHJlY3ZfYnVmKSB7Ci0JCXJlcyA9IF9GQUlMOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJICJhbGxvYyByZWN2X2J1ZiBmYWlsIVxuIik7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwcmVjdmJ1ZiA9IChzdHJ1Y3QgcmVjdl9idWYgKilwcmVjdnByaXYtPnByZWN2X2J1ZjsKLQotCWZvciAoaSA9IDA7IGkgPCBOUl9SRUNWQlVGRjsgaSsrKSB7Ci0JCUlOSVRfTElTVF9IRUFEKCZwcmVjdmJ1Zi0+bGlzdCk7Ci0KLQkJcHJlY3ZidWYtPnB1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCQlpZiAoIXByZWN2YnVmLT5wdXJiKQotCQkJYnJlYWs7Ci0KLQkJcHJlY3ZidWYtPmFkYXB0ZXIgPSBwYWRhcHRlcjsKLQotCQlwcmVjdmJ1ZisrOwotCX0KLQotCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnByZWN2cHJpdi0+cnhfc2tiX3F1ZXVlKTsKLQlza2JfcXVldWVfaGVhZF9pbml0KCZwcmVjdnByaXYtPmZyZWVfcmVjdl9za2JfcXVldWUpOwotCi0JZm9yIChpID0gMDsgaSA8IE5SX1BSRUFMTE9DX1JFQ1ZfU0tCOyBpKyspIHsKLQkJc2l6ZSA9IE1BWF9SRUNWQlVGX1NaICsgUkVDVkJVRkZfQUxJR05fU1o7Ci0JCXBza2IgPSBfX25ldGRldl9hbGxvY19za2IocGFkYXB0ZXItPnBuZXRkZXYsIHNpemUsIEdGUF9LRVJORUwpOwotCi0JCWlmIChwc2tiKSB7Ci0JCQlwc2tiLT5kZXYgPSBwYWRhcHRlci0+cG5ldGRldjsKLQotCQkJdG1wYWRkciA9ICh1bnNpZ25lZCBsb25nKXBza2ItPmRhdGE7Ci0JCQlhbGlnbm1lbnQgPSB0bXBhZGRyICYgKFJFQ1ZCVUZGX0FMSUdOX1NaLTEpOwotCQkJc2tiX3Jlc2VydmUocHNrYiwgKFJFQ1ZCVUZGX0FMSUdOX1NaIC0gYWxpZ25tZW50KSk7Ci0KLQkJCXNrYl9xdWV1ZV90YWlsKCZwcmVjdnByaXYtPmZyZWVfcmVjdl9za2JfcXVldWUsIHBza2IpOwotCQl9Ci0KLQkJcHNrYiA9IE5VTEw7Ci0JfQotCi1leGl0OgotCXJldHVybiByZXM7Ci19Ci0KLXZvaWQgcnRsODcyM2F1X2ZyZWVfcmVjdl9wcml2KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JaW50CWk7Ci0Jc3RydWN0IHJlY3ZfYnVmCSpwcmVjdmJ1ZjsKLQlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYgPSAmcGFkYXB0ZXItPnJlY3Zwcml2OwotCi0JcHJlY3ZidWYgPSAoc3RydWN0IHJlY3ZfYnVmICopcHJlY3Zwcml2LT5wcmVjdl9idWY7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlJfUkVDVkJVRkY7IGkrKykgewotCQl1c2JfZnJlZV91cmIocHJlY3ZidWYtPnB1cmIpOwotCi0JCWlmIChwcmVjdmJ1Zi0+cHNrYikKLQkJCWRldl9rZnJlZV9za2JfYW55KHByZWN2YnVmLT5wc2tiKTsKLQotCQlwcmVjdmJ1ZisrOwotCX0KLQotCWtmcmVlKHByZWN2cHJpdi0+cHJlY3ZfYnVmKTsKLQotCXVzYl9mcmVlX3VyYihwcmVjdnByaXYtPmludF9pbl91cmIpOwotCWtmcmVlKHByZWN2cHJpdi0+aW50X2luX2J1Zik7Ci0KLQlpZiAoc2tiX3F1ZXVlX2xlbigmcHJlY3Zwcml2LT5yeF9za2JfcXVldWUpKQotCQlEQkdfODcyM0EoS0VSTl9XQVJOSU5HICJyeF9za2JfcXVldWUgbm90IGVtcHR5XG4iKTsKLQotCXNrYl9xdWV1ZV9wdXJnZSgmcHJlY3Zwcml2LT5yeF9za2JfcXVldWUpOwotCi0JaWYgKHNrYl9xdWV1ZV9sZW4oJnByZWN2cHJpdi0+ZnJlZV9yZWN2X3NrYl9xdWV1ZSkpIHsKLQkJREJHXzg3MjNBKEtFUk5fV0FSTklORyAiZnJlZV9yZWN2X3NrYl9xdWV1ZSBub3QgZW1wdHksICVkXG4iLAotCQkJICBza2JfcXVldWVfbGVuKCZwcmVjdnByaXYtPmZyZWVfcmVjdl9za2JfcXVldWUpKTsKLQl9Ci0KLQlza2JfcXVldWVfcHVyZ2UoJnByZWN2cHJpdi0+ZnJlZV9yZWN2X3NrYl9xdWV1ZSk7Ci19Ci0KLXN0cnVjdCByZWN2X3N0YXRfY3B1IHsKLQl1MzIgcnhkdzA7Ci0JdTMyIHJ4ZHcxOwotCXUzMiByeGR3MjsKLQl1MzIgcnhkdzM7Ci0JdTMyIHJ4ZHc0OwotCXUzMiByeGR3NTsKLX07Ci0KLXZvaWQgdXBkYXRlX3JlY3ZmcmFtZV9hdHRyaWIoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsCi0JCQkgICAgIHN0cnVjdCByZWN2X3N0YXQgKnByeHN0YXQpCi17Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWI7Ci0Jc3RydWN0IHJlY3Zfc3RhdF9jcHUgcmVwb3J0OwotCXN0cnVjdCByeHJlcG9ydF84NzIzYSAqcHJ4cmVwb3J0OwotCi0JcmVwb3J0LnJ4ZHcwID0gbGUzMl90b19jcHUocHJ4c3RhdC0+cnhkdzApOwotCXJlcG9ydC5yeGR3MSA9IGxlMzJfdG9fY3B1KHByeHN0YXQtPnJ4ZHcxKTsKLQlyZXBvcnQucnhkdzIgPSBsZTMyX3RvX2NwdShwcnhzdGF0LT5yeGR3Mik7Ci0JcmVwb3J0LnJ4ZHczID0gbGUzMl90b19jcHUocHJ4c3RhdC0+cnhkdzMpOwotCXJlcG9ydC5yeGR3NCA9IGxlMzJfdG9fY3B1KHByeHN0YXQtPnJ4ZHc0KTsKLQlyZXBvcnQucnhkdzUgPSBsZTMyX3RvX2NwdShwcnhzdGF0LT5yeGR3NSk7Ci0KLQlwcnhyZXBvcnQgPSAoc3RydWN0IHJ4cmVwb3J0Xzg3MjNhICopJnJlcG9ydDsKLQotCXBhdHRyaWIgPSAmcHJlY3ZmcmFtZS0+YXR0cmliOwotCW1lbXNldChwYXR0cmliLCAwLCBzaXplb2Yoc3RydWN0IHJ4X3BrdF9hdHRyaWIpKTsKLQotCS8qICB1cGRhdGUgcnggcmVwb3J0IHRvIHJlY3ZfZnJhbWUgYXR0cmlidXRlICovCi0JcGF0dHJpYi0+cGt0X2xlbiA9ICh1MTYpcHJ4cmVwb3J0LT5wa3RsZW47Ci0JcGF0dHJpYi0+ZHJ2aW5mb19zeiA9ICh1OCkocHJ4cmVwb3J0LT5kcnZpbmZvc2l6ZSA8PCAzKTsKLQlwYXR0cmliLT5waHlzdCA9ICh1OClwcnhyZXBvcnQtPnBoeXN0OwotCi0JcGF0dHJpYi0+Y3JjX2VyciA9ICh1OClwcnhyZXBvcnQtPmNyYzMyOwotCXBhdHRyaWItPmljdl9lcnIgPSAodTgpcHJ4cmVwb3J0LT5pY3ZlcnI7Ci0KLQlwYXR0cmliLT5iZGVjcnlwdGVkID0gKHU4KShwcnhyZXBvcnQtPnN3ZGVjID8gMCA6IDEpOwotCXBhdHRyaWItPmVuY3J5cHQgPSAodTgpcHJ4cmVwb3J0LT5zZWN1cml0eTsKLQotCXBhdHRyaWItPnFvcyA9ICh1OClwcnhyZXBvcnQtPnFvczsKLQlwYXR0cmliLT5wcmlvcml0eSA9ICh1OClwcnhyZXBvcnQtPnRpZDsKLQotCXBhdHRyaWItPmFtc2R1ID0gKHU4KXByeHJlcG9ydC0+YW1zZHU7Ci0KLQlwYXR0cmliLT5zZXFfbnVtID0gKHUxNilwcnhyZXBvcnQtPnNlcTsKLQlwYXR0cmliLT5mcmFnX251bSA9ICh1OClwcnhyZXBvcnQtPmZyYWc7Ci0JcGF0dHJpYi0+bWZyYWcgPSAodTgpcHJ4cmVwb3J0LT5tZjsKLQlwYXR0cmliLT5tZGF0YSA9ICh1OClwcnhyZXBvcnQtPm1kOwotCi0JcGF0dHJpYi0+bWNzX3JhdGUgPSAodTgpcHJ4cmVwb3J0LT5yeG1jczsKLQlwYXR0cmliLT5yeGh0ID0gKHU4KXByeHJlcG9ydC0+cnhodDsKLX0KLQotdm9pZCB1cGRhdGVfcmVjdmZyYW1lX3BoeWluZm8oc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsCi0JCQkgICAgICBzdHJ1Y3QgcGh5X3N0YXQgKnBwaHlfc3RhdHVzKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBwcmVjdmZyYW1lLT5hZGFwdGVyOwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2ZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgcGh5X2luZm8gKnBQSFlJbmZvID0gJnBhdHRyaWItPnBoeV9pbmZvOwotCXN0cnVjdCBvZG1fcGFja2V0X2luZm8gcGt0X2luZm87Ci0JdTggKnNhID0gTlVMTCwgKmRhOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXY7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCXN0cnVjdCBza19idWZmICpza2IgPSBwcmVjdmZyYW1lLT5wa3Q7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7Ci0JYm9vbCBtYXRjaGJzc2lkID0gZmFsc2U7Ci0JdTggKmJzc2lkOwotCi0JbWF0Y2hic3NpZCA9ICFpZWVlODAyMTFfaXNfY3RsKGhkci0+ZnJhbWVfY29udHJvbCkgJiYKLQkJICAgICAgIXBhdHRyaWItPmljdl9lcnIgJiYgIXBhdHRyaWItPmNyY19lcnI7Ci0KLQlpZiAobWF0Y2hic3NpZCkgewotCQlzd2l0Y2ggKGhkci0+ZnJhbWVfY29udHJvbCAmCi0JCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9UT0RTIHwKLQkJCQkgICAgSUVFRTgwMjExX0ZDVExfRlJPTURTKSkgewotCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX1RPRFMpOgotCQkJYnNzaWQgPSBoZHItPmFkZHIxOwotCQkJYnJlYWs7Ci0JCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfRlJPTURTKToKLQkJCWJzc2lkID0gaGRyLT5hZGRyMjsKLQkJCWJyZWFrOwotCQljYXNlIGNwdV90b19sZTE2KDApOgotCQkJYnNzaWQgPSBoZHItPmFkZHIzOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlic3NpZCA9IE5VTEw7Ci0JCQltYXRjaGJzc2lkID0gZmFsc2U7Ci0JCX0KLQotCQlpZiAoYnNzaWQpCi0JCQltYXRjaGJzc2lkID0gZXRoZXJfYWRkcl9lcXVhbCgKLQkJCQlnZXRfYnNzaWQoJnBhZGFwdGVyLT5tbG1lcHJpdiksIGJzc2lkKTsKLQl9Ci0KLQlwa3RfaW5mby5iUGFja2V0TWF0Y2hCU1NJRCA9IG1hdGNoYnNzaWQ7Ci0KLQlkYSA9IGllZWU4MDIxMV9nZXRfREEoaGRyKTsKLQlwa3RfaW5mby5iUGFja2V0VG9TZWxmID0gcGt0X2luZm8uYlBhY2tldE1hdGNoQlNTSUQgJiYKLQkJKCFtZW1jbXAoZGEsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwgRVRIX0FMRU4pKTsKLQotCXBrdF9pbmZvLmJQYWNrZXRCZWFjb24gPSBwa3RfaW5mby5iUGFja2V0TWF0Y2hCU1NJRCAmJgotCQlpZWVlODAyMTFfaXNfYmVhY29uKGhkci0+ZnJhbWVfY29udHJvbCk7Ci0KLQlwa3RfaW5mby5TdGF0aW9uSUQgPSAweEZGOwotCWlmIChwa3RfaW5mby5iUGFja2V0QmVhY29uKSB7Ci0JCWlmIChjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkgPT0gdHJ1ZSkKLQkJCXNhID0gcGFkYXB0ZXItPm1sbWVwcml2LmN1cl9uZXR3b3JrLm5ldHdvcmsuTWFjQWRkcmVzczsKLQkJLyogdG8gZG8gQWQtaG9jICovCi0JfSBlbHNlIHsKLQkJc2EgPSBpZWVlODAyMTFfZ2V0X1NBKGhkcik7Ci0JfQotCi0JcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgc2EpOwotCWlmIChwc3RhKSB7Ci0JCXBrdF9pbmZvLlN0YXRpb25JRCA9IHBzdGEtPm1hY19pZDsKLQkJLyogcHJpbnRrKCIlcyA9PT4gU3RhdGlvbklEKCVkKVxuIiwgX19mdW5jX18sIHBrdF9pbmZvLlN0YXRpb25JRCk7ICovCi0JfQotCXBrdF9pbmZvLlJhdGUgPSBwYXR0cmliLT5tY3NfcmF0ZTsKLQotCU9ETV9QaHlTdGF0dXNRdWVyeTIzYSgmcEhhbERhdGEtPm9kbXByaXYsIHBQSFlJbmZvLAotCQkJICAgICAgKHU4ICopcHBoeV9zdGF0dXMsICZwa3RfaW5mbyk7Ci0JcHJlY3ZmcmFtZS0+cHN0YSA9IE5VTEw7Ci0JaWYgKHBrdF9pbmZvLmJQYWNrZXRNYXRjaEJTU0lEICYmCi0JICAgIChjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIFdJRklfQVBfU1RBVEUpID09IHRydWUpKSB7Ci0JCWlmIChwc3RhKSB7Ci0JCQlwcmVjdmZyYW1lLT5wc3RhID0gcHN0YTsKLQkJCXJ0bDg3MjNhX3Byb2Nlc3NfcGh5X2luZm8ocGFkYXB0ZXIsIHByZWN2ZnJhbWUpOwotCQl9Ci0JfSBlbHNlIGlmIChwa3RfaW5mby5iUGFja2V0VG9TZWxmIHx8IHBrdF9pbmZvLmJQYWNrZXRCZWFjb24pIHsKLQkJaWYgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwKLQkJCQkgIFdJRklfQURIT0NfU1RBVEV8V0lGSV9BREhPQ19NQVNURVJfU1RBVEUpID09Ci0JCSAgICB0cnVlKSB7Ci0JCQlpZiAocHN0YSkKLQkJCQlwcmVjdmZyYW1lLT5wc3RhID0gcHN0YTsKLQkJfQotCQlydGw4NzIzYV9wcm9jZXNzX3BoeV9pbmZvKHBhZGFwdGVyLCBwcmVjdmZyYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYXVfeG1pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2F1X3htaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3NDZkZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYXVfeG1pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfUlRMODE5MkNfWE1JVF9DXwotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLSNpbmNsdWRlIDx3aWZpLmg+Ci0jaW5jbHVkZSA8b3NkZXBfaW50Zi5oPgotI2luY2x1ZGUgPHVzYl9vcHMuaD4KLS8qIGluY2x1ZGUgPHJ0bDgxOTJjX2hhbC5oPiAqLwotI2luY2x1ZGUgPHJ0bDg3MjNhX2hhbC5oPgotCi1zdGF0aWMgaW50IHVyYl96ZXJvX3BhY2tldF9jaGsoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgaW50IHN6KQotewotCWludCBibG5TZXRUeERlc2NPZmZzZXQ7Ci0Jc3RydWN0IGR2b2JqX3ByaXYJKnBkdm9iaiA9IGFkYXB0ZXJfdG9fZHZvYmoocGFkYXB0ZXIpOwotCi0JaWYgKHBkdm9iai0+aXNoaWdoc3BlZWQpIHsKLQkJaWYgKCgoc3ogKyBUWERFU0NfU0laRSkgJSA1MTIpID09IDApCi0JCQlibG5TZXRUeERlc2NPZmZzZXQgPSAxOwotCQllbHNlCi0JCQlibG5TZXRUeERlc2NPZmZzZXQgPSAwOwotCX0gZWxzZSB7Ci0JCWlmICgoKHN6ICsgVFhERVNDX1NJWkUpICUgNjQpID09IDApCi0JCQlibG5TZXRUeERlc2NPZmZzZXQgPSAxOwotCQllbHNlCi0JCQlibG5TZXRUeERlc2NPZmZzZXQgPSAwOwotCX0KLQlyZXR1cm4gYmxuU2V0VHhEZXNjT2Zmc2V0OwotfQotCi1zdGF0aWMgdm9pZCBydGw4MTkyY3VfY2FsX3R4ZGVzY19jaGtzdW0oc3RydWN0IHR4X2Rlc2MJKnB0eGRlc2MpCi17Ci0JCV9fbGUxNgkqdXNQdHIgPSAoX19sZTE2ICopcHR4ZGVzYzsKLQkJdTMyIGNvdW50ID0gMTY7CQkvKiAgKDMyIGJ5dGVzIC8gMiBieXRlcyBwZXIgWE9SKSA9PiAxNiB0aW1lcyAqLwotCQl1MzIgaW5kZXg7Ci0JCXUxNiBjaGVja3N1bSA9IDA7Ci0KLQkJLyogQ2xlYXIgZmlyc3QgKi8KLQkJcHR4ZGVzYy0+dHhkdzcgJj0gY3B1X3RvX2xlMzIoMHhmZmZmMDAwMCk7Ci0KLQkJZm9yIChpbmRleCA9IDAgOyBpbmRleCA8IGNvdW50IDsgaW5kZXgrKykKLQkJCWNoZWNrc3VtID0gY2hlY2tzdW0gXiBsZTE2X3RvX2NwdSgqKHVzUHRyICsgaW5kZXgpKTsKLQotCQlwdHhkZXNjLT50eGR3NyB8PSBjcHVfdG9fbGUzMigweDAwMDBmZmZmJmNoZWNrc3VtKTsKLX0KLQotc3RhdGljIHZvaWQgZmlsbF90eGRlc2Nfc2VjdHlwZShzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYiwgc3RydWN0IHR4X2Rlc2MgKnB0eGRlc2MpCi17Ci0JaWYgKChwYXR0cmliLT5lbmNyeXB0ID4gMCkgJiYgIXBhdHRyaWItPmJzd2VuYykgewotCQlzd2l0Y2ggKHBhdHRyaWItPmVuY3J5cHQpIHsKLQkJLyogU0VDX1RZUEUgKi8KLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6Ci0JCQlwdHhkZXNjLT50eGR3MSB8PSBjcHVfdG9fbGUzMigoMHgwMTw8MjIpJjB4MDBjMDAwMDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDoKLQkJCS8qIHB0eGRlc2MtPnR4ZHcxIHw9IGNwdV90b19sZTMyKCgweDAyPDwyMikmMHgwMGMwMDAwMCk7ICovCi0JCQlwdHhkZXNjLT50eGR3MSB8PSBjcHVfdG9fbGUzMigoMHgwMTw8MjIpJjB4MDBjMDAwMDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKLQkJCXB0eGRlc2MtPnR4ZHcxIHw9IGNwdV90b19sZTMyKCgweDAzPDwyMikmMHgwMGMwMDAwMCk7Ci0JCQlicmVhazsKLQkJY2FzZSAwOgotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGZpbGxfdHhkZXNjX3ZjcyhzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYiwgX19sZTMyICpwZHcpCi17Ci0JLyogREJHXzg3MjNBKCJjdnNfbW9kZSA9JWRcbiIsIHBhdHRyaWItPnZjc19tb2RlKTsgKi8KLQotCXN3aXRjaCAocGF0dHJpYi0+dmNzX21vZGUpIHsKLQljYXNlIFJUU19DVFM6Ci0JCSpwZHcgfD0gY3B1X3RvX2xlMzIoQklUKDEyKSk7Ci0JCWJyZWFrOwotCWNhc2UgQ1RTX1RPX1NFTEY6Ci0JCSpwZHcgfD0gY3B1X3RvX2xlMzIoQklUKDExKSk7Ci0JCWJyZWFrOwotCWNhc2UgTk9ORV9WQ1M6Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHBhdHRyaWItPnZjc19tb2RlKSB7Ci0JCSpwZHcgfD0gY3B1X3RvX2xlMzIoQklUKDEzKSk7Ci0KLQkJLyogIFNldCBSVFMgQlcgKi8KLQkJaWYgKHBhdHRyaWItPmh0X2VuKSB7Ci0JCQkqcGR3IHw9IChwYXR0cmliLT5id21vZGUmSFRfQ0hBTk5FTF9XSURUSF80MCkgPwljcHVfdG9fbGUzMihCSVQoMjcpKSA6IDA7Ci0KLQkJCWlmIChwYXR0cmliLT5jaF9vZmZzZXQgPT0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0xPV0VSKQotCQkJCSpwZHcgfD0gY3B1X3RvX2xlMzIoKDB4MDE8PDI4KSYweDMwMDAwMDAwKTsKLQkJCWVsc2UgaWYgKHBhdHRyaWItPmNoX29mZnNldCA9PSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfVVBQRVIpCi0JCQkJKnBkdyB8PSBjcHVfdG9fbGUzMigoMHgwMjw8MjgpJjB4MzAwMDAwMDApOwotCQkJZWxzZSBpZiAocGF0dHJpYi0+Y2hfb2Zmc2V0ID09IEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkUpCi0JCQkJKnBkdyB8PSAwOwotCQkJZWxzZQotCQkJCSpwZHcgfD0gY3B1X3RvX2xlMzIoKDB4MDM8PDI4KSYweDMwMDAwMDAwKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgZmlsbF90eGRlc2NfcGh5KHN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliLCBfX2xlMzIgKnBkdykKLXsKLQlpZiAocGF0dHJpYi0+aHRfZW4pIHsKLQkJKnBkdyB8PSAocGF0dHJpYi0+Yndtb2RlJkhUX0NIQU5ORUxfV0lEVEhfNDApID8gY3B1X3RvX2xlMzIoQklUKDI1KSkgOiAwOwotCi0JCWlmIChwYXR0cmliLT5jaF9vZmZzZXQgPT0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0xPV0VSKQotCQkJKnBkdyB8PSBjcHVfdG9fbGUzMigoMHgwMTw8MjApJjB4MDAzZjAwMDApOwotCQllbHNlIGlmIChwYXR0cmliLT5jaF9vZmZzZXQgPT0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX1VQUEVSKQotCQkJKnBkdyB8PSBjcHVfdG9fbGUzMigoMHgwMjw8MjApJjB4MDAzZjAwMDApOwotCQllbHNlIGlmIChwYXR0cmliLT5jaF9vZmZzZXQgPT0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRSkKLQkJCSpwZHcgfD0gMDsKLQkJZWxzZQotCQkJKnBkdyB8PSBjcHVfdG9fbGUzMigoMHgwMzw8MjApJjB4MDAzZjAwMDApOwotCX0KLX0KLQotc3RhdGljIHMzMiB1cGRhdGVfdHhkZXNjKHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lLCB1OCAqcG1lbSwgczMyIHN6KQotewotCWludAlwdWxsID0gMDsKLQl1aW50CXFzZWw7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyCSpwYWRhcHRlciA9IHB4bWl0ZnJhbWUtPnBhZGFwdGVyOwotCXN0cnVjdCBwa3RfYXR0cmliCSpwYXR0cmliID0gJnB4bWl0ZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EJKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgZG1fcHJpdgkqcGRtcHJpdiA9ICZwSGFsRGF0YS0+ZG1wcml2OwotCXN0cnVjdCB0eF9kZXNjCSpwdHhkZXNjID0gKHN0cnVjdCB0eF9kZXNjICopcG1lbTsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCWludAlibWNzdCA9IGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHBhdHRyaWItPnJhKTsKLQotCWlmICh1cmJfemVyb19wYWNrZXRfY2hrKHBhZGFwdGVyLCBzeikgPT0gMCkgewotCQlwdHhkZXNjID0gKHN0cnVjdCB0eF9kZXNjICopKHBtZW0rUEFDS0VUX09GRlNFVF9TWik7Ci0JCXB1bGwgPSAxOwotCQlweG1pdGZyYW1lLT5wa3Rfb2Zmc2V0LS07Ci0JfQotCi0JbWVtc2V0KHB0eGRlc2MsIDAsIHNpemVvZihzdHJ1Y3QgdHhfZGVzYykpOwotCi0JaWYgKHB4bWl0ZnJhbWUtPmZyYW1lX3RhZyA9PSBEQVRBX0ZSQU1FVEFHKSB7Ci0JCS8qIG9mZnNldCA0ICovCi0JCXB0eGRlc2MtPnR4ZHcxIHw9IGNwdV90b19sZTMyKHBhdHRyaWItPm1hY19pZCYweDFmKTsKLQotCQlxc2VsID0gKHVpbnQpKHBhdHRyaWItPnFzZWwgJiAweDAwMDAwMDFmKTsKLQkJcHR4ZGVzYy0+dHhkdzEgfD0gY3B1X3RvX2xlMzIoKHFzZWwgPDwgUVNFTF9TSFQpICYgMHgwMDAwMWYwMCk7Ci0KLQkJcHR4ZGVzYy0+dHhkdzEgfD0gY3B1X3RvX2xlMzIoKHBhdHRyaWItPnJhaWQ8PDE2KSAmIDB4MDAwZjAwMDApOwotCi0JCWZpbGxfdHhkZXNjX3NlY3R5cGUocGF0dHJpYiwgcHR4ZGVzYyk7Ci0KLQkJaWYgKHBhdHRyaWItPmFtcGR1X2VuKQotCQkJcHR4ZGVzYy0+dHhkdzEgfD0gY3B1X3RvX2xlMzIoQklUKDUpKTsvKiBBR0cgRU4gKi8KLQkJZWxzZQotCQkJcHR4ZGVzYy0+dHhkdzEgfD0gY3B1X3RvX2xlMzIoQklUKDYpKTsvKiBBR0cgQksgKi8KLQotCQkvKiBvZmZzZXQgOCAqLwotCi0JCS8qIG9mZnNldCAxMiAqLwotCQlwdHhkZXNjLT50eGR3MyB8PSBjcHVfdG9fbGUzMigocGF0dHJpYi0+c2VxbnVtPDwxNikmMHhmZmZmMDAwMCk7Ci0KLQkJLyogb2Zmc2V0IDE2ICwgb2Zmc2V0IDIwICovCi0JCWlmIChwYXR0cmliLT5xb3NfZW4pCi0JCQlwdHhkZXNjLT50eGR3NCB8PSBjcHVfdG9fbGUzMihCSVQoNikpOy8qIFFvUyAqLwotCi0JCWlmICgocGF0dHJpYi0+ZXRoZXJfdHlwZSAhPSAweDg4OGUpICYmCi0JCSAgICAocGF0dHJpYi0+ZXRoZXJfdHlwZSAhPSAweDA4MDYpICYmCi0JCSAgICAocGF0dHJpYi0+ZGhjcF9wa3QgIT0gMSkpIHsKLQkJCS8qIE5vbiBFQVAgJiBBUlAgJiBESENQIHR5cGUgZGF0YSBwYWNrZXQgKi8KLQotCQkJZmlsbF90eGRlc2NfdmNzKHBhdHRyaWIsICZwdHhkZXNjLT50eGR3NCk7Ci0JCQlmaWxsX3R4ZGVzY19waHkocGF0dHJpYiwgJnB0eGRlc2MtPnR4ZHc0KTsKLQotCQkJcHR4ZGVzYy0+dHhkdzQgfD0gY3B1X3RvX2xlMzIoMHgwMDAwMDAwOCk7LyogUlRTIFJhdGUgPSAyNE0gKi8KLQkJCXB0eGRlc2MtPnR4ZHc1IHw9IGNwdV90b19sZTMyKDB4MDAwMWZmMDApOy8qICAqLwotCi0JCQkvKiB1c2UgUkVHX0lOSURBVEFfUkFURV9TRUwgdmFsdWUgKi8KLQkJCXB0eGRlc2MtPnR4ZHc1IHw9IGNwdV90b19sZTMyKHBkbXByaXYtPklOSURBVEFfUkFURVtwYXR0cmliLT5tYWNfaWRdKTsKLQkJfSBlbHNlIHsKLQkJCS8qICBFQVAgZGF0YSBwYWNrZXQgYW5kIEFSUCBwYWNrZXQuICovCi0JCQkvKiAgVXNlIHRoZSAxTSBkYXRhIHJhdGUgdG8gc2VuZCB0aGUgRUFQL0FSUCBwYWNrZXQuICovCi0JCQkvKiAgVGhpcyB3aWxsIG1heWJlIG1ha2UgdGhlIGhhbmRzaGFrZSBzbW9vdGguICovCi0KLQkJCXB0eGRlc2MtPnR4ZHcxIHw9IGNwdV90b19sZTMyKEJJVCg2KSk7LyogQUdHIEJLICovCi0KLQkJCXB0eGRlc2MtPnR4ZHc0IHw9IGNwdV90b19sZTMyKEJJVCg4KSk7LyogZHJpdmVyIHVzZXMgcmF0ZSAqLwotCi0JCQlpZiAocG1sbWVpbmZvLT5wcmVhbWJsZV9tb2RlID09IFBSRUFNQkxFX1NIT1JUKQotCQkJCXB0eGRlc2MtPnR4ZHc0IHw9IGNwdV90b19sZTMyKEJJVCgyNCkpOy8qICBEQVRBX1NIT1JUICovCi0KLQkJCXB0eGRlc2MtPnR4ZHc1IHw9IGNwdV90b19sZTMyKE1SYXRlVG9Id1JhdGUyM2EocG1sbWVleHQtPnR4X3JhdGUpKTsKLQkJfQotCX0gZWxzZSBpZiAocHhtaXRmcmFtZS0+ZnJhbWVfdGFnID09IE1HTlRfRlJBTUVUQUcpIHsKLQkJLyogb2Zmc2V0IDQgKi8KLQkJcHR4ZGVzYy0+dHhkdzEgfD0gY3B1X3RvX2xlMzIocGF0dHJpYi0+bWFjX2lkJjB4MWYpOwotCi0JCXFzZWwgPSAodWludCkocGF0dHJpYi0+cXNlbCYweDAwMDAwMDFmKTsKLQkJcHR4ZGVzYy0+dHhkdzEgfD0gY3B1X3RvX2xlMzIoKHFzZWw8PFFTRUxfU0hUKSYweDAwMDAxZjAwKTsKLQotCQlwdHhkZXNjLT50eGR3MSB8PSBjcHVfdG9fbGUzMigocGF0dHJpYi0+cmFpZDw8MTYpICYgMHgwMDBmMDAwMCk7Ci0KLQkJLyogb2Zmc2V0IDggKi8KLQkJLyogQ0NYLVRYUlBUIGFjayBmb3IgeG1pdCBtZ210IGZyYW1lcy4gKi8KLQkJaWYgKHB4bWl0ZnJhbWUtPmFja19yZXBvcnQpCi0JCQlwdHhkZXNjLT50eGR3MiB8PSBjcHVfdG9fbGUzMihCSVQoMTkpKTsKLQotCQkvKiBvZmZzZXQgMTIgKi8KLQkJcHR4ZGVzYy0+dHhkdzMgfD0gY3B1X3RvX2xlMzIoKHBhdHRyaWItPnNlcW51bTw8MTYpJjB4ZmZmZjAwMDApOwotCi0JCS8qIG9mZnNldCAxNiAqLwotCQlwdHhkZXNjLT50eGR3NCB8PSBjcHVfdG9fbGUzMihCSVQoOCkpOy8qIGRyaXZlciB1c2VzIHJhdGUgKi8KLQotCQkvKiBvZmZzZXQgMjAgKi8KLQkJcHR4ZGVzYy0+dHhkdzUgfD0gY3B1X3RvX2xlMzIoQklUKDE3KSk7LyogcmV0cnkgbGltaXQgZW5hYmxlICovCi0JCXB0eGRlc2MtPnR4ZHc1IHw9IGNwdV90b19sZTMyKDB4MDAxODAwMDApOy8qIHJldHJ5IGxpbWl0ID0gNiAqLwotCi0JCXB0eGRlc2MtPnR4ZHc1IHw9IGNwdV90b19sZTMyKE1SYXRlVG9Id1JhdGUyM2EocG1sbWVleHQtPnR4X3JhdGUpKTsKLQl9IGVsc2UgaWYgKHB4bWl0ZnJhbWUtPmZyYW1lX3RhZyA9PSBUWEFHR19GUkFNRVRBRykgewotCQlEQkdfODcyM0EoInB4bWl0ZnJhbWUtPmZyYW1lX3RhZyA9PSBUWEFHR19GUkFNRVRBR1xuIik7Ci0JfSBlbHNlIHsKLQkJREJHXzg3MjNBKCJweG1pdGZyYW1lLT5mcmFtZV90YWcgPSAlZFxuIiwKLQkJCSAgcHhtaXRmcmFtZS0+ZnJhbWVfdGFnKTsKLQotCQkvKiBvZmZzZXQgNCAqLwotCQlwdHhkZXNjLT50eGR3MSB8PSBjcHVfdG9fbGUzMigoNCkmMHgxZik7LyogQ0FNX0lEKE1BQ19JRCkgKi8KLQotCQlwdHhkZXNjLT50eGR3MSB8PSBjcHVfdG9fbGUzMigoNjw8MTYpICYgMHgwMDBmMDAwMCk7LyogcmFpZCAqLwotCi0JCS8qIG9mZnNldCA4ICovCi0KLQkJLyogb2Zmc2V0IDEyICovCi0JCXB0eGRlc2MtPnR4ZHczIHw9IGNwdV90b19sZTMyKChwYXR0cmliLT5zZXFudW08PDE2KSYweGZmZmYwMDAwKTsKLQotCQkvKiBvZmZzZXQgMTYgKi8KLQkJcHR4ZGVzYy0+dHhkdzQgfD0gY3B1X3RvX2xlMzIoQklUKDgpKTsvKiBkcml2ZXIgdXNlcyByYXRlICovCi0KLQkJLyogb2Zmc2V0IDIwICovCi0JCXB0eGRlc2MtPnR4ZHc1IHw9IGNwdV90b19sZTMyKE1SYXRlVG9Id1JhdGUyM2EocG1sbWVleHQtPnR4X3JhdGUpKTsKLQl9Ci0KLQkvKiAgKDEpIFRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgZWFjaCBub24tUW9zIGZyYW1lIC8gYnJvYWRjYXN0IC8gbXVsdGljYXN0IC8gKi8KLQkvKiAgbWdudCBmcmFtZSBzaG91bGQgYmUgY29udHJvbGxlZCBieSBIdyBiZWNhdXNlIEZ3IHdpbGwgYWxzbyBzZW5kIG51bGwgZGF0YSAqLwotCS8qICB3aGljaCB3ZSBjYW5ub3QgY29udHJvbCB3aGVuIEZ3IExQUyBlbmFibGUuICovCi0JLyogIC0tPiBkZWZhdWx0IGVuYWJsZSBub24tUW9zIGRhdGEgc2VxdWVuc2UgbnVtYmVyLiAyMDEwLjA2LjIzLiBieSB0eW5saS4gKi8KLQkvKiAgKDIpIEVuYWJsZSBIVyBTRVEgY29udHJvbCBmb3IgYmVhY29uIHBhY2tldCwgYmVjYXVzZSB3ZSB1c2UgSHcgYmVhY29uLiAqLwotCS8qICAoMykgVXNlIEhXIFFvcyBTRVEgdG8gY29udHJvbCB0aGUgc2VxIG51bSBvZiBFeHQgcG9ydCBub24tUW9zIHBhY2tldHMuICovCi0JaWYgKCFwYXR0cmliLT5xb3NfZW4pIHsKLQkJLyogIEh3IHNldCBzZXF1ZW5jZSBudW1iZXIgKi8KLQkJcHR4ZGVzYy0+dHhkdzQgfD0gY3B1X3RvX2xlMzIoQklUKDcpKTsKLQkJLyogc2V0IGJpdDMgdG8gMS4gKi8KLQkJcHR4ZGVzYy0+dHhkdzMgfD0gY3B1X3RvX2xlMzIoKDggPDwgMjgpKTsKLQl9Ci0KLQkvKiBvZmZzZXQgMCAqLwotCXB0eGRlc2MtPnR4ZHcwIHw9IGNwdV90b19sZTMyKHN6JjB4MDAwMGZmZmYpOwotCXB0eGRlc2MtPnR4ZHcwIHw9IGNwdV90b19sZTMyKE9XTiB8IEZTRyB8IExTRyk7Ci0JcHR4ZGVzYy0+dHhkdzAgfD0gY3B1X3RvX2xlMzIoKChUWERFU0NfU0laRStPRkZTRVRfU1opPDxPRkZTRVRfU0hUKSYweDAwZmYwMDAwKTsvKiAzMiBieXRlcyBmb3IgVFggRGVzYyAqLwotCi0JaWYgKGJtY3N0KQotCQlwdHhkZXNjLT50eGR3MCB8PSBjcHVfdG9fbGUzMihCSVQoMjQpKTsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLAotCQkgIm9mZnNldDAtdHhkZXNjID0gMHgleFxuIiwgcHR4ZGVzYy0+dHhkdzApOwotCi0JLyogb2Zmc2V0IDQgKi8KLQkvKiAgcGt0X29mZnNldCwgdW5pdDo4IGJ5dGVzIHBhZGRpbmcgKi8KLQlpZiAocHhtaXRmcmFtZS0+cGt0X29mZnNldCA+IDApCi0JCXB0eGRlc2MtPnR4ZHcxIHw9IGNwdV90b19sZTMyKChweG1pdGZyYW1lLT5wa3Rfb2Zmc2V0IDw8IDI2KSAmIDB4N2MwMDAwMDApOwotCi0JcnRsODE5MmN1X2NhbF90eGRlc2NfY2hrc3VtKHB0eGRlc2MpOwotCXJldHVybiBwdWxsOwotfQotCi1zdGF0aWMgaW50IHJ0d19kdW1wX3hmcmFtZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCi17Ci0JaW50IHJldCA9IF9TVUNDRVNTOwotCWludCBpbm5lcl9yZXQgPSBfU1VDQ0VTUzsKLQlpbnQgdCwgc3osIHdfc3osIHB1bGwgPSAwOwotCXU4ICptZW1fYWRkcjsKLQl1MzIgZmZfaHdhZGRyOwotCXN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYgPSBweG1pdGZyYW1lLT5weG1pdGJ1ZjsKLQlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZweG1pdGZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQotCWlmIChweG1pdGZyYW1lLT5mcmFtZV90YWcgPT0gREFUQV9GUkFNRVRBRyAmJgotCSAgICBweG1pdGZyYW1lLT5hdHRyaWIuZXRoZXJfdHlwZSAhPSBFVEhfUF9BUlAgJiYKLQkgICAgcHhtaXRmcmFtZS0+YXR0cmliLmV0aGVyX3R5cGUgIT0gRVRIX1BfUEFFICYmCi0JICAgIHB4bWl0ZnJhbWUtPmF0dHJpYi5kaGNwX3BrdCAhPSAxKQotCQlydHdfaXNzdWVfYWRkYmFyZXFfY21kMjNhKHBhZGFwdGVyLCBweG1pdGZyYW1lKTsKLQotCW1lbV9hZGRyID0gcHhtaXRmcmFtZS0+YnVmX2FkZHI7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywgInJ0d19kdW1wX3hmcmFtZSgpXG4iKTsKLQotCWZvciAodCA9IDA7IHQgPCBwYXR0cmliLT5ucl9mcmFnczsgdCsrKSB7Ci0JCWlmIChpbm5lcl9yZXQgIT0gX1NVQ0NFU1MgJiYgcmV0ID09IF9TVUNDRVNTKQotCQkJcmV0ID0gX0ZBSUw7Ci0KLQkJaWYgKHQgIT0gKHBhdHRyaWItPm5yX2ZyYWdzIC0gMSkpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJwYXR0cmliLT5ucl9mcmFncyA9JWRcbiIsIHBhdHRyaWItPm5yX2ZyYWdzKTsKLQotCQkJc3ogPSBweG1pdHByaXYtPmZyYWdfbGVuOwotCQkJc3ogPSBzeiAtIDQgLSBwYXR0cmliLT5pY3ZfbGVuOwotCQl9IGVsc2UgewotCQkJLyogbm8gZnJhZyAqLwotCQkJc3ogPSBwYXR0cmliLT5sYXN0X3R4Y21kc3o7Ci0JCX0KLQotCQlwdWxsID0gdXBkYXRlX3R4ZGVzYyhweG1pdGZyYW1lLCBtZW1fYWRkciwgc3opOwotCi0JCWlmIChwdWxsKSB7Ci0JCQltZW1fYWRkciArPSBQQUNLRVRfT0ZGU0VUX1NaOyAvKiBwdWxsIHR4ZGVzYyBoZWFkICovCi0KLQkJCXB4bWl0ZnJhbWUtPmJ1Zl9hZGRyID0gbWVtX2FkZHI7Ci0KLQkJCXdfc3ogPSBzeiArIFRYREVTQ19TSVpFOwotCQl9IGVsc2UgewotCQkJd19zeiA9IHN6ICsgVFhERVNDX1NJWkUgKyBQQUNLRVRfT0ZGU0VUX1NaOwotCQl9Ci0KLQkJZmZfaHdhZGRyID0gcnR3X2dldF9mZl9od2FkZHIyM2EocHhtaXRmcmFtZSk7Ci0JCWlubmVyX3JldCA9IHJ0bDg3MjNhdV93cml0ZV9wb3J0KHBhZGFwdGVyLCBmZl9od2FkZHIsCi0JCQkJCQkgd19zeiwgcHhtaXRidWYpOwotCQlydHdfY291bnRfdHhfc3RhdHMyM2EocGFkYXB0ZXIsIHB4bWl0ZnJhbWUsIHN6KTsKLQotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAicnR3X3dyaXRlX3BvcnQsIHdfc3ogPSVkXG4iLCB3X3N6KTsKLQotCQltZW1fYWRkciArPSB3X3N6OwotCi0JCW1lbV9hZGRyID0gUFRSX0FMSUdOKG1lbV9hZGRyLCA0KTsKLQl9Ci0KLQlydHdfZnJlZV94bWl0ZnJhbWUyM2EocHhtaXRwcml2LCBweG1pdGZyYW1lKTsKLQotCWlmICAocmV0ICE9IF9TVUNDRVNTKQotCQlydHcyM2Ffc2N0eF9kb25lX2VycigmcHhtaXRidWYtPnNjdHgsIFJUV19TQ1RYX0RPTkVfVU5LTk9XTik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1ib29sIHJ0bDg3MjNhdV94bWl0ZnJhbWVfY29tcGxldGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgIHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiwKLQkJCQkgIHN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYpCi17Ci0Jc3RydWN0IGh3X3htaXQgKnBod3htaXRzOwotCXN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lOwotCWludCBod2VudHJ5OwotCWludCByZXMgPSBfU1VDQ0VTUywgeGNudCA9IDA7Ci0KLQlwaHd4bWl0cyA9IHB4bWl0cHJpdi0+aHd4bWl0czsKLQlod2VudHJ5ID0gcHhtaXRwcml2LT5od3htaXRfZW50cnk7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywgInhtaXRmcmFtZV9jb21wbGV0ZSgpXG4iKTsKLQotCWlmIChweG1pdGJ1ZiA9PSBOVUxMKSB7Ci0JCXB4bWl0YnVmID0gcnR3X2FsbG9jX3htaXRidWYyM2EocHhtaXRwcml2KTsKLQkJaWYgKCFweG1pdGJ1ZikKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0JcHhtaXRmcmFtZSA9ICBydHdfZGVxdWV1ZV94ZnJhbWUyM2EocHhtaXRwcml2LCBwaHd4bWl0cywgaHdlbnRyeSk7Ci0KLQlpZiAocHhtaXRmcmFtZSkgewotCQlweG1pdGZyYW1lLT5weG1pdGJ1ZiA9IHB4bWl0YnVmOwotCi0JCXB4bWl0ZnJhbWUtPmJ1Zl9hZGRyID0gcHhtaXRidWYtPnBidWY7Ci0KLQkJcHhtaXRidWYtPnByaXZfZGF0YSA9IHB4bWl0ZnJhbWU7Ci0KLQkJaWYgKHB4bWl0ZnJhbWUtPmZyYW1lX3RhZyA9PSBEQVRBX0ZSQU1FVEFHKSB7Ci0JCQlpZiAocHhtaXRmcmFtZS0+YXR0cmliLnByaW9yaXR5IDw9IDE1KS8qIFRJRDB+MTUgKi8KLQkJCQlyZXMgPSBydHdfeG1pdGZyYW1lX2NvYWxlc2NlMjNhKHBhZGFwdGVyLCBweG1pdGZyYW1lLT5wa3QsIHB4bWl0ZnJhbWUpOwotCi0JCQlydHdfb3NfeG1pdF9jb21wbGV0ZTIzYShwYWRhcHRlciwgcHhtaXRmcmFtZSk7LyogYWx3YXlzIHJldHVybiBuZGlzX3BhY2tldCBhZnRlciBydHdfeG1pdGZyYW1lX2NvYWxlc2NlMjNhICovCi0JCX0KLQotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAieG1pdGZyYW1lX2NvbXBsZXRlKCk6IHJ0d19kdW1wX3hmcmFtZVxuIik7Ci0KLQkJaWYgKHJlcyA9PSBfU1VDQ0VTUykgewotCQkJcnR3X2R1bXBfeGZyYW1lKHBhZGFwdGVyLCBweG1pdGZyYW1lKTsKLQkJfSBlbHNlIHsKLQkJCXJ0d19mcmVlX3htaXRidWYyM2EocHhtaXRwcml2LCBweG1pdGJ1Zik7Ci0JCQlydHdfZnJlZV94bWl0ZnJhbWUyM2EocHhtaXRwcml2LCBweG1pdGZyYW1lKTsKLQkJfQotCQl4Y250Kys7Ci0JfSBlbHNlIHsKLQkJcnR3X2ZyZWVfeG1pdGJ1ZjIzYShweG1pdHByaXYsIHB4bWl0YnVmKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGludCB4bWl0ZnJhbWVfZGlyZWN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCi17Ci0JaW50IHJlczsKLQotCXJlcyA9IHJ0d194bWl0ZnJhbWVfY29hbGVzY2UyM2EocGFkYXB0ZXIsIHB4bWl0ZnJhbWUtPnBrdCwgcHhtaXRmcmFtZSk7Ci0JaWYgKHJlcyA9PSBfU1VDQ0VTUykKLQkJcnR3X2R1bXBfeGZyYW1lKHBhZGFwdGVyLCBweG1pdGZyYW1lKTsKLQlyZXR1cm4gcmVzOwotfQotCi0vKgotICogUmV0dXJuCi0gKgl0cnVlCWR1bXAgcGFja2V0IGRpcmVjdGx5Ci0gKglmYWxzZQllbnF1ZXVlIHBhY2tldAotICovCi1ib29sIHJ0bDg3MjNhdV9oYWxfeG1pdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCi17Ci0JaW50IHJlczsKLQlzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmID0gTlVMTDsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliID0gJnB4bWl0ZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCi0JcGF0dHJpYi0+cXNlbCA9IHBhdHRyaWItPnByaW9yaXR5OwotCXNwaW5fbG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCWlmICh4bWl0ZnJhbWVfZW5xdWV1ZV9mb3Jfc2xlZXBpbmdfc3RhMjNhKHBhZGFwdGVyLCBweG1pdGZyYW1lKSkgewotCQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0JCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0KLQkJc3Bpbl91bmxvY2tfYmgoJnB4bWl0cHJpdi0+bG9jayk7Ci0KLQkJaWYgKHBhdHRyaWItPnBzdGEpCi0JCQlwc3RhID0gcGF0dHJpYi0+cHN0YTsKLQkJZWxzZQotCQkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgcGF0dHJpYi0+cmEpOwotCi0JCWlmIChwc3RhKSB7Ci0JCQlpZiAocHN0YS0+c2xlZXBxX2xlbiA+IChOUl9YTUlURlJBTUU+PjMpKQotCQkJCXdha2V1cF9zdGFfdG9feG1pdDIzYShwYWRhcHRlciwgcHN0YSk7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotI2VuZGlmCi0KLQlpZiAocnR3X3R4ZnJhbWVzX3N0YV9hY19wZW5kaW5nMjNhKHBhZGFwdGVyLCBwYXR0cmliKSA+IDApCi0JCWdvdG8gZW5xdWV1ZTsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWXxfRldfVU5ERVJfTElOS0lORykgPT0gdHJ1ZSkKLQkJZ290byBlbnF1ZXVlOwotCi0JcHhtaXRidWYgPSBydHdfYWxsb2NfeG1pdGJ1ZjIzYShweG1pdHByaXYpOwotCWlmIChweG1pdGJ1ZiA9PSBOVUxMKQotCQlnb3RvIGVucXVldWU7Ci0KLQlzcGluX3VubG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLQotCXB4bWl0ZnJhbWUtPnB4bWl0YnVmID0gcHhtaXRidWY7Ci0JcHhtaXRmcmFtZS0+YnVmX2FkZHIgPSBweG1pdGJ1Zi0+cGJ1ZjsKLQlweG1pdGJ1Zi0+cHJpdl9kYXRhID0gcHhtaXRmcmFtZTsKLQotCWlmICh4bWl0ZnJhbWVfZGlyZWN0KHBhZGFwdGVyLCBweG1pdGZyYW1lKSAhPSBfU1VDQ0VTUykgewotCQlydHdfZnJlZV94bWl0YnVmMjNhKHB4bWl0cHJpdiwgcHhtaXRidWYpOwotCQlydHdfZnJlZV94bWl0ZnJhbWUyM2EocHhtaXRwcml2LCBweG1pdGZyYW1lKTsKLQl9Ci0JcmV0dXJuIHRydWU7Ci0KLWVucXVldWU6Ci0JcmVzID0gcnR3X3htaXRmcmFtZV9lbnF1ZXVlMjNhKHBhZGFwdGVyLCBweG1pdGZyYW1lKTsKLQlzcGluX3VubG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLQotCWlmIChyZXMgIT0gX1NVQ0NFU1MpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV94bWl0X29zZGVwX2NfLCBfZHJ2X2Vycl8sCi0JCQkgInByZV94bWl0ZnJhbWU6IGVucXVldWUgeG1pdGZyYW1lIGZhaWxcbiIpOwotCQlydHdfZnJlZV94bWl0ZnJhbWUyM2EocHhtaXRwcml2LCBweG1pdGZyYW1lKTsKLQotCQkvKiAgVHJpY2ssIG1ha2UgdGhlIHN0YXRpc3RpY3MgY29ycmVjdCAqLwotCQlweG1pdHByaXYtPnR4X3BrdHMtLTsKLQkJcHhtaXRwcml2LT50eF9kcm9wKys7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLWludCBydGw4NzIzYXVfbWdudF94bWl0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcG1nbnRmcmFtZSkKLXsKLQlyZXR1cm4gcnR3X2R1bXBfeGZyYW1lKHBhZGFwdGVyLCBwbWdudGZyYW1lKTsKLX0KLQotaW50IHJ0bDg3MjNhdV9oYWxfeG1pdGZyYW1lX2VucXVldWUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCi17Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlpbnQgZXJyOwotCi0JZXJyID0gcnR3X3htaXRmcmFtZV9lbnF1ZXVlMjNhKHBhZGFwdGVyLCBweG1pdGZyYW1lKTsKLQlpZiAoZXJyICE9IF9TVUNDRVNTKSB7Ci0JCXJ0d19mcmVlX3htaXRmcmFtZTIzYShweG1pdHByaXYsIHB4bWl0ZnJhbWUpOwotCi0JCS8qICBUcmljaywgbWFrZSB0aGUgc3RhdGlzdGljcyBjb3JyZWN0ICovCi0JCXB4bWl0cHJpdi0+dHhfcGt0cy0tOwotCQlweG1pdHByaXYtPnR4X2Ryb3ArKzsKLQl9IGVsc2UgewotCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZweG1pdHByaXYtPnhtaXRfdGFza2xldCk7Ci0JfQotCXJldHVybiBlcnI7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC91c2JfaGFsaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvdXNiX2hhbGluaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE0N2FlYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC91c2JfaGFsaW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX0hDSV9IQUxfSU5JVF9DXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPHJ0d19lZnVzZS5oPgotCi0jaW5jbHVkZSA8SGFsUHdyU2VxQ21kLmg+Ci0jaW5jbHVkZSA8SGFsODcyM1B3clNlcS5oPgotI2luY2x1ZGUgPHJ0bDg3MjNhX2hhbC5oPgotI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgotCi0jaW5jbHVkZSA8dXNiX29wcy5oPgotCi1zdGF0aWMgdm9pZCBwaHlfU3NQd3JTd2l0Y2g5MkNVKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwKLQkJCQllbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlIGVSRlBvd2VyU3RhdGUpOwotCi1zdGF0aWMgdm9pZAotX0NvbmZpZ0NoaXBPdXRFUChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1OCBOdW1PdXRQaXBlKQotewotCXU4IHZhbHVlODsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBBZGFwdGVyKTsKLQotCXBIYWxEYXRhLT5PdXRFcFF1ZXVlU2VsID0gMDsKLQlwSGFsRGF0YS0+T3V0RXBOdW1iZXIgPSAwOwotCi0JLyogIE5vcm1hbCBhbmQgSGlnaCBxdWV1ZSAqLwotCXZhbHVlOCA9IHJ0bDg3MjNhdV9yZWFkOChwQWRhcHRlciwgKFJFR19OT1JNQUxfU0lFX0VQICsgMSkpOwotCi0JaWYgKHZhbHVlOCAmIFVTQl9OT1JNQUxfU0lFX0VQX01BU0spIHsKLQkJcEhhbERhdGEtPk91dEVwUXVldWVTZWwgfD0gVFhfU0VMRV9IUTsKLQkJcEhhbERhdGEtPk91dEVwTnVtYmVyKys7Ci0JfQotCi0JaWYgKCh2YWx1ZTggPj4gVVNCX05PUk1BTF9TSUVfRVBfU0hJRlQpICYgVVNCX05PUk1BTF9TSUVfRVBfTUFTSykgewotCQlwSGFsRGF0YS0+T3V0RXBRdWV1ZVNlbCB8PSBUWF9TRUxFX05ROwotCQlwSGFsRGF0YS0+T3V0RXBOdW1iZXIrKzsKLQl9Ci0KLQkvKiAgTG93IHF1ZXVlICovCi0JdmFsdWU4ID0gcnRsODcyM2F1X3JlYWQ4KHBBZGFwdGVyLCAoUkVHX05PUk1BTF9TSUVfRVAgKyAyKSk7Ci0JaWYgKHZhbHVlOCAmIFVTQl9OT1JNQUxfU0lFX0VQX01BU0spIHsKLQkJcEhhbERhdGEtPk91dEVwUXVldWVTZWwgfD0gVFhfU0VMRV9MUTsKLQkJcEhhbERhdGEtPk91dEVwTnVtYmVyKys7Ci0JfQotCi0JLyogIFRPRE86IEVycm9yIHJlY292ZXJ5IGZvciB0aGlzIGNhc2UgKi8KLQkvKiBSVF9BU1NFUlQoKE51bU91dFBpcGUgPT0gcEhhbERhdGEtPk91dEVwTnVtYmVyKSwKLQkgICAoIk91dCBFUCBudW1iZXIgaXNuJ3QgbWF0Y2ghICVkKERlc2NyaXB0b3IpICE9ICVkIChTSUUgcmVnKVxuIiwKLQkgICAodTMyKU51bU91dFBpcGUsICh1MzIpcEhhbERhdGEtPk91dEVwTnVtYmVyKSk7ICovCi19Ci0KLWJvb2wgcnRsODcyM2F1X2NoaXBfY29uZmlndXJlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGR2b2JqX3ByaXYgKnBkdm9ianByaXYgPSBhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKTsKLQl1OCBOdW1JblBpcGUgPSBwZHZvYmpwcml2LT5SdE51bUluUGlwZXM7Ci0JdTggTnVtT3V0UGlwZSA9IHBkdm9ianByaXYtPlJ0TnVtT3V0UGlwZXM7Ci0KLQlfQ29uZmlnQ2hpcE91dEVQKHBhZGFwdGVyLCBOdW1PdXRQaXBlKTsKLQotCS8qICBOb3JtYWwgY2hpcCB3aXRoIG9uZSBJTiBhbmQgb25lIE9VVCBkb2Vzbid0IGhhdmUgaW50ZXJydXB0IElOIEVQLiAqLwotCWlmIChwSGFsRGF0YS0+T3V0RXBOdW1iZXIgPT0gMSkgewotCQlpZiAoTnVtSW5QaXBlICE9IDEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcmV0dXJuIEhhbF9NYXBwaW5nT3V0UGlwZTIzYShwYWRhcHRlciwgTnVtT3V0UGlwZSk7Ci19Ci0KLXN0YXRpYyBpbnQgX0luaXRQb3dlck9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTE2IHZhbHVlMTY7Ci0JdTggdmFsdWU4OwotCi0JLyogIFJTVl9DVFJMIDB4MUNbNzowXSA9IDB4MDAKLQkgICAgdW5sb2NrIElTTy9DTEsvUG93ZXIgY29udHJvbCByZWdpc3RlciAqLwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19SU1ZfQ1RSTCwgMHgwKTsKLQotCS8qICBIVyBQb3dlciBvbiBzZXF1ZW5jZSAqLwotCWlmICghSGFsUHdyU2VxQ21kUGFyc2luZzIzYShwYWRhcHRlciwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssCi0JCQkJIFBXUl9JTlRGX1VTQl9NU0ssIHJ0bDg3MjNBVV9jYXJkX2VuYWJsZV9mbG93KSkKLQkJcmV0dXJuIF9GQUlMOwotCi0JLyogIDB4MDRbMTldID0gMSwgc3VnZ2VzdCBieSBKYWNraWUgMjAxMS4wNS4wOSwgcmVzZXQgODA1MSAqLwotCXZhbHVlOCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgUkVHX0FQU19GU01DTysyKTsKLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfQVBTX0ZTTUNPICsgMiwgdmFsdWU4IHwgQklUKDMpKTsKLQotCS8qICBFbmFibGUgTUFDIERNQS9XTUFDL1NDSEVEVUxFL1NFQyBibG9jayAqLwotCS8qICBTZXQgQ1IgYml0MTAgdG8gZW5hYmxlIDMyayBjYWxpYnJhdGlvbi4gU3VnZ2VzdGVkIGJ5IFNEMSBHaW1teS4KLQkgICAgQWRkZWQgYnkgdHlubGkuIDIwMTEuMDguMzEuICovCi0JdmFsdWUxNiA9IHJ0bDg3MjNhdV9yZWFkMTYocGFkYXB0ZXIsIFJFR19DUik7Ci0JdmFsdWUxNiB8PSAoSENJX1RYRE1BX0VOIHwgSENJX1JYRE1BX0VOIHwgVFhETUFfRU4gfCBSWERNQV9FTiB8Ci0JCSAgICBQUk9UT0NPTF9FTiB8IFNDSEVEVUxFX0VOIHwgTUFDVFhFTiB8IE1BQ1JYRU4gfAotCQkgICAgRU5TRUMgfCBDQUxUTVJfRU4pOwotCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfQ1IsIHZhbHVlMTYpOwotCi0JLyogZm9yIEVmdXNlIFBHLCBzdWdnZXN0IGJ5IEphY2tpZSAyMDExLjExLjIzICovCi0JUEhZX1NldEJCUmVnKHBhZGFwdGVyLCBSRUdfRUZVU0VfQ1RSTCwgQklUKDI4KXxCSVQoMjkpfEJJVCgzMCksIDB4MDYpOwotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi0vKiAgU2hhbGwgVVNCIGludGVyZmFjZSBpbml0IHRoaXM/ICovCi1zdGF0aWMgdm9pZCBfSW5pdEludGVycnVwdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0JdTMyIHZhbHVlMzI7Ci0KLQkvKiAgSElTUiAtIHR1cm4gYWxsIG9uICovCi0JdmFsdWUzMiA9IDB4RkZGRkZGRkY7Ci0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX0hJU1IsIHZhbHVlMzIpOwotCi0JLyogIEhJTVIgLSB0dXJuIGFsbCBvbiAqLwotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19ISU1SLCB2YWx1ZTMyKTsKLX0KLQotc3RhdGljIHZvaWQgX0luaXRRdWV1ZVJlc2VydmVkUGFnZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiA9ICZBZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0JdTMyIG51bUhRID0gMDsKLQl1MzIgbnVtTFEgPSAwOwotCXUzMiBudW1OUSA9IDA7Ci0JdTMyIG51bVB1YlE7Ci0JdTMyIHZhbHVlMzI7Ci0JdTggdmFsdWU4OwotCWJvb2wgYldpRmlDb25maWcgPSBwcmVnaXN0cnlwcml2LT53aWZpX3NwZWM7Ci0KLQkvKiBSVF9BU1NFUlQoKG91dEVQTnVtPj0gMiksICgiZm9yIFdNTSAsIG51bWJlciBvZiBvdXQtZXAgIgotCSAgICJtdXN0IG1vcmUgdGhhbiBvciBlcXVhbCB0byAyIVxuIikpOyAqLwotCi0JbnVtUHViUSA9IGJXaUZpQ29uZmlnID8gV01NX05PUk1BTF9QQUdFX05VTV9QVUJRIDogTk9STUFMX1BBR0VfTlVNX1BVQlE7Ci0KLQlpZiAocEhhbERhdGEtPk91dEVwUXVldWVTZWwgJiBUWF9TRUxFX0hRKSB7Ci0JCW51bUhRID0gYldpRmlDb25maWcgPwotCQkJV01NX05PUk1BTF9QQUdFX05VTV9IUFEgOiBOT1JNQUxfUEFHRV9OVU1fSFBROwotCX0KLQotCWlmIChwSGFsRGF0YS0+T3V0RXBRdWV1ZVNlbCAmIFRYX1NFTEVfTFEpIHsKLQkJbnVtTFEgPSBiV2lGaUNvbmZpZyA/Ci0JCQlXTU1fTk9STUFMX1BBR0VfTlVNX0xQUSA6IE5PUk1BTF9QQUdFX05VTV9MUFE7Ci0JfQotCS8qICBOT1RFOiBUaGlzIHN0ZXAgc2hhbGwgYmUgcHJvY2VlZCBiZWZvcmUKLQkgICAgd3JpdHRpbmcgUkVHX1JRUE4uICovCi0JaWYgKHBIYWxEYXRhLT5PdXRFcFF1ZXVlU2VsICYgVFhfU0VMRV9OUSkgewotCQludW1OUSA9IGJXaUZpQ29uZmlnID8KLQkJCVdNTV9OT1JNQUxfUEFHRV9OVU1fTlBRIDogTk9STUFMX1BBR0VfTlVNX05QUTsKLQl9Ci0JdmFsdWU4ID0gKHU4KV9OUFEobnVtTlEpOwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX1JRUE5fTlBRLCB2YWx1ZTgpOwotCi0JLyogIFRYIERNQSAqLwotCXZhbHVlMzIgPSBfSFBRKG51bUhRKSB8IF9MUFEobnVtTFEpIHwgX1BVQlEobnVtUHViUSkgfCBMRF9SUVBOOwotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19SUVBOLCB2YWx1ZTMyKTsKLX0KLQotc3RhdGljIHZvaWQgX0luaXRUeEJ1ZmZlckJvdW5kYXJ5KHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiA9ICZBZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0KLQl1OCB0eHBrdGJ1Zl9ibmR5OwotCi0JaWYgKCFwcmVnaXN0cnlwcml2LT53aWZpX3NwZWMpCi0JCXR4cGt0YnVmX2JuZHkgPSBUWF9QQUdFX0JPVU5EQVJZOwotCWVsc2UgLyogZm9yIFdNTSAqLwotCQl0eHBrdGJ1Zl9ibmR5ID0gV01NX05PUk1BTF9UWF9QQUdFX0JPVU5EQVJZOwotCi0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSRUdfVFhQS1RCVUZfQkNOUV9CRE5ZLCB0eHBrdGJ1Zl9ibmR5KTsKLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19UWFBLVEJVRl9NR1FfQkROWSwgdHhwa3RidWZfYm5keSk7Ci0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSRUdfVFhQS1RCVUZfV01BQ19MQktfQkZfSEQsIHR4cGt0YnVmX2JuZHkpOwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX1RSWEZGX0JORFksIHR4cGt0YnVmX2JuZHkpOwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX1RERUNUUkwrMSwgdHhwa3RidWZfYm5keSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9Jbml0UGFnZUJvdW5kYXJ5KHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQkvKiAgUlggUGFnZSBCb3VuZGFyeSAqLwotCS8qIHNyYW5kKHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4odGltZShOVUxMKSkpOyAqLwotCXUxNiByeGZmX2JuZHkgPSAweDI3RkY7LyogcmFuZCgpICUgMSkgPyAweDI3RkYgOiAweDIzRkY7ICovCi0KLQlydGw4NzIzYXVfd3JpdGUxNihBZGFwdGVyLCAoUkVHX1RSWEZGX0JORFkgKyAyKSwgcnhmZl9ibmR5KTsKLQotCS8qICBUT0RPOiA/PyBzaGFsbCB3ZSBzZXQgdHggYm91bmRhcnk/ICovCi19Ci0KLXN0YXRpYyB2b2lkCi1fSW5pdE5vcm1hbENoaXBSZWdQcmlvcml0eShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHUxNiBiZVEsIHUxNiBia1EsCi0JCQkgICB1MTYgdmlRLCB1MTYgdm9RLCB1MTYgbWd0USwgdTE2IGhpUSkKLXsKLQl1MTYgdmFsdWUxNiA9IHJ0bDg3MjNhdV9yZWFkMTYoQWRhcHRlciwgUkVHX1RSWERNQV9DVFJMKSAmIDB4NzsKLQotCXZhbHVlMTYgfD0gX1RYRE1BX0JFUV9NQVAoYmVRKSB8IF9UWERNQV9CS1FfTUFQKGJrUSkgfAotCQlfVFhETUFfVklRX01BUCh2aVEpIHwgX1RYRE1BX1ZPUV9NQVAodm9RKSB8Ci0JCV9UWERNQV9NR1FfTUFQKG1ndFEpIHwgX1RYRE1BX0hJUV9NQVAoaGlRKTsKLQotCXJ0bDg3MjNhdV93cml0ZTE2KEFkYXB0ZXIsIFJFR19UUlhETUFfQ1RSTCwgdmFsdWUxNik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9Jbml0Tm9ybWFsQ2hpcE9uZU91dEVwUHJpb3JpdHkoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0JdTE2IHZhbHVlID0gMDsKLQotCXN3aXRjaCAocEhhbERhdGEtPk91dEVwUXVldWVTZWwpIHsKLQljYXNlIFRYX1NFTEVfSFE6Ci0JCXZhbHVlID0gUVVFVUVfSElHSDsKLQkJYnJlYWs7Ci0JY2FzZSBUWF9TRUxFX0xROgotCQl2YWx1ZSA9IFFVRVVFX0xPVzsKLQkJYnJlYWs7Ci0JY2FzZSBUWF9TRUxFX05ROgotCQl2YWx1ZSA9IFFVRVVFX05PUk1BTDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJLyogUlRfQVNTRVJUKGZhbHNlLCAoIlNoYWxsIG5vdCByZWFjaCBoZXJlIVxuIikpOyAqLwotCQlicmVhazsKLQl9Ci0KLQlfSW5pdE5vcm1hbENoaXBSZWdQcmlvcml0eShBZGFwdGVyLCB2YWx1ZSwgdmFsdWUsIHZhbHVlLAotCQkJCSAgIHZhbHVlLCB2YWx1ZSwgdmFsdWUpOwotfQotCi1zdGF0aWMgdm9pZCBfSW5pdE5vcm1hbENoaXBUd29PdXRFcFByaW9yaXR5KHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVnaXN0cnlwcml2ID0gJkFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQl1MTYgYmVRLCBia1EsIHZpUSwgdm9RLCBtZ3RRLCBoaVE7Ci0JdTE2IHZhbHVlSGkgPSAwOwotCXUxNiB2YWx1ZUxvdyA9IDA7Ci0KLQlzd2l0Y2ggKHBIYWxEYXRhLT5PdXRFcFF1ZXVlU2VsKSB7Ci0JY2FzZSAoVFhfU0VMRV9IUSB8IFRYX1NFTEVfTFEpOgotCQl2YWx1ZUhpID0gUVVFVUVfSElHSDsKLQkJdmFsdWVMb3cgPSBRVUVVRV9MT1c7Ci0JCWJyZWFrOwotCWNhc2UgKFRYX1NFTEVfTlEgfCBUWF9TRUxFX0xRKToKLQkJdmFsdWVIaSA9IFFVRVVFX05PUk1BTDsKLQkJdmFsdWVMb3cgPSBRVUVVRV9MT1c7Ci0JCWJyZWFrOwotCWNhc2UgKFRYX1NFTEVfSFEgfCBUWF9TRUxFX05RKToKLQkJdmFsdWVIaSA9IFFVRVVFX0hJR0g7Ci0JCXZhbHVlTG93ID0gUVVFVUVfTk9STUFMOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQkvKiBSVF9BU1NFUlQoZmFsc2UsICgiU2hhbGwgbm90IHJlYWNoIGhlcmUhXG4iKSk7ICovCi0JCWJyZWFrOwotCX0KLQotCWlmICghcHJlZ2lzdHJ5cHJpdi0+d2lmaV9zcGVjKSB7Ci0JCWJlUSA9IHZhbHVlTG93OwotCQlia1EgPSB2YWx1ZUxvdzsKLQkJdmlRID0gdmFsdWVIaTsKLQkJdm9RID0gdmFsdWVIaTsKLQkJbWd0USA9IHZhbHVlSGk7Ci0JCWhpUSA9IHZhbHVlSGk7Ci0JfSBlbHNlIHsvKiBmb3IgV01NICwgQ09ORklHX09VVF9FUF9XSUZJX01PREUgKi8KLQkJYmVRID0gdmFsdWVMb3c7Ci0JCWJrUSA9IHZhbHVlSGk7Ci0JCXZpUSA9IHZhbHVlSGk7Ci0JCXZvUSA9IHZhbHVlTG93OwotCQltZ3RRID0gdmFsdWVIaTsKLQkJaGlRID0gdmFsdWVIaTsKLQl9Ci0KLQlfSW5pdE5vcm1hbENoaXBSZWdQcmlvcml0eShBZGFwdGVyLCBiZVEsIGJrUSwgdmlRLCB2b1EsIG1ndFEsIGhpUSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9Jbml0Tm9ybWFsQ2hpcFRocmVlT3V0RXBQcmlvcml0eShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdpc3RyeXByaXYgPSAmQWRhcHRlci0+cmVnaXN0cnlwcml2OwotCXUxNiBiZVEsIGJrUSwgdmlRLCB2b1EsIG1ndFEsIGhpUTsKLQotCWlmICghcHJlZ2lzdHJ5cHJpdi0+d2lmaV9zcGVjKSB7LyogIHR5cGljYWwgc2V0dGluZyAqLwotCQliZVEgPSBRVUVVRV9MT1c7Ci0JCWJrUSA9IFFVRVVFX0xPVzsKLQkJdmlRID0gUVVFVUVfTk9STUFMOwotCQl2b1EgPSBRVUVVRV9ISUdIOwotCQltZ3RRID0gUVVFVUVfSElHSDsKLQkJaGlRID0gUVVFVUVfSElHSDsKLQl9IGVsc2Ugey8qICBmb3IgV01NICovCi0JCWJlUSA9IFFVRVVFX0xPVzsKLQkJYmtRID0gUVVFVUVfTk9STUFMOwotCQl2aVEgPSBRVUVVRV9OT1JNQUw7Ci0JCXZvUSA9IFFVRVVFX0hJR0g7Ci0JCW1ndFEgPSBRVUVVRV9ISUdIOwotCQloaVEgPSBRVUVVRV9ISUdIOwotCX0KLQlfSW5pdE5vcm1hbENoaXBSZWdQcmlvcml0eShBZGFwdGVyLCBiZVEsIGJrUSwgdmlRLCB2b1EsIG1ndFEsIGhpUSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9Jbml0UXVldWVQcmlvcml0eShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQotCXN3aXRjaCAocEhhbERhdGEtPk91dEVwTnVtYmVyKSB7Ci0JY2FzZSAxOgotCQlfSW5pdE5vcm1hbENoaXBPbmVPdXRFcFByaW9yaXR5KEFkYXB0ZXIpOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCV9Jbml0Tm9ybWFsQ2hpcFR3b091dEVwUHJpb3JpdHkoQWRhcHRlcik7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJX0luaXROb3JtYWxDaGlwVGhyZWVPdXRFcFByaW9yaXR5KEFkYXB0ZXIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQkvKiBSVF9BU1NFUlQoZmFsc2UsICgiU2hhbGwgbm90IHJlYWNoIGhlcmUhXG4iKSk7ICovCi0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgX0luaXRUcmFuc2ZlclBhZ2VTaXplKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQkvKiAgVHggcGFnZSBzaXplIGlzIGFsd2F5cyAxMjguICovCi0KLQl1OCB2YWx1ZTg7Ci0JdmFsdWU4ID0gX1BTUlgoUEJQXzEyOCkgfCBfUFNUWChQQlBfMTI4KTsKLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19QQlAsIHZhbHVlOCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9Jbml0RHJpdmVySW5mb1NpemUoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1OCBkcnZJbmZvU2l6ZSkKLXsKLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19SWF9EUlZJTkZPX1NaLCBkcnZJbmZvU2l6ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9Jbml0V01BQ1NldHRpbmcoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0KLQkvKiAgZG9uJ3QgdHVybiBvbiBBQVAsIGl0IHdpbGwgYWxsb3cgYWxsIHBhY2tldHMgdG8gZHJpdmVyICovCi0JcEhhbERhdGEtPlJlY2VpdmVDb25maWcgPSBSQ1JfQVBNIHwgUkNSX0FNIHwgUkNSX0FCIHwgUkNSX0NCU1NJRF9EQVRBIHwKLQkJCQkgIFJDUl9DQlNTSURfQkNOIHwgUkNSX0FQUF9JQ1YgfCBSQ1JfQU1GIHwKLQkJCQkgIFJDUl9IVENfTE9DX0NUUkwgfCBSQ1JfQVBQX01JQyB8Ci0JCQkJICBSQ1JfQVBQX1BIWVNUUzsKLQotCS8qICBzb21lIFJFR19SQ1Igd2lsbCBiZSBtb2RpZmllZCBsYXRlciBieQotCSAgICBwaHlfQ29uZmlnTUFDV2l0aEhlYWRlckZpbGUoKSAqLwotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19SQ1IsIHBIYWxEYXRhLT5SZWNlaXZlQ29uZmlnKTsKLQotCS8qICBBY2NlcHQgYWxsIG11bHRpY2FzdCBhZGRyZXNzICovCi0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX01BUiwgMHhGRkZGRkZGRik7Ci0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX01BUiArIDQsIDB4RkZGRkZGRkYpOwotCi0JLyogIEFjY2VwdCBhbGwgZGF0YSBmcmFtZXMgKi8KLQkvKiB2YWx1ZTE2ID0gMHhGRkZGOyAqLwotCS8qIHJ0bDg3MjNhdV93cml0ZTE2KEFkYXB0ZXIsIFJFR19SWEZMVE1BUDIsIHZhbHVlMTYpOyAqLwotCi0JLyogIDIwMTAuMDkuMDggaHBmYW4gKi8KLQkvKiAgU2luY2UgQURGIGlzIHJlbW92ZWQgZnJvbSBSQ1IsIHBzLXBvbGwgd2lsbCBub3QgYmUgaW5kaWNhdGUKLQkgICAgdG8gZHJpdmVyLCAqLwotCS8qICBSeEZpbHRlck1hcCBzaG91bGQgbWFzayBwcy1wb2xsIHRvIGd1YXJhbnRlZSBBUCBtb2RlIGNhbgotCSAgICByeCBwcy1wb2xsLiAqLwotCS8qIHZhbHVlMTYgPSAweDQwMDsgKi8KLQkvKiBydGw4NzIzYXVfd3JpdGUxNihBZGFwdGVyLCBSRUdfUlhGTFRNQVAxLCB2YWx1ZTE2KTsgKi8KLQotCS8qICBBY2NlcHQgYWxsIG1hbmFnZW1lbnQgZnJhbWVzICovCi0JLyogdmFsdWUxNiA9IDB4RkZGRjsgKi8KLQkvKiBydGw4NzIzYXVfd3JpdGUxNihBZGFwdGVyLCBSRUdfUlhGTFRNQVAwLCB2YWx1ZTE2KTsgKi8KLQotCS8qIGVuYWJsZSBSWF9TSElGVCBiaXRzICovCi0JLyogcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSRUdfVFJYRE1BX0NUUkwsIHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLAotCSAgIFJFR19UUlhETUFfQ1RSTCl8QklUKDEpKTsgKi8KLX0KLQotc3RhdGljIHZvaWQgX0luaXRBZGFwdGl2ZUN0cmwoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXUxNiB2YWx1ZTE2OwotCXUzMiB2YWx1ZTMyOwotCi0JLyogIFJlc3BvbnNlIFJhdGUgU2V0ICovCi0JdmFsdWUzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgUkVHX1JSU1IpOwotCXZhbHVlMzIgJj0gflJBVEVfQklUTUFQX0FMTDsKLQl2YWx1ZTMyIHw9IFJBVEVfUlJTUl9DQ0tfT05MWV8xTTsKLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSRUdfUlJTUiwgdmFsdWUzMik7Ci0KLQkvKiAgQ0YtRU5EIFRocmVzaG9sZCAqLwotCS8qIG1fc3BJb0Jhc2UtPnJ0bDg3MjNhdV93cml0ZTgoUkVHX0NGRU5EX1RILCAweDEpOyAqLwotCi0JLyogIFNJRlMgKHVzZWQgaW4gTkFWKSAqLwotCXZhbHVlMTYgPSBfU1BFQ19TSUZTX0NDSygweDEwKSB8IF9TUEVDX1NJRlNfT0ZETSgweDEwKTsKLQlydGw4NzIzYXVfd3JpdGUxNihBZGFwdGVyLCBSRUdfU1BFQ19TSUZTLCB2YWx1ZTE2KTsKLQotCS8qICBSZXRyeSBMaW1pdCAqLwotCXZhbHVlMTYgPSBfTFJMKDB4MzApIHwgX1NSTCgweDMwKTsKLQlydGw4NzIzYXVfd3JpdGUxNihBZGFwdGVyLCBSRUdfUkwsIHZhbHVlMTYpOwotfQotCi1zdGF0aWMgdm9pZCBfSW5pdFJhdGVGYWxsYmFjayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0JLyogIFNldCBEYXRhIEF1dG8gUmF0ZSBGYWxsYmFjayBSZXRyeSBDb3VudCByZWdpc3Rlci4gKi8KLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSRUdfREFSRlJDLCAweDAwMDAwMDAwKTsKLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSRUdfREFSRlJDKzQsIDB4MTAwODA0MDQpOwotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19SQVJGUkMsIDB4MDQwMzAyMDEpOwotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19SQVJGUkMrNCwgMHgwODA3MDYwNSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9Jbml0RURDQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0JLyogIFNldCBTcGVjIFNJRlMgKHVzZWQgaW4gTkFWKSAqLwotCXJ0bDg3MjNhdV93cml0ZTE2KEFkYXB0ZXIsIFJFR19TUEVDX1NJRlMsIDB4MTAwYSk7Ci0JcnRsODcyM2F1X3dyaXRlMTYoQWRhcHRlciwgUkVHX01BQ19TUEVDX1NJRlMsIDB4MTAwYSk7Ci0KLQkvKiAgU2V0IFNJRlMgZm9yIENDSyAqLwotCXJ0bDg3MjNhdV93cml0ZTE2KEFkYXB0ZXIsIFJFR19TSUZTX0NUWCwgMHgxMDBhKTsKLQotCS8qICBTZXQgU0lGUyBmb3IgT0ZETSAqLwotCXJ0bDg3MjNhdV93cml0ZTE2KEFkYXB0ZXIsIFJFR19TSUZTX1RSWCwgMHgxMDBhKTsKLQotCS8qICBUWE9QICovCi0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX0VEQ0FfQkVfUEFSQU0sIDB4MDA1RUE0MkIpOwotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19FRENBX0JLX1BBUkFNLCAweDAwMDBBNDRGKTsKLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSRUdfRURDQV9WSV9QQVJBTSwgMHgwMDVFQTMyNCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX0VEQ0FfVk9fUEFSQU0sIDB4MDAyRkEyMjYpOwotfQotCi1zdGF0aWMgdm9pZCBfSW5pdFJER1NldHRpbmcoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX1JEX0NUUkwsIDB4RkYpOwotCXJ0bDg3MjNhdV93cml0ZTE2KEFkYXB0ZXIsIFJFR19SRF9OQVZfTlhULCAweDIwMCk7Ci0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSRUdfUkRfUkVTUF9QS1RfVEgsIDB4MDUpOwotfQotCi1zdGF0aWMgdm9pZCBfSW5pdFJldHJ5RnVuY3Rpb24oc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXU4IHZhbHVlODsKLQotCXZhbHVlOCA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBSRUdfRldIV19UWFFfQ1RSTCk7Ci0JdmFsdWU4IHw9IEVOX0FNUERVX1JUWV9ORVc7Ci0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSRUdfRldIV19UWFFfQ1RSTCwgdmFsdWU4KTsKLQotCS8qICBTZXQgQUNLIHRpbWVvdXQgKi8KLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19BQ0tUTywgMHg0MCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9Jbml0UkZUeXBlKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCi0JcEhhbERhdGEtPnJmX3R5cGUgPSBSRl8xVDFSOwotfQotCi0vKiAgU2V0IENDSyBhbmQgT0ZETSBCbG9jayAiT04iICovCi1zdGF0aWMgdm9pZCBfQkJUdXJuT25CbG9jayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0JUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9SRk1PRCwgYkNDS0VuLCAweDEpOwotCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByRlBHQTBfUkZNT0QsIGJPRkRNRW4sIDB4MSk7Ci19Ci0KLSNkZWZpbmUgTWdudEFjdFNldF9SRl9TdGF0ZSguLi4pCi1zdGF0aWMgdm9pZCBfUmZQb3dlclNhdmUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLX0KLQotZW51bSB7Ci0JQW50ZW5uYV9MZmV0ID0gMSwKLQlBbnRlbm5hX1JpZ2h0ID0gMiwKLX07Ci0KLWVudW0gcnRfcmZfcG93ZXJfc3RhdGUgUmZPbk9mZkRldGVjdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyKQotewotCS8qIHN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocEFkYXB0ZXIpOyAqLwotCXU4IHZhbDg7Ci0JZW51bSBydF9yZl9wb3dlcl9zdGF0ZSByZnBvd2Vyc3RhdGUgPSByZl9vZmY7Ci0KLQlydGw4NzIzYXVfd3JpdGU4KHBBZGFwdGVyLCBSRUdfTUFDX1BJTk1VWF9DRkcsCi0JCQkgcnRsODcyM2F1X3JlYWQ4KHBBZGFwdGVyLAotCQkJCQkgUkVHX01BQ19QSU5NVVhfQ0ZHKSAmIH5CSVQoMykpOwotCXZhbDggPSBydGw4NzIzYXVfcmVhZDgocEFkYXB0ZXIsIFJFR19HUElPX0lPX1NFTCk7Ci0JREJHXzg3MjNBKCJHUElPX0lOID0lMDJ4XG4iLCB2YWw4KTsKLQlyZnBvd2Vyc3RhdGUgPSAodmFsOCAmIEJJVCgzKSkgPyByZl9vbiA6IHJmX29mZjsKLQotCXJldHVybiByZnBvd2Vyc3RhdGU7Ci19Ci0KLWludCBydGw4NzIzYXVfaGFsX2luaXQoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdyY3RybHByaXYgPSAmQWRhcHRlci0+cHdyY3RybHByaXY7Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdpc3RyeXByaXYgPSAmQWRhcHRlci0+cmVnaXN0cnlwcml2OwotCXU4IHZhbDggPSAwOwotCXUzMiBib3VuZGFyeTsKLQlpbnQgc3RhdHVzID0gX1NVQ0NFU1M7Ci0JYm9vbCBtYWNfb247Ci0KLQl1bnNpZ25lZCBsb25nIGluaXRfc3RhcnRfdGltZSA9IGppZmZpZXM7Ci0KLQlBZGFwdGVyLT5od19pbml0X2NvbXBsZXRlZCA9IGZhbHNlOwotCi0JaWYgKEFkYXB0ZXItPnB3cmN0cmxwcml2LmJrZWVwZndhbGl2ZSkgewotCQlwaHlfU3NQd3JTd2l0Y2g5MkNVKEFkYXB0ZXIsIHJmX29uKTsKLQotCQlpZiAocEhhbERhdGEtPmJJUUtJbml0aWFsaXplZCkgewotCQkJcnRsODcyM2FfcGh5X2lxX2NhbGlicmF0ZShBZGFwdGVyLCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXJ0bDg3MjNhX3BoeV9pcV9jYWxpYnJhdGUoQWRhcHRlciwgZmFsc2UpOwotCQkJcEhhbERhdGEtPmJJUUtJbml0aWFsaXplZCA9IHRydWU7Ci0JCX0KLQkJcnRsODcyM2Ffb2RtX2NoZWNrX3R4X3Bvd2VyX3RyYWNraW5nKEFkYXB0ZXIpOwotCQlydGw4NzIzYV9waHlfbGNfY2FsaWJyYXRlKEFkYXB0ZXIpOwotCi0JCWdvdG8gZXhpdDsKLQl9Ci0KLQkvKiAgQ2hlY2sgaWYgTUFDIGhhcyBhbHJlYWR5IHBvd2VyIG9uLiBieSB0eW5saS4gMjAxMS4wNS4yNy4gKi8KLQl2YWw4ID0gcnRsODcyM2F1X3JlYWQ4KEFkYXB0ZXIsIFJFR19DUik7Ci0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAiJXM6IFJFR19DUiAweDEwMCA9IDB4JTAyeFxuIiwgX19mdW5jX18sIHZhbDgpOwotCS8qIEZpeCA5MkRVLVZDIFMzIGhhbmcgd2l0aCB0aGUgcmVhc29uIGlzIHRoYXQgc2Vjb25kYXJ5IG1hYyBpcyBub3QKLQkgICBpbml0aWFsaXplZC4gKi8KLQkvKiAweDEwMCB2YWx1ZSBvZiBmaXJzdCBtYWMgaXMgMHhFQSB3aGlsZSAweDEwMCB2YWx1ZSBvZiBzZWNvbmRhcnkKLQkgICBpcyAweDAwICovCi0JaWYgKHZhbDggPT0gMHhFQSkgewotCQltYWNfb24gPSBmYWxzZTsKLQl9IGVsc2UgewotCQltYWNfb24gPSB0cnVlOwotCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAiJXM6IE1BQyBoYXMgYWxyZWFkeSBwb3dlciBvblxuIiwgX19mdW5jX18pOwotCX0KLQotCXN0YXR1cyA9IF9Jbml0UG93ZXJPbihBZGFwdGVyKTsKLQlpZiAoc3RhdHVzID09IF9GQUlMKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2Vycl8sCi0JCQkgIkZhaWxlZCB0byBpbml0IHBvd2VyIG9uIVxuIik7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAoIXByZWdpc3RyeXByaXYtPndpZmlfc3BlYykgewotCQlib3VuZGFyeSA9IFRYX1BBR0VfQk9VTkRBUlk7Ci0JfSBlbHNlIHsKLQkJLyogIGZvciBXTU0gKi8KLQkJYm91bmRhcnkgPSBXTU1fTk9STUFMX1RYX1BBR0VfQk9VTkRBUlk7Ci0JfQotCi0JaWYgKCFtYWNfb24pIHsKLQkJc3RhdHVzID0gIEluaXRMTFRUYWJsZTIzYShBZGFwdGVyLCBib3VuZGFyeSk7Ci0JCWlmIChzdGF0dXMgPT0gX0ZBSUwpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJGYWlsZWQgdG8gaW5pdCBMTFQgdGFibGVcbiIpOwotCQkJZ290byBleGl0OwotCQl9Ci0JfQotCi0JaWYgKHBIYWxEYXRhLT5iUkRHRW5hYmxlKQotCQlfSW5pdFJER1NldHRpbmcoQWRhcHRlcik7Ci0KLQlzdGF0dXMgPSBydGw4NzIzYV9GaXJtd2FyZURvd25sb2FkKEFkYXB0ZXIpOwotCWlmIChzdGF0dXMgIT0gX1NVQ0NFU1MpIHsKLQkJQWRhcHRlci0+YkZXUmVhZHkgPSBmYWxzZTsKLQkJREJHXzg3MjNBKCJmdyBkb3dubG9hZCBmYWlsIVxuIik7Ci0JCWdvdG8gZXhpdDsKLQl9IGVsc2UgewotCQlBZGFwdGVyLT5iRldSZWFkeSA9IHRydWU7Ci0JCURCR184NzIzQSgiZncgZG93bmxvYWQgb2shXG4iKTsKLQl9Ci0KLQlydGw4NzIzYV9Jbml0aWFsaXplRmlybXdhcmVWYXJzKEFkYXB0ZXIpOwotCi0JaWYgKHB3cmN0cmxwcml2LT5yZWdfcmZvZmYgPT0gdHJ1ZSkgewotCQlwd3JjdHJscHJpdi0+cmZfcHdyc3RhdGUgPSByZl9vZmY7Ci0JfQotCi0JLyogIDIwMTAvMDgvMDkgTUggV2UgbmVlZCB0byBjaGVjayBpZiB3ZSBuZWVkIHRvIHR1cm5vbiBvciBvZmYgUkYgYWZ0ZXIgZGV0ZWN0aW5nICovCi0JLyogIEhXIEdQSU8gcGluLiBCZWZvcmUgUEhZX1JGQ29uZmlnODE5MkMuICovCi0JLyogSGFsRGV0ZWN0UHdyRG93bk1vZGUoQWRhcHRlcik7ICovCi0JLyogIDIwMTAvMDgvMjYgTUggSWYgRWZ1c2UgZG9lcyBub3Qgc3VwcG9ydCBzZWN0aXZlIHN1c3BlbmQgdGhlbiBkaXNhYmxlIHRoZSBmdW5jdGlvbi4gKi8KLQkvKiBIYWxEZXRlY3RTZWxlY3RpdmVTdXNwZW5kTW9kZShBZGFwdGVyKTsgKi8KLQotCS8qICBTZXQgUkYgdHlwZSBmb3IgQkIvUkYgY29uZmlndXJhdGlvbiAqLwotCV9Jbml0UkZUeXBlKEFkYXB0ZXIpOy8qIF9SZWFkUkZUeXBlKCkgKi8KLQotCS8qICBTYXZlIHRhcmdldCBjaGFubmVsICovCi0JLyogIDxSb2dlcl9Ob3Rlcz4gQ3VycmVudCBDaGFubmVsIHdpbGwgYmUgdXBkYXRlZCBhZ2FpbiBsYXRlci4gKi8KLQlwSGFsRGF0YS0+Q3VycmVudENoYW5uZWwgPSA2Oy8qIGRlZmF1bHQgc2V0IHRvIDYgKi8KLQotCXN0YXR1cyA9IFBIWV9NQUNDb25maWc4NzIzQShBZGFwdGVyKTsKLQlpZiAoc3RhdHVzID09IF9GQUlMKSB7Ci0JCURCR184NzIzQSgiUEhZX01BQ0NvbmZpZzg3MjNBIGZhdWx0ICEhXG4iKTsKLQkJZ290byBleGl0OwotCX0KLQotCS8qICAqLwotCS8qIGQuIEluaXRpYWxpemUgQkIgcmVsYXRlZCBjb25maWd1cmF0aW9ucy4gKi8KLQkvKiAgKi8KLQlzdGF0dXMgPSBQSFlfQkJDb25maWc4NzIzQShBZGFwdGVyKTsKLQlpZiAoc3RhdHVzID09IF9GQUlMKSB7Ci0JCURCR184NzIzQSgiUEhZX0JCQ29uZmlnODcyM0EgZmF1bHQgISFcbiIpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogIEFkZCBmb3IgdHggcG93ZXIgYnkgcmF0ZSBmaW5lIHR1bmUuIFdlIG5lZWQgdG8gY2FsbCB0aGUgZnVuY3Rpb24gYWZ0ZXIgQkIgY29uZmlnLiAqLwotCS8qICBCZWNhdXNlIHRoZSB0eCBwb3dlciBieSByYXRlIHRhYmxlIGlzIGluaXRlZCBpbiBCQiBjb25maWcuICovCi0KLQlzdGF0dXMgPSBQSFlfUkY2MDUyX0NvbmZpZzg3MjNBKEFkYXB0ZXIpOwotCWlmIChzdGF0dXMgPT0gX0ZBSUwpIHsKLQkJREJHXzg3MjNBKCJQSFlfUkY2MDUyX0NvbmZpZzg3MjNBIGZhaWxlZCEhXG4iKTsKLQkJZ290byBleGl0OwotCX0KLQotCS8qIHJlZHVjaW5nIDgwTSBzcHVyICovCi0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX0FGRV9YVEFMX0NUUkwsIDB4MDM4MTgwOGQpOwotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19BRkVfUExMX0NUUkwsIDB4ZjBmZmZmODMpOwotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19BRkVfUExMX0NUUkwsIDB4ZjBmZmZmODIpOwotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19BRkVfUExMX0NUUkwsIDB4ZjBmZmZmODMpOwotCi0JLyogUkZTVyBDb250cm9sICovCi0JLyogMHg4MDRbMTRdPSAwICovCi0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgckZQR0EwX1R4SW5mbywgMHgwMDAwMDAwMyk7Ci0JLyogMHg4NzBbNjo1XT0gYicxMSAqLwotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIHJGUEdBMF9YQUJfUkZJbnRlcmZhY2VTVywgMHgwNzAwMDc2MCk7Ci0JLyogMHg4NjBbNjo1XT0gYicwMCAqLwotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIHJGUEdBMF9YQV9SRkludGVyZmFjZU9FLCAweDY2RjYwMjEwKTsKLQotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkgIiVzOiAweDg3MCA9IHZhbHVlIDB4JXhcbiIsIF9fZnVuY19fLAotCQkgcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCAweDg3MCkpOwotCi0JLyogICovCi0JLyogIEpvc2VwaCBOb3RlOiBLZWVwIFJmUmVnQ2hubFZhbCBmb3IgbGF0ZXIgdXNlLiAqLwotCS8qICAqLwotCXBIYWxEYXRhLT5SZlJlZ0NobmxWYWxbMF0gPSBQSFlfUXVlcnlSRlJlZyhBZGFwdGVyLCBSRl9QQVRIX0EsCi0JCQkJCQkgICBSRl9DSE5MQlcsIGJSRlJlZ09mZnNldE1hc2spOwotCXBIYWxEYXRhLT5SZlJlZ0NobmxWYWxbMV0gPSBQSFlfUXVlcnlSRlJlZyhBZGFwdGVyLCBSRl9QQVRIX0IsCi0JCQkJCQkgICBSRl9DSE5MQlcsIGJSRlJlZ09mZnNldE1hc2spOwotCi0JaWYgKCFtYWNfb24pIHsKLQkJX0luaXRRdWV1ZVJlc2VydmVkUGFnZShBZGFwdGVyKTsKLQkJX0luaXRUeEJ1ZmZlckJvdW5kYXJ5KEFkYXB0ZXIpOwotCX0KLQlfSW5pdFF1ZXVlUHJpb3JpdHkoQWRhcHRlcik7Ci0JX0luaXRQYWdlQm91bmRhcnkoQWRhcHRlcik7Ci0JX0luaXRUcmFuc2ZlclBhZ2VTaXplKEFkYXB0ZXIpOwotCi0JLyogIEdldCBSeCBQSFkgc3RhdHVzIGluIG9yZGVyIHRvIHJlcG9ydCBSU1NJIGFuZCBvdGhlcnMuICovCi0JX0luaXREcml2ZXJJbmZvU2l6ZShBZGFwdGVyLCBEUlZJTkZPX1NaKTsKLQotCV9Jbml0SW50ZXJydXB0KEFkYXB0ZXIpOwotCWh3X3Zhcl9zZXRfbWFjYWRkcihBZGFwdGVyLCBBZGFwdGVyLT5lZXByb21wcml2Lm1hY19hZGRyKTsKLQlydGw4NzIzYV9zZXRfbWVkaWFfc3RhdHVzKEFkYXB0ZXIsIE1TUl9JTkZSQSk7Ci0JX0luaXRXTUFDU2V0dGluZyhBZGFwdGVyKTsKLQlfSW5pdEFkYXB0aXZlQ3RybChBZGFwdGVyKTsKLQlfSW5pdEVEQ0EoQWRhcHRlcik7Ci0JX0luaXRSYXRlRmFsbGJhY2soQWRhcHRlcik7Ci0JX0luaXRSZXRyeUZ1bmN0aW9uKEFkYXB0ZXIpOwotCXJ0bDg3MjNhX0luaXRCZWFjb25QYXJhbWV0ZXJzKEFkYXB0ZXIpOwotCi0JX0JCVHVybk9uQmxvY2soQWRhcHRlcik7Ci0JLyogTmljSUZTZXRNYWNBZGRyZXNzKHBhZGFwdGVyLCBwYWRhcHRlci0+UGVybWFuZW50QWRkcmVzcyk7ICovCi0KLQlydGw4NzIzYV9jYW1faW52YWxpZGF0ZV9hbGwoQWRhcHRlcik7Ci0KLQkvKiAgMjAxMC8xMi8xNyBNSCBXZSBuZWVkIHRvIHNldCBUWCBwb3dlciBhY2NvcmRpbmcgdG8gRUZVU0UgY29udGVudCBhdCBmaXJzdC4gKi8KLQlQSFlfU2V0VHhQb3dlckxldmVsODcyM0EoQWRhcHRlciwgcEhhbERhdGEtPkN1cnJlbnRDaGFubmVsKTsKLQotCXJ0bDg3MjNhX0luaXRBbnRlbm5hX1NlbGVjdGlvbihBZGFwdGVyKTsKLQotCS8qICBIVyBTRVEgQ1RSTCAqLwotCS8qIHNldCAweDAgdG8gMHhGRiBieSB0eW5saS4gRGVmYXVsdCBlbmFibGUgSFcgU0VRIE5VTS4gKi8KLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19IV1NFUV9DVFJMLCAweEZGKTsKLQotCS8qICAqLwotCS8qICBEaXNhYmxlIEJBUiwgc3VnZ2VzdGVkIGJ5IFNjb3R0ICovCi0JLyogIDIwMTAuMDQuMDkgYWRkIGJ5IGhwZmFuICovCi0JLyogICovCi0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX0JBUl9NT0RFX0NUUkwsIDB4MDIwMWZmZmYpOwotCi0JaWYgKHByZWdpc3RyeXByaXYtPndpZmlfc3BlYykKLQkJcnRsODcyM2F1X3dyaXRlMTYoQWRhcHRlciwgUkVHX0ZBU1RfRURDQV9DVFJMLCAwKTsKLQotCS8qICBNb3ZlIGJ5IE5lbyBmb3IgVVNCIFNTIGZyb20gYWJvdmUgc2V0cCAqLwotCV9SZlBvd2VyU2F2ZShBZGFwdGVyKTsKLQotCS8qICAyMDEwLzA4LzI2IE1IIE1lcmdlIGZyb20gODE5MkNFLiAqLwotCS8qIHNoZXJyeSBtYXNrZWQgdGhhdCBpdCBoYXMgYmVlbiBkb25lIGluIF9SZlBvd2VyU2F2ZSAqLwotCS8qIDIwMTEwOTI3ICovCi0JLyogcmVjb3ZlcnkgZm9yIDgxOTJjdSBhbmQgOTcyM0F1IDIwMTExMDE3ICovCi0JaWYgKHB3cmN0cmxwcml2LT5yZl9wd3JzdGF0ZSA9PSByZl9vbikgewotCQlpZiAocEhhbERhdGEtPmJJUUtJbml0aWFsaXplZCkgewotCQkJcnRsODcyM2FfcGh5X2lxX2NhbGlicmF0ZShBZGFwdGVyLCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXJ0bDg3MjNhX3BoeV9pcV9jYWxpYnJhdGUoQWRhcHRlciwgZmFsc2UpOwotCQkJcEhhbERhdGEtPmJJUUtJbml0aWFsaXplZCA9IHRydWU7Ci0JCX0KLQotCQlydGw4NzIzYV9vZG1fY2hlY2tfdHhfcG93ZXJfdHJhY2tpbmcoQWRhcHRlcik7Ci0KLQkJcnRsODcyM2FfcGh5X2xjX2NhbGlicmF0ZShBZGFwdGVyKTsKLQotCQlydGw4NzIzYV9kdWFsX2FudGVubmFfZGV0ZWN0aW9uKEFkYXB0ZXIpOwotCX0KLQotCS8qIGZpeGVkIFVTQiBpbnRlcmZhY2UgaW50ZXJmZXJlbmNlIGlzc3VlICovCi0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweGZlNDAsIDB4ZTApOwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhmZTQxLCAweDhkKTsKLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4ZmU0MiwgMHg4MCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgMHgyMGMsIDB4ZmQwMzIwKTsKLQkvKiBTb2x2ZSB0b28gbWFueSBwcm90b2NvbCBlcnJvciBvbiBVU0IgYnVzICovCi0JaWYgKCFJU184MXh4Q19WRU5ET1JfVU1DX0FfQ1VUKHBIYWxEYXRhLT5WZXJzaW9uSUQpKSB7Ci0JCS8qICAweEU2ID0gMHg5NCAqLwotCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4RkU0MCwgMHhFNik7Ci0JCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhGRTQxLCAweDk0KTsKLQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweEZFNDIsIDB4ODApOwotCi0JCS8qICAweEUwID0gMHgxOSAqLwotCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4RkU0MCwgMHhFMCk7Ci0JCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhGRTQxLCAweDE5KTsKLQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweEZFNDIsIDB4ODApOwotCi0JCS8qICAweEU1ID0gMHg5MSAqLwotCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4RkU0MCwgMHhFNSk7Ci0JCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhGRTQxLCAweDkxKTsKLQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweEZFNDIsIDB4ODApOwotCi0JCS8qICAweEUyID0gMHg4MSAqLwotCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4RkU0MCwgMHhFMik7Ci0JCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhGRTQxLCAweDgxKTsKLQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweEZFNDIsIDB4ODApOwotCi0JfQotCi0vKglfSW5pdFBBQmlhcyhBZGFwdGVyKTsgKi8KLQotCS8qICBJbml0IEJUIGh3IGNvbmZpZy4gKi8KLQlydGw4NzIzYV9CVF9pbml0X2h3Y29uZmlnKEFkYXB0ZXIpOwotCi0JcnRsODcyM2FfSW5pdEhhbERtKEFkYXB0ZXIpOwotCi0JdmFsOCA9IERJVl9ST1VORF9VUChXaUZpTmF2VXBwZXJVcywgSEFMXzg3MjNBX05BVl9VUFBFUl9VTklUKTsKLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19OQVZfVVBQRVIsIHZhbDgpOwotCi0JLyogIDIwMTEvMDMvMDkgTUggZGVidWcgb25seSwgVU1DLUIgY3V0IHBhc3MgMjUwMCBTNSB0ZXN0LCBidXQgd2UgbmVlZCB0byBmaW4gcm9vdCBjYXVzZS4gKi8KLQlpZiAoKChydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIHJGUEdBMF9SRk1PRCkgJiAweEZGMDAwMDAwKSAhPQotCSAgICAgMHg4MzAwMDAwMCkpIHsKLQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9SRk1PRCwgQklUKDI0KSwgMSk7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2Vycl8sCi0JCQkgIiVzOiBJUUsgZmFpbCByZWNvdmVyXG4iLCBfX2Z1bmNfXyk7Ci0JfQotCi0JLyogYWNrIGZvciB4bWl0IG1nbXQgZnJhbWVzLiAqLwotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19GV0hXX1RYUV9DVFJMLAotCQkJICBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIFJFR19GV0hXX1RYUV9DVFJMKXxCSVQoMTIpKTsKLQotZXhpdDoKLQlpZiAoc3RhdHVzID09IF9TVUNDRVNTKSB7Ci0JCUFkYXB0ZXItPmh3X2luaXRfY29tcGxldGVkID0gdHJ1ZTsKLQotCQlpZiAoQWRhcHRlci0+cmVnaXN0cnlwcml2Lm5vdGNoX2ZpbHRlciA9PSAxKQotCQkJcnRsODcyM2Ffbm90Y2hfZmlsdGVyKEFkYXB0ZXIsIDEpOwotCX0KLQotCURCR184NzIzQSgiJXMgaW4gJWRtc1xuIiwgX19mdW5jX18sCi0JCSAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gaW5pdF9zdGFydF90aW1lKSk7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIHZvaWQgcGh5X1NzUHdyU3dpdGNoOTJDVShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsCi0JCQkJZW51bSBydF9yZl9wb3dlcl9zdGF0ZSBlUkZQb3dlclN0YXRlKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0JdTggc3BzMDsKLQotCXNwczAgPSBydGw4NzIzYXVfcmVhZDgoQWRhcHRlciwgUkVHX1NQUzBfQ1RSTCk7Ci0KLQlzd2l0Y2ggKGVSRlBvd2VyU3RhdGUpIHsKLQljYXNlIHJmX29uOgotCQkvKiAgMS4gRW5hYmxlIE1BQyBDbG9jay4gQ2FuIG5vdCBiZSBlbmFibGVkIG5vdy4gKi8KLQkJLyogV3JpdGVYQllURShSRUdfU1lTX0NMS1IrMSwKLQkJICAgUmVhZFhCWVRFKFJFR19TWVNfQ0xLUisxKSB8IEJJVCgzKSk7ICovCi0KLQkJLyogIDIuIEZvcmNlIFBXTSwgRW5hYmxlIFNQUzE4X0xET19NYXJjb19CbG9jayAqLwotCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19TUFMwX0NUUkwsCi0JCQkJIHNwczAgfCBCSVQoMCkgfCBCSVQoMykpOwotCi0JCS8qICAzLiByZXN0b3JlIEJCLCBBRkUgY29udHJvbCByZWdpc3Rlci4gKi8KLQkJLyogUkYgKi8KLQkJaWYgKHBIYWxEYXRhLT5yZl90eXBlID09ICBSRl8yVDJSKQotCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9YQUJfUkZQYXJhbWV0ZXIsCi0JCQkJICAgICAweDM4MDAzOCwgMSk7Ci0JCWVsc2UKLQkJCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByRlBHQTBfWEFCX1JGUGFyYW1ldGVyLAotCQkJCSAgICAgMHgzOCwgMSk7Ci0JCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByT0ZETTBfVFJ4UGF0aEVuYWJsZSwgMHhmMCwgMSk7Ci0JCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByRlBHQTBfUkZNT0QsIEJJVCgxKSwgMCk7Ci0KLQkJLyogQUZFICovCi0JCWlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSAgUkZfMlQyUikKLQkJCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIHJSeF9XYWl0X0NDQSwgMHg2M0RCMjVBMCk7Ci0JCWVsc2UgaWYgKHBIYWxEYXRhLT5yZl90eXBlID09ICBSRl8xVDFSKQotCQkJcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgclJ4X1dhaXRfQ0NBLCAweDYzMUIyNUEwKTsKLQotCQkvKiAgNC4gaXNzdWUgMy13aXJlIGNvbW1hbmQgdGhhdCBSRiBzZXQgdG8gUnggaWRsZQotCQkgICAgbW9kZS4gVGhpcyBpcyB1c2VkIHRvIHJlLXdyaXRlIHRoZSBSWCBpZGxlIG1vZGUuICovCi0JCS8qICBXZSBjYW4gb25seSBwcnZpZGUgYSB1c3VhbCB2YWx1ZSBpbnN0ZWFkIGFuZCB0aGVuCi0JCSAgICBIVyB3aWxsIG1vZGlmeSB0aGUgdmFsdWUgYnkgaXRzZWxmLiAqLwotCQlQSFlfU2V0UkZSZWcoQWRhcHRlciwgUkZfUEFUSF9BLCBSRl9BQywKLQkJCSAgICAgYlJGUmVnT2Zmc2V0TWFzaywgMHgzMkQ5NSk7Ci0JCWlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSAgUkZfMlQyUikgewotCQkJUEhZX1NldFJGUmVnKEFkYXB0ZXIsIFJGX1BBVEhfQiwgUkZfQUMsCi0JCQkJICAgICBiUkZSZWdPZmZzZXRNYXNrLCAweDMyRDk1KTsKLQkJfQotCQlicmVhazsKLQljYXNlIHJmX3NsZWVwOgotCWNhc2UgcmZfb2ZmOgotCQlpZiAoSVNfODF4eENfVkVORE9SX1VNQ19CX0NVVChwSGFsRGF0YS0+VmVyc2lvbklEKSkKLQkJCXNwczAgJj0gfkJJVCgwKTsKLQkJZWxzZQotCQkJc3BzMCAmPSB+KEJJVCgwKSB8IEJJVCgzKSk7Ci0KLQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLCAiU1MgTFZMMVxuIik7Ci0JCS8qICBEaXNhYmxlIFJGIGFuZCBCQiBvbmx5IGZvciBTZWxlY3RTdXNwZW5kLiAqLwotCi0JCS8qICAxLiBTZXQgQkIvUkYgdG8gc2h1dGRvd24uICovCi0JCS8qCSgxKSBSZWc4NzhbNTozXT0gMAlSRiByeF9jb2RlIGZvcgotCQkJCQkJcHJlYW1ibGUgcG93ZXIgc2F2aW5nICovCi0JCS8qCSgyKVJlZzg3OFsyMToxOV09IDAJVHVybiBvZmYgUkYtQiAqLwotCQkvKgkoMykgUmVnQzA0Wzc6NF09IDAJVHVybiBvZmYgYWxsIHBhdGhzCi0JCQkJCQlmb3IgcGFja2V0IGRldGVjdGlvbiAqLwotCQkvKgkoNCkgUmVnODAwWzFdID0gMQllbmFibGUgcHJlYW1ibGUgcG93ZXIgc2F2aW5nICovCi0JCUFkYXB0ZXItPnB3cmN0cmxwcml2LlBTX0JCUmVnQmFja3VwW1BTQkJSRUdfUkYwXSA9Ci0JCQlydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIHJGUEdBMF9YQUJfUkZQYXJhbWV0ZXIpOwotCQlBZGFwdGVyLT5wd3JjdHJscHJpdi5QU19CQlJlZ0JhY2t1cFtQU0JCUkVHX1JGMV0gPQotCQkJcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCByT0ZETTBfVFJ4UGF0aEVuYWJsZSk7Ci0JCUFkYXB0ZXItPnB3cmN0cmxwcml2LlBTX0JCUmVnQmFja3VwW1BTQkJSRUdfUkYyXSA9Ci0JCQlydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIHJGUEdBMF9SRk1PRCk7Ci0JCWlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSAgUkZfMlQyUikKLQkJCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByRlBHQTBfWEFCX1JGUGFyYW1ldGVyLAotCQkJCSAgICAgMHgzODAwMzgsIDApOwotCQllbHNlIGlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSAgUkZfMVQxUikKLQkJCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByRlBHQTBfWEFCX1JGUGFyYW1ldGVyLCAweDM4LCAwKTsKLQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJPRkRNMF9UUnhQYXRoRW5hYmxlLCAweGYwLCAwKTsKLQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9SRk1PRCwgQklUKDEpLCAxKTsKLQotCQkvKiAgMiAuQUZFIGNvbnRyb2wgcmVnaXN0ZXIgdG8gcG93ZXIgZG93bi4gYml0WzMwOjIyXSAqLwotCQlBZGFwdGVyLT5wd3JjdHJscHJpdi5QU19CQlJlZ0JhY2t1cFtQU0JCUkVHX0FGRTBdID0KLQkJCXJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgclJ4X1dhaXRfQ0NBKTsKLQkJaWYgKHBIYWxEYXRhLT5yZl90eXBlID09ICBSRl8yVDJSKQotCQkJcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgclJ4X1dhaXRfQ0NBLCAweDAwREIyNUEwKTsKLQkJZWxzZSBpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gIFJGXzFUMVIpCi0JCQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCByUnhfV2FpdF9DQ0EsIDB4MDAxQjI1QTApOwotCi0JCS8qICAzLiBpc3N1ZSAzLXdpcmUgY29tbWFuZCB0aGF0IFJGIHNldCB0byBwb3dlciBkb3duLiovCi0JCVBIWV9TZXRSRlJlZyhBZGFwdGVyLCBSRl9QQVRIX0EsIFJGX0FDLCBiUkZSZWdPZmZzZXRNYXNrLCAwKTsKLQkJaWYgKHBIYWxEYXRhLT5yZl90eXBlID09ICBSRl8yVDJSKQotCQkJUEhZX1NldFJGUmVnKEFkYXB0ZXIsIFJGX1BBVEhfQiwgUkZfQUMsCi0JCQkJICAgICBiUkZSZWdPZmZzZXRNYXNrLCAwKTsKLQotCQkvKiAgNC4gRm9yY2UgUEZNICwgZGlzYWJsZSBTUFMxOF9MRE9fTWFyY29fQmxvY2sgKi8KLQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSRUdfU1BTMF9DVFJMLCBzcHMwKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBDYXJkRGlzYWJsZVJUTDg3MjNVKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQl1OAkJdTFiVG1wOwotCi0JREJHXzg3MjNBKCJDYXJkRGlzYWJsZVJUTDg3MjNVXG4iKTsKLQkvKiAgVVNCLU1GIENhcmQgRGlzYWJsZSBGbG93ICovCi0JLyogIDEuIFJ1biBMUFMgV0wgUkZPRkYgZmxvdyAqLwotCUhhbFB3clNlcUNtZFBhcnNpbmcyM2EoQWRhcHRlciwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssCi0JCQkgICAgUFdSX0lOVEZfVVNCX01TSywgcnRsODcyM0FVX2VudGVyX2xwc19mbG93KTsKLQotCS8qICAyLiAweDFGWzc6MF0gPSAwCQl0dXJuIG9mZiBSRiAqLwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX1JGX0NUUkwsIDB4MDApOwotCi0JLyoJPT09PSBSZXNldCBkaWdpdGFsIHNlcXVlbmNlICAgPT09PT09ICovCi0JaWYgKChydGw4NzIzYXVfcmVhZDgoQWRhcHRlciwgUkVHX01DVUZXREwpICYgQklUKDcpKSAmJgotCSAgICBBZGFwdGVyLT5iRldSZWFkeSkgLyogODA1MSBSQU0gY29kZSAqLwotCQlydGw4NzIzYV9GaXJtd2FyZVNlbGZSZXNldChBZGFwdGVyKTsKLQotCS8qICBSZXNldCBNQ1UuIFN1Z2dlc3RlZCBieSBGaWxlbi4gMjAxMS4wMS4yNi4gYnkgdHlubGkuICovCi0JdTFiVG1wID0gcnRsODcyM2F1X3JlYWQ4KEFkYXB0ZXIsIFJFR19TWVNfRlVOQ19FTisxKTsKLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19TWVNfRlVOQ19FTisxLCB1MWJUbXAgJiB+QklUKDIpKTsKLQotCS8qICBnLglNQ1VGV0RMIDB4ODBbMTowXT0gMAkJcmVzZXQgTUNVIHJlYWR5IHN0YXR1cyAqLwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX01DVUZXREwsIDB4MDApOwotCi0JLyoJPT09PSBSZXNldCBkaWdpdGFsIHNlcXVlbmNlIGVuZCA9PT09PT0gKi8KLQkvKiAgQ2FyZCBkaXNhYmxlIHBvd2VyIGFjdGlvbiBmbG93ICovCi0JSGFsUHdyU2VxQ21kUGFyc2luZzIzYShBZGFwdGVyLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywKLQkJCSAgICAgICBQV1JfSU5URl9VU0JfTVNLLAotCQkJICAgICAgIHJ0bDg3MjNBVV9jYXJkX2Rpc2FibGVfZmxvdyk7Ci0KLQkvKiAgUmVzZXQgTUNVIElPIFdyYXBwZXIsIGFkZGVkIGJ5IFJvZ2VyLCAyMDExLjA4LjMwLiAqLwotCXUxYlRtcCA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBSRUdfUlNWX0NUUkwgKyAxKTsKLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19SU1ZfQ1RSTCsxLCB1MWJUbXAgJiB+QklUKDApKTsKLQl1MWJUbXAgPSBydGw4NzIzYXVfcmVhZDgoQWRhcHRlciwgUkVHX1JTVl9DVFJMICsgMSk7Ci0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSRUdfUlNWX0NUUkwrMSwgdTFiVG1wIHwgQklUKDApKTsKLQotCS8qICA3LiBSU1ZfQ1RSTCAweDFDWzc6MF0gPSAweDBFICBsb2NrIElTTy9DTEsvUG93ZXIgY29udHJvbCByZWdpc3RlciAqLwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX1JTVl9DVFJMLCAweDBlKTsKLX0KLQotaW50IHJ0bDg3MjNhdV9oYWxfZGVpbml0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JREJHXzg3MjNBKCI9PT4gJXNcbiIsIF9fZnVuY19fKTsKLQotI2lmZGVmIENPTkZJR184NzIzQVVfQlRfQ09FWElTVAotCUJUX0hhbHRQcm9jZXNzKHBhZGFwdGVyKTsKLSNlbmRpZgotCS8qICAyMDExLzAyLzE4IFRvIEZpeCBSVSBMTkEgIHBvd2VyIGxlYWthZ2UgcHJvYmxlbS4gV2UgbmVlZCB0bwotCSAgICBleGVjdXRlIGJlbG93IGJlbG93IGluIEFkYXB0ZXIgaW5pdCBhbmQgaGFsdCBzZXF1ZW5jZS4KLQkgICAgQWNjb3JkaW5nIHRvIEVFY2hvdSdzIG9waW5pb24sIHdlIGNhbiBlbmFibGUgdGhlIGFiaWxpdHkgZm9yIGFsbCAqLwotCS8qICBJQy4gQWNjb3JkIHRvIGpvaG5ueSdzIG9waW5pb24sIG9ubHkgUlUgbmVlZCB0aGUgc3VwcG9ydC4gKi8KLQlDYXJkRGlzYWJsZVJUTDg3MjNVKHBhZGFwdGVyKTsKLQotCXBhZGFwdGVyLT5od19pbml0X2NvbXBsZXRlZCA9IGZhbHNlOwotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1pbnQgcnRsODcyM2F1X2luaXJwX2luaXQoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXU4IGk7Ci0Jc3RydWN0IHJlY3ZfYnVmICpwcmVjdmJ1ZjsKLQlpbnQgc3RhdHVzOwotCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICZBZGFwdGVyLT5yZWN2cHJpdjsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCi0Jc3RhdHVzID0gX1NVQ0NFU1M7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywgIj09PT4gdXNiX2luaXJwX2luaXRcbiIpOwotCi0JLyogaXNzdWUgUnggaXJwIHRvIHJlY2VpdmUgZGF0YSAqLwotCXByZWN2YnVmID0gKHN0cnVjdCByZWN2X2J1ZiAqKXByZWN2cHJpdi0+cHJlY3ZfYnVmOwotCWZvciAoaSA9IDA7IGkgPCBOUl9SRUNWQlVGRjsgaSsrKSB7Ci0JCWlmIChydGw4NzIzYXVfcmVhZF9wb3J0KEFkYXB0ZXIsIDAsIHByZWN2YnVmKSA9PSBfRkFJTCkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfZXJyXywKLQkJCQkgInVzYl9yeF9pbml0OiB1c2JfcmVhZF9wb3J0IGVycm9yXG4iKTsKLQkJCXN0YXR1cyA9IF9GQUlMOwotCQkJZ290byBleGl0OwotCQl9Ci0JCXByZWN2YnVmKys7Ci0JfQotCWlmIChydGw4NzIzYXVfcmVhZF9pbnRlcnJ1cHQoQWRhcHRlcikgPT0gX0ZBSUwpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfZXJyXywKLQkJCSAiJXM6IHVzYl9yZWFkX2ludGVycnVwdCBlcnJvclxuIiwgX19mdW5jX18pOwotCQlzdGF0dXMgPSBfRkFJTDsKLQl9Ci0JcEhhbERhdGEtPkludHJNYXNrWzBdID0gcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCBSRUdfVVNCX0hJTVIpOwotCU1TR184NzIzQSgicEhhbERhdGEtPkludHJNYXNrID0gMHglMDR4XG4iLCBwSGFsRGF0YS0+SW50ck1hc2tbMF0pOwotCXBIYWxEYXRhLT5JbnRyTWFza1swXSB8PSBVSElNUl9DMkhDTUR8VUhJTVJfQ1BXTTsKLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSRUdfVVNCX0hJTVIsIHBIYWxEYXRhLT5JbnRyTWFza1swXSk7Ci1leGl0OgotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkgIjw9PT0gdXNiX2luaXJwX2luaXRcbiIpOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLWludCBydGw4NzIzYXVfaW5pcnBfZGVpbml0KHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EJKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAiPT09PiB1c2JfcnhfZGVpbml0XG4iKTsKLQlydGw4NzIzYXVfcmVhZF9wb3J0X2NhbmNlbChBZGFwdGVyKTsKLQlwSGFsRGF0YS0+SW50ck1hc2tbMF0gPSBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIFJFR19VU0JfSElNUik7Ci0JTVNHXzg3MjNBKCIlcyBwSGFsRGF0YS0+SW50ck1hc2sgPSAweCUwNHhcbiIsIF9fZnVuY19fLAotCQkgIHBIYWxEYXRhLT5JbnRyTWFza1swXSk7Ci0JcEhhbERhdGEtPkludHJNYXNrWzBdID0gMHgwOwotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19VU0JfSElNUiwgcEhhbERhdGEtPkludHJNYXNrWzBdKTsKLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJICI8PT09IHVzYl9yeF9kZWluaXRcbiIpOwotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIHZvaWQgX1JlYWRCb2FyZFR5cGUoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1OCAqUFJPTUNvbnRlbnQsCi0JCQkgICBib29sIEF1dG9sb2FkRmFpbCkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXU4IGJvYXJkVHlwZSA9IEJPQVJEX1VTQl9ET05HTEU7Ci0KLQlpZiAoQXV0b2xvYWRGYWlsKSB7Ci0JCWlmIChJU184NzIzX1NFUklFUyhwSGFsRGF0YS0+VmVyc2lvbklEKSkKLQkJCXBIYWxEYXRhLT5yZl90eXBlID0gUkZfMVQxUjsKLQkJZWxzZQotCQkJcEhhbERhdGEtPnJmX3R5cGUgPSBSRl8yVDJSOwotCQlwSGFsRGF0YS0+Qm9hcmRUeXBlID0gYm9hcmRUeXBlOwotCQlyZXR1cm47Ci0JfQotCi0JYm9hcmRUeXBlID0gUFJPTUNvbnRlbnRbRUVQUk9NX05PUk1BTF9Cb2FyZFR5cGVdOwotCWJvYXJkVHlwZSAmPSBCT0FSRF9UWVBFX05PUk1BTF9NQVNLOy8qIGJpdFs3OjVdICovCi0JYm9hcmRUeXBlID4+PSA1OwotCi0JcEhhbERhdGEtPkJvYXJkVHlwZSA9IGJvYXJkVHlwZTsKLQlNU0dfODcyM0EoIl9SZWFkQm9hcmRUeXBlKCV4KVxuIiwgcEhhbERhdGEtPkJvYXJkVHlwZSk7Ci0KLQlpZiAoYm9hcmRUeXBlID09IEJPQVJEX1VTQl9IaWdoX1BBKQotCQlwSGFsRGF0YS0+RXh0ZXJuYWxQQSA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkIEhhbF9FZnVzZVBhcnNlTUFDQWRkcl84NzIzQVUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkJIHU4ICpod2luZm8sIGJvb2wgQXV0b0xvYWRGYWlsKQotewotCXUxNiBpOwotCXU4IHNNYWNBZGRyW0VUSF9BTEVOXSA9IHsweDAwLCAweEUwLCAweDRDLCAweDg3LCAweDIzLCAweDAwfTsKLQlzdHJ1Y3QgZWVwcm9tX3ByaXYgKnBFRVBST00gPSBHRVRfRUVQUk9NX0VGVVNFX1BSSVYocGFkYXB0ZXIpOwotCi0JaWYgKEF1dG9Mb2FkRmFpbCkgewotCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotCQkJcEVFUFJPTS0+bWFjX2FkZHJbaV0gPSBzTWFjQWRkcltpXTsKLQl9IGVsc2UgewotCQkvKiBSZWFkIFBlcm1hbmVudCBNQUMgYWRkcmVzcyAqLwotCQltZW1jcHkocEVFUFJPTS0+bWFjX2FkZHIsICZod2luZm9bRUVQUk9NX01BQ19BRERSXzg3MjNBVV0sCi0JCSAgICAgICBFVEhfQUxFTik7Ci0JfQotCi0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfbm90aWNlXywKLQkJICJIYWxfRWZ1c2VQYXJzZU1BQ0FkZHJfODcyM0FVOiBQZXJtYW5lbnQgQWRkcmVzcyA9JXBNXG4iLAotCQkgcEVFUFJPTS0+bWFjX2FkZHIpOwotfQotCi1zdGF0aWMgdm9pZCByZWFkQWRhcHRlckluZm8oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgZWVwcm9tX3ByaXYgKnBFRVBST00gPSBHRVRfRUVQUk9NX0VGVVNFX1BSSVYocGFkYXB0ZXIpOwotCS8qIHN0cnVjdCBoYWxfZGF0YV84NzIzYSAqIHBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsgKi8KLQl1OCBod2luZm9bSFdTRVRfTUFYX1NJWkVdOwotCi0JSGFsX0luaXRQR0RhdGEocGFkYXB0ZXIsIGh3aW5mbyk7Ci0JSGFsX0VmdXNlUGFyc2VJRENvZGUocGFkYXB0ZXIsIGh3aW5mbyk7Ci0JSGFsX0VmdXNlUGFyc2VFRVBST01WZXIocGFkYXB0ZXIsIGh3aW5mbywKLQkJCQlwRUVQUk9NLT5iYXV0b2xvYWRfZmFpbF9mbGFnKTsKLQlIYWxfRWZ1c2VQYXJzZU1BQ0FkZHJfODcyM0FVKHBhZGFwdGVyLCBod2luZm8sCi0JCQkJICAgICBwRUVQUk9NLT5iYXV0b2xvYWRfZmFpbF9mbGFnKTsKLQlIYWxfRWZ1c2VQYXJzZXR4cG93ZXJpbmZvXzg3MjNBKHBhZGFwdGVyLCBod2luZm8sCi0JCQkJCXBFRVBST00tPmJhdXRvbG9hZF9mYWlsX2ZsYWcpOwotCV9SZWFkQm9hcmRUeXBlKHBhZGFwdGVyLCBod2luZm8sIHBFRVBST00tPmJhdXRvbG9hZF9mYWlsX2ZsYWcpOwotCUhhbF9FZnVzZVBhcnNlQlRDb2V4aXN0SW5mb184NzIzQShwYWRhcHRlciwgaHdpbmZvLAotCQkJCQkgIHBFRVBST00tPmJhdXRvbG9hZF9mYWlsX2ZsYWcpOwotCi0JcnRsODcyM2FfRWZ1c2VQYXJzZUNobmxQbGFuKHBhZGFwdGVyLCBod2luZm8sCi0JCQkJICAgIHBFRVBST00tPmJhdXRvbG9hZF9mYWlsX2ZsYWcpOwotCUhhbF9FZnVzZVBhcnNlVGhlcm1hbE1ldGVyXzg3MjNBKHBhZGFwdGVyLCBod2luZm8sCi0JCQkJCSBwRUVQUk9NLT5iYXV0b2xvYWRfZmFpbF9mbGFnKTsKLS8qCV9SZWFkUkZTZXR0aW5nKEFkYXB0ZXIsIFBST01Db250ZW50LCBwRUVQUk9NLT5iYXV0b2xvYWRfZmFpbF9mbGFnKTsgKi8KLS8qCV9SZWFkUFNTZXR0aW5nKEFkYXB0ZXIsIFBST01Db250ZW50LCBwRUVQUk9NLT5iYXV0b2xvYWRfZmFpbF9mbGFnKTsgKi8KLQlIYWxfRWZ1c2VQYXJzZUFudGVubmFEaXZlcnNpdHkocGFkYXB0ZXIsIGh3aW5mbywKLQkJCQkgICAgICAgcEVFUFJPTS0+YmF1dG9sb2FkX2ZhaWxfZmxhZyk7Ci0KLQlIYWxfRWZ1c2VQYXJzZUVFUFJPTVZlcihwYWRhcHRlciwgaHdpbmZvLCBwRUVQUk9NLT5iYXV0b2xvYWRfZmFpbF9mbGFnKTsKLQlIYWxfRWZ1c2VQYXJzZUN1c3RvbWVySUQocGFkYXB0ZXIsIGh3aW5mbywKLQkJCQkgcEVFUFJPTS0+YmF1dG9sb2FkX2ZhaWxfZmxhZyk7Ci0JSGFsX0VmdXNlUGFyc2VSYXRlSW5kaWNhdGlvbk9wdGlvbihwYWRhcHRlciwgaHdpbmZvLAotCQkJCQkgICBwRUVQUk9NLT5iYXV0b2xvYWRfZmFpbF9mbGFnKTsKLQlIYWxfRWZ1c2VQYXJzZVh0YWxfODcyM0EocGFkYXB0ZXIsIGh3aW5mbywKLQkJCQkgcEVFUFJPTS0+YmF1dG9sb2FkX2ZhaWxfZmxhZyk7Ci0KLQkvKiBoYWxfQ3VzdG9taXplZEJlaGF2aW9yXzg3MjNVKEFkYXB0ZXIpOyAqLwotCi0vKglBZGFwdGVyLT5iRG9uZ2xlID0gKFBST01Db250ZW50W0VFUFJPTV9FQVNZX1JFUExBQ0VNRU5UXSA9PSAxKT8gMDogMTsgKi8KLQlEQkdfODcyM0EoIiVzKCk6IFJFUExBQ0VNRU5UID0gJXhcbiIsIF9fZnVuY19fLCBwYWRhcHRlci0+YkRvbmdsZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9SZWFkUFJPTUNvbnRlbnQoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXN0cnVjdCBlZXByb21fcHJpdiAqcEVFUFJPTSA9IEdFVF9FRVBST01fRUZVU0VfUFJJVihBZGFwdGVyKTsKLQl1OCBlZVZhbHVlOwotCi0JZWVWYWx1ZSA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBSRUdfOTM0NkNSKTsKLQkvKiAgVG8gY2hlY2sgc3lzdGVtIGJvb3Qgc2VsZWN0aW9uLiAqLwotCXBFRVBST00tPkVlcHJvbU9yRWZ1c2UgPSAoZWVWYWx1ZSAmIEJPT1RfRlJPTV9FRVBST00pID8gdHJ1ZSA6IGZhbHNlOwotCXBFRVBST00tPmJhdXRvbG9hZF9mYWlsX2ZsYWcgPSAoZWVWYWx1ZSAmIEVFUFJPTV9FTikgPyBmYWxzZSA6IHRydWU7Ci0KLQlEQkdfODcyM0EoIkJvb3QgZnJvbSAlcywgQXV0b2xvYWQgJXMgIVxuIiwKLQkJICAocEVFUFJPTS0+RWVwcm9tT3JFZnVzZSA/ICJFRVBST00iIDogIkVGVVNFIiksCi0JCSAgKHBFRVBST00tPmJhdXRvbG9hZF9mYWlsX2ZsYWcgPyAiRmFpbCIgOiAiT0siKSk7Ci0KLQlyZWFkQWRhcHRlckluZm8oQWRhcHRlcik7Ci19Ci0KLS8qICAqLwotLyoJRGVzY3JpcHRpb246ICovCi0vKgkJV2Ugc2hvdWxkIHNldCBFZnVzZSBjZWxsIHNlbGVjdGlvbiB0byBXaUZpIGNlbGwgaW4gZGVmYXVsdC4gKi8KLS8qICAqLwotLyoJQXNzdW1wdGlvbjogKi8KLS8qCQlQQVNTSVZFX0xFVkVMICovCi0vKiAgKi8KLS8qCUFkZGVkIGJ5IFJvZ2VyLCAyMDEwLjExLjIzLiAqLwotLyogICovCi1zdGF0aWMgdm9pZCBoYWxfRWZ1c2VDZWxsU2VsKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQl1MzIgdmFsdWUzMjsKLQotCXZhbHVlMzIgPSBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIEVGVVNFX1RFU1QpOwotCXZhbHVlMzIgPSAodmFsdWUzMiAmIH5FRlVTRV9TRUxfTUFTSykgfCBFRlVTRV9TRUwoRUZVU0VfV0lGSV9TRUxfMCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgRUZVU0VfVEVTVCwgdmFsdWUzMik7Ci19Ci0KLXZvaWQgcnRsODcyM2FfcmVhZF9hZGFwdGVyX2luZm8oc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBqaWZmaWVzOwotCi0JLyogIFJlYWQgRUVQUk9NIHNpemUgYmVmb3JlIGNhbGwgYW55IEVFUFJPTSBmdW5jdGlvbiAqLwotCUFkYXB0ZXItPkVlcHJvbUFkZHJlc3NTaXplID0gR2V0RUVQUk9NU2l6ZTg3MjNBKEFkYXB0ZXIpOwotCi0JTVNHXzg3MjNBKCI9PT09PiBfUmVhZEFkYXB0ZXJJbmZvODcyM0FVXG4iKTsKLQotCWhhbF9FZnVzZUNlbGxTZWwoQWRhcHRlcik7Ci0KLQlfUmVhZFBST01Db250ZW50KEFkYXB0ZXIpOwotCi0JTVNHXzg3MjNBKCI8PT09PSBfUmVhZEFkYXB0ZXJJbmZvODcyM0FVIGluICVkIG1zXG4iLAotCQkgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0KSk7Ci19Ci0KLS8qICAqLwotLyoJRGVzY3JpcHRpb246ICovCi0vKgkJUXVlcnkgc2V0dGluZyBvZiBzcGVjaWZpZWQgdmFyaWFibGUuICovCi0vKiAgKi8KLWludCBHZXRIYWxEZWZWYXI4MTkyQ1VzYihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsCi0JCQkgZW51bSBoYWxfZGVmX3ZhcmlhYmxlIGVWYXJpYWJsZSwgdm9pZCAqcFZhbHVlKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0JaW50IGJSZXN1bHQgPSBfU1VDQ0VTUzsKLQotCXN3aXRjaCAoZVZhcmlhYmxlKSB7Ci0JY2FzZSBIQUxfREVGX1VOREVSQ09SQVRFRFNNT09USEVEUFdEQjoKLQkJKigoaW50ICopcFZhbHVlKSA9IHBIYWxEYXRhLT5kbXByaXYuVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7Ci0JCWJyZWFrOwotCWNhc2UgSEFMX0RFRl9JU19TVVBQT1JUX0FOVF9ESVY6Ci0JCWJyZWFrOwotCWNhc2UgSEFMX0RFRl9DVVJSRU5UX0FOVEVOTkE6Ci0JCWJyZWFrOwotCWNhc2UgSEFMX0RFRl9EUlZJTkZPX1NaOgotCQkqKCh1MzIgKilwVmFsdWUpID0gRFJWSU5GT19TWjsKLQkJYnJlYWs7Ci0JY2FzZSBIQUxfREVGX01BWF9SRUNWQlVGX1NaOgotCQkqKCh1MzIgKilwVmFsdWUpID0gTUFYX1JFQ1ZCVUZfU1o7Ci0JCWJyZWFrOwotCWNhc2UgSEFMX0RFRl9SWF9QQUNLRVRfT0ZGU0VUOgotCQkqKCh1MzIgKilwVmFsdWUpID0gUlhERVNDX1NJWkUgKyBEUlZJTkZPX1NaOwotCQlicmVhazsKLQljYXNlIEhBTF9ERUZfREJHX0RVTVBfUlhQS1Q6Ci0JCSooKHU4ICopcFZhbHVlKSA9IHBIYWxEYXRhLT5iRHVtcFJ4UGt0OwotCQlicmVhazsKLQljYXNlIEhBTF9ERUZfREJHX0RNX0ZVTkM6Ci0JCSooKHUzMiAqKXBWYWx1ZSkgPSBwSGFsRGF0YS0+b2RtcHJpdi5TdXBwb3J0QWJpbGl0eTsKLQkJYnJlYWs7Ci0JY2FzZSBIV19WQVJfTUFYX1JYX0FNUERVX0ZBQ1RPUjoKLQkJKigodTMyICopcFZhbHVlKSA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLOwotCQlicmVhazsKLQljYXNlIEhXX0RFRl9PRE1fREJHX0ZMQUc6Ci0JewotCQlzdHJ1Y3QgZG1fb2RtX3QJKnBETV9PZG0gPSAmcEhhbERhdGEtPm9kbXByaXY7Ci0JCXByaW50aygicERNX09kbS0+RGVidWdDb21wb25lbnRzID0gMHglbGx4XG4iLAotCQkgICAgICAgcERNX09kbS0+RGVidWdDb21wb25lbnRzKTsKLQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJSZXN1bHQgPSBfRkFJTDsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGJSZXN1bHQ7Ci19Ci0KLXZvaWQgcnRsODcyM2FfdXBkYXRlX3JhbWFzayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgIHUzMiBtYWNfaWQsIHU4IHJzc2lfbGV2ZWwpCi17Ci0Jc3RydWN0IHN0YV9pbmZvCSpwc3RhOwotCXN0cnVjdCBGV19TdGFfSW5mbyAqZndfc3RhOwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBkbV9wcml2ICpwZG1wcml2ID0gJnBIYWxEYXRhLT5kbXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqY3VyX25ldHdvcmsgPSAmcG1sbWVpbmZvLT5uZXR3b3JrOwotCXU4IGluaXRfcmF0ZSwgbmV0d29ya1R5cGUsIHJhaWQsIGFyZzsKLQl1MzIgbWFzaywgcmF0ZV9iaXRtYXA7Ci0JdTggc2hvcnRHSXJhdGUgPSBmYWxzZTsKLQlpbnQgc3VwcG9ydFJhdGVOdW07Ci0KLQlpZiAobWFjX2lkID49IE5VTV9TVEEpIC8qIENBTV9TSVpFICovCi0JCXJldHVybjsKLQotCXBzdGEgPSBwbWxtZWluZm8tPkZXX3N0YV9pbmZvW21hY19pZF0ucHN0YTsKLQlpZiAocHN0YSA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlzd2l0Y2ggKG1hY19pZCkgewotCWNhc2UgMDovKiAgZm9yIGluZnJhIG1vZGUgKi8KLQkJc3VwcG9ydFJhdGVOdW0gPQotCQkJcnR3X2dldF9yYXRlc2V0X2xlbjIzYShjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMpOwotCQluZXR3b3JrVHlwZSA9IGp1ZGdlX25ldHdvcmtfdHlwZTIzYShwYWRhcHRlciwKLQkJCQkJCSBjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMsCi0JCQkJCQkgc3VwcG9ydFJhdGVOdW0pICYgMHhmOwotCQkvKiBwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgPSBuZXR3b3JrVHlwZTsgKi8KLQkJcmFpZCA9IG5ldHdvcmt0eXBlX3RvX3JhaWQyM2EobmV0d29ya1R5cGUpOwotCi0JCW1hc2sgPSB1cGRhdGVfc3VwcG9ydGVkX3JhdGUyM2EoY3VyX25ldHdvcmstPlN1cHBvcnRlZFJhdGVzLAotCQkJCQkgICAgIHN1cHBvcnRSYXRlTnVtKTsKLQkJbWFzayB8PSAocG1sbWVpbmZvLT5IVF9lbmFibGUpID8KLQkJCXVwZGF0ZV9NU0NfcmF0ZTIzYSgmcG1sbWVpbmZvLT5odF9jYXApIDogMDsKLQotCQlpZiAoc3VwcG9ydF9zaG9ydF9HSTIzYShwYWRhcHRlciwgJnBtbG1laW5mby0+aHRfY2FwKSkKLQkJCXNob3J0R0lyYXRlID0gdHJ1ZTsKLQkJYnJlYWs7Ci0KLQljYXNlIDE6LyogZm9yIGJyb2FkY2FzdC9tdWx0aWNhc3QgKi8KLQkJZndfc3RhID0gJnBtbG1laW5mby0+Rldfc3RhX2luZm9bbWFjX2lkXTsgCi0JCXN1cHBvcnRSYXRlTnVtID0gcnR3X2dldF9yYXRlc2V0X2xlbjIzYShmd19zdGEtPlN1cHBvcnRlZFJhdGVzKTsKLQkJaWYgKHBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSAmIFdJUkVMRVNTXzExQikKLQkJCW5ldHdvcmtUeXBlID0gV0lSRUxFU1NfMTFCOwotCQllbHNlCi0JCQluZXR3b3JrVHlwZSA9IFdJUkVMRVNTXzExRzsKLQkJcmFpZCA9IG5ldHdvcmt0eXBlX3RvX3JhaWQyM2EobmV0d29ya1R5cGUpOwotCi0JCW1hc2sgPSB1cGRhdGVfYmFzaWNfcmF0ZTIzYShjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMsCi0JCQkJCSBzdXBwb3J0UmF0ZU51bSk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDogLyogZm9yIGVhY2ggc3RhIGluIElCU1MgKi8KLQkJZndfc3RhID0gJnBtbG1laW5mby0+Rldfc3RhX2luZm9bbWFjX2lkXTsgCi0JCXN1cHBvcnRSYXRlTnVtID0gcnR3X2dldF9yYXRlc2V0X2xlbjIzYShmd19zdGEtPlN1cHBvcnRlZFJhdGVzKTsKLQkJbmV0d29ya1R5cGUgPSBqdWRnZV9uZXR3b3JrX3R5cGUyM2EocGFkYXB0ZXIsCi0JCQkJCQkgICAgZndfc3RhLT5TdXBwb3J0ZWRSYXRlcywKLQkJCQkJCSAgICBzdXBwb3J0UmF0ZU51bSkgJiAweGY7Ci0JCS8qIHBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSA9IG5ldHdvcmtUeXBlOyAqLwotCQlyYWlkID0gbmV0d29ya3R5cGVfdG9fcmFpZDIzYShuZXR3b3JrVHlwZSk7Ci0KLQkJbWFzayA9IHVwZGF0ZV9zdXBwb3J0ZWRfcmF0ZTIzYShjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMsCi0JCQkJCQlzdXBwb3J0UmF0ZU51bSk7Ci0KLQkJLyogdG9kbzogc3VwcG9ydCBIVCBpbiBJQlNTICovCi0JCWJyZWFrOwotCX0KLQotCS8qIG1hc2sgJj0gMHgwZmZmZmZmZjsgKi8KLQlyYXRlX2JpdG1hcCA9IE9ETV9HZXRfUmF0ZV9CaXRtYXAyM2EocEhhbERhdGEsIG1hY19pZCwgbWFzaywKLQkJCQkJICAgICByc3NpX2xldmVsKTsKLQlEQkdfODcyM0EoIiVzID0+IG1hY19pZDolZCwgbmV0d29ya1R5cGU6MHglMDJ4LCAiCi0JCSAgIm1hc2s6MHglMDh4XG5cdCA9PT4gcnNzaV9sZXZlbDolZCwgcmF0ZV9iaXRtYXA6MHglMDh4XG4iLAotCQkgIF9fZnVuY19fLCBtYWNfaWQsIG5ldHdvcmtUeXBlLCBtYXNrLCByc3NpX2xldmVsLCByYXRlX2JpdG1hcCk7Ci0KLQltYXNrICY9IHJhdGVfYml0bWFwOwotCW1hc2sgfD0gKChyYWlkIDw8IDI4KSAmIDB4ZjAwMDAwMDApOwotCi0JaW5pdF9yYXRlID0gZ2V0X2hpZ2hlc3RfcmF0ZV9pZHgyM2EobWFzaykgJiAweDNmOwotCi0JYXJnID0gbWFjX2lkICYgMHgxZjsvKiBNQUNJRCAqLwotCWFyZyB8PSBCSVQoNyk7Ci0KLQlpZiAoc2hvcnRHSXJhdGUgPT0gdHJ1ZSkKLQkJYXJnIHw9IEJJVCg1KTsKLQotCURCR184NzIzQSgidXBkYXRlIHJhaWQgZW50cnksIG1hc2sgPSAweCV4LCBhcmcgPSAweCV4XG4iLCBtYXNrLCBhcmcpOwotCi0JcnRsODcyM2Ffc2V0X3JhaWRfY21kKHBhZGFwdGVyLCBtYXNrLCBhcmcpOwotCi0JLyogc2V0IHJhX2lkICovCi0JcHN0YS0+cmFpZCA9IHJhaWQ7Ci0JcHN0YS0+aW5pdF9yYXRlID0gaW5pdF9yYXRlOwotCi0JLyogc2V0IGNvcnJlY3QgaW5pdGlhbCBkYXRlIHJhdGUgZm9yIGVhY2ggbWFjX2lkICovCi0JcGRtcHJpdi0+SU5JREFUQV9SQVRFW21hY19pZF0gPSBpbml0X3JhdGU7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC91c2Jfb3BzX2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC91c2Jfb3BzX2xpbnV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjODFmZjQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvdXNiX29wc19saW51eC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfSENJX09QU19PU19DXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPG9zZGVwX2ludGYuaD4KLSNpbmNsdWRlIDx1c2Jfb3BzLmg+Ci0jaW5jbHVkZSA8cmVjdl9vc2RlcC5oPgotI2luY2x1ZGUgPHJ0bDg3MjNhX2hhbC5oPgotI2luY2x1ZGUgPHJ0bDg3MjNhX3JlY3YuaD4KLQotdTggcnRsODcyM2F1X3JlYWQ4KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiBhZGRyKQotewotCXN0cnVjdCBkdm9ial9wcml2ICpwZHZvYmpwcml2ID0gYWRhcHRlcl90b19kdm9iaihwYWRhcHRlcik7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBwZHZvYmpwcml2LT5wdXNiZGV2OwotCWludCBsZW47Ci0JdTggZGF0YTsKLQotCW11dGV4X2xvY2soJnBkdm9ianByaXYtPnVzYl92ZW5kb3JfcmVxX211dGV4KTsKLQlsZW4gPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3JjdmN0cmxwaXBlKHVkZXYsIDApLAotCQkJICAgICAgUkVBTFRFS19VU0JfVkVOUVRfQ01EX1JFUSwgUkVBTFRFS19VU0JfVkVOUVRfUkVBRCwKLQkJCSAgICAgIGFkZHIsIDAsICZwZHZvYmpwcml2LT51c2JfYnVmLnZhbDgsIHNpemVvZihkYXRhKSwKLQkJCSAgICAgIFJUV19VU0JfQ09OVFJPTF9NU0dfVElNRU9VVCk7Ci0KLQlkYXRhID0gcGR2b2JqcHJpdi0+dXNiX2J1Zi52YWw4OwotCW11dGV4X3VubG9jaygmcGR2b2JqcHJpdi0+dXNiX3ZlbmRvcl9yZXFfbXV0ZXgpOwotCi0JcmV0dXJuIGRhdGE7Ci19Ci0KLXUxNiBydGw4NzIzYXVfcmVhZDE2KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiBhZGRyKQotewotCXN0cnVjdCBkdm9ial9wcml2ICpwZHZvYmpwcml2ID0gYWRhcHRlcl90b19kdm9iaihwYWRhcHRlcik7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBwZHZvYmpwcml2LT5wdXNiZGV2OwotCWludCBsZW47Ci0JdTE2IGRhdGE7Ci0KLQltdXRleF9sb2NrKCZwZHZvYmpwcml2LT51c2JfdmVuZG9yX3JlcV9tdXRleCk7Ci0JbGVuID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKSwKLQkJCSAgICAgIFJFQUxURUtfVVNCX1ZFTlFUX0NNRF9SRVEsIFJFQUxURUtfVVNCX1ZFTlFUX1JFQUQsCi0JCQkgICAgICBhZGRyLCAwLCAmcGR2b2JqcHJpdi0+dXNiX2J1Zi52YWwxNiwgc2l6ZW9mKGRhdGEpLAotCQkJICAgICAgUlRXX1VTQl9DT05UUk9MX01TR19USU1FT1VUKTsKLQotCWRhdGEgPSBsZTE2X3RvX2NwdShwZHZvYmpwcml2LT51c2JfYnVmLnZhbDE2KTsKLQltdXRleF91bmxvY2soJnBkdm9ianByaXYtPnVzYl92ZW5kb3JfcmVxX211dGV4KTsKLQotCXJldHVybiBkYXRhOwotfQotCi11MzIgcnRsODcyM2F1X3JlYWQzMihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MTYgYWRkcikKLXsKLQlzdHJ1Y3QgZHZvYmpfcHJpdiAqcGR2b2JqcHJpdiA9IGFkYXB0ZXJfdG9fZHZvYmoocGFkYXB0ZXIpOwotCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gcGR2b2JqcHJpdi0+cHVzYmRldjsKLQlpbnQgbGVuOwotCXUzMiBkYXRhOwotCi0JbXV0ZXhfbG9jaygmcGR2b2JqcHJpdi0+dXNiX3ZlbmRvcl9yZXFfbXV0ZXgpOwotCWxlbiA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksCi0JCQkgICAgICBSRUFMVEVLX1VTQl9WRU5RVF9DTURfUkVRLCBSRUFMVEVLX1VTQl9WRU5RVF9SRUFELAotCQkJICAgICAgYWRkciwgMCwgJnBkdm9ianByaXYtPnVzYl9idWYudmFsMzIsIHNpemVvZihkYXRhKSwKLQkJCSAgICAgIFJUV19VU0JfQ09OVFJPTF9NU0dfVElNRU9VVCk7Ci0KLQlkYXRhID0gbGUzMl90b19jcHUocGR2b2JqcHJpdi0+dXNiX2J1Zi52YWwzMik7Ci0JbXV0ZXhfdW5sb2NrKCZwZHZvYmpwcml2LT51c2JfdmVuZG9yX3JlcV9tdXRleCk7Ci0KLQlyZXR1cm4gZGF0YTsKLX0KLQotaW50IHJ0bDg3MjNhdV93cml0ZTgoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTE2IGFkZHIsIHU4IHZhbCkKLXsKLQlzdHJ1Y3QgZHZvYmpfcHJpdiAqcGR2b2JqcHJpdiA9IGFkYXB0ZXJfdG9fZHZvYmoocGFkYXB0ZXIpOwotCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gcGR2b2JqcHJpdi0+cHVzYmRldjsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmcGR2b2JqcHJpdi0+dXNiX3ZlbmRvcl9yZXFfbXV0ZXgpOwotCXBkdm9ianByaXYtPnVzYl9idWYudmFsOCA9IHZhbDsKLQotCXJldCA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCi0JCQkgICAgICBSRUFMVEVLX1VTQl9WRU5RVF9DTURfUkVRLAotCQkJICAgICAgUkVBTFRFS19VU0JfVkVOUVRfV1JJVEUsCi0JCQkgICAgICBhZGRyLCAwLCAmcGR2b2JqcHJpdi0+dXNiX2J1Zi52YWw4LCBzaXplb2YodmFsKSwKLQkJCSAgICAgIFJUV19VU0JfQ09OVFJPTF9NU0dfVElNRU9VVCk7Ci0KLQlpZiAocmV0ICE9IHNpemVvZih2YWwpKQotCQlyZXQgPSBfRkFJTDsKLQllbHNlCi0JCXJldCA9IF9TVUNDRVNTOwotCi0JbXV0ZXhfdW5sb2NrKCZwZHZvYmpwcml2LT51c2JfdmVuZG9yX3JlcV9tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IHJ0bDg3MjNhdV93cml0ZTE2KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiBhZGRyLCB1MTYgdmFsKQotewotCXN0cnVjdCBkdm9ial9wcml2ICpwZHZvYmpwcml2ID0gYWRhcHRlcl90b19kdm9iaihwYWRhcHRlcik7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBwZHZvYmpwcml2LT5wdXNiZGV2OwotCWludCByZXQ7Ci0KLQltdXRleF9sb2NrKCZwZHZvYmpwcml2LT51c2JfdmVuZG9yX3JlcV9tdXRleCk7Ci0JcGR2b2JqcHJpdi0+dXNiX2J1Zi52YWwxNiA9IGNwdV90b19sZTE2KHZhbCk7Ci0KLQlyZXQgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAotCQkJICAgICAgUkVBTFRFS19VU0JfVkVOUVRfQ01EX1JFUSwKLQkJCSAgICAgIFJFQUxURUtfVVNCX1ZFTlFUX1dSSVRFLAotCQkJICAgICAgYWRkciwgMCwgJnBkdm9ianByaXYtPnVzYl9idWYudmFsMTYsIHNpemVvZih2YWwpLAotCQkJICAgICAgUlRXX1VTQl9DT05UUk9MX01TR19USU1FT1VUKTsKLQotCWlmIChyZXQgIT0gc2l6ZW9mKHZhbCkpCi0JCXJldCA9IF9GQUlMOwotCWVsc2UKLQkJcmV0ID0gX1NVQ0NFU1M7Ci0KLQltdXRleF91bmxvY2soJnBkdm9ianByaXYtPnVzYl92ZW5kb3JfcmVxX211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgcnRsODcyM2F1X3dyaXRlMzIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTE2IGFkZHIsIHUzMiB2YWwpCi17Ci0Jc3RydWN0IGR2b2JqX3ByaXYgKnBkdm9ianByaXYgPSBhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHBkdm9ianByaXYtPnB1c2JkZXY7Ci0JaW50IHJldDsKLQotCW11dGV4X2xvY2soJnBkdm9ianByaXYtPnVzYl92ZW5kb3JfcmVxX211dGV4KTsKLQlwZHZvYmpwcml2LT51c2JfYnVmLnZhbDMyID0gY3B1X3RvX2xlMzIodmFsKTsKLQotCXJldCA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCi0JCQkgICAgICBSRUFMVEVLX1VTQl9WRU5RVF9DTURfUkVRLAotCQkJICAgICAgUkVBTFRFS19VU0JfVkVOUVRfV1JJVEUsCi0JCQkgICAgICBhZGRyLCAwLCAmcGR2b2JqcHJpdi0+dXNiX2J1Zi52YWwzMiwgc2l6ZW9mKHZhbCksCi0JCQkgICAgICBSVFdfVVNCX0NPTlRST0xfTVNHX1RJTUVPVVQpOwotCi0JaWYgKHJldCAhPSBzaXplb2YodmFsKSkKLQkJcmV0ID0gX0ZBSUw7Ci0JZWxzZQotCQlyZXQgPSBfU1VDQ0VTUzsKLQotCW11dGV4X3VubG9jaygmcGR2b2JqcHJpdi0+dXNiX3ZlbmRvcl9yZXFfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KLWludCBydGw4NzIzYXVfd3JpdGVOKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiBhZGRyLCB1MTYgbGVuLCB1OCAqYnVmKQotewotCXN0cnVjdCBkdm9ial9wcml2ICpwZHZvYmpwcml2ID0gYWRhcHRlcl90b19kdm9iaihwYWRhcHRlcik7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBwZHZvYmpwcml2LT5wdXNiZGV2OwotCWludCByZXQ7Ci0KLQlyZXQgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLAotCQkJICAgICAgUkVBTFRFS19VU0JfVkVOUVRfQ01EX1JFUSwKLQkJCSAgICAgIFJFQUxURUtfVVNCX1ZFTlFUX1dSSVRFLAotCQkJICAgICAgYWRkciwgMCwgYnVmLCBsZW4sIFJUV19VU0JfQ09OVFJPTF9NU0dfVElNRU9VVCk7Ci0KLQlpZiAocmV0ICE9IGxlbikKLQkJcmV0dXJuIF9GQUlMOwotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotLyoKLSAqIERlc2NyaXB0aW9uOgotICoJUmVjb2duaXplIHRoZSBpbnRlcnJ1cHQgY29udGVudCBieSByZWFkaW5nIHRoZSBpbnRlcnJ1cHQKLSAqCXJlZ2lzdGVyIG9yIGNvbnRlbnQgYW5kIG1hc2tpbmcgaW50ZXJydXB0IG1hc2sgKElNUikKLSAqCWlmIGl0IGlzIG91ciBOSUMncyBpbnRlcnJ1cHQuIEFmdGVyIHJlY29nbml6aW5nLCB3ZSBtYXkgY2xlYXIKLSAqCXRoZSBhbGwgaW50ZXJydXB0cyAoSVNSKS4KLSAqIEFyZ3VtZW50czoKLSAqCVtpbl0gQWRhcHRlciAtCi0gKgkJVGhlIGFkYXB0ZXIgY29udGV4dC4KLSAqCVtpbl0gcENvbnRlbnQgLQotICoJCVVuZGVyIFBDSSBpbnRlcmZhY2UsIHRoaXMgZmllbGQgaXMgaWdub3JkLgotICoJCVVuZGVyIFVTQiBpbnRlcmZhY2UsIHRoZSBjb250ZW50IGlzIHRoZSBpbnRlcnJ1cHQKLSAqCQljb250ZW50IHBvaW50ZXIuCi0gKgkJVW5kZXIgU0RJTyBpbnRlcmZhY2UsIHRoaXMgaXMgdGhlIGludGVycnVwdCB0eXBlIHdoaWNoCi0gKgkJaXMgTG9jYWwgaW50ZXJydXB0IG9yIHN5c3RlbSBpbnRlcnJ1cHQuCi0gKglbaW5dIENvbnRlbnRMZW4gLQotICoJCVRoZSBsZW5ndGggaW4gYnl0ZSBvZiBwQ29udGVudC4KLSAqIFJldHVybjoKLSAqCUlmIGFueSBpbnRlcnJ1cHQgbWF0Y2hlcyB0aGUgbWFzayAoSU1SKSwgcmV0dXJuIHRydWUsIGFuZAotICoJcmV0dXJuIGZhbHNlIG90aGVyd2lzZS4KLSAqLwotc3RhdGljIGJvb2wKLUludGVycnVwdFJlY29nbml6ZWQ4NzIzQVUoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB2b2lkICpwQ29udGVudCwKLQkJCSAgdTMyIENvbnRlbnRMZW4pCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQl1OCAqYnVmZmVyID0gKHU4ICopcENvbnRlbnQ7Ci0Jc3RydWN0IHJlcG9ydHB3cnN0YXRlX3Bhcm0gcmVwb3J0OwotCi0JbWVtY3B5KCZwSGFsRGF0YS0+SW50QXJyYXlbMF0sICZidWZmZXJbVVNCX0lOVFJfQ09OVEVOVF9ISVNSX09GRlNFVF0sCi0JICAgICAgIDQpOwotCXBIYWxEYXRhLT5JbnRBcnJheVswXSAmPSBwSGFsRGF0YS0+SW50ck1hc2tbMF07Ci0KLQkvKiBGb3IgSElTUiBleHRlbnNpb24uIEFkZGVkIGJ5IHR5bmxpLiAyMDA5LjEwLjA3LiAqLwotCW1lbWNweSgmcEhhbERhdGEtPkludEFycmF5WzFdLAotCSAgICAgICAmYnVmZmVyW1VTQl9JTlRSX0NPTlRFTlRfSElTUkVfT0ZGU0VUXSwgNCk7Ci0JcEhhbERhdGEtPkludEFycmF5WzFdICY9IHBIYWxEYXRhLT5JbnRyTWFza1sxXTsKLQotCS8qIFdlIHNob2x1ZCByZW1vdmUgdGhpcyBmdW5jdGlvbiBsYXRlciBiZWNhdXNlIERESyBzdWdnZXN0Ci0JICogbm90IHRvIGV4ZWN1dGluZyB0b28gbWFueSBvcGVyYXRpb25zIGluIE1QSVNSICAqLwotCi0JbWVtY3B5KCZyZXBvcnQuc3RhdGUsICZidWZmZXJbVVNCX0lOVFJfQ1BXTV9PRkZTRVRdLCAxKTsKLQotCXJldHVybiAocEhhbERhdGEtPkludEFycmF5WzBdICYgcEhhbERhdGEtPkludHJNYXNrWzBdKSAhPSAwIHx8Ci0JCShwSGFsRGF0YS0+SW50QXJyYXlbMV0gJiBwSGFsRGF0YS0+SW50ck1hc2tbMV0pICE9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHVzYl9yZWFkX2ludGVycnVwdF9jb21wbGV0ZShzdHJ1Y3QgdXJiICpwdXJiKQotewotCWludCBlcnI7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKilwdXJiLT5jb250ZXh0OwotCi0JaWYgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkIHx8IHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fAotCSAgICBwYWRhcHRlci0+YlJlYWRQb3J0Q2FuY2VsKSB7Ci0JCURCR184NzIzQSgiJXMoKSBSWCBXYXJuaW5nISBiRHJpdmVyU3RvcHBlZCglZCkgT1IgIgotCQkJICAiYlN1cnByaXNlUmVtb3ZlZCglZCkgYlJlYWRQb3J0Q2FuY2VsKCVkKVxuIiwKLQkJCSAgX19mdW5jX18sIHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCwKLQkJCSAgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQsCi0JCQkgIHBhZGFwdGVyLT5iUmVhZFBvcnRDYW5jZWwpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHB1cmItPnN0YXR1cyA9PSAwKSB7Ci0JCXN0cnVjdCBjMmhfZXZ0X2hkciAqYzJoX2V2dDsKLQotCQljMmhfZXZ0ID0gKHN0cnVjdCBjMmhfZXZ0X2hkciAqKXB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKLQotCQlpZiAocHVyYi0+YWN0dWFsX2xlbmd0aCA+IFVTQl9JTlRSX0NPTlRFTlRfTEVOR1RIKSB7Ci0JCQlEQkdfODcyM0EoInVzYl9yZWFkX2ludGVycnVwdF9jb21wbGV0ZTogcHVyYi0+YWN0dWFsXyIKLQkJCQkgICJsZW5ndGggPiBVU0JfSU5UUl9DT05URU5UX0xFTkdUSFxuIik7Ci0JCQlnb3RvIHVyYl9zdWJtaXQ7Ci0JCX0KLQotCQlJbnRlcnJ1cHRSZWNvZ25pemVkODcyM0FVKHBhZGFwdGVyLCBwdXJiLT50cmFuc2Zlcl9idWZmZXIsCi0JCQkJCSAgcHVyYi0+YWN0dWFsX2xlbmd0aCk7Ci0KLQkJaWYgKGMyaF9ldnRfZXhpc3QoYzJoX2V2dCkpIHsKLQkJCWlmIChjMmhfaWRfZmlsdGVyX2NjeF84NzIzYShjMmhfZXZ0LT5pZCkpIHsKLQkJCQkvKiBIYW5kbGUgQ0NYIHJlcG9ydCBoZXJlICovCi0JCQkJaGFuZGxlX3R4cnB0X2NjeF84NzIzYShwYWRhcHRlciwgKHZvaWQgKikKLQkJCQkJCSAgICAgICBjMmhfZXZ0LT5wYXlsb2FkKTsKLQkJCQlzY2hlZHVsZV93b3JrKCZwYWRhcHRlci0+ZXZ0cHJpdi5pcnFfd2spOwotCQkJfSBlbHNlIHsKLQkJCQlzdHJ1Y3QgZXZ0X3dvcmsgKmMydzsKLQkJCQlpbnQgcmVzOwotCi0JCQkJYzJ3ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGV2dF93b3JrKSwKLQkJCQkJCUdGUF9BVE9NSUMpOwotCi0JCQkJaWYgKCFjMncpCi0JCQkJCWdvdG8gdXJiX3N1Ym1pdDsKLQotCQkJCWMydy0+YWRhcHRlciA9IHBhZGFwdGVyOwotCQkJCUlOSVRfV09SSygmYzJ3LT53b3JrLCBydHdfZXZ0X3dvcmspOwotCQkJCW1lbWNweShjMnctPnUuYnVmLCBwdXJiLT50cmFuc2Zlcl9idWZmZXIsIDE2KTsKLQotCQkJCXJlcyA9IHF1ZXVlX3dvcmsocGFkYXB0ZXItPmV2dHByaXYud3EsCi0JCQkJCQkgJmMydy0+d29yayk7Ci0KLQkJCQlpZiAoIXJlcykgewotCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYWxsIHRvICIKLQkJCQkJICAgICAgICJxdWV1ZV93b3JrKCkgZmFpbGVkXG4iLAotCQkJCQkgICAgICAgX19mdW5jX18pOwotCQkJCQlrZnJlZShjMncpOwotCQkJCQlnb3RvIHVyYl9zdWJtaXQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLXVyYl9zdWJtaXQ6Ci0JCWVyciA9IHVzYl9zdWJtaXRfdXJiKHB1cmIsIEdGUF9BVE9NSUMpOwotCQlpZiAoZXJyICYmIChlcnIgIT0gLUVQRVJNKSkgewotCQkJREJHXzg3MjNBKCJjYW5ub3Qgc3VibWl0IGludGVycnVwdCBpbi10b2tlbihlcnIgPSAiCi0JCQkJICAiMHglMDh4KSwgdXJiX3N0YXR1cyA9ICVkXG4iLAotCQkJCSAgZXJyLCBwdXJiLT5zdGF0dXMpOwotCQl9Ci0JfSBlbHNlIHsKLQkJREJHXzg3MjNBKCIjIyM9PiB1c2JfcmVhZF9pbnRlcnJ1cHRfY29tcGxldGUgPT4gdXJiICIKLQkJCSAgInN0YXR1cyglZClcbiIsIHB1cmItPnN0YXR1cyk7Ci0KLQkJc3dpdGNoIChwdXJiLT5zdGF0dXMpIHsKLQkJY2FzZSAtRUlOVkFMOgotCQljYXNlIC1FUElQRToKLQkJY2FzZSAtRU5PREVWOgotCQljYXNlIC1FU0hVVERPV046Ci0JCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCQkgInVzYl9yZWFkX3BvcnRfY29tcGxldGU6YlN1cnByaXNlUmVtb3ZlZCA9dHJ1ZVxuIik7Ci0JCQkvKiBGYWxsIFRocm91Z2ggaGVyZSAqLwotCQljYXNlIC1FTk9FTlQ6Ci0JCQlwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPSB0cnVlOwotCQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJ1c2JfcmVhZF9wb3J0X2NvbXBsZXRlOmJEcml2ZXJTdG9wcGVkID10cnVlXG4iKTsKLQkJCWJyZWFrOwotCQljYXNlIC1FUFJPVE86Ci0JCQlicmVhazsKLQkJY2FzZSAtRUlOUFJPR1JFU1M6Ci0JCQlEQkdfODcyM0EoIkVSUk9SOiBVUkIgSVMgSU4gUFJPR1JFU1MhXG4iKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLWludCBydGw4NzIzYXVfcmVhZF9pbnRlcnJ1cHQoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKQotewotCWludCBlcnI7Ci0JdW5zaWduZWQgaW50IHBpcGU7Ci0JaW50IHJldCA9IF9TVUNDRVNTOwotCXN0cnVjdCBkdm9ial9wcml2ICpwZHZvYmogPSBhZGFwdGVyX3RvX2R2b2JqKGFkYXB0ZXIpOwotCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICZhZGFwdGVyLT5yZWN2cHJpdjsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqcHVzYmQgPSBwZHZvYmotPnB1c2JkZXY7Ci0KLQkvKiB0cmFuc2xhdGUgRE1BIEZJRk8gYWRkciB0byBwaXBlaGFuZGxlICovCi0JcGlwZSA9IHVzYl9yY3ZpbnRwaXBlKHB1c2JkLCBwZHZvYmotPlJ0SW5QaXBlWzFdKTsKLQotCXVzYl9maWxsX2ludF91cmIocHJlY3Zwcml2LT5pbnRfaW5fdXJiLCBwdXNiZCwgcGlwZSwKLQkJCSBwcmVjdnByaXYtPmludF9pbl9idWYsIFVTQl9JTlRSX0NPTlRFTlRfTEVOR1RILAotCQkJIHVzYl9yZWFkX2ludGVycnVwdF9jb21wbGV0ZSwgYWRhcHRlciwgMSk7Ci0KLQllcnIgPSB1c2Jfc3VibWl0X3VyYihwcmVjdnByaXYtPmludF9pbl91cmIsIEdGUF9BVE9NSUMpOwotCWlmIChlcnIgJiYgKGVyciAhPSAtRVBFUk0pKSB7Ci0JCURCR184NzIzQSgiY2Fubm90IHN1Ym1pdCBpbnRlcnJ1cHQgaW4tdG9rZW4oZXJyID0gMHglMDh4KSwiCi0JCQkgICJ1cmJfc3RhdHVzID0gJWRcbiIsIGVyciwKLQkJCSAgcHJlY3Zwcml2LT5pbnRfaW5fdXJiLT5zdGF0dXMpOwotCQlyZXQgPSBfRkFJTDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHJlY3ZidWYycmVjdmZyYW1lKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpwc2tiKQotewotCXU4CSpwYnVmOwotCXU4CXNoaWZ0X3N6ID0gMDsKLQl1MTYJcGt0X2NudDsKLQl1MzIJcGt0X29mZnNldCwgc2tiX2xlbiwgYWxsb2Nfc3o7Ci0JaW50CXRyYW5zZmVyX2xlbjsKLQlzdHJ1Y3QgcmVjdl9zdGF0ICpwcnhzdGF0OwotCXN0cnVjdCBwaHlfc3RhdAkqcHBoeV9pbmZvOwotCXN0cnVjdCBza19idWZmICpwa3RfY29weTsKLQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZTsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYjsKLQlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYgPSAmcGFkYXB0ZXItPnJlY3Zwcml2OwotCXN0cnVjdCBydHdfcXVldWUgKnBmcmVlX3JlY3ZfcXVldWUgPSAmcHJlY3Zwcml2LT5mcmVlX3JlY3ZfcXVldWU7Ci0KLQl0cmFuc2Zlcl9sZW4gPSAoaW50KXBza2ItPmxlbjsKLQlwYnVmID0gcHNrYi0+ZGF0YTsKLQotCXByeHN0YXQgPSAoc3RydWN0IHJlY3Zfc3RhdCAqKXBidWY7Ci0JcGt0X2NudCA9IChsZTMyX3RvX2NwdShwcnhzdGF0LT5yeGR3MikgPj4gMTYpICYgMHhmZjsKLQotCWRvIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCi0JCQkgInJlY3ZidWYycmVjdmZyYW1lOiByeGRlc2MgPSBvZmZzc2V0IDA6MHglMDh4LCA0OjB4JTA4eCwgODoweCUwOHgsIEM6MHglMDh4XG4iLAotCQkJIHByeHN0YXQtPnJ4ZHcwLCBwcnhzdGF0LT5yeGR3MSwKLQkJCSBwcnhzdGF0LT5yeGR3MiwgcHJ4c3RhdC0+cnhkdzQpOwotCi0JCXByeHN0YXQgPSAoc3RydWN0IHJlY3Zfc3RhdCAqKXBidWY7Ci0KLQkJcHJlY3ZmcmFtZSA9IHJ0d19hbGxvY19yZWN2ZnJhbWUyM2EocGZyZWVfcmVjdl9xdWV1ZSk7Ci0JCWlmICghcHJlY3ZmcmFtZSkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkgInJlY3ZidWYycmVjdmZyYW1lOiBwcmVjdmZyYW1lID09IE5VTExcbiIpOwotCQkJREJHXzg3MjNBKCIlcygpLSVkOiBydHdfYWxsb2NfcmVjdmZyYW1lMjNhKCkgZmFpbGVkISBSWCAiCi0JCQkJICAiRHJvcCFcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlnb3RvIF9leGl0X3JlY3ZidWYycmVjdmZyYW1lOwotCQl9Ci0KLQkJSU5JVF9MSVNUX0hFQUQoJnByZWN2ZnJhbWUtPmxpc3QpOwotCi0JCXVwZGF0ZV9yZWN2ZnJhbWVfYXR0cmliKHByZWN2ZnJhbWUsIHByeHN0YXQpOwotCi0JCXBhdHRyaWIgPSAmcHJlY3ZmcmFtZS0+YXR0cmliOwotCi0JCWlmIChwYXR0cmliLT5jcmNfZXJyKSB7Ci0JCQlEQkdfODcyM0EoIiVzKCktJWQ6IFJYIFdhcm5pbmchIHJ4IENSQyBFUlJPUiAhIVxuIiwKLQkJCQkgIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQlydHdfZnJlZV9yZWN2ZnJhbWUyM2EocHJlY3ZmcmFtZSk7Ci0JCQlnb3RvIF9leGl0X3JlY3ZidWYycmVjdmZyYW1lOwotCQl9Ci0KLQkJcGt0X29mZnNldCA9IFJYREVTQ19TSVpFICsgcGF0dHJpYi0+ZHJ2aW5mb19zeiArCi0JCQlwYXR0cmliLT5zaGlmdF9zeiArIHBhdHRyaWItPnBrdF9sZW47Ci0KLQkJaWYgKHBhdHRyaWItPnBrdF9sZW4gPD0gMCB8fCBwa3Rfb2Zmc2V0ID4gdHJhbnNmZXJfbGVuKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJCQkgInJlY3ZidWYycmVjdmZyYW1lOiBwa3RfbGVuPD0gMFxuIik7Ci0JCQlEQkdfODcyM0EoIiVzKCktJWQ6IFJYIFdhcm5pbmchXG4iLAotCQkJCSAgX19mdW5jX18sIF9fTElORV9fKTsKLQkJCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYShwcmVjdmZyYW1lKTsKLQkJCWdvdG8gX2V4aXRfcmVjdmJ1ZjJyZWN2ZnJhbWU7Ci0JCX0KLQotCQkvKglNb2RpZmllZCBieSBBbGJlcnQgMjAxMDEyMTMgKi8KLQkJLyoJRm9yIDggYnl0ZXMgSVAgaGVhZGVyIGFsaWdubWVudC4gKi8KLQkJLyoJUW9zIGRhdGEsIHdpcmVsZXNzIGxhbiBoZWFkZXIgbGVuZ3RoIGlzIDI2ICovCi0JCWlmIChwYXR0cmliLT5xb3MpCi0JCQlzaGlmdF9zeiA9IDY7Ci0JCWVsc2UKLQkJCXNoaWZ0X3N6ID0gMDsKLQotCQlza2JfbGVuID0gcGF0dHJpYi0+cGt0X2xlbjsKLQotCQkvKiBmb3IgZmlyc3QgZnJhZ21lbnQgcGFja2V0LCBkcml2ZXIgbmVlZCBhbGxvY2F0ZQotCQkgKiAxNTM2K2RydmluZm9fc3orUlhERVNDX1NJWkUgdG8gZGVmcmFnIHBhY2tldC4KLQkJICogbW9kaWZ5IGFsbG9jX3N6IGZvciByZWN2aXZlIGNyYyBlcnJvciBwYWNrZXQKLQkJICogYnkgdGhvbWFzIDIwMTEtMDYtMDIgKi8KLQkJaWYgKHBhdHRyaWItPm1mcmFnID09IDEgJiYgcGF0dHJpYi0+ZnJhZ19udW0gPT0gMCkgewotCQkJLyogYWxsb2Nfc3ogPSAxNjY0OwkxNjY0IGlzIDEyOCBhbGlnbm1lbnQuICovCi0JCQlpZiAoc2tiX2xlbiA8PSAxNjUwKQotCQkJCWFsbG9jX3N6ID0gMTY2NDsKLQkJCWVsc2UKLQkJCQlhbGxvY19zeiA9IHNrYl9sZW4gKyAxNDsKLQkJfSBlbHNlIHsKLQkJCWFsbG9jX3N6ID0gc2tiX2xlbjsKLQkJLyogIDYgaXMgZm9yIElQIGhlYWRlciA4IGJ5dGVzIGFsaWdubWVudCBpbiBRb1MgcGFja2V0IGNhc2UuICovCi0JCS8qICA4IGlzIGZvciBza2ItPmRhdGEgNCBieXRlcyBhbGlnbm1lbnQuICovCi0JCQlhbGxvY19zeiArPSAxNDsKLQkJfQotCi0JCXBrdF9jb3B5ID0gbmV0ZGV2X2FsbG9jX3NrYihwYWRhcHRlci0+cG5ldGRldiwgYWxsb2Nfc3opOwotCQlpZiAocGt0X2NvcHkpIHsKLQkJCXBrdF9jb3B5LT5kZXYgPSBwYWRhcHRlci0+cG5ldGRldjsKLQkJCXByZWN2ZnJhbWUtPnBrdCA9IHBrdF9jb3B5OwotCQkJLyogZm9yY2UgcGt0X2NvcHktPmRhdGEgYXQgOC1ieXRlIGFsaWdubWVudCBhZGRyZXNzICovCi0JCQlza2JfcmVzZXJ2ZShwa3RfY29weSwgOCAtCi0JCQkJICAgICgodW5zaWduZWQgbG9uZykocGt0X2NvcHktPmRhdGEpICYgNykpOwotCQkJLypmb3JjZSBpcF9oZHIgYXQgOC1ieXRlIGFsaWdubWVudCBhZGRyZXNzCi0JCQkgIGFjY29yZGluZyB0byBzaGlmdF9zei4gKi8KLQkJCXNrYl9yZXNlcnZlKHBrdF9jb3B5LCBzaGlmdF9zeik7Ci0JCQltZW1jcHkocGt0X2NvcHktPmRhdGEsIHBidWYgKyBwYXR0cmliLT5zaGlmdF9zeiArCi0JCQkgICAgICAgcGF0dHJpYi0+ZHJ2aW5mb19zeiArIFJYREVTQ19TSVpFLCBza2JfbGVuKTsKLQkJCXNrYl9wdXQocGt0X2NvcHksIHNrYl9sZW4pOwotCQl9IGVsc2UgewotCQkJaWYgKHBhdHRyaWItPm1mcmFnID09IDEgJiYgcGF0dHJpYi0+ZnJhZ19udW0gPT0gMCkgewotCQkJCURCR184NzIzQSgicmVjdmJ1ZjJyZWN2ZnJhbWU6IGFsbG9jX3NrYiBmYWlsLCAiCi0JCQkJCSAgImRyb3AgZnJhZyBmcmFtZSBcbiIpOwotCQkJCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYShwcmVjdmZyYW1lKTsKLQkJCQlnb3RvIF9leGl0X3JlY3ZidWYycmVjdmZyYW1lOwotCQkJfQotCi0JCQlwcmVjdmZyYW1lLT5wa3QgPSBza2JfY2xvbmUocHNrYiwgR0ZQX0FUT01JQyk7Ci0JCQlpZiAoIXByZWN2ZnJhbWUtPnBrdCkgewotCQkJCURCR184NzIzQSgicmVjdmJ1ZjJyZWN2ZnJhbWU6IHNrYl9jbG9uZSAiCi0JCQkJCSAgImZhaWxcbiIpOwotCQkJCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYShwcmVjdmZyYW1lKTsKLQkJCQlnb3RvIF9leGl0X3JlY3ZidWYycmVjdmZyYW1lOwotCQkJfQotCQl9Ci0KLQkJaWYgKHBhdHRyaWItPnBoeXN0KSB7Ci0JCQlwcGh5X2luZm8gPSAoc3RydWN0IHBoeV9zdGF0ICopKHBidWYgKyBSWERFU0NfT0ZGU0VUKTsKLQkJCXVwZGF0ZV9yZWN2ZnJhbWVfcGh5aW5mbyhwcmVjdmZyYW1lLCBwcGh5X2luZm8pOwotCQl9Ci0KLQkJaWYgKHJ0d19yZWN2X2VudHJ5MjNhKHByZWN2ZnJhbWUpICE9IF9TVUNDRVNTKQotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkgInJlY3ZidWYycmVjdmZyYW1lOiBydHdfcmVjdl9lbnRyeTIzYShwcmVjdmZyYW1lKSAhPSBfU1VDQ0VTU1xuIik7Ci0KLQkJcGt0X2NudC0tOwotCQl0cmFuc2Zlcl9sZW4gLT0gcGt0X29mZnNldDsKLQkJcGJ1ZiArPSBwa3Rfb2Zmc2V0OwotCQlwcmVjdmZyYW1lID0gTlVMTDsKLQkJcGt0X2NvcHkgPSBOVUxMOwotCi0JCWlmICh0cmFuc2Zlcl9sZW4gPiAwICYmIHBrdF9jbnQgPT0gMCkKLQkJCXBrdF9jbnQgPSAobGUzMl90b19jcHUocHJ4c3RhdC0+cnhkdzIpPj4xNikgJiAweGZmOwotCi0JfSB3aGlsZSAodHJhbnNmZXJfbGVuID4gMCAmJiBwa3RfY250ID4gMCk7Ci0KLV9leGl0X3JlY3ZidWYycmVjdmZyYW1lOgotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi12b2lkIHJ0bDg3MjNhdV9yZWN2X3Rhc2tsZXQodm9pZCAqcHJpdikKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcHNrYjsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBydHdfYWRhcHRlciAqKXByaXY7Ci0Jc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2ID0gJnBhZGFwdGVyLT5yZWN2cHJpdjsKLQotCXdoaWxlIChOVUxMICE9IChwc2tiID0gc2tiX2RlcXVldWUoJnByZWN2cHJpdi0+cnhfc2tiX3F1ZXVlKSkpIHsKLQkJaWYgKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkgewotCQkJREJHXzg3MjNBKCJyZWN2X3Rhc2tsZXQgPT4gYkRyaXZlclN0b3BwZWQgb3IgIgotCQkJCSAgImJTdXJwcmlzZVJlbW92ZWQgXG4iKTsKLQkJCWRldl9rZnJlZV9za2JfYW55KHBza2IpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlyZWN2YnVmMnJlY3ZmcmFtZShwYWRhcHRlciwgcHNrYik7Ci0JCXNrYl9yZXNldF90YWlsX3BvaW50ZXIocHNrYik7Ci0KLQkJcHNrYi0+bGVuID0gMDsKLQotCQlza2JfcXVldWVfdGFpbCgmcHJlY3Zwcml2LT5mcmVlX3JlY3Zfc2tiX3F1ZXVlLCBwc2tiKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHVzYl9yZWFkX3BvcnRfY29tcGxldGUoc3RydWN0IHVyYiAqcHVyYikKLXsKLQlzdHJ1Y3QgcmVjdl9idWYgKnByZWN2YnVmID0gKHN0cnVjdCByZWN2X2J1ZiAqKXB1cmItPmNvbnRleHQ7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKilwcmVjdmJ1Zi0+YWRhcHRlcjsKLQlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYgPSAmcGFkYXB0ZXItPnJlY3Zwcml2OwotCi0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCSAidXNiX3JlYWRfcG9ydF9jb21wbGV0ZSEhIVxuIik7Ci0KLQlwcmVjdnByaXYtPnJ4X3BlbmRpbmdfY250LS07Ci0KLQlpZiAocGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgfHwgcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8Ci0JICAgIHBhZGFwdGVyLT5iUmVhZFBvcnRDYW5jZWwpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkgInVzYl9yZWFkX3BvcnRfY29tcGxldGU6YkRyaXZlclN0b3BwZWQoJWQpIE9SIGJTdXJwcmlzZVJlbW92ZWQoJWQpXG4iLAotCQkJIHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCwgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpOwotCi0JCURCR184NzIzQSgiJXMoKS0lZDogUlggV2FybmluZyEgYkRyaXZlclN0b3BwZWQoJWQpIE9SICIKLQkJCSAgImJTdXJwcmlzZVJlbW92ZWQoJWQpIGJSZWFkUG9ydENhbmNlbCglZClcbiIsCi0JCQkgIF9fZnVuY19fLCBfX0xJTkVfXywgcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkLAotCQkJICBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCwgcGFkYXB0ZXItPmJSZWFkUG9ydENhbmNlbCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocHVyYi0+c3RhdHVzID09IDApIHsKLQkJaWYgKHB1cmItPmFjdHVhbF9sZW5ndGggPiBNQVhfUkVDVkJVRl9TWiB8fAotCQkgICAgcHVyYi0+YWN0dWFsX2xlbmd0aCA8IFJYREVTQ19TSVpFKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCQkgInVzYl9yZWFkX3BvcnRfY29tcGxldGU6IChwdXJiLT5hY3R1YWxfbGVuZ3RoID4gTUFYX1JFQ1ZCVUZfU1opIHx8IChwdXJiLT5hY3R1YWxfbGVuZ3RoIDwgUlhERVNDX1NJWkUpXG4iKTsKLQkJCXJ0bDg3MjNhdV9yZWFkX3BvcnQocGFkYXB0ZXIsIDAsIHByZWN2YnVmKTsKLQkJCURCR184NzIzQSgiJXMoKS0lZDogUlggV2FybmluZyFcbiIsCi0JCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOwotCQl9IGVsc2UgewotCQkJcnR3X3Jlc2V0X2NvbnRpbnVhbF91cmJfZXJyb3IoCi0JCQkJYWRhcHRlcl90b19kdm9iaihwYWRhcHRlcikpOwotCi0JCQlza2JfcHV0KHByZWN2YnVmLT5wc2tiLCBwdXJiLT5hY3R1YWxfbGVuZ3RoKTsKLQkJCXNrYl9xdWV1ZV90YWlsKCZwcmVjdnByaXYtPnJ4X3NrYl9xdWV1ZSwKLQkJCQkgICAgICAgcHJlY3ZidWYtPnBza2IpOwotCi0JCQlpZiAoc2tiX3F1ZXVlX2xlbigmcHJlY3Zwcml2LT5yeF9za2JfcXVldWUpIDw9IDEpCi0JCQkJdGFza2xldF9zY2hlZHVsZSgmcHJlY3Zwcml2LT5yZWN2X3Rhc2tsZXQpOwotCi0JCQlwcmVjdmJ1Zi0+cHNrYiA9IE5VTEw7Ci0JCQlydGw4NzIzYXVfcmVhZF9wb3J0KHBhZGFwdGVyLCAwLCBwcmVjdmJ1Zik7Ci0JCX0KLQl9IGVsc2UgewotCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCSAidXNiX3JlYWRfcG9ydF9jb21wbGV0ZSA6IHB1cmItPnN0YXR1cyglZCkgIT0gMFxuIiwKLQkJCSBwdXJiLT5zdGF0dXMpOwotCQlza2JfcHV0KHByZWN2YnVmLT5wc2tiLCBwdXJiLT5hY3R1YWxfbGVuZ3RoKTsKLQkJcHJlY3ZidWYtPnBza2IgPSBOVUxMOwotCi0JCURCR184NzIzQSgiIyMjPT4gdXNiX3JlYWRfcG9ydF9jb21wbGV0ZSA9PiB1cmIgc3RhdHVzKCVkKVxuIiwKLQkJCSAgcHVyYi0+c3RhdHVzKTsKLQotCQlpZiAocnR3X2luY19hbmRfY2hrX2NvbnRpbnVhbF91cmJfZXJyb3IoCi0JCQkgICAgYWRhcHRlcl90b19kdm9iaihwYWRhcHRlcikpKSB7Ci0JCQlwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCA9IHRydWU7Ci0JCX0KLQotCQlzd2l0Y2ggKHB1cmItPnN0YXR1cykgewotCQljYXNlIC1FSU5WQUw6Ci0JCWNhc2UgLUVQSVBFOgotCQljYXNlIC1FTk9ERVY6Ci0JCWNhc2UgLUVTSFVURE9XTjoKLQkJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJCSAidXNiX3JlYWRfcG9ydF9jb21wbGV0ZTpiU3VycHJpc2VSZW1vdmVkID0gdHJ1ZVxuIik7Ci0JCQkvKiBJbnRlbnRpb25hbCBmYWxsIHRocm91Z2ggaGVyZSAqLwotCQljYXNlIC1FTk9FTlQ6Ci0JCQlwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPSB0cnVlOwotCQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJ1c2JfcmVhZF9wb3J0X2NvbXBsZXRlOmJEcml2ZXJTdG9wcGVkID0gdHJ1ZVxuIik7Ci0JCQlicmVhazsKLQkJY2FzZSAtRVBST1RPOgotCQljYXNlIC1FT1ZFUkZMT1c6Ci0JCQlydGw4NzIzYXVfcmVhZF9wb3J0KHBhZGFwdGVyLCAwLCBwcmVjdmJ1Zik7Ci0JCQlicmVhazsKLQkJY2FzZSAtRUlOUFJPR1JFU1M6Ci0JCQlEQkdfODcyM0EoIkVSUk9SOiBVUkIgSVMgSU4gUFJPR1JFU1MhXG4iKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLWludCBydGw4NzIzYXVfcmVhZF9wb3J0KHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgdTMyIGNudCwKLQkJCXN0cnVjdCByZWN2X2J1ZiAqcHJlY3ZidWYpCi17Ci0Jc3RydWN0IHVyYiAqcHVyYjsKLQlzdHJ1Y3QgZHZvYmpfcHJpdiAqcGR2b2JqID0gYWRhcHRlcl90b19kdm9iaihhZGFwdGVyKTsKLQlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYgPSAmYWRhcHRlci0+cmVjdnByaXY7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnB1c2JkID0gcGR2b2JqLT5wdXNiZGV2OwotCWludCBlcnI7Ci0JdW5zaWduZWQgaW50IHBpcGU7Ci0JdW5zaWduZWQgbG9uZyB0bXBhZGRyOwotCXVuc2lnbmVkIGxvbmcgYWxpZ25tZW50OwotCWludCByZXQgPSBfU1VDQ0VTUzsKLQotCWlmIChhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJICJ1c2JfcmVhZF9wb3J0OihwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHxwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkhISFcbiIpOwotCQlyZXR1cm4gX0ZBSUw7Ci0JfQotCi0JaWYgKCFwcmVjdmJ1ZikgewotCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCSAidXNiX3JlYWRfcG9ydDpwcmVjdmJ1ZiA9PSBOVUxMXG4iKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCWlmICghcHJlY3ZidWYtPnBza2IpCi0JCXByZWN2YnVmLT5wc2tiID0gc2tiX2RlcXVldWUoJnByZWN2cHJpdi0+ZnJlZV9yZWN2X3NrYl9xdWV1ZSk7Ci0KLQkvKiByZS1hc3NpZ24gZm9yIGxpbnV4IGJhc2VkIG9uIHNrYiAqLwotCWlmICghcHJlY3ZidWYtPnBza2IpIHsKLQkJcHJlY3ZidWYtPnBza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKGFkYXB0ZXItPnBuZXRkZXYsIE1BWF9SRUNWQlVGX1NaICsgUkVDVkJVRkZfQUxJR05fU1opOwotCQlpZiAocHJlY3ZidWYtPnBza2IgPT0gTlVMTCkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJpbml0X3JlY3ZidWYoKTogYWxsb2Nfc2tiIGZhaWwhXG4iKTsKLQkJCXJldHVybiBfRkFJTDsKLQkJfQotCi0JCXRtcGFkZHIgPSAodW5zaWduZWQgbG9uZylwcmVjdmJ1Zi0+cHNrYi0+ZGF0YTsKLQkJYWxpZ25tZW50ID0gdG1wYWRkciAmIChSRUNWQlVGRl9BTElHTl9TWi0xKTsKLQkJc2tiX3Jlc2VydmUocHJlY3ZidWYtPnBza2IsIChSRUNWQlVGRl9BTElHTl9TWiAtIGFsaWdubWVudCkpOwotCX0KLQotCXByZWN2cHJpdi0+cnhfcGVuZGluZ19jbnQrKzsKLQotCXB1cmIgPSBwcmVjdmJ1Zi0+cHVyYjsKLQotCS8qIHRyYW5zbGF0ZSBETUEgRklGTyBhZGRyIHRvIHBpcGVoYW5kbGUgKi8KLQlwaXBlID0gdXNiX3JjdmJ1bGtwaXBlKHB1c2JkLCBwZHZvYmotPlJ0SW5QaXBlWzBdKTsKLQotCXVzYl9maWxsX2J1bGtfdXJiKHB1cmIsIHB1c2JkLCBwaXBlLCBwcmVjdmJ1Zi0+cHNrYi0+ZGF0YSwKLQkJCSAgTUFYX1JFQ1ZCVUZfU1osIHVzYl9yZWFkX3BvcnRfY29tcGxldGUsCi0JCQkgIHByZWN2YnVmKTsvKiBjb250ZXh0IGlzIHByZWN2YnVmICovCi0KLQllcnIgPSB1c2Jfc3VibWl0X3VyYihwdXJiLCBHRlBfQVRPTUlDKTsKLQlpZiAoKGVycikgJiYgKGVyciAhPSAtRVBFUk0pKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJICJjYW5ub3Qgc3VibWl0IHJ4IGluLXRva2VuKGVyciA9IDB4JS44eCksIFVSQl9TVEFUVVMgPSAweCUuOHhcbiIsCi0JCQkgZXJyLCBwdXJiLT5zdGF0dXMpOwotCQlEQkdfODcyM0EoImNhbm5vdCBzdWJtaXQgcnggaW4tdG9rZW4oZXJyID0gMHglMDh4KSwgdXJiX3N0YXR1cyAiCi0JCQkgICI9ICVkXG4iLCBlcnIsIHB1cmItPnN0YXR1cyk7Ci0JCXJldCA9IF9GQUlMOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIHJ0bDg3MjNhdV94bWl0X3Rhc2tsZXQodm9pZCAqcHJpdikKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IHJ0d19hZGFwdGVyICopcHJpdjsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSkpCi0JCXJldHVybjsKLQotCXdoaWxlICgxKSB7Ci0JCWlmIChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgfHwKLQkJICAgIHBhZGFwdGVyLT5iV3JpdGVQb3J0Q2FuY2VsKSB7Ci0JCQlEQkdfODcyM0EoInhtaXRfdGFza2xldCA9PiBiRHJpdmVyU3RvcHBlZCBvciAiCi0JCQkJICAiYlN1cnByaXNlUmVtb3ZlZCBvciBiV3JpdGVQb3J0Q2FuY2VsXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0ID0gcnRsODcyM2F1X3htaXRmcmFtZV9jb21wbGV0ZShwYWRhcHRlciwgcHhtaXRwcml2LCBOVUxMKTsKLQotCQlpZiAoIXJldCkKLQkJCWJyZWFrOwotCX0KLX0KLQotdm9pZCBydGw4NzIzYXVfc2V0X2h3X3R5cGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlwYWRhcHRlci0+Y2hpcF90eXBlID0gUlRMODcyM0E7Ci0JcGFkYXB0ZXItPkhhcmR3YXJlVHlwZSA9IEhBUkRXQVJFX1RZUEVfUlRMODcyM0FVOwotCURCR184NzIzQSgiQ0hJUCBUWVBFOiBSVEw4NzIzQVxuIik7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsODcyM0FQaHlDZmcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWw4NzIzQVBoeUNmZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2YzNjU3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWw4NzIzQVBoeUNmZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19JTkNfSEFMODcyM1BIWUNGR19IX18KLSNkZWZpbmUgX19JTkNfSEFMODcyM1BIWUNGR19IX18KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgc3RydWN0dXJlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1lbnVtIFJGX1JBRElPX1BBVEggewotCVJGX1BBVEhfQSA9IDAsCQkJLyogUmFkaW8gUGF0aCBBICovCi0JUkZfUEFUSF9CID0gMSwJCQkvKiBSYWRpbyBQYXRoIEIgKi8KLQlSRl9QQVRIX01BWAkJCS8qIE1heCBSRiBudW1iZXIgOTAgc3VwcG9ydCAqLwotfTsKLQotI2RlZmluZSBDSEFOTkVMX01BWF9OVU1CRVIJCTE0CS8qICAxNCBpcyB0aGUgbWF4IGNoYW5uZWwgbnVtYmVyICovCi0KLWVudW0gV0lSRUxFU1NfTU9ERSB7Ci0JV0lSRUxFU1NfTU9ERV9VTktOT1dOCT0gMHgwMCwKLQlXSVJFTEVTU19NT0RFX0EJCT0gQklUKDIpLAotCVdJUkVMRVNTX01PREVfQgkJPSBCSVQoMCksCi0JV0lSRUxFU1NfTU9ERV9HCQk9IEJJVCgxKSwKLQlXSVJFTEVTU19NT0RFX0FVVE8JPSBCSVQoNSksCi0JV0lSRUxFU1NfTU9ERV9OXzI0Rwk9IEJJVCgzKSwKLQlXSVJFTEVTU19NT0RFX05fNUcJPSBCSVQoNCksCi0JV0lSRUxFU1NfTU9ERV9BQwk9IEJJVCg2KQotfTsKLQotc3RydWN0IGJiX3JlZ19kZWZpbmUgewotCXUzMiByZmludGZzOwkJLyogIHNldCBzb2Z0d2FyZSBjb250cm9sOiAqLwotCQkJCS8qCQkweDg3MH4weDg3N1s4IGJ5dGVzXSAqLwotCXUzMiByZmludGZpOwkJLyogIHJlYWRiYWNrIGRhdGE6ICovCi0JCQkJLyoJCTB4OGUwfjB4OGU3WzggYnl0ZXNdICovCi0JdTMyIHJmaW50Zm87CQkvKiAgb3V0cHV0IGRhdGE6ICovCi0JCQkJLyoJCTB4ODYwfjB4ODZmIFsxNiBieXRlc10gKi8KLQl1MzIgcmZpbnRmZTsJCS8qICBvdXRwdXQgZW5hYmxlOiAqLwotCQkJCS8qCQkweDg2MH4weDg2ZiBbMTYgYnl0ZXNdICovCi0JdTMyIHJmM3dpcmVPZmZzZXQ7CS8qICBMU1NJIGRhdGE6ICovCi0JCQkJLyoJCTB4ODQwfjB4ODRmIFsxNiBieXRlc10gKi8KLQl1MzIgcmZMU1NJX1NlbGVjdDsJLyogIEJCIEJhbmQgU2VsZWN0OiAqLwotCQkJCS8qCQkweDg3OH4weDg3ZiBbOCBieXRlc10gKi8KLQl1MzIgcmZUeEdhaW5TdGFnZTsJLyogIFR4IGdhaW4gc3RhZ2U6ICovCi0JCQkJLyoJCTB4ODBjfjB4ODBmIFs0IGJ5dGVzXSAqLwotCXUzMiByZkhTU0lQYXJhMTsJLyogIHdpcmUgcGFyYW1ldGVyIGNvbnRyb2wxIDogKi8KLQkJCQkvKgkJMHg4MjB+MHg4MjMsIDB4ODI4fjB4ODJiLCAweDgzMH4weDgzMywgMHg4Mzh+MHg4M2IgWzE2IGJ5dGVzXSAqLwotCXUzMiByZkhTU0lQYXJhMjsJLyogIHdpcmUgcGFyYW1ldGVyIGNvbnRyb2wyIDogKi8KLQkJCQkvKgkJMHg4MjR+MHg4MjcsIDB4ODJjfjB4ODJmLCAweDgzNH4weDgzNywgMHg4M2N+MHg4M2YgWzE2IGJ5dGVzXSAqLwotCXUzMiByZlN3aXRjaENvbnRyb2w7IC8qIFR4IFJ4IGFudGVubmEgY29udHJvbCA6ICovCi0JCQkJLyoJCTB4ODU4fjB4ODVmIFsxNiBieXRlc10gKi8KLQl1MzIgcmZBR0NDb250cm9sMTsJLyogQUdDIHBhcmFtZXRlciBjb250cm9sMSA6ICovCi0JCQkJLyoJMHhjNTB+MHhjNTMsIDB4YzU4fjB4YzViLCAweGM2MH4weGM2MywgMHhjNjh+MHhjNmIgWzE2IGJ5dGVzXSAqLwotCXUzMiByZkFHQ0NvbnRyb2wyOwkvKiBBR0MgcGFyYW1ldGVyIGNvbnRyb2wyIDogKi8KLQkJCQkvKgkJMHhjNTR+MHhjNTcsIDB4YzVjfjB4YzVmLCAweGM2NH4weGM2NywgMHhjNmN+MHhjNmYgWzE2IGJ5dGVzXSAqLwotCXUzMiByZlJ4SVFJbWJhbGFuY2U7IC8qIE9GRE0gUnggSVEgaW1iYWxhbmNlIG1hdHJpeCA6ICovCi0JCQkJLyoJCTB4YzE0fjB4YzE3LCAweGMxY34weGMxZiwgMHhjMjR+MHhjMjcsIDB4YzJjfjB4YzJmIFsxNiBieXRlc10gKi8KLQl1MzIgcmZSeEFGRTsJCS8qIFJ4IElRIERDIG9mc2V0IGFuZCBSeCBkaWdpdGFsIGZpbHRlciwgUnggREMgbm90Y2ggZmlsdGVyIDogKi8KLQkJCQkvKgkweGMxMH4weGMxMywgMHhjMTh+MHhjMWIsIDB4YzIwfjB4YzIzLCAweGMyOH4weGMyYiBbMTYgYnl0ZXNdICovCi0JdTMyIHJmVHhJUUltYmFsYW5jZTsgLyogT0ZETSBUeCBJUSBpbWJhbGFuY2UgbWF0cml4ICovCi0JCQkJLyoJMHhjODB+MHhjODMsIDB4Yzg4fjB4YzhiLCAweGM5MH4weGM5MywgMHhjOTh+MHhjOWIgWzE2IGJ5dGVzXSAqLwotCXUzMiByZlR4QUZFOwkJLyogVHggSVEgREMgT2Zmc2V0IGFuZCBUeCBERklSIHR5cGUgKi8KLQkJCQkvKgkweGM4NH4weGM4NywgMHhjOGN+MHhjOGYsIDB4Yzk0fjB4Yzk3LCAweGM5Y34weGM5ZiBbMTYgYnl0ZXNdICovCi0JdTMyIHJmTFNTSVJlYWRCYWNrOwkvKiBMU1NJIFJGIHJlYWRiYWNrIGRhdGEgU0kgbW9kZSAqLwotCQkJCS8qCTB4OGEwfjB4OGFmIFsxNiBieXRlc10gKi8KLQl1MzIgcmZMU1NJUmVhZEJhY2tQaTsJLyogTFNTSSBSRiByZWFkYmFjayBkYXRhIFBJIG1vZGUgMHg4YjgtOGJjIGZvciBQYXRoIEEgYW5kIEIgKi8KLX07Ci0KLXN0cnVjdCByX2FudGVubmFfc2VsX29mZG0gewotCXUzMgkJCXJfdHhfYW50ZW5uYTo0OwotCXUzMgkJCXJfYW50X2w6NDsKLQl1MzIJCQlyX2FudF9ub25faHQ6NDsKLQl1MzIJCQlyX2FudF9odDE6NDsKLQl1MzIJCQlyX2FudF9odDI6NDsKLQl1MzIJCQlyX2FudF9odF9zMTo0OwotCXUzMgkJCXJfYW50X25vbl9odF9zMTo0OwotCXUzMgkJCU9GRE1fVFhTQzoyOwotCXUzMgkJCVJlc2VydmVkOjI7Ci19OwotCi1zdHJ1Y3Qgcl9hbnRlbm5hX3NlbF9jY2sgewotCXU4CQkJcl9jY2tyeF9lbmFibGVfMjoyOwotCXU4CQkJcl9jY2tyeF9lbmFibGU6MjsKLQl1OAkJCXJfY2NrdHhfZW5hYmxlOjQ7Ci19OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBzdHJ1Y3R1cmUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydCBnbG9iYWwgdmFyaWFibGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0IGdsb2JhbCB2YXJpYWJsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0IE1hY3JvIERlZmluaXRpb24tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnQgTWFjcm8gRGVmaW5pdGlvbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydGVkIEZ1bmN0aW9uIHByb3RvdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiAgKi8KLS8qICBCQiBhbmQgUkYgcmVnaXN0ZXIgcmVhZC93cml0ZSAqLwotLyogICovCi11MzIJUEhZX1F1ZXJ5QkJSZWcoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1MzIgUmVnQWRkciwKLQkJICAgICAgIHUzMiBCaXRNYXNrKTsKLXZvaWQJUEhZX1NldEJCUmVnKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwgdTMyIFJlZ0FkZHIsCi0JCSAgICAgdTMyIEJpdE1hc2ssIHUzMiBEYXRhKTsKLXUzMglQSFlfUXVlcnlSRlJlZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsCi0JCSAgICAgICBlbnVtIFJGX1JBRElPX1BBVEgJZVJGUGF0aCwgdTMyIFJlZ0FkZHIsCi0JCSAgICAgICB1MzIgQml0TWFzayk7Ci12b2lkCVBIWV9TZXRSRlJlZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsCi0JCSAgICAgZW51bSBSRl9SQURJT19QQVRIIGVSRlBhdGgsIHUzMiBSZWdBZGRyLAotCQkgICAgIHUzMiBCaXRNYXNrLCAgdTMyCURhdGEpOwotCi0vKiAgKi8KLS8qICBCQiBUWCBQb3dlciBSL1cgKi8KLS8qICAqLwotdm9pZCBQSFlfU2V0VHhQb3dlckxldmVsODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1OCBjaGFubmVsKTsKLQotLyogICovCi0vKiAgU3dpdGNoIGJhbmR3aWR0aCBmb3IgODcyM0EgKi8KLS8qICAqLwotdm9pZAlQSFlfU2V0QldNb2RlMjNhODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwKLQkJCSAgIGVudW0gaHRfY2hhbm5lbF93aWR0aCBDaG5sV2lkdGgsCi0JCQkgICB1bnNpZ25lZCBjaGFyIE9mZnNldCk7Ci0KLS8qICAqLwotLyogIGNoYW5uZWwgc3dpdGNoIHJlbGF0ZWQgZnVuY2l0b24gKi8KLS8qICAqLwotdm9pZAlQSFlfU3dDaG5sODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTggY2hhbm5lbCk7Ci0JCQkJLyogIENhbGwgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gKi8KLXZvaWQgQ2hrRndDbWRJb0RvbmUoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKTsKLQotLyogICovCi0vKiAgTW9kaWZ5IHRoZSB2YWx1ZSBvZiB0aGUgaHcgcmVnaXN0ZXIgd2hlbiBiZWFjb24gaW50ZXJ2YWwgYmUgY2hhbmdlZC4gKi8KLS8qICAqLwotdm9pZAotcnRsODE5MmNfUEhZX1NldEJlYWNvbkh3UmVnKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwgdTE2IEJlYWNvbkludGVydmFsKTsKLQotCi12b2lkIFBIWV9Td2l0Y2hFcGh5UGFyYW1ldGVyKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcik7Ci0KLXZvaWQgUEhZX0VuYWJsZUhvc3RDbGtSZXEoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKTsKLQotYm9vbAotU2V0QW50ZW5uYUNvbmZpZzkyQyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHU4IERlZmF1bHRBbnQpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0ZWQgRnVuY3Rpb24gcHJvdG90eXBlLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBQSFlfU2V0TWFjUmVnCVBIWV9TZXRCQlJlZwotCi0vKiBNQUMvQkIvUkYgSEFMIGNvbmZpZyAqLwotaW50IFBIWV9CQkNvbmZpZzg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcik7Ci1zMzIgUEhZX01BQ0NvbmZpZzg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWw4NzIzQVBoeVJlZy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbDg3MjNBUGh5UmVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1OTkyOGYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbDg3MjNBUGh5UmVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19JTkNfSEFMODcyM0FQSFlSRUdfSF9fCi0jZGVmaW5lIF9fSU5DX0hBTDg3MjNBUEhZUkVHX0hfXwotCi0vKiAgMS4gUE1BQyBkdXBsaWNhdGUgcmVnaXN0ZXIgZHVlIHRvIGNvbm5lY3Rpb246IFJGX01vZGUsIFRSeFJOLCBOdW1PZiBMLVNURiAqLwotLyogIDEuIFBhZ2UxKDB4MTAwKSAqLwotI2RlZmluZSByUE1BQ19SZXNldAkJCQkweDEwMAotI2RlZmluZSByUE1BQ19UeFN0YXJ0CQkJCTB4MTA0Ci0jZGVmaW5lIHJQTUFDX1R4TGVnYWN5U0lHCQkJMHgxMDgKLSNkZWZpbmUgclBNQUNfVHhIVFNJRzEJCQkJMHgxMGMKLSNkZWZpbmUgclBNQUNfVHhIVFNJRzIJCQkJMHgxMTAKLSNkZWZpbmUgclBNQUNfUEhZRGVidWcJCQkJMHgxMTQKLSNkZWZpbmUgclBNQUNfVHhQYWNrZXROdW0JCQkweDExOAotI2RlZmluZSByUE1BQ19UeElkbGUJCQkJMHgxMWMKLSNkZWZpbmUgclBNQUNfVHhNQUNIZWFkZXIwCQkJMHgxMjAKLSNkZWZpbmUgclBNQUNfVHhNQUNIZWFkZXIxCQkJMHgxMjQKLSNkZWZpbmUgclBNQUNfVHhNQUNIZWFkZXIyCQkJMHgxMjgKLSNkZWZpbmUgclBNQUNfVHhNQUNIZWFkZXIzCQkJMHgxMmMKLSNkZWZpbmUgclBNQUNfVHhNQUNIZWFkZXI0CQkJMHgxMzAKLSNkZWZpbmUgclBNQUNfVHhNQUNIZWFkZXI1CQkJMHgxMzQKLSNkZWZpbmUgclBNQUNfVHhEYXRhVHlwZQkJCTB4MTM4Ci0jZGVmaW5lIHJQTUFDX1R4UmFuZG9tU2VlZAkJCTB4MTNjCi0jZGVmaW5lIHJQTUFDX0NDS1BMQ1BQcmVhbWJsZQkJCTB4MTQwCi0jZGVmaW5lIHJQTUFDX0NDS1BMQ1BIZWFkZXIJCQkweDE0NAotI2RlZmluZSByUE1BQ19DQ0tDUkMxNgkJCQkweDE0OAotI2RlZmluZSByUE1BQ19PRkRNUnhDUkMzMk9LCQkJMHgxNzAKLSNkZWZpbmUgclBNQUNfT0ZETVJ4Q1JDMzJFcgkJCTB4MTc0Ci0jZGVmaW5lIHJQTUFDX09GRE1SeFBhcml0eUVyCQkJMHgxNzgKLSNkZWZpbmUgclBNQUNfT0ZETVJ4Q1JDOEVyCQkJMHgxN2MKLSNkZWZpbmUgclBNQUNfQ0NLQ1J4UkMxNkVyCQkJMHgxODAKLSNkZWZpbmUgclBNQUNfQ0NLQ1J4UkMzMkVyCQkJMHgxODQKLSNkZWZpbmUgclBNQUNfQ0NLQ1J4UkMzMk9LCQkJMHgxODgKLSNkZWZpbmUgclBNQUNfVHhTdGF0dXMJCQkJMHgxOGMKLQotLyogIDIuIFBhZ2UyKDB4MjAwKSAqLwotLyogIFRoZSBmb2xsb3dpbmcgdHdvIGRlZmluaXRpb24gYXJlIG9ubHkgdXNlZCBmb3IgVVNCIGludGVyZmFjZS4gKi8KLSNkZWZpbmUgUkZfQkJfQ01EX0FERFIJCTB4MDJjMAkvKiAgUkYvQkIgcmVhZC93cml0ZSBjb21tYW5kIGFkZHJlc3MuICovCi0jZGVmaW5lIFJGX0JCX0NNRF9EQVRBCQkweDAyYzQJLyogIFJGL0JCIHJlYWQvd3JpdGUgY29tbWFuZCBkYXRhLiAqLwotCi0vKiAgMy4gUGFnZTgoMHg4MDApICovCi0jZGVmaW5lIHJGUEdBMF9SRk1PRAkJMHg4MDAJLyogUkYgbW9kZSAmIENDSyBUeFNDICBSRiBCVyBTZXR0aW5nPz8gKi8KLQotI2RlZmluZSByRlBHQTBfVHhJbmZvCQkweDgwNAkvKiAgU3RhdHVzIHJlcG9ydD8/ICovCi0jZGVmaW5lIHJGUEdBMF9QU0RGdW5jdGlvbgkweDgwOAotCi0jZGVmaW5lIHJGUEdBMF9UeEdhaW5TdGFnZQkweDgwYwkvKiAgU2V0IFRYIFBXUiBpbml0IGdhaW4/ICovCi0KLSNkZWZpbmUgckZQR0EwX1JGVGltaW5nMQkweDgxMAkvKiAgVXNlbGVzcyBub3cgKi8KLSNkZWZpbmUgckZQR0EwX1JGVGltaW5nMgkweDgxNAotCi0jZGVmaW5lIHJGUEdBMF9YQV9IU1NJUGFyYW1ldGVyMQkweDgyMAkvKiAgUkYgMyB3aXJlIHJlZ2lzdGVyICovCi0jZGVmaW5lIHJGUEdBMF9YQV9IU1NJUGFyYW1ldGVyMgkweDgyNAotI2RlZmluZSByRlBHQTBfWEJfSFNTSVBhcmFtZXRlcjEJMHg4MjgKLSNkZWZpbmUgckZQR0EwX1hCX0hTU0lQYXJhbWV0ZXIyCTB4ODJjCi0jZGVmaW5lIHJUeEFHQ19CX1JhdGUxOF8wNgkJMHg4MzAKLSNkZWZpbmUgclR4QUdDX0JfUmF0ZTU0XzI0CQkweDgzNAotI2RlZmluZSByVHhBR0NfQl9DQ0sxXzU1X01jczMyCQkweDgzOAotI2RlZmluZSByVHhBR0NfQl9NY3MwM19NY3MwMAkJMHg4M2MKLQotI2RlZmluZSByVHhBR0NfQl9NY3MwN19NY3MwNAkJMHg4NDgKLSNkZWZpbmUgclR4QUdDX0JfTWNzMTFfTWNzMDgJCTB4ODRjCi0KLSNkZWZpbmUgckZQR0EwX1hBX0xTU0lQYXJhbWV0ZXIJCTB4ODQwCi0jZGVmaW5lIHJGUEdBMF9YQl9MU1NJUGFyYW1ldGVyCQkweDg0NAotCi0jZGVmaW5lIHJGUEdBMF9SRldha2VVcFBhcmFtZXRlcgkweDg1MAkvKiAgVXNlbGVzcyBub3cgKi8KLSNkZWZpbmUgckZQR0EwX1JGU2xlZXBVcFBhcmFtZXRlcgkweDg1NAotCi0jZGVmaW5lIHJGUEdBMF9YQUJfU3dpdGNoQ29udHJvbAkweDg1OAkvKiAgUkYgQ2hhbm5lbCBzd2l0Y2ggKi8KLSNkZWZpbmUgckZQR0EwX1hDRF9Td2l0Y2hDb250cm9sCTB4ODVjCi0KLSNkZWZpbmUgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UJCTB4ODYwCS8qICBSRiBDaGFubmVsIHN3aXRjaCAqLwotI2RlZmluZSByRlBHQTBfWEJfUkZJbnRlcmZhY2VPRQkJMHg4NjQKLQotI2RlZmluZSByVHhBR0NfQl9NY3MxNV9NY3MxMgkJMHg4NjgKLSNkZWZpbmUgclR4QUdDX0JfQ0NLMTFfQV9DQ0syXzExCTB4ODZjCi0KLSNkZWZpbmUgckZQR0EwX1hBQl9SRkludGVyZmFjZVNXCTB4ODcwCS8qICBSRiBJbnRlcmZhY2UgU29mdHdhcmUgQ29udHJvbCAqLwotI2RlZmluZSByRlBHQTBfWENEX1JGSW50ZXJmYWNlU1cJMHg4NzQKLQotI2RlZmluZSByRlBHQTBfWEFCX1JGUGFyYW1ldGVyCQkweDg3OAkvKiAgUkYgUGFyYW1ldGVyICovCi0jZGVmaW5lIHJGUEdBMF9YQ0RfUkZQYXJhbWV0ZXIJCTB4ODdjCi0KLSNkZWZpbmUgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjEJCTB4ODgwCS8qICBDcnlzdGFsIGNhcCBzZXR0aW5nIFJGLVIvVyBwcm90ZWN0aW9uIGZvciBwYXJhbWV0ZXI0Pz8gKi8KLSNkZWZpbmUgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjIJCTB4ODg0Ci0jZGVmaW5lIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXIzCQkweDg4OAkvKiAgVXNlbGVzcyBub3cgKi8KLSNkZWZpbmUgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjQJCTB4ODhjCi0KLSNkZWZpbmUgckZQR0EwX1hBX0xTU0lSZWFkQmFjawkJMHg4YTAJLyogIFRyYW5jZWl2ZXIgTFNTSSBSZWFkYmFjayAqLwotI2RlZmluZSByRlBHQTBfWEJfTFNTSVJlYWRCYWNrCQkweDhhNAotI2RlZmluZSByRlBHQTBfWENfTFNTSVJlYWRCYWNrCQkweDhhOAotI2RlZmluZSByRlBHQTBfWERfTFNTSVJlYWRCYWNrCQkweDhhYwotCi0jZGVmaW5lIHJGUEdBMF9QU0RSZXBvcnQJCTB4OGI0CS8qICBVc2VsZXNzIG5vdyAqLwotI2RlZmluZSBUcmFuc2NlaXZlckFfSFNQSV9SZWFkYmFjawkweDhiOAkvKiAgVHJhbnNjZWl2ZXIgQSBIU1BJIFJlYWRiYWNrICovCi0jZGVmaW5lIFRyYW5zY2VpdmVyQl9IU1BJX1JlYWRiYWNrCTB4OGJjCS8qICBUcmFuc2NlaXZlciBCIEhTUEkgUmVhZGJhY2sgKi8KLSNkZWZpbmUgckZQR0EwX1hBQl9SRkludGVyZmFjZVJCCTB4OGUwCS8qICBVc2VsZXNzIG5vdyBSRiBJbnRlcmZhY2UgUmVhZGJhY2sgVmFsdWUgKi8KLSNkZWZpbmUgckZQR0EwX1hDRF9SRkludGVyZmFjZVJCCTB4OGU0CS8qICBVc2VsZXNzIG5vdyAqLwotCi0vKiAgNC4gUGFnZTkoMHg5MDApICovCi0jZGVmaW5lIHJGUEdBMV9SRk1PRAkJCTB4OTAwCS8qIFJGIG1vZGUgJiBPRkRNIFR4U0MgUkYgQlcgU2V0dGluZz8/ICovCi0KLSNkZWZpbmUgckZQR0ExX1R4QmxvY2sJCQkweDkwNAkvKiAgVXNlbGVzcyBub3cgKi8KLSNkZWZpbmUgckZQR0ExX0RlYnVnU2VsZWN0CQkweDkwOAkvKiAgVXNlbGVzcyBub3cgKi8KLSNkZWZpbmUgckZQR0ExX1R4SW5mbwkJCTB4OTBjCS8qICBVc2VsZXNzIG5vdyBTdGF0dXMgcmVwb3J0Pz8gKi8KLQotLyogIDUuIFBhZ2VBKDB4QTAwKSAqLwotLyogIFNldCBDb250cm9sIGNoYW5uZWwgdG8gdXBwZXIgb3IgbG93ZXIuIFRoZXNlIHNldHRpbmdzIGFyZSByZXF1aXJlZCBvbmx5IGZvciA0ME1IeiAqLwotI2RlZmluZSByQ0NLMF9TeXN0ZW0JCQkweGEwMAotCi0jZGVmaW5lIHJDQ0swX0FGRVNldHRpbmcJCTB4YTA0CS8qICBEaXNhYmxlIGluaXQgZ2FpbiBub3cgU2VsZWN0IFJYIHBhdGggYnkgUlNTSSAqLwotI2RlZmluZSByQ0NLMF9DQ0EJCQkweGEwOAkvKiAgRGlzYWJsZSBpbml0IGdhaW4gbm93IEluaXQgZ2FpbiAqLwotCi0jZGVmaW5lIHJDQ0swX1J4QUdDMQkJCTB4YTBjCS8qIEFHQyBkZWZhdWx0IHZhbHVlLCBzYXR1cmF0aW9uIGxldmVsIEFudGVubmEgRGl2ZXJzaXR5LCBSWCBBR0MsIExOQSBUaHJlc2hvbGQsIFJYIExOQSBUaHJlc2hvbGQgdXNlbGVzcyBub3cuIE5vdCB0aGUgc2FtZSBhcyA5MCBzZXJpZXMgKi8KLSNkZWZpbmUgckNDSzBfUnhBR0MyCQkJMHhhMTAJLyogQUdDICYgREFHQyAqLwotCi0jZGVmaW5lIHJDQ0swX1J4SFAJCQkweGExNAotCi0jZGVmaW5lIHJDQ0swX0RTUFBhcmFtZXRlcjEJCTB4YTE4CS8qIFRpbWluZyByZWNvdmVyeSAmIENoYW5uZWwgZXN0aW1hdGlvbiB0aHJlc2hvbGQgKi8KLSNkZWZpbmUgckNDSzBfRFNQUGFyYW1ldGVyMgkJMHhhMWMJLyogU1EgdGhyZXNob2xkICovCi0KLSNkZWZpbmUgckNDSzBfVHhGaWx0ZXIxCQkJMHhhMjAKLSNkZWZpbmUgckNDSzBfVHhGaWx0ZXIyCQkJMHhhMjQKLSNkZWZpbmUgckNDSzBfRGVidWdQb3J0CQkJMHhhMjgJLyogZGVidWcgcG9ydCBhbmQgVHggZmlsdGVyMyAqLwotI2RlZmluZSByQ0NLMF9GYWxzZUFsYXJtUmVwb3J0CQkweGEyYwkvKiAweGEyZAl1c2VsZXNzIG5vdyAweGEzMC1hNGYgY2hhbm5lbCByZXBvcnQgKi8KLSNkZWZpbmUgckNDSzBfVFJTU0lSZXBvcnQJCTB4YTUwCi0jZGVmaW5lIHJDQ0swX1J4UmVwb3J0CQkJMHhhNTQgIC8qIDB4YTU3ICovCi0jZGVmaW5lIHJDQ0swX0ZBQ291bnRlckxvd2VyCQkweGE1YyAgLyogMHhhNWIgKi8KLSNkZWZpbmUgckNDSzBfRkFDb3VudGVyVXBwZXIJCTB4YTU4ICAvKiAweGE1YyAqLwotLyogIFBhZ2VCKDB4QjAwKSAqLwotI2RlZmluZSByUGRwX0FudEEJCQkweGIwMAotI2RlZmluZSByUGRwX0FudEFfNAkJCTB4YjA0Ci0jZGVmaW5lIHJDb25maWdfUG1wZF9BbnRBCQkweGIyOAotI2RlZmluZSByQ29uZmlnX0FudEEJCQkweGI2OAotI2RlZmluZSByQ29uZmlnX0FudEIJCQkweGI2YwotI2RlZmluZSByUGRwX0FudEIJCQkweGI3MAotI2RlZmluZSByUGRwX0FudEJfNAkJCTB4Yjc0Ci0jZGVmaW5lIHJDb25maWdfUG1wZF9BbnRCCQkweGI5OAotI2RlZmluZSByQVBLCQkJCTB4YmQ4Ci0KLS8qICA2LiBQYWdlQygweEMwMCkgKi8KLSNkZWZpbmUgck9GRE0wX0xTVEYJCQkweGMwMAotCi0jZGVmaW5lIHJPRkRNMF9UUnhQYXRoRW5hYmxlCQkweGMwNAotI2RlZmluZSByT0ZETTBfVFJNdXhQYXIJCQkweGMwOAotI2RlZmluZSByT0ZETTBfVFJTV0lzb2xhdGlvbgkJMHhjMGMKLQotI2RlZmluZSByT0ZETTBfWEFSeEFGRQkJCTB4YzEwICAvKiBSeElRIERDIG9mZnNldCwgUnggZGlnaXRhbCBmaWx0ZXIsIERDIG5vdGNoIGZpbHRlciAqLwotI2RlZmluZSByT0ZETTBfWEFSeElRSW1iYWxhbmNlCQkweGMxNCAgLyogUnhJUSBpbWJsYW5jZSBtYXRyaXggKi8KLSNkZWZpbmUgck9GRE0wX1hCUnhBRkUJCQkweGMxOAotI2RlZmluZSByT0ZETTBfWEJSeElRSW1iYWxhbmNlCQkweGMxYwotI2RlZmluZSByT0ZETTBfWENSeEFGRQkJCTB4YzIwCi0jZGVmaW5lIHJPRkRNMF9YQ1J4SVFJbWJhbGFuY2UJCTB4YzI0Ci0jZGVmaW5lIHJPRkRNMF9YRFJ4QUZFCQkJMHhjMjgKLSNkZWZpbmUgck9GRE0wX1hEUnhJUUltYmFsYW5jZQkJMHhjMmMKLQotI2RlZmluZSByT0ZETTBfUnhEZXRlY3RvcjEJCTB4YzMwICAvKiBQRCxCVyAmIFNCRAlETSB0dW5lIGluaXQgZ2FpbiAqLwotI2RlZmluZSByT0ZETTBfUnhEZXRlY3RvcjIJCTB4YzM0ICAvKiBTQkQgJiBGYW1lIFN5bmMuICovCi0jZGVmaW5lIHJPRkRNMF9SeERldGVjdG9yMwkJMHhjMzggIC8qIEZyYW1lIFN5bmMuICovCi0jZGVmaW5lIHJPRkRNMF9SeERldGVjdG9yNAkJMHhjM2MgIC8qIFBELCBTQkQsIEZyYW1lIFN5bmMgJiBTaG9ydC1HSSAqLwotCi0jZGVmaW5lIHJPRkRNMF9SeERTUAkJCTB4YzQwICAvKiBSeCBTeW5jIFBhdGggKi8KLSNkZWZpbmUgck9GRE0wX0NGT2FuZERBR0MJCTB4YzQ0ICAvKiBDRk8gJiBEQUdDICovCi0jZGVmaW5lIHJPRkRNMF9DQ0FEcm9wVGhyZXNob2xkCTB4YzQ4IC8qIENDQSBEcm9wIHRocmVzaG9sZCAqLwotI2RlZmluZSByT0ZETTBfRUNDQVRocmVzaG9sZAkJMHhjNGMgLyogIGVuZXJneSBDQ0EgKi8KLQotI2RlZmluZSByT0ZETTBfWEFBR0NDb3JlMQkJMHhjNTAJLyogIERJRyAqLwotI2RlZmluZSByT0ZETTBfWEFBR0NDb3JlMgkJMHhjNTQKLSNkZWZpbmUgck9GRE0wX1hCQUdDQ29yZTEJCTB4YzU4Ci0jZGVmaW5lIHJPRkRNMF9YQkFHQ0NvcmUyCQkweGM1YwotI2RlZmluZSByT0ZETTBfWENBR0NDb3JlMQkJMHhjNjAKLSNkZWZpbmUgck9GRE0wX1hDQUdDQ29yZTIJCTB4YzY0Ci0jZGVmaW5lIHJPRkRNMF9YREFHQ0NvcmUxCQkweGM2OAotI2RlZmluZSByT0ZETTBfWERBR0NDb3JlMgkJMHhjNmMKLQotI2RlZmluZSByT0ZETTBfQUdDUGFyYW1ldGVyMQkJMHhjNzAKLSNkZWZpbmUgck9GRE0wX0FHQ1BhcmFtZXRlcjIJCTB4Yzc0Ci0jZGVmaW5lIHJPRkRNMF9BR0NSU1NJVGFibGUJCTB4Yzc4Ci0jZGVmaW5lIHJPRkRNMF9IVFNURkFHQwkJCTB4YzdjCi0KLSNkZWZpbmUgck9GRE0wX1hBVHhJUUltYmFsYW5jZQkJMHhjODAJLyogIFRYIFBXUiBUUkFDSyBhbmQgRElHICovCi0jZGVmaW5lIHJPRkRNMF9YQVR4QUZFCQkJMHhjODQKLSNkZWZpbmUgck9GRE0wX1hCVHhJUUltYmFsYW5jZQkJMHhjODgKLSNkZWZpbmUgck9GRE0wX1hCVHhBRkUJCQkweGM4YwotI2RlZmluZSByT0ZETTBfWENUeElRSW1iYWxhbmNlCQkweGM5MAotI2RlZmluZSByT0ZETTBfWENUeEFGRQkJCTB4Yzk0Ci0jZGVmaW5lIHJPRkRNMF9YRFR4SVFJbWJhbGFuY2UJCTB4Yzk4Ci0jZGVmaW5lIHJPRkRNMF9YRFR4QUZFCQkJMHhjOWMKLQotI2RlZmluZSByT0ZETTBfUnhJUUV4dEFudGEJCTB4Y2EwCi0jZGVmaW5lIHJPRkRNMF9UeENvZWZmMQkJCTB4Y2E0Ci0jZGVmaW5lIHJPRkRNMF9UeENvZWZmMgkJCTB4Y2E4Ci0jZGVmaW5lIHJPRkRNMF9UeENvZWZmMwkJCTB4Y2FjCi0jZGVmaW5lIHJPRkRNMF9UeENvZWZmNAkJCTB4Y2IwCi0jZGVmaW5lIHJPRkRNMF9UeENvZWZmNQkJCTB4Y2I0Ci0jZGVmaW5lIHJPRkRNMF9UeENvZWZmNgkJCTB4Y2I4Ci0jZGVmaW5lIHJPRkRNMF9SeEhQUGFyYW1ldGVyCQkweGNlMAotI2RlZmluZSByT0ZETTBfVHhQc2V1ZG9Ob2lzZVdndAkJMHhjZTQKLSNkZWZpbmUgck9GRE0wX0ZyYW1lU3luYwkJMHhjZjAKLSNkZWZpbmUgck9GRE0wX0RGU1JlcG9ydAkJMHhjZjQKLQotLyogIDcuIFBhZ2VEKDB4RDAwKSAqLwotI2RlZmluZSByT0ZETTFfTFNURgkJCTB4ZDAwCi0jZGVmaW5lIHJPRkRNMV9UUnhQYXRoRW5hYmxlCQkweGQwNAotCi0jZGVmaW5lIHJPRkRNMV9DRk8JCQkweGQwOAkvKiAgTm8gc2V0dGluZyBub3cgKi8KLSNkZWZpbmUgck9GRE0xX0NTSTEJCQkweGQxMAotI2RlZmluZSByT0ZETTFfU0JECQkJMHhkMTQKLSNkZWZpbmUgck9GRE0xX0NTSTIJCQkweGQxOAotI2RlZmluZSByT0ZETTFfQ0ZPVHJhY2tpbmcJCTB4ZDJjCi0jZGVmaW5lIHJPRkRNMV9UUnhNZXNhdXJlMQkJMHhkMzQKLSNkZWZpbmUgck9GRE0xX0ludGZEZXQJCQkweGQzYwotI2RlZmluZSByT0ZETTFfUHNldWRvTm9pc2VTdGF0ZUFCCTB4ZDUwCi0jZGVmaW5lIHJPRkRNMV9Qc2V1ZG9Ob2lzZVN0YXRlQ0QJMHhkNTQKLSNkZWZpbmUgck9GRE0xX1J4UHNldWRvTm9pc2VXZ3QJCTB4ZDU4Ci0KLSNkZWZpbmUgck9GRE1fUEhZQ291bnRlcjEJCTB4ZGEwICAvKiBjY2EsIHBhcml0eSBmYWlsICovCi0jZGVmaW5lIHJPRkRNX1BIWUNvdW50ZXIyCQkweGRhNCAgLyogcmF0ZSBpbGxlZ2FsLCBjcmM4IGZhaWwgKi8KLSNkZWZpbmUgck9GRE1fUEhZQ291bnRlcjMJCTB4ZGE4ICAvKiBNQ1Mgbm90IHN1cHBvcnQgKi8KLQotI2RlZmluZSByT0ZETV9TaG9ydENGT0FCCQkweGRhYwkvKiAgTm8gc2V0dGluZyBub3cgKi8KLSNkZWZpbmUgck9GRE1fU2hvcnRDRk9DRAkJMHhkYjAKLSNkZWZpbmUgck9GRE1fTG9uZ0NGT0FCCQkJMHhkYjQKLSNkZWZpbmUgck9GRE1fTG9uZ0NGT0NECQkJMHhkYjgKLSNkZWZpbmUgck9GRE1fVGFpbENGT0FCCQkJMHhkYmMKLSNkZWZpbmUgck9GRE1fVGFpbENGT0NECQkJMHhkYzAKLSNkZWZpbmUgck9GRE1fUFdNZWFzdXJlMQkJMHhkYzQKLSNkZWZpbmUgck9GRE1fUFdNZWFzdXJlMgkJMHhkYzgKLSNkZWZpbmUgck9GRE1fQldSZXBvcnQJCQkweGRjYwotI2RlZmluZSByT0ZETV9BR0NSZXBvcnQJCQkweGRkMAotI2RlZmluZSByT0ZETV9SeFNOUgkJCTB4ZGQ0Ci0jZGVmaW5lIHJPRkRNX1J4RVZNQ1NJCQkJMHhkZDgKLSNkZWZpbmUgck9GRE1fU0lHUmVwb3J0CQkJMHhkZGMKLQotCi0vKiAgOC4gUGFnZUUoMHhFMDApICovCi0jZGVmaW5lIHJUeEFHQ19BX1JhdGUxOF8wNgkJMHhlMDAKLSNkZWZpbmUgclR4QUdDX0FfUmF0ZTU0XzI0CQkweGUwNAotI2RlZmluZSByVHhBR0NfQV9DQ0sxX01jczMyCQkweGUwOAotI2RlZmluZSByVHhBR0NfQV9NY3MwM19NY3MwMAkJMHhlMTAKLSNkZWZpbmUgclR4QUdDX0FfTWNzMDdfTWNzMDQJCTB4ZTE0Ci0jZGVmaW5lIHJUeEFHQ19BX01jczExX01jczA4CQkweGUxOAotI2RlZmluZSByVHhBR0NfQV9NY3MxNV9NY3MxMgkJMHhlMWMKLQotI2RlZmluZSByRlBHQTBfSVFLCQkJMHhlMjgKLSNkZWZpbmUgclR4X0lRS19Ub25lX0EJCQkweGUzMAotI2RlZmluZSByUnhfSVFLX1RvbmVfQQkJCTB4ZTM0Ci0jZGVmaW5lIHJUeF9JUUtfUElfQQkJCTB4ZTM4Ci0jZGVmaW5lIHJSeF9JUUtfUElfQQkJCTB4ZTNjCi0KLSNkZWZpbmUgclR4X0lRSwkJCQkweGU0MAotI2RlZmluZSByUnhfSVFLCQkJCTB4ZTQ0Ci0jZGVmaW5lIHJJUUtfQUdDX1B0cwkJCTB4ZTQ4Ci0jZGVmaW5lIHJJUUtfQUdDX1JzcAkJCTB4ZTRjCi0jZGVmaW5lIHJUeF9JUUtfVG9uZV9CCQkJMHhlNTAKLSNkZWZpbmUgclJ4X0lRS19Ub25lX0IJCQkweGU1NAotI2RlZmluZSByVHhfSVFLX1BJX0IJCQkweGU1OAotI2RlZmluZSByUnhfSVFLX1BJX0IJCQkweGU1YwotI2RlZmluZSBySVFLX0FHQ19Db250CQkJMHhlNjAKLQotI2RlZmluZSByQmx1ZV9Ub290aAkJCTB4ZTZjCi0jZGVmaW5lIHJSeF9XYWl0X0NDQQkJCTB4ZTcwCi0jZGVmaW5lIHJUeF9DQ0tfUkZPTgkJCTB4ZTc0Ci0jZGVmaW5lIHJUeF9DQ0tfQkJPTgkJCTB4ZTc4Ci0jZGVmaW5lIHJUeF9PRkRNX1JGT04JCQkweGU3YwotI2RlZmluZSByVHhfT0ZETV9CQk9OCQkJMHhlODAKLSNkZWZpbmUgclR4X1RvX1J4CQkJMHhlODQKLSNkZWZpbmUgclR4X1RvX1R4CQkJMHhlODgKLSNkZWZpbmUgclJ4X0NDSwkJCQkweGU4YwotCi0jZGVmaW5lIHJUeF9Qb3dlcl9CZWZvcmVfSVFLX0EJCTB4ZTk0Ci0jZGVmaW5lIHJUeF9Qb3dlcl9BZnRlcl9JUUtfQQkJMHhlOWMKLQotI2RlZmluZSByUnhfUG93ZXJfQmVmb3JlX0lRS19BCQkweGVhMAotI2RlZmluZSByUnhfUG93ZXJfQmVmb3JlX0lRS19BXzIJMHhlYTQKLSNkZWZpbmUgclJ4X1Bvd2VyX0FmdGVyX0lRS19BCQkweGVhOAotI2RlZmluZSByUnhfUG93ZXJfQWZ0ZXJfSVFLX0FfMgkJMHhlYWMKLQotI2RlZmluZSByVHhfUG93ZXJfQmVmb3JlX0lRS19CCQkweGViNAotI2RlZmluZSByVHhfUG93ZXJfQWZ0ZXJfSVFLX0IJCTB4ZWJjCi0KLSNkZWZpbmUgclJ4X1Bvd2VyX0JlZm9yZV9JUUtfQgkJMHhlYzAKLSNkZWZpbmUgclJ4X1Bvd2VyX0JlZm9yZV9JUUtfQl8yCTB4ZWM0Ci0jZGVmaW5lIHJSeF9Qb3dlcl9BZnRlcl9JUUtfQgkJMHhlYzgKLSNkZWZpbmUgclJ4X1Bvd2VyX0FmdGVyX0lRS19CXzIJCTB4ZWNjCi0KLSNkZWZpbmUgclJ4X09GRE0JCQkweGVkMAotI2RlZmluZSByUnhfV2FpdF9SSUZTCQkJMHhlZDQKLSNkZWZpbmUgclJ4X1RPX1J4CQkJMHhlZDgKLSNkZWZpbmUgclN0YW5kYnkJCQkweGVkYwotI2RlZmluZSByU2xlZXAJCQkJMHhlZTAKLSNkZWZpbmUgclBNUERfQU5BRU4JCQkweGVlYwotCi0vKiAgNy4gUkYgUmVnaXN0ZXIgMHgwMC0weDJFIChSRiA4MjU2KSAqLwotLyogICAgIFJGLTAyMjJEIDB4MDAtM0YgKi8KLS8qIFplYnJhMSAqLwotI2RlZmluZSByWmVicmExX0hTU0lFbmFibGUJCTB4MAkvKiAgVXNlbGVzcyBub3cgKi8KLSNkZWZpbmUgclplYnJhMV9UUnhFbmFibGUxCQkweDEKLSNkZWZpbmUgclplYnJhMV9UUnhFbmFibGUyCQkweDIKLSNkZWZpbmUgclplYnJhMV9BR0MJCQkweDQKLSNkZWZpbmUgclplYnJhMV9DaGFyZ2VQdW1wCQkweDUKLSNkZWZpbmUgclplYnJhMV9DaGFubmVsCQkJMHg3CS8qICBSRiBjaGFubmVsIHN3aXRjaCAqLwotCi0jZGVmaW5lIHJaZWJyYTFfVHhHYWluCQkJMHg4CS8qICBVc2VsZXNzIG5vdyAqLwotI2RlZmluZSByWmVicmExX1R4TFBGCQkJMHg5Ci0jZGVmaW5lIHJaZWJyYTFfUnhMUEYJCQkweGIKLSNkZWZpbmUgclplYnJhMV9SeEhQRkNvcm5lcgkJMHhjCi0KLS8qIFplYnJhNCAqLwotI2RlZmluZSByR2xvYmFsQ3RybAkJCTAJLyogIFVzZWxlc3Mgbm93ICovCi0jZGVmaW5lIHJSVEw4MjU2X1R4TFBGCQkJMTkKLSNkZWZpbmUgclJUTDgyNTZfUnhMUEYJCQkxMQotCi0vKiBSVEw4MjU4ICovCi0jZGVmaW5lIHJSVEw4MjU4X1R4TFBGCQkJMHgxMQkvKiAgVXNlbGVzcyBub3cgKi8KLSNkZWZpbmUgclJUTDgyNThfUnhMUEYJCQkweDEzCi0jZGVmaW5lIHJSVEw4MjU4X1JTU0lMUEYJCTB4YQotCi0vKiAgUkw2MDUyIFJlZ2lzdGVyIGRlZmluaXRpb24gKi8KLSNkZWZpbmUgUkZfQUMJCQkJMHgwMAotI2RlZmluZSBSRl9JUUFESl9HMQkJCTB4MDEKLSNkZWZpbmUgUkZfSVFBREpfRzIJCQkweDAyCi0jZGVmaW5lIFJGX0JTX1BBX0FQU0VUX0cxX0c0CQkweDAzCi0jZGVmaW5lIFJGX0JTX1BBX0FQU0VUX0c1X0c4CQkweDA0Ci0jZGVmaW5lIFJGX1BPV19UUlNXCQkJMHgwNQotI2RlZmluZSBSRl9HQUlOX1JYCQkJMHgwNgotI2RlZmluZSBSRl9HQUlOX1RYCQkJMHgwNwotI2RlZmluZSBSRl9UWE1fSURBQwkJCTB4MDgKLSNkZWZpbmUgUkZfSVBBX0cJCQkweDA5Ci0jZGVmaW5lIFJGX1RYQklBU19HCQkJMHgwQQotI2RlZmluZSBSRl9UWFBBX0FHCQkJMHgwQgotI2RlZmluZSBSRl9JUEFfQQkJCTB4MEMKLSNkZWZpbmUgUkZfVFhCSUFTX0EJCQkweDBECi0jZGVmaW5lIFJGX0JTX1BBX0FQU0VUX0c5X0cxMQkJMHgwRQotI2RlZmluZSBSRl9CU19JUUdFTgkJCTB4MEYKLSNkZWZpbmUgUkZfTU9ERTEJCQkweDEwCi0jZGVmaW5lIFJGX01PREUyCQkJMHgxMQotI2RlZmluZSBSRl9SWF9BR0NfSFAJCQkweDEyCi0jZGVmaW5lIFJGX1RYX0FHQwkJCTB4MTMKLSNkZWZpbmUgUkZfQklBUwkJCQkweDE0Ci0jZGVmaW5lIFJGX0lQQQkJCQkweDE1Ci0jZGVmaW5lIFJGX1RYQklBUwkJCTB4MTYKLSNkZWZpbmUgUkZfUE9XX0FCSUxJVFkJCQkweDE3Ci0jZGVmaW5lIFJGX01PREVfQUcJCQkweDE4Ci0jZGVmaW5lIHJSZkNoYW5uZWwJCQkweDE4CS8qICBSRiBjaGFubmVsIGFuZCBCVyBzd2l0Y2ggKi8KLSNkZWZpbmUgUkZfQ0hOTEJXCQkJMHgxOAkvKiAgUkYgY2hhbm5lbCBhbmQgQlcgc3dpdGNoICovCi0jZGVmaW5lIFJGX1RPUAkJCQkweDE5Ci0jZGVmaW5lIFJGX1JYX0cxCQkJMHgxQQotI2RlZmluZSBSRl9SWF9HMgkJCTB4MUIKLSNkZWZpbmUgUkZfUlhfQkIyCQkJMHgxQwotI2RlZmluZSBSRl9SWF9CQjEJCQkweDFECi0jZGVmaW5lIFJGX1JDSzEJCQkJMHgxRQotI2RlZmluZSBSRl9SQ0syCQkJCTB4MUYKLSNkZWZpbmUgUkZfVFhfRzEJCQkweDIwCi0jZGVmaW5lIFJGX1RYX0cyCQkJMHgyMQotI2RlZmluZSBSRl9UWF9HMwkJCTB4MjIKLSNkZWZpbmUgUkZfVFhfQkIxCQkJMHgyMwotI2RlZmluZSBSRl9UX01FVEVSCQkJMHgyNAotI2RlZmluZSBSRl9TWU5fRzEJCQkweDI1CS8qICBSRiBUWCBQb3dlciBjb250cm9sICovCi0jZGVmaW5lIFJGX1NZTl9HMgkJCTB4MjYJLyogIFJGIFRYIFBvd2VyIGNvbnRyb2wgKi8KLSNkZWZpbmUgUkZfU1lOX0czCQkJMHgyNwkvKiAgUkYgVFggUG93ZXIgY29udHJvbCAqLwotI2RlZmluZSBSRl9TWU5fRzQJCQkweDI4CS8qICBSRiBUWCBQb3dlciBjb250cm9sICovCi0jZGVmaW5lIFJGX1NZTl9HNQkJCTB4MjkJLyogIFJGIFRYIFBvd2VyIGNvbnRyb2wgKi8KLSNkZWZpbmUgUkZfU1lOX0c2CQkJMHgyQQkvKiAgUkYgVFggUG93ZXIgY29udHJvbCAqLwotI2RlZmluZSBSRl9TWU5fRzcJCQkweDJCCS8qICBSRiBUWCBQb3dlciBjb250cm9sICovCi0jZGVmaW5lIFJGX1NZTl9HOAkJCTB4MkMJLyogIFJGIFRYIFBvd2VyIGNvbnRyb2wgKi8KLQotI2RlZmluZSBSRl9SQ0tfT1MJCQkweDMwCS8qICBSRiBUWCBQQSBjb250cm9sICovCi0KLSNkZWZpbmUgUkZfVFhQQV9HMQkJCTB4MzEJLyogIFJGIFRYIFBBIGNvbnRyb2wgKi8KLSNkZWZpbmUgUkZfVFhQQV9HMgkJCTB4MzIJLyogIFJGIFRYIFBBIGNvbnRyb2wgKi8KLSNkZWZpbmUgUkZfVFhQQV9HMwkJCTB4MzMJLyogIFJGIFRYIFBBIGNvbnRyb2wgKi8KLQotLyogQml0IE1hc2sgKi8KLS8qICAxLiBQYWdlMSgweDEwMCkgKi8KLSNkZWZpbmUgYkJCUmVzZXRCCQkJMHgxMDAJLyogIFVzZWxlc3Mgbm93PyAqLwotI2RlZmluZSBiR2xvYmFsUmVzZXRCCQkJMHgyMDAKLSNkZWZpbmUgYk9GRE1UeFN0YXJ0CQkJMHg0Ci0jZGVmaW5lIGJDQ0tUeFN0YXJ0CQkJMHg4Ci0jZGVmaW5lIGJDUkMzMkRlYnVnCQkJMHgxMDAKLSNkZWZpbmUgYlBNQUNMb29wYmFjawkJCTB4MTAKLSNkZWZpbmUgYlR4TFNJRwkJCQkweGZmZmZmZgotI2RlZmluZSBiT0ZETVR4UmF0ZQkJCTB4ZgotI2RlZmluZSBiT0ZETVR4UmVzZXJ2ZWQJCQkweDEwCi0jZGVmaW5lIGJPRkRNVHhMZW5ndGgJCQkweDFmZmUwCi0jZGVmaW5lIGJPRkRNVHhQYXJpdHkJCQkweDIwMDAwCi0jZGVmaW5lIGJUeEhUU0lHMQkJCTB4ZmZmZmZmCi0jZGVmaW5lIGJUeEhUTUNTUmF0ZQkJCTB4N2YKLSNkZWZpbmUgYlR4SFRCVwkJCQkweDgwCi0jZGVmaW5lIGJUeEhUTGVuZ3RoCQkJMHhmZmZmMDAKLSNkZWZpbmUgYlR4SFRTSUcyCQkJMHhmZmZmZmYKLSNkZWZpbmUgYlR4SFRTbW9vdGhpbmcJCQkweDEKLSNkZWZpbmUgYlR4SFRTb3VuZGluZwkJCTB4MgotI2RlZmluZSBiVHhIVFJlc2VydmVkCQkJMHg0Ci0jZGVmaW5lIGJUeEhUQWdncmVhdGlvbgkJCTB4OAotI2RlZmluZSBiVHhIVFNUQkMJCQkweDMwCi0jZGVmaW5lIGJUeEhUQWR2YW5jZUNvZGluZwkJMHg0MAotI2RlZmluZSBiVHhIVFNob3J0R0kJCQkweDgwCi0jZGVmaW5lIGJUeEhUTnVtYmVySFRfTFRGCQkweDMwMAotI2RlZmluZSBiVHhIVENSQzgJCQkweDNmYzAwCi0jZGVmaW5lIGJDb3VudGVyUmVzZXQJCQkweDEwMDAwCi0jZGVmaW5lIGJOdW1PZk9GRE1UeAkJCTB4ZmZmZgotI2RlZmluZSBiTnVtT2ZDQ0tUeAkJCTB4ZmZmZjAwMDAKLSNkZWZpbmUgYlR4SWRsZUludGVydmFsCQkJMHhmZmZmCi0jZGVmaW5lIGJPRkRNU2VydmljZQkJCTB4ZmZmZjAwMDAKLSNkZWZpbmUgYlR4TUFDSGVhZGVyCQkJMHhmZmZmZmZmZgotI2RlZmluZSBiVHhEYXRhSW5pdAkJCTB4ZmYKLSNkZWZpbmUgYlR4SFRNb2RlCQkJMHgxMDAKLSNkZWZpbmUgYlR4RGF0YVR5cGUJCQkweDMwMDAwCi0jZGVmaW5lIGJUeFJhbmRvbVNlZWQJCQkweGZmZmZmZmZmCi0jZGVmaW5lIGJDQ0tUeFByZWFtYmxlCQkJMHgxCi0jZGVmaW5lIGJDQ0tUeFNGRAkJCTB4ZmZmZjAwMDAKLSNkZWZpbmUgYkNDS1R4U0lHCQkJMHhmZgotI2RlZmluZSBiQ0NLVHhTZXJ2aWNlCQkJMHhmZjAwCi0jZGVmaW5lIGJDQ0tMZW5ndGhFeHQJCQkweDgwMDAKLSNkZWZpbmUgYkNDS1R4TGVuZ3RoCQkJMHhmZmZmMDAwMAotI2RlZmluZSBiQ0NLVHhDUkMxNgkJCTB4ZmZmZgotI2RlZmluZSBiQ0NLVHhTdGF0dXMJCQkweDEKLSNkZWZpbmUgYk9GRE1UeFN0YXR1cwkJCTB4MgotCi0jZGVmaW5lIElTX0JCX1JFR19PRkZTRVRfOTJTKF9PZmZzZXQpCQkJXAotCSgoX09mZnNldCA+PSAweDgwMCkgJiYgKF9PZmZzZXQgPD0gMHhmZmYpKQotCi0vKiAgMi4gUGFnZTgoMHg4MDApICovCi0jZGVmaW5lIGJSRk1PRAkJCQkweDEJLyogIFJlZyAweDgwMCByRlBHQTBfUkZNT0QgKi8KLSNkZWZpbmUgYkphcGFuTW9kZQkJCTB4MgotI2RlZmluZSBiQ0NLVHhTQwkJCTB4MzAKLSNkZWZpbmUgYkNDS0VuCQkJCTB4MTAwMDAwMAotI2RlZmluZSBiT0ZETUVuCQkJCTB4MjAwMDAwMAotCi0jZGVmaW5lIGJPRkRNUnhBRENQaGFzZQkJCTB4MTAwMDAJLyogIFVzZWxlc3Mgbm93ICovCi0jZGVmaW5lIGJPRkRNVHhEQUNQaGFzZQkJCTB4NDAwMDAKLSNkZWZpbmUgYlhBVHhBR0MJCQkweDNmCi0KLSNkZWZpbmUgYkFudGVubmFTZWxlY3QJCQkweDAzMDAKLQotI2RlZmluZSBiWEJUeEFHQwkJCTB4ZjAwCS8qICBSZWcgODBjIHJGUEdBMF9UeEdhaW5TdGFnZSAqLwotI2RlZmluZSBiWENUeEFHQwkJCTB4ZjAwMAotI2RlZmluZSBiWERUeEFHQwkJCTB4ZjAwMDAKLQotI2RlZmluZSBiUEFTdGFydAkJCTB4ZjAwMDAwMDAJLyogIFVzZWxlc3Mgbm93ICovCi0jZGVmaW5lIGJUUlN0YXJ0CQkJMHgwMGYwMDAwMAotI2RlZmluZSBiUkZTdGFydAkJCTB4MDAwMGYwMDAKLSNkZWZpbmUgYkJCU3RhcnQJCQkweDAwMDAwMGYwCi0jZGVmaW5lIGJCQkNDS1N0YXJ0CQkJMHgwMDAwMDAwZgotI2RlZmluZSBiUEFFbmQJCQkJMHhmICAgICAgICAgIC8qIFJlZzB4ODE0ICovCi0jZGVmaW5lIGJUUkVuZAkJCQkweDBmMDAwMDAwCi0jZGVmaW5lIGJSRkVuZAkJCQkweDAwMGYwMDAwCi0jZGVmaW5lIGJDQ0FNYXNrCQkJMHgwMDAwMDBmMCAgIC8qIFQyUiAqLwotI2RlZmluZSBiUjJSQ0NBTWFzawkJCTB4MDAwMDBmMDAKLSNkZWZpbmUgYkhTU0lfUjJURGVsYXkJCQkweGY4MDAwMDAwCi0jZGVmaW5lIGJIU1NJX1QyUkRlbGF5CQkJMHhmODAwMDAKLSNkZWZpbmUgYkNvbnRUeEhTU0kJCQkweDQwMCAgICAgLyogY2hhbmUgZ2FpbiBhdCBjb250aW51ZSBUeCAqLwotI2RlZmluZSBiSUdGcm9tQ0NLCQkJMHgyMDAKLSNkZWZpbmUgYkFHQ0FkZHJlc3MJCQkweDNmCi0jZGVmaW5lIGJSeEhQVHgJCQkJMHg3MDAwCi0jZGVmaW5lIGJSeEhQVDJSCQkJMHgzODAwMAotI2RlZmluZSBiUnhIUENDS0luaQkJCTB4YzAwMDAKLSNkZWZpbmUgYkFHQ1R4Q29kZQkJCTB4YzAwMDAwCi0jZGVmaW5lIGJBR0NSeENvZGUJCQkweDMwMDAwMAotCi0jZGVmaW5lIGIzV2lyZURhdGFMZW5ndGgJCTB4ODAwCS8qICBSZWcgMHg4MjB+ODRmIHJGUEdBMF9YQV9IU1NJUGFyYW1ldGVyMSAqLwotI2RlZmluZSBiM1dpcmVBZGRyZXNzTGVuZ3RoCQkweDQwMAotCi0jZGVmaW5lIGIzV2lyZVJGUG93ZXJEb3duCQkweDEJLyogIFVzZWxlc3Mgbm93ICovCi0vKiBkZWZpbmUgYkhXU0lTZWxlY3QJCQkweDggKi8KLSNkZWZpbmUgYjVHUEFQRVBvbGFyaXR5CQkJMHg0MDAwMDAwMAotI2RlZmluZSBiMkdQQVBFUG9sYXJpdHkJCQkweDgwMDAwMDAwCi0jZGVmaW5lIGJSRlNXX1R4RGVmYXVsdEFudAkJMHgzCi0jZGVmaW5lIGJSRlNXX1R4T3B0aW9uQW50CQkweDMwCi0jZGVmaW5lIGJSRlNXX1J4RGVmYXVsdEFudAkJMHgzMDAKLSNkZWZpbmUgYlJGU1dfUnhPcHRpb25BbnQJCTB4MzAwMAotI2RlZmluZSBiUkZTSV8zV2lyZURhdGEJCQkweDEKLSNkZWZpbmUgYlJGU0lfM1dpcmVDbG9jawkJMHgyCi0jZGVmaW5lIGJSRlNJXzNXaXJlTG9hZAkJCTB4NAotI2RlZmluZSBiUkZTSV8zV2lyZVJXCQkJMHg4Ci0jZGVmaW5lIGJSRlNJXzNXaXJlCQkJMHhmCi0KLSNkZWZpbmUgYlJGU0lfUkZFTlYJCQkweDEwCS8qICBSZWcgMHg4NzAgckZQR0EwX1hBQl9SRkludGVyZmFjZVNXICovCi0KLSNkZWZpbmUgYlJGU0lfVFJTVwkJCTB4MjAJLyogIFVzZWxlc3Mgbm93ICovCi0jZGVmaW5lIGJSRlNJX1RSU1dCCQkJMHg0MAotI2RlZmluZSBiUkZTSV9BTlRTVwkJCTB4MTAwCi0jZGVmaW5lIGJSRlNJX0FOVFNXQgkJCTB4MjAwCi0jZGVmaW5lIGJSRlNJX1BBUEUJCQkweDQwMAotI2RlZmluZSBiUkZTSV9QQVBFNUcJCQkweDgwMAotI2RlZmluZSBiQmFuZFNlbGVjdAkJCTB4MQotI2RlZmluZSBiSFRTSUcyX0dJCQkJMHg4MAotI2RlZmluZSBiSFRTSUcyX1Ntb290aGluZwkJMHgwMQotI2RlZmluZSBiSFRTSUcyX1NvdW5kaW5nCQkweDAyCi0jZGVmaW5lIGJIVFNJRzJfQWdncmVhdG9uCQkweDA4Ci0jZGVmaW5lIGJIVFNJRzJfU1RCQwkJCTB4MzAKLSNkZWZpbmUgYkhUU0lHMl9BZHZDb2RpbmcJCTB4NDAKLSNkZWZpbmUgYkhUU0lHMl9OdW1PZkhUTFRGCQkweDMwMAotI2RlZmluZSBiSFRTSUcyX0NSQzgJCQkweDNmYwotI2RlZmluZSBiSFRTSUcxX01DUwkJCTB4N2YKLSNkZWZpbmUgYkhUU0lHMV9CYW5kV2lkdGgJCTB4ODAKLSNkZWZpbmUgYkhUU0lHMV9IVExlbmd0aAkJMHhmZmZmCi0jZGVmaW5lIGJMU0lHX1JhdGUJCQkweGYKLSNkZWZpbmUgYkxTSUdfUmVzZXJ2ZWQJCQkweDEwCi0jZGVmaW5lIGJMU0lHX0xlbmd0aAkJCTB4MWZmZmUKLSNkZWZpbmUgYkxTSUdfUGFyaXR5CQkJMHgyMAotI2RlZmluZSBiQ0NLUnhQaGFzZQkJCTB4NAotCi0jZGVmaW5lIGJMU1NJUmVhZEFkZHJlc3MJCTB4N2Y4MDAwMDAgICAvKiAgVDY1IFJGICovCi0KLSNkZWZpbmUgYkxTU0lSZWFkRWRnZQkJCTB4ODAwMDAwMDAgICAvKiBMU1NJICJSZWFkIiBlZGdlIHNpZ25hbCAqLwotCi0jZGVmaW5lIGJMU1NJUmVhZEJhY2tEYXRhCQkweGZmZmZmCQkvKiAgVDY1IFJGICovCi0KLSNkZWZpbmUgYkxTU0lSZWFkT0tGbGFnCQkJMHgxMDAwCS8qICBVc2VsZXNzIG5vdyAqLwotI2RlZmluZSBiQ0NLU2FtcGxlUmF0ZQkJCTB4OCAgICAgICAvKiAwOiA0NE1IeiwgMTo4OE1IeiAqLwotI2RlZmluZSBiUmVndWxhdG9yMFN0YW5kYnkJCTB4MQotI2RlZmluZSBiUmVndWxhdG9yUExMU3RhbmRieQkJMHgyCi0jZGVmaW5lIGJSZWd1bGF0b3IxU3RhbmRieQkJMHg0Ci0jZGVmaW5lIGJQTExQb3dlclVwCQkJMHg4Ci0jZGVmaW5lIGJEUExMUG93ZXJVcAkJCTB4MTAKLSNkZWZpbmUgYkRBMTBQb3dlclVwCQkJMHgyMAotI2RlZmluZSBiQUQ3UG93ZXJVcAkJCTB4MjAwCi0jZGVmaW5lIGJEQTZQb3dlclVwCQkJMHgyMDAwCi0jZGVmaW5lIGJYdGFsUG93ZXJVcAkJCTB4NDAwMAotI2RlZmluZSBiNDBNRENsa1Bvd2VyVVAJCQkweDgwMDAKLSNkZWZpbmUgYkRBNkRlYnVnTW9kZQkJCTB4MjAwMDAKLSNkZWZpbmUgYkRBNlN3aW5nCQkJMHgzODAwMDAKLQotI2RlZmluZSBiQURDbGtQaGFzZQkJCTB4NDAwMDAwMAkvKiAgUmVnIDB4ODgwIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXIxIDIwLzQwIENDSyBzdXBwb3J0IHN3aXRjaCA0MC84MCBCQiBNSFogKi8KLQotI2RlZmluZSBiODBNQ2xrRGVsYXkJCQkweDE4MDAwMDAwCS8qICBVc2VsZXNzICovCi0jZGVmaW5lIGJBRkVXYXRjaERvZ0VuYWJsZQkJMHgyMDAwMDAwMAotCi0jZGVmaW5lIGJYdGFsQ2FwMDEJCQkweGMwMDAwMDAwCS8qICBSZWcgMHg4ODQgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjIgQ3J5c3RhbCBjYXAgKi8KLSNkZWZpbmUgYlh0YWxDYXAyMwkJCTB4MwotI2RlZmluZSBiWHRhbENhcDkyeAkJCTB4MGYwMDAwMDAKLSNkZWZpbmUJCWJYdGFsQ2FwCQkweDBmMDAwMDAwCi0KLSNkZWZpbmUgYkludERpZkNsa0VuYWJsZQkJMHg0MDAJLyogIFVzZWxlc3MgKi8KLSNkZWZpbmUgYkV4dFNpZ0Nsa0VuYWJsZQkJMHg4MDAKLSNkZWZpbmUgYkJhbmRnYXBNYmlhc1Bvd2VyVXAJCTB4MTAwMDAKLSNkZWZpbmUgYkFEMTFTSEdhaW4JCQkweGMwMDAwCi0jZGVmaW5lIGJBRDExSW5wdXRSYW5nZQkJCTB4NzAwMDAwCi0jZGVmaW5lIGJBRDExT1BDdXJyZW50CQkJMHgzODAwMDAwCi0jZGVmaW5lIGJJUGF0aExvb3BiYWNrCQkJMHg0MDAwMDAwCi0jZGVmaW5lIGJRUGF0aExvb3BiYWNrCQkJMHg4MDAwMDAwCi0jZGVmaW5lIGJBRkVMb29wYmFjawkJCTB4MTAwMDAwMDAKLSNkZWZpbmUgYkRBMTBTd2luZwkJCTB4N2UwCi0jZGVmaW5lIGJEQTEwUmV2ZXJzZQkJCTB4ODAwCi0jZGVmaW5lIGJEQUNsa1NvdXJjZQkJCTB4MTAwMAotI2RlZmluZSBiQUQ3SW5wdXRSYW5nZQkJCTB4NjAwMAotI2RlZmluZSBiQUQ3R2FpbgkJCTB4MzgwMDAKLSNkZWZpbmUgYkFEN091dHB1dENNTW9kZQkJMHg0MDAwMAotI2RlZmluZSBiQUQ3SW5wdXRDTU1vZGUJCQkweDM4MDAwMAotI2RlZmluZSBiQUQ3Q3VycmVudAkJCTB4YzAwMDAwCi0jZGVmaW5lIGJSZWd1bGF0b3JBZGp1c3QJCTB4NzAwMDAwMAotI2RlZmluZSBiQUQxMVBvd2VyVXBBdFR4CQkweDEKLSNkZWZpbmUgYkRBMTBQU0F0VHgJCQkweDEwCi0jZGVmaW5lIGJBRDExUG93ZXJVcEF0UngJCTB4MTAwCi0jZGVmaW5lIGJEQTEwUFNBdFJ4CQkJMHgxMDAwCi0jZGVmaW5lIGJDQ0tSeEFHQ0Zvcm1hdAkJCTB4MjAwCi0jZGVmaW5lIGJQU0RGRlRTYW1wbGVwUG9pbnQJCTB4YzAwMAotI2RlZmluZSBiUFNEQXZlcmFnZU51bQkJCTB4MzAwMAotI2RlZmluZSBiSVFQYXRoQ29udHJvbAkJCTB4YzAwCi0jZGVmaW5lIGJQU0RGcmVxCQkJMHgzZmYKLSNkZWZpbmUgYlBTREFudGVubmFQYXRoCQkJMHgzMAotI2RlZmluZSBiUFNESVFTd2l0Y2gJCQkweDQwCi0jZGVmaW5lIGJQU0RSeFRyaWdnZXIJCQkweDQwMDAwMAotI2RlZmluZSBiUFNEVHhUcmlnZ2VyCQkJMHg4MDAwMDAwMAotI2RlZmluZSBiUFNEU2luZVRvbmVTY2FsZQkJMHg3ZjAwMDAwMAotI2RlZmluZSBiUFNEUmVwb3J0CQkJMHhmZmZmCi0KLS8qICAzLiBQYWdlOSgweDkwMCkgKi8KLSNkZWZpbmUgYk9GRE1UeFNDCQkJMHgzMDAwMDAwMAkvKiAgVXNlbGVzcyAqLwotI2RlZmluZSBiQ0NLVHhPbgkJCTB4MQotI2RlZmluZSBiT0ZETVR4T24JCQkweDIKLSNkZWZpbmUgYkRlYnVnUGFnZQkJCTB4ZmZmICAvKiByZXNldCBkZWJ1ZyBwYWdlIGFuZCBhbHNvIEhXb3JkLCBMV29yZCAqLwotI2RlZmluZSBiRGVidWdJdGVtCQkJMHhmZiAgIC8qIHJlc2V0IGRlYnVnIHBhZ2UgYW5kIExXb3JkICovCi0jZGVmaW5lIGJBbnRMCQkJCTB4MTAKLSNkZWZpbmUgYkFudE5vbkhUCQkJMHgxMDAKLSNkZWZpbmUgYkFudEhUMQkJCQkweDEwMDAKLSNkZWZpbmUgYkFudEhUMgkJCQkweDEwMDAwCi0jZGVmaW5lIGJBbnRIVDFTMQkJCTB4MTAwMDAwCi0jZGVmaW5lIGJBbnROb25IVFMxCQkJMHgxMDAwMDAwCi0KLS8qICA0LiBQYWdlQSgweEEwMCkgKi8KLSNkZWZpbmUgYkNDS0JCTW9kZQkJCTB4MwkvKiAgVXNlbGVzcyAqLwotI2RlZmluZSBiQ0NLVHhQb3dlclNhdmluZwkJMHg4MAotI2RlZmluZSBiQ0NLUnhQb3dlclNhdmluZwkJMHg0MAotCi0jZGVmaW5lIGJDQ0tTaWRlQmFuZAkJCTB4MTAJLyogIFJlZyAweGEwMCByQ0NLMF9TeXN0ZW0gMjAvNDAgc3dpdGNoICovCi0KLSNkZWZpbmUgYkNDS1NjcmFtYmxlCQkJMHg4CS8qICBVc2VsZXNzICovCi0jZGVmaW5lIGJDQ0tBbnREaXZlcnNpdHkJCTB4ODAwMAotI2RlZmluZSBiQ0NLQ2FycmllclJlY292ZXJ5CQkweDQwMDAKLSNkZWZpbmUgYkNDS1R4UmF0ZQkJCTB4MzAwMAotI2RlZmluZSBiQ0NLRENDYW5jZWwJCQkweDA4MDAKLSNkZWZpbmUgYkNDS0lTSUNhbmNlbAkJCTB4MDQwMAotI2RlZmluZSBiQ0NLTWF0Y2hGaWx0ZXIJCQkweDAyMDAKLSNkZWZpbmUgYkNDS0VxdWFsaXplcgkJCTB4MDEwMAotI2RlZmluZSBiQ0NLUHJlYW1ibGVEZXRlY3QJCTB4ODAwMDAwCi0jZGVmaW5lIGJDQ0tGYXN0RmFsc2VDQ0EJCTB4NDAwMDAwCi0jZGVmaW5lIGJDQ0tDaEVzdFN0YXJ0CQkJMHgzMDAwMDAKLSNkZWZpbmUgYkNDS0NDQUNvdW50CQkJMHgwODAwMDAKLSNkZWZpbmUgYkNDS2NzX2xpbQkJCTB4MDcwMDAwCi0jZGVmaW5lIGJDQ0tCaXN0TW9kZQkJCTB4ODAwMDAwMDAKLSNkZWZpbmUgYkNDS0NDQU1hc2sJCQkweDQwMDAwMDAwCi0jZGVmaW5lIGJDQ0tUeERBQ1BoYXNlCQkJMHg0Ci0jZGVmaW5lIGJDQ0tSeEFEQ1BoYXNlCQkJMHgyMDAwMDAwMCAgIC8qIHJfcnhfY2xrICovCi0jZGVmaW5lIGJDQ0tyX2NwX21vZGUwCQkJMHgwMTAwCi0jZGVmaW5lIGJDQ0tUeERDT2Zmc2V0CQkJMHhmMAotI2RlZmluZSBiQ0NLUnhEQ09mZnNldAkJCTB4ZgotI2RlZmluZSBiQ0NLQ0NBTW9kZQkJCTB4YzAwMAotI2RlZmluZSBiQ0NLRmFsc2VDU19saW0JCQkweDNmMDAKLSNkZWZpbmUgYkNDS0NTX3JhdGlvCQkJMHhjMDAwMDAKLSNkZWZpbmUgYkNDS0NvcmdCaXRfc2VsCQkJMHgzMDAwMDAKLSNkZWZpbmUgYkNDS1BEX2xpbQkJCTB4MGYwMDAwCi0jZGVmaW5lIGJDQ0tOZXdDQ0EJCQkweDgwMDAwMDAwCi0jZGVmaW5lIGJDQ0tSeEhQb2ZJRwkJCTB4ODAwMAotI2RlZmluZSBiQ0NLUnhJRwkJCTB4N2YwMAotI2RlZmluZSBiQ0NLTE5BUG9sYXJpdHkJCQkweDgwMDAwMAotI2RlZmluZSBiQ0NLUngxc3RHYWluCQkJMHg3ZjAwMDAKLSNkZWZpbmUgYkNDS1JGRXh0ZW5kCQkJMHgyMDAwMDAwMCAvKiBDQ0sgUnggSWluaXRhbCBnYWluIHBvbGFyaXR5ICovCi0jZGVmaW5lIGJDQ0tSeEFHQ1NhdExldmVsCQkweDFmMDAwMDAwCi0jZGVmaW5lIGJDQ0tSeEFHQ1NhdENvdW50CQkweGUwCi0jZGVmaW5lIGJDQ0tSeFJGU2V0dGxlCQkJMHgxZiAgICAgICAvKiBBR0NzYW1wX2RseSAqLwotI2RlZmluZSBiQ0NLRml4ZWRSeEFHQwkJCTB4ODAwMAotLyogZGVmaW5lIGJDQ0tSeEFHQ0Zvcm1hdAkJMHg0MDAwICAgcmVtb3ZlIHRvIEhTU0kgcmVnaXN0ZXIgMHg4MjQgKi8KLSNkZWZpbmUgYkNDS0FudGVubmFQb2xhcml0eQkJMHgyMDAwCi0jZGVmaW5lIGJDQ0tUeEZpbHRlclR5cGUJCTB4MGMwMAotI2RlZmluZSBiQ0NLUnhBR0NSZXBvcnRUeXBlCQkweDAzMDAKLSNkZWZpbmUgYkNDS1J4REFHQ0VuCQkJMHg4MDAwMDAwMAotI2RlZmluZSBiQ0NLUnhEQUdDUGVyaW9kCQkweDIwMDAwMDAwCi0jZGVmaW5lIGJDQ0tSeERBR0NTYXRMZXZlbAkJMHgxZjAwMDAwMAotI2RlZmluZSBiQ0NLVGltaW5nUmVjb3ZlcnkJCTB4ODAwMDAwCi0jZGVmaW5lIGJDQ0tUeEMwCQkJMHgzZjAwMDAKLSNkZWZpbmUgYkNDS1R4QzEJCQkweDNmMDAwMDAwCi0jZGVmaW5lIGJDQ0tUeEMyCQkJMHgzZgotI2RlZmluZSBiQ0NLVHhDMwkJCTB4M2YwMAotI2RlZmluZSBiQ0NLVHhDNAkJCTB4M2YwMDAwCi0jZGVmaW5lIGJDQ0tUeEM1CQkJMHgzZjAwMDAwMAotI2RlZmluZSBiQ0NLVHhDNgkJCTB4M2YKLSNkZWZpbmUgYkNDS1R4QzcJCQkweDNmMDAKLSNkZWZpbmUgYkNDS0RlYnVnUG9ydAkJCTB4ZmYwMDAwCi0jZGVmaW5lIGJDQ0tEQUNEZWJ1ZwkJCTB4MGYwMDAwMDAKLSNkZWZpbmUgYkNDS0ZhbHNlQWxhcm1FbmFibGUJCTB4ODAwMAotI2RlZmluZSBiQ0NLRmFsc2VBbGFybVJlYWQJCTB4NDAwMAotI2RlZmluZSBiQ0NLVFJTU0kJCQkweDdmCi0jZGVmaW5lIGJDQ0tSeEFHQ1JlcG9ydAkJCTB4ZmUKLSNkZWZpbmUgYkNDS1J4UmVwb3J0X0FudFNlbAkJMHg4MDAwMDAwMAotI2RlZmluZSBiQ0NLUnhSZXBvcnRfTUZPZmYJCTB4NDAwMDAwMDAKLSNkZWZpbmUgYkNDS1J4UnhSZXBvcnRfU1FMb3NzCQkweDIwMDAwMDAwCi0jZGVmaW5lIGJDQ0tSeFJlcG9ydF9Qa3Rsb3NzCQkweDEwMDAwMDAwCi0jZGVmaW5lIGJDQ0tSeFJlcG9ydF9Mb2NrZWRiaXQJCTB4MDgwMDAwMDAKLSNkZWZpbmUgYkNDS1J4UmVwb3J0X1JhdGVFcnJvcgkJMHgwNDAwMDAwMAotI2RlZmluZSBiQ0NLUnhSZXBvcnRfUnhSYXRlCQkweDAzMDAwMDAwCi0jZGVmaW5lIGJDQ0tSeEZBQ291bnRlckxvd2VyCQkweGZmCi0jZGVmaW5lIGJDQ0tSeEZBQ291bnRlclVwcGVyCQkweGZmMDAwMDAwCi0jZGVmaW5lIGJDQ0tSeEhQQUdDU3RhcnQJCTB4ZTAwMAotI2RlZmluZSBiQ0NLUnhIUEFHQ0ZpbmFsCQkweDFjMDAKLSNkZWZpbmUgYkNDS1J4RmFsc2VBbGFybUVuYWJsZQkJMHg4MDAwCi0jZGVmaW5lIGJDQ0tGQUNvdW50ZXJGcmVlemUJCTB4NDAwMAotI2RlZmluZSBiQ0NLVHhQYXRoU2VsCQkJMHgxMDAwMDAwMAotI2RlZmluZSBiQ0NLRGVmYXVsdFJ4UGF0aAkJMHhjMDAwMDAwCi0jZGVmaW5lIGJDQ0tPcHRpb25SeFBhdGgJCTB4MzAwMDAwMAotCi0vKiAgNS4gUGFnZUMoMHhDMDApICovCi0jZGVmaW5lIGJOdW1PZlNURgkJCTB4MwkvKiAgVXNlbGVzcyAqLwotI2RlZmluZSBiU2hpZnRfTAkJCTB4YzAKLSNkZWZpbmUgYkdJX1RICQkJCTB4YwotI2RlZmluZSBiUnhQYXRoQQkJCTB4MQotI2RlZmluZSBiUnhQYXRoQgkJCTB4MgotI2RlZmluZSBiUnhQYXRoQwkJCTB4NAotI2RlZmluZSBiUnhQYXRoRAkJCTB4OAotI2RlZmluZSBiVHhQYXRoQQkJCTB4MQotI2RlZmluZSBiVHhQYXRoQgkJCTB4MgotI2RlZmluZSBiVHhQYXRoQwkJCTB4NAotI2RlZmluZSBiVHhQYXRoRAkJCTB4OAotI2RlZmluZSBiVFJTU0lGcmVxCQkJMHgyMDAKLSNkZWZpbmUgYkFEQ0JhY2tvZmYJCQkweDMwMDAKLSNkZWZpbmUgYkRGSVJCYWNrb2ZmCQkJMHhjMDAwCi0jZGVmaW5lIGJUUlNTSUxhdGNoUGhhc2UJCTB4MTAwMDAKLSNkZWZpbmUgYlJ4SURDT2Zmc2V0CQkJMHhmZgotI2RlZmluZSBiUnhRRENPZmZzZXQJCQkweGZmMDAKLSNkZWZpbmUgYlJ4REZJUk1vZGUJCQkweDE4MDAwMDAKLSNkZWZpbmUgYlJ4RENORlR5cGUJCQkweGUwMDAwMDAKLSNkZWZpbmUgYlJYSVFJbWJfQQkJCTB4M2ZmCi0jZGVmaW5lIGJSWElRSW1iX0IJCQkweGZjMDAKLSNkZWZpbmUgYlJYSVFJbWJfQwkJCTB4M2YwMDAwCi0jZGVmaW5lIGJSWElRSW1iX0QJCQkweGZmYzAwMDAwCi0jZGVmaW5lIGJEQ19kY19Ob3RjaAkJCTB4NjAwMDAKLSNkZWZpbmUgYlJ4TkJJTm90Y2gJCQkweDFmMDAwMDAwCi0jZGVmaW5lIGJQRF9USAkJCQkweGYKLSNkZWZpbmUgYlBEX1RIX09wdDIJCQkweGMwMDAKLSNkZWZpbmUgYlBXRURfVEgJCQkweDcwMAotI2RlZmluZSBiSWZNRl9XaW5fTAkJCTB4ODAwCi0jZGVmaW5lIGJQRF9PcHRpb24JCQkweDEwMDAKLSNkZWZpbmUgYk1GX1dpbl9MCQkJMHhlMDAwCi0jZGVmaW5lIGJCV19TZWFyY2hfTAkJCTB4MzAwMDAKLSNkZWZpbmUgYndpbl9lbmhfTAkJCTB4YzAwMDAKLSNkZWZpbmUgYkJXX1RICQkJCTB4NzAwMDAwCi0jZGVmaW5lIGJFRF9USDIJCQkJMHgzODAwMDAwCi0jZGVmaW5lIGJCV19vcHRpb24JCQkweDQwMDAwMDAKLSNkZWZpbmUgYlJhdGlvX1RICQkJMHgxODAwMDAwMAotI2RlZmluZSBiV2luZG93X0wJCQkweGUwMDAwMDAwCi0jZGVmaW5lIGJTQkRfT3B0aW9uCQkJMHgxCi0jZGVmaW5lIGJGcmFtZV9USAkJCTB4MWMKLSNkZWZpbmUgYkZTX09wdGlvbgkJCTB4NjAKLSNkZWZpbmUgYkRDX1Nsb3BlX2NoZWNrCQkJMHg4MAotI2RlZmluZSBiRkd1YXJkX0NvdW50ZXJfRENfTAkJMHhlMDAKLSNkZWZpbmUgYkZyYW1lX1dlaWdodF9TaG9ydAkJMHg3MDAwCi0jZGVmaW5lIGJTdWJfVHVuZQkJCTB4ZTAwMDAwCi0jZGVmaW5lIGJGcmFtZV9EQ19MZW5ndGgJCTB4ZTAwMDAwMAotI2RlZmluZSBiU0JEX3N0YXJ0X29mZnNldAkJMHgzMDAwMDAwMAotI2RlZmluZSBiRnJhbWVfVEhfMgkJCTB4NwotI2RlZmluZSBiRnJhbWVfR0kyX1RICQkJMHgzOAotI2RlZmluZSBiR0kyX1N5bmNfZW4JCQkweDQwCi0jZGVmaW5lIGJTYXJjaF9TaG9ydF9FYXJseQkJMHgzMDAKLSNkZWZpbmUgYlNhcmNoX1Nob3J0X0xhdGUJCTB4YzAwCi0jZGVmaW5lIGJTYXJjaF9HSTJfTGF0ZQkJCTB4NzAwMDAKLSNkZWZpbmUgYkNGT0FudFN1bQkJCTB4MQotI2RlZmluZSBiQ0ZPQWNjCQkJCTB4MgotI2RlZmluZSBiQ0ZPU3RhcnRPZmZzZXQJCQkweGMKLSNkZWZpbmUgYkNGT0xvb2tCYWNrCQkJMHg3MAotI2RlZmluZSBiQ0ZPU3VtV2VpZ2h0CQkJMHg4MAotI2RlZmluZSBiREFHQ0VuYWJsZQkJCTB4MTAwMDAKLSNkZWZpbmUgYlRYSVFJbWJfQQkJCTB4M2ZmCi0jZGVmaW5lIGJUWElRSW1iX0IJCQkweGZjMDAKLSNkZWZpbmUgYlRYSVFJbWJfQwkJCTB4M2YwMDAwCi0jZGVmaW5lIGJUWElRSW1iX0QJCQkweGZmYzAwMDAwCi0jZGVmaW5lIGJUeElEQ09mZnNldAkJCTB4ZmYKLSNkZWZpbmUgYlR4UURDT2Zmc2V0CQkJMHhmZjAwCi0jZGVmaW5lIGJUeERGSVJNb2RlCQkJMHgxMDAwMAotI2RlZmluZSBiVHhQZXN1ZG9Ob2lzZU9uCQkweDQwMDAwMDAKLSNkZWZpbmUgYlR4UGVzdWRvTm9pc2VfQQkJMHhmZgotI2RlZmluZSBiVHhQZXN1ZG9Ob2lzZV9CCQkweGZmMDAKLSNkZWZpbmUgYlR4UGVzdWRvTm9pc2VfQwkJMHhmZjAwMDAKLSNkZWZpbmUgYlR4UGVzdWRvTm9pc2VfRAkJMHhmZjAwMDAwMAotI2RlZmluZSBiQ0NBRHJvcE9wdGlvbgkJCTB4MjAwMDAKLSNkZWZpbmUgYkNDQURyb3BUaHJlcwkJCTB4ZmZmMDAwMDAKLSNkZWZpbmUgYkVEQ0NBX0gJCQkweGYKLSNkZWZpbmUgYkVEQ0NBX0wJCQkweGYwCi0jZGVmaW5lIGJMYW1iZGFfRUQJCQkweDMwMAotI2RlZmluZSBiUnhJbml0aWFsR2FpbgkJCTB4N2YKLSNkZWZpbmUgYlJ4QW50RGl2RW4JCQkweDgwCi0jZGVmaW5lIGJSeEFHQ0FkZHJlc3NGb3JMTkEJCTB4N2YwMAotI2RlZmluZSBiUnhIaWdoUG93ZXJGbG93CQkweDgwMDAKLSNkZWZpbmUgYlJ4QUdDRnJlZXplVGhyZXMJCTB4YzAwMDAKLSNkZWZpbmUgYlJ4RnJlZXplU3RlcF9BR0MxCQkweDMwMDAwMAotI2RlZmluZSBiUnhGcmVlemVTdGVwX0FHQzIJCTB4YzAwMDAwCi0jZGVmaW5lIGJSeEZyZWV6ZVN0ZXBfQUdDMwkJMHgzMDAwMDAwCi0jZGVmaW5lIGJSeEZyZWV6ZVN0ZXBfQUdDMAkJMHhjMDAwMDAwCi0jZGVmaW5lIGJSeFJzc2lfQ21wX0VuCQkJMHgxMDAwMDAwMAotI2RlZmluZSBiUnhRdWlja0FHQ0VuCQkJMHgyMDAwMDAwMAotI2RlZmluZSBiUnhBR0NGcmVlemVUaHJlc01vZGUJCTB4NDAwMDAwMDAKLSNkZWZpbmUgYlJ4T3ZlckZsb3dDaGVja1R5cGUJCTB4ODAwMDAwMDAKLSNkZWZpbmUgYlJ4QUdDU2hpZnQJCQkweDdmCi0jZGVmaW5lIGJUUlNXX1RyaV9Pbmx5CQkJMHg4MAotI2RlZmluZSBiUG93ZXJUaHJlcwkJCTB4MzAwCi0jZGVmaW5lIGJSeEFHQ0VuCQkJMHgxCi0jZGVmaW5lIGJSeEFHQ1RvZ2V0aGVyRW4JCTB4MgotI2RlZmluZSBiUnhBR0NNaW4JCQkweDQKLSNkZWZpbmUgYlJ4SFBfSW5pCQkJMHg3Ci0jZGVmaW5lIGJSeEhQX1RSTE5BCQkJMHg3MAotI2RlZmluZSBiUnhIUF9SU1NJCQkJMHg3MDAKLSNkZWZpbmUgYlJ4SFBfQkJQMQkJCTB4NzAwMAotI2RlZmluZSBiUnhIUF9CQlAyCQkJMHg3MDAwMAotI2RlZmluZSBiUnhIUF9CQlAzCQkJMHg3MDAwMDAKLSNkZWZpbmUgYlJTU0lfSAkJCQkweDdmMDAwMCAgICAgLyogdGhlIHRocmVzaG9sZCBmb3IgaGlnaCBwb3dlciAqLwotI2RlZmluZSBiUlNTSV9HZW4JCQkweDdmMDAwMDAwICAgLyogdGhlIHRocmVzaG9sZCBmb3IgYW50IGRpdmVyc2l0eSAqLwotI2RlZmluZSBiUnhTZXR0bGVfVFJTVwkJCTB4NwotI2RlZmluZSBiUnhTZXR0bGVfTE5BCQkJMHgzOAotI2RlZmluZSBiUnhTZXR0bGVfUlNTSQkJCTB4MWMwCi0jZGVmaW5lIGJSeFNldHRsZV9CQlAJCQkweGUwMAotI2RlZmluZSBiUnhTZXR0bGVfUnhIUAkJCTB4NzAwMAotI2RlZmluZSBiUnhTZXR0bGVfQW50U1dfUlNTSQkJMHgzODAwMAotI2RlZmluZSBiUnhTZXR0bGVfQW50U1cJCQkweGMwMDAwCi0jZGVmaW5lIGJSeFByb2Nlc3NUaW1lX0RBR0MJCTB4MzAwMDAwCi0jZGVmaW5lIGJSeFNldHRsZV9IU1NJCQkJMHg0MDAwMDAKLSNkZWZpbmUgYlJ4UHJvY2Vzc1RpbWVfQkJQUFcJCTB4ODAwMDAwCi0jZGVmaW5lIGJSeEFudGVubmFQb3dlclNoaWZ0CQkweDMwMDAwMDAKLSNkZWZpbmUgYlJTU0lUYWJsZVNlbGVjdAkJMHhjMDAwMDAwCi0jZGVmaW5lIGJSeEhQX0ZpbmFsCQkJMHg3MDAwMDAwCi0jZGVmaW5lIGJSeEhUU2V0dGxlX0JCUAkJCTB4NwotI2RlZmluZSBiUnhIVFNldHRsZV9IU1NJCQkweDgKLSNkZWZpbmUgYlJ4SFRTZXR0bGVfUnhIUAkJMHg3MAotI2RlZmluZSBiUnhIVFNldHRsZV9CQlBQVwkJMHg4MAotI2RlZmluZSBiUnhIVFNldHRsZV9JZGxlCQkweDMwMAotI2RlZmluZSBiUnhIVFNldHRsZV9SZXNlcnZlZAkJMHgxYzAwCi0jZGVmaW5lIGJSeEhUUnhIUEVuCQkJMHg4MDAwCi0jZGVmaW5lIGJSeEhUQUdDRnJlZXplVGhyZXMJCTB4MzAwMDAKLSNkZWZpbmUgYlJ4SFRBR0NUb2dldGhlckVuCQkweDQwMDAwCi0jZGVmaW5lIGJSeEhUQUdDTWluCQkJMHg4MDAwMAotI2RlZmluZSBiUnhIVEFHQ0VuCQkJMHgxMDAwMDAKLSNkZWZpbmUgYlJ4SFREQUdDRW4JCQkweDIwMDAwMAotI2RlZmluZSBiUnhIVFJ4SFBfQkJQCQkJMHgxYzAwMDAwCi0jZGVmaW5lIGJSeEhUUnhIUF9GaW5hbAkJCTB4ZTAwMDAwMDAKLSNkZWZpbmUgYlJ4UFdSYXRpb1RICQkJMHgzCi0jZGVmaW5lIGJSeFBXUmF0aW9FbgkJCTB4NAotI2RlZmluZSBiUnhNRkhvbGQJCQkweDM4MDAKLSNkZWZpbmUgYlJ4UERfRGVsYXlfVEgxCQkJMHgzOAotI2RlZmluZSBiUnhQRF9EZWxheV9USDIJCQkweDFjMAotI2RlZmluZSBiUnhQRF9EQ19DT1VOVF9NQVgJCTB4NjAwCi0vKiBkZWZpbmUgYlJ4TUZfSG9sZCAgICAgICAgICAgCSAgICAweDM4MDAgKi8KLSNkZWZpbmUgYlJ4UERfRGVsYXlfVEgJCQkweDgwMDAKLSNkZWZpbmUgYlJ4UHJvY2Vzc19EZWxheQkJMHhmMDAwMAotI2RlZmluZSBiUnhTZWFyY2hyYW5nZV9HSTJfRWFybHkJMHg3MDAwMDAKLSNkZWZpbmUgYlJ4RnJhbWVfR3VhcmRfQ291bnRlcl9MCTB4MzgwMDAwMAotI2RlZmluZSBiUnhTR0lfR3VhcmRfTAkJCTB4YzAwMDAwMAotI2RlZmluZSBiUnhTR0lfU2VhcmNoX0wJCQkweDMwMDAwMDAwCi0jZGVmaW5lIGJSeFNHSV9USAkJCTB4YzAwMDAwMDAKLSNkZWZpbmUgYkRGU0NudDAJCQkweGZmCi0jZGVmaW5lIGJERlNDbnQxCQkJMHhmZjAwCi0jZGVmaW5lIGJERlNGbGFnCQkJMHhmMDAwMAotI2RlZmluZSBiTUZXZWlnaHRTdW0JCQkweDMwMDAwMAotI2RlZmluZSBiTWluSWR4VEgJCQkweDdmMDAwMDAwCi0jZGVmaW5lIGJEQUZvcm1hdAkJCTB4NDAwMDAKLSNkZWZpbmUgYlR4Q2hFbXVFbmFibGUJCQkweDAxMDAwMDAwCi0jZGVmaW5lIGJUUlNXSXNvbGF0aW9uX0EJCTB4N2YKLSNkZWZpbmUgYlRSU1dJc29sYXRpb25fQgkJMHg3ZjAwCi0jZGVmaW5lIGJUUlNXSXNvbGF0aW9uX0MJCTB4N2YwMDAwCi0jZGVmaW5lIGJUUlNXSXNvbGF0aW9uX0QJCTB4N2YwMDAwMDAKLSNkZWZpbmUgYkV4dExOQUdhaW4JCQkweDdjMDAKLQotLyogIDYuIFBhZ2VFKDB4RTAwKSAqLwotI2RlZmluZSBiU1RCQ0VuCQkJCTB4NAkvKiAgVXNlbGVzcyAqLwotI2RlZmluZSBiQW50ZW5uYU1hcHBpbmcJCQkweDEwCi0jZGVmaW5lIGJOc3MJCQkJMHgyMAotI2RlZmluZSBiQ0ZPQW50U3VtRAkJCTB4MjAwCi0jZGVmaW5lIGJQSFlDb3VudGVyUmVzZXQJCTB4ODAwMDAwMAotI2RlZmluZSBiQ0ZPUmVwb3J0R2V0CQkJMHg0MDAwMDAwCi0jZGVmaW5lIGJPRkRNQ29udGludWVUeAkJCTB4MTAwMDAwMDAKLSNkZWZpbmUgYk9GRE1TaW5nbGVDYXJyaWVyCQkweDIwMDAwMDAwCi0jZGVmaW5lIGJPRkRNU2luZ2xlVG9uZQkJCTB4NDAwMDAwMDAKLS8qIGRlZmluZSBiUnhQYXRoMSAgICAgICAgICAgICAgICAgMHgwMSAqLwotLyogZGVmaW5lIGJSeFBhdGgyICAgICAgICAgICAgICAgICAweDAyICovCi0vKiBkZWZpbmUgYlJ4UGF0aDMgICAgICAgICAgICAgICAgIDB4MDQgKi8KLS8qIGRlZmluZSBiUnhQYXRoNCAgICAgICAgICAgICAgICAgMHgwOCAqLwotLyogZGVmaW5lIGJUeFBhdGgxICAgICAgICAgICAgICAgICAweDEwICovCi0vKiBkZWZpbmUgYlR4UGF0aDIgICAgICAgICAgICAgICAgIDB4MjAgKi8KLSNkZWZpbmUgYkhURGV0ZWN0CQkJMHgxMDAKLSNkZWZpbmUgYkNGT0VuCQkJCTB4MTAwMDAKLSNkZWZpbmUgYkNGT1ZhbHVlCQkJMHhmZmYwMDAwMAotI2RlZmluZSBiU2lnVG9uZV9SZQkJCTB4M2YKLSNkZWZpbmUgYlNpZ1RvbmVfSW0JCQkweDdmMDAKLSNkZWZpbmUgYkNvdW50ZXJfQ0NBCQkJMHhmZmZmCi0jZGVmaW5lIGJDb3VudGVyX1Bhcml0eUZhaWwJCTB4ZmZmZjAwMDAKLSNkZWZpbmUgYkNvdW50ZXJfUmF0ZUlsbGVnYWwJCTB4ZmZmZgotI2RlZmluZSBiQ291bnRlcl9DUkM4RmFpbAkJMHhmZmZmMDAwMAotI2RlZmluZSBiQ291bnRlcl9NQ1NOb1N1cHBvcnQJCTB4ZmZmZgotI2RlZmluZSBiQ291bnRlcl9GYXN0U3luYwkJMHhmZmZmCi0jZGVmaW5lIGJTaG9ydENGTwkJCTB4ZmZmCi0jZGVmaW5lIGJTaG9ydENGT1RMZW5ndGgJCTEyICAgLyogdG90YWwgKi8KLSNkZWZpbmUgYlNob3J0Q0ZPRkxlbmd0aAkJMTEgICAvKiBmcmFjdGlvbiAqLwotI2RlZmluZSBiTG9uZ0NGTwkJCTB4N2ZmCi0jZGVmaW5lIGJMb25nQ0ZPVExlbmd0aAkJCTExCi0jZGVmaW5lIGJMb25nQ0ZPRkxlbmd0aAkJCTExCi0jZGVmaW5lIGJUYWlsQ0ZPCQkJMHgxZmZmCi0jZGVmaW5lIGJUYWlsQ0ZPVExlbmd0aAkJCTEzCi0jZGVmaW5lIGJUYWlsQ0ZPRkxlbmd0aAkJCTEyCi0jZGVmaW5lIGJtYXhfZW5fcHdkQgkJCTB4ZmZmZgotI2RlZmluZSBiQ0NfcG93ZXJfZEIJCQkweGZmZmYwMDAwCi0jZGVmaW5lIGJub2lzZV9wd2RCCQkJMHhmZmZmCi0jZGVmaW5lIGJQb3dlck1lYXNUTGVuZ3RoCQkxMAotI2RlZmluZSBiUG93ZXJNZWFzRkxlbmd0aAkJMwotI2RlZmluZSBiUnhfSFRfQlcJCQkweDEKLSNkZWZpbmUgYlJ4U0MJCQkJMHg2Ci0jZGVmaW5lIGJSeF9IVAkJCQkweDgKLSNkZWZpbmUgYk5CX2ludGZfZGV0X29uCQkJMHgxCi0jZGVmaW5lIGJJbnRmX3dpbl9sZW5fY2ZnCQkweDMwCi0jZGVmaW5lIGJOQl9JbnRmX1RIX2NmZwkJCTB4MWMwCi0jZGVmaW5lIGJSRkdhaW4JCQkJMHgzZgotI2RlZmluZSBiVGFibGVTZWwJCQkweDQwCi0jZGVmaW5lIGJUUlNXCQkJCTB4ODAKLSNkZWZpbmUgYlJ4U05SX0EJCQkweGZmCi0jZGVmaW5lIGJSeFNOUl9CCQkJMHhmZjAwCi0jZGVmaW5lIGJSeFNOUl9DCQkJMHhmZjAwMDAKLSNkZWZpbmUgYlJ4U05SX0QJCQkweGZmMDAwMDAwCi0jZGVmaW5lIGJTTlJFVk1UTGVuZ3RoCQkJOAotI2RlZmluZSBiU05SRVZNRkxlbmd0aAkJCTEKLSNkZWZpbmUgYkNTSTFzdAkJCQkweGZmCi0jZGVmaW5lIGJDU0kybmQJCQkJMHhmZjAwCi0jZGVmaW5lIGJSeEVWTTFzdAkJCTB4ZmYwMDAwCi0jZGVmaW5lIGJSeEVWTTJuZAkJCTB4ZmYwMDAwMDAKLSNkZWZpbmUgYlNJR0VWTQkJCQkweGZmCi0jZGVmaW5lIGJQV0RCCQkJCTB4ZmYwMAotI2RlZmluZSBiU0dJRU4JCQkJMHgxMDAwMAotCi0jZGVmaW5lIGJTRmFjdG9yUUFNMQkJCTB4ZgkvKiAgVXNlbGVzcyAqLwotI2RlZmluZSBiU0ZhY3RvclFBTTIJCQkweGYwCi0jZGVmaW5lIGJTRmFjdG9yUUFNMwkJCTB4ZjAwCi0jZGVmaW5lIGJTRmFjdG9yUUFNNAkJCTB4ZjAwMAotI2RlZmluZSBiU0ZhY3RvclFBTTUJCQkweGYwMDAwCi0jZGVmaW5lIGJTRmFjdG9yUUFNNgkJCTB4ZjAwMDAKLSNkZWZpbmUgYlNGYWN0b3JRQU03CQkJMHhmMDAwMDAKLSNkZWZpbmUgYlNGYWN0b3JRQU04CQkJMHhmMDAwMDAwCi0jZGVmaW5lIGJTRmFjdG9yUUFNOQkJCTB4ZjAwMDAwMDAKLSNkZWZpbmUgYkNTSVNjaGVtZQkJCTB4MTAwMDAwCi0KLSNkZWZpbmUgYk5vaXNlTHZsVG9wU2V0CQkJMHgzCS8qICBVc2VsZXNzICovCi0jZGVmaW5lIGJDaFNtb290aAkJCTB4NAotI2RlZmluZSBiQ2hTbW9vdGhDZmcxCQkJMHgzOAotI2RlZmluZSBiQ2hTbW9vdGhDZmcyCQkJMHgxYzAKLSNkZWZpbmUgYkNoU21vb3RoQ2ZnMwkJCTB4ZTAwCi0jZGVmaW5lIGJDaFNtb290aENmZzQJCQkweDcwMDAKLSNkZWZpbmUgYk1SQ01vZGUJCQkweDgwMDAwMAotI2RlZmluZSBiVEhFVk1DZmcJCQkweDcwMDAwMDAKLQotI2RlZmluZSBiTG9vcEZpdFR5cGUJCQkweDEJLyogIFVzZWxlc3MgKi8KLSNkZWZpbmUgYlVwZENGTwkJCQkweDQwCi0jZGVmaW5lIGJVcGRDRk9PZmZEYXRhCQkJMHg4MAotI2RlZmluZSBiQWR2VXBkQ0ZPCQkJMHgxMDAKLSNkZWZpbmUgYkFkdlRpbWVDdHJsCQkJMHg4MDAKLSNkZWZpbmUgYlVwZENsa28JCQkweDEwMDAKLSNkZWZpbmUgYkZDCQkJCTB4NjAwMAotI2RlZmluZSBiVHJhY2tpbmdNb2RlCQkJMHg4MDAwCi0jZGVmaW5lIGJQaENtcEVuYWJsZQkJCTB4MTAwMDAKLSNkZWZpbmUgYlVwZENsa29MVEYJCQkweDIwMDAwCi0jZGVmaW5lIGJDb21DaENGTwkJCTB4NDAwMDAKLSNkZWZpbmUgYkNTSUVzdGlNb2RlCQkJMHg4MDAwMAotI2RlZmluZSBiQWR2VXBkRXF6CQkJMHgxMDAwMDAKLSNkZWZpbmUgYlVDaENmZwkJCQkweDcwMDAwMDAKLSNkZWZpbmUgYlVwZEVxegkJCQkweDgwMDAwMDAKLQotLyogUnggUHNlZHVvIG5vaXNlICovCi0jZGVmaW5lIGJSeFBlc3Vkb05vaXNlT24JCTB4MjAwMDAwMDAJLyogIFVzZWxlc3MgKi8KLSNkZWZpbmUgYlJ4UGVzdWRvTm9pc2VfQQkJMHhmZgotI2RlZmluZSBiUnhQZXN1ZG9Ob2lzZV9CCQkweGZmMDAKLSNkZWZpbmUgYlJ4UGVzdWRvTm9pc2VfQwkJMHhmZjAwMDAKLSNkZWZpbmUgYlJ4UGVzdWRvTm9pc2VfRAkJMHhmZjAwMDAwMAotI2RlZmluZSBiUGVzdWRvTm9pc2VTdGF0ZV9BCQkweGZmZmYKLSNkZWZpbmUgYlBlc3Vkb05vaXNlU3RhdGVfQgkJMHhmZmZmMDAwMAotI2RlZmluZSBiUGVzdWRvTm9pc2VTdGF0ZV9DCQkweGZmZmYKLSNkZWZpbmUgYlBlc3Vkb05vaXNlU3RhdGVfRAkJMHhmZmZmMDAwMAotCi0vKiA3LiBSRiBSZWdpc3RlciAqLwotLyogWmVicmExICovCi0jZGVmaW5lIGJaZWJyYTFfSFNTSUVuYWJsZQkJMHg4CQkvKiAgVXNlbGVzcyAqLwotI2RlZmluZSBiWmVicmExX1RSeENvbnRyb2wJCTB4YzAwCi0jZGVmaW5lIGJaZWJyYTFfVFJ4R2FpblNldHRpbmcJCTB4MDdmCi0jZGVmaW5lIGJaZWJyYTFfUnhDb3JuZXIJCTB4YzAwCi0jZGVmaW5lIGJaZWJyYTFfVHhDaGFyZ2VQdW1wCQkweDM4Ci0jZGVmaW5lIGJaZWJyYTFfUnhDaGFyZ2VQdW1wCQkweDcKLSNkZWZpbmUgYlplYnJhMV9DaGFubmVsTnVtCQkweGY4MAotI2RlZmluZSBiWmVicmExX1R4TFBGQlcJCQkweDQwMAotI2RlZmluZSBiWmVicmExX1J4TFBGQlcJCQkweDYwMAotCi0vKiBaZWJyYTQgKi8KLSNkZWZpbmUgYlJUTDgyNTZSZWdNb2RlQ3RybDEJCTB4MTAwCS8qICBVc2VsZXNzICovCi0jZGVmaW5lIGJSVEw4MjU2UmVnTW9kZUN0cmwwCQkweDQwCi0jZGVmaW5lIGJSVEw4MjU2X1R4TFBGQlcJCTB4MTgKLSNkZWZpbmUgYlJUTDgyNTZfUnhMUEZCVwkJMHg2MDAKLQotLyogUlRMODI1OCAqLwotI2RlZmluZSBiUlRMODI1OF9UeExQRkJXCQkweGMJLyogIFVzZWxlc3MgKi8KLSNkZWZpbmUgYlJUTDgyNThfUnhMUEZCVwkJMHhjMDAKLSNkZWZpbmUgYlJUTDgyNThfUlNTSUxQRkJXCQkweGMwCi0KLQotLyogIE90aGVyIERlZmluaXRpb24gKi8KLQotLyogYnl0ZSBlbmRhYmxlIGZvciBzYl93cml0ZSAqLwotI2RlZmluZSBiQnl0ZTAJCQkJMHgxCS8qICBVc2VsZXNzICovCi0jZGVmaW5lIGJCeXRlMQkJCQkweDIKLSNkZWZpbmUgYkJ5dGUyCQkJCTB4NAotI2RlZmluZSBiQnl0ZTMJCQkJMHg4Ci0jZGVmaW5lIGJXb3JkMAkJCQkweDMKLSNkZWZpbmUgYldvcmQxCQkJCTB4YwotI2RlZmluZSBiRFdvcmQJCQkJMHhmCi0KLS8qIGZvciBQdXRSZWdzZXR0aW5nICYgR2V0UmVnU2V0dGluZyBCaXRNYXNrICovCi0jZGVmaW5lIGJNYXNrQnl0ZTAJCQkweGZmCS8qICBSZWcgMHhjNTAgck9GRE0wX1hBQUdDQ29yZX4weEM2ZiAqLwotI2RlZmluZSBiTWFza0J5dGUxCQkJMHhmZjAwCi0jZGVmaW5lIGJNYXNrQnl0ZTIJCQkweGZmMDAwMAotI2RlZmluZSBiTWFza0J5dGUzCQkJMHhmZjAwMDAwMAotI2RlZmluZSBiTWFza0hXb3JkCQkJMHhmZmZmMDAwMAotI2RlZmluZSBiTWFza0xXb3JkCQkJMHgwMDAwZmZmZgotI2RlZmluZSBiTWFza0RXb3JkCQkJMHhmZmZmZmZmZgotI2RlZmluZSBiTWFzazEyQml0cwkJCTB4ZmZmCi0jZGVmaW5lIGJNYXNrSDRCaXRzCQkJMHhmMDAwMDAwMAotI2RlZmluZSBiTWFza09GRE1fRAkJCTB4ZmZjMDAwMDAKLSNkZWZpbmUgYk1hc2tDQ0sJCQkweDNmM2YzZjNmCi0KLS8qIGZvciBQdXRSRlJlZ3NldHRpbmcgJiBHZXRSRlJlZ1NldHRpbmcgQml0TWFzayAqLwotI2RlZmluZQkJYlJGUmVnT2Zmc2V0TWFzawkweGZmZmZmCi0KLSNkZWZpbmUgYkRpc2FibGUJCQkweDAKLQotI2RlZmluZSBMZWZ0QW50ZW5uYQkJCTB4MAkvKiAgVXNlbGVzcyAqLwotI2RlZmluZSBSaWdodEFudGVubmEJCQkweDEKLQotI2RlZmluZSB0Q2hlY2tUeFN0YXR1cwkJCTUwMCAgIC8qIDUwMG1zIFVzZWxlc3MgKi8KLSNkZWZpbmUgdFVwZGF0ZVJ4Q291bnRlcgkJMTAwICAgLyogMTAwbXMgKi8KLQotI2RlZmluZSByYXRlQ0NLCQkJCTAJLyogIFVzZWxlc3MgKi8KLSNkZWZpbmUgcmF0ZU9GRE0JCQkxCi0jZGVmaW5lIHJhdGVIVAkJCQkyCi0KLS8qIGRlZmluZSBSZWdpc3Rlci1FbmQgKi8KLSNkZWZpbmUgYlBNQUNfRW5kCQkJMHgxZmYJLyogIFVzZWxlc3MgKi8KLSNkZWZpbmUgYkZQR0FQSFkwX0VuZAkJCTB4OGZmCi0jZGVmaW5lIGJGUEdBUEhZMV9FbmQJCQkweDlmZgotI2RlZmluZSBiQ0NLUEhZMF9FbmQJCQkweGFmZgotI2RlZmluZSBiT0ZETVBIWTBfRW5kCQkJMHhjZmYKLSNkZWZpbmUgYk9GRE1QSFkxX0VuZAkJCTB4ZGZmCi0KLS8qIGRlZmluZSBtYXggZGVidWcgaXRlbSBpbiBlYWNoIGRlYnVnIHBhZ2UgKi8KLS8qIGRlZmluZSBiTWF4SXRlbV9GUEdBX1BIWTAgICAgICAgIDB4OSAqLwotLyogZGVmaW5lIGJNYXhJdGVtX0ZQR0FfUEhZMSAgICAgICAgMHgzICovCi0vKiBkZWZpbmUgYk1heEl0ZW1fUEhZXzExQiAgICAgICAgICAweDE2ICovCi0vKiBkZWZpbmUgYk1heEl0ZW1fT0ZETV9QSFkwICAgICAgICAweDI5ICovCi0vKiBkZWZpbmUgYk1heEl0ZW1fT0ZETV9QSFkxICAgICAgICAweDAgKi8KLQotI2RlZmluZSBiUE1BQ0NvbnRyb2wJCQkweDAJLyogIFVzZWxlc3MgKi8KLSNkZWZpbmUgYldNQUNDb250cm9sCQkJMHgxCi0jZGVmaW5lIGJXTklDQ29udHJvbAkJCTB4MgotCi0jZGVmaW5lIFBhdGhBCQkJCTB4MAkvKiAgVXNlbGVzcyAqLwotI2RlZmluZSBQYXRoQgkJCQkweDEKLSNkZWZpbmUgUGF0aEMJCQkJMHgyCi0jZGVmaW5lIFBhdGhECQkJCTB4MwotCi0vKiAgUGFnZUIoMHhCMDApICovCi0jZGVmaW5lIHJQZHBfQW50QQkJCTB4YjAwCi0jZGVmaW5lIHJQZHBfQW50QV80CQkJMHhiMDQKLSNkZWZpbmUgclBkcF9BbnRBXzgJCQkweGIwOAotI2RlZmluZSByUGRwX0FudEFfQwkJCTB4YjBjCi0jZGVmaW5lIHJQZHBfQW50QV8xOAkJCTB4YjE4Ci0jZGVmaW5lIHJQZHBfQW50QV8xQwkJCTB4YjFjCi0jZGVmaW5lIHJQZHBfQW50QV8yMAkJCTB4YjIwCi0jZGVmaW5lIHJQZHBfQW50QV8yNAkJCTB4YjI0Ci0KLSNkZWZpbmUgckNvbmZpZ19QbXBkX0FudEEJCTB4YjI4Ci0jZGVmaW5lIHJDb25maWdfcmFtNjR4MTYJCTB4YjJjCi0KLSNkZWZpbmUgckJuZEEJCQkJMHhiMzAKLSNkZWZpbmUgckhzc2lQYXIJCQkweGIzNAotCi0jZGVmaW5lIHJDb25maWdfQW50QQkJCTB4YjY4Ci0jZGVmaW5lIHJDb25maWdfQW50QgkJCTB4YjZjCi0KLSNkZWZpbmUgclBkcF9BbnRCCQkJMHhiNzAKLSNkZWZpbmUgclBkcF9BbnRCXzQJCQkweGI3NAotI2RlZmluZSByUGRwX0FudEJfOAkJCTB4Yjc4Ci0jZGVmaW5lIHJQZHBfQW50Ql9DCQkJMHhiN2MKLSNkZWZpbmUgclBkcF9BbnRCXzEwCQkJMHhiODAKLSNkZWZpbmUgclBkcF9BbnRCXzE0CQkJMHhiODQKLSNkZWZpbmUgclBkcF9BbnRCXzE4CQkJMHhiODgKLSNkZWZpbmUgclBkcF9BbnRCXzFDCQkJMHhiOGMKLSNkZWZpbmUgclBkcF9BbnRCXzIwCQkJMHhiOTAKLSNkZWZpbmUgclBkcF9BbnRCXzI0CQkJMHhiOTQKLQotI2RlZmluZSByQ29uZmlnX1BtcGRfQW50QgkJMHhiOTgKLQotI2RlZmluZSByQm5kQgkJCQkweGJhMAotCi0jZGVmaW5lIHJBUEsJCQkJMHhiZDgKLSNkZWZpbmUgclBtX1J4MF9BbnRBCQkJMHhiZGMKLSNkZWZpbmUgclBtX1J4MV9BbnRBCQkJMHhiZTAKLSNkZWZpbmUgclBtX1J4Ml9BbnRBCQkJMHhiZTQKLSNkZWZpbmUgclBtX1J4M19BbnRBCQkJMHhiZTgKLSNkZWZpbmUgclBtX1J4MF9BbnRCCQkJMHhiZWMKLSNkZWZpbmUgclBtX1J4MV9BbnRCCQkJMHhiZjAKLSNkZWZpbmUgclBtX1J4Ml9BbnRCCQkJMHhiZjQKLSNkZWZpbmUgclBtX1J4M19BbnRCCQkJMHhiZjgKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsODcyM1B3clNlcS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbDg3MjNQd3JTZXEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc3MWQ2Yi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsODcyM1B3clNlcS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLSNpZm5kZWYgX19IQUw4NzIzUFdSU0VRX0hfXwotI2RlZmluZSBfX0hBTDg3MjNQV1JTRVFfSF9fCi0vKgotCUNoZWNrIGRvY3VtZW50IFdNLTIwMTEwNjA3LVBhdWwtUlRMODcyM0FfUG93ZXJfQXJjaGl0ZWN0dXJlLVIwMi52c2QKLQlUaGVyZSBhcmUgNiBIVyBQb3dlciBTdGF0ZXM6Ci0JMDogUE9GRi0tUG93ZXIgT2ZmCi0JMTogUEROLS1Qb3dlciBEb3duCi0JMjogQ0FSREVNVS0tQ2FyZCBFbXVsYXRpb24KLQkzOiBBQ1QtLUFjdGl2ZSBNb2RlCi0JNDogTFBTLS1Mb3cgUG93ZXIgU3RhdGUKLQk1OiBTVVMtLVN1c3BlbmQKLQotCVRoZSB0cmFuc2lzaW9uIGZyb20gZGlmZmVyZW50IHN0YXRlcyBhcmUgZGVmaW5lZCBiZWxvdwotCVRSQU5TX0NBUkRFTVVfVE9fQUNUCi0JVFJBTlNfQUNUX1RPX0NBUkRFTVUKLQlUUkFOU19DQVJERU1VX1RPX1NVUwotCVRSQU5TX1NVU19UT19DQVJERU1VCi0JVFJBTlNfQ0FSREVNVV9UT19QRE4KLQlUUkFOU19BQ1RfVE9fTFBTCi0JVFJBTlNfTFBTX1RPX0FDVAotCi0JVFJBTlNfRU5ECi0qLwotI2luY2x1ZGUgIkhhbFB3clNlcUNtZC5oIgotI2luY2x1ZGUgInJ0bDg3MjNhX3NwZWMuaCIKLQotI2RlZmluZQlSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX0FDVF9TVEVQUwkxNQotI2RlZmluZQlSVEw4NzIzQV9UUkFOU19BQ1RfVE9fQ0FSREVNVV9TVEVQUwkxNQotI2RlZmluZQlSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX1NVU19TVEVQUwkxNQotI2RlZmluZQlSVEw4NzIzQV9UUkFOU19TVVNfVE9fQ0FSREVNVV9TVEVQUwkxNQotI2RlZmluZQlSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX1BETl9TVEVQUwkxNQotI2RlZmluZQlSVEw4NzIzQV9UUkFOU19QRE5fVE9fQ0FSREVNVV9TVEVQUwkxNQotI2RlZmluZQlSVEw4NzIzQV9UUkFOU19BQ1RfVE9fTFBTX1NURVBTCTE1Ci0jZGVmaW5lCVJUTDg3MjNBX1RSQU5TX0xQU19UT19BQ1RfU1RFUFMJMTUKLSNkZWZpbmUJUlRMODcyM0FfVFJBTlNfRU5EX1NURVBTCTEKLQotCi0vKiBmb3JtYXQKLSAqIHsgb2Zmc2V0LCBjdXRfbXNrLCBmYWJfbXNrfGludGVyZmFjZV9tc2ssIGJhc2V8Y21kLCBtc2ssIHZhbHVlIH0sICBjb21tZW50cyBoZXJlCi0gKi8KLSNkZWZpbmUgUlRMODcyM0FfVFJBTlNfQ0FSREVNVV9UT19BQ1QJCQkJCQkJCQkJCQkJCVwKLQl7MHgwMDIwLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfVVNCX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDApLCBCSVQoMCl9LCAvKjB4MjBbMF0gPSAxYicxIGVuYWJsZSBMRE9BMTIgTUFDUk8gYmxvY2sgZm9yIGFsbCBpbnRlcmZhY2UqLyBcCi0JezB4MDA2NywgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1VTQl9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCg0KSwgMH0sIC8qMHg2N1swXSA9IDAgdG8gZGlzYWJsZSBCVF9HUFNfU0VMIHBpbnMqLwlcCi0JezB4MDAwMSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1VTQl9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfREVMQVksIDEsIFBXUlNFUV9ERUxBWV9NU30sLypEZWxheSAxbXMqLyAgIFwKLQl7MHgwMDAwLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfVVNCX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDUpLCAwfSwgLyoweDAwWzVdID0gMWInMCByZWxlYXNlIGFuYWxvZyBJcHMgdG8gZGlnaXRhbCAsIDE6aXNvbGF0aW9uKi8gICBcCi0JezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCgyKSwgMH0sLyogZGlzYWJsZSBTVyBMUFMgMHgwNFsxMF09IDAqLwlcCi0JezB4MDAwNiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfUE9MTElORywgQklUKDEpLCBCSVQoMSl9LC8qIHdhaXQgdGlsbCAweDA0WzE3XSA9IDEgICAgcG93ZXIgcmVhZHkqLwlcCi0JezB4MDAwNiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCgwKSwgQklUKDApfSwvKiByZWxlYXNlIFdMT04gcmVzZXQgIDB4MDRbMTZdPSAxKi8gXAotCXsweDAwMDUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoNyksIDB9LC8qIGRpc2FibGUgSFdQRE4gMHgwNFsxNV09IDAqLwlcCi0JezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIChCSVQoNCl8QklUKDMpKSwgMH0sLyogZGlzYWJsZSBXTCBzdXNwZW5kKi8JXAotCXsweDAwMDUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoMCksIEJJVCgwKX0sLyogcG9sbGluZyB1bnRpbCByZXR1cm4gMCovCVwKLQl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9QT0xMSU5HLCBCSVQoMCksIDB9LC8qKi8JXAotCXsweDAwNEUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoNyksIDF9LC8qMHg0Q1syM10gPSAweDRFWzddID0gMSwgc3dpdGNoIERQRFRfU0VMX1Agb3V0cHV0IGZyb20gV0wgQkIgKi9cCi0KLSNkZWZpbmUgUlRMODcyM0FfVFJBTlNfQUNUX1RPX0NBUkRFTVUJCQkJCQkJCQkJCQkJXAotCXsweDAwMUYsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCAweEZGLCAwfSwvKjB4MUZbNzowXSA9IDAgdHVybiBvZmYgUkYqLwlcCi0JezB4MDA0RSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCg3KSwgMH0sLyoweDRDWzIzXSA9IDB4NEVbN10gPSAwLCBzd2l0Y2ggRFBEVF9TRUxfUCBvdXRwdXQgZnJvbSByZWdpc3RlciAweDY1WzJdICovXAotCXsweDAwMDUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoMSksIEJJVCgxKX0sIC8qMHgwNFs5XSA9IDEgdHVybiBvZmYgTUFDIGJ5IEhXIHN0YXRlIG1hY2hpbmUqLwlcCi0JezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfUE9MTElORywgQklUKDEpLCAwfSwgLyp3YWl0IHRpbGwgMHgwNFs5XSA9IDAgcG9sbGluZyB1bnRpbCByZXR1cm4gMCB0byBkaXNhYmxlKi8JXAotCXsweDAwMDAsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9VU0JfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoNSksIEJJVCg1KX0sIC8qMHgwMFs1XSA9IDFiJzEgYW5hbG9nIElwcyB0byBkaWdpdGFsICwgMTppc29sYXRpb24qLyAgIFwKLQl7MHgwMDIwLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfVVNCX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDApLCAwfSwgLyoweDIwWzBdID0gMWInMCBkaXNhYmxlIExET0ExMiBNQUNSTyBibG9jayovICAgXAotCi0KLSNkZWZpbmUgUlRMODcyM0FfVFJBTlNfQ0FSREVNVV9UT19TVVMJCQkJCQkJCQkJCQkJXAotCXsweDAwMDUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9VU0JfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoMyl8QklUKDQpLCBCSVQoMyl9LCAvKjB4MDRbMTI6MTFdID0gMmInMDEgZW5hYmxlIFdMIHN1c3BlbmQqLwotCi0jZGVmaW5lIFJUTDg3MjNBX1RSQU5TX1NVU19UT19DQVJERU1VCQkJCQkJCQkJCQkJCVwKLQl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDMpIHwgQklUKDcpLCAwfSwgLypjbGVhciBzdXNwZW5kIGVuYWJsZSBhbmQgcG93ZXIgZG93biBlbmFibGUqLwlcCi0JezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCgzKXxCSVQoNCksIDB9LCAvKjB4MDRbMTI6MTFdID0gMmInMDFlbmFibGUgV0wgc3VzcGVuZCovCi0KLSNkZWZpbmUgUlRMODcyM0FfVFJBTlNfQ0FSREVNVV9UT19DQVJERElTCQkJCQkJCQkJCQkJCVwKLQl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfVVNCX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDMpfEJJVCg0KSwgQklUKDMpfSwgLyoweDA0WzEyOjExXSA9IDJiJzAxIGVuYWJsZSBXTCBzdXNwZW5kKi8JXAotCXsweDAwNEEsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9VU0JfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoMCksIEJJVCgwKX0sIC8qMHg0OFsxNl0gPSAxIHRvIGVuYWJsZSBHUElPOSBhcyBFWFQgV0FLRVVQKi8KLQotI2RlZmluZSBSVEw4NzIzQV9UUkFOU19DQVJERElTX1RPX0NBUkRFTVUJCQkJCQkJCQkJCQkJXAotCXsweDAwMDUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoMykgfCBCSVQoNyksIDB9LCAvKmNsZWFyIHN1c3BlbmQgZW5hYmxlIGFuZCBwb3dlciBkb3duIGVuYWJsZSovCVwKLQl7MHgwMDRBLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfVVNCX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDApLCAwfSwgLyoweDQ4WzE2XSA9IDAgdG8gZGlzYWJsZSBHUElPOSBhcyBFWFQgV0FLRVVQKi8gICBcCi0JezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCgzKXxCSVQoNCksIDB9LCAvKjB4MDRbMTI6MTFdID0gMmInMDFlbmFibGUgV0wgc3VzcGVuZCovCi0KLSNkZWZpbmUgUlRMODcyM0FfVFJBTlNfQ0FSREVNVV9UT19QRE4JCQkJCQkJCQkJCQlcCi0JezB4MDAwNywgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1VTQl9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIDB4RkYsIDB4MjB9LCAvKjB4MDdbNzowXSA9IDB4MjAgU09QIG9wdGlvbiB0byBkaXNhYmxlIEJHL01CL0FDSy9TV1IqLyAgIFwKLQl7MHgwMDA2LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDApLCAwfSwvKiAweDA0WzE2XSA9IDAqL1wKLQl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDcpLCBCSVQoNyl9LC8qIDB4MDRbMTVdID0gMSovCi0KLSNkZWZpbmUgUlRMODcyM0FfVFJBTlNfUEROX1RPX0NBUkRFTVUJCQkJCQkJCQkJCQlcCi0JezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCg3KSwgMH0sLyogMHgwNFsxNV0gPSAwKi8KLQotI2RlZmluZSBSVEw4NzIzQV9UUkFOU19BQ1RfVE9fTFBTCQkJCQkJCQkJCQkJCQlcCi0JezB4MDUyMiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIDB4RkYsIDB4RkZ9LC8qVHggUGF1c2UqLwlcCi0JezB4MDVGOCwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfUE9MTElORywgMHhGRiwgMH0sLypTaG91bGQgYmUgemVybyBpZiBubyBwYWNrZXQgaXMgdHJhbnNtaXR0aW5nKi8JXAotCXsweDA1RjksIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1BPTExJTkcsIDB4RkYsIDB9LC8qU2hvdWxkIGJlIHplcm8gaWYgbm8gcGFja2V0IGlzIHRyYW5zbWl0dGluZyovCVwKLQl7MHgwNUZBLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9QT0xMSU5HLCAweEZGLCAwfSwvKlNob3VsZCBiZSB6ZXJvIGlmIG5vIHBhY2tldCBpcyB0cmFuc21pdHRpbmcqLwlcCi0JezB4MDVGQiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfUE9MTElORywgMHhGRiwgMH0sLypTaG91bGQgYmUgemVybyBpZiBubyBwYWNrZXQgaXMgdHJhbnNtaXR0aW5nKi8JXAotCXsweDAwMDIsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoMCksIDB9LC8qQ0NLIGFuZCBPRkRNIGFyZSBkaXNhYmxlZCwgYW5kIGNsb2NrIGFyZSBnYXRlZCovCVwKLQl7MHgwMDAyLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9ERUxBWSwgMCwgUFdSU0VRX0RFTEFZX1VTfSwvKkRlbGF5IDF1cyovCVwKLQl7MHgwMDAyLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDEpLCAwfSwvKldob2xlIEJCIGlzIHJlc2V0Ki8JXAotCXsweDAxMDAsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCAweEZGLCAweDAzfSwvKlJlc2V0IE1BQyBUUlgqLwlcCi0JezB4MDEwMSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCgxKSwgMH0sLypjaGVjayBpZiByZW1vdmVkIGxhdGVyKi8JXAotCXsweDA1NTMsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoNSksIEJJVCg1KX0sLypSZXNwb25kIFR4T0sgdG8gc2NoZWR1bGVyKi8KLQotI2RlZmluZSBSVEw4NzIzQV9UUkFOU19MUFNfVE9fQUNUCQkJCQkJCQkJCQkJCQkJXAotCXsweEZFNTgsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9VU0JfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCAweEZGLCAweDg0fSwgLypVU0IgUlBXTSovXAotCXsweDAwMDIsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX0RFTEFZLCAwLCBQV1JTRVFfREVMQVlfTVN9LCAvKkRlbGF5Ki9cCi0JezB4MDAwOCwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCg0KSwgMH0sIC8qLgkweDA4WzRdID0gMAkJIHN3aXRjaCBUU0YgdG8gNDBNKi9cCi0JezB4MDEwOSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfUE9MTElORywgQklUKDcpLCAwfSwgLypQb2xsaW5nIDB4MTA5WzddPSAwICBUU0YgaW4gNDBNKi9cCi0JezB4MDAyOSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCg2KXxCSVQoNyksIDB9LCAvKi4JMHgyOVs3OjZdID0gMmInMDAJIGVuYWJsZSBCQiBjbG9jayovXAotCXsweDAxMDEsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoMSksIEJJVCgxKX0sIC8qLgkweDEwMVsxXSA9IDEqL1wKLQl7MHgwMTAwLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgMHhGRiwgMHhGRn0sIC8qLgkweDEwMFs3OjBdID0gMHhGRgkgZW5hYmxlIFdNQUMgVFJYKi9cCi0JezB4MDAwMiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCgxKXxCSVQoMCksIEJJVCgxKXxCSVQoMCl9LCAvKi4JMHgwMlsxOjBdID0gMmInMTEJIGVuYWJsZSBCQiBtYWNybyovXAotCXsweDA1MjIsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCAweEZGLCAwfSwgLyouCTB4NTIyID0gMCovCi0KLSNkZWZpbmUgUlRMODcyM0FfVFJBTlNfRU5ECQkJCQkJCQkJCQkJCQkJXAotCXsweEZGRkYsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCAwLCBQV1JfQ01EX0VORCwgMCwgMH0sCi0KLQotZXh0ZXJuIHN0cnVjdCB3bGFuX3B3cl9jZmcgcnRsODcyM0FVX3Bvd2VyX29uX2Zsb3dbUlRMODcyM0FfVFJBTlNfQ0FSREVNVV9UT19BQ1RfU1RFUFMrUlRMODcyM0FfVFJBTlNfRU5EX1NURVBTXTsKLWV4dGVybiBzdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg3MjNBVV9yYWRpb19vZmZfZmxvd1tSVEw4NzIzQV9UUkFOU19BQ1RfVE9fQ0FSREVNVV9TVEVQUytSVEw4NzIzQV9UUkFOU19FTkRfU1RFUFNdOwotZXh0ZXJuIHN0cnVjdCB3bGFuX3B3cl9jZmcgcnRsODcyM0FVX2NhcmRfZGlzYWJsZV9mbG93W1JUTDg3MjNBX1RSQU5TX0FDVF9UT19DQVJERU1VX1NURVBTK1JUTDg3MjNBX1RSQU5TX0NBUkRFTVVfVE9fUEROX1NURVBTK1JUTDg3MjNBX1RSQU5TX0VORF9TVEVQU107Ci1leHRlcm4gc3RydWN0IHdsYW5fcHdyX2NmZyBydGw4NzIzQVVfY2FyZF9lbmFibGVfZmxvd1tSVEw4NzIzQV9UUkFOU19BQ1RfVE9fQ0FSREVNVV9TVEVQUytSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX1BETl9TVEVQUytSVEw4NzIzQV9UUkFOU19FTkRfU1RFUFNdOwotZXh0ZXJuIHN0cnVjdCB3bGFuX3B3cl9jZmcgcnRsODcyM0FVX3N1c3BlbmRfZmxvd1tSVEw4NzIzQV9UUkFOU19BQ1RfVE9fQ0FSREVNVV9TVEVQUytSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX1NVU19TVEVQUytSVEw4NzIzQV9UUkFOU19FTkRfU1RFUFNdOwotZXh0ZXJuIHN0cnVjdCB3bGFuX3B3cl9jZmcgcnRsODcyM0FVX3Jlc3VtZV9mbG93W1JUTDg3MjNBX1RSQU5TX0FDVF9UT19DQVJERU1VX1NURVBTK1JUTDg3MjNBX1RSQU5TX0NBUkRFTVVfVE9fU1VTX1NURVBTK1JUTDg3MjNBX1RSQU5TX0VORF9TVEVQU107Ci1leHRlcm4gc3RydWN0IHdsYW5fcHdyX2NmZyBydGw4NzIzQVVfaHdwZG5fZmxvd1tSVEw4NzIzQV9UUkFOU19BQ1RfVE9fQ0FSREVNVV9TVEVQUytSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX1BETl9TVEVQUytSVEw4NzIzQV9UUkFOU19FTkRfU1RFUFNdOwotZXh0ZXJuIHN0cnVjdCB3bGFuX3B3cl9jZmcgcnRsODcyM0FVX2VudGVyX2xwc19mbG93W1JUTDg3MjNBX1RSQU5TX0FDVF9UT19MUFNfU1RFUFMrUlRMODcyM0FfVFJBTlNfRU5EX1NURVBTXTsKLWV4dGVybiBzdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg3MjNBVV9sZWF2ZV9scHNfZmxvd1tSVEw4NzIzQV9UUkFOU19MUFNfVE9fQUNUX1NURVBTK1JUTDg3MjNBX1RSQU5TX0VORF9TVEVQU107Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbDg3MjNVSFdJbWdfQ0UuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWw4NzIzVUhXSW1nX0NFLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MzRiM2EuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbDg3MjNVSFdJbWdfQ0UuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSNpZm5kZWYgX19JTkNfSEFMODcyM1VfRldfSU1HX0gKLSNkZWZpbmUgX19JTkNfSEFMODcyM1VfRldfSU1HX0gKLQotLypDcmVhdGVkIG9uICAyMDEzLzAxLzE0LCAxNTo1MSovCi0KLS8qIEZXIHYxNiBlbmFibGUgdXNiIGludGVycnVwdCAqLwotI2RlZmluZSBSdGw4NzIzVUltZ0FycmF5TGVuZ3RoIDIyMTcyCi1leHRlcm4gdTggUnRsODcyM1VGd0ltZ0FycmF5W1J0bDg3MjNVSW1nQXJyYXlMZW5ndGhdOwotI2RlZmluZSBSdGw4NzIzVUJUSW1nQXJyYXlMZW5ndGggMQotZXh0ZXJuIHU4IFJ0bDg3MjNVRndCVEltZ0FycmF5W1J0bDg3MjNVQlRJbWdBcnJheUxlbmd0aF07Ci0KLSNkZWZpbmUgUnRsODcyM1VVTUNCQ3V0SW1nQXJyYXlXaXRoQlRMZW5ndGggMjQxMTgKLSNkZWZpbmUgUnRsODcyM1VVTUNCQ3V0SW1nQXJyYXlXaXRob3V0QlRMZW5ndGggMTkyMDAKLQotZXh0ZXJuIHU4IFJ0bDg3MjNVRndVTUNCQ3V0SW1nQXJyYXlXaXRoQlRbUnRsODcyM1VVTUNCQ3V0SW1nQXJyYXlXaXRoQlRMZW5ndGhdOwotZXh0ZXJuIHU4IFJ0bDg3MjNVRndVTUNCQ3V0SW1nQXJyYXlXaXRob3V0QlRbUnRsODcyM1VVTUNCQ3V0SW1nQXJyYXlXaXRob3V0QlRMZW5ndGhdOwotCi0jZGVmaW5lIFJ0bDg3MjNTVU1DQkN1dE1QSW1nQXJyYXlMZW5ndGggMjQxNzQKLWV4dGVybiBjb25zdCB1OCBSdGw4NzIzU0Z3VU1DQkN1dE1QSW1nQXJyYXlbUnRsODcyM1NVTUNCQ3V0TVBJbWdBcnJheUxlbmd0aF07Ci0KLSNkZWZpbmUgUnRsODcyM0VCVEltZ0FycmF5TGVuZ3RoIDE1Mjc2Ci1leHRlcm4gdTggUnRsODcyM0VGd0JUSW1nQXJyYXlbUnRsODcyM0VCVEltZ0FycmF5TGVuZ3RoXTsKLQotI2RlZmluZSBSdGw4NzIzVVBIWV9SRUdfQXJyYXlfUEdMZW5ndGggMzM2Ci1leHRlcm4gdTMyIFJ0bDg3MjNVUEhZX1JFR19BcnJheV9QR1tSdGw4NzIzVVBIWV9SRUdfQXJyYXlfUEdMZW5ndGhdOwotI2RlZmluZSBSdGw4NzIzVU1BQ1BIWV9BcnJheV9QR0xlbmd0aCAxCi1leHRlcm4gdTMyIFJ0bDg3MjNVTUFDUEhZX0FycmF5X1BHW1J0bDg3MjNVTUFDUEhZX0FycmF5X1BHTGVuZ3RoXTsKLQotI2VuZGlmIC8qIGlmbmRlZiBfX0lOQ19IQUw4NzIzVV9GV19JTUdfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbERNT3V0U3JjODcyM0EuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWxETU91dFNyYzg3MjNBLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NjUxZjcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbERNT3V0U3JjODcyM0EuaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYJX19SVEw4NzIzQV9PRE1fSF9fCi0jZGVmaW5lIF9fUlRMODcyM0FfT0RNX0hfXwotLyogICovCi0KLSNkZWZpbmUJUlNTSV9DQ0sJMAotI2RlZmluZQlSU1NJX09GRE0JMQotI2RlZmluZQlSU1NJX0RFRkFVTFQJMgotCi0jZGVmaW5lIElRS19NQUNfUkVHX05VTQkJNAotI2RlZmluZSBJUUtfQUREQV9SRUdfTlVNCQkxNgotI2RlZmluZSBJUUtfQkJfUkVHX05VTQkJCTkKLSNkZWZpbmUgSFBfVEhFUk1BTF9OVU0JCTgKLQotCi0vKiAgKi8KLS8qICBzdHJ1Y3R1cmUgYW5kIGRlZmluZSAqLwotLyogICovCi0KLQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0IGdsb2JhbCB2YXJpYWJsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnQgZ2xvYmFsIHZhcmlhYmxlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydCBNYXJjbyBEZWZpbml0aW9uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIGRlZmluZSBETV9NdWx0aVNUQV9Jbml0R2FpbkNoYW5nZU5vdGlmeShFdmVudCkge0RNX0RpZ1RhYmxlLkN1ck11bHRpU1RBQ29ubmVjdFN0YXRlID0gRXZlbnQ7fSAqLwotCi0KLS8qICAqLwotLyogIGZ1bmN0aW9uIHByb3RvdHlwZSAqLwotLyogICovCi0KLS8qICAqLwotLyogIElRIGNhbGlicmF0ZSAqLwotLyogICovCi12b2lkIHJ0bDg3MjNhX3BoeV9pcV9jYWxpYnJhdGUoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgYm9vbCBiUmVDb3ZlcnkpOwotCi0vKiAgKi8KLS8qICBMQyBjYWxpYnJhdGUgKi8KLS8qICAqLwotdm9pZCBydGw4NzIzYV9waHlfbGNfY2FsaWJyYXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIpOwotCi0vKiAgKi8KLS8qICBBUCBjYWxpYnJhdGUgKi8KLS8qICAqLwotdm9pZCBydGw4NzIzYV9waHlfYXBfY2FsaWJyYXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIGNoYXIgZGVsdGEpOwotCi12b2lkIHJ0bDg3MjNhX29kbV9jaGVja190eF9wb3dlcl90cmFja2luZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWxIV0ltZzg3MjNBX0JCLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsSFdJbWc4NzIzQV9CQi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjc2MDk0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWxIV0ltZzg3MjNBX0JCLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0qIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSogbW9yZSBkZXRhaWxzLgotKgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fSU5DX0JCXzg3MjNBX0hXX0lNR19ICi0jZGVmaW5lIF9fSU5DX0JCXzg3MjNBX0hXX0lNR19ICi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogICAgICAgICAgICAgICAgICAgICAgICAgICBBR0NfVEFCXzFULlRYVAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIE9ETV9SZWFkQW5kQ29uZmlnX0FHQ19UQUJfMVRfODcyM0Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFBIWV9SRUdfMVQuVFhUCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgT0RNX1JlYWRBbmRDb25maWdfUEhZX1JFR18xVF84NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhZX1JFR19NUC5UWFQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBPRE1fUmVhZEFuZENvbmZpZ19QSFlfUkVHX01QXzg3MjNBKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci0KLSNlbmRpZiAvKiAgZW5kIG9mIEhXSU1HX1NVUFBPUlQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWxIV0ltZzg3MjNBX0ZXLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsSFdJbWc4NzIzQV9GVy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWUzNjNiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWxIV0ltZzg3MjNBX0ZXLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0qIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSogbW9yZSBkZXRhaWxzLgotKgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fSU5DX0ZXXzg3MjNBX0hXX0lNR19ICi0jZGVmaW5lIF9fSU5DX0ZXXzg3MjNBX0hXX0lNR19ICi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0bDg3MjNmd19CLlRYVAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIE9ETV9SZWFkRmlybXdhcmVfODcyM0FfcnRsODcyM2Z3X0Ioc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLAotCQkJCQl1OCAqcEZpcm13YXJlLCB1MzIgKnBGaXJtd2FyZVNpemUpOwotCi0jZW5kaWYgLyogIGVuZCBvZiBIV0lNR19TVVBQT1JUICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsSFdJbWc4NzIzQV9NQUMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWxIV0ltZzg3MjNBX01BQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDFiZTFmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWxIV0ltZzg3MjNBX01BQy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0qIG1vcmUgZGV0YWlscy4KLSoKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0lOQ19NQUNfODcyM0FfSFdfSU1HX0gKLSNkZWZpbmUgX19JTkNfTUFDXzg3MjNBX0hXX0lNR19ICi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogICAgICAgICAgICAgICAgICAgICAgICAgICBNQUNfUkVHLlRYVAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIE9ETV9SZWFkQW5kQ29uZmlnX01BQ19SRUdfODcyM0Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotI2VuZGlmIC8qICBlbmQgb2YgSFdJTUdfU1VQUE9SVCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbEhXSW1nODcyM0FfUkYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWxIV0ltZzg3MjNBX1JGLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YWYxYzMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbEhXSW1nODcyM0FfUkYuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0qIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0qIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0qIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotKiBtb3JlIGRldGFpbHMuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19JTkNfUkZfODcyM0FfSFdfSU1HX0gKLSNkZWZpbmUgX19JTkNfUkZfODcyM0FfSFdfSU1HX0gKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhZGlvQV8xVC5UWFQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBPRE1fUmVhZEFuZENvbmZpZ19SYWRpb0FfMVRfODcyM0Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotI2VuZGlmIC8qICBlbmQgb2YgSFdJTUdfU1VQUE9SVCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbFB3clNlcUNtZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbFB3clNlcUNtZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmUwM2EzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWxQd3JTZXFDbWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fSEFMUFdSU0VRQ01EX0hfXwotI2RlZmluZSBfX0hBTFBXUlNFUUNNRF9IX18KLQotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIFBXUl9DTURfUkVBRAkJCTB4MDAKLSAgICAgLyogIG9mZnNldDogdGhlIHJlYWQgcmVnaXN0ZXIgb2Zmc2V0ICovCi0gICAgIC8qICBtc2s6IHRoZSBtYXNrIG9mIHRoZSByZWFkIHZhbHVlICovCi0gICAgIC8qICB2YWx1ZTogTi9BLCBsZWZ0IGJ5IDAgKi8KLSAgICAgLyogIG5vdGU6IGRpcnZlciBzaGFsbCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiBieSByZWFkICYgbXNrICovCi0KLSNkZWZpbmUgUFdSX0NNRF9XUklURQkJCTB4MDEKLSAgICAgLyogIG9mZnNldDogdGhlIHJlYWQgcmVnaXN0ZXIgb2Zmc2V0ICovCi0gICAgIC8qICBtc2s6IHRoZSBtYXNrIG9mIHRoZSB3cml0ZSBiaXRzICovCi0gICAgIC8qICB2YWx1ZTogd3JpdGUgdmFsdWUgKi8KLSAgICAgLyogIG5vdGU6IGRyaXZlciBzaGFsbCBpbXBsZW1lbnQgdGhpcyBjbWQgYnkgcmVhZCAmIG1zayBhZnRlciB3cml0ZSAqLwotCi0jZGVmaW5lIFBXUl9DTURfUE9MTElORwkJCTB4MDIKLSAgICAgLyogIG9mZnNldDogdGhlIHJlYWQgcmVnaXN0ZXIgb2Zmc2V0ICovCi0gICAgIC8qICBtc2s6IHRoZSBtYXNrIG9mIHRoZSBwb2xsZWQgdmFsdWUgKi8KLSAgICAgLyogIHZhbHVlOiB0aGUgdmFsdWUgdG8gYmUgcG9sbGVkLCBtYXNrZWQgYnkgdGhlIG1zZCBmaWVsZC4gKi8KLSAgICAgLyogIG5vdGU6IGRyaXZlciBzaGFsbCBpbXBsZW1lbnQgdGhpcyBjbWQgYnkgKi8KLSAgICAgLyogIGRveyAqLwotICAgICAvKiAgaWYoIChSZWFkKG9mZnNldCkgJiBtc2spID09ICh2YWx1ZSAmIG1zaykgKSAqLwotICAgICAvKiAgYnJlYWs7ICovCi0gICAgIC8qICB9IHdoaWxlKG5vdCB0aW1lb3V0KTsgKi8KLQotI2RlZmluZSBQV1JfQ01EX0RFTEFZCQkJMHgwMwotICAgICAvKiAgb2Zmc2V0OiB0aGUgdmFsdWUgdG8gZGVsYXkgKi8KLSAgICAgLyogIG1zazogTi9BICovCi0gICAgIC8qICB2YWx1ZTogdGhlIHVuaXQgb2YgZGVsYXksIDA6IHVzLCAxOiBtcyAqLwotCi0jZGVmaW5lIFBXUl9DTURfRU5ECQkJCTB4MDQKLSAgICAgLyogIG9mZnNldDogTi9BICovCi0gICAgIC8qICBtc2s6IE4vQSAqLwotICAgICAvKiAgdmFsdWU6IE4vQSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiAzIFRoZSB2YWx1ZSBvZiBiYXNlOiA0IGJpdHMgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgIC8qICBkZWZpbmUgdGhlIGJhc2UgYWRkcmVzcyBvZiBlYWNoIGJsb2NrICovCi0jZGVmaW5lIFBXUl9CQVNFQUREUl9NQUMJCTB4MDAKLSNkZWZpbmUgUFdSX0JBU0VBRERSX1VTQgkJMHgwMQotI2RlZmluZSBQV1JfQkFTRUFERFJfUENJRQkJMHgwMgotI2RlZmluZSBQV1JfQkFTRUFERFJfU0RJTwkJMHgwMwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiAzIFRoZSB2YWx1ZSBvZiBpbnRlcmZhY2VfbXNrOiA0IGJpdHMgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJUFdSX0lOVEZfU0RJT19NU0sJCUJJVCgwKQotI2RlZmluZQlQV1JfSU5URl9VU0JfTVNLCQlCSVQoMSkKLSNkZWZpbmUJUFdSX0lOVEZfUENJX01TSwkJQklUKDIpCi0jZGVmaW5lCVBXUl9JTlRGX0FMTF9NU0sJCShCSVQoMCl8QklUKDEpfEJJVCgyKXxCSVQoMykpCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIDMgVGhlIHZhbHVlIG9mIGZhYl9tc2s6IDQgYml0cyAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQlQV1JfRkFCX1RTTUNfTVNLCQlCSVQoMCkKLSNkZWZpbmUJUFdSX0ZBQl9VTUNfTVNLCQkJQklUKDEpCi0jZGVmaW5lCVBXUl9GQUJfQUxMX01TSwkJCShCSVQoMCl8QklUKDEpfEJJVCgyKXxCSVQoMykpCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIDMgVGhlIHZhbHVlIG9mIGN1dF9tc2s6IDggYml0cyAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQlQV1JfQ1VUX1RFU1RDSElQX01TSwlCSVQoMCkKLSNkZWZpbmUJUFdSX0NVVF9BX01TSwkJCUJJVCgxKQotI2RlZmluZQlQV1JfQ1VUX0JfTVNLCQkJQklUKDIpCi0jZGVmaW5lCVBXUl9DVVRfQ19NU0sJCQlCSVQoMykKLSNkZWZpbmUJUFdSX0NVVF9EX01TSwkJCUJJVCg0KQotI2RlZmluZQlQV1JfQ1VUX0VfTVNLCQkJQklUKDUpCi0jZGVmaW5lCVBXUl9DVVRfRl9NU0sJCQlCSVQoNikKLSNkZWZpbmUJUFdSX0NVVF9HX01TSwkJCUJJVCg3KQotI2RlZmluZQlQV1JfQ1VUX0FMTF9NU0sJCQkweEZGCi0KLQotZW51bSBwd3JzZXFfZGVsYXlfdW5pdCB7Ci0JUFdSU0VRX0RFTEFZX1VTLAotCVBXUlNFUV9ERUxBWV9NUywKLX07Ci0KLXN0cnVjdCB3bGFuX3B3cl9jZmcgewotCXUxNiBvZmZzZXQ7Ci0JdTggY3V0X21zazsKLQl1OCBmYWJfbXNrOjQ7Ci0JdTggaW50ZXJmYWNlX21zazo0OwotCXU4IGJhc2U6NDsKLQl1OCBjbWQ6NDsKLQl1OCBtc2s7Ci0JdTggdmFsdWU7Ci19OwotCi0KLSNkZWZpbmUgR0VUX1BXUl9DRkdfT0ZGU0VUKF9fUFdSX0NNRCkJCV9fUFdSX0NNRC5vZmZzZXQKLSNkZWZpbmUgR0VUX1BXUl9DRkdfQ1VUX01BU0soX19QV1JfQ01EKQkJX19QV1JfQ01ELmN1dF9tc2sKLSNkZWZpbmUgR0VUX1BXUl9DRkdfRkFCX01BU0soX19QV1JfQ01EKQkJX19QV1JfQ01ELmZhYl9tc2sKLSNkZWZpbmUgR0VUX1BXUl9DRkdfSU5URl9NQVNLKF9fUFdSX0NNRCkJX19QV1JfQ01ELmludGVyZmFjZV9tc2sKLSNkZWZpbmUgR0VUX1BXUl9DRkdfQkFTRShfX1BXUl9DTUQpCQkJX19QV1JfQ01ELmJhc2UKLSNkZWZpbmUgR0VUX1BXUl9DRkdfQ01EKF9fUFdSX0NNRCkJCQlfX1BXUl9DTUQuY21kCi0jZGVmaW5lIEdFVF9QV1JfQ0ZHX01BU0soX19QV1JfQ01EKQkJCV9fUFdSX0NNRC5tc2sKLSNkZWZpbmUgR0VUX1BXUl9DRkdfVkFMVUUoX19QV1JfQ01EKQkJX19QV1JfQ01ELnZhbHVlCi0KLQotLyogICovCi0vKglQcm90b3R5cGUgb2YgcHJvdGVjdGVkIGZ1bmN0aW9uLiAqLwotLyogICovCi11OCBIYWxQd3JTZXFDbWRQYXJzaW5nMjNhKAotCXN0cnVjdCBydHdfYWRhcHRlcgkJKnBhZGFwdGVyLAotCXU4CQkJCUN1dFZlcnNpb24sCi0JdTgJCQkJRmFiVmVyc2lvbiwKLQl1OAkJCQlJbnRlcmZhY2VUeXBlLAotCXN0cnVjdCB3bGFuX3B3cl9jZmcJUHdyQ2ZnQ21kW10pOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWxWZXJEZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWxWZXJEZWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEwZTRlYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsVmVyRGVmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fSEFMX1ZFUlNJT05fREVGX0hfXwotI2RlZmluZSBfX0hBTF9WRVJTSU9OX0RFRl9IX18KLQotZW51bSBoYWxfaWNfdHlwZSB7Ci0JQ0hJUF84MTkyUwkJPQkwLAotCUNISVBfODE4OEMJPQkxLAotCUNISVBfODE5MkMJPQkyLAotCUNISVBfODE5MkQJPQkzLAotCUNISVBfODcyM0EJPQk0LAotCUNISVBfODE4OEUJPQk1LAotCUNISVBfODg4MUEJPQk2LAotCUNISVBfODgxMkEJPQk3LAotCUNISVBfODgyMUEJPQk4LAotCUNISVBfODcyM0IJPQk5LAotCUNISVBfODE5MkUJCT0JMTAsCi19OwotCi1lbnVtIGhhbF9jaGlwX3R5cGUgewotCVRFU1RfQ0hJUAkJPQkwLAotCU5PUk1BTF9DSElQCQk9CTEsCi0JRlBHQQkJCT0JMiwKLX07Ci0KLWVudW0gaGFsX2N1dF92ZXJzaW9uIHsKLQlBX0NVVF9WRVJTSU9OCQk9CTAsCi0JQl9DVVRfVkVSU0lPTgkJPQkxLAotCUNfQ1VUX1ZFUlNJT04JCT0JMiwKLQlEX0NVVF9WRVJTSU9OCQk9CTMsCi0JRV9DVVRfVkVSU0lPTgkJPQk0LAotCUZfQ1VUX1ZFUlNJT04JCT0JNSwKLQlHX0NVVF9WRVJTSU9OCQk9CTYsCi19OwotCi0vKiAgSEFMX01hbnVmYWN0dXJlciAqLwotZW51bSBoYWxfdmVuZG9yIHsKLQlDSElQX1ZFTkRPUl9UU01DCT0JMCwKLQlDSElQX1ZFTkRPUl9VTUMJCT0JMSwKLX07Ci0KLXN0cnVjdCBoYWxfdmVyc2lvbiB7Ci0JZW51bSBoYWxfaWNfdHlwZQlJQ1R5cGU7Ci0JZW51bSBoYWxfY2hpcF90eXBlCUNoaXBUeXBlOwotCWVudW0gaGFsX2N1dF92ZXJzaW9uCUNVVFZlcnNpb247Ci0JZW51bSBoYWxfdmVuZG9yCQlWZW5kb3JUeXBlOwotCXU4CQkJUk9NVmVyOwotfTsKLQotLyogIEdldCBlbGVtZW50ICovCi0jZGVmaW5lIEdFVF9DVklEX0lDX1RZUEUodmVyc2lvbikJKCh2ZXJzaW9uKS5JQ1R5cGUpCi0jZGVmaW5lIEdFVF9DVklEX0NISVBfVFlQRSh2ZXJzaW9uKQkoKHZlcnNpb24pLkNoaXBUeXBlKQotI2RlZmluZSBHRVRfQ1ZJRF9NQU5VRkFDVFVFUih2ZXJzaW9uKQkoKHZlcnNpb24pLlZlbmRvclR5cGUpCi0jZGVmaW5lIEdFVF9DVklEX0NVVF9WRVJTSU9OKHZlcnNpb24pCSgodmVyc2lvbikuQ1VUVmVyc2lvbikKLSNkZWZpbmUgR0VUX0NWSURfUk9NX1ZFUlNJT04odmVyc2lvbikJKCgodmVyc2lvbikuUk9NVmVyKSAmIFJPTV9WRVJTSU9OX01BU0spCi0KLS8qIENvbW1vbiBNYWNyby4gLS0gKi8KLQotI2RlZmluZSBJU184MVhYQyh2ZXJzaW9uKQkJCVwKLQkoKChHRVRfQ1ZJRF9JQ19UWVBFKHZlcnNpb24pID09IENISVBfODE5MkMpIHx8CVwKLQkgKEdFVF9DVklEX0lDX1RZUEUodmVyc2lvbikgPT0gQ0hJUF84MTg4QykpID8gdHJ1ZSA6IGZhbHNlKQotI2RlZmluZSBJU184NzIzX1NFUklFUyh2ZXJzaW9uKQkJCVwKLQkoKEdFVF9DVklEX0lDX1RZUEUodmVyc2lvbikgPT0gQ0hJUF84NzIzQSkgPyB0cnVlIDogZmFsc2UpCi0KLSNkZWZpbmUgSVNfVEVTVF9DSElQKHZlcnNpb24pCQkJXAotCSgoR0VUX0NWSURfQ0hJUF9UWVBFKHZlcnNpb24pID09IFRFU1RfQ0hJUCkgPyB0cnVlIDogZmFsc2UpCi0jZGVmaW5lIElTX05PUk1BTF9DSElQKHZlcnNpb24pCQkJXAotCSgoR0VUX0NWSURfQ0hJUF9UWVBFKHZlcnNpb24pID09IE5PUk1BTF9DSElQKSA/IHRydWUgOiBmYWxzZSkKLQotI2RlZmluZSBJU19BX0NVVCh2ZXJzaW9uKQkJCVwKLQkoKEdFVF9DVklEX0NVVF9WRVJTSU9OKHZlcnNpb24pID09IEFfQ1VUX1ZFUlNJT04pID8gdHJ1ZSA6IGZhbHNlKQotI2RlZmluZSBJU19CX0NVVCh2ZXJzaW9uKQkJCVwKLQkoKEdFVF9DVklEX0NVVF9WRVJTSU9OKHZlcnNpb24pID09IEJfQ1VUX1ZFUlNJT04pID8gdHJ1ZSA6IGZhbHNlKQotI2RlZmluZSBJU19DX0NVVCh2ZXJzaW9uKQkJCVwKLQkoKEdFVF9DVklEX0NVVF9WRVJTSU9OKHZlcnNpb24pID09IENfQ1VUX1ZFUlNJT04pID8gdHJ1ZSA6IGZhbHNlKQotI2RlZmluZSBJU19EX0NVVCh2ZXJzaW9uKQkJCVwKLQkoKEdFVF9DVklEX0NVVF9WRVJTSU9OKHZlcnNpb24pID09IERfQ1VUX1ZFUlNJT04pID8gdHJ1ZSA6IGZhbHNlKQotI2RlZmluZSBJU19FX0NVVCh2ZXJzaW9uKQkJCVwKLQkoKEdFVF9DVklEX0NVVF9WRVJTSU9OKHZlcnNpb24pID09IEVfQ1VUX1ZFUlNJT04pID8gdHJ1ZSA6IGZhbHNlKQotCi0jZGVmaW5lIElTX0NISVBfVkVORE9SX1RTTUModmVyc2lvbikJCVwKLQkoKEdFVF9DVklEX01BTlVGQUNUVUVSKHZlcnNpb24pID09IENISVBfVkVORE9SX1RTTUMpID8gdHJ1ZSA6IGZhbHNlKQotI2RlZmluZSBJU19DSElQX1ZFTkRPUl9VTUModmVyc2lvbikJCVwKLQkoKEdFVF9DVklEX01BTlVGQUNUVUVSKHZlcnNpb24pID09IENISVBfVkVORE9SX1VNQykgPyB0cnVlIDogZmFsc2UpCi0KLS8qIENoaXAgdmVyc2lvbiBNYWNyby4gLS0gKi8KLQotI2RlZmluZSBJU184MXh4Q19WRU5ET1JfVU1DX0FfQ1VUKHZlcnNpb24pCQkJXAotCShJU184MVhYQyh2ZXJzaW9uKT8oSVNfQ0hJUF9WRU5ET1JfVU1DKHZlcnNpb24pID8JXAotCShJU19BX0NVVCh2ZXJzaW9uKSA/IHRydWUgOiBmYWxzZSkgOiBmYWxzZSkgOiBmYWxzZSkKLSNkZWZpbmUgSVNfODF4eENfVkVORE9SX1VNQ19CX0NVVCh2ZXJzaW9uKQkJCVwKLQkoSVNfODFYWEModmVyc2lvbikgPyAoSVNfQ0hJUF9WRU5ET1JfVU1DKHZlcnNpb24pID8JXAotCSAoSVNfQl9DVVQodmVyc2lvbikgPyB0cnVlIDogZmFsc2UpIDogZmFsc2UpOiBmYWxzZSkKLSNkZWZpbmUgSVNfODF4eENfVkVORE9SX1VNQ19DX0NVVCh2ZXJzaW9uKQkJCVwKLQkoSVNfODFYWEModmVyc2lvbik/KElTX0NISVBfVkVORE9SX1VNQyh2ZXJzaW9uKSA/CVwKLQkoSVNfQ19DVVQodmVyc2lvbikgPyB0cnVlIDogZmFsc2UpIDogZmFsc2UpIDogZmFsc2UpCi0jZGVmaW5lIElTXzg3MjNBX0FfQ1VUKHZlcnNpb24pCQkJCVwKLQkoKElTXzg3MjNfU0VSSUVTKHZlcnNpb24pKSA/IChJU19BX0NVVCh2ZXJzaW9uKSA/IHRydWUgOiBmYWxzZSkgOiBmYWxzZSkKLSNkZWZpbmUgSVNfODcyM0FfQl9DVVQodmVyc2lvbikJCQkJCVwKLQkoKElTXzg3MjNfU0VSSUVTKHZlcnNpb24pKSA/IChJU19CX0NVVCh2ZXJzaW9uKSA/IHRydWUgOiBmYWxzZSkgOiBmYWxzZSkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvZHJ2X3R5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvZHJ2X3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MzQ2M2EuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL2Rydl90eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JRm9yIHR5cGUgZGVmaW5lcyBhbmQgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5lcwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLSNpZm5kZWYgX19EUlZfVFlQRVNfSF9fCi0jZGVmaW5lIF9fRFJWX1RZUEVTX0hfXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPHdsYW5fYnNzZGVmLmg+Ci0KLQotZW51bSBfTklDX1ZFUlNJT04gewotCVJUTDg3MTFfTklDLAotCVJUTDg3MTJfTklDLAotCVJUTDg3MTNfTklDLAotCVJUTDg3MTZfTklDCi0KLX07Ci0KLQotI2luY2x1ZGUgPHJ0d19odC5oPgotCi0jaW5jbHVkZSA8cnR3X2NtZC5oPgotI2luY2x1ZGUgPHJ0d194bWl0Lmg+Ci0jaW5jbHVkZSA8cnR3X3JlY3YuaD4KLSNpbmNsdWRlIDxoYWxfaW50Zi5oPgotI2luY2x1ZGUgPGhhbF9jb20uaD4KLSNpbmNsdWRlIDxydHdfc2VjdXJpdHkuaD4KLSNpbmNsdWRlIDxydHdfcHdyY3RybC5oPgotI2luY2x1ZGUgPHJ0d19pby5oPgotI2luY2x1ZGUgPHJ0d19lZXByb20uaD4KLSNpbmNsdWRlIDxzdGFfaW5mby5oPgotI2luY2x1ZGUgPHJ0d19tbG1lLmg+Ci0jaW5jbHVkZSA8cnR3X2RlYnVnLmg+Ci0jaW5jbHVkZSA8cnR3X3JmLmg+Ci0jaW5jbHVkZSA8cnR3X2V2ZW50Lmg+Ci0jaW5jbHVkZSA8cnR3X21sbWVfZXh0Lmg+Ci0jaW5jbHVkZSA8cnR3X2FwLmg+Ci0KLSNpbmNsdWRlICJpb2N0bF9jZmc4MDIxMS5oIgotCi1zdHJ1Y3QgcmVnaXN0cnlfcHJpdiB7Ci0JdTgJY2hpcF92ZXJzaW9uOwotCXU4CXJmaW50ZnM7Ci0Jc3RydWN0CWNmZzgwMjExX3NzaWQgc3NpZDsKLQl1OAljaGFubmVsOy8qIGFkLWhvYyBzdXBwb3J0IHJlcXVpcmVtZW50ICovCi0JdTgJd2lyZWxlc3NfbW9kZTsvKiBBLCBCLCBHLCBhdXRvICovCi0JdTgJc2Nhbl9tb2RlOy8qIGFjdGl2ZSwgcGFzc2l2ZSAqLwotCXU4CXByZWFtYmxlOy8qIGxvbmcsIHNob3J0LCBhdXRvICovCi0JdTgJdnJ0bF9jYXJyaWVyX3NlbnNlOy8qIEVuYWJsZSwgRGlzYWJsZSwgQXV0byAqLwotCXU4CXZjc190eXBlOy8qIFJUUy9DVFMsIENUUy10by1zZWxmICovCi0JdTE2CXJ0c190aHJlc2g7Ci0JdTE2ICBmcmFnX3RocmVzaDsKLQl1OAlhZGhvY190eF9wd3I7Ci0JdTgJc29mdF9hcDsKLQl1OAlwb3dlcl9tZ250OwotCXU4CWlwc19tb2RlOwotCXU4CXNtYXJ0X3BzOwotCXU4CWxvbmdfcmV0cnlfbG10OwotCXU4CXNob3J0X3JldHJ5X2xtdDsKLQl1MTYJYnVzeV90aHJlc2g7Ci0JdTgJYWNrX3BvbGljeTsKLQl1OAlzb2Z0d2FyZV9lbmNyeXB0OwotCXU4CXNvZnR3YXJlX2RlY3J5cHQ7Ci0JdTgJYWNtX21ldGhvZDsKLQkgIC8qIFVBUFNEICovCi0JdTgJd21tX2VuYWJsZTsKLQl1OAl1YXBzZF9lbmFibGU7Ci0KLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAgICBkZXZfbmV0d29yazsKLQotCXU4CWh0X2VuYWJsZTsKLQl1OAljYnc0MF9lbmFibGU7Ci0JdTgJYW1wZHVfZW5hYmxlOy8qIGZvciB0eCAqLwotCXU4CXJ4X3N0YmM7Ci0JdTgJYW1wZHVfYW1zZHU7LyogQS1NUERVIFN1cHBvcnRzIEEtTVNEVSBpcyBwZXJtaXR0ZWQgKi8KLQl1OAlsb3dyYXRlX3R3b194bWl0OwotCi0JdTgJcmZfY29uZmlnOwotCXU4CWxvd19wb3dlcjsKLQotCXU4CXdpZmlfc3BlYzsvKiAgIXR1cmJvX21vZGUgKi8KLQotCXU4CWNoYW5uZWxfcGxhbjsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0JUX0NPRVhJU1QKLQl1OAlidGNvZXg7Ci0JdTgJYnRfaXNvOwotCXU4CWJ0X3NjbzsKLQl1OAlidF9hbXBkdTsKLSNlbmRpZgotCWJvb2wJYkFjY2VwdEFkZGJhUmVxOwotCi0JdTgJYW50ZGl2X2NmZzsKLQl1OAlhbnRkaXZfdHlwZTsKLQotCXU4CWh3cGRuX21vZGU7LyogMDpkaXNhYmxlLDE6ZW5hYmxlLDI6ZGVjaWRlIGJ5IEVGVVNFIGNvbmZpZyAqLwotCXU4CWh3cHdycF9kZXRlY3Q7LyogMDpkaXNhYmxlLDE6ZW5hYmxlICovCi0KLQl1OAlod193cHNfcGJjOy8qIDA6ZGlzYWJsZSwxOmVuYWJsZSAqLwotCi0JdTgJbWF4X3JvYW1pbmdfdGltZXM7IC8qIG1heCBudW1iZXIgZHJpdmVyIHdpbGwgdHJ5IHRvIHJvYW1pbmcgKi8KLQotCXU4IGVuYWJsZTgwMjExZDsKLQotCXU4IGlmbmFtZVsxNl07Ci0JdTggaWYybmFtZVsxNl07Ci0KLQl1OCBub3RjaF9maWx0ZXI7Ci0KLQl1OCByZWd1bGF0b3J5X3RpZDsKLX07Ci0KLQotI2RlZmluZSBNQVhfQ09OVElOVUFMX1VSQl9FUlIgNAotCi0jZGVmaW5lIEdFVF9QUklNQVJZX0FEQVBURVIocGFkYXB0ZXIpCQkJCQlcCi0JKCgoc3RydWN0IHJ0d19hZGFwdGVyICopcGFkYXB0ZXIpLT5kdm9iai0+aWYxKQotCi1lbnVtIF9JRkFDRV9JRCB7Ci0JSUZBQ0VfSUQwLCAvKiBtYXBpbmcgdG8gUFJJTUFSWV9BREFQVEVSICovCi0JSUZBQ0VfSUQxLCAvKiBtYXBpbmcgdG8gU0VDT05EQVJZX0FEQVBURVIgKi8KLQlJRkFDRV9JRDIsCi0JSUZBQ0VfSUQzLAotCUlGQUNFX0lEX01BWCwKLX07Ci0KLXN0cnVjdCBkdm9ial9wcml2IHsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmlmMTsgLyogUFJJTUFSWV9BREFQVEVSICovCi0Jc3RydWN0IHJ0d19hZGFwdGVyICppZjI7IC8qIFNFQ09OREFSWV9BREFQVEVSICovCi0KLQkvKiBmb3IgbG9jYWwvZ2xvYmFsIHN5bmNocm9uaXphdGlvbiAqLwotCXN0cnVjdCBtdXRleCBod19pbml0X211dGV4OwotCXN0cnVjdCBtdXRleCBoMmNfZndjbWRfbXV0ZXg7Ci0Jc3RydWN0IG11dGV4IHNldGNoX211dGV4OwotCXN0cnVjdCBtdXRleCBzZXRid19tdXRleDsKLQotCXVuc2lnbmVkIGNoYXIJb3Blcl9jaGFubmVsOyAvKiBzYXZlZCBjaGFuIGluZm8gd2hlbiBzZXQgY2hhbiBidyAqLwotCXVuc2lnbmVkIGNoYXIJb3Blcl9id21vZGU7Ci0JdW5zaWduZWQgY2hhcglvcGVyX2NoX29mZnNldDsvKiBQUklNRV9DSE5MX09GRlNFVCAqLwotCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcnNbSUZBQ0VfSURfTUFYXTsKLQl1OCBpZmFjZV9udW1zOyAvKiAgdG90YWwgbnVtYmVyIG9mIGlmYWNlcyB1c2VkIHJ1bnRpbWUgKi8KLQotCS8qIEZvciA5MkQsIERNRFAgaGF2ZSAyIGludGVyZmFjZS4gKi8KLQl1OAlJbnRlcmZhY2VOdW1iZXI7Ci0JdTgJTnVtSW50ZXJmYWNlczsKLQotCS8qIEluIC9PdXQgUGlwZSBpbmZvcm1hdGlvbiAqLwotCWludAlSdEluUGlwZVsyXTsKLQlpbnQJUnRPdXRQaXBlWzNdOwotCXU4CVF1ZXVlMlBpcGVbSFdfUVVFVUVfRU5UUlldOy8qIGZvciBvdXQgcGlwZSBtYXBwaW5nICovCi0KLS8qLS0tLS0tLS0gYmVsb3cgaXMgZm9yIFVTQiBJTlRFUkZBQ0UgLS0tLS0tLS0qLwotCi0JdTgJbnJfZW5kcG9pbnQ7Ci0JdTgJaXNoaWdoc3BlZWQ7Ci0JdTgJUnROdW1JblBpcGVzOwotCXU4CVJ0TnVtT3V0UGlwZXM7Ci0JaW50CWVwX251bVs1XTsgLyogZW5kcG9pbnQgbnVtYmVyICovCi0KLQlzdHJ1Y3QgbXV0ZXggdXNiX3ZlbmRvcl9yZXFfbXV0ZXg7Ci0KLQl1bmlvbiB7Ci0JCV9fbGUzMiB2YWwzMjsKLQkJX19sZTE2IHZhbDE2OwotCQl1OCB2YWw4OwotCX0gdXNiX2J1ZjsKLQotCXN0cnVjdCB1c2JfaW50ZXJmYWNlICpwdXNiaW50ZjsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqcHVzYmRldjsKLQlhdG9taWNfdCBjb250aW51YWxfdXJiX2Vycm9yOwotCi0vKi0tLS0tLS0tIGJlbG93IGlzIGZvciBQQ0lFIElOVEVSRkFDRSAtLS0tLS0tLSovCi0KLX07Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGRldmljZSAqZHZvYmpfdG9fZGV2KHN0cnVjdCBkdm9ial9wcml2ICpkdm9iaikKLXsKLQkvKiB0b2RvOiBnZXQgaW50ZXJmYWNlIHR5cGUgZnJvbSBkdm9iaiBhbmQgdGhlIHJldHVybiB0aGUgZGV2IGFjY29yZGluZ2x5ICovCi0JcmV0dXJuICZkdm9iai0+cHVzYmludGYtPmRldjsKLX0KLQotZW51bSBfSUZBQ0VfVFlQRSB7Ci0JSUZBQ0VfUE9SVDAsIC8qIG1hcHBpbmcgdG8gcG9ydDAgZm9yIEMvRCBzZXJpZXMgY2hpcHMgKi8KLQlJRkFDRV9QT1JUMSwgLyogbWFwcGluZyB0byBwb3J0MSBmb3IgQy9EIHNlcmllcyBjaGlwICovCi0JTUFYX0lGQUNFX1BPUlQsCi19OwotCi1lbnVtIF9BREFQVEVSX1RZUEUgewotCVBSSU1BUllfQURBUFRFUiwKLQlTRUNPTkRBUllfQURBUFRFUiwKLQlNQVhfQURBUFRFUiwKLX07Ci0KLXN0cnVjdCBydHdfYWRhcHRlciB7Ci0JaW50CXBpZFszXTsvKiBwcm9jZXNzIGlkIGZyb20gVUksIDA6d3BzLCAxOmhvc3RhcGQsIDI6ZGhjcGNkICovCi0JaW50CWJEb25nbGU7LyogYnVpbGQtaW4gbW9kdWxlIG9yIGV4dGVybmFsIGRvbmdsZSAqLwotCXUxNgljaGlwX3R5cGU7Ci0JdTE2CUhhcmR3YXJlVHlwZTsKLQotCXN0cnVjdCBkdm9ial9wcml2ICpkdm9iajsKLQlzdHJ1Y3QJbWxtZV9wcml2IG1sbWVwcml2OwotCXN0cnVjdAltbG1lX2V4dF9wcml2IG1sbWVleHRwcml2OwotCXN0cnVjdAljbWRfcHJpdgljbWRwcml2OwotCXN0cnVjdAlldnRfcHJpdglldnRwcml2OwotCXN0cnVjdAl4bWl0X3ByaXYJeG1pdHByaXY7Ci0Jc3RydWN0CXJlY3ZfcHJpdglyZWN2cHJpdjsKLQlzdHJ1Y3QJc3RhX3ByaXYJc3RhcHJpdjsKLQlzdHJ1Y3QJc2VjdXJpdHlfcHJpdglzZWN1cml0eXByaXY7Ci0Jc3RydWN0CXJlZ2lzdHJ5X3ByaXYJcmVnaXN0cnlwcml2OwotCXN0cnVjdAlwd3JjdHJsX3ByaXYJcHdyY3RybHByaXY7Ci0Jc3RydWN0CWVlcHJvbV9wcml2IGVlcHJvbXByaXY7Ci0KLQl1MzIJc2V0YmFuZDsKLQotCXZvaWQgKkhhbERhdGE7Ci0KLQlzMzIJYkRyaXZlclN0b3BwZWQ7Ci0JczMyCWJTdXJwcmlzZVJlbW92ZWQ7Ci0JczMyICBiQ2FyZERpc2FibGVXT0hTTTsKLQotCXUzMglJc3JDb250ZW50OwotCXUzMglJbXJDb250ZW50OwotCi0JdTgJRWVwcm9tQWRkcmVzc1NpemU7Ci0JdTgJaHdfaW5pdF9jb21wbGV0ZWQ7Ci0JdTgJYkRyaXZlcklzR29pbmdUb1VubG9hZDsKLQl1OAlpbml0X2FkcHRfaW5fcHJvZ3Jlc3M7Ci0JdTgJYkhhbHRJblByb2dyZXNzOwotCi0Jc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXY7Ci0KLQkvKiAgdXNlZCBieSBydHdfcmVyZWdfbmRfbmFtZSByZWxhdGVkIGZ1bmN0aW9uICovCi0JaW50IGJ1cDsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKLQotCXN0cnVjdCB3aXJlbGVzc19kZXYgKnJ0d193ZGV2OwotCWludCBuZXRfY2xvc2VkOwotCi0JdTggYkZXUmVhZHk7Ci0JdTggYlJlYWRQb3J0Q2FuY2VsOwotCXU4IGJXcml0ZVBvcnRDYW5jZWw7Ci0KLQkvKiBleHRlbmQgdG8gc3VwcG9ydCBtdWx0aSBpbnRlcmZhY2UgKi8KLQkvKiBJRkFDRV9JRDAgaXMgZXF1YWxzIHRvIFBSSU1BUllfQURBUFRFUiAqLwotCS8qIElGQUNFX0lEMSBpcyBlcXVhbHMgdG8gU0VDT05EQVJZX0FEQVBURVIgKi8KLQl1OCBpZmFjZV9pZDsKLX07Ci0KLSNkZWZpbmUgYWRhcHRlcl90b19kdm9iaihhZGFwdGVyKSAoYWRhcHRlci0+ZHZvYmopCi0KLXN0YXRpYyBpbmxpbmUgdTggKm15aWQoc3RydWN0IGVlcHJvbV9wcml2ICpwZWVwcml2KQotewotCXJldHVybiBwZWVwcml2LT5tYWNfYWRkcjsKLX0KLQotI2VuZGlmIC8qIF9fRFJWX1RZUEVTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL2hhbF9jb20uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9oYWxfY29tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNTAzMjAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL2hhbF9jb20uaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19IQUxfQ09NTU9OX0hfXwotI2RlZmluZSBfX0hBTF9DT01NT05fSF9fCi0KLS8qICAqLwotLyogICAgICAgIFJhdGUgRGVmaW5pdGlvbiAqLwotLyogICovCi0vKiBDQ0sgKi8KLSNkZWZpbmUJUkFUUl8xTQkJCQkJMHgwMDAwMDAwMQotI2RlZmluZQlSQVRSXzJNCQkJCQkweDAwMDAwMDAyCi0jZGVmaW5lCVJBVFJfNTVNCQkJCTB4MDAwMDAwMDQKLSNkZWZpbmUJUkFUUl8xMU0JCQkJMHgwMDAwMDAwOAotLyogT0ZETSAqLwotI2RlZmluZQlSQVRSXzZNCQkJCQkweDAwMDAwMDEwCi0jZGVmaW5lCVJBVFJfOU0JCQkJCTB4MDAwMDAwMjAKLSNkZWZpbmUJUkFUUl8xMk0JCQkJMHgwMDAwMDA0MAotI2RlZmluZQlSQVRSXzE4TQkJCQkweDAwMDAwMDgwCi0jZGVmaW5lCVJBVFJfMjRNCQkJCTB4MDAwMDAxMDAKLSNkZWZpbmUJUkFUUl8zNk0JCQkJMHgwMDAwMDIwMAotI2RlZmluZQlSQVRSXzQ4TQkJCQkweDAwMDAwNDAwCi0jZGVmaW5lCVJBVFJfNTRNCQkJCTB4MDAwMDA4MDAKLS8qIE1DUyAxIFNwYXRpYWwgU3RyZWFtICovCi0jZGVmaW5lCVJBVFJfTUNTMAkJCQkweDAwMDAxMDAwCi0jZGVmaW5lCVJBVFJfTUNTMQkJCQkweDAwMDAyMDAwCi0jZGVmaW5lCVJBVFJfTUNTMgkJCQkweDAwMDA0MDAwCi0jZGVmaW5lCVJBVFJfTUNTMwkJCQkweDAwMDA4MDAwCi0jZGVmaW5lCVJBVFJfTUNTNAkJCQkweDAwMDEwMDAwCi0jZGVmaW5lCVJBVFJfTUNTNQkJCQkweDAwMDIwMDAwCi0jZGVmaW5lCVJBVFJfTUNTNgkJCQkweDAwMDQwMDAwCi0jZGVmaW5lCVJBVFJfTUNTNwkJCQkweDAwMDgwMDAwCi0vKiBNQ1MgMiBTcGF0aWFsIFN0cmVhbSAqLwotI2RlZmluZQlSQVRSX01DUzgJCQkJMHgwMDEwMDAwMAotI2RlZmluZQlSQVRSX01DUzkJCQkJMHgwMDIwMDAwMAotI2RlZmluZQlSQVRSX01DUzEwCQkJCTB4MDA0MDAwMDAKLSNkZWZpbmUJUkFUUl9NQ1MxMQkJCQkweDAwODAwMDAwCi0jZGVmaW5lCVJBVFJfTUNTMTIJCQkJMHgwMTAwMDAwMAotI2RlZmluZQlSQVRSX01DUzEzCQkJCTB4MDIwMDAwMDAKLSNkZWZpbmUJUkFUUl9NQ1MxNAkJCQkweDA0MDAwMDAwCi0jZGVmaW5lCVJBVFJfTUNTMTUJCQkJMHgwODAwMDAwMAotCi0vKiBDQ0sgKi8KLSNkZWZpbmUgUkFURV8xTQkJCQkJQklUKDApCi0jZGVmaW5lIFJBVEVfMk0JCQkJCUJJVCgxKQotI2RlZmluZSBSQVRFXzVfNU0JCQkJQklUKDIpCi0jZGVmaW5lIFJBVEVfMTFNCQkJCUJJVCgzKQotLyogT0ZETSAqLwotI2RlZmluZSBSQVRFXzZNCQkJCQlCSVQoNCkKLSNkZWZpbmUgUkFURV85TQkJCQkJQklUKDUpCi0jZGVmaW5lIFJBVEVfMTJNCQkJCUJJVCg2KQotI2RlZmluZSBSQVRFXzE4TQkJCQlCSVQoNykKLSNkZWZpbmUgUkFURV8yNE0JCQkJQklUKDgpCi0jZGVmaW5lIFJBVEVfMzZNCQkJCUJJVCg5KQotI2RlZmluZSBSQVRFXzQ4TQkJCQlCSVQoMTApCi0jZGVmaW5lIFJBVEVfNTRNCQkJCUJJVCgxMSkKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVHggRGVzYyBkZWZpbml0aW9uIE1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBwcmFnbWEgbWFyayAtLSBUeCBEZXNjIHJlbGF0ZWQgZGVmaW5pdGlvbi4gLS0gKi8KLS8qICAqLwotLyogICovCi0vKglSYXRlICovCi0vKiAgKi8KLS8qICBDQ0sgUmF0ZXMsIFR4SFQgPSAwICovCi0jZGVmaW5lIERFU0NfUkFURTFNCQkJCTB4MDAKLSNkZWZpbmUgREVTQ19SQVRFMk0JCQkJMHgwMQotI2RlZmluZSBERVNDX1JBVEU1XzVNCQkJCTB4MDIKLSNkZWZpbmUgREVTQ19SQVRFMTFNCQkJCTB4MDMKLQotLyogIE9GRE0gUmF0ZXMsIFR4SFQgPSAwICovCi0jZGVmaW5lIERFU0NfUkFURTZNCQkJCTB4MDQKLSNkZWZpbmUgREVTQ19SQVRFOU0JCQkJMHgwNQotI2RlZmluZSBERVNDX1JBVEUxMk0JCQkJMHgwNgotI2RlZmluZSBERVNDX1JBVEUxOE0JCQkJMHgwNwotI2RlZmluZSBERVNDX1JBVEUyNE0JCQkJMHgwOAotI2RlZmluZSBERVNDX1JBVEUzNk0JCQkJMHgwOQotI2RlZmluZSBERVNDX1JBVEU0OE0JCQkJMHgwYQotI2RlZmluZSBERVNDX1JBVEU1NE0JCQkJMHgwYgotCi0vKiAgTUNTIFJhdGVzLCBUeEhUID0gMSAqLwotI2RlZmluZSBERVNDX1JBVEVNQ1MwCQkJCTB4MGMKLSNkZWZpbmUgREVTQ19SQVRFTUNTMQkJCQkweDBkCi0jZGVmaW5lIERFU0NfUkFURU1DUzIJCQkJMHgwZQotI2RlZmluZSBERVNDX1JBVEVNQ1MzCQkJCTB4MGYKLSNkZWZpbmUgREVTQ19SQVRFTUNTNAkJCQkweDEwCi0jZGVmaW5lIERFU0NfUkFURU1DUzUJCQkJMHgxMQotI2RlZmluZSBERVNDX1JBVEVNQ1M2CQkJCTB4MTIKLSNkZWZpbmUgREVTQ19SQVRFTUNTNwkJCQkweDEzCi0jZGVmaW5lIERFU0NfUkFURU1DUzgJCQkJMHgxNAotI2RlZmluZSBERVNDX1JBVEVNQ1M5CQkJCTB4MTUKLSNkZWZpbmUgREVTQ19SQVRFTUNTMTAJCQkJMHgxNgotI2RlZmluZSBERVNDX1JBVEVNQ1MxMQkJCQkweDE3Ci0jZGVmaW5lIERFU0NfUkFURU1DUzEyCQkJCTB4MTgKLSNkZWZpbmUgREVTQ19SQVRFTUNTMTMJCQkJMHgxOQotI2RlZmluZSBERVNDX1JBVEVNQ1MxNAkJCQkweDFhCi0jZGVmaW5lIERFU0NfUkFURU1DUzE1CQkJCTB4MWIKLSNkZWZpbmUgREVTQ19SQVRFTUNTMTVfU0cJCQkweDFjCi0jZGVmaW5lIERFU0NfUkFURU1DUzMyCQkJCTB4MjAKLQotI2RlZmluZSBSRUdfUDJQX0NUV0lOCQkJCQkweDA1NzIgLyogIDEgQnl0ZSBsb25nIChpbiB1bml0IG9mIFRVKSAqLwotI2RlZmluZSBSRUdfTk9BX0RFU0NfU0VMCQkJCTB4MDVDRgotI2RlZmluZSBSRUdfTk9BX0RFU0NfRFVSQVRJT04JCTB4MDVFMAotI2RlZmluZSBSRUdfTk9BX0RFU0NfSU5URVJWQUwJCQkweDA1RTQKLSNkZWZpbmUgUkVHX05PQV9ERVNDX1NUQVJUCQkJMHgwNUU4Ci0jZGVmaW5lIFJFR19OT0FfREVTQ19DT1VOVAkJCTB4MDVFQwotCi0jaW5jbHVkZSAiSGFsVmVyRGVmLmgiCi0KLQotdTgJLyogcmV0dXJuIHRoZSBmaW5hbCBjaGFubmVsIHBsYW4gZGVjaXNpb24gKi8KLWhhbF9jb21fZ2V0X2NoYW5uZWxfcGxhbjIzYSgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIJKnBhZGFwdGVyLAotCXU4CQkJaHdfY2hhbm5lbF9wbGFuLAkvKiBjaGFubmVsIHBsYW4gZnJvbSBIVyAoZWZ1c2UvZWVwcm9tKSAqLwotCXU4CQkJc3dfY2hhbm5lbF9wbGFuLAkvKiBjaGFubmVsIHBsYW4gZnJvbSBTVyAocmVnaXN0cnkvbW9kdWxlIHBhcmFtKSAqLwotCXU4CQkJZGVmX2NoYW5uZWxfcGxhbiwJLyogY2hhbm5lbCBwbGFuIHVzZWQgd2hlbiB0aGUgZm9ybWVyIHR3byBpcyBpbnZhbGlkICovCi0JYm9vbAkJQXV0b0xvYWRGYWlsCi0JKTsKLQotdTgJTVJhdGVUb0h3UmF0ZTIzYSh1OCByYXRlKTsKLQotdm9pZCBIYWxTZXRCcmF0ZUNmZzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqbUJyYXRlc09TKTsKLQotYm9vbAotSGFsX01hcHBpbmdPdXRQaXBlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHU4IE51bU91dFBpcGUpOwotCi12b2lkIGMyaF9ldnRfY2xlYXIyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKTsKLXMzMiBjMmhfZXZ0X3JlYWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCB1OCAqYnVmKTsKLQotdm9pZCBydGw4NzIzYV9zZXRfYW1wZHVfbWluX3NwYWNlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IE1pblNwYWNpbmdUb1NldCk7Ci12b2lkIHJ0bDg3MjNhX3NldF9hbXBkdV9mYWN0b3Ioc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggRmFjdG9yVG9TZXQpOwotdm9pZCBydGw4NzIzYV9zZXRfYWNtX2N0cmwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggY3RybCk7Ci12b2lkIHJ0bDg3MjNhX3NldF9tZWRpYV9zdGF0dXMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggc3RhdHVzKTsKLXZvaWQgcnRsODcyM2Ffc2V0X21lZGlhX3N0YXR1czEoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggc3RhdHVzKTsKLXZvaWQgcnRsODcyM2Ffc2V0X2Jjbl9mdW5jKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHZhbCk7Ci12b2lkIHJ0bDg3MjNhX2NoZWNrX2Jzc2lkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHZhbCk7Ci12b2lkIHJ0bDg3MjNhX21sbWVfc2l0ZXN1cnZleShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBmbGFnKTsKLXZvaWQgcnRsODcyM2Ffb25fcmNyX2FtKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYV9vZmZfcmNyX2FtKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYV9zZXRfc2xvdF90aW1lKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHNsb3R0aW1lKTsKLXZvaWQgcnRsODcyM2FfYWNrX3ByZWFtYmxlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJTaG9ydFByZWFtYmxlKTsKLXZvaWQgcnRsODcyM2Ffc2V0X3NlY19jZmcoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggc2VjKTsKLXZvaWQgcnRsODcyM2FfY2FtX2VtcHR5X2VudHJ5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHVjSW5kZXgpOwotdm9pZCBydGw4NzIzYV9jYW1faW52YWxpZGF0ZV9hbGwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX2NhbV93cml0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJdTggZW50cnksIHUxNiBjdHJsLCBjb25zdCB1OCAqbWFjLCBjb25zdCB1OCAqa2V5KTsKLXZvaWQgcnRsODcyM2FfZmlmb19jbGVhbnVwKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYV9zZXRfYXBmbV9vbl9tYWMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggdmFsKTsKLXZvaWQgcnRsODcyM2FfYmNuX3ZhbGlkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotYm9vbCBydGw4NzIzYV9nZXRfYmNuX3ZhbGlkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYV9zZXRfYmVhY29uX2ludGVydmFsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiBpbnRlcnZhbCk7Ci12b2lkIHJ0bDg3MjNhX3NldF9yZXNwX3NpZnMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICB1OCByMnQxLCB1OCByMnQyLCB1OCB0MnQxLCB1OCB0MnQyKTsKLXZvaWQgcnRsODcyM2Ffc2V0X2FjX3BhcmFtX3ZvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiB2byk7Ci12b2lkIHJ0bDg3MjNhX3NldF9hY19wYXJhbV92aShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgdmkpOwotdm9pZCBydGw4NzIzYV9zZXRfYWNfcGFyYW1fYmUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIGJlKTsKLXZvaWQgcnRsODcyM2Ffc2V0X2FjX3BhcmFtX2JrKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiBiayk7Ci12b2lkIHJ0bDg3MjNhX3NldF9yeGRtYV9hZ2dfcGdfdGgoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggdmFsKTsKLXZvaWQgcnRsODcyM2Ffc2V0X2luaXRpYWxfZ2FpbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgcnhfZ2Fpbik7Ci0KLXZvaWQgcnRsODcyM2Ffb2RtX3N1cHBvcnRfYWJpbGl0eV93cml0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgdmFsKTsKLXZvaWQgcnRsODcyM2Ffb2RtX3N1cHBvcnRfYWJpbGl0eV9iYWNrdXAoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX29kbV9zdXBwb3J0X2FiaWxpdHlfcmVzdG9yZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnRsODcyM2Ffb2RtX3N1cHBvcnRfYWJpbGl0eV9zZXQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIHZhbCk7Ci12b2lkIHJ0bDg3MjNhX29kbV9zdXBwb3J0X2FiaWxpdHlfY2xyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiB2YWwpOwotCi12b2lkIHJ0bDg3MjNhX3NldF9ycHdtKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHZhbCk7Ci11OCBydGw4NzIzYV9nZXRfcmZfdHlwZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLWJvb2wgcnRsODcyM2FfZ2V0X2Z3bHBzX3JmX29uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotYm9vbCBydGw4NzIzYV9jaGtfaGlfcXVldWVfZW1wdHkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLSNlbmRpZiAvKiBfX0hBTF9DT01NT05fSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvaGFsX2ludGYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9oYWxfaW50Zi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTI0ZDQ3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9oYWxfaW50Zi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX0hBTF9JTlRGX0hfXwotI2RlZmluZSBfX0hBTF9JTlRGX0hfXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotCi1lbnVtIF9DSElQX1RZUEUgewotCU5VTExfQ0hJUF9UWVBFLAotCVJUTDg3MTJfODE4OFNfODE5MVNfODE5MlMsCi0JUlRMODE4OENfODE5MkMsCi0JUlRMODE5MkQsCi0JUlRMODcyM0EsCi0JUlRMODE4OEUsCi0JTUFYX0NISVBfVFlQRQotfTsKLQotZW51bSBoYWxfZGVmX3ZhcmlhYmxlIHsKLQlIQUxfREVGX1VOREVSQ09SQVRFRFNNT09USEVEUFdEQiwKLQlIQUxfREVGX0lTX1NVUFBPUlRfQU5UX0RJViwKLQlIQUxfREVGX0NVUlJFTlRfQU5URU5OQSwKLQlIQUxfREVGX0RSVklORk9fU1osCi0JSEFMX0RFRl9NQVhfUkVDVkJVRl9TWiwKLQlIQUxfREVGX1JYX1BBQ0tFVF9PRkZTRVQsCi0JSEFMX0RFRl9EQkdfRFVNUF9SWFBLVCwvKiBmb3IgZGJnICovCi0JSEFMX0RFRl9EQkdfRE1fRlVOQywvKiBmb3IgZGJnICovCi0JSEFMX0RFRl9SQV9ERUNJU0lPTl9SQVRFLAotCUhBTF9ERUZfUkFfU0dJLAotCUhBTF9ERUZfUFRfUFdSX1NUQVRVUywKLQlIV19WQVJfTUFYX1JYX0FNUERVX0ZBQ1RPUiwKLQlIV19ERUZfUkFfSU5GT19EVU1QLAotCUhBTF9ERUZfREJHX0RVTVBfVFhQS1QsCi0JSFdfREVGX0ZBX0NOVF9EVU1QLAotCUhXX0RFRl9PRE1fREJHX0ZMQUcsCi19OwotCi1lbnVtIGhhbF9vZG1fdmFyaWFibGUgewotCUhBTF9PRE1fU1RBX0lORk8sCi0JSEFMX09ETV9QMlBfU1RBVEUsCi0JSEFMX09ETV9XSUZJX0RJU1BMQVlfU1RBVEUsCi19OwotCi1lbnVtIHJ0X2VlcHJvbV90eXBlIHsKLQlFRVBST01fOTNDNDYsCi0JRUVQUk9NXzkzQzU2LAotCUVFUFJPTV9CT09UX0VGVVNFLAotfTsKLQotCi0KLSNkZWZpbmUgUkZfQ0hBTkdFX0JZX0lOSVQJMAotI2RlZmluZSBSRl9DSEFOR0VfQllfSVBTCUJJVCgyOCkKLSNkZWZpbmUgUkZfQ0hBTkdFX0JZX1BTCQlCSVQoMjkpCi0jZGVmaW5lIFJGX0NIQU5HRV9CWV9IVwkJQklUKDMwKQotI2RlZmluZSBSRl9DSEFOR0VfQllfU1cJCUJJVCgzMSkKLQotZW51bSBoYXJkd2FyZV90eXBlIHsKLQlIQVJEV0FSRV9UWVBFX1JUTDgxODAsCi0JSEFSRFdBUkVfVFlQRV9SVEw4MTg1LAotCUhBUkRXQVJFX1RZUEVfUlRMODE4NywKLQlIQVJEV0FSRV9UWVBFX1JUTDgxODgsCi0JSEFSRFdBUkVfVFlQRV9SVEw4MTkwUCwKLQlIQVJEV0FSRV9UWVBFX1JUTDgxOTJFLAotCUhBUkRXQVJFX1RZUEVfUlRMODE5eFUsCi0JSEFSRFdBUkVfVFlQRV9SVEw4MTkyU0UsCi0JSEFSRFdBUkVfVFlQRV9SVEw4MTkyU1UsCi0JSEFSRFdBUkVfVFlQRV9SVEw4MTkyQ0UsCi0JSEFSRFdBUkVfVFlQRV9SVEw4MTkyQ1UsCi0JSEFSRFdBUkVfVFlQRV9SVEw4MTkyREUsCi0JSEFSRFdBUkVfVFlQRV9SVEw4MTkyRFUsCi0JSEFSRFdBUkVfVFlQRV9SVEw4NzIzQUUsCi0JSEFSRFdBUkVfVFlQRV9SVEw4NzIzQVUsCi0JSEFSRFdBUkVfVFlQRV9SVEw4NzIzQVMsCi0JSEFSRFdBUkVfVFlQRV9SVEw4MTg4RUUsCi0JSEFSRFdBUkVfVFlQRV9SVEw4MTg4RVUsCi0JSEFSRFdBUkVfVFlQRV9SVEw4MTg4RVMsCi0JSEFSRFdBUkVfVFlQRV9NQVgsCi19OwotCi0jZGVmaW5lIEdFVF9FRVBST01fRUZVU0VfUFJJVihhZGFwdGVyKSAoJmFkYXB0ZXItPmVlcHJvbXByaXYpCi0KLXZvaWQgcnR3X2hhbF9kZWZfdmFsdWVfaW5pdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLWludCBwbV9uZXRkZXZfb3BlbjIzYShzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldiwgdTggYm5vcm1hbCk7Ci0KLWludCBydGw4NzIzYXVfaGFsX2luaXQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1pbnQgcnRsODcyM2F1X2hhbF9kZWluaXQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0d19oYWxfc3RvcChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotdm9pZCBydHdfaGFsX3VwZGF0ZV9yYV9tYXNrMjNhKHN0cnVjdCBzdGFfaW5mbyAqcHN0YSwgdTggcnNzaV9sZXZlbCk7Ci12b2lkCXJ0d19oYWxfY2xvbmVfZGF0YShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmRzdF9wYWRhcHRlciwgc3RydWN0IHJ0d19hZGFwdGVyICpzcmNfcGFkYXB0ZXIpOwotCi12b2lkIGh3X3Zhcl9zZXRfY29ycmVjdF90c2Yoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIGh3X3Zhcl9zZXRfbWxtZV9kaXNjb25uZWN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBod192YXJfc2V0X29wbW9kZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBtb2RlKTsKLXZvaWQgaHdfdmFyX3NldF9tYWNhZGRyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICp2YWwpOwotdm9pZCBod192YXJfc2V0X2Jzc2lkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICp2YWwpOwotdm9pZCBod192YXJfc2V0X21sbWVfam9pbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB0eXBlKTsKLQotaW50IEdldEhhbERlZlZhcjgxOTJDVXNiKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwKLQkJCSBlbnVtIGhhbF9kZWZfdmFyaWFibGUgZVZhcmlhYmxlLCB2b2lkICpwVmFsdWUpOwotCi0jZW5kaWYgLyogX19IQUxfSU5URl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9pZWVlODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9pZWVlODAyMTEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM0MTAyZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvaWVlZTgwMjExLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fSUVFRTgwMjExX0gKLSNkZWZpbmUgX19JRUVFODAyMTFfSAotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgImxpbnV4L2llZWU4MDIxMS5oIgotI2luY2x1ZGUgIndpZmkuaCIKLQotI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+Ci0KLSNpZiAoV0lSRUxFU1NfRVhUIDwgMjIpCi0jZXJyb3IgIk9ic29sZXRlIHByZSAyMDA3IHdpcmVsZXNzIGV4dGVuc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQiCi0jZW5kaWYKLQotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0KLS8qIFNUQSBmbGFncyAqLwotI2RlZmluZSBXTEFOX1NUQV9BVVRIIEJJVCgwKQotI2RlZmluZSBXTEFOX1NUQV9BU1NPQyBCSVQoMSkKLSNkZWZpbmUgV0xBTl9TVEFfUFMgQklUKDIpCi0jZGVmaW5lIFdMQU5fU1RBX1RJTSBCSVQoMykKLSNkZWZpbmUgV0xBTl9TVEFfUEVSTSBCSVQoNCkKLSNkZWZpbmUgV0xBTl9TVEFfQVVUSE9SSVpFRCBCSVQoNSkKLSNkZWZpbmUgV0xBTl9TVEFfUEVORElOR19QT0xMIEJJVCg2KSAvKiBwZW5kaW5nIGFjdGl2aXR5IHBvbGwgbm90IEFDS2VkICovCi0jZGVmaW5lIFdMQU5fU1RBX1NIT1JUX1BSRUFNQkxFIEJJVCg3KQotI2RlZmluZSBXTEFOX1NUQV9QUkVBVVRIIEJJVCg4KQotI2RlZmluZSBXTEFOX1NUQV9XTUUgQklUKDkpCi0jZGVmaW5lIFdMQU5fU1RBX01GUCBCSVQoMTApCi0jZGVmaW5lIFdMQU5fU1RBX0hUIEJJVCgxMSkKLSNkZWZpbmUgV0xBTl9TVEFfV1BTIEJJVCgxMikKLSNkZWZpbmUgV0xBTl9TVEFfTUFZQkVfV1BTIEJJVCgxMykKLSNkZWZpbmUgV0xBTl9TVEFfTk9ORVJQIEJJVCgzMSkKLQotI2VuZGlmCi0KLSNkZWZpbmUgV1BBX0NJUEhFUl9OT05FCQlCSVQoMCkKLSNkZWZpbmUgV1BBX0NJUEhFUl9XRVA0MAlCSVQoMSkKLSNkZWZpbmUgV1BBX0NJUEhFUl9XRVAxMDQJQklUKDIpCi0jZGVmaW5lIFdQQV9DSVBIRVJfVEtJUAkJQklUKDMpCi0jZGVmaW5lIFdQQV9DSVBIRVJfQ0NNUAkJQklUKDQpCi0KLQotCi0jZGVmaW5lIFdQQV9TRUxFQ1RPUl9MRU4gNAotZXh0ZXJuIHU4IFJUV19XUEFfT1VJMjNBX1RZUEVbXSA7Ci1leHRlcm4gdTE2IFJUV19XUEFfVkVSU0lPTjIzQSA7Ci1leHRlcm4gdTggV1BBX0FVVEhfS0VZX01HTVRfTk9ORTIzQVtdOwotZXh0ZXJuIHU4IFdQQV9BVVRIX0tFWV9NR01UX1VOU1BFQ184MDJfMVgyM0FbXTsKLWV4dGVybiB1OCBXUEFfQVVUSF9LRVlfTUdNVF9QU0tfT1ZFUl84MDJfMVgyM0FbXTsKLWV4dGVybiB1OCBXUEFfQ0lQSEVSX1NVSVRFX05PTkUyM0FbXTsKLWV4dGVybiB1OCBXUEFfQ0lQSEVSX1NVSVRFX1dFUDQwMjNBW107Ci1leHRlcm4gdTggV1BBX0NJUEhFUl9TVUlURV9US0lQMjNBW107Ci1leHRlcm4gdTggV1BBX0NJUEhFUl9TVUlURV9XUkFQMjNBW107Ci1leHRlcm4gdTggV1BBX0NJUEhFUl9TVUlURV9DQ01QMjNBW107Ci1leHRlcm4gdTggV1BBX0NJUEhFUl9TVUlURV9XRVAxMDQyM0FbXTsKLQotCi0jZGVmaW5lIFJTTl9IRUFERVJfTEVOIDQKLSNkZWZpbmUgUlNOX1NFTEVDVE9SX0xFTiA0Ci0KLWV4dGVybiB1OCBSU05fQVVUSF9LRVlfTUdNVF9VTlNQRUNfODAyXzFYMjNBW107Ci1leHRlcm4gdTggUlNOX0FVVEhfS0VZX01HTVRfUFNLX09WRVJfODAyXzFYMjNBW107Ci1leHRlcm4gdTggUlNOX0NJUEhFUl9TVUlURV9OT05FMjNBW107Ci1leHRlcm4gdTggUlNOX0NJUEhFUl9TVUlURV9XRVA0MDIzQVtdOwotZXh0ZXJuIHU4IFJTTl9DSVBIRVJfU1VJVEVfVEtJUDIzQVtdOwotZXh0ZXJuIHU4IFJTTl9DSVBIRVJfU1VJVEVfV1JBUDIzQVtdOwotZXh0ZXJuIHU4IFJTTl9DSVBIRVJfU1VJVEVfQ0NNUDIzQVtdOwotZXh0ZXJuIHU4IFJTTl9DSVBIRVJfU1VJVEVfV0VQMTA0MjNBW107Ci0KLWVudW0gcmF0cl90YWJsZV9tb2RlIHsKLQlSQVRSX0lOWF9XSVJFTEVTU19OR0IgPSAwLAkvKiAgQkdOIDQwIE1oeiAyU1MgMVNTICovCi0JUkFUUl9JTlhfV0lSRUxFU1NfTkcgPSAxLAkvKiAgR04gb3IgTiAqLwotCVJBVFJfSU5YX1dJUkVMRVNTX05CID0gMiwJLyogIEJHTiAyMCBNaHogMlNTIDFTUyAgb3IgQk4gKi8KLQlSQVRSX0lOWF9XSVJFTEVTU19OID0gMywKLQlSQVRSX0lOWF9XSVJFTEVTU19HQiA9IDQsCi0JUkFUUl9JTlhfV0lSRUxFU1NfRyA9IDUsCi0JUkFUUl9JTlhfV0lSRUxFU1NfQiA9IDYsCi0JUkFUUl9JTlhfV0lSRUxFU1NfTUMgPSA3LAotCVJBVFJfSU5YX1dJUkVMRVNTX0FDX04gPSA4LAotfTsKLQotZW51bSBORVRXT1JLX1RZUEUKLXsKLQlXSVJFTEVTU19JTlZBTElEID0gMCwKLQkvKiBTdWItRWxlbWVudCAqLwotCS8qICB0eDogY2NrIG9ubHkgLCByeDogY2NrIG9ubHksIGh3OiBjY2sgKi8KLQlXSVJFTEVTU18xMUIgPSBCSVQoMCksCi0JLyogIHR4OiBvZmRtIG9ubHksIHJ4OiBvZmRtICYgY2NrLCBodzogY2NrICYgb2ZkbSAqLwotCVdJUkVMRVNTXzExRyA9IEJJVCgxKSwKLQkvKiAgdHg6IG9mZG0gb25seSwgcng6IG9mZG0gb25seSwgaHc6IG9mZG0gb25seSAqLwotCVdJUkVMRVNTXzExQSA9IEJJVCgyKSwKLQkvKiAgdHg6IE1DUyBvbmx5LCByeDogTUNTICYgY2NrLCBodzogTUNTICYgY2NrICovCi0JV0lSRUxFU1NfMTFfMjROID0gQklUKDMpLAotCS8qICB0eDogTUNTIG9ubHksIHJ4OiBNQ1MgJiBvZmRtLCBodzogb2ZkbSBvbmx5ICovCi0JV0lSRUxFU1NfMTFfNU4gPSBCSVQoNCksCi0JLyogV0lSRUxFU1NfQVVUTwkJPSBCSVQoNSksICovCi0JV0lSRUxFU1NfQUMgPSBCSVQoNiksCi0KLQkvKiBDb21iaW5hdGlvbiAqLwotCSAvKiAgdHg6IGNjayAmIG9mZG0sIHJ4OiBjY2sgJiBvZmRtICYgTUNTLCBodzogY2NrICYgb2ZkbSAqLwotCVdJUkVMRVNTXzExQkcgPSBXSVJFTEVTU18xMUJ8V0lSRUxFU1NfMTFHLAotCS8qICB0eDogb2ZkbSAmIE1DUywgcng6IG9mZG0gJiBjY2sgJiBNQ1MsIGh3OiBjY2sgJiBvZmRtICovCi0JV0lSRUxFU1NfMTFHXzI0TiA9IFdJUkVMRVNTXzExRyB8IFdJUkVMRVNTXzExXzI0TiwKLQkvKiAgdHg6IG9mZG0gJiBNQ1MsIHJ4OiBvZmRtICYgTUNTLCBodzogb2ZkbSBvbmx5ICovCi0JV0lSRUxFU1NfMTFBXzVOID0gV0lSRUxFU1NfMTFBIHwgV0lSRUxFU1NfMTFfNU4sCi0JLyogIHR4OiBvZmRtICYgY2NrICYgTUNTLCByeDogb2ZkbSAmIGNjayAmIE1DUywgaHc6IG9mZG0gJiBjY2sgKi8KLQlXSVJFTEVTU18xMUJHXzI0TiA9IFdJUkVMRVNTXzExQiB8IFdJUkVMRVNTXzExRyB8IFdJUkVMRVNTXzExXzI0TiwKLQkvKiAgdHg6IG9mZG0gJiBNQ1MsIHJ4OiBvZmRtICYgTUNTLCBodzogb2ZkbSBvbmx5ICovCi0JV0lSRUxFU1NfMTFBR04gPSBXSVJFTEVTU18xMUEgfCBXSVJFTEVTU18xMUcgfCBXSVJFTEVTU18xMV8yNE4gfAotCQkJCVdJUkVMRVNTXzExXzVOLAotCVdJUkVMRVNTXzExQUJHTiA9IFdJUkVMRVNTXzExQSB8IFdJUkVMRVNTXzExQiB8IFdJUkVMRVNTXzExRyB8Ci0JCQkJV0lSRUxFU1NfMTFfMjROIHwgV0lSRUxFU1NfMTFfNU4sCi19OwotCi0jZGVmaW5lIFNVUFBPUlRFRF8yNEdfTkVUVFlQRV9NU0sgKFdJUkVMRVNTXzExQiB8IFdJUkVMRVNTXzExRyB8IFdJUkVMRVNTXzExXzI0TikKLSNkZWZpbmUgU1VQUE9SVEVEXzVHX05FVFRZUEVfTVNLIChXSVJFTEVTU18xMUEgfCBXSVJFTEVTU18xMV81TikKLQotI2RlZmluZSBJc1N1cHBvcnRlZDI0RyhOZXRUeXBlKSAoTmV0VHlwZSAmIFNVUFBPUlRFRF8yNEdfTkVUVFlQRV9NU0sgPyB0cnVlIDogZmFsc2UpCi0jZGVmaW5lIElzU3VwcG9ydGVkNUcoTmV0VHlwZSkgKE5ldFR5cGUgJiBTVVBQT1JURURfNUdfTkVUVFlQRV9NU0sgPyB0cnVlIDogZmFsc2UpCi0KLSNkZWZpbmUgSXNFbmFibGVIV0NDSyhOZXRUeXBlKSBJc1N1cHBvcnRlZDI0RyhOZXRUeXBlKQotI2RlZmluZSBJc0VuYWJsZUhXT0ZETShOZXRUeXBlKSAoTmV0VHlwZSAmIChXSVJFTEVTU18xMUd8V0lSRUxFU1NfMTFfMjROfFNVUFBPUlRFRF81R19ORVRUWVBFX01TSykgPyB0cnVlIDogZmFsc2UpCi0KLSNkZWZpbmUgSXNTdXBwb3J0ZWRSeENDSyhOZXRUeXBlKSBJc0VuYWJsZUhXQ0NLKE5ldFR5cGUpCi0jZGVmaW5lIElzU3VwcG9ydGVkUnhPRkRNKE5ldFR5cGUpIElzRW5hYmxlSFdPRkRNKE5ldFR5cGUpCi0jZGVmaW5lIElzU3VwcG9ydGVkUnhNQ1MoTmV0VHlwZSkgSXNFbmFibGVIV09GRE0oTmV0VHlwZSkKLQotI2RlZmluZSBJc1N1cHBvcnRlZFR4Q0NLKE5ldFR5cGUpIChOZXRUeXBlICYgKFdJUkVMRVNTXzExQikgPyB0cnVlIDogZmFsc2UpCi0jZGVmaW5lIElzU3VwcG9ydGVkVHhPRkRNKE5ldFR5cGUpIChOZXRUeXBlICYgKFdJUkVMRVNTXzExR3xXSVJFTEVTU18xMUEpID8gdHJ1ZSA6IGZhbHNlKQotI2RlZmluZSBJc1N1cHBvcnRlZFR4TUNTKE5ldFR5cGUpIChOZXRUeXBlICYgKFdJUkVMRVNTXzExXzI0TnxXSVJFTEVTU18xMV81TikgPyB0cnVlIDogZmFsc2UpCi0KLQotI2RlZmluZSBNSU5fRlJBR19USFJFU0hPTEQgICAgIDI1NlUKLSNkZWZpbmUJTUFYX0ZSQUdfVEhSRVNIT0xEICAgICAyMzQ2VQotCi0vKiBRb1MsUU9TICovCi0jZGVmaW5lIE5PUk1BTF9BQ0sJCQkwCi0jZGVmaW5lIE5PX0FDSwkJCQkxCi0jZGVmaW5lIE5PTl9FWFBMSUNJVF9BQ0sJCTIKLSNkZWZpbmUgQkxPQ0tfQUNLCQkJMwotCi0vKiBJRUVFIDgwMi4xMSBkZWZpbmVzICovCi0KLSNkZWZpbmUgUDgwMjExX09VSV9MRU4gMwotCi1zdHJ1Y3QgaWVlZTgwMjExX3NuYXBfaGRyIHsKLQl1OCAgICBkc2FwOyAgIC8qIGFsd2F5cyAweEFBICovCi0JdTggICAgc3NhcDsgICAvKiBhbHdheXMgMHhBQSAqLwotCXU4ICAgIGN0cmw7ICAgLyogYWx3YXlzIDB4MDMgKi8KLQl1OCAgICBvdWlbUDgwMjExX09VSV9MRU5dOyAgICAvKiBvcmdhbml6YXRpb25hbCB1bml2ZXJzYWwgaWQgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0KLSNkZWZpbmUgU05BUF9TSVpFIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3NuYXBfaGRyKQotCi0jZGVmaW5lIFdMQU5fUkVBU09OX0pPSU5fV1JPTkdfQ0hBTk5FTCAgICAgICA2NTUzNAotI2RlZmluZSBXTEFOX1JFQVNPTl9FWFBJUkFUSU9OX0NISyA2NTUzNQotCi0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV9MRU4JCQk0Ci0jZGVmaW5lIElFRUU4MDIxMV9OVU1fT0ZETV9SQVRFU0xFTgk4Ci0KLQotI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMU1CCQkgICAgICAgIDB4MDIKLSNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzJNQgkJICAgICAgICAweDA0Ci0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV81TUIJCSAgICAgICAgMHgwQgotI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQgkJICAgICAgICAweDE2Ci0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfTEVOCQkJOAotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQgkJICAgICAgICAweDBDCi0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1CCQkgICAgICAgIDB4MTIKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xMk1CCQkweDE4Ci0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQgkJMHgyNAotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUIJCTB4MzAKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8zNk1CCQkweDQ4Ci0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQgkJMHg2MAotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUIJCTB4NkMKLSNkZWZpbmUgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSwkJMHg4MAotCi0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xTUJfTUFTSwkJKDE8PDApCi0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8yTUJfTUFTSwkJKDE8PDEpCi0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV81TUJfTUFTSwkJKDE8PDIpCi0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1CX01BU0sJCSgxPDwzKQotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQl9NQVNLCQkoMTw8NCkKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV85TUJfTUFTSwkJKDE8PDUpCi0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQl9NQVNLCQkoMTw8NikKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xOE1CX01BU0sJCSgxPDw3KQotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSwkJKDE8PDgpCi0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLCQkoMTw8OSkKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV80OE1CX01BU0sJCSgxPDwxMCkKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV81NE1CX01BU0sJCSgxPDwxMSkKLQotI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVTX01BU0sJICAgICAgICAweDAwMDAwMDBGCi0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfQkFTSUNfUkFURVNfTUFTSwkoSUVFRTgwMjExX0NDS19SQVRFXzFNQl9NQVNLIHwgXAotCUlFRUU4MDIxMV9DQ0tfUkFURV8yTUJfTUFTSykKLSNkZWZpbmUgSUVFRTgwMjExX0NDS19ERUZBVUxUX1JBVEVTX01BU0sJKElFRUU4MDIxMV9DQ0tfQkFTSUNfUkFURVNfTUFTSyB8IFwKLQlJRUVFODAyMTFfQ0NLX1JBVEVfNU1CX01BU0sgfCBcCi0JSUVFRTgwMjExX0NDS19SQVRFXzExTUJfTUFTSykKLQotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFU19NQVNLCQkweDAwMDAwRkYwCi0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX0JBU0lDX1JBVEVTX01BU0sJKElFRUU4MDIxMV9PRkRNX1JBVEVfNk1CX01BU0sgfCBcCi0JSUVFRTgwMjExX09GRE1fUkFURV8xMk1CX01BU0sgfCBcCi0JSUVFRTgwMjExX09GRE1fUkFURV8yNE1CX01BU0spCi0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX0RFRkFVTFRfUkFURVNfTUFTSwkoSUVFRTgwMjExX09GRE1fQkFTSUNfUkFURVNfTUFTSyB8IFwKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzlNQl9NQVNLICB8IFwKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUJfTUFTSyB8IFwKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUJfTUFTSyB8IFwKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUJfTUFTSyB8IFwKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUJfTUFTSykKLSNkZWZpbmUgSUVFRTgwMjExX0RFRkFVTFRfUkFURVNfTUFTSyAoSUVFRTgwMjExX09GRE1fREVGQVVMVF9SQVRFU19NQVNLIHwgXAotCQkJCSAgICAgIElFRUU4MDIxMV9DQ0tfREVGQVVMVF9SQVRFU19NQVNLKQotCi0jZGVmaW5lIElFRUU4MDIxMV9OVU1fT0ZETV9SQVRFUwkgICAgOAotI2RlZmluZSBJRUVFODAyMTFfTlVNX0NDS19SQVRFUwkgICAgICAgICAgICA0Ci0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1NISUZUX01BU0tfQSAgICAgICAgIDQKLQotI2RlZmluZSBXRVBfS0VZUyA0Ci0KLQotLyogTUFYX1JBVEVTX0xFTkdUSCBuZWVkcyB0byBiZSAxMi4gIFRoZSBzcGVjIHNheXMgOCwgYW5kIG1hbnkgQVBzCi0gKiBvbmx5IHVzZSA4LCBhbmQgdGhlbiB1c2UgZXh0ZW5kZWQgcmF0ZXMgZm9yIHRoZSByZW1haW5pbmcgc3VwcG9ydGVkCi0gKiByYXRlcy4gIE90aGVyIEFQcywgaG93ZXZlciwgc3RpY2sgYWxsIG9mIHRoZWlyIHN1cHBvcnRlZCByYXRlcyBvbiB0aGUKLSAqIG1haW4gcmF0ZXMgaW5mb3JtYXRpb24gZWxlbWVudC4uLiAqLwotI2RlZmluZSBNQVhfUkFURVNfTEVOR1RICTEyCi0jZGVmaW5lIE1BWF9SQVRFU19FWF9MRU5HVEgJMTYKLSNkZWZpbmUgTUFYX0NIQU5ORUxfTlVNQkVSCTE2MQotI2RlZmluZSBSVFdfQ0hfTUFYXzJHX0NIQU5ORUwJMTQJLyogTWF4IGNoYW5uZWwgaW4gMkcgYmFuZCAqLwotCi0jZGVmaW5lIE1BWF9XUEFfSUVfTEVOCQkyNTYKLSNkZWZpbmUgTUFYX1dQU19JRV9MRU4JCTI1NgotI2RlZmluZSBNQVhfUDJQX0lFX0xFTgkJMjU2Ci0jZGVmaW5lIE1BWF9XRkRfSUVfTEVOCQkxMjgKLQotLyoKLWpvaW5fcmVzOgotLTE6IGF1dGhlbnRpY2F0aW9uIGZhaWwKLS0yOiBhc3NvY2lhdGlvbiBmYWlsCi0+IDA6IFRJRAotKi8KLQotI2RlZmluZSBNQVhUSUQJMTYKLQotI2RlZmluZSBXTUVfT1VJX1RZUEUgMgotI2RlZmluZSBXTUVfT1VJX1NVQlRZUEVfSU5GT1JNQVRJT05fRUxFTUVOVCAwCi0jZGVmaW5lIFdNRV9PVUlfU1VCVFlQRV9QQVJBTUVURVJfRUxFTUVOVCAxCi0jZGVmaW5lIFdNRV9PVUlfU1VCVFlQRV9UU1BFQ19FTEVNRU5UIDIKLSNkZWZpbmUgV01FX1ZFUlNJT04gMQotCi0KLSNkZWZpbmUgT1VJX0JST0FEQ09NIDB4MDA5MDRjIC8qIEJyb2FkY29tIChFcGlncmFtKSAqLwotCi0jZGVmaW5lIFZFTkRPUl9IVF9DQVBBQl9PVUlfVFlQRSAweDMzIC8qIDAwLTkwLTRjOjB4MzMgKi8KLQotLyogUmVwcmVzZW50IGNoYW5uZWwgZGV0YWlscywgc3Vic2V0IG9mIGllZWU4MDIxMV9jaGFubmVsICovCi1zdHJ1Y3QgcnR3X2llZWU4MDIxMV9jaGFubmVsIHsKLQkvKiBlbnVtIG5sODAyMTFfYmFuZCBiYW5kOyAqLwotCS8qIHUxNiBjZW50ZXJfZnJlcTsgKi8KLQl1MTYgaHdfdmFsdWU7Ci0JdTMyIGZsYWdzOwotCS8qIGludCBtYXhfYW50ZW5uYV9nYWluOyAqLwotCS8qIGludCBtYXhfcG93ZXI7ICovCi0JLyogaW50IG1heF9yZWdfcG93ZXI7ICovCi0JLyogYm9vbCBiZWFjb25fZm91bmQ7ICovCi0JLyogdTMyIG9yaWdfZmxhZ3M7ICovCi0JLyogaW50IG9yaWdfbWFnOyAqLwotCS8qIGludCBvcmlnX21wd3I7ICovCi19OwotCi0jZGVmaW5lIENIQU5fRk1UIFwKLQkvKiJiYW5kOiVkLCAiKi8gXAotCS8qImNlbnRlcl9mcmVxOiV1LCAiKi8gXAotCSJod192YWx1ZToldSwgIiBcCi0JImZsYWdzOjB4JTA4eCIgXAotCS8qIm1heF9hbnRlbm5hX2dhaW46JWRcbiIqLyBcCi0JLyoibWF4X3Bvd2VyOiVkXG4iKi8gXAotCS8qIm1heF9yZWdfcG93ZXI6JWRcbiIqLyBcCi0JLyoiYmVhY29uX2ZvdW5kOiV1XG4iKi8gXAotCS8qIm9yaWdfZmxhZ3M6MHglMDh4XG4iKi8gXAotCS8qIm9yaWdfbWFnOiVkXG4iKi8gXAotCS8qIm9yaWdfbXB3cjolZFxuIiovCi0KLSNkZWZpbmUgQ0hBTl9BUkcoY2hhbm5lbCkgXAotCS8qKGNoYW5uZWwpLT5iYW5kKi8gXAotCS8qLCAoY2hhbm5lbCktPmNlbnRlcl9mcmVxKi8gXAotCShjaGFubmVsKS0+aHdfdmFsdWUgXAotCSwgKGNoYW5uZWwpLT5mbGFncyBcCi0JLyosIChjaGFubmVsKS0+bWF4X2FudGVubmFfZ2FpbiovIFwKLQkvKiwgKGNoYW5uZWwpLT5tYXhfcG93ZXIqLyBcCi0JLyosIChjaGFubmVsKS0+bWF4X3JlZ19wb3dlciovIFwKLQkvKiwgKGNoYW5uZWwpLT5iZWFjb25fZm91bmQqLyBcCi0JLyosIChjaGFubmVsKS0+b3JpZ19mbGFncyovIFwKLQkvKiwgKGNoYW5uZWwpLT5vcmlnX21hZyovIFwKLQkvKiwgKGNoYW5uZWwpLT5vcmlnX21wd3IqLyBcCi0KLXU4ICpydHdfc2V0X2llMjNhKHU4ICpwYnVmLCBpbnQgaW5kZXgsIHVpbnQgbGVuLCBjb25zdCB1OCAqc291cmNlLCB1aW50ICpmcmxlbik7Ci0KLXU4IGhhbF9jaF9vZmZzZXRfdG9fc2Vjb25kYXJ5X2NoX29mZnNldDIzYSh1OCBjaF9vZmZzZXQpOwotdTggKnJ0d19zZXRfaWUyM2FfY2hfc3dpdGNoKHU4ICpidWYsIHUzMiAqYnVmX2xlbiwgdTggY2hfc3dpdGNoX21vZGUsIHU4IG5ld19jaCwgdTggY2hfc3dpdGNoX2NudCk7Ci11OCAqcnR3X3NldF9pZTIzYV9zZWNvbmRhcnlfY2hfb2Zmc2V0KHU4ICpidWYsIHUzMiAqYnVmX2xlbiwgdTggc2Vjb25kYXJ5X2NoX29mZnNldCk7Ci0KLXU4ICpydHdfZ2V0X2llMjNhKHU4KnBidWYsIGludCBpbmRleCwgaW50ICpsZW4sIGludCBsaW1pdCk7Ci11OCAqcnR3X2dldF9pZTIzYV9leCh1OCAqaW5faWUsIHVpbnQgaW5fbGVuLCB1OCBlaWQsIHU4ICpvdWksIHU4IG91aV9sZW4sIHU4ICppZSwgdWludCAqaWVsZW4pOwotaW50IHJ0d19pZXNfcmVtb3ZlX2llMjNhKHU4ICppZXMsIHVpbnQgKmllc19sZW4sIHVpbnQgb2Zmc2V0LCB1OCBlaWQsIHU4ICpvdWksIHU4IG91aV9sZW4pOwotCi12b2lkIHJ0d19zZXRfc3VwcG9ydGVkX3JhdGUyM2EodTggKlN1cHBvcnRlZFJhdGVzLCB1aW50IG1vZGUpOwotCi1pbnQgcnR3X3BhcnNlX3dwYV9pZTIzYShjb25zdCB1OCogd3BhX2llLCBpbnQgd3BhX2llX2xlbiwgaW50ICpncm91cF9jaXBoZXIsIGludCAqcGFpcndpc2VfY2lwaGVyLCBpbnQgKmlzXzgwMjF4KTsKLWludCBydHdfcGFyc2Vfd3BhMl9pZTIzYShjb25zdCB1OCogd3BhX2llLCBpbnQgd3BhX2llX2xlbiwgaW50ICpncm91cF9jaXBoZXIsIGludCAqcGFpcndpc2VfY2lwaGVyLCBpbnQgKmlzXzgwMjF4KTsKLQotY29uc3QgdTggKnJ0d19nZXRfd3BzX2F0dHIyM2EoY29uc3QgdTggKndwc19pZSwgdWludCB3cHNfaWVsZW4sIHUxNiB0YXJnZXRfYXR0cl9pZCAsdTggKmJ1Zl9hdHRyLCB1MzIgKmxlbl9hdHRyKTsKLWNvbnN0IHU4ICpydHdfZ2V0X3dwc19hdHRyX2NvbnRlbnQyM2EoY29uc3QgdTggKndwc19pZSwgdWludCB3cHNfaWVsZW4sIHUxNiB0YXJnZXRfYXR0cl9pZCAsdTggKmJ1Zl9jb250ZW50KTsKLQotdWludAlydHdfZ2V0X3JhdGVzZXRfbGVuMjNhKHU4CSpyYXRlc2V0KTsKLQotc3RydWN0IHJlZ2lzdHJ5X3ByaXY7Ci1pbnQgcnR3X2dlbmVyYXRlX2llMjNhKHN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVnaXN0cnlwcml2KTsKLQotCi1pbnQgcnR3X2dldF9iaXRfdmFsdWVfZnJvbV9pZWVlX3ZhbHVlMjNhKHU4IHZhbCk7Ci0KLWludCBydHdfY2hlY2tfbmV0d29ya190eXBlMjNhKHVuc2lnbmVkIGNoYXIgKnJhdGUsIGludCByYXRlbGVuLCBpbnQgY2hhbm5lbCk7Ci0KLXZvaWQgcnR3X2dldF9iY25faW5mbzIzYShzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yayk7Ci0KLXUxNiBydHdfbWNzX3JhdGUyM2EodTggcmZfdHlwZSwgdTggYndfNDBNSHosIHU4IHNob3J0X0dJXzIwLCB1OCBzaG9ydF9HSV80MCwKLQkJICAgIHN0cnVjdCBpZWVlODAyMTFfbWNzX2luZm8gKm1jcyk7Ci0KLSNlbmRpZiAvKiBJRUVFODAyMTFfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL2lvY3RsX2NmZzgwMjExLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvaW9jdGxfY2ZnODAyMTEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0ZWFkNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvaW9jdGxfY2ZnODAyMTEuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX0lPQ1RMX0NGRzgwMjExX0hfXwotI2RlZmluZSBfX0lPQ1RMX0NGRzgwMjExX0hfXwotCi1zdHJ1Y3QgcnR3X3dkZXZfcHJpdiB7Ci0Jc3RydWN0IHdpcmVsZXNzX2RldiAqcnR3X3dkZXY7Ci0KLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyOwotCi0Jc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqc2Nhbl9yZXF1ZXN0OwotCXNwaW5sb2NrX3Qgc2Nhbl9yZXFfbG9jazsKLQotCXN0cnVjdCBuZXRfZGV2aWNlICpwbW9uX25kZXY7LyogZm9yIG1vbml0b3IgaW50ZXJmYWNlICovCi0JY2hhciBpZm5hbWVfbW9uW0lGTkFNU0laICsgMV07IC8qIG5hbWUgZm9yIG1vbml0b3IgaW50ZXJmYWNlICovCi0KLQl1OCBwMnBfZW5hYmxlZDsKLQotCWJvb2wgcG93ZXJfbWdtdDsKLX07Ci0KLSNkZWZpbmUgd2Rldl90b19wcml2KHcpICgoc3RydWN0IHJ0d193ZGV2X3ByaXYgKikod2Rldl9wcml2KHcpKSkKLQotI2RlZmluZSB3aXBoeV90b19hZGFwdGVyKHgpCQkJCQlcCi0JKHN0cnVjdCBydHdfYWRhcHRlciAqKSgoKHN0cnVjdCBydHdfd2Rldl9wcml2ICopCVwKLQl3aXBoeV9wcml2KHgpKS0+cGFkYXB0ZXIpCi0KLSNkZWZpbmUgd2lwaHlfdG9fd2Rldih4KQkJCQkJXAotCShzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICopKCgoc3RydWN0IHJ0d193ZGV2X3ByaXYgKikJXAotCXdpcGh5X3ByaXYoeCkpLT5ydHdfd2RldikKLQotaW50IHJ0d193ZGV2X2FsbG9jKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBkZXZpY2UgKmRldik7Ci12b2lkIHJ0d193ZGV2X2ZyZWUoc3RydWN0IHdpcmVsZXNzX2RldiAqd2Rldik7Ci12b2lkIHJ0d193ZGV2X3VucmVnaXN0ZXIoc3RydWN0IHdpcmVsZXNzX2RldiAqd2Rldik7Ci0KLXZvaWQgcnR3X2NmZzgwMjExX2luaXRfd2lwaHkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLXZvaWQgcnR3X2NmZzgwMjExX3N1cnZleWRvbmVfZXZlbnRfY2FsbGJhY2soc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLXZvaWQgcnR3X2NmZzgwMjExX2luZGljYXRlX2Nvbm5lY3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9kaXNjb25uZWN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydHdfY2ZnODAyMTFfaW5kaWNhdGVfc2Nhbl9kb25lKHN0cnVjdCBydHdfd2Rldl9wcml2ICpwd2Rldl9wcml2LAotCQkJCSAgICAgYm9vbCBhYm9ydGVkKTsKLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotdm9pZCBydHdfY2ZnODAyMTFfaW5kaWNhdGVfc3RhX2Fzc29jKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgICB1OCAqcG1nbXRfZnJhbWUsIHVpbnQgZnJhbWVfbGVuKTsKLXZvaWQgcnR3X2NmZzgwMjExX2luZGljYXRlX3N0YV9kaXNhc3NvYyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCQl1bnNpZ25lZCBjaGFyICpkYSwgdW5zaWduZWQgc2hvcnQgcmVhc29uKTsKLSNlbmRpZiAvKiBDT05GSUdfODcyM0FVX0FQX01PREUgKi8KLQotYm9vbCBydHdfY2ZnODAyMTFfcHdyX21nbXQoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKTsKLQotI2VuZGlmIC8qIF9fSU9DVExfQ0ZHODAyMTFfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvbWxtZV9vc2RlcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL21sbWVfb3NkZXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJiNTUyNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvbWxtZV9vc2RlcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmCV9fTUxNRV9PU0RFUF9IXwotI2RlZmluZSBfX01MTUVfT1NERVBfSF8KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLQotdm9pZCBydHdfb3NfaW5kaWNhdGVfZGlzY29ubmVjdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpOwotdm9pZCBydHdfcmVzZXRfc2VjdXJpdHlwcml2MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcik7Ci0KLSNlbmRpZgkvKiBfTUxNRV9PU0RFUF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGYyZjI4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG0uaAorKysgL2Rldi9udWxsCkBAIC0xLDg2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmCV9fSEFMRE1PVVRTUkNfSF9fCi0jZGVmaW5lIF9fSEFMRE1PVVRTUkNfSF9fCi0KLS8qICAqLwotLyogIERlZmluaXRpb24gKi8KLS8qICAqLwotLyogICovCi0vKiAgMjAxMS8wOS8yMiBNSCBEZWZpbmUgYWxsIHRlYW0gc3VwcHJ0IGFiaWxpdHkuICovCi0vKiAgKi8KLQotLyogICovCi0vKiAgMjAxMS8wOS8yMiBNSCBEZWZpbmUgZm9yIGFsbCB0ZWFtcy4gUGxlYXNlIERlZmluZSB0aGUgY29uc3RhbiBpbiB5b3VyIHByZWNvbXAgaGVhZGVyLiAqLwotLyogICovCi0vKiBkZWZpbmUJCURNX09ETV9TVVBQT1JUX0FQCQkJMCAqLwotLyogZGVmaW5lCQlETV9PRE1fU1VQUE9SVF9BRFNMCQkJMCAqLwotLyogZGVmaW5lCQlETV9PRE1fU1VQUE9SVF9DRQkJCTAgKi8KLS8qIGRlZmluZQkJRE1fT0RNX1NVUFBPUlRfTVAJCQkxICovCi0KLSNkZWZpbmUJVFBfTU9ERQkJMAotI2RlZmluZQlSU1NJX01PREUJCTEKLSNkZWZpbmUJVFJBRkZJQ19MT1cJMAotI2RlZmluZQlUUkFGRklDX0hJR0gJMQotCi0KLS8qICAqLwotLyogMyBUeCBQb3dlciBUcmFja2luZyAqLwotLyogMz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZQkJRFBLX0RFTFRBX01BUFBJTkdfTlVNCTEzCi0jZGVmaW5lCQlpbmRleF9tYXBwaW5nX0hQX05VTQkxNQotCi0KLS8qICAqLwotLyogMyBQU0QgSGFuZGxlciAqLwotLyogMz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0jZGVmaW5lCUFGSF9QU0QJCTEJLyogMDpub3JtYWwgUFNEIHNjYW4sIDE6IG9ubHkgZG8gMjAgcHRzIFBTRCAqLwotI2RlZmluZQlNT0RFXzQwTQkJMAkvKiAwOjIwTSwgMTo0ME0gKi8KLSNkZWZpbmUJUFNEX1RIMgkJMwotI2RlZmluZQlQU0RfQ0hNSU4JCTIwICAgLyogIE1pbmltdW0gY2hhbm5lbCBudW1iZXIgZm9yIEJUIEFGSCAqLwotI2RlZmluZQlTSVJfU1RFUF9TSVpFCTMKLSNkZWZpbmUgICBTbW9vdGhfU2l6ZV8xCQk1Ci0jZGVmaW5lCVNtb290aF9USF8xCTMKLSNkZWZpbmUgICBTbW9vdGhfU2l6ZV8yCQkxMAotI2RlZmluZQlTbW9vdGhfVEhfMgk0Ci0jZGVmaW5lICAgU21vb3RoX1NpemVfMwkJMjAKLSNkZWZpbmUJU21vb3RoX1RIXzMJNAotI2RlZmluZSAgIFNtb290aF9TdGVwX1NpemUgNQotI2RlZmluZQlBZGFwdGl2ZV9TSVIJMQotI2RlZmluZQlQU0RfUkVTQ0FOCQk0Ci0jZGVmaW5lCVBTRF9TQ0FOX0lOVEVSVkFMCTcwMCAvKiBtcyAqLwotCi0vKiA4NzIzQSBIaWdoIFBvd2VyIElHSSBTZXR0aW5nICovCi0jZGVmaW5lIERNX0RJR19ISUdIX1BXUl9JR0lfTE9XRVJfQk9VTkQJMHgyMgotI2RlZmluZSBETV9ESUdfR21vZGVfSElHSF9QV1JfSUdJX0xPV0VSX0JPVU5EIDB4MjgKLSNkZWZpbmUgRE1fRElHX0hJR0hfUFdSX1RIUkVTSE9MRAkweDNhCi0KLS8qICBMUFMgZGVmaW5lICovCi0jZGVmaW5lIERNX0RJR19GQV9USDBfTFBTCQkJCTQgLyogIDQgaW4gbHBzICovCi0jZGVmaW5lIERNX0RJR19GQV9USDFfTFBTCQkJCTE1IC8qICAxNSBscHMgKi8KLSNkZWZpbmUgRE1fRElHX0ZBX1RIMl9MUFMJCQkJMzAgLyogIDMwIGxwcyAqLwotI2RlZmluZSBSU1NJX09GRlNFVF9ESUcJCQkJCTB4MDU7Ci0KLS8qIEFOVCBUZXN0ICovCi0jZGVmaW5lCQkJQU5UVEVTVEFMTAkJMHgwMAkJLyogQW50IEEgb3IgQiB3aWxsIGJlIFRlc3RpbmcgKi8KLSNkZWZpbmUJCUFOVFRFU1RBCQkweDAxCQkvKiBBbnQgQSB3aWxsIGJlIFRlc3RpbmcgKi8KLSNkZWZpbmUJCUFOVFRFU1RCCQkweDAyCQkvKiBBbnQgQiB3aWxsIGJlIHRlc3RpbmcgKi8KLQotCi0vKiAgKi8KLS8qICBzdHJ1Y3R1cmUgYW5kIGRlZmluZSAqLwotLyogICovCi0KLXN0cnVjdCAgZGlnX3QgewotCXU4CQlEaWdfRW5hYmxlX0ZsYWc7Ci0JdTgJCURpZ19FeHRfUG9ydF9TdGFnZTsKLQotCWludAkJUnNzaUxvd1RocmVzaDsKLQlpbnQJCVJzc2lIaWdoVGhyZXNoOwotCi0JdTMyCQlGQUxvd1RocmVzaDsKLQl1MzIJCUZBSGlnaFRocmVzaDsKLQotCXU4CQlDdXJTVEFDb25uZWN0U3RhdGU7Ci0JdTgJCVByZVNUQUNvbm5lY3RTdGF0ZTsKLQl1OAkJQ3VyTXVsdGlTVEFDb25uZWN0U3RhdGU7Ci0KLQl1OAkJUHJlSUdWYWx1ZTsKLQl1OAkJQ3VySUdWYWx1ZTsKLQl1OAkJQmFja3VwSUdWYWx1ZTsKLQotCXM4CQlCYWNrb2ZmVmFsOwotCXM4CQlCYWNrb2ZmVmFsX3JhbmdlX21heDsKLQlzOAkJQmFja29mZlZhbF9yYW5nZV9taW47Ci0JdTgJCXJ4X2dhaW5fcmFuZ2VfbWF4OwotCXU4CQlyeF9nYWluX3JhbmdlX21pbjsKLQl1OAkJUnNzaV92YWxfbWluOwotCi0JdTgJCVByZUNDS19DQ0FUaHJlczsKLQl1OAkJQ3VyQ0NLX0NDQVRocmVzOwotCXU4CQlQcmVDQ0tQRFN0YXRlOwotCXU4CQlDdXJDQ0tQRFN0YXRlOwotCi0JdTgJCUxhcmdlRkFIaXQ7Ci0JdTgJCUZvcmJpZGRlbklHSTsKLQl1MzIJCVJlY292ZXJfY250OwotCi0JdTgJCURJR19EeW5hbWljX01JTl8wOwotCXU4CQlESUdfRHluYW1pY19NSU5fMTsKLQlib29sCQliTWVkaWFDb25uZWN0XzA7Ci0JYm9vbAkJYk1lZGlhQ29ubmVjdF8xOwotCi0JdTMyCQlSU1NJX21heDsKLX07Ci0KLXN0cnVjdCBkeW5hbWljX3B3cl9zYXYgewotCXU4CQlQcmVDQ0FTdGF0ZTsKLQl1OAkJQ3VyQ0NBU3RhdGU7Ci0KLQl1OAkJUHJlUkZTdGF0ZTsKLQl1OAkJQ3VyUkZTdGF0ZTsKLQotCWludAkJICAgIFJzc2lfdmFsX21pbjsKLQotCXU4CQlpbml0aWFsaXplOwotCXUzMgkJUmVnODc0LCBSZWdDNzAsIFJlZzg1QywgUmVnQTc0OwotfTsKLQotc3RydWN0IGZhbHNlX2FsYXJtX3N0YXRzIHsKLQl1MzIJQ250X1Bhcml0eV9GYWlsOwotCXUzMglDbnRfUmF0ZV9JbGxlZ2FsOwotCXUzMglDbnRfQ3JjOF9mYWlsOwotCXUzMglDbnRfTWNzX2ZhaWw7Ci0JdTMyCUNudF9PZmRtX2ZhaWw7Ci0JdTMyCUNudF9DY2tfZmFpbDsKLQl1MzIJQ250X2FsbDsKLQl1MzIJQ250X0Zhc3RfRnN5bmM7Ci0JdTMyCUNudF9TQl9TZWFyY2hfZmFpbDsKLQl1MzIJQ250X09GRE1fQ0NBOwotCXUzMglDbnRfQ0NLX0NDQTsKLQl1MzIJQ250X0NDQV9hbGw7Ci0JdTMyCUNudF9CV19VU0M7CS8qIEdhcnkgKi8KLQl1MzIJQ250X0JXX0xTQzsJLyogR2FyeSAqLwotfTsKLQotI2RlZmluZSBBU1NPQ0lBVEVfRU5UUllfTlVNCQkJCQkzMiAvKiAgTWF4IHNpemUgb2YgQXNvY0VudHJ5W10uICovCi0jZGVmaW5lCU9ETV9BU1NPQ0lBVEVfRU5UUllfTlVNCQkJCUFTU09DSUFURV9FTlRSWV9OVU0KLQotLyogIFRoaXMgaW5kaWNhdGVzIHR3byBkaWZmZXJlbnQgdGhlIHN0ZXBzLiAqLwotLyogIEluIFNXQVdfU1RFUF9QRUFLLCBkcml2ZXIgbmVlZHMgdG8gc3dpdGNoIGFudGVubmEgYW5kIGxpc3RlbiB0byB0aGUgc2lnbmFsIG9uIHRoZSBhaXIuICovCi0vKiAgSW4gU1dBV19TVEVQX0RFVEVSTUlORSwgZHJpdmVyIGp1c3QgY29tcGFyZXMgdGhlIHNpZ25hbCBjYXB0dXJlZCBpbiBTV0FXX1NURVBfUEVBSyAqLwotLyogIHdpdGggb3JpZ2luYWwgUlNTSSB0byBkZXRlcm1pbmUgaWYgaXQgaXMgbmVjZXNzYXJ5IHRvIHN3aXRjaCBhbnRlbm5hLiAqLwotI2RlZmluZSBTV0FXX1NURVBfUEVBSwkJMAotI2RlZmluZSBTV0FXX1NURVBfREVURVJNSU5FCTEKLQotI2RlZmluZQlUUF9NT0RFCQkwCi0jZGVmaW5lCVJTU0lfTU9ERQkJMQotI2RlZmluZQlUUkFGRklDX0xPVwkwCi0jZGVmaW5lCVRSQUZGSUNfSElHSAkxCi0KLXN0cnVjdCBzd19hbnRfc3cgewotCXU4CQl0cnlfZmxhZzsKLQlzMzIJCVByZVJTU0k7Ci0JdTgJCUN1ckFudGVubmE7Ci0JdTgJCVByZUFudGVubmE7Ci0JdTgJCVJTU0lfVHJ5aW5nOwotCXU4CQlUZXN0TW9kZTsKLQl1OAkJYlRyaWdnZXJBbnRlbm5hU3dpdGNoOwotCXU4CQlTZWxlY3RBbnRlbm5hTWFwOwotCXU4CQlSU1NJX3RhcmdldDsKLQotCS8qICBCZWZvcmUgbGluayBBbnRlbm5hIFN3aXRjaCBjaGVjayAqLwotCXU4CQlTV0FTX05vTGlua19TdGF0ZTsKLQl1MzIJCVNXQVNfTm9MaW5rX0JLX1JlZzg2MDsKLQlib29sCQlBTlRBX09OOwkvKiBUbyBpbmRpY2F0ZSBBbnQgQSBpcyBvciBub3QgKi8KLQlib29sCQlBTlRCX09OOwkvKiBUbyBpbmRpY2F0ZSBBbnQgQiBpcyBvbiBvciBub3QgKi8KLQotCXMzMgkJUlNTSV9zdW1fQTsKLQlzMzIJCVJTU0lfc3VtX0I7Ci0JczMyCQlSU1NJX2NudF9BOwotCXMzMgkJUlNTSV9jbnRfQjsKLQotCXU2NAkJbGFzdFR4T2tDbnQ7Ci0JdTY0CQlsYXN0UnhPa0NudDsKLQl1NjQJCVRYQnl0ZUNudF9BOwotCXU2NAkJVFhCeXRlQ250X0I7Ci0JdTY0CQlSWEJ5dGVDbnRfQTsKLQl1NjQJCVJYQnl0ZUNudF9COwotCXU4CQlUcmFmZmljTG9hZDsKLX07Ci0KLXN0cnVjdCBlZGNhX3R1cmJvIHsKLQlib29sIGJDdXJyZW50VHVyYm9FRENBOwotCXUzMglwcnZfdHJhZmZpY19pZHg7IC8qICBlZGNhIHR1cmJvICovCi19OwotCi1zdHJ1Y3Qgb2RtX3JhdGVfYWRhcHQgewotCXU4CVR5cGU7CQkvKiAgRE1fVHlwZV9CeUZXL0RNX1R5cGVfQnlEcml2ZXIgKi8KLQl1OAlIaWdoUlNTSVRocmVzaDsJLyogIGlmIFJTU0kgPiBIaWdoUlNTSVRocmVzaAk9PiBSQVRSU3RhdGUgaXMgRE1fUkFUUl9TVEFfSElHSCAqLwotCXU4CUxvd1JTU0lUaHJlc2g7CS8qICBpZiBSU1NJIDw9IExvd1JTU0lUaHJlc2gJPT4gUkFUUlN0YXRlIGlzIERNX1JBVFJfU1RBX0xPVyAqLwotCXU4CVJBVFJTdGF0ZTsJLyogIEN1cnJlbnQgUlNTSSBsZXZlbCwgRE1fUkFUUl9TVEFfSElHSC9ETV9SQVRSX1NUQV9NSURETEUvRE1fUkFUUl9TVEFfTE9XICovCi0JdTMyCUxhc3RSQVRSOwkvKiAgUkFUUiBSZWdpc3RlciBDb250ZW50ICovCi19OwotCi0jZGVmaW5lIElRS19NQUNfUkVHX05VTQkJNAotI2RlZmluZSBJUUtfQUREQV9SRUdfTlVNCQkxNgotI2RlZmluZSBJUUtfQkJfUkVHX05VTV9NQVgJMTAKLSNkZWZpbmUgSVFLX0JCX1JFR19OVU0JCTkKLSNkZWZpbmUgSFBfVEhFUk1BTF9OVU0JCTgKLQotI2RlZmluZSBBVkdfVEhFUk1BTF9OVU0JCTgKLSNkZWZpbmUgSVFLX01hdHJpeF9SRUdfTlVNCTgKLSNkZWZpbmUgSVFLX01hdHJpeF9TZXR0aW5nc19OVU0JMSsyNCsyMQotCi0jZGVmaW5lCQlETV9UeXBlX0J5RlcJCQkwCi0jZGVmaW5lCQlETV9UeXBlX0J5RHJpdmVyCQkxCi0KLS8qICBEZWNsYXJlIGZvciBjb21tb24gaW5mbyAqLwotCi1zdHJ1Y3Qgb2RtX3BoeV9kYmdfaW5mbyB7Ci0JLyogT0RNIFdyaXRlLGRlYnVnIGluZm8gKi8KLQlzOAkJUnhTTlJkQltSRl9QQVRIX01BWF07Ci0JdTY0CQlOdW1RcnlQaHlTdGF0dXM7Ci0JdTY0CQlOdW1RcnlQaHlTdGF0dXNDQ0s7Ci0JdTY0CQlOdW1RcnlQaHlTdGF0dXNPRkRNOwotCS8qIE90aGVycyAqLwotCXMzMgkJUnhFVk1bUkZfUEFUSF9NQVhdOwotCi19OwotCi1zdHJ1Y3Qgb2RtX3BhY2tldF9pbmZvIHsKLQl1OAkJUmF0ZTsKLQl1OAkJU3RhdGlvbklEOwotCWJvb2wJCWJQYWNrZXRNYXRjaEJTU0lEOwotCWJvb2wJCWJQYWNrZXRUb1NlbGY7Ci0JYm9vbAkJYlBhY2tldEJlYWNvbjsKLX07Ci0KLQotZW51bSB7Ci0JLyogIEJCIFRlYW0gKi8KLQlPRE1fRElHCQkJPSAweDAwMDAwMDAxLAotCU9ETV9ISUdIX1BPV0VSCQk9IDB4MDAwMDAwMDIsCi0JT0RNX0NDS19DQ0FfVEgJCT0gMHgwMDAwMDAwNCwKLQlPRE1fRkFfU1RBVElTVElDUwk9IDB4MDAwMDAwMDgsCi0JT0RNX1JBTUFTSwkJPSAweDAwMDAwMDEwLAotCU9ETV9SU1NJX01PTklUT1IJPSAweDAwMDAwMDIwLAotCU9ETV9TV19BTlRESVYJCT0gMHgwMDAwMDA0MCwKLQlPRE1fSFdfQU5URElWCQk9IDB4MDAwMDAwODAsCi0JT0RNX0JCX1BXUlNWCQk9IDB4MDAwMDAxMDAsCi0JT0RNXzJUUEFUSERJVgkJPSAweDAwMDAwMjAwLAotCU9ETV8xVFBBVEhESVYJCT0gMHgwMDAwMDQwMCwKLQlPRE1fUFNEMkFGSAkJPSAweDAwMDAwODAwCi19OwotCi0vKiAgKi8KLS8qICAyMDExLzEwLzIwIE1IIERlZmluZSBDb21tb24gaW5mbyBlbnVtIGZvciBhbGwgdGVhbS4gKi8KLS8qICAqLwotCi1lbnVtIG9kbV9jbW5pbmZvIHsKLQkvKiAgRml4ZWQgdmFsdWU6ICovCi0JLyogICovCi0KLQlPRE1fQ01OSU5GT19NUF9URVNUX0NISVAgPSAyLAotCU9ETV9DTU5JTkZPX0lDX1RZUEUsCQkJLyogIGVudW0gb2RtX2ljX3R5cGVfZGVmICovCi0JT0RNX0NNTklORk9fQ1VUX1ZFUiwJCQkvKiAgZW51bSBvZG1fY3V0X3ZlcnNpb24gKi8KLQlPRE1fQ01OSU5GT19GQUJfVkVSLAkJCS8qICBlbnVtIG9kbV9mYWJfdmVyc2lvbiAqLwotCU9ETV9DTU5JTkZPX0JPQVJEX1RZUEUsCQkJLyogIGVudW0gb2RtX2JvYXJkX3R5cGUgKi8KLQlPRE1fQ01OSU5GT19FWFRfTE5BLAkJCS8qICB0cnVlICovCi0JT0RNX0NNTklORk9fRVhUX1BBLAotCU9ETV9DTU5JTkZPX0VYVF9UUlNXLAotCU9ETV9DTU5JTkZPX0JJTkhDVF9URVNULAotCU9ETV9DTU5JTkZPX0JXSUZJX1RFU1QsCi0JT0RNX0NNTklORk9fU01BUlRfQ09OQ1VSUkVOVCwKLQotCi0JLyogICovCi0JLyogIER5bmFtaWMgdmFsdWU6ICovCi0JLyogICovCi0JT0RNX0NNTklORk9fTVBfTU9ERSwKLQotCU9ETV9DTU5JTkZPX1dJRklfRElSRUNULAotCU9ETV9DTU5JTkZPX1dJRklfRElTUExBWSwKLQlPRE1fQ01OSU5GT19MSU5LLAotCU9ETV9DTU5JTkZPX1JTU0lfTUlOLAotCU9ETV9DTU5JTkZPX0RCR19DT01QLAkJCQkvKiAgdTY0ICovCi0JT0RNX0NNTklORk9fREJHX0xFVkVMLAkJCQkvKiAgdTMyICovCi0JT0RNX0NNTklORk9fUkFfVEhSRVNIT0xEX0hJR0gsCQkvKiAgdTggKi8KLQlPRE1fQ01OSU5GT19SQV9USFJFU0hPTERfTE9XLAkJLyogIHU4ICovCi0JT0RNX0NNTklORk9fUkZfQU5URU5OQV9UWVBFLAkJLyogIHU4ICovCi0JT0RNX0NNTklORk9fQlRfRElTQUJMRUQsCi0JT0RNX0NNTklORk9fQlRfT1BFUkFUSU9OLAotCU9ETV9DTU5JTkZPX0JUX0RJRywKLQlPRE1fQ01OSU5GT19CVF9CVVNZLAkJCQkJLyogQ2hlY2sgQnQgaXMgdXNpbmcgb3Igbm90ICovCi0JT0RNX0NNTklORk9fQlRfRElTQUJMRV9FRENBLAotCi0JLyogICovCi0JLyogIER5bmFtaWMgcHRyIGFycmF5IGhvb2sgaXRtcy4gKi8KLQkvKiAgKi8KLQlPRE1fQ01OSU5GT19TVEFfU1RBVFVTLAotCU9ETV9DTU5JTkZPX1BIWV9TVEFUVVMsCi0JT0RNX0NNTklORk9fTUFDX1NUQVRVUywKLQotCU9ETV9DTU5JTkZPX01BWCwKLX07Ci0KLS8qICBEZWZpbmUgT0RNIHN1cHBvcnQgYWJpbGl0eS4gIE9ETV9DTU5JTkZPX0FCSUxJVFkgKi8KLWVudW0gewotCS8qICBCQiBPRE0gc2VjdGlvbiBCSVQgMC0xNSAqLwotCU9ETV9CQl9BTlRfRElWCQkJCT0gQklUKDYpLAotfTsKLQotLyoJT0RNX0NNTklORk9fSU5URVJGQUNFICovCi1lbnVtIG9kbV9pbnRlcmZhY2VfZGVmIHsKLQlPRE1fSVRSRl9QQ0lFCT0JMHgxLAotCU9ETV9JVFJGX1VTQgk9CTB4MiwKLQlPRE1fSVRSRl9TRElPCT0JMHg0LAotCU9ETV9JVFJGX0FMTAk9CTB4NywKLX07Ci0KLS8qICBPRE1fQ01OSU5GT19JQ19UWVBFICovCi1lbnVtIG9kbV9pY190eXBlX2RlZiB7Ci0JT0RNX1JUTDgxOTJTCT0JQklUKDApLAotCU9ETV9SVEw4MTkyQwk9CUJJVCgxKSwKLQlPRE1fUlRMODE5MkQJPQlCSVQoMiksCi0JT0RNX1JUTDg3MjNBCT0JQklUKDMpLAotCU9ETV9SVEw4MTg4RQk9CUJJVCg0KSwKLQlPRE1fUlRMODgxMgk9CUJJVCg1KSwKLQlPRE1fUlRMODgyMQk9CUJJVCg2KSwKLX07Ci0KLS8qIE9ETV9DTU5JTkZPX0NVVF9WRVIgKi8KLWVudW0gb2RtX2N1dF92ZXJzaW9uIHsKLQlPRE1fQ1VUX0EJCT0JMSwKLQlPRE1fQ1VUX0IJCT0JMiwKLQlPRE1fQ1VUX0MJCT0JMywKLQlPRE1fQ1VUX0QJCT0JNCwKLQlPRE1fQ1VUX0UJCT0JNSwKLQlPRE1fQ1VUX0YJCT0JNiwKLQlPRE1fQ1VUX1RFU1QJCT0JNywKLX07Ci0KLS8qICBPRE1fQ01OSU5GT19GQUJfVkVSICovCi1lbnVtIG9kbV9mYWJfdmVyc2lvbiB7Ci0JT0RNX1RTTUMJPQkwLAotCU9ETV9VTUMJCT0JMSwKLX07Ci0KLS8qICBGb3IgZXhhbXBsZSAxVDJSIChBK0FCID0gQklUMHxCSVQ0fEJJVDUpICovCi1lbnVtIHJmX3BhdGhfZGVmIHsKLQlPRE1fUkZfVFhfQQk9CUJJVCgwKSwKLQlPRE1fUkZfVFhfQgk9CUJJVCgxKSwKLQlPRE1fUkZfVFhfQwk9CUJJVCgyKSwKLQlPRE1fUkZfVFhfRAk9CUJJVCgzKSwKLQlPRE1fUkZfUlhfQQk9CUJJVCg0KSwKLQlPRE1fUkZfUlhfQgk9CUJJVCg1KSwKLQlPRE1fUkZfUlhfQwk9CUJJVCg2KSwKLQlPRE1fUkZfUlhfRAk9CUJJVCg3KSwKLX07Ci0KLS8qICBPRE0gRHluYW1pYyBjb21tb24gaW5mbyB2YWx1ZSBkZWZpbml0aW9uICovCi0KLWVudW0gb2RtX21hY19waHlfbW9kZSB7Ci0JT0RNX1NNU1AJPSAwLAotCU9ETV9ETVNQCT0gMSwKLQlPRE1fRE1EUAk9IDIsCi19OwotCi0KLWVudW0gb2RtX2J0X2NvZXhpc3QgewotCU9ETV9CVF9CVVNZCQk9IDEsCi0JT0RNX0JUX09OCQk9IDIsCi0JT0RNX0JUX09GRgkJPSAzLAotCU9ETV9CVF9OT05FCQk9IDQsCi19OwotCi0vKiAgT0RNX0NNTklORk9fT1BfTU9ERSAqLwotZW51bSBvZG1fb3BlcmF0aW9uX21vZGUgewotCU9ETV9OT19MSU5LCQk9IEJJVCgwKSwKLQlPRE1fTElOSwkJPSBCSVQoMSksCi0JT0RNX1NDQU4JCT0gQklUKDIpLAotCU9ETV9QT1dFUlNBVkUJCT0gQklUKDMpLAotCU9ETV9BUF9NT0RFCQk9IEJJVCg0KSwKLQlPRE1fQ0xJRU5UX01PREUJCT0gQklUKDUpLAotCU9ETV9BRF9IT0MJCT0gQklUKDYpLAotCU9ETV9XSUZJX0RJUkVDVAkJPSBCSVQoNyksCi0JT0RNX1dJRklfRElTUExBWQk9IEJJVCg4KSwKLX07Ci0KLS8qICBPRE1fQ01OSU5GT19XTV9NT0RFICovCi1lbnVtIG9kbV93aXJlbGVzc19tb2RlIHsKLQlPRE1fV01fVU5LTk9XCQk9IDB4MCwKLQlPRE1fV01fQgkJPSBCSVQoMCksCi0JT0RNX1dNX0cJCT0gQklUKDEpLAotCU9ETV9XTV9BCQk9IEJJVCgyKSwKLQlPRE1fV01fTjI0RwkJPSBCSVQoMyksCi0JT0RNX1dNX041RwkJPSBCSVQoNCksCi0JT0RNX1dNX0FVVE8JCT0gQklUKDUpLAotCU9ETV9XTV9BQwkJPSBCSVQoNiksCi19OwotCi0vKiAgT0RNX0NNTklORk9fQkFORCAqLwotZW51bSBvZG1fYmFuZF90eXBlIHsKLQlPRE1fQkFORF8yXzRHCQk9IEJJVCgwKSwKLQlPRE1fQkFORF81RwkJPSBCSVQoMSksCi0KLX07Ci0KLS8qICBPRE1fQ01OSU5GT19TRUNfQ0hOTF9PRkZTRVQgKi8KLWVudW0gb2RtX3NlY19jaG5sX29mZnNldCB7Ci0JT0RNX0RPTlRfQ0FSRQkJPSAwLAotCU9ETV9CRUxPVwkJPSAxLAotCU9ETV9BQk9WRQkJPSAyCi19OwotCi0vKiAgT0RNX0NNTklORk9fQ0hOTCAqLwotCi0vKiAgT0RNX0NNTklORk9fQk9BUkRfVFlQRSAqLwotZW51bSBvZG1fYm9hcmRfdHlwZSB7Ci0JT0RNX0JPQVJEX05PUk1BTAk9IDAsCi0JT0RNX0JPQVJEX0hJR0hQV1IJPSAxLAotCU9ETV9CT0FSRF9NSU5JQ0FSRAk9IDIsCi0JT0RNX0JPQVJEX1NMSU0JCT0gMywKLQlPRE1fQk9BUkRfQ09NQk8JCT0gNCwKLQotfTsKLQotLyogIE9ETV9DTU5JTkZPX09ORV9QQVRIX0NDQSAqLwotZW51bSBvZG1fY2NhX3BhdGggewotCU9ETV9DQ0FfMlIJCQk9IDAsCi0JT0RNX0NDQV8xUl9BCQkJPSAxLAotCU9ETV9DQ0FfMVJfQgkJCT0gMiwKLX07Ci0KLXN0cnVjdCBpcWtfbWF0cml4X3JlZ3Nfc2V0IHsKLQlib29sCWJJUUtEb25lOwotCXMzMglWYWx1ZVsxXVtJUUtfTWF0cml4X1JFR19OVU1dOwotfTsKLQotc3RydWN0IG9kbV9yZl9jYWxfdCB7Ci0JLyogZm9yIHR4IHBvd2VyIHRyYWNraW5nICovCi0KLQl1MzIJUmVnQTI0OyAvKiAgZm9yIFRlbXBDQ0sgKi8KLQlzMzIJUmVnRTk0OwotCXMzMglSZWdFOUM7Ci0JczMyCVJlZ0VCNDsKLQlzMzIJUmVnRUJDOwotCi0JLyogdTggYlRYUG93ZXJUcmFja2luZzsgKi8KLQl1OAkJVFhQb3dlcmNvdW50OwotCWJvb2wgYlRYUG93ZXJUcmFja2luZ0luaXQ7Ci0JYm9vbCBiVFhQb3dlclRyYWNraW5nOwotCXU4CQlUeFBvd2VyVHJhY2tDb250cm9sOyAvKiBmb3IgbXAgbW9kZSwgdHVybiBvZmYgdHhwd3J0cmFja2luZyBhcyBkZWZhdWx0ICovCi0JdTgJCVRNX1RyaWdnZXI7Ci0JdTgJCUludGVybmFsUEE1R1syXTsJLyogcGF0aEEgLyBwYXRoQiAqLwotCi0JdTgJCVRoZXJtYWxNZXRlclsyXTsgICAgLyogIFRoZXJtYWxNZXRlciwgaW5kZXggMCBmb3IgUkZJQzAsIGFuZCAxIGZvciBSRklDMSAqLwotCXU4CQlUaGVybWFsVmFsdWU7Ci0JdTgJCVRoZXJtYWxWYWx1ZV9MQ0s7Ci0JdTgJCVRoZXJtYWxWYWx1ZV9JUUs7Ci0JdTgJVGhlcm1hbFZhbHVlX0RQSzsKLQl1OAlUaGVybWFsVmFsdWVfQVZHW0FWR19USEVSTUFMX05VTV07Ci0JdTgJVGhlcm1hbFZhbHVlX0FWR19pbmRleDsKLQl1OAlUaGVybWFsVmFsdWVfUnhHYWluOwotCXU4CVRoZXJtYWxWYWx1ZV9DcnlzdGFsOwotCXU4CVRoZXJtYWxWYWx1ZV9EUEtzdG9yZTsKLQl1OAlUaGVybWFsVmFsdWVfRFBLdHJhY2s7Ci0JYm9vbAlUeFBvd2VyVHJhY2tpbmdJblByb2dyZXNzOwotCWJvb2wJYkRQS2VuYWJsZTsKLQotCWJvb2wJYlJlbG9hZHR4cG93ZXJpbmRleDsKLQl1OAliUmZQaUVuYWJsZTsKLQl1MzIJVFhQb3dlclRyYWNraW5nQ2FsbGJhY2tDbnQ7IC8qIGNvc2EgYWRkIGZvciBkZWJ1ZyAqLwotCi0JdTgJYkNDS2luQ0gxNDsKLQl1OAlDQ0tfaW5kZXg7Ci0JdTgJT0ZETV9pbmRleFsyXTsKLQlib29sIGJEb25lVHhwb3dlcjsKLQotCXU4CVRoZXJtYWxWYWx1ZV9IUFtIUF9USEVSTUFMX05VTV07Ci0JdTgJVGhlcm1hbFZhbHVlX0hQX2luZGV4OwotCXN0cnVjdCBpcWtfbWF0cml4X3JlZ3Nfc2V0IElRS01hdHJpeFJlZ1NldHRpbmdbSVFLX01hdHJpeF9TZXR0aW5nc19OVU1dOwotCi0JdTgJRGVsdGFfSVFLOwotCXU4CURlbHRhX0xDSzsKLQotCS8qIGZvciBJUUsgKi8KLQl1MzIJUmVnQzA0OwotCXUzMglSZWc4NzQ7Ci0JdTMyCVJlZ0MwODsKLQl1MzIJUmVnQjY4OwotCXUzMglSZWdCNkM7Ci0JdTMyCVJlZzg3MDsKLQl1MzIJUmVnODYwOwotCXUzMglSZWc4NjQ7Ci0KLQlib29sCWJJUUtJbml0aWFsaXplZDsKLQlib29sIGJMQ0tJblByb2dyZXNzOwotCWJvb2wJYkFudGVubmFEZXRlY3RlZDsKLQl1MzIJQUREQV9iYWNrdXBbSVFLX0FEREFfUkVHX05VTV07Ci0JdTMyCUlRS19NQUNfYmFja3VwW0lRS19NQUNfUkVHX05VTV07Ci0JdTMyCUlRS19CQl9iYWNrdXBfcmVjb3Zlcls5XTsKLQl1MzIJSVFLX0JCX2JhY2t1cFtJUUtfQkJfUkVHX05VTV07Ci0KLQkvKiBmb3IgQVBLICovCi0JdTMyCUFQS291dHB1dFsyXVsyXTsgLyogcGF0aCBBL0I7IG91dHB1dDFfMWEvb3V0cHV0MV8yYSAqLwotCXU4CWJBUEtkb25lOwotCXU4CWJBUEtUaGVybWFsTWV0ZXJJZ25vcmU7Ci0JdTgJYkRQZG9uZTsKLQl1OAliRFBQYXRoQU9LOwotCXU4CWJEUFBhdGhCT0s7Ci19OwotCi1lbnVtIGFudF9kaWZfdHlwZSB7Ci0JTk9fQU5URElWCQkJPSAweEZGLAotCUNHX1RSWF9IV19BTlRESVYJCT0gMHgwMSwKLQlDR0NTX1JYX0hXX0FOVERJVgkJPSAweDAyLAotCUZJWEVEX0hXX0FOVERJVgkJCT0gMHgwMywKLQlDR19UUlhfU01BUlRfQU5URElWCQk9IDB4MDQsCi0JQ0dDU19SWF9TV19BTlRESVYJCT0gMHgwNSwKLX07Ci0KLS8qICAyMDExLzA5LzIyIE1IIENvcHkgZnJvbSBTRDQgZGVmaW5lZCBzdHJ1Y3R1cmUuIFdlIHVzZSB0byBzdXBwb3J0IFBIWSBETSBpbnRlZ3JhdGlvbi4gKi8KLXN0cnVjdCBkbV9vZG1fdCB7Ci0JLyogICovCi0JLyoJQWRkIGZvciBkaWZmZXJlbnQgdGVhbSB1c2UgdGVtcG9yYXJpbHkgKi8KLQkvKiAgKi8KLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIJKkFkYXB0ZXI7CQkvKiAgRm9yIENFL05JQyB0ZWFtICovCi0KLQl1NjQJCQlEZWJ1Z0NvbXBvbmVudHM7Ci0JdTMyCQkJRGVidWdMZXZlbDsKLQotLyogIE9ETSBIQU5ETEUsIERSSVZFUiBORUVEUyBOT1QgVE8gSE9PSy0tLS0tLSAqLwotCWJvb2wJCQliQ2NrSGlnaFBvd2VyOwotCXU4CQkJUkZQYXRoUnhFbmFibGU7CQkvKiAgT0RNX0NNTklORk9fUkZQQVRIX0VOQUJMRSAqLwotLyogIE9ETSBIQU5ETEUsIERSSVZFUiBORUVEUyBOT1QgVE8gSE9PSy0tLS0tLSAqLwotCi0vKiAxICBDT01NT04gSU5GT1JNQVRJT04gKi8KLQotCS8qICBJbml0IFZhbHVlICovCi0vKiBIT09LIEJFRk9SRSBSRUcgSU5JVC0tLS0tLS0tLS0tICovCi0JLyogIE9ETSBTdXBwb3J0IEFiaWxpdHkgRElHL1JBVFIvVFhfUFdSX1RSQUNLLyChS6FLID0gMS8yLzMvoUsgKi8KLQl1MzIJCQlTdXBwb3J0QWJpbGl0eTsKLQkvKiAgT0RNIGNvbXBvc2l0ZSBvciBpbmRlcGVuZGVudC4gQml0IG9yaWVudGVkLyA5MkMrOTJEKyAuLi4uIG9yIGFueSBvdGhlciB0eXBlID0gMS8yLzMvLi4uICovCi0JdTMyCQkJU3VwcG9ydElDVHlwZTsKLQkvKiAgQ3V0IFZlcnNpb24gVGVzdENoaXAvQS1jdXQvQi1jdXQuLi4gPSAwLzEvMi8zLy4uLiAqLwotCXU4CQkJQ3V0VmVyc2lvbjsKLQkvKiAgRmFiIFZlcnNpb24gVFNNQy9VTUMgPSAwLzEgKi8KLQl1OAkJCUZhYlZlcnNpb247Ci0JLyogIEJvYXJkIFR5cGUgTm9ybWFsL0hpZ2hQb3dlci9NaW5pQ2FyZC9TTElNL0NvbWJvLy4uLiA9IDAvMS8yLzMvNC8uLi4gKi8KLQl1OAkJCUJvYXJkVHlwZTsKLQkvKiAgd2l0aCBleHRlcm5hbCBMTkEgIE5PL1llcyA9IDAvMSAqLwotCXU4CQkJRXh0TE5BOwotCS8qICB3aXRoIGV4dGVybmFsIFBBICBOTy9ZZXMgPSAwLzEgKi8KLQl1OAkJCUV4dFBBOwotCS8qICB3aXRoIGV4dGVybmFsIFRSU1cgIE5PL1llcyA9IDAvMSAqLwotCXU4CQkJRXh0VFJTVzsKLQlib29sCQkJYkluSGN0VGVzdDsKLQlib29sCQkJYldJRklUZXN0OwotCi0JYm9vbAkJCWJEdWFsTWFjU21hcnRDb25jdXJyZW50OwotCXUzMgkJCUJLX1N1cHBvcnRBYmlsaXR5OwotLyogSE9PSyBCRUZPUkUgUkVHIElOSVQtLS0tLS0tLS0tLSAqLwotCi0JLyogICovCi0JLyogIER5bmFtaWMgVmFsdWUgKi8KLQkvKiAgKi8KLS8qICBQT0lOVEVSIFJFRkVSRU5DRS0tLS0tLS0tLS0tICovCi0KLQl1OAkJCXU4X3RlbXA7Ci0JYm9vbAkJCWJvb2xfdGVtcDsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIJKlBBREFQVEVSX3RlbXA7Ci0KLS8qICBQT0lOVEVSIFJFRkVSRU5DRS0tLS0tLS0tLS0tICovCi0JLyogICovCi0vKiBDQUxMIEJZIFZBTFVFLS0tLS0tLS0tLS0tLSAqLwotCWJvb2wJCQliV0lGSV9EaXJlY3Q7Ci0JYm9vbAkJCWJXSUZJX0Rpc3BsYXk7Ci0JYm9vbAkJCWJMaW5rZWQ7Ci0JdTgJCQlSU1NJX01pbjsKLQl1OAkJCUludGVyZmFjZUluZGV4OyAvKiAgQWRkIGZvciA5MkQgIGR1YWwgTUFDOiAwLS1NYWMwIDEtLU1hYzEgKi8KLQlib29sCQliSXNNUENoaXA7Ci0JYm9vbAkJCWJPbmVFbnRyeU9ubHk7Ci0JLyogIENvbW1vbiBpbmZvIGZvciBCVERNICovCi0JYm9vbAkJCWJCdERpc2FibGVkOwkJCS8qICBCVCBpcyBkaXNhYmxlZCAqLwotCWJvb2wJCQliQnRIc09wZXJhdGlvbjsJCS8qICBCVCBIUyBtb2RlIGlzIHVuZGVyIHByb2dyZXNzICovCi0JdTgJCQlidEhzRGlnVmFsOwkJCS8qICB1c2UgQlQgcnNzaSB0byBkZWNpZGUgdGhlIERJRyB2YWx1ZSAqLwotCWJvb2wJCQliQnREaXNhYmxlRWRjYVR1cmJvOwkvKiAgVW5kZXIgc29tZSBjb25kaXRpb24sIGRvbid0IGVuYWJsZSB0aGUgRURDQSBUdXJibyAqLwotCWJvb2wJCQliQnRCdXN5OwkJCS8qICBCVCBpcyBidXN5LiAqLwotLyogQ0FMTCBCWSBWQUxVRS0tLS0tLS0tLS0tLS0gKi8KLQotCS8qIDIgRGVmaW5lIFNUQSBpbmZvLiAqLwotCS8qICBfT0RNX1NUQV9JTkZPICovCi0JLyogIDIwMTIvMDEvMTIgTUggRm9yIE1QLCB3ZSBuZWVkIHRvIHJlZHVjZSBvbmUgYXJyYXkgcG9pbnRlciBmb3IgZGVmYXVsdCBwb3J0Lj8/ICovCi0Jc3RydWN0IHN0YV9pbmZvICoJCXBPRE1fU3RhSW5mb1tPRE1fQVNTT0NJQVRFX0VOVFJZX05VTV07Ci0KLQkvKiAgTGF0ZXN0IHBhY2tldCBwaHkgaW5mbyAoT0RNIHdyaXRlKSAqLwotCXN0cnVjdCBvZG1fcGh5X2RiZ19pbmZvCSBQaHlEYmdJbmZvOwotCS8qIFBIWV9JTkZPXzg4RQkJUGh5SW5mbzsgKi8KLQotCS8qICBMYXRlc3QgcGFja2V0IHBoeSBpbmZvIChPRE0gd3JpdGUpICovCi0JLyogTUFDX0lORk9fODhFCQlNYWNJbmZvOyAqLwotCi0JLyogIERpZmZlcmVudCBUZWFtIGluZGVwZW5kdCBzdHJ1Y3R1cmU/PyAqLwotCi0JLyogICovCi0JLyogVFhfUlRQX0NNTgkJVFhfcmV0cnBvOyAqLwotCS8qIFRYX1JUUF84OEUJCVRYX3JldHJwbzsgKi8KLQkvKiBUWF9SVFBfODE5NQkJVFhfcmV0cnBvOyAqLwotCi0JLyogICovCi0JLyogT0RNIFN0cnVjdHVyZSAqLwotCS8qICAqLwotCXN0cnVjdCBkaWdfdAlETV9EaWdUYWJsZTsKLQlzdHJ1Y3QgZHluYW1pY19wd3Jfc2F2CQlETV9QU1RhYmxlOwotCXN0cnVjdCBmYWxzZV9hbGFybV9zdGF0cwlGYWxzZUFsbUNudDsKLQlzdHJ1Y3QgZmFsc2VfYWxhcm1fc3RhdHMJRmxhc2VBbG1DbnRCdWRkeUFkYXB0ZXI7Ci0Jc3RydWN0IHN3X2FudF9zdwkJRE1fU1dBVF9UYWJsZTsKLQotCXN0cnVjdCBlZGNhX3R1cmJvCQlETV9FRENBX1RhYmxlOwotCXUzMgkJV01NRURDQV9CRTsKLQkvKiAgQ29weSBmcm9tIFNENCBzdHJ1Y3R1cmUgKi8KLQkvKiAgKi8KLQkvKiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQkvKiAgKi8KLQotCS8qIFBTRCAqLwotCXU4CQkJUlNTSV9CVDsJCS8qIGNvbWUgZnJvbSBCVCAqLwotCXN0cnVjdCBvZG1fcmF0ZV9hZGFwdAlSYXRlQWRhcHRpdmU7Ci0KLQotCXN0cnVjdCBvZG1fcmZfY2FsX3QJUkZDYWxpYnJhdGVJbmZvOwotfTsJLyogIERNX0R5bmFtaWNfTWVjaGFuaXNtX1N0cnVjdHVyZSAqLwotCi1lbnVtIG9kbV9yZl9jb250ZW50IHsKLQlvZG1fcmFkaW9hX3R4dCA9IDB4MTAwMCwKLQlvZG1fcmFkaW9iX3R4dCA9IDB4MTAwMSwKLQlvZG1fcmFkaW9jX3R4dCA9IDB4MTAwMiwKLQlvZG1fcmFkaW9kX3R4dCA9IDB4MTAwMwotfTsKLQotLyogIFN0YXR1cyBjb2RlICovCi1lbnVtIHJ0X3N0YXR1cyB7Ci0JUlRfU1RBVFVTX1NVQ0NFU1MsCi0JUlRfU1RBVFVTX0ZBSUxVUkUsCi0JUlRfU1RBVFVTX1BFTkRJTkcsCi0JUlRfU1RBVFVTX1JFU09VUkNFLAotCVJUX1NUQVRVU19JTlZBTElEX0NPTlRFWFQsCi0JUlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSLAotCVJUX1NUQVRVU19OT1RfU1VQUE9SVCwKLQlSVF9TVEFUVVNfT1NfQVBJX0ZBSUxFRCwKLX07Ci0KLS8qIGluY2x1ZGUgIm9kbV9mdW5jdGlvbi5oIiAqLwotCi0vKiAzPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qIDMgRElHICovCi0vKiAzPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotZW51bSBkbV9kaWdfb3AgewotCURJR19UWVBFX1RIUkVTSF9ISUdICT0gMCwKLQlESUdfVFlQRV9USFJFU0hfTE9XCT0gMSwKLQlESUdfVFlQRV9CQUNLT0ZGCQk9IDIsCi0JRElHX1RZUEVfUlhfR0FJTl9NSU4JPSAzLAotCURJR19UWVBFX1JYX0dBSU5fTUFYCT0gNCwKLQlESUdfVFlQRV9FTkFCTEUJCQk9IDUsCi0JRElHX1RZUEVfRElTQUJMRQkJPSA2LAotCURJR19PUF9UWVBFX01BWAotfTsKLQotI2RlZmluZQkJRE1fRElHX1RIUkVTSF9ISUdICQkJNDAKLSNkZWZpbmUJCURNX0RJR19USFJFU0hfTE9XCQkJMzUKLQotI2RlZmluZQkJRE1fU0NBTl9SU1NJX1RICQkJCTB4MTQgLyogc2NhbiByZXR1cm4gaXNzdWUgZm9yIExDICovCi0KLQotI2RlZmluZQkJRE1fRkFMU0VBTEFSTV9USFJFU0hfTE9XCTQwMAotI2RlZmluZQkJRE1fRkFMU0VBTEFSTV9USFJFU0hfSElHSAkxMDAwCi0KLSNkZWZpbmUJCURNX0RJR19NQVhfTklDCQkJCTB4NGUKLSNkZWZpbmUJCURNX0RJR19NSU5fTklDCQkJCTB4MWUKLQotI2RlZmluZQkJRE1fRElHX01BWF9BUAkJCQkweDMyCi0jZGVmaW5lCQlETV9ESUdfTUlOX0FQCQkJCTB4MjAKLQotI2RlZmluZQkJRE1fRElHX01BWF9OSUNfSFAJCQkweDQ2Ci0jZGVmaW5lCQlETV9ESUdfTUlOX05JQ19IUAkJCTB4MmUKLQotI2RlZmluZQkJRE1fRElHX01BWF9BUF9IUAkJCQkweDQyCi0jZGVmaW5lCQlETV9ESUdfTUlOX0FQX0hQCQkJCTB4MzAKLQotLyogdml2aSA5MmMmOTJkIGhhcyBkaWZmZXJlbnQgZGVmaW5pdGlvbiwgMjAxMTA1MDQgKi8KLS8qIHRoaXMgaXMgZm9yIDkyYyAqLwotI2RlZmluZQkJRE1fRElHX0ZBX1RIMAkJCQkweDIwMAotI2RlZmluZQkJRE1fRElHX0ZBX1RIMQkJCQkweDMwMAotI2RlZmluZQkJRE1fRElHX0ZBX1RIMgkJCQkweDQwMAotLyogdGhpcyBpcyBmb3IgOTJkICovCi0jZGVmaW5lCQlETV9ESUdfRkFfVEgwXzkyRAkJCTB4MTAwCi0jZGVmaW5lCQlETV9ESUdfRkFfVEgxXzkyRAkJCTB4NDAwCi0jZGVmaW5lCQlETV9ESUdfRkFfVEgyXzkyRAkJCTB4NjAwCi0KLSNkZWZpbmUJCURNX0RJR19CQUNLT0ZGX01BWAkJCTEyCi0jZGVmaW5lCQlETV9ESUdfQkFDS09GRl9NSU4JCQktNAotI2RlZmluZQkJRE1fRElHX0JBQ0tPRkZfREVGQVVMVAkJMTAKLQotLyogMz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAzIEFHQyBSWCBIaWdoIFBvd2VyIE1vZGUgKi8KLS8qIDM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSAgICAgICAgICBMTkFfTG93X0dhaW5fMSAgICAgICAgICAgICAgICAgICAgICAweDY0Ci0jZGVmaW5lICAgICAgICAgIExOQV9Mb3dfR2Fpbl8yICAgICAgICAgICAgICAgICAgICAgIDB4NUEKLSNkZWZpbmUgICAgICAgICAgTE5BX0xvd19HYWluXzMgICAgICAgICAgICAgICAgICAgICAgMHg1OAotCi0jZGVmaW5lICAgICAgICAgIEZBX1JYSFBfVEgxICAgICAgICAgICAgICAgICAgICAgICAgICAgNTAwMAotI2RlZmluZSAgICAgICAgICBGQV9SWEhQX1RIMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1MDAKLSNkZWZpbmUgICAgICAgICAgRkFfUlhIUF9USDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwMAotI2RlZmluZSAgICAgICAgICBGQV9SWEhQX1RINCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjAwCi0jZGVmaW5lICAgICAgICAgIEZBX1JYSFBfVEg1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDAKLQotLyogMz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAzIEVEQ0EgKi8KLS8qIDM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0vKiAzPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qIDMgRHluYW1pYyBUeCBQb3dlciAqLwotLyogMz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiBEeW5hbWljIFR4IFBvd2VyIENvbnRyb2wgVGhyZXNob2xkICovCi0jZGVmaW5lCQlUWF9QT1dFUl9ORUFSX0ZJRUxEX1RIUkVTSF9MVkwyCTc0Ci0jZGVmaW5lCQlUWF9QT1dFUl9ORUFSX0ZJRUxEX1RIUkVTSF9MVkwxCTY3Ci0jZGVmaW5lCQlUWF9QT1dFUl9ORUFSX0ZJRUxEX1RIUkVTSF9BUAkJMHgzRgotCi0jZGVmaW5lCQlUeEhpZ2hQd3JMZXZlbF9Ob3JtYWwJCTAKLSNkZWZpbmUJCVR4SGlnaFB3ckxldmVsX0xldmVsMQkJMQotI2RlZmluZQkJVHhIaWdoUHdyTGV2ZWxfTGV2ZWwyCQkyCi0jZGVmaW5lCQlUeEhpZ2hQd3JMZXZlbF9CVDEJCQkzCi0jZGVmaW5lCQlUeEhpZ2hQd3JMZXZlbF9CVDIJCQk0Ci0jZGVmaW5lCQlUeEhpZ2hQd3JMZXZlbF8xNQkJCTUKLSNkZWZpbmUJCVR4SGlnaFB3ckxldmVsXzM1CQkJNgotI2RlZmluZQkJVHhIaWdoUHdyTGV2ZWxfNTAJCQk3Ci0jZGVmaW5lCQlUeEhpZ2hQd3JMZXZlbF83MAkJCTgKLSNkZWZpbmUJCVR4SGlnaFB3ckxldmVsXzEwMAkJCTkKLQotLyogMz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAzIFJhdGUgQWRhcHRpdmUgKi8KLS8qIDM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZQkJRE1fUkFUUl9TVEFfSU5JVAkJCTAKLSNkZWZpbmUJCURNX1JBVFJfU1RBX0hJR0gJCQkxCi0jZGVmaW5lCQkJRE1fUkFUUl9TVEFfTUlERExFCQkyCi0jZGVmaW5lCQkJRE1fUkFUUl9TVEFfTE9XCQkJMwotCi0vKiAzPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qIDMgQkIgUG93ZXIgU2F2ZSAqLwotLyogMz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLQotZW51bSBkbV8xcl9jY2EgewotCUNDQV8xUiA9MCwKLQlDQ0FfMlIgPSAxLAotCUNDQV9NQVggPSAyLAotfTsKLQotZW51bSBkbV9yZl9kZWYgewotCVJGX1NhdmUgPTAsCi0JUkZfTm9ybWFsID0gMSwKLQlSRl9NQVggPSAyLAotfTsKLQotLyogMz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAzIEFudGVubmEgRGl2ZXJzaXR5ICovCi0vKiAzPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWVudW0gZG1fc3dhcyB7Ci0JQW50ZW5uYV9BID0gMSwKLQlBbnRlbm5hX0IgPSAyLAotCUFudGVubmFfTUFYID0gMywKLX07Ci0KLS8qICBNYXhpbWFsIG51bWJlciBvZiBhbnRlbm5hIGRldGVjdGlvbiBtZWNoYW5pc20gbmVlZHMgdG8gcGVyZm9ybSwgYWRkZWQgYnkgUm9nZXIsIDIwMTEuMTIuMjguICovCi0jZGVmaW5lCU1BWF9BTlRFTk5BX0RFVEVDVElPTl9DTlQJMTAKLQotLyogICovCi0vKiAgRXh0ZXJuIEdsb2JhbCBWYXJpYWJsZXMuICovCi0vKiAgKi8KLSNkZWZpbmUJT0ZETV9UQUJMRV9TSVpFXzkyQwkzNwotI2RlZmluZQlPRkRNX1RBQkxFX1NJWkVfOTJECTQzCi0jZGVmaW5lCUNDS19UQUJMRV9TSVpFCQkzMwotCi1leHRlcm4JdTMyIE9GRE1Td2luZ1RhYmxlMjNBW09GRE1fVEFCTEVfU0laRV85MkRdOwotZXh0ZXJuCXU4IENDS1N3aW5nVGFibGVfQ2gxX0NoMTMyM0FbQ0NLX1RBQkxFX1NJWkVdWzhdOwotZXh0ZXJuCXU4IENDS1N3aW5nVGFibGVfQ2gxNDIzQSBbQ0NLX1RBQkxFX1NJWkVdWzhdOwotCi0KLQotLyogIDIwMTAwNTE0IEpvc2VwaDogQWRkIGRlZmluaXRpb24gZm9yIGFudGVubmEgc3dpdGNoaW5nIHRlc3QgYWZ0ZXIgbGluay4gKi8KLS8qICBUaGlzIGluZGljYXRlcyB0d28gZGlmZmVyZW50IHRoZSBzdGVwcy4gKi8KLS8qICBJbiBTV0FXX1NURVBfUEVBSywgZHJpdmVyIG5lZWRzIHRvIHN3aXRjaCBhbnRlbm5hIGFuZCBsaXN0ZW4gdG8gdGhlIHNpZ25hbCBvbiB0aGUgYWlyLiAqLwotLyogIEluIFNXQVdfU1RFUF9ERVRFUk1JTkUsIGRyaXZlciBqdXN0IGNvbXBhcmVzIHRoZSBzaWduYWwgY2FwdHVyZWQgaW4gU1dBV19TVEVQX1BFQUsgKi8KLS8qICB3aXRoIG9yaWdpbmFsIFJTU0kgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIG5lY2Vzc2FyeSB0byBzd2l0Y2ggYW50ZW5uYS4gKi8KLSNkZWZpbmUgU1dBV19TVEVQX1BFQUsJCTAKLSNkZWZpbmUgU1dBV19TVEVQX0RFVEVSTUlORQkxCi0KLXN0cnVjdCBoYWxfZGF0YV84NzIzYTsKLQotdm9pZCBPRE1fV3JpdGVfRElHMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwJdTgJQ3VycmVudElHSSk7Ci12b2lkIE9ETV9Xcml0ZV9DQ0tfQ0NBX1RocmVzMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTgJQ3VyQ0NLX0NDQVRocmVzKTsKLQotdm9pZCBPRE1fU2V0QW50ZW5uYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHU4IEFudGVubmEpOwotCi0KLSNkZWZpbmUgZG1fUkZfU2F2aW5nCU9ETV9SRl9TYXZpbmcyM2EKLXZvaWQgT0RNX1JGX1NhdmluZzIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHU4IGJGb3JjZUluTm9ybWFsKTsKLQotI2RlZmluZSBkbV9DaGVja1RYUG93ZXJUcmFja2luZwkJT0RNX1RYUG93ZXJUcmFja2luZ0NoZWNrMjNhCi12b2lkIE9ETV9UWFBvd2VyVHJhY2tpbmdDaGVjazIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotCi1ib29sIE9ETV9SQVN0YXRlQ2hlY2syM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCBzMzIgUlNTSSwgYm9vbCBiRm9yY2VVcGRhdGUsCi0JCSAgICAgIHU4ICpwUkFUUlN0YXRlKTsKLQotCi11MzIgQ29udmVydFRvX2RCMjNhKHUzMiBWYWx1ZSk7Ci0KLXUzMiBHZXRQU0REYXRhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdW5zaWduZWQgaW50IHBvaW50LCB1OCBpbml0aWFsX2dhaW5fcHNkKTsKLQotdm9pZCBvZG1fRElHMjNhYnlSU1NJX0xQUyhzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotCi11MzIgT0RNX0dldF9SYXRlX0JpdG1hcDIzYShzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhLCB1MzIgbWFjaWQsIHUzMiByYV9tYXNrLCB1OCByc3NpX2xldmVsKTsKLQotCi12b2lkIE9ETTIzYV9ETUluaXQoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotdm9pZCBPRE1fRE1XYXRjaGRvZzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpOwotCi12b2lkIE9ETV9DbW5JbmZvSW5pdDIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIGVudW0gb2RtX2NtbmluZm8JQ21uSW5mbywgdTMyIFZhbHVlKTsKLQotdm9pZCBPRE1fQ21uSW5mb1B0ckFycmF5SG9vazIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIGVudW0gb2RtX2NtbmluZm8JQ21uSW5mbywgdTE2IEluZGV4LCB2b2lkICpwVmFsdWUpOwotCi12b2lkIE9ETV9DbW5JbmZvVXBkYXRlMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTMyIENtbkluZm8sIHU2NCBWYWx1ZSk7Ci0KLXZvaWQgT0RNX1Jlc2V0SVFLUmVzdWx0KHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci0KLXZvaWQgT0RNX0FudHNlbFN0YXRpc3RpY3NfODhDKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTggTWFjSWQsIHUzMiBQV0RCQWxsLCBib29sIGlzQ0NLcmF0ZSk7Ci0KLXZvaWQgT0RNX1NpbmdsZUR1YWxBbnRlbm5hRGVmYXVsdFNldHRpbmcoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotYm9vbCBPRE1fU2luZ2xlRHVhbEFudGVubmFEZXRlY3Rpb24oc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1OCBtb2RlKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtX0hXQ29uZmlnLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtX0hXQ29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NDhkNWYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbV9IV0NvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYJX19IQUxIV09VVFNSQ19IX18KLSNkZWZpbmUgX19IQUxIV09VVFNSQ19IX18KLQotI2luY2x1ZGUgPEhhbDg3MjNBUGh5Q2ZnLmg+Ci0KLS8qICAqLwotLyogIERlZmluaXRpb24gKi8KLS8qICAqLwotLyogICovCi0vKiAgKi8KLS8qICBDQ0sgUmF0ZXMsIFR4SFQgPSAwICovCi0jZGVmaW5lIERFU0M5MkNfUkFURTFNCQkJCQkweDAwCi0jZGVmaW5lIERFU0M5MkNfUkFURTJNCQkJCQkweDAxCi0jZGVmaW5lIERFU0M5MkNfUkFURTVfNU0JCQkJMHgwMgotI2RlZmluZSBERVNDOTJDX1JBVEUxMU0JCQkJMHgwMwotCi0vKiAgT0ZETSBSYXRlcywgVHhIVCA9IDAgKi8KLSNkZWZpbmUgREVTQzkyQ19SQVRFNk0JCQkJCTB4MDQKLSNkZWZpbmUgREVTQzkyQ19SQVRFOU0JCQkJCTB4MDUKLSNkZWZpbmUgREVTQzkyQ19SQVRFMTJNCQkJCTB4MDYKLSNkZWZpbmUgREVTQzkyQ19SQVRFMThNCQkJCTB4MDcKLSNkZWZpbmUgREVTQzkyQ19SQVRFMjRNCQkJCTB4MDgKLSNkZWZpbmUgREVTQzkyQ19SQVRFMzZNCQkJCTB4MDkKLSNkZWZpbmUgREVTQzkyQ19SQVRFNDhNCQkJCTB4MGEKLSNkZWZpbmUgREVTQzkyQ19SQVRFNTRNCQkJCTB4MGIKLQotLyogIE1DUyBSYXRlcywgVHhIVCA9IDEgKi8KLSNkZWZpbmUgREVTQzkyQ19SQVRFTUNTMAkJCQkweDBjCi0jZGVmaW5lIERFU0M5MkNfUkFURU1DUzEJCQkJMHgwZAotI2RlZmluZSBERVNDOTJDX1JBVEVNQ1MyCQkJCTB4MGUKLSNkZWZpbmUgREVTQzkyQ19SQVRFTUNTMwkJCQkweDBmCi0jZGVmaW5lIERFU0M5MkNfUkFURU1DUzQJCQkJMHgxMAotI2RlZmluZSBERVNDOTJDX1JBVEVNQ1M1CQkJCTB4MTEKLSNkZWZpbmUgREVTQzkyQ19SQVRFTUNTNgkJCQkweDEyCi0jZGVmaW5lIERFU0M5MkNfUkFURU1DUzcJCQkJMHgxMwotI2RlZmluZSBERVNDOTJDX1JBVEVNQ1M4CQkJCTB4MTQKLSNkZWZpbmUgREVTQzkyQ19SQVRFTUNTOQkJCQkweDE1Ci0jZGVmaW5lIERFU0M5MkNfUkFURU1DUzEwCQkJCTB4MTYKLSNkZWZpbmUgREVTQzkyQ19SQVRFTUNTMTEJCQkJMHgxNwotI2RlZmluZSBERVNDOTJDX1JBVEVNQ1MxMgkJCQkweDE4Ci0jZGVmaW5lIERFU0M5MkNfUkFURU1DUzEzCQkJCTB4MTkKLSNkZWZpbmUgREVTQzkyQ19SQVRFTUNTMTQJCQkJMHgxYQotI2RlZmluZSBERVNDOTJDX1JBVEVNQ1MxNQkJCQkweDFiCi0jZGVmaW5lIERFU0M5MkNfUkFURU1DUzE1X1NHCQkJMHgxYwotI2RlZmluZSBERVNDOTJDX1JBVEVNQ1MzMgkJCQkweDIwCi0KLQotLyogICovCi0vKiAgc3RydWN0dXJlIGFuZCBkZWZpbmUgKi8KLS8qICAqLwotCi1zdHJ1Y3QgcGh5X3J4X2FnY19pbmZvIHsKLQkjaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0JCXU4CWdhaW46NywgdHJzdzoxOwotCSNlbHNlCi0JCXU4CXRyc3c6MSwgZ2Fpbjo3OwotCSNlbmRpZgotfTsKLQotc3RydWN0IHBoeV9zdGF0dXNfcnB0IHsKLQlzdHJ1Y3QgcGh5X3J4X2FnY19pbmZvIHBhdGhfYWdjW1JGX1BBVEhfTUFYXTsKLQl1OAljaF9jb3JyW1JGX1BBVEhfTUFYXTsKLQl1OAljY2tfc2lnX3F1YWxfb2ZkbV9wd2RiX2FsbDsKLQl1OAljY2tfYWdjX3JwdF9vZmRtX2Nmb3Nob19hOwotCXU4CWNja19ycHRfYl9vZmRtX2Nmb3Nob19iOwotCXU4CXJzdmRfMTsvKiBjaF9jb3JyX21zYjsgKi8KLQl1OAlub2lzZV9wb3dlcl9kYl9tc2I7Ci0JdTgJcGF0aF9jZm90YWlsW1JGX1BBVEhfTUFYXTsKLQl1OAlwY3RzX21hc2tbUkZfUEFUSF9NQVhdOwotCXM4CXN0cmVhbV9yeGV2bVtSRl9QQVRIX01BWF07Ci0JdTgJcGF0aF9yeHNucltSRl9QQVRIX01BWF07Ci0JdTgJbm9pc2VfcG93ZXJfZGJfbHNiOwotCXU4CXJzdmRfMlszXTsKLQl1OAlzdHJlYW1fY3NpW1JGX1BBVEhfTUFYXTsKLQl1OAlzdHJlYW1fdGFyZ2V0X2NzaVtSRl9QQVRIX01BWF07Ci0JczgJc2lnX2V2bTsKLQl1OAlyc3ZkXzM7Ci0KLSNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KLQl1OAlhbnRzZWxfcnhfa2VlcF8yOjE7CS8qIGV4X2ludGZfZmxnOjE7ICovCi0JdTgJc2dpX2VuOjE7Ci0JdTgJcnhzYzoyOwotCXU4CWlkbGVfbG9uZzoxOwotCXU4CXJfYW50X3RyYWluX2VuOjE7Ci0JdTgJYW50X3NlbF9iOjE7Ci0JdTgJYW50X3NlbDoxOwotI2Vsc2UJLyogIF9CSUdfRU5ESUFOXyAqLwotCXU4CWFudF9zZWw6MTsKLQl1OAlhbnRfc2VsX2I6MTsKLQl1OAlyX2FudF90cmFpbl9lbjoxOwotCXU4CWlkbGVfbG9uZzoxOwotCXU4CXJ4c2M6MjsKLQl1OAlzZ2lfZW46MTsKLQl1OAlhbnRzZWxfcnhfa2VlcF8yOjE7CS8qIGV4X2ludGZfZmxnOjE7ICovCi0jZW5kaWYKLX07Ci0KLQotc3RydWN0IHBoeV9zdGF0dXNfcnB0XzgxOTUgewotCXN0cnVjdCBwaHlfcnhfYWdjX2luZm8gcGF0aF9hZ2NbMl07Ci0JdTgJY2hfbnVtWzJdOwotCXU4CWNja19zaWdfcXVhbF9vZmRtX3B3ZGJfYWxsOwotCXU4CWNja19hZ2NfcnB0X29mZG1fY2Zvc2hvX2E7Ci0JdTgJY2NrX2JiX3B3cl9vZmRtX2Nmb3Nob19iOwotCXU4ICAgIGNja19yeF9wYXRoOwkvKiBDQ0tfUlhfUEFUSCBbMzowXSAod2l0aCByZWdBMDdbMzowXSBkZWZpbml0aW9uKSAqLwotCXU4CXJzdmRfMTsKLQl1OAlwYXRoX2Nmb3RhaWxbMl07Ci0JdTgJcGN0c19tYXNrWzJdOwotCXM4CXN0cmVhbV9yeGV2bVsyXTsKLQl1OAlwYXRoX3J4c25yWzJdOwotCXU4CXJzdmRfMlsyXTsKLQl1OAlzdHJlYW1fc25yWzJdOwotCXU4CXN0cmVhbV9jc2lbMl07Ci0JdTgJcnN2ZF8zWzJdOwotCXM4CXNpZ19ldm07Ci0JdTgJcnN2ZF80OwotI2lmZGVmIF9fTElUVExFX0VORElBTgotCXU4CWFudGlkeF9hbnRhOjM7Ci0JdTgJYW50aWR4X2FudGI6MzsKLQl1OAlyc3ZkXzU6MjsKLSNlbHNlCS8qICBfQklHX0VORElBTl8gKi8KLQl1OAlyc3ZkXzU6MjsKLQl1OAlhbnRpZHhfYW50YjozOwotCXU4CWFudGlkeF9hbnRhOjM7Ci0jZW5kaWYKLX07Ci0KLQotdm9pZAotT0RNX1BoeVN0YXR1c1F1ZXJ5MjNhKAotCXN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwKLQlzdHJ1Y3QgcGh5X2luZm8gKnBQaHlJbmZvLAotCXU4ICoJCQkJCQlwUGh5U3RhdHVzLAotCXN0cnVjdCBvZG1fcGFja2V0X2luZm8gKnBQa3RpbmZvCi0JKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtX1JlZ0NvbmZpZzg3MjNBLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtX1JlZ0NvbmZpZzg3MjNBLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYTU0ZDguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbV9SZWdDb25maWc4NzIzQS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fSU5DX09ETV9SRUdDT05GSUdfSF84NzIzQQotI2RlZmluZSBfX0lOQ19PRE1fUkVHQ09ORklHX0hfODcyM0EKLQotdm9pZCBvZG1fQ29uZmlnUkZSZWdfODcyM0Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1MzIgQWRkciwgdTMyIERhdGEsCi0JCQkgICBlbnVtIFJGX1JBRElPX1BBVEggUkZfUEFUSCwgdTMyIFJlZ0FkZHIpOwotCi12b2lkIG9kbV9Db25maWdNQUNfODcyM0Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1MzIgQWRkciwgdTggRGF0YSk7Ci0KLXZvaWQgb2RtX0NvbmZpZ0JCX0FHQ184NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBhZGRyLCB1MzIgZGF0YSk7Ci0KLXZvaWQgb2RtX0NvbmZpZ0JCX1BIWV84NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBhZGRyLCB1MzIgZGF0YSk7Ci0KLSNlbmRpZiAvKiAgZW5kIG9mIFNVUFBPUlQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fUmVnRGVmaW5lMTFOLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtX1JlZ0RlZmluZTExTi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzc4MjE1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fUmVnRGVmaW5lMTFOLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYJX19PRE1fUkVHREVGSU5FMTFOX0hfXwotI2RlZmluZSBfX09ETV9SRUdERUZJTkUxMU5fSF9fCi0KLQotLyogMiBSRiBSRUcgTElTVCAqLwotI2RlZmluZQlPRE1fUkVHX1JGX01PREVfMTFOCQkJMHgwMAotI2RlZmluZQlPRE1fUkVHX1JGXzBCXzExTgkJCTB4MEIKLSNkZWZpbmUJT0RNX1JFR19DSE5CV18xMU4JCQkweDE4Ci0jZGVmaW5lCU9ETV9SRUdfVF9NRVRFUl8xMU4JCQkweDI0Ci0jZGVmaW5lCU9ETV9SRUdfUkZfMjVfMTFOCQkJMHgyNQotI2RlZmluZQlPRE1fUkVHX1JGXzI2XzExTgkJCTB4MjYKLSNkZWZpbmUJT0RNX1JFR19SRl8yN18xMU4JCQkweDI3Ci0jZGVmaW5lCU9ETV9SRUdfUkZfMkJfMTFOCQkJMHgyQgotI2RlZmluZQlPRE1fUkVHX1JGXzJDXzExTgkJCTB4MkMKLSNkZWZpbmUJT0RNX1JFR19SWFJGX0EzXzExTgkJCTB4M0MKLSNkZWZpbmUJT0RNX1JFR19UX01FVEVSXzkyRF8xMU4JCQkweDQyCi0jZGVmaW5lCU9ETV9SRUdfVF9NRVRFUl84OEVfMTFOCQkJMHg0MgotCi0KLQotLyogMiBCQiBSRUcgTElTVCAqLwotLyogUEFHRSA4ICovCi0jZGVmaW5lCU9ETV9SRUdfQkJfQ1RSTF8xMU4JCQkweDgwMAotI2RlZmluZQlPRE1fUkVHX1JGX1BJTl8xMU4JCQkweDgwNAotI2RlZmluZQlPRE1fUkVHX1BTRF9DVFJMXzExTgkJCTB4ODA4Ci0jZGVmaW5lCU9ETV9SRUdfVFhfQU5UX0NUUkxfMTFOCQkJMHg4MEMKLSNkZWZpbmUJT0RNX1JFR19CQl9QV1JfU0FWNV8xMU4JCQkweDgxOAotI2RlZmluZQlPRE1fUkVHX0NDS19SUFRfRk9STUFUXzExTgkJMHg4MjQKLSNkZWZpbmUJT0RNX1JFR19SWF9ERUZVQUxUX0FfMTFOCQkweDg1OAotI2RlZmluZQlPRE1fUkVHX1JYX0RFRlVBTFRfQl8xMU4JCTB4ODVBCi0jZGVmaW5lCU9ETV9SRUdfQkJfUFdSX1NBVjNfMTFOCQkJMHg4NUMKLSNkZWZpbmUJT0RNX1JFR19BTlRTRUxfQ1RSTF8xMU4JCQkweDg2MAotI2RlZmluZQlPRE1fUkVHX1JYX0FOVF9DVFJMXzExTgkJCTB4ODY0Ci0jZGVmaW5lCU9ETV9SRUdfUElOX0NUUkxfMTFOCQkJMHg4NzAKLSNkZWZpbmUJT0RNX1JFR19CQl9QV1JfU0FWMV8xMU4JCQkweDg3NAotI2RlZmluZQlPRE1fUkVHX0FOVFNFTF9QQVRIXzExTgkJCTB4ODc4Ci0jZGVmaW5lCU9ETV9SRUdfQkJfM1dJUkVfMTFOCQkJMHg4OEMKLSNkZWZpbmUJT0RNX1JFR19TQ19DTlRfMTFOCQkJMHg4QzQKLSNkZWZpbmUJT0RNX1JFR19QU0RfREFUQV8xMU4JCQkweDhCNAotLyogUEFHRSA5ICovCi0jZGVmaW5lCU9ETV9SRUdfQU5UX01BUFBJTkcxXzExTgkJMHg5MTQKLSNkZWZpbmUJT0RNX1JFR19BTlRfTUFQUElORzJfMTFOCQkweDkxOAotLyogUEFHRSBBICovCi0jZGVmaW5lCU9ETV9SRUdfQ0NLX0FOVERJVl9QQVJBMV8xMU4JCTB4QTAwCi0jZGVmaW5lCU9ETV9SRUdfQ0NLX0NDQV8xMU4JCQkweEEwQQotI2RlZmluZQlPRE1fUkVHX0NDS19BTlRESVZfUEFSQTJfMTFOCQkweEEwQwotI2RlZmluZQlPRE1fUkVHX0NDS19BTlRESVZfUEFSQTNfMTFOCQkweEExMAotI2RlZmluZQlPRE1fUkVHX0NDS19BTlRESVZfUEFSQTRfMTFOCQkweEExNAotI2RlZmluZQlPRE1fUkVHX0NDS19GSUxURVJfUEFSQTFfMTFOCQkweEEyMgotI2RlZmluZQlPRE1fUkVHX0NDS19GSUxURVJfUEFSQTJfMTFOCQkweEEyMwotI2RlZmluZQlPRE1fUkVHX0NDS19GSUxURVJfUEFSQTNfMTFOCQkweEEyNAotI2RlZmluZQlPRE1fUkVHX0NDS19GSUxURVJfUEFSQTRfMTFOCQkweEEyNQotI2RlZmluZQlPRE1fUkVHX0NDS19GSUxURVJfUEFSQTVfMTFOCQkweEEyNgotI2RlZmluZQlPRE1fUkVHX0NDS19GSUxURVJfUEFSQTZfMTFOCQkweEEyNwotI2RlZmluZQlPRE1fUkVHX0NDS19GSUxURVJfUEFSQTdfMTFOCQkweEEyOAotI2RlZmluZQlPRE1fUkVHX0NDS19GSUxURVJfUEFSQThfMTFOCQkweEEyOQotI2RlZmluZQlPRE1fUkVHX0NDS19GQV9SU1RfMTFOCQkJMHhBMkMKLSNkZWZpbmUJT0RNX1JFR19DQ0tfRkFfTVNCXzExTgkJCTB4QTU4Ci0jZGVmaW5lCU9ETV9SRUdfQ0NLX0ZBX0xTQl8xMU4JCQkweEE1QwotI2RlZmluZQlPRE1fUkVHX0NDS19DQ0FfQ05UXzExTgkJCTB4QTYwCi0jZGVmaW5lCU9ETV9SRUdfQkJfUFdSX1NBVjRfMTFOCQkJMHhBNzQKLS8qIFBBR0UgQiAqLwotI2RlZmluZQlPRE1fUkVHX0xOQV9TV0lUQ0hfMTFOCQkJMHhCMkMKLSNkZWZpbmUJT0RNX1JFR19QQVRIX1NXSVRDSF8xMU4JCQkweEIzMAotI2RlZmluZQlPRE1fUkVHX1JTU0lfQ1RSTF8xMU4JCQkweEIzOAotI2RlZmluZQlPRE1fUkVHX0NPTkZJR19BTlRBXzExTgkJCTB4QjY4Ci0jZGVmaW5lCU9ETV9SRUdfUlNTSV9CVF8xMU4JCQkweEI5QwotLyogUEFHRSBDICovCi0jZGVmaW5lCU9ETV9SRUdfT0ZETV9GQV9IT0xEQ18xMU4JCTB4QzAwCi0jZGVmaW5lCU9ETV9SRUdfUlhfUEFUSF8xMU4JCQkweEMwNAotI2RlZmluZQlPRE1fUkVHX1RSTVVYXzExTgkJCTB4QzA4Ci0jZGVmaW5lCU9ETV9SRUdfT0ZETV9GQV9SU1RDXzExTgkJMHhDMEMKLSNkZWZpbmUJT0RNX1JFR19SWElRSV9NQVRSSVhfMTFOCQkweEMxNAotI2RlZmluZQlPRE1fUkVHX1RYSVFLX01BVFJJWF9MU0IxXzExTgkJMHhDNEMKLSNkZWZpbmUJT0RNX1JFR19JR0lfQV8xMU4JCQkweEM1MAotI2RlZmluZQlPRE1fUkVHX0FOVERJVl9QQVJBMl8xMU4JCTB4QzU0Ci0jZGVmaW5lCU9ETV9SRUdfSUdJX0JfMTFOCQkJMHhDNTgKLSNkZWZpbmUJT0RNX1JFR19BTlRESVZfUEFSQTNfMTFOCQkweEM1QwotI2RlZmluZQlPRE1fUkVHX0JCX1BXUl9TQVYyXzExTgkJCTB4QzcwCi0jZGVmaW5lCU9ETV9SRUdfUlhfT0ZGXzExTgkJCTB4QzdDCi0jZGVmaW5lCU9ETV9SRUdfVFhJUUtfTUFUUklYQV8xMU4JCTB4QzgwCi0jZGVmaW5lCU9ETV9SRUdfVFhJUUtfTUFUUklYQl8xMU4JCTB4Qzg4Ci0jZGVmaW5lCU9ETV9SRUdfVFhJUUtfTUFUUklYQV9MU0IyXzExTgkJMHhDOTQKLSNkZWZpbmUJT0RNX1JFR19UWElRS19NQVRSSVhCX0xTQjJfMTFOCQkweEM5QwotI2RlZmluZQlPRE1fUkVHX1JYSVFLX01BVFJJWF9MU0JfMTFOCQkweENBMAotI2RlZmluZQlPRE1fUkVHX0FOVERJVl9QQVJBMV8xMU4JCTB4Q0E0Ci0jZGVmaW5lCU9ETV9SRUdfT0ZETV9GQV9UWVBFMV8xMU4JCTB4Q0YwCi0vKiBQQUdFIEQgKi8KLSNkZWZpbmUJT0RNX1JFR19PRkRNX0ZBX1JTVERfMTFOCQkweEQwMAotI2RlZmluZQlPRE1fUkVHX09GRE1fRkFfVFlQRTJfMTFOCQkweERBMAotI2RlZmluZQlPRE1fUkVHX09GRE1fRkFfVFlQRTNfMTFOCQkweERBNAotI2RlZmluZQlPRE1fUkVHX09GRE1fRkFfVFlQRTRfMTFOCQkweERBOAotLyogUEFHRSBFICovCi0jZGVmaW5lCU9ETV9SRUdfVFhBR0NfQV82XzE4XzExTgkJMHhFMDAKLSNkZWZpbmUJT0RNX1JFR19UWEFHQ19BXzI0XzU0XzExTgkJMHhFMDQKLSNkZWZpbmUJT0RNX1JFR19UWEFHQ19BXzFfTUNTMzJfMTFOCQkweEUwOAotI2RlZmluZQlPRE1fUkVHX1RYQUdDX0FfTUNTMF8zXzExTgkJMHhFMTAKLSNkZWZpbmUJT0RNX1JFR19UWEFHQ19BX01DUzRfN18xMU4JCTB4RTE0Ci0jZGVmaW5lCU9ETV9SRUdfVFhBR0NfQV9NQ1M4XzExXzExTgkJMHhFMTgKLSNkZWZpbmUJT0RNX1JFR19UWEFHQ19BX01DUzEyXzE1XzExTgkJMHhFMUMKLSNkZWZpbmUJT0RNX1JFR19GUEdBMF9JUUtfMTFOCQkJMHhFMjgKLSNkZWZpbmUJT0RNX1JFR19UWElRS19UT05FX0FfMTFOCQkweEUzMAotI2RlZmluZQlPRE1fUkVHX1JYSVFLX1RPTkVfQV8xMU4JCTB4RTM0Ci0jZGVmaW5lCU9ETV9SRUdfVFhJUUtfUElfQV8xMU4JCQkweEUzOAotI2RlZmluZQlPRE1fUkVHX1JYSVFLX1BJX0FfMTFOCQkJMHhFM0MKLSNkZWZpbmUJT0RNX1JFR19UWElRS18xMU4JCQkweEU0MAotI2RlZmluZQlPRE1fUkVHX1JYSVFLXzExTgkJCTB4RTQ0Ci0jZGVmaW5lCU9ETV9SRUdfSVFLX0FHQ19QVFNfMTFOCQkJMHhFNDgKLSNkZWZpbmUJT0RNX1JFR19JUUtfQUdDX1JTUF8xMU4JCQkweEU0QwotI2RlZmluZQlPRE1fUkVHX0JMVUVUT09USF8xMU4JCQkweEU2QwotI2RlZmluZQlPRE1fUkVHX1JYX1dBSVRfQ0NBXzExTgkJCTB4RTcwCi0jZGVmaW5lCU9ETV9SRUdfVFhfQ0NLX1JGT05fMTFOCQkJMHhFNzQKLSNkZWZpbmUJT0RNX1JFR19UWF9DQ0tfQkJPTl8xMU4JCQkweEU3OAotI2RlZmluZQlPRE1fUkVHX09GRE1fUkZPTl8xMU4JCQkweEU3QwotI2RlZmluZQlPRE1fUkVHX09GRE1fQkJPTl8xMU4JCQkweEU4MAotI2RlZmluZSBPRE1fUkVHX1RYMlJYXzExTgkJCTB4RTg0Ci0jZGVmaW5lCU9ETV9SRUdfVFgyVFhfMTFOCQkJMHhFODgKLSNkZWZpbmUJT0RNX1JFR19SWF9DQ0tfMTFOCQkJMHhFOEMKLSNkZWZpbmUJT0RNX1JFR19SWF9PRkRNXzExTgkJCTB4RUQwCi0jZGVmaW5lCU9ETV9SRUdfUlhfV0FJVF9SSUZTXzExTgkJMHhFRDQKLSNkZWZpbmUJT0RNX1JFR19SWDJSWF8xMU4JCQkweEVEOAotI2RlZmluZQlPRE1fUkVHX1NUQU5EQllfMTFOCQkJMHhFREMKLSNkZWZpbmUJT0RNX1JFR19TTEVFUF8xMU4JCQkweEVFMAotI2RlZmluZQlPRE1fUkVHX1BNUERfQU5BRU5fMTFOCQkJMHhFRUMKLQotCi0KLQotCi0KLQotLyogMiBNQUMgUkVHIExJU1QgKi8KLSNkZWZpbmUJT0RNX1JFR19CQl9SU1RfMTFOCQkJMHgwMgotI2RlZmluZQlPRE1fUkVHX0FOVFNFTF9QSU5fMTFOCQkJMHg0QwotI2RlZmluZQlPRE1fUkVHX0VBUkxZX01PREVfMTFOCQkJMHg0RDAKLSNkZWZpbmUJT0RNX1JFR19SU1NJX01PTklUT1JfMTFOCQkweDRGRQotI2RlZmluZQlPRE1fUkVHX0VEQ0FfVk9fMTFOCQkJMHg1MDAKLSNkZWZpbmUJT0RNX1JFR19FRENBX1ZJXzExTgkJCTB4NTA0Ci0jZGVmaW5lCU9ETV9SRUdfRURDQV9CRV8xMU4JCQkweDUwOAotI2RlZmluZQlPRE1fUkVHX0VEQ0FfQktfMTFOCQkJMHg1MEMKLSNkZWZpbmUJT0RNX1JFR19UWFBBVVNFXzExTgkJCTB4NTIyCi0jZGVmaW5lCU9ETV9SRUdfUkVTUF9UWF8xMU4JCQkweDZEOAotI2RlZmluZQlPRE1fUkVHX0FOVF9UUkFJTl9QQVJBMV8xMU4JCTB4N2IwCi0jZGVmaW5lCU9ETV9SRUdfQU5UX1RSQUlOX1BBUkEyXzExTgkJMHg3YjQKLQotCi0vKiBESUcgUmVsYXRlZCAqLwotI2RlZmluZQlPRE1fQklUX0lHSV8xMU4JCQkJMHgwMDAwMDA3RgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fZGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fZGVidWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRiMzc1YS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtX2RlYnVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZglfX09ETV9EQkdfSF9fCi0jZGVmaW5lIF9fT0RNX0RCR19IX18KLQotCi0vKiAgKi8KLS8qCURlZmluZSB0aGUgZGVidWcgbGV2ZWxzICovCi0vKiAgKi8KLS8qCTEuCURCR19UUkFDRSBhbmQgREJHX0xPVUQgYXJlIHVzZWQgZm9yIG5vcm1hbCBjYXNlcy4gKi8KLS8qCVNvIHRoYXQsIHRoZXkgY2FuIGhlbHAgU1cgZW5naW5lZXIgdG8gZGV2ZWxvcCBvciB0cmFjZSBzdGF0ZXMgY2hhbmdlZCAqLwotLyoJYW5kIGFsc28gaGVscCBIVyBlbmdpbm5lciB0byB0cmFjZSBldmVyeSBvcGVyYXRpb24gdG8gYW5kIGZyb20gSFcsICovCi0vKgllLmcgSU8sIFR4LCBSeC4gKi8KLS8qICAqLwotLyoJMi4JREJHX1dBUk5OSU5HIGFuZCBEQkdfU0VSSU9VUyBhcmUgdXNlZCBmb3IgdW51c3VhbCBvciBlcnJvciBjYXNlcywgKi8KLS8qCXdoaWNoIGhlbHAgdXMgdG8gZGVidWcgU1cgb3IgSFcuICovCi0vKiAgKi8KLS8qICAqLwotLyogICovCi0vKglOZXZlciB1c2VkIGluIGEgY2FsbCB0byBPRE1fUlRfVFJBQ0UoKSEgKi8KLS8qICAqLwotI2RlZmluZSBPRE1fREJHX09GRgkJCQkJMQotCi0vKiAgKi8KLS8qCUZhdGFsIGJ1Zy4gKi8KLS8qCUZvciBleGFtcGxlLCBUeC9SeC9JTyBsb2NrZWQgdXAsIE9TIGhhbmdzLCBtZW1vcnkgYWNjZXNzIHZpb2xhdGlvbiwgKi8KLS8qCXJlc291cmNlIGFsbG9jYXRpb24gZmFpbGVkLCB1bmV4cGVjdGVkIEhXIGJlaGF2aW9yLCBIVyBCVUcgYW5kIHNvIG9uLiAqLwotLyogICovCi0jZGVmaW5lIE9ETV9EQkdfU0VSSU9VUwkJCQkyCi0KLS8qICAqLwotLyoJQWJub3JtYWwsIHJhcmUsIG9yIHVuZXhwZXRlZCBjYXNlcy4gKi8KLS8qCUZvciBleGFtcGxlLCBJUlAvUGFja2V0L09JRCBjYW5jZWxlZCwgZGV2aWNlIHN1cHJpc2VseSB1bnJlbW92ZWQgYW5kIHNvIG9uLiAqLwotLyogICovCi0jZGVmaW5lIE9ETV9EQkdfV0FSTklORwkJCQkzCi0KLS8qICAqLwotLyoJTm9ybWFsIGNhc2Ugd2l0aCB1c2VmdWwgaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCBTVyBvciBIVyBzdGF0ZS4gKi8KLS8qCUZvciBleGFtcGxlLCBUeC9SeCBkZXNjcmlwdG9yIHRvIGZpbGwsIFR4L1J4IGRlc2NyaXB0b3IgY29tcGxldGVkIHN0YXR1cywgKi8KLS8qCVNXIHByb3RvY29sIHN0YXRlIGNoYW5nZSwgZHluYW1pYyBtZWNoYW5pc20gc3RhdGUgY2hhbmdlIGFuZCBzbyBvbi4gKi8KLS8qICAqLwotI2RlZmluZSBPRE1fREJHX0xPVUQJCQkJCTQKLQotLyogICovCi0vKglOb3JtYWwgY2FzZSB3aXRoIGRldGFpbCBleGVjdXRpb24gZmxvdyBvciBpbmZvcm1hdGlvbi4gKi8KLS8qICAqLwotI2RlZmluZSBPRE1fREJHX1RSQUNFCQkJCQk1Ci0KLS8qICAqLwotLyogIERlZmluZSB0aGUgdHJhY2luZyBjb21wb25lbnRzICovCi0vKiAgKi8KLS8qICAqLwotLyogQkIgRnVuY3Rpb25zICovCi0jZGVmaW5lIE9ETV9DT01QX0RJRwkJCQlCSVQoMCkKLSNkZWZpbmUgT0RNX0NPTVBfUkFfTUFTSwkJCUJJVCgxKQotI2RlZmluZSBPRE1fQ09NUF9EWU5BTUlDX1RYUFdSCQkJQklUKDIpCi0jZGVmaW5lIE9ETV9DT01QX0ZBX0NOVAkJCQlCSVQoMykKLSNkZWZpbmUgT0RNX0NPTVBfUlNTSV9NT05JVE9SCQkJQklUKDQpCi0jZGVmaW5lIE9ETV9DT01QX0NDS19QRAkJCQlCSVQoNSkKLSNkZWZpbmUgT0RNX0NPTVBfQU5UX0RJVgkJCUJJVCg2KQotI2RlZmluZSBPRE1fQ09NUF9QV1JfU0FWRQkJCUJJVCg3KQotI2RlZmluZSBPRE1fQ09NUF9QV1JfVFJBSU4JCQlCSVQoOCkKLSNkZWZpbmUgT0RNX0NPTVBfUkFURV9BREFQVElWRQkJCUJJVCg5KQotI2RlZmluZSBPRE1fQ09NUF9QQVRIX0RJVgkJCUJJVCgxMCkKLSNkZWZpbmUgT0RNX0NPTVBfUFNECQkJCUJJVCgxMSkKLSNkZWZpbmUgT0RNX0NPTVBfRFlOQU1JQ19QUklDQ0EJCQlCSVQoMTIpCi0jZGVmaW5lIE9ETV9DT01QX1JYSFAJCQkJQklUKDEzKQotLyogTUFDIEZ1bmN0aW9ucyAqLwotI2RlZmluZSBPRE1fQ09NUF9FRENBX1RVUkJPCQkJQklUKDE2KQotI2RlZmluZSBPRE1fQ09NUF9FQVJMWV9NT0RFCQkJQklUKDE3KQotLyogUkYgRnVuY3Rpb25zICovCi0jZGVmaW5lIE9ETV9DT01QX1RYX1BXUl9UUkFDSwkJCUJJVCgyNCkKLSNkZWZpbmUgT0RNX0NPTVBfUlhfR0FJTl9UUkFDSwkJCUJJVCgyNSkKLSNkZWZpbmUgT0RNX0NPTVBfQ0FMSUJSQVRJT04JCQlCSVQoMjYpCi0vKiBDb21tb24gRnVuY3Rpb25zICovCi0jZGVmaW5lIE9ETV9DT01QX0NPTU1PTgkJCQlCSVQoMzApCi0jZGVmaW5lIE9ETV9DT01QX0lOSVQJCQkJQklUKDMxKQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydCBNYWNybyBEZWZpbml0aW9uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQkjZGVmaW5lIFJUX1BSSU5USyhmbXQsIGFyZ3MuLi4pCXByaW50aygiJXMoKTogIiBmbXQsIF9fZnVuY19fLCAjIyBhcmdzKTsKLQotI2lmbmRlZiBBU1NFUlQKLQkjZGVmaW5lIEFTU0VSVChleHByKQotI2VuZGlmCi0KLSNkZWZpbmUgT0RNX1JUX1RSQUNFKHBETV9PZG0sIGNvbXAsIGxldmVsLCBmbXQpCQkJCQkJCVwKLQkJaWYoKChjb21wKSAmIHBETV9PZG0tPkRlYnVnQ29tcG9uZW50cykgJiYgKGxldmVsIDw9IHBETV9PZG0tPkRlYnVnTGV2ZWwpKQlcCi0JCXsJCQkJCQkJCQkJXAotCQkJcHJpbnRrKCJbT0RNLTg3MjNBXSAiKTsJCQkJCQlcCi0JCQlSVF9QUklOVEsgZm10OwkJCQkJCQkJXAotCQl9Ci0KLSNkZWZpbmUgT0RNX1JUX0FTU0VSVChwRE1fT2RtLCBleHByLCBmbXQpCQkJCQkJCVwKLQkJaWYoIShleHByKSkgewkJCQkJCQkJCVwKLQkJCXByaW50aygiQXNzZXJ0aW9uIGZhaWxlZCEgJXMgYXQgLi4uLi4uXG4iLCAjZXhwcik7CQkJXAotCQkJcHJpbnRrKCIgICAgICAuLi4uLi4lcywlcyxsaW5lPSVkXG4iLCBfX0ZJTEVfXywgX19mdW5jX18sIF9fTElORV9fKTtcCi0JCQlSVF9QUklOVEsgZm10OwkJCQkJCQkJXAotCQkJQVNTRVJUKGZhbHNlKTsJCQkJCQkJCVwKLQkJfQotCi12b2lkIE9ETV9Jbml0RGVidWdTZXR0aW5nMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci0KLSNlbmRpZgkvKiAgX19PRE1fREJHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbV9pbnRlcmZhY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1faW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkM2JmMDMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbV9pbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYJX19PRE1fSU5URVJGQUNFX0hfXwotI2RlZmluZSBfX09ETV9JTlRFUkZBQ0VfSF9fCi0KLQotLyogIF9jYXQ6IGltcGxlbWVudGVkIGJ5IFRva2VuLVBhc3RpbmcgT3BlcmF0b3IuICovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotI2RlZmluZSBPRE1fUkVHX0RJR18xMU4JCTB4QzUwCi0jZGVmaW5lIE9ETV9SRUdfRElHXzExQUMJMHhEREQKLQotT0RNX1JFRyhESUcsX3BETV9PZG0pCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotI2RlZmluZSBfcmVnXzExTihfbmFtZSkJCQlPRE1fUkVHXyMjX25hbWUjI18xMU4KLSNkZWZpbmUgX3JlZ18xMUFDKF9uYW1lKQkJT0RNX1JFR18jI19uYW1lIyNfMTFBQwotI2RlZmluZSBfYml0XzExTihfbmFtZSkJCQlPRE1fQklUXyMjX25hbWUjI18xMU4KLSNkZWZpbmUgX2JpdF8xMUFDKF9uYW1lKQkJT0RNX0JJVF8jI19uYW1lIyNfMTFBQwotCi0jZGVmaW5lIF9jYXQoX25hbWUsIF9mdW5jKQkJCQkJXAotCSgJCQkJCQkJXAotCQlfZnVuYyMjXzExTihfbmFtZSkJCQkJXAotCSkKLQotLyogIF9uYW1lOiBuYW1lIG9mIHJlZ2lzdGVyIG9yIGJpdC4gKi8KLS8qICBFeGFtcGxlOiAiT0RNX1JFRyhSX0FfQUdDX0NPUkUxLCBwRE1fT2RtKSIgKi8KLS8qICAgICAgICAgZ2V0cyAiT0RNX1JfQV9BR0NfQ09SRTEiIG9yICJPRE1fUl9BX0FHQ19DT1JFMV84MTkyQyIsIGRlcGVuZHMgb24gU3VwcG9ydElDVHlwZS4gKi8KLSNkZWZpbmUgT0RNX1JFRyhfbmFtZSwgX3BETV9PZG0pCV9jYXQoX25hbWUsIF9yZWcpCi0jZGVmaW5lIE9ETV9CSVQoX25hbWUsIF9wRE1fT2RtKQlfY2F0KF9uYW1lLCBfYml0KQotCi0vKiAgKi8KLS8qICAyMDEyLzAyLzE3IE1IIEZvciBub24tTVAgY29tcGlsZSBwYXNzIG9ubHkuIExpbnV4IGRvZXMgbm90IHN1cHBvcnQgd29ya2l0ZW0uICovCi0vKiAgU3VnZ2VzdCBIVyB0ZWFtIHRvIHVzZSB0aHJlYWQgaW5zdGVhZCBvZiB3b3JraXRlbS4gV2luZG93cyBhbHNvIHN1cHBvcnQgdGhlIGZlYXR1cmUuICovCi0vKiAgKi8KLXR5cGVkZWYgdm9pZCAoKlJUX1dPUktJVEVNX0NBTExfQkFDSykoc3RydWN0IHdvcmtfc3RydWN0ICpwQ29udGV4dCk7Ci0KLS8qICAqLwotLyogID09PT09PT09PT09IEVYdGVybiBGdW5jdGlvbiBQcm90b3R5cGUgKi8KLS8qICAqLwotCi12b2lkIE9ETV9TZXRSRlJlZyhzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIGVudW0gUkZfUkFESU9fUEFUSCBlUkZQYXRoLAotCQkgIHUzMiBSZWdBZGRyLCB1MzIgQml0TWFzaywgdTMyIERhdGEpOwotdTMyIE9ETV9HZXRSRlJlZyhzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIGVudW0gUkZfUkFESU9fUEFUSCBlUkZQYXRoLAotCQkgdTMyIFJlZ0FkZHIsIHUzMiBCaXRNYXNrKTsKLQotI2VuZGlmCS8qICBfX09ETV9JTlRFUkZBQ0VfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtX3ByZWNvbXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fcHJlY29tcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjc5M2M4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fcHJlY29tcC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYJX19PRE1fUFJFQ09NUF9IX18KLSNkZWZpbmUgX19PRE1fUFJFQ09NUF9IX18KLQotLyogMiBDb25maWcgRmxhZ3MgYW5kIFN0cnVjdHMgLSBkZWZpbmVkIGJ5IGVhY2ggT0RNIFR5cGUgKi8KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLSNpbmNsdWRlIDxoYWxfaW50Zi5oPgotCi0KLS8qIDIgSGFyZHdhcmUgUGFyYW1ldGVyIEZpbGVzICovCi0jaW5jbHVkZSAiSGFsODcyM1VIV0ltZ19DRS5oIgotCi0KLS8qIDIgT3V0U3JjIEhlYWRlciBGaWxlcyAqLwotCi0jaW5jbHVkZSAib2RtLmgiCi0jaW5jbHVkZSAib2RtX0hXQ29uZmlnLmgiCi0jaW5jbHVkZSAib2RtX2RlYnVnLmgiCi0jaW5jbHVkZSAib2RtX1JlZ0RlZmluZTExTi5oIgotCi0jaW5jbHVkZSAiSGFsRE1PdXRTcmM4NzIzQS5oIiAvKiBmb3IgSVFLLExDSyxQb3dlci10cmFja2luZyAqLwotI2luY2x1ZGUgInJ0bDg3MjNhX2hhbC5oIgotCi0jaW5jbHVkZSAib2RtX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgIm9kbV9yZWcuaCIKLQotI2luY2x1ZGUgIkhhbEhXSW1nODcyM0FfTUFDLmgiCi0jaW5jbHVkZSAiSGFsSFdJbWc4NzIzQV9SRi5oIgotI2luY2x1ZGUgIkhhbEhXSW1nODcyM0FfQkIuaCIKLSNpbmNsdWRlICJIYWxIV0ltZzg3MjNBX0ZXLmgiCi0jaW5jbHVkZSAib2RtX1JlZ0NvbmZpZzg3MjNBLmgiCi0KLSNlbmRpZgkvKiAgX19PRE1fUFJFQ09NUF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtX3JlZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTg0MzMxMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtX3JlZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICovCi0vKiAgRmlsZSBOYW1lOiBvZG1fcmVnLmggKi8KLS8qICAqLwotLyogIERlc2NyaXB0aW9uOiAqLwotLyogICovCi0vKiAgVGhpcyBmaWxlIGlzIGZvciBnZW5lcmFsIHJlZ2lzdGVyIGRlZmluaXRpb24uICovCi0vKiAgKi8KLS8qICAqLwotLyogICovCi0jaWZuZGVmCV9fSEFMX09ETV9SRUdfSF9fCi0jZGVmaW5lIF9fSEFMX09ETV9SRUdfSF9fCi0KLS8qICAqLwotLyogIFJlZ2lzdGVyIERlZmluaXRpb24gKi8KLS8qICAqLwotCi0vKiBNQUMgUkVHICovCi0jZGVmaW5lCU9ETV9CQl9SRVNFVAkJCQkJMHgwMDIKLSNkZWZpbmUJT0RNX0RVTU1ZCQkJCQkJMHg0ZmUKLSNkZWZpbmUJT0RNX0VEQ0FfVk9fUEFSQU0JCQkweDUwMAotI2RlZmluZQlPRE1fRURDQV9WSV9QQVJBTQkJCTB4NTA0Ci0jZGVmaW5lCU9ETV9FRENBX0JFX1BBUkFNCQkJMHg1MDgKLSNkZWZpbmUJT0RNX0VEQ0FfQktfUEFSQU0JCQkweDUwQwotI2RlZmluZQlPRE1fVFhQQVVTRQkJCQkJMHg1MjIKLQotLyogQkIgUkVHICovCi0jZGVmaW5lCU9ETV9GUEdBX1BIWTBfUEFHRTgJCQkweDgwMAotI2RlZmluZQlPRE1fUFNEX1NFVFRJTkcJCQkJMHg4MDgKLSNkZWZpbmUJT0RNX0FGRV9TRVRUSU5HCQkJCTB4ODE4Ci0jZGVmaW5lCU9ETV9UWEFHQ19CXzZfMTgJCQkJMHg4MzAKLSNkZWZpbmUJT0RNX1RYQUdDX0JfMjRfNTQJCQkweDgzNAotI2RlZmluZQlPRE1fVFhBR0NfQl9NQ1MzMl81CQkJMHg4MzgKLSNkZWZpbmUJT0RNX1RYQUdDX0JfTUNTMF9NQ1MzCQkweDgzYwotI2RlZmluZQlPRE1fVFhBR0NfQl9NQ1M0X01DUzcJCTB4ODQ4Ci0jZGVmaW5lCU9ETV9UWEFHQ19CX01DUzhfTUNTMTEJCTB4ODRjCi0jZGVmaW5lCU9ETV9BTkFMT0dfUkVHSVNURVIJCQkweDg1YwotI2RlZmluZQlPRE1fUkZfSU5URVJGQUNFX09VVFBVVAkJMHg4NjAKLSNkZWZpbmUJT0RNX1RYQUdDX0JfTUNTMTJfTUNTMTUJMHg4NjgKLSNkZWZpbmUJT0RNX1RYQUdDX0JfMTFfQV8yXzExCQkweDg2YwotI2RlZmluZQlPRE1fQURfREFfTFNCX01BU0sJCQkweDg3NAotI2RlZmluZQlPRE1fRU5BQkxFXzNfV0lSRQkJCTB4ODhjCi0jZGVmaW5lCU9ETV9QU0RfUkVQT1JUCQkJCTB4OGI0Ci0jZGVmaW5lCU9ETV9SX0FOVF9TRUxFQ1QJCQkJMHg5MGMKLSNkZWZpbmUJT0RNX0NDS19BTlRfU0VMRUNUCQkJMHhhMDcKLSNkZWZpbmUJT0RNX0NDS19QRF9USFJFU0gJCQkweGEwYQotI2RlZmluZQlPRE1fQ0NLX1JGX1JFRzEJCQkJMHhhMTEKLSNkZWZpbmUJT0RNX0NDS19NQVRDSF9GSUxURVIJCQkweGEyMAotI2RlZmluZQlPRE1fQ0NLX1JBS0VfTUFDCQkJCTB4YTJlCi0jZGVmaW5lCU9ETV9DQ0tfQ05UX1JFU0VUCQkJMHhhMmQKLSNkZWZpbmUJT0RNX0NDS19UWF9ESVZFUlNJVFkJCQkweGEyZgotI2RlZmluZQlPRE1fQ0NLX0ZBX0NOVF9NU0IJCQkweGE1YgotI2RlZmluZQlPRE1fQ0NLX0ZBX0NOVF9MU0IJCQkweGE1YwotI2RlZmluZQlPRE1fQ0NLX05FV19GVU5DVElPTgkJMHhhNzUKLSNkZWZpbmUJT0RNX09GRE1fUEhZMF9QQUdFX0MJCTB4YzAwCi0jZGVmaW5lCU9ETV9PRkRNX1JYX0FOVAkJCQkweGMwNAotI2RlZmluZQlPRE1fUl9BX1JYSVFJCQkJCQkweGMxNAotI2RlZmluZQlPRE1fUl9BX0FHQ19DT1JFMQkJCTB4YzUwCi0jZGVmaW5lCU9ETV9SX0FfQUdDX0NPUkUyCQkJMHhjNTQKLSNkZWZpbmUJT0RNX1JfQl9BR0NfQ09SRTEJCQkweGM1OAotI2RlZmluZQlPRE1fUl9BR0NfUEFSCQkJCQkweGM3MAotI2RlZmluZQlPRE1fUl9IVFNURl9BR0NfUEFSCQkJMHhjN2MKLSNkZWZpbmUJT0RNX1RYX1BXUl9UUkFJTklOR19BCQkweGM5MAotI2RlZmluZQlPRE1fVFhfUFdSX1RSQUlOSU5HX0IJCTB4Yzk4Ci0jZGVmaW5lCU9ETV9PRkRNX0ZBX0NOVDEJCQkJMHhjZjAKLSNkZWZpbmUJT0RNX09GRE1fUEhZMF9QQUdFX0QJCTB4ZDAwCi0jZGVmaW5lCU9ETV9PRkRNX0ZBX0NOVDIJCQkJMHhkYTAKLSNkZWZpbmUJT0RNX09GRE1fRkFfQ05UMwkJCQkweGRhNAotI2RlZmluZQlPRE1fT0ZETV9GQV9DTlQ0CQkJCTB4ZGE4Ci0jZGVmaW5lCU9ETV9UWEFHQ19BXzZfMTgJCQkJMHhlMDAKLSNkZWZpbmUJT0RNX1RYQUdDX0FfMjRfNTQJCQkweGUwNAotI2RlZmluZQlPRE1fVFhBR0NfQV8xX01DUzMyCQkJMHhlMDgKLSNkZWZpbmUJT0RNX1RYQUdDX0FfTUNTMF9NQ1MzCQkweGUxMAotI2RlZmluZQlPRE1fVFhBR0NfQV9NQ1M0X01DUzcJCTB4ZTE0Ci0jZGVmaW5lCU9ETV9UWEFHQ19BX01DUzhfTUNTMTEJCTB4ZTE4Ci0jZGVmaW5lCU9ETV9UWEFHQ19BX01DUzEyX01DUzE1CQkweGUxYwotCi0vKiBSRiBSRUcgKi8KLSNkZWZpbmUJT0RNX0dBSU5fU0VUVElORwkJCQkweDAwCi0jZGVmaW5lCU9ETV9DSEFOTkVMCQkJCQkweDE4Ci0KLS8qIEFudCBEZXRlY3QgUmVnICovCi0jZGVmaW5lCU9ETV9EUERUCQkJCQkJMHgzMDAKLQotLyogUFNEIEluaXQgKi8KLSNkZWZpbmUJT0RNX1BTRFJFRwkJCQkJMHg4MDgKLQotLyogOTJEIFBhdGggRGl2ICovCi0jZGVmaW5lCVBBVEhESVZfUkVHCQkJCQkweEIzMAotI2RlZmluZQlQQVRIRElWX1RSSQkJCQkJMHhCQTAKLQotLyogICovCi0vKiAgQml0bWFwIERlZmluaXRpb24gKi8KLS8qICAqLwotCi0jZGVmaW5lCUJJVF9GQV9SRVNFVAkJCQkJQklUKDApCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29zZGVwX2ludGYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vc2RlcF9pbnRmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNTdlYjIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29zZGVwX2ludGYuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fT1NERVBfSU5URl9IXwotI2RlZmluZSBfX09TREVQX0lOVEZfSF8KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLQotaW50IHJ0d19pbml0X2Rydl9zdzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLWludCBydHdfZnJlZV9kcnZfc3cyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1pbnQgcnR3X3Jlc2V0X2Rydl9zdzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotdm9pZCBydHdfY2FuY2VsX2FsbF90aW1lcjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotaW50IHJ0d19pbml0X25ldGRldjIzYV9uYW1lMjNhKHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2LCBjb25zdCBjaGFyICppZm5hbWUpOwotc3RydWN0IG5ldF9kZXZpY2UgKnJ0d19pbml0X25ldGRldjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotdTE2IHJ0d19yZWN2X3NlbGVjdF9xdWV1ZTIzYShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLQotdm9pZCBydHdfaXBzX2Rldl91bmxvYWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLWludCBydHdfaXBzX3B3cl91cDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnR3X2lwc19wd3JfZG93bjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotaW50IHJ0d19kcnZfcmVnaXN0ZXJfbmV0ZGV2KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydHdfbmRldl9kZXN0cnVjdG9yKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KTsKLQotaW50IHJ0bDg3MjNhdV9pbmlycF9pbml0KHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcik7Ci1pbnQgcnRsODcyM2F1X2luaXJwX2RlaW5pdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYV91c2JfaW50Zl9zdG9wKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0jZW5kaWYJLyogX09TREVQX0lOVEZfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vc2RlcF9zZXJ2aWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb3NkZXBfc2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODI1MGIxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vc2RlcF9zZXJ2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19PU0RFUF9TRVJWSUNFX0hfCi0jZGVmaW5lIF9fT1NERVBfU0VSVklDRV9IXwotCi0jZGVmaW5lIF9GQUlMCQkwCi0jZGVmaW5lIF9TVUNDRVNTCTEKLSNkZWZpbmUgUlRXX1JYX0hBTkRMRUQgMgotCi0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rcmVmLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NlbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgotI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CS8qICBmb3Igc3RydWN0IHRhc2tsZXRfc3RydWN0ICovCi0jaW5jbHVkZSA8bGludXgvaXAuaD4KLQotI2luY2x1ZGUgPG5ldC9pZWVlODAyMTFfcmFkaW90YXAuaD4KLSNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KLQotc3RydWN0IHJ0d19xdWV1ZSB7Ci0Jc3RydWN0CWxpc3RfaGVhZAlxdWV1ZTsKLQlzcGlubG9ja190CQlsb2NrOwotfTsKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgbGlzdF9oZWFkICpnZXRfbGlzdF9oZWFkKHN0cnVjdCBydHdfcXVldWUgKnF1ZXVlKQotewotCXJldHVybiAmcXVldWUtPnF1ZXVlOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBydHdfbmV0aWZfcXVldWVfc3RvcHBlZChzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldikKLXsKLQlyZXR1cm4gKG5ldGlmX3R4X3F1ZXVlX3N0b3BwZWQobmV0ZGV2X2dldF90eF9xdWV1ZShwbmV0ZGV2LCAwKSkgJiYKLQkJbmV0aWZfdHhfcXVldWVfc3RvcHBlZChuZXRkZXZfZ2V0X3R4X3F1ZXVlKHBuZXRkZXYsIDEpKSAmJgotCQluZXRpZl90eF9xdWV1ZV9zdG9wcGVkKG5ldGRldl9nZXRfdHhfcXVldWUocG5ldGRldiwgMikpICYmCi0JCW5ldGlmX3R4X3F1ZXVlX3N0b3BwZWQobmV0ZGV2X2dldF90eF9xdWV1ZShwbmV0ZGV2LCAzKSkpOwotfQotCi1zdGF0aWMgaW5saW5lIHUzMiBDSEtCSVQodTMyIHgpCi17Ci0JV0FSTl9PTih4ID49IDMyKTsKLQlpZiAoeCA+PSAzMikKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIEJJVCh4KTsKLX0KLQotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgTUNTX3JhdGVfMlIyM0FbMTZdOwotCi1leHRlcm4gdW5zaWduZWQgY2hhcglNQ1NfcmF0ZV8yUjIzQVsxNl07Ci1leHRlcm4gdW5zaWduZWQgY2hhcglNQ1NfcmF0ZV8xUjIzQVsxNl07Ci0KLXZvaWQJX3J0d19pbml0X3F1ZXVlMjNhKHN0cnVjdCBydHdfcXVldWUgKnBxdWV1ZSk7Ci0KLS8qIE1hY3JvcyBmb3IgaGFuZGxpbmcgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3NlcyAqLwotCi0jZGVmaW5lIFJUV19HRVRfQkUyNChhKSAoKCgodTMyKSAoYSlbMF0pIDw8IDE2KSB8ICgoKHUzMikgKGEpWzFdKSA8PCA4KSB8IFwKLQkJCSAoKHUzMikgKGEpWzJdKSkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcmVjdl9vc2RlcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3JlY3Zfb3NkZXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJkM2YxYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcmVjdl9vc2RlcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fUkVDVl9PU0RFUF9IXwotI2RlZmluZSBfX1JFQ1ZfT1NERVBfSF8KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLQotaW50IF9ydHdfaW5pdF9yZWN2X3ByaXYyM2Eoc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2LCBzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgX3J0d19mcmVlX3JlY3ZfcHJpdjIzYSAoc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2KTsKLQotaW50IHJ0d19yZWN2X2VudHJ5MjNhKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1pbnQgcnR3X3JlY3ZfaW5kaWNhdGVwa3QyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwotCi12b2lkIHJ0d19oYW5kbGVfdGtpcF9taWNfZXJyMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJncm91cCk7Ci0KLWludAlydHdfaW5pdF9yZWN2X3ByaXYoc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2LCBzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnR3X2ZyZWVfcmVjdl9wcml2IChzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYpOwotCi1pbnQgcnR3X29zX3JlY3ZfcmVzb3VyY2VfaW5pdChzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYsIHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi12b2lkIHJ0d19pbml0X3JlY3ZfdGltZXIyM2Eoc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsICpwcmVvcmRlcl9jdHJsKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfYnQtY29leGlzdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX2J0LWNvZXhpc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FkZDVkZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfYnQtY29leGlzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEyIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19SVEw4NzIzQV9CVF9DT0VYSVNUX0hfXwotI2RlZmluZSBfX1JUTDg3MjNBX0JUX0NPRVhJU1RfSF9fCi0KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLSNpbmNsdWRlICJvZG1fcHJlY29tcC5oIgotCi0KLS8qICBIRUFERVIvUGxhdGZvcm1EZWYuaCAqLwotZW51bSBydF9tZWRpYV9zdGF0dXMgewotCVJUX01FRElBX0RJU0NPTk5FQ1QJPSAwLAotCVJUX01FRElBX0NPTk5FQ1QJPSAxCi19OwotCi0vKiAgPT09PT0gQmVsb3cgdGhpcyBsaW5lIGlzIHN5bmMgZnJvbSBTRDcgZHJpdmVyIENPTU1PTi9CVC5oID09PT09ICovCi0KLSNkZWZpbmUJQlRfVE1QX0JVRl9TSVpFCQkxMDAKLQotdm9pZCBCVF9TaWduYWxDb21wZW5zYXRpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgIHU4ICpyc3NpX3dpZmksIHU4ICpyc3NpX2J0KTsKLXZvaWQgQlRfSGFsdFByb2Nlc3Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIEJUX0xwc0xlYXZlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0KLSNkZWZpbmUJQlRfSHNDb25uZWN0aW9uRXN0YWJsaXNoZWQoQWRhcHRlcikJCWZhbHNlCi0vKiAgPT09PT0gRW5kIG9mIHN5bmMgZnJvbSBTRDcgZHJpdmVyIENPTU1PTi9CVC5oID09PT09ICovCi0KLS8qICBIRUFERVIvU2VjdXJpdHlUeXBlLmggKi8KLSNkZWZpbmUgVEtJUF9FTkNfS0VZX1BPUwkJMzIJCS8qIEtFS19MRU4rS0VLX0xFTikgKi8KLSNkZWZpbmUgTUFYUlNOSUVMRU4JCQkJMjU2Ci0KLS8qICBDT01NT04vUHJvdG9jb2w4MDJfMTEuaCAqLwotLyogICovCi0vKiAgICAgICA4MDIuMTEgTWFuYWdlbWVudCBmcmFtZSBTdGF0dXMgQ29kZSBmaWVsZCAqLwotLyogICovCi1zdHJ1Y3Qgb2N0ZXRfc3RyaW5nIHsKLQl1OAkJKk9jdGV0OwotCXUxNgkJTGVuZ3RoOwotfTsKLQotCi0vKiAgQUVTX0NDTVAgc3BlY2lmaWMgKi8KLWVudW0gewotCUFFU0NDTVBfQkxLX1NJWkUJCT0gICAxNiwgICAgIC8qICAjIG9jdGV0cyBpbiBhbiBBRVMgYmxvY2sgKi8KLQlBRVNDQ01QX01BWF9QQUNLRVQJCT0gICA0KjUxMiwgIC8qICBsYXJnZXN0IHBhY2tldCBzaXplICovCi0JQUVTQ0NNUF9OX1JFU0VSVkVECQk9ICAgMCwgICAgICAvKiAgcmVzZXJ2ZWQgbm9uY2Ugb2N0ZXQgdmFsdWUgKi8KLQlBRVNDQ01QX0FfREFUQQkJCT0gICAweDQwLCAgIC8qICB0aGUgQWRhdGEgYml0IGluIHRoZSBmbGFncyAqLwotCUFFU0NDTVBfTV9TSElGVAkJCT0gICAzLCAgICAgIC8qICBob3cgbXVjaCB0byBzaGlmdCB0aGUgMy1iaXQgTSBmaWVsZCAqLwotCUFFU0NDTVBfTF9TSElGVAkJCT0gICAwLCAgICAgIC8qICBob3cgbXVjaCB0byBzaGlmdCB0aGUgMy1iaXQgTCBmaWVsZCAqLwotCUFFU0NDTVBfTF9TSVpFCQkJPSAgIDIsICAgICAgIC8qICBzaXplIG9mIHRoZSBsKG0pIGxlbmd0aCBmaWVsZCAoaW4gb2N0ZXRzKSAqLwotCUFFU0NDTVBfT0ZGU0VUX1NDCQk9CTIyLAotCUFFU0NDTVBfT0ZGU0VUX0RVUkFUSU9OCT0JNCwKLQlBRVNDQ01QX09GRlNFVF9BMgkJPQkxMCwKLQlBRVNDQ01QX09GRlNFVF9BNAkJPQkyNCwKLQlBRVNDQ01QX1FDX1RJRF9NQVNLCQk9CTB4MGYsCi0JQUVTQ0NNUF9CTEtfU0laRV9UT1RBTAk9ICAgMTYqMTYsICAgICAvKiAgQWRkZWQgYnkgQW5uaWUgZm9yIENLSVAgQUVTIE1JQyBCU09ELCAyMDA2LTA4LTE3LiAqLwotCQkJCQkJCQkJCQkvKiAgMTYqOCA8IDQqNjAgIFJlc292ZSB0byAxNioxNiAqLwotfTsKLQotLyogIEtleSBMZW5ndGggKi8KLSNkZWZpbmUgUE1LX0xFTgkJCQkzMgotI2RlZmluZSBQVEtfTEVOX1RLSVAJCQk2NAotI2RlZmluZSBHVEtfTEVOCQkJCTMyCi0jZGVmaW5lIEtFWV9OT05DRV9MRU4JCQkzMgotCi0KLS8qICBDT01NT04vRG90MTFkLmggKi8KLXN0cnVjdCBjaG5sX3R4cG93ZXJfdHJpcGxlIHsKLQl1OCBGaXJzdENobmw7Ci0JdTggTnVtQ2hubHM7Ci0JczggTWF4VHhQb3dlckluRGJtOwotfTsKLQotCi0vKiAgPT09PT0gQmVsb3cgdGhpcyBsaW5lIGlzIHN5bmMgZnJvbSBTRDcgZHJpdmVyIENPTU1PTi9idF9oY2kuaCA9PT09PSAqLwotLyogIFRoZSBmb2xsb3dpbmcgaXMgZm9yIEJUIDMuMCArIEhTIEhDSSBDT01NQU5EIEVSUk9SUyBDT0RFUyAqLwotCi0jZGVmaW5lIE1heDgwMjExUEFMUERVU2l6ZQkJCTE0OTIKLSNkZWZpbmUgTWF4ODAyMTFBTVBBU1NPQ0xlbgkJCTY3MgotI2RlZmluZSBNaW5HVXNlclByaW8JCQkJCTQKLSNkZWZpbmUgTWF4R1VzZXJQcmlvCQkJCQk3Ci0jZGVmaW5lIEJFVXNlclByaW8wCQkJCQkJMAotI2RlZmluZSBCRVVzZXJQcmlvMQkJCQkJCTMKLSNkZWZpbmUgTWF4ODAyMTFCZWFjb25QZXJpb2QJCTIwMDAKLSNkZWZpbmUgU2hvcnRSYW5nZU1vZGVQb3dlck1heAkJNAotCi0jZGVmaW5lIEJUX0RlZmF1bHRfQ2hubAkJCQkJMTAKLSNkZWZpbmUgQUNMRGF0YUhlYWRlckxlbgkJCQk0Ci0KLSNkZWZpbmUgQlRUb3RhbERhdGFCbG9ja051bQkJCTB4MTAwCi0jZGVmaW5lIEJUTG9jYWxCdWZOdW0JCQkJCTB4MjAwCi0jZGVmaW5lIEJUTWF4RGF0YUJsb2NrTGVuCQkJCTB4ODAwCi0jZGVmaW5lIEJUVE9UQUxCQU5EV0lEVEgJCQkJMHg3NTMwCi0jZGVmaW5lIEJUTUFYQkFOREdVQkFORFdJRFRICQkweDRlMjAKLSNkZWZpbmUgVG1wTG9jYWxCdWZTaXplCQkJCQkweDEwMAotI2RlZmluZSBCVFN5bkRhdGFQYWNrZXRMZW5ndGgJCQkweGZmCi0vKiAgKi8KLQotI2RlZmluZSBCVE1heEF1dGhDb3VudAkJCQkJNQotI2RlZmluZSBCVE1heEFzb2NDb3VudAkJCQkJNQotCi0jZGVmaW5lIE1BWF9MT0dJQ0FMX0xJTktfTlVNCQkJMgkvKiB0ZW1wb3JhcmlseSBkZWZpbmUgKi8KLSNkZWZpbmUgTUFYX0JUX0FTT0NfRU5UUllfTlVNCQkyCS8qIHRlbXBvcmFyaWx5IGRlZmluZSAqLwotCi0jZGVmaW5lIElOVkFMSURfUExfSEFORExFCQkJCTB4ZmYKLSNkZWZpbmUgSU5WQUxJRF9FTlRSWV9OVU0JCQkJMHhmZgotLyogICovCi0KLSNkZWZpbmUgQ0FNX0JUX1NUQVJUX0lOREVYCQkoSEFMRl9DQU1fRU5UUlkgLSA0KSAgIC8qICBNQVhfQlRfQVNPQ19FTlRSWV9OVU0gOiA0ICEhISAqLwotI2RlZmluZSBCVF9IV0NBTV9TVEFSCQkJQ0FNX0JUX1NUQVJUX0lOREVYICAvKiAgV2UgdXNlZCAgSEFMRl9DQU1fRU5UUlkgfiBIQUxGX0NBTV9FTlRSWSAtTUFYX0JUX0FTT0NfRU5UUllfTlVNICovCi0KLWVudW0gaGNpX3N0YXR1cyB7Ci0JSENJX1NUQVRVU19TVUNDRVNTCQkJPSAweDAwLCAvKiBTdWNjZXNzICovCi0JSENJX1NUQVRVU19VTktOT1dfSENJX0NNRAkJPSAweDAxLCAvKiBVbmtub3duIEhDSSBDb21tYW5kICovCi0JSENJX1NUQVRVU19VTktOT1dfQ09OTkVDVF9JRAkJPSAwWDAyLCAvKiBVbmtub3duIENvbm5lY3Rpb24gSWRlbnRpZmllciAqLwotCUhDSV9TVEFUVVNfSFdfRkFJTAkJCT0gMFgwMywgLyogSGFyZHdhcmUgRmFpbHVyZSAqLwotCUhDSV9TVEFUVVNfUEFHRV9USU1FT1VUCQkJPSAwWDA0LCAvKiBQYWdlIFRpbWVvdXQgKi8KLQlIQ0lfU1RBVFVTX0FVVEhfRkFJTAkJCT0gMFgwNSwgLyogQXV0aGVudGljYXRpb24gRmFpbHVyZSAqLwotCUhDSV9TVEFUVVNfUElOX09SX0tFWV9NSVNTSU5HCQk9IDBYMDYsIC8qIFBJTiBvciBLZXkgTWlzc2luZyAqLwotCUhDSV9TVEFUVVNfTUVNX0NBUF9FWENFRUQJCT0gMFgwNywgLyogTWVtb3J5IENhcGFjaXR5IEV4Y2VlZGVkICovCi0JSENJX1NUQVRVU19DT05ORUNUX1RJTUVPVVQJCT0gMFgwOCwgLyogQ29ubmVjdGlvbiBUaW1lb3V0ICovCi0JSENJX1NUQVRVU19DT05ORUNUX0xJTUlUCQk9IDBYMDksIC8qIENvbm5lY3Rpb24gTGltaXQgRXhjZWVkZWQgKi8KLQlIQ0lfU1RBVFVTX1NZTl9DT05ORUNUX0xJTUlUCQk9IDBYMGEsIC8qIFN5bmNocm9ub3VzIENvbm5lY3Rpb24gTGltaXQgVG8gQSBEZXZpY2UgRXhjZWVkZWQgKi8KLQlIQ0lfU1RBVFVTX0FDTF9DT05ORUNUX0VYSVNUUwkJPSAwWDBiLCAvKiBBQ0wgQ29ubmVjdGlvbiBBbHJlYWR5IEV4aXN0cyAqLwotCUhDSV9TVEFUVVNfQ01EX0RJU0FMTE9XCQkJPSAwWDBjLCAvKiBDb21tYW5kIERpc2FsbG93ZWQgKi8KLQlIQ0lfU1RBVFVTX0NPTk5FQ1RfUkpUX0xJTUlUX1JFU09VUkNFCT0gMFgwZCwgLyogQ29ubmVjdGlvbiBSZWplY3RlZCBkdWUgdG8gTGltaXRlZCBSZXNvdXJjZXMgKi8KLQlIQ0lfU1RBVFVTX0NPTk5FQ1RfUkpUX1NFQ19SRUFTT04JPSAwWDBlLCAvKiBDb25uZWN0aW9uIFJlamVjdGVkIER1ZSBUbyBTZWN1cml0eSBSZWFzb25zICovCi0JSENJX1NUQVRVU19DT05ORUNUX1JKVF9VTkFDQ0VQVF9CRF9BRERSCT0gMFgwZiwgLyogQ29ubmVjdGlvbiBSZWplY3RlZCBkdWUgdG8gVW5hY2NlcHRhYmxlIEJEX0FERFIgKi8KLQlIQ0lfU1RBVFVTX0NPTk5FQ1RfQUNDRVBUX1RJTUVPVVQJPSAwWDEwLCAvKiBDb25uZWN0aW9uIEFjY2VwdCBUaW1lb3V0IEV4Y2VlZGVkICovCi0JSENJX1NUQVRVU19VTlNVUFBPUlRfRkVBVFVSRV9QQVJBX1ZBTFVFCT0gMFgxMSwgLyogVW5zdXBwb3J0ZWQgRmVhdHVyZSBvciBQYXJhbWV0ZXIgVmFsdWUgKi8KLQlIQ0lfU1RBVFVTX0lOVkFMSURfSENJX0NNRF9QQVJBX1ZBTFVFCT0gMFgxMiwgLyogSW52YWxpZCBIQ0kgQ29tbWFuZCBQYXJhbWV0ZXJzICovCi0JSENJX1NUQVRVU19SRU1PVEVfVVNFUl9URVJNSU5BVEVfQ09OTkVDVCA9IDBYMTMsIC8qIFJlbW90ZSBVc2VyIFRlcm1pbmF0ZWQgQ29ubmVjdGlvbiAqLwotCUhDSV9TVEFUVVNfUkVNT1RFX0RFVl9URVJNSU5BVEVfTE9XX1JFU09VUkNFID0gMFgxNCwgLyogUmVtb3RlIERldmljZSBUZXJtaW5hdGVkIENvbm5lY3Rpb24gZHVlIHRvIExvdyBSZXNvdXJjZXMgKi8KLQlIQ0lfU1RBVFVTX1JFTU9URV9ERVZfVEVSTUlOQVRFX0NPTk5FQ1RfUE9XRVJfT0ZGID0gMFgxNSwgLyogUmVtb3RlIERldmljZSBUZXJtaW5hdGVkIENvbm5lY3Rpb24gZHVlIHRvIFBvd2VyIE9mZiAqLwotCUhDSV9TVEFUVVNfQ09OTkVDVF9URVJNSU5BVEVfTE9DQUxfSE9TVAk9IDBYMTYsIC8qIENvbm5lY3Rpb24gVGVybWluYXRlZCBCeSBMb2NhbCBIb3N0ICovCi0JSENJX1NUQVRVU19SRVBFQVRFX0FUVEVNUFQJCT0gMFgxNywgLyogUmVwZWF0ZWQgQXR0ZW1wdHMgKi8KLQlIQ0lfU1RBVFVTX1BBSVJfTk9UX0FMTE9XCQk9IDBYMTgsIC8qIFBhaXJpbmcgTm90IEFsbG93ZWQgKi8KLQlIQ0lfU1RBVFVTX1VOS05PV19MTVBfUERVCQk9IDBYMTksIC8qIFVua25vd24gTE1QIFBEVSAqLwotCUhDSV9TVEFUVVNfVU5TVVBQT1JUX1JFTU9URV9MTVBfRkVBVFVSRQk9IDBYMWEsIC8qIFVuc3VwcG9ydGVkIFJlbW90ZSBGZWF0dXJlIC8gVW5zdXBwb3J0ZWQgTE1QIEZlYXR1cmUgKi8KLQlIQ0lfU1RBVFVTX1NPQ19PRkZTRVRfUkVKRUNUCQk9IDBYMWIsIC8qIFNDTyBPZmZzZXQgUmVqZWN0ZWQgKi8KLQlIQ0lfU1RBVFVTX1NPQ19JTlRFUlZBTF9SRUpFQ1QJCT0gMFgxYywgLyogU0NPIEludGVydmFsIFJlamVjdGVkICovCi0JSENJX1NUQVRVU19TT0NfQUlSX01PREVfUkVKRUNUCQk9IDBYMWQsLyogU0NPIEFpciBNb2RlIFJlamVjdGVkICovCi0JSENJX1NUQVRVU19JTlZBTElEX0xNUF9QQVJBCQk9IDBYMWUsIC8qIEludmFsaWQgTE1QIFBhcmFtZXRlcnMgKi8KLQlIQ0lfU1RBVFVTX1VOU1BFQ0lGSUNfRVJST1IJCT0gMFgxZiwgLyogVW5zcGVjaWZpZWQgRXJyb3IgKi8KLQlIQ0lfU1RBVFVTX1VOU1VQUE9SVF9MTVBfUEFSQV9WQUxVRQk9IDBYMjAsIC8qIFVuc3VwcG9ydGVkIExNUCBQYXJhbWV0ZXIgVmFsdWUgKi8KLQlIQ0lfU1RBVFVTX1JPTEVfQ0hBTkdFX05PVF9BTExPVwk9IDBYMjEsIC8qIFJvbGUgQ2hhbmdlIE5vdCBBbGxvd2VkICovCi0JSENJX1NUQVRVU19MTVBfUkVTUE9OU0VfVElNRU9VVAkJPSAwWDIyLCAvKiBMTVAgUmVzcG9uc2UgVGltZW91dCAqLwotCUhDSV9TVEFUVVNfTE1QX0VSUk9SX1RSQU5TQUNUSU9OX0NPTExJU0lPTiA9IDBYMjMsIC8qIExNUCBFcnJvciBUcmFuc2FjdGlvbiBDb2xsaXNpb24gKi8KLQlIQ0lfU1RBVFVTX0xNUF9QRFVfTk9UX0FMTE9XCQk9IDBYMjQsIC8qIExNUCBQRFUgTm90IEFsbG93ZWQgKi8KLQlIQ0lfU1RBVFVTX0VOQ1JZUFRJT05fTU9ERV9OT1RfQUxMT1cJPSAwWDI1LCAvKiBFbmNyeXB0aW9uIE1vZGUgTm90IEFjY2VwdGFibGUgKi8KLQlIQ0lfU1RBVFVTX0xJTktfS0VZX0NBTl9OT1RfQ0hBTkdFCT0gMFgyNiwgLyogTGluayBLZXkgQ2FuIE5vdCBiZSBDaGFuZ2VkICovCi0JSENJX1NUQVRVU19SRVFVRVNUX1FPU19OT1RfU1VQUE9SVAk9IDBYMjcsIC8qIFJlcXVlc3RlZCBRb1MgTm90IFN1cHBvcnRlZCAqLwotCUhDSV9TVEFUVVNfSU5TVEFOVF9QQVNTRUQJCT0gMFgyOCwgLyogSW5zdGFudCBQYXNzZWQgKi8KLQlIQ0lfU1RBVFVTX1BBSVJJTkdfVU5JVF9LRVlfTk9UX1NVUFBPUlQgPSAwWDI5LCAvKiBQYWlyaW5nIFdpdGggVW5pdCBLZXkgTm90IFN1cHBvcnRlZCAqLwotCUhDSV9TVEFUVVNfRElGRkVSRU5UX1RSQU5TQUNUSU9OX0NPTExJU0lPTiA9IDBYMmEsIC8qIERpZmZlcmVudCBUcmFuc2FjdGlvbiBDb2xsaXNpb24gKi8KLQlIQ0lfU1RBVFVTX1JFU0VSVkVfMQkJCT0gMFgyYiwgLyogUmVzZXJ2ZWQgKi8KLQlIQ0lfU1RBVFVTX1FPU19VTkFDQ0VQVF9QQVJBCQk9IDBYMmMsIC8qIFFvUyBVbmFjY2VwdGFibGUgUGFyYW1ldGVyICovCi0JSENJX1NUQVRVU19RT1NfUkVKRUNUCQkJPSAwWDJkLCAvKiBRb1MgUmVqZWN0ZWQgKi8KLQlIQ0lfU1RBVFVTX0NITkxfQ0xBU1NJRklDQVRJT05fTk9UX1NVUFBPUlQgPSAwWDJlLCAvKiBDaGFubmVsIENsYXNzaWZpY2F0aW9uIE5vdCBTdXBwb3J0ZWQgKi8KLQlIQ0lfU1RBVFVTX0lOU1VGRklDSUVOVF9TRUNVUklUWQk9IDBYMmYsIC8qIEluc3VmZmljaWVudCBTZWN1cml0eSAqLwotCUhDSV9TVEFUVVNfUEFSQV9PVVRfT0ZfUkFOR0UJCT0gMHgzMCwgLyogUGFyYW1ldGVyIE91dCBPZiBNYW5kYXRvcnkgUmFuZ2UgKi8KLQlIQ0lfU1RBVFVTX1JFU0VSVkVfMgkJCT0gMFgzMSwgLyogUmVzZXJ2ZWQgKi8KLQlIQ0lfU1RBVFVTX1JPTEVfU1dJVENIX1BFTkRJTkcJCT0gMFgzMiwgLyogUm9sZSBTd2l0Y2ggUGVuZGluZyAqLwotCUhDSV9TVEFUVVNfUkVTRVJWRV8zCQkJPSAwWDMzLCAvKiBSZXNlcnZlZCAqLwotCUhDSV9TVEFUVVNfUkVTRVJWRV9TT0xUX1ZJT0xBVElPTgk9IDBYMzQsIC8qIFJlc2VydmVkIFNsb3QgVmlvbGF0aW9uICovCi0JSENJX1NUQVRVU19ST0xFX1NXSVRDSF9GQUlMCQk9IDBYMzUsIC8qIFJvbGUgU3dpdGNoIEZhaWxlZCAqLwotCUhDSV9TVEFUVVNfRVhURU5EX0lOUVVJUllfUlNQX1RPT19MQVJHRQk9IDBYMzYsIC8qIEV4dGVuZGVkIElucXVpcnkgUmVzcG9uc2UgVG9vIExhcmdlICovCi0JSENJX1NUQVRVU19TRUNfU0lNUExFX1BBSVJJTkdfTk9UX1NVUFBPUlQgPSAwWDM3LCAvKiBTZWN1cmUgU2ltcGxlIFBhaXJpbmcgTm90IFN1cHBvcnRlZCBCeSBIb3N0LiAqLwotCUhDSV9TVEFUVVNfSE9TVF9CVVNZX1BBSVJJTkcJCT0gMFgzOCwgLyogSG9zdCBCdXN5IC0gUGFpcmluZyAqLwotCUhDSV9TVEFUVVNfQ09OTkVDVF9SRUpfTk9UX1NVSVRfQ0hOTF9GT1VORCA9IDBYMzksIC8qIENvbm5lY3Rpb24gUmVqZWN0ZWQgZHVlIHRvIE5vIFN1aXRhYmxlIENoYW5uZWwgRm91bmQgKi8KLQlIQ0lfU1RBVFVTX0NPTlRST0xMRVJfQlVTWQkJPSAwWDNhICAvKiBDT05UUk9MTEVSIEJVU1kgKi8KLX07Ci0KLS8qICAqLwotLyogIFRoZSBmb2xsb3dpbmcgaXMgZm9yIEJUIDMuMCArIEhTIEhDSSBDT01NQU5EICovCi0vKiAgKi8KLQotLyogYml0IDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcgIDggIDkgMTAgMTEgMTIgMTMgMTQgMTUgKi8KLS8qCSB8CU9DRgkJCSAgICAgICAgICAgICB8CSAgIE9HRiAgICAgICB8ICovCi0vKiAgKi8KLQotLyogT0dGIDB4MDEgKi8KLSNkZWZpbmUgTElOS19DT05UUk9MX0NPTU1BTkRTCQkJMHgwMQotZW51bSBsaW5rX2NvbnRyb2xfY29tbWFuZHMgewotCUhDSV9JTlFVSVJZCQkJCQk9IDB4MDAwMSwKLQlIQ0lfSU5RVUlSWV9DQU5DRUwJCQkJPSAweDAwMDIsCi0JSENJX1BFUklPRElDX0lOUVVJUllfTU9ERQkJCT0gMHgwMDAzLAotCUhDSV9FWElUX1BFUklPRElDX0lOUVVJUllfTU9ERQkJCT0gMHgwMDA0LAotCUhDSV9DUkVBVEVfQ09OTkVDVElPTgkJCQk9IDB4MDAwNSwKLQlIQ0lfRElTQ09OTkVDVAkJCQkJPSAweDAwMDYsCi0JSENJX0NSRUFURV9DT05ORUNUSU9OX0NBTkNFTAkJCT0gMHgwMDA4LAotCUhDSV9BQ0NFUFRfQ09OTkVDVElPTlJFUVVFU1QJCQk9IDB4MDAwOSwKLQlIQ0lfUkVKRUNUX0NPTk5FQ1RJT05fUkVRVUVTVAkJCT0gMHgwMDBhLAotCUhDSV9MSU5LX0tFWV9SRVFVRVNUX1JFUExZCQkJPSAweDAwMGIsCi0JSENJX0xJTktfS0VZX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFkJCT0gMHgwMDBjLAotCUhDSV9QSU5fQ09ERV9SRVFVRVNUX1JFUExZCQkJPSAweDAwMGQsCi0JSENJX1BJTl9DT0RFX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFkJCT0gMHgwMDBlLAotCUhDSV9DSEFOR0VfQ09OTkVDVElPTl9QQUNLRVRfVFlQRQkJPSAweDAwMGYsCi0JSENJX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1RFRAkJCT0gMHgwMDExLAotCUhDSV9TRVRfQ09OTkVDVElPTl9FTkNSWVBUSU9OCQkJPSAweDAwMTMsCi0JSENJX0NIQU5HRV9DT05ORUNUSU9OX0xJTktfS0VZCQkJPSAweDAwMTUsCi0JSENJX01BU1RFUl9MSU5LX0tFWQkJCQk9IDB4MDAxNywKLQlIQ0lfUkVNT1RFX05BTUVfUkVRVUVTVAkJCQk9IDB4MDAxOSwKLQlIQ0lfUkVNT1RFX05BTUVfUkVRVUVTVF9DQU5DRUwJCQk9IDB4MDAxYSwKLQlIQ0lfUkVBRF9SRU1PVEVfU1VQUE9SVEVEX0ZFQVRVUkVTCQk9IDB4MDAxYiwKLQlIQ0lfUkVBRF9SRU1PVEVfRVhURU5ERURfRkVBVFVSRVMJCT0gMHgwMDFjLAotCUhDSV9SRUFEX1JFTU9URV9WRVJTSU9OX0lORk9STUFUSU9OCQk9IDB4MDAxZCwKLQlIQ0lfUkVBRF9DTE9DS19PRkZTRVQJCQkJPSAweDAwMWYsCi0JSENJX1JFQURfTE1QX0hBTkRMRQkJCQk9IDB4MDAyMCwKLQlIQ0lfU0VUVVBfU1lOQ0hST05PVVNfQ09OTkVDVElPTgkJPSAweDAwMjgsCi0JSENJX0FDQ0VQVF9TWU5DSFJPTk9VU19DT05ORUNUSU9OX1JFUVVFU1QJPSAweDAwMjksCi0JSENJX1JFSkVDVF9TWU5DSFJPTk9VU19DT05ORUNUSU9OX1JFUVVFU1QJPSAweDAwMmEsCi0JSENJX0lPX0NBUEFCSUxJVFlfUkVRVUVTVF9SRVBMWQkJCT0gMHgwMDJiLAotCUhDSV9VU0VSX0NPTkZJUk1BVElPTl9SRVFVRVNUX1JFUExZCQk9IDB4MDAyYywKLQlIQ0lfVVNFUl9DT05GSVJNQVRJT05fUkVRVUVTVF9ORUdBVElWRV9SRVBMWQk9IDB4MDAyZCwKLQlIQ0lfVVNFUl9QQVNTS0VZX1JFUVVFU1RfUkVQTFkJCQk9IDB4MDAyZSwKLQlIQ0lfVVNFUl9QQVNTS0VZX1JFUVVFU1RORUdBVElWRV9SRVBMWQkJPSAweDAwMmYsCi0JSENJX1JFTU9URV9PT0JfREFUQV9SRVFVRVNUX1JFUExZCQk9IDB4MDAzMCwKLQlIQ0lfUkVNT1RFX09PQl9EQVRBX1JFUVVFU1RfTkVHQVRJVkVfUkVQTFkJPSAweDAwMzMsCi0JSENJX0lPX0NBUEFCSUxJVFlfUkVRVUVTVF9ORUdBVElWRV9SRVBMWQk9IDB4MDAzNCwKLQlIQ0lfQ1JFQVRFX1BIWVNJQ0FMX0xJTksJCQk9IDB4MDAzNSwKLQlIQ0lfQUNDRVBUX1BIWVNJQ0FMX0xJTksJCQk9IDB4MDAzNiwKLQlIQ0lfRElTQ09OTkVDVF9QSFlTSUNBTF9MSU5LCQkJPSAweDAwMzcsCi0JSENJX0NSRUFURV9MT0dJQ0FMX0xJTksJCQkJPSAweDAwMzgsCi0JSENJX0FDQ0VQVF9MT0dJQ0FMX0xJTksJCQkJPSAweDAwMzksCi0JSENJX0RJU0NPTk5FQ1RfTE9HSUNBTF9MSU5LCQkJPSAweDAwM2EsCi0JSENJX0xPR0lDQUxfTElOS19DQU5DRUwJCQkJPSAweDAwM2IsCi0JSENJX0ZMT1dfU1BFQ19NT0RJRlkJCQkJPSAweDAwM2MKLX07Ci0KLS8qIE9HRiAweDAyICovCi0jZGVmaW5lIEhPTERfTU9ERV9DT01NQU5ECQkJCTB4MDIKLWVudW0gaG9sZF9tb2RlX2NvbW1hbmQgewotCUhDSV9IT0xEX01PREUJCQkJCT0gMHgwMDAxLAotCUhDSV9TTklGRl9NT0RFCQkJCQk9IDB4MDAwMiwKLQlIQ0lfRVhJVF9TTklGRl9NT0RFCQkJCT0gMHgwMDAzLAotCUhDSV9QQVJLX1NUQVRFCQkJCQk9IDB4MDAwNSwKLQlIQ0lfRVhJVF9QQVJLX1NUQVRFCQkJCT0gMHgwMDA2LAotCUhDSV9RT1NfU0VUVVAJCQkJCT0gMHgwMDA3LAotCUhDSV9ST0xFX0RJU0NPVkVSWQkJCQk9IDB4MDAwOSwKLQlIQ0lfU1dJVENIX1JPTEUJCQkJCT0gMHgwMDBiLAotCUhDSV9SRUFEX0xJTktfUE9MSUNZX1NFVFRJTkdTCQkJPSAweDAwMGMsCi0JSENJX1dSSVRFX0xJTktfUE9MSUNZX1NFVFRJTkdTCQkJPSAweDAwMGQsCi0JSENJX1JFQURfREVGQVVMVF9MSU5LX1BPTElDWV9TRVRUSU5HUwkJPSAweDAwMGUsCi0JSENJX1dSSVRFX0RFRkFVTFRfTElOS19QT0xJQ1lfU0VUVElOR1MJCT0gMHgwMDBmLAotCUhDSV9GTE9XX1NQRUNJRklDQVRJT04JCQkJPSAweDAwMTAsCi0JSENJX1NOSUZGX1NVQlJBVElORwkJCQk9IDB4MDAxMQotfTsKLQotLyogT0dGIDB4MDMgKi8KLSNkZWZpbmUgT0dGX1NFVF9FVkVOVF9NQVNLX0NPTU1BTkQJCQkweDAzCi1lbnVtIHNldF9ldmVudF9tYXNrX2NvbW1hbmQgewotCUhDSV9TRVRfRVZFTlRfTUFTSwkJCQk9IDB4MDAwMSwKLQlIQ0lfUkVTRVQJCQkJCT0gMHgwMDAzLAotCUhDSV9TRVRfRVZFTlRfRklMVEVSCQkJCT0gMHgwMDA1LAotCUhDSV9GTFVTSAkJCQkJPSAweDAwMDgsCi0JSENJX1JFQURfUElOX1RZUEUJCQkJPSAweDAwMDksCi0JSENJX1dSSVRFX1BJTl9UWVBFCQkJCT0gMHgwMDBhLAotCUhDSV9DUkVBVEVfTkVXX1VOSVRfS0VZCQkJCT0gMHgwMDBiLAotCUhDSV9SRUFEX1NUT1JFRF9MSU5LX0tFWQkJCT0gMHgwMDBkLAotCUhDSV9XUklURV9TVE9SRURfTElOS19LRVkJCQk9IDB4MDAxMSwKLQlIQ0lfREVMRVRFX1NUT1JFRF9MSU5LX0tFWQkJCT0gMHgwMDEyLAotCUhDSV9XUklURV9MT0NBTF9OQU1FCQkJCT0gMHgwMDEzLAotCUhDSV9SRUFEX0xPQ0FMX05BTUUJCQkJPSAweDAwMTQsCi0JSENJX1JFQURfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVAkJPSAweDAwMTUsCi0JSENJX1dSSVRFX0NPTk5FQ1RJT05fQUNDRVBUX1RJTUVPVVQJCT0gMHgwMDE2LAotCUhDSV9SRUFEX1BBR0VfVElNRU9VVAkJCQk9IDB4MDAxNywKLQlIQ0lfV1JJVEVfUEFHRV9USU1FT1VUCQkJCT0gMHgwMDE4LAotCUhDSV9SRUFEX1NDQU5fRU5BQkxFCQkJCT0gMHgwMDE5LAotCUhDSV9XUklURV9TQ0FOX0VOQUJMRQkJCQk9IDB4MDAxYSwKLQlIQ0lfUkVBRF9QQUdFX1NDQU5fQUNUSVZJVFkJCQk9IDB4MDAxYiwKLQlIQ0lfV1JJVEVfUEFHRV9TQ0FOX0FDVElWSVRZCQkJPSAweDAwMWMsCi0JSENJX1JFQURfSU5RVUlSWV9TQ0FOX0FDVElWSVRZCQkJPSAweDAwMWQsCi0JSENJX1dSSVRFX0lOUVVJUllfU0NBTl9BQ1RJVklUWQkJCT0gMHgwMDFlLAotCUhDSV9SRUFEX0FVVEhFTlRJQ0FUSU9OX0VOQUJMRQkJCT0gMHgwMDFmLAotCUhDSV9XUklURV9BVVRIRU5USUNBVElPTl9FTkFCTEUJCQk9IDB4MDAyMCwKLQlIQ0lfUkVBRF9DTEFTU19PRl9ERVZJQ0UJCQk9IDB4MDAyMywKLQlIQ0lfV1JJVEVfQ0xBU1NfT0ZfREVWSUNFCQkJPSAweDAwMjQsCi0JSENJX1JFQURfVk9JQ0VfU0VUVElORwkJCQk9IDB4MDAyNSwKLQlIQ0lfV1JJVEVfVk9JQ0VfU0VUVElORwkJCQk9IDB4MDAyNiwKLQlIQ0lfUkVBRF9BVVRPTUFUSUNfRkxVU0hfVElNRU9VVAkJPSAweDAwMjcsCi0JSENJX1dSSVRFX0FVVE9NQVRJQ19GTFVTSF9USU1FT1VUCQk9IDB4MDAyOCwKLQlIQ0lfUkVBRF9OVU1fQlJPQURDQVNUX1JFVFJBTlNNSVNTSU9OUwkJPSAweDAwMjksCi0JSENJX1dSSVRFX05VTV9CUk9BRENBU1RfUkVUUkFOU01JU1NJT05TCQk9IDB4MDAyYSwKLQlIQ0lfUkVBRF9IT0xEX01PREVfQUNUSVZJVFkJCQk9IDB4MDAyYiwKLQlIQ0lfV1JJVEVfSE9MRF9NT0RFX0FDVElWSVRZCQkJPSAweDAwMmMsCi0JSENJX1JFQURfU1lOQ0hST05PVVNfRkxPV19DT05UUk9MX0VOQUJMRQk9IDB4MDAyZSwKLQlIQ0lfV1JJVEVfU1lOQ0hST05PVVNfRkxPV19DT05UUk9MX0VOQUJMRQk9IDB4MDAyZiwKLQlIQ0lfU0VUX0NPTlRST0xMRVJfVE9fSE9TVF9GTE9XX0NPTlRST0wJCT0gMHgwMDMxLAotCUhDSV9IT1NUX0JVRkZFUl9TSVpFCQkJCT0gMHgwMDMzLAotCUhDSV9IT1NUX05VTUJFUl9PRl9DT01QTEVURURfUEFDS0VUUwkJPSAweDAwMzUsCi0JSENJX1JFQURfTElOS19TVVBFUlZJU0lPTl9USU1FT1VUCQk9IDB4MDAzNiwKLQlIQ0lfV1JJVEVfTElOS19TVVBFUlZJU0lPTl9USU1FT1VUCQk9IDB4MDAzNywKLQlIQ0lfUkVBRF9OVU1CRVJfT0ZfU1VQUE9SVEVEX0lBQwkJPSAweDAwMzgsCi0JSENJX1JFQURfQ1VSUkVOVF9JQUNfTEFQCQkJPSAweDAwMzksCi0JSENJX1dSSVRFX0NVUlJFTlRfSUFDX0xBUAkJCT0gMHgwMDNhLAotCUhDSV9SRUFEX1BBR0VfU0NBTl9NT0RFCQkJCT0gMHgwMDNkLAotCUhDSV9XUklURV9QQUdFX1NDQU5fTU9ERQkJCT0gMHgwMDNlLAotCUhDSV9TRVRfQUZIX0hPU1RfQ0hBTk5FTF9DTEFTU0lGSUNBVElPTgkJPSAweDAwM2YsCi0JSENJX1JFQURfSU5RVUlSWV9TQ0FOX1RZUEUJCQk9IDB4MDA0MiwKLQlIQ0lfV1JJVEVfSU5RVUlSWV9TQ0FOX1RZUEUJCQk9IDB4MDA0MywKLQlIQ0lfUkVBRF9JTlFVSVJZX01PREUJCQkJPSAweDAwNDQsCi0JSENJX1dSSVRFX0lOUVVJUllfTU9ERQkJCQk9IDB4MDA0NSwKLQlIQ0lfUkVBRF9QQUdFX1NDQU5fVFlQRQkJCQk9IDB4MDA0NiwKLQlIQ0lfV1JJVEVfUEFHRV9TQ0FOX1RZUEUJCQk9IDB4MDA0NywKLQlIQ0lfUkVBRF9BRkhfQ0hBTk5FTF9BU1NFU1NNRU5UX01PREUJCT0gMHgwMDQ4LAotCUhDSV9XUklURV9BRkhfQ0hBTk5FTF9BU1NFU1NNRU5UX01PREUJCT0gMHgwMDQ5LAotCUhDSV9SRUFEX0VYVEVOREVEX0lOUVVJUllfUkVTUE9OU0UJCT0gMHgwMDUxLAotCUhDSV9XUklURV9FWFRFTkRFRF9JTlFVSVJZX1JFU1BPTlNFCQk9IDB4MDA1MiwKLQlIQ0lfUkVGUkVTSF9FTkNSWVBUSU9OX0tFWQkJCT0gMHgwMDUzLAotCUhDSV9SRUFEX1NJTVBMRV9QQUlSSU5HX01PREUJCQk9IDB4MDA1NSwKLQlIQ0lfV1JJVEVfU0lNUExFX1BBSVJJTkdfTU9ERQkJCT0gMHgwMDU2LAotCUhDSV9SRUFEX0xPQ0FMX09PQl9EQVRBCQkJCT0gMHgwMDU3LAotCUhDSV9SRUFEX0lOUVVJUllfUkVTUE9OU0VfVFJBTlNNSVRfUE9XRVJfTEVWRUwJPSAweDAwNTgsCi0JSENJX1dSSVRFX0lOUVVJUllfVFJBTlNNSVRfUE9XRVJfTEVWRUwJCT0gMHgwMDU5LAotCUhDSV9SRUFEX0RFRkFVTFRfRVJST05FT1VTX0RBVEFfUkVQT1JUSU5HCT0gMHgwMDVhLAotCUhDSV9XUklURV9ERUZBVUxUX0VSUk9ORU9VU19EQVRBX1JFUE9SVElORwk9IDB4MDA1YiwKLQlIQ0lfRU5IQU5DRURfRkxVU0gJCQkJPSAweDAwNWYsCi0JSENJX1NFTkRfS0VZUFJFU1NfTk9USUZJQ0FUSU9OCQkJPSAweDAwNjAsCi0JSENJX1JFQURfTE9HSUNBTF9MSU5LX0FDQ0VQVF9USU1FT1VUCQk9IDB4MDA2MSwKLQlIQ0lfV1JJVEVfTE9HSUNBTF9MSU5LX0FDQ0VQVF9USU1FT1VUCQk9IDB4MDA2MiwKLQlIQ0lfU0VUX0VWRU5UX01BU0tfUEFHRV8yCQkJPSAweDAwNjMsCi0JSENJX1JFQURfTE9DQVRJT05fREFUQQkJCQk9IDB4MDA2NCwKLQlIQ0lfV1JJVEVfTE9DQVRJT05fREFUQQkJCQk9IDB4MDA2NSwKLQlIQ0lfUkVBRF9GTE9XX0NPTlRST0xfTU9ERQkJCT0gMHgwMDY2LAotCUhDSV9XUklURV9GTE9XX0NPTlRST0xfTU9ERQkJCT0gMHgwMDY3LAotCUhDSV9SRUFEX0VOSEFOQ0VfVFJBTlNNSVRfUE9XRVJfTEVWRUwJCT0gMHgwMDY4LAotCUhDSV9SRUFEX0JFU1RfRUZGT1JUX0ZMVVNIX1RJTUVPVVQJCT0gMHgwMDY5LAotCUhDSV9XUklURV9CRVNUX0VGRk9SVF9GTFVTSF9USU1FT1VUCQk9IDB4MDA2YSwKLQlIQ0lfU0hPUlRfUkFOR0VfTU9ERQkJCQk9IDB4MDA2YgotfTsKLQotLyogT0dGIDB4MDQgKi8KLSNkZWZpbmUgT0dGX0lORk9STUFUSU9OQUxfUEFSQU1FVEVSUwkJCTB4MDQKLWVudW0gaW5mb3JtYXRpb25hbF9wYXJhbXMgewotCUhDSV9SRUFEX0xPQ0FMX1ZFUlNJT05fSU5GT1JNQVRJT04JCT0gMHgwMDAxLAotCUhDSV9SRUFEX0xPQ0FMX1NVUFBPUlRFRF9DT01NQU5EUwkJPSAweDAwMDIsCi0JSENJX1JFQURfTE9DQUxfU1VQUE9SVEVEX0ZFQVRVUkVTCQk9IDB4MDAwMywKLQlIQ0lfUkVBRF9MT0NBTF9FWFRFTkRFRF9GRUFUVVJFUwkJPSAweDAwMDQsCi0JSENJX1JFQURfQlVGRkVSX1NJWkUJCQkJPSAweDAwMDUsCi0JSENJX1JFQURfQkRfQUREUgkJCQk9IDB4MDAwOSwKLQlIQ0lfUkVBRF9EQVRBX0JMT0NLX1NJWkUJCQk9IDB4MDAwYQotfTsKLQotLyogT0dGIDB4MDUgKi8KLSNkZWZpbmUgT0dGX1NUQVRVU19QQVJBTUVURVJTCQkJCTB4MDUKLWVudW0gc3RhdHVzX3BhcmFtcyB7Ci0JSENJX1JFQURfRkFJTEVEX0NPTlRBQ1RfQ09VTlRFUgkJCT0gMHgwMDAxLAotCUhDSV9SRVNFVF9GQUlMRURfQ09OVEFDVF9DT1VOVEVSCQk9IDB4MDAwMiwKLQlIQ0lfUkVBRF9MSU5LX1FVQUxJVFkJCQkJPSAweDAwMDMsCi0JSENJX1JFQURfUlNTSQkJCQkJPSAweDAwMDUsCi0JSENJX1JFQURfQUZIX0NIQU5ORUxfTUFQCQkJPSAweDAwMDYsCi0JSENJX1JFQURfQ0xPQ0sJCQkJCT0gMHgwMDA3LAotCUhDSV9SRUFEX0VOQ1JZUFRJT05fS0VZX1NJWkUJCQk9IDB4MDAwOCwKLQlIQ0lfUkVBRF9MT0NBTF9BTVBfSU5GTwkJCQk9IDB4MDAwOSwKLQlIQ0lfUkVBRF9MT0NBTF9BTVBfQVNTT0MJCQk9IDB4MDAwYSwKLQlIQ0lfV1JJVEVfUkVNT1RFX0FNUF9BU1NPQwkJCT0gMHgwMDBiCi19OwotCi0vKiBPR0YgMHgwNiAqLwotI2RlZmluZSBPR0ZfVEVTVElOR19DT01NQU5EUwkJCQkweDA2Ci1lbnVtIHRlc3RpbmdfY29tbWFuZHMgewotCUhDSV9SRUFEX0xPT1BCQUNLX01PREUJCQkJPSAweDAwMDEsCi0JSENJX1dSSVRFX0xPT1BCQUNLX01PREUJCQkJPSAweDAwMDIsCi0JSENJX0VOQUJMRV9ERVZJQ0VfVU5ERVJfVEVTVF9NT0RFCQk9IDB4MDAwMywKLQlIQ0lfV1JJVEVfU0lNUExFX1BBSVJJTkdfREVCVUdfTU9ERQkJPSAweDAwMDQsCi0JSENJX0VOQUJMRV9BTVBfUkVDRUlWRVJfUkVQT1JUUwkJCT0gMHgwMDA3LAotCUhDSV9BTVBfVEVTVF9FTkQJCQkJPSAweDAwMDgsCi0JSENJX0FNUF9URVNUX0NPTU1BTkQJCQkJPSAweDAwMDkKLX07Ci0KLS8qIE9HRiAweDNmICovCi0jZGVmaW5lIE9HRl9FWFRFTlNJT04JCQkJCTBYM2YKLWVudW0gaGNpX2V4dGVuc2lvbl9jb21tYW5kcyB7Ci0JSENJX1NFVF9BQ0xfTElOS19EQVRBX0ZMT1dfTU9ERQkJCT0gMHgwMDEwLAotCUhDSV9TRVRfQUNMX0xJTktfU1RBVFVTCQkJCT0gMHgwMDIwLAotCUhDSV9TRVRfU0NPX0xJTktfU1RBVFVTCQkJCT0gMHgwMDMwLAotCUhDSV9TRVRfUlNTSV9WQUxVRQkJCQk9IDB4MDA0MCwKLQlIQ0lfU0VUX0NVUlJFTlRfQkxVRVRPT1RIX1NUQVRVUwkJPSAweDAwNDEsCi0KLQkvKiBUaGUgZm9sbG93aW5nIGlzIGZvciBSVEs4NzIzICovCi0JSENJX0VYVEVOU0lPTl9WRVJTSU9OX05PVElGWQkJCT0gMHgwMTAwLAotCUhDSV9MSU5LX1NUQVRVU19OT1RJRlkJCQkJPSAweDAxMDEsCi0JSENJX0JUX09QRVJBVElPTl9OT1RJRlkJCQkJPSAweDAxMDIsCi0JSENJX0VOQUJMRV9XSUZJX1NDQU5fTk9USUZZCQkJPSAweDAxMDMsCi0KLQotCS8qIFRoZSBmb2xsb3dpbmcgaXMgZm9yIElWVCAqLwotCUhDSV9XSUZJX0NVUlJFTlRfQ0hBTk5FTAkJCT0gMHgwMzAwLAotCUhDSV9XSUZJX0NVUlJFTlRfQkFORFdJRFRICQkJPSAweDAzMDEsCi0JSENJX1dJRklfQ09OTkVDVElPTl9TVEFUVVMJCQk9IDB4MDMwMiwKLX07Ci0KLWVudW0gYnRfc3BlYyB7Ci0JQlRfU1BFQ18xXzBfYgkJCQkJPSAweDAwLAotCUJUX1NQRUNfMV8xCQkJCQk9IDB4MDEsCi0JQlRfU1BFQ18xXzIJCQkJCT0gMHgwMiwKLQlCVF9TUEVDXzJfMF9FRFIJCQkJCT0gMHgwMywKLQlCVF9TUEVDXzJfMV9FRFIJCQkJCT0gMHgwNCwKLQlCVF9TUEVDXzNfMF9IUwkJCQkJPSAweDA1LAotCUJUX1NQRUNfNF8wCQkJCQk9IDB4MDYKLX07Ci0KLS8qICBUaGUgZm9sbG93aW5nIGlzIGZvciBCVCAzLjAgKyBIUyBFVkVOVFMgKi8KLWVudW0gaGNpX2V2ZW50IHsKLQlIQ0lfRVZFTlRfSU5RVUlSWV9DT01QTEVURQkJCT0gMHgwMSwKLQlIQ0lfRVZFTlRfSU5RVUlSWV9SRVNVTFQJCQk9IDB4MDIsCi0JSENJX0VWRU5UX0NPTk5FQ1RJT05fQ09NUExFVEUJCQk9IDB4MDMsCi0JSENJX0VWRU5UX0NPTk5FQ1RJT05fUkVRVUVTVAkJCT0gMHgwNCwKLQlIQ0lfRVZFTlRfRElTQ09OTkVDVElPTl9DT01QTEVURQkJPSAweDA1LAotCUhDSV9FVkVOVF9BVVRIRU5USUNBVElPTl9DT01QTEVURQkJPSAweDA2LAotCUhDSV9FVkVOVF9SRU1PVEVfTkFNRV9SRVFVRVNUX0NPTVBMRVRFCQk9IDB4MDcsCi0JSENJX0VWRU5UX0VOQ1JZUFRJT05fQ0hBTkdFCQkJPSAweDA4LAotCUhDSV9FVkVOVF9DSEFOR0VfTElOS19LRVlfQ09NUExFVEUJCT0gMHgwOSwKLQlIQ0lfRVZFTlRfTUFTVEVSX0xJTktfS0VZX0NPTVBMRVRFCQk9IDB4MGEsCi0JSENJX0VWRU5UX1JFQURfUkVNT1RFX1NVUFBPUlRfRkVBVFVSRVNfQ09NUExFVEUJPSAweDBiLAotCUhDSV9FVkVOVF9SRUFEX1JFTU9URV9WRVJfSU5GT19DT01QTEVURQkJPSAweDBjLAotCUhDSV9FVkVOVF9RT1NfU0VUVVBfQ09NUExFVEUJCQk9IDB4MGQsCi0JSENJX0VWRU5UX0NPTU1BTkRfQ09NUExFVEUJCQk9IDB4MGUsCi0JSENJX0VWRU5UX0NPTU1BTkRfU1RBVFVTCQkJPSAweDBmLAotCUhDSV9FVkVOVF9IQVJEV0FSRV9FUlJPUgkJCT0gMHgxMCwKLQlIQ0lfRVZFTlRfRkxVU0hfT0NDUlVFRAkJCQk9IDB4MTEsCi0JSENJX0VWRU5UX1JPTEVfQ0hBTkdFCQkJCT0gMHgxMiwKLQlIQ0lfRVZFTlRfTlVNQkVSX09GX0NPTVBMRVRFX1BBQ0tFVFMJCT0gMHgxMywKLQlIQ0lfRVZFTlRfTU9ERV9DSEFOR0UJCQkJPSAweDE0LAotCUhDSV9FVkVOVF9SRVRVUk5fTElOS19LRVlTCQkJPSAweDE1LAotCUhDSV9FVkVOVF9QSU5fQ09ERV9SRVFVRVNUCQkJPSAweDE2LAotCUhDSV9FVkVOVF9MSU5LX0tFWV9SRVFVRVNUCQkJPSAweDE3LAotCUhDSV9FVkVOVF9MSU5LX0tFWV9OT1RJRklDQVRJT04JCQk9IDB4MTgsCi0JSENJX0VWRU5UX0xPT1BCQUNLX0NPTU1BTkQJCQk9IDB4MTksCi0JSENJX0VWRU5UX0RBVEFfQlVGRkVSX09WRVJGTE9XCQkJPSAweDFhLAotCUhDSV9FVkVOVF9NQVhfU0xPVFNfQ0hBTkdFCQkJPSAweDFiLAotCUhDSV9FVkVOVF9SRUFEX0NMT0NLX09GRlNFVF9DT01QTEVURQkJPSAweDFjLAotCUhDSV9FVkVOVF9DT05ORUNUX1BBQ0tFVF9UWVBFX0NIQU5HRQkJPSAweDFkLAotCUhDSV9FVkVOVF9RT1NfVklPTEFUSU9OCQkJCT0gMHgxZSwKLQlIQ0lfRVZFTlRfUEFHRV9TQ0FOX1JFUEVUSVRJT05fTU9ERV9DSEFOR0UJPSAweDIwLAotCUhDSV9FVkVOVF9GTE9XX1NFUENfQ09NUExFVEUJCQk9IDB4MjEsCi0JSENJX0VWRU5UX0lOUVVJUllfUkVTVUxUX1dJVEhfUlNTSQkJPSAweDIyLAotCUhDSV9FVkVOVF9SRUFEX1JFTU9URV9FWFRfRkVBVFVSRVNfQ09NUExFVEUJPSAweDIzLAotCUhDSV9FVkVOVF9TWU5DX0NPTk5FQ1RfQ09NUExFVEUJCQk9IDB4MmMsCi0JSENJX0VWRU5UX1NZTkNfQ09OTkVDVF9DSEFOR0UJCQk9IDB4MmQsCi0JSENJX0VWRU5UX1NOSUZGRVJfU1VCUkFUSU5HCQkJPSAweDJlLAotCUhDSV9FVkVOVF9FWFRFTlRFRF9JTlFVSVJZX1JFU1VMVAkJPSAweDJmLAotCUhDSV9FVkVOVF9FTkNSWVBUSU9OX0tFWV9SRUZMQVNIX0NPTVBMRVRFCT0gMHgzMCwKLQlIQ0lfRVZFTlRfSU9fQ0FQSUJJTElUWV9DT01QTEVURQkJPSAweDMxLAotCUhDSV9FVkVOVF9JT19DQVBJQklMSVRZX1JFU1BPTlNFCQk9IDB4MzIsCi0JSENJX0VWRU5UX1VTRVJfQ09ORklSTVRJT05fUkVRVUVTVAkJPSAweDMzLAotCUhDSV9FVkVOVF9VU0VSX1BBU1NLRVlfUkVRVUVTVAkJCT0gMHgzNCwKLQlIQ0lfRVZFTlRfUkVNT1RFX09PQl9EQVRBX1JFUVVFU1QJCT0gMHgzNSwKLQlIQ0lfRVZFTlRfU0lNUExFX1BBSVJJTkdfQ09NUExFVEUJCT0gMHgzNiwKLQlIQ0lfRVZFTlRfTElOS19TVVBFUlZJU0lPTl9USU1FT1VUX0NIQU5HRQk9IDB4MzgsCi0JSENJX0VWRU5UX0VOSEFOQ0VEX0ZMVVNIX0NPTVBMRVRFCQk9IDB4MzksCi0JSENJX0VWRU5UX1VTRVJfUEFTU0tFWV9OT1RJRklDQVRJT04JCT0gMHgzYiwKLQlIQ0lfRVZFTlRfS0VZUFJFU1NfTk9USUZJQ0FUSU9OCQkJPSAweDNjLAotCUhDSV9FVkVOVF9SRU1PVEVfSE9TVF9TVVBQT1JUX0ZFQVRVUkVTX05PVElGSUNBVElPTgk9IDB4M2QsCi0JSENJX0VWRU5UX1BIWV9MSU5LX0NPTVBMRVRFCQkJPSAweDQwLAotCUhDSV9FVkVOVF9DSEFOTkVMX1NFTEVDVAkJCT0gMHg0MSwKLQlIQ0lfRVZFTlRfRElTQ09OTkVDVF9QSFlfTElOS19DT01QTEVURQkJPSAweDQyLAotCUhDSV9FVkVOVF9QSFlfTElOS19MT1NTX0VBUkxZX1dBUk5JTkcJCT0gMHg0MywKLQlIQ0lfRVZFTlRfUEhZX0xJTktfUkVDT1ZFUgkJCT0gMHg0NCwKLQlIQ0lfRVZFTlRfTE9HSUNBTF9MSU5LX0NPTVBMRVRFCQkJPSAweDQ1LAotCUhDSV9FVkVOVF9ESVNDT05ORUNUX0xPR0lDQUxfTElOS19DT01QTEVURQk9IDB4NDYsCi0JSENJX0VWRU5UX0ZMT1dfU1BFQ19NT0RJRllfQ09NUExFVEUJCT0gMHg0NywKLQlIQ0lfRVZFTlRfTlVNX09GX0NPTVBMRVRFX0RBVEFfQkxPQ0tTCQk9IDB4NDgsCi0JSENJX0VWRU5UX0FNUF9TVEFSVF9URVNUCQkJPSAweDQ5LAotCUhDSV9FVkVOVF9BTVBfVEVTVF9FTkQJCQkJPSAweDRhLAotCUhDSV9FVkVOVF9BTVBfUkVDRUlWRVJfUkVQT1JUCQkJPSAweDRiLAotCUhDSV9FVkVOVF9TSE9SVF9SQU5HRV9NT0RFX0NIQU5HRV9DT01QTEVURQk9IDB4NGMsCi0JSENJX0VWRU5UX0FNUF9TVEFUVVNfQ0hBTkdFCQkJPSAweDRkLAotCUhDSV9FVkVOVF9FWFRFTlNJT05fUlRLCQkJCT0gMHhmZSwKLQlIQ0lfRVZFTlRfRVhURU5TSU9OX01PVE8JCQk9IDB4ZmYsCi19OwotCi1lbnVtIGhjaV9leHRlbnNpb25fZXZlbnRfbW90byB7Ci0JSENJX0VWRU5UX0dFVF9CVF9SU1NJCQkJCT0gMHgwMSwKLX07Ci0KLWVudW0gaGNpX2V4dGVuc2lvbl9ldmVudCB7Ci0JSENJX0VWRU5UX0VYVF9XSUZJX1NDQU5fTk9USUZZCQkJPSAweDAxLAotfTsKLQotZW51bSBoY2lfZXZlbnRfbWFza19wYWdlXzIgewotCUVNUDJfSENJX0VWRU5UX1BIWV9MSU5LX0NPTVBMRVRFCQk9IDB4MDAwMDAwMDAwMDAwMDAwMSwKLQlFTVAyX0hDSV9FVkVOVF9DSEFOTkVMX1NFTEVDVAkJCT0gMHgwMDAwMDAwMDAwMDAwMDAyLAotCUVNUDJfSENJX0VWRU5UX0RJU0NPTk5FQ1RfUEhZX0xJTktfQ09NUExFVEUJPSAweDAwMDAwMDAwMDAwMDAwMDQsCi0JRU1QMl9IQ0lfRVZFTlRfUEhZX0xJTktfTE9TU19FQVJMWV9XQVJOSU5HCT0gMHgwMDAwMDAwMDAwMDAwMDA4LAotCUVNUDJfSENJX0VWRU5UX1BIWV9MSU5LX1JFQ09WRVIJCQk9IDB4MDAwMDAwMDAwMDAwMDAxMCwKLQlFTVAyX0hDSV9FVkVOVF9MT0dJQ0FMX0xJTktfQ09NUExFVEUJCT0gMHgwMDAwMDAwMDAwMDAwMDIwLAotCUVNUDJfSENJX0VWRU5UX0RJU0NPTk5FQ1RfTE9HSUNBTF9MSU5LX0NPTVBMRVRFCT0gMHgwMDAwMDAwMDAwMDAwMDQwLAotCUVNUDJfSENJX0VWRU5UX0ZMT1dfU1BFQ19NT0RJRllfQ09NUExFVEUJPSAweDAwMDAwMDAwMDAwMDAwODAsCi0JRU1QMl9IQ0lfRVZFTlRfTlVNX09GX0NPTVBMRVRFX0RBVEFfQkxPQ0tTCT0gMHgwMDAwMDAwMDAwMDAwMTAwLAotCUVNUDJfSENJX0VWRU5UX0FNUF9TVEFSVF9URVNUCQkJPSAweDAwMDAwMDAwMDAwMDAyMDAsCi0JRU1QMl9IQ0lfRVZFTlRfQU1QX1RFU1RfRU5ECQkJPSAweDAwMDAwMDAwMDAwMDA0MDAsCi0JRU1QMl9IQ0lfRVZFTlRfQU1QX1JFQ0VJVkVSX1JFUE9SVAkJPSAweDAwMDAwMDAwMDAwMDA4MDAsCi0JRU1QMl9IQ0lfRVZFTlRfU0hPUlRfUkFOR0VfTU9ERV9DSEFOR0VfQ09NUExFVEUJPSAweDAwMDAwMDAwMDAwMDEwMDAsCi0JRU1QMl9IQ0lfRVZFTlRfQU1QX1NUQVRVU19DSEFOR0UJCT0gMHgwMDAwMDAwMDAwMDAyMDAwLAotfTsKLQotZW51bSBoY2lfc3RhdGVfbWFjaGluZSB7Ci0JSENJX1NUQVRFX1NUQVJUSU5HCQkJPSAweDAxLAotCUhDSV9TVEFURV9DT05ORUNUSU5HCQkJPSAweDAyLAotCUhDSV9TVEFURV9BVVRIRU5USUNBVElORwkJPSAweDA0LAotCUhDSV9TVEFURV9DT05ORUNURUQJCQk9IDB4MDgsCi0JSENJX1NUQVRFX0RJU0NPTk5FQ1RJTkcJCQk9IDB4MTAsCi0JSENJX1NUQVRFX0RJU0NPTk5FQ1RFRAkJCT0gMHgyMAotfTsKLQotZW51bSBhbXBfYXNzb2Nfc3RydWN0dXJlX3R5cGUgewotCUFNUF9NQUNfQUREUgkJCQk9IDB4MDEsCi0JQU1QX1BSRUZFUlJFRF9DSEFOTkVMX0xJU1QJCT0gMHgwMiwKLQlBTVBfQ09OTkVDVEVEX0NIQU5ORUwJCQk9IDB4MDMsCi0JQU1QXzgwMjExX1BBTF9DQVBfTElTVAkJCT0gMHgwNCwKLQlBTVBfODAyMTFfUEFMX1ZJU0lPTgkJCT0gMHgwNSwKLQlBTVBfUkVTRVJWRURfRk9SX1RFU1RJTkcJCT0gMHgzMwotfTsKLQotZW51bSBhbXBfYnRhcF90eXBlIHsKLQlBTVBfQlRBUF9OT05FLAotCUFNUF9CVEFQX0NSRUFUT1IsCi0JQU1QX0JUQVBfSk9JTkVSCi19OwotCi1lbnVtIGhjaV9zdGF0ZV93aXRoX2NtZCB7Ci0JU1RBVEVfQ01EX0NSRUFURV9QSFlfTElOSywKLQlTVEFURV9DTURfQUNDRVBUX1BIWV9MSU5LLAotCVNUQVRFX0NNRF9ESVNDT05ORUNUX1BIWV9MSU5LLAotCVNUQVRFX0NNRF9DT05ORUNUX0FDQ0VQVF9USU1FT1VULAotCVNUQVRFX0NNRF9NQUNfU1RBUlRfQ09NUExFVEUsCi0JU1RBVEVfQ01EX01BQ19TVEFSVF9GQUlMRUQsCi0JU1RBVEVfQ01EX01BQ19DT05ORUNUX0NPTVBMRVRFLAotCVNUQVRFX0NNRF9NQUNfQ09OTkVDVF9GQUlMRUQsCi0JU1RBVEVfQ01EX01BQ19ESVNDT05ORUNUX0lORElDQVRFLAotCVNUQVRFX0NNRF9NQUNfQ09OTkVDVF9DQU5DRUxfSU5ESUNBVEUsCi0JU1RBVEVfQ01EXzRXQVlfRkFJTEVELAotCVNUQVRFX0NNRF80V0FZX1NVQ0NFU1NFRCwKLQlTVEFURV9DTURfRU5URVJfU1RBVEUsCi0JU1RBVEVfQ01EX05PX1NVQ0hfQ01ELAotfTsKLQotZW51bSBoY2lfc2VydmljZV90eXBlIHsKLQlTRVJWSUNFX05PX1RSQUZGSUMsCi0JU0VSVklDRV9CRVNUX0VGRk9SVCwKLQlTRVJWSUNFX0dVQVJBTlRFRQotfTsKLQotZW51bSBoY2lfdHJhZmZpY19tb2RlIHsKLQlUUkFGRklDX01PREVfQkVTVF9FRkZPUlQJCQk9IDB4MDAsCi0JVFJBRkZJQ19NT0RFX0dVQVJBTlRFRURfTEFURU5DWQkJCT0gMHgwMSwKLQlUUkFGRklDX01PREVfR1VBUkFOVEVFRF9CQU5EV0lEVEgJCT0gMHgwMiwKLQlUUkFGRklDX01PREVfR1VBUkFOVEVFRF9MQVRFTkNZX0FORF9CQU5EV0lEVEgJPSAweDAzCi19OwotCi0jZGVmaW5lIEhDSU9QQ09ERShfT0NGLCBfT0dGKQkJKF9PR0Y8PDEwfF9PQ0YpCi0jZGVmaW5lIEhDSU9QQ09ERUxPVyhfT0NGLCBfT0dGKQkodTgpKEhDSU9QQ09ERShfT0NGLCBfT0dGKSYweDAwZmYpCi0jZGVmaW5lIEhDSU9QQ09ERUhJR0hUKF9PQ0YsIF9PR0YpCSh1OCkoSENJT1BDT0RFKF9PQ0YsIF9PR0YpPj44KQotCi0jZGVmaW5lIFRXT0JZVEVfSElHSFRCWVRFKF9EQVRBKQkodTgpKF9EQVRBPj44KQotI2RlZmluZSBUV09CWVRFX0xPV0JZVEUoX0RBVEEpCQkodTgpKF9EQVRBKQotCi1lbnVtIGFtcF9zdGF0dXMgewotCUFNUF9TVEFUVVNfQVZBX1BIWV9QV1JfRFdOCQk9IDB4MCwKLQlBTVBfU1RBVFVTX0JUX1VTRV9PTkxZCQkJPSAweDEsCi0JQU1QX1NUQVRVU19OT19DQVBBQ0lUWV9GT1JfQlQJCT0gMHgyLAotCUFNUF9TVEFUVVNfTE9XX0NBUEFDSVRZX0ZPUl9CVAkJPSAweDMsCi0JQU1QX1NUQVRVU19NRURJVU1fQ0FQQUNJVFlfRk9SX0JUCT0gMHg0LAotCUFNUF9TVEFUVVNfSElHSF9DQVBBQ0lUWV9GT1JfQlQJCT0gMHg1LAotCUFNUF9TVEFUVVNfRlVMTF9DQVBBQ0lUWV9GT1JfQlQJCT0gMHg2Ci19OwotCi1lbnVtIGJ0X3dwYV9tc2dfdHlwZSB7Ci0JVHlwZV9CVF80d2F5MXN0CT0gMCwKLQlUeXBlX0JUXzR3YXkybmQJPSAxLAotCVR5cGVfQlRfNHdheTNyZAk9IDIsCi0JVHlwZV9CVF80d2F5NHRoCT0gMywKLQlUeXBlX0JUX3Vua25vdwk9IDQKLX07Ci0KLWVudW0gYnRfY29ubmVjdF90eXBlIHsKLQlCVF9DT05ORUNUX0FVVEhfUkVRCQkJPSAweDAwLAotCUJUX0NPTk5FQ1RfQVVUSF9SU1AJCQk9IDB4MDEsCi0JQlRfQ09OTkVDVF9BU09DX1JFUQkJCT0gMHgwMiwKLQlCVF9DT05ORUNUX0FTT0NfUlNQCQkJPSAweDAzLAotCUJUX0RJU0NPTk5FQ1QJCQkJPSAweDA0Ci19OwotCi1lbnVtIGJ0X2xsX3NlcnZpY2VfdHlwZSB7Ci0JQlRfTExfQkUgPSAweDAxLAotCUJUX0xMX0dVID0gMHgwMgotfTsKLQotZW51bSBidF9sbF9mbG93c3BlYyB7Ci0JQlRfVFhfQkVfRlMsCQkJLyogVFggYmVzdCBlZmZvcnQgZmxvd3NwZWMgKi8KLQlCVF9SWF9CRV9GUywJCQkvKiBSWCBiZXN0IGVmZm9ydCBmbG93c3BlYyAqLwotCUJUX1RYX0dVX0ZTLAkJCS8qIFRYIGd1YXJhbnRlZWQgbGF0ZW5jeSBmbG93c3BlYyAqLwotCUJUX1JYX0dVX0ZTLAkJCS8qIFJYIGd1YXJhbnRlZWQgbGF0ZW5jeSBmbG93c3BlYyAqLwotCUJUX1RYX0JFX0FHR19GUywJCS8qIFRYIGFnZ3JlZ2F0ZWQgYmVzdCBlZmZvcnQgZmxvd3NwZWMgKi8KLQlCVF9SWF9CRV9BR0dfRlMsCQkvKiBSWCBhZ2dyZWdhdGVkIGJlc3QgZWZmb3J0IGZsb3dzcGVjICovCi0JQlRfVFhfR1VfQldfRlMsCQkJLyogVFggZ3VhcmFudGVlZCBiYW5kd2lkdGggZmxvd3NwZWMgKi8KLQlCVF9SWF9HVV9CV19GUywJCQkvKiBSWCBndWFyYW50ZWVkIGJhbmR3aWR0aCBmbG93c3BlYyAqLwotCUJUX1RYX0dVX0xBUkdFX0ZTLAkJLyogVFggZ3VhcmFudGVlZCBsYXRlbmN5IGZsb3dzcGVjLCBmb3IgdGVzdGluZyBvbmx5ICovCi0JQlRfUlhfR1VfTEFSR0VfRlMsCQkvKiBSWCBndWFyYW50ZWVkIGxhdGVuY3kgZmxvd3NwZWMsIGZvciB0ZXN0aW5nIG9ubHkgKi8KLX07Ci0KLWVudW0gYnRfdHJhZmZpY19tb2RlIHsKLQlCVF9NT1RPUl9FWFRfQkUJCT0gMHgwMCwgLyogQmVzdCBFZmZvcnQuIERlZmF1bHQuIGZvciBIQ1JQLCBQQU4sIFNEUCwgUkZDT01NLWJhc2VkIHByb2ZpbGVzIGxpa2UgRlRQLCBPUFAsIFNQUCwgRFVOLCBldGMuICovCi0JQlRfTU9UT1JfRVhUX0dVTAk9IDB4MDEsIC8qIEd1YXJhbnRlZWQgTGF0ZW5jeS4gVGhpcyB0eXBlIG9mIHRyYWZmaWMgaXMgdXNlZCBlLmcuIGZvciBISUQgYW5kIEFWUkNQLiAqLwotCUJUX01PVE9SX0VYVF9HVUIJPSAwWDAyLCAvKiBHdWFyYW50ZWVkIEJhbmR3aWR0aC4gKi8KLQlCVF9NT1RPUl9FWFRfR1VMQgk9IDBYMDMgIC8qIEd1YXJhbnRlZWQgTGF0ZW5jeSBhbmQgQmFuZHdpZHRoLiBmb3IgQTJEUCBhbmQgVkRQLiAqLwotfTsKLQotZW51bSBidF90cmFmZmljX21vZGVfcHJvZmlsZSB7Ci0JQlRfUFJPRklMRV9OT05FLAotCUJUX1BST0ZJTEVfQTJEUCwKLQlCVF9QUk9GSUxFX1BBTiwKLQlCVF9QUk9GSUxFX0hJRCwKLQlCVF9QUk9GSUxFX1NDTwotfTsKLQotZW51bSBidF9saW5rX3JvbGUgewotCUJUX0xJTktfTUFTVEVSCT0gMCwKLQlCVF9MSU5LX1NMQVZFCT0gMQotfTsKLQotZW51bSBidF9zdGF0ZV93cGFfYXV0aCB7Ci0JU1RBVEVfV1BBX0FVVEhfVU5JTklUSUFMSVpFRCwKLQlTVEFURV9XUEFfQVVUSF9XQUlUX1BBQ0tFVF8xLCAvKiAgSm9pbiAqLwotCVNUQVRFX1dQQV9BVVRIX1dBSVRfUEFDS0VUXzIsIC8qICBDcmVhdCAqLwotCVNUQVRFX1dQQV9BVVRIX1dBSVRfUEFDS0VUXzMsCi0JU1RBVEVfV1BBX0FVVEhfV0FJVF9QQUNLRVRfNCwKLQlTVEFURV9XUEFfQVVUSF9TVUNDRVNTRUQKLX07Ci0KLSNkZWZpbmUgQlRfV1BBX0FVVEhfVElNRU9VVF9QRVJJT0QJCTEwMDAKLSNkZWZpbmUgQlRNYXhXUEFBdXRoUmVUcmFuc21pdENvdW4JCTUKLQotI2RlZmluZSBNQVhfQU1QX0FTU09DX0ZSQUdfTEVOCQkJMjQ4Ci0jZGVmaW5lIFRPVEFMX0FMTE9DSUFURV9BU1NPQ19MRU4JCQkxMDAwCi0KLXN0cnVjdCBoY2lfZmxvd19zcGVjIHsKLQl1OAkJCQlJZGVudGlmaWVyOwotCXU4CQkJCVNlcnZpY2VUeXBlOwotCXUxNgkJCQlNYXhpbXVtU0RVU2l6ZTsKLQl1MzIJCQkJU0RVSW50ZXJBcnJpdmFsVGltZTsKLQl1MzIJCQkJQWNjZXNzTGF0ZW5jeTsKLQl1MzIJCQkJRmx1c2hUaW1lb3V0OwotfTsKLQotc3RydWN0IGhjaV9sb2dfbGlua19jbWRfZGF0YSB7Ci0JdTgJCQkJQnRQaHlMaW5raGFuZGxlOwotCXUxNgkJCQlCdExvZ0xpbmtoYW5kbGU7Ci0JdTgJCQkJQnRUeEZsb3dTcGVjSUQ7Ci0Jc3RydWN0IGhjaV9mbG93X3NwZWMJCVR4X0Zsb3dfU3BlYzsKLQlzdHJ1Y3QgaGNpX2Zsb3dfc3BlYwkJUnhfRmxvd19TcGVjOwotCXUzMgkJCQlUeFBhY2tldENvdW50OwotCXUzMgkJCQlCZXN0RWZmb3J0Rmx1c2hUaW1lb3V0OwotCi0JdTgJCQkJYkxMQ29tcGxldGVFdmVudElzU2V0OwotCi0JdTgJCQkJYkxMQ2FuY2VsQ01ESXNTZXRhbmRDb21wbGV0ZTsKLX07Ci0KLXN0cnVjdCBoY2lfcGh5X2xpbmtfY21kX2RhdGEgewotCS8qIFBoeXNpY2FsX0xpbmtfSGFuZGxlICovCi0JdTgJCQkJQnRQaHlMaW5raGFuZGxlOwotCi0JdTE2CQkJCUxpbmtTdXBlcnZlcnNpb25UaW1lb3V0OwotCi0JLyogdTE2CQkJCVN1cGVyVGltZU91dENudDsgKi8KLQotCS8qIERlZGljYXRlZF9BTVBfS2V5X0xlbmd0aCAqLwotCXU4CQkJCUJ0QU1QS2V5TGVuOwotCS8qIERlZGljYXRlZF9BTVBfS2V5X1R5cGUgKi8KLQl1OAkJCQlCdEFNUEtleVR5cGU7Ci0JLyogRGVkaWNhdGVkX0FNUF9LZXkgKi8KLQl1OAkJCQlCdEFNUEtleVtQTUtfTEVOXTsKLX07Ci0KLXN0cnVjdCBhbXBfYXNzb2Nfc3RydWN0dXJlIHsKLQkvKiBUWVBFIElEICovCi0JdTgJCQkJVHlwZUlEOwotCS8qIExlbmd0aCAqLwotCXUxNgkJCQlMZW5ndGg7Ci0JLyogVmFsdWUgKi8KLQl1OAkJCQlEYXRhWzFdOwotfTsKLQotc3RydWN0IGFtcF9wcmVmX2NobmxfcmVndWxhdG9yeSB7Ci0JdTgJCQkJcmVYSWQ7Ci0JdTgJCQkJcmVndWxhdG9yeUNsYXNzOwotCXU4CQkJCWNvdmVyYWdlQ2xhc3M7Ci19OwotCi1zdHJ1Y3QgYW1wX2Fzc29jX2NtZF9kYXRhIHsKLQkvKiBQaHlzaWNhbF9MaW5rX0hhbmRsZSAqLwotCXU4CQkJCUJ0UGh5TGlua2hhbmRsZTsKLQkvKiBMZW5ndGhfU29fRmFyICovCi0JdTE2CQkJCUxlblNvRmFyOwotCi0JdTE2CQkJCU1heFJlbW90ZUFTU09DTGVuOwotCS8qIEFNUF9BU1NPQ19SZW1haW5pbmdfTGVuZ3RoICovCi0JdTE2CQkJCUFNUEFzc29jUmVtTGVuOwotCS8qIEFNUF9BU1NPQ19mcmFnbWVudCAqLwotCXZvaWQJCQkJKkFNUEFzc29jZnJhZ21lbnQ7Ci19OwotCi1zdHJ1Y3QgaGNpX2xpbmtfaW5mbyB7Ci0JdTE2CQkJCUNvbm5lY3RIYW5kbGU7Ci0JdTgJCQkJSW5jb21pbmdUcmFmZmljTW9kZTsKLQl1OAkJCQlPdXRnb2luZ1RyYWZmaWNNb2RlOwotCXU4CQkJCUJUUHJvZmlsZTsKLQl1OAkJCQlCVENvcmVTcGVjOwotCXM4CQkJCUJUX1JTU0k7Ci0JdTgJCQkJVHJhZmZpY1Byb2ZpbGU7Ci0JdTgJCQkJbGlua1JvbGU7Ci19OwotCi1zdHJ1Y3QgaGNpX2V4dF9jb25maWcgewotCXN0cnVjdCBoY2lfbGlua19pbmZvCQlsaW5rSW5mb1tNQVhfQlRfQVNPQ19FTlRSWV9OVU1dOwotCXU4CQkJCWJ0T3BlcmF0aW9uQ29kZTsKLQl1MTYJCQkJQ3VycmVudENvbm5lY3RIYW5kbGU7Ci0JdTgJCQkJQ3VycmVudEluY29taW5nVHJhZmZpY01vZGU7Ci0JdTgJCQkJQ3VycmVudE91dGdvaW5nVHJhZmZpY01vZGU7Ci0JczgJCQkJTUlOX0JUX1JTU0k7Ci0JdTgJCQkJTnVtYmVyT2ZIYW5kbGU7Ci0JdTgJCQkJTnVtYmVyT2ZTQ087Ci0JdTgJCQkJQ3VycmVudEJUU3RhdHVzOwotCXUxNgkJCQlIQ0lFeHRlbnNpb25WZXI7Ci0KLQkvKiBCdCBjb2V4aXN0IHJlbGF0ZWQgKi8KLQl1OAkJCQlidFByb2ZpbGVDYXNlOwotCXU4CQkJCWJ0UHJvZmlsZUFjdGlvbjsKLQl1OAkJCQliTWFudWFsQ29udHJvbDsKLQl1OAkJCQliQlRCdXN5OwotCXU4CQkJCWJCVEEyRFBCdXN5OwotCXU4CQkJCWJFbmFibGVXaWZpU2Nhbk5vdGlmeTsKLQotCXU4CQkJCWJIb2xkRm9yQnRPcGVyYXRpb247Ci0JdTMyCQkJCWJIb2xkUGVyaW9kQ250OwotfTsKLQotc3RydWN0IGhjaV9hY2xfcGFja2V0X2RhdGEgewotCXUxNgkJCQlBQ0xEYXRhUGFja2V0TGVuOwotCXU4CQkJCVN5bmNEYXRhUGFja2V0TGVuOwotCXUxNgkJCQlUb3RhbE51bUFDTERhdGFQYWNrZXRzOwotCXUxNgkJCQlUb3RhbFN5bmNOdW1EYXRhUGFja2V0czsKLX07Ci0KLXN0cnVjdCBoY2lfcGh5X2xpbmtfYnNzX2luZm8gewotCXUxNgkJCQliZENhcDsJLyogIGNhcGFiaWxpdHkgaW5mb3JtYXRpb24gKi8KLX07Ci0KLXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhIHsKLQl1MTYJCU9DRjoxMDsKLQl1MTYJCU9HRjo2OwotCXU4CQlMZW5ndGg7Ci0JdTgJCURhdGFbMjBdOwotfTsKLQotc3RydWN0IGJ0X2Fzb2NfZW50cnkgewotCXU4CQkJCQkJYlVzZWQ7Ci0JdTgJCQkJCQltQXNzb2M7Ci0JdTgJCQkJCQliNHdheVN1Y2Nlc3M7Ci0JdTgJCQkJCQlCc3NpZFs2XTsKLQlzdHJ1Y3QgaGNpX3BoeV9saW5rX2NtZF9kYXRhCQlQaHlMaW5rQ21kRGF0YTsKLQotCXN0cnVjdCBoY2lfbG9nX2xpbmtfY21kX2RhdGEJCUxvZ0xpbmtDbWREYXRhW01BWF9MT0dJQ0FMX0xJTktfTlVNXTsKLQotCXN0cnVjdCBoY2lfYWNsX3BhY2tldF9kYXRhCQkJQUNMUGFja2V0c0RhdGE7Ci0KLQlzdHJ1Y3QgYW1wX2Fzc29jX2NtZF9kYXRhCQlBbXBBc29jQ21kRGF0YTsKLQlzdHJ1Y3Qgb2N0ZXRfc3RyaW5nCQkJCUJUU3NpZDsKLQl1OAkJCQkJCUJUU3NpZEJ1ZlszM107Ci0KLQllbnVtIGhjaV9zdGF0dXMJCQkJCQlQaHlMaW5rRGlzY29ubmVjdFJlYXNvbjsKLQotCXU4CQkJCQkJYlNlbmRTdXBlcnZpc2lvblBhY2tldDsKLQkvKiB1OAkJCQkJCUN1cnJlbnRTdWVydmlzaW9uUGFja2V0U2VuZE51bTsgKi8KLQkvKiB1OAkJCQkJCUxhc3RTdWVydmlzaW9uUGFja2V0U2VuZE51bTsgKi8KLQl1MzIJCQkJCQlOb1J4UGt0Q250OwotCS8qIElzIENyZWF0b3Igb3IgSm9pbmVyICovCi0JZW51bSBhbXBfYnRhcF90eXBlCQkJCUFNUFJvbGU7Ci0KLQkvKiBCVCBjdXJyZW50IHN0YXRlICovCi0JdTgJCQkJCQlCdEN1cnJlbnRTdGF0ZTsKLQkvKiBCVCBuZXh0IHN0YXRlICovCi0JdTgJCQkJCQlCdE5leHRTdGF0ZTsKLQotCXU4CQkJCQkJYk5lZWRQaHlzTGlua0NvbXBsZXRlRXZlbnQ7Ci0KLQllbnVtIGhjaV9zdGF0dXMJCQkJCVBoeXNMaW5rQ29tcGxldGVTdGF0dXM7Ci0KLQl1OAkJCQkJCUJUUmVtb3RlTUFDQWRkcls2XTsKLQotCXUzMgkJCQkJCUJUQ2FwYWJpbGl0eTsKLQotCXU4CQkJCQkJU3luY0RhdGFQYWNrZXRMZW47Ci0KLQl1MTYJCQkJCQlUb3RhbFN5bmNOdW1EYXRhUGFja2V0czsKLQl1MTYJCQkJCQlUb3RhbE51bUFDTERhdGFQYWNrZXRzOwotCi0JdTgJCQkJCQlTaG9ydFJhbmdlTW9kZTsKLQotCXU4CQkJCQkJUFRLW1BUS19MRU5fVEtJUF07Ci0JdTgJCQkJCQlHVEtbR1RLX0xFTl07Ci0JdTgJCQkJCQlBTm9uY2VbS0VZX05PTkNFX0xFTl07Ci0JdTgJCQkJCQlTTm9uY2VbS0VZX05PTkNFX0xFTl07Ci0JdTY0CQkJCQkJS2V5UmVwbGF5Q291bnRlcjsKLQl1OAkJCQkJCVdQQUF1dGhSZXBsYXlDb3VudDsKLQl1OAkJCQkJCUFFU0tleUJ1ZltBRVNDQ01QX0JMS19TSVpFX1RPVEFMXTsKLQl1OAkJCQkJCVBNS1tQTUtfTEVOXTsKLQllbnVtIGJ0X3N0YXRlX3dwYV9hdXRoCQkJQlRXUEFBdXRoU3RhdGU7Ci0JczMyCQkJCQkJVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7Ci0KLQkvKiAgQWRkIGZvciBIVyBzZWN1cml0eSAhISAqLwotCXU4CQkJCQkJSHdDQU1JbmRleDsgIC8qICBDYW0gaW5kZXggKi8KLQl1OAkJCQkJCWJQZWVyUW9zU3RhOwotCi0JdTMyCQkJCQkJcnhTdXZwUGt0Q250OwotfTsKLQotc3RydWN0IGJ0X3RyYWZmaWNfc3RhdGlzdGljcyB7Ci0JdTgJCQkJYlR4QnVzeVRyYWZmaWM7Ci0JdTgJCQkJYlJ4QnVzeVRyYWZmaWM7Ci0JdTgJCQkJYklkbGU7Ci0JdTMyCQkJCVR4UGt0Q250SW5QZXJpb2Q7Ci0JdTMyCQkJCVJ4UGt0Q250SW5QZXJpb2Q7Ci0JdTY0CQkJCVR4UGt0TGVuSW5QZXJpb2Q7Ci0JdTY0CQkJCVJ4UGt0TGVuSW5QZXJpb2Q7Ci19OwotCi1zdHJ1Y3QgYnRfbWdudCB7Ci0JdTgJCQkJYkJUQ29ubmVjdEluUHJvZ3Jlc3M7Ci0JdTgJCQkJYkxvZ0xpbmtJblByb2dyZXNzOwotCXU4CQkJCWJQaHlMaW5rSW5Qcm9ncmVzczsKLQl1OAkJCQliUGh5TGlua0luUHJvZ3Jlc3NTdGFydExMOwotCXU4CQkJCUJ0Q3VycmVudFBoeUxpbmtoYW5kbGU7Ci0JdTE2CQkJCUJ0Q3VycmVudExvZ0xpbmtoYW5kbGU7Ci0JdTgJCQkJQ3VycmVudENvbm5lY3RFbnRyeU51bTsKLQl1OAkJCQlEaXNjb25uZWN0RW50cnlOdW07Ci0JdTgJCQkJQ3VycmVudEJUQ29ubmVjdGlvbkNudDsKLQllbnVtIGJ0X2Nvbm5lY3RfdHlwZQkJQlRDdXJyZW50Q29ubmVjdFR5cGU7Ci0JZW51bSBidF9jb25uZWN0X3R5cGUJCUJUUmVjZWl2ZUNvbm5lY3RQa3Q7Ci0JdTgJCQkJQlRBdXRoQ291bnQ7Ci0JdTgJCQkJQlRBc29jQ291bnQ7Ci0JdTgJCQkJYlN0YXJ0U2VuZFN1cGVydmlzaW9uUGt0OwotCXU4CQkJCUJ0T3BlcmF0aW9uT247Ci0JdTgJCQkJQlROZWVkQU1QU3RhdHVzQ2hnOwotCXU4CQkJCUpvaW5lck5lZWRTZW5kQXV0aDsKLQlzdHJ1Y3QgaGNpX3BoeV9saW5rX2Jzc19pbmZvCWJzc0Rlc2M7Ci0Jc3RydWN0IGhjaV9leHRfY29uZmlnCQlFeHRDb25maWc7Ci0JdTgJCQkJYk5lZWROb3RpZnlBTVBOb0NhcDsKLQl1OAkJCQliQ3JlYXRlU3Bwb3J0UW9zOwotCXU4CQkJCWJTdXBwb3J0UHJvZmlsZTsKLQl1OAkJCQlCVENoYW5uZWw7Ci0JdTgJCQkJQ2hlY2tDaG5sSXNTdWl0OwotCXU4CQkJCWJCdFNjYW47Ci0JdTgJCQkJYnRMb2dvVGVzdDsKLX07Ci0KLXN0cnVjdCBidF9oY2lfZGdiX2luZm8gewotCXUzMgkJCQloY2lDbWRDbnQ7Ci0JdTMyCQkJCWhjaUNtZENudFVua25vd247Ci0JdTMyCQkJCWhjaUNtZENudENyZWF0ZVBoeUxpbms7Ci0JdTMyCQkJCWhjaUNtZENudEFjY2VwdFBoeUxpbms7Ci0JdTMyCQkJCWhjaUNtZENudERpc2Nvbm5lY3RQaHlMaW5rOwotCXUzMgkJCQloY2lDbWRQaHlMaW5rU3RhdHVzOwotCXUzMgkJCQloY2lDbWRDbnRDcmVhdGVMb2dMaW5rOwotCXUzMgkJCQloY2lDbWRDbnRBY2NlcHRMb2dMaW5rOwotCXUzMgkJCQloY2lDbWRDbnREaXNjb25uZWN0TG9nTGluazsKLQl1MzIJCQkJaGNpQ21kQ250UmVhZExvY2FsQW1wQXNzb2M7Ci0JdTMyCQkJCWhjaUNtZENudFdyaXRlUmVtb3RlQW1wQXNzb2M7Ci0JdTMyCQkJCWhjaUNtZENudFNldEFjbExpbmtTdGF0dXM7Ci0JdTMyCQkJCWhjaUNtZENudFNldFNjb0xpbmtTdGF0dXM7Ci0JdTMyCQkJCWhjaUNtZENudEV4dGVuc2lvblZlcnNpb25Ob3RpZnk7Ci0JdTMyCQkJCWhjaUNtZENudExpbmtTdGF0dXNOb3RpZnk7Ci19OwotCi1zdHJ1Y3QgYnRfaXJwX2RnYl9pbmZvIHsKLQl1MzIJCQkJaXJwTUpDcmVhdGU7Ci0JLyogIElvIENvbnRyb2wgKi8KLQl1MzIJCQkJaXJwSW9Db250cm9sOwotCXUzMgkJCQlpcnBJb0N0cmxIY2lDbWQ7Ci0JdTMyCQkJCWlycElvQ3RybEhjaUV2ZW50OwotCXUzMgkJCQlpcnBJb0N0cmxIY2lUeERhdGE7Ci0JdTMyCQkJCWlycElvQ3RybEhjaVJ4RGF0YTsKLQl1MzIJCQkJaXJwSW9DdHJsVW5rbm93bjsKLQotCXUzMgkJCQlpcnBJb0N0cmxIY2lUeERhdGExczsKLX07Ci0KLXN0cnVjdCBidF9wYWNrZXRfZGdiX2luZm8gewotCXUzMgkJCQlidFBrdFR4UHJvYlJlcTsKLQl1MzIJCQkJYnRQa3RSeFByb2JSZXE7Ci0JdTMyCQkJCWJ0UGt0UnhQcm9iUmVxRmFpbDsKLQl1MzIJCQkJYnRQa3RUeFByb2JSc3A7Ci0JdTMyCQkJCWJ0UGt0UnhQcm9iUnNwOwotCXUzMgkJCQlidFBrdFR4QXV0aDsKLQl1MzIJCQkJYnRQa3RSeEF1dGg7Ci0JdTMyCQkJCWJ0UGt0UnhBdXRoQnV0RHJvcDsKLQl1MzIJCQkJYnRQa3RUeEFzc29jUmVxOwotCXUzMgkJCQlidFBrdFJ4QXNzb2NSZXE7Ci0JdTMyCQkJCWJ0UGt0UnhBc3NvY1JlcUJ1dERyb3A7Ci0JdTMyCQkJCWJ0UGt0VHhBc3NvY1JzcDsKLQl1MzIJCQkJYnRQa3RSeEFzc29jUnNwOwotCXUzMgkJCQlidFBrdFR4RGlzYXNzb2M7Ci0JdTMyCQkJCWJ0UGt0UnhEaXNhc3NvYzsKLQl1MzIJCQkJYnRQa3RSeERlYXV0aDsKLQl1MzIJCQkJYnRQa3RUeDR3YXkxc3Q7Ci0JdTMyCQkJCWJ0UGt0Ung0d2F5MXN0OwotCXUzMgkJCQlidFBrdFR4NHdheTJuZDsKLQl1MzIJCQkJYnRQa3RSeDR3YXkybmQ7Ci0JdTMyCQkJCWJ0UGt0VHg0d2F5M3JkOwotCXUzMgkJCQlidFBrdFJ4NHdheTNyZDsKLQl1MzIJCQkJYnRQa3RUeDR3YXk0dGg7Ci0JdTMyCQkJCWJ0UGt0Ung0d2F5NHRoOwotCXUzMgkJCQlidFBrdFR4TGlua1N1cGVyUmVxOwotCXUzMgkJCQlidFBrdFJ4TGlua1N1cGVyUmVxOwotCXUzMgkJCQlidFBrdFR4TGlua1N1cGVyUnNwOwotCXUzMgkJCQlidFBrdFJ4TGlua1N1cGVyUnNwOwotCXUzMgkJCQlidFBrdFR4RGF0YTsKLQl1MzIJCQkJYnRQa3RSeERhdGE7Ci19OwotCi1zdHJ1Y3QgYnRfZGdiIHsKLQl1OAkJCQlkYmdDdHJsOwotCXUzMgkJCQlkYmdQcm9maWxlOwotCXN0cnVjdCBidF9oY2lfZGdiX2luZm8JCWRiZ0hjaUluZm87Ci0Jc3RydWN0IGJ0X2lycF9kZ2JfaW5mbwkJZGJnSXJwSW5mbzsKLQlzdHJ1Y3QgYnRfcGFja2V0X2RnYl9pbmZvCWRiZ0J0UGt0OwotfTsKLQotc3RydWN0IGJ0X2hjaV9pbmZvIHsKLQkvKiA4MDIuMTEgUGFsIHZlcnNpb24gc3BlY2lmaWVyICovCi0JdTgJCQkJQlRQYWxWZXJzaW9uOwotCXUxNgkJCQlCVFBhbENvbXBhbnlJRDsKLQl1MTYJCQkJQlRQYWxzdWJ2ZXJzaW9uOwotCi0JLyogQ29ubmVjdGVkIGNoYW5uZWwgbGlzdCAqLwotCXUxNgkJCQlCVENvbm5lY3RDaG5sTGlzdExlbjsKLQl1OAkJCQlCVENvbm5lY3RDaG5sbGlzdFs2NF07Ci0KLQkvKiBGYWlsIGNvbnRhY3QgY291bnRlciAqLwotCXUxNgkJCQlGYWlsQ29udGFjdENvdW50OwotCi0JLyogRXZlbnQgbWFzayAqLwotCXU2NAkJCQlCVEV2ZW50TWFzazsKLQl1NjQJCQkJQlRFdmVudE1hc2tQYWdlMjsKLQotCS8qIHRpbWVvdXQgdmFyICovCi0JdTE2CQkJCUNvbm5BY2NlcHRUaW1lb3V0OwotCXUxNgkJCQlMb2dpY2FsQWNjZXB0VGltZW91dDsKLQl1MTYJCQkJUGFnZVRpbWVvdXQ7Ci0KLQl1OAkJCQlMb2NhdGlvbkRvbWFpbkF3YXJlOwotCXUxNgkJCQlMb2NhdGlvbkRvbWFpbjsKLQl1OAkJCQlMb2NhdGlvbkRvbWFpbk9wdGlvbnM7Ci0JdTgJCQkJTG9jYXRpb25PcHRpb25zOwotCi0JdTgJCQkJRmxvd0NvbnRyb2xNb2RlOwotCi0JLyogUHJlZmVycmVkIGNoYW5uZWwgbGlzdCAqLwotCXUxNgkJCQlCdFByZUNobmxMaXN0TGVuOwotCXU4CQkJCUJUUHJlQ2hubGxpc3RbNjRdOwotCi0JdTE2CQkJCWVuRmx1c2hfTExIOwkvKiBlbmhhbmNlZCBmbHVzaCBoYW5kbGUgKi8KLQl1MTYJCQkJRkxUT19MTEg7CQkvKiBlbmhhbmNlZCBmbHVzaCBoYW5kbGUgKi8KLQotCS8qICAqLwotCS8qIFRlc3QgY29tbWFuZCBvbmx5LiAqLwotCXU4CQkJCWJJblRlc3RNb2RlOwotCXU4CQkJCWJUZXN0SXNFbmQ7Ci0JdTgJCQkJYlRlc3ROZWVkUmVwb3J0OwotCXU4CQkJCVRlc3RTY2VuYXJpbzsKLQl1OAkJCQlUZXN0UmVwb3J0SW50ZXJ2YWw7Ci0JdTgJCQkJVGVzdEN0clR5cGU7Ci0JdTMyCQkJCVRlc3RFdmVudFR5cGU7Ci0JdTE2CQkJCVRlc3ROdW1PZkZyYW1lOwotCXUxNgkJCQlUZXN0TnVtT2ZFcnJGcmFtZTsKLQl1MTYJCQkJVGVzdE51bU9mQml0czsKLQl1MTYJCQkJVGVzdE51bU9mRXJyQml0czsKLQkvKiAgKi8KLX07Ci0KLXN0cnVjdCBidF90cmFmZmljIHsKLQkvKiAgQWRkIGZvciBjaGVjayByZXBsYXkgZGF0YSAqLwotCXU4CQkJCQlMYXN0UnhVbmlGcmFnTnVtOwotCXUxNgkJCQkJTGFzdFJ4VW5pU2VxTnVtOwotCi0JLyogczMyCQkJCQlFbnRyeU1heFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOyAqLwotCS8qIHMzMgkJCQkJRW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQjsgKi8KLQotCXN0cnVjdCBidF90cmFmZmljX3N0YXRpc3RpY3MJCUJ0MzBUcmFmZmljU3RhdGlzdGljczsKLX07Ci0KLSNkZWZpbmUgUlRfV09SS19JVEVNIHN0cnVjdCB3b3JrX3N0cnVjdAotCi1zdHJ1Y3QgYnRfc2VjdXJpdHkgewotCS8qICBXUEEgYXV0aCBzdGF0ZQotCSAqICBNYXkgbmVlZCB0byByZW1vdmUgdG8gQlRTZWNJbmZvIC4uLiAKLQkgKiBlbnVtIGJ0X3N0YXRlX3dwYV9hdXRoIEJUV1BBQXV0aFN0YXRlOwotCSAqLwotCXN0cnVjdCBvY3RldF9zdHJpbmcJUlNOSUU7Ci0JdTgJCQlSU05JRUJ1ZltNQVhSU05JRUxFTl07Ci0JdTgJCQliUmVnTm9FbmNyeXB0OwotCXU4CQkJYlVzZWRId0VuY3J5cHQ7Ci19OwotCi1zdHJ1Y3QgYnRfMzBpbmZvIHsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIJKnBhZGFwdGVyOwotCXN0cnVjdCBidF9hc29jX2VudHJ5CQlCdEFzb2NFbnRyeVtNQVhfQlRfQVNPQ19FTlRSWV9OVU1dOwotCXN0cnVjdCBidF9tZ250CQkJCUJ0TWdudDsKLQlzdHJ1Y3QgYnRfZGdiCQkJCUJ0RGJnOwotCXN0cnVjdCBidF9oY2lfaW5mbwkJCUJ0SGNpSW5mbzsKLQlzdHJ1Y3QgYnRfdHJhZmZpYwkJCUJ0VHJhZmZpYzsKLQlzdHJ1Y3QgYnRfc2VjdXJpdHkJCQlCdFNlYzsKLQlSVF9XT1JLX0lURU0JCUhDSUNtZFdvcmtJdGVtOwotCXN0cnVjdCB0aW1lcl9saXN0IEJUSENJQ21kVGltZXI7Ci0JUlRfV09SS19JVEVNCQlCVFBzRGlzYWJsZVdvcmtJdGVtOwotCVJUX1dPUktfSVRFTQkJQlRDb25uZWN0V29ya0l0ZW07Ci0Jc3RydWN0IHRpbWVyX2xpc3QgQlRIQ0lEaXNjYXJkQWNsRGF0YVRpbWVyOwotCXN0cnVjdCB0aW1lcl9saXN0IEJUSENJSm9pblRpbWVvdXRUaW1lcjsKLQlzdHJ1Y3QgdGltZXJfbGlzdCBCVFRlc3RTZW5kUGFja2V0VGltZXI7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgQlREaXNjb25uZWN0UGh5TGlua1RpbWVyOwotCXN0cnVjdCB0aW1lcl9saXN0IEJUQmVhY29uVGltZXI7Ci0JdTgJCQkJQlRCZWFjb25UbXJPbjsKLQotCXN0cnVjdCB0aW1lcl9saXN0IEJUUHNEaXNhYmxlVGltZXI7Ci0KLQl2b2lkICoJCQkJcEJ0Q2hubExpc3Q7Ci19OwotCi1zdHJ1Y3QgcGFja2V0X2lycF9hY2xfZGF0YSB7Ci0JdTE2CQlIYW5kbGU6MTI7Ci0JdTE2CQlQQl9GbGFnOjI7Ci0JdTE2CQlCQ19GbGFnOjI7Ci0JdTE2CQlMZW5ndGg7Ci0JdTgJCURhdGFbMV07Ci19OwotCi1zdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhIHsKLQl1OAkJRXZlbnRDb2RlOwotCXU4CQlMZW5ndGg7Ci0JdTgJCURhdGFbMjBdOwotfTsKLQotc3RydWN0IGNvbW1vbl90cmlwbGUgewotCXU4IGJ5dGVfMXN0OwotCXU4IGJ5dGVfMm5kOwotCXU4IGJ5dGVfM3JkOwotfTsKLQotI2RlZmluZSBDT1VOVFJZX1NUUl9MRU4JCTMJLyogIGNvdW50cnkgc3RyaW5nIGxlbiA9IDMgKi8KLQotI2RlZmluZSBMT0NBTF9QTUsJMAotCi1lbnVtIGhjaV93aWZpX2Nvbm5lY3Rfc3RhdHVzIHsKLQlIQ0lfV0lGSV9OT1RfQ09OTkVDVEVECQkJPSAweDAsCi0JSENJX1dJRklfQ09OTkVDVEVECQkJPSAweDEsCi0JSENJX1dJRklfQ09OTkVDVF9JTl9QUk9HUkVTUwkJPSAweDIsCi19OwotCi1lbnVtIGhjaV9leHRfYnBfb3BlcmF0aW9uIHsKLQlIQ0lfQlRfT1BfTk9ORQkJCQk9IDB4MCwKLQlIQ0lfQlRfT1BfSU5RVUlSWV9TVEFSVAkJCT0gMHgxLAotCUhDSV9CVF9PUF9JTlFVSVJZX0ZJTklTSAkJPSAweDIsCi0JSENJX0JUX09QX1BBR0lOR19TVEFSVAkJCT0gMHgzLAotCUhDSV9CVF9PUF9QQUdJTkdfU1VDQ0VTUwkJPSAweDQsCi0JSENJX0JUX09QX1BBR0lOR19VTlNVQ0NFU1MJCT0gMHg1LAotCUhDSV9CVF9PUF9QQUlSSU5HX1NUQVJUCQkJPSAweDYsCi0JSENJX0JUX09QX1BBSVJJTkdfRklOSVNICQk9IDB4NywKLQlIQ0lfQlRfT1BfQlRfREVWX0VOQUJMRQkJCT0gMHg4LAotCUhDSV9CVF9PUF9CVF9ERVZfRElTQUJMRQkJPSAweDksCi0JSENJX0JUX09QX01BWAotfTsKLQotI2RlZmluZSBCVEhDSV9TTV9XSVRIX0lORk8oX0FkYXB0ZXIsIF9TdGF0ZVRvRW50ZXIsIF9TdGF0ZUNtZCwgX0VudHJ5TnVtKQlcCi17CQkJCQkJCQkJCVwKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiW0JUIHN0YXRlIGNoYW5nZV0gY2F1c2VkIGJ5ICIiJXMiIiwgbGluZSA9JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXykpOwkJCQkJCQlcCi0JQlRIQ0lfU3RhdGVNYWNoaW5lKF9BZGFwdGVyLCBfU3RhdGVUb0VudGVyLCBfU3RhdGVDbWQsIF9FbnRyeU51bSk7XAotfQotCi12b2lkIEJUSENJX0V2ZW50UGFyc2Uoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdm9pZCAqcEV2bnREYXRhLAotCQkgICAgICB1MzIgZGF0YUxlbik7Ci0jZGVmaW5lIEJUX0V2ZW50UGFyc2UgQlRIQ0lfRXZlbnRQYXJzZQotdTggQlRIQ0lfSHNDb25uZWN0aW9uRXN0YWJsaXNoZWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIEJUSENJX1VwZGF0ZUJUUHJvZmlsZVJUS1RvTW90byhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRIQ0lfV2lmaVNjYW5Ob3RpZnkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggc2NhblR5cGUpOwotdm9pZCBCVEhDSV9TdGF0ZU1hY2hpbmUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggU3RhdGVUb0VudGVyLAotCQkJZW51bSBoY2lfc3RhdGVfd2l0aF9jbWQgU3RhdGVDbWQsIHU4IEVudHJ5TnVtKTsKLXZvaWQgQlRIQ0lfRGlzY29ubmVjdFBlZXIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggRW50cnlOdW0pOwotdm9pZCBCVEhDSV9FdmVudE51bU9mQ29tcGxldGVkRGF0YUJsb2NrcyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRIQ0lfRXZlbnRBTVBTdGF0dXNDaGFuZ2Uoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggQU1QX1N0YXR1cyk7Ci12b2lkIEJUSENJX0Rpc2Nvbm5lY3RBbGwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1lbnVtIGhjaV9zdGF0dXMgQlRIQ0lfSGFuZGxlSENJQ01EKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQpOwotCi0vKiAgPT09PT0gRW5kIG9mIHN5bmMgZnJvbSBTRDcgZHJpdmVyIENPTU1PTi9idF9oY2kuaCA9PT09PSAqLwotCi0vKiAgPT09PT0gQmVsb3cgdGhpcyBsaW5lIGlzIHN5bmMgZnJvbSBTRDcgZHJpdmVyIEhBTC9CVENvZXhpc3QvSGFsQnRjODcyMzFBbnQuaCA9PT09PSAqLwotI2RlZmluZSBHRVRfQlRfSU5GTyhwYWRhcHRlcikJKCZHRVRfSEFMX0RBVEEocGFkYXB0ZXIpLT5CdEluZm8pCi0KLSNkZWZpbmUJQlRDX0ZPUl9TQ0FOX1NUQVJUCQkJCTEKLSNkZWZpbmUJQlRDX0ZPUl9TQ0FOX0ZJTklTSAkJCQkwCi0KLSNkZWZpbmUJQlRfVFhSWF9DTlRfVEhSRVNfMQkJCQkxMjAwCi0jZGVmaW5lCUJUX1RYUlhfQ05UX1RIUkVTXzIJCQkJMTQwMAotI2RlZmluZQlCVF9UWFJYX0NOVF9USFJFU18zCQkJCTMwMDAKLSNkZWZpbmUJQlRfVFhSWF9DTlRfTEVWRUxfMAkJCQkwCS8qICA8IDEyMDAgKi8KLSNkZWZpbmUJQlRfVFhSWF9DTlRfTEVWRUxfMQkJCQkxCS8qICA+PSAxMjAwICYmIDwgMTQwMCAqLwotI2RlZmluZQlCVF9UWFJYX0NOVF9MRVZFTF8yCQkJCTIJLyogID49IDE0MDAgKi8KLSNkZWZpbmUJQlRfVFhSWF9DTlRfTEVWRUxfMwkJCQkzCS8qICA+PSAzMDAwICovCi0KLWVudW0gYnRfc3RhdGVfMWFudCB7Ci0JQlRfSU5GT19TVEFURV9ESVNBQkxFRAkJCT0gMCwKLQlCVF9JTkZPX1NUQVRFX05PX0NPTk5FQ1RJT04JCT0gMSwKLQlCVF9JTkZPX1NUQVRFX0NPTk5FQ1RfSURMRQkJPSAyLAotCUJUX0lORk9fU1RBVEVfSU5RX09SX1BBRwkJPSAzLAotCUJUX0lORk9fU1RBVEVfQUNMX09OTFlfQlVTWQkJPSA0LAotCUJUX0lORk9fU1RBVEVfU0NPX09OTFlfQlVTWQkJPSA1LAotCUJUX0lORk9fU1RBVEVfQUNMX1NDT19CVVNZCQk9IDYsCi0JQlRfSU5GT19TVEFURV9BQ0xfSU5RX09SX1BBRwkJPSA3LAotCUJUX0lORk9fU1RBVEVfTUFYCQkJPSA4Ci19OwotCi1zdHJ1Y3QgYnRkbV84NzIzYV8xYW50IHsKLQl1OAkJcHJlUHNUZG1hOwotCXU4CQljdXJQc1RkbWE7Ci0JdTgJCXBzVGRtYUR1QWRqVHlwZTsKLQl1OAkJYlByZVBzVGRtYU9uOwotCXU4CQliQ3VyUHNUZG1hT247Ci0JdTgJCXByZVdpZmlQYXJhOwotCXU4CQljdXJXaWZpUGFyYTsKLQl1OAkJcHJlQ29leFdpZmlDb247Ci0JdTgJCWN1ckNvZXhXaWZpQ29uOwotCXU4CQl3aWZpUnNzaVRocmVzaDsKLQotCXUzMgkJcHNUZG1hTW9uaXRvckNudDsKLQl1MzIJCXBzVGRtYUdsb2JhbENudDsKLQotCS8qIER1cmF0aW9uQWRqdXN0IEZvciBTQ08gKi8KLQl1MzIJCXBzVGRtYU1vbml0b3JDbnRGb3JTQ087Ci0JdTgJCXBzVGRtYUR1QWRqVHlwZUZvclNDTzsKLQl1OAkJUlNTSV9XaUZpX0xhc3Q7Ci0JdTgJCVJTU0lfQlRfTGFzdDsKLQotCXU4CQliV2lGaUhhbHQ7Ci0JdTgJCWJSQUNoYW5nZWQ7Ci19OwotCi12b2lkIEJURE1fMUFudFNpZ25hbENvbXBlbnNhdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSB1OCAqcnNzaV93aWZpLCB1OCAqcnNzaV9idCk7Ci12b2lkIEJURE1fMUFudEZvckRoY3Aoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIEJURE1fMUFudEJ0Q29leGlzdDg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0vKiAgPT09PT0gRW5kIG9mIHN5bmMgZnJvbSBTRDcgZHJpdmVyIEhBTC9CVENvZXhpc3QvSGFsQnRjODcyMzFBbnQuaCA9PT09PSAqLwotCi0vKiAgPT09PT0gQmVsb3cgdGhpcyBsaW5lIGlzIHN5bmMgZnJvbSBTRDcgZHJpdmVyIEhBTC9CVENvZXhpc3QvSGFsQnRjODcyMzJBbnQuaCA9PT09PSAqLwotZW51bSBidF8yYW50X2J0X3N0YXR1cyB7Ci0JQlRfMkFOVF9CVF9TVEFUVVNfSURMRQkJCT0gMHgwLAotCUJUXzJBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFCT0gMHgxLAotCUJUXzJBTlRfQlRfU1RBVFVTX05PTl9JRExFCQk9IDB4MiwKLQlCVF8yQU5UX0JUX1NUQVRVU19NQVgKLX07Ci0KLWVudW0gYnRfMmFudF9jb2V4X2FsZ28gewotCUJUXzJBTlRfQ09FWF9BTEdPX1VOREVGSU5FRAkJCT0gMHgwLAotCUJUXzJBTlRfQ09FWF9BTEdPX1NDTwkJCQk9IDB4MSwKLQlCVF8yQU5UX0NPRVhfQUxHT19ISUQJCQkJPSAweDIsCi0JQlRfMkFOVF9DT0VYX0FMR09fQTJEUAkJCQk9IDB4MywKLQlCVF8yQU5UX0NPRVhfQUxHT19QQU5FRFIJCQk9IDB4NCwKLQlCVF8yQU5UX0NPRVhfQUxHT19QQU5IUwkJCQk9IDB4NSwKLQlCVF8yQU5UX0NPRVhfQUxHT19QQU5FRFJfQTJEUAkJPSAweDYsCi0JQlRfMkFOVF9DT0VYX0FMR09fUEFORURSX0hJRAkJPSAweDcsCi0JQlRfMkFOVF9DT0VYX0FMR09fSElEX0EyRFBfUEFORURSCT0gMHg4LAotCUJUXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQCQkJPSAweDksCi0JQlRfMkFOVF9DT0VYX0FMR09fSElEX0EyRFBfUEFOSFMJPSAweEEsCi0JQlRfMkFOVF9DT0VYX0FMR09fTUFYCQkJCT0gMHhCLAotfTsKLQotc3RydWN0IGJ0ZG1fODcyM2FfMmFudCB7Ci0JdTgJYlByZURlY0J0UHdyOwotCXU4CWJDdXJEZWNCdFB3cjsKLQotCXU4CXByZVdsYW5BY3RIaTsKLQl1OAljdXJXbGFuQWN0SGk7Ci0JdTgJcHJlV2xhbkFjdExvOwotCXU4CWN1cldsYW5BY3RMbzsKLQotCXU4CXByZUZ3RGFjU3dpbmdMdmw7Ci0JdTgJY3VyRndEYWNTd2luZ0x2bDsKLQotCXU4CWJQcmVSZlJ4THBmU2hyaW5rOwotCXU4CWJDdXJSZlJ4THBmU2hyaW5rOwotCi0JdTgJYlByZUxvd1BlbmFsdHlSYTsKLQl1OAliQ3VyTG93UGVuYWx0eVJhOwotCi0JdTgJcHJlQnRSZXRyeUluZGV4OwotCXU4CWN1ckJ0UmV0cnlJbmRleDsKLQotCXU4CWJQcmVEYWNTd2luZ09uOwotCXUzMglwcmVEYWNTd2luZ0x2bDsKLQl1OAliQ3VyRGFjU3dpbmdPbjsKLQl1MzIJY3VyRGFjU3dpbmdMdmw7Ci0KLQl1OAliUHJlQWRjQmFja09mZjsKLQl1OAliQ3VyQWRjQmFja09mZjsKLQotCXU4CWJQcmVBZ2NUYWJsZUVuOwotCXU4CWJDdXJBZ2NUYWJsZUVuOwotCi0JdTMyCXByZVZhbDB4NmMwOwotCXUzMgljdXJWYWwweDZjMDsKLQl1MzIJcHJlVmFsMHg2Yzg7Ci0JdTMyCWN1clZhbDB4NmM4OwotCXU4CXByZVZhbDB4NmNjOwotCXU4CWN1clZhbDB4NmNjOwotCi0JdTgJYkN1cklnbm9yZVdsYW5BY3Q7Ci0JdTgJYlByZUlnbm9yZVdsYW5BY3Q7Ci0KLQl1OAlwcmVQc1RkbWE7Ci0JdTgJY3VyUHNUZG1hOwotCXU4CXBzVGRtYUR1QWRqVHlwZTsKLQl1OAliUHJlUHNUZG1hT247Ci0JdTgJYkN1clBzVGRtYU9uOwotCi0JdTgJcHJlQWxnb3JpdGhtOwotCXU4CWN1ckFsZ29yaXRobTsKLQl1OAliUmVzZXRUZG1hQWRqdXN0OwotCi0JdTgJYnRTdGF0dXM7Ci19OwotCi12b2lkIEJURE1fMkFudEJ0Q29leGlzdDg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotLyogID09PT09IEVuZCBvZiBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvQlRDb2V4aXN0L0hhbEJ0Yzg3MjMyQW50LmggPT09PT0gKi8KLQotLyogID09PT09IEJlbG93IHRoaXMgbGluZSBpcyBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvQlRDb2V4aXN0L0hhbEJ0Yzg3MjMuaCA9PT09PSAqLwotCi0jZGVmaW5lCUJUX1FfUEtUX09GRgkJMAotI2RlZmluZQlCVF9RX1BLVF9PTgkJMQotCi0jZGVmaW5lCUJUX1RYX1BXUl9PRkYJCTAKLSNkZWZpbmUJQlRfVFhfUFdSX09OCQkxCi0KLS8qICBURE1BIG1vZGUgZGVmaW5pdGlvbiAqLwotI2RlZmluZQlURE1BXzJBTlQJCQkwCi0jZGVmaW5lCVRETUFfMUFOVAkJCTEKLSNkZWZpbmUJVERNQV9OQVZfT0ZGCQkwCi0jZGVmaW5lCVRETUFfTkFWX09OCQkxCi0jZGVmaW5lCVRETUFfREFDX1NXSU5HX09GRgkwCi0jZGVmaW5lCVRETUFfREFDX1NXSU5HX09OCTEKLQotI2RlZmluZQlCVF9SU1NJX0xFVkVMX0gJMAotI2RlZmluZQlCVF9SU1NJX0xFVkVMX00JMQotI2RlZmluZQlCVF9SU1NJX0xFVkVMX0wJMgotCi0vKiAgUFRBIG1vZGUgcmVsYXRlZCBkZWZpbml0aW9uICovCi0jZGVmaW5lCUJUX1BUQV9NT0RFX09GRgkJMAotI2RlZmluZQlCVF9QVEFfTU9ERV9PTgkJMQotCi0vKiAgUGVuYWx0eSBUeCBSYXRlIEFkYXB0aXZlICovCi0jZGVmaW5lCUJUX1RYX1JBVEVfQURBUFRJVkVfTk9STUFMCQkJMAotI2RlZmluZQlCVF9UWF9SQVRFX0FEQVBUSVZFX0xPV19QRU5BTFRZCTEKLQotLyogIFJGIENvcm5lciAqLwotI2RlZmluZQlCVF9SRl9SWF9MUEZfQ09STkVSX1JFU1VNRQkJCTAKLSNkZWZpbmUJQlRfUkZfUlhfTFBGX0NPUk5FUl9TSFJJTksJCQkxCi0KLSNkZWZpbmUgQlRfSU5GT19BQ0wJCQlCSVQoMCkKLSNkZWZpbmUgQlRfSU5GT19TQ08JCQlCSVQoMSkKLSNkZWZpbmUgQlRfSU5GT19JTlFfUEFHCQlCSVQoMikKLSNkZWZpbmUgQlRfSU5GT19BQ0xfQlVTWQlCSVQoMykKLSNkZWZpbmUgQlRfSU5GT19TQ09fQlVTWQlCSVQoNCkKLSNkZWZpbmUgQlRfSU5GT19ISUQJCQlCSVQoNSkKLSNkZWZpbmUgQlRfSU5GT19BMkRQCQlCSVQoNikKLSNkZWZpbmUgQlRfSU5GT19GVFAJCQlCSVQoNykKLQotCi0KLXN0cnVjdCBidF9jb2V4aXN0Xzg3MjNhIHsKLQl1MzIJCQkJCWhpZ2hQcmlvcml0eVR4OwotCXUzMgkJCQkJaGlnaFByaW9yaXR5Ung7Ci0JdTMyCQkJCQlsb3dQcmlvcml0eVR4OwotCXUzMgkJCQkJbG93UHJpb3JpdHlSeDsKLQl1OAkJCQkJYnRSc3NpOwotCXU4CQkJCQlUb3RhbEFudE51bTsKLQl1OAkJCQkJYkMyaEJ0SW5mb1N1cHBvcnQ7Ci0JdTgJCQkJCWMyaEJ0SW5mbzsKLQl1OAkJCQkJYzJoQnRJbmZvT3JpZ2luYWw7Ci0JdTgJCQkJCXByZWMyaEJ0SW5mbzsgLyogIGZvciAxQW50ICovCi0JdTgJCQkJCWJDMmhCdElucXVpcnlQYWdlOwotCXVuc2lnbmVkIGxvbmcJCQkJYnRJbnFQYWdlU3RhcnRUaW1lOyAvKiAgZm9yIDJBbnQgKi8KLQl1OAkJCQkJYzJoQnRQcm9maWxlOyAvKiAgZm9yIDFBbnQgKi8KLQl1OAkJCQkJYnRSZXRyeUNudDsKLQl1OAkJCQkJYnRJbmZvRXh0OwotCXU4CQkJCQliQzJoQnRJbmZvUmVxU2VudDsKLQl1OAkJCQkJYkZvcmNlRndCdEluZm87Ci0JdTgJCQkJCWJGb3JjZUEyZHBTaW5rOwotCXN0cnVjdCBidGRtXzg3MjNhXzJhbnQJCQlidGRtMkFudDsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8xYW50CQkJYnRkbTFBbnQ7Ci19OwotCi12b2lkIEJURE1fU2V0RndDaG5sSW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJZW51bSBydF9tZWRpYV9zdGF0dXMgbXN0YXR1cyk7Ci11OCBCVERNX0lzV2lmaUNvbm5lY3Rpb25FeGlzdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRETV9TZXRGdzNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJ5dGUxLCB1OCBieXRlMiwgdTggYnl0ZTMsCi0JCSAgdTggYnl0ZTQsIHU4IGJ5dGU1KTsKLXZvaWQgQlRETV9RdWVyeUJ0SW5mb3JtYXRpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIEJURE1fU2V0U3dSZlJ4THBmQ29ybmVyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHR5cGUpOwotdm9pZCBCVERNX1NldFN3UGVuYWx0eVR4UmF0ZUFkYXB0aXZlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHJhVHlwZSk7Ci12b2lkIEJURE1fU2V0RndEZWNCdFB3cihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBiRGVjQnRQd3IpOwotdTggQlRETV9CdFByb2ZpbGVTdXBwb3J0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBCVERNX0xwc0xlYXZlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0vKiAgPT09PT0gRW5kIG9mIHN5bmMgZnJvbSBTRDcgZHJpdmVyIEhBTC9CVENvZXhpc3QvSGFsQnRjODcyMy5oID09PT09ICovCi0KLS8qICA9PT09PSBCZWxvdyB0aGlzIGxpbmUgaXMgc3luYyBmcm9tIFNENyBkcml2ZXIgSEFML0JUQ29leGlzdC9IYWxCdGNDc3IxQW50LmggPT09PT0gKi8KLQotZW51bSBCVF9BMkRQX0lOREVYewotCUJUX0EyRFBfSU5ERVgwCQk9IDAsCQkJLyogIDMyLCAxMjsgdGhlIG1vc3QgY3JpdGljYWwgZm9yIEJUICovCi0JQlRfQTJEUF9JTkRFWDEsCQkJCQkvKiAgMTIsIDI0ICovCi0JQlRfQTJEUF9JTkRFWDIsCQkJCQkvKiAgMCwgMCAqLwotCUJUX0EyRFBfSU5ERVhfTUFYCi19OwotCi0jZGVmaW5lIEJUX0EyRFBfU1RBVEVfTk9UX0VOVEVSRUQJCTAKLSNkZWZpbmUgQlRfQTJEUF9TVEFURV9ERVRFQ1RJTkcJCTEKLSNkZWZpbmUgQlRfQTJEUF9TVEFURV9ERVRFQ1RFRAkJCTIKLQotI2RlZmluZSBCVERNX0FOVF9CVF9JRExFCQkJCTAKLSNkZWZpbmUgQlRETV9BTlRfV0lGSQkJCQkJMQotI2RlZmluZSBCVERNX0FOVF9CVAkJCQkJCTIKLQotCi12b2lkIEJURE1fU2luZ2xlQW50KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJTaW5nbGVBbnRPbiwKLQkJICAgIHU4IGJJbnRlcnJ1cHRPbiwgdTggYk11bHRpTkFWT24pOwotdm9pZCBCVERNX0NoZWNrQlRJZGxlQ2hhbmdlMUFudChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotLyogID09PT09IEVuZCBvZiBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvQlRDb2V4aXN0L0hhbEJ0Y0NzcjFBbnQuaCA9PT09PSAqLwotCi0vKiAgPT09PT0gQmVsb3cgdGhpcyBsaW5lIGlzIHN5bmMgZnJvbSBTRDcgZHJpdmVyIEhBTC9CVENvZXhpc3QvSGFsQnRjQ3NyMkFudC5oID09PT09ICovCi0KLS8qICAqLwotLyogIEZvciBvbGQgY29yZSBzdGFjayBiZWZvcmUgdjI1MSAqLwotLyogICovCi0jZGVmaW5lIEJUX1JTU0lfU1RBVEVfTk9STUFMX1BPV0VSCUJJVCgwKQotI2RlZmluZSBCVF9SU1NJX1NUQVRFX0FNRFBVX09GRgkJQklUKDEpCi0jZGVmaW5lIEJUX1JTU0lfU1RBVEVfU1BFQ0lBTF9MT1cJQklUKDIpCi0jZGVmaW5lIEJUX1JTU0lfU1RBVEVfQkdfRURDQV9MT1cJQklUKDMpCi0jZGVmaW5lIEJUX1JTU0lfU1RBVEVfVFhQT1dFUl9MT1cJQklUKDQpCi0KLSNkZWZpbmUJQlRfREFDU1dJTkdfT0ZGCQkJCTAKLSNkZWZpbmUJQlRfREFDU1dJTkdfTTQJCQkJMQotI2RlZmluZQlCVF9EQUNTV0lOR19NNwkJCQkyCi0jZGVmaW5lCUJUX0RBQ1NXSU5HX00xMAkJCQkzCi0KLXZvaWQgQlRETV9EaW1pbmlzaFdpRmkoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1OCBiREFDT24sIHU4IGJJbnRlcnJ1cHRPbiwKLQkJICAgICAgIHU4IERBQ1N3aW5nTGV2ZWwsIHU4IGJOQVZPbik7Ci0KLS8qICA9PT09PSBFbmQgb2Ygc3luYyBmcm9tIFNENyBkcml2ZXIgSEFML0JUQ29leGlzdC9IYWxCdGNDc3IyQW50LmggPT09PT0gKi8KLQotLyogIEhFQURFUi9UeXBlRGVmLmggKi8KLSNkZWZpbmUgTUFYX0ZXX1NVUFBPUlRfTUFDSURfTlVNCQkJNjQKLQotLyogID09PT09IEJlbG93IHRoaXMgbGluZSBpcyBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvQlRDb2V4aXN0L0hhbEJ0Q29leGlzdC5oID09PT09ICovCi0KLSNkZWZpbmUJRldfVkVSX0JUX1JFRwkJCTYyCi0jZGVmaW5lCUZXX1ZFUl9CVF9SRUcxCQk3NAotI2RlZmluZQlSRUdfQlRfQUNUSVZFCQkJMHg0NDQKLSNkZWZpbmUJUkVHX0JUX1NUQVRFCQkJMHg0NDgKLSNkZWZpbmUJUkVHX0JUX1BPTExJTkcxCQkweDQ0YwotI2RlZmluZQlSRUdfQlRfUE9MTElORwkJCTB4NzAwCi0KLSNkZWZpbmUJUkVHX0JUX0FDVElWRV9PTEQJCTB4NDg4Ci0jZGVmaW5lCVJFR19CVF9TVEFURV9PTEQJCTB4NDhjCi0jZGVmaW5lCVJFR19CVF9QT0xMSU5HX09MRAkweDQ5MAotCi0vKiAgVGhlIHJlZyBkZWZpbmUgaXMgZm9yIDg3MjMgKi8KLSNkZWZpbmUJUkVHX0hJR0hfUFJJT1JJVFlfVFhSWAkJCTB4NzcwCi0jZGVmaW5lCVJFR19MT1dfUFJJT1JJVFlfVFhSWAkJCTB4Nzc0Ci0KLSNkZWZpbmUgQlRfRldfQ09FWF9USFJFU0hfVE9MCQkJNgotI2RlZmluZSBCVF9GV19DT0VYX1RIUkVTSF8yMAkJCQkyMAotI2RlZmluZSBCVF9GV19DT0VYX1RIUkVTSF8yMwkJCQkyMwotI2RlZmluZSBCVF9GV19DT0VYX1RIUkVTSF8yNQkJCQkyNQotI2RlZmluZSBCVF9GV19DT0VYX1RIUkVTSF8zMAkJCQkzMAotI2RlZmluZSBCVF9GV19DT0VYX1RIUkVTSF8zNQkJCQkzNQotI2RlZmluZSBCVF9GV19DT0VYX1RIUkVTSF80MAkJCQk0MAotI2RlZmluZSBCVF9GV19DT0VYX1RIUkVTSF80NQkJCQk0NQotI2RlZmluZSBCVF9GV19DT0VYX1RIUkVTSF80NwkJCQk0NwotI2RlZmluZSBCVF9GV19DT0VYX1RIUkVTSF81MAkJCQk1MAotI2RlZmluZSBCVF9GV19DT0VYX1RIUkVTSF81NQkJCQk1NQotI2RlZmluZSBCVF9GV19DT0VYX1RIUkVTSF82NQkJCQk2NQotCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlQzMAkJCUJJVCgwKQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX1dJRklfSFQyMAkJCUJJVCgxKQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX1dJRklfSFQ0MAkJCUJJVCgyKQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX1dJRklfTEVHQUNZCQlCSVQoMykKLQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9MT1cJCUJJVCg0KQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9NRURJVU0JCUJJVCg1KQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9ISUdICQlCSVQoNikKLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9ERUNfQlRfUE9XRVIJCUJJVCg3KQotCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfV0lGSV9JRExFCQkJQklUKDgpCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfV0lGSV9VUExJTksJCUJJVCg5KQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX1dJRklfRE9XTkxJTksJCUJJVCgxMCkKLQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX0JUX0lOUV9QQUdFCQlCSVQoMTEpCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlRfSURMRQkJCUJJVCgxMikKLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9CVF9VUExJTksJCQlCSVQoMTMpCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlRfRE9XTkxJTksJCUJJVCgxNCkKLS8qICAqLwotLyogIFRvZG86IFJlbW92ZSB0aGVzZSBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBCVF9DT0VYX1NUQVRFX0JUX1BBTl9JRExFCQlCSVQoMTUpCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlRfUEFOX1VQTElOSwkJQklUKDE2KQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX0JUX1BBTl9ET1dOTElOSwkJQklUKDE3KQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX0JUX0EyRFBfSURMRQkJQklUKDE4KQotLyogICovCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlRfUlNTSV9MT1cJCUJJVCgxOSkKLQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX1BST0ZJTEVfSElECQlCSVQoMjApCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfUFJPRklMRV9BMkRQCQlCSVQoMjEpCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfUFJPRklMRV9QQU4JCUJJVCgyMikKLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9QUk9GSUxFX1NDTwkJQklUKDIzKQotCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJXzFfTE9XCQlCSVQoMjQpCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJXzFfTUVESVVNCUJJVCgyNSkKLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9ISUdICQlCSVQoMjYpCi0KLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfQkVBQ09OX0xPVwlCSVQoMjcpCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0JFQUNPTl9NRURJVU0JQklUKDI4KQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9CRUFDT05fSElHSAlCSVQoMjkpCi0KLQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX0JUSU5GT19DT01NT04JCUJJVCgzMCkKLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9CVElORk9fQl9ISURfU0NPRVNDTwlCSVQoMzEpCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlRJTkZPX0JfRlRQX0EyRFAJCUJJVCgzMikKLQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX0JUX0NOVF9MRVZFTF8wCQlCSVQoMzMpCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlRfQ05UX0xFVkVMXzEJCUJJVCgzNCkKLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9CVF9DTlRfTEVWRUxfMgkJQklUKDM1KQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX0JUX0NOVF9MRVZFTF8zCQlCSVQoMzYpCi0KLSNkZWZpbmUgQlRfUlNTSV9TVEFURV9ISUdICQkJMAotI2RlZmluZSBCVF9SU1NJX1NUQVRFX01FRElVTQkJCTEKLSNkZWZpbmUgQlRfUlNTSV9TVEFURV9MT1cJCQkyCi0jZGVmaW5lIEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdICQkJMwotI2RlZmluZSBCVF9SU1NJX1NUQVRFX1NUQVlfTUVESVVNCQk0Ci0jZGVmaW5lIEJUX1JTU0lfU1RBVEVfU1RBWV9MT1cJCQk1Ci0KLSNkZWZpbmUJQlRfQUdDVEFCTEVfT0ZGCQkJCTAKLSNkZWZpbmUJQlRfQUdDVEFCTEVfT04JCQkJMQotCi0jZGVmaW5lCUJUX0JCX0JBQ0tPRkZfT0ZGCQkJMAotI2RlZmluZQlCVF9CQl9CQUNLT0ZGX09OCQkJMQotCi0jZGVmaW5lCUJUX0ZXX05BVl9PRkYJCQkJMAotI2RlZmluZQlCVF9GV19OQVZfT04JCQkJMQotCi0jZGVmaW5lCUJUX0NPRVhfTUVDSF9OT05FCQkJMAotI2RlZmluZQlCVF9DT0VYX01FQ0hfU0NPCQkJMQotI2RlZmluZQlCVF9DT0VYX01FQ0hfSElECQkJMgotI2RlZmluZQlCVF9DT0VYX01FQ0hfQTJEUAkJCTMKLSNkZWZpbmUJQlRfQ09FWF9NRUNIX1BBTgkJCTQKLSNkZWZpbmUJQlRfQ09FWF9NRUNIX0hJRF9BMkRQCQkJNQotI2RlZmluZQlCVF9DT0VYX01FQ0hfSElEX1BBTgkJCTYKLSNkZWZpbmUJQlRfQ09FWF9NRUNIX1BBTl9BMkRQCQkJNwotI2RlZmluZQlCVF9DT0VYX01FQ0hfSElEX1NDT19FU0NPCQk4Ci0jZGVmaW5lCUJUX0NPRVhfTUVDSF9GVFBfQTJEUAkJCTkKLSNkZWZpbmUJQlRfQ09FWF9NRUNIX0NPTU1PTgkJCTEwCi0jZGVmaW5lCUJUX0NPRVhfTUVDSF9NQVgJCQkxMQotLyoJQlQgRGJnIEN0cmwgKi8KLSNkZWZpbmUJQlRfREJHX1BST0ZJTEVfTk9ORQkJCTAKLSNkZWZpbmUJQlRfREJHX1BST0ZJTEVfU0NPCQkJMQotI2RlZmluZQlCVF9EQkdfUFJPRklMRV9ISUQJCQkyCi0jZGVmaW5lCUJUX0RCR19QUk9GSUxFX0EyRFAJCQkzCi0jZGVmaW5lCUJUX0RCR19QUk9GSUxFX1BBTgkJCTQKLSNkZWZpbmUJQlRfREJHX1BST0ZJTEVfSElEX0EyRFAJCQk1Ci0jZGVmaW5lCUJUX0RCR19QUk9GSUxFX0hJRF9QQU4JCQk2Ci0jZGVmaW5lCUJUX0RCR19QUk9GSUxFX1BBTl9BMkRQCQkJNwotI2RlZmluZQlCVF9EQkdfUFJPRklMRV9NQVgJCQk5Ci0KLXN0cnVjdCBidF9jb2V4aXN0X3N0ciB7Ci0JdTgJCQlCbHVldG9vdGhDb2V4aXN0OwotCXU4CQkJQlRfQW50X051bTsKLQl1OAkJCUJUX0NvZXhpc3RUeXBlOwotCXU4CQkJQlRfQW50X2lzb2xhdGlvbjsJLyogMDpnb29kLCAxOmJhZCAqLwotCXU4CQkJYnRfcmFkaW9zaGFyZWR0eXBlOwotCXUzMgkJCVJhdGlvX1R4OwotCXUzMgkJCVJhdGlvX1BSSTsKLQl1OAkJCWJJbml0bGl6ZWQ7Ci0JdTMyCQkJQnRSZlJlZ09yaWdpbjFFOwotCXUzMgkJCUJ0UmZSZWdPcmlnaW4xRjsKLQl1OAkJCWJCVEJ1c3lUcmFmZmljOwotCXU4CQkJYkJUVHJhZmZpY01vZGVTZXQ7Ci0JdTgJCQliQlROb25UcmFmZmljTW9kZVNldDsKLQlzdHJ1Y3QgYnRfdHJhZmZpY19zdGF0aXN0aWNzCQlCVDIxVHJhZmZpY1N0YXRpc3RpY3M7Ci0JdTY0CQkJQ3VycmVudFN0YXRlOwotCXU2NAkJCVByZXZpb3VzU3RhdGU7Ci0JdTgJCQlwcmVSc3NpU3RhdGU7Ci0JdTgJCQlwcmVSc3NpU3RhdGUxOwotCXU4CQkJcHJlUnNzaVN0YXRlQmVhY29uOwotCXU4CQkJYkZXQ29leGlzdEFsbE9mZjsKLQl1OAkJCWJTV0NvZXhpc3RBbGxPZmY7Ci0JdTgJCQliSFdDb2V4aXN0QWxsT2ZmOwotCXU4CQkJYkJhbGFuY2VPbjsKLQl1OAkJCWJTaW5nbGVBbnRPbjsKLQl1OAkJCWJJbnRlcnJ1cHRPbjsKLQl1OAkJCWJNdWx0aU5BVk9uOwotCXU4CQkJUHJlV0xBTkFjdEg7Ci0JdTgJCQlQcmVXTEFOQWN0TDsKLQl1OAkJCVdMQU5BY3RIOwotCXU4CQkJV0xBTkFjdEw7Ci0JdTgJCQlBMkRQU3RhdGU7Ci0JdTgJCQlBbnRlbm5hU3RhdGU7Ci0JdTMyCQkJbGFzdEJ0RWRjYTsKLQl1MTYJCQlsYXN0X2FnZ3JfbnVtOwotCXU4CQkJYkVEQ0FJbml0aWFsaXplZDsKLQl1OAkJCWV4ZWNfY250OwotCXU4CQkJYjg3MjNhQWdjVGFibGVPbjsKLQl1OAkJCWI5MkRBZ2NUYWJsZU9uOwotCXN0cnVjdCBidF9jb2V4aXN0Xzg3MjNhCWhhbENvZXg4NzIzOwotCXU4CQkJYnRBY3RpdmVaZXJvQ250OwotCXU4CQkJYkN1ckJ0RGlzYWJsZWQ7Ci0JdTgJCQliUHJlQnREaXNhYmxlZDsKLQl1OAkJCWJOZWVkVG9Sb2FtRm9yQnREaXNhYmxlRW5hYmxlOwotCXU4CQkJZnczYVZhbFs1XTsKLX07Ci0KLXZvaWQgQlRETV9DaGVja0FudFNlbE1vZGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIEJURE1fRndDMmhCdFJzc2koc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnRtcEJ1Zik7Ci0jZGVmaW5lIEJUX0Z3QzJoQnRSc3NpIEJURE1fRndDMmhCdFJzc2kKLXZvaWQgQlRETV9EaXNwbGF5QnRDb2V4SW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLSNkZWZpbmUgQlRfRGlzcGxheUJ0Q29leEluZm8gQlRETV9EaXNwbGF5QnRDb2V4SW5mbwotdm9pZCBCVERNX1JlamVjdEFQQWdncmVnYXRlZFBhY2tldChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBiUmVqZWN0KTsKLXU4IEJURE1fSXNIVDQwKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdTggQlRETV9MZWdhY3koc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIEJURE1fQ2hlY2tXaUZpU3RhdGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1zMzIgQlRETV9HZXRSeFNTKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdTggQlRETV9DaGVja0NvZXhCY25Sc3NpU3RhdGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggbGV2ZWxOdW0sCi0JCQkgICAgICB1OCBSc3NpVGhyZXNoLCB1OCBSc3NpVGhyZXNoMSk7Ci11OCBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZTEoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggbGV2ZWxOdW0sCi0JCQkgICAgdTggUnNzaVRocmVzaCwgdTggUnNzaVRocmVzaDEpOwotdTggQlRETV9DaGVja0NvZXhSU1NJU3RhdGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggbGV2ZWxOdW0sCi0JCQkgICB1OCBSc3NpVGhyZXNoLCB1OCBSc3NpVGhyZXNoMSk7Ci12b2lkIEJURE1fQmFsYW5jZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBiQmFsYW5jZU9uLCB1OCBtczAsIHU4IG1zMSk7Ci12b2lkIEJURE1fQUdDVGFibGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggdHlwZSk7Ci12b2lkIEJURE1fQkJCYWNrT2ZmTGV2ZWwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggdHlwZSk7Ci12b2lkIEJURE1fRldDb2V4QWxsT2ZmKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBCVERNX1NXQ29leEFsbE9mZihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRETV9IV0NvZXhBbGxPZmYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIEJURE1fQ29leEFsbE9mZihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRETV9UdXJuT2ZmQnRDb2V4aXN0QmVmb3JlRW50ZXJJUFMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIEJURE1fU2lnbmFsQ29tcGVuc2F0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpyc3NpX3dpZmksCi0JCQkgICAgIHU4ICpyc3NpX2J0KTsKLXZvaWQgQlRETV9VcGRhdGVDb2V4U3RhdGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci11OCBCVERNX0lzU2FtZUNvZXhpc3RTdGF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRETV9QV0RCTW9uaXRvcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXU4IEJURE1fSXNCVEJ1c3koc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0jZGVmaW5lIEJUX0lzQnRCdXN5IEJURE1fSXNCVEJ1c3kKLXU4IEJURE1fSXNXaWZpQnVzeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXU4IEJURE1fSXNDb2V4aXN0U3RhdGVDaGFuZ2VkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdTggQlRETV9Jc1dpZmlVcGxpbmsoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci11OCBCVERNX0lzV2lmaURvd25saW5rKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdTggQlRETV9Jc0JUSFNNb2RlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdTggQlRETV9Jc0JUVXBsaW5rKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdTggQlRETV9Jc0JURG93bmxpbmsoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIEJURE1fQWRqdXN0Rm9yQnRPcGVyYXRpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIEJURE1fRm9ySGFsdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRETV9XaWZpU2Nhbk5vdGlmeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBzY2FuVHlwZSk7Ci12b2lkIEJURE1fV2lmaUFzc29jaWF0ZU5vdGlmeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBhY3Rpb24pOwotdm9pZCBCVERNX01lZGlhU3RhdHVzTm90aWZ5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgZW51bSBydF9tZWRpYV9zdGF0dXMgbXN0YXR1cyk7Ci12b2lkIEJURE1fRm9yRGhjcChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRETV9SZXNldEFjdGlvblByb2ZpbGVTdGF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRETV9TZXRCdENvZXhDdXJyQW50TnVtKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGFudE51bSk7Ci0jZGVmaW5lIEJUX1NldEJ0Q29leEN1cnJBbnROdW0gQlRETV9TZXRCdENvZXhDdXJyQW50TnVtCi11OCBCVERNX0lzQWN0aW9uU0NPKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdTggQlRETV9Jc0FjdGlvbkhJRChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXU4IEJURE1fSXNBY3Rpb25BMkRQKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdTggQlRETV9Jc0FjdGlvblBBTihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXU4IEJURE1fSXNBY3Rpb25ISURBMkRQKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdTggQlRETV9Jc0FjdGlvbkhJRFBBTihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXU4IEJURE1fSXNBY3Rpb25QQU5BMkRQKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdTMyIEJURE1fQnRUeFJ4Q291bnRlckgoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci11MzIgQlRETV9CdFR4UnhDb3VudGVyTChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotLyogID09PT09IEVuZCBvZiBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvQlRDb2V4aXN0L0hhbEJ0Q29leGlzdC5oID09PT09ICovCi0KLS8qICA9PT09PSBCZWxvdyB0aGlzIGxpbmUgaXMgc3luYyBmcm9tIFNENyBkcml2ZXIgSEFML0hhbEJULmggPT09PT0gKi8KLQotI2RlZmluZSBSVFNfQ1RTX05PX0xFTl9MSU1JVAkwCi0KLXU4IEhBTEJUX0dldFBHQW50TnVtKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotI2RlZmluZSBCVF9HZXRQR0FudE51bSBIQUxCVF9HZXRQR0FudE51bQotdm9pZCBIQUxCVF9TZXRLZXkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggRW50cnlOdW0pOwotdm9pZCBIQUxCVF9SZW1vdmVLZXkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggRW50cnlOdW0pOwotdTggSEFMQlRfSXNCVEV4aXN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotI2RlZmluZSBCVF9Jc0J0RXhpc3QgSEFMQlRfSXNCVEV4aXN0Ci11OCBIQUxCVF9CVENoaXBUeXBlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBIQUxCVF9TZXRSdHNDdHNOb0xlbkxpbWl0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0vKiAgPT09PT0gRW5kIG9mIHN5bmMgZnJvbSBTRDcgZHJpdmVyIEhBTC9IYWxCVC5jID09PT09ICovCi0KLSNkZWZpbmUgX2J0X2RiZ19vZmZfCQkwCi0jZGVmaW5lIF9idF9kYmdfb25fCQkxCi0KLWV4dGVybiB1MzIgQlRDb2V4RGJnTGV2ZWw7Ci0KLQotCi0jZW5kaWYgLyogIF9fUlRMODcyM0FfQlRfQ09FWElTVF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9idF9pbnRmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfYnRfaW50Zi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzMzNTU5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9idF9pbnRmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEyIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQoYykgMjAxNCwgSmVzIFNvcmVuc2VuIDxKZXMuU29yZW5zZW5AcmVkaGF0LmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1JUTDg3MjNBX0JUX0lOVEZfSF9fCi0jZGVmaW5lIF9fUlRMODcyM0FfQlRfSU5URl9IX18KLQotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9CVF9DT0VYSVNUCi1lbnVtIHJ0X21lZGlhX3N0YXR1czsKLWJvb2wgcnRsODcyM2FfQlRfdXNpbmdfYW50ZW5uYV8xKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotYm9vbCBydGw4NzIzYV9CVF9lbmFibGVkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotYm9vbCBydGw4NzIzYV9CVF9jb2V4aXN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYV9CVF9kb19jb2V4aXN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYV9CVF93aWZpc2Nhbl9ub3RpZnkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggc2NhblR5cGUpOwotdm9pZCBydGw4NzIzYV9CVF9tZWRpYXN0YXR1c19ub3RpZnkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgZW51bSBydF9tZWRpYV9zdGF0dXMgbXN0YXR1cyk7Ci12b2lkIHJ0bDg3MjNhX0JUX3NwZWNpYWxwYWNrZXRfbm90aWZ5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYV9CVF9scHNfbGVhdmUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX0JUX2Rpc2FibGVfY29leGlzdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLWJvb2wgcnRsODcyM2FfQlRfZGlzYWJsZV9FRENBX3R1cmJvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYV9kdWFsX2FudGVubmFfZGV0ZWN0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYV9CVF9pbml0X2h3Y29uZmlnKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYV9CVF93aWZpYXNzb2NpYXRlX25vdGlmeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBhY3Rpb24pOwotdm9pZCBydGw4NzIzYV9CVF9pbml0X2hhbF92YXJzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYV9md19jMmhfQlRfaW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqdG1wQnVmLCB1OCBsZW5ndGgpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgYm9vbCBydGw4NzIzYV9CVF91c2luZ19hbnRlbm5hXzEoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlyZXR1cm4gZmFsc2U7Ci19Ci1zdGF0aWMgaW5saW5lIGJvb2wgcnRsODcyM2FfQlRfZW5hYmxlZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXJldHVybiBmYWxzZTsKLX0KLXN0YXRpYyBpbmxpbmUgYm9vbCBydGw4NzIzYV9CVF9jb2V4aXN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JcmV0dXJuIGZhbHNlOwotfQotI2RlZmluZSBydGw4NzIzYV9CVF9kb19jb2V4aXN0KHBhZGFwdGVyKQkJCWRvIHt9IHdoaWxlKDApCi0jZGVmaW5lIHJ0bDg3MjNhX0JUX3dpZmlzY2FuX25vdGlmeShwYWRhcHRlciwgc2NhblR5cGUpCQlkbyB7fSB3aGlsZSgwKQotI2RlZmluZSBydGw4NzIzYV9CVF9tZWRpYXN0YXR1c19ub3RpZnkocGFkYXB0ZXIsIG1zdGF0dXMpCWRvIHt9IHdoaWxlKDApCi0jZGVmaW5lIHJ0bDg3MjNhX0JUX3NwZWNpYWxwYWNrZXRfbm90aWZ5KHBhZGFwdGVyKQkJZG8ge30gd2hpbGUoMCkKLSNkZWZpbmUgcnRsODcyM2FfQlRfbHBzX2xlYXZlKHBhZGFwdGVyKQkJCQlkbyB7fSB3aGlsZSgwKQotI2RlZmluZSBydGw4NzIzYV9CVF9kaXNhYmxlX2NvZXhpc3QocGFkYXB0ZXIpCQkJZG8ge30gd2hpbGUoMCkKLXN0YXRpYyBpbmxpbmUgYm9vbCBydGw4NzIzYV9CVF9kaXNhYmxlX0VEQ0FfdHVyYm8oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0jZGVmaW5lIHJ0bDg3MjNhX2R1YWxfYW50ZW5uYV9kZXRlY3Rpb24ocGFkYXB0ZXIpCQlkbyB7fSB3aGlsZSgwKQotI2RlZmluZSBydGw4NzIzYV9CVF9pbml0X2h3Y29uZmlnKHBhZGFwdGVyKQkJCWRvIHt9IHdoaWxlKDApCi0jZGVmaW5lIHJ0bDg3MjNhX0JUX3dpZmlhc3NvY2lhdGVfbm90aWZ5KHBhZGFwdGVyLCBhY3Rpb24pCWRvIHt9IHdoaWxlKDApCi0jZGVmaW5lIHJ0bDg3MjNhX0JUX2luaXRfaGFsX3ZhcnMocGFkYXB0ZXIpCQkJZG8ge30gd2hpbGUoMCkKLSNkZWZpbmUgcnRsODcyM2FfZndfYzJoX0JUX2luZm8ocGFkYXB0ZXIsIHRtcEJ1ZiwgbGVuZ3RoKQlkbyB7fSB3aGlsZSgwKQotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX2NtZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX2NtZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTU1MzVhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9jbWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEyIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19SVEw4NzIzQV9DTURfSF9fCi0jZGVmaW5lIF9fUlRMODcyM0FfQ01EX0hfXwotCi0KLSNkZWZpbmUgSDJDX0JUX0ZXX1BBVENIX0xFTgkJMwotI2RlZmluZSBIMkNfQlRfUFdSX0ZPUkNFX0xFTgkJMwotCi1lbnVtIGNtZF9tc2dfZWxlbWVudF9pZAotewotCU5PTkVfQ01ETVNHX0VJRCwKLQlBUF9PRkZMT0FEX0VJRCA9IDAsCi0JU0VUX1BXUk1PREVfRUlEID0gMSwKLQlKT0lOQlNTX1JQVF9FSUQgPSAyLAotCVJTVkRfUEFHRV9FSUQgPSAzLAotCVJTU0lfNF9FSUQgPSA0LAotCVJTU0lfU0VUVElOR19FSUQgPSA1LAotCU1BQ0lEX0NPTkZJR19FSUQgPSA2LAotCU1BQ0lEX1BTX01PREVfRUlEID0gNywKLQlQMlBfUFNfT0ZGTE9BRF9FSUQgPSA4LAotCVNFTEVDVElWRV9TVVNQRU5EX1JPRl9DTUQgPSA5LAotCUJUX1FVRVVFX1BLVF9FSUQgPSAxNywKLQlCVF9BTlRfVERNQV9FSUQgPSAyMCwKLQlCVF8yQU5UX0hJRF9FSUQgPSAyMSwKLQlQMlBfUFNfQ1RXX0NNRF9FSUQgPSAzMiwKLQlGT1JDRV9CVF9UWF9QV1JfRUlEID0gMzMsCi0JU0VUX1RETUFfV0xBTl9BQ1RfVElNRV9FSUQgPSAzNCwKLQlTRVRfQlRfVFhfUkVUUllfSU5ERVhfRUlEID0gMzUsCi0JSElEX1BST0ZJTEVfRU5BQkxFX0VJRCA9IDM2LAotCUJUX0lHTk9SRV9XTEFOX0FDVF9FSUQgPSAzNywKLQlCVF9QVEFfTUFOQUdFUl9VUERBVEVfRU5BQkxFX0VJRCA9IDM4LAotCURBQ19TV0lOR19WQUxVRV9FSUQgPSA0MSwKLQlUUkFESVRJT05BTF9URE1BX0VOX0VJRCA9IDUxLAotCUgyQ19CVF9GV19QQVRDSCA9IDU0LAotCUJfVFlQRV9URE1BX0VJRCA9IDU4LAotCVNDQU5fRU5fRUlEID0gNTksCi0JTE9XUFdSX0xQU19FSUQgPSA3MSwKLQlIMkNfUkVTRVRfVFNGID0gNzUsCi0JTUFYX0NNRE1TR19FSUQKLX07Ci0KLXN0cnVjdCBjbWRfbXNnX3Bhcm0gewotCXU4IGVpZDsgLyogZWxlbWVudCBpZCAqLwotCXU4IHN6OyAvKiAgc3ogKi8KLQl1OCBidWZbNl07Ci19OwotCi1zdHJ1Y3Qgc2V0cHdybW9kZV9wYXJtIHsKLQl1OCBNb2RlOwotCXU4IFNtYXJ0UFM7Ci0JdTggQXdha2VJbnRlcnZhbDsJLyogIHVuaXQ6IGJlYWNvbiBpbnRlcnZhbCAqLwotCXU4IGJBbGxRdWV1ZVVBUFNEOwotCi0jZGVmaW5lIFNFVFBNX0xPV1JYQkNOCQkJQklUKDApCi0jZGVmaW5lIFNFVFBNX0FVVE9BTlRTV0lUQ0gJCUJJVCgxKQotI2RlZmluZSBTRVRQTV9QU0FMTE9XQlRISUdIUFJJCUJJVCgyKQotCXU4IEJjbkFudE1vZGU7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgSDJDX1NTX1JGT0ZGX1BBUkFNewotCXU4IFJPRk9uOyAvKiAgMTogb24sIDA6b2ZmICovCi0JdTE2IGdwaW9fcGVyaW9kOyAvKiAgdW5pdDogMTAyNCB1cyAqLwotfV9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotCi1zdHJ1Y3Qgam9pbmJzc3JwdF9wYXJtIHsKLQl1OCBPcE1vZGU7CS8qICBlbnVtIHJ0X21lZGlhX3N0YXR1cyAqLwotfTsKLQotc3RydWN0IHJzdmRwYWdlX2xvYyB7Ci0JdTggTG9jUHJvYmVSc3A7Ci0JdTggTG9jUHNQb2xsOwotCXU4IExvY051bGxEYXRhOwotCXU4IExvY1Fvc051bGw7Ci0JdTggTG9jQlRRb3NOdWxsOwotfTsKLQotc3RydWN0IFAyUF9QU19PZmZsb2FkX3QgewotCXU4IE9mZmxvYWRfRW46MTsKLQl1OCByb2xlOjE7IC8qICAxOiBPd25lciwgMDogQ2xpZW50ICovCi0JdTggQ1RXaW5kb3dfRW46MTsKLQl1OCBOb0EwX0VuOjE7Ci0JdTggTm9BMV9FbjoxOwotCXU4IEFsbFN0YVNsZWVwOjE7IC8qICBPbmx5IHZhbGlkIGluIE93bmVyICovCi0JdTggZGlzY292ZXJ5OjE7Ci0JdTggcnN2ZDoxOwotfTsKLQotc3RydWN0IFAyUF9QU19DVFdQZXJpb2RfdCB7Ci0JdTggQ1RXUGVyaW9kOwkvKiBUVSAqLwotfTsKLQotI2RlZmluZSBCX1RETUFfRU4JCQlCSVQoMCkKLSNkZWZpbmUgQl9URE1BX0ZJWEFOVElOQlQJCUJJVCgxKQotI2RlZmluZSBCX1RETUFfVFhQU1BPTEwJCQlCSVQoMikKLSNkZWZpbmUgQl9URE1BX1ZBTDg3MAkJCUJJVCgzKQotI2RlZmluZSBCX1RETUFfQVVUT1dBS0VVUAkJQklUKDQpCi0jZGVmaW5lIEJfVERNQV9OT1BTCQkJQklUKDUpCi0jZGVmaW5lIEJfVERNQV9XTEFOSElHSFBSSQkJQklUKDYpCi0KLXN0cnVjdCBiX3R5cGVfdGRtYV9wYXJtIHsKLQl1OCBvcHRpb247Ci0KLQl1OCBUQlRUT25QZXJpb2Q7Ci0JdTggTWVkUGVyaW9kOwotCXU4IHJzdmQzMDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBzY2FuX2VuX3Bhcm0gewotCXU4IEVuOwotfSBfX3BhY2tlZDsKLQotLyogIEJUX1BXUiAqLwotI2RlZmluZSBTRVRfSDJDQ01EX0JUX1BXUl9JRFgoX19wSDJDQ21kLCBfX1ZhbHVlKQkJCQkJCQlTRVRfQklUU19UT19MRV8xQllURV84QklUKF9fcEgyQ0NtZCwgMCwgOCwgX19WYWx1ZSkKLQotLyogIEJUX0ZXX1BBVENIICovCi0jZGVmaW5lIFNFVF9IMkNDTURfQlRfRldfUEFUQ0hfRU5BQkxFKF9fcEgyQ0NtZCwgX19WYWx1ZSkJCQkJCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcEgyQ0NtZCwgMCwgOCwgX19WYWx1ZSkgLyoJU0VUX0JJVFNfVE9fTEVfMUJZVEUoX19wSDJDQ21kLCAwLCA4LCBfX1ZhbHVlKSAqLwotI2RlZmluZSBTRVRfSDJDQ01EX0JUX0ZXX1BBVENIX1NJWkUoX19wSDJDQ21kLCBfX1ZhbHVlKQkJCQkJCVNFVF9CSVRTX1RPX0xFXzRCWVRFKF9fcEgyQ0NtZCwgOCwgMTYsIF9fVmFsdWUpIC8qCVNFVF9CSVRTX1RPX0xFXzJCWVRFKChfX3BIMkNDbWQpKzEsIDAsIDE2LCBfX1ZhbHVlKSAqLwotCi1zdHJ1Y3QgbG93cHdyX2xwc19wYXJtewotCXU4IGJjbl9jb3VudDo0OwotCXU4IHRiX2Jjbl90aHJlc2hvbGQ6MzsKLQl1OCBlbmFibGU6MTsKLQl1OCBiY25faW50ZXJ2YWw7Ci0JdTggZHJvcF90aHJlc2hvbGQ7Ci0JdTggbWF4X2Vhcmx5X3BlcmlvZDsKLQl1OCBtYXhfYmNuX3RpbWVvdXRfcGVyaW9kOwotfSBfX3BhY2tlZDsKLQotCi0vKiAgaG9zdCBtZXNzYWdlIHRvIGZpcm13YXJlIGNtZCAqLwotdm9pZCBydGw4NzIzYV9zZXRfRndQd3JNb2RlX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBNb2RlKTsKLXZvaWQgcnRsODcyM2Ffc2V0X0Z3Sm9pbkJzc1JlcG9ydF9jbWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggbXN0YXR1cyk7Ci0jaWZkZWYgQ09ORklHXzg3MjNBVV9CVF9DT0VYSVNUCi12b2lkIHJ0bDg3MjNhX3NldF9CVENvZXhfQVBfbW9kZV9Gd1JzdmRQa3RfY21kKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotI2Vsc2UKLSNkZWZpbmUgcnRsODcyM2Ffc2V0X0JUQ29leF9BUF9tb2RlX0Z3UnN2ZFBrdF9jbWQocGFkYXB0ZXIpIGRvIHt9IHdoaWxlKDApCi0jZW5kaWYKLWludCBydGw4NzIzYV9zZXRfcnNzaV9jbWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIHBhcmFtKTsKLWludCBydGw4NzIzYV9zZXRfcmFpZF9jbWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIG1hc2ssIHU4IGFyZyk7Ci12b2lkIHJ0bDg3MjNhX2FkZF9yYXRlYXRpZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgYml0bWFwLCB1OCBhcmcsIHU4IHJzc2lfbGV2ZWwpOwotCi1pbnQgRmlsbEgyQ0NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBFbGVtZW50SUQsIHUzMiBDbWRMZW4sIHU4ICpwQ21kQnVmZmVyKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfZG0uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9kbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjIzNmU4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9kbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1JUTDg3MjNBX0RNX0hfXwotI2RlZmluZSBfX1JUTDg3MjNBX0RNX0hfXwotLyogICovCi0vKiAgRGVzY3JpcHRpb246ICovCi0vKiAgKi8KLS8qICBUaGlzIGZpbGUgaXMgZm9yIDg3MjNBIGR5bmFtaWMgbWVjaGFuaXNtIG9ubHkgKi8KLS8qICAqLwotLyogICovCi0vKiAgKi8KLSNkZWZpbmUgRFlOQU1JQ19GVU5DX0JUIEJJVCgwKQotCi1lbnVtewotCVVQX0xJTkssCi0JRE9XTl9MSU5LLAotfTsKLS8qICAqLwotLyogIHN0cnVjdHVyZSBhbmQgZGVmaW5lICovCi0vKiAgKi8KLQotLyogIGR1cGxpY2F0ZSBjb2RlLHdpbGwgbW92ZSB0byBPRE0gIyMjIyMjIyMjICovCi0jZGVmaW5lIElRS19NQUNfUkVHX05VTQkJNAotI2RlZmluZSBJUUtfQUREQV9SRUdfTlVNCQkxNgotI2RlZmluZSBJUUtfQkJfUkVHX05VTQkJCTkKLSNkZWZpbmUgSFBfVEhFUk1BTF9OVU0JCTgKLS8qICBkdXBsaWNhdGUgY29kZSx3aWxsIG1vdmUgdG8gT0RNICMjIyMjIyMjIyAqLwotc3RydWN0IGRtX3ByaXYgewotCXUzMglJbml0T0RNRmxhZzsKLQotCS8qICBVcHBlciBhbmQgTG93ZXIgU2lnbmFsIHRocmVzaG9sZCBmb3IgUmF0ZSBBZGFwdGl2ZSovCi0JaW50CVVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOwotCWludAlVbmRlY29yYXRlZFNtb290aGVkQ0NLOwotCWludAlFbnRyeU1pblVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOwotCWludAlFbnRyeU1heFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOwotCWludAlNaW5VbmRlY29yYXRlZFBXREJGb3JETTsKLQlpbnQJTGFzdE1pblVuZGVjb3JhdGVkUFdEQkZvckRNOwotCi0JczMyCVVuZGVjb3JhdGVkU21vb3RoZWRCZWFjb247Ci0JI2lmZGVmIENPTkZJR184NzIzQVVfQlRfQ09FWElTVAotCXMzMiBCVF9FbnRyeU1pblVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOwotCXMzMiBCVF9FbnRyeU1heFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOwotCSNlbmRpZgotCi0JLyogZm9yIEhpZ2ggUG93ZXIgKi8KLQl1OCBEeW5hbWljVHhIaWdoUG93ZXJMdmw7LyogQWRkIGJ5IEphY2tlbiBUeCBQb3dlciBDb250cm9sIGZvciBOZWFyL0ZhciBSYW5nZSAyMDA4LzAzLzA2ICovCi0KLQkvKiBmb3IgdHggcG93ZXIgdHJhY2tpbmcgKi8KLQl1OAliVFhQb3dlclRyYWNraW5nOwotCXU4CVRYUG93ZXJjb3VudDsKLQl1OAliVFhQb3dlclRyYWNraW5nSW5pdDsKLQl1OAlUeFBvd2VyVHJhY2tDb250cm9sOwkvKiBmb3IgbXAgbW9kZSwgdHVybiBvZmYgdHhwd3J0cmFja2luZyBhcyBkZWZhdWx0ICovCi0JdTgJVE1fVHJpZ2dlcjsKLQotCXU4CVRoZXJtYWxNZXRlclsyXTsJCQkJLyogIFRoZXJtYWxNZXRlciwgaW5kZXggMCBmb3IgUkZJQzAsIGFuZCAxIGZvciBSRklDMSAqLwotCXU4CVRoZXJtYWxWYWx1ZTsKLQl1OAlUaGVybWFsVmFsdWVfTENLOwotCXU4CVRoZXJtYWxWYWx1ZV9JUUs7Ci0JdTgJVGhlcm1hbFZhbHVlX0RQSzsKLQotCXU4CWJSZlBpRW5hYmxlOwotCi0JLyogZm9yIEFQSyAqLwotCXUzMglBUEtvdXRwdXRbMl1bMl07CS8qIHBhdGggQS9COyBvdXRwdXQxXzFhL291dHB1dDFfMmEgKi8KLQl1OAliQVBLZG9uZTsKLQl1OAliQVBLVGhlcm1hbE1ldGVySWdub3JlOwotCXU4CWJEUGRvbmU7Ci0JdTgJYkRQUGF0aEFPSzsKLQl1OAliRFBQYXRoQk9LOwotCi0JLyogZm9yIElRSyAqLwotCXUzMglSZWdDMDQ7Ci0JdTMyCVJlZzg3NDsKLQl1MzIJUmVnQzA4OwotCXUzMglSZWdCNjg7Ci0JdTMyCVJlZ0I2QzsKLQl1MzIJUmVnODcwOwotCXUzMglSZWc4NjA7Ci0JdTMyCVJlZzg2NDsKLQl1MzIJQUREQV9iYWNrdXBbSVFLX0FEREFfUkVHX05VTV07Ci0JdTMyCUlRS19NQUNfYmFja3VwW0lRS19NQUNfUkVHX05VTV07Ci0JdTMyCUlRS19CQl9iYWNrdXBfcmVjb3Zlcls5XTsKLQl1MzIJSVFLX0JCX2JhY2t1cFtJUUtfQkJfUkVHX05VTV07Ci0JdTgJUG93ZXJJbmRleF9iYWNrdXBbNl07Ci0KLQl1OAliQ0NLaW5DSDE0OwotCi0JdTgJQ0NLX2luZGV4OwotCXU4CU9GRE1faW5kZXhbMl07Ci0KLQl1OAliRG9uZVR4cG93ZXI7Ci0JdTgJQ0NLX2luZGV4X0hQOwotCXU4CU9GRE1faW5kZXhfSFBbMl07Ci0JdTgJVGhlcm1hbFZhbHVlX0hQW0hQX1RIRVJNQUxfTlVNXTsKLQl1OAlUaGVybWFsVmFsdWVfSFBfaW5kZXg7Ci0KLQkvKiBmb3IgVHhQd3JUcmFja2luZyAqLwotCXMzMglSZWdFOTQ7Ci0JczMyICAgICBSZWdFOUM7Ci0JczMyCVJlZ0VCNDsKLQlzMzIJUmVnRUJDOwotCi0JdTMyCVRYUG93ZXJUcmFja2luZ0NhbGxiYWNrQ250OwkvKiBjb3NhIGFkZCBmb3IgZGVidWcgKi8KLQotCXUzMglwcnZfdHJhZmZpY19pZHg7IC8qICBlZGNhIHR1cmJvICovCi0KLQlzMzIJT0ZETV9Qa3RfQ250OwotCXU4CVJTU0lfU2VsZWN0OwotLyoJdTgJRElHX0R5bmFtaWNfTUlOIDsgKi8KLS8qICBkdXBsaWNhdGUgY29kZSx3aWxsIG1vdmUgdG8gT0RNICMjIyMjIyMjIyAqLwotCS8qICBBZGQgZm9yIFJlYWRpbmcgSW5pdGlhbCBEYXRhIFJhdGUgU0VMIFJlZ2lzdGVyIDB4NDg0IGR1cmluZyB3YXRjaGRvZy4gVXNpbmcgZm9yIGZpbGwgdHggZGVzYy4gMjAxMS4zLjIxIGJ5IFRob21hcyAqLwotCXU4CUlOSURBVEFfUkFURVszMl07Ci19OwotCi0KLS8qICAqLwotLyogIGZ1bmN0aW9uIHByb3RvdHlwZSAqLwotLyogICovCi0KLXZvaWQgcnRsODcyM2FfaW5pdF9kbV9wcml2KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi12b2lkIHJ0bDg3MjNhX0luaXRIYWxEbShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnRsODcyM2FfSGFsRG1XYXRjaERvZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfaGFsLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfaGFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YTBmZDQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX2hhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1JUTDg3MjNBX0hBTF9IX18KLSNkZWZpbmUgX19SVEw4NzIzQV9IQUxfSF9fCi0KLSNpbmNsdWRlICJydGw4NzIzYV9zcGVjLmgiCi0jaW5jbHVkZSAicnRsODcyM2FfcGcuaCIKLSNpbmNsdWRlICJIYWw4NzIzQVBoeVJlZy5oIgotI2luY2x1ZGUgIkhhbDg3MjNBUGh5Q2ZnLmgiCi0jaW5jbHVkZSAicnRsODcyM2FfcmYuaCIKLSNpbmNsdWRlICJydGw4NzIzYV9idF9pbnRmLmgiCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9CVF9DT0VYSVNUCi0jaW5jbHVkZSAicnRsODcyM2FfYnQtY29leGlzdC5oIgotI2VuZGlmCi0jaW5jbHVkZSAicnRsODcyM2FfZG0uaCIKLSNpbmNsdWRlICJydGw4NzIzYV9yZWN2LmgiCi0jaW5jbHVkZSAicnRsODcyM2FfeG1pdC5oIgotI2luY2x1ZGUgInJ0bDg3MjNhX2NtZC5oIgotI2luY2x1ZGUgInJ0bDg3MjNhX3NyZXNldC5oIgotI2luY2x1ZGUgInJ0d19lZnVzZS5oIgotI2luY2x1ZGUgInJ0d19lZXByb20uaCIKLQotI2luY2x1ZGUgIm9kbV9wcmVjb21wLmgiCi0jaW5jbHVkZSAib2RtLmgiCi0KLQotLyogMlRPRE86IFdlIHNob3VsZCBkZWZpbmUgODE5MlMgZmlybXdhcmUgcmVsYXRlZCBtYWNybyBzZXR0aW5ncyBoZXJlISEgKi8KLSNkZWZpbmUgUlRMODE5WF9ERUZBVUxUX1JGX1RZUEUJCQlSRl8xVDJSCi0jZGVmaW5lIFJUTDgxOVhfVE9UQUxfUkZfUEFUSAkJCQkyCi0KLS8qICAqLwotLyoJCVJUTDg3MjNTIEZyb20gaGVhZGVyICovCi0vKiAgKi8KLQotLyogIEZ3IEFycmF5ICovCi0jZGVmaW5lIFJ0bDg3MjNfRndJbWFnZUFycmF5CQkJCVJ0bDg3MjNVRndJbWdBcnJheQotI2RlZmluZSBSdGw4NzIzX0Z3VU1DQkN1dEltYWdlQXJyYXlXaXRoQlQJCVJ0bDg3MjNVRndVTUNCQ3V0SW1nQXJyYXlXaXRoQlQKLSNkZWZpbmUgUnRsODcyM19Gd1VNQ0JDdXRJbWFnZUFycmF5V2l0aG91dEJUCVJ0bDg3MjNVRndVTUNCQ3V0SW1nQXJyYXlXaXRob3V0QlQKLQotI2RlZmluZSBSdGw4NzIzX0ltZ0FycmF5TGVuZ3RoCQkJCVJ0bDg3MjNVSW1nQXJyYXlMZW5ndGgKLSNkZWZpbmUgUnRsODcyM19VTUNCQ3V0SW1nQXJyYXlXaXRoQlRMZW5ndGgJCVJ0bDg3MjNVVU1DQkN1dEltZ0FycmF5V2l0aEJUTGVuZ3RoCi0jZGVmaW5lIFJ0bDg3MjNfVU1DQkN1dEltZ0FycmF5V2l0aG91dEJUTGVuZ3RoCVJ0bDg3MjNVVU1DQkN1dEltZ0FycmF5V2l0aG91dEJUTGVuZ3RoCi0KLSNkZWZpbmUgUnRsODcyM19QSFlfUkVHX0FycmF5X1BHCQkJUnRsODcyM1VQSFlfUkVHX0FycmF5X1BHCi0jZGVmaW5lIFJ0bDg3MjNfUEhZX1JFR19BcnJheV9QR0xlbmd0aAkJUnRsODcyM1VQSFlfUkVHX0FycmF5X1BHTGVuZ3RoCi0KLSNkZWZpbmUgUnRsODcyM19Gd1VNQ0JDdXRNUEltYWdlQXJyYXkJCVJ0bDg3MjNTRndVTUNCQ3V0TVBJbWdBcgotI2RlZmluZSBSdGw4NzIzX1VNQ0JDdXRNUEltZ0FycmF5TGVuZ3RoCQlSdGw4NzIzU1VNQ0JDdXRNUEltZ0FycmF5TGVuZ3RoCi0KLSNkZWZpbmUgRFJWSU5GT19TWgkJCQk0IC8qICB1bml0IGlzIDhieXRlcyAqLwotI2RlZmluZSBQYWdlTnVtXzEyOChfTGVuKQkJKHUzMikoKChfTGVuKT4+NykgKyAoKF9MZW4pJjB4N0YgPyAxOjApKQotCi0jZGVmaW5lIEZXXzg3MjNBX1NJWkUJCQkweDgwMDAKLSNkZWZpbmUgRldfODcyM0FfU1RBUlRfQUREUkVTUwkweDEwMDAKLSNkZWZpbmUgRldfODcyM0FfRU5EX0FERFJFU1MJCTB4MUZGRiAvKiAweDVGRkYgKi8KLQotI2RlZmluZSBNQVhfUEFHRV9TSVpFCQkJNDA5NgkvKiAgQCBwYWdlIDogNGsgYnl0ZXMgKi8KLQotI2RlZmluZSBJU19GV19IRUFERVJfRVhJU1QoX3BGd0hkcikJKChsZTE2X3RvX2NwdShfcEZ3SGRyLT5TaWduYXR1cmUpJjB4RkZGMCkgPT0gMHg5MkMwIHx8XAotCQkJCQkJCQkJKGxlMTZfdG9fY3B1KF9wRndIZHItPlNpZ25hdHVyZSkmMHhGRkYwKSA9PSAweDg4QzAgfHxcCi0JCQkJCQkJCQkobGUxNl90b19jcHUoX3BGd0hkci0+U2lnbmF0dXJlKSYweEZGRjApID09IDB4MjMwMCkKLQotLyogICovCi0vKiAgVGhpcyBzdHJ1Y3R1cmUgbXVzdCBiZSBjYXJlZCBieXRlLW9yZGVyaW5nICovCi0vKiAgKi8KLS8qICBBZGRlZCBieSB0eW5saS4gMjAwOS4xMi4wNC4gKi8KLXN0cnVjdCBydF84NzIzYV9maXJtd2FyZV9oZHIgewotCS8qICA4LWJ5dGUgYWxpbm1lbnQgcmVxdWlyZWQgKi8KLQotCS8qICBMT05HIFdPUkQgMCAtLS0tICovCi0JX19sZTE2CQlTaWduYXR1cmU7ICAvKgotCQkJCSAgICAgKiA5MkMwOiB0ZXN0IGNoaXA7IDkyQywgODhDMDogdGVzdCBjaGlwOwotCQkJCSAgICAgKiA4OEMxOiBNUCBBLWN1dDsgOTJDMTogTVAgQS1jdXQKLQkJCQkgICAgICovCi0JdTgJCUNhdGVnb3J5OwkvKiAgQVAvTklDIGFuZCBVU0IvUENJICovCi0JdTgJCUZ1bmN0aW9uOwkvKiAgUmVzZXJ2ZWQgZm9yIGRpZmZlcmVudCBGVyBmdW5jdGlvbiBpbmRjYXRpb24sIGZvciBmdXJ0aGVyIHVzZSB3aGVuIGRyaXZlciBuZWVkcyB0byBkb3dubG9hZCBkaWZmZXJlbnQgRlcgaW4gZGlmZmVyZW50IGNvbmRpdGlvbnMgKi8KLQlfX2xlMTYJCVZlcnNpb247CQkvKiAgRlcgVmVyc2lvbiAqLwotCXU4CQlTdWJ2ZXJzaW9uOwkvKiAgRlcgU3VidmVyc2lvbiwgZGVmYXVsdCAweDAwICovCi0JdTgJCVJzdmQxOwotCi0KLQkvKiAgTE9ORyBXT1JEIDEgLS0tLSAqLwotCXU4CQlNb250aDsJLyogIFJlbGVhc2UgdGltZSBNb250aCBmaWVsZCAqLwotCXU4CQlEYXRlOwkvKiAgUmVsZWFzZSB0aW1lIERhdGUgZmllbGQgKi8KLQl1OAkJSG91cjsJLyogIFJlbGVhc2UgdGltZSBIb3VyIGZpZWxkICovCi0JdTgJCU1pbnV0ZTsJLyogIFJlbGVhc2UgdGltZSBNaW51dGUgZmllbGQgKi8KLQlfX2xlMTYJCVJhbUNvZGVTaXplOwkvKiAgVGhlIHNpemUgb2YgUkFNIGNvZGUgKi8KLQlfX2xlMTYJCVJzdmQyOwotCi0JLyogIExPTkcgV09SRCAyIC0tLS0gKi8KLQlfX2xlMzIJCVN2bklkeDsJLyogIFRoZSBTVk4gZW50cnkgaW5kZXggKi8KLQlfX2xlMzIJCVJzdmQzOwotCi0JLyogIExPTkcgV09SRCAzIC0tLS0gKi8KLQlfX2xlMzIJCVJzdmQ0OwotCV9fbGUzMgkJUnN2ZDU7Ci19OwotCi0jZGVmaW5lIERSSVZFUl9FQVJMWV9JTlRfVElNRQkJMHgwNQotI2RlZmluZSBCQ05fRE1BX0FUSU1FX0lOVF9USU1FCQkweDAyCi0KLQotLyogIEJLLCBCRSwgVkksIFZPLCBIQ0NBLCBNQU5BR0VNRU5ULCBDT01NQU5ELCBISUdILCBCRUFDT04uICovCi0jZGVmaW5lIE1BWF9UWF9RVUVVRQkJOQotCi0jZGVmaW5lIFRYX1NFTEVfSFEJCQlCSVQoMCkJCS8qICBIaWdoIFF1ZXVlICovCi0jZGVmaW5lIFRYX1NFTEVfTFEJCQlCSVQoMSkJCS8qICBMb3cgUXVldWUgKi8KLSNkZWZpbmUgVFhfU0VMRV9OUQkJCUJJVCgyKQkJLyogIE5vcm1hbCBRdWV1ZSAqLwotCi0vKiAgTm90ZTogV2Ugd2lsbCBkaXZpZGUgbnVtYmVyIG9mIHBhZ2UgZXF1YWxseSBmb3IgZWFjaCBxdWV1ZSBvdGhlciB0aGFuIHB1YmxpYyBxdWV1ZSEgKi8KLSNkZWZpbmUgVFhfVE9UQUxfUEFHRV9OVU1CRVIJMHhGOAotI2RlZmluZSBUWF9QQUdFX0JPVU5EQVJZCQkoVFhfVE9UQUxfUEFHRV9OVU1CRVIgKyAxKQotCi0vKiAgRm9yIE5vcm1hbCBDaGlwIFNldHRpbmcgKi8KLS8qICAoSFBRICsgTFBRICsgTlBRICsgUFVCUSkgc2hhbGwgYmUgVFhfVE9UQUxfUEFHRV9OVU1CRVIgKi8KLSNkZWZpbmUgTk9STUFMX1BBR0VfTlVNX1BVQlEJMHhFNwotI2RlZmluZSBOT1JNQUxfUEFHRV9OVU1fSFBRCQkweDBDCi0jZGVmaW5lIE5PUk1BTF9QQUdFX05VTV9MUFEJCTB4MDIKLSNkZWZpbmUgTk9STUFMX1BBR0VfTlVNX05QUQkJMHgwMgotCi0vKiAgRm9yIFRlc3QgQ2hpcCBTZXR0aW5nICovCi0vKiAgKEhQUSArIExQUSArIFBVQlEpIHNoYWxsIGJlIFRYX1RPVEFMX1BBR0VfTlVNQkVSICovCi0jZGVmaW5lIFRFU1RfUEFHRV9OVU1fUFVCUQkJMHg3RQotCi0vKiAgRm9yIFRlc3QgQ2hpcCBTZXR0aW5nICovCi0jZGVmaW5lIFdNTV9URVNUX1RYX1RPVEFMX1BBR0VfTlVNQkVSCTB4RjUKLSNkZWZpbmUgV01NX1RFU1RfVFhfUEFHRV9CT1VOREFSWQkJKFdNTV9URVNUX1RYX1RPVEFMX1BBR0VfTlVNQkVSICsgMSkgLyogRjYgKi8KLQotI2RlZmluZSBXTU1fVEVTVF9QQUdFX05VTV9QVUJRCQkweEEzCi0jZGVmaW5lIFdNTV9URVNUX1BBR0VfTlVNX0hQUQkJMHgyOQotI2RlZmluZSBXTU1fVEVTVF9QQUdFX05VTV9MUFEJCTB4MjkKLQotLyogIE5vdGU6IEZvciBOb3JtYWwgQ2hpcCBTZXR0aW5nLCBtb2RpZnkgbGF0ZXIgKi8KLSNkZWZpbmUgV01NX05PUk1BTF9UWF9UT1RBTF9QQUdFX05VTUJFUgkweEY1Ci0jZGVmaW5lIFdNTV9OT1JNQUxfVFhfUEFHRV9CT1VOREFSWQkJKFdNTV9URVNUX1RYX1RPVEFMX1BBR0VfTlVNQkVSICsgMSkgLyogRjYgKi8KLQotI2RlZmluZSBXTU1fTk9STUFMX1BBR0VfTlVNX1BVQlEJMHhCMAotI2RlZmluZSBXTU1fTk9STUFMX1BBR0VfTlVNX0hQUQkJMHgyOQotI2RlZmluZSBXTU1fTk9STUFMX1BBR0VfTlVNX0xQUQkJMHgxQwotI2RlZmluZSBXTU1fTk9STUFMX1BBR0VfTlVNX05QUQkJMHgxQwotCi0KLS8qICAqLwotLyoJQ2hpcCBzcGVjaWZpYyAqLwotLyogICovCi0jZGVmaW5lIENISVBfQk9ORElOR19JREVOVElGSUVSKF92YWx1ZSkJKCgoX3ZhbHVlKT4+MjIpJjB4MykKLSNkZWZpbmUgQ0hJUF9CT05ESU5HXzkyQ18xVDJSCQkJMHgxCi0jZGVmaW5lIENISVBfQk9ORElOR184OENfVVNCX01DQVJECQkweDIKLSNkZWZpbmUgQ0hJUF9CT05ESU5HXzg4Q19VU0JfSFAJCQkweDEKLQotI2luY2x1ZGUgIkhhbFZlckRlZi5oIgotI2luY2x1ZGUgImhhbF9jb20uaCIKLQotLyogICovCi0vKglDaGFubmVsIFBsYW4gKi8KLS8qICAqLwotZW51bSBDaGFubmVsUGxhbgotewotCUNIUExfRkNDCT0gMCwKLQlDSFBMX0lDCQk9IDEsCi0JQ0hQTF9FVFNJCT0gMiwKLQlDSFBMX1NQQUlOCT0gMywKLQlDSFBMX0ZSQU5DRQk9IDQsCi0JQ0hQTF9NS0sJPSA1LAotCUNIUExfTUtLMQk9IDYsCi0JQ0hQTF9JU1JBRUwJPSA3LAotCUNIUExfVEVMRUMJPSA4LAotCUNIUExfR0xPQkFMCT0gOSwKLQlDSFBMX1dPUkxECT0gMTAsCi19OwotCi0jZGVmaW5lIEVGVVNFX1JFQUxfQ09OVEVOVF9MRU4JCTUxMgotI2RlZmluZSBFRlVTRV9NQVBfTEVOCQkJCTEyOAotI2RlZmluZSBFRlVTRV9NQVhfU0VDVElPTgkJCTE2Ci0jZGVmaW5lIEVGVVNFX0lDX0lEX09GRlNFVAkJCTUwNgkvKiBGb3Igc29tZSBpbmZlcmlvcml0eSBJQyBwdXJwb3NlLiBhZGRlZCBieSBSb2dlciwgMjAwOS4wOS4wMi4gKi8KLSNkZWZpbmUgQVZBSUxBQkxFX0VGVVNFX0FERFIoYWRkcikJKGFkZHIgPCBFRlVTRV9SRUFMX0NPTlRFTlRfTEVOKQotLyogICovCi0vKiAgPFJvZ2VyX05vdGVzPiAqLwotLyogIFRvIHByZXZlbnQgb3V0IG9mIGJvdW5kYXJ5IHByb2dyYW1taW5nIGNhc2UsICovCi0vKiAgbGVhdmUgMWJ5dGUgYW5kIHByb2dyYW0gZnVsbCBzZWN0aW9uICovCi0vKiAgOWJ5dGVzICsgMWJ5dCArIDVieXRlcyBhbmQgcHJlIDFieXRlLiAqLwotLyogIEZvciB3b3JzdCBjYXNlOiAqLwotLyogIHwgMWJ5dGV8LS0tLThieXRlcy0tLS18MWJ5dGV8LS01Ynl0ZXMtLXwgKi8KLS8qICB8ICAgICAgICAgfCAgICAgICAgICAgIFJlc2VydmVkKDE0Ynl0ZXMpCSAgICAgIHwgKi8KLS8qICAqLwotCi0vKiAgUEcgZGF0YSBleGNsdWRlIGhlYWRlciwgZHVtbXkgNiBieXRlcyBmcm9tIENQIHRlc3QgYW5kIHJlc2VydmVkIDFieXRlLiAqLwotI2RlZmluZSBFRlVTRV9PT0JfUFJPVEVDVF9CWVRFUwkJCTE1Ci0KLSNkZWZpbmUgRUZVU0VfUkVBTF9DT05URU5UX0xFTl84NzIzQQk1MTIKLSNkZWZpbmUgRUZVU0VfTUFQX0xFTl84NzIzQQkJCQkyNTYKLSNkZWZpbmUgRUZVU0VfTUFYX1NFQ1RJT05fODcyM0EJCQkzMgotCi0vKiAgKi8KLS8qCQkJRUZVU0UgZm9yIEJUIGRlZmluaXRpb24gKi8KLS8qICAqLwotI2RlZmluZSBFRlVTRV9CVF9SRUFMX0JBTktfQ09OVEVOVF9MRU4JNTEyCi0jZGVmaW5lIEVGVVNFX0JUX1JFQUxfQ09OVEVOVF9MRU4JCTE1MzYJLyogIDUxMiozICovCi0jZGVmaW5lIEVGVVNFX0JUX01BUF9MRU4JCQkJMTAyNAkvKiAgMWsgYnl0ZXMgKi8KLSNkZWZpbmUgRUZVU0VfQlRfTUFYX1NFQ1RJT04JCQkxMjgJCS8qICAxMDI0LzggKi8KLQotI2RlZmluZSBFRlVTRV9QUk9URUNUX0JZVEVTX0JBTksJCTE2Ci0KLS8qICAqLwotLyogIDxSb2dlcl9Ob3Rlcz4gRm9yIFJUTDg3MjMgV2lGaS9CVC9HUFMgbXVsdGktZnVuY3Rpb24gY29uZmlndXJhdGlvbi4gMjAxMC4xMC4wNi4gKi8KLS8qICAqLwotZW51bSBSVF9NVUxUSV9GVU5DIHsKLQlSVF9NVUxUSV9GVU5DX05PTkUgPSAweDAwLAotCVJUX01VTFRJX0ZVTkNfV0lGSSA9IDB4MDEsCi0JUlRfTVVMVElfRlVOQ19CVCA9IDB4MDIsCi0JUlRfTVVMVElfRlVOQ19HUFMgPSAweDA0LAotfTsKLQotLyogICovCi0vKiAgPFJvZ2VyX05vdGVzPiBGb3IgUlRMODcyMyBXaUZpIFBEbi9HUElPIHBvbGFyaXR5IGNvbnRyb2wgY29uZmlndXJhdGlvbi4gMjAxMC4xMC4wOC4gKi8KLS8qICAqLwotZW51bSBSVF9QT0xBUklUWV9DVEwgewotCVJUX1BPTEFSSVRZX0xPV19BQ1QgPSAwLAotCVJUX1BPTEFSSVRZX0hJR0hfQUNUID0gMSwKLX07Ci0KLS8qICBGb3IgUlRMODcyMyByZWd1bGF0b3IgbW9kZS4gYnkgdHlubGkuIDIwMTEuMDEuMTQuICovCi1lbnVtIFJUX1JFR1VMQVRPUl9NT0RFIHsKLQlSVF9TV0lUQ0hJTkdfUkVHVUxBVE9SID0gMCwKLQlSVF9MRE9fUkVHVUxBVE9SID0gMSwKLX07Ci0KLS8qICBEZXNjcmlwdGlvbjogRGV0ZXJtaW5lIHRoZSB0eXBlcyBvZiBDMkggZXZlbnRzIHRoYXQgYXJlIHRoZSBzYW1lIGluIGRyaXZlciBhbmQgRncuICovCi0vKiAgRmlzcnQgY29uc3RydWN0ZWQgYnkgdHlubGkuIDIwMDkuMTAuMDkuICovCi1lbnVtIHsKLQlDMkhfREJHID0gMCwKLQlDMkhfVFNGID0gMSwKLQlDMkhfQVBfUlBUX1JTUCA9IDIsCi0JQzJIX0NDWF9UWF9SUFQgPSAzLAkvKiAgVGhlIEZXIG5vdGlmeSB0aGUgcmVwb3J0IG9mIHRoZSBzcGVjaWZpYyB0eCBwYWNrZXQuICovCi0JQzJIX0JUX1JTU0kgPSA0LAotCUMySF9CVF9PUF9NT0RFID0gNSwKLQlDMkhfRVhUX1JBX1JQVCA9IDYsCi0JQzJIX0hXX0lORk9fRVhDSCA9IDEwLAotCUMySF9DMkhfSDJDX1RFU1QgPSAxMSwKLQlDMkhfQlRfSU5GTyA9IDEyLAotCUMySF9CVF9NUF9JTkZPID0gMTUsCi0JTUFYX0MySEVWRU5UCi19OwotCi1zdHJ1Y3QgaGFsX2RhdGFfODcyM2EgewotCXN0cnVjdCBoYWxfdmVyc2lvbgkJVmVyc2lvbklEOwotCWVudW0gcnRfY3VzdG9tZXJfaWQgQ3VzdG9tZXJJRDsKLQotCXUxNglGaXJtd2FyZVZlcnNpb247Ci0JdTE2CUZpcm13YXJlVmVyc2lvblJldjsKLQl1MTYJRmlybXdhcmVTdWJWZXJzaW9uOwotCXUxNglGaXJtd2FyZVNpZ25hdHVyZTsKLQotCS8qIGN1cnJlbnQgV0lGSV9QSFkgdmFsdWVzICovCi0JdTMyCVJlY2VpdmVDb25maWc7Ci0JZW51bSBXSVJFTEVTU19NT0RFCQlDdXJyZW50V2lyZWxlc3NNb2RlOwotCWVudW0gaHRfY2hhbm5lbF93aWR0aAlDdXJyZW50Q2hhbm5lbEJXOwotCXU4CUN1cnJlbnRDaGFubmVsOwotCXU4CW5DdXI0ME1oelByaW1lU0M7LyogIENvbnRyb2wgY2hhbm5lbCBzdWItY2FycmllciAqLwotCi0JdTE2CUJhc2ljUmF0ZVNldDsKLQotCS8qIHJmX2N0cmwgKi8KLQl1OAlyZl90eXBlOwotCXU4CU51bVRvdGFsUkZQYXRoOwotCi0JdTgJQm9hcmRUeXBlOwotCXU4CUNyeXN0YWxDYXA7Ci0JLyogICovCi0JLyogIEVFUFJPTSBzZXR0aW5nLiAqLwotCS8qICAqLwotCXU4CUVFUFJPTVZlcnNpb247Ci0JdTgJRUVQUk9NQ3VzdG9tZXJJRDsKLQl1OAlFRVBST01TdWJDdXN0b21lcklEOwotCXU4CUVFUFJPTVJlZ3VsYXRvcnk7Ci0JdTgJRUVQUk9NVGhlcm1hbE1ldGVyOwotCXU4CUVFUFJPTUJsdWV0b290aENvZXhpc3Q7Ci0JdTgJRUVQUk9NQmx1ZXRvb3RoVHlwZTsKLQl1OAlFRVBST01CbHVldG9vdGhBbnROdW07Ci0JdTgJRUVQUk9NQmx1ZXRvb3RoQW50SXNvbGF0aW9uOwotCXU4CUVFUFJPTUJsdWV0b290aFJhZGlvU2hhcmVkOwotCi0JdTgJYlRYUG93ZXJEYXRhUmVhZEZyb21FRVBPUk07Ci0JdTgJYkFQS1RoZXJtYWxNZXRlcklnbm9yZTsKLQotCXU4CWJJUUtJbml0aWFsaXplZDsKLQl1OAliQW50ZW5uYURldGVjdGVkOwotCi0JdTgJVHhQd3JMZXZlbENja1tSRl9QQVRIX01BWF1bQ0hBTk5FTF9NQVhfTlVNQkVSXTsKLQl1OAlUeFB3ckxldmVsSFQ0MF8xU1tSRl9QQVRIX01BWF1bQ0hBTk5FTF9NQVhfTlVNQkVSXTsJLyogIEZvciBIVCA0ME1IWiBwd3IgKi8KLQl1OAlUeFB3ckxldmVsSFQ0MF8yU1tSRl9QQVRIX01BWF1bQ0hBTk5FTF9NQVhfTlVNQkVSXTsJLyogIEZvciBIVCA0ME1IWiBwd3IgKi8KLQl1OAlUeFB3ckh0MjBEaWZmW1JGX1BBVEhfTUFYXVtDSEFOTkVMX01BWF9OVU1CRVJdOy8qICBIVCAyMDwtPjQwIFB3ciBkaWZmICovCi0JdTgJVHhQd3JMZWdhY3lIdERpZmZbUkZfUEFUSF9NQVhdW0NIQU5ORUxfTUFYX05VTUJFUl07LyogIEZvciBIVDwtPmxlZ2FjeSBwd3IgZGlmZiAqLwotCS8qICBGb3IgcG93ZXIgZ3JvdXAgKi8KLQl1OAlQd3JHcm91cEhUMjBbUkZfUEFUSF9NQVhdW0NIQU5ORUxfTUFYX05VTUJFUl07Ci0JdTgJUHdyR3JvdXBIVDQwW1JGX1BBVEhfTUFYXVtDSEFOTkVMX01BWF9OVU1CRVJdOwotCi0JdTgJTGVnYWN5SFRUeFBvd2VyRGlmZjsvKiAgTGVnYWN5IHRvIEhUIHJhdGUgcG93ZXIgZGlmZiAqLwotCi0JLyogIFJlYWQvd3JpdGUgYXJlIGFsbG93IGZvciBmb2xsb3dpbmcgaGFyZHdhcmUgaW5mb3JtYXRpb24gdmFyaWFibGVzICovCi0JdTgJZnJhbWVzeW5jOwotCXUzMglmcmFtZXN5bmNDMzQ7Ci0JdTgJZnJhbWVzeW5jTW9uaXRvcjsKLQl1OAlwd3JHcm91cENudDsKLQl1MzIJTUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbN11bMTZdOwotCXUzMglDQ0tUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldDsKLQotCXUzMglBbnRlbm5hVHhQYXRoOwkJCQkJLyogIEFudGVubmEgcGF0aCBUeCAqLwotCXUzMglBbnRlbm5hUnhQYXRoOwkJCQkJLyogIEFudGVubmEgcGF0aCBSeCAqLwotCXU4CUV4dGVybmFsUEE7Ci0KLQl1OAliTGVkT3BlbkRyYWluOyAvKiAgU3VwcG9ydCBPcGVuLWRyYWluIGFycmFuZ2VtZW50IGZvciBjb250cm9sbGluZyB0aGUgTEVELiBBZGRlZCBieSBSb2dlciwgMjAwOS4xMC4xNi4gKi8KLQotCXU4CWIxeDFSZWN2Q29tYmluZTsJLyogIGZvciAxVDFSIHJlY2VpdmUgY29tYmluaW5nICovCi0KLQkvKiAgRm9yIEVEQ0EgVHVyYm8gbW9kZSAqLwotCi0JdTMyCUFjUGFyYW1fQkU7IC8qIE9yaWdpbmFsIHBhcmFtZXRlciBmb3IgQkUsIHVzZSBmb3IgRURDQSB0dXJiby4gKi8KLQotCS8qIHZpdmksIGZvciB0eCBwb3dlciB0cmFja2luZywgMjAwODA0MDcgKi8KLQkvKiB1MTYJVFNTSV8xM2RCbTsgKi8KLQkvKiB1MzIJUHdyX1RyYWNrOyAqLwotCS8qICBUaGUgY3VycmVudCBUeCBQb3dlciBMZXZlbCAqLwotCXU4CUN1cnJlbnRDY2tUeFB3cklkeDsKLQl1OAlDdXJyZW50T2ZkbTI0R1R4UHdySWR4OwotCi0Jc3RydWN0IGJiX3JlZ19kZWZpbmUJUEhZUmVnRGVmWzRdOwkvKiBSYWRpbyBBL0IvQy9EICovCi0KLQlib29sCQliUkZQYXRoUnhFbmFibGVbNF07CS8qICBXZSBzdXBwb3J0IDQgUkYgcGF0aCBub3cuICovCi0KLQl1MzIJUmZSZWdDaG5sVmFsWzJdOwotCi0JdTgJYkNja0hpZ2hQb3dlcjsKLQotCS8qIFJERyBlbmFibGUgKi8KLQlib29sCSBiUkRHRW5hYmxlOwotCi0JLyogZm9yIGhvc3QgbWVzc2FnZSB0byBmdyAqLwotCXU4CUxhc3RITUVCb3hOdW07Ci0KLQl1OAlSZWdUeFBhdXNlOwotCS8qICBCZWFjb24gZnVuY3Rpb24gcmVsYXRlZCBnbG9iYWwgdmFyaWFibGUuICovCi0JdTgJUmVnRndId1R4UUN0cmw7Ci0JdTgJUmVnUmVnNTQyOwotCi0Jc3RydWN0IGRtX3ByaXYJZG1wcml2OwotCXN0cnVjdCBkbV9vZG1fdAkJb2RtcHJpdjsKLQlzdHJ1Y3Qgc3Jlc2V0X3ByaXYgc3Jlc3Rwcml2OwotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9CVF9DT0VYSVNUCi0JdTgJCQkJYkJUTW9kZTsKLQkvKiAgQlQgb25seS4gKi8KLQlzdHJ1Y3QgYnRfMzBpbmZvCQlCdEluZm87Ci0JLyogIEZvciBibHVldG9vdGggY28tZXhpc3RhbmNlICovCi0Jc3RydWN0IGJ0X2NvZXhpc3Rfc3RyCWJ0X2NvZXhpc3Q7Ci0jZW5kaWYKLQotCXU4CWJEdW1wUnhQa3Q7LyogZm9yIGRlYnVnICovCi0JdTgJRndSc3ZkUGFnZVN0YXJ0T2Zmc2V0OyAvKiAyMDEwLjA2LjIzLiBBZGRlZCBieSB0eW5saS4gUmVzZXJ2ZSBwYWdlIHN0YXJ0IG9mZnNldCBleGNlcHQgYmVhY29uIGluIFR4US4gKi8KLQotCS8qICAyMDEwLzA4LzA5IE1IIEFkZCBDVSBwb3dlciBkb3duIG1vZGUuICovCi0JdTgJcHdyZG93bjsKLQotCXU4CU91dEVwUXVldWVTZWw7Ci0JdTgJT3V0RXBOdW1iZXI7Ci0KLQkvKiAgKi8KLQkvKiAgQWRkIEZvciBFRVBST00gRWZ1c2Ugc3dpdGNoIGFuZCAgRWZ1c2UgU2hhZG93IG1hcCBTZXR0aW5nICovCi0JLyogICovCi0JdTgJCQlFZXByb21PckVmdXNlOwotCXUxNgkJCUVmdXNlVXNlZEJ5dGVzOwotCXUxNgkJCUJURWZ1c2VVc2VkQnl0ZXM7Ci0KLQkvKiAgSW50ZXJydXB0IHJlbGF0ZCByZWdpc3RlciBpbmZvcm1hdGlvbi4gKi8KLQl1MzIJCQlTeXNJbnRyU3RhdHVzOwotCXUzMgkJCVN5c0ludHJNYXNrOwotCi0JLyogICovCi0JLyogIDIwMTEvMDIvMjMgTUggQWRkIGZvciA4NzIzIG15bHRpIGZ1bmN0aW9uIGRlZmluaXRpb24uIFRoZSBkZWZpbmUgc2hvdWxkIGJlIG1vdmVkIHRvIGFuICovCi0JLyogIGluZGVwZW5kZW50IGZpbGUgaW4gdGhlIGZ1dHVyZS4gKi8KLQkvKiAgKi8KLQkvKiA4NzIzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCWVudW0gUlRfTVVMVElfRlVOQwlNdWx0aUZ1bmM7IC8qICBGb3IgbXVsdGktZnVuY3Rpb24gY29uc2lkZXJhdGlvbi4gKi8KLQllbnVtIFJUX1BPTEFSSVRZX0NUTAlQb2xhcml0eUN0bDsgLyogIEZvciBXaWZpIFBEbiBQb2xhcml0eSBjb250cm9sLiAqLwotCWVudW0gUlRfUkVHVUxBVE9SX01PREUJUmVndWxhdG9yTW9kZTsgLyogIHN3aXRjaGluZyByZWd1bGF0b3Igb3IgTERPICovCi0JLyogODcyMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JICogIDIwMTEvMDIvMjMgTUggQWRkIGZvciA4NzIzIG15bHRpIGZ1bmN0aW9uIGRlZmluaXRpb24uIFRoZSBkZWZpbmUgc2hvdWxkIGJlIG1vdmVkIHRvIGFuICovCi0JLyogIGluZGVwZW5kZW50IGZpbGUgaW4gdGhlIGZ1dHVyZS4gKi8KLQotCS8qICBJbnRlcnJ1cHQgcmVsYXRlZCByZWdpc3RlciBpbmZvcm1hdGlvbi4gKi8KLQl1MzIJSW50QXJyYXlbMl07Ci0JdTMyCUludHJNYXNrWzJdOwotfTsKLQotI2RlZmluZSBHRVRfSEFMX0RBVEEoX19wQWRhcHRlcikJKChzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKikoKF9fcEFkYXB0ZXIpLT5IYWxEYXRhKSkKLSNkZWZpbmUgR0VUX1JGX1RZUEUocHJpdikJCQkoR0VUX0hBTF9EQVRBKHByaXYpLT5yZl90eXBlKQotCi0jZGVmaW5lIElOQ0xVREVfTVVMVElfRlVOQ19CVChfQWRhcHRlcikJCShHRVRfSEFMX0RBVEEoX0FkYXB0ZXIpLT5NdWx0aUZ1bmMgJiBSVF9NVUxUSV9GVU5DX0JUKQotI2RlZmluZSBJTkNMVURFX01VTFRJX0ZVTkNfR1BTKF9BZGFwdGVyKQkoR0VUX0hBTF9EQVRBKF9BZGFwdGVyKS0+TXVsdGlGdW5jICYgUlRfTVVMVElfRlVOQ19HUFMpCi0KLXN0cnVjdCByeHJlcG9ydF84NzIzYSB7Ci0JdTMyIHBrdGxlbjoxNDsKLQl1MzIgY3JjMzI6MTsKLQl1MzIgaWN2ZXJyOjE7Ci0JdTMyIGRydmluZm9zaXplOjQ7Ci0JdTMyIHNlY3VyaXR5OjM7Ci0JdTMyIHFvczoxOwotCXUzMiBzaGlmdDoyOwotCXUzMiBwaHlzdDoxOwotCXUzMiBzd2RlYzoxOwotCXUzMiBsczoxOwotCXUzMiBmczoxOwotCXUzMiBlb3I6MTsKLQl1MzIgb3duOjE7Ci0KLQl1MzIgbWFjaWQ6NTsKLQl1MzIgdGlkOjQ7Ci0JdTMyIGh3cnN2ZDo0OwotCXUzMiBhbXNkdToxOwotCXUzMiBwYWdncjoxOwotCXUzMiBmYWdncjoxOwotCXUzMiBhMWZpdDo0OwotCXUzMiBhMmZpdDo0OwotCXUzMiBwYW06MTsKLQl1MzIgcHdyOjE7Ci0JdTMyIG1kOjE7Ci0JdTMyIG1mOjE7Ci0JdTMyIHR5cGU6MjsKLQl1MzIgbWM6MTsKLQl1MzIgYmM6MTsKLQotCXUzMiBzZXE6MTI7Ci0JdTMyIGZyYWc6NDsKLQl1MzIgbmV4dHBrdGxlbjoxNDsKLQl1MzIgbmV4dGluZDoxOwotCXUzMiByc3ZkMDgzMToxOwotCi0JdTMyIHJ4bWNzOjY7Ci0JdTMyIHJ4aHQ6MTsKLQl1MzIgZ2Y6MTsKLQl1MzIgc3BsY3A6MTsKLQl1MzIgYnc6MTsKLQl1MzIgaHRjOjE7Ci0JdTMyIGVvc3A6MTsKLQl1MzIgYnNzaWRmaXQ6MjsKLQl1MzIgcnN2ZDEyMTQ6MTY7Ci0JdTMyIHVuaWNhc3R3YWtlOjE7Ci0JdTMyIG1hZ2ljd2FrZToxOwotCi0JdTMyIHBhdHRlcm4wbWF0Y2g6MTsKLQl1MzIgcGF0dGVybjFtYXRjaDoxOwotCXUzMiBwYXR0ZXJuMm1hdGNoOjE7Ci0JdTMyIHBhdHRlcm4zbWF0Y2g6MTsKLQl1MzIgcGF0dGVybjRtYXRjaDoxOwotCXUzMiBwYXR0ZXJuNW1hdGNoOjE7Ci0JdTMyIHBhdHRlcm42bWF0Y2g6MTsKLQl1MzIgcGF0dGVybjdtYXRjaDoxOwotCXUzMiBwYXR0ZXJuOG1hdGNoOjE7Ci0JdTMyIHBhdHRlcm45bWF0Y2g6MTsKLQl1MzIgcGF0dGVybmFtYXRjaDoxOwotCXUzMiBwYXR0ZXJuYm1hdGNoOjE7Ci0JdTMyIHBhdHRlcm5jbWF0Y2g6MTsKLQl1MzIgcnN2ZDE2MTM6MTk7Ci0KLQl1MzIgdHNmbDsKLQotCXUzMiBiYXNzbjoxMjsKLQl1MzIgYmF2bGQ6MTsKLQl1MzIgcnN2ZDI0MTM6MTk7Ci19OwotCi0vKiAgcnRsODcyM2FfaGFsX2luaXQuYyAqLwotczMyIHJ0bDg3MjNhX0Zpcm13YXJlRG93bmxvYWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX0Zpcm13YXJlU2VsZlJlc2V0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYV9Jbml0aWFsaXplRmlybXdhcmVWYXJzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi12b2lkIHJ0bDg3MjNhX0luaXRBbnRlbm5hX1NlbGVjdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnRsODcyM2FfRGVpbml0QW50ZW5uYV9TZWxlY3Rpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX0NoZWNrQW50ZW5uYV9TZWxlY3Rpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX2luaXRfZGVmYXVsdF92YWx1ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotczMyIEluaXRMTFRUYWJsZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgYm91bmRhcnkpOwotCi1zMzIgQ2FyZERpc2FibGVIV1NNKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHJlc2V0TUNVKTsKLXMzMiBDYXJkRGlzYWJsZVdpdGhvdXRIV1NNKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0vKiAgRUZ1c2UgKi8KLXU4IEdldEVFUFJPTVNpemU4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgSGFsX0luaXRQR0RhdGEoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKlBST01Db250ZW50KTsKLXZvaWQgSGFsX0VmdXNlUGFyc2VJRENvZGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKmh3aW5mbyk7Ci12b2lkIEhhbF9FZnVzZVBhcnNldHhwb3dlcmluZm9fODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKlBST01Db250ZW50LCBib29sIEF1dG9Mb2FkRmFpbCk7Ci12b2lkIEhhbF9FZnVzZVBhcnNlQlRDb2V4aXN0SW5mb184NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqaHdpbmZvLCBib29sIEF1dG9Mb2FkRmFpbCk7Ci12b2lkIEhhbF9FZnVzZVBhcnNlRUVQUk9NVmVyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpod2luZm8sIGJvb2wgQXV0b0xvYWRGYWlsKTsKLXZvaWQgcnRsODcyM2FfRWZ1c2VQYXJzZUNobmxQbGFuKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpod2luZm8sIGJvb2wgQXV0b0xvYWRGYWlsKTsKLXZvaWQgSGFsX0VmdXNlUGFyc2VDdXN0b21lcklEKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpod2luZm8sIGJvb2wgQXV0b0xvYWRGYWlsKTsKLXZvaWQgSGFsX0VmdXNlUGFyc2VBbnRlbm5hRGl2ZXJzaXR5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpod2luZm8sIGJvb2wgQXV0b0xvYWRGYWlsKTsKLXZvaWQgSGFsX0VmdXNlUGFyc2VSYXRlSW5kaWNhdGlvbk9wdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqaHdpbmZvLCBib29sIEF1dG9Mb2FkRmFpbCk7Ci12b2lkIEhhbF9FZnVzZVBhcnNlWHRhbF84NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1OCAqaHdpbmZvLCB1OCBBdXRvTG9hZEZhaWwpOwotdm9pZCBIYWxfRWZ1c2VQYXJzZVRoZXJtYWxNZXRlcl84NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqaHdpbmZvLCBib29sIEF1dG9Mb2FkRmFpbCk7Ci0KLS8qICByZWdpc3RlciAqLwotdm9pZCBTZXRCY25DdHJsUmVnMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IFNldEJpdHMsIHU4IENsZWFyQml0cyk7Ci12b2lkIHJ0bDg3MjNhX0luaXRCZWFjb25QYXJhbWV0ZXJzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi12b2lkIHJ0bDg3MjNhX3N0YXJ0X3RocmVhZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnRsODcyM2Ffc3RvcF90aHJlYWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLWJvb2wgYzJoX2lkX2ZpbHRlcl9jY3hfODcyM2EodTggaWQpOwotaW50IGMyaF9oYW5kbGVyXzg3MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBjMmhfZXZ0X2hkciAqYzJoX2V2dCk7Ci0KLXZvaWQgcnRsODcyM2FfcmVhZF9hZGFwdGVyX2luZm8oc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKTsKLXZvaWQgcnRsODcyM2FfcmVhZF9jaGlwX3ZlcnNpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX25vdGNoX2ZpbHRlcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIGJvb2wgZW5hYmxlKTsKLXZvaWQgcnRsODcyM2FfU2V0QmVhY29uUmVsYXRlZFJlZ2lzdGVycyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnRsODcyM2FfU2V0SGFsT0RNVmFyKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwKLQkJCSAgIGVudW0gaGFsX29kbV92YXJpYWJsZSBlVmFyaWFibGUsCi0JCQkgICB2b2lkICpwVmFsdWUxLCBib29sIGJTZXQpOwotdm9pZAotcnRsODcyM2FfcmVhZGVmdXNlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCSAgIHU4IGVmdXNlVHlwZSwgdTE2IF9vZmZzZXQsIHUxNiBfc2l6ZV9ieXRlLCB1OCAqcGJ1Zik7Ci11MTYgcnRsODcyM2FfRWZ1c2VHZXRDdXJyZW50U2l6ZV9XaUZpKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdTE2IHJ0bDg3MjNhX0VmdXNlR2V0Q3VycmVudFNpemVfQlQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX3VwZGF0ZV9yYW1hc2soc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICB1MzIgbWFjX2lkLCB1OCByc3NpX2xldmVsKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfcGcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9wZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzJlYzQ0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9wZy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fUlRMODcyM0FfUEdfSF9fCi0jZGVmaW5lIF9fUlRMODcyM0FfUEdfSF9fCi0KLS8qCQkJRUVQUk9NL0VmdXNlIFBHIE9mZnNldCBmb3IgODcyM0UvODcyM1UvODcyM1MgKi8KLSNkZWZpbmUgRUVQUk9NX0NDS19UWF9QV1JfSU5YXzg3MjNBCQkJMHgxMAotI2RlZmluZSBFRVBST01fSFQ0MF8xU19UWF9QV1JfSU5YXzg3MjNBCQkweDE2Ci0jZGVmaW5lIEVFUFJPTV9IVDIwX1RYX1BXUl9JTlhfRElGRl84NzIzQQkweDFDCi0jZGVmaW5lIEVFUFJPTV9PRkRNX1RYX1BXUl9JTlhfRElGRl84NzIzQQkweDFGCi0jZGVmaW5lIEVFUFJPTV9IVDQwX01BWF9QV1JfT0ZGU0VUXzg3MjNBCTB4MjIKLSNkZWZpbmUgRUVQUk9NX0hUMjBfTUFYX1BXUl9PRkZTRVRfODcyM0EJMHgyNQotCi0jZGVmaW5lIEVFUFJPTV9DaGFubmVsUGxhbl84NzIzQQkJCTB4MjgKLSNkZWZpbmUgRUVQUk9NX1RTU0lfQV84NzIzQQkJCQkJMHgyOQotI2RlZmluZSBFRVBST01fVEhFUk1BTF9NRVRFUl84NzIzQQkJCTB4MkEKLSNkZWZpbmUgUkZfT1BUSU9OMV84NzIzQQkJCQkJMHgyQgotI2RlZmluZSBSRl9PUFRJT04yXzg3MjNBCQkJCQkweDJDCi0jZGVmaW5lIFJGX09QVElPTjNfODcyM0EJCQkJCTB4MkQKLSNkZWZpbmUgUkZfT1BUSU9ONF84NzIzQQkJCQkJMHgyRQotI2RlZmluZSBFRVBST01fVkVSU0lPTl84NzIzQQkJCQkweDMwCi0jZGVmaW5lIEVFUFJPTV9DdXN0b21JRF84NzIzQQkJCQkweDMxCi0jZGVmaW5lIEVFUFJPTV9TdWJDdXN0b21JRF84NzIzQQkJCTB4MzIKLSNkZWZpbmUgRUVQUk9NX1hUQUxfS184NzIzQQkJCQkJMHgzMwotI2RlZmluZSBFRVBST01fQ2hpcHNldF84NzIzQQkJCQkweDM0Ci0KLS8qICBSVEw4NzIzQUUgKi8KLSNkZWZpbmUgRUVQUk9NX1ZJRF84NzIzQUUJCQkJCTB4NDkKLSNkZWZpbmUgRUVQUk9NX0RJRF84NzIzQUUJCQkJCTB4NEIKLSNkZWZpbmUgRUVQUk9NX1NWSURfODcyM0FFCQkJCQkweDRECi0jZGVmaW5lIEVFUFJPTV9TTUlEXzg3MjNBRQkJCQkJMHg0RgotI2RlZmluZSBFRVBST01fTUFDX0FERFJfODcyM0FFCQkJCTB4NjcKLQotLyogIFJUTDg3MjNBVSAqLwotI2RlZmluZSBFRVBST01fTUFDX0FERFJfODcyM0FVCQkJCTB4QzYKLSNkZWZpbmUgRUVQUk9NX1ZJRF84NzIzQVUJCQkJCTB4QjcKLSNkZWZpbmUgRUVQUk9NX1BJRF84NzIzQVUJCQkJCTB4QjkKLQotLyogIFJUTDg3MjNBUyAqLwotI2RlZmluZSBFRVBST01fTUFDX0FERFJfODcyM0FTCQkJCTB4QUEKLQotLyoJCQlFRVBST00vRWZ1c2UgVmFsdWUgVHlwZSAqLwotI2RlZmluZSBFRVRZUEVfVFhfUFdSCQkJCQkJMHgwCi0KLS8qCQkJRUVQUk9NL0VmdXNlIERlZmF1bHQgVmFsdWUgKi8KLSNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfQ3J5c3RhbENhcF84NzIzQQkJMHgyMAotCi0KLS8qICAgICAgICBFRVBST00vRUZVU0UgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4gKi8KLSNkZWZpbmUJTUFYX0NITkxfR1JPVVAJCTMrOQotCi1zdHJ1Y3QgdHhwb3dlcmluZm8gewotCXU4IENDS0luZGV4W1JGX1BBVEhfTUFYXVtNQVhfQ0hOTF9HUk9VUF07Ci0JdTggSFQ0MF8xU0luZGV4W1JGX1BBVEhfTUFYXVtNQVhfQ0hOTF9HUk9VUF07Ci0JdTggSFQ0MF8yU0luZGV4RGlmZltSRl9QQVRIX01BWF1bTUFYX0NITkxfR1JPVVBdOwotCXU4IEhUMjBJbmRleERpZmZbUkZfUEFUSF9NQVhdW01BWF9DSE5MX0dST1VQXTsKLQl1OCBPRkRNSW5kZXhEaWZmW1JGX1BBVEhfTUFYXVtNQVhfQ0hOTF9HUk9VUF07Ci0JdTggSFQ0ME1heE9mZnNldFtSRl9QQVRIX01BWF1bTUFYX0NITkxfR1JPVVBdOwotCXU4IEhUMjBNYXhPZmZzZXRbUkZfUEFUSF9NQVhdW01BWF9DSE5MX0dST1VQXTsKLQl1OCBUU1NJX0FbM107Ci0JdTggVFNTSV9CWzNdOwotCXU4IFRTU0lfQV81R1szXTsJCS8qIDVHTC81R00vNUdIICovCi0JdTggVFNTSV9CXzVHWzNdOwotfTsKLQotZW51bSBidF9hbnRfbnVtIHsKLQlBbnRfeDIJPSAwLAotCUFudF94MQk9IDEKLX07Ci0KLWVudW0gYnRfY290eXBlIHsKLQlCVF8yV2lyZQkJPSAwLAotCUJUX0lTU0NfM1dpcmUJCT0gMSwKLQlCVF9BY2NlbAkJPSAyLAotCUJUX0NTUl9CQzQJCT0gMywKLQlCVF9DU1JfQkM4CQk9IDQsCi0JQlRfUlRMODc1NgkJPSA1LAotCUJUX1JUTDg3MjNBCQk9IDYKLX07Ci0KLWVudW0gYnRfcmFkaW9zaGFyZWQgewotCUJUX1JhZGlvX1NoYXJlZAkJPSAwLAotCUJUX1JhZGlvX0luZGl2aWR1YWwJPSAxLAotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfcmVjdi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX3JlY3YuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc1ZDM3Yi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfcmVjdi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fUlRMODcyM0FfUkVDVl9IX18KLSNkZWZpbmUgX19SVEw4NzIzQV9SRUNWX0hfXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotCi0jZGVmaW5lIE5SX1JFQ1ZCVUZGCQkJNAotCi0jZGVmaW5lIE5SX1BSRUFMTE9DX1JFQ1ZfU0tCCQk4Ci0KLSNkZWZpbmUgUkVDVl9CTEtfU1oJCQk1MTIKLSNkZWZpbmUgUkVDVl9CTEtfQ05UCQkJMTYKLSNkZWZpbmUgUkVDVl9CTEtfVEgJCQlSRUNWX0JMS19DTlQKLQotI2RlZmluZSBNQVhfUkVDVkJVRl9TWgkJCTE1MzYwIC8qICAxNWsgPCAxNmsgKi8KLQotI2RlZmluZSBQSFlfUlNTSV9TTElEX1dJTl9NQVgJCTEwMAotI2RlZmluZSBQSFlfTElOS1FVQUxJVFlfU0xJRF9XSU5fTUFYCTIwCi0KLQotc3RydWN0IHBoeV9zdGF0IHsKLQl1bnNpZ25lZCBpbnQgcGh5ZHcwOwotCXVuc2lnbmVkIGludCBwaHlkdzE7Ci0JdW5zaWduZWQgaW50IHBoeWR3MjsKLQl1bnNpZ25lZCBpbnQgcGh5ZHczOwotCXVuc2lnbmVkIGludCBwaHlkdzQ7Ci0JdW5zaWduZWQgaW50IHBoeWR3NTsKLQl1bnNpZ25lZCBpbnQgcGh5ZHc2OwotCXVuc2lnbmVkIGludCBwaHlkdzc7Ci19OwotCi0vKiAgUnggc21vb3RoIGZhY3RvciAqLwotI2RlZmluZQlSeF9TbW9vdGhfRmFjdG9yCQkyMAotCi1zdHJ1Y3QgaW50ZXJydXB0X21zZ19mb3JtYXQgewotCXVuc2lnbmVkIGludCBDMkhfTVNHMDsKLQl1bnNpZ25lZCBpbnQgQzJIX01TRzE7Ci0JdW5zaWduZWQgaW50IEMySF9NU0cyOwotCXVuc2lnbmVkIGludCBDMkhfTVNHMzsKLQl1bnNpZ25lZCBpbnQgSElTUjsgLyogIGZyb20gSElTUiBSZWcweDEyNCwgcmVhZCB0byBjbGVhciAqLwotCXVuc2lnbmVkIGludCBISVNSRTsvKiAgZnJvbSBISVNSRSBSZWcweDEyYywgcmVhZCB0byBjbGVhciAqLwotCXVuc2lnbmVkIGludCAgTVNHX0VYOwotfTsKLQotaW50IHJ0bDg3MjNhdV9pbml0X3JlY3ZfcHJpdihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnRsODcyM2F1X2ZyZWVfcmVjdl9wcml2KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYV9wcm9jZXNzX3BoeV9pbmZvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHZvaWQgKnByZnJhbWUpOwotdm9pZCB1cGRhdGVfcmVjdmZyYW1lX2F0dHJpYihzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwgc3RydWN0IHJlY3Zfc3RhdCAqcHJ4c3RhdCk7Ci12b2lkIHVwZGF0ZV9yZWN2ZnJhbWVfcGh5aW5mbyhzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwgc3RydWN0IHBoeV9zdGF0ICpwcGh5X2luZm8pOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9yZi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX3JmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MzI3OTkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX3JmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19SVEw4NzIzQV9SRl9IX18KLSNkZWZpbmUgX19SVEw4NzIzQV9SRl9IX18KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBQYXJhbWV0ZXJzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qICAqLwotLyogIEZvciBSRiA2MDUyIFNlcmllcyAqLwotLyogICovCi0jZGVmaW5lCQlSRjYwNTJfTUFYX1RYX1BXUgkJCTB4M0YKLSNkZWZpbmUJCVJGNjA1Ml9NQVhfUkVHCQkJCTB4M0YKLSNkZWZpbmUJCVJGNjA1Ml9NQVhfUEFUSAkJCQkyCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIFBhcmFtZXRlcnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBzdHJ1Y3R1cmUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgc3RydWN0dXJlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnQgZ2xvYmFsIHZhcmlhYmxlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydCBnbG9iYWwgdmFyaWFibGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnQgTWFyY28gRGVmaW5pdGlvbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0IE1hcmNvIERlZmluaXRpb24tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnRlZCBGdW5jdGlvbiBwcm90b3R5cGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiAgKi8KLS8qICBSRiBSTDYwNTIgU2VyaWVzIEFQSSAqLwotLyogICovCi12b2lkIHJ0bDg3MjNhX3BoeV9yZjYwNTJzZXRfYncoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLAotCQkJICAgICAgIGVudW0gaHRfY2hhbm5lbF93aWR0aCBCYW5kd2lkdGgpOwotdm9pZCBydGw4MjNhX3BoeV9yZjYwNTJzZXRjY2t0eHBvd2VyKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwKLQkJCQkgICAgICB1OCAqcFBvd2VybGV2ZWwpOwotdm9pZCBydGw4NzIzYV9QSFlfUkY2MDUyU2V0T0ZETVR4UG93ZXIoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLAotCQkJCSAgICAgICB1OCAqcFBvd2VyTGV2ZWwsIHU4IENoYW5uZWwpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0ZWQgRnVuY3Rpb24gcHJvdG90eXBlLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotaW50CVBIWV9SRjYwNTJfQ29uZmlnODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2Ffc3BlYy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX3NwZWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYxODY4OS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2Ffc3BlYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fUlRMODcyM0FfU1BFQ19IX18KLSNkZWZpbmUgX19SVEw4NzIzQV9TUEVDX0hfXwotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwMDAwaCB+IDB4MDBGRmgJU3lzdGVtIENvbmZpZ3VyYXRpb24gKi8KLS8qICAqLwotLyogICovCi0jZGVmaW5lIFJFR19TWVNfSVNPX0NUUkwJCTB4MDAwMAotI2RlZmluZSBSRUdfU1lTX0ZVTkNfRU4JCQkweDAwMDIKLSNkZWZpbmUgUkVHX0FQU19GU01DTwkJCTB4MDAwNAotI2RlZmluZSBSRUdfU1lTX0NMS1IJCQkweDAwMDgKLSNkZWZpbmUgUkVHXzkzNDZDUgkJCTB4MDAwQQotI2RlZmluZSBSRUdfRUVfVlBECQkJMHgwMDBDCi0jZGVmaW5lIFJFR19BRkVfTUlTQwkJCTB4MDAxMAotI2RlZmluZSBSRUdfU1BTMF9DVFJMCQkJMHgwMDExCi0jZGVmaW5lIFJFR19TUFNfT0NQX0NGRwkJCTB4MDAxOAotI2RlZmluZSBSRUdfUlNWX0NUUkwJCQkweDAwMUMKLSNkZWZpbmUgUkVHX1JGX0NUUkwJCQkweDAwMUYKLSNkZWZpbmUgUkVHX0xET0ExNV9DVFJMCQkJMHgwMDIwCi0jZGVmaW5lIFJFR19MRE9WMTJEX0NUUkwJCTB4MDAyMQotI2RlZmluZSBSRUdfTERPSENJMTJfQ1RSTAkJMHgwMDIyCi0jZGVmaW5lIFJFR19MUExET19DVFJMCQkJMHgwMDIzCi0jZGVmaW5lIFJFR19BRkVfWFRBTF9DVFJMCQkweDAwMjQKLSNkZWZpbmUgUkVHX0FGRV9QTExfQ1RSTAkJMHgwMDI4Ci0jZGVmaW5lIFJFR19NQUNfUEhZX0NUUkwJCTB4MDAyYwotI2RlZmluZSBSRUdfRUZVU0VfQ1RSTAkJCTB4MDAzMAotI2RlZmluZSBSRUdfRUZVU0VfVEVTVAkJCTB4MDAzNAotI2RlZmluZSBSRUdfUFdSX0RBVEEJCQkweDAwMzgKLSNkZWZpbmUgUkVHX0NBTF9USU1FUgkJCTB4MDAzQwotI2RlZmluZSBSRUdfQUNMS19NT04JCQkweDAwM0UKLSNkZWZpbmUgUkVHX0dQSU9fTVVYQ0ZHCQkJMHgwMDQwCi0jZGVmaW5lIFJFR19HUElPX0lPX1NFTAkJCTB4MDA0MgotI2RlZmluZSBSRUdfTUFDX1BJTk1VWF9DRkcJCTB4MDA0MwotI2RlZmluZSBSRUdfR1BJT19QSU5fQ1RSTAkJMHgwMDQ0Ci0jZGVmaW5lIFJFR19HUElPX0lOVE0JCQkweDAwNDgKLSNkZWZpbmUgUkVHX0xFRENGRzAJCQkweDAwNEMKLSNkZWZpbmUgUkVHX0xFRENGRzEJCQkweDAwNEQKLSNkZWZpbmUgUkVHX0xFRENGRzIJCQkweDAwNEUKLSNkZWZpbmUgUkVHX0xFRENGRzMJCQkweDAwNEYKLSNkZWZpbmUgUkVHX0xFRENGRwkJCVJFR19MRURDRkcyCi0jZGVmaW5lIFJFR19GU0lNUgkJCTB4MDA1MAotI2RlZmluZSBSRUdfRlNJU1IJCQkweDAwNTQKLSNkZWZpbmUgUkVHX0hTSU1SCQkJMHgwMDU4Ci0jZGVmaW5lIFJFR19IU0lTUgkJCTB4MDA1YwotIC8qICBSVEw4NzIzIFdJRkkvQlQvR1BTIE11bHRpLUZ1bmN0aW9uIEdQSU8gUGluIENvbnRyb2wuICovCi0jZGVmaW5lIFJFR19HUElPX1BJTl9DVFJMXzIJCTB4MDA2MAotIC8qICBSVEw4NzIzIFdJRkkvQlQvR1BTIE11bHRpLUZ1bmN0aW9uIEdQSU8gU2VsZWN0LiAqLwotI2RlZmluZSBSRUdfR1BJT19JT19TRUxfMgkJMHgwMDYyCi0gLyogIFJUTDg3MjMgV0lGSS9CVC9HUFMgTXVsdGktRnVuY3Rpb24gY29udHJvbCBzb3VyY2UuICovCi0jZGVmaW5lIFJFR19NVUxUSV9GVU5DX0NUUkwJCTB4MDA2OAotI2RlZmluZSBSRUdfTUNVRldETAkJCTB4MDA4MAotI2RlZmluZSBSRUdfSE1FQk9YX0VYVF8wCQkweDAwODgKLSNkZWZpbmUgUkVHX0hNRUJPWF9FWFRfMQkJMHgwMDhBCi0jZGVmaW5lIFJFR19ITUVCT1hfRVhUXzIJCTB4MDA4QwotI2RlZmluZSBSRUdfSE1FQk9YX0VYVF8zCQkweDAwOEUKLQkvKiAgSG9zdCBzdXNwZW5kIGNvdW50ZXIgb24gRlBHQSBwbGF0Zm9ybSAqLwotI2RlZmluZSBSRUdfSE9TVF9TVVNQX0NOVAkJMHgwMEJDCi0JLyogIEVmdXNlIGFjY2VzcyBwcm90ZWN0aW9uIGZvciBSVEw4NzIzICovCi0jZGVmaW5lIFJFR19FRlVTRV9BQ0NFU1MJCTB4MDBDRgotI2RlZmluZSBSRUdfQklTVF9TQ0FOCQkJMHgwMEQwCi0jZGVmaW5lIFJFR19CSVNUX1JQVAkJCTB4MDBENAotI2RlZmluZSBSRUdfQklTVF9ST01fUlBUCQkweDAwRDgKLSNkZWZpbmUgUkVHX1VTQl9TSUVfSU5URgkJMHgwMEUwCi0jZGVmaW5lIFJFR19QQ0lFX01JT19JTlRGCQkweDAwRTQKLSNkZWZpbmUgUkVHX1BDSUVfTUlPX0lOVEQJCTB4MDBFOAotI2RlZmluZSBSRUdfSFBPTl9GU00JCQkweDAwRUMKLSNkZWZpbmUgUkVHX1NZU19DRkcJCQkweDAwRjAKLSNkZWZpbmUgUkVHX0dQSU9fT1VUU1RTCQkJMHgwMEY0CS8qICBGb3IgUlRMODcyMyBvbmx5LiAqLwotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwMTAwaCB+IDB4MDFGRmgJTUFDVE9QIEdlbmVyYWwgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLSNkZWZpbmUgUkVHX0NSCQkJCTB4MDEwMAotI2RlZmluZSBSRUdfUEJQCQkJCTB4MDEwNAotI2RlZmluZSBSRUdfVFJYRE1BX0NUUkwJCQkweDAxMEMKLSNkZWZpbmUgUkVHX1RSWEZGX0JORFkJCQkweDAxMTQKLSNkZWZpbmUgUkVHX1RSWEZGX1NUQVRVUwkJMHgwMTE4Ci0jZGVmaW5lIFJFR19SWEZGX1BUUgkJCTB4MDExQwotI2RlZmluZSBSRUdfSElNUgkJCTB4MDEyMAotI2RlZmluZSBSRUdfSElTUgkJCTB4MDEyNAotI2RlZmluZSBSRUdfSElNUkUJCQkweDAxMjgKLSNkZWZpbmUgUkVHX0hJU1JFCQkJMHgwMTJDCi0jZGVmaW5lIFJFR19DUFdNCQkJMHgwMTJGCi0jZGVmaW5lIFJFR19GV0lNUgkJCTB4MDEzMAotI2RlZmluZSBSRUdfRldJU1IJCQkweDAxMzQKLSNkZWZpbmUgUkVHX1BLVEJVRl9EQkdfQ1RSTAkJMHgwMTQwCi0jZGVmaW5lIFJFR19QS1RCVUZfREJHX0RBVEFfTAkJMHgwMTQ0Ci0jZGVmaW5lIFJFR19QS1RCVUZfREJHX0RBVEFfSAkJMHgwMTQ4Ci0KLSNkZWZpbmUgUkVHX1RDMF9DVFJMCQkJMHgwMTUwCi0jZGVmaW5lIFJFR19UQzFfQ1RSTAkJCTB4MDE1NAotI2RlZmluZSBSRUdfVEMyX0NUUkwJCQkweDAxNTgKLSNkZWZpbmUgUkVHX1RDM19DVFJMCQkJMHgwMTVDCi0jZGVmaW5lIFJFR19UQzRfQ1RSTAkJCTB4MDE2MAotI2RlZmluZSBSRUdfVENVTklUX0JBU0UJCQkweDAxNjQKLSNkZWZpbmUgUkVHX01CSVNUX1NUQVJUCQkJMHgwMTc0Ci0jZGVmaW5lIFJFR19NQklTVF9ET05FCQkJMHgwMTc4Ci0jZGVmaW5lIFJFR19NQklTVF9GQUlMCQkJMHgwMTdDCi0jZGVmaW5lIFJFR19DMkhFVlRfTVNHX05PUk1BTAkJMHgwMUEwCi0jZGVmaW5lIFJFR19DMkhFVlRfQ0xFQVIJCTB4MDFBRgotI2RlZmluZSBSRUdfQzJIRVZUX01TR19URVNUCQkweDAxQjgKLSNkZWZpbmUgUkVHX01DVVRTVF8xCQkJMHgwMWMwCi0jZGVmaW5lIFJFR19GTUVUSFIJCQkweDAxQzgKLSNkZWZpbmUgUkVHX0hNRVRGUgkJCTB4MDFDQwotI2RlZmluZSBSRUdfSE1FQk9YXzAJCQkweDAxRDAKLSNkZWZpbmUgUkVHX0hNRUJPWF8xCQkJMHgwMUQ0Ci0jZGVmaW5lIFJFR19ITUVCT1hfMgkJCTB4MDFEOAotI2RlZmluZSBSRUdfSE1FQk9YXzMJCQkweDAxREMKLQotI2RlZmluZSBSRUdfTExUX0lOSVQJCQkweDAxRTAKLSNkZWZpbmUgUkVHX0JCX0FDQ0VFU1NfQ1RSTAkJMHgwMUU4Ci0jZGVmaW5lIFJFR19CQl9BQ0NFU1NfREFUQQkJMHgwMUVDCi0KLQotLyogICovCi0vKiAgKi8KLS8qCTB4MDIwMGggfiAweDAyN0ZoCVRYRE1BIENvbmZpZ3VyYXRpb24gKi8KLS8qICAqLwotLyogICovCi0jZGVmaW5lIFJFR19SUVBOCQkJMHgwMjAwCi0jZGVmaW5lIFJFR19GSUZPUEFHRQkJCTB4MDIwNAotI2RlZmluZSBSRUdfVERFQ1RSTAkJCTB4MDIwOAotI2RlZmluZSBSRUdfVFhETUFfT0ZGU0VUX0NISwkJMHgwMjBDCi0jZGVmaW5lIFJFR19UWERNQV9TVEFUVVMJCTB4MDIxMAotI2RlZmluZSBSRUdfUlFQTl9OUFEJCQkweDAyMTQKLQotLyogICovCi0vKiAgKi8KLS8qCTB4MDI4MGggfiAweDAyRkZoCVJYRE1BIENvbmZpZ3VyYXRpb24gKi8KLS8qICAqLwotLyogICovCi0jZGVmaW5lIFJFR19SWERNQV9BR0dfUEdfVEgJCTB4MDI4MAotI2RlZmluZSBSRUdfUlhQS1RfTlVNCQkJMHgwMjg0Ci0jZGVmaW5lIFJFR19SWERNQV9TVEFUVVMJCTB4MDI4OAotCi0KLS8qICAqLwotLyogICovCi0vKgkweDAzMDBoIH4gMHgwM0ZGaAlQQ0llICovCi0vKiAgKi8KLS8qICAqLwotI2RlZmluZQlSRUdfUENJRV9DVFJMX1JFRwkJMHgwMzAwCi0jZGVmaW5lCVJFR19JTlRfTUlHCQkJMHgwMzA0CS8qICBJbnRlcnJ1cHQgTWlncmF0aW9uICovCi0JLyogIFRYIEJlYWNvbiBEZXNjcmlwdG9yIEFkZHJlc3MgKi8KLSNkZWZpbmUJUkVHX0JDTlFfREVTQQkJCTB4MDMwOAotCS8qICBUWCBIaWdoIFF1ZXVlIERlc2NyaXB0b3IgQWRkcmVzcyAqLwotI2RlZmluZQlSRUdfSFFfREVTQQkJCTB4MDMxMAotCS8qICBUWCBNYW5hZ2UgUXVldWUgRGVzY3JpcHRvciBBZGRyZXNzICovCi0jZGVmaW5lCVJFR19NR1FfREVTQQkJCTB4MDMxOAotCS8qICBUWCBWTyBRdWV1ZSBEZXNjcmlwdG9yIEFkZHJlc3MgKi8KLSNkZWZpbmUJUkVHX1ZPUV9ERVNBCQkJMHgwMzIwCi0JLyogIFRYIFZJIFF1ZXVlIERlc2NyaXB0b3IgQWRkcmVzcyAqLwotI2RlZmluZQlSRUdfVklRX0RFU0EJCQkweDAzMjgKLQkvKiAgVFggQkUgUXVldWUgRGVzY3JpcHRvciBBZGRyZXNzICovCi0jZGVmaW5lCVJFR19CRVFfREVTQQkJCTB4MDMzMAotCS8qICBUWCBCSyBRdWV1ZSBEZXNjcmlwdG9yIEFkZHJlc3MgKi8KLSNkZWZpbmUJUkVHX0JLUV9ERVNBCQkJMHgwMzM4Ci0JLyogIFJYIFF1ZXVlCURlc2NyaXB0b3IgQWRkcmVzcyAqLwotI2RlZmluZQlSRUdfUlhfREVTQQkJCTB4MDM0MAotCS8qICBCYWNrZG9vciBSRUcgZm9yIEFjY2VzcyBDb25maWd1cmF0aW9uICovCi0jZGVmaW5lCVJFR19EQkkJCQkJMHgwMzQ4Ci0JLyogIE1ESU8gZm9yIEFjY2VzcyBQQ0lFIFBIWSAqLwotI2RlZmluZQlSRUdfTURJTwkJCTB4MDM1NAotCS8qICBEZWJ1ZyBTZWxlY3Rpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUJUkVHX0RCR19TRUwJCQkweDAzNjAKLQkvKiBQQ0llIFJQV00gKi8KLSNkZWZpbmUJUkVHX1BDSUVfSFJQV00JCQkweDAzNjEKLQkvKiBQQ0llIENQV00gKi8KLSNkZWZpbmUJUkVHX1BDSUVfSENQV00JCQkweDAzNjMKLQkvKiAgVUFSVAlDb250cm9sICovCi0jZGVmaW5lCVJFR19VQVJUX0NUUkwJCQkweDAzNjQKLQkvKiAgVUFSVCBUWCBEZXNjcmlwdG9yIEFkZHJlc3MgKi8KLSNkZWZpbmUJUkVHX1VBUlRfVFhfREVTQQkJMHgwMzcwCi0JLyogIFVBUlQgUnggRGVzY3JpcHRvciBBZGRyZXNzICovCi0jZGVmaW5lCVJFR19VQVJUX1JYX0RFU0EJCTB4MDM3OAotCi0KLS8qICBzcGVjIHZlcnNpb24gMTEgKi8KLS8qICAqLwotLyogICovCi0vKgkweDA0MDBoIH4gMHgwNDdGaAlQcm90b2NvbCBDb25maWd1cmF0aW9uICovCi0vKiAgKi8KLS8qICAqLwotI2RlZmluZSBSRUdfVk9RX0lORk9STUFUSU9OCQkweDA0MDAKLSNkZWZpbmUgUkVHX1ZJUV9JTkZPUk1BVElPTgkJMHgwNDA0Ci0jZGVmaW5lIFJFR19CRVFfSU5GT1JNQVRJT04JCTB4MDQwOAotI2RlZmluZSBSRUdfQktRX0lORk9STUFUSU9OCQkweDA0MEMKLSNkZWZpbmUgUkVHX01HUV9JTkZPUk1BVElPTgkJMHgwNDEwCi0jZGVmaW5lIFJFR19IR1FfSU5GT1JNQVRJT04JCTB4MDQxNAotI2RlZmluZSBSRUdfQkNOUV9JTkZPUk1BVElPTgkJMHgwNDE4Ci0KLQotI2RlZmluZSBSRUdfQ1BVX01HUV9JTkZPUk1BVElPTgkJMHgwNDFDCi0jZGVmaW5lIFJFR19GV0hXX1RYUV9DVFJMCQkweDA0MjAKLSNkZWZpbmUgUkVHX0hXU0VRX0NUUkwJCQkweDA0MjMKLSNkZWZpbmUgUkVHX1RYUEtUQlVGX0JDTlFfQkROWQkJMHgwNDI0Ci0jZGVmaW5lIFJFR19UWFBLVEJVRl9NR1FfQkROWQkJMHgwNDI1Ci0jZGVmaW5lIFJFR19MSUZFVElNRV9FTgkJCTB4MDQyNgotI2RlZmluZSBSRUdfTVVMVElfQkNOUV9PRkZTRVQJCTB4MDQyNwotI2RlZmluZSBSRUdfU1BFQ19TSUZTCQkJMHgwNDI4Ci0jZGVmaW5lIFJFR19STAkJCQkweDA0MkEKLSNkZWZpbmUgUkVHX0RBUkZSQwkJCTB4MDQzMAotI2RlZmluZSBSRUdfUkFSRlJDCQkJMHgwNDM4Ci0jZGVmaW5lIFJFR19SUlNSCQkJMHgwNDQwCi0jZGVmaW5lIFJFR19BUkZSMAkJCTB4MDQ0NAotI2RlZmluZSBSRUdfQVJGUjEJCQkweDA0NDgKLSNkZWZpbmUgUkVHX0FSRlIyCQkJMHgwNDRDCi0jZGVmaW5lIFJFR19BUkZSMwkJCTB4MDQ1MAotI2RlZmluZSBSRUdfQUdHTEVOX0xNVAkJCTB4MDQ1OAotI2RlZmluZSBSRUdfQU1QRFVfTUlOX1NQQUNFCQkweDA0NUMKLSNkZWZpbmUgUkVHX1RYUEtUQlVGX1dNQUNfTEJLX0JGX0hECTB4MDQ1RAotI2RlZmluZSBSRUdfRkFTVF9FRENBX0NUUkwJCTB4MDQ2MAotI2RlZmluZSBSRUdfUkRfUkVTUF9QS1RfVEgJCTB4MDQ2MwotI2RlZmluZSBSRUdfSU5JUlRTX1JBVEVfU0VMCQkweDA0ODAKLSNkZWZpbmUgUkVHX0lOSURBVEFfUkFURV9TRUwJCTB4MDQ4NAotCi0KLSNkZWZpbmUgUkVHX1BPV0VSX1NUQVRVUwkJMHgwNEE0Ci0jZGVmaW5lIFJFR19QT1dFUl9TVEFHRTEJCTB4MDRCNAotI2RlZmluZSBSRUdfUE9XRVJfU1RBR0UyCQkweDA0QjgKLSNkZWZpbmUgUkVHX1BLVF9WT19WSV9MSUZFX1RJTUUJCTB4MDRDMAotI2RlZmluZSBSRUdfUEtUX0JFX0JLX0xJRkVfVElNRQkJMHgwNEMyCi0jZGVmaW5lIFJFR19TVEJDX1NFVFRJTkcJCTB4MDRDNAotI2RlZmluZSBSRUdfUFJPVF9NT0RFX0NUUkwJCTB4MDRDOAotI2RlZmluZSBSRUdfTUFYX0FHR1JfTlVNCQkweDA0Q0EKLSNkZWZpbmUgUkVHX1JUU19NQVhfQUdHUl9OVU0JCTB4MDRDQgotI2RlZmluZSBSRUdfQkFSX01PREVfQ1RSTAkJMHgwNENDCi0jZGVmaW5lIFJFR19SQV9UUllfUkFURV9BR0dfTE1UCQkweDA0Q0YKLSNkZWZpbmUgUkVHX05RT1NfU0VRCQkJMHgwNERDCi0jZGVmaW5lIFJFR19RT1NfU0VRCQkJMHgwNERFCi0jZGVmaW5lIFJFR19ORUVEX0NQVV9IQU5ETEUJCTB4MDRFMAotI2RlZmluZSBSRUdfUEtUX0xPU0VfUlBUCQkweDA0RTEKLSNkZWZpbmUgUkVHX1BUQ0xfRVJSX1NUQVRVUwkJMHgwNEUyCi0jZGVmaW5lIFJFR19EVU1NWQkJCTB4MDRGQwotCi0KLQotLyogICovCi0vKiAgKi8KLS8qCTB4MDUwMGggfiAweDA1RkZoCUVEQ0EgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLSNkZWZpbmUgUkVHX0VEQ0FfVk9fUEFSQU0JCTB4MDUwMAotI2RlZmluZSBSRUdfRURDQV9WSV9QQVJBTQkJMHgwNTA0Ci0jZGVmaW5lIFJFR19FRENBX0JFX1BBUkFNCQkweDA1MDgKLSNkZWZpbmUgUkVHX0VEQ0FfQktfUEFSQU0JCTB4MDUwQwotI2RlZmluZSBSRUdfQkNOVENGRwkJCTB4MDUxMAotI2RlZmluZSBSRUdfUElGUwkJCTB4MDUxMgotI2RlZmluZSBSRUdfUkRHX1BJRlMJCQkweDA1MTMKLSNkZWZpbmUgUkVHX1NJRlNfQ0NLCQkJMHgwNTE0Ci0jZGVmaW5lIFJFR19TSUZTX09GRE0JCQkweDA1MTYKLSNkZWZpbmUgUkVHX1NJRlNfQ1RYCQkJMHgwNTE0Ci0jZGVmaW5lIFJFR19TSUZTX1RSWAkJCTB4MDUxNgotI2RlZmluZSBSRUdfVFNGVFJfU1lOX09GRlNFVAkJMHgwNTE4Ci0jZGVmaW5lIFJFR19BR0dSX0JSRUFLX1RJTUUJCTB4MDUxQQotI2RlZmluZSBSRUdfU0xPVAkJCTB4MDUxQgotI2RlZmluZSBSRUdfVFhfUFRDTF9DVFJMCQkweDA1MjAKLSNkZWZpbmUgUkVHX1RYUEFVU0UJCQkweDA1MjIKLSNkZWZpbmUgUkVHX0RJU19UWFJFUV9DTFIJCTB4MDUyMwotI2RlZmluZSBSRUdfUkRfQ1RSTAkJCTB4MDUyNAotI2RlZmluZSBSRUdfVEJUVF9QUk9ISUJJVAkJMHgwNTQwCi0jZGVmaW5lIFJFR19SRF9OQVZfTlhUCQkJMHgwNTQ0Ci0jZGVmaW5lIFJFR19OQVZfUFJPVF9MRU4JCTB4MDU0NgotI2RlZmluZSBSRUdfQkNOX0NUUkwJCQkweDA1NTAKLSNkZWZpbmUgUkVHX0JDTl9DVFJMXzEJCQkweDA1NTEKLSNkZWZpbmUgUkVHX01CSURfTlVNCQkJMHgwNTUyCi0jZGVmaW5lIFJFR19EVUFMX1RTRl9SU1QJCTB4MDU1MwotCS8qICBUaGUgc2FtZSBhcyBSRUdfTUJTU0lEX0JDTl9TUEFDRSAqLwotI2RlZmluZSBSRUdfQkNOX0lOVEVSVkFMCQkweDA1NTQKLSNkZWZpbmUgUkVHX01CU1NJRF9CQ05fU1BBQ0UJCTB4MDU1NAotI2RlZmluZSBSRUdfRFJWRVJMWUlOVAkJCTB4MDU1OAotI2RlZmluZSBSRUdfQkNORE1BVElNCQkJMHgwNTU5Ci0jZGVmaW5lIFJFR19BVElNV05ECQkJMHgwNTVBCi0jZGVmaW5lIFJFR19CQ05fTUFYX0VSUgkJCTB4MDU1RAotI2RlZmluZSBSRUdfUlhUU0ZfT0ZGU0VUX0NDSwkJMHgwNTVFCi0jZGVmaW5lIFJFR19SWFRTRl9PRkZTRVRfT0ZETQkJMHgwNTVGCi0jZGVmaW5lIFJFR19UU0ZUUgkJCTB4MDU2MAotI2RlZmluZSBSRUdfVFNGVFIxCQkJMHgwNTY4Ci0jZGVmaW5lIFJFR19JTklUX1RTRlRSCQkJMHgwNTY0Ci0jZGVmaW5lIFJFR19BVElNV05EXzEJCQkweDA1NzAKLSNkZWZpbmUgUkVHX1BTVElNRVIJCQkweDA1ODAKLSNkZWZpbmUgUkVHX1RJTUVSMAkJCTB4MDU4NAotI2RlZmluZSBSRUdfVElNRVIxCQkJMHgwNTg4Ci0jZGVmaW5lIFJFR19BQ01IV0NUUkwJCQkweDA1QzAKLSNkZWZpbmUgUkVHX0FDTVJTVENUUkwJCQkweDA1QzEKLSNkZWZpbmUgUkVHX0FDTUFWRwkJCTB4MDVDMgotI2RlZmluZSBSRUdfVk9fQURNVElNRQkJCTB4MDVDNAotI2RlZmluZSBSRUdfVklfQURNVElNRQkJCTB4MDVDNgotI2RlZmluZSBSRUdfQkVfQURNVElNRQkJCTB4MDVDOAotI2RlZmluZSBSRUdfRURDQV9SQU5ET01fR0VOCQkweDA1Q0MKLSNkZWZpbmUgUkVHX1NDSF9UWENNRAkJCTB4MDVEMAotCi0vKiBkZWZpbmUgUkVHX0ZXX1RTRl9TWU5DX0NOVAkJMHgwNEEwICovCi0jZGVmaW5lIFJFR19GV19SRVNFVF9UU0ZfQ05UXzEJCTB4MDVGQwotI2RlZmluZSBSRUdfRldfUkVTRVRfVFNGX0NOVF8wCQkweDA1RkQKLSNkZWZpbmUgUkVHX0ZXX0JDTl9ESVNfQ05UCQkweDA1RkUKLQotLyogICovCi0vKiAgKi8KLS8qCTB4MDYwMGggfiAweDA3RkZoCVdNQUMgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLSNkZWZpbmUgUkVHX0FQU0RfQ1RSTAkJCTB4MDYwMAotI2RlZmluZSBSRUdfQldPUE1PREUJCQkweDA2MDMKLSNkZWZpbmUgUkVHX1RDUgkJCQkweDA2MDQKLSNkZWZpbmUgUkVHX1JDUgkJCQkweDA2MDgKLSNkZWZpbmUgUkVHX1JYX1BLVF9MSU1JVAkJMHgwNjBDCi0jZGVmaW5lIFJFR19SWF9ETEtfVElNRQkJCTB4MDYwRAotI2RlZmluZSBSRUdfUlhfRFJWSU5GT19TWgkJMHgwNjBGCi0KLSNkZWZpbmUgUkVHX01BQ0lECQkJMHgwNjEwCi0jZGVmaW5lIFJFR19CU1NJRAkJCTB4MDYxOAotI2RlZmluZSBSRUdfTUFSCQkJCTB4MDYyMAotI2RlZmluZSBSRUdfTUJJRENBTUNGRwkJCTB4MDYyOAotCi0jZGVmaW5lIFJFR19VU1RJTUVfRURDQQkJCTB4MDYzOAotI2RlZmluZSBSRUdfTUFDX1NQRUNfU0lGUwkJMHgwNjNBCi0KLS8qICAyMDEwMDcxOSBKb3NlcGg6IEhhcmR3YXJlIHJlZ2lzdGVyIGRlZmluaXRpb24gY2hhbmdlLiAoSFcgZGF0YXNoZWV0IHY1NCkgKi8KLQkvKiAgWzE1OjhdU0lGU19SMlRfT0ZETSwgWzc6MF1TSUZTX1IyVF9DQ0sgKi8KLSNkZWZpbmUgUkVHX1IyVF9TSUZTCQkJMHgwNjNDCi0JLyogIFsxNTo4XVNJRlNfVDJUX09GRE0sIFs3OjBdU0lGU19UMlRfQ0NLICovCi0jZGVmaW5lIFJFR19UMlRfU0lGUwkJCTB4MDYzRQotI2RlZmluZSBSRUdfQUNLVE8JCQkweDA2NDAKLSNkZWZpbmUgUkVHX0NUUzJUTwkJCTB4MDY0MQotI2RlZmluZSBSRUdfRUlGUwkJCTB4MDY0MgotCi0vKiBXTUEsIEJBLCBDQ1ggKi8KLSNkZWZpbmUgUkVHX05BVl9DVFJMCQkJMHgwNjUwCi0jZGVmaW5lIFJFR19CQUNBTUNNRAkJCTB4MDY1NAotI2RlZmluZSBSRUdfQkFDQU1DT05URU5UCQkweDA2NTgKLSNkZWZpbmUgUkVHX0xCRExZCQkJMHgwNjYwCi0jZGVmaW5lIFJFR19GV0RMWQkJCTB4MDY2MQotI2RlZmluZSBSRUdfUlhFUlJfUlBUCQkJMHgwNjY0Ci0jZGVmaW5lIFJFR19XTUFDX1RSWFBUQ0xfQ1RMCQkweDA2NjgKLQotCi0vKiAgU2VjdXJpdHkgKi8KLSNkZWZpbmUgUkVHX0NBTUNNRAkJCTB4MDY3MAotI2RlZmluZSBSRUdfQ0FNV1JJVEUJCQkweDA2NzQKLSNkZWZpbmUgUkVHX0NBTVJFQUQJCQkweDA2NzgKLSNkZWZpbmUgUkVHX0NBTURCRwkJCTB4MDY3QwotI2RlZmluZSBSRUdfU0VDQ0ZHCQkJMHgwNjgwCi0KLS8qICBQb3dlciAqLwotI2RlZmluZSBSRUdfV09XX0NUUkwJCQkweDA2OTAKLSNkZWZpbmUgUkVHX1BTU1RBVFVTCQkJMHgwNjkxCi0jZGVmaW5lIFJFR19QU19SWF9JTkZPCQkJMHgwNjkyCi0jZGVmaW5lIFJFR19MUE5BVl9DVFJMCQkJMHgwNjk0Ci0jZGVmaW5lIFJFR19XS0ZNQ0FNX0NNRAkJCTB4MDY5OAotI2RlZmluZSBSRUdfV0tGTUNBTV9SV0QJCQkweDA2OUMKLSNkZWZpbmUgUkVHX1JYRkxUTUFQMAkJCTB4MDZBMAotI2RlZmluZSBSRUdfUlhGTFRNQVAxCQkJMHgwNkEyCi0jZGVmaW5lIFJFR19SWEZMVE1BUDIJCQkweDA2QTQKLSNkZWZpbmUgUkVHX0JDTl9QU1JfUlBUCQkJMHgwNkE4Ci0jZGVmaW5lIFJFR19DQUxCMzJLX0NUUkwJCTB4MDZBQwotI2RlZmluZSBSRUdfUEtUX01PTl9DVFJMCQkweDA2QjQKLSNkZWZpbmUgUkVHX0JUX0NPRVhfVEFCTEUJCTB4MDZDMAotI2RlZmluZSBSRUdfV01BQ19SRVNQX1RYSU5GTwkJMHgwNkQ4Ci0KLSNkZWZpbmUgUkVHX01BQ0lEMQkJCTB4MDcwMAotI2RlZmluZSBSRUdfQlNTSUQxCQkJMHgwNzA4Ci0KLQotLyogICovCi0vKiAgKi8KLS8qCTB4RkUwMGggfiAweEZFNTVoCVVTQiBDb25maWd1cmF0aW9uICovCi0vKiAgKi8KLS8qICAqLwotI2RlZmluZSBSRUdfVVNCX0lORk8JCQkweEZFMTcKLSNkZWZpbmUgUkVHX1VTQl9TUEVDSUFMX09QVElPTgkJMHhGRTU1Ci0jZGVmaW5lIFJFR19VU0JfRE1BX0FHR19UTwkJMHhGRTVCCi0jZGVmaW5lIFJFR19VU0JfQUdHX1RPCQkJMHhGRTVDCi0jZGVmaW5lIFJFR19VU0JfQUdHX1RICQkJMHhGRTVECi0KLS8qICBGb3IgdGVzdCBjaGlwICovCi0jZGVmaW5lIFJFR19URVNUX1VTQl9UWFFTCQkweEZFNDgKLSNkZWZpbmUgUkVHX1RFU1RfU0lFX1ZJRAkJMHhGRTYwCQkvKiAgMHhGRTYwfjB4RkU2MSAqLwotI2RlZmluZSBSRUdfVEVTVF9TSUVfUElECQkweEZFNjIJCS8qICAweEZFNjJ+MHhGRTYzICovCi0jZGVmaW5lIFJFR19URVNUX1NJRV9PUFRJT05BTAkJMHhGRTY0Ci0jZGVmaW5lIFJFR19URVNUX1NJRV9DSElSUF9LCQkweEZFNjUKLSNkZWZpbmUgUkVHX1RFU1RfU0lFX1BIWQkJMHhGRTY2CQkvKiAgMHhGRTY2fjB4RkU2QiAqLwotI2RlZmluZSBSRUdfVEVTVF9TSUVfTUFDX0FERFIJCTB4RkU3MAkJLyogIDB4RkU3MH4weEZFNzUgKi8KLSNkZWZpbmUgUkVHX1RFU1RfU0lFX1NUUklORwkJMHhGRTgwCQkvKiAgMHhGRTgwfjB4RkVCOSAqLwotCi0KLS8qICBGb3Igbm9ybWFsIGNoaXAgKi8KLSNkZWZpbmUgUkVHX05PUk1BTF9TSUVfVklECQkweEZFNjAJCS8qICAweEZFNjB+MHhGRTYxICovCi0jZGVmaW5lIFJFR19OT1JNQUxfU0lFX1BJRAkJMHhGRTYyCQkvKiAgMHhGRTYyfjB4RkU2MyAqLwotI2RlZmluZSBSRUdfTk9STUFMX1NJRV9PUFRJT05BTAkJMHhGRTY0Ci0jZGVmaW5lIFJFR19OT1JNQUxfU0lFX0VQCQkweEZFNjUJCS8qICAweEZFNjV+MHhGRTY3ICovCi0jZGVmaW5lIFJFR19OT1JNQUxfU0lFX1BIWQkJMHhGRTY4CQkvKiAgMHhGRTY4fjB4RkU2QiAqLwotI2RlZmluZSBSRUdfTk9STUFMX1NJRV9PUFRJT05BTDIJMHhGRTZDCi0jZGVmaW5lIFJFR19OT1JNQUxfU0lFX0dQU19FUAkJMHhGRTZECQkvKiAgUlRMODcyMyBvbmx5ICovCi0jZGVmaW5lIFJFR19OT1JNQUxfU0lFX01BQ19BRERSCQkweEZFNzAJCS8qICAweEZFNzB+MHhGRTc1ICovCi0jZGVmaW5lIFJFR19OT1JNQUxfU0lFX1NUUklORwkJMHhGRTgwCQkvKiAgMHhGRTgwfjB4RkVERiAqLwotCi0KLS8qICAqLwotLyogICovCi0vKglSZWRpZmluZSA4MTkyQyByZWdpc3RlciBkZWZpbml0aW9uIGZvciBjb21wYXRpYmlsaXR5ICovCi0vKiAgKi8KLS8qICAqLwotCi0vKiAgVE9ETzogdXNlIHRoZXNlIGRlZmluaXRpb24gd2hlbiB1c2luZyBSRUdfeHh4IG5hbWluZyBydWxlLiAqLwotLyogIE5PVEU6IERPIE5PVCBSZW1vdmUgdGhlc2UgZGVmaW5pdGlvbi4gVXNlIGxhdGVyLiAqLwotCi0JLyogIFN5c3RlbSBJc29sYXRpb24gSW50ZXJmYWNlIENvbnRyb2wuICovCi0jZGVmaW5lCVNZU19JU09fQ1RSTAkJCVJFR19TWVNfSVNPX0NUUkwKLQkvKiAgU3lzdGVtIEZ1bmN0aW9uIEVuYWJsZS4gKi8KLSNkZWZpbmUJU1lTX0ZVTkNfRU4JCQlSRUdfU1lTX0ZVTkNfRU4KLSNkZWZpbmUJU1lTX0NMSwkJCQlSRUdfU1lTX0NMS1IKLQkvKiAgOTNDNDYvOTNDNTYgQ29tbWFuZCBSZWdpc3Rlci4gKi8KLSNkZWZpbmUJQ1I5MzQ2CQkJCVJFR185MzQ2Q1IKLQkvKiAgRS1GdXNlIENvbnRyb2wuICovCi0jZGVmaW5lCUVGVVNFX0NUUkwJCQlSRUdfRUZVU0VfQ1RSTAotCS8qICBFLUZ1c2UgVGVzdC4gKi8KLSNkZWZpbmUJRUZVU0VfVEVTVAkJCVJFR19FRlVTRV9URVNUCi0JLyogIE1lZGlhIFN0YXR1cyByZWdpc3RlciAqLwotI2RlZmluZQlNU1IJCQkJKFJFR19DUiArIDIpCi0jZGVmaW5lCUlTUgkJCQlSRUdfSElTUgotCS8qICBUaW1pbmcgU3luYyBGdW5jdGlvbiBUaW1lciBSZWdpc3Rlci4gKi8KLSNkZWZpbmUJVFNGUgkJCQlSRUdfVFNGVFIKLQotCS8qICBNQUMgSUQgUmVnaXN0ZXIsIE9mZnNldCAweDAwNTAtMHgwMDUzICovCi0jZGVmaW5lCU1BQ0lEUjAJCQkJUkVHX01BQ0lECi0JLyogIE1BQyBJRCBSZWdpc3RlciwgT2Zmc2V0IDB4MDA1NC0weDAwNTUgKi8KLSNkZWZpbmUJTUFDSURSNAkJCQkoUkVHX01BQ0lEICsgNCkKLQotI2RlZmluZQlQQlAJCQkJUkVHX1BCUAotCi0JLyogIFJlZGlmaW5lIE1BQ0lEIHJlZ2lzdGVyLCB0byBjb21wYXRpYmxlIHByaW9yIElDcy4gKi8KLSNkZWZpbmUJSURSMAkJCQlNQUNJRFIwCi0jZGVmaW5lCUlEUjQJCQkJTUFDSURSNAotCi0KLS8qICAqLwotLyogIDkuIFNlY3VyaXR5IENvbnRyb2wgUmVnaXN0ZXJzCShPZmZzZXQ6ICkgKi8KLS8qICAqLwotCS8qICBTb2Z0d2FyZSB3cml0ZSBDQU0gaW5wdXQgY29udGVudCAqLwotI2RlZmluZQlXQ0FNSQkJCQlSRUdfQ0FNV1JJVEUKLQkvKiAgU29mdHdhcmUgcmVhZC93cml0ZSBDQU0gY29uZmlnICovCi0jZGVmaW5lCVJDQU1PCQkJCVJFR19DQU1SRUFECi0jZGVmaW5lCUNBTURCRwkJCQlSRUdfQ0FNREJHCi0JLyogU2VjdXJpdHkgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZQlTRUNSCQkJCVJFR19TRUNDRkcKLQotLyogIFVudXNlZCByZWdpc3RlciAqLwotI2RlZmluZQlVbnVzZWRSZWdpc3RlcgkJCTB4MUJGCi0jZGVmaW5lCURDQU0JCQkJVW51c2VkUmVnaXN0ZXIKLSNkZWZpbmUJUFNSCQkJCVVudXNlZFJlZ2lzdGVyCi0jZGVmaW5lCUJCQWRkcgkJCQlVbnVzZWRSZWdpc3RlcgotI2RlZmluZQlQaHlEYXRhUgkJCVVudXNlZFJlZ2lzdGVyCi0KLSNkZWZpbmUJSW52YWxpZEJCUkZWYWx1ZQkJMHgxMjM0NTY3OAotCi0vKiAgTWluIFNwYWNpbmcgcmVsYXRlZCBzZXR0aW5ncy4gKi8KLSNkZWZpbmUJTUFYX01TU19ERU5TSVRZXzJUCQkweDEzCi0jZGVmaW5lCU1BWF9NU1NfREVOU0lUWV8xVAkJMHgwQQotCi0vKiAgKi8KLS8qIDgxOTJDIENtZDkzNDZDUiBiaXRzCQkJKE9mZnNldCAweEEsIDE2Yml0KSAqLwotLyogICovCi0JIC8qICBFRVBST00gZW5hYmxlIHdoZW4gc2V0IDEgKi8KLSNkZWZpbmUJQ21kRUVQUk9NX0VuCQkJQklUKDUpCi0JLyogIFN5c3RlbSBFRVBST00gc2VsZWN0LCAwOiBib290IGZyb20gRS1GVVNFLAotCSAgICAxOiBUaGUgRUVQUk9NIHVzZWQgaXMgOTM0NiAqLwotI2RlZmluZQlDbWRFRVJQT01TRUwJCQlCSVQoNCkKLSNkZWZpbmUJQ21kOTM0NkNSXzkzNTZTRUwJCUJJVCg0KQotI2RlZmluZQlBdXRvTG9hZEVFUFJPTQkJCShDbWRFRVBST01fRW58Q21kRUVSUE9NU0VMKQotI2RlZmluZQlBdXRvTG9hZEVGVVNFCQkJQ21kRUVQUk9NX0VuCi0KLS8qICAqLwotLyogODE5MkMgR1BJTyBNVVggQ29uZmlndXJhdGlvbiBSZWdpc3RlciAob2Zmc2V0IDB4NDAsIDQgYnl0ZSkgKi8KLS8qICAqLwotI2RlZmluZQlHUElPU0VMX0dQSU8JCQkwCi0jZGVmaW5lCUdQSU9TRUxfRU5CVAkJCUJJVCg1KQotCi0vKiAgKi8KLS8qICAgICAgICA4MTkyQyBHUElPIFBJTiBDb250cm9sIFJlZ2lzdGVyIChvZmZzZXQgMHg0NCwgNCBieXRlKSAqLwotLyogICovCi0JLyogIEdQSU8gcGlucyBpbnB1dCB2YWx1ZSAqLwotI2RlZmluZQlHUElPX0lOCQkJCVJFR19HUElPX1BJTl9DVFJMCi0JLyogIEdQSU8gcGlucyBvdXRwdXQgdmFsdWUgKi8KLSNkZWZpbmUJR1BJT19PVVQJCQkoUkVHX0dQSU9fUElOX0NUUkwrMSkKLQkvKiAgR1BJTyBwaW5zIG91dHB1dCBlbmFibGUgd2hlbiBhIGJpdCBpcyBzZXQgdG8gIjEiOwotCSAgICBvdGhlcndpc2UsIGlucHV0IGlzIGNvbmZpZ3VyZWQuICovCi0jZGVmaW5lCUdQSU9fSU9fU0VMCQkJKFJFR19HUElPX1BJTl9DVFJMKzIpCi0jZGVmaW5lCUdQSU9fTU9ECQkJKFJFR19HUElPX1BJTl9DVFJMKzMpCi0KLS8qICAqLwotLyogODE5MkMgKE1TUikgTWVkaWEgU3RhdHVzIFJlZ2lzdGVyCShPZmZzZXQgMHg0QywgOCBiaXRzKSAqLwotLyogICovCi0vKgotTmV0d29yayBUeXBlCi0wMDogTm8gbGluawotMDE6IExpbmsgaW4gYWQgaG9jIG5ldHdvcmsKLTEwOiBMaW5rIGluIGluZnJhc3RydWN0dXJlIG5ldHdvcmsKLTExOiBBUCBtb2RlCi1EZWZhdWx0OiAwMGIuCi0qLwotI2RlZmluZQlNU1JfTk9MSU5LCQkJMHgwMAotI2RlZmluZQlNU1JfQURIT0MJCQkweDAxCi0jZGVmaW5lCU1TUl9JTkZSQQkJCTB4MDIKLSNkZWZpbmUJTVNSX0FQCQkJCTB4MDMKLQotLyogICovCi0vKiAgNi4gQWRhcHRpdmUgQ29udHJvbCBSZWdpc3RlcnMgIChPZmZzZXQ6IDB4MDE2MCAtIDB4MDFDRikgKi8KLS8qICAqLwotLyogICovCi0vKiA4MTkyQyBSZXNwb25zZSBSYXRlIFNldCBSZWdpc3Rlcgkob2Zmc2V0IDB4MTgxLCAyNGJpdHMpICovCi0vKiAgKi8KLSNkZWZpbmUJUlJTUl9SU0NfT0ZGU0VUCQkJMjEKLSNkZWZpbmUJUlJTUl9TSE9SVF9PRkZTRVQJCTIzCi0jZGVmaW5lCVJSU1JfUlNDX0JXXzQwTQkJCTB4NjAwMDAwCi0jZGVmaW5lCVJSU1JfUlNDX1VQU1VCQ0hOTAkJMHg0MDAwMDAKLSNkZWZpbmUJUlJTUl9SU0NfTE9XU1VCQ0hOTAkJMHgyMDAwMDAKLSNkZWZpbmUJUlJTUl9TSE9SVAkJCTB4ODAwMDAwCi0jZGVmaW5lCVJSU1JfMU0JCQkJQklUKDApCi0jZGVmaW5lCVJSU1JfMk0JCQkJQklUKDEpCi0jZGVmaW5lCVJSU1JfNV81TQkJCUJJVCgyKQotI2RlZmluZQlSUlNSXzExTQkJCUJJVCgzKQotI2RlZmluZQlSUlNSXzZNCQkJCUJJVCg0KQotI2RlZmluZQlSUlNSXzlNCQkJCUJJVCg1KQotI2RlZmluZQlSUlNSXzEyTQkJCUJJVCg2KQotI2RlZmluZQlSUlNSXzE4TQkJCUJJVCg3KQotI2RlZmluZQlSUlNSXzI0TQkJCUJJVCg4KQotI2RlZmluZQlSUlNSXzM2TQkJCUJJVCg5KQotI2RlZmluZQlSUlNSXzQ4TQkJCUJJVCgxMCkKLSNkZWZpbmUJUlJTUl81NE0JCQlCSVQoMTEpCi0jZGVmaW5lCVJSU1JfTUNTMAkJCUJJVCgxMikKLSNkZWZpbmUJUlJTUl9NQ1MxCQkJQklUKDEzKQotI2RlZmluZQlSUlNSX01DUzIJCQlCSVQoMTQpCi0jZGVmaW5lCVJSU1JfTUNTMwkJCUJJVCgxNSkKLSNkZWZpbmUJUlJTUl9NQ1M0CQkJQklUKDE2KQotI2RlZmluZQlSUlNSX01DUzUJCQlCSVQoMTcpCi0jZGVmaW5lCVJSU1JfTUNTNgkJCUJJVCgxOCkKLSNkZWZpbmUJUlJTUl9NQ1M3CQkJQklUKDE5KQotI2RlZmluZQlCUlNSX0Fja1Nob3J0UG1iCQlCSVQoMjMpCi0vKiAgQ0NLIEFDSzogdXNlIFNob3J0IFByZWFtYmxlIG9yIG5vdCAqLwotCi0vKiAgKi8KLS8qIDgxOTJDIEJXX09QTU9ERSBiaXRzCQkJKE9mZnNldCAweDIwMywgOGJpdCkgKi8KLS8qICAqLwotI2RlZmluZQlCV19PUE1PREVfMjBNSFoJCQlCSVQoMikKLSNkZWZpbmUJQldfT1BNT0RFXzVHCQkJQklUKDEpCi0jZGVmaW5lCUJXX09QTU9ERV8xMUoJCQlCSVQoMCkKLQotCi0vKiAgKi8KLS8qIDgxOTJDIENBTSBDb25maWcgU2V0dGluZyAob2Zmc2V0IDB4MjUwLCAxIGJ5dGUpICovCi0vKiAgKi8KLSNkZWZpbmUJQ0FNX1ZBTElECQkJQklUKDE1KQotI2RlZmluZQlDQU1fTk9UVkFMSUQJCQkweDAwMDAKLSNkZWZpbmUJQ0FNX1VTRURLCQkJQklUKDUpCi0KLSNkZWZpbmUJQ0FNX0NPTlRFTlRfQ09VTlQJCTgKLQotI2RlZmluZQlDQU1fTk9ORQkJCTB4MAotI2RlZmluZQlDQU1fV0VQNDAJCQkweDAxCi0jZGVmaW5lCUNBTV9US0lQCQkJMHgwMgotI2RlZmluZQlDQU1fQUVTCQkJCTB4MDQKLSNkZWZpbmUJQ0FNX1dFUDEwNAkJCTB4MDUKLQotI2RlZmluZQlUT1RBTF9DQU1fRU5UUlkJCQkzMgotI2RlZmluZQlIQUxGX0NBTV9FTlRSWQkJCTE2Ci0KLSNkZWZpbmUJQ0FNX0NPTkZJR19VU0VESwkJdHJ1ZQotI2RlZmluZQlDQU1fQ09ORklHX05PX1VTRURLCQlmYWxzZQotCi0jZGVmaW5lCUNBTV9XUklURQkJCUJJVCgxNikKLSNkZWZpbmUJQ0FNX1JFQUQJCQkweDAwMDAwMDAwCi0jZGVmaW5lCUNBTV9QT0xMSU5JRwkJCUJJVCgzMSkKLQotI2RlZmluZQlTQ1JfVXNlREsJCQkweDAxCi0jZGVmaW5lCVNDUl9UeFNlY0VuYWJsZQkJCTB4MDIKLSNkZWZpbmUJU0NSX1J4U2VjRW5hYmxlCQkJMHgwNAotCi0KLS8qICAqLwotLyogIDEyLiBIb3N0IEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXJzCSAoT2Zmc2V0OiAweDAzMDAgLSAweDAzMEYpICovCi0vKiAgKi8KLS8qICAqLwotLyogODE5MCBJTVIvSVNSIGJpdHMJCQkob2Zmc2V0IDB4ZmQsICA4Yml0cykgKi8KLS8qICAqLwotI2RlZmluZQlJTVI4MTkwX0RJU0FCTEVECQkweDAKLS8qICBJTVIgRFcwIEJpdCAwLTMxICovCi0KLSNkZWZpbmUJSU1SX0JDTkRNQUlOVDYJCQlCSVQoMzEpCS8qICBCZWFjb24gRE1BIEludGVycnVwdCA2ICovCi0jZGVmaW5lCUlNUl9CQ05ETUFJTlQ1CQkJQklUKDMwKQkvKiAgQmVhY29uIERNQSBJbnRlcnJ1cHQgNSAqLwotI2RlZmluZQlJTVJfQkNORE1BSU5UNAkJCUJJVCgyOSkJLyogIEJlYWNvbiBETUEgSW50ZXJydXB0IDQgKi8KLSNkZWZpbmUJSU1SX0JDTkRNQUlOVDMJCQlCSVQoMjgpCS8qICBCZWFjb24gRE1BIEludGVycnVwdCAzICovCi0jZGVmaW5lCUlNUl9CQ05ETUFJTlQyCQkJQklUKDI3KQkvKiAgQmVhY29uIERNQSBJbnRlcnJ1cHQgMiAqLwotI2RlZmluZQlJTVJfQkNORE1BSU5UMQkJCUJJVCgyNikJLyogIEJlYWNvbiBETUEgSW50ZXJydXB0IDEgKi8KLSNkZWZpbmUJSU1SX0JDTkRPSzgJCQlCSVQoMjUpCS8qICBCZWFjb24gUXVldWUgRE1BIE9LCi0JCQkJCQkgICAgSW50ZXJydXB0IDggKi8KLSNkZWZpbmUJSU1SX0JDTkRPSzcJCQlCSVQoMjQpCS8qICBCZWFjb24gUXVldWUgRE1BIE9LCi0JCQkJCQkgICAgSW50ZXJydXB0IDcgKi8KLSNkZWZpbmUJSU1SX0JDTkRPSzYJCQlCSVQoMjMpCS8qICBCZWFjb24gUXVldWUgRE1BIE9LCi0JCQkJCQkgICAgSW50ZXJydXB0IDYgKi8KLSNkZWZpbmUJSU1SX0JDTkRPSzUJCQlCSVQoMjIpCS8qICBCZWFjb24gUXVldWUgRE1BIE9LCi0JCQkJCQkgICAgSW50ZXJydXB0IDUgKi8KLSNkZWZpbmUJSU1SX0JDTkRPSzQJCQlCSVQoMjEpCS8qICBCZWFjb24gUXVldWUgRE1BIE9LCi0JCQkJCQkgICAgSW50ZXJydXB0IDQgKi8KLSNkZWZpbmUJSU1SX0JDTkRPSzMJCQlCSVQoMjApCS8qICBCZWFjb24gUXVldWUgRE1BIE9LCi0JCQkJCQkgICAgSW50ZXJydXB0IDMgKi8KLSNkZWZpbmUJSU1SX0JDTkRPSzIJCQlCSVQoMTkpCS8qICBCZWFjb24gUXVldWUgRE1BIE9LCi0JCQkJCQkgICAgSW50ZXJydXB0IDIgKi8KLSNkZWZpbmUJSU1SX0JDTkRPSzEJCQlCSVQoMTgpCS8qICBCZWFjb24gUXVldWUgRE1BIE9LCi0JCQkJCQkgICAgSW50ZXJydXB0IDEgKi8KLSNkZWZpbmUJSU1SX1RJTUVPVVQyCQkJQklUKDE3KQkvKiAgVGltZW91dCBpbnRlcnJ1cHQgMiAqLwotI2RlZmluZQlJTVJfVElNRU9VVDEJCQlCSVQoMTYpCS8qICBUaW1lb3V0IGludGVycnVwdCAxICovCi0jZGVmaW5lCUlNUl9UWEZPVlcJCQlCSVQoMTUpCS8qICBUcmFuc21pdCBGSUZPIE92ZXJmbG93ICovCi0jZGVmaW5lCUlNUl9QU1RJTUVPVVQJCQlCSVQoMTQpCS8qICBQb3dlciBzYXZlIHRpbWUgb3V0Ci0JCQkJCQkgICAgaW50ZXJydXB0ICovCi0jZGVmaW5lCUlNUl9CY25JbnQJCQlCSVQoMTMpCS8qICBCZWFjb24gRE1BIEludGVycnVwdCAwICovCi0jZGVmaW5lCUlNUl9SWEZPVlcJCQlCSVQoMTIpCS8qICBSZWNlaXZlIEZJRk8gT3ZlcmZsb3cgKi8KLSNkZWZpbmUJSU1SX1JEVQkJCQlCSVQoMTEpCS8qICBSZWNlaXZlIERlc2NyaXB0b3IKLQkJCQkJCSAgICBVbmF2YWlsYWJsZSAqLwotI2RlZmluZQlJTVJfQVRJTUVORAkJCUJJVCgxMCkJLyogIEZvciA5MkMsQVRJTSBXaW5kb3cKLQkJCQkJCSAgICBFbmQgSW50ZXJydXB0ICovCi0jZGVmaW5lCUlNUl9CRE9LCQkJQklUKDkpCS8qICBCZWFjb24gUXVldWUgRE1BIE9LCi0JCQkJCQkgICAgSW50ZXJydXAgKi8KLSNkZWZpbmUJSU1SX0hJR0hET0sJCQlCSVQoOCkJLyogIEhpZ2ggUXVldWUgRE1BIE9LCi0JCQkJCQkgICAgSW50ZXJydXB0ICovCi0jZGVmaW5lCUlNUl9UQkRPSwkJCUJJVCg3KQkvKiAgVHJhbnNtaXQgQmVhY29uIE9LCi0JCQkJCQkgICAgaW50ZXJydXAgKi8KLSNkZWZpbmUJSU1SX01HTlRET0sJCQlCSVQoNikJLyogIE1hbmFnZW1lbnQgUXVldWUgRE1BIE9LCi0JCQkJCQkgICAgSW50ZXJydXB0ICovCi0jZGVmaW5lCUlNUl9UQkRFUgkJCUJJVCg1KQkvKiAgRm9yIDkyQyxUcmFuc21pdCBCZWFjb24KLQkJCQkJCSAgICBFcnJvciBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJSU1SX0JLRE9LCQkJQklUKDQpCS8qICBBQ19CSyBETUEgT0sgSW50ZXJydXB0ICovCi0jZGVmaW5lCUlNUl9CRURPSwkJCUJJVCgzKQkvKiAgQUNfQkUgRE1BIE9LIEludGVycnVwdCAqLwotI2RlZmluZQlJTVJfVklET0sJCQlCSVQoMikJLyogIEFDX1ZJIERNQSBPSyBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJSU1SX1ZPRE9LCQkJQklUKDEpCS8qICBBQ19WTyBETUEgSW50ZXJydXB0ICovCi0jZGVmaW5lCUlNUl9ST0sJCQkJQklUKDApCS8qICBSZWNlaXZlIERNQSBPSyBJbnRlcnJ1cHQgKi8KLQotI2RlZmluZQlJTVJfUlhfTUFTSwkJCShJTVJfUk9LfElNUl9SRFV8SU1SX1JYRk9WVykKLSNkZWZpbmUJSU1SX1RYX01BU0sJCQkoSU1SX1ZPRE9LfElNUl9WSURPS3xJTVJfQkVET0t8IFwKLQkJCQkJIElNUl9CS0RPS3xJTVJfTUdOVERPS3xJTVJfSElHSERPS3wgXAotCQkJCQkgSU1SX0JET0spCi0KLS8qICAxMy4gSG9zdCBJbnRlcnJ1cHQgU3RhdHVzIEV4dGVuc2lvbiBSZWdpc3RlciAoT2Zmc2V0OiAweDAxMkMtMDEyRWgpICovCi0jZGVmaW5lCUlNUl9CY25JbnRfRQkJCUJJVCgxMikKLSNkZWZpbmUJSU1SX1RYRVJSCQkJQklUKDExKQotI2RlZmluZQlJTVJfUlhFUlIJCQlCSVQoMTApCi0jZGVmaW5lCUlNUl9DMkhDTUQJCQlCSVQoOSkKLSNkZWZpbmUJSU1SX0NQV00JCQlCSVQoOCkKLS8qIFJTVkQgWzItN10gKi8KLSNkZWZpbmUJSU1SX09DUElOVAkJCUJJVCgxKQotI2RlZmluZQlJTVJfV0xBTk9GRgkJCUJJVCgwKQotCi0KLS8qICAgICAgICA4MTkyQyBFRVBST00vRUZVU0Ugc2hhcmUgcmVnaXN0ZXIgZGVmaW5pdGlvbi4gKi8KLQotLyogIERlZmF1bHQgVmFsdWUgZm9yIEVFUFJPTSBvciBFRlVTRSEhISAqLwotI2RlZmluZSBFRVBST01fRGVmYXVsdF9UU1NJCQkJMHgwCi0jZGVmaW5lIEVFUFJPTV9EZWZhdWx0X1R4UG93ZXJEaWZmCQkweDAKLSNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfQ3J5c3RhbENhcAkJMHg1Ci0gLyogIERlZmF1bHQ6IDJYMiwgUlRMODE5MkNFKFFGUE42OCkgKi8KLSNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfQm9hcmRUeXBlCQkweDAyCi0jZGVmaW5lIEVFUFJPTV9EZWZhdWx0X1R4UG93ZXIJCQkweDEwMTAKLSNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfSFQyVF9UeFB3cgkJMHgxMAotCi0jZGVmaW5lIEVFUFJPTV9EZWZhdWx0X0xlZ2FjeUhUVHhQb3dlckRpZmYJMHgzCi0jZGVmaW5lIEVFUFJPTV9EZWZhdWx0X1RoZXJtYWxNZXRlcgkJMHgxMgotCi0jZGVmaW5lIEVFUFJPTV9EZWZhdWx0X0FudFR4UG93ZXJEaWZmCQkweDAKLSNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfVHhQd0RpZmZfQ3J5c3RhbENhcAkweDUKLSNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfVHhQb3dlckxldmVsCQkweDIyCi0jZGVmaW5lIEVFUFJPTV9EZWZhdWx0X0hUNDBfMlNEaWZmCQkweDAKLQkvKiAgSFQyMDwtPjQwIGRlZmF1bHQgVHggUG93ZXIgSW5kZXggRGlmZmVyZW5jZSAqLwotI2RlZmluZSBFRVBST01fRGVmYXVsdF9IVDIwX0RpZmYJCTIKLSNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfTGVnYWN5SFRUeFBvd2VyRGlmZgkweDMKLSNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfSFQ0MF9Qd3JNYXhPZmZzZXQJMAotI2RlZmluZSBFRVBST01fRGVmYXVsdF9IVDIwX1B3ck1heE9mZnNldAkwCi0KLS8qICBGb3IgZGVidWcgKi8KLSNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfUElECQkJMHgxMjM0Ci0jZGVmaW5lIEVFUFJPTV9EZWZhdWx0X1ZJRAkJCTB4NTY3OAotI2RlZmluZSBFRVBST01fRGVmYXVsdF9DdXN0b21lcklECQkweEFCCi0jZGVmaW5lIEVFUFJPTV9EZWZhdWx0X1N1YkN1c3RvbWVySUQJCTB4Q0QKLSNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfVmVyc2lvbgkJCTAKLQotI2RlZmluZSBFRVBST01fQ0hBTk5FTF9QTEFOX0ZDQwkJCTB4MAotI2RlZmluZSBFRVBST01fQ0hBTk5FTF9QTEFOX0lDCQkJMHgxCi0jZGVmaW5lIEVFUFJPTV9DSEFOTkVMX1BMQU5fRVRTSQkJMHgyCi0jZGVmaW5lIEVFUFJPTV9DSEFOTkVMX1BMQU5fU1BBSU4JCTB4MwotI2RlZmluZSBFRVBST01fQ0hBTk5FTF9QTEFOX0ZSQU5DRQkJMHg0Ci0jZGVmaW5lIEVFUFJPTV9DSEFOTkVMX1BMQU5fTUtLCQkJMHg1Ci0jZGVmaW5lIEVFUFJPTV9DSEFOTkVMX1BMQU5fTUtLMQkJMHg2Ci0jZGVmaW5lIEVFUFJPTV9DSEFOTkVMX1BMQU5fSVNSQUVMCQkweDcKLSNkZWZpbmUgRUVQUk9NX0NIQU5ORUxfUExBTl9URUxFQwkJMHg4Ci0jZGVmaW5lIEVFUFJPTV9DSEFOTkVMX1BMQU5fR0xPQkFMX0RPTUFJTgkweDkKLSNkZWZpbmUgRUVQUk9NX0NIQU5ORUxfUExBTl9XT1JMRF9XSURFXzEzCTB4QQotI2RlZmluZSBFRVBST01fQ0hBTk5FTF9QTEFOX05DQwkJCTB4QgotI2RlZmluZSBFRVBST01fVVNCX09QVElPTkFMMQkJCTB4RQotI2RlZmluZSBFRVBST01fQ0hBTk5FTF9QTEFOX0JZX0hXX01BU0sJCTB4ODAKLQotCi0jZGVmaW5lIEVFUFJPTV9DSURfREVGQVVMVAkJCTB4MAotI2RlZmluZSBFRVBST01fQ0lEX1RPU0hJQkEJCQkweDQKLSAvKiAgQ0NYIHRlc3QuIEJ5IEJydWNlLCAyMDA5LTAyLTI1LiAqLwotI2RlZmluZSBFRVBST01fQ0lEX0NDWAkJCQkweDEwCi0jZGVmaW5lIEVFUFJPTV9DSURfUU1JCQkJCTB4MEQKLSAvKiAgYWRkZWQgYnkgY2hpeW9rbyBmb3IgZHRtLCAyMDA5MDEwOCAqLwotI2RlZmluZSBFRVBST01fQ0lEX1dIUUwJCQkJMHhGRQotCi0KLSNkZWZpbmUJUlRMX0VFUFJPTV9JRAkJCQkweDgxMjkKLQotI2RlZmluZQlTVVBQT1JUX0hXX1JBRElPX0RFVEVDVChwSGFsRGF0YSkJCVwKLQkocEhhbERhdGEtPkJvYXJkVHlwZSA9PSBCT0FSRF9NSU5JQ0FSRCB8fAlcCi0JcEhhbERhdGEtPkJvYXJkVHlwZSA9PSBCT0FSRF9VU0JfU09MTyB8fAlcCi0JcEhhbERhdGEtPkJvYXJkVHlwZSA9PSBCT0FSRF9VU0JfQ09NQk8pCi0KLS8qICAqLwotLyogIEVFUFJPTSBhZGRyZXNzIGZvciBUZXN0IGNoaXAgKi8KLS8qICAqLwotI2RlZmluZSBFRVBST01fVEVTVF9VU0JfT1BUCQkweDBFCi0jZGVmaW5lIEVFUFJPTV9URVNUX0NISVJQX0sJCTB4MEYKLSNkZWZpbmUgRUVQUk9NX1RFU1RfRVBfU0VUVElORwkJMHgwRQotI2RlZmluZSBFRVBST01fVEVTVF9VU0JfUEhZCQkweDEwCi0KLQotLyogICovCi0vKiAgRUVQUk9NIGFkZHJlc3MgZm9yIE5vcm1hbCBjaGlwICovCi0vKiAgKi8KLSNkZWZpbmUgRUVQUk9NX05PUk1BTF9VU0JfT1BUCQkweDBFCi0jZGVmaW5lIEVFUFJPTV9OT1JNQUxfQ0hJUlBfSwkJMHgwRQkvKiAgQ2hhbmdlZCAqLwotI2RlZmluZSBFRVBST01fTk9STUFMX0VQX1NFVFRJTkcJMHgwRgkvKiAgQ2hhbmdlZCAqLwotI2RlZmluZSBFRVBST01fTk9STUFMX1VTQl9QSFkJCTB4MTIJLyogIENoYW5nZWQgKi8KLQotZW51bSB7Ci0JQk9BUkRfVVNCX0RPTkdMRSA9IDAsCS8qICBVU0IgZG9uZ2xlICovCi0JQk9BUkRfVVNCX0hpZ2hfUEEgPSAxLAkvKiAgVVNCIGRvbmdsZSB3aXRoIGhpZ2ggcG93ZXIgUEEgKi8KLQlCT0FSRF9NSU5JQ0FSRCA9IDIsCS8qICBNaW5pY2FyZCAqLwotCUJPQVJEX1VTQl9TT0xPID0gMywJLyogIFVTQiBzb2xvLVNsaW0gbW9kdWxlICovCi0JQk9BUkRfVVNCX0NPTUJPID0gNCwJLyogIFVTQiBDb21iby1TbGltIG1vZHVsZSAqLwotfTsKLQotLyogIFRlc3QgY2hpcCBhbmQgbm9ybWFsIGNoaXAgY29tbW9uIGRlZmluZSAqLwotLyogICovCi0vKiAgRUVQUk9NIGFkZHJlc3MgZm9yIGJvdGggKi8KLS8qICAqLwotI2RlZmluZSBFRVBST01fSUQwCQkJMHgwMAotI2RlZmluZSBFRVBST01fSUQxCQkJMHgwMQotI2RlZmluZSBFRVBST01fUlRLX1JTVjEJCQkweDAyCi0jZGVmaW5lIEVFUFJPTV9SVEtfUlNWMgkJCTB4MDMKLSNkZWZpbmUgRUVQUk9NX1JUS19SU1YzCQkJMHgwNAotI2RlZmluZSBFRVBST01fUlRLX1JTVjQJCQkweDA1Ci0jZGVmaW5lIEVFUFJPTV9SVEtfUlNWNQkJCTB4MDYKLSNkZWZpbmUgRUVQUk9NX0RCR19TRUwJCQkweDA3Ci0jZGVmaW5lIEVFUFJPTV9SVEtfUlNWNgkJCTB4MDgKLSNkZWZpbmUgRUVQUk9NX1ZJRAkJCTB4MEEKLSNkZWZpbmUgRUVQUk9NX1BJRAkJCTB4MEMKLQotI2RlZmluZSBFRVBST01fTUFDX0FERFIJCQkweDE2Ci0jZGVmaW5lIEVFUFJPTV9TVFJJTkcJCQkweDFDCi0jZGVmaW5lIEVFUFJPTV9TVUJDVVNUT01FUl9JRAkJMHg1OQotI2RlZmluZSBFRVBST01fQ0NLX1RYX1BXUl9JTlgJCTB4NUEKLSNkZWZpbmUgRUVQUk9NX0hUNDBfMVNfVFhfUFdSX0lOWAkweDYwCi0jZGVmaW5lIEVFUFJPTV9IVDQwXzJTX1RYX1BXUl9JTlhfRElGRgkweDY2Ci0jZGVmaW5lIEVFUFJPTV9IVDIwX1RYX1BXUl9JTlhfRElGRgkweDY5Ci0jZGVmaW5lIEVFUFJPTV9PRkRNX1RYX1BXUl9JTlhfRElGRgkweDZDCi0jZGVmaW5lIEVFUFJPTV9IVDQwX01BWF9QV1JfT0ZGU0VUCTB4NkYKLSNkZWZpbmUgRUVQUk9NX0hUMjBfTUFYX1BXUl9PRkZTRVQJMHg3MgotCi0jZGVmaW5lIEVFUFJPTV9DSEFOTkVMX1BMQU4JCTB4NzUKLSNkZWZpbmUgRUVQUk9NX1RTU0lfQQkJCTB4NzYKLSNkZWZpbmUgRUVQUk9NX1RTU0lfQgkJCTB4NzcKLSNkZWZpbmUgRUVQUk9NX1RIRVJNQUxfTUVURVIJCTB4NzgKLSNkZWZpbmUgRUVQUk9NX1JGX09QVDEJCQkweDc5Ci0jZGVmaW5lIEVFUFJPTV9SRl9PUFQyCQkJMHg3QQotI2RlZmluZSBFRVBST01fUkZfT1BUMwkJCTB4N0IKLSNkZWZpbmUgRUVQUk9NX1JGX09QVDQJCQkweDdDCi0jZGVmaW5lIEVFUFJPTV9WRVJTSU9OCQkJMHg3RQotI2RlZmluZSBFRVBST01fQ1VTVE9NRVJfSUQJCTB4N0YKLQotCSAvKiAweDA6IFJUTDgxODhTVSwgMHgxOiBSVEw4MTkxU1UsIDB4MjogUlRMODE5MlNVLCAweDM6IFJUTDgxOTFHVSAqLwotI2RlZmluZSBFRVBST01fQm9hcmRUeXBlCQkweDU0Ci0JLyogMHg1Qy0weDc2LCBUeCBQb3dlciBpbmRleC4gKi8KLSNkZWZpbmUgRUVQUk9NX1R4UHdJbmRleAkJMHg1QwotCS8qICBEaWZmZXJlbmNlIG9mIGdhaW4gaW5kZXggYmV0d2VlbiBsZWdhY3kgYW5kIGhpZ2ggdGhyb3VnaHB1dCBPRkRNLiAqLwotI2RlZmluZSBFRVBST01fUHdEaWZmCQkJMHg2NwotCS8qICBDQ0sgVHggUG93ZXIgKi8KLSNkZWZpbmUgRUVQUk9NX1R4UG93ZXJDQ0sJCTB4NUEKLQotLyogIDIwMDkvMDIvMDkgQ29zYSBBZGQgZm9yIFNEMyByZXF1aXJlbWVudCAqLwotCS8qICBIVDIwIFR4IFBvd2VyIEluZGV4IERpZmZlcmVuY2UgKi8KLSNkZWZpbmUgRUVQUk9NX1RYX1BXUl9IVDIwX0RJRkYJCTB4NmUKLQkvKiAgSFQyMDwtPjQwIGRlZmF1bHQgVHggUG93ZXIgSW5kZXggRGlmZmVyZW5jZSAqLwotI2RlZmluZSBERUZBVUxUX0hUMjBfVFhQV1JfRElGRgkJMgotCS8qICBPRkRNIFR4IFBvd2VyIEluZGV4IERpZmZlcmVuY2UgKi8KLSNkZWZpbmUgRUVQUk9NX1RYX1BXUl9PRkRNX0RJRkYJCTB4NzEKLQotCS8qICBQb3dlciBkaWZmIGZvciBjaGFubmVsIGdyb3VwICovCi0jZGVmaW5lIEVFUFJPTV9UeFBXUkdyb3VwCQkweDczCi0JLyogIENoZWNrIGlmIHBvd2VyIHNhZmV0eSBpcyBuZWVkICovCi0jZGVmaW5lIEVFUFJPTV9SZWd1bGF0b3J5CQkweDc5Ci0KLQkvKiAgOTJjdSwgMHg3RVs0XSAqLwotI2RlZmluZSBFRVBST01fQkxVRVRPT1RIX0NPRVhJU1QJMHg3RQotI2RlZmluZSBFRVBST01fTk9STUFMX0JvYXJkVHlwZQkJRUVQUk9NX1JGX09QVDEJLyogNzo1XSAqLwotI2RlZmluZSBCT0FSRF9UWVBFX05PUk1BTF9NQVNLCQkweEUwCi0jZGVmaW5lIEJPQVJEX1RZUEVfVEVTVF9NQVNLCQkweDBGCi0JLyogQklUMCAxIGZvciBidWlsZC1pbiBtb2R1bGUsIDAgZm9yIGV4dGVybmFsIGRvbmdsZSAqLwotI2RlZmluZSBFRVBST01fRUFTWV9SRVBMQUNFTUVOVAkJMHg1MAotLyogICovCi0vKiBFUFJPTSBjb250ZW50IGRlZmluaXRpb25zICovCi0vKiAgKi8KLSNkZWZpbmUgT1NfTElOS19TUEVFRAkJCUJJVCg1KQotCi0jZGVmaW5lIEJPQVJEX1RZUEVfTUFTSwkJCTB4RgotCi0jZGVmaW5lIEJUX0NPRVhJU1RFTkNFCQkJQklUKDQpCi0jZGVmaW5lIEJUX0NPX1NISUZUCQkJNAotCi0jZGVmaW5lIEVQX05VTUJFUl9NQVNLCQkJMHgzMAkvKiBiaXQgNDo1IDBFaCAqLwotI2RlZmluZSBFUF9OVU1CRVJfU0hJRlQJCQk0Ci0KLQotI2RlZmluZSBVU0JfUEhZX1BBUkFfU0laRQkJNQotCi0KLS8qICAqLwotLyoJFEVFUFJPTSBkZWZhdWx0IHZhbHVlIGRlZmluaXRpb25zICovCi0vKiAgKi8KLS8qICBVc2UgMHhBQkNEIGluc3RlYWQgb2YgMHg4MTkyIGZvciBkZWJ1ZyAqLwotI2RlZmluZSBFRVBST01fREVGX0lEXzAJCQkweENECS8qICBCeXRlIDB4MDAgKi8KLSNkZWZpbmUgRUVQUk9NX0RFRl9JRF8xCQkJMHhBQgkvKiAgQnl0ZSAweDAxICovCi0KLSNkZWZpbmUgRUVQUk9NX0RFRl9SVEtfUlNWX0EzCQkweDc0CS8qICBCeXRlIDB4MDMgKi8KLSNkZWZpbmUgRUVQUk9NX0RFRl9SVEtfUlNWX0E0CQkweDZECS8qICBCeXRlIDB4MDQgKi8KLSNkZWZpbmUgRUVQUk9NX0RFRl9SVEtfUlNWX0E4CQkweEZGCS8qICBCeXRlIDB4MDggKi8KLQotI2RlZmluZSBFRVBST01fREVGX1ZJRF8wCQkweDBBCS8qICBCeXRlIDB4MEEgKi8KLSNkZWZpbmUgRUVQUk9NX0RFRl9WSURfMQkJMHgwQgotCi0jZGVmaW5lIEVFUFJPTV9ERUZfUElEXzAJCTB4OTIJLyogIEJ5dGUgMHgwQyAqLwotI2RlZmluZSBFRVBST01fREVGX1BJRF8xCQkweDgxCi0KLQotI2RlZmluZSBFRVBST01fVEVTVF9ERUZfVVNCX09QVAkJMHg4MAkvKiAgQnl0ZSAweDBFICovCi0jZGVmaW5lIEVFUFJPTV9OT1JNQUxfREVGX1VTQl9PUFQJMHgwMAkvKiAgQnl0ZSAweDBFICovCi0KLSNkZWZpbmUgRUVQUk9NX0RFRl9DSElSUEsJCTB4MTUJLyogIEJ5dGUgMHgwRiAqLwotCi0jZGVmaW5lIEVFUFJPTV9ERUZfVVNCX1BIWV8wCQkweDg1CS8qICBCeXRlIDB4MTAgKi8KLSNkZWZpbmUgRUVQUk9NX0RFRl9VU0JfUEhZXzEJCTB4NjIJLyogIEJ5dGUgMHgxMSAqLwotI2RlZmluZSBFRVBST01fREVGX1VTQl9QSFlfMgkJMHg5RQkvKiAgQnl0ZSAweDEyICovCi0jZGVmaW5lIEVFUFJPTV9ERUZfVVNCX1BIWV8zCQkweDA2CS8qICBCeXRlIDB4MTMgKi8KLQotI2RlZmluZSBFRVBST01fREVGX1RTU0lfQQkJMHgwOQkvKiAgQnl0ZSAweDc4ICovCi0jZGVmaW5lIEVFUFJPTV9ERUZfVFNTSV9CCQkweDA5CS8qICBCeXRlIDB4NzkgKi8KLQotCi0jZGVmaW5lIEVFUFJPTV9ERUZfVEhFUk1BTF9NRVRFUgkweDEyCS8qICBCeXRlIDB4N0EgKi8KLQotCS8qICBDaGVjayBpZiBwb3dlciBzYWZldHkgc3BlYyBpcyBuZWVkICovCi0jZGVmaW5lIFJGX09QVElPTjEJCQkweDc5Ci0jZGVmaW5lIFJGX09QVElPTjIJCQkweDdBCi0jZGVmaW5lIFJGX09QVElPTjMJCQkweDdCCi0jZGVmaW5lIFJGX09QVElPTjQJCQkweDdDCi0KLQotI2RlZmluZQlFRVBST01fVVNCX1NOCQkJQklUKDApCi0jZGVmaW5lCUVFUFJPTV9VU0JfUkVNT1RFX1dBS0VVUAlCSVQoMSkKLSNkZWZpbmUJRUVQUk9NX1VTQl9ERVZJQ0VfUFdSCQlCSVQoMikKLSNkZWZpbmUJRUVQUk9NX0VQX05VTUJFUgkJKEJJVCgzKXxCSVQoNCkpCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1IZXJlIHRoZSByZWdpc3RlciBkZWZpbmVzIGFyZSBmb3IgOTJDLiBXaGVuIHRoZSBkZWZpbmUgaXMgYXMgc2FtZSB3aXRoIDkyQywKLXdlIHdpbGwgdXNlIHRoZSA5MkMncyBkZWZpbmUgZm9yIHRoZSBjb25zaXN0ZW5jeQotU28gdGhlIGZvbGxvd2luZyBkZWZpbmVzIGZvciA5MkMgaXMgbm90IGVudGlyZSEhISEhIQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyoKLUJhc2VkIG9uIERhdGFzaGVldCBWMzMtLS0wOTA0MDEKLVJlZ2lzdGVyIFN1bW1hcnkKLUN1cnJlbnQgSU9SRUcgTUFQCi0weDAwMDBoIH4gMHgwMEZGaCAgIFN5c3RlbSBDb25maWd1cmF0aW9uICgyNTYgQnl0ZXMpCi0weDAxMDBoIH4gMHgwMUZGaCAgIE1BQ1RPUCBHZW5lcmFsIENvbmZpZ3VyYXRpb24gKDI1NiBCeXRlcykKLTB4MDIwMGggfiAweDAyN0ZoICAgVFhETUEgQ29uZmlndXJhdGlvbiAoMTI4IEJ5dGVzKQotMHgwMjgwaCB+IDB4MDJGRmggICBSWERNQSBDb25maWd1cmF0aW9uICgxMjggQnl0ZXMpCi0weDAzMDBoIH4gMHgwM0ZGaCAgIFBDSUUgRU1BQyBSZXNlcnZlZCBSZWdpb24gKDI1NiBCeXRlcykKLTB4MDQwMGggfiAweDA0RkZoICAgUHJvdG9jb2wgQ29uZmlndXJhdGlvbiAoMjU2IEJ5dGVzKQotMHgwNTAwaCB+IDB4MDVGRmggICBFRENBIENvbmZpZ3VyYXRpb24gKDI1NiBCeXRlcykKLTB4MDYwMGggfiAweDA3RkZoICAgV01BQyBDb25maWd1cmF0aW9uICg1MTIgQnl0ZXMpCi0weDIwMDBoIH4gMHgzRkZGaCAgIDgwNTEgRlcgRG93bmxvYWQgUmVnaW9uICg4MTk2IEJ5dGVzKQotKi8KLQotLyogICovCi0vKiA4MTkyQyAoUkNSKSBSZWNlaXZlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIJKE9mZnNldCAweDYwOCwgMzIgYml0cykgKi8KLS8qICAqLwotI2RlZmluZQlSQ1JfQVBQRkNTCQkJQklUKDMxKSAvKiBXTUFDIGFwcGVuZCBGQ1MgYWZ0ZXIgcGF5bG9hZCovCi0jZGVmaW5lCVJDUl9BUFBfTUlDCQkJQklUKDMwKQotI2RlZmluZQlSQ1JfQVBQX1BIWVNUUwkJCUJJVCgyOCkKLSNkZWZpbmUJUkNSX0FQUF9JQ1YJCQlCSVQoMjkpCi0jZGVmaW5lCVJDUl9BUFBfUEhZU1RfUlhGRgkJQklUKDI4KQotI2RlZmluZQlSQ1JfQVBQX0JBX1NTTgkJCUJJVCgyNykgLyogQWNjZXB0IEJBIFNTTiAqLwotI2RlZmluZQlSQ1JfRU5NQklECQkJQklUKDI0KSAvKiBFbmFibGUgTXVsdGlwbGUgQnNzSWQuICovCi0jZGVmaW5lCVJDUl9MU0lHRU4JCQlCSVQoMjMpCi0jZGVmaW5lCVJDUl9NRkJFTgkJCUJJVCgyMikKLSNkZWZpbmUJUkNSX0hUQ19MT0NfQ1RSTAkJQklUKDE0KSAvKiBNRkM8LS1IVEM9MSBNRkMtLT5IVEM9MCAqLwotI2RlZmluZQlSQ1JfQU1GCQkJCUJJVCgxMykgLyogQWNjZXB0IG1hbmFnZW1lbnQgdHlwZSBmcmFtZSAqLwotI2RlZmluZQlSQ1JfQUNGCQkJCUJJVCgxMikgLyogQWNjZXB0IGNvbnRyb2wgdHlwZSBmcmFtZSAqLwotI2RlZmluZQlSQ1JfQURGCQkJCUJJVCgxMSkgLyogQWNjZXB0IGRhdGEgdHlwZSBmcmFtZSAqLwotI2RlZmluZQlSQ1JfQUlDVgkJCUJJVCg5KSAgLyogQWNjZXB0IElDViBlcnJvciBwYWNrZXQgKi8KLSNkZWZpbmUJUkNSX0FDUkMzMgkJCUJJVCg4KSAgLyogQWNjZXB0IENSQzMyIGVycm9yIHBhY2tldCAqLwotI2RlZmluZQlSQ1JfQ0JTU0lEX0JDTgkJCUJJVCg3KSAgLyogQWNjZXB0IEJTU0lEIG1hdGNoIHBhY2tldAotCQkJCQkJIChSeCBiZWFjb24sIHByb2JlIHJzcCkgKi8KLSNkZWZpbmUJUkNSX0NCU1NJRF9EQVRBCQkJQklUKDYpICAvKiBBY2NlcHQgQlNTSUQgbWF0Y2ggcGFja2V0Ci0JCQkJCQkgKERhdGEpICovCi0jZGVmaW5lCVJDUl9DQlNTSUQJCQlSQ1JfQ0JTU0lEX0RBVEEJLyogQWNjZXB0IEJTU0lEIG1hdGNoCi0JCQkJCQkJICAgcGFja2V0ICovCi0jZGVmaW5lCVJDUl9BUFdSTUdUCQkJQklUKDUpICAvKiBBY2NlcHQgcG93ZXIgbWFuYWdlbWVudAotCQkJCQkJIHBhY2tldCAqLwotI2RlZmluZQlSQ1JfQUREMwkJCUJJVCg0KSAgLyogQWNjZXB0IGFkZHJlc3MgMyBtYXRjaAotCQkJCQkJIHBhY2tldCAqLwotI2RlZmluZQlSQ1JfQUIJCQkJQklUKDMpICAvKiBBY2NlcHQgYnJvYWRjYXN0IHBhY2tldCAqLwotI2RlZmluZQlSQ1JfQU0JCQkJQklUKDIpICAvKiBBY2NlcHQgbXVsdGljYXN0IHBhY2tldCAqLwotI2RlZmluZQlSQ1JfQVBNCQkJCUJJVCgxKSAgLyogQWNjZXB0IHBoeXNpY2FsIG1hdGNoIHBhY2tldCAqLwotI2RlZmluZQlSQ1JfQUFQCQkJCUJJVCgwKSAgLyogQWNjZXB0IGFsbCB1bmljYXN0IHBhY2tldCAqLwotI2RlZmluZQlSQ1JfTVhETUFfT0ZGU0VUCQk4Ci0jZGVmaW5lCVJDUl9GSUZPX09GRlNFVAkJCTEzCi0KLQotCi0vKiAgKi8KLS8qIDgxOTJjIFVTQiBzcGVjaWZpYyBSZWdzaXRlciBPZmZzZXQgYW5kIENvbnRlbnQgZGVmaW5pdGlvbiwgKi8KLS8qIDIwMDkuMDguMTgsIGFkZGVkIGJ5IHZpdmkuIGZvciBtZXJnZSA5MmMgYW5kIDkyQyBpbnRvIG9uZSBkcml2ZXIgKi8KLS8qICAqLwotLyogZGVmaW5lIEFQU19GU01DTwkJCTB4MDAwNCAgc2FtZSB3aXRoIDkyQ2UgKi8KLSNkZWZpbmUgUlNWX0NUUkwJCQkweDAwMUMKLSNkZWZpbmUgUkRfQ1RSTAkJCQkweDA1MjQKLQotLyogICovCi0vKiAgKi8KLS8qCTB4RkUwMGggfiAweEZFNTVoCVVTQiBDb25maWd1cmF0aW9uICovCi0vKiAgKi8KLS8qICAqLwotI2RlZmluZSBSRUdfVVNCX0lORk8JCQkweEZFMTcKLSNkZWZpbmUgUkVHX1VTQl9TUEVDSUFMX09QVElPTgkJMHhGRTU1Ci0jZGVmaW5lIFJFR19VU0JfRE1BX0FHR19UTwkJMHhGRTVCCi0jZGVmaW5lIFJFR19VU0JfQUdHX1RPCQkJMHhGRTVDCi0jZGVmaW5lIFJFR19VU0JfQUdHX1RICQkJMHhGRTVECi0KLSNkZWZpbmUgUkVHX1VTQl9WSUQJCQkweEZFNjAKLSNkZWZpbmUgUkVHX1VTQl9QSUQJCQkweEZFNjIKLSNkZWZpbmUgUkVHX1VTQl9PUFRJT05BTAkJMHhGRTY0Ci0jZGVmaW5lIFJFR19VU0JfQ0hJUlBfSwkJCTB4RkU2NQotI2RlZmluZSBSRUdfVVNCX1BIWQkJCTB4RkU2NgotI2RlZmluZSBSRUdfVVNCX01BQ19BRERSCQkweEZFNzAKLQotI2RlZmluZSBSRUdfVVNCX0hSUFdNCQkJMHhGRTU4Ci0jZGVmaW5lIFJFR19VU0JfSENQV00JCQkweEZFNTcKLQotI2RlZmluZQlJbnZhbGlkQkJSRlZhbHVlCQkweDEyMzQ1Njc4Ci0KLS8qICAqLwotLyogICAgICAgIDgxOTJDIFJlZ3NpdGVyIEJpdCBhbmQgQ29udGVudCBkZWZpbml0aW9uICovCi0vKiAgKi8KLS8qICAqLwotLyogICovCi0vKgkweDAwMDBoIH4gMHgwMEZGaAlTeXN0ZW0gQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLQotLyogMiBTUFMwX0NUUkwgKi8KLSNkZWZpbmUgU1cxOF9GUFdNCQkJQklUKDMpCi0KLQotLyogMiBTWVNfSVNPX0NUUkwgKi8KLSNkZWZpbmUgSVNPX01EMlBQCQkJQklUKDApCi0jZGVmaW5lIElTT19VQTJVU0IJCQlCSVQoMSkKLSNkZWZpbmUgSVNPX1VEMkNPUkUJCQlCSVQoMikKLSNkZWZpbmUgSVNPX1BBMlBDSUUJCQlCSVQoMykKLSNkZWZpbmUgSVNPX1BEMkNPUkUJCQlCSVQoNCkKLSNkZWZpbmUgSVNPX0lQMk1BQwkJCUJJVCg1KQotI2RlZmluZSBJU09fRElPUAkJCUJJVCg2KQotI2RlZmluZSBJU09fRElPRQkJCUJJVCg3KQotI2RlZmluZSBJU09fRUIyQ09SRQkJCUJJVCg4KQotI2RlZmluZSBJU09fRElPUgkJCUJJVCg5KQotCi0jZGVmaW5lIFBXQ19FVjI1VgkJCUJJVCgxNCkKLSNkZWZpbmUgUFdDX0VWMTJWCQkJQklUKDE1KQotCi0KLS8qIDIgU1lTX0ZVTkNfRU4gKi8KLSNkZWZpbmUgRkVOX0JCUlNUQgkJCUJJVCgwKQotI2RlZmluZSBGRU5fQkJfR0xCX1JTVG4JCQlCSVQoMSkKLSNkZWZpbmUgRkVOX1VTQkEJCQlCSVQoMikKLSNkZWZpbmUgRkVOX1VQTEwJCQlCSVQoMykKLSNkZWZpbmUgRkVOX1VTQkQJCQlCSVQoNCkKLSNkZWZpbmUgRkVOX0RJT19QQ0lFCQkJQklUKDUpCi0jZGVmaW5lIEZFTl9QQ0lFQQkJCUJJVCg2KQotI2RlZmluZSBGRU5fUFBMTAkJCUJJVCg3KQotI2RlZmluZSBGRU5fUENJRUQJCQlCSVQoOCkKLSNkZWZpbmUgRkVOX0RJT0UJCQlCSVQoOSkKLSNkZWZpbmUgRkVOX0NQVUVOCQkJQklUKDEwKQotI2RlZmluZSBGRU5fRENPUkUJCQlCSVQoMTEpCi0jZGVmaW5lIEZFTl9FTERSCQkJQklUKDEyKQotI2RlZmluZSBGRU5fRElPX1JGCQkJQklUKDEzKQotI2RlZmluZSBGRU5fSFdQRE4JCQlCSVQoMTQpCi0jZGVmaW5lIEZFTl9NUkVHRU4JCQlCSVQoMTUpCi0KLS8qIDIgQVBTX0ZTTUNPICovCi0jZGVmaW5lIFBGTV9MREFMTAkJCUJJVCgwKQotI2RlZmluZSBQRk1fQUxETgkJCUJJVCgxKQotI2RlZmluZSBQRk1fTERLUAkJCUJJVCgyKQotI2RlZmluZSBQRk1fV09XTAkJCUJJVCgzKQotI2RlZmluZSBFblBETgkJCQlCSVQoNCkKLSNkZWZpbmUgUEROX1BMCQkJCUJJVCg1KQotI2RlZmluZSBBUEZNX09OTUFDCQkJQklUKDgpCi0jZGVmaW5lIEFQRk1fT0ZGCQkJQklUKDkpCi0jZGVmaW5lIEFQRk1fUlNNCQkJQklUKDEwKQotI2RlZmluZSBBRlNNX0hTVVMJCQlCSVQoMTEpCi0jZGVmaW5lIEFGU01fUENJRQkJCUJJVCgxMikKLSNkZWZpbmUgQVBETV9NQUMJCQlCSVQoMTMpCi0jZGVmaW5lIEFQRE1fSE9TVAkJCUJJVCgxNCkKLSNkZWZpbmUgQVBETV9IUEROCQkJQklUKDE1KQotI2RlZmluZSBSRFlfTUFDT04JCQlCSVQoMTYpCi0jZGVmaW5lIFNVU19IT1NUCQkJQklUKDE3KQotI2RlZmluZSBST1BfQUxECQkJCUJJVCgyMCkKLSNkZWZpbmUgUk9QX1BXUgkJCQlCSVQoMjEpCi0jZGVmaW5lIFJPUF9TUFMJCQkJQklUKDIyKQotI2RlZmluZSBTT1BfTVJTVAkJCUJJVCgyNSkKLSNkZWZpbmUgU09QX0ZVU0UJCQlCSVQoMjYpCi0jZGVmaW5lIFNPUF9BQkcJCQkJQklUKDI3KQotI2RlZmluZSBTT1BfQU1CCQkJCUJJVCgyOCkKLSNkZWZpbmUgU09QX1JDSwkJCQlCSVQoMjkpCi0jZGVmaW5lIFNPUF9BOE0JCQkJQklUKDMwKQotI2RlZmluZSBYT1BfQlRDSwkJCUJJVCgzMSkKLQotLyogMiBTWVNfQ0xLUiAqLwotI2RlZmluZSBBTkFEMTZWX0VOCQkJQklUKDApCi0jZGVmaW5lIEFOQThNCQkJCUJJVCgxKQotI2RlZmluZSBNQUNTTFAJCQkJQklUKDQpCi0jZGVmaW5lIExPQURFUl9DTEtfRU4JCQlCSVQoNSkKLSNkZWZpbmUgXzgwTV9TU0NfRElTCQkJQklUKDcpCi0jZGVmaW5lIF84ME1fU1NDX0VOX0hPCQkJQklUKDgpCi0jZGVmaW5lIFBIWV9TU0NfUlNUQgkJCUJJVCg5KQotI2RlZmluZSBTRUNfQ0xLX0VOCQkJQklUKDEwKQotI2RlZmluZSBNQUNfQ0xLX0VOCQkJQklUKDExKQotI2RlZmluZSBTWVNfQ0xLX0VOCQkJQklUKDEyKQotI2RlZmluZSBSSU5HX0NMS19FTgkJCUJJVCgxMykKLQotCi0vKiAyIDkzNDZDUiAqLwotCi0KLSNkZWZpbmUJCUVFRE8JCQlCSVQoMCkKLSNkZWZpbmUJCUVFREkJCQlCSVQoMSkKLSNkZWZpbmUJCUVFU0sJCQlCSVQoMikKLSNkZWZpbmUJCUVFQ1MJCQlCSVQoMykKLS8qIGRlZmluZQlFRVJQUk9NU0VMCQlCSVQoNCkgKi8KLS8qIGRlZmluZQlFRVBST01fRU4JCUJJVCg1KSAqLwotI2RlZmluZQkJQk9PVF9GUk9NX0VFUFJPTQlCSVQoNCkKLSNkZWZpbmUJCUVFUFJPTV9FTgkJQklUKDUpCi0jZGVmaW5lCQlFRU0wCQkJQklUKDYpCi0jZGVmaW5lCQlFRU0xCQkJQklUKDcpCi0KLQotLyogMiBBRkVfTUlTQyAqLwotI2RlZmluZSBBRkVfQkdFTgkJCUJJVCgwKQotI2RlZmluZSBBRkVfTUJFTgkJCUJJVCgxKQotI2RlZmluZSBNQUNfSURfRU4JCQlCSVQoNykKLQotCi0vKiAyIFNQUzBfQ1RSTCAqLwotCi0KLS8qIDIgU1BTX09DUF9DRkcgKi8KLQotCi0vKiAyIFJTVl9DVFJMICovCi0jZGVmaW5lIFdMT0NLX0FMTAkJCUJJVCgwKQotI2RlZmluZSBXTE9DS18wMAkJCUJJVCgxKQotI2RlZmluZSBXTE9DS18wNAkJCUJJVCgyKQotI2RlZmluZSBXTE9DS18wOAkJCUJJVCgzKQotI2RlZmluZSBXTE9DS180MAkJCUJJVCg0KQotI2RlZmluZSBSX0RJU19QUlNUXzAJCQlCSVQoNSkKLSNkZWZpbmUgUl9ESVNfUFJTVF8xCQkJQklUKDYpCi0jZGVmaW5lIExPQ0tfQUxMX0VOCQkJQklUKDcpCi0KLS8qIDIgUkZfQ1RSTCAqLwotI2RlZmluZSBSRl9FTgkJCQlCSVQoMCkKLSNkZWZpbmUgUkZfUlNUQgkJCQlCSVQoMSkKLSNkZWZpbmUgUkZfU0RNUlNUQgkJCUJJVCgyKQotCi0KLQotLyogMiBMRE9BMTVfQ1RSTCAqLwotI2RlZmluZSBMREExNV9FTgkJCUJJVCgwKQotI2RlZmluZSBMREExNV9TVEJZCQkJQklUKDEpCi0jZGVmaW5lIExEQTE1X09CVUYJCQlCSVQoMikKLSNkZWZpbmUgTERBMTVfUkVHX1ZPUwkJCUJJVCgzKQotI2RlZmluZSBfTERBMTVfVk9BREooeCkJCQkoKCh4KSAmIDB4NykgPDwgNCkKLQotCi0KLS8qIDIgTERPVjEyRF9DVFJMICovCi0jZGVmaW5lIExEVjEyX0VOCQkJQklUKDApCi0jZGVmaW5lIExEVjEyX1NEQlkJCQlCSVQoMSkKLSNkZWZpbmUgTFBMRE9fSFNNCQkJQklUKDIpCi0jZGVmaW5lIExQTERPX0xTTV9ESVMJCQlCSVQoMykKLSNkZWZpbmUgX0xEVjEyX1ZBREooeCkJCQkoKCh4KSAmIDB4RikgPDwgNCkKLQotCi0vKiAyIEFGRV9YVEFMX0NUUkwgKi8KLSNkZWZpbmUgWFRBTF9FTgkJCQlCSVQoMCkKLSNkZWZpbmUgWFRBTF9CU0VMCQkJQklUKDEpCi0jZGVmaW5lIF9YVEFMX0JPU0MoeCkJCQkoKCh4KSAmIDB4MykgPDwgMikKLSNkZWZpbmUgX1hUQUxfQ0FESih4KQkJCSgoKHgpICYgMHhGKSA8PCA0KQotI2RlZmluZSBYVEFMX0dBVEVfVVNCCQkJQklUKDgpCi0jZGVmaW5lIF9YVEFMX1VTQl9EUlYoeCkJCSgoKHgpICYgMHgzKSA8PCA5KQotI2RlZmluZSBYVEFMX0dBVEVfQUZFCQkJQklUKDExKQotI2RlZmluZSBfWFRBTF9BRkVfRFJWKHgpCQkoKCh4KSAmIDB4MykgPDwgMTIpCi0jZGVmaW5lIFhUQUxfUkZfR0FURQkJCUJJVCgxNCkKLSNkZWZpbmUgX1hUQUxfUkZfRFJWKHgpCQkJKCgoeCkgJiAweDMpIDw8IDE1KQotI2RlZmluZSBYVEFMX0dBVEVfRElHCQkJQklUKDE3KQotI2RlZmluZSBfWFRBTF9ESUdfRFJWKHgpCQkoKCh4KSAmIDB4MykgPDwgMTgpCi0jZGVmaW5lIFhUQUxfQlRfR0FURQkJCUJJVCgyMCkKLSNkZWZpbmUgX1hUQUxfQlRfRFJWKHgpCQkJKCgoeCkgJiAweDMpIDw8IDIxKQotI2RlZmluZSBfWFRBTF9HUElPKHgpCQkJKCgoeCkgJiAweDcpIDw8IDIzKQotCi0KLSNkZWZpbmUgQ0tETFlfQUZFCQkJQklUKDI2KQotI2RlZmluZSBDS0RMWV9VU0IJCQlCSVQoMjcpCi0jZGVmaW5lIENLRExZX0RJRwkJCUJJVCgyOCkKLSNkZWZpbmUgQ0tETFlfQlQJCQlCSVQoMjkpCi0KLQotLyogMiBBRkVfUExMX0NUUkwgKi8KLSNkZWZpbmUgQVBMTF9FTgkJCQlCSVQoMCkKLSNkZWZpbmUgQVBMTF8zMjBfRU4JCQlCSVQoMSkKLSNkZWZpbmUgQVBMTF9GUkVGX1NFTAkJCUJJVCgyKQotI2RlZmluZSBBUExMX0VER0VfU0VMCQkJQklUKDMpCi0jZGVmaW5lIEFQTExfV0RPR0IJCQlCSVQoNCkKLSNkZWZpbmUgQVBMTF9MUEZFTgkJCUJJVCg1KQotCi0jZGVmaW5lIEFQTExfUkVGX0NMS18xM01IWgkJMHgxCi0jZGVmaW5lIEFQTExfUkVGX0NMS18xOV8yTUhaCQkweDIKLSNkZWZpbmUgQVBMTF9SRUZfQ0xLXzIwTUhaCQkweDMKLSNkZWZpbmUgQVBMTF9SRUZfQ0xLXzI1TUhaCQkweDQKLSNkZWZpbmUgQVBMTF9SRUZfQ0xLXzI2TUhaCQkweDUKLSNkZWZpbmUgQVBMTF9SRUZfQ0xLXzM4XzRNSFoJCTB4NgotI2RlZmluZSBBUExMX1JFRl9DTEtfNDBNSFoJCTB4NwotCi0jZGVmaW5lIEFQTExfMzIwRU4JCQlCSVQoMTQpCi0jZGVmaW5lIEFQTExfODBFTgkJCUJJVCgxNSkKLSNkZWZpbmUgQVBMTF8xTUVOCQkJQklUKDI0KQotCi0KLS8qIDIgRUZVU0VfQ1RSTCAqLwotI2RlZmluZSBBTERfRU4JCQkJQklUKDE4KQotI2RlZmluZSBFRl9QRAkJCQlCSVQoMTkpCi0jZGVmaW5lIEVGX0ZMQUcJCQkJQklUKDMxKQotCi0vKiAyIEVGVVNFX1RFU1QgKEZvciBSVEw4NzIzIHBhcnRpYWxseSkgKi8KLSNkZWZpbmUgRUZfVFJQVAkJCQlCSVQoNykKLQkvKiAgMDA6IFdpZmkgRWZ1c2UsIDAxOiBCVCBFZnVzZTAsIDEwOiBCVCBFZnVzZTEsIDExOiBCVCBFZnVzZTIgKi8KLSNkZWZpbmUgRUZfQ0VMTF9TRUwJCQkoQklUKDgpfEJJVCg5KSkKLSNkZWZpbmUgTERPRTI1X0VOCQkJQklUKDMxKQotI2RlZmluZSBFRlVTRV9TRUwoeCkJCQkoKCh4KSAmIDB4MykgPDwgOCkKLSNkZWZpbmUgRUZVU0VfU0VMX01BU0sJCQkweDMwMAotI2RlZmluZSBFRlVTRV9XSUZJX1NFTF8wCQkweDAKLSNkZWZpbmUgRUZVU0VfQlRfU0VMXzAJCQkweDEKLSNkZWZpbmUgRUZVU0VfQlRfU0VMXzEJCQkweDIKLSNkZWZpbmUgRUZVU0VfQlRfU0VMXzIJCQkweDMKLQotI2RlZmluZSBFRlVTRV9BQ0NFU1NfT04JCQkweDY5CS8qICBGb3IgUlRMODcyMyBvbmx5LiAqLwotI2RlZmluZSBFRlVTRV9BQ0NFU1NfT0ZGCQkweDAwCS8qICBGb3IgUlRMODcyMyBvbmx5LiAqLwotCi0vKiAyIFBXUl9EQVRBICovCi0KLS8qIDIgQ0FMX1RJTUVSICovCi0KLS8qIDIgQUNMS19NT04gKi8KLSNkZWZpbmUgUlNNX0VOCQkJCUJJVCgwKQotI2RlZmluZSBUaW1lcl9FTgkJCUJJVCg0KQotCi0KLS8qIDIgR1BJT19NVVhDRkcgKi8KLSNkZWZpbmUgVFJTVzBFTgkJCQlCSVQoMikKLSNkZWZpbmUgVFJTVzFFTgkJCQlCSVQoMykKLSNkZWZpbmUgRVJPTV9FTgkJCQlCSVQoNCkKLSNkZWZpbmUgRW5CVAkJCQlCSVQoNSkKLSNkZWZpbmUgRW5VYXJ0CQkJCUJJVCg4KQotI2RlZmluZSBVYXJ0XzkxMAkJCUJJVCg5KQotI2RlZmluZSBFblBNQUMJCQkJQklUKDEwKQotI2RlZmluZSBTSUNfU1dSU1QJCQlCSVQoMTEpCi0jZGVmaW5lIEVuU0lDCQkJCUJJVCgxMikKLSNkZWZpbmUgU0lDXzIzCQkJCUJJVCgxMykKLSNkZWZpbmUgRW5IRFAJCQkJQklUKDE0KQotI2RlZmluZSBTSUNfTEJLCQkJCUJJVCgxNSkKLQotLyogMiBHUElPX1BJTl9DVFJMICovCi0KLS8qICBHUElPIEJJVCAqLwotI2RlZmluZSBIQUxfODE5MkNfSFdfR1BJT19XUFNfQklUCUJJVCgyKQotCi0vKiAyIEdQSU9fSU5UTSAqLwotCi0vKiAyIExFRENGRyAqLwotI2RlZmluZSBMRUQwUEwJCQkJQklUKDQpCi0jZGVmaW5lIExFRDBESVMJCQkJQklUKDcpCi0jZGVmaW5lIExFRDFESVMJCQkJQklUKDE1KQotI2RlZmluZSBMRUQxUEwJCQkJQklUKDEyKQotCi0jZGVmaW5lICBTRUNDQU1fQ0xSCQkJQklUKDMwKQotCi0KLS8qIDIgRlNJTVIgKi8KLQotLyogMiBGU0lTUiAqLwotCi0KLS8qIDIgODA1MUZXREwgKi8KLS8qIDIgTUNVRldETCAqLwotI2RlZmluZSBNQ1VGV0RMX0VOCQkJQklUKDApCi0jZGVmaW5lIE1DVUZXRExfUkRZCQkJQklUKDEpCi0jZGVmaW5lIEZXRExfQ2hrU3VtX3JwdAkJCUJJVCgyKQotI2RlZmluZSBNQUNJTklfUkRZCQkJQklUKDMpCi0jZGVmaW5lIEJCSU5JX1JEWQkJCUJJVCg0KQotI2RlZmluZSBSRklOSV9SRFkJCQlCSVQoNSkKLSNkZWZpbmUgV0lOVElOSV9SRFkJCQlCSVQoNikKLSNkZWZpbmUgQ1BSU1QJCQkJQklUKDIzKQotCi0vKiAyUkVHX0hQT05fRlNNICovCi0jZGVmaW5lIEJPTkQ5MkNFXzFUMlJfQ0ZHCQlCSVQoMjIpCi0KLQotLyogMiBSRUdfU1lTX0NGRyAqLwotI2RlZmluZSBYQ0xLX1ZMRAkJCUJJVCgwKQotI2RlZmluZSBBQ0xLX1ZMRAkJCUJJVCgxKQotI2RlZmluZSBVQ0xLX1ZMRAkJCUJJVCgyKQotI2RlZmluZSBQQ0xLX1ZMRAkJCUJJVCgzKQotI2RlZmluZSBQQ0lSU1RCCQkJCUJJVCg0KQotI2RlZmluZSBWMTVfVkxECQkJCUJJVCg1KQotI2RlZmluZSBUUlBfQjE1Vl9FTgkJCUJJVCg3KQotI2RlZmluZSBTSUNfSURMRQkJCUJJVCg4KQotI2RlZmluZSBCRF9NQUMyCQkJCUJJVCg5KQotI2RlZmluZSBCRF9NQUMxCQkJCUJJVCgxMCkKLSNkZWZpbmUgSUNfTUFDUEhZX01PREUJCQlCSVQoMTEpCi0jZGVmaW5lIENISVBfVkVSCQkJKEJJVCgxMil8QklUKDEzKXxCSVQoMTQpfEJJVCgxNSkpCi0jZGVmaW5lIEJUX0ZVTkMJCQkJQklUKDE2KQotI2RlZmluZSBWRU5ET1JfSUQJCQlCSVQoMTkpCi0jZGVmaW5lIFBBRF9IV1BEX0lETgkJCUJJVCgyMikKLSNkZWZpbmUgVFJQX1ZBVVhfRU4JCQlCSVQoMjMpCi0jZGVmaW5lIFRSUF9CVF9FTgkJCUJJVCgyNCkKLSNkZWZpbmUgQkRfUEtHX1NFTAkJCUJJVCgyNSkKLSNkZWZpbmUgQkRfSENJX1NFTAkJCUJJVCgyNikKLSNkZWZpbmUgVFlQRV9JRAkJCQlCSVQoMjcpCi0KLSNkZWZpbmUgQ0hJUF9WRVJfUlRMX01BU0sJCTB4RjAwMAkvKiBCaXQgMTIgfiAxNSAqLwotI2RlZmluZSBDSElQX1ZFUl9SVExfU0hJRlQJCTEyCi0KLS8qIDJSRUdfR1BJT19PVVRTVFMgKEZvciBSVEw4NzIzIG9ubHkpICovCi0jZGVmaW5lCUVGU19IQ0lfU0VMCQkJKEJJVCgwKXxCSVQoMSkpCi0jZGVmaW5lCVBBRF9IQ0lfU0VMCQkJKEJJVCgyKXxCSVQoMykpCi0jZGVmaW5lCUhDSV9TRUwJCQkJKEJJVCg0KXxCSVQoNSkpCi0jZGVmaW5lCVBLR19TRUxfSENJCQkJQklUKDYpCi0jZGVmaW5lCUZFTl9HUFMJCQkJQklUKDcpCi0jZGVmaW5lCUZFTl9CVAkJCQlCSVQoOCkKLSNkZWZpbmUJRkVOX1dMCQkJCUJJVCg5KQotI2RlZmluZQlGRU5fUENJCQkJCUJJVCgxMCkKLSNkZWZpbmUJRkVOX1VTQgkJCQlCSVQoMTEpCi0jZGVmaW5lCUJUUkZfSFdQRE5fTgkJCUJJVCgxMikKLSNkZWZpbmUJV0xSRl9IV1BETl9OCQkJQklUKDEzKQotI2RlZmluZQlQRE5fQlRfTgkJCUJJVCgxNCkKLSNkZWZpbmUJUEROX0dQU19OCQkJQklUKDE1KQotI2RlZmluZQlCVF9DVExfSFdQRE4JCQlCSVQoMTYpCi0jZGVmaW5lCUdQU19DVExfSFdQRE4JCQlCSVQoMTcpCi0jZGVmaW5lCVBQSFlfU1VTQgkJCUJJVCgyMCkKLSNkZWZpbmUJVVBIWV9TVVNCCQkJQklUKDIxKQotI2RlZmluZQlQQ0lfU1VTRU4JCQlCSVQoMjIpCi0jZGVmaW5lCVVTQl9TVVNFTgkJCUJJVCgyMykKLSNkZWZpbmUJUkZfUkxfSUQJCQkoQklUKDMxKXxCSVQoMzApfEJJVCgyOSl8QklUKDI4KSkKLQotLyogICovCi0vKiAgKi8KLS8qCTB4MDEwMGggfiAweDAxRkZoCU1BQ1RPUCBHZW5lcmFsIENvbmZpZ3VyYXRpb24gKi8KLS8qICAqLwotLyogICovCi0KLQotLyogMiBGdW5jdGlvbiBFbmFibGUgUmVnaXN0ZXJzICovCi0vKiAyIENSICovCi0KLSNkZWZpbmUgUkVHX0xCTU9ERQkJCShSRUdfQ1IgKyAzKQotCi0KLSNkZWZpbmUgSENJX1RYRE1BX0VOCQkJQklUKDApCi0jZGVmaW5lIEhDSV9SWERNQV9FTgkJCUJJVCgxKQotI2RlZmluZSBUWERNQV9FTgkJCUJJVCgyKQotI2RlZmluZSBSWERNQV9FTgkJCUJJVCgzKQotI2RlZmluZSBQUk9UT0NPTF9FTgkJCUJJVCg0KQotI2RlZmluZSBTQ0hFRFVMRV9FTgkJCUJJVCg1KQotI2RlZmluZSBNQUNUWEVOCQkJCUJJVCg2KQotI2RlZmluZSBNQUNSWEVOCQkJCUJJVCg3KQotI2RlZmluZSBFTlNXQkNOCQkJCUJJVCg4KQotI2RlZmluZSBFTlNFQwkJCQlCSVQoOSkKLQotI2RlZmluZSBfTEJNT0RFKHgpCQkJKCgoeCkgJiAweEYpIDw8IDI0KQotI2RlZmluZSBNQVNLX0xCTU9ERQkJCTB4RjAwMDAwMAotI2RlZmluZSBMT09QQkFDS19OT1JNQUwJCQkweDAKLSNkZWZpbmUgTE9PUEJBQ0tfSU1NRURJQVRFTFkJCTB4QgotI2RlZmluZSBMT09QQkFDS19NQUNfREVMQVkJCTB4MwotI2RlZmluZSBMT09QQkFDS19QSFkJCQkweDEKLSNkZWZpbmUgTE9PUEJBQ0tfRE1BCQkJMHg3Ci0KLQotLyogMiBQQlAgLSBQYWdlIFNpemUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgR0VUX1JYX1BBR0VfU0laRSh2YWx1ZSkJCSgodmFsdWUpICYgMHhGKQotI2RlZmluZSBHRVRfVFhfUEFHRV9TSVpFKHZhbHVlKQkJKCgodmFsdWUpICYgMHhGMCkgPj4gNCkKLSNkZWZpbmUgX1BTUlhfTUFTSwkJCTB4RgotI2RlZmluZSBfUFNUWF9NQVNLCQkJMHhGMAotI2RlZmluZSBfUFNSWCh4KQkJCSh4KQotI2RlZmluZSBfUFNUWCh4KQkJCSgoeCkgPDwgNCkKLQotI2RlZmluZSBQQlBfNjQJCQkJMHgwCi0jZGVmaW5lIFBCUF8xMjgJCQkJMHgxCi0jZGVmaW5lIFBCUF8yNTYJCQkJMHgyCi0jZGVmaW5lIFBCUF81MTIJCQkJMHgzCi0jZGVmaW5lIFBCUF8xMDI0CQkJMHg0Ci0KLQotLyogMiBUWC9SWERNQSAqLwotI2RlZmluZSBSWERNQV9BUkJCV19FTgkJCUJJVCgwKQotI2RlZmluZSBSWFNIRlRfRU4JCQlCSVQoMSkKLSNkZWZpbmUgUlhETUFfQUdHX0VOCQkJQklUKDIpCi0jZGVmaW5lIFFTX1ZPX1FVRVVFCQkJQklUKDgpCi0jZGVmaW5lIFFTX1ZJX1FVRVVFCQkJQklUKDkpCi0jZGVmaW5lIFFTX0JFX1FVRVVFCQkJQklUKDEwKQotI2RlZmluZSBRU19CS19RVUVVRQkJCUJJVCgxMSkKLSNkZWZpbmUgUVNfTUFOQUdFUl9RVUVVRQkJQklUKDEyKQotI2RlZmluZSBRU19ISUdIX1FVRVVFCQkJQklUKDEzKQotCi0jZGVmaW5lIEhRU0VMX1ZPUQkJCUJJVCgwKQotI2RlZmluZSBIUVNFTF9WSVEJCQlCSVQoMSkKLSNkZWZpbmUgSFFTRUxfQkVRCQkJQklUKDIpCi0jZGVmaW5lIEhRU0VMX0JLUQkJCUJJVCgzKQotI2RlZmluZSBIUVNFTF9NR1RRCQkJQklUKDQpCi0jZGVmaW5lIEhRU0VMX0hJUQkJCUJJVCg1KQotCi0vKiAgRm9yIG5vcm1hbCBkcml2ZXIsIDB4MTBDICovCi0jZGVmaW5lIF9UWERNQV9ISVFfTUFQKHgpCQkoKCh4KSYweDMpIDw8IDE0KQotI2RlZmluZSBfVFhETUFfTUdRX01BUCh4KQkJKCgoeCkmMHgzKSA8PCAxMikKLSNkZWZpbmUgX1RYRE1BX0JLUV9NQVAoeCkJCSgoKHgpJjB4MykgPDwgMTApCi0jZGVmaW5lIF9UWERNQV9CRVFfTUFQKHgpCQkoKCh4KSYweDMpIDw8IDgpCi0jZGVmaW5lIF9UWERNQV9WSVFfTUFQKHgpCQkoKCh4KSYweDMpIDw8IDYpCi0jZGVmaW5lIF9UWERNQV9WT1FfTUFQKHgpCQkoKCh4KSYweDMpIDw8IDQpCi0KLSNkZWZpbmUgUVVFVUVfTE9XCQkJMQotI2RlZmluZSBRVUVVRV9OT1JNQUwJCQkyCi0jZGVmaW5lIFFVRVVFX0hJR0gJCQkzCi0KLQotCi0vKiAyIFRSWEZGX0JORFkgKi8KLQotCi0vKiAyIExMVF9JTklUICovCi0jZGVmaW5lIF9MTFRfTk9fQUNUSVZFCQkJMHgwCi0jZGVmaW5lIF9MTFRfV1JJVEVfQUNDRVNTCQkweDEKLSNkZWZpbmUgX0xMVF9SRUFEX0FDQ0VTUwkJMHgyCi0KLSNkZWZpbmUgX0xMVF9JTklUX0RBVEEoeCkJCSgoeCkgJiAweEZGKQotI2RlZmluZSBfTExUX0lOSVRfQUREUih4KQkJKCgoeCkgJiAweEZGKSA8PCA4KQotI2RlZmluZSBfTExUX09QKHgpCQkJKCgoeCkgJiAweDMpIDw8IDMwKQotI2RlZmluZSBfTExUX09QX1ZBTFVFKHgpCQkoKCh4KSA+PiAzMCkgJiAweDMpCi0KLQotLyogMiBCQl9BQ0NFU1NfQ1RSTCAqLwotI2RlZmluZSBCQl9XUklURV9SRUFEX01BU0sJCShCSVQoMzEpIHwgQklUKDMwKSkKLSNkZWZpbmUgQkJfV1JJVEVfRU4JCQlCSVQoMzApCi0jZGVmaW5lIEJCX1JFQURfRU4JCQlCSVQoMzEpCi0vKiBkZWZpbmUgQkJfQUREUl9NQVNLCQkJMHhGRkYgKi8KLS8qIGRlZmluZSBfQkJfQUREUih4KQkJCSgoeCkgJiBCQl9BRERSX01BU0spICovCi0KLS8qICAqLwotLyogICovCi0vKgkweDAyMDBoIH4gMHgwMjdGaAlUWERNQSBDb25maWd1cmF0aW9uICovCi0vKiAgKi8KLS8qICAqLwotLyogMiBSUVBOICovCi0jZGVmaW5lIF9IUFEoeCkJCQkJKCh4KSAmIDB4RkYpCi0jZGVmaW5lIF9MUFEoeCkJCQkJKCgoeCkgJiAweEZGKSA8PCA4KQotI2RlZmluZSBfUFVCUSh4KQkJCSgoKHgpICYgMHhGRikgPDwgMTYpCi0JLyogIE5PVEU6IGluIFJRUE5fTlBRIHJlZ2lzdGVyICovCi0jZGVmaW5lIF9OUFEoeCkJCQkJKCh4KSAmIDB4RkYpCi0KLQotI2RlZmluZSBIUFFfUFVCTElDX0RJUwkJCUJJVCgyNCkKLSNkZWZpbmUgTFBRX1BVQkxJQ19ESVMJCQlCSVQoMjUpCi0jZGVmaW5lIExEX1JRUE4JCQkJQklUKDMxKQotCi0KLS8qIDIgVERFQ1RSTCAqLwotI2RlZmluZSBCQ05fVkFMSUQJCQlCSVQoMTYpCi0jZGVmaW5lIEJDTl9IRUFEKHgpCQkJKCgoeCkgJiAweEZGKSA8PCA4KQotI2RlZmluZQlCQ05fSEVBRF9NQVNLCQkJMHhGRjAwCi0KLS8qIDIgVERFQ1RMICovCi0jZGVmaW5lIEJMS19ERVNDX05VTV9TSElGVAkJNAotI2RlZmluZSBCTEtfREVTQ19OVU1fTUFTSwkJMHhGCi0KLQotLyogMiBUWERNQV9PRkZTRVRfQ0hLICovCi0jZGVmaW5lIERST1BfREFUQV9FTgkJCUJJVCg5KQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwNDAwaCB+IDB4MDQ3RmgJUHJvdG9jb2wgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLS8qIDIgRldIV19UWFFfQ1RSTCAqLwotI2RlZmluZSBFTl9BTVBEVV9SVFlfTkVXCQlCSVQoNykKLQotLyogMiBJTklSVFNNQ1NfU0VMICovCi0jZGVmaW5lIF9JTklSVFNNQ1NfU0VMKHgpCQkoKHgpICYgMHgzRikKLQotCi0vKiAyIFNQRUMgU0lGUyAqLwotI2RlZmluZSBfU1BFQ19TSUZTX0NDSyh4KQkJKCh4KSAmIDB4RkYpCi0jZGVmaW5lIF9TUEVDX1NJRlNfT0ZETSh4KQkJKCgoeCkgJiAweEZGKSA8PCA4KQotCi0KLS8qIDIgUlJTUiAqLwotCi0jZGVmaW5lIFJBVEVfUkVHX0JJVE1BUF9BTEwJCTB4RkZGRkYKLQotI2RlZmluZSBfUlJTQ19CSVRNQVAoeCkJCQkoKHgpICYgMHhGRkZGRikKLQotI2RlZmluZSBfUlJTUl9SU0MoeCkJCQkoKCh4KSAmIDB4MykgPDwgMjEpCi0jZGVmaW5lIFJSU1JfUlNDX1JFU0VSVkVECQkweDAKLSNkZWZpbmUgUlJTUl9SU0NfVVBQRVJfU1VCQ0hBTk5FTAkweDEKLSNkZWZpbmUgUlJTUl9SU0NfTE9XRVJfU1VCQ0hBTk5FTAkweDIKLSNkZWZpbmUgUlJTUl9SU0NfRFVQTElDQVRFX01PREUJCTB4MwotCi0KLS8qIDIgQVJGUiAqLwotI2RlZmluZSBVU0VfU0hPUlRfRzEJCQlCSVQoMjApCi0KLS8qIDIgQUdHTEVOX0xNVF9MICovCi0jZGVmaW5lIF9BR0dMTVRfTUNTMCh4KQkJCSgoeCkgJiAweEYpCi0jZGVmaW5lIF9BR0dMTVRfTUNTMSh4KQkJCSgoKHgpICYgMHhGKSA8PCA0KQotI2RlZmluZSBfQUdHTE1UX01DUzIoeCkJCQkoKCh4KSAmIDB4RikgPDwgOCkKLSNkZWZpbmUgX0FHR0xNVF9NQ1MzKHgpCQkJKCgoeCkgJiAweEYpIDw8IDEyKQotI2RlZmluZSBfQUdHTE1UX01DUzQoeCkJCQkoKCh4KSAmIDB4RikgPDwgMTYpCi0jZGVmaW5lIF9BR0dMTVRfTUNTNSh4KQkJCSgoKHgpICYgMHhGKSA8PCAyMCkKLSNkZWZpbmUgX0FHR0xNVF9NQ1M2KHgpCQkJKCgoeCkgJiAweEYpIDw8IDI0KQotI2RlZmluZSBfQUdHTE1UX01DUzcoeCkJCQkoKCh4KSAmIDB4RikgPDwgMjgpCi0KLQotLyogMiBSTCAqLwotI2RlZmluZQlSRVRSWV9MSU1JVF9TSE9SVF9TSElGVAkJOAotI2RlZmluZQlSRVRSWV9MSU1JVF9MT05HX1NISUZUCQkwCi0KLQotLyogMiBEQVJGUkMgKi8KLSNkZWZpbmUgX0RBUkZfUkMxKHgpCQkJKCh4KSAmIDB4MUYpCi0jZGVmaW5lIF9EQVJGX1JDMih4KQkJCSgoKHgpICYgMHgxRikgPDwgOCkKLSNkZWZpbmUgX0RBUkZfUkMzKHgpCQkJKCgoeCkgJiAweDFGKSA8PCAxNikKLSNkZWZpbmUgX0RBUkZfUkM0KHgpCQkJKCgoeCkgJiAweDFGKSA8PCAyNCkKLS8qICBOT1RFOiBzaGlmdCBzdGFydGluZyBmcm9tIGFkZHJlc3MgKERBUkZSQyArIDQpICovCi0jZGVmaW5lIF9EQVJGX1JDNSh4KQkJCSgoeCkgJiAweDFGKQotI2RlZmluZSBfREFSRl9SQzYoeCkJCQkoKCh4KSAmIDB4MUYpIDw8IDgpCi0jZGVmaW5lIF9EQVJGX1JDNyh4KQkJCSgoKHgpICYgMHgxRikgPDwgMTYpCi0jZGVmaW5lIF9EQVJGX1JDOCh4KQkJCSgoKHgpICYgMHgxRikgPDwgMjQpCi0KLQotLyogMiBSQVJGUkMgKi8KLSNkZWZpbmUgX1JBUkZfUkMxKHgpCQkJKCh4KSAmIDB4MUYpCi0jZGVmaW5lIF9SQVJGX1JDMih4KQkJCSgoKHgpICYgMHgxRikgPDwgOCkKLSNkZWZpbmUgX1JBUkZfUkMzKHgpCQkJKCgoeCkgJiAweDFGKSA8PCAxNikKLSNkZWZpbmUgX1JBUkZfUkM0KHgpCQkJKCgoeCkgJiAweDFGKSA8PCAyNCkKLS8qICBOT1RFOiBzaGlmdCBzdGFydGluZyBmcm9tIGFkZHJlc3MgKFJBUkZSQyArIDQpICovCi0jZGVmaW5lIF9SQVJGX1JDNSh4KQkJCSgoeCkgJiAweDFGKQotI2RlZmluZSBfUkFSRl9SQzYoeCkJCQkoKCh4KSAmIDB4MUYpIDw8IDgpCi0jZGVmaW5lIF9SQVJGX1JDNyh4KQkJCSgoKHgpICYgMHgxRikgPDwgMTYpCi0jZGVmaW5lIF9SQVJGX1JDOCh4KQkJCSgoKHgpICYgMHgxRikgPDwgMjQpCi0KLQotLyogICovCi0vKiAgKi8KLS8qCTB4MDUwMGggfiAweDA1RkZoCUVEQ0EgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLQotCi0KLS8qIDIgRURDQSBzZXR0aW5nICovCi0jZGVmaW5lIEFDX1BBUkFNX1RYT1BfTElNSVRfT0ZGU0VUCTE2Ci0jZGVmaW5lIEFDX1BBUkFNX0VDV19NQVhfT0ZGU0VUCQkxMgotI2RlZmluZSBBQ19QQVJBTV9FQ1dfTUlOX09GRlNFVAkJOAotI2RlZmluZSBBQ19QQVJBTV9BSUZTX09GRlNFVAkJMAotCi0KLS8qIDIgRURDQV9WT19QQVJBTSAqLwotI2RlZmluZSBfQUlGUyh4KQkJCSh4KQotI2RlZmluZSBfRUNXX01BWF9NSU4oeCkJCQkoKHgpIDw8IDgpCi0jZGVmaW5lIF9UWE9QX0xJTUlUKHgpCQkJKCh4KSA8PCAxNikKLQotCi0jZGVmaW5lIF9CQ05JRlMoeCkJCQkoKHgpICYgMHhGRikKLSNkZWZpbmUgX0JDTkVDVyh4KQkJCSgoKHgpICYgMHhGKSk8PCA4KQotCi0KLSNkZWZpbmUgX0xSTCh4KQkJCQkoKHgpICYgMHgzRikKLSNkZWZpbmUgX1NSTCh4KQkJCQkoKCh4KSAmIDB4M0YpIDw8IDgpCi0KLQotLyogMiBTSUZTX0NDSyAqLwotI2RlZmluZSBfU0lGU19DQ0tfQ1RYKHgpCQkoKHgpICYgMHhGRikKLSNkZWZpbmUgX1NJRlNfQ0NLX1RSWCh4KQkJKCgoeCkgJiAweEZGKSA8PCA4KTsKLQotCi0vKiAyIFNJRlNfT0ZETSAqLwotI2RlZmluZSBfU0lGU19PRkRNX0NUWCh4KQkJKCh4KSAmIDB4RkYpCi0jZGVmaW5lIF9TSUZTX09GRE1fVFJYKHgpCQkoKCh4KSAmIDB4RkYpIDw8IDgpOwotCi0KLS8qIDIgVEJUVCBQUk9ISUJJVCAqLwotI2RlZmluZSBfVEJUVF9QUk9ISUJJVF9IT0xEKHgpCQkoKCh4KSAmIDB4RkYpIDw8IDgpCi0KLQotLyogMiBSRUdfUkRfQ1RSTCAqLwotI2RlZmluZSBESVNfRURDQV9DTlRfRFdOCQlCSVQoMTEpCi0KLQotLyogMiBCQ05fQ1RSTCAqLwotI2RlZmluZSBFTl9NQlNTSUQJCQlCSVQoMSkKLSNkZWZpbmUgRU5fVFhCQ05fUlBUCQkJQklUKDIpCi0jZGVmaW5lCUVOX0JDTl9GVU5DVElPTgkJCUJJVCgzKQotI2RlZmluZSBESVNfVFNGX1VQREFURQkJCUJJVCgzKQotCi0vKiAgVGhlIHNhbWUgZnVuY3Rpb24gYnV0IGRpZmZlcmVudCBiaXQgZmllbGQuICovCi0jZGVmaW5lCURJU19UU0ZfVURUMF9OT1JNQUxfQ0hJUAlCSVQoNCkKLSNkZWZpbmUJRElTX1RTRl9VRFQwX1RFU1RfQ0hJUAkJQklUKDUpCi0KLS8qIDIgQUNNSFdDVFJMICovCi0jZGVmaW5lCUFjbUh3X0h3RW4JCQlCSVQoMCkKLSNkZWZpbmUJQWNtSHdfQmVxRW4JCQlCSVQoMSkKLSNkZWZpbmUJQWNtSHdfVmlxRW4JCQlCSVQoMikKLSNkZWZpbmUJQWNtSHdfVm9xRW4JCQlCSVQoMykKLSNkZWZpbmUJQWNtSHdfQmVxU3RhdHVzCQkJQklUKDQpCi0jZGVmaW5lCUFjbUh3X1ZpcVN0YXR1cwkJCUJJVCg1KQotI2RlZmluZQlBY21Id19Wb3FTdGF0dXMJCQlCSVQoNikKLQotCi0KLS8qICAqLwotLyogICovCi0vKgkweDA2MDBoIH4gMHgwN0ZGaAlXTUFDIENvbmZpZ3VyYXRpb24gKi8KLS8qICAqLwotLyogICovCi0KLS8qIDIgQVBTRF9DVFJMICovCi0jZGVmaW5lIEFQU0RPRkYJCQkJQklUKDYpCi0jZGVmaW5lIEFQU0RPRkZfU1RBVFVTCQkJQklUKDcpCi0KLQotLyogMiBCV09QTU9ERSAqLwotI2RlZmluZSBCV18yME1IWgkJCUJJVCgyKQotCi0KLSNkZWZpbmUgUkFURV9CSVRNQVBfQUxMCQkJMHhGRkZGRgotCi0vKiAgT25seSB1c2UgQ0NLIDFNIHJhdGUgZm9yIEFDSyAqLwotI2RlZmluZSBSQVRFX1JSU1JfQ0NLX09OTFlfMU0JCTB4RkZGRjEKLQotLyogMiBUQ1IgKi8KLSNkZWZpbmUgVFNGUlNUCQkJCUJJVCgwKQotI2RlZmluZSBESVNfR0NMSwkJCUJJVCgxKQotI2RlZmluZSBQQURfU0VMCQkJCUJJVCgyKQotI2RlZmluZSBQV1JfU1QJCQkJQklUKDYpCi0jZGVmaW5lIFBXUkJJVF9PV19FTgkJCUJJVCg3KQotI2RlZmluZSBBQ1JDCQkJCUJJVCg4KQotI2RlZmluZSBDRkVOREZPUk0JCQlCSVQoOSkKLSNkZWZpbmUgSUNWCQkJCUJJVCgxMCkKLQotCi0KLS8qIDIgUkNSICovCi0jZGVmaW5lIEFBUAkJCQlCSVQoMCkKLSNkZWZpbmUgQVBNCQkJCUJJVCgxKQotI2RlZmluZSBBTQkJCQlCSVQoMikKLSNkZWZpbmUgQUIJCQkJQklUKDMpCi0jZGVmaW5lIEFERDMJCQkJQklUKDQpCi0jZGVmaW5lIEFQV1JNR1QJCQkJQklUKDUpCi0jZGVmaW5lIENCU1NJRAkJCQlCSVQoNikKLSNkZWZpbmUgQ0JTU0lEX0JDTgkJCUJJVCg3KQotI2RlZmluZSBBQ1JDMzIJCQkJQklUKDgpCi0jZGVmaW5lIEFJQ1YJCQkJQklUKDkpCi0jZGVmaW5lIEFERgkJCQlCSVQoMTEpCi0jZGVmaW5lIEFDRgkJCQlCSVQoMTIpCi0jZGVmaW5lIEFNRgkJCQlCSVQoMTMpCi0jZGVmaW5lIEhUQ19MT0NfQ1RSTAkJCUJJVCgxNCkKLSNkZWZpbmUgVUNfREFUQV9FTgkJCUJJVCgxNikKLSNkZWZpbmUgQk1fREFUQV9FTgkJCUJJVCgxNykKLSNkZWZpbmUgTUZCRU4JCQkJQklUKDIyKQotI2RlZmluZSBMU0lHRU4JCQkJQklUKDIzKQotI2RlZmluZSBFbk1CSUQJCQkJQklUKDI0KQotI2RlZmluZSBBUFBfQkFTU04JCQlCSVQoMjcpCi0jZGVmaW5lIEFQUF9QSFlTVFMJCQlCSVQoMjgpCi0jZGVmaW5lIEFQUF9JQ1YJCQkJQklUKDI5KQotI2RlZmluZSBBUFBfTUlDCQkJCUJJVCgzMCkKLSNkZWZpbmUgQVBQX0ZDUwkJCQlCSVQoMzEpCi0KLS8qIDIgUlhfUEtUX0xJTUlUICovCi0KLS8qIDIgUlhfRExLX1RJTUUgKi8KLQotLyogMiBNQklEQ0FNQ0ZHICovCi0KLQotCi0vKiAyIEFNUERVX01JTl9TUEFDRSAqLwotI2RlZmluZSBfTUlOX1NQQUNFKHgpCQkJKCh4KSAmIDB4NykKLSNkZWZpbmUgX1NIT1JUX0dJX1BBRERJTkcoeCkJCSgoKHgpICYgMHgxRikgPDwgMykKLQotCi0vKiAyIFJYRVJSX1JQVCAqLwotI2RlZmluZSBSWEVSUl9UWVBFX09GRE1fUFBEVQkJMAotI2RlZmluZSBSWEVSUl9UWVBFX09GRE1mYWxzZV9BTEFSTQkxCi0jZGVmaW5lCVJYRVJSX1RZUEVfT0ZETV9NUERVX09LCQkyCi0jZGVmaW5lIFJYRVJSX1RZUEVfT0ZETV9NUERVX0ZBSUwJMwotI2RlZmluZSBSWEVSUl9UWVBFX0NDS19QUERVCQk0Ci0jZGVmaW5lIFJYRVJSX1RZUEVfQ0NLZmFsc2VfQUxBUk0JNQotI2RlZmluZSBSWEVSUl9UWVBFX0NDS19NUERVX09LCQk2Ci0jZGVmaW5lIFJYRVJSX1RZUEVfQ0NLX01QRFVfRkFJTAk3Ci0jZGVmaW5lIFJYRVJSX1RZUEVfSFRfUFBEVQkJOAotI2RlZmluZSBSWEVSUl9UWVBFX0hUZmFsc2VfQUxBUk0JOQotI2RlZmluZSBSWEVSUl9UWVBFX0hUX01QRFVfVE9UQUwJMTAKLSNkZWZpbmUgUlhFUlJfVFlQRV9IVF9NUERVX09LCQkxMQotI2RlZmluZSBSWEVSUl9UWVBFX0hUX01QRFVfRkFJTAkJMTIKLSNkZWZpbmUgUlhFUlJfVFlQRV9SWF9GVUxMX0RST1AJCTE1Ci0KLSNkZWZpbmUgUlhFUlJfQ09VTlRFUl9NQVNLCQkweEZGRkZGCi0jZGVmaW5lIFJYRVJSX1JQVF9SU1QJCQlCSVQoMjcpCi0jZGVmaW5lIF9SWEVSUl9SUFRfU0VMKHR5cGUpCQkoKHR5cGUpIDw8IDI4KQotCi0KLS8qIDIgU0VDQ0ZHICovCi0jZGVmaW5lCVNDUl9UeFVzZURLCQkJQklUKDApCS8qIEZvcmNlIFR4IFVzZSBEZWZhdWx0IEtleSAqLwotI2RlZmluZQlTQ1JfUnhVc2VESwkJCUJJVCgxKQkvKiBGb3JjZSBSeCBVc2UgRGVmYXVsdCBLZXkgKi8KLSNkZWZpbmUJU0NSX1R4RW5jRW5hYmxlCQkJQklUKDIpCS8qIEVuYWJsZSBUeCBFbmNyeXB0aW9uICovCi0jZGVmaW5lCVNDUl9SeERlY0VuYWJsZQkJCUJJVCgzKQkvKiBFbmFibGUgUnggRGVjcnlwdGlvbiAqLwotI2RlZmluZQlTQ1JfU0tCeUEyCQkJQklUKDQpCS8qIFNlYXJjaCBrRVkgQlkgQTIgKi8KLSNkZWZpbmUJU0NSX05vU0tNQwkJCUJJVCg1KQkvKiBObyBLZXkgU2VhcmNoIE11bHRpY2FzdCAqLwotCi0KLQotLyogICovCi0vKiAgKi8KLS8qCTB4RkUwMGggfiAweEZFNTVoCVVTQiBDb25maWd1cmF0aW9uICovCi0vKiAgKi8KLS8qICAqLwotCi0vKiAyIFVTQiBJbmZvcm1hdGlvbiAoMHhGRTE3KSAqLwotI2RlZmluZSBVU0JfSVNfSElHSF9TUEVFRAkJMAotI2RlZmluZSBVU0JfSVNfRlVMTF9TUEVFRAkJMQotI2RlZmluZSBVU0JfU1BFRURfTUFTSwkJCUJJVCg1KQotCi0jZGVmaW5lIFVTQl9OT1JNQUxfU0lFX0VQX01BU0sJCTB4RgotI2RlZmluZSBVU0JfTk9STUFMX1NJRV9FUF9TSElGVAkJNAotCi0jZGVmaW5lIFVTQl9URVNUX0VQX01BU0sJCTB4MzAKLSNkZWZpbmUgVVNCX1RFU1RfRVBfU0hJRlQJCTQKLQotLyogMiBTcGVjaWFsIE9wdGlvbiAqLwotI2RlZmluZSBVU0JfQUdHX0VOCQkJQklUKDMpCi0KLQotLyogMlJFR19DMkhFVlRfQ0xFQVIgKi8KLQkvKiAgU2V0IGJ5IGRyaXZlciBhbmQgbm90aWZ5IEZXIHRoYXQgdGhlIGRyaXZlciBoYXMgcmVhZCB0aGUKLQkgICAgQzJIIGNvbW1hbmQgbWVzc2FnZSAqLwotI2RlZmluZSBDMkhfRVZUX0hPU1RfQ0xPU0UJCTB4MDAKLQkvKiAgU2V0IGJ5IEZXIGluZGljYXRpbmcgdGhhdCBGVyBoYWQgc2V0IHRoZSBDMkggY29tbWFuZCBtZXNzYWdlCi0JICAgIGFuZCBpdCdzIG5vdCB5ZXQgcmVhZCBieSBkcml2ZXIuICovCi0jZGVmaW5lIEMySF9FVlRfRldfQ0xPU0UJCTB4RkYKLQotCi0vKiAyUkVHX01VTFRJX0ZVTkNfQ1RSTChGb3IgUlRMODcyMyBPbmx5KSAqLwotCS8qICBFbmFibGUgR1BJT1s5XSBhcyBXaUZpIEhXIFBEbiBzb3VyY2UgKi8KLSNkZWZpbmUJV0xfSFdQRE5fRU4JCQlCSVQoMCkKLQkvKiAgV2lGaSBIVyBQRG4gcG9sYXJpdHkgY29udHJvbCAqLwotI2RlZmluZQlXTF9IV1BETl9TTAkJCUJJVCgxKQotCS8qICBXaUZpIGZ1bmN0aW9uIGVuYWJsZSAqLwotI2RlZmluZQlXTF9GVU5DX0VOCQkJQklUKDIpCi0JLyogIEVuYWJsZSBHUElPWzldIGFzIFdpRmkgUkYgSFcgUERuIHNvdXJjZSAqLwotI2RlZmluZQlXTF9IV1JPRl9FTgkJCUJJVCgzKQotCS8qICBFbmFibGUgR1BJT1sxMV0gYXMgQlQgSFcgUERuIHNvdXJjZSAqLwotI2RlZmluZQlCVF9IV1BETl9FTgkJCUJJVCgxNikKLQkvKiAgQlQgSFcgUERuIHBvbGFyaXR5IGNvbnRyb2wgKi8KLSNkZWZpbmUJQlRfSFdQRE5fU0wJCQlCSVQoMTcpCi0JLyogIEJUIGZ1bmN0aW9uIGVuYWJsZSAqLwotI2RlZmluZQlCVF9GVU5DX0VOCQkJQklUKDE4KQotCS8qICBFbmFibGUgR1BJT1sxMV0gYXMgQlQvR1BTIFJGIEhXIFBEbiBzb3VyY2UgKi8KLSNkZWZpbmUJQlRfSFdST0ZfRU4JCQlCSVQoMTkpCi0JLyogIEVuYWJsZSBHUElPWzEwXSBhcyBHUFMgSFcgUERuIHNvdXJjZSAqLwotI2RlZmluZQlHUFNfSFdQRE5fRU4JCQlCSVQoMjApCi0JLyogIEdQUyBIVyBQRG4gcG9sYXJpdHkgY29udHJvbCAqLwotI2RlZmluZQlHUFNfSFdQRE5fU0wJCQlCSVQoMjEpCi0JLyogIEdQUyBmdW5jdGlvbiBlbmFibGUgKi8KLSNkZWZpbmUJR1BTX0ZVTkNfRU4JCQlCSVQoMjIpCi0KLS8qIDMgUkVHX0xJRkVDVFJMX0NUUkwgKi8KLSNkZWZpbmUJSEFMOTJDX0VOX1BLVF9MSUZFX1RJTUVfQksJQklUKDMpCi0jZGVmaW5lCUhBTDkyQ19FTl9QS1RfTElGRV9USU1FX0JFCUJJVCgyKQotI2RlZmluZQlIQUw5MkNfRU5fUEtUX0xJRkVfVElNRV9WSQlCSVQoMSkKLSNkZWZpbmUJSEFMOTJDX0VOX1BLVF9MSUZFX1RJTUVfVk8JQklUKDApCi0KLSNkZWZpbmUJSEFMOTJDX01TRFVfTElGRV9USU1FX1VOSVQJMTI4CS8qICBpbiB1cywgc2FpZCBieSBUaW0uICovCi0KLS8qICAqLwotLyogIEdlbmVyYWwgZGVmaW5pdGlvbnMgKi8KLS8qICAqLwotCi0jZGVmaW5lIExBU1RfRU5UUllfT0ZfVFhfUEtUX0JVRkZFUgkyNTUKLQotI2RlZmluZSBQT0xMSU5HX0xMVF9USFJFU0hPTEQJCTIwCi0jZGVmaW5lIFBPTExJTkdfUkVBRFlfVElNRU9VVF9DT1VOVAkxMDAwCi0KLS8qICBNaW4gU3BhY2luZyByZWxhdGVkIHNldHRpbmdzLiAqLwotI2RlZmluZQlNQVhfTVNTX0RFTlNJVFlfMlQJCTB4MTMKLSNkZWZpbmUJTUFYX01TU19ERU5TSVRZXzFUCQkweDBBCi0KLS8qICAqLwotLyoJODcyM0EgUmVnc2l0ZXIgb2Zmc2V0IGRlZmluaXRpb24gKi8KLS8qICAqLwotI2RlZmluZSBIQUxfODcyM0FfTkFWX1VQUEVSX1VOSVQJMTI4CQkvKiAgbWljcm8tc2Vjb25kICovCi0KLS8qICAqLwotLyogICovCi0vKgkweDAwMDBoIH4gMHgwMEZGaAlTeXN0ZW0gQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLSNkZWZpbmUgUkVHX1NZU09OX1JFR19MT0NLCQkweDAwMUMKLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwMTAwaCB+IDB4MDFGRmgJTUFDVE9QIEdlbmVyYWwgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLSNkZWZpbmUgUkVHX0ZUSU1SCQkJMHgwMTM4Ci0KLQotLyogICovCi0vKiAgKi8KLS8qCTB4MDIwMGggfiAweDAyN0ZoCVRYRE1BIENvbmZpZ3VyYXRpb24gKi8KLS8qICAqLwotLyogICovCi0KLQotLyogICovCi0vKiAgKi8KLS8qCTB4MDI4MGggfiAweDAyRkZoCVJYRE1BIENvbmZpZ3VyYXRpb24gKi8KLS8qICAqLwotLyogICovCi0KLQotLyogICovCi0vKiAgKi8KLS8qCTB4MDMwMGggfiAweDAzRkZoCVBDSWUgKi8KLS8qICAqLwotLyogICovCi0KLQotLyogICovCi0vKiAgKi8KLS8qCTB4MDQwMGggfiAweDA0N0ZoCVByb3RvY29sIENvbmZpZ3VyYXRpb24gKi8KLS8qICAqLwotLyogICovCi0jZGVmaW5lIFJFR19FQVJMWV9NT0RFX0NPTlRST0wJCTB4NEQwCi0KLQotLyogICovCi0vKiAgKi8KLS8qCTB4MDUwMGggfiAweDA1RkZoCUVEQ0EgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLQotLyogMiBCQ05fQ1RSTCAqLwotI2RlZmluZSBESVNfQVRJTQkJCUJJVCgwKQotI2RlZmluZSBESVNfQkNOUV9TVUIJCQlCSVQoMSkKLSNkZWZpbmUgRElTX1RTRl9VRFQJCQlCSVQoNCkKLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwNjAwaCB+IDB4MDdGRmgJV01BQyBDb25maWd1cmF0aW9uICovCi0vKiAgKi8KLS8qICAqLwotLyogICovCi0vKiAgTm90ZTogKi8KLS8qCVRoZSBOQVYgdXBwZXIgdmFsdWUgaXMgdmVyeSBpbXBvcnRhbnQgdG8gV2lGaSAxMW4gNS4yLjMgTkFWIHRlc3QuCi0gKglUaGUgZGVmYXVsdCB2YWx1ZSBpcyBhbHdheXMgdG9vIHNtYWxsLCBidXQgdGhlIFdpRmkgVGVzdFBsYW4gdGVzdAotICoJYnkgMjUsMDAwIG1pY3Jvc2Vjb25kcyBvZiBOQVYgdGhyb3VnaCBzZW5kaW5nIENUUyBpbiB0aGUgYWlyLiBXZQotICoJbXVzdCB1cGRhdGUgdGhpcyB2YWx1ZSBncmVhdGVyIHRoYW4gMjUsMDAwIG1pY3Jvc2Vjb25kcyB0byBwYXNzIHRoZQotICoJaXRlbS4KLSoJVGhlIG9mZnNldCBvZiBOQVZfVVBQRVIgaW4gODE5MkMgU3BlYyBpcyBpbmNvcnJlY3QsIGFuZCB0aGUgb2Zmc2V0Ci0qCXNob3VsZCBiZSAweDA2NTIuIENvbW1lbnRlZCBieSBTRDEgU2NvdHQuICovCi0vKiAgQnkgQnJ1Y2UsIDIwMTEtMDctMTguICovCi0vKiAgKi8KLSNkZWZpbmUJUkVHX05BVl9VUFBFUgkJCTB4MDY1MgkvKiAgdW5pdCBvZiAxMjggKi8KLQotCi0vKiAgKi8KLS8qCTg3MjMgUmVnc2l0ZXIgQml0IGFuZCBDb250ZW50IGRlZmluaXRpb24gKi8KLS8qICAqLwotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwMDAwaCB+IDB4MDBGRmgJU3lzdGVtIENvbmZpZ3VyYXRpb24gKi8KLS8qICAqLwotLyogICovCi0KLS8qIDIgU1BTMF9DVFJMICovCi0KLS8qIDIgU1lTX0lTT19DVFJMICovCi0KLS8qIDIgU1lTX0ZVTkNfRU4gKi8KLQotLyogMiBBUFNfRlNNQ08gKi8KLSNkZWZpbmUgRU5fV0xPTgkJCQlCSVQoMTYpCi0KLS8qIDIgU1lTX0NMS1IgKi8KLQotLyogMiA5MzQ2Q1IgKi8KLQotLyogMiBBRkVfTUlTQyAqLwotCi0vKiAyIFNQUzBfQ1RSTCAqLwotCi0vKiAyIFNQU19PQ1BfQ0ZHICovCi0KLS8qIDIgU1lTT05fUkVHX0xPQ0sgKi8KLSNkZWZpbmUgV0xPQ0tfQUxMCQkJQklUKDApCi0jZGVmaW5lIFdMT0NLXzAwCQkJQklUKDEpCi0jZGVmaW5lIFdMT0NLXzA0CQkJQklUKDIpCi0jZGVmaW5lIFdMT0NLXzA4CQkJQklUKDMpCi0jZGVmaW5lIFdMT0NLXzQwCQkJQklUKDQpCi0jZGVmaW5lIFdMT0NLXzFDX0I2CQkJQklUKDUpCi0jZGVmaW5lIFJfRElTX1BSU1RfMQkJCUJJVCg2KQotI2RlZmluZSBMT0NLX0FMTF9FTgkJCUJJVCg3KQotCi0vKiAyIFJGX0NUUkwgKi8KLQotLyogMiBMRE9BMTVfQ1RSTCAqLwotCi0vKiAyIExET1YxMkRfQ1RSTCAqLwotCi0vKiAyIEFGRV9YVEFMX0NUUkwgKi8KLQotLyogMiBBRkVfUExMX0NUUkwgKi8KLQotLyogMiBFRlVTRV9DVFJMICovCi0KLS8qIDIgRUZVU0VfVEVTVCAoRm9yIFJUTDg3MjMgcGFydGlhbGx5KSAqLwotCi0vKiAyIFBXUl9EQVRBICovCi0KLS8qIDIgQ0FMX1RJTUVSICovCi0KLS8qIDIgQUNMS19NT04gKi8KLQotLyogMiBHUElPX01VWENGRyAqLwotCi0vKiAyIEdQSU9fUElOX0NUUkwgKi8KLQotLyogMiBHUElPX0lOVE0gKi8KLQotLyogMiBMRURDRkcgKi8KLQotLyogMiBGU0lNUiAqLwotCi0vKiAyIEZTSVNSICovCi0KLS8qIDIgSFNJTVIgKi8KLS8qICA4NzIzIEhvc3QgU3lzdGVtIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyIChvZmZzZXQgMHg1OCwgMzIgYnl0ZSkgKi8KLSNkZWZpbmUgSFNJTVJfR1BJTzEyXzBfSU5UX0VOCQlCSVQoMCkKLSNkZWZpbmUgSFNJTVJfU1BTX09DUF9JTlRfRU4JCUJJVCg1KQotI2RlZmluZSBIU0lNUl9ST05fSU5UX0VOCQlCSVQoNikKLSNkZWZpbmUgSFNJTVJfUEROSU5UX0VOCQkJQklUKDcpCi0jZGVmaW5lIEhTSU1SX0dQSU85X0lOVF9FTgkJQklUKDI1KQotCi0vKiAyIEhTSVNSICovCi0vKiAgODcyMyBIb3N0IFN5c3RlbSBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyIChvZmZzZXQgMHg1QywgMzIgYnl0ZSkgKi8KLSNkZWZpbmUgSFNJU1JfR1BJTzEyXzBfSU5UCQlCSVQoMCkKLSNkZWZpbmUgSFNJU1JfU1BTX09DUF9JTlQJCUJJVCg1KQotI2RlZmluZSBIU0lTUl9ST05fSU5UCQkJQklUKDYpCi0jZGVmaW5lIEhTSVNSX1BETklOVAkJCUJJVCg3KQotI2RlZmluZQlIU0lTUl9HUElPOV9JTlQJCQlCSVQoMjUpCi0KLS8qICBpbnRlcnJ1cHQgbWFzayB3aGljaCBuZWVkcyB0byBjbGVhciAqLwotI2RlZmluZSBNQVNLX0hTSVNSX0NMRUFSCQkoSFNJU1JfR1BJTzEyXzBfSU5UIHwgXAotCQkJCQkgSFNJU1JfU1BTX09DUF9JTlQgfCBcCi0JCQkJCSBIU0lTUl9ST05fSU5UIHwgXAotCQkJCQkgSFNJU1JfUEROSU5UIHwJXAotCQkJCQkgSFNJU1JfR1BJTzlfSU5UKQotCi0vKiAyIE1DVUZXREwgKi8KLSNkZWZpbmUgUkFNX0RMX1NFTAkJCUJJVCg3KQkvKiAgMTpSQU0sIDA6Uk9NICovCi0KLS8qIDIgSFBPTl9GU00gKi8KLQotLyogMiBTWVNfQ0ZHICovCi0jZGVmaW5lIFJUTF9JRAkJCQlCSVQoMjMpCS8qICBUZXN0Q2hpcCBJRCwKLQkJCQkJCSAgICAxOlRlc3QoUkxFKTsgMDpNUChSTCkgKi8KLSNkZWZpbmUgU1BTX1NFTAkJCQlCSVQoMjQpIC8qICAxOkxETyByZWd1bGF0b3IgbW9kZTsKLQkJCQkJCSAgICAwOlN3aXRjaGluZyByZWd1bGF0b3IgbW9kZSovCi0KLQotLyogICovCi0vKiAgKi8KLS8qCTB4MDEwMGggfiAweDAxRkZoCU1BQ1RPUCBHZW5lcmFsIENvbmZpZ3VyYXRpb24gKi8KLS8qICAqLwotLyogICovCi0KLS8qIDIgRnVuY3Rpb24gRW5hYmxlIFJlZ2lzdGVycyAqLwotCi0vKiAyIENSICovCi0jZGVmaW5lIENBTFRNUl9FTgkJCUJJVCgxMCkKLQotLyogMiBQQlAgLSBQYWdlIFNpemUgUmVnaXN0ZXIgKi8KLQotLyogMiBUWC9SWERNQSAqLwotCi0vKiAyIFRSWEZGX0JORFkgKi8KLQotLyogMiBMTFRfSU5JVCAqLwotCi0vKiAyIEJCX0FDQ0VTU19DVFJMICovCi0KLQotLyogICovCi0vKiAgKi8KLS8qCTB4MDIwMGggfiAweDAyN0ZoCVRYRE1BIENvbmZpZ3VyYXRpb24gKi8KLS8qICAqLwotLyogICovCi0KLS8qIDIgUlFQTiAqLwotCi0vKiAyIFRERUNUUkwgKi8KLQotLyogMiBUREVDVEwgKi8KLQotLyogMiBUWERNQV9PRkZTRVRfQ0hLICovCi0KLQotLyogICovCi0vKiAgKi8KLS8qCTB4MDQwMGggfiAweDA0N0ZoCVByb3RvY29sIENvbmZpZ3VyYXRpb24gKi8KLS8qICAqLwotLyogICovCi0KLS8qIDIgRldIV19UWFFfQ1RSTCAqLwotCi0vKiAyIElOSVJUU01DU19TRUwgKi8KLQotLyogMiBTUEVDIFNJRlMgKi8KLQotLyogMiBSUlNSICovCi0KLS8qIDIgQVJGUiAqLwotCi0vKiAyIEFHR0xFTl9MTVRfTCAqLwotCi0vKiAyIFJMICovCi0KLS8qIDIgREFSRlJDICovCi0KLS8qIDIgUkFSRlJDICovCi0KLQotLyogICovCi0vKiAgKi8KLS8qCTB4MDUwMGggfiAweDA1RkZoCUVEQ0EgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLQotLyogMiBFRENBIHNldHRpbmcgKi8KLQotLyogMiBFRENBX1ZPX1BBUkFNICovCi0KLS8qIDIgU0lGU19DQ0sgKi8KLQotLyogMiBTSUZTX09GRE0gKi8KLQotLyogMiBUQlRUIFBST0hJQklUICovCi0KLS8qIDIgUkVHX1JEX0NUUkwgKi8KLQotLyogMiBCQ05fQ1RSTCAqLwotCi0vKiAyIEFDTUhXQ1RSTCAqLwotCi0KLS8qICAqLwotLyogICovCi0vKgkweDA2MDBoIH4gMHgwN0ZGaAlXTUFDIENvbmZpZ3VyYXRpb24gKi8KLS8qICAqLwotLyogICovCi0KLS8qIDIgQVBTRF9DVFJMICovCi0KLS8qIDIgQldPUE1PREUgKi8KLQotLyogMiBUQ1IgKi8KLQotLyogMiBSQ1IgKi8KLQotLyogMiBSWF9QS1RfTElNSVQgKi8KLQotLyogMiBSWF9ETEtfVElNRSAqLwotCi0vKiAyIE1CSURDQU1DRkcgKi8KLQotLyogMiBBTVBEVV9NSU5fU1BBQ0UgKi8KLQotLyogMiBSWEVSUl9SUFQgKi8KLQotLyogMiBTRUNDRkcgKi8KLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHhGRTAwaCB+IDB4RkU1NWgJUlRMODcyMyBTRElPIENvbmZpZ3VyYXRpb24gKi8KLS8qICAqLwotLyogICovCi0KLS8qICBJL08gYnVzIGRvbWFpbiBhZGRyZXNzIG1hcHBpbmcgKi8KLSNkZWZpbmUgV0xBTl9JT1JFR19CQVNFCQkJMHgxMDI2MDAwMAotI2RlZmluZSBGSVJNV0FSRV9GSUZPX0JBU0UJCTB4MTAyNzAwMDAKLSNkZWZpbmUgVFhfSElRX0JBU0UJCQkweDEwMzEwMDAwCi0jZGVmaW5lIFRYX01JUV9CQVNFCQkJMHgxMDMyMDAwMAotI2RlZmluZSBUWF9MT1FfQkFTRQkJCTB4MTAzMzAwMDAKLSNkZWZpbmUgUlhfUlgwRkZfQkFTRQkJCTB4MTAzNDAwMDAKLQotLyogIFNESU8gaG9zdCBsb2NhbCByZWdpc3RlciBzcGFjZSBtYXBwaW5nLiAqLwotI2RlZmluZSBXTEFOX0lPUkVHX01TSwkJCTB4N0ZGRgotI2RlZmluZSBXTEFOX0ZJRk9fTVNLCQkJMHgxRkZGCS8qICBBZ2dyZWdhdGlvbiBMZW5ndGhbMTI6MF0gKi8KLSNkZWZpbmUgV0xBTl9SWDBGRl9NU0sJCQkweDAwMDMKLQotI2RlZmluZSBXTEFOX1JYMEZGX0RFVklDRV9JRAkJNwkvKiAgMGJbMTZdLCAxMTFiWzE1OjEzXSAqLwotI2RlZmluZSBXTEFOX0lPUkVHX0RFVklDRV9JRAkJOAkvKiAgMWJbMTZdICovCi0KLS8qICA4NzIzIEVGVVNFICovCi0jZGVmaW5lIEhXU0VUX01BWF9TSVpFCQkJMjU2Ci0KLQotLyogVVNCIGludGVycnVwdCAqLwotI2RlZmluZQlVSElNUl9USU1FT1VUMgkJCUJJVCgzMSkKLSNkZWZpbmUJVUhJTVJfVElNRU9VVDEJCQlCSVQoMzApCi0jZGVmaW5lCVVISU1SX1BTVElNRU9VVAkJCUJJVCgyOSkKLSNkZWZpbmUJVUhJTVJfR1RJTlQ0CQkJQklUKDI4KQotI2RlZmluZQlVSElNUl9HVElOVDMJCQlCSVQoMjcpCi0jZGVmaW5lCVVISU1SX1RYQkNORVJSCQkJQklUKDI2KQotI2RlZmluZQlVSElNUl9UWEJDTk9LCQkJQklUKDI1KQotI2RlZmluZQlVSElNUl9UU0ZfQklUMzJfVE9HR0xFCQlCSVQoMjQpCi0jZGVmaW5lCVVISU1SX0JDTkRNQUlOVDMJCUJJVCgyMykKLSNkZWZpbmUJVUhJTVJfQkNORE1BSU5UMgkJQklUKDIyKQotI2RlZmluZQlVSElNUl9CQ05ETUFJTlQxCQlCSVQoMjEpCi0jZGVmaW5lCVVISU1SX0JDTkRNQUlOVDAJCUJJVCgyMCkKLSNkZWZpbmUJVUhJTVJfQkNORE9LMwkJCUJJVCgxOSkKLSNkZWZpbmUJVUhJTVJfQkNORE9LMgkJCUJJVCgxOCkKLSNkZWZpbmUJVUhJTVJfQkNORE9LMQkJCUJJVCgxNykKLSNkZWZpbmUJVUhJTVJfQkNORE9LMAkJCUJJVCgxNikKLSNkZWZpbmUJVUhJTVJfSFNJU1JfSU5ECQkJQklUKDE1KQotI2RlZmluZQlVSElNUl9CQ05ETUFJTlRfRQkJQklUKDE0KQotLyogUlNWRAlCSVQoMTMpICovCi0jZGVmaW5lCVVISU1SX0NUV19FTkQJCQlCSVQoMTIpCi0vKiBSU1ZECUJJVCgxMSkgKi8KLSNkZWZpbmUJVUhJTVJfQzJIQ01ECQkJQklUKDEwKQotI2RlZmluZQlVSElNUl9DUFdNMgkJCUJJVCg5KQotI2RlZmluZQlVSElNUl9DUFdNCQkJQklUKDgpCi0jZGVmaW5lCVVISU1SX0hJR0hET0sJCQlCSVQoNykJLyogIEhpZ2ggUXVldWUgRE1BIE9LCi0JCQkJCQkgICAgSW50ZXJydXB0ICovCi0jZGVmaW5lCVVISU1SX01HTlRET0sJCQlCSVQoNikJLyogIE1hbmFnZW1lbnQgUXVldWUgRE1BIE9LCi0JCQkJCQkgICAgSW50ZXJydXB0ICovCi0jZGVmaW5lCVVISU1SX0JLRE9LCQkJQklUKDUpCS8qICBBQ19CSyBETUEgT0sgSW50ZXJydXB0ICovCi0jZGVmaW5lCVVISU1SX0JFRE9LCQkJQklUKDQpCS8qICBBQ19CRSBETUEgT0sgSW50ZXJydXB0ICovCi0jZGVmaW5lCVVISU1SX1ZJRE9LCQkJQklUKDMpCS8qICBBQ19WSSBETUEgT0sgSW50ZXJydXB0ICovCi0jZGVmaW5lCVVISU1SX1ZPRE9LCQkJQklUKDIpCS8qICBBQ19WTyBETUEgSW50ZXJydXB0ICovCi0jZGVmaW5lCVVISU1SX1JEVQkJCUJJVCgxKQkvKiAgUmVjZWl2ZSBEZXNjcmlwdG9yCi0JCQkJCQkgICAgVW5hdmFpbGFibGUgKi8KLSNkZWZpbmUJVUhJTVJfUk9LCQkJQklUKDApCS8qICBSZWNlaXZlIERNQSBPSyBJbnRlcnJ1cHQgKi8KLQotLyogIFVTQiBIb3N0IEludGVycnVwdCBTdGF0dXMgRXh0ZW5zaW9uIGJpdCAqLwotI2RlZmluZQlVSElNUl9CQ05ETUFJTlQ3CQlCSVQoMjMpCi0jZGVmaW5lCVVISU1SX0JDTkRNQUlOVDYJCUJJVCgyMikKLSNkZWZpbmUJVUhJTVJfQkNORE1BSU5UNQkJQklUKDIxKQotI2RlZmluZQlVSElNUl9CQ05ETUFJTlQ0CQlCSVQoMjApCi0jZGVmaW5lCVVISU1SX0JDTkRPSzcJCQlCSVQoMTkpCi0jZGVmaW5lCVVISU1SX0JDTkRPSzYJCQlCSVQoMTgpCi0jZGVmaW5lCVVISU1SX0JDTkRPSzUJCQlCSVQoMTcpCi0jZGVmaW5lCVVISU1SX0JDTkRPSzQJCQlCSVQoMTYpCi0vKiAgYml0MTQtMTU6IFJTVkQgKi8KLSNkZWZpbmUJVUhJTVJfQVRJTUVORF9FCQkJQklUKDEzKQotI2RlZmluZQlVSElNUl9BVElNRU5ECQkJQklUKDEyKQotI2RlZmluZQlVSElNUl9UWEVSUgkJCUJJVCgxMSkKLSNkZWZpbmUJVUhJTVJfUlhFUlIJCQlCSVQoMTApCi0jZGVmaW5lCVVISU1SX1RYRk9WVwkJCUJJVCg5KQotI2RlZmluZQlVSElNUl9SWEZPVlcJCQlCSVQoOCkKLS8qICBiaXQyLTc6IFJTVkQgKi8KLSNkZWZpbmUJVUhJTVJfT0NQSU5UCQkJQklUKDEpCi0vKiAgYml0MDogUlNWRCAqLwotCi0jZGVmaW5lCVJFR19VU0JfSElNUgkJCTB4RkUzOAotI2RlZmluZQlSRUdfVVNCX0hJTVJFCQkJMHhGRTNDCi0jZGVmaW5lCVJFR19VU0JfSElTUgkJCTB4RkU3OAotI2RlZmluZQlSRUdfVVNCX0hJU1JFCQkJMHhGRTdDCi0KLSNkZWZpbmUJVVNCX0lOVFJfQ1BXTV9PRkZTRVQJCTE2Ci0jZGVmaW5lCVVTQl9JTlRSX0NPTlRFTlRfSElTUl9PRkZTRVQJNDgKLSNkZWZpbmUJVVNCX0lOVFJfQ09OVEVOVF9ISVNSRV9PRkZTRVQJNTIKLSNkZWZpbmUJVVNCX0lOVFJfQ09OVEVOVF9MRU5HVEgJCTU2Ci0jZGVmaW5lCVVTQl9DMkhfQ01ESURfT0ZGU0VUCQkwCi0jZGVmaW5lCVVTQl9DMkhfU0VRX09GRlNFVAkJMQotI2RlZmluZQlVU0JfQzJIX0VWRU5UX09GRlNFVAkJMgotLyogICovCi0vKglHZW5lcmFsIGRlZmluaXRpb25zICovCi0vKiAgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2Ffc3Jlc2V0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2Ffc3Jlc2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOTc5MTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX3NyZXNldC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9SVEw4NzIzQV9TUkVTRVRfSF8KLSNkZWZpbmUgX1JUTDg3MjNBX1NSRVNFVF9IXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPHJ0d19zcmVzZXQuaD4KLQotdm9pZCBydGw4NzIzYV9zcmVzZXRfeG1pdF9zdGF0dXNfY2hlY2soc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX3htaXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV94bWl0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYjI5ZjQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX3htaXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19SVEw4NzIzQV9YTUlUX0hfXwotI2RlZmluZSBfX1JUTDg3MjNBX1hNSVRfSF9fCi0KLS8qICAqLwotLyogIFF1ZXVlIFNlbGVjdCBWYWx1ZSBpbiBUeERlc2MgKi8KLS8qICAqLwotI2RlZmluZSBRU0xUX0JLCQkJCQkJCTB4Mi8qIDB4MDEgKi8KLSNkZWZpbmUgUVNMVF9CRQkJCQkJCQkweDAKLSNkZWZpbmUgUVNMVF9WSQkJCQkJCQkweDUvKiAweDQgKi8KLSNkZWZpbmUgUVNMVF9WTwkJCQkJCQkweDcvKiAweDYgKi8KLSNkZWZpbmUgUVNMVF9CRUFDT04JCQkJCQkweDEwCi0jZGVmaW5lIFFTTFRfSElHSAkJCQkJCTB4MTEKLSNkZWZpbmUgUVNMVF9NR05UCQkJCQkJMHgxMgotI2RlZmluZSBRU0xUX0NNRAkJCQkJCTB4MTMKLQotLyogICovCi0vKiBkZWZpbmVkIGZvciBUWCBERVNDIE9wZXJhdGlvbiAqLwotLyogICovCi0KLSNkZWZpbmUgTUFYX1RJRCAoMTUpCi0KLS8qIE9GRlNFVCAwICovCi0jZGVmaW5lIE9GRlNFVF9TWgkwCi0jZGVmaW5lIE9GRlNFVF9TSFQJMTYKLSNkZWZpbmUgQk1DCQlCSVQoMjQpCi0jZGVmaW5lIExTRwkJQklUKDI2KQotI2RlZmluZSBGU0cJCUJJVCgyNykKLSNkZWZpbmUgT1dOCQlCSVQoMzEpCi0KLQotLyogT0ZGU0VUIDQgKi8KLSNkZWZpbmUgUEtUX09GRlNFVF9TWgkwCi0jZGVmaW5lIEJLCQlCSVQoNikKLSNkZWZpbmUgUVNFTF9TSFQJOAotI2RlZmluZSBSYXRlX0lEX1NIVAkxNgotI2RlZmluZSBOQVZVU0VIRFIJQklUKDIwKQotI2RlZmluZSBQS1RfT0ZGU0VUX1NIVAkyNgotI2RlZmluZSBIV1BDCQlCSVQoMzEpCi0KLS8qIE9GRlNFVCA4ICovCi0jZGVmaW5lIEFHR19FTgkJQklUKDI5KQotCi0vKiBPRkZTRVQgMTIgKi8KLSNkZWZpbmUgU0VRX1NIVAkJMTYKLQotLyogT0ZGU0VUIDE2ICovCi0jZGVmaW5lIFFvUwkJQklUKDYpCi0jZGVmaW5lIEhXX1NFUV9FTglCSVQoNykKLSNkZWZpbmUgVVNFUkFURQkJQklUKDgpCi0jZGVmaW5lIERJU0RBVEFGQglCSVQoMTApCi0jZGVmaW5lIERBVEFfU0hPUlQJQklUKDI0KQotI2RlZmluZSBEQVRBX0JXCQlCSVQoMjUpCi0KLS8qIE9GRlNFVCAyMCAqLwotI2RlZmluZSBTR0kJCUJJVCg2KQotCi1zdHJ1Y3QgdHhkZXNjXzg3MjNhIHsKLQl1MzIgcGt0bGVuOjE2OwotCXUzMiBvZmZzZXQ6ODsKLQl1MzIgYm1jOjE7Ci0JdTMyIGh0YzoxOwotCXUzMiBsczoxOwotCXUzMiBmczoxOwotCXUzMiBsaW5pcDoxOwotCXUzMiBub2FjbToxOwotCXUzMiBnZjoxOwotCXUzMiBvd246MTsKLQotCXUzMiBtYWNpZDo1OwotCXUzMiBhZ2dfZW46MTsKLQl1MzIgYms6MTsKLQl1MzIgcmRfZW46MTsKLQl1MzIgcXNlbDo1OwotCXUzMiByZF9uYXZfZXh0OjE7Ci0JdTMyIGxzaWdfdHhvcF9lbjoxOwotCXUzMiBwaWZzOjE7Ci0JdTMyIHJhdGVfaWQ6NDsKLQl1MzIgbmF2dXNlaGRyOjE7Ci0JdTMyIGVuX2Rlc2NfaWQ6MTsKLQl1MzIgc2VjdHlwZToyOwotCXUzMiByc3ZkMDQyNDoyOwotCXUzMiBwa3Rfb2Zmc2V0OjU7CS8qICB1bml0OiA4IGJ5dGVzICovCi0JdTMyIHJzdmQwNDMxOjE7Ci0KLQl1MzIgcnRzX3JjOjY7Ci0JdTMyIGRhdGFfcmM6NjsKLQl1MzIgcnN2ZDA4MTI6MjsKLQl1MzIgYmFyX3J0eV90aDoyOwotCXUzMiByc3ZkMDgxNjoxOwotCXUzMiBtb3JlZnJhZzoxOwotCXUzMiByYXc6MTsKLQl1MzIgY2N4OjE7Ci0JdTMyIGFtcGR1X2RlbnNpdHk6MzsKLQl1MzIgYnRfbnVsbDoxOwotCXUzMiBhbnRfc2VsX2E6MTsKLQl1MzIgYW50X3NlbF9iOjE7Ci0JdTMyIHR4X2FudF9jY2s6MjsKLQl1MzIgdHhfYW50bDoyOwotCXUzMiB0eF9hbnRfaHQ6MjsKLQotCXUzMiBuZXh0aGVhZHBhZ2U6ODsKLQl1MzIgdGFpbHBhZ2U6ODsKLQl1MzIgc2VxOjEyOwotCXUzMiBjcHVfaGFuZGxlOjE7Ci0JdTMyIHRhZzE6MTsKLQl1MzIgdHJpZ2dlcl9pbnQ6MTsKLQl1MzIgaHdzZXFfZW46MTsKLQotCXUzMiBydHNyYXRlOjU7Ci0JdTMyIGFwX2RjZmU6MTsKLQl1MzIgaHdzZXFfc2VsOjI7Ci0JdTMyIHVzZXJhdGU6MTsKLQl1MzIgZGlzcnRzZmI6MTsKLQl1MzIgZGlzZGF0YWZiOjE7Ci0JdTMyIGN0czJzZWxmOjE7Ci0JdTMyIHJ0c2VuOjE7Ci0JdTMyIGh3X3J0c19lbjoxOwotCXUzMiBwb3J0X2lkOjE7Ci0JdTMyIHJzdmQxNjE1OjM7Ci0JdTMyIHdhaXRfZGN0czoxOwotCXUzMiBjdHMyYXBfZW46MTsKLQl1MzIgZGF0YV9zYzoyOwotCXUzMiBkYXRhX3N0YmM6MjsKLQl1MzIgZGF0YV9zaG9ydDoxOwotCXUzMiBkYXRhX2J3OjE7Ci0JdTMyIHJ0c19zaG9ydDoxOwotCXUzMiBydHNfYnc6MTsKLQl1MzIgcnRzX3NjOjI7Ci0JdTMyIHZjc19zdGJjOjI7Ci0KLQl1MzIgZGF0YXJhdGU6NjsKLQl1MzIgc2dpOjE7Ci0JdTMyIHRyeV9yYXRlOjE7Ci0JdTMyIGRhdGFfcmF0ZWZiX2xtdDo1OwotCXUzMiBydHNfcmF0ZWZiX2xtdDo0OwotCXUzMiBydHlfbG10X2VuOjE7Ci0JdTMyIGRhdGFfcnRfbG10OjY7Ci0JdTMyIHVzYl90eGFnZ19udW06ODsKLQotCXUzMiB0eGFnZ19hOjU7Ci0JdTMyIHR4YWdnX2I6NTsKLQl1MzIgdXNlX21heF9sZW46MTsKLQl1MzIgbWF4X2FnZ19udW06NTsKLQl1MzIgbWNzZzFfbWF4X2xlbjo0OwotCXUzMiBtY3NnMl9tYXhfbGVuOjQ7Ci0JdTMyIG1jc2czX21heF9sZW46NDsKLQl1MzIgbWNzN19zZ2lfbWF4X2xlbjo0OwotCi0JdTMyIGNoZWNrc3VtOjE2OwkvKiAgVHhCdWZmU2l6ZShQQ0llKS9DaGVja1N1bShVU0IpICovCi0JdTMyIG1jc2c0X21heF9sZW46NDsKLQl1MzIgbWNzZzVfbWF4X2xlbjo0OwotCXUzMiBtY3NnNl9tYXhfbGVuOjQ7Ci0JdTMyIG1jczE1X3NnaV9tYXhfbGVuOjQ7Ci19OwotCi0jZGVmaW5lIHR4ZGVzY19zZXRfY2N4X3N3Xzg3MjNhKHR4ZGVzYywgdmFsdWUpIFwKLQlkbyB7IFwKLQkJKChzdHJ1Y3QgdHhkZXNjXzg3MjNhICopKHR4ZGVzYykpLT5tY3NnNF9tYXhfbGVuID0gKCgodmFsdWUpPj44KSAmIDB4MGYpOyBcCi0JCSgoc3RydWN0IHR4ZGVzY184NzIzYSAqKSh0eGRlc2MpKS0+bWNzMTVfc2dpX21heF9sZW49ICgoKHZhbHVlKT4+NCkgJiAweDBmKTsgXAotCQkoKHN0cnVjdCB0eGRlc2NfODcyM2EgKikodHhkZXNjKSktPm1jc2c2X21heF9sZW4gPSAoKHZhbHVlKSAmIDB4MGYpOyBcCi0JfSB3aGlsZSAoMCkKLQotc3RydWN0IHR4cnB0X2NjeF84NzIzYSB7Ci0JLyogb2Zmc2V0IDAgKi8KLQl1OCB0YWcxOjE7Ci0JdTggcnN2ZDo0OwotCXU4IGludF9idDoxOwotCXU4IGludF90cmk6MTsKLQl1OCBpbnRfY2N4OjE7Ci0KLQkvKiBvZmZzZXQgMSAqLwotCXU4IG1hY19pZDo1OwotCXU4IHBrdF9kcm9wOjE7Ci0JdTggcGt0X29rOjE7Ci0JdTggYm1jOjE7Ci0KLQkvKiBvZmZzZXQgMiAqLwotCXU4IHJldHJ5X2NudDo2OwotCXU4IGxpZmV0aW1lX292ZXI6MTsKLQl1OCByZXRyeV9vdmVyOjE7Ci0KLQkvKiBvZmZzZXQgMyAqLwotCXU4IGNjeF9xdGltZTA7Ci0JdTggY2N4X3F0aW1lMTsKLQotCS8qIG9mZnNldCA1ICovCi0JdTggZmluYWxfZGF0YV9yYXRlOwotCi0JLyogb2Zmc2V0IDYgKi8KLQl1OCBzdzE6NDsKLQl1OCBxc2VsOjQ7Ci0KLQkvKiBvZmZzZXQgNyAqLwotCXU4IHN3MDsKLX07Ci0KLSNkZWZpbmUgdHhycHRfY2N4X3N3Xzg3MjNhKHR4cnB0X2NjeCkgKCh0eHJwdF9jY3gpLT5zdzAgKyAoKHR4cnB0X2NjeCktPnN3MTw8OCkpCi0jZGVmaW5lIHR4cnB0X2NjeF9xdGltZV84NzIzYSh0eHJwdF9jY3gpICgodHhycHRfY2N4KS0+Y2N4X3F0aW1lMCsoKHR4cnB0X2NjeCktPmNjeF9xdGltZTE8PDgpKQotCi12b2lkIGhhbmRsZV90eHJwdF9jY3hfODcyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCB2b2lkICpidWYpOwotdm9pZCBydGw4NzIzYV9maWxsX2Zha2VfdHhkZXNjKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpwRGVzYywgdTMyIEJ1ZmZlckxlbiwgdTggSXNQc1BvbGwsIHU4IElzQlRRb3NOdWxsKTsKLQotaW50IHJ0bDg3MjNhdV9oYWxfeG1pdGZyYW1lX2VucXVldWUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpOwotczMyIHJ0bDg3MjNhdV94bWl0X2J1Zl9oYW5kbGVyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotI2RlZmluZSBoYWxfeG1pdF9oYW5kbGVyIHJ0bDg3MjNhdV94bWl0X2J1Zl9oYW5kbGVyCi1ib29sIHJ0bDg3MjNhdV9oYWxfeG1pdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSk7Ci1pbnQgcnRsODcyM2F1X21nbnRfeG1pdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgeG1pdF9mcmFtZSAqcG1nbnRmcmFtZSk7Ci1ib29sIHJ0bDg3MjNhdV94bWl0ZnJhbWVfY29tcGxldGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2LCBzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmKTsKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfYXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhNzA4Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2FwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEyIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19SVFdfQVBfSF8KLSNkZWZpbmUgX19SVFdfQVBfSF8KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLQotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0KLS8qIGV4dGVybmFsIGZ1bmN0aW9uICovCi0KLXZvaWQgaW5pdF9tbG1lX2FwX2luZm8yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIGZyZWVfbWxtZV9hcF9pbmZvMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotLyogdm9pZCB1cGRhdGVfQkNOVElNKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOyAqLwotdm9pZCBydHdfYWRkX2Jjbl9pZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmssIHU4IGluZGV4LCB1OCAqZGF0YSwgdTggbGVuKTsKLXZvaWQgcnR3X3JlbW92ZV9iY25faWUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHdsYW5fYnNzaWRfZXggKnBuZXR3b3JrLCB1OCBpbmRleCk7Ci12b2lkIHVwZGF0ZV9iZWFjb24yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggaWVfaWQsIHU4ICpvdWksIHU4IHR4KTsKLXZvaWQgYWRkX1JBVGlkMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSwgdTggcnNzaV9sZXZlbCk7Ci12b2lkIGV4cGlyZV90aW1lb3V0X2NoazIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgdXBkYXRlX3N0YV9pbmZvMjNhX2FwbW9kZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpOwotaW50IHJ0d19jaGVja19iZWFjb25fZGF0YTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsIHVuc2lnbmVkIGludCBsZW4pOwotdm9pZCBydHdfYXBfcmVzdG9yZV9uZXR3b3JrKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydHdfc2V0X21hY2FkZHJfYWNsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGludCBtb2RlKTsKLQotdm9pZCBhc3NvY2lhdGVkX2NsaWVudHNfdXBkYXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHVwZGF0ZWQpOwotdm9pZCBic3NfY2FwX3VwZGF0ZV9vbl9zdGFfam9pbjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpOwotdTggYnNzX2NhcF91cGRhdGVfb25fc3RhX2xlYXZlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSk7Ci12b2lkIHN0YV9pbmZvX3VwZGF0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpOwotdm9pZCBhcF9zdGFfaW5mb19kZWZlcl91cGRhdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKTsKLXU4IGFwX2ZyZWVfc3RhMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSwgYm9vbCBhY3RpdmUsIHUxNiByZWFzb24pOwotaW50IHJ0d19zdGFfZmx1c2gyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHN0YXJ0X2FwX21vZGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHN0b3BfYXBfbW9kZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLSNlbmRpZiAvKiBlbmQgb2YgQ09ORklHXzg3MjNBVV9BUF9NT0RFICovCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19jbWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfY21kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZmE5NWQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19jbWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDgxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19SVFdfQ01EX0hfCi0jZGVmaW5lIF9fUlRXX0NNRF9IXwotCi0jaW5jbHVkZSA8d2xhbl9ic3NkZWYuaD4KLSNpbmNsdWRlIDxydHdfcmYuaD4KLQotI2RlZmluZSBDMkhfTUVNX1NaICgxNioxMDI0KQotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGllZWU4MDIxMS5oPiAvKiAgPGllZWU4MDIxMS9pZWVlODAyMTEuaD4gKi8KLQotCi0jZGVmaW5lIE1BWF9DTURTWgkxMDI0Ci0jZGVmaW5lIE1BWF9SU1BTWgk1MTIKLSNkZWZpbmUgTUFYX0VWVFNaCTEwMjQKLQotI2RlZmluZSBDTURCVUZGX0FMSUdOX1NaIDUxMgotCi1zdHJ1Y3QgY21kX29iaiB7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHdvcms7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcjsKLQl1MTYJY21kY29kZTsKLQlpbnQJcmVzOwotCXUzMgljbWRzejsKLQl1OAkqcGFybWJ1ZjsKLQl1OAkqcnNwOwotCXUzMglyc3BzejsKLX07Ci0KLXN0cnVjdCBjbWRfcHJpdiB7Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOwotCXUzMgljbWRfaXNzdWVkX2NudDsKLQl1MzIJY21kX2RvbmVfY250OwotCXUzMglyc3BfY250OwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXI7Ci19OwotCi0jZGVmaW5lIEMySF9RVUVVRV9NQVhfTEVOIDEwCi0KLXN0cnVjdAlldnRfcHJpdiB7Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOwotCXN0cnVjdCB3b3JrX3N0cnVjdCBpcnFfd2s7Ci19OwotCi0jZGVmaW5lIGluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBjbWQsIHBwYXJtLCBjb2RlKSBcCi1kbyB7XAotCXBjbWQtPmNtZGNvZGUgPSBjb2RlO1wKLQlwY21kLT5wYXJtYnVmID0gKHU4ICopKHBwYXJtKTtcCi0JcGNtZC0+Y21kc3ogPSBzaXplb2YgKCpwcGFybSk7XAotCXBjbWQtPnJzcCA9IE5VTEw7XAotCXBjbWQtPnJzcHN6ID0gMDtcCi19IHdoaWxlKDApCi0KLXN0cnVjdCBjMmhfZXZ0X2hkciB7Ci0JdTggaWQ6NDsKLQl1OCBwbGVuOjQ7Ci0JdTggc2VxOwotCXU4IHBheWxvYWRbMF07Ci19OwotCi0vKgotICogRG8gbm90IHJlb3JkZXIgLSB0aGlzIGFsbG93cyBmb3Igc3RydWN0IGV2dF93b3JrIHRvIGJlIHBhc3NlZCBvbiB0bwotICogcnR3X2MyaF93a19jbWQyM2EoKSBhcyBhICdzdHJ1Y3QgYzJoX2V2dF9oZHIgKicgd2l0aG91dCBtYWtpbmcgYW4KLSAqIGFkZGl0aW9uYWwgY29weS4KLSAqLwotc3RydWN0IGV2dF93b3JrIHsKLQl1bmlvbiB7Ci0JCXN0cnVjdCBjMmhfZXZ0X2hkciBjMmhfZXZ0OwotCQl1OCBidWZbMTZdOwotCX0gdTsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXI7Ci19OwotCi0jZGVmaW5lIGMyaF9ldnRfZXhpc3QoYzJoX2V2dCkgKChjMmhfZXZ0KS0+aWQgfHwgKGMyaF9ldnQpLT5wbGVuKQotCi12b2lkIHJ0d19ldnRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotCi1pbnQgcnR3X2VucXVldWVfY21kMjNhKHN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYsIHN0cnVjdCBjbWRfb2JqICpvYmopOwotdm9pZCBydHdfZnJlZV9jbWRfb2JqMjNhKHN0cnVjdCBjbWRfb2JqICpwY21kKTsKLQotaW50IHJ0d19jbWRfdGhyZWFkMjNhKHZvaWQgKmNvbnRleHQpOwotCi1pbnQgcnR3X2luaXRfY21kX3ByaXYyM2Eoc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdik7Ci0KLXUzMiBydHdfaW5pdF9ldnRfcHJpdjIzYSAoc3RydWN0IGV2dF9wcml2ICpwZXZ0cHJpdik7Ci12b2lkIHJ0d19mcmVlX2V2dF9wcml2MjNhIChzdHJ1Y3QgZXZ0X3ByaXYgKnBldnRwcml2KTsKLXZvaWQgcnR3X2V2dF9ub3RpZnlfaXNyKHN0cnVjdCBldnRfcHJpdiAqcGV2dHByaXYpOwotCi1lbnVtIHJ0d19kcnZleHRyYV9jbWRfaWQKLXsKLQlOT05FX1dLX0NJRCwKLQlEWU5BTUlDX0NIS19XS19DSUQsCi0JRE1fQ1RSTF9XS19DSUQsCi0JUEJDX1BPTExJTkdfV0tfQ0lELAotCVBPV0VSX1NBVklOR19DVFJMX1dLX0NJRCwvKiBJUFMsQVVUT1N1c3BlbmQgKi8KLQlMUFNfQ1RSTF9XS19DSUQsCi0JQU5UX1NFTEVDVF9XS19DSUQsCi0JUDJQX1BTX1dLX0NJRCwKLQlQMlBfUFJPVE9fV0tfQ0lELAotCUNIRUNLX0hJUV9XS19DSUQsLyogZm9yIHNvZnRhcCBtb2RlLCBjaGVjayBoaSBxdWV1ZSBpZiBlbXB0eSAqLwotCUMySF9XS19DSUQsCi0JUlRQX1RJTUVSX0NGR19XS19DSUQsCi0JTUFYX1dLX0NJRAotfTsKLQotZW51bSBMUFNfQ1RSTF9UWVBFCi17Ci0JTFBTX0NUUkxfU0NBTj0wLAotCUxQU19DVFJMX0pPSU5CU1M9MSwKLQlMUFNfQ1RSTF9DT05ORUNUPTIsCi0JTFBTX0NUUkxfRElTQ09OTkVDVD0zLAotCUxQU19DVFJMX1NQRUNJQUxfUEFDS0VUPTQsCi0JTFBTX0NUUkxfTEVBVkU9NSwKLX07Ci0KLWVudW0gUkZJTlRGUyB7Ci0JU1dTSSwKLQlIV1NJLAotCUhXUEksCi19OwotCi0vKgotQ2FsbGVyIE1vZGU6IEluZnJhLCBBZC1Ib0MoQykKLQotTm90ZXM6IFRvIGVudGVyIFVTQiBzdXNwZW5kIG1vZGUKLQotQ29tbWFuZCBNb2RlCi0KLSovCi1zdHJ1Y3QgdXNiX3N1c3BlbmRfcGFybSB7Ci0JdTMyIGFjdGlvbjsvKiAgMTogc2xlZXAsIDA6cmVzdW1lICovCi19OwotCi0vKgotQ2FsbGVyIE1vZGU6IEluZnJhLCBBZC1Ib0MKLQotTm90ZXM6IFRvIGpvaW4gYSBrbm93biBCU1MuCi0KLUNvbW1hbmQtRXZlbnQgTW9kZQotCi0qLwotCi0vKgotQ2FsbGVyIE1vZGU6IEluZnJhLCBBZC1Ib0MoQykKLQotTm90ZXM6IFRvIGRpc2Nvbm5lY3QgdGhlIGN1cnJlbnQgYXNzb2NpYXRlZCBCU1MKLQotQ29tbWFuZCBNb2RlCi0KLSovCi1zdHJ1Y3QgZGlzY29ubmVjdF9wYXJtIHsKLQl1MzIgZGVhdXRoX3RpbWVvdXRfbXM7Ci19OwotCi1zdHJ1Y3QJc2V0b3Btb2RlX3Bhcm0gewotCWVudW0gbmw4MDIxMV9pZnR5cGUgbW9kZTsKLX07Ci0KLS8qCi1DYWxsZXIgTW9kZTogQVAsIEFkLUhvQywgSW5mcmEKLQotTm90ZXM6IFRvIGFzayBSVEw4NzExIHBlcmZvcm1pbmcgc2l0ZS1zdXJ2ZXkKLQotQ29tbWFuZC1FdmVudCBNb2RlCi0KLSovCi0KLSNkZWZpbmUgUlRXX1NTSURfU0NBTl9BTU9VTlQgOSAvKiAgZm9yIFdFWFRfQ1NDQU5fQU1PVU5UIDkgKi8KLSNkZWZpbmUgUlRXX0NIQU5ORUxfU0NBTl9BTU9VTlQgKDE0KzM3KQotc3RydWN0IHNpdGVzdXJ2ZXlfcGFybSB7Ci0JaW50IHNjYW5fbW9kZTsJLyogYWN0aXZlOiAxLCBwYXNzaXZlOiAwICovCi0JdTggc3NpZF9udW07Ci0JdTggY2hfbnVtOwotCXN0cnVjdCBjZmc4MDIxMV9zc2lkIHNzaWRbUlRXX1NTSURfU0NBTl9BTU9VTlRdOwotCXN0cnVjdCBydHdfaWVlZTgwMjExX2NoYW5uZWwgY2hbUlRXX0NIQU5ORUxfU0NBTl9BTU9VTlRdOwotfTsKLQotLyoKLUNhbGxlciBNb2RlOiBBbnkKLQotTm90ZXM6IFRvIHNldCB0aGUgYXV0aCB0eXBlIG9mIFJUTDg3MTEuIG9wZW4vc2hhcmVkLzgwMi4xeAotCi1Db21tYW5kIE1vZGUKLQotKi8KLXN0cnVjdCBzZXRhdXRoX3Bhcm0gewotCXU4IG1vZGU7ICAvKiAwOiBsZWdhY3kgb3BlbiwgMTogbGVnYWN5IHNoYXJlZCAyOiA4MDIuMXggKi8KLQl1OCBfMXg7ICAgLyogMDogUFNLLCAxOiBUTFMgKi8KLQl1OCByc3ZkWzJdOwotfTsKLQotLyoKLUNhbGxlciBNb2RlOiBJbmZyYQotCi1hLiBhbGdvcml0aG06IHdlcDQwLCB3ZXAxMDQsIHRraXAgJiBhZXMKLWIuIGtleXR5cGU6IGdycCBrZXkvdW5pY2FzdCBrZXkKLWMuIGtleSBjb250ZW50cwotCi13aGVuIHNoYXJlZCBrZXkgPT0+IGtleWlkIGlzIHRoZSBjYW1pZAotd2hlbiA4MDIuMXggPT0+IGtleWlkIFswOjFdID09PiBncnAga2V5Ci13aGVuIDgwMi4xeCA9PT4ga2V5aWQgPiAyID09PiB1bmljYXN0IGtleQotCi0qLwotc3RydWN0IHNldGtleV9wYXJtIHsKLQl1MzIJYWxnb3JpdGhtOwkvKiAgZW5jcnlwdGlvbiBhbGdvcml0aG0sIGNvdWxkIGJlIG5vbmUsIHdlcDQwLCBUS0lQLCBDQ01QLCB3ZXAxMDQgKi8KLQl1OAlrZXlpZDsKLQl1OAlncnBrZXk7CQkvKiAgMTogdGhpcyBpcyB0aGUgZ3Jwa2V5IGZvciA4MDIuMXguIDA6IHRoaXMgaXMgdGhlIHVuaWNhc3Qga2V5IGZvciA4MDIuMXggKi8KLQl1OAlzZXRfdHg7CQkvKiAgMTogbWFpbiB0eCBrZXkgZm9yIHdlcC4gMDogb3RoZXIga2V5LiAqLwotCXU4CWtleVsxNl07CS8qICB0aGlzIGNvdWxkIGJlIDQwIG9yIDEwNCAqLwotfTsKLQotLyoKLVdoZW4gaW4gQVAgb3IgQWQtSG9jIG1vZGUsIHRoaXMgaXMgdXNlZCB0bwotYWxsb2NhdGUgYW4gc3cvaHcgZW50cnkgZm9yIGEgbmV3bHkgYXNzb2NpYXRlZCBzdGEuCi0KLUNvbW1hbmQKLQotd2hlbiBzaGFyZWQga2V5ID09PiBhbGdvcml0aG0va2V5aWQKLQotKi8KLXN0cnVjdCBzZXRfc3Rha2V5X3Bhcm0gewotCXU4CWFkZHJbRVRIX0FMRU5dOwotCXU4CWlkOy8qICBjdXJyZW50bHkgZm9yIGVyYXNpbmcgY2FtIGVudHJ5IGlmIGFsZ29yaXRobSA9PSBfTk9fUFJJVkFDWV8gKi8KLQl1MzIJYWxnb3JpdGhtOwotCXU4CWtleVsxNl07Ci19OwotCi1zdHJ1Y3Qgc2V0X3N0YWtleV9yc3AgewotCXU4CWFkZHJbRVRIX0FMRU5dOwotCXU4CWtleWlkOwotCXU4CXJzdmQ7Ci19OwotCi0vKgotQ2FsbGVyIEFkLUhvYy9BUAotCi1Db21tYW5kIC1Sc3AoQUlEID09IENBTUlEKSBtb2RlCi0KLVRoaXMgaXMgdG8gZm9yY2UgZncgdG8gYWRkIGFuIHN0YV9kYXRhIGVudHJ5IHBlciBkcml2ZXIncyByZXF1ZXN0LgotCi1GVyB3aWxsIHdyaXRlIGFuIGNhbSBlbnRyeSBhc3NvY2lhdGVkIHdpdGggaXQuCi0KLSovCi1zdHJ1Y3Qgc2V0X2Fzc29jc3RhX3Bhcm0gewotCXU4CWFkZHJbRVRIX0FMRU5dOwotfTsKLQotc3RydWN0IHNldF9hc3NvY3N0YV9yc3AgewotCXU4CWNhbV9pZDsKLQl1OAlyc3ZkWzNdOwotfTsKLQotLyoKLQlDYWxsZXIgQWQtSG9jL0FQCi0KLQlDb21tYW5kIG1vZGUKLQotCVRoaXMgaXMgdG8gZm9yY2UgZncgdG8gZGVsIGFuIHN0YV9kYXRhIGVudHJ5IHBlciBkcml2ZXIncyByZXF1ZXN0Ci0KLQlGVyB3aWxsIGludmFsaWRhdGUgdGhlIGNhbSBlbnRyeSBhc3NvY2lhdGVkIHdpdGggaXQuCi0KLSovCi1zdHJ1Y3QgZGVsX2Fzc29jc3RhX3Bhcm0gewotCXU4CWFkZHJbRVRIX0FMRU5dOwotfTsKLQotLyoKLUNhbGxlciBNb2RlOiBBUC9BZC1Ib0MoTSkKLQotTm90ZXM6IFRvIG5vdGlmeSBmdyB0aGF0IGdpdmVuIHN0YWlkIGhhcyBjaGFuZ2VkIGl0cyBwb3dlciBzdGF0ZQotCi1Db21tYW5kIE1vZGUKLQotKi8KLXN0cnVjdCBzZXRzdGFwd3JzdGF0ZV9wYXJtIHsKLQl1OAlzdGFpZDsKLQl1OAlzdGF0dXM7Ci0JdTgJaHdhZGRyWzZdOwotfTsKLQotLyoKLUNhbGxlciBNb2RlOiBBbnkKLQotTm90ZXM6IFRvIHNldHVwIHRoZSBiYXNpYyByYXRlIG9mIFJUTDg3MTEKLQotQ29tbWFuZCBNb2RlCi0KLSovCi1zdHJ1Y3QJc2V0YmFzaWNyYXRlX3Bhcm0gewotCXU4CWJhc2ljcmF0ZXNbTnVtUmF0ZXNdOwotfTsKLQotLyoKLUNhbGxlciBNb2RlOiBBbnkKLQotTm90ZXM6IFRvIHJlYWQgdGhlIGN1cnJlbnQgYmFzaWMgcmF0ZQotCi1Db21tYW5kLVJzcCBNb2RlCi0KLSovCi1zdHJ1Y3QgZ2V0YmFzaWNyYXRlX3Bhcm0gewotCXUzMiByc3ZkOwotfTsKLQotc3RydWN0IGdldGJhc2ljcmF0ZV9yc3AgewotCXU4IGJhc2ljcmF0ZXNbTnVtUmF0ZXNdOwotfTsKLQotLyoKLUNhbGxlciBNb2RlOiBBbnkKLQotTm90ZXM6IFRvIHNldHVwIHRoZSBkYXRhIHJhdGUgb2YgUlRMODcxMQotCi1Db21tYW5kIE1vZGUKLQotKi8KLXN0cnVjdCBzZXRkYXRhcmF0ZV9wYXJtIHsKLQl1OAltYWNfaWQ7Ci0JdTgJZGF0YXJhdGVzW051bVJhdGVzXTsKLX07Ci0KLS8qCi1DYWxsZXIgTW9kZTogQW55Ci0KLU5vdGVzOiBUbyByZWFkIHRoZSBjdXJyZW50IGRhdGEgcmF0ZQotCi1Db21tYW5kLVJzcCBNb2RlCi0KLSovCi1zdHJ1Y3QgZ2V0ZGF0YXJhdGVfcGFybSB7Ci0JdTMyIHJzdmQ7Ci19OwotCi1zdHJ1Y3QgZ2V0ZGF0YXJhdGVfcnNwIHsKLQl1OCBkYXRhcmF0ZXNbTnVtUmF0ZXNdOwotfTsKLQotCi0vKgotQ2FsbGVyIE1vZGU6IEFueQotQVA6IEFQIGNhbiB1c2UgdGhlIGluZm8gZm9yIHRoZSBjb250ZW50cyBvZiBiZWFjb24gZnJhbWUKLUluZnJhOiBTVEEgY2FuIHVzZSB0aGUgaW5mbyB3aGVuIHNpdGVzdXJ2ZXlpbmcKLUFkLUhvQyhNKTogTGlrZSBBUAotQWQtSG9DKEMpOiBMaWtlIFNUQQotCi0KLU5vdGVzOiBUbyBzZXQgdGhlIHBoeSBjYXBhYmlsaXR5IG9mIHRoZSBOSUMKLQotQ29tbWFuZCBNb2RlCi0KLSovCi0KLXN0cnVjdAlzZXRwaHlpbmZvX3Bhcm0gewotCXN0cnVjdCByZWd1bGF0b3J5X2NsYXNzIGNsYXNzX3NldHNbTlVNX1JFR1VMQVRPUllTXTsKLQl1OAlzdGF0dXM7Ci19OwotCi1zdHJ1Y3QJZ2V0cGh5aW5mb19wYXJtIHsKLQl1MzIgcnN2ZDsKLX07Ci0KLXN0cnVjdAlnZXRwaHlpbmZvX3JzcCB7Ci0Jc3RydWN0IHJlZ3VsYXRvcnlfY2xhc3MgY2xhc3Nfc2V0c1tOVU1fUkVHVUxBVE9SWVNdOwotCXU4CXN0YXR1czsKLX07Ci0KLS8qCi1DYWxsZXIgTW9kZTogQW55Ci0KLU5vdGVzOiBUbyBzZXQgdGhlIGNoYW5uZWwvbW9kZW0vYmFuZAotVGhpcyBjb21tYW5kIHdpbGwgYmUgdXNlZCB3aGVuIGNoYW5uZWwvbW9kZW0vYmFuZCBpcyBjaGFuZ2VkLgotCi1Db21tYW5kIE1vZGUKLQotKi8KLXN0cnVjdAlzZXRwaHlfcGFybSB7Ci0JdTgJcmZjaGFubmVsOwotCXU4CW1vZGVtOwotfTsKLQotLyoKLUNhbGxlciBNb2RlOiBBbnkKLQotTm90ZXM6IFRvIGdldCB0aGUgY3VycmVudCBzZXR0aW5nIG9mIGNoYW5uZWwvbW9kZW0vYmFuZAotCi1Db21tYW5kLVJzcCBNb2RlCi0KLSovCi1zdHJ1Y3QJZ2V0cGh5X3Bhcm0gewotCXUzMiByc3ZkOwotfTsKLQotc3RydWN0CWdldHBoeV9yc3AgewotCXU4CXJmY2hhbm5lbDsKLQl1OAltb2RlbTsKLX07Ci0KLXN0cnVjdCByZWFkQkJfcGFybSB7Ci0JdTgJb2Zmc2V0OwotfTsKLQotc3RydWN0IHJlYWRCQl9yc3AgewotCXU4CXZhbHVlOwotfTsKLQotc3RydWN0IHJlYWRUU1NJX3Bhcm0gewotCXU4CW9mZnNldDsKLX07Ci0KLXN0cnVjdCByZWFkVFNTSV9yc3AgewotCXU4CXZhbHVlOwotfTsKLQotc3RydWN0IHdyaXRlQkJfcGFybSB7Ci0JdTgJb2Zmc2V0OwotCXU4CXZhbHVlOwotfTsKLQotc3RydWN0IHJlYWRSRl9wYXJtIHsKLQl1OAlvZmZzZXQ7Ci19OwotCi1zdHJ1Y3QgcmVhZFJGX3JzcCB7Ci0JdTMyCXZhbHVlOwotfTsKLQotc3RydWN0IHdyaXRlUkZfcGFybSB7Ci0JdTMyCW9mZnNldDsKLQl1MzIJdmFsdWU7Ci19OwotCi1zdHJ1Y3QgZ2V0cmZpbnRmc19wYXJtIHsKLQl1OAlyZmludGZzOwotfTsKLQotc3RydWN0IFR4X0JlYWNvbl9wYXJhbSB7Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggbmV0d29yazsKLX07Ci0KLS8qICBDTUQgcGFyYW0gRm9ybWFydCBmb3IgZHJpdmVyIGV4dHJhIGNtZCBoYW5kbGVyICovCi1zdHJ1Y3QgZHJ2ZXh0cmFfY21kX3Bhcm0gewotCWludCBlY19pZDsgLyogZXh0cmEgY21kIGlkICovCi0JaW50IHR5cGVfc2l6ZTsgLyogIENhbiB1c2UgdGhpcyBmaWVsZCBhcyB0aGUgdHlwZSBpZCBvciBjb21tYW5kIHNpemUgKi8KLQl1bnNpZ25lZCBjaGFyICpwYnVmOwotfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tIEJlbG93IGFyZSB1c2VkIGZvciBSRi9CQiB0dW5uaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0cnVjdAlzZXRhbnRlbm5hX3Bhcm0gewotCXU4CXR4X2FudHNldDsKLQl1OAlyeF9hbnRzZXQ7Ci0JdTgJdHhfYW50ZW5uYTsKLQl1OAlyeF9hbnRlbm5hOwotfTsKLQotc3RydWN0CWVucmF0ZWFkYXB0aXZlX3Bhcm0gewotCXUzMgllbjsKLX07Ci0KLXN0cnVjdCBzZXR0eGFnY3RibF9wYXJtIHsKLQl1MzIJdHhhZ2NbTUFYX1JBVEVTX0xFTkdUSF07Ci19OwotCi1zdHJ1Y3QgZ2V0dHhhZ2N0YmxfcGFybSB7Ci0JdTMyIHJzdmQ7Ci19OwotCi1zdHJ1Y3QgZ2V0dHhhZ2N0YmxfcnNwIHsKLQl1MzIJdHhhZ2NbTUFYX1JBVEVTX0xFTkdUSF07Ci19OwotCi1zdHJ1Y3Qgc2V0YWdjY3RybF9wYXJtIHsKLQl1MzIJYWdjY3RybDsJCS8qICAwOiBwdXJlIGh3LCAxOiBmdyAqLwotfTsKLQotc3RydWN0IHNldHNzdXBfcGFybQl7Ci0JdTMyCXNzX0ZvcmNlVXBbTUFYX1JBVEVTX0xFTkdUSF07Ci19OwotCi1zdHJ1Y3QgZ2V0c3N1cF9wYXJtCXsKLQl1MzIgcnN2ZDsKLX07Ci0KLXN0cnVjdCBnZXRzc3VwX3JzcAl7Ci0JdTgJc3NfRm9yY2VVcFtNQVhfUkFURVNfTEVOR1RIXTsKLX07Ci0KLXN0cnVjdCBzZXRzc2RsZXZlbF9wYXJtCXsKLQl1OAlzc19ETGV2ZWxbTUFYX1JBVEVTX0xFTkdUSF07Ci19OwotCi1zdHJ1Y3QgZ2V0c3NkbGV2ZWxfcGFybQl7Ci0JdTMyIHJzdmQ7Ci19OwotCi1zdHJ1Y3QgZ2V0c3NkbGV2ZWxfcnNwCXsKLQl1OAlzc19ETGV2ZWxbTUFYX1JBVEVTX0xFTkdUSF07Ci19OwotCi1zdHJ1Y3Qgc2V0c3N1bGV2ZWxfcGFybQl7Ci0JdTgJc3NfVUxldmVsW01BWF9SQVRFU19MRU5HVEhdOwotfTsKLQotc3RydWN0IGdldHNzdWxldmVsX3Bhcm0JewotCXUzMiByc3ZkOwotfTsKLQotc3RydWN0IGdldHNzdWxldmVsX3JzcAl7Ci0JdTgJc3NfVUxldmVsW01BWF9SQVRFU19MRU5HVEhdOwotfTsKLQotc3RydWN0CXNldGNvdW50anVkZ2VfcGFybSB7Ci0JdTgJY291bnRfanVkZ2VbTUFYX1JBVEVTX0xFTkdUSF07Ci19OwotCi1zdHJ1Y3QJZ2V0Y291bnRqdWRnZV9wYXJtIHsKLQl1MzIgcnN2ZDsKLX07Ci0KLXN0cnVjdAlnZXRjb3VudGp1ZGdlX3JzcCB7Ci0JdTgJY291bnRfanVkZ2VbTUFYX1JBVEVTX0xFTkdUSF07Ci19OwotCi1zdHJ1Y3Qgc2V0cmF0YWJsZV9wYXJtIHsKLQl1OCBzc19Gb3JjZVVwW051bVJhdGVzXTsKLQl1OCBzc19VTGV2ZWxbTnVtUmF0ZXNdOwotCXU4IHNzX0RMZXZlbFtOdW1SYXRlc107Ci0JdTggY291bnRfanVkZ2VbTnVtUmF0ZXNdOwotfTsKLQotc3RydWN0IGdldHJhdGFibGVfcGFybSB7Ci0JdWludCByc3ZkOwotfTsKLQotc3RydWN0IGdldHJhdGFibGVfcnNwIHsKLQl1OCBzc19Gb3JjZVVwW051bVJhdGVzXTsKLQl1OCBzc19VTGV2ZWxbTnVtUmF0ZXNdOwotCXU4IHNzX0RMZXZlbFtOdW1SYXRlc107Ci0JdTggY291bnRfanVkZ2VbTnVtUmF0ZXNdOwotfTsKLQotLyogdG8gZ2V0IFRYLFJYIHJldHJ5IGNvdW50ICovCi1zdHJ1Y3QgZ2V0dHhyZXRyeWNudF9wYXJtewotCXVuc2lnbmVkIGludCByc3ZkOwotfTsKLXN0cnVjdCBnZXR0eHJldHJ5Y250X3JzcHsKLQl1bnNpZ25lZCBsb25nIHR4X3JldHJ5Y250OwotfTsKLQotc3RydWN0IGdldHJ4cmV0cnljbnRfcGFybXsKLQl1bnNpZ25lZCBpbnQgcnN2ZDsKLX07Ci1zdHJ1Y3QgZ2V0cnhyZXRyeWNudF9yc3B7Ci0JdW5zaWduZWQgbG9uZyByeF9yZXRyeWNudDsKLX07Ci0KLS8qIHRvIGdldCBCQ05PSyxCQ05FUlIgY291bnQgKi8KLXN0cnVjdCBnZXRiY25va2NudF9wYXJtewotCXVuc2lnbmVkIGludCByc3ZkOwotfTsKLXN0cnVjdCBnZXRiY25va2NudF9yc3B7Ci0JdW5zaWduZWQgbG9uZyAgYmNub2tjbnQ7Ci19OwotCi1zdHJ1Y3QgZ2V0YmNuZXJyY250X3Bhcm17Ci0JdW5zaWduZWQgaW50IHJzdmQ7Ci19Owotc3RydWN0IGdldGJjbmVycmNudF9yc3B7Ci0JdW5zaWduZWQgbG9uZyBiY25lcnJjbnQ7Ci19OwotCi0vKiAgdG8gZ2V0IGN1cnJlbnQgVFggcG93ZXIgbGV2ZWwgKi8KLXN0cnVjdCBnZXRjdXJ0eHB3cmxldmVsX3Bhcm17Ci0JdW5zaWduZWQgaW50IHJzdmQ7Ci19OwotCi1zdHJ1Y3QgZ2V0Y3VydHhwd3JsZXZlbF9yc3B7Ci0JdW5zaWduZWQgc2hvcnQgdHhfcG93ZXI7Ci19OwotCi1zdHJ1Y3Qgc2V0cHJvYmVyZXFleHRyYWllX3Bhcm0gewotCXVuc2lnbmVkIGNoYXIgZV9pZDsKLQl1bnNpZ25lZCBjaGFyIGllX2xlbjsKLQl1bnNpZ25lZCBjaGFyIGllWzBdOwotfTsKLQotc3RydWN0IHNldGFzc29jcmVxZXh0cmFpZV9wYXJtIHsKLQl1bnNpZ25lZCBjaGFyIGVfaWQ7Ci0JdW5zaWduZWQgY2hhciBpZV9sZW47Ci0JdW5zaWduZWQgY2hhciBpZVswXTsKLX07Ci0KLXN0cnVjdCBzZXRwcm9iZXJzcGV4dHJhaWVfcGFybSB7Ci0JdW5zaWduZWQgY2hhciBlX2lkOwotCXVuc2lnbmVkIGNoYXIgaWVfbGVuOwotCXVuc2lnbmVkIGNoYXIgaWVbMF07Ci19OwotCi1zdHJ1Y3Qgc2V0YXNzb2Nyc3BleHRyYWllX3Bhcm0gewotCXVuc2lnbmVkIGNoYXIgZV9pZDsKLQl1bnNpZ25lZCBjaGFyIGllX2xlbjsKLQl1bnNpZ25lZCBjaGFyIGllWzBdOwotfTsKLQotc3RydWN0IGFkZEJhUmVxX3Bhcm0gewotCXVuc2lnbmVkIGludCB0aWQ7Ci0JdTgJYWRkcltFVEhfQUxFTl07Ci19OwotCi0vKkgyQyBIYW5kbGVyIGluZGV4OiA0NiAqLwotc3RydWN0IHNldF9jaF9wYXJtIHsKLQl1OCBjaDsKLQl1OCBidzsKLQl1OCBjaF9vZmZzZXQ7Ci19OwotCi0vKkgyQyBIYW5kbGVyIGluZGV4OiA1OSAqLwotc3RydWN0IFNldENoYW5uZWxQbGFuX3BhcmFtIHsKLQl1OCBjaGFubmVsX3BsYW47Ci19OwotCi0vKkgyQyBIYW5kbGVyIGluZGV4OiA2MCAqLwotc3RydWN0IExlZEJsaW5rX3BhcmFtIHsKLQlzdHJ1Y3QgbGVkXzg3MjNhICpwTGVkOwotfTsKLQotLypIMkMgSGFuZGxlciBpbmRleDogNjEgKi8KLXN0cnVjdCBTZXRDaGFubmVsU3dpdGNoX3BhcmFtIHsKLQl1OCBuZXdfY2hfbm87Ci19OwotCi0vKkgyQyBIYW5kbGVyIGluZGV4OiA2MiAqLwotc3RydWN0IFRETFNvcHRpb25fcGFyYW0gewotCXU4IGFkZHJbRVRIX0FMRU5dOwotCXU4IG9wdGlvbjsKLX07Ci0KLSNkZWZpbmUgR0VOX0NNRF9DT0RFKGNtZCkJY21kICMjIF9DTURfCi0KLQotLyoKLQotUmVzdWx0OgotMHgwMDogc3VjY2VzcwotMHgwMTogc3VjY2VzcywgYW5kIGNoZWNrIFJlc3BvbnNlLgotMHgwMjogY21kIGlnbm9yZWQgZHVlIHRvIGR1cGxpY2F0ZWQgc2VxdWNuZSBudW1iZXIKLTB4MDM6IGNtZCBkcm9wcGVkIGR1ZSB0byBpbnZhbGlkIGNtZCBjb2RlCi0weDA0OiByZXNlcnZlZC4KLQotKi8KLQotI2RlZmluZSBIMkNfUlNQX09GRlNFVAkJCTUxMgotCi0jZGVmaW5lIEgyQ19TVUNDRVNTCQkJMHgwMAotI2RlZmluZSBIMkNfU1VDQ0VTU19SU1AJCQkweDAxCi0jZGVmaW5lIEgyQ19EVVBMSUNBVEVECQkJMHgwMgotI2RlZmluZSBIMkNfRFJPUFBFRAkJCTB4MDMKLSNkZWZpbmUgSDJDX1BBUkFNRVRFUlNfRVJST1IJCTB4MDQKLSNkZWZpbmUgSDJDX1JFSkVDVEVECQkJMHgwNQotI2RlZmluZSBIMkNfQ01EX09WRVJGTE9XCQkweDA2Ci0jZGVmaW5lIEgyQ19SRVNFUlZFRAkJCTB4MDcKLQotaW50IHJ0d19zZXRhc3NvY3N0YV9jbWQoc3RydWN0IHJ0d19hZGFwdGVyICAqcGFkYXB0ZXIsIHU4ICptYWNfYWRkcik7Ci1pbnQgcnR3X3NldHN0YW5kYnlfY21kKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHVpbnQgYWN0aW9uKTsKLWludCBydHdfc2l0ZXN1cnZleV9jbWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICAqcGFkYXB0ZXIsIHN0cnVjdCBjZmc4MDIxMV9zc2lkICpzc2lkLCBpbnQgc3NpZF9udW0sIHN0cnVjdCBydHdfaWVlZTgwMjExX2NoYW5uZWwgKmNoLCBpbnQgY2hfbnVtKTsKLWludCBydHdfY3JlYXRlYnNzX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgICpwYWRhcHRlcik7Ci1pbnQgcnR3X2NyZWF0ZWJzc19jbWQyM2FfZXgoc3RydWN0IHJ0d19hZGFwdGVyICAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgKnBic3MsIHVuc2lnbmVkIGludCBzeik7Ci1pbnQgcnR3X3NldHBoeV9jbWQoc3RydWN0IHJ0d19hZGFwdGVyICAqcGFkYXB0ZXIsIHU4IG1vZGVtLCB1OCBjaCk7Ci1pbnQgcnR3X3NldHN0YWtleV9jbWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICAqcGFkYXB0ZXIsIHU4ICpwc3RhLCB1OCB1bmljYXN0X2tleSk7Ci1pbnQgcnR3X2NsZWFyc3Rha2V5X2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcHN0YSwgdTggZW50cnksIHU4IGVucXVldWUpOwotaW50IHJ0d19qb2luYnNzX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgICpwYWRhcHRlciwgc3RydWN0IHdsYW5fbmV0d29yayogcG5ldHdvcmspOwotaW50IHJ0d19kaXNhc3NvY19jbWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIGRlYXV0aF90aW1lb3V0X21zLCBib29sIGVucXVldWUpOwotaW50IHJ0d19zZXRvcG1vZGVfY21kMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGVudW0gbmw4MDIxMV9pZnR5cGUgaWZtb2RlKTsKLWludCBydHdfc2V0ZGF0YXJhdGVfY21kKHN0cnVjdCBydHdfYWRhcHRlciAgKnBhZGFwdGVyLCB1OCAqcmF0ZXNldCk7Ci1pbnQgcnR3X3NldGJhc2ljcmF0ZV9jbWQoc3RydWN0IHJ0d19hZGFwdGVyICAqcGFkYXB0ZXIsIHU4ICpyYXRlc2V0KTsKLWludCBydHdfc2V0YmJyZWdfY21kKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IG9mZnNldCwgdTggdmFsKTsKLWludCBydHdfc2V0cmZyZWdfY21kKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IG9mZnNldCwgdTMyIHZhbCk7Ci1pbnQgcnR3X2dldGJicmVnX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBvZmZzZXQsIHU4ICpwdmFsKTsKLWludCBydHdfZ2V0cmZyZWdfY21kKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IG9mZnNldCwgdTggKnB2YWwpOwotaW50IHJ0d19zZXRyZmludGZzX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgICpwYWRhcHRlciwgdTggbW9kZSk7Ci1pbnQgcnR3X3NldHJ0dGJsX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgICpwYWRhcHRlciwgc3RydWN0IHNldHJhdGFibGVfcGFybSAqcHJhdGVfdGFibGUpOwotaW50IHJ0d19nZXRydHRibF9jbWQoc3RydWN0IHJ0d19hZGFwdGVyICAqcGFkYXB0ZXIsIHN0cnVjdCBnZXRyYXRhYmxlX3JzcCAqcHZhbCk7Ci0KLWludCBydHdfZ2V0dHNzaV9jbWQoc3RydWN0IHJ0d19hZGFwdGVyICAqcGFkYXB0ZXIsIHU4IG9mZnNldCwgdTggKnB2YWwpOwotaW50IHJ0d19zZXRmd2RpZ19jbWQoc3RydWN0IHJ0d19hZGFwdGVyKnBhZGFwdGVyLCB1OCB0eXBlKTsKLWludCBydHdfc2V0ZndyYV9jbWQoc3RydWN0IHJ0d19hZGFwdGVyKnBhZGFwdGVyLCB1OCB0eXBlKTsKLQotaW50IHJ0d19hZGRiYXJlcV9jbWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyKnBhZGFwdGVyLCB1OCB0aWQsIHU4ICphZGRyKTsKLQotaW50IHJ0d19keW5hbWljX2Noa193a19jbWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKTsKLQotaW50IHJ0d19scHNfY3RybF93a19jbWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyKnBhZGFwdGVyLCB1OCBscHNfY3RybF90eXBlLCB1OCBlbnF1ZXVlKTsKLQotaW50IHJ0d19wc19jbWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyKnBhZGFwdGVyKTsKLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotaW50IHJ0d19jaGtfaGlfcXVldWVfY21kMjNhKHN0cnVjdCBydHdfYWRhcHRlcipwYWRhcHRlcik7Ci0jZW5kaWYKLQotaW50IHJ0d19zZXRfY2hwbGFuX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIqcGFkYXB0ZXIsIHU4IGNocGxhbiwgdTggZW5xdWV1ZSk7Ci1pbnQgcnR3X2xlZF9ibGlua19jbWQoc3RydWN0IHJ0d19hZGFwdGVyKnBhZGFwdGVyLCBzdHJ1Y3QgbGVkXzg3MjNhICpwTGVkKTsKLWludCBydHdfc2V0X2NzYV9jbWQoc3RydWN0IHJ0d19hZGFwdGVyKnBhZGFwdGVyLCB1OCBuZXdfY2hfbm8pOwotCi1pbnQgcnR3X2MyaF93a19jbWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKmMyaF9ldnQpOwotCi1pbnQgcnR3X2RydmV4dHJhX2NtZF9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotCi12b2lkIHJ0d19zdXJ2ZXlfY21kX2NhbGxiYWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAgKnBhZGFwdGVyLCBzdHJ1Y3QgY21kX29iaiAqcGNtZCk7Ci12b2lkIHJ0d19kaXNhc3NvY19jbWQyM2FfY2FsbGJhY2soc3RydWN0IHJ0d19hZGFwdGVyICAqcGFkYXB0ZXIsIHN0cnVjdCBjbWRfb2JqICpwY21kKTsKLXZvaWQgcnR3X2pvaW5ic3NfY21kMjNhX2NhbGxiYWNrKHN0cnVjdCBydHdfYWRhcHRlciAgKnBhZGFwdGVyLCBzdHJ1Y3QgY21kX29iaiAqcGNtZCk7Ci12b2lkIHJ0d19jcmVhdGVic3NfY21kMjNhX2NhbGxiYWNrKHN0cnVjdCBydHdfYWRhcHRlciAgKnBhZGFwdGVyLCBzdHJ1Y3QgY21kX29iaiAqcGNtZCk7Ci12b2lkIHJ0d19nZXRiYnJmcmVnX2NtZHJzcF9jYWxsYmFjazIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgICpwYWRhcHRlciwgc3RydWN0IGNtZF9vYmogKnBjbWQpOwotCi12b2lkIHJ0d19zZXRzdGFLZXlfY21kcnNwX2NhbGxiYWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAgKnBhZGFwdGVyLCAgc3RydWN0IGNtZF9vYmogKnBjbWQpOwotdm9pZCBydHdfc2V0YXNzb2NzdGFfY21kcnNwX2NhbGxiYWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAgKnBhZGFwdGVyLCAgc3RydWN0IGNtZF9vYmogKnBjbWQpOwotCi1zdHJ1Y3QgX2NtZF9jYWxsYmFjayB7Ci0JdTMyCWNtZF9jb2RlOwotCXZvaWQgKCpjYWxsYmFjaykoc3RydWN0IHJ0d19hZGFwdGVyICAqcGFkYXB0ZXIsIHN0cnVjdCBjbWRfb2JqICpjbWQpOwotfTsKLQotZW51bSBydHdfaDJjX2NtZCB7Ci0JR0VOX0NNRF9DT0RFKF9SZWFkX01BQ1JFRykgLAkvKjAqLwotCUdFTl9DTURfQ09ERShfV3JpdGVfTUFDUkVHKSAsCi0JR0VOX0NNRF9DT0RFKF9SZWFkX0JCUkVHKSAsCi0JR0VOX0NNRF9DT0RFKF9Xcml0ZV9CQlJFRykgLAotCUdFTl9DTURfQ09ERShfUmVhZF9SRlJFRykgLAotCUdFTl9DTURfQ09ERShfV3JpdGVfUkZSRUcpICwgLyo1Ki8KLQlHRU5fQ01EX0NPREUoX1JlYWRfRUVQUk9NKSAsCi0JR0VOX0NNRF9DT0RFKF9Xcml0ZV9FRVBST00pICwKLQlHRU5fQ01EX0NPREUoX1JlYWRfRUZVU0UpICwKLQlHRU5fQ01EX0NPREUoX1dyaXRlX0VGVVNFKSAsCi0KLQlHRU5fQ01EX0NPREUoX1JlYWRfQ0FNKSAsCS8qMTAqLwotCUdFTl9DTURfQ09ERShfV3JpdGVfQ0FNKSAsCi0JR0VOX0NNRF9DT0RFKF9zZXRCQ05JVFYpLAotCUdFTl9DTURfQ09ERShfc2V0TUJJRENGRyksCi0JR0VOX0NNRF9DT0RFKF9Kb2luQnNzKSwgICAvKjE0Ki8KLQlHRU5fQ01EX0NPREUoX0Rpc0Nvbm5lY3QpICwgLyoxNSovCi0JR0VOX0NNRF9DT0RFKF9DcmVhdGVCc3MpICwKLQlHRU5fQ01EX0NPREUoX1NldE9wTW9kZSkgLAotCUdFTl9DTURfQ09ERShfU2l0ZVN1cnZleSksICAvKjE4Ki8KLQlHRU5fQ01EX0NPREUoX1NldEF1dGgpICwKLQotCUdFTl9DTURfQ09ERShfU2V0S2V5KSAsCS8qMjAqLwotCUdFTl9DTURfQ09ERShfU2V0U3RhS2V5KSAsCi0JR0VOX0NNRF9DT0RFKF9TZXRBc3NvY1N0YSkgLAotCUdFTl9DTURfQ09ERShfRGVsQXNzb2NTdGEpICwKLQlHRU5fQ01EX0NPREUoX1NldFN0YVB3clN0YXRlKSAsCi0JR0VOX0NNRF9DT0RFKF9TZXRCYXNpY1JhdGUpICwgLyoyNSovCi0JR0VOX0NNRF9DT0RFKF9HZXRCYXNpY1JhdGUpICwKLQlHRU5fQ01EX0NPREUoX1NldERhdGFSYXRlKSAsCi0JR0VOX0NNRF9DT0RFKF9HZXREYXRhUmF0ZSkgLAotCUdFTl9DTURfQ09ERShfU2V0UGh5SW5mbykgLAotCi0JR0VOX0NNRF9DT0RFKF9HZXRQaHlJbmZvKSAsCS8qMzAqLwotCUdFTl9DTURfQ09ERShfU2V0UGh5KSAsCi0JR0VOX0NNRF9DT0RFKF9HZXRQaHkpICwKLQlHRU5fQ01EX0NPREUoX3JlYWRSc3NpKSAsCi0JR0VOX0NNRF9DT0RFKF9yZWFkR2FpbikgLAotCUdFTl9DTURfQ09ERShfU2V0QXRpbSkgLCAvKjM1Ki8KLQlHRU5fQ01EX0NPREUoX1NldFB3ck1vZGUpICwKLQlHRU5fQ01EX0NPREUoX0pvaW5ic3NScHQpLAotCUdFTl9DTURfQ09ERShfU2V0UmFUYWJsZSkgLAotCUdFTl9DTURfQ09ERShfR2V0UmFUYWJsZSkgLAotCi0JR0VOX0NNRF9DT0RFKF9HZXRDQ1hSZXBvcnQpLCAvKjQwKi8KLQlHRU5fQ01EX0NPREUoX0dldERUTVJlcG9ydCksCi0JR0VOX0NNRF9DT0RFKF9HZXRUWFJhdGVTdGF0aXN0aWNzKSwKLQlHRU5fQ01EX0NPREUoX1NldFVzYlN1c3BlbmQpLAotCUdFTl9DTURfQ09ERShfU2V0SDJjTGJrKSwKLQlHRU5fQ01EX0NPREUoX0FkZEJBUmVxKSAsIC8qNDUqLwotCUdFTl9DTURfQ09ERShfU2V0Q2hhbm5lbCksIC8qNDYqLwotCUdFTl9DTURfQ09ERShfU2V0VHhQb3dlciksCi0JR0VOX0NNRF9DT0RFKF9Td2l0Y2hBbnRlbm5hKSwKLQlHRU5fQ01EX0NPREUoX1NldENyeXN0YWxDYXApLAotCUdFTl9DTURfQ09ERShfU2V0U2luZ2xlQ2FycmllclR4KSwgLyo1MCovCi0KLQlHRU5fQ01EX0NPREUoX1NldFNpbmdsZVRvbmVUeCksLyo1MSovCi0JR0VOX0NNRF9DT0RFKF9TZXRDYXJyaWVyU3VwcHJlc3Npb25UeCksCi0JR0VOX0NNRF9DT0RFKF9TZXRDb250aW51b3VzVHgpLAotCUdFTl9DTURfQ09ERShfU3dpdGNoQmFuZHdpZHRoKSwgLyo1NCovCi0JR0VOX0NNRF9DT0RFKF9UWF9CZWFjb24pLCAvKjU1Ki8KLQotCUdFTl9DTURfQ09ERShfU2V0X01MTUVfRVZUKSwgLyo1NiovCi0JR0VOX0NNRF9DT0RFKF9TZXRfRHJ2X0V4dHJhKSwgLyo1NyovCi0JR0VOX0NNRF9DT0RFKF9TZXRfSDJDX01TRyksIC8qNTgqLwotCi0JR0VOX0NNRF9DT0RFKF9TZXRDaGFubmVsUGxhbiksIC8qNTkqLwotCUdFTl9DTURfQ09ERShfTGVkQmxpbmspLCAvKjYwKi8KLQotCUdFTl9DTURfQ09ERShfU2V0Q2hhbm5lbFN3aXRjaCksIC8qNjEqLwotCUdFTl9DTURfQ09ERShfVERMUyksIC8qNjIqLwotCi0JTUFYX0gyQ0NNRAotfTsKLQotZXh0ZXJuIHN0cnVjdCBfY21kX2NhbGxiYWNrCXJ0d19jbWRfY2FsbGJhY2tbXTsKLQotI2VuZGlmIC8qICBfQ01EX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2RlYnVnLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2RlYnVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1OTE4M2UuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19kZWJ1Zy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19SVFdfREVCVUdfSF9fCi0jZGVmaW5lIF9fUlRXX0RFQlVHX0hfXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotCi0jZGVmaW5lIF9kcnZfYWx3YXlzXwkJCTEKLSNkZWZpbmUgX2Rydl9lbWVyZ18JCQkyCi0jZGVmaW5lIF9kcnZfYWxlcnRfCQkJMwotI2RlZmluZSBfZHJ2X2Vycl8JCQk0Ci0jZGVmaW5lCV9kcnZfd2FybmluZ18JCQk1Ci0jZGVmaW5lIF9kcnZfbm90aWNlXwkJCTYKLSNkZWZpbmUgX2Rydl9pbmZvXwkJCTcKLSNkZWZpbmUJX2Rydl9kZWJ1Z18JCQk4Ci0KLSNkZWZpbmUgX21vZHVsZV9ydGw4NzF4X3htaXRfY18JCUJJVCgwKQotI2RlZmluZSBfbW9kdWxlX3htaXRfb3NkZXBfY18JCUJJVCgxKQotI2RlZmluZSBfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXwkJQklUKDIpCi0jZGVmaW5lIF9tb2R1bGVfcmVjdl9vc2RlcF9jXwkJQklUKDMpCi0jZGVmaW5lIF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfCQlCSVQoNCkKLSNkZWZpbmUgX21vZHVsZV9tbG1lX29zZGVwX2NfCQlCSVQoNSkKLSNkZWZpbmUgX21vZHVsZV9ydGw4NzF4X3N0YV9tZ3RfY18JQklUKDYpCi0jZGVmaW5lIF9tb2R1bGVfcnRsODcxeF9jbWRfY18JCUJJVCg3KQotI2RlZmluZSBfbW9kdWxlX2NtZF9vc2RlcF9jXwkJQklUKDgpCi0jZGVmaW5lIF9tb2R1bGVfcnRsODcxeF9pb19jXwkJQklUKDkpCi0jZGVmaW5lIF9tb2R1bGVfaW9fb3NkZXBfY18JCUJJVCgxMCkKLSNkZWZpbmUgX21vZHVsZV9vc19pbnRmc19jXwkJQklUKDExKQotI2RlZmluZSBfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18JQklUKDEyKQotI2RlZmluZSBfbW9kdWxlX3J0bDg3MXhfZWVwcm9tX2NfCUJJVCgxMykKLSNkZWZpbmUgX21vZHVsZV9oYWxfaW5pdF9jXwkJQklUKDE0KQotI2RlZmluZSBfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXwkJQklUKDE1KQotI2RlZmluZSBfbW9kdWxlX3J0bDg3MXhfaW9jdGxfY18JQklUKDE2KQotI2RlZmluZSBfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfCUJJVCgxNykKLSNkZWZpbmUgX21vZHVsZV9ydGw4NzF4X2lvY3RsX3F1ZXJ5X2NfCUJJVCgxOCkKLSNkZWZpbmUgX21vZHVsZV9ydGw4NzF4X3B3cmN0cmxfY18JQklUKDE5KQotI2RlZmluZSBfbW9kdWxlX2hjaV9pbnRmc19jXwkJQklUKDIwKQotI2RlZmluZSBfbW9kdWxlX2hjaV9vcHNfY18JCUJJVCgyMSkKLSNkZWZpbmUgX21vZHVsZV9vc2RlcF9zZXJ2aWNlX2NfCUJJVCgyMikKLSNkZWZpbmUgX21vZHVsZV9tcF8JCQlCSVQoMjMpCi0jZGVmaW5lIF9tb2R1bGVfaGNpX29wc19vc19jXwkJQklUKDI0KQotI2RlZmluZSBfbW9kdWxlX3J0bDg3MXhfaW9jdGxfb3NfYwlCSVQoMjUpCi0jZGVmaW5lIF9tb2R1bGVfcnRsODcxMl9jbWRfY18JCUJJVCgyNikKLSNkZWZpbmUJX21vZHVsZV9ydGw4MTkyY194bWl0X2NfCUJJVCgyOCkKLSNkZWZpbmUgX21vZHVsZV9oYWxfeG1pdF9jXwkJQklUKDI4KSAvKiBkdXBsaWNhdGlvbiBpbnRlbnRpb25hbCAqLwotI2RlZmluZSBfbW9kdWxlX2VmdXNlXwkJCUJJVCgyOSkKLSNkZWZpbmUgX21vZHVsZV9ydGw4NzEyX3JlY3ZfY18JCUJJVCgzMCkKLSNkZWZpbmUgX21vZHVsZV9ydGw4NzEyX2xlZF9jXwkJQklUKDMxKQotCi0jdW5kZWYgX01PRFVMRV9ERUZJTkVfCi0KLSNpZiBkZWZpbmVkIF9SVFdfWE1JVF9DXwotCSNkZWZpbmUgX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfcnRsODcxeF94bWl0X2NfCi0jZWxpZiBkZWZpbmVkIF9YTUlUX09TREVQX0NfCi0JI2RlZmluZSBfTU9EVUxFX0RFRklORV8JX21vZHVsZV94bWl0X29zZGVwX2NfCi0jZWxpZiBkZWZpbmVkIF9SVFdfUkVDVl9DXwotCSNkZWZpbmUgX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfcnRsODcxeF9yZWN2X2NfCi0jZWxpZiBkZWZpbmVkIF9SRUNWX09TREVQX0NfCi0JI2RlZmluZSBfTU9EVUxFX0RFRklORV8JX21vZHVsZV9yZWN2X29zZGVwX2NfCi0jZWxpZiBkZWZpbmVkIF9SVFdfTUxNRV9DXwotCSNkZWZpbmUgX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfcnRsODcxeF9tbG1lX2NfCi0jZWxpZiBkZWZpbmVkIF9NTE1FX09TREVQX0NfCi0JI2RlZmluZSBfTU9EVUxFX0RFRklORV8JX21vZHVsZV9tbG1lX29zZGVwX2NfCi0jZWxpZiBkZWZpbmVkIF9SVFdfTUxNRV9FWFRfQ18KLQkjZGVmaW5lIF9NT0RVTEVfREVGSU5FXyAxCi0jZWxpZiBkZWZpbmVkIF9SVFdfU1RBX01HVF9DXwotCSNkZWZpbmUgX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfcnRsODcxeF9zdGFfbWd0X2NfCi0jZWxpZiBkZWZpbmVkIF9SVFdfQ01EX0NfCi0JI2RlZmluZSBfTU9EVUxFX0RFRklORV8JX21vZHVsZV9ydGw4NzF4X2NtZF9jXwotI2VsaWYgZGVmaW5lZCBfQ01EX09TREVQX0NfCi0JI2RlZmluZSBfTU9EVUxFX0RFRklORV8JX21vZHVsZV9jbWRfb3NkZXBfY18KLSNlbGlmIGRlZmluZWQgX1JUV19JT19DXwotCSNkZWZpbmUgX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfcnRsODcxeF9pb19jXwotI2VsaWYgZGVmaW5lZCBfSU9fT1NERVBfQ18KLQkjZGVmaW5lIF9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX2lvX29zZGVwX2NfCi0jZWxpZiBkZWZpbmVkIF9PU19JTlRGU19DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfb3NfaW50ZnNfY18KLSNlbGlmIGRlZmluZWQgX1JUV19TRUNVUklUWV9DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXwotI2VsaWYgZGVmaW5lZCBfUlRXX0VFUFJPTV9DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfcnRsODcxeF9lZXByb21fY18KLSNlbGlmIGRlZmluZWQgX0hBTF9JTlRGX0NfCi0JI2RlZmluZQlfTU9EVUxFX0RFRklORV8JX21vZHVsZV9oYWxfaW5pdF9jXwotI2VsaWYgKGRlZmluZWQgX0hDSV9IQUxfSU5JVF9DXykgfHwgKGRlZmluZWQgX1NESU9fSEFMSU5JVF9DXykKLQkjZGVmaW5lCV9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXwotI2VsaWYgZGVmaW5lZCBfUlRMODcxWF9JT0NUTF9DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfcnRsODcxeF9pb2N0bF9jXwotI2VsaWYgZGVmaW5lZCBfUlRMODcxWF9JT0NUTF9TRVRfQ18KLQkjZGVmaW5lCV9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfCi0jZWxpZiBkZWZpbmVkIF9SVEw4NzFYX0lPQ1RMX1FVRVJZX0NfCi0JI2RlZmluZQlfTU9EVUxFX0RFRklORV8JX21vZHVsZV9ydGw4NzF4X2lvY3RsX3F1ZXJ5X2NfCi0jZWxpZiBkZWZpbmVkIF9SVEw4NzFYX1BXUkNUUkxfQ18KLQkjZGVmaW5lCV9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX3J0bDg3MXhfcHdyY3RybF9jXwotI2VsaWYgZGVmaW5lZCBfUlRXX1BXUkNUUkxfQ18KLQkjZGVmaW5lCV9NT0RVTEVfREVGSU5FXwkxCi0jZWxpZiBkZWZpbmVkIF9IQ0lfSU5URl9DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfaGNpX2ludGZzX2NfCi0jZWxpZiBkZWZpbmVkIF9IQ0lfT1BTX0NfCi0JI2RlZmluZQlfTU9EVUxFX0RFRklORV8JX21vZHVsZV9oY2lfb3BzX2NfCi0jZWxpZiBkZWZpbmVkIF9TRElPX09QU19DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfIDEKLSNlbGlmIGRlZmluZWQgX09TREVQX0hDSV9JTlRGX0NfCi0JI2RlZmluZQlfTU9EVUxFX0RFRklORV8JX21vZHVsZV9oY2lfaW50ZnNfY18KLSNlbGlmIGRlZmluZWQgX09TREVQX1NFUlZJQ0VfQ18KLQkjZGVmaW5lCV9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX29zZGVwX3NlcnZpY2VfY18KLSNlbGlmIGRlZmluZWQgX0hDSV9PUFNfT1NfQ18KLQkjZGVmaW5lCV9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX2hjaV9vcHNfb3NfY18KLSNlbGlmIGRlZmluZWQgX1JUTDg3MVhfSU9DVExfTElOVVhfQ18KLQkjZGVmaW5lCV9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX3J0bDg3MXhfaW9jdGxfb3NfYwotI2VsaWYgZGVmaW5lZCBfUlRMODcxMl9DTURfQ18KLQkjZGVmaW5lCV9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX3J0bDg3MTJfY21kX2NfCi0jZWxpZiBkZWZpbmVkIF9SVEw4MTkyQ19YTUlUX0NfCi0JI2RlZmluZQlfTU9EVUxFX0RFRklORV8JMQotI2VsaWYgZGVmaW5lZCBfUlRMODcyM0FTX1hNSVRfQ18KLQkjZGVmaW5lCV9NT0RVTEVfREVGSU5FXwkxCi0jZWxpZiBkZWZpbmVkIF9SVEw4NzEyX1JFQ1ZfQ18KLQkjZGVmaW5lCV9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX3J0bDg3MTJfcmVjdl9jXwotI2VsaWYgZGVmaW5lZCBfUlRMODE5MkNVX1JFQ1ZfQ18KLQkjZGVmaW5lCV9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX3J0bDg3MTJfcmVjdl9jXwotI2VsaWYgZGVmaW5lZCBfUlRMODcxWF9NTE1FX0VYVF9DXwotCSNkZWZpbmUgX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfbWxtZV9vc2RlcF9jXwotI2VsaWYgZGVmaW5lZCBfUlRXX01QX0NfCi0JI2RlZmluZQlfTU9EVUxFX0RFRklORV8JX21vZHVsZV9tcF8KLSNlbGlmIGRlZmluZWQgX1JUV19NUF9JT0NUTF9DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfbXBfCi0jZWxpZiBkZWZpbmVkIF9SVFdfRUZVU0VfQ18KLQkjZGVmaW5lCV9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX2VmdXNlXwotI2VuZGlmCi0KLSNkZWZpbmUgRFJJVkVSX1BSRUZJWAkiUlRMODcyM0FVOiAiCi0jZGVmaW5lIERFQlVHX0xFVkVMCShfZHJ2X2Vycl8pCi0jZGVmaW5lIERCR184NzIzQV9MRVZFTChfbGV2ZWwsIGZtdCwgYXJnLi4uKQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlpZiAoX2xldmVsIDw9IEdsb2JhbERlYnVnTGV2ZWwyM0EpCQkJCVwKLQkJCXByX2luZm8oRFJJVkVSX1BSRUZJWCBmbXQsICMjYXJnKTtcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBEQkdfODcyM0EoLi4uKQkJCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlpZiAoX2Rydl9lcnJfIDw9IEdsb2JhbERlYnVnTGV2ZWwyM0EpCQkJXAotCQkJcHJfaW5mbyhEUklWRVJfUFJFRklYIF9fVkFfQVJHU19fKTsJCVwKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIE1TR184NzIzQSguLi4pCQkJCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCWlmIChfZHJ2X2Vycl8gPD0gR2xvYmFsRGVidWdMZXZlbDIzQSkJCQlcCi0JCQlwcl9pbmZvKERSSVZFUl9QUkVGSVggX19WQV9BUkdTX18pOwkJXAotCX0gd2hpbGUgKDApCi0KLWV4dGVybiB1MzIgR2xvYmFsRGVidWdMZXZlbDIzQTsKLQotX19wcmludGYoMywgNCkKLXZvaWQgcnRfdHJhY2UoaW50IGNvbXAsIGludCBsZXZlbCwgY29uc3QgY2hhciAqZm10LCAuLi4pOwotCi0jZGVmaW5lIFJUX1RSQUNFKF9Db21wLCBfTGV2ZWwsIEZtdCwgLi4uKQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCWlmIChfTGV2ZWwgPD0gR2xvYmFsRGVidWdMZXZlbDIzQSkJCQkJXAotCQlydF90cmFjZShfQ29tcCwgX0xldmVsLCBGbXQsICMjX19WQV9BUkdTX18pOwkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBSVF9QUklOVF9EQVRBKF9Db21wLCBfTGV2ZWwsIF9UaXRsZVN0cmluZywgX0hleERhdGEsCQlcCi0JCSAgICAgIF9IZXhEYXRhTGVuKQkJCQkJXAotCWlmIChfTGV2ZWwgPD0gR2xvYmFsRGVidWdMZXZlbDIzQSkgewkJCQlcCi0JCWludCBfX2k7CQkJCQkJXAotCQl1OAkqcHRyID0gKHU4ICopX0hleERhdGE7CQkJCVwKLQkJcHJfaW5mbygiJXMiLCBEUklWRVJfUFJFRklYKTsJCQkJXAotCQlwcl9pbmZvKF9UaXRsZVN0cmluZyk7CQkJCQlcCi0JCWZvciAoX19pID0gMDsgX19pIDwgKGludClfSGV4RGF0YUxlbjsgX19pKyspIHsJCVwKLQkJCXByaW50aygiJTAyWCVzIiwgcHRyW19faV0sCQkJXAotCQkJICAgICAgICgoKF9faSArIDEpICUgNCkgPT0gMCkgPyAiICAiIDogIiAiKTsJXAotCQkJaWYgKCgoX19pICsgMSkgJSAxNikgPT0gMCkJCQlcCi0JCQkJcHJpbnRrKCJcbiIpOwkJCQlcCi0JCX0JCQkJCQkJXAotCQlwcmludGsoIlxuIik7CQkJCQkJXAotCX0KLQotI2VuZGlmCS8qIF9fUlRXX0RFQlVHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19lZXByb20uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfZWVwcm9tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NmYzNmUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19lZXByb20uaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19SVFdfRUVQUk9NX0hfXwotI2RlZmluZSBfX1JUV19FRVBST01fSF9fCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0KLSNkZWZpbmUJUlRMODcxMl9FRVBST01fSUQJCQkweDg3MTIKLS8qIGRlZmluZQlFRVBST01fTUFYX1NJWkUJCQkyNTYgKi8KLQotI2RlZmluZQlIV1NFVF9NQVhfU0laRV81MTIJCTUxMgotI2RlZmluZQlFRVBST01fTUFYX1NJWkUJCQlIV1NFVF9NQVhfU0laRV81MTIKLQotI2RlZmluZQlDTE9DS19SQVRFCQkJCQk1MAkJCS8qIDEwMHVzICovCi0KLS8qICBFRVBST00gb3Bjb2RlcyAqLwotI2RlZmluZSBFRVBST01fUkVBRF9PUENPREUJCTA2Ci0jZGVmaW5lIEVFUFJPTV9XUklURV9PUENPREUJCTA1Ci0jZGVmaW5lIEVFUFJPTV9FUkFTRV9PUENPREUJCTA3Ci0jZGVmaW5lIEVFUFJPTV9FV0VOX09QQ09ERQkJMTkgICAgICAvKiAgRXJhc2Uvd3JpdGUgZW5hYmxlICovCi0jZGVmaW5lIEVFUFJPTV9FV0RTX09QQ09ERQkJMTYgICAgICAvKiAgRXJhc2Uvd3JpdGUgZGlzYWJsZSAqLwotCi0vKiBDb3VudHJ5IGNvZGVzICovCi0jZGVmaW5lIFVTQQkJCQkJCQkweDU1NTMyMAotI2RlZmluZSBFVVJPUEUJCQkJCQkweDEgLyogdGVtcCwgc2hvdWxkIGJlIHByb3ZpZGVkIGxhdGVyICovCi0jZGVmaW5lIEpBUEFOCQkJCQkJMHgyIC8qIHRlbXAsIHNob3VsZCBiZSBwcm92aWRlZCBsYXRlciAqLwotCi0jZGVmaW5lCUVFUFJPTV9DSURfREVGQVVMVAkJCTB4MAotI2RlZmluZQlFRVBST01fQ0lEX0FMUEhBCQkJCTB4MQotI2RlZmluZQlFRVBST01fQ0lEX1NlbmFvCQkJCTB4MwotI2RlZmluZQlFRVBST01fQ0lEX05ldENvcmUJCQkJMHg1Ci0jZGVmaW5lCUVFUFJPTV9DSURfQ0FNRU8JCQkJMFg4Ci0jZGVmaW5lCUVFUFJPTV9DSURfU0lURUNPTQkJCQkweDkKLSNkZWZpbmUJRUVQUk9NX0NJRF9DT1JFR0EJCQkJMHhCCi0jZGVmaW5lCUVFUFJPTV9DSURfRURJTUFYX0JFTEtJTgkJMHhDCi0jZGVmaW5lCUVFUFJPTV9DSURfU0VSQ09NTV9CRUxLSU4JCTB4RQotI2RlZmluZQlFRVBST01fQ0lEX0NBTUVPMQkJCQkweEYKLSNkZWZpbmUJRUVQUk9NX0NJRF9XTkNfQ09SRUdBCQkweDEyCi0jZGVmaW5lCUVFUFJPTV9DSURfQ0xFVk8JCQkJMHgxMwotI2RlZmluZQlFRVBST01fQ0lEX1dIUUwJCQkJMHhGRSAvKiAgYWRkZWQgYnkgY2hpeW9rbyBmb3IgZHRtLCAyMDA5MDEwOCAqLwotCi0vKiAgKi8KLS8qICBDdXN0b21lciBJRCwgbm90ZSB0aGF0OiAqLwotLyogIFRoaXMgdmFyaWFibGUgaXMgaW5pdGlhaWx6ZWQgdGhyb3VnaCBFRVBST00gb3IgcmVnaXN0cnksICovCi0vKiAgaG93ZXZlciwgaXRzIGRlZmluaXRpb24gbWF5IGJlIGRpZmZlcmVudCB3aXRoIHRoYXQgaW4gRUVQUk9NIGZvciAqLwotLyogIEVFUFJPTSBzaXplIGNvbnNpZGVyYXRpb24uIFNvLCB3ZSBoYXZlIHRvIHBlcmZvcm0gcHJvcGVyIHRyYW5zbGF0aW9uIGJldHdlZW4gdGhlbS4gKi8KLS8qICBCZXNpZGVzLCBDdXN0b21lcklEIG9mIHJlZ2lzdHJ5IGhhcyBwcmVjZWRlbmNlIG9mIHRoYXQgb2YgRUVQUk9NLiAqLwotLyogIGRlZmluZWQgYmVsb3cuIDA2MDcwMywgYnkgcmNuamtvLiAqLwotLyogICovCi1lbnVtIHJ0X2N1c3RvbWVyX2lkCi17Ci0JUlRfQ0lEX0RFRkFVTFQgPSAwLAotCVJUX0NJRF84MTg3X0FMUEhBMCA9IDEsCi0JUlRfQ0lEXzgxODdfU0VSQ09NTV9QUyA9IDIsCi0JUlRfQ0lEXzgxODdfSFdfTEVEID0gMywKLQlSVF9DSURfODE4N19ORVRHRUFSID0gNCwKLQlSVF9DSURfV0hRTCA9IDUsCi0JUlRfQ0lEXzgxOXhfQ0FNRU8gID0gNiwKLQlSVF9DSURfODE5eF9SVU5UT1AgPSA3LAotCVJUX0NJRF84MTl4X1NlbmFvID0gOCwKLQlSVF9DSURfVE9TSElCQSA9IDksCS8qICBNZXJnZSBieSBKYWNrZW4sIDIwMDgvMDEvMzEuICovCi0JUlRfQ0lEXzgxOXhfTmV0Y29yZSA9IDEwLAotCVJUX0NJRF9OZXR0cm9uaXggPSAxMSwKLQlSVF9DSURfRExJTksgPSAxMiwKLQlSVF9DSURfUFJPTkVUID0gMTMsCi0JUlRfQ0lEX0NPUkVHQSA9IDE0LAotCVJUX0NJRF9DSElOQV9NT0JJTEUgPSAxNSwKLQlSVF9DSURfODE5eF9BTFBIQSA9IDE2LAotCVJUX0NJRF84MTl4X1NpdGVjb20gPSAxNywKLQlSVF9DSURfQ0NYID0gMTgsIC8qICBJdCdzIHNldCB1bmRlciBDQ1ggbG9nbyB0ZXN0IGFuZCBpc24ndCBkZW1hbmRlZCBmb3IgQ0NYIGZ1bmN0aW9ucywgYnV0IGZvciB0ZXN0IGJlaGF2aW9yIGxpa2UgcmV0cnkgbGltaXQgYW5kIHR4IHJlcG9ydC4gQnkgQnJ1Y2UsIDIwMDktMDItMTcuICovCi0JUlRfQ0lEXzgxOXhfTGVub3ZvID0gMTksCi0JUlRfQ0lEXzgxOXhfUU1JID0gMjAsCi0JUlRfQ0lEXzgxOXhfRWRpbWF4X0JlbGtpbiA9IDIxLAotCVJUX0NJRF84MTl4X1NlcmNvbW1fQmVsa2luID0gMjIsCi0JUlRfQ0lEXzgxOXhfQ0FNRU8xID0gMjMsCi0JUlRfQ0lEXzgxOXhfTVNJID0gMjQsCi0JUlRfQ0lEXzgxOXhfQWNlciA9IDI1LAotCVJUX0NJRF84MTl4X0F6V2F2ZV9BU1VTID0gMjYsCi0JUlRfQ0lEXzgxOXhfQXpXYXZlID0gMjcsIC8qICBGb3IgQXpXYXZlIGluIFBDSWUsIFRoZSBJRCBpcyBBeldhdmUgdXNlIGFuZCBub3Qgb25seSBBc3VzICovCi0JUlRfQ0lEXzgxOXhfSFAgPSAyOCwKLQlSVF9DSURfODE5eF9XTkNfQ09SRUdBID0gMjksCi0JUlRfQ0lEXzgxOXhfQXJjYWR5YW5fQmVsa2luID0gMzAsCi0JUlRfQ0lEXzgxOXhfU0FNU1VORyA9IDMxLAotCVJUX0NJRF84MTl4X0NMRVZPID0gMzIsCi0JUlRfQ0lEXzgxOXhfREVMTCA9IDMzLAotCVJUX0NJRF84MTl4X1BST05FVFMgPSAzNCwKLQlSVF9DSURfODE5eF9FZGltYXhfQVNVUyA9IDM1LAotCVJUX0NJRF84MTl4X0NBTUVPX05FVEdFQVIgPSAzNiwKLQlSVF9DSURfUExBTkVYID0gMzcsCi0JUlRfQ0lEX0NDX0MgPSAzOCwKLQlSVF9DSURfODE5eF9YYXZpID0gMzksCi0JUlRfQ0lEXzgxOXhfRlVOQUlfVFYgPSA0MCwKLQlSVF9DSURfODE5eF9BTFBIQV9XRD00MSwKLX07Ci0KLXN0cnVjdCBlZXByb21fcHJpdiB7Ci0JdTgJCW1hY19hZGRyWzZdOwkvKiBQZXJtYW5lbnRBZGRyZXNzICovCi0JdTgJCWJhdXRvbG9hZF9mYWlsX2ZsYWc7Ci0JdTgJCWJsb2FkZmlsZV9mYWlsX2ZsYWc7Ci0JdTgJCWJsb2FkbWFjX2ZhaWxfZmxhZzsKLQkvKiB1OAkJYmVtcHR5OyAqLwotCS8qIHU4CQlzeXNfY29uZmlnOyAqLwotCS8qIHU4CQljb25maWcwOyAqLwotCXUxNgkJY2hhbm5lbF9wbGFuOwotCS8qIHU4CQljb3VudHJ5X3N0cmluZ1szXTsgKi8KLQkvKiB1OAkJdHhfcG93ZXJfYlsxNV07ICovCi0JLyogdTgJCXR4X3Bvd2VyX2dbMTVdOyAqLwotCS8qIHU4CQl0eF9wb3dlcl9hWzIwMV07ICovCi0KLQl1OAkJRWVwcm9tT3JFZnVzZTsKLQotCXU4CQllZnVzZV9lZXByb21fZGF0YVtIV1NFVF9NQVhfU0laRV81MTJdOyAvKiA5MkM6MjU2Ynl0ZXMsIDg4RTo1MTJieXRlcywgd2UgdXNlIHVuaW9uIHNldCAoNTEyYnl0ZXMpICovCi19OwotCi12b2lkIGVlcHJvbV93cml0ZTE2KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiByZWcsIHUxNiBkYXRhKTsKLXUxNiBlZXByb21fcmVhZDE2KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiByZWcpOwotdm9pZCByZWFkX2VlcHJvbV9jb250ZW50KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBlZXByb21fcmVhZF9zeihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MTYgcmVnLCB1OCAqZGF0YSwgdTMyIHN6KTsKLQotdm9pZCByZWFkX2VlcHJvbV9jb250ZW50X2J5X2F0dHJpYihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotI2VuZGlmICAvKiBfX1JUTDg3MVhfRUVQUk9NX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19lZnVzZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19lZnVzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTc3ZTI2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfZWZ1c2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fUlRXX0VGVVNFX0hfXwotI2RlZmluZSBfX1JUV19FRlVTRV9IX18KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLQotI2RlZmluZQlFRlVTRV9FUlJPRV9IQU5ETEUJCTEKLQotI2RlZmluZQlQR19TVEFURV9IRUFERVIJCQkweDAxCi0jZGVmaW5lCVBHX1NUQVRFX1dPUkRfMAkJMHgwMgotI2RlZmluZQlQR19TVEFURV9XT1JEXzEJCTB4MDQKLSNkZWZpbmUJUEdfU1RBVEVfV09SRF8yCQkweDA4Ci0jZGVmaW5lCVBHX1NUQVRFX1dPUkRfMwkJMHgxMAotI2RlZmluZQlQR19TVEFURV9EQVRBCQkJMHgyMAotCi0jZGVmaW5lCVBHX1NXQllURV9ICQkJMHgwMQotI2RlZmluZQlQR19TV0JZVEVfTAkJCTB4MDIKLQotI2RlZmluZQlQR1BLVF9EQVRBX1NJWkUJCTgKLQotI2RlZmluZQlFRlVTRV9XSUZJCQkJCTAKLSNkZWZpbmUJRUZVU0VfQlQJCQkJMQotCi1lbnVtIF9FRlVTRV9ERUZfVFlQRSB7Ci0JVFlQRV9FRlVTRV9NQVhfU0VDVElPTgkJCQk9IDAsCi0JVFlQRV9FRlVTRV9SRUFMX0NPTlRFTlRfTEVOCQkJPSAxLAotCVRZUEVfQVZBSUxBQkxFX0VGVVNFX0JZVEVTX0JBTksJCT0gMiwKLQlUWVBFX0FWQUlMQUJMRV9FRlVTRV9CWVRFU19UT1RBTAk9IDMsCi0JVFlQRV9FRlVTRV9NQVBfTEVOCQkJCQk9IDQsCi0JVFlQRV9FRlVTRV9QUk9URUNUX0JZVEVTX0JBTksJCT0gNSwKLQlUWVBFX0VGVVNFX0NPTlRFTlRfTEVOX0JBTksJCQk9IDYsCi19OwotCi0vKiBFLUZ1c2UgKi8KLSNkZWZpbmUgRUZVU0VfTUFQX1NJWkUgICAgICAyNTYKLQotI2RlZmluZSBFRlVTRV9NQVhfU0laRSAgICAgIDUxMgotLyogZW5kIG9mIEUtRnVzZSAqLwotCi0jZGVmaW5lCQlFRlVTRV9NQVhfTUFQX0xFTgkJMjU2Ci0jZGVmaW5lCQlFRlVTRV9NQVhfSFdfU0laRQkJNTEyCi0jZGVmaW5lCQlFRlVTRV9NQVhfU0VDVElPTl9CQVNFCTE2Ci0KLSNkZWZpbmUgRVhUX0hFQURFUihoZWFkZXIpICgoaGVhZGVyICYgMHgxRikgPT0gMHgwRikKLSNkZWZpbmUgQUxMX1dPUkRTX0RJU0FCTEVEKHdkZSkJKCh3ZGUgJiAweDBGKSA9PSAweDBGKQotI2RlZmluZSBHRVRfSERSX09GRlNFVF8yXzAoaGVhZGVyKSAoIChoZWFkZXIgJiAweEUwKSA+PiA1KQotCi0jZGVmaW5lCQlFRlVTRV9SRVBFQVRfVEhSRVNIT0xEXwkJCTMKLQotLyogICovCi0vKglUaGUgZm9sbG93aW5nIGlzIGZvciBCVCBFZnVzZSBkZWZpbml0aW9uICovCi0vKiAgKi8KLSNkZWZpbmUJCUVGVVNFX0JUX01BWF9NQVBfTEVOCQkxMDI0Ci0jZGVmaW5lCQlFRlVTRV9NQVhfQkFOSwkJCTQKLSNkZWZpbmUJCUVGVVNFX01BWF9CVF9CQU5LCQkoRUZVU0VfTUFYX0JBTkstMSkKLS8qICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBQYXJhbWV0ZXJzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCQlFRlVTRV9NQVhfV09SRF9VTklUCQkJNAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBzdHJ1Y3R1cmUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0cnVjdCBwZ19wa3Rfc3RydWN0IHsKLQl1OCBvZmZzZXQ7Ci0JdTggd29yZF9lbjsKLQl1OCBkYXRhWzhdOwotCXU4IHdvcmRfY250czsKLX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0IGdsb2JhbCB2YXJpYWJsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi11MTYJZWZ1c2VfR2V0TWF4U2l6ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLWludAlydHdfZWZ1c2VfYWNjZXNzMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJSZWFkLCB1MTYgc3RhcnRfYWRkciwgdTE2IGNudHMsIHU4ICpkYXRhKTsKLWludAlydHdfZWZ1c2VfbWFwX3JlYWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTE2IGFkZHIsIHUxNiBjbnRzLCB1OCAqZGF0YSk7Ci11OAlydHdfZWZ1c2VfbWFwX3dyaXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiBhZGRyLCB1MTYgY250cywgdTggKmRhdGEpOwotaW50CXJ0d19CVF9lZnVzZV9tYXBfcmVhZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MTYgYWRkciwgdTE2IGNudHMsIHU4ICpkYXRhKTsKLXU4CXJ0d19CVF9lZnVzZV9tYXBfd3JpdGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTE2IGFkZHIsIHUxNiBjbnRzLCB1OCAqZGF0YSk7Ci0KLXUxNglFZnVzZV9HZXRDdXJyZW50U2l6ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1OCBlZnVzZVR5cGUpOwotdTgJRWZ1c2VfQ2FsY3VsYXRlV29yZENudHMyM2EodTggd29yZF9lbik7Ci12b2lkCVJlYWRFRnVzZUJ5dGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1MTYgX29mZnNldCwgdTggKnBidWYpOwotdm9pZAlFRlVTRV9HZXRFZnVzZURlZmluaXRpb24yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTggZWZ1c2VUeXBlLCB1OCB0eXBlLCB2b2lkICpwT3V0KTsKLWludAllZnVzZV9PbmVCeXRlUmVhZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1MTYgYWRkciwgdTggKmRhdGEpOwotaW50CWVmdXNlX09uZUJ5dGVXcml0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1MTYgYWRkciwgdTggZGF0YSk7Ci0KLXZvaWQJRWZ1c2VfUG93ZXJTd2l0Y2gyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTggYldyaXRlLAotCQkJICAgICB1OCBQd3JTdGF0ZSk7Ci1pbnQJRWZ1c2VfUGdQYWNrZXRSZWFkMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHU4IG9mZnNldCwgdTggKmRhdGEpOwotaW50CUVmdXNlX1BnUGFja2V0V3JpdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTggb2Zmc2V0LCB1OCB3b3JkX2VuLCB1OCAqZGF0YSk7Ci12b2lkCWVmdXNlX1dvcmRFbmFibGVEYXRhUmVhZDIzYSh1OCB3b3JkX2VuLCB1OCAqc291cmRhdGEsIHU4ICp0YXJnZXRkYXRhKTsKLXU4CUVmdXNlX1dvcmRFbmFibGVEYXRhV3JpdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTE2IGVmdXNlX2FkZHIsIHU4IHdvcmRfZW4sIHU4ICpkYXRhKTsKLQotdTgJRUZVU0VfUmVhZDFCeXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHUxNiBBZGRyZXNzKTsKLXZvaWQJRUZVU0VfU2hhZG93TWFwVXBkYXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHU4IGVmdXNlVHlwZSk7Ci12b2lkCUVGVVNFX1NoYWRvd1JlYWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTggVHlwZSwgdTE2IE9mZnNldCwgdTMyICpWYWx1ZSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19ldmVudC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19ldmVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTU3YWVjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfZXZlbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfUlRXX0VWRU5UX0hfCi0jZGVmaW5lIF9SVFdfRVZFTlRfSF8KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDx3bGFuX2Jzc2RlZi5oPgotCi0vKgotVXNlZCB0byByZXBvcnQgYSBic3MgaGFzIGJlZW4gc2Nhbm5lZAotKi8KLXN0cnVjdCBzdXJ2ZXlfZXZlbnQgewotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpic3M7Ci19OwotCi0vKgotVXNlZCB0byByZXBvcnQgdGhhdCB0aGUgcmVxdWVzdGVkIHNpdGUgc3VydmV5IGhhcyBiZWVuIGRvbmUuCi1ic3NfY250IGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJzcyB0aGF0IGhhcyBiZWVuIHJlcG9ydGVkLgotKi8KLXN0cnVjdCBzdXJ2ZXlkb25lX2V2ZW50IHsKLQl1bnNpZ25lZCBpbnQgYnNzX2NudDsKLX07Ci0KLS8qCi1Vc2VkIHRvIHJlcG9ydCB0aGUgbGluayByZXN1bHQgb2Ygam9pbm5pbmcgdGhlIGdpdmVuIGJzcwotam9pbl9yZXM6Ci0tMTogYXV0aGVudGljYXRpb24gZmFpbAotLTI6IGFzc29jaWF0aW9uIGZhaWwKLT4gMDogVElECi0qLwotc3RydWN0IGpvaW5ic3NfZXZlbnQgewotCXN0cnVjdCB3bGFuX25ldHdvcmsgbmV0d29yazsKLX07Ci0KLS8qCi1Vc2VkIHRvIHJlcG9ydCBhIGdpdmVuIFNUQSBoYXMgam9pbm5lZCB0aGUgY3JlYXRlZCBCU1MuCi1JdCBpcyB1c2VkIGluIEFQL0FkLUhvQyhNKSBtb2RlLgotKi8KLXN0cnVjdCBzdGFzc29jX2V2ZW50IHsKLQl1bnNpZ25lZCBjaGFyIG1hY2FkZHJbNl07Ci0JdW5zaWduZWQgY2hhciByc3ZkWzJdOwotCWludCBjYW1faWQ7Ci19OwotCi1zdHJ1Y3Qgc3RhZGVsX2V2ZW50IHsKLQl1bnNpZ25lZCBjaGFyIG1hY2FkZHJbNl07Ci0JdW5zaWduZWQgY2hhciByc3ZkWzJdOyAvKiBmb3IgcmVhc29uICovCi0JaW50IG1hY19pZDsKLX07Ci0KLXN0cnVjdCBhZGRiYV9ldmVudCB7Ci0JdW5zaWduZWQgaW50IHRpZDsKLX07Ci0KLSNkZWZpbmUgR0VOX0VWVF9DT0RFKGV2ZW50KQlldmVudCAjIyBfRVZUXwotCi1zdHJ1Y3QgZndldmVudCB7Ci0JdTMyIHBhcm1zaXplOwotCXZvaWQgKCpldmVudF9jYWxsYmFjaykoc3RydWN0IHJ0d19hZGFwdGVyICpkZXYsIGNvbnN0IHU4ICpwYnVmKTsKLX07Ci0KLSNlbmRpZiAvKiAgX1dMQU5FVkVOVF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19odC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19odC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODBlYjg5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfaHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfUlRXX0hUX0hfCi0jZGVmaW5lIF9SVFdfSFRfSF8KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlICJsaW51eC9pZWVlODAyMTEuaCIKLSNpbmNsdWRlICJ3aWZpLmgiCi0KLXN0cnVjdCBodF9wcml2IHsKLQlib29sCWh0X29wdGlvbjsKLQlib29sCWFtcGR1X2VuYWJsZTsvKiBmb3IgZW5hYmxlIFR4IEEtTVBEVSAqLwotCS8qIHU4CWJhZGRiYXJlcV9pc3N1ZWRbMTZdOyAqLwotCXUzMgl0eF9hbXNkdV9lbmFibGU7LyogZm9yIGVuYWJsZSBUeCBBLU1TRFUgKi8KLQl1MzIJdHhfYW1kc3VfbWF4bGVuOyAvKiAgMTogOGssIDA6NGsgOyBkZWZhdWx0OjhrLCBmb3IgdHggKi8KLQl1MzIJcnhfYW1wZHVfbWF4bGVuOyAvKiBmb3IgcnggcmVvcmRlcmluZyBjdHJsIHdpbl9zeiwgdXBkYXRlZCB3aGVuIGpvaW5fY2FsbGJhY2suICovCi0KLQl1OAlid21vZGU7LyogICovCi0JdTgJY2hfb2Zmc2V0Oy8qIFBSSU1FX0NITkxfT0ZGU0VUICovCi0JdTgJc2dpOy8qIHNob3J0IEdJICovCi0KLQkvKiBmb3IgcHJvY2Vzc2luZyBUeCBBLU1QRFUgKi8KLQl1MTYJYWdnX2VuYWJsZV9iaXRtYXA7Ci0JLyogdTgJQUREQkFfcmV0cnlfY291bnQ7ICovCi0JdTE2CWNhbmRpZGF0ZV90aWRfYml0bWFwOwotCi0Jc3RydWN0IGllZWU4MDIxMV9odF9jYXAgaHRfY2FwOwotfTsKLQotI2VuZGlmCS8qIF9SVEw4NzFYX0hUX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2lvLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2lvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MTE5ZTIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19pby5oCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9SVFdfSU9fSF8KLSNkZWZpbmUgX1JUV19JT19IXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPG9zZGVwX2ludGYuaD4KLQotI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0vKiBpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPiAqLwotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8YXNtL2F0b21pYy5oPgotCi0jaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgotCi0jZGVmaW5lIHJ0d191c2JfYnVmZmVyX2FsbG9jKGRldiwgc2l6ZSwgZG1hKSB1c2JfYWxsb2NfY29oZXJlbnQoKGRldiksIChzaXplKSwgKGluX2ludGVycnVwdCgpID8gR0ZQX0FUT01JQyA6IEdGUF9LRVJORUwpLCAoZG1hKSkKLSNkZWZpbmUgcnR3X3VzYl9idWZmZXJfZnJlZShkZXYsIHNpemUsIGFkZHIsIGRtYSkgdXNiX2ZyZWVfY29oZXJlbnQoKGRldiksIChzaXplKSwgKGFkZHIpLCAoZG1hKSkKLQotI2RlZmluZSBOVU1fSU9SRVEJCTgKLQotI2RlZmluZSBNQVhfUFJPVF9TWgkoNjQtMTYpCi0KLSNkZWZpbmUgX0lPUkVBRFkJCQkwCi0jZGVmaW5lIF9JT19XQUlUX0NPTVBMRVRFICAgMQotI2RlZmluZSBfSU9fV0FJVF9SU1AgICAgICAgIDIKLQotLyogIElPIENPTU1BTkQgVFlQRSAqLwotI2RlZmluZSBfSU9TWl9NQVNLXwkJKDB4N0YpCi0jZGVmaW5lIF9JT19XUklURV8JCUJJVCg3KQotI2RlZmluZSBfSU9fRklYRURfCQlCSVQoOCkKLSNkZWZpbmUgX0lPX0JVUlNUXwkJQklUKDkpCi0jZGVmaW5lIF9JT19CWVRFXwkJQklUKDEwKQotI2RlZmluZSBfSU9fSFdfCQkJQklUKDExKQotI2RlZmluZSBfSU9fV09SRF8JCUJJVCgxMikKLSNkZWZpbmUgX0lPX1NZTkNfCQlCSVQoMTMpCi0jZGVmaW5lIF9JT19DTURNQVNLXwkoMHgxRjgwKQotCi0KLS8qCi0JRm9yIHByb21wdCBtb2RlIGFjY2Vzc2luZywgY2FsbGVyIHNoYWxsIGZyZWUgaW9fcmVxCi0JT3RoZXJ3aXNlLCBpb19oYW5kbGVyIHdpbGwgZnJlZSBpb19yZXEKLSovCi0KLQotCi0vKiAgSU8gU1RBVFVTIFRZUEUgKi8KLSNkZWZpbmUgX0lPX0VSUl8JCUJJVCgyKQotI2RlZmluZSBfSU9fU1VDQ0VTU18JQklUKDEpCi0jZGVmaW5lIF9JT19ET05FXwkJQklUKDApCi0KLQotI2RlZmluZSBJT19SRDMyCQkJKF9JT19TWU5DXyB8IF9JT19XT1JEXykKLSNkZWZpbmUgSU9fUkQxNgkJCShfSU9fU1lOQ18gfCBfSU9fSFdfKQotI2RlZmluZSBJT19SRDgJCQkoX0lPX1NZTkNfIHwgX0lPX0JZVEVfKQotCi0jZGVmaW5lIElPX1JEMzJfQVNZTkMJKF9JT19XT1JEXykKLSNkZWZpbmUgSU9fUkQxNl9BU1lOQwkoX0lPX0hXXykKLSNkZWZpbmUgSU9fUkQ4X0FTWU5DCShfSU9fQllURV8pCi0KLSNkZWZpbmUgSU9fV1IzMgkJCShfSU9fV1JJVEVfIHwgX0lPX1NZTkNfIHwgX0lPX1dPUkRfKQotI2RlZmluZSBJT19XUjE2CQkJKF9JT19XUklURV8gfCBfSU9fU1lOQ18gfCBfSU9fSFdfKQotI2RlZmluZSBJT19XUjgJCQkoX0lPX1dSSVRFXyB8IF9JT19TWU5DXyB8IF9JT19CWVRFXykKLQotI2RlZmluZSBJT19XUjMyX0FTWU5DCShfSU9fV1JJVEVfIHwgX0lPX1dPUkRfKQotI2RlZmluZSBJT19XUjE2X0FTWU5DCShfSU9fV1JJVEVfIHwgX0lPX0hXXykKLSNkZWZpbmUgSU9fV1I4X0FTWU5DCShfSU9fV1JJVEVfIHwgX0lPX0JZVEVfKQotCi0vKgotCi0JT25seSBTeW5jLiBidXJzdCBhY2Nlc3NpbmcgaXMgcHJvdmlkZWQuCi0KLSovCi0KLSNkZWZpbmUgSU9fV1JfQlVSU1QoeCkJCShfSU9fV1JJVEVfIHwgX0lPX1NZTkNfIHwgX0lPX0JVUlNUXyB8ICggKHgpICYgX0lPU1pfTUFTS18pKQotI2RlZmluZSBJT19SRF9CVVJTVCh4KQkJKF9JT19TWU5DXyB8IF9JT19CVVJTVF8gfCAoICh4KSAmIF9JT1NaX01BU0tfKSkKLQotCi0KLS8qIGJlbG93IGlzIGZvciB0aGUgaW50Zl9vcHRpb24gYml0IGRlZml0aW9uLi4uICovCi0KLSNkZWZpbmUgX0lOVEZfQVNZTkNfCUJJVCgwKQkvKiBzdXBwb3J0IGFzeW5jIGlvICovCi0KLXN0cnVjdCBpbnRmX3ByaXY7Ci0KLXN0cnVjdCBpb19yZXEgewotCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKLQl1MzIJYWRkcjsKLQl2b2xhdGlsZSB1MzIJdmFsOwotCXUzMgljb21tYW5kOwotCXUzMglzdGF0dXM7Ci0JdTgJKnBidWY7Ci0Jc3RydWN0IHNlbWFwaG9yZQlzZW1hOwotCi0Jdm9pZCAoKl9hc3luY19pb19jYWxsYmFjaykoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhdGVyLCBzdHJ1Y3QgaW9fcmVxICpwaW9fcmVxLCB1OCAqY254dCk7Ci0JdTggKmNueHQ7Ci19OwotCi1zdHJ1Y3QgcmVnX3Byb3RvY29sX3JkIHsKLQotI2lmZGVmIF9fTElUVExFX0VORElBTgotCi0JLyogRFcxICovCi0JdTMyCQlOdW1PZlRyYW5zOjQ7Ci0JdTMyCQlSZXNlcnZlZDE6NDsKLQl1MzIJCVJlc2VydmVkMjoyNDsKLQkvKiBEVzIgKi8KLQl1MzIJCUJ5dGVDb3VudDo3OwotCXUzMgkJV3JpdGVFbmFibGU6MTsJCS8qIDA6cmVhZCwgMTp3cml0ZSAqLwotCXUzMgkJRml4T3JDb250aW51b3VzOjE7CS8qIDA6Y29udGludW91cywgMTogRml4ICovCi0JdTMyCQlCdXJzdE1vZGU6MTsKLQl1MzIJCUJ5dGUxQWNjZXNzOjE7Ci0JdTMyCQlCeXRlMkFjY2VzczoxOwotCXUzMgkJQnl0ZTRBY2Nlc3M6MTsKLQl1MzIJCVJlc2VydmVkMzozOwotCXUzMgkJUmVzZXJ2ZWQ0OjE2OwotCS8qIERXMyAqLwotCXUzMgkJQnVzQWRkcmVzczsKLQkvKiBEVzQgKi8KLQkvKiB1MzIJCVZhbHVlOyAqLwotI2Vsc2UKLQotCi0vKiBEVzEgKi8KLQl1MzIgUmVzZXJ2ZWQxICA6NDsKLQl1MzIgTnVtT2ZUcmFucyA6NDsKLQotCXUzMiBSZXNlcnZlZDIgIDoyNDsKLQotCS8qIERXMiAqLwotCXUzMiBXcml0ZUVuYWJsZSA6IDE7Ci0JdTMyIEJ5dGVDb3VudCA6NzsKLQotCi0JdTMyIFJlc2VydmVkMyA6IDM7Ci0JdTMyIEJ5dGU0QWNjZXNzIDogMTsKLQotCXUzMiBCeXRlMkFjY2VzcyA6IDE7Ci0JdTMyIEJ5dGUxQWNjZXNzIDogMTsKLQl1MzIgQnVyc3RNb2RlIDoxIDsKLQl1MzIgRml4T3JDb250aW51b3VzIDogMTsKLQotCXUzMiBSZXNlcnZlZDQgOiAxNjsKLQotCS8qIERXMyAqLwotCXUzMgkJQnVzQWRkcmVzczsKLQotCS8qIERXNCAqLwotCS8qIHUzMgkJVmFsdWU7ICovCi0KLSNlbmRpZgotCi19OwotCi0KLXN0cnVjdCByZWdfcHJvdG9jb2xfd3QgewotCi0KLSNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KLQotCS8qIERXMSAqLwotCXUzMgkJTnVtT2ZUcmFuczo0OwotCXUzMgkJUmVzZXJ2ZWQxOjQ7Ci0JdTMyCQlSZXNlcnZlZDI6MjQ7Ci0JLyogRFcyICovCi0JdTMyCQlCeXRlQ291bnQ6NzsKLQl1MzIJCVdyaXRlRW5hYmxlOjE7CQkvKiAwOnJlYWQsIDE6d3JpdGUgKi8KLQl1MzIJCUZpeE9yQ29udGludW91czoxOwkvKiAwOmNvbnRpbnVvdXMsIDE6IEZpeCAqLwotCXUzMgkJQnVyc3RNb2RlOjE7Ci0JdTMyCQlCeXRlMUFjY2VzczoxOwotCXUzMgkJQnl0ZTJBY2Nlc3M6MTsKLQl1MzIJCUJ5dGU0QWNjZXNzOjE7Ci0JdTMyCQlSZXNlcnZlZDM6MzsKLQl1MzIJCVJlc2VydmVkNDoxNjsKLQkvKiBEVzMgKi8KLQl1MzIJCUJ1c0FkZHJlc3M7Ci0JLyogRFc0ICovCi0JdTMyCQlWYWx1ZTsKLQotI2Vsc2UKLQkvKiBEVzEgKi8KLQl1MzIgUmVzZXJ2ZWQxICA6NDsKLQl1MzIgTnVtT2ZUcmFucyA6NDsKLQotCXUzMiBSZXNlcnZlZDIgIDoyNDsKLQotCS8qIERXMiAqLwotCXUzMiBXcml0ZUVuYWJsZSA6IDE7Ci0JdTMyIEJ5dGVDb3VudCA6NzsKLQotCXUzMiBSZXNlcnZlZDMgOiAzOwotCXUzMiBCeXRlNEFjY2VzcyA6IDE7Ci0KLQl1MzIgQnl0ZTJBY2Nlc3MgOiAxOwotCXUzMiBCeXRlMUFjY2VzcyA6IDE7Ci0JdTMyIEJ1cnN0TW9kZSA6MSA7Ci0JdTMyIEZpeE9yQ29udGludW91cyA6IDE7Ci0KLQl1MzIgUmVzZXJ2ZWQ0IDogMTY7Ci0KLQkvKiBEVzMgKi8KLQl1MzIJCUJ1c0FkZHJlc3M7Ci0KLQkvKiBEVzQgKi8KLQl1MzIJCVZhbHVlOwotCi0jZW5kaWYKLQotfTsKLQotI2RlZmluZSBQbGF0Zm9ybUVGSU9Xcml0ZTFCeXRlKF9hLCBfYiwgX2MpCQlcCi0JcnRsODcyM2F1X3dyaXRlOChfYSwgX2IsIF9jKQotI2RlZmluZSBQbGF0Zm9ybUVGSU9Xcml0ZTJCeXRlKF9hLCBfYiwgX2MpCQlcCi0JcnRsODcyM2F1X3dyaXRlMTYoX2EsIF9iLCBfYykKLSNkZWZpbmUgUGxhdGZvcm1FRklPV3JpdGU0Qnl0ZShfYSwgX2IsIF9jKQkJXAotCXJ0bDg3MjNhdV93cml0ZTMyKF9hLCBfYiwgX2MpCi0KLSNkZWZpbmUgUGxhdGZvcm1FRklPUmVhZDFCeXRlKF9hLCBfYikJCXJ0bDg3MjNhdV9yZWFkOChfYSwgX2IpCi0jZGVmaW5lIFBsYXRmb3JtRUZJT1JlYWQyQnl0ZShfYSwgX2IpCQlydGw4NzIzYXVfcmVhZDE2KF9hLCBfYikKLSNkZWZpbmUgUGxhdGZvcm1FRklPUmVhZDRCeXRlKF9hLCBfYikJCXJ0bDg3MjNhdV9yZWFkMzIoX2EsIF9iKQotCi0jZW5kaWYJLyogX1JUTDg3MTFfSU9fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfbWxtZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19tbG1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZDNhNWYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19tbG1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1JUV19NTE1FX0hfCi0jZGVmaW5lIF9fUlRXX01MTUVfSF8KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxtbG1lX29zZGVwLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8d2xhbl9ic3NkZWYuaD4KLQotI2RlZmluZQlNQVhfQlNTX0NOVAkxMjgKLSNkZWZpbmUgICBNQVhfSk9JTl9USU1FT1VUCTY1MDAKLQotLyogSW5jcmVhc2UgdGhlIHNjYW5uaW5nIHRpbWVvdXQgYmVjYXVzZSBvZiBpbmNyZWFzaW5nIHRoZSBTVVJWRVlfVE8gdmFsdWUuICovCi0KLSNkZWZpbmUJU0NBTk5JTkdfVElNRU9VVAk4MDAwCi0KLSNkZWZpbmUJU0NBTl9JTlRFUlZBTAkoMzApIC8qICB1bml0OjJzZWMsIDMwKjIgPSA2MHNlYyAqLwotCi0jZGVmaW5lCVNDQU5RVUVVRV9MSUZFVElNRSAyMCAvKiAgdW5pdDpzZWMgKi8KLQotI2RlZmluZQlXSUZJX05VTExfU1RBVEUJCTB4MDAwMDAwMDAKLQotI2RlZmluZQlXSUZJX0FTT0NfU1RBVEUJCTB4MDAwMDAwMDEgLyogIFVuZGVyIExpbmtlZCBzdGF0ZS4qLwotI2RlZmluZQlXSUZJX1JFQVNPQ19TVEFURQkweDAwMDAwMDAyCi0jZGVmaW5lCVdJRklfU0xFRVBfU1RBVEUJMHgwMDAwMDAwNAotI2RlZmluZQlXSUZJX1NUQVRJT05fU1RBVEUJMHgwMDAwMDAwOAotCi0jZGVmaW5lCVdJRklfQVBfU1RBVEUJCTB4MDAwMDAwMTAKLSNkZWZpbmUJV0lGSV9BREhPQ19TVEFURQkweDAwMDAwMDIwCi0jZGVmaW5lICAgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUJMHgwMDAwMDA0MAotI2RlZmluZSAgIFdJRklfVU5ERVJfTElOS0lORwkweDAwMDAwMDgwCi0KLSNkZWZpbmUJV0lGSV9VTkRFUl9XUFMJCTB4MDAwMDAxMDAKLSNkZWZpbmUJV0lGSV9TVEFfQUxJVkVfQ0hLX1NUQVRFCTB4MDAwMDA0MDAKLS8qIHRvIGluZGljYXRlIHRoZSBzdGF0aW9uIGlzIHVuZGVyIHNpdGUgc3VydmV5aW5nICovCi0jZGVmaW5lCVdJRklfU0lURV9NT05JVE9SCTB4MDAwMDA4MDAKLQotI2RlZmluZQlXSUZJX01QX1NUQVRFCQkweDAwMDEwMDAwCi0jZGVmaW5lCVdJRklfTVBfQ1RYX0JBQ0tHUk9VTkQJMHgwMDAyMDAwMAkvKiAgaW4gY29udGludW91cyB0eCBiYWNrZ3JvdW5kICovCi0jZGVmaW5lCVdJRklfTVBfQ1RYX1NUCQkweDAwMDQwMDAwCS8qICBpbiBjb250aW51b3VzIHR4IHdpdGggc2luZ2xlLXRvbmUgKi8KLSNkZWZpbmUJV0lGSV9NUF9DVFhfQkFDS0dST1VORF9QRU5ESU5HCTB4MDAwODAwMDAJLyogIHBlbmRpbmcgaW4gY29udGludW91cyB0eCBiYWNrZ3JvdW5kIGR1ZSB0byBvdXQgb2Ygc2tiICovCi0jZGVmaW5lCVdJRklfTVBfQ1RYX0NDS19IVwkweDAwMTAwMDAwCS8qICBpbiBjb250aW51b3VzIHR4ICovCi0jZGVmaW5lCVdJRklfTVBfQ1RYX0NDS19DUwkweDAwMjAwMDAwCS8qICBpbiBjb250aW51b3VzIHR4IHdpdGggY2FycmllciBzdXBwcmVzc2lvbiAqLwotI2RlZmluZSAgIFdJRklfTVBfTFBCS19TVEFURQkweDAwNDAwMDAwCi0KLSNkZWZpbmUgX0ZXX1VOREVSX0xJTktJTkcJV0lGSV9VTkRFUl9MSU5LSU5HCi0jZGVmaW5lIF9GV19MSU5LRUQJCVdJRklfQVNPQ19TVEFURQotI2RlZmluZSBfRldfVU5ERVJfU1VSVkVZCVdJRklfU0lURV9NT05JVE9SCi0KLQotZW51bSBkb3QxMUF1dGhBbGdydGhtTnVtIHsKLQlkb3QxMUF1dGhBbGdydGhtX09wZW4gPSAwLAotCWRvdDExQXV0aEFsZ3J0aG1fU2hhcmVkLAotCWRvdDExQXV0aEFsZ3J0aG1fODAyMVgsCi0JZG90MTFBdXRoQWxncnRobV9BdXRvLAotCWRvdDExQXV0aEFsZ3J0aG1fTWF4TnVtCi19OwotCi0vKiAgU2NhbiB0eXBlIGluY2x1ZGluZyBhY3RpdmUgYW5kIHBhc3NpdmUgc2Nhbi4gKi8KLWVudW0gcnRfc2Nhbl90eXBlIHsKLQlTQ0FOX1BBU1NJVkUsCi0JU0NBTl9BQ1RJVkUsCi0JU0NBTl9NSVgsCi19OwotCi1lbnVtIHsKLQlHSFoyNF81MCA9IDAsCi0JR0haXzUwLAotCUdIWl8yNCwKLX07Ci0KLS8qCi0KLXRoZXJlIGFyZSBzZXZlcmFsICJsb2NrcyIgaW4gbWxtZV9wcml2LAotc2luY2UgbWxtZV9wcml2IGlzIGEgc2hhcmVkIHJlc291cmNlIGJldHdlZW4gbWFueSB0aHJlYWRzLAotbGlrZSBJU1IvQ2FsbC1CYWNrIGZ1bmN0aW9ucywgdGhlIE9JRCBoYW5kbGVycywgYW5kIGV2ZW4gdGltZXIgZnVuY3Rpb25zLgotCi0KLUVhY2ggX3F1ZXVlIGhhcyBpdHMgb3duIGxvY2tzLCBhbHJlYWR5LgotT3RoZXIgaXRlbXMgYXJlIHByb3RlY3RlZCBieSBtbG1lX3ByaXYubG9jay4KLQotVG8gYXZvaWQgcG9zc2libGUgZGVhZCBsb2NrLCBhbnkgdGhyZWFkIHRyeWluZyB0byBtb2RpZml5aW5nIG1sbWVfcHJpdgotU0hBTEwgbm90IGxvY2sgdXAgbW9yZSB0aGFuIG9uZSBsb2NrcyBhdCBhIHRpbWUhCi0qLwotCi1zdHJ1Y3QgcnRfbGlua19kZXRlY3QgewotCXUzMglOdW1UeE9rSW5QZXJpb2Q7Ci0JdTMyCU51bVJ4T2tJblBlcmlvZDsKLQl1MzIJTnVtUnhVbmljYXN0T2tJblBlcmlvZDsKLQlib29sCWJCdXN5VHJhZmZpYzsKLQlib29sCWJUeEJ1c3lUcmFmZmljOwotCWJvb2wJYlJ4QnVzeVRyYWZmaWM7Ci0JYm9vbAliSGlnaGVyQnVzeVRyYWZmaWM7IC8qICBGb3IgaW50ZXJydXB0IG1pZ3JhdGlvbiBwdXJwb3NlLiAqLwotCWJvb2wJYkhpZ2hlckJ1c3lSeFRyYWZmaWM7IC8qICBXZSBtYXkgZGlzYWJsZSBUeCBpbnRlcnJ1cHQgYWNjb3JkaW5nIGFzIFJ4IHRyYWZmaWMuICovCi0JYm9vbAliSGlnaGVyQnVzeVR4VHJhZmZpYzsgLyogIFdlIG1heSBkaXNhYmxlIFR4IGludGVycnVwdCBhY2NvcmRpbmcgYXMgVHggdHJhZmZpYy4gKi8KLX07Ci0KLXN0cnVjdCBtbG1lX3ByaXYgewotCXNwaW5sb2NrX3QJbG9jazsKLQlpbnQJZndfc3RhdGU7Ci0JdTggYlNjYW5JblByb2Nlc3M7Ci0JdTgJdG9fam9pbjsgLyogZmxhZyAqLwotCXU4IHRvX3JvYW1pbmc7IC8qICByb2FtaW5nIHRyeWluZyB0aW1lcyAqLwotCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpuaWNfaGRsOwotCi0JdTgJbm90X2luZGljX2Rpc2NvOwotCXN0cnVjdCBydHdfcXVldWUJc2Nhbm5lZF9xdWV1ZTsKLQotCXN0cnVjdCBjZmc4MDIxMV9zc2lkIGFzc29jX3NzaWQ7Ci0JdTgJYXNzb2NfYnNzaWRbNl07Ci0KLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrCWN1cl9uZXR3b3JrOwotCi0JLyogdWludCB3aXJlbGVzc19tb2RlOyBubyB1c2VkLCByZW1vdmUgaXQgKi8KLQotCXUzMglzY2FuX2ludGVydmFsOwotCi0Jc3RydWN0IHRpbWVyX2xpc3QgYXNzb2NfdGltZXI7Ci0KLQl1aW50IGFzc29jX2J5X2Jzc2lkOwotCXVpbnQgYXNzb2NfYnlfcnNzaTsKLQotCXN0cnVjdCB0aW1lcl9saXN0IHNjYW5fdG9fdGltZXI7Ci0KLQlzdHJ1Y3QgdGltZXJfbGlzdCBzZXRfc2Nhbl9kZW55X3RpbWVyOwotCWF0b21pY190IHNldF9zY2FuX2Rlbnk7IC8qIDA6IGFsbG93ZWQsIDE6IGRlbnkgKi8KLQotCXVuc2lnbmVkIGludCBxb3Nfb3B0aW9uOwotCi0JLyogTnVtYmVyIG9mIG5vbi1IVCBBUC9zdGF0aW9ucyAqLwotCWludCBudW1fc3RhX25vX2h0OwotCi0JaW50IG51bV9Gb3J0eU1IekludG9sZXJhbnQ7Ci0KLQlzdHJ1Y3QgaHRfcHJpdglodHByaXY7Ci0KLQlzdHJ1Y3QgcnRfbGlua19kZXRlY3QgTGlua0RldGVjdEluZm87Ci0Jc3RydWN0IHRpbWVyX2xpc3QgZHluYW1pY19jaGtfdGltZXI7IC8qIGR5bmFtaWMvcGVyaW9kaWMgY2hlY2sgdGltZXIgKi8KLQotCXU4CWtleV9tYXNrOyAvKiB1c2UgZm9yIGlwcyB0byBzZXQgd2VwIGtleSBhZnRlciBpcHNfbGVhdmUyM2EgKi8KLQl1OAlhY21fbWFzazsgLyogIGZvciB3bW0gYWNtIG1hc2sgKi8KLQl1OAlDaGFubmVsUGxhbjsKLQllbnVtIHJ0X3NjYW5fdHlwZSBzY2FuX21vZGU7IC8qICBhY3RpdmU6IDEsIHBhc3NpdmU6IDAgKi8KLQotCXU4ICp3cHNfcHJvYmVfcmVxX2llOwotCXUzMiB3cHNfcHJvYmVfcmVxX2llX2xlbjsKLQl1OCAqYXNzb2NfcmVxOwotCXUzMiBhc3NvY19yZXFfbGVuOwotCXUzMiBhc3NvY19yc3BfbGVuOwotCXU4ICphc3NvY19yc3A7Ci0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQkvKiBOdW1iZXIgb2YgYXNzb2NpYXRlZCBOb24tRVJQIHN0YXRpb25zIChpLmUuLCBzdGF0aW9ucyB1c2luZyA4MDIuMTFiCi0JICogaW4gODAyLjExZyBCU1MpICovCi0JaW50IG51bV9zdGFfbm9uX2VycDsKLQotCS8qIE51bWJlciBvZiBhc3NvY2lhdGVkIHN0YXRpb25zIHRoYXQgZG8gbm90IHN1cHBvcnQgU2hvcnQgU2xvdCBUaW1lICovCi0JaW50IG51bV9zdGFfbm9fc2hvcnRfc2xvdF90aW1lOwotCi0JLyogTnVtYmVyIG9mIGFzc29jaWF0ZWQgc3RhdGlvbnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBTaG9ydCBQcmVhbWJsZSAqLwotCWludCBudW1fc3RhX25vX3Nob3J0X3ByZWFtYmxlOwotCi0JaW50IG9sYmM7IC8qIE92ZXJsYXBwaW5nIExlZ2FjeSBCU1MgQ29uZGl0aW9uICovCi0KLQkvKiBOdW1iZXIgb2YgSFQgYXNzb2NpYXRlZCBzdGF0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IGdyZWVuZmllbGQgKi8KLQlpbnQgbnVtX3N0YV9odF9ub19nZjsKLQotCS8qIE51bWJlciBvZiBhc3NvY2lhdGVkIG5vbi1IVCBzdGF0aW9ucyAqLwotCS8qIGludCBudW1fc3RhX25vX2h0OyAqLwotCi0JLyogTnVtYmVyIG9mIEhUIGFzc29jaWF0ZWQgc3RhdGlvbnMgMjAgTUh6ICovCi0JaW50IG51bV9zdGFfaHRfMjBtaHo7Ci0KLQkvKiBPdmVybGFwcGluZyBCU1MgaW5mb3JtYXRpb24gKi8KLQlpbnQgb2xiY19odDsKLQotCXUxNiBodF9vcF9tb2RlOwotCi0Jc3BpbmxvY2tfdAliY25fdXBkYXRlX2xvY2s7Ci0JdTgJCXVwZGF0ZV9iY247Ci0KLSNlbmRpZiAvKiBpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUgKi8KLX07Ci0KLXZvaWQgcnR3X2pvaW5ic3NfZXZlbnRfcHJlaGFuZGxlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgdTggKnBidWYpOwotdm9pZCBydHdfc3VydmV5X2V2ZW50X2NiMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotdm9pZCBydHdfc3VydmV5ZG9uZV9ldmVudF9jYWxsYmFjazIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKTsKLXZvaWQgcnR3MjNhX2pvaW5ic3NfZXZlbnRfY2Ioc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCBjb25zdCB1OCAqcGJ1Zik7Ci12b2lkIHJ0d19zdGFzc29jX2V2ZW50X2NhbGxiYWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotdm9pZCBydHdfc3RhZGVsX2V2ZW50X2NhbGxiYWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotCi1pbnQgZXZlbnRfdGhyZWFkKHZvaWQgKmNvbnRleHQpOwotdm9pZCBydHcyM2Ffam9pbl90b19oYW5kbGVyKHVuc2lnbmVkIGxvbmcpOwotCi12b2lkIHJ0d19mcmVlX25ldHdvcmtfcXVldWUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKTsKLWludCBydHdfaW5pdF9tbG1lX3ByaXYyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKTsKLQotdm9pZCBydHdfZnJlZV9tbG1lX3ByaXYyM2Eoc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2KTsKLQotaW50IHJ0d19kb19qb2luX2FkaG9jKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcik7Ci1pbnQgcnR3X2RvX2pvaW5fbmV0d29yayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpjYW5kaWRhdGUpOwotaW50IHJ0d19zZWxlY3RfYW5kX2pvaW5fZnJvbV9zY2FubmVkX3F1ZXVlMjNhKHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdik7Ci1pbnQgcnR3X3NldF9rZXkyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiwgaW50IGtleWlkLCB1OCBzZXRfdHgpOwotaW50IHJ0d19zZXRfYXV0aDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCSBzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdik7Ci0KLXN0YXRpYyBpbmxpbmUgdTggKmdldF9ic3NpZChzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYpCi17CS8qIGlmIHN0YV9tb2RlOnBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yay5NYWNBZGRyZXNzID0+IGJzc2lkICovCi0JLyogIGlmIGFkaG9jX21vZGU6cG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLk1hY0FkZHJlc3MgPT4gaWJzcyBtYWMgYWRkcmVzcyAqLwotCXJldHVybiBwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmsuTWFjQWRkcmVzczsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGNoZWNrX2Z3c3RhdGUoc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2LCBpbnQgc3RhdGUpCi17Ci0JaWYgKHBtbG1lcHJpdi0+Zndfc3RhdGUgJiBzdGF0ZSkKLQkJcmV0dXJuIHRydWU7Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGdldF9md3N0YXRlKHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdikKLXsKLQlyZXR1cm4gcG1sbWVwcml2LT5md19zdGF0ZTsKLX0KLQotLyoKLSAqIE5vIExpbWl0IG9uIHRoZSBjYWxsaW5nIGNvbnRleHQsCi0gKiB0aGVyZWZvcmUgc2V0IGl0IHRvIGJlIHRoZSBjcml0aWNhbCBzZWN0aW9uLi4uCi0gKgotICogIyMjIE5PVEU6IyMjIyAoISEhISkKLSAqIE1VU1QgVEFLRSBDQVJFIFRIQVQgQkVGT1JFIENBTExJTkcgVEhJUyBGVU5DLCBZT1UgU0hPVUxEIEhBVkUgTE9DS0VEIHBtbG1lcHJpdi0+bG9jawotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2Z3c3RhdGUoc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2LCBpbnQgc3RhdGUpCi17Ci0JcG1sbWVwcml2LT5md19zdGF0ZSB8PSBzdGF0ZTsKLQkvKiBGT1IgSFcgaW50ZWdyYXRpb24gKi8KLQlpZiAoX0ZXX1VOREVSX1NVUlZFWSA9PSBzdGF0ZSkKLQkJcG1sbWVwcml2LT5iU2NhbkluUHJvY2VzcyA9IHRydWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfY2xyX2Z3c3RhdGVfKHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiwgaW50IHN0YXRlKQotewotCXBtbG1lcHJpdi0+Zndfc3RhdGUgJj0gfnN0YXRlOwotCS8qIEZPUiBIVyBpbnRlZ3JhdGlvbiAqLwotCWlmIChfRldfVU5ERVJfU1VSVkVZID09IHN0YXRlKQotCQlwbWxtZXByaXYtPmJTY2FuSW5Qcm9jZXNzID0gZmFsc2U7Ci19Ci0KLS8qCi0gKiBObyBMaW1pdCBvbiB0aGUgY2FsbGluZyBjb250ZXh0LAotICogdGhlcmVmb3JlIHNldCBpdCB0byBiZSB0aGUgY3JpdGljYWwgc2VjdGlvbi4uLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgY2xyX2Z3c3RhdGUoc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2LCBpbnQgc3RhdGUpCi17Ci0Jc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgc3RhdGUpKQotCQlwbWxtZXByaXYtPmZ3X3N0YXRlIF49IHN0YXRlOwotCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY2xyX2Z3c3RhdGVfZXgoc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2LCBpbnQgc3RhdGUpCi17Ci0Jc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCV9jbHJfZndzdGF0ZV8ocG1sbWVwcml2LCBzdGF0ZSk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci19Ci0KLXZvaWQgcnR3X2Rpc2Nvbm5lY3RfaGRsMjNhX3VuZGVyX2xpbmtlZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJICAgICBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEsIHU4IGZyZWVfYXNzb2MpOwotdm9pZCBydHdfZ2VuZXJhdGVfcmFuZG9tX2lic3MyM2EodTggKnBpYnNzKTsKLXN0cnVjdCB3bGFuX25ldHdvcmsgKnJ0d19maW5kX25ldHdvcmsyM2Eoc3RydWN0IHJ0d19xdWV1ZSAqc2Nhbm5lZF9xdWV1ZSwgdTggKmFkZHIpOwotc3RydWN0IHdsYW5fbmV0d29yayAqcnR3X2dldF9vbGRlc3Rfd2xhbl9uZXR3b3JrMjNhKHN0cnVjdCBydHdfcXVldWUgKnNjYW5uZWRfcXVldWUpOwotCi12b2lkIHJ0d19mcmVlX2Fzc29jX3Jlc291cmNlczIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkgICAgICBpbnQgbG9ja19zY2FubmVkX3F1ZXVlKTsKLXZvaWQgcnR3X2luZGljYXRlX2Rpc2Nvbm5lY3QyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgcnR3X2luZGljYXRlX2Nvbm5lY3QyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgcnR3X3NjYW5fYWJvcnQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKTsKLQotaW50IHJ0d19yZXN0cnVjdF9zZWNfaWUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCB1OCAqaW5faWUsIHU4ICpvdXRfaWUsCi0JCQl1aW50IGluX2xlbik7Ci1pbnQgcnR3X3Jlc3RydWN0X3dtbV9pZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICppbl9pZSwgdTggKm91dF9pZSwKLQkJCXVpbnQgaW5fbGVuLCB1aW50IGluaXRpYWxfb3V0X2xlbik7Ci12b2lkIHJ0d19pbml0X3JlZ2lzdHJ5cHJpdl9kZXZfbmV0d29yazIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpOwotCi12b2lkIHJ0d191cGRhdGVfcmVnaXN0cnlwcml2X2Rldl9uZXR3b3JrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcik7Ci0KLXZvaWQgcnR3X3NjYW5fdGltZW91dF9oYW5kbGVyMjNhKHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci0KLXZvaWQgcnR3X2R5bmFtaWNfY2hlY2tfdGltZXJfaGFuZGxlcih1bnNpZ25lZCBsb25nIGRhdGEpOwotYm9vbCBydHdfaXNfc2Nhbl9kZW55KHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcik7Ci12b2lkIHJ0d19jbGVhcl9zY2FuX2Rlbnkoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgcnR3X3NldF9zY2FuX2RlbnlfdGltZXJfaGRsKHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci12b2lkIHJ0d19zZXRfc2Nhbl9kZW55KHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgdTMyIG1zKTsKLQotdm9pZCBydHcyM2FfZnJlZV9tbG1lX3ByaXZfaWVfZGF0YShzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYpOwotCi12b2lkIF9ydHdfZnJlZV9tbG1lX3ByaXYyM2Eoc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2KTsKLQotc3RydWN0IHdsYW5fbmV0d29yayAqcnR3X2FsbG9jX25ldHdvcmsoc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2LCBnZnBfdCBnZnApOwotCi1pbnQgcnR3X2lmX3VwMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi1pbnQgcnR3X2xpbmtlZF9jaGVjayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotdm9pZCBydHdfam9pbmJzc19yZXNldDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotYm9vbCBydHdfcmVzdHJ1Y3R1cmVfaHRfaWUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKmluX2llLAotCQkJICAgICAgdTggKm91dF9pZSwgdWludCBpbl9sZW4sIHVpbnQgKnBvdXRfbGVuKTsKLXZvaWQgcnR3X3VwZGF0ZV9odF9jYXAyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICAgICAgIHU4ICpwaWUsIHVpbnQgaWVfbGVuKTsKLXZvaWQgcnR3X2lzc3VlX2FkZGJhcmVxX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgIHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKTsKLQotYm9vbCBydHdfaXNfc2FtZV9pYnNzMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJCSBzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yayk7Ci1pbnQgaXNfc2FtZV9uZXR3b3JrMjNhKHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpzcmMsIHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpkc3QpOwotCi12b2lkIHJ0dzIzYV9yb2FtaW5nKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJIHN0cnVjdCB3bGFuX25ldHdvcmsgKnRndF9uZXR3b3JrKTsKLXZvaWQgcnR3X3NldF9yb2FtaW5nKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgdTggdG9fcm9hbWluZyk7Ci0KLSNlbmRpZiAvKiBfX1JUTDg3MVhfTUxNRV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19tbG1lX2V4dC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19tbG1lX2V4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTdkM2RhOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X21sbWVfZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fUlRXX01MTUVfRVhUX0hfCi0jZGVmaW5lIF9fUlRXX01MTUVfRVhUX0hfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8d2xhbl9ic3NkZWYuaD4KLQotCi0vKglDb21tZW50ZWQgYnkgQWxiZXJ0IDIwMTAxMTA1ICovCi0vKglJbmNyZWFzZSB0aGUgU1VSVkVZX1RPIHZhbHVlIGZyb20gMTAwIHRvIDE1MCAgKCAxMDBtcyB0byAxNTBtcyApICovCi0vKglUaGUgUmVhbHRlayA4MTg4Q0UgU29mdEFQIHdpbGwgc3BlbmQgYXJvdW5kIDEwMG1zIHRvIHNlbmQgdGhlIHByb2JlIHJlc3BvbnNlIGFmdGVyIHJlY2VpdmluZyB0aGUgcHJvYmUgcmVxdWVzdC4gKi8KLS8qCVNvLCB0aGlzIGRyaXZlciB0cmllZCB0byBleHRlbmQgdGhlIGR3ZWxsIHRpbWUgZm9yIGVhY2ggc2Nhbm5pbmcgY2hhbm5lbC4gKi8KLS8qCVRoaXMgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIHRvIHJlY2VpdmUgdGhlIHByb2JlIHJlc3BvbnNlIGZyb20gU29mdEFQLiAqLwotCi0jZGVmaW5lIFNVUlZFWV9UTwkJKDEwMCkKLSNkZWZpbmUgUkVBVVRIX1RPCQkoMzAwKSAvKiA1MCkgKi8KLSNkZWZpbmUgUkVBU1NPQ19UTwkJKDMwMCkgLyogNTApICovCi0vKiBkZWZpbmUgRElTQ09OTkVDVF9UTwkoMzAwMCkgKi8KLSNkZWZpbmUgQUREQkFfVE8JCQkoMjAwMCkKLQotI2RlZmluZSBMSU5LRURfVE8gKDEpIC8qIHVuaXQ6MiBzZWMsIDF4Mj0yIHNlYyAqLwotCi0jZGVmaW5lIFJFQVVUSF9MSU1JVAkoNCkKLSNkZWZpbmUgUkVBU1NPQ19MSU1JVAkoNCkKLSNkZWZpbmUgUkVBRERCQV9MSU1JVAkoMikKLQotI2RlZmluZSBST0FNSU5HX0xJTUlUCTgKLQotI2RlZmluZQlEWU5BTUlDX0ZVTkNfRElTQUJMRQkJCSgweDApCi0KLS8qICA9PT09PT0gZW51bSBvZG1fYWJpbGl0eSA9PT09PT09PSAqLwotLyogIEJCIE9ETSBzZWN0aW9uIEJJVCAwLTE1ICovCi0jZGVmaW5lCURZTkFNSUNfQkJfRElHCQkJCUJJVCgwKQotI2RlZmluZQlEWU5BTUlDX0JCX1JBX01BU0sJCQlCSVQoMSkKLSNkZWZpbmUJRFlOQU1JQ19CQl9EWU5BTUlDX1RYUFdSCUJJVCgyKQotI2RlZmluZQlEWU5BTUlDX0JCX0JCX0ZBX0NOVAkJCUJJVCgzKQotCi0jZGVmaW5lCQlEWU5BTUlDX0JCX1JTU0lfTU9OSVRPUgkJQklUKDQpCi0jZGVmaW5lCQlEWU5BTUlDX0JCX0NDS19QRAkJCUJJVCg1KQotI2RlZmluZQkJRFlOQU1JQ19CQl9BTlRfRElWCQkJQklUKDYpCi0jZGVmaW5lCQlEWU5BTUlDX0JCX1BXUl9TQVZFCQkJQklUKDcpCi0jZGVmaW5lCQlEWU5BTUlDX0JCX1BXUl9UUkFJTgkJCUJJVCg4KQotI2RlZmluZQkJRFlOQU1JQ19CQl9SQVRFX0FEQVBUSVZFCQlCSVQoOSkKLSNkZWZpbmUJCURZTkFNSUNfQkJfUEFUSF9ESVYJCQlCSVQoMTApCi0jZGVmaW5lCQlEWU5BTUlDX0JCX1BTRAkJCQlCSVQoMTEpCi0KLS8qICBNQUMgRE0gc2VjdGlvbiBCSVQgMTYtMjMgKi8KLSNkZWZpbmUJCURZTkFNSUNfTUFDX3N0cnVjdCBlZGNhX3R1cmJvVVJCTwkJQklUKDE2KQotI2RlZmluZQkJRFlOQU1JQ19NQUNfRUFSTFlfTU9ERQkJQklUKDE3KQotCi0vKiAgUkYgT0RNIHNlY3Rpb24gQklUIDI0LTMxICovCi0jZGVmaW5lCQlEWU5BTUlDX1JGX1RYX1BXUl9UUkFDSwkJQklUKDI0KQotI2RlZmluZQkJRFlOQU1JQ19SRl9SWF9HQUlOX1RSQUNLCQlCSVQoMjUpCi0jZGVmaW5lCQlEWU5BTUlDX1JGX0NBTElCUkFUSU9OCQlCSVQoMjYpCi0KLSNkZWZpbmUJCURZTkFNSUNfQUxMX0ZVTkNfRU5BQkxFCQkweEZGRkZGRkYKLQotI2RlZmluZSBfSFdfU1RBVEVfTk9MSU5LXwkJMHgwMAotI2RlZmluZSBfSFdfU1RBVEVfQURIT0NfCQkweDAxCi0jZGVmaW5lIF9IV19TVEFURV9TVEFUSU9OXwkweDAyCi0jZGVmaW5lIF9IV19TVEFURV9BUF8JCQkweDAzCi0KLQotI2RlZmluZQkJXzFNX1JBVEVfCTAKLSNkZWZpbmUJCV8yTV9SQVRFXwkxCi0jZGVmaW5lCQlfNU1fUkFURV8JMgotI2RlZmluZQkJXzExTV9SQVRFXwkzCi0jZGVmaW5lCQlfNk1fUkFURV8JNAotI2RlZmluZQkJXzlNX1JBVEVfCTUKLSNkZWZpbmUJCV8xMk1fUkFURV8JNgotI2RlZmluZQkJXzE4TV9SQVRFXwk3Ci0jZGVmaW5lCQlfMjRNX1JBVEVfCTgKLSNkZWZpbmUJCV8zNk1fUkFURV8JOQotI2RlZmluZQkJXzQ4TV9SQVRFXwkxMAotI2RlZmluZQkJXzU0TV9SQVRFXwkxMQotCi0KLWV4dGVybiB1bnNpZ25lZCBjaGFyIFdNTV9PVUkyM0FbXTsKLWV4dGVybiB1bnNpZ25lZCBjaGFyIFdQU19PVUkyM0FbXTsKLWV4dGVybiB1bnNpZ25lZCBjaGFyIFdGRF9PVUkyM0FbXTsKLWV4dGVybiB1bnNpZ25lZCBjaGFyIFAyUF9PVUkyM0FbXTsKLQotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgV01NX0lORk9fT1VJMjNBW107Ci1leHRlcm4gdW5zaWduZWQgY2hhciBXTU1fUEFSQV9PVUkyM0FbXTsKLQotCi0vKiAgKi8KLS8qICBDaGFubmVsIFBsYW4gVHlwZS4gKi8KLS8qICBOb3RlOiAqLwotLyoJV2UganVzdCBhZGQgbmV3IGNoYW5uZWwgcGxhbiB3aGVuIHRoZSBuZXcgY2hhbm5lbCBwbGFuIGlzIGRpZmZlcmVudCBmcm9tIGFueSBvZiB0aGUgZm9sbG93aW5nICovCi0vKgljaGFubmVsIHBsYW4uICovCi0vKglJZiB5b3UganVzdCB3YW50IHRvIGN1c3RvbWl6ZSB0aGUgYWN0aW9ucyhzY2FuIHBlcmlvZCBvciBqb2luIGFjdGlvbnMpIGFib3V0IG9uZSBvZiB0aGUgY2hhbm5lbCBwbGFuLCAqLwotLyoJY3VzdG9taXplIHRoZW0gaW4gc3RydWN0IHJ0X2NoYW5uZWxfaW5mbyBpbiB0aGUgUlRfQ0hBTk5FTF9MSVNULiAqLwotLyogICovCi1lbnVtICB7IC8qIF9SVF9DSEFOTkVMX0RPTUFJTiAqLwotCS8qICBvbGQgY2hhbm5lbCBwbGFuIG1hcHBpbmcgPT09PT0gKi8KLQlSVF9DSEFOTkVMX0RPTUFJTl9GQ0MgPSAweDAwLAotCVJUX0NIQU5ORUxfRE9NQUlOX0lDID0gMHgwMSwKLQlSVF9DSEFOTkVMX0RPTUFJTl9FVFNJID0gMHgwMiwKLQlSVF9DSEFOTkVMX0RPTUFJTl9TUEFJTiA9IDB4MDMsCi0JUlRfQ0hBTk5FTF9ET01BSU5fRlJBTkNFID0gMHgwNCwKLQlSVF9DSEFOTkVMX0RPTUFJTl9NS0sgPSAweDA1LAotCVJUX0NIQU5ORUxfRE9NQUlOX01LSzEgPSAweDA2LAotCVJUX0NIQU5ORUxfRE9NQUlOX0lTUkFFTCA9IDB4MDcsCi0JUlRfQ0hBTk5FTF9ET01BSU5fVEVMRUMgPSAweDA4LAotCVJUX0NIQU5ORUxfRE9NQUlOX0dMT0JBTF9ET0FNSU4gPSAweDA5LAotCVJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX1dJREVfMTMgPSAweDBBLAotCVJUX0NIQU5ORUxfRE9NQUlOX1RBSVdBTiA9IDB4MEIsCi0JUlRfQ0hBTk5FTF9ET01BSU5fQ0hJTkEgPSAweDBDLAotCVJUX0NIQU5ORUxfRE9NQUlOX1NJTkdBUE9SRV9JTkRJQV9NRVhJQ08gPSAweDBELAotCVJUX0NIQU5ORUxfRE9NQUlOX0tPUkVBID0gMHgwRSwKLQlSVF9DSEFOTkVMX0RPTUFJTl9UVVJLRVkgPSAweDBGLAotCVJUX0NIQU5ORUxfRE9NQUlOX0pBUEFOID0gMHgxMCwKLQlSVF9DSEFOTkVMX0RPTUFJTl9GQ0NfTk9fREZTID0gMHgxMSwKLQlSVF9DSEFOTkVMX0RPTUFJTl9KQVBBTl9OT19ERlMgPSAweDEyLAotCVJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX1dJREVfNUcgPSAweDEzLAotCVJUX0NIQU5ORUxfRE9NQUlOX1RBSVdBTl9OT19ERlMgPSAweDE0LAotCi0JLyogIG5ldyBjaGFubmVsIHBsYW4gbWFwcGluZywgKDJHRE9NQUlOXzVHRE9NQUlOKSA9PT09PSAqLwotCVJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX05VTEwgPSAweDIwLAotCVJUX0NIQU5ORUxfRE9NQUlOX0VUU0kxX05VTEwgPSAweDIxLAotCVJUX0NIQU5ORUxfRE9NQUlOX0ZDQzFfTlVMTCA9IDB4MjIsCi0JUlRfQ0hBTk5FTF9ET01BSU5fTUtLMV9OVUxMID0gMHgyMywKLQlSVF9DSEFOTkVMX0RPTUFJTl9FVFNJMl9OVUxMID0gMHgyNCwKLQlSVF9DSEFOTkVMX0RPTUFJTl9GQ0MxX0ZDQzEgPSAweDI1LAotCVJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX0VUU0kxID0gMHgyNiwKLQlSVF9DSEFOTkVMX0RPTUFJTl9NS0sxX01LSzEgPSAweDI3LAotCVJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX0tDQzEgPSAweDI4LAotCVJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX0ZDQzIgPSAweDI5LAotCVJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX0ZDQzMgPSAweDMwLAotCVJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX0ZDQzQgPSAweDMxLAotCVJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX0ZDQzUgPSAweDMyLAotCVJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX0ZDQzYgPSAweDMzLAotCVJUX0NIQU5ORUxfRE9NQUlOX0ZDQzFfRkNDNyA9IDB4MzQsCi0JUlRfQ0hBTk5FTF9ET01BSU5fV09STERfRVRTSTIgPSAweDM1LAotCVJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX0VUU0kzID0gMHgzNiwKLQlSVF9DSEFOTkVMX0RPTUFJTl9NS0sxX01LSzIgPSAweDM3LAotCVJUX0NIQU5ORUxfRE9NQUlOX01LSzFfTUtLMyA9IDB4MzgsCi0JUlRfQ0hBTk5FTF9ET01BSU5fRkNDMV9OQ0MxID0gMHgzOSwKLQlSVF9DSEFOTkVMX0RPTUFJTl9GQ0MxX05DQzIgPSAweDQwLAotCVJUX0NIQU5ORUxfRE9NQUlOX0dMT0JBTF9ET0FNSU5fMkcgPSAweDQxLAotCS8qICBBZGQgbmV3IGNoYW5uZWwgcGxhbiBhYm92ZSB0aGlzIGxpbmU9PT09PT09PT09PT09PT0gKi8KLQlSVF9DSEFOTkVMX0RPTUFJTl9NQVgsCi0JUlRfQ0hBTk5FTF9ET01BSU5fUkVBTFRFS19ERUZJTkUgPSAweDdGLAotfTsKLQotZW51bSB7IC8qIF9SVF9DSEFOTkVMX0RPTUFJTl8yRyAqLwotCVJUX0NIQU5ORUxfRE9NQUlOXzJHX1dPUkxEID0gMHgwMCwJCS8qIFdvcmxkd2lyZCAxMyAqLwotCVJUX0NIQU5ORUxfRE9NQUlOXzJHX0VUU0kxID0gMHgwMSwJCS8qIEV1cm9wZSAqLwotCVJUX0NIQU5ORUxfRE9NQUlOXzJHX0ZDQzEgPSAweDAyLAkJLyogVVMgKi8KLQlSVF9DSEFOTkVMX0RPTUFJTl8yR19NS0sxID0gMHgwMywJCS8qIEphcGFuICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fMkdfRVRTSTIgPSAweDA0LAkJLyogRnJhbmNlICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fMkdfTlVMTCA9IDB4MDUsCi0JLyogIEFkZCBuZXcgY2hhbm5lbCBwbGFuIGFib3ZlIHRoaXMgbGluZT09PT09PT09PT09PT09PSAqLwotCVJUX0NIQU5ORUxfRE9NQUlOXzJHX01BWCwKLX07Ci0KLWVudW0geyAvKiBfUlRfQ0hBTk5FTF9ET01BSU5fNUcgKi8KLQlSVF9DSEFOTkVMX0RPTUFJTl81R19OVUxMID0gMHgwMCwKLQlSVF9DSEFOTkVMX0RPTUFJTl81R19FVFNJMSA9IDB4MDEsCQkvKiBFdXJvcGUgKi8KLQlSVF9DSEFOTkVMX0RPTUFJTl81R19FVFNJMiA9IDB4MDIsCQkvKiBBdXN0cmFsaWEsIE5ldyBaZWFsYW5kICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fNUdfRVRTSTMgPSAweDAzLAkJLyogUnVzc2lhICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fNUdfRkNDMSA9IDB4MDQsCQkvKiBVUyAqLwotCVJUX0NIQU5ORUxfRE9NQUlOXzVHX0ZDQzIgPSAweDA1LAkJLyogRkNDIG8vdyBERlMgQ2hhbm5lbHMgKi8KLQlSVF9DSEFOTkVMX0RPTUFJTl81R19GQ0MzID0gMHgwNiwJCS8qIEluZGlhLCBNZXhpY28gKi8KLQlSVF9DSEFOTkVMX0RPTUFJTl81R19GQ0M0ID0gMHgwNywJCS8qIFZlbmV6dWVsYSAqLwotCVJUX0NIQU5ORUxfRE9NQUlOXzVHX0ZDQzUgPSAweDA4LAkJLyogQ2hpbmEgKi8KLQlSVF9DSEFOTkVMX0RPTUFJTl81R19GQ0M2ID0gMHgwOSwJCS8qIElzcmFlbCAqLwotCVJUX0NIQU5ORUxfRE9NQUlOXzVHX0ZDQzdfSUMxID0gMHgwQSwJLyogVVMsIENhbmFkYSAqLwotCVJUX0NIQU5ORUxfRE9NQUlOXzVHX0tDQzEgPSAweDBCLAkJLyogS29yZWEgKi8KLQlSVF9DSEFOTkVMX0RPTUFJTl81R19NS0sxID0gMHgwQywJCS8qIEphcGFuICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fNUdfTUtLMiA9IDB4MEQsCQkvKiBKYXBhbiAoVzUyLCBXNTMpICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fNUdfTUtLMyA9IDB4MEUsCQkvKiBKYXBhbiAoVzU2KSAqLwotCVJUX0NIQU5ORUxfRE9NQUlOXzVHX05DQzEgPSAweDBGLAkJLyogVGFpd2FuICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fNUdfTkNDMiA9IDB4MTAsCQkvKiBUYWl3YW4gby93IERGUyAqLwotCS8qICBBZGQgbmV3IGNoYW5uZWwgcGxhbiBhYm92ZSB0aGlzIGxpbmU9PT09PT09PT09PT09PT0gKi8KLQkvKiAgRHJpdmVyIFNlbGYgRGVmaW5lZCA9PT09PSAqLwotCVJUX0NIQU5ORUxfRE9NQUlOXzVHX0ZDQyA9IDB4MTEsCi0JUlRfQ0hBTk5FTF9ET01BSU5fNUdfSkFQQU5fTk9fREZTID0gMHgxMiwKLQlSVF9DSEFOTkVMX0RPTUFJTl81R19GQ0M0X05PX0RGUyA9IDB4MTMsCi0JUlRfQ0hBTk5FTF9ET01BSU5fNUdfTUFYLAotfTsKLQotI2RlZmluZSBydHdfaXNfY2hhbm5lbF9wbGFuX3ZhbGlkKGNocGxhbikgKGNocGxhbjxSVF9DSEFOTkVMX0RPTUFJTl9NQVggfHwgY2hwbGFuID09IFJUX0NIQU5ORUxfRE9NQUlOX1JFQUxURUtfREVGSU5FKQotCi1zdHJ1Y3QgcnRfY2hhbm5lbF9wbGFuIHsKLQl1bnNpZ25lZCBjaGFyCUNoYW5uZWxbTUFYX0NIQU5ORUxfTlVNXTsKLQl1bnNpZ25lZCBjaGFyCUxlbjsKLX07Ci0KLXN0cnVjdCBydF9jaGFubmVsX3BsYW5fMmcgewotCXVuc2lnbmVkIGNoYXIJQ2hhbm5lbFtNQVhfQ0hBTk5FTF9OVU1fMkddOwotCXVuc2lnbmVkIGNoYXIJTGVuOwotfTsKLQotc3RydWN0IHJ0X2NoYW5uZWxfcGxhbl81ZyB7Ci0JdW5zaWduZWQgY2hhcglDaGFubmVsW01BWF9DSEFOTkVMX05VTV81R107Ci0JdW5zaWduZWQgY2hhcglMZW47Ci19OwotCi1zdHJ1Y3QgcnRfY2hhbm5lbF9wbGFuX21hcCB7Ci0JdW5zaWduZWQgY2hhcglJbmRleDJHOwotCXVuc2lnbmVkIGNoYXIJSW5kZXg1RzsKLX07Ci0KLWVudW0gQXNzb2NpYXRlZF9BUCB7Ci0JYXRoZXJvc0FQCT0gMCwKLQlicm9hZGNvbUFQCT0gMSwKLQljaXNjb0FQCQk9IDIsCi0JbWFydmVsbEFQCT0gMywKLQlyYWxpbmtBUAk9IDQsCi0JcmVhbHRla0FQCT0gNSwKLQlhaXJnb2NhcEFQCT0gNiwKLQl1bmtub3duQVAJPSA3LAotCW1heEFQLAotfTsKLQotZW51bSB7IC8qIEhUX0lPVF9QRUVSX0UgKi8KLQlIVF9JT1RfUEVFUl9VTktOT1dOCQk9IDAsCi0JSFRfSU9UX1BFRVJfUkVBTFRFSwkJPSAxLAotCUhUX0lPVF9QRUVSX1JFQUxURUtfOTJTRQk9IDIsCi0JSFRfSU9UX1BFRVJfQlJPQURDT00JCT0gMywKLQlIVF9JT1RfUEVFUl9SQUxJTksJCT0gNCwKLQlIVF9JT1RfUEVFUl9BVEhFUk9TCQk9IDUsCi0JSFRfSU9UX1BFRVJfQ0lTQ08JCT0gNiwKLQlIVF9JT1RfUEVFUl9NRVJVCQk9IDcsCi0JSFRfSU9UX1BFRVJfTUFSVkVMTAkJPSA4LAotCUhUX0lPVF9QRUVSX1JFQUxURUtfU09GVEFQCT0gOSwvKiAgcGVlciBpcyBSZWFsVGVrIFNPRlRfQVAsIGJ5IEJvaG4sIDIwMDkuMTIuMTcgKi8KLQlIVF9JT1RfUEVFUl9TRUxGX1NPRlRBUAkJPSAxMCwgLyogIFNlbGYgaXMgU29mdEFQICovCi0JSFRfSU9UX1BFRVJfQUlSR08JCT0gMTEsCi0JSFRfSU9UX1BFRVJfSU5URUwJCT0gMTIsCi0JSFRfSU9UX1BFRVJfUlRLX0FQQ0xJRU5UCT0gMTMsCi0JSFRfSU9UX1BFRVJfUkVBTFRFS184MVhYCT0gMTQsCi0JSFRfSU9UX1BFRVJfUkVBTFRFS19XT1cJCT0gMTUsCi0JSFRfSU9UX1BFRVJfVEVOREEJCT0gMTYsCi0JSFRfSU9UX1BFRVJfTUFYCQkJPSAxNwotfTsKLQotZW51bSBTQ0FOX1NUQVRFIHsKLQlTQ0FOX0RJU0FCTEUgPSAwLAotCVNDQU5fU1RBUlQgPSAxLAotCVNDQU5fVFhOVUxMID0gMiwKLQlTQ0FOX1BST0NFU1MgPSAzLAotCVNDQU5fQ09NUExFVEUgPSA0LAotCVNDQU5fU1RBVEVfTUFYLAotfTsKLQotc3RydWN0IG1sbWVfaGFuZGxlciB7Ci0JY2hhciAqc3RyOwotCWludCAoKmZ1bmMpKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci19OwotCi1zdHJ1Y3QgYWN0aW9uX2hhbmRsZXIgewotCXVuc2lnbmVkIGludCAgIG51bTsKLQljaGFyICpzdHI7Ci0JaW50ICgqZnVuYykoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLX07Ci0KLXN0cnVjdAlzc19yZXMgewotCWludAlzdGF0ZTsKLQlpbnQJYnNzX2NudDsKLQlpbnQJY2hhbm5lbF9pZHg7Ci0JaW50CXNjYW5fbW9kZTsKLQl1OCBzc2lkX251bTsKLQl1OCBjaF9udW07Ci0Jc3RydWN0IGNmZzgwMjExX3NzaWQgc3NpZFtSVFdfU1NJRF9TQ0FOX0FNT1VOVF07Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfY2hhbm5lbCBjaFtSVFdfQ0hBTk5FTF9TQ0FOX0FNT1VOVF07Ci19OwotCi0jZGVmaW5lCVdJRklfRldfQVVUSF9OVUxMCQkJMHgwMDAwMDEwMAotI2RlZmluZQlXSUZJX0ZXX0FVVEhfU1RBVEUJCQkweDAwMDAwMjAwCi0jZGVmaW5lCVdJRklfRldfQVVUSF9TVUNDRVNTCQkJMHgwMDAwMDQwMAotCi0jZGVmaW5lCVdJRklfRldfQVNTT0NfU1RBVEUJCQkweDAwMDAyMDAwCi0jZGVmaW5lCVdJRklfRldfQVNTT0NfU1VDQ0VTUwkJMHgwMDAwNDAwMAotCi0jZGVmaW5lCVdJRklfRldfTElOS0lOR19TVEFURQkJKFdJRklfRldfQVVUSF9OVUxMIHwgV0lGSV9GV19BVVRIX1NUQVRFIHwgV0lGSV9GV19BVVRIX1NVQ0NFU1MgfFdJRklfRldfQVNTT0NfU1RBVEUpCi0KLXN0cnVjdCBGV19TdGFfSW5mbyB7Ci0Jc3RydWN0IHN0YV9pbmZvCSpwc3RhOwotCXUzMglzdGF0dXM7Ci0JdTMyCXJ4X3BrdDsKLQl1MzIJcmV0cnk7Ci0JdW5zaWduZWQgY2hhciBTdXBwb3J0ZWRSYXRlc1tORElTXzgwMl8xMV9MRU5HVEhfUkFURVNfRVhdOwotfTsKLQotLyoKLSAqIFVzYWdlOgotICogV2hlbiBvbmUgaWZhY2UgYWN0ZWQgYXMgQVAgbW9kZSBhbmQgdGhlIG90aGVyIGlmYWNlIGlzIFNUQSBtb2RlIGFuZCBzY2FubmluZywKLSAqIGl0IHNob3VsZCBzd2l0Y2ggYmFjayB0byBBUCdzIG9wZXJhdGluZyBjaGFubmVsIHBlcmlvZGljYWxseS4KLSAqIFBhcmFtZXRlcnMgaW5mbzoKLSAqIFdoZW4gdGhlIGRyaXZlciBzY2FubmVkIFJUV19TQ0FOX05VTV9PRl9DSCBjaGFubmVscywgaXQgd291bGQgc3dpdGNoIGJhY2sgdG8gQVAncyBvcGVyYXRpbmcgY2hhbm5lbCBmb3IKLSAqIFJUV19TVEFZX0FQX0NIX01JTExJU0VDT05EICogU1VSVkVZX1RPIG1pbGxpc2Vjb25kcy4KLSAqIEV4YW1wbGU6Ci0gKiBGb3IgY2hpcCBzdXBwb3J0cyAyLjRHICsgNUdIeiBhbmQgQVAgbW9kZSBpcyBvcGVyYXRpbmcgaW4gY2hhbm5lbCAxLAotICogUlRXX1NDQU5fTlVNX09GX0NIIGlzIDgsIFJUV19TVEFZX0FQX0NIX01JTExJU0VDT05EIGlzIDMgYW5kIFNVUlZFWV9UTyBpcyAxMDAuCi0gKiBXaGVuIGl0J3MgU1RBIG1vZGUgZ2V0cyBzZXRfc2NhbiBjb21tYW5kLAotICogaXQgd291bGQKLSAqIDEuIERvaW5nIHRoZSBzY2FuIG9uIGNoYW5uZWwgMS4yLjMuNC41LjYuNy44Ci0gKiAyLiBCYWNrIHRvIGNoYW5uZWwgMSBmb3IgMzAwIG1pbGxpc2Vjb25kcwotICogMy4gR28gdGhyb3VnaCBkb2luZyBzaXRlIHN1cnZleSBvbiBjaGFubmVsIDkuMTAuMTEuMzYuNDAuNDQuNDguNTIKLSAqIDQuIEJhY2sgdG8gY2hhbm5lbCAxIGZvciAzMDAgbWlsbGlzZWNvbmRzCi0gKiA1LiAuLi4gYW5kIHNvIG9uLCB0aWxsIHN1cnZleSBkb25lLgotICovCi0KLXN0cnVjdCBtbG1lX2V4dF9pbmZvIHsKLQl1MzIJc3RhdGU7Ci0JdTMyCXJlYXV0aF9jb3VudDsKLQl1MzIJcmVhc3NvY19jb3VudDsKLQl1MzIJbGlua19jb3VudDsKLQl1MzIJYXV0aF9zZXE7Ci0JdTMyCWF1dGhfYWxnbzsJLyogIDgwMi4xMSBhdXRoLCBjb3VsZCBiZSBvcGVuLCBzaGFyZWQsIGF1dG8gKi8KLQl1MzIJYXV0aE1vZGVUb2dnbGU7Ci0JdTMyCWVuY19hbGdvOy8qIGVuY3J5cHQgYWxnb3JpdGhtOyAqLwotCXUzMglrZXlfaW5kZXg7CS8qICB0aGlzIGlzIG9ubHkgdmFsaWQgZm9yIGxlZ2VuZGFyeSB3ZXAsIDB+MyBmb3Iga2V5IGlkLiAqLwotCXUzMglpdjsKLQl1OAljaGdfdHh0WzEyOF07Ci0JdTE2CWFpZDsKLQl1MTYJYmNuX2ludGVydmFsOwotCXUxNgljYXBhYmlsaXR5OwotCXU4CWFzc29jX0FQX3ZlbmRvcjsKLQl1OAlzbG90VGltZTsKLQl1OAlwcmVhbWJsZV9tb2RlOwotCXU4CVdNTV9lbmFibGU7Ci0JdTgJRVJQX2VuYWJsZTsKLQl1OAlFUlBfSUU7Ci0JdTgJSFRfZW5hYmxlOwotCXU4CUhUX2NhcHNfZW5hYmxlOwotCXU4CUhUX2luZm9fZW5hYmxlOwotCXU4CUhUX3Byb3RlY3Rpb247Ci0JdTgJdHVyYm9Nb2RlX2N0czJzZWxmOwotCXU4CXR1cmJvTW9kZV9ydHNlbjsKLQl1OAlTTV9QUzsKLQl1OAlBRERCQV9yZXRyeV9jb3VudDsKLQl1OAlkaWFsb2dUb2tlbjsKLQkvKiAgQWNjZXB0IEFEREJBIFJlcXVlc3QgKi8KLQlib29sIGJBY2NlcHRBZGRiYVJlcTsKLQl1OAlid21vZGVfdXBkYXRlZDsKLQl1OAloaWRkZW5fc3NpZF9tb2RlOwotCi0Jc3RydWN0IEFEREJBX3JlcXVlc3QJCUFEREJBX3JlcTsKLQlzdHJ1Y3QgV01NX3BhcmFfZWxlbWVudAlXTU1fcGFyYW07Ci0Jc3RydWN0IGllZWU4MDIxMV9odF9jYXAgaHRfY2FwOwotCXN0cnVjdCBpZWVlODAyMTFfaHRfb3BlcmF0aW9uIEhUX2luZm87Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXgJCQluZXR3b3JrOy8qIGpvaW4gbmV0d29yayBvciBic3NfbmV0d29yaywgaWYgaW4gYXAgbW9kZSwgaXQgaXMgdGhlIHNhbWUgdG8gY3VyX25ldHdvcmsubmV0d29yayAqLwotCXN0cnVjdCBGV19TdGFfSW5mbwkJRldfc3RhX2luZm9bTlVNX1NUQV07Ci19OwotCi0vKiAgVGhlIGNoYW5uZWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjaGFubmVsIGluY2x1ZGluZyBqb2luaW5nLCBzY2FubmluZywgYW5kIHBvd2VyIGNvbnN0cmFpbnRzLiAqLwotc3RydWN0IHJ0X2NoYW5uZWxfaW5mbyB7Ci0JdTgJCUNoYW5uZWxOdW07CQkvKiAgVGhlIGNoYW5uZWwgbnVtYmVyLiAqLwotCWVudW0gcnRfc2Nhbl90eXBlIFNjYW5UeXBlOwkJLyogIFNjYW4gdHlwZSBzdWNoIGFzIHBhc3NpdmUgb3IgYWN0aXZlIHNjYW4uICovCi19OwotCi1pbnQgcnR3X2NoX3NldF9zZWFyY2hfY2gyM2Eoc3RydWN0IHJ0X2NoYW5uZWxfaW5mbyAqY2hfc2V0LCBjb25zdCB1MzIgY2gpOwotCi0vKiAgUDJQX01BWF9SRUdfQ0xBU1NFUyAtIE1heGltdW0gbnVtYmVyIG9mIHJlZ3VsYXRvcnkgY2xhc3NlcyAqLwotI2RlZmluZSBQMlBfTUFYX1JFR19DTEFTU0VTIDEwCi0KLS8qICBQMlBfTUFYX1JFR19DTEFTU19DSEFOTkVMUyAtIE1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzIHBlciByZWd1bGF0b3J5IGNsYXNzICovCi0jZGVmaW5lIFAyUF9NQVhfUkVHX0NMQVNTX0NIQU5ORUxTIDIwCi0KLS8qICAgc3RydWN0IHAycF9jaGFubmVscyAtIExpc3Qgb2Ygc3VwcG9ydGVkIGNoYW5uZWxzICovCi1zdHJ1Y3QgcDJwX2NoYW5uZWxzIHsKLQkvKiAgc3RydWN0IHAycF9yZWdfY2xhc3MgLSBTdXBwb3J0ZWQgcmVndWxhdG9yeSBjbGFzcyAqLwotCXN0cnVjdCBwMnBfcmVnX2NsYXNzIHsKLQkJLyogIHJlZ19jbGFzcyAtIFJlZ3VsYXRvcnkgY2xhc3MgKElFRUUgODAyLjExLTIwMDcsIEFubmV4IEopICovCi0JCXU4IHJlZ19jbGFzczsKLQotCQkvKiAgY2hhbm5lbCAtIFN1cHBvcnRlZCBjaGFubmVscyAqLwotCQl1OCBjaGFubmVsW1AyUF9NQVhfUkVHX0NMQVNTX0NIQU5ORUxTXTsKLQotCQkvKiAgY2hhbm5lbHMgLSBOdW1iZXIgb2YgY2hhbm5lbCBlbnRyaWVzIGluIHVzZSAqLwotCQlzaXplX3QgY2hhbm5lbHM7Ci0JfSByZWdfY2xhc3NbUDJQX01BWF9SRUdfQ0xBU1NFU107Ci0KLQkvKiAgcmVnX2NsYXNzZXMgLSBOdW1iZXIgb2YgcmVnX2NsYXNzIGVudHJpZXMgaW4gdXNlICovCi0Jc2l6ZV90IHJlZ19jbGFzc2VzOwotfTsKLQotc3RydWN0IHAycF9vcGVyX2NsYXNzX21hcCB7Ci0JZW51bSBod19tb2RlIHtJRUVFODAyMTFHLCBJRUVFODAyMTFBfSBtb2RlOwotCXU4IG9wX2NsYXNzOwotCXU4IG1pbl9jaGFuOwotCXU4IG1heF9jaGFuOwotCXU4IGluYzsKLQllbnVtIHsKLQkJQlcyMCwgQlc0MFBMVVMsIEJXNDBNSU5VUwotCX0gYnc7Ci19OwotCi1zdHJ1Y3QgbWxtZV9leHRfcHJpdiB7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyCSpwYWRhcHRlcjsKLQl1OAltbG1lZXh0X2luaXQ7Ci0JYXRvbWljX3QJCWV2ZW50X3NlcTsKLQl1MTYJbWdudF9zZXE7Ci0KLQkvKiBzdHJ1Y3QgZndfcHJpdglmd3ByaXY7ICovCi0KLQl1bnNpZ25lZCBjaGFyCWN1cl9jaGFubmVsOwotCXVuc2lnbmVkIGNoYXIJY3VyX2J3bW9kZTsKLQl1bnNpZ25lZCBjaGFyCWN1cl9jaF9vZmZzZXQ7LyogUFJJTUVfQ0hOTF9PRkZTRVQgKi8KLQl1bnNpZ25lZCBjaGFyCWN1cl93aXJlbGVzc19tb2RlOwkvKiAgTkVUV09SS19UWVBFICovCi0KLQl1bnNpZ25lZCBjaGFyCW1heF9jaGFuX251bXM7Ci0Jc3RydWN0IHJ0X2NoYW5uZWxfaW5mbwkJY2hhbm5lbF9zZXRbTUFYX0NIQU5ORUxfTlVNXTsKLQlzdHJ1Y3QgcDJwX2NoYW5uZWxzIGNoYW5uZWxfbGlzdDsKLQl1bnNpZ25lZCBjaGFyCWJhc2ljcmF0ZVtOdW1SYXRlc107Ci0JdW5zaWduZWQgY2hhcglkYXRhcmF0ZVtOdW1SYXRlc107Ci0KLQlzdHJ1Y3Qgc3NfcmVzCQlzaXRlc3VydmV5X3JlczsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbwltbG1leHRfaW5mbzsvKiBmb3Igc3RhL2FkaG9jIG1vZGUsIGluY2x1ZGluZyBjdXJyZW50IHNjYW5uaW5nL2Nvbm5lY3RpbmcvY29ubmVjdGVkIHJlbGF0ZWQgaW5mby4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIGFwIG1vZGUsIG5ldHdvcmsgaW5jbHVkZXMgYXAncyBjYXBfaW5mbyAqLwotCXN0cnVjdCB0aW1lcl9saXN0CQlzdXJ2ZXlfdGltZXI7Ci0Jc3RydWN0IHRpbWVyX2xpc3QJCWxpbmtfdGltZXI7Ci0JdTE2CQkJY2hhbl9zY2FuX3RpbWU7Ci0KLQl1OAlzY2FuX2Fib3J0OwotCXU4CXR4X3JhdGU7IC8qICBUWFJBVEUgd2hlbiBVU0VSQVRFIGlzIHNldC4gKi8KLQotCXUzMglyZXRyeTsgLyogcmV0cnkgZm9yIGlzc3VlIHByb2JlcmVxICovCi0KLQl1NjQgVFNGVmFsdWU7Ci0KLQl1bnNpZ25lZCBjaGFyIGJzdGFydF9ic3M7Ci0JdTggdXBkYXRlX2NoYW5uZWxfcGxhbl9ieV9hcF9kb25lOwotCS8qIHJlY3ZfZGVjYWNoZSBjaGVjayBmb3IgQWN0aW9uX3B1YmxpYyBmcmFtZSAqLwotCXU4IGFjdGlvbl9wdWJsaWNfZGlhbG9nX3Rva2VuOwotCXUxNgkgYWN0aW9uX3B1YmxpY19yeHNlcTsKLQl1OCBhY3RpdmVfa2VlcF9hbGl2ZV9jaGVjazsKLX07Ci0KLWludCBpbml0X21sbWVfZXh0X3ByaXYyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1pbnQgaW5pdF9od19tbG1lX2V4dDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgZnJlZV9tbG1lX2V4dF9wcml2MjNhIChzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQpOwotdm9pZCBpbml0X21sbWVfZXh0X3RpbWVyMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBpbml0X2FkZGJhX3JldHJ5X3RpbWVyMjNhKHN0cnVjdCBzdGFfaW5mbyAqcHN0YSk7Ci1zdHJ1Y3QgeG1pdF9mcmFtZSAqYWxsb2NfbWd0eG1pdGZyYW1lMjNhKHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdik7Ci0KLXVuc2lnbmVkIGNoYXIgbmV0d29ya3R5cGVfdG9fcmFpZDIzYSh1bnNpZ25lZCBjaGFyIG5ldHdvcmtfdHlwZSk7Ci11OCBqdWRnZV9uZXR3b3JrX3R5cGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdW5zaWduZWQgY2hhciAqcmF0ZSwKLQkJICAgICAgaW50IHJhdGVsZW4pOwotdm9pZCBnZXRfcmF0ZV9zZXQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdW5zaWduZWQgY2hhciAqcGJzc3JhdGUsCi0JCSAgaW50ICpic3NyYXRlX2xlbik7Ci12b2lkIFVwZGF0ZUJyYXRlVGJsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICptQnJhdGVzT1MpOwotdm9pZCBVcGRhdGUyM2FUYmxGb3JTb2Z0QVAodTggKmJzc3JhdGVzZXQsIHUzMiBic3NyYXRlbGVuKTsKLQotdTggcnR3X2dldF9vcGVyX2NoMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcik7Ci12b2lkIHJ0d19zZXRfb3Blcl9jaDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IGNoKTsKLXZvaWQgcnR3X3NldF9vcGVyX2J3MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgdTggYncpOwotdm9pZCBydHdfc2V0X29wZXJfY2gyM2FvZmZzZXQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCB1OCBvZmZzZXQpOwotCi12b2lkIHNldF9jaGFubmVsX2J3bW9kZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBjaGFyIGNoYW5uZWwsCi0JCQl1bnNpZ25lZCBjaGFyIGNoYW5uZWxfb2Zmc2V0LCB1bnNpZ25lZCBzaG9ydCBid21vZGUpOwotdm9pZCBTZWxlY3RDaGFubmVsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgY2hhbm5lbCk7Ci0KLXVuc2lnbmVkIGludCBkZWNpZGVfd2FpdF9mb3JfYmVhY29uX3RpbWVvdXQyM2EodW5zaWduZWQgaW50IGJjbl9pbnRlcnZhbCk7Ci0KLXZvaWQgY2xlYXJfY2FtX2VudHJ5MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGVudHJ5KTsKLQotdm9pZCBpbnZhbGlkYXRlX2NhbV9hbGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLWludCBhbGxvY2F0ZV9md19zdGFfZW50cnkyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIGZsdXNoX2FsbF9jYW1fZW50cnkyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLWJvb2wgSXNMZWdhbDVHQ2hhbm5lbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHU4IGNoYW5uZWwpOwotCi12b2lkIHVwZGF0ZV9uZXR3b3JrMjNhKHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpkc3QsIHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpzcmMsCi0JCSAgICBzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBib29sIHVwZGF0ZV9pZSk7Ci0KLXU4ICpnZXRfbXlfYnNzaWQyM2Eoc3RydWN0IHdsYW5fYnNzaWRfZXggKnBuZXR3b3JrKTsKLQotYm9vbCBpc19jbGllbnRfYXNzb2NpYXRlZF90b19hcDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLWJvb2wgaXNfY2xpZW50X2Fzc29jaWF0ZWRfdG9faWJzczIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLWJvb2wgaXNfSUJTU19lbXB0eTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotdW5zaWduZWQgY2hhciBjaGVja19hc3NvY19BUDIzYSh1OCAqcGZyYW1lLCB1aW50IGxlbik7Ci0KLWludCBXTU1fcGFyYW1faGFuZGxlcjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcCk7Ci12b2lkIFdNTU9uQXNzb2NSc3AyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLXZvaWQgSFRfY2Fwc19oYW5kbGVyMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwKTsKLXZvaWQgSFRfaW5mb19oYW5kbGVyMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwKTsKLXZvaWQgSFRPbkFzc29jUnNwMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi12b2lkIEVSUF9JRV9oYW5kbGVyMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwKTsKLXZvaWQgVkNTX3VwZGF0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpOwotCi12b2lkIHVwZGF0ZV9iZWFjb24yM2FfaW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210LCB1aW50IGxlbiwKLQkJCSAgIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSk7Ci1pbnQgcnR3X2NoZWNrX2Jjbl9pbmZvMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwKLQkJCSAgc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210LCB1MzIgcGFja2V0X2xlbik7Ci12b2lkIHVwZGF0ZV9JT1RfaW5mbzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgdXBkYXRlX2NhcGluZm8yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1MTYgdXBkYXRlQ2FwKTsKLXZvaWQgdXBkYXRlX3dpcmVsZXNzX21vZGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHVwZGF0ZV90eF9iYXNpY19yYXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IG1vZHVsYXRpb24pOwotdm9pZCB1cGRhdGVfYm1jX3N0YV9zdXBwb3J0X3JhdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIG1hY19pZCk7Ci1pbnQgdXBkYXRlX3N0YV9zdXBwb3J0X3JhdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnB2YXJfaWUsCi0JCQkgICAgdWludCB2YXJfaWVfbGVuLCBpbnQgY2FtX2lkeCk7Ci0KLS8qIGZvciBzdGEvYWRob2MgbW9kZSAqLwotdm9pZCB1cGRhdGVfc3RhX2luZm8yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKTsKLXVuc2lnbmVkIGludCB1cGRhdGVfYmFzaWNfcmF0ZTIzYSh1bnNpZ25lZCBjaGFyICpwdG4sIHVuc2lnbmVkIGludCBwdG5fc3opOwotdW5zaWduZWQgaW50IHVwZGF0ZV9zdXBwb3J0ZWRfcmF0ZTIzYSh1bnNpZ25lZCBjaGFyICpwdG4sIHVuc2lnbmVkIGludCBwdG5fc3opOwotdW5zaWduZWQgaW50IHVwZGF0ZV9NU0NfcmF0ZTIzYShzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqaHRfY2FwKTsKLXZvaWQgVXBkYXRlX1JBX0VudHJ5MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSk7Ci12b2lkIHNldF9zdGFfcmF0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpOwotCi1pbnQgcmVjZWl2ZV9kaXNjb25uZWN0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgIHVuc2lnbmVkIGNoYXIgKk1hY0FkZHIsIHVuc2lnbmVkIHNob3J0IHJlYXNvbik7Ci0KLXVuc2lnbmVkIGNoYXIgZ2V0X2hpZ2hlc3RfcmF0ZV9pZHgyM2EodTMyIG1hc2spOwotaW50IHN1cHBvcnRfc2hvcnRfR0kyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXApOwotYm9vbCBpc19hcF9pbl90a2lwMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotYm9vbCBpc19hcF9pbl93ZXAyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1ib29sIHNob3VsZF9mb3JiaWRfbl9yYXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi12b2lkIHJlcG9ydF9qb2luX3JlczIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBpbnQgcmVzKTsKLXZvaWQgcmVwb3J0X3N1cnZleV9ldmVudDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci12b2lkIHJlcG9ydF9zdXJ2ZXlkb25lX2V2ZW50MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCByZXBvcnRfZGVsX3N0YV9ldmVudDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICB1bnNpZ25lZCBjaGFyICpNYWNBZGRyLCB1bnNpZ25lZCBzaG9ydCByZWFzb24pOwotdm9pZCByZXBvcnRfYWRkX3N0YV9ldmVudDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICB1bnNpZ25lZCBjaGFyICpNYWNBZGRyLCBpbnQgY2FtX2lkeCk7Ci0KLWludCBzZXRfdHhfYmVhY29uX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIqcGFkYXB0ZXIpOwotdW5zaWduZWQgaW50IHNldHVwX2JlYWNvbl9mcmFtZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCXVuc2lnbmVkIGNoYXIgKmJlYWNvbl9mcmFtZSk7Ci12b2lkIHVwZGF0ZV9tZ250X3R4X3JhdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggcmF0ZSk7Ci12b2lkIHVwZGF0ZV9tZ250ZnJhbWVfYXR0cmliMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgIHN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliKTsKLXZvaWQgZHVtcF9tZ250ZnJhbWUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICAgIHN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lKTsKLXMzMiBkdW1wX21nbnRmcmFtZTIzYV9hbmRfd2FpdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgIHN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lLCBpbnQgdGltZW91dF9tcyk7Ci1zMzIgZHVtcF9tZ250ZnJhbWUyM2FfYW5kX3dhaXRfYWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWUpOwotCi12b2lkIGlzc3VlX2JlYWNvbjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBpbnQgdGltZW91dF9tcyk7Ci1pbnQgaXNzdWVfbnVsbGRhdGEyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdW5zaWduZWQgY2hhciAqZGEsCi0JCSAgIHVuc2lnbmVkIGludCBwb3dlcl9tb2RlLCBpbnQgdHJ5X2NudCwgaW50IHdhaXRfbXMpOwotaW50IGlzc3VlX3Fvc19udWxsZGF0YTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBjaGFyICpkYSwgdTE2IHRpZCwKLQkJICAgICAgIGludCB0cnlfY250LCBpbnQgd2FpdF9tcyk7Ci1pbnQgaXNzdWVfZGVhdXRoMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgKmRhLAotCQkgdW5zaWduZWQgc2hvcnQgcmVhc29uKTsKLXZvaWQgaXNzdWVfYWN0aW9uX3NwY3RfY2hfc3dpdGNoMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpyYSwKLQkJCQkgdTggbmV3X2NoLCB1OCBjaF9vZmZzZXQpOwotdm9pZCBpc3N1ZV9hY3Rpb25fQkEyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhZGRyLAotCQkJdW5zaWduZWQgY2hhciBhY3Rpb24sIHVuc2lnbmVkIHNob3J0IHN0YXR1cyk7Ci1pbnQgc2VuZF9kZWxiYTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBpbml0aWF0b3IsIHU4ICphZGRyKTsKLWludCBzZW5kX2JlYWNvbjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotdm9pZCBtbG1lZXh0X2pvaW5ic3NfZXZlbnRfY2FsbGJhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgaW50IGpvaW5fcmVzKTsKLXZvaWQgbWxtZWV4dF9zdGFfZGVsX2V2ZW50X2NhbGxiYWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBtbG1lZXh0X3N0YV9hZGRfZXZlbnRfY2FsbGJhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKTsKLQotdm9pZCBsaW5rZWRfc3RhdHVzX2NoazIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotI2RlZmluZSBzZXRfc3VydmV5X3RpbWVyKG1sbWVleHQsIG1zKSBcCi0JLypEQkdfODcyM0EoIiVzIHNldF9zdXJ2ZXlfdGltZXIoJXAsICVkKVxuIiwgX19mdW5jX18sIChtbG1lZXh0KSwgKG1zKSk7Ki8gXAotCW1vZF90aW1lcigmbWxtZWV4dC0+c3VydmV5X3RpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhtcykpOwotCi0jZGVmaW5lIHNldF9saW5rX3RpbWVyKG1sbWVleHQsIG1zKSBcCi0JLypEQkdfODcyM0EoIiVzIHNldF9saW5rX3RpbWVyKCVwLCAlZClcbiIsIF9fZnVuY19fLCAobWxtZWV4dCksIChtcykpOyovIFwKLQltb2RfdGltZXIoJm1sbWVleHQtPmxpbmtfdGltZXIsIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKG1zKSk7Ci0KLWludCBjY2tyYXRlc19pbmNsdWRlZDIzYSh1bnNpZ25lZCBjaGFyICpyYXRlLCBpbnQgcmF0ZWxlbik7Ci1pbnQgY2NrcmF0ZXNvbmx5X2luY2x1ZGVkMjNhKHVuc2lnbmVkIGNoYXIgKnJhdGUsIGludCByYXRlbGVuKTsKLQotdm9pZCBwcm9jZXNzX2FkZGJhX3JlcTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcGFkZGJhX3JlcSwgdTggKmFkZHIpOwotCi12b2lkIGNvcnJlY3RfVFNGMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCk7Ci0KLXN0cnVjdCBjbWRfaGRsIHsKLQl1aW50CXBhcm1zaXplOwotCWludCAoKmgyY2Z1bnMpKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKTsKLX07Ci0KLQotaW50IHJlYWRfbWFjcmVnX2hkbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcGJ1Zik7Ci1pbnQgd3JpdGVfbWFjcmVnX2hkbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcGJ1Zik7Ci1pbnQgcmVhZF9iYnJlZ19oZGwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnBidWYpOwotaW50IHdyaXRlX2JicmVnX2hkbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcGJ1Zik7Ci1pbnQgcmVhZF9yZnJlZ19oZGwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnBidWYpOwotaW50IHdyaXRlX3JmcmVnX2hkbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcGJ1Zik7Ci0KLQotaW50IE5VTExfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKTsKLWludCBqb2luX2NtZF9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotaW50IGRpc2Nvbm5lY3RfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKTsKLWludCBjcmVhdGVic3NfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKTsKLWludCBzZXRvcG1vZGVfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKTsKLWludCBzaXRlc3VydmV5X2NtZF9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotaW50IHNldGF1dGhfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKTsKLWludCBzZXRrZXlfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKTsKLWludCBzZXRfc3Rha2V5X2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1Zik7Ci1pbnQgc2V0X2Fzc29jc3RhX2hkbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1Zik7Ci1pbnQgZGVsX2Fzc29jc3RhX2hkbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1Zik7Ci1pbnQgYWRkX2JhX2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1Zik7Ci0KLWludCBtbG1lX2V2dF9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotaW50IGgyY19tc2dfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKTsKLWludCB0eF9iZWFjb25faGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKTsKLWludCBzZXRfY2hfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKTsKLWludCBzZXRfY2hwbGFuX2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1Zik7Ci1pbnQgbGVkX2JsaW5rX2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1Zik7Ci1pbnQgc2V0X2NzYV9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwkvKiBLdXJ0OiBIYW5kbGluZyBERlMgY2hhbm5lbCBzd2l0Y2ggYW5ub3VuY2VtZW50IGllLiAqLwotaW50IHRkbHNfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKTsKLQotI2RlZmluZSBHRU5fRFJWX0NNRF9IQU5ETEVSKHNpemUsIGNtZCkJe3NpemUsICZjbWQgIyMgX2hkbDIzYX0sCi0jZGVmaW5lIEdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemUsIGNtZCkJe3NpemUsIGNtZH0sCi0KLXN0cnVjdCBDMkhFdmVudF9IZWFkZXIgewotI2lmZGVmIF9fTElUVExFX0VORElBTgotCi0JdW5zaWduZWQgaW50IGxlbjoxNjsKLQl1bnNpZ25lZCBpbnQgSUQ6ODsKLQl1bnNpZ25lZCBpbnQgc2VxOjg7Ci0KLSNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCi0JdW5zaWduZWQgaW50IHNlcTo4OwotCXVuc2lnbmVkIGludCBJRDo4OwotCXVuc2lnbmVkIGludCBsZW46MTY7Ci0KLSNlbHNlCi0KLSMgIGVycm9yICJNdXN0IGJlIExJVFRMRSBvciBCSUcgRW5kaWFuIgotCi0jZW5kaWYKLQotCXVuc2lnbmVkIGludCByc3ZkOwotfTsKLQotZW51bSBydHdfYzJoX2V2ZW50IHsKLQlHRU5fRVZUX0NPREUoX1JlYWRfTUFDUkVHKSA9IDAsIC8qMCovCi0JR0VOX0VWVF9DT0RFKF9SZWFkX0JCUkVHKSwKLQlHRU5fRVZUX0NPREUoX1JlYWRfUkZSRUcpLAotCUdFTl9FVlRfQ09ERShfUmVhZF9FRVBST00pLAotCUdFTl9FVlRfQ09ERShfUmVhZF9FRlVTRSksCi0JR0VOX0VWVF9DT0RFKF9SZWFkX0NBTSksCQkJLyo1Ki8KLQlHRU5fRVZUX0NPREUoX0dldF9CYXNpY1JhdGUpLAotCUdFTl9FVlRfQ09ERShfR2V0X0RhdGFSYXRlKSwKLQlHRU5fRVZUX0NPREUoX1N1cnZleSksCSAvKjgqLwotCUdFTl9FVlRfQ09ERShfU3VydmV5RG9uZSksCSAvKjkqLwotCi0JR0VOX0VWVF9DT0RFKF9Kb2luQnNzKSAsIC8qMTAqLwotCUdFTl9FVlRfQ09ERShfQWRkU1RBKSwKLQlHRU5fRVZUX0NPREUoX0RlbFNUQSksCi0JR0VOX0VWVF9DT0RFKF9BdGltRG9uZSkgLAotCUdFTl9FVlRfQ09ERShfVFhfUmVwb3J0KSwKLQlHRU5fRVZUX0NPREUoX0NDWF9SZXBvcnQpLAkJCS8qMTUqLwotCUdFTl9FVlRfQ09ERShfRFRNX1JlcG9ydCksCi0JR0VOX0VWVF9DT0RFKF9UWF9SYXRlX1N0YXRpc3RpY3MpLAotCUdFTl9FVlRfQ09ERShfQzJITEJLKSwKLQlHRU5fRVZUX0NPREUoX0ZXREJHKSwKLQlHRU5fRVZUX0NPREUoX0MySEZFRURCQUNLKSwgICAgICAgICAgICAgICAvKjIwKi8KLQlHRU5fRVZUX0NPREUoX0FEREJBKSwKLQlHRU5fRVZUX0NPREUoX0MySEJDTiksCi0JR0VOX0VWVF9DT0RFKF9SZXBvcnRQd3JTdGF0ZSksCQkvKiBmaWxlbjogb25seSBmb3IgUENJRSwgVVNCICovCi0JR0VOX0VWVF9DT0RFKF9DbG9zZVJGKSwJCQkJLyogZmlsZW46IG9ubHkgZm9yIFBDSUUsIHdvcmsgYXJvdW5kIEFTUE0gKi8KLQlNQVhfQzJIRVZUCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfcHdyY3RybC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19wd3JjdHJsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5OWZlZDkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19wd3JjdHJsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fUlRXX1BXUkNUUkxfSF8KLSNkZWZpbmUgX19SVFdfUFdSQ1RSTF9IXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotCi0jZGVmaW5lIEZXX1BXUjAJCTAKLSNkZWZpbmUgRldfUFdSMQkJMQotI2RlZmluZSBGV19QV1IyCQkyCi0jZGVmaW5lIEZXX1BXUjMJCTMKLQotCi0jZGVmaW5lIEhXX1BXUjAJCTcKLSNkZWZpbmUgSFdfUFdSMQkJNgotI2RlZmluZSBIV19QV1IyCQkyCi0jZGVmaW5lIEhXX1BXUjMJCTAKLSNkZWZpbmUgSFdfUFdSNAkJOAotCi0jZGVmaW5lIEZXX1BXUk1TSwkweDcKLQotCi0jZGVmaW5lIFhNSVRfQUxJVkUJQklUKDApCi0jZGVmaW5lIFJFQ1ZfQUxJVkUJQklUKDEpCi0jZGVmaW5lIENNRF9BTElWRQlCSVQoMikKLSNkZWZpbmUgRVZUX0FMSVZFCUJJVCgzKQotCi1lbnVtIFBvd2VyX01nbnQgewotCVBTX01PREVfQUNUSVZFCT0gMCwKLQlQU19NT0RFX01JTiwKLQlQU19NT0RFX01BWCwKLQlQU19NT0RFX0RUSU0sCi0JUFNfTU9ERV9WT0lQLAotCVBTX01PREVfVUFQU0RfV01NLAotCVBTX01PREVfVUFQU0QsCi0JUFNfTU9ERV9JQlNTLAotCVBTX01PREVfV1dMQU4sCi0JUE1fUmFkaW9fT2ZmLAotCVBNX0NhcmRfRGlzYWJsZSwKLQlQU19NT0RFX05VTQotfTsKLQotCi0vKiBCSVRbMjowXSA9IEhXIHN0YXRlCi0gKiBCSVRbM10gPSBQcm90b2NvbCBQUyBzdGF0ZSwgIDA6IGFjdGl2ZSwgMTogc2xlZXAgc3RhdGUKLSAqIEJJVFs0XSA9IHN1Yi1zdGF0ZQotICovCi0KLSNkZWZpbmUgUFNfRFBTCQkJQklUKDApCi0jZGVmaW5lIFBTX0xDTEsJCQkoUFNfRFBTKQotI2RlZmluZSBQU19SRl9PRkYJCUJJVCgxKQotI2RlZmluZSBQU19BTExfT04JCUJJVCgyKQotI2RlZmluZSBQU19TVF9BQ1RJVkUJCUJJVCgzKQotCi0jZGVmaW5lIFBTX0lTUl9FTkFCTEUJCUJJVCg0KQotI2RlZmluZSBQU19JTVJfRU5BQkxFCQlCSVQoNSkKLSNkZWZpbmUgUFNfQUNLCQkJQklUKDYpCi0jZGVmaW5lIFBTX1RPR0dMRQkJQklUKDcpCi0KLSNkZWZpbmUgUFNfU1RBVEVfTUFTSwkJKDB4MEYpCi0jZGVmaW5lIFBTX1NUQVRFX0hXX01BU0sJKDB4MDcpCi0jZGVmaW5lIFBTX1NFUV9NQVNLCQkoMHhjMCkKLQotI2RlZmluZSBQU19TVEFURSh4KQkJKFBTX1NUQVRFX01BU0sgJiAoeCkpCi0jZGVmaW5lIFBTX1NUQVRFX0hXKHgpCShQU19TVEFURV9IV19NQVNLICYgKHgpKQotI2RlZmluZSBQU19TRVEoeCkJCShQU19TRVFfTUFTSyAmICh4KSkKLQotI2RlZmluZSBQU19TVEFURV9TMAkJKFBTX0RQUykKLSNkZWZpbmUgUFNfU1RBVEVfUzEJCShQU19MQ0xLKQotI2RlZmluZSBQU19TVEFURV9TMgkJKFBTX1JGX09GRikKLSNkZWZpbmUgUFNfU1RBVEVfUzMJCShQU19BTExfT04pCi0jZGVmaW5lIFBTX1NUQVRFX1M0CQkoKFBTX1NUX0FDVElWRSkgfCAoUFNfQUxMX09OKSkKLQotCi0jZGVmaW5lIFBTX0lTX1JGX09OKHgpCSgoeCkgJiAoUFNfQUxMX09OKSkKLSNkZWZpbmUgUFNfSVNfQUNUSVZFKHgpCSgoeCkgJiAoUFNfU1RfQUNUSVZFKSkKLSNkZWZpbmUgQ0xSX1BTX1NUQVRFKHgpCSgoeCkgPSAoKHgpICYgKDB4RjApKSkKLQotCi1zdHJ1Y3QgcmVwb3J0cHdyc3RhdGVfcGFybSB7Ci0JdW5zaWduZWQgY2hhciBtb2RlOwotCXVuc2lnbmVkIGNoYXIgc3RhdGU7IC8qIHRoZSBDUFdNIHZhbHVlICovCi0JdW5zaWduZWQgc2hvcnQgcnN2ZDsKLX07Ci0KLSNkZWZpbmUgTFBTX0RFTEFZX1RJTUUJKDEqSFopIC8qICAxIHNlYyAqLwotCi0jZGVmaW5lIEVYRV9QV1JfTk9ORQkJMHgwMQotI2RlZmluZSBFWEVfUFdSX0lQUwkJMHgwMgotI2RlZmluZSBFWEVfUFdSX0xQUwkJMHgwNAotCi0vKiAgUkYgc3RhdGUuICovCi1lbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlIHsKLQlyZl9vbiwJCS8qICBSRiBpcyBvbiBhZnRlciBSRlNsZWVwIG9yIFJGT2ZmICovCi0JcmZfc2xlZXAsCS8qICA4MDIuMTEgUG93ZXIgU2F2ZSBtb2RlICovCi0JcmZfb2ZmLAkJLyogIEhXL1NXIFJhZGlvIE9GRiBvciBJbmFjdGl2ZSBQb3dlciBTYXZlICovCi0JLyogQWRkIHRoZSBuZXcgUkYgc3RhdGUgYWJvdmUgdGhpcyBsaW5lPT09PT0gKi8KLQlyZl9tYXgKLX07Ci0KLS8qICBSRiBPZmYgTGV2ZWwgZm9yIElQUyBvciBIVy9TVyByYWRpbyBvZmYgKi8KLSNkZWZpbmUJUlRfUkZfT0ZGX0xFVkxfQVNQTQkJQklUKDApCS8qICBQQ0kgQVNQTSAqLwotI2RlZmluZQlSVF9SRl9PRkZfTEVWTF9DTEtfUkVRCQlCSVQoMSkJLyogIFBDSSBjbG9jayByZXF1ZXN0ICovCi0jZGVmaW5lCVJUX1JGX09GRl9MRVZMX1BDSV9EMwkJQklUKDIpCS8qICBQQ0kgRDMgbW9kZSAqLwotLyogTklDIGhhbHQsIHJlLWluaXQgaHcgcGFyYW1zICovCi0jZGVmaW5lCVJUX1JGX09GRl9MRVZMX0hBTFRfTklDCQlCSVQoMykKLS8qICBGVyBmcmVlLCByZS1kb3dubG9hZCB0aGUgRlcgKi8KLSNkZWZpbmUJUlRfUkZfT0ZGX0xFVkxfRlJFRV9GVwkJQklUKDQpCi0jZGVmaW5lCVJUX1JGX09GRl9MRVZMX0ZXXzMySwkJQklUKDUpCS8qICBGVyBpbiAzMmsgKi8KLS8qICBBbHdheXMgZW5hYmxlIEFTUE0gYW5kIENsb2NrIFJlcSBpbiBpbml0aWFsaXphdGlvbi4gKi8KLSNkZWZpbmUJUlRfUkZfUFNfTEVWRUxfQUxXQVlTX0FTUE0JQklUKDYpCi0vKiAgV2hlbiBMUFMgaXMgb24sIGRpc2FibGUgMlIgaWYgbm8gcGFja2V0IGlzIHJlY2VpdmVkIG9yIHRyYW5zbWl0dGQuICovCi0jZGVmaW5lCVJUX1JGX0xQU19ESVNBTEJFXzJSCQlCSVQoMzApCi0jZGVmaW5lCVJUX1JGX0xQU19MRVZFTF9BU1BNCQlCSVQoMzEpCS8qICBMUFMgd2l0aCBBU1BNICovCi0KLSNkZWZpbmUJUlRfSU5fUFNfTEVWRUwocHBzYywgX1BTX0ZMQUcpCQkJCVwKLQkoKHBwc2MtPmN1cl9wc19sZXZlbCAmIF9QU19GTEFHKSA/IHRydWUgOiBmYWxzZSkKLSNkZWZpbmUJUlRfQ0xFQVJfUFNfTEVWRUwocHBzYywgX1BTX0ZMQUcpCQkJXAotCShwcHNjLT5jdXJfcHNfbGV2ZWwgJj0gKH4oX1BTX0ZMQUcpKSkKLSNkZWZpbmUJUlRfU0VUX1BTX0xFVkVMKHBwc2MsIF9QU19GTEFHKQkJCQlcCi0JKHBwc2MtPmN1cl9wc19sZXZlbCB8PSBfUFNfRkxBRykKLQotCi1lbnVtIHsKLQlQU0JCUkVHX1JGMCA9IDAsCi0JUFNCQlJFR19SRjEsCi0JUFNCQlJFR19SRjIsCi0JUFNCQlJFR19BRkUwLAotCVBTQkJSRUdfVE9UQUxDTlQKLX07Ci0KLWVudW0geyAvKiAgZm9yIGlwc19tb2RlICovCi0JSVBTX05PTkUgPSAwLAotCUlQU19OT1JNQUwsCi0JSVBTX0xFVkVMXzIsCi19OwotCi1zdHJ1Y3QgcHdyY3RybF9wcml2IHsKLQlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7Ci0Jdm9sYXRpbGUgdTggcnB3bTsgLyogcmVxdWVzdGVkIHBvd2VyIHN0YXRlIGZvciBmdyAqLwotCXZvbGF0aWxlIHU4IGNwd207IC8qIGZ3IGN1cnJlbnQgcG93ZXIgc3RhdGUuIHVwZGF0ZWQgd2hlbiAxLgotCQkJICAgKiByZWFkIGZyb20gSENQV00gMi4gZHJpdmVyIGxvd2VycyBwb3dlciBsZXZlbAotCQkJICAgKi8KLQl2b2xhdGlsZSB1OCB0b2c7IC8qICB0b2dnbGluZyAqLwotCi0JdTgJcHdyX21vZGU7Ci0JdTgJc21hcnRfcHM7Ci0JdTgJYmNuX2FudF9tb2RlOwotCi0JdTgJYnBvd2VyX3NhdmluZzsKLQotCXU4CXJlZ19yZm9mZjsKLQl1MzIJcmZvZmZfcmVhc29uOwotCi0JLyogUkYgT0ZGIExldmVsICovCi0JdTMyCWN1cl9wc19sZXZlbDsKLQl1MzIJcmVnX3JmcHNfbGV2ZWw7Ci0KLQl1aW50CWlwc19lbnRlcjIzYV9jbnRzOwotCXVpbnQJaXBzX2xlYXZlMjNhX2NudHM7Ci0KLQl1OAlpcHNfbW9kZTsKLQl1OAlpcHNfbW9kZV9yZXE7IC8qICB1c2VkIHRvIGFjY2VwdCB0aGUgbW9kZSBzZXR0aW5nIHJlcXVlc3QgKi8KLQl1aW50IGJpcHNfcHJvY2Vzc2luZzsKLQl1bnNpZ25lZCBsb25nIGlwc19kZW55X3RpbWU7IC8qIGRlbnkgSVBTIHdoZW4gc3lzdGVtIHRpbWUgaXMgc21hbGxlciAqLwotCXU4IHBzX3Byb2Nlc3Npbmc7IC8qIHVzZWQgdG8gbWFyayB3aGV0aGVyIGluIHJ0d19wc19wcm9jZXNzb3IyM2EgKi8KLQotCXU4CWJMZWlzdXJlUHM7Ci0JdTgJTHBzSWRsZUNvdW50OwotCXU4CXBvd2VyX21nbnQ7Ci0JdTgJYkZ3Q3VycmVudEluUFNNb2RlOwotCXVuc2lnbmVkIGxvbmcJRGVsYXlMUFNMYXN0VGltZVN0YW1wOwotCXU4CWJ0Y29leF9yZm9uOwotCi0JdTgJCWJJblN1c3BlbmQ7Ci0jaWZkZWYJQ09ORklHXzg3MjNBVV9CVF9DT0VYSVNUCi0JdTgJCWJBdXRvUmVzdW1lOwotCXU4CQlhdXRvcG1fY250OwotI2VuZGlmCi0JdTgJCWJTdXBwb3J0UmVtb3RlV2FrZXVwOwotCXN0cnVjdCB0aW1lcl9saXN0CXB3cl9zdGF0ZV9jaGVja190aW1lcjsKLQlpbnQJCXB3cl9zdGF0ZV9jaGVja19pbnRlcnZhbDsKLQl1OAkJcHdyX3N0YXRlX2NoZWNrX2NudHM7Ci0KLQllbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlCXJmX3B3cnN0YXRlOy8qIGN1ciBwb3dlciBzdGF0ZSAqLwotCWVudW0gcnRfcmZfcG93ZXJfc3RhdGUJY2hhbmdlX3JmcHdyc3RhdGU7Ci0KLQl1OAlia2VlcGZ3YWxpdmU7Ci0JdW5zaWduZWQgbG9uZyBQU19CQlJlZ0JhY2t1cFtQU0JCUkVHX1RPVEFMQ05UXTsKLX07Ci0KLSNkZWZpbmUgUlRXX1BXUl9TVEFURV9DSEtfSU5URVJWQUwgMjAwMAotCi0jZGVmaW5lIF9ydHdfc2V0X3B3cl9zdGF0ZV9jaGVja190aW1lcihwd3JjdHJscHJpdiwgbXMpIFwKLQkobW9kX3RpbWVyKCZwd3JjdHJscHJpdi0+cHdyX3N0YXRlX2NoZWNrX3RpbWVyLCBqaWZmaWVzICsJXAotCQkgIG1zZWNzX3RvX2ppZmZpZXMobXMpKSkKLQotI2RlZmluZSBydHdfc2V0X3B3cl9zdGF0ZV9jaGVja190aW1lcihwd3JjdHJscHJpdikJXAotCShfcnR3X3NldF9wd3Jfc3RhdGVfY2hlY2tfdGltZXIoKHB3cmN0cmxwcml2KSwJXAotCQkJIChwd3JjdHJscHJpdiktPnB3cl9zdGF0ZV9jaGVja19pbnRlcnZhbCkpCi0KLXZvaWQgcnR3X2luaXRfcHdyY3RybF9wcml2MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcik7Ci12b2lkIHJ0d19mcmVlX3B3cmN0cmxfcHJpdihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpOwotCi12b2lkIHJ0d19zZXRfcHNfbW9kZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBwc19tb2RlLAotCQkgICAgIHU4IHNtYXJ0X3BzLCB1OCBiY25fYW50X21vZGUpOwotdm9pZCBydHdfc2V0X3Jwd20yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggdmFsOCk7Ci12b2lkIExlYXZlQWxsUG93ZXJTYXZlTW9kZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpOwotdm9pZCBpcHNfZW50ZXIyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1pbnQgaXBzX2xlYXZlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi12b2lkIHJ0d19wc19wcm9jZXNzb3IyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLWVudW0gcnRfcmZfcG93ZXJfc3RhdGUgUmZPbk9mZkRldGVjdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpOwotCi1zMzIgTFBTX1JGX09OX2NoZWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiBkZWxheV9tcyk7Ci12b2lkIExQU19FbnRlcjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgTFBTX0xlYXZlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi12b2lkIHJ0d19zZXRfaXBzX2RlbnkyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIG1zKTsKLWludCBfcnR3X3B3cl93YWtldXAyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIGlwc19kZWZmZXJfbXMsCi0JCSAgICBjb25zdCBjaGFyICpjYWxsZXIpOwotI2RlZmluZSBydHdfcHdyX3dha2V1cChhZGFwdGVyKSBfcnR3X3B3cl93YWtldXAyM2EoYWRhcHRlciwJCVwKLQkgUlRXX1BXUl9TVEFURV9DSEtfSU5URVJWQUwsIF9fZnVuY19fKQotaW50IHJ0d19wbV9zZXRfaXBzMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IG1vZGUpOwotaW50IHJ0d19wbV9zZXRfbHBzMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IG1vZGUpOwotCi0jZW5kaWYgIC8qIF9fUlRMODcxWF9QV1JDVFJMX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X3JlY3YuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfcmVjdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWE1ZWRiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfcmVjdi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfUlRXX1JFQ1ZfSF8KLSNkZWZpbmUgX1JUV19SRUNWX0hfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8SGFsODcyM0FQaHlDZmcuaD4KLQotI2RlZmluZSBOUl9SRUNWRlJBTUUJCTI1NgotCi0jZGVmaW5lIE1BWF9SWEZSQU1FX0NOVAkJNTEyCi0jZGVmaW5lIE1BWF9SWF9OVU1CTEtTCQkoMzIpCi0jZGVmaW5lIFJFQ1ZGUkFNRV9IRFJfQUxJR04JMTI4Ci0KLSNkZWZpbmUgU05BUF9TSVpFIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3NuYXBfaGRyKQotCi0jZGVmaW5lIE1BWF9TVUJGUkFNRV9DT1VOVAk2NAotCi0vKiBmb3IgUnggcmVvcmRlcmluZyBidWZmZXIgY29udHJvbCAqLwotc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsIHsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIJKnBhZGFwdGVyOwotCXU4IGVuYWJsZTsKLQl1MTYgaW5kaWNhdGVfc2VxOy8qIHdzdGFydF9iLCBpbml0X3ZhbHVlPTB4ZmZmZiAqLwotCXUxNiB3ZW5kX2I7Ci0JdTggd3NpemVfYjsKLQlzdHJ1Y3QgcnR3X3F1ZXVlIHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlOwotCXN0cnVjdCB0aW1lcl9saXN0IHJlb3JkZXJpbmdfY3RybF90aW1lcjsKLX07Ci0KLXN0cnVjdAlzdGFpbmZvX3J4Y2FjaGUJewotCXUxNgl0aWRfcnhzZXFbMTZdOwotLyoKLQl1bnNpZ25lZCBzaG9ydAl0aWQwX3J4c2VxOwotCXVuc2lnbmVkIHNob3J0CXRpZDFfcnhzZXE7Ci0JdW5zaWduZWQgc2hvcnQJdGlkMl9yeHNlcTsKLQl1bnNpZ25lZCBzaG9ydAl0aWQzX3J4c2VxOwotCXVuc2lnbmVkIHNob3J0CXRpZDRfcnhzZXE7Ci0JdW5zaWduZWQgc2hvcnQJdGlkNV9yeHNlcTsKLQl1bnNpZ25lZCBzaG9ydAl0aWQ2X3J4c2VxOwotCXVuc2lnbmVkIHNob3J0CXRpZDdfcnhzZXE7Ci0JdW5zaWduZWQgc2hvcnQJdGlkOF9yeHNlcTsKLQl1bnNpZ25lZCBzaG9ydAl0aWQ5X3J4c2VxOwotCXVuc2lnbmVkIHNob3J0CXRpZDEwX3J4c2VxOwotCXVuc2lnbmVkIHNob3J0CXRpZDExX3J4c2VxOwotCXVuc2lnbmVkIHNob3J0CXRpZDEyX3J4c2VxOwotCXVuc2lnbmVkIHNob3J0CXRpZDEzX3J4c2VxOwotCXVuc2lnbmVkIHNob3J0CXRpZDE0X3J4c2VxOwotCXVuc2lnbmVkIHNob3J0CXRpZDE1X3J4c2VxOwotKi8KLX07Ci0KLXN0cnVjdCBzbW9vdGhfcnNzaV9kYXRhIHsKLQl1MzIJZWxlbWVudHNbMTAwXTsJLyogYXJyYXkgdG8gc3RvcmUgdmFsdWVzICovCi0JdTMyCWluZGV4OwkJCS8qIGluZGV4IHRvIGN1cnJlbnQgYXJyYXkgdG8gc3RvcmUgKi8KLQl1MzIJdG90YWxfbnVtOwkJLyogbnVtIG9mIHZhbGlkIGVsZW1lbnRzICovCi0JdTMyCXRvdGFsX3ZhbDsJCS8qIHN1bSBvZiB2YWxpZCBlbGVtZW50cyAqLwotfTsKLQotc3RydWN0IHNpZ25hbF9zdGF0IHsKLQl1OAl1cGRhdGVfcmVxOwkJLyogdXNlZCB0byBpbmRpY2F0ZSAqLwotCXU4CWF2Z192YWw7CQkvKiBhdmcgb2YgdmFsaWQgZWxlbWVudHMgKi8KLQl1MzIJdG90YWxfbnVtOwkJLyogbnVtIG9mIHZhbGlkIGVsZW1lbnRzICovCi0JdTMyCXRvdGFsX3ZhbDsJCS8qIHN1bSBvZiB2YWxpZCBlbGVtZW50cyAqLwotfTsKLQotc3RydWN0IHBoeV9pbmZvIHsKLQl1OAkJUnhQV0RCQWxsOwotCXU4CQlTaWduYWxRdWFsaXR5OwkgLyogIGluIDAtMTAwIGluZGV4LiAqLwotCXU4CQlSeE1JTU9TaWduYWxRdWFsaXR5W1JGX1BBVEhfTUFYXTsgLyogRVZNICovCi0JdTgJCVJ4TUlNT1NpZ25hbFN0cmVuZ3RoW1JGX1BBVEhfTUFYXTsvKiAwfjEwMCAqLwotCXM4CQlSeFBvd2VyOyAvKiAgaW4gZEJtIFRyYW5zbGF0ZSBmcm9tIFBXZEIgKi8KLQkvKiBSZWFsIHBvd2VyIGluIGRCbSBmb3IgdGhpcyBwYWNrZXQsIG5vIGJlYXV0aWZpY2F0aW9uIGFuZCBhZ2dyZWdhdGlvbi4KLQkgKiBLZWVwIHRoaXMgcmF3IGluZm8gdG8gYmUgdXNlZCBmb3IgdGhlIG90aGVyIHByb2NlZHVyZXMuCi0JICovCi0JczgJCVJlY3ZTaWduYWxQb3dlcjsKLQl1OAkJQlRSeFJTU0lQZXJjZW50YWdlOwotCXU4CQlTaWduYWxTdHJlbmd0aDsgLyogIGluIDAtMTAwIGluZGV4LiAqLwotCXU4CQlSeFB3cltSRl9QQVRIX01BWF07LyogcGVyLXBhdGgncyBwd2RiICovCi0JdTgJCVJ4U05SW1JGX1BBVEhfTUFYXTsvKiBwZXItcGF0aCdzIFNOUiAqLwotfTsKLQotCi1zdHJ1Y3QgcnhfcGt0X2F0dHJpYgl7Ci0JdTE2CXBrdF9sZW47Ci0JdTgJcGh5c3Q7Ci0JdTgJZHJ2aW5mb19zejsKLQl1OAlzaGlmdF9zejsKLQl1OAloZHJsZW47IC8qIHRoZSBXTEFOIEhlYWRlciBMZW4gKi8KLQl1OAlhbXNkdTsKLQl1OAlxb3M7Ci0JdTgJcHJpb3JpdHk7Ci0JdTgJcHdfc2F2ZTsKLQl1OAltZGF0YTsKLQl1MTYJc2VxX251bTsKLQl1OAlmcmFnX251bTsKLQl1OAltZnJhZzsKLQl1OAlvcmRlcjsKLQl1OAlwcml2YWN5OyAvKiBpbiBmcmFtZV9jdHJsIGZpZWxkICovCi0JdTgJYmRlY3J5cHRlZDsKLQkvKiB3aGVuIDAgaW5kaWNhdGUgbm8gZW5jcnlwdC4gd2hlbiBub24temVybywgaW5kaWNhdGUgdGhlIGFsZ29yaXRoICovCi0JdTMyCWVuY3J5cHQ7Ci0JdTgJaXZfbGVuOwotCXU4CWljdl9sZW47Ci0JdTgJY3JjX2VycjsKLQl1OAlpY3ZfZXJyOwotCi0JdTE2IGV0aF90eXBlOwotCi0JdTgJZHN0W0VUSF9BTEVOXTsKLQl1OAlzcmNbRVRIX0FMRU5dOwotCXU4CXRhW0VUSF9BTEVOXTsKLQl1OAlyYVtFVEhfQUxFTl07Ci0JdTgJYnNzaWRbRVRIX0FMRU5dOwotCi0JdTggYWNrX3BvbGljeTsKLQotCXU4CXRjcGNoa192YWxpZDsgLyogIDA6IGludmFsaWQsIDE6IHZhbGlkICovCi0JdTgJaXBfY2hrcnB0OyAvKiAwOiBpbmNvcnJlY3QsIDE6IGNvcnJlY3QgKi8KLQl1OAl0Y3BfY2hrcnB0OyAvKiAwOiBpbmNvcnJlY3QsIDE6IGNvcnJlY3QgKi8KLQl1OAlrZXlfaW5kZXg7Ci0KLQl1OAltY3NfcmF0ZTsKLQl1OAlyeGh0OwotCXU4CXNnaTsKLQl1OAlwa3RfcnB0X3R5cGU7Ci0JdTMyCU1hY0lEVmFsaWRFbnRyeVsyXTsJLyogIDY0IGJpdHMgcHJlc2VudCA2NCBlbnRyeS4gKi8KLQlzdHJ1Y3QgcGh5X2luZm8gcGh5X2luZm87Ci19OwotCi0vKiBUaGVzZSBkZWZpbml0aW9uIGlzIHVzZWQgZm9yIFJ4IHBhY2tldCByZW9yZGVyaW5nLiAqLwotI2RlZmluZSBTTl9MRVNTKGEsIGIpCQkoKChhLWIpICYgMHg4MDApICE9IDApCi0jZGVmaW5lIFNOX0VRVUFMKGEsIGIpCQkoYSA9PSBiKQotI2RlZmluZSBSRU9SREVSX1dBSVRfVElNRQkoNTApIC8qICAobXMpICovCi0KLSNkZWZpbmUgUkVDVkJVRkZfQUxJR05fU1ogOAotCi0jZGVmaW5lIFJYREVTQ19TSVpFCTI0Ci0jZGVmaW5lIFJYREVTQ19PRkZTRVQgUlhERVNDX1NJWkUKLQotc3RydWN0IHJlY3Zfc3RhdCB7Ci0JX19sZTMyIHJ4ZHcwOwotCV9fbGUzMiByeGR3MTsKLQlfX2xlMzIgcnhkdzI7Ci0JX19sZTMyIHJ4ZHczOwotCV9fbGUzMiByeGR3NDsKLQlfX2xlMzIgcnhkdzU7Ci19OwotCi0vKiBhY2Nlc3NlciBvZiByZWN2X3ByaXY6IHJ0d19yZWN2X2VudHJ5MjNhKGRpc3BhdGNoIC8gcGFzc2l2ZSBsZXZlbCk7CVwKLSAqIHJlY3ZfdGhyZWFkKHBhc3NpdmUpIDsgcmV0dXJucGt0KGRpc3BhdGNoKSA7IGhhbHQocGFzc2l2ZSkgOwotICoKLSAqIHVzaW5nIGVudGVyX2NyaXRpY2FsIHNlY3Rpb24gdG8gcHJvdGVjdAotICovCi1zdHJ1Y3QgcmVjdl9wcml2IHsKLQlzcGlubG9ja190CWxvY2s7Ci0KLQlzdHJ1Y3QgcnR3X3F1ZXVlCWZyZWVfcmVjdl9xdWV1ZTsKLQlzdHJ1Y3QgcnR3X3F1ZXVlCXJlY3ZfcGVuZGluZ19xdWV1ZTsKLQlzdHJ1Y3QgcnR3X3F1ZXVlCXVjX3N3ZGVjX3BlbmRpbmdfcXVldWU7Ci0KLQlpbnQgZnJlZV9yZWN2ZnJhbWVfY250OwotCi0Jc3RydWN0IHJ0d19hZGFwdGVyCSphZGFwdGVyOwotCi0JdTMyCWJJc0FueU5vbkJFUGt0czsKLQl1NjQJcnhfYnl0ZXM7Ci0JdTY0CXJ4X3BrdHM7Ci0JdTY0CXJ4X2Ryb3A7Ci0JdTY0CWxhc3RfcnhfYnl0ZXM7Ci0KLQl1aW50ICByeF9pY3ZfZXJyOwotCXVpbnQgIHJ4X2xhcmdlcGFja2V0X2NyY2VycjsKLQl1aW50ICByeF9zbWFsbHBhY2tldF9jcmNlcnI7Ci0JdWludCAgcnhfbWlkZGxlcGFja2V0X2NyY2VycjsKLQotCS8qIHU4ICpwYWxsb2NhdGVkX3VyYl9idWY7ICovCi0JdTgJcnhfcGVuZGluZ19jbnQ7Ci0KLQlzdHJ1Y3QgdXJiICppbnRfaW5fdXJiOwotCi0JdTgJKmludF9pbl9idWY7Ci0KLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgaXJxX3ByZXBhcmVfYmVhY29uX3Rhc2tsZXQ7Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IHJlY3ZfdGFza2xldDsKLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGZyZWVfcmVjdl9za2JfcXVldWU7Ci0Jc3RydWN0IHNrX2J1ZmZfaGVhZCByeF9za2JfcXVldWU7Ci0JdTggKnByZWN2X2J1ZjsKLQotCS8qIEZvciBkaXNwbGF5IHRoZSBwaHkgaW5mb3JtYXRpb20gKi8KLQlzOCByeHB3ZGI7Ci0JdTggc2lnbmFsX3N0cmVuZ3RoOwotCXU4IHNpZ25hbF9xdWFsOwotCXU4IG5vaXNlOwotCWludCBSeFNOUmRCWzJdOwotCXM4IFJ4UnNzaVsyXTsKLQlpbnQgRmFsc2VBbG1DbnRfYWxsOwotCi0Jc3RydWN0IHRpbWVyX2xpc3Qgc2lnbmFsX3N0YXRfdGltZXI7Ci0JdTMyIHNpZ25hbF9zdGF0X3NhbXBsaW5nX2ludGVydmFsOwotCS8qIHUzMiBzaWduYWxfc3RhdF9jb252ZXJnaW5nX2NvbnN0YW50OyAqLwotCXN0cnVjdCBzaWduYWxfc3RhdCBzaWduYWxfcXVhbF9kYXRhOwotCXN0cnVjdCBzaWduYWxfc3RhdCBzaWduYWxfc3RyZW5ndGhfZGF0YTsKLX07Ci0KLSNkZWZpbmUgcnR3X3NldF9zaWduYWxfc3RhdF90aW1lcihyZWN2cHJpdikJCQlcCi0JIG1vZF90aW1lcigmKHJlY3Zwcml2KS0+c2lnbmFsX3N0YXRfdGltZXIsIGppZmZpZXMgKwlcCi0JCSAgIG1zZWNzX3RvX2ppZmZpZXMoKHJlY3Zwcml2KS0+c2lnbmFsX3N0YXRfc2FtcGxpbmdfaW50ZXJ2YWwpKQotCi1zdHJ1Y3Qgc3RhX3JlY3ZfcHJpdiB7Ci0Jc3BpbmxvY2tfdAlsb2NrOwotCWludAlvcHRpb247Ci0KLQkvKiBzdHJ1Y3QgcnR3X3F1ZXVlCWJsa19zdHJtc1tNQVhfUlhfTlVNQkxLU107ICovCi0Jc3RydWN0IHJ0d19xdWV1ZSBkZWZyYWdfcTsJIC8qIGtlZXBpbmcgdGhlIGZyYWdtZW50IGZyYW1lIHVudGlsIGRlZnJhZyAqLwotCi0Jc3RydWN0CXN0YWluZm9fcnhjYWNoZSByeGNhY2hlOwotCi0JLyogdWludAlzdGFfcnhfYnl0ZXM7ICovCi0JLyogdWludAlzdGFfcnhfcGt0czsgKi8KLQkvKiB1aW50CXN0YV9yeF9mYWlsOyAqLwotCi19OwotCi0KLXN0cnVjdCByZWN2X2J1ZiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCi0Jc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyOwotCi0Jc3RydWN0IHVyYiAqcHVyYjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcHNrYjsKLX07Ci0KLS8qCWhlYWQgIC0tLS0tPgotICoKLSAqCQlkYXRhICAtLS0tLT4KLSAqCi0gKgkJCXBheWxvYWQKLSAqCi0gKgkJdGFpbCAgLS0tLS0+Ci0gKgotICoJZW5kICAgLS0tLS0+Ci0gKgotICoJbGVuID0gKHVuc2lnbmVkIGludCApKHRhaWwgLSBkYXRhKTsKLSAqCi0gKi8KLXN0cnVjdCByZWN2X2ZyYW1lIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7Ci0Jc3RydWN0IHNrX2J1ZmYgKnBrdDsKLQotCXN0cnVjdCBydHdfYWRhcHRlciAgKmFkYXB0ZXI7Ci0KLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiBhdHRyaWI7Ci0KLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0KLQkvKiBmb3IgQS1NUERVIFJ4IHJlb3JkZXJpbmcgYnVmZmVyIGNvbnRyb2wgKi8KLQlzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmw7Ci19OwotCi0vKiBnZXQgYSBmcmVlIHJlY3ZfZnJhbWUgZnJvbSBwZnJlZV9yZWN2X3F1ZXVlICovCi1zdHJ1Y3QgcmVjdl9mcmFtZSAqcnR3X2FsbG9jX3JlY3ZmcmFtZTIzYShzdHJ1Y3QgcnR3X3F1ZXVlICpwZnJlZV9yZWN2X3F1ZXVlKTsKLWludCBydHdfZnJlZV9yZWN2ZnJhbWUyM2Eoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpOwotCi1pbnQgcnR3X2VucXVldWVfcmVjdmZyYW1lMjNhKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCBzdHJ1Y3QgcnR3X3F1ZXVlICpxdWV1ZSk7Ci0KLXUzMiBydHdfZnJlZV91Y19zd2RlY19wZW5kaW5nX3F1ZXVlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcik7Ci0KLXN0cnVjdCByZWN2X2J1ZiAqcnR3X2RlcXVldWVfcmVjdmJ1ZjIzYShzdHJ1Y3QgcnR3X3F1ZXVlICpxdWV1ZSk7Ci0KLXZvaWQgcnR3X3Jlb3JkZXJpbmdfY3RybF90aW1lb3V0X2hhbmRsZXIyM2EodW5zaWduZWQgbG9uZyBwY29udGV4dCk7Ci0KLXN0YXRpYyBpbmxpbmUgczMyIHRyYW5zbGF0ZV9wZXJjZW50YWdlX3RvX2RibSh1MzIgU2lnbmFsU3RyZW5ndGhJbmRleCkKLXsKLQlzMzIJU2lnbmFsUG93ZXI7IC8qICBpbiBkQm0uICovCi0KLQkvKiAgVHJhbnNsYXRlIHRvIGRCbSAoeD0wLjV5LTk1KS4gKi8KLQlTaWduYWxQb3dlciA9IChzMzIpKChTaWduYWxTdHJlbmd0aEluZGV4ICsgMSkgPj4gMSk7Ci0JU2lnbmFsUG93ZXIgLT0gOTU7Ci0KLQlyZXR1cm4gU2lnbmFsUG93ZXI7Ci19Ci0KLQotc3RydWN0IHN0YV9pbmZvOwotCi12b2lkIF9ydHdfaW5pdF9zdGFfcmVjdl9wcml2MjNhKHN0cnVjdCBzdGFfcmVjdl9wcml2ICpwc3RhX3JlY3Zwcml2KTsKLQotdm9pZCBtZ3RfZGlzcGF0Y2hlcjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X3JmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X3JmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZGU3MTQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19yZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZglfX1JUV19SRl9IXwotI2RlZmluZSBfX1JUV19SRl9IXwotCi0jaW5jbHVkZSA8cnR3X2NtZC5oPgotCi0jZGVmaW5lIE9GRE1fUEhZCQkxCi0jZGVmaW5lIE1JWEVEX1BIWQkJMgotI2RlZmluZSBDQ0tfUEhZCQkJMwotCi0jZGVmaW5lIE51bVJhdGVzCQkoMTMpCi0KLS8qICBzbG90IHRpbWUgZm9yIDExZyAqLwotI2RlZmluZSBTSE9SVF9TTE9UX1RJTUUJCQk5Ci0jZGVmaW5lIE5PTl9TSE9SVF9TTE9UX1RJTUUJCTIwCi0KLS8qICBXZSBub3cgZGVmaW5lIHRoZSBtYXggY2hhbm5lbHMgaW4gZWFjaCBjaGFubmVsIHBsYW4uICovCi0jZGVmaW5lCU1BWF9DSEFOTkVMX05VTV8yRwkxNAotI2RlZmluZQlNQVhfQ0hBTk5FTF9OVU1fNUcJMjQKLSNkZWZpbmUJTUFYX0NIQU5ORUxfTlVNCQkzOC8qIDE0KzI0ICovCi0KLS8qIGRlZmluZSBOVU1fUkVHVUxBVE9SWVMJMjEgKi8KLSNkZWZpbmUgTlVNX1JFR1VMQVRPUllTCTEKLQotLyogQ291bnRyeSBjb2RlcyAqLwotI2RlZmluZSBVU0EJCTB4NTU1MzIwCi0jZGVmaW5lIEVVUk9QRQkJMHgxIC8qIHRlbXAsIHNob3VsZCBiZSBwcm92aWRlZCBsYXRlciAqLwotI2RlZmluZSBKQVBBTgkJMHgyIC8qIHRlbXAsIHNob3VsZCBiZSBwcm92aWRlZCBsYXRlciAqLwotCi1zdHJ1Y3QJcmVndWxhdG9yeV9jbGFzcyB7Ci0JdTMyCXN0YXJ0aW5nX2ZyZXE7CQkJCQkvKiBNSHosICovCi0JdTgJY2hhbm5lbF9zZXRbTUFYX0NIQU5ORUxfTlVNXTsKLQl1OAljaGFubmVsX2Nja19wb3dlcltNQVhfQ0hBTk5FTF9OVU1dOy8qIGRibSAqLwotCXU4CWNoYW5uZWxfb2ZkbV9wb3dlcltNQVhfQ0hBTk5FTF9OVU1dOy8qIGRibSAqLwotCXU4CXR4cG93ZXJfbGltaXQ7CQkJCQkvKiBkYm0gKi8KLQl1OAljaGFubmVsX3NwYWNpbmc7CQkJCS8qIE1IeiAqLwotCXU4CW1vZGVtOwotfTsKLQotZW51bSB7Ci0JY0VTUwkJPSAweDAwMDEsCi0JY0lCU1MJCT0gMHgwMDAyLAotCWNQb2xsYWJsZQk9IDB4MDAwNCwKLQljUG9sbFJlcQk9IDB4MDAwOCwKLQljUHJpdmFjeQk9IDB4MDAxMCwKLQljU2hvcnRQcmVhbWJsZQk9IDB4MDAyMCwKLQljUEJDQwkJPSAweDAwNDAsCi0JY0NoYW5uZWxBZ2lsaXR5CT0gMHgwMDgwLAotCWNTcGVjdHJ1bU1nbnQJPSAweDAxMDAsCi0JY1FvcwkJPSAweDAyMDAsCS8qICBGb3IgSENDQSwgdXNlIHdpdGggQ0YtUG9sbGFibGUgYW5kIENGLVBvbGxSZXEgKi8KLQljU2hvcnRTbG90VGltZQk9IDB4MDQwMCwKLQljQVBTRAkJPSAweDA4MDAsCi0JY1JNCQk9IDB4MTAwMCwJLyogIFJSTSAoUmFkaW8gUmVxdWVzdCBNZWFzdXJlbWVudCkgKi8KLQljRFNTU19PRkRNCT0gMHgyMDAwLAotCWNEZWxheWVkQkEJPSAweDQwMDAsCi0JY0ltbWVkaWF0ZUJBCT0gMHg4MDAwLAotfTsKLQotZW51bSB7Ci0JUFJFQU1CTEVfTE9ORwk9IDEsCi0JUFJFQU1CTEVfQVVUTwk9IDIsCi0JUFJFQU1CTEVfU0hPUlQJPSAzLAotfTsKLQotLyogIEJhbmR3aWR0aCBPZmZzZXQgKi8KLSNkZWZpbmUgSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRQkwCi0jZGVmaW5lIEhBTF9QUklNRV9DSE5MX09GRlNFVF9MT1dFUgkxCi0jZGVmaW5lIEhBTF9QUklNRV9DSE5MX09GRlNFVF9VUFBFUgkyCi0KLS8qICBSZXByZXNlbnQgQ2hhbm5lbCBXaWR0aCBpbiBIVCBDYXBhYmlsaXRpZXMgKi8KLWVudW0gaHRfY2hhbm5lbF93aWR0aCB7Ci0JSFRfQ0hBTk5FTF9XSURUSF8yMCA9IDAsCi0JSFRfQ0hBTk5FTF9XSURUSF80MCA9IDEsCi0JSFRfQ0hBTk5FTF9XSURUSF84MCA9IDIsCi0JSFRfQ0hBTk5FTF9XSURUSF8xNjAgPSAzLAotCUhUX0NIQU5ORUxfV0lEVEhfMTAgPSA0LAotfTsKLQotLyogMjAwNy8xMS8xNSBNSCBEZWZpbmUgZGlmZmVyZW50IFJGIHR5cGUuICovCi1lbnVtIHsKLQlSRl8xVDJSID0gMCwKLQlSRl8yVDRSID0gMSwKLQlSRl8yVDJSID0gMiwKLQlSRl8xVDFSID0gMywKLQlSRl8yVDJSX0dSRUVOID0gNCwKLQlSRl84MTlYX01BWF9UWVBFID0gNSwKLX07Ci0KLSNlbmRpZiAvKiBfUlRMODcxMV9SRl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19zZWN1cml0eS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19zZWN1cml0eS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjRhOWQ3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfc2VjdXJpdHkuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19SVFdfU0VDVVJJVFlfSF8KLSNkZWZpbmUgX19SVFdfU0VDVVJJVFlfSF8KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLSNpbmNsdWRlIDxuZXQvbGliODAyMTEuaD4KLQotCi0jZGVmaW5lIGlzX3dlcF9lbmMoYWxnKSAoYWxnID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwIHx8IFwKLQkJCSBhbGcgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KQotCi0jZGVmaW5lIFNIQTI1Nl9NQUNfTEVOIDMyCi0jZGVmaW5lIEFFU19CTE9DS19TSVpFIDE2Ci0jZGVmaW5lIEFFU19QUklWX1NJWkUgKDQgKiA0NCkKLQotZW51bSBFTkNSWVBfUFJPVE9DT0wgewotCUVOQ1JZUF9QUk9UT0NPTF9PUEVOU1lTLCAgIC8qIG9wZW4gc3lzdGVtICovCi0JRU5DUllQX1BST1RPQ09MX1dFUCwgICAgICAgLyogV0VQICovCi0JRU5DUllQX1BST1RPQ09MX1dQQSwgICAgICAgLyogV1BBICovCi0JRU5DUllQX1BST1RPQ09MX1dQQTIsICAgICAgLyogV1BBMiAqLwotCUVOQ1JZUF9QUk9UT0NPTF9NQVgKLX07Ci0KLSNpZm5kZWYgTmRpczgwMl8xMUF1dGhNb2RlV1BBMgotI2RlZmluZSBOZGlzODAyXzExQXV0aE1vZGVXUEEyIChOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lICsgMSkKLSNlbmRpZgotCi0jaWZuZGVmIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0sKLSNkZWZpbmUgTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSyAoTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSArIDIpCi0jZW5kaWYKLQotdW5pb24gcG40OCB7Ci0JdTY0CXZhbDsKLQotI2lmZGVmIF9fTElUVExFX0VORElBTgotCi1zdHJ1Y3QgewotCXU4IFRTQzA7Ci0JdTggVFNDMTsKLQl1OCBUU0MyOwotCXU4IFRTQzM7Ci0JdTggVFNDNDsKLQl1OCBUU0M1OwotCXU4IFRTQzY7Ci0JdTggVFNDNzsKLX0gX2J5dGVfOwotCi0jZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQotc3RydWN0IHsKLQl1OCBUU0M3OwotCXU4IFRTQzY7Ci0JdTggVFNDNTsKLQl1OCBUU0M0OwotCXU4IFRTQzM7Ci0JdTggVFNDMjsKLQl1OCBUU0MxOwotCXU4IFRTQzA7Ci19IF9ieXRlXzsKLSNlbHNlCi0jZXJyb3IgTmVlZCBCSUcgb3IgTElUVExFIGVuZGlhbgotCi0jZW5kaWYKLQotfTsKLQotdW5pb24gS2V5dHlwZSB7Ci0JdTggICBza2V5WzE2XTsKLQl1MzIgICAgbGtleVs0XTsKLX07Ci0KLXN0cnVjdCBydHdfd2VwX2tleSB7Ci0JdTgga2V5W1dMQU5fS0VZX0xFTl9XRVAxMDQgKyAxXTsgLyogMTQgKi8KLQl1MTYga2V5bGVuOwotfTsKLQotc3RydWN0IHJ0X3Bta2lkX2xpc3QgewotCXU4CWJVc2VkOwotCXU4CUJzc2lkWzZdOwotCXU4CVBNS0lEWzE2XTsKLQl1OAlTc2lkQnVmWzMzXTsKLQl1OAkqc3NpZF9vY3RldDsKLQl1MTYJc3NpZF9sZW5ndGg7Ci19OwotCi1zdHJ1Y3Qgc2VjdXJpdHlfcHJpdiB7Ci0JdTMyCSAgZG90MTFBdXRoQWxncnRobTsJLyogIDgwMi4xMSBhdXRoLCBjb3VsZCBiZSBvcGVuLCBzaGFyZWQsCi0JCQkJCSAqIDgwMjF4IGFuZCBhdXRoc3dpdGNoICovCi0JdTMyCSAgZG90MTFQcml2YWN5QWxncnRobTsJLyogVGhpcyBzcGVjaWZpZXMgdGhlIHByaXZhY3kgZm9yCi0JCQkJCSAqIHNoYXJlZCBhdXRoLiBhbGdvcml0aG0uCi0JCQkJCSAqLwotCS8qIFdFUCAqLwotCXUzMgkgIGRvdDExUHJpdmFjeUtleUluZGV4OwkvKiAgdGhpcyBpcyBvbmx5IHZhbGlkIGZvciBsZWdlbmRhcnkKLQkJCQkJICogd2VwLCAwfjMgZm9yIGtleSBpZC4gKHR4IGtleSBpbmRleCkKLQkJCQkJICovCi0Jc3RydWN0IHJ0d193ZXBfa2V5IHdlcF9rZXlbTlVNX1dFUF9LRVlTXTsKLQotCXUzMiBkb3QxMTgwMjFYR3JwUHJpdmFjeTsJLyogc3BlY2lmeSB0aGUgcHJpdmFjeSBhbGd0aG0uCi0JCQkJCSAqIHVzZWQgZm9yIEdycCBrZXkKLQkJCQkJICovCi0JdTMyCWRvdDExODAyMVhHcnBLZXlpZDsJLyogIGtleSBpZCB1c2VkIGZvciBHcnAgS2V5Ci0JCQkJCSAqICh0eCBrZXkgaW5kZXgpCi0JCQkJCSAqLwotCXVuaW9uIEtleXR5cGUJZG90MTE4MDIxWEdycEtleVs0XTsvKiA4MDIuMXggR3JwIEtleSwgaW54MCBhbmQgaW54MSAqLwotCXVuaW9uIEtleXR5cGUJZG90MTE4MDIxWEdycHR4bWlja2V5WzRdOwotCXVuaW9uIEtleXR5cGUJZG90MTE4MDIxWEdycHJ4bWlja2V5WzRdOwotCXVuaW9uIHBuNDgJZG90MTFHcnB0eHBuOwkJLyogUE40OCB1c2VkIGZvciBHcnAgS2V5IHhtaXQuKi8KLQl1bmlvbiBwbjQ4CWRvdDExR3JwcnhwbjsJCS8qIFBONDggdXNlZCBmb3IgR3JwIEtleSByZWN2LiovCi0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQkvKiBleHRlbmQgc2VjdXJpdHkgY2FwYWJpbGl0aWVzIGZvciBBUF9NT0RFICovCi0JdW5zaWduZWQgaW50IGRvdDgwMjF4YWxnOy8qIDA6ZGlzYWJsZSwgMTpwc2ssIDI6ODAyLjF4ICovCi0JdW5zaWduZWQgaW50IHdwYV9wc2s7LyogMDpkaXNhYmxlLCBiaXQoMCk6IFdQQSwgYml0KDEpOldQQTIgKi8KLQl1bnNpZ25lZCBpbnQgd3BhX2dyb3VwX2NpcGhlcjsKLQl1bnNpZ25lZCBpbnQgd3BhMl9ncm91cF9jaXBoZXI7Ci0JdW5zaWduZWQgaW50IHdwYV9wYWlyd2lzZV9jaXBoZXI7Ci0JdW5zaWduZWQgaW50IHdwYTJfcGFpcndpc2VfY2lwaGVyOwotI2VuZGlmCi0KLQl1OCB3cHNfaWVbTUFYX1dQU19JRV9MRU5dOy8qIGFkZGVkIGluIGFzc29jIHJlcSAqLwotCWludCB3cHNfaWVfbGVuOwotCXVuc2lnbmVkIGludCBiaW5zdGFsbEdycGtleToxOwotCXVuc2lnbmVkIGludCBidXNldGtpcGtleToxOwotCXVuc2lnbmVkIGludCBiY2hlY2tfZ3Jwa2V5OjE7Ci0JdW5zaWduZWQgaW50IGh3X2RlY3J5cHRlZDoxOwotCXUzMiBuZGlzYXV0aHR5cGU7CS8qICBlbnVtIG5kaXNfODAyXzExX2F1dGhfbW9kZSAqLwotCXUzMiBuZGlzZW5jcnlwdHN0YXR1czsJLyogIE5ESVNfODAyXzExX0VOQ1JZUFRJT05fU1RBVFVTICovCi0Jc3RydWN0IHdsYW5fYnNzaWRfZXggc2VjX2JzczsgIC8qIGZvciBqb2luYnNzIChoMmMgYnVmZmVyKSB1c2FnZSAqLwotCXU4IGFzc29jX2luZm9bNjAwXTsKLQl1OCBzem9mY2FwYWJpbGl0eVsyNTZdOyAvKiBmb3Igd3BhMiB1c2FnZSAqLwotCXU4IG9pZGFzc29jaWF0aW9uWzUxMl07IC8qIGZvciB3cGEvd3BhMiB1c2FnZSAqLwotCXU4IHN1cHBsaWNhbnRfaWVbMjU2XTsgIC8qIHN0b3JlIHN0YSBzZWN1cml0eSBpbmZvcm1hdGlvbiBlbGVtZW50ICovCi0KLQkvKiBmb3IgdGtpcCBjb3VudGVybWVhc3VyZSAqLwotCXVuc2lnbmVkIGxvbmcgbGFzdF9taWNfZXJyX3RpbWU7Ci0JdTgJYnRraXBfY291bnRlcm1lYXN1cmU7Ci0JdTgJYnRraXBfd2FpdF9yZXBvcnQ7Ci0JdW5zaWduZWQgbG9uZyBidGtpcF9jb3VudGVybWVhc3VyZV90aW1lOwotCi0JLyogIEZvciBXUEEyIFByZS1BdXRoZW50aWNhdGlvbi4gKi8KLQlzdHJ1Y3QgcnRfcG1raWRfbGlzdCBQTUtJRExpc3RbTlVNX1BNS0lEX0NBQ0hFXTsKLQl1OCBQTUtJREluZGV4OwotCXU4IGJXZXBEZWZhdWx0S2V5SWR4U2V0OwotfTsKLQotc3RydWN0IHNoYTI1Nl9zdGF0ZSB7Ci0JdTY0IGxlbmd0aDsKLQl1MzIgc3RhdGVbOF0sIGN1cmxlbjsKLQl1OCBidWZbNjRdOwotfTsKLQotI2RlZmluZSBHRVRfRU5DUllfQUxHTyhwc2VjdXJpdHlwcml2LCBwc3RhLCBlbmNyeV9hbGdvLCBibWNzdClcCi1kbyB7XAotCXN3aXRjaCAocHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSkge1wKLQljYXNlIGRvdDExQXV0aEFsZ3J0aG1fT3BlbjpcCi0JY2FzZSBkb3QxMUF1dGhBbGdydGhtX1NoYXJlZDpcCi0JY2FzZSBkb3QxMUF1dGhBbGdydGhtX0F1dG86XAotCQllbmNyeV9hbGdvID0gcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobTtcCi0JCWJyZWFrO1wKLQljYXNlIGRvdDExQXV0aEFsZ3J0aG1fODAyMVg6XAotCQlpZiAoYm1jc3QpXAotCQkJZW5jcnlfYWxnbyA9IHBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5O1wKLQkJZWxzZVwKLQkJCWVuY3J5X2FsZ28gPSBwc3RhLT5kb3QxMTgwMjFYUHJpdmFjeTtcCi0JCWJyZWFrO1wKLQl9CVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgR0VUX1RLSVBfUE4oaXYsIGRvdDExdHhwbilcCi1kbyB7XAotCWRvdDExdHhwbi5fYnl0ZV8uVFNDMCA9IGl2WzJdO1wKLQlkb3QxMXR4cG4uX2J5dGVfLlRTQzEgPSBpdlswXTtcCi0JZG90MTF0eHBuLl9ieXRlXy5UU0MyID0gaXZbNF07XAotCWRvdDExdHhwbi5fYnl0ZV8uVFNDMyA9IGl2WzVdO1wKLQlkb3QxMXR4cG4uX2J5dGVfLlRTQzQgPSBpdls2XTtcCi0JZG90MTF0eHBuLl9ieXRlXy5UU0M1ID0gaXZbN107XAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBST0wzMihBLCBuKSAgKCgoQSkgPDwgKG4pKSB8ICgoKEEpPj4oMzItKG4pKSkgICYgKCgxVUwgPDwgKG4pKSAtIDEpKSkKLSNkZWZpbmUgUk9SMzIoQSwgbikgIFJPTDMyKChBKSwgMzItKG4pKQotCi1zdHJ1Y3QgbWljX2RhdGEgewotCXUzMiAgSzAsIEsxOyAgICAgICAgIC8qICBLZXkgKi8KLQl1MzIgIEwsIFI7ICAgICAgICAgICAvKiAgQ3VycmVudCBzdGF0ZSAqLwotCXUzMiAgTTsgICAgICAgICAgICAgIC8qICBNZXNzYWdlIGFjY3VtdWxhdG9yIChzaW5nbGUgd29yZCkgKi8KLQl1MzIgICAgIG5CeXRlc0luTTsgICAgICAvKiAgIyBieXRlcyBpbiBNICovCi19OwotCi1leHRlcm4gY29uc3QgdTMyIFRlMFsyNTZdOwotZXh0ZXJuIGNvbnN0IHUzMiBUZTFbMjU2XTsKLWV4dGVybiBjb25zdCB1MzIgVGUyWzI1Nl07Ci1leHRlcm4gY29uc3QgdTMyIFRlM1syNTZdOwotZXh0ZXJuIGNvbnN0IHUzMiBUZTRbMjU2XTsKLWV4dGVybiBjb25zdCB1MzIgVGQwWzI1Nl07Ci1leHRlcm4gY29uc3QgdTMyIFRkMVsyNTZdOwotZXh0ZXJuIGNvbnN0IHUzMiBUZDJbMjU2XTsKLWV4dGVybiBjb25zdCB1MzIgVGQzWzI1Nl07Ci1leHRlcm4gY29uc3QgdTMyIFRkNFsyNTZdOwotZXh0ZXJuIGNvbnN0IHUzMiByY29uWzEwXTsKLWV4dGVybiBjb25zdCB1OCBUZDRzWzI1Nl07Ci1leHRlcm4gY29uc3QgdTggcmNvbnNbMTBdOwotCi0jZGVmaW5lIFJDT04oaSkgKHJjb25zWyhpKV0gPDwgMjQpCi0KLXN0YXRpYyBpbmxpbmUgdTMyIHJvdHIodTMyIHZhbCwgaW50IGJpdHMpCi17Ci0JcmV0dXJuICh2YWwgPj4gYml0cykgfCAodmFsIDw8ICgzMiAtIGJpdHMpKTsKLX0KLQotI2RlZmluZSBURTAoaSkgVGUwWygoaSkgPj4gMjQpICYgMHhmZl0KLSNkZWZpbmUgVEUxKGkpIHJvdHIoVGUwWygoaSkgPj4gMTYpICYgMHhmZl0sIDgpCi0jZGVmaW5lIFRFMihpKSByb3RyKFRlMFsoKGkpID4+IDgpICYgMHhmZl0sIDE2KQotI2RlZmluZSBURTMoaSkgcm90cihUZTBbKGkpICYgMHhmZl0sIDI0KQotI2RlZmluZSBURTQxKGkpICgoVGUwWygoaSkgPj4gMjQpICYgMHhmZl0gPDwgOCkgJiAweGZmMDAwMDAwKQotI2RlZmluZSBURTQyKGkpIChUZTBbKChpKSA+PiAxNikgJiAweGZmXSAmIDB4MDBmZjAwMDApCi0jZGVmaW5lIFRFNDMoaSkgKFRlMFsoKGkpID4+IDgpICYgMHhmZl0gJiAweDAwMDBmZjAwKQotI2RlZmluZSBURTQ0KGkpICgoVGUwWyhpKSAmIDB4ZmZdID4+IDgpICYgMHgwMDAwMDBmZikKLSNkZWZpbmUgVEU0MjEoaSkgKChUZTBbKChpKSA+PiAxNikgJiAweGZmXSA8PCA4KSAmIDB4ZmYwMDAwMDApCi0jZGVmaW5lIFRFNDMyKGkpIChUZTBbKChpKSA+PiA4KSAmIDB4ZmZdICYgMHgwMGZmMDAwMCkKLSNkZWZpbmUgVEU0NDMoaSkgKFRlMFsoaSkgJiAweGZmXSAmIDB4MDAwMGZmMDApCi0jZGVmaW5lIFRFNDE0KGkpICgoVGUwWygoaSkgPj4gMjQpICYgMHhmZl0gPj4gOCkgJiAweDAwMDAwMGZmKQotI2RlZmluZSBURTQoaSkgKChUZTBbKGkpXSA+PiA4KSAmIDB4MDAwMDAwZmYpCi0KLSNkZWZpbmUgVEQwKGkpIFRkMFsoKGkpID4+IDI0KSAmIDB4ZmZdCi0jZGVmaW5lIFREMShpKSByb3RyKFRkMFsoKGkpID4+IDE2KSAmIDB4ZmZdLCA4KQotI2RlZmluZSBURDIoaSkgcm90cihUZDBbKChpKSA+PiA4KSAmIDB4ZmZdLCAxNikKLSNkZWZpbmUgVEQzKGkpIHJvdHIoVGQwWyhpKSAmIDB4ZmZdLCAyNCkKLSNkZWZpbmUgVEQ0MShpKSAoVGQ0c1soKGkpID4+IDI0KSAmIDB4ZmZdIDw8IDI0KQotI2RlZmluZSBURDQyKGkpIChUZDRzWygoaSkgPj4gMTYpICYgMHhmZl0gPDwgMTYpCi0jZGVmaW5lIFRENDMoaSkgKFRkNHNbKChpKSA+PiA4KSAmIDB4ZmZdIDw8IDgpCi0jZGVmaW5lIFRENDQoaSkgKFRkNHNbKGkpICYgMHhmZl0pCi0jZGVmaW5lIFREMF8oaSkgVGQwWyhpKSAmIDB4ZmZdCi0jZGVmaW5lIFREMV8oaSkgcm90cihUZDBbKGkpICYgMHhmZl0sIDgpCi0jZGVmaW5lIFREMl8oaSkgcm90cihUZDBbKGkpICYgMHhmZl0sIDE2KQotI2RlZmluZSBURDNfKGkpIHJvdHIoVGQwWyhpKSAmIDB4ZmZdLCAyNCkKLQotI2RlZmluZSBHRVRVMzIocHQpICgoKHUzMikocHQpWzBdIDw8IDI0KSBeICgodTMyKShwdClbMV0gPDwgMTYpIF4gXAotCQkJKCh1MzIpKHB0KVsyXSA8PCAgOCkgXiAoKHUzMikocHQpWzNdKSkKLQotI2RlZmluZSBQVVRVMzIoY3QsIHN0KSB7IFwKLShjdClbMF0gPSAodTgpKChzdCkgPj4gMjQpOyAoY3QpWzFdID0gKHU4KSgoc3QpID4+IDE2KTsgXAotKGN0KVsyXSA9ICh1OCkoKHN0KSA+PiAgOCk7IChjdClbM10gPSAodTgpKHN0KTsgfQotCi0jZGVmaW5lIFdQQV9HRVRfQkUzMihhKSAoKCgodTMyKSAoYSlbMF0pIDw8IDI0KSB8ICgoKHUzMikgKGEpWzFdKSA8PCAxNikgfCBcCi0JCQkgKCgodTMyKSAoYSlbMl0pIDw8IDgpIHwgKCh1MzIpIChhKVszXSkpCi0KLSNkZWZpbmUgV1BBX1BVVF9MRTE2KGEsIHZhbCkJCQlcCi0JZG8gewkJCQkJXAotCQkoYSlbMV0gPSAoKHUxNikgKHZhbCkpID4+IDg7CVwKLQkJKGEpWzBdID0gKCh1MTYpICh2YWwpKSAmIDB4ZmY7CVwKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIFdQQV9QVVRfQkUzMihhLCB2YWwpCQkJCQlcCi0JZG8gewkJCQkJCQlcCi0JCShhKVswXSA9ICh1OCkgKCgoKHUzMikgKHZhbCkpID4+IDI0KSAmIDB4ZmYpOwlcCi0JCShhKVsxXSA9ICh1OCkgKCgoKHUzMikgKHZhbCkpID4+IDE2KSAmIDB4ZmYpOwlcCi0JCShhKVsyXSA9ICh1OCkgKCgoKHUzMikgKHZhbCkpID4+IDgpICYgMHhmZik7CVwKLQkJKGEpWzNdID0gKHU4KSAoKCh1MzIpICh2YWwpKSAmIDB4ZmYpOwkJXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgV1BBX1BVVF9CRTY0KGEsIHZhbCkJCQkJXAotCWRvIHsJCQkJCQlcCi0JCShhKVswXSA9ICh1OCkgKCgodTY0KSAodmFsKSkgPj4gNTYpOwlcCi0JCShhKVsxXSA9ICh1OCkgKCgodTY0KSAodmFsKSkgPj4gNDgpOwlcCi0JCShhKVsyXSA9ICh1OCkgKCgodTY0KSAodmFsKSkgPj4gNDApOwlcCi0JCShhKVszXSA9ICh1OCkgKCgodTY0KSAodmFsKSkgPj4gMzIpOwlcCi0JCShhKVs0XSA9ICh1OCkgKCgodTY0KSAodmFsKSkgPj4gMjQpOwlcCi0JCShhKVs1XSA9ICh1OCkgKCgodTY0KSAodmFsKSkgPj4gMTYpOwlcCi0JCShhKVs2XSA9ICh1OCkgKCgodTY0KSAodmFsKSkgPj4gOCk7CVwKLQkJKGEpWzddID0gKHU4KSAoKCh1NjQpICh2YWwpKSAmIDB4ZmYpOwlcCi0JfSB3aGlsZSAoMCkKLQotLyogPT09PT0gc3RhcnQgLSBwdWJsaWMgZG9tYWluIFNIQTI1NiBpbXBsZW1lbnRhdGlvbiA9PT09PSAqLwotCi0vKiBUaGlzIGlzIGJhc2VkIG9uIFNIQTI1NiBpbXBsZW1lbnRhdGlvbiBpbiBMaWJUb21DcnlwdCB0aGF0IHdhcyByZWxlYXNlZCBpbnRvCi0gKiBwdWJsaWMgZG9tYWluIGJ5IFRvbSBTdCBEZW5pcy4gKi8KLQotLyogdGhlIEsgYXJyYXkgKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIEtbNjRdID0gewotCTB4NDI4YTJmOThVTCwgMHg3MTM3NDQ5MVVMLCAweGI1YzBmYmNmVUwsIDB4ZTliNWRiYTVVTCwgMHgzOTU2YzI1YlVMLAotCTB4NTlmMTExZjFVTCwgMHg5MjNmODJhNFVMLCAweGFiMWM1ZWQ1VUwsIDB4ZDgwN2FhOThVTCwgMHgxMjgzNWIwMVVMLAotCTB4MjQzMTg1YmVVTCwgMHg1NTBjN2RjM1VMLCAweDcyYmU1ZDc0VUwsIDB4ODBkZWIxZmVVTCwgMHg5YmRjMDZhN1VMLAotCTB4YzE5YmYxNzRVTCwgMHhlNDliNjljMVVMLCAweGVmYmU0Nzg2VUwsIDB4MGZjMTlkYzZVTCwgMHgyNDBjYTFjY1VMLAotCTB4MmRlOTJjNmZVTCwgMHg0YTc0ODRhYVVMLCAweDVjYjBhOWRjVUwsIDB4NzZmOTg4ZGFVTCwgMHg5ODNlNTE1MlVMLAotCTB4YTgzMWM2NmRVTCwgMHhiMDAzMjdjOFVMLCAweGJmNTk3ZmM3VUwsIDB4YzZlMDBiZjNVTCwgMHhkNWE3OTE0N1VMLAotCTB4MDZjYTYzNTFVTCwgMHgxNDI5Mjk2N1VMLCAweDI3YjcwYTg1VUwsIDB4MmUxYjIxMzhVTCwgMHg0ZDJjNmRmY1VMLAotCTB4NTMzODBkMTNVTCwgMHg2NTBhNzM1NFVMLCAweDc2NmEwYWJiVUwsIDB4ODFjMmM5MmVVTCwgMHg5MjcyMmM4NVVMLAotCTB4YTJiZmU4YTFVTCwgMHhhODFhNjY0YlVMLCAweGMyNGI4YjcwVUwsIDB4Yzc2YzUxYTNVTCwgMHhkMTkyZTgxOVVMLAotCTB4ZDY5OTA2MjRVTCwgMHhmNDBlMzU4NVVMLCAweDEwNmFhMDcwVUwsIDB4MTlhNGMxMTZVTCwgMHgxZTM3NmMwOFVMLAotCTB4Mjc0ODc3NGNVTCwgMHgzNGIwYmNiNVVMLCAweDM5MWMwY2IzVUwsIDB4NGVkOGFhNGFVTCwgMHg1YjljY2E0ZlVMLAotCTB4NjgyZTZmZjNVTCwgMHg3NDhmODJlZVVMLCAweDc4YTU2MzZmVUwsIDB4ODRjODc4MTRVTCwgMHg4Y2M3MDIwOFVMLAotCTB4OTBiZWZmZmFVTCwgMHhhNDUwNmNlYlVMLCAweGJlZjlhM2Y3VUwsIDB4YzY3MTc4ZjJVTAotfTsKLQotdm9pZCBydHdfc2VjbWljc2V0a2V5MjNhKHN0cnVjdCBtaWNfZGF0YSAqcG1pY2RhdGEsIHU4ICprZXkpOwotdm9pZCBydHdfc2VjbWljYXBwZW5kMjNhYnl0ZTIzYShzdHJ1Y3QgbWljX2RhdGEgKnBtaWNkYXRhLCB1OCBiKTsKLXZvaWQgcnR3X3NlY21pY2FwcGVuZDIzYShzdHJ1Y3QgbWljX2RhdGEgKnBtaWNkYXRhLCB1OCAqc3JjLCB1MzIgbmJCeXRlcyk7Ci12b2lkIHJ0d19zZWNnZXRtaWMyM2Eoc3RydWN0IG1pY19kYXRhICpwbWljZGF0YSwgdTggKmRzdCk7Ci0KLXZvaWQgcnR3X3NlY2NhbGN0a2lwbWljMjNhKHU4ICprZXksIHU4ICpoZWFkZXIsIHU4ICpkYXRhLCB1MzIgZGF0YV9sZW4sCi0JCQl1OCAqTWljY29kZSwgdTggcHJpb3JpdHlpKTsKLQotaW50IHJ0d19hZXNfZW5jcnlwdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpOwotaW50IHJ0d190a2lwX2VuY3J5cHQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICAgICBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSk7Ci12b2lkIHJ0d193ZXBfZW5jcnlwdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgIHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKTsKLWludCBydHdfYWVzX2RlY3J5cHQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lKTsKLWludCBydHdfdGtpcF9kZWNyeXB0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCSAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpOwotdm9pZCBydHdfd2VwX2RlY3J5cHQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpOwotCi12b2lkIHJ0d191c2VfdGtpcGtleV9oYW5kbGVyMjNhKHZvaWQgKkZ1bmN0aW9uQ29udGV4dCk7Ci0KLSNlbmRpZgkvKiBfX1JUTDg3MVhfU0VDVVJJVFlfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfc3Jlc2V0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X3NyZXNldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGZhODI5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfc3Jlc2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEyIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX1JUV19TUkVTRVRfQ18KLSNkZWZpbmUgX1JUV19TUkVTRVRfQ18KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLQotc3RydWN0IHNyZXNldF9wcml2IHsKLQlzdHJ1Y3QgbXV0ZXgJc2lsZW50cmVzZXRfbXV0ZXg7Ci0JdTgJc2lsZW50X3Jlc2V0X2lucHJvZ3Jlc3M7Ci0JdW5zaWduZWQgbG9uZyBsYXN0X3R4X3RpbWU7Ci0JdW5zaWduZWQgbG9uZyBsYXN0X3R4X2NvbXBsZXRlX3RpbWU7Ci19OwotCi0jaW5jbHVkZSA8cnRsODcyM2FfaGFsLmg+Ci0KLXZvaWQgcnR3X3NyZXNldF9pbml0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydHdfc3Jlc2V0X3Jlc2V0X3ZhbHVlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotYm9vbCBydHdfc3Jlc2V0X2lucHJvZ3Jlc3Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHNyZXNldF9zZXRfdHJpZ2dlcl9wb2ludChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzMzIgdGdwKTsKLXZvaWQgcnR3X3NyZXNldF9yZXNldChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFjdGl2ZV9hZGFwdGVyKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X3ZlcnNpb24uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfdmVyc2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTQ3NzMzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfdmVyc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2RlZmluZSBEUklWRVJWRVJTSU9OCSJ2NC4xLjZfNzMzNi4yMDEzMDQyNiIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfeG1pdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d194bWl0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiN2Q2ZDAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d194bWl0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9SVFdfWE1JVF9IXwotI2RlZmluZSBfUlRXX1hNSVRfSF8KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLQotI2RlZmluZSBNQVhfWE1JVEJVRl9TWgkJMjA0OAotI2RlZmluZSBOUl9YTUlUQlVGRgkJNAotCi0jZGVmaW5lIFhNSVRCVUZfQUxJR05fU1oJNTEyCi0KLS8qICB4bWl0IGV4dGVuc2lvbiBidWZmIGRlZmluYXRpb24gKi8KLSNkZWZpbmUgTUFYX1hNSVRfRVhUQlVGX1NaCTE1MzYKLSNkZWZpbmUgTlJfWE1JVF9FWFRCVUZGCQkzMgotCi0jZGVmaW5lIE1BWF9OVU1CTEtTCQkxCi0KLSNkZWZpbmUgWE1JVF9WT19RVUVVRQkJMAotI2RlZmluZSBYTUlUX1ZJX1FVRVVFCQkxCi0jZGVmaW5lIFhNSVRfQkVfUVVFVUUJCTIKLSNkZWZpbmUgWE1JVF9CS19RVUVVRQkJMwotCi0jZGVmaW5lIFZPX1FVRVVFX0lOWAkJMAotI2RlZmluZSBWSV9RVUVVRV9JTlgJCTEKLSNkZWZpbmUgQkVfUVVFVUVfSU5YCQkyCi0jZGVmaW5lIEJLX1FVRVVFX0lOWAkJMwotI2RlZmluZSBCQ05fUVVFVUVfSU5YCQk0Ci0jZGVmaW5lIE1HVF9RVUVVRV9JTlgJCTUKLSNkZWZpbmUgSElHSF9RVUVVRV9JTlgJCTYKLSNkZWZpbmUgVFhDTURfUVVFVUVfSU5YCQk3Ci0KLSNkZWZpbmUgSFdfUVVFVUVfRU5UUlkJCTgKLQotI2RlZmluZSBXRVBfSVYocGF0dHJpYl9pdiwgZG90MTF0eHBuLCBrZXlpZHgpCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JcGF0dHJpYl9pdlswXSA9IGRvdDExdHhwbi5fYnl0ZV8uVFNDMDsJCQkJXAotCXBhdHRyaWJfaXZbMV0gPSBkb3QxMXR4cG4uX2J5dGVfLlRTQzE7CQkJCVwKLQlwYXR0cmliX2l2WzJdID0gZG90MTF0eHBuLl9ieXRlXy5UU0MyOwkJCQlcCi0JcGF0dHJpYl9pdlszXSA9ICgoa2V5aWR4ICYgMHgzKSA8PCA2KTsJCQkJXAotCWRvdDExdHhwbi52YWwgPSAoZG90MTF0eHBuLnZhbCA9PSAweGZmZmZmZikgPyAwIDoJCVwKLQkJCSAoZG90MTF0eHBuLnZhbCsxKTsJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBUS0lQX0lWKHBhdHRyaWJfaXYsIGRvdDExdHhwbiwga2V5aWR4KQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCXBhdHRyaWJfaXZbMF0gPSBkb3QxMXR4cG4uX2J5dGVfLlRTQzE7CQkJCVwKLQlwYXR0cmliX2l2WzFdID0gKGRvdDExdHhwbi5fYnl0ZV8uVFNDMSB8IDB4MjApICYgMHg3ZjsJCVwKLQlwYXR0cmliX2l2WzJdID0gZG90MTF0eHBuLl9ieXRlXy5UU0MwOwkJCQlcCi0JcGF0dHJpYl9pdlszXSA9IEJJVCg1KSB8ICgoa2V5aWR4ICYgMHgzKTw8Nik7CQkJXAotCXBhdHRyaWJfaXZbNF0gPSBkb3QxMXR4cG4uX2J5dGVfLlRTQzI7CQkJCVwKLQlwYXR0cmliX2l2WzVdID0gZG90MTF0eHBuLl9ieXRlXy5UU0MzOwkJCQlcCi0JcGF0dHJpYl9pdls2XSA9IGRvdDExdHhwbi5fYnl0ZV8uVFNDNDsJCQkJXAotCXBhdHRyaWJfaXZbN10gPSBkb3QxMXR4cG4uX2J5dGVfLlRTQzU7CQkJCVwKLQlkb3QxMXR4cG4udmFsID0gZG90MTF0eHBuLnZhbCA9PSAweGZmZmZmZmZmZmZmZlVMTCA/IDAgOglcCi0JCQkJCSAoZG90MTF0eHBuLnZhbCsxKTsJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQUVTX0lWKHBhdHRyaWJfaXYsIGRvdDExdHhwbiwga2V5aWR4KVwKLWRvIHsJCQkJCQkJCQlcCi0JcGF0dHJpYl9pdlswXSA9IGRvdDExdHhwbi5fYnl0ZV8uVFNDMDsJCQkJXAotCXBhdHRyaWJfaXZbMV0gPSBkb3QxMXR4cG4uX2J5dGVfLlRTQzE7CQkJCVwKLQlwYXR0cmliX2l2WzJdID0gMDsJCQkJCQlcCi0JcGF0dHJpYl9pdlszXSA9IEJJVCg1KSB8ICgoa2V5aWR4ICYgMHgzKSA8PCA2KTsJCQlcCi0JcGF0dHJpYl9pdls0XSA9IGRvdDExdHhwbi5fYnl0ZV8uVFNDMjsJCQkJXAotCXBhdHRyaWJfaXZbNV0gPSBkb3QxMXR4cG4uX2J5dGVfLlRTQzM7CQkJCVwKLQlwYXR0cmliX2l2WzZdID0gZG90MTF0eHBuLl9ieXRlXy5UU0M0OwkJCQlcCi0JcGF0dHJpYl9pdls3XSA9IGRvdDExdHhwbi5fYnl0ZV8uVFNDNTsJCQkJXAotCWRvdDExdHhwbi52YWwgPSBkb3QxMXR4cG4udmFsID09IDB4ZmZmZmZmZmZmZmZmVUxMID8gMCA6CVwKLQkJCQkJIChkb3QxMXR4cG4udmFsKzEpOwkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBIV1hNSVRfRU5UUlkJNAotCi0jZGVmaW5lIFRYREVTQ19TSVpFIDMyCi0KLSNkZWZpbmUgUEFDS0VUX09GRlNFVF9TWiA4Ci0jZGVmaW5lIFRYREVTQ19PRkZTRVQgKFRYREVTQ19TSVpFICsgUEFDS0VUX09GRlNFVF9TWikKLQotc3RydWN0IHR4X2Rlc2MgewotCS8qIERXT1JEIDAgKi8KLQlfX2xlMzIgdHhkdzA7Ci0JX19sZTMyIHR4ZHcxOwotCV9fbGUzMiB0eGR3MjsKLQlfX2xlMzIgdHhkdzM7Ci0JX19sZTMyIHR4ZHc0OwotCV9fbGUzMiB0eGR3NTsKLQlfX2xlMzIgdHhkdzY7Ci0JX19sZTMyIHR4ZHc3OwotfTsKLQotdW5pb24gdHhkZXNjIHsKLQlzdHJ1Y3QgdHhfZGVzYyB0eGRlc2M7Ci0JdW5zaWduZWQgaW50IHZhbHVlW1RYREVTQ19TSVpFPj4yXTsKLX07Ci0KLXN0cnVjdAlod194bWl0CXsKLQlzdHJ1Y3QgcnR3X3F1ZXVlICpzdGFfcXVldWU7Ci0JaW50CWFjY250OwotfTsKLQotLyogcmVkdWNlIHNpemUgKi8KLXN0cnVjdCBwa3RfYXR0cmliIHsKLQl1MTYJdHlwZTsKLQl1OAlic3dlbmM7Ci0JdTgJZGhjcF9wa3Q7Ci0JdTE2CWV0aGVyX3R5cGU7Ci0JdTE2CXNlcW51bTsKLQl1MTYJcGt0X2hkcmxlbjsJLyogdGhlIG9yaWdpbmFsIDgwMi4zIHBrdCBoZWFkZXIgbGVuICovCi0JdTE2CWhkcmxlbjsJCS8qIHRoZSBXTEFOIEhlYWRlciBMZW4gKi8KLQl1MzIJcGt0bGVuOwkJLyogdGhlIG9yaWdpbmFsIDgwMi4zIHBrdCByYXdfZGF0YSBsZW4gKi8KLQl1MzIJbGFzdF90eGNtZHN6OwotCXUzMgllbmNyeXB0OwkvKiB3aGVuIDAgaW5kaWNhdGUgbm8gZW5jcnlwdC4gKi8KLQl1OAlucl9mcmFnczsKLQl1OAlpdl9sZW47Ci0JdTgJaWN2X2xlbjsKLQl1OAlpdlsxOF07Ci0JdTgJaWN2WzE2XTsKLQl1OAlwcmlvcml0eTsKLQl1OAlhY2tfcG9saWN5OwotCXU4CW1hY19pZDsKLQl1OAl2Y3NfbW9kZTsJLyogdmlydHVhbCBjYXJyaWVyIHNlbnNlIG1ldGhvZCAqLwotCXU4CWRzdFtFVEhfQUxFTl07Ci0JdTgJc3JjW0VUSF9BTEVOXTsKLQl1OAl0YVtFVEhfQUxFTl07Ci0JdTgJcmFbRVRIX0FMRU5dOwotCXU4CWtleV9pZHg7Ci0JdTgJcW9zX2VuOwotCXU4CWh0X2VuOwotCXU4CXJhaWQ7LyogcmF0ZSBhZHBhdGl2ZSBpZCAqLwotCXU4CWJ3bW9kZTsKLQl1OAljaF9vZmZzZXQ7LyogUFJJTUVfQ0hOTF9PRkZTRVQgKi8KLQl1OAlzZ2k7Lyogc2hvcnQgR0kgKi8KLQl1OAlhbXBkdV9lbjsvKiB0eCBhbXBkdSBlbmFibGUgKi8KLQl1OAltZGF0YTsvKiBtb3JlIGRhdGEgYml0ICovCi0JdTgJcGN0cmw7LyogcGVyIHBhY2tldCB0eGRlc2MgY29udHJvbCBlbmFibGUgKi8KLQl1OAl0cmlnZ2VyZWQ7LyogZm9yIGFwIG1vZGUgaGFuZGxpbmcgUG93ZXIgU2F2aW5nIHN0YSAqLwotCXU4CXFzZWw7Ci0JdTgJZW9zcDsKLQl1OAlyYXRlOwotCXU4CXJldHJ5X2N0cmw7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotfTsKLQotI2RlZmluZSBXTEFOSERSX09GRlNFVAkJNjQKLQotI2RlZmluZSBOVUxMX0ZSQU1FVEFHCQkweDAKLSNkZWZpbmUgREFUQV9GUkFNRVRBRwkJMHgwMQotI2RlZmluZSBMMl9GUkFNRVRBRwkJMHgwMgotI2RlZmluZSBNR05UX0ZSQU1FVEFHCQkweDAzCi0jZGVmaW5lIEFNU0RVX0ZSQU1FVEFHCQkweDA0Ci0KLSNkZWZpbmUgRUlJX0ZSQU1FVEFHCQkweDA1Ci0jZGVmaW5lIElFRUU4MDIzX0ZSQU1FVEFHIAkweDA2Ci0KLSNkZWZpbmUgTVBfRlJBTUVUQUcJCTB4MDcKLQotI2RlZmluZSBUWEFHR19GUkFNRVRBRwkJMHgwOAotCi1zdHJ1Y3QgIHN1Ym1pdF9jdHggewotCXUzMiB0aW1lb3V0X21zOyAvKiA8MDogbm90IHN5bmNocm9ub3VzLCAwOiB3YWl0IGZvcmV2ZXIsCi0JCQkgKiA+MDogdXAgdG8gbXMgd2FpdGluZwotCQkJICovCi0JaW50IHN0YXR1czsgLyogc3RhdHVzIGZvciBvcGVyYXRpb24gKi8KLQlzdHJ1Y3QgY29tcGxldGlvbiBkb25lOwotfTsKLQotZW51bSB7Ci0JUlRXX1NDVFhfU1VCTUlUVEVEID0gLTEsCi0JUlRXX1NDVFhfRE9ORV9TVUNDRVNTID0gMCwKLQlSVFdfU0NUWF9ET05FX1VOS05PV04sCi0JUlRXX1NDVFhfRE9ORV9USU1FT1VULAotCVJUV19TQ1RYX0RPTkVfQlVGX0FMTE9DLAotCVJUV19TQ1RYX0RPTkVfQlVGX0ZSRUUsCi0JUlRXX1NDVFhfRE9ORV9XUklURV9QT1JUX0VSUiwKLQlSVFdfU0NUWF9ET05FX1RYX0RFU0NfTkEsCi0JUlRXX1NDVFhfRE9ORV9UWF9ERU5ZLAotCVJUV19TQ1RYX0RPTkVfQ0NYX1BLVF9GQUlMLAotCVJUV19TQ1RYX0RPTkVfRFJWX1NUT1AsCi0JUlRXX1NDVFhfRE9ORV9ERVZfUkVNT1ZFLAotfTsKLQotdm9pZCBydHdfc2N0eF9pbml0MjNhKHN0cnVjdCBzdWJtaXRfY3R4ICpzY3R4LCBpbnQgdGltZW91dF9tcyk7Ci1pbnQgcnR3X3NjdHhfd2FpdDIzYShzdHJ1Y3Qgc3VibWl0X2N0eCAqc2N0eCk7Ci12b2lkIHJ0dzIzYV9zY3R4X2RvbmVfZXJyKHN0cnVjdCBzdWJtaXRfY3R4ICoqc2N0eCwgaW50IHN0YXR1cyk7Ci0KLXN0cnVjdCB4bWl0X2J1ZiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0LCBsaXN0MjsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyOwotCi0JdTggKnBhbGxvY2F0ZWRfYnVmOwotCXU4ICpwYnVmOwotCXZvaWQgKnByaXZfZGF0YTsKLQotCXUxNiBleHRfdGFnOyAvKiAgMDogTm9ybWFsIHhtaXRidWYsIDE6IGV4dGVuc2lvbiB4bWl0YnVmLiAqLwotCXUxNiBmbGFnczsKLQl1MzIgYWxsb2Nfc3o7Ci0JdTMyICBsZW47Ci0Jc3RydWN0IHN1Ym1pdF9jdHggKnNjdHg7Ci0JdTMyCWZmX2h3YWRkcjsKLQlzdHJ1Y3QgdXJiICpweG1pdF91cmJbOF07Ci0JdTggYnBlbmRpbmdbOF07Ci0JaW50IGxhc3RbOF07Ci0jaWYgZGVmaW5lZChEQkdfWE1JVF9CVUYpIHx8IGRlZmluZWQoREJHX1hNSVRfQlVGX0VYVCkKLQl1OCBubzsKLSNlbmRpZgotfTsKLQotc3RydWN0IHhtaXRfZnJhbWUgewotCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKLQlzdHJ1Y3QgcGt0X2F0dHJpYiBhdHRyaWI7Ci0Jc3RydWN0IHNrX2J1ZmYgKnBrdDsKLQlpbnQJZnJhbWVfdGFnOwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXI7Ci0JdTgJKmJ1Zl9hZGRyOwotCXN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWY7Ci0KLQlzOAlwa3Rfb2Zmc2V0OwotCi0JdTggYWNrX3JlcG9ydDsKLQotCXU4IGV4dF90YWc7IC8qIDA6ZGF0YSwgMTptZ210ICovCi19OwotCi1zdHJ1Y3QgdHhfc2VydnEgewotCXN0cnVjdCBsaXN0X2hlYWQJdHhfcGVuZGluZzsKLQlzdHJ1Y3QgcnR3X3F1ZXVlCXN0YV9wZW5kaW5nOwotCWludCBxY250OwotfTsKLQotc3RydWN0IHN0YV94bWl0X3ByaXYgewotCXNwaW5sb2NrX3QJbG9jazsKLQlpbnQJb3B0aW9uOwotCWludAlhcHNkX3NldHRpbmc7CS8qIFdoZW4gYml0IG1hc2sgaXMgb24sIHRoZSBhc3NvY2lhdGVkIGVkY2EKLQkJCQkgKiBxdWV1ZSBzdXBwb3J0cyBBUFNELgotCQkJCSAqLwotCXN0cnVjdCB0eF9zZXJ2cQliZV9xOwkJCS8qIHByaW9yaXR5ID09IDAsMyAqLwotCXN0cnVjdCB0eF9zZXJ2cQlia19xOwkJCS8qIHByaW9yaXR5ID09IDEsMiAqLwotCXN0cnVjdCB0eF9zZXJ2cQl2aV9xOwkJCS8qIHByaW9yaXR5ID09IDQsNSAqLwotCXN0cnVjdCB0eF9zZXJ2cQl2b19xOwkJCS8qIHByaW9yaXR5ID09IDYsNyAqLwotCXN0cnVjdCBsaXN0X2hlYWQgbGVnYWN5X2R6OwotCXN0cnVjdCBsaXN0X2hlYWQgYXBzZDsKLQl1MTYgdHhzZXFfdGlkWzE2XTsKLX07Ci0KLXN0cnVjdAlod190eHF1ZXVlIHsKLQl2b2xhdGlsZSBpbnQgaGVhZDsKLQl2b2xhdGlsZSBpbnQgdGFpbDsKLQl2b2xhdGlsZSBpbnQgZnJlZV9zejsJLyogaW4gdW5pdHMgb2YgNjQgYnl0ZXMgKi8KLQl2b2xhdGlsZSBpbnQgZnJlZV9jbWRzejsKLQl2b2xhdGlsZSBpbnQgdHhzels4XTsKLQl1aW50CWZmX2h3YWRkcjsKLQl1aW50CWNtZF9od2FkZHI7Ci0JaW50CWFjX3RhZzsKLX07Ci0KLXN0cnVjdCBhZ2dfcGt0X2luZm8gewotCXUxNiBvZmZzZXQ7Ci0JdTE2IHBrdF9sZW47Ci19OwotCi1zdHJ1Y3QJeG1pdF9wcml2IHsKLQlzcGlubG9ja190CWxvY2s7Ci0KLQlzdHJ1Y3Qgc2VtYXBob3JlCXhtaXRfc2VtYTsKLQlzdHJ1Y3Qgc2VtYXBob3JlCXRlcm1pbmF0ZV94bWl0dGhyZWFkX3NlbWE7Ci0KLQlzdHJ1Y3QgcnR3X3F1ZXVlCWJlX3BlbmRpbmc7Ci0Jc3RydWN0IHJ0d19xdWV1ZQlia19wZW5kaW5nOwotCXN0cnVjdCBydHdfcXVldWUJdmlfcGVuZGluZzsKLQlzdHJ1Y3QgcnR3X3F1ZXVlCXZvX3BlbmRpbmc7Ci0Jc3RydWN0IHJ0d19xdWV1ZQlibV9wZW5kaW5nOwotCi0JaW50IGZyZWVfeG1pdGZyYW1lX2NudDsKLQlzdHJ1Y3QgcnR3X3F1ZXVlCWZyZWVfeG1pdF9xdWV1ZTsKLQotCWludCBmcmVlX3hmcmFtZV9leHRfY250OwotCXN0cnVjdCBydHdfcXVldWUgZnJlZV94ZnJhbWVfZXh0X3F1ZXVlOwotCi0JdWludAlmcmFnX2xlbjsKLQotCXN0cnVjdCBydHdfYWRhcHRlcgkqYWRhcHRlcjsKLQotCXU2NAl0eF9ieXRlczsKLQl1NjQJdHhfcGt0czsKLQl1NjQJdHhfZHJvcDsKLQl1NjQJbGFzdF90eF9ieXRlczsKLQl1NjQJbGFzdF90eF9wa3RzOwotCi0Jc3RydWN0IGh3X3htaXQgKmh3eG1pdHM7Ci0JdTgJaHd4bWl0X2VudHJ5OwotCXU4CXZjczsKLQl1OAlucW9zX3NzbjsKLQotCXU4CXdtbV9wYXJhX3NlcVs0XTsvKiBzZXF1ZW5jZSBmb3Igd21tIGFjIHBhcmFtZXRlciBzdHJlbmd0aCBmcm9tCi0JCQkJICogbGFyZ2UgdG8gc21hbGwuIGl0J3MgdmFsdWUgaXMgMC0+dm8sIDEtPnZpLAotCQkJCSAqIDItPmJlLCAzLT5iay4KLQkJCQkgKi8KLQotCXN0cnVjdCBzZW1hcGhvcmUJdHhfcmV0ZXZ0Oy8qIGFsbCB0eCByZXR1cm4gZXZlbnQ7ICovCi0KLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgeG1pdF90YXNrbGV0OwotCi0Jc3RydWN0IHJ0d19xdWV1ZSBmcmVlX3htaXRidWZfcXVldWU7Ci0Jc3RydWN0IGxpc3RfaGVhZCB4bWl0YnVmX2xpc3Q7CQkvKiB0cmFjayBidWZmZXJzIGZvciBjbGVhbnVwICovCi0Jc3RydWN0IHJ0d19xdWV1ZSBwZW5kaW5nX3htaXRidWZfcXVldWU7Ci0JdWludCBmcmVlX3htaXRidWZfY250OwotCi0Jc3RydWN0IHJ0d19xdWV1ZSBmcmVlX3htaXRfZXh0YnVmX3F1ZXVlOwotCXN0cnVjdCBsaXN0X2hlYWQgeG1pdGV4dGJ1Zl9saXN0OwkvKiB0cmFjayBidWZmZXJzIGZvciBjbGVhbnVwICovCi0JdWludCBmcmVlX3htaXRfZXh0YnVmX2NudDsKLQotCWludAlhY2tfdHg7Ci0Jc3RydWN0IG11dGV4IGFja190eF9tdXRleDsKLQlzdHJ1Y3Qgc3VibWl0X2N0eCBhY2tfdHhfb3BzOwotCXNwaW5sb2NrX3QgbG9ja19zY3R4OwotfTsKLQotc3RydWN0IHhtaXRfYnVmICpydHdfYWxsb2NfeG1pdGJ1ZjIzYV9leHQoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2KTsKLXMzMiBydHdfZnJlZV94bWl0YnVmX2V4dDIzYShzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYsCi0JCQkgc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1Zik7Ci0KLXN0cnVjdCB4bWl0X2J1ZiAqcnR3X2FsbG9jX3htaXRidWYyM2Eoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2KTsKLXMzMiBydHdfZnJlZV94bWl0YnVmMjNhKHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiwgc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1Zik7Ci0KLXZvaWQgcnR3X2NvdW50X3R4X3N0YXRzMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSwgaW50IHN6KTsKLXZvaWQgcnR3X3VwZGF0ZV9wcm90ZWN0aW9uMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICppZSwgdWludCBpZV9sZW4pOwotc3RydWN0IHhtaXRfZnJhbWUgKnJ0d19hbGxvY194bWl0ZnJhbWUyM2FfZXh0KHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdik7Ci1zdHJ1Y3QgeG1pdF9mcmFtZSAqcnR3X2FsbG9jX3htaXRmcmFtZTIzYV9vbmNlKHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdik7Ci1zMzIgcnR3X2ZyZWVfeG1pdGZyYW1lMjNhKHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiwKLQkJICAgICAgIHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKTsKLXZvaWQgcnR3X2ZyZWVfeG1pdGZyYW1lX3F1ZXVlMjNhKHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiwgc3RydWN0IHJ0d19xdWV1ZSAqcGZyYW1lcXVldWUpOwotc3RydWN0IHR4X3NlcnZxICpydHdfZ2V0X3N0YV9wZW5kaW5nMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgICBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEsIGludCB1cCwgdTggKmFjKTsKLXMzMiBydHdfeG1pdGZyYW1lX2VucXVldWUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpOwotc3RydWN0IHhtaXRfZnJhbWUgKnJ0d19kZXF1ZXVlX3hmcmFtZTIzYShzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYsCi0JCQkJICAgICAgc3RydWN0IGh3X3htaXQgKnBod3htaXRfaSwgaW50IGVudHJ5KTsKLXMzMiBydHdfeG1pdDIzYV9jbGFzc2lmaWVyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSk7Ci1zMzIgcnR3X3htaXRmcmFtZV9jb2FsZXNjZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LAotCQkJICAgICAgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpOwotczMyIF9ydHdfaW5pdF9od190eHF1ZXVlKHN0cnVjdCBod190eHF1ZXVlICpwaHdfdHhxdWV1ZSwgdTggYWNfdGFnKTsKLXZvaWQgX3J0d19pbml0X3N0YV94bWl0X3ByaXYyM2Eoc3RydWN0IHN0YV94bWl0X3ByaXYgKnBzdGFfeG1pdHByaXYpOwotCi1zMzIgcnR3X3R4ZnJhbWVzX3BlbmRpbmcyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1zMzIgcnR3X3R4ZnJhbWVzX3N0YV9hY19wZW5kaW5nMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWIpOwotdm9pZCBydHdfaW5pdF9od3htaXRzMjNhKHN0cnVjdCBod194bWl0ICpwaHd4bWl0LCBpbnQgZW50cnkpOwotaW50IF9ydHdfaW5pdF94bWl0X3ByaXYyM2Eoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2LAotCQkJc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIF9ydHdfZnJlZV94bWl0X3ByaXYyM2Eoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2KTsKLXZvaWQgcnR3X2FsbG9jX2h3eG1pdHMyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0d19mcmVlX2h3eG1pdHMyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1pbnQgcnR3X3htaXQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnBrdCk7Ci0jaWYgZGVmaW5lZChDT05GSUdfODcyM0FVX0FQX01PREUpCi1pbnQgeG1pdGZyYW1lX2VucXVldWVfZm9yX3NsZWVwaW5nX3N0YTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICAgICBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSk7Ci12b2lkIHN0b3Bfc3RhX3htaXQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKTsKLXZvaWQgd2FrZXVwX3N0YV90b194bWl0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSk7Ci12b2lkIHhtaXRfZGVsaXZlcnlfZW5hYmxlZF9mcmFtZXMyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSk7Ci0jZW5kaWYKLXU4CXFvc19hY20yM2EodTggYWNtX21hc2ssIHU4IHByaW9yaXR5KTsKLXUzMglydHdfZ2V0X2ZmX2h3YWRkcjIzYShzdHJ1Y3QgeG1pdF9mcmFtZQkqcHhtaXRmcmFtZSk7Ci1pbnQgcnR3X2Fja190eF93YWl0MjNhKHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiwgdTMyIHRpbWVvdXRfbXMpOwotCi0vKiBpbmNsdWRlIGFmdGVyIGRlY2xhcmluZyBzdHJ1Y3QgeG1pdF9idWYsIGluIG9yZGVyIHRvIGF2b2lkIHdhcm5pbmcgKi8KLSNpbmNsdWRlIDx4bWl0X29zZGVwLmg+Ci0KLSNlbmRpZgkvKiBfUlRMODcxWF9YTUlUX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvc3RhX2luZm8uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9zdGFfaW5mby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzI2MDA1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9zdGFfaW5mby5oCisrKyAvZGV2L251bGwKQEAgLTEsMzczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1NUQV9JTkZPX0hfCi0jZGVmaW5lIF9fU1RBX0lORk9fSF8KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLSNpbmNsdWRlIDx3aWZpLmg+Ci0KLSNkZWZpbmUgSUJTU19TVEFSVF9NQUNfSUQJMgotI2RlZmluZSBOVU1fU1RBIDMyCi0jZGVmaW5lIE5VTV9BQ0wgMTYKLQotCi0vKiBpZiBtb2RlID09MCwgdGhlbiB0aGUgc3RhIGlzIGFsbG93ZWQgb25jZSB0aGUgYWRkciBpcyBoaXQuICovCi0vKiBpZiBtb2RlID09MSwgdGhlbiB0aGUgc3RhIGlzIHJlamVjdGVkIG9uY2UgdGhlIGFkZHIgaXMgbm9uLWhpdC4gKi8KLXN0cnVjdCBydHdfd2xhbl9hY2xfbm9kZSB7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0OwotCXU4ICAgICAgIGFkZHJbRVRIX0FMRU5dOwotCXU4ICAgICAgIHZhbGlkOwotfTsKLQotLyogbW9kZT0wLCBkaXNhYmxlICovCi0vKiBtb2RlPTEsIGFjY2VwdCB1bmxlc3MgaW4gZGVueSBsaXN0ICovCi0vKiBtb2RlPTIsIGRlbnkgdW5sZXNzIGluIGFjY2VwdCBsaXN0ICovCi1zdHJ1Y3Qgd2xhbl9hY2xfcG9vbCB7Ci0JaW50IG1vZGU7Ci0JaW50IG51bTsKLQlzdHJ1Y3QgcnR3X3dsYW5fYWNsX25vZGUgYWNsbm9kZVtOVU1fQUNMXTsKLQlzdHJ1Y3QgcnR3X3F1ZXVlCWFjbF9ub2RlX3E7Ci19OwotCi1zdHJ1Y3QgcnNzaV9zdGEgIHsKLQlzMzIJVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7Ci0JczMyCVVuZGVjb3JhdGVkU21vb3RoZWRDQ0s7Ci0JczMyCVVuZGVjb3JhdGVkU21vb3RoZWRPRkRNOwotCXU2NAlQYWNrZXRNYXA7Ci0JdTgJVmFsaWRCaXQ7Ci19OwotCi1zdHJ1Y3QJc3RhaW5mb19zdGF0cwl7Ci0JdTY0IHJ4X21nbnRfcGt0czsKLQkJdTY0IHJ4X2JlYWNvbl9wa3RzOwotCQl1NjQgcnhfcHJvYmVyZXFfcGt0czsKLQkJdTY0IHJ4X3Byb2JlcnNwX3BrdHM7Ci0JCXU2NCByeF9wcm9iZXJzcF9ibV9wa3RzOwotCQl1NjQgcnhfcHJvYmVyc3BfdW9fcGt0czsKLQl1NjQgcnhfY3RybF9wa3RzOwotCXU2NCByeF9kYXRhX3BrdHM7Ci0KLQl1NjQJbGFzdF9yeF9tZ250X3BrdHM7Ci0JCXU2NCBsYXN0X3J4X2JlYWNvbl9wa3RzOwotCQl1NjQgbGFzdF9yeF9wcm9iZXJlcV9wa3RzOwotCQl1NjQgbGFzdF9yeF9wcm9iZXJzcF9wa3RzOwotCQl1NjQgbGFzdF9yeF9wcm9iZXJzcF9ibV9wa3RzOwotCQl1NjQgbGFzdF9yeF9wcm9iZXJzcF91b19wa3RzOwotCXU2NAlsYXN0X3J4X2N0cmxfcGt0czsKLQl1NjQJbGFzdF9yeF9kYXRhX3BrdHM7Ci0KLQl1NjQJcnhfYnl0ZXM7Ci0JdTY0CXJ4X2Ryb3BzOwotCi0JdTY0CXR4X3BrdHM7Ci0JdTY0CXR4X2J5dGVzOwotCXU2NCAgdHhfZHJvcHM7Ci0KLX07Ci0KLXN0cnVjdCBzdGFfaW5mbyB7Ci0Jc3BpbmxvY2tfdAlsb2NrOwotCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsgLyogZnJlZV9zdGFfcXVldWUgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCWhhc2hfbGlzdDsgLyogc3RhX2hhc2ggKi8KLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyOwotCi0Jc3RydWN0IHN0YV94bWl0X3ByaXYgc3RhX3htaXRwcml2OwotCXN0cnVjdCBzdGFfcmVjdl9wcml2IHN0YV9yZWN2cHJpdjsKLQotCXN0cnVjdCBydHdfcXVldWUgc2xlZXBfcTsKLQl1bnNpZ25lZCBpbnQgc2xlZXBxX2xlbjsKLQotCXVpbnQgc3RhdGU7Ci0JdWludCBhaWQ7Ci0JdWludCBtYWNfaWQ7Ci0JdWludCBxb3Nfb3B0aW9uOwotCXU4CWh3YWRkcltFVEhfQUxFTl07Ci0KLQl1aW50CWllZWU4MDIxeF9ibG9ja2VkOwkvKiAwOiBhbGxvd2VkLCAxOmJsb2NrZWQgKi8KLQl1MzIJZG90MTE4MDIxWFByaXZhY3k7IC8qIGFlcywgdGtpcC4uLiAqLwotCXVuaW9uIEtleXR5cGUJZG90MTF0a2lwdHhtaWNrZXk7Ci0JdW5pb24gS2V5dHlwZQlkb3QxMXRraXByeG1pY2tleTsKLQl1bmlvbiBLZXl0eXBlCWRvdDExODAyMXhfVW5jc3RLZXk7Ci0JdW5pb24gcG40OAkJZG90MTF0eHBuOwkJCS8qICBQTjQ4IHVzZWQgZm9yIFVuaWNhc3QgeG1pdC4gKi8KLQl1bmlvbiBwbjQ4CQlkb3QxMXJ4cG47CQkJLyogIFBONDggdXNlZCBmb3IgVW5pY2FzdCByZWN2LiAqLwotCi0KLQl1OAlic3NyYXRlc2V0WzE2XTsKLQl1MzIJYnNzcmF0ZWxlbjsKLQlzMzIgIHJzc2k7Ci0JczMyCXNpZ25hbF9xdWFsaXR5OwotCi0JdTgJY3RzMnNlbGY7Ci0JdTgJcnRzZW47Ci0KLQl1OAlyYWlkOwotCXU4CWluaXRfcmF0ZTsKLQl1MzIJcmFfbWFzazsKLQl1OAl3aXJlbGVzc19tb2RlOwkvKiAgTkVUV09SS19UWVBFICovCi0Jc3RydWN0IHN0YWluZm9fc3RhdHMgc3RhX3N0YXRzOwotCi0JLyogZm9yIEEtTVBEVSBUWCwgQUREQkEgdGltZW91dCBjaGVjayAqLwotCXN0cnVjdCB0aW1lcl9saXN0IGFkZGJhX3JldHJ5X3RpbWVyOwotCi0JLyogZm9yIEEtTVBEVSBSeCByZW9yZGVyaW5nIGJ1ZmZlciBjb250cm9sICovCi0Jc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsIHJlY3ZyZW9yZGVyX2N0cmxbMTZdOwotCi0JLyogZm9yIEEtTVBEVSBUeCAqLwotCS8qIHVuc2lnbmVkIGNoYXIJCWFtcGR1X3R4ZW5fYml0bWFwOyAqLwotCXUxNglCQV9zdGFydGluZ19zZXFjdHJsWzE2XTsKLQotCXN0cnVjdCBodF9wcml2CWh0cHJpdjsKLQotCS8qIE5vdGVzOiAqLwotCS8qIFNUQV9Nb2RlOiAqLwotCS8qIGN1cnJfbmV0d29yayhtbG1lX3ByaXYvc2VjdXJpdHlfcHJpdi9xb3MvaHQpICsgc3RhX2luZm86IChTVEEgJiBBUCkgQ0FQL0lORk8gKi8KLQkvKiBzY2FuX3E6IEFQIENBUC9JTkZPICovCi0KLQkvKiBBUF9Nb2RlOiAqLwotCS8qIGN1cnJfbmV0d29yayhtbG1lX3ByaXYvc2VjdXJpdHlfcHJpdi9xb3MvaHQpIDogQVAgQ0FQL0lORk8gKi8KLQkvKiBzdGFfaW5mbzogKEFQICYgU1RBKSBDQVAvSU5GTyAqLwotCi0Jc3RydWN0IGxpc3RfaGVhZCBhc29jX2xpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZCBhdXRoX2xpc3Q7Ci0KLQl1bnNpZ25lZCBpbnQgZXhwaXJlX3RvOwotCXVuc2lnbmVkIGludCBhdXRoX3NlcTsKLQl1bnNpZ25lZCBpbnQgYXV0aGFsZzsKLQl1bnNpZ25lZCBjaGFyIGNoZ190eHRbMTI4XTsKLQotCXUxNiBjYXBhYmlsaXR5OwotCWludCBmbGFnczsKLQotCWludCBkb3Q4MDIxeGFsZzsvKiAwOmRpc2FibGUsIDE6cHNrLCAyOjgwMi4xeCAqLwotCWludCB3cGFfcHNrOy8qIDA6ZGlzYWJsZSwgYml0KDApOiBXUEEsIGJpdCgxKTpXUEEyICovCi0JaW50IHdwYV9ncm91cF9jaXBoZXI7Ci0JaW50IHdwYTJfZ3JvdXBfY2lwaGVyOwotCWludCB3cGFfcGFpcndpc2VfY2lwaGVyOwotCWludCB3cGEyX3BhaXJ3aXNlX2NpcGhlcjsKLQotCXU4IGJwYWlyd2lzZV9rZXlfaW5zdGFsbGVkOwotCi0JdTggd3BhX2llWzMyXTsKLQotCXU4IG5vbmVycF9zZXQ7Ci0JdTggbm9fc2hvcnRfc2xvdF90aW1lX3NldDsKLQl1OCBub19zaG9ydF9wcmVhbWJsZV9zZXQ7Ci0JdTggbm9faHRfZ2Zfc2V0OwotCXU4IG5vX2h0X3NldDsKLQl1OCBodF8yMG1oel9zZXQ7Ci0KLQl1bnNpZ25lZCBpbnQgdHhfcmFfYml0bWFwOwotCXU4IHFvc19pbmZvOwotCi0JdTggbWF4X3NwX2xlbjsKLQl1OCB1YXBzZF9iazsvKiBCSVQoMCk6IERlbGl2ZXJ5IGVuYWJsZWQsIEJJVCgxKTogVHJpZ2dlciBlbmFibGVkICovCi0JdTggdWFwc2RfYmU7Ci0JdTggdWFwc2Rfdmk7Ci0JdTggdWFwc2Rfdm87Ci0KLQl1OCBoYXNfbGVnYWN5X2FjOwotCXVuc2lnbmVkIGludCBzbGVlcHFfYWNfbGVuOwotCi0JLyogcDJwIHByaXYgZGF0YSAqLwotCXU4IGlzX3AycF9kZXZpY2U7Ci0JdTggcDJwX3N0YXR1c19jb2RlOwotCi0JdTgga2VlcF9hbGl2ZV90cnljbnQ7Ci0KLQkvKiBwMnAgY2xpZW50IGluZm8gKi8KLQl1OCBkZXZfYWRkcltFVEhfQUxFTl07Ci0JdTggZGV2X2NhcDsKLQl1MTYgY29uZmlnX21ldGhvZHM7Ci0JdTggcHJpbWFyeV9kZXZfdHlwZVs4XTsKLQl1OCBudW1fb2Zfc2VjZGV2X3R5cGU7Ci0JdTggc2VjZGV2X3R5cGVzX2xpc3RbMzJdOy8qICAzMi84ID09IDQ7ICovCi0JdTE2IGRldl9uYW1lX2xlbjsKLQl1OCBkZXZfbmFtZVszMl07Ci0JdTggKnBhc3NvY19yZXE7Ci0JdTMyIGFzc29jX3JlcV9sZW47Ci0KLQkvKiBmb3IgRE0gKi8KLQlzdHJ1Y3QgcnNzaV9zdGEJIHJzc2lfc3RhdDsKLQotCS8qICAqLwotCS8qICA9PT09PT09PT09PT09PT09T0RNIFJlbGF0aXZlIEluZm89PT09PT09PT09PT09PT09PT09PT09PSAqLwotCS8qICBQbGVhc2UgYmUgY2FyZSwgZG9udCBkZWNsYXJlIHRvbyBtdWNoIHN0cnVjdHVyZSBoZXJlLiBJdCB3aWxsIGNvc3QgbWVtb3J5ICogU1RBIHN1cHBvcnQgbnVtLiAqLwotCS8qICAqLwotCS8qICAqLwotCS8qICAyMDExLzEwLzIwIE1IIEFkZCBmb3IgT0RNIFNUQSBpbmZvLiAqLwotCS8qICAqLwotCS8qICBEcml2ZXIgV3JpdGUgKi8KLQl1OAkJYlZhbGlkOwkJCQkvKiAgcmVjb3JkIHRoZSBzdGEgc3RhdHVzIGxpbmsgb3Igbm90PyAqLwotCXU4CQlyc3NpX2xldmVsOwkJCS8qIGZvciBSZWZyZXNoIFJBIG1hc2sgKi8KLQkvKiAgT0RNIFdyaXRlICovCi0JLyogMSBQSFlfU1RBVFVTX0lORk8gKi8KLQl1OAkJUlNTSV9QYXRoWzRdOwkJLyogICovCi0JdTgJCVJTU0lfQXZlOwotCXU4CQlSWEVWTVs0XTsKLQl1OAkJUlhTTlJbNF07Ci0KLQkvKiAgT0RNIFdyaXRlICovCi0JLyogMSBUWF9JTkZPIChtYXkgY2hhbmdlZCBieSBJQykgKi8KLQkvKiAgPT09PT09PT09PT09PT09PU9ETSBSZWxhdGl2ZSBJbmZvPT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQkvKiAgKi8KLQotCS8qIFRvIHN0b3JlIHRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgcmVjZWl2ZWQgbWFuYWdlbWVudCBmcmFtZSAqLwotCXUxNiBSeE1nbXRGcmFtZVNlcU51bTsKLX07Ci0KLSNkZWZpbmUgc3RhX3J4X3BrdHMoc3RhKSBcCi0JKHN0YS0+c3RhX3N0YXRzLnJ4X21nbnRfcGt0cyBcCi0JKyBzdGEtPnN0YV9zdGF0cy5yeF9jdHJsX3BrdHMgXAotCSsgc3RhLT5zdGFfc3RhdHMucnhfZGF0YV9wa3RzKQotCi0jZGVmaW5lIHN0YV9sYXN0X3J4X3BrdHMoc3RhKSBcCi0JKHN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfbWdudF9wa3RzIFwKLQkrIHN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfY3RybF9wa3RzIFwKLQkrIHN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfZGF0YV9wa3RzKQotCi0jZGVmaW5lIHN0YV9yeF9kYXRhX3BrdHMoc3RhKSBcCi0JKHN0YS0+c3RhX3N0YXRzLnJ4X2RhdGFfcGt0cykKLQotI2RlZmluZSBzdGFfbGFzdF9yeF9kYXRhX3BrdHMoc3RhKSBcCi0JKHN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfZGF0YV9wa3RzKQotCi0jZGVmaW5lIHN0YV9yeF9tZ250X3BrdHMoc3RhKSBcCi0JKHN0YS0+c3RhX3N0YXRzLnJ4X21nbnRfcGt0cykKLQotI2RlZmluZSBzdGFfbGFzdF9yeF9tZ250X3BrdHMoc3RhKSBcCi0JKHN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfbWdudF9wa3RzKQotCi0jZGVmaW5lIHN0YV9yeF9iZWFjb25fcGt0cyhzdGEpIFwKLQkoc3RhLT5zdGFfc3RhdHMucnhfYmVhY29uX3BrdHMpCi0KLSNkZWZpbmUgc3RhX2xhc3RfcnhfYmVhY29uX3BrdHMoc3RhKSBcCi0JKHN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfYmVhY29uX3BrdHMpCi0KLSNkZWZpbmUgc3RhX3J4X3Byb2JlcmVxX3BrdHMoc3RhKSBcCi0JKHN0YS0+c3RhX3N0YXRzLnJ4X3Byb2JlcmVxX3BrdHMpCi0KLSNkZWZpbmUgc3RhX2xhc3RfcnhfcHJvYmVyZXFfcGt0cyhzdGEpIFwKLQkoc3RhLT5zdGFfc3RhdHMubGFzdF9yeF9wcm9iZXJlcV9wa3RzKQotCi0jZGVmaW5lIHN0YV9yeF9wcm9iZXJzcF9wa3RzKHN0YSkgXAotCShzdGEtPnN0YV9zdGF0cy5yeF9wcm9iZXJzcF9wa3RzKQotCi0jZGVmaW5lIHN0YV9sYXN0X3J4X3Byb2JlcnNwX3BrdHMoc3RhKSBcCi0JKHN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfcHJvYmVyc3BfcGt0cykKLQotI2RlZmluZSBzdGFfcnhfcHJvYmVyc3BfYm1fcGt0cyhzdGEpIFwKLQkoc3RhLT5zdGFfc3RhdHMucnhfcHJvYmVyc3BfYm1fcGt0cykKLQotI2RlZmluZSBzdGFfbGFzdF9yeF9wcm9iZXJzcF9ibV9wa3RzKHN0YSkgXAotCShzdGEtPnN0YV9zdGF0cy5sYXN0X3J4X3Byb2JlcnNwX2JtX3BrdHMpCi0KLSNkZWZpbmUgc3RhX3J4X3Byb2JlcnNwX3VvX3BrdHMoc3RhKSBcCi0JKHN0YS0+c3RhX3N0YXRzLnJ4X3Byb2JlcnNwX3VvX3BrdHMpCi0KLSNkZWZpbmUgc3RhX2xhc3RfcnhfcHJvYmVyc3BfdW9fcGt0cyhzdGEpIFwKLQkoc3RhLT5zdGFfc3RhdHMubGFzdF9yeF9wcm9iZXJzcF91b19wa3RzKQotCi0jZGVmaW5lIHN0YV91cGRhdGVfbGFzdF9yeF9wa3RzKHN0YSkgXAotCWRvIHsgXAotCQlzdGEtPnN0YV9zdGF0cy5sYXN0X3J4X21nbnRfcGt0cyA9IHN0YS0+c3RhX3N0YXRzLnJ4X21nbnRfcGt0czsgXAotCQlzdGEtPnN0YV9zdGF0cy5sYXN0X3J4X2JlYWNvbl9wa3RzID0gc3RhLT5zdGFfc3RhdHMucnhfYmVhY29uX3BrdHM7IFwKLQkJc3RhLT5zdGFfc3RhdHMubGFzdF9yeF9wcm9iZXJlcV9wa3RzID0gc3RhLT5zdGFfc3RhdHMucnhfcHJvYmVyZXFfcGt0czsgXAotCQlzdGEtPnN0YV9zdGF0cy5sYXN0X3J4X3Byb2JlcnNwX3BrdHMgPSBzdGEtPnN0YV9zdGF0cy5yeF9wcm9iZXJzcF9wa3RzOyBcCi0JCXN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfcHJvYmVyc3BfYm1fcGt0cyA9IHN0YS0+c3RhX3N0YXRzLnJ4X3Byb2JlcnNwX2JtX3BrdHM7IFwKLQkJc3RhLT5zdGFfc3RhdHMubGFzdF9yeF9wcm9iZXJzcF91b19wa3RzID0gc3RhLT5zdGFfc3RhdHMucnhfcHJvYmVyc3BfdW9fcGt0czsgXAotCQlzdGEtPnN0YV9zdGF0cy5sYXN0X3J4X2N0cmxfcGt0cyA9IHN0YS0+c3RhX3N0YXRzLnJ4X2N0cmxfcGt0czsgXAotCQlzdGEtPnN0YV9zdGF0cy5sYXN0X3J4X2RhdGFfcGt0cyA9IHN0YS0+c3RhX3N0YXRzLnJ4X2RhdGFfcGt0czsgXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgU1RBX1JYX1BLVFNfQVJHKHN0YSkgXAotCXN0YS0+c3RhX3N0YXRzLnJ4X21nbnRfcGt0cyBcCi0JLCBzdGEtPnN0YV9zdGF0cy5yeF9jdHJsX3BrdHMgXAotCSwgc3RhLT5zdGFfc3RhdHMucnhfZGF0YV9wa3RzCi0KLSNkZWZpbmUgU1RBX0xBU1RfUlhfUEtUU19BUkcoc3RhKSBcCi0Jc3RhLT5zdGFfc3RhdHMubGFzdF9yeF9tZ250X3BrdHMsIFwKLQlzdGEtPnN0YV9zdGF0cy5sYXN0X3J4X2N0cmxfcGt0cywgXAotCXN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfZGF0YV9wa3RzCi0KLSNkZWZpbmUgU1RBX1JYX1BLVFNfRElGRl9BUkcoc3RhKSBcCi0Jc3RhLT5zdGFfc3RhdHMucnhfbWdudF9wa3RzIC0gc3RhLT5zdGFfc3RhdHMubGFzdF9yeF9tZ250X3BrdHMsIFwKLQlzdGEtPnN0YV9zdGF0cy5yeF9jdHJsX3BrdHMgLSBzdGEtPnN0YV9zdGF0cy5sYXN0X3J4X2N0cmxfcGt0cywgXAotCXN0YS0+c3RhX3N0YXRzLnJ4X2RhdGFfcGt0cyAtIHN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfZGF0YV9wa3RzCi0KLSNkZWZpbmUgU1RBX1BLVFNfRk1UICIobTolbGx1LCBjOiVsbHUsIGQ6JWxsdSkiCi0KLXN0cnVjdCBzdGFfcHJpdiB7Ci0Jc3BpbmxvY2tfdCBzdGFfaGFzaF9sb2NrOwotCXN0cnVjdCBsaXN0X2hlYWQgc3RhX2hhc2hbTlVNX1NUQV07Ci0JaW50IGFzb2Nfc3RhX2NvdW50OwotCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcjsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGFzb2NfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGF1dGhfbGlzdDsKLQlzcGlubG9ja190IGFzb2NfbGlzdF9sb2NrOwotCXNwaW5sb2NrX3QgYXV0aF9saXN0X2xvY2s7Ci0JdTggYXNvY19saXN0X2NudDsKLQl1OCBhdXRoX2xpc3RfY250OwotCi0JdW5zaWduZWQgaW50IGF1dGhfdG87ICAvKiBzZWMsIHRpbWUgdG8gZXhwaXJlIGluIGF1dGhlbnRpY2F0aW5nLiAqLwotCXVuc2lnbmVkIGludCBhc3NvY190bzsgLyogc2VjLCB0aW1lIHRvIGV4cGlyZSBiZWZvcmUgYXNzb2NpYXRpbmcuICovCi0JdW5zaWduZWQgaW50IGV4cGlyZV90bzsgLyogc2VjICwgdGltZSB0byBleHBpcmUgYWZ0ZXIgYXNzb2NpYXRlZC4gKi8KLQotCS8qIHBvaW50ZXJzIHRvIFNUQSBpbmZvOyBiYXNlZCBvbiBhbGxvY2F0ZWQgQUlEIG9yIE5VTEwgaWYgQUlEIGZyZWUKLQkgKiBBSUQgaXMgaW4gdGhlIHJhbmdlIDEtMjAwNywgc28gc3RhX2FpZFswXSBjb3JyZXNwb25kZXJzIHRvIEFJRCAxCi0JICogYW5kIHNvIG9uCi0JICovCi0Jc3RydWN0IHN0YV9pbmZvICpzdGFfYWlkW05VTV9TVEFdOwotCi0JdTE2IHN0YV9kel9iaXRtYXA7Lyogb25seSBzdXBwb3J0IDE1IHN0YXRpb25zLCBzdGF0aW9uIGFpZCBiaXRtYXAKLQkJCSAgICogZm9yIHNsZWVwaW5nIHN0YS4gKi8KLQl1MTYgdGltX2JpdG1hcDsvKiBvbmx5IHN1cHBvcnQgMTUgc3RhdGlvbnMsCi0JCQkqIGFpZD0wfjE1IG1hcHBpbmcgYml0MH5iaXQxNSAqLwotCi0JdTE2IG1heF9udW1fc3RhOwotCi0Jc3RydWN0IHdsYW5fYWNsX3Bvb2wgYWNsX2xpc3Q7Ci19OwotCi1zdGF0aWMgaW5saW5lIHUzMiB3aWZpX21hY19oYXNoKGNvbnN0IHU4ICptYWMpCi17Ci0JdTMyIHg7Ci0KLQl4ID0gbWFjWzBdOwotCXggPSAoeCA8PCAyKSBeIG1hY1sxXTsKLQl4ID0gKHggPDwgMikgXiBtYWNbMl07Ci0JeCA9ICh4IDw8IDIpIF4gbWFjWzNdOwotCXggPSAoeCA8PCAyKSBeIG1hY1s0XTsKLQl4ID0gKHggPDwgMikgXiBtYWNbNV07Ci0KLQl4IF49IHggPj4gODsKLQl4ICA9IHggJiAoTlVNX1NUQSAtIDEpOwotCi0JcmV0dXJuIHg7Ci19Ci0KLWludCBfcnR3X2luaXRfc3RhX3ByaXYyM2Eoc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdik7Ci1pbnQgX3J0d19mcmVlX3N0YV9wcml2MjNhKHN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYpOwotCi1zdHJ1Y3Qgc3RhX2luZm8gKnJ0d19hbGxvY19zdGFpbmZvMjNhKHN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYsIGNvbnN0IHU4ICpod2FkZHIsIGdmcF90IGdmcCk7Ci1pbnQgcnR3X2ZyZWVfc3RhaW5mbzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpOwotdm9pZCBydHdfZnJlZV9hbGxfc3RhaW5mbzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXN0cnVjdCBzdGFfaW5mbyAqcnR3X2dldF9zdGFpbmZvMjNhKHN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYsIGNvbnN0IHU4ICpod2FkZHIpOwotaW50IHJ0d19pbml0X2JjbWNfc3RhaW5mbzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXN0cnVjdCBzdGFfaW5mbyAqcnR3X2dldF9iY21jX3N0YWluZm8yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1ib29sIHJ0d19hY2Nlc3NfY3RybDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqbWFjX2FkZHIpOwotCi0jZW5kaWYgLyogX1NUQV9JTkZPX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvdXNiX29wcy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3VzYl9vcHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYxMWUxMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvdXNiX29wcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fVVNCX09QU19IXwotI2RlZmluZSBfX1VTQl9PUFNfSF8KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLSNpbmNsdWRlIDxvc2RlcF9pbnRmLmg+Ci0jaW5jbHVkZSA8dXNiX29wc19saW51eC5oPgotCi0jZGVmaW5lIFJFQUxURUtfVVNCX1ZFTlFUX1JFQUQJCTB4QzAKLSNkZWZpbmUgUkVBTFRFS19VU0JfVkVOUVRfV1JJVEUJCTB4NDAKLSNkZWZpbmUgUkVBTFRFS19VU0JfVkVOUVRfQ01EX1JFUQkweDA1Ci0jZGVmaW5lIFJFQUxURUtfVVNCX1ZFTlFUX0NNRF9JRFgJMHgwMAotCi1lbnVtIHsKLQlWRU5ET1JfV1JJVEUgPSAweDAwLAotCVZFTkRPUl9SRUFEID0gMHgwMSwKLX07Ci0KLSNkZWZpbmUgQUxJR05NRU5UX1VOSVQJCQkJMTYKLSNkZWZpbmUgTUFYX1ZFTkRPUl9SRVFfQ01EX1NJWkUJMjU0CQkvKiA4MTg4Y3UgU0lFIFN1cHBvcnQgKi8KLSNkZWZpbmUgTUFYX1VTQl9JT19DVExfU0laRQkoTUFYX1ZFTkRPUl9SRVFfQ01EX1NJWkUgK0FMSUdOTUVOVF9VTklUKQotCi12b2lkIHJ0bDg3MjNhdV9zZXRfaHdfdHlwZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotdm9pZCBydGw4NzIzYXVfcmVjdl90YXNrbGV0KHZvaWQgKnByaXYpOwotCi12b2lkIHJ0bDg3MjNhdV94bWl0X3Rhc2tsZXQodm9pZCAqcHJpdik7Ci0KLS8qIEluY3JlYXNlIGFuZCBjaGVjayBpZiB0aGUgY29udGludWFsX3VyYl9lcnJvciBvZiB0aGlzIEBwYXJhbSBkdm9ianByaXZlIGlzCi0gKiBsYXJnZXIgdGhhbiBNQVhfQ09OVElOVUFMX1VSQl9FUlIuIFJldHVybiByZXN1bHQKLSAqLwotc3RhdGljIGlubGluZSBpbnQgcnR3X2luY19hbmRfY2hrX2NvbnRpbnVhbF91cmJfZXJyb3Ioc3RydWN0IGR2b2JqX3ByaXYgKmR2b2JqKQotewotCWludCByZXQgPSBmYWxzZTsKLQlpbnQgdmFsdWU7Ci0KLQl2YWx1ZSA9IGF0b21pY19pbmNfcmV0dXJuKCZkdm9iai0+Y29udGludWFsX3VyYl9lcnJvcik7Ci0JaWYgKHZhbHVlID4gTUFYX0NPTlRJTlVBTF9VUkJfRVJSKSB7Ci0JCURCR184NzIzQSgiW2R2b2JqOiVwXVtFUlJPUl0gY29udGludWFsX3VyYl9lcnJvcjolZCA+ICVkXG4iLAotCQkJICBkdm9iaiwgdmFsdWUsIE1BWF9DT05USU5VQUxfVVJCX0VSUik7Ci0JCXJldCA9IHRydWU7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIFNldCB0aGUgY29udGludWFsX3VyYl9lcnJvciBvZiB0aGlzIEBwYXJhbSBkdm9ianByaXZlIHRvIDAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBydHdfcmVzZXRfY29udGludWFsX3VyYl9lcnJvcihzdHJ1Y3QgZHZvYmpfcHJpdiAqZHZvYmopCi17Ci0JYXRvbWljX3NldCgmZHZvYmotPmNvbnRpbnVhbF91cmJfZXJyb3IsIDApOwotfQotCi1ib29sIHJ0bDg3MjNhdV9jaGlwX2NvbmZpZ3VyZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotI2VuZGlmIC8qIF9fVVNCX09QU19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3VzYl9vcHNfbGludXguaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS91c2Jfb3BzX2xpbnV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMmYxNGIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3VzYl9vcHNfbGludXguaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1VTQl9PUFNfTElOVVhfSF9fCi0jZGVmaW5lIF9fVVNCX09QU19MSU5VWF9IX18KLQotI2RlZmluZSBWRU5ET1JfQ01EX01BWF9EQVRBX0xFTgkyNTQKLQotI2RlZmluZSBSVFdfVVNCX0NPTlRST0xfTVNHX1RJTUVPVVQJNTAwLyogbXMgKi8KLQotI2RlZmluZSBNQVhfVVNCQ1RSTF9WRU5ET1JSRVFfVElNRVMJMTAKLQotaW50IHJ0bDg3MjNhdV9yZWFkX3BvcnQoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCB1MzIgY250LAotCQkJc3RydWN0IHJlY3ZfYnVmICpwcmVjdmJ1Zik7Ci12b2lkIHJ0bDg3MjNhdV9yZWFkX3BvcnRfY2FuY2VsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotaW50IHJ0bDg3MjNhdV93cml0ZV9wb3J0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgY250LAotCQkJIHN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYpOwotdm9pZCBydGw4NzIzYXVfd3JpdGVfcG9ydF9jYW5jZWwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1pbnQgcnRsODcyM2F1X3JlYWRfaW50ZXJydXB0KHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcik7Ci0KLXU4IHJ0bDg3MjNhdV9yZWFkOChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MTYgYWRkcik7Ci11MTYgcnRsODcyM2F1X3JlYWQxNihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MTYgYWRkcik7Ci11MzIgcnRsODcyM2F1X3JlYWQzMihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MTYgYWRkcik7Ci1pbnQgcnRsODcyM2F1X3dyaXRlOChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MTYgYWRkciwgdTggdmFsKTsKLWludCBydGw4NzIzYXVfd3JpdGUxNihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MTYgYWRkciwgdTE2IHZhbCk7Ci1pbnQgcnRsODcyM2F1X3dyaXRlMzIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTE2IGFkZHIsIHUzMiB2YWwpOwotaW50IHJ0bDg3MjNhdV93cml0ZU4oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICAgICB1MTYgYWRkciwgdTE2IGxlbmd0aCwgdTggKnBkYXRhKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvd2lmaS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3dpZmkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVkNTczYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvd2lmaS5oCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9XSUZJX0hfCi0jZGVmaW5lIF9XSUZJX0hfCi0KLS8qICBUaGlzIHZhbHVlIGlzIHRlc3RlZCBieSBXaUZpIDExbiBUZXN0IFBsYW4gNS4yLjMuCi0gKiAgVGhpcyB0ZXN0IHZlcmlmaWVzIHRoZSBXTEFOIE5JQyBjYW4gdXBkYXRlIHRoZSBOQVYgdGhyb3VnaCBzZW5kaW5nCi0gKiAgdGhlIENUUyB3aXRoIGxhcmdlIGR1cmF0aW9uLgotICovCi0jZGVmaW5lCVdpRmlOYXZVcHBlclVzCQkzMDAwMAkvKiAgMzAgbXMgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJCUJlbG93IGlzIHRoZSBkZWZpbml0aW9uIGZvciA4MDIuMTFuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdHJ1Y3QgQUNfcGFyYW0gewotCXU4CQkJQUNJX0FJRlNOOwotCXU4CQkJQ1c7Ci0JX19sZTE2CQkJVFhPUF9saW1pdDsKLX0gIF9fcGFja2VkOwotCi1zdHJ1Y3QgV01NX3BhcmFfZWxlbWVudCB7Ci0JdW5zaWduZWQgY2hhcgkJUW9TX2luZm87Ci0JdW5zaWduZWQgY2hhcgkJcmVzZXJ2ZWQ7Ci0Jc3RydWN0IEFDX3BhcmFtCWFjX3BhcmFtWzRdOwotfSAgX19wYWNrZWQ7Ci0KLXN0cnVjdCBBRERCQV9yZXF1ZXN0IHsKLQl1OAkJZGlhbG9nX3Rva2VuOwotCV9fbGUxNgkJQkFfcGFyYV9zZXQ7Ci0JX19sZTE2CQlCQV90aW1lb3V0X3ZhbHVlOwotCV9fbGUxNgkJQkFfc3RhcnRpbmdfc2VxY3RybDsKLX0gIF9fcGFja2VkOwotCi0KLS8qCT09PT09PT09PT09PT09PVdQUyBTZWN0aW9uPT09PT09PT09PT09PT09ICovCi0vKglXUFMgYXR0cmlidXRlIElEICovCi0jZGVmaW5lIFdQU19BVFRSX1ZFUjEJCQkJMHgxMDRBCi0jZGVmaW5lIFdQU19BVFRSX1NJTVBMRV9DT05GX1NUQVRFCQkweDEwNDQKLSNkZWZpbmUgV1BTX0FUVFJfUkVTUF9UWVBFCQkJMHgxMDNCCi0jZGVmaW5lIFdQU19BVFRSX1VVSURfRQkJCQkweDEwNDcKLSNkZWZpbmUgV1BTX0FUVFJfTUFOVUZBQ1RVUkVSCQkJMHgxMDIxCi0jZGVmaW5lIFdQU19BVFRSX01PREVMX05BTUUJCQkweDEwMjMKLSNkZWZpbmUgV1BTX0FUVFJfTU9ERUxfTlVNQkVSCQkJMHgxMDI0Ci0jZGVmaW5lIFdQU19BVFRSX1NFUklBTF9OVU1CRVIJCQkweDEwNDIKLSNkZWZpbmUgV1BTX0FUVFJfUFJJTUFSWV9ERVZfVFlQRQkJMHgxMDU0Ci0jZGVmaW5lIFdQU19BVFRSX1NFQ19ERVZfVFlQRV9MSVNUCQkweDEwNTUKLSNkZWZpbmUgV1BTX0FUVFJfREVWSUNFX05BTUUJCQkweDEwMTEKLSNkZWZpbmUgV1BTX0FUVFJfQ09ORl9NRVRIT0QJCQkweDEwMDgKLSNkZWZpbmUgV1BTX0FUVFJfUkZfQkFORFMJCQkweDEwM0MKLSNkZWZpbmUgV1BTX0FUVFJfREVWSUNFX1BXSUQJCQkweDEwMTIKLSNkZWZpbmUgV1BTX0FUVFJfUkVRVUVTVF9UWVBFCQkJMHgxMDNBCi0jZGVmaW5lIFdQU19BVFRSX0FTU09DSUFUSU9OX1NUQVRFCQkweDEwMDIKLSNkZWZpbmUgV1BTX0FUVFJfQ09ORklHX0VSUk9SCQkJMHgxMDA5Ci0jZGVmaW5lIFdQU19BVFRSX1ZFTkRPUl9FWFQJCQkweDEwNDkKLSNkZWZpbmUgV1BTX0FUVFJfU0VMRUNURURfUkVHSVNUUkFSCQkweDEwNDEKLQotLyoJV1BTIENvbmZpZ3VyYXRpb24gTWV0aG9kICovCi0jZGVmaW5lCVdQU19DTV9OT05FCQkJCQkweDAwMDAKLSNkZWZpbmUJV1BTX0NNX0xBQkVMCQkJCQkweDAwMDQKLSNkZWZpbmUJV1BTX0NNX0RJU1BMWUEJCQkJCTB4MDAwOAotI2RlZmluZQlXUFNfQ01fRVhURVJOQUxfTkZDX1RPS0VOCQkJMHgwMDEwCi0jZGVmaW5lCVdQU19DTV9JTlRFR1JBVEVEX05GQ19UT0tFTgkJCTB4MDAyMAotI2RlZmluZQlXUFNfQ01fTkZDX0lOVEVSRkFDRQkJCQkweDAwNDAKLSNkZWZpbmUJV1BTX0NNX1BVU0hfQlVUVE9OCQkJCTB4MDA4MAotI2RlZmluZQlXUFNfQ01fS0VZUEFECQkJCQkweDAxMDAKLSNkZWZpbmUJV1BTX0NNX1NXX1BVSFNfQlVUVE9OCQkJCTB4MDI4MAotI2RlZmluZQlXUFNfQ01fSFdfUFVIU19CVVRUT04JCQkJMHgwNDgwCi0jZGVmaW5lCVdQU19DTV9TV19ESVNQTEFZX1BJTgkJCQkweDIwMDgKLSNkZWZpbmUJV1BTX0NNX0xDRF9ESVNQTEFZX1BJTgkJCQkweDQwMDgKLQotI2VuZGlmIC8qICBfV0lGSV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3dsYW5fYnNzZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvd2xhbl9ic3NkZWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTViMzJlMS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvd2xhbl9ic3NkZWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19XTEFOX0JTU0RFRl9IX18KLSNkZWZpbmUgX19XTEFOX0JTU0RFRl9IX18KLQotCi0jZGVmaW5lIE1BWF9JRV9TWgk3NjgKLQotCi0jZGVmaW5lIE5ESVNfODAyXzExX0xFTkdUSF9SQVRFUyAgICAgICAgOAotI2RlZmluZSBORElTXzgwMl8xMV9MRU5HVEhfUkFURVNfRVggICAgIDE2Ci0KLS8qIExlbmd0aCBpcyB0aGUgNCBieXRlcyBtdWx0aXBsZXMgb2YgdGhlIHN1bSBvZgotICogc2l6ZW9mKDYgKiBzaXplb2YodW5zaWduZWQgY2hhcikpICsgMiArIHNpemVvZihzdHJ1Y3QgbmRpc184MDJfMTFfc3NpZCkgKwotICogc2l6ZW9mKHUzMikgKyBzaXplb2YobG9uZykgKyBzaXplb2YoZW51bSBuZGlzXzgwMl8xMV9uZXRfdHlwZSkgKwotICogc2l6ZW9mKHN0cnVjdCBuZGlzXzgwMl8xMV9jb25maWcpICsgc2l6ZW9mKHNpemVvZih1bnNpZ25lZCBjaGFyKSAqCi0gKiBORElTXzgwMl8xMV9MRU5HVEhfUkFURVNfRVgpICsgSUVMZW5ndGgKLSAqCi0gKiBFeGNlcHQgdGhlIElFTGVuZ3RoLCBhbGwgb3RoZXIgZmllbGRzIGFyZSBmaXhlZCBsZW5ndGguIFRoZXJlZm9yZSwKLSAqIHdlIGNhbiBkZWZpbmUgYSBtYWNybyB0byBwcmVzZW50IHRoZSBwYXJ0aWFsIHN1bS4KLSAqLwotCi1lbnVtIG5kaXNfODAyXzExX2F1dGhfbW9kZSB7Ci0JTmRpczgwMl8xMUF1dGhNb2RlT3BlbiwKLQlOZGlzODAyXzExQXV0aE1vZGVTaGFyZWQsCi0JTmRpczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaCwKLQlOZGlzODAyXzExQXV0aE1vZGVXUEEsCi0JTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLLAotCU5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUsCi0JZGlzODAyXzExQXV0aE1vZGVNYXggICAgICAgLyogIHVwcGVyIGJvdW5kICovCi19OwotCi1lbnVtICB7Ci0JTmRpczgwMl8xMVdFUEVuYWJsZWQsCi0JTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZCA9IE5kaXM4MDJfMTFXRVBFbmFibGVkLAotCU5kaXM4MDJfMTFXRVBEaXNhYmxlZCwKLQlOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkID0gTmRpczgwMl8xMVdFUERpc2FibGVkLAotCU5kaXM4MDJfMTFXRVBLZXlBYnNlbnQsCi0JTmRpczgwMl8xMUVuY3J5cHRpb24xS2V5QWJzZW50ID0gTmRpczgwMl8xMVdFUEtleUFic2VudCwKLQlOZGlzODAyXzExV0VQTm90U3VwcG9ydGVkLAotCU5kaXM4MDJfMTFFbmNyeXB0aW9uTm90U3VwcG9ydGVkID0gTmRpczgwMl8xMVdFUE5vdFN1cHBvcnRlZCwKLQlOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkLAotCU5kaXM4MDJfMTFFbmNyeXB0aW9uMktleUFic2VudCwKLQlOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkLAotCU5kaXM4MDJfMTFFbmNyeXB0aW9uM0tleUFic2VudCwKLX07Ci0KLXN0cnVjdCB3bGFuX2Jjbl9pbmZvIHsKLQkvKiB0aGVzZSBpbmZvciBnZXQgZnJvbSBydHdfZ2V0X2VuY3J5cHRfaW5mbyB3aGVuCi0JICoJICogdHJhbnNsYXRlIHNjYW4gdG8gVUkgKi8KLQl1OCBlbmNyeXBfcHJvdG9jb2w7LyogRU5DUllQX1BST1RPQ09MX0U6IE9QRU4vV0VQL1dQQS9XUEEyICovCi0JaW50IGdyb3VwX2NpcGhlcjsgLyogV1BBL1dQQTIgZ3JvdXAgY2lwaGVyICovCi0JaW50IHBhaXJ3aXNlX2NpcGhlcjsvKiBXUEEvV1BBMi9XRVAgcGFpcndpc2UgY2lwaGVyICovCi0JaW50IGlzXzgwMjF4OwotCi0JLyogYndtb2RlIDIwLzQwIGFuZCBjaF9vZmZzZXQgVVAvTE9XICovCi19OwotCi1zdHJ1Y3Qgd2xhbl9ic3NpZF9leCB7Ci0JdTMyICBMZW5ndGg7Ci0JdTggTWFjQWRkcmVzc1tFVEhfQUxFTl07Ci0JdTE2IHJlc2VydmVkOwotCXN0cnVjdCBjZmc4MDIxMV9zc2lkIFNzaWQ7Ci0JdTMyICBQcml2YWN5OwotCWxvbmcgIFJzc2k7LyogaW4gZEJNLCByYXcgZGF0YSAsIGdldCBmcm9tIFBIWSkgKi8KLQl1MTYgYmVhY29uX2ludGVydmFsOwotCXUxNiBjYXBhYmlsaXR5OwotCXU2NCB0c2Y7Ci0JdTMyIEFUSU1XaW5kb3c7ICAgICAgICAgLyogIHVuaXRzIGFyZSBLdXNlYyAqLwotCXUzMiBEU0NvbmZpZzsgICAgICAgICAgIC8qICBGcmVxdWVuY3ksIHVuaXRzIGFyZSBrSHogKi8KLQllbnVtIG5sODAyMTFfaWZ0eXBlIGlmbW9kZTsKLQl1bnNpZ25lZCBjaGFyIFN1cHBvcnRlZFJhdGVzW05ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWF07Ci0JdTggU2lnbmFsU3RyZW5ndGg7LyogaW4gcGVyY2VudGFnZSAqLwotCXU4IFNpZ25hbFF1YWxpdHk7LyogaW4gcGVyY2VudGFnZSAqLwotCXUzMiAgSUVMZW5ndGg7Ci0JdTggIElFc1tNQVhfSUVfU1pdOyAvKiB0aW1lc3RhbXAsIGJlYWNvbiBpbnRlcnZhbCwgYW5kIGNhcGFiaWxpdHkgaW5mbyovCi19IF9fcGFja2VkOwotCi1zdGF0aWMgaW5saW5lIHVpbnQgZ2V0X3dsYW5fYnNzaWRfZXhfc3ooc3RydWN0IHdsYW5fYnNzaWRfZXggKmJzcykKLXsKLQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCB3bGFuX2Jzc2lkX2V4KSAtIE1BWF9JRV9TWiArIGJzcy0+SUVMZW5ndGg7Ci19Ci0KLXN0cnVjdAl3bGFuX25ldHdvcmsgewotCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKLQlpbnQJbmV0d29ya190eXBlOwkvKiByZWZlciB0byBpZWVlODAyMTEuaCBmb3IgMTFBL0IvRyAqLwotCS8qICBzZXQgdG8gZml4ZWQgd2hlbiBub3QgdG8gYmUgcmVtb3ZlZCBhcyBzaXRlLXN1cnZleWluZyAqLwotCWludAlmaXhlZDsKLQl1bnNpZ25lZCBsb25nCWxhc3Rfc2Nhbm5lZDsgLyogdGltZXN0YW1wIGZvciB0aGUgbmV0d29yayAqLwotCWludAlqb2luX3JlczsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leAluZXR3b3JrOyAvKiBtdXN0IGJlIHRoZSBsYXN0IGl0ZW0gKi8KLQlzdHJ1Y3Qgd2xhbl9iY25faW5mbwlCY25JbmZvOwotfTsKLQotZW51bSBWUlRMX0NBUlJJRVJfU0VOU0UgewotCURJU0FCTEVfVkNTLAotCUVOQUJMRV9WQ1MsCi0JQVVUT19WQ1MKLX07Ci0KLWVudW0gVkNTX1RZUEUgewotCU5PTkVfVkNTLAotCVJUU19DVFMsCi0JQ1RTX1RPX1NFTEYKLX07Ci0KLS8qIGpvaG4gKi8KLSNkZWZpbmUgTlVNX1BSRV9BVVRIX0tFWSAxNgotI2RlZmluZSBOVU1fUE1LSURfQ0FDSEUgTlVNX1BSRV9BVVRIX0tFWQotCi0jZW5kaWYgLyogaWZuZGVmIFdMQU5fQlNTREVGX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUveG1pdF9vc2RlcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3htaXRfb3NkZXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJlMDRjNDguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3htaXRfb3NkZXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1hNSVRfT1NERVBfSF8KLSNkZWZpbmUgX19YTUlUX09TREVQX0hfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0KLQotI2RlZmluZSBOUl9YTUlURlJBTUUJMjU2Ci0KLWludCBydHdfeG1pdDIzYV9lbnRyeTIzYShzdHJ1Y3Qgc2tfYnVmZiAqcGt0LCBzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldik7Ci0KLXZvaWQgcnR3X29zX3htaXRfc2NoZWR1bGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLWludCBydHdfb3NfeG1pdF9yZXNvdXJjZV9hbGxvYzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICAgIHN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYsIHUzMiBhbGxvY19zeik7Ci12b2lkIHJ0d19vc194bWl0X3Jlc291cmNlX2ZyZWUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgICBzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmKTsKLQotdm9pZCBydHdfb3NfcGt0X2NvbXBsZXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpwa3QpOwotdm9pZCBydHdfb3NfeG1pdF9jb21wbGV0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhmcmFtZSk7Ci1pbnQgbmV0ZGV2X29wZW4yM2Eoc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXYpOwotCi0jZW5kaWYgLyogX19YTUlUX09TREVQX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC9pb2N0bF9jZmc4MDIxMS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvaW9jdGxfY2ZnODAyMTEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBiYTM3Ny4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC9pb2N0bF9jZmc4MDIxMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEyIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgIF9JT0NUTF9DRkc4MDIxMV9DXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPHhtaXRfb3NkZXAuaD4KLQotI2luY2x1ZGUgImlvY3RsX2NmZzgwMjExLmgiCi0KLSNkZWZpbmUgUlRXX01BWF9NR01UX1RYX0NOVCA4Ci0KLSNkZWZpbmUgUlRXX01BWF9SRU1BSU5fT05fQ0hBTk5FTF9EVVJBVElPTiA2NTUzNQkvKiBtcyAqLwotI2RlZmluZSBSVFdfTUFYX05VTV9QTUtJRFMgNAotCi1zdGF0aWMgY29uc3QgdTMyIHJ0d19jaXBoZXJfc3VpdGVzW10gPSB7Ci0JV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAsCi0JV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0LAotCVdMQU5fQ0lQSEVSX1NVSVRFX1RLSVAsCi0JV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUCwKLX07Ci0KLSNkZWZpbmUgUkFURVRBQl9FTlQoX3JhdGUsIF9yYXRlaWQsIF9mbGFncykgewkJCVwKLQkuYml0cmF0ZQk9IChfcmF0ZSksCQkJCVwKLQkuaHdfdmFsdWUJPSAoX3JhdGVpZCksCQkJCVwKLQkuZmxhZ3MJCT0gKF9mbGFncyksCQkJCVwKLX0KLQotI2RlZmluZSBDSEFOMkcoX2NoYW5uZWwsIF9mcmVxLCBfZmxhZ3MpIHsJCQlcCi0JLmJhbmQJCQk9IE5MODAyMTFfQkFORF8yR0haLAkJXAotCS5jZW50ZXJfZnJlcQkJPSAoX2ZyZXEpLAkJCVwKLQkuaHdfdmFsdWUJCT0gKF9jaGFubmVsKSwJCQlcCi0JLmZsYWdzCQkJPSAoX2ZsYWdzKSwJCQlcCi0JLm1heF9hbnRlbm5hX2dhaW4JPSAwLAkJCQlcCi0JLm1heF9wb3dlcgkJPSAzMCwJCQkJXAotfQotCi0jZGVmaW5lIENIQU41RyhfY2hhbm5lbCwgX2ZsYWdzKSB7CQkJCVwKLQkuYmFuZAkJCT0gTkw4MDIxMV9CQU5EXzVHSFosCQlcCi0JLmNlbnRlcl9mcmVxCQk9IDUwMDAgKyAoNSAqIChfY2hhbm5lbCkpLAlcCi0JLmh3X3ZhbHVlCQk9IChfY2hhbm5lbCksCQkJXAotCS5mbGFncwkJCT0gKF9mbGFncyksCQkJXAotCS5tYXhfYW50ZW5uYV9nYWluCT0gMCwJCQkJXAotCS5tYXhfcG93ZXIJCT0gMzAsCQkJCVwKLX0KLQotc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfcmF0ZSBydHdfcmF0ZXNbXSA9IHsKLQlSQVRFVEFCX0VOVCgxMCwgMHgxLCAwKSwKLQlSQVRFVEFCX0VOVCgyMCwgMHgyLCAwKSwKLQlSQVRFVEFCX0VOVCg1NSwgMHg0LCAwKSwKLQlSQVRFVEFCX0VOVCgxMTAsIDB4OCwgMCksCi0JUkFURVRBQl9FTlQoNjAsIDB4MTAsIDApLAotCVJBVEVUQUJfRU5UKDkwLCAweDIwLCAwKSwKLQlSQVRFVEFCX0VOVCgxMjAsIDB4NDAsIDApLAotCVJBVEVUQUJfRU5UKDE4MCwgMHg4MCwgMCksCi0JUkFURVRBQl9FTlQoMjQwLCAweDEwMCwgMCksCi0JUkFURVRBQl9FTlQoMzYwLCAweDIwMCwgMCksCi0JUkFURVRBQl9FTlQoNDgwLCAweDQwMCwgMCksCi0JUkFURVRBQl9FTlQoNTQwLCAweDgwMCwgMCksCi19OwotCi0jZGVmaW5lIHJ0d19hX3JhdGVzCQkocnR3X3JhdGVzICsgNCkKLSNkZWZpbmUgUlRXX0FfUkFURVNfTlVNCTgKLSNkZWZpbmUgcnR3X2dfcmF0ZXMJCShydHdfcmF0ZXMgKyAwKQotI2RlZmluZSBSVFdfR19SQVRFU19OVU0JMTIKLQotI2RlZmluZSBSVFdfMkdfQ0hBTk5FTFNfTlVNIDE0Ci0jZGVmaW5lIFJUV181R19DSEFOTkVMU19OVU0gMzcKLQotc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCBydHdfMmdoel9jaGFubmVsc1tdID0gewotCUNIQU4yRygxLCAyNDEyLCAwKSwKLQlDSEFOMkcoMiwgMjQxNywgMCksCi0JQ0hBTjJHKDMsIDI0MjIsIDApLAotCUNIQU4yRyg0LCAyNDI3LCAwKSwKLQlDSEFOMkcoNSwgMjQzMiwgMCksCi0JQ0hBTjJHKDYsIDI0MzcsIDApLAotCUNIQU4yRyg3LCAyNDQyLCAwKSwKLQlDSEFOMkcoOCwgMjQ0NywgMCksCi0JQ0hBTjJHKDksIDI0NTIsIDApLAotCUNIQU4yRygxMCwgMjQ1NywgMCksCi0JQ0hBTjJHKDExLCAyNDYyLCAwKSwKLQlDSEFOMkcoMTIsIDI0NjcsIDApLAotCUNIQU4yRygxMywgMjQ3MiwgMCksCi0JQ0hBTjJHKDE0LCAyNDg0LCAwKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgcnR3XzVnaHpfYV9jaGFubmVsc1tdID0gewotCUNIQU41RygzNCwgMCksIENIQU41RygzNiwgMCksCi0JQ0hBTjVHKDM4LCAwKSwgQ0hBTjVHKDQwLCAwKSwKLQlDSEFONUcoNDIsIDApLCBDSEFONUcoNDQsIDApLAotCUNIQU41Ryg0NiwgMCksIENIQU41Ryg0OCwgMCksCi0JQ0hBTjVHKDUyLCAwKSwgQ0hBTjVHKDU2LCAwKSwKLQlDSEFONUcoNjAsIDApLCBDSEFONUcoNjQsIDApLAotCUNIQU41RygxMDAsIDApLCBDSEFONUcoMTA0LCAwKSwKLQlDSEFONUcoMTA4LCAwKSwgQ0hBTjVHKDExMiwgMCksCi0JQ0hBTjVHKDExNiwgMCksIENIQU41RygxMjAsIDApLAotCUNIQU41RygxMjQsIDApLCBDSEFONUcoMTI4LCAwKSwKLQlDSEFONUcoMTMyLCAwKSwgQ0hBTjVHKDEzNiwgMCksCi0JQ0hBTjVHKDE0MCwgMCksIENIQU41RygxNDksIDApLAotCUNIQU41RygxNTMsIDApLCBDSEFONUcoMTU3LCAwKSwKLQlDSEFONUcoMTYxLCAwKSwgQ0hBTjVHKDE2NSwgMCksCi0JQ0hBTjVHKDE4NCwgMCksIENIQU41RygxODgsIDApLAotCUNIQU41RygxOTIsIDApLCBDSEFONUcoMTk2LCAwKSwKLQlDSEFONUcoMjAwLCAwKSwgQ0hBTjVHKDIwNCwgMCksCi0JQ0hBTjVHKDIwOCwgMCksIENIQU41RygyMTIsIDApLAotCUNIQU41RygyMTYsIDApLAotfTsKLQotc3RhdGljIHZvaWQgcnR3XzJnX2NoYW5uZWxzX2luaXQoc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVscykKLXsKLQltZW1jcHkoKHZvaWQgKiljaGFubmVscywgKHZvaWQgKilydHdfMmdoel9jaGFubmVscywKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCkgKiBSVFdfMkdfQ0hBTk5FTFNfTlVNKTsKLX0KLQotc3RhdGljIHZvaWQgcnR3XzVnX2NoYW5uZWxzX2luaXQoc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVscykKLXsKLQltZW1jcHkoKHZvaWQgKiljaGFubmVscywgKHZvaWQgKilydHdfNWdoel9hX2NoYW5uZWxzLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jaGFubmVsKSAqIFJUV181R19DSEFOTkVMU19OVU0pOwotfQotCi1zdGF0aWMgdm9pZCBydHdfMmdfcmF0ZXNfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnJhdGVzKQotewotCW1lbWNweShyYXRlcywgcnR3X2dfcmF0ZXMsCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3JhdGUpICogUlRXX0dfUkFURVNfTlVNKTsKLX0KLQotc3RhdGljIHZvaWQgcnR3XzVnX3JhdGVzX2luaXQoc3RydWN0IGllZWU4MDIxMV9yYXRlICpyYXRlcykKLXsKLQltZW1jcHkocmF0ZXMsIHJ0d19hX3JhdGVzLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9yYXRlKSAqIFJUV19BX1JBVEVTX05VTSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICoKLXJ0d19zcHRfYmFuZF9hbGxvYyhlbnVtIG5sODAyMTFfYmFuZCBiYW5kKQotewotCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNwdF9iYW5kID0gTlVMTDsKLQlpbnQgbl9jaGFubmVscywgbl9iaXRyYXRlczsKLQotCWlmIChiYW5kID09IE5MODAyMTFfQkFORF8yR0haKSB7Ci0JCW5fY2hhbm5lbHMgPSBSVFdfMkdfQ0hBTk5FTFNfTlVNOwotCQluX2JpdHJhdGVzID0gUlRXX0dfUkFURVNfTlVNOwotCX0gZWxzZSBpZiAoYmFuZCA9PSBOTDgwMjExX0JBTkRfNUdIWikgewotCQluX2NoYW5uZWxzID0gUlRXXzVHX0NIQU5ORUxTX05VTTsKLQkJbl9iaXRyYXRlcyA9IFJUV19BX1JBVEVTX05VTTsKLQl9IGVsc2UgewotCQlnb3RvIGV4aXQ7Ci0JfQotCXNwdF9iYW5kID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCkgKwotCQkJICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCkgKiBuX2NoYW5uZWxzICsKLQkJCSAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3JhdGUpICogbl9iaXRyYXRlcywKLQkJCSAgIEdGUF9LRVJORUwpOwotCWlmICghc3B0X2JhbmQpCi0JCWdvdG8gZXhpdDsKLQotCXNwdF9iYW5kLT5jaGFubmVscyA9Ci0JCShzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKikoKCh1OCAqKSBzcHRfYmFuZCkgKwotCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QKLQkJCQkJCSAgICBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQpKTsKLQlzcHRfYmFuZC0+Yml0cmF0ZXMgPQotCQkoc3RydWN0IGllZWU4MDIxMV9yYXRlICopKCgodTggKikgc3B0X2JhbmQtPmNoYW5uZWxzKSArCi0JCQkJCSAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCkgKgotCQkJCQkgIG5fY2hhbm5lbHMpOwotCXNwdF9iYW5kLT5iYW5kID0gYmFuZDsKLQlzcHRfYmFuZC0+bl9jaGFubmVscyA9IG5fY2hhbm5lbHM7Ci0Jc3B0X2JhbmQtPm5fYml0cmF0ZXMgPSBuX2JpdHJhdGVzOwotCi0JaWYgKGJhbmQgPT0gTkw4MDIxMV9CQU5EXzJHSFopIHsKLQkJcnR3XzJnX2NoYW5uZWxzX2luaXQoc3B0X2JhbmQtPmNoYW5uZWxzKTsKLQkJcnR3XzJnX3JhdGVzX2luaXQoc3B0X2JhbmQtPmJpdHJhdGVzKTsKLQl9IGVsc2UgaWYgKGJhbmQgPT0gTkw4MDIxMV9CQU5EXzVHSFopIHsKLQkJcnR3XzVnX2NoYW5uZWxzX2luaXQoc3B0X2JhbmQtPmNoYW5uZWxzKTsKLQkJcnR3XzVnX3JhdGVzX2luaXQoc3B0X2JhbmQtPmJpdHJhdGVzKTsKLQl9Ci0KLQkvKiBzcHRfYmFuZC5odF9jYXAgKi8KLQotZXhpdDoKLQlyZXR1cm4gc3B0X2JhbmQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3R4cnhfc3R5cGVzCi1ydHdfY2ZnODAyMTFfZGVmYXVsdF9tZ210X3N0eXBlc1tOVU1fTkw4MDIxMV9JRlRZUEVTXSA9IHsKLQlbTkw4MDIxMV9JRlRZUEVfQURIT0NdID0gewotCQkudHggPSAweGZmZmYsCi0JCS5yeCA9IEJJVChJRUVFODAyMTFfU1RZUEVfQUNUSU9OID4+IDQpCi0JfSwKLQlbTkw4MDIxMV9JRlRZUEVfU1RBVElPTl0gPSB7Ci0JCS50eCA9IDB4ZmZmZiwKLQkJLnJ4ID0gQklUKElFRUU4MDIxMV9TVFlQRV9BQ1RJT04gPj4gNCkgfAotCQkgICAgICBCSVQoSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUSA+PiA0KQotCX0sCi0JW05MODAyMTFfSUZUWVBFX0FQXSA9IHsKLQkJLnR4ID0gMHhmZmZmLAotCQkucnggPSBCSVQoSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFUSA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVEgPj4gNCkgfAotCQkgICAgICBCSVQoSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUSA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfRElTQVNTT0MgPj4gNCkgfAotCQkgICAgICBCSVQoSUVFRTgwMjExX1NUWVBFX0FVVEggPj4gNCkgfAotCQkgICAgICBCSVQoSUVFRTgwMjExX1NUWVBFX0RFQVVUSCA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfQUNUSU9OID4+IDQpCi0JfSwKLQlbTkw4MDIxMV9JRlRZUEVfQVBfVkxBTl0gPSB7Ci0JCS8qIGNvcHkgQVAgKi8KLQkJLnR4ID0gMHhmZmZmLAotCQkucnggPSBCSVQoSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFUSA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVEgPj4gNCkgfAotCQkgICAgICBCSVQoSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUSA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfRElTQVNTT0MgPj4gNCkgfAotCQkgICAgICBCSVQoSUVFRTgwMjExX1NUWVBFX0FVVEggPj4gNCkgfAotCQkgICAgICBCSVQoSUVFRTgwMjExX1NUWVBFX0RFQVVUSCA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfQUNUSU9OID4+IDQpCi0JfSwKLQlbTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVF0gPSB7Ci0JCS50eCA9IDB4ZmZmZiwKLQkJLnJ4ID0gQklUKElFRUU4MDIxMV9TVFlQRV9BQ1RJT04gPj4gNCkgfAotCQkgICAgICBCSVQoSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUSA+PiA0KQotCX0sCi0JW05MODAyMTFfSUZUWVBFX1AyUF9HT10gPSB7Ci0JCS50eCA9IDB4ZmZmZiwKLQkJLnJ4ID0gQklUKElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVEgPj4gNCkgfAotCQkgICAgICBCSVQoSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVRID4+IDQpIHwKLQkJICAgICAgQklUKElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVEgPj4gNCkgfAotCQkgICAgICBCSVQoSUVFRTgwMjExX1NUWVBFX0RJU0FTU09DID4+IDQpIHwKLQkJICAgICAgQklUKElFRUU4MDIxMV9TVFlQRV9BVVRIID4+IDQpIHwKLQkJICAgICAgQklUKElFRUU4MDIxMV9TVFlQRV9ERUFVVEggPj4gNCkgfAotCQkgICAgICBCSVQoSUVFRTgwMjExX1NUWVBFX0FDVElPTiA+PiA0KQotCX0sCi19OwotCi1zdGF0aWMgaW50IHJ0d19jZmc4MDIxMV9pbmZvcm1fYnNzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmspCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpub3RpZnlfY2hhbm5lbDsKLQlzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3M7Ci0JdTE2IGNoYW5uZWw7Ci0JdTMyIGZyZXE7Ci0JdTggKm5vdGlmeV9pZTsKLQlzaXplX3Qgbm90aWZ5X2llbGVuOwotCXMzMiBub3RpZnlfc2lnbmFsOwotCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBwYWRhcHRlci0+cnR3X3dkZXY7Ci0Jc3RydWN0IHdpcGh5ICp3aXBoeSA9IHdkZXYtPndpcGh5OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQljaGFubmVsID0gcG5ldHdvcmstPm5ldHdvcmsuRFNDb25maWc7Ci0JaWYgKGNoYW5uZWwgPD0gUlRXX0NIX01BWF8yR19DSEFOTkVMKQotCQlmcmVxID0gaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGNoYW5uZWwsCi0JCQkJCQkgICAgICBOTDgwMjExX0JBTkRfMkdIWik7Ci0JZWxzZQotCQlmcmVxID0gaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGNoYW5uZWwsCi0JCQkJCQkgICAgICBOTDgwMjExX0JBTkRfNUdIWik7Ci0KLQlub3RpZnlfY2hhbm5lbCA9IGllZWU4MDIxMV9nZXRfY2hhbm5lbCh3aXBoeSwgZnJlcSk7Ci0KLQlub3RpZnlfaWUgPSBwbmV0d29yay0+bmV0d29yay5JRXM7Ci0Jbm90aWZ5X2llbGVuID0gcG5ldHdvcmstPm5ldHdvcmsuSUVMZW5ndGg7Ci0KLQkvKiBXZSd2ZSBzZXQgd2lwaHkncyBzaWduYWxfdHlwZSBhcyBDRkc4MDIxMV9TSUdOQUxfVFlQRV9NQk06Ci0JICogIHNpZ25hbCBzdHJlbmd0aCBpbiBtQm0gKDEwMCpkQm0pCi0JICovCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSAmJgotCSAgICBpc19zYW1lX25ldHdvcmsyM2EoJnBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yaywKLQkJCSAgICAmcG5ldHdvcmstPm5ldHdvcmspKSB7Ci0JCW5vdGlmeV9zaWduYWwgPSAxMDAgKiB0cmFuc2xhdGVfcGVyY2VudGFnZV90b19kYm0ocGFkYXB0ZXItPnJlY3Zwcml2LnNpZ25hbF9zdHJlbmd0aCk7CS8qIGRibSAqLwotCX0gZWxzZSB7Ci0JCW5vdGlmeV9zaWduYWwgPSAxMDAgKiB0cmFuc2xhdGVfcGVyY2VudGFnZV90b19kYm0oCi0JCQlwbmV0d29yay0+bmV0d29yay5TaWduYWxTdHJlbmd0aCk7CS8qIGRibSAqLwotCX0KLQotCWJzcyA9IGNmZzgwMjExX2luZm9ybV9ic3Mod2lwaHksIG5vdGlmeV9jaGFubmVsLAotCQkJCSAgQ0ZHODAyMTFfQlNTX0ZUWVBFX1VOS05PV04sCi0JCQkJICBwbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLAotCQkJCSAgcG5ldHdvcmstPm5ldHdvcmsudHNmLAotCQkJCSAgcG5ldHdvcmstPm5ldHdvcmsuY2FwYWJpbGl0eSwKLQkJCQkgIHBuZXR3b3JrLT5uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCwKLQkJCQkgIG5vdGlmeV9pZSwgbm90aWZ5X2llbGVuLAotCQkJCSAgbm90aWZ5X3NpZ25hbCwgR0ZQX0FUT01JQyk7Ci0KLQlpZiAodW5saWtlbHkoIWJzcykpIHsKLQkJREJHXzg3MjNBKCJydHdfY2ZnODAyMTFfaW5mb3JtX2JzcyBlcnJvclxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWNmZzgwMjExX3B1dF9ic3Mod2lwaHksIGJzcyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIHJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9jb25uZWN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpjdXJfbmV0d29yayA9ICZwbWxtZXByaXYtPmN1cl9uZXR3b3JrOwotCXN0cnVjdCB3aXJlbGVzc19kZXYgKnB3ZGV2ID0gcGFkYXB0ZXItPnJ0d193ZGV2OwotCi0JREJHXzg3MjNBKCIlcyhwYWRhcHRlciA9JXApXG4iLCBfX2Z1bmNfXywgcGFkYXB0ZXIpOwotCi0JaWYgKHB3ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgotCSAgICBwd2Rldi0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQpCi0JCXJldHVybjsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpCi0JCXJldHVybjsKLQotCWlmIChwYWRhcHRlci0+bWxtZXByaXYudG9fcm9hbWluZyA+IDApIHsKLQkJc3RydWN0IHdpcGh5ICp3aXBoeSA9IHB3ZGV2LT53aXBoeTsKLQkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpub3RpZnlfY2hhbm5lbDsKLQkJdTMyIGZyZXE7Ci0JCXUxNiBjaGFubmVsID0gY3VyX25ldHdvcmstPm5ldHdvcmsuRFNDb25maWc7Ci0KLQkJaWYgKGNoYW5uZWwgPD0gUlRXX0NIX01BWF8yR19DSEFOTkVMKQotCQkJZnJlcSA9Ci0JCQkgICAgaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGNoYW5uZWwsCi0JCQkJCQkJICAgTkw4MDIxMV9CQU5EXzJHSFopOwotCQllbHNlCi0JCQlmcmVxID0KLQkJCSAgICBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koY2hhbm5lbCwKLQkJCQkJCQkgICBOTDgwMjExX0JBTkRfNUdIWik7Ci0KLQkJbm90aWZ5X2NoYW5uZWwgPSBpZWVlODAyMTFfZ2V0X2NoYW5uZWwod2lwaHksIGZyZXEpOwotCi0JCURCR184NzIzQSgiJXMgY2FsbCBjZmc4MDIxMV9yb2FtZWRcbiIsIF9fZnVuY19fKTsKLQkJY2ZnODAyMTFfcm9hbWVkKHBhZGFwdGVyLT5wbmV0ZGV2LCBub3RpZnlfY2hhbm5lbCwKLQkJCQljdXJfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLAotCQkJCXBtbG1lcHJpdi0+YXNzb2NfcmVxICsKLQkJCQlzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpICsgMiwKLQkJCQlwbWxtZXByaXYtPmFzc29jX3JlcV9sZW4gLQotCQkJCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgLSAyLAotCQkJCXBtbG1lcHJpdi0+YXNzb2NfcnNwICsKLQkJCQlzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpICsgNiwKLQkJCQlwbWxtZXByaXYtPmFzc29jX3JzcF9sZW4gLQotCQkJCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgLSA2LAotCQkJCUdGUF9BVE9NSUMpOwotCX0gZWxzZSB7Ci0JCWNmZzgwMjExX2Nvbm5lY3RfcmVzdWx0KHBhZGFwdGVyLT5wbmV0ZGV2LAotCQkJCQljdXJfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLAotCQkJCQlwbWxtZXByaXYtPmFzc29jX3JlcSArCi0JCQkJCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyAyLAotCQkJCQlwbWxtZXByaXYtPmFzc29jX3JlcV9sZW4gLQotCQkJCQlzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpIC0gMiwKLQkJCQkJcG1sbWVwcml2LT5hc3NvY19yc3AgKwotCQkJCQlzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpICsgNiwKLQkJCQkJcG1sbWVwcml2LT5hc3NvY19yc3BfbGVuIC0KLQkJCQkJc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSAtIDYsCi0JCQkJCVdMQU5fU1RBVFVTX1NVQ0NFU1MsIEdGUF9BVE9NSUMpOwotCX0KLX0KLQotdm9pZCBydHdfY2ZnODAyMTFfaW5kaWNhdGVfZGlzY29ubmVjdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHdpcmVsZXNzX2RldiAqcHdkZXYgPSBwYWRhcHRlci0+cnR3X3dkZXY7Ci0KLQlEQkdfODcyM0EoIiVzKHBhZGFwdGVyID0lcClcbiIsIF9fZnVuY19fLCBwYWRhcHRlcik7Ci0KLQlpZiAocHdkZXYtPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICYmCi0JICAgIHB3ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCkKLQkJcmV0dXJuOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkKLQkJcmV0dXJuOwotCi0JaWYgKCFwYWRhcHRlci0+bWxtZXByaXYubm90X2luZGljX2Rpc2NvKSB7Ci0JCWlmIChjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIFdJRklfVU5ERVJfTElOS0lORykpIHsKLQkJCWNmZzgwMjExX2Nvbm5lY3RfcmVzdWx0KHBhZGFwdGVyLT5wbmV0ZGV2LCBOVUxMLCBOVUxMLAotCQkJCQkJMCwgTlVMTCwgMCwKLQkJCQkJCVdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkUsCi0JCQkJCQlHRlBfQVRPTUlDKTsKLQkJfSBlbHNlIHsKLQkJCWNmZzgwMjExX2Rpc2Nvbm5lY3RlZChwYWRhcHRlci0+cG5ldGRldiwgMCwgTlVMTCwKLQkJCQkJICAgICAgMCwgZmFsc2UsIEdGUF9BVE9NSUMpOwotCQl9Ci0JfQotfQotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi1zdGF0aWMgaW50IHNldF9wYWlyd2lzZV9rZXkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKQotewotCXN0cnVjdCBjbWRfb2JqICpwaDJjOwotCXN0cnVjdCBzZXRfc3Rha2V5X3Bhcm0gKnBzZXRzdGFrZXlfcGFyYTsKLQlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQotCXBoMmMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaiksIEdGUF9LRVJORUwpOwotCWlmIChwaDJjID09IE5VTEwpIHsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwc2V0c3Rha2V5X3BhcmEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2V0X3N0YWtleV9wYXJtKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHBzZXRzdGFrZXlfcGFyYSA9PSBOVUxMKSB7Ci0JCWtmcmVlKHBoMmMpOwotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHBzZXRzdGFrZXlfcGFyYSwgX1NldFN0YUtleV9DTURfKTsKLQotCXBzZXRzdGFrZXlfcGFyYS0+YWxnb3JpdGhtID0gcHN0YS0+ZG90MTE4MDIxWFByaXZhY3k7Ci0KLQlldGhlcl9hZGRyX2NvcHkocHNldHN0YWtleV9wYXJhLT5hZGRyLCBwc3RhLT5od2FkZHIpOwotCi0JbWVtY3B5KHBzZXRzdGFrZXlfcGFyYS0+a2V5LCAmcHN0YS0+ZG90MTE4MDIxeF9VbmNzdEtleSwgMTYpOwotCi0JcmVzID0gcnR3X2VucXVldWVfY21kMjNhKHBjbWRwcml2LCBwaDJjKTsKLQotZXhpdDoKLQlyZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgaW50IHNldF9ncm91cF9rZXkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IGtleV9wYXJhbXMgKnBhcm1zLAotCQkJIHUzMiBhbGcsIHU4IGtleWlkKQotewotCXN0cnVjdCBjbWRfb2JqICpwY21kOwotCXN0cnVjdCBzZXRrZXlfcGFybSAqcHNldGtleXBhcm07Ci0Jc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKLQlpbnQgcmVzID0gX1NVQ0NFU1M7Ci0KLQlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoa2V5aWQgPj0gNCkgewotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXBjbWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaiksIEdGUF9LRVJORUwpOwotCWlmICghcGNtZCkgewotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQlwc2V0a2V5cGFybSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXRrZXlfcGFybSksIEdGUF9LRVJORUwpOwotCWlmICghcHNldGtleXBhcm0pIHsKLQkJa2ZyZWUocGNtZCk7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcHNldGtleXBhcm0tPmtleWlkID0ga2V5aWQ7Ci0JaWYgKGlzX3dlcF9lbmMoYWxnKSkKLQkJcGFkYXB0ZXItPm1sbWVwcml2LmtleV9tYXNrIHw9IEJJVChwc2V0a2V5cGFybS0+a2V5aWQpOwotCi0JcHNldGtleXBhcm0tPmFsZ29yaXRobSA9IGFsZzsKLQotCXBzZXRrZXlwYXJtLT5zZXRfdHggPSAxOwotCi0JbWVtY3B5KCZwc2V0a2V5cGFybS0+a2V5LCBwYXJtcy0+a2V5LCBwYXJtcy0+a2V5X2xlbik7Ci0KLQlwY21kLT5jbWRjb2RlID0gX1NldEtleV9DTURfOwotCXBjbWQtPnBhcm1idWYgPSAodTggKikgcHNldGtleXBhcm07Ci0JcGNtZC0+Y21kc3ogPSBzaXplb2Yoc3RydWN0IHNldGtleV9wYXJtKTsKLQlwY21kLT5yc3AgPSBOVUxMOwotCXBjbWQtPnJzcHN6ID0gMDsKLQotCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZDIzYShwY21kcHJpdiwgcGNtZCk7Ci0KLWV4aXQ6Ci0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGludCBydHdfY2ZnODAyMTFfYXBfc2V0X2VuY3J5cHRpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTgga2V5X2luZGV4LAotCQkJCQkgIGludCBzZXRfdHgsIGNvbnN0IHU4ICpzdGFfYWRkciwKLQkJCQkJICBzdHJ1Y3Qga2V5X3BhcmFtcyAqa2V5cGFybXMpCi17Ci0JaW50IGtleV9sZW47Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhID0gTlVMTCwgKnBiY21jX3N0YSA9IE5VTEw7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCi0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotCi0JaWYgKCFpc19icm9hZGNhc3RfZXRoZXJfYWRkcihzdGFfYWRkcikpIHsKLQkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgc3RhX2FkZHIpOwotCQlpZiAoIXBzdGEpIHsKLQkJCS8qIHJldCA9IC1FSU5WQUw7ICovCi0JCQlEQkdfODcyM0EoInJ0d19zZXRfZW5jcnlwdGlvbigpLCBzdGEgaGFzIGFscmVhZHkgIgotCQkJCSAgImJlZW4gcmVtb3ZlZCBvciBuZXZlciBiZWVuIGFkZGVkXG4iKTsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCX0KLQotCWtleV9sZW4gPSBrZXlwYXJtcy0+a2V5X2xlbjsKLQotCWlmICghcHN0YSAmJiAoa2V5cGFybXMtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCB8fAotCQkgICAgICBrZXlwYXJtcy0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkpIHsKLQkJREJHXzg3MjNBKCJyODcxeF9zZXRfZW5jcnlwdGlvbiwgY3J5cHQuYWxnID0gV0VQXG4iKTsKLQotCQlEQkdfODcyM0EoInI4NzF4X3NldF9lbmNyeXB0aW9uLCB3ZXBfa2V5X2lkeCA9JWQsIGxlbiA9JWRcbiIsCi0JCQkgIGtleV9pbmRleCwga2V5X2xlbik7Ci0KLQkJaWYgKHBzZWN1cml0eXByaXYtPmJXZXBEZWZhdWx0S2V5SWR4U2V0ID09IDApIHsKLQkJCS8qIHdlcCBkZWZhdWx0IGtleSBoYXMgbm90IGJlZW4gc2V0LCBzbyB1c2UKLQkJCSAgIHRoaXMga2V5IGluZGV4IGFzIGRlZmF1bHQga2V5LiAqLwotCi0JCQlwc2VjdXJpdHlwcml2LT5uZGlzZW5jcnlwdHN0YXR1cyA9Ci0JCQkJTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKLQkJCXBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gPSBrZXlwYXJtcy0+Y2lwaGVyOwotCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycFByaXZhY3kgPSBrZXlwYXJtcy0+Y2lwaGVyOwotCi0JCQlwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lLZXlJbmRleCA9IGtleV9pbmRleDsKLQkJfQotCi0JCW1lbWNweSgmcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlfaW5kZXhdLmtleSwKLQkJICAgICAgIGtleXBhcm1zLT5rZXksIGtleV9sZW4pOwotCi0JCXBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5X2luZGV4XS5rZXlsZW4gPSBrZXlfbGVuOwotCi0JCXNldF9ncm91cF9rZXkocGFkYXB0ZXIsIGtleXBhcm1zLCBrZXlwYXJtcy0+Y2lwaGVyLCBrZXlfaW5kZXgpOwotCi0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAoIXBzdGEpIHsJLyogIGdyb3VwIGtleSAqLwotCQlpZiAoc2V0X3R4ID09IDApIHsJLyogZ3JvdXAga2V5ICovCi0JCQlpZiAoa2V5cGFybXMtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCB8fAotCQkJICAgIGtleXBhcm1zLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KSB7Ci0JCQkJREJHXzg3MjNBKCIlcywgc2V0IGdyb3VwX2tleSwgV0VQXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJCQltZW1jcHkocHNlY3VyaXR5cHJpdi0+Ci0JCQkJICAgICAgIGRvdDExODAyMVhHcnBLZXlba2V5X2luZGV4XS5za2V5LAotCQkJCSAgICAgICBrZXlwYXJtcy0+a2V5LCBrZXlfbGVuKTsKLQotCQkJCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5ID0KLQkJCQkJa2V5cGFybXMtPmNpcGhlcjsKLQkJCX0gZWxzZSBpZiAoa2V5cGFybXMtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9US0lQKSB7Ci0JCQkJREJHXzg3MjNBKCIlcywgc2V0IGdyb3VwX2tleSwgVEtJUFxuIiwKLQkJCQkJICBfX2Z1bmNfXyk7Ci0KLQkJCQlwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeSA9Ci0JCQkJCVdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA7Ci0KLQkJCQltZW1jcHkocHNlY3VyaXR5cHJpdi0+Ci0JCQkJICAgICAgIGRvdDExODAyMVhHcnBLZXlba2V5X2luZGV4XS5za2V5LAotCQkJCSAgICAgICBrZXlwYXJtcy0+a2V5LAotCQkJCSAgICAgICAobWluKDE2LCBrZXlfbGVuKSkpOwotCi0JCQkJLyogc2V0IG1pYyBrZXkgKi8KLQkJCQltZW1jcHkocHNlY3VyaXR5cHJpdi0+Ci0JCQkJICAgICAgIGRvdDExODAyMVhHcnB0eG1pY2tleVtrZXlfaW5kZXhdLnNrZXksCi0JCQkJICAgICAgICZrZXlwYXJtcy0+a2V5WzE2XSwgOCk7Ci0JCQkJbWVtY3B5KHBzZWN1cml0eXByaXYtPgotCQkJCSAgICAgICBkb3QxMTgwMjFYR3JwcnhtaWNrZXlba2V5X2luZGV4XS5za2V5LAotCQkJCSAgICAgICAma2V5cGFybXMtPmtleVsyNF0sIDgpOwotCi0JCQkJcHNlY3VyaXR5cHJpdi0+YnVzZXRraXBrZXkgPSAxOwotCi0JCQl9IGVsc2UgaWYgKGtleXBhcm1zLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUCkgewotCQkJCQlEQkdfODcyM0EoIiVzLCBzZXQgZ3JvdXBfa2V5LCBDQ01QXG4iLAotCQkJCQkgIF9fZnVuY19fKTsKLQotCQkJCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5ID0KLQkJCQkJV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDsKLQotCQkJCW1lbWNweShwc2VjdXJpdHlwcml2LT4KLQkJCQkgICAgICAgZG90MTE4MDIxWEdycEtleVtrZXlfaW5kZXhdLnNrZXksCi0JCQkJICAgICAgIGtleXBhcm1zLT5rZXksCi0JCQkJICAgICAgIChtaW4oMTYsIGtleV9sZW4pKSk7Ci0JCQl9IGVsc2UgewotCQkJCURCR184NzIzQSgiJXMsIHNldCBncm91cF9rZXksIG5vbmVcbiIsCi0JCQkJCSAgX19mdW5jX18pOwotCi0JCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycFByaXZhY3kgPSAwOwotCQkJfQotCi0JCQlwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwS2V5aWQgPSBrZXlfaW5kZXg7Ci0KLQkJCXBzZWN1cml0eXByaXYtPmJpbnN0YWxsR3Jwa2V5ID0gMTsKLQotCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSA9Ci0JCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycFByaXZhY3k7Ci0KLQkJCXNldF9ncm91cF9rZXkocGFkYXB0ZXIsIGtleXBhcm1zLAotCQkJCSAgICAgIHBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5LAotCQkJCSAgICAgIGtleV9pbmRleCk7Ci0KLQkJCXBiY21jX3N0YSA9IHJ0d19nZXRfYmNtY19zdGFpbmZvMjNhKHBhZGFwdGVyKTsKLQkJCWlmIChwYmNtY19zdGEpIHsKLQkJCQlwYmNtY19zdGEtPmllZWU4MDIxeF9ibG9ja2VkID0gZmFsc2U7Ci0JCQkJLyogcnggd2lsbCB1c2UgYm1jX3N0YSdzIGRvdDExODAyMVhQcml2YWN5ICovCi0JCQkJcGJjbWNfc3RhLT5kb3QxMTgwMjFYUHJpdmFjeSA9Ci0JCQkJCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5OwotCi0JCQl9Ci0KLQkJfQotCi0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAocHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSA9PSBkb3QxMUF1dGhBbGdydGhtXzgwMjFYICYmIHBzdGEpIHsKLQkJLyogIHBzay84MDJfMXggKi8KLQkJaWYgKHNldF90eCA9PSAxKSB7Ci0JCQkvKiBwYWlyd2lzZSBrZXkgKi8KLQkJCW1lbWNweShwc3RhLT5kb3QxMTgwMjF4X1VuY3N0S2V5LnNrZXksCi0JCQkgICAgICAga2V5cGFybXMtPmtleSwgKG1pbigxNiwga2V5X2xlbikpKTsKLQotCQkJaWYgKGtleXBhcm1zLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgfHwKLQkJCSAgICBrZXlwYXJtcy0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkgewotCQkJCURCR184NzIzQSgiJXMsIHNldCBwYWlyd2lzZSBrZXksIFdFUFxuIiwKLQkJCQkJICBfX2Z1bmNfXyk7Ci0KLQkJCQlwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeSA9Ci0JCQkJCWtleXBhcm1zLT5jaXBoZXI7Ci0JCQl9IGVsc2UgaWYgKGtleXBhcm1zLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCkgewotCQkJCURCR184NzIzQSgiJXMsIHNldCBwYWlyd2lzZSBrZXksIFRLSVBcbiIsCi0JCQkJCSAgX19mdW5jX18pOwotCi0JCQkJcHN0YS0+ZG90MTE4MDIxWFByaXZhY3kgPQotCQkJCQlXTEFOX0NJUEhFUl9TVUlURV9US0lQOwotCi0JCQkJLyogc2V0IG1pYyBrZXkgKi8KLQkJCQltZW1jcHkocHN0YS0+ZG90MTF0a2lwdHhtaWNrZXkuc2tleSwKLQkJCQkgICAgICAgJmtleXBhcm1zLT5rZXlbMTZdLCA4KTsKLQkJCQltZW1jcHkocHN0YS0+ZG90MTF0a2lwcnhtaWNrZXkuc2tleSwKLQkJCQkgICAgICAgJmtleXBhcm1zLT5rZXlbMjRdLCA4KTsKLQotCQkJCXBzZWN1cml0eXByaXYtPmJ1c2V0a2lwa2V5ID0gMTsKLQotCQkJfSBlbHNlIGlmIChrZXlwYXJtcy0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVApIHsKLQkJCQlEQkdfODcyM0EoIiVzLCBzZXQgcGFpcndpc2Uga2V5LCBDQ01QXG4iLAotCQkJCQkgIF9fZnVuY19fKTsKLQotCQkJCXBzdGEtPmRvdDExODAyMVhQcml2YWN5ID0KLQkJCQkJV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDsKLQkJCX0gZWxzZSB7Ci0JCQkJREJHXzg3MjNBKCIlcywgc2V0IHBhaXJ3aXNlIGtleSwgbm9uZVxuIiwKLQkJCQkJICBfX2Z1bmNfXyk7Ci0KLQkJCQlwc3RhLT5kb3QxMTgwMjFYUHJpdmFjeSA9IDA7Ci0JCQl9Ci0KLQkJCXNldF9wYWlyd2lzZV9rZXkocGFkYXB0ZXIsIHBzdGEpOwotCi0JCQlwc3RhLT5pZWVlODAyMXhfYmxvY2tlZCA9IGZhbHNlOwotCi0JCQlwc3RhLT5icGFpcndpc2Vfa2V5X2luc3RhbGxlZCA9IHRydWU7Ci0JCX0gZWxzZSB7CS8qIGdyb3VwIGtleT8/PyAqLwotCQkJaWYgKGtleXBhcm1zLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgfHwKLQkJCSAgICBrZXlwYXJtcy0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkgewotCQkJCW1lbWNweShwc2VjdXJpdHlwcml2LT4KLQkJCQkgICAgICAgZG90MTE4MDIxWEdycEtleVtrZXlfaW5kZXhdLnNrZXksCi0JCQkJICAgICAgIGtleXBhcm1zLT5rZXksIGtleV9sZW4pOwotCi0JCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycFByaXZhY3kgPQotCQkJCQlrZXlwYXJtcy0+Y2lwaGVyOwotCQkJfSBlbHNlIGlmIChrZXlwYXJtcy0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVApIHsKLQkJCQlwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeSA9Ci0JCQkJCVdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA7Ci0KLQkJCQltZW1jcHkocHNlY3VyaXR5cHJpdi0+Ci0JCQkJICAgICAgIGRvdDExODAyMVhHcnBLZXlba2V5X2luZGV4XS5za2V5LAotCQkJCSAgICAgICBrZXlwYXJtcy0+a2V5LAotCQkJCSAgICAgICAobWluKDE2LCBrZXlfbGVuKSkpOwotCi0JCQkJLyogc2V0IG1pYyBrZXkgKi8KLQkJCQltZW1jcHkocHNlY3VyaXR5cHJpdi0+Ci0JCQkJICAgICAgIGRvdDExODAyMVhHcnB0eG1pY2tleVtrZXlfaW5kZXhdLnNrZXksCi0JCQkJICAgICAgICZrZXlwYXJtcy0+a2V5WzE2XSwgOCk7Ci0JCQkJbWVtY3B5KHBzZWN1cml0eXByaXYtPgotCQkJCSAgICAgICBkb3QxMTgwMjFYR3JwcnhtaWNrZXlba2V5X2luZGV4XS5za2V5LAotCQkJCSAgICAgICAma2V5cGFybXMtPmtleVsyNF0sIDgpOwotCi0JCQkJcHNlY3VyaXR5cHJpdi0+YnVzZXRraXBrZXkgPSAxOwotCQkJfSBlbHNlIGlmIChrZXlwYXJtcy0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVApIHsKLQkJCQlwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeSA9Ci0JCQkJCVdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA7Ci0KLQkJCQltZW1jcHkocHNlY3VyaXR5cHJpdi0+Ci0JCQkJICAgICAgIGRvdDExODAyMVhHcnBLZXlba2V5X2luZGV4XS5za2V5LAotCQkJCSAgICAgICBrZXlwYXJtcy0+a2V5LAotCQkJCSAgICAgICAobWluKDE2LCBrZXlfbGVuKSkpOwotCQkJfSBlbHNlIHsKLQkJCQlwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeSA9IDA7Ci0JCQl9Ci0KLQkJCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlpZCA9IGtleV9pbmRleDsKLQotCQkJcHNlY3VyaXR5cHJpdi0+Ymluc3RhbGxHcnBrZXkgPSAxOwotCi0JCQlwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtID0KLQkJCQlwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeTsKLQotCQkJc2V0X2dyb3VwX2tleShwYWRhcHRlciwga2V5cGFybXMsCi0JCQkJICAgICAgcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycFByaXZhY3ksCi0JCQkJICAgICAga2V5X2luZGV4KTsKLQotCQkJcGJjbWNfc3RhID0gcnR3X2dldF9iY21jX3N0YWluZm8yM2EocGFkYXB0ZXIpOwotCQkJaWYgKHBiY21jX3N0YSkgewotCQkJCS8qIHJ4IHdpbGwgdXNlIGJtY19zdGEncwotCQkJCSAgIGRvdDExODAyMVhQcml2YWN5ICovCi0JCQkJcGJjbWNfc3RhLT5pZWVlODAyMXhfYmxvY2tlZCA9IGZhbHNlOwotCQkJCXBiY21jX3N0YS0+ZG90MTE4MDIxWFByaXZhY3kgPQotCQkJCQlwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeTsKLQkJCX0KLQkJfQotCX0KLQotZXhpdDoKLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgcnR3X2NmZzgwMjExX3NldF9lbmNyeXB0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGtleV9pbmRleCwKLQkJCQkgICAgICAgaW50IHNldF90eCwgY29uc3QgdTggKnN0YV9hZGRyLAotCQkJCSAgICAgICBzdHJ1Y3Qga2V5X3BhcmFtcyAqa2V5cGFybXMpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IGtleV9sZW47Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCi0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotCi0Ja2V5X2xlbiA9IGtleXBhcm1zLT5rZXlfbGVuOwotCi0JaWYgKGtleXBhcm1zLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgfHwKLQkgICAga2V5cGFybXMtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX29zX2MsIF9kcnZfZXJyXywKLQkJCSAid3BhX3NldF9lbmNyeXB0aW9uLCBjcnlwdC5hbGcgPSBXRVBcbiIpOwotCQlEQkdfODcyM0EoIndwYV9zZXRfZW5jcnlwdGlvbiwgY3J5cHQuYWxnID0gV0VQXG4iKTsKLQotCQlpZiAocHNlY3VyaXR5cHJpdi0+YldlcERlZmF1bHRLZXlJZHhTZXQgPT0gMCkgewotCQkJLyogd2VwIGRlZmF1bHQga2V5IGhhcyBub3QgYmVlbiBzZXQsIHNvIHVzZSB0aGlzCi0JCQkgICBrZXkgaW5kZXggYXMgZGVmYXVsdCBrZXkuICovCi0KLQkJCXBzZWN1cml0eXByaXYtPm5kaXNlbmNyeXB0c3RhdHVzID0KLQkJCQlOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOwotCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSA9IGtleXBhcm1zLT5jaXBoZXI7Ci0JCQlwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeSA9IGtleXBhcm1zLT5jaXBoZXI7Ci0KLQkJCXBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUtleUluZGV4ID0ga2V5X2luZGV4OwotCQl9Ci0KLQkJbWVtY3B5KCZwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleV9pbmRleF0ua2V5LAotCQkgICAgICAga2V5cGFybXMtPmtleSwga2V5X2xlbik7Ci0KLQkJcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlfaW5kZXhdLmtleWxlbiA9IGtleV9sZW47Ci0KLQkJcnR3X3NldF9rZXkyM2EocGFkYXB0ZXIsIHBzZWN1cml0eXByaXYsIGtleV9pbmRleCwgMCk7Ci0KLQkJZ290byBleGl0OwotCX0KLQotCWlmIChwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExQXV0aEFsZ3J0aG0gPT0KLQkgICAgZG90MTFBdXRoQWxncnRobV84MDIxWCkgewkvKiAgODAyXzF4ICovCi0JCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSwgKnBiY21jX3N0YTsKLQkJc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQotCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsCi0JCQkJICBXSUZJX1NUQVRJT05fU1RBVEUgfCBXSUZJX01QX1NUQVRFKSkgewotCQkJLyogc3RhIG1vZGUgKi8KLQkJCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIGdldF9ic3NpZChwbWxtZXByaXYpKTsKLQkJCWlmIChwc3RhID09IE5VTEwpIHsKLQkJCQlEQkdfODcyM0EoIiVzLCA6IE9idGFpbiBTdGFfaW5mbyBmYWlsXG4iLAotCQkJCQkgIF9fZnVuY19fKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogSmVmZjogZG9uJ3QgZGlzYWJsZSBpZWVlODAyMXhfYmxvY2tlZAotCQkJCSAgIHdoaWxlIGNsZWFyaW5nIGtleSAqLwotCQkJCWlmIChrZXlwYXJtcy0+Y2lwaGVyICE9IElXX0FVVEhfQ0lQSEVSX05PTkUgJiYKLQkJCQkgICAga2V5cGFybXMtPmNpcGhlciAhPSAwKQotCQkJCQlwc3RhLT5pZWVlODAyMXhfYmxvY2tlZCA9IGZhbHNlOwotCi0JCQkJaWYgKChwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNlbmNyeXB0c3RhdHVzID09Ci0JCQkJICAgICBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkKSB8fAotCQkJCSAgICAocGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5uZGlzZW5jcnlwdHN0YXR1cyA9PQotCQkJCSAgICAgTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZCkpIHsKLQkJCQkJcHN0YS0+ZG90MTE4MDIxWFByaXZhY3kgPQotCQkJCQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi4KLQkJCQkJCWRvdDExUHJpdmFjeUFsZ3J0aG07Ci0JCQkJfQotCi0JCQkJaWYgKHNldF90eCA9PSAxKSB7Ci0JCQkJCS8qIHBhaXJ3aXNlIGtleSAqLwotCQkJCQlEQkdfODcyM0EoIiVzLCA6IHNldF90eCA9PSAxXG4iLAotCQkJCQkJICBfX2Z1bmNfXyk7Ci0KLQkJCQkJbWVtY3B5KHBzdGEtPmRvdDExODAyMXhfVW5jc3RLZXkuc2tleSwKLQkJCQkJICAgICAgIGtleXBhcm1zLT5rZXksCi0JCQkJCSAgICAgICAobWluKDE2LCBrZXlfbGVuKSkpOwotCi0JCQkJCWlmIChrZXlwYXJtcy0+Y2lwaGVyID09Ci0JCQkJCSAgICBXTEFOX0NJUEhFUl9TVUlURV9US0lQKSB7Ci0JCQkJCQltZW1jcHkocHN0YS0+ZG90MTF0a2lwdHhtaWNrZXkuCi0JCQkJCQkgICAgICAgc2tleSwKLQkJCQkJCSAgICAgICAma2V5cGFybXMtPmtleVsxNl0sIDgpOwotCQkJCQkJbWVtY3B5KHBzdGEtPmRvdDExdGtpcHJ4bWlja2V5LgotCQkJCQkJICAgICAgIHNrZXksCi0JCQkJCQkgICAgICAgJmtleXBhcm1zLT5rZXlbMjRdLCA4KTsKLQotCQkJCQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi4KLQkJCQkJCQlidXNldGtpcGtleSA9IDA7Ci0JCQkJCX0KLQkJCQkJREJHXzg3MjNBKCIgfn5+fnNldCBzdGEga2V5OnVuaWNhc3RrZXlcbiIpOwotCi0JCQkJCXJ0d19zZXRzdGFrZXlfY21kMjNhKHBhZGFwdGVyLAotCQkJCQkJCSAgKHVuc2lnbmVkIGNoYXIgKilwc3RhLAotCQkJCQkJCSAgdHJ1ZSk7Ci0JCQkJfSBlbHNlIHsJLyogZ3JvdXAga2V5ICovCi0JCQkJCW1lbWNweShwYWRhcHRlci0+c2VjdXJpdHlwcml2LgotCQkJCQkgICAgICAgZG90MTE4MDIxWEdycEtleVtrZXlfaW5kZXhdLnNrZXksCi0JCQkJCSAgICAgICBrZXlwYXJtcy0+a2V5LAotCQkJCQkgICAgICAgKG1pbigxNiwga2V5X2xlbikpKTsKLQkJCQkJbWVtY3B5KHBhZGFwdGVyLT5zZWN1cml0eXByaXYuCi0JCQkJCSAgICAgICBkb3QxMTgwMjFYR3JwdHhtaWNrZXlba2V5X2luZGV4XS4KLQkJCQkJICAgICAgIHNrZXksICZrZXlwYXJtcy0+a2V5WzE2XSwgOCk7Ci0JCQkJCW1lbWNweShwYWRhcHRlci0+c2VjdXJpdHlwcml2LgotCQkJCQkgICAgICAgZG90MTE4MDIxWEdycHJ4bWlja2V5W2tleV9pbmRleF0uCi0JCQkJCSAgICAgICBza2V5LCAma2V5cGFybXMtPmtleVsyNF0sIDgpOwotCQkJCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmJpbnN0YWxsR3Jwa2V5ID0KLQkJCQkJCTE7Ci0JCQkJCURCR184NzIzQQotCQkJCQkgICAgKCIgfn5+fnNldCBzdGEga2V5Omdyb3Vwa2V5XG4iKTsKLQotCQkJCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LgotCQkJCQkgICAgZG90MTE4MDIxWEdycEtleWlkID0ga2V5X2luZGV4OwotCi0JCQkJCXJ0d19zZXRfa2V5MjNhKHBhZGFwdGVyLAotCQkJCQkJICAgICZwYWRhcHRlci0+c2VjdXJpdHlwcml2LAotCQkJCQkJICAgIGtleV9pbmRleCwgMSk7Ci0JCQkJfQotCQkJfQotCi0JCQlwYmNtY19zdGEgPSBydHdfZ2V0X2JjbWNfc3RhaW5mbzIzYShwYWRhcHRlcik7Ci0JCQlpZiAocGJjbWNfc3RhKSB7Ci0JCQkJLyogSmVmZjogZG9uJ3QgZGlzYWJsZSBpZWVlODAyMXhfYmxvY2tlZAotCQkJCSAgIHdoaWxlIGNsZWFyaW5nIGtleSAqLwotCQkJCWlmIChrZXlwYXJtcy0+Y2lwaGVyICE9IElXX0FVVEhfQ0lQSEVSX05PTkUgJiYKLQkJCQkgICAga2V5cGFybXMtPmNpcGhlciAhPSAwKQotCQkJCQlwYmNtY19zdGEtPmllZWU4MDIxeF9ibG9ja2VkID0gZmFsc2U7Ci0KLQkJCQlpZiAoKHBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2VuY3J5cHRzdGF0dXMgPT0KLQkJCQkgICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHx8Ci0JCQkJICAgIChwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNlbmNyeXB0c3RhdHVzID09Ci0JCQkJICAgICBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkgewotCQkJCQlwYmNtY19zdGEtPmRvdDExODAyMVhQcml2YWN5ID0KLQkJCQkJICAgIHBhZGFwdGVyLT5zZWN1cml0eXByaXYuCi0JCQkJCSAgICBkb3QxMVByaXZhY3lBbGdydGhtOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotZXhpdDoKLQotCURCR184NzIzQSgiJXMsIHJldCA9JWRcbiIsIF9fZnVuY19fLCByZXQpOwotCi0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X2FkZF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCi0JCQkJdTgga2V5X2luZGV4LCBib29sIHBhaXJ3aXNlLAotCQkJCWNvbnN0IHU4ICptYWNfYWRkciwgc3RydWN0IGtleV9wYXJhbXMgKnBhcmFtcykKLXsKLQlpbnQgc2V0X3R4LCByZXQgPSAwOwotCXN0cnVjdCB3aXJlbGVzc19kZXYgKnJ0d193ZGV2ID0gd2lwaHlfdG9fd2Rldih3aXBoeSk7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IHdpcGh5X3RvX2FkYXB0ZXIod2lwaHkpOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0JdTggc3RhX2FkZHJbRVRIX0FMRU5dOwotCi0JREJHXzg3MjNBKCIlcyglcyk6IGFkZGluZyBrZXkgZm9yICVwTVxuIiwgX19mdW5jX18sIG5kZXYtPm5hbWUsCi0JCSAgbWFjX2FkZHIpOwotCURCR184NzIzQSgiY2lwaGVyID0gMHgleFxuIiwgcGFyYW1zLT5jaXBoZXIpOwotCURCR184NzIzQSgia2V5X2xlbiA9IDB4JXhcbiIsIHBhcmFtcy0+a2V5X2xlbik7Ci0JREJHXzg3MjNBKCJzZXFfbGVuID0gMHgleFxuIiwgcGFyYW1zLT5zZXFfbGVuKTsKLQlEQkdfODcyM0EoImtleV9pbmRleCA9JWRcbiIsIGtleV9pbmRleCk7Ci0JREJHXzg3MjNBKCJwYWlyd2lzZSA9JWRcbiIsIHBhaXJ3aXNlKTsKLQotCXN3aXRjaCAocGFyYW1zLT5jaXBoZXIpIHsKLQljYXNlIElXX0FVVEhfQ0lQSEVSX05PTkU6Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKLQkJaWYgKHBhcmFtcy0+a2V5X2xlbiAhPSBXTEFOX0tFWV9MRU5fV0VQNDApIHsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKLQkJaWYgKHBhcmFtcy0+a2V5X2xlbiAhPSBXTEFOX0tFWV9MRU5fV0VQMTA0KSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBleGl0OwotCQl9Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVOT1RTVVBQOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKGtleV9pbmRleCA+PSBXRVBfS0VZUyB8fCBwYXJhbXMtPmtleV9sZW4gPCAwKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlldGhfYnJvYWRjYXN0X2FkZHIoc3RhX2FkZHIpOwotCi0JaWYgKCFtYWNfYWRkciB8fCBpc19icm9hZGNhc3RfZXRoZXJfYWRkcihtYWNfYWRkcikpCi0JCXNldF90eCA9IDA7CS8qIGZvciB3cGEvd3BhMiBncm91cCBrZXkgKi8KLQllbHNlCi0JCXNldF90eCA9IDE7CS8qIGZvciB3cGEvd3BhMiBwYWlyd2lzZSBrZXkgKi8KLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSkgewotCQlyZXQgPSBydHdfY2ZnODAyMTFfc2V0X2VuY3J5cHRpb24obmRldiwga2V5X2luZGV4LCBzZXRfdHgsCi0JCQkJCQkgIHN0YV9hZGRyLCBwYXJhbXMpOwotCX0gZWxzZSBpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpKSB7Ci0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0JCWlmIChtYWNfYWRkcikKLQkJCWV0aGVyX2FkZHJfY29weShzdGFfYWRkciwgbWFjX2FkZHIpOwotCi0JCXJldCA9IHJ0d19jZmc4MDIxMV9hcF9zZXRfZW5jcnlwdGlvbihuZGV2LCBrZXlfaW5kZXgsIHNldF90eCwKLQkJCQkJCSAgICAgc3RhX2FkZHIsIHBhcmFtcyk7Ci0jZW5kaWYKLQl9IGVsc2UgewotCQlEQkdfODcyM0EoImVycm9yISBmd19zdGF0ZSA9IDB4JXgsIGlmdHlwZSA9JWRcbiIsCi0JCQkgIHBtbG1lcHJpdi0+Zndfc3RhdGUsIHJ0d193ZGV2LT5pZnR5cGUpOwotCi0JfQotCi1leGl0OgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWNmZzgwMjExX3J0d19nZXRfa2V5KHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAotCQkgICAgIHU4IGtleV9pbmRleCwgYm9vbCBwYWlyd2lzZSwgY29uc3QgdTggKm1hY19hZGRyLAotCQkgICAgIHZvaWQgKmNvb2tpZSwKLQkJICAgICB2b2lkICgqY2FsbGJhY2spICh2b2lkICpjb29raWUsIHN0cnVjdCBrZXlfcGFyYW1zICopKQotewotCURCR184NzIzQSgiJXMoJXMpXG4iLCBfX2Z1bmNfXywgbmRldi0+bmFtZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X2RlbF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCi0JCQkJdTgga2V5X2luZGV4LCBib29sIHBhaXJ3aXNlLAotCQkJCWNvbnN0IHU4ICptYWNfYWRkcikKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYobmRldik7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQotCURCR184NzIzQSgiJXMoJXMpOiBrZXlfaW5kZXggPSVkXG4iLCBfX2Z1bmNfXywgbmRldi0+bmFtZSwga2V5X2luZGV4KTsKLQotCWlmIChrZXlfaW5kZXggPT0gcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5S2V5SW5kZXgpIHsKLQkJLyogY2xlYXIgdGhlIGZsYWcgb2Ygd2VwIGRlZmF1bHQga2V5IHNldC4gKi8KLQkJcHNlY3VyaXR5cHJpdi0+YldlcERlZmF1bHRLZXlJZHhTZXQgPSAwOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNmZzgwMjExX3J0d19zZXRfZGVmYXVsdF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHU4IGtleV9pbmRleCwKLQkJCQkJYm9vbCB1bmljYXN0LCBib29sIG11bHRpY2FzdCkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYobmRldik7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQotCURCR184NzIzQSgiJXMoJXMpOiBrZXlfaW5kZXggPSVkLCB1bmljYXN0ID0lZCwgbXVsdGljYXN0ID0lZC5cbiIsCi0JCSAgX19mdW5jX18sIG5kZXYtPm5hbWUsIGtleV9pbmRleCwgdW5pY2FzdCwgbXVsdGljYXN0KTsKLQotCWlmIChrZXlfaW5kZXggPCBOVU1fV0VQX0tFWVMgJiYKLQkgICAgKHBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgfHwKLQkgICAgIHBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KSkgewotCQkvKiBzZXQgd2VwIGRlZmF1bHQga2V5ICovCi0JCXBzZWN1cml0eXByaXYtPm5kaXNlbmNyeXB0c3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKLQotCQlwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lLZXlJbmRleCA9IGtleV9pbmRleDsKLQotCQlwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtID0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA7Ci0JCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5ID0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA7Ci0JCWlmIChwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleV9pbmRleF0ua2V5bGVuID09IDEzKSB7Ci0JCQlwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtID0KLQkJCQlXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ7Ci0JCQlwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeSA9Ci0JCQkJV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OwotCQl9Ci0KLQkJLyogc2V0IHRoZSBmbGFnIHRvIHJlcHJlc2VudCB0aGF0IHdlcCBkZWZhdWx0IGtleQotCQkgICBoYXMgYmVlbiBzZXQgKi8KLQkJcHNlY3VyaXR5cHJpdi0+YldlcERlZmF1bHRLZXlJZHhTZXQgPSAxOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdTE2IHJ0d19nZXRfY3VyX21heF9yYXRlKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlpbnQgaSA9IDA7Ci0JY29uc3QgdTggKnA7Ci0JdTE2IHJhdGUgPSAwLCBtYXhfcmF0ZSA9IDA7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJmFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVnaXN0cnlwcml2ID0gJmFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggICpwY3VyX2JzcyA9ICZwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcms7Ci0Jc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKnBodF9jYXBpZTsKLQl1OCByZl90eXBlID0gMDsKLQl1OCBid180ME1IeiA9IDAsIHNob3J0X0dJXzIwID0gMCwgc2hvcnRfR0lfNDAgPSAwOwotCXUxNiBtY3NfcmF0ZSA9IDA7Ci0KLQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9IVF9DQVBBQklMSVRZLAotCQkJICAgICBwY3VyX2Jzcy0+SUVzLCBwY3VyX2Jzcy0+SUVMZW5ndGgpOwotCWlmIChwICYmIHBbMV0gPiAwKSB7Ci0JCXBodF9jYXBpZSA9IChzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqKShwICsgMik7Ci0KLQkJbWVtY3B5KCZtY3NfcmF0ZSwgJnBodF9jYXBpZS0+bWNzLCAyKTsKLQotCQkvKiBid180ME1IeiA9IChwaHRfY2FwaWUtPmNhcF9pbmZvJgotCQkgICBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCkgPyAxOjA7ICovCi0JCS8qIGN1cl9id21vZCBpcyB1cGRhdGVkIGJ5IGJlYWNvbiwgcG1sbWVpbmZvIGlzCi0JCSAgIHVwZGF0ZWQgYnkgYXNzb2NpYXRpb24gcmVzcG9uc2UgKi8KLQkJYndfNDBNSHogPSAocG1sbWVleHQtPmN1cl9id21vZGUgJiYKLQkJCSAgICAocG1sbWVpbmZvLT5IVF9pbmZvLmh0X3BhcmFtICYKLQkJCSAgICAgSUVFRTgwMjExX0hUX1BBUkFNX0NIQU5fV0lEVEhfQU5ZKSkgPyAxOjA7Ci0KLQkJLyogc2hvcnRfR0kgPSAocGh0X2NhcGllLT5jYXBfaW5mbyAmIChJRUVFODAyMTFfSFRfQ0FQCi0JCSAgIF9TR0lfMjB8SUVFRTgwMjExX0hUX0NBUF9TR0lfNDApKSA/IDEgOiAwOyAqLwotCQlzaG9ydF9HSV8yMCA9IChwbWxtZWluZm8tPmh0X2NhcC5jYXBfaW5mbyAmCi0JCQkgICAgICAgY3B1X3RvX2xlMTYoSUVFRTgwMjExX0hUX0NBUF9TR0lfMjApKSA/IDE6MDsKLQkJc2hvcnRfR0lfNDAgPSAocG1sbWVpbmZvLT5odF9jYXAuY2FwX2luZm8gJgotCQkJICAgICAgIGNwdV90b19sZTE2KElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwKSkgPyAxOjA7Ci0KLQkJcmZfdHlwZSA9IHJ0bDg3MjNhX2dldF9yZl90eXBlKGFkYXB0ZXIpOwotCQltYXhfcmF0ZSA9IHJ0d19tY3NfcmF0ZTIzYShyZl90eXBlLCBid180ME1IeiAmCi0JCQkJCSAgIHByZWdpc3RyeXByaXYtPmNidzQwX2VuYWJsZSwKLQkJCQkJICAgc2hvcnRfR0lfMjAsIHNob3J0X0dJXzQwLAotCQkJCQkgICAmcG1sbWVpbmZvLT5odF9jYXAubWNzKTsKLQl9IGVsc2UgewotCQl3aGlsZSAocGN1cl9ic3MtPlN1cHBvcnRlZFJhdGVzW2ldICE9IDAgJiYKLQkJICAgICAgIHBjdXJfYnNzLT5TdXBwb3J0ZWRSYXRlc1tpXSAhPSAweEZGKSB7Ci0JCQlyYXRlID0gcGN1cl9ic3MtPlN1cHBvcnRlZFJhdGVzW2ldICYgMHg3RjsKLQkJCWlmIChyYXRlID4gbWF4X3JhdGUpCi0JCQkJbWF4X3JhdGUgPSByYXRlOwotCQkJaSsrOwotCQl9Ci0KLQkJbWF4X3JhdGUgPSBtYXhfcmF0ZSAqIDEwIC8gMjsKLQl9Ci0KLQlyZXR1cm4gbWF4X3JhdGU7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X2dldF9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAotCQkJCSAgICBjb25zdCB1OCAqbWFjLCBzdHJ1Y3Qgc3RhdGlvbl9pbmZvICpzaW5mbykKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gd2lwaHlfdG9fYWRhcHRlcih3aXBoeSk7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBOVUxMOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0KLQlzaW5mby0+ZmlsbGVkID0gMDsKLQotCWlmICghbWFjKSB7Ci0JCURCR184NzIzQSgiJXMoJXMpOiBtYWMgPT0lcFxuIiwgX19mdW5jX18sIG5kZXYtPm5hbWUsIG1hYyk7Ci0JCXJldCA9IC1FTk9FTlQ7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBtYWMpOwotCWlmIChwc3RhID09IE5VTEwpIHsKLQkJREJHXzg3MjNBKCIlcywgc3RhX2luZm8gaXMgbnVsbFxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRU5PRU5UOwotCQlnb3RvIGV4aXQ7Ci0JfQotCURCR184NzIzQSgiJXMoJXMpOiBtYWM9JXBNXG4iLCBfX2Z1bmNfXywgbmRldi0+bmFtZSwgbWFjKTsKLQotCS8qIGZvciBpbmZyYS4vUDJQQ2xpZW50IG1vZGUgKi8KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkgJiYKLQkgICAgY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKSB7Ci0JCXN0cnVjdCB3bGFuX25ldHdvcmsgKmN1cl9uZXR3b3JrID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcms7Ci0KLQkJaWYgKCFldGhlcl9hZGRyX2VxdWFsKG1hYywgY3VyX25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcykpIHsKLQkJCURCR184NzIzQSgiJXMsIG1pc21hdGNoIGJzc2lkPSVwTVxuIiwKLQkJCQkgIF9fZnVuY19fLCBjdXJfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzKTsKLQkJCXJldCA9IC1FTk9FTlQ7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCQlzaW5mby0+ZmlsbGVkIHw9IEJJVChOTDgwMjExX1NUQV9JTkZPX1NJR05BTCk7Ci0JCXNpbmZvLT5zaWduYWwgPSB0cmFuc2xhdGVfcGVyY2VudGFnZV90b19kYm0ocGFkYXB0ZXItPnJlY3Zwcml2LgotCQkJCQkJCSAgICBzaWduYWxfc3RyZW5ndGgpOwotCi0JCXNpbmZvLT5maWxsZWQgfD0gQklUKE5MODAyMTFfU1RBX0lORk9fVFhfQklUUkFURSk7Ci0JCXNpbmZvLT50eHJhdGUubGVnYWN5ID0gcnR3X2dldF9jdXJfbWF4X3JhdGUocGFkYXB0ZXIpOwotCi0JCXNpbmZvLT5maWxsZWQgfD0gQklUKE5MODAyMTFfU1RBX0lORk9fUlhfUEFDS0VUUyk7Ci0JCXNpbmZvLT5yeF9wYWNrZXRzID0gc3RhX3J4X2RhdGFfcGt0cyhwc3RhKTsKLQotCQlzaW5mby0+ZmlsbGVkIHw9IEJJVChOTDgwMjExX1NUQV9JTkZPX1RYX1BBQ0tFVFMpOwotCQlzaW5mby0+dHhfcGFja2V0cyA9IHBzdGEtPnN0YV9zdGF0cy50eF9wa3RzOwotCX0KLQotCS8qIGZvciBBZC1Ib2MvQVAgbW9kZSAqLwotCWlmICgoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfU1RBVEUpIHx8Ci0JICAgICBjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpIHx8Ci0JICAgICBjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpICYmCi0JICAgIGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKQotCSAgICApIHsKLQkJLyogVE9ETzogc2hvdWxkIGFjcXVpcmUgc3RhdGlvbiBpbmZvLi4uICovCi0JfQotCi1leGl0OgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfaW5mcmFzdHJ1Y3R1cmVfbW9kZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSBlbnVtIG5sODAyMTFfaWZ0eXBlIGlmbW9kZSkKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCB3bGFuX25ldHdvcmsgKmN1cl9uZXR3b3JrID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcms7Ci0JZW51bSBubDgwMjExX2lmdHlwZSBvbGRfbW9kZTsKLQotCW9sZF9tb2RlID0gY3VyX25ldHdvcmstPm5ldHdvcmsuaWZtb2RlOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9ub3RpY2VfLAotCQkgIislczogb2xkID0lZCBuZXcgPSVkIGZ3X3N0YXRlID0gMHglMDh4XG4iLCBfX2Z1bmNfXywKLQkJIG9sZF9tb2RlLCBpZm1vZGUsIGdldF9md3N0YXRlKHBtbG1lcHJpdikpOwotCi0JaWYgKG9sZF9tb2RlICE9IGlmbW9kZSkgewotCQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0KLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9pbmZvXywKLQkJCSAiY2hhbmdlIG1vZGUhXG4iKTsKLQotCQlpZiAob2xkX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKLQkJICAgIG9sZF9tb2RlID09IE5MODAyMTFfSUZUWVBFX1AyUF9HTykgewotCQkJLyogY2hhbmdlIHRvIG90aGVyIG1vZGUgZnJvbSBOZGlzODAyXzExQVBNb2RlICovCi0JCQljdXJfbmV0d29yay0+am9pbl9yZXMgPSAtMTsKLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCQkJc3RvcF9hcF9tb2RlMjNhKHBhZGFwdGVyKTsKLSNlbmRpZgotCQl9Ci0KLQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSB8fAotCQkgICAgb2xkX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpCi0JCQlydHdfZGlzYXNzb2NfY21kMjNhKHBhZGFwdGVyLCAwLCB0cnVlKTsKLQotCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpIHx8Ci0JCSAgICBjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpKQotCQkJcnR3X2ZyZWVfYXNzb2NfcmVzb3VyY2VzMjNhKHBhZGFwdGVyLCAxKTsKLQotCQlpZiAob2xkX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiB8fAotCQkgICAgb2xkX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCB8fAotCQkgICAgb2xkX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKLQkJCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKLQkJCQkvKiB3aWxsIGNsciBMaW5rZWRfc3RhdGU7IGJlZm9yZSB0aGlzIGZ1bmN0aW9uLAotCQkJCSAgIHdlIG11c3QgaGF2ZSBjaGtlZCB3aGV0aGVyIGlzc3VlCi0JCQkJICAgZGlzLWFzc29jX2NtZCBvciBub3QgKi8KLQkJCQlydHdfaW5kaWNhdGVfZGlzY29ubmVjdDIzYShwYWRhcHRlcik7Ci0JCQl9Ci0JICAgICAgIH0KLQotCQljdXJfbmV0d29yay0+bmV0d29yay5pZm1vZGUgPSBpZm1vZGU7Ci0KLQkJX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIH5XSUZJX05VTExfU1RBVEUpOwotCi0JCXN3aXRjaCAoaWZtb2RlKSB7Ci0JCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6Ci0JCQlzZXRfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfU1RBVEUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UOgotCQljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046Ci0JCQlzZXRfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSk7Ci0JCQlicmVhazsKLQotCQljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9HTzoKLQkJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKLQkJCXNldF9md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSk7Ci0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0JCQlzdGFydF9hcF9tb2RlMjNhKHBhZGFwdGVyKTsKLQkJCS8qIHJ0d19pbmRpY2F0ZV9jb25uZWN0MjNhKHBhZGFwdGVyKTsgKi8KLSNlbmRpZgotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogU2VjQ2xlYXJBbGxLZXlzKGFkYXB0ZXIpOyAqLwotCi0JCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCX0KLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9ydHdfY2hhbmdlX2lmYWNlKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCQkgICAgIGVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSwgdTMyICpmbGFncywKLQkJCQkgICAgIHN0cnVjdCB2aWZfcGFyYW1zICpwYXJhbXMpCi17Ci0JZW51bSBubDgwMjExX2lmdHlwZSBvbGRfdHlwZTsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gd2lwaHlfdG9fYWRhcHRlcih3aXBoeSk7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICpydHdfd2RldiA9IHdpcGh5X3RvX3dkZXYod2lwaHkpOwotCWludCByZXQgPSAwOwotCi0JREJHXzg3MjNBKCIlcyglcyk6IGNhbGwgbmV0ZGV2X29wZW4yM2FcbiIsIF9fZnVuY19fLCBuZGV2LT5uYW1lKTsKLQotCW9sZF90eXBlID0gcnR3X3dkZXYtPmlmdHlwZTsKLQlEQkdfODcyM0EoIiVzKCVzKTogb2xkX2lmdHlwZSA9JWQsIG5ld19pZnR5cGUgPSVkXG4iLAotCQkgIF9fZnVuY19fLCBuZGV2LT5uYW1lLCBvbGRfdHlwZSwgdHlwZSk7Ci0KLQlpZiAob2xkX3R5cGUgIT0gdHlwZSkgewotCQlwbWxtZWV4dC0+YWN0aW9uX3B1YmxpY19yeHNlcSA9IDB4ZmZmZjsKLQkJcG1sbWVleHQtPmFjdGlvbl9wdWJsaWNfZGlhbG9nX3Rva2VuID0gMHhmZjsKLQl9Ci0KLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgotCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVDoKLQljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKLQljYXNlIE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVEOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JfQotCi0JcnR3X3dkZXYtPmlmdHlwZSA9IHR5cGU7Ci0KLQlpZiAoY2ZnODAyMTFfaW5mcmFzdHJ1Y3R1cmVfbW9kZShwYWRhcHRlciwgdHlwZSkgIT0gX1NVQ0NFU1MpIHsKLQkJcnR3X3dkZXYtPmlmdHlwZSA9IG9sZF90eXBlOwotCQlyZXQgPSAtRVBFUk07Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlydHdfc2V0b3Btb2RlX2NtZDIzYShwYWRhcHRlciwgdHlwZSk7Ci0KLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBydHdfY2ZnODAyMTFfaW5kaWNhdGVfc2Nhbl9kb25lKHN0cnVjdCBydHdfd2Rldl9wcml2ICpwd2Rldl9wcml2LAotCQkJCSAgICAgYm9vbCBhYm9ydGVkKQotewotCXNwaW5fbG9ja19iaCgmcHdkZXZfcHJpdi0+c2Nhbl9yZXFfbG9jayk7Ci0JaWYgKHB3ZGV2X3ByaXYtPnNjYW5fcmVxdWVzdCAhPSBOVUxMKSB7Ci0JCURCR184NzIzQSgiJXMgd2l0aCBzY2FuIHJlcVxuIiwgX19mdW5jX18pOwotCi0JCWlmIChwd2Rldl9wcml2LT5zY2FuX3JlcXVlc3QtPndpcGh5ICE9Ci0JCSAgICBwd2Rldl9wcml2LT5ydHdfd2Rldi0+d2lwaHkpIHsKLQkJCURCR184NzIzQSgiZXJyb3Igd2lwaHkgY29tcGFyZVxuIik7Ci0JCX0gZWxzZSB7Ci0JCQlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9pbmZvIGluZm8gPSB7Ci0JCQkJLmFib3J0ZWQgPSBhYm9ydGVkLAotCQkJfTsKLQotCQkJY2ZnODAyMTFfc2Nhbl9kb25lKHB3ZGV2X3ByaXYtPnNjYW5fcmVxdWVzdCwgJmluZm8pOwotCQl9Ci0KLQkJcHdkZXZfcHJpdi0+c2Nhbl9yZXF1ZXN0ID0gTlVMTDsKLQl9IGVsc2UgewotCQlEQkdfODcyM0EoIiVzIHdpdGhvdXQgc2NhbiByZXFcbiIsIF9fZnVuY19fKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnB3ZGV2X3ByaXYtPnNjYW5fcmVxX2xvY2spOwotfQotCi12b2lkIHJ0d19jZmc4MDIxMV9zdXJ2ZXlkb25lX2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgcnR3X3F1ZXVlICpxdWV1ZSA9ICZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWU7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmssICpwdG1wOwotCi0Jc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7Ci0JcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHF1ZXVlKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG5ldHdvcmssIHB0bXAsIHBoZWFkLCBsaXN0KSB7Ci0JCS8qIHJlcG9ydCBuZXR3b3JrIG9ubHkgaWYgdGhlIGN1cnJlbnQgY2hhbm5lbCBzZXQKLQkJICAgY29udGFpbnMgdGhlIGNoYW5uZWwgdG8gd2hpY2ggdGhpcyBuZXR3b3JrIGJlbG9uZ3MgKi8KLQkJaWYgKHJ0d19jaF9zZXRfc2VhcmNoX2NoMjNhCi0JCSAgICAocGFkYXB0ZXItPm1sbWVleHRwcml2LmNoYW5uZWxfc2V0LAotCQkgICAgIHBuZXR3b3JrLT5uZXR3b3JrLkRTQ29uZmlnKSA+PSAwKQotCQkJcnR3X2NmZzgwMjExX2luZm9ybV9ic3MocGFkYXB0ZXIsIHBuZXR3b3JrKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKLQotCS8qIGNhbGwgdGhpcyBhZnRlciBvdGhlciB0aGluZ3MgaGF2ZSBiZWVuIGRvbmUgKi8KLQlydHdfY2ZnODAyMTFfaW5kaWNhdGVfc2Nhbl9kb25lKHdkZXZfdG9fcHJpdihwYWRhcHRlci0+cnR3X3dkZXYpLAotCQkJCQlmYWxzZSk7Ci19Ci0KLXN0YXRpYyBpbnQgcnR3X2NmZzgwMjExX3NldF9wcm9iZV9yZXFfd3BzcDJwaWUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkJICAgICAgIGNoYXIgKmJ1ZiwgaW50IGxlbikKLXsKLQlpbnQgcmV0ID0gMDsKLQljb25zdCB1OCAqd3BzX2llOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlEQkdfODcyM0EoIiVzLCBpZWxlbiA9JWRcbiIsIF9fZnVuY19fLCBsZW4pOwotCi0JaWYgKGxlbiA+IDApIHsKLQkJd3BzX2llID0gY2ZnODAyMTFfZmluZF92ZW5kb3JfaWUoV0xBTl9PVUlfTUlDUk9TT0ZULAotCQkJCQkJIFdMQU5fT1VJX1RZUEVfTUlDUk9TT0ZUX1dQUywKLQkJCQkJCSBidWYsIGxlbik7Ci0JCWlmICh3cHNfaWUpIHsKLQkJCURCR184NzIzQSgicHJvYmVfcmVxX3dwc19pZWxlbiA9JWRcbiIsIHdwc19pZVsxXSk7Ci0KLQkJCWlmIChwbWxtZXByaXYtPndwc19wcm9iZV9yZXFfaWUpIHsKLQkJCQlwbWxtZXByaXYtPndwc19wcm9iZV9yZXFfaWVfbGVuID0gMDsKLQkJCQlrZnJlZShwbWxtZXByaXYtPndwc19wcm9iZV9yZXFfaWUpOwotCQkJCXBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZSA9IE5VTEw7Ci0JCQl9Ci0KLQkJCXBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZSA9IGttZW1kdXAod3BzX2llLCB3cHNfaWVbMV0sCi0JCQkJCQkJICAgICAgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAocG1sbWVwcml2LT53cHNfcHJvYmVfcmVxX2llID09IE5VTEwpIHsKLQkJCQlEQkdfODcyM0EoIiVzKCktJWQ6IGttYWxsb2MoKSBFUlJPUiFcbiIsCi0JCQkJCSAgX19mdW5jX18sIF9fTElORV9fKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJCXBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZV9sZW4gPSB3cHNfaWVbMV07Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGNmZzgwMjExX3J0d19zY2FuKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkgICAgIHN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcXVlc3QpCi17Ci0JaW50IGk7Ci0JdTggX3N0YXR1cyA9IGZhbHNlOwotCWludCByZXQgPSAwOwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSB3aXBoeV90b19hZGFwdGVyKHdpcGh5KTsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBjZmc4MDIxMV9zc2lkIHNzaWRbUlRXX1NTSURfU0NBTl9BTU9VTlRdOwotCXN0cnVjdCBydHdfaWVlZTgwMjExX2NoYW5uZWwgY2hbUlRXX0NIQU5ORUxfU0NBTl9BTU9VTlRdOwotCXN0cnVjdCBydHdfd2Rldl9wcml2ICpwd2Rldl9wcml2ID0gd2Rldl90b19wcml2KHBhZGFwdGVyLT5ydHdfd2Rldik7Ci0Jc3RydWN0IGNmZzgwMjExX3NzaWQgKnNzaWRzID0gcmVxdWVzdC0+c3NpZHM7Ci0JYm9vbCBuZWVkX2luZGljYXRlX3NjYW5fZG9uZSA9IGZhbHNlOwotCi0JREJHXzg3MjNBKCIlcyglcylcbiIsIF9fZnVuY19fLCBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSk7Ci0KLQlzcGluX2xvY2tfYmgoJnB3ZGV2X3ByaXYtPnNjYW5fcmVxX2xvY2spOwotCXB3ZGV2X3ByaXYtPnNjYW5fcmVxdWVzdCA9IHJlcXVlc3Q7Ci0Jc3Bpbl91bmxvY2tfYmgoJnB3ZGV2X3ByaXYtPnNjYW5fcmVxX2xvY2spOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkgewotCQlEQkdfODcyM0EoIiVzIHVuZGVyIFdJRklfQVBfU1RBVEVcbiIsIF9fZnVuY19fKTsKLQkJLyogbmVlZF9pbmRpY2F0ZV9zY2FuX2RvbmUgPSB0cnVlOyAqLwotCQkvKiBnb3RvIGNoZWNrX25lZWRfaW5kaWNhdGVfc2Nhbl9kb25lOyAqLwotCX0KLQotCWlmIChydHdfcHdyX3dha2V1cChwYWRhcHRlcikgPT0gX0ZBSUwpIHsKLQkJbmVlZF9pbmRpY2F0ZV9zY2FuX2RvbmUgPSB0cnVlOwotCQlnb3RvIGNoZWNrX25lZWRfaW5kaWNhdGVfc2Nhbl9kb25lOwotCX0KLQotCWlmIChyZXF1ZXN0LT5pZSAmJiByZXF1ZXN0LT5pZV9sZW4gPiAwKSB7Ci0JCXJ0d19jZmc4MDIxMV9zZXRfcHJvYmVfcmVxX3dwc3AycGllKHBhZGFwdGVyLAotCQkJCQkJICAgICh1OCAqKSByZXF1ZXN0LT5pZSwKLQkJCQkJCSAgICByZXF1ZXN0LT5pZV9sZW4pOwotCX0KLQotCWlmIChwbWxtZXByaXYtPkxpbmtEZXRlY3RJbmZvLmJCdXN5VHJhZmZpYyA9PSB0cnVlKSB7Ci0JCURCR184NzIzQSgiJXMsIGJCdXN5VHJhZmZpYyA9PSB0cnVlXG4iLCBfX2Z1bmNfXyk7Ci0JCW5lZWRfaW5kaWNhdGVfc2Nhbl9kb25lID0gdHJ1ZTsKLQkJZ290byBjaGVja19uZWVkX2luZGljYXRlX3NjYW5fZG9uZTsKLQl9Ci0JaWYgKHJ0d19pc19zY2FuX2RlbnkocGFkYXB0ZXIpKSB7Ci0JCURCR184NzIzQSgiJXMoJXMpOiBzY2FuIGRlbnlcbiIsIF9fZnVuY19fLAotCQkJICBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSk7Ci0JCW5lZWRfaW5kaWNhdGVfc2Nhbl9kb25lID0gdHJ1ZTsKLQkJZ290byBjaGVja19uZWVkX2luZGljYXRlX3NjYW5fZG9uZTsKLQl9Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9TVVJWRVkgfCBfRldfVU5ERVJfTElOS0lORykgPT0KLQkgICAgdHJ1ZSkgewotCQlEQkdfODcyM0EoIiVzLCBmd3N0YXRlID0gMHgleFxuIiwgX19mdW5jX18sIHBtbG1lcHJpdi0+Zndfc3RhdGUpOwotCQluZWVkX2luZGljYXRlX3NjYW5fZG9uZSA9IHRydWU7Ci0JCWdvdG8gY2hlY2tfbmVlZF9pbmRpY2F0ZV9zY2FuX2RvbmU7Ci0JfQotCi0JbWVtc2V0KHNzaWQsIDAsIHNpemVvZihzdHJ1Y3QgY2ZnODAyMTFfc3NpZCkgKiBSVFdfU1NJRF9TQ0FOX0FNT1VOVCk7Ci0JLyogcGFyc2luZyByZXF1ZXN0IHNzaWRzLCBuX3NzaWRzICovCi0JZm9yIChpID0gMDsgaSA8IHJlcXVlc3QtPm5fc3NpZHMgJiYgaSA8IFJUV19TU0lEX1NDQU5fQU1PVU5UOyBpKyspIHsKLQkJREJHXzg3MjNBKCJzc2lkID0lcywgbGVuID0lZFxuIiwgc3NpZHNbaV0uc3NpZCwKLQkJCSAgc3NpZHNbaV0uc3NpZF9sZW4pOwotCQltZW1jcHkoc3NpZFtpXS5zc2lkLCBzc2lkc1tpXS5zc2lkLCBzc2lkc1tpXS5zc2lkX2xlbik7Ci0JCXNzaWRbaV0uc3NpZF9sZW4gPSBzc2lkc1tpXS5zc2lkX2xlbjsKLQl9Ci0KLQkvKiBwYXJzaW5nIGNoYW5uZWxzLCBuX2NoYW5uZWxzICovCi0JbWVtc2V0KGNoLCAwLAotCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfY2hhbm5lbCkgKiBSVFdfQ0hBTk5FTF9TQ0FOX0FNT1VOVCk7Ci0KLQlpZiAocmVxdWVzdC0+bl9jaGFubmVscyA9PSAxKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCByZXF1ZXN0LT5uX2NoYW5uZWxzICYmCi0JCSAgICAgaSA8IFJUV19DSEFOTkVMX1NDQU5fQU1PVU5UOyBpKyspIHsKLQkJCURCR184NzIzQSgiJXM6KCVzKToiIENIQU5fRk1UICJcbiIsCi0JCQkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsCi0JCQkJICBDSEFOX0FSRyhyZXF1ZXN0LT5jaGFubmVsc1tpXSkpOwotCQkJY2hbaV0uaHdfdmFsdWUgPSByZXF1ZXN0LT5jaGFubmVsc1tpXS0+aHdfdmFsdWU7Ci0JCQljaFtpXS5mbGFncyA9IHJlcXVlc3QtPmNoYW5uZWxzW2ldLT5mbGFnczsKLQkJfQotCX0KLQotCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLQlpZiAocmVxdWVzdC0+bl9jaGFubmVscyA9PSAxKSB7Ci0JCW1lbWNweSgmY2hbMV0sICZjaFswXSwgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2NoYW5uZWwpKTsKLQkJbWVtY3B5KCZjaFsyXSwgJmNoWzBdLCBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfY2hhbm5lbCkpOwotCQlfc3RhdHVzID0gcnR3X3NpdGVzdXJ2ZXlfY21kMjNhKHBhZGFwdGVyLCBzc2lkLAotCQkJCQkgICAgIFJUV19TU0lEX1NDQU5fQU1PVU5ULCBjaCwgMyk7Ci0JfSBlbHNlIHsKLQkJX3N0YXR1cyA9IHJ0d19zaXRlc3VydmV5X2NtZDIzYShwYWRhcHRlciwgc3NpZCwKLQkJCQkJICAgICBSVFdfU1NJRF9TQ0FOX0FNT1VOVCwgTlVMTCwgMCk7Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCi0JaWYgKF9zdGF0dXMgPT0gZmFsc2UpCi0JCXJldCA9IC0xOwotCi1jaGVja19uZWVkX2luZGljYXRlX3NjYW5fZG9uZToKLQlpZiAobmVlZF9pbmRpY2F0ZV9zY2FuX2RvbmUpCi0JCXJ0d19jZmc4MDIxMV9zdXJ2ZXlkb25lX2V2ZW50X2NhbGxiYWNrKHBhZGFwdGVyKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGNmZzgwMjExX3J0d19zZXRfd2lwaHlfcGFyYW1zKHN0cnVjdCB3aXBoeSAqd2lwaHksIHUzMiBjaGFuZ2VkKQotewotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9ydHdfam9pbl9pYnNzKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAotCQkJCSAgc3RydWN0IGNmZzgwMjExX2lic3NfcGFyYW1zICpwYXJhbXMpCi17Ci0JREJHXzg3MjNBKCIlcyglcylcbiIsIF9fZnVuY19fLCBuZGV2LT5uYW1lKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9ydHdfbGVhdmVfaWJzcyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKLXsKLQlEQkdfODcyM0EoIiVzKCVzKVxuIiwgX19mdW5jX18sIG5kZXYtPm5hbWUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJ0d19jZmc4MDIxMV9zZXRfd3BhX3ZlcnNpb24oc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYsCi0JCQkJCXUzMiB3cGFfdmVyc2lvbikKLXsKLQlEQkdfODcyM0EoIiVzLCB3cGFfdmVyc2lvbiA9JWRcbiIsIF9fZnVuY19fLCB3cGFfdmVyc2lvbik7Ci0KLQlpZiAoIXdwYV92ZXJzaW9uKSB7Ci0JCXBzZWN1cml0eXByaXYtPm5kaXNhdXRodHlwZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICh3cGFfdmVyc2lvbiAmIChOTDgwMjExX1dQQV9WRVJTSU9OXzEgfCBOTDgwMjExX1dQQV9WRVJTSU9OXzIpKQotCQlwc2VjdXJpdHlwcml2LT5uZGlzYXV0aHR5cGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEFQU0s7Ci0KLS8qCi0JaWYgKHdwYV92ZXJzaW9uICYgTkw4MDIxMV9XUEFfVkVSU0lPTl8yKQotCXsKLQkJcHNlY3VyaXR5cHJpdi0+bmRpc2F1dGh0eXBlID0gTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKLQl9Ci0qLwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcnR3X2NmZzgwMjExX3NldF9hdXRoX3R5cGUoc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYsCi0JCQkJICAgICAgZW51bSBubDgwMjExX2F1dGhfdHlwZSBzbWVfYXV0aF90eXBlKQotewotCURCR184NzIzQSgiJXMsIG5sODAyMTFfYXV0aF90eXBlID0lZFxuIiwgX19mdW5jX18sIHNtZV9hdXRoX3R5cGUpOwotCi0Jc3dpdGNoIChzbWVfYXV0aF90eXBlKSB7Ci0JY2FzZSBOTDgwMjExX0FVVEhUWVBFX0FVVE9NQVRJQzoKLQkJcHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSA9IGRvdDExQXV0aEFsZ3J0aG1fQXV0bzsKLQotCQlicmVhazsKLQljYXNlIE5MODAyMTFfQVVUSFRZUEVfT1BFTl9TWVNURU06Ci0JCXBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG0gPSBkb3QxMUF1dGhBbGdydGhtX09wZW47Ci0KLQkJaWYgKHBzZWN1cml0eXByaXYtPm5kaXNhdXRodHlwZSA+IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSkKLQkJCXBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG0gPQotCQkJCWRvdDExQXV0aEFsZ3J0aG1fODAyMVg7Ci0JCWJyZWFrOwotCWNhc2UgTkw4MDIxMV9BVVRIVFlQRV9TSEFSRURfS0VZOgotCQlwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtID0gZG90MTFBdXRoQWxncnRobV9TaGFyZWQ7Ci0KLQkJcHNlY3VyaXR5cHJpdi0+bmRpc2VuY3J5cHRzdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtID0gZG90MTFBdXRoQWxncnRobV9PcGVuOwotCQkvKiByZXR1cm4gLUVOT1RTVVBQOyAqLwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJ0d19jZmc4MDIxMV9zZXRfY2lwaGVyKHN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2LAotCQkJCSAgIHUzMiBjaXBoZXIsIGJvb2wgdWNhc3QpCi17Ci0JdTMyIG5kaXNlbmNyeXB0c3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKLQotCXUzMiAqcHJvZmlsZV9jaXBoZXIgPSB1Y2FzdCA/ICZwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtIDoKLQkgICAgJnBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5OwotCi0JREJHXzg3MjNBKCIlcywgdWNhc3QgPSVkLCBjaXBoZXIgPSAweCV4XG4iLCBfX2Z1bmNfXywgdWNhc3QsIGNpcGhlcik7Ci0KLQlpZiAoIWNpcGhlcikgewotCQkqcHJvZmlsZV9jaXBoZXIgPSAwOwotCQlwc2VjdXJpdHlwcml2LT5uZGlzZW5jcnlwdHN0YXR1cyA9IG5kaXNlbmNyeXB0c3RhdHVzOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzd2l0Y2ggKGNpcGhlcikgewotCWNhc2UgSVdfQVVUSF9DSVBIRVJfTk9ORToKLQkJKnByb2ZpbGVfY2lwaGVyID0gMDsKLQkJbmRpc2VuY3J5cHRzdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOwotCQlicmVhazsKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgotCQkqcHJvZmlsZV9jaXBoZXIgPSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDsKLQkJbmRpc2VuY3J5cHRzdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOwotCQlicmVhazsKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKLQkJKnByb2ZpbGVfY2lwaGVyID0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OwotCQluZGlzZW5jcnlwdHN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7Ci0JCWJyZWFrOwotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDoKLQkJKnByb2ZpbGVfY2lwaGVyID0gV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDsKLQkJbmRpc2VuY3J5cHRzdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOwotCQlicmVhazsKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6Ci0JCSpwcm9maWxlX2NpcGhlciA9IFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA7Ci0JCW5kaXNlbmNyeXB0c3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJREJHXzg3MjNBKCJVbnN1cHBvcnRlZCBjaXBoZXI6IDB4JXhcbiIsIGNpcGhlcik7Ci0JCXJldHVybiAtRU5PVFNVUFA7Ci0JfQotCi0JaWYgKHVjYXN0KQotCQlwc2VjdXJpdHlwcml2LT5uZGlzZW5jcnlwdHN0YXR1cyA9IG5kaXNlbmNyeXB0c3RhdHVzOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcnR3X2NmZzgwMjExX3NldF9rZXlfbWd0KHN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2LAotCQkJCSAgICB1MzIga2V5X21ndCkKLXsKLQlEQkdfODcyM0EoIiVzLCBrZXlfbWd0ID0gMHgleFxuIiwgX19mdW5jX18sIGtleV9tZ3QpOwotCi0JaWYgKGtleV9tZ3QgPT0gV0xBTl9BS01fU1VJVEVfODAyMVgpCi0JCXBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG0gPSBkb3QxMUF1dGhBbGdydGhtXzgwMjFYOwotCWVsc2UgaWYgKGtleV9tZ3QgPT0gV0xBTl9BS01fU1VJVEVfUFNLKQotCQlwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtID0gZG90MTFBdXRoQWxncnRobV84MDIxWDsKLQllbHNlCi0JCURCR184NzIzQSgiSW52YWxpZCBrZXkgbWd0OiAweCV4XG4iLCBrZXlfbWd0KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJ0d19jZmc4MDIxMV9zZXRfd3BhX2llKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwaWUsCi0JCQkJICAgc2l6ZV90IGllbGVuKQotewotCWNvbnN0IHU4ICp3cHNfaWU7Ci0JaW50IGdyb3VwX2NpcGhlciA9IDAsIHBhaXJ3aXNlX2NpcGhlciA9IDA7Ci0JaW50IHJldCA9IDA7Ci0JY29uc3QgdTggKnB3cGEsICpwd3BhMjsKLQlpbnQgaTsKLQotCWlmICghcGllIHx8ICFpZWxlbikgewotCQkvKiBUcmVhdCB0aGlzIGFzIG5vcm1hbCBjYXNlLCBidXQgbmVlZCB0byBjbGVhcgotCQkgICBXSUZJX1VOREVSX1dQUyAqLwotCQlfY2xyX2Z3c3RhdGVfKCZwYWRhcHRlci0+bWxtZXByaXYsIFdJRklfVU5ERVJfV1BTKTsKLQkJZ290byBleGl0OwotCX0KLQlpZiAoaWVsZW4gPiBNQVhfV1BBX0lFX0xFTiArIE1BWF9XUFNfSUVfTEVOICsgTUFYX1AyUF9JRV9MRU4pIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBleGl0OwotCX0KLQotCS8qIGR1bXAgKi8KLQlEQkdfODcyM0EoInNldCB3cGFfaWUobGVuZ3RoOiV6dSk6XG4iLCBpZWxlbik7Ci0JZm9yIChpID0gMDsgaSA8IGllbGVuOyBpID0gaSArIDgpCi0JCURCR184NzIzQSgiMHglLjJ4IDB4JS4yeCAweCUuMnggMHglLjJ4ICIKLQkJCSAgIjB4JS4yeCAweCUuMnggMHglLjJ4IDB4JS4yeFxuIiwKLQkJCSAgcGllW2ldLCBwaWVbaSArIDFdLCBwaWVbaSArIDJdLCBwaWVbaSArIDNdLAotCQkJICBwaWVbaSArIDRdLCBwaWVbaSArIDVdLCBwaWVbaSArIDZdLCBwaWVbaSArIDddKTsKLQlpZiAoaWVsZW4gPCBSU05fSEVBREVSX0xFTikgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfb3NfYywgX2Rydl9lcnJfLAotCQkJICJJZSBsZW4gdG9vIHNob3J0ICVkXG4iLCAoaW50KWllbGVuKTsKLQkJcmV0ID0gLTE7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwd3BhID0gY2ZnODAyMTFfZmluZF92ZW5kb3JfaWUoV0xBTl9PVUlfTUlDUk9TT0ZULAotCQkJCSAgICAgICBXTEFOX09VSV9UWVBFX01JQ1JPU09GVF9XUEEsCi0JCQkJICAgICAgIHBpZSwgaWVsZW4pOwotCWlmIChwd3BhICYmIHB3cGFbMV0gPiAwKSB7Ci0JCWlmIChydHdfcGFyc2Vfd3BhX2llMjNhKHB3cGEsIHB3cGFbMV0gKyAyLCAmZ3JvdXBfY2lwaGVyLAotCQkJCQkmcGFpcndpc2VfY2lwaGVyLCBOVUxMKSA9PSBfU1VDQ0VTUykgewotCQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMUF1dGhBbGdydGhtID0KLQkJCQlkb3QxMUF1dGhBbGdydGhtXzgwMjFYOwotCQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5uZGlzYXV0aHR5cGUgPQotCQkJCU5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKLQkJCW1lbWNweShwYWRhcHRlci0+c2VjdXJpdHlwcml2LnN1cHBsaWNhbnRfaWUsIHB3cGEsCi0JCQkgICAgICAgcHdwYVsxXSArIDIpOwotCi0JCQlEQkdfODcyM0EoImdvdCB3cGFfaWUsIHdwYV9pZWxlbjoldVxuIiwgcHdwYVsxXSk7Ci0JCX0KLQl9Ci0KLQlwd3BhMiA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfUlNOLCBwaWUsIGllbGVuKTsKLQlpZiAocHdwYTIgJiYgcHdwYTJbMV0gPiAwKSB7Ci0JCWlmIChydHdfcGFyc2Vfd3BhMl9pZTIzYSAocHdwYTIsIHB3cGEyWzFdICsgMiwgJmdyb3VwX2NpcGhlciwKLQkJCQkJICAmcGFpcndpc2VfY2lwaGVyLCBOVUxMKSA9PSBfU1VDQ0VTUykgewotCQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMUF1dGhBbGdydGhtID0KLQkJCQlkb3QxMUF1dGhBbGdydGhtXzgwMjFYOwotCQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5uZGlzYXV0aHR5cGUgPQotCQkJCU5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0s7Ci0JCQltZW1jcHkocGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5zdXBwbGljYW50X2llLCBwd3BhMiwKLQkJCSAgICAgICBwd3BhMlsxXSArIDIpOwotCi0JCQlEQkdfODcyM0EoImdvdCB3cGEyX2llLCB3cGEyX2llbGVuOiV1XG4iLCBwd3BhMlsxXSk7Ci0JCX0KLQl9Ci0KLQlpZiAoZ3JvdXBfY2lwaGVyID09IDApIHsKLQkJZ3JvdXBfY2lwaGVyID0gV1BBX0NJUEhFUl9OT05FOwotCX0KLQlpZiAocGFpcndpc2VfY2lwaGVyID09IDApIHsKLQkJcGFpcndpc2VfY2lwaGVyID0gV1BBX0NJUEhFUl9OT05FOwotCX0KLQotCXN3aXRjaCAoZ3JvdXBfY2lwaGVyKSB7Ci0JY2FzZSBXUEFfQ0lQSEVSX05PTkU6Ci0JCXBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTE4MDIxWEdycFByaXZhY3kgPSAwOwotCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNlbmNyeXB0c3RhdHVzID0KLQkJCU5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQ7Ci0JCWJyZWFrOwotCWNhc2UgV1BBX0NJUEhFUl9XRVA0MDoKLQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMTgwMjFYR3JwUHJpdmFjeSA9IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOwotCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNlbmNyeXB0c3RhdHVzID0KLQkJCU5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7Ci0JCWJyZWFrOwotCWNhc2UgV1BBX0NJUEhFUl9US0lQOgotCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExODAyMVhHcnBQcml2YWN5ID0gV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDsKLQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5uZGlzZW5jcnlwdHN0YXR1cyA9Ci0JCQlOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOwotCQlicmVhazsKLQljYXNlIFdQQV9DSVBIRVJfQ0NNUDoKLQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMTgwMjFYR3JwUHJpdmFjeSA9IFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA7Ci0JCXBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2VuY3J5cHRzdGF0dXMgPQotCQkJTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKLQkJYnJlYWs7Ci0JY2FzZSBXUEFfQ0lQSEVSX1dFUDEwNDoKLQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMTgwMjFYR3JwUHJpdmFjeSA9IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDsKLQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5uZGlzZW5jcnlwdHN0YXR1cyA9Ci0JCQlOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOwotCQlicmVhazsKLQl9Ci0KLQlzd2l0Y2ggKHBhaXJ3aXNlX2NpcGhlcikgewotCWNhc2UgV1BBX0NJUEhFUl9OT05FOgotCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG0gPSAwOwotCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNlbmNyeXB0c3RhdHVzID0KLQkJCU5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQ7Ci0JCWJyZWFrOwotCWNhc2UgV1BBX0NJUEhFUl9XRVA0MDoKLQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lBbGdydGhtID0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA7Ci0JCXBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2VuY3J5cHRzdGF0dXMgPQotCQkJTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKLQkJYnJlYWs7Ci0JY2FzZSBXUEFfQ0lQSEVSX1RLSVA6Ci0JCXBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFQcml2YWN5QWxncnRobSA9IFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA7Ci0JCXBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2VuY3J5cHRzdGF0dXMgPQotCQkJTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZDsKLQkJYnJlYWs7Ci0JY2FzZSBXUEFfQ0lQSEVSX0NDTVA6Ci0JCXBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFQcml2YWN5QWxncnRobSA9IFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA7Ci0JCXBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2VuY3J5cHRzdGF0dXMgPQotCQkJTmRpczgwMl8xMUVuY3J5cHRpb24zRW5hYmxlZDsKLQkJYnJlYWs7Ci0JY2FzZSBXUEFfQ0lQSEVSX1dFUDEwNDoKLQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lBbGdydGhtID0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OwotCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNlbmNyeXB0c3RhdHVzID0KLQkJCU5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7Ci0JCWJyZWFrOwotCX0KLQotCXdwc19pZSA9IGNmZzgwMjExX2ZpbmRfdmVuZG9yX2llKFdMQU5fT1VJX01JQ1JPU09GVCwKLQkJCQkJIFdMQU5fT1VJX1RZUEVfTUlDUk9TT0ZUX1dQUywKLQkJCQkJIHBpZSwgaWVsZW4pOwotCWlmICh3cHNfaWUgJiYgd3BzX2llWzFdID4gMCkgewotCQlEQkdfODcyM0EoImdvdCB3cHNfaWUsIHdwc19pZWxlbjoldVxuIiwgd3BzX2llWzFdKTsKLQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi53cHNfaWVfbGVuID0gd3BzX2llWzFdOwotCQltZW1jcHkocGFkYXB0ZXItPnNlY3VyaXR5cHJpdi53cHNfaWUsIHdwc19pZSwKLQkJICAgICAgIHBhZGFwdGVyLT5zZWN1cml0eXByaXYud3BzX2llX2xlbik7Ci0JCXNldF9md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIFdJRklfVU5ERVJfV1BTKTsKLQl9IGVsc2UgewotCQlfY2xyX2Z3c3RhdGVfKCZwYWRhcHRlci0+bWxtZXByaXYsIFdJRklfVU5ERVJfV1BTKTsKLQl9Ci0KLQkvKiBUS0lQIGFuZCBBRVMgZGlzYWxsb3cgbXVsdGljYXN0IHBhY2tldHMgdW50aWwgaW5zdGFsbGluZyBncm91cCBrZXkgKi8KLQlpZiAocGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lBbGdydGhtID09Ci0JICAgIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVAgfHwKLQkgICAgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lBbGdydGhtID09Ci0JICAgIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVApCi0JCS8qIFdQUyBvcGVuIG5lZWQgdG8gZW5hYmxlIG11bHRpY2FzdCAqLwotCQkvKiBjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIFdJRklfVU5ERVJfV1BTKSA9PSB0cnVlKSovCi0JCXJ0bDg3MjNhX29mZl9yY3JfYW0ocGFkYXB0ZXIpOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX29zX2MsIF9kcnZfaW5mb18sCi0JCSAicnR3X3NldF93cGFfaWU6IHBhaXJ3aXNlX2NpcGhlciA9IDB4JTA4eCBwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNlbmNyeXB0c3RhdHVzID0lZCBwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNhdXRodHlwZSA9JWRcbiIsCi0JCSBwYWlyd2lzZV9jaXBoZXIsCi0JCSBwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNlbmNyeXB0c3RhdHVzLAotCQkgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5uZGlzYXV0aHR5cGUpOwotCi1leGl0OgotCWlmIChyZXQpCi0JCV9jbHJfZndzdGF0ZV8oJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9VTkRFUl9XUFMpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcnR3X2NmZzgwMjExX2FkZF93ZXAoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQlzdHJ1Y3QgcnR3X3dlcF9rZXkgKndlcCwgdTgga2V5aWQpCi17Ci0JaW50IHJlczsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCi0JaWYgKGtleWlkID49IE5VTV9XRVBfS0VZUykgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2Vycl8sCi0JCQkgIiVzOmtleWlkPjQgPT5mYWlsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0Jc3dpdGNoICh3ZXAtPmtleWxlbikgewotCWNhc2UgV0xBTl9LRVlfTEVOX1dFUDQwOgotCQlwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtID0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfaW5mb18sCi0JCQkgIiVzOndlcC0+S2V5TGVuZ3RoID0gNVxuIiwgX19mdW5jX18pOwotCQlicmVhazsKLQljYXNlIFdMQU5fS0VZX0xFTl9XRVAxMDQ6Ci0JCXBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gPSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfaW5mb18sCi0JCQkgIiVzOndlcC0+S2V5TGVuZ3RoID0gMTNcbiIsIF9fZnVuY19fKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSA9IDA7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfaW5mb18sCi0JCQkgIiVzOndlcC0+S2V5TGVuZ3RoIT0gNSBvciAxM1xuIiwgX19mdW5jX18pOwotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfaW5mb18sCi0JCSAiJXM6YmVmb3JlIG1lbWNweSwgd2VwLT5LZXlMZW5ndGggPSAweCV4IGtleWlkID0leFxuIiwKLQkJIF9fZnVuY19fLCB3ZXAtPmtleWxlbiwga2V5aWQpOwotCi0JbWVtY3B5KCZwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXSwgd2VwLCBzaXplb2Yoc3RydWN0IHJ0d193ZXBfa2V5KSk7Ci0KLQlwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lLZXlJbmRleCA9IGtleWlkOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9pbmZvXywKLQkJICIlczpzZWN1cml0eSBrZXkgbWF0ZXJpYWwgOiAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleFxuIiwKLQkJIF9fZnVuY19fLAotCQkgcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpZF0ua2V5WzBdLAotCQkgcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpZF0ua2V5WzFdLAotCQkgcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpZF0ua2V5WzJdLAotCQkgcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpZF0ua2V5WzNdLAotCQkgcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpZF0ua2V5WzRdLAotCQkgcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpZF0ua2V5WzVdLAotCQkgcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpZF0ua2V5WzZdLAotCQkgcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpZF0ua2V5WzddLAotCQkgcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpZF0ua2V5WzhdLAotCQkgcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpZF0ua2V5WzldLAotCQkgcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpZF0ua2V5WzEwXSwKLQkJIHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLmtleVsxMV0sCi0JCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbMTJdKTsKLQotCXJlcyA9IHJ0d19zZXRfa2V5MjNhKHBhZGFwdGVyLCBwc2VjdXJpdHlwcml2LCBrZXlpZCwgMSk7Ci0KLWV4aXQ6Ci0KLQlyZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgaW50IHJ0d19zZXRfc3NpZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJc3RydWN0IHdsYW5fbmV0d29yayAqbmV3bmV0d29yaykKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcms7Ci0JaW50IHN0YXR1cyA9IF9TVUNDRVNTOwotCXUzMiBjdXJfdGltZSA9IDA7Ci0KLQlEQkdfODcyM0FfTEVWRUwoX2Rydl9hbHdheXNfLCAic2V0IHNzaWQgWyVzXSBmd19zdGF0ZSA9IDB4JTA4eFxuIiwKLQkJCW5ld25ldHdvcmstPm5ldHdvcmsuU3NpZC5zc2lkLCBnZXRfZndzdGF0ZShwbWxtZXByaXYpKTsKLQotCWlmIChwYWRhcHRlci0+aHdfaW5pdF9jb21wbGV0ZWQgPT0gZmFsc2UpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9lcnJfLAotCQkJICJzZXRfc3NpZDogaHdfaW5pdF9jb21wbGV0ZWQgPT0gZmFsc2UgPT5leGl0ISEhXG4iKTsKLQkJc3RhdHVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0KLQlEQkdfODcyM0EoIlNldCBTU0lEIHVuZGVyIGZ3X3N0YXRlID0gMHglMDh4XG4iLCBnZXRfZndzdGF0ZShwbWxtZXByaXYpKTsKLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9TVVJWRVkpKQotCQlnb3RvIGhhbmRsZV90a2lwX2NvdW50ZXJtZWFzdXJlOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEfFdJRklfQURIT0NfTUFTVEVSX1NUQVRFKSkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2luZm9fLAotCQkJICJzZXRfc3NpZDogX0ZXX0xJTktFRHx8V0lGSV9BREhPQ19NQVNURVJfU1RBVEVcbiIpOwotCi0JCWlmIChwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZF9sZW4gPT0KLQkJICAgIG5ld25ldHdvcmstPm5ldHdvcmsuU3NpZC5zc2lkX2xlbiAmJgotCQkgICAgIW1lbWNtcCgmcG1sbWVwcml2LT5hc3NvY19zc2lkLnNzaWQsCi0JCQkgICAgbmV3bmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWQsCi0JCQkgICAgbmV3bmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWRfbGVuKSkgewotCQkJaWYgKCFjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSkgewotCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sCi0JCQkJCSBfZHJ2X2Vycl8sCi0JCQkJCSAiTmV3IFNTSUQgaXMgc2FtZSBTU0lELCBmd19zdGF0ZSA9IDB4JTA4eFxuIiwKLQkJCQkJIGdldF9md3N0YXRlKHBtbG1lcHJpdikpOwotCi0JCQkJaWYgKHJ0d19pc19zYW1lX2lic3MyM2EocGFkYXB0ZXIsIHBuZXR3b3JrKSkgewotCQkJCQkvKgotCQkJCQkgKiBpdCBtZWFucyBkcml2ZXIgaXMgaW4KLQkJCQkJICogV0lGSV9BREhPQ19NQVNURVJfU1RBVEUsIHdlIG5lZWRuJ3QKLQkJCQkJICogY3JlYXRlIGJzcyBhZ2Fpbi4KLQkJCQkJICovCi0JCQkJCWdvdG8gcmVsZWFzZV9tbG1lX2xvY2s7Ci0JCQkJfQotCi0JCQkJLyoKLQkJCQkgKiBpZiBpbiBXSUZJX0FESE9DX01BU1RFUl9TVEFURSB8Ci0JCQkJICogV0lGSV9BREhPQ19TVEFURSwgY3JlYXRlIGJzcyBvcgotCQkJCSAqIHJlam9pbiBhZ2FpbgotCQkJCSAqLwotCQkJCXJ0d19kaXNhc3NvY19jbWQyM2EocGFkYXB0ZXIsIDAsIHRydWUpOwotCi0JCQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkKLQkJCQkJcnR3X2luZGljYXRlX2Rpc2Nvbm5lY3QyM2EocGFkYXB0ZXIpOwotCi0JCQkJcnR3X2ZyZWVfYXNzb2NfcmVzb3VyY2VzMjNhKHBhZGFwdGVyLCAxKTsKLQotCQkJCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwKLQkJCQkJCSAgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpKSB7Ci0JCQkJCV9jbHJfZndzdGF0ZV8ocG1sbWVwcml2LAotCQkJCQkJICAgICAgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpOwotCQkJCQlzZXRfZndzdGF0ZShwbWxtZXByaXYsCi0JCQkJCQkgICAgV0lGSV9BREhPQ19TVEFURSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlydHdfbHBzX2N0cmxfd2tfY21kMjNhKHBhZGFwdGVyLAotCQkJCQkJICAgICAgIExQU19DVFJMX0pPSU5CU1MsIDEpOwotCQkJfQotCQl9IGVsc2UgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9pbmZvXywKLQkJCQkgIlNldCBTU0lEIG5vdCB0aGUgc2FtZSBzc2lkXG4iKTsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfaW5mb18sCi0JCQkJICJzZXRfc3NpZCA9WyVzXSBsZW4gPSAweCV4XG4iLAotCQkJCSBuZXduZXR3b3JrLT5uZXR3b3JrLlNzaWQuc3NpZCwKLQkJCQkgbmV3bmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWRfbGVuKTsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfaW5mb18sCi0JCQkJICJhc3NvY19zc2lkID1bJXNdIGxlbiA9IDB4JXhcbiIsCi0JCQkJIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkLAotCQkJCSBwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZF9sZW4pOwotCi0JCQlydHdfZGlzYXNzb2NfY21kMjNhKHBhZGFwdGVyLCAwLCB0cnVlKTsKLQotCQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkKLQkJCQlydHdfaW5kaWNhdGVfZGlzY29ubmVjdDIzYShwYWRhcHRlcik7Ci0KLQkJCXJ0d19mcmVlX2Fzc29jX3Jlc291cmNlczIzYShwYWRhcHRlciwgMSk7Ci0KLQkJCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpKSB7Ci0JCQkJX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFKTsKLQkJCQlzZXRfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfU1RBVEUpOwotCQkJfQotCQl9Ci0JfQotCi1oYW5kbGVfdGtpcF9jb3VudGVybWVhc3VyZToKLQotCWlmIChwYWRhcHRlci0+c2VjdXJpdHlwcml2LmJ0a2lwX2NvdW50ZXJtZWFzdXJlID09IHRydWUpIHsKLQkJY3VyX3RpbWUgPSBqaWZmaWVzOwotCi0JCWlmICgoY3VyX3RpbWUgLQotCQkgICAgIHBhZGFwdGVyLT5zZWN1cml0eXByaXYuYnRraXBfY291bnRlcm1lYXN1cmVfdGltZSkgPgotCQkgICAgNjAgKiBIWikgewotCQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idGtpcF9jb3VudGVybWVhc3VyZSA9IGZhbHNlOwotCQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idGtpcF9jb3VudGVybWVhc3VyZV90aW1lID0gMDsKLQkJfSBlbHNlIHsKLQkJCXN0YXR1cyA9IF9GQUlMOwotCQkJZ290byByZWxlYXNlX21sbWVfbG9jazsKLQkJfQotCX0KLQotCW1lbWNweSgmcG1sbWVwcml2LT5hc3NvY19zc2lkLCAmbmV3bmV0d29yay0+bmV0d29yay5Tc2lkLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGNmZzgwMjExX3NzaWQpKTsKLQotCXBtbG1lcHJpdi0+YXNzb2NfYnlfYnNzaWQgPSBmYWxzZTsKLQotCXBtbG1lcHJpdi0+dG9fam9pbiA9IHRydWU7Ci0KLQlpZiAoIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKSkgewotCQlwbWxtZXByaXYtPmN1cl9uZXR3b3JrLmpvaW5fcmVzID0gLTI7Ci0KLQkJc3RhdHVzID0gcnR3X2RvX2pvaW5fbmV0d29yayhwYWRhcHRlciwgbmV3bmV0d29yayk7Ci0JCWlmIChzdGF0dXMgPT0gX1NVQ0NFU1MpIHsKLQkJCXBtbG1lcHJpdi0+dG9fam9pbiA9IGZhbHNlOwotCQl9IGVsc2UgewotCQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX1NUQVRFKSkgewotCQkJCS8qIHN3aXRjaCB0byBBREhPQ19NQVNURVIgKi8KLQkJCQlzdGF0dXMgPSBydHdfZG9fam9pbl9hZGhvYyhwYWRhcHRlcik7Ci0JCQkJaWYgKHN0YXR1cyAhPSBfU1VDQ0VTUykKLQkJCQkJZ290byByZWxlYXNlX21sbWVfbG9jazsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogY2FuJ3QgYXNzb2NpYXRlIDsgcmVzZXQgdW5kZXItbGlua2luZyAqLwotCQkJCV9jbHJfZndzdGF0ZV8ocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORyk7Ci0JCQkJc3RhdHVzID0gX0ZBSUw7Ci0JCQkJcG1sbWVwcml2LT50b19qb2luID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci1yZWxlYXNlX21sbWVfbG9jazoKLQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLQotZXhpdDoKLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2Vycl8sCi0JCSAiLSVzOiBzdGF0dXMgPSVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X2Nvbm5lY3Qoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCi0JCQkJc3RydWN0IGNmZzgwMjExX2Nvbm5lY3RfcGFyYW1zICpzbWUpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQsICpwbGlzdCwgKnB0bXA7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmsgPSBOVUxMOwotCS8qIHU4IG1hdGNoZWRfYnlfYnNzaWQgPSBmYWxzZTsgKi8KLQkvKiB1OCBtYXRjaGVkX2J5X3NzaWQgPSBmYWxzZTsgKi8KLQl1OCBtYXRjaGVkID0gZmFsc2U7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IHdpcGh5X3RvX2FkYXB0ZXIod2lwaHkpOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlzdHJ1Y3QgcnR3X3F1ZXVlICpxdWV1ZSA9ICZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWU7Ci0KLQlEQkdfODcyM0EoIj0+IiAiJXMoJXMpXG4iLCBfX2Z1bmNfXywgbmRldi0+bmFtZSk7Ci0JREJHXzg3MjNBKCJwcml2YWN5ID0lZCwga2V5ID0lcCwga2V5X2xlbiA9JWQsIGtleV9pZHggPSVkXG4iLAotCQkgIHNtZS0+cHJpdmFjeSwgc21lLT5rZXksIHNtZS0+a2V5X2xlbiwgc21lLT5rZXlfaWR4KTsKLQotCWlmIChfRkFJTCA9PSBydHdfcHdyX3dha2V1cChwYWRhcHRlcikpIHsKLQkJcmV0ID0gLUVQRVJNOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkgewotCQlyZXQgPSAtRVBFUk07Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAoIXNtZS0+c3NpZCB8fCAhc21lLT5zc2lkX2xlbiB8fAotCSAgICBzbWUtPnNzaWRfbGVuID4gSUVFRTgwMjExX01BWF9TU0lEX0xFTikgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JREJHXzg3MjNBKCJzc2lkID0lcywgbGVuID0lenVcbiIsIHNtZS0+c3NpZCwgc21lLT5zc2lkX2xlbik7Ci0KLQlpZiAoc21lLT5ic3NpZCkKLQkJREJHXzg3MjNBKCJic3NpZD0lcE1cbiIsIHNtZS0+YnNzaWQpOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORykpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlEQkdfODcyM0EoIiVzLCBmd19zdGF0ZSA9IDB4JXgsIGdvdG8gZXhpdFxuIiwgX19mdW5jX18sCi0JCQkgIHBtbG1lcHJpdi0+Zndfc3RhdGUpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSkpIHsKLQkJcnR3X3NjYW5fYWJvcnQyM2EocGFkYXB0ZXIpOwotCX0KLQotCXNwaW5fbG9ja19iaCgmcXVldWUtPmxvY2spOwotCi0JcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHF1ZXVlKTsKLQotCWxpc3RfZm9yX2VhY2hfc2FmZShwbGlzdCwgcHRtcCwgcGhlYWQpIHsKLQkJcG5ldHdvcmsgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOwotCi0JCWlmIChzbWUtPmJzc2lkKSB7Ci0JCQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwocG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcywKLQkJCQkJICAgICAgc21lLT5ic3NpZCkpCi0JCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoc21lLT5zc2lkICYmIHNtZS0+c3NpZF9sZW4pIHsKLQkJCWlmIChwbmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWRfbGVuICE9IHNtZS0+c3NpZF9sZW4gfHwKLQkJCSAgICBtZW1jbXAocG5ldHdvcmstPm5ldHdvcmsuU3NpZC5zc2lkLCBzbWUtPnNzaWQsCi0JCQkJICAgc21lLT5zc2lkX2xlbikpCi0JCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoc21lLT5ic3NpZCkgewotCQkJaWYgKGV0aGVyX2FkZHJfZXF1YWwocG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcywKLQkJCQkJICAgICBzbWUtPmJzc2lkKSkgewotCQkJCURCR184NzIzQSgibWF0Y2hlZCBieSBic3NpZFxuIik7Ci0KLQkJCQltYXRjaGVkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIGlmIChzbWUtPnNzaWQgJiYgc21lLT5zc2lkX2xlbikgewotCQkJaWYgKCFtZW1jbXAocG5ldHdvcmstPm5ldHdvcmsuU3NpZC5zc2lkLAotCQkJCSAgICBzbWUtPnNzaWQsIHNtZS0+c3NpZF9sZW4pICYmCi0JCQkgICAgcG5ldHdvcmstPm5ldHdvcmsuU3NpZC5zc2lkX2xlbiA9PSBzbWUtPnNzaWRfbGVuKSB7Ci0JCQkJREJHXzg3MjNBKCJtYXRjaGVkIGJ5IHNzaWRcbiIpOwotCi0JCQkJbWF0Y2hlZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzcGluX3VubG9ja19iaCgmcXVldWUtPmxvY2spOwotCi0JaWYgKCFtYXRjaGVkIHx8ICFwbmV0d29yaykgewotCQlyZXQgPSAtRU5PRU5UOwotCQlEQkdfODcyM0EoImNvbm5lY3QsIG1hdGNoZWQgPT0gZmFsc2UsIGdvdG8gZXhpdFxuIik7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAoY2ZnODAyMTFfaW5mcmFzdHJ1Y3R1cmVfbW9kZSgKLQkJICAgIHBhZGFwdGVyLCBwbmV0d29yay0+bmV0d29yay5pZm1vZGUpICE9IF9TVUNDRVNTKSB7Ci0JCXJldCA9IC1FUEVSTTsKLQkJZ290byBleGl0OwotCX0KLQotCXBzZWN1cml0eXByaXYtPm5kaXNlbmNyeXB0c3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKLQlwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtID0gMDsKLQlwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeSA9IDA7Ci0JcHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSA9IGRvdDExQXV0aEFsZ3J0aG1fT3BlbjsKLQlwc2VjdXJpdHlwcml2LT5uZGlzYXV0aHR5cGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOwotCi0JcmV0ID0gcnR3X2NmZzgwMjExX3NldF93cGFfdmVyc2lvbihwc2VjdXJpdHlwcml2LAotCQkJCQkgICBzbWUtPmNyeXB0by53cGFfdmVyc2lvbnMpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGV4aXQ7Ci0KLQlyZXQgPSBydHdfY2ZnODAyMTFfc2V0X2F1dGhfdHlwZShwc2VjdXJpdHlwcml2LCBzbWUtPmF1dGhfdHlwZSk7Ci0KLQlpZiAocmV0IDwgMCkKLQkJZ290byBleGl0OwotCi0JREJHXzg3MjNBKCIlcywgaWVfbGVuID0lenVcbiIsIF9fZnVuY19fLCBzbWUtPmllX2xlbik7Ci0KLQlyZXQgPSBydHdfY2ZnODAyMTFfc2V0X3dwYV9pZShwYWRhcHRlciwgc21lLT5pZSwgc21lLT5pZV9sZW4pOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGV4aXQ7Ci0KLQlpZiAoc21lLT5jcnlwdG8ubl9jaXBoZXJzX3BhaXJ3aXNlKSB7Ci0JCXJldCA9IHJ0d19jZmc4MDIxMV9zZXRfY2lwaGVyKHBzZWN1cml0eXByaXYsCi0JCQkJCSAgICAgIHNtZS0+Y3J5cHRvLmNpcGhlcnNfcGFpcndpc2VbMF0sCi0JCQkJCSAgICAgIHRydWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZXhpdDsKLQl9Ci0KLQkvKiBGb3IgV0VQIFNoYXJlZCBhdXRoICovCi0JaWYgKChwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtID09IGRvdDExQXV0aEFsZ3J0aG1fU2hhcmVkIHx8Ci0JICAgICBwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtID09IGRvdDExQXV0aEFsZ3J0aG1fQXV0bykgJiYKLQkgICAgc21lLT5rZXkpIHsKLQkJc3RydWN0IHJ0d193ZXBfa2V5IHdlcF9rZXk7Ci0JCXU4IHdlcF9rZXlfaWR4LCB3ZXBfa2V5X2xlbjsKLQkJREJHXzg3MjNBKCIlcygpOiBTaGFyZWQvQXV0byBXRVBcbiIsIF9fZnVuY19fKTsKLQotCQl3ZXBfa2V5X2lkeCA9IHNtZS0+a2V5X2lkeDsKLQkJd2VwX2tleV9sZW4gPSBzbWUtPmtleV9sZW47Ci0KLQkJaWYgKHdlcF9rZXlfaWR4ID4gV0VQX0tFWVMgfHwgIXdlcF9rZXlfbGVuIHx8Ci0JCSAgICB3ZXBfa2V5X2xlbiA+IFdMQU5fS0VZX0xFTl9XRVAxMDQpIHsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCQl3ZXBfa2V5X2xlbiA9IHdlcF9rZXlfbGVuIDw9IDUgPyA1IDogMTM7Ci0KLQkJbWVtc2V0KCZ3ZXBfa2V5LCAwLCBzaXplb2Yoc3RydWN0IHJ0d193ZXBfa2V5KSk7Ci0KLQkJd2VwX2tleS5rZXlsZW4gPSB3ZXBfa2V5X2xlbjsKLQotCQlpZiAod2VwX2tleV9sZW4gPT0gMTMpIHsKLQkJCXBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFQcml2YWN5QWxncnRobSA9Ci0JCQkJV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OwotCQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMTgwMjFYR3JwUHJpdmFjeSA9Ci0JCQkJV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OwotCQl9IGVsc2UgewotCQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lBbGdydGhtID0KLQkJCQlXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDsKLQkJCXBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTE4MDIxWEdycFByaXZhY3kgPQotCQkJCVdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOwotCQl9Ci0KLQkJbWVtY3B5KHdlcF9rZXkua2V5LCAodm9pZCAqKXNtZS0+a2V5LCB3ZXBfa2V5LmtleWxlbik7Ci0KLQkJaWYgKHJ0d19jZmc4MDIxMV9hZGRfd2VwKHBhZGFwdGVyLCAmd2VwX2tleSwgd2VwX2tleV9pZHgpICE9Ci0JCSAgICBfU1VDQ0VTUykKLQkJCXJldCA9IC1FT1BOT1RTVVBQOwotCi0JCWlmIChyZXQgPCAwKQotCQkJZ290byBleGl0OwotCX0KLQotCXJldCA9IHJ0d19jZmc4MDIxMV9zZXRfY2lwaGVyKHBzZWN1cml0eXByaXYsCi0JCQkJICAgICAgc21lLT5jcnlwdG8uY2lwaGVyX2dyb3VwLCBmYWxzZSk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXhpdDsKLQotCWlmIChzbWUtPmNyeXB0by5uX2FrbV9zdWl0ZXMpIHsKLQkJcmV0ID0gcnR3X2NmZzgwMjExX3NldF9rZXlfbWd0KHBzZWN1cml0eXByaXYsCi0JCQkJCSAgICAgICBzbWUtPmNyeXB0by5ha21fc3VpdGVzWzBdKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKHBzZWN1cml0eXByaXYtPm5kaXNhdXRodHlwZSA+IDMpCi0JCXBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG0gPSBkb3QxMUF1dGhBbGdydGhtXzgwMjFYOwotCi0JaWYgKHJ0d19zZXRfYXV0aDIzYShwYWRhcHRlciwgcHNlY3VyaXR5cHJpdikgIT0gX1NVQ0NFU1MpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogcnR3X3NldF84MDJfMTFfZW5jcnlwdGlvbl9tb2RlKHBhZGFwdGVyLAotCSAgIHBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2VuY3J5cHRzdGF0dXMpOyAqLwotCi0JaWYgKHJ0d19zZXRfc3NpZChwYWRhcHRlciwgcG5ldHdvcmspICE9IF9TVUNDRVNTKSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBleGl0OwotCX0KLQotCURCR184NzIzQSgic2V0IHNzaWQ6ZG90MTFBdXRoQWxncnRobSA9JWQsIGRvdDExUHJpdmFjeUFsZ3J0aG0gPSVkLCAiCi0JCSAgImRvdDExODAyMVhHcnBQcml2YWN5ID0lZFxuIiwgcHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSwKLQkJICBwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtLAotCQkgIHBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5KTsKLQotZXhpdDoKLQotCURCR184NzIzQSgiPD0lcywgcmV0ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X2Rpc2Nvbm5lY3Qoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCi0JCQkJICAgdTE2IHJlYXNvbl9jb2RlKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSB3aXBoeV90b19hZGFwdGVyKHdpcGh5KTsKLQotCURCR184NzIzQSgiJXMoJXMpXG4iLCBfX2Z1bmNfXywgbmRldi0+bmFtZSk7Ci0KLQlydHdfc2V0X3JvYW1pbmcocGFkYXB0ZXIsIDApOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKLQkJcnR3X3NjYW5fYWJvcnQyM2EocGFkYXB0ZXIpOwotCQlMZWF2ZUFsbFBvd2VyU2F2ZU1vZGUyM2EocGFkYXB0ZXIpOwotCQlydHdfZGlzYXNzb2NfY21kMjNhKHBhZGFwdGVyLCA1MDAsIGZhbHNlKTsKLQotCQlEQkdfODcyM0EoIiVzLi4uY2FsbCBydHdfaW5kaWNhdGVfZGlzY29ubmVjdDIzYVxuIiwgX19mdW5jX18pOwotCi0JCXBhZGFwdGVyLT5tbG1lcHJpdi5ub3RfaW5kaWNfZGlzY28gPSB0cnVlOwotCQlydHdfaW5kaWNhdGVfZGlzY29ubmVjdDIzYShwYWRhcHRlcik7Ci0JCXBhZGFwdGVyLT5tbG1lcHJpdi5ub3RfaW5kaWNfZGlzY28gPSBmYWxzZTsKLQotCQlydHdfZnJlZV9hc3NvY19yZXNvdXJjZXMyM2EocGFkYXB0ZXIsIDEpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNmZzgwMjExX3J0d19zZXRfdHhwb3dlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAotCQkJCSAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAotCQkJCSAgICBlbnVtIG5sODAyMTFfdHhfcG93ZXJfc2V0dGluZyB0eXBlLCBpbnQgbWJtKQotewotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9ydHdfZ2V0X3R4cG93ZXIoc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCQkgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwgaW50ICpkYm0pCi17Ci0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotCSpkYm0gPSAxMjsKLQlyZXR1cm4gMDsKLX0KLQotaW5saW5lIGJvb2wgcnR3X2NmZzgwMjExX3B3cl9tZ210KHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3QgcnR3X3dkZXZfcHJpdiAqcnR3X3dkZXZfcHJpdiA9IHdkZXZfdG9fcHJpdihhZGFwdGVyLT5ydHdfd2Rldik7Ci0JcmV0dXJuIHJ0d193ZGV2X3ByaXYtPnBvd2VyX21nbXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X3NldF9wb3dlcl9tZ210KHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAotCQkJCSAgICAgICBib29sIGVuYWJsZWQsIGludCB0aW1lb3V0KQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSB3aXBoeV90b19hZGFwdGVyKHdpcGh5KTsKLQlzdHJ1Y3QgcnR3X3dkZXZfcHJpdiAqcnR3X3dkZXZfcHJpdiA9IHdkZXZfdG9fcHJpdihwYWRhcHRlci0+cnR3X3dkZXYpOwotCi0JREJHXzg3MjNBKCIlcyglcyk6IGVuYWJsZWQ6JXUsIHRpbWVvdXQ6JWRcbiIsCi0JCSAgX19mdW5jX18sIG5kZXYtPm5hbWUsIGVuYWJsZWQsIHRpbWVvdXQpOwotCi0JcnR3X3dkZXZfcHJpdi0+cG93ZXJfbWdtdCA9IGVuYWJsZWQ7Ci0KLQlpZiAoIWVuYWJsZWQpCi0JCUxQU19MZWF2ZTIzYShwYWRhcHRlcik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9ydHdfc2V0X3Bta3NhKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgc3RydWN0IGNmZzgwMjExX3Bta3NhICpwbWtzYSkKLXsKLQl1OCBpbmRleCwgYmxJbnNlcnRlZCA9IGZhbHNlOwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSB3aXBoeV90b19hZGFwdGVyKHdpcGh5KTsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCi0JREJHXzg3MjNBKCIlcyglcylcbiIsIF9fZnVuY19fLCBuZXRkZXYtPm5hbWUpOwotCi0JaWYgKGlzX3plcm9fZXRoZXJfYWRkcihwbWtzYS0+YnNzaWQpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWJsSW5zZXJ0ZWQgPSBmYWxzZTsKLQotCS8qIG92ZXJ3cml0ZSBQTUtJRCAqLwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9QTUtJRF9DQUNIRTsgaW5kZXgrKykgewotCQlpZiAoZXRoZXJfYWRkcl9lcXVhbChwc2VjdXJpdHlwcml2LT5QTUtJRExpc3RbaW5kZXhdLkJzc2lkLAotCQkJCSAgICAgcG1rc2EtPmJzc2lkKSkgewotCQkJLyogQlNTSUQgaXMgbWF0Y2hlZCwgdGhlIHNhbWUgQVAgPT4gcmV3cml0ZSB3aXRoCi0JCQkgICBuZXcgUE1LSUQuICovCi0JCQlEQkdfODcyM0EoIiVzKCVzKTogIEJTU0lEIGV4aXN0cyBpbiB0aGUgUE1LTGlzdC5cbiIsCi0JCQkJICBfX2Z1bmNfXywgbmV0ZGV2LT5uYW1lKTsKLQotCQkJbWVtY3B5KHBzZWN1cml0eXByaXYtPlBNS0lETGlzdFtpbmRleF0uUE1LSUQsCi0JCQkgICAgICAgcG1rc2EtPnBta2lkLCBXTEFOX1BNS0lEX0xFTik7Ci0JCQlwc2VjdXJpdHlwcml2LT5QTUtJRExpc3RbaW5kZXhdLmJVc2VkID0gdHJ1ZTsKLQkJCXBzZWN1cml0eXByaXYtPlBNS0lESW5kZXggPSBpbmRleCArIDE7Ci0JCQlibEluc2VydGVkID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKCFibEluc2VydGVkKSB7Ci0JCS8qICBGaW5kIGEgbmV3IGVudHJ5ICovCi0JCURCR184NzIzQSgiJXMoJXMpOiBVc2UgbmV3IGVudHJ5IGluZGV4ID0gJWQgZm9yIHRoaXMgUE1LSURcbiIsCi0JCQkgIF9fZnVuY19fLCBuZXRkZXYtPm5hbWUsIHBzZWN1cml0eXByaXYtPlBNS0lESW5kZXgpOwotCi0JCWV0aGVyX2FkZHJfY29weSgKLQkJCXBzZWN1cml0eXByaXYtPlBNS0lETGlzdFtwc2VjdXJpdHlwcml2LT5QTUtJREluZGV4XS4KLQkJCUJzc2lkLCBwbWtzYS0+YnNzaWQpOwotCQltZW1jcHkocHNlY3VyaXR5cHJpdi0+UE1LSURMaXN0W3BzZWN1cml0eXByaXYtPlBNS0lESW5kZXhdLgotCQkgICAgICAgUE1LSUQsIHBta3NhLT5wbWtpZCwgV0xBTl9QTUtJRF9MRU4pOwotCi0JCXBzZWN1cml0eXByaXYtPlBNS0lETGlzdFtwc2VjdXJpdHlwcml2LT5QTUtJREluZGV4XS5iVXNlZCA9Ci0JCQl0cnVlOwotCQlwc2VjdXJpdHlwcml2LT5QTUtJREluZGV4Kys7Ci0JCWlmIChwc2VjdXJpdHlwcml2LT5QTUtJREluZGV4ID09IDE2KSB7Ci0JCQlwc2VjdXJpdHlwcml2LT5QTUtJREluZGV4ID0gMDsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNmZzgwMjExX3J0d19kZWxfcG1rc2Eoc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICBzdHJ1Y3QgY2ZnODAyMTFfcG1rc2EgKnBta3NhKQotewotCXU4IGluZGV4LCBiTWF0Y2hlZCA9IGZhbHNlOwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSB3aXBoeV90b19hZGFwdGVyKHdpcGh5KTsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCi0JREJHXzg3MjNBKCIlcyglcylcbiIsIF9fZnVuY19fLCBuZXRkZXYtPm5hbWUpOwotCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX1BNS0lEX0NBQ0hFOyBpbmRleCsrKSB7Ci0JCWlmIChldGhlcl9hZGRyX2VxdWFsKHBzZWN1cml0eXByaXYtPlBNS0lETGlzdFtpbmRleF0uQnNzaWQsCi0JCQkJICAgICBwbWtzYS0+YnNzaWQpKSB7Ci0JCQkvKiBCU1NJRCBpcyBtYXRjaGVkLCB0aGUgc2FtZSBBUCA9PiBSZW1vdmUgdGhpcyBQTUtJRAotCQkJICAgaW5mb3JtYXRpb24gYW5kIHJlc2V0IGl0LiAqLwotCQkJZXRoX3plcm9fYWRkcihwc2VjdXJpdHlwcml2LT5QTUtJRExpc3RbaW5kZXhdLkJzc2lkKTsKLQkJCW1lbXNldChwc2VjdXJpdHlwcml2LT5QTUtJRExpc3RbaW5kZXhdLlBNS0lELCAweDAwLAotCQkJICAgICAgIFdMQU5fUE1LSURfTEVOKTsKLQkJCXBzZWN1cml0eXByaXYtPlBNS0lETGlzdFtpbmRleF0uYlVzZWQgPSBmYWxzZTsKLQkJCWJNYXRjaGVkID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKGZhbHNlID09IGJNYXRjaGVkKSB7Ci0JCURCR184NzIzQSgiJXMoJXMpOiBkbyBub3QgaGF2ZSBtYXRjaGVkIEJTU0lEXG4iLCBfX2Z1bmNfXywKLQkJCSAgbmV0ZGV2LT5uYW1lKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X2ZsdXNoX3Bta3NhKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IHdpcGh5X3RvX2FkYXB0ZXIod2lwaHkpOwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0KLQlEQkdfODcyM0EoIiVzKCVzKVxuIiwgX19mdW5jX18sIG5ldGRldi0+bmFtZSk7Ci0KLQltZW1zZXQoJnBzZWN1cml0eXByaXYtPlBNS0lETGlzdFswXSwgMHgwMCwKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9wbWtpZF9saXN0KSAqIE5VTV9QTUtJRF9DQUNIRSk7Ci0JcHNlY3VyaXR5cHJpdi0+UE1LSURJbmRleCA9IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotdm9pZCBydHdfY2ZnODAyMTFfaW5kaWNhdGVfc3RhX2Fzc29jKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgICB1OCAqcG1nbXRfZnJhbWUsIHVpbnQgZnJhbWVfbGVuKQotewotCXMzMiBmcmVxOwotCWludCBjaGFubmVsOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwYWRhcHRlci0+cG5ldGRldjsKLQotCURCR184NzIzQSgiJXMocGFkYXB0ZXIgPSVwLCVzKVxuIiwgX19mdW5jX18sIHBhZGFwdGVyLCBuZGV2LT5uYW1lKTsKLQotI2lmIGRlZmluZWQoUlRXX1VTRV9DRkc4MDIxMV9TVEFfRVZFTlQpCi0JewotCQlzdHJ1Y3Qgc3RhdGlvbl9pbmZvIHNpbmZvOwotCQl1OCBpZV9vZmZzZXQ7Ci0KLQkJaWYgKGllZWU4MDIxMV9pc19hc3NvY19yZXEoaGRyLT5mcmFtZV9jb250cm9sKSkKLQkJCWllX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwKLQkJCQkJICAgICB1LmFzc29jX3JlcS52YXJpYWJsZSk7Ci0JCWVsc2UJCS8qICBXSUZJX1JFQVNTT0NSRVEgKi8KLQkJCWllX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwKLQkJCQkJICAgICB1LnJlYXNzb2NfcmVxLnZhcmlhYmxlKTsKLQotCQlzaW5mby5maWxsZWQgPSAwOwotCQlzaW5mby5hc3NvY19yZXFfaWVzID0gcG1nbXRfZnJhbWUgKyBpZV9vZmZzZXQ7Ci0JCXNpbmZvLmFzc29jX3JlcV9pZXNfbGVuID0gZnJhbWVfbGVuIC0gaWVfb2Zmc2V0OwotCQljZmc4MDIxMV9uZXdfc3RhKG5kZXYsIGhkci0+YWRkcjIsICZzaW5mbywgR0ZQX0FUT01JQyk7Ci0JfQotI2Vsc2UgLyogZGVmaW5lZChSVFdfVVNFX0NGRzgwMjExX1NUQV9FVkVOVCkgKi8KLQljaGFubmVsID0gcG1sbWVleHQtPmN1cl9jaGFubmVsOwotCWlmIChjaGFubmVsIDw9IFJUV19DSF9NQVhfMkdfQ0hBTk5FTCkKLQkJZnJlcSA9IGllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeShjaGFubmVsLAotCQkJCQkJICAgICAgTkw4MDIxMV9CQU5EXzJHSFopOwotCWVsc2UKLQkJZnJlcSA9IGllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeShjaGFubmVsLAotCQkJCQkJICAgICAgTkw4MDIxMV9CQU5EXzVHSFopOwotCi0JY2ZnODAyMTFfcnhfbWdtdChwYWRhcHRlci0+cnR3X3dkZXYsIGZyZXEsIDAsIHBtZ210X2ZyYW1lLCBmcmFtZV9sZW4sCi0JCQkgMCk7Ci0jZW5kaWYgLyogZGVmaW5lZChSVFdfVVNFX0NGRzgwMjExX1NUQV9FVkVOVCkgKi8KLX0KLQotdm9pZCBydHdfY2ZnODAyMTFfaW5kaWNhdGVfc3RhX2Rpc2Fzc29jKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJCXVuc2lnbmVkIGNoYXIgKmRhLAotCQkJCQl1bnNpZ25lZCBzaG9ydCByZWFzb24pCi17Ci0JczMyIGZyZXE7Ci0JaW50IGNoYW5uZWw7Ci0JdWludCBmcmFtZV9sZW47Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210IG1nbXQ7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBhZGFwdGVyLT5wbmV0ZGV2OwotCi0JREJHXzg3MjNBKCIlcyhwYWRhcHRlciA9JXAsJXMpXG4iLCBfX2Z1bmNfXywgcGFkYXB0ZXIsIG5kZXYtPm5hbWUpOwotCi0JbWVtc2V0KCZtZ210LCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9tZ210KSk7Ci0KLSNpZiBkZWZpbmVkKFJUV19VU0VfQ0ZHODAyMTFfU1RBX0VWRU5UKQotCWNmZzgwMjExX2RlbF9zdGEobmRldiwgZGEsIEdGUF9BVE9NSUMpOwotI2Vsc2UgLyogZGVmaW5lZChSVFdfVVNFX0NGRzgwMjExX1NUQV9FVkVOVCkgKi8KLQljaGFubmVsID0gcG1sbWVleHQtPmN1cl9jaGFubmVsOwotCWlmIChjaGFubmVsIDw9IFJUV19DSF9NQVhfMkdfQ0hBTk5FTCkKLQkJZnJlcSA9IGllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeShjaGFubmVsLAotCQkJCQkJICAgICAgTkw4MDIxMV9CQU5EXzJHSFopOwotCWVsc2UKLQkJZnJlcSA9IGllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeShjaGFubmVsLAotCQkJCQkJICAgICAgTkw4MDIxMV9CQU5EXzVHSFopOwotCi0JbWdtdC5mcmFtZV9jb250cm9sID0KLQkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfCBJRUVFODAyMTFfU1RZUEVfREVBVVRIKTsKLQotCWV0aGVyX2FkZHJfY29weShtZ210LmRhLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdikpOwotCWV0aGVyX2FkZHJfY29weShtZ210LnNhLCBkYSk7Ci0JZXRoZXJfYWRkcl9jb3B5KG1nbXQuYnNzaWQsIGdldF9teV9ic3NpZDIzYSgmcG1sbWVpbmZvLT5uZXR3b3JrKSk7Ci0KLQltZ210LnNlcV9jdHJsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NOX1RPX1NFUShwbWxtZWV4dC0+bWdudF9zZXEpKTsKLQlwbWxtZWV4dC0+bWdudF9zZXErKzsKLQotCW1nbXQudS5kaXNhc3NvYy5yZWFzb25fY29kZSA9IGNwdV90b19sZTE2KHJlYXNvbik7Ci0KLQlmcmFtZV9sZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpICsgMjsKLQotCWNmZzgwMjExX3J4X21nbXQocGFkYXB0ZXItPnJ0d193ZGV2LCBmcmVxLCAwLCAodTggKikmbWdtdCwgZnJhbWVfbGVuLAotCQkJIDApOwotI2VuZGlmIC8qIGRlZmluZWQoUlRXX1VTRV9DRkc4MDIxMV9TVEFfRVZFTlQpICovCi19Ci0KLXN0YXRpYyBpbnQgcnR3X2NmZzgwMjExX21vbml0b3JfaWZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKLXsKLQlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBydHdfY2ZnODAyMTFfbW9uaXRvcl9pZl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKLXsKLQlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBydHdfY2ZnODAyMTFfbW9uaXRvcl9pZl94bWl0X2VudHJ5KHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQotewotCWludCByZXQgPSAwOwotCWludCBydGFwX2xlbjsKLQlpbnQgcW9zX2xlbiA9IDA7Ci0JaW50IGRvdDExX2hkcl9sZW4gPSAyNDsKLQlpbnQgc25hcF9sZW4gPSA2OwotCXVuc2lnbmVkIGNoYXIgKnBkYXRhOwotCXVuc2lnbmVkIGNoYXIgc3JjX21hY19hZGRyWzZdOwotCXVuc2lnbmVkIGNoYXIgZHN0X21hY19hZGRyWzZdOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpkb3QxMV9oZHI7Ci0Jc3RydWN0IGllZWU4MDIxMV9yYWRpb3RhcF9oZWFkZXIgKnJ0YXBfaGRyOwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQotCURCR184NzIzQSgiJXMoJXMpXG4iLCBfX2Z1bmNfXywgbmRldi0+bmFtZSk7Ci0KLQlpZiAodW5saWtlbHkoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9yYWRpb3RhcF9oZWFkZXIpKSkKLQkJZ290byBmYWlsOwotCi0JcnRhcF9oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9yYWRpb3RhcF9oZWFkZXIgKilza2ItPmRhdGE7Ci0JaWYgKHVubGlrZWx5KHJ0YXBfaGRyLT5pdF92ZXJzaW9uKSkKLQkJZ290byBmYWlsOwotCi0JcnRhcF9sZW4gPSBpZWVlODAyMTFfZ2V0X3JhZGlvdGFwX2xlbihza2ItPmRhdGEpOwotCWlmICh1bmxpa2VseShza2ItPmxlbiA8IHJ0YXBfbGVuKSkKLQkJZ290byBmYWlsOwotCi0JaWYgKHJ0YXBfbGVuICE9IDE0KSB7Ci0JCURCR184NzIzQSgicmFkaW90YXAgbGVuIChzaG91bGQgYmUgMTQpOiAlZFxuIiwgcnRhcF9sZW4pOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JLyogU2tpcCB0aGUgcmF0aW8gdGFwIGhlYWRlciAqLwotCXNrYl9wdWxsKHNrYiwgcnRhcF9sZW4pOwotCi0JZG90MTFfaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOwotCS8qIENoZWNrIGlmIHRoZSBRb1MgYml0IGlzIHNldCAqLwotCWlmIChpZWVlODAyMTFfaXNfZGF0YShkb3QxMV9oZHItPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCS8qIENoZWNrIGlmIHRoaXMgaWEgYSBXaXJlbGVzcyBEaXN0cmlidXRpb24gU3lzdGVtIChXRFMpIGZyYW1lCi0JCSAqIHdoaWNoIGhhcyA0IE1BQyBhZGRyZXNzZXMKLQkJICovCi0JCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoZG90MTFfaGRyLT5mcmFtZV9jb250cm9sKSkKLQkJCXFvc19sZW4gPSBJRUVFODAyMTFfUU9TX0NUTF9MRU47Ci0JCWlmIChpZWVlODAyMTFfaGFzX2E0KGRvdDExX2hkci0+ZnJhbWVfY29udHJvbCkpCi0JCQlkb3QxMV9oZHJfbGVuICs9IDY7Ci0KLQkJbWVtY3B5KGRzdF9tYWNfYWRkciwgZG90MTFfaGRyLT5hZGRyMSwgc2l6ZW9mKGRzdF9tYWNfYWRkcikpOwotCQltZW1jcHkoc3JjX21hY19hZGRyLCBkb3QxMV9oZHItPmFkZHIyLCBzaXplb2Yoc3JjX21hY19hZGRyKSk7Ci0KLQkJLyoKLQkJICogU2tpcCB0aGUgODAyLjExIGhlYWRlciwgUW9TIChpZiBhbnkpIGFuZCBTTkFQLAotCQkgKiBidXQgbGVhdmUgc3BhY2VzIGZvciB0d28gTUFDIGFkZHJlc3NlcwotCQkgKi8KLQkJc2tiX3B1bGwoc2tiLCBkb3QxMV9oZHJfbGVuICsgcW9zX2xlbiArIHNuYXBfbGVuIC0KLQkJCSBFVEhfQUxFTiAqIDIpOwotCQlwZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopc2tiLT5kYXRhOwotCQlldGhlcl9hZGRyX2NvcHkocGRhdGEsIGRzdF9tYWNfYWRkcik7Ci0JCWV0aGVyX2FkZHJfY29weShwZGF0YSArIEVUSF9BTEVOLCBzcmNfbWFjX2FkZHIpOwotCi0JCURCR184NzIzQSgic2hvdWxkIGJlIGVhcG9sIHBhY2tldFxuIik7Ci0KLQkJLyogVXNlIHRoZSByZWFsIG5ldCBkZXZpY2UgdG8gdHJhbnNtaXQgdGhlIHBhY2tldCAqLwotCQlyZXQgPSBydHdfeG1pdDIzYV9lbnRyeTIzYShza2IsIHBhZGFwdGVyLT5wbmV0ZGV2KTsKLQotCQlyZXR1cm4gcmV0OwotCi0JfSBlbHNlIGlmIChpZWVlODAyMTFfaXNfYWN0aW9uKGRvdDExX2hkci0+ZnJhbWVfY29udHJvbCkpIHsKLQkJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwotCQkvKiBvbmx5IGZvciBhY3Rpb24gZnJhbWVzICovCi0JCXN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lOwotCQlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYjsKLQkJdW5zaWduZWQgY2hhciAqcGZyYW1lOwotCQkvKiB1OCBjYXRlZ29yeSwgYWN0aW9uLCBPVUlfU3VidHlwZSwgZGlhbG9nVG9rZW4gPSAwOyAqLwotCQkvKiB1bnNpZ25lZCBjaGFyICAgICAgICAqZnJhbWVfYm9keTsgKi8KLQkJc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQkJc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQkJdTMyIGxlbiA9IHNrYi0+bGVuOwotCQl1OCBjYXRlZ29yeSwgYWN0aW9uOwotCi0JCW1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopZG90MTFfaGRyOwotCi0JCURCR184NzIzQSgiUlRXX1R4OmRhPSVwTSB2aWEgJXMoJXMpXG4iLAotCQkJICBtZ210LT5kYSwgX19mdW5jX18sIG5kZXYtPm5hbWUpOwotCQljYXRlZ29yeSA9IG1nbXQtPnUuYWN0aW9uLmNhdGVnb3J5OwotCQlhY3Rpb24gPSBtZ210LT51LmFjdGlvbi51LndtZV9hY3Rpb24uYWN0aW9uX2NvZGU7Ci0JCURCR184NzIzQSgiUlRXX1R4OmNhdGVnb3J5KCV1KSwgYWN0aW9uKCV1KVxuIiwKLQkJCSAgY2F0ZWdvcnksIGFjdGlvbik7Ci0KLQkJLyogc3RhcnRpbmcgYWxsb2MgbWdtdCBmcmFtZSB0byBkdW1wIGl0ICovCi0JCXBtZ250ZnJhbWUgPSBhbGxvY19tZ3R4bWl0ZnJhbWUyM2EocHhtaXRwcml2KTsKLQkJaWYgKHBtZ250ZnJhbWUgPT0gTlVMTCkKLQkJCWdvdG8gZmFpbDsKLQotCQkvKiB1cGRhdGUgYXR0cmlidXRlICovCi0JCXBhdHRyaWIgPSAmcG1nbnRmcmFtZS0+YXR0cmliOwotCQl1cGRhdGVfbWdudGZyYW1lX2F0dHJpYjIzYShwYWRhcHRlciwgcGF0dHJpYik7Ci0JCXBhdHRyaWItPnJldHJ5X2N0cmwgPSBmYWxzZTsKLQotCQltZW1zZXQocG1nbnRmcmFtZS0+YnVmX2FkZHIsIDAsIFdMQU5IRFJfT0ZGU0VUICsgVFhERVNDX09GRlNFVCk7Ci0KLQkJcGZyYW1lID0gKHU4ICopKHBtZ250ZnJhbWUtPmJ1Zl9hZGRyKSArIFRYREVTQ19PRkZTRVQ7Ci0KLQkJbWVtY3B5KHBmcmFtZSwgc2tiLT5kYXRhLCBsZW4pOwotCQlwYXR0cmliLT5wa3RsZW4gPSBsZW47Ci0KLQkJLyogdXBkYXRlIHNlcSBudW1iZXIgKi8KLQkJcG1sbWVleHQtPm1nbnRfc2VxID0gbGUxNl90b19jcHUoZG90MTFfaGRyLT5zZXFfY3RybCkgPj4gNDsKLQkJcGF0dHJpYi0+c2VxbnVtID0gcG1sbWVleHQtPm1nbnRfc2VxOwotCQlwbWxtZWV4dC0+bWdudF9zZXErKzsKLQotCQlwYXR0cmliLT5sYXN0X3R4Y21kc3ogPSBwYXR0cmliLT5wa3RsZW47Ci0KLQkJZHVtcF9tZ250ZnJhbWUyM2EocGFkYXB0ZXIsIHBtZ250ZnJhbWUpOwotCX0KLQotZmFpbDoKLQotCWRldl9rZnJlZV9za2Ioc2tiKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1ydHdfY2ZnODAyMTFfbW9uaXRvcl9pZl9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKmFkZHIpCi17Ci0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgcnR3X2NmZzgwMjExX21vbml0b3JfaWZfb3BzID0gewotCS5uZG9fb3BlbiA9IHJ0d19jZmc4MDIxMV9tb25pdG9yX2lmX29wZW4sCi0JLm5kb19zdG9wID0gcnR3X2NmZzgwMjExX21vbml0b3JfaWZfY2xvc2UsCi0JLm5kb19zdGFydF94bWl0ID0gcnR3X2NmZzgwMjExX21vbml0b3JfaWZfeG1pdF9lbnRyeSwKLQkubmRvX3NldF9tYWNfYWRkcmVzcyA9IHJ0d19jZmc4MDIxMV9tb25pdG9yX2lmX3NldF9tYWNfYWRkcmVzcywKLX07Ci0KLXN0YXRpYyBpbnQgcnR3X2NmZzgwMjExX2FkZF9tb25pdG9yX2lmKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNoYXIgKm5hbWUsCi0JCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgbmFtZV9hc3NpZ25fdHlwZSwKLQkJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKipuZGV2KQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBuZXRfZGV2aWNlICptb25fbmRldiA9IE5VTEw7Ci0Jc3RydWN0IHdpcmVsZXNzX2RldiAqbW9uX3dkZXYgPSBOVUxMOwotCXN0cnVjdCBydHdfd2Rldl9wcml2ICpwd2Rldl9wcml2ID0gd2Rldl90b19wcml2KHBhZGFwdGVyLT5ydHdfd2Rldik7Ci0KLQlpZiAoIW5hbWUpIHsKLQkJREJHXzg3MjNBKCIlcyglcyk6IHdpdGhvdXQgc3BlY2lmaWMgbmFtZVxuIiwKLQkJCSAgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKHB3ZGV2X3ByaXYtPnBtb25fbmRldikgewotCQlEQkdfODcyM0EoIiVzKCVzKTogbW9uaXRvciBpbnRlcmZhY2UgZXhpc3Q6ICVzXG4iLCBfX2Z1bmNfXywKLQkJCSAgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsIHB3ZGV2X3ByaXYtPnBtb25fbmRldi0+bmFtZSk7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JbW9uX25kZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHJ0d19hZGFwdGVyKSk7Ci0JaWYgKCFtb25fbmRldikgewotCQlEQkdfODcyM0EoIiVzKCVzKTogYWxsb2NhdGUgbmRldiBmYWlsXG4iLCBfX2Z1bmNfXywKLQkJCSAgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0KLQltb25fbmRldi0+dHlwZSA9IEFSUEhSRF9JRUVFODAyMTFfUkFESU9UQVA7Ci0Jc3RybmNweShtb25fbmRldi0+bmFtZSwgbmFtZSwgSUZOQU1TSVopOwotCW1vbl9uZGV2LT5uYW1lW0lGTkFNU0laIC0gMV0gPSAwOwotCW1vbl9uZGV2LT5uYW1lX2Fzc2lnbl90eXBlID0gbmFtZV9hc3NpZ25fdHlwZTsKLQltb25fbmRldi0+ZGVzdHJ1Y3RvciA9IHJ0d19uZGV2X2Rlc3RydWN0b3I7Ci0KLQltb25fbmRldi0+bmV0ZGV2X29wcyA9ICZydHdfY2ZnODAyMTFfbW9uaXRvcl9pZl9vcHM7Ci0KLQkvKiAgd2RldiAqLwotCW1vbl93ZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdpcmVsZXNzX2RldiksIEdGUF9LRVJORUwpOwotCWlmICghbW9uX3dkZXYpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JbW9uX3dkZXYtPndpcGh5ID0gcGFkYXB0ZXItPnJ0d193ZGV2LT53aXBoeTsKLQltb25fd2Rldi0+bmV0ZGV2ID0gbW9uX25kZXY7Ci0JbW9uX3dkZXYtPmlmdHlwZSA9IE5MODAyMTFfSUZUWVBFX01PTklUT1I7Ci0JbW9uX25kZXYtPmllZWU4MDIxMV9wdHIgPSBtb25fd2RldjsKLQotCXJldCA9IHJlZ2lzdGVyX25ldGRldmljZShtb25fbmRldik7Ci0JaWYgKHJldCkgewotCQlnb3RvIG91dDsKLQl9Ci0KLQkqbmRldiA9IHB3ZGV2X3ByaXYtPnBtb25fbmRldiA9IG1vbl9uZGV2OwotCW1lbWNweShwd2Rldl9wcml2LT5pZm5hbWVfbW9uLCBuYW1lLCBJRk5BTVNJWiArIDEpOwotCi1vdXQ6Ci0JaWYgKHJldCkgewotCQlrZnJlZShtb25fd2Rldik7Ci0JCW1vbl93ZGV2ID0gTlVMTDsKLQl9Ci0KLQlpZiAocmV0ICYmIG1vbl9uZGV2KSB7Ci0JCWZyZWVfbmV0ZGV2KG1vbl9uZGV2KTsKLQkJKm5kZXYgPSBtb25fbmRldiA9IE5VTEw7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCB3aXJlbGVzc19kZXYgKgotY2ZnODAyMTFfcnR3X2FkZF92aXJ0dWFsX2ludGYoc3RydWN0IHdpcGh5ICp3aXBoeSwgY29uc3QgY2hhciAqbmFtZSwKLQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgbmFtZV9hc3NpZ25fdHlwZSwKLQkJCSAgICAgIGVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSwgdTMyICpmbGFncywKLQkJCSAgICAgIHN0cnVjdCB2aWZfcGFyYW1zICpwYXJhbXMpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBOVUxMOwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSB3aXBoeV90b19hZGFwdGVyKHdpcGh5KTsKLQotCURCR184NzIzQSgiJXMoJXMpOiB3aXBoeTolcywgbmFtZTolcywgdHlwZTolZFxuIiwgX19mdW5jX18sCi0JCSAgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsIHdpcGh5X25hbWUod2lwaHkpLCBuYW1lLCB0eXBlKTsKLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOOgotCWNhc2UgTkw4MDIxMV9JRlRZUEVfV0RTOgotCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoKLQkJcmV0ID0gLUVOT0RFVjsKLQkJYnJlYWs7Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOgotCQlyZXQgPQotCQkgICAgcnR3X2NmZzgwMjExX2FkZF9tb25pdG9yX2lmKHBhZGFwdGVyLCAoY2hhciAqKW5hbWUsCi0JCQkJCQluYW1lX2Fzc2lnbl90eXBlLCAmbmRldik7Ci0JCWJyZWFrOwotCi0JY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UOgotCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKLQkJcmV0ID0gLUVOT0RFVjsKLQkJYnJlYWs7Ci0KLQljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9HTzoKLQljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgotCQlyZXQgPSAtRU5PREVWOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSAtRU5PREVWOwotCQlEQkdfODcyM0EoIlVuc3VwcG9ydGVkIGludGVyZmFjZSB0eXBlXG4iKTsKLQkJYnJlYWs7Ci0JfQotCi0JREJHXzg3MjNBKCIlcyglcyk6IG5kZXY6JXAsIHJldDolZFxuIiwgX19mdW5jX18sCi0JCSAgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsCi0JCSAgbmRldiwgcmV0KTsKLQotCXJldHVybiBuZGV2ID8gbmRldi0+aWVlZTgwMjExX3B0ciA6IEVSUl9QVFIocmV0KTsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9ydHdfZGVsX3ZpcnR1YWxfaW50ZihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAotCQkJCQkgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldikKLXsKLQlzdHJ1Y3QgcnR3X3dkZXZfcHJpdiAqcHdkZXZfcHJpdiA9Ci0JICAgIChzdHJ1Y3QgcnR3X3dkZXZfcHJpdiAqKXdpcGh5X3ByaXYod2lwaHkpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwotCW5kZXYgPSB3ZGV2ID8gd2Rldi0+bmV0ZGV2IDogTlVMTDsKLQotCWlmICghbmRldikKLQkJZ290byBleGl0OwotCi0JdW5yZWdpc3Rlcl9uZXRkZXZpY2UobmRldik7Ci0KLQlpZiAobmRldiA9PSBwd2Rldl9wcml2LT5wbW9uX25kZXYpIHsKLQkJcHdkZXZfcHJpdi0+cG1vbl9uZGV2ID0gTlVMTDsKLQkJcHdkZXZfcHJpdi0+aWZuYW1lX21vblswXSA9ICdcMCc7Ci0JCURCR184NzIzQSgiJXMoJXMpOiByZW1vdmUgbW9uaXRvciBpbnRlcmZhY2VcbiIsCi0JCQkgIF9fZnVuY19fLCBuZGV2LT5uYW1lKTsKLQl9Ci0KLWV4aXQ6Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcnR3X2FkZF9iZWFjb24oc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCBjb25zdCB1OCAqaGVhZCwKLQkJCSAgc2l6ZV90IGhlYWRfbGVuLCBjb25zdCB1OCAqdGFpbCwgc2l6ZV90IHRhaWxfbGVuKQotewotCWludCByZXQgPSAwOwotCXU4ICpwYnVmOwotCXVpbnQgbGVuLCBpZWxlbiwgd3BzX2llbGVuID0gMDsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKmJzcyA9ICZwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcms7Ci0JY29uc3Qgc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKWhlYWQ7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICp0bXBtZ210OwotCS8qIHN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7ICovCi0KLQlEQkdfODcyM0EoIiVzIGJlYWNvbl9oZWFkX2xlbiA9JXp1LCBiZWFjb25fdGFpbF9sZW4gPSV6dVxuIiwKLQkJICBfX2Z1bmNfXywgaGVhZF9sZW4sIHRhaWxfbGVuKTsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkgIT0gdHJ1ZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoaGVhZF9sZW4gPCBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYmVhY29uLnZhcmlhYmxlKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwYnVmID0ga3phbGxvYyhoZWFkX2xlbiArIHRhaWxfbGVuLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBidWYpCi0JCXJldHVybiAtRU5PTUVNOwotCXRtcG1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopcGJ1ZjsKLQotCWJzcy0+YmVhY29uX2ludGVydmFsID0gZ2V0X3VuYWxpZ25lZF9sZTE2KCZtZ210LT51LmJlYWNvbi5iZWFjb25faW50KTsKLQlic3MtPmNhcGFiaWxpdHkgPSBnZXRfdW5hbGlnbmVkX2xlMTYoJm1nbXQtPnUuYmVhY29uLmNhcGFiX2luZm8pOwotCWJzcy0+dHNmID0gZ2V0X3VuYWxpZ25lZF9sZTY0KCZtZ210LT51LmJlYWNvbi50aW1lc3RhbXApOwotCi0JLyogIDI0ID0gYmVhY29uIGhlYWRlciBsZW4uICovCi0JbWVtY3B5KHBidWYsICh2b2lkICopaGVhZCwgaGVhZF9sZW4pOwotCW1lbWNweShwYnVmICsgaGVhZF9sZW4sICh2b2lkICopdGFpbCwgdGFpbF9sZW4pOwotCi0JbGVuID0gaGVhZF9sZW4gKyB0YWlsX2xlbjsKLQlpZWxlbiA9IGxlbiAtIG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5iZWFjb24udmFyaWFibGUpOwotCS8qIGNoZWNrIHdwcyBpZSBpZiBpbmNsdWVkICovCi0JaWYgKGNmZzgwMjExX2ZpbmRfdmVuZG9yX2llKFdMQU5fT1VJX01JQ1JPU09GVCwKLQkJCQkgICAgV0xBTl9PVUlfVFlQRV9NSUNST1NPRlRfV1BTLAotCQkJCSAgICB0bXBtZ210LT51LmJlYWNvbi52YXJpYWJsZSwgaWVsZW4pKQotCQlEQkdfODcyM0EoImFkZCBiY24sIHdwc19pZWxlbiA9JWRcbiIsIHdwc19pZWxlbik7Ci0KLQkvKiBwYnNzX25ldHdvcmstPklFcyB3aWxsIG5vdCBpbmNsdWRlIHAycF9pZSwgd2ZkIGllICovCi0JcnR3X2llc19yZW1vdmVfaWUyM2EodG1wbWdtdC0+dS5iZWFjb24udmFyaWFibGUsICZpZWxlbiwgMCwKLQkJCSAgICAgV0xBTl9FSURfVkVORE9SX1NQRUNJRklDLCBQMlBfT1VJMjNBLCA0KTsKLQlydHdfaWVzX3JlbW92ZV9pZTIzYSh0bXBtZ210LT51LmJlYWNvbi52YXJpYWJsZSwgJmllbGVuLCAwLAotCQkJICAgICBXTEFOX0VJRF9WRU5ET1JfU1BFQ0lGSUMsIFdGRF9PVUkyM0EsIDQpOwotCi0JbGVuID0gaWVsZW4gKyBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYmVhY29uLnZhcmlhYmxlKTsKLQlpZiAocnR3X2NoZWNrX2JlYWNvbl9kYXRhMjNhKGFkYXB0ZXIsIHRtcG1nbXQsIGxlbikgPT0gX1NVQ0NFU1MpIHsKLQkJcmV0ID0gMDsKLQl9IGVsc2UgewotCQlyZXQgPSAtRUlOVkFMOwotCX0KLQotCWtmcmVlKHBidWYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9ydHdfc3RhcnRfYXAoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCi0JCQkJIHN0cnVjdCBjZmc4MDIxMV9hcF9zZXR0aW5ncyAqc2V0dGluZ3MpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyID0gd2lwaHlfdG9fYWRhcHRlcih3aXBoeSk7Ci0KLQlEQkdfODcyM0EoIiVzKCVzKTogaGlkZGVuX3NzaWQ6JWQsIGF1dGhfdHlwZTolZFxuIiwKLQkJICBfX2Z1bmNfXywgbmRldi0+bmFtZSwgc2V0dGluZ3MtPmhpZGRlbl9zc2lkLAotCQkgIHNldHRpbmdzLT5hdXRoX3R5cGUpOwotCi0JcmV0ID0gcnR3X2FkZF9iZWFjb24oYWRhcHRlciwgc2V0dGluZ3MtPmJlYWNvbi5oZWFkLAotCQkJICAgICBzZXR0aW5ncy0+YmVhY29uLmhlYWRfbGVuLCBzZXR0aW5ncy0+YmVhY29uLnRhaWwsCi0JCQkgICAgIHNldHRpbmdzLT5iZWFjb24udGFpbF9sZW4pOwotCi0JYWRhcHRlci0+bWxtZWV4dHByaXYubWxtZXh0X2luZm8uaGlkZGVuX3NzaWRfbW9kZSA9Ci0JCXNldHRpbmdzLT5oaWRkZW5fc3NpZDsKLQotCWlmIChzZXR0aW5ncy0+c3NpZCAmJiBzZXR0aW5ncy0+c3NpZF9sZW4pIHsKLQkJc3RydWN0IHdsYW5fYnNzaWRfZXggKnBic3NfbmV0d29yayA9Ci0JCQkmYWRhcHRlci0+bWxtZXByaXYuY3VyX25ldHdvcmsubmV0d29yazsKLQkJc3RydWN0IHdsYW5fYnNzaWRfZXggKnBic3NfbmV0d29ya19leHQgPQotCQkJJmFkYXB0ZXItPm1sbWVleHRwcml2Lm1sbWV4dF9pbmZvLm5ldHdvcms7Ci0KLQkJbWVtY3B5KHBic3NfbmV0d29yay0+U3NpZC5zc2lkLCAodm9pZCAqKXNldHRpbmdzLT5zc2lkLAotCQkgICAgICAgc2V0dGluZ3MtPnNzaWRfbGVuKTsKLQkJcGJzc19uZXR3b3JrLT5Tc2lkLnNzaWRfbGVuID0gc2V0dGluZ3MtPnNzaWRfbGVuOwotCQltZW1jcHkocGJzc19uZXR3b3JrX2V4dC0+U3NpZC5zc2lkLCAodm9pZCAqKXNldHRpbmdzLT5zc2lkLAotCQkgICAgICAgc2V0dGluZ3MtPnNzaWRfbGVuKTsKLQkJcGJzc19uZXR3b3JrX2V4dC0+U3NpZC5zc2lkX2xlbiA9IHNldHRpbmdzLT5zc2lkX2xlbjsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGNmZzgwMjExX3J0d19jaGFuZ2VfYmVhY29uKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCi0JCQkJICAgICAgc3RydWN0IGNmZzgwMjExX2JlYWNvbl9kYXRhICppbmZvKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciA9IHdpcGh5X3RvX2FkYXB0ZXIod2lwaHkpOwotCi0JREJHXzg3MjNBKCIlcyglcylcbiIsIF9fZnVuY19fLCBuZGV2LT5uYW1lKTsKLQotCXJldCA9IHJ0d19hZGRfYmVhY29uKGFkYXB0ZXIsIGluZm8tPmhlYWQsIGluZm8tPmhlYWRfbGVuLCBpbmZvLT50YWlsLAotCQkJICAgICBpbmZvLT50YWlsX2xlbik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGNmZzgwMjExX3J0d19zdG9wX2FwKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQotewotCURCR184NzIzQSgiJXMoJXMpXG4iLCBfX2Z1bmNfXywgbmRldi0+bmFtZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X2FkZF9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBjb25zdCB1OCAqbWFjLAotCQkJCSAgICBzdHJ1Y3Qgc3RhdGlvbl9wYXJhbWV0ZXJzICpwYXJhbXMpCi17Ci0JREJHXzg3MjNBKCIlcyglcylcbiIsIF9fZnVuY19fLCBuZGV2LT5uYW1lKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNmZzgwMjExX3J0d19kZWxfc3RhdGlvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAotCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCQkgICAgc3RydWN0IHN0YXRpb25fZGVsX3BhcmFtZXRlcnMgKnBhcmFtcykKLXsKLQljb25zdCB1OCAqbWFjID0gcGFyYW1zLT5tYWM7Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0JdTggdXBkYXRlZCA9IDA7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhLCAqcHRtcDsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYobmRldik7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCi0JREJHXzg3MjNBKCIrJXMoJXMpXG4iLCBfX2Z1bmNfXywgbmRldi0+bmFtZSk7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIChfRldfTElOS0VEIHwgV0lGSV9BUF9TVEFURSkpICE9IHRydWUpIHsKLQkJREJHXzg3MjNBKCIlcywgZndfc3RhdGUgIT0gRldfTElOS0VEfFdJRklfQVBfU1RBVEVcbiIsCi0JCQkgIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFtYWMpIHsKLQkJREJHXzg3MjNBKCJmbHVzaCBhbGwgc3RhLCBhbmQgY2FtX2VudHJ5XG4iKTsKLQotCQlmbHVzaF9hbGxfY2FtX2VudHJ5MjNhKHBhZGFwdGVyKTsJLyogY2xlYXIgQ0FNICovCi0KLQkJcmV0ID0gcnR3X3N0YV9mbHVzaDIzYShwYWRhcHRlcik7Ci0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlEQkdfODcyM0EoImZyZWUgc3RhIG1hY2FkZHI9JXBNXG4iLCBtYWMpOwotCi0JaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKG1hYykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwotCXBoZWFkID0gJnBzdGFwcml2LT5hc29jX2xpc3Q7Ci0JLyogY2hlY2sgYXNvY19xdWV1ZSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwc3RhLCBwdG1wLCBwaGVhZCwgYXNvY19saXN0KSB7Ci0JCWlmIChldGhlcl9hZGRyX2VxdWFsKG1hYywgcHN0YS0+aHdhZGRyKSkgewotCQkJaWYgKHBzdGEtPmRvdDgwMjF4YWxnID09IDEgJiYKLQkJCSAgICBwc3RhLT5icGFpcndpc2Vfa2V5X2luc3RhbGxlZCA9PSBmYWxzZSkgewotCQkJCURCR184NzIzQSgiJXMsIHN0YSdzIGRvdDgwMjF4YWxnID0gMSBhbmQgIgotCQkJCQkgICJrZXlfaW5zdGFsbGVkID0gZmFsc2VcbiIsIF9fZnVuY19fKTsKLQkJCX0gZWxzZSB7Ci0JCQkJREJHXzg3MjNBKCJmcmVlIHBzdGEgPSVwLCBhaWQgPSVkXG4iLCBwc3RhLAotCQkJCQkgIHBzdGEtPmFpZCk7Ci0KLQkJCQlsaXN0X2RlbF9pbml0KCZwc3RhLT5hc29jX2xpc3QpOwotCQkJCXBzdGFwcml2LT5hc29jX2xpc3RfY250LS07Ci0KLQkJCQkvKiBzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsgKi8KLQkJCQl1cGRhdGVkID0KLQkJCQkgICAgYXBfZnJlZV9zdGEyM2EocGFkYXB0ZXIsIHBzdGEsIHRydWUsCi0JCQkJCQlXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7Ci0JCQkJLyogc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOyAqLwotCi0JCQkJcHN0YSA9IE5VTEw7Ci0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKLQotCWFzc29jaWF0ZWRfY2xpZW50c191cGRhdGUyM2EocGFkYXB0ZXIsIHVwZGF0ZWQpOwotCi0JREJHXzg3MjNBKCItJXMoJXMpXG4iLCBfX2Z1bmNfXywgbmRldi0+bmFtZSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGNmZzgwMjExX3J0d19jaGFuZ2Vfc3RhdGlvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAotCQkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgY29uc3QgdTggKm1hYywKLQkJCQkgICAgICAgc3RydWN0IHN0YXRpb25fcGFyYW1ldGVycyAqcGFyYW1zKQotewotCURCR184NzIzQSgiJXMoJXMpXG4iLCBfX2Z1bmNfXywgbmRldi0+bmFtZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X2R1bXBfc3RhdGlvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAotCQkJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIGludCBpZHgsIHU4ICptYWMsCi0JCQkJICAgICBzdHJ1Y3Qgc3RhdGlvbl9pbmZvICpzaW5mbykKLXsKLQlEQkdfODcyM0EoIiVzKCVzKVxuIiwgX19mdW5jX18sIG5kZXYtPm5hbWUpOwotCi0JLyogVE9ETzogZHVtcCBzY2FubmVkIHF1ZXVlICovCi0KLQlyZXR1cm4gLUVOT0VOVDsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9ydHdfY2hhbmdlX2JzcyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCQkgICBzdHJ1Y3QgYnNzX3BhcmFtZXRlcnMgKnBhcmFtcykKLXsKLQlEQkdfODcyM0EoIiVzKCVzKVxuIiwgX19mdW5jX18sIG5kZXYtPm5hbWUpOwotCXJldHVybiAwOwotfQotI2VuZGlmIC8qIENPTkZJR184NzIzQVVfQVBfTU9ERSAqLwotCi1zdGF0aWMgaW50IF9jZmc4MDIxMV9ydHdfbWdtdF90eChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB0eF9jaCwKLQkJCQkgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcG1nbnRmcmFtZTsKLQlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYjsKLQl1bnNpZ25lZCBjaGFyICpwZnJhbWU7Ci0JaW50IHJldCA9IF9GQUlMOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpwd2xhbmhkcjsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0KLQlpZiAoX0ZBSUwgPT0gcnR3X3B3cl93YWtldXAocGFkYXB0ZXIpKSB7Ci0JCXJldCA9IC1FRkFVTFQ7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlydHdfc2V0X3NjYW5fZGVueShwYWRhcHRlciwgMTAwMCk7Ci0KLQlydHdfc2Nhbl9hYm9ydDIzYShwYWRhcHRlcik7Ci0KLQlpZiAodHhfY2ggIT0gcnR3X2dldF9vcGVyX2NoMjNhKHBhZGFwdGVyKSkgewotCQlpZiAoIWNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgX0ZXX0xJTktFRCkpCi0JCQlwbWxtZWV4dC0+Y3VyX2NoYW5uZWwgPSB0eF9jaDsKLQkJc2V0X2NoYW5uZWxfYndtb2RlMjNhKHBhZGFwdGVyLCB0eF9jaCwKLQkJCQkgICBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFLAotCQkJCSAgIEhUX0NIQU5ORUxfV0lEVEhfMjApOwotCX0KLQotCS8qIHN0YXJ0aW5nIGFsbG9jIG1nbXQgZnJhbWUgdG8gZHVtcCBpdCAqLwotCXBtZ250ZnJhbWUgPSBhbGxvY19tZ3R4bWl0ZnJhbWUyM2EocHhtaXRwcml2KTsKLQlpZiAoIXBtZ250ZnJhbWUpIHsKLQkJLyogcmV0ID0gLUVOT01FTTsgKi8KLQkJcmV0ID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQkvKiB1cGRhdGUgYXR0cmlidXRlICovCi0JcGF0dHJpYiA9ICZwbWdudGZyYW1lLT5hdHRyaWI7Ci0JdXBkYXRlX21nbnRmcmFtZV9hdHRyaWIyM2EocGFkYXB0ZXIsIHBhdHRyaWIpOwotCXBhdHRyaWItPnJldHJ5X2N0cmwgPSBmYWxzZTsKLQotCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKLQotCXBmcmFtZSA9ICh1OCAqKSAocG1nbnRmcmFtZS0+YnVmX2FkZHIpICsgVFhERVNDX09GRlNFVDsKLQotCW1lbWNweShwZnJhbWUsICh2b2lkICopYnVmLCBsZW4pOwotCXBhdHRyaWItPnBrdGxlbiA9IGxlbjsKLQotCXB3bGFuaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopcGZyYW1lOwotCS8qIHVwZGF0ZSBzZXEgbnVtYmVyICovCi0JcG1sbWVleHQtPm1nbnRfc2VxID0gbGUxNl90b19jcHUocHdsYW5oZHItPnNlcV9jdHJsKSA+PiA0OwotCXBhdHRyaWItPnNlcW51bSA9IHBtbG1lZXh0LT5tZ250X3NlcTsKLQlwbWxtZWV4dC0+bWdudF9zZXErKzsKLQotCXBhdHRyaWItPmxhc3RfdHhjbWRzeiA9IHBhdHRyaWItPnBrdGxlbjsKLQotCXJldCA9IGR1bXBfbWdudGZyYW1lMjNhX2FuZF93YWl0X2FjazIzYShwYWRhcHRlciwgcG1nbnRmcmFtZSk7Ci0KLQlpZiAocmV0ICAhPSBfU1VDQ0VTUykKLQkJREJHXzg3MjNBKCIlcywgYWNrID09IGZhbHNlXG4iLCBfX2Z1bmNfXyk7Ci0JZWxzZQotCQlEQkdfODcyM0EoIiVzLCBhY2sgPT0gdHJ1ZVxuIiwgX19mdW5jX18pOwotCi1leGl0OgotCi0JREJHXzg3MjNBKCIlcywgcmV0ID0lZFxuIiwgX19mdW5jX18sIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGNmZzgwMjExX3J0d19tZ210X3R4KHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCi0JCQkJc3RydWN0IGNmZzgwMjExX21nbXRfdHhfcGFyYW1zICpwYXJhbXMsCi0JCQkJdTY0ICpjb29raWUpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9Ci0JCShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKil3aXBoeV90b19hZGFwdGVyKHdpcGh5KTsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgdHhfcmV0OwotCXUzMiBkdW1wX2xpbWl0ID0gUlRXX01BWF9NR01UX1RYX0NOVDsKLQl1MzIgZHVtcF9jbnQgPSAwOwotCWJvb2wgYWNrID0gdHJ1ZTsKLQl1OCBjYXRlZ29yeSwgYWN0aW9uOwotCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBqaWZmaWVzOwotCXNpemVfdCBsZW4gPSBwYXJhbXMtPmxlbjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4gPSBwYXJhbXMtPmNoYW47Ci0JY29uc3QgdTggKmJ1ZiA9IHBhcmFtcy0+YnVmOwotCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKWJ1ZjsKLQl1OCB0eF9jaCA9ICh1OCkgaWVlZTgwMjExX2ZyZXF1ZW5jeV90b19jaGFubmVsKGNoYW4tPmNlbnRlcl9mcmVxKTsKLQotCWlmICghaWVlZTgwMjExX2lzX2FjdGlvbihoZHItPmZyYW1lX2NvbnRyb2wpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIGNvb2tpZSBnZW5lcmF0aW9uICovCi0JKmNvb2tpZSA9ICh1bnNpZ25lZCBsb25nKWJ1ZjsKLQotCURCR184NzIzQSgiJXMoJXMpOiBsZW4gPSV6dSwgY2ggPSVkXG4iLCBfX2Z1bmNfXywKLQkJICBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwgbGVuLCB0eF9jaCk7Ci0KLQkvKiBpbmRpY2F0ZSBhY2sgYmVmb3JlIGlzc3VlIGZyYW1lIHRvIGF2b2lkIHJhY2luZyB3aXRoIHJzcCBmcmFtZSAqLwotCWNmZzgwMjExX21nbXRfdHhfc3RhdHVzKHBhZGFwdGVyLT5ydHdfd2RldiwgKmNvb2tpZSwgYnVmLCBsZW4sIGFjaywKLQkJCQlHRlBfS0VSTkVMKTsKLQotCURCR184NzIzQSgiUlRXX1R4OnR4X2NoID0lZCwgZGEgPSVwTVxuIiwgdHhfY2gsIGhkci0+ZGEpOwotCWNhdGVnb3J5ID0gaGRyLT51LmFjdGlvbi5jYXRlZ29yeTsKLQlhY3Rpb24gPSBoZHItPnUuYWN0aW9uLnUud21lX2FjdGlvbi5hY3Rpb25fY29kZTsKLQlEQkdfODcyM0EoIlJUV19UeDpjYXRlZ29yeSgldSksIGFjdGlvbigldSlcbiIsIGNhdGVnb3J5LCBhY3Rpb24pOwotCi0JZG8gewotCQlkdW1wX2NudCsrOwotCQl0eF9yZXQgPSBfY2ZnODAyMTFfcnR3X21nbXRfdHgocGFkYXB0ZXIsIHR4X2NoLCBidWYsIGxlbik7Ci0JfSB3aGlsZSAoZHVtcF9jbnQgPCBkdW1wX2xpbWl0ICYmIHR4X3JldCAhPSBfU1VDQ0VTUyk7Ci0KLQlpZiAodHhfcmV0ICE9IF9TVUNDRVNTIHx8IGR1bXBfY250ID4gMSkgewotCQlEQkdfODcyM0EoIiVzKCVzKTogJXMgKCVkLyVkKSBpbiAlZCBtc1xuIiwKLQkJCSAgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLAotCQkJICB0eF9yZXQgPT0gX1NVQ0NFU1MgPyAiT0siIDogIkZBSUwiLCBkdW1wX2NudCwKLQkJCSAgZHVtcF9saW1pdCwgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gc3RhcnQpKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBjZmc4MDIxMV9ydHdfbWdtdF9mcmFtZV9yZWdpc3RlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAotCQkJCQkgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCi0JCQkJCSAgICAgdTE2IGZyYW1lX3R5cGUsIGJvb2wgcmVnKQotewotCWlmIChmcmFtZV90eXBlICE9IChJRUVFODAyMTFfRlRZUEVfTUdNVCB8IElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVEpKQotCQlyZXR1cm47Ci0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2ZnODAyMTFfb3BzIHJ0d19jZmc4MDIxMV9vcHMgPSB7Ci0JLmNoYW5nZV92aXJ0dWFsX2ludGYgPSBjZmc4MDIxMV9ydHdfY2hhbmdlX2lmYWNlLAotCS5hZGRfa2V5ID0gY2ZnODAyMTFfcnR3X2FkZF9rZXksCi0JLmdldF9rZXkgPSBjZmc4MDIxMV9ydHdfZ2V0X2tleSwKLQkuZGVsX2tleSA9IGNmZzgwMjExX3J0d19kZWxfa2V5LAotCS5zZXRfZGVmYXVsdF9rZXkgPSBjZmc4MDIxMV9ydHdfc2V0X2RlZmF1bHRfa2V5LAotCS5nZXRfc3RhdGlvbiA9IGNmZzgwMjExX3J0d19nZXRfc3RhdGlvbiwKLQkuc2NhbiA9IGNmZzgwMjExX3J0d19zY2FuLAotCS5zZXRfd2lwaHlfcGFyYW1zID0gY2ZnODAyMTFfcnR3X3NldF93aXBoeV9wYXJhbXMsCi0JLmNvbm5lY3QgPSBjZmc4MDIxMV9ydHdfY29ubmVjdCwKLQkuZGlzY29ubmVjdCA9IGNmZzgwMjExX3J0d19kaXNjb25uZWN0LAotCS5qb2luX2lic3MgPSBjZmc4MDIxMV9ydHdfam9pbl9pYnNzLAotCS5sZWF2ZV9pYnNzID0gY2ZnODAyMTFfcnR3X2xlYXZlX2lic3MsCi0JLnNldF90eF9wb3dlciA9IGNmZzgwMjExX3J0d19zZXRfdHhwb3dlciwKLQkuZ2V0X3R4X3Bvd2VyID0gY2ZnODAyMTFfcnR3X2dldF90eHBvd2VyLAotCS5zZXRfcG93ZXJfbWdtdCA9IGNmZzgwMjExX3J0d19zZXRfcG93ZXJfbWdtdCwKLQkuc2V0X3Bta3NhID0gY2ZnODAyMTFfcnR3X3NldF9wbWtzYSwKLQkuZGVsX3Bta3NhID0gY2ZnODAyMTFfcnR3X2RlbF9wbWtzYSwKLQkuZmx1c2hfcG1rc2EgPSBjZmc4MDIxMV9ydHdfZmx1c2hfcG1rc2EsCi0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQkuYWRkX3ZpcnR1YWxfaW50ZiA9IGNmZzgwMjExX3J0d19hZGRfdmlydHVhbF9pbnRmLAotCS5kZWxfdmlydHVhbF9pbnRmID0gY2ZnODAyMTFfcnR3X2RlbF92aXJ0dWFsX2ludGYsCi0KLQkuc3RhcnRfYXAgPSBjZmc4MDIxMV9ydHdfc3RhcnRfYXAsCi0JLmNoYW5nZV9iZWFjb24gPSBjZmc4MDIxMV9ydHdfY2hhbmdlX2JlYWNvbiwKLQkuc3RvcF9hcCA9IGNmZzgwMjExX3J0d19zdG9wX2FwLAotCi0JLmFkZF9zdGF0aW9uID0gY2ZnODAyMTFfcnR3X2FkZF9zdGF0aW9uLAotCS5kZWxfc3RhdGlvbiA9IGNmZzgwMjExX3J0d19kZWxfc3RhdGlvbiwKLQkuY2hhbmdlX3N0YXRpb24gPSBjZmc4MDIxMV9ydHdfY2hhbmdlX3N0YXRpb24sCi0JLmR1bXBfc3RhdGlvbiA9IGNmZzgwMjExX3J0d19kdW1wX3N0YXRpb24sCi0JLmNoYW5nZV9ic3MgPSBjZmc4MDIxMV9ydHdfY2hhbmdlX2JzcywKLSNlbmRpZiAvKiBDT05GSUdfODcyM0FVX0FQX01PREUgKi8KLQotCS5tZ210X3R4ID0gY2ZnODAyMTFfcnR3X21nbXRfdHgsCi0JLm1nbXRfZnJhbWVfcmVnaXN0ZXIgPSBjZmc4MDIxMV9ydHdfbWdtdF9mcmFtZV9yZWdpc3RlciwKLX07Ci0KLXN0YXRpYyB2b2lkIHJ0d19jZmc4MDIxMV9pbml0X2h0X2NhcGFiKHN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCAqaHRfY2FwLAotCQkJCSAgICAgICBlbnVtIG5sODAyMTFfYmFuZCBiYW5kLCB1OCByZl90eXBlKQotewotCi0jZGVmaW5lIE1BWF9CSVRfUkFURV80ME1IWl9NQ1MxNQkzMDAJLyogTWJwcyAqLwotI2RlZmluZSBNQVhfQklUX1JBVEVfNDBNSFpfTUNTNwkJMTUwCS8qIE1icHMgKi8KLQotCWh0X2NhcC0+aHRfc3VwcG9ydGVkID0gdHJ1ZTsKLQotCWh0X2NhcC0+Y2FwID0gSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDAgfAotCSAgICBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCB8IElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwIHwKLQkgICAgSUVFRTgwMjExX0hUX0NBUF9EU1NTQ0NLNDAgfCBJRUVFODAyMTFfSFRfQ0FQX01BWF9BTVNEVTsKLQotCS8qCi0JICpNYXhpbXVtIGxlbmd0aCBvZiBBTVBEVSB0aGF0IHRoZSBTVEEgY2FuIHJlY2VpdmUuCi0JICpMZW5ndGggPSAyIF4gKDEzICsgbWF4X2FtcGR1X2xlbmd0aF9leHApIC0gMSAob2N0ZXRzKQotCSAqLwotCWh0X2NhcC0+YW1wZHVfZmFjdG9yID0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV82NEs7Ci0KLQkvKk1pbmltdW0gTVBEVSBzdGFydCBzcGFjaW5nICwgKi8KLQlodF9jYXAtPmFtcGR1X2RlbnNpdHkgPSBJRUVFODAyMTFfSFRfTVBEVV9ERU5TSVRZXzE2OwotCi0JaHRfY2FwLT5tY3MudHhfcGFyYW1zID0gSUVFRTgwMjExX0hUX01DU19UWF9ERUZJTkVEOwotCi0JLyoKLQkgKmh3LT53aXBoeS0+YmFuZHNbTkw4MDIxMV9CQU5EXzJHSFpdCi0JICpiYXNlIG9uIGFudF9udW0KLQkgKnJ4X21hc2s6IFJYIG1hc2sKLQkgKmlmIHJ4X2FudCA9IDEgcnhfbWFza1swXT0gMHhmZjs9PT5NQ1MwLU1DUzcKLQkgKmlmIHJ4X2FudCA9IDIgcnhfbWFza1sxXT0gMHhmZjs9PT5NQ1M4LU1DUzE1Ci0JICppZiByeF9hbnQgPj0gMyByeF9tYXNrWzJdPSAweGZmOwotCSAqaWYgQldfNDAgcnhfbWFza1s0XT0gMHgwMTsKLQkgKmhpZ2hlc3Qgc3VwcG9ydGVkIFJYIHJhdGUKLQkgKi8KLQlpZiAocmZfdHlwZSA9PSBSRl8xVDFSKSB7Ci0JCWh0X2NhcC0+bWNzLnJ4X21hc2tbMF0gPSAweEZGOwotCQlodF9jYXAtPm1jcy5yeF9tYXNrWzFdID0gMHgwMDsKLQkJaHRfY2FwLT5tY3MucnhfbWFza1s0XSA9IDB4MDE7Ci0KLQkJaHRfY2FwLT5tY3MucnhfaGlnaGVzdCA9IGNwdV90b19sZTE2KE1BWF9CSVRfUkFURV80ME1IWl9NQ1M3KTsKLQl9IGVsc2UgaWYgKChyZl90eXBlID09IFJGXzFUMlIpIHx8IChyZl90eXBlID09IFJGXzJUMlIpKSB7Ci0JCWh0X2NhcC0+bWNzLnJ4X21hc2tbMF0gPSAweEZGOwotCQlodF9jYXAtPm1jcy5yeF9tYXNrWzFdID0gMHhGRjsKLQkJaHRfY2FwLT5tY3MucnhfbWFza1s0XSA9IDB4MDE7Ci0KLQkJaHRfY2FwLT5tY3MucnhfaGlnaGVzdCA9IGNwdV90b19sZTE2KE1BWF9CSVRfUkFURV80ME1IWl9NQ1MxNSk7Ci0JfSBlbHNlIHsKLQkJREJHXzg3MjNBKCIlcywgZXJyb3IgcmZfdHlwZSA9JWRcbiIsIF9fZnVuY19fLCByZl90eXBlKTsKLQl9Ci0KLX0KLQotdm9pZCBydHdfY2ZnODAyMTFfaW5pdF93aXBoeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXU4IHJmX3R5cGU7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqYmFuZHM7Ci0Jc3RydWN0IHdpcmVsZXNzX2RldiAqcHdkZXYgPSBwYWRhcHRlci0+cnR3X3dkZXY7Ci0Jc3RydWN0IHdpcGh5ICp3aXBoeSA9IHB3ZGV2LT53aXBoeTsKLQotCXJmX3R5cGUgPSBydGw4NzIzYV9nZXRfcmZfdHlwZShwYWRhcHRlcik7Ci0KLQlEQkdfODcyM0EoIiVzOnJmX3R5cGUgPSVkXG4iLCBfX2Z1bmNfXywgcmZfdHlwZSk7Ci0KLQkvKiBpZiAocGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi53aXJlbGVzc19tb2RlICYgV0lSRUxFU1NfMTFHKSAqLwotCXsKLQkJYmFuZHMgPSB3aXBoeS0+YmFuZHNbTkw4MDIxMV9CQU5EXzJHSFpdOwotCQlpZiAoYmFuZHMpCi0JCQlydHdfY2ZnODAyMTFfaW5pdF9odF9jYXBhYigmYmFuZHMtPmh0X2NhcCwKLQkJCQkJCSAgIE5MODAyMTFfQkFORF8yR0haLAotCQkJCQkJICAgcmZfdHlwZSk7Ci0JfQotCi0JLyogaWYgKHBhZGFwdGVyLT5yZWdpc3RyeXByaXYud2lyZWxlc3NfbW9kZSAmIFdJUkVMRVNTXzExQSkgKi8KLQl7Ci0JCWJhbmRzID0gd2lwaHktPmJhbmRzW05MODAyMTFfQkFORF81R0haXTsKLQkJaWYgKGJhbmRzKQotCQkJcnR3X2NmZzgwMjExX2luaXRfaHRfY2FwYWIoJmJhbmRzLT5odF9jYXAsCi0JCQkJCQkgICBOTDgwMjExX0JBTkRfNUdIWiwKLQkJCQkJCSAgIHJmX3R5cGUpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgcnR3X2NmZzgwMjExX3ByZWluaXRfd2lwaHkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgICAgc3RydWN0IHdpcGh5ICp3aXBoeSkKLXsKLQl3aXBoeS0+c2lnbmFsX3R5cGUgPSBDRkc4MDIxMV9TSUdOQUxfVFlQRV9NQk07Ci0KLQl3aXBoeS0+bWF4X3NjYW5fc3NpZHMgPSBSVFdfU1NJRF9TQ0FOX0FNT1VOVDsKLQl3aXBoeS0+bWF4X3NjYW5faWVfbGVuID0gSUVFRTgwMjExX01BWF9EQVRBX0xFTjsKLQl3aXBoeS0+bWF4X251bV9wbWtpZHMgPSBSVFdfTUFYX05VTV9QTUtJRFM7Ci0KLQl3aXBoeS0+bWF4X3JlbWFpbl9vbl9jaGFubmVsX2R1cmF0aW9uID0KLQkgICAgUlRXX01BWF9SRU1BSU5fT05fQ0hBTk5FTF9EVVJBVElPTjsKLQotCXdpcGh5LT5pbnRlcmZhY2VfbW9kZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgfAotCSAgICBCSVQoTkw4MDIxMV9JRlRZUEVfQURIT0MpIHwKLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQkgICAgQklUKE5MODAyMTFfSUZUWVBFX0FQKSB8IEJJVChOTDgwMjExX0lGVFlQRV9NT05JVE9SKSB8Ci0jZW5kaWYKLQkgICAgMDsKLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCXdpcGh5LT5tZ210X3N0eXBlcyA9IHJ0d19jZmc4MDIxMV9kZWZhdWx0X21nbXRfc3R5cGVzOwotI2VuZGlmIC8qIENPTkZJR184NzIzQVVfQVBfTU9ERSAqLwotCi0Jd2lwaHktPnNvZnR3YXJlX2lmdHlwZXMgfD0gQklUKE5MODAyMTFfSUZUWVBFX01PTklUT1IpOwotCi0JLyoKLQkgICB3aXBoeS0+aWZhY2VfY29tYmluYXRpb25zID0gJnJ0d19jb21iaW5hdGlvbnM7Ci0JICAgd2lwaHktPm5faWZhY2VfY29tYmluYXRpb25zID0gMTsKLQkgKi8KLQotCXdpcGh5LT5jaXBoZXJfc3VpdGVzID0gcnR3X2NpcGhlcl9zdWl0ZXM7Ci0Jd2lwaHktPm5fY2lwaGVyX3N1aXRlcyA9IEFSUkFZX1NJWkUocnR3X2NpcGhlcl9zdWl0ZXMpOwotCi0JLyogaWYgKHBhZGFwdGVyLT5yZWdpc3RyeXByaXYud2lyZWxlc3NfbW9kZSAmIFdJUkVMRVNTXzExRykgKi8KLQl3aXBoeS0+YmFuZHNbTkw4MDIxMV9CQU5EXzJHSFpdID0KLQkgICAgcnR3X3NwdF9iYW5kX2FsbG9jKE5MODAyMTFfQkFORF8yR0haKTsKLQkvKiBpZiAocGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi53aXJlbGVzc19tb2RlICYgV0lSRUxFU1NfMTFBKSAqLwotCXdpcGh5LT5iYW5kc1tOTDgwMjExX0JBTkRfNUdIWl0gPQotCSAgICBydHdfc3B0X2JhbmRfYWxsb2MoTkw4MDIxMV9CQU5EXzVHSFopOwotCi0Jd2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfSEFTX1JFTUFJTl9PTl9DSEFOTkVMOwotCXdpcGh5LT5mbGFncyB8PSBXSVBIWV9GTEFHX09GRkNIQU5fVFggfCBXSVBIWV9GTEFHX0hBVkVfQVBfU01FOwotCi0JaWYgKHBhZGFwdGVyLT5yZWdpc3RyeXByaXYucG93ZXJfbWdudCAhPSBQU19NT0RFX0FDVElWRSkKLQkJd2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfUFNfT05fQllfREVGQVVMVDsKLQllbHNlCi0JCXdpcGh5LT5mbGFncyAmPSB+V0lQSFlfRkxBR19QU19PTl9CWV9ERUZBVUxUOwotfQotCi1pbnQgcnR3X3dkZXZfYWxsb2Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IGRldmljZSAqZGV2KQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCB3aXBoeSAqd2lwaHk7Ci0Jc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldjsKLQlzdHJ1Y3QgcnR3X3dkZXZfcHJpdiAqcHdkZXZfcHJpdjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldiA9IHBhZGFwdGVyLT5wbmV0ZGV2OwotCi0JREJHXzg3MjNBKCIlcyhwYWRhcHRlciA9JXApXG4iLCBfX2Z1bmNfXywgcGFkYXB0ZXIpOwotCi0JLyogd2lwaHkgKi8KLQl3aXBoeSA9IHdpcGh5X25ldygmcnR3X2NmZzgwMjExX29wcywgc2l6ZW9mKHN0cnVjdCBydHdfd2Rldl9wcml2KSk7Ci0JaWYgKCF3aXBoeSkgewotCQlEQkdfODcyM0EoIkNvdWxkbid0IGFsbG9jYXRlIHdpcGh5IGRldmljZVxuIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQkvKiAgd2RldiAqLwotCXdkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgd2lyZWxlc3NfZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF3ZGV2KSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZnJlZV93aXBoeTsKLQl9Ci0KLQlzZXRfd2lwaHlfZGV2KHdpcGh5LCBkZXYpOwotCXJ0d19jZmc4MDIxMV9wcmVpbml0X3dpcGh5KHBhZGFwdGVyLCB3aXBoeSk7Ci0KLQlyZXQgPSB3aXBoeV9yZWdpc3Rlcih3aXBoeSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJREJHXzg3MjNBKCJDb3VsZG4ndCByZWdpc3RlciB3aXBoeSBkZXZpY2VcbiIpOwotCQlnb3RvIGZyZWVfd2RldjsKLQl9Ci0KLQl3ZGV2LT53aXBoeSA9IHdpcGh5OwotCXdkZXYtPm5ldGRldiA9IHBuZXRkZXY7Ci0JLyogd2Rldi0+aWZ0eXBlID0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTjsgKi8KLQkvKiAgZm9yIHJ0d19zZXRvcG1vZGVfY21kMjNhKCkgaW4gY2ZnODAyMTFfcnR3X2NoYW5nZV9pZmFjZSgpICovCi0Jd2Rldi0+aWZ0eXBlID0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjsKLQlwYWRhcHRlci0+cnR3X3dkZXYgPSB3ZGV2OwotCXBuZXRkZXYtPmllZWU4MDIxMV9wdHIgPSB3ZGV2OwotCi0JLyogaW5pdCBwd2Rldl9wcml2ICovCi0JcHdkZXZfcHJpdiA9IHdkZXZfdG9fcHJpdih3ZGV2KTsKLQlwd2Rldl9wcml2LT5ydHdfd2RldiA9IHdkZXY7Ci0JcHdkZXZfcHJpdi0+cG1vbl9uZGV2ID0gTlVMTDsKLQlwd2Rldl9wcml2LT5pZm5hbWVfbW9uWzBdID0gJ1wwJzsKLQlwd2Rldl9wcml2LT5wYWRhcHRlciA9IHBhZGFwdGVyOwotCXB3ZGV2X3ByaXYtPnNjYW5fcmVxdWVzdCA9IE5VTEw7Ci0Jc3Bpbl9sb2NrX2luaXQoJnB3ZGV2X3ByaXYtPnNjYW5fcmVxX2xvY2spOwotCi0JcHdkZXZfcHJpdi0+cDJwX2VuYWJsZWQgPSBmYWxzZTsKLQotCWlmIChwYWRhcHRlci0+cmVnaXN0cnlwcml2LnBvd2VyX21nbnQgIT0gUFNfTU9ERV9BQ1RJVkUpCi0JCXB3ZGV2X3ByaXYtPnBvd2VyX21nbXQgPSB0cnVlOwotCWVsc2UKLQkJcHdkZXZfcHJpdi0+cG93ZXJfbWdtdCA9IGZhbHNlOwotCi0JcmV0dXJuIHJldDsKLWZyZWVfd2RldjoKLQlrZnJlZSh3ZGV2KTsKLWZyZWVfd2lwaHk6Ci0Jd2lwaHlfZnJlZSh3aXBoeSk7Ci1leGl0OgotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgcnR3X3dkZXZfZnJlZShzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KQotewotCURCR184NzIzQSgiJXMod2RldiA9JXApXG4iLCBfX2Z1bmNfXywgd2Rldik7Ci0KLQlpZiAoIXdkZXYpCi0JCXJldHVybjsKLQotCWtmcmVlKHdkZXYtPndpcGh5LT5iYW5kc1tOTDgwMjExX0JBTkRfMkdIWl0pOwotCWtmcmVlKHdkZXYtPndpcGh5LT5iYW5kc1tOTDgwMjExX0JBTkRfNUdIWl0pOwotCi0Jd2lwaHlfZnJlZSh3ZGV2LT53aXBoeSk7Ci0KLQlrZnJlZSh3ZGV2KTsKLX0KLQotdm9pZCBydHdfd2Rldl91bnJlZ2lzdGVyKHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpCi17Ci0Jc3RydWN0IHJ0d193ZGV2X3ByaXYgKnB3ZGV2X3ByaXY7Ci0KLQlEQkdfODcyM0EoIiVzKHdkZXYgPSVwKVxuIiwgX19mdW5jX18sIHdkZXYpOwotCi0JaWYgKCF3ZGV2KQotCQlyZXR1cm47Ci0KLQlwd2Rldl9wcml2ID0gd2Rldl90b19wcml2KHdkZXYpOwotCi0JcnR3X2NmZzgwMjExX2luZGljYXRlX3NjYW5fZG9uZShwd2Rldl9wcml2LCB0cnVlKTsKLQotCWlmIChwd2Rldl9wcml2LT5wbW9uX25kZXYpIHsKLQkJREJHXzg3MjNBKCIlcywgdW5yZWdpc3RlciBtb25pdG9yIGludGVyZmFjZVxuIiwgX19mdW5jX18pOwotCQl1bnJlZ2lzdGVyX25ldGRldihwd2Rldl9wcml2LT5wbW9uX25kZXYpOwotCX0KLQotCXdpcGh5X3VucmVnaXN0ZXIod2Rldi0+d2lwaHkpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvbWxtZV9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvbWxtZV9saW51eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTI0MzY5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL21sbWVfbGludXguYworKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIF9NTE1FX09TREVQX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8bWxtZV9vc2RlcC5oPgotCi1zdGF0aWMgc3RydWN0IHJ0X3Bta2lkX2xpc3QgYmFja3VwUE1LSURMaXN0W05VTV9QTUtJRF9DQUNIRV07Ci0KLXZvaWQgcnR3X3Jlc2V0X3NlY3VyaXR5cHJpdjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JdTgJYmFja3VwUE1LSURJbmRleCA9IDA7Ci0JdTgJYmFja3VwVEtJUENvdW50ZXJtZWFzdXJlID0gMHgwMDsKLQl1bnNpZ25lZCBsb25nIGJhY2t1cFRLSVBjb3VudGVybWVhc3VyZV90aW1lID0gMDsKLQotCWlmIChhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFBdXRoQWxncnRobSA9PQotCSAgICBkb3QxMUF1dGhBbGdydGhtXzgwMjFYKSB7IC8qIDgwMi4xeCAqLwotCQkvKiAgV2UgaGF2ZSB0byBiYWNrdXAgdGhlIFBNSyBpbmZvcm1hdGlvbiBmb3IgV2lGaSBQTUsKLQkJICogIENhY2hpbmcgdGVzdCBpdGVtLgotCQkgKiAgQmFja3VwIHRoZSBidGtpcF9jb3VudGVybWVhc3VyZSBpbmZvcm1hdGlvbi4KLQkJICogIFdoZW4gdGhlIGNvdW50ZXJtZWFzdXJlIGlzIHRyaWdnZXIsIHRoZSBkcml2ZXIgaGF2ZSB0bwotCQkgKiAgZGlzY29ubmVjdCB3aXRoIEFQIGZvciA2MCBzZWNvbmRzLgotCQkgKi8KLQkJbWVtY3B5KCZiYWNrdXBQTUtJRExpc3RbMF0sICZhZGFwdGVyLT5zZWN1cml0eXByaXYuUE1LSURMaXN0WzBdLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydF9wbWtpZF9saXN0KSAqIE5VTV9QTUtJRF9DQUNIRSk7Ci0JCWJhY2t1cFBNS0lESW5kZXggPSBhZGFwdGVyLT5zZWN1cml0eXByaXYuUE1LSURJbmRleDsKLQkJYmFja3VwVEtJUENvdW50ZXJtZWFzdXJlID0gYWRhcHRlci0+c2VjdXJpdHlwcml2LmJ0a2lwX2NvdW50ZXJtZWFzdXJlOwotCQliYWNrdXBUS0lQY291bnRlcm1lYXN1cmVfdGltZSA9IGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idGtpcF9jb3VudGVybWVhc3VyZV90aW1lOwotCi0JCW1lbXNldCgodW5zaWduZWQgY2hhciAqKSZhZGFwdGVyLT5zZWN1cml0eXByaXYsIDAsCi0JCSAgICAgICBzaXplb2YgKHN0cnVjdCBzZWN1cml0eV9wcml2KSk7Ci0JCS8qIFJlc3RvcmUgdGhlIFBNSyBpbmZvcm1hdGlvbiB0byBzZWN1cml0eXByaXYgc3RydWN0dXJlCi0JCSAqIGZvciB0aGUgZm9sbG93aW5nIGNvbm5lY3Rpb24uCi0JCSAqLwotCQltZW1jcHkoJmFkYXB0ZXItPnNlY3VyaXR5cHJpdi5QTUtJRExpc3RbMF0sICZiYWNrdXBQTUtJRExpc3RbMF0sCi0JCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X3Bta2lkX2xpc3QpICogTlVNX1BNS0lEX0NBQ0hFKTsKLQkJYWRhcHRlci0+c2VjdXJpdHlwcml2LlBNS0lESW5kZXggPSBiYWNrdXBQTUtJREluZGV4OwotCQlhZGFwdGVyLT5zZWN1cml0eXByaXYuYnRraXBfY291bnRlcm1lYXN1cmUgPSBiYWNrdXBUS0lQQ291bnRlcm1lYXN1cmU7Ci0JCWFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idGtpcF9jb3VudGVybWVhc3VyZV90aW1lID0gYmFja3VwVEtJUGNvdW50ZXJtZWFzdXJlX3RpbWU7Ci0KLQkJYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNhdXRodHlwZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47Ci0JCWFkYXB0ZXItPnNlY3VyaXR5cHJpdi5uZGlzZW5jcnlwdHN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQl9IGVsc2UgeyAgLyogcmVzZXQgdmFsdWVzIGluIHNlY3VyaXR5cHJpdiAqLwotCQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY19wcml2ID0gJmFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQotCQkvKiBvcGVuIHN5c3RlbSAqLwotCQlwc2VjX3ByaXYtPmRvdDExQXV0aEFsZ3J0aG0gPSBkb3QxMUF1dGhBbGdydGhtX09wZW47Ci0JCXBzZWNfcHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSA9IDA7Ci0JCXBzZWNfcHJpdi0+ZG90MTFQcml2YWN5S2V5SW5kZXggPSAwOwotCi0JCXBzZWNfcHJpdi0+ZG90MTE4MDIxWEdycFByaXZhY3kgPSAwOwotCQlwc2VjX3ByaXYtPmRvdDExODAyMVhHcnBLZXlpZCA9IDE7Ci0KLQkJcHNlY19wcml2LT5uZGlzYXV0aHR5cGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOwotCQlwc2VjX3ByaXYtPm5kaXNlbmNyeXB0c3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCX0KLX0KLQotdm9pZCBydHdfb3NfaW5kaWNhdGVfZGlzY29ubmVjdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JLyogRG8gaXQgZmlyc3QgZm9yIHR4IGJyb2FkY2FzdCBwa3QgYWZ0ZXIgZGlzY29ubmVjdGlvbiBpc3N1ZSEgKi8KLQluZXRpZl9jYXJyaWVyX29mZihhZGFwdGVyLT5wbmV0ZGV2KTsKLQotCXJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9kaXNjb25uZWN0KGFkYXB0ZXIpOwotCi0JcnR3X3Jlc2V0X3NlY3VyaXR5cHJpdjIzYShhZGFwdGVyKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL29zX2ludGZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC9vc19pbnRmcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODg0OGMyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL29zX2ludGZzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9PU19JTlRGU19DXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPHhtaXRfb3NkZXAuaD4KLSNpbmNsdWRlIDxyZWN2X29zZGVwLmg+Ci0jaW5jbHVkZSA8aGFsX2ludGYuaD4KLSNpbmNsdWRlIDxydHdfdmVyc2lvbi5oPgotCi0jaW5jbHVkZSA8cnRsODcyM2FfaGFsLmg+Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiUmVhbHRlayBXaXJlbGVzcyBMYW4gRHJpdmVyIik7Ci1NT0RVTEVfQVVUSE9SKCJSZWFsdGVrIFNlbWljb25kdWN0b3IgQ29ycC4iKTsKLU1PRFVMRV9BVVRIT1IoIkxhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4iKTsKLU1PRFVMRV9BVVRIT1IoIkplcyBTb3JlbnNlbiA8SmVzLlNvcmVuc2VuQHJlZGhhdC5jb20+Iik7Ci1NT0RVTEVfVkVSU0lPTihEUklWRVJWRVJTSU9OKTsKLU1PRFVMRV9GSVJNV0FSRSgicnRsd2lmaS9ydGw4NzIzYXVmd19BLmJpbiIpOwotTU9EVUxFX0ZJUk1XQVJFKCJydGx3aWZpL3J0bDg3MjNhdWZ3X0IuYmluIik7Ci1NT0RVTEVfRklSTVdBUkUoInJ0bHdpZmkvcnRsODcyM2F1ZndfQl9Ob0JULmJpbiIpOwotCi0vKiBtb2R1bGUgcGFyYW0gZGVmYXVsdHMgKi8KLXN0YXRpYyBpbnQgcnR3X2NoaXBfdmVyc2lvbjsKLXN0YXRpYyBpbnQgcnR3X3JmaW50ZnMgPSBIV1BJOwotc3RhdGljIGludCBydHdfZGVidWcgPSAxOwotCi1zdGF0aWMgaW50IHJ0d19jaGFubmVsID0gMTsvKiBhZC1ob2Mgc3VwcG9ydCByZXF1aXJlbWVudCAqLwotc3RhdGljIGludCBydHdfd2lyZWxlc3NfbW9kZSA9IFdJUkVMRVNTXzExQkdfMjROOwotc3RhdGljIGludCBydHdfdnJ0bF9jYXJyaWVyX3NlbnNlID0gQVVUT19WQ1M7Ci1zdGF0aWMgaW50IHJ0d192Y3NfdHlwZSA9IFJUU19DVFM7LyogICovCi1zdGF0aWMgaW50IHJ0d19ydHNfdGhyZXNoID0gMjM0NzsvKiAgKi8KLXN0YXRpYyBpbnQgcnR3X2ZyYWdfdGhyZXNoID0gMjM0NjsvKiAgKi8KLXN0YXRpYyBpbnQgcnR3X3ByZWFtYmxlID0gUFJFQU1CTEVfTE9ORzsvKiBsb25nLCBzaG9ydCwgYXV0byAqLwotc3RhdGljIGludCBydHdfc2Nhbl9tb2RlID0gMTsvKiBhY3RpdmUsIHBhc3NpdmUgKi8KLXN0YXRpYyBpbnQgcnR3X2FkaG9jX3R4X3B3ciA9IDE7Ci1zdGF0aWMgaW50IHJ0d19zb2Z0X2FwOwotc3RhdGljIGludCBydHdfcG93ZXJfbWdudCA9IDE7Ci1zdGF0aWMgaW50IHJ0d19pcHNfbW9kZSA9IElQU19OT1JNQUw7Ci0KLXN0YXRpYyBpbnQgcnR3X3NtYXJ0X3BzID0gMjsKLQotbW9kdWxlX3BhcmFtKHJ0d19pcHNfbW9kZSwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MocnR3X2lwc19tb2RlLCAiVGhlIGRlZmF1bHQgSVBTIG1vZGUiKTsKLQotc3RhdGljIGludCBydHdfbG9uZ19yZXRyeV9sbXQgPSA3Owotc3RhdGljIGludCBydHdfc2hvcnRfcmV0cnlfbG10ID0gNzsKLXN0YXRpYyBpbnQgcnR3X2J1c3lfdGhyZXNoID0gNDA7Ci1zdGF0aWMgaW50IHJ0d19hY2tfcG9saWN5ID0gTk9STUFMX0FDSzsKLQotc3RhdGljIGludCBydHdfYWNtX21ldGhvZDsvKiAgMDpCeSBTVyAxOkJ5IEhXLiAqLwotCi1zdGF0aWMgaW50IHJ0d193bW1fZW5hYmxlID0gMTsvKiAgZGVmYXVsdCBpcyBzZXQgdG8gZW5hYmxlIHRoZSB3bW0uICovCi1zdGF0aWMgaW50IHJ0d191YXBzZF9lbmFibGU7Ci0KLXN0YXRpYyBpbnQgcnR3X2h0X2VuYWJsZSA9IDE7Ci0vKiAwIDpkaWFibGUsIGJpdCgwKTogZW5hYmxlIDIuNGcsIGJpdCgxKTogZW5hYmxlIDVnICovCi1zdGF0aWMgaW50IHJ0d19jYnc0MF9lbmFibGUgPSAzOwotc3RhdGljIGludCBydHdfYW1wZHVfZW5hYmxlID0gMTsvKiBmb3IgZW5hYmxlIHR4X2FtcGR1ICovCi0vKiAgMDogZGlzYWJsZSwgYml0KDApOmVuYWJsZSAyLjRnLCBiaXQoMSk6ZW5hYmxlIDVnLCBkZWZhdWx0IGlzIHNldCB0byBlbmFibGUKLSAqIDIuNEdIWiBmb3IgSU9UIGlzc3VlIHdpdGggYnVmZmxhbydzIEFQIGF0IDVHSFoKLSAqLwotc3RhdGljIGludCBydHdfcnhfc3RiYyA9IDE7Ci1zdGF0aWMgaW50IHJ0d19hbXBkdV9hbXNkdTsvKiAgMDogZGlzYWJsZWQsIDE6ZW5hYmxlZCwgMjphdXRvICovCi0KLS8qIFVzZSAyIHBhdGggVHggdG8gdHJhbnNtaXQgTUNTMH43IGFuZCBsZWdhY3kgbW9kZSAqLwotc3RhdGljIGludCBydHdfbG93cmF0ZV90d29feG1pdCA9IDE7Ci0KLS8qIGludCByZl9jb25maWcgPSBSRl8xVDJSOyAgMVQyUiAqLwotc3RhdGljIGludCBydHdfcmZfY29uZmlnID0gUkZfODE5WF9NQVhfVFlQRTsgIC8qIGF1dG8gKi8KLXN0YXRpYyBpbnQgcnR3X2xvd19wb3dlcjsKLXN0YXRpYyBpbnQgcnR3X3dpZmlfc3BlYzsKLXN0YXRpYyBpbnQgcnR3X2NoYW5uZWxfcGxhbiA9IFJUX0NIQU5ORUxfRE9NQUlOX01BWDsKLQotI2lmZGVmIENPTkZJR184NzIzQVVfQlRfQ09FWElTVAotc3RhdGljIGludCBydHdfYnRjb2V4X2VuYWJsZSA9IDE7Ci1zdGF0aWMgaW50IHJ0d19idF9pc28gPSAyOy8qICAwOkxvdywgMTpIaWdoLCAyOkZyb20gRWZ1c2UgKi8KLS8qICAwOklkbGUsIDE6Tm9uZS1TQ08sIDI6U0NPLCAzOkZyb20gQ291bnRlciwgNC5CdXN5LCA1Lk90aGVyQnVzeSAqLwotc3RhdGljIGludCBydHdfYnRfc2NvID0gMzsKLS8qICAwOkRpc2FibGUgQlQgY29udHJvbCBBLU1QRFUsIDE6RW5hYmxlIEJUIGNvbnRyb2wgQS1NUERVLiAqLwotc3RhdGljIGludCBydHdfYnRfYW1wZHUgPSAxOwotI2VuZGlmCi0KLS8qICAwOlJlamVjdCBBUCdzIEFkZCBCQSByZXEsIDE6QWNjZXB0IEFQJ3MgQWRkIEJBIHJlcS4gKi8KLXN0YXRpYyBpbnQgcnR3X0FjY2VwdEFkZGJhUmVxID0gdHJ1ZTsKLQotc3RhdGljIGludCBydHdfYW50ZGl2X2NmZyA9IDI7IC8qICAwOk9GRiAsIDE6T04sIDI6ZGVjaWRlIGJ5IEVmdXNlIGNvbmZpZyAqLwotc3RhdGljIGludCBydHdfYW50ZGl2X3R5cGU7IC8qIDA6ZGVjaWRlIGJ5IGVmdXNlICovCi0KLXN0YXRpYyBpbnQgcnR3X2VudXNic3M7LyogMDpkaXNhYmxlLCAxOmVuYWJsZSAqLwotCi1zdGF0aWMgaW50IHJ0d19od3Bkbl9tb2RlID0gMjsvKiAwOmRpc2FibGUsIDE6ZW5hYmxlLCAyOiBieSBFRlVTRSBjb25maWcgKi8KLQotc3RhdGljIGludCBydHdfaHdwd3JwX2RldGVjdDsgLyogSFcgcG93ZXIgIHBpbmcgZGV0ZWN0IDA6ZGlzYWJsZSAsIDE6ZW5hYmxlICovCi0KLXN0YXRpYyBpbnQgcnR3X2h3X3dwc19wYmMgPSAxOwotCi1zdGF0aWMgaW50IHJ0d184MDIxMWQ7Ci0KLXN0YXRpYyBpbnQgcnR3X3JlZ3VsYXRvcnlfaWQgPSAweGZmOy8qICBSZWd1bGF0b3J5IHRhYiBpZCwgMHhmZiA9IGZvbGxvdyBlZnVzZSdzIHNldHRpbmcgKi8KLQotbW9kdWxlX3BhcmFtKHJ0d19yZWd1bGF0b3J5X2lkLCBpbnQsIDA2NDQpOwotCi1zdGF0aWMgY2hhciAqaWZuYW1lID0gIndsYW4lZCI7Ci1tb2R1bGVfcGFyYW0oaWZuYW1lLCBjaGFycCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGlmbmFtZSwgIlRoZSBkZWZhdWx0IG5hbWUgdG8gYWxsb2NhdGUgZm9yIGZpcnN0IGludGVyZmFjZSIpOwotCi1zdGF0aWMgY2hhciAqaWYybmFtZSA9ICJ3bGFuJWQiOwotbW9kdWxlX3BhcmFtKGlmMm5hbWUsIGNoYXJwLCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoaWYybmFtZSwgIlRoZSBkZWZhdWx0IG5hbWUgdG8gYWxsb2NhdGUgZm9yIHNlY29uZCBpbnRlcmZhY2UiKTsKLQotbW9kdWxlX3BhcmFtKHJ0d19jaGFubmVsX3BsYW4sIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X2NoaXBfdmVyc2lvbiwgaW50LCAwNjQ0KTsKLW1vZHVsZV9wYXJhbShydHdfcmZpbnRmcywgaW50LCAwNjQ0KTsKLW1vZHVsZV9wYXJhbShydHdfY2hhbm5lbCwgaW50LCAwNjQ0KTsKLW1vZHVsZV9wYXJhbShydHdfd21tX2VuYWJsZSwgaW50LCAwNjQ0KTsKLW1vZHVsZV9wYXJhbShydHdfdnJ0bF9jYXJyaWVyX3NlbnNlLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d192Y3NfdHlwZSwgaW50LCAwNjQ0KTsKLW1vZHVsZV9wYXJhbShydHdfYnVzeV90aHJlc2gsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X2h0X2VuYWJsZSwgaW50LCAwNjQ0KTsKLW1vZHVsZV9wYXJhbShydHdfY2J3NDBfZW5hYmxlLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19hbXBkdV9lbmFibGUsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X3J4X3N0YmMsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X2FtcGR1X2Ftc2R1LCBpbnQsIDA2NDQpOwotCi1tb2R1bGVfcGFyYW0ocnR3X2xvd3JhdGVfdHdvX3htaXQsIGludCwgMDY0NCk7Ci0KLW1vZHVsZV9wYXJhbShydHdfcmZfY29uZmlnLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19wb3dlcl9tZ250LCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19zbWFydF9wcywgaW50LCAwNjQ0KTsKLW1vZHVsZV9wYXJhbShydHdfbG93X3Bvd2VyLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d193aWZpX3NwZWMsIGludCwgMDY0NCk7Ci0KLW1vZHVsZV9wYXJhbShydHdfYW50ZGl2X2NmZywgaW50LCAwNjQ0KTsKLQotbW9kdWxlX3BhcmFtKHJ0d19lbnVzYnNzLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19od3Bkbl9tb2RlLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19od3B3cnBfZGV0ZWN0LCBpbnQsIDA2NDQpOwotCi1tb2R1bGVfcGFyYW0ocnR3X2h3X3dwc19wYmMsIGludCwgMDY0NCk7Ci0KLXN0YXRpYyB1aW50IHJ0d19tYXhfcm9hbWluZ190aW1lcyA9IDI7Ci1tb2R1bGVfcGFyYW0ocnR3X21heF9yb2FtaW5nX3RpbWVzLCB1aW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MocnR3X21heF9yb2FtaW5nX3RpbWVzLCAiVGhlIG1heCByb2FtaW5nIHRpbWVzIHRvIHRyeSIpOwotCi1tb2R1bGVfcGFyYW0ocnR3XzgwMjExZCwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MocnR3XzgwMjExZCwgIkVuYWJsZSA4MDIuMTFkIG1lY2hhbmlzbSIpOwotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9CVF9DT0VYSVNUCi1tb2R1bGVfcGFyYW0ocnR3X2J0Y29leF9lbmFibGUsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHJ0d19idGNvZXhfZW5hYmxlLCAiRW5hYmxlIEJUIGNvLWV4aXN0ZW5jZSBtZWNoYW5pc20iKTsKLSNlbmRpZgotCi1zdGF0aWMgdWludCBydHdfbm90Y2hfZmlsdGVyOwotbW9kdWxlX3BhcmFtKHJ0d19ub3RjaF9maWx0ZXIsIHVpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhydHdfbm90Y2hfZmlsdGVyLCAiMDpEaXNhYmxlLCAxOkVuYWJsZSwgMjpFbmFibGUgb25seSBmb3IgUDJQIik7Ci1tb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsIHJ0d19kZWJ1ZywgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJTZXQgZGVidWcgbGV2ZWwgKDEtOSkgKGRlZmF1bHQgMSkiKTsKLQotc3RhdGljIGludCBuZXRkZXZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXYpOwotCi1zdGF0aWMgdm9pZCBsb2FkcGFyYW0oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgIHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2KQotewotCXN0cnVjdCByZWdpc3RyeV9wcml2ICAqcmVnaXN0cnlfcGFyID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0KLQlHbG9iYWxEZWJ1Z0xldmVsMjNBID0gcnR3X2RlYnVnOwotCXJlZ2lzdHJ5X3Bhci0+Y2hpcF92ZXJzaW9uID0gKHU4KXJ0d19jaGlwX3ZlcnNpb247Ci0JcmVnaXN0cnlfcGFyLT5yZmludGZzID0gKHU4KXJ0d19yZmludGZzOwotCW1lbWNweShyZWdpc3RyeV9wYXItPnNzaWQuc3NpZCwgIkFOWSIsIDMpOwotCXJlZ2lzdHJ5X3Bhci0+c3NpZC5zc2lkX2xlbiA9IDM7Ci0JcmVnaXN0cnlfcGFyLT5jaGFubmVsID0gKHU4KXJ0d19jaGFubmVsOwotCXJlZ2lzdHJ5X3Bhci0+d2lyZWxlc3NfbW9kZSA9ICh1OClydHdfd2lyZWxlc3NfbW9kZTsKLQlyZWdpc3RyeV9wYXItPnZydGxfY2Fycmllcl9zZW5zZSA9ICh1OClydHdfdnJ0bF9jYXJyaWVyX3NlbnNlOwotCXJlZ2lzdHJ5X3Bhci0+dmNzX3R5cGUgPSAodTgpcnR3X3Zjc190eXBlOwotCXJlZ2lzdHJ5X3Bhci0+cnRzX3RocmVzaCA9ICh1MTYpcnR3X3J0c190aHJlc2g7Ci0JcmVnaXN0cnlfcGFyLT5mcmFnX3RocmVzaCA9ICh1MTYpcnR3X2ZyYWdfdGhyZXNoOwotCXJlZ2lzdHJ5X3Bhci0+cHJlYW1ibGUgPSAodTgpcnR3X3ByZWFtYmxlOwotCXJlZ2lzdHJ5X3Bhci0+c2Nhbl9tb2RlID0gKHU4KXJ0d19zY2FuX21vZGU7Ci0JcmVnaXN0cnlfcGFyLT5hZGhvY190eF9wd3IgPSAodTgpcnR3X2FkaG9jX3R4X3B3cjsKLQlyZWdpc3RyeV9wYXItPnNvZnRfYXAgPSAgKHU4KXJ0d19zb2Z0X2FwOwotCXJlZ2lzdHJ5X3Bhci0+c21hcnRfcHMgPSAgKHU4KXJ0d19zbWFydF9wczsKLQlyZWdpc3RyeV9wYXItPnBvd2VyX21nbnQgPSAodTgpcnR3X3Bvd2VyX21nbnQ7Ci0JcmVnaXN0cnlfcGFyLT5pcHNfbW9kZSA9ICh1OClydHdfaXBzX21vZGU7Ci0JcmVnaXN0cnlfcGFyLT5sb25nX3JldHJ5X2xtdCA9ICh1OClydHdfbG9uZ19yZXRyeV9sbXQ7Ci0JcmVnaXN0cnlfcGFyLT5zaG9ydF9yZXRyeV9sbXQgPSAodTgpcnR3X3Nob3J0X3JldHJ5X2xtdDsKLQlyZWdpc3RyeV9wYXItPmJ1c3lfdGhyZXNoID0gKHUxNilydHdfYnVzeV90aHJlc2g7Ci0JcmVnaXN0cnlfcGFyLT5hY2tfcG9saWN5ID0gKHU4KXJ0d19hY2tfcG9saWN5OwotCXJlZ2lzdHJ5X3Bhci0+YWNtX21ldGhvZCA9ICh1OClydHdfYWNtX21ldGhvZDsKLQkgLyogVUFQU0QgKi8KLQlyZWdpc3RyeV9wYXItPndtbV9lbmFibGUgPSAodTgpcnR3X3dtbV9lbmFibGU7Ci0JcmVnaXN0cnlfcGFyLT51YXBzZF9lbmFibGUgPSAodTgpcnR3X3VhcHNkX2VuYWJsZTsKLQlyZWdpc3RyeV9wYXItPmh0X2VuYWJsZSA9ICh1OClydHdfaHRfZW5hYmxlOwotCXJlZ2lzdHJ5X3Bhci0+Y2J3NDBfZW5hYmxlID0gKHU4KXJ0d19jYnc0MF9lbmFibGU7Ci0JcmVnaXN0cnlfcGFyLT5hbXBkdV9lbmFibGUgPSAodTgpcnR3X2FtcGR1X2VuYWJsZTsKLQlyZWdpc3RyeV9wYXItPnJ4X3N0YmMgPSAodTgpcnR3X3J4X3N0YmM7Ci0JcmVnaXN0cnlfcGFyLT5hbXBkdV9hbXNkdSA9ICh1OClydHdfYW1wZHVfYW1zZHU7Ci0JcmVnaXN0cnlfcGFyLT5sb3dyYXRlX3R3b194bWl0ID0gKHU4KXJ0d19sb3dyYXRlX3R3b194bWl0OwotCXJlZ2lzdHJ5X3Bhci0+cmZfY29uZmlnID0gKHU4KXJ0d19yZl9jb25maWc7Ci0JcmVnaXN0cnlfcGFyLT5sb3dfcG93ZXIgPSAodTgpcnR3X2xvd19wb3dlcjsKLQlyZWdpc3RyeV9wYXItPndpZmlfc3BlYyA9ICh1OClydHdfd2lmaV9zcGVjOwotCXJlZ2lzdHJ5X3Bhci0+Y2hhbm5lbF9wbGFuID0gKHU4KXJ0d19jaGFubmVsX3BsYW47Ci0jaWZkZWYgQ09ORklHXzg3MjNBVV9CVF9DT0VYSVNUCi0JcmVnaXN0cnlfcGFyLT5idGNvZXggPSAodTgpcnR3X2J0Y29leF9lbmFibGU7Ci0JcmVnaXN0cnlfcGFyLT5idF9pc28gPSAodTgpcnR3X2J0X2lzbzsKLQlyZWdpc3RyeV9wYXItPmJ0X3NjbyA9ICh1OClydHdfYnRfc2NvOwotCXJlZ2lzdHJ5X3Bhci0+YnRfYW1wZHUgPSAodTgpcnR3X2J0X2FtcGR1OwotI2VuZGlmCi0JcmVnaXN0cnlfcGFyLT5iQWNjZXB0QWRkYmFSZXEgPSAodTgpcnR3X0FjY2VwdEFkZGJhUmVxOwotCXJlZ2lzdHJ5X3Bhci0+YW50ZGl2X2NmZyA9ICh1OClydHdfYW50ZGl2X2NmZzsKLQlyZWdpc3RyeV9wYXItPmFudGRpdl90eXBlID0gKHU4KXJ0d19hbnRkaXZfdHlwZTsKLQotCS8qIDA6ZGlzYWJsZSwgMTplbmFibGUsIDI6YnkgRUZVU0UgY29uZmlnICovCi0JcmVnaXN0cnlfcGFyLT5od3Bkbl9tb2RlID0gKHU4KXJ0d19od3Bkbl9tb2RlOwotCS8qIDA6ZGlzYWJsZSwgMTplbmFibGUgKi8KLQlyZWdpc3RyeV9wYXItPmh3cHdycF9kZXRlY3QgPSAodTgpcnR3X2h3cHdycF9kZXRlY3Q7Ci0JcmVnaXN0cnlfcGFyLT5od193cHNfcGJjID0gKHU4KXJ0d19od193cHNfcGJjOwotCXJlZ2lzdHJ5X3Bhci0+bWF4X3JvYW1pbmdfdGltZXMgPSAodTgpcnR3X21heF9yb2FtaW5nX3RpbWVzOwotCXJlZ2lzdHJ5X3Bhci0+ZW5hYmxlODAyMTFkID0gKHU4KXJ0d184MDIxMWQ7Ci0Jc25wcmludGYocmVnaXN0cnlfcGFyLT5pZm5hbWUsIDE2LCAiJXMiLCBpZm5hbWUpOwotCXNucHJpbnRmKHJlZ2lzdHJ5X3Bhci0+aWYybmFtZSwgMTYsICIlcyIsIGlmMm5hbWUpOwotCXJlZ2lzdHJ5X3Bhci0+bm90Y2hfZmlsdGVyID0gKHU4KXJ0d19ub3RjaF9maWx0ZXI7Ci0JcmVnaXN0cnlfcGFyLT5yZWd1bGF0b3J5X3RpZCA9ICh1OClydHdfcmVndWxhdG9yeV9pZDsKLX0KLQotc3RhdGljIGludCBydHdfbmV0X3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldiwgdm9pZCAqcCkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYocG5ldGRldik7Ci0Jc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKLQotCWlmICghcGFkYXB0ZXItPmJ1cCkKLQkJZXRoZXJfYWRkcl9jb3B5KHBhZGFwdGVyLT5lZXByb21wcml2Lm1hY19hZGRyLCBhZGRyLT5zYV9kYXRhKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpydHdfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldikKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYocG5ldGRldik7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYgPSAmcGFkYXB0ZXItPnJlY3Zwcml2OwotCi0JcGFkYXB0ZXItPnN0YXRzLnR4X3BhY2tldHMgPSBweG1pdHByaXYtPnR4X3BrdHM7Ci0JcGFkYXB0ZXItPnN0YXRzLnJ4X3BhY2tldHMgPSBwcmVjdnByaXYtPnJ4X3BrdHM7Ci0JcGFkYXB0ZXItPnN0YXRzLnR4X2Ryb3BwZWQgPSBweG1pdHByaXYtPnR4X2Ryb3A7Ci0JcGFkYXB0ZXItPnN0YXRzLnJ4X2Ryb3BwZWQgPSBwcmVjdnByaXYtPnJ4X2Ryb3A7Ci0JcGFkYXB0ZXItPnN0YXRzLnR4X2J5dGVzID0gcHhtaXRwcml2LT50eF9ieXRlczsKLQlwYWRhcHRlci0+c3RhdHMucnhfYnl0ZXMgPSBwcmVjdnByaXYtPnJ4X2J5dGVzOwotCi0JcmV0dXJuICZwYWRhcHRlci0+c3RhdHM7Ci19Ci0KLS8qCi0gKiBBQyB0byBxdWV1ZSBtYXBwaW5nCi0gKgotICogQUNfVk8gLT4gcXVldWUgMAotICogQUNfVkkgLT4gcXVldWUgMQotICogQUNfQkUgLT4gcXVldWUgMgotICogQUNfQksgLT4gcXVldWUgMwotICovCi1zdGF0aWMgY29uc3QgdTE2IHJ0d18xZF90b19xdWV1ZVs4XSA9IHsgMiwgMywgMywgMiwgMSwgMSwgMCwgMCB9OwotCi0vKiBHaXZlbiBhIGRhdGEgZnJhbWUgZGV0ZXJtaW5lIHRoZSA4MDIuMXAvMWQgdGFnIHRvIHVzZS4gKi8KLXN0YXRpYyB1MzIgcnR3X2NsYXNzaWZ5ODAyMWQoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQl1MzIgZHNjcDsKLQotCS8qIHNrYi0+cHJpb3JpdHkgdmFsdWVzIGZyb20gMjU2LT4yNjMgYXJlIG1hZ2ljIHZhbHVlcyB0bwotCSAqIGRpcmVjdGx5IGluZGljYXRlIGEgc3BlY2lmaWMgODAyLjFkIHByaW9yaXR5LiAgVGhpcyBpcyB1c2VkCi0JICogdG8gYWxsb3cgODAyLjFkIHByaW9yaXR5IHRvIGJlIHBhc3NlZCBkaXJlY3RseSBpbiBmcm9tIFZMQU4KLQkgKiB0YWdzLCBldGMuCi0JICovCi0JaWYgKHNrYi0+cHJpb3JpdHkgPj0gMjU2ICYmIHNrYi0+cHJpb3JpdHkgPD0gMjYzKQotCQlyZXR1cm4gc2tiLT5wcmlvcml0eSAtIDI1NjsKLQlzd2l0Y2ggKHNrYi0+cHJvdG9jb2wpIHsKLQljYXNlIGh0b25zKEVUSF9QX0lQKToKLQkJZHNjcCA9IGlwX2hkcihza2IpLT50b3MgJiAweGZjOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIGRzY3AgPj4gNTsKLX0KLQotc3RhdGljIHUxNiBydHdfc2VsZWN0X3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgdm9pZCAqYWNjZWxfcHJpdiwKLQkJCSAgICBzZWxlY3RfcXVldWVfZmFsbGJhY2tfdCBmYWxsYmFjaykKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCi0Jc2tiLT5wcmlvcml0eSA9IHJ0d19jbGFzc2lmeTgwMjFkKHNrYik7Ci0KLQlpZiAocG1sbWVwcml2LT5hY21fbWFzayAhPSAwKQotCQlza2ItPnByaW9yaXR5ID0gcW9zX2FjbTIzYShwbWxtZXByaXYtPmFjbV9tYXNrLCBza2ItPnByaW9yaXR5KTsKLQlyZXR1cm4gcnR3XzFkX3RvX3F1ZXVlW3NrYi0+cHJpb3JpdHldOwotfQotCi11MTYgcnR3X3JlY3Zfc2VsZWN0X3F1ZXVlMjNhKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGlwaGRyICpwaXBoZHI7Ci0Jc3RydWN0IGV0aGhkciAqZXRoID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7Ci0JdW5zaWduZWQgaW50IGRzY3A7Ci0JdTE2IGV0aF90eXBlID0gZ2V0X3VuYWxpZ25lZF9iZTE2KCZldGgtPmhfcHJvdG8pOwotCXUzMiBwcmlvcml0eTsKLQl1OCAqcGRhdGEgPSBza2ItPmRhdGE7Ci0KLQlzd2l0Y2ggKGV0aF90eXBlKSB7Ci0JY2FzZSBFVEhfUF9JUDoKLQkJcGlwaGRyID0gKHN0cnVjdCBpcGhkciAqKShwZGF0YSArIEVUSF9ITEVOKTsKLQkJZHNjcCA9IHBpcGhkci0+dG9zICYgMHhmYzsKLQkJcHJpb3JpdHkgPSBkc2NwID4+IDU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW9yaXR5ID0gMDsKLQl9Ci0JcmV0dXJuIHJ0d18xZF90b19xdWV1ZVtwcmlvcml0eV07Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgcnR3X25ldGRldl9vcHMgPSB7Ci0JLm5kb19vcGVuID0gbmV0ZGV2X29wZW4yM2EsCi0JLm5kb19zdG9wID0gbmV0ZGV2X2Nsb3NlLAotCS5uZG9fc3RhcnRfeG1pdCA9IHJ0d194bWl0MjNhX2VudHJ5MjNhLAotCS5uZG9fc2VsZWN0X3F1ZXVlID0gcnR3X3NlbGVjdF9xdWV1ZSwKLQkubmRvX3NldF9tYWNfYWRkcmVzcyA9IHJ0d19uZXRfc2V0X21hY19hZGRyZXNzLAotCS5uZG9fZ2V0X3N0YXRzID0gcnR3X25ldF9nZXRfc3RhdHMsCi19OwotCi1pbnQgcnR3X2luaXRfbmV0ZGV2MjNhX25hbWUyM2Eoc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXYsIGNvbnN0IGNoYXIgKmlmbmFtZSkKLXsKLQlpZiAoZGV2X2FsbG9jX25hbWUocG5ldGRldiwgaWZuYW1lKSA8IDApIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9lcnJfLAotCQkJICJkZXZfYWxsb2NfbmFtZSwgZmFpbCFcbiIpOwotCX0KLQluZXRpZl9jYXJyaWVyX29mZihwbmV0ZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZpY2VfdHlwZSB3bGFuX3R5cGUgPSB7Ci0JLm5hbWUgPSAid2xhbiIsCi19OwotCi1zdHJ1Y3QgbmV0X2RldmljZSAqcnR3X2luaXRfbmV0ZGV2MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqb2xkX3BhZGFwdGVyKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXI7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXY7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAiK2luaXRfbmV0X2RldlxuIik7Ci0KLQlwbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXZfbXEoc2l6ZW9mKHN0cnVjdCBydHdfYWRhcHRlciksIDQpOwotCWlmICghcG5ldGRldikKLQkJcmV0dXJuIE5VTEw7Ci0KLQlwbmV0ZGV2LT5kZXYudHlwZSA9ICZ3bGFuX3R5cGU7Ci0JcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihwbmV0ZGV2KTsKLQlwYWRhcHRlci0+cG5ldGRldiA9IHBuZXRkZXY7Ci0KLQlEQkdfODcyM0EoInJlZ2lzdGVyIHJ0d19uZXRkZXZfb3BzIHRvIG5ldGRldl9vcHNcbiIpOwotCXBuZXRkZXYtPm5ldGRldl9vcHMgPSAmcnR3X25ldGRldl9vcHM7Ci0KLQlwbmV0ZGV2LT53YXRjaGRvZ190aW1lbyA9IEhaKjM7IC8qIDMgc2Vjb25kIHRpbWVvdXQgKi8KLQotCWxvYWRwYXJhbShwYWRhcHRlciwgcG5ldGRldik7Ci0JcmV0dXJuIHBuZXRkZXY7Ci19Ci0KLXN0YXRpYyBpbnQgcnR3X2luaXRfZGVmYXVsdF92YWx1ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVnaXN0cnlwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0KLQkvKiB4bWl0X3ByaXYgKi8KLQlweG1pdHByaXYtPnZjcyA9IHByZWdpc3RyeXByaXYtPnZjc190eXBlOwotCS8qIHB4bWl0cHJpdi0+cnRzX3RocmVzaCA9IHByZWdpc3RyeXByaXYtPnJ0c190aHJlc2g7ICovCi0JcHhtaXRwcml2LT5mcmFnX2xlbiA9IHByZWdpc3RyeXByaXYtPmZyYWdfdGhyZXNoOwotCi0JLyogbWxtZV9wcml2ICovCi0JcG1sbWVwcml2LT5zY2FuX2ludGVydmFsID0gU0NBTl9JTlRFUlZBTDsvKiAgMzAqMiBzZWMgPSA2MHNlYyAqLwotCXBtbG1lcHJpdi0+c2Nhbl9tb2RlID0gU0NBTl9BQ1RJVkU7Ci0KLQkvKiBodF9wcml2ICovCi0JcG1sbWVwcml2LT5odHByaXYuYW1wZHVfZW5hYmxlID0gZmFsc2U7Lyogc2V0IHRvIGRpc2FibGVkICovCi0KLQkvKiBzZWN1cml0eV9wcml2ICovCi0JcHNlY3VyaXR5cHJpdi0+Ymluc3RhbGxHcnBrZXkgPSAwOwotCi0JIC8qIG9wZW4gc3lzdGVtICovCi0JcHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSA9IGRvdDExQXV0aEFsZ3J0aG1fT3BlbjsKLQlwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtID0gMDsKLQotCXBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUtleUluZGV4ID0gMDsKLQotCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5ID0gMDsKLQlwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwS2V5aWQgPSAxOwotCi0JcHNlY3VyaXR5cHJpdi0+bmRpc2F1dGh0eXBlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKLQlwc2VjdXJpdHlwcml2LT5uZGlzZW5jcnlwdHN0YXR1cyA9IE5kaXM4MDJfMTFXRVBEaXNhYmxlZDsKLQotCS8qIHJlZ2lzdHJ5X3ByaXYgKi8KLQlydHdfaW5pdF9yZWdpc3RyeXByaXZfZGV2X25ldHdvcmsyM2EocGFkYXB0ZXIpOwotCXJ0d191cGRhdGVfcmVnaXN0cnlwcml2X2Rldl9uZXR3b3JrMjNhKHBhZGFwdGVyKTsKLQotCS8qIGhhbF9wcml2ICovCi0JcnRsODcyM2FfaW5pdF9kZWZhdWx0X3ZhbHVlKHBhZGFwdGVyKTsKLQotCS8qIG1pc2MuICovCi0JcGFkYXB0ZXItPmJSZWFkUG9ydENhbmNlbCA9IGZhbHNlOwotCXBhZGFwdGVyLT5iV3JpdGVQb3J0Q2FuY2VsID0gZmFsc2U7Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1pbnQgcnR3X3Jlc2V0X2Rydl9zdzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdyY3RybHByaXYgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwotCi0JLyogaGFsX3ByaXYgKi8KLQlydGw4NzIzYV9pbml0X2RlZmF1bHRfdmFsdWUocGFkYXB0ZXIpOwotCXBhZGFwdGVyLT5iUmVhZFBvcnRDYW5jZWwgPSBmYWxzZTsKLQlwYWRhcHRlci0+YldyaXRlUG9ydENhbmNlbCA9IGZhbHNlOwotCXBtbG1lcHJpdi0+c2Nhbl9pbnRlcnZhbCA9IFNDQU5fSU5URVJWQUw7LyogIDMwKjIgc2VjID0gNjBzZWMgKi8KLQotCXBhZGFwdGVyLT54bWl0cHJpdi50eF9wa3RzID0gMDsKLQlwYWRhcHRlci0+cmVjdnByaXYucnhfcGt0cyA9IDA7Ci0KLQlwbWxtZXByaXYtPkxpbmtEZXRlY3RJbmZvLmJCdXN5VHJhZmZpYyA9IGZhbHNlOwotCi0JX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIF9GV19VTkRFUl9TVVJWRVkgfCBfRldfVU5ERVJfTElOS0lORyk7Ci0KLQlydHdfc3Jlc2V0X3Jlc2V0X3ZhbHVlKHBhZGFwdGVyKTsKLQlwd3JjdHJscHJpdi0+cHdyX3N0YXRlX2NoZWNrX2NudHMgPSAwOwotCi0JLyogbWxtZWV4dHByaXYgKi8KLQlwYWRhcHRlci0+bWxtZWV4dHByaXYuc2l0ZXN1cnZleV9yZXMuc3RhdGUgPSBTQ0FOX0RJU0FCTEU7Ci0KLQlydHdfc2V0X3NpZ25hbF9zdGF0X3RpbWVyKCZwYWRhcHRlci0+cmVjdnByaXYpOwotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotaW50IHJ0d19pbml0X2Rydl9zdzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCWludCByZXQ4ID0gX1NVQ0NFU1M7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAiK3J0d19pbml0X2Rydl9zdzIzYVxuIik7Ci0KLQlpZiAocnR3X2luaXRfY21kX3ByaXYyM2EoJnBhZGFwdGVyLT5jbWRwcml2KSA9PSBfRkFJTCkgewotCQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIkNhbid0IGluaXQgY21kX3ByaXZcbiIpOwotCQlyZXQ4ID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwYWRhcHRlci0+Y21kcHJpdi5wYWRhcHRlciA9IHBhZGFwdGVyOwotCi0JaWYgKHJ0d19pbml0X2V2dF9wcml2MjNhKCZwYWRhcHRlci0+ZXZ0cHJpdikgPT0gX0ZBSUwpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9lcnJfLAotCQkJICJDYW4ndCBpbml0IGV2dF9wcml2XG4iKTsKLQkJcmV0OCA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKHJ0d19pbml0X21sbWVfcHJpdjIzYShwYWRhcHRlcikgPT0gX0ZBSUwpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9lcnJfLAotCQkJICJDYW4ndCBpbml0IG1sbWVfcHJpdlxuIik7Ci0JCXJldDggPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCi0JaWYgKGluaXRfbWxtZV9leHRfcHJpdjIzYShwYWRhcHRlcikgPT0gX0ZBSUwpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9lcnJfLAotCQkJICJDYW4ndCBpbml0IG1sbWVfZXh0X3ByaXZcbiIpOwotCQlyZXQ4ID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAoX3J0d19pbml0X3htaXRfcHJpdjIzYSgmcGFkYXB0ZXItPnhtaXRwcml2LCBwYWRhcHRlcikgPT0gX0ZBSUwpIHsKLQkJREJHXzg3MjNBKCJDYW4ndCBfcnR3X2luaXRfeG1pdF9wcml2MjNhXG4iKTsKLQkJcmV0OCA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKF9ydHdfaW5pdF9yZWN2X3ByaXYyM2EoJnBhZGFwdGVyLT5yZWN2cHJpdiwgcGFkYXB0ZXIpID09IF9GQUlMKSB7Ci0JCURCR184NzIzQSgiQ2FuJ3QgX3J0d19pbml0X3JlY3ZfcHJpdjIzYVxuIik7Ci0JCXJldDggPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCWlmIChfcnR3X2luaXRfc3RhX3ByaXYyM2EoJnBhZGFwdGVyLT5zdGFwcml2KSA9PSBfRkFJTCkgewotCQlEQkdfODcyM0EoIkNhbid0IF9ydHdfaW5pdF9zdGFfcHJpdjIzYVxuIik7Ci0JCXJldDggPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXBhZGFwdGVyLT5zdGFwcml2LnBhZGFwdGVyID0gcGFkYXB0ZXI7Ci0JcGFkYXB0ZXItPnNldGJhbmQgPSBHSFoyNF81MDsKLQlydHdfaW5pdF9iY21jX3N0YWluZm8yM2EocGFkYXB0ZXIpOwotCi0JcnR3X2luaXRfcHdyY3RybF9wcml2MjNhKHBhZGFwdGVyKTsKLQotCXJldDggPSBydHdfaW5pdF9kZWZhdWx0X3ZhbHVlKHBhZGFwdGVyKTsKLQotCXJ0bDg3MjNhX2luaXRfZG1fcHJpdihwYWRhcHRlcik7Ci0KLQlydHdfc3Jlc2V0X2luaXQocGFkYXB0ZXIpOwotCi1leGl0OgotCi0JUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgIi1ydHdfaW5pdF9kcnZfc3cyM2FcbiIpOwotCXJldHVybiByZXQ4OwotfQotCi12b2lkIHJ0d19jYW5jZWxfYWxsX3RpbWVyMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywKLQkJICIrcnR3X2NhbmNlbF9hbGxfdGltZXIyM2FcbiIpOwotCi0JZGVsX3RpbWVyX3N5bmMoJnBhZGFwdGVyLT5tbG1lcHJpdi5hc3NvY190aW1lcik7Ci0JUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywKLQkJICIlczpjYW5jZWwgYXNzb2NpYXRpb24gdGltZXIgY29tcGxldGUhXG4iLCBfX2Z1bmNfXyk7Ci0KLQlkZWxfdGltZXJfc3luYygmcGFkYXB0ZXItPm1sbWVwcml2LnNjYW5fdG9fdGltZXIpOwotCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sCi0JCSAiJXM6Y2FuY2VsIHNjYW5fdG9fdGltZXIhXG4iLCBfX2Z1bmNfXyk7Ci0KLQlkZWxfdGltZXJfc3luYygmcGFkYXB0ZXItPm1sbWVwcml2LmR5bmFtaWNfY2hrX3RpbWVyKTsKLQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLAotCQkgIiVzOmNhbmNlbCBkeW5hbWljX2Noa190aW1lciFcbiIsIF9fZnVuY19fKTsKLQotCWRlbF90aW1lcl9zeW5jKCZwYWRhcHRlci0+cHdyY3RybHByaXYucHdyX3N0YXRlX2NoZWNrX3RpbWVyKTsKLQotCWRlbF90aW1lcl9zeW5jKCZwYWRhcHRlci0+bWxtZXByaXYuc2V0X3NjYW5fZGVueV90aW1lcik7Ci0JcnR3X2NsZWFyX3NjYW5fZGVueShwYWRhcHRlcik7Ci0JUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywKLQkJICIlczpjYW5jZWwgc2V0X3NjYW5fZGVueV90aW1lciFcbiIsIF9fZnVuY19fKTsKLQotCWRlbF90aW1lcl9zeW5jKCZwYWRhcHRlci0+cmVjdnByaXYuc2lnbmFsX3N0YXRfdGltZXIpOwotfQotCi1pbnQgcnR3X2ZyZWVfZHJ2X3N3MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgIj09PnJ0d19mcmVlX2Rydl9zdzIzYVxuIik7Ci0KLQlmcmVlX21sbWVfZXh0X3ByaXYyM2EoJnBhZGFwdGVyLT5tbG1lZXh0cHJpdik7Ci0KLQlydHdfZnJlZV9ldnRfcHJpdjIzYSgmcGFkYXB0ZXItPmV2dHByaXYpOwotCi0JcnR3X2ZyZWVfbWxtZV9wcml2MjNhKCZwYWRhcHRlci0+bWxtZXByaXYpOwotCi0JX3J0d19mcmVlX3htaXRfcHJpdjIzYSgmcGFkYXB0ZXItPnhtaXRwcml2KTsKLQotCS8qIHdpbGwgZnJlZSBiY21jX3N0YWluZm8gaGVyZSAqLwotCV9ydHdfZnJlZV9zdGFfcHJpdjIzYSgmcGFkYXB0ZXItPnN0YXByaXYpOwotCi0JX3J0d19mcmVlX3JlY3ZfcHJpdjIzYSgmcGFkYXB0ZXItPnJlY3Zwcml2KTsKLQotCXJ0d19mcmVlX3B3cmN0cmxfcHJpdihwYWRhcHRlcik7Ci0KLQlrZnJlZShwYWRhcHRlci0+SGFsRGF0YSk7Ci0JcGFkYXB0ZXItPkhhbERhdGEgPSBOVUxMOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgIi1ydHdfZnJlZV9kcnZfc3cyM2FcbiIpOwotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCBfcnR3X2Rydl9yZWdpc3Rlcl9uZXRkZXYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldiA9IHBhZGFwdGVyLT5wbmV0ZGV2OwotCWludCByZXQgPSBfU1VDQ0VTUzsKLQotCS8qIGFsbG9jIG5ldGRldiBuYW1lICovCi0JcnR3X2luaXRfbmV0ZGV2MjNhX25hbWUyM2EocG5ldGRldiwgbmFtZSk7Ci0KLQlldGhlcl9hZGRyX2NvcHkocG5ldGRldi0+ZGV2X2FkZHIsIHBhZGFwdGVyLT5lZXByb21wcml2Lm1hY19hZGRyKTsKLQotCS8qIFRlbGwgdGhlIG5ldHdvcmsgc3RhY2sgd2UgZXhpc3QgKi8KLQlpZiAocmVnaXN0ZXJfbmV0ZGV2KHBuZXRkZXYpKSB7Ci0JCURCR184NzIzQSgiJXMoJXMpOiBGYWlsZWQhXG4iLCBfX2Z1bmNfXywgcG5ldGRldi0+bmFtZSk7Ci0JCXJldCA9IF9GQUlMOwotCQlnb3RvIGVycm9yX3JlZ2lzdGVyX25ldGRldjsKLQl9Ci0JREJHXzg3MjNBKCIlcywgTUFDIEFkZHJlc3MgKGlmJWQpID0gJXBNXG4iLAotCQkgIF9fZnVuY19fLCBwYWRhcHRlci0+aWZhY2VfaWQgKyAxLCBwbmV0ZGV2LT5kZXZfYWRkcik7Ci0JcmV0dXJuIHJldDsKLQotZXJyb3JfcmVnaXN0ZXJfbmV0ZGV2OgotCi0JaWYgKHBhZGFwdGVyLT5pZmFjZV9pZCA+IElGQUNFX0lEMCkgewotCQlydHdfZnJlZV9kcnZfc3cyM2EocGFkYXB0ZXIpOwotCi0JCWZyZWVfbmV0ZGV2KHBuZXRkZXYpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgcnR3X2Rydl9yZWdpc3Rlcl9uZXRkZXYoc3RydWN0IHJ0d19hZGFwdGVyICppZjEpCi17Ci0Jc3RydWN0IGR2b2JqX3ByaXYgKmR2b2JqID0gaWYxLT5kdm9iajsKLQlpbnQgaSwgc3RhdHVzID0gX1NVQ0NFU1M7Ci0KLQlpZiAoZHZvYmotPmlmYWNlX251bXMgPj0gSUZBQ0VfSURfTUFYKSB7Ci0JCXN0YXR1cyA9IF9GQUlMOyAvKiAtRUlOVkFMICovCi0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZHZvYmotPmlmYWNlX251bXM7IGkrKykgewotCQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gZHZvYmotPnBhZGFwdGVyc1tpXTsKLQotCQlpZiAocGFkYXB0ZXIpIHsKLQkJCWNoYXIgKm5hbWU7Ci0KLQkJCWlmIChwYWRhcHRlci0+aWZhY2VfaWQgPT0gSUZBQ0VfSUQwKQotCQkJCW5hbWUgPSBpZjEtPnJlZ2lzdHJ5cHJpdi5pZm5hbWU7Ci0JCQllbHNlIGlmIChwYWRhcHRlci0+aWZhY2VfaWQgPT0gSUZBQ0VfSUQxKQotCQkJCW5hbWUgPSBpZjEtPnJlZ2lzdHJ5cHJpdi5pZjJuYW1lOwotCQkJZWxzZQotCQkJCW5hbWUgPSAid2xhbiVkIjsKLQkJCXN0YXR1cyA9IF9ydHdfZHJ2X3JlZ2lzdGVyX25ldGRldihwYWRhcHRlciwgbmFtZSk7Ci0JCQlpZiAoc3RhdHVzICE9IF9TVUNDRVNTKQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi1leGl0OgotCXJldHVybiBzdGF0dXM7Ci19Ci0KLWludCBuZXRkZXZfb3BlbjIzYShzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldikKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYocG5ldGRldik7Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdyY3RybHByaXY7Ci0JaW50IHJldCA9IDA7Ci0JaW50IHN0YXR1czsKLQotCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICIrODcxeF9kcnYgLSBkZXZfb3BlblxuIik7Ci0JREJHXzg3MjNBKCIrODcxeF9kcnYgLSBkcnZfb3BlbiwgYnVwID0lZFxuIiwgcGFkYXB0ZXItPmJ1cCk7Ci0KLQltdXRleF9sb2NrKCZhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKS0+aHdfaW5pdF9tdXRleCk7Ci0KLQlwd3JjdHJscHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0KLQlpZiAoIXBhZGFwdGVyLT5idXApIHsKLQkJcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkID0gZmFsc2U7Ci0JCXBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID0gZmFsc2U7Ci0JCXBhZGFwdGVyLT5iQ2FyZERpc2FibGVXT0hTTSA9IGZhbHNlOwotCi0JCXN0YXR1cyA9IHJ0bDg3MjNhdV9oYWxfaW5pdChwYWRhcHRlcik7Ci0JCWlmIChzdGF0dXMgPT0gX0ZBSUwpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfZXJyXywKLQkJCQkgInJ0bDg3MXhfaGFsX2luaXQoKTogQ2FuJ3QgaW5pdCBoL3chXG4iKTsKLQkJCWdvdG8gbmV0ZGV2X29wZW4yM2FfZXJyb3I7Ci0JCX0KLQotCQlEQkdfODcyM0EoIk1BQyBBZGRyZXNzID0gJXBNXG4iLCBwbmV0ZGV2LT5kZXZfYWRkcik7Ci0KLQkJaWYgKGluaXRfaHdfbWxtZV9leHQyM2EocGFkYXB0ZXIpID09IF9GQUlMKSB7Ci0JCQlEQkdfODcyM0EoImNhbid0IGluaXQgbWxtZV9leHRfcHJpdlxuIik7Ci0JCQlnb3RvIG5ldGRldl9vcGVuMjNhX2Vycm9yOwotCQl9Ci0KLQkJcnRsODcyM2F1X2luaXJwX2luaXQocGFkYXB0ZXIpOwotCi0JCXJ0d19jZmc4MDIxMV9pbml0X3dpcGh5KHBhZGFwdGVyKTsKLQotCQlwYWRhcHRlci0+YnVwID0gdHJ1ZTsKLQl9Ci0JcGFkYXB0ZXItPm5ldF9jbG9zZWQgPSBmYWxzZTsKLQotCW1vZF90aW1lcigmcGFkYXB0ZXItPm1sbWVwcml2LmR5bmFtaWNfY2hrX3RpbWVyLAotCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDIwMDApKTsKLQotCXBhZGFwdGVyLT5wd3JjdHJscHJpdi5iaXBzX3Byb2Nlc3NpbmcgPSBmYWxzZTsKLQlydHdfc2V0X3B3cl9zdGF0ZV9jaGVja190aW1lcigmcGFkYXB0ZXItPnB3cmN0cmxwcml2KTsKLQotCS8qIG5ldGlmX2NhcnJpZXJfb24ocG5ldGRldik7Y2FsbCB0aGlzIGZ1bmMgd2hlbgotCSAgIHJ0dzIzYV9qb2luYnNzX2V2ZW50X2NiIHJldHVybiBzdWNjZXNzICovCi0JaWYgKCFydHdfbmV0aWZfcXVldWVfc3RvcHBlZChwbmV0ZGV2KSkKLQkJbmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyhwbmV0ZGV2KTsKLQllbHNlCi0JCW5ldGlmX3R4X3dha2VfYWxsX3F1ZXVlcyhwbmV0ZGV2KTsKLQotCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICItODcxeF9kcnYgLSBkZXZfb3BlblxuIik7Ci0JREJHXzg3MjNBKCItODcxeF9kcnYgLSBkcnZfb3BlbiwgYnVwID0lZFxuIiwgcGFkYXB0ZXItPmJ1cCk7Ci1leGl0OgotCW11dGV4X3VubG9jaygmYWRhcHRlcl90b19kdm9iaihwYWRhcHRlciktPmh3X2luaXRfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci0KLW5ldGRldl9vcGVuMjNhX2Vycm9yOgotCXBhZGFwdGVyLT5idXAgPSBmYWxzZTsKLQotCW5ldGlmX2NhcnJpZXJfb2ZmKHBuZXRkZXYpOwotCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhwbmV0ZGV2KTsKLQotCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfZXJyXywKLQkJICItODcxeF9kcnYgLSBkZXZfb3BlbiwgZmFpbCFcbiIpOwotCURCR184NzIzQSgiLTg3MXhfZHJ2IC0gZHJ2X29wZW4gZmFpbCwgYnVwID0lZFxuIiwgcGFkYXB0ZXItPmJ1cCk7Ci0KLQlyZXQgPSAtMTsKLQlnb3RvIGV4aXQ7Ci19Ci0KLXN0YXRpYyBpbnQgaXBzX25ldGRydl9vcGVuKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JaW50IHN0YXR1cyA9IF9TVUNDRVNTOwotCi0JcGFkYXB0ZXItPm5ldF9jbG9zZWQgPSBmYWxzZTsKLQlEQkdfODcyM0EoIj09PT4gJXMuLi4uLi4uLi5cbiIsIF9fZnVuY19fKTsKLQotCXBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCA9IGZhbHNlOwotCXBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID0gZmFsc2U7Ci0JcGFkYXB0ZXItPmJDYXJkRGlzYWJsZVdPSFNNID0gZmFsc2U7Ci0KLQlzdGF0dXMgPSBydGw4NzIzYXVfaGFsX2luaXQocGFkYXB0ZXIpOwotCWlmIChzdGF0dXMgPT0gX0ZBSUwpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9lcnJfLAotCQkJICJpcHNfbmV0ZHJ2X29wZW4oKTogQ2FuJ3QgaW5pdCBoL3chXG4iKTsKLQkJZ290byBuZXRkZXZfb3BlbjIzYV9lcnJvcjsKLQl9Ci0KLQlydGw4NzIzYXVfaW5pcnBfaW5pdChwYWRhcHRlcik7Ci0KLQlydHdfc2V0X3B3cl9zdGF0ZV9jaGVja190aW1lcigmcGFkYXB0ZXItPnB3cmN0cmxwcml2KTsKLQltb2RfdGltZXIoJnBhZGFwdGVyLT5tbG1lcHJpdi5keW5hbWljX2Noa190aW1lciwKLQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1MDAwKSk7Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci0KLW5ldGRldl9vcGVuMjNhX2Vycm9yOgotCS8qIHBhZGFwdGVyLT5idXAgPSBmYWxzZTsgKi8KLQlEQkdfODcyM0EoIi1pcHNfbmV0ZHJ2X29wZW4gLSBkcnZfb3BlbiBmYWlsdXJlLCBidXAgPSVkXG4iLAotCQkgIHBhZGFwdGVyLT5idXApOwotCi0JcmV0dXJuIF9GQUlMOwotfQotCi1pbnQgcnR3X2lwc19wd3JfdXAyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlpbnQgcmVzdWx0OwotCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZSA9IGppZmZpZXM7Ci0KLQlEQkdfODcyM0EoIj09PT4gIHJ0d19pcHNfcHdyX3VwMjNhLi4uLi4uLi4uLi4uLi5cbiIpOwotCXJ0d19yZXNldF9kcnZfc3cyM2EocGFkYXB0ZXIpOwotCi0JcmVzdWx0ID0gaXBzX25ldGRydl9vcGVuKHBhZGFwdGVyKTsKLQotCURCR184NzIzQSgiPD09PSAgcnR3X2lwc19wd3JfdXAyM2EuLi4uLi4uLi4uLi4uLiBpbiAlZG1zXG4iLAotCQkgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0X3RpbWUpKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIHJ0d19pcHNfcHdyX2Rvd24yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0X3RpbWUgPSBqaWZmaWVzOwotCi0JREJHXzg3MjNBKCI9PT0+IHJ0d19pcHNfcHdyX2Rvd24yM2EuLi4uLi4uLi4uLi4uLi4uLi4uXG4iKTsKLQotCXBhZGFwdGVyLT5iQ2FyZERpc2FibGVXT0hTTSA9IHRydWU7Ci0JcGFkYXB0ZXItPm5ldF9jbG9zZWQgPSB0cnVlOwotCi0JcnR3X2lwc19kZXZfdW5sb2FkMjNhKHBhZGFwdGVyKTsKLQlwYWRhcHRlci0+YkNhcmREaXNhYmxlV09IU00gPSBmYWxzZTsKLQlEQkdfODcyM0EoIjw9PT0gcnR3X2lwc19wd3JfZG93bjIzYS4uLi4uLi4uLi4uLi4uLi4uLi4uLiBpbiAlZG1zXG4iLAotCQkgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0X3RpbWUpKTsKLX0KLQotdm9pZCBydHdfaXBzX2Rldl91bmxvYWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlydGw4NzIzYV9maWZvX2NsZWFudXAocGFkYXB0ZXIpOwotCi0JcnRsODcyM2FfdXNiX2ludGZfc3RvcChwYWRhcHRlcik7Ci0KLQkvKiBzNS4gKi8KLQlpZiAoIXBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKQotCQlydGw4NzIzYXVfaGFsX2RlaW5pdChwYWRhcHRlcik7Ci19Ci0KLWludCBwbV9uZXRkZXZfb3BlbjIzYShzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldiwgdTggYm5vcm1hbCkKLXsKLQlpbnQgc3RhdHVzOwotCi0JaWYgKGJub3JtYWwpCi0JCXN0YXR1cyA9IG5ldGRldl9vcGVuMjNhKHBuZXRkZXYpOwotCWVsc2UKLQkJc3RhdHVzID0gKF9TVUNDRVNTID09IGlwc19uZXRkcnZfb3BlbihuZXRkZXZfcHJpdihwbmV0ZGV2KSkpID8KLQkJCSAoMCkgOiAoLTEpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGludCBuZXRkZXZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXYpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KHBuZXRkZXYpOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgIis4NzF4X2RydiAtIGRydl9jbG9zZVxuIik7Ci0KLQlwYWRhcHRlci0+bmV0X2Nsb3NlZCA9IHRydWU7Ci0KLQlpZiAocGFkYXB0ZXItPnB3cmN0cmxwcml2LnJmX3B3cnN0YXRlID09IHJmX29uKSB7Ci0JCURCR184NzIzQSgiKDIpODcxeF9kcnYgLSBkcnZfY2xvc2UsIGJ1cCA9JWQsICIKLQkJCSAgImh3X2luaXRfY29tcGxldGVkID0lZFxuIiwgcGFkYXB0ZXItPmJ1cCwKLQkJCSAgcGFkYXB0ZXItPmh3X2luaXRfY29tcGxldGVkKTsKLQotCQkvKiBzMS4gKi8KLQkJaWYgKHBuZXRkZXYpIHsKLQkJCWlmICghcnR3X25ldGlmX3F1ZXVlX3N0b3BwZWQocG5ldGRldikpCi0JCQkJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKHBuZXRkZXYpOwotCQl9Ci0KLQkJLyogczIuICovCi0JCUxlYXZlQWxsUG93ZXJTYXZlTW9kZTIzYShwYWRhcHRlcik7Ci0JCXJ0d19kaXNhc3NvY19jbWQyM2EocGFkYXB0ZXIsIDUwMCwgZmFsc2UpOwotCQkvKiBzMi0yLiAgaW5kaWNhdGUgZGlzY29ubmVjdCB0byBvcyAqLwotCQlydHdfaW5kaWNhdGVfZGlzY29ubmVjdDIzYShwYWRhcHRlcik7Ci0JCS8qIHMyLTMuICovCi0JCXJ0d19mcmVlX2Fzc29jX3Jlc291cmNlczIzYShwYWRhcHRlciwgMSk7Ci0JCS8qIHMyLTQuICovCi0JCXJ0d19mcmVlX25ldHdvcmtfcXVldWUyM2EocGFkYXB0ZXIpOwotCX0KLQotCXJ0d19zY2FuX2Fib3J0MjNhKHBhZGFwdGVyKTsKLQotCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICItODcxeF9kcnYgLSBkcnZfY2xvc2VcbiIpOwotCURCR184NzIzQSgiLTg3MXhfZHJ2IC0gZHJ2X2Nsb3NlLCBidXAgPSVkXG4iLCBwYWRhcHRlci0+YnVwKTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIHJ0d19uZGV2X2Rlc3RydWN0b3Ioc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCi17Ci0JREJHXzg3MjNBKCIlcyglcylcbiIsIF9fZnVuY19fLCBuZGV2LT5uYW1lKTsKLQlrZnJlZShuZGV2LT5pZWVlODAyMTFfcHRyKTsKLQlmcmVlX25ldGRldihuZGV2KTsKLX0KLQotdm9pZCBfcnR3X2luaXRfcXVldWUyM2Eoc3RydWN0IHJ0d19xdWV1ZSAqcHF1ZXVlKQotewotCUlOSVRfTElTVF9IRUFEKCZwcXVldWUtPnF1ZXVlKTsKLQlzcGluX2xvY2tfaW5pdCgmcHF1ZXVlLT5sb2NrKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3JlY3ZfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3JlY3ZfbGludXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg0YjUwNi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC9yZWN2X2xpbnV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9SRUNWX09TREVQX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx3aWZpLmg+Ci0jaW5jbHVkZSA8cmVjdl9vc2RlcC5oPgotCi0jaW5jbHVkZSA8b3NkZXBfaW50Zi5oPgotCi0jaW5jbHVkZSA8dXNiX29wcy5oPgotCi12b2lkIHJ0d19oYW5kbGVfdGtpcF9taWNfZXJyMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJncm91cCkKLXsKLQllbnVtIG5sODAyMTFfa2V5X3R5cGUga2V5X3R5cGUgPSAwOwotCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKLQlzdHJ1Y3QgaXdfbWljaGFlbG1pY2ZhaWx1cmUgZXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ICA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQl1bnNpZ25lZCBsb25nIGN1cl90aW1lOwotCi0JaWYgKHBzZWN1cml0eXByaXYtPmxhc3RfbWljX2Vycl90aW1lID09IDApIHsKLQkJcHNlY3VyaXR5cHJpdi0+bGFzdF9taWNfZXJyX3RpbWUgPSBqaWZmaWVzOwotCX0gZWxzZSB7Ci0JCWN1cl90aW1lID0gamlmZmllczsKLQotCQlpZiAoY3VyX3RpbWUgLSBwc2VjdXJpdHlwcml2LT5sYXN0X21pY19lcnJfdGltZSA8IDYwKkhaKSB7Ci0JCQlwc2VjdXJpdHlwcml2LT5idGtpcF9jb3VudGVybWVhc3VyZSA9IHRydWU7Ci0JCQlwc2VjdXJpdHlwcml2LT5sYXN0X21pY19lcnJfdGltZSA9IDA7Ci0JCQlwc2VjdXJpdHlwcml2LT5idGtpcF9jb3VudGVybWVhc3VyZV90aW1lID0gY3VyX3RpbWU7Ci0JCX0gZWxzZSB7Ci0JCQlwc2VjdXJpdHlwcml2LT5sYXN0X21pY19lcnJfdGltZSA9IGppZmZpZXM7Ci0JCX0KLQl9Ci0KLQlpZiAoYmdyb3VwKQotCQlrZXlfdHlwZSB8PSBOTDgwMjExX0tFWVRZUEVfR1JPVVA7Ci0JZWxzZQotCQlrZXlfdHlwZSB8PSBOTDgwMjExX0tFWVRZUEVfUEFJUldJU0U7Ci0KLQljZmc4MDIxMV9taWNoYWVsX21pY19mYWlsdXJlKHBhZGFwdGVyLT5wbmV0ZGV2LAotCQkJCSAgICAgKHU4ICopJnBtbG1lcHJpdi0+YXNzb2NfYnNzaWRbMF0sCi0JCQkJICAgICBrZXlfdHlwZSwgLTEsIE5VTEwsIEdGUF9BVE9NSUMpOwotCi0JbWVtc2V0KCZldiwgMHgwMCwgc2l6ZW9mKGV2KSk7Ci0JaWYgKGJncm91cCkKLQkJZXYuZmxhZ3MgfD0gSVdfTUlDRkFJTFVSRV9HUk9VUDsKLQllbHNlCi0JCWV2LmZsYWdzIHw9IElXX01JQ0ZBSUxVUkVfUEFJUldJU0U7Ci0KLQlldi5zcmNfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0JZXRoZXJfYWRkcl9jb3B5KGV2LnNyY19hZGRyLnNhX2RhdGEsICZwbWxtZXByaXYtPmFzc29jX2Jzc2lkWzBdKTsKLQotCW1lbXNldCgmd3JxdSwgMHgwMCwgc2l6ZW9mKHdycXUpKTsKLQl3cnF1LmRhdGEubGVuZ3RoID0gc2l6ZW9mKGV2KTsKLX0KLQotaW50IHJ0d19yZWN2X2luZGljYXRlcGt0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlwcmVjdnByaXYgPSAmcGFkYXB0ZXItPnJlY3Zwcml2OwotCi0Jc2tiID0gcHJlY3ZfZnJhbWUtPnBrdDsKLQlpZiAoIXNrYikgewotCQlSVF9UUkFDRShfbW9kdWxlX3JlY3Zfb3NkZXBfY18sIF9kcnZfZXJyXywKLQkJCSAicnR3X3JlY3ZfaW5kaWNhdGVwa3QyM2EoKTpza2IgPT0gTlVMTCEhISFcbiIpOwotCQlnb3RvIF9yZWN2X2luZGljYXRlcGt0X2Ryb3A7Ci0JfQotCi0JUlRfVFJBQ0UoX21vZHVsZV9yZWN2X29zZGVwX2NfLCBfZHJ2X2luZm9fLAotCQkgInJ0d19yZWN2X2luZGljYXRlcGt0MjNhKCk6c2tiICE9IE5VTEwgISEhXG4iKTsKLQlSVF9UUkFDRShfbW9kdWxlX3JlY3Zfb3NkZXBfY18sIF9kcnZfaW5mb18sCi0JCSAicnR3X3JlY3ZfaW5kaWNhdGVwa3QyM2EoKTpwcmVjdl9mcmFtZS0+aGRyLnJ4X2RhdGEgPSVwXG4iLAotCQkgcHJlY3ZfZnJhbWUtPnBrdC0+ZGF0YSk7Ci0JUlRfVFJBQ0UoX21vZHVsZV9yZWN2X29zZGVwX2NfLCBfZHJ2X2luZm9fLAotCQkgInNrYi0+aGVhZCA9JXAgc2tiLT5kYXRhID0lcCBza2ItPnRhaWwgPSVwIHNrYi0+ZW5kID0lcCBza2ItPmxlbiA9JWRcbiIsCi0JCSBza2ItPmhlYWQsIHNrYi0+ZGF0YSwKLQkJIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwgc2tiX2VuZF9wb2ludGVyKHNrYiksIHNrYi0+bGVuKTsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkgPT0gdHJ1ZSkgewotCQlzdHJ1Y3Qgc2tfYnVmZiAqcHNrYjIgPSBOVUxMOwotCQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBOVUxMOwotCQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmVjdl9mcmFtZS0+YXR0cmliOwotCQlpbnQgYm1jYXN0ID0gaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocGF0dHJpYi0+ZHN0KTsKLQotCQkvKiBEQkdfODcyM0EoImJtY2FzdCA9JWRcbiIsIGJtY2FzdCk7ICovCi0KLQkJaWYgKCFldGhlcl9hZGRyX2VxdWFsKHBhdHRyaWItPmRzdCwKLQkJCQkgICAgICBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdikpKSB7Ci0JCQkvKiBEQkdfODcyM0EoIm5vdCBhcCBwc3RhID0lcCwgYWRkciA9JXBNXG4iLCBwc3RhLCBwYXR0cmliLT5kc3QpOyAqLwotCQkJaWYgKGJtY2FzdCkgewotCQkJCXBzdGEgPSBydHdfZ2V0X2JjbWNfc3RhaW5mbzIzYShwYWRhcHRlcik7Ci0JCQkJcHNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgcGF0dHJpYi0+ZHN0KTsKLQkJCX0KLQotCQkJaWYgKHBzdGEpIHsKLQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldiA9IHBhZGFwdGVyLT5wbmV0ZGV2OwotCi0JCQkJLyogREJHXzg3MjNBKCJkaXJlY3RseSBmb3J3YXJkaW5nIHRvIHRoZSBydHdfeG1pdDIzYV9lbnRyeTIzYVxuIik7ICovCi0KLQkJCQkvKiBza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7ICovCi0JCQkJc2tiLT5kZXYgPSBwbmV0ZGV2OwotCQkJCXNrYl9zZXRfcXVldWVfbWFwcGluZyhza2IsIHJ0d19yZWN2X3NlbGVjdF9xdWV1ZTIzYShza2IpKTsKLQotCQkJCXJ0d194bWl0MjNhX2VudHJ5MjNhKHNrYiwgcG5ldGRldik7Ci0KLQkJCQlpZiAoYm1jYXN0KQotCQkJCQlza2IgPSBwc2tiMjsKLQkJCQllbHNlCi0JCQkJCWdvdG8gX3JlY3ZfaW5kaWNhdGVwa3RfZW5kOwotCQkJfQotCQl9IGVsc2UgeyAvKiAgdG8gQVBzZWxmICovCi0JCQkvKiBEQkdfODcyM0EoInRvIEFQU2VsZlxuIik7ICovCi0JCX0KLQl9Ci0KLQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7Ci0Jc2tiLT5kZXYgPSBwYWRhcHRlci0+cG5ldGRldjsKLQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBwYWRhcHRlci0+cG5ldGRldik7Ci0KLQluZXRpZl9yeChza2IpOwotCi1fcmVjdl9pbmRpY2F0ZXBrdF9lbmQ6Ci0KLQlwcmVjdl9mcmFtZS0+cGt0ID0gTlVMTDsgLyogIHBvaW50ZXJzIHRvIE5VTEwgYmVmb3JlIHJ0d19mcmVlX3JlY3ZmcmFtZTIzYSgpICovCi0KLQlydHdfZnJlZV9yZWN2ZnJhbWUyM2EocHJlY3ZfZnJhbWUpOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9yZWN2X29zZGVwX2NfLCBfZHJ2X2luZm9fLAotCQkgInJ0d19yZWN2X2luZGljYXRlcGt0MjNhIDphZnRlciBuZXRpZl9yeCEhISFcbiIpOwotCXJldHVybiBfU1VDQ0VTUzsKLQotX3JlY3ZfaW5kaWNhdGVwa3RfZHJvcDoKLQotCSBydHdfZnJlZV9yZWN2ZnJhbWUyM2EocHJlY3ZfZnJhbWUpOwotCSByZXR1cm4gX0ZBSUw7Ci19Ci0KLXZvaWQgcnR3X2luaXRfcmVjdl90aW1lcjIzYShzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmwpCi17Ci0Jc2V0dXBfdGltZXIoJnByZW9yZGVyX2N0cmwtPnJlb3JkZXJpbmdfY3RybF90aW1lciwKLQkJICAgIHJ0d19yZW9yZGVyaW5nX2N0cmxfdGltZW91dF9oYW5kbGVyMjNhLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpcHJlb3JkZXJfY3RybCk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC91c2JfaW50Zi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvdXNiX2ludGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y4M2VmZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC91c2JfaW50Zi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfSENJX0lOVEZfQ18KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLSNpbmNsdWRlIDxyZWN2X29zZGVwLmg+Ci0jaW5jbHVkZSA8eG1pdF9vc2RlcC5oPgotI2luY2x1ZGUgPGhhbF9pbnRmLmg+Ci0jaW5jbHVkZSA8cnR3X3ZlcnNpb24uaD4KLSNpbmNsdWRlIDxvc2RlcF9pbnRmLmg+Ci0jaW5jbHVkZSA8dXNiX29wcy5oPgotI2luY2x1ZGUgPHJ0bDg3MjNhX2hhbC5oPgotCi1zdGF0aWMgaW50IHJ0d19zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSk7Ci1zdGF0aWMgaW50IHJ0d19yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOwotc3RhdGljIGludCBydHdfZHJ2X2luaXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKnB1c2JfaW50ZiwKLQkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICpwZGlkKTsKLXN0YXRpYyB2b2lkIHJ0d19kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICpwdXNiX2ludGYpOwotCi0jZGVmaW5lIFVTQl9WRU5ERVJfSURfUkVBTFRFSwkJMHgwQkRBCi0KLSNkZWZpbmUgUlRMODcyM0FfVVNCX0lEUyBcCi0Je1VTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFVTQl9WRU5ERVJfSURfUkVBTFRFSywgMHg4NzI0LAlcCi0JIDB4ZmYsIDB4ZmYsIDB4ZmYpfSwgLyogODcyM0FVIDEqMSAqLyBcCi0Je1VTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFVTQl9WRU5ERVJfSURfUkVBTFRFSywgMHgxNzI0LAlcCi0JIDB4ZmYsIDB4ZmYsIDB4ZmYpfSwgLyogODcyM0FVIDEqMSAqLyBcCi0Je1VTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFVTQl9WRU5ERVJfSURfUkVBTFRFSywgMHgwNzI0LAlcCi0JIDB4ZmYsIDB4ZmYsIDB4ZmYpfSwgLyogODcyM0FVIDEqMSAqLwotCi1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgcnRsODcyM2FfdXNiX2lkX3RibFtdID0gewotCVJUTDg3MjNBX1VTQl9JRFMKLQl7fQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHJ0bDg3MjNhX3VzYl9pZF90YmwpOwotCi1zdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgcnRsODcyM2FfdXNiX2RydiA9IHsKLQkubmFtZSA9IChjaGFyICopInJ0bDg3MjNhdSIsCi0JLnByb2JlID0gcnR3X2Rydl9pbml0LAotCS5kaXNjb25uZWN0ID0gcnR3X2Rpc2Nvbm5lY3QsCi0JLmlkX3RhYmxlID0gcnRsODcyM2FfdXNiX2lkX3RibCwKLQkuc3VzcGVuZCA9IHJ0d19zdXNwZW5kLAotCS5yZXN1bWUgPSBydHdfcmVzdW1lLAotCS5yZXNldF9yZXN1bWUgID0gcnR3X3Jlc3VtZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciAqdXNiX2RydiA9ICZydGw4NzIzYV91c2JfZHJ2OwotCi1zdGF0aWMgaW50IHJ0d19pbml0X2ludGZfcHJpdihzdHJ1Y3QgZHZvYmpfcHJpdiAqZHZvYmopCi17Ci0JbXV0ZXhfaW5pdCgmZHZvYmotPnVzYl92ZW5kb3JfcmVxX211dGV4KTsKLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCBydHdfZGVpbml0X2ludGZfcHJpdihzdHJ1Y3QgZHZvYmpfcHJpdiAqZHZvYmopCi17Ci0JbXV0ZXhfZGVzdHJveSgmZHZvYmotPnVzYl92ZW5kb3JfcmVxX211dGV4KTsKLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIHN0cnVjdCBkdm9ial9wcml2ICp1c2JfZHZvYmpfaW5pdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqdXNiX2ludGYpCi17Ci0Jc3RydWN0IGR2b2JqX3ByaXYgKnBkdm9ianByaXY7Ci0Jc3RydWN0IHVzYl9ob3N0X2NvbmZpZwkgKnBob3N0X2NvbmY7Ci0Jc3RydWN0IHVzYl9jb25maWdfZGVzY3JpcHRvciAqcGNvbmZfZGVzYzsKLQlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICpwaG9zdF9pZmFjZTsKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICpwaWZhY2VfZGVzYzsKLQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKnBlbmRwX2Rlc2M7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnB1c2JkOwotCWludCBpLCBzdGF0dXMgPSBfRkFJTDsKLQotCXBkdm9ianByaXYgPSBremFsbG9jKHNpemVvZigqcGR2b2JqcHJpdiksIEdGUF9LRVJORUwpOwotCWlmICghcGR2b2JqcHJpdikKLQkJZ290byBleGl0OwotCi0JbXV0ZXhfaW5pdCgmcGR2b2JqcHJpdi0+aHdfaW5pdF9tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmcGR2b2JqcHJpdi0+aDJjX2Z3Y21kX211dGV4KTsKLQltdXRleF9pbml0KCZwZHZvYmpwcml2LT5zZXRjaF9tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmcGR2b2JqcHJpdi0+c2V0YndfbXV0ZXgpOwotCi0JcGR2b2JqcHJpdi0+cHVzYmludGYgPSB1c2JfaW50ZjsKLQlwdXNiZCA9IGludGVyZmFjZV90b191c2JkZXYodXNiX2ludGYpOwotCXBkdm9ianByaXYtPnB1c2JkZXYgPSBwdXNiZDsKLQl1c2Jfc2V0X2ludGZkYXRhKHVzYl9pbnRmLCBwZHZvYmpwcml2KTsKLQotCXBkdm9ianByaXYtPlJ0TnVtSW5QaXBlcyA9IDA7Ci0JcGR2b2JqcHJpdi0+UnROdW1PdXRQaXBlcyA9IDA7Ci0KLQlwaG9zdF9jb25mID0gcHVzYmQtPmFjdGNvbmZpZzsKLQlwY29uZl9kZXNjID0gJnBob3N0X2NvbmYtPmRlc2M7Ci0KLQlwaG9zdF9pZmFjZSA9ICZ1c2JfaW50Zi0+YWx0c2V0dGluZ1swXTsKLQlwaWZhY2VfZGVzYyA9ICZwaG9zdF9pZmFjZS0+ZGVzYzsKLQotCXBkdm9ianByaXYtPk51bUludGVyZmFjZXMgPSBwY29uZl9kZXNjLT5iTnVtSW50ZXJmYWNlczsKLQlwZHZvYmpwcml2LT5JbnRlcmZhY2VOdW1iZXIgPSBwaWZhY2VfZGVzYy0+YkludGVyZmFjZU51bWJlcjsKLQlwZHZvYmpwcml2LT5ucl9lbmRwb2ludCA9IHBpZmFjZV9kZXNjLT5iTnVtRW5kcG9pbnRzOwotCi0JZm9yIChpID0gMDsgaSA8IHBkdm9ianByaXYtPm5yX2VuZHBvaW50OyBpKyspIHsKLQkJcGVuZHBfZGVzYyA9ICZwaG9zdF9pZmFjZS0+ZW5kcG9pbnRbaV0uZGVzYzsKLQotCQlEQkdfODcyM0EoIlxudXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IoJWQpOlxuIiwgaSk7Ci0JCURCR184NzIzQSgiYkxlbmd0aCA9JXhcbiIsIHBlbmRwX2Rlc2MtPmJMZW5ndGgpOwotCQlEQkdfODcyM0EoImJEZXNjcmlwdG9yVHlwZSA9JXhcbiIsIHBlbmRwX2Rlc2MtPmJEZXNjcmlwdG9yVHlwZSk7Ci0JCURCR184NzIzQSgiYkVuZHBvaW50QWRkcmVzcyA9JXhcbiIsCi0JCQkgIHBlbmRwX2Rlc2MtPmJFbmRwb2ludEFkZHJlc3MpOwotCQlEQkdfODcyM0EoIndNYXhQYWNrZXRTaXplID0lZFxuIiwKLQkJCSAgbGUxNl90b19jcHUocGVuZHBfZGVzYy0+d01heFBhY2tldFNpemUpKTsKLQkJREJHXzg3MjNBKCJiSW50ZXJ2YWwgPSV4XG4iLCBwZW5kcF9kZXNjLT5iSW50ZXJ2YWwpOwotCi0JCWlmICh1c2JfZW5kcG9pbnRfaXNfYnVsa19pbihwZW5kcF9kZXNjKSkgewotCQkJREJHXzg3MjNBKCJ1c2JfZW5kcG9pbnRfaXNfYnVsa19pbiA9ICV4XG4iLAotCQkJCSAgdXNiX2VuZHBvaW50X251bShwZW5kcF9kZXNjKSk7Ci0JCQlwZHZvYmpwcml2LT5SdEluUGlwZVtwZHZvYmpwcml2LT5SdE51bUluUGlwZXNdID0KLQkJCQl1c2JfZW5kcG9pbnRfbnVtKHBlbmRwX2Rlc2MpOwotCQkJcGR2b2JqcHJpdi0+UnROdW1JblBpcGVzKys7Ci0JCX0gZWxzZSBpZiAodXNiX2VuZHBvaW50X2lzX2ludF9pbihwZW5kcF9kZXNjKSkgewotCQkJREJHXzg3MjNBKCJ1c2JfZW5kcG9pbnRfaXNfaW50X2luID0gJXgsIEludGVydmFsID0gIgotCQkJCSAgIiV4XG4iLCB1c2JfZW5kcG9pbnRfbnVtKHBlbmRwX2Rlc2MpLAotCQkJCSAgcGVuZHBfZGVzYy0+YkludGVydmFsKTsKLQkJCXBkdm9ianByaXYtPlJ0SW5QaXBlW3Bkdm9ianByaXYtPlJ0TnVtSW5QaXBlc10gPQotCQkJCXVzYl9lbmRwb2ludF9udW0ocGVuZHBfZGVzYyk7Ci0JCQlwZHZvYmpwcml2LT5SdE51bUluUGlwZXMrKzsKLQkJfSBlbHNlIGlmICh1c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQocGVuZHBfZGVzYykpIHsKLQkJCURCR184NzIzQSgidXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0ID0gJXhcbiIsCi0JCQkJICB1c2JfZW5kcG9pbnRfbnVtKHBlbmRwX2Rlc2MpKTsKLQkJCXBkdm9ianByaXYtPlJ0T3V0UGlwZVtwZHZvYmpwcml2LT5SdE51bU91dFBpcGVzXSA9Ci0JCQkJdXNiX2VuZHBvaW50X251bShwZW5kcF9kZXNjKTsKLQkJCXBkdm9ianByaXYtPlJ0TnVtT3V0UGlwZXMrKzsKLQkJfQotCQlwZHZvYmpwcml2LT5lcF9udW1baV0gPSB1c2JfZW5kcG9pbnRfbnVtKHBlbmRwX2Rlc2MpOwotCX0KLQlEQkdfODcyM0EoIm5yX2VuZHBvaW50ID0lZCwgaW5fbnVtID0lZCwgb3V0X251bSA9JWRcblxuIiwKLQkJICBwZHZvYmpwcml2LT5ucl9lbmRwb2ludCwgcGR2b2JqcHJpdi0+UnROdW1JblBpcGVzLAotCQkgIHBkdm9ianByaXYtPlJ0TnVtT3V0UGlwZXMpOwotCi0JaWYgKHB1c2JkLT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkgewotCQlwZHZvYmpwcml2LT5pc2hpZ2hzcGVlZCA9IHRydWU7Ci0JCURCR184NzIzQSgiVVNCX1NQRUVEX0hJR0hcbiIpOwotCX0gZWxzZSB7Ci0JCXBkdm9ianByaXYtPmlzaGlnaHNwZWVkID0gZmFsc2U7Ci0JCURCR184NzIzQSgiTk9OIFVTQl9TUEVFRF9ISUdIXG4iKTsKLQl9Ci0KLQlpZiAocnR3X2luaXRfaW50Zl9wcml2KHBkdm9ianByaXYpID09IF9GQUlMKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfZXJyXywKLQkJCSAiQ2FuJ3QgSU5JVCBydHdfaW5pdF9pbnRmX3ByaXZcbiIpOwotCQlnb3RvIGZyZWVfZHZvYmo7Ci0JfQotCS8qIDMgbWlzYyAqLwotCXJ0d19yZXNldF9jb250aW51YWxfdXJiX2Vycm9yKHBkdm9ianByaXYpOwotCXVzYl9nZXRfZGV2KHB1c2JkKTsKLQlzdGF0dXMgPSBfU1VDQ0VTUzsKLWZyZWVfZHZvYmo6Ci0JaWYgKHN0YXR1cyAhPSBfU1VDQ0VTUyAmJiBwZHZvYmpwcml2KSB7Ci0JCXVzYl9zZXRfaW50ZmRhdGEodXNiX2ludGYsIE5VTEwpOwotCQltdXRleF9kZXN0cm95KCZwZHZvYmpwcml2LT5od19pbml0X211dGV4KTsKLQkJbXV0ZXhfZGVzdHJveSgmcGR2b2JqcHJpdi0+aDJjX2Z3Y21kX211dGV4KTsKLQkJbXV0ZXhfZGVzdHJveSgmcGR2b2JqcHJpdi0+c2V0Y2hfbXV0ZXgpOwotCQltdXRleF9kZXN0cm95KCZwZHZvYmpwcml2LT5zZXRid19tdXRleCk7Ci0JCWtmcmVlKHBkdm9ianByaXYpOwotCQlwZHZvYmpwcml2ID0gTlVMTDsKLQl9Ci1leGl0OgotCXJldHVybiBwZHZvYmpwcml2OwotfQotCi1zdGF0aWMgdm9pZCB1c2JfZHZvYmpfZGVpbml0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICp1c2JfaW50ZikKLXsKLQlzdHJ1Y3QgZHZvYmpfcHJpdiAqZHZvYmogPSB1c2JfZ2V0X2ludGZkYXRhKHVzYl9pbnRmKTsKLQotCXVzYl9zZXRfaW50ZmRhdGEodXNiX2ludGYsIE5VTEwpOwotCWlmIChkdm9iaikgewotCQkvKiBNb2RpZnkgY29uZGl0aW9uIGZvciA5MkRVIERNRFAgMjAxMC4xMS4xOCwgYnkgVGhvbWFzICovCi0JCWlmICgoZHZvYmotPk51bUludGVyZmFjZXMgIT0gMiAmJiBkdm9iai0+TnVtSW50ZXJmYWNlcyAhPSAzKSB8fAotCQkgICAgKGR2b2JqLT5JbnRlcmZhY2VOdW1iZXIgPT0gMSkpIHsKLQkJCWlmIChpbnRlcmZhY2VfdG9fdXNiZGV2KHVzYl9pbnRmKS0+c3RhdGUgIT0KLQkJCSAgICBVU0JfU1RBVEVfTk9UQVRUQUNIRUQpIHsKLQkJCQkvKiBJZiB3ZSBkaWRuJ3QgdW5wbHVnIHVzYiBkb25nbGUgYW5kCi0JCQkJICogcmVtb3ZlL2luc2VydCBtb2R1bGUsIGRyaXZlciBmYWlscyBvbgotCQkJCSAqIHNpdGVzdXJ2ZXkgZm9yIHRoZSBmaXJzdCB0aW1lIHdoZW4KLQkJCQkgKiBkZXZpY2UgaXMgdXAgLgotCQkJCSAqIFJlc2V0IHVzYiBwb3J0IGZvciBzaXRlc3VydmV5IGZhaWwgaXNzdWUuCi0JCQkJICovCi0JCQkJREJHXzg3MjNBKCJ1c2IgYXR0YWNoZWQuLi4sIHRyeSB0byByZXNldCB1c2IgZGV2aWNlXG4iKTsKLQkJCQl1c2JfcmVzZXRfZGV2aWNlKGludGVyZmFjZV90b191c2JkZXYodXNiX2ludGYpKTsKLQkJCX0KLQkJfQotCQlydHdfZGVpbml0X2ludGZfcHJpdihkdm9iaik7Ci0JCW11dGV4X2Rlc3Ryb3koJmR2b2JqLT5od19pbml0X211dGV4KTsKLQkJbXV0ZXhfZGVzdHJveSgmZHZvYmotPmgyY19md2NtZF9tdXRleCk7Ci0JCW11dGV4X2Rlc3Ryb3koJmR2b2JqLT5zZXRjaF9tdXRleCk7Ci0JCW11dGV4X2Rlc3Ryb3koJmR2b2JqLT5zZXRid19tdXRleCk7Ci0JCWtmcmVlKGR2b2JqKTsKLQl9Ci0JdXNiX3B1dF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldih1c2JfaW50ZikpOwotfQotCi12b2lkIHJ0bDg3MjNhX3VzYl9pbnRmX3N0b3Aoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAiK3VzYl9pbnRmX3N0b3BcbiIpOwotCi0JLyogZGlzYWJsZV9od19pbnRlcnJ1cHQgKi8KLQlpZiAoIXBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSB7Ci0JCS8qIGRldmljZSBzdGlsbCBleGlzdHMsIHNvIGRyaXZlciBjYW4gZG8gaS9vIG9wZXJhdGlvbgotCQkgKiBUT0RPOgotCQkgKi8KLQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywKLQkJCSAiU3VycHJpc2VSZW1vdmVkID09IGZhbHNlXG4iKTsKLQl9Ci0KLQkvKiBjYW5jZWwgaW4gaXJwICovCi0JcnRsODcyM2F1X2luaXJwX2RlaW5pdChwYWRhcHRlcik7Ci0KLQkvKiBjYW5jZWwgb3V0IGlycCAqLwotCXJ0bDg3MjNhdV93cml0ZV9wb3J0X2NhbmNlbChwYWRhcHRlcik7Ci0KLQkvKiB0b2RvOmNhbmNlbCBvdGhlciBpcnBzICovCi0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywgIi11c2JfaW50Zl9zdG9wXG4iKTsKLX0KLQotc3RhdGljIHZvaWQgcnR3X2Rldl91bmxvYWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3Qgc3VibWl0X2N0eCAqcGFja190eF9vcHMgPSAmcGFkYXB0ZXItPnhtaXRwcml2LmFja190eF9vcHM7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAiK3J0d19kZXZfdW5sb2FkXG4iKTsKLQotCWlmIChwYWRhcHRlci0+YnVwKSB7Ci0JCURCR184NzIzQSgiPT09PiBydHdfZGV2X3VubG9hZFxuIik7Ci0KLQkJcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkID0gdHJ1ZTsKLQkJaWYgKHBhZGFwdGVyLT54bWl0cHJpdi5hY2tfdHgpCi0JCQlydHcyM2Ffc2N0eF9kb25lX2VycigmcGFja190eF9vcHMsCi0JCQkJCSAgICAgUlRXX1NDVFhfRE9ORV9EUlZfU1RPUCk7Ci0KLQkJLyogczMuICovCi0JCXJ0bDg3MjNhX3VzYl9pbnRmX3N0b3AocGFkYXB0ZXIpOwotCi0JCS8qIHM0LiAqLwotCQlmbHVzaF93b3JrcXVldWUocGFkYXB0ZXItPmNtZHByaXYud3EpOwotCi0JCS8qIHM1LiAqLwotCQlpZiAoIXBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSB7Ci0JCQlydGw4NzIzYXVfaGFsX2RlaW5pdChwYWRhcHRlcik7Ci0JCQlwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCA9IHRydWU7Ci0JCX0KLQkJcGFkYXB0ZXItPmJ1cCA9IGZhbHNlOwotCX0gZWxzZSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sCi0JCQkgInI4NzF4X2Rldl91bmxvYWQoKTpwYWRhcHRlci0+YnVwID09IGZhbHNlXG4iKTsKLQl9Ci0JREJHXzg3MjNBKCI8PT09IHJ0d19kZXZfdW5sb2FkXG4iKTsKLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAiLXJ0d19kZXZfdW5sb2FkXG4iKTsKLX0KLQotc3RhdGljIGludCBydHdfc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqcHVzYl9pbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKLXsKLQlzdHJ1Y3QgZHZvYmpfcHJpdiAqZHZvYmogPSB1c2JfZ2V0X2ludGZkYXRhKHB1c2JfaW50Zik7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IGR2b2JqLT5pZjE7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXYgPSBwYWRhcHRlci0+cG5ldGRldjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cnByaXYgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwotCWludCByZXQgPSAwOwotCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZSA9IGppZmZpZXM7Ci0KLQlEQkdfODcyM0EoIj09PiAlcyAoJXM6JWQpXG4iLCBfX2Z1bmNfXywgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkKTsKLQotCWlmICgoIXBhZGFwdGVyLT5idXApIHx8IChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQpIHx8Ci0JICAgIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkpIHsKLQkJREJHXzg3MjNBKCJwYWRhcHRlci0+YnVwID0lZCBiRHJpdmVyU3RvcHBlZCA9JWQgYlN1cnByaXNlUmVtb3ZlZCA9ICVkXG4iLAotCQkJICBwYWRhcHRlci0+YnVwLCBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQsCi0JCQkgIHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKTsKLQkJZ290byBleGl0OwotCX0KLQlwd3Jwcml2LT5iSW5TdXNwZW5kID0gdHJ1ZTsKLQlydHdfY2FuY2VsX2FsbF90aW1lcjIzYShwYWRhcHRlcik7Ci0JTGVhdmVBbGxQb3dlclNhdmVNb2RlMjNhKHBhZGFwdGVyKTsKLQotCWRvd24oJnB3cnByaXYtPmxvY2spOwotCS8qIHBhZGFwdGVyLT5uZXRfY2xvc2VkID0gdHJ1ZTsgKi8KLQkvKiBzMS4gKi8KLQlpZiAocG5ldGRldikgewotCQluZXRpZl9jYXJyaWVyX29mZihwbmV0ZGV2KTsKLQkJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKHBuZXRkZXYpOwotCX0KLQotCS8qIHMyLiAqLwotCXJ0d19kaXNhc3NvY19jbWQyM2EocGFkYXB0ZXIsIDAsIGZhbHNlKTsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSAmJgotCSAgICBjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKLQkJREJHXzg3MjNBKCIlczolZCAlcyglcE0pLCBsZW5ndGg6JWQgYXNzb2Nfc3NpZC5sZW5ndGg6JWRcbiIsCi0JCQkgIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJCSAgcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLlNzaWQuc3NpZCwKLQkJCSAgcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLk1hY0FkZHJlc3MsCi0JCQkgIHBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yay5Tc2lkLnNzaWRfbGVuLAotCQkJICBwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZF9sZW4pOwotCi0JCXJ0d19zZXRfcm9hbWluZyhwYWRhcHRlciwgMSk7Ci0JfQotCS8qIHMyLTIuICBpbmRpY2F0ZSBkaXNjb25uZWN0IHRvIG9zICovCi0JcnR3X2luZGljYXRlX2Rpc2Nvbm5lY3QyM2EocGFkYXB0ZXIpOwotCS8qIHMyLTMuICovCi0JcnR3X2ZyZWVfYXNzb2NfcmVzb3VyY2VzMjNhKHBhZGFwdGVyLCAxKTsKLQkvKiBzMi00LiAqLwotCXJ0d19mcmVlX25ldHdvcmtfcXVldWUyM2EocGFkYXB0ZXIpOwotCi0JcnR3X2Rldl91bmxvYWQocGFkYXB0ZXIpOwotCXVwKCZwd3Jwcml2LT5sb2NrKTsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSkpCi0JCXJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9zY2FuX2RvbmUoCi0JCQl3ZGV2X3RvX3ByaXYocGFkYXB0ZXItPnJ0d193ZGV2KSwgdHJ1ZSk7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKSkKLQkJcnR3X2luZGljYXRlX2Rpc2Nvbm5lY3QyM2EocGFkYXB0ZXIpOwotCi1leGl0OgotCURCR184NzIzQSgiPD09PSAgJXMgcmV0dXJuICVkLi4uLi4uLi4uLi4uLi4gaW4gJWRtc1xuIiwgX19mdW5jX18sCi0JCSAgcmV0LCBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydF90aW1lKSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHJ0d19yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKnB1c2JfaW50ZikKLXsKLQlzdHJ1Y3QgZHZvYmpfcHJpdiAqZHZvYmogPSB1c2JfZ2V0X2ludGZkYXRhKHB1c2JfaW50Zik7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IGR2b2JqLT5pZjE7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXY7Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdycHJpdiA9IE5VTEw7Ci0JaW50IHJldCA9IC0xOwotCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZSA9IGppZmZpZXM7Ci0KLQlEQkdfODcyM0EoIj09PiAlcyAoJXM6JWQpXG4iLCBfX2Z1bmNfXywgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkKTsKLQotCWlmICghcGFkYXB0ZXIpCi0JCWdvdG8gZXhpdDsKLQlwbmV0ZGV2ID0gcGFkYXB0ZXItPnBuZXRkZXY7Ci0JcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0KLQlkb3duKCZwd3Jwcml2LT5sb2NrKTsKLQlydHdfcmVzZXRfZHJ2X3N3MjNhKHBhZGFwdGVyKTsKLQlwd3Jwcml2LT5ia2VlcGZ3YWxpdmUgPSBmYWxzZTsKLQotCURCR184NzIzQSgiYmtlZXBmd2FsaXZlKCV4KVxuIiwgcHdycHJpdi0+YmtlZXBmd2FsaXZlKTsKLQlpZiAocG1fbmV0ZGV2X29wZW4yM2EocG5ldGRldiwgdHJ1ZSkgIT0gMCkgewotCQl1cCgmcHdycHJpdi0+bG9jayk7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQluZXRpZl9kZXZpY2VfYXR0YWNoKHBuZXRkZXYpOwotCW5ldGlmX2NhcnJpZXJfb24ocG5ldGRldik7Ci0KLQl1cCgmcHdycHJpdi0+bG9jayk7Ci0KLQlpZiAocGFkYXB0ZXItPnBpZFsxXSAhPSAwKSB7Ci0JCURCR184NzIzQSgicGlkWzFdOiVkXG4iLCBwYWRhcHRlci0+cGlkWzFdKTsKLQkJa2lsbF9waWQoZmluZF92cGlkKHBhZGFwdGVyLT5waWRbMV0pLCBTSUdVU1IyLCAxKTsKLQl9Ci0KLQlydHcyM2Ffcm9hbWluZyhwYWRhcHRlciwgTlVMTCk7Ci0KLQlyZXQgPSAwOwotZXhpdDoKLQlpZiAocHdycHJpdikKLQkJcHdycHJpdi0+YkluU3VzcGVuZCA9IGZhbHNlOwotCURCR184NzIzQSgiPD09PSAgJXMgcmV0dXJuICVkLi4uLi4uLi4uLi4uLi4gaW4gJWRtc1xuIiwgX19mdW5jX18sCi0JCSAgcmV0LCBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydF90aW1lKSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogZHJ2X2luaXQoKSAtIGEgZGV2aWNlIHBvdGVudGlhbGx5IGZvciB1cwotICoKLSAqIG5vdGVzOiBkcnZfaW5pdCgpIGlzIGNhbGxlZCB3aGVuIHRoZSBidXMgZHJpdmVyIGhhcyBsb2NhdGVkIGEgY2FyZAotICogZm9yIHVzIHRvIHN1cHBvcnQuCi0gKiAgICAgICAgV2UgYWNjZXB0IHRoZSBuZXcgZGV2aWNlIGJ5IHJldHVybmluZyAwLgotICovCi1zdGF0aWMgc3RydWN0IHJ0d19hZGFwdGVyICpydHdfdXNiX2lmMV9pbml0KHN0cnVjdCBkdm9ial9wcml2ICpkdm9iaiwKLQkJCQkJICAgIHN0cnVjdCB1c2JfaW50ZXJmYWNlICpwdXNiX2ludGYsCi0JCQkJCSAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqcGRpZCkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gTlVMTDsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldiA9IE5VTEw7Ci0JaW50IHN0YXR1cyA9IF9GQUlMOwotCi0JcG5ldGRldiA9IHJ0d19pbml0X25ldGRldjIzYShwYWRhcHRlcik7Ci0JaWYgKCFwbmV0ZGV2KQotCQlnb3RvIGZyZWVfYWRhcHRlcjsKLQlwYWRhcHRlciA9IG5ldGRldl9wcml2KHBuZXRkZXYpOwotCi0JcGFkYXB0ZXItPmR2b2JqID0gZHZvYmo7Ci0JcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkID0gdHJ1ZTsKLQlkdm9iai0+aWYxID0gcGFkYXB0ZXI7Ci0JZHZvYmotPnBhZGFwdGVyc1tkdm9iai0+aWZhY2VfbnVtcysrXSA9IHBhZGFwdGVyOwotCXBhZGFwdGVyLT5pZmFjZV9pZCA9IElGQUNFX0lEMDsKLQotCXJ0bDg3MjNhdV9zZXRfaHdfdHlwZShwYWRhcHRlcik7Ci0KLQlTRVRfTkVUREVWX0RFVihwbmV0ZGV2LCBkdm9ial90b19kZXYoZHZvYmopKTsKLQotCWlmIChydHdfd2Rldl9hbGxvYyhwYWRhcHRlciwgZHZvYmpfdG9fZGV2KGR2b2JqKSkpCi0JCWdvdG8gZnJlZV9hZGFwdGVyOwotCi0JLyogc3RlcCAyLiBhbGxvY2F0ZSBIYWxEYXRhICovCi0JcGFkYXB0ZXItPkhhbERhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaGFsX2RhdGFfODcyM2EpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBhZGFwdGVyLT5IYWxEYXRhKQotCQlnb3RvIGZyZWVfd2RldjsKLQotCS8qIHN0ZXAgcmVhZF9jaGlwX3ZlcnNpb24gKi8KLQlydGw4NzIzYV9yZWFkX2NoaXBfdmVyc2lvbihwYWRhcHRlcik7Ci0KLQkvKiBzdGVwIHVzYiBlbmRwb2ludCBtYXBwaW5nICovCi0JaWYgKCFydGw4NzIzYXVfY2hpcF9jb25maWd1cmUocGFkYXB0ZXIpKQotCQlnb3RvIGZyZWVfaGFsX2RhdGE7Ci0KLQkvKiBzdGVwIHJlYWQgZWZ1c2UvZWVwcm9tIGRhdGEgYW5kIGdldCBtYWNfYWRkciAqLwotCXJ0bDg3MjNhX3JlYWRfYWRhcHRlcl9pbmZvKHBhZGFwdGVyKTsKLQotCS8qIHN0ZXAgNS4gKi8KLQlpZiAocnR3X2luaXRfZHJ2X3N3MjNhKHBhZGFwdGVyKSA9PSBfRkFJTCkgewotCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLAotCQkJICJJbml0aWFsaXplIGRyaXZlciBzb2Z0d2FyZSByZXNvdXJjZSBGYWlsZWQhXG4iKTsKLQkJZ290byBmcmVlX2hhbF9kYXRhOwotCX0KLQotI2lmZGVmIENPTkZJR19QTQotCWlmIChwYWRhcHRlci0+cHdyY3RybHByaXYuYlN1cHBvcnRSZW1vdGVXYWtldXApIHsKLQkJZHZvYmotPnB1c2JkZXYtPmRvX3JlbW90ZV93YWtldXAgPSAxOwotCQlwdXNiX2ludGYtPm5lZWRzX3JlbW90ZV93YWtldXAgPSAxOwotCQlkZXZpY2VfaW5pdF93YWtldXAoJnB1c2JfaW50Zi0+ZGV2LCAxKTsKLQkJREJHXzg3MjNBKCJcbiAgcGFkYXB0ZXItPnB3cmN0cmxwcml2LmJTdXBwb3J0UmVtb3RlV2FrZXVwfn5+fn5+XG4iKTsKLQkJREJHXzg3MjNBKCJcbiAgcGFkYXB0ZXItPnB3cmN0cmxwcml2LmJTdXBwb3J0UmVtb3RlV2FrZXVwfn5+WyVkXX5+flxuIiwKLQkJCSAgZGV2aWNlX21heV93YWtldXAoJnB1c2JfaW50Zi0+ZGV2KSk7Ci0JfQotI2VuZGlmCi0JLyogMjAxMi0wNy0xMSBNb3ZlIGhlcmUgdG8gcHJldmVudCB0aGUgODcyM0FTLVZBVSBCVAotCSAqIGF1dG8gc3VzcGVuZCBpbmZsdWVuY2UKLQkgKi8KLQlpZiAodXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKHB1c2JfaW50ZikgPCAwKQotCQlEQkdfODcyM0EoImNhbid0IGdldCBhdXRvcG06XG4iKTsKLSNpZmRlZglDT05GSUdfODcyM0FVX0JUX0NPRVhJU1QKLQlwYWRhcHRlci0+cHdyY3RybHByaXYuYXV0b3BtX2NudCA9IDE7Ci0jZW5kaWYKLQotCS8qIElmIHRoZSBlZXByb20gbWFjIGFkZHJlc3MgaXMgY29ycnVwdGVkLCBhc3NpZ24gYSByYW5kb20gYWRkcmVzcyAqLwotCWlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihwYWRhcHRlci0+ZWVwcm9tcHJpdi5tYWNfYWRkcikgfHwKLQkgICAgaXNfemVyb19ldGhlcl9hZGRyKHBhZGFwdGVyLT5lZXByb21wcml2Lm1hY19hZGRyKSkKLQkJZXRoX3JhbmRvbV9hZGRyKHBhZGFwdGVyLT5lZXByb21wcml2Lm1hY19hZGRyKTsKLQotCURCR184NzIzQSgiYkRyaXZlclN0b3BwZWQ6JWQsIGJTdXJwcmlzZVJlbW92ZWQ6JWQsIGJ1cDolZCwgaHdfaW5pdF9jb21wbGV0ZWQ6JWRcbiIsCi0JCSAgcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkLCBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCwKLQkJICBwYWRhcHRlci0+YnVwLCBwYWRhcHRlci0+aHdfaW5pdF9jb21wbGV0ZWQKLQkpOwotCXN0YXR1cyA9IF9TVUNDRVNTOwotCi1mcmVlX2hhbF9kYXRhOgotCWlmIChzdGF0dXMgIT0gX1NVQ0NFU1MpCi0JCWtmcmVlKHBhZGFwdGVyLT5IYWxEYXRhKTsKLWZyZWVfd2RldjoKLQlpZiAoc3RhdHVzICE9IF9TVUNDRVNTKSB7Ci0JCXJ0d193ZGV2X3VucmVnaXN0ZXIocGFkYXB0ZXItPnJ0d193ZGV2KTsKLQkJcnR3X3dkZXZfZnJlZShwYWRhcHRlci0+cnR3X3dkZXYpOwotCX0KLWZyZWVfYWRhcHRlcjoKLQlpZiAoc3RhdHVzICE9IF9TVUNDRVNTKSB7Ci0JCWlmIChwbmV0ZGV2KQotCQkJZnJlZV9uZXRkZXYocG5ldGRldik7Ci0JCXBhZGFwdGVyID0gTlVMTDsKLQl9Ci0JcmV0dXJuIHBhZGFwdGVyOwotfQotCi1zdGF0aWMgdm9pZCBydHdfdXNiX2lmMV9kZWluaXQoc3RydWN0IHJ0d19hZGFwdGVyICppZjEpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXYgPSBpZjEtPnBuZXRkZXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmlmMS0+bWxtZXByaXY7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKQotCQlydHdfZGlzYXNzb2NfY21kMjNhKGlmMSwgMCwgZmFsc2UpOwotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0JZnJlZV9tbG1lX2FwX2luZm8yM2EoaWYxKTsKLSNlbmRpZgotCi0JaWYgKHBuZXRkZXYpCi0JCXVucmVnaXN0ZXJfbmV0ZGV2KHBuZXRkZXYpOyAvKiB3aWxsIGNhbGwgbmV0ZGV2X2Nsb3NlKCkgKi8KLQotCXJ0d19jYW5jZWxfYWxsX3RpbWVyMjNhKGlmMSk7Ci0KLQlydHdfZGV2X3VubG9hZChpZjEpOwotCi0JREJHXzg3MjNBKCIrcjg3MXh1X2Rldl9yZW1vdmUsIGh3X2luaXRfY29tcGxldGVkID0lZFxuIiwKLQkJICBpZjEtPmh3X2luaXRfY29tcGxldGVkKTsKLQotCWlmIChpZjEtPnJ0d193ZGV2KSB7Ci0JCXJ0d193ZGV2X3VucmVnaXN0ZXIoaWYxLT5ydHdfd2Rldik7Ci0JCXJ0d193ZGV2X2ZyZWUoaWYxLT5ydHdfd2Rldik7Ci0JfQotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9CVF9DT0VYSVNUCi0JaWYgKDEgPT0gaWYxLT5wd3JjdHJscHJpdi5hdXRvcG1fY250KSB7Ci0JCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShhZGFwdGVyX3RvX2R2b2JqKGlmMSktPnB1c2JpbnRmKTsKLQkJaWYxLT5wd3JjdHJscHJpdi5hdXRvcG1fY250LS07Ci0JfQotI2VuZGlmCi0KLQlydHdfZnJlZV9kcnZfc3cyM2EoaWYxKTsKLQotCWlmIChwbmV0ZGV2KQotCQlmcmVlX25ldGRldihwbmV0ZGV2KTsKLX0KLQotc3RhdGljIGludCBydHdfZHJ2X2luaXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKnB1c2JfaW50ZiwKLQkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICpwZGlkKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqaWYxID0gTlVMTDsKLQlzdHJ1Y3QgZHZvYmpfcHJpdiAqZHZvYmo7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7Ci0JaW50IHN0YXR1cyA9IF9GQUlMOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywgIitydHdfZHJ2X2luaXRcbiIpOwotCi0JLyogSW5pdGlhbGl6ZSBkdm9ial9wcml2ICovCi0JZHZvYmogPSB1c2JfZHZvYmpfaW5pdChwdXNiX2ludGYpOwotCWlmICghZHZvYmopIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywKLQkJCSAiaW5pdGlhbGl6ZSBkZXZpY2Ugb2JqZWN0IHByaXYgRmFpbGVkIVxuIik7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQl1ZGV2ID0gZHZvYmotPnB1c2JkZXY7Ci0JZGV2X3dhcm4oJnVkZXYtPmRldiwgIldBUk5JTkc6IFRoZSBydGw4NzIzYXUgZHJpdmVyIGlzIGRlcHJlY2F0ZWQhIik7Ci0JZGV2X3dhcm4oJnVkZXYtPmRldiwgIlBsZWFzZSB1c2UgdGhlIHJ0bDh4eHh1IGRyaXZlciBmb3IgdGhpcyBkZXZpY2UhIik7Ci0KLQlpZjEgPSBydHdfdXNiX2lmMV9pbml0KGR2b2JqLCBwdXNiX2ludGYsIHBkaWQpOwotCWlmICghaWYxKSB7Ci0JCURCR184NzIzQSgicnR3X2luaXRfcHJpbWFyeV9hZGFwdGVyIEZhaWxlZCFcbiIpOwotCQlnb3RvIGZyZWVfZHZvYmo7Ci0JfQotCi0JLyogZGV2X2FsbG9jX25hbWUgJiYgcmVnaXN0ZXJfbmV0ZGV2ICovCi0Jc3RhdHVzID0gcnR3X2Rydl9yZWdpc3Rlcl9uZXRkZXYoaWYxKTsKLQlpZiAoc3RhdHVzICE9IF9TVUNDRVNTKQotCQlnb3RvIGZyZWVfaWYxOwotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sCi0JCSAiLTg3MXhfZHJ2IC0gZHJ2X2luaXQsIHN1Y2Nlc3MhXG4iKTsKLQotCXN0YXR1cyA9IF9TVUNDRVNTOwotCi1mcmVlX2lmMToKLQlpZiAoc3RhdHVzICE9IF9TVUNDRVNTICYmIGlmMSkKLQkJcnR3X3VzYl9pZjFfZGVpbml0KGlmMSk7Ci1mcmVlX2R2b2JqOgotCWlmIChzdGF0dXMgIT0gX1NVQ0NFU1MpCi0JCXVzYl9kdm9ial9kZWluaXQocHVzYl9pbnRmKTsKLWV4aXQ6Ci0JcmV0dXJuIHN0YXR1cyA9PSBfU1VDQ0VTUyA/IDAgOiAtRU5PREVWOwotfQotCi0vKiBkZXZfcmVtb3ZlKCkgLSBvdXIgZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgKi8KLXN0YXRpYyB2b2lkIHJ0d19kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICpwdXNiX2ludGYpCi17Ci0Jc3RydWN0IGR2b2JqX3ByaXYgKmR2b2JqOwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXI7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2OwotCi0JZHZvYmogPSB1c2JfZ2V0X2ludGZkYXRhKHB1c2JfaW50Zik7Ci0JaWYgKCFkdm9iaikKLQkJcmV0dXJuOwotCi0JcGFkYXB0ZXIgPSBkdm9iai0+aWYxOwotCXBuZXRkZXYgPSBwYWRhcHRlci0+cG5ldGRldjsKLQlwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCi0JdXNiX3NldF9pbnRmZGF0YShwdXNiX2ludGYsIE5VTEwpOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywgIitkZXZfcmVtb3ZlKClcbiIpOwotCi0JcnR3X3BtX3NldF9pcHMyM2EocGFkYXB0ZXIsIElQU19OT05FKTsKLQlydHdfcG1fc2V0X2xwczIzYShwYWRhcHRlciwgUFNfTU9ERV9BQ1RJVkUpOwotCi0JTGVhdmVBbGxQb3dlclNhdmVNb2RlMjNhKHBhZGFwdGVyKTsKLQotCXJ0d191c2JfaWYxX2RlaW5pdChwYWRhcHRlcik7Ci0KLQl1c2JfZHZvYmpfZGVpbml0KHB1c2JfaW50Zik7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAiLWRldl9yZW1vdmUoKVxuIik7Ci0JREJHXzg3MjNBKCItcjg3MXh1X2Rldl9yZW1vdmUsIGRvbmVcbiIpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBydHdfZHJ2X2VudHJ5KHZvaWQpCi17Ci0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywgIitydHdfZHJ2X2VudHJ5XG4iKTsKLQlyZXR1cm4gdXNiX3JlZ2lzdGVyKHVzYl9kcnYpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgcnR3X2Rydl9oYWx0KHZvaWQpCi17Ci0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywgIitydHdfZHJ2X2hhbHRcbiIpOwotCURCR184NzIzQSgiK3J0d19kcnZfaGFsdFxuIik7Ci0KLQl1c2JfZGVyZWdpc3Rlcih1c2JfZHJ2KTsKLQotCURCR184NzIzQSgiLXJ0d19kcnZfaGFsdFxuIik7Ci19Ci0KLW1vZHVsZV9pbml0KHJ0d19kcnZfZW50cnkpOwotbW9kdWxlX2V4aXQocnR3X2Rydl9oYWx0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3VzYl9vcHNfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3VzYl9vcHNfbGludXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y0YTUwNi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC91c2Jfb3BzX2xpbnV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9VU0JfT1BTX0xJTlVYX0NfCi0KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLSNpbmNsdWRlIDx1c2Jfb3BzX2xpbnV4Lmg+Ci0jaW5jbHVkZSA8cnR3X3NyZXNldC5oPgotCi12b2lkIHJ0bDg3MjNhdV9yZWFkX3BvcnRfY2FuY2VsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IHJlY3ZfYnVmICpwcmVjdmJ1ZjsKLQlpbnQgaTsKLQotCXByZWN2YnVmID0gKHN0cnVjdCByZWN2X2J1ZiAqKXBhZGFwdGVyLT5yZWN2cHJpdi5wcmVjdl9idWY7Ci0KLQlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlwYWRhcHRlci0+YlJlYWRQb3J0Q2FuY2VsID0gdHJ1ZTsKLQotCWZvciAoaSA9IDA7IGkgPCBOUl9SRUNWQlVGRiA7IGkrKykgewotCQlpZiAocHJlY3ZidWYtPnB1cmIpCi0JCQl1c2Jfa2lsbF91cmIocHJlY3ZidWYtPnB1cmIpOwotCQlwcmVjdmJ1ZisrOwotCX0KLQl1c2Jfa2lsbF91cmIocGFkYXB0ZXItPnJlY3Zwcml2LmludF9pbl91cmIpOwotfQotCi1zdGF0aWMgdm9pZCB1c2Jfd3JpdGVfcG9ydDIzYV9jb21wbGV0ZShzdHJ1Y3QgdXJiICpwdXJiKQotewotCXN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYgPSAoc3RydWN0IHhtaXRfYnVmICopcHVyYi0+Y29udGV4dDsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gcHhtaXRidWYtPnBhZGFwdGVyOwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwaGFsZGF0YTsKLQl1bnNpZ25lZCBsb25nIGlycUw7Ci0KLQlzd2l0Y2ggKHB4bWl0YnVmLT5mbGFncykgewotCWNhc2UgSElHSF9RVUVVRV9JTlg6Ci0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0JCXJ0d19jaGtfaGlfcXVldWVfY21kMjNhKHBhZGFwdGVyKTsKLSNlbmRpZgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlpZiAocGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgfHwgcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8Ci0JICAgIHBhZGFwdGVyLT5iV3JpdGVQb3J0Q2FuY2VsKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJICJ1c2Jfd3JpdGVfcG9ydDIzYV9jb21wbGV0ZTpiRHJpdmVyU3RvcHBlZCglZCkgT1IgYlN1cnByaXNlUmVtb3ZlZCglZClcbiIsCi0JCQkgcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkLCBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCk7Ci0JCURCR184NzIzQSgiJXMoKTogVFggV2FybmluZyEgYkRyaXZlclN0b3BwZWQoJWQpIE9SICIKLQkJCSAgImJTdXJwcmlzZVJlbW92ZWQoJWQpIGJXcml0ZVBvcnRDYW5jZWwoJWQpICIKLQkJCSAgInB4bWl0YnVmLT5leHRfdGFnKCV4KVxuIiwgX19mdW5jX18sCi0JCQkgIHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCwgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQsCi0JCQkgIHBhZGFwdGVyLT5iUmVhZFBvcnRDYW5jZWwsIHB4bWl0YnVmLT5leHRfdGFnKTsKLQotCQlnb3RvIGNoZWNrX2NvbXBsZXRpb247Ci0JfQotCi0JaWYgKHB1cmItPnN0YXR1cykgewotCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCSAidXNiX3dyaXRlX3BvcnQyM2FfY29tcGxldGUgOiBwdXJiLT5zdGF0dXMoJWQpICE9IDBcbiIsCi0JCQkgcHVyYi0+c3RhdHVzKTsKLQkJREJHXzg3MjNBKCIjIyM9PiB1cmJfd3JpdGVfcG9ydF9jb21wbGV0ZSBzdGF0dXMoJWQpXG4iLAotCQkJICBwdXJiLT5zdGF0dXMpOwotCQlpZiAocHVyYi0+c3RhdHVzID09IC1FUElQRSB8fCBwdXJiLT5zdGF0dXMgPT0gLUVQUk9UTykgewotCQl9IGVsc2UgaWYgKHB1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJCSAidXNiX3dyaXRlX3BvcnQyM2FfY29tcGxldGU6IEVJTlBST0dFU1NcbiIpOwotCQkJZ290byBjaGVja19jb21wbGV0aW9uOwotCQl9IGVsc2UgaWYgKHB1cmItPnN0YXR1cyA9PSAtRU5PRU5UKSB7Ci0JCQlEQkdfODcyM0EoIiVzOiAtRU5PRU5UXG4iLCBfX2Z1bmNfXyk7Ci0JCQlnb3RvIGNoZWNrX2NvbXBsZXRpb247Ci0JCX0gZWxzZSBpZiAocHVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VUKSB7Ci0JCQlEQkdfODcyM0EoIiVzOiAtRUNPTk5SRVNFVFxuIiwgX19mdW5jX18pOwotCQkJZ290byBjaGVja19jb21wbGV0aW9uOwotCQl9IGVsc2UgaWYgKHB1cmItPnN0YXR1cyA9PSAtRVNIVVRET1dOKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCQkgInVzYl93cml0ZV9wb3J0MjNhX2NvbXBsZXRlOiBFU0hVVERPV05cbiIpOwotCQkJcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkID0gdHJ1ZTsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJCSAidXNiX3dyaXRlX3BvcnQyM2FfY29tcGxldGU6YkRyaXZlclN0b3BwZWQgPSB0cnVlXG4iKTsKLQkJCWdvdG8gY2hlY2tfY29tcGxldGlvbjsKLQkJfSBlbHNlIHsKLQkJCXBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID0gdHJ1ZTsKLQkJCURCR184NzIzQSgiYlN1cnByaXNlUmVtb3ZlZCA9IHRydWVcbiIpOwotCQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJ1c2Jfd3JpdGVfcG9ydDIzYV9jb21wbGV0ZTpiU3VycHJpc2VSZW1vdmVkID0gdHJ1ZVxuIik7Ci0JCQlnb3RvIGNoZWNrX2NvbXBsZXRpb247Ci0JCX0KLQl9Ci0JcGhhbGRhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBoYWxkYXRhLT5zcmVzdHByaXYubGFzdF90eF9jb21wbGV0ZV90aW1lID0gamlmZmllczsKLQotY2hlY2tfY29tcGxldGlvbjoKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHhtaXRwcml2LT5sb2NrX3NjdHgsIGlycUwpOwotCXJ0dzIzYV9zY3R4X2RvbmVfZXJyKCZweG1pdGJ1Zi0+c2N0eCwKLQkJCSAgICAgcHVyYi0+c3RhdHVzID8gUlRXX1NDVFhfRE9ORV9XUklURV9QT1JUX0VSUiA6Ci0JCQkgICAgIFJUV19TQ1RYX0RPTkVfU1VDQ0VTUyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHhtaXRwcml2LT5sb2NrX3NjdHgsIGlycUwpOwotCi0JcnR3X2ZyZWVfeG1pdGJ1ZjIzYShweG1pdHByaXYsIHB4bWl0YnVmKTsKLQotCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnB4bWl0cHJpdi0+eG1pdF90YXNrbGV0KTsKLX0KLQotaW50IHJ0bDg3MjNhdV93cml0ZV9wb3J0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgY250LAotCQkJIHN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYpCi17Ci0Jc3RydWN0IHVyYiAqcHVyYiA9IE5VTEw7Ci0Jc3RydWN0IGR2b2JqX3ByaXYgKnBkdm9iaiA9IGFkYXB0ZXJfdG9fZHZvYmoocGFkYXB0ZXIpOwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWU7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnB1c2JkID0gcGR2b2JqLT5wdXNiZGV2OwotCXVuc2lnbmVkIGxvbmcgaXJxTDsKLQl1bnNpZ25lZCBpbnQgcGlwZSwgZXBfbnVtOwotCWludCBzdGF0dXM7Ci0JaW50IHJldCA9IF9GQUlMOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sICIrdXNiX3dyaXRlX3BvcnQyM2FcbiIpOwotCi0JaWYgKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkgewotCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCSAiJXM6KHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkhISFcbiIsCi0JCQkgX19mdW5jX18pOwotCQlydHcyM2Ffc2N0eF9kb25lX2VycigmcHhtaXRidWYtPnNjdHgsIFJUV19TQ1RYX0RPTkVfVFhfREVOWSk7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlweG1pdGZyYW1lID0gKHN0cnVjdCB4bWl0X2ZyYW1lICopcHhtaXRidWYtPnByaXZfZGF0YTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHhtaXRwcml2LT5sb2NrLCBpcnFMKTsKLQotCXN3aXRjaCAoYWRkcikgewotCWNhc2UgVk9fUVVFVUVfSU5YOgotCQlweG1pdGJ1Zi0+ZmxhZ3MgPSBWT19RVUVVRV9JTlg7Ci0JCWJyZWFrOwotCWNhc2UgVklfUVVFVUVfSU5YOgotCQlweG1pdGJ1Zi0+ZmxhZ3MgPSBWSV9RVUVVRV9JTlg7Ci0JCWJyZWFrOwotCWNhc2UgQkVfUVVFVUVfSU5YOgotCQlweG1pdGJ1Zi0+ZmxhZ3MgPSBCRV9RVUVVRV9JTlg7Ci0JCWJyZWFrOwotCWNhc2UgQktfUVVFVUVfSU5YOgotCQlweG1pdGJ1Zi0+ZmxhZ3MgPSBCS19RVUVVRV9JTlg7Ci0JCWJyZWFrOwotCWNhc2UgSElHSF9RVUVVRV9JTlg6Ci0JCXB4bWl0YnVmLT5mbGFncyA9IEhJR0hfUVVFVUVfSU5YOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlweG1pdGJ1Zi0+ZmxhZ3MgPSBNR1RfUVVFVUVfSU5YOwotCQlicmVhazsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZweG1pdHByaXYtPmxvY2ssIGlycUwpOwotCi0JcHVyYiA9IHB4bWl0YnVmLT5weG1pdF91cmJbMF07Ci0KLQkvKiB0cmFuc2xhdGUgRE1BIEZJRk8gYWRkciB0byBwaXBlaGFuZGxlICovCi0JZXBfbnVtID0gcGR2b2JqLT5RdWV1ZTJQaXBlW2FkZHJdOwotCXBpcGUgPSB1c2Jfc25kYnVsa3BpcGUocHVzYmQsIGVwX251bSk7Ci0KLQl1c2JfZmlsbF9idWxrX3VyYihwdXJiLCBwdXNiZCwgcGlwZSwKLQkJCSAgcHhtaXRmcmFtZS0+YnVmX2FkZHIsIC8qICBweG1pdGJ1Zi0+cGJ1ZiAqLwotCQkJICBjbnQsIHVzYl93cml0ZV9wb3J0MjNhX2NvbXBsZXRlLAotCQkJICBweG1pdGJ1Zik7LyogY29udGV4dCBpcyBweG1pdGJ1ZiAqLwotCi0Jc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIocHVyYiwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFzdGF0dXMpIHsKLQkJc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwaGFsZGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JCXBoYWxkYXRhLT5zcmVzdHByaXYubGFzdF90eF90aW1lID0gamlmZmllczsKLQl9IGVsc2UgewotCQlydHcyM2Ffc2N0eF9kb25lX2VycigmcHhtaXRidWYtPnNjdHgsCi0JCQkJICAgICBSVFdfU0NUWF9ET05FX1dSSVRFX1BPUlRfRVJSKTsKLQkJREJHXzg3MjNBKCJ1c2Jfd3JpdGVfcG9ydDIzYSwgc3RhdHVzID0lZFxuIiwgc3RhdHVzKTsKLQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkgInVzYl93cml0ZV9wb3J0MjNhKCk6IHVzYl9zdWJtaXRfdXJiLCBzdGF0dXMgPSV4XG4iLAotCQkJIHN0YXR1cyk7Ci0KLQkJc3dpdGNoIChzdGF0dXMpIHsKLQkJY2FzZSAtRU5PREVWOgotCQkJcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkID0gdHJ1ZTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQkJZ290byBleGl0OwotCX0KLQlyZXQgPSBfU1VDQ0VTUzsKLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywgIi11c2Jfd3JpdGVfcG9ydDIzYVxuIik7Ci0KLWV4aXQ6Ci0JaWYgKHJldCAhPSBfU1VDQ0VTUykKLQkJcnR3X2ZyZWVfeG1pdGJ1ZjIzYShweG1pdHByaXYsIHB4bWl0YnVmKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgcnRsODcyM2F1X3dyaXRlX3BvcnRfY2FuY2VsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1ZjsKLQlpbnQgajsKLQotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCXBhZGFwdGVyLT5iV3JpdGVQb3J0Q2FuY2VsID0gdHJ1ZTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkocHhtaXRidWYsICZwYWRhcHRlci0+eG1pdHByaXYueG1pdGJ1Zl9saXN0LAotCQkJICAgIGxpc3QyKSB7Ci0JCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKLQkJCWlmIChweG1pdGJ1Zi0+cHhtaXRfdXJiW2pdKQotCQkJCXVzYl9raWxsX3VyYihweG1pdGJ1Zi0+cHhtaXRfdXJiW2pdKTsKLQkJfQotCX0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHB4bWl0YnVmLCAmcGFkYXB0ZXItPnhtaXRwcml2LnhtaXRleHRidWZfbGlzdCwKLQkJCSAgICBsaXN0MikgewotCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7Ci0JCQlpZiAocHhtaXRidWYtPnB4bWl0X3VyYltqXSkKLQkJCQl1c2Jfa2lsbF91cmIocHhtaXRidWYtPnB4bWl0X3VyYltqXSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC94bWl0X2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC94bWl0X2xpbnV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YmU3MmEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAveG1pdF9saW51eC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfWE1JVF9PU0RFUF9DXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotCi0jaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPHdpZmkuaD4KLSNpbmNsdWRlIDxtbG1lX29zZGVwLmg+Ci0jaW5jbHVkZSA8eG1pdF9vc2RlcC5oPgotI2luY2x1ZGUgPG9zZGVwX2ludGYuaD4KLQotaW50IHJ0d19vc194bWl0X3Jlc291cmNlX2FsbG9jMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICAgc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1ZiwgdTMyIGFsbG9jX3N6KQotewotCWludCBpOwotCi0JcHhtaXRidWYtPnBhbGxvY2F0ZWRfYnVmID0ga3phbGxvYyhhbGxvY19zeiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHB4bWl0YnVmLT5wYWxsb2NhdGVkX2J1ZiA9PSBOVUxMKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQlweG1pdGJ1Zi0+cGJ1ZiA9IFBUUl9BTElHTihweG1pdGJ1Zi0+cGFsbG9jYXRlZF9idWYsIFhNSVRCVUZfQUxJR05fU1opOwotCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQlweG1pdGJ1Zi0+cHhtaXRfdXJiW2ldID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFweG1pdGJ1Zi0+cHhtaXRfdXJiW2ldKSB7Ci0JCQlEQkdfODcyM0EoInB4bWl0YnVmLT5weG1pdF91cmJbaV09PU5VTEwiKTsKLQkJCXJldHVybiBfRkFJTDsKLQkJfQotCX0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXZvaWQgcnR3X29zX3htaXRfcmVzb3VyY2VfZnJlZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICAgIHN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQl1c2JfZnJlZV91cmIocHhtaXRidWYtPnB4bWl0X3VyYltpXSk7Ci0Ja2ZyZWUocHhtaXRidWYtPnBhbGxvY2F0ZWRfYnVmKTsKLX0KLQotI2RlZmluZSBXTU1fWE1JVF9USFJFU0hPTEQJKE5SX1hNSVRGUkFNRSoyLzUpCi0KLXZvaWQgcnR3X29zX3BrdF9jb21wbGV0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KQotewotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0JdTE2CXF1ZXVlOwotCi0JcXVldWUgPSBza2JfZ2V0X3F1ZXVlX21hcHBpbmcocGt0KTsKLQlpZiAocGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi53aWZpX3NwZWMpIHsKLQkJaWYgKF9fbmV0aWZfc3VicXVldWVfc3RvcHBlZChwYWRhcHRlci0+cG5ldGRldiwgcXVldWUpICYmCi0JCSAgICAocHhtaXRwcml2LT5od3htaXRzW3F1ZXVlXS5hY2NudCA8IFdNTV9YTUlUX1RIUkVTSE9MRCkpCi0JCQluZXRpZl93YWtlX3N1YnF1ZXVlKHBhZGFwdGVyLT5wbmV0ZGV2LCBxdWV1ZSk7Ci0JfSBlbHNlIHsKLQkJaWYgKF9fbmV0aWZfc3VicXVldWVfc3RvcHBlZChwYWRhcHRlci0+cG5ldGRldiwgcXVldWUpKQotCQkJbmV0aWZfd2FrZV9zdWJxdWV1ZShwYWRhcHRlci0+cG5ldGRldiwgcXVldWUpOwotCX0KLQlkZXZfa2ZyZWVfc2tiX2FueShwa3QpOwotfQotCi12b2lkIHJ0d19vc194bWl0X2NvbXBsZXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgIHN0cnVjdCB4bWl0X2ZyYW1lICpweGZyYW1lKQotewotCWlmIChweGZyYW1lLT5wa3QpCi0JCXJ0d19vc19wa3RfY29tcGxldGUyM2EocGFkYXB0ZXIsIHB4ZnJhbWUtPnBrdCk7Ci0KLQlweGZyYW1lLT5wa3QgPSBOVUxMOwotfQotCi12b2lkIHJ0d19vc194bWl0X3NjaGVkdWxlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2OwotCi0JaWYgKCFwYWRhcHRlcikKLQkJcmV0dXJuOwotCXB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0KLQlzcGluX2xvY2tfYmgoJnB4bWl0cHJpdi0+bG9jayk7Ci0KLQlpZiAocnR3X3R4ZnJhbWVzX3BlbmRpbmcyM2EocGFkYXB0ZXIpKQotCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZweG1pdHByaXYtPnhtaXRfdGFza2xldCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnB4bWl0cHJpdi0+bG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJ0d19jaGVja194bWl0X3Jlc291cmNlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgIHN0cnVjdCBza19idWZmICpwa3QpCi17Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQl1MTYJcXVldWU7Ci0KLQlxdWV1ZSA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhwa3QpOwotCWlmIChwYWRhcHRlci0+cmVnaXN0cnlwcml2LndpZmlfc3BlYykgewotCQkvKiBObyBmcmVlIHNwYWNlIGZvciBUeCwgdHhfd29ya2VyIGlzIHRvbyBzbG93ICovCi0JCWlmIChweG1pdHByaXYtPmh3eG1pdHNbcXVldWVdLmFjY250ID4gV01NX1hNSVRfVEhSRVNIT0xEKQotCQkJbmV0aWZfc3RvcF9zdWJxdWV1ZShwYWRhcHRlci0+cG5ldGRldiwgcXVldWUpOwotCX0gZWxzZSB7Ci0JCWlmIChweG1pdHByaXYtPmZyZWVfeG1pdGZyYW1lX2NudCA8PSA0KSB7Ci0JCQlpZiAoIW5ldGlmX3R4X3F1ZXVlX3N0b3BwZWQobmV0ZGV2X2dldF90eF9xdWV1ZShwYWRhcHRlci0+cG5ldGRldiwgcXVldWUpKSkKLQkJCQluZXRpZl9zdG9wX3N1YnF1ZXVlKHBhZGFwdGVyLT5wbmV0ZGV2LCBxdWV1ZSk7Ci0JCX0KLQl9Ci19Ci0KLWludCBydHdfeG1pdDIzYV9lbnRyeTIzYShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldikKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYocG5ldGRldik7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlpbnQgcmVzID0gMDsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLCAiK3htaXRfZW5yeVxuIik7Ci0KLQlpZiAoIXJ0d19pZl91cDIzYShwYWRhcHRlcikpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV94bWl0X29zZGVwX2NfLCBfZHJ2X2Vycl8sCi0JCQkgInJ0d194bWl0MjNhX2VudHJ5MjNhOiBydHdfaWZfdXAyM2EgZmFpbFxuIik7Ci0JCWdvdG8gZHJvcF9wYWNrZXQ7Ci0JfQotCi0JcnR3X2NoZWNrX3htaXRfcmVzb3VyY2UocGFkYXB0ZXIsIHNrYik7Ci0KLQlyZXMgPSBydHdfeG1pdDIzYShwYWRhcHRlciwgc2tiKTsKLQlpZiAocmVzIDwgMCkKLQkJZ290byBkcm9wX3BhY2tldDsKLQotCXB4bWl0cHJpdi0+dHhfcGt0cysrOwotCVJUX1RSQUNFKF9tb2R1bGVfeG1pdF9vc2RlcF9jXywgX2Rydl9pbmZvXywKLQkJICJydHdfeG1pdDIzYV9lbnRyeTIzYTogdHhfcGt0cz0lZFxuIiwKLQkJICh1MzIpcHhtaXRwcml2LT50eF9wa3RzKTsKLQlnb3RvIGV4aXQ7Ci0KLWRyb3BfcGFja2V0OgotCXB4bWl0cHJpdi0+dHhfZHJvcCsrOwotCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JUlRfVFJBQ0UoX21vZHVsZV94bWl0X29zZGVwX2NfLCBfZHJ2X25vdGljZV8sCi0JCSAicnR3X3htaXQyM2FfZW50cnkyM2E6IGRyb3AsIHR4X2Ryb3A9JWRcbiIsCi0JCSAodTMyKXB4bWl0cHJpdi0+dHhfZHJvcCk7Ci1leGl0OgotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvbXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L21zLmMKaW5kZXggMGYwY2Q0YS4uZjI3ZGYwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvbXMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9tcy5jCkBAIC02MywxMiArNjMsMTIgQEAKIAlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfQllURV9DTlQsIDB4RkYsIGNudCk7CiAJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIE1TX1RSQU5TX0NGRywgMHhGRiwgY2ZnKTsKIAlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9EQVRBX1NPVVJDRSwKLQkJMHgwMSwgUElOR1BPTkdfQlVGRkVSKTsKKwkJICAgICAweDAxLCBQSU5HUE9OR19CVUZGRVIpOwogCiAJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIE1TX1RSQU5TRkVSLAotCQkweEZGLCBNU19UUkFOU0ZFUl9TVEFSVCB8IHRyYW5zX21vZGUpOworCQkgICAgIDB4RkYsIE1TX1RSQU5TRkVSX1NUQVJUIHwgdHJhbnNfbW9kZSk7CiAJcnRzeF9hZGRfY21kKGNoaXAsIENIRUNLX1JFR19DTUQsIE1TX1RSQU5TRkVSLAotCQlNU19UUkFOU0ZFUl9FTkQsIE1TX1RSQU5TRkVSX0VORCk7CisJCSAgICAgTVNfVFJBTlNGRVJfRU5ELCBNU19UUkFOU0ZFUl9FTkQpOwogCiAJcnRzeF9hZGRfY21kKGNoaXAsIFJFQURfUkVHX0NNRCwgTVNfVFJBTlNfQ0ZHLCAwLCAwKTsKIApAQCAtMTA5LDggKzEwOSw4IEBACiB9CiAKIHN0YXRpYyBpbnQgbXNfdHJhbnNmZXJfZGF0YShzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1OCB0cmFuc19tb2RlLAotCQkJdTggdHBjLCB1MTYgc2VjX2NudCwgdTggY2ZnLCBib29sIG1vZGVfMmssCi0JCQlpbnQgdXNlX3NnLCB2b2lkICpidWYsIGludCBidWZfbGVuKQorCQkJICAgIHU4IHRwYywgdTE2IHNlY19jbnQsIHU4IGNmZywgYm9vbCBtb2RlXzJrLAorCQkJICAgIGludCB1c2Vfc2csIHZvaWQgKmJ1ZiwgaW50IGJ1Zl9sZW4pCiB7CiAJaW50IHJldHZhbDsKIAl1OCB2YWwsIGVycl9jb2RlID0gMDsKQEAgLTIwNiw3ICsyMDYsNyBAQAogCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19CWVRFX0NOVCwgMHhGRiwgY250KTsKIAlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfVFJBTlNfQ0ZHLCAweEZGLCBjZmcpOwogCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX0RBVEFfU09VUkNFLAotCQkweDAxLCBQSU5HUE9OR19CVUZGRVIpOworCQkgICAgIDB4MDEsIFBJTkdQT05HX0JVRkZFUik7CiAKIAlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwKIAkJICAgICBNU19UUkFOU0ZFUiwgMHhGRiwgTVNfVFJBTlNGRVJfU1RBUlQgfCBNU19UTV9XUklURV9CWVRFUyk7CkBAIC0yNTMsNyArMjUzLDcgQEAKIH0KIAogc3RhdGljIGludCBtc19yZWFkX2J5dGVzKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsCi0JCQl1OCB0cGMsIHU4IGNudCwgdTggY2ZnLCB1OCAqZGF0YSwgaW50IGRhdGFfbGVuKQorCQkJIHU4IHRwYywgdTggY250LCB1OCBjZmcsIHU4ICpkYXRhLCBpbnQgZGF0YV9sZW4pCiB7CiAJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmY2hpcC0+bXNfY2FyZDsKIAlpbnQgcmV0dmFsLCBpOwpAQCAtMjcwLDEyICsyNzAsMTIgQEAKIAlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfQllURV9DTlQsIDB4RkYsIGNudCk7CiAJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIE1TX1RSQU5TX0NGRywgMHhGRiwgY2ZnKTsKIAlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9EQVRBX1NPVVJDRSwKLQkJMHgwMSwgUElOR1BPTkdfQlVGRkVSKTsKKwkJICAgICAweDAxLCBQSU5HUE9OR19CVUZGRVIpOwogCiAJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIE1TX1RSQU5TRkVSLCAweEZGLAotCQlNU19UUkFOU0ZFUl9TVEFSVCB8IE1TX1RNX1JFQURfQllURVMpOworCQkgICAgIE1TX1RSQU5TRkVSX1NUQVJUIHwgTVNfVE1fUkVBRF9CWVRFUyk7CiAJcnRzeF9hZGRfY21kKGNoaXAsIENIRUNLX1JFR19DTUQsIE1TX1RSQU5TRkVSLAotCQlNU19UUkFOU0ZFUl9FTkQsIE1TX1RSQU5TRkVSX0VORCk7CisJCSAgICAgTVNfVFJBTlNGRVJfRU5ELCBNU19UUkFOU0ZFUl9FTkQpOwogCiAJZm9yIChpID0gMDsgaSA8IGRhdGFfbGVuIC0gMTsgaSsrKQogCQlydHN4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCBQUEJVRl9CQVNFMiArIGksIDAsIDApOwpAQCAtMjg0LDcgKzI4NCw3IEBACiAJCXJ0c3hfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIFBQQlVGX0JBU0UyICsgZGF0YV9sZW4sIDAsIDApOwogCWVsc2UKIAkJcnRzeF9hZGRfY21kKGNoaXAsIFJFQURfUkVHX0NNRCwgUFBCVUZfQkFTRTIgKyBkYXRhX2xlbiAtIDEsCi0JCQkwLCAwKTsKKwkJCSAgICAgMCwgMCk7CiAKIAlyZXR2YWwgPSBydHN4X3NlbmRfY21kKGNoaXAsIE1TX0NBUkQsIDUwMDApOwogCWlmIChyZXR2YWwgPCAwKSB7CkBAIC0zMzQsOCArMzM0LDggQEAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLXN0YXRpYyBpbnQgbXNfc2V0X3J3X3JlZ19hZGRyKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsCi0JCXU4IHJlYWRfc3RhcnQsIHU4IHJlYWRfY250LCB1OCB3cml0ZV9zdGFydCwgdTggd3JpdGVfY250KQorc3RhdGljIGludCBtc19zZXRfcndfcmVnX2FkZHIoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgdTggcmVhZF9zdGFydCwKKwkJCSAgICAgIHU4IHJlYWRfY250LCB1OCB3cml0ZV9zdGFydCwgdTggd3JpdGVfY250KQogewogCWludCByZXR2YWwsIGk7CiAJdTggZGF0YVs0XTsKQEAgLTE0MTcsNyArMTQxNyw2IEBACiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQogCi0KIHN0YXRpYyBpbnQgbXNfcmVhZF9leHRyYV9kYXRhKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsCiAJCXUxNiBibG9ja19hZGRyLCB1OCBwYWdlX251bSwgdTggKmJ1ZiwgaW50IGJ1Zl9sZW4pCiB7CkBAIC0xNTgyLDcgKzE1ODEsNiBAQAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAotCiBzdGF0aWMgaW50IG1zX3JlYWRfcGFnZShzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1MTYgYmxvY2tfYWRkciwgdTggcGFnZV9udW0pCiB7CiAJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmY2hpcC0+bXNfY2FyZDsKQEAgLTE2NjcsNyArMTY2NSw2IEBACiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQogCi0KIHN0YXRpYyBpbnQgbXNfc2V0X2JhZF9ibG9jayhzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1MTYgcGh5X2JsaykKIHsKIAlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICZjaGlwLT5tc19jYXJkOwpAQCAtMTczOCw3ICsxNzM1LDYgQEAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLQogc3RhdGljIGludCBtc19lcmFzZV9ibG9jayhzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1MTYgcGh5X2JsaykKIHsKIAlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICZjaGlwLT5tc19jYXJkOwpAQCAtMTgwOCw3ICsxODA0LDYgQEAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLQogc3RhdGljIHZvaWQgbXNfc2V0X3BhZ2Vfc3RhdHVzKHUxNiBsb2dfYmxrLCB1OCB0eXBlLCB1OCAqZXh0cmEsIGludCBleHRyYV9sZW4pCiB7CiAJaWYgKCFleHRyYSB8fCAoZXh0cmFfbGVuIDwgTVNfRVhUUkFfU0laRSkpCkBAIC0yMTUyLDcgKzIxNDcsNiBAQAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAotCiBzdGF0aWMgaW50IHJlc2V0X21zKHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7CiAJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmY2hpcC0+bXNfY2FyZDsKQEAgLTI0NzEsNyArMjQ2NSw3IEBACiAJaWYgKCFtc19jYXJkLT5zZWdtZW50KQogCQlyZXR1cm4gMHhGRkZGOwogCi0Jc2VnbWVudCA9ICYobXNfY2FyZC0+c2VnbWVudFtzZWdfbm9dKTsKKwlzZWdtZW50ID0gJm1zX2NhcmQtPnNlZ21lbnRbc2VnX25vXTsKIAogCWlmIChzZWdtZW50LT5sMnBfdGFibGUpCiAJCXJldHVybiBzZWdtZW50LT5sMnBfdGFibGVbbG9nX29mZl07CkBAIC0yNDg4LDcgKzI0ODIsNyBAQAogCWlmICghbXNfY2FyZC0+c2VnbWVudCkKIAkJcmV0dXJuOwogCi0Jc2VnbWVudCA9ICYobXNfY2FyZC0+c2VnbWVudFtzZWdfbm9dKTsKKwlzZWdtZW50ID0gJm1zX2NhcmQtPnNlZ21lbnRbc2VnX25vXTsKIAlpZiAoc2VnbWVudC0+bDJwX3RhYmxlKQogCQlzZWdtZW50LT5sMnBfdGFibGVbbG9nX29mZl0gPSBwaHlfYmxrOwogfQpAQCAtMjUwMCw3ICsyNDk0LDcgQEAKIAlpbnQgc2VnX25vOwogCiAJc2VnX25vID0gKGludClwaHlfYmxrID4+IDk7Ci0Jc2VnbWVudCA9ICYobXNfY2FyZC0+c2VnbWVudFtzZWdfbm9dKTsKKwlzZWdtZW50ID0gJm1zX2NhcmQtPnNlZ21lbnRbc2VnX25vXTsKIAogCXNlZ21lbnQtPmZyZWVfdGFibGVbc2VnbWVudC0+c2V0X2luZGV4KytdID0gcGh5X2JsazsKIAlpZiAoc2VnbWVudC0+c2V0X2luZGV4ID49IE1TX0ZSRUVfVEFCTEVfQ05UKQpAQCAtMjUxNSw3ICsyNTA5LDcgQEAKIAlzdHJ1Y3Qgem9uZV9lbnRyeSAqc2VnbWVudDsKIAl1MTYgcGh5X2JsazsKIAotCXNlZ21lbnQgPSAmKG1zX2NhcmQtPnNlZ21lbnRbc2VnX25vXSk7CisJc2VnbWVudCA9ICZtc19jYXJkLT5zZWdtZW50W3NlZ19ub107CiAKIAlpZiAoc2VnbWVudC0+dW51c2VkX2Jsa19jbnQgPD0gMCkKIAkJcmV0dXJuIDB4RkZGRjsKQEAgLTI1NDQsNyArMjUzOCw3IEBACiAJdTE2IHRtcF9ibGs7CiAKIAlzZWdfbm8gPSAoaW50KXBoeV9ibGsgPj4gOTsKLQlzZWdtZW50ID0gJihtc19jYXJkLT5zZWdtZW50W3NlZ19ub10pOworCXNlZ21lbnQgPSAmbXNfY2FyZC0+c2VnbWVudFtzZWdfbm9dOwogCXRtcF9ibGsgPSBzZWdtZW50LT5sMnBfdGFibGVbbG9nX29mZl07CiAKIAlpZiAodXMxICE9IHVzMikgewpAQCAtMjYwOCw3ICsyNjAyLDcgQEAKIAllbHNlCiAJCXRhYmxlX3NpemUgPSA0OTY7CiAKLQlzZWdtZW50ID0gJihtc19jYXJkLT5zZWdtZW50W3NlZ19ub10pOworCXNlZ21lbnQgPSAmbXNfY2FyZC0+c2VnbWVudFtzZWdfbm9dOwogCiAJaWYgKCFzZWdtZW50LT5sMnBfdGFibGUpIHsKIAkJc2VnbWVudC0+bDJwX3RhYmxlID0gdm1hbGxvYyh0YWJsZV9zaXplICogMik7CkBAIC0yNzE3LDcgKzI3MTEsNyBAQAogCQl1czIgPSBleHRyYVswXSAmIDB4MTA7CiAKIAkJKHZvaWQpbXNfYXJiaXRyYXRlX2wycChjaGlwLCBwaHlfYmxrLAotCQkJCWxvZ19ibGstbXNfc3RhcnRfaWR4W3NlZ19ub10sIHVzMSwgdXMyKTsKKwkJCQlsb2dfYmxrIC0gbXNfc3RhcnRfaWR4W3NlZ19ub10sIHVzMSwgdXMyKTsKIAkJY29udGludWU7CiAJfQogCkBAIC0yODA5LDcgKzI4MDMsNiBAQAogCXJldHVybiBTVEFUVVNfRkFJTDsKIH0KIAotCiBpbnQgcmVzZXRfbXNfY2FyZChzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKQogewogCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJmNoaXAtPm1zX2NhcmQ7CkBAIC0yODk2LDcgKzI4ODksNiBAQAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAotCiB2b2lkIG1zcHJvX3N0b3Bfc2VxX21vZGUoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCkKIHsKIAlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICZjaGlwLT5tc19jYXJkOwpAQCAtMzMxMiw3ICszMzA0LDYgQEAKIAlyZXR1cm4gU1RBVFVTX0ZBSUw7CiB9CiAKLQogc3RhdGljIGludCBtc19yZWFkX211bHRpcGxlX3BhZ2VzKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHUxNiBwaHlfYmxrLAogCQkJCXUxNiBsb2dfYmxrLCB1OCBzdGFydF9wYWdlLCB1OCBlbmRfcGFnZSwKIAkJCQl1OCAqYnVmLCB1bnNpZ25lZCBpbnQgKmluZGV4LApAQCAtMzcxOSw3ICszNzEwLDYgQEAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLQogc3RhdGljIGludCBtc19maW5pc2hfd3JpdGUoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgdTE2IG9sZF9ibGssIHUxNiBuZXdfYmxrLAogCQl1MTYgbG9nX2JsaywgdTggcGFnZV9vZmYpCiB7CkBAIC0zNzcwLDcgKzM3NjAsNyBAQAogaW50IG1zX2RlbGF5X3dyaXRlKHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7CiAJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmY2hpcC0+bXNfY2FyZDsKLQlzdHJ1Y3QgbXNfZGVsYXlfd3JpdGVfdGFnICpkZWxheV93cml0ZSA9ICYobXNfY2FyZC0+ZGVsYXlfd3JpdGUpOworCXN0cnVjdCBtc19kZWxheV93cml0ZV90YWcgKmRlbGF5X3dyaXRlID0gJm1zX2NhcmQtPmRlbGF5X3dyaXRlOwogCWludCByZXR2YWw7CiAKIAlpZiAoZGVsYXlfd3JpdGUtPmRlbGF5X3dyaXRlX2ZsYWcpIHsKQEAgLTM4MTYsNyArMzgwNiw3IEBACiAJdTggc3RhcnRfcGFnZSwgZW5kX3BhZ2UgPSAwLCBwYWdlX2NudDsKIAl1OCAqcHRyOwogI2lmZGVmIE1TX0RFTEFZX1dSSVRFCi0Jc3RydWN0IG1zX2RlbGF5X3dyaXRlX3RhZyAqZGVsYXlfd3JpdGUgPSAmKG1zX2NhcmQtPmRlbGF5X3dyaXRlKTsKKwlzdHJ1Y3QgbXNfZGVsYXlfd3JpdGVfdGFnICpkZWxheV93cml0ZSA9ICZtc19jYXJkLT5kZWxheV93cml0ZTsKICNlbmRpZgogCiAJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0VSUk9SKTsKQEAgLTM5OTYsNyArMzk4Niw3IEBACiAKIAkJZm9yIChzZWdfbm8gPSAwOyBzZWdfbm8gPCBBUlJBWV9TSVpFKG1zX3N0YXJ0X2lkeCkgLSAxOwogCQkJCXNlZ19ubysrKSB7Ci0JCQlpZiAobG9nX2JsayA8IG1zX3N0YXJ0X2lkeFtzZWdfbm8rMV0pCisJCQlpZiAobG9nX2JsayA8IG1zX3N0YXJ0X2lkeFtzZWdfbm8gKyAxXSkKIAkJCQlicmVhazsKIAkJfQogCkBAIC00MDgyLDEzICs0MDcyLDEyIEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotCiB2b2lkIG1zX2ZyZWVfbDJwX3RibChzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKQogewogCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJmNoaXAtPm1zX2NhcmQ7CiAJaW50IGkgPSAwOwogCi0JaWYgKG1zX2NhcmQtPnNlZ21lbnQgIT0gTlVMTCkgeworCWlmIChtc19jYXJkLT5zZWdtZW50KSB7CiAJCWZvciAoaSA9IDA7IGkgPCBtc19jYXJkLT5zZWdtZW50X2NudDsgaSsrKSB7CiAJCQl2ZnJlZShtc19jYXJkLT5zZWdtZW50W2ldLmwycF90YWJsZSk7CiAJCQltc19jYXJkLT5zZWdtZW50W2ldLmwycF90YWJsZSA9IE5VTEw7CkBAIC00MzEzLDcgKzQzMDIsNyBAQAogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX0tFWV9GQUlMX05PVF9BVVRIRU4pOwogCQlydHN4X3RyYWNlKGNoaXApOwotCQlnb3RvIEdldEVLQkZpbmlzaDsKKwkJZ290byBmcmVlX2J1ZmZlcjsKIAl9CiAKIAlyZXR2YWwgPSBtc190cmFuc2Zlcl9kYXRhKGNoaXAsIE1TX1RNX0FVVE9fUkVBRCwgUFJPX1JFQURfTE9OR19EQVRBLApAQCAtNDMyMiwxOSArNDMxMSwyMCBAQAogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUdfS0VZX0ZBSUxfTk9UX0FVVEhFTik7CiAJCXJ0c3hfY2xlYXJfbXNfZXJyb3IoY2hpcCk7CiAJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCWdvdG8gR2V0RUtCRmluaXNoOworCQlnb3RvIGZyZWVfYnVmZmVyOwogCX0KIAlpZiAoY2hlY2tfbXNfZXJyKGNoaXApKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19LRVlfRkFJTF9OT1RfQVVUSEVOKTsKIAkJcnRzeF9jbGVhcl9tc19lcnJvcihjaGlwKTsKIAkJcnRzeF90cmFjZShjaGlwKTsKLQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQlyZXR2YWwgPSBTVEFUVVNfRkFJTDsKKwkJZ290byBmcmVlX2J1ZmZlcjsKIAl9CiAKIAlidWZmbGVuID0gbWluX3QoaW50LCAxMDUyLCBzY3NpX2J1ZmZsZW4oc3JiKSk7CiAJcnRzeF9zdG9yX3NldF94ZmVyX2J1ZihidWYsIGJ1ZmZsZW4sIHNyYik7CiAKLUdldEVLQkZpbmlzaDoKK2ZyZWVfYnVmZmVyOgogCWtmcmVlKGJ1Zik7CiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTQ1NjYsNyArNDU1Niw3IEBACiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfVU5SRUNPVkVSX1JFQURfRVJSKTsKIAkJcnRzeF90cmFjZShjaGlwKTsKLQkJZ290byBHZXRJQ1ZGaW5pc2g7CisJCWdvdG8gZnJlZV9idWZmZXI7CiAJfQogCiAJcmV0dmFsID0gbXNfdHJhbnNmZXJfZGF0YShjaGlwLCBNU19UTV9BVVRPX1JFQUQsIFBST19SRUFEX0xPTkdfREFUQSwKQEAgLTQ1NzUsMTkgKzQ1NjUsMjAgQEAKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7CiAJCXJ0c3hfY2xlYXJfbXNfZXJyb3IoY2hpcCk7CiAJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCWdvdG8gR2V0SUNWRmluaXNoOworCQlnb3RvIGZyZWVfYnVmZmVyOwogCX0KIAlpZiAoY2hlY2tfbXNfZXJyKGNoaXApKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlIpOwogCQlydHN4X2NsZWFyX21zX2Vycm9yKGNoaXApOwogCQlydHN4X3RyYWNlKGNoaXApOwotCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCXJldHZhbCA9IFNUQVRVU19GQUlMOworCQlnb3RvIGZyZWVfYnVmZmVyOwogCX0KIAogCWJ1ZmZsZW4gPSBtaW5fdChpbnQsIDEwMjgsIHNjc2lfYnVmZmxlbihzcmIpKTsKIAlydHN4X3N0b3Jfc2V0X3hmZXJfYnVmKGJ1ZiwgYnVmZmxlbiwgc3JiKTsKIAotR2V0SUNWRmluaXNoOgorZnJlZV9idWZmZXI6CiAJa2ZyZWUoYnVmKTsKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtNDY1Nyw4ICs0NjQ4LDggQEAKIAogCQlydHN4X3NlbmRfY21kX25vX3dhaXQoY2hpcCk7CiAKLQkJcmV0dmFsID0gcnRzeF90cmFuc2Zlcl9kYXRhKGNoaXAsIE1TX0NBUkQsIGJ1ZiArIDQgKyBpKjUxMiwKLQkJCQkJNTEyLCAwLCBETUFfVE9fREVWSUNFLCAzMDAwKTsKKwkJcmV0dmFsID0gcnRzeF90cmFuc2Zlcl9kYXRhKGNoaXAsIE1TX0NBUkQsIGJ1ZiArIDQgKyBpICogNTEyLAorCQkJCQkgICAgNTEyLCAwLCBETUFfVE9fREVWSUNFLCAzMDAwKTsKIAkJaWYgKChyZXR2YWwgPCAwKSB8fCBjaGVja19tc19lcnIoY2hpcCkpIHsKIAkJCXJ0c3hfY2xlYXJfbXNfZXJyb3IoY2hpcCk7CiAJCQlpZiAobXNfY2FyZC0+bWdfYXV0aCA9PSAwKSB7CkBAIC00NzA1LDcgKzQ2OTYsNyBAQAogCiB2b2lkIG1zX2NsZWFudXBfd29yayhzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKQogewotCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKKwlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICZjaGlwLT5tc19jYXJkOwogCiAJaWYgKENIS19NU1BSTyhtc19jYXJkKSkgewogCQlpZiAobXNfY2FyZC0+c2VxX21vZGUpIHsKQEAgLTQ3NzAsNyArNDc2MSw3IEBACiAKIGludCByZWxlYXNlX21zX2NhcmQoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCkKIHsKLQlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICYoY2hpcC0+bXNfY2FyZCk7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmY2hpcC0+bXNfY2FyZDsKIAlpbnQgcmV0dmFsOwogCiAjaWZkZWYgTVNfREVMQVlfV1JJVEUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L21zLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9tcy5oCmluZGV4IGQ5MTkxNzAuLmQ3Njg2MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L21zLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvbXMuaApAQCAtMTI1LDcgKzEyNSw2IEBACiAjZGVmaW5lIFByb19DYXRhZ29yeVJlZwkJMHgwNgogI2RlZmluZSBQcm9fQ2xhc3NSZWcJCTB4MDcKIAotCiAjZGVmaW5lIFByb19TeXN0ZW1QYXJtCQkweDEwCiAjZGVmaW5lIFByb19EYXRhQ291bnQxCQkweDExCiAjZGVmaW5lIFByb19EYXRhQ291bnQwCQkweDEyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4LmMKaW5kZXggMjVkMDk1YS4uNWQ2NWE1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3guYwpAQCAtMzQsMjcgKzM0LDI3IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZGVsYXlfdXNlID0gMTsKLW1vZHVsZV9wYXJhbShkZWxheV91c2UsIHVpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbShkZWxheV91c2UsIHVpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWxheV91c2UsICJzZWNvbmRzIHRvIGRlbGF5IGJlZm9yZSB1c2luZyBhIG5ldyBkZXZpY2UiKTsKIAogc3RhdGljIGludCBzc19lbjsKLW1vZHVsZV9wYXJhbShzc19lbiwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW0oc3NfZW4sIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHNzX2VuLCAiZW5hYmxlIHNlbGVjdGl2ZSBzdXNwZW5kIik7CiAKIHN0YXRpYyBpbnQgc3NfaW50ZXJ2YWwgPSA1MDsKLW1vZHVsZV9wYXJhbShzc19pbnRlcnZhbCwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW0oc3NfaW50ZXJ2YWwsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHNzX2ludGVydmFsLCAiSW50ZXJ2YWwgdG8gZW50ZXIgc3Mgc3RhdGUgaW4gc2Vjb25kcyIpOwogCiBzdGF0aWMgaW50IGF1dG9fZGVsaW5rX2VuOwotbW9kdWxlX3BhcmFtKGF1dG9fZGVsaW5rX2VuLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbShhdXRvX2RlbGlua19lbiwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoYXV0b19kZWxpbmtfZW4sICJlbmFibGUgYXV0byBkZWxpbmsiKTsKIAogc3RhdGljIHVuc2lnbmVkIGNoYXIgYXNwbV9sMHNfbDFfZW47Ci1tb2R1bGVfcGFyYW0oYXNwbV9sMHNfbDFfZW4sIGJ5dGUsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbShhc3BtX2wwc19sMV9lbiwgYnl0ZSwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGFzcG1fbDBzX2wxX2VuLCAiZW5hYmxlIGRldmljZSBhc3BtIik7CiAKIHN0YXRpYyBpbnQgbXNpX2VuOwotbW9kdWxlX3BhcmFtKG1zaV9lbiwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW0obXNpX2VuLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhtc2lfZW4sICJlbmFibGUgbXNpIik7CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBydHN4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwpAQCAtODEsMTQgKzgxLDE2IEBACiAKIHN0YXRpYyBpbnQgc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKIHsKLQkvKiBTY2F0dGVyLWdhdGhlciBidWZmZXJzIChhbGwgYnV0IHRoZSBsYXN0KSBtdXN0IGhhdmUgYSBsZW5ndGgKKwkvKgorCSAqIFNjYXR0ZXItZ2F0aGVyIGJ1ZmZlcnMgKGFsbCBidXQgdGhlIGxhc3QpIG11c3QgaGF2ZSBhIGxlbmd0aAogCSAqIGRpdmlzaWJsZSBieSB0aGUgYnVsayBtYXhwYWNrZXQgc2l6ZS4gIE90aGVyd2lzZSBhIGRhdGEgcGFja2V0CiAJICogd291bGQgZW5kIHVwIGJlaW5nIHNob3J0LCBjYXVzaW5nIGEgcHJlbWF0dXJlIGVuZCB0byB0aGUgZGF0YQogCSAqIHRyYW5zZmVyLiAgU2luY2UgaGlnaC1zcGVlZCBidWxrIHBpcGVzIGhhdmUgYSBtYXhwYWNrZXQgc2l6ZQogCSAqIG9mIDUxMiwgd2UnbGwgdXNlIHRoYXQgYXMgdGhlIHNjc2kgZGV2aWNlIHF1ZXVlJ3MgRE1BIGFsaWdubWVudAogCSAqIG1hc2suICBHdWFyYW50ZWVpbmcgcHJvcGVyIGFsaWdubWVudCBvZiB0aGUgZmlyc3QgYnVmZmVyIHdpbGwKIAkgKiBoYXZlIHRoZSBkZXNpcmVkIGVmZmVjdCBiZWNhdXNlLCBleGNlcHQgYXQgdGhlIGJlZ2lubmluZyBhbmQKLQkgKiB0aGUgZW5kLCBzY2F0dGVyLWdhdGhlciBidWZmZXJzIGZvbGxvdyBwYWdlIGJvdW5kYXJpZXMuICovCisJICogdGhlIGVuZCwgc2NhdHRlci1nYXRoZXIgYnVmZmVycyBmb2xsb3cgcGFnZSBib3VuZGFyaWVzLgorCSAqLwogCWJsa19xdWV1ZV9kbWFfYWxpZ25tZW50KHNkZXYtPnJlcXVlc3RfcXVldWUsICg1MTIgLSAxKSk7CiAKIAkvKiBTZXQgdGhlIFNDU0kgbGV2ZWwgdG8gYXQgbGVhc3QgMi4gIFdlJ2xsIGxlYXZlIGl0IGF0IDMgaWYgdGhhdCdzCkBAIC0xMTEsNyArMTEzLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIC9wcm9jL3Njc2kvIGZ1bmN0aW9ucwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTMwLDcgKzEzMSw3IEBACiAJc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCA9IGRldi0+Y2hpcDsKIAogCS8qIGNoZWNrIGZvciBzdGF0ZS10cmFuc2l0aW9uIGVycm9ycyAqLwotCWlmIChjaGlwLT5zcmIgIT0gTlVMTCkgeworCWlmIChjaGlwLT5zcmIpIHsKIAkJZGV2X2VycigmZGV2LT5wY2ktPmRldiwgIkVycm9yOiBjaGlwLT5zcmIgPSAlcFxuIiwKIAkJCWNoaXAtPnNyYik7CiAJCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOwpAQCAtMTg2LDggKzE4NywxMCBAQAogCXJldHVybiBTVUNDRVNTOwogfQogCi0vKiBUaGlzIGludm9rZXMgdGhlIHRyYW5zcG9ydCByZXNldCBtZWNoYW5pc20gdG8gcmVzZXQgdGhlIHN0YXRlIG9mIHRoZQotICogZGV2aWNlICovCisvKgorICogVGhpcyBpbnZva2VzIHRoZSB0cmFuc3BvcnQgcmVzZXQgbWVjaGFuaXNtIHRvIHJlc2V0IHRoZSBzdGF0ZSBvZiB0aGUKKyAqIGRldmljZQorICovCiBzdGF0aWMgaW50IGRldmljZV9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIpCiB7CiAJaW50IHJlc3VsdCA9IDA7CkBAIC0yMDksNyArMjEyLDYgQEAKIAlyZXR1cm4gcmVzdWx0IDwgMCA/IEZBSUxFRCA6IFNVQ0NFU1M7CiB9CiAKLQogLyoKICAqIHRoaXMgZGVmaW5lcyBvdXIgaG9zdCB0ZW1wbGF0ZSwgd2l0aCB3aGljaCB3ZSdsbCBhbGxvY2F0ZSBob3N0cwogICovCkBAIC0yNTksNyArMjYxLDYgQEAKIAkubW9kdWxlID0JCQlUSElTX01PRFVMRQogfTsKIAotCiBzdGF0aWMgaW50IHJ0c3hfYWNxdWlyZV9pcnEoc3RydWN0IHJ0c3hfZGV2ICpkZXYpCiB7CiAJc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCA9IGRldi0+Y2hpcDsKQEAgLTI4Miw3ICsyODMsNiBAQAogCXJldHVybiAwOwogfQogCi0KIGludCBydHN4X3JlYWRfcGNpX2NmZ19ieXRlKHU4IGJ1cywgdTggZGV2LCB1OCBmdW5jLCB1OCBvZmZzZXQsIHU4ICp2YWwpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CkBAIC01MTUsNyArNTE1LDYgQEAKIAljb21wbGV0ZV9hbmRfZXhpdCgmZGV2LT5jb250cm9sX2V4aXQsIDApOwogfQogCi0KIHN0YXRpYyBpbnQgcnRzeF9wb2xsaW5nX3RocmVhZCh2b2lkICpfX2RldikKIHsKIAlzdHJ1Y3QgcnRzeF9kZXYgKmRldiA9IF9fZGV2OwpAQCAtNjI1LDcgKzYyNCw2IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi0KIC8qIFJlbGVhc2UgYWxsIG91ciBkeW5hbWljIHJlc291cmNlcyAqLwogc3RhdGljIHZvaWQgcnRzeF9yZWxlYXNlX3Jlc291cmNlcyhzdHJ1Y3QgcnRzeF9kZXYgKmRldikKIHsKQEAgLTY2MCwxNSArNjU4LDE5IEBACiAJa2ZyZWUoZGV2LT5jaGlwKTsKIH0KIAotLyogRmlyc3Qgc3RhZ2Ugb2YgZGlzY29ubmVjdCBwcm9jZXNzaW5nOiBzdG9wIGFsbCBjb21tYW5kcyBhbmQgcmVtb3ZlCi0gKiB0aGUgaG9zdCAqLworLyoKKyAqIEZpcnN0IHN0YWdlIG9mIGRpc2Nvbm5lY3QgcHJvY2Vzc2luZzogc3RvcCBhbGwgY29tbWFuZHMgYW5kIHJlbW92ZQorICogdGhlIGhvc3QKKyAqLwogc3RhdGljIHZvaWQgcXVpZXNjZV9hbmRfcmVtb3ZlX2hvc3Qoc3RydWN0IHJ0c3hfZGV2ICpkZXYpCiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IHJ0c3hfdG9faG9zdChkZXYpOwogCXN0cnVjdCBydHN4X2NoaXAgKmNoaXAgPSBkZXYtPmNoaXA7CiAKLQkvKiBQcmV2ZW50IG5ldyB0cmFuc2ZlcnMsIHN0b3AgdGhlIGN1cnJlbnQgY29tbWFuZCwgYW5kCi0JICogaW50ZXJydXB0IGEgU0NTSS1zY2FuIG9yIGRldmljZS1yZXNldCBkZWxheSAqLworCS8qCisJICogUHJldmVudCBuZXcgdHJhbnNmZXJzLCBzdG9wIHRoZSBjdXJyZW50IGNvbW1hbmQsIGFuZAorCSAqIGludGVycnVwdCBhIFNDU0ktc2NhbiBvciBkZXZpY2UtcmVzZXQgZGVsYXkKKwkgKi8KIAltdXRleF9sb2NrKCZkZXYtPmRldl9tdXRleCk7CiAJc2NzaV9sb2NrKGhvc3QpOwogCXJ0c3hfc2V0X3N0YXQoY2hpcCwgUlRTWF9TVEFUX0RJU0NPTk5FQ1QpOwpAQCAtNjgwLDkgKzY4MiwxMSBAQAogCS8qIFdhaXQgc29tZSB0aW1lIHRvIGxldCBvdGhlciB0aHJlYWRzIGV4aXN0ICovCiAJd2FpdF90aW1lb3V0KDEwMCk7CiAKLQkvKiBxdWV1ZWNvbW1hbmQgd29uJ3QgYWNjZXB0IGFueSBuZXcgY29tbWFuZHMgYW5kIHRoZSBjb250cm9sCisJLyoKKwkgKiBxdWV1ZWNvbW1hbmQgd29uJ3QgYWNjZXB0IGFueSBuZXcgY29tbWFuZHMgYW5kIHRoZSBjb250cm9sCiAJICogdGhyZWFkIHdvbid0IGV4ZWN1dGUgYSBwcmV2aW91c2x5LXF1ZXVlZCBjb21tYW5kLiAgSWYgdGhlcmUKLQkgKiBpcyBzdWNoIGEgY29tbWFuZCBwZW5kaW5nLCBjb21wbGV0ZSBpdCB3aXRoIGFuIGVycm9yLiAqLworCSAqIGlzIHN1Y2ggYSBjb21tYW5kIHBlbmRpbmcsIGNvbXBsZXRlIGl0IHdpdGggYW4gZXJyb3IuCisJICovCiAJbXV0ZXhfbG9jaygmZGV2LT5kZXZfbXV0ZXgpOwogCWlmIChjaGlwLT5zcmIpIHsKIAkJY2hpcC0+c3JiLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKQEAgLTcwMiw4ICs3MDYsMTAgQEAKIHsKIAlydHN4X3JlbGVhc2VfcmVzb3VyY2VzKGRldik7CiAKLQkvKiBEcm9wIG91ciByZWZlcmVuY2UgdG8gdGhlIGhvc3Q7IHRoZSBTQ1NJIGNvcmUgd2lsbCBmcmVlIGl0Ci0JICogd2hlbiB0aGUgcmVmY291bnQgYmVjb21lcyAwLiAqLworCS8qCisJICogRHJvcCBvdXIgcmVmZXJlbmNlIHRvIHRoZSBob3N0OyB0aGUgU0NTSSBjb3JlIHdpbGwgZnJlZSBpdAorCSAqIHdoZW4gdGhlIHJlZmNvdW50IGJlY29tZXMgMC4KKwkgKi8KIAlzY3NpX2hvc3RfcHV0KHJ0c3hfdG9faG9zdChkZXYpKTsKIH0KIApAQCAtOTQyLDggKzk0OCwxMCBAQAogCiAJcnRzeF9pbml0X2NoaXAoZGV2LT5jaGlwKTsKIAotCS8qIHNldCB0aGUgc3VwcG9ydGVkIG1heF9sdW4gYW5kIG1heF9pZCBmb3IgdGhlIHNjc2kgaG9zdAotCSAqIE5PVEU6IHRoZSBtaW5pbWFsIHZhbHVlIG9mIG1heF9pZCBpcyAxICovCisJLyoKKwkgKiBzZXQgdGhlIHN1cHBvcnRlZCBtYXhfbHVuIGFuZCBtYXhfaWQgZm9yIHRoZSBzY3NpIGhvc3QKKwkgKiBOT1RFOiB0aGUgbWluaW1hbCB2YWx1ZSBvZiBtYXhfaWQgaXMgMQorCSAqLwogCWhvc3QtPm1heF9pZCA9IDE7CiAJaG9zdC0+bWF4X2x1biA9IGRldi0+Y2hpcC0+bWF4X2x1bjsKIApAQCAtOTk0LDcgKzEwMDIsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLQogc3RhdGljIHZvaWQgcnRzeF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaSkKIHsKIAlzdHJ1Y3QgcnRzeF9kZXYgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2kpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeC5oCmluZGV4IDEzOTYyNjMuLmU3MjViMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3guaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4LmgKQEAgLTcwLDE0ICs3MCwxMyBAQAogI2RlZmluZSBydHN4X3dyaXRlX2NvbmZpZ19ieXRlKGNoaXAsIHdoZXJlLCB2YWwpIFwKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUoKGNoaXApLT5ydHN4LT5wY2ksIHdoZXJlLCB2YWwpCiAKLSNkZWZpbmUgd2FpdF90aW1lb3V0X3godGFza19zdGF0ZSwgbXNlY3MpCQlcCi1kbyB7CQkJCQkJCVwKLQkJc2V0X2N1cnJlbnRfc3RhdGUoKHRhc2tfc3RhdGUpKTsJXAotCQlzY2hlZHVsZV90aW1lb3V0KChtc2VjcykgKiBIWiAvIDEwMDApOwlcCisjZGVmaW5lIHdhaXRfdGltZW91dF94KHRhc2tfc3RhdGUsIG1zZWNzKQlcCitkbyB7CQkJCQkJXAorCXNldF9jdXJyZW50X3N0YXRlKCh0YXNrX3N0YXRlKSk7CVwKKwlzY2hlZHVsZV90aW1lb3V0KChtc2VjcykgKiBIWiAvIDEwMDApOwlcCiB9IHdoaWxlICgwKQogI2RlZmluZSB3YWl0X3RpbWVvdXQobXNlY3MpCXdhaXRfdGltZW91dF94KFRBU0tfSU5URVJSVVBUSUJMRSwgKG1zZWNzKSkKIAotCiAjZGVmaW5lIFNUQVRFX1RSQU5TX05PTkUJMAogI2RlZmluZSBTVEFURV9UUkFOU19DTUQJCTEKICNkZWZpbmUgU1RBVEVfVFJBTlNfQlVGCQkyCkBAIC04OSw4ICs4OCw2IEBACiAKICNkZWZpbmUgU0NTSV9MVU4oc3JiKQkJKChzcmIpLT5kZXZpY2UtPmx1bikKIAotdHlwZWRlZiB1bnNpZ25lZCBsb25nIERFTEFZX1BBUkFfVDsKLQogc3RydWN0IHJ0c3hfY2hpcDsKIAogc3RydWN0IHJ0c3hfZGV2IHsKQEAgLTEzMSwxNiArMTI4LDE1IEBACiAJc3RydWN0IHJ0c3hfY2hpcAkqY2hpcDsKIH07CiAKLXR5cGVkZWYgc3RydWN0IHJ0c3hfZGV2IHJ0c3hfZGV2X3Q7Ci0KIC8qIENvbnZlcnQgYmV0d2VlbiBydHN4X2RldiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgU2NzaV9Ib3N0ICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBTY3NpX0hvc3QgKnJ0c3hfdG9faG9zdChzdHJ1Y3QgcnRzeF9kZXYgKmRldikKIHsKLQlyZXR1cm4gY29udGFpbmVyX29mKCh2b2lkICopIGRldiwgc3RydWN0IFNjc2lfSG9zdCwgaG9zdGRhdGEpOworCXJldHVybiBjb250YWluZXJfb2YoKHZvaWQgKilkZXYsIHN0cnVjdCBTY3NpX0hvc3QsIGhvc3RkYXRhKTsKIH0KKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgcnRzeF9kZXYgKmhvc3RfdG9fcnRzeChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQogewotCXJldHVybiAoc3RydWN0IHJ0c3hfZGV2ICopIGhvc3QtPmhvc3RkYXRhOworCXJldHVybiAoc3RydWN0IHJ0c3hfZGV2ICopaG9zdC0+aG9zdGRhdGE7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBnZXRfY3VycmVudF90aW1lKHU4ICp0aW1ldmFsX2J1ZiwgaW50IGJ1Zl9sZW4pCkBAIC0xNjUsOCArMTYxLDEwIEBACiAJdGltZXZhbF9idWZbN10gPSAodTgpKHR2X3VzZWMpOwogfQogCi0vKiBUaGUgc2NzaV9sb2NrKCkgYW5kIHNjc2lfdW5sb2NrKCkgbWFjcm9zIHByb3RlY3QgdGhlIHNtX3N0YXRlIGFuZCB0aGUKLSAqIHNpbmdsZSBxdWV1ZSBlbGVtZW50IHNyYiBmb3Igd3JpdGUgYWNjZXNzICovCisvKgorICogVGhlIHNjc2lfbG9jaygpIGFuZCBzY3NpX3VubG9jaygpIG1hY3JvcyBwcm90ZWN0IHRoZSBzbV9zdGF0ZSBhbmQgdGhlCisgKiBzaW5nbGUgcXVldWUgZWxlbWVudCBzcmIgZm9yIHdyaXRlIGFjY2VzcworICovCiAjZGVmaW5lIHNjc2lfdW5sb2NrKGhvc3QpCXNwaW5fdW5sb2NrX2lycShob3N0LT5ob3N0X2xvY2spCiAjZGVmaW5lIHNjc2lfbG9jayhob3N0KQkJc3Bpbl9sb2NrX2lycShob3N0LT5ob3N0X2xvY2spCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2FyZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9jYXJkLmMKaW5kZXggMjMxODMzYS4uOTc3MTc3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9jYXJkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9jYXJkLmMKQEAgLTYzMSwyMSArNjMxLDIxIEBACiBpbnQgc3dpdGNoX3NzY19jbG9jayhzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCBpbnQgY2xrKQogewogCWludCByZXR2YWw7Ci0JdTggTiA9ICh1OCkoY2xrIC0gMiksIG1pbl9OLCBtYXhfTjsKKwl1OCBuID0gKHU4KShjbGsgLSAyKSwgbWluX24sIG1heF9uOwogCXU4IG1jdV9jbnQsIGRpdiwgbWF4X2Rpdiwgc3NjX2RlcHRoLCBzc2NfZGVwdGhfbWFzazsKIAlpbnQgc2RfdnBjbGtfcGhhc2VfcmVzZXQgPSAwOwogCiAJaWYgKGNoaXAtPmN1cl9jbGsgPT0gY2xrKQogCQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiAKLQltaW5fTiA9IDYwOwotCW1heF9OID0gMTIwOworCW1pbl9uID0gNjA7CisJbWF4X24gPSAxMjA7CiAJbWF4X2RpdiA9IENMS19ESVZfNDsKIAogCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJTd2l0Y2ggU1NDIGNsb2NrIHRvICVkTUh6IChjdXJfY2xrID0gJWQpXG4iLAogCQljbGssIGNoaXAtPmN1cl9jbGspOwogCi0JaWYgKChjbGsgPD0gMikgfHwgKE4gPiBtYXhfTikpIHsKKwlpZiAoKGNsayA8PSAyKSB8fCAobiA+IG1heF9uKSkgewogCQlydHN4X3RyYWNlKGNoaXApOwogCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQpAQCAtNjU1LDE1ICs2NTUsMTUgQEAKIAkJbWN1X2NudCA9IDc7CiAKIAlkaXYgPSBDTEtfRElWXzE7Ci0Jd2hpbGUgKChOIDwgbWluX04pICYmIChkaXYgPCBtYXhfZGl2KSkgewotCQlOID0gKE4gKyAyKSAqIDIgLSAyOworCXdoaWxlICgobiA8IG1pbl9uKSAmJiAoZGl2IDwgbWF4X2RpdikpIHsKKwkJbiA9IChuICsgMikgKiAyIC0gMjsKIAkJZGl2Kys7CiAJfQotCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJOID0gJWQsIGRpdiA9ICVkXG4iLCBOLCBkaXYpOworCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJuID0gJWQsIGRpdiA9ICVkXG4iLCBuLCBkaXYpOwogCiAJaWYgKGNoaXAtPnNzY19lbikgewogCQlzc2NfZGVwdGggPSAweDAxOwotCQlOIC09IDI7CisJCW4gLT0gMjsKIAl9IGVsc2UgewogCQlzc2NfZGVwdGggPSAwOwogCX0KQEAgLTY3Nyw3ICs2NzcsNyBAQAogCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDTEtfRElWLCAweEZGLCAoZGl2IDw8IDQpIHwgbWN1X2NudCk7CiAJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNTQ19DVEwxLCBTU0NfUlNUQiwgMCk7CiAJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNTQ19DVEwyLCBzc2NfZGVwdGhfbWFzaywgc3NjX2RlcHRoKTsKLQlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU1NDX0RJVl9OXzAsIDB4RkYsIE4pOworCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTU0NfRElWX05fMCwgMHhGRiwgbik7CiAJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNTQ19DVEwxLCBTU0NfUlNUQiwgU1NDX1JTVEIpOwogCWlmIChzZF92cGNsa19waGFzZV9yZXNldCkgewogCQlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfVlBDTEswX0NUTCwKQEAgLTEwMjcsMjYgKzEwMjcsMjYgQEAKIAogCWlmIChDSEVDS19QSUQoY2hpcCwgMHg1MjA4KSkgewogCQltYXNrID0gQ0FSRF9TSEFSRV9NQVNLOwotCQlpZiAoY2FyZCA9PSBTRF9DQVJEKQorCQlpZiAoY2FyZCA9PSBTRF9DQVJEKSB7CiAJCQl2YWx1ZSA9IENBUkRfU0hBUkVfNDhfU0Q7Ci0JCWVsc2UgaWYgKGNhcmQgPT0gTVNfQ0FSRCkKKwkJfSBlbHNlIGlmIChjYXJkID09IE1TX0NBUkQpIHsKIAkJCXZhbHVlID0gQ0FSRF9TSEFSRV80OF9NUzsKLQkJZWxzZSBpZiAoY2FyZCA9PSBYRF9DQVJEKQorCQl9IGVsc2UgaWYgKGNhcmQgPT0gWERfQ0FSRCkgewogCQkJdmFsdWUgPSBDQVJEX1NIQVJFXzQ4X1hEOwotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCXJ0c3hfdHJhY2UoY2hpcCk7CiAJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAogCX0gZWxzZSBpZiAoQ0hFQ0tfUElEKGNoaXAsIDB4NTI4OCkpIHsKIAkJbWFzayA9IDB4MDM7Ci0JCWlmIChjYXJkID09IFNEX0NBUkQpCisJCWlmIChjYXJkID09IFNEX0NBUkQpIHsKIAkJCXZhbHVlID0gQ0FSRF9TSEFSRV9CQVJPU1NBX1NEOwotCQllbHNlIGlmIChjYXJkID09IE1TX0NBUkQpCisJCX0gZWxzZSBpZiAoY2FyZCA9PSBNU19DQVJEKSB7CiAJCQl2YWx1ZSA9IENBUkRfU0hBUkVfQkFST1NTQV9NUzsKLQkJZWxzZSBpZiAoY2FyZCA9PSBYRF9DQVJEKQorCQl9IGVsc2UgaWYgKGNhcmQgPT0gWERfQ0FSRCkgewogCQkJdmFsdWUgPSBDQVJEX1NIQVJFX0JBUk9TU0FfWEQ7Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJcnRzeF90cmFjZShjaGlwKTsKIAkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQpAQCAtMTA2NSw3ICsxMDY1LDYgQEAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLQogaW50IHNlbGVjdF9jYXJkKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIGludCBjYXJkKQogewogCWludCByZXR2YWw7CkBAIC0xMDczLDE1ICsxMDcyLDE1IEBACiAJaWYgKGNoaXAtPmN1cl9jYXJkICE9IGNhcmQpIHsKIAkJdTggbW9kOwogCi0JCWlmIChjYXJkID09IFNEX0NBUkQpCisJCWlmIChjYXJkID09IFNEX0NBUkQpIHsKIAkJCW1vZCA9IFNEX01PRF9TRUw7Ci0JCWVsc2UgaWYgKGNhcmQgPT0gTVNfQ0FSRCkKKwkJfSBlbHNlIGlmIChjYXJkID09IE1TX0NBUkQpIHsKIAkJCW1vZCA9IE1TX01PRF9TRUw7Ci0JCWVsc2UgaWYgKGNhcmQgPT0gWERfQ0FSRCkKKwkJfSBlbHNlIGlmIChjYXJkID09IFhEX0NBUkQpIHsKIAkJCW1vZCA9IFhEX01PRF9TRUw7Ci0JCWVsc2UgaWYgKGNhcmQgPT0gU1BJX0NBUkQpCisJCX0gZWxzZSBpZiAoY2FyZCA9PSBTUElfQ0FSRCkgewogCQkJbW9kID0gU1BJX01PRF9TRUw7Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJcnRzeF90cmFjZShjaGlwKTsKIAkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9jaGlwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X2NoaXAuYwppbmRleCBiY2M0YjY2Li5hMTBkZDYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X2NoaXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X2NoaXAuYwpAQCAtNzQzLDcgKzc0Myw3IEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCXU4IHRtcCA9ICh1OCkoc2Rfc3BlZWRfcHJpb3IgPj4gKGkqOCkpOworCQl1OCB0bXAgPSAodTgpKHNkX3NwZWVkX3ByaW9yID4+IChpICogOCkpOwogCiAJCWlmICgodG1wIDwgMHgwMSkgfHwgKHRtcCA+IDB4MDQpKSB7CiAJCQlmYWtlX3BhcmEgPSB0cnVlOwpAQCAtNzYwLDcgKzc2MCw3IEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCXU4IHRtcCA9ICh1OCkoc2RfY3VycmVudF9wcmlvciA+PiAoaSo4KSk7CisJCXU4IHRtcCA9ICh1OCkoc2RfY3VycmVudF9wcmlvciA+PiAoaSAqIDgpKTsKIAogCQlpZiAodG1wID4gMHgwMykgewogCQkJZmFrZV9wYXJhID0gdHJ1ZTsKQEAgLTIyODgsNyArMjI4OCw3IEBACiAKIAlwdHIgPSBidWY7CiAJcmVnX2FkZHIgPSBQUEJVRl9CQVNFMjsKLQlmb3IgKGkgPSAwOyBpIDwgYnVmX2xlbi8yNTY7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBidWZfbGVuIC8gMjU2OyBpKyspIHsKIAkJcnRzeF9pbml0X2NtZChjaGlwKTsKIAogCQlmb3IgKGogPSAwOyBqIDwgMjU2OyBqKyspCkBAIC0yMzA0LDEwICsyMzA0LDEwIEBACiAJCXB0ciArPSAyNTY7CiAJfQogCi0JaWYgKGJ1Zl9sZW4lMjU2KSB7CisJaWYgKGJ1Zl9sZW4gJSAyNTYpIHsKIAkJcnRzeF9pbml0X2NtZChjaGlwKTsKIAotCQlmb3IgKGogPSAwOyBqIDwgYnVmX2xlbiUyNTY7IGorKykKKwkJZm9yIChqID0gMDsgaiA8IGJ1Zl9sZW4gJSAyNTY7IGorKykKIAkJCXJ0c3hfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIHJlZ19hZGRyKyssIDAsIDApOwogCiAJCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgMCwgMjUwKTsKQEAgLTIzMTcsNyArMjMxNyw3IEBACiAJCX0KIAl9CiAKLQltZW1jcHkocHRyLCBydHN4X2dldF9jbWRfZGF0YShjaGlwKSwgYnVmX2xlbiUyNTYpOworCW1lbWNweShwdHIsIHJ0c3hfZ2V0X2NtZF9kYXRhKGNoaXApLCBidWZfbGVuICUgMjU2KTsKIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTIzMzYsNyArMjMzNiw3IEBACiAKIAlwdHIgPSBidWY7CiAJcmVnX2FkZHIgPSBQUEJVRl9CQVNFMjsKLQlmb3IgKGkgPSAwOyBpIDwgYnVmX2xlbi8yNTY7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBidWZfbGVuIC8gMjU2OyBpKyspIHsKIAkJcnRzeF9pbml0X2NtZChjaGlwKTsKIAogCQlmb3IgKGogPSAwOyBqIDwgMjU2OyBqKyspIHsKQEAgLTIzNTIsMTAgKzIzNTIsMTAgQEAKIAkJfQogCX0KIAotCWlmIChidWZfbGVuJTI1NikgeworCWlmIChidWZfbGVuICUgMjU2KSB7CiAJCXJ0c3hfaW5pdF9jbWQoY2hpcCk7CiAKLQkJZm9yIChqID0gMDsgaiA8IGJ1Zl9sZW4lMjU2OyBqKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IGJ1Zl9sZW4gJSAyNTY7IGorKykgewogCQkJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIHJlZ19hZGRyKyssIDB4RkYsCiAJCQkJICAgICAqcHRyKTsKIAkJCXB0cisrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9jaGlwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X2NoaXAuaAppbmRleCBjMDgxNjRmLi5mMzY2NDI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X2NoaXAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X2NoaXAuaApAQCAtNDQsOCArNDQsMTAgQEAKIAkjZGVmaW5lIE1HX1NFVF9JQ1ZfU0xPVwogCS8qIEhXIG1heSBtaXNzIEVSUi9DTUROSyBzaWduYWwgd2hlbiBzYW1wbGluZyBJTlQgc3RhdHVzLiAqLwogCSNkZWZpbmUgTVNfU0FNUExFX0lOVF9FUlIKLQkvKiBIVyBETyBOT1Qgc3VwcG9ydCBXYWl0X0lOVCBmdW5jdGlvbiBkdXJpbmcgUkVBRF9CWVRFUwotCSAqIHRyYW5zZmVyIG1vZGUgKi8KKwkvKgorCSAqIEhXIERPIE5PVCBzdXBwb3J0IFdhaXRfSU5UIGZ1bmN0aW9uCisJICogZHVyaW5nIFJFQURfQllURVMgdHJhbnNmZXIgbW9kZQorCSAqLwogCSNkZWZpbmUgUkVBRF9CWVRFU19XQUlUX0lOVAogI2VuZGlmCiAKQEAgLTEwMSwxOCArMTAzLDE3IEBACiAjZGVmaW5lIFRSQU5TUE9SVF9OT19TRU5TRQkyICAvKiBDb21tYW5kIGZhaWxlZCwgbm8gYXV0by1zZW5zZSAgICAqLwogI2RlZmluZSBUUkFOU1BPUlRfRVJST1IJCTMgICAvKiBUcmFuc3BvcnQgYmFkIChpLmUuIGRldmljZSBkZWFkKSAqLwogCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBTdGFydC1TdG9wLVVuaXQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTdGFydC1TdG9wLVVuaXQKKyAqLwogI2RlZmluZSBTVE9QX01FRElVTQkJCTB4MDAgICAgLyogYWNjZXNzIGRpc2FibGUgICAgICAgICAqLwogI2RlZmluZSBNQUtFX01FRElVTV9SRUFEWQkJMHgwMSAgICAvKiBhY2Nlc3MgZW5hYmxlICAgICAgICAgICovCiAjZGVmaW5lIFVOTE9BRF9NRURJVU0JCQkweDAyICAgIC8qIHVubG9hZCAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgTE9BRF9NRURJVU0JCQkweDAzICAgIC8qIGxvYWQgICAgICAgICAgICAgICAgICAgKi8KIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIFNUQU5EQVJEX0lOUVVJUlkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTVEFOREFSRF9JTlFVSVJZCisgKi8KICNkZWZpbmUgUVVMSUZJUkUgICAgICAgICAgICAgICAgMHgwMAogI2RlZmluZSBBRU5DX0ZOQyAgICAgICAgICAgICAgICAweDAwCiAjZGVmaW5lIFRSTUxfSU9QICAgICAgICAgICAgICAgIDB4MDAKQEAgLTEyOSwxNyArMTMwLDE1IEBACiAjZGVmaW5lIFBSRENUX1JFVl9MRU4gICAgICAgICAgIDQgICAgICAgICAgICAgICAvKiBQcm9kdWN0IExPVCBMZW5ndGggICAgICAgKi8KIAogLyogRHluYW1pYyBmbGFnIGRlZmluaXRpb25zOiB1c2VkIGluIHNldF9iaXQoKSBldGMuICovCi0jZGVmaW5lIFJUU1hfRkxJRFhfVFJBTlNfQUNUSVZFCQkxOCAgLyogMHgwMDA0MDAwMCAgdHJhbnNmZXIgaXMgYWN0aXZlICovCi0jZGVmaW5lIFJUU1hfRkxJRFhfQUJPUlRJTkcJCTIwICAvKiAweDAwMTAwMDAwIGFib3J0IGlzIGluCi0JCQkJCSAgICAgKiBwcm9ncmVzcyAqLwotI2RlZmluZSBSVFNYX0ZMSURYX0RJU0NPTk5FQ1RJTkcJMjEgIC8qIDB4MDAyMDAwMDAgZGlzY29ubmVjdAotCQkJCQkgICAgICogaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgUlRTWF9GTElEWF9UUkFOU19BQ1RJVkUJCTE4ICAvKiAweDAwMDQwMDAwIHRyYW5zZmVyIGlzIGFjdGl2ZQkgKi8KKyNkZWZpbmUgUlRTWF9GTElEWF9BQk9SVElORwkJMjAgIC8qIDB4MDAxMDAwMDAgYWJvcnQgaXMgaW4gcHJvZ3Jlc3MJICovCisjZGVmaW5lIFJUU1hfRkxJRFhfRElTQ09OTkVDVElORwkyMSAgLyogMHgwMDIwMDAwMCBkaXNjb25uZWN0IGluIHByb2dyZXNzICovCisKICNkZWZpbmUgQUJPUlRJTkdfT1JfRElTQ09OTkVDVElORwkoKDFVTCA8PCBVU19GTElEWF9BQk9SVElORykgfCBcCiAJCQkJCSAoMVVMIDw8IFVTX0ZMSURYX0RJU0NPTk5FQ1RJTkcpKQotI2RlZmluZSBSVFNYX0ZMSURYX1JFU0VUVElORwkJMjIgIC8qIDB4MDA0MDAwMDAgZGV2aWNlIHJlc2V0Ci0JCQkJCSAgICAgKiBpbiBwcm9ncmVzcyAqLwotI2RlZmluZSBSVFNYX0ZMSURYX1RJTUVEX09VVAkJMjMgIC8qIDB4MDA4MDAwMDAgU0NTSQotCQkJCQkgICAgICogbWlkbGF5ZXIgdGltZWQgb3V0ICovCisKKyNkZWZpbmUgUlRTWF9GTElEWF9SRVNFVFRJTkcJCTIyICAvKiAweDAwNDAwMDAwIGRldmljZSByZXNldCBpbiBwcm9ncmVzcyAqLworI2RlZmluZSBSVFNYX0ZMSURYX1RJTUVEX09VVAkJMjMgIC8qIDB4MDA4MDAwMDAgU0NTSSBtaWRsYXllciB0aW1lZCBvdXQgICovCiAKICNkZWZpbmUgRFJDVF9BQ0NFU1NfREVWICAgICAgICAgMHgwMCAgICAvKiBEaXJlY3QgQWNjZXNzIERldmljZSAgICAgICovCiAjZGVmaW5lIFJNQl9ESVNDICAgICAgICAgICAgICAgIDB4ODAgICAgLyogVGhlIERldmljZSBpcyBSZW1vdmFibGUgICAqLwpAQCAtMTc0LDkgKzE3Myw5IEBACiAjZGVmaW5lCUZJUlNUX1JFU0VUCQkweDAxCiAjZGVmaW5lCVVTRURfRVhJU1QJCTB4MDIKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIFNFTlNFX0RBVEEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBTRU5TRV9EQVRBCisgKi8KIC8qLS0tLSB2YWxpZCAtLS0tKi8KICNkZWZpbmUgU0VOU0VfVkFMSUQgICAgICAgICAgICAgMHg4MCAgICAvKiBTZW5zZSBkYXRhIGlzIHZhbGlkIGFzIFNDU0kyICAgICAqLwogI2RlZmluZSBTRU5TRV9JTlZBTElEICAgICAgICAgICAweDAwICAgIC8qIFNlbnNlIGRhdGEgaXMgaW52YWxpZCBhcyBTQ1NJMiAgICovCkBAIC0yMjgsNyArMjI3LDYgQEAKICNkZWZpbmUgQVNDUV9MT0FEX0VKQ1RfRVJSICAgICAgMHgwMAogI2RlZmluZQlBU0NRX1dSSVRFX1BST1RFQ1QJMHgwMAogCi0KIHN0cnVjdCBzZW5zZV9kYXRhX3QgewogCXVuc2lnbmVkIGNoYXIgICBlcnJfY29kZTsJLyogZXJyb3IgY29kZSAqLwogCS8qIGJpdDcgOiB2YWxpZCAqLwpAQCAtMjY4LDIyICsyNjYsMjIgQEAKICNkZWZpbmUgVFJJR19ETUEJCSgweDAxIDw8IDMxKQogCiAvKiBCdXMgaW50ZXJydXB0IHBlbmRpbmcgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgQ01EX0RPTkVfSU5UCQkoMSA8PCAzMSkKLSNkZWZpbmUgREFUQV9ET05FX0lOVAkJKDEgPDwgMzApCi0jZGVmaW5lIFRSQU5TX09LX0lOVAkJKDEgPDwgMjkpCi0jZGVmaW5lIFRSQU5TX0ZBSUxfSU5UCQkoMSA8PCAyOCkKLSNkZWZpbmUgWERfSU5UCQkJKDEgPDwgMjcpCi0jZGVmaW5lIE1TX0lOVAkJCSgxIDw8IDI2KQotI2RlZmluZSBTRF9JTlQJCQkoMSA8PCAyNSkKLSNkZWZpbmUgR1BJTzBfSU5UCQkoMSA8PCAyNCkKLSNkZWZpbmUgT0NfSU5UCQkJKDEgPDwgMjMpCi0jZGVmaW5lIFNEX1dSSVRFX1BST1RFQ1QJKDEgPDwgMTkpCi0jZGVmaW5lIFhEX0VYSVNUCQkoMSA8PCAxOCkKLSNkZWZpbmUgTVNfRVhJU1QJCSgxIDw8IDE3KQotI2RlZmluZSBTRF9FWElTVAkJKDEgPDwgMTYpCisjZGVmaW5lIENNRF9ET05FX0lOVAkJQklUKDMxKQorI2RlZmluZSBEQVRBX0RPTkVfSU5UCQlCSVQoMzApCisjZGVmaW5lIFRSQU5TX09LX0lOVAkJQklUKDI5KQorI2RlZmluZSBUUkFOU19GQUlMX0lOVAkJQklUKDI4KQorI2RlZmluZSBYRF9JTlQJCQlCSVQoMjcpCisjZGVmaW5lIE1TX0lOVAkJCUJJVCgyNikKKyNkZWZpbmUgU0RfSU5UCQkJQklUKDI1KQorI2RlZmluZSBHUElPMF9JTlQJCUJJVCgyNCkKKyNkZWZpbmUgT0NfSU5UCQkJQklUKDIzKQorI2RlZmluZSBTRF9XUklURV9QUk9URUNUCUJJVCgxOSkKKyNkZWZpbmUgWERfRVhJU1QJCUJJVCgxOCkKKyNkZWZpbmUgTVNfRVhJU1QJCUJJVCgxNykKKyNkZWZpbmUgU0RfRVhJU1QJCUJJVCgxNikKICNkZWZpbmUgREVMSU5LX0lOVAkJR1BJTzBfSU5UCi0jZGVmaW5lIE1TX09DX0lOVAkJKDEgPDwgMjMpCi0jZGVmaW5lIFNEX09DX0lOVAkJKDEgPDwgMjIpCisjZGVmaW5lIE1TX09DX0lOVAkJQklUKDIzKQorI2RlZmluZSBTRF9PQ19JTlQJCUJJVCgyMikKIAogI2RlZmluZSBDQVJEX0lOVAkJKFhEX0lOVCB8IE1TX0lOVCB8IFNEX0lOVCkKICNkZWZpbmUgTkVFRF9DT01QTEVURV9JTlQJKERBVEFfRE9ORV9JTlQgfCBUUkFOU19PS19JTlQgfCBUUkFOU19GQUlMX0lOVCkKQEAgLTMwNSw3ICszMDMsNiBAQAogI2RlZmluZSBNU19PQ19JTlRfRU4JCSgxIDw8IDIzKQogI2RlZmluZSBTRF9PQ19JTlRfRU4JCSgxIDw8IDIyKQogCi0KICNkZWZpbmUgUkVBRF9SRUdfQ01ECQkwCiAjZGVmaW5lIFdSSVRFX1JFR19DTUQJCTEKICNkZWZpbmUgQ0hFQ0tfUkVHX0NNRAkJMgpAQCAtMzEzLDcgKzMxMCw2IEBACiAjZGVmaW5lIEhPU1RfVE9fREVWSUNFCQkwCiAjZGVmaW5lIERFVklDRV9UT19IT1NUCQkxCiAKLQogI2RlZmluZSBSVFNYX1JFU1ZfQlVGX0xFTgk0MDk2CiAjZGVmaW5lIEhPU1RfQ01EU19CVUZfTEVOCTEwMjQKICNkZWZpbmUgSE9TVF9TR19UQkxfQlVGX0xFTgkoUlRTWF9SRVNWX0JVRl9MRU4gLSBIT1NUX0NNRFNfQlVGX0xFTikKQEAgLTMzMiw3ICszMjgsNiBAQAogI2RlZmluZSBYRF9GUkVFX1RBQkxFX0NOVAkxMjAwCiAjZGVmaW5lIE1TX0ZSRUVfVEFCTEVfQ05UCTUxMgogCi0KIC8qIEJpdCBPcGVyYXRpb24gKi8KICNkZWZpbmUgU0VUX0JJVChkYXRhLCBpZHgpCSgoZGF0YSkgfD0gMSA8PCAoaWR4KSkKICNkZWZpbmUgQ0xSX0JJVChkYXRhLCBpZHgpCSgoZGF0YSkgJj0gfigxIDw8IChpZHgpKSkKQEAgLTYxOCw3ICs2MTMsNiBAQAogCWludCBzcGlfY2xvY2s7CiB9OwogCi0KICNpZmRlZiBfTVNHX1RSQUNFCiBzdHJ1Y3QgdHJhY2VfbXNnX3QgewogCXUxNiBsaW5lOwpAQCAtNjg5LDcgKzY4Myw3IEBACiAjZGVmaW5lIENMUl9TRElPX0lHTk9SRUQoY2hpcCkJCSgoY2hpcCktPnNkaW9fZnVuY19leGlzdCAmPSB+U0RJT19JR05PUkVEKQogCiBzdHJ1Y3QgcnRzeF9jaGlwIHsKLQlydHN4X2Rldl90CSpydHN4OworCXN0cnVjdCBydHN4X2RldgkqcnRzeDsKIAogCXUzMgkJaW50X3JlZzsgLyogQnVzIGludGVycnVwdCBwZW5kaW5nIHJlZ2lzdGVyICovCiAJY2hhcgkJbWF4X2x1bjsKQEAgLTcxMiw5ICs3MDYsOSBAQAogCWludAkJCWN1cl9jYXJkOwogCiAJdW5zaWduZWQgbG9uZwluZWVkX3JlbGVhc2U7CQkvKiBuZWVkIHJlbGVhc2UgYml0IG1hcCAqLwotCXVuc2lnbmVkIGxvbmcJbmVlZF9yZXNldDsJCS8qIG5lZWQgcmVzZXQKLQkJCQkJCSAqIGJpdCBtYXAgKi8KLQkvKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgdGhpcyBjYXJkIGlzIGp1c3QgcmVzdW1lZCBmcm9tIFNTIHN0YXRlLAorCXVuc2lnbmVkIGxvbmcJbmVlZF9yZXNldDsJCS8qIG5lZWQgcmVzZXQgYml0IG1hcCAqLworCS8qCisJICogRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgY2FyZCBpcyBqdXN0IHJlc3VtZWQgZnJvbSBTUyBzdGF0ZSwKIAkgKiBhbmQgbmVlZCByZWxlYXNlZCBiZWZvcmUgYmVpbmcgcmVzZXR0ZWQKIAkgKi8KIAl1bnNpZ25lZCBsb25nCQluZWVkX3JlaW5pdDsKQEAgLTczMiw4ICs3MjYsMTAgQEAKIAl1OAljYXJkX2VqZWN0ZWQ7CS8qIGNhcmQgZWplY3RlZCBiaXQgbWFwICovCiAJdTgJY2FyZF93cDsJLyogY2FyZCB3cml0ZSBwcm90ZWN0ZWQgYml0IG1hcCAqLwogCi0JdTgJbHVuX21jOwkJLyogZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRvIGFuc3dlcgotCQkJCSAqIE1lZGlhQ2hhbmdlICovCisJdTgJbHVuX21jOwkJLyoKKwkJCQkgKiBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgdG8gYW5zd2VyCisJCQkJICogTWVkaWFDaGFuZ2UKKwkJCQkgKi8KIAogI2lmbmRlZiBMRURfQVVUT19CTElOSwogCWludAkJCWxlZF90b2dnbGVfY291bnRlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfc2NzaS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9zY3NpLmMKaW5kZXggZDIwMzEwNC4uYmVjYjRiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9zY3NpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9zY3NpLmMKQEAgLTQ4NCwxNCArNDg0LDE0IEBACiAJdTggY2FyZCA9IGdldF9sdW5fY2FyZChjaGlwLCBsdW4pOwogCWJvb2wgcHJvX2Zvcm1hdHRlcl9mbGFnID0gZmFsc2U7CiAJdW5zaWduZWQgY2hhciBpbnF1aXJ5X2J1ZltdID0gewotCQlRVUxJRklSRXxEUkNUX0FDQ0VTU19ERVYsCi0JCVJNQl9ESVNDfDB4MEQsCisJCVFVTElGSVJFIHwgRFJDVF9BQ0NFU1NfREVWLAorCQlSTUJfRElTQyB8IDB4MEQsCiAJCTB4MDAsCiAJCTB4MDEsCiAJCTB4MWYsCiAJCTB4MDIsCiAJCTAsCi0JCVJFTF9BRFJ8V0JVU18zMnxXQlVTXzE2fFNZTkN8TElOS0VEfENNRF9RVUV8U0ZUX1JFLAorCQlSRUxfQURSIHwgV0JVU18zMiB8IFdCVVNfMTYgfCBTWU5DIHwgTElOS0VEIHwgQ01EX1FVRSB8IFNGVF9SRSwKIAl9OwogCiAJaWYgKENIRUNLX0xVTl9NT0RFKGNoaXAsIFNEX01TXzJMVU4pKSB7CkBAIC01NTgsNyArNTU4LDYgQEAKIAlyZXR1cm4gVFJBTlNQT1JUX0dPT0Q7CiB9CiAKLQogc3RhdGljIGludCBzdGFydF9zdG9wX3VuaXQoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKQogewogCXVuc2lnbmVkIGludCBsdW4gPSBTQ1NJX0xVTihzcmIpOwpAQCAtNTk0LDcgKzU5Myw2IEBACiAJcmV0dXJuIFRSQU5TUE9SVF9FUlJPUjsKIH0KIAotCiBzdGF0aWMgaW50IGFsbG93X21lZGl1bV9yZW1vdmFsKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCkKIHsKIAlpbnQgcHJldmVudDsKQEAgLTYxMyw3ICs2MTEsNiBAQAogCXJldHVybiBUUkFOU1BPUlRfR09PRDsKIH0KIAotCiBzdGF0aWMgaW50IHJlcXVlc3Rfc2Vuc2Uoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKQogewogCXN0cnVjdCBzZW5zZV9kYXRhX3QgKnNlbnNlOwpAQCAtMTQwMCw3ICsxMzk3LDcgQEAKIAlidWZfbGVuID0gNCArICgoMiArIE1TR19GVU5DX0xFTiArIE1TR19GSUxFX0xFTiArIFRJTUVfVkFMX0xFTikgKgogCQlUUkFDRV9JVEVNX0NOVCk7CiAKLQlpZiAoKHNjc2lfYnVmZmxlbihzcmIpIDwgYnVmX2xlbikgfHwgKHNjc2lfc2dsaXN0KHNyYikgPT0gTlVMTCkpIHsKKwlpZiAoKHNjc2lfYnVmZmxlbihzcmIpIDwgYnVmX2xlbikgfHwgIXNjc2lfc2dsaXN0KHNyYikpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKIAkJCVNFTlNFX1RZUEVfTUVESUFfVU5SRUNPVkVSX1JFQURfRVJSKTsKIAkJcnRzeF90cmFjZShjaGlwKTsKQEAgLTE1MjEsNyArMTUxOCw3IEBACiAKIHN0YXRpYyBpbnQgc2V0X3ZhcmlhYmxlKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCkKIHsKLQl1bnNpZ25lZCBsdW4gPSBTQ1NJX0xVTihzcmIpOworCXVuc2lnbmVkIGludCBsdW4gPSBTQ1NJX0xVTihzcmIpOwogCiAJaWYgKHNyYi0+Y21uZFszXSA9PSAxKSB7CiAJCS8qIFZhcmlhYmxlIENsb2NrICovCkBAIC0xOTg5LDggKzE5ODYsOCBAQAogCQkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCQkJfQogCi0JCQlidWZbMippXSA9ICh1OCkodmFsID4+IDgpOwotCQkJYnVmWzIqaSsxXSA9ICh1OCl2YWw7CisJCQlidWZbMiAqIGldID0gKHU4KSh2YWwgPj4gOCk7CisJCQlidWZbMiAqIGkgKyAxXSA9ICh1OCl2YWw7CiAJCX0KIAogCQlsZW4gPSAodW5zaWduZWQgc2hvcnQpbWluX3QodW5zaWduZWQgaW50LCBzY3NpX2J1ZmZsZW4oc3JiKSwKQEAgLTIwNDgsNyArMjA0NSw3IEBACiAJCX0KIAogCQlmb3IgKGkgPSAwOyBpIDwgbGVuIC8gMjsgaSsrKSB7Ci0JCQl2YWwgPSAoKHUxNilidWZbMippXSA8PCA4KSB8IGJ1ZlsyKmkrMV07CisJCQl2YWwgPSAoKHUxNilidWZbMiAqIGldIDw8IDgpIHwgYnVmWzIgKiBpICsgMV07CiAJCQlyZXR2YWwgPSBydHN4X3dyaXRlX3BoeV9yZWdpc3RlcihjaGlwLCBhZGRyICsgaSwgdmFsKTsKIAkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQl2ZnJlZShidWYpOwpAQCAtMjYwNCw3ICsyNjAxLDYgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi0KIHN0YXRpYyBpbnQgcmVhZF9zdGF0dXMoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKQogewogCXU4IHJ0c3hfc3RhdHVzWzE2XTsKQEAgLTMwNzEsMTggKzMwNjcsMTggQEAKIAlidWZbaSsrXSA9IDB4ODA7CiAJaWYgKChkZXZfaW5mb19pZCA9PSAweDEwKSB8fCAoZGV2X2luZm9faWQgPT0gMHgxMykpIHsKIAkJLyogU3lzdGVtIEluZm9ybWF0aW9uICovCi0JCW1lbWNweShidWYraSwgbXNfY2FyZC0+cmF3X3N5c19pbmZvLCA5Nik7CisJCW1lbWNweShidWYgKyBpLCBtc19jYXJkLT5yYXdfc3lzX2luZm8sIDk2KTsKIAl9IGVsc2UgewogCQkvKiBNb2RlbCBOYW1lICovCi0JCW1lbWNweShidWYraSwgbXNfY2FyZC0+cmF3X21vZGVsX25hbWUsIDQ4KTsKKwkJbWVtY3B5KGJ1ZiArIGksIG1zX2NhcmQtPnJhd19tb2RlbF9uYW1lLCA0OCk7CiAJfQogCiAJcnRzeF9zdG9yX3NldF94ZmVyX2J1ZihidWYsIGJ1Zl9sZW4sIHNyYik7CiAKIAlpZiAoZGV2X2luZm9faWQgPT0gMHgxNSkKLQkJc2NzaV9zZXRfcmVzaWQoc3JiLCBzY3NpX2J1ZmZsZW4oc3JiKS0weDNDKTsKKwkJc2NzaV9zZXRfcmVzaWQoc3JiLCBzY3NpX2J1ZmZsZW4oc3JiKSAtIDB4M0MpOwogCWVsc2UKLQkJc2NzaV9zZXRfcmVzaWQoc3JiLCBzY3NpX2J1ZmZsZW4oc3JiKS0weDZDKTsKKwkJc2NzaV9zZXRfcmVzaWQoc3JiLCBzY3NpX2J1ZmZsZW4oc3JiKSAtIDB4NkMpOwogCiAJa2ZyZWUoYnVmKTsKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3N5cy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9zeXMuaAppbmRleCAwYjZiNGQ0Li5mNDliZWQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3N5cy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfc3lzLmgKQEAgLTI4LDggKzI4LDYgQEAKICNpbmNsdWRlICJydHN4X2NoaXAuaCIKICNpbmNsdWRlICJydHN4X2NhcmQuaCIKIAotdHlwZWRlZiBkbWFfYWRkcl90IFVMT05HX1BUUjsKLQogc3RhdGljIGlubGluZSB2b2lkIHJ0c3hfZXhjbHVzaXZlX2VudGVyX3NzKHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7CiAJc3RydWN0IHJ0c3hfZGV2ICpkZXYgPSBjaGlwLT5ydHN4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF90cmFuc3BvcnQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfdHJhbnNwb3J0LmgKaW5kZXggODk5YmMyMC4uNDc5MTM3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF90cmFuc3BvcnQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3RyYW5zcG9ydC5oCkBAIC0zOCw3ICszOCw2IEBACiAJdW5zaWduZWQgaW50IGJ1Zmxlbiwgc3RydWN0IHNjc2lfY21uZCAqc3JiKTsKIHZvaWQgcnRzeF9pbnZva2VfdHJhbnNwb3J0KHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCk7CiAKLQogI2RlZmluZSBydHN4X2luaXRfY21kKGNoaXApCQkJKChjaGlwKS0+Y2kgPSAwKQogCiB2b2lkIHJ0c3hfYWRkX2NtZChzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvc2QuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3NkLmMKaW5kZXggNjIxOWUwNC4uYjBiYmIzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvc2QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9zZC5jCkBAIC0xNDI4LDcgKzE0MjgsNiBAQAogCQkJY29udGludWU7CiAJCX0KIAotCiAJCWlmIChmdW5jX3RvX3N3aXRjaCkKIAkJCWJyZWFrOwogCkBAIC0xNDM3LDkgKzE0MzYsOSBAQAogCQlmdW5jX3RvX3N3aXRjaCk7CiAKICNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKLQlpZiAoKHNkX2NhcmQtPnNkX2xvY2tfc3RhdHVzICYgU0RfU0RSX1JTVCkKLQkJCSYmIChERFI1MF9TVVBQT1JUID09IGZ1bmNfdG9fc3dpdGNoKQotCQkJJiYgKHNkX2NhcmQtPmZ1bmNfZ3JvdXAxX21hc2sgJiBTRFI1MF9TVVBQT1JUX01BU0spKSB7CisJaWYgKChzZF9jYXJkLT5zZF9sb2NrX3N0YXR1cyAmIFNEX1NEUl9SU1QpICYmCisJICAgIChmdW5jX3RvX3N3aXRjaCA9PSBERFI1MF9TVVBQT1JUKSAmJgorCSAgICAoc2RfY2FyZC0+ZnVuY19ncm91cDFfbWFzayAmIFNEUjUwX1NVUFBPUlRfTUFTSykpIHsKIAkJZnVuY190b19zd2l0Y2ggPSBTRFI1MF9TVVBQT1JUOwogCQlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiVXNpbmcgU0RSNTAgaW5zdGVhZCBvZiBERFI1MCBmb3IgU0QgTG9ja1xuIik7CiAJfQpAQCAtMjU4OSwxNiArMjU4OCwxMiBAQAogI2VuZGlmCiAKIAlyZXR2YWwgPSBzZF9wcmVwYXJlX3Jlc2V0KGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJcnRzeF90cmFjZShjaGlwKTsKLQkJcmV0dXJuIFNUQVRVU19GQUlMOwotCX0KKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlnb3RvIFN0YXR1c19GYWlsOwogCiAJcmV0dmFsID0gc2RfZHVtbXlfY2xvY2soY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQlydHN4X3RyYWNlKGNoaXApOwotCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JfQorCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAlpZiAoQ0hLX1NESU9fRVhJU1QoY2hpcCkgJiYgIUNIS19TRElPX0lHTk9SRUQoY2hpcCkgJiYgdHJ5X3NkaW8pIHsKIAkJaW50IHJ0eV9jbnQgPSAwOwpAQCAtMjYwNiw4ICsyNjAxLDcgQEAKIAkJZm9yICg7IHJ0eV9jbnQgPCBjaGlwLT5zZGlvX3JldHJ5X2NudDsgcnR5X2NudCsrKSB7CiAJCQlpZiAoZGV0ZWN0X2NhcmRfY2QoY2hpcCwgU0RfQ0FSRCkgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQlzZF9zZXRfZXJyX2NvZGUoY2hpcCwgU0RfTk9fQ0FSRCk7Ci0JCQkJcnRzeF90cmFjZShjaGlwKTsKLQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQkJZ290byBTdGF0dXNfRmFpbDsKIAkJCX0KIAogCQkJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBJT19TRU5EX09QX0NPTkQsIDAsCkBAIC0yNjE5LDggKzI2MTMsNyBAQAogCQkJCQlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiU0RfSU8gY2FyZCAoRnVuY3Rpb24gbnVtYmVyOiAlZCkhXG4iLAogCQkJCQkJZnVuY19udW0pOwogCQkJCQljaGlwLT5zZF9pbyA9IDE7Ci0JCQkJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCQkJZ290byBTdGF0dXNfRmFpbDsKIAkJCQl9CiAKIAkJCQlicmVhazsKQEAgLTI2MzgsMTAgKzI2MzEsOCBAQAogUlRZX1NEX1JTVDoKIAlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIEdPX0lETEVfU1RBVEUsIDAsIFNEX1JTUF9UWVBFX1IwLAogCQkJCU5VTEwsIDApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJcnRzeF90cmFjZShjaGlwKTsKLQkJcmV0dXJuIFNUQVRVU19GQUlMOwotCX0KKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlnb3RvIFN0YXR1c19GYWlsOwogCiAJd2FpdF90aW1lb3V0KDIwKTsKIApAQCAtMjY1OSwxMCArMjY1MCw4IEBACiAKIAkJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBHT19JRExFX1NUQVRFLCAwLAogCQkJCQlTRF9SU1BfVFlQRV9SMCwgTlVMTCwgMCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JCX0KKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAkJd2FpdF90aW1lb3V0KDIwKTsKIAl9CkBAIC0yNjczLDM5ICsyNjYyLDMyIEBACiAJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBTRF9DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCXNkX3NldF9lcnJfY29kZShjaGlwLCBTRF9OT19DQVJEKTsKLQkJCQlydHN4X3RyYWNlKGNoaXApOwotCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCQlnb3RvIFN0YXR1c19GYWlsOwogCQkJfQogCiAJCQlqKys7Ci0JCQlpZiAoaiA8IDMpIHsKKwkJCWlmIChqIDwgMykKIAkJCQlnb3RvIFJUWV9TRF9SU1Q7Ci0JCQl9IGVsc2UgewotCQkJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCQkJcmV0dXJuIFNUQVRVU19GQUlMOwotCQkJfQorCQkJZWxzZQorCQkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAJCX0KIAogCQlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNEX0FQUF9PUF9DT05ELCB2b2x0YWdlLAogCQkJCQlTRF9SU1BfVFlQRV9SMywgcnNwLCA1KTsKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJaysrOwotCQkJaWYgKGsgPCAzKSB7CisJCQlpZiAoayA8IDMpCiAJCQkJZ290byBSVFlfU0RfUlNUOwotCQkJfSBlbHNlIHsKLQkJCQlydHN4X3RyYWNlKGNoaXApOwotCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKLQkJCX0KKwkJCWVsc2UKKwkJCQlnb3RvIFN0YXR1c19GYWlsOwogCQl9CiAKIAkJaSsrOwogCQl3YWl0X3RpbWVvdXQoMjApOwogCX0gd2hpbGUgKCEocnNwWzFdICYgMHg4MCkgJiYgKGkgPCAyNTUpKTsKIAotCWlmIChpID09IDI1NSkgewotCQlydHN4X3RyYWNlKGNoaXApOwotCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JfQorCWlmIChpID09IDI1NSkKKwkJZ290byBTdGF0dXNfRmFpbDsKIAogCWlmIChoaV9jYXBfZmxvdykgewogCQlpZiAocnNwWzFdICYgMHg0MCkKQEAgLTI3MjIsMjYgKzI3MDQsMjAgQEAKIAogCWlmIChzdXBwb3J0XzF2OCkgewogCQlyZXR2YWwgPSBzZF92b2x0YWdlX3N3aXRjaChjaGlwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQkJcnRzeF90cmFjZShjaGlwKTsKLQkJCXJldHVybiBTVEFUVVNfRkFJTDsKLQkJfQorCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJZ290byBTdGF0dXNfRmFpbDsKIAl9CiAKIAlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIEFMTF9TRU5EX0NJRCwgMCwgU0RfUlNQX1RZUEVfUjIsCiAJCQkJTlVMTCwgMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQlydHN4X3RyYWNlKGNoaXApOwotCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JfQorCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAJCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VORF9SRUxBVElWRV9BRERSLCAwLAogCQkJCQlTRF9SU1BfVFlQRV9SNiwgcnNwLCA1KTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQkJcnRzeF90cmFjZShjaGlwKTsKLQkJCXJldHVybiBTVEFUVVNfRkFJTDsKLQkJfQorCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJZ290byBTdGF0dXNfRmFpbDsKIAogCQlzZF9jYXJkLT5zZF9hZGRyID0gKHUzMilyc3BbMV0gPDwgMjQ7CiAJCXNkX2NhcmQtPnNkX2FkZHIgKz0gKHUzMilyc3BbMl0gPDwgMTY7CkBAIC0yNzUxLDI0ICsyNzI3LDE4IEBACiAJfQogCiAJcmV0dmFsID0gc2RfY2hlY2tfY3NkKGNoaXAsIDEpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJcnRzeF90cmFjZShjaGlwKTsKLQkJcmV0dXJuIFNUQVRVU19GQUlMOwotCX0KKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlnb3RvIFN0YXR1c19GYWlsOwogCiAJcmV0dmFsID0gc2Rfc2VsZWN0X2NhcmQoY2hpcCwgMSk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQlydHN4X3RyYWNlKGNoaXApOwotCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JfQorCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKICNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKIFNEX1VOTE9DS19FTlRSWToKIAlyZXR2YWwgPSBzZF91cGRhdGVfbG9ja19zdGF0dXMoY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQlydHN4X3RyYWNlKGNoaXApOwotCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JfQorCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAlpZiAoc2RfY2FyZC0+c2RfbG9ja19zdGF0dXMgJiBTRF9MT0NLRUQpIHsKIAkJc2RfY2FyZC0+c2RfbG9ja19zdGF0dXMgfD0gKFNEX0xPQ0tfMUJJVF9NT0RFIHwgU0RfUFdEX0VYSVNUKTsKQEAgLTI3ODAsMzIgKzI3NTAsMjQgQEAKIAogCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgQVBQX0NNRCwgc2RfY2FyZC0+c2RfYWRkciwKIAkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQlydHN4X3RyYWNlKGNoaXApOwotCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JfQorCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFVF9DTFJfQ0FSRF9ERVRFQ1QsIDAsCiAJCQkJU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJcnRzeF90cmFjZShjaGlwKTsKLQkJcmV0dXJuIFNUQVRVU19GQUlMOwotCX0KKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlnb3RvIFN0YXR1c19GYWlsOwogCiAJaWYgKHN1cHBvcnRfMXY4KSB7CiAJCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgQVBQX0NNRCwgc2RfY2FyZC0+c2RfYWRkciwKIAkJCQkJU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCQlydHN4X3RyYWNlKGNoaXApOwotCQkJcmV0dXJuIFNUQVRVU19GQUlMOwotCQl9CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlnb3RvIFN0YXR1c19GYWlsOwogCiAJCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VUX0JVU19XSURUSCwgMiwKIAkJCQkJU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCQlydHN4X3RyYWNlKGNoaXApOwotCQkJcmV0dXJuIFNUQVRVU19GQUlMOwotCQl9CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlnb3RvIFN0YXR1c19GYWlsOwogCiAJCXN3aXRjaF9idXNfd2lkdGggPSBTRF9CVVNfV0lEVEhfNDsKIAl9IGVsc2UgewpAQCAtMjgxNCwxNiArMjc3NiwxMiBAQAogCiAJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRVRfQkxPQ0tMRU4sIDB4MjAwLCBTRF9SU1BfVFlQRV9SMSwKIAkJCQlOVUxMLCAwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCXJldHVybiBTVEFUVVNfRkFJTDsKLQl9CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJZ290byBTdGF0dXNfRmFpbDsKIAogCXJldHZhbCA9IHNkX3NldF9jbG9ja19kaXZpZGVyKGNoaXAsIFNEX0NMS19ESVZJREVfMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQlydHN4X3RyYWNlKGNoaXApOwotCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JfQorCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAlpZiAoIShzZF9jYXJkLT5yYXdfY3NkWzRdICYgMHg0MCkpCiAJCXNkX2RvbnRfc3dpdGNoID0gdHJ1ZTsKQEAgLTI4NjIsMTcgKzI4MjAsMTMgQEAKIAlpZiAoIXN1cHBvcnRfMXY4KSB7CiAJCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgQVBQX0NNRCwgc2RfY2FyZC0+c2RfYWRkciwKIAkJCQkJU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCQlydHN4X3RyYWNlKGNoaXApOwotCQkJcmV0dXJuIFNUQVRVU19GQUlMOwotCQl9CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlnb3RvIFN0YXR1c19GYWlsOwogCiAJCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VUX0JVU19XSURUSCwgMiwKIAkJCQkJU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCQlydHN4X3RyYWNlKGNoaXApOwotCQkJcmV0dXJuIFNUQVRVU19GQUlMOwotCQl9CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlnb3RvIFN0YXR1c19GYWlsOwogCX0KIAogI2lmZGVmIFNVUFBPUlRfU0RfTE9DSwpAQCAtMjg5MCwxMCArMjg0NCw4IEBACiAJCX0KIAogCQlyZXR2YWwgPSBzZF9zZXRfaW5pdF9wYXJhKGNoaXApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCQlydHN4X3RyYWNlKGNoaXApOwotCQkJcmV0dXJuIFNUQVRVU19GQUlMOwotCQl9CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlnb3RvIFN0YXR1c19GYWlsOwogCiAJCWlmIChDSEtfU0RfRERSNTAoc2RfY2FyZCkpCiAJCQlyZXR2YWwgPSBzZF9kZHJfdHVuaW5nKGNoaXApOwpAQCAtMjkwMiwxNCArMjg1NCwxMSBAQAogCiAJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCWlmIChzZDIwX21vZGUpIHsKLQkJCQlydHN4X3RyYWNlKGNoaXApOwotCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCQlnb3RvIFN0YXR1c19GYWlsOwogCQkJfSBlbHNlIHsKIAkJCQlyZXR2YWwgPSBzZF9pbml0X3Bvd2VyKGNoaXApOwotCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCQkJcnRzeF90cmFjZShjaGlwKTsKLQkJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwotCQkJCX0KKwkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJCQlnb3RvIFN0YXR1c19GYWlsOwogCiAJCQkJdHJ5X3NkaW8gPSBmYWxzZTsKIAkJCQlzZDIwX21vZGUgPSB0cnVlOwpAQCAtMjkzMCwxNCArMjg3OSwxMSBAQAogCQkJcmV0dmFsID0gc2RfcmVhZF9sYmEwKGNoaXApOwogCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCWlmIChzZDIwX21vZGUpIHsKLQkJCQkJcnRzeF90cmFjZShjaGlwKTsKLQkJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJCQlnb3RvIFN0YXR1c19GYWlsOwogCQkJCX0gZWxzZSB7CiAJCQkJCXJldHZhbCA9IHNkX2luaXRfcG93ZXIoY2hpcCk7Ci0JCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JCQkJCX0KKwkJCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCQkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAkJCQkJdHJ5X3NkaW8gPSBmYWxzZTsKIAkJCQkJc2QyMF9tb2RlID0gdHJ1ZTsKQEAgLTI5NDgsMTAgKzI4OTQsOCBAQAogCX0KIAogCXJldHZhbCA9IHNkX2NoZWNrX3dwX3N0YXRlKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJcnRzeF90cmFjZShjaGlwKTsKLQkJcmV0dXJuIFNUQVRVU19GQUlMOwotCX0KKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlnb3RvIFN0YXR1c19GYWlsOwogCiAJY2hpcC0+Y2FyZF9idXNfd2lkdGhbY2hpcC0+Y2FyZDJsdW5bU0RfQ0FSRF1dID0gNDsKIApAQCAtMjk3Myw4ICsyOTE3LDExIEBACiAjZW5kaWYKIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKLX0KIAorU3RhdHVzX0ZhaWw6CisJcnRzeF90cmFjZShjaGlwKTsKKwlyZXR1cm4gU1RBVFVTX0ZBSUw7Cit9CiAKIHN0YXRpYyBpbnQgbW1jX3Rlc3Rfc3dpdGNoX2J1cyhzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1OCB3aWR0aCkKIHsKQEAgLTMxMDUsNyArMzA1Miw2IEBACiAJcmV0dXJuIFNXSVRDSF9GQUlMOwogfQogCi0KIHN0YXRpYyBpbnQgbW1jX3N3aXRjaF90aW1pbmdfYnVzKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIGJvb2wgc3dpdGNoX2RkcikKIHsKIAlzdHJ1Y3Qgc2RfaW5mbyAqc2RfY2FyZCA9ICYoY2hpcC0+c2RfY2FyZCk7CkBAIC0zMjMwLDcgKzMxNzYsNiBAQAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAotCiBzdGF0aWMgaW50IHJlc2V0X21tYyhzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKQogewogCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3NwaS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvc3BpLmMKaW5kZXggMjZlYjJhMS4uMTNjNTM5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvc3BpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvc3BpLmMKQEAgLTM5LDcgKzM5LDggQEAKIAlpbnQgcmV0dmFsOwogCiAJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTUElfQ09OVFJPTCwgMHhGRiwKLQkJCQkgICAgIENTX1BPTEFSSVRZX0xPVyB8IERUT19NU0JfRklSU1QgfCBTUElfTUFTVEVSIHwgU1BJX01PREUwIHwgU1BJX0FVVE8pOworCQkJCSAgICAgQ1NfUE9MQVJJVFlfTE9XIHwgRFRPX01TQl9GSVJTVAorCQkJCSAgICAgfCBTUElfTUFTVEVSIHwgU1BJX01PREUwIHwgU1BJX0FVVE8pOwogCWlmIChyZXR2YWwpIHsKIAkJcnRzeF90cmFjZShjaGlwKTsKIAkJcmV0dXJuIHJldHZhbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3NwaS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvc3BpLmgKaW5kZXggZmM4MjRiNS4uYzhkMmJlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvc3BpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvc3BpLmgKQEAgLTYxLDUgKzYxLDQgQEAKIGludCBzcGlfZXJhc2VfZmxhc2goc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKTsKIGludCBzcGlfd3JpdGVfZmxhc2hfc3RhdHVzKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCk7CiAKLQogI2VuZGlmICAvKiBfX1JFQUxURUtfUlRTWF9TUElfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgveGQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3hkLmMKaW5kZXggZmMxZGZlMC4uMWRlMDJiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgveGQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC94ZC5jCkBAIC04MzQsNyArODM0LDYgQEAKIAkJIT0gKFhEX0VDQzFfQUxMMSB8IFhEX0VDQzJfQUxMMSkpCiAJCXJldHVybiAwOwogCi0KIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCWlmIChyZWR1bnRbUkVTRVJWRUQwICsgaV0gIT0gMHhGRikKIAkJCXJldHVybiAwOwpAQCAtOTM4LDcgKzkzNyw3IEBACiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIlNldCB1bnVzZWQgYmxvY2sgdG8gaW5kZXggJWRcbiIsCiAJCXpvbmUtPnNldF9pbmRleCk7CiAKLQl6b25lLT5mcmVlX3RhYmxlW3pvbmUtPnNldF9pbmRleCsrXSA9ICh1MTYpIChwaHlfYmxrICYgMHgzZmYpOworCXpvbmUtPmZyZWVfdGFibGVbem9uZS0+c2V0X2luZGV4KytdID0gKHUxNikocGh5X2JsayAmIDB4M2ZmKTsKIAlpZiAoem9uZS0+c2V0X2luZGV4ID49IFhEX0ZSRUVfVEFCTEVfQ05UKQogCQl6b25lLT5zZXRfaW5kZXggPSAwOwogCXpvbmUtPnVudXNlZF9ibGtfY250Kys7CkBAIC0xNDAyLDcgKzE0MDEsNiBAQAogCXJldHVybiBTVEFUVVNfRkFJTDsKIH0KIAotCiBzdGF0aWMgaW50IHhkX2J1aWxkX2wycF90Ymwoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgaW50IHpvbmVfbm8pCiB7CiAJc3RydWN0IHhkX2luZm8gKnhkX2NhcmQgPSAmKGNoaXAtPnhkX2NhcmQpOwpAQCAtMTYyNCwxMCArMTYyMiw4IEBACiAJdTggcmVnX3ZhbCwgcGFnZV9jbnQ7CiAJaW50IHpvbmVfbm8sIHJldHZhbCwgaTsKIAotCWlmIChzdGFydF9wYWdlID4gZW5kX3BhZ2UpIHsKLQkJcnRzeF90cmFjZShjaGlwKTsKLQkJcmV0dXJuIFNUQVRVU19GQUlMOwotCX0KKwlpZiAoc3RhcnRfcGFnZSA+IGVuZF9wYWdlKQorCQlnb3RvIFN0YXR1c19GYWlsOwogCiAJcGFnZV9jbnQgPSBlbmRfcGFnZSAtIHN0YXJ0X3BhZ2U7CiAJem9uZV9ubyA9IChpbnQpKGxvZ19ibGsgLyAxMDAwKTsKQEAgLTE2NDMsOCArMTYzOSw3IEBACiAKIAkJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBYRF9DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCXhkX3NldF9lcnJfY29kZShjaGlwLCBYRF9OT19DQVJEKTsKLQkJCQlydHN4X3RyYWNlKGNoaXApOwotCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCQlnb3RvIFN0YXR1c19GYWlsOwogCQkJfQogCQl9CiAJfQpAQCAtMTY3OSw4ICsxNjc0LDcgQEAKIAogCQlpZiAocmV0dmFsID09IC1FVElNRURPVVQpIHsKIAkJCXhkX3NldF9lcnJfY29kZShjaGlwLCBYRF9UT19FUlJPUik7Ci0JCQlydHN4X3RyYWNlKGNoaXApOwotCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJZ290byBTdGF0dXNfRmFpbDsKIAkJfSBlbHNlIHsKIAkJCXJ0c3hfdHJhY2UoY2hpcCk7CiAJCQlnb3RvIEZhaWw7CkBAIC0xNzEzLDggKzE3MDcsNyBAQAogCiAJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBYRF9DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJeGRfc2V0X2Vycl9jb2RlKGNoaXAsIFhEX05PX0NBUkQpOwotCQkJcnRzeF90cmFjZShjaGlwKTsKLQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAJCX0KIAogCQl4ZF9zZXRfZXJyX2NvZGUoY2hpcCwgWERfRUNDX0VSUk9SKTsKQEAgLTE3MjIsOCArMTcxNSw3IEBACiAJCW5ld19ibGsgPSB4ZF9nZXRfdW51c2VkX2Jsb2NrKGNoaXAsIHpvbmVfbm8pOwogCQlpZiAobmV3X2JsayA9PSBOT19ORVdfQkxLKSB7CiAJCQlYRF9DTFJfQkFEX09MREJMSyh4ZF9jYXJkKTsKLQkJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQlnb3RvIFN0YXR1c19GYWlsOwogCQl9CiAKIAkJcmV0dmFsID0geGRfY29weV9wYWdlKGNoaXAsIHBoeV9ibGssIG5ld19ibGssIDAsCkBAIC0xNzM3LDggKzE3MjksNyBAQAogCQkJCVhEX0NMUl9CQURfTkVXQkxLKHhkX2NhcmQpOwogCQkJfQogCQkJWERfQ0xSX0JBRF9PTERCTEsoeGRfY2FyZCk7Ci0JCQlydHN4X3RyYWNlKGNoaXApOwotCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJZ290byBTdGF0dXNfRmFpbDsKIAkJfQogCQl4ZF9zZXRfbDJwX3RibChjaGlwLCB6b25lX25vLCBsb2dfb2ZmLCAodTE2KShuZXdfYmxrICYgMHgzRkYpKTsKIAkJeGRfZXJhc2VfYmxvY2soY2hpcCwgcGh5X2Jsayk7CkBAIC0xNzQ2LDYgKzE3MzcsNyBAQAogCQlYRF9DTFJfQkFEX09MREJMSyh4ZF9jYXJkKTsKIAl9CiAKK1N0YXR1c19GYWlsOgogCXJ0c3hfdHJhY2UoY2hpcCk7CiAJcmV0dXJuIFNUQVRVU19GQUlMOwogfQpAQCAtMTgzMCw3ICsxODIyLDYgQEAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLQogc3RhdGljIGludCB4ZF93cml0ZV9tdWx0aXBsZV9wYWdlcyhzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1MzIgb2xkX2JsaywKIAkJCQl1MzIgbmV3X2JsaywgdTMyIGxvZ19ibGssIHU4IHN0YXJ0X3BhZ2UsCiAJCQkJdTggZW5kX3BhZ2UsIHU4ICpidWYsIHVuc2lnbmVkIGludCAqaW5kZXgsCkBAIC0xODQ1LDEwICsxODM2LDggQEAKIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiJXMsIG9sZF9ibGsgPSAweCV4LCBuZXdfYmxrID0gMHgleCwgbG9nX2JsayA9IDB4JXhcbiIsCiAJCV9fZnVuY19fLCBvbGRfYmxrLCBuZXdfYmxrLCBsb2dfYmxrKTsKIAotCWlmIChzdGFydF9wYWdlID4gZW5kX3BhZ2UpIHsKLQkJcnRzeF90cmFjZShjaGlwKTsKLQkJcmV0dXJuIFNUQVRVU19GQUlMOwotCX0KKwlpZiAoc3RhcnRfcGFnZSA+IGVuZF9wYWdlKQorCQlnb3RvIFN0YXR1c19GYWlsOwogCiAJcGFnZV9jbnQgPSBlbmRfcGFnZSAtIHN0YXJ0X3BhZ2U7CiAJem9uZV9ubyA9IChpbnQpKGxvZ19ibGsgLyAxMDAwKTsKQEAgLTE4NTcsMTAgKzE4NDYsOCBAQAogCXBhZ2VfYWRkciA9IChuZXdfYmxrIDw8IHhkX2NhcmQtPmJsb2NrX3NoaWZ0KSArIHN0YXJ0X3BhZ2U7CiAKIAlyZXR2YWwgPSB4ZF9zZW5kX2NtZChjaGlwLCBSRUFEMV8xKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCXJldHVybiBTVEFUVVNfRkFJTDsKLQl9CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJZ290byBTdGF0dXNfRmFpbDsKIAogCXJ0c3hfaW5pdF9jbWQoY2hpcCk7CiAKQEAgLTE4OTUsOCArMTg4Miw3IEBACiAKIAkJaWYgKHJldHZhbCA9PSAtRVRJTUVET1VUKSB7CiAJCQl4ZF9zZXRfZXJyX2NvZGUoY2hpcCwgWERfVE9fRVJST1IpOwotCQkJcnRzeF90cmFjZShjaGlwKTsKLQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAJCX0gZWxzZSB7CiAJCQlydHN4X3RyYWNlKGNoaXApOwogCQkJZ290byBGYWlsOwpAQCAtMTkzNiw2ICsxOTIyLDcgQEAKIAkJeGRfbWFya19iYWRfYmxvY2soY2hpcCwgbmV3X2Jsayk7CiAJfQogCitTdGF0dXNfRmFpbDoKIAlydHN4X3RyYWNlKGNoaXApOwogCXJldHVybiBTVEFUVVNfRkFJTDsKIH0KQEAgLTIwMDAsNyArMTk4Nyw2IEBACiAJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKLQogCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBYRF9DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQljaGlwLT5jYXJkX2ZhaWwgfD0gWERfQ0FSRDsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWMuaCBiL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWMuaAppbmRleCBjYzBhZmVlLi40MjA1NDZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpYy5oCkBAIC05Miw2ICs5Miw3IEBACiAJdTMyICAgICBsYXN0dGltZTsKIAl1MzIgICAgIGxhc3RpZDsKIH07CisKIC8qCiAgKiBTTElDIEhhbmRsZSBzdHJ1Y3R1cmUuICBVc2VkIHRvIHJlc3RyaWN0IGhhbmRsZSB2YWx1ZXMgdG8KICAqIDMyIGJpdHMgYnkgdXNpbmcgYW4gaW5kZXggcmF0aGVyIHRoYW4gYW4gYWRkcmVzcy4KQEAgLTIyMyw4ICsyMjQsOCBAQAogCiBzdHJ1Y3Qgc2xpY19pZmFjZV9zdGF0cyB7CiAJLyoKLQkqIFN0YXRzCi0JKi8KKwkgKiBTdGF0cworCSAqLwogCXU2NCAgICAgICAgeG10X2J5dGVzOwogCXU2NCAgICAgICAgeG10X3VjYXN0OwogCXU2NCAgICAgICAgeG10X21jYXN0OwpAQCAtMzUxLDEwICszNTIsMzUgQEAKIAl1aW50ICAgICAgICAgICAgICAgICBjYXJkbnVtaW51c2VbU0xJQ19NQVhfQ0FSRFNdOwogfTsKIAotc3RydWN0IHNsaWNfc2htZW0gewotCXZvbGF0aWxlIHUzMiAgICAgICAgICBpc3I7Ci0Jdm9sYXRpbGUgdTMyICAgICAgICAgIGxpbmtzdGF0dXM7Ci0Jdm9sYXRpbGUgc3RydWN0IHNsaWNfc3RhdHMgICAgIGluaWNzdGF0czsKK3N0cnVjdCBzbGljX3N0YXRzIHsKKwkvKiB4bWl0IHN0YXRzICovCisJdTY0IHhtaXRfdGNwX2J5dGVzOworCXU2NCB4bWl0X3RjcF9zZWdzOworCXU2NCB4bWl0X2J5dGVzOworCXU2NCB4bWl0X2NvbGxpc2lvbnM7CisJdTY0IHhtaXRfdW5pY2FzdHM7CisJdTY0IHhtaXRfb3RoZXJfZXJyb3I7CisJdTY0IHhtaXRfZXhjZXNzX2NvbGxpc2lvbnM7CisJLyogcmN2IHN0YXRzICovCisJdTY0IHJjdl90Y3BfYnl0ZXM7CisJdTY0IHJjdl90Y3Bfc2VnczsKKwl1NjQgcmN2X2J5dGVzOworCXU2NCByY3ZfdW5pY2FzdHM7CisJdTY0IHJjdl9vdGhlcl9lcnJvcjsKKwl1NjQgcmN2X2Ryb3BzOworfTsKKworc3RydWN0IHNsaWNfc2htZW1fZGF0YSB7CisJdTMyIGlzcjsKKwl1MzIgbG5rc3RhdHVzOworCXN0cnVjdCBzbGljX3N0YXRzIHN0YXRzOworfTsKKworc3RydWN0IHNsaWNfc2htZW1vcnkgeworCWRtYV9hZGRyX3QgaXNyX3BoYWRkcjsKKwlkbWFfYWRkcl90IGxua3N0YXR1c19waGFkZHI7CisJZG1hX2FkZHJfdCBzdGF0c19waGFkZHI7CisJc3RydWN0IHNsaWNfc2htZW1fZGF0YSBfX2lvbWVtICpzaG1lbV9kYXRhOwogfTsKIAogc3RydWN0IHNsaWNfdXByIHsKQEAgLTQxNCwxMCArNDQwLDkgQEAKIAl1MzIgICAgICAgICAgICAgaW50cnJlZ2lzdGVyZWQ7CiAJdWludCAgICAgICAgICAgICAgICBpc3BfaW5pdGlhbGl6ZWQ7CiAJdWludCAgICAgICAgICAgICAgICBnZW5udW1iZXI7Ci0Jc3RydWN0IHNsaWNfc2htZW0gICAgICAqcHNobWVtOworCXN0cnVjdCBzbGljX3NobWVtb3J5IHNobWVtOwogCWRtYV9hZGRyX3QgICAgICAgICAgcGh5c19zaG1lbTsKLQl1MzIgICAgICAgICAgICAgaXNyY29weTsKLQlfX2lvbWVtIHN0cnVjdCBzbGljX3JlZ3MgICAgICAgKnNsaWNfcmVnczsKKwl2b2lkIF9faW9tZW0gKnJlZ3M7CiAJdW5zaWduZWQgY2hhciAgICAgICAgICAgICAgIHN0YXRlOwogCXVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgICBsaW5rc3RhdGU7CiAJdW5zaWduZWQgY2hhciAgICAgICAgICAgICAgIGxpbmtzcGVlZDsKQEAgLTQ0NCw4ICs0NjksOCBAQAogCXN0cnVjdCBzbGljX2NtZHF1ZXVlICAgICBjbWRxX2FsbDsKIAlzdHJ1Y3Qgc2xpY19jbWRxbWVtICAgICAgY21kcW1lbTsKIAkvKgotCSogIFNMSUMgSGFuZGxlcwotCSovCisJICogU0xJQyBIYW5kbGVzCisJICovCiAJLyogT2JqZWN0IGhhbmRsZXMqLwogCXN0cnVjdCBzbGljX2hhbmRsZSBzbGljX2hhbmRsZXNbU0xJQ19DTURRX01BWENNRFMgKyAxXTsKIAkvKiBGcmVlIG9iamVjdCBoYW5kbGVzKi8KQEAgLTQ4Nyw2ICs1MTIsMzQgQEAKIAlzdHJ1Y3Qgc2xpY25ldF9zdGF0cyAgICAgc2xpY19zdGF0czsKIH07CiAKK3N0YXRpYyBpbmxpbmUgdTMyIHNsaWNfcmVhZDMyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXJldHVybiBpb3JlYWQzMihhZGFwdGVyLT5yZWdzICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNsaWNfd3JpdGUzMihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IHJlZywKKwkJCQl1MzIgdmFsKQoreworCWlvd3JpdGUzMih2YWwsIGFkYXB0ZXItPnJlZ3MgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2xpY193cml0ZTY0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgcmVnLAorCQkJCXUzMiB2YWwsIHUzMiBoaWFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5iaXQ2NHJlZ2xvY2ssIGZsYWdzKTsKKwlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfQUREUl9VUFBFUiwgaGlhZGRyKTsKKwlzbGljX3dyaXRlMzIoYWRhcHRlciwgcmVnLCB2YWwpOworCW1taW93YigpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmJpdDY0cmVnbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2xpY19mbHVzaF93cml0ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpb3JlYWQzMihhZGFwdGVyLT5yZWdzICsgU0xJQ19SRUdfSE9TVElEKTsKK30KKwogI2RlZmluZSBVUERBVEVfU1RBVFMobGFyZ2VzdGF0LCBuZXdzdGF0LCBvbGRzdGF0KSAgICAgICAgICAgICAgICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJaWYgKChuZXdzdGF0KSA8IChvbGRzdGF0KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljaHcuaCBiL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWNody5oCmluZGV4IDk3MjNiNGEuLjQ5Y2I5MWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWNody5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWNody5oCkBAIC0yODksMjI0ICsyODksMTE4IEBACiAJdTMyIHBhZDJbNF07CiB9OwogCi1zdHJ1Y3Qgc2xpY19yZWdzIHsKLQl1MzIJc2xpY19yZXNldDsJLyogUmVzZXQgUmVnaXN0ZXIgKi8KLQl1MzIJcGFkMDsKKy8qIFJlc2V0IFJlZ2lzdGVyICovCisjZGVmaW5lIFNMSUNfUkVHX1JFU0VUCQkweDAwMDAKKy8qIEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFNMSUNfUkVHX0lDUgkJMHgwMDA4CisvKiBJbnRlcnJ1cHQgc3RhdHVzIHBvaW50ZXIgKi8KKyNkZWZpbmUgU0xJQ19SRUdfSVNQCQkweDAwMTAKKy8qIEludGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgU0xJQ19SRUdfSVNSCQkweDAwMTgKKy8qCisgKiBIZWFkZXIgYnVmZmVyIGFkZHJlc3MgcmVnCisgKiAzMS04IC0gcGh5IGFkZHIgb2Ygc2V0IG9mIGNvbnRpZ3VvdXMgaGRyIGJ1ZmZlcnMKKyAqICA3LTAgLSBudW1iZXIgb2YgYnVmZmVycyBwYXNzZWQKKyAqIEJ1ZmZlcnMgYXJlIDI1NiBieXRlcyBsb25nIG9uIDI1Ni1ieXRlIGJvdW5kYXJpZXMuCisgKi8KKyNkZWZpbmUgU0xJQ19SRUdfSEJBUgkJMHgwMDIwCisvKgorICogRGF0YSBidWZmZXIgaGFuZGxlICYgYWRkcmVzcyByZWcKKyAqIDQgc2V0cyBvZiByZWdpc3RlcnM7IEJ1ZmZlcnMgYXJlIDJLIGJ5dGVzIGxvbmcgMiBwZXIgNEsgcGFnZS4KKyAqLworI2RlZmluZSBTTElDX1JFR19EQkFSCQkweDAwMjgKKy8qCisgKiBYbXQgQ21kIGJ1ZiBhZGRyIHJlZ3MuCisgKiAxIHBlciBYTVQgaW50ZXJmYWNlCisgKiAzMS01IC0gcGh5IGFkZHIgb2YgaG9zdCBjb21tYW5kIGJ1ZmZlcgorICogIDQtMCAtIGxlbmd0aCBvZiBjbWQgaW4gbXVsdGlwbGVzIG9mIDMyIGJ5dGVzCisgKiBCdWZmZXJzIGFyZSAzMiBieXRlcyB1cCB0byA1MTIgYnl0ZXMgbG9uZworICovCisjZGVmaW5lIFNMSUNfUkVHX0NCQVIJCTB4MDAzMAorLyogV3JpdGUgY29udHJvbCBzdG9yZSAqLworI2RlZmluZQlTTElDX1JFR19XQ1MJCTB4MDAzNAorLyoKKyAqIFJlc3BvbnNlIGJ1ZmZlciBhZGRyZXNzIHJlZy4KKyAqIDMxLTggLSBwaHkgYWRkciBvZiBzZXQgb2YgY29udGlndW91cyByZXNwb25zZSBidWZmZXJzCisgKiA3LTAgLSBudW1iZXIgb2YgYnVmZmVycyBwYXNzZWQKKyAqIEJ1ZmZlcnMgYXJlIDMyIGJ5dGVzIGxvbmcgb24gMzItYnl0ZSBib3VuZGFyaWVzLgorICovCisjZGVmaW5lCVNMSUNfUkVHX1JCQVIJCTB4MDAzOAorLyogUmVhZCBzdGF0aXN0aWNzIChVUFIpICovCisjZGVmaW5lCVNMSUNfUkVHX1JTVEFUCQkweDAwNDAKKy8qIFJlYWQgbGluayBzdGF0dXMgKi8KKyNkZWZpbmUJU0xJQ19SRUdfTFNUQVQJCTB4MDA0OAorLyogV3JpdGUgTWFjIENvbmZpZyAqLworI2RlZmluZQlTTElDX1JFR19XTUNGRwkJMHgwMDUwCisvKiBXcml0ZSBwaHkgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0xJQ19SRUdfV1BIWQkJMHgwMDU4CisvKiBSY3YgQ21kIGJ1ZiBhZGRyIHJlZyAqLworI2RlZmluZQlTTElDX1JFR19SQ0JBUgkJMHgwMDYwCisvKiBSZWFkIFNMSUMgQ29uZmlnKi8KKyNkZWZpbmUgU0xJQ19SRUdfUkNPTkZJRwkweDAwNjgKKy8qIEludGVycnVwdCBhZ2dyZWdhdGlvbiB0aW1lICovCisjZGVmaW5lIFNMSUNfUkVHX0lOVEFHRwkJMHgwMDcwCisvKiBXcml0ZSBYTUlUIGNvbmZpZyByZWcgKi8KKyNkZWZpbmUJU0xJQ19SRUdfV1hDRkcJCTB4MDA3OAorLyogV3JpdGUgUkNWIGNvbmZpZyByZWcgKi8KKyNkZWZpbmUJU0xJQ19SRUdfV1JDRkcJCTB4MDA4MAorLyogV3JpdGUgcmN2IGFkZHIgYSBsb3cgKi8KKyNkZWZpbmUJU0xJQ19SRUdfV1JBRERSQUwJMHgwMDg4CisvKiBXcml0ZSByY3YgYWRkciBhIGhpZ2ggKi8KKyNkZWZpbmUJU0xJQ19SRUdfV1JBRERSQUgJMHgwMDkwCisvKiBXcml0ZSByY3YgYWRkciBiIGxvdyAqLworI2RlZmluZQlTTElDX1JFR19XUkFERFJCTAkweDAwOTgKKy8qIFdyaXRlIHJjdiBhZGRyIGIgaGlnaCAqLworI2RlZmluZQlTTElDX1JFR19XUkFERFJCSAkweDAwYTAKKy8qIExvdyBiaXRzIG9mIG1jYXN0IG1hc2sgKi8KKyNkZWZpbmUJU0xJQ19SRUdfTUNBU1RMT1cJMHgwMGE4CisvKiBIaWdoIGJpdHMgb2YgbWNhc3QgbWFzayAqLworI2RlZmluZQlTTElDX1JFR19NQ0FTVEhJR0gJMHgwMGIwCisvKiBQaW5nIHRoZSBjYXJkICovCisjZGVmaW5lIFNMSUNfUkVHX1BJTkcJCTB4MDBiOAorLyogRHVtcCBjb21tYW5kICovCisjZGVmaW5lIFNMSUNfUkVHX0RVTVBfQ01ECTB4MDBjMAorLyogRHVtcCBkYXRhIHBvaW50ZXIgKi8KKyNkZWZpbmUgU0xJQ19SRUdfRFVNUF9EQVRBCTB4MDBjOAorLyogUmVhZCBjYXJkJ3MgcGNpX3N0YXR1cyByZWdpc3RlciAqLworI2RlZmluZQlTTElDX1JFR19QQ0lTVEFUVVMJMHgwMGQwCisvKiBXcml0ZSBob3N0aWQgZmllbGQgKi8KKyNkZWZpbmUgU0xJQ19SRUdfV1JIT1NUSUQJMHgwMGQ4CisvKiBQdXQgY2FyZCBpbiBhIGxvdyBwb3dlciBzdGF0ZSAqLworI2RlZmluZSBTTElDX1JFR19MT1dfUE9XRVIJMHgwMGUwCisvKiBGb3JjZSBzbGljIGludG8gcXVpZXNjZW50IHN0YXRlICBiZWZvcmUgc29mdCByZXNldCAqLworI2RlZmluZSBTTElDX1JFR19RVUlFU0NFCTB4MDBlOAorLyogUmVzZXQgaW50ZXJmYWNlIHF1ZXVlcyAqLworI2RlZmluZSBTTElDX1JFR19SRVNFVF9JRkFDRQkweDAwZjAKKy8qCisgKiBSZWdpc3RlciBpcyBvbmx5IHdyaXR0ZW4gd2hlbiBpdCBoYXMgY2hhbmdlZC4KKyAqIEJpdHMgNjMtMzIgZm9yIGhvc3QgaS9mIGFkZHJzLgorICovCisjZGVmaW5lIFNMSUNfUkVHX0FERFJfVVBQRVIJMHgwMGY4CisvKiA2NCBiaXQgSGVhZGVyIGJ1ZmZlciBhZGRyZXNzIHJlZyAqLworI2RlZmluZSBTTElDX1JFR19IQkFSNjQJCTB4MDEwMAorLyogNjQgYml0IERhdGEgYnVmZmVyIGhhbmRsZSAmIGFkZHJlc3MgcmVnICovCisjZGVmaW5lIFNMSUNfUkVHX0RCQVI2NAkJMHgwMTA4CisvKiA2NCBiaXQgWG10IENtZCBidWYgYWRkciByZWdzLiAqLworI2RlZmluZSBTTElDX1JFR19DQkFSNjQJCTB4MDExMAorLyogNjQgYml0IFJlc3BvbnNlIGJ1ZmZlciBhZGRyZXNzIHJlZy4qLworI2RlZmluZSBTTElDX1JFR19SQkFSNjQJCTB4MDExOAorLyogNjQgYml0IFJjdiBDbWQgYnVmIGFkZHIgcmVnKi8KKyNkZWZpbmUJU0xJQ19SRUdfUkNCQVI2NAkweDAxMjAKKy8qIFJlYWQgc3RhdGlzdGljcyAoNjQgYml0IFVQUikgKi8KKyNkZWZpbmUJU0xJQ19SRUdfUlNUQVQ2NAkweDAxMjgKKy8qIERvd25sb2FkIEdpZ2FiaXQgUkNWIHNlcXVlbmNlciB1Y29kZSAqLworI2RlZmluZSBTTElDX1JFR19SQ1ZfV0NTCTB4MDEzMAorLyogV3JpdGUgVmxhbklkIGZpZWxkICovCisjZGVmaW5lIFNMSUNfUkVHX1dSVkxBTklECTB4MDEzOAorLyogUmVhZCBUcmFuc2Zvcm1lciBpbmZvICovCisjZGVmaW5lIFNMSUNfUkVHX1JFQURfWEZfSU5GTwkweDAxNDAKKy8qIFdyaXRlIFRyYW5zZm9ybWVyIGluZm8gKi8KKyNkZWZpbmUgU0xJQ19SRUdfV1JJVEVfWEZfSU5GTwkweDAxNDgKKy8qIFdyaXRlIGNhcmQgdGlja3MgcGVyIHNlY29uZCAqLworI2RlZmluZSBTTElDX1JFR19USUNLU19QRVJfU0VDCTB4MDE3MAogCi0JdTMyCXNsaWNfaWNyOwkvKiBJbnRlcnJ1cHQgQ29udHJvbCBSZWdpc3RlciAqLwotCXUzMglwYWQyOwotI2RlZmluZSBTTElDX0lDUgkJMHgwMDA4Ci0KLQl1MzIJc2xpY19pc3A7CS8qIEludGVycnVwdCBzdGF0dXMgcG9pbnRlciAqLwotCXUzMglwYWQxOwotI2RlZmluZSBTTElDX0lTUAkJMHgwMDEwCi0KLQl1MzIJc2xpY19pc3I7CS8qIEludGVycnVwdCBzdGF0dXMgKi8KLQl1MzIJcGFkMzsKLSNkZWZpbmUgU0xJQ19JU1IJCTB4MDAxOAotCi0JdTMyCXNsaWNfaGJhcjsJLyogSGVhZGVyIGJ1ZmZlciBhZGRyZXNzIHJlZyAqLwotCXUzMglwYWQ0OwotCS8qCi0JICogMzEtOCAtIHBoeSBhZGRyIG9mIHNldCBvZiBjb250aWd1b3VzIGhkciBidWZmZXJzCi0JICogIDctMCAtIG51bWJlciBvZiBidWZmZXJzIHBhc3NlZAotCSAqIEJ1ZmZlcnMgYXJlIDI1NiBieXRlcyBsb25nIG9uIDI1Ni1ieXRlIGJvdW5kYXJpZXMuCi0JICovCi0jZGVmaW5lIFNMSUNfSEJBUgkJMHgwMDIwCi0jZGVmaW5lIFNMSUNfSEJBUl9DTlRfTVNLCTB4MDAwMDAwRkYKLQotCXUzMglzbGljX2RiYXI7CS8qIERhdGEgYnVmZmVyIGhhbmRsZSAmIGFkZHJlc3MgcmVnICovCi0JdTMyCXBhZDU7Ci0KLQkvKiA0IHNldHMgb2YgcmVnaXN0ZXJzOyBCdWZmZXJzIGFyZSAySyBieXRlcyBsb25nIDIgcGVyIDRLIHBhZ2UuICovCi0jZGVmaW5lIFNMSUNfREJBUgkJMHgwMDI4Ci0jZGVmaW5lIFNMSUNfREJBUl9TSVpFCQkyMDQ4Ci0KLQl1MzIJc2xpY19jYmFyOwkvKiBYbXQgQ21kIGJ1ZiBhZGRyIHJlZ3MuKi8KLQkvKgotCSAqIDEgcGVyIFhNVCBpbnRlcmZhY2UKLQkgKiAzMS01IC0gcGh5IGFkZHIgb2YgaG9zdCBjb21tYW5kIGJ1ZmZlcgotCSAqICA0LTAgLSBsZW5ndGggb2YgY21kIGluIG11bHRpcGxlcyBvZiAzMiBieXRlcwotCSAqIEJ1ZmZlcnMgYXJlIDMyIGJ5dGVzIHVwIHRvIDUxMiBieXRlcyBsb25nCi0JICovCi0jZGVmaW5lIFNMSUNfQ0JBUgkJMHgwMDMwCi0jZGVmaW5lIFNMSUNfQ0JBUl9MRU5fTVNLCTB4MDAwMDAwMUYKLSNkZWZpbmUgU0xJQ19DQkFSX0FMSUdOCQkweDAwMDAwMDIwCi0KLQl1MzIJc2xpY193Y3M7CS8qIHdyaXRlIGNvbnRyb2wgc3RvcmUqLwotI2RlZmluZQlTTElDX1dDUwkJMHgwMDM0Ci0jZGVmaW5lIFNMSUNfV0NTX1NUQVJUCQkweDgwMDAwMDAwCS8qU3RhcnQgdGhlIFNMSUMgKEp1bXAgdG8gV0NTKSovCi0jZGVmaW5lIFNMSUNfV0NTX0NPTVBBUkUJMHg0MDAwMDAwMAkvKiBDb21wYXJlIHdpdGggdmFsdWUgaW4gV0NTKi8KLQotCXUzMglzbGljX3JiYXI7CS8qIFJlc3BvbnNlIGJ1ZmZlciBhZGRyZXNzIHJlZy4qLwotCXUzMglwYWQ3OwotCS8qCi0JICogMzEtOCAtIHBoeSBhZGRyIG9mIHNldCBvZiBjb250aWd1b3VzIHJlc3BvbnNlIGJ1ZmZlcnMKLQkgKiA3LTAgLSBudW1iZXIgb2YgYnVmZmVycyBwYXNzZWQKLQkgKiBCdWZmZXJzIGFyZSAzMiBieXRlcyBsb25nIG9uIDMyLWJ5dGUgYm91bmRhcmllcy4KLQkgKi8KLSNkZWZpbmUgU0xJQ19SQkFSCQkweDAwMzgKLSNkZWZpbmUgU0xJQ19SQkFSX0NOVF9NU0sJMHgwMDAwMDBGRgotI2RlZmluZSBTTElDX1JCQVJfU0laRQkJMzIKLQotCXUzMglzbGljX3N0YXRzOwkvKiByZWFkIHN0YXRpc3RpY3MgKFVQUikgKi8KLQl1MzIJcGFkODsKLSNkZWZpbmUJU0xJQ19SU1RBVAkJMHgwMDQwCi0KLQl1MzIJc2xpY19ybHNyOwkvKiByZWFkIGxpbmsgc3RhdHVzICovCi0JdTMyCXBhZDk7Ci0jZGVmaW5lIFNMSUNfTFNUQVQJCTB4MDA0OAotCi0JdTMyCXNsaWNfd21jZmc7CS8qIFdyaXRlIE1hYyBDb25maWcgKi8KLQl1MzIJcGFkMTA7Ci0jZGVmaW5lCVNMSUNfV01DRkcJCTB4MDA1MAotCi0JdTMyCXNsaWNfd3BoeTsJLyogV3JpdGUgcGh5IHJlZ2lzdGVyICovCi0JdTMyCXBhZDExOwotI2RlZmluZSBTTElDX1dQSFkJCTB4MDA1OAotCi0JdTMyCXNsaWNfcmNiYXI7CS8qIFJjdiBDbWQgYnVmIGFkZHIgcmVnICovCi0JdTMyCXBhZDEyOwotI2RlZmluZQlTTElDX1JDQkFSCQkweDAwNjAKLQotCXUzMglzbGljX3Jjb25maWc7CS8qIFJlYWQgU0xJQyBDb25maWcqLwotCXUzMglwYWQxMzsKLSNkZWZpbmUgU0xJQ19SQ09ORklHCTB4MDA2OAotCi0JdTMyCXNsaWNfaW50YWdnOwkvKiBJbnRlcnJ1cHQgYWdncmVnYXRpb24gdGltZSAqLwotCXUzMglwYWQxNDsKLSNkZWZpbmUgU0xJQ19JTlRBR0cJCTB4MDA3MAotCi0JdTMyCXNsaWNfd3hjZmc7CS8qIFdyaXRlIFhNSVQgY29uZmlnIHJlZyovCi0JdTMyCXBhZDE2OwotI2RlZmluZQlTTElDX1dYQ0ZHCQkweDAwNzgKLQotCXUzMglzbGljX3dyY2ZnOwkvKiBXcml0ZSBSQ1YgY29uZmlnIHJlZyovCi0JdTMyCXBhZDE3OwotI2RlZmluZQlTTElDX1dSQ0ZHCQkweDAwODAKLQotCXUzMglzbGljX3dyYWRkcmFsOwkvKiBXcml0ZSByY3YgYWRkciBhIGxvdyovCi0JdTMyCXBhZDE4OwotI2RlZmluZQlTTElDX1dSQUREUkFMCTB4MDA4OAotCi0JdTMyCXNsaWNfd3JhZGRyYWg7CS8qIFdyaXRlIHJjdiBhZGRyIGEgaGlnaCovCi0JdTMyCXBhZDE5OwotI2RlZmluZQlTTElDX1dSQUREUkFICTB4MDA5MAotCi0JdTMyCXNsaWNfd3JhZGRyYmw7CS8qIFdyaXRlIHJjdiBhZGRyIGIgbG93Ki8KLQl1MzIJcGFkMjA7Ci0jZGVmaW5lCVNMSUNfV1JBRERSQkwJMHgwMDk4Ci0KLQl1MzIJc2xpY193cmFkZHJiaDsJLyogV3JpdGUgcmN2IGFkZHIgYiBoaWdoKi8KLQl1MzIJCXBhZDIxOwotI2RlZmluZQlTTElDX1dSQUREUkJICTB4MDBhMAotCi0JdTMyCXNsaWNfbWNhc3Rsb3c7CS8qIExvdyBiaXRzIG9mIG1jYXN0IG1hc2sqLwotCXUzMgkJcGFkMjI7Ci0jZGVmaW5lCVNMSUNfTUNBU1RMT1cJMHgwMGE4Ci0KLQl1MzIJc2xpY19tY2FzdGhpZ2g7CS8qIEhpZ2ggYml0cyBvZiBtY2FzdCBtYXNrKi8KLQl1MzIJCXBhZDIzOwotI2RlZmluZQlTTElDX01DQVNUSElHSAkweDAwYjAKLQotCXUzMglzbGljX3Bpbmc7CS8qIFBpbmcgdGhlIGNhcmQqLwotCXUzMglwYWQyNDsKLSNkZWZpbmUgU0xJQ19QSU5HCQkweDAwYjgKLQotCXUzMglzbGljX2R1bXBfY21kOwkvKiBEdW1wIGNvbW1hbmQgKi8KLQl1MzIJcGFkMjU7Ci0jZGVmaW5lIFNMSUNfRFVNUF9DTUQJMHgwMGMwCi0KLQl1MzIJc2xpY19kdW1wX2RhdGE7CS8qIER1bXAgZGF0YSBwb2ludGVyICovCi0JdTMyCXBhZDI2OwotI2RlZmluZSBTTElDX0RVTVBfREFUQQkweDAwYzgKLQotCXUzMglzbGljX3BjaXN0YXR1czsJLyogUmVhZCBjYXJkJ3MgcGNpX3N0YXR1cyByZWdpc3RlciAqLwotCXUzMglwYWQyNzsKLSNkZWZpbmUJU0xJQ19QQ0lTVEFUVVMJMHgwMGQwCi0KLQl1MzIJc2xpY193cmhvc3RpZDsJLyogV3JpdGUgaG9zdGlkIGZpZWxkICovCi0JdTMyCQlwYWQyODsKLSNkZWZpbmUgU0xJQ19XUkhPU1RJRAkJIDB4MDBkOAotI2RlZmluZSBTTElDX1JESE9TVElEXzFHQgkgMHgxNTU0Ci0jZGVmaW5lIFNMSUNfUkRIT1NUSURfMkdCCSAweDE1NTQKLQotCXUzMglzbGljX2xvd19wb3dlcjsJLyogUHV0IGNhcmQgaW4gYSBsb3cgcG93ZXIgc3RhdGUgKi8KLQl1MzIJcGFkMjk7Ci0jZGVmaW5lIFNMSUNfTE9XX1BPV0VSCTB4MDBlMAotCi0JdTMyCXNsaWNfcXVpZXNjZTsJLyogZm9yY2Ugc2xpYyBpbnRvIHF1aWVzY2VudCBzdGF0ZQotCQkJCSAqIGJlZm9yZSBzb2Z0IHJlc2V0Ci0JCQkJICovCi0JdTMyCXBhZDMwOwotI2RlZmluZSBTTElDX1FVSUVTQ0UJMHgwMGU4Ci0KLQl1MzIJc2xpY19yZXNldF9pZmFjZTsvKiByZXNldCBpbnRlcmZhY2UgcXVldWVzICovCi0JdTMyCXBhZDMxOwotI2RlZmluZSBTTElDX1JFU0VUX0lGQUNFIDB4MDBmMAotCi0JdTMyCXNsaWNfYWRkcl91cHBlcjsvKiBCaXRzIDYzLTMyIGZvciBob3N0IGkvZiBhZGRycyAqLwotCXUzMglwYWQzMjsKLSNkZWZpbmUgU0xJQ19BRERSX1VQUEVSCTB4MDBmOCAvKlJlZ2lzdGVyIGlzIG9ubHkgd3JpdHRlbiB3aGVuIGl0IGhhcyBjaGFuZ2VkKi8KLQotCXUzMglzbGljX2hiYXI2NDsJLyogNjQgYml0IEhlYWRlciBidWZmZXIgYWRkcmVzcyByZWcgKi8KLQl1MzIJcGFkMzM7Ci0jZGVmaW5lIFNMSUNfSEJBUjY0CQkweDAxMDAKLQotCXUzMglzbGljX2RiYXI2NDsJLyogNjQgYml0IERhdGEgYnVmZmVyIGhhbmRsZSAmIGFkZHJlc3MgcmVnICovCi0JdTMyCXBhZDM0OwotI2RlZmluZSBTTElDX0RCQVI2NAkJMHgwMTA4Ci0KLQl1MzIJc2xpY19jYmFyNjQ7CS8qIDY0IGJpdCBYbXQgQ21kIGJ1ZiBhZGRyIHJlZ3MuICovCi0JdTMyCXBhZDM1OwotI2RlZmluZSBTTElDX0NCQVI2NAkJMHgwMTEwCi0KLQl1MzIJc2xpY19yYmFyNjQ7CS8qIDY0IGJpdCBSZXNwb25zZSBidWZmZXIgYWRkcmVzcyByZWcuKi8KLQl1MzIJcGFkMzY7Ci0jZGVmaW5lIFNMSUNfUkJBUjY0CQkweDAxMTgKLQotCXUzMglzbGljX3JjYmFyNjQ7CS8qIDY0IGJpdCBSY3YgQ21kIGJ1ZiBhZGRyIHJlZyovCi0JdTMyCXBhZDM3OwotI2RlZmluZQlTTElDX1JDQkFSNjQJMHgwMTIwCi0KLQl1MzIJc2xpY19zdGF0czY0OwkvKiByZWFkIHN0YXRpc3RpY3MgKDY0IGJpdCBVUFIpICovCi0JdTMyCXBhZDM4OwotI2RlZmluZQlTTElDX1JTVEFUNjQJMHgwMTI4Ci0KLQl1MzIJc2xpY19yY3Zfd2NzOwkvKkRvd25sb2FkIEdpZ2FiaXQgUkNWIHNlcXVlbmNlciB1Y29kZSovCi0JdTMyCXBhZDM5OwotI2RlZmluZSBTTElDX1JDVl9XQ1MJMHgwMTMwCi0jZGVmaW5lIFNMSUNfUkNWV0NTX0JFR0lOCTB4NDAwMDAwMDAKLSNkZWZpbmUgU0xJQ19SQ1ZXQ1NfRklOSVNICTB4ODAwMDAwMDAKLQotCXUzMglzbGljX3dydmxhbmlkOwkvKiBXcml0ZSBWbGFuSWQgZmllbGQgKi8KLQl1MzIJcGFkNDA7Ci0jZGVmaW5lIFNMSUNfV1JWTEFOSUQJMHgwMTM4Ci0KLQl1MzIJc2xpY19yZWFkX3hmX2luZm87CS8qIFJlYWQgVHJhbnNmb3JtZXIgaW5mbyAqLwotCXUzMglwYWQ0MTsKLSNkZWZpbmUgU0xJQ19SRUFEX1hGX0lORk8JMHgwMTQwCi0KLQl1MzIJc2xpY193cml0ZV94Zl9pbmZvOwkvKiBXcml0ZSBUcmFuc2Zvcm1lciBpbmZvICovCi0JdTMyCXBhZDQyOwotI2RlZmluZSBTTElDX1dSSVRFX1hGX0lORk8JMHgwMTQ4Ci0KLQl1MzIJUlNWRDE7CQkvKiBUT0UgT25seSAqLwotCXUzMglwYWQ0MzsKLQotCXUzMglSU1ZEMjsJCS8qIFRPRSBPbmx5ICovCi0JdTMyCXBhZDQ0OwotCi0JdTMyCVJTVkQzOwkJLyogVE9FIE9ubHkgKi8KLQl1MzIJcGFkNDU7Ci0KLQl1MzIJUlNWRDQ7CQkvKiBUT0UgT25seSAqLwotCXUzMglwYWQ0NjsKLQotCXUzMglzbGljX3RpY2tzX3Blcl9zZWM7IC8qIFdyaXRlIGNhcmQgdGlja3MgcGVyIHNlY29uZCAqLwotCXUzMglwYWQ0NzsKLSNkZWZpbmUgU0xJQ19USUNLU19QRVJfU0VDCTB4MDE3MAotfTsKKyNkZWZpbmUgU0xJQ19SRUdfSE9TVElECQkweDE1NTQKIAogZW51bSBVUFJfUkVRVUVTVCB7CiAJU0xJQ19VUFJfU1RBVFMsCkBAIC01NjUsODUgKzQ1OSw2IEBACiAJc3RydWN0IHNsaWNwbV93YWtldXBfY2FwYWJpbGl0aWVzIHdha2V1cF9jYXBhYmlsaXRpZXM7CiB9OwogCi1zdHJ1Y3QgeG10X3N0YXRzIHsKLQl1MzIgeG1pdF90Y3BfYnl0ZXM7Ci0JdTMyIHhtaXRfdGNwX3NlZ3M7Ci0JdTMyIHhtaXRfYnl0ZXM7Ci0JdTMyIHhtaXRfY29sbGlzaW9uczsKLQl1MzIgeG1pdF91bmljYXN0czsKLQl1MzIgeG1pdF9vdGhlcl9lcnJvcjsKLQl1MzIgeG1pdF9leGNlc3NfY29sbGlzaW9uczsKLX07Ci0KLXN0cnVjdCByY3Zfc3RhdHMgewotCXUzMiByY3ZfdGNwX2J5dGVzOwotCXUzMiByY3ZfdGNwX3NlZ3M7Ci0JdTMyIHJjdl9ieXRlczsKLQl1MzIgcmN2X3VuaWNhc3RzOwotCXUzMiByY3Zfb3RoZXJfZXJyb3I7Ci0JdTMyIHJjdl9kcm9wczsKLX07Ci0KLXN0cnVjdCB4bXRfc3RhdHNnYiB7Ci0JdTY0IHhtaXRfdGNwX2J5dGVzOwotCXU2NCB4bWl0X3RjcF9zZWdzOwotCXU2NCB4bWl0X2J5dGVzOwotCXU2NCB4bWl0X2NvbGxpc2lvbnM7Ci0JdTY0IHhtaXRfdW5pY2FzdHM7Ci0JdTY0IHhtaXRfb3RoZXJfZXJyb3I7Ci0JdTY0IHhtaXRfZXhjZXNzX2NvbGxpc2lvbnM7Ci19OwotCi1zdHJ1Y3QgcmN2X3N0YXRzZ2IgewotCXU2NCByY3ZfdGNwX2J5dGVzOwotCXU2NCByY3ZfdGNwX3NlZ3M7Ci0JdTY0IHJjdl9ieXRlczsKLQl1NjQgcmN2X3VuaWNhc3RzOwotCXU2NCByY3Zfb3RoZXJfZXJyb3I7Ci0JdTY0IHJjdl9kcm9wczsKLX07Ci0KLXN0cnVjdCBzbGljX3N0YXRzIHsKLQl1bmlvbiB7Ci0JCXN0cnVjdCB7Ci0JCQlzdHJ1Y3QgeG10X3N0YXRzIHhtdDEwMDsKLQkJCXN0cnVjdCByY3Zfc3RhdHMgcmN2MTAwOwotCQl9IHN0YXRzXzEwMDsKLQkJc3RydWN0IHsKLQkJCXN0cnVjdCB4bXRfc3RhdHNnYiB4bXRHQjsKLQkJCXN0cnVjdCByY3Zfc3RhdHNnYiByY3ZHQjsKLQkJfSBzdGF0c19HQjsKLQl9IHU7Ci19OwotCi0jZGVmaW5lIHhtaXRfdGNwX3NlZ3MxMDAJCXUuc3RhdHNfMTAwLnhtdDEwMC54bWl0X3RjcF9zZWdzCi0jZGVmaW5lIHhtaXRfdGNwX2J5dGVzMTAwCQl1LnN0YXRzXzEwMC54bXQxMDAueG1pdF90Y3BfYnl0ZXMKLSNkZWZpbmUgeG1pdF9ieXRlczEwMAkJCXUuc3RhdHNfMTAwLnhtdDEwMC54bWl0X2J5dGVzCi0jZGVmaW5lIHhtaXRfY29sbGlzaW9uczEwMAkJdS5zdGF0c18xMDAueG10MTAwLnhtaXRfY29sbGlzaW9ucwotI2RlZmluZSB4bWl0X3VuaWNhc3RzMTAwCQl1LnN0YXRzXzEwMC54bXQxMDAueG1pdF91bmljYXN0cwotI2RlZmluZSB4bWl0X290aGVyX2Vycm9yMTAwCQl1LnN0YXRzXzEwMC54bXQxMDAueG1pdF9vdGhlcl9lcnJvcgotI2RlZmluZSB4bWl0X2V4Y2Vzc19jb2xsaXNpb25zMTAwCXUuc3RhdHNfMTAwLnhtdDEwMC54bWl0X2V4Y2Vzc19jb2xsaXNpb25zCi0jZGVmaW5lIHJjdl90Y3Bfc2VnczEwMAkJCXUuc3RhdHNfMTAwLnJjdjEwMC5yY3ZfdGNwX3NlZ3MKLSNkZWZpbmUgcmN2X3RjcF9ieXRlczEwMAkJdS5zdGF0c18xMDAucmN2MTAwLnJjdl90Y3BfYnl0ZXMKLSNkZWZpbmUgcmN2X2J5dGVzMTAwCQkJdS5zdGF0c18xMDAucmN2MTAwLnJjdl9ieXRlcwotI2RlZmluZSByY3ZfdW5pY2FzdHMxMDAJCQl1LnN0YXRzXzEwMC5yY3YxMDAucmN2X3VuaWNhc3RzCi0jZGVmaW5lIHJjdl9vdGhlcl9lcnJvcjEwMAkJdS5zdGF0c18xMDAucmN2MTAwLnJjdl9vdGhlcl9lcnJvcgotI2RlZmluZSByY3ZfZHJvcHMxMDAJCQl1LnN0YXRzXzEwMC5yY3YxMDAucmN2X2Ryb3BzCi0jZGVmaW5lIHhtaXRfdGNwX3NlZ3NfZ2IJCXUuc3RhdHNfR0IueG10R0IueG1pdF90Y3Bfc2VncwotI2RlZmluZSB4bWl0X3RjcF9ieXRlc19nYgkJdS5zdGF0c19HQi54bXRHQi54bWl0X3RjcF9ieXRlcwotI2RlZmluZSB4bWl0X2J5dGVzX2diCQkJdS5zdGF0c19HQi54bXRHQi54bWl0X2J5dGVzCi0jZGVmaW5lIHhtaXRfY29sbGlzaW9uc19nYgkJdS5zdGF0c19HQi54bXRHQi54bWl0X2NvbGxpc2lvbnMKLSNkZWZpbmUgeG1pdF91bmljYXN0c19nYgkJdS5zdGF0c19HQi54bXRHQi54bWl0X3VuaWNhc3RzCi0jZGVmaW5lIHhtaXRfb3RoZXJfZXJyb3JfZ2IJCXUuc3RhdHNfR0IueG10R0IueG1pdF9vdGhlcl9lcnJvcgotI2RlZmluZSB4bWl0X2V4Y2Vzc19jb2xsaXNpb25zX2diCXUuc3RhdHNfR0IueG10R0IueG1pdF9leGNlc3NfY29sbGlzaW9ucwotCi0jZGVmaW5lIHJjdl90Y3Bfc2Vnc19nYgkJCXUuc3RhdHNfR0IucmN2R0IucmN2X3RjcF9zZWdzCi0jZGVmaW5lIHJjdl90Y3BfYnl0ZXNfZ2IJCXUuc3RhdHNfR0IucmN2R0IucmN2X3RjcF9ieXRlcwotI2RlZmluZSByY3ZfYnl0ZXNfZ2IJCQl1LnN0YXRzX0dCLnJjdkdCLnJjdl9ieXRlcwotI2RlZmluZSByY3ZfdW5pY2FzdHNfZ2IJCQl1LnN0YXRzX0dCLnJjdkdCLnJjdl91bmljYXN0cwotI2RlZmluZSByY3Zfb3RoZXJfZXJyb3JfZ2IJCXUuc3RhdHNfR0IucmN2R0IucmN2X290aGVyX2Vycm9yCi0jZGVmaW5lIHJjdl9kcm9wc19nYgkJCXUuc3RhdHNfR0IucmN2R0IucmN2X2Ryb3BzCi0KIHN0cnVjdCBzbGljX2NvbmZpZ19tYWMgewogCXU4IG1hY2FkZHJBWzZdOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWNvc3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWNvc3MuYwppbmRleCBhYzEyNmQ0Li4wNjIzMDdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljb3NzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpY29zcy5jCkBAIC0xMjQsMzEgKzEyNCwxMCBAQAogCXsgMCB9CiB9OwogCi1zdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHNsaWNfZXRodG9vbF9vcHM7CitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHNsaWNfZXRodG9vbF9vcHM7CiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzbGljX3BjaV90YmwpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgc2xpY19yZWczMl93cml0ZSh2b2lkIF9faW9tZW0gKnJlZywgdTMyIHZhbHVlLCBib29sIGZsdXNoKQotewotCXdyaXRlbCh2YWx1ZSwgcmVnKTsKLQlpZiAoZmx1c2gpCi0JCW1iKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzbGljX3JlZzY0X3dyaXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB2b2lkIF9faW9tZW0gKnJlZywKLQkJCQkgICAgdTMyIHZhbHVlLCB2b2lkIF9faW9tZW0gKnJlZ2gsIHUzMiBwYWRkcmgsCi0JCQkJICAgIGJvb2wgZmx1c2gpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5iaXQ2NHJlZ2xvY2ssIGZsYWdzKTsKLQl3cml0ZWwocGFkZHJoLCByZWdoKTsKLQl3cml0ZWwodmFsdWUsIHJlZyk7Ci0JaWYgKGZsdXNoKQotCQltYigpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmJpdDY0cmVnbG9jaywgZmxhZ3MpOwotfQotCiBzdGF0aWMgdm9pZCBzbGljX21jYXN0X3NldF9iaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGNoYXIgKmFkZHJlc3MpCiB7CiAJdW5zaWduZWQgY2hhciBjcmNwb2x5OwpAQCAtMTcyLDggKzE1MSw2IEBACiAKIHN0YXRpYyB2b2lkIHNsaWNfbWNhc3Rfc2V0X21hc2soc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JX19pb21lbSBzdHJ1Y3Qgc2xpY19yZWdzICpzbGljX3JlZ3MgPSBhZGFwdGVyLT5zbGljX3JlZ3M7Ci0KIAlpZiAoYWRhcHRlci0+bWFjb3B0cyAmIChNQUNfQUxMTUNBU1QgfCBNQUNfUFJPTUlTQykpIHsKIAkJLyoKIAkJICogVHVybiBvbiBhbGwgbXVsdGljYXN0IGFkZHJlc3Nlcy4gV2UgaGF2ZSB0byBkbyB0aGlzIGZvcgpAQCAtMTgxLDE4ICsxNTgsMTcgQEAKIAkJICogTWljcm9jb2RlIGZyb20gaGF2aW5nIHRvIGtlZXAgc3RhdGUgYWJvdXQgdGhlIE1BQwogCQkgKiBjb25maWd1cmF0aW9uLgogCQkgKi8KLQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX21jYXN0bG93LCAweEZGRkZGRkZGLCBGTFVTSCk7Ci0JCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19tY2FzdGhpZ2gsIDB4RkZGRkZGRkYsCi0JCQkJIEZMVVNIKTsKKwkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX01DQVNUTE9XLCAweEZGRkZGRkZGKTsKKwkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX01DQVNUSElHSCwgMHhGRkZGRkZGRik7CiAJfSBlbHNlIHsKIAkJLyoKIAkJICogQ29tbWl0IG91ciBtdWx0aWNhc3QgbWFzdCB0byB0aGUgU0xJQyBieSB3cml0aW5nIHRvIHRoZQogCQkgKiBtdWx0aWNhc3QgYWRkcmVzcyBtYXNrIHJlZ2lzdGVycwogCQkgKi8KLQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX21jYXN0bG93LAotCQkJKHUzMikoYWRhcHRlci0+bWNhc3RtYXNrICYgMHhGRkZGRkZGRiksIEZMVVNIKTsKLQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX21jYXN0aGlnaCwKLQkJCSh1MzIpKChhZGFwdGVyLT5tY2FzdG1hc2sgPj4gMzIpICYgMHhGRkZGRkZGRiksIEZMVVNIKTsKKwkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX01DQVNUTE9XLAorCQkJICAgICAodTMyKShhZGFwdGVyLT5tY2FzdG1hc2sgJiAweEZGRkZGRkZGKSk7CisJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19NQ0FTVEhJR0gsCisJCQkgICAgICh1MzIpKChhZGFwdGVyLT5tY2FzdG1hc2sgPj4gMzIpICYgMHhGRkZGRkZGRikpOwogCX0KIH0KIApAQCAtMjA4LDEzICsxODQsNiBAQAogCWFkZF90aW1lcigmYWRhcHRlci0+cGluZ3RpbWVyKTsKIH0KIAotc3RhdGljIHZvaWQgc2xpY191bm1hcF9tbWlvX3NwYWNlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQotewotCWlmIChhZGFwdGVyLT5zbGljX3JlZ3MpCi0JCWlvdW5tYXAoYWRhcHRlci0+c2xpY19yZWdzKTsKLQlhZGFwdGVyLT5zbGljX3JlZ3MgPSBOVUxMOwotfQotCiAvKgogICogIHNsaWNfbGlua19jb25maWcKICAqCkBAIC0yMjQsNyArMTkzLDYgQEAKIHN0YXRpYyB2b2lkIHNsaWNfbGlua19jb25maWcoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCiAJCSAgICAgIHUzMiBsaW5rc3BlZWQsIHUzMiBsaW5rZHVwbGV4KQogewotCXUzMiBfX2lvbWVtICp3cGh5OwogCXUzMiBzcGVlZDsKIAl1MzIgZHVwbGV4OwogCXUzMiBwaHlfY29uZmlnOwpAQCAtMjM5LDggKzIwNyw2IEBACiAJaWYgKGxpbmtkdXBsZXggPiBMSU5LX0FVVE9EKQogCQlsaW5rZHVwbGV4ID0gTElOS19BVVRPRDsKIAotCXdwaHkgPSAmYWRhcHRlci0+c2xpY19yZWdzLT5zbGljX3dwaHk7Ci0KIAlpZiAoKGxpbmtzcGVlZCA9PSBMSU5LX0FVVE9TUEVFRCkgfHwgKGxpbmtzcGVlZCA9PSBMSU5LXzEwMDBNQikpIHsKIAkJaWYgKGFkYXB0ZXItPmZsYWdzICYgQURBUFRfRkxBR1NfRklCRVJNRURJQSkgewogCQkJLyoKQEAgLTI1Miw3ICsyMTgsNyBAQAogCQkJcGh5X2FkdnJlZyA9IChNSUlDUl9SRUdfNCB8IChQQVJfQURWMTAwMFhGRCkpOwogCQkJLyogZW5hYmxlIFBBVVNFIGZyYW1lcyAgICAgICAgKi8KIAkJCXBoeV9hZHZyZWcgfD0gUEFSX0FTWU1QQVVTRV9GSUJFUjsKLQkJCXNsaWNfcmVnMzJfd3JpdGUod3BoeSwgcGh5X2FkdnJlZywgRkxVU0gpOworCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dQSFksIHBoeV9hZHZyZWcpOwogCiAJCQlpZiAobGlua3NwZWVkID09IExJTktfQVVUT1NQRUVEKSB7CiAJCQkJLyogcmVzZXQgcGh5LCBlbmFibGUgYXV0by1uZWcgICovCkBAIC0yNjAsMTQgKzIyNiwxNyBAQAogCQkJCSAgICAoTUlJQ1JfUkVHX1BDUiB8CiAJCQkJICAgICAoUENSX1JFU0VUIHwgUENSX0FVVE9ORUcgfAogCQkJCSAgICAgIFBDUl9BVVRPTkVHX1JTVCkpOwotCQkJCXNsaWNfcmVnMzJfd3JpdGUod3BoeSwgcGh5X2NvbmZpZywgRkxVU0gpOworCQkJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19XUEhZLAorCQkJCQkgICAgIHBoeV9jb25maWcpOwogCQkJfSBlbHNlIHsJLyogZm9yY2VkIDEwMDAgTWIgRkQqLwogCQkJCS8qCiAJCQkJICogcG93ZXIgZG93biBwaHkgdG8gYnJlYWsgbGluawogCQkJCSAqIHRoaXMgbWF5IG5vdCB3b3JrKQogCQkJCSAqLwogCQkJCXBoeV9jb25maWcgPSAoTUlJQ1JfUkVHX1BDUiB8IFBDUl9QT1dFUkRPV04pOwotCQkJCXNsaWNfcmVnMzJfd3JpdGUod3BoeSwgcGh5X2NvbmZpZywgRkxVU0gpOworCQkJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19XUEhZLAorCQkJCQkgICAgIHBoeV9jb25maWcpOworCQkJCXNsaWNfZmx1c2hfd3JpdGUoYWRhcHRlcik7CiAJCQkJLyoKIAkJCQkgKiB3YWl0LCBNYXJ2ZWxsIHNheXMgMSBzZWMsCiAJCQkJICogdHJ5IHRvIGdldCBhd2F5IHdpdGggMTAgbXMKQEAgLTI4Miw3ICsyNTEsOCBAQAogCQkJCSAgICAoTUlJQ1JfUkVHX1BDUiB8CiAJCQkJICAgICAoUENSX1JFU0VUIHwgUENSX1NQRUVEXzEwMDAgfAogCQkJCSAgICAgIFBDUl9EVVBMRVhfRlVMTCkpOwotCQkJCXNsaWNfcmVnMzJfd3JpdGUod3BoeSwgcGh5X2NvbmZpZywgRkxVU0gpOworCQkJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19XUEhZLAorCQkJCQkgICAgIHBoeV9jb25maWcpOwogCQkJfQogCQl9IGVsc2UgewkvKiBjb3BwZXIgZ2lnYWJpdCAqLwogCkBAIC0zMDksMTAgKzI3OSwxMCBAQAogCQkJcGh5X2FkdnJlZyB8PSBQQVJfQVNZTVBBVVNFOwogCQkJLyogcmVxdWlyZWQgYnkgdGhlIENpY2FkYSBQSFkgICovCiAJCQlwaHlfYWR2cmVnIHw9IFBBUl84MDJfMzsKLQkJCXNsaWNfcmVnMzJfd3JpdGUod3BoeSwgcGh5X2FkdnJlZywgRkxVU0gpOworCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dQSFksIHBoeV9hZHZyZWcpOwogCQkJLyogYWR2ZXJ0aXNlIEZEIG9ubHkgQDEwMDAgTWIgICovCiAJCQlwaHlfZ2N0bHJlZyA9IChNSUlDUl9SRUdfOSB8IChQR0NfQURWMTAwMEZEKSk7Ci0JCQlzbGljX3JlZzMyX3dyaXRlKHdwaHksIHBoeV9nY3RscmVnLCBGTFVTSCk7CisJCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV1BIWSwgcGh5X2djdGxyZWcpOwogCiAJCQlpZiAoYWRhcHRlci0+c3Vic3lzaWQgIT0gU0xJQ18xR0JfQ0lDQURBX1NVQlNZU19JRCkgewogCQkJCS8qCkBAIC0zMjEsMjAgKzI5MSwyMyBAQAogCQkJCSAqLwogCQkJCXBoeV9jb25maWcgPQogCQkJCSAgICAoTUlJQ1JfUkVHXzE2IHwgKE1SVl9SRUcxNl9YT1ZFUk9OKSk7Ci0JCQkJc2xpY19yZWczMl93cml0ZSh3cGh5LCBwaHlfY29uZmlnLCBGTFVTSCk7CisJCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dQSFksCisJCQkJCSAgICAgcGh5X2NvbmZpZyk7CiAKIAkJCQkvKiByZXNldCBwaHksIGVuYWJsZSBhdXRvLW5lZyAgKi8KIAkJCQlwaHlfY29uZmlnID0KIAkJCQkgICAgKE1JSUNSX1JFR19QQ1IgfAogCQkJCSAgICAgKFBDUl9SRVNFVCB8IFBDUl9BVVRPTkVHIHwKIAkJCQkgICAgICBQQ1JfQVVUT05FR19SU1QpKTsKLQkJCQlzbGljX3JlZzMyX3dyaXRlKHdwaHksIHBoeV9jb25maWcsIEZMVVNIKTsKKwkJCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV1BIWSwKKwkJCQkJICAgICBwaHlfY29uZmlnKTsKIAkJCX0gZWxzZSB7CS8qIGl0J3MgYSBDaWNhZGEgUEhZICAqLwogCQkJCS8qIGVuYWJsZSBhbmQgcmVzdGFydCBhdXRvLW5lZyAoZG9uJ3QgcmVzZXQpICAqLwogCQkJCXBoeV9jb25maWcgPQogCQkJCSAgICAoTUlJQ1JfUkVHX1BDUiB8CiAJCQkJICAgICAoUENSX0FVVE9ORUcgfCBQQ1JfQVVUT05FR19SU1QpKTsKLQkJCQlzbGljX3JlZzMyX3dyaXRlKHdwaHksIHBoeV9jb25maWcsIEZMVVNIKTsKKwkJCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV1BIWSwKKwkJCQkJICAgICBwaHlfY29uZmlnKTsKIAkJCX0KIAkJfQogCX0gZWxzZSB7CkBAIC0zNTQsMTMgKzMyNywxMyBAQAogCQkJICogZGlzYWJsZSBhdXRvIGNyb3Nzb3ZlcgogCQkJICovCiAJCQlwaHlfY29uZmlnID0gKE1JSUNSX1JFR18xNiB8IChNUlZfUkVHMTZfWE9WRVJPRkYpKTsKLQkJCXNsaWNfcmVnMzJfd3JpdGUod3BoeSwgcGh5X2NvbmZpZywgRkxVU0gpOworCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dQSFksIHBoeV9jb25maWcpOwogCQl9CiAKIAkJLyogcG93ZXIgZG93biBwaHkgdG8gYnJlYWsgbGluayAodGhpcyBtYXkgbm90IHdvcmspICAqLwogCQlwaHlfY29uZmlnID0gKE1JSUNSX1JFR19QQ1IgfCAoUENSX1BPV0VSRE9XTiB8IHNwZWVkIHwgZHVwbGV4KSk7Ci0JCXNsaWNfcmVnMzJfd3JpdGUod3BoeSwgcGh5X2NvbmZpZywgRkxVU0gpOwotCisJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19XUEhZLCBwaHlfY29uZmlnKTsKKwkJc2xpY19mbHVzaF93cml0ZShhZGFwdGVyKTsKIAkJLyogd2FpdCwgTWFydmVsbCBzYXlzIDEgc2VjLCB0cnkgdG8gZ2V0IGF3YXkgd2l0aCAxMCBtcyAqLwogCQltZGVsYXkoMTApOwogCkBAIC0zNzIsMTEgKzM0NSwxMSBAQAogCQkJICovCiAJCQlwaHlfY29uZmlnID0KIAkJCSAgICAoTUlJQ1JfUkVHX1BDUiB8IChQQ1JfUkVTRVQgfCBzcGVlZCB8IGR1cGxleCkpOwotCQkJc2xpY19yZWczMl93cml0ZSh3cGh5LCBwaHlfY29uZmlnLCBGTFVTSCk7CisJCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV1BIWSwgcGh5X2NvbmZpZyk7CiAJCX0gZWxzZSB7CS8qIGl0J3MgYSBDaWNhZGEgUEhZICAqLwogCQkJLyogZGlzYWJsZSBhdXRvLW5lZywgc2V0IHNwZWVkLCBwb3dlcnVwICAqLwogCQkJcGh5X2NvbmZpZyA9IChNSUlDUl9SRUdfUENSIHwgKHNwZWVkIHwgZHVwbGV4KSk7Ci0JCQlzbGljX3JlZzMyX3dyaXRlKHdwaHksIHBoeV9jb25maWcsIEZMVVNIKTsKKwkJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19XUEhZLCBwaHlfY29uZmlnKTsKIAkJfQogCX0KIH0KQEAgLTM4Niw3ICszNTksNiBAQAogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CiAJY29uc3QgY2hhciAqZmlsZSA9ICIiOwogCWludCByZXQ7Ci0JX19pb21lbSBzdHJ1Y3Qgc2xpY19yZWdzICpzbGljX3JlZ3MgPSBhZGFwdGVyLT5zbGljX3JlZ3M7CiAJdTMyIGNvZGVhZGRyOwogCXUzMiBpbnN0cnVjdGlvbjsKIAlpbnQgaW5kZXggPSAwOwpAQCAtNDI3LDI3ICszOTksMjggQEAKIAkJYnJlYWs7CiAJfQogCS8qIHN0YXJ0IGRvd25sb2FkICovCi0Jc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3Jjdl93Y3MsIFNMSUNfUkNWV0NTX0JFR0lOLCBGTFVTSCk7CisJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1JDVl9XQ1MsIFNMSUNfUkNWV0NTX0JFR0lOKTsKIAkvKiBkb3dubG9hZCB0aGUgcmN2IHNlcXVlbmNlciB1Y29kZSAqLwogCWZvciAoY29kZWFkZHIgPSAwOyBjb2RlYWRkciA8IHJjdnVjb2RlbGVuOyBjb2RlYWRkcisrKSB7CiAJCS8qIHdyaXRlIG91dCBpbnN0cnVjdGlvbiBhZGRyZXNzICovCi0JCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19yY3Zfd2NzLCBjb2RlYWRkciwgRkxVU0gpOworCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfUkNWX1dDUywgY29kZWFkZHIpOwogCiAJCWluc3RydWN0aW9uID0gKih1MzIgKikoZnctPmRhdGEgKyBpbmRleCk7CiAJCWluZGV4ICs9IDQ7CiAJCS8qIHdyaXRlIG91dCB0aGUgaW5zdHJ1Y3Rpb24gZGF0YSBsb3cgYWRkciAqLwotCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfcmN2X3djcywgaW5zdHJ1Y3Rpb24sIEZMVVNIKTsKKwkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1JDVl9XQ1MsIGluc3RydWN0aW9uKTsKIAogCQlpbnN0cnVjdGlvbiA9ICoodTggKikoZnctPmRhdGEgKyBpbmRleCk7CiAJCWluZGV4Kys7CiAJCS8qIHdyaXRlIG91dCB0aGUgaW5zdHJ1Y3Rpb24gZGF0YSBoaWdoIGFkZHIgKi8KLQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3Jjdl93Y3MsICh1OClpbnN0cnVjdGlvbiwKLQkJCQkgRkxVU0gpOworCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfUkNWX1dDUywgaW5zdHJ1Y3Rpb24pOwogCX0KIAogCS8qIGRvd25sb2FkIGZpbmlzaGVkICovCiAJcmVsZWFzZV9maXJtd2FyZShmdyk7Ci0Jc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3Jjdl93Y3MsIFNMSUNfUkNWV0NTX0ZJTklTSCwgRkxVU0gpOworCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19SQ1ZfV0NTLCBTTElDX1JDVldDU19GSU5JU0gpOworCXNsaWNfZmx1c2hfd3JpdGUoYWRhcHRlcik7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDYyLDcgKzQzNSw2IEBACiAJdTMyIHNlY3Rpb247CiAJaW50IHRoaXNzZWN0aW9uc2l6ZTsKIAlpbnQgY29kZWFkZHI7Ci0JX19pb21lbSBzdHJ1Y3Qgc2xpY19yZWdzICpzbGljX3JlZ3MgPSBhZGFwdGVyLT5zbGljX3JlZ3M7CiAJdTMyIGluc3RydWN0aW9uOwogCXUzMiBiYXNlYWRkcmVzczsKIAl1MzIgaTsKQEAgLTUwNiwxNyArNDc4LDE3IEBACiAKIAkJZm9yIChjb2RlYWRkciA9IDA7IGNvZGVhZGRyIDwgdGhpc3NlY3Rpb25zaXplOyBjb2RlYWRkcisrKSB7CiAJCQkvKiBXcml0ZSBvdXQgaW5zdHJ1Y3Rpb24gYWRkcmVzcyAqLwotCQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3djcywKLQkJCQkJIGJhc2VhZGRyZXNzICsgY29kZWFkZHIsIEZMVVNIKTsKKwkJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19XQ1MsCisJCQkJICAgICBiYXNlYWRkcmVzcyArIGNvZGVhZGRyKTsKIAkJCS8qIFdyaXRlIG91dCBpbnN0cnVjdGlvbiB0byBsb3cgYWRkciAqLwotCQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3djcywKLQkJCQkJaW5zdHJ1Y3Rpb24sIEZMVVNIKTsKKwkJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19XQ1MsCisJCQkJICAgICBpbnN0cnVjdGlvbik7CiAJCQlpbnN0cnVjdGlvbiA9ICoodTMyICopKGZ3LT5kYXRhICsgaW5kZXgpOwogCQkJaW5kZXggKz0gNDsKIAogCQkJLyogV3JpdGUgb3V0IGluc3RydWN0aW9uIHRvIGhpZ2ggYWRkciAqLwotCQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3djcywKLQkJCQkJaW5zdHJ1Y3Rpb24sIEZMVVNIKTsKKwkJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19XQ1MsCisJCQkJICAgICBpbnN0cnVjdGlvbik7CiAJCQlpbnN0cnVjdGlvbiA9ICoodTMyICopKGZ3LT5kYXRhICsgaW5kZXgpOwogCQkJaW5kZXggKz0gNDsKIAkJfQpAQCAtNTMxLDI3ICs1MDMsMjUgQEAKIAogCQlmb3IgKGNvZGVhZGRyID0gMDsgY29kZWFkZHIgPCB0aGlzc2VjdGlvbnNpemU7IGNvZGVhZGRyKyspIHsKIAkJCS8qIFdyaXRlIG91dCBpbnN0cnVjdGlvbiBhZGRyZXNzICovCi0JCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfd2NzLAotCQkJCVNMSUNfV0NTX0NPTVBBUkUgfCAoYmFzZWFkZHJlc3MgKyBjb2RlYWRkciksCi0JCQkJRkxVU0gpOworCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dDUywKKwkJCQkgICAgIFNMSUNfV0NTX0NPTVBBUkUgfCAoYmFzZWFkZHJlc3MgKworCQkJCQkJCSBjb2RlYWRkcikpOwogCQkJLyogV3JpdGUgb3V0IGluc3RydWN0aW9uIHRvIGxvdyBhZGRyICovCi0JCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfd2NzLCBpbnN0cnVjdGlvbiwKLQkJCQkJIEZMVVNIKTsKKwkJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19XQ1MsIGluc3RydWN0aW9uKTsKIAkJCWluc3RydWN0aW9uID0gKih1MzIgKikoZnctPmRhdGEgKyBpbmRleCk7CiAJCQlpbmRleCArPSA0OwogCQkJLyogV3JpdGUgb3V0IGluc3RydWN0aW9uIHRvIGhpZ2ggYWRkciAqLwotCQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3djcywgaW5zdHJ1Y3Rpb24sCi0JCQkJCSBGTFVTSCk7CisJCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV0NTLCBpbnN0cnVjdGlvbik7CiAJCQlpbnN0cnVjdGlvbiA9ICoodTMyICopKGZ3LT5kYXRhICsgaW5kZXgpOwogCQkJaW5kZXggKz0gNDsKLQogCQl9CiAJfQogCXJlbGVhc2VfZmlybXdhcmUoZncpOwogCS8qIEV2ZXJ5dGhpbmcgT0ssIGtpY2sgb2ZmIHRoZSBjYXJkICovCiAJbWRlbGF5KDEwKTsKLQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfd2NzLCBTTElDX1dDU19TVEFSVCwgRkxVU0gpOwogCisJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dDUywgU0xJQ19XQ1NfU1RBUlQpOworCXNsaWNfZmx1c2hfd3JpdGUoYWRhcHRlcik7CiAJLyoKIAkgKiBzdGFsbCBmb3IgMjAgbXMsIGxvbmcgZW5vdWdoIGZvciB1Y29kZSB0byBpbml0IGNhcmQKIAkgKiBhbmQgcmVhY2ggbWFpbmxvb3AKQEAgLTU4MywxOSArNTUzLDIxIEBACiAKIHN0YXRpYyB2b2lkIHNsaWNfaW50YWdnX3NldChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIHZhbHVlKQogewotCXNsaWNfcmVnMzJfd3JpdGUoJmFkYXB0ZXItPnNsaWNfcmVncy0+c2xpY19pbnRhZ2csIHZhbHVlLCBGTFVTSCk7CisJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX0lOVEFHRywgdmFsdWUpOwogCWFkYXB0ZXItPmNhcmQtPmxvYWRsZXZlbF9jdXJyZW50ID0gdmFsdWU7CiB9CiAKIHN0YXRpYyB2b2lkIHNsaWNfc29mdF9yZXNldChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKIHsKIAlpZiAoYWRhcHRlci0+Y2FyZC0+c3RhdGUgPT0gQ0FSRF9VUCkgewotCQlzbGljX3JlZzMyX3dyaXRlKCZhZGFwdGVyLT5zbGljX3JlZ3MtPnNsaWNfcXVpZXNjZSwgMCwgRkxVU0gpOworCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfUVVJRVNDRSwgMCk7CisJCXNsaWNfZmx1c2hfd3JpdGUoYWRhcHRlcik7CiAJCW1kZWxheSgxKTsKIAl9CiAKLQlzbGljX3JlZzMyX3dyaXRlKCZhZGFwdGVyLT5zbGljX3JlZ3MtPnNsaWNfcmVzZXQsIFNMSUNfUkVTRVRfTUFHSUMsCi0JCQkgRkxVU0gpOworCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19SRVNFVCwgU0xJQ19SRVNFVF9NQUdJQyk7CisJc2xpY19mbHVzaF93cml0ZShhZGFwdGVyKTsKKwogCW1kZWxheSgxKTsKIH0KIApAQCAtNjAzLDE3ICs1NzUsMTYgQEAKIHsKIAl1MzIgdmFsdWU7CiAJdTMyIHZhbHVlMjsKLQlfX2lvbWVtIHN0cnVjdCBzbGljX3JlZ3MgKnNsaWNfcmVncyA9IGFkYXB0ZXItPnNsaWNfcmVnczsKIAogCXZhbHVlID0gbnRvaGwoKihfX2JlMzIgKikmYWRhcHRlci0+Y3Vycm1hY2FkZHJbMl0pOwotCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY193cmFkZHJhbCwgdmFsdWUsIEZMVVNIKTsKLQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfd3JhZGRyYmwsIHZhbHVlLCBGTFVTSCk7CisJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dSQUREUkFMLCB2YWx1ZSk7CisJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dSQUREUkJMLCB2YWx1ZSk7CiAKIAl2YWx1ZTIgPSAodTMyKSgoYWRhcHRlci0+Y3Vycm1hY2FkZHJbMF0gPDwgOCB8CiAJCQkgICAgIGFkYXB0ZXItPmN1cnJtYWNhZGRyWzFdKSAmIDB4RkZGRik7CiAKLQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfd3JhZGRyYWgsIHZhbHVlMiwgRkxVU0gpOwotCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY193cmFkZHJiaCwgdmFsdWUyLCBGTFVTSCk7CisJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dSQUREUkFILCB2YWx1ZTIpOworCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19XUkFERFJCSCwgdmFsdWUyKTsKIAogCS8qCiAJICogV3JpdGUgb3VyIG11bHRpY2FzdCBtYXNrIG91dCB0byB0aGUgY2FyZC4gIFRoaXMgaXMgZG9uZQpAQCAtNjI2LDcgKzU5Nyw2IEBACiBzdGF0aWMgdm9pZCBzbGljX21hY19jb25maWcoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJdTMyIHZhbHVlOwotCV9faW9tZW0gc3RydWN0IHNsaWNfcmVncyAqc2xpY19yZWdzID0gYWRhcHRlci0+c2xpY19yZWdzOwogCiAJLyogU2V0dXAgR01BQyBnYXBzICovCiAJaWYgKGFkYXB0ZXItPmxpbmtzcGVlZCA9PSBMSU5LXzEwMDBNQikgewpAQCAtNjUwLDcgKzYyMCw3IEBACiAJfQogCiAJLyogd3JpdGUgbWFjIGNvbmZpZyAqLwotCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY193bWNmZywgdmFsdWUsIEZMVVNIKTsKKwlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV01DRkcsIHZhbHVlKTsKIAogCS8qIHNldHVwIG1hYyBhZGRyZXNzZXMgKi8KIAlzbGljX21hY19hZGRyZXNzX2NvbmZpZyhhZGFwdGVyKTsKQEAgLTY2MCw3ICs2MzAsNiBAQAogewogCXUzMiB2YWx1ZTsKIAl1MzIgUmNyUmVzZXQ7Ci0JX19pb21lbSBzdHJ1Y3Qgc2xpY19yZWdzICpzbGljX3JlZ3MgPSBhZGFwdGVyLT5zbGljX3JlZ3M7CiAKIAlpZiAobGlua2NoYW5nZSkgewogCQkvKiBTZXR1cCBNQUMgKi8KQEAgLTY3Nyw3ICs2NDYsNyBAQAogCQkJIEdYQ1JfWE1URU4gfAkvKiBFbmFibGUgdHJhbnNtaXQgICovCiAJCQkgR1hDUl9QQVVTRUVOKTsJLyogRW5hYmxlIHBhdXNlICAgICAqLwogCi0JCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY193eGNmZywgdmFsdWUsIEZMVVNIKTsKKwkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dYQ0ZHLCB2YWx1ZSk7CiAKIAkJLyogU2V0dXAgcmN2Y2ZnIGxhc3QgKi8KIAkJdmFsdWUgPSAoUmNyUmVzZXQgfAkvKiBSZXNldCwgaWYgbGlua2NoYW5nZSAqLwpAQCAtNjkwLDcgKzY1OSw3IEBACiAJCXZhbHVlID0gKEdYQ1JfUkVTRVQgfAkvKiBBbHdheXMgcmVzZXQgICAgICovCiAJCQkgR1hDUl9YTVRFTik7CS8qIEVuYWJsZSB0cmFuc21pdCAgKi8KIAotCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfd3hjZmcsIHZhbHVlLCBGTFVTSCk7CisJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19XWENGRywgdmFsdWUpOwogCiAJCS8qIFNldHVwIHJjdmNmZyBsYXN0ICovCiAJCXZhbHVlID0gKFJjclJlc2V0IHwJLyogUmVzZXQsIGlmIGxpbmtjaGFuZ2UgKi8KQEAgLTcwNyw3ICs2NzYsNyBAQAogCWlmIChhZGFwdGVyLT5tYWNvcHRzICYgTUFDX1BST01JU0MpCiAJCXZhbHVlIHw9IEdSQ1JfUkNWQUxMOwogCi0Jc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3dyY2ZnLCB2YWx1ZSwgRkxVU0gpOworCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19XUkNGRywgdmFsdWUpOwogfQogCiAvKgpAQCAtNzE3LDI0ICs2ODYsMjMgQEAKIHsKIAl1MzIgdmFsdWU7CiAJdTMyIHBoeV9jb25maWc7Ci0JX19pb21lbSBzdHJ1Y3Qgc2xpY19yZWdzICpzbGljX3JlZ3MgPSBhZGFwdGVyLT5zbGljX3JlZ3M7CiAKIAkvKiBTZXR1cCB4bXRjZmcgKi8KIAl2YWx1ZSA9IChHWENSX1JFU0VUIHwJLyogQWx3YXlzIHJlc2V0ICovCiAJCSBHWENSX1BBVVNFRU4pOwkvKiBFbmFibGUgcGF1c2UgKi8KIAotCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY193eGNmZywgdmFsdWUsIEZMVVNIKTsKKwlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV1hDRkcsIHZhbHVlKTsKIAogCXZhbHVlID0gKEdSQ1JfUkVTRVQgfAkvKiBBbHdheXMgcmVzZXQgICAgICAqLwogCQkgR1JDUl9DVExFTiB8CS8qIEVuYWJsZSBDVEwgZnJhbWVzICovCiAJCSBHUkNSX0FERFJBRU4gfAkvKiBBZGRyZXNzIEEgZW5hYmxlICAqLwogCQkgKEdSQ1JfSEFTSFNJWkUgPDwgR1JDUl9IQVNIU0laRV9TSElGVCkpOwogCi0Jc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3dyY2ZnLCB2YWx1ZSwgRkxVU0gpOworCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19XUkNGRywgdmFsdWUpOwogCiAJLyogcG93ZXIgZG93biBwaHkgKi8KIAlwaHlfY29uZmlnID0gKE1JSUNSX1JFR19QQ1IgfCAoUENSX1BPV0VSRE9XTikpOwotCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY193cGh5LCBwaHlfY29uZmlnLCBGTFVTSCk7CisJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dQSFksIHBoeV9jb25maWcpOwogfQogCiBzdGF0aWMgYm9vbCBzbGljX21hY19maWx0ZXIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCkBAIC04MTAsMTMgKzc3OCwxMSBAQAogewogCXN0cnVjdCBzbGljY2FyZCAqY2FyZCA9IChzdHJ1Y3Qgc2xpY2NhcmQgKiljYXJkYWRkcjsKIAlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGNhcmQtPm1hc3RlcjsKLQl1MzIgX19pb21lbSAqaW50YWdnOwogCXUzMiBsb2FkID0gY2FyZC0+ZXZlbnRzOwogCXUzMiBsZXZlbCA9IDA7CiAKIAlpZiAoKGFkYXB0ZXIpICYmIChhZGFwdGVyLT5zdGF0ZSA9PSBBREFQVF9VUCkgJiYKIAkgICAgKGNhcmQtPnN0YXRlID09IENBUkRfVVApICYmIChzbGljX2dsb2JhbC5keW5hbWljX2ludGFnZykpIHsKLQkJaW50YWdnID0gJmFkYXB0ZXItPnNsaWNfcmVncy0+c2xpY19pbnRhZ2c7CiAJCWlmIChhZGFwdGVyLT5kZXZpZCA9PSBTTElDXzFHQl9ERVZJQ0VfSUQpIHsKIAkJCWlmIChhZGFwdGVyLT5saW5rc3BlZWQgPT0gTElOS18xMDAwTUIpCiAJCQkJbGV2ZWwgPSAxMDA7CkBAIC04MzYsNyArODAyLDcgQEAKIAkJCX0KIAkJCWlmIChjYXJkLT5sb2FkbGV2ZWxfY3VycmVudCAhPSBsZXZlbCkgewogCQkJCWNhcmQtPmxvYWRsZXZlbF9jdXJyZW50ID0gbGV2ZWw7Ci0JCQkJc2xpY19yZWczMl93cml0ZShpbnRhZ2csIGxldmVsLCBGTFVTSCk7CisJCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX0lOVEFHRywgbGV2ZWwpOwogCQkJfQogCQl9IGVsc2UgewogCQkJaWYgKGxvYWQgPiBTTElDX0xPQURfNSkKQEAgLTg1Myw3ICs4MTksNyBAQAogCQkJCWxldmVsID0gU0xJQ19JTlRBR0dfMDsKIAkJCWlmIChjYXJkLT5sb2FkbGV2ZWxfY3VycmVudCAhPSBsZXZlbCkgewogCQkJCWNhcmQtPmxvYWRsZXZlbF9jdXJyZW50ID0gbGV2ZWw7Ci0JCQkJc2xpY19yZWczMl93cml0ZShpbnRhZ2csIGxldmVsLCBGTFVTSCk7CisJCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX0lOVEFHRywgbGV2ZWwpOwogCQkJfQogCQl9CiAJfQpAQCAtODk3LDcgKzg2Myw2IEBACiBzdGF0aWMgdm9pZCBzbGljX3Vwcl9zdGFydChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKIHsKIAlzdHJ1Y3Qgc2xpY191cHIgKnVwcjsKLQlfX2lvbWVtIHN0cnVjdCBzbGljX3JlZ3MgKnNsaWNfcmVncyA9IGFkYXB0ZXItPnNsaWNfcmVnczsKIAogCXVwciA9IGFkYXB0ZXItPnVwcl9saXN0OwogCWlmICghdXByKQpAQCAtOTA5LDMxICs4NzQsMjcgQEAKIAlzd2l0Y2ggKHVwci0+dXByX3JlcXVlc3QpIHsKIAljYXNlIFNMSUNfVVBSX1NUQVRTOgogCQlpZiAodXByLT51cHJfZGF0YV9oID09IDApIHsKLQkJCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19zdGF0cywgdXByLT51cHJfZGF0YSwKLQkJCQkJIEZMVVNIKTsKKwkJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19SU1RBVCwgdXByLT51cHJfZGF0YSk7CiAJCX0gZWxzZSB7Ci0JCQlzbGljX3JlZzY0X3dyaXRlKGFkYXB0ZXIsICZzbGljX3JlZ3MtPnNsaWNfc3RhdHM2NCwKLQkJCQkJIHVwci0+dXByX2RhdGEsCi0JCQkJCSAmc2xpY19yZWdzLT5zbGljX2FkZHJfdXBwZXIsCi0JCQkJCSB1cHItPnVwcl9kYXRhX2gsIEZMVVNIKTsKKwkJCXNsaWNfd3JpdGU2NChhZGFwdGVyLCBTTElDX1JFR19SU1RBVDY0LCB1cHItPnVwcl9kYXRhLAorCQkJCSAgICAgdXByLT51cHJfZGF0YV9oKTsKIAkJfQogCQlicmVhazsKIAogCWNhc2UgU0xJQ19VUFJfUkxTUjoKLQkJc2xpY19yZWc2NF93cml0ZShhZGFwdGVyLCAmc2xpY19yZWdzLT5zbGljX3Jsc3IsIHVwci0+dXByX2RhdGEsCi0JCQkJICZzbGljX3JlZ3MtPnNsaWNfYWRkcl91cHBlciwgdXByLT51cHJfZGF0YV9oLAotCQkJCSBGTFVTSCk7CisJCXNsaWNfd3JpdGU2NChhZGFwdGVyLCBTTElDX1JFR19MU1RBVCwgdXByLT51cHJfZGF0YSwKKwkJCSAgICAgdXByLT51cHJfZGF0YV9oKTsKIAkJYnJlYWs7CiAKIAljYXNlIFNMSUNfVVBSX1JDT05GSUc6Ci0JCXNsaWNfcmVnNjRfd3JpdGUoYWRhcHRlciwgJnNsaWNfcmVncy0+c2xpY19yY29uZmlnLAotCQkJCSB1cHItPnVwcl9kYXRhLCAmc2xpY19yZWdzLT5zbGljX2FkZHJfdXBwZXIsCi0JCQkJIHVwci0+dXByX2RhdGFfaCwgRkxVU0gpOworCQlzbGljX3dyaXRlNjQoYWRhcHRlciwgU0xJQ19SRUdfUkNPTkZJRywgdXByLT51cHJfZGF0YSwKKwkJCSAgICAgdXByLT51cHJfZGF0YV9oKTsKIAkJYnJlYWs7CiAJY2FzZSBTTElDX1VQUl9QSU5HOgotCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfcGluZywgMSwgRkxVU0gpOworCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfUElORywgMSk7CiAJCWJyZWFrOwogCX0KKwlzbGljX2ZsdXNoX3dyaXRlKGFkYXB0ZXIpOwogfQogCiBzdGF0aWMgaW50IHNsaWNfdXByX3JlcXVlc3Qoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCkBAIC05NjEsNDIgKzkyMiwzNCBAQAogCiBzdGF0aWMgdm9pZCBzbGljX2xpbmtfdXByX2NvbXBsZXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgaXNyKQogewotCXUzMiBsaW5rc3RhdHVzID0gYWRhcHRlci0+cHNobWVtLT5saW5rc3RhdHVzOworCXN0cnVjdCBzbGljX3NobWVtb3J5ICpzbSA9ICZhZGFwdGVyLT5zaG1lbTsKKwlzdHJ1Y3Qgc2xpY19zaG1lbV9kYXRhICpzbV9kYXRhID0gc20tPnNobWVtX2RhdGE7CisJdTMyIGxzdCA9IHNtX2RhdGEtPmxua3N0YXR1czsKIAl1aW50IGxpbmt1cDsKIAl1bnNpZ25lZCBjaGFyIGxpbmtzcGVlZDsKIAl1bnNpZ25lZCBjaGFyIGxpbmtkdXBsZXg7CiAKIAlpZiAoKGlzciAmIElTUl9VUENFUlIpIHx8IChpc3IgJiBJU1JfVVBDQlNZKSkgewotCQlzdHJ1Y3Qgc2xpY19zaG1lbSAqcHNobWVtOworCQlkbWFfYWRkcl90IHBoYWRkciA9IHNtLT5sbmtzdGF0dXNfcGhhZGRyOwogCi0JCXBzaG1lbSA9IChzdHJ1Y3Qgc2xpY19zaG1lbSAqKSh1bnNpZ25lZCBsb25nKQotCQkJIGFkYXB0ZXItPnBoeXNfc2htZW07Ci0jaWYgQklUU19QRVJfTE9ORyA9PSA2NAotCQlzbGljX3Vwcl9xdWV1ZV9yZXF1ZXN0KGFkYXB0ZXIsCi0JCQkJICAgICAgIFNMSUNfVVBSX1JMU1IsCi0JCQkJICAgICAgIFNMSUNfR0VUX0FERFJfTE9XKCZwc2htZW0tPmxpbmtzdGF0dXMpLAotCQkJCSAgICAgICBTTElDX0dFVF9BRERSX0hJR0goJnBzaG1lbS0+bGlua3N0YXR1cyksCisJCXNsaWNfdXByX3F1ZXVlX3JlcXVlc3QoYWRhcHRlciwgU0xJQ19VUFJfUkxTUiwKKwkJCQkgICAgICAgY3B1X3RvX2xlMzIobG93ZXJfMzJfYml0cyhwaGFkZHIpKSwKKwkJCQkgICAgICAgY3B1X3RvX2xlMzIodXBwZXJfMzJfYml0cyhwaGFkZHIpKSwKIAkJCQkgICAgICAgMCwgMCk7Ci0jZWxzZQotCQlzbGljX3Vwcl9xdWV1ZV9yZXF1ZXN0KGFkYXB0ZXIsCi0JCQkJICAgICAgIFNMSUNfVVBSX1JMU1IsCi0JCQkJICAgICAgICh1MzIpJnBzaG1lbS0+bGlua3N0YXR1cywKLQkJCQkgICAgICAgU0xJQ19HRVRfQUREUl9ISUdIKHBzaG1lbSksIDAsIDApOwotI2VuZGlmCiAJCXJldHVybjsKIAl9CiAJaWYgKGFkYXB0ZXItPnN0YXRlICE9IEFEQVBUX1VQKQogCQlyZXR1cm47CiAKLQlsaW5rdXAgPSBsaW5rc3RhdHVzICYgR0lHX0xJTktVUCA/IExJTktfVVAgOiBMSU5LX0RPV047Ci0JaWYgKGxpbmtzdGF0dXMgJiBHSUdfU1BFRURfMTAwMCkKKwlsaW5rdXAgPSBsc3QgJiBHSUdfTElOS1VQID8gTElOS19VUCA6IExJTktfRE9XTjsKKwlpZiAobHN0ICYgR0lHX1NQRUVEXzEwMDApCiAJCWxpbmtzcGVlZCA9IExJTktfMTAwME1COwotCWVsc2UgaWYgKGxpbmtzdGF0dXMgJiBHSUdfU1BFRURfMTAwKQorCWVsc2UgaWYgKGxzdCAmIEdJR19TUEVFRF8xMDApCiAJCWxpbmtzcGVlZCA9IExJTktfMTAwTUI7CiAJZWxzZQogCQlsaW5rc3BlZWQgPSBMSU5LXzEwTUI7CiAKLQlpZiAobGlua3N0YXR1cyAmIEdJR19GVUxMRFVQTEVYKQorCWlmIChsc3QgJiBHSUdfRlVMTERVUExFWCkKIAkJbGlua2R1cGxleCA9IExJTktfRlVMTEQ7CiAJZWxzZQogCQlsaW5rZHVwbGV4ID0gTElOS19IQUxGRDsKQEAgLTEwMTYsNiArOTY5LDcgQEAKIAkvKiBsaW5rIGhhcyBnb25lIGZyb20gdXAgdG8gZG93biAqLwogCWlmIChsaW5rdXAgPT0gTElOS19ET1dOKSB7CiAJCWFkYXB0ZXItPmxpbmtzdGF0ZSA9IExJTktfRE9XTjsKKwkJbmV0aWZfY2Fycmllcl9vZmYoYWRhcHRlci0+bmV0ZGV2KTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTAyNyw3ICs5ODEsNyBAQAogCQkvKiBzZXR1cCB0aGUgbWFjICovCiAJCXNsaWNfY29uZmlnX3NldChhZGFwdGVyLCB0cnVlKTsKIAkJYWRhcHRlci0+bGlua3N0YXRlID0gTElOS19VUDsKLQkJbmV0aWZfc3RhcnRfcXVldWUoYWRhcHRlci0+bmV0ZGV2KTsKKwkJbmV0aWZfY2Fycmllcl9vbihhZGFwdGVyLT5uZXRkZXYpOwogCX0KIH0KIApAQCAtMTA0Nyw4MSArMTAwMSw2NSBAQAogCXVwci0+bmV4dCA9IE5VTEw7CiAJYWRhcHRlci0+dXByX2J1c3kgPSAwOwogCXN3aXRjaCAodXByLT51cHJfcmVxdWVzdCkgewotCWNhc2UgU0xJQ19VUFJfU1RBVFM6Ci0JCXsKLQkJCXN0cnVjdCBzbGljX3N0YXRzICpzbGljc3RhdHMgPQotCQkJICAgIChzdHJ1Y3Qgc2xpY19zdGF0cyAqKSZhZGFwdGVyLT5wc2htZW0tPmluaWNzdGF0czsKLQkJCXN0cnVjdCBzbGljX3N0YXRzICpuZXdzdGF0cyA9IHNsaWNzdGF0czsKLQkJCXN0cnVjdCBzbGljX3N0YXRzICAqb2xkID0gJmFkYXB0ZXItPmluaWNzdGF0c19wcmV2OwotCQkJc3RydWN0IHNsaWNuZXRfc3RhdHMgKnN0c3QgPSAmYWRhcHRlci0+c2xpY19zdGF0czsKKwljYXNlIFNMSUNfVVBSX1NUQVRTOiB7CisJCXN0cnVjdCBzbGljX3NobWVtb3J5ICpzbSA9ICZhZGFwdGVyLT5zaG1lbTsKKwkJc3RydWN0IHNsaWNfc2htZW1fZGF0YSAqc21fZGF0YSA9IHNtLT5zaG1lbV9kYXRhOworCQlzdHJ1Y3Qgc2xpY19zdGF0cyAqc3RhdHMgPSAmc21fZGF0YS0+c3RhdHM7CisJCXN0cnVjdCBzbGljX3N0YXRzICpvbGQgPSAmYWRhcHRlci0+aW5pY3N0YXRzX3ByZXY7CisJCXN0cnVjdCBzbGljbmV0X3N0YXRzICpzdHN0ID0gJmFkYXB0ZXItPnNsaWNfc3RhdHM7CiAKLQkJCWlmIChpc3IgJiBJU1JfVVBDRVJSKSB7Ci0JCQkJZGV2X2VycigmYWRhcHRlci0+bmV0ZGV2LT5kZXYsCi0JCQkJCSJTTElDX1VQUl9TVEFUUyBjb21tYW5kIGZhaWxlZCBpc3JbJXhdXG4iLAotCQkJCQlpc3IpOwotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlVUERBVEVfU1RBVFNfR0Ioc3RzdC0+dGNwLnhtaXRfdGNwX3NlZ3MsCi0JCQkJCW5ld3N0YXRzLT54bWl0X3RjcF9zZWdzX2diLAotCQkJCQlvbGQtPnhtaXRfdGNwX3NlZ3NfZ2IpOwotCi0JCQlVUERBVEVfU1RBVFNfR0Ioc3RzdC0+dGNwLnhtaXRfdGNwX2J5dGVzLAotCQkJCQluZXdzdGF0cy0+eG1pdF90Y3BfYnl0ZXNfZ2IsCi0JCQkJCW9sZC0+eG1pdF90Y3BfYnl0ZXNfZ2IpOwotCi0JCQlVUERBVEVfU1RBVFNfR0Ioc3RzdC0+dGNwLnJjdl90Y3Bfc2VncywKLQkJCQkJbmV3c3RhdHMtPnJjdl90Y3Bfc2Vnc19nYiwKLQkJCQkJb2xkLT5yY3ZfdGNwX3NlZ3NfZ2IpOwotCi0JCQlVUERBVEVfU1RBVFNfR0Ioc3RzdC0+dGNwLnJjdl90Y3BfYnl0ZXMsCi0JCQkJCW5ld3N0YXRzLT5yY3ZfdGNwX2J5dGVzX2diLAotCQkJCQlvbGQtPnJjdl90Y3BfYnl0ZXNfZ2IpOwotCi0JCQlVUERBVEVfU1RBVFNfR0Ioc3RzdC0+aWZhY2UueG10X2J5dGVzLAotCQkJCQluZXdzdGF0cy0+eG1pdF9ieXRlc19nYiwKLQkJCQkJb2xkLT54bWl0X2J5dGVzX2diKTsKLQotCQkJVVBEQVRFX1NUQVRTX0dCKHN0c3QtPmlmYWNlLnhtdF91Y2FzdCwKLQkJCQkJbmV3c3RhdHMtPnhtaXRfdW5pY2FzdHNfZ2IsCi0JCQkJCW9sZC0+eG1pdF91bmljYXN0c19nYik7Ci0KLQkJCVVQREFURV9TVEFUU19HQihzdHN0LT5pZmFjZS5yY3ZfYnl0ZXMsCi0JCQkJCW5ld3N0YXRzLT5yY3ZfYnl0ZXNfZ2IsCi0JCQkJCW9sZC0+cmN2X2J5dGVzX2diKTsKLQotCQkJVVBEQVRFX1NUQVRTX0dCKHN0c3QtPmlmYWNlLnJjdl91Y2FzdCwKLQkJCQkJbmV3c3RhdHMtPnJjdl91bmljYXN0c19nYiwKLQkJCQkJb2xkLT5yY3ZfdW5pY2FzdHNfZ2IpOwotCi0JCQlVUERBVEVfU1RBVFNfR0Ioc3RzdC0+aWZhY2UueG10X2Vycm9ycywKLQkJCQkJbmV3c3RhdHMtPnhtaXRfY29sbGlzaW9uc19nYiwKLQkJCQkJb2xkLT54bWl0X2NvbGxpc2lvbnNfZ2IpOwotCi0JCQlVUERBVEVfU1RBVFNfR0Ioc3RzdC0+aWZhY2UueG10X2Vycm9ycywKLQkJCQkJbmV3c3RhdHMtPnhtaXRfZXhjZXNzX2NvbGxpc2lvbnNfZ2IsCi0JCQkJCW9sZC0+eG1pdF9leGNlc3NfY29sbGlzaW9uc19nYik7Ci0KLQkJCVVQREFURV9TVEFUU19HQihzdHN0LT5pZmFjZS54bXRfZXJyb3JzLAotCQkJCQluZXdzdGF0cy0+eG1pdF9vdGhlcl9lcnJvcl9nYiwKLQkJCQkJb2xkLT54bWl0X290aGVyX2Vycm9yX2diKTsKLQotCQkJVVBEQVRFX1NUQVRTX0dCKHN0c3QtPmlmYWNlLnJjdl9lcnJvcnMsCi0JCQkJCW5ld3N0YXRzLT5yY3Zfb3RoZXJfZXJyb3JfZ2IsCi0JCQkJCW9sZC0+cmN2X290aGVyX2Vycm9yX2diKTsKLQotCQkJVVBEQVRFX1NUQVRTX0dCKHN0c3QtPmlmYWNlLnJjdl9kaXNjYXJkcywKLQkJCQkJbmV3c3RhdHMtPnJjdl9kcm9wc19nYiwKLQkJCQkJb2xkLT5yY3ZfZHJvcHNfZ2IpOwotCi0JCQlpZiAobmV3c3RhdHMtPnJjdl9kcm9wc19nYiA+IG9sZC0+cmN2X2Ryb3BzX2diKSB7Ci0JCQkJYWRhcHRlci0+cmN2X2Ryb3BzICs9Ci0JCQkJICAgIChuZXdzdGF0cy0+cmN2X2Ryb3BzX2diIC0KLQkJCQkgICAgIG9sZC0+cmN2X2Ryb3BzX2diKTsKLQkJCX0KLQkJCW1lbWNweShvbGQsIG5ld3N0YXRzLCBzaXplb2Yoc3RydWN0IHNsaWNfc3RhdHMpKTsKKwkJaWYgKGlzciAmIElTUl9VUENFUlIpIHsKKwkJCWRldl9lcnIoJmFkYXB0ZXItPm5ldGRldi0+ZGV2LAorCQkJCSJTTElDX1VQUl9TVEFUUyBjb21tYW5kIGZhaWxlZCBpc3JbJXhdXG4iLCBpc3IpOwogCQkJYnJlYWs7CiAJCX0KKworCQlVUERBVEVfU1RBVFNfR0Ioc3RzdC0+dGNwLnhtaXRfdGNwX3NlZ3MsIHN0YXRzLT54bWl0X3RjcF9zZWdzLAorCQkJCW9sZC0+eG1pdF90Y3Bfc2Vncyk7CisKKwkJVVBEQVRFX1NUQVRTX0dCKHN0c3QtPnRjcC54bWl0X3RjcF9ieXRlcywgc3RhdHMtPnhtaXRfdGNwX2J5dGVzLAorCQkJCW9sZC0+eG1pdF90Y3BfYnl0ZXMpOworCisJCVVQREFURV9TVEFUU19HQihzdHN0LT50Y3AucmN2X3RjcF9zZWdzLCBzdGF0cy0+cmN2X3RjcF9zZWdzLAorCQkJCW9sZC0+cmN2X3RjcF9zZWdzKTsKKworCQlVUERBVEVfU1RBVFNfR0Ioc3RzdC0+dGNwLnJjdl90Y3BfYnl0ZXMsIHN0YXRzLT5yY3ZfdGNwX2J5dGVzLAorCQkJCW9sZC0+cmN2X3RjcF9ieXRlcyk7CisKKwkJVVBEQVRFX1NUQVRTX0dCKHN0c3QtPmlmYWNlLnhtdF9ieXRlcywgc3RhdHMtPnhtaXRfYnl0ZXMsCisJCQkJb2xkLT54bWl0X2J5dGVzKTsKKworCQlVUERBVEVfU1RBVFNfR0Ioc3RzdC0+aWZhY2UueG10X3VjYXN0LCBzdGF0cy0+eG1pdF91bmljYXN0cywKKwkJCQlvbGQtPnhtaXRfdW5pY2FzdHMpOworCisJCVVQREFURV9TVEFUU19HQihzdHN0LT5pZmFjZS5yY3ZfYnl0ZXMsIHN0YXRzLT5yY3ZfYnl0ZXMsCisJCQkJb2xkLT5yY3ZfYnl0ZXMpOworCisJCVVQREFURV9TVEFUU19HQihzdHN0LT5pZmFjZS5yY3ZfdWNhc3QsIHN0YXRzLT5yY3ZfdW5pY2FzdHMsCisJCQkJb2xkLT5yY3ZfdW5pY2FzdHMpOworCisJCVVQREFURV9TVEFUU19HQihzdHN0LT5pZmFjZS54bXRfZXJyb3JzLCBzdGF0cy0+eG1pdF9jb2xsaXNpb25zLAorCQkJCW9sZC0+eG1pdF9jb2xsaXNpb25zKTsKKworCQlVUERBVEVfU1RBVFNfR0Ioc3RzdC0+aWZhY2UueG10X2Vycm9ycywKKwkJCQlzdGF0cy0+eG1pdF9leGNlc3NfY29sbGlzaW9ucywKKwkJCQlvbGQtPnhtaXRfZXhjZXNzX2NvbGxpc2lvbnMpOworCisJCVVQREFURV9TVEFUU19HQihzdHN0LT5pZmFjZS54bXRfZXJyb3JzLCBzdGF0cy0+eG1pdF9vdGhlcl9lcnJvciwKKwkJCQlvbGQtPnhtaXRfb3RoZXJfZXJyb3IpOworCisJCVVQREFURV9TVEFUU19HQihzdHN0LT5pZmFjZS5yY3ZfZXJyb3JzLCBzdGF0cy0+cmN2X290aGVyX2Vycm9yLAorCQkJCW9sZC0+cmN2X290aGVyX2Vycm9yKTsKKworCQlVUERBVEVfU1RBVFNfR0Ioc3RzdC0+aWZhY2UucmN2X2Rpc2NhcmRzLCBzdGF0cy0+cmN2X2Ryb3BzLAorCQkJCW9sZC0+cmN2X2Ryb3BzKTsKKworCQlpZiAoc3RhdHMtPnJjdl9kcm9wcyA+IG9sZC0+cmN2X2Ryb3BzKQorCQkJYWRhcHRlci0+cmN2X2Ryb3BzICs9IChzdGF0cy0+cmN2X2Ryb3BzIC0KKwkJCQkJICAgICAgIG9sZC0+cmN2X2Ryb3BzKTsKKwkJbWVtY3B5X2Zyb21pbyhvbGQsIHN0YXRzLCBzaXplb2YoKnN0YXRzKSk7CisJCWJyZWFrOworCX0KIAljYXNlIFNMSUNfVVBSX1JMU1I6CiAJCXNsaWNfbGlua191cHJfY29tcGxldGUoYWRhcHRlciwgaXNyKTsKIAkJYnJlYWs7CkBAIC0xMTg2LDcgKzExMjQsNiBAQAogewogCWludCBpOwogCXN0cnVjdCBzbGljX3JzcHF1ZXVlICpyc3BxID0gJmFkYXB0ZXItPnJzcHF1ZXVlOwotCV9faW9tZW0gc3RydWN0IHNsaWNfcmVncyAqc2xpY19yZWdzID0gYWRhcHRlci0+c2xpY19yZWdzOwogCXUzMiBwYWRkcmggPSAwOwogCiAJbWVtc2V0KHJzcHEsIDAsIHNpemVvZihzdHJ1Y3Qgc2xpY19yc3BxdWV1ZSkpOwpAQCAtMTIwNSwxNCArMTE0MiwxMiBAQAogCQl9CiAKIAkJaWYgKHBhZGRyaCA9PSAwKSB7Ci0JCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfcmJhciwKLQkJCQkocnNwcS0+cGFkZHJbaV0gfCBTTElDX1JTUFFfQlVGU0lOUEFHRSksCi0JCQkJRE9OVF9GTFVTSCk7CisJCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfUkJBUiwKKwkJCQkgICAgIHJzcHEtPnBhZGRyW2ldIHwgU0xJQ19SU1BRX0JVRlNJTlBBR0UpOwogCQl9IGVsc2UgewotCQkJc2xpY19yZWc2NF93cml0ZShhZGFwdGVyLCAmc2xpY19yZWdzLT5zbGljX3JiYXI2NCwKLQkJCQkocnNwcS0+cGFkZHJbaV0gfCBTTElDX1JTUFFfQlVGU0lOUEFHRSksCi0JCQkJJnNsaWNfcmVncy0+c2xpY19hZGRyX3VwcGVyLAotCQkJCXBhZGRyaCwgRE9OVF9GTFVTSCk7CisJCQlzbGljX3dyaXRlNjQoYWRhcHRlciwgU0xJQ19SRUdfUkJBUjY0LAorCQkJCSAgICAgcnNwcS0+cGFkZHJbaV0gfCBTTElDX1JTUFFfQlVGU0lOUEFHRSwKKwkJCQkgICAgIHBhZGRyaCk7CiAJCX0KIAl9CiAJcnNwcS0+b2Zmc2V0ID0gMDsKQEAgLTEyMzMsOSArMTE2OCw5IEBACiAJaWYgKCsrcnNwcS0+b2Zmc2V0IDwgU0xJQ19SU1BRX0JVRlNJTlBBR0UpIHsKIAkJcnNwcS0+cnNwYnVmKys7CiAJfSBlbHNlIHsKLQkJc2xpY19yZWc2NF93cml0ZShhZGFwdGVyLCAmYWRhcHRlci0+c2xpY19yZWdzLT5zbGljX3JiYXI2NCwKLQkJCShyc3BxLT5wYWRkcltyc3BxLT5wYWdlaW5kZXhdIHwgU0xJQ19SU1BRX0JVRlNJTlBBR0UpLAotCQkJJmFkYXB0ZXItPnNsaWNfcmVncy0+c2xpY19hZGRyX3VwcGVyLCAwLCBET05UX0ZMVVNIKTsKKwkJc2xpY193cml0ZTY0KGFkYXB0ZXIsIFNMSUNfUkVHX1JCQVI2NCwKKwkJCSAgICAgcnNwcS0+cGFkZHJbcnNwcS0+cGFnZWluZGV4XSB8CisJCQkgICAgIFNMSUNfUlNQUV9CVUZTSU5QQUdFLCAwKTsKIAkJcnNwcS0+cGFnZWluZGV4ID0gKHJzcHEtPnBhZ2VpbmRleCArIDEpICUgcnNwcS0+bnVtX3BhZ2VzOwogCQlyc3BxLT5vZmZzZXQgPSAwOwogCQlyc3BxLT5yc3BidWYgPSAoc3RydWN0IHNsaWNfcnNwYnVmICopCkBAIC0xNTY5LDE0ICsxNTA0LDExIEBACiAJCQl9CiAjZW5kaWYKIAkJCWlmIChwYWRkcmggPT0gMCkgewotCQkJCXNsaWNfcmVnMzJfd3JpdGUoJmFkYXB0ZXItPnNsaWNfcmVncy0+c2xpY19oYmFyLAotCQkJCQkJICh1MzIpcGFkZHJsLCBET05UX0ZMVVNIKTsKKwkJCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfSEJBUiwKKwkJCQkJICAgICAodTMyKXBhZGRybCk7CiAJCQl9IGVsc2UgewotCQkJCXNsaWNfcmVnNjRfd3JpdGUoYWRhcHRlciwKLQkJCQkJJmFkYXB0ZXItPnNsaWNfcmVncy0+c2xpY19oYmFyNjQsCi0JCQkJCXBhZGRybCwKLQkJCQkJJmFkYXB0ZXItPnNsaWNfcmVncy0+c2xpY19hZGRyX3VwcGVyLAotCQkJCQlwYWRkcmgsIERPTlRfRkxVU0gpOworCQkJCXNsaWNfd3JpdGU2NChhZGFwdGVyLCBTTElDX1JFR19IQkFSNjQsIHBhZGRybCwKKwkJCQkJICAgICBwYWRkcmgpOwogCQkJfQogCQkJaWYgKHJjdnEtPmhlYWQpCiAJCQkJcmN2cS0+dGFpbC0+bmV4dCA9IHNrYjsKQEAgLTE2OTgsMTQgKzE2MzAsMTAgQEAKIAkJZGV2X2VycihkZXYsICIgICAgICAgICByY3ZxLT50YWlsWyVwXVxuIiwgcmN2cS0+dGFpbCk7CiAJCWRldl9lcnIoZGV2LCAiICAgICAgICAgcmN2cS0+Y291bnRbJXhdXG4iLCByY3ZxLT5jb3VudCk7CiAJfQotCWlmIChwYWRkcmggPT0gMCkgewotCQlzbGljX3JlZzMyX3dyaXRlKCZhZGFwdGVyLT5zbGljX3JlZ3MtPnNsaWNfaGJhciwgKHUzMilwYWRkcmwsCi0JCQkJIERPTlRfRkxVU0gpOwotCX0gZWxzZSB7Ci0JCXNsaWNfcmVnNjRfd3JpdGUoYWRhcHRlciwgJmFkYXB0ZXItPnNsaWNfcmVncy0+c2xpY19oYmFyNjQsCi0JCQkJIHBhZGRybCwgJmFkYXB0ZXItPnNsaWNfcmVncy0+c2xpY19hZGRyX3VwcGVyLAotCQkJCSBwYWRkcmgsIERPTlRfRkxVU0gpOwotCX0KKwlpZiAocGFkZHJoID09IDApCisJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19IQkFSLCAodTMyKXBhZGRybCk7CisJZWxzZQorCQlzbGljX3dyaXRlNjQoYWRhcHRlciwgU0xJQ19SRUdfSEJBUjY0LCBwYWRkcmwsIHBhZGRyaCk7CiAJaWYgKHJjdnEtPmhlYWQpCiAJCXJjdnEtPnRhaWwtPm5leHQgPSBza2I7CiAJZWxzZQpAQCAtMTcyOCwyNiArMTY1NiwxNyBAQAogc3RhdGljIGludCBzbGljX2xpbmtfZXZlbnRfaGFuZGxlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKIHsKIAlpbnQgc3RhdHVzOwotCXN0cnVjdCBzbGljX3NobWVtICpwc2htZW07CisJc3RydWN0IHNsaWNfc2htZW1vcnkgKnNtID0gJmFkYXB0ZXItPnNobWVtOworCWRtYV9hZGRyX3QgcGhhZGRyID0gc20tPmxua3N0YXR1c19waGFkZHI7CiAKIAlpZiAoYWRhcHRlci0+c3RhdGUgIT0gQURBUFRfVVApIHsKIAkJLyogQWRhcHRlciBpcyBub3Qgb3BlcmF0aW9uYWwuICBJZ25vcmUuICAqLwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0KLQlwc2htZW0gPSAoc3RydWN0IHNsaWNfc2htZW0gKikodW5zaWduZWQgbG9uZylhZGFwdGVyLT5waHlzX3NobWVtOwotCi0jaWYgQklUU19QRVJfTE9ORyA9PSA2NAotCXN0YXR1cyA9IHNsaWNfdXByX3JlcXVlc3QoYWRhcHRlciwKLQkJCQkgIFNMSUNfVVBSX1JMU1IsCi0JCQkJICBTTElDX0dFVF9BRERSX0xPVygmcHNobWVtLT5saW5rc3RhdHVzKSwKLQkJCQkgIFNMSUNfR0VUX0FERFJfSElHSCgmcHNobWVtLT5saW5rc3RhdHVzKSwKLQkJCQkgIDAsIDApOwotI2Vsc2UKKwkvKiBubyA0R0Igd3JhcCBndWFyYW50ZWVkICovCiAJc3RhdHVzID0gc2xpY191cHJfcmVxdWVzdChhZGFwdGVyLCBTTElDX1VQUl9STFNSLAotCQkodTMyKSZwc2htZW0tPmxpbmtzdGF0dXMsCS8qIG5vIDRHQiB3cmFwIGd1YXJhbnRlZWQgKi8KLQkJCQkgIDAsIDAsIDApOwotI2VuZGlmCisJCQkJICBjcHVfdG9fbGUzMihsb3dlcl8zMl9iaXRzKHBoYWRkcikpLAorCQkJCSAgY3B1X3RvX2xlMzIodXBwZXJfMzJfYml0cyhwaGFkZHIpKSwgMCwgMCk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMTc1NywxMiArMTY3NiwxMyBAQAogCQlhZGFwdGVyLT5pbnRycmVnaXN0ZXJlZCA9IDA7CiAJCWZyZWVfaXJxKGFkYXB0ZXItPm5ldGRldi0+aXJxLCBhZGFwdGVyLT5uZXRkZXYpOwogCX0KLQlpZiAoYWRhcHRlci0+cHNobWVtKSB7Ci0JCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGNpZGV2LAotCQkJCSAgICBzaXplb2Yoc3RydWN0IHNsaWNfc2htZW0pLAotCQkJCSAgICBhZGFwdGVyLT5wc2htZW0sIGFkYXB0ZXItPnBoeXNfc2htZW0pOwotCQlhZGFwdGVyLT5wc2htZW0gPSBOVUxMOwotCQlhZGFwdGVyLT5waHlzX3NobWVtID0gKGRtYV9hZGRyX3QpKHVuc2lnbmVkIGxvbmcpTlVMTDsKKworCWlmIChhZGFwdGVyLT5zaG1lbS5zaG1lbV9kYXRhKSB7CisJCXN0cnVjdCBzbGljX3NobWVtb3J5ICpzbSA9ICZhZGFwdGVyLT5zaG1lbTsKKwkJc3RydWN0IHNsaWNfc2htZW1fZGF0YSAqc21fZGF0YSA9IHNtLT5zaG1lbV9kYXRhOworCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGNpZGV2LCBzaXplb2YoKnNtX2RhdGEpLCBzbV9kYXRhLAorCQkJCSAgICBzbS0+aXNyX3BoYWRkcik7CiAJfQogCiAJaWYgKGFkYXB0ZXItPnBpbmd0aW1lcnNldCkgewpAQCAtMjE0NywxMyArMjA2NywxNiBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CiAJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBzbGljX3NobWVtb3J5ICpzbSA9ICZhZGFwdGVyLT5zaG1lbTsKKwlzdHJ1Y3Qgc2xpY19zaG1lbV9kYXRhICpzbV9kYXRhID0gc20tPnNobWVtX2RhdGE7CiAJdTMyIGlzcjsKIAotCWlmICgoYWRhcHRlci0+cHNobWVtKSAmJiAoYWRhcHRlci0+cHNobWVtLT5pc3IpKSB7Ci0JCXNsaWNfcmVnMzJfd3JpdGUoJmFkYXB0ZXItPnNsaWNfcmVncy0+c2xpY19pY3IsCi0JCQkJIElDUl9JTlRfTUFTSywgRkxVU0gpOwotCQlpc3IgPSBhZGFwdGVyLT5pc3Jjb3B5ID0gYWRhcHRlci0+cHNobWVtLT5pc3I7Ci0JCWFkYXB0ZXItPnBzaG1lbS0+aXNyID0gMDsKKwlpZiAoc21fZGF0YS0+aXNyKSB7CisJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19JQ1IsIElDUl9JTlRfTUFTSyk7CisJCXNsaWNfZmx1c2hfd3JpdGUoYWRhcHRlcik7CisKKwkJaXNyID0gc21fZGF0YS0+aXNyOworCQlzbV9kYXRhLT5pc3IgPSAwOwogCQlhZGFwdGVyLT5udW1faXNycysrOwogCQlzd2l0Y2ggKGFkYXB0ZXItPmNhcmQtPnN0YXRlKSB7CiAJCWNhc2UgQ0FSRF9VUDoKQEAgLTIxNjksMTAgKzIwOTIsOSBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlhZGFwdGVyLT5pc3Jjb3B5ID0gMDsKIAkJYWRhcHRlci0+YWxsX3JlZ193cml0ZXMgKz0gMjsKIAkJYWRhcHRlci0+aXNyX3JlZ193cml0ZXMrKzsKLQkJc2xpY19yZWczMl93cml0ZSgmYWRhcHRlci0+c2xpY19yZWdzLT5zbGljX2lzciwgMCwgRkxVU0gpOworCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfSVNSLCAwKTsKIAl9IGVsc2UgewogCQlhZGFwdGVyLT5mYWxzZV9pbnRlcnJ1cHRzKys7CiAJfQpAQCAtMjIyNCwxMyArMjE0NiwxMSBAQAogCX0KICNlbmRpZgogCWlmIChoY21kLT5wYWRkcmggPT0gMCkgewotCQlzbGljX3JlZzMyX3dyaXRlKCZhZGFwdGVyLT5zbGljX3JlZ3MtPnNsaWNfY2JhciwKLQkJCQkgKGhjbWQtPnBhZGRybCB8IGhjbWQtPmNtZHNpemUpLCBET05UX0ZMVVNIKTsKKwkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX0NCQVIsIChoY21kLT5wYWRkcmwgfAorCQkJCQkJICAgICAgaGNtZC0+Y21kc2l6ZSkpOwogCX0gZWxzZSB7Ci0JCXNsaWNfcmVnNjRfd3JpdGUoYWRhcHRlciwgJmFkYXB0ZXItPnNsaWNfcmVncy0+c2xpY19jYmFyNjQsCi0JCQkJIChoY21kLT5wYWRkcmwgfCBoY21kLT5jbWRzaXplKSwKLQkJCQkgJmFkYXB0ZXItPnNsaWNfcmVncy0+c2xpY19hZGRyX3VwcGVyLAotCQkJCSBoY21kLT5wYWRkcmgsIERPTlRfRkxVU0gpOworCQlzbGljX3dyaXRlNjQoYWRhcHRlciwgU0xJQ19SRUdfQ0JBUjY0LAorCQkJICAgICBoY21kLT5wYWRkcmwgfCBoY21kLT5jbWRzaXplLCBoY21kLT5wYWRkcmgpOwogCX0KIHhtaXRfZG9uZToKIAlyZXR1cm4gTkVUREVWX1RYX09LOwpAQCAtMjI5MCw4ICsyMjEwLDggQEAKIHsKIAlzdHJ1Y3Qgc2xpY2NhcmQgKmNhcmQgPSBhZGFwdGVyLT5jYXJkOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhZGFwdGVyLT5uZXRkZXY7Ci0JX19pb21lbSBzdHJ1Y3Qgc2xpY19yZWdzICpzbGljX3JlZ3MgPSBhZGFwdGVyLT5zbGljX3JlZ3M7Ci0Jc3RydWN0IHNsaWNfc2htZW0gKnBzaG1lbTsKKwlzdHJ1Y3Qgc2xpY19zaG1lbW9yeSAqc20gPSAmYWRhcHRlci0+c2htZW07CisJc3RydWN0IHNsaWNfc2htZW1fZGF0YSAqc21fZGF0YSA9IHNtLT5zaG1lbV9kYXRhOwogCWludCByYzsKIAogCS8qIGFkYXB0ZXIgc2hvdWxkIGJlIGRvd24gYXQgdGhpcyBwb2ludCAqLwpAQCAtMjMzNSwyOCArMjI1NSwyMCBAQAogCQlhZGFwdGVyLT5xdWV1ZXNfaW5pdGlhbGl6ZWQgPSAxOwogCX0KIAotCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19pY3IsIElDUl9JTlRfT0ZGLCBGTFVTSCk7CisJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX0lDUiwgSUNSX0lOVF9PRkYpOworCXNsaWNfZmx1c2hfd3JpdGUoYWRhcHRlcik7CiAJbWRlbGF5KDEpOwogCiAJaWYgKCFhZGFwdGVyLT5pc3BfaW5pdGlhbGl6ZWQpIHsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCQlwc2htZW0gPSAoc3RydWN0IHNsaWNfc2htZW0gKikodW5zaWduZWQgbG9uZykKLQkJCSBhZGFwdGVyLT5waHlzX3NobWVtOwotCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5iaXQ2NHJlZ2xvY2ssIGZsYWdzKTsKLQotI2lmIEJJVFNfUEVSX0xPTkcgPT0gNjQKLQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX2FkZHJfdXBwZXIsCi0JCQkJIFNMSUNfR0VUX0FERFJfSElHSCgmcHNobWVtLT5pc3IpLCBET05UX0ZMVVNIKTsKLQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX2lzcCwKLQkJCQkgU0xJQ19HRVRfQUREUl9MT1coJnBzaG1lbS0+aXNyKSwgRkxVU0gpOwotI2Vsc2UKLQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX2FkZHJfdXBwZXIsIDAsIERPTlRfRkxVU0gpOwotCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfaXNwLCAodTMyKSZwc2htZW0tPmlzciwKLQkJCQlGTFVTSCk7Ci0jZW5kaWYKKwkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX0FERFJfVVBQRVIsCisJCQkgICAgIGNwdV90b19sZTMyKHVwcGVyXzMyX2JpdHMoc20tPmlzcl9waGFkZHIpKSk7CisJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19JU1AsCisJCQkgICAgIGNwdV90b19sZTMyKGxvd2VyXzMyX2JpdHMoc20tPmlzcl9waGFkZHIpKSk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmJpdDY0cmVnbG9jaywgZmxhZ3MpOworCiAJCWFkYXB0ZXItPmlzcF9pbml0aWFsaXplZCA9IDE7CiAJfQogCkBAIC0yMzgzLDE3ICsyMjk1LDIwIEBACiAJLyoKIAkgKiAgICBjbGVhciBhbnkgcGVuZGluZyBldmVudHMsIHRoZW4gZW5hYmxlIGludGVycnVwdHMKIAkgKi8KLQlhZGFwdGVyLT5pc3Jjb3B5ID0gMDsKLQlhZGFwdGVyLT5wc2htZW0tPmlzciA9IDA7Ci0Jc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX2lzciwgMCwgRkxVU0gpOwotCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19pY3IsIElDUl9JTlRfT04sIEZMVVNIKTsKKwlzbV9kYXRhLT5pc3IgPSAwOworCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19JU1IsIDApOworCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19JQ1IsIElDUl9JTlRfT04pOwogCiAJc2xpY19saW5rX2NvbmZpZyhhZGFwdGVyLCBMSU5LX0FVVE9TUEVFRCwgTElOS19BVVRPRCk7CisJc2xpY19mbHVzaF93cml0ZShhZGFwdGVyKTsKKwogCXJjID0gc2xpY19saW5rX2V2ZW50X2hhbmRsZXIoYWRhcHRlcik7CiAJaWYgKHJjKSB7CiAJCS8qIGRpc2FibGUgaW50ZXJydXB0cyB0aGVuIGNsZWFyIHBlbmRpbmcgZXZlbnRzICovCi0JCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19pY3IsIElDUl9JTlRfT0ZGLCBGTFVTSCk7Ci0JCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19pc3IsIDAsIEZMVVNIKTsKKwkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX0lDUiwgSUNSX0lOVF9PRkYpOworCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfSVNSLCAwKTsKKwkJc2xpY19mbHVzaF93cml0ZShhZGFwdGVyKTsKKwogCQlpZiAoYWRhcHRlci0+cGluZ3RpbWVyc2V0KSB7CiAJCQlkZWxfdGltZXIoJmFkYXB0ZXItPnBpbmd0aW1lcik7CiAJCQlhZGFwdGVyLT5waW5ndGltZXJzZXQgPSAwOwpAQCAtMjQxNyw3ICsyMzMyLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBzdGF0dXM7CiAKLQluZXRpZl9zdG9wX3F1ZXVlKGFkYXB0ZXItPm5ldGRldik7CisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZzbGljX2dsb2JhbC5kcml2ZXJfbG9jaywgZmxhZ3MpOwogCWlmICghYWRhcHRlci0+YWN0aXZhdGVkKSB7CkBAIC0yNDQwLDYgKzIzNTUsOSBAQAogCiBzcGluX3VubG9jazoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbGljX2dsb2JhbC5kcml2ZXJfbG9jaywgZmxhZ3MpOworCisJbmV0aWZfc3RhcnRfcXVldWUoYWRhcHRlci0+bmV0ZGV2KTsKKwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTI0NjMsNyArMjM4MSw3IEBACiAJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIAogCXNsaWNfYWRhcHRlcl9mcmVlcmVzb3VyY2VzKGFkYXB0ZXIpOwotCXNsaWNfdW5tYXBfbW1pb19zcGFjZShhZGFwdGVyKTsKKwlpb3VubWFwKGFkYXB0ZXItPnJlZ3MpOwogCiAJLyogZnJlZSBtdWx0aWNhc3QgYWRkcmVzc2VzICovCiAJbWxpc3QgPSBhZGFwdGVyLT5tY2FzdGFkZHJzOwpAQCAtMjQ5Nyw3ICsyNDE1LDYgQEAKIHsKIAlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHNsaWNjYXJkICpjYXJkID0gYWRhcHRlci0+Y2FyZDsKLQlfX2lvbWVtIHN0cnVjdCBzbGljX3JlZ3MgKnNsaWNfcmVncyA9IGFkYXB0ZXItPnNsaWNfcmVnczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnNsaWNfZ2xvYmFsLmRyaXZlcl9sb2NrLCBmbGFncyk7CkBAIC0yNTA3LDcgKzI0MjQsNyBAQAogCWFkYXB0ZXItPnVwcl9saXN0ID0gTlVMTDsKIAlhZGFwdGVyLT51cHJfYnVzeSA9IDA7CiAJYWRhcHRlci0+ZGV2ZmxhZ3NfcHJldiA9IDA7Ci0Jc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX2ljciwgSUNSX0lOVF9PRkYsIEZMVVNIKTsKKwlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfSUNSLCBJQ1JfSU5UX09GRik7CiAJYWRhcHRlci0+YWxsX3JlZ193cml0ZXMrKzsKIAlhZGFwdGVyLT5pY3JfcmVnX3dyaXRlcysrOwogCXNsaWNfY29uZmlnX2NsZWFyKGFkYXB0ZXIpOwpAQCAtMjUxNyw4ICsyNDM0LDEwIEBACiAJCWFkYXB0ZXItPmFjdGl2YXRlZCA9IDA7CiAJfQogI2lmZGVmIEFVVE9NQVRJQ19SRVNFVAotCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19yZXNldF9pZmFjZSwgMCwgRkxVU0gpOworCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19SRVNFVF9JRkFDRSwgMCk7CiAjZW5kaWYKKwlzbGljX2ZsdXNoX3dyaXRlKGFkYXB0ZXIpOworCiAJLyoKIAkgKiAgUmVzZXQgdGhlIGFkYXB0ZXIncyBjbWQgcXVldWVzCiAJICovCkBAIC0yNTMwLDYgKzI0NDksOSBAQAogI2VuZGlmCiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbGljX2dsb2JhbC5kcml2ZXJfbG9jaywgZmxhZ3MpOworCisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwogCXJldHVybiAwOwogfQogCkBAIC0yNjYxLDE0ICsyNTgzLDE0IEBACiAKIHN0YXRpYyBpbnQgc2xpY19jYXJkX2luaXQoc3RydWN0IHNsaWNjYXJkICpjYXJkLCBzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKIHsKLQlfX2lvbWVtIHN0cnVjdCBzbGljX3JlZ3MgKnNsaWNfcmVncyA9IGFkYXB0ZXItPnNsaWNfcmVnczsKKwlzdHJ1Y3Qgc2xpY19zaG1lbW9yeSAqc20gPSAmYWRhcHRlci0+c2htZW07CisJc3RydWN0IHNsaWNfc2htZW1fZGF0YSAqc21fZGF0YSA9IHNtLT5zaG1lbV9kYXRhOwogCXN0cnVjdCBzbGljX2VlcHJvbSAqcGVlcHJvbTsKIAlzdHJ1Y3Qgb3NsaWNfZWVwcm9tICpwT2VlcHJvbTsKIAlkbWFfYWRkcl90IHBoeXNfY29uZmlnOwogCXUzMiBwaHlzX2NvbmZpZ2g7CiAJdTMyIHBoeXNfY29uZmlnbDsKIAl1MzIgaSA9IDA7Ci0Jc3RydWN0IHNsaWNfc2htZW0gKnBzaG1lbTsKIAlpbnQgc3RhdHVzOwogCXVpbnQgbWFjYWRkcnMgPSBjYXJkLT5jYXJkX3NpemU7CiAJdXNob3J0IGVlY29kZXNpemU7CkBAIC0yNjk1LDI3ICsyNjE3LDI2IEBACiAJCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHNsaWNfZWVwcm9tKSwKIAkJCQkJICAgICAgICZwaHlzX2NvbmZpZyk7CiAKLQkJcGh5c19jb25maWdsID0gU0xJQ19HRVRfQUREUl9MT1cocGh5c19jb25maWcpOwotCQlwaHlzX2NvbmZpZ2ggPSBTTElDX0dFVF9BRERSX0hJR0gocGh5c19jb25maWcpOwotCiAJCWlmICghcGVlcHJvbSkgewogCQkJZGV2X2VycigmYWRhcHRlci0+cGNpZGV2LT5kZXYsCiAJCQkJIkZhaWxlZCB0byBhbGxvY2F0ZSBETUEgbWVtb3J5IGZvciBFRVBST00uXG4iKTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAKKwkJcGh5c19jb25maWdsID0gU0xJQ19HRVRfQUREUl9MT1cocGh5c19jb25maWcpOworCQlwaHlzX2NvbmZpZ2ggPSBTTElDX0dFVF9BRERSX0hJR0gocGh5c19jb25maWcpOworCiAJCW1lbXNldChwZWVwcm9tLCAwLCBzaXplb2Yoc3RydWN0IHNsaWNfZWVwcm9tKSk7CiAKLQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX2ljciwgSUNSX0lOVF9PRkYsIEZMVVNIKTsKKwkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX0lDUiwgSUNSX0lOVF9PRkYpOworCQlzbGljX2ZsdXNoX3dyaXRlKGFkYXB0ZXIpOwogCQltZGVsYXkoMSk7Ci0JCXBzaG1lbSA9IChzdHJ1Y3Qgc2xpY19zaG1lbSAqKSh1bnNpZ25lZCBsb25nKQotCQkJIGFkYXB0ZXItPnBoeXNfc2htZW07CiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmJpdDY0cmVnbG9jaywgZmxhZ3MpOwotCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfYWRkcl91cHBlciwKLQkJCQkgU0xJQ19HRVRfQUREUl9ISUdIKCZwc2htZW0tPmlzciksIERPTlRfRkxVU0gpOwotCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfaXNwLAotCQkJCSBTTElDX0dFVF9BRERSX0xPVygmcHNobWVtLT5pc3IpLCBGTFVTSCk7CisJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19BRERSX1VQUEVSLAorCQkJICAgICBjcHVfdG9fbGUzMih1cHBlcl8zMl9iaXRzKHNtLT5pc3JfcGhhZGRyKSkpOworCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfSVNQLAorCQkJICAgICBjcHVfdG9fbGUzMihsb3dlcl8zMl9iaXRzKHNtLT5pc3JfcGhhZGRyKSkpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5iaXQ2NHJlZ2xvY2ssIGZsYWdzKTsKIAogCQlzdGF0dXMgPSBzbGljX2NvbmZpZ19nZXQoYWRhcHRlciwgcGh5c19jb25maWdsLCBwaHlzX2NvbmZpZ2gpOwpAQCAtMjcyNiwzMyArMjY0NywzMSBAQAogCQl9CiAKIAkJZm9yICg7OykgewotCQkJaWYgKGFkYXB0ZXItPnBzaG1lbS0+aXNyKSB7Ci0JCQkJaWYgKGFkYXB0ZXItPnBzaG1lbS0+aXNyICYgSVNSX1VQQykgewotCQkJCQlhZGFwdGVyLT5wc2htZW0tPmlzciA9IDA7Ci0JCQkJCXNsaWNfcmVnNjRfd3JpdGUoYWRhcHRlciwKLQkJCQkJCSZzbGljX3JlZ3MtPnNsaWNfaXNwLCAwLAotCQkJCQkJJnNsaWNfcmVncy0+c2xpY19hZGRyX3VwcGVyLAotCQkJCQkJMCwgRkxVU0gpOwotCQkJCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfaXNyLAotCQkJCQkJCSAwLCBGTFVTSCk7CisJCQlpZiAoc21fZGF0YS0+aXNyKSB7CisJCQkJaWYgKHNtX2RhdGEtPmlzciAmIElTUl9VUEMpIHsKKwkJCQkJc21fZGF0YS0+aXNyID0gMDsKKwkJCQkJc2xpY193cml0ZTY0KGFkYXB0ZXIsIFNMSUNfUkVHX0lTUCwgMCwKKwkJCQkJCSAgICAgMCk7CisJCQkJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19JU1IsIDApOworCQkJCQlzbGljX2ZsdXNoX3dyaXRlKGFkYXB0ZXIpOwogCiAJCQkJCXNsaWNfdXByX3JlcXVlc3RfY29tcGxldGUoYWRhcHRlciwgMCk7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAotCQkJCWFkYXB0ZXItPnBzaG1lbS0+aXNyID0gMDsKLQkJCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfaXNyLAotCQkJCQkJIDAsIEZMVVNIKTsKKwkJCQlzbV9kYXRhLT5pc3IgPSAwOworCQkJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19JU1IsIDApOworCQkJCXNsaWNfZmx1c2hfd3JpdGUoYWRhcHRlcik7CiAJCQl9IGVsc2UgewogCQkJCW1kZWxheSgxKTsKIAkJCQlpKys7CiAJCQkJaWYgKGkgPiA1MDAwKSB7CiAJCQkJCWRldl9lcnIoJmFkYXB0ZXItPnBjaWRldi0+ZGV2LAogCQkJCQkJIkZldGNoIG9mIGNvbmZpZyBkYXRhIHRpbWVkIG91dC5cbiIpOwotCQkJCQlzbGljX3JlZzY0X3dyaXRlKGFkYXB0ZXIsCi0JCQkJCQkmc2xpY19yZWdzLT5zbGljX2lzcCwgMCwKLQkJCQkJCSZzbGljX3JlZ3MtPnNsaWNfYWRkcl91cHBlciwKLQkJCQkJCTAsIEZMVVNIKTsKKwkJCQkJc2xpY193cml0ZTY0KGFkYXB0ZXIsIFNMSUNfUkVHX0lTUCwKKwkJCQkJCSAgICAgMCwgMCk7CisJCQkJCXNsaWNfZmx1c2hfd3JpdGUoYWRhcHRlcik7CisKIAkJCQkJc3RhdHVzID0gLUVJTlZBTDsKIAkJCQkJZ290byBjYXJkX2luaXRfZXJyOwogCQkJCX0KQEAgLTI3OTYsNyArMjcxNSw2IEBACiAJCS8qICBzZWUgaWYgdGhlIEVFUFJPTSBpcyB2YWxpZCBieSBjaGVja2luZyBpdCdzIGNoZWNrc3VtICovCiAJCWlmICgoZWVjb2Rlc2l6ZSA8PSBNQVhfRUVDT0RFX1NJWkUpICYmCiAJCSAgICAoZWVjb2Rlc2l6ZSA+PSBNSU5fRUVDT0RFX1NJWkUpKSB7Ci0KIAkJCWVlX2Noa3N1bSA9CiAJCQkgICAgKih1MTYgKikoKGNoYXIgKilwZWVwcm9tICsgKGVlY29kZXNpemUgLSAyKSk7CiAJCQkvKgpAQCAtMjgzMCw5ICsyNzQ4LDggQEAKIAkJCQkgICAgcGVlcHJvbSwgcGh5c19jb25maWcpOwogCiAJCWlmICghY2FyZC0+Y29uZmlnLkVlcHJvbVZhbGlkKSB7Ci0JCQlzbGljX3JlZzY0X3dyaXRlKGFkYXB0ZXIsICZzbGljX3JlZ3MtPnNsaWNfaXNwLCAwLAotCQkJCQkgJnNsaWNfcmVncy0+c2xpY19hZGRyX3VwcGVyLAotCQkJCQkgMCwgRkxVU0gpOworCQkJc2xpY193cml0ZTY0KGFkYXB0ZXIsIFNMSUNfUkVHX0lTUCwgMCwgMCk7CisJCQlzbGljX2ZsdXNoX3dyaXRlKGFkYXB0ZXIpOwogCQkJZGV2X2VycigmYWRhcHRlci0+cGNpZGV2LT5kZXYsICJFRVBST00gaW52YWxpZC5cbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTI4OTYsMTQgKzI4MTMsMTcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHNsaWNfaW5pdF9hZGFwdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkgICAgICBzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LAotCQkJICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV90YmxfZW50cnksCi0JCQkgICAgICB2b2lkIF9faW9tZW0gKm1lbWFkZHIsIGludCBjaGlwX2lkeCkKK3N0YXRpYyBpbnQgc2xpY19pbml0X2FkYXB0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgICAgc3RydWN0IHBjaV9kZXYgKnBjaWRldiwKKwkJCSAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV90YmxfZW50cnksCisJCQkgICAgIHZvaWQgX19pb21lbSAqbWVtYWRkciwgaW50IGNoaXBfaWR4KQogewogCXVzaG9ydCBpbmRleDsKIAlzdHJ1Y3Qgc2xpY19oYW5kbGUgKnBzbGljX2hhbmRsZTsKIAlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IHNsaWNfc2htZW1vcnkgKnNtID0gJmFkYXB0ZXItPnNobWVtOworCXN0cnVjdCBzbGljX3NobWVtX2RhdGEgKnNtX2RhdGE7CisJZG1hX2FkZHJfdCBwaGFkZHI7CiAKIC8qCWFkYXB0ZXItPnBjaWRldiA9IHBjaWRldjsqLwogCWFkYXB0ZXItPnZlbmRpZCA9IHBjaV90YmxfZW50cnktPnZlbmRvcjsKQEAgLTI5MTIsNyArMjgzMiw3IEBACiAJYWRhcHRlci0+YnVzbnVtYmVyID0gcGNpZGV2LT5idXMtPm51bWJlcjsKIAlhZGFwdGVyLT5zbG90bnVtYmVyID0gKChwY2lkZXYtPmRldmZuID4+IDMpICYgMHgxRik7CiAJYWRhcHRlci0+ZnVuY3Rpb25udW1iZXIgPSAocGNpZGV2LT5kZXZmbiAmIDB4Nyk7Ci0JYWRhcHRlci0+c2xpY19yZWdzID0gbWVtYWRkcjsKKwlhZGFwdGVyLT5yZWdzID0gbWVtYWRkcjsKIAlhZGFwdGVyLT5pcnEgPSBwY2lkZXYtPmlycTsKIAlhZGFwdGVyLT5jaGlwaWQgPSBjaGlwX2lkeDsKIAlhZGFwdGVyLT5wb3J0ID0gMDsKQEAgLTI5MzIsMTkgKzI4NTIsMjMgQEAKIAkgKi8KIAlmb3IgKGluZGV4ID0gMSwgcHNsaWNfaGFuZGxlID0gJmFkYXB0ZXItPnNsaWNfaGFuZGxlc1sxXTsKIAkgICAgIGluZGV4IDwgU0xJQ19DTURRX01BWENNRFM7IGluZGV4KyssIHBzbGljX2hhbmRsZSsrKSB7Ci0KIAkJcHNsaWNfaGFuZGxlLT50b2tlbi5oYW5kbGVfaW5kZXggPSBpbmRleDsKIAkJcHNsaWNfaGFuZGxlLT50eXBlID0gU0xJQ19IQU5ETEVfRlJFRTsKIAkJcHNsaWNfaGFuZGxlLT5uZXh0ID0gYWRhcHRlci0+cGZyZWVfc2xpY19oYW5kbGVzOwogCQlhZGFwdGVyLT5wZnJlZV9zbGljX2hhbmRsZXMgPSBwc2xpY19oYW5kbGU7CiAJfQotCWFkYXB0ZXItPnBzaG1lbSA9IChzdHJ1Y3Qgc2xpY19zaG1lbSAqKQotCQkJCQlwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wY2lkZXYsCi0JCQkJCXNpemVvZihzdHJ1Y3Qgc2xpY19zaG1lbSksCi0JCQkJCSZhZGFwdGVyLT4KLQkJCQkJcGh5c19zaG1lbSk7Ci0JaWYgKGFkYXB0ZXItPnBzaG1lbSkKLQkJbWVtc2V0KGFkYXB0ZXItPnBzaG1lbSwgMCwgc2l6ZW9mKHN0cnVjdCBzbGljX3NobWVtKSk7CisJc21fZGF0YSA9IHBjaV96YWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wY2lkZXYsIHNpemVvZigqc21fZGF0YSksCisJCQkJCSZwaGFkZHIpOworCWlmICghc21fZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzbS0+c2htZW1fZGF0YSA9IHNtX2RhdGE7CisJc20tPmlzcl9waGFkZHIgPSBwaGFkZHI7CisJc20tPmxua3N0YXR1c19waGFkZHIgPSBwaGFkZHIgKyBvZmZzZXRvZihzdHJ1Y3Qgc2xpY19zaG1lbV9kYXRhLAorCQkJCQkJIGxua3N0YXR1cyk7CisJc20tPnN0YXRzX3BoYWRkciA9IHBoYWRkciArIG9mZnNldG9mKHN0cnVjdCBzbGljX3NobWVtX2RhdGEsIHN0YXRzKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHNsaWNfbmV0ZGV2X29wcyA9IHsKQEAgLTI5NjQsMjcgKzI4ODgsOSBAQAogCXN0cnVjdCBzbGljY2FyZCAqY2FyZCA9IHNsaWNfZ2xvYmFsLnNsaWNfY2FyZDsKIAlzdHJ1Y3QgcGh5c2NhcmQgKnBoeXNjYXJkID0gc2xpY19nbG9iYWwucGh5c19jYXJkOwogCXVzaG9ydCBjYXJkX2hvc3RpZDsKLQl1MTYgX19pb21lbSAqaG9zdGlkX3JlZzsKIAl1aW50IGk7Ci0JdWludCByZGhvc3RpZF9vZmZzZXQgPSAwOwogCi0Jc3dpdGNoIChhZGFwdGVyLT5kZXZpZCkgewotCWNhc2UgU0xJQ18yR0JfREVWSUNFX0lEOgotCQlyZGhvc3RpZF9vZmZzZXQgPSBTTElDX1JESE9TVElEXzJHQjsKLQkJYnJlYWs7Ci0JY2FzZSBTTElDXzFHQl9ERVZJQ0VfSUQ6Ci0JCXJkaG9zdGlkX29mZnNldCA9IFNMSUNfUkRIT1NUSURfMUdCOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlob3N0aWRfcmVnID0KLQkgICAgKHUxNiBfX2lvbWVtICopKCgodTggX19pb21lbSAqKShhZGFwdGVyLT5zbGljX3JlZ3MpKSArCi0JICAgIHJkaG9zdGlkX29mZnNldCk7Ci0KLQkvKiByZWFkIHRoZSAxNiBiaXQgaG9zdGlkIGZyb20gU1JBTSAqLwotCWNhcmRfaG9zdGlkID0gKHVzaG9ydClyZWFkdyhob3N0aWRfcmVnKTsKKwljYXJkX2hvc3RpZCA9IHNsaWNfcmVhZDMyKGFkYXB0ZXIsIFNMSUNfUkVHX0hPU1RJRCk7CiAKIAkvKiBJbml0aWFsaXplIGEgbmV3IGNhcmQgc3RydWN0dXJlIGlmIG5lZWQgYmUgKi8KIAlpZiAoY2FyZF9ob3N0aWQgPT0gU0xJQ19IT1NUSURfREVGQVVMVCkgewpAQCAtMzEzMCw3ICszMDM2LDcgQEAKIAltbWlvX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMCk7CiAJbW1pb19sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBjaWRldiwgMCk7CiAKLQltZW1tYXBwZWRfaW9hZGRyID0gaW9yZW1hcChtbWlvX3N0YXJ0LCBtbWlvX2xlbik7CisJbWVtbWFwcGVkX2lvYWRkciA9IGlvcmVtYXBfbm9jYWNoZShtbWlvX3N0YXJ0LCBtbWlvX2xlbik7CiAJaWYgKCFtZW1tYXBwZWRfaW9hZGRyKSB7CiAJCWRldl9lcnIoJnBjaWRldi0+ZGV2LCAiY2Fubm90IHJlbWFwIE1NSU8gcmVnaW9uICVseCBAICVseFxuIiwKIAkJCW1taW9fbGVuLCBtbWlvX3N0YXJ0KTsKQEAgLTMxNDIsMTMgKzMwNDgsMTcgQEAKIAogCXNsaWNfaW5pdF9kcml2ZXIoKTsKIAotCXNsaWNfaW5pdF9hZGFwdGVyKG5ldGRldiwKLQkJCSAgcGNpZGV2LCBwY2lfdGJsX2VudHJ5LCBtZW1tYXBwZWRfaW9hZGRyLCBjYXJkc19mb3VuZCk7CisJZXJyID0gc2xpY19pbml0X2FkYXB0ZXIobmV0ZGV2LCBwY2lkZXYsIHBjaV90YmxfZW50cnksIG1lbW1hcHBlZF9pb2FkZHIsCisJCQkJY2FyZHNfZm91bmQpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGNpZGV2LT5kZXYsICJmYWlsZWQgdG8gaW5pdCBhZGFwdGVyOiAlaVxuIiwgZXJyKTsKKwkJZ290byBlcnJfb3V0X3VubWFwOworCX0KIAogCWVyciA9IHNsaWNfY2FyZF9sb2NhdGUoYWRhcHRlcik7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKCZwY2lkZXYtPmRldiwgImNhbm5vdCBsb2NhdGUgY2FyZFxuIik7Ci0JCWdvdG8gZXJyX291dF91bm1hcDsKKwkJZ290byBlcnJfY2xlYW5faW5pdDsKIAl9CiAKIAljYXJkID0gYWRhcHRlci0+Y2FyZDsKQEAgLTMxNjAsNyArMzA3MCw3IEBACiAKIAllcnIgPSBzbGljX2NhcmRfaW5pdChjYXJkLCBhZGFwdGVyKTsKIAlpZiAoZXJyKQotCQlnb3RvIGVycl9vdXRfdW5tYXA7CisJCWdvdG8gZXJyX2NsZWFuX2luaXQ7CiAKIAlzbGljX2FkYXB0ZXJfc2V0X2h3YWRkcihhZGFwdGVyKTsKIApAQCAtMzE2OCwxNyArMzA3OCwyMSBAQAogCW5ldGRldi0+aXJxID0gYWRhcHRlci0+aXJxOwogCW5ldGRldi0+bmV0ZGV2X29wcyA9ICZzbGljX25ldGRldl9vcHM7CiAKKwluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCiAJc3RyY3B5KG5ldGRldi0+bmFtZSwgImV0aCVkIik7CiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKCZwY2lkZXYtPmRldiwgIkNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlLCBhYm9ydGluZy5cbiIpOwotCQlnb3RvIGVycl9vdXRfdW5tYXA7CisJCWdvdG8gZXJyX2NsZWFuX2luaXQ7CiAJfQogCiAJY2FyZHNfZm91bmQrKzsKIAogCXJldHVybiAwOwogCitlcnJfY2xlYW5faW5pdDoKKwlzbGljX2luaXRfY2xlYW51cChhZGFwdGVyKTsKIGVycl9vdXRfdW5tYXA6CiAJaW91bm1hcChtZW1tYXBwZWRfaW9hZGRyKTsKIGVycl9vdXRfZnJlZV9uZXRkZXY6CkBAIC0zMjA5LDcgKzMxMjMsNyBAQAogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc2xpY19kcml2ZXIpOwogfQogCi1zdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHNsaWNfZXRodG9vbF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHNsaWNfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9jb2FsZXNjZSA9IHNsaWNfZ2V0X2NvYWxlc2NlLAogCS5zZXRfY29hbGVzY2UgPSBzbGljX3NldF9jb2FsZXNjZQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9jaGlwLmMgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfY2hpcC5jCmluZGV4IGY4MGVlNzcuLjgzOWQ2NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9jaGlwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2NoaXAuYwpAQCAtNiwxMSArNiw5IEBACiAjaW5jbHVkZSAiZGRrNzUwX2NoaXAuaCIKICNpbmNsdWRlICJkZGs3NTBfcG93ZXIuaCIKIAotLyogbiAvIGQgKyAxIC8gMiA9ICgybiArIGQpIC8gMmQgKi8KLSNkZWZpbmUgcm91bmRlZERpdihudW0sIGRlbm9tKQkoKDIgKiAobnVtKSArIChkZW5vbSkpIC8gKDIgKiAoZGVub20pKSkKICNkZWZpbmUgTUh6KHgpICgoeCkgKiAxMDAwMDAwKQogCi1sb2dpY2FsX2NoaXBfdHlwZV90IGdldENoaXBUeXBlKHZvaWQpCitsb2dpY2FsX2NoaXBfdHlwZV90IHNtNzUwX2dldF9jaGlwX3R5cGUodm9pZCkKIHsKIAl1bnNpZ25lZCBzaG9ydCBwaHlzaWNhbElEOwogCWNoYXIgcGh5c2ljYWxSZXY7CkBAIC0zNyw3ICszNSw3IEBACiAJdW5zaWduZWQgaW50IHBsbF9yZWc7CiAJdW5zaWduZWQgaW50IE0sIE4sIE9ELCBQT0Q7CiAKLQlpZiAoZ2V0Q2hpcFR5cGUoKSA9PSBTTTc1MExFKQorCWlmIChzbTc1MF9nZXRfY2hpcF90eXBlKCkgPT0gU003NTBMRSkKIAkJcmV0dXJuIE1IeigxMzApOwogCiAJcGxsX3JlZyA9IFBFRUszMihNWENMS19QTExfQ1RSTCk7CkBAIC02MCw3ICs1OCw3IEBACiAJdW5zaWduZWQgaW50IHVsQWN0dWFsTXhDbGs7CiAKIAkvKiBDaGVva18wNTA5OiBGb3IgU003NTBMRSwgdGhlIGNoaXAgY2xvY2sgaXMgZml4ZWQuIE5vdGhpbmcgdG8gc2V0LiAqLwotCWlmIChnZXRDaGlwVHlwZSgpID09IFNNNzUwTEUpCisJaWYgKHNtNzUwX2dldF9jaGlwX3R5cGUoKSA9PSBTTTc1MExFKQogCQlyZXR1cm47CiAKIAlpZiAoZnJlcXVlbmN5KSB7CkBAIC03MSw5ICs2OSwxMCBAQAogCQlwbGwuY2xvY2tUeXBlID0gTVhDTEtfUExMOwogCiAJCS8qCi0JCSogQ2FsbCBjYWxjUGxsVmFsdWUoKSB0byBmaWxsIHVwIHRoZSBvdGhlciBmaWVsZHMgZm9yIFBMTCBzdHJ1Y3R1cmUuCi0JCSogU29tZXRpbWUsIHRoZSBjaGlwIGNhbm5vdCBzZXQgdXAgdGhlIGV4YWN0IGNsb2NrIHJlcXVpcmVkIGJ5IFVzZXIuCi0JCSogUmV0dXJuIHZhbHVlIGZyb20gY2FsY1BsbFZhbHVlKCkgZ2l2ZXMgdGhlIGFjdHVhbCBwb3NzaWJsZSBjbG9jay4KKwkJKiBDYWxsIGNhbGNQbGxWYWx1ZSgpIHRvIGZpbGwgdGhlIG90aGVyIGZpZWxkcyBvZiBQTEwgc3RydWN0dXJlLgorCQkqIFNvbWV0aW1lLCB0aGUgY2hpcCBjYW5ub3Qgc2V0IHVwIHRoZSBleGFjdCBjbG9jaworCQkqIHJlcXVpcmVkIGJ5IHRoZSBVc2VyLgorCQkqIFJldHVybiB2YWx1ZSBvZiBjYWxjUGxsVmFsdWUgZ2l2ZXMgdGhlIGFjdHVhbCBwb3NzaWJsZSBjbG9jay4KIAkJKi8KIAkJdWxBY3R1YWxNeENsayA9IGNhbGNQbGxWYWx1ZShmcmVxdWVuY3ksICZwbGwpOwogCkBAIC04NiwxOCArODUsMjIgQEAKIHsKIAl1bnNpZ25lZCBpbnQgcmVnLCBkaXZpc29yOwogCi0JLyogQ2hlb2tfMDUwOTogRm9yIFNNNzUwTEUsIHRoZSBtZW1vcnkgY2xvY2sgaXMgZml4ZWQuIE5vdGhpbmcgdG8gc2V0LiAqLwotCWlmIChnZXRDaGlwVHlwZSgpID09IFNNNzUwTEUpCisJLyogQ2hlb2tfMDUwOTogRm9yIFNNNzUwTEUsIHRoZSBtZW1vcnkgY2xvY2sgaXMgZml4ZWQuCisJICogTm90aGluZyB0byBzZXQuCisJICovCisJaWYgKHNtNzUwX2dldF9jaGlwX3R5cGUoKSA9PSBTTTc1MExFKQogCQlyZXR1cm47CiAKIAlpZiAoZnJlcXVlbmN5KSB7Ci0JCS8qIFNldCB0aGUgZnJlcXVlbmN5IHRvIHRoZSBtYXhpbXVtIGZyZXF1ZW5jeSB0aGF0IHRoZSBERFIgTWVtb3J5IGNhbiB0YWtlCi0JCXdoaWNoIGlzIDMzNk1Iei4gKi8KKwkJLyoKKwkJICogU2V0IHRoZSBmcmVxdWVuY3kgdG8gdGhlIG1heGltdW0gZnJlcXVlbmN5CisJCSAqIHRoYXQgdGhlIEREUiBNZW1vcnkgY2FuIHRha2Ugd2hpY2ggaXMgMzM2TUh6LgorCQkgKi8KIAkJaWYgKGZyZXF1ZW5jeSA+IE1IeigzMzYpKQogCQkJZnJlcXVlbmN5ID0gTUh6KDMzNik7CiAKIAkJLyogQ2FsY3VsYXRlIHRoZSBkaXZpc29yICovCi0JCWRpdmlzb3IgPSByb3VuZGVkRGl2KGdldF9teGNsa19mcmVxKCksIGZyZXF1ZW5jeSk7CisJCWRpdmlzb3IgPSBESVZfUk9VTkRfQ0xPU0VTVChnZXRfbXhjbGtfZnJlcSgpLCBmcmVxdWVuY3kpOwogCiAJCS8qIFNldCB0aGUgY29ycmVzcG9uZGluZyBkaXZpc29yIGluIHRoZSByZWdpc3Rlci4gKi8KIAkJcmVnID0gUEVFSzMyKENVUlJFTlRfR0FURSkgJiB+Q1VSUkVOVF9HQVRFX00yWENMS19NQVNLOwpAQCAtMTMzLDE4ICsxMzYsMjEgQEAKIHsKIAl1bnNpZ25lZCBpbnQgcmVnLCBkaXZpc29yOwogCi0JLyogQ2hlb2tfMDUwOTogRm9yIFNNNzUwTEUsIHRoZSBtZW1vcnkgY2xvY2sgaXMgZml4ZWQuIE5vdGhpbmcgdG8gc2V0LiAqLwotCWlmIChnZXRDaGlwVHlwZSgpID09IFNNNzUwTEUpCisJLyogQ2hlb2tfMDUwOTogRm9yIFNNNzUwTEUsIHRoZSBtZW1vcnkgY2xvY2sgaXMgZml4ZWQuCisJICogTm90aGluZyB0byBzZXQuCisJICovCisJaWYgKHNtNzUwX2dldF9jaGlwX3R5cGUoKSA9PSBTTTc1MExFKQogCQlyZXR1cm47CiAKIAlpZiAoZnJlcXVlbmN5KSB7Ci0JCS8qIFNldCB0aGUgZnJlcXVlbmN5IHRvIHRoZSBtYXhpbXVtIGZyZXF1ZW5jeSB0aGF0IHRoZSBTTTc1MCBlbmdpbmUgY2FuCi0JCXJ1biwgd2hpY2ggaXMgYWJvdXQgMTkwIE1Iei4gKi8KKwkJLyogU2V0IHRoZSBmcmVxdWVuY3kgdG8gdGhlIG1heGltdW0gZnJlcXVlbmN5CisJCSAqIHRoYXQgdGhlIFNNNzUwIGVuZ2luZSBjYW4gcnVuLCB3aGljaCBpcyBhYm91dCAxOTAgTUh6LgorCQkgKi8KIAkJaWYgKGZyZXF1ZW5jeSA+IE1IeigxOTApKQogCQkJZnJlcXVlbmN5ID0gTUh6KDE5MCk7CiAKIAkJLyogQ2FsY3VsYXRlIHRoZSBkaXZpc29yICovCi0JCWRpdmlzb3IgPSByb3VuZGVkRGl2KGdldF9teGNsa19mcmVxKCksIGZyZXF1ZW5jeSk7CisJCWRpdmlzb3IgPSBESVZfUk9VTkRfQ0xPU0VTVChnZXRfbXhjbGtfZnJlcSgpLCBmcmVxdWVuY3kpOwogCiAJCS8qIFNldCB0aGUgY29ycmVzcG9uZGluZyBkaXZpc29yIGluIHRoZSByZWdpc3Rlci4gKi8KIAkJcmVnID0gUEVFSzMyKENVUlJFTlRfR0FURSkgJiB+Q1VSUkVOVF9HQVRFX01DTEtfTUFTSzsKQEAgLTE3NCw3ICsxODAsNyBAQAogCXVuc2lnbmVkIGludCBkYXRhOwogCiAJLyogc203NTBsZSBvbmx5IHVzZSA2NCBtYiBtZW1vcnkqLwotCWlmIChnZXRDaGlwVHlwZSgpID09IFNNNzUwTEUpCisJaWYgKHNtNzUwX2dldF9jaGlwX3R5cGUoKSA9PSBTTTc1MExFKQogCQlyZXR1cm4gU1pfNjRNOwogCiAJLyogZm9yIDc1MCxhbHdheXMgdXNlIHBvd2VyIG1vZGUwKi8KQEAgLTIxMyw3ICsyMTksNyBAQAogCXJlZyB8PSAoQ1VSUkVOVF9HQVRFX0RJU1BMQVkgfCBDVVJSRU5UX0dBVEVfTE9DQUxNRU0pOwogCXNldEN1cnJlbnRHYXRlKHJlZyk7CiAKLQlpZiAoZ2V0Q2hpcFR5cGUoKSAhPSBTTTc1MExFKSB7CisJaWYgKHNtNzUwX2dldF9jaGlwX3R5cGUoKSAhPSBTTTc1MExFKSB7CiAJCS8qCXNldCBwYW5lbCBwbGwgYW5kIGdyYXBoaWMgbW9kZSB2aWEgbW1pb184OCAqLwogCQlyZWcgPSBQRUVLMzIoVkdBX0NPTkZJR1VSQVRJT04pOwogCQlyZWcgfD0gKFZHQV9DT05GSUdVUkFUSU9OX1BMTCB8IFZHQV9DT05GSUdVUkFUSU9OX01PREUpOwpAQCAtMjM2LDkgKzI0MiwxMCBAQAogCXNldE1hc3RlckNsb2NrKE1IeihwSW5pdFBhcmFtLT5tYXN0ZXJDbG9jaykpOwogCiAKLQkvKiBSZXNldCB0aGUgbWVtb3J5IGNvbnRyb2xsZXIuIElmIHRoZSBtZW1vcnkgY29udHJvbGxlciBpcyBub3QgcmVzZXQgaW4gU003NTAsCi0JICAgdGhlIHN5c3RlbSBtaWdodCBoYW5nIHdoZW4gc3cgYWNjZXNzZXMgdGhlIG1lbW9yeS4KLQkgICBUaGUgbWVtb3J5IHNob3VsZCBiZSByZXNldHRlZCBhZnRlciBjaGFuZ2luZyB0aGUgTVhDTEsuCisJLyogUmVzZXQgdGhlIG1lbW9yeSBjb250cm9sbGVyLgorCSAqIElmIHRoZSBtZW1vcnkgY29udHJvbGxlciBpcyBub3QgcmVzZXQgaW4gU003NTAsCisJICogdGhlIHN5c3RlbSBtaWdodCBoYW5nIHdoZW4gc3cgYWNjZXNzZXMgdGhlIG1lbW9yeS4KKwkgKiBUaGUgbWVtb3J5IHNob3VsZCBiZSByZXNldHRlZCBhZnRlciBjaGFuZ2luZyB0aGUgTVhDTEsuCiAJICovCiAJaWYgKHBJbml0UGFyYW0tPnJlc2V0TWVtb3J5ID09IDEpIHsKIAkJcmVnID0gUEVFSzMyKE1JU0NfQ1RSTCk7CkBAIC0yODIsMjQgKzI4OSwyNyBAQAogfQogCiAvKgotCW1vbmsgbGl1IEAgNC82LzIwMTE6Ci0JCSAgIHJlLXdyaXRlIHRoZSBjYWxjdWxhdGVQTEwgZnVuY3Rpb24gb2YgZGRrNzUwLgotCQkgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBmdW5jdGlvbiBkb2VzIG5vdCB1c2Ugc29tZSBtYXRoZW1hdGljcyB0cmlja3MgYW5kIHNob3J0Y3V0Ci0JCSAgIHdoZW4gaXQgZG9pbmcgdGhlIGNhbGN1bGF0aW9uIG9mIHRoZSBiZXN0IE4sTSxEIGNvbWJpbmF0aW9uCi0JCSAgIEkgdGhpbmsgdGhpcyB2ZXJzaW9uIGdpdmVzIGEgbGl0dGxlIHVwZ3JhZGUgaW4gc3BlZWQKLQotCTc1MCBwbGwgY2xvY2sgZm9ybXVsYXI6Ci0JUmVxdWVzdCBDbG9jayA9IChJbnB1dCBDbG9jayAqIE0gKS8oTiAqIFgpCi0KLQlJbnB1dCBDbG9jayA9IDE0MzE4MTgxIGh6Ci0JWCA9IDIgcG93ZXIgRAotCUQgPXswLDEsMiwzLDQsNSw2fQotCU0gPSB7MSwuLi4sMjU1fQotCU4gPSB7MiwuLi4sMTV9Ci0qLworICogbW9uayBsaXUgQCA0LzYvMjAxMToKKyAqCXJlLXdyaXRlIHRoZSBjYWxjdWxhdGVQTEwgZnVuY3Rpb24gb2YgZGRrNzUwLgorICoJdGhlIG9yaWdpbmFsIHZlcnNpb24gZnVuY3Rpb24gZG9lcyBub3QgdXNlCisgKglzb21lIG1hdGhlbWF0aWNzIHRyaWNrcyBhbmQgc2hvcnRjdXQKKyAqCXdoZW4gaXQgZG9pbmcgdGhlIGNhbGN1bGF0aW9uIG9mIHRoZSBiZXN0IE4sTSxEIGNvbWJpbmF0aW9uCisgKglJIHRoaW5rIHRoaXMgdmVyc2lvbiBnaXZlcyBhIGxpdHRsZSB1cGdyYWRlIGluIHNwZWVkCisgKgorICogNzUwIHBsbCBjbG9jayBmb3JtdWxhcjoKKyAqIFJlcXVlc3QgQ2xvY2sgPSAoSW5wdXQgQ2xvY2sgKiBNICkvKE4gKiBYKQorICoKKyAqIElucHV0IENsb2NrID0gMTQzMTgxODEgaHoKKyAqIFggPSAyIHBvd2VyIEQKKyAqIEQgPXswLDEsMiwzLDQsNSw2fQorICogTSA9IHsxLC4uLiwyNTV9CisgKiBOID0gezIsLi4uLDE1fQorICovCiB1bnNpZ25lZCBpbnQgY2FsY1BsbFZhbHVlKHVuc2lnbmVkIGludCByZXF1ZXN0X29yaWcsIHBsbF92YWx1ZV90ICpwbGwpCiB7Ci0JLyogYXMgc203NTAgcmVnaXN0ZXIgZGVmaW5pdGlvbiwgTiBsb2NhdGVkIGluIDIsMTUgYW5kIE0gbG9jYXRlZCBpbiAxLDI1NQkqLworCS8qIGFzIHNtNzUwIHJlZ2lzdGVyIGRlZmluaXRpb24sCisJICogTiBsb2NhdGVkIGluIDIsMTUgYW5kIE0gbG9jYXRlZCBpbiAxLDI1NQorCSAqLwogCWludCBOLCBNLCBYLCBkOwogCWludCBtaW5pX2RpZmY7CiAJdW5zaWduZWQgaW50IFJOLCBxdW8sIHJlbSwgZmxfcXVvOwpAQCAtMzA4LDkgKzMxOCwxMSBAQAogCWNvbnN0IGludCBtYXhfT0QgPSAzOwogCWludCBtYXhfZCA9IDY7CiAKLQlpZiAoZ2V0Q2hpcFR5cGUoKSA9PSBTTTc1MExFKSB7Ci0JCS8qIFNNNzUwTEUgZG9uJ3QgaGF2ZSBwcmdyYW1tYWJsZSBQTEwgYW5kIE0vTiB2YWx1ZXMgdG8gd29yayBvbi4KLQkJSnVzdCByZXR1cm4gdGhlIHJlcXVlc3RlZCBjbG9jay4gKi8KKwlpZiAoc203NTBfZ2V0X2NoaXBfdHlwZSgpID09IFNNNzUwTEUpIHsKKwkJLyogU003NTBMRSBkb24ndCBoYXZlCisJCSAqIHByb2dyYW1tYWJsZSBQTEwgYW5kIE0vTiB2YWx1ZXMgdG8gd29yayBvbi4KKwkJICogSnVzdCByZXR1cm4gdGhlIHJlcXVlc3RlZCBjbG9jay4KKwkJICovCiAJCXJldHVybiByZXF1ZXN0X29yaWc7CiAJfQogCkBAIC0zMTksMTkgKzMzMSwyMyBAQAogCXJlcXVlc3QgPSByZXF1ZXN0X29yaWcgLyAxMDAwOwogCWlucHV0ID0gcGxsLT5pbnB1dEZyZXEgLyAxMDAwOwogCi0JLyogZm9yIE1YQ0xLIHJlZ2lzdGVyICwgbm8gUE9EIHByb3ZpZGVkLCBzbyBuZWVkIGJlIHRyZWF0ZWQgZGlmZmVyZW50bHkJKi8KKwkvKiBmb3IgTVhDTEsgcmVnaXN0ZXIsCisJICogbm8gUE9EIHByb3ZpZGVkLCBzbyBuZWVkIGJlIHRyZWF0ZWQgZGlmZmVyZW50bHkKKwkgKi8KIAlpZiAocGxsLT5jbG9ja1R5cGUgPT0gTVhDTEtfUExMKQogCQltYXhfZCA9IDM7CiAKIAlmb3IgKE4gPSAxNTsgTiA+IDE7IE4tLSkgewotCQkvKiBSTiB3aWxsIG5vdCBleGNlZWQgbWF4aW11bSBsb25nIGlmIEByZXF1ZXN0IDw9IDI4NSBNSFogKGZvciAzMmJpdCBjcHUpICovCisJCS8qIFJOIHdpbGwgbm90IGV4Y2VlZCBtYXhpbXVtIGxvbmcKKwkJICogaWYgQHJlcXVlc3QgPD0gMjg1IE1IWiAoZm9yIDMyYml0IGNwdSkKKwkJICovCiAJCVJOID0gTiAqIHJlcXVlc3Q7CiAJCXF1byA9IFJOIC8gaW5wdXQ7CiAJCXJlbSA9IFJOICUgaW5wdXQ7LyogcmVtIGFsd2F5cyBzbWFsbCB0aGFuIDE0MzE4MTgxICovCiAJCWZsX3F1byA9IChyZW0gKiAxMDAwMCAvIGlucHV0KTsKIAogCQlmb3IgKGQgPSBtYXhfZDsgZCA+PSAwOyBkLS0pIHsKLQkJCVggPSAoMSA8PCBkKTsKKwkJCVggPSBCSVQoZCk7CiAJCQlNID0gcXVvICogWDsKIAkJCU0gKz0gZmxfcXVvICogWCAvIDEwMDAwOwogCQkJLyogcm91bmQgc3RlcCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2NoaXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9jaGlwLmgKaW5kZXggMDg5MTM4NC4uMTQzNTdmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2NoaXAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfY2hpcC5oCkBAIC02OSw3ICs2OSw3IEBACiB9CiBpbml0Y2hpcF9wYXJhbV90OwogCi1sb2dpY2FsX2NoaXBfdHlwZV90IGdldENoaXBUeXBlKHZvaWQpOworbG9naWNhbF9jaGlwX3R5cGVfdCBzbTc1MF9nZXRfY2hpcF90eXBlKHZvaWQpOwogdW5zaWduZWQgaW50IGNhbGNQbGxWYWx1ZSh1bnNpZ25lZCBpbnQgcmVxdWVzdCwgcGxsX3ZhbHVlX3QgKnBsbCk7CiB1bnNpZ25lZCBpbnQgZm9ybWF0UGxsUmVnKHBsbF92YWx1ZV90ICpwUExMKTsKIHZvaWQgZGRrNzUwX3NldF9tbWlvKHZvaWQgX19pb21lbSAqLCB1bnNpZ25lZCBzaG9ydCwgY2hhcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfZGlzcGxheS5jIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2Rpc3BsYXkuYwppbmRleCBjYTQ5NzNlLi40MDIzYzQ3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2Rpc3BsYXkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfZGlzcGxheS5jCkBAIC02OCw4ICs2OCwxMCBAQAogCWlmICghY3RybCkgewogCQkvKiBwcmltYXJ5IGNvbnRyb2xsZXIgKi8KIAotCQkvKiBEbyBub3Qgd2FpdCB3aGVuIHRoZSBQcmltYXJ5IFBMTCBpcyBvZmYgb3IgZGlzcGxheSBjb250cm9sIGlzIGFscmVhZHkgb2ZmLgotCQkgICBUaGlzIHdpbGwgcHJldmVudCB0aGUgc29mdHdhcmUgdG8gd2FpdCBmb3JldmVyLiAqLworCQkvKgorCQkgKiBEbyBub3Qgd2FpdCB3aGVuIHRoZSBQcmltYXJ5IFBMTCBpcyBvZmYgb3IgZGlzcGxheSBjb250cm9sIGlzCisJCSAqIGFscmVhZHkgb2ZmLiBUaGlzIHdpbGwgcHJldmVudCB0aGUgc29mdHdhcmUgdG8gd2FpdCBmb3JldmVyLgorCQkgKi8KIAkJaWYgKCEoUEVFSzMyKFBBTkVMX1BMTF9DVFJMKSAmIFBMTF9DVFJMX1BPV0VSKSB8fAogCQkgICAgIShQRUVLMzIoUEFORUxfRElTUExBWV9DVFJMKSAmIERJU1BMQVlfQ1RSTF9USU1JTkcpKSB7CiAJCQlyZXR1cm47CkBAIC04OCw5ICs5MCwxMCBAQAogCQl9CiAKIAl9IGVsc2UgewotCi0JCS8qIERvIG5vdCB3YWl0IHdoZW4gdGhlIFByaW1hcnkgUExMIGlzIG9mZiBvciBkaXNwbGF5IGNvbnRyb2wgaXMgYWxyZWFkeSBvZmYuCi0JCQkgICBUaGlzIHdpbGwgcHJldmVudCB0aGUgc29mdHdhcmUgdG8gd2FpdCBmb3JldmVyLiAqLworCQkvKgorCQkgKiBEbyBub3Qgd2FpdCB3aGVuIHRoZSBQcmltYXJ5IFBMTCBpcyBvZmYgb3IgZGlzcGxheSBjb250cm9sIGlzCisJCSAqIGFscmVhZHkgb2ZmLiBUaGlzIHdpbGwgcHJldmVudCB0aGUgc29mdHdhcmUgdG8gd2FpdCBmb3JldmVyLgorCQkgKi8KIAkJaWYgKCEoUEVFSzMyKENSVF9QTExfQ1RSTCkgJiBQTExfQ1RSTF9QT1dFUikgfHwKIAkJICAgICEoUEVFSzMyKENSVF9ESVNQTEFZX0NUUkwpICYgRElTUExBWV9DVFJMX1RJTUlORykpIHsKIAkJCXJldHVybjsKQEAgLTEzNCw3ICsxMzcsNiBAQAogCXJlZyB8PSAoZGlzcCA/IFBBTkVMX0RJU1BMQVlfQ1RSTF9GUEVOIDogMCk7CiAJUE9LRTMyKFBBTkVMX0RJU1BMQVlfQ1RSTCwgcmVnKTsKIAlwcmltYXJ5V2FpdFZlcnRpY2FsU3luYyhkZWxheSk7Ci0KIH0KIAogdm9pZCBkZGs3NTBfc2V0TG9naWNhbERpc3BPdXQoZGlzcF9vdXRwdXRfdCBvdXRwdXQpCkBAIC0xNTksNyArMTYxLDYgQEAKIAkJLypzZSBibGFuayBvZmYgKi8KIAkJcmVnICY9IH5DUlRfRElTUExBWV9DVFJMX0JMQU5LOwogCQlQT0tFMzIoQ1JUX0RJU1BMQVlfQ1RSTCwgcmVnKTsKLQogCX0KIAogCWlmIChvdXRwdXQgJiBQUklfVFBfVVNBR0UpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9kaXNwbGF5LmggYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfZGlzcGxheS5oCmluZGV4IGNhMzVhYTEuLmUzZmRlNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9kaXNwbGF5LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2Rpc3BsYXkuaApAQCAtMiwxMDAgKzIsOTggQEAKICNkZWZpbmUgRERLNzUwX0RJU1BMQVlfSF9fCiAKIC8qIHBhbmVsIHBhdGggc2VsZWN0Ci0JODAwMDBbMjk6MjhdCi0qLworICoJODAwMDBbMjk6MjhdCisgKi8KIAogI2RlZmluZSBQTkxfMl9PRkZTRVQgMAogI2RlZmluZSBQTkxfMl9NQVNLICgzIDw8IFBOTF8yX09GRlNFVCkKICNkZWZpbmUgUE5MXzJfVVNBR0UJKFBOTF8yX01BU0sgPDwgMTYpCi0jZGVmaW5lIFBOTF8yX1BSSQkoKDAgPDwgUE5MXzJfT0ZGU0VUKXxQTkxfMl9VU0FHRSkKLSNkZWZpbmUgUE5MXzJfU0VDCSgoMiA8PCBQTkxfMl9PRkZTRVQpfFBOTF8yX1VTQUdFKQorI2RlZmluZSBQTkxfMl9QUkkJKCgwIDw8IFBOTF8yX09GRlNFVCkgfCBQTkxfMl9VU0FHRSkKKyNkZWZpbmUgUE5MXzJfU0VDCSgoMiA8PCBQTkxfMl9PRkZTRVQpIHwgUE5MXzJfVVNBR0UpCiAKIAogLyogcHJpbWFyeSB0aW1pbmcgJiBwbGFuZSBlbmFibGUgYml0Ci0JMTogODAwMDBbOF0gJiA4MDAwMFsyXSBvbgotCTA6IGJvdGggb2ZmCi0qLworICoJMTogODAwMDBbOF0gJiA4MDAwMFsyXSBvbgorICoJMDogYm90aCBvZmYKKyAqLwogI2RlZmluZSBQUklfVFBfT0ZGU0VUIDQKICNkZWZpbmUgUFJJX1RQX01BU0sgQklUKFBSSV9UUF9PRkZTRVQpCiAjZGVmaW5lIFBSSV9UUF9VU0FHRSAoUFJJX1RQX01BU0sgPDwgMTYpCi0jZGVmaW5lIFBSSV9UUF9PTiAoKDB4MSA8PCBQUklfVFBfT0ZGU0VUKXxQUklfVFBfVVNBR0UpCi0jZGVmaW5lIFBSSV9UUF9PRkYgKCgweDAgPDwgUFJJX1RQX09GRlNFVCl8UFJJX1RQX1VTQUdFKQorI2RlZmluZSBQUklfVFBfT04gKCgweDEgPDwgUFJJX1RQX09GRlNFVCkgfCBQUklfVFBfVVNBR0UpCisjZGVmaW5lIFBSSV9UUF9PRkYgKCgweDAgPDwgUFJJX1RQX09GRlNFVCkgfCBQUklfVFBfVVNBR0UpCiAKIAogLyogcGFuZWwgc2VxdWVuY3kgc3RhdHVzCi0JODAwMDBbMjc6MjRdCi0qLworICoJODAwMDBbMjc6MjRdCisgKi8KICNkZWZpbmUgUE5MX1NFUV9PRkZTRVQgNgogI2RlZmluZSBQTkxfU0VRX01BU0sgQklUKFBOTF9TRVFfT0ZGU0VUKQogI2RlZmluZSBQTkxfU0VRX1VTQUdFIChQTkxfU0VRX01BU0sgPDwgMTYpCi0jZGVmaW5lIFBOTF9TRVFfT04gKEJJVChQTkxfU0VRX09GRlNFVCl8UE5MX1NFUV9VU0FHRSkKLSNkZWZpbmUgUE5MX1NFUV9PRkYgKCgwIDw8IFBOTF9TRVFfT0ZGU0VUKXxQTkxfU0VRX1VTQUdFKQorI2RlZmluZSBQTkxfU0VRX09OIChCSVQoUE5MX1NFUV9PRkZTRVQpIHwgUE5MX1NFUV9VU0FHRSkKKyNkZWZpbmUgUE5MX1NFUV9PRkYgKCgwIDw8IFBOTF9TRVFfT0ZGU0VUKSB8IFBOTF9TRVFfVVNBR0UpCiAKIC8qIGR1YWwgZGlnaXRhbCBvdXRwdXQKLQk4MDAwMFsxOV0KLSovCisgKgk4MDAwMFsxOV0KKyAqLwogI2RlZmluZSBEVUFMX1RGVF9PRkZTRVQgOAogI2RlZmluZSBEVUFMX1RGVF9NQVNLIEJJVChEVUFMX1RGVF9PRkZTRVQpCiAjZGVmaW5lIERVQUxfVEZUX1VTQUdFIChEVUFMX1RGVF9NQVNLIDw8IDE2KQotI2RlZmluZSBEVUFMX1RGVF9PTiAoQklUKERVQUxfVEZUX09GRlNFVCl8RFVBTF9URlRfVVNBR0UpCi0jZGVmaW5lIERVQUxfVEZUX09GRiAoKDAgPDwgRFVBTF9URlRfT0ZGU0VUKXxEVUFMX1RGVF9VU0FHRSkKKyNkZWZpbmUgRFVBTF9URlRfT04gKEJJVChEVUFMX1RGVF9PRkZTRVQpIHwgRFVBTF9URlRfVVNBR0UpCisjZGVmaW5lIERVQUxfVEZUX09GRiAoKDAgPDwgRFVBTF9URlRfT0ZGU0VUKSB8IERVQUxfVEZUX1VTQUdFKQogCiAvKiBzZWNvbmRhcnkgdGltaW5nICYgcGxhbmUgZW5hYmxlIGJpdAotCTE6ODAyMDBbOF0gJiA4MDIwMFsyXSBvbgotCTA6IGJvdGggb2ZmCi0qLworICoJMTo4MDIwMFs4XSAmIDgwMjAwWzJdIG9uCisgKgkwOiBib3RoIG9mZgorICovCiAjZGVmaW5lIFNFQ19UUF9PRkZTRVQgNQogI2RlZmluZSBTRUNfVFBfTUFTSyBCSVQoU0VDX1RQX09GRlNFVCkKICNkZWZpbmUgU0VDX1RQX1VTQUdFIChTRUNfVFBfTUFTSyA8PCAxNikKLSNkZWZpbmUgU0VDX1RQX09OICAoKDB4MSA8PCBTRUNfVFBfT0ZGU0VUKXxTRUNfVFBfVVNBR0UpCi0jZGVmaW5lIFNFQ19UUF9PRkYgKCgweDAgPDwgU0VDX1RQX09GRlNFVCl8U0VDX1RQX1VTQUdFKQorI2RlZmluZSBTRUNfVFBfT04gICgoMHgxIDw8IFNFQ19UUF9PRkZTRVQpIHwgU0VDX1RQX1VTQUdFKQorI2RlZmluZSBTRUNfVFBfT0ZGICgoMHgwIDw8IFNFQ19UUF9PRkZTRVQpIHwgU0VDX1RQX1VTQUdFKQogCiAvKiBjcnQgcGF0aCBzZWxlY3QKLQk4MDIwMFsxOToxOF0KLSovCisgKgk4MDIwMFsxOToxOF0KKyAqLwogI2RlZmluZSBDUlRfMl9PRkZTRVQgMgogI2RlZmluZSBDUlRfMl9NQVNLICgzIDw8IENSVF8yX09GRlNFVCkKICNkZWZpbmUgQ1JUXzJfVVNBR0UgKENSVF8yX01BU0sgPDwgMTYpCi0jZGVmaW5lIENSVF8yX1BSSSAoKDB4MCA8PCBDUlRfMl9PRkZTRVQpfENSVF8yX1VTQUdFKQotI2RlZmluZSBDUlRfMl9TRUMgKCgweDIgPDwgQ1JUXzJfT0ZGU0VUKXxDUlRfMl9VU0FHRSkKKyNkZWZpbmUgQ1JUXzJfUFJJICgoMHgwIDw8IENSVF8yX09GRlNFVCkgfCBDUlRfMl9VU0FHRSkKKyNkZWZpbmUgQ1JUXzJfU0VDICgoMHgyIDw8IENSVF8yX09GRlNFVCkgfCBDUlRfMl9VU0FHRSkKIAogCiAvKiBEQUMgYWZmZWN0IGJvdGggRFZJIGFuZCBEU1VCCi0JNFsyMF0KLSovCisgKgk0WzIwXQorICovCiAjZGVmaW5lIERBQ19PRkZTRVQgNwogI2RlZmluZSBEQUNfTUFTSyBCSVQoREFDX09GRlNFVCkKICNkZWZpbmUgREFDX1VTQUdFIChEQUNfTUFTSyA8PCAxNikKLSNkZWZpbmUgREFDX09OICgoMHgwIDw8IERBQ19PRkZTRVQpfERBQ19VU0FHRSkKLSNkZWZpbmUgREFDX09GRiAoKDB4MSA8PCBEQUNfT0ZGU0VUKXxEQUNfVVNBR0UpCisjZGVmaW5lIERBQ19PTiAoKDB4MCA8PCBEQUNfT0ZGU0VUKSB8IERBQ19VU0FHRSkKKyNkZWZpbmUgREFDX09GRiAoKDB4MSA8PCBEQUNfT0ZGU0VUKSB8IERBQ19VU0FHRSkKIAogLyogRFBNUyBvbmx5IGFmZmVjdCBELVNVQiBoZWFkCi0JMFszMTozMF0KLSovCisgKgkwWzMxOjMwXQorICovCiAjZGVmaW5lIERQTVNfT0ZGU0VUIDkKICNkZWZpbmUgRFBNU19NQVNLICgzIDw8IERQTVNfT0ZGU0VUKQogI2RlZmluZSBEUE1TX1VTQUdFIChEUE1TX01BU0sgPDwgMTYpCi0jZGVmaW5lIERQTVNfT0ZGICgoMyA8PCBEUE1TX09GRlNFVCl8RFBNU19VU0FHRSkKLSNkZWZpbmUgRFBNU19PTiAoKDAgPDwgRFBNU19PRkZTRVQpfERQTVNfVVNBR0UpCisjZGVmaW5lIERQTVNfT0ZGICgoMyA8PCBEUE1TX09GRlNFVCkgfCBEUE1TX1VTQUdFKQorI2RlZmluZSBEUE1TX09OICgoMCA8PCBEUE1TX09GRlNFVCkgfCBEUE1TX1VTQUdFKQogCiAKIAotLyoKLQlMQ0QxIG1lYW5zIHBhbmVsIHBhdGggVEZUMSAgJiBwYW5lbCBwYXRoIERWSSAoc28gZW5hYmxlIERBQykKLQlDUlQgbWVhbnMgY3J0IHBhdGggRFNVQgotKi8KKy8qIExDRDEgbWVhbnMgcGFuZWwgcGF0aCBURlQxICAmIHBhbmVsIHBhdGggRFZJIChzbyBlbmFibGUgREFDKQorICogQ1JUIG1lYW5zIGNydCBwYXRoIERTVUIKKyAqLwogdHlwZWRlZiBlbnVtIF9kaXNwX291dHB1dF90IHsKLQlkb19MQ0QxX1BSSSA9IFBOTF8yX1BSSXxQUklfVFBfT058UE5MX1NFUV9PTnxEQUNfT04sCi0JZG9fTENEMV9TRUMgPSBQTkxfMl9TRUN8U0VDX1RQX09OfFBOTF9TRVFfT058REFDX09OLAotCWRvX0xDRDJfUFJJID0gQ1JUXzJfUFJJfFBSSV9UUF9PTnxEVUFMX1RGVF9PTiwKLQlkb19MQ0QyX1NFQyA9IENSVF8yX1NFQ3xTRUNfVFBfT058RFVBTF9URlRfT04sCi0JLyoKLQlkb19EU1VCX1BSSSA9IENSVF8yX1BSSXxQUklfVFBfT058RFBNU19PTnxEQUNfT04sCi0JZG9fRFNVQl9TRUMgPSBDUlRfMl9TRUN8U0VDX1RQX09OfERQTVNfT058REFDX09OLAotCSovCi0JZG9fQ1JUX1BSSSA9IENSVF8yX1BSSXxQUklfVFBfT058RFBNU19PTnxEQUNfT04sCi0JZG9fQ1JUX1NFQyA9IENSVF8yX1NFQ3xTRUNfVFBfT058RFBNU19PTnxEQUNfT04sCisJZG9fTENEMV9QUkkgPSBQTkxfMl9QUkkgfCBQUklfVFBfT04gfCBQTkxfU0VRX09OIHwgREFDX09OLAorCWRvX0xDRDFfU0VDID0gUE5MXzJfU0VDIHwgU0VDX1RQX09OIHwgUE5MX1NFUV9PTiB8IERBQ19PTiwKKwlkb19MQ0QyX1BSSSA9IENSVF8yX1BSSSB8IFBSSV9UUF9PTiB8IERVQUxfVEZUX09OLAorCWRvX0xDRDJfU0VDID0gQ1JUXzJfU0VDIHwgU0VDX1RQX09OIHwgRFVBTF9URlRfT04sCisJLyogZG9fRFNVQl9QUkkgPSBDUlRfMl9QUkkgfCBQUklfVFBfT04gfCBEUE1TX09OfERBQ19PTiwKKwkgKiBkb19EU1VCX1NFQyA9IENSVF8yX1NFQyB8IFNFQ19UUF9PTiB8IERQTVNfT058REFDX09OLAorCSAqLworCWRvX0NSVF9QUkkgPSBDUlRfMl9QUkkgfCBQUklfVFBfT04gfCBEUE1TX09OIHwgREFDX09OLAorCWRvX0NSVF9TRUMgPSBDUlRfMl9TRUMgfCBTRUNfVFBfT04gfCBEUE1TX09OIHwgREFDX09OLAogfQogZGlzcF9vdXRwdXRfdDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2R2aS5jIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2R2aS5jCmluZGV4IGE0YTI1NTAuLjgyNTJmNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9kdmkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfZHZpLmMKQEAgLTYsOSArNiwxMSBAQAogI2luY2x1ZGUgImRkazc1MF9zaWkxNjQuaCIKIAogCi0vKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBjb250YWlucyBhbGwgdGhlIHN1cHBvcnRlZCBkcml2ZXIgYW5kIGl0cyBjb3JyZXNwb25kaW5nCi0gICBmdW5jdGlvbiBBUEkuIFBsZWFzZSBzZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gTlVMTCB3aGVuZXZlciB0aGUgZnVuY3Rpb24KLSAgIGlzIG5vdCBzdXBwb3J0ZWQuICovCisvKgorICogVGhpcyBnbG9iYWwgdmFyaWFibGUgY29udGFpbnMgYWxsIHRoZSBzdXBwb3J0ZWQgZHJpdmVyIGFuZCBpdHMgY29ycmVzcG9uZGluZworICogZnVuY3Rpb24gQVBJLiBQbGVhc2Ugc2V0IHRoZSBmdW5jdGlvbiBwb2ludGVyIHRvIE5VTEwgd2hlbmV2ZXIgdGhlIGZ1bmN0aW9uCisgKiBpcyBub3Qgc3VwcG9ydGVkLgorICovCiBzdGF0aWMgZHZpX2N0cmxfZGV2aWNlX3QgZ19kY2Z0U3VwcG9ydGVkRHZpQ29udHJvbGxlcltdID0gewogI2lmZGVmIERWSV9DVFJMX1NJSTE2NAogCXsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9od2kyYy5jIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2h3aTJjLmMKaW5kZXggMzljM2UxYy4uZDM5MWMxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2h3aTJjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2h3aTJjLmMKQEAgLTIxLDcgKzIxLDcgQEAKIAlQT0tFMzIoR1BJT19NVVgsIHZhbHVlKTsKIAogCS8qIEVuYWJsZSBIYXJkd2FyZSBJMkMgcG93ZXIuCi0JIFRPRE86IENoZWNrIGlmIHdlIG5lZWQgdG8gZW5hYmxlIEdQSU8gcG93ZXI/CisJICogVE9ETzogQ2hlY2sgaWYgd2UgbmVlZCB0byBlbmFibGUgR1BJTyBwb3dlcj8KIAkgKi8KIAllbmFibGVJMkMoMSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9tb2RlLmMgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfbW9kZS5jCmluZGV4IGNjYjRlMDYuLjA1YjgzNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9tb2RlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX21vZGUuYwpAQCAtNCwxNSArNCwxNCBAQAogI2luY2x1ZGUgImRkazc1MF9tb2RlLmgiCiAjaW5jbHVkZSAiZGRrNzUwX2NoaXAuaCIKIAotLyoKLQlTTTc1MExFIG9ubHk6Ci0gICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBjYXJlIGV4dHJhIHJlZ2lzdGVycyBhbmQgYml0IGZpZWxkcyByZXF1aXJlZCB0byBzZXQKLSAgICB1cCBhIG1vZGUgaW4gU003NTBMRQotCi0JRXhwbGFuYXRpb24gYWJvdXQgRGlzcGxheSBDb250cm9sIHJlZ2lzdGVyOgotICAgIEhXIG9ubHkgc3VwcG9ydHMgNyBwcmVkZWZpbmVkIHBpeGVsIGNsb2NrcywgYW5kIGNsb2NrIHNlbGVjdCBpcwotICAgIGluIGJpdCAyOToyNyBvZglEaXNwbGF5IENvbnRyb2wgcmVnaXN0ZXIuCi0qLworLyogU003NTBMRSBvbmx5OgorICogVGhpcyBmdW5jdGlvbiB0YWtlcyBjYXJlIGV4dHJhIHJlZ2lzdGVycyBhbmQgYml0IGZpZWxkcyByZXF1aXJlZCB0byBzZXQKKyAqIHVwIGEgbW9kZSBpbiBTTTc1MExFCisgKgorICogRXhwbGFuYXRpb24gYWJvdXQgRGlzcGxheSBDb250cm9sIHJlZ2lzdGVyOgorICogSFcgb25seSBzdXBwb3J0cyA3IHByZWRlZmluZWQgcGl4ZWwgY2xvY2tzLCBhbmQgY2xvY2sgc2VsZWN0IGlzCisgKiBpbiBiaXQgMjk6Mjcgb2YgRGlzcGxheSBDb250cm9sIHJlZ2lzdGVyLgorICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBkaXNwbGF5Q29udHJvbEFkanVzdF9TTTc1MExFKG1vZGVfcGFyYW1ldGVyX3QgKnBNb2RlUGFyYW0sIHVuc2lnbmVkIGxvbmcgZGlzcENvbnRyb2wpCiB7CiAJdW5zaWduZWQgbG9uZyB4LCB5OwpAQCAtMjEsOSArMjAsOSBAQAogCXkgPSBwTW9kZVBhcmFtLT52ZXJ0aWNhbF9kaXNwbGF5X2VuZDsKIAogCS8qIFNNNzUwTEUgaGFzIHRvIHNldCB1cCB0aGUgdG9wLWxlZnQgYW5kIGJvdHRvbS1yaWdodAotCSAgIHJlZ2lzdGVycyBhcyB3ZWxsLgotCSAgIE5vdGUgdGhhdCBub3JtYWwgU003NTAvU003MTggb25seSB1c2UgdGhvc2UgdHdvIHJlZ2lzdGVyIGZvcgotCSAgIGF1dG8tY2VudGVyaW5nIG1vZGUuCisJICogcmVnaXN0ZXJzIGFzIHdlbGwuCisJICogTm90ZSB0aGF0IG5vcm1hbCBTTTc1MC9TTTcxOCBvbmx5IHVzZSB0aG9zZSB0d28gcmVnaXN0ZXIgZm9yCisJICogYXV0by1jZW50ZXJpbmcgbW9kZS4KIAkgKi8KIAlQT0tFMzIoQ1JUX0FVVE9fQ0VOVEVSSU5HX1RMLCAwKTsKIApAQCAtMzMsOCArMzIsOCBAQAogCQkoKHggLSAxKSAmIENSVF9BVVRPX0NFTlRFUklOR19CUl9SSUdIVF9NQVNLKSk7CiAKIAkvKiBBc3N1bWUgY29tbW9uIGZpZWxkcyBpbiBkaXNwQ29udHJvbCBoYXZlIGJlZW4gcHJvcGVybHkgc2V0IGJlZm9yZQotCSAgIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KLQkgICBUaGlzIGZ1bmN0aW9uIG9ubHkgc2V0cyB0aGUgZXh0cmEgZmllbGRzIGluIGRpc3BDb250cm9sLgorCSAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKwkgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc2V0cyB0aGUgZXh0cmEgZmllbGRzIGluIGRpc3BDb250cm9sLgogCSAqLwogCiAJLyogQ2xlYXIgYml0IDI5OjI3IG9mIGRpc3BsYXkgY29udHJvbCByZWdpc3RlciAqLwpAQCAtNjMsNyArNjIsNyBAQAogCWRpc3BDb250cm9sIHw9IChDUlRfRElTUExBWV9DVFJMX0NSVFNFTEVDVCB8IENSVF9ESVNQTEFZX0NUUkxfUkdCQklUKTsKIAogCS8qIFNldCBiaXQgMTQgb2YgZGlzcGxheSBjb250cm9sbGVyICovCi0JZGlzcENvbnRyb2wgPSBESVNQTEFZX0NUUkxfQ0xPQ0tfUEhBU0U7CisJZGlzcENvbnRyb2wgfD0gRElTUExBWV9DVFJMX0NMT0NLX1BIQVNFOwogCiAJUE9LRTMyKENSVF9ESVNQTEFZX0NUUkwsIGRpc3BDb250cm9sKTsKIApAQCAtMTE3LDcgKzExNiw3IEBACiAJCWlmIChwTW9kZVBhcmFtLT5ob3Jpem9udGFsX3N5bmNfcG9sYXJpdHkpCiAJCQl0bXAgfD0gRElTUExBWV9DVFJMX0hTWU5DX1BIQVNFOwogCi0JCWlmIChnZXRDaGlwVHlwZSgpID09IFNNNzUwTEUpIHsKKwkJaWYgKHNtNzUwX2dldF9jaGlwX3R5cGUoKSA9PSBTTTc1MExFKSB7CiAJCQlkaXNwbGF5Q29udHJvbEFkanVzdF9TTTc1MExFKHBNb2RlUGFyYW0sIHRtcCk7CiAJCX0gZWxzZSB7CiAJCQlyZWcgPSBQRUVLMzIoQ1JUX0RJU1BMQVlfQ1RSTCkgJgpAQCAtMjA5LDcgKzIwOCw3IEBACiAJcGxsLmNsb2NrVHlwZSA9IGNsb2NrOwogCiAJdWlBY3R1YWxQaXhlbENsayA9IGNhbGNQbGxWYWx1ZShwYXJtLT5waXhlbF9jbG9jaywgJnBsbCk7Ci0JaWYgKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSkgeworCWlmIChzbTc1MF9nZXRfY2hpcF90eXBlKCkgPT0gU003NTBMRSkgewogCQkvKiBzZXQgZ3JhcGhpYyBtb2RlIHZpYSBJTyBtZXRob2QgKi8KIAkJb3V0Yl9wKDB4ODgsIDB4M2Q0KTsKIAkJb3V0Yl9wKDB4MDYsIDB4M2Q1KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9wb3dlci5jIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX3Bvd2VyLmMKaW5kZXggYjNjMzc5MS4uN2NjNjE2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX3Bvd2VyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX3Bvd2VyLmMKQEAgLTYsNyArNiw3IEBACiB7CiAJdW5zaWduZWQgaW50IHZhbHVlOwogCi0JaWYgKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSkgeworCWlmIChzbTc1MF9nZXRfY2hpcF90eXBlKCkgPT0gU003NTBMRSkgewogCQl2YWx1ZSA9IFBFRUszMihDUlRfRElTUExBWV9DVFJMKSAmIH5DUlRfRElTUExBWV9DVFJMX0RQTVNfTUFTSzsKIAkJdmFsdWUgfD0gKHN0YXRlIDw8IENSVF9ESVNQTEFZX0NUUkxfRFBNU19TSElGVCk7CiAJCVBPS0UzMihDUlRfRElTUExBWV9DVFJMLCB2YWx1ZSk7CkBAIC0xOSw3ICsxOSw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0UG93ZXJNb2RlKHZvaWQpCiB7Ci0JaWYgKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSkKKwlpZiAoc203NTBfZ2V0X2NoaXBfdHlwZSgpID09IFNNNzUwTEUpCiAJCXJldHVybiAwOwogCXJldHVybiBQRUVLMzIoUE9XRVJfTU9ERV9DVFJMKSAmIFBPV0VSX01PREVfQ1RSTF9NT0RFX01BU0s7CiB9CkBAIC0zNSw3ICszNSw3IEBACiAKIAljb250cm9sX3ZhbHVlID0gUEVFSzMyKFBPV0VSX01PREVfQ1RSTCkgJiB+UE9XRVJfTU9ERV9DVFJMX01PREVfTUFTSzsKIAotCWlmIChnZXRDaGlwVHlwZSgpID09IFNNNzUwTEUpCisJaWYgKHNtNzUwX2dldF9jaGlwX3R5cGUoKSA9PSBTTTc1MExFKQogCQlyZXR1cm47CiAKIAlzd2l0Y2ggKHBvd2VyTW9kZSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX3NpaTE2NC5jIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX3NpaTE2NC5jCmluZGV4IDY3ZjM2ZTcuLjk5YTg2ODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9zaWkxNjQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfc2lpMTY0LmMKQEAgLTE3NCw4ICsxNzQsOCBAQAogCQlpMmNXcml0ZVJlZyhTSUkxNjRfSTJDX0FERFJFU1MsIFNJSTE2NF9DT05GSUdVUkFUSU9OLCBjb25maWcpOwogCiAJCS8qIERlLXNrZXcgZW5hYmxlZCB3aXRoIGRlZmF1bHQgMTExYiB2YWx1ZS4KLQkJICAgVGhpcyB3aWxsIGZpeCBzb21lIGFydGlmYWN0cyBwcm9ibGVtIGluIHNvbWUgbW9kZSBvbiBib2FyZCAyLjIuCi0JCSAgIFNvbWVob3cgdGhpcyBmaXggZG9lcyBub3QgYWZmZWN0IGJvYXJkIDIuMS4KKwkJICogVGhpcyBmaXhlcyBzb21lIGFydGlmYWN0cyBwcm9ibGVtIGluIHNvbWUgbW9kZSBvbiBib2FyZCAyLjIuCisJCSAqIFNvbWVob3cgdGhpcyBmaXggZG9lcyBub3QgYWZmZWN0IGJvYXJkIDIuMS4KIAkJICovCiAJCWlmIChkZXNrZXdFbmFibGUgPT0gMCkKIAkJCWNvbmZpZyA9IFNJSTE2NF9ERVNLRVdfRElTQUJMRTsKQEAgLTM0NCw3ICszNDQsOCBAQAogCWRldGVjdFJlZyA9IGkyY1JlYWRSZWcoU0lJMTY0X0kyQ19BRERSRVNTLCBTSUkxNjRfREVURUNUKTsKIAogCS8qIERlcGVuZGluZyBvbiBlYWNoIERWSSBjb250cm9sbGVyLCBuZWVkIHRvIGVuYWJsZSB0aGUgaG90IHBsdWcgYmFzZWQgb24gZWFjaAotCSAgIGluZGl2aWR1YWwgY2hpcCBkZXNpZ24uICovCisJICogaW5kaXZpZHVhbCBjaGlwIGRlc2lnbi4KKwkgKi8KIAlpZiAoZW5hYmxlSG90UGx1ZyAhPSAwKQogCQlzaWkxNjRTZWxlY3RIb3RQbHVnRGV0ZWN0aW9uTW9kZShTSUkxNjRfSE9UUExVR19VU0VfTURJKTsKIAllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfc3dpMmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9zd2kyYy5jCmluZGV4IDhkNjQ0YTcuLjcyYTQyMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9zd2kyYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9zd2kyYy5jCkBAIC04OSwxMiArODksMTIgQEAKIAkgKiBhbHdheXMgYmUgbm9uLXplcm8sd2hpY2ggbWFrZXMgdGhlIHdoaWxlIGxvb3AKIAkgKiBuZXZlciBmaW5pc2guCiAJICogdXNlIG5vbi11bHRpbWF0ZSBmb3IgbG9vcCBiZWxvdyBpcyBzYWZlCi0JICogKi8KKwkgKi8KIAogICAgIC8qIENoYW5nZSB3YWl0IGFsZ29yaXRobSB0byB1c2UgUENJIGJ1cyBjbG9jaywKLSAgICAgICBpdCdzIG1vcmUgcmVsaWFibGUgdGhhbiBjb3VudGVyIGxvb3AgLi4KLSAgICAgICB3cml0ZSAweDYxIHRvIDB4M2NlIGFuZCByZWFkIGZyb20gMHgzY2YKLSAgICAgICAqLworICAgICAqIGl0J3MgbW9yZSByZWxpYWJsZSB0aGFuIGNvdW50ZXIgbG9vcCAuLgorICAgICAqIHdyaXRlIDB4NjEgdG8gMHgzY2UgYW5kIHJlYWQgZnJvbSAweDNjZgorICAgICAqLwogCWludCBpLCB0bXA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgNjAwOyBpKyspIHsKQEAgLTQwMyw3ICs0MDMsNyBAQAogCWlmICgoY2xrX2dwaW8gPiAzMSkgfHwgKGRhdGFfZ3BpbyA+IDMxKSkKIAkJcmV0dXJuIC0xOwogCi0JaWYgKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSkKKwlpZiAoc203NTBfZ2V0X2NoaXBfdHlwZSgpID09IFNNNzUwTEUpCiAJCXJldHVybiBzbTc1MGxlX2kyY19pbml0KGNsa19ncGlvLCBkYXRhX2dwaW8pOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgR1BJTyBwaW4gZm9yIHRoZSBpMmMgQ2xvY2sgUmVnaXN0ZXIgKi8KQEAgLTUwMSw4ICs1MDEsOCBAQAogCXN3X2kyY19zdGFydCgpOwogCiAJLyogU2VuZCB0aGUgZGV2aWNlIGFkZHJlc3MgYW5kIHJlYWQgdGhlIGRhdGEuIEFsbCBzaG91bGQgcmV0dXJuIHN1Y2Nlc3MKLQkgICBpbiBvcmRlciBmb3IgdGhlIHdyaXRpbmcgcHJvY2Vzc2VkIHRvIGJlIHN1Y2Nlc3NmdWwKLQkqLworCSAqIGluIG9yZGVyIGZvciB0aGUgd3JpdGluZyBwcm9jZXNzZWQgdG8gYmUgc3VjY2Vzc2Z1bAorCSAqLwogCWlmICgoc3dfaTJjX3dyaXRlX2J5dGUoYWRkcikgIT0gMCkgfHwKIAkgICAgKHN3X2kyY193cml0ZV9ieXRlKHJlZykgIT0gMCkgfHwKIAkgICAgKHN3X2kyY193cml0ZV9ieXRlKGRhdGEpICE9IDApKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MC5jIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTAuYwppbmRleCA2ZWQwMDRlLi43ZDkwZTI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwLmMKQEAgLTExNzYsNyArMTE3Niw3IEBACiAJCWVsc2UgewogCQkJc3RyY2F0KHRtcCwgb3B0KTsKIAkJCXRtcCArPSBzdHJsZW4ob3B0KTsKLQkJCWlmIChvcHRpb25zICE9IE5VTEwpCisJCQlpZiAob3B0aW9ucykKIAkJCQkqdG1wKysgPSAnOic7CiAJCQllbHNlCiAJCQkJKnRtcCsrID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwLmggYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MC5oCmluZGV4IDhlNzBjZTAuLmZmMzFjNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTAuaApAQCAtMTQ3LDE3ICsxNDcsMTcgQEAKIAlpbnQgZHBtczsKIAlpbnQgcGF0aHM7CiAJLyogd2hpY2ggcGF0aHMocykgdGhpcyBvdXRwdXQgc3RhbmRzIGZvcixmb3Igc203NTA6Ci0JICAgcGF0aHM9MTptZWFucyBvdXRwdXQgZm9yIHBhbmVsIHBhdGhzCi0JICAgcGF0aHM9MjptZWFucyBvdXRwdXQgZm9yIGNydCBwYXRocwotCSAgIHBhdGhzPTM6bWVhbnMgb3V0cHV0IGZvciBib3RoIHBhbmVsIGFuZCBjcnQgcGF0aHMKLQkqLworCSAqIHBhdGhzPTE6bWVhbnMgb3V0cHV0IGZvciBwYW5lbCBwYXRocworCSAqIHBhdGhzPTI6bWVhbnMgb3V0cHV0IGZvciBjcnQgcGF0aHMKKwkgKiBwYXRocz0zOm1lYW5zIG91dHB1dCBmb3IgYm90aCBwYW5lbCBhbmQgY3J0IHBhdGhzCisJICovCiAKIAlpbnQgKmNoYW5uZWw7CiAJLyogd2hpY2ggY2hhbm5lbCB0aGVzZSBvdXRwdXRzIGxpbmtlZCB3aXRoLGZvciBzbTc1MDoKLQkgICAqY2hhbm5lbD0wIG1lYW5zIHByaW1hcnkgY2hhbm5lbAotCSAgICpjaGFubmVsPTEgbWVhbnMgc2Vjb25kYXJ5IGNoYW5uZWwKLQkgICBvdXRwdXQtPmNoYW5uZWwgPT0+ICZjcnRjLT5jaGFubmVsCi0JKi8KKwkgKiAqY2hhbm5lbD0wIG1lYW5zIHByaW1hcnkgY2hhbm5lbAorCSAqICpjaGFubmVsPTEgbWVhbnMgc2Vjb25kYXJ5IGNoYW5uZWwKKwkgKiBvdXRwdXQtPmNoYW5uZWwgPT0+ICZjcnRjLT5jaGFubmVsCisJICovCiAJdm9pZCAqcHJpdjsKIAogCWludCAoKnByb2Nfc2V0QkxBTkspKHN0cnVjdCBseW54ZmJfb3V0cHV0KiwgaW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwX2FjY2VsLmMgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MF9hY2NlbC5jCmluZGV4IDlhYTQwNjYuLjM4YWRhZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwX2FjY2VsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTBfYWNjZWwuYwpAQCAtNjcsNyArNjcsOCBAQAogCiAvKiBzZXQyZGZvcm1hdCBvbmx5IGJlIGNhbGxlZCBmcm9tIHNldG1vZGUgZnVuY3Rpb25zCiAgKiBidXQgaWYgeW91IG5lZWQgZHVhbCBmcmFtZWJ1ZmZlciBkcml2ZXIsbmVlZCBjYWxsIHNldDJkZm9ybWF0Ci0gKiBldmVyeSB0aW1lIHlvdSB1c2UgMmQgZnVuY3Rpb24gKi8KKyAqIGV2ZXJ5IHRpbWUgeW91IHVzZSAyZCBmdW5jdGlvbgorICovCiAKIHZvaWQgaHdfc2V0MmRmb3JtYXQoc3RydWN0IGx5bnhfYWNjZWwgKmFjY2VsLCBpbnQgZm10KQogewpAQCAtOTAsNyArOTEsOCBAQAogCiAJaWYgKGFjY2VsLT5kZV93YWl0KCkgIT0gMCkgewogCQkvKiBpbnQgdGltZSB3YWl0IGFuZCBhbHdheXMgYnVzeSxzZWVtcyBoYXJkd2FyZQotCQkgKiBnb3Qgc29tZXRoaW5nIGVycm9yICovCisJCSAqIGdvdCBzb21ldGhpbmcgZXJyb3IKKwkJICovCiAJCXByX2RlYnVnKCJEZSBlbmdpbmUgYWx3YXlzIGJ1c3lcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMTUyLDI0ICsxNTQsMjYgQEAKIAkJLyogRGV0ZXJtaW5lIGRpcmVjdGlvbiBvZiBvcGVyYXRpb24gKi8KIAkJaWYgKHN5IDwgZHkpIHsKIAkJCS8qICstLS0tLS0tLS0tKwotCQkJICAgfFMgICAgICAgICB8Ci0JCQkgICB8ICAgKy0tLS0tLS0tLS0rCi0JCQkgICB8ICAgfCAgICAgIHwgICB8Ci0JCQkgICB8ICAgfCAgICAgIHwgICB8Ci0JCQkgICArLS0tfC0tLS0tLSsgICB8Ci0JCQkgICB8ICAgICAgICAgRHwKLQkJCSAgICstLS0tLS0tLS0tKyAqLworCQkJICogfFMgICAgICAgICB8CisJCQkgKiB8ICAgKy0tLS0tLS0tLS0rCisJCQkgKiB8ICAgfCAgICAgIHwgICB8CisJCQkgKiB8ICAgfCAgICAgIHwgICB8CisJCQkgKiArLS0tfC0tLS0tLSsgICB8CisJCQkgKiB8ICAgICAgICAgRHwKKwkJCSAqICstLS0tLS0tLS0tKworCQkJICovCiAKIAkJCW5EaXJlY3Rpb24gPSBCT1RUT01fVE9fVE9QOwogCQl9IGVsc2UgaWYgKHN5ID4gZHkpIHsKIAkJCS8qICstLS0tLS0tLS0tKwotCQkJICAgfEQgICAgICAgICB8Ci0JCQkgICB8ICAgKy0tLS0tLS0tLS0rCi0JCQkgICB8ICAgfCAgICAgIHwgICB8Ci0JCQkgICB8ICAgfCAgICAgIHwgICB8Ci0JCQkgICArLS0tfC0tLS0tLSsgICB8Ci0JCQkgICB8ICAgICAgICAgU3wKLQkJCSAgICstLS0tLS0tLS0tKyAqLworCQkJICogfEQgICAgICAgICB8CisJCQkgKiB8ICAgKy0tLS0tLS0tLS0rCisJCQkgKiB8ICAgfCAgICAgIHwgICB8CisJCQkgKiB8ICAgfCAgICAgIHwgICB8CisJCQkgKiArLS0tfC0tLS0tLSsgICB8CisJCQkgKiB8ICAgICAgICAgU3wKKwkJCSAqICstLS0tLS0tLS0tKworCQkJICovCiAKIAkJCW5EaXJlY3Rpb24gPSBUT1BfVE9fQk9UVE9NOwogCQl9IGVsc2UgewpAQCAtMTc3LDIyICsxODEsMjQgQEAKIAogCQkJaWYgKHN4IDw9IGR4KSB7CiAJCQkJLyogKy0tLS0tLSstLS0rLS0tLS0tKwotCQkJCSAgIHxTICAgICB8ICAgfCAgICAgRHwKLQkJCQkgICB8ICAgICAgfCAgIHwgICAgICB8Ci0JCQkJICAgfCAgICAgIHwgICB8ICAgICAgfAotCQkJCSAgIHwgICAgICB8ICAgfCAgICAgIHwKLQkJCQkgICArLS0tLS0tKy0tLSstLS0tLS0rICovCisJCQkJICogfFMgICAgIHwgICB8ICAgICBEfAorCQkJCSAqIHwgICAgICB8ICAgfCAgICAgIHwKKwkJCQkgKiB8ICAgICAgfCAgIHwgICAgICB8CisJCQkJICogfCAgICAgIHwgICB8ICAgICAgfAorCQkJCSAqICstLS0tLS0rLS0tKy0tLS0tLSsKKwkJCQkgKi8KIAogCQkJCW5EaXJlY3Rpb24gPSBSSUdIVF9UT19MRUZUOwogCQkJfSBlbHNlIHsKIAkJCS8qIHN4ID4gZHggKi8KIAogCQkJCS8qICstLS0tLS0rLS0tKy0tLS0tLSsKLQkJCQkgICB8RCAgICAgfCAgIHwgICAgIFN8Ci0JCQkJICAgfCAgICAgIHwgICB8ICAgICAgfAotCQkJCSAgIHwgICAgICB8ICAgfCAgICAgIHwKLQkJCQkgICB8ICAgICAgfCAgIHwgICAgICB8Ci0JCQkJICAgKy0tLS0tLSstLS0rLS0tLS0tKyAqLworCQkJCSAqIHxEICAgICB8ICAgfCAgICAgU3wKKwkJCQkgKiB8ICAgICAgfCAgIHwgICAgICB8CisJCQkJICogfCAgICAgIHwgICB8ICAgICAgfAorCQkJCSAqIHwgICAgICB8ICAgfCAgICAgIHwKKwkJCQkgKiArLS0tLS0tKy0tLSstLS0tLS0rCisJCQkJICovCiAKIAkJCQluRGlyZWN0aW9uID0gTEVGVF9UT19SSUdIVDsKIAkJCX0KQEAgLTIwOCwzMiArMjE0LDM2IEBACiAJfQogCiAJLyogTm90ZToKLQkgICBERV9GT1JFR1JPVU5EIGFyZSBERV9CQUNLR1JPVU5EIGFyZSBkb24ndCBjYXJlLgotCSAgREVfQ09MT1JfQ09NUEFSRSBhbmQgREVfQ09MT1JfQ09NUEFSRV9NQUtTIGFyZSBzZXQgYnkgc2V0IGRlU2V0VHJhbnNwYXJlbmN5KCkuCisJICogREVfRk9SRUdST1VORCBhcmUgREVfQkFDS0dST1VORCBhcmUgZG9uJ3QgY2FyZS4KKwkgKiBERV9DT0xPUl9DT01QQVJFIGFuZCBERV9DT0xPUl9DT01QQVJFX01BS1MKKwkgKiBhcmUgc2V0IGJ5IHNldCBkZVNldFRyYW5zcGFyZW5jeSgpLgogCSAqLwogCiAJLyogMkQgU291cmNlIEJhc2UuCi0JIEl0IGlzIGFuIGFkZHJlc3Mgb2Zmc2V0ICgxMjggYml0IGFsaWduZWQpIGZyb20gdGhlIGJlZ2lubmluZyBvZiBmcmFtZSBidWZmZXIuCisJICogSXQgaXMgYW4gYWRkcmVzcyBvZmZzZXQgKDEyOCBiaXQgYWxpZ25lZCkKKwkgKiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgZnJhbWUgYnVmZmVyLgogCSAqLwogCXdyaXRlX2RwcihhY2NlbCwgREVfV0lORE9XX1NPVVJDRV9CQVNFLCBzQmFzZSk7IC8qIGRwcjQwICovCiAKIAkvKiAyRCBEZXN0aW5hdGlvbiBCYXNlLgotCSBJdCBpcyBhbiBhZGRyZXNzIG9mZnNldCAoMTI4IGJpdCBhbGlnbmVkKSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgZnJhbWUgYnVmZmVyLgorCSAqIEl0IGlzIGFuIGFkZHJlc3Mgb2Zmc2V0ICgxMjggYml0IGFsaWduZWQpCisJICogZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGZyYW1lIGJ1ZmZlci4KIAkgKi8KIAl3cml0ZV9kcHIoYWNjZWwsIERFX1dJTkRPV19ERVNUSU5BVElPTl9CQVNFLCBkQmFzZSk7IC8qIGRwcjQ0ICovCiAKICAgICAvKiBQcm9ncmFtIHBpdGNoIChkaXN0YW5jZSBiZXR3ZWVuIHRoZSAxc3QgcG9pbnRzIG9mIHR3byBhZGphY2VudCBsaW5lcykuCi0gICAgICAgTm90ZSB0aGF0IGlucHV0IHBpdGNoIGlzIEJZVEUgdmFsdWUsIGJ1dCB0aGUgMkQgUGl0Y2ggcmVnaXN0ZXIgdXNlcwotICAgICAgIHBpeGVsIHZhbHVlcy4gTmVlZCBCeXRlIHRvIHBpeGVsIGNvbnZlcnNpb24uCi0gICAgKi8KKyAgICAgKiBOb3RlIHRoYXQgaW5wdXQgcGl0Y2ggaXMgQllURSB2YWx1ZSwgYnV0IHRoZSAyRCBQaXRjaCByZWdpc3RlciB1c2VzCisgICAgICogcGl4ZWwgdmFsdWVzLiBOZWVkIEJ5dGUgdG8gcGl4ZWwgY29udmVyc2lvbi4KKyAgICAgKi8KIAl3cml0ZV9kcHIoYWNjZWwsIERFX1BJVENILAogCQkgICgoZFBpdGNoIC8gQnBwIDw8IERFX1BJVENIX0RFU1RJTkFUSU9OX1NISUZUKSAmCiAJCSAgIERFX1BJVENIX0RFU1RJTkFUSU9OX01BU0spIHwKIAkJICAoc1BpdGNoIC8gQnBwICYgREVfUElUQ0hfU09VUkNFX01BU0spKTsgLyogZHByMTAgKi8KIAogICAgIC8qIFNjcmVlbiBXaW5kb3cgd2lkdGggaW4gUGl4ZWxzLgotICAgICAgIDJEIGVuZ2luZSB1c2VzIHRoaXMgdmFsdWUgdG8gY2FsY3VsYXRlIHRoZSBsaW5lYXIgYWRkcmVzcyBpbiBmcmFtZSBidWZmZXIgZm9yIGEgZ2l2ZW4gcG9pbnQuCi0gICAgKi8KKyAgICAgKiAyRCBlbmdpbmUgdXNlcyB0aGlzIHZhbHVlIHRvIGNhbGN1bGF0ZSB0aGUgbGluZWFyIGFkZHJlc3MgaW4gZnJhbWUgYnVmZmVyCisgICAgICogZm9yIGEgZ2l2ZW4gcG9pbnQuCisgICAgICovCiAJd3JpdGVfZHByKGFjY2VsLCBERV9XSU5ET1dfV0lEVEgsCiAJCSAgKChkUGl0Y2ggLyBCcHAgPDwgREVfV0lORE9XX1dJRFRIX0RTVF9TSElGVCkgJgogCQkgICBERV9XSU5ET1dfV0lEVEhfRFNUX01BU0spIHwKQEAgLTMwNywzMyArMzE3LDM3IEBACiAJCXJldHVybiAtMTsKIAogCS8qIDJEIFNvdXJjZSBCYXNlLgotCSBVc2UgMCBmb3IgSE9TVCBCbHQuCisJICogVXNlIDAgZm9yIEhPU1QgQmx0LgogCSAqLwogCXdyaXRlX2RwcihhY2NlbCwgREVfV0lORE9XX1NPVVJDRV9CQVNFLCAwKTsKIAogCS8qIDJEIERlc3RpbmF0aW9uIEJhc2UuCi0JIEl0IGlzIGFuIGFkZHJlc3Mgb2Zmc2V0ICgxMjggYml0IGFsaWduZWQpIGZyb20gdGhlIGJlZ2lubmluZyBvZiBmcmFtZSBidWZmZXIuCisJICogSXQgaXMgYW4gYWRkcmVzcyBvZmZzZXQgKDEyOCBiaXQgYWxpZ25lZCkKKwkgKiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgZnJhbWUgYnVmZmVyLgogCSAqLwogCXdyaXRlX2RwcihhY2NlbCwgREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0UsIGRCYXNlKTsKICAgICAvKiBQcm9ncmFtIHBpdGNoIChkaXN0YW5jZSBiZXR3ZWVuIHRoZSAxc3QgcG9pbnRzIG9mIHR3byBhZGphY2VudCBsaW5lcykuCi0gICAgICAgTm90ZSB0aGF0IGlucHV0IHBpdGNoIGlzIEJZVEUgdmFsdWUsIGJ1dCB0aGUgMkQgUGl0Y2ggcmVnaXN0ZXIgdXNlcwotICAgICAgIHBpeGVsIHZhbHVlcy4gTmVlZCBCeXRlIHRvIHBpeGVsIGNvbnZlcnNpb24uCi0gICAgKi8KKyAgICAgKiBOb3RlIHRoYXQgaW5wdXQgcGl0Y2ggaXMgQllURSB2YWx1ZSwgYnV0IHRoZSAyRCBQaXRjaCByZWdpc3RlciB1c2VzCisgICAgICogcGl4ZWwgdmFsdWVzLiBOZWVkIEJ5dGUgdG8gcGl4ZWwgY29udmVyc2lvbi4KKyAgICAgKi8KIAl3cml0ZV9kcHIoYWNjZWwsIERFX1BJVENILAogCQkgICgoZFBpdGNoIC8gYnl0ZVBlclBpeGVsIDw8IERFX1BJVENIX0RFU1RJTkFUSU9OX1NISUZUKSAmCiAJCSAgIERFX1BJVENIX0RFU1RJTkFUSU9OX01BU0spIHwKIAkJICAoZFBpdGNoIC8gYnl0ZVBlclBpeGVsICYgREVfUElUQ0hfU09VUkNFX01BU0spKTsgLyogZHByMTAgKi8KIAogCS8qIFNjcmVlbiBXaW5kb3cgd2lkdGggaW4gUGl4ZWxzLgotCSAyRCBlbmdpbmUgdXNlcyB0aGlzIHZhbHVlIHRvIGNhbGN1bGF0ZSB0aGUgbGluZWFyIGFkZHJlc3MgaW4gZnJhbWUgYnVmZmVyIGZvciBhIGdpdmVuIHBvaW50LgorCSAqIDJEIGVuZ2luZSB1c2VzIHRoaXMgdmFsdWUgdG8gY2FsY3VsYXRlIHRoZSBsaW5lYXIgYWRkcmVzcworCSAqIGluIGZyYW1lIGJ1ZmZlciBmb3IgYSBnaXZlbiBwb2ludC4KIAkgKi8KIAl3cml0ZV9kcHIoYWNjZWwsIERFX1dJTkRPV19XSURUSCwKIAkJICAoKGRQaXRjaCAvIGJ5dGVQZXJQaXhlbCA8PCBERV9XSU5ET1dfV0lEVEhfRFNUX1NISUZUKSAmCiAJCSAgIERFX1dJTkRPV19XSURUSF9EU1RfTUFTSykgfAogCQkgIChkUGl0Y2ggLyBieXRlUGVyUGl4ZWwgJiBERV9XSU5ET1dfV0lEVEhfU1JDX01BU0spKTsKIAotCSAvKiBOb3RlOiBGb3IgMkQgU291cmNlIGluIEhvc3QgV3JpdGUsIG9ubHkgWF9LMV9NT05PIGZpZWxkIGlzIG5lZWRlZCwgYW5kIFlfSzIgZmllbGQgaXMgbm90IHVzZWQuCi0JICAgIEZvciBtb25vIGJpdG1hcCwgdXNlIHN0YXJ0Qml0IGZvciBYX0sxLiAqLworCSAvKiBOb3RlOiBGb3IgMkQgU291cmNlIGluIEhvc3QgV3JpdGUsIG9ubHkgWF9LMV9NT05PIGZpZWxkIGlzIG5lZWRlZCwKKwkgICogYW5kIFlfSzIgZmllbGQgaXMgbm90IHVzZWQuCisJICAqIEZvciBtb25vIGJpdG1hcCwgdXNlIHN0YXJ0Qml0IGZvciBYX0sxLgorCSAgKi8KIAl3cml0ZV9kcHIoYWNjZWwsIERFX1NPVVJDRSwKIAkJICAoc3RhcnRCaXQgPDwgREVfU09VUkNFX1hfSzFfU0hJRlQpICYKIAkJICBERV9TT1VSQ0VfWF9LMV9NT05PX01BU0spOyAvKiBkcHIwMCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTBfaHcuYyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwX2h3LmMKaW5kZXggMmRhZWVkZC4uN2RkMjA4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTBfaHcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MF9ody5jCkBAIC0zNSwxNyArMzUsMTcgQEAKIAlwcl9pbmZvKCJtbWlvIHBoeUFkZHIgPSAlbHhcbiIsIHNtNzUwX2Rldi0+dmlkcmVnX3N0YXJ0KTsKIAogCS8qIHJlc2VydmUgdGhlIHZpZHJlZyBzcGFjZSBvZiBzbWkgYWRhcHRvcgotCSAqIGlmIHlvdSBkbyB0aGlzLCB1IG5lZWQgdG8gYWRkIHJlbGVhc2UgcmVnaW9uIGNvZGUKKwkgKiBpZiB5b3UgZG8gdGhpcywgeW91IG5lZWQgdG8gYWRkIHJlbGVhc2UgcmVnaW9uIGNvZGUKIAkgKiBpbiBseW54ZmJfcmVtb3ZlLCBvciBtZW1vcnkgd2lsbCBub3QgYmUgbWFwcGVkIGFnYWluCiAJICogc3VjY2Vzc2Z1bGx5Ci0JICogKi8KKwkgKi8KIAlyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgMSwgInNtNzUwZmIiKTsKIAlpZiAocmV0KSB7CiAJCXByX2VycigiQ2FuIG5vdCByZXF1ZXN0IFBDSSByZWdpb25zLlxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKLQkvKiBub3cgbWFwIG1taW8gYW5kIHZpZG1lbSovCisJLyogbm93IG1hcCBtbWlvIGFuZCB2aWRtZW0gKi8KIAlzbTc1MF9kZXYtPnB2UmVnID0gaW9yZW1hcF9ub2NhY2hlKHNtNzUwX2Rldi0+dmlkcmVnX3N0YXJ0LAogCQkJCQkgICBzbTc1MF9kZXYtPnZpZHJlZ19zaXplKTsKIAlpZiAoIXNtNzUwX2Rldi0+cHZSZWcpIHsKQEAgLTU2LDcgKzU2LDYgQEAKIAkJcHJfaW5mbygibW1pbyB2aXJ0dWFsIGFkZHIgPSAlcFxuIiwgc203NTBfZGV2LT5wdlJlZyk7CiAJfQogCi0KIAlzbTc1MF9kZXYtPmFjY2VsLmRwckJhc2UgPSBzbTc1MF9kZXYtPnB2UmVnICsgREVfQkFTRV9BRERSX1RZUEUxOwogCXNtNzUwX2Rldi0+YWNjZWwuZHBQb3J0QmFzZSA9IHNtNzUwX2Rldi0+cHZSZWcgKyBERV9QT1JUX0FERFJfVFlQRTE7CiAKQEAgLTY0LDEwICs2MywxMCBAQAogCiAJc203NTBfZGV2LT52aWRtZW1fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CiAJLyogZG9uJ3QgdXNlIHBkZXZfcmVzb3VyY2VbeF0uZW5kIC0gcmVzb3VyY2VbeF0uc3RhcnQgdG8KLQkgKiBjYWxjdWxhdGUgdGhlIHJlc291cmNlIHNpemUsaXRzIG9ubHkgdGhlIG1heGltdW0gYXZhaWxhYmxlCi0JICogc2l6ZSBidXQgbm90IHRoZSBhY3R1YWwgc2l6ZSx1c2UKKwkgKiBjYWxjdWxhdGUgdGhlIHJlc291cmNlIHNpemUsIGl0J3Mgb25seSB0aGUgbWF4aW11bSBhdmFpbGFibGUKKwkgKiBzaXplIGJ1dCBub3QgdGhlIGFjdHVhbCBzaXplLCB1c2luZwogCSAqIEBkZGs3NTBfZ2V0Vk1TaXplIGZ1bmN0aW9uIGNhbiBiZSBzYWZlLgotCSAqICovCisJICovCiAJc203NTBfZGV2LT52aWRtZW1fc2l6ZSA9IGRkazc1MF9nZXRWTVNpemUoKTsKIAlwcl9pbmZvKCJ2aWRlbyBtZW1vcnkgcGh5QWRkciA9ICVseCwgc2l6ZSA9ICV1IGJ5dGVzXG4iLAogCQlzbTc1MF9kZXYtPnZpZG1lbV9zdGFydCwgc203NTBfZGV2LT52aWRtZW1fc2l6ZSk7CkBAIC04NiwzMyArODUsMzEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0KLQogaW50IGh3X3NtNzUwX2luaXRodyhzdHJ1Y3Qgc203NTBfZGV2ICpzbTc1MF9kZXYsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCBpbml0X3N0YXR1cyAqcGFybTsKIAogCXBhcm0gPSAmc203NTBfZGV2LT5pbml0UGFybTsKIAlpZiAocGFybS0+Y2hpcF9jbGsgPT0gMCkKLQkJcGFybS0+Y2hpcF9jbGsgPSAoZ2V0Q2hpcFR5cGUoKSA9PSBTTTc1MExFKSA/CisJCXBhcm0tPmNoaXBfY2xrID0gKHNtNzUwX2dldF9jaGlwX3R5cGUoKSA9PSBTTTc1MExFKSA/CiAJCQkJCQlERUZBVUxUX1NNNzUwTEVfQ0hJUF9DTE9DSyA6CiAJCQkJCQlERUZBVUxUX1NNNzUwX0NISVBfQ0xPQ0s7CiAKIAlpZiAocGFybS0+bWVtX2NsayA9PSAwKQogCQlwYXJtLT5tZW1fY2xrID0gcGFybS0+Y2hpcF9jbGs7CiAJaWYgKHBhcm0tPm1hc3Rlcl9jbGsgPT0gMCkKLQkJcGFybS0+bWFzdGVyX2NsayA9IHBhcm0tPmNoaXBfY2xrLzM7CisJCXBhcm0tPm1hc3Rlcl9jbGsgPSBwYXJtLT5jaGlwX2NsayAvIDM7CiAKIAlkZGs3NTBfaW5pdEh3KChpbml0Y2hpcF9wYXJhbV90ICopJnNtNzUwX2Rldi0+aW5pdFBhcm0pOwotCS8qIGZvciBzbTcxOCxvcGVuIHBjaSBidXJzdCAqLworCS8qIGZvciBzbTcxOCwgb3BlbiBwY2kgYnVyc3QgKi8KIAlpZiAoc203NTBfZGV2LT5kZXZpZCA9PSAweDcxOCkgewogCQlQT0tFMzIoU1lTVEVNX0NUUkwsCiAJCSAgICAgICBQRUVLMzIoU1lTVEVNX0NUUkwpIHwgU1lTVEVNX0NUUkxfUENJX0JVUlNUKTsKIAl9CiAKLQlpZiAoZ2V0Q2hpcFR5cGUoKSAhPSBTTTc1MExFKSB7CisJaWYgKHNtNzUwX2dldF9jaGlwX3R5cGUoKSAhPSBTTTc1MExFKSB7CiAJCXVuc2lnbmVkIGludCB2YWw7Ci0JCS8qIGRvZXMgdXNlciBuZWVkIENSVCA/Ki8KKwkJLyogZG9lcyB1c2VyIG5lZWQgQ1JUPyAqLwogCQlpZiAoc203NTBfZGV2LT5ub2NydCkgewogCQkJUE9LRTMyKE1JU0NfQ1RSTCwKIAkJCSAgICAgICBQRUVLMzIoTUlTQ19DVFJMKSB8IE1JU0NfQ1RSTF9EQUNfUE9XRVJfT0ZGKTsKQEAgLTE0NCwxOSArMTQxLDIxIEBACiAJCX0KIAkJUE9LRTMyKFBBTkVMX0RJU1BMQVlfQ1RSTCwgdmFsKTsKIAl9IGVsc2UgewotCQkvKiBmb3IgNzUwTEUgLG5vIERWSSBjaGlwIGluaXRpYWxpemF0aW9uIG1ha2VzIE1vbml0b3Igbm8gc2lnbmFsICovCi0JCS8qIFNldCB1cCBHUElPIGZvciBzb2Z0d2FyZSBJMkMgdG8gcHJvZ3JhbSBEVkkgY2hpcCBpbiB0aGUKLQkJICAgWGlsaW54IFNQNjA1IGJvYXJkLCBpbiBvcmRlciB0byBoYXZlIHZpZGVvIHNpZ25hbC4KKwkJLyogZm9yIDc1MExFLCBubyBEVkkgY2hpcCBpbml0aWFsaXphdGlvbgorCQkgKiBtYWtlcyBNb25pdG9yIG5vIHNpZ25hbAorCQkgKgorCQkgKiBTZXQgdXAgR1BJTyBmb3Igc29mdHdhcmUgSTJDIHRvIHByb2dyYW0gRFZJIGNoaXAgaW4gdGhlCisJCSAqIFhpbGlueCBTUDYwNSBib2FyZCwgaW4gb3JkZXIgdG8gaGF2ZSB2aWRlbyBzaWduYWwuCiAJCSAqLwogCQlzbTc1MF9zd19pMmNfaW5pdCgwLCAxKTsKIAogCQkvKiBDdXN0b21lciBtYXkgTk9UIHVzZSBDSDczMDEgRFZJIGNoaXAsIHdoaWNoIGhhcyB0byBiZQotCQlpbml0aWFsaXplZCBkaWZmZXJlbnRseS4KLQkJKi8KKwkJICogaW5pdGlhbGl6ZWQgZGlmZmVyZW50bHkuCisJCSAqLwogCQlpZiAoc203NTBfc3dfaTJjX3JlYWRfcmVnKDB4ZWMsIDB4NGEpID09IDB4OTUpIHsKIAkJLyogVGhlIGZvbGxvd2luZyByZWdpc3RlciB2YWx1ZXMgZm9yIENINzMwMSBhcmUgZnJvbQotCQkgICBDaHJvbnRlbCBhcHAgbm90ZSBhbmQgb3VyIGV4cGVyaW1lbnQuCi0JCSovCisJCSAqIENocm9udGVsIGFwcCBub3RlIGFuZCBvdXIgZXhwZXJpbWVudC4KKwkJICovCiAJCQlwcl9pbmZvKCJ5ZXMsQ0g3MzAxIERWSSBjaGlwIGZvdW5kXG4iKTsKIAkJCXNtNzUwX3N3X2kyY193cml0ZV9yZWcoMHhlYywgMHgxZCwgMHgxNik7CiAJCQlzbTc1MF9zd19pMmNfd3JpdGVfcmVnKDB4ZWMsIDB4MjEsIDB4OSk7CkBAIC0xNzMsNyArMTcyLDggQEAKIH0KIAogaW50IGh3X3NtNzUwX291dHB1dF9zZXRNb2RlKHN0cnVjdCBseW54ZmJfb3V0cHV0ICpvdXRwdXQsCi0JCQkJCQkJCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvICpmaXgpCisJCQkgICAgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkgICAgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvICpmaXgpCiB7CiAJaW50IHJldDsKIAlkaXNwX291dHB1dF90IGRpc3BTZXQ7CkBAIC0xODMsOCArMTgzLDcgQEAKIAlkaXNwU2V0ID0gMDsKIAljaGFubmVsID0gKm91dHB1dC0+Y2hhbm5lbDsKIAotCi0JaWYgKGdldENoaXBUeXBlKCkgIT0gU003NTBMRSkgeworCWlmIChzbTc1MF9nZXRfY2hpcF90eXBlKCkgIT0gU003NTBMRSkgewogCQlpZiAoY2hhbm5lbCA9PSBzbTc1MF9wcmltYXJ5KSB7CiAJCQlwcl9pbmZvKCJwcmltYXJ5IGNoYW5uZWxcbiIpOwogCQkJaWYgKG91dHB1dC0+cGF0aHMgJiBzbTc1MF9wYW5lbCkKQEAgLTE5OCwxMSArMTk3LDEwIEBACiAJCQkJZGlzcFNldCB8PSBkb19MQ0QxX1NFQzsKIAkJCWlmIChvdXRwdXQtPnBhdGhzICYgc203NTBfY3J0KQogCQkJCWRpc3BTZXQgfD0gZG9fQ1JUX1NFQzsKLQogCQl9CiAJCWRkazc1MF9zZXRMb2dpY2FsRGlzcE91dChkaXNwU2V0KTsKIAl9IGVsc2UgewotCQkvKiBqdXN0IG9wZW4gRElTUExBWV9DT05UUk9MXzc1MExFIHJlZ2lzdGVyIGJpdCAzOjAqLworCQkvKiBqdXN0IG9wZW4gRElTUExBWV9DT05UUk9MXzc1MExFIHJlZ2lzdGVyIGJpdCAzOjAgKi8KIAkJdTMyIHJlZzsKIAogCQlyZWcgPSBQRUVLMzIoRElTUExBWV9DT05UUk9MXzc1MExFKTsKQEAgLTIxNCw3ICsyMTIsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBod19zbTc1MF9jcnRjX2NoZWNrTW9kZShzdHJ1Y3QgbHlueGZiX2NydGMgKmNydGMsIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQoraW50IGh3X3NtNzUwX2NydGNfY2hlY2tNb2RlKHN0cnVjdCBseW54ZmJfY3J0YyAqY3J0YywKKwkJCSAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKIHsKIAlzdHJ1Y3Qgc203NTBfZGV2ICpzbTc1MF9kZXY7CiAJc3RydWN0IGx5bnhmYl9wYXIgKnBhciA9IGNvbnRhaW5lcl9vZihjcnRjLCBzdHJ1Y3QgbHlueGZiX3BhciwgY3J0Yyk7CkBAIC0yMzMsMTkgKzIzMiwxNSBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKLQogCX0KIAogCXJldHVybiAwOwogfQogCi0KLS8qCi0Jc2V0IHRoZSBjb250cm9sbGVyJ3MgbW9kZSBmb3IgQGNydGMgY2hhcmdlZCB3aXRoIEB2YXIgYW5kIEBmaXggcGFyYW1ldGVycwotKi8KKy8qIHNldCB0aGUgY29udHJvbGxlcidzIG1vZGUgZm9yIEBjcnRjIGNoYXJnZWQgd2l0aCBAdmFyIGFuZCBAZml4IHBhcmFtZXRlcnMgKi8KIGludCBod19zbTc1MF9jcnRjX3NldE1vZGUoc3RydWN0IGx5bnhmYl9jcnRjICpjcnRjLAotCQkJCQkJCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKLQkJCQkJCQkJc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvICpmaXgpCisJCQkgIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAorCQkJICBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCkKIHsKIAlpbnQgcmV0LCBmbXQ7CiAJdTMyIHJlZzsKQEAgLTI1NCw3ICsyNDksNiBAQAogCXN0cnVjdCBzbTc1MF9kZXYgKnNtNzUwX2RldjsKIAlzdHJ1Y3QgbHlueGZiX3BhciAqcGFyOwogCi0KIAlyZXQgPSAwOwogCXBhciA9IGNvbnRhaW5lcl9vZihjcnRjLCBzdHJ1Y3QgbHlueGZiX3BhciwgY3J0Yyk7CiAJc203NTBfZGV2ID0gcGFyLT5kZXY7CkBAIC0yNzgsMTcgKzI3MiwyMiBAQAogCiAJLyogc2V0IHRpbWluZyAqLwogCW1vZHBhcm0ucGl4ZWxfY2xvY2sgPSBwc190b19oeih2YXItPnBpeGNsb2NrKTsKLQltb2RwYXJtLnZlcnRpY2FsX3N5bmNfcG9sYXJpdHkgPSAodmFyLT5zeW5jICYgRkJfU1lOQ19IT1JfSElHSF9BQ1QpID8gUE9TOk5FRzsKLQltb2RwYXJtLmhvcml6b250YWxfc3luY19wb2xhcml0eSA9ICh2YXItPnN5bmMgJiBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QpID8gUE9TOk5FRzsKLQltb2RwYXJtLmNsb2NrX3BoYXNlX3BvbGFyaXR5ID0gKHZhci0+c3luYyAmIEZCX1NZTkNfQ09NUF9ISUdIX0FDVCkgPyBQT1M6TkVHOworCW1vZHBhcm0udmVydGljYWxfc3luY19wb2xhcml0eSA9ICh2YXItPnN5bmMgJiBGQl9TWU5DX0hPUl9ISUdIX0FDVCkKKwkJCQkJID8gUE9TIDogTkVHOworCW1vZHBhcm0uaG9yaXpvbnRhbF9zeW5jX3BvbGFyaXR5ID0gKHZhci0+c3luYyAmIEZCX1NZTkNfVkVSVF9ISUdIX0FDVCkKKwkJCQkJICAgPyBQT1MgOiBORUc7CisJbW9kcGFybS5jbG9ja19waGFzZV9wb2xhcml0eSA9ICh2YXItPnN5bmMgJiBGQl9TWU5DX0NPTVBfSElHSF9BQ1QpCisJCQkJICAgICAgID8gUE9TIDogTkVHOwogCW1vZHBhcm0uaG9yaXpvbnRhbF9kaXNwbGF5X2VuZCA9IHZhci0+eHJlczsKIAltb2RwYXJtLmhvcml6b250YWxfc3luY193aWR0aCA9IHZhci0+aHN5bmNfbGVuOwogCW1vZHBhcm0uaG9yaXpvbnRhbF9zeW5jX3N0YXJ0ID0gdmFyLT54cmVzICsgdmFyLT5yaWdodF9tYXJnaW47Ci0JbW9kcGFybS5ob3Jpem9udGFsX3RvdGFsID0gdmFyLT54cmVzICsgdmFyLT5sZWZ0X21hcmdpbiArIHZhci0+cmlnaHRfbWFyZ2luICsgdmFyLT5oc3luY19sZW47CisJbW9kcGFybS5ob3Jpem9udGFsX3RvdGFsID0gdmFyLT54cmVzICsgdmFyLT5sZWZ0X21hcmdpbiArCisJCQkJICAgdmFyLT5yaWdodF9tYXJnaW4gKyB2YXItPmhzeW5jX2xlbjsKIAltb2RwYXJtLnZlcnRpY2FsX2Rpc3BsYXlfZW5kID0gdmFyLT55cmVzOwogCW1vZHBhcm0udmVydGljYWxfc3luY19oZWlnaHQgPSB2YXItPnZzeW5jX2xlbjsKIAltb2RwYXJtLnZlcnRpY2FsX3N5bmNfc3RhcnQgPSB2YXItPnlyZXMgKyB2YXItPmxvd2VyX21hcmdpbjsKLQltb2RwYXJtLnZlcnRpY2FsX3RvdGFsID0gdmFyLT55cmVzICsgdmFyLT51cHBlcl9tYXJnaW4gKyB2YXItPmxvd2VyX21hcmdpbiArIHZhci0+dnN5bmNfbGVuOworCW1vZHBhcm0udmVydGljYWxfdG90YWwgPSB2YXItPnlyZXMgKyB2YXItPnVwcGVyX21hcmdpbiArCisJCQkJIHZhci0+bG93ZXJfbWFyZ2luICsgdmFyLT52c3luY19sZW47CiAKIAkvKiBjaG9vc2UgcGxsICovCiAJaWYgKGNydGMtPmNoYW5uZWwgIT0gc203NTBfc2Vjb25kYXJ5KQpAQCAtMzA0LDEyICszMDMsMTQgQEAKIAl9CiAKIAlpZiAoY3J0Yy0+Y2hhbm5lbCAhPSBzbTc1MF9zZWNvbmRhcnkpIHsKLQkJLyogc2V0IHBpdGNoLCBvZmZzZXQgLHdpZHRoLHN0YXJ0IGFkZHJlc3MgLGV0Yy4uLiAqLworCQkvKiBzZXQgcGl0Y2gsIG9mZnNldCwgd2lkdGgsIHN0YXJ0IGFkZHJlc3MsIGV0Yy4uLiAqLwogCQlQT0tFMzIoUEFORUxfRkJfQUREUkVTUywKIAkJICAgICAgIGNydGMtPm9TY3JlZW4gJiBQQU5FTF9GQl9BRERSRVNTX0FERFJFU1NfTUFTSyk7CiAKIAkJcmVnID0gdmFyLT54cmVzICogKHZhci0+Yml0c19wZXJfcGl4ZWwgPj4gMyk7Ci0JCS8qIGNydGMtPmNoYW5uZWwgaXMgbm90IGVxdWFsIHRvIHBhci0+aW5kZXggb24gbnVtZXJpYyxiZSBhd2FyZSBvZiB0aGF0ICovCisJCS8qIGNydGMtPmNoYW5uZWwgaXMgbm90IGVxdWFsIHRvIHBhci0+aW5kZXggb24gbnVtZXJpYywKKwkJICogYmUgYXdhcmUgb2YgdGhhdAorCQkgKi8KIAkJcmVnID0gQUxJR04ocmVnLCBjcnRjLT5saW5lX3BhZCk7CiAJCXJlZyA9IChyZWcgPDwgUEFORUxfRkJfV0lEVEhfV0lEVEhfU0hJRlQpICYKIAkJICAgICAgIFBBTkVMX0ZCX1dJRFRIX1dJRFRIX01BU0s7CkBAIC0zMjEsOCArMzIyLDggQEAKIAkJcmVnIHw9ICh2YXItPnhvZmZzZXQgJiBQQU5FTF9XSU5ET1dfV0lEVEhfWF9NQVNLKTsKIAkJUE9LRTMyKFBBTkVMX1dJTkRPV19XSURUSCwgcmVnKTsKIAotCQlyZWcgPSAoKHZhci0+eXJlc192aXJ0dWFsIC0gMSkgPDwKLQkJICAgICAgIFBBTkVMX1dJTkRPV19IRUlHSFRfSEVJR0hUX1NISUZUKTsKKwkJcmVnID0gKHZhci0+eXJlc192aXJ0dWFsIC0gMSkgPDwKKwkJICAgICAgUEFORUxfV0lORE9XX0hFSUdIVF9IRUlHSFRfU0hJRlQ7CiAJCXJlZyAmPSBQQU5FTF9XSU5ET1dfSEVJR0hUX0hFSUdIVF9NQVNLOwogCQlyZWcgfD0gKHZhci0+eW9mZnNldCAmIFBBTkVMX1dJTkRPV19IRUlHSFRfWV9NQVNLKTsKIAkJUE9LRTMyKFBBTkVMX1dJTkRPV19IRUlHSFQsIHJlZyk7CkBAIC0zNDEsNyArMzQyLDkgQEAKIAkJLyogbm90IGltcGxlbWVudGVkIG5vdyAqLwogCQlQT0tFMzIoQ1JUX0ZCX0FERFJFU1MsIGNydGMtPm9TY3JlZW4pOwogCQlyZWcgPSB2YXItPnhyZXMgKiAodmFyLT5iaXRzX3Blcl9waXhlbCA+PiAzKTsKLQkJLyogY3J0Yy0+Y2hhbm5lbCBpcyBub3QgZXF1YWwgdG8gcGFyLT5pbmRleCBvbiBudW1lcmljLGJlIGF3YXJlIG9mIHRoYXQgKi8KKwkJLyogY3J0Yy0+Y2hhbm5lbCBpcyBub3QgZXF1YWwgdG8gcGFyLT5pbmRleCBvbiBudW1lcmljLAorCQkgKiBiZSBhd2FyZSBvZiB0aGF0CisJCSAqLwogCQlyZWcgPSBBTElHTihyZWcsIGNydGMtPmxpbmVfcGFkKSA8PCBDUlRfRkJfV0lEVEhfV0lEVEhfU0hJRlQ7CiAJCXJlZyAmPSBDUlRfRkJfV0lEVEhfV0lEVEhfTUFTSzsKIAkJcmVnIHw9IChmaXgtPmxpbmVfbGVuZ3RoICYgQ1JUX0ZCX1dJRFRIX09GRlNFVF9NQVNLKTsKQEAgLTM1MiwyMCArMzU1LDE5IEBACiAJCXJlZyB8PSAoKHZhci0+Yml0c19wZXJfcGl4ZWwgPj4gNCkgJgogCQkJQ1JUX0RJU1BMQVlfQ1RSTF9GT1JNQVRfTUFTSyk7CiAJCVBPS0UzMihDUlRfRElTUExBWV9DVFJMLCByZWcpOwotCiAJfQogCi0KIGV4aXQ6CiAJcmV0dXJuIHJldDsKIH0KIAogaW50IGh3X3NtNzUwX3NldENvbFJlZyhzdHJ1Y3QgbHlueGZiX2NydGMgKmNydGMsIHVzaG9ydCBpbmRleCwKLQkJCQkJCQkJdXNob3J0IHJlZCwgdXNob3J0IGdyZWVuLCB1c2hvcnQgYmx1ZSkKKwkJICAgICAgIHVzaG9ydCByZWQsIHVzaG9ydCBncmVlbiwgdXNob3J0IGJsdWUpCiB7CiAJc3RhdGljIHVuc2lnbmVkIGludCBhZGRbXSA9IHtQQU5FTF9QQUxFVFRFX1JBTSwgQ1JUX1BBTEVUVEVfUkFNfTsKIAotCVBPS0UzMihhZGRbY3J0Yy0+Y2hhbm5lbF0gKyBpbmRleCo0LCAocmVkPDwxNil8KGdyZWVuPDw4KXxibHVlKTsKKwlQT0tFMzIoYWRkW2NydGMtPmNoYW5uZWxdICsgaW5kZXggKiA0LAorCSAgICAgICAocmVkIDw8IDE2KSB8IChncmVlbiA8PCA4KSB8IGJsdWUpOwogCXJldHVybiAwOwogfQogCkBAIC00MTQsNyArNDE2LDkgQEAKIHsKIAl1bnNpZ25lZCBpbnQgZHBtcywgcHBzLCBjcnRkYjsKIAotCWRwbXMgPSBwcHMgPSBjcnRkYiA9IDA7CisJZHBtcyA9IDA7CisJcHBzID0gMDsKKwljcnRkYiA9IDA7CiAKIAlzd2l0Y2ggKGJsYW5rKSB7CiAJY2FzZSBGQl9CTEFOS19VTkJMQU5LOgpAQCAtNDYxLDE0ICs0NjUsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotCiB2b2lkIGh3X3NtNzUwX2luaXRBY2NlbChzdHJ1Y3Qgc203NTBfZGV2ICpzbTc1MF9kZXYpCiB7CiAJdTMyIHJlZzsKIAogCWVuYWJsZTJERW5naW5lKDEpOwogCi0JaWYgKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSkgeworCWlmIChzbTc1MF9nZXRfY2hpcF90eXBlKCkgPT0gU003NTBMRSkgewogCQlyZWcgPSBQRUVLMzIoREVfU1RBVEUxKTsKIAkJcmVnIHw9IERFX1NUQVRFMV9ERV9BQk9SVDsKIAkJUE9LRTMyKERFX1NUQVRFMSwgcmVnKTsKQEAgLTUwOSw3ICs1MTIsNiBAQAogCXJldHVybiAtMTsKIH0KIAotCiBpbnQgaHdfc203NTBfZGVXYWl0KHZvaWQpCiB7CiAJaW50IGkgPSAweDEwMDAwMDAwOwpAQCAtNTI5LDEwICs1MzEsMTAgQEAKIH0KIAogaW50IGh3X3NtNzUwX3Bhbl9kaXNwbGF5KHN0cnVjdCBseW54ZmJfY3J0YyAqY3J0YywKLQljb25zdCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKLQljb25zdCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKKwkJCSBjb25zdCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKKwkJCSBjb25zdCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQl1aW50MzJfdCB0b3RhbDsKKwl1MzIgdG90YWw7CiAJLyogY2hlY2sgcGFyYW1zICovCiAJaWYgKCh2YXItPnhvZmZzZXQgKyB2YXItPnhyZXMgPiB2YXItPnhyZXNfdmlydHVhbCkgfHwKIAkgICAgKHZhci0+eW9mZnNldCArIHZhci0+eXJlcyA+IHZhci0+eXJlc192aXJ0dWFsKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvZGV2c3ludGguYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL2RldnN5bnRoLmMKaW5kZXggODQ5ODk3MS4uNThhYmQxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvZGV2c3ludGguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9kZXZzeW50aC5jCkBAIC0zNCw3ICszNCw3IEBACiAJCXN5bnRoX3dyaXRlKGJ1ZiwgYnl0ZXMpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGVha3VwX2luZm8uc3BpbmxvY2ssIGZsYWdzKTsKIAl9Ci0JcmV0dXJuIChzc2l6ZV90KSBuYnl0ZXM7CisJcmV0dXJuIChzc2l6ZV90KW5ieXRlczsKIH0KIAogc3RhdGljIHNzaXplX3Qgc3BlYWt1cF9maWxlX3JlYWQoc3RydWN0IGZpbGUgKmZwLCBjaGFyIF9fdXNlciAqYnVmLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAva29iamVjdHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL2tvYmplY3RzLmMKaW5kZXggNTI4Y2JkYy4uZTc0NGFhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAva29iamVjdHMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9rb2JqZWN0cy5jCkBAIC0yNTEsNyArMjUxLDcgQEAKIAl9CiAJY3AgKz0gc3ByaW50ZihjcCwgIjAsICVkXG4iLCBLRVlfTUFQX1ZFUik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BlYWt1cF9pbmZvLnNwaW5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIChpbnQpKGNwLWJ1Zik7CisJcmV0dXJuIChpbnQpKGNwIC0gYnVmKTsKIH0KIAogLyoKQEAgLTI4OCw4ICsyODgsOCBAQAogCQljcCA9IHNwa19zMnVjaGFyKGNwLCBjcDEpOwogCQljcDErKzsKIAl9Ci0JaSA9IChpbnQpY3AxWy0yXSsxOwotCWkgKj0gKGludCljcDFbLTFdKzE7CisJaSA9IChpbnQpY3AxWy0yXSArIDE7CisJaSAqPSAoaW50KWNwMVstMV0gKyAxOwogCWkgKz0gMjsgLyogMCBhbmQgbGFzdCBtYXAgdmVyICovCiAJaWYgKGNwMVstM10gIT0gS0VZX01BUF9WRVIgfHwgY3AxWy0xXSA+IDEwIHx8CiAJCQlpK1NISUZUX1RCTF9TSVpFKzQgPj0gc2l6ZW9mKHNwa19rZXlfYnVmKSkgewpAQCAtMzUwLDkgKzM1MCw5IEBACiAJfSBlbHNlIHsKIAkJc2h1dCA9IDA7CiAJfQotCWlmIChjaCY0KQorCWlmIChjaCAmIDQpCiAJCXNodXQgfD0gMHg0MDsKLQlpZiAoY2gmMSkKKwlpZiAoY2ggJiAxKQogCQlzcGtfc2h1dF91cCB8PSBzaHV0OwogCWVsc2UKIAkJc3BrX3NodXRfdXAgJj0gfnNodXQ7CkBAIC00MTEsMTEgKzQxMSwxMyBAQAogCWludCBsZW47CiAJaW50IGJ5dGVzOwogCWNvbnN0IGNoYXIgKnB0ciA9IGJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKCFzeW50aCkKIAkJcmV0dXJuIC1FUEVSTTsKIAogCWxlbiA9IHN0cmxlbihidWYpOworCXNwaW5fbG9ja19pcnFzYXZlKCZzcGVha3VwX2luZm8uc3BpbmxvY2ssIGZsYWdzKTsKIAl3aGlsZSAobGVuID4gMCkgewogCQlieXRlcyA9IG1pbl90KHNpemVfdCwgbGVuLCAyNTApOwogCQlzdHJuY3B5KHRtcCwgcHRyLCBieXRlcyk7CkBAIC00MjUsNiArNDI3LDcgQEAKIAkJcHRyICs9IGJ5dGVzOwogCQlsZW4gLT0gYnl0ZXM7CiAJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwZWFrdXBfaW5mby5zcGlubG9jaywgZmxhZ3MpOwogCXJldHVybiBjb3VudDsKIH0KIApAQCAtOTczLDExICs5NzYsMTEgQEAKICAqIGNyZWF0ZWQgZm9yIHRoZSBhdHRyaWJ1dGVzIHdpdGggdGhlIGRpcmVjdG9yeSBiZWluZyB0aGUgbmFtZSBvZiB0aGUKICAqIGF0dHJpYnV0ZSBncm91cC4KICAqLwotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbWFpbl9hdHRyX2dyb3VwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbWFpbl9hdHRyX2dyb3VwID0gewogCS5hdHRycyA9IG1haW5fYXR0cnMsCiB9OwogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpMThuX2F0dHJfZ3JvdXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpMThuX2F0dHJfZ3JvdXAgPSB7CiAJLmF0dHJzID0gaTE4bl9hdHRycywKIAkubmFtZSA9ICJpMThuIiwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zeW50aC5jIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3ludGguYwppbmRleCA0ZjQ2MmMzLi41NGIyZjM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zeW50aC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3N5bnRoLmMKQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlICJzZXJpYWxpby5oIgogCiAjZGVmaW5lIE1BWFNZTlRIUyAgICAgICAxNiAgICAgIC8qIE1heCBudW1iZXIgb2Ygc3ludGhzIGluIGFycmF5LiAqLwotc3RhdGljIHN0cnVjdCBzcGtfc3ludGggKnN5bnRoc1tNQVhTWU5USFNdOworc3RhdGljIHN0cnVjdCBzcGtfc3ludGggKnN5bnRoc1tNQVhTWU5USFMgKyAxXTsKIHN0cnVjdCBzcGtfc3ludGggKnN5bnRoOwogY2hhciBzcGtfcGl0Y2hfYnVmZlszMl0gPSAiIjsKIHN0YXRpYyBpbnQgbW9kdWxlX3N0YXR1czsKQEAgLTQwNyw3ICs0MDcsNyBAQAogCWlmICghc3BrX3F1aWV0X2Jvb3QpCiAJCXN5bnRoX3ByaW50ZigiJXMgZm91bmRcbiIsIHN5bnRoLT5sb25nX25hbWUpOwogCWlmIChzeW50aC0+YXR0cmlidXRlcy5uYW1lCi0JJiYgc3lzZnNfY3JlYXRlX2dyb3VwKHNwZWFrdXBfa29iaiwgJihzeW50aC0+YXR0cmlidXRlcykpIDwgMCkKKwkmJiBzeXNmc19jcmVhdGVfZ3JvdXAoc3BlYWt1cF9rb2JqLCAmc3ludGgtPmF0dHJpYnV0ZXMpIDwgMCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJc3ludGhfZmxhZ3MgPSBzeW50aC0+ZmxhZ3M7CiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmc3BlYWt1cF9ldmVudCk7CkBAIC00MjksNyArNDI5LDcgQEAKIAlkZWxfdGltZXIoJnRocmVhZF90aW1lcik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BlYWt1cF9pbmZvLnNwaW5sb2NrLCBmbGFncyk7CiAJaWYgKHN5bnRoLT5hdHRyaWJ1dGVzLm5hbWUpCi0JCXN5c2ZzX3JlbW92ZV9ncm91cChzcGVha3VwX2tvYmosICYoc3ludGgtPmF0dHJpYnV0ZXMpKTsKKwkJc3lzZnNfcmVtb3ZlX2dyb3VwKHNwZWFrdXBfa29iaiwgJnN5bnRoLT5hdHRyaWJ1dGVzKTsKIAlmb3IgKHZhciA9IHN5bnRoLT52YXJzOyB2YXItPnZhcl9pZCAhPSBNQVhWQVJTOyB2YXIrKykKIAkJc3BlYWt1cF91bnJlZ2lzdGVyX3Zhcih2YXItPnZhcl9pZCk7CiAJc3BrX3N0b3Bfc2VyaWFsX2ludGVycnVwdCgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvdmFyaGFuZGxlcnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3ZhcmhhbmRsZXJzLmMKaW5kZXggZTEzOTNkMi4uMjExODZlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvdmFyaGFuZGxlcnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC92YXJoYW5kbGVycy5jCkBAIC0yNzYsNyArMjc2LDcgQEAKIAl1X2NoYXIgKmNwOwogCXNob3J0IG1hc2sgPSBzcGtfcHVuY19pbmZvW3doaWNoXS5tYXNrOwogCi0JaWYgKGhvdyYxKSB7CisJaWYgKGhvdyAmIDEpIHsKIAkJZm9yIChjcCA9ICh1X2NoYXIgKilzcGtfcHVuY19pbmZvWzNdLnZhbHVlOyAqY3A7IGNwKyspCiAJCQlzcGtfY2hhcnRhYlsqY3BdICY9IH5tYXNrOwogCX0KQEAgLTI5MCwxNCArMjkwLDE0IEBACiAJCQlpZiAobWFzayA8IFBVTkMpIHsKIAkJCQlpZiAoIShzcGtfY2hhcnRhYlsqY3BdICYgUFVOQykpCiAJCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmIChzcGtfY2hhcnRhYlsqY3BdJkJfTlVNKQorCQkJfSBlbHNlIGlmIChzcGtfY2hhcnRhYlsqY3BdICYgQl9OVU0pCiAJCQkJYnJlYWs7CiAJCX0KIAkJaWYgKCpjcCkKIAkJCXJldHVybiAtRUlOVkFMOwogCQljcCA9ICh1X2NoYXIgKilpbnB1dDsKIAl9Ci0JaWYgKGhvdyYyKSB7CisJaWYgKGhvdyAmIDIpIHsKIAkJZm9yICg7ICpjcDsgY3ArKykKIAkJCWlmICgqY3AgPiBTUEFDRSkKIAkJCQlzcGtfY2hhcnRhYlsqY3BdIHw9IG1hc2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvY2hhbm5lbC5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2NoYW5uZWwuaAppbmRleCBkYjRlNmIyLi4yNTllZjY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvY2hhbm5lbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9jaGFubmVsLmgKQEAgLTc1LDI4ICs3NSw2IEBACiAJCQkJLyogYWNjZXNzIGNoYW5uZWwgYW55dGltZSAqLwogfTsKIAotc3RhdGljIGlubGluZSBjb25zdCB1OCAqCi1VTFRSQV9DSEFOTkVMQ0xJX1NUUklORyh1MzIgc3RhdGUpCi17Ci0Jc3dpdGNoIChzdGF0ZSkgewotCWNhc2UgQ0hBTk5FTENMSV9ERVRBQ0hFRDoKLQkJcmV0dXJuIChjb25zdCB1OCAqKSgiREVUQUNIRUQiKTsKLQljYXNlIENIQU5ORUxDTElfRElTQUJMRUQ6Ci0JCXJldHVybiAoY29uc3QgdTggKikoIkRJU0FCTEVEIik7Ci0JY2FzZSBDSEFOTkVMQ0xJX0FUVEFDSElORzoKLQkJcmV0dXJuIChjb25zdCB1OCAqKSgiQVRUQUNISU5HIik7Ci0JY2FzZSBDSEFOTkVMQ0xJX0FUVEFDSEVEOgotCQlyZXR1cm4gKGNvbnN0IHU4ICopKCJBVFRBQ0hFRCIpOwotCWNhc2UgQ0hBTk5FTENMSV9CVVNZOgotCQlyZXR1cm4gKGNvbnN0IHU4ICopKCJCVVNZIik7Ci0JY2FzZSBDSEFOTkVMQ0xJX09XTkVEOgotCQlyZXR1cm4gKGNvbnN0IHU4ICopKCJPV05FRCIpOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gKGNvbnN0IHU4ICopKCI/Iik7Ci19Ci0KICNkZWZpbmUgU1BBUl9DSEFOTkVMX1NFUlZFUl9SRUFEWShjaCkgXAogCShyZWFkbCgmKGNoKS0+c3J2X3N0YXRlKSA9PSBDSEFOTkVMU1JWX1JFQURZKQogCkBAIC0xMzIsMjIgKzExMCw2IEBACiAvKiB0aHJvdHRsaW5nIGludmFsaWQgYm9vdCBjaGFubmVsIHN0YXRldHJhbnNpdGlvbiBlcnJvciBkdWUgdG8gYnVzeSBjaGFubmVsICovCiAjZGVmaW5lIFVMVFJBX0NMSUVSUk9SQk9PVF9USFJPVFRMRU1TR19CVVNZICAgICAgICAweDA0CiAKLS8qIFZhbHVlcyBmb3IgVUxUUkFfQ0hBTk5FTF9QUk9UT0NPTC5DbGlFcnJvck9TOiAqLwotLyogdGhyb3R0bGluZyBpbnZhbGlkIGd1ZXN0IE9TIGNoYW5uZWwgc3RhdGV0cmFuc2l0aW9uIGVycm9yIGR1ZSB0bwotICogY2xpZW50IGRpc2FibGVkCi0gKi8KLSNkZWZpbmUgVUxUUkFfQ0xJRVJST1JPU19USFJPVFRMRU1TR19ESVNBQkxFRCAgICAgIDB4MDEKLQotLyogdGhyb3R0bGluZyBpbnZhbGlkIGd1ZXN0IE9TIGNoYW5uZWwgc3RhdGV0cmFuc2l0aW9uIGVycm9yIGR1ZSB0bwotICogY2xpZW50IG5vdCBhdHRhY2hlZAotICovCi0jZGVmaW5lIFVMVFJBX0NMSUVSUk9ST1NfVEhST1RUTEVNU0dfTk9UQVRUQUNIRUQgICAweDAyCi0KLS8qIHRocm90dGxpbmcgaW52YWxpZCBndWVzdCBPUyBjaGFubmVsIHN0YXRldHJhbnNpdGlvbiBlcnJvciBkdWUgdG8KLSAqIGJ1c3kgY2hhbm5lbAotICovCi0jZGVmaW5lIFVMVFJBX0NMSUVSUk9ST1NfVEhST1RUTEVNU0dfQlVTWSAgICAgICAgICAweDA0Ci0KIC8qIFZhbHVlcyBmb3IgVUxUUkFfQ0hBTk5FTF9QUk9UT0NPTC5GZWF0dXJlczogVGhpcyBkZWZpbmUgZXhpc3RzIHNvCiAgKiB0aGF0IHdpbmRvd3MgZ3Vlc3QgY2FuIGxvb2sgYXQgdGhlIEZlYXR1cmVGbGFncyBpbiB0aGUgaW8gY2hhbm5lbCwKICAqIGFuZCBjb25maWd1cmUgdGhlIHdpbmRvd3MgZHJpdmVyIHRvIHVzZSBpbnRlcnJ1cHRzIG9yIG5vdCBiYXNlZCBvbgpAQCAtMzQ3LDE0OCArMzA5LDYgQEAKIAlyZXR1cm4gMTsKIH0KIAotLyogR2l2ZW4gYSBmaWxlIHBhdGhuYW1lIDxzPiAod2l0aCAnLycgb3IgJ1wnIHNlcGFyYXRpbmcgZGlyZWN0b3J5IG5vZGVzKSwKLSAqIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSBub2RlIHdpdGhpbiB0aGF0IHBhdGhuYW1lIHN1Y2gKLSAqIHRoYXQgdGhlIG51bWJlciBvZiBub2RlcyBmcm9tIHRoYXQgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgaXMKLSAqIE5PVCBtb3JlIHRoYW4gPG4+LiAgTm90ZSB0aGF0IGlmIHRoZSBwYXRobmFtZSBoYXMgbGVzcyB0aGFuIDxuPiBub2RlcwotICogaW4gaXQsIHRoZSByZXR1cm4gcG9pbnRlciB3aWxsIGJlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZy4KLSAqLwotc3RhdGljIGlubGluZSB1OCAqCi1wYXRobmFtZV9sYXN0X25fbm9kZXModTggKnMsIHVuc2lnbmVkIGludCBuKQotewotCXU4ICpwID0gczsKLQl1bnNpZ25lZCBpbnQgbm9kZV9jb3VudCA9IDA7Ci0KLQl3aGlsZSAoKnAgIT0gJ1wwJykgewotCQlpZiAoKCpwID09ICcvJykgfHwgKCpwID09ICdcXCcpKQotCQkJbm9kZV9jb3VudCsrOwotCQlwKys7Ci0JfQotCWlmIChub2RlX2NvdW50IDw9IG4pCi0JCXJldHVybiBzOwotCXdoaWxlIChuID4gMCkgewotCQlwLS07Ci0JCWlmIChwID09IHMpCi0JCQlicmVhazsJLyogc2hvdWxkIG5ldmVyIGhhcHBlbiwgdW5sZXNzIHNvbWVvbmUKLQkJCQkgKiBpcyBjaGFuZ2luZyB0aGUgc3RyaW5nIHdoaWxlIHdlIGFyZQotCQkJCSAqIGxvb2tpbmcgYXQgaXQhIQotCQkJCSAqLwotCQlpZiAoKCpwID09ICcvJykgfHwgKCpwID09ICdcXCcpKQotCQkJbi0tOwotCX0KLQlyZXR1cm4gcCArIDE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1zcGFyX2NoYW5uZWxfY2xpZW50X2FjcXVpcmVfb3Modm9pZCBfX2lvbWVtICpjaCwgdTggKmlkKQotewotCXN0cnVjdCBjaGFubmVsX2hlYWRlciBfX2lvbWVtICpoZHIgPSBjaDsKLQotCWlmIChyZWFkbCgmaGRyLT5jbGlfc3RhdGVfb3MpID09IENIQU5ORUxDTElfRElTQUJMRUQpIHsKLQkJaWYgKChyZWFkYigmaGRyLT5jbGlfZXJyb3Jfb3MpCi0JCSAgICAgJiBVTFRSQV9DTElFUlJPUk9TX1RIUk9UVExFTVNHX0RJU0FCTEVEKSA9PSAwKSB7Ci0JCQkvKiB3ZSBhcmUgTk9UIHRocm90dGxpbmcgdGhpcyBtZXNzYWdlICovCi0JCQl3cml0ZWIocmVhZGIoJmhkci0+Y2xpX2Vycm9yX29zKSB8Ci0JCQkgICAgICAgVUxUUkFfQ0xJRVJST1JPU19USFJPVFRMRU1TR19ESVNBQkxFRCwKLQkJCSAgICAgICAmaGRyLT5jbGlfZXJyb3Jfb3MpOwotCQkJLyogdGhyb3R0bGUgdW50aWwgYWNxdWlyZSBzdWNjZXNzZnVsICovCi0KLQkJCXByX2luZm8oIiVzIENoYW5uZWwgU3RhdGVUcmFuc2l0aW9uIElOVkFMSUQhIC0gYWNxdWlyZSBmYWlsZWQgYmVjYXVzZSBPUyBjbGllbnQgRElTQUJMRURcbiIsCi0JCQkJaWQpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoKHJlYWRsKCZoZHItPmNsaV9zdGF0ZV9vcykgIT0gQ0hBTk5FTENMSV9PV05FRCkgJiYKLQkgICAgKHJlYWRsKCZoZHItPmNsaV9zdGF0ZV9ib290KSA9PSBDSEFOTkVMQ0xJX0RJU0FCTEVEKSkgewotCQkvKiBPdXIgY29tcGV0aXRvciBpcyBESVNBQkxFRCwgc28gd2UgY2FuIHRyYW5zaXRpb24gdG8gT1dORUQgKi8KLQkJcHJfaW5mbygiJXMgQ2hhbm5lbCBTdGF0ZVRyYW5zaXRpb24gKCVzKSAlcyglZCktLT4lcyglZClcbiIsCi0JCQlpZCwgImNsaV9zdGF0ZV9vcyIsCi0JCQlVTFRSQV9DSEFOTkVMQ0xJX1NUUklORyhyZWFkbCgmaGRyLT5jbGlfc3RhdGVfb3MpKSwKLQkJCXJlYWRsKCZoZHItPmNsaV9zdGF0ZV9vcyksCi0JCQlVTFRSQV9DSEFOTkVMQ0xJX1NUUklORyhDSEFOTkVMQ0xJX09XTkVEKSwKLQkJCUNIQU5ORUxDTElfT1dORUQpOwotCQl3cml0ZWwoQ0hBTk5FTENMSV9PV05FRCwgJmhkci0+Y2xpX3N0YXRlX29zKTsKLQkJbWIoKTsgLyogcmVxdWlyZWQgZm9yIGNoYW5uZWwgc3luY2ggKi8KLQl9Ci0JaWYgKHJlYWRsKCZoZHItPmNsaV9zdGF0ZV9vcykgPT0gQ0hBTk5FTENMSV9PV05FRCkgewotCQlpZiAocmVhZGIoJmhkci0+Y2xpX2Vycm9yX29zKSkgewotCQkJLyogd2UgYXJlIGluIGFuIGVycm9yIG1zZyB0aHJvdHRsaW5nIHN0YXRlOwotCQkJICogY29tZSBvdXQgb2YgaXQKLQkJCSAqLwotCQkJcHJfaW5mbygiJXMgQ2hhbm5lbCBPUyBjbGllbnQgYWNxdWlyZSBub3cgc3VjY2Vzc2Z1bFxuIiwKLQkJCQlpZCk7Ci0JCQl3cml0ZWIoMCwgJmhkci0+Y2xpX2Vycm9yX29zKTsKLQkJfQotCQlyZXR1cm4gMTsKLQl9Ci0KLQkvKiBXZSBoYXZlIHRvIGRvIGl0IHRoZSAiaGFyZCB3YXkiLiAgV2UgdHJhbnNpdGlvbiB0byBCVVNZLAotCSAqIGFuZCBjYW4gdXNlIHRoZSBjaGFubmVsIGlmZiBvdXIgY29tcGV0aXRvciBoYXMgbm90IGFsc28KLQkgKiB0cmFuc2l0aW9uZWQgdG8gQlVTWS4KLQkgKi8KLQlpZiAocmVhZGwoJmhkci0+Y2xpX3N0YXRlX29zKSAhPSBDSEFOTkVMQ0xJX0FUVEFDSEVEKSB7Ci0JCWlmICgocmVhZGIoJmhkci0+Y2xpX2Vycm9yX29zKQotCQkgICAgICYgVUxUUkFfQ0xJRVJST1JPU19USFJPVFRMRU1TR19OT1RBVFRBQ0hFRCkgPT0gMCkgewotCQkJLyogd2UgYXJlIE5PVCB0aHJvdHRsaW5nIHRoaXMgbWVzc2FnZSAqLwotCQkJd3JpdGViKHJlYWRiKCZoZHItPmNsaV9lcnJvcl9vcykgfAotCQkJICAgICAgIFVMVFJBX0NMSUVSUk9ST1NfVEhST1RUTEVNU0dfTk9UQVRUQUNIRUQsCi0JCQkgICAgICAgJmhkci0+Y2xpX2Vycm9yX29zKTsKLQkJCS8qIHRocm90dGxlIHVudGlsIGFjcXVpcmUgc3VjY2Vzc2Z1bCAqLwotCQkJcHJfaW5mbygiJXMgQ2hhbm5lbCBTdGF0ZVRyYW5zaXRpb24gSU5WQUxJRCEgLSBhY3F1aXJlIGZhaWxlZCBiZWNhdXNlIE9TIGNsaWVudCBOT1QgQVRUQUNIRUQgKHN0YXRlPSVzKCVkKSlcbiIsCi0JCQkJaWQsIFVMVFJBX0NIQU5ORUxDTElfU1RSSU5HKAotCQkJCQkJcmVhZGwoJmhkci0+Y2xpX3N0YXRlX29zKSksCi0JCQkJcmVhZGwoJmhkci0+Y2xpX3N0YXRlX29zKSk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCXdyaXRlbChDSEFOTkVMQ0xJX0JVU1ksICZoZHItPmNsaV9zdGF0ZV9vcyk7Ci0JbWIoKTsgLyogcmVxdWlyZWQgZm9yIGNoYW5uZWwgc3luY2ggKi8KLQlpZiAocmVhZGwoJmhkci0+Y2xpX3N0YXRlX2Jvb3QpID09IENIQU5ORUxDTElfQlVTWSkgewotCQlpZiAoKHJlYWRiKCZoZHItPmNsaV9lcnJvcl9vcykKLQkJICAgICAmIFVMVFJBX0NMSUVSUk9ST1NfVEhST1RUTEVNU0dfQlVTWSkgPT0gMCkgewotCQkJLyogd2UgYXJlIE5PVCB0aHJvdHRsaW5nIHRoaXMgbWVzc2FnZSAqLwotCQkJd3JpdGViKHJlYWRiKCZoZHItPmNsaV9lcnJvcl9vcykgfAotCQkJICAgICAgIFVMVFJBX0NMSUVSUk9ST1NfVEhST1RUTEVNU0dfQlVTWSwKLQkJCSAgICAgICAmaGRyLT5jbGlfZXJyb3Jfb3MpOwotCQkJLyogdGhyb3R0bGUgdW50aWwgYWNxdWlyZSBzdWNjZXNzZnVsICovCi0JCQlwcl9pbmZvKCIlcyBDaGFubmVsIFN0YXRlVHJhbnNpdGlvbiBmYWlsZWQgLSBob3N0IE9TIGFjcXVpcmUgZmFpbGVkIGJlY2F1c2UgYm9vdCBCVVNZXG4iLAotCQkJCWlkKTsKLQkJfQotCQkvKiByZXNldCBidXN5ICovCi0JCXdyaXRlbChDSEFOTkVMQ0xJX0FUVEFDSEVELCAmaGRyLT5jbGlfc3RhdGVfb3MpOwotCQltYigpOyAvKiByZXF1aXJlZCBmb3IgY2hhbm5lbCBzeW5jaCAqLwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHJlYWRiKCZoZHItPmNsaV9lcnJvcl9vcykpIHsKLQkJLyogd2UgYXJlIGluIGFuIGVycm9yIG1zZyB0aHJvdHRsaW5nIHN0YXRlOyBjb21lIG91dCBvZiBpdCAqLwotCQlwcl9pbmZvKCIlcyBDaGFubmVsIE9TIGNsaWVudCBhY3F1aXJlIG5vdyBzdWNjZXNzZnVsXG4iLCBpZCk7Ci0JCXdyaXRlYigwLCAmaGRyLT5jbGlfZXJyb3Jfb3MpOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1zcGFyX2NoYW5uZWxfY2xpZW50X3JlbGVhc2Vfb3Modm9pZCBfX2lvbWVtICpjaCwgdTggKmlkKQotewotCXN0cnVjdCBjaGFubmVsX2hlYWRlciBfX2lvbWVtICpoZHIgPSBjaDsKLQotCWlmIChyZWFkYigmaGRyLT5jbGlfZXJyb3Jfb3MpKSB7Ci0JCS8qIHdlIGFyZSBpbiBhbiBlcnJvciBtc2cgdGhyb3R0bGluZyBzdGF0ZTsgY29tZSBvdXQgb2YgaXQgKi8KLQkJcHJfaW5mbygiJXMgQ2hhbm5lbCBPUyBjbGllbnQgZXJyb3Igc3RhdGUgY2xlYXJlZFxuIiwgaWQpOwotCQl3cml0ZWIoMCwgJmhkci0+Y2xpX2Vycm9yX29zKTsKLQl9Ci0JaWYgKHJlYWRsKCZoZHItPmNsaV9zdGF0ZV9vcykgPT0gQ0hBTk5FTENMSV9PV05FRCkKLQkJcmV0dXJuOwotCWlmIChyZWFkbCgmaGRyLT5jbGlfc3RhdGVfb3MpICE9IENIQU5ORUxDTElfQlVTWSkgewotCQlwcl9pbmZvKCIlcyBDaGFubmVsIFN0YXRlVHJhbnNpdGlvbiBJTlZBTElEISAtIHJlbGVhc2UgZmFpbGVkIGJlY2F1c2UgT1MgY2xpZW50IE5PVCBCVVNZIChzdGF0ZT0lcyglZCkpXG4iLAotCQkJaWQsIFVMVFJBX0NIQU5ORUxDTElfU1RSSU5HKAotCQkJCQlyZWFkbCgmaGRyLT5jbGlfc3RhdGVfb3MpKSwKLQkJCXJlYWRsKCZoZHItPmNsaV9zdGF0ZV9vcykpOwotCQkvKiByZXR1cm47ICovCi0JfQotCXdyaXRlbChDSEFOTkVMQ0xJX0FUVEFDSEVELCAmaGRyLT5jbGlfc3RhdGVfb3MpOyAvKiByZWxlYXNlIGJ1c3kgKi8KLX0KLQogLyoKICogUm91dGluZSBEZXNjcmlwdGlvbjoKICogVHJpZXMgdG8gaW5zZXJ0IHRoZSBwcmVidWlsdCBzaWduYWwgcG9pbnRlZCB0byBieSBwU2lnbmFsIGludG8gdGhlIG50aApAQCAtNTY5LDQgKzM4OSw0NSBAQAogdW5zaWduZWQgY2hhciBzcGFyX3NpZ25hbHF1ZXVlX2VtcHR5KHN0cnVjdCBjaGFubmVsX2hlYWRlciBfX2lvbWVtICpjaCwKIAkJCQkgICAgIHUzMiBxdWV1ZSk7CiAKKy8qCisgKiBDSEFOTkVMIEd1aWRzCisgKi8KKworLyogezQxNDgxNWVkLWM1OGMtMTFkYS05NWE5LTAwZTA4MTYxMTY1Zn0gKi8KKyNkZWZpbmUgU1BBUl9WSEJBX0NIQU5ORUxfUFJPVE9DT0xfVVVJRCBcCisJCVVVSURfTEUoMHg0MTQ4MTVlZCwgMHhjNThjLCAweDExZGEsIFwKKwkJCQkweDk1LCAweGE5LCAweDAsIDB4ZTAsIDB4ODEsIDB4NjEsIDB4MTYsIDB4NWYpCitzdGF0aWMgY29uc3QgdXVpZF9sZSBzcGFyX3ZoYmFfY2hhbm5lbF9wcm90b2NvbF91dWlkID0KKwlTUEFSX1ZIQkFfQ0hBTk5FTF9QUk9UT0NPTF9VVUlEOworI2RlZmluZSBTUEFSX1ZIQkFfQ0hBTk5FTF9QUk9UT0NPTF9VVUlEX1NUUiBcCisJIjQxNDgxNWVkLWM1OGMtMTFkYS05NWE5LTAwZTA4MTYxMTY1ZiIKKworLyogezhjZDU5OTRkLWM1OGUtMTFkYS05NWE5LTAwZTA4MTYxMTY1Zn0gKi8KKyNkZWZpbmUgU1BBUl9WTklDX0NIQU5ORUxfUFJPVE9DT0xfVVVJRCBcCisJCVVVSURfTEUoMHg4Y2Q1OTk0ZCwgMHhjNThlLCAweDExZGEsIFwKKwkJCQkweDk1LCAweGE5LCAweDAsIDB4ZTAsIDB4ODEsIDB4NjEsIDB4MTYsIDB4NWYpCitzdGF0aWMgY29uc3QgdXVpZF9sZSBzcGFyX3ZuaWNfY2hhbm5lbF9wcm90b2NvbF91dWlkID0KKwlTUEFSX1ZOSUNfQ0hBTk5FTF9QUk9UT0NPTF9VVUlEOworI2RlZmluZSBTUEFSX1ZOSUNfQ0hBTk5FTF9QUk9UT0NPTF9VVUlEX1NUUiBcCisJIjhjZDU5OTRkLWM1OGUtMTFkYS05NWE5LTAwZTA4MTYxMTY1ZiIKKworLyogezcyMTIwMDA4LTRBQUItMTFEQy04NTMwLTQ0NDU1MzU0NDIwMH0gKi8KKyNkZWZpbmUgU1BBUl9TSU9WTV9VVUlEIFwKKwkJVVVJRF9MRSgweDcyMTIwMDA4LCAweDRBQUIsIDB4MTFEQywgXAorCQkJCTB4ODUsIDB4MzAsIDB4NDQsIDB4NDUsIDB4NTMsIDB4NTQsIDB4NDIsIDB4MDApCitzdGF0aWMgY29uc3QgdXVpZF9sZSBzcGFyX3Npb3ZtX3V1aWQgPSBTUEFSX1NJT1ZNX1VVSUQ7CisKKy8qIHs1YjUyYzVhYy1lNWY1LTRkNDItOGRmZi00MjllYWVjZDIyMWZ9ICovCisjZGVmaW5lIFNQQVJfQ09OVFJPTERJUkVDVE9SX0NIQU5ORUxfUFJPVE9DT0xfVVVJRCAgXAorCQlVVUlEX0xFKDB4NWI1MmM1YWMsIDB4ZTVmNSwgMHg0ZDQyLCBcCisJCQkJMHg4ZCwgMHhmZiwgMHg0MiwgMHg5ZSwgMHhhZSwgMHhjZCwgMHgyMiwgMHgxZikKKworc3RhdGljIGNvbnN0IHV1aWRfbGUgc3Bhcl9jb250cm9sZGlyZWN0b3JfY2hhbm5lbF9wcm90b2NvbF91dWlkID0KKwlTUEFSX0NPTlRST0xESVJFQ1RPUl9DSEFOTkVMX1BST1RPQ09MX1VVSUQ7CisKKy8qIHtiNGU3OTYyNS1hZWRlLTRlQUEtOWUxMS1EM2VkZGNkNDUwNGN9ICovCisjZGVmaW5lIFNQQVJfRElBR19QT09MX0NIQU5ORUxfUFJPVE9DT0xfVVVJRAkJCQlcCisJCVVVSURfTEUoMHhiNGU3OTYyNSwgMHhhZWRlLCAweDRlYWEsIFwKKwkJCQkweDllLCAweDExLCAweGQzLCAweGVkLCAweGRjLCAweGQ0LCAweDUwLCAweDRjKQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9jaGFubmVsX2d1aWQuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9jaGFubmVsX2d1aWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdjYjQ5OS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvY2hhbm5lbF9ndWlkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgotICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKLSAqIGRldGFpbHMuCi0gKi8KLQotLyoKLSAqIENIQU5ORUwgR3VpZHMKLSAqLwotCi0vKiB7NDE0ODE1ZWQtYzU4Yy0xMWRhLTk1YTktMDBlMDgxNjExNjVmfSAqLwotI2RlZmluZSBTUEFSX1ZIQkFfQ0hBTk5FTF9QUk9UT0NPTF9VVUlEIFwKLQkJVVVJRF9MRSgweDQxNDgxNWVkLCAweGM1OGMsIDB4MTFkYSwgXAotCQkJCTB4OTUsIDB4YTksIDB4MCwgMHhlMCwgMHg4MSwgMHg2MSwgMHgxNiwgMHg1ZikKLXN0YXRpYyBjb25zdCB1dWlkX2xlIHNwYXJfdmhiYV9jaGFubmVsX3Byb3RvY29sX3V1aWQgPQotCVNQQVJfVkhCQV9DSEFOTkVMX1BST1RPQ09MX1VVSUQ7Ci0jZGVmaW5lIFNQQVJfVkhCQV9DSEFOTkVMX1BST1RPQ09MX1VVSURfU1RSIFwKLQkiNDE0ODE1ZWQtYzU4Yy0xMWRhLTk1YTktMDBlMDgxNjExNjVmIgotCi0vKiB7OGNkNTk5NGQtYzU4ZS0xMWRhLTk1YTktMDBlMDgxNjExNjVmfSAqLwotI2RlZmluZSBTUEFSX1ZOSUNfQ0hBTk5FTF9QUk9UT0NPTF9VVUlEIFwKLQkJVVVJRF9MRSgweDhjZDU5OTRkLCAweGM1OGUsIDB4MTFkYSwgXAotCQkJCTB4OTUsIDB4YTksIDB4MCwgMHhlMCwgMHg4MSwgMHg2MSwgMHgxNiwgMHg1ZikKLXN0YXRpYyBjb25zdCB1dWlkX2xlIHNwYXJfdm5pY19jaGFubmVsX3Byb3RvY29sX3V1aWQgPQotCVNQQVJfVk5JQ19DSEFOTkVMX1BST1RPQ09MX1VVSUQ7Ci0jZGVmaW5lIFNQQVJfVk5JQ19DSEFOTkVMX1BST1RPQ09MX1VVSURfU1RSIFwKLQkiOGNkNTk5NGQtYzU4ZS0xMWRhLTk1YTktMDBlMDgxNjExNjVmIgotCi0vKiB7NzIxMjAwMDgtNEFBQi0xMURDLTg1MzAtNDQ0NTUzNTQ0MjAwfSAqLwotI2RlZmluZSBTUEFSX1NJT1ZNX1VVSUQgXAotCQlVVUlEX0xFKDB4NzIxMjAwMDgsIDB4NEFBQiwgMHgxMURDLCBcCi0JCQkJMHg4NSwgMHgzMCwgMHg0NCwgMHg0NSwgMHg1MywgMHg1NCwgMHg0MiwgMHgwMCkKLXN0YXRpYyBjb25zdCB1dWlkX2xlIHNwYXJfc2lvdm1fdXVpZCA9IFNQQVJfU0lPVk1fVVVJRDsKLQotLyogezViNTJjNWFjLWU1ZjUtNGQ0Mi04ZGZmLTQyOWVhZWNkMjIxZn0gKi8KLSNkZWZpbmUgU1BBUl9DT05UUk9MRElSRUNUT1JfQ0hBTk5FTF9QUk9UT0NPTF9VVUlEICBcCi0JCVVVSURfTEUoMHg1YjUyYzVhYywgMHhlNWY1LCAweDRkNDIsIFwKLQkJCQkweDhkLCAweGZmLCAweDQyLCAweDllLCAweGFlLCAweGNkLCAweDIyLCAweDFmKQotCi1zdGF0aWMgY29uc3QgdXVpZF9sZSBzcGFyX2NvbnRyb2xkaXJlY3Rvcl9jaGFubmVsX3Byb3RvY29sX3V1aWQgPQotCVNQQVJfQ09OVFJPTERJUkVDVE9SX0NIQU5ORUxfUFJPVE9DT0xfVVVJRDsKLQotLyoge2I0ZTc5NjI1LWFlZGUtNGVBQS05ZTExLUQzZWRkY2Q0NTA0Y30gKi8KLSNkZWZpbmUgU1BBUl9ESUFHX1BPT0xfQ0hBTk5FTF9QUk9UT0NPTF9VVUlECQkJCVwKLQkJVVVJRF9MRSgweGI0ZTc5NjI1LCAweGFlZGUsIDB4NGVhYSwgXAotCQkJCTB4OWUsIDB4MTEsIDB4ZDMsIDB4ZWQsIDB4ZGMsIDB4ZDQsIDB4NTAsIDB4NGMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvZGlhZ2NoYW5uZWwuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9kaWFnY2hhbm5lbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTgxM2M3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9kaWFnY2hhbm5lbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKLSAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCi0gKiBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX0RJQUdfQ0hBTk5FTF9IXwotI2RlZmluZSBfRElBR19DSEFOTkVMX0hfCi0KLS8qIExldmVscyBvZiBzZXZlcml0eSBmb3IgZGlhZ25vc3RpYyBldmVudHMsIGluIG9yZGVyIGZyb20gbG93ZXN0IHNldmVyaXR5IHRvCi0gKiBoaWdoZXN0IChpLmUuIGZhdGFsIGVycm9ycyBhcmUgdGhlIG1vc3Qgc2V2ZXJlLCBhbmQgc2hvdWxkIGFsd2F5cyBiZSBsb2dnZWQsCi0gKiBidXQgaW5mbyBldmVudHMgcmFyZWx5IG5lZWQgdG8gYmUgbG9nZ2VkIGV4Y2VwdCBkdXJpbmcgZGVidWdnaW5nKS4gVGhlCi0gKiB2YWx1ZXMgRElBR19TRVZFUklUWV9FTlVNX0JFR0lOIGFuZCBESUFHX1NFVkVSSVRZX0VOVU1fRU5EIGFyZSBub3QgdmFsaWQKLSAqIHNldmVyaXR5IHZhbHVlcy4gIFRoZXkgZXhpc3QgbWVyZWx5IHRvIGRpbGluZWF0ZSB0aGUgbGlzdCwgc28gdGhhdCBmdXR1cmUKLSAqIGFkZGl0aW9ucyB3b24ndCByZXF1aXJlIGNoYW5nZXMgdG8gdGhlIGRyaXZlciAoaS5lLiB3aGVuIGNoZWNraW5nIGZvcgotICogb3V0LW9mLXJhbmdlIHNldmVyaXRpZXMgaW4gU2V0U2V2ZXJpdHkpLiBUaGUgdmFsdWVzIERJQUdfU0VWRVJJVFlfT1ZFUlJJREUKLSAqIGFuZCBESUFHX1NFVkVSSVRZX1NIVVRPRkYgYXJlIG5vdCB2YWxpZCBzZXZlcml0eSB2YWx1ZXMgZm9yIGxvZ2dpbmcgZXZlbnRzCi0gKiBidXQgdGhleSBhcmUgdmFsaWQgZm9yIGNvbnRyb2xsaW5nIHRoZSBhbW91bnQgb2YgZXZlbnQgZGF0YS4gQ2hhbmdlcyBtYWRlCi0gKiB0byB0aGUgZW51bSwgbmVlZCB0byBiZSByZWZsZWN0ZWQgaW4gcy1QYXIuCi0gKi8KLWVudW0gZGlhZ19zZXZlcml0eSB7Ci0JCURJQUdfU0VWRVJJVFlfVkVSQk9TRSA9IDAsCi0JCURJQUdfU0VWRVJJVFlfSU5GTyA9IDEsCi0JCURJQUdfU0VWRVJJVFlfV0FSTklORyA9IDIsCi0JCURJQUdfU0VWRVJJVFlfRVJSID0gMywKLQkJRElBR19TRVZFUklUWV9QUklOVCA9IDQsCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9ndWVzdGxpbnV4ZGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9ndWVzdGxpbnV4ZGVidWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxMjg3Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvZ3Vlc3RsaW51eGRlYnVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKLSAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCi0gKiBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX19HVUVTVExJTlVYREVCVUdfSF9fCi0jZGVmaW5lIF9fR1VFU1RMSU5VWERFQlVHX0hfXwotCi0vKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHN1cHBvcnRpbmcgaW50ZXJmYWNlIGZvciAidm1jYWxsaW50ZXJmYWNlLmgiLCBwYXJ0aWN1bGFybHkKLSAqIHJlZ2FyZGluZyBhZGRpbmcgYWRkaXRpb25hbCBzdHJ1Y3R1cmUgYW5kIGZ1bmN0aW9uYWxpdHkgdG8gbGludXgKLSAqIElTU1VFX0lPX1ZNQ0FMTF9QT1NUQ09ERV9TRVZFUklUWQotICovCi0KLS8qKioqKioqIElORk8gT04gSVNTVUVfUE9TVENPREVfTElOVVgoKSBCRUxPVyAqKioqKioqLwotZW51bSBkcml2ZXJfcGMgewkJLyogUE9TVENPREUgZHJpdmVyIGlkZW50aWZpZXIgdHVwbGVzICovCi0JLyogdmlzb3JjaGlwc2V0IGRyaXZlciBmaWxlcyAqLwotCVZJU09SX0NISVBTRVRfUEMgPSAweEEwLAotCVZJU09SX0NISVBTRVRfUENfY29udHJvbHZtX2MgPSAweEExLAotCVZJU09SX0NISVBTRVRfUENfY29udHJvbHZtX2NtMiA9IDB4QTIsCi0JVklTT1JfQ0hJUFNFVF9QQ19jb250cm9sdm1fZGlyZWN0X2MgPSAweEEzLAotCVZJU09SX0NISVBTRVRfUENfZmlsZV9jID0gMHhBNCwKLQlWSVNPUl9DSElQU0VUX1BDX3BhcnNlcl9jID0gMHhBNSwKLQlWSVNPUl9DSElQU0VUX1BDX3Rlc3RpbmdfYyA9IDB4QTYsCi0JVklTT1JfQ0hJUFNFVF9QQ192aXNvcmNoaXBzZXRfbWFpbl9jID0gMHhBNywKLQlWSVNPUl9DSElQU0VUX1BDX3Zpc29yc3dpdGNoYnVzX2MgPSAweEE4LAotCS8qIHZpc29yYnVzIGRyaXZlciBmaWxlcyAqLwotCVZJU09SX0JVU19QQyA9IDB4QjAsCi0JVklTT1JfQlVTX1BDX2J1c2luc3RfYXR0cl9jID0gMHhCMSwKLQlWSVNPUl9CVVNfUENfY2hhbm5lbF9hdHRyX2MgPSAweEIyLAotCVZJU09SX0JVU19QQ19kZXZtYWpvcm1pbm9yX2F0dHJfYyA9IDB4QjMsCi0JVklTT1JfQlVTX1BDX3Zpc29yYnVzX21haW5fYyA9IDB4QjQsCi0JLyogdmlzb3JjbGllbnRidXMgZHJpdmVyIGZpbGVzICovCi0JVklTT1JfQ0xJRU5UX0JVU19QQyA9IDB4QzAsCi0JVklTT1JfQ0xJRU5UX0JVU19QQ192aXNvcmNsaWVudGJ1c19tYWluX2MgPSAweEMxLAotCS8qIHZpcnQgaGJhIGRyaXZlciBmaWxlcyAqLwotCVZJUlRfSEJBX1BDID0gMHhDMiwKLQlWSVJUX0hCQV9QQ192aXJ0aGJhX2MgPSAweEMzLAotCS8qIHZpcnRwY2kgZHJpdmVyIGZpbGVzICovCi0JVklSVF9QQ0lfUEMgPSAweEM0LAotCVZJUlRfUENJX1BDX3ZpcnRwY2lfYyA9IDB4QzUsCi0JLyogdmlydG5pYyBkcml2ZXIgZmlsZXMgKi8KLQlWSVJUX05JQ19QQyA9IDB4QzYsCi0JVklSVF9OSUNfUF92aXJ0bmljX2MgPSAweEM3LAotCS8qIHVpc2xpYiBkcml2ZXIgZmlsZXMgKi8KLQlVSVNMSUJfUEMgPSAweEQwLAotCVVJU0xJQl9QQ191aXNsaWJfYyA9IDB4RDEsCi0JVUlTTElCX1BDX3Vpc3F1ZXVlX2MgPSAweEQyLAotCVVJU0xJQl9QQ191aXN0aHJlYWRfYyA9IDB4RDMsCi0JVUlTTElCX1BDX3Vpc3V0aWxzX2MgPSAweEQ0LAotfTsKLQotZW51bSBldmVudF9wYyB7CQkJLyogUE9TVENPREUgZXZlbnQgaWRlbnRpZmllciB0dXBsZXMgKi8KLQlBVFRBQ0hfUE9SVF9FTlRSWV9QQyA9IDB4MDAxLAotCUFUVEFDSF9QT1JUX0ZBSUxVUkVfUEMgPSAweDAwMiwKLQlBVFRBQ0hfUE9SVF9TVUNDRVNTX1BDID0gMHgwMDMsCi0JQlVTX0ZBSUxVUkVfUEMgPSAweDAwNCwKLQlCVVNfQ1JFQVRFX0VOVFJZX1BDID0gMHgwMDUsCi0JQlVTX0NSRUFURV9GQUlMVVJFX1BDID0gMHgwMDYsCi0JQlVTX0NSRUFURV9FWElUX1BDID0gMHgwMDcsCi0JQlVTX0NPTkZJR1VSRV9FTlRSWV9QQyA9IDB4MDA4LAotCUJVU19DT05GSUdVUkVfRkFJTFVSRV9QQyA9IDB4MDA5LAotCUJVU19DT05GSUdVUkVfRVhJVF9QQyA9IDB4MDBBLAotCUNISVBTRVRfSU5JVF9FTlRSWV9QQyA9IDB4MDBCLAotCUNISVBTRVRfSU5JVF9TVUNDRVNTX1BDID0gMHgwMEMsCi0JQ0hJUFNFVF9JTklUX0ZBSUxVUkVfUEMgPSAweDAwRCwKLQlDSElQU0VUX0lOSVRfRVhJVF9QQyA9IDB4MDBFLAotCUNSRUFURV9XT1JLUVVFVUVfUEMgPSAweDAwRiwKLQlDUkVBVEVfV09SS1FVRVVFX0ZBSUxFRF9QQyA9IDB4MEEwLAotCUNPTlRST0xWTV9JTklUX0ZBSUxVUkVfUEMgPSAweDBBMSwKLQlERVZJQ0VfQ1JFQVRFX0VOVFJZX1BDID0gMHgwQTIsCi0JREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDID0gMHgwQTMsCi0JREVWSUNFX0NSRUFURV9TVUNDRVNTX1BDID0gMHgwQTQsCi0JREVWSUNFX0NSRUFURV9FWElUX1BDID0gMHgwQTUsCi0JREVWSUNFX0FERF9QQyA9IDB4MEE2LAotCURFVklDRV9SRUdJU1RFUl9GQUlMVVJFX1BDID0gMHgwQTcsCi0JREVWSUNFX0NIQU5HRVNUQVRFX0VOVFJZX1BDID0gMHgwQTgsCi0JREVWSUNFX0NIQU5HRVNUQVRFX0ZBSUxVUkVfUEMgPSAweDBBOSwKLQlERVZJQ0VfQ0hBTkdFU1RBVEVfRVhJVF9QQyA9IDB4MEFBLAotCURSSVZFUl9FTlRSWV9QQyA9IDB4MEFCLAotCURSSVZFUl9FWElUX1BDID0gMHgwQUMsCi0JTUFMTE9DX0ZBSUxVUkVfUEMgPSAweDBBRCwKLQlRVUVVRV9ERUxBWUVEX1dPUktfUEMgPSAweDBBRSwKLQlVSVNMSUJfVEhSRUFEX0ZBSUxVUkVfUEMgPSAweDBCNywKLQlWQlVTX0NIQU5ORUxfRU5UUllfUEMgPSAweDBCOCwKLQlWQlVTX0NIQU5ORUxfRkFJTFVSRV9QQyA9IDB4MEI5LAotCVZCVVNfQ0hBTk5FTF9FWElUX1BDID0gMHgwQkEsCi0JVkhCQV9DUkVBVEVfRU5UUllfUEMgPSAweDBCQiwKLQlWSEJBX0NSRUFURV9GQUlMVVJFX1BDID0gMHgwQkMsCi0JVkhCQV9DUkVBVEVfRVhJVF9QQyA9IDB4MEJELAotCVZIQkFfQ1JFQVRFX1NVQ0NFU1NfUEMgPSAweDBCRSwKLQlWSEJBX0NPTU1BTkRfSEFORExFUl9QQyA9IDB4MEJGLAotCVZIQkFfUFJPQkVfRU5UUllfUEMgPSAweDBDMCwKLQlWSEJBX1BST0JFX0ZBSUxVUkVfUEMgPSAweDBDMSwKLQlWSEJBX1BST0JFX0VYSVRfUEMgPSAweDBDMiwKLQlWTklDX0NSRUFURV9FTlRSWV9QQyA9IDB4MEMzLAotCVZOSUNfQ1JFQVRFX0ZBSUxVUkVfUEMgPSAweDBDNCwKLQlWTklDX0NSRUFURV9TVUNDRVNTX1BDID0gMHgwQzUsCi0JVk5JQ19QUk9CRV9FTlRSWV9QQyA9IDB4MEM2LAotCVZOSUNfUFJPQkVfRkFJTFVSRV9QQyA9IDB4MEM3LAotCVZOSUNfUFJPQkVfRVhJVF9QQyA9IDB4MEM4LAotCVZQQ0lfQ1JFQVRFX0VOVFJZX1BDID0gMHgwQzksCi0JVlBDSV9DUkVBVEVfRkFJTFVSRV9QQyA9IDB4MENBLAotCVZQQ0lfQ1JFQVRFX0VYSVRfUEMgPSAweDBDQiwKLQlWUENJX1BST0JFX0VOVFJZX1BDID0gMHgwQ0MsCi0JVlBDSV9QUk9CRV9GQUlMVVJFX1BDID0gMHgwQ0QsCi0JVlBDSV9QUk9CRV9FWElUX1BDID0gMHgwQ0UsCi0JQ1JBU0hfREVWX0VOVFJZX1BDID0gMHgwQ0YsCi0JQ1JBU0hfREVWX0VYSVRfUEMgPSAweDBEMCwKLQlDUkFTSF9ERVZfSEFERFJfTlVMTCA9IDB4MEQxLAotCUNSQVNIX0RFVl9DT05UUk9MVk1fTlVMTCA9IDB4MEQyLAotCUNSQVNIX0RFVl9SRF9CVVNfRkFJVUxSRV9QQyA9IDB4MEQzLAotCUNSQVNIX0RFVl9SRF9ERVZfRkFJVUxSRV9QQyA9IDB4MEQ0LAotCUNSQVNIX0RFVl9CVVNfTlVMTF9GQUlMVVJFX1BDID0gMHgwRDUsCi0JQ1JBU0hfREVWX0RFVl9OVUxMX0ZBSUxVUkVfUEMgPSAweDBENiwKLQlDUkFTSF9ERVZfQ1RSTF9SRF9GQUlMVVJFX1BDID0gMHgwRDcsCi0JQ1JBU0hfREVWX0NPVU5UX0ZBSUxVUkVfUEMgPSAweDBEOCwKLQlTQVZFX01TR19CVVNfRkFJTFVSRV9QQyA9IDB4MEQ5LAotCVNBVkVfTVNHX0RFVl9GQUlMVVJFX1BDID0gMHgwREEsCi0JQ0FMTEhPTUVfSU5JVF9GQUlMVVJFX1BDID0gMHgwREIKLX07Ci0KLSNpZmRlZiBfX0dOVUNfXwotCi0jZGVmaW5lIFBPU1RDT0RFX1NFVkVSSVRZX0VSUiBESUFHX1NFVkVSSVRZX0VSUgotI2RlZmluZSBQT1NUQ09ERV9TRVZFUklUWV9XQVJOSU5HIERJQUdfU0VWRVJJVFlfV0FSTklORwotLyogVE9ETy0+IEluZm8gY3VycmVudGx5IGRvZXNuJ3Qgc2hvdywgc28gd2Ugc2V0IGluZm89d2FybmluZyAqLwotI2RlZmluZSBQT1NUQ09ERV9TRVZFUklUWV9JTkZPIERJQUdfU0VWRVJJVFlfUFJJTlQKLQotLyogZXhhbXBsZSBjYWxsIG9mIFBPU1RDT0RFX0xJTlVYXzIoVklTT1JfQ0hJUFNFVF9QQywgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKLSAqIFBsZWFzZSBhbHNvIG5vdGUgdGhhdCB0aGUgcmVzdWx0aW5nIHBvc3Rjb2RlIGlzIGluIGhleCwgc28gaWYgeW91IGFyZQotICogc2VhcmNoaW5nIGZvciB0aGUgX19MSU5FX18gbnVtYmVyLCBjb252ZXJ0IGl0IGZpcnN0IHRvIGRlY2ltYWwuICBUaGUgbGluZQotICogbnVtYmVyIGNvbWJpbmVkIHdpdGggZHJpdmVyIGFuZCB0eXBlIG9mIGNhbGwsIHdpbGwgYWxsb3cgeW91IHRvIHRyYWNrIGRvd24KLSAqIGV4YWN0bHkgd2hhdCBsaW5lIGFuIGVycm9yIG9jY3VycmVkIG9uLCBvciB3aGVyZSB0aGUgbGFzdCBkcml2ZXIKLSAqIGVudGVyZWQvZXhpdGVkIGZyb20uCi0gKi8KLQotLyogQkFTRSBGVU5DVElPTlMgKi8KLSNkZWZpbmUgUE9TVENPREVfTElOVVhfQShEUklWRVJfUEMsIEVWRU5UX1BDLCBwYzMyYml0LCBzZXZlcml0eSkJXAotZG8gewkJCQkJCQkJCVwKLQl1bnNpZ25lZCBsb25nIGxvbmcgcG9zdF9jb2RlX3RlbXA7CQkJCVwKLQlwb3N0X2NvZGVfdGVtcCA9ICgoKHU2NClEUklWRVJfUEMpIDw8IDU2KSB8ICgoKHU2NClFVkVOVF9QQykgPDwgNDQpIHwgXAotCQkoKCgodTY0KV9fTElORV9fKSAmIDB4RkZGKSA8PCAzMikgfAkJCVwKLQkJKCgodTY0KXBjMzJiaXQpICYgMHhGRkZGRkZGRik7CQkJCVwKLQlJU1NVRV9JT19WTUNBTExfUE9TVENPREVfU0VWRVJJVFkocG9zdF9jb2RlX3RlbXAsIHNldmVyaXR5KTsJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBQT1NUQ09ERV9MSU5VWF9CKERSSVZFUl9QQywgRVZFTlRfUEMsIHBjMTZiaXQxLCBwYzE2Yml0Miwgc2V2ZXJpdHkpIFwKLWRvIHsJCQkJCQkJCQlcCi0JdW5zaWduZWQgbG9uZyBsb25nIHBvc3RfY29kZV90ZW1wOwkJCQlcCi0JcG9zdF9jb2RlX3RlbXAgPSAoKCh1NjQpRFJJVkVSX1BDKSA8PCA1NikgfCAoKCh1NjQpRVZFTlRfUEMpIDw8IDQ0KSB8IFwKLQkJKCgoKHU2NClfX0xJTkVfXykgJiAweEZGRikgPDwgMzIpIHwJCQlcCi0JCSgoKCh1NjQpcGMxNmJpdDEpICYgMHhGRkZGKSA8PCAxNikgfAkJCVwKLQkJKCgodTY0KXBjMTZiaXQyKSAmIDB4RkZGRik7CQkJCVwKLQlJU1NVRV9JT19WTUNBTExfUE9TVENPREVfU0VWRVJJVFkocG9zdF9jb2RlX3RlbXAsIHNldmVyaXR5KTsJXAotfSB3aGlsZSAoMCkKLQotLyogTU9TVCBDT01NT04gKi8KLSNkZWZpbmUgUE9TVENPREVfTElOVVhfMihFVkVOVF9QQywgc2V2ZXJpdHkpCQkJCVwKLQlQT1NUQ09ERV9MSU5VWF9BKENVUlJFTlRfRklMRV9QQywgRVZFTlRfUEMsIDB4MDAwMCwgc2V2ZXJpdHkpCi0KLSNkZWZpbmUgUE9TVENPREVfTElOVVhfMyhFVkVOVF9QQywgcGMzMmJpdCwgc2V2ZXJpdHkpCQkJXAotCVBPU1RDT0RFX0xJTlVYX0EoQ1VSUkVOVF9GSUxFX1BDLCBFVkVOVF9QQywgcGMzMmJpdCwgc2V2ZXJpdHkpCi0KLSNkZWZpbmUgUE9TVENPREVfTElOVVhfNChFVkVOVF9QQywgcGMxNmJpdDEsIHBjMTZiaXQyLCBzZXZlcml0eSkJXAotCVBPU1RDT0RFX0xJTlVYX0IoQ1VSUkVOVF9GSUxFX1BDLCBFVkVOVF9QQywgcGMxNmJpdDEsCQlcCi0JCQkgcGMxNmJpdDIsIHNldmVyaXR5KQotCi0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2lvY2hhbm5lbC5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2lvY2hhbm5lbC5oCmluZGV4IDVjY2Y4MTQuLmNiYTQ0MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9pb2NoYW5uZWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvaW9jaGFubmVsLmgKQEAgLTMzLDcgKzMzLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RtYS1kaXJlY3Rpb24uaD4KICNpbmNsdWRlICJjaGFubmVsLmgiCi0jaW5jbHVkZSAiY2hhbm5lbF9ndWlkLmgiCiAKICNkZWZpbmUgVUxUUkFfVkhCQV9DSEFOTkVMX1BST1RPQ09MX1NJR05BVFVSRSBVTFRSQV9DSEFOTkVMX1BST1RPQ09MX1NJR05BVFVSRQogI2RlZmluZSBVTFRSQV9WTklDX0NIQU5ORUxfUFJPVE9DT0xfU0lHTkFUVVJFIFVMVFJBX0NIQU5ORUxfUFJPVE9DT0xfU0lHTkFUVVJFCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvcGVyaW9kaWNfd29yay5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3BlcmlvZGljX3dvcmsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIzMzM1YS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvcGVyaW9kaWNfd29yay5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyogcGVyaW9kaWNfd29yay5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKLSAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCi0gKiBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX19QRVJJT0RJQ19XT1JLX0hfXwotI2RlZmluZSBfX1BFUklPRElDX1dPUktfSF9fCi0KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLQotLyogUEVSSU9ESUNfV09SSyBhbiBvcGFxdWUgc3RydWN0dXJlIHRvIHVzZXJzLgotICogRmllbGRzIGFyZSBkZWNsYXJlZCBvbmx5IGluIHRoZSBpbXBsZW1lbnRhdGlvbiAuYyBmaWxlcy4KLSAqLwotc3RydWN0IHBlcmlvZGljX3dvcms7Ci0KLXN0cnVjdCBwZXJpb2RpY193b3JrICoKLXZpc29yX3BlcmlvZGljX3dvcmtfY3JlYXRlKHVsb25nIGppZmZ5X2ludGVydmFsLAotCQkJICAgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxdWV1ZSwKLQkJCSAgIHZvaWQgKCp3b3JrZnVuYykodm9pZCAqKSwKLQkJCSAgIHZvaWQgKndvcmtmdW5jYXJnLAotCQkJICAgY29uc3QgY2hhciAqZGV2bmFtKTsKLXZvaWQgdmlzb3JfcGVyaW9kaWNfd29ya19kZXN0cm95KHN0cnVjdCBwZXJpb2RpY193b3JrICpwdyk7Ci1ib29sIHZpc29yX3BlcmlvZGljX3dvcmtfbmV4dHBlcmlvZChzdHJ1Y3QgcGVyaW9kaWNfd29yayAqcHcpOwotYm9vbCB2aXNvcl9wZXJpb2RpY193b3JrX3N0YXJ0KHN0cnVjdCBwZXJpb2RpY193b3JrICpwdyk7Ci1ib29sIHZpc29yX3BlcmlvZGljX3dvcmtfc3RvcChzdHJ1Y3QgcGVyaW9kaWNfd29yayAqcHcpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS92YnVzaGVscGVyLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdmJ1c2hlbHBlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWI2YWFjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS92YnVzaGVscGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKiB2YnVzaGVscGVyLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgotICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKLSAqIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfX1ZCVVNIRUxQRVJfSF9fCi0jZGVmaW5lIF9fVkJVU0hFTFBFUl9IX18KLQotLyogVEFSR0VUX0hPU1ROQU1FIHNwZWNpZmllZCBhcyAtRFRBUkdFVF9IT1NUTkFNRT1cInRoZW5hbWVcIiBvbiB0aGUKLSAqIGNvbW1hbmQgbGluZQotICovCi0KLSNkZWZpbmUgVEFSR0VUX0hPU1ROQU1FICJsaW51eGd1ZXN0IgotCi1zdGF0aWMgaW5saW5lIHZvaWQgYnVzX2RldmljZV9pbmZvX2luaXQoCi0JCXN0cnVjdCB1bHRyYV92YnVzX2RldmljZWluZm8gKmJ1c19kZXZpY2VfaW5mb19wdHIsCi0JCWNvbnN0IGNoYXIgKmRldl90eXBlLCBjb25zdCBjaGFyICpkcnZfbmFtZSwKLQkJY29uc3QgY2hhciAqdmVyLCBjb25zdCBjaGFyICp2ZXJfdGFnKQotewotCW1lbXNldChidXNfZGV2aWNlX2luZm9fcHRyLCAwLCBzaXplb2Yoc3RydWN0IHVsdHJhX3ZidXNfZGV2aWNlaW5mbykpOwotCXNucHJpbnRmKGJ1c19kZXZpY2VfaW5mb19wdHItPmRldnR5cGUsCi0JCSBzaXplb2YoYnVzX2RldmljZV9pbmZvX3B0ci0+ZGV2dHlwZSksCi0JCSAiJXMiLCAoZGV2X3R5cGUpID8gZGV2X3R5cGUgOiAidW5rbm93blR5cGUiKTsKLQlzbnByaW50ZihidXNfZGV2aWNlX2luZm9fcHRyLT5kcnZuYW1lLAotCQkgc2l6ZW9mKGJ1c19kZXZpY2VfaW5mb19wdHItPmRydm5hbWUpLAotCQkgIiVzIiwgKGRydl9uYW1lKSA/IGRydl9uYW1lIDogInVua25vd25Ecml2ZXIiKTsKLQlzbnByaW50ZihidXNfZGV2aWNlX2luZm9fcHRyLT5pbmZvc3RycywKLQkJIHNpemVvZihidXNfZGV2aWNlX2luZm9fcHRyLT5pbmZvc3RycyksICIlc1x0JXNcdCVzIiwKLQkJICh2ZXIpID8gdmVyIDogInVua25vd25WZXIiLAotCQkgKHZlcl90YWcpID8gdmVyX3RhZyA6ICJ1bmtub3duVmVyVGFnIiwKLQkJIFRBUkdFVF9IT1NUTkFNRSk7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3ZlcnNpb24uaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS92ZXJzaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZDFkYTcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3ZlcnNpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCi0gKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQotICogZGV0YWlscy4KLSAqLwotCi0vKiB2ZXJzaW9uLmggKi8KLQotLyogIENvbW1vbiB2ZXJzaW9uL3JlbGVhc2UgaW5mbyBuZWVkZWQgYnkgYWxsIGNvbXBvbmVudHMgZ29lcyBoZXJlLgotICogIChUaGlzIGZpbGUgbXVzdCBjb21waWxlIGNsZWFubHkgaW4gYWxsIGVudmlyb25tZW50cy4pCi0gKiAgVWx0aW1hdGVseSwgdGhpcyB3aWxsIGJlIGNvbWJpbmVkIHdpdGggZGVmaW5lcyBnZW5lcmF0ZWQgZHluYW1pY2FsbHkgYXMKLSAqICBwYXJ0IG9mIHRoZSBzeXNnZW4sIGFuZCBzb21lIG9mIHRoZSBkZWZpbmVzIGJlbG93IG1heSBpbiBmYWN0IGVuZCB1cAotICogIGJlaW5nIHJlcGxhY2VkIHdpdGggZHluYW1pY2FsbHkgZ2VuZXJhdGVkIG9uZXMuCi0gKi8KLSNpZm5kZWYgX19WRVJTSU9OX0hfXwotI2RlZmluZSBfX1ZFUlNJT05fSF9fCi0KLSNkZWZpbmUgU1BBUlZFUjEgIjEiCi0jZGVmaW5lIFNQQVJWRVIyICIwIgotI2RlZmluZSBTUEFSVkVSMyAiMCIKLSNkZWZpbmUgU1BBUlZFUjQgIjAiCi0KLSNkZWZpbmUgIFZFUlNJT04gICAgICAgIFNQQVJWRVIxICIuIiBTUEFSVkVSMiAiLiIgU1BBUlZFUjMgIi4iIFNQQVJWRVI0Ci0KLS8qIEhlcmUgYXJlIHZhcmlvdXMgdmVyc2lvbiBmb3JtcyBuZWVkZWQgaW4gV2luZG93cyBlbnZpcm9ubWVudHMuCi0gKi8KLSNkZWZpbmUgVklTT1JfUFJPRFVDVFZFUlNJT04gICAgICBTUEFSVkVSQ09NTUEKLSNkZWZpbmUgVklTT1JfUFJPRFVDVFZFUlNJT05fU1RSICBTUEFSVkVSMSAiLiIgU1BBUlZFUjIgIi4iIFNQQVJWRVIzICIuIiBcCi0JU1BBUlZFUjQKLSNkZWZpbmUgVklTT1JfT0JKRUNUVkVSU0lPTl9TVFIgICBTUEFSVkVSMSAiLCIgU1BBUlZFUjIgIiwiIFNQQVJWRVIzICIsIiBcCi0JU1BBUlZFUjQKLQotI2RlZmluZSAgQ09QWVJJR0hUICAgICAgIlVuaXN5cyBDb3Jwb3JhdGlvbiIKLSNkZWZpbmUgIENPUFlSSUdIVERBVEUgICIyMDEwIC0gMjAxMyIKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdmlzb3JidXMuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS92aXNvcmJ1cy5oCmluZGV4IDliYWYxZWMuLjY3NzYyN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS92aXNvcmJ1cy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS92aXNvcmJ1cy5oCkBAIC0zNCw4ICszNCw5IEBACiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3V1aWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAotI2luY2x1ZGUgInBlcmlvZGljX3dvcmsuaCIKICNpbmNsdWRlICJjaGFubmVsLmgiCiAKIHN0cnVjdCB2aXNvcl9kcml2ZXI7CkBAIC02NSw4ICs2Niw2IEBACiAgKiBzdHJ1Y3Qgdmlzb3JfZHJpdmVyIC0gSW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgZWFjaCB2aXNvciBkcml2ZXIgd2hlbiBpdAogICogcmVnaXN0ZXJzIHdpdGggdGhlIHZpc29yYnVzIGRyaXZlci4KICAqIEBuYW1lOgkJTmFtZSBvZiB0aGUgdmlzb3IgZHJpdmVyLgotICogQHZlcnNpb246CQlUaGUgbnVtYmVyZWQgdmVyc2lvbiBvZiB0aGUgZHJpdmVyICh4LngueHh4KS4KLSAqIEB2ZXJ0YWc6CQlBIGh1bWFuIHJlYWRhYmxlIHZlcnNpb24gc3RyaW5nLgogICogQG93bmVyOgkJVGhlIG1vZHVsZSBvd25lci4KICAqIEBjaGFubmVsX3R5cGVzOglUeXBlcyBvZiBjaGFubmVscyBoYW5kbGVkIGJ5IHRoaXMgZHJpdmVyLCBlbmRpbmcgd2l0aAogICoJCQlhIHplcm8gR1VJRC4gT3VyIHNwZWNpYWxpemVkIEJVUy5tYXRjaCgpIG1ldGhvZCBrbm93cwpAQCAtOTMsMTIgKzkyLDkgQEAKICAqIEByZXN1bWU6CQlCZWhhdmVzIHNpbWlsYXIgdG8gcGF1c2UuCiAgKiBAZHJpdmVyOgkJUHJpdmF0ZSByZWZlcmVuY2UgdG8gdGhlIGRldmljZSBkcml2ZXIuIEZvciB1c2UgYnkgYnVzCiAgKgkJCWRyaXZlciBvbmx5LgotICogQHZlcnNpb25fYXR0cjoJUHJpdmF0ZSB2ZXJzaW9uIGZpZWxkLiBGb3IgdXNlIGJ5IGJ1cyBkcml2ZXIgb25seS4KICAqLwogc3RydWN0IHZpc29yX2RyaXZlciB7CiAJY29uc3QgY2hhciAqbmFtZTsKLQljb25zdCBjaGFyICp2ZXJzaW9uOwotCWNvbnN0IGNoYXIgKnZlcnRhZzsKIAlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKIAlzdHJ1Y3Qgdmlzb3JfY2hhbm5lbHR5cGVfZGVzY3JpcHRvciAqY2hhbm5lbF90eXBlczsKIAlpbnQgKCpwcm9iZSkoc3RydWN0IHZpc29yX2RldmljZSAqZGV2KTsKQEAgLTExMSw3ICsxMDcsNiBAQAogCiAJLyogVGhlc2UgZmllbGRzIGFyZSBmb3IgcHJpdmF0ZSB1c2UgYnkgdGhlIGJ1cyBkcml2ZXIgb25seS4gKi8KIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciBkcml2ZXI7Ci0Jc3RydWN0IGRyaXZlcl9hdHRyaWJ1dGUgdmVyc2lvbl9hdHRyOwogfTsKIAogI2RlZmluZSB0b192aXNvcl9kcml2ZXIoeCkgKCh4KSA/IFwKQEAgLTEyMCwzMyArMTE1LDMzIEBACiAvKioKICAqIHN0cnVjdCB2aXNvcl9kZXZpY2UgLSBBIGRldmljZSB0eXBlIGZvciB0aGluZ3MgInBsdWdnZWQiIGludG8gdGhlIHZpc29yYnVzCiAgKiBidXMKLSAqIHZpc29yY2hhbm5lbDoJCVBvaW50cyB0byB0aGUgY2hhbm5lbCB0aGF0IHRoZSBkZXZpY2UgaXMKKyAqIEB2aXNvcmNoYW5uZWw6CQlQb2ludHMgdG8gdGhlIGNoYW5uZWwgdGhhdCB0aGUgZGV2aWNlIGlzCiAgKgkJCQlhc3NvY2lhdGVkIHdpdGguCi0gKiBjaGFubmVsX3R5cGVfZ3VpZDoJCUlkZW50aWZpZXMgdGhlIGNoYW5uZWwgdHlwZSB0byB0aGUgYnVzIGRyaXZlci4KLSAqIGRldmljZToJCQlEZXZpY2Ugc3RydWN0IG1lYW50IGZvciB1c2UgYnkgdGhlIGJ1cyBkcml2ZXIKKyAqIEBjaGFubmVsX3R5cGVfZ3VpZDoJCUlkZW50aWZpZXMgdGhlIGNoYW5uZWwgdHlwZSB0byB0aGUgYnVzIGRyaXZlci4KKyAqIEBkZXZpY2U6CQkJRGV2aWNlIHN0cnVjdCBtZWFudCBmb3IgdXNlIGJ5IHRoZSBidXMgZHJpdmVyCiAgKgkJCQlvbmx5LgotICogbGlzdF9hbGw6CQkJVXNlZCBieSB0aGUgYnVzIGRyaXZlciB0byBlbnVtZXJhdGUgZGV2aWNlcy4KLSAqIHBlcmlvZGljX3dvcms6CQlEZXZpY2Ugd29yayBxdWV1ZS4gUHJpdmF0ZSB1c2UgYnkgYnVzIGRyaXZlcgotICoJCQkJb25seS4KLSAqIGJlaW5nX3JlbW92ZWQ6CQlJbmRpY2F0ZXMgdGhhdCB0aGUgZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgZnJvbQorICogQGxpc3RfYWxsOgkJCVVzZWQgYnkgdGhlIGJ1cyBkcml2ZXIgdG8gZW51bWVyYXRlIGRldmljZXMuCisgKiBAdGltZXI6CQkgICAgICAgIFRpbWVyIGZpcmVkIHBlcmlvZGljYWxseSB0byBkbyBpbnRlcnJ1cHQtdHlwZQorICoJCQkJYWN0aXZpdHkuCisgKiBAYmVpbmdfcmVtb3ZlZDoJCUluZGljYXRlcyB0aGF0IHRoZSBkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZCBmcm9tCiAgKgkJCQl0aGUgYnVzLiBQcml2YXRlIGJ1cyBkcml2ZXIgdXNlIG9ubHkuCi0gKiB2aXNvcmRyaXZlcl9jYWxsYmFja19sb2NrOglVc2VkIGJ5IHRoZSBidXMgZHJpdmVyIHRvIGxvY2sgd2hlbiBoYW5kbGluZworICogQHZpc29yZHJpdmVyX2NhbGxiYWNrX2xvY2s6CVVzZWQgYnkgdGhlIGJ1cyBkcml2ZXIgdG8gbG9jayB3aGVuIGhhbmRsaW5nCiAgKgkJCQljaGFubmVsIGV2ZW50cy4KLSAqIHBhdXNpbmc6CQkJSW5kaWNhdGVzIHRoYXQgYSBjaGFuZ2UgdG93YXJkcyBhIHBhdXNlZCBzdGF0ZS4KKyAqIEBwYXVzaW5nOgkJCUluZGljYXRlcyB0aGF0IGEgY2hhbmdlIHRvd2FyZHMgYSBwYXVzZWQgc3RhdGUuCiAgKgkJCQlpcyBpbiBwcm9ncmVzcy4gT25seSBtb2RpZmllZCBieSB0aGUgYnVzIGRyaXZlci4KLSAqIHJlc3VtaW5nOgkJCUluZGljYXRlcyB0aGF0IGEgY2hhbmdlIHRvd2FyZHMgYSBydW5uaW5nIHN0YXRlCisgKiBAcmVzdW1pbmc6CQkJSW5kaWNhdGVzIHRoYXQgYSBjaGFuZ2UgdG93YXJkcyBhIHJ1bm5pbmcgc3RhdGUKICAqCQkJCWlzIGluIHByb2dyZXNzLiBPbmx5IG1vZGlmaWVkIGJ5IHRoZSBidXMgZHJpdmVyLgotICogY2hpcHNldF9idXNfbm86CQlQcml2YXRlIGZpZWxkIHVzZWQgYnkgdGhlIGJ1cyBkcml2ZXIuCi0gKiBjaGlwc2V0X2Rldl9ubzoJCVByaXZhdGUgZmllbGQgdXNlZCB0aGUgYnVzIGRyaXZlci4KLSAqIHN0YXRlOgkJCVVzZWQgdG8gaW5kaWNhdGUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlCisgKiBAY2hpcHNldF9idXNfbm86CQlQcml2YXRlIGZpZWxkIHVzZWQgYnkgdGhlIGJ1cyBkcml2ZXIuCisgKiBAY2hpcHNldF9kZXZfbm86CQlQcml2YXRlIGZpZWxkIHVzZWQgdGhlIGJ1cyBkcml2ZXIuCisgKiBAc3RhdGU6CQkJVXNlZCB0byBpbmRpY2F0ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUKICAqCQkJCWRldmljZS4KLSAqIGluc3Q6CQkJVW5pcXVlIEdVSUQgZm9yIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIGRldmljZS4KLSAqIG5hbWU6CQkJTmFtZSBvZiB0aGUgZGV2aWNlLgotICogcGVuZGluZ19tc2dfaGRyOgkJRm9yIHByaXZhdGUgdXNlIGJ5IGJ1cyBkcml2ZXIgdG8gcmVzcG9uZCB0bworICogQGluc3Q6CQkJVW5pcXVlIEdVSUQgZm9yIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIGRldmljZS4KKyAqIEBuYW1lOgkJCU5hbWUgb2YgdGhlIGRldmljZS4KKyAqIEBwZW5kaW5nX21zZ19oZHI6CQlGb3IgcHJpdmF0ZSB1c2UgYnkgYnVzIGRyaXZlciB0byByZXNwb25kIHRvCiAgKgkJCQloeXBlcnZpc29yIHJlcXVlc3RzLgotICogdmJ1c19oZHJfaW5mbzoJCUEgcG9pbnRlciB0byBoZWFkZXIgaW5mby4gUHJpdmF0ZSB1c2UgYnkgYnVzCisgKiBAdmJ1c19oZHJfaW5mbzoJCUEgcG9pbnRlciB0byBoZWFkZXIgaW5mby4gUHJpdmF0ZSB1c2UgYnkgYnVzCiAgKgkJCQlkcml2ZXIuCi0gKiBwYXJ0aXRpb25fdXVpZDoJCUluZGljYXRlcyBjbGllbnQgcGFydGlvbiBpZC4gVGhpcyBzaG91bGQgYmUgdGhlCisgKiBAcGFydGl0aW9uX3V1aWQ6CQlJbmRpY2F0ZXMgY2xpZW50IHBhcnRpb24gaWQuIFRoaXMgc2hvdWxkIGJlIHRoZQogICoJCQkJc2FtZSBhY3Jvc3MgYWxsIHZpc29yX2RldmljZXMgaW4gdGhlIGN1cnJlbnQKICAqCQkJCWd1ZXN0LiBQcml2YXRlIHVzZSBieSBidXMgZHJpdmVyIG9ubHkuCiAgKi8KQEAgLTE1Nyw5ICsxNTIsMTAgQEAKIAkvKiBUaGVzZSBmaWVsZHMgYXJlIGZvciBwcml2YXRlIHVzZSBieSB0aGUgYnVzIGRyaXZlciBvbmx5LiAqLwogCXN0cnVjdCBkZXZpY2UgZGV2aWNlOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdF9hbGw7Ci0Jc3RydWN0IHBlcmlvZGljX3dvcmsgKnBlcmlvZGljX3dvcms7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJYm9vbCB0aW1lcl9hY3RpdmU7CiAJYm9vbCBiZWluZ19yZW1vdmVkOwotCXN0cnVjdCBzZW1hcGhvcmUgdmlzb3Jkcml2ZXJfY2FsbGJhY2tfbG9jazsKKwlzdHJ1Y3QgbXV0ZXggdmlzb3Jkcml2ZXJfY2FsbGJhY2tfbG9jazsKIAlib29sIHBhdXNpbmc7CiAJYm9vbCByZXN1bWluZzsKIAl1MzIgY2hpcHNldF9idXNfbm87CkBAIC0xNzQsNyArMTcwLDYgQEAKIAogI2RlZmluZSB0b192aXNvcl9kZXZpY2UoeCkgY29udGFpbmVyX29mKHgsIHN0cnVjdCB2aXNvcl9kZXZpY2UsIGRldmljZSkKIAotI2lmbmRlZiBTVEFOREFMT05FX0NMSUVOVAogaW50IHZpc29yYnVzX3JlZ2lzdGVyX3Zpc29yX2RyaXZlcihzdHJ1Y3Qgdmlzb3JfZHJpdmVyICopOwogdm9pZCB2aXNvcmJ1c191bnJlZ2lzdGVyX3Zpc29yX2RyaXZlcihzdHJ1Y3Qgdmlzb3JfZHJpdmVyICopOwogaW50IHZpc29yYnVzX3JlYWRfY2hhbm5lbChzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYsCkBAIC0xODMsNTAgKzE3OCwzNCBAQAogaW50IHZpc29yYnVzX3dyaXRlX2NoYW5uZWwoc3RydWN0IHZpc29yX2RldmljZSAqZGV2LAogCQkJICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHZvaWQgKnNyYywKIAkJCSAgIHVuc2lnbmVkIGxvbmcgbmJ5dGVzKTsKLWludCB2aXNvcmJ1c19jbGVhcl9jaGFubmVsKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldiwKLQkJCSAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1OCBjaCwgdW5zaWduZWQgbG9uZyBuYnl0ZXMpOwogdm9pZCB2aXNvcmJ1c19lbmFibGVfY2hhbm5lbF9pbnRlcnJ1cHRzKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldik7CiB2b2lkIHZpc29yYnVzX2Rpc2FibGVfY2hhbm5lbF9pbnRlcnJ1cHRzKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldik7Ci0jZW5kaWYKIAotLyogTm90ZSB0aGF0IGZvciB2aXNvcmNoYW5uZWxfY3JlYXRlKCkKLSAqIDxjaGFubmVsX2J5dGVzPiBhbmQgPGd1aWQ+IGFyZ3VtZW50cyBtYXkgYmUgMCBpZiB3ZSBhcmUgYSBjaGFubmVsIENMSUVOVC4KLSAqIEluIHRoaXMgY2FzZSwgdGhlIHZhbHVlcyBjYW4gc2ltcGx5IGJlIHJlYWQgZnJvbSB0aGUgY2hhbm5lbCBoZWFkZXIuCisvKiBMZXZlbHMgb2Ygc2V2ZXJpdHkgZm9yIGRpYWdub3N0aWMgZXZlbnRzLCBpbiBvcmRlciBmcm9tIGxvd2VzdCBzZXZlcml0eSB0bworICogaGlnaGVzdCAoaS5lLiBmYXRhbCBlcnJvcnMgYXJlIHRoZSBtb3N0IHNldmVyZSwgYW5kIHNob3VsZCBhbHdheXMgYmUgbG9nZ2VkLAorICogYnV0IGluZm8gZXZlbnRzIHJhcmVseSBuZWVkIHRvIGJlIGxvZ2dlZCBleGNlcHQgZHVyaW5nIGRlYnVnZ2luZykuIFRoZQorICogdmFsdWVzIERJQUdfU0VWRVJJVFlfRU5VTV9CRUdJTiBhbmQgRElBR19TRVZFUklUWV9FTlVNX0VORCBhcmUgbm90IHZhbGlkCisgKiBzZXZlcml0eSB2YWx1ZXMuICBUaGV5IGV4aXN0IG1lcmVseSB0byBkaWxpbmVhdGUgdGhlIGxpc3QsIHNvIHRoYXQgZnV0dXJlCisgKiBhZGRpdGlvbnMgd29uJ3QgcmVxdWlyZSBjaGFuZ2VzIHRvIHRoZSBkcml2ZXIgKGkuZS4gd2hlbiBjaGVja2luZyBmb3IKKyAqIG91dC1vZi1yYW5nZSBzZXZlcml0aWVzIGluIFNldFNldmVyaXR5KS4gVGhlIHZhbHVlcyBESUFHX1NFVkVSSVRZX09WRVJSSURFCisgKiBhbmQgRElBR19TRVZFUklUWV9TSFVUT0ZGIGFyZSBub3QgdmFsaWQgc2V2ZXJpdHkgdmFsdWVzIGZvciBsb2dnaW5nIGV2ZW50cworICogYnV0IHRoZXkgYXJlIHZhbGlkIGZvciBjb250cm9sbGluZyB0aGUgYW1vdW50IG9mIGV2ZW50IGRhdGEuIENoYW5nZXMgbWFkZQorICogdG8gdGhlIGVudW0sIG5lZWQgdG8gYmUgcmVmbGVjdGVkIGluIHMtUGFyLgogICovCi1zdHJ1Y3Qgdmlzb3JjaGFubmVsICp2aXNvcmNoYW5uZWxfY3JlYXRlKHU2NCBwaHlzYWRkciwKLQkJCQkJIHVuc2lnbmVkIGxvbmcgY2hhbm5lbF9ieXRlcywKLQkJCQkJIGdmcF90IGdmcCwgdXVpZF9sZSBndWlkKTsKLXN0cnVjdCB2aXNvcmNoYW5uZWwgKnZpc29yY2hhbm5lbF9jcmVhdGVfd2l0aF9sb2NrKHU2NCBwaHlzYWRkciwKLQkJCQkJCSAgIHVuc2lnbmVkIGxvbmcgY2hhbm5lbF9ieXRlcywKLQkJCQkJCSAgIGdmcF90IGdmcCwgdXVpZF9sZSBndWlkKTsKLXZvaWQgdmlzb3JjaGFubmVsX2Rlc3Ryb3koc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCk7Ci1pbnQgdmlzb3JjaGFubmVsX3JlYWQoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdWxvbmcgb2Zmc2V0LAotCQkgICAgICB2b2lkICpsb2NhbCwgdWxvbmcgbmJ5dGVzKTsKLWludCB2aXNvcmNoYW5uZWxfd3JpdGUoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdWxvbmcgb2Zmc2V0LAotCQkgICAgICAgdm9pZCAqbG9jYWwsIHVsb25nIG5ieXRlcyk7Ci1pbnQgdmlzb3JjaGFubmVsX2NsZWFyKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHVsb25nIG9mZnNldCwKLQkJICAgICAgIHU4IGNoLCB1bG9uZyBuYnl0ZXMpOwotYm9vbCB2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHUzMiBxdWV1ZSwKLQkJCSAgICAgICB2b2lkICptc2cpOwotYm9vbCB2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHUzMiBxdWV1ZSwKLQkJCSAgICAgICB2b2lkICptc2cpOwotYm9vbCB2aXNvcmNoYW5uZWxfc2lnbmFsZW1wdHkoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlKTsKK2VudW0gZGlhZ19zZXZlcml0eSB7CisJRElBR19TRVZFUklUWV9WRVJCT1NFID0gMCwKKwlESUFHX1NFVkVSSVRZX0lORk8gPSAxLAorCURJQUdfU0VWRVJJVFlfV0FSTklORyA9IDIsCisJRElBR19TRVZFUklUWV9FUlIgPSAzLAorCURJQUdfU0VWRVJJVFlfUFJJTlQgPSA0LAorfTsKIAotaW50IHZpc29yY2hhbm5lbF9zaWduYWxxdWV1ZV9zbG90c19hdmFpbChzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLAotCQkJCQkgdTMyIHF1ZXVlKTsKLWludCB2aXNvcmNoYW5uZWxfc2lnbmFscXVldWVfbWF4X3Nsb3RzKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHUzMiBxdWV1ZSk7Ci11NjQgdmlzb3JjaGFubmVsX2dldF9waHlzYWRkcihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKTsKLXVsb25nIHZpc29yY2hhbm5lbF9nZXRfbmJ5dGVzKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwpOwotY2hhciAqdmlzb3JjaGFubmVsX2lkKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIGNoYXIgKnMpOwotY2hhciAqdmlzb3JjaGFubmVsX3pvbmVpZChzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCBjaGFyICpzKTsKLXU2NCB2aXNvcmNoYW5uZWxfZ2V0X2NsaWVudHBhcnRpdGlvbihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKTsKLWludCB2aXNvcmNoYW5uZWxfc2V0X2NsaWVudHBhcnRpdGlvbihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLAotCQkJCSAgICAgdTY0IHBhcnRpdGlvbl9oYW5kbGUpOworaW50IHZpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlLAorCQkJICAgICAgdm9pZCAqbXNnKTsKK2ludCB2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHUzMiBxdWV1ZSwKKwkJCSAgICAgIHZvaWQgKm1zZyk7Citib29sIHZpc29yY2hhbm5lbF9zaWduYWxlbXB0eShzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1MzIgcXVldWUpOwogdXVpZF9sZSB2aXNvcmNoYW5uZWxfZ2V0X3V1aWQoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCk7Ci1jaGFyICp2aXNvcmNoYW5uZWxfdXVpZF9pZCh1dWlkX2xlICpndWlkLCBjaGFyICpzKTsKLXZvaWQgdmlzb3JjaGFubmVsX2RlYnVnKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIGludCBudW1fcXVldWVzLAotCQkJc3RydWN0IHNlcV9maWxlICpzZXEsIHUzMiBvZmYpOwotdm9pZCBfX2lvbWVtICp2aXNvcmNoYW5uZWxfZ2V0X2hlYWRlcihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKTsKIAogI2RlZmluZSBCVVNfUk9PVF9ERVZJQ0UJCVVJTlRfTUFYCiBzdHJ1Y3Qgdmlzb3JfZGV2aWNlICp2aXNvcmJ1c19nZXRfZGV2aWNlX2J5X2lkKHUzMiBidXNfbm8sIHUzMiBkZXZfbm8sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy9NYWtlZmlsZQppbmRleCBmYzc5MGU3Li5mMzczMGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvTWFrZWZpbGUKQEAgLTcsNiArNyw1IEBACiB2aXNvcmJ1cy15IDo9IHZpc29yYnVzX21haW4ubwogdmlzb3JidXMteSArPSB2aXNvcmNoYW5uZWwubwogdmlzb3JidXMteSArPSB2aXNvcmNoaXBzZXQubwotdmlzb3JidXMteSArPSBwZXJpb2RpY193b3JrLm8KIAogY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL2NvbnRyb2x2bWNoYW5uZWwuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvY29udHJvbHZtY2hhbm5lbC5oCmluZGV4IDAzZTM2ZmIuLmYwYmZjNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvY29udHJvbHZtY2hhbm5lbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvY29udHJvbHZtY2hhbm5lbC5oCkBAIC00ODIsNCArNDgyLDgwIEBACiAJdTMyIHJlc2VydmVkOwkJLyogTmF0dXJhbCBhbGlnbm1lbnQgKi8KIH07CiAKKy8qIEdlbmVyYWwgRXJyb3JzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzAtOTldICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9BTFJFQURZX0RPTkUgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfSU9SRU1BUF9GQUlMRUQgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0tNQUxMT0NfRkFJTEVEICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9NRVNTQUdFX0lEX1VOS05PV04gICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfTUVTU0FHRV9JRF9JTlZBTElEX0ZPUl9DTElFTlQgICAgICA1CisKKy8qIENPTlRST0xWTV9JTklUX0NISVBTRVQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzEwMC0xOTldICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NMSUVOVF9TV0lUQ0hDT1VOVF9OT05aRVJPICAgICAgICAgMTAwCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0VYUEVDVEVEX0NISVBTRVRfSU5JVCAgICAgICAgICAgICAgMTAxCisKKy8qIE1heGltdW0gTGltaXQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzIwMC0yOTldICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX01BWF9CVVNFUwkJMjAxCS8qIEJVU19DUkVBVEUgKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfTUFYX0RFVklDRVMgICAgICAgIDIwMgkvKiBERVZJQ0VfQ1JFQVRFICovCisvKiBQYXlsb2FkIGFuZCBQYXJhbWV0ZXIgUmVsYXRlZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVs0MDAtNDk5XSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9QQVlMT0FEX0lOVkFMSUQJNDAwCS8qIFNXSVRDSF9BVFRBQ0hFWFRQT1JULAorCQkJCQkJCSAqIERFVklDRV9DT05GSUdVUkUKKwkJCQkJCQkgKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfSU5JVElBVE9SX1BBUkFNRVRFUl9JTlZBTElEIDQwMQkvKiBNdWx0aXBsZSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9UQVJHRVRfUEFSQU1FVEVSX0lOVkFMSUQgNDAyIC8qIERFVklDRV9DT05GSUdVUkUgKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0xJRU5UX1BBUkFNRVRFUl9JTlZBTElEIDQwMyAvKiBERVZJQ0VfQ09ORklHVVJFICovCisvKiBTcGVjaWZpZWRbUGFja2V0IFN0cnVjdHVyZV0gVmFsdWUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzUwMC01OTldICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0JVU19JTlZBTElECTUwMAkvKiBTV0lUQ0hfQVRUQUNISU5UUE9SVCwKKwkJCQkJCQkgKiBCVVNfQ09ORklHVVJFLAorCQkJCQkJCSAqIERFVklDRV9DUkVBVEUsCisJCQkJCQkJICogREVWSUNFX0NPTkZJRworCQkJCQkJCSAqIERFVklDRV9ERVNUUk9ZCisJCQkJCQkJICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0RFVklDRV9JTlZBTElECTUwMSAvKiBTV0lUQ0hfQVRUQUNISU5UUE9SVCAqLworCQkJCQkJICAgIC8qIERFVklDRV9DUkVBVEUsCisJCQkJCQkgICAgICogREVWSUNFX0NPTkZJR1VSRSwKKwkJCQkJCSAgICAgKiBERVZJQ0VfREVTVFJPWQorCQkJCQkJICAgICAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSEFOTkVMX0lOVkFMSUQJNTAyIC8qIERFVklDRV9DUkVBVEUsCisJCQkJCQkgICAgICogREVWSUNFX0NPTkZJR1VSRQorCQkJCQkJICAgICAqLworLyogUGFydGl0aW9uIERyaXZlciBDYWxsYmFjayBJbnRlcmZhY2UtLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzYwMC02OTldICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0ZBSUxVUkUgNjA0CS8qIEJVU19DUkVBVEUsCisJCQkJCQkJICogQlVTX0RFU1RST1ksCisJCQkJCQkJICogREVWSUNFX0NSRUFURSwKKwkJCQkJCQkgKiBERVZJQ0VfREVTVFJPWQorCQkJCQkJCSAqLworLyogVW5hYmxlIHRvIGludm9rZSBWSVJUUENJIGNhbGxiYWNrICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0NBTExCQUNLX0VSUk9SIDYwNQorCQkJCQkJCS8qIEJVU19DUkVBVEUsCisJCQkJCQkJICogQlVTX0RFU1RST1ksCisJCQkJCQkJICogREVWSUNFX0NSRUFURSwKKwkJCQkJCQkgKiBERVZJQ0VfREVTVFJPWQorCQkJCQkJCSAqLworLyogVklSVFBDSSBDYWxsYmFjayByZXR1cm5lZCBlcnJvciAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9HRU5FUklDX0RSSVZFUl9DQUxMQkFDS19FUlJPUiA2MDYKKwkJCQkJCQkvKiBTV0lUQ0hfQVRUQUNIRVhUUE9SVCwKKwkJCQkJCQkgKiBTV0lUQ0hfREVUQUNIRVhUUE9SVAorCQkJCQkJCSAqIERFVklDRV9DT05GSUdVUkUKKwkJCQkJCQkgKi8KKworLyogZ2VuZXJpYyBkZXZpY2UgY2FsbGJhY2sgcmV0dXJuZWQgZXJyb3IgKi8KKy8qIEJ1cyBSZWxhdGVkLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzcwMC03OTldICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0JVU19ERVZJQ0VfQVRUQUNIRUQgNzAwCS8qIEJVU19ERVNUUk9ZICovCisvKiBDaGFubmVsIFJlbGF0ZWQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVs4MDAtODk5XSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSEFOTkVMX1RZUEVfVU5LTk9XTiA4MDAJLyogR0VUX0NIQU5ORUxJTkZPLAorCQkJCQkJCSAqIERFVklDRV9ERVNUUk9ZCisJCQkJCQkJICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NIQU5ORUxfU0laRV9UT09fU01BTEwgODAxCS8qIERFVklDRV9DUkVBVEUgKi8KKy8qIENoaXBzZXQgU2h1dGRvd24gUmVsYXRlZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVsxMDAwLTEwOTldICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NISVBTRVRfU0hVVERPV05fRkFJTEVEICAgICAgICAgICAgMTAwMAorI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSElQU0VUX1NIVVRET1dOX0FMUkVBRFlfQUNUSVZFICAgIDEwMDEKKworLyogQ2hpcHNldCBTdG9wIFJlbGF0ZWQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzExMDAtMTE5OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hJUFNFVF9TVE9QX0ZBSUxFRF9CVVMgICAgICAgICAgICAxMTAwCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NISVBTRVRfU1RPUF9GQUlMRURfU1dJVENIICAgICAgICAgMTEwMQorCisvKiBEZXZpY2UgUmVsYXRlZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bMTQwMC0xNDk5XSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9ERVZJQ0VfVURFVl9USU1FT1VUICAgICAgICAgICAgICAgIDE0MDAKKwogI2VuZGlmCQkJCS8qIF9fQ09OVFJPTFZNQ0hBTk5FTF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvY29udHJvbHZtY29tcGxldGlvbnN0YXR1cy5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy9jb250cm9sdm1jb21wbGV0aW9uc3RhdHVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYWQwZWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy9jb250cm9sdm1jb21wbGV0aW9uc3RhdHVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyogY29udHJvbHZtY29tcGxldGlvbnN0YXR1cy5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEwIC0gMjAxNSBVTklTWVMgQ09SUE9SQVRJT04KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgotICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKLSAqIGRldGFpbHMuCi0gKi8KLQotLyogIERlZmluZXMgZm9yIGFsbCB2YWxpZCB2YWx1ZXMgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIG1lc3NhZ2UgaGVhZGVyCi0gKiAgY29tcGxldGlvblN0YXR1cyBmaWVsZC4gIFNlZSBjb250cm9sdm1jaGFubmVsLmggZm9yIGRlc2NyaXB0aW9uIG9mCi0gKiAgdGhlIGhlYWRlcjogX0NPTlRST0xWTV9NRVNTQUdFX0hFQURFUi4KLSAqLwotCi0jaWZuZGVmIF9fQ09OVFJPTFZNQ09NUExFVElPTlNUQVRVU19IX18KLSNkZWZpbmUgX19DT05UUk9MVk1DT01QTEVUSU9OU1RBVFVTX0hfXwotCi0vKiBHZW5lcmFsIEVycm9ycy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVswLTk5XSAqLwotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQUxSRUFEWV9ET05FICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0lPUkVNQVBfRkFJTEVEICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9LTUFMTE9DX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfTUVTU0FHRV9JRF9VTktOT1dOICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX01FU1NBR0VfSURfSU5WQUxJRF9GT1JfQ0xJRU5UICAgICAgNQotCi0vKiBDT05UUk9MVk1fSU5JVF9DSElQU0VULS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVsxMDAtMTk5XSAqLwotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DTElFTlRfU1dJVENIQ09VTlRfTk9OWkVSTyAgICAgICAgIDEwMAotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9FWFBFQ1RFRF9DSElQU0VUX0lOSVQgICAgICAgICAgICAgIDEwMQotCi0vKiBNYXhpbXVtIExpbWl0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVsyMDAtMjk5XSAqLwotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9NQVhfQlVTRVMJCTIwMQkvKiBCVVNfQ1JFQVRFICovCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX01BWF9ERVZJQ0VTICAgICAgICAyMDIJLyogREVWSUNFX0NSRUFURSAqLwotLyogUGF5bG9hZCBhbmQgUGFyYW1ldGVyIFJlbGF0ZWQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bNDAwLTQ5OV0gKi8KLSNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfUEFZTE9BRF9JTlZBTElECTQwMAkvKiBTV0lUQ0hfQVRUQUNIRVhUUE9SVCwKLQkJCQkJCQkgKiBERVZJQ0VfQ09ORklHVVJFCi0JCQkJCQkJICovCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0lOSVRJQVRPUl9QQVJBTUVURVJfSU5WQUxJRCA0MDEJLyogTXVsdGlwbGUgKi8KLSNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfVEFSR0VUX1BBUkFNRVRFUl9JTlZBTElEIDQwMiAvKiBERVZJQ0VfQ09ORklHVVJFICovCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NMSUVOVF9QQVJBTUVURVJfSU5WQUxJRCA0MDMgLyogREVWSUNFX0NPTkZJR1VSRSAqLwotLyogU3BlY2lmaWVkW1BhY2tldCBTdHJ1Y3R1cmVdIFZhbHVlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVs1MDAtNTk5XSAqLwotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9CVVNfSU5WQUxJRAk1MDAJLyogU1dJVENIX0FUVEFDSElOVFBPUlQsCi0JCQkJCQkJICogQlVTX0NPTkZJR1VSRSwKLQkJCQkJCQkgKiBERVZJQ0VfQ1JFQVRFLAotCQkJCQkJCSAqIERFVklDRV9DT05GSUcKLQkJCQkJCQkgKiBERVZJQ0VfREVTVFJPWQotCQkJCQkJCSAqLwotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9ERVZJQ0VfSU5WQUxJRAk1MDEgLyogU1dJVENIX0FUVEFDSElOVFBPUlQgKi8KLQkJCQkJCSAgICAvKiBERVZJQ0VfQ1JFQVRFLAotCQkJCQkJICAgICAqIERFVklDRV9DT05GSUdVUkUsCi0JCQkJCQkgICAgICogREVWSUNFX0RFU1RST1kKLQkJCQkJCSAgICAgKi8KLSNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hBTk5FTF9JTlZBTElECTUwMiAvKiBERVZJQ0VfQ1JFQVRFLAotCQkJCQkJICAgICAqIERFVklDRV9DT05GSUdVUkUKLQkJCQkJCSAgICAgKi8KLS8qIFBhcnRpdGlvbiBEcml2ZXIgQ2FsbGJhY2sgSW50ZXJmYWNlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVs2MDAtNjk5XSAqLwotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9WSVJUUENJX0RSSVZFUl9GQUlMVVJFIDYwNAkvKiBCVVNfQ1JFQVRFLAotCQkJCQkJCSAqIEJVU19ERVNUUk9ZLAotCQkJCQkJCSAqIERFVklDRV9DUkVBVEUsCi0JCQkJCQkJICogREVWSUNFX0RFU1RST1kKLQkJCQkJCQkgKi8KLS8qIFVuYWJsZSB0byBpbnZva2UgVklSVFBDSSBjYWxsYmFjayAqLwotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9WSVJUUENJX0RSSVZFUl9DQUxMQkFDS19FUlJPUiA2MDUKLQkJCQkJCQkvKiBCVVNfQ1JFQVRFLAotCQkJCQkJCSAqIEJVU19ERVNUUk9ZLAotCQkJCQkJCSAqIERFVklDRV9DUkVBVEUsCi0JCQkJCQkJICogREVWSUNFX0RFU1RST1kKLQkJCQkJCQkgKi8KLS8qIFZJUlRQQ0kgQ2FsbGJhY2sgcmV0dXJuZWQgZXJyb3IgKi8KLSNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfR0VORVJJQ19EUklWRVJfQ0FMTEJBQ0tfRVJST1IgNjA2Ci0JCQkJCQkJLyogU1dJVENIX0FUVEFDSEVYVFBPUlQsCi0JCQkJCQkJICogU1dJVENIX0RFVEFDSEVYVFBPUlQKLQkJCQkJCQkgKiBERVZJQ0VfQ09ORklHVVJFCi0JCQkJCQkJICovCi0KLS8qIGdlbmVyaWMgZGV2aWNlIGNhbGxiYWNrIHJldHVybmVkIGVycm9yICovCi0vKiBCdXMgUmVsYXRlZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVs3MDAtNzk5XSAqLwotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9CVVNfREVWSUNFX0FUVEFDSEVEIDcwMAkvKiBCVVNfREVTVFJPWSAqLwotLyogQ2hhbm5lbCBSZWxhdGVkLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bODAwLTg5OV0gKi8KLSNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hBTk5FTF9UWVBFX1VOS05PV04gODAwCS8qIEdFVF9DSEFOTkVMSU5GTywKLQkJCQkJCQkgKiBERVZJQ0VfREVTVFJPWQotCQkJCQkJCSAqLwotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSEFOTkVMX1NJWkVfVE9PX1NNQUxMIDgwMQkvKiBERVZJQ0VfQ1JFQVRFICovCi0vKiBDaGlwc2V0IFNodXRkb3duIFJlbGF0ZWQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bMTAwMC0xMDk5XSAqLwotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSElQU0VUX1NIVVRET1dOX0ZBSUxFRCAgICAgICAgICAgIDEwMDAKLSNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hJUFNFVF9TSFVURE9XTl9BTFJFQURZX0FDVElWRSAgICAxMDAxCi0KLS8qIENoaXBzZXQgU3RvcCBSZWxhdGVkLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVsxMTAwLTExOTldICovCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NISVBTRVRfU1RPUF9GQUlMRURfQlVTICAgICAgICAgICAgMTEwMAotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSElQU0VUX1NUT1BfRkFJTEVEX1NXSVRDSCAgICAgICAgIDExMDEKLQotLyogRGV2aWNlIFJlbGF0ZWQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzE0MDAtMTQ5OV0gKi8KLSNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfREVWSUNFX1VERVZfVElNRU9VVCAgICAgICAgICAgICAgICAxNDAwCi0KLSNlbmRpZiAvKiBfX0NPTlRST0xWTUNPTVBMRVRJT05TVEFUVVNfSF9fIG5vdCBkZWZpbmVkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL2lvdm1jYWxsX2dudWMuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvaW92bWNhbGxfZ251Yy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGVhN2YzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvaW92bWNhbGxfZ251Yy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDEwIC0gMjAxNSBVTklTWVMgQ09SUE9SQVRJT04KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgotICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKLSAqIGRldGFpbHMuCi0gKi8KLQotLyogTGludXggR0NDIFZlcnNpb24gKDMyLWJpdCBhbmQgNjQtYml0KSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCi1fX3VuaXN5c192bWNhbGxfZ251Yyh1bnNpZ25lZCBsb25nIHR1cGxlLCB1bnNpZ25lZCBsb25nIHJlZ19lYngsCi0JCSAgICAgdW5zaWduZWQgbG9uZyByZWdfZWN4KQotewotCXVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gMDsKLQl1bnNpZ25lZCBpbnQgY3B1aWRfZWF4LCBjcHVpZF9lYngsIGNwdWlkX2VjeCwgY3B1aWRfZWR4OwotCi0JY3B1aWQoMHgwMDAwMDAwMSwgJmNwdWlkX2VheCwgJmNwdWlkX2VieCwgJmNwdWlkX2VjeCwgJmNwdWlkX2VkeCk7Ci0JaWYgKCEoY3B1aWRfZWN4ICYgMHg4MDAwMDAwMCkpCi0JCXJldHVybiAtRVBFUk07Ci0KLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiLmJ5dGUgMHgwMGYsIDB4MDAxLCAweDBjMSIgOiAiPWEiKHJlc3VsdCkgOgotCQkiYSIodHVwbGUpLCAiYiIocmVnX2VieCksICJjIihyZWdfZWN4KSk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCi1fX3VuaXN5c19leHRlbmRlZF92bWNhbGxfZ251Yyh1bnNpZ25lZCBsb25nIGxvbmcgdHVwbGUsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgcmVnX2VieCwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyByZWdfZWN4LAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHJlZ19lZHgpCi17Ci0JdW5zaWduZWQgbG9uZyByZXN1bHQgPSAwOwotCXVuc2lnbmVkIGludCBjcHVpZF9lYXgsIGNwdWlkX2VieCwgY3B1aWRfZWN4LCBjcHVpZF9lZHg7Ci0KLQljcHVpZCgweDAwMDAwMDAxLCAmY3B1aWRfZWF4LCAmY3B1aWRfZWJ4LCAmY3B1aWRfZWN4LCAmY3B1aWRfZWR4KTsKLQlpZiAoIShjcHVpZF9lY3ggJiAweDgwMDAwMDAwKSkKLQkJcmV0dXJuIC1FUEVSTTsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fKCIuYnl0ZSAweDAwZiwgMHgwMDEsIDB4MGMxIiA6ICI9YSIocmVzdWx0KSA6Ci0JCSJhIih0dXBsZSksICJiIihyZWdfZWJ4KSwgImMiKHJlZ19lY3gpLCAiZCIocmVnX2VkeCkpOwotCXJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3BlcmlvZGljX3dvcmsuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvcGVyaW9kaWNfd29yay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGIxNTI3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvcGVyaW9kaWNfd29yay5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qIHBlcmlvZGljX3dvcmsuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCAtIDIwMTUgVU5JU1lTIENPUlBPUkFUSU9OCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKLSAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCi0gKiBkZXRhaWxzLgotICovCi0KLS8qCi0gKiAgSGVscGVyIGZ1bmN0aW9ucyB0byBzY2hlZHVsZSBwZXJpb2RpYyB3b3JrIGluIExpbnV4IGtlcm5lbCBtb2RlLgotICovCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLQotI2luY2x1ZGUgInBlcmlvZGljX3dvcmsuaCIKLQotI2RlZmluZSBNWURSVk5BTUUgInBlcmlvZGljX3dvcmsiCi0KLXN0cnVjdCBwZXJpb2RpY193b3JrIHsKLQlyd2xvY2tfdCBsb2NrOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKLQl2b2lkICgqd29ya2Z1bmMpKHZvaWQgKik7Ci0Jdm9pZCAqd29ya2Z1bmNhcmc7Ci0JYm9vbCBpc19zY2hlZHVsZWQ7Ci0JYm9vbCB3YW50X3RvX3N0b3A7Ci0JdWxvbmcgamlmZnlfaW50ZXJ2YWw7Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxdWV1ZTsKLQljb25zdCBjaGFyICpkZXZuYW07Ci19OwotCi1zdGF0aWMgdm9pZCBwZXJpb2RpY193b3JrX2Z1bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBwZXJpb2RpY193b3JrICpwdzsKLQotCXB3ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBwZXJpb2RpY193b3JrLCB3b3JrLndvcmspOwotCSgqcHctPndvcmtmdW5jKShwdy0+d29ya2Z1bmNhcmcpOwotfQotCi1zdHJ1Y3QgcGVyaW9kaWNfd29yawotKnZpc29yX3BlcmlvZGljX3dvcmtfY3JlYXRlKHVsb25nIGppZmZ5X2ludGVydmFsLAotCQkJICAgIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3b3JrcXVldWUsCi0JCQkgICAgdm9pZCAoKndvcmtmdW5jKSh2b2lkICopLAotCQkJICAgIHZvaWQgKndvcmtmdW5jYXJnLAotCQkJICAgIGNvbnN0IGNoYXIgKmRldm5hbSkKLXsKLQlzdHJ1Y3QgcGVyaW9kaWNfd29yayAqcHc7Ci0KLQlwdyA9IGt6YWxsb2Moc2l6ZW9mKCpwdyksIEdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKLQlpZiAoIXB3KQotCQlyZXR1cm4gTlVMTDsKLQotCXJ3bG9ja19pbml0KCZwdy0+bG9jayk7Ci0JcHctPmppZmZ5X2ludGVydmFsID0gamlmZnlfaW50ZXJ2YWw7Ci0JcHctPndvcmtxdWV1ZSA9IHdvcmtxdWV1ZTsKLQlwdy0+d29ya2Z1bmMgPSB3b3JrZnVuYzsKLQlwdy0+d29ya2Z1bmNhcmcgPSB3b3JrZnVuY2FyZzsKLQlwdy0+ZGV2bmFtID0gZGV2bmFtOwotCXJldHVybiBwdzsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHZpc29yX3BlcmlvZGljX3dvcmtfY3JlYXRlKTsKLQotdm9pZCB2aXNvcl9wZXJpb2RpY193b3JrX2Rlc3Ryb3koc3RydWN0IHBlcmlvZGljX3dvcmsgKnB3KQotewotCWtmcmVlKHB3KTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHZpc29yX3BlcmlvZGljX3dvcmtfZGVzdHJveSk7Ci0KLS8qKiBDYWxsIHRoaXMgZnJvbSB5b3VyIHBlcmlvZGljIHdvcmsgd29ya2VyIGZ1bmN0aW9uIHRvIHNjaGVkdWxlIHRoZSBuZXh0Ci0gKiAgY2FsbC4KLSAqICBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UsIHRoZXJlIHdhcyBhIGZhaWx1cmUgYW5kIHRoZQotICogIHBlcmlvZGljIHdvcmsgaXMgbm8gbG9uZ2VyIHNjaGVkdWxlZAotICovCi1ib29sIHZpc29yX3BlcmlvZGljX3dvcmtfbmV4dHBlcmlvZChzdHJ1Y3QgcGVyaW9kaWNfd29yayAqcHcpCi17Ci0JYm9vbCByYyA9IGZhbHNlOwotCi0Jd3JpdGVfbG9jaygmcHctPmxvY2spOwotCWlmIChwdy0+d2FudF90b19zdG9wKSB7Ci0JCXB3LT5pc19zY2hlZHVsZWQgPSBmYWxzZTsKLQkJcHctPndhbnRfdG9fc3RvcCA9IGZhbHNlOwotCQlyYyA9IHRydWU7ICAvKiB5ZXMsIHRydWU7IHNlZSB2aXNvcl9wZXJpb2RpY193b3JrX3N0b3AoKSAqLwotCQlnb3RvIHVubG9jazsKLQl9IGVsc2UgaWYgKCFxdWV1ZV9kZWxheWVkX3dvcmsocHctPndvcmtxdWV1ZSwgJnB3LT53b3JrLAotCQkJCSAgICAgICBwdy0+amlmZnlfaW50ZXJ2YWwpKSB7Ci0JCXB3LT5pc19zY2hlZHVsZWQgPSBmYWxzZTsKLQkJcmMgPSBmYWxzZTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCXJjID0gdHJ1ZTsKLXVubG9jazoKLQl3cml0ZV91bmxvY2soJnB3LT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9wZXJpb2RpY193b3JrX25leHRwZXJpb2QpOwotCi0vKiogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWZmIG5ldyBwZXJpb2RpYyB3b3JrIHdhcyBhY3R1YWxseSBzdGFydGVkLgotICogIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwgdGhlbiBubyB3b3JrIHdhcyBzdGFydGVkCi0gKiAgKGVpdGhlciBiZWNhdXNlIGl0IHdhcyBhbHJlYWR5IHN0YXJ0ZWQsIG9yIGJlY2F1c2Ugb2YgYSBmYWlsdXJlKS4KLSAqLwotYm9vbCB2aXNvcl9wZXJpb2RpY193b3JrX3N0YXJ0KHN0cnVjdCBwZXJpb2RpY193b3JrICpwdykKLXsKLQlib29sIHJjID0gZmFsc2U7Ci0KLQl3cml0ZV9sb2NrKCZwdy0+bG9jayk7Ci0JaWYgKHB3LT5pc19zY2hlZHVsZWQpIHsKLQkJcmMgPSBmYWxzZTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCWlmIChwdy0+d2FudF90b19zdG9wKSB7Ci0JCXJjID0gZmFsc2U7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQlJTklUX0RFTEFZRURfV09SSygmcHctPndvcmssICZwZXJpb2RpY193b3JrX2Z1bmMpOwotCWlmICghcXVldWVfZGVsYXllZF93b3JrKHB3LT53b3JrcXVldWUsICZwdy0+d29yaywKLQkJCQlwdy0+amlmZnlfaW50ZXJ2YWwpKSB7Ci0JCXJjID0gZmFsc2U7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQlwdy0+aXNfc2NoZWR1bGVkID0gdHJ1ZTsKLQlyYyA9IHRydWU7Ci11bmxvY2s6Ci0Jd3JpdGVfdW5sb2NrKCZwdy0+bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfcGVyaW9kaWNfd29ya19zdGFydCk7Ci0KLS8qKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZmYgeW91ciBjYWxsIGFjdHVhbGx5IHN0b3BwZWQgdGhlIHBlcmlvZGljCi0gKiAgd29yay4KLSAqCi0gKiAgLS0gUEFZIEFUVEVOVElPTi4uLiB0aGlzIGlzIGltcG9ydGFudCAtLQotICoKLSAqICBOTyBOTyAjMQotICoKLSAqICAgICBEbyBOT1QgY2FsbCB0aGlzIGZ1bmN0aW9uIGZyb20gc29tZSBmdW5jdGlvbiB0aGF0IGlzIHJ1bm5pbmcgb24gdGhlCi0gKiAgICAgc2FtZSB3b3JrcXVldWUgYXMgdGhlIHdvcmsgeW91IGFyZSB0cnlpbmcgdG8gc3RvcCBtaWdodCBiZSBydW5uaW5nCi0gKiAgICAgb24hICBJZiB5b3UgdmlvbGF0ZSB0aGlzIHJ1bGUsIHZpc29yX3BlcmlvZGljX3dvcmtfc3RvcCgpIE1JR0hUIHdvcmssCi0gKiAgICAgYnV0IGl0IGFsc28gTUlHSFQgZ2V0IGh1bmcgdXAgaW4gYW4gaW5maW5pdGUgbG9vcCBzYXlpbmcKLSAqICAgICAid2FpdGluZyBmb3IgZGVsYXllZCB3b3JrLi4uIi4gIFRoaXMgd2lsbCBoYXBwZW4gaWYgdGhlIGRlbGF5ZWQgd29yawotICogICAgIHlvdSBhcmUgdHJ5aW5nIHRvIGNhbmNlbCBoYXMgYmVlbiBwdXQgaW4gdGhlIHdvcmtxdWV1ZSBsaXN0LCBidXQgY2FuJ3QKLSAqICAgICBydW4geWV0IGJlY2F1c2Ugd2UgYXJlIHJ1bm5pbmcgdGhhdCBzYW1lIHdvcmtxdWV1ZSB0aHJlYWQgcmlnaHQgbm93LgotICoKLSAqICAgICBCb3R0b20gbGluZTogSWYgeW91IG5lZWQgdG8gY2FsbCB2aXNvcl9wZXJpb2RpY193b3JrX3N0b3AoKSBmcm9tIGEKLSAqICAgICB3b3JraXRlbSwgYmUgc3VyZSB0aGUgd29ya2l0ZW0gaXMgb24gYSBESUZGRVJFTlQgd29ya3F1ZXVlIHRoYW4gdGhlCi0gKiAgICAgd29ya2l0ZW0gdGhhdCB5b3UgYXJlIHRyeWluZyB0byBjYW5jZWwuCi0gKgotICogICAgIElmIEkgY291bGQgZmlndXJlIG91dCBzb21lIHdheSB0byBjaGVjayBmb3IgdGhpcyAibm8gbm8iIGNvbmRpdGlvbiBpbgotICogICAgIHRoZSBjb2RlLCBJIHdvdWxkLiAgSXQgd291bGQgaGF2ZSBzYXZlZCBtZSB0aGUgdHJvdWJsZSBvZiB3cml0aW5nIHRoaXMKLSAqICAgICBsb25nIGNvbW1lbnQuICBBbmQgYWxzbywgZG9uJ3QgdGhpbmsgdGhpcyBpcyBzb21lICJ0aGVvcmV0aWNhbCIgcmFjZQotICogICAgIGNvbmRpdGlvbi4gIEl0IGlzIFJFQUwsIGFzIEkgaGF2ZSBzcGVudCB0aGUgZGF5IGNoYXNpbmcgaXQuCi0gKgotICogIE5PIE5PICMyCi0gKgotICogICAgIFRha2UgY2xvc2Ugbm90ZSBvZiB0aGUgbG9ja3MgdGhhdCB5b3Ugb3duIHdoZW4geW91IGNhbGwgdGhpcyBmdW5jdGlvbi4KLSAqICAgICBZb3UgbXVzdCBOT1Qgb3duIGFueSBsb2NrcyB0aGF0IGFyZSBuZWVkZWQgYnkgdGhlIHBlcmlvZGljIHdvcmsKLSAqICAgICBmdW5jdGlvbiB0aGF0IGlzIGN1cnJlbnRseSBpbnN0YWxsZWQuICBJZiB5b3UgRE8sIGEgZGVhZGxvY2sgbWF5IHJlc3VsdCwKLSAqICAgICBiZWNhdXNlIHN0b3BwaW5nIHRoZSBwZXJpb2RpYyB3b3JrIG9mdGVuIGludm9sdmVzIHdhaXRpbmcgZm9yIHRoZSBsYXN0Ci0gKiAgICAgaXRlcmF0aW9uIG9mIHRoZSBwZXJpb2RpYyB3b3JrIGZ1bmN0aW9uIHRvIGNvbXBsZXRlLiAgQWdhaW4sIGlmIHlvdSBoaXQKLSAqICAgICB0aGlzIGRlYWRsb2NrLCB5b3Ugd2lsbCBnZXQgaHVuZyB1cCBpbiBhbiBpbmZpbml0ZSBsb29wIHNheWluZwotICogICAgICJ3YWl0aW5nIGZvciBkZWxheWVkIHdvcmsuLi4iLgotICovCi1ib29sIHZpc29yX3BlcmlvZGljX3dvcmtfc3RvcChzdHJ1Y3QgcGVyaW9kaWNfd29yayAqcHcpCi17Ci0JYm9vbCBzdG9wcGVkX3NvbWV0aGluZyA9IGZhbHNlOwotCi0Jd3JpdGVfbG9jaygmcHctPmxvY2spOwotCXN0b3BwZWRfc29tZXRoaW5nID0gcHctPmlzX3NjaGVkdWxlZCAmJiAoIXB3LT53YW50X3RvX3N0b3ApOwotCXdoaWxlIChwdy0+aXNfc2NoZWR1bGVkKSB7Ci0JCXB3LT53YW50X3RvX3N0b3AgPSB0cnVlOwotCQlpZiAoY2FuY2VsX2RlbGF5ZWRfd29yaygmcHctPndvcmspKSB7Ci0JCQkvKiBXZSBnZXQgaGVyZSBpZiB0aGUgZGVsYXllZCB3b3JrIHdhcyBwZW5kaW5nIGFzCi0JCQkgKiBkZWxheWVkIHdvcmssIGJ1dCB3YXMgTk9UIHJ1bi4KLQkJCSAqLwotCQkJV0FSTl9PTighcHctPmlzX3NjaGVkdWxlZCk7Ci0JCQlwdy0+aXNfc2NoZWR1bGVkID0gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBJZiB3ZSBnZXQgaGVyZSwgZWl0aGVyIHRoZSBkZWxheWVkIHdvcms6Ci0JCQkgKiAtIHdhcyBydW4sIE9SLAotCQkJICogLSBpcyBydW5uaW5nIFJJR0hUIE5PVyBvbiBhbm90aGVyIHByb2Nlc3NvciwgT1IsCi0JCQkgKiAtIHdhc24ndCBldmVuIHNjaGVkdWxlZCAodGhlcmUgaXMgYSBtaW5pc2N1bGUKLQkJCSAqICAgdGltaW5nIHdpbmRvdyB3aGVyZSB0aGlzIGNvdWxkIGJlIHRoZSBjYXNlKQotCQkJICogZmx1c2hfd29ya3F1ZXVlKCkgd291bGQgbWFrZSBzdXJlIGl0IGlzIGZpbmlzaGVkCi0JCQkgKiBleGVjdXRpbmcsIGJ1dCB0aGF0IHN0aWxsIGlzbid0IHZlcnkgdXNlZnVsLCB3aGljaAotCQkJICogZXhwbGFpbnMgdGhlIGxvb3AuLi4KLQkJCSAqLwotCQl9Ci0JCWlmIChwdy0+aXNfc2NoZWR1bGVkKSB7Ci0JCQl3cml0ZV91bmxvY2soJnB3LT5sb2NrKTsKLQkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShtc2Vjc190b19qaWZmaWVzKDEwKSk7Ci0JCQl3cml0ZV9sb2NrKCZwdy0+bG9jayk7Ci0JCX0gZWxzZSB7Ci0JCQlwdy0+d2FudF90b19zdG9wID0gZmFsc2U7Ci0JCX0KLQl9Ci0Jd3JpdGVfdW5sb2NrKCZwdy0+bG9jayk7Ci0JcmV0dXJuIHN0b3BwZWRfc29tZXRoaW5nOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfcGVyaW9kaWNfd29ya19zdG9wKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvdmJ1c2NoYW5uZWwuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvdmJ1c2NoYW5uZWwuaAppbmRleCA5MGZhMTJlLi5lOTc5MTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3ZidXNjaGFubmVsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy92YnVzY2hhbm5lbC5oCkBAIC0yMyw3ICsyMyw2IEBACiAgKiAgdGhlIGNsaWVudCBkZXZpY2VzIGFuZCBjbGllbnQgZHJpdmVycyBmb3IgdGhlIHNlcnZlciBlbmQgdG8gc2VlLgogICovCiAjaW5jbHVkZSA8bGludXgvdXVpZC5oPgotI2luY2x1ZGUgInZidXNkZXZpY2VpbmZvLmgiCiAjaW5jbHVkZSAiY2hhbm5lbC5oIgogCiAvKiB7MTkzYjMzMWItYzU4Zi0xMWRhLTk1YTktMDBlMDgxNjExNjVmfSAqLwpAQCAtNTgsNiArNTcsMjE2IEBACiAJCQkJICAgYWN0dWFsX2J5dGVzKSkKIAogI3ByYWdtYSBwYWNrKHB1c2gsIDEpCQkvKiBib3RoIEdDQyBhbmQgVkMgbm93IGFsbG93IHRoaXMgcHJhZ21hICovCisKKy8qCisgKiBBbiBhcnJheSBvZiB0aGlzIHN0cnVjdCBpcyBwcmVzZW50IGluIHRoZSBjaGFubmVsIGFyZWEgZm9yIGVhY2ggdmJ1cy4KKyAqIChTZWUgdmJ1c2NoYW5uZWwuaC4pCisgKiBJdCBpcyBmaWxsZWQgaW4gYnkgdGhlIGNsaWVudCBzaWRlIHRvIHByb3ZpZGUgaW5mbyBhYm91dCB0aGUgZGV2aWNlCisgKiBhbmQgZHJpdmVyIGZyb20gdGhlIGNsaWVudCdzIHBlcnNwZWN0aXZlLgorICovCitzdHJ1Y3QgdWx0cmFfdmJ1c19kZXZpY2VpbmZvIHsKKwl1OCBkZXZ0eXBlWzE2XTsJCS8qIHNob3J0IHN0cmluZyBpZGVudGlmeWluZyB0aGUgZGV2aWNlIHR5cGUgKi8KKwl1OCBkcnZuYW1lWzE2XTsJCS8qIGRyaXZlciAuc3lzIGZpbGUgbmFtZSAqLworCXU4IGluZm9zdHJzWzk2XTsJLyoga2VybmVsIHZlcnNpb24gKi8KKwl1OCByZXNlcnZlZFsxMjhdOwkvKiBwYWQgc2l6ZSB0byAyNTYgYnl0ZXMgKi8KK307CisKKy8qKgorICogdmJ1c2NoYW5uZWxfc2FuaXRpemVfYnVmZmVyKCkgLSByZW1vdmUgbm9uLXByaW50YWJsZSBjaGFycyBmcm9tIGJ1ZmZlcgorICogQHA6IGRlc3RpbmF0aW9uIGJ1ZmZlciB3aGVyZSBjaGFycyBhcmUgd3JpdHRlbiB0bworICogQHJlbWFpbjogbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHdyaXR0ZW4gc3RhcnRpbmcgYXQgI3AKKyAqIEBzcmM6IHBvaW50ZXIgdG8gc291cmNlIGJ1ZmZlcgorICogQHNyY21heDogbnVtYmVyIG9mIHZhbGlkIGNoYXJhY3RlcnMgYXQgI3NyYworICoKKyAqIFJlYWRzIGNoYXJzIGZyb20gdGhlIGJ1ZmZlciBhdCBAc3JjIGZvciBAc3JjbWF4IGJ5dGVzLCBhbmQgd3JpdGVzIHRvCisgKiB0aGUgYnVmZmVyIGF0IEBwLCB3aGljaCBpcyBAcmVtYWluIGJ5dGVzIGxvbmcsIGVuc3VyaW5nIG5ldmVyIHRvCisgKiBvdmVyZmxvdyB0aGUgYnVmZmVyIGF0IEBwLCB1c2luZyB0aGUgZm9sbG93aW5nIHJ1bGVzOgorICogLSBwcmludGFibGUgY2hhcmFjdGVycyBhcmUgc2ltcGx5IGNvcGllZCBmcm9tIHRoZSBidWZmZXIgYXQgQHNyYyB0byB0aGUKKyAqICAgYnVmZmVyIGF0IEBwCisgKiAtIGludGVydmVuaW5nIHN0cmVha3Mgb2Ygbm9uLXByaW50YWJsZSBjaGFyYWN0ZXJzIGluIHRoZSBidWZmZXIgYXQgQHNyYworICogICBhcmUgcmVwbGFjZWQgd2l0aCBhIHNpbmdsZSBzcGFjZSBpbiB0aGUgYnVmZmVyIGF0IEBwCisgKiBOb3RlIHRoYXQgd2UgcGF5IG5vIGF0dGVudGlvbiB0byAnXDAnLXRlcm1pbmF0aW9uLgorICoKKyAqIFBhc3MgQHAgPT0gTlVMTCBhbmQgQHJlbWFpbiA9PSAwIGZvciB0aGlzIHNwZWNpYWwgYmVoYXZpb3IgLS0gSW4gdGhpcworICogY2FzZSwgd2Ugc2ltcGx5IHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgV09VTEQgSEFWRSBiZWVuIHdyaXR0ZW4KKyAqIHRvIGEgYnVmZmVyIGF0IEBwLCBoYWQgaXQgYmVlbiBpbmZpbml0ZWx5IGJpZy4KKyAqCisgKiBSZXR1cm46IHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byBAcCAob3IgV09VTEQgSEFWRSBiZWVuIHdyaXR0ZW4gdG8KKyAqICAgICAgICAgQHAsIGFzIGRlc2NyaWJlZCBpbiB0aGUgcHJldmlvdXMgcGFyYWdyYXBoKQorICovCitzdGF0aWMgaW5saW5lIGludAordmJ1c2NoYW5uZWxfc2FuaXRpemVfYnVmZmVyKGNoYXIgKnAsIGludCByZW1haW4sIGNoYXIgKnNyYywgaW50IHNyY21heCkKK3sKKwlpbnQgY2hhcnMgPSAwOworCWludCBub25wcmludGFibGVfc3RyZWFrID0gMDsKKworCXdoaWxlIChzcmNtYXggPiAwKSB7CisJCWlmICgoKnNyYyA+PSAnICcpICYmICgqc3JjIDwgMHg3ZikpIHsKKwkJCWlmIChub25wcmludGFibGVfc3RyZWFrKSB7CisJCQkJaWYgKHJlbWFpbiA+IDApIHsKKwkJCQkJKnAgPSAnICc7CisJCQkJCXArKzsKKwkJCQkJcmVtYWluLS07CisJCQkJCWNoYXJzKys7CisJCQkJfSBlbHNlIGlmICghcCkgeworCQkJCQljaGFycysrOworCQkJCX0KKwkJCQlub25wcmludGFibGVfc3RyZWFrID0gMDsKKwkJCX0KKwkJCWlmIChyZW1haW4gPiAwKSB7CisJCQkJKnAgPSAqc3JjOworCQkJCXArKzsKKwkJCQlyZW1haW4tLTsKKwkJCQljaGFycysrOworCQkJfSBlbHNlIGlmICghcCkgeworCQkJCWNoYXJzKys7CisJCQl9CisJCX0gZWxzZSB7CisJCQlub25wcmludGFibGVfc3RyZWFrID0gMTsKKwkJfQorCQlzcmMrKzsKKwkJc3JjbWF4LS07CisJfQorCXJldHVybiBjaGFyczsKK30KKworI2RlZmluZSBWQlVTQ0hBTk5FTF9BRERBQ0hBUihjaCwgcCwgcmVtYWluLCBjaGFycykgXAorCWRvIHsJCQkJCSAgIFwKKwkJaWYgKHJlbWFpbiA8PSAwKQkJICAgXAorCQkJYnJlYWs7CQkJICAgXAorCQkqcCA9IGNoOwkJCSAgIFwKKwkJcCsrOyAgY2hhcnMrKzsgIHJlbWFpbi0tOwkgICBcCisJfSB3aGlsZSAoMCkKKworLyoqCisgKiB2YnVzY2hhbm5lbF9pdG9hKCkgLSBjb252ZXJ0IG5vbi1uZWdhdGl2ZSBpbnQgdG8gc3RyaW5nCisgKiBAcDogZGVzdGluYXRpb24gc3RyaW5nCisgKiBAcmVtYWluOiBtYXggbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHdyaXR0ZW4gdG8gQHAKKyAqIEBudW06IGlucHV0IGludCB0byBjb252ZXJ0CisgKgorICogQ29udmVydHMgdGhlIG5vbi1uZWdhdGl2ZSB2YWx1ZSBhdCBAbnVtIHRvIGFuIGFzY2lpIGRlY2ltYWwgc3RyaW5nCisgKiBhdCBAcCwgd3JpdGluZyBhdCBtb3N0IEByZW1haW4gYnl0ZXMuICBOb3RlIHRoZXJlIGlzIE5PICdcMCcgdGVybWluYXRpb24KKyAqIHdyaXR0ZW4gdG8gQHAuCisgKgorICogUmV0dXJuOiBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byBAcAorICoKKyAqLworc3RhdGljIGlubGluZSBpbnQKK3ZidXNjaGFubmVsX2l0b2EoY2hhciAqcCwgaW50IHJlbWFpbiwgaW50IG51bSkKK3sKKwlpbnQgZGlnaXRzID0gMDsKKwljaGFyIHNbMzJdOworCWludCBpOworCisJaWYgKG51bSA9PSAwKSB7CisJCS8qICcwJyBpcyBhIHNwZWNpYWwgY2FzZSAqLworCQlpZiAocmVtYWluIDw9IDApCisJCQlyZXR1cm4gMDsKKwkJKnAgPSAnMCc7CisJCXJldHVybiAxOworCX0KKwkvKiBmb3JtIGEgYmFja3dhcmRzIGRlY2ltYWwgYXNjaWkgc3RyaW5nIGluIDxzPiAqLworCXdoaWxlIChudW0gPiAwKSB7CisJCWlmIChkaWdpdHMgPj0gKGludClzaXplb2YocykpCisJCQlyZXR1cm4gMDsKKwkJc1tkaWdpdHMrK10gPSAobnVtICUgMTApICsgJzAnOworCQludW0gPSBudW0gLyAxMDsKKwl9CisJaWYgKHJlbWFpbiA8IGRpZ2l0cykgeworCQkvKiBub3QgZW5vdWdoIHJvb20gbGVmdCBhdCA8cD4gdG8gaG9sZCBudW1iZXIsIHNvIGZpbGwgd2l0aAorCQkgKiAnPycKKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCByZW1haW47IGkrKywgcCsrKQorCQkJKnAgPSAnPyc7CisJCXJldHVybiByZW1haW47CisJfQorCS8qIHBsdWcgaW4gdGhlIGRlY2ltYWwgYXNjaWkgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyLCBieSAqLworCS8qIHJldmVyc2luZyB0aGUgc3RyaW5nIHdlIGp1c3QgYnVpbHQgaW4gPHM+ICovCisJaSA9IGRpZ2l0czsKKwl3aGlsZSAoaSA+IDApIHsKKwkJaS0tOworCQkqcCA9IHNbaV07CisJCXArKzsKKwl9CisJcmV0dXJuIGRpZ2l0czsKK30KKworLyoqCisgKiB2YnVzY2hhbm5lbF9kZXZpbmZvX3RvX3N0cmluZygpIC0gZm9ybWF0IGEgc3RydWN0IHVsdHJhX3ZidXNfZGV2aWNlaW5mbworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGEgcHJpbnRhYmxlIHN0cmluZworICogQGRldmluZm86IHRoZSBzdHJ1Y3QgdWx0cmFfdmJ1c19kZXZpY2VpbmZvIHRvIGZvcm1hdAorICogQHA6IGRlc3RpbmF0aW9uIHN0cmluZyBhcmVhCisgKiBAcmVtYWluOiBzaXplIG9mIGRlc3RpbmF0aW9uIHN0cmluZyBhcmVhIGluIGJ5dGVzCisgKiBAZGV2aXg6IHRoZSBkZXZpY2UgaW5kZXggdG8gYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBkYXRhLCBvciAtMSBpZiBubworICogICAgICAgICBkZXZpY2UgaW5kZXggaXMgdG8gYmUgaW5jbHVkZWQKKyAqCisgKiBSZWFkcyBAZGV2SW5mbywgYW5kIGNvbnZlcnRzIGl0cyBjb250ZW50cyB0byBhIHByaW50YWJsZSBzdHJpbmcgYXQgQHAsCisgKiB3cml0aW5nIGF0IG1vc3QgQHJlbWFpbiBieXRlcy4gTm90ZSB0aGVyZSBpcyBOTyAnXDAnIHRlcm1pbmF0aW9uCisgKiB3cml0dGVuIHRvIEBwLgorICoKKyAqIFJldHVybjogbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gQHAKKyAqLworc3RhdGljIGlubGluZSBpbnQKK3ZidXNjaGFubmVsX2RldmluZm9fdG9fc3RyaW5nKHN0cnVjdCB1bHRyYV92YnVzX2RldmljZWluZm8gKmRldmluZm8sCisJCQkgICAgICBjaGFyICpwLCBpbnQgcmVtYWluLCBpbnQgZGV2aXgpCit7CisJY2hhciAqcHNyYzsKKwlpbnQgbnNyYywgeCwgaSwgcGFkOworCWludCBjaGFycyA9IDA7CisKKwlwc3JjID0gJmRldmluZm8tPmRldnR5cGVbMF07CisJbnNyYyA9IHNpemVvZihkZXZpbmZvLT5kZXZ0eXBlKTsKKwlpZiAodmJ1c2NoYW5uZWxfc2FuaXRpemVfYnVmZmVyKE5VTEwsIDAsIHBzcmMsIG5zcmMpIDw9IDApCisJCXJldHVybiAwOworCisJLyogZW1pdCBkZXZpY2UgaW5kZXggKi8KKwlpZiAoZGV2aXggPj0gMCkgeworCQlWQlVTQ0hBTk5FTF9BRERBQ0hBUignWycsIHAsIHJlbWFpbiwgY2hhcnMpOworCQl4ID0gdmJ1c2NoYW5uZWxfaXRvYShwLCByZW1haW4sIGRldml4KTsKKwkJcCArPSB4OworCQlyZW1haW4gLT0geDsKKwkJY2hhcnMgKz0geDsKKwkJVkJVU0NIQU5ORUxfQUREQUNIQVIoJ10nLCBwLCByZW1haW4sIGNoYXJzKTsKKwl9IGVsc2UgeworCQlWQlVTQ0hBTk5FTF9BRERBQ0hBUignICcsIHAsIHJlbWFpbiwgY2hhcnMpOworCQlWQlVTQ0hBTk5FTF9BRERBQ0hBUignICcsIHAsIHJlbWFpbiwgY2hhcnMpOworCQlWQlVTQ0hBTk5FTF9BRERBQ0hBUignICcsIHAsIHJlbWFpbiwgY2hhcnMpOworCX0KKworCS8qIGVtaXQgZGV2aWNlIHR5cGUgKi8KKwl4ID0gdmJ1c2NoYW5uZWxfc2FuaXRpemVfYnVmZmVyKHAsIHJlbWFpbiwgcHNyYywgbnNyYyk7CisJcCArPSB4OworCXJlbWFpbiAtPSB4OworCWNoYXJzICs9IHg7CisJcGFkID0gMTUgLSB4OwkJLyogcGFkIGRldmljZSB0eXBlIHRvIGJlIGV4YWN0bHkgMTUgY2hhcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGFkOyBpKyspCisJCVZCVVNDSEFOTkVMX0FEREFDSEFSKCcgJywgcCwgcmVtYWluLCBjaGFycyk7CisJVkJVU0NIQU5ORUxfQUREQUNIQVIoJyAnLCBwLCByZW1haW4sIGNoYXJzKTsKKworCS8qIGVtaXQgZHJpdmVyIG5hbWUgKi8KKwlwc3JjID0gJmRldmluZm8tPmRydm5hbWVbMF07CisJbnNyYyA9IHNpemVvZihkZXZpbmZvLT5kcnZuYW1lKTsKKwl4ID0gdmJ1c2NoYW5uZWxfc2FuaXRpemVfYnVmZmVyKHAsIHJlbWFpbiwgcHNyYywgbnNyYyk7CisJcCArPSB4OworCXJlbWFpbiAtPSB4OworCWNoYXJzICs9IHg7CisJcGFkID0gMTUgLSB4OwkJLyogcGFkIGRyaXZlciBuYW1lIHRvIGJlIGV4YWN0bHkgMTUgY2hhcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGFkOyBpKyspCisJCVZCVVNDSEFOTkVMX0FEREFDSEFSKCcgJywgcCwgcmVtYWluLCBjaGFycyk7CisJVkJVU0NIQU5ORUxfQUREQUNIQVIoJyAnLCBwLCByZW1haW4sIGNoYXJzKTsKKworCS8qIGVtaXQgc3RyaW5ncyAqLworCXBzcmMgPSAmZGV2aW5mby0+aW5mb3N0cnNbMF07CisJbnNyYyA9IHNpemVvZihkZXZpbmZvLT5pbmZvc3Rycyk7CisJeCA9IHZidXNjaGFubmVsX3Nhbml0aXplX2J1ZmZlcihwLCByZW1haW4sIHBzcmMsIG5zcmMpOworCXAgKz0geDsKKwlyZW1haW4gLT0geDsKKwljaGFycyArPSB4OworCVZCVVNDSEFOTkVMX0FEREFDSEFSKCdcbicsIHAsIHJlbWFpbiwgY2hhcnMpOworCisJcmV0dXJuIGNoYXJzOworfQorCiBzdHJ1Y3Qgc3Bhcl92YnVzX2hlYWRlcmluZm8gewogCXUzMiBzdHJ1Y3RfYnl0ZXM7CS8qIHNpemUgb2YgdGhpcyBzdHJ1Y3QgaW4gYnl0ZXMgKi8KIAl1MzIgZGV2aWNlX2luZm9fc3RydWN0X2J5dGVzOwkvKiBzaXplb2YoVUxUUkFfVkJVU19ERVZJQ0VJTkZPKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy92YnVzZGV2aWNlaW5mby5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy92YnVzZGV2aWNlaW5mby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmRhYjRhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvdmJ1c2RldmljZWluZm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMTAgLSAyMDE1IFVOSVNZUyBDT1JQT1JBVElPTgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKLSAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCi0gKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQotICogZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF9fVkJVU0RFVklDRUlORk9fSF9fCi0jZGVmaW5lIF9fVkJVU0RFVklDRUlORk9fSF9fCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCi0jcHJhZ21hIHBhY2socHVzaCwgMSkJCS8qIGJvdGggR0NDIGFuZCBWQyBub3cgYWxsb3cgdGhpcyBwcmFnbWEgKi8KLQotLyogQW4gYXJyYXkgb2YgdGhpcyBzdHJ1Y3QgaXMgcHJlc2VudCBpbiB0aGUgY2hhbm5lbCBhcmVhIGZvciBlYWNoIHZidXMuCi0gKiAoU2VlIHZidXNjaGFubmVsLmguKQotICogSXQgaXMgZmlsbGVkIGluIGJ5IHRoZSBjbGllbnQgc2lkZSB0byBwcm92aWRlIGluZm8gYWJvdXQgdGhlIGRldmljZQotICogYW5kIGRyaXZlciBmcm9tIHRoZSBjbGllbnQncyBwZXJzcGVjdGl2ZS4KLSAqLwotc3RydWN0IHVsdHJhX3ZidXNfZGV2aWNlaW5mbyB7Ci0JdTggZGV2dHlwZVsxNl07CQkvKiBzaG9ydCBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlIGRldmljZSB0eXBlICovCi0JdTggZHJ2bmFtZVsxNl07CQkvKiBkcml2ZXIgLnN5cyBmaWxlIG5hbWUgKi8KLQl1OCBpbmZvc3Ryc1s5Nl07CS8qIHNlcXVlbmNlIG9mIHRhYi1kZWxpbWl0ZWQgaWQgc3RyaW5nczogKi8KLQkvKiA8RFJJVkVSX1JFVj4gPERSSVZFUl9WRVJUQUc+IDxEUklWRVJfQ09NUElMRVRJTUU+ICovCi0JdTggcmVzZXJ2ZWRbMTI4XTsJLyogcGFkIHNpemUgdG8gMjU2IGJ5dGVzICovCi19OwotCi0jcHJhZ21hIHBhY2socG9wKQotCi0vKiBSZWFkcyBjaGFycyBmcm9tIHRoZSBidWZmZXIgYXQgPHNyYz4gZm9yIDxzcmNtYXg+IGJ5dGVzLCBhbmQgd3JpdGVzIHRvCi0gKiB0aGUgYnVmZmVyIGF0IDxwPiwgd2hpY2ggaXMgPHJlbWFpbj4gYnl0ZXMgbG9uZywgZW5zdXJpbmcgbmV2ZXIgdG8KLSAqIG92ZXJmbG93IHRoZSBidWZmZXIgYXQgPHA+LCB1c2luZyB0aGUgZm9sbG93aW5nIHJ1bGVzOgotICogLSBwcmludGFibGUgY2hhcmFjdGVycyBhcmUgc2ltcGx5IGNvcGllZCBmcm9tIHRoZSBidWZmZXIgYXQgPHNyYz4gdG8gdGhlCi0gKiAgIGJ1ZmZlciBhdCA8cD4KLSAqIC0gaW50ZXJ2ZW5pbmcgc3RyZWFrcyBvZiBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnMgaW4gdGhlIGJ1ZmZlciBhdCA8c3JjPgotICogICBhcmUgcmVwbGFjZWQgd2l0aCBhIHNpbmdsZSBzcGFjZSBpbiB0aGUgYnVmZmVyIGF0IDxwPgotICogTm90ZSB0aGF0IHdlIHBheSBubyBhdHRlbnRpb24gdG8gJ1wwJy10ZXJtaW5hdGlvbi4KLSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIDxwPi4KLSAqCi0gKiBQYXNzIDxwPiA9PSBOVUxMIGFuZCA8cmVtYWluPiA9PSAwIGZvciB0aGlzIHNwZWNpYWwgYmVoYXZpb3IuICBJbiB0aGlzCi0gKiBjYXNlLCB3ZSBzaW1wbHkgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBXT1VMRCBIQVZFIGJlZW4gd3JpdHRlbgotICogdG8gYSBidWZmZXIgYXQgPHA+LCBoYWQgaXQgYmVlbiBpbmZpbml0ZWx5IGJpZy4KLSAqLwotc3RhdGljIGlubGluZSBpbnQKLXZidXNjaGFubmVsX3Nhbml0aXplX2J1ZmZlcihjaGFyICpwLCBpbnQgcmVtYWluLCBjaGFyICpzcmMsIGludCBzcmNtYXgpCi17Ci0JaW50IGNoYXJzID0gMDsKLQlpbnQgbm9ucHJpbnRhYmxlX3N0cmVhayA9IDA7Ci0KLQl3aGlsZSAoc3JjbWF4ID4gMCkgewotCQlpZiAoKCpzcmMgPj0gJyAnKSAmJiAoKnNyYyA8IDB4N2YpKSB7Ci0JCQlpZiAobm9ucHJpbnRhYmxlX3N0cmVhaykgewotCQkJCWlmIChyZW1haW4gPiAwKSB7Ci0JCQkJCSpwID0gJyAnOwotCQkJCQlwKys7Ci0JCQkJCXJlbWFpbi0tOwotCQkJCQljaGFycysrOwotCQkJCX0gZWxzZSBpZiAoIXApIHsKLQkJCQkJY2hhcnMrKzsKLQkJCQl9Ci0JCQkJbm9ucHJpbnRhYmxlX3N0cmVhayA9IDA7Ci0JCQl9Ci0JCQlpZiAocmVtYWluID4gMCkgewotCQkJCSpwID0gKnNyYzsKLQkJCQlwKys7Ci0JCQkJcmVtYWluLS07Ci0JCQkJY2hhcnMrKzsKLQkJCX0gZWxzZSBpZiAoIXApIHsKLQkJCQljaGFycysrOwotCQkJfQotCQl9IGVsc2UgewotCQkJbm9ucHJpbnRhYmxlX3N0cmVhayA9IDE7Ci0JCX0KLQkJc3JjKys7Ci0JCXNyY21heC0tOwotCX0KLQlyZXR1cm4gY2hhcnM7Ci19Ci0KLSNkZWZpbmUgVkJVU0NIQU5ORUxfQUREQUNIQVIoY2gsIHAsIHJlbWFpbiwgY2hhcnMpIFwKLQlkbyB7CQkJCQkgICBcCi0JCWlmIChyZW1haW4gPD0gMCkJCSAgIFwKLQkJCWJyZWFrOwkJCSAgIFwKLQkJKnAgPSBjaDsJCQkgICBcCi0JCXArKzsgIGNoYXJzKys7ICByZW1haW4tLTsJICAgXAotCX0gd2hpbGUgKDApCi0KLS8qIENvbnZlcnRzIHRoZSBub24tbmVnYXRpdmUgdmFsdWUgYXQgPG51bT4gdG8gYW4gYXNjaWkgZGVjaW1hbCBzdHJpbmcKLSAqIGF0IDxwPiwgd3JpdGluZyBhdCBtb3N0IDxyZW1haW4+IGJ5dGVzLiAgTm90ZSB0aGVyZSBpcyBOTyAnXDAnIHRlcm1pbmF0aW9uCi0gKiB3cml0dGVuIHRvIDxwPi4KLSAqCi0gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byA8cD4uCi0gKgotICogTm90ZSB0aGF0IHdlIGNyZWF0ZSB0aGlzIGZ1bmN0aW9uIGJlY2F1c2Ugd2UgbmVlZCB0byBkbyB0aGlzIG9wZXJhdGlvbiBpbgotICogYW4gZW52aXJvbm1lbnQtaW5kZXBlbmRlbnQgd2F5IChzaW5jZSB3ZSBhcmUgaW4gYSBjb21tb24gaGVhZGVyIGZpbGUpLgotICovCi1zdGF0aWMgaW5saW5lIGludAotdmJ1c2NoYW5uZWxfaXRvYShjaGFyICpwLCBpbnQgcmVtYWluLCBpbnQgbnVtKQotewotCWludCBkaWdpdHMgPSAwOwotCWNoYXIgc1szMl07Ci0JaW50IGk7Ci0KLQlpZiAobnVtID09IDApIHsKLQkJLyogJzAnIGlzIGEgc3BlY2lhbCBjYXNlICovCi0JCWlmIChyZW1haW4gPD0gMCkKLQkJCXJldHVybiAwOwotCQkqcCA9ICcwJzsKLQkJcmV0dXJuIDE7Ci0JfQotCS8qIGZvcm0gYSBiYWNrd2FyZHMgZGVjaW1hbCBhc2NpaSBzdHJpbmcgaW4gPHM+ICovCi0Jd2hpbGUgKG51bSA+IDApIHsKLQkJaWYgKGRpZ2l0cyA+PSAoaW50KXNpemVvZihzKSkKLQkJCXJldHVybiAwOwotCQlzW2RpZ2l0cysrXSA9IChudW0gJSAxMCkgKyAnMCc7Ci0JCW51bSA9IG51bSAvIDEwOwotCX0KLQlpZiAocmVtYWluIDwgZGlnaXRzKSB7Ci0JCS8qIG5vdCBlbm91Z2ggcm9vbSBsZWZ0IGF0IDxwPiB0byBob2xkIG51bWJlciwgc28gZmlsbCB3aXRoCi0JCSAqICc/JwotCQkgKi8KLQkJZm9yIChpID0gMDsgaSA8IHJlbWFpbjsgaSsrLCBwKyspCi0JCQkqcCA9ICc/JzsKLQkJcmV0dXJuIHJlbWFpbjsKLQl9Ci0JLyogcGx1ZyBpbiB0aGUgZGVjaW1hbCBhc2NpaSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIsIGJ5ICovCi0JLyogcmV2ZXJzaW5nIHRoZSBzdHJpbmcgd2UganVzdCBidWlsdCBpbiA8cz4gKi8KLQlpID0gZGlnaXRzOwotCXdoaWxlIChpID4gMCkgewotCQlpLS07Ci0JCSpwID0gc1tpXTsKLQkJcCsrOwotCX0KLQlyZXR1cm4gZGlnaXRzOwotfQotCi0vKiBSZWFkcyA8ZGV2SW5mbz4sIGFuZCBjb252ZXJ0cyBpdHMgY29udGVudHMgdG8gYSBwcmludGFibGUgc3RyaW5nIGF0IDxwPiwKLSAqIHdyaXRpbmcgYXQgbW9zdCA8cmVtYWluPiBieXRlcy4gIE5vdGUgdGhlcmUgaXMgTk8gJ1wwJyB0ZXJtaW5hdGlvbgotICogd3JpdHRlbiB0byA8cD4uCi0gKgotICogUGFzcyA8ZGV2aXg+ID49IDAgaWYgeW91IHdhbnQgYSBkZXZpY2UgaW5kZXggcHJlc2VudGVkLgotICoKLSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIDxwPi4KLSAqLwotc3RhdGljIGlubGluZSBpbnQKLXZidXNjaGFubmVsX2RldmluZm9fdG9fc3RyaW5nKHN0cnVjdCB1bHRyYV92YnVzX2RldmljZWluZm8gKmRldmluZm8sCi0JCQkgICAgICBjaGFyICpwLCBpbnQgcmVtYWluLCBpbnQgZGV2aXgpCi17Ci0JY2hhciAqcHNyYzsKLQlpbnQgbnNyYywgeCwgaSwgcGFkOwotCWludCBjaGFycyA9IDA7Ci0KLQlwc3JjID0gJmRldmluZm8tPmRldnR5cGVbMF07Ci0JbnNyYyA9IHNpemVvZihkZXZpbmZvLT5kZXZ0eXBlKTsKLQlpZiAodmJ1c2NoYW5uZWxfc2FuaXRpemVfYnVmZmVyKE5VTEwsIDAsIHBzcmMsIG5zcmMpIDw9IDApCi0JCXJldHVybiAwOwotCi0JLyogZW1pdCBkZXZpY2UgaW5kZXggKi8KLQlpZiAoZGV2aXggPj0gMCkgewotCQlWQlVTQ0hBTk5FTF9BRERBQ0hBUignWycsIHAsIHJlbWFpbiwgY2hhcnMpOwotCQl4ID0gdmJ1c2NoYW5uZWxfaXRvYShwLCByZW1haW4sIGRldml4KTsKLQkJcCArPSB4OwotCQlyZW1haW4gLT0geDsKLQkJY2hhcnMgKz0geDsKLQkJVkJVU0NIQU5ORUxfQUREQUNIQVIoJ10nLCBwLCByZW1haW4sIGNoYXJzKTsKLQl9IGVsc2UgewotCQlWQlVTQ0hBTk5FTF9BRERBQ0hBUignICcsIHAsIHJlbWFpbiwgY2hhcnMpOwotCQlWQlVTQ0hBTk5FTF9BRERBQ0hBUignICcsIHAsIHJlbWFpbiwgY2hhcnMpOwotCQlWQlVTQ0hBTk5FTF9BRERBQ0hBUignICcsIHAsIHJlbWFpbiwgY2hhcnMpOwotCX0KLQotCS8qIGVtaXQgZGV2aWNlIHR5cGUgKi8KLQl4ID0gdmJ1c2NoYW5uZWxfc2FuaXRpemVfYnVmZmVyKHAsIHJlbWFpbiwgcHNyYywgbnNyYyk7Ci0JcCArPSB4OwotCXJlbWFpbiAtPSB4OwotCWNoYXJzICs9IHg7Ci0JcGFkID0gMTUgLSB4OwkJLyogcGFkIGRldmljZSB0eXBlIHRvIGJlIGV4YWN0bHkgMTUgY2hhcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGFkOyBpKyspCi0JCVZCVVNDSEFOTkVMX0FEREFDSEFSKCcgJywgcCwgcmVtYWluLCBjaGFycyk7Ci0JVkJVU0NIQU5ORUxfQUREQUNIQVIoJyAnLCBwLCByZW1haW4sIGNoYXJzKTsKLQotCS8qIGVtaXQgZHJpdmVyIG5hbWUgKi8KLQlwc3JjID0gJmRldmluZm8tPmRydm5hbWVbMF07Ci0JbnNyYyA9IHNpemVvZihkZXZpbmZvLT5kcnZuYW1lKTsKLQl4ID0gdmJ1c2NoYW5uZWxfc2FuaXRpemVfYnVmZmVyKHAsIHJlbWFpbiwgcHNyYywgbnNyYyk7Ci0JcCArPSB4OwotCXJlbWFpbiAtPSB4OwotCWNoYXJzICs9IHg7Ci0JcGFkID0gMTUgLSB4OwkJLyogcGFkIGRyaXZlciBuYW1lIHRvIGJlIGV4YWN0bHkgMTUgY2hhcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGFkOyBpKyspCi0JCVZCVVNDSEFOTkVMX0FEREFDSEFSKCcgJywgcCwgcmVtYWluLCBjaGFycyk7Ci0JVkJVU0NIQU5ORUxfQUREQUNIQVIoJyAnLCBwLCByZW1haW4sIGNoYXJzKTsKLQotCS8qIGVtaXQgc3RyaW5ncyAqLwotCXBzcmMgPSAmZGV2aW5mby0+aW5mb3N0cnNbMF07Ci0JbnNyYyA9IHNpemVvZihkZXZpbmZvLT5pbmZvc3Rycyk7Ci0JeCA9IHZidXNjaGFubmVsX3Nhbml0aXplX2J1ZmZlcihwLCByZW1haW4sIHBzcmMsIG5zcmMpOwotCXAgKz0geDsKLQlyZW1haW4gLT0geDsKLQljaGFycyArPSB4OwotCVZCVVNDSEFOTkVMX0FEREFDSEFSKCdcbicsIHAsIHJlbWFpbiwgY2hhcnMpOwotCi0JcmV0dXJuIGNoYXJzOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvdmlzb3JidXNfbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy92aXNvcmJ1c19tYWluLmMKaW5kZXggZDMyYjg5OC4uZmVjMGE1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy92aXNvcmJ1c19tYWluLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy92aXNvcmJ1c19tYWluLmMKQEAgLTE4LDYyICsxOCwyMiBAQAogCiAjaW5jbHVkZSAidmlzb3JidXMuaCIKICNpbmNsdWRlICJ2aXNvcmJ1c19wcml2YXRlLmgiCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotI2luY2x1ZGUgInBlcmlvZGljX3dvcmsuaCIKLSNpbmNsdWRlICJ2YnVzY2hhbm5lbC5oIgotI2luY2x1ZGUgImd1ZXN0bGludXhkZWJ1Zy5oIgogI2luY2x1ZGUgInZtY2FsbGludGVyZmFjZS5oIgogCiAjZGVmaW5lIE1ZRFJWTkFNRSAidmlzb3JidXMiCiAKIC8qIG1vZHVsZSBwYXJhbWV0ZXJzICovCi1zdGF0aWMgaW50IHZpc29yYnVzX2RlYnVnOwogc3RhdGljIGludCB2aXNvcmJ1c19mb3JjZW1hdGNoOwogc3RhdGljIGludCB2aXNvcmJ1c19mb3JjZW5vbWF0Y2g7Ci1zdGF0aWMgaW50IHZpc29yYnVzX2RlYnVncmVmOwotI2RlZmluZSBTRVJJQUxMT09QQkFDS0NIQU5BRERSICgxMDAgKiAxMDI0ICogMTAyNCkKIAogLyogRGlzcGxheSBzdHJpbmcgdGhhdCBpcyBndWFyYW50ZWVkIHRvIGJlIG5vIGxvbmdlciB0aGUgOTkgY2hhcmFjdGVycyovCiAjZGVmaW5lIExJTkVTSVpFIDk5CiAKICNkZWZpbmUgQ1VSUkVOVF9GSUxFX1BDIFZJU09SX0JVU19QQ192aXNvcmJ1c19tYWluX2MKLSNkZWZpbmUgUE9MTEpJRkZJRVNfVEVTVFdPUksgICAgICAgICAxMDAKICNkZWZpbmUgUE9MTEpJRkZJRVNfTk9STUFMQ0hBTk5FTCAgICAgMTAKIAogc3RhdGljIGludCBidXNyZWdfcmMgPSAtRU5PREVWOyAvKiBzdG9yZXMgdGhlIHJlc3VsdCBmcm9tIGJ1cyByZWdpc3RyYXRpb24gKi8KIAotc3RhdGljIGludCB2aXNvcmJ1c191ZXZlbnQoc3RydWN0IGRldmljZSAqeGRldiwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KTsKLXN0YXRpYyBpbnQgdmlzb3JidXNfbWF0Y2goc3RydWN0IGRldmljZSAqeGRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKnhkcnYpOwotc3RhdGljIHZvaWQgZml4X3ZidXNfZGV2X2luZm8oc3RydWN0IHZpc29yX2RldmljZSAqdmlzb3JkZXYpOwotCi0vKiAgQlVTIHR5cGUgYXR0cmlidXRlcwotICoKLSAqICBkZWZpbmUgJiBpbXBsZW1lbnQgZGlzcGxheSBvZiBidXMgYXR0cmlidXRlcyB1bmRlcgotICogIC9zeXMvYnVzL3Zpc29yYnVzLgotICoKLSAqLwotCi1zdGF0aWMgc3NpemVfdCB2ZXJzaW9uX3Nob3coc3RydWN0IGJ1c190eXBlICpidXMsIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgVkVSU0lPTik7Ci19Ci0KLXN0YXRpYyBCVVNfQVRUUl9STyh2ZXJzaW9uKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnZpc29yYnVzX2J1c19hdHRyc1tdID0gewotCSZidXNfYXR0cl92ZXJzaW9uLmF0dHIsCi0JTlVMTCwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHZpc29yYnVzX2J1c19ncm91cCA9IHsKLQkuYXR0cnMgPSB2aXNvcmJ1c19idXNfYXR0cnMsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqdmlzb3JidXNfYnVzX2dyb3Vwc1tdID0gewotCSZ2aXNvcmJ1c19idXNfZ3JvdXAsCi0JTlVMTCwKLX07Ci0KIC8qCiAgKiBERVZJQ0UgdHlwZSBhdHRyaWJ1dGVzCiAgKgpAQCAtMTA2LDYxICs2NiwxNCBAQAogCU5VTEwsCiB9OwogCi0vKiogVGhpcyBkZXNjcmliZXMgdGhlIFRZUEUgb2YgYnVzLgotICogIChEb24ndCBjb25mdXNlIHRoaXMgd2l0aCBhbiBJTlNUQU5DRSBvZiB0aGUgYnVzLikKLSAqLwotc3RydWN0IGJ1c190eXBlIHZpc29yYnVzX3R5cGUgPSB7Ci0JLm5hbWUgPSAidmlzb3JidXMiLAotCS5tYXRjaCA9IHZpc29yYnVzX21hdGNoLAotCS51ZXZlbnQgPSB2aXNvcmJ1c191ZXZlbnQsCi0JLmRldl9ncm91cHMgPSB2aXNvcmJ1c19kZXZfZ3JvdXBzLAotCS5idXNfZ3JvdXBzID0gdmlzb3JidXNfYnVzX2dyb3VwcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZGVsYXllZF93b3JrIHBlcmlvZGljX3dvcms7Ci0KLS8qIFlFUywgd2UgbmVlZCAyIHdvcmtxdWV1ZXMuCi0gKiBUaGUgcmVhc29uIGlzLCB3b3JraXRlbXMgb24gdGhlIHRlc3QgcXVldWUgbWF5IG5lZWQgdG8gY2FuY2VsCi0gKiB3b3JraXRlbXMgb24gdGhlIG90aGVyIHF1ZXVlLiAgWW91IHdpbGwgYmUgaW4gZm9yIHRyb3VibGUgaWYgeW91IHRyeSB0bwotICogZG8gdGhpcyB3aXRoIHdvcmtpdGVtcyBxdWV1ZWQgb24gdGhlIHNhbWUgd29ya3F1ZXVlLgotICovCi1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnBlcmlvZGljX3Rlc3Rfd29ya3F1ZXVlOwotc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpwZXJpb2RpY19kZXZfd29ya3F1ZXVlOwotc3RhdGljIGxvbmcgbG9uZyBidXNfY291bnQ7CS8qKiBudW1iZXIgb2YgYnVzIGluc3RhbmNlcyAqLwotCQkJCQkvKiogZXZlci1pbmNyZWFzaW5nICovCi0KLXN0YXRpYyB2b2lkIGNoaXBzZXRfYnVzX2NyZWF0ZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpidXNfaW5mbyk7Ci1zdGF0aWMgdm9pZCBjaGlwc2V0X2J1c19kZXN0cm95KHN0cnVjdCB2aXNvcl9kZXZpY2UgKmJ1c19pbmZvKTsKLXN0YXRpYyB2b2lkIGNoaXBzZXRfZGV2aWNlX2NyZWF0ZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXZfaW5mbyk7Ci1zdGF0aWMgdm9pZCBjaGlwc2V0X2RldmljZV9kZXN0cm95KHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldl9pbmZvKTsKLXN0YXRpYyB2b2lkIGNoaXBzZXRfZGV2aWNlX3BhdXNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldl9pbmZvKTsKLXN0YXRpYyB2b2lkIGNoaXBzZXRfZGV2aWNlX3Jlc3VtZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXZfaW5mbyk7Ci0KLS8qKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIGhlcmVpbiwgYW5kIGFyZSBjYWxsZWQgYnkgdGhlIGNoaXBzZXQKLSAqICBkcml2ZXIgdG8gbm90aWZ5IHVzIGFib3V0IHNwZWNpZmljIGV2ZW50cy4KLSAqLwotc3RhdGljIHN0cnVjdCB2aXNvcmNoaXBzZXRfYnVzZGV2X25vdGlmaWVycyBjaGlwc2V0X25vdGlmaWVycyA9IHsKLQkuYnVzX2NyZWF0ZSA9IGNoaXBzZXRfYnVzX2NyZWF0ZSwKLQkuYnVzX2Rlc3Ryb3kgPSBjaGlwc2V0X2J1c19kZXN0cm95LAotCS5kZXZpY2VfY3JlYXRlID0gY2hpcHNldF9kZXZpY2VfY3JlYXRlLAotCS5kZXZpY2VfZGVzdHJveSA9IGNoaXBzZXRfZGV2aWNlX2Rlc3Ryb3ksCi0JLmRldmljZV9wYXVzZSA9IGNoaXBzZXRfZGV2aWNlX3BhdXNlLAotCS5kZXZpY2VfcmVzdW1lID0gY2hpcHNldF9kZXZpY2VfcmVzdW1lLAotfTsKLQotLyoqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgaW4gdGhlIGNoaXBzZXQgZHJpdmVyLCBhbmQgd2UgY2FsbCB0aGVtCi0gKiAgaGVyZWluIHdoZW4gd2Ugd2FudCB0byBhY2tub3dsZWRnZSBhIHNwZWNpZmljIGV2ZW50LgotICovCi1zdGF0aWMgc3RydWN0IHZpc29yY2hpcHNldF9idXNkZXZfcmVzcG9uZGVycyBjaGlwc2V0X3Jlc3BvbmRlcnM7Ci0KIC8qIGZpbGxlZCBpbiB3aXRoIGluZm8gYWJvdXQgcGFyZW50IGNoaXBzZXQgZHJpdmVyIHdoZW4gd2UgcmVnaXN0ZXIgd2l0aCBpdCAqLwogc3RhdGljIHN0cnVjdCB1bHRyYV92YnVzX2RldmljZWluZm8gY2hpcHNldF9kcml2ZXJpbmZvOwogLyogZmlsbGVkIGluIHdpdGggaW5mbyBhYm91dCB0aGlzIGRyaXZlciwgd3J0IGl0IHNlcnZpY2luZyBjbGllbnQgYnVzc2VzICovCiBzdGF0aWMgc3RydWN0IHVsdHJhX3ZidXNfZGV2aWNlaW5mbyBjbGllbnRidXNfZHJpdmVyaW5mbzsKIAotLyoqIGxpc3Qgb2Ygdmlzb3JfZGV2aWNlIHN0cnVjdHMsIGxpbmtlZCB2aWEgLmxpc3RfYWxsICovCisvKiBsaXN0IG9mIHZpc29yX2RldmljZSBzdHJ1Y3RzLCBsaW5rZWQgdmlhIC5saXN0X2FsbCAqLwogc3RhdGljIExJU1RfSEVBRChsaXN0X2FsbF9idXNfaW5zdGFuY2VzKTsKLS8qKiBsaXN0IG9mIHZpc29yX2RldmljZSBzdHJ1Y3RzLCBsaW5rZWQgdmlhIC5saXN0X2FsbCAqLworLyogbGlzdCBvZiB2aXNvcl9kZXZpY2Ugc3RydWN0cywgbGlua2VkIHZpYSAubGlzdF9hbGwgKi8KIHN0YXRpYyBMSVNUX0hFQUQobGlzdF9hbGxfZGV2aWNlX2luc3RhbmNlcyk7CiAKIHN0YXRpYyBpbnQKQEAgLTE3Nyw5ICs5MCwxNCBAQAogCXJldHVybiAwOwogfQogCi0vKiBUaGlzIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHVwb24gYWRkaW5nIGEgdmlzb3JfZGV2aWNlIChkZXZpY2VfYWRkKSwgb3IKLSAqIGFkZGluZyBhIHZpc29yX2RyaXZlciAodmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKSwgYW5kIHJldHVybnMgMSBpZmYgdGhlCi0gKiBwcm92aWRlZCBkcml2ZXIgY2FuIGNvbnRyb2wgdGhlIHNwZWNpZmllZCBkZXZpY2UuCisvKioKKyAqIHZpc29yYnVzX21hdGNoKCkgLSBjYWxsZWQgYXV0b21hdGljYWxseSB1cG9uIGFkZGluZyBhIHZpc29yX2RldmljZQorICogICAgICAgICAgICAgICAgICAgIChkZXZpY2VfYWRkKSwgb3IgYWRkaW5nIGEgdmlzb3JfZHJpdmVyCisgKiAgICAgICAgICAgICAgICAgICAgKHZpc29yYnVzX3JlZ2lzdGVyX3Zpc29yX2RyaXZlcikKKyAqIEB4ZGV2OiBzdHJ1Y3QgZGV2aWNlIGZvciB0aGUgZGV2aWNlIGJlaW5nIG1hdGNoZWQKKyAqIEB4ZHJ2OiBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBmb3IgZHJpdmVyIHRvIG1hdGNoIGRldmljZSBhZ2FpbnN0CisgKgorICogUmV0dXJuOiAxIGlmZiB0aGUgcHJvdmlkZWQgZHJpdmVyIGNhbiBjb250cm9sIHRoZSBzcGVjaWZpZWQgZGV2aWNlCiAgKi8KIHN0YXRpYyBpbnQKIHZpc29yYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKnhkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICp4ZHJ2KQpAQCAtMjExLDkgKzEyOSwyMiBAQAogCXJldHVybiAwOwogfQogCi0vKiogVGhpcyBpcyBjYWxsZWQgd2hlbiBkZXZpY2VfdW5yZWdpc3RlcigpIGlzIGNhbGxlZCBmb3IgdGhlIGJ1cyBkZXZpY2UKLSAqICBpbnN0YW5jZSwgYWZ0ZXIgYWxsIG90aGVyIHRhc2tzIGludm9sdmVkIHdpdGggZGVzdHJveWluZyB0aGUgZGV2aWNlCi0gKiAgYXJlIGNvbXBsZXRlLgorLyoKKyAqIFRoaXMgZGVzY3JpYmVzIHRoZSBUWVBFIG9mIGJ1cy4KKyAqICAoRG9uJ3QgY29uZnVzZSB0aGlzIHdpdGggYW4gSU5TVEFOQ0Ugb2YgdGhlIGJ1cy4pCisgKi8KK3N0cnVjdCBidXNfdHlwZSB2aXNvcmJ1c190eXBlID0geworCS5uYW1lID0gInZpc29yYnVzIiwKKwkubWF0Y2ggPSB2aXNvcmJ1c19tYXRjaCwKKwkudWV2ZW50ID0gdmlzb3JidXNfdWV2ZW50LAorCS5kZXZfZ3JvdXBzID0gdmlzb3JidXNfZGV2X2dyb3VwcywKK307CisKKy8qKgorICogdmlzb3JidXNfcmVsZWFlX2J1c2RldmljZSgpIC0gY2FsbGVkIHdoZW4gZGV2aWNlX3VucmVnaXN0ZXIoKSBpcyBjYWxsZWQgZm9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYnVzIGRldmljZSBpbnN0YW5jZSwgYWZ0ZXIgYWxsIG90aGVyIHRhc2tzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZvbHZlZCB3aXRoIGRlc3Ryb3lpbmcgdGhlIGRldiBhcmUgY29tcGxldGUKKyAqIEB4ZGV2OiBzdHJ1Y3QgZGV2aWNlIGZvciB0aGUgYnVzIGJlaW5nIHJlbGVhc2VkCiAgKi8KIHN0YXRpYyB2b2lkCiB2aXNvcmJ1c19yZWxlYXNlX2J1c2RldmljZShzdHJ1Y3QgZGV2aWNlICp4ZGV2KQpAQCAtMjIzLDE4ICsxNTQsMTYgQEAKIAlrZnJlZShkZXYpOwogfQogCi0vKiogVGhpcyBpcyBjYWxsZWQgd2hlbiBkZXZpY2VfdW5yZWdpc3RlcigpIGlzIGNhbGxlZCBmb3IgZWFjaCBjaGlsZAotICogIGRldmljZSBpbnN0YW5jZS4KKy8qKgorICogdmlzb3JidXNfcmVsZWFzZV9kZXZpY2UoKSAtIGNhbGxlZCB3aGVuIGRldmljZV91bnJlZ2lzdGVyKCkgaXMgY2FsbGVkIGZvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggY2hpbGQgZGV2aWNlIGluc3RhbmNlCisgKiBAeGRldjogc3RydWN0IGRldmljZSBmb3IgdGhlIHZpc29yIGRldmljZSBiZWluZyByZWxlYXNlZAogICovCiBzdGF0aWMgdm9pZAogdmlzb3JidXNfcmVsZWFzZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqeGRldikKIHsKIAlzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYgPSB0b192aXNvcl9kZXZpY2UoeGRldik7CiAKLQlpZiAoZGV2LT5wZXJpb2RpY193b3JrKSB7Ci0JCXZpc29yX3BlcmlvZGljX3dvcmtfZGVzdHJveShkZXYtPnBlcmlvZGljX3dvcmspOwotCQlkZXYtPnBlcmlvZGljX3dvcmsgPSBOVUxMOwotCX0KIAlpZiAoZGV2LT52aXNvcmNoYW5uZWwpIHsKIAkJdmlzb3JjaGFubmVsX2Rlc3Ryb3koZGV2LT52aXNvcmNoYW5uZWwpOwogCQlkZXYtPnZpc29yY2hhbm5lbCA9IE5VTEw7CkBAIC0yNDIsOSArMTcxLDExIEBACiAJa2ZyZWUoZGV2KTsKIH0KIAotLyogYmVnaW4gaW1wbGVtZW50YXRpb24gb2Ygc3BlY2lmaWMgY2hhbm5lbCBhdHRyaWJ1dGVzIHRvIGFwcGVhciB1bmRlcgotKiAvc3lzL2J1cy92aXNvcmJ1czx4Pi9kZXY8eT4vY2hhbm5lbAotKi8KKy8qCisgKiBiZWdpbiBpbXBsZW1lbnRhdGlvbiBvZiBzcGVjaWZpYyBjaGFubmVsIGF0dHJpYnV0ZXMgdG8gYXBwZWFyIHVuZGVyCisgKiAvc3lzL2J1cy92aXNvcmJ1czx4Pi9kZXY8eT4vY2hhbm5lbAorICovCisKIHN0YXRpYyBzc2l6ZV90IHBoeXNhZGRyX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCSAgICAgY2hhciAqYnVmKQogewpAQCAtMzQ5LDE1ICsyODAsMTEgQEAKIAogLyogZW5kIGltcGxlbWVudGF0aW9uIG9mIHNwZWNpZmljIGNoYW5uZWwgYXR0cmlidXRlcyAqLwogCi0vKiAgQlVTIGluc3RhbmNlIGF0dHJpYnV0ZXMKKy8qCisgKiAgQlVTIGluc3RhbmNlIGF0dHJpYnV0ZXMKICAqCiAgKiAgZGVmaW5lICYgaW1wbGVtZW50IGRpc3BsYXkgb2YgYnVzIGF0dHJpYnV0ZXMgdW5kZXIKLSAqICAvc3lzL2J1cy92aXNvcmJ1cy9idXNzZXMvdmlzb3JidXM8bj4uCi0gKgotICogIFRoaXMgaXMgYSBiaXQgaG9ha3kgYmVjYXVzZSB0aGUga2VybmVsIGRvZXMgbm90IHlldCBoYXZlIHRoZSBpbmZyYXN0cnVjdHVyZQotICogIHRvIHNlcGFyYXRlIGJ1cyBJTlNUQU5DRSBhdHRyaWJ1dGVzIGZyb20gYnVzIFRZUEUgYXR0cmlidXRlcy4uLgotICogIHNvIHdlIHJvbGwgb3VyIG93bi4gIFNlZSBidXNpbnN0LmMgLyBidXNpbnN0LmguCi0gKgorICogIC9zeXMvYnVzL3Zpc29yYnVzL2RldmljZXMvdmlzb3JidXM8bj4uCiAgKi8KIAogc3RhdGljIHNzaXplX3QgcGFydGl0aW9uX2hhbmRsZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTQzNCw4ICszNjEsOCBAQAogCQlpZiAodmRldi0+bmFtZSkKIAkJCXBhcnRpdGlvbl9uYW1lID0gdmRldi0+bmFtZTsKIAkJc2hpZnQgPSBzbnByaW50Zihwb3MsIHJlbWFpbiwKLQkJCQkgIkNsaWVudCBkZXZpY2UgLyBjbGllbnQgZHJpdmVyIGluZm8gZm9yICVzIGVhcnRpdGlvbiAodmJ1cyAjJWQpOlxuIiwKLQkJCQkgcGFydGl0aW9uX25hbWUsIHZkZXYtPmNoaXBzZXRfZGV2X25vKTsKKwkJCQkgIkNsaWVudCBkZXZpY2UgLyBjbGllbnQgZHJpdmVyIGluZm8gZm9yICVzIHBhcnRpdGlvbiAodmJ1cyAjJXUpOlxuIiwKKwkJCQkgcGFydGl0aW9uX25hbWUsIHZkZXYtPmNoaXBzZXRfYnVzX25vKTsKIAkJcG9zICs9IHNoaWZ0OwogCQlyZW1haW4gLT0gc2hpZnQ7CiAJCXNoaWZ0ID0gdmlzb3JjaGFubmVsX3JlYWQoY2hhbm5lbCwKQEAgLTUwOCwxMDMgKzQzNSw0OCBAQAogCQlOVUxMCiB9OwogCi0vKiAgRFJJVkVSIGF0dHJpYnV0ZXMKLSAqCi0gKiAgZGVmaW5lICYgaW1wbGVtZW50IGRpc3BsYXkgb2YgZHJpdmVyIGF0dHJpYnV0ZXMgdW5kZXIKLSAqICAvc3lzL2J1cy92aXNvcmJ1cy9kcml2ZXJzLzxkcml2ZXJuYW1lPi4KLSAqCi0gKi8KLQotc3RhdGljIHNzaXplX3QKLURSSVZFUl9BVFRSX3ZlcnNpb24oc3RydWN0IGRldmljZV9kcml2ZXIgKnhkcnYsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgdmlzb3JfZHJpdmVyICpkcnYgPSB0b192aXNvcl9kcml2ZXIoeGRydik7Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgZHJ2LT52ZXJzaW9uKTsKLX0KLQotc3RhdGljIGludAotcmVnaXN0ZXJfZHJpdmVyX2F0dHJpYnV0ZXMoc3RydWN0IHZpc29yX2RyaXZlciAqZHJ2KQotewotCXN0cnVjdCBkcml2ZXJfYXR0cmlidXRlIHZlcnNpb24gPQotCSAgICBfX0FUVFIodmVyc2lvbiwgU19JUlVHTywgRFJJVkVSX0FUVFJfdmVyc2lvbiwgTlVMTCk7Ci0JZHJ2LT52ZXJzaW9uX2F0dHIgPSB2ZXJzaW9uOwotCXJldHVybiBkcml2ZXJfY3JlYXRlX2ZpbGUoJmRydi0+ZHJpdmVyLCAmZHJ2LT52ZXJzaW9uX2F0dHIpOwotfQotCiBzdGF0aWMgdm9pZAotdW5yZWdpc3Rlcl9kcml2ZXJfYXR0cmlidXRlcyhzdHJ1Y3Qgdmlzb3JfZHJpdmVyICpkcnYpCitkZXZfcGVyaW9kaWNfd29yayh1bnNpZ25lZCBsb25nIF9fb3BhcXVlKQogewotCWRyaXZlcl9yZW1vdmVfZmlsZSgmZHJ2LT5kcml2ZXIsICZkcnYtPnZlcnNpb25fYXR0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZXZfcGVyaW9kaWNfd29yayh2b2lkICp4ZGV2KQotewotCXN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldiA9IHhkZXY7CisJc3RydWN0IHZpc29yX2RldmljZSAqZGV2ID0gKHN0cnVjdCB2aXNvcl9kZXZpY2UgKilfX29wYXF1ZTsKIAlzdHJ1Y3Qgdmlzb3JfZHJpdmVyICpkcnYgPSB0b192aXNvcl9kcml2ZXIoZGV2LT5kZXZpY2UuZHJpdmVyKTsKIAotCWRvd24oJmRldi0+dmlzb3Jkcml2ZXJfY2FsbGJhY2tfbG9jayk7CiAJaWYgKGRydi0+Y2hhbm5lbF9pbnRlcnJ1cHQpCiAJCWRydi0+Y2hhbm5lbF9pbnRlcnJ1cHQoZGV2KTsKLQl1cCgmZGV2LT52aXNvcmRyaXZlcl9jYWxsYmFja19sb2NrKTsKLQlpZiAoIXZpc29yX3BlcmlvZGljX3dvcmtfbmV4dHBlcmlvZChkZXYtPnBlcmlvZGljX3dvcmspKQotCQlwdXRfZGV2aWNlKCZkZXYtPmRldmljZSk7CisJbW9kX3RpbWVyKCZkZXYtPnRpbWVyLCBqaWZmaWVzICsgUE9MTEpJRkZJRVNfTk9STUFMQ0hBTk5FTCk7CiB9CiAKIHN0YXRpYyB2b2lkCiBkZXZfc3RhcnRfcGVyaW9kaWNfd29yayhzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYpCiB7Ci0JaWYgKGRldi0+YmVpbmdfcmVtb3ZlZCkKKwlpZiAoZGV2LT5iZWluZ19yZW1vdmVkIHx8IGRldi0+dGltZXJfYWN0aXZlKQogCQlyZXR1cm47CiAJLyogbm93IHVwIGJ5IGF0IGxlYXN0IDIgKi8KIAlnZXRfZGV2aWNlKCZkZXYtPmRldmljZSk7Ci0JaWYgKCF2aXNvcl9wZXJpb2RpY193b3JrX3N0YXJ0KGRldi0+cGVyaW9kaWNfd29yaykpCi0JCXB1dF9kZXZpY2UoJmRldi0+ZGV2aWNlKTsKKwlkZXYtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgUE9MTEpJRkZJRVNfTk9STUFMQ0hBTk5FTDsKKwlhZGRfdGltZXIoJmRldi0+dGltZXIpOworCWRldi0+dGltZXJfYWN0aXZlID0gdHJ1ZTsKIH0KIAogc3RhdGljIHZvaWQKIGRldl9zdG9wX3BlcmlvZGljX3dvcmsoc3RydWN0IHZpc29yX2RldmljZSAqZGV2KQogewotCWlmICh2aXNvcl9wZXJpb2RpY193b3JrX3N0b3AoZGV2LT5wZXJpb2RpY193b3JrKSkKLQkJcHV0X2RldmljZSgmZGV2LT5kZXZpY2UpOworCWlmICghZGV2LT50aW1lcl9hY3RpdmUpCisJCXJldHVybjsKKwlkZWxfdGltZXJfc3luYygmZGV2LT50aW1lcik7CisJZGV2LT50aW1lcl9hY3RpdmUgPSBmYWxzZTsKKwlwdXRfZGV2aWNlKCZkZXYtPmRldmljZSk7CiB9CiAKLS8qKiBUaGlzIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHVwb24gYWRkaW5nIGEgdmlzb3JfZGV2aWNlIChkZXZpY2VfYWRkKSwgb3IKLSAqICBhZGRpbmcgYSB2aXNvcl9kcml2ZXIgKHZpc29yYnVzX3JlZ2lzdGVyX3Zpc29yX2RyaXZlciksIGJ1dCBvbmx5IGFmdGVyCi0gKiAgdmlzb3JidXNfbWF0Y2ggaGFzIHJldHVybmVkIDEgdG8gaW5kaWNhdGUgYSBzdWNjZXNzZnVsIG1hdGNoIGJldHdlZW4KLSAqICBkcml2ZXIgYW5kIGRldmljZS4KLSAqLwotc3RhdGljIGludAotdmlzb3Jkcml2ZXJfcHJvYmVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKnhkZXYpCi17Ci0JaW50IHJlczsKLQlzdHJ1Y3Qgdmlzb3JfZHJpdmVyICpkcnY7Ci0Jc3RydWN0IHZpc29yX2RldmljZSAqZGV2OwotCi0JZHJ2ID0gdG9fdmlzb3JfZHJpdmVyKHhkZXYtPmRyaXZlcik7Ci0JZGV2ID0gdG9fdmlzb3JfZGV2aWNlKHhkZXYpOwotCi0JaWYgKCFkcnYtPnByb2JlKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWRvd24oJmRldi0+dmlzb3Jkcml2ZXJfY2FsbGJhY2tfbG9jayk7Ci0JZGV2LT5iZWluZ19yZW1vdmVkID0gZmFsc2U7Ci0KLQlyZXMgPSBkcnYtPnByb2JlKGRldik7Ci0JaWYgKHJlcyA+PSAwKSB7Ci0JCS8qIHN1Y2Nlc3M6IHJlZmVyZW5jZSBrZXB0IHZpYSB1bm1hdGNoZWQgZ2V0X2RldmljZSgpICovCi0JCWdldF9kZXZpY2UoJmRldi0+ZGV2aWNlKTsKLQkJZml4X3ZidXNfZGV2X2luZm8oZGV2KTsKLQl9Ci0KLQl1cCgmZGV2LT52aXNvcmRyaXZlcl9jYWxsYmFja19sb2NrKTsKLQlyZXR1cm4gcmVzOwotfQotCi0vKiogVGhpcyBpcyBjYWxsZWQgd2hlbiBkZXZpY2VfdW5yZWdpc3RlcigpIGlzIGNhbGxlZCBmb3IgZWFjaCBjaGlsZCBkZXZpY2UKLSAqICBpbnN0YW5jZSwgdG8gbm90aWZ5IHRoZSBhcHByb3ByaWF0ZSB2aXNvcmJ1c19kcml2ZXIgdGhhdCB0aGUgZGV2aWNlIGlzCi0gKiAgZ29pbmcgYXdheSwgYW5kIHRvIGRlY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIGRldmljZS4KKy8qKgorICogdmlzb3Jkcml2ZXJfcmVtb3ZlX2RldmljZSgpIC0gaGFuZGxlIHZpc29yIGRldmljZSBnb2luZyBhd2F5CisgKiBAeGRldjogc3RydWN0IGRldmljZSBmb3IgdGhlIHZpc29yIGRldmljZSBiZWluZyByZW1vdmVkCisgKgorICogVGhpcyBpcyBjYWxsZWQgd2hlbiBkZXZpY2VfdW5yZWdpc3RlcigpIGlzIGNhbGxlZCBmb3IgZWFjaCBjaGlsZCBkZXZpY2UKKyAqIGluc3RhbmNlLCB0byBub3RpZnkgdGhlIGFwcHJvcHJpYXRlIHZpc29yYnVzIGZ1bmN0aW9uIGRyaXZlciB0aGF0IHRoZSBkZXZpY2UKKyAqIGlzIGdvaW5nIGF3YXksIGFuZCB0byBkZWNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBkZXZpY2UuCisgKgorICogUmV0dXJuOiAwIGlmZiBzdWNjZXNzZnVsCiAgKi8KIHN0YXRpYyBpbnQKIHZpc29yZHJpdmVyX3JlbW92ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqeGRldikKQEAgLTYxNCwxMDUgKzQ4Niw0NCBAQAogCiAJZGV2ID0gdG9fdmlzb3JfZGV2aWNlKHhkZXYpOwogCWRydiA9IHRvX3Zpc29yX2RyaXZlcih4ZGV2LT5kcml2ZXIpOwotCWRvd24oJmRldi0+dmlzb3Jkcml2ZXJfY2FsbGJhY2tfbG9jayk7CisJbXV0ZXhfbG9jaygmZGV2LT52aXNvcmRyaXZlcl9jYWxsYmFja19sb2NrKTsKIAlkZXYtPmJlaW5nX3JlbW92ZWQgPSB0cnVlOwogCWlmIChkcnYtPnJlbW92ZSkKIAkJZHJ2LT5yZW1vdmUoZGV2KTsKLQl1cCgmZGV2LT52aXNvcmRyaXZlcl9jYWxsYmFja19sb2NrKTsKKwltdXRleF91bmxvY2soJmRldi0+dmlzb3Jkcml2ZXJfY2FsbGJhY2tfbG9jayk7CiAJZGV2X3N0b3BfcGVyaW9kaWNfd29yayhkZXYpOwogCiAJcHV0X2RldmljZSgmZGV2LT5kZXZpY2UpOwogCXJldHVybiAwOwogfQogCi0vKiogQSBwYXJ0aWN1bGFyIHR5cGUgb2Ygdmlzb3IgZHJpdmVyIGNhbGxzIHRoaXMgZnVuY3Rpb24gdG8gcmVnaXN0ZXIKLSAqICB0aGUgZHJpdmVyLiAgVGhlIGNhbGxlciBNVVNUIGZpbGwgaW4gdGhlIGZvbGxvd2luZyBmaWVsZHMgd2l0aGluIHRoZQotICogICNkcnYgc3RydWN0dXJlOgotICogICAgICBuYW1lLCB2ZXJzaW9uLCBvd25lciwgY2hhbm5lbF90eXBlcywgcHJvYmUsIHJlbW92ZQorLyoqCisgKiB2aXNvcmJ1c191bnJlZ2lzdGVyX3Zpc29yX2RyaXZlcigpIC0gdW5yZWdpc3RlcnMgdGhlIHByb3ZpZGVkIGRyaXZlcgorICogQGRydjogdGhlIGRyaXZlciB0byB1bnJlZ2lzdGVyCiAgKgotICogIEhlcmUncyBob3cgdGhlIHdob2xlIExpbnV4IGJ1cyAvIGRyaXZlciAvIGRldmljZSBtb2RlbCB3b3Jrcy4KLSAqCi0gKiAgQXQgc3lzdGVtIHN0YXJ0LXVwLCB0aGUgdmlzb3JidXMga2VybmVsIG1vZHVsZSBpcyBsb2FkZWQsIHdoaWNoIHJlZ2lzdGVycwotICogIHZpc29yYnVzX3R5cGUgYXMgYSBidXMgdHlwZSwgdXNpbmcgYnVzX3JlZ2lzdGVyKCkuCi0gKgotICogIEFsbCBrZXJuZWwgbW9kdWxlcyB0aGF0IHN1cHBvcnQgcGFydGljdWxhciBkZXZpY2UgdHlwZXMgb24gYQotICogIHZpc29yYnVzIGJ1cyBhcmUgbG9hZGVkLiAgRWFjaCBvZiB0aGVzZSBrZXJuZWwgbW9kdWxlcyBjYWxscwotICogIHZpc29yYnVzX3JlZ2lzdGVyX3Zpc29yX2RyaXZlcigpIGluIHRoZWlyIGluaXQgZnVuY3Rpb25zLCBwYXNzaW5nIGEKLSAqICB2aXNvcl9kcml2ZXIgc3RydWN0LiAgdmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKCkgaW4gdHVybiBjYWxscwotICogIHJlZ2lzdGVyX2RyaXZlcigmdmlzb3JfZHJpdmVyLmRyaXZlcikuICBUaGlzIC5kcml2ZXIgbWVtYmVyIGlzCi0gKiAgaW5pdGlhbGl6ZWQgd2l0aCBnZW5lcmljIG1ldGhvZHMgKGxpa2UgcHJvYmUpLCB3aG9zZSBzb2xlIHJlc3BvbnNpYmlsaXR5Ci0gKiAgaXMgdG8gYWN0IGFzIGEgYnJva2VyIGZvciB0aGUgcmVhbCBtZXRob2RzLCB3aGljaCBhcmUgd2l0aGluIHRoZQotICogIHZpc29yX2RyaXZlciBzdHJ1Y3QuICAoVGhpcyBpcyB0aGUgd2F5IHRoZSBzdWJjbGFzcyBiZWhhdmlvciBpcwotICogIGltcGxlbWVudGVkLCBzaW5jZSB2aXNvcl9kcml2ZXIgaXMgZXNzZW50aWFsbHkgYSBzdWJjbGFzcyBvZiB0aGUKLSAqICBnZW5lcmljIGRyaXZlci4pICBXaGVuZXZlciBhIGRyaXZlcl9yZWdpc3RlcigpIGhhcHBlbnMsIGNvcmUgYnVzIGNvZGUgaW4KLSAqICB0aGUga2VybmVsIGRvZXMgKHNlZSBkZXZpY2VfYXR0YWNoKCkgaW4gZHJpdmVycy9iYXNlL2RkLmMpOgotICoKLSAqICAgICAgZm9yIGVhY2ggZGV2IGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVzICh0aGUgYnVzIHRoYXQgZHJpdmVyIGlzIG9uKSB0aGF0Ci0gKiAgICAgIGRvZXMgbm90IHlldCBoYXZlIGEgZHJpdmVyCi0gKiAgICAgICAgICBpZiBidXMubWF0Y2goZGV2LG5ld2RyaXZlcikgPT0geWVzX21hdGNoZWQgICoqIC5tYXRjaCBzcGVjaWZpZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIGR1cmluZyBidXNfcmVnaXN0ZXIoKS4KLSAqICAgICAgICAgICAgICBuZXdkcml2ZXIucHJvYmUoZGV2KSAgKiogZm9yIHZpc29yIGRyaXZlcnMsIHRoaXMgd2lsbCBjYWxsCi0gKiAgICAgICAgICAgICAgICAgICAgKiogdGhlIGdlbmVyaWMgZHJpdmVyLnByb2JlIGltcGxlbWVudGVkIGluIHZpc29yYnVzLmMsCi0gKiAgICAgICAgICAgICAgICAgICAgKiogd2hpY2ggaW4gdHVybiBjYWxscyB0aGUgcHJvYmUgc3BlY2lmaWVkIHdpdGhpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAqKiBzdHJ1Y3Qgdmlzb3JfZHJpdmVyICh3aGljaCB3YXMgc3BlY2lmaWVkIGJ5IHRoZQotICogICAgICAgICAgICAgICAgICAgICoqIGFjdHVhbCBkZXZpY2UgZHJpdmVyIGFzIHBhcnQgb2YKLSAqICAgICAgICAgICAgICAgICAgICAqKiB2aXNvcmJ1c19yZWdpc3Rlcl92aXNvcl9kcml2ZXIoKSkuCi0gKgotICogIFRoZSBhYm92ZSBkYW5jZSBhbHNvIGhhcHBlbnMgd2hlbiBhIG5ldyBkZXZpY2UgYXBwZWFycy4KLSAqICBTbyB0aGUgcXVlc3Rpb24gaXMsIGhvdyBhcmUgZGV2aWNlcyBjcmVhdGVkIHdpdGhpbiB0aGUgc3lzdGVtPwotICogIEJhc2ljYWxseSwganVzdCBjYWxsIGRldmljZV9hZGQoZGV2KS4gIFNlZSBwY2lfYnVzX2FkZF9kZXZpY2VzKCkuCi0gKiAgcGNpX3NjYW5fZGV2aWNlKCkgc2hvd3MgYW4gZXhhbXBsZSBvZiBob3cgdG8gYnVpbGQgYSBkZXZpY2Ugc3RydWN0LiAgSXQKLSAqICByZXR1cm5zIHRoZSBuZXdseS1jcmVhdGVkIHN0cnVjdCB0byBwY2lfc2Nhbl9zaW5nbGVfZGV2aWNlKCksIHdobyBhZGRzIGl0Ci0gKiAgdG8gdGhlIGxpc3Qgb2YgZGV2aWNlcyBhdCBQQ0lCVVMuZGV2aWNlcy4gIFRoYXQgbGlzdCBvZiBkZXZpY2VzIGlzIHdoYXQKLSAqICBpcyB0cmF2ZXJzZWQgYnkgcGNpX2J1c19hZGRfZGV2aWNlcygpLgotICoKLSAqLwotaW50IHZpc29yYnVzX3JlZ2lzdGVyX3Zpc29yX2RyaXZlcihzdHJ1Y3Qgdmlzb3JfZHJpdmVyICpkcnYpCi17Ci0JaW50IHJjID0gMDsKLQotCWlmIChidXNyZWdfcmMgPCAwKQotCQlyZXR1cm4gLUVOT0RFVjsgLypjYW4ndCByZWdpc3RlciBvbiBhIG5vbmV4aXN0ZW50IGJ1cyovCi0KLQlkcnYtPmRyaXZlci5uYW1lID0gZHJ2LT5uYW1lOwotCWRydi0+ZHJpdmVyLmJ1cyA9ICZ2aXNvcmJ1c190eXBlOwotCWRydi0+ZHJpdmVyLnByb2JlID0gdmlzb3Jkcml2ZXJfcHJvYmVfZGV2aWNlOwotCWRydi0+ZHJpdmVyLnJlbW92ZSA9IHZpc29yZHJpdmVyX3JlbW92ZV9kZXZpY2U7Ci0JZHJ2LT5kcml2ZXIub3duZXIgPSBkcnYtPm93bmVyOwotCi0JLyogZHJpdmVyX3JlZ2lzdGVyIGRvZXMgdGhpczoKLQkgKiAgIGJ1c19hZGRfZHJpdmVyKGRydikKLQkgKiAgIC0+aWYgKGRydi5idXMpICAqKiAoYnVzX3R5cGUpICoqCi0JICogICAgICAgZHJpdmVyX2F0dGFjaChkcnYpCi0JICogICAgICAgICBmb3IgZWFjaCBkZXYgd2l0aCBidXMgdHlwZSBvZiBkcnYuYnVzCi0JICogICAgICAgICAgIGlmICghZGV2LmRydikgICoqIG5vIGRyaXZlciBhc3NpZ25lZCB5ZXQgKioKLQkgKiAgICAgICAgICAgICBpZiAoYnVzLm1hdGNoKGRldixkcnYpKSAgW3Zpc29yYnVzX21hdGNoXQotCSAqICAgICAgICAgICAgICAgZGV2LmRydiA9IGRydgotCSAqICAgICAgICAgICAgICAgaWYgKCFkcnYucHJvYmUoZGV2KSkgICBbdmlzb3Jkcml2ZXJfcHJvYmVfZGV2aWNlXQotCSAqICAgICAgICAgICAgICAgICBkZXYuZHJ2ID0gTlVMTAotCSAqLwotCi0JcmMgPSBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0JcmMgPSByZWdpc3Rlcl9kcml2ZXJfYXR0cmlidXRlcyhkcnYpOwotCWlmIChyYyA8IDApCi0JCWRyaXZlcl91bnJlZ2lzdGVyKCZkcnYtPmRyaXZlcik7Ci0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKTsKLQotLyoqIEEgcGFydGljdWxhciB0eXBlIG9mIHZpc29yIGRyaXZlciBjYWxscyB0aGlzIGZ1bmN0aW9uIHRvIHVucmVnaXN0ZXIKLSAqICB0aGUgZHJpdmVyLCBpLmUuLCB3aXRoaW4gaXRzIG1vZHVsZV9leGl0IGZ1bmN0aW9uLgorICogQSB2aXNvciBmdW5jdGlvbiBkcml2ZXIgY2FsbHMgdGhpcyBmdW5jdGlvbiB0byB1bnJlZ2lzdGVyIHRoZSBkcml2ZXIsCisgKiBpLmUuLCB3aXRoaW4gaXRzIG1vZHVsZV9leGl0IGZ1bmN0aW9uLgogICovCiB2b2lkCiB2aXNvcmJ1c191bnJlZ2lzdGVyX3Zpc29yX2RyaXZlcihzdHJ1Y3Qgdmlzb3JfZHJpdmVyICpkcnYpCiB7Ci0JdW5yZWdpc3Rlcl9kcml2ZXJfYXR0cmlidXRlcyhkcnYpOwogCWRyaXZlcl91bnJlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmJ1c191bnJlZ2lzdGVyX3Zpc29yX2RyaXZlcik7CiAKKy8qKgorICogdmlzb3JidXNfcmVhZF9jaGFubmVsKCkgLSByZWFkcyBmcm9tIHRoZSBkZXNpZ25hdGVkIGNoYW5uZWwgaW50bworICogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJvdmlkZWQgYnVmZmVyCisgKiBAZGV2OiAgICB0aGUgZGV2aWNlIHdob3NlIGNoYW5uZWwgaXMgcmVhZCBmcm9tCisgKiBAb2Zmc2V0OiB0aGUgb2Zmc2V0IGludG8gdGhlIGNoYW5uZWwgYXQgd2hpY2ggcmVhZGluZyBzdGFydHMKKyAqIEBkZXN0OiAgIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgdGhhdCBpcyB3cml0dGVuIGludG8gZnJvbSB0aGUgY2hhbm5lbAorICogQG5ieXRlczogdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlIGNoYW5uZWwKKyAqCisgKiBJZiByZWNlaXZpbmcgYSBtZXNzYWdlLCB1c2UgdGhlIHZpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUoKQorICogZnVuY3Rpb24gaW5zdGVhZC4KKyAqCisgKiBSZXR1cm46IGludGVnZXIgaW5kaWNhdGluZyBzdWNjZXNzICh6ZXJvKSBvciBmYWlsdXJlIChub24temVybykKKyAqLwogaW50CiB2aXNvcmJ1c19yZWFkX2NoYW5uZWwoc3RydWN0IHZpc29yX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIG9mZnNldCwKIAkJICAgICAgdm9pZCAqZGVzdCwgdW5zaWduZWQgbG9uZyBuYnl0ZXMpCkBAIC03MjEsNiArNTMyLDE5IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmJ1c19yZWFkX2NoYW5uZWwpOwogCisvKioKKyAqIHZpc29yYnVzX3dyaXRlX2NoYW5uZWwoKSAtIHdyaXRlcyB0aGUgcHJvdmlkZWQgYnVmZmVyIGludG8gdGhlIGRlc2lnbmF0ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwKKyAqIEBkZXY6ICAgIHRoZSBkZXZpY2Ugd2hvc2UgY2hhbm5lbCBpcyB3cml0dGVuIHRvCisgKiBAb2Zmc2V0OiB0aGUgb2Zmc2V0IGludG8gdGhlIGNoYW5uZWwgYXQgd2hpY2ggd3JpdGluZyBzdGFydHMKKyAqIEBzcmM6ICAgIHRoZSBzb3VyY2UgYnVmZmVyIHRoYXQgaXMgd3JpdHRlbiBpbnRvIHRoZSBjaGFubmVsCisgKiBAbmJ5dGVzOiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIGludG8gdGhlIGNoYW5uZWwKKyAqCisgKiBJZiBzZW5kaW5nIGEgbWVzc2FnZSwgdXNlIHRoZSB2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KCkKKyAqIGZ1bmN0aW9uIGluc3RlYWQuCisgKgorICogUmV0dXJuOiBpbnRlZ2VyIGluZGljYXRpbmcgc3VjY2VzcyAoemVybykgb3IgZmFpbHVyZSAobm9uLXplcm8pCisgKi8KIGludAogdmlzb3JidXNfd3JpdGVfY2hhbm5lbChzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAogCQkgICAgICAgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIG5ieXRlcykKQEAgLTcyOSwxNiArNTUzLDEzIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmJ1c193cml0ZV9jaGFubmVsKTsKIAotaW50Ci12aXNvcmJ1c19jbGVhcl9jaGFubmVsKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHU4IGNoLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBuYnl0ZXMpCi17Ci0JcmV0dXJuIHZpc29yY2hhbm5lbF9jbGVhcihkZXYtPnZpc29yY2hhbm5lbCwgb2Zmc2V0LCBjaCwgbmJ5dGVzKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHZpc29yYnVzX2NsZWFyX2NoYW5uZWwpOwotCi0vKiogV2UgZG9uJ3QgcmVhbGx5IGhhdmUgYSByZWFsIGludGVycnVwdCwgc28gZm9yIG5vdyB3ZSBqdXN0IGNhbGwgdGhlCi0gKiAgaW50ZXJydXB0IGZ1bmN0aW9uIHBlcmlvZGljYWxseS4uLgorLyoqCisgKiB2aXNvcmJ1c19lbmFibGVfY2hhbm5lbF9pbnRlcnJ1cHRzKCkgLSBlbmFibGVzIGludGVycnVwdHMgb24gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ25hdGVkIGRldmljZQorICogQGRldjogdGhlIGRldmljZSBvbiB3aGljaCB0byBlbmFibGUgaW50ZXJydXB0cworICoKKyAqIEN1cnJlbnRseSB3ZSBkb24ndCB5ZXQgaGF2ZSBhIHJlYWwgaW50ZXJydXB0LCBzbyBmb3Igbm93IHdlIGp1c3QgY2FsbCB0aGUKKyAqIGludGVycnVwdCBmdW5jdGlvbiBwZXJpb2RpY2FsbHkgdmlhIGEgdGltZXIuCiAgKi8KIHZvaWQKIHZpc29yYnVzX2VuYWJsZV9jaGFubmVsX2ludGVycnVwdHMoc3RydWN0IHZpc29yX2RldmljZSAqZGV2KQpAQCAtNzQ3LDYgKzU2OCwxMSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JidXNfZW5hYmxlX2NoYW5uZWxfaW50ZXJydXB0cyk7CiAKKy8qKgorICogdmlzb3JidXNfZGlzYWJsZV9jaGFubmVsX2ludGVycnVwdHMoKSAtIGRpc2FibGVzIGludGVycnVwdHMgb24gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaWduYXRlZCBkZXZpY2UKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugb24gd2hpY2ggdG8gZGlzYWJsZSBpbnRlcnJ1cHRzCisgKi8KIHZvaWQKIHZpc29yYnVzX2Rpc2FibGVfY2hhbm5lbF9pbnRlcnJ1cHRzKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldikKIHsKQEAgLTc1NCwxOSArNTgwLDI4IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmJ1c19kaXNhYmxlX2NoYW5uZWxfaW50ZXJydXB0cyk7CiAKLS8qKiBUaGlzIGlzIGhvdyBldmVyeXRoaW5nIHN0YXJ0cyBmcm9tIHRoZSBkZXZpY2UgZW5kLgotICogIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBjaGFubmVsIGZpcnN0IGFwcGVhcnMgdmlhIGEgQ29udHJvbFZNCi0gKiAgbWVzc2FnZS4gIEluIHJlc3BvbnNlLCB0aGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIHZpc29yX2RldmljZSB0bwotICogIGNvcnJlc3BvbmQgdG8gdGhlIG5ldyBjaGFubmVsLCBhbmQgYXR0ZW1wdHMgdG8gY29ubmVjdCBpdCB0aGUgYXBwcm9wcmlhdGUKLSAqICBkcml2ZXIuICBJZiB0aGUgYXBwcm9wcmlhdGUgZHJpdmVyIGlzIGZvdW5kLCB0aGUgdmlzb3JfZHJpdmVyLnByb2JlKCkKLSAqICBmdW5jdGlvbiBmb3IgdGhhdCBkcml2ZXIgd2lsbCBiZSBjYWxsZWQsIGFuZCB3aWxsIGJlIHBhc3NlZCB0aGUgbmV3Ci0gKiAgdmlzb3JfZGV2aWNlIHRoYXQgd2UganVzdCBjcmVhdGVkLgorLyoqCisgKiBjcmVhdGVfdmlzb3JfZGV2aWNlKCkgLSBjcmVhdGUgdmlzb3IgZGV2aWNlIGFzIGEgcmVzdWx0IG9mIHJlY2VpdmluZyB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2x2bSBkZXZpY2VfY3JlYXRlIG1lc3NhZ2UgZm9yIGEgbmV3IGRldmljZQorICogQGRldjogYSBmcmVzaGx5LXplcm9lZCBzdHJ1Y3Qgdmlzb3JfZGV2aWNlLCBjb250YWluaW5nIG9ubHkgZmlsbGVkLWluIHZhbHVlcworICogICAgICAgZm9yIGNoaXBzZXRfYnVzX25vIGFuZCBjaGlwc2V0X2Rldl9ubywgdGhhdCB3aWxsIGJlIGluaXRpYWxpemVkCiAgKgotICogIEl0J3Mgb2sgaWYgdGhlIGFwcHJvcHJpYXRlIGRyaXZlciBpcyBub3QgeWV0IGxvYWRlZCwgYmVjYXVzZSBpbiB0aGF0IGNhc2UKLSAqICB0aGUgbmV3IGRldmljZSBzdHJ1Y3Qgd2lsbCBqdXN0IHN0aWNrIGFyb3VuZCBpbiB0aGUgYnVzJyBsaXN0IG9mIGRldmljZXMuCi0gKiAgV2hlbiB0aGUgYXBwcm9wcmlhdGUgZHJpdmVyIGNhbGxzIHZpc29yYnVzX3JlZ2lzdGVyX3Zpc29yX2RyaXZlcigpLCB0aGUKLSAqICB2aXNvcl9kcml2ZXIucHJvYmUoKSBmb3IgdGhlIG5ldyBkcml2ZXIgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3Ci0gKiAgZGV2aWNlLgorICogVGhpcyBpcyBob3cgZXZlcnl0aGluZyBzdGFydHMgZnJvbSB0aGUgZGV2aWNlIGVuZC4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBjaGFubmVsIGZpcnN0IGFwcGVhcnMgdmlhIGEgQ29udHJvbFZNCisgKiBtZXNzYWdlLiAgSW4gcmVzcG9uc2UsIHRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGEgdmlzb3JfZGV2aWNlIHRvCisgKiBjb3JyZXNwb25kIHRvIHRoZSBuZXcgY2hhbm5lbCwgYW5kIGF0dGVtcHRzIHRvIGNvbm5lY3QgaXQgdGhlIGFwcHJvcHJpYXRlCisgKiBkcml2ZXIuICBJZiB0aGUgYXBwcm9wcmlhdGUgZHJpdmVyIGlzIGZvdW5kLCB0aGUgdmlzb3JfZHJpdmVyLnByb2JlKCkKKyAqIGZ1bmN0aW9uIGZvciB0aGF0IGRyaXZlciB3aWxsIGJlIGNhbGxlZCwgYW5kIHdpbGwgYmUgcGFzc2VkIHRoZSBuZXcKKyAqIHZpc29yX2RldmljZSB0aGF0IHdlIGp1c3QgY3JlYXRlZC4KKyAqCisgKiBJdCdzIG9rIGlmIHRoZSBhcHByb3ByaWF0ZSBkcml2ZXIgaXMgbm90IHlldCBsb2FkZWQsIGJlY2F1c2UgaW4gdGhhdCBjYXNlCisgKiB0aGUgbmV3IGRldmljZSBzdHJ1Y3Qgd2lsbCBqdXN0IHN0aWNrIGFyb3VuZCBpbiB0aGUgYnVzJyBsaXN0IG9mIGRldmljZXMuCisgKiBXaGVuIHRoZSBhcHByb3ByaWF0ZSBkcml2ZXIgY2FsbHMgdmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKCksIHRoZQorICogdmlzb3JfZHJpdmVyLnByb2JlKCkgZm9yIHRoZSBuZXcgZHJpdmVyIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIG5ldworICogZGV2aWNlLgorICoKKyAqIFJldHVybjogMCBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgdGhlIG5lZ2F0aXZlIHZhbHVlIHJldHVybmVkIGJ5CisgKiAgICAgICAgIGRldmljZV9hZGQoKSBpbmRpY2F0aW5nIHRoZSByZWFzb24gZm9yIGZhaWx1cmUKICAqLwogc3RhdGljIGludAogY3JlYXRlX3Zpc29yX2RldmljZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYpCkBAIC03NzgsMzMgKzYxMywyNyBAQAogCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9FTlRSWV9QQywgY2hpcHNldF9kZXZfbm8sIGNoaXBzZXRfYnVzX25vLAogCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwogCi0Jc2VtYV9pbml0KCZkZXYtPnZpc29yZHJpdmVyX2NhbGxiYWNrX2xvY2ssIDEpOwkvKiB1bmxvY2tlZCAqLworCW11dGV4X2luaXQoJmRldi0+dmlzb3Jkcml2ZXJfY2FsbGJhY2tfbG9jayk7CiAJZGV2LT5kZXZpY2UuYnVzID0gJnZpc29yYnVzX3R5cGU7CiAJZGV2LT5kZXZpY2UuZ3JvdXBzID0gdmlzb3JidXNfY2hhbm5lbF9ncm91cHM7CiAJZGV2aWNlX2luaXRpYWxpemUoJmRldi0+ZGV2aWNlKTsKIAlkZXYtPmRldmljZS5yZWxlYXNlID0gdmlzb3JidXNfcmVsZWFzZV9kZXZpY2U7CiAJLyoga2VlcCBhIHJlZmVyZW5jZSBqdXN0IGZvciB1cyAobm93IDIpICovCiAJZ2V0X2RldmljZSgmZGV2LT5kZXZpY2UpOwotCWRldi0+cGVyaW9kaWNfd29yayA9Ci0JCXZpc29yX3BlcmlvZGljX3dvcmtfY3JlYXRlKFBPTExKSUZGSUVTX05PUk1BTENIQU5ORUwsCi0JCQkJCSAgIHBlcmlvZGljX2Rldl93b3JrcXVldWUsCi0JCQkJCSAgIGRldl9wZXJpb2RpY193b3JrLAotCQkJCQkgICBkZXYsIGRldl9uYW1lKCZkZXYtPmRldmljZSkpOwotCWlmICghZGV2LT5wZXJpb2RpY193b3JrKSB7Ci0JCVBPU1RDT0RFX0xJTlVYXzMoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBjaGlwc2V0X2Rldl9ubywKLQkJCQkgRElBR19TRVZFUklUWV9FUlIpOwotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9wdXQ7Ci0JfQorCWluaXRfdGltZXIoJmRldi0+dGltZXIpOworCWRldi0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKShkZXYpOworCWRldi0+dGltZXIuZnVuY3Rpb24gPSBkZXZfcGVyaW9kaWNfd29yazsKIAotCS8qIGJ1c19pZCBtdXN0IGJlIGEgdW5pcXVlIG5hbWUgd2l0aCByZXNwZWN0IHRvIHRoaXMgYnVzIFRZUEUKKwkvKgorCSAqIGJ1c19pZCBtdXN0IGJlIGEgdW5pcXVlIG5hbWUgd2l0aCByZXNwZWN0IHRvIHRoaXMgYnVzIFRZUEUKIAkgKiAoTk9UIGJ1cyBpbnN0YW5jZSkuICBUaGF0J3Mgd2h5IHdlIG5lZWQgdG8gaW5jbHVkZSB0aGUgYnVzCiAJICogbnVtYmVyIHdpdGhpbiB0aGUgbmFtZS4KIAkgKi8KIAlkZXZfc2V0X25hbWUoJmRldi0+ZGV2aWNlLCAidmJ1cyV1OmRldiV1IiwKIAkJICAgICBjaGlwc2V0X2J1c19ubywgY2hpcHNldF9kZXZfbm8pOwogCi0JLyogIGRldmljZV9hZGQgZG9lcyB0aGlzOgorCS8qCisJICogZGV2aWNlX2FkZCBkb2VzIHRoaXM6CiAJICogICAgYnVzX2FkZF9kZXZpY2UoZGV2KQogCSAqICAgIC0+ZGV2aWNlX2F0dGFjaChkZXYpCiAJICogICAgICAtPmZvciBlYWNoIGRyaXZlciBkcnYgcmVnaXN0ZXJlZCBvbiB0aGUgYnVzIHRoYXQgZGV2IGlzIG9uCkBAIC04NjQsMTEgKzY5MywyMCBAQAogCXJldHVybiAwOwogfQogCi0vKiBXcml0ZSB0aGUgY29udGVudHMgb2YgPGluZm8+IHRvIHRoZSBzdHJ1Y3QKLSAqIHNwYXJfdmJ1c19jaGFubmVsX3Byb3RvY29sLmNocF9pbmZvLgorLyoqCisgKiB3cml0ZV92YnVzX2NocF9pbmZvKCkgLSB3cml0ZSB0aGUgY29udGVudHMgb2YgPGluZm8+IHRvIHRoZSBzdHJ1Y3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXJfdmJ1c19jaGFubmVsX3Byb3RvY29sLmNocF9pbmZvCisgKiBAY2hhbjogICAgIGluZGVudGlmaWVzIHRoZSBzLVBhciBjaGFubmVsIHRoYXQgd2lsbCBiZSB1cGRhdGVkCisgKiBAaGRyX2luZm86IHVzZWQgdG8gZmluZCBhcHByb3ByaWF0ZSBjaGFubmVsIG9mZnNldCB0byB3cml0ZSBkYXRhCisgKiBAaW5mbzogICAgIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiB0byB3cml0ZQorICoKKyAqIFdyaXRlcyBjaGlwc2V0IGluZm8gaW50byB0aGUgY2hhbm5lbCBtZW1vcnkgdG8gYmUgdXNlZCBmb3IgZGlhZ25vc3RpYworICogcHVycG9zZXMuCisgKgorICogUmV0dXJucyBubyB2YWx1ZSBzaW5jZSB0aGlzIGlzIGRlYnVnIGluZm9ybWF0aW9uIGFuZCBub3QgbmVlZGVkIGZvcgorICogZGV2aWNlIGZ1bmN0aW9uYWxpdHkuCiAgKi8KLQotc3RhdGljIGludAorc3RhdGljIHZvaWQKIHdyaXRlX3ZidXNfY2hwX2luZm8oc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbiwKIAkJICAgIHN0cnVjdCBzcGFyX3ZidXNfaGVhZGVyaW5mbyAqaGRyX2luZm8sCiAJCSAgICBzdHJ1Y3QgdWx0cmFfdmJ1c19kZXZpY2VpbmZvICppbmZvKQpAQCAtODc2LDE4ICs3MTQsMjUgQEAKIAlpbnQgb2ZmID0gc2l6ZW9mKHN0cnVjdCBjaGFubmVsX2hlYWRlcikgKyBoZHJfaW5mby0+Y2hwX2luZm9fb2Zmc2V0OwogCiAJaWYgKGhkcl9pbmZvLT5jaHBfaW5mb19vZmZzZXQgPT0gMCkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybjsKIAotCWlmICh2aXNvcmNoYW5uZWxfd3JpdGUoY2hhbiwgb2ZmLCBpbmZvLCBzaXplb2YoKmluZm8pKSA8IDApCi0JCXJldHVybiAtRUZBVUxUOwotCXJldHVybiAwOworCXZpc29yY2hhbm5lbF93cml0ZShjaGFuLCBvZmYsIGluZm8sIHNpemVvZigqaW5mbykpOwogfQogCi0vKiBXcml0ZSB0aGUgY29udGVudHMgb2YgPGluZm8+IHRvIHRoZSBzdHJ1Y3QKLSAqIHNwYXJfdmJ1c19jaGFubmVsX3Byb3RvY29sLmJ1c19pbmZvLgorLyoqCisgKiB3cml0ZV92YnVzX2J1c19pbmZvKCkgLSB3cml0ZSB0aGUgY29udGVudHMgb2YgPGluZm8+IHRvIHRoZSBzdHJ1Y3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXJfdmJ1c19jaGFubmVsX3Byb3RvY29sLmJ1c19pbmZvCisgKiBAY2hhbjogICAgIGluZGVudGlmaWVzIHRoZSBzLVBhciBjaGFubmVsIHRoYXQgd2lsbCBiZSB1cGRhdGVkCisgKiBAaGRyX2luZm86IHVzZWQgdG8gZmluZCBhcHByb3ByaWF0ZSBjaGFubmVsIG9mZnNldCB0byB3cml0ZSBkYXRhCisgKiBAaW5mbzogICAgIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiB0byB3cml0ZQorICoKKyAqIFdyaXRlcyBidXMgaW5mbyBpbnRvIHRoZSBjaGFubmVsIG1lbW9yeSB0byBiZSB1c2VkIGZvciBkaWFnbm9zdGljCisgKiBwdXJwb3Nlcy4KKyAqCisgKiBSZXR1cm5zIG5vIHZhbHVlIHNpbmNlIHRoaXMgaXMgZGVidWcgaW5mb3JtYXRpb24gYW5kIG5vdCBuZWVkZWQgZm9yCisgKiBkZXZpY2UgZnVuY3Rpb25hbGl0eS4KICAqLwotCi1zdGF0aWMgaW50CitzdGF0aWMgdm9pZAogd3JpdGVfdmJ1c19idXNfaW5mbyhzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFuLAogCQkgICAgc3RydWN0IHNwYXJfdmJ1c19oZWFkZXJpbmZvICpoZHJfaW5mbywKIAkJICAgIHN0cnVjdCB1bHRyYV92YnVzX2RldmljZWluZm8gKmluZm8pCkBAIC04OTUsMzcgKzc0MCw0NiBAQAogCWludCBvZmYgPSBzaXplb2Yoc3RydWN0IGNoYW5uZWxfaGVhZGVyKSArIGhkcl9pbmZvLT5idXNfaW5mb19vZmZzZXQ7CiAKIAlpZiAoaGRyX2luZm8tPmJ1c19pbmZvX29mZnNldCA9PSAwKQotCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuOwogCi0JaWYgKHZpc29yY2hhbm5lbF93cml0ZShjaGFuLCBvZmYsIGluZm8sIHNpemVvZigqaW5mbykpIDwgMCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JcmV0dXJuIDA7CisJdmlzb3JjaGFubmVsX3dyaXRlKGNoYW4sIG9mZiwgaW5mbywgc2l6ZW9mKCppbmZvKSk7CiB9CiAKLS8qIFdyaXRlIHRoZSBjb250ZW50cyBvZiA8aW5mbz4gdG8gdGhlCi0gKiBzdHJ1Y3Qgc3Bhcl92YnVzX2NoYW5uZWxfcHJvdG9jb2wuZGV2X2luZm9bPGRldml4Pl0uCisvKioKKyAqIHdyaXRlX3ZidXNfZGV2X2luZm8oKSAtIHdyaXRlIHRoZSBjb250ZW50cyBvZiA8aW5mbz4gdG8gdGhlIHN0cnVjdAorICogICAgICAgICAgICAgICAgICAgICAgICAgc3Bhcl92YnVzX2NoYW5uZWxfcHJvdG9jb2wuZGV2X2luZm9bPGRldml4Pl0KKyAqIEBjaGFuOiAgICAgaW5kZW50aWZpZXMgdGhlIHMtUGFyIGNoYW5uZWwgdGhhdCB3aWxsIGJlIHVwZGF0ZWQKKyAqIEBoZHJfaW5mbzogdXNlZCB0byBmaW5kIGFwcHJvcHJpYXRlIGNoYW5uZWwgb2Zmc2V0IHRvIHdyaXRlIGRhdGEKKyAqIEBpbmZvOiAgICAgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIHRvIHdyaXRlCisgKiBAZGV2aXg6ICAgIHRoZSByZWxhdGl2ZSBkZXZpY2UgbnVtYmVyICgwLi5uLTEpIG9mIHRoZSBkZXZpY2Ugb24gdGhlIGJ1cworICoKKyAqIFdyaXRlcyBkZXZpY2UgaW5mbyBpbnRvIHRoZSBjaGFubmVsIG1lbW9yeSB0byBiZSB1c2VkIGZvciBkaWFnbm9zdGljCisgKiBwdXJwb3Nlcy4KKyAqCisgKiBSZXR1cm5zIG5vIHZhbHVlIHNpbmNlIHRoaXMgaXMgZGVidWcgaW5mb3JtYXRpb24gYW5kIG5vdCBuZWVkZWQgZm9yCisgKiBkZXZpY2UgZnVuY3Rpb25hbGl0eS4KICAqLwotc3RhdGljIGludAorc3RhdGljIHZvaWQKIHdyaXRlX3ZidXNfZGV2X2luZm8oc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbiwKIAkJICAgIHN0cnVjdCBzcGFyX3ZidXNfaGVhZGVyaW5mbyAqaGRyX2luZm8sCi0JCSAgICBzdHJ1Y3QgdWx0cmFfdmJ1c19kZXZpY2VpbmZvICppbmZvLCBpbnQgZGV2aXgpCisJCSAgICBzdHJ1Y3QgdWx0cmFfdmJ1c19kZXZpY2VpbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgZGV2aXgpCiB7CiAJaW50IG9mZiA9CiAJICAgIChzaXplb2Yoc3RydWN0IGNoYW5uZWxfaGVhZGVyKSArIGhkcl9pbmZvLT5kZXZfaW5mb19vZmZzZXQpICsKIAkgICAgKGhkcl9pbmZvLT5kZXZpY2VfaW5mb19zdHJ1Y3RfYnl0ZXMgKiBkZXZpeCk7CiAKIAlpZiAoaGRyX2luZm8tPmRldl9pbmZvX29mZnNldCA9PSAwKQotCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuOwogCi0JaWYgKHZpc29yY2hhbm5lbF93cml0ZShjaGFuLCBvZmYsIGluZm8sIHNpemVvZigqaW5mbykpIDwgMCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JcmV0dXJuIDA7CisJdmlzb3JjaGFubmVsX3dyaXRlKGNoYW4sIG9mZiwgaW5mbywgc2l6ZW9mKCppbmZvKSk7CiB9CiAKLS8qIEZvciBhIGNoaWxkIGRldmljZSBqdXN0IGNyZWF0ZWQgb24gYSBjbGllbnQgYnVzLCBmaWxsIGluCi0gKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZHJpdmVyIHRoYXQgaXMgY29udHJvbGxpbmcgdGhpcyBkZXZpY2UgaW50bwotICogdGhlIHRoZSBhcHByb3ByaWF0ZSBzbG90IHdpdGhpbiB0aGUgdmJ1cyBjaGFubmVsIG9mIHRoZSBidXMKLSAqIGluc3RhbmNlLgorLyoqCisgKiBmaXhfdmJ1c19kZXZfaW5mbygpIC0gZm9yIGEgY2hpbGQgZGV2aWNlIGp1c3QgY3JlYXRlZCBvbiBhIGNsaWVudCBidXMsIGZpbGwKKyAqICAgICAgICAgICAgICAgICAgICAgICBpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZHJpdmVyIHRoYXQgaXMgY29udHJvbGxpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGRldmljZSBpbnRvIHRoZSB0aGUgYXBwcm9wcmlhdGUgc2xvdCB3aXRoaW4gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgdmJ1cyBjaGFubmVsIG9mIHRoZSBidXMgaW5zdGFuY2UKKyAqIEB2aXNvcmRldjogc3RydWN0IHZpc29yX2RldmljZSBmb3IgdGhlIGRlc2lyZWQgZGV2aWNlCiAgKi8KIHN0YXRpYyB2b2lkCiBmaXhfdmJ1c19kZXZfaW5mbyhzdHJ1Y3Qgdmlzb3JfZGV2aWNlICp2aXNvcmRldikKQEAgLTkzMyw4ICs3ODcsOCBAQAogCWludCBpOwogCXN0cnVjdCB2aXNvcl9kZXZpY2UgKmJkZXY7CiAJc3RydWN0IHZpc29yX2RyaXZlciAqdmlzb3JkcnY7Ci0JaW50IGJ1c19ubyA9IHZpc29yZGV2LT5jaGlwc2V0X2J1c19ubzsKLQlpbnQgZGV2X25vID0gdmlzb3JkZXYtPmNoaXBzZXRfZGV2X25vOworCXUzMiBidXNfbm8gPSB2aXNvcmRldi0+Y2hpcHNldF9idXNfbm87CisJdTMyIGRldl9ubyA9IHZpc29yZGV2LT5jaGlwc2V0X2Rldl9ubzsKIAlzdHJ1Y3QgdWx0cmFfdmJ1c19kZXZpY2VpbmZvIGRldl9pbmZvOwogCWNvbnN0IGNoYXIgKmNoYW5fdHlwZV9uYW1lID0gTlVMTDsKIAlzdHJ1Y3Qgc3Bhcl92YnVzX2hlYWRlcmluZm8gKmhkcl9pbmZvOwpAQCAtOTQyLDE3ICs3OTYsMTYgQEAKIAlpZiAoIXZpc29yZGV2LT5kZXZpY2UuZHJpdmVyKQogCQlyZXR1cm47CiAKLQloZHJfaW5mbyA9IChzdHJ1Y3Qgc3Bhcl92YnVzX2hlYWRlcmluZm8gKil2aXNvcmRldi0+dmJ1c19oZHJfaW5mbzsKLQlpZiAoIWhkcl9pbmZvKQotCQlyZXR1cm47Ci0KIAliZGV2ID0gdmlzb3JidXNfZ2V0X2RldmljZV9ieV9pZChidXNfbm8sIEJVU19ST09UX0RFVklDRSwgTlVMTCk7CiAJaWYgKCFiZGV2KQogCQlyZXR1cm47Ci0KKwloZHJfaW5mbyA9IChzdHJ1Y3Qgc3Bhcl92YnVzX2hlYWRlcmluZm8gKiliZGV2LT52YnVzX2hkcl9pbmZvOworCWlmICghaGRyX2luZm8pCisJCXJldHVybjsKIAl2aXNvcmRydiA9IHRvX3Zpc29yX2RyaXZlcih2aXNvcmRldi0+ZGV2aWNlLmRyaXZlcik7CiAKLQkvKiBXaXRoaW4gdGhlIGxpc3Qgb2YgZGV2aWNlIHR5cGVzIChieSBHVUlEKSB0aGF0IHRoZSBkcml2ZXIKKwkvKgorCSAqIFdpdGhpbiB0aGUgbGlzdCBvZiBkZXZpY2UgdHlwZXMgKGJ5IEdVSUQpIHRoYXQgdGhlIGRyaXZlcgogCSAqIHNheXMgaXQgc3VwcG9ydHMsIGZpbmQgb3V0IHdoaWNoIG9uZSBvZiB0aG9zZSB0eXBlcyBtYXRjaGVzCiAJICogdGhlIHR5cGUgb2YgdGhpcyBkZXZpY2UsIHNvIHRoYXQgd2UgY2FuIGluY2x1ZGUgdGhlIGRldmljZQogCSAqIHR5cGUgbmFtZQpAQCAtOTY2LDIwICs4MTksMTQ4IEBACiAJCX0KIAl9CiAKLQlidXNfZGV2aWNlX2luZm9faW5pdCgmZGV2X2luZm8sIGNoYW5fdHlwZV9uYW1lLAotCQkJICAgICB2aXNvcmRydi0+bmFtZSwgdmlzb3JkcnYtPnZlcnNpb24sCi0JCQkgICAgIHZpc29yZHJ2LT52ZXJ0YWcpOworCWJ1c19kZXZpY2VfaW5mb19pbml0KCZkZXZfaW5mbywgY2hhbl90eXBlX25hbWUsIHZpc29yZHJ2LT5uYW1lKTsKIAl3cml0ZV92YnVzX2Rldl9pbmZvKGJkZXYtPnZpc29yY2hhbm5lbCwgaGRyX2luZm8sICZkZXZfaW5mbywgZGV2X25vKTsKIAotCS8qIFJlLXdyaXRlIGJ1cytjaGlwc2V0IGluZm8sIGJlY2F1c2UgaXQgaXMgcG9zc2libGUgdGhhdCB0aGlzCi0JKiB3YXMgcHJldmlvdXNseSB3cml0dGVuIGJ5IG91ciBldmlsIGNvdW50ZXJwYXJ0LCB2aXJ0cGNpLgotCSovCisJLyoKKwkgKiBSZS13cml0ZSBidXMrY2hpcHNldCBpbmZvLCBiZWNhdXNlIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhpcworCSAqIHdhcyBwcmV2aW91c2x5IHdyaXR0ZW4gYnkgb3VyIGV2aWwgY291bnRlcnBhcnQsIHZpcnRwY2kuCisJICovCiAJd3JpdGVfdmJ1c19jaHBfaW5mbyhiZGV2LT52aXNvcmNoYW5uZWwsIGhkcl9pbmZvLCAmY2hpcHNldF9kcml2ZXJpbmZvKTsKIAl3cml0ZV92YnVzX2J1c19pbmZvKGJkZXYtPnZpc29yY2hhbm5lbCwgaGRyX2luZm8sCiAJCQkgICAgJmNsaWVudGJ1c19kcml2ZXJpbmZvKTsKIH0KIAotLyoqIENyZWF0ZSBhIGRldmljZSBpbnN0YW5jZSBmb3IgdGhlIHZpc29yIGJ1cyBpdHNlbGYuCisvKioKKyAqIHZpc29yZHJpdmVyX3Byb2JlX2RldmljZSgpIC0gaGFuZGxlIG5ldyB2aXNvciBkZXZpY2UgY29taW5nIG9ubGluZQorICogQHhkZXY6IHN0cnVjdCBkZXZpY2UgZm9yIHRoZSB2aXNvciBkZXZpY2UgYmVpbmcgcHJvYmVkCisgKgorICogVGhpcyBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB1cG9uIGFkZGluZyBhIHZpc29yX2RldmljZSAoZGV2aWNlX2FkZCksIG9yCisgKiBhZGRpbmcgYSB2aXNvcl9kcml2ZXIgKHZpc29yYnVzX3JlZ2lzdGVyX3Zpc29yX2RyaXZlciksIGJ1dCBvbmx5IGFmdGVyCisgKiB2aXNvcmJ1c19tYXRjaCgpIGhhcyByZXR1cm5lZCAxIHRvIGluZGljYXRlIGEgc3VjY2Vzc2Z1bCBtYXRjaCBiZXR3ZWVuCisgKiBkcml2ZXIgYW5kIGRldmljZS4KKyAqCisgKiBJZiBzdWNjZXNzZnVsLCBhIHJlZmVyZW5jZSB0byB0aGUgZGV2aWNlIHdpbGwgYmUgaGVsZCBvbnRvIHZpYSBnZXRfZGV2aWNlKCkuCisgKgorICogUmV0dXJuOiAwIGlmIHN1Y2Nlc3NmdWwsIG1lYW5pbmcgdGhlIGZ1bmN0aW9uIGRyaXZlcidzIHByb2JlKCkgZnVuY3Rpb24KKyAqICAgICAgICAgd2FzIHN1Y2Nlc3NmdWwgd2l0aCB0aGlzIGRldmljZSwgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJybm8KKyAqICAgICAgICAgdmFsdWUgaW5kaWNhdGluZyBmYWlsdXJlIHJlYXNvbgorICovCitzdGF0aWMgaW50Cit2aXNvcmRyaXZlcl9wcm9iZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqeGRldikKK3sKKwlpbnQgcmVzOworCXN0cnVjdCB2aXNvcl9kcml2ZXIgKmRydjsKKwlzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXY7CisKKwlkcnYgPSB0b192aXNvcl9kcml2ZXIoeGRldi0+ZHJpdmVyKTsKKwlkZXYgPSB0b192aXNvcl9kZXZpY2UoeGRldik7CisKKwlpZiAoIWRydi0+cHJvYmUpCisJCXJldHVybiAtRU5PREVWOworCisJbXV0ZXhfbG9jaygmZGV2LT52aXNvcmRyaXZlcl9jYWxsYmFja19sb2NrKTsKKwlkZXYtPmJlaW5nX3JlbW92ZWQgPSBmYWxzZTsKKworCXJlcyA9IGRydi0+cHJvYmUoZGV2KTsKKwlpZiAocmVzID49IDApIHsKKwkJLyogc3VjY2VzczogcmVmZXJlbmNlIGtlcHQgdmlhIHVubWF0Y2hlZCBnZXRfZGV2aWNlKCkgKi8KKwkJZ2V0X2RldmljZSgmZGV2LT5kZXZpY2UpOworCQlmaXhfdmJ1c19kZXZfaW5mbyhkZXYpOworCX0KKworCW11dGV4X3VubG9jaygmZGV2LT52aXNvcmRyaXZlcl9jYWxsYmFja19sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIHZpc29yYnVzX3JlZ2lzdGVyX3Zpc29yX2RyaXZlcigpIC0gcmVnaXN0ZXJzIHRoZSBwcm92aWRlZCB2aXNvciBkcml2ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGhhbmRsaW5nIG9uZSBvciBtb3JlIHZpc29yIGRldmljZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlcyAoY2hhbm5lbF90eXBlcykKKyAqIEBkcnY6IHRoZSBkcml2ZXIgdG8gcmVnaXN0ZXIKKyAqCisgKiBBIHZpc29yIGZ1bmN0aW9uIGRyaXZlciBjYWxscyB0aGlzIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyCisgKiB0aGUgZHJpdmVyLiAgVGhlIGNhbGxlciBNVVNUIGZpbGwgaW4gdGhlIGZvbGxvd2luZyBmaWVsZHMgd2l0aGluIHRoZQorICogI2RydiBzdHJ1Y3R1cmU6CisgKiAgICAgbmFtZSwgdmVyc2lvbiwgb3duZXIsIGNoYW5uZWxfdHlwZXMsIHByb2JlLCByZW1vdmUKKyAqCisgKiBIZXJlJ3MgaG93IHRoZSB3aG9sZSBMaW51eCBidXMgLyBkcml2ZXIgLyBkZXZpY2UgbW9kZWwgd29ya3MuCisgKgorICogQXQgc3lzdGVtIHN0YXJ0LXVwLCB0aGUgdmlzb3JidXMga2VybmVsIG1vZHVsZSBpcyBsb2FkZWQsIHdoaWNoIHJlZ2lzdGVycworICogdmlzb3JidXNfdHlwZSBhcyBhIGJ1cyB0eXBlLCB1c2luZyBidXNfcmVnaXN0ZXIoKS4KKyAqCisgKiBBbGwga2VybmVsIG1vZHVsZXMgdGhhdCBzdXBwb3J0IHBhcnRpY3VsYXIgZGV2aWNlIHR5cGVzIG9uIGEKKyAqIHZpc29yYnVzIGJ1cyBhcmUgbG9hZGVkLiAgRWFjaCBvZiB0aGVzZSBrZXJuZWwgbW9kdWxlcyBjYWxscworICogdmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKCkgaW4gdGhlaXIgaW5pdCBmdW5jdGlvbnMsIHBhc3NpbmcgYQorICogdmlzb3JfZHJpdmVyIHN0cnVjdC4gIHZpc29yYnVzX3JlZ2lzdGVyX3Zpc29yX2RyaXZlcigpIGluIHR1cm4gY2FsbHMKKyAqIHJlZ2lzdGVyX2RyaXZlcigmdmlzb3JfZHJpdmVyLmRyaXZlcikuICBUaGlzIC5kcml2ZXIgbWVtYmVyIGlzCisgKiBpbml0aWFsaXplZCB3aXRoIGdlbmVyaWMgbWV0aG9kcyAobGlrZSBwcm9iZSksIHdob3NlIHNvbGUgcmVzcG9uc2liaWxpdHkKKyAqIGlzIHRvIGFjdCBhcyBhIGJyb2tlciBmb3IgdGhlIHJlYWwgbWV0aG9kcywgd2hpY2ggYXJlIHdpdGhpbiB0aGUKKyAqIHZpc29yX2RyaXZlciBzdHJ1Y3QuICAoVGhpcyBpcyB0aGUgd2F5IHRoZSBzdWJjbGFzcyBiZWhhdmlvciBpcworICogaW1wbGVtZW50ZWQsIHNpbmNlIHZpc29yX2RyaXZlciBpcyBlc3NlbnRpYWxseSBhIHN1YmNsYXNzIG9mIHRoZQorICogZ2VuZXJpYyBkcml2ZXIuKSAgV2hlbmV2ZXIgYSBkcml2ZXJfcmVnaXN0ZXIoKSBoYXBwZW5zLCBjb3JlIGJ1cyBjb2RlIGluCisgKiB0aGUga2VybmVsIGRvZXMgKHNlZSBkZXZpY2VfYXR0YWNoKCkgaW4gZHJpdmVycy9iYXNlL2RkLmMpOgorICoKKyAqICAgICBmb3IgZWFjaCBkZXYgYXNzb2NpYXRlZCB3aXRoIHRoZSBidXMgKHRoZSBidXMgdGhhdCBkcml2ZXIgaXMgb24pIHRoYXQKKyAqICAgICBkb2VzIG5vdCB5ZXQgaGF2ZSBhIGRyaXZlcgorICogICAgICAgICBpZiBidXMubWF0Y2goZGV2LG5ld2RyaXZlcikgPT0geWVzX21hdGNoZWQgICoqIC5tYXRjaCBzcGVjaWZpZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiogZHVyaW5nIGJ1c19yZWdpc3RlcigpLgorICogICAgICAgICAgICAgbmV3ZHJpdmVyLnByb2JlKGRldikgICoqIGZvciB2aXNvciBkcml2ZXJzLCB0aGlzIHdpbGwgY2FsbAorICogICAgICAgICAgICAgICAgICAgKiogdGhlIGdlbmVyaWMgZHJpdmVyLnByb2JlIGltcGxlbWVudGVkIGluIHZpc29yYnVzLmMsCisgKiAgICAgICAgICAgICAgICAgICAqKiB3aGljaCBpbiB0dXJuIGNhbGxzIHRoZSBwcm9iZSBzcGVjaWZpZWQgd2l0aGluIHRoZQorICogICAgICAgICAgICAgICAgICAgKiogc3RydWN0IHZpc29yX2RyaXZlciAod2hpY2ggd2FzIHNwZWNpZmllZCBieSB0aGUKKyAqICAgICAgICAgICAgICAgICAgICoqIGFjdHVhbCBkZXZpY2UgZHJpdmVyIGFzIHBhcnQgb2YKKyAqICAgICAgICAgICAgICAgICAgICoqIHZpc29yYnVzX3JlZ2lzdGVyX3Zpc29yX2RyaXZlcigpKS4KKyAqCisgKiBUaGUgYWJvdmUgZGFuY2UgYWxzbyBoYXBwZW5zIHdoZW4gYSBuZXcgZGV2aWNlIGFwcGVhcnMuCisgKiBTbyB0aGUgcXVlc3Rpb24gaXMsIGhvdyBhcmUgZGV2aWNlcyBjcmVhdGVkIHdpdGhpbiB0aGUgc3lzdGVtPworICogQmFzaWNhbGx5LCBqdXN0IGNhbGwgZGV2aWNlX2FkZChkZXYpLiAgU2VlIHBjaV9idXNfYWRkX2RldmljZXMoKS4KKyAqIHBjaV9zY2FuX2RldmljZSgpIHNob3dzIGFuIGV4YW1wbGUgb2YgaG93IHRvIGJ1aWxkIGEgZGV2aWNlIHN0cnVjdC4gIEl0CisgKiByZXR1cm5zIHRoZSBuZXdseS1jcmVhdGVkIHN0cnVjdCB0byBwY2lfc2Nhbl9zaW5nbGVfZGV2aWNlKCksIHdobyBhZGRzIGl0CisgKiB0byB0aGUgbGlzdCBvZiBkZXZpY2VzIGF0IFBDSUJVUy5kZXZpY2VzLiAgVGhhdCBsaXN0IG9mIGRldmljZXMgaXMgd2hhdAorICogaXMgdHJhdmVyc2VkIGJ5IHBjaV9idXNfYWRkX2RldmljZXMoKS4KKyAqCisgKiBSZXR1cm46IGludGVnZXIgaW5kaWNhdGluZyBzdWNjZXNzICh6ZXJvKSBvciBmYWlsdXJlIChub24temVybykKKyAqLworaW50IHZpc29yYnVzX3JlZ2lzdGVyX3Zpc29yX2RyaXZlcihzdHJ1Y3Qgdmlzb3JfZHJpdmVyICpkcnYpCit7CisJaW50IHJjID0gMDsKKworCWlmIChidXNyZWdfcmMgPCAwKQorCQlyZXR1cm4gLUVOT0RFVjsgLypjYW4ndCByZWdpc3RlciBvbiBhIG5vbmV4aXN0ZW50IGJ1cyovCisKKwlkcnYtPmRyaXZlci5uYW1lID0gZHJ2LT5uYW1lOworCWRydi0+ZHJpdmVyLmJ1cyA9ICZ2aXNvcmJ1c190eXBlOworCWRydi0+ZHJpdmVyLnByb2JlID0gdmlzb3Jkcml2ZXJfcHJvYmVfZGV2aWNlOworCWRydi0+ZHJpdmVyLnJlbW92ZSA9IHZpc29yZHJpdmVyX3JlbW92ZV9kZXZpY2U7CisJZHJ2LT5kcml2ZXIub3duZXIgPSBkcnYtPm93bmVyOworCisJLyoKKwkgKiBkcml2ZXJfcmVnaXN0ZXIgZG9lcyB0aGlzOgorCSAqICAgYnVzX2FkZF9kcml2ZXIoZHJ2KQorCSAqICAgLT5pZiAoZHJ2LmJ1cykgICoqIChidXNfdHlwZSkgKioKKwkgKiAgICAgICBkcml2ZXJfYXR0YWNoKGRydikKKwkgKiAgICAgICAgIGZvciBlYWNoIGRldiB3aXRoIGJ1cyB0eXBlIG9mIGRydi5idXMKKwkgKiAgICAgICAgICAgaWYgKCFkZXYuZHJ2KSAgKiogbm8gZHJpdmVyIGFzc2lnbmVkIHlldCAqKgorCSAqICAgICAgICAgICAgIGlmIChidXMubWF0Y2goZGV2LGRydikpICBbdmlzb3JidXNfbWF0Y2hdCisJICogICAgICAgICAgICAgICBkZXYuZHJ2ID0gZHJ2CisJICogICAgICAgICAgICAgICBpZiAoIWRydi5wcm9iZShkZXYpKSAgIFt2aXNvcmRyaXZlcl9wcm9iZV9kZXZpY2VdCisJICogICAgICAgICAgICAgICAgIGRldi5kcnYgPSBOVUxMCisJICovCisKKwlyYyA9IGRyaXZlcl9yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOworCWlmIChyYyA8IDApCisJCWRyaXZlcl91bnJlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKTsKKworLyoqCisgKiBjcmVhdGVfYnVzX2luc3RhbmNlKCkgLSBjcmVhdGUgYSBkZXZpY2UgaW5zdGFuY2UgZm9yIHRoZSB2aXNvciBidXMgaXRzZWxmCisgKiBAZGV2OiBzdHJ1Y3Qgdmlzb3JfZGV2aWNlIGluZGljYXRpbmcgdGhlIGJ1cyBpbnN0YW5jZQorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgb3RoZXJ3aXNlIG5lZ2F0aXZlIGVycm5vIHZhbHVlIGluZGljYXRpbmcgcmVhc29uIGZvcgorICogICAgICAgICBmYWlsdXJlCiAgKi8KIHN0YXRpYyBpbnQKIGNyZWF0ZV9idXNfaW5zdGFuY2Uoc3RydWN0IHZpc29yX2RldmljZSAqZGV2KQpAQCAtMTAxNCwyNSArOTk1LDI2IEBACiAJfSBlbHNlIHsKIAkJa2ZyZWUoaGRyX2luZm8pOwogCX0KLQlidXNfY291bnQrKzsKIAlsaXN0X2FkZF90YWlsKCZkZXYtPmxpc3RfYWxsLCAmbGlzdF9hbGxfYnVzX2luc3RhbmNlcyk7CiAJZGV2X3NldF9kcnZkYXRhKCZkZXYtPmRldmljZSwgZGV2KTsKIAlyZXR1cm4gMDsKIH0KIAotLyoqIFJlbW92ZSBhIGRldmljZSBpbnN0YW5jZSBmb3IgdGhlIHZpc29yIGJ1cyBpdHNlbGYuCisvKioKKyAqIHJlbW92ZV9idXNfaW5zdGFuY2UoKSAtIHJlbW92ZSBhIGRldmljZSBpbnN0YW5jZSBmb3IgdGhlIHZpc29yIGJ1cyBpdHNlbGYKKyAqIEBkZXY6IHN0cnVjdCB2aXNvcl9kZXZpY2UgaW5kZW50aWZ5aW5nIHRoZSBidXMgdG8gcmVtb3ZlCiAgKi8KIHN0YXRpYyB2b2lkCiByZW1vdmVfYnVzX2luc3RhbmNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldikKIHsKLQkvKiBOb3RlIHRoYXQgdGhpcyB3aWxsIHJlc3VsdCBpbiB0aGUgcmVsZWFzZSBtZXRob2QgZm9yCisJLyoKKwkgKiBOb3RlIHRoYXQgdGhpcyB3aWxsIHJlc3VsdCBpbiB0aGUgcmVsZWFzZSBtZXRob2QgZm9yCiAJICogZGV2LT5kZXYgYmVpbmcgY2FsbGVkLCB3aGljaCB3aWxsIGNhbGwKIAkgKiB2aXNvcmJ1c19yZWxlYXNlX2J1c2RldmljZSgpLiAgVGhpcyBoYXMgc29tZXRoaW5nIHRvIGRvIHdpdGgKIAkgKiB0aGUgcHV0X2RldmljZSgpIGRvbmUgaW4gZGV2aWNlX3VucmVnaXN0ZXIoKSwgYnV0IEkgaGF2ZSBuZXZlcgogCSAqIHN1Y2Nlc3NmdWxseSBiZWVuIGFibGUgdG8gdHJhY2UgdGhydSB0aGUgY29kZSB0byBzZWUgd2hlcmUvaG93CiAJICogcmVsZWFzZSgpIGdldHMgY2FsbGVkLiAgQnV0IEkga25vdyBpdCBkb2VzLgogCSAqLwotCWJ1c19jb3VudC0tOwogCWlmIChkZXYtPnZpc29yY2hhbm5lbCkgewogCQl2aXNvcmNoYW5uZWxfZGVzdHJveShkZXYtPnZpc29yY2hhbm5lbCk7CiAJCWRldi0+dmlzb3JjaGFubmVsID0gTlVMTDsKQEAgLTEwNDIsOCArMTAyNCwxMSBAQAogCWRldmljZV91bnJlZ2lzdGVyKCZkZXYtPmRldmljZSk7CiB9CiAKLS8qKiBDcmVhdGUgYW5kIHJlZ2lzdGVyIHRoZSBvbmUtYW5kLW9ubHkgb25lIGluc3RhbmNlIG9mCi0gKiAgdGhlIHZpc29yIGJ1cyB0eXBlICh2aXNvcmJ1c190eXBlKS4KKy8qKgorICogY3JlYXRlX2J1c190eXBlKCkgLSBjcmVhdGUgYW5kIHJlZ2lzdGVyIHRoZSBvbmUtYW5kLW9ubHkgb25lIGluc3RhbmNlIG9mCisgKiAgICAgICAgICAgICAgICAgICAgIHRoZSB2aXNvciBidXMgdHlwZSAodmlzb3JidXNfdHlwZSkKKyAqIFJldHVybjogMCBmb3Igc3VjY2Vzcywgb3RoZXJ3aXNlIG5lZ2F0aXZlIGVycm5vIHZhbHVlIHJldHVybmVkIGJ5CisgKiAgICAgICAgIGJ1c19yZWdpc3RlcigpIGluZGljYXRpbmcgdGhlIHJlYXNvbiBmb3IgZmFpbHVyZQogICovCiBzdGF0aWMgaW50CiBjcmVhdGVfYnVzX3R5cGUodm9pZCkKQEAgLTEwNTIsNyArMTAzNyw5IEBACiAJcmV0dXJuIGJ1c3JlZ19yYzsKIH0KIAotLyoqIFJlbW92ZSB0aGUgb25lLWFuZC1vbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGUgdmlzb3IgYnVzIHR5cGUgKHZpc29yYnVzX3R5cGUpLgorLyoqCisgKiByZW1vdmVfYnVzX3R5cGUoKSAtIHJlbW92ZSB0aGUgb25lLWFuZC1vbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGUgdmlzb3IgYnVzCisgKiAgICAgICAgICAgICAgICAgICAgIHR5cGUgKHZpc29yYnVzX3R5cGUpCiAgKi8KIHN0YXRpYyB2b2lkCiByZW1vdmVfYnVzX3R5cGUodm9pZCkKQEAgLTEwNjAsNyArMTA0Nyw4IEBACiAJYnVzX3VucmVnaXN0ZXIoJnZpc29yYnVzX3R5cGUpOwogfQogCi0vKiogUmVtb3ZlIGFsbCBjaGlsZCB2aXNvciBidXMgZGV2aWNlIGluc3RhbmNlcy4KKy8qKgorICogcmVtb3ZlX2FsbF92aXNvcl9kZXZpY2VzKCkgLSByZW1vdmUgYWxsIGNoaWxkIHZpc29yIGJ1cyBkZXZpY2UgaW5zdGFuY2VzCiAgKi8KIHN0YXRpYyB2b2lkCiByZW1vdmVfYWxsX3Zpc29yX2RldmljZXModm9pZCkKQEAgLTEwNzUsNyArMTA2Myw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZAordm9pZAogY2hpcHNldF9idXNfY3JlYXRlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldikKIHsKIAlpbnQgcmM7CkBAIC0xMDkyLDE5ICsxMDgwLDE3IEBACiAJCVBPU1RDT0RFX0xJTlVYXzMoQ0hJUFNFVF9JTklUX1NVQ0NFU1NfUEMsIGJ1c19ubywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAKLQlpZiAoY2hpcHNldF9yZXNwb25kZXJzLmJ1c19jcmVhdGUpCi0JCSgqY2hpcHNldF9yZXNwb25kZXJzLmJ1c19jcmVhdGUpIChkZXYsIHJjKTsKKwlidXNfY3JlYXRlX3Jlc3BvbnNlKGRldiwgcmMpOwogfQogCi1zdGF0aWMgdm9pZAordm9pZAogY2hpcHNldF9idXNfZGVzdHJveShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYpCiB7CiAJcmVtb3ZlX2J1c19pbnN0YW5jZShkZXYpOwotCWlmIChjaGlwc2V0X3Jlc3BvbmRlcnMuYnVzX2Rlc3Ryb3kpCi0JCSgqY2hpcHNldF9yZXNwb25kZXJzLmJ1c19kZXN0cm95KShkZXYsIDApOworCWJ1c19kZXN0cm95X3Jlc3BvbnNlKGRldiwgMCk7CiB9CiAKLXN0YXRpYyB2b2lkCit2b2lkCiBjaGlwc2V0X2RldmljZV9jcmVhdGUoc3RydWN0IHZpc29yX2RldmljZSAqZGV2X2luZm8pCiB7CiAJaW50IHJjOwpAQCAtMTExNSw4ICsxMTAxLDcgQEAKIAkJCSBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKIAogCXJjID0gY3JlYXRlX3Zpc29yX2RldmljZShkZXZfaW5mbyk7Ci0JaWYgKGNoaXBzZXRfcmVzcG9uZGVycy5kZXZpY2VfY3JlYXRlKQotCQljaGlwc2V0X3Jlc3BvbmRlcnMuZGV2aWNlX2NyZWF0ZShkZXZfaW5mbywgcmMpOworCWRldmljZV9jcmVhdGVfcmVzcG9uc2UoZGV2X2luZm8sIHJjKTsKIAogCWlmIChyYyA8IDApCiAJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZfbm8sIGJ1c19ubywKQEAgLTExMjYsMTggKzExMTEsMjIgQEAKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiB9CiAKLXN0YXRpYyB2b2lkCit2b2lkCiBjaGlwc2V0X2RldmljZV9kZXN0cm95KHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldl9pbmZvKQogewogCXJlbW92ZV92aXNvcl9kZXZpY2UoZGV2X2luZm8pOwogCi0JaWYgKGNoaXBzZXRfcmVzcG9uZGVycy5kZXZpY2VfZGVzdHJveSkKLQkJKCpjaGlwc2V0X3Jlc3BvbmRlcnMuZGV2aWNlX2Rlc3Ryb3kpIChkZXZfaW5mbywgMCk7CisJZGV2aWNlX2Rlc3Ryb3lfcmVzcG9uc2UoZGV2X2luZm8sIDApOwogfQogCi0vKiBUaGlzIGlzIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBzcGVjaWZpZWQgZm9yIGEgZnVuY3Rpb24gZHJpdmVyLCB0bwotICogYmUgY2FsbGVkIHdoZW4gYSBwZW5kaW5nICJwYXVzZSBkZXZpY2UiIG9wZXJhdGlvbiBoYXMgYmVlbgotICogY29tcGxldGVkLgorLyoqCisgKiBwYXVzZV9zdGF0ZV9jaGFuZ2VfY29tcGxldGUoKSAtIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYnkgYQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNvcmJ1cyBmdW5jdGlvbiBkcml2ZXIgd2hlbiBhCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcgInBhdXNlIGRldmljZSIgb3BlcmF0aW9uIGhhcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQKKyAqIEBkZXY6IHN0cnVjdCB2aXNvcl9kZXZpY2UgaWRlbnRpZnlpbmcgdGhlIHBhdXNlZCBkZXZpY2UKKyAqIEBzdGF0dXM6IDAgaWZmIHRoZSBwYXVzZSBzdGF0ZSBjaGFuZ2UgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgb3RoZXJ3aXNlCisgKiAgICAgICAgICBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlIGluZGljYXRpbmcgdGhlIHJlYXNvbiBmb3IgZmFpbHVyZQogICovCiBzdGF0aWMgdm9pZAogcGF1c2Vfc3RhdGVfY2hhbmdlX2NvbXBsZXRlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldiwgaW50IHN0YXR1cykKQEAgLTExNDYsMTkgKzExMzUsMTggQEAKIAkJcmV0dXJuOwogCiAJZGV2LT5wYXVzaW5nID0gZmFsc2U7Ci0JaWYgKCFjaGlwc2V0X3Jlc3BvbmRlcnMuZGV2aWNlX3BhdXNlKSAvKiB0aGlzIGNhbiBuZXZlciBoYXBwZW4hICovCi0JCXJldHVybjsKIAotCS8qIE5vdGlmeSB0aGUgY2hpcHNldCBkcml2ZXIgdGhhdCB0aGUgcGF1c2UgaXMgY29tcGxldGUsIHdoaWNoCi0JICogd2lsbCBwcmVzdW1hYmx5IHdhbnQgdG8gc2VuZCBzb21lIHNvcnQgb2YgcmVzcG9uc2UgdG8gdGhlCi0JICogaW5pdGlhdG9yLgotCSAqLwotCSgqY2hpcHNldF9yZXNwb25kZXJzLmRldmljZV9wYXVzZSkgKGRldiwgc3RhdHVzKTsKKwlkZXZpY2VfcGF1c2VfcmVzcG9uc2UoZGV2LCBzdGF0dXMpOwogfQogCi0vKiBUaGlzIGlzIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBzcGVjaWZpZWQgZm9yIGEgZnVuY3Rpb24gZHJpdmVyLCB0bwotICogYmUgY2FsbGVkIHdoZW4gYSBwZW5kaW5nICJyZXN1bWUgZGV2aWNlIiBvcGVyYXRpb24gaGFzIGJlZW4KLSAqIGNvbXBsZXRlZC4KKy8qKgorICogcmVzdW1lX3N0YXRlX2NoYW5nZV9jb21wbGV0ZSgpIC0gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBieSBhCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNvcmJ1cyBmdW5jdGlvbiBkcml2ZXIgd2hlbiBhCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nICJyZXN1bWUgZGV2aWNlIiBvcGVyYXRpb24gaGFzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQKKyAqIEBkZXY6IHN0cnVjdCB2aXNvcl9kZXZpY2UgaWRlbnRpZnlpbmcgdGhlIHJlc3VtZWQgZGV2aWNlCisgKiBAc3RhdHVzOiAwIGlmZiB0aGUgcmVzdW1lIHN0YXRlIGNoYW5nZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LCBvdGhlcndpc2UKKyAqICAgICAgICAgIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUgaW5kaWNhdGluZyB0aGUgcmVhc29uIGZvciBmYWlsdXJlCiAgKi8KIHN0YXRpYyB2b2lkCiByZXN1bWVfc3RhdGVfY2hhbmdlX2NvbXBsZXRlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldiwgaW50IHN0YXR1cykKQEAgLTExNjcsMTkgKzExNTUsMjUgQEAKIAkJcmV0dXJuOwogCiAJZGV2LT5yZXN1bWluZyA9IGZhbHNlOwotCWlmICghY2hpcHNldF9yZXNwb25kZXJzLmRldmljZV9yZXN1bWUpIC8qIHRoaXMgY2FuIG5ldmVyIGhhcHBlbiEgKi8KLQkJcmV0dXJuOwogCi0JLyogTm90aWZ5IHRoZSBjaGlwc2V0IGRyaXZlciB0aGF0IHRoZSByZXN1bWUgaXMgY29tcGxldGUsCisJLyoKKwkgKiBOb3RpZnkgdGhlIGNoaXBzZXQgZHJpdmVyIHRoYXQgdGhlIHJlc3VtZSBpcyBjb21wbGV0ZSwKIAkgKiB3aGljaCB3aWxsIHByZXN1bWFibHkgd2FudCB0byBzZW5kIHNvbWUgc29ydCBvZiByZXNwb25zZSB0bwogCSAqIHRoZSBpbml0aWF0b3IuCiAJICovCi0JKCpjaGlwc2V0X3Jlc3BvbmRlcnMuZGV2aWNlX3Jlc3VtZSkgKGRldiwgc3RhdHVzKTsKKwlkZXZpY2VfcmVzdW1lX3Jlc3BvbnNlKGRldiwgc3RhdHVzKTsKIH0KIAotLyogVGVsbCB0aGUgc3Vib3JkaW5hdGUgZnVuY3Rpb24gZHJpdmVyIGZvciBhIHNwZWNpZmljIGRldmljZSB0byBwYXVzZQotICogb3IgcmVzdW1lIHRoYXQgZGV2aWNlLiAgUmVzdWx0IGlzIHJldHVybmVkIGFzeW5jaHJvbm91c2x5IHZpYSBhCi0gKiBjYWxsYmFjayBmdW5jdGlvbi4KKy8qKgorICogaW5pdGlhdGVfY2hpcHNldF9kZXZpY2VfcGF1c2VfcmVzdW1lKCkgLSBzdGFydCBhIHBhdXNlIG9yIHJlc3VtZSBvcGVyYXRpb24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGEgdmlzb3IgZGV2aWNlCisgKiBAZGV2OiBzdHJ1Y3Qgdmlzb3JfZGV2aWNlIGlkZW50aWZ5aW5nIHRoZSBkZXZpY2UgYmVpbmcgcGF1c2VkIG9yIHJlc3VtZWQKKyAqIEBpc19wYXVzZTogdHJ1ZSB0byBpbmRpY2F0ZSBwYXVzZSBvcGVyYXRpb24sIGZhbHNlIHRvIGluZGljYXRlIHJlc3VtZQorICoKKyAqIFRlbGwgdGhlIHN1Ym9yZGluYXRlIGZ1bmN0aW9uIGRyaXZlciBmb3IgYSBzcGVjaWZpYyBkZXZpY2UgdG8gcGF1c2UKKyAqIG9yIHJlc3VtZSB0aGF0IGRldmljZS4gIFN1Y2Nlc3MvZmFpbHVyZSByZXN1bHQgaXMgcmV0dXJuZWQgYXN5bmNocm9ub3VzbHkKKyAqIHZpYSBhIGNhbGxiYWNrIGZ1bmN0aW9uOyBzZWUgcGF1c2Vfc3RhdGVfY2hhbmdlX2NvbXBsZXRlKCkgYW5kCisgKiByZXN1bWVfc3RhdGVfY2hhbmdlX2NvbXBsZXRlKCkuCiAgKi8KIHN0YXRpYyB2b2lkCiBpbml0aWF0ZV9jaGlwc2V0X2RldmljZV9wYXVzZV9yZXN1bWUoc3RydWN0IHZpc29yX2RldmljZSAqZGV2LCBib29sIGlzX3BhdXNlKQpAQCAtMTE4OSw5ICsxMTgzLDkgQEAKIAl2b2lkICgqbm90aWZ5X2Z1bmMpKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldiwgaW50IHJlc3BvbnNlKSA9IE5VTEw7CiAKIAlpZiAoaXNfcGF1c2UpCi0JCW5vdGlmeV9mdW5jID0gY2hpcHNldF9yZXNwb25kZXJzLmRldmljZV9wYXVzZTsKKwkJbm90aWZ5X2Z1bmMgPSBkZXZpY2VfcGF1c2VfcmVzcG9uc2U7CiAJZWxzZQotCQlub3RpZnlfZnVuYyA9IGNoaXBzZXRfcmVzcG9uZGVycy5kZXZpY2VfcmVzdW1lOworCQlub3RpZnlfZnVuYyA9IGRldmljZV9yZXN1bWVfcmVzcG9uc2U7CiAJaWYgKCFub3RpZnlfZnVuYykKIAkJcmV0dXJuOwogCkBAIC0xMjA2LDcgKzEyMDAsOCBAQAogCQlyZXR1cm47CiAJfQogCi0JLyogTm90ZSB0aGF0IGV2ZW4gdGhvdWdoIGJvdGggZHJ2LT5wYXVzZSgpIGFuZCBkcnYtPnJlc3VtZQorCS8qCisJICogTm90ZSB0aGF0IGV2ZW4gdGhvdWdoIGJvdGggZHJ2LT5wYXVzZSgpIGFuZCBkcnYtPnJlc3VtZQogCSAqIHNwZWNpZnkgYSBjYWxsYmFjayBmdW5jdGlvbiwgaXQgaXMgTk9UIG5lY2Vzc2FyeSBmb3IgdXMgdG8KIAkgKiBpbmNyZW1lbnQgb3VyIGxvY2FsIG1vZHVsZSB1c2FnZSBjb3VudC4gIFJlYXNvbiBpcywgdGhlcmUKIAkgKiBpcyBhbHJlYWR5IGEgbGlua2FnZSBkZXBlbmRlbmN5IGJldHdlZW4gY2hpbGQgZnVuY3Rpb24KQEAgLTEyNDYsMzMgKzEyNDEsNDEgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkCisvKioKKyAqIGNoaXBzZXRfZGV2aWNlX3BhdXNlKCkgLSBzdGFydCBhIHBhdXNlIG9wZXJhdGlvbiBmb3IgYSB2aXNvciBkZXZpY2UKKyAqIEBkZXZfaW5mbzogc3RydWN0IHZpc29yX2RldmljZSBpZGVudGlmeWluZyB0aGUgZGV2aWNlIGJlaW5nIHBhdXNlZAorICoKKyAqIFRlbGwgdGhlIHN1Ym9yZGluYXRlIGZ1bmN0aW9uIGRyaXZlciBmb3IgYSBzcGVjaWZpYyBkZXZpY2UgdG8gcGF1c2UKKyAqIHRoYXQgZGV2aWNlLiAgU3VjY2Vzcy9mYWlsdXJlIHJlc3VsdCBpcyByZXR1cm5lZCBhc3luY2hyb25vdXNseQorICogdmlhIGEgY2FsbGJhY2sgZnVuY3Rpb247IHNlZSBwYXVzZV9zdGF0ZV9jaGFuZ2VfY29tcGxldGUoKS4KKyAqLwordm9pZAogY2hpcHNldF9kZXZpY2VfcGF1c2Uoc3RydWN0IHZpc29yX2RldmljZSAqZGV2X2luZm8pCiB7CiAJaW5pdGlhdGVfY2hpcHNldF9kZXZpY2VfcGF1c2VfcmVzdW1lKGRldl9pbmZvLCB0cnVlKTsKIH0KIAotc3RhdGljIHZvaWQKKy8qKgorICogY2hpcHNldF9kZXZpY2VfcmVzdW1lKCkgLSBzdGFydCBhIHJlc3VtZSBvcGVyYXRpb24gZm9yIGEgdmlzb3IgZGV2aWNlCisgKiBAZGV2X2luZm86IHN0cnVjdCB2aXNvcl9kZXZpY2UgaWRlbnRpZnlpbmcgdGhlIGRldmljZSBiZWluZyByZXN1bWVkCisgKgorICogVGVsbCB0aGUgc3Vib3JkaW5hdGUgZnVuY3Rpb24gZHJpdmVyIGZvciBhIHNwZWNpZmljIGRldmljZSB0byByZXN1bWUKKyAqIHRoYXQgZGV2aWNlLiAgU3VjY2Vzcy9mYWlsdXJlIHJlc3VsdCBpcyByZXR1cm5lZCBhc3luY2hyb25vdXNseQorICogdmlhIGEgY2FsbGJhY2sgZnVuY3Rpb247IHNlZSByZXN1bWVfc3RhdGVfY2hhbmdlX2NvbXBsZXRlKCkuCisgKi8KK3ZvaWQKIGNoaXBzZXRfZGV2aWNlX3Jlc3VtZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXZfaW5mbykKIHsKIAlpbml0aWF0ZV9jaGlwc2V0X2RldmljZV9wYXVzZV9yZXN1bWUoZGV2X2luZm8sIGZhbHNlKTsKIH0KIAotc3RydWN0IGNoYW5uZWxfc2l6ZV9pbmZvIHsKLQl1dWlkX2xlIGd1aWQ7Ci0JdW5zaWduZWQgbG9uZyBtaW5fc2l6ZTsKLQl1bnNpZ25lZCBsb25nIG1heF9zaXplOwotfTsKLQogaW50CiB2aXNvcmJ1c19pbml0KHZvaWQpCiB7CiAJaW50IGVycjsKIAogCVBPU1RDT0RFX0xJTlVYXzMoRFJJVkVSX0VOVFJZX1BDLCAwLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKLQlidXNfZGV2aWNlX2luZm9faW5pdCgmY2xpZW50YnVzX2RyaXZlcmluZm8sCi0JCQkgICAgICJjbGllbnRidXMiLCAidmlzb3JidXMiLAotCQkJICAgICBWRVJTSU9OLCBOVUxMKTsKKwlidXNfZGV2aWNlX2luZm9faW5pdCgmY2xpZW50YnVzX2RyaXZlcmluZm8sICJjbGllbnRidXMiLCAidmlzb3JidXMiKTsKIAogCWVyciA9IGNyZWF0ZV9idXNfdHlwZSgpOwogCWlmIChlcnIgPCAwKSB7CkBAIC0xMjgwLDE5ICsxMjgzLDcgQEAKIAkJZ290byBlcnJvcjsKIAl9CiAKLQlwZXJpb2RpY19kZXZfd29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoInZpc29yYnVzX2RldiIpOwotCWlmICghcGVyaW9kaWNfZGV2X3dvcmtxdWV1ZSkgewotCQlQT1NUQ09ERV9MSU5VWF8yKENSRUFURV9XT1JLUVVFVUVfUEMsIERJQUdfU0VWRVJJVFlfRVJSKTsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQkvKiBUaGlzIGVuYWJsZXMgdXMgdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIHdoZW4gZGV2aWNlcyBhcHBlYXIgZm9yCi0JICogd2hpY2ggdGhpcyBzZXJ2aWNlIHBhcnRpdGlvbiBpcyB0byBiZSBhIHNlcnZlciBmb3IuCi0JICovCi0Jdmlzb3JjaGlwc2V0X3JlZ2lzdGVyX2J1c2RldigmY2hpcHNldF9ub3RpZmllcnMsCi0JCQkJICAgICAmY2hpcHNldF9yZXNwb25kZXJzLAotCQkJCSAgICAgJmNoaXBzZXRfZHJpdmVyaW5mbyk7CisJYnVzX2RldmljZV9pbmZvX2luaXQoJmNoaXBzZXRfZHJpdmVyaW5mbywgImNoaXBzZXQiLCAidmlzb3JjaGlwc2V0Iik7CiAKIAlyZXR1cm4gMDsKIApAQCAtMTMwNiwyMCArMTI5Nyw4IEBACiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqbGlzdGVudHJ5LCAqbGlzdHRtcDsKIAotCXZpc29yY2hpcHNldF9yZWdpc3Rlcl9idXNkZXYoTlVMTCwgTlVMTCwgTlVMTCk7CiAJcmVtb3ZlX2FsbF92aXNvcl9kZXZpY2VzKCk7CiAKLQlmbHVzaF93b3JrcXVldWUocGVyaW9kaWNfZGV2X3dvcmtxdWV1ZSk7IC8qIGJldHRlciBub3QgYmUgYW55IHdvcmshICovCi0JZGVzdHJveV93b3JrcXVldWUocGVyaW9kaWNfZGV2X3dvcmtxdWV1ZSk7Ci0JcGVyaW9kaWNfZGV2X3dvcmtxdWV1ZSA9IE5VTEw7Ci0KLQlpZiAocGVyaW9kaWNfdGVzdF93b3JrcXVldWUpIHsKLQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcGVyaW9kaWNfd29yayk7Ci0JCWZsdXNoX3dvcmtxdWV1ZShwZXJpb2RpY190ZXN0X3dvcmtxdWV1ZSk7Ci0JCWRlc3Ryb3lfd29ya3F1ZXVlKHBlcmlvZGljX3Rlc3Rfd29ya3F1ZXVlKTsKLQkJcGVyaW9kaWNfdGVzdF93b3JrcXVldWUgPSBOVUxMOwotCX0KLQogCWxpc3RfZm9yX2VhY2hfc2FmZShsaXN0ZW50cnksIGxpc3R0bXAsICZsaXN0X2FsbF9idXNfaW5zdGFuY2VzKSB7CiAJCXN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldiA9IGxpc3RfZW50cnkobGlzdGVudHJ5LAogCQkJCQkJICAgICAgc3RydWN0IHZpc29yX2RldmljZSwKQEAgLTEzMjksOSArMTMwOCw2IEBACiAJcmVtb3ZlX2J1c190eXBlKCk7CiB9CiAKLW1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1Zywgdmlzb3JidXNfZGVidWcsIGludCwgU19JUlVHTyk7Ci1NT0RVTEVfUEFSTV9ERVNDKHZpc29yYnVzX2RlYnVnLCAiMSB0byBkZWJ1ZyIpOwotCiBtb2R1bGVfcGFyYW1fbmFtZWQoZm9yY2VtYXRjaCwgdmlzb3JidXNfZm9yY2VtYXRjaCwgaW50LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0Modmlzb3JidXNfZm9yY2VtYXRjaCwKIAkJICIxIHRvIGZvcmNlIGEgc3VjY2Vzc2Z1bCBkZXYgPC0tPiBkcnYgbWF0Y2giKTsKQEAgLTEzMzksNiArMTMxNSwzIEBACiBtb2R1bGVfcGFyYW1fbmFtZWQoZm9yY2Vub21hdGNoLCB2aXNvcmJ1c19mb3JjZW5vbWF0Y2gsIGludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKHZpc29yYnVzX2ZvcmNlbm9tYXRjaCwKIAkJICIxIHRvIGZvcmNlIGFuIFVOc3VjY2Vzc2Z1bCBkZXYgPC0tPiBkcnYgbWF0Y2giKTsKLQotbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVncmVmLCB2aXNvcmJ1c19kZWJ1Z3JlZiwgaW50LCBTX0lSVUdPKTsKLU1PRFVMRV9QQVJNX0RFU0Modmlzb3JidXNfZGVidWdyZWYsICIxIHRvIGRlYnVnIHJlZmVyZW5jZSBjb3VudGluZyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy92aXNvcmJ1c19wcml2YXRlLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3Zpc29yYnVzX3ByaXZhdGUuaAppbmRleCAzOWVkZDIwLi4xNTQwM2ZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3Zpc29yYnVzX3ByaXZhdGUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3Zpc29yYnVzX3ByaXZhdGUuaApAQCAtMSw0ICsxLDQgQEAKLS8qIHZpc29yY2hpcHNldC5oCisvKiB2aXNvcmJ1c19wcml2YXRlLmgKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTAgLSAyMDE1IFVOSVNZUyBDT1JQT1JBVElPTgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KQEAgLTE0LDU1ICsxNCw3MiBAQAogICogZGV0YWlscy4KICAqLwogCi0jaWZuZGVmIF9fVklTT1JDSElQU0VUX0hfXwotI2RlZmluZSBfX1ZJU09SQ0hJUFNFVF9IX18KKyNpZm5kZWYgX19WSVNPUkJVU19QUklWQVRFX0hfXworI2RlZmluZSBfX1ZJU09SQlVTX1BSSVZBVEVfSF9fCiAKICNpbmNsdWRlIDxsaW51eC91dWlkLmg+CisjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogCiAjaW5jbHVkZSAiY29udHJvbHZtY2hhbm5lbC5oIgotI2luY2x1ZGUgInZidXNkZXZpY2VpbmZvLmgiCi0jaW5jbHVkZSAidmJ1c2hlbHBlci5oIgorI2luY2x1ZGUgInZidXNjaGFubmVsLmgiCiAKLS8qICBUaGVzZSBmdW5jdGlvbnMgd2lsbCBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdmlzb3JjaGlwc2V0IHdoZW4gY2VydGFpbgotICogIGV2ZW50cyBoYXBwZW4uICAoVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZXNlIGZ1bmN0aW9ucyBpcyBvdXRzaWRlIG9mCi0gKiAgdmlzb3JjaGlwc2V0LikKKy8qIFRBUkdFVF9IT1NUTkFNRSBzcGVjaWZpZWQgYXMgLURUQVJHRVRfSE9TVE5BTUU9XCJ0aGVuYW1lXCIgb24gdGhlCisgKiBjb21tYW5kIGxpbmUKICAqLwotc3RydWN0IHZpc29yY2hpcHNldF9idXNkZXZfbm90aWZpZXJzIHsKLQl2b2lkICgqYnVzX2NyZWF0ZSkoc3RydWN0IHZpc29yX2RldmljZSAqYnVzX2luZm8pOwotCXZvaWQgKCpidXNfZGVzdHJveSkoc3RydWN0IHZpc29yX2RldmljZSAqYnVzX2luZm8pOwotCXZvaWQgKCpkZXZpY2VfY3JlYXRlKShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpidXNfaW5mbyk7Ci0Jdm9pZCAoKmRldmljZV9kZXN0cm95KShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpidXNfaW5mbyk7Ci0Jdm9pZCAoKmRldmljZV9wYXVzZSkoc3RydWN0IHZpc29yX2RldmljZSAqYnVzX2luZm8pOwotCXZvaWQgKCpkZXZpY2VfcmVzdW1lKShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpidXNfaW5mbyk7Ci19OwogCi0vKiAgVGhlc2UgZnVuY3Rpb25zIGxpdmUgaW5zaWRlIHZpc29yY2hpcHNldCwgYW5kIHdpbGwgYmUgY2FsbGVkIHRvIGluZGljYXRlCi0gKiAgcmVzcG9uc2VzIHRvIHNwZWNpZmljIGV2ZW50cyAoYnkgY29kZSBvdXRzaWRlIG9mIHZpc29yY2hpcHNldCkuCi0gKiAgRm9yIG5vdywgdGhlIHZhbHVlIGZvciBlYWNoIHJlc3BvbnNlIGlzIHNpbXBseSBlaXRoZXI6Ci0gKiAgICAgICAwID0gaXQgd29ya2VkCi0gKiAgICAgIC0xID0gaXQgZmFpbGVkCi0gKi8KLXN0cnVjdCB2aXNvcmNoaXBzZXRfYnVzZGV2X3Jlc3BvbmRlcnMgewotCXZvaWQgKCpidXNfY3JlYXRlKShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpwLCBpbnQgcmVzcG9uc2UpOwotCXZvaWQgKCpidXNfZGVzdHJveSkoc3RydWN0IHZpc29yX2RldmljZSAqcCwgaW50IHJlc3BvbnNlKTsKLQl2b2lkICgqZGV2aWNlX2NyZWF0ZSkoc3RydWN0IHZpc29yX2RldmljZSAqcCwgaW50IHJlc3BvbnNlKTsKLQl2b2lkICgqZGV2aWNlX2Rlc3Ryb3kpKHN0cnVjdCB2aXNvcl9kZXZpY2UgKnAsIGludCByZXNwb25zZSk7Ci0Jdm9pZCAoKmRldmljZV9wYXVzZSkoc3RydWN0IHZpc29yX2RldmljZSAqcCwgaW50IHJlc3BvbnNlKTsKLQl2b2lkICgqZGV2aWNlX3Jlc3VtZSkoc3RydWN0IHZpc29yX2RldmljZSAqcCwgaW50IHJlc3BvbnNlKTsKLX07CitzdGF0aWMgaW5saW5lIHZvaWQgYnVzX2RldmljZV9pbmZvX2luaXQoCisJCXN0cnVjdCB1bHRyYV92YnVzX2RldmljZWluZm8gKmJ1c19kZXZpY2VfaW5mb19wdHIsCisJCWNvbnN0IGNoYXIgKmRldl90eXBlLCBjb25zdCBjaGFyICpkcnZfbmFtZSkKK3sKKwltZW1zZXQoYnVzX2RldmljZV9pbmZvX3B0ciwgMCwgc2l6ZW9mKHN0cnVjdCB1bHRyYV92YnVzX2RldmljZWluZm8pKTsKKwlzbnByaW50ZihidXNfZGV2aWNlX2luZm9fcHRyLT5kZXZ0eXBlLAorCQkgc2l6ZW9mKGJ1c19kZXZpY2VfaW5mb19wdHItPmRldnR5cGUpLAorCQkgIiVzIiwgKGRldl90eXBlKSA/IGRldl90eXBlIDogInVua25vd25UeXBlIik7CisJc25wcmludGYoYnVzX2RldmljZV9pbmZvX3B0ci0+ZHJ2bmFtZSwKKwkJIHNpemVvZihidXNfZGV2aWNlX2luZm9fcHRyLT5kcnZuYW1lKSwKKwkJICIlcyIsIChkcnZfbmFtZSkgPyBkcnZfbmFtZSA6ICJ1bmtub3duRHJpdmVyIik7CisJc25wcmludGYoYnVzX2RldmljZV9pbmZvX3B0ci0+aW5mb3N0cnMsCisJCSBzaXplb2YoYnVzX2RldmljZV9pbmZvX3B0ci0+aW5mb3N0cnMpLCAia2VybmVsIHZlci4gJXMiLAorCQkgdXRzbmFtZSgpLT5yZWxlYXNlKTsKK30KIAotLyoqIFJlZ2lzdGVyIGZ1bmN0aW9ucyAoaW4gdGhlIGJ1cyBkcml2ZXIpIHRvIGdldCBjYWxsZWQgYnkgdmlzb3JjaGlwc2V0Ci0gKiAgd2hlbmV2ZXIgYSBidXMgb3IgZGV2aWNlIGFwcGVhcnMgZm9yIHdoaWNoIHRoaXMgZ3Vlc3QgaXMgdG8gYmUgdGhlCi0gKiAgY2xpZW50IGZvci4gIHZpc29yY2hpcHNldCB3aWxsIGZpbGwgaW4gPHJlc3BvbmRlcnM+LCB0byBpbmRpY2F0ZQotICogIGZ1bmN0aW9ucyB0aGUgYnVzIGRyaXZlciBzaG91bGQgY2FsbCB0byBpbmRpY2F0ZSBtZXNzYWdlIHJlc3BvbnNlcy4KLSAqLwotdm9pZAotdmlzb3JjaGlwc2V0X3JlZ2lzdGVyX2J1c2RldigKLQkJCXN0cnVjdCB2aXNvcmNoaXBzZXRfYnVzZGV2X25vdGlmaWVycyAqbm90aWZpZXJzLAotCQkJc3RydWN0IHZpc29yY2hpcHNldF9idXNkZXZfcmVzcG9uZGVycyAqcmVzcG9uZGVycywKLQkJCXN0cnVjdCB1bHRyYV92YnVzX2RldmljZWluZm8gKmRyaXZlcl9pbmZvKTsKK3ZvaWQgY2hpcHNldF9idXNfY3JlYXRlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmJ1c19pbmZvKTsKK3ZvaWQgY2hpcHNldF9idXNfZGVzdHJveShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpidXNfaW5mbyk7Cit2b2lkIGNoaXBzZXRfZGV2aWNlX2NyZWF0ZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXZfaW5mbyk7Cit2b2lkIGNoaXBzZXRfZGV2aWNlX2Rlc3Ryb3koc3RydWN0IHZpc29yX2RldmljZSAqZGV2X2luZm8pOwordm9pZCBjaGlwc2V0X2RldmljZV9wYXVzZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXZfaW5mbyk7Cit2b2lkIGNoaXBzZXRfZGV2aWNlX3Jlc3VtZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXZfaW5mbyk7CiAKLS8qIHZpc29yYnVzIGluaXQgYW5kIGV4aXQgZnVuY3Rpb25zICovCit2b2lkIGJ1c19jcmVhdGVfcmVzcG9uc2Uoc3RydWN0IHZpc29yX2RldmljZSAqcCwgaW50IHJlc3BvbnNlKTsKK3ZvaWQgYnVzX2Rlc3Ryb3lfcmVzcG9uc2Uoc3RydWN0IHZpc29yX2RldmljZSAqcCwgaW50IHJlc3BvbnNlKTsKK3ZvaWQgZGV2aWNlX2NyZWF0ZV9yZXNwb25zZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpwLCBpbnQgcmVzcG9uc2UpOwordm9pZCBkZXZpY2VfZGVzdHJveV9yZXNwb25zZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpwLCBpbnQgcmVzcG9uc2UpOwordm9pZCBkZXZpY2VfcmVzdW1lX3Jlc3BvbnNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKnAsIGludCByZXNwb25zZSk7Cit2b2lkIGRldmljZV9wYXVzZV9yZXNwb25zZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpwLCBpbnQgcmVzcG9uc2UpOworCiBpbnQgdmlzb3JidXNfaW5pdCh2b2lkKTsKIHZvaWQgdmlzb3JidXNfZXhpdCh2b2lkKTsKKworLyogdmlzb3JjaGFubmVsIGFjY2VzcyBmdW5jdGlvbnMgKi8KKworc3RydWN0IHZpc29yY2hhbm5lbCAqdmlzb3JjaGFubmVsX2NyZWF0ZSh1NjQgcGh5c2FkZHIsCisJCQkJCSB1bnNpZ25lZCBsb25nIGNoYW5uZWxfYnl0ZXMsCisJCQkJCSBnZnBfdCBnZnAsIHV1aWRfbGUgZ3VpZCk7CitzdHJ1Y3Qgdmlzb3JjaGFubmVsICp2aXNvcmNoYW5uZWxfY3JlYXRlX3dpdGhfbG9jayh1NjQgcGh5c2FkZHIsCisJCQkJCQkgICB1bnNpZ25lZCBsb25nIGNoYW5uZWxfYnl0ZXMsCisJCQkJCQkgICBnZnBfdCBnZnAsIHV1aWRfbGUgZ3VpZCk7Cit2b2lkIHZpc29yY2hhbm5lbF9kZXN0cm95KHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwpOworaW50IHZpc29yY2hhbm5lbF9yZWFkKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHVsb25nIG9mZnNldCwKKwkJICAgICAgdm9pZCAqbG9jYWwsIHVsb25nIG5ieXRlcyk7CitpbnQgdmlzb3JjaGFubmVsX3dyaXRlKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHVsb25nIG9mZnNldCwKKwkJICAgICAgIHZvaWQgKmxvY2FsLCB1bG9uZyBuYnl0ZXMpOwordTY0IHZpc29yY2hhbm5lbF9nZXRfcGh5c2FkZHIoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCk7Cit1bG9uZyB2aXNvcmNoYW5uZWxfZ2V0X25ieXRlcyhzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKTsKK2NoYXIgKnZpc29yY2hhbm5lbF9pZChzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCBjaGFyICpzKTsKK2NoYXIgKnZpc29yY2hhbm5lbF96b25laWQoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgY2hhciAqcyk7Cit1NjQgdmlzb3JjaGFubmVsX2dldF9jbGllbnRwYXJ0aXRpb24oc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCk7CitpbnQgdmlzb3JjaGFubmVsX3NldF9jbGllbnRwYXJ0aXRpb24oc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwKKwkJCQkgICAgIHU2NCBwYXJ0aXRpb25faGFuZGxlKTsKK2NoYXIgKnZpc29yY2hhbm5lbF91dWlkX2lkKHV1aWRfbGUgKmd1aWQsIGNoYXIgKnMpOwordm9pZCBfX2lvbWVtICp2aXNvcmNoYW5uZWxfZ2V0X2hlYWRlcihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy92aXNvcmNoYW5uZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvdmlzb3JjaGFubmVsLmMKaW5kZXggNDMzNzM1OC4uMzAwYTY1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy92aXNvcmNoYW5uZWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3Zpc29yY2hhbm5lbC5jCkBAIC0xNSwxNCArMTUsMTMgQEAKICAqLwogCiAvKgotICogIFRoaXMgcHJvdmlkZXMgU3VwZXJ2aXNvciBjaGFubmVsIGNvbW11bmljYXRpb24gcHJpbWl0aXZlcywgd2hpY2ggYXJlCisgKiAgVGhpcyBwcm92aWRlcyBzLVBhciBjaGFubmVsIGNvbW11bmljYXRpb24gcHJpbWl0aXZlcywgd2hpY2ggYXJlCiAgKiAgaW5kZXBlbmRlbnQgb2YgdGhlIG1lY2hhbmlzbSB1c2VkIHRvIGFjY2VzcyB0aGUgY2hhbm5lbCBkYXRhLgogICovCiAKICNpbmNsdWRlIDxsaW51eC91dWlkLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIAotI2luY2x1ZGUgInZlcnNpb24uaCIKICNpbmNsdWRlICJ2aXNvcmJ1cy5oIgogI2luY2x1ZGUgImNvbnRyb2x2bWNoYW5uZWwuaCIKIApAQCAtNTUsMTMgKzU0LDM0MiBAQAogCXV1aWRfbGUgaW5zdDsKIH07CiAKLS8qIENyZWF0ZXMgdGhlIHN0cnVjdCB2aXNvcmNoYW5uZWwgYWJzdHJhY3Rpb24gZm9yIGEgZGF0YSBhcmVhIGluIG1lbW9yeSwKLSAqIGJ1dCBkb2VzIE5PVCBtb2RpZnkgdGhpcyBkYXRhIGFyZWEuCit2b2lkCit2aXNvcmNoYW5uZWxfZGVzdHJveShzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKQoreworCWlmICghY2hhbm5lbCkKKwkJcmV0dXJuOworCWlmIChjaGFubmVsLT5tYXBwZWQpIHsKKwkJbWVtdW5tYXAoY2hhbm5lbC0+bWFwcGVkKTsKKwkJaWYgKGNoYW5uZWwtPnJlcXVlc3RlZCkKKwkJCXJlbGVhc2VfbWVtX3JlZ2lvbihjaGFubmVsLT5waHlzYWRkciwgY2hhbm5lbC0+bmJ5dGVzKTsKKwl9CisJa2ZyZWUoY2hhbm5lbCk7Cit9CisKK3U2NAordmlzb3JjaGFubmVsX2dldF9waHlzYWRkcihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKQoreworCXJldHVybiBjaGFubmVsLT5waHlzYWRkcjsKK30KKwordWxvbmcKK3Zpc29yY2hhbm5lbF9nZXRfbmJ5dGVzKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwpCit7CisJcmV0dXJuIGNoYW5uZWwtPm5ieXRlczsKK30KKworY2hhciAqCit2aXNvcmNoYW5uZWxfdXVpZF9pZCh1dWlkX2xlICpndWlkLCBjaGFyICpzKQoreworCXNwcmludGYocywgIiVwVUwiLCBndWlkKTsKKwlyZXR1cm4gczsKK30KKworY2hhciAqCit2aXNvcmNoYW5uZWxfaWQoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgY2hhciAqcykKK3sKKwlyZXR1cm4gdmlzb3JjaGFubmVsX3V1aWRfaWQoJmNoYW5uZWwtPmd1aWQsIHMpOworfQorCitjaGFyICoKK3Zpc29yY2hhbm5lbF96b25laWQoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgY2hhciAqcykKK3sKKwlyZXR1cm4gdmlzb3JjaGFubmVsX3V1aWRfaWQoJmNoYW5uZWwtPmNoYW5faGRyLnpvbmVfdXVpZCwgcyk7Cit9CisKK3U2NAordmlzb3JjaGFubmVsX2dldF9jbGllbnRwYXJ0aXRpb24oc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlyZXR1cm4gY2hhbm5lbC0+Y2hhbl9oZHIucGFydGl0aW9uX2hhbmRsZTsKK30KKworaW50Cit2aXNvcmNoYW5uZWxfc2V0X2NsaWVudHBhcnRpdGlvbihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLAorCQkJCSB1NjQgcGFydGl0aW9uX2hhbmRsZSkKK3sKKwljaGFubmVsLT5jaGFuX2hkci5wYXJ0aXRpb25faGFuZGxlID0gcGFydGl0aW9uX2hhbmRsZTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB2aXNvcmNoYW5uZWxfZ2V0X3V1aWQoKSAtIHF1ZXJpZXMgdGhlIFVVSUQgb2YgdGhlIGRlc2lnbmF0ZWQgY2hhbm5lbAorICogQGNoYW5uZWw6IHRoZSBjaGFubmVsIHRvIHF1ZXJ5CisgKgorICogUmV0dXJuOiB0aGUgVVVJRCBvZiB0aGUgcHJvdmlkZWQgY2hhbm5lbAorICovCit1dWlkX2xlCit2aXNvcmNoYW5uZWxfZ2V0X3V1aWQoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlyZXR1cm4gY2hhbm5lbC0+Z3VpZDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9nZXRfdXVpZCk7CisKK2ludAordmlzb3JjaGFubmVsX3JlYWQoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdWxvbmcgb2Zmc2V0LAorCQkgIHZvaWQgKmxvY2FsLCB1bG9uZyBuYnl0ZXMpCit7CisJaWYgKG9mZnNldCArIG5ieXRlcyA+IGNoYW5uZWwtPm5ieXRlcykKKwkJcmV0dXJuIC1FSU87CisKKwltZW1jcHkobG9jYWwsIGNoYW5uZWwtPm1hcHBlZCArIG9mZnNldCwgbmJ5dGVzKTsKKworCXJldHVybiAwOworfQorCitpbnQKK3Zpc29yY2hhbm5lbF93cml0ZShzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1bG9uZyBvZmZzZXQsCisJCSAgIHZvaWQgKmxvY2FsLCB1bG9uZyBuYnl0ZXMpCit7CisJc2l6ZV90IGNoZHJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY2hhbm5lbF9oZWFkZXIpOworCXNpemVfdCBjb3B5X3NpemU7CisKKwlpZiAob2Zmc2V0ICsgbmJ5dGVzID4gY2hhbm5lbC0+bmJ5dGVzKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChvZmZzZXQgPCBjaGRyX3NpemUpIHsKKwkJY29weV9zaXplID0gbWluKGNoZHJfc2l6ZSAtIG9mZnNldCwgbmJ5dGVzKTsKKwkJbWVtY3B5KCgoY2hhciAqKSgmY2hhbm5lbC0+Y2hhbl9oZHIpKSArIG9mZnNldCwKKwkJICAgICAgIGxvY2FsLCBjb3B5X3NpemUpOworCX0KKworCW1lbWNweShjaGFubmVsLT5tYXBwZWQgKyBvZmZzZXQsIGxvY2FsLCBuYnl0ZXMpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19pb21lbSAgKgordmlzb3JjaGFubmVsX2dldF9oZWFkZXIoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlyZXR1cm4gKHZvaWQgX19pb21lbSAqKSZjaGFubmVsLT5jaGFuX2hkcjsKK30KKworLyoKKyAqIFJldHVybiBvZmZzZXQgb2YgYSBzcGVjaWZpYyBTSUdOQUxfUVVFVUVfSEVBREVSIGZyb20gdGhlIGJlZ2lubmluZyBvZiBhCisgKiBjaGFubmVsIGhlYWRlcgorICovCisjZGVmaW5lIFNJR19RVUVVRV9PRkZTRVQoY2hhbl9oZHIsIHEpIFwKKwkoKGNoYW5faGRyKS0+Y2hfc3BhY2Vfb2Zmc2V0ICsgXAorCSAoKHEpICogc2l6ZW9mKHN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyKSkpCisKKy8qCisgKiBSZXR1cm4gb2Zmc2V0IG9mIGEgc3BlY2lmaWMgcXVldWUgZW50cnkgKGRhdGEpIGZyb20gdGhlIGJlZ2lubmluZyBvZiBhCisgKiBjaGFubmVsIGhlYWRlcgorICovCisjZGVmaW5lIFNJR19EQVRBX09GRlNFVChjaGFuX2hkciwgcSwgc2lnX2hkciwgc2xvdCkgXAorCShTSUdfUVVFVUVfT0ZGU0VUKGNoYW5faGRyLCBxKSArIChzaWdfaGRyKS0+c2lnX2Jhc2Vfb2Zmc2V0ICsgXAorCSAgICAoKHNsb3QpICogKHNpZ19oZHIpLT5zaWduYWxfc2l6ZSkpCisKKy8qCisgKiBXcml0ZSB0aGUgY29udGVudHMgb2YgYSBzcGVjaWZpYyBmaWVsZCB3aXRoaW4gYSBTSUdOQUxfUVVFVUVfSEVBREVSIGJhY2sKKyAqIGludG8gaG9zdCBtZW1vcnkKKyAqLworI2RlZmluZSBTSUdfV1JJVEVfRklFTEQoY2hhbm5lbCwgcXVldWUsIHNpZ19oZHIsIEZJRUxEKQkJCSBcCisJdmlzb3JjaGFubmVsX3dyaXRlKGNoYW5uZWwsCQkJCQkgXAorCQkJICAgU0lHX1FVRVVFX09GRlNFVCgmY2hhbm5lbC0+Y2hhbl9oZHIsIHF1ZXVlKSArXAorCQkJICAgb2Zmc2V0b2Yoc3RydWN0IHNpZ25hbF9xdWV1ZV9oZWFkZXIsIEZJRUxEKSwgXAorCQkJICAgJigoc2lnX2hkciktPkZJRUxEKSwJCQkgXAorCQkJICAgc2l6ZW9mKChzaWdfaGRyKS0+RklFTEQpKQorCitzdGF0aWMgaW50CitzaWdfcmVhZF9oZWFkZXIoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlLAorCQlzdHJ1Y3Qgc2lnbmFsX3F1ZXVlX2hlYWRlciAqc2lnX2hkcikKK3sKKwlpZiAoY2hhbm5lbC0+Y2hhbl9oZHIuY2hfc3BhY2Vfb2Zmc2V0IDwgc2l6ZW9mKHN0cnVjdCBjaGFubmVsX2hlYWRlcikpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogUmVhZCB0aGUgYXBwcm9wcmlhdGUgU0lHTkFMX1FVRVVFX0hFQURFUiBpbnRvIGxvY2FsIG1lbW9yeS4gKi8KKwlyZXR1cm4gdmlzb3JjaGFubmVsX3JlYWQoY2hhbm5lbCwKKwkJCQkgU0lHX1FVRVVFX09GRlNFVCgmY2hhbm5lbC0+Y2hhbl9oZHIsIHF1ZXVlKSwKKwkJCQkgc2lnX2hkciwgc2l6ZW9mKHN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitzaWdfcmVhZF9kYXRhKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHUzMiBxdWV1ZSwKKwkgICAgICBzdHJ1Y3Qgc2lnbmFsX3F1ZXVlX2hlYWRlciAqc2lnX2hkciwgdTMyIHNsb3QsIHZvaWQgKmRhdGEpCit7CisJaW50IHNpZ25hbF9kYXRhX29mZnNldCA9IFNJR19EQVRBX09GRlNFVCgmY2hhbm5lbC0+Y2hhbl9oZHIsIHF1ZXVlLAorCQkJCQkJIHNpZ19oZHIsIHNsb3QpOworCisJcmV0dXJuIHZpc29yY2hhbm5lbF9yZWFkKGNoYW5uZWwsIHNpZ25hbF9kYXRhX29mZnNldCwKKwkJCQkgZGF0YSwgc2lnX2hkci0+c2lnbmFsX3NpemUpOworfQorCitzdGF0aWMgaW5saW5lIGludAorc2lnX3dyaXRlX2RhdGEoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlLAorCSAgICAgICBzdHJ1Y3Qgc2lnbmFsX3F1ZXVlX2hlYWRlciAqc2lnX2hkciwgdTMyIHNsb3QsIHZvaWQgKmRhdGEpCit7CisJaW50IHNpZ25hbF9kYXRhX29mZnNldCA9IFNJR19EQVRBX09GRlNFVCgmY2hhbm5lbC0+Y2hhbl9oZHIsIHF1ZXVlLAorCQkJCQkJIHNpZ19oZHIsIHNsb3QpOworCisJcmV0dXJuIHZpc29yY2hhbm5lbF93cml0ZShjaGFubmVsLCBzaWduYWxfZGF0YV9vZmZzZXQsCisJCQkJICBkYXRhLCBzaWdfaGRyLT5zaWduYWxfc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQKK3NpZ25hbHJlbW92ZV9pbm5lcihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1MzIgcXVldWUsIHZvaWQgKm1zZykKK3sKKwlzdHJ1Y3Qgc2lnbmFsX3F1ZXVlX2hlYWRlciBzaWdfaGRyOworCWludCBlcnJvcjsKKworCWVycm9yID0gc2lnX3JlYWRfaGVhZGVyKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkcik7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlpZiAoc2lnX2hkci5oZWFkID09IHNpZ19oZHIudGFpbCkKKwkJcmV0dXJuIC1FSU87CS8qIG5vIHNpZ25hbHMgdG8gcmVtb3ZlICovCisKKwlzaWdfaGRyLnRhaWwgPSAoc2lnX2hkci50YWlsICsgMSkgJSBzaWdfaGRyLm1heF9zbG90czsKKworCWVycm9yID0gc2lnX3JlYWRfZGF0YShjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIHNpZ19oZHIudGFpbCwgbXNnKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXNpZ19oZHIubnVtX3JlY2VpdmVkKys7CisKKwkvKgorCSAqIEZvciBlYWNoIGRhdGEgZmllbGQgaW4gU0lHTkFMX1FVRVVFX0hFQURFUiB0aGF0IHdhcyBtb2RpZmllZCwKKwkgKiB1cGRhdGUgaG9zdCBtZW1vcnkuCisJICovCisJbWIoKTsgLyogcmVxdWlyZWQgZm9yIGNoYW5uZWwgc3luY2ggKi8KKworCWVycm9yID0gU0lHX1dSSVRFX0ZJRUxEKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgdGFpbCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJZXJyb3IgPSBTSUdfV1JJVEVfRklFTEQoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCBudW1fcmVjZWl2ZWQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdmlzb3JjaGFubmVsX3NpZ25hbHJlbW92ZSgpIC0gcmVtb3ZlcyBhIG1lc3NhZ2UgZnJvbSB0aGUgZGVzaWduYXRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC9xdWV1ZQorICogQGNoYW5uZWw6IHRoZSBjaGFubmVsIHRoZSBtZXNzYWdlIHdpbGwgYmUgcmVtb3ZlZCBmcm9tCisgKiBAcXVldWU6ICAgdGhlIHF1ZXVlIHRoZSBtZXNzYWdlIHdpbGwgYmUgcmVtb3ZlZCBmcm9tCisgKiBAbXNnOiAgICAgdGhlIG1lc3NhZ2UgdG8gcmVtb3ZlCisgKgorICogUmV0dXJuOiBpbnRlZ2VyIGVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGUgc3RhdHVzIG9mIHRoZSByZW1vdmFsCisgKi8KK2ludAordmlzb3JjaGFubmVsX3NpZ25hbHJlbW92ZShzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1MzIgcXVldWUsIHZvaWQgKm1zZykKK3sKKwlpbnQgcmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChjaGFubmVsLT5uZWVkc19sb2NrKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFubmVsLT5yZW1vdmVfbG9jaywgZmxhZ3MpOworCQlyYyA9IHNpZ25hbHJlbW92ZV9pbm5lcihjaGFubmVsLCBxdWV1ZSwgbXNnKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbm5lbC0+cmVtb3ZlX2xvY2ssIGZsYWdzKTsKKwl9IGVsc2UgeworCQlyYyA9IHNpZ25hbHJlbW92ZV9pbm5lcihjaGFubmVsLCBxdWV1ZSwgbXNnKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKTsKKworLyoqCisgKiB2aXNvcmNoYW5uZWxfc2lnbmFsZW1wdHkoKSAtIGNoZWNrcyBpZiB0aGUgZGVzaWduYXRlZCBjaGFubmVsL3F1ZXVlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIGFueSBtZXNzYWdlcworICogQGNoYW5uZWw6IHRoZSBjaGFubmVsIHRvIHF1ZXJ5CisgKiBAcXVldWU6ICAgdGhlIHF1ZXVlIGluIHRoZSBjaGFubmVsIHRvIHF1ZXJ5CisgKgorICogUmV0dXJuOiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBhbnkgbWVzc2FnZXMgaW4gdGhlIGRlc2lnbmF0ZWQKKyAqICAgICAgICAgY2hhbm5lbC9xdWV1ZSBhcmUgcHJlc2VudAorICovCitib29sCit2aXNvcmNoYW5uZWxfc2lnbmFsZW1wdHkoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyIHNpZ19oZHI7CisJYm9vbCByYyA9IGZhbHNlOworCisJaWYgKGNoYW5uZWwtPm5lZWRzX2xvY2spCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFubmVsLT5yZW1vdmVfbG9jaywgZmxhZ3MpOworCisJaWYgKHNpZ19yZWFkX2hlYWRlcihjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIpKQorCQlyYyA9IHRydWU7CisJaWYgKHNpZ19oZHIuaGVhZCA9PSBzaWdfaGRyLnRhaWwpCisJCXJjID0gdHJ1ZTsKKwlpZiAoY2hhbm5lbC0+bmVlZHNfbG9jaykKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbm5lbC0+cmVtb3ZlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9zaWduYWxlbXB0eSk7CisKK3N0YXRpYyBpbnQKK3NpZ25hbGluc2VydF9pbm5lcihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1MzIgcXVldWUsIHZvaWQgKm1zZykKK3sKKwlzdHJ1Y3Qgc2lnbmFsX3F1ZXVlX2hlYWRlciBzaWdfaGRyOworCWludCBlcnJvcjsKKworCWVycm9yID0gc2lnX3JlYWRfaGVhZGVyKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkcik7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlzaWdfaGRyLmhlYWQgPSAoc2lnX2hkci5oZWFkICsgMSkgJSBzaWdfaGRyLm1heF9zbG90czsKKwlpZiAoc2lnX2hkci5oZWFkID09IHNpZ19oZHIudGFpbCkgeworCQlzaWdfaGRyLm51bV9vdmVyZmxvd3MrKzsKKwkJdmlzb3JjaGFubmVsX3dyaXRlKGNoYW5uZWwsCisJCQkJICAgU0lHX1FVRVVFX09GRlNFVCgmY2hhbm5lbC0+Y2hhbl9oZHIsIHF1ZXVlKSArCisJCQkJICAgb2Zmc2V0b2Yoc3RydWN0IHNpZ25hbF9xdWV1ZV9oZWFkZXIsCisJCQkJCSAgICBudW1fb3ZlcmZsb3dzKSwKKwkJCQkgICAmc2lnX2hkci5udW1fb3ZlcmZsb3dzLAorCQkJCSAgIHNpemVvZihzaWdfaGRyLm51bV9vdmVyZmxvd3MpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZXJyb3IgPSBzaWdfd3JpdGVfZGF0YShjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIHNpZ19oZHIuaGVhZCwgbXNnKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXNpZ19oZHIubnVtX3NlbnQrKzsKKworCS8qCisJICogRm9yIGVhY2ggZGF0YSBmaWVsZCBpbiBTSUdOQUxfUVVFVUVfSEVBREVSIHRoYXQgd2FzIG1vZGlmaWVkLAorCSAqIHVwZGF0ZSBob3N0IG1lbW9yeS4KKwkgKi8KKwltYigpOyAvKiByZXF1aXJlZCBmb3IgY2hhbm5lbCBzeW5jaCAqLworCisJZXJyb3IgPSBTSUdfV1JJVEVfRklFTEQoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCBoZWFkKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwllcnJvciA9IFNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIG51bV9zZW50KTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHZpc29yY2hhbm5lbF9jcmVhdGVfZ3V0cygpIC0gY3JlYXRlcyB0aGUgc3RydWN0IHZpc29yY2hhbm5lbCBhYnN0cmFjdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYSBkYXRhIGFyZWEgaW4gbWVtb3J5LCBidXQgZG9lcyBOT1QgbW9kaWZ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZGF0YSBhcmVhCisgKiBAcGh5c2FkZHI6ICAgICAgcGh5c2ljYWwgYWRkcmVzcyBvZiBzdGFydCBvZiBjaGFubmVsCisgKiBAY2hhbm5lbF9ieXRlczogc2l6ZSBvZiB0aGUgY2hhbm5lbCBpbiBieXRlczsgdGhpcyBtYXkgMCBpZiB0aGUgY2hhbm5lbCBoYXMKKyAqICAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgaW4gbWVtb3J5ICh3aGljaCBpcyB0cnVlIGZvciBhbGwKKyAqICAgICAgICAgICAgICAgICBjaGFubmVscyBwcm92aWRlZCB0byBndWVzdCBlbnZpcm9ubWVudHMgYnkgdGhlIHMtUGFyCisgKiAgICAgICAgICAgICAgICAgYmFjay1lbmQpLCBpbiB3aGljaCBjYXNlIHRoZSBhY3R1YWwgY2hhbm5lbCBzaXplIHdpbGwgYmUKKyAqICAgICAgICAgICAgICAgICByZWFkIGZyb20gdGhlIGNoYW5uZWwgaGVhZGVyIGluIG1lbW9yeQorICogQGdmcDogICAgICAgICAgIGdmcF90IHRvIHVzZSB3aGVuIGFsbG9jYXRpbmcgbWVtb3J5IGZvciB0aGUgZGF0YSBzdHJ1Y3QKKyAqIEBndWlkOiAgICAgICAgICB1dWlkIHRoYXQgaWRlbnRpZmllcyBjaGFubmVsIHR5cGU7IHRoaXMgbWF5IDAgaWYgdGhlIGNoYW5uZWwKKyAqICAgICAgICAgICAgICAgICBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIGluIG1lbW9yeSAod2hpY2ggaXMgdHJ1ZSBmb3IgYWxsCisgKiAgICAgICAgICAgICAgICAgY2hhbm5lbHMgcHJvdmlkZWQgdG8gZ3Vlc3QgZW52aXJvbm1lbnRzIGJ5IHRoZSBzLVBhcgorICogICAgICAgICAgICAgICAgIGJhY2stZW5kKSwgaW4gd2hpY2ggY2FzZSB0aGUgYWN0dWFsIGNoYW5uZWwgZ3VpZCB3aWxsIGJlCisgKiAgICAgICAgICAgICAgICAgcmVhZCBmcm9tIHRoZSBjaGFubmVsIGhlYWRlciBpbiBtZW1vcnkKKyAqIEBuZWVkc19sb2NrOiAgICBtdXN0IHNwZWNpZnkgdHJ1ZSBpZiB5b3UgaGF2ZSBtdWx0aXBsZSB0aHJlYWRzIG9mIGV4ZWN1dGlvbgorICogICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBjYWxsaW5nIHZpc29yY2hhbm5lbCBtZXRob2RzIG9mIHRoaXMKKyAqICAgICAgICAgICAgICAgICB2aXNvcmNoYW5uZWwgYXQgdGhlIHNhbWUgdGltZQorICoKKyAqIFJldHVybjogcG9pbnRlciB0byB2aXNvcmNoYW5uZWwgdGhhdCB3YXMgY3JlYXRlZCBpZiBzdWNjZXNzZnVsLAorICogICAgICAgICBvdGhlcndpc2UgTlVMTAogICovCiBzdGF0aWMgc3RydWN0IHZpc29yY2hhbm5lbCAqCiB2aXNvcmNoYW5uZWxfY3JlYXRlX2d1dHModTY0IHBoeXNhZGRyLCB1bnNpZ25lZCBsb25nIGNoYW5uZWxfYnl0ZXMsCi0JCQkgZ2ZwX3QgZ2ZwLCB1bnNpZ25lZCBsb25nIG9mZiwKLQkJCSB1dWlkX2xlIGd1aWQsIGJvb2wgbmVlZHNfbG9jaykKKwkJCSBnZnBfdCBnZnAsIHV1aWRfbGUgZ3VpZCwgYm9vbCBuZWVkc19sb2NrKQogewogCXN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWw7CiAJaW50IGVycjsKQEAgLTc4LDcgKzQwNiw4IEBACiAJc3Bpbl9sb2NrX2luaXQoJmNoYW5uZWwtPmluc2VydF9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmY2hhbm5lbC0+cmVtb3ZlX2xvY2spOwogCi0JLyogVmlkZW8gZHJpdmVyIGNvbnN0YWlucyB0aGUgZWZpIGZyYW1lYnVmZmVyIHNvIGl0IHdpbGwgZ2V0IGEKKwkvKgorCSAqIFZpZGVvIGRyaXZlciBjb25zdGFpbnMgdGhlIGVmaSBmcmFtZWJ1ZmZlciBzbyBpdCB3aWxsIGdldCBhCiAJICogY29uZmxpY3QgcmVzb3VyY2Ugd2hlbiByZXF1ZXN0aW5nIGl0cyBmdWxsIG1lbSByZWdpb24uIFNpbmNlCiAJICogd2UgYXJlIG9ubHkgdXNpbmcgdGhlIGVmaSBmcmFtZWJ1ZmZlciBmb3IgdmlkZW8gd2UgY2FuIGlnbm9yZQogCSAqIHRoaXMuIFJlbWVtYmVyIHRoYXQgd2UgaGF2ZW4ndCByZXF1ZXN0ZWQgaXQgc28gd2UgZG9uJ3QgdHJ5IHRvCkBAIC0xNDUsMzUyICs0NzQsMzEgQEAKIHZpc29yY2hhbm5lbF9jcmVhdGUodTY0IHBoeXNhZGRyLCB1bnNpZ25lZCBsb25nIGNoYW5uZWxfYnl0ZXMsCiAJCSAgICBnZnBfdCBnZnAsIHV1aWRfbGUgZ3VpZCkKIHsKLQlyZXR1cm4gdmlzb3JjaGFubmVsX2NyZWF0ZV9ndXRzKHBoeXNhZGRyLCBjaGFubmVsX2J5dGVzLCBnZnAsIDAsIGd1aWQsCisJcmV0dXJuIHZpc29yY2hhbm5lbF9jcmVhdGVfZ3V0cyhwaHlzYWRkciwgY2hhbm5lbF9ieXRlcywgZ2ZwLCBndWlkLAogCQkJCQlmYWxzZSk7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfY3JlYXRlKTsKIAogc3RydWN0IHZpc29yY2hhbm5lbCAqCiB2aXNvcmNoYW5uZWxfY3JlYXRlX3dpdGhfbG9jayh1NjQgcGh5c2FkZHIsIHVuc2lnbmVkIGxvbmcgY2hhbm5lbF9ieXRlcywKIAkJCSAgICAgIGdmcF90IGdmcCwgdXVpZF9sZSBndWlkKQogewotCXJldHVybiB2aXNvcmNoYW5uZWxfY3JlYXRlX2d1dHMocGh5c2FkZHIsIGNoYW5uZWxfYnl0ZXMsIGdmcCwgMCwgZ3VpZCwKKwlyZXR1cm4gdmlzb3JjaGFubmVsX2NyZWF0ZV9ndXRzKHBoeXNhZGRyLCBjaGFubmVsX2J5dGVzLCBnZnAsIGd1aWQsCiAJCQkJCXRydWUpOwogfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2NyZWF0ZV93aXRoX2xvY2spOwogCi12b2lkCi12aXNvcmNoYW5uZWxfZGVzdHJveShzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKQotewotCWlmICghY2hhbm5lbCkKLQkJcmV0dXJuOwotCWlmIChjaGFubmVsLT5tYXBwZWQpIHsKLQkJbWVtdW5tYXAoY2hhbm5lbC0+bWFwcGVkKTsKLQkJaWYgKGNoYW5uZWwtPnJlcXVlc3RlZCkKLQkJCXJlbGVhc2VfbWVtX3JlZ2lvbihjaGFubmVsLT5waHlzYWRkciwgY2hhbm5lbC0+bmJ5dGVzKTsKLQl9Ci0Ja2ZyZWUoY2hhbm5lbCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfZGVzdHJveSk7Ci0KLXU2NAotdmlzb3JjaGFubmVsX2dldF9waHlzYWRkcihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKQotewotCXJldHVybiBjaGFubmVsLT5waHlzYWRkcjsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9nZXRfcGh5c2FkZHIpOwotCi11bG9uZwotdmlzb3JjaGFubmVsX2dldF9uYnl0ZXMoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCkKLXsKLQlyZXR1cm4gY2hhbm5lbC0+bmJ5dGVzOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2dldF9uYnl0ZXMpOwotCi1jaGFyICoKLXZpc29yY2hhbm5lbF91dWlkX2lkKHV1aWRfbGUgKmd1aWQsIGNoYXIgKnMpCi17Ci0Jc3ByaW50ZihzLCAiJXBVTCIsIGd1aWQpOwotCXJldHVybiBzOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX3V1aWRfaWQpOwotCi1jaGFyICoKLXZpc29yY2hhbm5lbF9pZChzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCBjaGFyICpzKQotewotCXJldHVybiB2aXNvcmNoYW5uZWxfdXVpZF9pZCgmY2hhbm5lbC0+Z3VpZCwgcyk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfaWQpOwotCi1jaGFyICoKLXZpc29yY2hhbm5lbF96b25laWQoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgY2hhciAqcykKLXsKLQlyZXR1cm4gdmlzb3JjaGFubmVsX3V1aWRfaWQoJmNoYW5uZWwtPmNoYW5faGRyLnpvbmVfdXVpZCwgcyk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfem9uZWlkKTsKLQotdTY0Ci12aXNvcmNoYW5uZWxfZ2V0X2NsaWVudHBhcnRpdGlvbihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKQotewotCXJldHVybiBjaGFubmVsLT5jaGFuX2hkci5wYXJ0aXRpb25faGFuZGxlOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2dldF9jbGllbnRwYXJ0aXRpb24pOwotCi1pbnQKLXZpc29yY2hhbm5lbF9zZXRfY2xpZW50cGFydGl0aW9uKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsCi0JCQkJIHU2NCBwYXJ0aXRpb25faGFuZGxlKQotewotCWNoYW5uZWwtPmNoYW5faGRyLnBhcnRpdGlvbl9oYW5kbGUgPSBwYXJ0aXRpb25faGFuZGxlOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX3NldF9jbGllbnRwYXJ0aXRpb24pOwotCi11dWlkX2xlCi12aXNvcmNoYW5uZWxfZ2V0X3V1aWQoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCkKLXsKLQlyZXR1cm4gY2hhbm5lbC0+Z3VpZDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9nZXRfdXVpZCk7Ci0KLWludAotdmlzb3JjaGFubmVsX3JlYWQoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdWxvbmcgb2Zmc2V0LAotCQkgIHZvaWQgKmxvY2FsLCB1bG9uZyBuYnl0ZXMpCi17Ci0JaWYgKG9mZnNldCArIG5ieXRlcyA+IGNoYW5uZWwtPm5ieXRlcykKLQkJcmV0dXJuIC1FSU87Ci0KLQltZW1jcHkobG9jYWwsIGNoYW5uZWwtPm1hcHBlZCArIG9mZnNldCwgbmJ5dGVzKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX3JlYWQpOwotCi1pbnQKLXZpc29yY2hhbm5lbF93cml0ZShzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1bG9uZyBvZmZzZXQsCi0JCSAgIHZvaWQgKmxvY2FsLCB1bG9uZyBuYnl0ZXMpCi17Ci0Jc2l6ZV90IGNoZHJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY2hhbm5lbF9oZWFkZXIpOwotCXNpemVfdCBjb3B5X3NpemU7Ci0KLQlpZiAob2Zmc2V0ICsgbmJ5dGVzID4gY2hhbm5lbC0+bmJ5dGVzKQotCQlyZXR1cm4gLUVJTzsKLQotCWlmIChvZmZzZXQgPCBjaGRyX3NpemUpIHsKLQkJY29weV9zaXplID0gbWluKGNoZHJfc2l6ZSAtIG9mZnNldCwgbmJ5dGVzKTsKLQkJbWVtY3B5KCgoY2hhciAqKSgmY2hhbm5lbC0+Y2hhbl9oZHIpKSArIG9mZnNldCwKLQkJICAgICAgIGxvY2FsLCBjb3B5X3NpemUpOwotCX0KLQotCW1lbWNweShjaGFubmVsLT5tYXBwZWQgKyBvZmZzZXQsIGxvY2FsLCBuYnl0ZXMpOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfd3JpdGUpOwotCi1pbnQKLXZpc29yY2hhbm5lbF9jbGVhcihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1bG9uZyBvZmZzZXQsIHU4IGNoLAotCQkgICB1bG9uZyBuYnl0ZXMpCi17Ci0JaW50IGVycjsKLQlpbnQgYnVmc2l6ZSA9IFBBR0VfU0laRTsKLQlpbnQgd3JpdHRlbiA9IDA7Ci0JdTggKmJ1ZjsKLQotCWJ1ZiA9ICh1OCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltZW1zZXQoYnVmLCBjaCwgYnVmc2l6ZSk7Ci0KLQl3aGlsZSAobmJ5dGVzID4gMCkgewotCQlpbnQgdGhpc2J5dGVzID0gYnVmc2l6ZTsKLQotCQlpZiAobmJ5dGVzIDwgdGhpc2J5dGVzKQotCQkJdGhpc2J5dGVzID0gbmJ5dGVzOwotCQllcnIgPSB2aXNvcmNoYW5uZWxfd3JpdGUoY2hhbm5lbCwgb2Zmc2V0ICsgd3JpdHRlbiwKLQkJCQkJIGJ1ZiwgdGhpc2J5dGVzKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gb3V0X2ZyZWVfcGFnZTsKLQotCQl3cml0dGVuICs9IHRoaXNieXRlczsKLQkJbmJ5dGVzIC09IHRoaXNieXRlczsKLQl9Ci0JZXJyID0gMDsKLQotb3V0X2ZyZWVfcGFnZToKLQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYnVmKTsKLQlyZXR1cm4gZXJyOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2NsZWFyKTsKLQotdm9pZCBfX2lvbWVtICAqCi12aXNvcmNoYW5uZWxfZ2V0X2hlYWRlcihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKQotewotCXJldHVybiAodm9pZCBfX2lvbWVtICopJmNoYW5uZWwtPmNoYW5faGRyOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2dldF9oZWFkZXIpOwotCi0vKiogUmV0dXJuIG9mZnNldCBvZiBhIHNwZWNpZmljIFNJR05BTF9RVUVVRV9IRUFERVIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGEKLSAqICBjaGFubmVsIGhlYWRlcgorLyoqCisgKiB2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KCkgLSBpbnNlcnRzIGEgbWVzc2FnZSBpbnRvIHRoZSBkZXNpZ25hdGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsL3F1ZXVlCisgKiBAY2hhbm5lbDogdGhlIGNoYW5uZWwgdGhlIG1lc3NhZ2Ugd2lsbCBiZSBhZGRlZCB0bworICogQHF1ZXVlOiAgIHRoZSBxdWV1ZSB0aGUgbWVzc2FnZSB3aWxsIGJlIGFkZGVkIHRvCisgKiBAbXNnOiAgICAgdGhlIG1lc3NhZ2UgdG8gaW5zZXJ0CisgKgorICogUmV0dXJuOiBpbnRlZ2VyIGVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGUgc3RhdHVzIG9mIHRoZSBpbnNlcnRpb24KICAqLwotI2RlZmluZSBTSUdfUVVFVUVfT0ZGU0VUKGNoYW5faGRyLCBxKSBcCi0JKChjaGFuX2hkciktPmNoX3NwYWNlX29mZnNldCArIFwKLQkgKChxKSAqIHNpemVvZihzdHJ1Y3Qgc2lnbmFsX3F1ZXVlX2hlYWRlcikpKQotCi0vKiogUmV0dXJuIG9mZnNldCBvZiBhIHNwZWNpZmljIHF1ZXVlIGVudHJ5IChkYXRhKSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgYQotICogIGNoYW5uZWwgaGVhZGVyCi0gKi8KLSNkZWZpbmUgU0lHX0RBVEFfT0ZGU0VUKGNoYW5faGRyLCBxLCBzaWdfaGRyLCBzbG90KSBcCi0JKFNJR19RVUVVRV9PRkZTRVQoY2hhbl9oZHIsIHEpICsgKHNpZ19oZHIpLT5zaWdfYmFzZV9vZmZzZXQgKyBcCi0JICAgICgoc2xvdCkgKiAoc2lnX2hkciktPnNpZ25hbF9zaXplKSkKLQotLyoqIFdyaXRlIHRoZSBjb250ZW50cyBvZiBhIHNwZWNpZmljIGZpZWxkIHdpdGhpbiBhIFNJR05BTF9RVUVVRV9IRUFERVIgYmFjawotICogIGludG8gaG9zdCBtZW1vcnkKLSAqLwotI2RlZmluZSBTSUdfV1JJVEVfRklFTEQoY2hhbm5lbCwgcXVldWUsIHNpZ19oZHIsIEZJRUxEKQkJCSBcCi0JKHZpc29yY2hhbm5lbF93cml0ZShjaGFubmVsLAkJCQkJIFwKLQkJCSAgICBTSUdfUVVFVUVfT0ZGU0VUKCZjaGFubmVsLT5jaGFuX2hkciwgcXVldWUpICtcCi0JCQkgICAgb2Zmc2V0b2Yoc3RydWN0IHNpZ25hbF9xdWV1ZV9oZWFkZXIsIEZJRUxEKSwgXAotCQkJICAgICYoKHNpZ19oZHIpLT5GSUVMRCksCQkJIFwKLQkJCSAgICBzaXplb2YoKHNpZ19oZHIpLT5GSUVMRCkpID49IDApCi0KLXN0YXRpYyBib29sCi1zaWdfcmVhZF9oZWFkZXIoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlLAotCQlzdHJ1Y3Qgc2lnbmFsX3F1ZXVlX2hlYWRlciAqc2lnX2hkcikKLXsKLQlpbnQgZXJyOwotCi0JaWYgKGNoYW5uZWwtPmNoYW5faGRyLmNoX3NwYWNlX29mZnNldCA8IHNpemVvZihzdHJ1Y3QgY2hhbm5lbF9oZWFkZXIpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkvKiBSZWFkIHRoZSBhcHByb3ByaWF0ZSBTSUdOQUxfUVVFVUVfSEVBREVSIGludG8gbG9jYWwgbWVtb3J5LiAqLwotCWVyciA9IHZpc29yY2hhbm5lbF9yZWFkKGNoYW5uZWwsCi0JCQkJU0lHX1FVRVVFX09GRlNFVCgmY2hhbm5lbC0+Y2hhbl9oZHIsIHF1ZXVlKSwKLQkJCQlzaWdfaGRyLCBzaXplb2Yoc3RydWN0IHNpZ25hbF9xdWV1ZV9oZWFkZXIpKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGlubGluZSBib29sCi1zaWdfcmVhZF9kYXRhKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHUzMiBxdWV1ZSwKLQkgICAgICBzdHJ1Y3Qgc2lnbmFsX3F1ZXVlX2hlYWRlciAqc2lnX2hkciwgdTMyIHNsb3QsIHZvaWQgKmRhdGEpCi17Ci0JaW50IGVycjsKLQlpbnQgc2lnbmFsX2RhdGFfb2Zmc2V0ID0gU0lHX0RBVEFfT0ZGU0VUKCZjaGFubmVsLT5jaGFuX2hkciwgcXVldWUsCi0JCQkJCQkgc2lnX2hkciwgc2xvdCk7Ci0KLQllcnIgPSB2aXNvcmNoYW5uZWxfcmVhZChjaGFubmVsLCBzaWduYWxfZGF0YV9vZmZzZXQsCi0JCQkJZGF0YSwgc2lnX2hkci0+c2lnbmFsX3NpemUpOwotCWlmIChlcnIpCi0JCXJldHVybiBmYWxzZTsKLQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wKLXNpZ193cml0ZV9kYXRhKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHUzMiBxdWV1ZSwKLQkgICAgICAgc3RydWN0IHNpZ25hbF9xdWV1ZV9oZWFkZXIgKnNpZ19oZHIsIHUzMiBzbG90LCB2b2lkICpkYXRhKQotewotCWludCBlcnI7Ci0JaW50IHNpZ25hbF9kYXRhX29mZnNldCA9IFNJR19EQVRBX09GRlNFVCgmY2hhbm5lbC0+Y2hhbl9oZHIsIHF1ZXVlLAotCQkJCQkJIHNpZ19oZHIsIHNsb3QpOwotCi0JZXJyID0gdmlzb3JjaGFubmVsX3dyaXRlKGNoYW5uZWwsIHNpZ25hbF9kYXRhX29mZnNldCwKLQkJCQkgZGF0YSwgc2lnX2hkci0+c2lnbmFsX3NpemUpOwotCWlmIChlcnIpCi0JCXJldHVybiBmYWxzZTsKLQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbAotc2lnbmFscmVtb3ZlX2lubmVyKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHUzMiBxdWV1ZSwgdm9pZCAqbXNnKQotewotCXN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyIHNpZ19oZHI7Ci0KLQlpZiAoIXNpZ19yZWFkX2hlYWRlcihjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIpKQotCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKHNpZ19oZHIuaGVhZCA9PSBzaWdfaGRyLnRhaWwpCi0JCXJldHVybiBmYWxzZTsJLyogbm8gc2lnbmFscyB0byByZW1vdmUgKi8KLQotCXNpZ19oZHIudGFpbCA9IChzaWdfaGRyLnRhaWwgKyAxKSAlIHNpZ19oZHIubWF4X3Nsb3RzOwotCWlmICghc2lnX3JlYWRfZGF0YShjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIHNpZ19oZHIudGFpbCwgbXNnKSkKLQkJcmV0dXJuIGZhbHNlOwotCXNpZ19oZHIubnVtX3JlY2VpdmVkKys7Ci0KLQkvKiBGb3IgZWFjaCBkYXRhIGZpZWxkIGluIFNJR05BTF9RVUVVRV9IRUFERVIgdGhhdCB3YXMgbW9kaWZpZWQsCi0JICogdXBkYXRlIGhvc3QgbWVtb3J5LgotCSAqLwotCW1iKCk7IC8qIHJlcXVpcmVkIGZvciBjaGFubmVsIHN5bmNoICovCi0JaWYgKCFTSUdfV1JJVEVfRklFTEQoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCB0YWlsKSkKLQkJcmV0dXJuIGZhbHNlOwotCWlmICghU0lHX1dSSVRFX0ZJRUxEKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgbnVtX3JlY2VpdmVkKSkKLQkJcmV0dXJuIGZhbHNlOwotCXJldHVybiB0cnVlOwotfQotCi1ib29sCi12aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHUzMiBxdWV1ZSwgdm9pZCAqbXNnKQotewotCWJvb2wgcmM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChjaGFubmVsLT5uZWVkc19sb2NrKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFubmVsLT5yZW1vdmVfbG9jaywgZmxhZ3MpOwotCQlyYyA9IHNpZ25hbHJlbW92ZV9pbm5lcihjaGFubmVsLCBxdWV1ZSwgbXNnKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbm5lbC0+cmVtb3ZlX2xvY2ssIGZsYWdzKTsKLQl9IGVsc2UgewotCQlyYyA9IHNpZ25hbHJlbW92ZV9pbm5lcihjaGFubmVsLCBxdWV1ZSwgbXNnKTsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKTsKLQotYm9vbAotdmlzb3JjaGFubmVsX3NpZ25hbGVtcHR5KHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHUzMiBxdWV1ZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKLQlzdHJ1Y3Qgc2lnbmFsX3F1ZXVlX2hlYWRlciBzaWdfaGRyOwotCWJvb2wgcmMgPSBmYWxzZTsKLQotCWlmIChjaGFubmVsLT5uZWVkc19sb2NrKQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbm5lbC0+cmVtb3ZlX2xvY2ssIGZsYWdzKTsKLQotCWlmICghc2lnX3JlYWRfaGVhZGVyKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkcikpCi0JCXJjID0gdHJ1ZTsKLQlpZiAoc2lnX2hkci5oZWFkID09IHNpZ19oZHIudGFpbCkKLQkJcmMgPSB0cnVlOwotCWlmIChjaGFubmVsLT5uZWVkc19sb2NrKQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFubmVsLT5yZW1vdmVfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX3NpZ25hbGVtcHR5KTsKLQotc3RhdGljIGJvb2wKLXNpZ25hbGluc2VydF9pbm5lcihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1MzIgcXVldWUsIHZvaWQgKm1zZykKLXsKLQlzdHJ1Y3Qgc2lnbmFsX3F1ZXVlX2hlYWRlciBzaWdfaGRyOwotCi0JaWYgKCFzaWdfcmVhZF9oZWFkZXIoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0Jc2lnX2hkci5oZWFkID0gKHNpZ19oZHIuaGVhZCArIDEpICUgc2lnX2hkci5tYXhfc2xvdHM7Ci0JaWYgKHNpZ19oZHIuaGVhZCA9PSBzaWdfaGRyLnRhaWwpIHsKLQkJc2lnX2hkci5udW1fb3ZlcmZsb3dzKys7Ci0JCXZpc29yY2hhbm5lbF93cml0ZShjaGFubmVsLAotCQkJCSAgIFNJR19RVUVVRV9PRkZTRVQoJmNoYW5uZWwtPmNoYW5faGRyLCBxdWV1ZSkgKwotCQkJCSAgIG9mZnNldG9mKHN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyLAotCQkJCQkgICAgbnVtX292ZXJmbG93cyksCi0JCQkJICAgJnNpZ19oZHIubnVtX292ZXJmbG93cywKLQkJCQkgICBzaXplb2Yoc2lnX2hkci5udW1fb3ZlcmZsb3dzKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlpZiAoIXNpZ193cml0ZV9kYXRhKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgc2lnX2hkci5oZWFkLCBtc2cpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlzaWdfaGRyLm51bV9zZW50Kys7Ci0KLQkvKiBGb3IgZWFjaCBkYXRhIGZpZWxkIGluIFNJR05BTF9RVUVVRV9IRUFERVIgdGhhdCB3YXMgbW9kaWZpZWQsCi0JICogdXBkYXRlIGhvc3QgbWVtb3J5LgotCSAqLwotCW1iKCk7IC8qIHJlcXVpcmVkIGZvciBjaGFubmVsIHN5bmNoICovCi0JaWYgKCFTSUdfV1JJVEVfRklFTEQoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCBoZWFkKSkKLQkJcmV0dXJuIGZhbHNlOwotCWlmICghU0lHX1dSSVRFX0ZJRUxEKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgbnVtX3NlbnQpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbAoraW50CiB2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHUzMiBxdWV1ZSwgdm9pZCAqbXNnKQogewotCWJvb2wgcmM7CisJaW50IHJjOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoY2hhbm5lbC0+bmVlZHNfbG9jaykgewpAQCAtNTA0LDEzMiArNTEyLDMgQEAKIAlyZXR1cm4gcmM7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KTsKLQotaW50Ci12aXNvcmNoYW5uZWxfc2lnbmFscXVldWVfc2xvdHNfYXZhaWwoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlKQotewotCXN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyIHNpZ19oZHI7Ci0JdTMyIHNsb3RzX2F2YWlsLCBzbG90c191c2VkOwotCXUzMiBoZWFkLCB0YWlsOwotCi0JaWYgKCFzaWdfcmVhZF9oZWFkZXIoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyKSkKLQkJcmV0dXJuIDA7Ci0JaGVhZCA9IHNpZ19oZHIuaGVhZDsKLQl0YWlsID0gc2lnX2hkci50YWlsOwotCWlmIChoZWFkIDwgdGFpbCkKLQkJaGVhZCA9IGhlYWQgKyBzaWdfaGRyLm1heF9zbG90czsKLQlzbG90c191c2VkID0gaGVhZCAtIHRhaWw7Ci0Jc2xvdHNfYXZhaWwgPSBzaWdfaGRyLm1heF9zaWduYWxzIC0gc2xvdHNfdXNlZDsKLQlyZXR1cm4gKGludClzbG90c19hdmFpbDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9zaWduYWxxdWV1ZV9zbG90c19hdmFpbCk7Ci0KLWludAotdmlzb3JjaGFubmVsX3NpZ25hbHF1ZXVlX21heF9zbG90cyhzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1MzIgcXVldWUpCi17Ci0Jc3RydWN0IHNpZ25hbF9xdWV1ZV9oZWFkZXIgc2lnX2hkcjsKLQotCWlmICghc2lnX3JlYWRfaGVhZGVyKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkcikpCi0JCXJldHVybiAwOwotCXJldHVybiAoaW50KXNpZ19oZHIubWF4X3NpZ25hbHM7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfc2lnbmFscXVldWVfbWF4X3Nsb3RzKTsKLQotc3RhdGljIHZvaWQKLXNpZ3F1ZXVlX2RlYnVnKHN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyICpxLCBpbnQgd2hpY2gsIHN0cnVjdCBzZXFfZmlsZSAqc2VxKQotewotCXNlcV9wcmludGYoc2VxLCAiU2lnbmFsIFF1ZXVlICMlZFxuIiwgd2hpY2gpOwotCXNlcV9wcmludGYoc2VxLCAiICAgVmVyc2lvbklkICAgICAgICAgID0gJWx1XG4iLCAodWxvbmcpcS0+dmVyc2lvbik7Ci0Jc2VxX3ByaW50ZihzZXEsICIgICBUeXBlICAgICAgICAgICAgICAgPSAlbHVcbiIsICh1bG9uZylxLT5jaHR5cGUpOwotCXNlcV9wcmludGYoc2VxLCAiICAgb1NpZ25hbEJhc2UgICAgICAgID0gJWxsdVxuIiwKLQkJICAgKGxvbmcgbG9uZylxLT5zaWdfYmFzZV9vZmZzZXQpOwotCXNlcV9wcmludGYoc2VxLCAiICAgU2lnbmFsU2l6ZSAgICAgICAgID0gJWx1XG4iLCAodWxvbmcpcS0+c2lnbmFsX3NpemUpOwotCXNlcV9wcmludGYoc2VxLCAiICAgTWF4U2lnbmFsU2xvdHMgICAgID0gJWx1XG4iLAotCQkgICAodWxvbmcpcS0+bWF4X3Nsb3RzKTsKLQlzZXFfcHJpbnRmKHNlcSwgIiAgIE1heFNpZ25hbHMgICAgICAgICA9ICVsdVxuIiwgKHVsb25nKXEtPm1heF9zaWduYWxzKTsKLQlzZXFfcHJpbnRmKHNlcSwgIiAgIEZlYXR1cmVGbGFncyAgICAgICA9ICUtMTYuMTZMeFxuIiwKLQkJICAgKGxvbmcgbG9uZylxLT5mZWF0dXJlcyk7Ci0Jc2VxX3ByaW50ZihzZXEsICIgICBOdW1TaWduYWxzU2VudCAgICAgPSAlbGx1XG4iLAotCQkgICAobG9uZyBsb25nKXEtPm51bV9zZW50KTsKLQlzZXFfcHJpbnRmKHNlcSwgIiAgIE51bVNpZ25hbHNSZWNlaXZlZCA9ICVsbHVcbiIsCi0JCSAgIChsb25nIGxvbmcpcS0+bnVtX3JlY2VpdmVkKTsKLQlzZXFfcHJpbnRmKHNlcSwgIiAgIE51bU92ZXJmbG93cyAgICAgICA9ICVsbHVcbiIsCi0JCSAgIChsb25nIGxvbmcpcS0+bnVtX292ZXJmbG93cyk7Ci0Jc2VxX3ByaW50ZihzZXEsICIgICBIZWFkICAgICAgICAgICAgICAgPSAlbHVcbiIsICh1bG9uZylxLT5oZWFkKTsKLQlzZXFfcHJpbnRmKHNlcSwgIiAgIFRhaWwgICAgICAgICAgICAgICA9ICVsdVxuIiwgKHVsb25nKXEtPnRhaWwpOwotfQotCi12b2lkCi12aXNvcmNoYW5uZWxfZGVidWcoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgaW50IG51bV9xdWV1ZXMsCi0JCSAgIHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB1MzIgb2ZmKQotewotCXU2NCBhZGRyID0gMDsKLQl1bG9uZyBuYnl0ZXMgPSAwLCBuYnl0ZXNfcmVnaW9uID0gMDsKLQlzdHJ1Y3QgY2hhbm5lbF9oZWFkZXIgaGRyOwotCXN0cnVjdCBjaGFubmVsX2hlYWRlciAqcGhkciA9ICZoZHI7Ci0JaW50IGkgPSAwOwotCWludCBlcnJjb2RlID0gMDsKLQotCWlmICghY2hhbm5lbCkKLQkJcmV0dXJuOwotCi0JYWRkciA9IHZpc29yY2hhbm5lbF9nZXRfcGh5c2FkZHIoY2hhbm5lbCk7Ci0JbmJ5dGVzX3JlZ2lvbiA9IHZpc29yY2hhbm5lbF9nZXRfbmJ5dGVzKGNoYW5uZWwpOwotCWVycmNvZGUgPSB2aXNvcmNoYW5uZWxfcmVhZChjaGFubmVsLCBvZmYsCi0JCQkJICAgIHBoZHIsIHNpemVvZihzdHJ1Y3QgY2hhbm5lbF9oZWFkZXIpKTsKLQlpZiAoZXJyY29kZSA8IDApIHsKLQkJc2VxX3ByaW50ZihzZXEsCi0JCQkgICAiUmVhZCBvZiBjaGFubmVsIGhlYWRlciBmYWlsZWQgd2l0aCBlcnJjb2RlPSVkKVxuIiwKLQkJCSAgIGVycmNvZGUpOwotCQlpZiAob2ZmID09IDApIHsKLQkJCXBoZHIgPSAmY2hhbm5lbC0+Y2hhbl9oZHI7Ci0JCQlzZXFfcHV0cyhzZXEsICIoZm9sbG93aW5nIGRhdGEgbWF5IGJlIHN0YWxlKVxuIik7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JbmJ5dGVzID0gKHVsb25nKShwaGRyLT5zaXplKTsKLQlzZXFfcHJpbnRmKHNlcSwgIi0tLSBCZWdpbiBjaGFubmVsIEAweCUtMTYuMTZMeCBmb3IgMHglbHggYnl0ZXMgKHJlZ2lvbj0weCVseCBieXRlcykgLS0tXG4iLAotCQkgICBhZGRyICsgb2ZmLCBuYnl0ZXMsIG5ieXRlc19yZWdpb24pOwotCXNlcV9wcmludGYoc2VxLCAiVHlwZSAgICAgICAgICAgID0gJXBVTFxuIiwgJnBoZHItPmNodHlwZSk7Ci0Jc2VxX3ByaW50ZihzZXEsICJab25lR3VpZCAgICAgICAgPSAlcFVMXG4iLCAmcGhkci0+em9uZV91dWlkKTsKLQlzZXFfcHJpbnRmKHNlcSwgIlNpZ25hdHVyZSAgICAgICA9IDB4JS0xNi4xNkx4XG4iLAotCQkgICAobG9uZyBsb25nKXBoZHItPnNpZ25hdHVyZSk7Ci0Jc2VxX3ByaW50ZihzZXEsICJMZWdhY3lTdGF0ZSAgICAgPSAlbHVcbiIsICh1bG9uZylwaGRyLT5sZWdhY3lfc3RhdGUpOwotCXNlcV9wcmludGYoc2VxLCAiU3J2U3RhdGUgICAgICAgID0gJWx1XG4iLCAodWxvbmcpcGhkci0+c3J2X3N0YXRlKTsKLQlzZXFfcHJpbnRmKHNlcSwgIkNsaVN0YXRlQm9vdCAgICA9ICVsdVxuIiwgKHVsb25nKXBoZHItPmNsaV9zdGF0ZV9ib290KTsKLQlzZXFfcHJpbnRmKHNlcSwgIkNsaVN0YXRlT1MgICAgICA9ICVsdVxuIiwgKHVsb25nKXBoZHItPmNsaV9zdGF0ZV9vcyk7Ci0Jc2VxX3ByaW50ZihzZXEsICJIZWFkZXJTaXplICAgICAgPSAlbHVcbiIsICh1bG9uZylwaGRyLT5oZWFkZXJfc2l6ZSk7Ci0Jc2VxX3ByaW50ZihzZXEsICJTaXplICAgICAgICAgICAgPSAlbGx1XG4iLCAobG9uZyBsb25nKXBoZHItPnNpemUpOwotCXNlcV9wcmludGYoc2VxLCAiRmVhdHVyZXMgICAgICAgID0gMHglLTE2LjE2bGx4XG4iLAotCQkgICAobG9uZyBsb25nKXBoZHItPmZlYXR1cmVzKTsKLQlzZXFfcHJpbnRmKHNlcSwgIlBhcnRpdGlvbkhhbmRsZSA9IDB4JS0xNi4xNmxseFxuIiwKLQkJICAgKGxvbmcgbG9uZylwaGRyLT5wYXJ0aXRpb25faGFuZGxlKTsKLQlzZXFfcHJpbnRmKHNlcSwgIkhhbmRsZSAgICAgICAgICA9IDB4JS0xNi4xNmxseFxuIiwKLQkJICAgKGxvbmcgbG9uZylwaGRyLT5oYW5kbGUpOwotCXNlcV9wcmludGYoc2VxLCAiVmVyc2lvbklkICAgICAgID0gJWx1XG4iLCAodWxvbmcpcGhkci0+dmVyc2lvbl9pZCk7Ci0Jc2VxX3ByaW50ZihzZXEsICJvQ2hhbm5lbFNwYWNlICAgPSAlbGx1XG4iLAotCQkgICAobG9uZyBsb25nKXBoZHItPmNoX3NwYWNlX29mZnNldCk7Ci0JaWYgKChwaGRyLT5jaF9zcGFjZV9vZmZzZXQgPT0gMCkgfHwgKGVycmNvZGUgPCAwKSkKLQkJOwotCWVsc2UKLQkJZm9yIChpID0gMDsgaSA8IG51bV9xdWV1ZXM7IGkrKykgewotCQkJc3RydWN0IHNpZ25hbF9xdWV1ZV9oZWFkZXIgcTsKLQotCQkJZXJyY29kZSA9IHZpc29yY2hhbm5lbF9yZWFkKGNoYW5uZWwsCi0JCQkJCQkgICAgb2ZmICsKLQkJCQkJCSAgICBwaGRyLT5jaF9zcGFjZV9vZmZzZXQgKwotCQkJCQkJICAgIChpICogc2l6ZW9mKHEpKSwKLQkJCQkJCSAgICAmcSwgc2l6ZW9mKHEpKTsKLQkJCWlmIChlcnJjb2RlIDwgMCkgewotCQkJCXNlcV9wcmludGYoc2VxLAotCQkJCQkgICAiZmFpbGVkIHRvIHJlYWQgc2lnbmFsIHF1ZXVlICMlZCBmcm9tIGNoYW5uZWwgQDB4JS0xNi4xNkx4IGVycmNvZGU9JWRcbiIsCi0JCQkJCSAgIGksIGFkZHIsIGVycmNvZGUpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJc2lncXVldWVfZGVidWcoJnEsIGksIHNlcSk7Ci0JCX0KLQlzZXFfcHJpbnRmKHNlcSwgIi0tLSBFbmQgICBjaGFubmVsIEAweCUtMTYuMTZMeCBmb3IgMHglbHggYnl0ZXMgLS0tXG4iLAotCQkgICBhZGRyICsgb2ZmLCBuYnl0ZXMpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2RlYnVnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvdmlzb3JjaGlwc2V0LmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3Zpc29yY2hpcHNldC5jCmluZGV4IGQyNDhjOTQuLjU5ODcxNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvdmlzb3JjaGlwc2V0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy92aXNvcmNoaXBzZXQuYwpAQCAtMjUsMjEgKzI1LDEyIEBACiAjaW5jbHVkZSA8bGludXgvdXVpZC5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYXNoX2R1bXAuaD4KIAotI2luY2x1ZGUgImNoYW5uZWxfZ3VpZC5oIgotI2luY2x1ZGUgImNvbnRyb2x2bWNoYW5uZWwuaCIKLSNpbmNsdWRlICJjb250cm9sdm1jb21wbGV0aW9uc3RhdHVzLmgiCi0jaW5jbHVkZSAiZ3Vlc3RsaW51eGRlYnVnLmgiCi0jaW5jbHVkZSAicGVyaW9kaWNfd29yay5oIgotI2luY2x1ZGUgInZlcnNpb24uaCIKICNpbmNsdWRlICJ2aXNvcmJ1cy5oIgogI2luY2x1ZGUgInZpc29yYnVzX3ByaXZhdGUuaCIKICNpbmNsdWRlICJ2bWNhbGxpbnRlcmZhY2UuaCIKIAogI2RlZmluZSBDVVJSRU5UX0ZJTEVfUEMgVklTT1JfQ0hJUFNFVF9QQ192aXNvcmNoaXBzZXRfbWFpbl9jCiAKLSNkZWZpbmUgTUFYX05BTUVfU0laRSAxMjgKLSNkZWZpbmUgTUFYX0lQX1NJWkUgICA1MAotI2RlZmluZSBNQVhPVVRTVEFORElOR0NIQU5ORUxDT01NQU5EIDI1NgogI2RlZmluZSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX0ZBU1QgICAxCiAjZGVmaW5lIFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfU0xPVyAxMDAKIApAQCAtNTgsOSArNDksNiBAQAogICogTW9kdWxlIHBhcmFtZXRlcnMKICAqLwogc3RhdGljIGludCB2aXNvcmNoaXBzZXRfbWFqb3I7Ci1zdGF0aWMgaW50IHZpc29yY2hpcHNldF92aXNvcmJ1c3JlZ3dhaXQgPSAxOwkvKiBkZWZhdWx0IGlzIG9uICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjb250cm9sdm1fcGF5bG9hZF9ieXRlc19idWZmZXJlZDsKLXN0YXRpYyB1MzIgZHVtcF92aGJhX2J1czsKIAogc3RhdGljIGludAogdmlzb3JjaGlwc2V0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCkBAIC03OSwxNSArNjcsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogV2hlbiB0aGUgY29udHJvbHZtIGNoYW5uZWwgaXMgaWRsZSBmb3IgYXQgbGVhc3QgTUlOX0lETEVfU0VDT05EUywKLSogd2Ugc3dpdGNoIHRvIHNsb3cgcG9sbGluZyBtb2RlLiAgQXMgc29vbiBhcyB3ZSBnZXQgYSBjb250cm9sdm0KLSogbWVzc2FnZSwgd2Ugc3dpdGNoIGJhY2sgdG8gZmFzdCBwb2xsaW5nIG1vZGUuCi0qLworLyoKKyAqIFdoZW4gdGhlIGNvbnRyb2x2bSBjaGFubmVsIGlzIGlkbGUgZm9yIGF0IGxlYXN0IE1JTl9JRExFX1NFQ09ORFMsCisgKiB3ZSBzd2l0Y2ggdG8gc2xvdyBwb2xsaW5nIG1vZGUuIEFzIHNvb24gYXMgd2UgZ2V0IGEgY29udHJvbHZtCisgKiBtZXNzYWdlLCB3ZSBzd2l0Y2ggYmFjayB0byBmYXN0IHBvbGxpbmcgbW9kZS4KKyAqLwogI2RlZmluZSBNSU5fSURMRV9TRUNPTkRTIDEwCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBwb2xsX2ppZmZpZXMgPSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX0ZBU1Q7CiAvKiB3aGVuIHdlIGdvdCBvdXIgbGFzdCBjb250cm9sdm0gbWVzc2FnZSAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgbW9zdF9yZWNlbnRfbWVzc2FnZV9qaWZmaWVzOwotc3RhdGljIGludCB2aXNvcmJ1c3JlZ2lzdGVyZWQ7CiAKIHN0cnVjdCBwYXJzZXJfY29udGV4dCB7CiAJdW5zaWduZWQgbG9uZyBhbGxvY2J5dGVzOwpAQCAtOTksNTEgKzg3LDM2IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGRlbGF5ZWRfd29yayBwZXJpb2RpY19jb250cm9sdm1fd29yazsKLXN0YXRpYyBERUZJTkVfU0VNQVBIT1JFKG5vdGlmaWVyX2xvY2spOwogCiBzdGF0aWMgc3RydWN0IGNkZXYgZmlsZV9jZGV2Owogc3RhdGljIHN0cnVjdCB2aXNvcmNoYW5uZWwgKipmaWxlX2NvbnRyb2x2bV9jaGFubmVsOwotc3RhdGljIHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9wYWNrZXQgZ19kZXZpY2VjaGFuZ2VzdGF0ZV9wYWNrZXQ7Ci0KLXN0YXRpYyBMSVNUX0hFQUQoYnVzX2luZm9fbGlzdCk7Ci1zdGF0aWMgTElTVF9IRUFEKGRldl9pbmZvX2xpc3QpOwogCiBzdGF0aWMgc3RydWN0IHZpc29yY2hhbm5lbCAqY29udHJvbHZtX2NoYW5uZWw7CiAKIC8qIE1hbmFnZXMgdGhlIHJlcXVlc3QgcGF5bG9hZCBpbiB0aGUgY29udHJvbHZtIGNoYW5uZWwgKi8KIHN0cnVjdCB2aXNvcl9jb250cm9sdm1fcGF5bG9hZF9pbmZvIHsKIAl1OCAqcHRyOwkJLyogcG9pbnRlciB0byBiYXNlIGFkZHJlc3Mgb2YgcGF5bG9hZCBwb29sICovCi0JdTY0IG9mZnNldDsJCS8qIG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBjb250cm9sdm0KKwl1NjQgb2Zmc2V0OwkJLyoKKwkJCQkgKiBvZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2YgY29udHJvbHZtCiAJCQkJICogY2hhbm5lbCB0byBiZWdpbm5pbmcgb2YgcGF5bG9hZCAqIHBvb2wKIAkJCQkgKi8KIAl1MzIgYnl0ZXM7CQkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gcGF5bG9hZCBwb29sICovCiB9OwogCiBzdGF0aWMgc3RydWN0IHZpc29yX2NvbnRyb2x2bV9wYXlsb2FkX2luZm8gY29udHJvbHZtX3BheWxvYWRfaW5mbzsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNvbnRyb2x2bV9wYXlsb2FkX2J5dGVzX2J1ZmZlcmVkOwogCi0vKiBUaGUgZm9sbG93aW5nIGdsb2JhbHMgYXJlIHVzZWQgdG8gaGFuZGxlIHRoZSBzY2VuYXJpbyB3aGVyZSB3ZSBhcmUgdW5hYmxlIHRvCi0gKiBvZmZsb2FkIHRoZSBwYXlsb2FkIGZyb20gYSBjb250cm9sdm0gbWVzc2FnZSBkdWUgdG8gbWVtb3J5IHJlcXVpcmVtZW50cy4gIEluCisvKgorICogVGhlIGZvbGxvd2luZyBnbG9iYWxzIGFyZSB1c2VkIHRvIGhhbmRsZSB0aGUgc2NlbmFyaW8gd2hlcmUgd2UgYXJlIHVuYWJsZSB0bworICogb2ZmbG9hZCB0aGUgcGF5bG9hZCBmcm9tIGEgY29udHJvbHZtIG1lc3NhZ2UgZHVlIHRvIG1lbW9yeSByZXF1aXJlbWVudHMuIEluCiAgKiB0aGlzIHNjZW5hcmlvLCB3ZSBzaW1wbHkgc3Rhc2ggdGhlIGNvbnRyb2x2bSBtZXNzYWdlLCB0aGVuIGF0dGVtcHQgdG8KICAqIHByb2Nlc3MgaXQgYWdhaW4gdGhlIG5leHQgdGltZSBjb250cm9sdm1fcGVyaW9kaWNfd29yaygpIHJ1bnMuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgY29udHJvbHZtX3BlbmRpbmdfbXNnOwogc3RhdGljIGJvb2wgY29udHJvbHZtX3BlbmRpbmdfbXNnX3ZhbGlkOwogCi0vKiBUaGlzIGlkZW50aWZpZXMgYSBkYXRhIGJ1ZmZlciB0aGF0IGhhcyBiZWVuIHJlY2VpdmVkIHZpYSBhIGNvbnRyb2x2bSBtZXNzYWdlcwotICogaW4gYSByZW1vdGUgLS0+IGxvY2FsIENPTlRST0xWTV9UUkFOU01JVF9GSUxFIGNvbnZlcnNhdGlvbi4KLSAqLwotc3RydWN0IHB1dGZpbGVfYnVmZmVyX2VudHJ5IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIG5leHQ7CS8qIHB1dGZpbGVfYnVmZmVyX2VudHJ5IGxpc3QgKi8KLQlzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKnBhcnNlcl9jdHg7IC8qIHBvaW50cyB0byBpbnB1dCBkYXRhIGJ1ZmZlciAqLwotfTsKLQotLyogTGlzdCBvZiBzdHJ1Y3QgcHV0ZmlsZV9yZXF1ZXN0ICosIHZpYSBuZXh0X3B1dGZpbGVfcmVxdWVzdCBtZW1iZXIuCi0gKiBFYWNoIGVudHJ5IGluIHRoaXMgbGlzdCBpZGVudGlmaWVzIGFuIG91dHN0YW5kaW5nIFRSQU5TTUlUX0ZJTEUKLSAqIGNvbnZlcnNhdGlvbi4KLSAqLwotc3RhdGljIExJU1RfSEVBRChwdXRmaWxlX3JlcXVlc3RfbGlzdCk7Ci0KLS8qIFRoaXMgZGVzY3JpYmVzIGEgYnVmZmVyIGFuZCBpdHMgY3VycmVudCBzdGF0ZSBvZiB0cmFuc2ZlciAoZS5nLiwgaG93IG1hbnkKKy8qCisgKiBUaGlzIGRlc2NyaWJlcyBhIGJ1ZmZlciBhbmQgaXRzIGN1cnJlbnQgc3RhdGUgb2YgdHJhbnNmZXIgKGUuZy4sIGhvdyBtYW55CiAgKiBieXRlcyBoYXZlIGFscmVhZHkgYmVlbiBzdXBwbGllZCBhcyBwdXRmaWxlIGRhdGEsIGFuZCBob3cgbWFueSBieXRlcyBhcmUKICAqIHJlbWFpbmluZykgZm9yIGEgcHV0ZmlsZV9yZXF1ZXN0LgogICovCkBAIC0xNTUsOCArMTI4LDkgQEAKIH07CiAKICNkZWZpbmUgUFVURklMRV9SRVFVRVNUX1NJRyAweDA5MDYxMDEzMDIyODEyMTEKLS8qIFRoaXMgaWRlbnRpZmllcyBhIHNpbmdsZSByZW1vdGUgLS0+IGxvY2FsIENPTlRST0xWTV9UUkFOU01JVF9GSUxFCi0gKiBjb252ZXJzYXRpb24uICBTdHJ1Y3RzIG9mIHRoaXMgdHlwZSBhcmUgZHluYW1pY2FsbHkgbGlua2VkIGludG8KKy8qCisgKiBUaGlzIGlkZW50aWZpZXMgYSBzaW5nbGUgcmVtb3RlIC0tPiBsb2NhbCBDT05UUk9MVk1fVFJBTlNNSVRfRklMRQorICogY29udmVyc2F0aW9uLiBTdHJ1Y3RzIG9mIHRoaXMgdHlwZSBhcmUgZHluYW1pY2FsbHkgbGlua2VkIGludG8KICAqIDxQdXRmaWxlX3JlcXVlc3RfbGlzdD4uCiAgKi8KIHN0cnVjdCBwdXRmaWxlX3JlcXVlc3QgewpAQCAtMTY4LDcgKzE0Miw4IEBACiAJLyogbGluayB0byBuZXh0IHN0cnVjdCBwdXRmaWxlX3JlcXVlc3QgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIG5leHRfcHV0ZmlsZV9yZXF1ZXN0OwogCi0JLyogaGVhZCBvZiBwdXRmaWxlX2J1ZmZlcl9lbnRyeSBsaXN0LCB3aGljaCBkZXNjcmliZXMgdGhlIGRhdGEgdG8gYmUKKwkvKgorCSAqIGhlYWQgb2YgcHV0ZmlsZV9idWZmZXJfZW50cnkgbGlzdCwgd2hpY2ggZGVzY3JpYmVzIHRoZSBkYXRhIHRvIGJlCiAJICogc3VwcGxpZWQgYXMgcHV0ZmlsZSBkYXRhOwogCSAqIC0gdGhpcyBsaXN0IGlzIGFkZGVkIHRvIHdoZW4gY29udHJvbHZtIG1lc3NhZ2VzIGNvbWUgaW4gdGhhdCBzdXBwbHkKIAkgKiBmaWxlIGRhdGEKQEAgLTE4NCwxMSArMTU5LDEzIEBACiAJLyogZGF0YSBub3QgeWV0IHJlYWQgd2l0aGluIGN1cnJlbnQgcHV0ZmlsZV9idWZmZXJfZW50cnkgKi8KIAlzdHJ1Y3QgcHV0ZmlsZV9hY3RpdmVfYnVmZmVyIGFjdGl2ZV9idWY7CiAKLQkvKiA8MCA9IGZhaWxlZCwgMCA9IGluLXByb2dyZXNzLCA+MCA9IHN1Y2Nlc3NmdWw7ICovCi0JLyogbm90ZSB0aGF0IHRoaXMgbXVzdCBiZSBzZXQgd2l0aCByZXFfbGlzdF9sb2NrLCBhbmQgaWYgeW91IHNldCA8MCwgKi8KLQkvKiBpdCBpcyB5b3VyIHJlc3BvbnNpYmlsaXR5IHRvIGFsc28gZnJlZSB1cCBhbGwgb2YgdGhlIG90aGVyIG9iamVjdHMgKi8KLQkvKiBpbiB0aGlzIHN0cnVjdCAobGlrZSBpbnB1dF9idWZmZXJfbGlzdCwgYWN0aXZlX2J1Zi5wYXJzZXJfY3R4KSAqLwotCS8qIGJlZm9yZSByZWxlYXNpbmcgdGhlIGxvY2sgKi8KKwkvKgorCSAqIDwwID0gZmFpbGVkLCAwID0gaW4tcHJvZ3Jlc3MsID4wID0gc3VjY2Vzc2Z1bDsKKwkgKiBub3RlIHRoYXQgdGhpcyBtdXN0IGJlIHNldCB3aXRoIHJlcV9saXN0X2xvY2ssIGFuZCBpZiB5b3Ugc2V0IDwwLAorCSAqIGl0IGlzIHlvdXIgcmVzcG9uc2liaWxpdHkgdG8gYWxzbyBmcmVlIHVwIGFsbCBvZiB0aGUgb3RoZXIgb2JqZWN0cworCSAqIGluIHRoaXMgc3RydWN0IChsaWtlIGlucHV0X2J1ZmZlcl9saXN0LCBhY3RpdmVfYnVmLnBhcnNlcl9jdHgpCisJICogYmVmb3JlIHJlbGVhc2luZyB0aGUgbG9jaworCSAqLwogCWludCBjb21wbGV0aW9uX3N0YXR1czsKIH07CiAKQEAgLTE5OSwxOTMgKzE3NiwxNzkgQEAKIAlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgbXNnOwogfTsKIAotc3RhdGljIExJU1RfSEVBRChwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3QpOwotc3RhdGljIERFRklORV9TUElOTE9DSyhwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CS8qIGxvY2sgZm9yIGFib3ZlICovCi1zdGF0aWMgdm9pZCBwYXJhaG90cGx1Z19wcm9jZXNzX2xpc3Qodm9pZCk7Ci0KLS8qIE1hbmFnZXMgdGhlIGluZm8gZm9yIGEgQ09OVFJPTFZNX0RVTVBfQ0FQVFVSRVNUQVRFIC8KLSAqIENPTlRST0xWTV9SRVBPUlRFVkVOVC4KLSAqLwotc3RhdGljIHN0cnVjdCB2aXNvcmNoaXBzZXRfYnVzZGV2X25vdGlmaWVycyBidXNkZXZfbm90aWZpZXJzOwotCi1zdGF0aWMgdm9pZCBidXNfY3JlYXRlX3Jlc3BvbnNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKnAsIGludCByZXNwb25zZSk7Ci1zdGF0aWMgdm9pZCBidXNfZGVzdHJveV9yZXNwb25zZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpwLCBpbnQgcmVzcG9uc2UpOwotc3RhdGljIHZvaWQgZGV2aWNlX2NyZWF0ZV9yZXNwb25zZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpwLCBpbnQgcmVzcG9uc2UpOwotc3RhdGljIHZvaWQgZGV2aWNlX2Rlc3Ryb3lfcmVzcG9uc2Uoc3RydWN0IHZpc29yX2RldmljZSAqcCwgaW50IHJlc3BvbnNlKTsKLXN0YXRpYyB2b2lkIGRldmljZV9yZXN1bWVfcmVzcG9uc2Uoc3RydWN0IHZpc29yX2RldmljZSAqcCwgaW50IHJlc3BvbnNlKTsKLQotc3RhdGljIHZvaWQgdmlzb3JjaGlwc2V0X2RldmljZV9wYXVzZV9yZXNwb25zZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpwLAotCQkJCQkgICAgICAgaW50IHJlc3BvbnNlKTsKLQotc3RhdGljIHN0cnVjdCB2aXNvcmNoaXBzZXRfYnVzZGV2X3Jlc3BvbmRlcnMgYnVzZGV2X3Jlc3BvbmRlcnMgPSB7Ci0JLmJ1c19jcmVhdGUgPSBidXNfY3JlYXRlX3Jlc3BvbnNlLAotCS5idXNfZGVzdHJveSA9IGJ1c19kZXN0cm95X3Jlc3BvbnNlLAotCS5kZXZpY2VfY3JlYXRlID0gZGV2aWNlX2NyZWF0ZV9yZXNwb25zZSwKLQkuZGV2aWNlX2Rlc3Ryb3kgPSBkZXZpY2VfZGVzdHJveV9yZXNwb25zZSwKLQkuZGV2aWNlX3BhdXNlID0gdmlzb3JjaGlwc2V0X2RldmljZV9wYXVzZV9yZXNwb25zZSwKLQkuZGV2aWNlX3Jlc3VtZSA9IGRldmljZV9yZXN1bWVfcmVzcG9uc2UsCi19OwotCiAvKiBpbmZvIGZvciAvZGV2L3Zpc29yY2hpcHNldCAqLwotc3RhdGljIGRldl90IG1ham9yX2RldiA9IC0xOyAvKio8IGluZGljYXRlcyBtYWpvciBudW0gZm9yIGRldmljZSAqLworc3RhdGljIGRldl90IG1ham9yX2RldiA9IC0xOyAvKjwgaW5kaWNhdGVzIG1ham9yIG51bSBmb3IgZGV2aWNlICovCiAKIC8qIHByb3RvdHlwZXMgZm9yIGF0dHJpYnV0ZXMgKi8KIHN0YXRpYyBzc2l6ZV90IHRvb2xhY3Rpb25fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zik7CisJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICAgY2hhciAqYnVmKQoreworCXU4IHRvb2xfYWN0aW9uID0gMDsKKworCXZpc29yY2hhbm5lbF9yZWFkKGNvbnRyb2x2bV9jaGFubmVsLAorCQkJICBvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKKwkJCQkgICB0b29sX2FjdGlvbiksICZ0b29sX2FjdGlvbiwgc2l6ZW9mKHU4KSk7CisJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLCB0b29sX2FjdGlvbik7Cit9CisKIHN0YXRpYyBzc2l6ZV90IHRvb2xhY3Rpb25fc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1OCB0b29sX2FjdGlvbjsKKwlpbnQgcmV0OworCisJaWYgKGtzdHJ0b3U4KGJ1ZiwgMTAsICZ0b29sX2FjdGlvbikpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gdmlzb3JjaGFubmVsX3dyaXRlCisJCShjb250cm9sdm1fY2hhbm5lbCwKKwkJIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAorCQkJICB0b29sX2FjdGlvbiksCisJCSAmdG9vbF9hY3Rpb24sIHNpemVvZih1OCkpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gY291bnQ7Cit9CiBzdGF0aWMgREVWSUNFX0FUVFJfUlcodG9vbGFjdGlvbik7CiAKIHN0YXRpYyBzc2l6ZV90IGJvb3R0b3Rvb2xfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zik7CisJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBlZmlfc3Bhcl9pbmRpY2F0aW9uIGVmaV9zcGFyX2luZGljYXRpb247CisKKwl2aXNvcmNoYW5uZWxfcmVhZChjb250cm9sdm1fY2hhbm5lbCwKKwkJCSAgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCisJCQkJICAgZWZpX3NwYXJfaW5kKSwgJmVmaV9zcGFyX2luZGljYXRpb24sCisJCQkgIHNpemVvZihzdHJ1Y3QgZWZpX3NwYXJfaW5kaWNhdGlvbikpOworCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwKKwkJCSBlZmlfc3Bhcl9pbmRpY2F0aW9uLmJvb3RfdG9fdG9vbCk7Cit9CisKIHN0YXRpYyBzc2l6ZV90IGJvb3R0b3Rvb2xfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCi0JCQkJc2l6ZV90IGNvdW50KTsKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgdmFsLCByZXQ7CisJc3RydWN0IGVmaV9zcGFyX2luZGljYXRpb24gZWZpX3NwYXJfaW5kaWNhdGlvbjsKKworCWlmIChrc3RydG9pbnQoYnVmLCAxMCwgJnZhbCkpCisJCXJldHVybiAtRUlOVkFMOworCisJZWZpX3NwYXJfaW5kaWNhdGlvbi5ib290X3RvX3Rvb2wgPSB2YWw7CisJcmV0ID0gdmlzb3JjaGFubmVsX3dyaXRlCisJCShjb250cm9sdm1fY2hhbm5lbCwKKwkJIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAorCQkJICBlZmlfc3Bhcl9pbmQpLCAmKGVmaV9zcGFyX2luZGljYXRpb24pLAorCQkgc2l6ZW9mKHN0cnVjdCBlZmlfc3Bhcl9pbmRpY2F0aW9uKSk7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldHVybiBjb3VudDsKK30KIHN0YXRpYyBERVZJQ0VfQVRUUl9SVyhib290dG90b29sKTsKIAogc3RhdGljIHNzaXplX3QgZXJyb3Jfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICBjaGFyICpidWYpOworCQkJICBjaGFyICpidWYpCit7CisJdTMyIGVycm9yID0gMDsKKworCXZpc29yY2hhbm5lbF9yZWFkKGNvbnRyb2x2bV9jaGFubmVsLAorCQkJICBvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKKwkJCQkgICBpbnN0YWxsYXRpb25fZXJyb3IpLAorCQkJICAmZXJyb3IsIHNpemVvZih1MzIpKTsKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWlcbiIsIGVycm9yKTsKK30KKwogc3RhdGljIHNzaXplX3QgZXJyb3Jfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKKwkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXUzMiBlcnJvcjsKKwlpbnQgcmV0OworCisJaWYgKGtzdHJ0b3UzMihidWYsIDEwLCAmZXJyb3IpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IHZpc29yY2hhbm5lbF93cml0ZQorCQkoY29udHJvbHZtX2NoYW5uZWwsCisJCSBvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKKwkJCSAgaW5zdGFsbGF0aW9uX2Vycm9yKSwKKwkJICZlcnJvciwgc2l6ZW9mKHUzMikpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIGNvdW50OworfQogc3RhdGljIERFVklDRV9BVFRSX1JXKGVycm9yKTsKIAogc3RhdGljIHNzaXplX3QgdGV4dGlkX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgIGNoYXIgKmJ1Zik7CisJCQkgICBjaGFyICpidWYpCit7CisJdTMyIHRleHRfaWQgPSAwOworCisJdmlzb3JjaGFubmVsX3JlYWQKKwkJKGNvbnRyb2x2bV9jaGFubmVsLAorCQkgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCisJCQkgIGluc3RhbGxhdGlvbl90ZXh0X2lkKSwKKwkJICZ0ZXh0X2lkLCBzaXplb2YodTMyKSk7CisJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVpXG4iLCB0ZXh0X2lkKTsKK30KKwogc3RhdGljIHNzaXplX3QgdGV4dGlkX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOworCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXUzMiB0ZXh0X2lkOworCWludCByZXQ7CisKKwlpZiAoa3N0cnRvdTMyKGJ1ZiwgMTAsICZ0ZXh0X2lkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSB2aXNvcmNoYW5uZWxfd3JpdGUKKwkJKGNvbnRyb2x2bV9jaGFubmVsLAorCQkgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCisJCQkgIGluc3RhbGxhdGlvbl90ZXh0X2lkKSwKKwkJICZ0ZXh0X2lkLCBzaXplb2YodTMyKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gY291bnQ7Cit9CiBzdGF0aWMgREVWSUNFX0FUVFJfUlcodGV4dGlkKTsKIAogc3RhdGljIHNzaXplX3QgcmVtYWluaW5nX3N0ZXBzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKTsKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwl1MTYgcmVtYWluaW5nX3N0ZXBzID0gMDsKKworCXZpc29yY2hhbm5lbF9yZWFkKGNvbnRyb2x2bV9jaGFubmVsLAorCQkJICBvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKKwkJCQkgICBpbnN0YWxsYXRpb25fcmVtYWluaW5nX3N0ZXBzKSwKKwkJCSAgJnJlbWFpbmluZ19zdGVwcywgc2l6ZW9mKHUxNikpOworCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlaHVcbiIsIHJlbWFpbmluZ19zdGVwcyk7Cit9CisKIHN0YXRpYyBzc2l6ZV90IHJlbWFpbmluZ19zdGVwc19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXUxNiByZW1haW5pbmdfc3RlcHM7CisJaW50IHJldDsKKworCWlmIChrc3RydG91MTYoYnVmLCAxMCwgJnJlbWFpbmluZ19zdGVwcykpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gdmlzb3JjaGFubmVsX3dyaXRlCisJCShjb250cm9sdm1fY2hhbm5lbCwKKwkJIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAorCQkJICBpbnN0YWxsYXRpb25fcmVtYWluaW5nX3N0ZXBzKSwKKwkJICZyZW1haW5pbmdfc3RlcHMsIHNpemVvZih1MTYpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldHVybiBjb3VudDsKK30KIHN0YXRpYyBERVZJQ0VfQVRUUl9SVyhyZW1haW5pbmdfc3RlcHMpOwogCi1zdGF0aWMgc3NpemVfdCBkZXZpY2VkaXNhYmxlZF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7Ci1zdGF0aWMgREVWSUNFX0FUVFJfV08oZGV2aWNlZGlzYWJsZWQpOwotCi1zdGF0aWMgc3NpemVfdCBkZXZpY2VlbmFibGVkX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7Ci1zdGF0aWMgREVWSUNFX0FUVFJfV08oZGV2aWNlZW5hYmxlZCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp2aXNvcmNoaXBzZXRfaW5zdGFsbF9hdHRyc1tdID0gewotCSZkZXZfYXR0cl90b29sYWN0aW9uLmF0dHIsCi0JJmRldl9hdHRyX2Jvb3R0b3Rvb2wuYXR0ciwKLQkmZGV2X2F0dHJfZXJyb3IuYXR0ciwKLQkmZGV2X2F0dHJfdGV4dGlkLmF0dHIsCi0JJmRldl9hdHRyX3JlbWFpbmluZ19zdGVwcy5hdHRyLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHZpc29yY2hpcHNldF9pbnN0YWxsX2dyb3VwID0gewotCS5uYW1lID0gImluc3RhbGwiLAotCS5hdHRycyA9IHZpc29yY2hpcHNldF9pbnN0YWxsX2F0dHJzCi19OwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdmlzb3JjaGlwc2V0X3BhcmFob3RwbHVnX2F0dHJzW10gPSB7Ci0JJmRldl9hdHRyX2RldmljZWRpc2FibGVkLmF0dHIsCi0JJmRldl9hdHRyX2RldmljZWVuYWJsZWQuYXR0ciwKLQlOVUxMCi19OwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCB2aXNvcmNoaXBzZXRfcGFyYWhvdHBsdWdfZ3JvdXAgPSB7Ci0JLm5hbWUgPSAicGFyYWhvdHBsdWciLAotCS5hdHRycyA9IHZpc29yY2hpcHNldF9wYXJhaG90cGx1Z19hdHRycwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKnZpc29yY2hpcHNldF9kZXZfZ3JvdXBzW10gPSB7Ci0JJnZpc29yY2hpcHNldF9pbnN0YWxsX2dyb3VwLAotCSZ2aXNvcmNoaXBzZXRfcGFyYWhvdHBsdWdfZ3JvdXAsCi0JTlVMTAotfTsKLQotc3RhdGljIHZvaWQgdmlzb3JjaGlwc2V0X2Rldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLX0KLQotLyogL3N5cy9kZXZpY2VzL3BsYXRmb3JtL3Zpc29yY2hpcHNldCAqLwotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugdmlzb3JjaGlwc2V0X3BsYXRmb3JtX2RldmljZSA9IHsKLQkubmFtZSA9ICJ2aXNvcmNoaXBzZXQiLAotCS5pZCA9IC0xLAotCS5kZXYuZ3JvdXBzID0gdmlzb3JjaGlwc2V0X2Rldl9ncm91cHMsCi0JLmRldi5yZWxlYXNlID0gdmlzb3JjaGlwc2V0X2Rldl9yZWxlYXNlLAotfTsKLQotLyogRnVuY3Rpb24gcHJvdG90eXBlcyAqLwotc3RhdGljIHZvaWQgY29udHJvbHZtX3Jlc3BvbmQoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciAqbXNnX2hkciwKLQkJCSAgICAgIGludCByZXNwb25zZSk7Ci1zdGF0aWMgdm9pZCBjb250cm9sdm1fcmVzcG9uZF9jaGlwc2V0X2luaXQoCi0JCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgKm1zZ19oZHIsIGludCByZXNwb25zZSwKLQkJZW51bSB1bHRyYV9jaGlwc2V0X2ZlYXR1cmUgZmVhdHVyZXMpOwotc3RhdGljIHZvaWQgY29udHJvbHZtX3Jlc3BvbmRfcGh5c2Rldl9jaGFuZ2VzdGF0ZSgKLQkJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciAqbXNnX2hkciwgaW50IHJlc3BvbnNlLAotCQlzdHJ1Y3Qgc3Bhcl9zZWdtZW50X3N0YXRlIHN0YXRlKTsKLQotc3RhdGljIHZvaWQgcGFyc2VyX2RvbmUoc3RydWN0IHBhcnNlcl9jb250ZXh0ICpjdHgpOwotCi1zdGF0aWMgc3RydWN0IHBhcnNlcl9jb250ZXh0ICoKLXBhcnNlcl9pbml0X2J5dGVfc3RyZWFtKHU2NCBhZGRyLCB1MzIgYnl0ZXMsIGJvb2wgbG9jYWwsIGJvb2wgKnJldHJ5KQotewotCWludCBhbGxvY2J5dGVzID0gc2l6ZW9mKHN0cnVjdCBwYXJzZXJfY29udGV4dCkgKyBieXRlczsKLQlzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKmN0eDsKLQotCWlmIChyZXRyeSkKLQkJKnJldHJ5ID0gZmFsc2U7Ci0KLQkvKgotCSAqIGFsbG9jIGFuIDAgZXh0cmEgYnl0ZSB0byBlbnN1cmUgcGF5bG9hZCBpcwotCSAqICdcMCctdGVybWluYXRlZAotCSAqLwotCWFsbG9jYnl0ZXMrKzsKLQlpZiAoKGNvbnRyb2x2bV9wYXlsb2FkX2J5dGVzX2J1ZmZlcmVkICsgYnl0ZXMpCi0JICAgID4gTUFYX0NPTlRST0xWTV9QQVlMT0FEX0JZVEVTKSB7Ci0JCWlmIChyZXRyeSkKLQkJCSpyZXRyeSA9IHRydWU7Ci0JCXJldHVybiBOVUxMOwotCX0KLQljdHggPSBremFsbG9jKGFsbG9jYnl0ZXMsIEdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKLQlpZiAoIWN0eCkgewotCQlpZiAocmV0cnkpCi0JCQkqcmV0cnkgPSB0cnVlOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQljdHgtPmFsbG9jYnl0ZXMgPSBhbGxvY2J5dGVzOwotCWN0eC0+cGFyYW1fYnl0ZXMgPSBieXRlczsKLQljdHgtPmN1cnIgPSBOVUxMOwotCWN0eC0+Ynl0ZXNfcmVtYWluaW5nID0gMDsKLQljdHgtPmJ5dGVfc3RyZWFtID0gZmFsc2U7Ci0JaWYgKGxvY2FsKSB7Ci0JCXZvaWQgKnA7Ci0KLQkJaWYgKGFkZHIgPiB2aXJ0X3RvX3BoeXMoaGlnaF9tZW1vcnkgLSAxKSkKLQkJCWdvdG8gZXJyX2ZpbmlzaF9jdHg7Ci0JCXAgPSBfX3ZhKCh1bnNpZ25lZCBsb25nKShhZGRyKSk7Ci0JCW1lbWNweShjdHgtPmRhdGEsIHAsIGJ5dGVzKTsKLQl9IGVsc2UgewotCQl2b2lkICptYXBwaW5nID0gbWVtcmVtYXAoYWRkciwgYnl0ZXMsIE1FTVJFTUFQX1dCKTsKLQotCQlpZiAoIW1hcHBpbmcpCi0JCQlnb3RvIGVycl9maW5pc2hfY3R4OwotCQltZW1jcHkoY3R4LT5kYXRhLCBtYXBwaW5nLCBieXRlcyk7Ci0JCW1lbXVubWFwKG1hcHBpbmcpOwotCX0KLQotCWN0eC0+Ynl0ZV9zdHJlYW0gPSB0cnVlOwotCWNvbnRyb2x2bV9wYXlsb2FkX2J5dGVzX2J1ZmZlcmVkICs9IGN0eC0+cGFyYW1fYnl0ZXM7Ci0KLQlyZXR1cm4gY3R4OwotCi1lcnJfZmluaXNoX2N0eDoKLQlwYXJzZXJfZG9uZShjdHgpOwotCXJldHVybiBOVUxMOwotfQotCiBzdGF0aWMgdXVpZF9sZQogcGFyc2VyX2lkX2dldChzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKmN0eCkKIHsKQEAgLTM5Nyw4ICszNjAsOSBAQAogCXJldHVybiBwaGRyLT5pZDsKIH0KIAotLyoqIERlc2NyaWJlcyB0aGUgc3RhdGUgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2Ygd2hpY2ggY29udHJvbHZtIG1lc3NhZ2VzIGhhdmUKLSAqICBiZWVuIHJlY2VpdmVkIGZvciBhIGJ1cyBvciBkZXZpY2UuCisvKgorICogRGVzY3JpYmVzIHRoZSBzdGF0ZSBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB3aGljaCBjb250cm9sdm0gbWVzc2FnZXMgaGF2ZQorICogYmVlbiByZWNlaXZlZCBmb3IgYSBidXMgb3IgZGV2aWNlLgogICovCiAKIGVudW0gUEFSU0VSX1dISUNIX1NUUklORyB7CkBAIC00ODEsMTcwICs0NDUsNiBAQAogCXJldHVybiB2YWx1ZTsKIH0KIAotc3RhdGljIHNzaXplX3QgdG9vbGFjdGlvbl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgICBjaGFyICpidWYpCi17Ci0JdTggdG9vbF9hY3Rpb24gPSAwOwotCi0Jdmlzb3JjaGFubmVsX3JlYWQoY29udHJvbHZtX2NoYW5uZWwsCi0JCQkgIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAotCQkJCSAgIHRvb2xfYWN0aW9uKSwgJnRvb2xfYWN0aW9uLCBzaXplb2YodTgpKTsKLQlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIHRvb2xfYWN0aW9uKTsKLX0KLQotc3RhdGljIHNzaXplX3QgdG9vbGFjdGlvbl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0JdTggdG9vbF9hY3Rpb247Ci0JaW50IHJldDsKLQotCWlmIChrc3RydG91OChidWYsIDEwLCAmdG9vbF9hY3Rpb24pKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldCA9IHZpc29yY2hhbm5lbF93cml0ZQotCQkoY29udHJvbHZtX2NoYW5uZWwsCi0JCSBvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKLQkJCSAgdG9vbF9hY3Rpb24pLAotCQkgJnRvb2xfYWN0aW9uLCBzaXplb2YodTgpKTsKLQotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBib290dG90b29sX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgICAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgZWZpX3NwYXJfaW5kaWNhdGlvbiBlZmlfc3Bhcl9pbmRpY2F0aW9uOwotCi0Jdmlzb3JjaGFubmVsX3JlYWQoY29udHJvbHZtX2NoYW5uZWwsCi0JCQkgIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAotCQkJCSAgIGVmaV9zcGFyX2luZCksICZlZmlfc3Bhcl9pbmRpY2F0aW9uLAotCQkJICBzaXplb2Yoc3RydWN0IGVmaV9zcGFyX2luZGljYXRpb24pKTsKLQlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsCi0JCQkgZWZpX3NwYXJfaW5kaWNhdGlvbi5ib290X3RvX3Rvb2wpOwotfQotCi1zdGF0aWMgc3NpemVfdCBib290dG90b29sX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlpbnQgdmFsLCByZXQ7Ci0Jc3RydWN0IGVmaV9zcGFyX2luZGljYXRpb24gZWZpX3NwYXJfaW5kaWNhdGlvbjsKLQotCWlmIChrc3RydG9pbnQoYnVmLCAxMCwgJnZhbCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZWZpX3NwYXJfaW5kaWNhdGlvbi5ib290X3RvX3Rvb2wgPSB2YWw7Ci0JcmV0ID0gdmlzb3JjaGFubmVsX3dyaXRlCi0JCShjb250cm9sdm1fY2hhbm5lbCwKLQkJIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAotCQkJICBlZmlfc3Bhcl9pbmQpLCAmKGVmaV9zcGFyX2luZGljYXRpb24pLAotCQkgc2l6ZW9mKHN0cnVjdCBlZmlfc3Bhcl9pbmRpY2F0aW9uKSk7Ci0KLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3QgZXJyb3Jfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICBjaGFyICpidWYpCi17Ci0JdTMyIGVycm9yID0gMDsKLQotCXZpc29yY2hhbm5lbF9yZWFkKGNvbnRyb2x2bV9jaGFubmVsLAotCQkJICBvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKLQkJCQkgICBpbnN0YWxsYXRpb25fZXJyb3IpLAotCQkJICAmZXJyb3IsIHNpemVvZih1MzIpKTsKLQlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWlcbiIsIGVycm9yKTsKLX0KLQotc3RhdGljIHNzaXplX3QgZXJyb3Jfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXUzMiBlcnJvcjsKLQlpbnQgcmV0OwotCi0JaWYgKGtzdHJ0b3UzMihidWYsIDEwLCAmZXJyb3IpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldCA9IHZpc29yY2hhbm5lbF93cml0ZQotCQkoY29udHJvbHZtX2NoYW5uZWwsCi0JCSBvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKLQkJCSAgaW5zdGFsbGF0aW9uX2Vycm9yKSwKLQkJICZlcnJvciwgc2l6ZW9mKHUzMikpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCB0ZXh0aWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgY2hhciAqYnVmKQotewotCXUzMiB0ZXh0X2lkID0gMDsKLQotCXZpc29yY2hhbm5lbF9yZWFkCi0JCShjb250cm9sdm1fY2hhbm5lbCwKLQkJIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAotCQkJICBpbnN0YWxsYXRpb25fdGV4dF9pZCksCi0JCSAmdGV4dF9pZCwgc2l6ZW9mKHUzMikpOwotCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlaVxuIiwgdGV4dF9pZCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHRleHRpZF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXUzMiB0ZXh0X2lkOwotCWludCByZXQ7Ci0KLQlpZiAoa3N0cnRvdTMyKGJ1ZiwgMTAsICZ0ZXh0X2lkKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXQgPSB2aXNvcmNoYW5uZWxfd3JpdGUKLQkJKGNvbnRyb2x2bV9jaGFubmVsLAotCQkgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCi0JCQkgIGluc3RhbGxhdGlvbl90ZXh0X2lkKSwKLQkJICZ0ZXh0X2lkLCBzaXplb2YodTMyKSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHJlbWFpbmluZ19zdGVwc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQl1MTYgcmVtYWluaW5nX3N0ZXBzID0gMDsKLQotCXZpc29yY2hhbm5lbF9yZWFkKGNvbnRyb2x2bV9jaGFubmVsLAotCQkJICBvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKLQkJCQkgICBpbnN0YWxsYXRpb25fcmVtYWluaW5nX3N0ZXBzKSwKLQkJCSAgJnJlbWFpbmluZ19zdGVwcywgc2l6ZW9mKHUxNikpOwotCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlaHVcbiIsIHJlbWFpbmluZ19zdGVwcyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHJlbWFpbmluZ19zdGVwc19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXUxNiByZW1haW5pbmdfc3RlcHM7Ci0JaW50IHJldDsKLQotCWlmIChrc3RydG91MTYoYnVmLCAxMCwgJnJlbWFpbmluZ19zdGVwcykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0ID0gdmlzb3JjaGFubmVsX3dyaXRlCi0JCShjb250cm9sdm1fY2hhbm5lbCwKLQkJIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAotCQkJICBpbnN0YWxsYXRpb25fcmVtYWluaW5nX3N0ZXBzKSwKLQkJICZyZW1haW5pbmdfc3RlcHMsIHNpemVvZih1MTYpKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCXJldHVybiBjb3VudDsKLX0KLQogc3RydWN0IHZpc29yX2J1c2RldiB7CiAJdTMyIGJ1c19ubzsKIAl1MzIgZGV2X25vOwpAQCAtNjgzLDY0ICs0ODMsNiBAQAogCQl2ZGV2ID0gdG9fdmlzb3JfZGV2aWNlKGRldik7CiAJcmV0dXJuIHZkZXY7CiB9Ci1FWFBPUlRfU1lNQk9MKHZpc29yYnVzX2dldF9kZXZpY2VfYnlfaWQpOwotCi12b2lkCi12aXNvcmNoaXBzZXRfcmVnaXN0ZXJfYnVzZGV2KAotCQkJc3RydWN0IHZpc29yY2hpcHNldF9idXNkZXZfbm90aWZpZXJzICpub3RpZmllcnMsCi0JCQlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c2Rldl9yZXNwb25kZXJzICpyZXNwb25kZXJzLAotCQkJc3RydWN0IHVsdHJhX3ZidXNfZGV2aWNlaW5mbyAqZHJpdmVyX2luZm8pCi17Ci0JZG93bigmbm90aWZpZXJfbG9jayk7Ci0JaWYgKCFub3RpZmllcnMpIHsKLQkJbWVtc2V0KCZidXNkZXZfbm90aWZpZXJzLCAwLAotCQkgICAgICAgc2l6ZW9mKGJ1c2Rldl9ub3RpZmllcnMpKTsKLQkJdmlzb3JidXNyZWdpc3RlcmVkID0gMDsJLyogY2xlYXIgZmxhZyAqLwotCX0gZWxzZSB7Ci0JCWJ1c2Rldl9ub3RpZmllcnMgPSAqbm90aWZpZXJzOwotCQl2aXNvcmJ1c3JlZ2lzdGVyZWQgPSAxOwkvKiBzZXQgZmxhZyAqLwotCX0KLQlpZiAocmVzcG9uZGVycykKLQkJKnJlc3BvbmRlcnMgPSBidXNkZXZfcmVzcG9uZGVyczsKLQlpZiAoZHJpdmVyX2luZm8pCi0JCWJ1c19kZXZpY2VfaW5mb19pbml0KGRyaXZlcl9pbmZvLCAiY2hpcHNldCIsICJ2aXNvcmNoaXBzZXQiLAotCQkJCSAgICAgVkVSU0lPTiwgTlVMTCk7Ci0KLQl1cCgmbm90aWZpZXJfbG9jayk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoaXBzZXRfcmVnaXN0ZXJfYnVzZGV2KTsKLQotc3RhdGljIHZvaWQKLWNoaXBzZXRfaW5pdChzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgKmlubXNnKQotewotCXN0YXRpYyBpbnQgY2hpcHNldF9pbml0ZWQ7Ci0JZW51bSB1bHRyYV9jaGlwc2V0X2ZlYXR1cmUgZmVhdHVyZXMgPSAwOwotCWludCByYyA9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1M7Ci0KLQlQT1NUQ09ERV9MSU5VWF8yKENISVBTRVRfSU5JVF9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7Ci0JaWYgKGNoaXBzZXRfaW5pdGVkKSB7Ci0JCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0FMUkVBRFlfRE9ORTsKLQkJZ290byBvdXRfcmVzcG9uZDsKLQl9Ci0JY2hpcHNldF9pbml0ZWQgPSAxOwotCVBPU1RDT0RFX0xJTlVYXzIoQ0hJUFNFVF9JTklUX0VYSVRfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwotCi0JLyogU2V0IGZlYXR1cmVzIHRvIGluZGljYXRlIHdlIHN1cHBvcnQgcGFyYWhvdHBsdWcgKGlmIENvbW1hbmQKLQkgKiBhbHNvIHN1cHBvcnRzIGl0KS4KLQkgKi8KLQlmZWF0dXJlcyA9Ci0JICAgIGlubXNnLT5jbWQuaW5pdF9jaGlwc2V0LgotCSAgICBmZWF0dXJlcyAmIFVMVFJBX0NISVBTRVRfRkVBVFVSRV9QQVJBX0hPVFBMVUc7Ci0KLQkvKiBTZXQgdGhlICJyZXBseSIgYml0IHNvIENvbW1hbmQga25vd3MgdGhpcyBpcyBhCi0JICogZmVhdHVyZXMtYXdhcmUgZHJpdmVyLgotCSAqLwotCWZlYXR1cmVzIHw9IFVMVFJBX0NISVBTRVRfRkVBVFVSRV9SRVBMWTsKLQotb3V0X3Jlc3BvbmQ6Ci0JaWYgKGlubXNnLT5oZHIuZmxhZ3MucmVzcG9uc2VfZXhwZWN0ZWQpCi0JCWNvbnRyb2x2bV9yZXNwb25kX2NoaXBzZXRfaW5pdCgmaW5tc2ctPmhkciwgcmMsIGZlYXR1cmVzKTsKLX0KIAogc3RhdGljIHZvaWQKIGNvbnRyb2x2bV9pbml0X3Jlc3BvbnNlKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSAqbXNnLApAQCAtNzU4LDIxICs1MDAsNiBAQAogfQogCiBzdGF0aWMgdm9pZAotY29udHJvbHZtX3Jlc3BvbmQoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciAqbXNnX2hkciwgaW50IHJlc3BvbnNlKQotewotCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBvdXRtc2c7Ci0KLQljb250cm9sdm1faW5pdF9yZXNwb25zZSgmb3V0bXNnLCBtc2dfaGRyLCByZXNwb25zZSk7Ci0JaWYgKG91dG1zZy5oZHIuZmxhZ3MudGVzdF9tZXNzYWdlID09IDEpCi0JCXJldHVybjsKLQotCWlmICghdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChjb250cm9sdm1fY2hhbm5lbCwKLQkJCQkgICAgICAgQ09OVFJPTFZNX1FVRVVFX1JFUVVFU1QsICZvdXRtc2cpKSB7Ci0JCXJldHVybjsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCiBjb250cm9sdm1fcmVzcG9uZF9jaGlwc2V0X2luaXQoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciAqbXNnX2hkciwKIAkJCSAgICAgICBpbnQgcmVzcG9uc2UsCiAJCQkgICAgICAgZW51bSB1bHRyYV9jaGlwc2V0X2ZlYXR1cmUgZmVhdHVyZXMpCkBAIC03ODEsOCArNTA4LDU3IEBACiAKIAljb250cm9sdm1faW5pdF9yZXNwb25zZSgmb3V0bXNnLCBtc2dfaGRyLCByZXNwb25zZSk7CiAJb3V0bXNnLmNtZC5pbml0X2NoaXBzZXQuZmVhdHVyZXMgPSBmZWF0dXJlczsKLQlpZiAoIXZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoY29udHJvbHZtX2NoYW5uZWwsCi0JCQkJICAgICAgIENPTlRST0xWTV9RVUVVRV9SRVFVRVNULCAmb3V0bXNnKSkgeworCWlmICh2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KGNvbnRyb2x2bV9jaGFubmVsLAorCQkJCSAgICAgIENPTlRST0xWTV9RVUVVRV9SRVFVRVNULCAmb3V0bXNnKSkgeworCQlyZXR1cm47CisJfQorfQorCitzdGF0aWMgdm9pZAorY2hpcHNldF9pbml0KHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSAqaW5tc2cpCit7CisJc3RhdGljIGludCBjaGlwc2V0X2luaXRlZDsKKwllbnVtIHVsdHJhX2NoaXBzZXRfZmVhdHVyZSBmZWF0dXJlcyA9IDA7CisJaW50IHJjID0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUzsKKworCVBPU1RDT0RFX0xJTlVYXzIoQ0hJUFNFVF9JTklUX0VOVFJZX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKwlpZiAoY2hpcHNldF9pbml0ZWQpIHsKKwkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfQUxSRUFEWV9ET05FOworCQlnb3RvIG91dF9yZXNwb25kOworCX0KKwljaGlwc2V0X2luaXRlZCA9IDE7CisJUE9TVENPREVfTElOVVhfMihDSElQU0VUX0lOSVRfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CisKKwkvKgorCSAqIFNldCBmZWF0dXJlcyB0byBpbmRpY2F0ZSB3ZSBzdXBwb3J0IHBhcmFob3RwbHVnIChpZiBDb21tYW5kCisJICogYWxzbyBzdXBwb3J0cyBpdCkuCisJICovCisJZmVhdHVyZXMgPQorCSAgICBpbm1zZy0+Y21kLmluaXRfY2hpcHNldC4KKwkgICAgZmVhdHVyZXMgJiBVTFRSQV9DSElQU0VUX0ZFQVRVUkVfUEFSQV9IT1RQTFVHOworCisJLyoKKwkgKiBTZXQgdGhlICJyZXBseSIgYml0IHNvIENvbW1hbmQga25vd3MgdGhpcyBpcyBhCisJICogZmVhdHVyZXMtYXdhcmUgZHJpdmVyLgorCSAqLworCWZlYXR1cmVzIHw9IFVMVFJBX0NISVBTRVRfRkVBVFVSRV9SRVBMWTsKKworb3V0X3Jlc3BvbmQ6CisJaWYgKGlubXNnLT5oZHIuZmxhZ3MucmVzcG9uc2VfZXhwZWN0ZWQpCisJCWNvbnRyb2x2bV9yZXNwb25kX2NoaXBzZXRfaW5pdCgmaW5tc2ctPmhkciwgcmMsIGZlYXR1cmVzKTsKK30KKworc3RhdGljIHZvaWQKK2NvbnRyb2x2bV9yZXNwb25kKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgKm1zZ19oZHIsIGludCByZXNwb25zZSkKK3sKKwlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2Ugb3V0bXNnOworCisJY29udHJvbHZtX2luaXRfcmVzcG9uc2UoJm91dG1zZywgbXNnX2hkciwgcmVzcG9uc2UpOworCWlmIChvdXRtc2cuaGRyLmZsYWdzLnRlc3RfbWVzc2FnZSA9PSAxKQorCQlyZXR1cm47CisKKwlpZiAodmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChjb250cm9sdm1fY2hhbm5lbCwKKwkJCQkgICAgICBDT05UUk9MVk1fUVVFVUVfUkVRVUVTVCwgJm91dG1zZykpIHsKIAkJcmV0dXJuOwogCX0KIH0KQEAgLTc5Niw4ICs1NzIsOCBAQAogCWNvbnRyb2x2bV9pbml0X3Jlc3BvbnNlKCZvdXRtc2csIG1zZ19oZHIsIHJlc3BvbnNlKTsKIAlvdXRtc2cuY21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuc3RhdGUgPSBzdGF0ZTsKIAlvdXRtc2cuY21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuZmxhZ3MucGh5c19kZXZpY2UgPSAxOwotCWlmICghdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChjb250cm9sdm1fY2hhbm5lbCwKLQkJCQkgICAgICAgQ09OVFJPTFZNX1FVRVVFX1JFUVVFU1QsICZvdXRtc2cpKSB7CisJaWYgKHZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoY29udHJvbHZtX2NoYW5uZWwsCisJCQkJICAgICAgQ09OVFJPTFZNX1FVRVVFX1JFUVVFU1QsICZvdXRtc2cpKSB7CiAJCXJldHVybjsKIAl9CiB9CkBAIC04OTQsOCArNjcwLDggQEAKIAlvdXRtc2cuY21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuZGV2X25vID0gZGV2X25vOwogCW91dG1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZSA9IHJlc3BvbnNlX3N0YXRlOwogCi0JaWYgKCF2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KGNvbnRyb2x2bV9jaGFubmVsLAotCQkJCSAgICAgICBDT05UUk9MVk1fUVVFVUVfUkVRVUVTVCwgJm91dG1zZykpCisJaWYgKHZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoY29udHJvbHZtX2NoYW5uZWwsCisJCQkJICAgICAgQ09OVFJPTFZNX1FVRVVFX1JFUVVFU1QsICZvdXRtc2cpKQogCQlyZXR1cm47CiB9CiAKQEAgLTkyMCwyMCArNjk2LDIwIEBACiB7CiAJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciAqcG1zZ19oZHIgPSBOVUxMOwogCi0JZG93bigmbm90aWZpZXJfbG9jayk7Ci0KIAlpZiAoIWJ1c19pbmZvKSB7Ci0JCS8qIHJlbHlpbmcgb24gYSB2YWxpZCBwYXNzZWQgaW4gcmVzcG9uc2UgY29kZSAqLwotCQkvKiBiZSBsYXp5IGFuZCByZS11c2UgbXNnX2hkciBmb3IgdGhpcyBmYWlsdXJlLCBpcyB0aGlzIG9rPz8gKi8KKwkJLyoKKwkJICogcmVseWluZyBvbiBhIHZhbGlkIHBhc3NlZCBpbiByZXNwb25zZSBjb2RlCisJCSAqIGJlIGxhenkgYW5kIHJlLXVzZSBtc2dfaGRyIGZvciB0aGlzIGZhaWx1cmUsIGlzIHRoaXMgb2s/PworCQkgKi8KIAkJcG1zZ19oZHIgPSBtc2dfaGRyOwotCQlnb3RvIG91dF9yZXNwb25kX2FuZF91bmxvY2s7CisJCWdvdG8gb3V0X3Jlc3BvbmQ7CiAJfQogCiAJaWYgKGJ1c19pbmZvLT5wZW5kaW5nX21zZ19oZHIpIHsKIAkJLyogb25seSBub24tTlVMTCBpZiBkZXYgaXMgc3RpbGwgd2FpdGluZyBvbiBhIHJlc3BvbnNlICovCiAJCXJlc3BvbnNlID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX01FU1NBR0VfSURfSU5WQUxJRF9GT1JfQ0xJRU5UOwogCQlwbXNnX2hkciA9IGJ1c19pbmZvLT5wZW5kaW5nX21zZ19oZHI7Ci0JCWdvdG8gb3V0X3Jlc3BvbmRfYW5kX3VubG9jazsKKwkJZ290byBvdXRfcmVzcG9uZDsKIAl9CiAKIAlpZiAobmVlZF9yZXNwb25zZSkgewpAQCAtOTQyLDcgKzcxOCw3IEBACiAJCQlQT1NUQ09ERV9MSU5VWF80KE1BTExPQ19GQUlMVVJFX1BDLCBjbWQsCiAJCQkJCSBidXNfaW5mby0+Y2hpcHNldF9idXNfbm8sCiAJCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwotCQkJZ290byBvdXRfdW5sb2NrOworCQkJcmV0dXJuOwogCQl9CiAKIAkJbWVtY3B5KHBtc2dfaGRyLCBtc2dfaGRyLApAQCAtOTUzLDI1ICs3MjksMTYgQEAKIAlpZiAocmVzcG9uc2UgPT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgewogCQlzd2l0Y2ggKGNtZCkgewogCQljYXNlIENPTlRST0xWTV9CVVNfQ1JFQVRFOgotCQkJaWYgKGJ1c2Rldl9ub3RpZmllcnMuYnVzX2NyZWF0ZSkgewotCQkJCSgqYnVzZGV2X25vdGlmaWVycy5idXNfY3JlYXRlKSAoYnVzX2luZm8pOwotCQkJCWdvdG8gb3V0X3VubG9jazsKLQkJCX0KKwkJCWNoaXBzZXRfYnVzX2NyZWF0ZShidXNfaW5mbyk7CiAJCQlicmVhazsKIAkJY2FzZSBDT05UUk9MVk1fQlVTX0RFU1RST1k6Ci0JCQlpZiAoYnVzZGV2X25vdGlmaWVycy5idXNfZGVzdHJveSkgewotCQkJCSgqYnVzZGV2X25vdGlmaWVycy5idXNfZGVzdHJveSkgKGJ1c19pbmZvKTsKLQkJCQlnb3RvIG91dF91bmxvY2s7Ci0JCQl9CisJCQljaGlwc2V0X2J1c19kZXN0cm95KGJ1c19pbmZvKTsKIAkJCWJyZWFrOwogCQl9CiAJfQogCi1vdXRfcmVzcG9uZF9hbmRfdW5sb2NrOgorb3V0X3Jlc3BvbmQ6CiAJYnVzX3Jlc3BvbmRlcihjbWQsIHBtc2dfaGRyLCByZXNwb25zZSk7Ci0KLW91dF91bmxvY2s6Ci0JdXAoJm5vdGlmaWVyX2xvY2spOwogfQogCiBzdGF0aWMgdm9pZApAQCAtOTgwLDMxICs3NDcsMjkgQEAKIAkgICAgICBzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dfaGRyLCBpbnQgcmVzcG9uc2UsCiAJICAgICAgYm9vbCBuZWVkX3Jlc3BvbnNlLCBib29sIGZvcl92aXNvcmJ1cykKIHsKLQlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c2Rldl9ub3RpZmllcnMgKm5vdGlmaWVyczsKIAlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICpwbXNnX2hkciA9IE5VTEw7CiAKLQlub3RpZmllcnMgPSAmYnVzZGV2X25vdGlmaWVyczsKLQotCWRvd24oJm5vdGlmaWVyX2xvY2spOwogCWlmICghZGV2X2luZm8pIHsKLQkJLyogcmVseWluZyBvbiBhIHZhbGlkIHBhc3NlZCBpbiByZXNwb25zZSBjb2RlICovCi0JCS8qIGJlIGxhenkgYW5kIHJlLXVzZSBtc2dfaGRyIGZvciB0aGlzIGZhaWx1cmUsIGlzIHRoaXMgb2s/PyAqLworCQkvKgorCQkgKiByZWx5aW5nIG9uIGEgdmFsaWQgcGFzc2VkIGluIHJlc3BvbnNlIGNvZGUKKwkJICogYmUgbGF6eSBhbmQgcmUtdXNlIG1zZ19oZHIgZm9yIHRoaXMgZmFpbHVyZSwgaXMgdGhpcyBvaz8/CisJCSAqLwogCQlwbXNnX2hkciA9IG1zZ19oZHI7Ci0JCWdvdG8gb3V0X3Jlc3BvbmRfYW5kX3VubG9jazsKKwkJZ290byBvdXRfcmVzcG9uZDsKIAl9CiAKIAlpZiAoZGV2X2luZm8tPnBlbmRpbmdfbXNnX2hkcikgewogCQkvKiBvbmx5IG5vbi1OVUxMIGlmIGRldiBpcyBzdGlsbCB3YWl0aW5nIG9uIGEgcmVzcG9uc2UgKi8KIAkJcmVzcG9uc2UgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfTUVTU0FHRV9JRF9JTlZBTElEX0ZPUl9DTElFTlQ7CiAJCXBtc2dfaGRyID0gZGV2X2luZm8tPnBlbmRpbmdfbXNnX2hkcjsKLQkJZ290byBvdXRfcmVzcG9uZF9hbmRfdW5sb2NrOworCQlnb3RvIG91dF9yZXNwb25kOwogCX0KIAogCWlmIChuZWVkX3Jlc3BvbnNlKSB7CiAJCXBtc2dfaGRyID0ga3phbGxvYyhzaXplb2YoKnBtc2dfaGRyKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghcG1zZ19oZHIpIHsKIAkJCXJlc3BvbnNlID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0tNQUxMT0NfRkFJTEVEOwotCQkJZ290byBvdXRfcmVzcG9uZF9hbmRfdW5sb2NrOworCQkJZ290byBvdXRfcmVzcG9uZDsKIAkJfQogCiAJCW1lbWNweShwbXNnX2hkciwgbXNnX2hkciwKQEAgLTEwMTUsNDggKzc4MCwzNCBAQAogCWlmIChyZXNwb25zZSA+PSAwKSB7CiAJCXN3aXRjaCAoY21kKSB7CiAJCWNhc2UgQ09OVFJPTFZNX0RFVklDRV9DUkVBVEU6Ci0JCQlpZiAobm90aWZpZXJzLT5kZXZpY2VfY3JlYXRlKSB7Ci0JCQkJKCpub3RpZmllcnMtPmRldmljZV9jcmVhdGUpIChkZXZfaW5mbyk7Ci0JCQkJZ290byBvdXRfdW5sb2NrOwotCQkJfQorCQkJY2hpcHNldF9kZXZpY2VfY3JlYXRlKGRldl9pbmZvKTsKIAkJCWJyZWFrOwogCQljYXNlIENPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEU6CiAJCQkvKiBTZXJ2ZXJSZWFkeSAvIFNlcnZlclJ1bm5pbmcgLyBTZWdtZW50U3RhdGVSdW5uaW5nICovCiAJCQlpZiAoc3RhdGUuYWxpdmUgPT0gc2VnbWVudF9zdGF0ZV9ydW5uaW5nLmFsaXZlICYmCiAJCQkgICAgc3RhdGUub3BlcmF0aW5nID09CiAJCQkJc2VnbWVudF9zdGF0ZV9ydW5uaW5nLm9wZXJhdGluZykgewotCQkJCWlmIChub3RpZmllcnMtPmRldmljZV9yZXN1bWUpIHsKLQkJCQkJKCpub3RpZmllcnMtPmRldmljZV9yZXN1bWUpIChkZXZfaW5mbyk7Ci0JCQkJCWdvdG8gb3V0X3VubG9jazsKLQkJCQl9CisJCQkJY2hpcHNldF9kZXZpY2VfcmVzdW1lKGRldl9pbmZvKTsKIAkJCX0KIAkJCS8qIFNlcnZlck5vdFJlYWR5IC8gU2VydmVyTG9zdCAvIFNlZ21lbnRTdGF0ZVN0YW5kYnkgKi8KIAkJCWVsc2UgaWYgKHN0YXRlLmFsaXZlID09IHNlZ21lbnRfc3RhdGVfc3RhbmRieS5hbGl2ZSAmJgogCQkJCSBzdGF0ZS5vcGVyYXRpbmcgPT0KIAkJCQkgc2VnbWVudF9zdGF0ZV9zdGFuZGJ5Lm9wZXJhdGluZykgewotCQkJCS8qIHRlY2huaWNhbGx5IHRoaXMgaXMgc3RhbmRieSBjYXNlCisJCQkJLyoKKwkJCQkgKiB0ZWNobmljYWxseSB0aGlzIGlzIHN0YW5kYnkgY2FzZQogCQkJCSAqIHdoZXJlIHNlcnZlciBpcyBsb3N0CiAJCQkJICovCi0JCQkJaWYgKG5vdGlmaWVycy0+ZGV2aWNlX3BhdXNlKSB7Ci0JCQkJCSgqbm90aWZpZXJzLT5kZXZpY2VfcGF1c2UpIChkZXZfaW5mbyk7Ci0JCQkJCWdvdG8gb3V0X3VubG9jazsKLQkJCQl9CisJCQkJY2hpcHNldF9kZXZpY2VfcGF1c2UoZGV2X2luZm8pOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZOgotCQkJaWYgKG5vdGlmaWVycy0+ZGV2aWNlX2Rlc3Ryb3kpIHsKLQkJCQkoKm5vdGlmaWVycy0+ZGV2aWNlX2Rlc3Ryb3kpIChkZXZfaW5mbyk7Ci0JCQkJZ290byBvdXRfdW5sb2NrOwotCQkJfQorCQkJY2hpcHNldF9kZXZpY2VfZGVzdHJveShkZXZfaW5mbyk7CiAJCQlicmVhazsKIAkJfQogCX0KIAotb3V0X3Jlc3BvbmRfYW5kX3VubG9jazoKK291dF9yZXNwb25kOgogCWRldmljZV9yZXNwb25kZXIoY21kLCBwbXNnX2hkciwgcmVzcG9uc2UpOwotCi1vdXRfdW5sb2NrOgotCXVwKCZub3RpZmllcl9sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTExMDMsMTAgKzg1NCw4IEBACiAJCWdvdG8gb3V0X2J1c19lcGlsb2c7CiAJfQogCWJ1c19pbmZvLT52aXNvcmNoYW5uZWwgPSB2aXNvcmNoYW5uZWw7Ci0JaWYgKHV1aWRfbGVfY21wKGNtZC0+Y3JlYXRlX2J1cy5idXNfaW5zdF91dWlkLCBzcGFyX3Npb3ZtX3V1aWQpID09IDApIHsKLQkJZHVtcF92aGJhX2J1cyA9IGJ1c19ubzsKKwlpZiAodXVpZF9sZV9jbXAoY21kLT5jcmVhdGVfYnVzLmJ1c19pbnN0X3V1aWQsIHNwYXJfc2lvdm1fdXVpZCkgPT0gMCkKIAkJc2F2ZV9jcmFzaF9tZXNzYWdlKGlubXNnLCBDUkFTSF9CVVMpOwotCX0KIAogCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NSRUFURV9FWElUX1BDLCBidXNfbm8sIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwogCkBAIC0xMzAzLDExICsxMDUyLDE5IEBACiAJCQkgICAgICBpbm1zZy0+aGRyLmZsYWdzLnJlc3BvbnNlX2V4cGVjdGVkID09IDEsIDEpOwogfQogCi0vKiBXaGVuIHByb3ZpZGVkIHdpdGggdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGNvbnRyb2x2bSBjaGFubmVsCisvKioKKyAqIGluaXRpYWxpemVfY29udHJvbHZtX3BheWxvYWRfaW5mbygpIC0gaW5pdCBjb250cm9sdm1fcGF5bG9hZF9pbmZvIHN0cnVjdAorICogQHBoeXNfYWRkcjogdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgY29udHJvbHZtIGNoYW5uZWwKKyAqIEBvZmZzZXQ6ICAgIHRoZSBvZmZzZXQgdG8gcGF5bG9hZAorICogQGJ5dGVzOiAgICAgdGhlIHNpemUgb2YgdGhlIHBheWxvYWQgaW4gYnl0ZXMKKyAqIEBpbmZvOiAgICAgIHRoZSByZXR1cm5pbmcgdmFsaWQgc3RydWN0CisgKgorICogV2hlbiBwcm92aWRlZCB3aXRoIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBjb250cm9sdm0gY2hhbm5lbAogICogKHBoeXNfYWRkciksIHRoZSBvZmZzZXQgdG8gdGhlIHBheWxvYWQgYXJlYSB3ZSBuZWVkIHRvIG1hbmFnZQogICogKG9mZnNldCksIGFuZCB0aGUgc2l6ZSBvZiB0aGlzIHBheWxvYWQgYXJlYSAoYnl0ZXMpLCBmaWxscyBpbiB0aGUKLSAqIGNvbnRyb2x2bV9wYXlsb2FkX2luZm8gc3RydWN0LiAgUmV0dXJucyB0cnVlIGZvciBzdWNjZXNzIG9yIGZhbHNlCi0gKiBmb3IgZmFpbHVyZS4KKyAqIGNvbnRyb2x2bV9wYXlsb2FkX2luZm8gc3RydWN0LgorICoKKyAqIFJldHVybjogQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGZvciBmYWlsdXJlCiAgKi8KIHN0YXRpYyBpbnQKIGluaXRpYWxpemVfY29udHJvbHZtX3BheWxvYWRfaW5mbyh1NjQgcGh5c19hZGRyLCB1NjQgb2Zmc2V0LCB1MzIgYnl0ZXMsCkBAIC0xMzcxLDggKzExMjgsMzE1IEBACiAJCQkJCSAgJmNvbnRyb2x2bV9wYXlsb2FkX2luZm8pOwogfQogCi0vKiAgU2VuZCBBQ1RJT049b25saW5lIGZvciBERVZQQVRIPS9zeXMvZGV2aWNlcy9wbGF0Zm9ybS92aXNvcmNoaXBzZXQuCi0gKiAgUmV0dXJucyBDT05UUk9MVk1fUkVTUF94eHggY29kZS4KKy8qCisgKiBUaGUgZ2VuZXJhbCBwYXJhaG90cGx1ZyBmbG93IHdvcmtzIGFzIGZvbGxvd3MuIFRoZSB2aXNvcmNoaXBzZXQKKyAqIGRyaXZlciByZWNlaXZlcyBhIERFVklDRV9DSEFOR0VTVEFURSBtZXNzYWdlIGZyb20gQ29tbWFuZAorICogc3BlY2lmeWluZyBhIHBoeXNpY2FsIGRldmljZSB0byBlbmFibGUgb3IgZGlzYWJsZS4gVGhlIENPTlRST0xWTQorICogbWVzc2FnZSBoYW5kbGVyIGNhbGxzIHBhcmFob3RwbHVnX3Byb2Nlc3NfbWVzc2FnZSwgd2hpY2ggdGhlbiBhZGRzCisgKiB0aGUgbWVzc2FnZSB0byBhIGdsb2JhbCBsaXN0IGFuZCBraWNrcyBvZmYgYSB1ZGV2IGV2ZW50IHdoaWNoCisgKiBjYXVzZXMgYSB1c2VyIGxldmVsIHNjcmlwdCB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgc3BlY2lmaWVkCisgKiBkZXZpY2UuIFRoZSB1ZGV2IHNjcmlwdCB0aGVuIHdyaXRlcyB0bworICogL3Byb2Mvdmlzb3JjaGlwc2V0L3BhcmFob3RwbHVnLCB3aGljaCBjYXVzZXMgcGFyYWhvdHBsdWdfcHJvY193cml0ZQorICogdG8gZ2V0IGNhbGxlZCwgYXQgd2hpY2ggcG9pbnQgdGhlIGFwcHJvcHJpYXRlIENPTlRST0xWTSBtZXNzYWdlIGlzCisgKiByZXRyaWV2ZWQgZnJvbSB0aGUgbGlzdCBhbmQgcmVzcG9uZGVkIHRvLgorICovCisKKyNkZWZpbmUgUEFSQUhPVFBMVUdfVElNRU9VVF9NUyAyMDAwCisKKy8qKgorICogcGFyYWhvdHBsdWdfbmV4dF9pZCgpIC0gZ2VuZXJhdGUgdW5pcXVlIGludCB0byBtYXRjaCBhbiBvdXRzdGFuZGluZyBDT05UUk9MVk0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Ugd2l0aCBhIHVkZXYgc2NyaXB0IC9wcm9jIHJlc3BvbnNlCisgKgorICogUmV0dXJuOiBhIHVuaXF1ZSBpbnRlZ2VyIHZhbHVlCisgKi8KK3N0YXRpYyBpbnQKK3BhcmFob3RwbHVnX25leHRfaWQodm9pZCkKK3sKKwlzdGF0aWMgYXRvbWljX3QgaWQgPSBBVE9NSUNfSU5JVCgwKTsKKworCXJldHVybiBhdG9taWNfaW5jX3JldHVybigmaWQpOworfQorCisvKioKKyAqIHBhcmFob3RwbHVnX25leHRfZXhwaXJhdGlvbigpIC0gcmV0dXJucyB0aGUgdGltZSAoaW4gamlmZmllcykgd2hlbiBhCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRST0xWTSBtZXNzYWdlIG9uIHRoZSBsaXN0IHNob3VsZCBleHBpcmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gUEFSQUhPVFBMVUdfVElNRU9VVF9NUyBpbiB0aGUgZnV0dXJlCisgKgorICogUmV0dXJuOiBleHBlY3RlZCBleHBpcmF0aW9uIHRpbWUgKGluIGppZmZpZXMpCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nCitwYXJhaG90cGx1Z19uZXh0X2V4cGlyYXRpb24odm9pZCkKK3sKKwlyZXR1cm4gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoUEFSQUhPVFBMVUdfVElNRU9VVF9NUyk7Cit9CisKKy8qKgorICogcGFyYWhvdHBsdWdfcmVxdWVzdF9jcmVhdGUoKSAtIGNyZWF0ZSBhIHBhcmFob3RwbHVnX3JlcXVlc3QsIHdoaWNoIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzaWNhbGx5IGEgd3JhcHBlciBmb3IgYSBDT05UUk9MVk1fTUVTU0FHRQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2UgY2FuIHN0aWNrIG9uIGEgbGlzdAorICogQG1zZzogdGhlIG1lc3NhZ2UgdG8gaW5zZXJ0IGluIHRoZSByZXF1ZXN0CisgKgorICogUmV0dXJuOiB0aGUgcmVxdWVzdCBjb250YWluaW5nIHRoZSBwcm92aWRlZCBtZXNzYWdlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCAqCitwYXJhaG90cGx1Z19yZXF1ZXN0X2NyZWF0ZShzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgKm1zZykKK3sKKwlzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCAqcmVxOworCisJcmVxID0ga21hbGxvYyhzaXplb2YoKnJlcSksIEdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXEtPmlkID0gcGFyYWhvdHBsdWdfbmV4dF9pZCgpOworCXJlcS0+ZXhwaXJhdGlvbiA9IHBhcmFob3RwbHVnX25leHRfZXhwaXJhdGlvbigpOworCXJlcS0+bXNnID0gKm1zZzsKKworCXJldHVybiByZXE7Cit9CisKKy8qKgorICogcGFyYWhvdHBsdWdfcmVxdWVzdF9kZXN0cm95KCkgLSBmcmVlIGEgcGFyYWhvdHBsdWdfcmVxdWVzdAorICogQHJlcTogdGhlIHJlcXVlc3QgdG8gZGVhbGxvY2F0ZQorICovCitzdGF0aWMgdm9pZAorcGFyYWhvdHBsdWdfcmVxdWVzdF9kZXN0cm95KHN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICpyZXEpCit7CisJa2ZyZWUocmVxKTsKK30KKworc3RhdGljIExJU1RfSEVBRChwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3QpOworc3RhdGljIERFRklORV9TUElOTE9DSyhwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CS8qIGxvY2sgZm9yIGFib3ZlICovCisKKy8qKgorICogcGFyYWhvdHBsdWdfcmVxdWVzdF9jb21wbGV0ZSgpIC0gbWFyayByZXF1ZXN0IGFzIGNvbXBsZXRlCisgKiBAaWQ6ICAgICB0aGUgaWQgb2YgdGhlIHJlcXVlc3QKKyAqIEBhY3RpdmU6IGluZGljYXRlcyB3aGV0aGVyIHRoZSByZXF1ZXN0IGlzIGFzc2lnbmVkIHRvIGFjdGl2ZSBwYXJ0aXRpb24KKyAqCisgKiBDYWxsZWQgZnJvbSB0aGUgL3Byb2MgaGFuZGxlciwgd2hpY2ggbWVhbnMgdGhlIHVzZXIgc2NyaXB0IGhhcworICogZmluaXNoZWQgdGhlIGVuYWJsZS9kaXNhYmxlLiBGaW5kIHRoZSBtYXRjaGluZyBpZGVudGlmaWVyLCBhbmQKKyAqIHJlc3BvbmQgdG8gdGhlIENPTlRST0xWTSBtZXNzYWdlIHdpdGggc3VjY2Vzcy4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciAtRUlOVkFMIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludAorcGFyYWhvdHBsdWdfcmVxdWVzdF9jb21wbGV0ZShpbnQgaWQsIHUxNiBhY3RpdmUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKworCXNwaW5fbG9jaygmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOworCisJLyogTG9vayBmb3IgYSByZXF1ZXN0IG1hdGNoaW5nICJpZCIuICovCisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wLCAmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0KSB7CisJCXN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICpyZXEgPQorCQkgICAgbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0LCBsaXN0KTsKKwkJaWYgKHJlcS0+aWQgPT0gaWQpIHsKKwkJCS8qCisJCQkgKiBGb3VuZCBhIG1hdGNoLiBSZW1vdmUgaXQgZnJvbSB0aGUgbGlzdCBhbmQKKwkJCSAqIHJlc3BvbmQuCisJCQkgKi8KKwkJCWxpc3RfZGVsKHBvcyk7CisJCQlzcGluX3VubG9jaygmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOworCQkJcmVxLT5tc2cuY21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuc3RhdGUuYWN0aXZlID0gYWN0aXZlOworCQkJaWYgKHJlcS0+bXNnLmhkci5mbGFncy5yZXNwb25zZV9leHBlY3RlZCkKKwkJCQljb250cm9sdm1fcmVzcG9uZF9waHlzZGV2X2NoYW5nZXN0YXRlKAorCQkJCQkmcmVxLT5tc2cuaGRyLCBDT05UUk9MVk1fUkVTUF9TVUNDRVNTLAorCQkJCQlyZXEtPm1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZSk7CisJCQlwYXJhaG90cGx1Z19yZXF1ZXN0X2Rlc3Ryb3kocmVxKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJc3Bpbl91bmxvY2soJnBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoqCisgKiBkZXZpY2VkaXNhYmxlZF9zdG9yZSgpIC0gZGlzYWJsZXMgdGhlIGhvdHBsdWcgZGV2aWNlCisgKiBAZGV2OiAgIHN5c2ZzIGludGVyZmFjZSB2YXJpYWJsZSBub3QgdXRpbGl6ZWQgaW4gdGhpcyBmdW5jdGlvbgorICogQGF0dHI6ICBzeXNmcyBpbnRlcmZhY2UgdmFyaWFibGUgbm90IHV0aWxpemVkIGluIHRoaXMgZnVuY3Rpb24KKyAqIEBidWY6ICAgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRldmljZSBpZAorICogQGNvdW50OiB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyCisgKgorICogVGhlIHBhcmFob3RwbHVnL2RldmljZWRpc2FibGVkIGludGVyZmFjZSBnZXRzIGNhbGxlZCBieSBvdXIgc3VwcG9ydCBzY3JpcHQKKyAqIHdoZW4gYW4gU1ItSU9WIGRldmljZSBoYXMgYmVlbiBzaHV0IGRvd24uIFRoZSBJRCBpcyBwYXNzZWQgdG8gdGhlIHNjcmlwdAorICogYW5kIHRoZW4gcGFzc2VkIGJhY2sgd2hlbiB0aGUgZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQuCisgKgorICogUmV0dXJuOiB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGZvciBzdWNjZXNzIG9yIG5lZ2F0aXZlIGZvciBlcnJvcgorICovCitzdGF0aWMgc3NpemVfdCBkZXZpY2VkaXNhYmxlZF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBpbnQgaWQ7CisJaW50IGVycjsKKworCWlmIChrc3RydG91aW50KGJ1ZiwgMTAsICZpZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gcGFyYWhvdHBsdWdfcmVxdWVzdF9jb21wbGV0ZShpZCwgMCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIERFVklDRV9BVFRSX1dPKGRldmljZWRpc2FibGVkKTsKKworLyoqCisgKiBkZXZpY2VlbmFibGVkX3N0b3JlKCkgLSBlbmFibGVzIHRoZSBob3RwbHVnIGRldmljZQorICogQGRldjogICBzeXNmcyBpbnRlcmZhY2UgdmFyaWFibGUgbm90IHV0aWxpemVkIGluIHRoaXMgZnVuY3Rpb24KKyAqIEBhdHRyOiAgc3lzZnMgaW50ZXJmYWNlIHZhcmlhYmxlIG5vdCB1dGlsaXplZCBpbiB0aGlzIGZ1bmN0aW9uCisgKiBAYnVmOiAgIGJ1ZmZlciBjb250YWluaW5nIHRoZSBkZXZpY2UgaWQKKyAqIEBjb3VudDogdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcgorICoKKyAqIFRoZSBwYXJhaG90cGx1Zy9kZXZpY2VlbmFibGVkIGludGVyZmFjZSBnZXRzIGNhbGxlZCBieSBvdXIgc3VwcG9ydCBzY3JpcHQKKyAqIHdoZW4gYW4gU1ItSU9WIGRldmljZSBoYXMgYmVlbiByZWNvdmVyZWQuIFRoZSBJRCBpcyBwYXNzZWQgdG8gdGhlIHNjcmlwdAorICogYW5kIHRoZW4gcGFzc2VkIGJhY2sgd2hlbiB0aGUgZGV2aWNlIGhhcyBiZWVuIGJyb3VnaHQgYmFjayB1cC4KKyAqCisgKiBSZXR1cm46IHRoZSBzaXplIG9mIHRoZSBidWZmZXIgZm9yIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZm9yIGVycm9yCisgKi8KK3N0YXRpYyBzc2l6ZV90IGRldmljZWVuYWJsZWRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGludCBpZDsKKworCWlmIChrc3RydG91aW50KGJ1ZiwgMTAsICZpZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcGFyYWhvdHBsdWdfcmVxdWVzdF9jb21wbGV0ZShpZCwgMSk7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIERFVklDRV9BVFRSX1dPKGRldmljZWVuYWJsZWQpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdmlzb3JjaGlwc2V0X2luc3RhbGxfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfdG9vbGFjdGlvbi5hdHRyLAorCSZkZXZfYXR0cl9ib290dG90b29sLmF0dHIsCisJJmRldl9hdHRyX2Vycm9yLmF0dHIsCisJJmRldl9hdHRyX3RleHRpZC5hdHRyLAorCSZkZXZfYXR0cl9yZW1haW5pbmdfc3RlcHMuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCB2aXNvcmNoaXBzZXRfaW5zdGFsbF9ncm91cCA9IHsKKwkubmFtZSA9ICJpbnN0YWxsIiwKKwkuYXR0cnMgPSB2aXNvcmNoaXBzZXRfaW5zdGFsbF9hdHRycworfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnZpc29yY2hpcHNldF9wYXJhaG90cGx1Z19hdHRyc1tdID0geworCSZkZXZfYXR0cl9kZXZpY2VkaXNhYmxlZC5hdHRyLAorCSZkZXZfYXR0cl9kZXZpY2VlbmFibGVkLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgdmlzb3JjaGlwc2V0X3BhcmFob3RwbHVnX2dyb3VwID0geworCS5uYW1lID0gInBhcmFob3RwbHVnIiwKKwkuYXR0cnMgPSB2aXNvcmNoaXBzZXRfcGFyYWhvdHBsdWdfYXR0cnMKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICp2aXNvcmNoaXBzZXRfZGV2X2dyb3Vwc1tdID0geworCSZ2aXNvcmNoaXBzZXRfaW5zdGFsbF9ncm91cCwKKwkmdmlzb3JjaGlwc2V0X3BhcmFob3RwbHVnX2dyb3VwLAorCU5VTEwKK307CisKK3N0YXRpYyB2b2lkIHZpc29yY2hpcHNldF9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7Cit9CisKKy8qIC9zeXMvZGV2aWNlcy9wbGF0Zm9ybS92aXNvcmNoaXBzZXQgKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHZpc29yY2hpcHNldF9wbGF0Zm9ybV9kZXZpY2UgPSB7CisJLm5hbWUgPSAidmlzb3JjaGlwc2V0IiwKKwkuaWQgPSAtMSwKKwkuZGV2Lmdyb3VwcyA9IHZpc29yY2hpcHNldF9kZXZfZ3JvdXBzLAorCS5kZXYucmVsZWFzZSA9IHZpc29yY2hpcHNldF9kZXZfcmVsZWFzZSwKK307CisKKy8qKgorICogcGFyYWhvdHBsdWdfcmVxdWVzdF9raWNrb2ZmKCkgLSBpbml0aWF0ZSBwYXJhaG90cGx1ZyByZXF1ZXN0CisgKiBAcmVxOiB0aGUgcmVxdWVzdCB0byBpbml0aWF0ZQorICoKKyAqIENhdXNlIHVldmVudCB0byBydW4gdGhlIHVzZXIgbGV2ZWwgc2NyaXB0IHRvIGRvIHRoZSBkaXNhYmxlL2VuYWJsZSBzcGVjaWZpZWQKKyAqIGluIHRoZSBwYXJhaG90cGx1Z19yZXF1ZXN0LgorICovCitzdGF0aWMgdm9pZAorcGFyYWhvdHBsdWdfcmVxdWVzdF9raWNrb2ZmKHN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX3BhY2tldCAqY21kID0gJnJlcS0+bXNnLmNtZDsKKwljaGFyIGVudl9jbWRbNDBdLCBlbnZfaWRbNDBdLCBlbnZfc3RhdGVbNDBdLCBlbnZfYnVzWzQwXSwgZW52X2Rldls0MF0sCisJICAgIGVudl9mdW5jWzQwXTsKKwljaGFyICplbnZwW10gPSB7CisJCWVudl9jbWQsIGVudl9pZCwgZW52X3N0YXRlLCBlbnZfYnVzLCBlbnZfZGV2LCBlbnZfZnVuYywgTlVMTAorCX07CisKKwlzcHJpbnRmKGVudl9jbWQsICJTUEFSX1BBUkFIT1RQTFVHPTEiKTsKKwlzcHJpbnRmKGVudl9pZCwgIlNQQVJfUEFSQUhPVFBMVUdfSUQ9JWQiLCByZXEtPmlkKTsKKwlzcHJpbnRmKGVudl9zdGF0ZSwgIlNQQVJfUEFSQUhPVFBMVUdfU1RBVEU9JWQiLAorCQljbWQtPmRldmljZV9jaGFuZ2Vfc3RhdGUuc3RhdGUuYWN0aXZlKTsKKwlzcHJpbnRmKGVudl9idXMsICJTUEFSX1BBUkFIT1RQTFVHX0JVUz0lZCIsCisJCWNtZC0+ZGV2aWNlX2NoYW5nZV9zdGF0ZS5idXNfbm8pOworCXNwcmludGYoZW52X2RldiwgIlNQQVJfUEFSQUhPVFBMVUdfREVWSUNFPSVkIiwKKwkJY21kLT5kZXZpY2VfY2hhbmdlX3N0YXRlLmRldl9ubyA+PiAzKTsKKwlzcHJpbnRmKGVudl9mdW5jLCAiU1BBUl9QQVJBSE9UUExVR19GVU5DVElPTj0lZCIsCisJCWNtZC0+ZGV2aWNlX2NoYW5nZV9zdGF0ZS5kZXZfbm8gJiAweDcpOworCisJa29iamVjdF91ZXZlbnRfZW52KCZ2aXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlLmRldi5rb2JqLCBLT0JKX0NIQU5HRSwKKwkJCSAgIGVudnApOworfQorCisvKioKKyAqIHBhcmFob3RwbHVnX3Byb2Nlc3NfbWVzc2FnZSgpIC0gZW5hYmxlcyBvciBkaXNhYmxlcyBhIFBDSSBkZXZpY2UgYnkga2lja2luZworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmYgYSB1ZGV2IHNjcmlwdAorICogQGlubXNnOiB0aGUgbWVzc2FnZSBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUKKyAqLworc3RhdGljIHZvaWQKK3BhcmFob3RwbHVnX3Byb2Nlc3NfbWVzc2FnZShzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgKmlubXNnKQoreworCXN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICpyZXE7CisKKwlyZXEgPSBwYXJhaG90cGx1Z19yZXF1ZXN0X2NyZWF0ZShpbm1zZyk7CisKKwlpZiAoIXJlcSkKKwkJcmV0dXJuOworCisJaWYgKGlubXNnLT5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZS5hY3RpdmUpIHsKKwkJLyoKKwkJICogRm9yIGVuYWJsZSBtZXNzYWdlcywganVzdCByZXNwb25kIHdpdGggc3VjY2VzcworCQkgKiByaWdodCBhd2F5LiBUaGlzIGlzIGEgYml0IG9mIGEgaGFjaywgYnV0IHRoZXJlIGFyZQorCQkgKiBpc3N1ZXMgd2l0aCB0aGUgZWFybHkgZW5hYmxlIG1lc3NhZ2VzIHdlIGdldCAod2l0aAorCQkgKiBlaXRoZXIgdGhlIHVkZXYgc2NyaXB0IG5vdCBkZXRlY3RpbmcgdGhhdCB0aGUgZGV2aWNlCisJCSAqIGlzIHVwLCBvciBub3QgZ2V0dGluZyBjYWxsZWQgYXQgYWxsKS4gRm9ydHVuYXRlbHkKKwkJICogdGhlIG1lc3NhZ2VzIHRoYXQgZ2V0IGxvc3QgZG9uJ3QgbWF0dGVyIGFueXdheSwgYXMKKwkJICoKKwkJICogZGV2aWNlcyBhcmUgYXV0b21hdGljYWxseSBlbmFibGVkIGF0CisJCSAqIGluaXRpYWxpemF0aW9uLgorCQkqLworCQlwYXJhaG90cGx1Z19yZXF1ZXN0X2tpY2tvZmYocmVxKTsKKwkJY29udHJvbHZtX3Jlc3BvbmRfcGh5c2Rldl9jaGFuZ2VzdGF0ZQorCQkJKCZpbm1zZy0+aGRyLAorCQkJIENPTlRST0xWTV9SRVNQX1NVQ0NFU1MsCisJCQkgaW5tc2ctPmNtZC5kZXZpY2VfY2hhbmdlX3N0YXRlLnN0YXRlKTsKKwkJcGFyYWhvdHBsdWdfcmVxdWVzdF9kZXN0cm95KHJlcSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogRm9yIGRpc2FibGUgbWVzc2FnZXMsIGFkZCB0aGUgcmVxdWVzdCB0byB0aGUKKwkJICogcmVxdWVzdCBsaXN0IGJlZm9yZSBraWNraW5nIG9mZiB0aGUgdWRldiBzY3JpcHQuIEl0CisJCSAqIHdvbid0IGdldCByZXNwb25kZWQgdG8gdW50aWwgdGhlIHNjcmlwdCBoYXMKKwkJICogaW5kaWNhdGVkIGl0J3MgZG9uZS4KKwkJICovCisJCXNwaW5fbG9jaygmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOworCQlsaXN0X2FkZF90YWlsKCZyZXEtPmxpc3QsICZwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3QpOworCQlzcGluX3VubG9jaygmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOworCisJCXBhcmFob3RwbHVnX3JlcXVlc3Rfa2lja29mZihyZXEpOworCX0KK30KKworLyoqCisgKiB2aXNvcmNoaXBzZXRfY2hpcHNldF9yZWFkeSgpIC0gc2VuZHMgY2hpcHNldF9yZWFkeSBhY3Rpb24KKyAqCisgKiBTZW5kIEFDVElPTj1vbmxpbmUgZm9yIERFVlBBVEg9L3N5cy9kZXZpY2VzL3BsYXRmb3JtL3Zpc29yY2hpcHNldC4KKyAqCisgKiBSZXR1cm46IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MKICAqLwogc3RhdGljIGludAogdmlzb3JjaGlwc2V0X2NoaXBzZXRfcmVhZHkodm9pZCkKQEAgLTEzOTMsOCArMTQ1NywxMiBAQAogCXJldHVybiBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOwogfQogCi0vKiAgU2VuZCBBQ1RJT049b2ZmbGluZSBmb3IgREVWUEFUSD0vc3lzL2RldmljZXMvcGxhdGZvcm0vdmlzb3JjaGlwc2V0LgotICogIFJldHVybnMgQ09OVFJPTFZNX1JFU1BfeHh4IGNvZGUuCisvKioKKyAqIHZpc29yY2hpcHNldF9jaGlwc2V0X25vdHJlYWR5KCkgLSBzZW5kcyBjaGlwc2V0X25vdHJlYWR5IGFjdGlvbgorICoKKyAqIFNlbmQgQUNUSU9OPW9mZmxpbmUgZm9yIERFVlBBVEg9L3N5cy9kZXZpY2VzL3BsYXRmb3JtL3Zpc29yY2hpcHNldC4KKyAqCisgKiBSZXR1cm46IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MKICAqLwogc3RhdGljIGludAogdmlzb3JjaGlwc2V0X2NoaXBzZXRfbm90cmVhZHkodm9pZCkKQEAgLTE0MzYsMzM4ICsxNTA0LDYgQEAKIAkJY29udHJvbHZtX3Jlc3BvbmQobXNnX2hkciwgcmMpOwogfQogCi0vKiBUaGlzIGlzIHlvdXIgIm9uZS1zdG9wIiBzaG9wIGZvciBncmFiYmluZyB0aGUgbmV4dCBtZXNzYWdlIGZyb20gdGhlCi0gKiBDT05UUk9MVk1fUVVFVUVfRVZFTlQgcXVldWUgaW4gdGhlIGNvbnRyb2x2bSBjaGFubmVsLgotICovCi1zdGF0aWMgYm9vbAotcmVhZF9jb250cm9sdm1fZXZlbnQoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlICptc2cpCi17Ci0JaWYgKHZpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUoY29udHJvbHZtX2NoYW5uZWwsCi0JCQkJICAgICAgQ09OVFJPTFZNX1FVRVVFX0VWRU5ULCBtc2cpKSB7Ci0JCS8qIGdvdCBhIG1lc3NhZ2UgKi8KLQkJaWYgKG1zZy0+aGRyLmZsYWdzLnRlc3RfbWVzc2FnZSA9PSAxKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKgotICogVGhlIGdlbmVyYWwgcGFyYWhvdHBsdWcgZmxvdyB3b3JrcyBhcyBmb2xsb3dzLiAgVGhlIHZpc29yY2hpcHNldAotICogZHJpdmVyIHJlY2VpdmVzIGEgREVWSUNFX0NIQU5HRVNUQVRFIG1lc3NhZ2UgZnJvbSBDb21tYW5kCi0gKiBzcGVjaWZ5aW5nIGEgcGh5c2ljYWwgZGV2aWNlIHRvIGVuYWJsZSBvciBkaXNhYmxlLiAgVGhlIENPTlRST0xWTQotICogbWVzc2FnZSBoYW5kbGVyIGNhbGxzIHBhcmFob3RwbHVnX3Byb2Nlc3NfbWVzc2FnZSwgd2hpY2ggdGhlbiBhZGRzCi0gKiB0aGUgbWVzc2FnZSB0byBhIGdsb2JhbCBsaXN0IGFuZCBraWNrcyBvZmYgYSB1ZGV2IGV2ZW50IHdoaWNoCi0gKiBjYXVzZXMgYSB1c2VyIGxldmVsIHNjcmlwdCB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgc3BlY2lmaWVkCi0gKiBkZXZpY2UuICBUaGUgdWRldiBzY3JpcHQgdGhlbiB3cml0ZXMgdG8KLSAqIC9wcm9jL3Zpc29yY2hpcHNldC9wYXJhaG90cGx1Zywgd2hpY2ggY2F1c2VzIHBhcmFob3RwbHVnX3Byb2Nfd3JpdGUKLSAqIHRvIGdldCBjYWxsZWQsIGF0IHdoaWNoIHBvaW50IHRoZSBhcHByb3ByaWF0ZSBDT05UUk9MVk0gbWVzc2FnZSBpcwotICogcmV0cmlldmVkIGZyb20gdGhlIGxpc3QgYW5kIHJlc3BvbmRlZCB0by4KLSAqLwotCi0jZGVmaW5lIFBBUkFIT1RQTFVHX1RJTUVPVVRfTVMgMjAwMAotCi0vKgotICogR2VuZXJhdGUgdW5pcXVlIGludCB0byBtYXRjaCBhbiBvdXRzdGFuZGluZyBDT05UUk9MVk0gbWVzc2FnZSB3aXRoIGEKLSAqIHVkZXYgc2NyaXB0IC9wcm9jIHJlc3BvbnNlCi0gKi8KLXN0YXRpYyBpbnQKLXBhcmFob3RwbHVnX25leHRfaWQodm9pZCkKLXsKLQlzdGF0aWMgYXRvbWljX3QgaWQgPSBBVE9NSUNfSU5JVCgwKTsKLQotCXJldHVybiBhdG9taWNfaW5jX3JldHVybigmaWQpOwotfQotCi0vKgotICogUmV0dXJucyB0aGUgdGltZSAoaW4gamlmZmllcykgd2hlbiBhIENPTlRST0xWTSBtZXNzYWdlIG9uIHRoZSBsaXN0Ci0gKiBzaG91bGQgZXhwaXJlIC0tIFBBUkFIT1RQTFVHX1RJTUVPVVRfTVMgaW4gdGhlIGZ1dHVyZQotICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotcGFyYWhvdHBsdWdfbmV4dF9leHBpcmF0aW9uKHZvaWQpCi17Ci0JcmV0dXJuIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKFBBUkFIT1RQTFVHX1RJTUVPVVRfTVMpOwotfQotCi0vKgotICogQ3JlYXRlIGEgcGFyYWhvdHBsdWdfcmVxdWVzdCwgd2hpY2ggaXMgYmFzaWNhbGx5IGEgd3JhcHBlciBmb3IgYQotICogQ09OVFJPTFZNX01FU1NBR0UgdGhhdCB3ZSBjYW4gc3RpY2sgb24gYSBsaXN0Ci0gKi8KLXN0YXRpYyBzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCAqCi1wYXJhaG90cGx1Z19yZXF1ZXN0X2NyZWF0ZShzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgKm1zZykKLXsKLQlzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCAqcmVxOwotCi0JcmVxID0ga21hbGxvYyhzaXplb2YoKnJlcSksIEdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKLQlpZiAoIXJlcSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXEtPmlkID0gcGFyYWhvdHBsdWdfbmV4dF9pZCgpOwotCXJlcS0+ZXhwaXJhdGlvbiA9IHBhcmFob3RwbHVnX25leHRfZXhwaXJhdGlvbigpOwotCXJlcS0+bXNnID0gKm1zZzsKLQotCXJldHVybiByZXE7Ci19Ci0KLS8qCi0gKiBGcmVlIGEgcGFyYWhvdHBsdWdfcmVxdWVzdC4KLSAqLwotc3RhdGljIHZvaWQKLXBhcmFob3RwbHVnX3JlcXVlc3RfZGVzdHJveShzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCAqcmVxKQotewotCWtmcmVlKHJlcSk7Ci19Ci0KLS8qCi0gKiBDYXVzZSB1ZXZlbnQgdG8gcnVuIHRoZSB1c2VyIGxldmVsIHNjcmlwdCB0byBkbyB0aGUgZGlzYWJsZS9lbmFibGUKLSAqIHNwZWNpZmllZCBpbiAodGhlIENPTlRST0xWTSBtZXNzYWdlIGluKSB0aGUgc3BlY2lmaWVkCi0gKiBwYXJhaG90cGx1Z19yZXF1ZXN0Ci0gKi8KLXN0YXRpYyB2b2lkCi1wYXJhaG90cGx1Z19yZXF1ZXN0X2tpY2tvZmYoc3RydWN0IHBhcmFob3RwbHVnX3JlcXVlc3QgKnJlcSkKLXsKLQlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfcGFja2V0ICpjbWQgPSAmcmVxLT5tc2cuY21kOwotCWNoYXIgZW52X2NtZFs0MF0sIGVudl9pZFs0MF0sIGVudl9zdGF0ZVs0MF0sIGVudl9idXNbNDBdLCBlbnZfZGV2WzQwXSwKLQkgICAgZW52X2Z1bmNbNDBdOwotCWNoYXIgKmVudnBbXSA9IHsKLQkJZW52X2NtZCwgZW52X2lkLCBlbnZfc3RhdGUsIGVudl9idXMsIGVudl9kZXYsIGVudl9mdW5jLCBOVUxMCi0JfTsKLQotCXNwcmludGYoZW52X2NtZCwgIlNQQVJfUEFSQUhPVFBMVUc9MSIpOwotCXNwcmludGYoZW52X2lkLCAiU1BBUl9QQVJBSE9UUExVR19JRD0lZCIsIHJlcS0+aWQpOwotCXNwcmludGYoZW52X3N0YXRlLCAiU1BBUl9QQVJBSE9UUExVR19TVEFURT0lZCIsCi0JCWNtZC0+ZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZS5hY3RpdmUpOwotCXNwcmludGYoZW52X2J1cywgIlNQQVJfUEFSQUhPVFBMVUdfQlVTPSVkIiwKLQkJY21kLT5kZXZpY2VfY2hhbmdlX3N0YXRlLmJ1c19ubyk7Ci0Jc3ByaW50ZihlbnZfZGV2LCAiU1BBUl9QQVJBSE9UUExVR19ERVZJQ0U9JWQiLAotCQljbWQtPmRldmljZV9jaGFuZ2Vfc3RhdGUuZGV2X25vID4+IDMpOwotCXNwcmludGYoZW52X2Z1bmMsICJTUEFSX1BBUkFIT1RQTFVHX0ZVTkNUSU9OPSVkIiwKLQkJY21kLT5kZXZpY2VfY2hhbmdlX3N0YXRlLmRldl9ubyAmIDB4Nyk7Ci0KLQlrb2JqZWN0X3VldmVudF9lbnYoJnZpc29yY2hpcHNldF9wbGF0Zm9ybV9kZXZpY2UuZGV2LmtvYmosIEtPQkpfQ0hBTkdFLAotCQkJICAgZW52cCk7Ci19Ci0KLS8qCi0gKiBSZW1vdmUgYW55IHJlcXVlc3QgZnJvbSB0aGUgbGlzdCB0aGF0J3MgYmVlbiBvbiB0aGVyZSB0b28gbG9uZyBhbmQKLSAqIHJlc3BvbmQgd2l0aCBhbiBlcnJvci4KLSAqLwotc3RhdGljIHZvaWQKLXBhcmFob3RwbHVnX3Byb2Nlc3NfbGlzdCh2b2lkKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7Ci0KLQlzcGluX2xvY2soJnBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsKLQotCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRtcCwgJnBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdCkgewotCQlzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCAqcmVxID0KLQkJICAgIGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCwgbGlzdCk7Ci0KLQkJaWYgKCF0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHJlcS0+ZXhwaXJhdGlvbikpCi0JCQljb250aW51ZTsKLQotCQlsaXN0X2RlbChwb3MpOwotCQlpZiAocmVxLT5tc2cuaGRyLmZsYWdzLnJlc3BvbnNlX2V4cGVjdGVkKQotCQkJY29udHJvbHZtX3Jlc3BvbmRfcGh5c2Rldl9jaGFuZ2VzdGF0ZSgKLQkJCQkmcmVxLT5tc2cuaGRyLAotCQkJCUNPTlRST0xWTV9SRVNQX0VSUk9SX0RFVklDRV9VREVWX1RJTUVPVVQsCi0JCQkJcmVxLT5tc2cuY21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuc3RhdGUpOwotCQlwYXJhaG90cGx1Z19yZXF1ZXN0X2Rlc3Ryb3kocmVxKTsKLQl9Ci0KLQlzcGluX3VubG9jaygmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOwotfQotCi0vKgotICogQ2FsbGVkIGZyb20gdGhlIC9wcm9jIGhhbmRsZXIsIHdoaWNoIG1lYW5zIHRoZSB1c2VyIHNjcmlwdCBoYXMKLSAqIGZpbmlzaGVkIHRoZSBlbmFibGUvZGlzYWJsZS4gIEZpbmQgdGhlIG1hdGNoaW5nIGlkZW50aWZpZXIsIGFuZAotICogcmVzcG9uZCB0byB0aGUgQ09OVFJPTFZNIG1lc3NhZ2Ugd2l0aCBzdWNjZXNzLgotICovCi1zdGF0aWMgaW50Ci1wYXJhaG90cGx1Z19yZXF1ZXN0X2NvbXBsZXRlKGludCBpZCwgdTE2IGFjdGl2ZSkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdG1wOwotCi0Jc3Bpbl9sb2NrKCZwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7Ci0KLQkvKiBMb29rIGZvciBhIHJlcXVlc3QgbWF0Y2hpbmcgImlkIi4gKi8KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCB0bXAsICZwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3QpIHsKLQkJc3RydWN0IHBhcmFob3RwbHVnX3JlcXVlc3QgKnJlcSA9Ci0JCSAgICBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHBhcmFob3RwbHVnX3JlcXVlc3QsIGxpc3QpOwotCQlpZiAocmVxLT5pZCA9PSBpZCkgewotCQkJLyogRm91bmQgYSBtYXRjaC4gIFJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0IGFuZAotCQkJICogcmVzcG9uZC4KLQkJCSAqLwotCQkJbGlzdF9kZWwocG9zKTsKLQkJCXNwaW5fdW5sb2NrKCZwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7Ci0JCQlyZXEtPm1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZS5hY3RpdmUgPSBhY3RpdmU7Ci0JCQlpZiAocmVxLT5tc2cuaGRyLmZsYWdzLnJlc3BvbnNlX2V4cGVjdGVkKQotCQkJCWNvbnRyb2x2bV9yZXNwb25kX3BoeXNkZXZfY2hhbmdlc3RhdGUoCi0JCQkJCSZyZXEtPm1zZy5oZHIsIENPTlRST0xWTV9SRVNQX1NVQ0NFU1MsCi0JCQkJCXJlcS0+bXNnLmNtZC5kZXZpY2VfY2hhbmdlX3N0YXRlLnN0YXRlKTsKLQkJCXBhcmFob3RwbHVnX3JlcXVlc3RfZGVzdHJveShyZXEpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQlzcGluX3VubG9jaygmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOwotCXJldHVybiAtRUlOVkFMOwotfQotCi0vKgotICogRW5hYmxlcyBvciBkaXNhYmxlcyBhIFBDSSBkZXZpY2UgYnkga2lja2luZyBvZmYgYSB1ZGV2IHNjcmlwdAotICovCi1zdGF0aWMgdm9pZAotcGFyYWhvdHBsdWdfcHJvY2Vzc19tZXNzYWdlKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSAqaW5tc2cpCi17Ci0Jc3RydWN0IHBhcmFob3RwbHVnX3JlcXVlc3QgKnJlcTsKLQotCXJlcSA9IHBhcmFob3RwbHVnX3JlcXVlc3RfY3JlYXRlKGlubXNnKTsKLQotCWlmICghcmVxKQotCQlyZXR1cm47Ci0KLQlpZiAoaW5tc2ctPmNtZC5kZXZpY2VfY2hhbmdlX3N0YXRlLnN0YXRlLmFjdGl2ZSkgewotCQkvKiBGb3IgZW5hYmxlIG1lc3NhZ2VzLCBqdXN0IHJlc3BvbmQgd2l0aCBzdWNjZXNzCi0JCSogcmlnaHQgYXdheS4gIFRoaXMgaXMgYSBiaXQgb2YgYSBoYWNrLCBidXQgdGhlcmUgYXJlCi0JCSogaXNzdWVzIHdpdGggdGhlIGVhcmx5IGVuYWJsZSBtZXNzYWdlcyB3ZSBnZXQgKHdpdGgKLQkJKiBlaXRoZXIgdGhlIHVkZXYgc2NyaXB0IG5vdCBkZXRlY3RpbmcgdGhhdCB0aGUgZGV2aWNlCi0JCSogaXMgdXAsIG9yIG5vdCBnZXR0aW5nIGNhbGxlZCBhdCBhbGwpLiAgRm9ydHVuYXRlbHkKLQkJKiB0aGUgbWVzc2FnZXMgdGhhdCBnZXQgbG9zdCBkb24ndCBtYXR0ZXIgYW55d2F5LCBhcwotCQkqIGRldmljZXMgYXJlIGF1dG9tYXRpY2FsbHkgZW5hYmxlZCBhdAotCQkqIGluaXRpYWxpemF0aW9uLgotCQkqLwotCQlwYXJhaG90cGx1Z19yZXF1ZXN0X2tpY2tvZmYocmVxKTsKLQkJY29udHJvbHZtX3Jlc3BvbmRfcGh5c2Rldl9jaGFuZ2VzdGF0ZQotCQkJKCZpbm1zZy0+aGRyLAotCQkJIENPTlRST0xWTV9SRVNQX1NVQ0NFU1MsCi0JCQkgaW5tc2ctPmNtZC5kZXZpY2VfY2hhbmdlX3N0YXRlLnN0YXRlKTsKLQkJcGFyYWhvdHBsdWdfcmVxdWVzdF9kZXN0cm95KHJlcSk7Ci0JfSBlbHNlIHsKLQkJLyogRm9yIGRpc2FibGUgbWVzc2FnZXMsIGFkZCB0aGUgcmVxdWVzdCB0byB0aGUKLQkJKiByZXF1ZXN0IGxpc3QgYmVmb3JlIGtpY2tpbmcgb2ZmIHRoZSB1ZGV2IHNjcmlwdC4gIEl0Ci0JCSogd29uJ3QgZ2V0IHJlc3BvbmRlZCB0byB1bnRpbCB0aGUgc2NyaXB0IGhhcwotCQkqIGluZGljYXRlZCBpdCdzIGRvbmUuCi0JCSovCi0JCXNwaW5fbG9jaygmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOwotCQlsaXN0X2FkZF90YWlsKCZyZXEtPmxpc3QsICZwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3QpOwotCQlzcGluX3VubG9jaygmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOwotCi0JCXBhcmFob3RwbHVnX3JlcXVlc3Rfa2lja29mZihyZXEpOwotCX0KLX0KLQotLyogUHJvY2VzcyBhIGNvbnRyb2x2bSBtZXNzYWdlLgotICogUmV0dXJuIHJlc3VsdDoKLSAqICAgIGZhbHNlIC0gdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBmYWxzZSBvbmx5IGluIHRoZSBjYXNlIHdoZXJlIHRoZQotICogICAgICAgICAgICBjb250cm9sdm0gbWVzc2FnZSB3YXMgTk9UIHByb2Nlc3NlZCwgYnV0IHByb2Nlc3NpbmcgbXVzdCBiZQotICogICAgICAgICAgICByZXRyaWVkIGJlZm9yZSByZWFkaW5nIHRoZSBuZXh0IGNvbnRyb2x2bSBtZXNzYWdlOyBhCi0gKiAgICAgICAgICAgIHNjZW5hcmlvIHdoZXJlIHRoaXMgY2FuIG9jY3VyIGlzIHdoZW4gd2UgbmVlZCB0byB0aHJvdHRsZQotICogICAgICAgICAgICB0aGUgYWxsb2NhdGlvbiBvZiBtZW1vcnkgaW4gd2hpY2ggdG8gY29weSBvdXQgY29udHJvbHZtCi0gKiAgICAgICAgICAgIHBheWxvYWQgZGF0YQotICogICAgdHJ1ZSAgLSBwcm9jZXNzaW5nIG9mIHRoZSBjb250cm9sdm0gbWVzc2FnZSBjb21wbGV0ZWQsCi0gKiAgICAgICAgICAgIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvci4KLSAqLwotc3RhdGljIGJvb2wKLWhhbmRsZV9jb21tYW5kKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBpbm1zZywgdTY0IGNoYW5uZWxfYWRkcikKLXsKLQlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfcGFja2V0ICpjbWQgPSAmaW5tc2cuY21kOwotCXU2NCBwYXJtX2FkZHI7Ci0JdTMyIHBhcm1fYnl0ZXM7Ci0Jc3RydWN0IHBhcnNlcl9jb250ZXh0ICpwYXJzZXJfY3R4ID0gTlVMTDsKLQlib29sIGxvY2FsX2FkZHI7Ci0Jc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlIGFja21zZzsKLQotCS8qIGNyZWF0ZSBwYXJzaW5nIGNvbnRleHQgaWYgbmVjZXNzYXJ5ICovCi0JbG9jYWxfYWRkciA9IChpbm1zZy5oZHIuZmxhZ3MudGVzdF9tZXNzYWdlID09IDEpOwotCWlmIChjaGFubmVsX2FkZHIgPT0gMCkKLQkJcmV0dXJuIHRydWU7Ci0JcGFybV9hZGRyID0gY2hhbm5lbF9hZGRyICsgaW5tc2cuaGRyLnBheWxvYWRfdm1fb2Zmc2V0OwotCXBhcm1fYnl0ZXMgPSBpbm1zZy5oZHIucGF5bG9hZF9ieXRlczsKLQotCS8qIFBhcmFtZXRlciBhbmQgY2hhbm5lbCBhZGRyZXNzZXMgd2l0aGluIHRlc3QgbWVzc2FnZXMgYWN0dWFsbHkgbGllCi0JICogd2l0aGluIG91ciBPUy1jb250cm9sbGVkIG1lbW9yeS4gIFdlIG5lZWQgdG8ga25vdyB0aGF0LCBiZWNhdXNlIGl0Ci0JICogbWFrZXMgYSBkaWZmZXJlbmNlIGluIGhvdyB3ZSBjb21wdXRlIHRoZSB2aXJ0dWFsIGFkZHJlc3MuCi0JICovCi0JaWYgKHBhcm1fYWRkciAmJiBwYXJtX2J5dGVzKSB7Ci0JCWJvb2wgcmV0cnkgPSBmYWxzZTsKLQotCQlwYXJzZXJfY3R4ID0KLQkJICAgIHBhcnNlcl9pbml0X2J5dGVfc3RyZWFtKHBhcm1fYWRkciwgcGFybV9ieXRlcywKLQkJCQkJICAgIGxvY2FsX2FkZHIsICZyZXRyeSk7Ci0JCWlmICghcGFyc2VyX2N0eCAmJiByZXRyeSkKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlpZiAoIWxvY2FsX2FkZHIpIHsKLQkJY29udHJvbHZtX2luaXRfcmVzcG9uc2UoJmFja21zZywgJmlubXNnLmhkciwKLQkJCQkJQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUyk7Ci0JCWlmIChjb250cm9sdm1fY2hhbm5lbCkKLQkJCXZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoY29udHJvbHZtX2NoYW5uZWwsCi0JCQkJCQkgIENPTlRST0xWTV9RVUVVRV9BQ0ssCi0JCQkJCQkgICZhY2ttc2cpOwotCX0KLQlzd2l0Y2ggKGlubXNnLmhkci5pZCkgewotCWNhc2UgQ09OVFJPTFZNX0NISVBTRVRfSU5JVDoKLQkJY2hpcHNldF9pbml0KCZpbm1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgQ09OVFJPTFZNX0JVU19DUkVBVEU6Ci0JCWJ1c19jcmVhdGUoJmlubXNnKTsKLQkJYnJlYWs7Ci0JY2FzZSBDT05UUk9MVk1fQlVTX0RFU1RST1k6Ci0JCWJ1c19kZXN0cm95KCZpbm1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgQ09OVFJPTFZNX0JVU19DT05GSUdVUkU6Ci0JCWJ1c19jb25maWd1cmUoJmlubXNnLCBwYXJzZXJfY3R4KTsKLQkJYnJlYWs7Ci0JY2FzZSBDT05UUk9MVk1fREVWSUNFX0NSRUFURToKLQkJbXlfZGV2aWNlX2NyZWF0ZSgmaW5tc2cpOwotCQlicmVhazsKLQljYXNlIENPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEU6Ci0JCWlmIChjbWQtPmRldmljZV9jaGFuZ2Vfc3RhdGUuZmxhZ3MucGh5c19kZXZpY2UpIHsKLQkJCXBhcmFob3RwbHVnX3Byb2Nlc3NfbWVzc2FnZSgmaW5tc2cpOwotCQl9IGVsc2UgewotCQkJLyogc2F2ZSB0aGUgaGRyIGFuZCBjbWQgc3RydWN0dXJlcyBmb3IgbGF0ZXIgdXNlICovCi0JCQkvKiB3aGVuIHNlbmRpbmcgYmFjayB0aGUgcmVzcG9uc2UgdG8gQ29tbWFuZCAqLwotCQkJbXlfZGV2aWNlX2NoYW5nZXN0YXRlKCZpbm1zZyk7Ci0JCQlnX2RldmljZWNoYW5nZXN0YXRlX3BhY2tldCA9IGlubXNnLmNtZDsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZOgotCQlteV9kZXZpY2VfZGVzdHJveSgmaW5tc2cpOwotCQlicmVhazsKLQljYXNlIENPTlRST0xWTV9ERVZJQ0VfQ09ORklHVVJFOgotCQkvKiBubyBvcCBmb3Igbm93LCBqdXN0IHNlbmQgYSByZXNwb25kIHRoYXQgd2UgcGFzc2VkICovCi0JCWlmIChpbm1zZy5oZHIuZmxhZ3MucmVzcG9uc2VfZXhwZWN0ZWQpCi0JCQljb250cm9sdm1fcmVzcG9uZCgmaW5tc2cuaGRyLCBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKTsKLQkJYnJlYWs7Ci0JY2FzZSBDT05UUk9MVk1fQ0hJUFNFVF9SRUFEWToKLQkJY2hpcHNldF9yZWFkeSgmaW5tc2cuaGRyKTsKLQkJYnJlYWs7Ci0JY2FzZSBDT05UUk9MVk1fQ0hJUFNFVF9TRUxGVEVTVDoKLQkJY2hpcHNldF9zZWxmdGVzdCgmaW5tc2cuaGRyKTsKLQkJYnJlYWs7Ci0JY2FzZSBDT05UUk9MVk1fQ0hJUFNFVF9TVE9QOgotCQljaGlwc2V0X25vdHJlYWR5KCZpbm1zZy5oZHIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlpZiAoaW5tc2cuaGRyLmZsYWdzLnJlc3BvbnNlX2V4cGVjdGVkKQotCQkJY29udHJvbHZtX3Jlc3BvbmQKLQkJCQkoJmlubXNnLmhkciwKLQkJCQkgLUNPTlRST0xWTV9SRVNQX0VSUk9SX01FU1NBR0VfSURfVU5LTk9XTik7Ci0JCWJyZWFrOwotCX0KLQotCWlmIChwYXJzZXJfY3R4KSB7Ci0JCXBhcnNlcl9kb25lKHBhcnNlcl9jdHgpOwotCQlwYXJzZXJfY3R4ID0gTlVMTDsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CiBpc3N1ZV92bWNhbGxfaW9fY29udHJvbHZtX2FkZHIodTY0ICpjb250cm9sX2FkZHIsIHUzMiAqY29udHJvbF9ieXRlcykKIHsKQEAgLTE3OTYsNzYgKzE1MzIsNiBAQAogfQogCiBzdGF0aWMgdm9pZAotY29udHJvbHZtX3BlcmlvZGljX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBpbm1zZzsKLQlib29sIGdvdF9jb21tYW5kID0gZmFsc2U7Ci0JYm9vbCBoYW5kbGVfY29tbWFuZF9mYWlsZWQgPSBmYWxzZTsKLQotCS8qIG1ha2Ugc3VyZSB2aXNvcmJ1cyBzZXJ2ZXIgaXMgcmVnaXN0ZXJlZCBmb3IgY29udHJvbHZtIGNhbGxiYWNrcyAqLwotCWlmICh2aXNvcmNoaXBzZXRfdmlzb3JidXNyZWd3YWl0ICYmICF2aXNvcmJ1c3JlZ2lzdGVyZWQpCi0JCWdvdG8gY2xlYW51cDsKLQotCXdoaWxlICh2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKGNvbnRyb2x2bV9jaGFubmVsLAotCQkJCQkgQ09OVFJPTFZNX1FVRVVFX1JFU1BPTlNFLAotCQkJCQkgJmlubXNnKSkKLQkJOwotCWlmICghZ290X2NvbW1hbmQpIHsKLQkJaWYgKGNvbnRyb2x2bV9wZW5kaW5nX21zZ192YWxpZCkgewotCQkJLyogd2UgdGhyb3R0bGVkIHByb2Nlc3Npbmcgb2YgYSBwcmlvcgotCQkJKiBtc2csIHNvIHRyeSB0byBwcm9jZXNzIGl0IGFnYWluCi0JCQkqIHJhdGhlciB0aGFuIHJlYWRpbmcgYSBuZXcgb25lCi0JCQkqLwotCQkJaW5tc2cgPSBjb250cm9sdm1fcGVuZGluZ19tc2c7Ci0JCQljb250cm9sdm1fcGVuZGluZ19tc2dfdmFsaWQgPSBmYWxzZTsKLQkJCWdvdF9jb21tYW5kID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCWdvdF9jb21tYW5kID0gcmVhZF9jb250cm9sdm1fZXZlbnQoJmlubXNnKTsKLQkJfQotCX0KLQotCWhhbmRsZV9jb21tYW5kX2ZhaWxlZCA9IGZhbHNlOwotCXdoaWxlIChnb3RfY29tbWFuZCAmJiAoIWhhbmRsZV9jb21tYW5kX2ZhaWxlZCkpIHsKLQkJbW9zdF9yZWNlbnRfbWVzc2FnZV9qaWZmaWVzID0gamlmZmllczsKLQkJaWYgKGhhbmRsZV9jb21tYW5kKGlubXNnLAotCQkJCSAgIHZpc29yY2hhbm5lbF9nZXRfcGh5c2FkZHIKLQkJCQkgICAoY29udHJvbHZtX2NoYW5uZWwpKSkKLQkJCWdvdF9jb21tYW5kID0gcmVhZF9jb250cm9sdm1fZXZlbnQoJmlubXNnKTsKLQkJZWxzZSB7Ci0JCQkvKiB0aGlzIGlzIGEgc2NlbmFyaW8gd2hlcmUgdGhyb3R0bGluZwotCQkJKiBpcyByZXF1aXJlZCwgYnV0IHByb2JhYmx5IE5PVCBhbgotCQkJKiBlcnJvci4uLjsgd2Ugc3Rhc2ggdGhlIGN1cnJlbnQKLQkJCSogY29udHJvbHZtIG1zZyBzbyB3ZSB3aWxsIGF0dGVtcHQgdG8KLQkJCSogcmVwcm9jZXNzIGl0IG9uIG91ciBuZXh0IGxvb3AKLQkJCSovCi0JCQloYW5kbGVfY29tbWFuZF9mYWlsZWQgPSB0cnVlOwotCQkJY29udHJvbHZtX3BlbmRpbmdfbXNnID0gaW5tc2c7Ci0JCQljb250cm9sdm1fcGVuZGluZ19tc2dfdmFsaWQgPSB0cnVlOwotCQl9Ci0JfQotCi0JLyogcGFyYWhvdHBsdWdfd29ya2VyICovCi0JcGFyYWhvdHBsdWdfcHJvY2Vzc19saXN0KCk7Ci0KLWNsZWFudXA6Ci0KLQlpZiAodGltZV9hZnRlcihqaWZmaWVzLAotCQkgICAgICAgbW9zdF9yZWNlbnRfbWVzc2FnZV9qaWZmaWVzICsgKEhaICogTUlOX0lETEVfU0VDT05EUykpKSB7Ci0JCS8qIGl0J3MgYmVlbiBsb25nZXIgdGhhbiBNSU5fSURMRV9TRUNPTkRTIHNpbmNlIHdlCi0JCSogcHJvY2Vzc2VkIG91ciBsYXN0IGNvbnRyb2x2bSBtZXNzYWdlOyBzbG93IGRvd24gdGhlCi0JCSogcG9sbGluZwotCQkqLwotCQlpZiAocG9sbF9qaWZmaWVzICE9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfU0xPVykKLQkJCXBvbGxfamlmZmllcyA9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfU0xPVzsKLQl9IGVsc2UgewotCQlpZiAocG9sbF9qaWZmaWVzICE9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfRkFTVCkKLQkJCXBvbGxfamlmZmllcyA9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfRkFTVDsKLQl9Ci0KLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnBlcmlvZGljX2NvbnRyb2x2bV93b3JrLCBwb2xsX2ppZmZpZXMpOwotfQotCi1zdGF0aWMgdm9pZAogc2V0dXBfY3Jhc2hfZGV2aWNlc193b3JrX3F1ZXVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgbG9jYWxfY3Jhc2hfYnVzX21zZzsKQEAgLTE4NzQsMTMgKzE1NDAsNiBAQAogCXUzMiBsb2NhbF9jcmFzaF9tc2dfb2Zmc2V0OwogCXUxNiBsb2NhbF9jcmFzaF9tc2dfY291bnQ7CiAKLQkvKiBtYWtlIHN1cmUgdmlzb3JidXMgaXMgcmVnaXN0ZXJlZCBmb3IgY29udHJvbHZtIGNhbGxiYWNrcyAqLwotCWlmICh2aXNvcmNoaXBzZXRfdmlzb3JidXNyZWd3YWl0ICYmICF2aXNvcmJ1c3JlZ2lzdGVyZWQpIHsKLQkJcG9sbF9qaWZmaWVzID0gUE9MTEpJRkZJRVNfQ09OVFJPTFZNQ0hBTk5FTF9TTE9XOwotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnBlcmlvZGljX2NvbnRyb2x2bV93b3JrLCBwb2xsX2ppZmZpZXMpOwotCQlyZXR1cm47Ci0JfQotCiAJUE9TVENPREVfTElOVVhfMihDUkFTSF9ERVZfRU5UUllfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwogCiAJLyogc2VuZCBpbml0IGNoaXBzZXQgbXNnICovCkBAIC0xOTU4LDcgKzE2MTcsNyBAQAogCVBPU1RDT0RFX0xJTlVYXzIoQ1JBU0hfREVWX0VYSVRfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwogfQogCi1zdGF0aWMgdm9pZAordm9pZAogYnVzX2NyZWF0ZV9yZXNwb25zZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpidXNfaW5mbywgaW50IHJlc3BvbnNlKQogewogCWlmIChyZXNwb25zZSA+PSAwKQpAQCAtMTk3MSw3ICsxNjMwLDcgQEAKIAlidXNfaW5mby0+cGVuZGluZ19tc2dfaGRyID0gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQKK3ZvaWQKIGJ1c19kZXN0cm95X3Jlc3BvbnNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmJ1c19pbmZvLCBpbnQgcmVzcG9uc2UpCiB7CiAJYnVzX3Jlc3BvbmRlcihDT05UUk9MVk1fQlVTX0RFU1RST1ksIGJ1c19pbmZvLT5wZW5kaW5nX21zZ19oZHIsCkBAIC0xOTgxLDcgKzE2NDAsNyBAQAogCWJ1c19pbmZvLT5wZW5kaW5nX21zZ19oZHIgPSBOVUxMOwogfQogCi1zdGF0aWMgdm9pZAordm9pZAogZGV2aWNlX2NyZWF0ZV9yZXNwb25zZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXZfaW5mbywgaW50IHJlc3BvbnNlKQogewogCWlmIChyZXNwb25zZSA+PSAwKQpAQCAtMTk5NCw3ICsxNjUzLDcgQEAKIAlkZXZfaW5mby0+cGVuZGluZ19tc2dfaGRyID0gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQKK3ZvaWQKIGRldmljZV9kZXN0cm95X3Jlc3BvbnNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldl9pbmZvLCBpbnQgcmVzcG9uc2UpCiB7CiAJZGV2aWNlX3Jlc3BvbmRlcihDT05UUk9MVk1fREVWSUNFX0RFU1RST1ksIGRldl9pbmZvLT5wZW5kaW5nX21zZ19oZHIsCkBAIC0yMDA0LDkgKzE2NjMsOSBAQAogCWRldl9pbmZvLT5wZW5kaW5nX21zZ19oZHIgPSBOVUxMOwogfQogCi1zdGF0aWMgdm9pZAotdmlzb3JjaGlwc2V0X2RldmljZV9wYXVzZV9yZXNwb25zZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXZfaW5mbywKLQkJCQkgICBpbnQgcmVzcG9uc2UpCit2b2lkCitkZXZpY2VfcGF1c2VfcmVzcG9uc2Uoc3RydWN0IHZpc29yX2RldmljZSAqZGV2X2luZm8sCisJCSAgICAgIGludCByZXNwb25zZSkKIHsKIAlkZXZpY2VfY2hhbmdlc3RhdGVfcmVzcG9uZGVyKENPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEUsCiAJCQkJICAgICBkZXZfaW5mbywgcmVzcG9uc2UsCkBAIC0yMDE2LDcgKzE2NzUsNyBAQAogCWRldl9pbmZvLT5wZW5kaW5nX21zZ19oZHIgPSBOVUxMOwogfQogCi1zdGF0aWMgdm9pZAordm9pZAogZGV2aWNlX3Jlc3VtZV9yZXNwb25zZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXZfaW5mbywgaW50IHJlc3BvbnNlKQogewogCWRldmljZV9jaGFuZ2VzdGF0ZV9yZXNwb25kZXIoQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSwKQEAgLTIwMjcsNDAgKzE2ODYsNiBAQAogCWRldl9pbmZvLT5wZW5kaW5nX21zZ19oZHIgPSBOVUxMOwogfQogCi0vKiBUaGUgcGFyYWhvdHBsdWcvZGV2aWNlZGlzYWJsZWQgaW50ZXJmYWNlIGdldHMgY2FsbGVkIGJ5IG91ciBzdXBwb3J0IHNjcmlwdAotICogd2hlbiBhbiBTUi1JT1YgZGV2aWNlIGhhcyBiZWVuIHNodXQgZG93bi4gVGhlIElEIGlzIHBhc3NlZCB0byB0aGUgc2NyaXB0Ci0gKiBhbmQgdGhlbiBwYXNzZWQgYmFjayB3aGVuIHRoZSBkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZC4KLSAqLwotc3RhdGljIHNzaXplX3QgZGV2aWNlZGlzYWJsZWRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0JdW5zaWduZWQgaW50IGlkOwotCi0JaWYgKGtzdHJ0b3VpbnQoYnVmLCAxMCwgJmlkKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwYXJhaG90cGx1Z19yZXF1ZXN0X2NvbXBsZXRlKGlkLCAwKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLS8qIFRoZSBwYXJhaG90cGx1Zy9kZXZpY2VlbmFibGVkIGludGVyZmFjZSBnZXRzIGNhbGxlZCBieSBvdXIgc3VwcG9ydCBzY3JpcHQKLSAqIHdoZW4gYW4gU1ItSU9WIGRldmljZSBoYXMgYmVlbiByZWNvdmVyZWQuIFRoZSBJRCBpcyBwYXNzZWQgdG8gdGhlIHNjcmlwdAotICogYW5kIHRoZW4gcGFzc2VkIGJhY2sgd2hlbiB0aGUgZGV2aWNlIGhhcyBiZWVuIGJyb3VnaHQgYmFjayB1cC4KLSAqLwotc3RhdGljIHNzaXplX3QgZGV2aWNlZW5hYmxlZF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0JdW5zaWduZWQgaW50IGlkOwotCi0JaWYgKGtzdHJ0b3VpbnQoYnVmLCAxMCwgJmlkKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwYXJhaG90cGx1Z19yZXF1ZXN0X2NvbXBsZXRlKGlkLCAxKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KIHN0YXRpYyBpbnQKIHZpc29yY2hpcHNldF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKQEAgLTIxOTEsNiArMTgxNiwyOTggQEAKIAl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24obWFqb3JfZGV2LCAxKTsKIH0KIAorc3RhdGljIHN0cnVjdCBwYXJzZXJfY29udGV4dCAqCitwYXJzZXJfaW5pdF9ieXRlX3N0cmVhbSh1NjQgYWRkciwgdTMyIGJ5dGVzLCBib29sIGxvY2FsLCBib29sICpyZXRyeSkKK3sKKwlpbnQgYWxsb2NieXRlcyA9IHNpemVvZihzdHJ1Y3QgcGFyc2VyX2NvbnRleHQpICsgYnl0ZXM7CisJc3RydWN0IHBhcnNlcl9jb250ZXh0ICpjdHg7CisKKwlpZiAocmV0cnkpCisJCSpyZXRyeSA9IGZhbHNlOworCisJLyoKKwkgKiBhbGxvYyBhbiAwIGV4dHJhIGJ5dGUgdG8gZW5zdXJlIHBheWxvYWQgaXMKKwkgKiAnXDAnLXRlcm1pbmF0ZWQKKwkgKi8KKwlhbGxvY2J5dGVzKys7CisJaWYgKChjb250cm9sdm1fcGF5bG9hZF9ieXRlc19idWZmZXJlZCArIGJ5dGVzKQorCSAgICA+IE1BWF9DT05UUk9MVk1fUEFZTE9BRF9CWVRFUykgeworCQlpZiAocmV0cnkpCisJCQkqcmV0cnkgPSB0cnVlOworCQlyZXR1cm4gTlVMTDsKKwl9CisJY3R4ID0ga3phbGxvYyhhbGxvY2J5dGVzLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9SRVRSWSk7CisJaWYgKCFjdHgpIHsKKwkJaWYgKHJldHJ5KQorCQkJKnJldHJ5ID0gdHJ1ZTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY3R4LT5hbGxvY2J5dGVzID0gYWxsb2NieXRlczsKKwljdHgtPnBhcmFtX2J5dGVzID0gYnl0ZXM7CisJY3R4LT5jdXJyID0gTlVMTDsKKwljdHgtPmJ5dGVzX3JlbWFpbmluZyA9IDA7CisJY3R4LT5ieXRlX3N0cmVhbSA9IGZhbHNlOworCWlmIChsb2NhbCkgeworCQl2b2lkICpwOworCisJCWlmIChhZGRyID4gdmlydF90b19waHlzKGhpZ2hfbWVtb3J5IC0gMSkpCisJCQlnb3RvIGVycl9maW5pc2hfY3R4OworCQlwID0gX192YSgodW5zaWduZWQgbG9uZykoYWRkcikpOworCQltZW1jcHkoY3R4LT5kYXRhLCBwLCBieXRlcyk7CisJfSBlbHNlIHsKKwkJdm9pZCAqbWFwcGluZyA9IG1lbXJlbWFwKGFkZHIsIGJ5dGVzLCBNRU1SRU1BUF9XQik7CisKKwkJaWYgKCFtYXBwaW5nKQorCQkJZ290byBlcnJfZmluaXNoX2N0eDsKKwkJbWVtY3B5KGN0eC0+ZGF0YSwgbWFwcGluZywgYnl0ZXMpOworCQltZW11bm1hcChtYXBwaW5nKTsKKwl9CisKKwljdHgtPmJ5dGVfc3RyZWFtID0gdHJ1ZTsKKwljb250cm9sdm1fcGF5bG9hZF9ieXRlc19idWZmZXJlZCArPSBjdHgtPnBhcmFtX2J5dGVzOworCisJcmV0dXJuIGN0eDsKKworZXJyX2ZpbmlzaF9jdHg6CisJcGFyc2VyX2RvbmUoY3R4KTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBoYW5kbGVfY29tbWFuZCgpIC0gcHJvY2VzcyBhIGNvbnRyb2x2bSBtZXNzYWdlCisgKiBAaW5tc2c6ICAgICAgICB0aGUgbWVzc2FnZSB0byBwcm9jZXNzCisgKiBAY2hhbm5lbF9hZGRyOiBhZGRyZXNzIG9mIHRoZSBjb250cm9sdm0gY2hhbm5lbAorICoKKyAqIFJldHVybjoKKyAqICAgIGZhbHNlIC0gdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBmYWxzZSBvbmx5IGluIHRoZSBjYXNlIHdoZXJlIHRoZQorICogICAgICAgICAgICBjb250cm9sdm0gbWVzc2FnZSB3YXMgTk9UIHByb2Nlc3NlZCwgYnV0IHByb2Nlc3NpbmcgbXVzdCBiZQorICogICAgICAgICAgICByZXRyaWVkIGJlZm9yZSByZWFkaW5nIHRoZSBuZXh0IGNvbnRyb2x2bSBtZXNzYWdlOyBhCisgKiAgICAgICAgICAgIHNjZW5hcmlvIHdoZXJlIHRoaXMgY2FuIG9jY3VyIGlzIHdoZW4gd2UgbmVlZCB0byB0aHJvdHRsZQorICogICAgICAgICAgICB0aGUgYWxsb2NhdGlvbiBvZiBtZW1vcnkgaW4gd2hpY2ggdG8gY29weSBvdXQgY29udHJvbHZtCisgKiAgICAgICAgICAgIHBheWxvYWQgZGF0YQorICogICAgdHJ1ZSAgLSBwcm9jZXNzaW5nIG9mIHRoZSBjb250cm9sdm0gbWVzc2FnZSBjb21wbGV0ZWQsCisgKiAgICAgICAgICAgIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvcgorICovCitzdGF0aWMgYm9vbAoraGFuZGxlX2NvbW1hbmQoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlIGlubXNnLCB1NjQgY2hhbm5lbF9hZGRyKQoreworCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9wYWNrZXQgKmNtZCA9ICZpbm1zZy5jbWQ7CisJdTY0IHBhcm1fYWRkcjsKKwl1MzIgcGFybV9ieXRlczsKKwlzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKnBhcnNlcl9jdHggPSBOVUxMOworCWJvb2wgbG9jYWxfYWRkcjsKKwlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgYWNrbXNnOworCisJLyogY3JlYXRlIHBhcnNpbmcgY29udGV4dCBpZiBuZWNlc3NhcnkgKi8KKwlsb2NhbF9hZGRyID0gKGlubXNnLmhkci5mbGFncy50ZXN0X21lc3NhZ2UgPT0gMSk7CisJaWYgKGNoYW5uZWxfYWRkciA9PSAwKQorCQlyZXR1cm4gdHJ1ZTsKKwlwYXJtX2FkZHIgPSBjaGFubmVsX2FkZHIgKyBpbm1zZy5oZHIucGF5bG9hZF92bV9vZmZzZXQ7CisJcGFybV9ieXRlcyA9IGlubXNnLmhkci5wYXlsb2FkX2J5dGVzOworCisJLyoKKwkgKiBQYXJhbWV0ZXIgYW5kIGNoYW5uZWwgYWRkcmVzc2VzIHdpdGhpbiB0ZXN0IG1lc3NhZ2VzIGFjdHVhbGx5IGxpZQorCSAqIHdpdGhpbiBvdXIgT1MtY29udHJvbGxlZCBtZW1vcnkuIFdlIG5lZWQgdG8ga25vdyB0aGF0LCBiZWNhdXNlIGl0CisJICogbWFrZXMgYSBkaWZmZXJlbmNlIGluIGhvdyB3ZSBjb21wdXRlIHRoZSB2aXJ0dWFsIGFkZHJlc3MuCisJICovCisJaWYgKHBhcm1fYWRkciAmJiBwYXJtX2J5dGVzKSB7CisJCWJvb2wgcmV0cnkgPSBmYWxzZTsKKworCQlwYXJzZXJfY3R4ID0KKwkJICAgIHBhcnNlcl9pbml0X2J5dGVfc3RyZWFtKHBhcm1fYWRkciwgcGFybV9ieXRlcywKKwkJCQkJICAgIGxvY2FsX2FkZHIsICZyZXRyeSk7CisJCWlmICghcGFyc2VyX2N0eCAmJiByZXRyeSkKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAoIWxvY2FsX2FkZHIpIHsKKwkJY29udHJvbHZtX2luaXRfcmVzcG9uc2UoJmFja21zZywgJmlubXNnLmhkciwKKwkJCQkJQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUyk7CisJCWlmIChjb250cm9sdm1fY2hhbm5lbCkKKwkJCXZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoY29udHJvbHZtX2NoYW5uZWwsCisJCQkJCQkgIENPTlRST0xWTV9RVUVVRV9BQ0ssCisJCQkJCQkgICZhY2ttc2cpOworCX0KKwlzd2l0Y2ggKGlubXNnLmhkci5pZCkgeworCWNhc2UgQ09OVFJPTFZNX0NISVBTRVRfSU5JVDoKKwkJY2hpcHNldF9pbml0KCZpbm1zZyk7CisJCWJyZWFrOworCWNhc2UgQ09OVFJPTFZNX0JVU19DUkVBVEU6CisJCWJ1c19jcmVhdGUoJmlubXNnKTsKKwkJYnJlYWs7CisJY2FzZSBDT05UUk9MVk1fQlVTX0RFU1RST1k6CisJCWJ1c19kZXN0cm95KCZpbm1zZyk7CisJCWJyZWFrOworCWNhc2UgQ09OVFJPTFZNX0JVU19DT05GSUdVUkU6CisJCWJ1c19jb25maWd1cmUoJmlubXNnLCBwYXJzZXJfY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBDT05UUk9MVk1fREVWSUNFX0NSRUFURToKKwkJbXlfZGV2aWNlX2NyZWF0ZSgmaW5tc2cpOworCQlicmVhazsKKwljYXNlIENPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEU6CisJCWlmIChjbWQtPmRldmljZV9jaGFuZ2Vfc3RhdGUuZmxhZ3MucGh5c19kZXZpY2UpIHsKKwkJCXBhcmFob3RwbHVnX3Byb2Nlc3NfbWVzc2FnZSgmaW5tc2cpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIHNhdmUgdGhlIGhkciBhbmQgY21kIHN0cnVjdHVyZXMgZm9yIGxhdGVyIHVzZQorCQkJICogd2hlbiBzZW5kaW5nIGJhY2sgdGhlIHJlc3BvbnNlIHRvIENvbW1hbmQKKwkJCSAqLworCQkJbXlfZGV2aWNlX2NoYW5nZXN0YXRlKCZpbm1zZyk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIENPTlRST0xWTV9ERVZJQ0VfREVTVFJPWToKKwkJbXlfZGV2aWNlX2Rlc3Ryb3koJmlubXNnKTsKKwkJYnJlYWs7CisJY2FzZSBDT05UUk9MVk1fREVWSUNFX0NPTkZJR1VSRToKKwkJLyogbm8gb3AgZm9yIG5vdywganVzdCBzZW5kIGEgcmVzcG9uZCB0aGF0IHdlIHBhc3NlZCAqLworCQlpZiAoaW5tc2cuaGRyLmZsYWdzLnJlc3BvbnNlX2V4cGVjdGVkKQorCQkJY29udHJvbHZtX3Jlc3BvbmQoJmlubXNnLmhkciwgQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUyk7CisJCWJyZWFrOworCWNhc2UgQ09OVFJPTFZNX0NISVBTRVRfUkVBRFk6CisJCWNoaXBzZXRfcmVhZHkoJmlubXNnLmhkcik7CisJCWJyZWFrOworCWNhc2UgQ09OVFJPTFZNX0NISVBTRVRfU0VMRlRFU1Q6CisJCWNoaXBzZXRfc2VsZnRlc3QoJmlubXNnLmhkcik7CisJCWJyZWFrOworCWNhc2UgQ09OVFJPTFZNX0NISVBTRVRfU1RPUDoKKwkJY2hpcHNldF9ub3RyZWFkeSgmaW5tc2cuaGRyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKGlubXNnLmhkci5mbGFncy5yZXNwb25zZV9leHBlY3RlZCkKKwkJCWNvbnRyb2x2bV9yZXNwb25kCisJCQkJKCZpbm1zZy5oZHIsCisJCQkJIC1DT05UUk9MVk1fUkVTUF9FUlJPUl9NRVNTQUdFX0lEX1VOS05PV04pOworCQlicmVhazsKKwl9CisKKwlpZiAocGFyc2VyX2N0eCkgeworCQlwYXJzZXJfZG9uZShwYXJzZXJfY3R4KTsKKwkJcGFyc2VyX2N0eCA9IE5VTEw7CisJfQorCXJldHVybiB0cnVlOworfQorCisvKioKKyAqIHJlYWRfY29udHJvbHZtX2V2ZW50KCkgLSByZXRyZWl2ZXMgdGhlIG5leHQgbWVzc2FnZSBmcm9tIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRST0xWTV9RVUVVRV9FVkVOVCBxdWV1ZSBpbiB0aGUgY29udHJvbHZtCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbAorICogQG1zZzogcG9pbnRlciB0byB0aGUgcmV0cmlldmVkIG1lc3NhZ2UKKyAqCisgKiBSZXR1cm46IHRydWUgaWYgYSB2YWxpZCBtZXNzYWdlIHdhcyByZXRyaWV2ZWQgb3IgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBib29sCityZWFkX2NvbnRyb2x2bV9ldmVudChzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgKm1zZykKK3sKKwlpZiAoIXZpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUoY29udHJvbHZtX2NoYW5uZWwsCisJCQkJICAgICAgIENPTlRST0xWTV9RVUVVRV9FVkVOVCwgbXNnKSkgeworCQkvKiBnb3QgYSBtZXNzYWdlICovCisJCWlmIChtc2ctPmhkci5mbGFncy50ZXN0X21lc3NhZ2UgPT0gMSkKKwkJCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBwYXJhaG90cGx1Z19wcm9jZXNzX2xpc3QoKSAtIHJlbW92ZSBhbnkgcmVxdWVzdCBmcm9tIHRoZSBsaXN0IHRoYXQncyBiZWVuIG9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIHRvbyBsb25nIGFuZCByZXNwb25kIHdpdGggYW4gZXJyb3IKKyAqLworc3RhdGljIHZvaWQKK3BhcmFob3RwbHVnX3Byb2Nlc3NfbGlzdCh2b2lkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisKKwlzcGluX2xvY2soJnBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRtcCwgJnBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdCkgeworCQlzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCAqcmVxID0KKwkJICAgIGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCwgbGlzdCk7CisKKwkJaWYgKCF0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHJlcS0+ZXhwaXJhdGlvbikpCisJCQljb250aW51ZTsKKworCQlsaXN0X2RlbChwb3MpOworCQlpZiAocmVxLT5tc2cuaGRyLmZsYWdzLnJlc3BvbnNlX2V4cGVjdGVkKQorCQkJY29udHJvbHZtX3Jlc3BvbmRfcGh5c2Rldl9jaGFuZ2VzdGF0ZSgKKwkJCQkmcmVxLT5tc2cuaGRyLAorCQkJCUNPTlRST0xWTV9SRVNQX0VSUk9SX0RFVklDRV9VREVWX1RJTUVPVVQsCisJCQkJcmVxLT5tc2cuY21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuc3RhdGUpOworCQlwYXJhaG90cGx1Z19yZXF1ZXN0X2Rlc3Ryb3kocmVxKTsKKwl9CisKKwlzcGluX3VubG9jaygmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOworfQorCitzdGF0aWMgdm9pZAorY29udHJvbHZtX3BlcmlvZGljX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBpbm1zZzsKKwlib29sIGdvdF9jb21tYW5kID0gZmFsc2U7CisJYm9vbCBoYW5kbGVfY29tbWFuZF9mYWlsZWQgPSBmYWxzZTsKKworCXdoaWxlICghdmlzb3JjaGFubmVsX3NpZ25hbHJlbW92ZShjb250cm9sdm1fY2hhbm5lbCwKKwkJCQkJICBDT05UUk9MVk1fUVVFVUVfUkVTUE9OU0UsCisJCQkJCSAgJmlubXNnKSkKKwkJOworCWlmICghZ290X2NvbW1hbmQpIHsKKwkJaWYgKGNvbnRyb2x2bV9wZW5kaW5nX21zZ192YWxpZCkgeworCQkJLyoKKwkJCSAqIHdlIHRocm90dGxlZCBwcm9jZXNzaW5nIG9mIGEgcHJpb3IKKwkJCSAqIG1zZywgc28gdHJ5IHRvIHByb2Nlc3MgaXQgYWdhaW4KKwkJCSAqIHJhdGhlciB0aGFuIHJlYWRpbmcgYSBuZXcgb25lCisJCQkgKi8KKwkJCWlubXNnID0gY29udHJvbHZtX3BlbmRpbmdfbXNnOworCQkJY29udHJvbHZtX3BlbmRpbmdfbXNnX3ZhbGlkID0gZmFsc2U7CisJCQlnb3RfY29tbWFuZCA9IHRydWU7CisJCX0gZWxzZSB7CisJCQlnb3RfY29tbWFuZCA9IHJlYWRfY29udHJvbHZtX2V2ZW50KCZpbm1zZyk7CisJCX0KKwl9CisKKwloYW5kbGVfY29tbWFuZF9mYWlsZWQgPSBmYWxzZTsKKwl3aGlsZSAoZ290X2NvbW1hbmQgJiYgKCFoYW5kbGVfY29tbWFuZF9mYWlsZWQpKSB7CisJCW1vc3RfcmVjZW50X21lc3NhZ2VfamlmZmllcyA9IGppZmZpZXM7CisJCWlmIChoYW5kbGVfY29tbWFuZChpbm1zZywKKwkJCQkgICB2aXNvcmNoYW5uZWxfZ2V0X3BoeXNhZGRyCisJCQkJICAgKGNvbnRyb2x2bV9jaGFubmVsKSkpCisJCQlnb3RfY29tbWFuZCA9IHJlYWRfY29udHJvbHZtX2V2ZW50KCZpbm1zZyk7CisJCWVsc2UgeworCQkJLyoKKwkJCSAqIHRoaXMgaXMgYSBzY2VuYXJpbyB3aGVyZSB0aHJvdHRsaW5nCisJCQkgKiBpcyByZXF1aXJlZCwgYnV0IHByb2JhYmx5IE5PVCBhbgorCQkJICogZXJyb3IuLi47IHdlIHN0YXNoIHRoZSBjdXJyZW50CisJCQkgKiBjb250cm9sdm0gbXNnIHNvIHdlIHdpbGwgYXR0ZW1wdCB0bworCQkJICogcmVwcm9jZXNzIGl0IG9uIG91ciBuZXh0IGxvb3AKKwkJCSAqLworCQkJaGFuZGxlX2NvbW1hbmRfZmFpbGVkID0gdHJ1ZTsKKwkJCWNvbnRyb2x2bV9wZW5kaW5nX21zZyA9IGlubXNnOworCQkJY29udHJvbHZtX3BlbmRpbmdfbXNnX3ZhbGlkID0gdHJ1ZTsKKwkJfQorCX0KKworCS8qIHBhcmFob3RwbHVnX3dvcmtlciAqLworCXBhcmFob3RwbHVnX3Byb2Nlc3NfbGlzdCgpOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywKKwkJICAgICAgIG1vc3RfcmVjZW50X21lc3NhZ2VfamlmZmllcyArIChIWiAqIE1JTl9JRExFX1NFQ09ORFMpKSkgeworCQkvKgorCQkgKiBpdCdzIGJlZW4gbG9uZ2VyIHRoYW4gTUlOX0lETEVfU0VDT05EUyBzaW5jZSB3ZQorCQkgKiBwcm9jZXNzZWQgb3VyIGxhc3QgY29udHJvbHZtIG1lc3NhZ2U7IHNsb3cgZG93biB0aGUKKwkJICogcG9sbGluZworCQkgKi8KKwkJaWYgKHBvbGxfamlmZmllcyAhPSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX1NMT1cpCisJCQlwb2xsX2ppZmZpZXMgPSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX1NMT1c7CisJfSBlbHNlIHsKKwkJaWYgKHBvbGxfamlmZmllcyAhPSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX0ZBU1QpCisJCQlwb2xsX2ppZmZpZXMgPSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX0ZBU1Q7CisJfQorCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwZXJpb2RpY19jb250cm9sdm1fd29yaywgcG9sbF9qaWZmaWVzKTsKK30KKwogc3RhdGljIGludAogdmlzb3JjaGlwc2V0X2luaXQoc3RydWN0IGFjcGlfZGV2aWNlICphY3BpX2RldmljZSkKIHsKQEAgLTIyMDIsNyArMjExOSw2IEBACiAJaWYgKCFhZGRyKQogCQlnb3RvIGVycm9yOwogCi0JbWVtc2V0KCZidXNkZXZfbm90aWZpZXJzLCAwLCBzaXplb2YoYnVzZGV2X25vdGlmaWVycykpOwogCW1lbXNldCgmY29udHJvbHZtX3BheWxvYWRfaW5mbywgMCwgc2l6ZW9mKGNvbnRyb2x2bV9wYXlsb2FkX2luZm8pKTsKIAogCWNvbnRyb2x2bV9jaGFubmVsID0gdmlzb3JjaGFubmVsX2NyZWF0ZV93aXRoX2xvY2soYWRkciwgMCwKQEAgLTIzNDEsMTUgKzIyNTcsMTAgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChtYWpvciwgdmlzb3JjaGlwc2V0X21ham9yLCBpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyh2aXNvcmNoaXBzZXRfbWFqb3IsCiAJCSAibWFqb3IgZGV2aWNlIG51bWJlciB0byB1c2UgZm9yIHRoZSBkZXZpY2Ugbm9kZSIpOwotbW9kdWxlX3BhcmFtX25hbWVkKHZpc29yYnVzcmVnd2FpdCwgdmlzb3JjaGlwc2V0X3Zpc29yYnVzcmVnd2FpdCwgaW50LCBTX0lSVUdPKTsKLU1PRFVMRV9QQVJNX0RFU0Modmlzb3JjaGlwc2V0X3Zpc29yYnVzcmVnd2FpdCwKLQkJICIxIHRvIGhhdmUgdGhlIG1vZHVsZSB3YWl0IGZvciB0aGUgdmlzb3IgYnVzIHRvIHJlZ2lzdGVyIik7CiAKIG1vZHVsZV9pbml0KGluaXRfdW5pc3lzKTsKIG1vZHVsZV9leGl0KGV4aXRfdW5pc3lzKTsKIAogTU9EVUxFX0FVVEhPUigiVW5pc3lzIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlN1cGVydmlzb3IgY2hpcHNldCBkcml2ZXIgZm9yIHNlcnZpY2UgcGFydGl0aW9uOiB2ZXIgIgotCQkgICBWRVJTSU9OKTsKLU1PRFVMRV9WRVJTSU9OKFZFUlNJT04pOworTU9EVUxFX0RFU0NSSVBUSU9OKCJzLVBhciB2aXNvcmJ1cyBkcml2ZXIgZm9yIHZpcnR1YWwgZGV2aWNlIGJ1c2VzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3ZtY2FsbGludGVyZmFjZS5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy92bWNhbGxpbnRlcmZhY2UuaAppbmRleCBjMDQzZmE0Li44NmU2OTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3ZtY2FsbGludGVyZmFjZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvdm1jYWxsaW50ZXJmYWNlLmgKQEAgLTIwLDExICsyMCwzOSBAQAogKiBWaXJ0dWFsaXphdGlvbi4gIFRoZSBWTUNBTExzIGFyZSBwcm92aWRlZCBieSBNb25pdG9yIGFuZCB1c2VkIGJ5IElPIGNvZGUKICogcnVubmluZyBvbiBJTyBQYXJ0aXRpb25zLgogKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworX191bmlzeXNfdm1jYWxsX2dudWModW5zaWduZWQgbG9uZyB0dXBsZSwgdW5zaWduZWQgbG9uZyByZWdfZWJ4LAorCQkgICAgIHVuc2lnbmVkIGxvbmcgcmVnX2VjeCkKK3sKKwl1bnNpZ25lZCBsb25nIHJlc3VsdCA9IDA7CisJdW5zaWduZWQgaW50IGNwdWlkX2VheCwgY3B1aWRfZWJ4LCBjcHVpZF9lY3gsIGNwdWlkX2VkeDsKIAotI2lmZGVmIF9fR05VQ19fCi0jaW5jbHVkZSAiaW92bWNhbGxfZ251Yy5oIgotI2VuZGlmCS8qICAqLwotI2luY2x1ZGUgImRpYWdjaGFubmVsLmgiCisJY3B1aWQoMHgwMDAwMDAwMSwgJmNwdWlkX2VheCwgJmNwdWlkX2VieCwgJmNwdWlkX2VjeCwgJmNwdWlkX2VkeCk7CisJaWYgKCEoY3B1aWRfZWN4ICYgMHg4MDAwMDAwMCkpCisJCXJldHVybiAtRVBFUk07CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygiLmJ5dGUgMHgwMGYsIDB4MDAxLCAweDBjMSIgOiAiPWEiKHJlc3VsdCkgOgorCQkiYSIodHVwbGUpLCAiYiIocmVnX2VieCksICJjIihyZWdfZWN4KSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitfX3VuaXN5c19leHRlbmRlZF92bWNhbGxfZ251Yyh1bnNpZ25lZCBsb25nIGxvbmcgdHVwbGUsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgcmVnX2VieCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyByZWdfZWN4LAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHJlZ19lZHgpCit7CisJdW5zaWduZWQgbG9uZyByZXN1bHQgPSAwOworCXVuc2lnbmVkIGludCBjcHVpZF9lYXgsIGNwdWlkX2VieCwgY3B1aWRfZWN4LCBjcHVpZF9lZHg7CisKKwljcHVpZCgweDAwMDAwMDAxLCAmY3B1aWRfZWF4LCAmY3B1aWRfZWJ4LCAmY3B1aWRfZWN4LCAmY3B1aWRfZWR4KTsKKwlpZiAoIShjcHVpZF9lY3ggJiAweDgwMDAwMDAwKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCIuYnl0ZSAweDAwZiwgMHgwMDEsIDB4MGMxIiA6ICI9YSIocmVzdWx0KSA6CisJCSJhIih0dXBsZSksICJiIihyZWdfZWJ4KSwgImMiKHJlZ19lY3gpLCAiZCIocmVnX2VkeCkpOworCXJldHVybiByZXN1bHQ7Cit9CiAKICNpZmRlZiBWTUNBTExfSU9fQ09OVFJPTFZNX0FERFIKICN1bmRlZiBWTUNBTExfSU9fQ09OVFJPTFZNX0FERFIKQEAgLTU3LDcgKzg1LDYgQEAKICNkZWZpbmUgVk1DQUxMX1NVQ0NFU1MgMAogI2RlZmluZSBWTUNBTExfU1VDQ0VTU0ZVTChyZXN1bHQpCShyZXN1bHQgPT0gMCkKIAotI2lmZGVmIF9fR05VQ19fCiAjZGVmaW5lIHVuaXN5c192bWNhbGwodHVwbGUsIHJlZ19lYngsIHJlZ19lY3gpIFwKIAlfX3VuaXN5c192bWNhbGxfZ251Yyh0dXBsZSwgcmVnX2VieCwgcmVnX2VjeCkKICNkZWZpbmUgdW5pc3lzX2V4dGVuZGVkX3ZtY2FsbCh0dXBsZSwgcmVnX2VieCwgcmVnX2VjeCwgcmVnX2VkeCkgXApAQCAtNzQsNyArMTAxLDYgQEAKICNkZWZpbmUgSVNTVUVfSU9fVk1DQUxMX1BPU1RDT0RFX1NFVkVSSVRZKHBvc3Rjb2RlLCBzZXZlcml0eSkJCVwKIAlJU1NVRV9JT19FWFRFTkRFRF9WTUNBTEwoVk1DQUxMX1BPU1RfQ09ERV9MT0dFVkVOVCwgc2V2ZXJpdHksCVwKIAkJCQkgTURTX0FQUE9TLCBwb3N0Y29kZSkKLSNlbmRpZgogCiAvKiBTdHJ1Y3R1cmVzIGZvciBJTyBWTUNBTExzICovCiAKQEAgLTg5LDQgKzExNSwxNTYgQEAKIAl1OCB1bnVzZWRbNF07CQkvKiBVbnVzZWQgQnl0ZXMgaW4gdGhlIDY0LUJpdCBBbGlnbmVkIFN0cnVjdCAqLwogfSBfX3BhY2tlZDsKIAorLyoqKioqKiogSU5GTyBPTiBJU1NVRV9QT1NUQ09ERV9MSU5VWCgpIEJFTE9XICoqKioqKiovCitlbnVtIGRyaXZlcl9wYyB7CQkvKiBQT1NUQ09ERSBkcml2ZXIgaWRlbnRpZmllciB0dXBsZXMgKi8KKwkvKiB2aXNvcmNoaXBzZXQgZHJpdmVyIGZpbGVzICovCisJVklTT1JfQ0hJUFNFVF9QQyA9IDB4QTAsCisJVklTT1JfQ0hJUFNFVF9QQ19jb250cm9sdm1fYyA9IDB4QTEsCisJVklTT1JfQ0hJUFNFVF9QQ19jb250cm9sdm1fY20yID0gMHhBMiwKKwlWSVNPUl9DSElQU0VUX1BDX2NvbnRyb2x2bV9kaXJlY3RfYyA9IDB4QTMsCisJVklTT1JfQ0hJUFNFVF9QQ19maWxlX2MgPSAweEE0LAorCVZJU09SX0NISVBTRVRfUENfcGFyc2VyX2MgPSAweEE1LAorCVZJU09SX0NISVBTRVRfUENfdGVzdGluZ19jID0gMHhBNiwKKwlWSVNPUl9DSElQU0VUX1BDX3Zpc29yY2hpcHNldF9tYWluX2MgPSAweEE3LAorCVZJU09SX0NISVBTRVRfUENfdmlzb3Jzd2l0Y2hidXNfYyA9IDB4QTgsCisJLyogdmlzb3JidXMgZHJpdmVyIGZpbGVzICovCisJVklTT1JfQlVTX1BDID0gMHhCMCwKKwlWSVNPUl9CVVNfUENfYnVzaW5zdF9hdHRyX2MgPSAweEIxLAorCVZJU09SX0JVU19QQ19jaGFubmVsX2F0dHJfYyA9IDB4QjIsCisJVklTT1JfQlVTX1BDX2Rldm1ham9ybWlub3JfYXR0cl9jID0gMHhCMywKKwlWSVNPUl9CVVNfUENfdmlzb3JidXNfbWFpbl9jID0gMHhCNCwKKwkvKiB2aXNvcmNsaWVudGJ1cyBkcml2ZXIgZmlsZXMgKi8KKwlWSVNPUl9DTElFTlRfQlVTX1BDID0gMHhDMCwKKwlWSVNPUl9DTElFTlRfQlVTX1BDX3Zpc29yY2xpZW50YnVzX21haW5fYyA9IDB4QzEsCisJLyogdmlydCBoYmEgZHJpdmVyIGZpbGVzICovCisJVklSVF9IQkFfUEMgPSAweEMyLAorCVZJUlRfSEJBX1BDX3ZpcnRoYmFfYyA9IDB4QzMsCisJLyogdmlydHBjaSBkcml2ZXIgZmlsZXMgKi8KKwlWSVJUX1BDSV9QQyA9IDB4QzQsCisJVklSVF9QQ0lfUENfdmlydHBjaV9jID0gMHhDNSwKKwkvKiB2aXJ0bmljIGRyaXZlciBmaWxlcyAqLworCVZJUlRfTklDX1BDID0gMHhDNiwKKwlWSVJUX05JQ19QX3ZpcnRuaWNfYyA9IDB4QzcsCisJLyogdWlzbGliIGRyaXZlciBmaWxlcyAqLworCVVJU0xJQl9QQyA9IDB4RDAsCisJVUlTTElCX1BDX3Vpc2xpYl9jID0gMHhEMSwKKwlVSVNMSUJfUENfdWlzcXVldWVfYyA9IDB4RDIsCisJLyogMHhEMyBSRVNFUlZFRCAqLworCVVJU0xJQl9QQ191aXN1dGlsc19jID0gMHhENCwKK307CisKK2VudW0gZXZlbnRfcGMgewkJCS8qIFBPU1RDT0RFIGV2ZW50IGlkZW50aWZpZXIgdHVwbGVzICovCisJQVRUQUNIX1BPUlRfRU5UUllfUEMgPSAweDAwMSwKKwlBVFRBQ0hfUE9SVF9GQUlMVVJFX1BDID0gMHgwMDIsCisJQVRUQUNIX1BPUlRfU1VDQ0VTU19QQyA9IDB4MDAzLAorCUJVU19GQUlMVVJFX1BDID0gMHgwMDQsCisJQlVTX0NSRUFURV9FTlRSWV9QQyA9IDB4MDA1LAorCUJVU19DUkVBVEVfRkFJTFVSRV9QQyA9IDB4MDA2LAorCUJVU19DUkVBVEVfRVhJVF9QQyA9IDB4MDA3LAorCUJVU19DT05GSUdVUkVfRU5UUllfUEMgPSAweDAwOCwKKwlCVVNfQ09ORklHVVJFX0ZBSUxVUkVfUEMgPSAweDAwOSwKKwlCVVNfQ09ORklHVVJFX0VYSVRfUEMgPSAweDAwQSwKKwlDSElQU0VUX0lOSVRfRU5UUllfUEMgPSAweDAwQiwKKwlDSElQU0VUX0lOSVRfU1VDQ0VTU19QQyA9IDB4MDBDLAorCUNISVBTRVRfSU5JVF9GQUlMVVJFX1BDID0gMHgwMEQsCisJQ0hJUFNFVF9JTklUX0VYSVRfUEMgPSAweDAwRSwKKwlDUkVBVEVfV09SS1FVRVVFX1BDID0gMHgwMEYsCisJQ1JFQVRFX1dPUktRVUVVRV9GQUlMRURfUEMgPSAweDBBMCwKKwlDT05UUk9MVk1fSU5JVF9GQUlMVVJFX1BDID0gMHgwQTEsCisJREVWSUNFX0NSRUFURV9FTlRSWV9QQyA9IDB4MEEyLAorCURFVklDRV9DUkVBVEVfRkFJTFVSRV9QQyA9IDB4MEEzLAorCURFVklDRV9DUkVBVEVfU1VDQ0VTU19QQyA9IDB4MEE0LAorCURFVklDRV9DUkVBVEVfRVhJVF9QQyA9IDB4MEE1LAorCURFVklDRV9BRERfUEMgPSAweDBBNiwKKwlERVZJQ0VfUkVHSVNURVJfRkFJTFVSRV9QQyA9IDB4MEE3LAorCURFVklDRV9DSEFOR0VTVEFURV9FTlRSWV9QQyA9IDB4MEE4LAorCURFVklDRV9DSEFOR0VTVEFURV9GQUlMVVJFX1BDID0gMHgwQTksCisJREVWSUNFX0NIQU5HRVNUQVRFX0VYSVRfUEMgPSAweDBBQSwKKwlEUklWRVJfRU5UUllfUEMgPSAweDBBQiwKKwlEUklWRVJfRVhJVF9QQyA9IDB4MEFDLAorCU1BTExPQ19GQUlMVVJFX1BDID0gMHgwQUQsCisJUVVFVUVfREVMQVlFRF9XT1JLX1BDID0gMHgwQUUsCisJLyogMHgwQjcgUkVTRVJWRUQgKi8KKwlWQlVTX0NIQU5ORUxfRU5UUllfUEMgPSAweDBCOCwKKwlWQlVTX0NIQU5ORUxfRkFJTFVSRV9QQyA9IDB4MEI5LAorCVZCVVNfQ0hBTk5FTF9FWElUX1BDID0gMHgwQkEsCisJVkhCQV9DUkVBVEVfRU5UUllfUEMgPSAweDBCQiwKKwlWSEJBX0NSRUFURV9GQUlMVVJFX1BDID0gMHgwQkMsCisJVkhCQV9DUkVBVEVfRVhJVF9QQyA9IDB4MEJELAorCVZIQkFfQ1JFQVRFX1NVQ0NFU1NfUEMgPSAweDBCRSwKKwlWSEJBX0NPTU1BTkRfSEFORExFUl9QQyA9IDB4MEJGLAorCVZIQkFfUFJPQkVfRU5UUllfUEMgPSAweDBDMCwKKwlWSEJBX1BST0JFX0ZBSUxVUkVfUEMgPSAweDBDMSwKKwlWSEJBX1BST0JFX0VYSVRfUEMgPSAweDBDMiwKKwlWTklDX0NSRUFURV9FTlRSWV9QQyA9IDB4MEMzLAorCVZOSUNfQ1JFQVRFX0ZBSUxVUkVfUEMgPSAweDBDNCwKKwlWTklDX0NSRUFURV9TVUNDRVNTX1BDID0gMHgwQzUsCisJVk5JQ19QUk9CRV9FTlRSWV9QQyA9IDB4MEM2LAorCVZOSUNfUFJPQkVfRkFJTFVSRV9QQyA9IDB4MEM3LAorCVZOSUNfUFJPQkVfRVhJVF9QQyA9IDB4MEM4LAorCVZQQ0lfQ1JFQVRFX0VOVFJZX1BDID0gMHgwQzksCisJVlBDSV9DUkVBVEVfRkFJTFVSRV9QQyA9IDB4MENBLAorCVZQQ0lfQ1JFQVRFX0VYSVRfUEMgPSAweDBDQiwKKwlWUENJX1BST0JFX0VOVFJZX1BDID0gMHgwQ0MsCisJVlBDSV9QUk9CRV9GQUlMVVJFX1BDID0gMHgwQ0QsCisJVlBDSV9QUk9CRV9FWElUX1BDID0gMHgwQ0UsCisJQ1JBU0hfREVWX0VOVFJZX1BDID0gMHgwQ0YsCisJQ1JBU0hfREVWX0VYSVRfUEMgPSAweDBEMCwKKwlDUkFTSF9ERVZfSEFERFJfTlVMTCA9IDB4MEQxLAorCUNSQVNIX0RFVl9DT05UUk9MVk1fTlVMTCA9IDB4MEQyLAorCUNSQVNIX0RFVl9SRF9CVVNfRkFJVUxSRV9QQyA9IDB4MEQzLAorCUNSQVNIX0RFVl9SRF9ERVZfRkFJVUxSRV9QQyA9IDB4MEQ0LAorCUNSQVNIX0RFVl9CVVNfTlVMTF9GQUlMVVJFX1BDID0gMHgwRDUsCisJQ1JBU0hfREVWX0RFVl9OVUxMX0ZBSUxVUkVfUEMgPSAweDBENiwKKwlDUkFTSF9ERVZfQ1RSTF9SRF9GQUlMVVJFX1BDID0gMHgwRDcsCisJQ1JBU0hfREVWX0NPVU5UX0ZBSUxVUkVfUEMgPSAweDBEOCwKKwlTQVZFX01TR19CVVNfRkFJTFVSRV9QQyA9IDB4MEQ5LAorCVNBVkVfTVNHX0RFVl9GQUlMVVJFX1BDID0gMHgwREEsCisJQ0FMTEhPTUVfSU5JVF9GQUlMVVJFX1BDID0gMHgwREIKK307CisKKyNkZWZpbmUgUE9TVENPREVfU0VWRVJJVFlfRVJSIERJQUdfU0VWRVJJVFlfRVJSCisjZGVmaW5lIFBPU1RDT0RFX1NFVkVSSVRZX1dBUk5JTkcgRElBR19TRVZFUklUWV9XQVJOSU5HCisvKiBUT0RPLT4gSW5mbyBjdXJyZW50bHkgZG9lc24ndCBzaG93LCBzbyB3ZSBzZXQgaW5mbz13YXJuaW5nICovCisjZGVmaW5lIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8gRElBR19TRVZFUklUWV9QUklOVAorCisvKiBleGFtcGxlIGNhbGwgb2YgUE9TVENPREVfTElOVVhfMihWSVNPUl9DSElQU0VUX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOworICogUGxlYXNlIGFsc28gbm90ZSB0aGF0IHRoZSByZXN1bHRpbmcgcG9zdGNvZGUgaXMgaW4gaGV4LCBzbyBpZiB5b3UgYXJlCisgKiBzZWFyY2hpbmcgZm9yIHRoZSBfX0xJTkVfXyBudW1iZXIsIGNvbnZlcnQgaXQgZmlyc3QgdG8gZGVjaW1hbC4gIFRoZSBsaW5lCisgKiBudW1iZXIgY29tYmluZWQgd2l0aCBkcml2ZXIgYW5kIHR5cGUgb2YgY2FsbCwgd2lsbCBhbGxvdyB5b3UgdG8gdHJhY2sgZG93bgorICogZXhhY3RseSB3aGF0IGxpbmUgYW4gZXJyb3Igb2NjdXJyZWQgb24sIG9yIHdoZXJlIHRoZSBsYXN0IGRyaXZlcgorICogZW50ZXJlZC9leGl0ZWQgZnJvbS4KKyAqLworCisvKiBCQVNFIEZVTkNUSU9OUyAqLworI2RlZmluZSBQT1NUQ09ERV9MSU5VWF9BKERSSVZFUl9QQywgRVZFTlRfUEMsIHBjMzJiaXQsIHNldmVyaXR5KQlcCitkbyB7CQkJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgbG9uZyBwb3N0X2NvZGVfdGVtcDsJCQkJXAorCXBvc3RfY29kZV90ZW1wID0gKCgodTY0KURSSVZFUl9QQykgPDwgNTYpIHwgKCgodTY0KUVWRU5UX1BDKSA8PCA0NCkgfCBcCisJCSgoKCh1NjQpX19MSU5FX18pICYgMHhGRkYpIDw8IDMyKSB8CQkJXAorCQkoKCh1NjQpcGMzMmJpdCkgJiAweEZGRkZGRkZGKTsJCQkJXAorCUlTU1VFX0lPX1ZNQ0FMTF9QT1NUQ09ERV9TRVZFUklUWShwb3N0X2NvZGVfdGVtcCwgc2V2ZXJpdHkpOwlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFBPU1RDT0RFX0xJTlVYX0IoRFJJVkVSX1BDLCBFVkVOVF9QQywgcGMxNmJpdDEsIHBjMTZiaXQyLCBzZXZlcml0eSkgXAorZG8gewkJCQkJCQkJCVwKKwl1bnNpZ25lZCBsb25nIGxvbmcgcG9zdF9jb2RlX3RlbXA7CQkJCVwKKwlwb3N0X2NvZGVfdGVtcCA9ICgoKHU2NClEUklWRVJfUEMpIDw8IDU2KSB8ICgoKHU2NClFVkVOVF9QQykgPDwgNDQpIHwgXAorCQkoKCgodTY0KV9fTElORV9fKSAmIDB4RkZGKSA8PCAzMikgfAkJCVwKKwkJKCgoKHU2NClwYzE2Yml0MSkgJiAweEZGRkYpIDw8IDE2KSB8CQkJXAorCQkoKCh1NjQpcGMxNmJpdDIpICYgMHhGRkZGKTsJCQkJXAorCUlTU1VFX0lPX1ZNQ0FMTF9QT1NUQ09ERV9TRVZFUklUWShwb3N0X2NvZGVfdGVtcCwgc2V2ZXJpdHkpOwlcCit9IHdoaWxlICgwKQorCisvKiBNT1NUIENPTU1PTiAqLworI2RlZmluZSBQT1NUQ09ERV9MSU5VWF8yKEVWRU5UX1BDLCBzZXZlcml0eSkJCQkJXAorCVBPU1RDT0RFX0xJTlVYX0EoQ1VSUkVOVF9GSUxFX1BDLCBFVkVOVF9QQywgMHgwMDAwLCBzZXZlcml0eSkKKworI2RlZmluZSBQT1NUQ09ERV9MSU5VWF8zKEVWRU5UX1BDLCBwYzMyYml0LCBzZXZlcml0eSkJCQlcCisJUE9TVENPREVfTElOVVhfQShDVVJSRU5UX0ZJTEVfUEMsIEVWRU5UX1BDLCBwYzMyYml0LCBzZXZlcml0eSkKKworI2RlZmluZSBQT1NUQ09ERV9MSU5VWF80KEVWRU5UX1BDLCBwYzE2Yml0MSwgcGMxNmJpdDIsIHNldmVyaXR5KQlcCisJUE9TVENPREVfTElOVVhfQihDVVJSRU5UX0ZJTEVfUEMsIEVWRU5UX1BDLCBwYzE2Yml0MSwJCVwKKwkJCSBwYzE2Yml0Miwgc2V2ZXJpdHkpCisKICNlbmRpZiAvKiBfX0lPTU9OSU5URl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JoYmEvdmlzb3JoYmFfbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmhiYS92aXNvcmhiYV9tYWluLmMKaW5kZXggMTIwYmEyMC4uNWE3YTg3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmhiYS92aXNvcmhiYV9tYWluLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmhiYS92aXNvcmhiYV9tYWluLmMKQEAgLTM2LDIxICszNiw2IEBACiAjZGVmaW5lIE1BWF9QRU5ESU5HX1JFUVVFU1RTCShNSU5fTlVNU0lHTkFMUyAqIDIpCiAjZGVmaW5lIFZJU09SSEJBX0VSUk9SX0NPVU5UCTMwCiAKLXN0YXRpYyBpbnQgdmlzb3JoYmFfcXVldWVfY29tbWFuZF9sY2soc3RydWN0IHNjc2lfY21uZCAqc2NzaWNtZCwKLQkJCQkgICAgICB2b2lkICgqdmlzb3JoYmFfY21uZF9kb25lKQotCQkJCQkgICAgKHN0cnVjdCBzY3NpX2NtbmQgKikpOwotI2lmZGVmIERFRl9TQ1NJX1FDTUQKLXN0YXRpYyBERUZfU0NTSV9RQ01EKHZpc29yaGJhX3F1ZXVlX2NvbW1hbmQpCi0jZWxzZQotI2RlZmluZSB2aXNvcmhiYV9xdWV1ZV9jb21tYW5kIHZpc29yaGJhX3F1ZXVlX2NvbW1hbmRfbGNrCi0jZW5kaWYKLXN0YXRpYyBpbnQgdmlzb3JoYmFfcHJvYmUoc3RydWN0IHZpc29yX2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIHZpc29yaGJhX3JlbW92ZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYpOwotc3RhdGljIGludCB2aXNvcmhiYV9wYXVzZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYsCi0JCQkgIHZpc29yYnVzX3N0YXRlX2NvbXBsZXRlX2Z1bmMgY29tcGxldGVfZnVuYyk7Ci1zdGF0aWMgaW50IHZpc29yaGJhX3Jlc3VtZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYsCi0JCQkgICB2aXNvcmJ1c19zdGF0ZV9jb21wbGV0ZV9mdW5jIGNvbXBsZXRlX2Z1bmMpOwotCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqdmlzb3JoYmFfZGVidWdmc19kaXI7CiAKIC8qIEdVSURTIGZvciBIQkEgY2hhbm5lbCB0eXBlIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlciAqLwpAQCAtNjIsMjAgKzQ3LDYgQEAKIAl7IE5VTExfVVVJRF9MRSwgTlVMTCB9CiB9OwogCi0vKiBUaGlzIGlzIHVzZWQgdG8gdGVsbCB0aGUgdmlzb3IgYnVzIGRyaXZlciB3aGljaCB0eXBlcyBvZiB2aXNvciBkZXZpY2VzCi0gKiB3ZSBzdXBwb3J0LCBhbmQgd2hhdCBmdW5jdGlvbnMgdG8gY2FsbCB3aGVuIGEgdmlzb3IgZGV2aWNlIHRoYXQgd2Ugc3VwcG9ydAotICogaXMgYXR0YWNoZWQgb3IgcmVtb3ZlZC4KLSAqLwotc3RhdGljIHN0cnVjdCB2aXNvcl9kcml2ZXIgdmlzb3JoYmFfZHJpdmVyID0gewotCS5uYW1lID0gInZpc29yaGJhIiwKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkuY2hhbm5lbF90eXBlcyA9IHZpc29yaGJhX2NoYW5uZWxfdHlwZXMsCi0JLnByb2JlID0gdmlzb3JoYmFfcHJvYmUsCi0JLnJlbW92ZSA9IHZpc29yaGJhX3JlbW92ZSwKLQkucGF1c2UgPSB2aXNvcmhiYV9wYXVzZSwKLQkucmVzdW1lID0gdmlzb3JoYmFfcmVzdW1lLAotCS5jaGFubmVsX2ludGVycnVwdCA9IE5VTEwsCi19OwogTU9EVUxFX0RFVklDRV9UQUJMRSh2aXNvcmJ1cywgdmlzb3JoYmFfY2hhbm5lbF90eXBlcyk7CiBNT0RVTEVfQUxJQVMoInZpc29yYnVzOiIgU1BBUl9WSEJBX0NIQU5ORUxfUFJPVE9DT0xfVVVJRF9TVFIpOwogCkBAIC0zNjQsOSArMzM1LDkgQEAKIAogCWRldl9kYmcoJnNjc2lkZXYtPnNkZXZfZ2VuZGV2LAogCQkidmlzb3JoYmE6IGluaXRpYXRpbmcgdHlwZT0lZCB0YXNrbWdtdCBjb21tYW5kXG4iLCB0YXNrdHlwZSk7Ci0JaWYgKCF2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KGRldmRhdGEtPmRldi0+dmlzb3JjaGFubmVsLAotCQkJCSAgICAgICBJT0NIQU5fVE9fSU9QQVJULAotCQkJCSAgICAgICBjbWRyc3ApKQorCWlmICh2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KGRldmRhdGEtPmRldi0+dmlzb3JjaGFubmVsLAorCQkJCSAgICAgIElPQ0hBTl9UT19JT1BBUlQsCisJCQkJICAgICAgY21kcnNwKSkKIAkJZ290byBlcnJfZGVsX3Njc2lwZW5kaW5nX2VudDsKIAogCS8qIEl0IGNhbiB0YWtlIHRoZSBTZXJ2aWNlIFBhcnRpdGlvbiB1cCB0byAzNSBzZWNvbmRzIHRvIGNvbXBsZXRlCkBAIC01NjcsOSArNTM4LDkgQEAKIAl9CiAJY21kcnNwLT5zY3NpLmd1ZXN0X3BoeXNfZW50cmllcyA9IHNjc2lfc2dfY291bnQoc2NzaWNtZCk7CiAKLQlpZiAoIXZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoZGV2ZGF0YS0+ZGV2LT52aXNvcmNoYW5uZWwsCi0JCQkJICAgICAgIElPQ0hBTl9UT19JT1BBUlQsCi0JCQkJICAgICAgIGNtZHJzcCkpCisJaWYgKHZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoZGV2ZGF0YS0+ZGV2LT52aXNvcmNoYW5uZWwsCisJCQkJICAgICAgSU9DSEFOX1RPX0lPUEFSVCwKKwkJCQkgICAgICBjbWRyc3ApKQogCQkvKiBxdWV1ZSBtdXN0IGJlIGZ1bGwgYW5kIHdlIGFyZW4ndCBnb2luZyB0byB3YWl0ICovCiAJCWdvdG8gZXJyX2RlbF9zY3NpcGVuZGluZ19lbnQ7CiAKQEAgLTU4MCw2ICs1NTEsMTIgQEAKIAlyZXR1cm4gU0NTSV9NTFFVRVVFX0RFVklDRV9CVVNZOwogfQogCisjaWZkZWYgREVGX1NDU0lfUUNNRAorc3RhdGljIERFRl9TQ1NJX1FDTUQodmlzb3JoYmFfcXVldWVfY29tbWFuZCkKKyNlbHNlCisjZGVmaW5lIHZpc29yaGJhX3F1ZXVlX2NvbW1hbmQgdmlzb3JoYmFfcXVldWVfY29tbWFuZF9sY2sKKyNlbmRpZgorCiAvKioKICAqCXZpc29yaGJhX3NsYXZlX2FsbG9jIC0gY2FsbGVkIHdoZW4gbmV3IGRpc2sgaXMgZGlzY292ZXJlZAogICoJQHNjc2lkZXY6IE5ldyBkaXNrCkBAIC05NTAsOSArOTI3LDkgQEAKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kOwogCiAJd2hpbGUgKDEpIHsKLQkJaWYgKCF2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKGRldmRhdGEtPmRldi0+dmlzb3JjaGFubmVsLAotCQkJCQkgICAgICAgSU9DSEFOX0ZST01fSU9QQVJULAotCQkJCQkgICAgICAgY21kcnNwKSkKKwkJaWYgKHZpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUoZGV2ZGF0YS0+ZGV2LT52aXNvcmNoYW5uZWwsCisJCQkJCSAgICAgIElPQ0hBTl9GUk9NX0lPUEFSVCwKKwkJCQkJICAgICAgY21kcnNwKSkKIAkJCWJyZWFrOyAvKiBxdWV1ZSBlbXB0eSAqLwogCiAJCWlmIChjbWRyc3AtPmNtZHR5cGUgPT0gQ01EX1NDU0lfVFlQRSkgewpAQCAtMTE4Niw2ICsxMTYzLDIxIEBACiAJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGRldmRhdGEtPmRlYnVnZnNfZGlyKTsKIH0KIAorLyogVGhpcyBpcyB1c2VkIHRvIHRlbGwgdGhlIHZpc29yIGJ1cyBkcml2ZXIgd2hpY2ggdHlwZXMgb2Ygdmlzb3IgZGV2aWNlcworICogd2Ugc3VwcG9ydCwgYW5kIHdoYXQgZnVuY3Rpb25zIHRvIGNhbGwgd2hlbiBhIHZpc29yIGRldmljZSB0aGF0IHdlIHN1cHBvcnQKKyAqIGlzIGF0dGFjaGVkIG9yIHJlbW92ZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgdmlzb3JfZHJpdmVyIHZpc29yaGJhX2RyaXZlciA9IHsKKwkubmFtZSA9ICJ2aXNvcmhiYSIsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmNoYW5uZWxfdHlwZXMgPSB2aXNvcmhiYV9jaGFubmVsX3R5cGVzLAorCS5wcm9iZSA9IHZpc29yaGJhX3Byb2JlLAorCS5yZW1vdmUgPSB2aXNvcmhiYV9yZW1vdmUsCisJLnBhdXNlID0gdmlzb3JoYmFfcGF1c2UsCisJLnJlc3VtZSA9IHZpc29yaGJhX3Jlc3VtZSwKKwkuY2hhbm5lbF9pbnRlcnJ1cHQgPSBOVUxMLAorfTsKKwogLyoqCiAgKgl2aXNvcmhiYV9pbml0CQktIGRyaXZlciBpbml0IHJvdXRpbmUKICAqCkBAIC0xMjI4LDQgKzEyMjAsNCBAQAogCiBNT0RVTEVfQVVUSE9SKCJVbmlzeXMiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9ERVNDUklQVElPTigicy1QYXIgaGJhIGRyaXZlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJzLVBhciBIQkEgZHJpdmVyIGZvciB2aXJ0dWFsIFNDU0kgaG9zdCBidXNzZXMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JpbnB1dC91bHRyYWlucHV0cmVwb3J0LmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yaW5wdXQvdWx0cmFpbnB1dHJlcG9ydC5oCmluZGV4IDFiYzNkMjAuLjUzZGRlN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JpbnB1dC91bHRyYWlucHV0cmVwb3J0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmlucHV0L3VsdHJhaW5wdXRyZXBvcnQuaApAQCAtMTcsOCArMTcsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAotI2luY2x1ZGUgInVsdHJhaW5wdXRyZXBvcnQuaCIKLQogLyogSWRlbnRpZmllcyBtb3VzZSBhbmQga2V5Ym9hcmQgYWN0aXZpdHkgd2hpY2ggaXMgc3BlY2lmaWVkIGJ5IHRoZSBmaXJtd2FyZSB0bwogICogIHRoZSBob3N0IHVzaW5nIHRoZSBjbXNpbXBsZWlucHV0IHByb3RvY29sLiAgQGluZ3JvdXAgY29yZXR5cGVzCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JpbnB1dC92aXNvcmlucHV0LmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yaW5wdXQvdmlzb3JpbnB1dC5jCmluZGV4IGQ2N2NkNzYzLi42Zjk0YjY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yaW5wdXQvdmlzb3JpbnB1dC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JpbnB1dC92aXNvcmlucHV0LmMKQEAgLTI5LDkgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC91dWlkLmg+CiAKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCiAjaW5jbHVkZSAidmlzb3JidXMuaCIKLSNpbmNsdWRlICJjaGFubmVsLmgiCiAjaW5jbHVkZSAidWx0cmFpbnB1dHJlcG9ydC5oIgogCiAvKiBLZXlib2FyZCBjaGFubmVsIHtjNzM0MTZkMC1iMGI4LTQ0YWYtYjMwNC05ZDJhZTk5ZjFiM2R9ICovCkBAIC02Myw5ICs2MSwxMCBAQAogICovCiBzdHJ1Y3Qgdmlzb3JpbnB1dF9kZXZkYXRhIHsKIAlzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IHJ3X3NlbWFwaG9yZSBsb2NrX3Zpc29yX2RldjsgLyogbG9jayBmb3IgZGV2ICovCisJc3RydWN0IG11dGV4IGxvY2tfdmlzb3JfZGV2OyAvKiBsb2NrIGZvciBkZXYgKi8KIAlzdHJ1Y3QgaW5wdXRfZGV2ICp2aXNvcmlucHV0X2RldjsKIAlib29sIHBhdXNlZDsKKwlib29sIGludGVycnVwdHNfZW5hYmxlZDsKIAl1bnNpZ25lZCBpbnQga2V5Y29kZV90YWJsZV9ieXRlczsgLyogc2l6ZSBvZiBmb2xsb3dpbmcgYXJyYXkgKi8KIAkvKiBmb3Iga2V5Ym9hcmQgZGV2aWNlczogdmlzb3JrYmRfa2V5Y29kZVtdICsgdmlzb3JrYmRfZXh0X2tleWNvZGVbXSAqLwogCXVuc2lnbmVkIGNoYXIga2V5Y29kZV90YWJsZVswXTsKQEAgLTIyOCw3ICsyMjcsMjEgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWRldl9kYmcoJnZpc29yaW5wdXRfZGV2LT5kZXYsICIlcyBvcGVuZWRcbiIsIF9fZnVuY19fKTsKKworCS8qCisJICogSWYgd2UncmUgbm90IHBhdXNlZCwgcmVhbGx5IGVuYWJsZSBpbnRlcnJ1cHRzLgorCSAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSBhcmUgcGF1c2VkLCBzZXQgYSBmbGFnIGluZGljYXRpbmcKKwkgKiBpbnRlcnJ1cHRzIHNob3VsZCBiZSBlbmFibGVkIHNvIHdoZW4gd2UgcmVzdW1lLCBpbnRlcnJ1cHRzCisJICogd2lsbCByZWFsbHkgYmUgZW5hYmxlZC4KKwkgKi8KKwltdXRleF9sb2NrKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CisJZGV2ZGF0YS0+aW50ZXJydXB0c19lbmFibGVkID0gdHJ1ZTsKKwlpZiAoZGV2ZGF0YS0+cGF1c2VkKQorCQlnb3RvIG91dF91bmxvY2s7CiAJdmlzb3JidXNfZW5hYmxlX2NoYW5uZWxfaW50ZXJydXB0cyhkZXZkYXRhLT5kZXYpOworCitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmZGV2ZGF0YS0+bG9ja192aXNvcl9kZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0yNDMsMjAgKzI1NiwzNSBAQAogCQlyZXR1cm47CiAJfQogCWRldl9kYmcoJnZpc29yaW5wdXRfZGV2LT5kZXYsICIlcyBjbG9zZWRcbiIsIF9fZnVuY19fKTsKKworCS8qCisJICogSWYgd2UncmUgbm90IHBhdXNlZCwgcmVhbGx5IGRpc2FibGUgaW50ZXJydXB0cy4KKwkgKiBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgd2UgYXJlIHBhdXNlZCwgc2V0IGEgZmxhZyBpbmRpY2F0aW5nCisJICogaW50ZXJydXB0cyBzaG91bGQgYmUgZGlzYWJsZWQgc28gd2hlbiB3ZSByZXN1bWUgd2Ugd2lsbAorCSAqIG5vdCByZS1lbmFibGUgdGhlbS4KKwkgKi8KKworCW11dGV4X2xvY2soJmRldmRhdGEtPmxvY2tfdmlzb3JfZGV2KTsKKwlkZXZkYXRhLT5pbnRlcnJ1cHRzX2VuYWJsZWQgPSBmYWxzZTsKKwlpZiAoZGV2ZGF0YS0+cGF1c2VkKQorCQlnb3RvIG91dF91bmxvY2s7CiAJdmlzb3JidXNfZGlzYWJsZV9jaGFubmVsX2ludGVycnVwdHMoZGV2ZGF0YS0+ZGV2KTsKKworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJmRldmRhdGEtPmxvY2tfdmlzb3JfZGV2KTsKIH0KIAogLyoKLSAqIHJlZ2lzdGVyX2NsaWVudF9rZXlib2FyZCgpIGluaXRpYWxpemVzIGFuZCByZXR1cm5zIGEgTGludXggaW5wdXQgbm9kZSB0aGF0CisgKiBzZXR1cF9jbGllbnRfa2V5Ym9hcmQoKSBpbml0aWFsaXplcyBhbmQgcmV0dXJucyBhIExpbnV4IGlucHV0IG5vZGUgdGhhdAogICogd2UgY2FuIHVzZSB0byBkZWxpdmVyIGtleWJvYXJkIGlucHV0cyB0byBMaW51eC4gIFdlIG9mIGNvdXJzZSBkbyB0aGlzIHdoZW4KICAqIHdlIHNlZSBrZXlib2FyZCBpbnB1dHMgY29taW5nIGluIG9uIGEga2V5Ym9hcmQgY2hhbm5lbC4KICAqLwogc3RhdGljIHN0cnVjdCBpbnB1dF9kZXYgKgotcmVnaXN0ZXJfY2xpZW50X2tleWJvYXJkKHZvaWQgKmRldmRhdGEsICAvKiBvcGFxdWUgb24gcHVycG9zZSAqLwotCQkJIHVuc2lnbmVkIGNoYXIgKmtleWNvZGVfdGFibGUpCitzZXR1cF9jbGllbnRfa2V5Ym9hcmQodm9pZCAqZGV2ZGF0YSwgIC8qIG9wYXF1ZSBvbiBwdXJwb3NlICovCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmtleWNvZGVfdGFibGUpCiAKIHsKLQlpbnQgaSwgZXJyb3I7CisJaW50IGk7CiAJc3RydWN0IGlucHV0X2RldiAqdmlzb3JpbnB1dF9kZXY7CiAKIAl2aXNvcmlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwpAQCAtMjkwLDE4ICszMTgsMTIgQEAKIAl2aXNvcmlucHV0X2Rldi0+Y2xvc2UgPSB2aXNvcmlucHV0X2Nsb3NlOwogCWlucHV0X3NldF9kcnZkYXRhKHZpc29yaW5wdXRfZGV2LCBkZXZkYXRhKTsgLyogcHJlIGlucHV0X3JlZ2lzdGVyISAqLwogCi0JZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uodmlzb3JpbnB1dF9kZXYpOwotCWlmIChlcnJvcikgewotCQlpbnB1dF9mcmVlX2RldmljZSh2aXNvcmlucHV0X2Rldik7Ci0JCXJldHVybiBOVUxMOwotCX0KIAlyZXR1cm4gdmlzb3JpbnB1dF9kZXY7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaW5wdXRfZGV2ICoKLXJlZ2lzdGVyX2NsaWVudF9tb3VzZSh2b2lkICpkZXZkYXRhIC8qIG9wYXF1ZSBvbiBwdXJwb3NlICovKQorc2V0dXBfY2xpZW50X21vdXNlKHZvaWQgKmRldmRhdGEgLyogb3BhcXVlIG9uIHB1cnBvc2UgKi8pCiB7Ci0JaW50IGVycm9yOwogCXN0cnVjdCBpbnB1dF9kZXYgKnZpc29yaW5wdXRfZGV2ID0gTlVMTDsKIAlpbnQgeHJlcywgeXJlczsKIAlzdHJ1Y3QgZmJfaW5mbyAqZmIwOwpAQCAtMzM2LDEzICszNTgsNiBAQAogCXZpc29yaW5wdXRfZGV2LT5vcGVuID0gdmlzb3JpbnB1dF9vcGVuOwogCXZpc29yaW5wdXRfZGV2LT5jbG9zZSA9IHZpc29yaW5wdXRfY2xvc2U7CiAJaW5wdXRfc2V0X2RydmRhdGEodmlzb3JpbnB1dF9kZXYsIGRldmRhdGEpOyAvKiBwcmUgaW5wdXRfcmVnaXN0ZXIhICovCi0KLQllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZSh2aXNvcmlucHV0X2Rldik7Ci0JaWYgKGVycm9yKSB7Ci0JCWlucHV0X2ZyZWVfZGV2aWNlKHZpc29yaW5wdXRfZGV2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCiAJaW5wdXRfc2V0X2NhcGFiaWxpdHkodmlzb3JpbnB1dF9kZXYsIEVWX1JFTCwgUkVMX1dIRUVMKTsKIAogCXJldHVybiB2aXNvcmlucHV0X2RldjsKQEAgLTM2MCw5ICszNzUsMTkgQEAKIAlkZXZkYXRhID0ga3phbGxvYyhzaXplb2YoKmRldmRhdGEpICsgZXh0cmFfYnl0ZXMsIEdGUF9LRVJORUwpOwogCWlmICghZGV2ZGF0YSkKIAkJcmV0dXJuIE5VTEw7CisJbXV0ZXhfaW5pdCgmZGV2ZGF0YS0+bG9ja192aXNvcl9kZXYpOworCW11dGV4X2xvY2soJmRldmRhdGEtPmxvY2tfdmlzb3JfZGV2KTsKIAlkZXZkYXRhLT5kZXYgPSBkZXY7CiAKIAkvKgorCSAqIHZpc29yaW5wdXRfb3BlbigpIGNhbiBiZSBjYWxsZWQgYXMgc29vbiBhcyBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoKQorCSAqIGhhcHBlbnMsIGFuZCB0aGF0IHdpbGwgZW5hYmxlIGNoYW5uZWwgaW50ZXJydXB0cy4gIFNldHRpbmcgcGF1c2VkCisJICogcHJldmVudHMgdXMgZnJvbSBnZXR0aW5nIGludG8gdmlzb3JpbnB1dF9jaGFubmVsX2ludGVycnVwdCgpIHByaW9yCisJICogdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUgYmVpbmcgdG90YWxseSBpbml0aWFsaXplZC4KKwkgKi8KKwlkZXZkYXRhLT5wYXVzZWQgPSB0cnVlOworCisJLyoKIAkgKiBUaGlzIGlzIGFuIGlucHV0IGRldmljZSBpbiBhIGNsaWVudCBndWVzdCBwYXJ0aXRpb24sCiAJICogc28gd2UgbmVlZCB0byBjcmVhdGUgd2hhdGV2ZXIgaW5wdXQgbm9kZXMgYXJlIG5lY2Vzc2FyeSB0bwogCSAqIGRlbGl2ZXIgb3VyIGlucHV0cyB0byB0aGUgZ3Vlc3QgT1MuCkBAIC0zNzQsMjMgKzM5OSw0OSBAQAogCQkgICAgICAgS0VZQ09ERV9UQUJMRV9CWVRFUyk7CiAJCW1lbWNweShkZXZkYXRhLT5rZXljb2RlX3RhYmxlICsgS0VZQ09ERV9UQUJMRV9CWVRFUywKIAkJICAgICAgIHZpc29ya2JkX2V4dF9rZXljb2RlLCBLRVlDT0RFX1RBQkxFX0JZVEVTKTsKLQkJZGV2ZGF0YS0+dmlzb3JpbnB1dF9kZXYgPSByZWdpc3Rlcl9jbGllbnRfa2V5Ym9hcmQKKwkJZGV2ZGF0YS0+dmlzb3JpbnB1dF9kZXYgPSBzZXR1cF9jbGllbnRfa2V5Ym9hcmQKIAkJCShkZXZkYXRhLCBkZXZkYXRhLT5rZXljb2RlX3RhYmxlKTsKIAkJaWYgKCFkZXZkYXRhLT52aXNvcmlucHV0X2RldikKIAkJCWdvdG8gY2xlYW51cHNfcmVnaXN0ZXI7CiAJCWJyZWFrOwogCWNhc2Ugdmlzb3JpbnB1dF9tb3VzZToKLQkJZGV2ZGF0YS0+dmlzb3JpbnB1dF9kZXYgPSByZWdpc3Rlcl9jbGllbnRfbW91c2UoZGV2ZGF0YSk7CisJCWRldmRhdGEtPnZpc29yaW5wdXRfZGV2ID0gc2V0dXBfY2xpZW50X21vdXNlKGRldmRhdGEpOwogCQlpZiAoIWRldmRhdGEtPnZpc29yaW5wdXRfZGV2KQogCQkJZ290byBjbGVhbnVwc19yZWdpc3RlcjsKIAkJYnJlYWs7CiAJfQogCi0JaW5pdF9yd3NlbSgmZGV2ZGF0YS0+bG9ja192aXNvcl9kZXYpOworCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXZpY2UsIGRldmRhdGEpOworCW11dGV4X3VubG9jaygmZGV2ZGF0YS0+bG9ja192aXNvcl9kZXYpOworCisJLyoKKwkgKiBEZXZpY2Ugc3RydWN0IGlzIGNvbXBsZXRlbHkgc2V0IHVwIG5vdywgd2l0aCB0aGUgZXhjZXB0aW9uIG9mCisJICogdmlzb3JpbnB1dF9kZXYgYmVpbmcgcmVnaXN0ZXJlZC4KKwkgKiBXZSBuZWVkIHRvIHVubG9jayBiZWZvcmUgd2UgcmVnaXN0ZXIgdGhlIGRldmljZSwgYmVjYXVzZSB0aGlzCisJICogY2FuIGNhdXNlIGFuIG9uLXN0YWNrIGNhbGwgb2Ygdmlzb3JpbnB1dF9vcGVuKCksIHdoaWNoIHdvdWxkCisJICogZGVhZGxvY2sgaWYgd2UgaGFkIHRoZSBsb2NrLgorCSAqLworCWlmIChpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoZGV2ZGF0YS0+dmlzb3JpbnB1dF9kZXYpKSB7CisJCWlucHV0X2ZyZWVfZGV2aWNlKGRldmRhdGEtPnZpc29yaW5wdXRfZGV2KTsKKwkJZ290byBlcnJfa2ZyZWVfZGV2ZGF0YTsKKwl9CisKKwltdXRleF9sb2NrKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CisJLyoKKwkgKiBFc3RhYmxpc2ggY2FsbHMgdG8gdmlzb3JpbnB1dF9jaGFubmVsX2ludGVycnVwdCgpIGlmIHRoYXQgaXMKKwkgKiB0aGUgZGVzaXJlZCBzdGF0ZSB0aGF0IHdlJ3ZlIGtlcHQgdHJhY2sgb2YgaW4gaW50ZXJydXB0c19lbmFibGVkCisJICogd2hpbGUgdGhlIGRldmljZSB3YXMgYmVpbmcgY3JlYXRlZC4KKwkgKi8KKwlkZXZkYXRhLT5wYXVzZWQgPSBmYWxzZTsKKwlpZiAoZGV2ZGF0YS0+aW50ZXJydXB0c19lbmFibGVkKQorCQl2aXNvcmJ1c19lbmFibGVfY2hhbm5lbF9pbnRlcnJ1cHRzKGRldik7CisJbXV0ZXhfdW5sb2NrKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CiAKIAlyZXR1cm4gZGV2ZGF0YTsKIAogY2xlYW51cHNfcmVnaXN0ZXI6CisJbXV0ZXhfdW5sb2NrKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CitlcnJfa2ZyZWVfZGV2ZGF0YToKIAlrZnJlZShkZXZkYXRhKTsKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTM5OCw3ICs0NDksNiBAQAogc3RhdGljIGludAogdmlzb3JpbnB1dF9wcm9iZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHZpc29yaW5wdXRfZGV2ZGF0YSAqZGV2ZGF0YSA9IE5VTEw7CiAJdXVpZF9sZSBndWlkOwogCWVudW0gdmlzb3JpbnB1dF9kZXZpY2VfdHlwZSBkZXZ0eXBlOwogCkBAIC00MDksMTAgKzQ1OSw5IEBACiAJCWRldnR5cGUgPSB2aXNvcmlucHV0X2tleWJvYXJkOwogCWVsc2UKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JZGV2ZGF0YSA9IGRldmRhdGFfY3JlYXRlKGRldiwgZGV2dHlwZSk7Ci0JaWYgKCFkZXZkYXRhKQorCXZpc29yYnVzX2Rpc2FibGVfY2hhbm5lbF9pbnRlcnJ1cHRzKGRldik7CisJaWYgKCFkZXZkYXRhX2NyZWF0ZShkZXYsIGRldnR5cGUpKQogCQlyZXR1cm4gLUVOT01FTTsKLQlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2aWNlLCBkZXZkYXRhKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDMxLDYgKzQ4MCw3IEBACiAJaWYgKCFkZXZkYXRhKQogCQlyZXR1cm47CiAKKwltdXRleF9sb2NrKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CiAJdmlzb3JidXNfZGlzYWJsZV9jaGFubmVsX2ludGVycnVwdHMoZGV2KTsKIAogCS8qCkBAIC00MzgsMTAgKzQ4OCwxMCBAQAogCSAqIGluIHZpc29yaW5wdXRfY2hhbm5lbF9pbnRlcnJ1cHQoKQogCSAqLwogCi0JZG93bl93cml0ZSgmZGV2ZGF0YS0+bG9ja192aXNvcl9kZXYpOwogCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXZpY2UsIE5VTEwpOworCW11dGV4X3VubG9jaygmZGV2ZGF0YS0+bG9ja192aXNvcl9kZXYpOworCiAJdW5yZWdpc3Rlcl9jbGllbnRfaW5wdXQoZGV2ZGF0YS0+dmlzb3JpbnB1dF9kZXYpOwotCXVwX3dyaXRlKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CiAJa2ZyZWUoZGV2ZGF0YSk7CiB9CiAKQEAgLTUyOSwxNSArNTc5LDkgQEAKIAlpZiAoIWRldmRhdGEpCiAJCXJldHVybjsKIAotCWRvd25fd3JpdGUoJmRldmRhdGEtPmxvY2tfdmlzb3JfZGV2KTsKLQlpZiAoZGV2ZGF0YS0+cGF1c2VkKSAvKiBkb24ndCB0b3VjaCBkZXZpY2UvY2hhbm5lbCB3aGVuIHBhdXNlZCAqLwotCQlnb3RvIG91dF9sb2NrZWQ7Ci0KIAl2aXNvcmlucHV0X2RldiA9IGRldmRhdGEtPnZpc29yaW5wdXRfZGV2OwotCWlmICghdmlzb3JpbnB1dF9kZXYpCi0JCWdvdG8gb3V0X2xvY2tlZDsKIAotCXdoaWxlICh2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKGRldi0+dmlzb3JjaGFubmVsLCAwLCAmcikpIHsKKwl3aGlsZSAoIXZpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUoZGV2LT52aXNvcmNoYW5uZWwsIDAsICZyKSkgewogCQlzY2FuY29kZSA9IHIuYWN0aXZpdHkuYXJnMTsKIAkJa2V5Y29kZSA9IHNjYW5jb2RlX3RvX2tleWNvZGUoc2NhbmNvZGUpOwogCQlzd2l0Y2ggKHIuYWN0aXZpdHkuYWN0aW9uKSB7CkBAIC02MTEsOCArNjU1LDYgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQotb3V0X2xvY2tlZDoKLQl1cF93cml0ZSgmZGV2ZGF0YS0+bG9ja192aXNvcl9kZXYpOwogfQogCiBzdGF0aWMgaW50CkBAIC02MjcsMTYgKzY2OSwyNCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlkb3duX3dyaXRlKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CisJbXV0ZXhfbG9jaygmZGV2ZGF0YS0+bG9ja192aXNvcl9kZXYpOwogCWlmIChkZXZkYXRhLT5wYXVzZWQpIHsKIAkJcmMgPSAtRUJVU1k7CiAJCWdvdG8gb3V0X2xvY2tlZDsKIAl9CisJaWYgKGRldmRhdGEtPmludGVycnVwdHNfZW5hYmxlZCkKKwkJdmlzb3JidXNfZGlzYWJsZV9jaGFubmVsX2ludGVycnVwdHMoZGV2KTsKKworCS8qCisJICogZHVlIHRvIGFib3ZlLCBhdCB0aGlzIHRpbWUgbm8gdGhyZWFkIG9mIGV4ZWN1dGlvbiB3aWxsIGJlCisJICogaW4gdmlzb3JpbnB1dF9jaGFubmVsX2ludGVycnVwdCgpCisJICovCisKIAlkZXZkYXRhLT5wYXVzZWQgPSB0cnVlOwogCWNvbXBsZXRlX2Z1bmMoZGV2LCAwKTsKIAlyYyA9IDA7CiBvdXRfbG9ja2VkOgotCXVwX3dyaXRlKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CisJbXV0ZXhfdW5sb2NrKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CiBvdXQ6CiAJcmV0dXJuIHJjOwogfQpAQCAtNjUyLDE2ICs3MDIsMjUgQEAKIAkJcmMgPSAtRU5PREVWOwogCQlnb3RvIG91dDsKIAl9Ci0JZG93bl93cml0ZSgmZGV2ZGF0YS0+bG9ja192aXNvcl9kZXYpOworCW11dGV4X2xvY2soJmRldmRhdGEtPmxvY2tfdmlzb3JfZGV2KTsKIAlpZiAoIWRldmRhdGEtPnBhdXNlZCkgewogCQlyYyA9IC1FQlVTWTsKIAkJZ290byBvdXRfbG9ja2VkOwogCX0KIAlkZXZkYXRhLT5wYXVzZWQgPSBmYWxzZTsKIAljb21wbGV0ZV9mdW5jKGRldiwgMCk7CisKKwkvKgorCSAqIFJlLWVzdGFibGlzaCBjYWxscyB0byB2aXNvcmlucHV0X2NoYW5uZWxfaW50ZXJydXB0KCkgaWYgdGhhdCBpcworCSAqIHRoZSBkZXNpcmVkIHN0YXRlIHRoYXQgd2UndmUga2VwdCB0cmFjayBvZiBpbiBpbnRlcnJ1cHRzX2VuYWJsZWQKKwkgKiB3aGlsZSB0aGUgZGV2aWNlIHdhcyBwYXVzZWQuCisJICovCisJaWYgKGRldmRhdGEtPmludGVycnVwdHNfZW5hYmxlZCkKKwkJdmlzb3JidXNfZW5hYmxlX2NoYW5uZWxfaW50ZXJydXB0cyhkZXYpOworCiAJcmMgPSAwOwogb3V0X2xvY2tlZDoKLQl1cF93cml0ZSgmZGV2ZGF0YS0+bG9ja192aXNvcl9kZXYpOworCW11dGV4X3VubG9jaygmZGV2ZGF0YS0+bG9ja192aXNvcl9kZXYpOwogb3V0OgogCXJldHVybiByYzsKIH0KQEAgLTY3NSw3ICs3MzQsNiBAQAogCiBzdGF0aWMgc3RydWN0IHZpc29yX2RyaXZlciB2aXNvcmlucHV0X2RyaXZlciA9IHsKIAkubmFtZSA9ICJ2aXNvcmlucHV0IiwKLQkudmVydGFnID0gTlVMTCwKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkuY2hhbm5lbF90eXBlcyA9IHZpc29yaW5wdXRfY2hhbm5lbF90eXBlcywKIAkucHJvYmUgPSB2aXNvcmlucHV0X3Byb2JlLApAQCAtNzA0LDggKzc2Miw3IEBACiAKIE1PRFVMRV9BVVRIT1IoIlVuaXN5cyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJzLVBhciBodW1hbiBpbnB1dCBkcml2ZXIgZm9yIGd1ZXN0IExpbnV4Iik7Ci1NT0RVTEVfVkVSU0lPTihWRVJTSU9OKTsKK01PRFVMRV9ERVNDUklQVElPTigicy1QYXIgaHVtYW4gaW5wdXQgZHJpdmVyIGZvciB2aXJ0dWFsIGtleWJvYXJkL21vdXNlIik7CiAKIE1PRFVMRV9BTElBUygidmlzb3JidXM6IiBTUEFSX01PVVNFX0NIQU5ORUxfUFJPVE9DT0xfVVVJRF9TVFIpOwogTU9EVUxFX0FMSUFTKCJ2aXNvcmJ1czoiIFNQQVJfS0VZQk9BUkRfQ0hBTk5FTF9QUk9UT0NPTF9VVUlEX1NUUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ybmljL3Zpc29ybmljX21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JuaWMvdmlzb3JuaWNfbWFpbi5jCmluZGV4IGEyODM4OGQuLjEzNjcwMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JuaWMvdmlzb3JuaWNfbWFpbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JuaWMvdmlzb3JuaWNfbWFpbi5jCkBAIC0yOSw4ICsyOSw2IEBACiAjaW5jbHVkZSAiaW9jaGFubmVsLmgiCiAKICNkZWZpbmUgVklTT1JOSUNfSU5GSU5JVEVfUlNQX1dBSVQgMAotI2RlZmluZSBWSVNPUk5JQ1NPUEVOTUFYIDMyCi0jZGVmaW5lIE1BWERFVklDRVMgICAgIDE2Mzg0CiAKIC8qIE1BWF9CVUYgPSA2NCBsaW5lcyB4IDMyIE1BWFZOSUMgeCA4MCBjaGFyYWN0ZXJzCiAgKiAgICAgICAgID0gMTYzODQwIGJ5dGVzCkBAIC0zOCwyNyArMzYsNiBAQAogI2RlZmluZSBNQVhfQlVGIDE2Mzg0MAogI2RlZmluZSBOQVBJX1dFSUdIVCA2NAogCi1zdGF0aWMgaW50IHZpc29ybmljX3Byb2JlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCB2aXNvcm5pY19yZW1vdmUoc3RydWN0IHZpc29yX2RldmljZSAqZGV2KTsKLXN0YXRpYyBpbnQgdmlzb3JuaWNfcGF1c2Uoc3RydWN0IHZpc29yX2RldmljZSAqZGV2LAotCQkJICB2aXNvcmJ1c19zdGF0ZV9jb21wbGV0ZV9mdW5jIGNvbXBsZXRlX2Z1bmMpOwotc3RhdGljIGludCB2aXNvcm5pY19yZXN1bWUoc3RydWN0IHZpc29yX2RldmljZSAqZGV2LAotCQkJICAgdmlzb3JidXNfc3RhdGVfY29tcGxldGVfZnVuYyBjb21wbGV0ZV9mdW5jKTsKLQotLyogREVCVUdGUyBkZWNsYXJhdGlvbnMgKi8KLXN0YXRpYyBzc2l6ZV90IGluZm9fZGVidWdmc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJCSBzaXplX3QgbGVuLCBsb2ZmX3QgKm9mZnNldCk7Ci1zdGF0aWMgc3NpemVfdCBlbmFibGVfaW50c193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQkgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKTsKLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICp2aXNvcm5pY19kZWJ1Z2ZzX2RpcjsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnZnNfaW5mb19mb3BzID0gewotCS5yZWFkID0gaW5mb19kZWJ1Z2ZzX3JlYWQsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z2ZzX2VuYWJsZV9pbnRzX2ZvcHMgPSB7Ci0JLndyaXRlID0gZW5hYmxlX2ludHNfd3JpdGUsCi19OwotCiAvKiBHVUlEUyBmb3IgZGlyZWN0b3IgY2hhbm5lbCB0eXBlIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4gICovCiBzdGF0aWMgc3RydWN0IHZpc29yX2NoYW5uZWx0eXBlX2Rlc2NyaXB0b3Igdmlzb3JuaWNfY2hhbm5lbF90eXBlc1tdID0gewogCS8qIE5vdGUgdGhhdCB0aGUgb25seSBjaGFubmVsIHR5cGUgd2UgZXhwZWN0IHRvIGJlIHJlcG9ydGVkIGJ5IHRoZQpAQCAtNzcsMjMgKzU0LDYgQEAKICAqLwogTU9EVUxFX0FMSUFTKCJ2aXNvcmJ1czoiIFNQQVJfVk5JQ19DSEFOTkVMX1BST1RPQ09MX1VVSURfU1RSKTsKIAotLyogVGhpcyBpcyB1c2VkIHRvIHRlbGwgdGhlIHZpc29yIGJ1cyBkcml2ZXIgd2hpY2ggdHlwZXMgb2Ygdmlzb3IgZGV2aWNlcwotICogd2Ugc3VwcG9ydCwgYW5kIHdoYXQgZnVuY3Rpb25zIHRvIGNhbGwgd2hlbiBhIHZpc29yIGRldmljZSB0aGF0IHdlIHN1cHBvcnQKLSAqIGlzIGF0dGFjaGVkIG9yIHJlbW92ZWQuCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgdmlzb3JfZHJpdmVyIHZpc29ybmljX2RyaXZlciA9IHsKLQkubmFtZSA9ICJ2aXNvcm5pYyIsCi0JLnZlcnNpb24gPSAiMS4wLjAuMCIsCi0JLnZlcnRhZyA9IE5VTEwsCi0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLmNoYW5uZWxfdHlwZXMgPSB2aXNvcm5pY19jaGFubmVsX3R5cGVzLAotCS5wcm9iZSA9IHZpc29ybmljX3Byb2JlLAotCS5yZW1vdmUgPSB2aXNvcm5pY19yZW1vdmUsCi0JLnBhdXNlID0gdmlzb3JuaWNfcGF1c2UsCi0JLnJlc3VtZSA9IHZpc29ybmljX3Jlc3VtZSwKLQkuY2hhbm5lbF9pbnRlcnJ1cHQgPSBOVUxMLAotfTsKLQogc3RydWN0IGNoYW5zdGF0IHsKIAl1bnNpZ25lZCBsb25nIGdvdF9yY3Y7CiAJdW5zaWduZWQgbG9uZyBnb3RfZW5iZGlzYWNrOwpAQCAtMTgxLDkgKzE0MSw2IEBACiAJc3RydWN0IHVpc2NtZHJzcCBjbWRyc3BbU0laRU9GX0NNRFJTUF07CiB9OwogCi1zdGF0aWMgaW50IHZpc29ybmljX3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KTsKLXN0YXRpYyB2b2lkIHBvbGxfZm9yX2lycSh1bnNpZ25lZCBsb25nIHYpOwotCiAvKioKICAqCXZpc29yX2NvcHlfZnJhZ3NpbmZvX2Zyb21fc2tiKAogICoJQHNrYl9pbjogc2tidWZmIHRoYXQgd2UgYXJlIHB1bGxpbmcgdGhlIGZyYWdzIGZyb20KQEAgLTI4OSw2ICsyNDYsMTAgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnZnNfZW5hYmxlX2ludHNfZm9wcyA9IHsKKwkud3JpdGUgPSBlbmFibGVfaW50c193cml0ZSwKK307CisKIC8qKgogICoJdmlzb3JuaWNfc2VydmVyZG93bl9jb21wbGV0ZSAtIElPUEFSVCB3ZW50IGRvd24sIHBhdXNlIGRldmljZQogICoJQHdvcms6IFdvcmsgcXVldWUgaXQgd2FzIHNjaGVkdWxlZCBvbgpAQCAtNDI1LDkgKzM4Niw5IEBACiAJaWYgKChjbWRyc3AtPm5ldC5yY3Zwb3N0LmZyYWcucGlfb2ZmICsgc2tiLT5sZW4pIDw9IFBJX1BBR0VfU0laRSkgewogCQljbWRyc3AtPm5ldC50eXBlID0gTkVUX1JDVl9QT1NUOwogCQljbWRyc3AtPmNtZHR5cGUgPSBDTURfTkVUX1RZUEU7Ci0JCWlmICh2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KGRldmRhdGEtPmRldi0+dmlzb3JjaGFubmVsLAotCQkJCQkgICAgICBJT0NIQU5fVE9fSU9QQVJULAotCQkJCQkgICAgICBjbWRyc3ApKSB7CisJCWlmICghdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChkZXZkYXRhLT5kZXYtPnZpc29yY2hhbm5lbCwKKwkJCQkJICAgICAgIElPQ0hBTl9UT19JT1BBUlQsCisJCQkJCSAgICAgICBjbWRyc3ApKSB7CiAJCQlhdG9taWNfaW5jKCZkZXZkYXRhLT5udW1fcmN2YnVmX2luX2lvdm0pOwogCQkJZGV2ZGF0YS0+Y2hzdGF0LnNlbnRfcG9zdCsrOwogCQl9IGVsc2UgewpAQCAtNDU0LDkgKzQxNSw5IEBACiAJZGV2ZGF0YS0+Y21kcnNwX3Jjdi0+bmV0LmVuYmRpcy5jb250ZXh0ID0gbmV0ZGV2OwogCWRldmRhdGEtPmNtZHJzcF9yY3YtPm5ldC50eXBlID0gTkVUX1JDVl9FTkJESVM7CiAJZGV2ZGF0YS0+Y21kcnNwX3Jjdi0+Y21kdHlwZSA9IENNRF9ORVRfVFlQRTsKLQlpZiAodmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChkZXZkYXRhLT5kZXYtPnZpc29yY2hhbm5lbCwKLQkJCQkgICAgICBJT0NIQU5fVE9fSU9QQVJULAotCQkJCSAgICAgIGRldmRhdGEtPmNtZHJzcF9yY3YpKQorCWlmICghdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChkZXZkYXRhLT5kZXYtPnZpc29yY2hhbm5lbCwKKwkJCQkgICAgICAgSU9DSEFOX1RPX0lPUEFSVCwKKwkJCQkgICAgICAgZGV2ZGF0YS0+Y21kcnNwX3JjdikpCiAJCWRldmRhdGEtPmNoc3RhdC5zZW50X2VuYmRpcysrOwogfQogCkBAIC05MjAsOCArODgxLDggQEAKIAkJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAl9CiAKLQlpZiAoIXZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoZGV2ZGF0YS0+ZGV2LT52aXNvcmNoYW5uZWwsCi0JCQkJICAgICAgIElPQ0hBTl9UT19JT1BBUlQsIGNtZHJzcCkpIHsKKwlpZiAodmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChkZXZkYXRhLT5kZXYtPnZpc29yY2hhbm5lbCwKKwkJCQkgICAgICBJT0NIQU5fVE9fSU9QQVJULCBjbWRyc3ApKSB7CiAJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2ZGF0YS0+cHJpdl9sb2NrLCBmbGFncyk7CiAJCWRldmRhdGEtPmJ1c3lfY250Kys7CkBAIC0xNTIyLDYgKzE0ODMsMTEgQEAKIAlyZXR1cm4gYnl0ZXNfcmVhZDsKIH0KIAorc3RhdGljIHN0cnVjdCBkZW50cnkgKnZpc29ybmljX2RlYnVnZnNfZGlyOworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVidWdmc19pbmZvX2ZvcHMgPSB7CisJLnJlYWQgPSBpbmZvX2RlYnVnZnNfcmVhZCwKK307CisKIC8qKgogICoJc2VuZF9yY3ZfcG9zdHNfaWZfbmVlZGVkCiAgKglAZGV2ZGF0YTogdmlzb3JuaWMgZGV2aWNlCkBAIC0xNTczLDkgKzE1MzksOSBAQAogc3RhdGljIHZvaWQKIGRyYWluX3Jlc3BfcXVldWUoc3RydWN0IHVpc2NtZHJzcCAqY21kcnNwLCBzdHJ1Y3Qgdmlzb3JuaWNfZGV2ZGF0YSAqZGV2ZGF0YSkKIHsKLQl3aGlsZSAodmlzb3JjaGFubmVsX3NpZ25hbHJlbW92ZShkZXZkYXRhLT5kZXYtPnZpc29yY2hhbm5lbCwKLQkJCQkJIElPQ0hBTl9GUk9NX0lPUEFSVCwKLQkJCQkJIGNtZHJzcCkpCisJd2hpbGUgKCF2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKGRldmRhdGEtPmRldi0+dmlzb3JjaGFubmVsLAorCQkJCQkgIElPQ0hBTl9GUk9NX0lPUEFSVCwKKwkJCQkJICBjbWRyc3ApKQogCQk7CiB9CiAKQEAgLTE1ODYsNyArMTU1Miw3IEBACiAgKgogICoJRHJhaW4gdGhlIHJlc3BvbmVzIHF1ZXVlIG9mIGFueSByZXNwb25zZXMgZnJvbSB0aGUgSU8gcGFydGl0aW9uLgogICoJUHJvY2VzcyB0aGUgcmVzcG9uc2VzIGFzIHdlIGdldCB0aGVtLgotICoJUmV0dXJucyB3aGVuIHJlc3BvbnNlIHF1ZXVlIGlzIGVtcHR5IG9yIHdoZW4gdGhlIHRocmVhZGQgc3RvcHMuCisgKglSZXR1cm5zIHdoZW4gcmVzcG9uc2UgcXVldWUgaXMgZW1wdHkgb3Igd2hlbiB0aGUgdGhyZWFkIHN0b3BzLgogICovCiBzdGF0aWMgdm9pZAogc2VydmljZV9yZXNwX3F1ZXVlKHN0cnVjdCB1aXNjbWRyc3AgKmNtZHJzcCwgc3RydWN0IHZpc29ybmljX2RldmRhdGEgKmRldmRhdGEsCkBAIC0xNTk5LDkgKzE1NjUsOSBAQAogCS8qIFRPRE86IENMSUVOVCBBQ1FVSVJFIC0tIERvbid0IHJlYWxseSBuZWVkIHRoaXMgYXQgdGhlCiAJICogbW9tZW50CiAJICovCi0JCWlmICghdmlzb3JjaGFubmVsX3NpZ25hbHJlbW92ZShkZXZkYXRhLT5kZXYtPnZpc29yY2hhbm5lbCwKLQkJCQkJICAgICAgIElPQ0hBTl9GUk9NX0lPUEFSVCwKLQkJCQkJICAgICAgIGNtZHJzcCkpCisJCWlmICh2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKGRldmRhdGEtPmRldi0+dmlzb3JjaGFubmVsLAorCQkJCQkgICAgICBJT0NIQU5fRlJPTV9JT1BBUlQsCisJCQkJCSAgICAgIGNtZHJzcCkpCiAJCQlicmVhazsgLyogcXVldWUgZW1wdHkgKi8KIAogCQlzd2l0Y2ggKGNtZHJzcC0+bmV0LnR5cGUpIHsKQEAgLTIwNjEsNiArMjAyNywyMSBAQAogCXJldHVybiAwOwogfQogCisvKiBUaGlzIGlzIHVzZWQgdG8gdGVsbCB0aGUgdmlzb3IgYnVzIGRyaXZlciB3aGljaCB0eXBlcyBvZiB2aXNvciBkZXZpY2VzCisgKiB3ZSBzdXBwb3J0LCBhbmQgd2hhdCBmdW5jdGlvbnMgdG8gY2FsbCB3aGVuIGEgdmlzb3IgZGV2aWNlIHRoYXQgd2Ugc3VwcG9ydAorICogaXMgYXR0YWNoZWQgb3IgcmVtb3ZlZC4KKyAqLworc3RhdGljIHN0cnVjdCB2aXNvcl9kcml2ZXIgdmlzb3JuaWNfZHJpdmVyID0geworCS5uYW1lID0gInZpc29ybmljIiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuY2hhbm5lbF90eXBlcyA9IHZpc29ybmljX2NoYW5uZWxfdHlwZXMsCisJLnByb2JlID0gdmlzb3JuaWNfcHJvYmUsCisJLnJlbW92ZSA9IHZpc29ybmljX3JlbW92ZSwKKwkucGF1c2UgPSB2aXNvcm5pY19wYXVzZSwKKwkucmVzdW1lID0gdmlzb3JuaWNfcmVzdW1lLAorCS5jaGFubmVsX2ludGVycnVwdCA9IE5VTEwsCit9OworCiAvKioKICAqCXZpc29ybmljX2luaXQJLSBJbml0IGZ1bmN0aW9uCiAgKgpAQCAtMjExNSw1ICsyMDk2LDQgQEAKIAogTU9EVUxFX0FVVEhPUigiVW5pc3lzIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oInNQQVIgbmljIGRyaXZlciBmb3Igc3BhcmxpbnV4OiB2ZXIgMS4wLjAuMCIpOwotTU9EVUxFX1ZFUlNJT04oIjEuMC4wLjAiKTsKK01PRFVMRV9ERVNDUklQVElPTigicy1QYXIgTklDIGRyaXZlciBmb3IgdmlydHVhbCBuZXR3b3JrIGRldmljZXMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NzZmYjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9LY29uZmlnCkBAIC0wLDAgKzEsOSBAQAorY29uZmlnIEJDTTI3MDhfVkNISVEKKwl0cmlzdGF0ZSAiVmlkZW9jb3JlIFZDSElRIgorCWRlcGVuZHMgb24gUkFTUEJFUlJZUElfRklSTVdBUkUgJiYgQlJPS0VOCisJZGVmYXVsdCB5CisJaGVscAorCQlLZXJuZWwgdG8gVmlkZW9Db3JlIGNvbW11bmljYXRpb24gaW50ZXJmYWNlIGZvciB0aGUKKwkJQkNNMjcwOCBmYW1pbHkgb2YgcHJvZHVjdHMuCisJCURlZmF1bHRzIHRvIFkgd2hlbiB0aGUgQnJvYWRjb20gVmlkZW9jb3JlIHNlcnZpY2VzCisJCWFyZSBpbmNsdWRlZCBpbiB0aGUgYnVpbGQsIE4gb3RoZXJ3aXNlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGFiNDc4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvTWFrZWZpbGUKQEAgLTAsMCArMSwxNCBAQAorb2JqLSQoQ09ORklHX0JDTTI3MDhfVkNISVEpCSs9IHZjaGlxLm8KKwordmNoaXEtb2JqcyA6PSBcCisgICBpbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2NvcmUubyAgXAorICAgaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9hcm0ubyBcCisgICBpbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2tlcm5fbGliLm8gXAorICAgaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV8yODM1X2FybS5vIFwKKyAgIGludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfZGVidWdmcy5vIFwKKyAgIGludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfc2hpbS5vIFwKKyAgIGludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfdXRpbC5vIFwKKyAgIGludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfY29ubmVjdGVkLm8gXAorCitjY2ZsYWdzLXkgKz0gLURWQ09TX1ZFUklGWV9CS1BUUz0xIC1JZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMgLURVU0VfVkNISVFfQVJNIC1EX19WQ0NPUkVWRVJfXz0weDA0MDAwMDAwCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpL2Nvbm5lY3Rpb25zL2Nvbm5lY3Rpb24uaCBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpL2Nvbm5lY3Rpb25zL2Nvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWY2YWMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGkvY29ubmVjdGlvbnMvY29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsMzI4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEyIEJyb2FkY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbWF5IG5vdCBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIENPTk5FQ1RJT05fSF8KKyNkZWZpbmUgQ09OTkVDVElPTl9IXworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKworI2luY2x1ZGUgImludGVyZmFjZS92Y2hpL3ZjaGlfY2ZnX2ludGVybmFsLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlL3ZjaGkvdmNoaV9jb21tb24uaCIKKyNpbmNsdWRlICJpbnRlcmZhY2UvdmNoaS9tZXNzYWdlX2RyaXZlcnMvbWVzc2FnZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgR2xvYmFsIGRlZnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gT3BhcXVlIGhhbmRsZSBmb3IgYSBjb25uZWN0aW9uIC8gc2VydmljZSBwYWlyCit0eXBlZGVmIHN0cnVjdCBvcGFxdWVfdmNoaV9jb25uZWN0aW9uX2Nvbm5lY3RlZF9zZXJ2aWNlX2hhbmRsZV90ICpWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9IQU5ETEVfVDsKKworLy8gb3BhcXVlIGhhbmRsZSB0byB0aGUgY29ubmVjdGlvbiBzdGF0ZSBpbmZvcm1hdGlvbgordHlwZWRlZiBzdHJ1Y3Qgb3BhcXVlX3ZjaGlfY29ubmVjdGlvbl9pbmZvX3QgVkNISV9DT05ORUNUSU9OX1NUQVRFX1Q7CisKK3R5cGVkZWYgc3RydWN0IHZjaGlfY29ubmVjdGlvbl90IFZDSElfQ09OTkVDVElPTl9UOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBUEkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gUm91dGluZSB0byBpbml0IGEgY29ubmVjdGlvbiB3aXRoIGEgcGFydGljdWxhciBsb3cgbGV2ZWwgZHJpdmVyCit0eXBlZGVmIFZDSElfQ09OTkVDVElPTl9TVEFURV9UICogKCpWQ0hJX0NPTk5FQ1RJT05fSU5JVF9UKSggc3RydWN0IHZjaGlfY29ubmVjdGlvbl90ICogY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWQ0hJX01FU1NBR0VfRFJJVkVSX1QgKiBkcml2ZXIgKTsKKworLy8gUm91dGluZSB0byBjb250cm9sIENSQyBlbmFibGluZyBhdCBhIGNvbm5lY3Rpb24gbGV2ZWwKK3R5cGVkZWYgaW50MzJfdCAoKlZDSElfQ09OTkVDVElPTl9DUkNfQ09OVFJPTF9UKSggVkNISV9DT05ORUNUSU9OX1NUQVRFX1QgKnN0YXRlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9DUkNfQ09OVFJPTF9UIGNvbnRyb2wgKTsKKworLy8gUm91dGluZSB0byBjcmVhdGUgYSBzZXJ2aWNlCit0eXBlZGVmIGludDMyX3QgKCpWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9DT05ORUNUX1QpKCBWQ0hJX0NPTk5FQ1RJT05fU1RBVEVfVCAqc3RhdGVfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXJ2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcnhfZmlmb19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHhfZmlmb19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfQ0FMTEJBQ0tfVCBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNhbGxiYWNrX3BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3YW50X2NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2FudF91bmFsaWduZWRfYnVsa19yeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2FudF91bmFsaWduZWRfYnVsa190eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0hBTkRMRV9UICpzZXJ2aWNlX2hhbmRsZSApOworCisvLyBSb3V0aW5lIHRvIGNsb3NlIGEgc2VydmljZQordHlwZWRlZiBpbnQzMl90ICgqVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfRElTQ09OTkVDVF9UKSggVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZV9oYW5kbGUgKTsKKworLy8gUm91dGluZSB0byBxdWV1ZSBhIG1lc3NhZ2UKK3R5cGVkZWYgaW50MzJfdCAoKlZDSElfQ09OTkVDVElPTl9TRVJWSUNFX1FVRVVFX01FU1NBR0VfVCkoIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2VfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfRkxBR1NfVCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZ19oYW5kbGUgKTsKKworLy8gc2NhdHRlci1nYXRoZXIgKHZlY3RvcikgbWVzc2FnZSBxdWV1ZWluZwordHlwZWRlZiBpbnQzMl90ICgqVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfUVVFVUVfTUVTU0FHRVZfVCkoIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2VfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfTVNHX1ZFQ1RPUl9UICp2ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9GTEFHU19UIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZ19oYW5kbGUgKTsKKworLy8gUm91dGluZSB0byBkZXF1ZXVlIGEgbWVzc2FnZQordHlwZWRlZiBpbnQzMl90ICgqVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfREVRVUVVRV9NRVNTQUdFX1QpKCBWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4X2RhdGFfc2l6ZV90b19yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqYWN0dWFsX21zZ19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX0ZMQUdTX1QgZmxhZ3MgKTsKKworLy8gUm91dGluZSB0byBwZWVrIGF0IGEgbWVzc2FnZQordHlwZWRlZiBpbnQzMl90ICgqVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfUEVFS19NRVNTQUdFX1QpKCBWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICptc2dfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9GTEFHU19UIGZsYWdzICk7CisKKy8vIFJvdXRpbmUgdG8gaG9sZCBhIG1lc3NhZ2UKK3R5cGVkZWYgaW50MzJfdCAoKlZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0hPTERfTUVTU0FHRV9UKSggVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbXNnX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfRkxBR1NfVCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKm1lc3NhZ2VfaGFuZGxlICk7CisKKy8vIFJvdXRpbmUgdG8gaW5pdGlhbGlzZSBhIHJlY2VpdmVkIG1lc3NhZ2UgaXRlcmF0b3IKK3R5cGVkZWYgaW50MzJfdCAoKlZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0xPT0tBSEVBRF9NRVNTQUdFX1QpKCBWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX01TR19JVEVSX1QgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9GTEFHU19UIGZsYWdzICk7CisKKy8vIFJvdXRpbmUgdG8gcmVsZWFzZSBhIGhlbGQgbWVzc2FnZQordHlwZWRlZiBpbnQzMl90ICgqVkNISV9DT05ORUNUSU9OX0hFTERfTVNHX1JFTEVBU0VfVCkoIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2VfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1lc3NhZ2VfaGFuZGxlICk7CisKKy8vIFJvdXRpbmUgdG8gZ2V0IGluZm8gb24gYSBoZWxkIG1lc3NhZ2UKK3R5cGVkZWYgaW50MzJfdCAoKlZDSElfQ09OTkVDVElPTl9IRUxEX01TR19JTkZPX1QpKCBWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptZXNzYWdlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICptc2dfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqdHhfdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpyeF90aW1lc3RhbXAgKTsKKworLy8gUm91dGluZSB0byBjaGVjayB3aGV0aGVyIHRoZSBpdGVyYXRvciBoYXMgYSBuZXh0IG1lc3NhZ2UKK3R5cGVkZWYgaW50MzJfdCAoKlZDSElfQ09OTkVDVElPTl9NU0dfSVRFUl9IQVNfTkVYVF9UKSggVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWQ0hJX01TR19JVEVSX1QgKml0ZXIgKTsKKworLy8gUm91dGluZSB0byBhZHZhbmNlIHRoZSBpdGVyYXRvcgordHlwZWRlZiBpbnQzMl90ICgqVkNISV9DT05ORUNUSU9OX01TR19JVEVSX05FWFRfVCkoIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9NU0dfSVRFUl9UICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICptc2dfc2l6ZSApOworCisvLyBSb3V0aW5lIHRvIHJlbW92ZSB0aGUgbGFzdCBtZXNzYWdlIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgordHlwZWRlZiBpbnQzMl90ICgqVkNISV9DT05ORUNUSU9OX01TR19JVEVSX1JFTU9WRV9UKSggVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfTVNHX0lURVJfVCAqaXRlciApOworCisvLyBSb3V0aW5lIHRvIGhvbGQgdGhlIGxhc3QgbWVzc2FnZSByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKK3R5cGVkZWYgaW50MzJfdCAoKlZDSElfQ09OTkVDVElPTl9NU0dfSVRFUl9IT0xEX1QpKCBWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfTVNHX0lURVJfVCAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqbXNnX2hhbmRsZSApOworCisvLyBSb3V0aW5lIHRvIHRyYW5zbWl0IGJ1bGsgZGF0YQordHlwZWRlZiBpbnQzMl90ICgqVkNISV9DT05ORUNUSU9OX0JVTEtfUVVFVUVfVFJBTlNNSVRfVCkoIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2VfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGFfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX0ZMQUdTX1QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVsa19oYW5kbGUgKTsKKworLy8gUm91dGluZSB0byByZWNlaXZlIGRhdGEKK3R5cGVkZWYgaW50MzJfdCAoKlZDSElfQ09OTkVDVElPTl9CVUxLX1FVRVVFX1JFQ0VJVkVfVCkoIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2VfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YV9kc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX0ZMQUdTX1QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWxrX2hhbmRsZSApOworCisvLyBSb3V0aW5lIHRvIHJlcG9ydCBpZiBhIHNlcnZlciBpcyBhdmFpbGFibGUKK3R5cGVkZWYgaW50MzJfdCAoKlZDSElfQ09OTkVDVElPTl9TRVJWRVJfUFJFU0VOVCkoIFZDSElfQ09OTkVDVElPTl9TVEFURV9UICpzdGF0ZSwgaW50MzJfdCBzZXJ2aWNlX2lkLCBpbnQzMl90IHBlZXJfZmxhZ3MgKTsKKworLy8gUm91dGluZSB0byByZXBvcnQgdGhlIG51bWJlciBvZiBSWCBzbG90cyBhdmFpbGFibGUKK3R5cGVkZWYgaW50ICgqVkNISV9DT05ORUNUSU9OX1JYX1NMT1RTX0FWQUlMQUJMRSkoIGNvbnN0IFZDSElfQ09OTkVDVElPTl9TVEFURV9UICpzdGF0ZSApOworCisvLyBSb3V0aW5lIHRvIHJlcG9ydCB0aGUgUlggc2xvdCBzaXplCit0eXBlZGVmIHVpbnQzMl90ICgqVkNISV9DT05ORUNUSU9OX1JYX1NMT1RfU0laRSkoIGNvbnN0IFZDSElfQ09OTkVDVElPTl9TVEFURV9UICpzdGF0ZSApOworCisvLyBDYWxsYmFjayB0byBpbmRpY2F0ZSB0aGF0IHRoZSBvdGhlciBzaWRlIGhhcyBhZGRlZCBhIGJ1ZmZlciB0byB0aGUgcnggYnVsayBETUEgRklGTwordHlwZWRlZiB2b2lkICgqVkNISV9DT05ORUNUSU9OX1JYX0JVTEtfQlVGRkVSX0FEREVEKShWQ0hJX0NPTk5FQ1RJT05fU1RBVEVfVCAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVNTQUdFX1RYX0NIQU5ORUxfVCBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsX3BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRhdGFfb2Zmc2V0KTsKKworLy8gQ2FsbGJhY2sgdG8gaW5mb3JtIGEgc2VydmljZSB0aGF0IGEgWG9uIG9yIFhvZmYgbWVzc2FnZSBoYXMgYmVlbiByZWNlaXZlZAordHlwZWRlZiB2b2lkICgqVkNISV9DT05ORUNUSU9OX0ZMT1dfQ09OVFJPTCkoVkNISV9DT05ORUNUSU9OX1NUQVRFX1QgKnN0YXRlLCBpbnQzMl90IHNlcnZpY2VfaWQsIGludDMyX3QgeG9mZik7CisKKy8vIENhbGxiYWNrIHRvIGluZm9ybSBhIHNlcnZpY2UgdGhhdCBhIHNlcnZlciBhdmFpbGFibGUgcmVwbHkgbWVzc2FnZSBoYXMgYmVlbiByZWNlaXZlZAordHlwZWRlZiB2b2lkICgqVkNISV9DT05ORUNUSU9OX1NFUlZFUl9BVkFJTEFCTEVfUkVQTFkpKFZDSElfQ09OTkVDVElPTl9TVEFURV9UICpzdGF0ZSwgaW50MzJfdCBzZXJ2aWNlX2lkLCB1aW50MzJfdCBmbGFncyk7CisKKy8vIENhbGxiYWNrIHRvIGluZGljYXRlIHRoYXQgYnVsayBhdXhpbGlhcnkgbWVzc2FnZXMgaGF2ZSBhcnJpdmVkCit0eXBlZGVmIHZvaWQgKCpWQ0hJX0NPTk5FQ1RJT05fQlVMS19BVVhfUkVDRUlWRUQpKFZDSElfQ09OTkVDVElPTl9TVEFURV9UICpzdGF0ZSk7CisKKy8vIENhbGxiYWNrIHRvIGluZGljYXRlIHRoYXQgYnVsayBhdXhpbGlhcnkgbWVzc2FnZXMgaGF2ZSBhcnJpdmVkCit0eXBlZGVmIHZvaWQgKCpWQ0hJX0NPTk5FQ1RJT05fQlVMS19BVVhfVFJBTlNNSVRURUQpKFZDSElfQ09OTkVDVElPTl9TVEFURV9UICpzdGF0ZSwgdm9pZCAqaGFuZGxlKTsKKworLy8gQ2FsbGJhY2sgd2l0aCBhbGwgdGhlIGNvbm5lY3Rpb24gaW5mbyB5b3UgcmVxdWlyZQordHlwZWRlZiB2b2lkICgqVkNISV9DT05ORUNUSU9OX0lORk8pKFZDSElfQ09OTkVDVElPTl9TVEFURV9UICpzdGF0ZSwgdWludDMyX3QgcHJvdG9jb2xfdmVyc2lvbiwgdWludDMyX3Qgc2xvdF9zaXplLCB1aW50MzJfdCBudW1fc2xvdHMsIHVpbnQzMl90IG1pbl9idWxrX3NpemUpOworCisvLyBDYWxsYmFjayB0byBpbmZvcm0gb2YgYSBkaXNjb25uZWN0Cit0eXBlZGVmIHZvaWQgKCpWQ0hJX0NPTk5FQ1RJT05fRElTQ09OTkVDVCkoVkNISV9DT05ORUNUSU9OX1NUQVRFX1QgKnN0YXRlLCB1aW50MzJfdCBmbGFncyk7CisKKy8vIENhbGxiYWNrIHRvIGluZm9ybSBvZiBhIHBvd2VyIGNvbnRyb2wgcmVxdWVzdAordHlwZWRlZiB2b2lkICgqVkNISV9DT05ORUNUSU9OX1BPV0VSX0NPTlRST0wpKFZDSElfQ09OTkVDVElPTl9TVEFURV9UICpzdGF0ZSwgTUVTU0FHRV9UWF9DSEFOTkVMX1QgY2hhbm5lbCwgaW50MzJfdCBlbmFibGUpOworCisvLyBhbGxvY2F0ZSBtZW1vcnkgc3VpdGFibHkgYWxpZ25lZCBmb3IgdGhpcyBjb25uZWN0aW9uCit0eXBlZGVmIHZvaWQgKiAoKlZDSElfQlVGRkVSX0FMTE9DQVRFKShWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlX2hhbmRsZSwgdWludDMyX3QgKiBsZW5ndGgpOworCisvLyBmcmVlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgYnVmZmVyX2FsbG9jYXRlCit0eXBlZGVmIHZvaWQgICAoKlZDSElfQlVGRkVSX0ZSRUUpKFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2VfaGFuZGxlLCB2b2lkICogYWRkcmVzcyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIFN5c3RlbSBkcml2ZXIgc3RydWN0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBvcGFxdWVfdmNoaV9jb25uZWN0aW9uX2FwaV90Cit7CisgICAvLyBSb3V0aW5lIHRvIGluaXQgdGhlIGNvbm5lY3Rpb24KKyAgIFZDSElfQ09OTkVDVElPTl9JTklUX1QgICAgICAgICAgICAgICAgICAgICAgaW5pdDsKKworICAgLy8gQ29ubmVjdGlvbi1sZXZlbCBDUkMgY29udHJvbAorICAgVkNISV9DT05ORUNUSU9OX0NSQ19DT05UUk9MX1QgICAgICAgICAgICAgICBjcmNfY29udHJvbDsKKworICAgLy8gUm91dGluZSB0byBjb25uZWN0IHRvIG9yIGNyZWF0ZSBzZXJ2aWNlCisgICBWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9DT05ORUNUX1QgICAgICAgICAgIHNlcnZpY2VfY29ubmVjdDsKKworICAgLy8gUm91dGluZSB0byBkaXNjb25uZWN0IGZyb20gYSBzZXJ2aWNlCisgICBWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9ESVNDT05ORUNUX1QgICAgICAgIHNlcnZpY2VfZGlzY29ubmVjdDsKKworICAgLy8gUm91dGluZSB0byBxdWV1ZSBhIG1lc3NhZ2UKKyAgIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX1FVRVVFX01FU1NBR0VfVCAgICAgc2VydmljZV9xdWV1ZV9tc2c7CisKKyAgIC8vIHNjYXR0ZXItZ2F0aGVyICh2ZWN0b3IpIG1lc3NhZ2UgcXVldWUKKyAgIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX1FVRVVFX01FU1NBR0VWX1QgICAgc2VydmljZV9xdWV1ZV9tc2d2OworCisgICAvLyBSb3V0aW5lIHRvIGRlcXVldWUgYSBtZXNzYWdlCisgICBWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9ERVFVRVVFX01FU1NBR0VfVCAgIHNlcnZpY2VfZGVxdWV1ZV9tc2c7CisKKyAgIC8vIFJvdXRpbmUgdG8gcGVlayBhdCBhIG1lc3NhZ2UKKyAgIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX1BFRUtfTUVTU0FHRV9UICAgICAgc2VydmljZV9wZWVrX21zZzsKKworICAgLy8gUm91dGluZSB0byBob2xkIGEgbWVzc2FnZQorICAgVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfSE9MRF9NRVNTQUdFX1QgICAgICBzZXJ2aWNlX2hvbGRfbXNnOworCisgICAvLyBSb3V0aW5lIHRvIGluaXRpYWxpc2UgYSByZWNlaXZlZCBtZXNzYWdlIGl0ZXJhdG9yCisgICBWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9MT09LQUhFQURfTUVTU0FHRV9UIHNlcnZpY2VfbG9va19haGVhZF9tc2c7CisKKyAgIC8vIFJvdXRpbmUgdG8gcmVsZWFzZSBhIG1lc3NhZ2UKKyAgIFZDSElfQ09OTkVDVElPTl9IRUxEX01TR19SRUxFQVNFX1QgICAgICAgICAgaGVsZF9tc2dfcmVsZWFzZTsKKworICAgLy8gUm91dGluZSB0byBnZXQgaW5mb3JtYXRpb24gb24gYSBoZWxkIG1lc3NhZ2UKKyAgIFZDSElfQ09OTkVDVElPTl9IRUxEX01TR19JTkZPX1QgICAgICAgICAgICAgaGVsZF9tc2dfaW5mbzsKKworICAgLy8gUm91dGluZSB0byBjaGVjayBmb3IgbmV4dCBtZXNzYWdlIG9uIGl0ZXJhdG9yCisgICBWQ0hJX0NPTk5FQ1RJT05fTVNHX0lURVJfSEFTX05FWFRfVCAgICAgICAgIG1zZ19pdGVyX2hhc19uZXh0OworCisgICAvLyBSb3V0aW5lIHRvIGdldCBuZXh0IG1lc3NhZ2Ugb24gaXRlcmF0b3IKKyAgIFZDSElfQ09OTkVDVElPTl9NU0dfSVRFUl9ORVhUX1QgICAgICAgICAgICAgbXNnX2l0ZXJfbmV4dDsKKworICAgLy8gUm91dGluZSB0byByZW1vdmUgdGhlIGxhc3QgbWVzc2FnZSByZXR1cm5lZCBieSBpdGVyYXRvcgorICAgVkNISV9DT05ORUNUSU9OX01TR19JVEVSX1JFTU9WRV9UICAgICAgICAgICBtc2dfaXRlcl9yZW1vdmU7CisKKyAgIC8vIFJvdXRpbmUgdG8gaG9sZCB0aGUgbGFzdCBtZXNzYWdlIHJldHVybmVkIGJ5IGl0ZXJhdG9yCisgICBWQ0hJX0NPTk5FQ1RJT05fTVNHX0lURVJfSE9MRF9UICAgICAgICAgICAgIG1zZ19pdGVyX2hvbGQ7CisKKyAgIC8vIFJvdXRpbmUgdG8gdHJhbnNtaXQgYnVsayBkYXRhCisgICBWQ0hJX0NPTk5FQ1RJT05fQlVMS19RVUVVRV9UUkFOU01JVF9UICAgICAgIGJ1bGtfcXVldWVfdHJhbnNtaXQ7CisKKyAgIC8vIFJvdXRpbmUgdG8gcmVjZWl2ZSBkYXRhCisgICBWQ0hJX0NPTk5FQ1RJT05fQlVMS19RVUVVRV9SRUNFSVZFX1QgICAgICAgIGJ1bGtfcXVldWVfcmVjZWl2ZTsKKworICAgLy8gUm91dGluZSB0byByZXBvcnQgdGhlIGF2YWlsYWJsZSBzZXJ2ZXJzCisgICBWQ0hJX0NPTk5FQ1RJT05fU0VSVkVSX1BSRVNFTlQgICAgICAgICAgICAgIHNlcnZlcl9wcmVzZW50OworCisgICAvLyBSb3V0aW5lIHRvIHJlcG9ydCB0aGUgbnVtYmVyIG9mIFJYIHNsb3RzIGF2YWlsYWJsZQorICAgVkNISV9DT05ORUNUSU9OX1JYX1NMT1RTX0FWQUlMQUJMRSAgICAgICAgICBjb25uZWN0aW9uX3J4X3Nsb3RzX2F2YWlsYWJsZTsKKworICAgLy8gUm91dGluZSB0byByZXBvcnQgdGhlIFJYIHNsb3Qgc2l6ZQorICAgVkNISV9DT05ORUNUSU9OX1JYX1NMT1RfU0laRSAgICAgICAgICAgICAgICBjb25uZWN0aW9uX3J4X3Nsb3Rfc2l6ZTsKKworICAgLy8gQ2FsbGJhY2sgdG8gaW5kaWNhdGUgdGhhdCB0aGUgb3RoZXIgc2lkZSBoYXMgYWRkZWQgYSBidWZmZXIgdG8gdGhlIHJ4IGJ1bGsgRE1BIEZJRk8KKyAgIFZDSElfQ09OTkVDVElPTl9SWF9CVUxLX0JVRkZFUl9BRERFRCAgICAgICAgcnhfYnVsa19idWZmZXJfYWRkZWQ7CisKKyAgIC8vIENhbGxiYWNrIHRvIGluZm9ybSBhIHNlcnZpY2UgdGhhdCBhIFhvbiBvciBYb2ZmIG1lc3NhZ2UgaGFzIGJlZW4gcmVjZWl2ZWQKKyAgIFZDSElfQ09OTkVDVElPTl9GTE9XX0NPTlRST0wgICAgICAgICAgICAgICAgZmxvd19jb250cm9sOworCisgICAvLyBDYWxsYmFjayB0byBpbmZvcm0gYSBzZXJ2aWNlIHRoYXQgYSBzZXJ2ZXIgYXZhaWxhYmxlIHJlcGx5IG1lc3NhZ2UgaGFzIGJlZW4gcmVjZWl2ZWQKKyAgIFZDSElfQ09OTkVDVElPTl9TRVJWRVJfQVZBSUxBQkxFX1JFUExZICAgICAgc2VydmVyX2F2YWlsYWJsZV9yZXBseTsKKworICAgLy8gQ2FsbGJhY2sgdG8gaW5kaWNhdGUgdGhhdCBidWxrIGF1eGlsaWFyeSBtZXNzYWdlcyBoYXZlIGFycml2ZWQKKyAgIFZDSElfQ09OTkVDVElPTl9CVUxLX0FVWF9SRUNFSVZFRCAgICAgICAgICAgYnVsa19hdXhfcmVjZWl2ZWQ7CisKKyAgIC8vIENhbGxiYWNrIHRvIGluZGljYXRlIHRoYXQgYSBidWxrIGF1eGlsaWFyeSBtZXNzYWdlIGhhcyBiZWVuIHRyYW5zbWl0dGVkCisgICBWQ0hJX0NPTk5FQ1RJT05fQlVMS19BVVhfVFJBTlNNSVRURUQgICAgICAgIGJ1bGtfYXV4X3RyYW5zbWl0dGVkOworCisgICAvLyBDYWxsYmFjayB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb25uZWN0aW9uCisgICBWQ0hJX0NPTk5FQ1RJT05fSU5GTyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25faW5mbzsKKworICAgLy8gQ2FsbGJhY2sgdG8gbm90aWZ5IHRoYXQgcGVlciBoYXMgcmVxdWVzdGVkIGRpc2Nvbm5lY3QKKyAgIFZDSElfQ09OTkVDVElPTl9ESVNDT05ORUNUICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdDsKKworICAgLy8gQ2FsbGJhY2sgdG8gbm90aWZ5IHRoYXQgcGVlciBoYXMgcmVxdWVzdGVkIHBvd2VyIGNoYW5nZQorICAgVkNISV9DT05ORUNUSU9OX1BPV0VSX0NPTlRST0wgICAgICAgICAgICAgICBwb3dlcl9jb250cm9sOworCisgICAvLyBhbGxvY2F0ZSBtZW1vcnkgc3VpdGFibHkgYWxpZ25lZCBmb3IgdGhpcyBjb25uZWN0aW9uCisgICBWQ0hJX0JVRkZFUl9BTExPQ0FURSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9hbGxvY2F0ZTsKKworICAgLy8gZnJlZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IGJ1ZmZlcl9hbGxvY2F0ZQorICAgVkNISV9CVUZGRVJfRlJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfZnJlZTsKKworfTsKKworc3RydWN0IHZjaGlfY29ubmVjdGlvbl90IHsKKyAgIGNvbnN0IFZDSElfQ09OTkVDVElPTl9BUElfVCAqYXBpOworICAgVkNISV9DT05ORUNUSU9OX1NUQVRFX1QgICAgICpzdGF0ZTsKKyNpZmRlZiBWQ0hJX0NPQVJTRV9MT0NLSU5HCisgICBzdHJ1Y3Qgc2VtYXBob3JlICAgICAgICAgICAgIHNlbTsKKyNlbmRpZgorfTsKKworCisjZW5kaWYgLyogQ09OTkVDVElPTl9IXyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEVuZCBvZiBmaWxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaS9tZXNzYWdlX2RyaXZlcnMvbWVzc2FnZS5oIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGkvbWVzc2FnZV9kcml2ZXJzL21lc3NhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjNmNzY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGkvbWVzc2FnZV9kcml2ZXJzL21lc3NhZ2UuaApAQCAtMCwwICsxLDIwNCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfVkNISV9NRVNTQUdFX0hfCisjZGVmaW5lIF9WQ0hJX01FU1NBR0VfSF8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UvdmNoaS92Y2hpX2NmZ19pbnRlcm5hbC5oIgorI2luY2x1ZGUgImludGVyZmFjZS92Y2hpL3ZjaGlfY29tbW9uLmgiCisKKwordHlwZWRlZiBlbnVtIG1lc3NhZ2VfZXZlbnRfdHlwZSB7CisgICBNRVNTQUdFX0VWRU5UX05PTkUsCisgICBNRVNTQUdFX0VWRU5UX05PUCwKKyAgIE1FU1NBR0VfRVZFTlRfTUVTU0FHRSwKKyAgIE1FU1NBR0VfRVZFTlRfU0xPVF9DT01QTEVURSwKKyAgIE1FU1NBR0VfRVZFTlRfUlhfQlVMS19QQVVTRUQsCisgICBNRVNTQUdFX0VWRU5UX1JYX0JVTEtfQ09NUExFVEUsCisgICBNRVNTQUdFX0VWRU5UX1RYX0NPTVBMRVRFLAorICAgTUVTU0FHRV9FVkVOVF9NU0dfRElTQ0FSREVECit9IE1FU1NBR0VfRVZFTlRfVFlQRV9UOworCit0eXBlZGVmIGVudW0gdmNoaV9tc2dfZmxhZ3MKK3sKKyAgIFZDSElfTVNHX0ZMQUdTX05PTkUgICAgICAgICAgICAgICAgICA9IDB4MCwKKyAgIFZDSElfTVNHX0ZMQUdTX1RFUk1JTkFURV9ETUEgICAgICAgICA9IDB4MQorfSBWQ0hJX01TR19GTEFHU19UOworCit0eXBlZGVmIGVudW0gbWVzc2FnZV90eF9jaGFubmVsCit7CisgICBNRVNTQUdFX1RYX0NIQU5ORUxfTUVTU0FHRSAgICAgICAgICAgPSAwLAorICAgTUVTU0FHRV9UWF9DSEFOTkVMX0JVTEsgICAgICAgICAgICAgID0gMSAvLyBkcml2ZXJzIG1heSBwcm92aWRlIG11bHRpcGxlIGJ1bGsgY2hhbm5lbHMsIGZyb20gMSB1cHdhcmRzCit9IE1FU1NBR0VfVFhfQ0hBTk5FTF9UOworCisvLyBNYWNyb3MgdXNlZCBmb3IgY3ljbGluZyB0aHJvdWdoIGJ1bGsgY2hhbm5lbHMKKyNkZWZpbmUgTUVTU0FHRV9UWF9DSEFOTkVMX0JVTEtfUFJFVihjKSAoTUVTU0FHRV9UWF9DSEFOTkVMX0JVTEsrKChjKS1NRVNTQUdFX1RYX0NIQU5ORUxfQlVMSytWQ0hJX01BWF9CVUxLX1RYX0NIQU5ORUxTX1BFUl9DT05ORUNUSU9OLTEpJVZDSElfTUFYX0JVTEtfVFhfQ0hBTk5FTFNfUEVSX0NPTk5FQ1RJT04pCisjZGVmaW5lIE1FU1NBR0VfVFhfQ0hBTk5FTF9CVUxLX05FWFQoYykgKE1FU1NBR0VfVFhfQ0hBTk5FTF9CVUxLKygoYyktTUVTU0FHRV9UWF9DSEFOTkVMX0JVTEsrMSklVkNISV9NQVhfQlVMS19UWF9DSEFOTkVMU19QRVJfQ09OTkVDVElPTikKKwordHlwZWRlZiBlbnVtIG1lc3NhZ2VfcnhfY2hhbm5lbAoreworICAgTUVTU0FHRV9SWF9DSEFOTkVMX01FU1NBR0UgICAgICAgICAgID0gMCwKKyAgIE1FU1NBR0VfUlhfQ0hBTk5FTF9CVUxLICAgICAgICAgICAgICA9IDEgLy8gZHJpdmVycyBtYXkgcHJvdmlkZSBtdWx0aXBsZSBidWxrIGNoYW5uZWxzLCBmcm9tIDEgdXB3YXJkcworfSBNRVNTQUdFX1JYX0NIQU5ORUxfVDsKKworLy8gTWVzc2FnZSByZWNlaXZlIHNsb3QgaW5mb3JtYXRpb24KK3R5cGVkZWYgc3RydWN0IHJ4X21zZ19zbG90X2luZm8geworCisgICBzdHJ1Y3QgcnhfbXNnX3Nsb3RfaW5mbyAqbmV4dDsKKyAgIC8vc3RydWN0IHNsb3RfaW5mbyAqcHJldjsKKyNpZiAhZGVmaW5lZCBWQ0hJX0NPQVJTRV9MT0NLSU5HCisgICBzdHJ1Y3Qgc2VtYXBob3JlICAgc2VtOworI2VuZGlmCisKKyAgIHVpbnQ4X3QgICAgICAgICAgICphZGRyOyAgICAgICAgICAgICAgIC8vIGJhc2UgYWRkcmVzcyBvZiBzbG90CisgICB1aW50MzJfdCAgICAgICAgICAgbGVuOyAgICAgICAgICAgICAgICAvLyBsZW5ndGggb2Ygc2xvdCBpbiBieXRlcworCisgICB1aW50MzJfdCAgICAgICAgICAgd3JpdGVfcHRyOyAgICAgICAgICAvLyBoYXJkd2FyZSBjYXVzZXMgdGhpcyB0byBhZHZhbmNlCisgICB1aW50MzJfdCAgICAgICAgICAgcmVhZF9wdHI7ICAgICAgICAgICAvLyB0aGlzIG1vZHVsZSBkb2VzIHRoZSByZWFkaW5nCisgICBpbnQgICAgICAgICAgICAgICAgYWN0aXZlOyAgICAgICAgICAgICAvLyBpcyB0aGlzIHNsb3QgaW4gdGhlIGhhcmR3YXJlIGRtYSBmaWZvPworICAgdWludDMyX3QgICAgICAgICAgIG1zZ3NfcGFyc2VkOyAgICAgICAgLy8gY291bnQgaG93IG1hbnkgbWVzc2FnZXMgYXJlIGluIHRoaXMgc2xvdAorICAgdWludDMyX3QgICAgICAgICAgIG1zZ3NfcmVsZWFzZWQ7ICAgICAgLy8gaG93IG1hbnkgbWVzc2FnZXMgaGF2ZSBiZWVuIHJlbGVhc2VkCisgICB2b2lkICAgICAgICAgICAgICAqc3RhdGU7ICAgICAgICAgICAgICAvLyBjb25uZWN0aW9uIHN0YXRlIGluZm9ybWF0aW9uCisgICB1aW50OF90ICAgICAgICAgICAgcmVmX2NvdW50W1ZDSElfTUFYX1NFUlZJQ0VTX1BFUl9DT05ORUNUSU9OXTsgICAgICAgICAgLy8gcmVmZXJlbmNlIGNvdW50IGZvciBzbG90cyBoZWxkIGJ5IHNlcnZpY2VzCit9IFJYX01TR19TTE9USU5GT19UOworCisvLyBUaGUgbWVzc2FnZSBkcml2ZXIgbm8gbG9uZ2VyIG5lZWRzIHRvIGtub3cgYWJvdXQgdGhlIGZpZWxkcyBvZiBSWF9CVUxLX1NMT1RJTkZPX1QgLSBzb3J0IHRoaXMgb3V0LgorLy8gSW4gcGFydGljdWxhciwgaXQgbXVzdG4ndCB1c2UgYWRkciBhbmQgbGVuIC0gdGhleSdyZSB0aGUgY2xpZW50IGJ1ZmZlciwgYnV0IHRoZSBtZXNzYWdlCisvLyBkcml2ZXIgd2lsbCBiZSB0YXNrZWQgd2l0aCBzZW5kaW5nIHRoZSBhbGlnbmVkIGNvcmUgc2VjdGlvbi4KK3R5cGVkZWYgc3RydWN0IHJ4X2J1bGtfc2xvdGluZm9fdCB7CisgICBzdHJ1Y3QgcnhfYnVsa19zbG90aW5mb190ICpuZXh0OworCisgICBzdHJ1Y3Qgc2VtYXBob3JlICpibG9ja2luZzsKKworICAgLy8gbmVlZGVkIGJ5IERNQQorICAgdm9pZCAgICAgICAgKmFkZHI7CisgICB1aW50MzJfdCAgICAgbGVuOworCisgICAvLyBuZWVkZWQgZm9yIHRoZSBjYWxsYmFjaworICAgdm9pZCAgICAgICAgKnNlcnZpY2U7CisgICB2b2lkICAgICAgICAqaGFuZGxlOworICAgVkNISV9GTEFHU19UIGZsYWdzOworfSBSWF9CVUxLX1NMT1RJTkZPX1Q7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZWFjaCBjb25uZWN0aW9uIGRyaXZlciB3aWxsIGhhdmUgYSBwb29sIG9mIHRoZSBmb2xsb3dpbmcgc3RydWN0LgorICoKKyAqIHRoZSBwb29sIHdpbGwgYmUgbWFuYWdlZCBieSB2Y2hpX3FtYW5fKgorICogdGhpcyBtZWFucyB0aGVyZSB3aWxsIGJlIG11bHRpcGxlIHF1ZXVlcyAoc2luZ2xlIGxpbmtlZCBsaXN0cykKKyAqIGEgZ2l2ZW4gc3RydWN0IG1lc3NhZ2VfaW5mbyB3aWxsIGJlIG9uIGV4YWN0bHkgb25lIG9mIHRoZXNlIHF1ZXVlcworICogYXQgYW55IG9uZSB0aW1lCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordHlwZWRlZiBzdHJ1Y3QgcnhfbWVzc2FnZV9pbmZvIHsKKworICAgc3RydWN0IG1lc3NhZ2VfaW5mbyAqbmV4dDsKKyAgIC8vc3RydWN0IG1lc3NhZ2VfaW5mbyAqcHJldjsKKworICAgdWludDhfdCAgICAqYWRkcjsKKyAgIHVpbnQzMl90ICAgbGVuOworICAgUlhfTVNHX1NMT1RJTkZPX1QgKnNsb3Q7IC8vIHBvaW50cyB0byB3aGljaGV2ZXIgc2xvdCBjb250YWlucyB0aGlzIG1lc3NhZ2UKKyAgIHVpbnQzMl90ICAgdHhfdGltZXN0YW1wOworICAgdWludDMyX3QgICByeF90aW1lc3RhbXA7CisKK30gUlhfTUVTU0FHRV9JTkZPX1Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIE1FU1NBR0VfRVZFTlRfVFlQRV9UIHR5cGU7CisKKyAgIHN0cnVjdCB7CisgICAgICAvLyBmb3IgbWVzc2FnZXMKKyAgICAgIHZvaWQgICAgKmFkZHI7ICAgICAgICAgICAvLyBhZGRyZXNzIG9mIG1lc3NhZ2UKKyAgICAgIHVpbnQxNl90IHNsb3RfZGVsdGE7ICAgICAvLyB3aGV0aGVyIHRoaXMgbWVzc2FnZSBpbmRpY2F0ZWQgc2xvdCBkZWx0YQorICAgICAgdWludDMyX3QgbGVuOyAgICAgICAgICAgIC8vIGxlbmd0aCBvZiBtZXNzYWdlCisgICAgICBSWF9NU0dfU0xPVElORk9fVCAqc2xvdDsgLy8gc2xvdCB0aGlzIG1lc3NhZ2UgaXMgaW4KKyAgICAgIGludDMyX3QgIHNlcnZpY2U7ICAgLy8gc2VydmljZSBpZCB0aGlzIG1lc3NhZ2UgaXMgZGVzdGluZWQgZm9yCisgICAgICB1aW50MzJfdCB0eF90aW1lc3RhbXA7ICAgLy8gdGltZXN0YW1wIGZyb20gdGhlIGhlYWRlcgorICAgICAgdWludDMyX3QgcnhfdGltZXN0YW1wOyAgIC8vIHRpbWVzdGFtcCB3aGVuIHdlIHBhcnNlZCBpdAorICAgfSBtZXNzYWdlOworCisgICAvLyBGSVhNRTogY2xlYW51cCBzbG90IHJlcG9ydGluZy4uLgorICAgUlhfTVNHX1NMT1RJTkZPX1QgKnJ4X21zZzsKKyAgIFJYX0JVTEtfU0xPVElORk9fVCAqcnhfYnVsazsKKyAgIHZvaWQgKnR4X2hhbmRsZTsKKyAgIE1FU1NBR0VfVFhfQ0hBTk5FTF9UIHR4X2NoYW5uZWw7CisKK30gTUVTU0FHRV9FVkVOVF9UOworCisKKy8vIGNhbGxiYWNrcwordHlwZWRlZiB2b2lkIFZDSElfTUVTU0FHRV9EUklWRVJfRVZFTlRfQ0FMTEJBQ0tfVCggdm9pZCAqc3RhdGUgKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgVkNISV9NRVNTQUdFX0RSSVZFUl9FVkVOVF9DQUxMQkFDS19UICpldmVudF9jYWxsYmFjazsKK30gVkNISV9NRVNTQUdFX0RSSVZFUl9PUEVOX1Q7CisKKworLy8gaGFuZGxlIHRvIHRoaXMgaW5zdGFuY2Ugb2YgbWVzc2FnZSBkcml2ZXIgKGFzIHJldHVybmVkIGJ5IC0+b3BlbikKK3R5cGVkZWYgc3RydWN0IG9wYXF1ZV9taGFuZGxlX3QgKlZDSElfTURSSVZFUl9IQU5ETEVfVDsKKworc3RydWN0IG9wYXF1ZV92Y2hpX21lc3NhZ2VfZHJpdmVyX3QgeworICAgVkNISV9NRFJJVkVSX0hBTkRMRV9UICooKm9wZW4pKCBWQ0hJX01FU1NBR0VfRFJJVkVSX09QRU5fVCAqcGFyYW1zLCB2b2lkICpzdGF0ZSApOworICAgaW50MzJfdCAoKnN1c3BlbmRpbmcpKCBWQ0hJX01EUklWRVJfSEFORExFX1QgKmhhbmRsZSApOworICAgaW50MzJfdCAoKnJlc3VtZWQpKCBWQ0hJX01EUklWRVJfSEFORExFX1QgKmhhbmRsZSApOworICAgaW50MzJfdCAoKnBvd2VyX2NvbnRyb2wpKCBWQ0hJX01EUklWRVJfSEFORExFX1QgKmhhbmRsZSwgTUVTU0FHRV9UWF9DSEFOTkVMX1QsIGludDMyX3QgZW5hYmxlICk7CisgICBpbnQzMl90ICgqYWRkX21zZ19yeF9zbG90KSggVkNISV9NRFJJVkVSX0hBTkRMRV9UICpoYW5kbGUsIFJYX01TR19TTE9USU5GT19UICpzbG90ICk7ICAgICAgLy8gcnggbWVzc2FnZQorICAgaW50MzJfdCAoKmFkZF9idWxrX3J4KSggVkNISV9NRFJJVkVSX0hBTkRMRV9UICpoYW5kbGUsIHZvaWQgKmRhdGEsIHVpbnQzMl90IGxlbiwgUlhfQlVMS19TTE9USU5GT19UICpzbG90ICk7ICAvLyByeCBkYXRhIChidWxrKQorICAgaW50MzJfdCAoKnNlbmQpKCBWQ0hJX01EUklWRVJfSEFORExFX1QgKmhhbmRsZSwgTUVTU0FHRV9UWF9DSEFOTkVMX1QgY2hhbm5lbCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgbGVuLCBWQ0hJX01TR19GTEFHU19UIGZsYWdzLCB2b2lkICpzZW5kX2hhbmRsZSApOyAgICAgIC8vIHR4IChtZXNzYWdlICYgYnVsaykKKyAgIHZvaWQgICAgKCpuZXh0X2V2ZW50KSggVkNISV9NRFJJVkVSX0hBTkRMRV9UICpoYW5kbGUsIE1FU1NBR0VfRVZFTlRfVCAqZXZlbnQgKTsgICAgIC8vIGdldCB0aGUgbmV4dCBldmVudCBmcm9tIG1lc3NhZ2VfZHJpdmVyCisgICBpbnQzMl90ICgqZW5hYmxlKSggVkNISV9NRFJJVkVSX0hBTkRMRV9UICpoYW5kbGUgKTsKKyAgIGludDMyX3QgKCpmb3JtX21lc3NhZ2UpKCBWQ0hJX01EUklWRVJfSEFORExFX1QgKmhhbmRsZSwgaW50MzJfdCBzZXJ2aWNlX2lkLCBWQ0hJX01TR19WRUNUT1JfVCAqdmVjdG9yLCB1aW50MzJfdCBjb3VudCwgdm9pZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICphZGRyZXNzLCB1aW50MzJfdCBsZW5ndGhfYXZhaWwsIHVpbnQzMl90IG1heF90b3RhbF9sZW5ndGgsIGludDMyX3QgcGFkX3RvX2ZpbGwsIGludDMyX3QgYWxsb3dfcGFydGlhbCApOworCisgICBpbnQzMl90ICgqdXBkYXRlX21lc3NhZ2UpKCBWQ0hJX01EUklWRVJfSEFORExFX1QgKmhhbmRsZSwgdm9pZCAqZGVzdCwgaW50MTZfdCAqc2xvdF9jb3VudCApOworICAgaW50MzJfdCAoKmJ1ZmZlcl9hbGlnbmVkKSggVkNISV9NRFJJVkVSX0hBTkRMRV9UICpoYW5kbGUsIGludCB0eCwgaW50IHVuY2FjaGVkLCBjb25zdCB2b2lkICphZGRyZXNzLCBjb25zdCB1aW50MzJfdCBsZW5ndGggKTsKKyAgIHZvaWQgKiAgKCphbGxvY2F0ZV9idWZmZXIpKCBWQ0hJX01EUklWRVJfSEFORExFX1QgKmhhbmRsZSwgdWludDMyX3QgKmxlbmd0aCApOworICAgdm9pZCAgICAoKmZyZWVfYnVmZmVyKSggVkNISV9NRFJJVkVSX0hBTkRMRV9UICpoYW5kbGUsIHZvaWQgKmFkZHJlc3MgKTsKKyAgIGludCAgICAgKCpyeF9zbG90X3NpemUpKCBWQ0hJX01EUklWRVJfSEFORExFX1QgKmhhbmRsZSwgaW50IG1zZ19zaXplICk7CisgICBpbnQgICAgICgqdHhfc2xvdF9zaXplKSggVkNISV9NRFJJVkVSX0hBTkRMRV9UICpoYW5kbGUsIGludCBtc2dfc2l6ZSApOworCisgICBpbnQzMl90ICAoKnR4X3N1cHBvcnRzX3Rlcm1pbmF0ZSkoIGNvbnN0IFZDSElfTURSSVZFUl9IQU5ETEVfVCAqaGFuZGxlLCBNRVNTQUdFX1RYX0NIQU5ORUxfVCBjaGFubmVsICk7CisgICB1aW50MzJfdCAoKnR4X2J1bGtfY2h1bmtfc2l6ZSkoIGNvbnN0IFZDSElfTURSSVZFUl9IQU5ETEVfVCAqaGFuZGxlLCBNRVNTQUdFX1RYX0NIQU5ORUxfVCBjaGFubmVsICk7CisgICBpbnQgICAgICgqdHhfYWxpZ25tZW50KSggY29uc3QgVkNISV9NRFJJVkVSX0hBTkRMRV9UICpoYW5kbGUsIE1FU1NBR0VfVFhfQ0hBTk5FTF9UIGNoYW5uZWwgKTsKKyAgIGludCAgICAgKCpyeF9hbGlnbm1lbnQpKCBjb25zdCBWQ0hJX01EUklWRVJfSEFORExFX1QgKmhhbmRsZSwgTUVTU0FHRV9SWF9DSEFOTkVMX1QgY2hhbm5lbCApOworICAgdm9pZCAgICAoKmZvcm1fYnVsa19hdXgpKCBWQ0hJX01EUklWRVJfSEFORExFX1QgKmhhbmRsZSwgTUVTU0FHRV9UWF9DSEFOTkVMX1QgY2hhbm5lbCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgbGVuLCB1aW50MzJfdCBjaHVua19zaXplLCBjb25zdCB2b2lkICoqYXV4X2RhdGEsIGludDMyX3QgKmF1eF9sZW4gKTsKKyAgIHZvaWQgICAgKCpkZWJ1ZykoIFZDSElfTURSSVZFUl9IQU5ETEVfVCAqaGFuZGxlICk7Cit9OworCisKKyNlbmRpZiAvLyBfVkNISV9NRVNTQUdFX0hfCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRW5kIG9mIGZpbGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaS92Y2hpLmggYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaS92Y2hpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIxN2U5OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpL3ZjaGkuaApAQCAtMCwwICsxLDM3OCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBWQ0hJX0hfCisjZGVmaW5lIFZDSElfSF8KKworI2luY2x1ZGUgImludGVyZmFjZS92Y2hpL3ZjaGlfY2ZnLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlL3ZjaGkvdmNoaV9jb21tb24uaCIKKyNpbmNsdWRlICJpbnRlcmZhY2UvdmNoaS9jb25uZWN0aW9ucy9jb25uZWN0aW9uLmgiCisjaW5jbHVkZSAidmNoaV9taC5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBHbG9iYWwgZGVmcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFZDSElfQlVMS19ST1VORF9VUCh4KSAgICAgKCgoKHVuc2lnbmVkIGxvbmcpKHgpKStWQ0hJX0JVTEtfQUxJR04tMSkgJiB+KFZDSElfQlVMS19BTElHTi0xKSkKKyNkZWZpbmUgVkNISV9CVUxLX1JPVU5EX0RPV04oeCkgICAoKCh1bnNpZ25lZCBsb25nKSh4KSkgJiB+KFZDSElfQlVMS19BTElHTi0xKSkKKyNkZWZpbmUgVkNISV9CVUxLX0FMSUdOX05CWVRFUyh4KSAoVkNISV9CVUxLX0FMSUdORUQoeCkgPyAwIDogKFZDSElfQlVMS19BTElHTiAtICgodW5zaWduZWQgbG9uZykoeCkgJiAoVkNISV9CVUxLX0FMSUdOLTEpKSkpCisKKyNpZmRlZiBVU0VfVkNISVFfQVJNCisjZGVmaW5lIFZDSElfQlVMS19BTElHTkVEKHgpICAgICAgMQorI2Vsc2UKKyNkZWZpbmUgVkNISV9CVUxLX0FMSUdORUQoeCkgICAgICAoKCh1bnNpZ25lZCBsb25nKSh4KSAmIChWQ0hJX0JVTEtfQUxJR04tMSkpID09IDApCisjZW5kaWYKKworc3RydWN0IHZjaGlfdmVyc2lvbiB7CisJdWludDMyX3QgdmVyc2lvbjsKKwl1aW50MzJfdCB2ZXJzaW9uX21pbjsKK307CisjZGVmaW5lIFZDSElfVkVSU0lPTih2XykgeyB2Xywgdl8gfQorI2RlZmluZSBWQ0hJX1ZFUlNJT05fRVgodl8sIG1fKSB7IHZfLCBtXyB9CisKK3R5cGVkZWYgZW51bQoreworICAgVkNISV9WRUNfUE9JTlRFUiwKKyAgIFZDSElfVkVDX0hBTkRMRSwKKyAgIFZDSElfVkVDX0xJU1QKK30gVkNISV9NU0dfVkVDVE9SX1RZUEVfVDsKKwordHlwZWRlZiBzdHJ1Y3QgdmNoaV9tc2dfdmVjdG9yX2V4IHsKKworICAgVkNISV9NU0dfVkVDVE9SX1RZUEVfVCB0eXBlOworICAgdW5pb24KKyAgIHsKKyAgICAgIC8vIGEgbWVtb3J5IGhhbmRsZQorICAgICAgc3RydWN0CisgICAgICB7CisgICAgICAgICBWQ0hJX01FTV9IQU5ETEVfVCBoYW5kbGU7CisgICAgICAgICB1aW50MzJfdCBvZmZzZXQ7CisgICAgICAgICBpbnQzMl90IHZlY19sZW47CisgICAgICB9IGhhbmRsZTsKKworICAgICAgLy8gYW4gb3JkaW5hcnkgZGF0YSBwb2ludGVyCisgICAgICBzdHJ1Y3QKKyAgICAgIHsKKyAgICAgICAgIGNvbnN0IHZvaWQgKnZlY19iYXNlOworICAgICAgICAgaW50MzJfdCB2ZWNfbGVuOworICAgICAgfSBwdHI7CisKKyAgICAgIC8vIGEgbmVzdGVkIHZlY3RvciBsaXN0CisgICAgICBzdHJ1Y3QKKyAgICAgIHsKKyAgICAgICAgIHN0cnVjdCB2Y2hpX21zZ192ZWN0b3JfZXggKnZlYzsKKyAgICAgICAgIHVpbnQzMl90IHZlY19sZW47CisgICAgICB9IGxpc3Q7CisgICB9IHU7Cit9IFZDSElfTVNHX1ZFQ1RPUl9FWF9UOworCisKKy8vIENvbnN0cnVjdCBhbiBlbnRyeSBpbiBhIG1zZyB2ZWN0b3IgZm9yIGEgcG9pbnRlciAocCkgb2YgbGVuZ3RoIChsKQorI2RlZmluZSBWQ0hJX1ZFQ19QT0lOVEVSKHAsbCkgIFZDSElfVkVDX1BPSU5URVIsIHsgeyAoVkNISV9NRU1fSEFORExFX1QpKHApLCAobCkgfSB9CisKKy8vIENvbnN0cnVjdCBhbiBlbnRyeSBpbiBhIG1zZyB2ZWN0b3IgZm9yIGEgbWVzc2FnZSBoYW5kbGUgKGgpLCBzdGFydGluZyBhdCBvZmZzZXQgKG8pIG9mIGxlbmd0aCAobCkKKyNkZWZpbmUgVkNISV9WRUNfSEFORExFKGgsbyxsKSBWQ0hJX1ZFQ19IQU5ETEUsICB7IHsgKGgpLCAobyksIChsKSB9IH0KKworLy8gTWFjcm9zIHRvIG1hbmlwdWxhdGUgJ0ZPVVJDQycgdmFsdWVzCisjZGVmaW5lIE1BS0VfRk9VUkNDKHgpICgoaW50MzJfdCkoICh4WzBdIDw8IDI0KSB8ICh4WzFdIDw8IDE2KSB8ICh4WzJdIDw8IDgpIHwgeFszXSApKQorI2RlZmluZSBGT1VSQ0NfVE9fQ0hBUih4KSAoeCA+PiAyNCkgJiAweEZGLCh4ID4+IDE2KSAmIDB4RkYsKHggPj4gOCkgJiAweEZGLCB4ICYgMHhGRgorCisKKy8vIE9wYXF1ZSBzZXJ2aWNlIGluZm9ybWF0aW9uCitzdHJ1Y3Qgb3BhcXVlX3ZjaGlfc2VydmljZV90OworCisvLyBEZXNjcmlwdG9yIGZvciBhIGhlbGQgbWVzc2FnZS4gQWxsb2NhdGVkIGJ5IGNsaWVudCwgaW5pdGlhbGlzZWQgYnkgdmNoaV9tc2dfaG9sZCwKKy8vIHZjaGlfbXNnX2l0ZXJfaG9sZCBvciB2Y2hpX21zZ19pdGVyX2hvbGRfbmV4dC4gRmllbGRzIGFyZSBmb3IgaW50ZXJuYWwgVkNISSB1c2Ugb25seS4KK3R5cGVkZWYgc3RydWN0Cit7CisgICBzdHJ1Y3Qgb3BhcXVlX3ZjaGlfc2VydmljZV90ICpzZXJ2aWNlOworICAgdm9pZCAqbWVzc2FnZTsKK30gVkNISV9IRUxEX01TR19UOworCisKKworLy8gc3RydWN0dXJlIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIG9wZW4gYSBzZXJ2ZXIgb3IgYSBjbGllbnQKK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgdmNoaV92ZXJzaW9uIHZlcnNpb247CisJaW50MzJfdCBzZXJ2aWNlX2lkOworCVZDSElfQ09OTkVDVElPTl9UICpjb25uZWN0aW9uOworCXVpbnQzMl90IHJ4X2ZpZm9fc2l6ZTsKKwl1aW50MzJfdCB0eF9maWZvX3NpemU7CisJVkNISV9DQUxMQkFDS19UIGNhbGxiYWNrOworCXZvaWQgKmNhbGxiYWNrX3BhcmFtOworCS8qIGNsaWVudCBpbnRlbmRzIHRvIHJlY2VpdmUgYnVsayB0cmFuc2ZlcnMgb2YKKwkJb2RkIGxlbmd0aHMgb3IgaW50byB1bmFsaWduZWQgYnVmZmVycyAqLworCWludDMyX3Qgd2FudF91bmFsaWduZWRfYnVsa19yeDsKKwkvKiBjbGllbnQgaW50ZW5kcyB0byB0cmFuc21pdCBidWxrIHRyYW5zZmVycyBvZgorCQlvZGQgbGVuZ3RocyBvciBvdXQgb2YgdW5hbGlnbmVkIGJ1ZmZlcnMgKi8KKwlpbnQzMl90IHdhbnRfdW5hbGlnbmVkX2J1bGtfdHg7CisJLyogY2xpZW50IHdhbnRzIHRvIGNoZWNrIENSQ3Mgb24gKGJ1bGspIHhmZXJzLgorCQlPbmx5IG5lZWRzIHRvIGJlIHNldCBhdCAxIGVuZCAtIHdpbGwgZG8gYm90aCBkaXJlY3Rpb25zLiAqLworCWludDMyX3Qgd2FudF9jcmM7Cit9IFNFUlZJQ0VfQ1JFQVRJT05fVDsKKworLy8gT3BhcXVlIGhhbmRsZSBmb3IgYSBWQ0hJIGluc3RhbmNlCit0eXBlZGVmIHN0cnVjdCBvcGFxdWVfdmNoaV9pbnN0YW5jZV9oYW5kbGVfdCAqVkNISV9JTlNUQU5DRV9UOworCisvLyBPcGFxdWUgaGFuZGxlIGZvciBhIHNlcnZlciBvciBjbGllbnQKK3R5cGVkZWYgc3RydWN0IG9wYXF1ZV92Y2hpX3NlcnZpY2VfaGFuZGxlX3QgKlZDSElfU0VSVklDRV9IQU5ETEVfVDsKKworLy8gU2VydmljZSByZWdpc3RyYXRpb24gJiBzdGFydHVwCit0eXBlZGVmIHZvaWQgKCpWQ0hJX1NFUlZJQ0VfSU5JVCkoVkNISV9JTlNUQU5DRV9UIGluaXRpYWxpc2VfaW5zdGFuY2UsIFZDSElfQ09OTkVDVElPTl9UICoqY29ubmVjdGlvbnMsIHVpbnQzMl90IG51bV9jb25uZWN0aW9ucyk7CisKK3R5cGVkZWYgc3RydWN0IHNlcnZpY2VfaW5mb190YWcgeworICAgY29uc3QgY2hhciAqIGNvbnN0IHZsbF9maWxlbmFtZTsgLyogVkxMIHRvIGxvYWQgdG8gc3RhcnQgdGhpcyBzZXJ2aWNlLiBUaGlzIGlzIGFuIGVtcHR5IHN0cmluZyBpZiBWTEwgaXMgInN0YXRpYyIgKi8KKyAgIFZDSElfU0VSVklDRV9JTklUIGluaXQ7ICAgICAgICAgIC8qIFNlcnZpY2UgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gKi8KKyAgIHZvaWQgKnZsbF9oYW5kbGU7ICAgICAgICAgICAgICAgIC8qIFZMTCBoYW5kbGU7IE5VTEwgd2hlbiB1bmxvYWRlZCBvciBhICJzdGF0aWMgVkxMIiBpbiBidWlsZCAqLworfSBTRVJWSUNFX0lORk9fVDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEdsb2JhbCBmdW5jcyAtIGltcGxlbWVudGF0aW9uIGlzIHNwZWNpZmljIHRvIHdoaWNoIHNpZGUgeW91IGFyZSBvbiAobG9jYWwgLyByZW1vdGUpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworZXh0ZXJuIC8qQG9ic2VydmVyQCovIFZDSElfQ09OTkVDVElPTl9UICogdmNoaV9jcmVhdGVfY29ubmVjdGlvbiggY29uc3QgVkNISV9DT05ORUNUSU9OX0FQSV9UICogZnVuY3Rpb25fdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWQ0hJX01FU1NBR0VfRFJJVkVSX1QgKiBsb3dfbGV2ZWwpOworCisKKy8vIFJvdXRpbmUgdXNlZCB0byBpbml0aWFsaXNlIHRoZSB2Y2hpIG9uIGJvdGggbG9jYWwgKyByZW1vdGUgY29ubmVjdGlvbnMKK2V4dGVybiBpbnQzMl90IHZjaGlfaW5pdGlhbGlzZSggVkNISV9JTlNUQU5DRV9UICppbnN0YW5jZV9oYW5kbGUgKTsKKworZXh0ZXJuIGludDMyX3QgdmNoaV9leGl0KCB2b2lkICk7CisKK2V4dGVybiBpbnQzMl90IHZjaGlfY29ubmVjdCggVkNISV9DT05ORUNUSU9OX1QgKipjb25uZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbnVtX2Nvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX0lOU1RBTkNFX1QgaW5zdGFuY2VfaGFuZGxlICk7CisKKy8vV2hlbiB0aGlzIGlzIGNhbGxlZCwgZW5zdXJlIHRoYXQgYWxsIHNlcnZpY2VzIGhhdmUgbm8gZGF0YSBwZW5kaW5nLgorLy9CdWxrIHRyYW5zZmVycyBjYW4gcmVtYWluICdxdWV1ZWQnCitleHRlcm4gaW50MzJfdCB2Y2hpX2Rpc2Nvbm5lY3QoIFZDSElfSU5TVEFOQ0VfVCBpbnN0YW5jZV9oYW5kbGUgKTsKKworLy8gR2xvYmFsIGNvbnRyb2wgb3ZlciBidWxrIENSQyBjaGVja2luZworZXh0ZXJuIGludDMyX3QgdmNoaV9jcmNfY29udHJvbCggVkNISV9DT05ORUNUSU9OX1QgKmNvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX0NSQ19DT05UUk9MX1QgY29udHJvbCApOworCisvLyBoZWxwZXIgZnVuY3Rpb25zCitleHRlcm4gdm9pZCAqIHZjaGlfYWxsb2NhdGVfYnVmZmVyKFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsIHVpbnQzMl90ICpsZW5ndGgpOworZXh0ZXJuIHZvaWQgdmNoaV9mcmVlX2J1ZmZlcihWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLCB2b2lkICphZGRyZXNzKTsKK2V4dGVybiB1aW50MzJfdCB2Y2hpX2N1cnJlbnRfdGltZShWQ0hJX0lOU1RBTkNFX1QgaW5zdGFuY2VfaGFuZGxlKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgR2xvYmFsIHNlcnZpY2UgQVBJCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBSb3V0aW5lIHRvIGNyZWF0ZSBhIG5hbWVkIHNlcnZpY2UKK2V4dGVybiBpbnQzMl90IHZjaGlfc2VydmljZV9jcmVhdGUoIFZDSElfSU5TVEFOQ0VfVCBpbnN0YW5jZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVJWSUNFX0NSRUFUSU9OX1QgKnNldHVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9TRVJWSUNFX0hBTkRMRV9UICpoYW5kbGUgKTsKKworLy8gUm91dGluZSB0byBkZXN0b3J5IGEgc2VydmljZQorZXh0ZXJuIGludDMyX3QgdmNoaV9zZXJ2aWNlX2Rlc3Ryb3koIGNvbnN0IFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUgKTsKKworLy8gUm91dGluZSB0byBvcGVuIGEgbmFtZWQgc2VydmljZQorZXh0ZXJuIGludDMyX3QgdmNoaV9zZXJ2aWNlX29wZW4oIFZDSElfSU5TVEFOQ0VfVCBpbnN0YW5jZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VSVklDRV9DUkVBVElPTl9UICpzZXR1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgKmhhbmRsZSk7CisKK2V4dGVybiBpbnQzMl90IHZjaGlfZ2V0X3BlZXJfdmVyc2lvbiggY29uc3QgVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgKnBlZXJfdmVyc2lvbiApOworCisvLyBSb3V0aW5lIHRvIGNsb3NlIGEgbmFtZWQgc2VydmljZQorZXh0ZXJuIGludDMyX3QgdmNoaV9zZXJ2aWNlX2Nsb3NlKCBjb25zdCBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlICk7CisKKy8vIFJvdXRpbmUgdG8gaW5jcmVtZW50IHJlZiBjb3VudCBvbiBhIG5hbWVkIHNlcnZpY2UKK2V4dGVybiBpbnQzMl90IHZjaGlfc2VydmljZV91c2UoIGNvbnN0IFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUgKTsKKworLy8gUm91dGluZSB0byBkZWNyZW1lbnQgcmVmIGNvdW50IG9uIGEgbmFtZWQgc2VydmljZQorZXh0ZXJuIGludDMyX3QgdmNoaV9zZXJ2aWNlX3JlbGVhc2UoIGNvbnN0IFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUgKTsKKworLy8gUm91dGluZSB0byBzZXQgYSBjb250cm9sIG9wdGlvbiBmb3IgYSBuYW1lZCBzZXJ2aWNlCitleHRlcm4gaW50MzJfdCB2Y2hpX3NlcnZpY2Vfc2V0X29wdGlvbiggY29uc3QgVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwKKwkJCQkJVkNISV9TRVJWSUNFX09QVElPTl9UIG9wdGlvbiwKKwkJCQkJaW50IHZhbHVlKTsKKworLy8gUm91dGluZSB0byBzZW5kIGEgbWVzc2FnZSBhY3Jvc3MgYSBzZXJ2aWNlCitleHRlcm4gaW50MzJfdCB2Y2hpX21zZ19xdWV1ZSggVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX0ZMQUdTX1QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnX2hhbmRsZSApOworCisvLyBzY2F0dGVyLWdhdGhlciAodmVjdG9yKSBhbmQgc2VuZCBtZXNzYWdlCitpbnQzMl90IHZjaGlfbXNnX3F1ZXVldl9leCggVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX01TR19WRUNUT1JfRVhfVCAqdmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfRkxBR1NfVCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2dfaGFuZGxlICk7CisKKy8vIGxlZ2FjeSBzY2F0dGVyLWdhdGhlciAodmVjdG9yKSBhbmQgc2VuZCBtZXNzYWdlLCBvbmx5IGhhbmRsZXMgcG9pbnRlcnMKK2ludDMyX3QgdmNoaV9tc2dfcXVldWV2KCBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfTVNHX1ZFQ1RPUl9UICp2ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9GTEFHU19UIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZ19oYW5kbGUgKTsKKworLy8gUm91dGluZSB0byByZWNlaXZlIGEgbXNnIGZyb20gYSBzZXJ2aWNlCisvLyBEZXF1ZXVlIGlzIGVxdWl2YWxlbnQgdG8gaG9sZCwgY29weSBpbnRvIGNsaWVudCBidWZmZXIsIHJlbGVhc2UKK2V4dGVybiBpbnQzMl90IHZjaGlfbXNnX2RlcXVldWUoIFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4X2RhdGFfc2l6ZV90b19yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmFjdHVhbF9tc2dfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfRkxBR1NfVCBmbGFncyApOworCisvLyBSb3V0aW5lIHRvIGxvb2sgYXQgYSBtZXNzYWdlIGluIHBsYWNlLgorLy8gVGhlIG1lc3NhZ2UgaXMgbm90IGRlcXVldWVkLCBzbyBhIHN1YnNlcXVlbnQgY2FsbCB0byBwZWVrIG9yIGRlcXVldWUKKy8vIHdpbGwgcmV0dXJuIHRoZSBzYW1lIG1lc3NhZ2UuCitleHRlcm4gaW50MzJfdCB2Y2hpX21zZ19wZWVrKCBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbXNnX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX0ZMQUdTX1QgZmxhZ3MgKTsKKworLy8gUm91dGluZSB0byByZW1vdmUgYSBtZXNzYWdlIGFmdGVyIGl0IGhhcyBiZWVuIHJlYWQgaW4gcGxhY2Ugd2l0aCBwZWVrCisvLyBUaGUgZmlyc3QgbWVzc2FnZSBvbiB0aGUgcXVldWUgaXMgZGVxdWV1ZWQuCitleHRlcm4gaW50MzJfdCB2Y2hpX21zZ19yZW1vdmUoIFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUgKTsKKworLy8gUm91dGluZSB0byBsb29rIGF0IGEgbWVzc2FnZSBpbiBwbGFjZS4KKy8vIFRoZSBtZXNzYWdlIGlzIGRlcXVldWVkLCBzbyB0aGUgY2FsbGVyIGlzIGxlZnQgaG9sZGluZyBpdDsgdGhlIGRlc2NyaXB0b3IgaXMKKy8vIGZpbGxlZCBpbiBhbmQgbXVzdCBiZSByZWxlYXNlZCB3aGVuIHRoZSB1c2VyIGhhcyBmaW5pc2hlZCB3aXRoIHRoZSBtZXNzYWdlLgorZXh0ZXJuIGludDMyX3QgdmNoaV9tc2dfaG9sZCggVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipkYXRhLCAgICAgICAgLy8gfSBtYXkgYmUgTlVMTCwgYXMgaW5mbyBjYW4gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICptc2dfc2l6ZSwgLy8gfSBvYnRhaW5lZCBmcm9tIEhFTERfTVNHX1QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfRkxBR1NfVCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfSEVMRF9NU0dfVCAqbWVzc2FnZV9kZXNjcmlwdG9yICk7CisKKy8vIEluaXRpYWxpc2UgYW4gaXRlcmF0b3IgdG8gbG9vayB0aHJvdWdoIG1lc3NhZ2VzIGluIHBsYWNlCitleHRlcm4gaW50MzJfdCB2Y2hpX21zZ19sb29rX2FoZWFkKCBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9NU0dfSVRFUl9UICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9GTEFHU19UIGZsYWdzICk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBHbG9iYWwgc2VydmljZSBzdXBwb3J0IEFQSSAtIG9wZXJhdGlvbnMgb24gaGVsZCBtZXNzYWdlcyBhbmQgbWVzc2FnZSBpdGVyYXRvcnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gUm91dGluZSB0byBnZXQgdGhlIGFkZHJlc3Mgb2YgYSBoZWxkIG1lc3NhZ2UKK2V4dGVybiB2b2lkICp2Y2hpX2hlbGRfbXNnX3B0ciggY29uc3QgVkNISV9IRUxEX01TR19UICptZXNzYWdlICk7CisKKy8vIFJvdXRpbmUgdG8gZ2V0IHRoZSBzaXplIG9mIGEgaGVsZCBtZXNzYWdlCitleHRlcm4gaW50MzJfdCB2Y2hpX2hlbGRfbXNnX3NpemUoIGNvbnN0IFZDSElfSEVMRF9NU0dfVCAqbWVzc2FnZSApOworCisvLyBSb3V0aW5lIHRvIGdldCB0aGUgdHJhbnNtaXQgdGltZXN0YW1wIGFzIHdyaXR0ZW4gaW50byB0aGUgaGVhZGVyIGJ5IHRoZSBwZWVyCitleHRlcm4gdWludDMyX3QgdmNoaV9oZWxkX21zZ190eF90aW1lc3RhbXAoIGNvbnN0IFZDSElfSEVMRF9NU0dfVCAqbWVzc2FnZSApOworCisvLyBSb3V0aW5lIHRvIGdldCB0aGUgcmVjZXB0aW9uIHRpbWVzdGFtcCwgd3JpdHRlbiBhcyB3ZSBwYXJzZWQgdGhlIGhlYWRlcgorZXh0ZXJuIHVpbnQzMl90IHZjaGlfaGVsZF9tc2dfcnhfdGltZXN0YW1wKCBjb25zdCBWQ0hJX0hFTERfTVNHX1QgKm1lc3NhZ2UgKTsKKworLy8gUm91dGluZSB0byByZWxlYXNlIGEgaGVsZCBtZXNzYWdlIGFmdGVyIGl0IGhhcyBiZWVuIHByb2Nlc3NlZAorZXh0ZXJuIGludDMyX3QgdmNoaV9oZWxkX21zZ19yZWxlYXNlKCBWQ0hJX0hFTERfTVNHX1QgKm1lc3NhZ2UgKTsKKworLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGl0ZXJhdG9yIGhhcyBhIG5leHQgbWVzc2FnZS4KK2V4dGVybiBpbnQzMl90IHZjaGlfbXNnX2l0ZXJfaGFzX25leHQoIGNvbnN0IFZDSElfTVNHX0lURVJfVCAqaXRlciApOworCisvLyBSZXR1cm4gdGhlIHBvaW50ZXIgYW5kIGxlbmd0aCBmb3IgdGhlIG5leHQgbWVzc2FnZSBhbmQgYWR2YW5jZSB0aGUgaXRlcmF0b3IuCitleHRlcm4gaW50MzJfdCB2Y2hpX21zZ19pdGVyX25leHQoIFZDSElfTVNHX0lURVJfVCAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICptc2dfc2l6ZSApOworCisvLyBSZW1vdmUgdGhlIGxhc3QgbWVzc2FnZSByZXR1cm5lZCBieSB2Y2hpX21zZ19pdGVyX25leHQuCisvLyBDYW4gb25seSBiZSBjYWxsZWQgb25jZSBhZnRlciBlYWNoIGNhbGwgdG8gdmNoaV9tc2dfaXRlcl9uZXh0LgorZXh0ZXJuIGludDMyX3QgdmNoaV9tc2dfaXRlcl9yZW1vdmUoIFZDSElfTVNHX0lURVJfVCAqaXRlciApOworCisvLyBIb2xkIHRoZSBsYXN0IG1lc3NhZ2UgcmV0dXJuZWQgYnkgdmNoaV9tc2dfaXRlcl9uZXh0LgorLy8gQ2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UgYWZ0ZXIgZWFjaCBjYWxsIHRvIHZjaGlfbXNnX2l0ZXJfbmV4dC4KK2V4dGVybiBpbnQzMl90IHZjaGlfbXNnX2l0ZXJfaG9sZCggVkNISV9NU0dfSVRFUl9UICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX0hFTERfTVNHX1QgKm1lc3NhZ2UgKTsKKworLy8gUmV0dXJuIGluZm9ybWF0aW9uIGZvciB0aGUgbmV4dCBtZXNzYWdlLCBhbmQgaG9sZCBpdCwgYWR2YW5jaW5nIHRoZSBpdGVyYXRvci4KK2V4dGVybiBpbnQzMl90IHZjaGlfbXNnX2l0ZXJfaG9sZF9uZXh0KCBWQ0hJX01TR19JVEVSX1QgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmRhdGEsICAgICAgICAvLyB9IG1heSBiZSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm1zZ19zaXplLCAvLyB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9IRUxEX01TR19UICptZXNzYWdlICk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEdsb2JhbCBidWxrIEFQSQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBSb3V0aW5lIHRvIHByZXBhcmUgaW50ZXJmYWNlIGZvciBhIHRyYW5zZmVyIGZyb20gdGhlIG90aGVyIHNpZGUKK2V4dGVybiBpbnQzMl90IHZjaGlfYnVsa19xdWV1ZV9yZWNlaXZlKCBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGFfZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX0ZMQUdTX1QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdHJhbnNmZXJfaGFuZGxlICk7CisKKworLy8gUHJlcGFyZSBpbnRlcmZhY2UgZm9yIGEgdHJhbnNmZXIgZnJvbSB0aGUgb3RoZXIgc2lkZSBpbnRvIHJlbG9jYXRhYmxlIG1lbW9yeS4KK2ludDMyX3QgdmNoaV9idWxrX3F1ZXVlX3JlY2VpdmVfcmVsb2MoIGNvbnN0IFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX01FTV9IQU5ETEVfVCBoX2RzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZDSElfRkxBR1NfVCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBjb25zdCBidWxrX2hhbmRsZSApOworCisvLyBSb3V0aW5lIHRvIHF1ZXVlIHVwIGRhdGEgcmVhZHkgZm9yIHRyYW5zZmVyIHRvIHRoZSBvdGhlciAob25jZSB0aGV5IGhhdmUgc2lnbmFsbGVkIHRoZXkgYXJlIHJlYWR5KQorZXh0ZXJuIGludDMyX3QgdmNoaV9idWxrX3F1ZXVlX3RyYW5zbWl0KCBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX0ZMQUdTX1QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnRyYW5zZmVyX2hhbmRsZSApOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBDb25maWd1cmF0aW9uIHBsdW1iaW5nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIHRoZSBkaWZmZXJlbnQgbWlkIGxheWVycyAodGhlIHN0YXRlIGluZm8gZ2l2ZXMgdGhlIGRpZmZlcmVudCBwaHlzaWNhbCBjb25uZWN0aW9ucykKK2V4dGVybiBjb25zdCBWQ0hJX0NPTk5FQ1RJT05fQVBJX1QgKnNpbmdsZV9nZXRfZnVuY190YWJsZSggdm9pZCApOworLy9leHRlcm4gY29uc3QgVkNISV9DT05ORUNUSU9OX0FQSV9UICpsb2NhbF9zZXJ2ZXJfZ2V0X2Z1bmNfdGFibGUoIHZvaWQgKTsKKy8vZXh0ZXJuIGNvbnN0IFZDSElfQ09OTkVDVElPTl9BUElfVCAqbG9jYWxfY2xpZW50X2dldF9mdW5jX3RhYmxlKCB2b2lkICk7CisKKy8vIGRlY2xhcmUgYWxsIG1lc3NhZ2UgZHJpdmVycyBoZXJlCitjb25zdCBWQ0hJX01FU1NBR0VfRFJJVkVSX1QgKnZjaGlfbXBoaV9tZXNzYWdlX2RyaXZlcl9mdW5jX3RhYmxlKCB2b2lkICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKK2V4dGVybiBpbnQzMl90IHZjaGlfYnVsa19xdWV1ZV90cmFuc21pdF9yZWxvYyggVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9NRU1fSEFORExFX1QgaF9zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX0ZMQUdTX1QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnRyYW5zZmVyX2hhbmRsZSApOworI2VuZGlmIC8qIFZDSElfSF8gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFbmQgb2YgZmlsZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGkvdmNoaV9jZmcuaCBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpL3ZjaGlfY2ZnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZiYzJkMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpL3ZjaGlfY2ZnLmgKQEAgLTAsMCArMSwyMjQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVkNISV9DRkdfSF8KKyNkZWZpbmUgVkNISV9DRkdfSF8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERlZmluZXMgaW4gdGhpcyBmaXJzdCBzZWN0aW9uIGFyZSBwYXJ0IG9mIHRoZSBWQ0hJIEFQSSBhbmQgbWF5IGJlIGV4YW1pbmVkIGJ5IFZDSEkKKyAqIHNlcnZpY2VzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUmVxdWlyZWQgYWxpZ25tZW50IG9mIGJhc2UgYWRkcmVzc2VzIGZvciBidWxrIHRyYW5zZmVyLCBpZiB1bmFsaWduZWQgdHJhbnNmZXJzIGFyZSBub3QgZW5hYmxlZCAqLworLyogUmVhbGx5IGRldGVybWluZWQgYnkgdGhlIG1lc3NhZ2UgZHJpdmVyLCBhbmQgc2hvdWxkIGJlIGF2YWlsYWJsZSBmcm9tIGEgcnVuLXRpbWUgY2FsbC4gKi8KKyNpZm5kZWYgVkNISV9CVUxLX0FMSUdOCisjICAgaWYgX19WQ0NPUkVWRVJfXyA+PSAweDA0MDAwMDAwCisjICAgICAgIGRlZmluZSBWQ0hJX0JVTEtfQUxJR04gMzIgLy8gQWxsb3dzIGZvciB0aGUgbmVlZCB0byBkbyBjYWNoZSBjbGVhbnMKKyMgICBlbHNlCisjICAgICAgIGRlZmluZSBWQ0hJX0JVTEtfQUxJR04gMTYKKyMgICBlbmRpZgorI2VuZGlmCisKKy8qIFJlcXVpcmVkIGxlbmd0aCBtdWx0aXBsZSBmb3IgYnVsayB0cmFuc2ZlcnMsIGlmIHVuYWxpZ25lZCB0cmFuc2ZlcnMgYXJlIG5vdCBlbmFibGVkICovCisvKiBNYXkgYmUgbGVzcyB0aGFuIG9yIGdyZWF0ZXIgdGhhbiBWQ0hJX0JVTEtfQUxJR04gKi8KKy8qIFJlYWxseSBkZXRlcm1pbmVkIGJ5IHRoZSBtZXNzYWdlIGRyaXZlciwgYW5kIHNob3VsZCBiZSBhdmFpbGFibGUgZnJvbSBhIHJ1bi10aW1lIGNhbGwuICovCisjaWZuZGVmIFZDSElfQlVMS19HUkFOVUxBUklUWQorIyAgIGlmIF9fVkNDT1JFVkVSX18gPj0gMHgwNDAwMDAwMAorIyAgICAgICBkZWZpbmUgVkNISV9CVUxLX0dSQU5VTEFSSVRZIDMyIC8vIEFsbG93cyBmb3IgdGhlIG5lZWQgdG8gZG8gY2FjaGUgY2xlYW5zCisjICAgZWxzZQorIyAgICAgICBkZWZpbmUgVkNISV9CVUxLX0dSQU5VTEFSSVRZIDE2CisjICAgZW5kaWYKKyNlbmRpZgorCisvKiBUaGUgbGFyZ2VzdCBwb3NzaWJsZSBtZXNzYWdlIHRvIGJlIHF1ZXVlZCB3aXRoIHZjaGlfbXNnX3F1ZXVlLiAqLworI2lmbmRlZiBWQ0hJX01BWF9NU0dfU0laRQorIyAgIGlmIGRlZmluZWQgVkNISV9MT0NBTF9IT1NUX1BPUlQKKyMgICAgICAgZGVmaW5lIFZDSElfTUFYX01TR19TSVpFICAgICAxNjM4NCAgICAgICAgIC8vIG1ha2VzIGZpbGUgdHJhbnNmZXJzIGZhc3QsIGJ1dCBzaG91bGQgdGhleSBiZSB1c2luZyBidWxrPworIyAgIGVsc2UKKyMgICAgICAgZGVmaW5lIFZDSElfTUFYX01TR19TSVpFICAgICAgNDA5NiAvLyBOT1RFOiBUSElTIE1VU1QgQkUgTEFSR0VSIFRIQU4gT1IgRVFVQUwgVE8gVEhFIFNJWkUgT0YgVEhFIEtIUk9OT1MgTUVSR0UgQlVGRkVSISEKKyMgICBlbmRpZgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERlZmluZXMgYmVsb3cgYXJlIHN5c3RlbSBjb25maWd1cmF0aW9uIG9wdGlvbnMsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgVkNISSBzZXJ2aWNlcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSG93IG1hbnkgY29ubmVjdGlvbnMgY2FuIHdlIHN1cHBvcnQ/IEEgbG9jYWxob3N0IGltcGxlbWVudGF0aW9uIHVzZXMgMiBjb25uZWN0aW9ucywKKyAqIDEgZm9yIGhvc3QtYXBwLCAxIGZvciBWTUNTLCBhbmQgdGhlc2UgYXJlIGhvb2tlZCB0b2dldGhlciBieSBhIGxvb3BiYWNrIE1QSEkgVkNGVworICogZHJpdmVyLiAqLworI2lmbmRlZiBWQ0hJX01BWF9OVU1fQ09OTkVDVElPTlMKKyMgICBkZWZpbmUgVkNISV9NQVhfTlVNX0NPTk5FQ1RJT05TIDMKKyNlbmRpZgorCisvKiBIb3cgbWFueSBzZXJ2aWNlcyBjYW4gd2Ugb3BlbiBwZXIgY29ubmVjdGlvbj8gRXh0ZW5kaW5nIHRoaXMgZG9lc24ndCBjb3N0IHByb2Nlc3NpbmcgdGltZSwganVzdCBhIHNtYWxsCisgKiBhbW91bnQgb2Ygc3RhdGljIG1lbW9yeS4gKi8KKyNpZm5kZWYgVkNISV9NQVhfU0VSVklDRVNfUEVSX0NPTk5FQ1RJT04KKyMgIGRlZmluZSBWQ0hJX01BWF9TRVJWSUNFU19QRVJfQ09OTkVDVElPTiAzNgorI2VuZGlmCisKKy8qIEFkanVzdCBpZiB1c2luZyBhIG1lc3NhZ2UgZHJpdmVyIHRoYXQgc3VwcG9ydHMgbW9yZSBsb2dpY2FsIFRYIGNoYW5uZWxzICovCisjaWZuZGVmIFZDSElfTUFYX0JVTEtfVFhfQ0hBTk5FTFNfUEVSX0NPTk5FQ1RJT04KKyMgICBkZWZpbmUgVkNISV9NQVhfQlVMS19UWF9DSEFOTkVMU19QRVJfQ09OTkVDVElPTiA5IC8vIDEgTVBISSArIDggQ0NQMiBsb2dpY2FsIGNoYW5uZWxzCisjZW5kaWYKKworLyogQWRqdXN0IGlmIHVzaW5nIGEgbWVzc2FnZSBkcml2ZXIgdGhhdCBzdXBwb3J0cyBtb3JlIGxvZ2ljYWwgUlggY2hhbm5lbHMgKi8KKyNpZm5kZWYgVkNISV9NQVhfQlVMS19SWF9DSEFOTkVMU19QRVJfQ09OTkVDVElPTgorIyAgIGRlZmluZSBWQ0hJX01BWF9CVUxLX1JYX0NIQU5ORUxTX1BFUl9DT05ORUNUSU9OIDEgLy8gMSBNUEhJCisjZW5kaWYKKworLyogSG93IG1hbnkgcmVjZWl2ZSBzbG90cyBkbyB3ZSB1c2UuIFRoaXMgdGltZXMgVkNISV9NQVhfTVNHX1NJWkUgZ2l2ZXMgdGhlIGVmZmVjdGl2ZQorICogcmVjZWl2ZSBxdWV1ZSBzcGFjZSwgbGVzcyBtZXNzYWdlIGhlYWRlcnMuICovCisjaWZuZGVmIFZDSElfTlVNX1JFQURfU0xPVFMKKyMgIGlmIGRlZmluZWQoVkNISV9MT0NBTF9IT1NUX1BPUlQpCisjICAgICBkZWZpbmUgVkNISV9OVU1fUkVBRF9TTE9UUyA0CisjICBlbHNlCisjICAgICBkZWZpbmUgVkNISV9OVU1fUkVBRF9TTE9UUyA0OAorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBEbyB3ZSB1dGlsaXNlIG92ZXJydW4gZmFjaWxpdHkgZm9yIHJlY2VpdmUgbWVzc2FnZSBzbG90cz8gQ2FuIGFpZCBwZWVyIHRyYW5zbWl0CisgKiBwZXJmb3JtYW5jZS4gT25seSBkZWZpbmUgb24gVmlkZW9Db3JlIGVuZCwgdGFsa2luZyB0byBob3N0LgorICovCisvLyNkZWZpbmUgVkNISV9NU0dfUlhfT1ZFUlJVTgorCisvKiBIb3cgbWFueSB0cmFuc21pdCBzbG90cyBkbyB3ZSB1c2UuIEdlbmVyYWxseSBkb24ndCBuZWVkIG1hbnksIGFzIHRoZSBoYXJkd2FyZSBkcml2ZXIKKyAqIHVuZGVybmVhdGggVkNISSB3aWxsIHVzdWFsbHkgaGF2ZSBpdHMgb3duIGJ1ZmZlcmluZy4gKi8KKyNpZm5kZWYgVkNISV9OVU1fV1JJVEVfU0xPVFMKKyMgIGRlZmluZSBWQ0hJX05VTV9XUklURV9TTE9UUyA0CisjZW5kaWYKKworLyogSWYgYSBzZXJ2aWNlIGhhcyBoZWxkIG9yIHF1ZXVlZCByZWNlaXZlZCBtZXNzYWdlcyBpbiBWQ0hJX1hPRkZfVEhSRVNIT0xEIG9yIG1vcmUgc2xvdHMsCisgKiB0aGVuIGl0J3MgdGFraW5nIHVwIHRvbyBtdWNoIGJ1ZmZlciBzcGFjZSwgYW5kIHRoZSBwZWVyIHNlcnZpY2Ugd2lsbCBiZSB0b2xkIHRvIHN0b3AKKyAqIHRyYW5zbWl0dGluZyB3aXRoIGFuIFhPRkYgbWVzc2FnZS4gRm9yIHRoaXMgdG8gYmUgZWZmZWN0aXZlLCB0aGUgVkNISV9OVU1fUkVBRF9TTE9UUworICogbmVlZHMgdG8gYmUgY29uc2lkZXJhYmx5IGJpZ2dlciB0aGFuIFZDSElfTlVNX1dSSVRFX1NMT1RTLCBvciB0aGUgdHJhbnNtaXQgbGF0ZW5jeQorICogaXMgdG9vIGhpZ2guICovCisjaWZuZGVmIFZDSElfWE9GRl9USFJFU0hPTEQKKyMgIGRlZmluZSBWQ0hJX1hPRkZfVEhSRVNIT0xEIChWQ0hJX05VTV9SRUFEX1NMT1RTIC8gMikKKyNlbmRpZgorCisvKiBBZnRlciB3ZSd2ZSBzZW50IGFuIFhPRkYsIHRoZSBwZWVyIHdpbGwgYmUgdG9sZCB0byByZXN1bWUgdHJhbnNtaXNzaW9uIG9uY2UgdGhlIGxvY2FsCisgKiBzZXJ2aWNlIGhhcyBkZXF1ZXVlZC9yZWxlYXNlZCBlbm91Z2ggbWVzc2FnZXMgdGhhdCBpdCdzIG5vdyBvY2N1cHlpbmcKKyAqIFZDSElfWE9OX1RIUkVTSE9MRCBzbG90cyBvciBmZXdlci4gKi8KKyNpZm5kZWYgVkNISV9YT05fVEhSRVNIT0xECisjICBkZWZpbmUgVkNISV9YT05fVEhSRVNIT0xEIChWQ0hJX05VTV9SRUFEX1NMT1RTIC8gNCkKKyNlbmRpZgorCisvKiBBIHNpemUgYmVsb3cgd2hpY2ggYSBidWxrIHRyYW5zZmVyIG9taXRzIHRoZSBoYW5kc2hha2UgY29tcGxldGVseSBhbmQgYWx3YXlzIGdvZXMKKyAqIHZpYSB0aGUgbWVzc2FnZSBjaGFubmVsLCBpZiBidWxrIGF1eGlsaWFyeSBpcyBiZWluZyBzZW50IG9uIHRoYXQgc2VydmljZS4gKFRoZSB1c2VyCisgKiBjYW4gZ3VhcmFudGVlIHRoaXMgYnkgZW5hYmxpbmcgdW5hbGlnbmVkIHRyYW5zbWl0cykuCisgKiBOb3QgQVBJLiAqLworI2lmbmRlZiBWQ0hJX01JTl9CVUxLX1NJWkUKKyMgIGRlZmluZSBWQ0hJX01JTl9CVUxLX1NJWkUgICAgKCBWQ0hJX01BWF9NU0dfU0laRSAvIDIgPCA0MDk2ID8gVkNISV9NQVhfTVNHX1NJWkUgLyAyIDogNDA5NiApCisjZW5kaWYKKworLyogTWF4aW11bSBzaXplIG9mIGJ1bGsgdHJhbnNtaXNzaW9uIGNodW5rcywgZm9yIGVhY2ggaW50ZXJmYWNlIHR5cGUuIEEgdHJhZGUtb2ZmIGJldHdlZW4KKyAqIHNwZWVkIGFuZCBsYXRlbmN5OyB0aGUgc21hbGxlciB0aGUgY2h1bmsgc2l6ZSB0aGUgYmV0dGVyIGNoYW5nZSBvZiBtZXNzYWdlcyBhbmQgb3RoZXIKKyAqIGJ1bGsgdHJhbnNtaXNzaW9ucyBnZXR0aW5nIGluIHdoZW4gYmlnIGJ1bGsgdHJhbnNmZXJzIGFyZSBoYXBwZW5pbmcuIFNldCB0byAwIHRvIG5vdAorICogYnJlYWsgdHJhbnNtaXNzaW9ucyBpbnRvIGNodW5rcy4KKyAqLworI2lmbmRlZiBWQ0hJX01BWF9CVUxLX0NIVU5LX1NJWkVfTVBISQorIyAgZGVmaW5lIFZDSElfTUFYX0JVTEtfQ0hVTktfU0laRV9NUEhJICgxNiAqIDEwMjQpCisjZW5kaWYKKworLyogTkIgQ2h1bmtlZCBDQ1AyIHRyYW5zbWlzc2lvbnMgdmlvbGF0ZSB0aGUgbGV0dGVyIG9mIHRoZSBDQ1AyIHNwZWMgYnkgdXNpbmcgIkpQRUc4IiBtb2RlCisgKiB3aXRoIG11bHRpcGxlLWxpbmUgZnJhbWVzLiBPbmx5IHVzZSBpZiB0aGUgcmVjZWl2ZXIgY2FuIGNvcGUuICovCisjaWZuZGVmIFZDSElfTUFYX0JVTEtfQ0hVTktfU0laRV9DQ1AyCisjICBkZWZpbmUgVkNISV9NQVhfQlVMS19DSFVOS19TSVpFX0NDUDIgMAorI2VuZGlmCisKKy8qIEhvdyBtYW55IFRYIG1lc3NhZ2VzIGNhbiB3ZSBoYXZlIHBlbmRpbmcgaW4gb3VyIHRyYW5zbWl0IHNsb3RzLiBPbmNlIGV4aGF1c3RlZCwKKyAqIHZjaGlfbXNnX3F1ZXVlIHdpbGwgYmUgYmxvY2tlZC4gKi8KKyNpZm5kZWYgVkNISV9UWF9NU0dfUVVFVUVfU0laRQorIyAgZGVmaW5lIFZDSElfVFhfTVNHX1FVRVVFX1NJWkUgICAgICAgICAgIDI1NgorI2VuZGlmCisKKy8qIEhvdyBtYW55IFJYIG1lc3NhZ2VzIGNhbiB3ZSBoYXZlIHBhcnNlZCBpbiB0aGUgcmVjZWl2ZSBzbG90cy4gT25jZSBleGhhdXN0ZWQsIHBhcnNpbmcKKyAqIHdpbGwgYmUgc3VzcGVuZGVkIHVudGlsIG9sZGVyIG1lc3NhZ2VzIGFyZSBkZXF1ZXVlZC9yZWxlYXNlZC4gKi8KKyNpZm5kZWYgVkNISV9SWF9NU0dfUVVFVUVfU0laRQorIyAgZGVmaW5lIFZDSElfUlhfTVNHX1FVRVVFX1NJWkUgICAgICAgICAgIDI1NgorI2VuZGlmCisKKy8qIFJlYWxseSBzaG91bGQgYmUgYWJsZSB0byBjb3BlIGlmIHdlIHJ1biBvdXQgb2YgcmVjZWl2ZWQgbWVzc2FnZSBkZXNjcmlwdG9ycywgYnkKKyAqIHN1c3BlbmRpbmcgcGFyc2luZyBhcyB0aGUgY29tbWVudCBhYm92ZSBzYXlzLCBidXQgd2UgZG9uJ3QuIFRoaXMgc3dlZXBzIHRoZSBpc3N1ZQorICogdW5kZXIgdGhlIGNhcnBldC4gKi8KKyNpZiBWQ0hJX1JYX01TR19RVUVVRV9TSVpFIDwgKFZDSElfTUFYX01TR19TSVpFLzE2ICsgMSkgKiBWQ0hJX05VTV9SRUFEX1NMT1RTCisjICB1bmRlZiBWQ0hJX1JYX01TR19RVUVVRV9TSVpFCisjICBkZWZpbmUgVkNISV9SWF9NU0dfUVVFVUVfU0laRSAoVkNISV9NQVhfTVNHX1NJWkUvMTYgKyAxKSAqIFZDSElfTlVNX1JFQURfU0xPVFMKKyNlbmRpZgorCisvKiBIb3cgbWFueSBidWxrIHRyYW5zbWl0cyBjYW4gd2UgaGF2ZSBwZW5kaW5nLiBPbmNlIGV4aGF1c3RlZCwgdmNoaV9idWxrX3F1ZXVlX3RyYW5zbWl0CisgKiB3aWxsIGJlIGJsb2NrZWQuICovCisjaWZuZGVmIFZDSElfVFhfQlVMS19RVUVVRV9TSVpFCisjICBkZWZpbmUgVkNISV9UWF9CVUxLX1FVRVVFX1NJWkUgICAgICAgICAgIDY0CisjZW5kaWYKKworLyogSG93IG1hbnkgYnVsayByZWNlaXZlcyBjYW4gd2UgaGF2ZSBwZW5kaW5nLiBPbmNlIGV4aGF1c3RlZCwgdmNoaV9idWxrX3F1ZXVlX3JlY2VpdmUKKyAqIHdpbGwgYmUgYmxvY2tlZC4gKi8KKyNpZm5kZWYgVkNISV9SWF9CVUxLX1FVRVVFX1NJWkUKKyMgIGRlZmluZSBWQ0hJX1JYX0JVTEtfUVVFVUVfU0laRSAgICAgICAgICAgNjQKKyNlbmRpZgorCisvKiBBIGxpbWl0IG9uIGhvdyBtYW55IG91dHN0YW5kaW5nIGJ1bGsgcmVxdWVzdHMgd2UgZXhwZWN0IHRoZSBwZWVyIHRvIGdpdmUgdXMuIElmCisgKiB0aGUgcGVlciBhc2tzIGZvciBtb3JlIHRoYW4gdGhpcywgVkNISSB3aWxsIGZhaWwgYW5kIGFzc2VydC4gVGhlIG51bWJlciBpcyBkZXRlcm1pbmVkCisgKiBieSB0aGUgcGVlcidzIGhhcmR3YXJlIC0gaXQncyB0aGUgbnVtYmVyIG9mIG91dHN0YW5kaW5nIHJlcXVlc3RzIHRoYXQgY2FuIGJlIHF1ZXVlZAorICogb24gYWxsIGJ1bGsgY2hhbm5lbHMuIFZDMydzIE1QSEkgcGVyaXBoZXJhbCBhbGxvd3MgMTYuICovCisjaWZuZGVmIFZDSElfTUFYX1BFRVJfQlVMS19SRVFVRVNUUworIyAgZGVmaW5lIFZDSElfTUFYX1BFRVJfQlVMS19SRVFVRVNUUyAgICAgICAzMgorI2VuZGlmCisKKy8qIERlZmluZSBWQ0hJX0NDUDJUWF9NQU5VQUxfUE9XRVIgaWYgdGhlIGhvc3QgdGVsbHMgdXMgd2hlbiB0byB0dXJuIHRoZSBDQ1AyCisgKiB0cmFuc21pdHRlciBvbiBhbmQgb2ZmLgorICovCisvKiNkZWZpbmUgVkNISV9DQ1AyVFhfTUFOVUFMX1BPV0VSKi8KKworI2lmbmRlZiBWQ0hJX0NDUDJUWF9NQU5VQUxfUE9XRVIKKworLyogVGltZW91dCAoaW4gbWlsbGlzZWNvbmRzKSBmb3IgcHV0dGluZyB0aGUgQ0NQMlRYIGludGVyZmFjZSBpbnRvIElETEUgc3RhdGUuIFNldAorICogbmVnYXRpdmUgZm9yIG5vIElETEUuCisgKi8KKyMgIGlmbmRlZiBWQ0hJX0NDUDJUWF9JRExFX1RJTUVPVVQKKyMgICAgZGVmaW5lIFZDSElfQ0NQMlRYX0lETEVfVElNRU9VVCAgICAgICAgNQorIyAgZW5kaWYKKworLyogVGltZW91dCAoaW4gbWlsbGlzZWNvbmRzKSBmb3IgcHV0dGluZyB0aGUgQ0NQMlRYIGludGVyZmFjZSBpbnRvIE9GRiBzdGF0ZS4gU2V0CisgKiBuZWdhdGl2ZSBmb3Igbm8gT0ZGLgorICovCisjICBpZm5kZWYgVkNISV9DQ1AyVFhfT0ZGX1RJTUVPVVQKKyMgICAgZGVmaW5lIFZDSElfQ0NQMlRYX09GRl9USU1FT1VUICAgICAgICAgMTAwMAorIyAgZW5kaWYKKworI2VuZGlmIC8qIFZDSElfQ0NQMlRYX01BTlVBTF9QT1dFUiAqLworCisjZW5kaWYgLyogVkNISV9DRkdfSF8gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFbmQgb2YgZmlsZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGkvdmNoaV9jZmdfaW50ZXJuYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpL3ZjaGlfY2ZnX2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVkY2JhNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpL3ZjaGlfY2ZnX2ludGVybmFsLmgKQEAgLTAsMCArMSw3MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBWQ0hJX0NGR19JTlRFUk5BTF9IXworI2RlZmluZSBWQ0hJX0NGR19JTlRFUk5BTF9IXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29udHJvbCBvcHRpbWlzYXRpb24gYXR0ZW1wdHMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBEb24ndCB1c2UgbG90cyBvZiBzaG9ydC10ZXJtIGxvY2tzIC0gdXNlIGdyZWF0IGxvbmcgb25lcywgcmVkdWNpbmcgdGhlIG92ZXJhbGwgbG9ja3MtcGVyLXNlY29uZAorI2RlZmluZSBWQ0hJX0NPQVJTRV9MT0NLSU5HCisKKy8vIEF2b2lkIGxvY2sgdGhlbiB1bmxvY2sgb24gZXhpdCBmcm9tIGJsb2NraW5nIHF1ZXVlIG9wZXJhdGlvbnMgKG1zZyB0eCwgYnVsayByeC90eCkKKy8vIChvbmx5IHJlbGV2YW50IGlmIFZDSElfQ09BUlNFX0xPQ0tJTkcpCisjZGVmaW5lIFZDSElfRUxJREVfQkxPQ0tfRVhJVF9MT0NLCisKKy8vIEF2b2lkIGxvY2sgb24gbm9uLWJsb2NraW5nIHBlZWsKKy8vIChvbmx5IHJlbGV2YW50IGlmIFZDSElfQ09BUlNFX0xPQ0tJTkcpCisjZGVmaW5lIFZDSElfQVZPSURfUEVFS19MT0NLCisKKy8vIFVzZSBvbmUgc2xvdC1oYW5kbGVyIHRocmVhZCBwZXIgY29ubmVjdGlvbiwgcmF0aGVyIHRoYW4gMSB0aHJlYWQgZGVhbGluZyB3aXRoIGFsbCBjb25uZWN0aW9ucyBpbiByb3RhdGlvbi4KKyNkZWZpbmUgVkNISV9NVUxUSVBMRV9IQU5ETEVSX1RIUkVBRFMKKworLy8gUHV0IGZyZWUgZGVzY3JpcHRvcnMgb250byB0aGUgaGVhZCBvZiB0aGUgZnJlZSBxdWV1ZSwgcmF0aGVyIHRoYW4gdGhlIHRhaWwsIHNvIHRoYXQgd2UgZG9uJ3QgdGhyYXNoCisvLyBvdXIgd2F5IHRocm91Z2ggdGhlIHBvb2wgb2YgZGVzY3JpcHRvcnMuCisjZGVmaW5lIFZDSElfUFVTSF9GUkVFX0RFU0NSSVBUT1JTX09OVE9fSEVBRAorCisvLyBEb24ndCBpc3N1ZSBhIE1TR19BVkFJTEFCTEUgY2FsbGJhY2sgZm9yIGV2ZXJ5IHNpbmdsZSBtZXNzYWdlLiBQb3NzaWJseSBvbmx5IHNhZmUgaWYgVkNISV9DT0FSU0VfTE9DS0lORy4KKyNkZWZpbmUgVkNISV9GRVdFUl9NU0dfQVZBSUxBQkxFX0NBTExCQUNLUworCisvLyBEb24ndCB1c2UgbWVzc2FnZSBkZXNjcmlwdG9ycyBmb3IgVFggbWVzc2FnZXMgdGhhdCBkb24ndCBuZWVkIHRoZW0KKyNkZWZpbmUgVkNISV9NSU5JTUlTRV9UWF9NU0dfREVTQ1JJUFRPUlMKKworLy8gTmFuby1sb2NrcyBmb3IgbXVsdGlxdWV1ZQorLy8jZGVmaW5lIFZDSElfTVFVRVVFX05BTk9MT0NLUworCisvLyBMb2NrLWZyZWUoZXIpIGRlcXVldWluZworLy8jZGVmaW5lIFZDSElfUlhfTkFOT0xPQ0tTCisKKyNlbmRpZiAvKlZDSElfQ0ZHX0lOVEVSTkFMX0hfKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpL3ZjaGlfY29tbW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaS92Y2hpX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MzVhNzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaS92Y2hpX2NvbW1vbi5oCkBAIC0wLDAgKzEsMTc1IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEyIEJyb2FkY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbWF5IG5vdCBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFZDSElfQ09NTU9OX0hfCisjZGVmaW5lIFZDSElfQ09NTU9OX0hfCisKKworLy9mbGFncyB1c2VkIHdoZW4gc2VuZGluZyBtZXNzYWdlcyAobXVzdCBiZSBiaXRtYXBwZWQpCit0eXBlZGVmIGVudW0KK3sKKyAgIFZDSElfRkxBR1NfTk9ORSAgICAgICAgICAgICAgICAgICAgICA9IDB4MCwKKyAgIFZDSElfRkxBR1NfQkxPQ0tfVU5USUxfT1BfQ09NUExFVEUgICA9IDB4MSwgICAvLyB3YWl0cyBmb3IgbWVzc2FnZSB0byBiZSByZWNlaXZlZCwgb3Igc2VudCAoTkIuIG5vdCB0aGUgc2FtZSBhcyBiZWluZyBzZWVuIG9uIG90aGVyIHNpZGUpCisgICBWQ0hJX0ZMQUdTX0NBTExCQUNLX1dIRU5fT1BfQ09NUExFVEUgPSAweDIsICAgLy8gcnVuIGEgY2FsbGJhY2sgd2hlbiBtZXNzYWdlIHNlbnQKKyAgIFZDSElfRkxBR1NfQkxPQ0tfVU5USUxfUVVFVUVEICAgICAgICA9IDB4NCwgICAvLyByZXR1cm4gb25jZSB0aGUgdHJhbnNmZXIgaXMgaW4gYSBxdWV1ZSByZWFkeSB0byBnbworICAgVkNISV9GTEFHU19BTExPV19QQVJUSUFMICAgICAgICAgICAgID0gMHg4LAorICAgVkNISV9GTEFHU19CTE9DS19VTlRJTF9EQVRBX1JFQUQgICAgID0gMHgxMCwKKyAgIFZDSElfRkxBR1NfQ0FMTEJBQ0tfV0hFTl9EQVRBX1JFQUQgICA9IDB4MjAsCisKKyAgIFZDSElfRkxBR1NfQUxJR05fU0xPVCAgICAgICAgICAgID0gMHgwMDAwODAsICAvLyBpbnRlcm5hbCB1c2Ugb25seQorICAgVkNISV9GTEFHU19CVUxLX0FVWF9RVUVVRUQgICAgICAgPSAweDAxMDAwMCwgIC8vIGludGVybmFsIHVzZSBvbmx5CisgICBWQ0hJX0ZMQUdTX0JVTEtfQVVYX0NPTVBMRVRFICAgICA9IDB4MDIwMDAwLCAgLy8gaW50ZXJuYWwgdXNlIG9ubHkKKyAgIFZDSElfRkxBR1NfQlVMS19EQVRBX1FVRVVFRCAgICAgID0gMHgwNDAwMDAsICAvLyBpbnRlcm5hbCB1c2Ugb25seQorICAgVkNISV9GTEFHU19CVUxLX0RBVEFfQ09NUExFVEUgICAgPSAweDA4MDAwMCwgIC8vIGludGVybmFsIHVzZSBvbmx5CisgICBWQ0hJX0ZMQUdTX0lOVEVSTkFMICAgICAgICAgICAgICA9IDB4RkYwMDAwCit9IFZDSElfRkxBR1NfVDsKKworLy8gY29uc3RhbnRzIGZvciB2Y2hpX2NyY19jb250cm9sKCkKK3R5cGVkZWYgZW51bSB7CisgICBWQ0hJX0NSQ19OT1RISU5HID0gLTEsCisgICBWQ0hJX0NSQ19QRVJfU0VSVklDRSA9IDAsCisgICBWQ0hJX0NSQ19FVkVSWVRISU5HID0gMSwKK30gVkNISV9DUkNfQ09OVFJPTF9UOworCisvL2NhbGxiYWNrIHJlYXNvbnMgd2hlbiBhbiBldmVudCBvY2N1cnMgb24gYSBzZXJ2aWNlCit0eXBlZGVmIGVudW0KK3sKKyAgIFZDSElfQ0FMTEJBQ0tfUkVBU09OX01JTiwKKworICAgLy9UaGlzIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGRhdGEgYXZhaWxhYmxlCisgICAvL2hhbmRsZSBpcyB0aGUgbXNnIGlkIHRoYXQgd2FzIHRyYW5zbWl0dGVkIHdpdGggdGhlIGRhdGEKKyAgIC8vICAgIFdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkIGFuZCB0aGVyZSB3YXMgbm8gRlVMTCBtZXNzYWdlIGF2YWlsYWJsZSBwcmV2aW91c2x5LCBzZW5kIGNhbGxiYWNrCisgICAvLyAgICBUYXNrcyBnZXQga2lja2VkIGJ5IHRoZSBjYWxsYmFjaywgcmVzZXQgdGhlaXIgZXZlbnQgYW5kIHRyeSBhbmQgcmVhZCBmcm9tIHRoZSBmaWZvIHVudGlsIGl0IGZhaWxzCisgICBWQ0hJX0NBTExCQUNLX01TR19BVkFJTEFCTEUsCisgICBWQ0hJX0NBTExCQUNLX01TR19TRU5ULAorICAgVkNISV9DQUxMQkFDS19NU0dfU1BBQ0VfQVZBSUxBQkxFLCAvLyBYWFggbm90IHlldCBpbXBsZW1lbnRlZAorCisgICAvLyBUaGlzIGluZGljYXRlcyB0aGF0IGEgdHJhbnNmZXIgZnJvbSB0aGUgb3RoZXIgc2lkZSBoYXMgY29tcGxldGVkCisgICBWQ0hJX0NBTExCQUNLX0JVTEtfUkVDRUlWRUQsCisgICAvL1RoaXMgaW5kaWNhdGVzIHRoYXQgZGF0YSBxdWV1ZWQgdXAgdG8gYmUgc2VudCBoYXMgbm93IGdvbmUKKyAgIC8vaGFuZGxlIGlzIHRoZSBtc2cgaWQgdGhhdCB3YXMgdXNlZCB3aGVuIHNlbmRpbmcgdGhlIGRhdGEKKyAgIFZDSElfQ0FMTEJBQ0tfQlVMS19TRU5ULAorICAgVkNISV9DQUxMQkFDS19CVUxLX1JYX1NQQUNFX0FWQUlMQUJMRSwgLy8gWFhYIG5vdCB5ZXQgaW1wbGVtZW50ZWQKKyAgIFZDSElfQ0FMTEJBQ0tfQlVMS19UWF9TUEFDRV9BVkFJTEFCTEUsIC8vIFhYWCBub3QgeWV0IGltcGxlbWVudGVkCisKKyAgIFZDSElfQ0FMTEJBQ0tfU0VSVklDRV9DTE9TRUQsCisKKyAgIC8vIHRoaXMgc2lkZSBoYXMgc2VudCBYT0ZGIHRvIHBlZXIgZHVlIHRvIGxhY2sgb2YgZGF0YSBjb25zdW1wdGlvbiBieSBzZXJ2aWNlCisgICAvLyAoc3VnZ2VzdHMgdGhlIHNlcnZpY2UgbWF5IG5lZWQgdG8gdGFrZSBzb21lIHJlY292ZXJ5IGFjdGlvbiBpZiBpdCBoYXMKKyAgIC8vIGJlZW4gZGVsaWJlcmF0ZWx5IGhvbGRpbmcgb2ZmIGNvbnN1bWluZyBkYXRhKQorICAgVkNISV9DQUxMQkFDS19TRU5UX1hPRkYsCisgICBWQ0hJX0NBTExCQUNLX1NFTlRfWE9OLAorCisgICAvLyBpbmRpY2F0ZXMgdGhhdCBhIGJ1bGsgdHJhbnNmZXIgaGFzIGZpbmlzaGVkIHJlYWRpbmcgdGhlIHNvdXJjZSBidWZmZXIKKyAgIFZDSElfQ0FMTEJBQ0tfQlVMS19EQVRBX1JFQUQsCisKKyAgIC8vIHBvd2VyIG5vdGlmaWNhdGlvbiBldmVudHMgKGN1cnJlbnRseSBob3N0IHNpZGUgb25seSkKKyAgIFZDSElfQ0FMTEJBQ0tfUEVFUl9PRkYsCisgICBWQ0hJX0NBTExCQUNLX1BFRVJfU1VTUEVOREVELAorICAgVkNISV9DQUxMQkFDS19QRUVSX09OLAorICAgVkNISV9DQUxMQkFDS19QRUVSX1JFU1VNRUQsCisgICBWQ0hJX0NBTExCQUNLX0ZPUkNFRF9QT1dFUl9PRkYsCisKKyNpZmRlZiBVU0VfVkNISVFfQVJNCisgICAvLyBzb21lIGV4dHJhIG5vdGlmaWNhdGlvbnMgcHJvdmlkZWQgYnkgdmNoaXFfYXJtCisgICBWQ0hJX0NBTExCQUNLX1NFUlZJQ0VfT1BFTkVELAorICAgVkNISV9DQUxMQkFDS19CVUxLX1JFQ0VJVkVfQUJPUlRFRCwKKyAgIFZDSElfQ0FMTEJBQ0tfQlVMS19UUkFOU01JVF9BQk9SVEVELAorI2VuZGlmCisKKyAgIFZDSElfQ0FMTEJBQ0tfUkVBU09OX01BWAorfSBWQ0hJX0NBTExCQUNLX1JFQVNPTl9UOworCisvLyBzZXJ2aWNlIGNvbnRyb2wgb3B0aW9ucwordHlwZWRlZiBlbnVtCit7CisgICBWQ0hJX1NFUlZJQ0VfT1BUSU9OX01JTiwKKworICAgVkNISV9TRVJWSUNFX09QVElPTl9UUkFDRSwKKyAgIFZDSElfU0VSVklDRV9PUFRJT05fU1lOQ0hST05PVVMsCisKKyAgIFZDSElfU0VSVklDRV9PUFRJT05fTUFYCit9IFZDSElfU0VSVklDRV9PUFRJT05fVDsKKworCisvL0NhbGxiYWNrIHVzZWQgYnkgYWxsIHNlcnZpY2VzIC8gYnVsayB0cmFuc2ZlcnMKK3R5cGVkZWYgdm9pZCAoKlZDSElfQ0FMTEJBQ0tfVCkoIHZvaWQgKmNhbGxiYWNrX3BhcmFtLCAvL215IHNlcnZpY2UgbG9jYWwgcGFyYW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfQ0FMTEJBQ0tfUkVBU09OX1QgcmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqaGFuZGxlICk7IC8vZm9yIHRyYW5zbWl0dGluZyBtc2cncyBvbmx5CisKKworCisvKgorICogRGVmaW5lIHZlY3RvciBzdHJ1Y3QgZm9yIHNjYXR0ZXItZ2F0aGVyICh2ZWN0b3IpIG9wZXJhdGlvbnMKKyAqIFZlY3RvcnMgY2FuIGJlIG5lc3RlZCAtIGlmIGEgdmVjdG9yIGVsZW1lbnQgaGFzIG5lZ2F0aXZlIGxlbmd0aCwgdGhlbgorICogdGhlIGRhdGEgcG9pbnRlciBpcyB0cmVhdGVkIGFzIHBvaW50aW5nIHRvIGFub3RoZXIgdmVjdG9yIGFycmF5LCB3aXRoCisgKiAnLXZlY19sZW4nIGVsZW1lbnRzLiBUaHVzIHRvIGFwcGVuZCBhIGhlYWRlciBvbnRvIGFuIGV4aXN0aW5nIHZlY3RvciwKKyAqIHlvdSBjYW4gZG8gdGhpczoKKyAqCisgKiB2b2lkIGZvbyhjb25zdCBWQ0hJX01TR19WRUNUT1JfVCAqdiwgaW50IG4pCisgKiB7CisgKiAgICBWQ0hJX01TR19WRUNUT1JfVCBudlsyXTsKKyAqICAgIG52WzBdLnZlY19iYXNlID0gbXlfaGVhZGVyOworICogICAgbnZbMF0udmVjX2xlbiA9IHNpemVvZiBteV9oZWFkZXI7CisgKiAgICBudlsxXS52ZWNfYmFzZSA9IHY7CisgKiAgICBudlsxXS52ZWNfbGVuID0gLW47CisgKiAgICAuLi4KKyAqCisgKi8KK3R5cGVkZWYgc3RydWN0IHZjaGlfbXNnX3ZlY3RvciB7CisgICBjb25zdCB2b2lkICp2ZWNfYmFzZTsKKyAgIGludDMyX3QgdmVjX2xlbjsKK30gVkNISV9NU0dfVkVDVE9SX1Q7CisKKy8vIE9wYXF1ZSB0eXBlIGZvciBhIGNvbm5lY3Rpb24gQVBJCit0eXBlZGVmIHN0cnVjdCBvcGFxdWVfdmNoaV9jb25uZWN0aW9uX2FwaV90IFZDSElfQ09OTkVDVElPTl9BUElfVDsKKworLy8gT3BhcXVlIHR5cGUgZm9yIGEgbWVzc2FnZSBkcml2ZXIKK3R5cGVkZWYgc3RydWN0IG9wYXF1ZV92Y2hpX21lc3NhZ2VfZHJpdmVyX3QgVkNISV9NRVNTQUdFX0RSSVZFUl9UOworCisKKy8vIEl0ZXJhdG9yIHN0cnVjdHVyZSBmb3IgcmVhZGluZyBhaGVhZCB0aHJvdWdoIHJlY2VpdmVkIG1lc3NhZ2UgcXVldWUuIEFsbG9jYXRlZCBieSBjbGllbnQsCisvLyBpbml0aWFsaXNlZCBieSB2Y2hpX21zZ19sb29rX2FoZWFkLiBGaWVsZHMgYXJlIGZvciBpbnRlcm5hbCBWQ0hJIHVzZSBvbmx5LgorLy8gSXRlcmF0ZXMgb3ZlciBtZXNzYWdlcyBpbiBxdWV1ZSBhdCB0aGUgaW5zdGFudCBvZiB0aGUgY2FsbCB0byB2Y2hpX21zZ19sb29rYWhlYWQgLQorLy8gd2lsbCBub3QgcHJvY2VlZCB0byBtZXNzYWdlcyByZWNlaXZlZCBzaW5jZS4gQmVoYXZpb3VyIGlzIHVuZGVmaW5lZCBpZiBhbiBpdGVyYXRvcgorLy8gaXMgdXNlZCBhZ2FpbiBhZnRlciBtZXNzYWdlcyBmb3IgdGhhdCBzZXJ2aWNlIGFyZSByZW1vdmVkL2RlcXVldWVkIGJ5IGFueQorLy8gbWVhbnMgb3RoZXIgdGhhbiB2Y2hpX21zZ19pdGVyXy4uLiBjYWxscyBvbiB0aGUgaXRlcmF0b3IgaXRzZWxmLgordHlwZWRlZiBzdHJ1Y3QgeworICAgc3RydWN0IG9wYXF1ZV92Y2hpX3NlcnZpY2VfdCAqc2VydmljZTsKKyAgIHZvaWQgKmxhc3Q7CisgICB2b2lkICpuZXh0OworICAgdm9pZCAqcmVtb3ZlOworfSBWQ0hJX01TR19JVEVSX1Q7CisKKworI2VuZGlmIC8vIFZDSElfQ09NTU9OX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaS92Y2hpX21oLmggYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaS92Y2hpX21oLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk4YmQwNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpL3ZjaGlfbWguaApAQCAtMCwwICsxLDQyIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEyIEJyb2FkY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbWF5IG5vdCBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFZDSElfTUhfSF8KKyNkZWZpbmUgVkNISV9NSF9IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwordHlwZWRlZiBpbnQzMl90IFZDSElfTUVNX0hBTkRMRV9UOworI2RlZmluZSBWQ0hJX01FTV9IQU5ETEVfSU5WQUxJRCAwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcS5oIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMzk4YmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxLmgKQEAgLTAsMCArMSw0MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBWQ0hJUV9WQ0hJUV9ICisjZGVmaW5lIFZDSElRX1ZDSElRX0gKKworI2luY2x1ZGUgInZjaGlxX2lmLmgiCisjaW5jbHVkZSAidmNoaXFfdXRpbC5oIgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfMjgzNS5oIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV8yODM1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VhNWM2NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfMjgzNS5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVkNISVFfMjgzNV9ICisjZGVmaW5lIFZDSElRXzI4MzVfSAorCisjaW5jbHVkZSAidmNoaXFfcGFnZWxpc3QuaCIKKworI2RlZmluZSBWQ0hJUV9QTEFURk9STV9GUkFHTUVOVFNfT0ZGU0VUX0lEWCAwCisjZGVmaW5lIFZDSElRX1BMQVRGT1JNX0ZSQUdNRU5UU19DT1VOVF9JRFggIDEKKworI2VuZGlmIC8qIFZDSElRXzI4MzVfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV8yODM1X2FybS5jIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV8yODM1X2FybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyOTA0MGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxXzI4MzVfYXJtLmMKQEAgLTAsMCArMSw1ODYgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxzb2MvYmNtMjgzNS9yYXNwYmVycnlwaS1maXJtd2FyZS5oPgorCisjZGVmaW5lIGRtYWNfbWFwX2FyZWEJCQlfX2dsdWUoX0NBQ0hFLF9kbWFfbWFwX2FyZWEpCisjZGVmaW5lIGRtYWNfdW5tYXBfYXJlYSAJCV9fZ2x1ZShfQ0FDSEUsX2RtYV91bm1hcF9hcmVhKQorCitleHRlcm4gdm9pZCBkbWFjX21hcF9hcmVhKGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBpbnQpOworZXh0ZXJuIHZvaWQgZG1hY191bm1hcF9hcmVhKGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBpbnQpOworCisjZGVmaW5lIFRPVEFMX1NMT1RTIChWQ0hJUV9TTE9UX1pFUk9fU0xPVFMgKyAyICogMzIpCisKKyNkZWZpbmUgVkNISVFfQVJNX0FERFJFU1MoeCkgKCh2b2lkICopKChjaGFyICopeCArIGdfdmlydF90b19idXNfb2Zmc2V0KSkKKworI2luY2x1ZGUgInZjaGlxX2FybS5oIgorI2luY2x1ZGUgInZjaGlxXzI4MzUuaCIKKyNpbmNsdWRlICJ2Y2hpcV9jb25uZWN0ZWQuaCIKKyNpbmNsdWRlICJ2Y2hpcV9raWxsYWJsZS5oIgorCisjZGVmaW5lIE1BWF9GUkFHTUVOVFMgKFZDSElRX05VTV9DVVJSRU5UX0JVTEtTICogMikKKworI2RlZmluZSBCRUxMMAkweDAwCisjZGVmaW5lIEJFTEwyCTB4MDgKKwordHlwZWRlZiBzdHJ1Y3QgdmNoaXFfMjgzNV9zdGF0ZV9zdHJ1Y3QgeworICAgaW50IGluaXRlZDsKKyAgIFZDSElRX0FSTV9TVEFURV9UIGFybV9zdGF0ZTsKK30gVkNISVFfMjgzNV9BUk1fU1RBVEVfVDsKKworc3RhdGljIHZvaWQgX19pb21lbSAqZ19yZWdzOworc3RhdGljIHVuc2lnbmVkIGludCBnX2NhY2hlX2xpbmVfc2l6ZSA9IHNpemVvZihDQUNIRV9MSU5FX1NJWkUpOworc3RhdGljIHVuc2lnbmVkIGludCBnX2ZyYWdtZW50c19zaXplOworc3RhdGljIGNoYXIgKmdfZnJhZ21lbnRzX2Jhc2U7CitzdGF0aWMgY2hhciAqZ19mcmVlX2ZyYWdtZW50czsKK3N0YXRpYyBzdHJ1Y3Qgc2VtYXBob3JlIGdfZnJlZV9mcmFnbWVudHNfc2VtYTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdfdmlydF90b19idXNfb2Zmc2V0OworCitleHRlcm4gaW50IHZjaGlxX2FybV9sb2dfbGV2ZWw7CisKK3N0YXRpYyBERUZJTkVfU0VNQVBIT1JFKGdfZnJlZV9mcmFnbWVudHNfbXV0ZXgpOworCitzdGF0aWMgaXJxcmV0dXJuX3QKK3ZjaGlxX2Rvb3JiZWxsX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpOworCitzdGF0aWMgaW50CitjcmVhdGVfcGFnZWxpc3QoY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCB1bnNpZ25lZCBzaG9ydCB0eXBlLAorICAgICAgICAgICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgUEFHRUxJU1RfVCAqKiBwcGFnZWxpc3QpOworCitzdGF0aWMgdm9pZAorZnJlZV9wYWdlbGlzdChQQUdFTElTVF9UICpwYWdlbGlzdCwgaW50IGFjdHVhbCk7CisKK2ludCB2Y2hpcV9wbGF0Zm9ybV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IHJwaV9maXJtd2FyZSAqZncgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlWQ0hJUV9TTE9UX1pFUk9fVCAqdmNoaXFfc2xvdF96ZXJvOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXZvaWQgKnNsb3RfbWVtOworCWRtYV9hZGRyX3Qgc2xvdF9waHlzOworCXUzMiBjaGFubmVsYmFzZTsKKwlpbnQgc2xvdF9tZW1fc2l6ZSwgZnJhZ19tZW1fc2l6ZTsKKwlpbnQgZXJyLCBpcnEsIGk7CisKKwlnX3ZpcnRfdG9fYnVzX29mZnNldCA9IHZpcnRfdG9fZG1hKGRldiwgKHZvaWQgKikwKTsKKworCSh2b2lkKW9mX3Byb3BlcnR5X3JlYWRfdTMyKGRldi0+b2Zfbm9kZSwgImNhY2hlLWxpbmUtc2l6ZSIsCisJCQkJICAgJmdfY2FjaGVfbGluZV9zaXplKTsKKwlnX2ZyYWdtZW50c19zaXplID0gMiAqIGdfY2FjaGVfbGluZV9zaXplOworCisJLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBjaGFubmVscyBpbiBjb2hlcmVudCBtZW1vcnkgKi8KKwlzbG90X21lbV9zaXplID0gUEFHRV9BTElHTihUT1RBTF9TTE9UUyAqIFZDSElRX1NMT1RfU0laRSk7CisJZnJhZ19tZW1fc2l6ZSA9IFBBR0VfQUxJR04oZ19mcmFnbWVudHNfc2l6ZSAqIE1BWF9GUkFHTUVOVFMpOworCisJc2xvdF9tZW0gPSBkbWFtX2FsbG9jX2NvaGVyZW50KGRldiwgc2xvdF9tZW1fc2l6ZSArIGZyYWdfbWVtX3NpemUsCisJCQkJICAgICAgICZzbG90X3BoeXMsIEdGUF9LRVJORUwpOworCWlmICghc2xvdF9tZW0pIHsKKwkJZGV2X2VycihkZXYsICJjb3VsZCBub3QgYWxsb2NhdGUgRE1BIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCVdBUk5fT04oKChpbnQpc2xvdF9tZW0gJiAoUEFHRV9TSVpFIC0gMSkpICE9IDApOworCisJdmNoaXFfc2xvdF96ZXJvID0gdmNoaXFfaW5pdF9zbG90cyhzbG90X21lbSwgc2xvdF9tZW1fc2l6ZSk7CisJaWYgKCF2Y2hpcV9zbG90X3plcm8pCisJCXJldHVybiAtRUlOVkFMOworCisJdmNoaXFfc2xvdF96ZXJvLT5wbGF0Zm9ybV9kYXRhW1ZDSElRX1BMQVRGT1JNX0ZSQUdNRU5UU19PRkZTRVRfSURYXSA9CisJCShpbnQpc2xvdF9waHlzICsgc2xvdF9tZW1fc2l6ZTsKKwl2Y2hpcV9zbG90X3plcm8tPnBsYXRmb3JtX2RhdGFbVkNISVFfUExBVEZPUk1fRlJBR01FTlRTX0NPVU5UX0lEWF0gPQorCQlNQVhfRlJBR01FTlRTOworCisJZ19mcmFnbWVudHNfYmFzZSA9IChjaGFyICopc2xvdF9tZW0gKyBzbG90X21lbV9zaXplOworCXNsb3RfbWVtX3NpemUgKz0gZnJhZ19tZW1fc2l6ZTsKKworCWdfZnJlZV9mcmFnbWVudHMgPSBnX2ZyYWdtZW50c19iYXNlOworCWZvciAoaSA9IDA7IGkgPCAoTUFYX0ZSQUdNRU5UUyAtIDEpOyBpKyspIHsKKwkJKihjaGFyICoqKSZnX2ZyYWdtZW50c19iYXNlW2kqZ19mcmFnbWVudHNfc2l6ZV0gPQorCQkJJmdfZnJhZ21lbnRzX2Jhc2VbKGkgKyAxKSpnX2ZyYWdtZW50c19zaXplXTsKKwl9CisJKihjaGFyICoqKSZnX2ZyYWdtZW50c19iYXNlW2kgKiBnX2ZyYWdtZW50c19zaXplXSA9IE5VTEw7CisJc2VtYV9pbml0KCZnX2ZyZWVfZnJhZ21lbnRzX3NlbWEsIE1BWF9GUkFHTUVOVFMpOworCisJaWYgKHZjaGlxX2luaXRfc3RhdGUoc3RhdGUsIHZjaGlxX3Nsb3RfemVybywgMCkgIT0gVkNISVFfU1VDQ0VTUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWdfcmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIoZ19yZWdzKSkKKwkJcmV0dXJuIFBUUl9FUlIoZ19yZWdzKTsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycSA8PSAwKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBJUlFcbiIpOworCQlyZXR1cm4gaXJxOworCX0KKworCWVyciA9IGRldm1fcmVxdWVzdF9pcnEoZGV2LCBpcnEsIHZjaGlxX2Rvb3JiZWxsX2lycSwgSVJRRl9JUlFQT0xMLAorCQkJICAgICAgICJWQ0hJUSBkb29yYmVsbCIsIHN0YXRlKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGlycT0lZFxuIiwgaXJxKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBTZW5kIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIHNsb3RzIHRvIFZpZGVvQ29yZSAqLworCWNoYW5uZWxiYXNlID0gc2xvdF9waHlzOworCWVyciA9IHJwaV9maXJtd2FyZV9wcm9wZXJ0eShmdywgUlBJX0ZJUk1XQVJFX1ZDSElRX0lOSVQsCisJCQkJICAgICZjaGFubmVsYmFzZSwgc2l6ZW9mKGNoYW5uZWxiYXNlKSk7CisJaWYgKGVyciB8fCBjaGFubmVsYmFzZSkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBzZXQgY2hhbm5lbGJhc2VcbiIpOworCQlyZXR1cm4gZXJyID8gOiAtRU5YSU87CisJfQorCisJdmNoaXFfbG9nX2luZm8odmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJInZjaGlxX2luaXQgLSBkb25lIChzbG90cyAleCwgcGh5cyAlcGFkKSIsCisJCSh1bnNpZ25lZCBpbnQpdmNoaXFfc2xvdF96ZXJvLCAmc2xvdF9waHlzKTsKKworCXZjaGlxX2NhbGxfY29ubmVjdGVkX2NhbGxiYWNrcygpOworCisgICByZXR1cm4gMDsKK30KKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3BsYXRmb3JtX2luaXRfc3RhdGUoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisgICBWQ0hJUV9TVEFUVVNfVCBzdGF0dXMgPSBWQ0hJUV9TVUNDRVNTOworICAgc3RhdGUtPnBsYXRmb3JtX3N0YXRlID0ga3phbGxvYyhzaXplb2YoVkNISVFfMjgzNV9BUk1fU1RBVEVfVCksIEdGUF9LRVJORUwpOworICAgKChWQ0hJUV8yODM1X0FSTV9TVEFURV9UKilzdGF0ZS0+cGxhdGZvcm1fc3RhdGUpLT5pbml0ZWQgPSAxOworICAgc3RhdHVzID0gdmNoaXFfYXJtX2luaXRfc3RhdGUoc3RhdGUsICYoKFZDSElRXzI4MzVfQVJNX1NUQVRFX1QqKXN0YXRlLT5wbGF0Zm9ybV9zdGF0ZSktPmFybV9zdGF0ZSk7CisgICBpZihzdGF0dXMgIT0gVkNISVFfU1VDQ0VTUykKKyAgIHsKKyAgICAgICgoVkNISVFfMjgzNV9BUk1fU1RBVEVfVCopc3RhdGUtPnBsYXRmb3JtX3N0YXRlKS0+aW5pdGVkID0gMDsKKyAgIH0KKyAgIHJldHVybiBzdGF0dXM7Cit9CisKK1ZDSElRX0FSTV9TVEFURV9UKgordmNoaXFfcGxhdGZvcm1fZ2V0X2FybV9zdGF0ZShWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKKyAgIGlmKCEoKFZDSElRXzI4MzVfQVJNX1NUQVRFX1QqKXN0YXRlLT5wbGF0Zm9ybV9zdGF0ZSktPmluaXRlZCkKKyAgIHsKKyAgICAgIEJVRygpOworICAgfQorICAgcmV0dXJuICYoKFZDSElRXzI4MzVfQVJNX1NUQVRFX1QqKXN0YXRlLT5wbGF0Zm9ybV9zdGF0ZSktPmFybV9zdGF0ZTsKK30KKwordm9pZAorcmVtb3RlX2V2ZW50X3NpZ25hbChSRU1PVEVfRVZFTlRfVCAqZXZlbnQpCit7CisJd21iKCk7CisKKwlldmVudC0+ZmlyZWQgPSAxOworCisJZHNiKCk7ICAgICAgICAgLyogZGF0YSBiYXJyaWVyIG9wZXJhdGlvbiAqLworCisJaWYgKGV2ZW50LT5hcm1lZCkKKwkJd3JpdGVsKDAsIGdfcmVncyArIEJFTEwyKTsgLyogdHJpZ2dlciB2YyBpbnRlcnJ1cHQgKi8KK30KKworaW50Cit2Y2hpcV9jb3B5X2Zyb21fdXNlcih2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgaW50IHNpemUpCit7CisJaWYgKCh1aW50MzJfdClzcmMgPCBUQVNLX1NJWkUpIHsKKwkJcmV0dXJuIGNvcHlfZnJvbV91c2VyKGRzdCwgc3JjLCBzaXplKTsKKwl9IGVsc2UgeworCQltZW1jcHkoZHN0LCBzcmMsIHNpemUpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK1ZDSElRX1NUQVRVU19UCit2Y2hpcV9wcmVwYXJlX2J1bGtfZGF0YShWQ0hJUV9CVUxLX1QgKmJ1bGssIFZDSElfTUVNX0hBTkRMRV9UIG1lbWhhbmRsZSwKKwl2b2lkICpvZmZzZXQsIGludCBzaXplLCBpbnQgZGlyKQoreworCVBBR0VMSVNUX1QgKnBhZ2VsaXN0OworCWludCByZXQ7CisKKwlXQVJOX09OKG1lbWhhbmRsZSAhPSBWQ0hJX01FTV9IQU5ETEVfSU5WQUxJRCk7CisKKwlyZXQgPSBjcmVhdGVfcGFnZWxpc3QoKGNoYXIgX191c2VyICopb2Zmc2V0LCBzaXplLAorCQkJKGRpciA9PSBWQ0hJUV9CVUxLX1JFQ0VJVkUpCisJCQk/IFBBR0VMSVNUX1JFQUQKKwkJCTogUEFHRUxJU1RfV1JJVEUsCisJCQljdXJyZW50LAorCQkJJnBhZ2VsaXN0KTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiBWQ0hJUV9FUlJPUjsKKworCWJ1bGstPmhhbmRsZSA9IG1lbWhhbmRsZTsKKwlidWxrLT5kYXRhID0gVkNISVFfQVJNX0FERFJFU1MocGFnZWxpc3QpOworCisJLyogU3RvcmUgdGhlIHBhZ2VsaXN0IGFkZHJlc3MgaW4gcmVtb3RlX2RhdGEsIHdoaWNoIGlzbid0IHVzZWQgYnkgdGhlCisJICAgc2xhdmUuICovCisJYnVsay0+cmVtb3RlX2RhdGEgPSBwYWdlbGlzdDsKKworCXJldHVybiBWQ0hJUV9TVUNDRVNTOworfQorCit2b2lkCit2Y2hpcV9jb21wbGV0ZV9idWxrKFZDSElRX0JVTEtfVCAqYnVsaykKK3sKKwlpZiAoYnVsayAmJiBidWxrLT5yZW1vdGVfZGF0YSAmJiBidWxrLT5hY3R1YWwpCisJCWZyZWVfcGFnZWxpc3QoKFBBR0VMSVNUX1QgKilidWxrLT5yZW1vdGVfZGF0YSwgYnVsay0+YWN0dWFsKTsKK30KKwordm9pZAordmNoaXFfdHJhbnNmZXJfYnVsayhWQ0hJUV9CVUxLX1QgKmJ1bGspCit7CisJLyoKKwkgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiB0aGUgbWFzdGVyIChWaWRlb0NvcmUpIHNpZGUsIGJ1dAorCSAqIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gdG8gYXZvaWQgdGhlIG5lZWQgZm9yIGlmZGVmZXJ5LgorCSAqLworCUJVRygpOworfQorCit2b2lkCit2Y2hpcV9kdW1wX3BsYXRmb3JtX3N0YXRlKHZvaWQgKmR1bXBfY29udGV4dCkKK3sKKwljaGFyIGJ1Zls4MF07CisJaW50IGxlbjsKKwlsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLAorCQkiICBQbGF0Zm9ybTogMjgzNSAoVkMgbWFzdGVyKSIpOworCXZjaGlxX2R1bXAoZHVtcF9jb250ZXh0LCBidWYsIGxlbiArIDEpOworfQorCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfcGxhdGZvcm1fc3VzcGVuZChWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKKyAgIHJldHVybiBWQ0hJUV9FUlJPUjsKK30KKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3BsYXRmb3JtX3Jlc3VtZShWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKKyAgIHJldHVybiBWQ0hJUV9TVUNDRVNTOworfQorCit2b2lkCit2Y2hpcV9wbGF0Zm9ybV9wYXVzZWQoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7Cit9CisKK3ZvaWQKK3ZjaGlxX3BsYXRmb3JtX3Jlc3VtZWQoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7Cit9CisKK2ludAordmNoaXFfcGxhdGZvcm1fdmlkZW9jb3JlX3dhbnRlZChWQ0hJUV9TVEFURV9UKiBzdGF0ZSkKK3sKKyAgIHJldHVybiAxOyAvLyBhdXRvc3VzcGVuZCBub3Qgc3VwcG9ydGVkIC0gdmlkZW9jb3JlIGFsd2F5cyB3YW50ZWQKK30KKworaW50Cit2Y2hpcV9wbGF0Zm9ybV91c2Vfc3VzcGVuZF90aW1lcih2b2lkKQoreworICAgcmV0dXJuIDA7Cit9Cit2b2lkCit2Y2hpcV9kdW1wX3BsYXRmb3JtX3VzZV9zdGF0ZShWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKKwl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9hcm1fbG9nX2xldmVsLCAiU3VzcGVuZCB0aW1lciBub3QgaW4gdXNlIik7Cit9Cit2b2lkCit2Y2hpcV9wbGF0Zm9ybV9oYW5kbGVfdGltZW91dChWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKKwkodm9pZClzdGF0ZTsKK30KKy8qCisgKiBMb2NhbCBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QKK3ZjaGlxX2Rvb3JiZWxsX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJVkNISVFfU1RBVEVfVCAqc3RhdGUgPSBkZXZfaWQ7CisJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCS8qIFJlYWQgKGFuZCBjbGVhcikgdGhlIGRvb3JiZWxsICovCisJc3RhdHVzID0gcmVhZGwoZ19yZWdzICsgQkVMTDApOworCisJaWYgKHN0YXR1cyAmIDB4NCkgeyAgLyogV2FzIHRoZSBkb29yYmVsbCBydW5nPyAqLworCQlyZW1vdGVfZXZlbnRfcG9sbGFsbChzdGF0ZSk7CisJCXJldCA9IElSUV9IQU5ETEVEOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIFRoZXJlIGlzIGEgcG90ZW50aWFsIHByb2JsZW0gd2l0aCBwYXJ0aWFsIGNhY2hlIGxpbmVzIChwYWdlcz8pCisqKiBhdCB0aGUgZW5kcyBvZiB0aGUgYmxvY2sgd2hlbiByZWFkaW5nLiBJZiB0aGUgQ1BVIGFjY2Vzc2VkIGFueXRoaW5nIGluCisqKiB0aGUgc2FtZSBsaW5lIChwYWdlPykgdGhlbiBpdCBtYXkgaGF2ZSBwdWxsZWQgb2xkIGRhdGEgaW50byB0aGUgY2FjaGUsCisqKiBvYnNjdXJpbmcgdGhlIG5ldyBkYXRhIHVuZGVybmVhdGguIFdlIGNhbiBzb2x2ZSB0aGlzIGJ5IHRyYW5zZmVycmluZyB0aGUKKyoqIHBhcnRpYWwgY2FjaGUgbGluZXMgc2VwYXJhdGVseSwgYW5kIGFsbG93aW5nIHRoZSBBUk0gdG8gY29weSBpbnRvIHRoZQorKiogY2FjaGVkIGFyZWEuCisKKyoqIE4uQi4gVGhpcyBpbXBsZW1lbnRhdGlvbiBwbGF5cyBzbGlnaHRseSBmYXN0IGFuZCBsb29zZSB3aXRoIHRoZSBMaW51eAorKiogZHJpdmVyIHByb2dyYW1taW5nIHJ1bGVzLCBlLmcuIGl0cyB1c2Ugb2YgZG1hY19tYXBfYXJlYSBpbnN0ZWFkIG9mCisqKiBkbWFfbWFwX3NpbmdsZSwgYnV0IGl0IGlzbid0IGEgbXVsdGktcGxhdGZvcm0gZHJpdmVyIGFuZCBpdCBiZW5lZml0cworKiogZnJvbSBpbmNyZWFzZWQgc3BlZWQgYXMgYSByZXN1bHQuCisqLworCitzdGF0aWMgaW50CitjcmVhdGVfcGFnZWxpc3QoY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCB1bnNpZ25lZCBzaG9ydCB0eXBlLAorCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgUEFHRUxJU1RfVCAqKiBwcGFnZWxpc3QpCit7CisJUEFHRUxJU1RfVCAqcGFnZWxpc3Q7CisJc3RydWN0IHBhZ2UgKipwYWdlczsKKwl1bnNpZ25lZCBsb25nICphZGRyczsKKwl1bnNpZ25lZCBpbnQgbnVtX3BhZ2VzLCBvZmZzZXQsIGk7CisJY2hhciAqYWRkciwgKmJhc2VfYWRkciwgKm5leHRfYWRkcjsKKwlpbnQgcnVuLCBhZGRyaWR4LCBhY3R1YWxfcGFnZXM7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgKm5lZWRfcmVsZWFzZTsKKworCW9mZnNldCA9ICh1bnNpZ25lZCBpbnQpYnVmICYgKFBBR0VfU0laRSAtIDEpOworCW51bV9wYWdlcyA9IChjb3VudCArIG9mZnNldCArIFBBR0VfU0laRSAtIDEpIC8gUEFHRV9TSVpFOworCisJKnBwYWdlbGlzdCA9IE5VTEw7CisKKwkvKiBBbGxvY2F0ZSBlbm91Z2ggc3RvcmFnZSB0byBob2xkIHRoZSBwYWdlIHBvaW50ZXJzIGFuZCB0aGUgcGFnZQorCSoqIGxpc3QKKwkqLworCXBhZ2VsaXN0ID0ga21hbGxvYyhzaXplb2YoUEFHRUxJU1RfVCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bV9wYWdlcyAqIHNpemVvZih1bnNpZ25lZCBsb25nKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChudW1fcGFnZXMgKiBzaXplb2YocGFnZXNbMF0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdGUF9LRVJORUwpOworCisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCSJjcmVhdGVfcGFnZWxpc3QgLSAleCIsICh1bnNpZ25lZCBpbnQpcGFnZWxpc3QpOworCWlmICghcGFnZWxpc3QpCisJCXJldHVybiAtRU5PTUVNOworCisJYWRkcnMgPSBwYWdlbGlzdC0+YWRkcnM7CisgICAgICAgIG5lZWRfcmVsZWFzZSA9ICh1bnNpZ25lZCBsb25nICopKGFkZHJzICsgbnVtX3BhZ2VzKTsKKwlwYWdlcyA9IChzdHJ1Y3QgcGFnZSAqKikoYWRkcnMgKyBudW1fcGFnZXMgKyAxKTsKKworCWlmIChpc192bWFsbG9jX2FkZHIoYnVmKSkgeworCQlpbnQgZGlyID0gKHR5cGUgPT0gUEFHRUxJU1RfV1JJVEUpID8KKwkJCURNQV9UT19ERVZJQ0UgOiBETUFfRlJPTV9ERVZJQ0U7CisJCXVuc2lnbmVkIGxvbmcgbGVuZ3RoID0gY291bnQ7CisJCXVuc2lnbmVkIGludCBvZmYgPSBvZmZzZXQ7CisKKwkJZm9yIChhY3R1YWxfcGFnZXMgPSAwOyBhY3R1YWxfcGFnZXMgPCBudW1fcGFnZXM7CisJCSAgICAgYWN0dWFsX3BhZ2VzKyspIHsKKwkJCXN0cnVjdCBwYWdlICpwZyA9IHZtYWxsb2NfdG9fcGFnZShidWYgKyAoYWN0dWFsX3BhZ2VzICoKKwkJCQkJCQkJIFBBR0VfU0laRSkpOworCQkJc2l6ZV90IGJ5dGVzID0gUEFHRV9TSVpFIC0gb2ZmOworCisJCQlpZiAoYnl0ZXMgPiBsZW5ndGgpCisJCQkJYnl0ZXMgPSBsZW5ndGg7CisJCQlwYWdlc1thY3R1YWxfcGFnZXNdID0gcGc7CisJCQlkbWFjX21hcF9hcmVhKHBhZ2VfYWRkcmVzcyhwZykgKyBvZmYsIGJ5dGVzLCBkaXIpOworCQkJbGVuZ3RoIC09IGJ5dGVzOworCQkJb2ZmID0gMDsKKwkJfQorCQkqbmVlZF9yZWxlYXNlID0gMDsgLyogZG8gbm90IHRyeSBhbmQgcmVsZWFzZSB2bWFsbG9jIHBhZ2VzICovCisJfSBlbHNlIHsKKwkJZG93bl9yZWFkKCZ0YXNrLT5tbS0+bW1hcF9zZW0pOworCQlhY3R1YWxfcGFnZXMgPSBnZXRfdXNlcl9wYWdlcyh0YXNrLCB0YXNrLT5tbSwKKwkJCQkgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpYnVmICYgfihQQUdFX1NJWkUgLSAxKSwKKwkJCQkJICBudW1fcGFnZXMsCisJCQkJCSAgKHR5cGUgPT0gUEFHRUxJU1RfUkVBRCkgLypXcml0ZSAqLyAsCisJCQkJCSAgMCAvKkZvcmNlICovICwKKwkJCQkJICBwYWdlcywKKwkJCQkJICBOVUxMIC8qdm1hcyAqLyk7CisJCXVwX3JlYWQoJnRhc2stPm1tLT5tbWFwX3NlbSk7CisKKwkJaWYgKGFjdHVhbF9wYWdlcyAhPSBudW1fcGFnZXMpIHsKKwkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkJICAgICAgICJjcmVhdGVfcGFnZWxpc3QgLSBvbmx5ICVkLyVkIHBhZ2VzIGxvY2tlZCIsCisJCQkJICAgICAgIGFjdHVhbF9wYWdlcywKKwkJCQkgICAgICAgbnVtX3BhZ2VzKTsKKworCQkJLyogVGhpcyBpcyBwcm9iYWJseSBkdWUgdG8gdGhlIHByb2Nlc3MgYmVpbmcga2lsbGVkICovCisJCQl3aGlsZSAoYWN0dWFsX3BhZ2VzID4gMCkKKwkJCXsKKwkJCQlhY3R1YWxfcGFnZXMtLTsKKwkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZXNbYWN0dWFsX3BhZ2VzXSk7CisJCQl9CisJCQlrZnJlZShwYWdlbGlzdCk7CisJCQlpZiAoYWN0dWFsX3BhZ2VzID09IDApCisJCQkJYWN0dWFsX3BhZ2VzID0gLUVOT01FTTsKKwkJCXJldHVybiBhY3R1YWxfcGFnZXM7CisJCX0KKwkJKm5lZWRfcmVsZWFzZSA9IDE7IC8qIHJlbGVhc2UgdXNlciBwYWdlcyAqLworCX0KKworCXBhZ2VsaXN0LT5sZW5ndGggPSBjb3VudDsKKwlwYWdlbGlzdC0+dHlwZSA9IHR5cGU7CisJcGFnZWxpc3QtPm9mZnNldCA9IG9mZnNldDsKKworCS8qIEdyb3VwIHRoZSBwYWdlcyBpbnRvIHJ1bnMgb2YgY29udGlndW91cyBwYWdlcyAqLworCisJYmFzZV9hZGRyID0gVkNISVFfQVJNX0FERFJFU1MocGFnZV9hZGRyZXNzKHBhZ2VzWzBdKSk7CisJbmV4dF9hZGRyID0gYmFzZV9hZGRyICsgUEFHRV9TSVpFOworCWFkZHJpZHggPSAwOworCXJ1biA9IDA7CisKKwlmb3IgKGkgPSAxOyBpIDwgbnVtX3BhZ2VzOyBpKyspIHsKKwkJYWRkciA9IFZDSElRX0FSTV9BRERSRVNTKHBhZ2VfYWRkcmVzcyhwYWdlc1tpXSkpOworCQlpZiAoKGFkZHIgPT0gbmV4dF9hZGRyKSAmJiAocnVuIDwgKFBBR0VfU0laRSAtIDEpKSkgeworCQkJbmV4dF9hZGRyICs9IFBBR0VfU0laRTsKKwkJCXJ1bisrOworCQl9IGVsc2UgeworCQkJYWRkcnNbYWRkcmlkeF0gPSAodW5zaWduZWQgbG9uZyliYXNlX2FkZHIgKyBydW47CisJCQlhZGRyaWR4Kys7CisJCQliYXNlX2FkZHIgPSBhZGRyOworCQkJbmV4dF9hZGRyID0gYWRkciArIFBBR0VfU0laRTsKKwkJCXJ1biA9IDA7CisJCX0KKwl9CisKKwlhZGRyc1thZGRyaWR4XSA9ICh1bnNpZ25lZCBsb25nKWJhc2VfYWRkciArIHJ1bjsKKwlhZGRyaWR4Kys7CisKKwkvKiBQYXJ0aWFsIGNhY2hlIGxpbmVzIChmcmFnbWVudHMpIHJlcXVpcmUgc3BlY2lhbCBtZWFzdXJlcyAqLworCWlmICgodHlwZSA9PSBQQUdFTElTVF9SRUFEKSAmJgorCQkoKHBhZ2VsaXN0LT5vZmZzZXQgJiAoZ19jYWNoZV9saW5lX3NpemUgLSAxKSkgfHwKKwkJKChwYWdlbGlzdC0+b2Zmc2V0ICsgcGFnZWxpc3QtPmxlbmd0aCkgJgorCQkoZ19jYWNoZV9saW5lX3NpemUgLSAxKSkpKSB7CisJCWNoYXIgKmZyYWdtZW50czsKKworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZnX2ZyZWVfZnJhZ21lbnRzX3NlbWEpICE9IDApIHsKKwkJCWtmcmVlKHBhZ2VsaXN0KTsKKwkJCXJldHVybiAtRUlOVFI7CisJCX0KKworCQlXQVJOX09OKGdfZnJlZV9mcmFnbWVudHMgPT0gTlVMTCk7CisKKwkJZG93bigmZ19mcmVlX2ZyYWdtZW50c19tdXRleCk7CisJCWZyYWdtZW50cyA9IGdfZnJlZV9mcmFnbWVudHM7CisJCVdBUk5fT04oZnJhZ21lbnRzID09IE5VTEwpOworCQlnX2ZyZWVfZnJhZ21lbnRzID0gKihjaGFyICoqKSBnX2ZyZWVfZnJhZ21lbnRzOworCQl1cCgmZ19mcmVlX2ZyYWdtZW50c19tdXRleCk7CisJCXBhZ2VsaXN0LT50eXBlID0gUEFHRUxJU1RfUkVBRF9XSVRIX0ZSQUdNRU5UUyArCisJCQkoZnJhZ21lbnRzIC0gZ19mcmFnbWVudHNfYmFzZSkgLyBnX2ZyYWdtZW50c19zaXplOworCX0KKworCWRtYWNfZmx1c2hfcmFuZ2UocGFnZWxpc3QsIGFkZHJzICsgbnVtX3BhZ2VzKTsKKworCSpwcGFnZWxpc3QgPSBwYWdlbGlzdDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorZnJlZV9wYWdlbGlzdChQQUdFTElTVF9UICpwYWdlbGlzdCwgaW50IGFjdHVhbCkKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyAqbmVlZF9yZWxlYXNlOworCXN0cnVjdCBwYWdlICoqcGFnZXM7CisJdW5zaWduZWQgaW50IG51bV9wYWdlcywgaTsKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkiZnJlZV9wYWdlbGlzdCAtICV4LCAlZCIsICh1bnNpZ25lZCBpbnQpcGFnZWxpc3QsIGFjdHVhbCk7CisKKwludW1fcGFnZXMgPQorCQkocGFnZWxpc3QtPmxlbmd0aCArIHBhZ2VsaXN0LT5vZmZzZXQgKyBQQUdFX1NJWkUgLSAxKSAvCisJCVBBR0VfU0laRTsKKworICAgICAgICBuZWVkX3JlbGVhc2UgPSAodW5zaWduZWQgbG9uZyAqKShwYWdlbGlzdC0+YWRkcnMgKyBudW1fcGFnZXMpOworCXBhZ2VzID0gKHN0cnVjdCBwYWdlICoqKShwYWdlbGlzdC0+YWRkcnMgKyBudW1fcGFnZXMgKyAxKTsKKworCS8qIERlYWwgd2l0aCBhbnkgcGFydGlhbCBjYWNoZSBsaW5lcyAoZnJhZ21lbnRzKSAqLworCWlmIChwYWdlbGlzdC0+dHlwZSA+PSBQQUdFTElTVF9SRUFEX1dJVEhfRlJBR01FTlRTKSB7CisJCWNoYXIgKmZyYWdtZW50cyA9IGdfZnJhZ21lbnRzX2Jhc2UgKworCQkJKHBhZ2VsaXN0LT50eXBlIC0gUEFHRUxJU1RfUkVBRF9XSVRIX0ZSQUdNRU5UUykgKgorCQkJZ19mcmFnbWVudHNfc2l6ZTsKKwkJaW50IGhlYWRfYnl0ZXMsIHRhaWxfYnl0ZXM7CisJCWhlYWRfYnl0ZXMgPSAoZ19jYWNoZV9saW5lX3NpemUgLSBwYWdlbGlzdC0+b2Zmc2V0KSAmCisJCQkoZ19jYWNoZV9saW5lX3NpemUgLSAxKTsKKwkJdGFpbF9ieXRlcyA9IChwYWdlbGlzdC0+b2Zmc2V0ICsgYWN0dWFsKSAmCisJCQkoZ19jYWNoZV9saW5lX3NpemUgLSAxKTsKKworCQlpZiAoKGFjdHVhbCA+PSAwKSAmJiAoaGVhZF9ieXRlcyAhPSAwKSkgeworCQkJaWYgKGhlYWRfYnl0ZXMgPiBhY3R1YWwpCisJCQkJaGVhZF9ieXRlcyA9IGFjdHVhbDsKKworCQkJbWVtY3B5KChjaGFyICopcGFnZV9hZGRyZXNzKHBhZ2VzWzBdKSArCisJCQkJcGFnZWxpc3QtPm9mZnNldCwKKwkJCQlmcmFnbWVudHMsCisJCQkJaGVhZF9ieXRlcyk7CisJCX0KKwkJaWYgKChhY3R1YWwgPj0gMCkgJiYgKGhlYWRfYnl0ZXMgPCBhY3R1YWwpICYmCisJCQkodGFpbF9ieXRlcyAhPSAwKSkgeworCQkJbWVtY3B5KChjaGFyICopcGFnZV9hZGRyZXNzKHBhZ2VzW251bV9wYWdlcyAtIDFdKSArCisJCQkJKChwYWdlbGlzdC0+b2Zmc2V0ICsgYWN0dWFsKSAmCisJCQkJKFBBR0VfU0laRSAtIDEpICYgfihnX2NhY2hlX2xpbmVfc2l6ZSAtIDEpKSwKKwkJCQlmcmFnbWVudHMgKyBnX2NhY2hlX2xpbmVfc2l6ZSwKKwkJCQl0YWlsX2J5dGVzKTsKKwkJfQorCisJCWRvd24oJmdfZnJlZV9mcmFnbWVudHNfbXV0ZXgpOworCQkqKGNoYXIgKiopZnJhZ21lbnRzID0gZ19mcmVlX2ZyYWdtZW50czsKKwkJZ19mcmVlX2ZyYWdtZW50cyA9IGZyYWdtZW50czsKKwkJdXAoJmdfZnJlZV9mcmFnbWVudHNfbXV0ZXgpOworCQl1cCgmZ19mcmVlX2ZyYWdtZW50c19zZW1hKTsKKwl9CisKKwlpZiAoKm5lZWRfcmVsZWFzZSkgeworCQl1bnNpZ25lZCBpbnQgbGVuZ3RoID0gcGFnZWxpc3QtPmxlbmd0aDsKKwkJdW5zaWduZWQgaW50IG9mZnNldCA9IHBhZ2VsaXN0LT5vZmZzZXQ7CisKKwkJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgaSsrKSB7CisJCQlzdHJ1Y3QgcGFnZSAqcGcgPSBwYWdlc1tpXTsKKworCQkJaWYgKHBhZ2VsaXN0LT50eXBlICE9IFBBR0VMSVNUX1dSSVRFKSB7CisJCQkJdW5zaWduZWQgaW50IGJ5dGVzID0gUEFHRV9TSVpFIC0gb2Zmc2V0OworCisJCQkJaWYgKGJ5dGVzID4gbGVuZ3RoKQorCQkJCQlieXRlcyA9IGxlbmd0aDsKKwkJCQlkbWFjX3VubWFwX2FyZWEocGFnZV9hZGRyZXNzKHBnKSArIG9mZnNldCwKKwkJCQkJCWJ5dGVzLCBETUFfRlJPTV9ERVZJQ0UpOworCQkJCWxlbmd0aCAtPSBieXRlczsKKwkJCQlvZmZzZXQgPSAwOworCQkJCXNldF9wYWdlX2RpcnR5KHBnKTsKKwkJCX0KKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwZyk7CisJCX0KKwl9CisKKwlrZnJlZShwYWdlbGlzdCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2FybS5jIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9hcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTFjMGUwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9hcm0uYwpAQCAtMCwwICsxLDI5MDMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0IFJhc3BiZXJyeSBQaSAoVHJhZGluZykgTHRkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPHNvYy9iY20yODM1L3Jhc3BiZXJyeXBpLWZpcm13YXJlLmg+CisKKyNpbmNsdWRlICJ2Y2hpcV9jb3JlLmgiCisjaW5jbHVkZSAidmNoaXFfaW9jdGwuaCIKKyNpbmNsdWRlICJ2Y2hpcV9hcm0uaCIKKyNpbmNsdWRlICJ2Y2hpcV9kZWJ1Z2ZzLmgiCisjaW5jbHVkZSAidmNoaXFfa2lsbGFibGUuaCIKKworI2RlZmluZSBERVZJQ0VfTkFNRSAidmNoaXEiCisKKy8qIE92ZXJyaWRlIHRoZSBkZWZhdWx0IHByZWZpeCwgd2hpY2ggd291bGQgYmUgdmNoaXFfYXJtIChmcm9tIHRoZSBmaWxlbmFtZSkgKi8KKyN1bmRlZiBNT0RVTEVfUEFSQU1fUFJFRklYCisjZGVmaW5lIE1PRFVMRV9QQVJBTV9QUkVGSVggREVWSUNFX05BTUUgIi4iCisKKyNkZWZpbmUgVkNISVFfTUlOT1IgMAorCisvKiBTb21lIHBlci1pbnN0YW5jZSBjb25zdGFudHMgKi8KKyNkZWZpbmUgTUFYX0NPTVBMRVRJT05TIDE2CisjZGVmaW5lIE1BWF9TRVJWSUNFUyA2NAorI2RlZmluZSBNQVhfRUxFTUVOVFMgOAorI2RlZmluZSBNU0dfUVVFVUVfU0laRSA2NAorCisjZGVmaW5lIEtFRVBBTElWRV9WRVIgMQorI2RlZmluZSBLRUVQQUxJVkVfVkVSX01JTiBLRUVQQUxJVkVfVkVSCisKKy8qIFJ1biB0aW1lIGNvbnRyb2wgb2YgbG9nIGxldmVsLCBiYXNlZCBvbiBLRVJOX1hYWCBsZXZlbC4gKi8KK2ludCB2Y2hpcV9hcm1fbG9nX2xldmVsID0gVkNISVFfTE9HX0RFRkFVTFQ7CitpbnQgdmNoaXFfc3VzcF9sb2dfbGV2ZWwgPSBWQ0hJUV9MT0dfRVJST1I7CisKKyNkZWZpbmUgU1VTUEVORF9USU1FUl9USU1FT1VUX01TIDEwMAorI2RlZmluZSBTVVNQRU5EX1JFVFJZX1RJTUVSX1RJTUVPVVRfTVMgMTAwMAorCisjZGVmaW5lIFZDX1NVU1BFTkRfTlVNX09GRlNFVCAzIC8qIG51bWJlciBvZiB2YWx1ZXMgYmVmb3JlIGlkbGUgd2hpY2ggYXJlIC12ZSAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHN1c3BlbmRfc3RhdGVfbmFtZXNbXSA9IHsKKwkiVkNfU1VTUEVORF9GT1JDRV9DQU5DRUxFRCIsCisJIlZDX1NVU1BFTkRfUkVKRUNURUQiLAorCSJWQ19TVVNQRU5EX0ZBSUxFRCIsCisJIlZDX1NVU1BFTkRfSURMRSIsCisJIlZDX1NVU1BFTkRfUkVRVUVTVEVEIiwKKwkiVkNfU1VTUEVORF9JTl9QUk9HUkVTUyIsCisJIlZDX1NVU1BFTkRfU1VTUEVOREVEIgorfTsKKyNkZWZpbmUgVkNfUkVTVU1FX05VTV9PRkZTRVQgMSAvKiBudW1iZXIgb2YgdmFsdWVzIGJlZm9yZSBpZGxlIHdoaWNoIGFyZSAtdmUgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCByZXN1bWVfc3RhdGVfbmFtZXNbXSA9IHsKKwkiVkNfUkVTVU1FX0ZBSUxFRCIsCisJIlZDX1JFU1VNRV9JRExFIiwKKwkiVkNfUkVTVU1FX1JFUVVFU1RFRCIsCisJIlZDX1JFU1VNRV9JTl9QUk9HUkVTUyIsCisJIlZDX1JFU1VNRV9SRVNVTUVEIgorfTsKKy8qIFRoZSBudW1iZXIgb2YgdGltZXMgd2UgYWxsb3cgZm9yY2Ugc3VzcGVuZCB0byB0aW1lb3V0IGJlZm9yZSBhY3R1YWxseQorKiogX2ZvcmNpbmdfIHN1c3BlbmQuICBUaGlzIGlzIHRvIGNhdGVyIGZvciBTVyB3aGljaCBmYWlscyB0byByZWxlYXNlIHZjaGlxCisqKiBjb3JyZWN0bHkgLSB3ZSBkb24ndCB3YW50IHRvIHByZXZlbnQgQVJNIHN1c3BlbmQgaW5kZWZpbml0ZWx5IGluIHRoaXMgY2FzZS4KKyovCisjZGVmaW5lIEZPUkNFX1NVU1BFTkRfRkFJTF9NQVggOAorCisvKiBUaGUgdGltZSBpbiBtcyBhbGxvd2VkIGZvciB2aWRlb2NvcmUgdG8gZ28gaWRsZSB3aGVuIGZvcmNlIHN1c3BlbmQgaGFzIGJlZW4KKyAqIHJlcXVlc3RlZCAqLworI2RlZmluZSBGT1JDRV9TVVNQRU5EX1RJTUVPVVRfTVMgMjAwCisKKworc3RhdGljIHZvaWQgc3VzcGVuZF90aW1lcl9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGNvbnRleHQpOworCisKK3R5cGVkZWYgc3RydWN0IHVzZXJfc2VydmljZV9zdHJ1Y3QgeworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZTsKKwl2b2lkICp1c2VyZGF0YTsKKwlWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlOworCWNoYXIgaXNfdmNoaTsKKwljaGFyIGRlcXVldWVfcGVuZGluZzsKKwljaGFyIGNsb3NlX3BlbmRpbmc7CisJaW50IG1lc3NhZ2VfYXZhaWxhYmxlX3BvczsKKwlpbnQgbXNnX2luc2VydDsKKwlpbnQgbXNnX3JlbW92ZTsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGluc2VydF9ldmVudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHJlbW92ZV9ldmVudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGNsb3NlX2V2ZW50OworCVZDSElRX0hFQURFUl9UICogbXNnX3F1ZXVlW01TR19RVUVVRV9TSVpFXTsKK30gVVNFUl9TRVJWSUNFX1Q7CisKK3N0cnVjdCBidWxrX3dhaXRlcl9ub2RlIHsKKwlzdHJ1Y3QgYnVsa193YWl0ZXIgYnVsa193YWl0ZXI7CisJaW50IHBpZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitzdHJ1Y3QgdmNoaXFfaW5zdGFuY2Vfc3RydWN0IHsKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZTsKKwlWQ0hJUV9DT01QTEVUSU9OX0RBVEFfVCBjb21wbGV0aW9uc1tNQVhfQ09NUExFVElPTlNdOworCWludCBjb21wbGV0aW9uX2luc2VydDsKKwlpbnQgY29tcGxldGlvbl9yZW1vdmU7CisJc3RydWN0IHNlbWFwaG9yZSBpbnNlcnRfZXZlbnQ7CisJc3RydWN0IHNlbWFwaG9yZSByZW1vdmVfZXZlbnQ7CisJc3RydWN0IG11dGV4IGNvbXBsZXRpb25fbXV0ZXg7CisKKwlpbnQgY29ubmVjdGVkOworCWludCBjbG9zaW5nOworCWludCBwaWQ7CisJaW50IG1hcms7CisJaW50IHVzZV9jbG9zZV9kZWxpdmVyZWQ7CisJaW50IHRyYWNlOworCisJc3RydWN0IGxpc3RfaGVhZCBidWxrX3dhaXRlcl9saXN0OworCXN0cnVjdCBtdXRleCBidWxrX3dhaXRlcl9saXN0X211dGV4OworCisJVkNISVFfREVCVUdGU19OT0RFX1QgZGVidWdmc19ub2RlOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgZHVtcF9jb250ZXh0X3N0cnVjdCB7CisJY2hhciBfX3VzZXIgKmJ1ZjsKKwlzaXplX3QgYWN0dWFsOworCXNpemVfdCBzcGFjZTsKKwlsb2ZmX3Qgb2Zmc2V0OworfSBEVU1QX0NPTlRFWFRfVDsKKworc3RhdGljIHN0cnVjdCBjZGV2ICAgIHZjaGlxX2NkZXY7CitzdGF0aWMgZGV2X3QgICAgICAgICAgdmNoaXFfZGV2aWQ7CitzdGF0aWMgVkNISVFfU1RBVEVfVCBnX3N0YXRlOworc3RhdGljIHN0cnVjdCBjbGFzcyAgKnZjaGlxX2NsYXNzOworc3RhdGljIHN0cnVjdCBkZXZpY2UgKnZjaGlxX2RldjsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobXNnX3F1ZXVlX3NwaW5sb2NrKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGlvY3RsX25hbWVzW10gPSB7CisJIkNPTk5FQ1QiLAorCSJTSFVURE9XTiIsCisJIkNSRUFURV9TRVJWSUNFIiwKKwkiUkVNT1ZFX1NFUlZJQ0UiLAorCSJRVUVVRV9NRVNTQUdFIiwKKwkiUVVFVUVfQlVMS19UUkFOU01JVCIsCisJIlFVRVVFX0JVTEtfUkVDRUlWRSIsCisJIkFXQUlUX0NPTVBMRVRJT04iLAorCSJERVFVRVVFX01FU1NBR0UiLAorCSJHRVRfQ0xJRU5UX0lEIiwKKwkiR0VUX0NPTkZJRyIsCisJIkNMT1NFX1NFUlZJQ0UiLAorCSJVU0VfU0VSVklDRSIsCisJIlJFTEVBU0VfU0VSVklDRSIsCisJIlNFVF9TRVJWSUNFX09QVElPTiIsCisJIkRVTVBfUEhZU19NRU0iLAorCSJMSUJfVkVSU0lPTiIsCisJIkNMT1NFX0RFTElWRVJFRCIKK307CisKK3ZjaGlxX3N0YXRpY19hc3NlcnQoKHNpemVvZihpb2N0bF9uYW1lcykvc2l6ZW9mKGlvY3RsX25hbWVzWzBdKSkgPT0KKwkoVkNISVFfSU9DX01BWCArIDEpKTsKKworc3RhdGljIHZvaWQKK2R1bXBfcGh5c19tZW0odm9pZCAqdmlydF9hZGRyLCB1aW50MzJfdCBudW1fYnl0ZXMpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIGFkZF9jb21wbGV0aW9uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBWQ0hJUV9TVEFUVVNfVAorYWRkX2NvbXBsZXRpb24oVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSwgVkNISVFfUkVBU09OX1QgcmVhc29uLAorCVZDSElRX0hFQURFUl9UICpoZWFkZXIsIFVTRVJfU0VSVklDRV9UICp1c2VyX3NlcnZpY2UsCisJdm9pZCAqYnVsa191c2VyZGF0YSkKK3sKKwlWQ0hJUV9DT01QTEVUSU9OX0RBVEFfVCAqY29tcGxldGlvbjsKKwlERUJVR19JTklUSUFMSVNFKGdfc3RhdGUubG9jYWwpCisKKwl3aGlsZSAoaW5zdGFuY2UtPmNvbXBsZXRpb25faW5zZXJ0ID09CisJCShpbnN0YW5jZS0+Y29tcGxldGlvbl9yZW1vdmUgKyBNQVhfQ09NUExFVElPTlMpKSB7CisJCS8qIE91dCBvZiBzcGFjZSAtIHdhaXQgZm9yIHRoZSBjbGllbnQgKi8KKwkJREVCVUdfVFJBQ0UoU0VSVklDRV9DQUxMQkFDS19MSU5FKTsKKwkJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkiYWRkX2NvbXBsZXRpb24gLSBjb21wbGV0aW9uIHF1ZXVlIGZ1bGwiKTsKKwkJREVCVUdfQ09VTlQoQ09NUExFVElPTl9RVUVVRV9GVUxMX0NPVU5UKTsKKwkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmaW5zdGFuY2UtPnJlbW92ZV9ldmVudCkgIT0gMCkgeworCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCQkic2VydmljZV9jYWxsYmFjayBpbnRlcnJ1cHRlZCIpOworCQkJcmV0dXJuIFZDSElRX1JFVFJZOworCQl9IGVsc2UgaWYgKGluc3RhbmNlLT5jbG9zaW5nKSB7CisJCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkJCSJzZXJ2aWNlX2NhbGxiYWNrIGNsb3NpbmciKTsKKwkJCXJldHVybiBWQ0hJUV9FUlJPUjsKKwkJfQorCQlERUJVR19UUkFDRShTRVJWSUNFX0NBTExCQUNLX0xJTkUpOworCX0KKworCWNvbXBsZXRpb24gPQorCQkgJmluc3RhbmNlLT5jb21wbGV0aW9uc1tpbnN0YW5jZS0+Y29tcGxldGlvbl9pbnNlcnQgJgorCQkgKE1BWF9DT01QTEVUSU9OUyAtIDEpXTsKKworCWNvbXBsZXRpb24tPmhlYWRlciA9IGhlYWRlcjsKKwljb21wbGV0aW9uLT5yZWFzb24gPSByZWFzb247CisJLyogTi5CLiBzZXJ2aWNlX3VzZXJkYXRhIGlzIHVwZGF0ZWQgd2hpbGUgcHJvY2Vzc2luZyBBV0FJVF9DT01QTEVUSU9OICovCisJY29tcGxldGlvbi0+c2VydmljZV91c2VyZGF0YSA9IHVzZXJfc2VydmljZS0+c2VydmljZTsKKwljb21wbGV0aW9uLT5idWxrX3VzZXJkYXRhID0gYnVsa191c2VyZGF0YTsKKworCWlmIChyZWFzb24gPT0gVkNISVFfU0VSVklDRV9DTE9TRUQpIHsKKwkJLyogVGFrZSBhbiBleHRyYSByZWZlcmVuY2UsIHRvIGJlIGhlbGQgdW50aWwKKwkJICAgdGhpcyBDTE9TRUQgbm90aWZpY2F0aW9uIGlzIGRlbGl2ZXJlZC4gKi8KKwkJbG9ja19zZXJ2aWNlKHVzZXJfc2VydmljZS0+c2VydmljZSk7CisJCWlmIChpbnN0YW5jZS0+dXNlX2Nsb3NlX2RlbGl2ZXJlZCkKKwkJCXVzZXJfc2VydmljZS0+Y2xvc2VfcGVuZGluZyA9IDE7CisJfQorCisJLyogQSB3cml0ZSBiYXJyaWVyIGlzIG5lZWRlZCBoZXJlIHRvIGVuc3VyZSB0aGF0IHRoZSBlbnRpcmUgY29tcGxldGlvbgorCQlyZWNvcmQgaXMgd3JpdHRlbiBvdXQgYmVmb3JlIHRoZSBpbnNlcnQgcG9pbnQuICovCisJd21iKCk7CisKKwlpZiAocmVhc29uID09IFZDSElRX01FU1NBR0VfQVZBSUxBQkxFKQorCQl1c2VyX3NlcnZpY2UtPm1lc3NhZ2VfYXZhaWxhYmxlX3BvcyA9CisJCQlpbnN0YW5jZS0+Y29tcGxldGlvbl9pbnNlcnQ7CisJaW5zdGFuY2UtPmNvbXBsZXRpb25faW5zZXJ0Kys7CisKKwl1cCgmaW5zdGFuY2UtPmluc2VydF9ldmVudCk7CisKKwlyZXR1cm4gVkNISVFfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICBzZXJ2aWNlX2NhbGxiYWNrCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBWQ0hJUV9TVEFUVVNfVAorc2VydmljZV9jYWxsYmFjayhWQ0hJUV9SRUFTT05fVCByZWFzb24sIFZDSElRX0hFQURFUl9UICpoZWFkZXIsCisJVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsIHZvaWQgKmJ1bGtfdXNlcmRhdGEpCit7CisJLyogSG93IGRvIHdlIGVuc3VyZSB0aGUgY2FsbGJhY2sgZ29lcyB0byB0aGUgcmlnaHQgY2xpZW50PworCSoqIFRoZSBzZXJ2aWNlX3VzZXIgZGF0YSBwb2ludHMgdG8gYSBVU0VSX1NFUlZJQ0VfVCByZWNvcmQgY29udGFpbmluZworCSoqIHRoZSBvcmlnaW5hbCBjYWxsYmFjayBhbmQgdGhlIHVzZXIgc3RhdGUgc3RydWN0dXJlLCB3aGljaCBjb250YWlucyBhCisJKiogY2lyY3VsYXIgYnVmZmVyIGZvciBjb21wbGV0aW9uIHJlY29yZHMuCisJKi8KKwlVU0VSX1NFUlZJQ0VfVCAqdXNlcl9zZXJ2aWNlOworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZTsKKwlWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlOworCURFQlVHX0lOSVRJQUxJU0UoZ19zdGF0ZS5sb2NhbCkKKworCURFQlVHX1RSQUNFKFNFUlZJQ0VfQ0FMTEJBQ0tfTElORSk7CisKKwlzZXJ2aWNlID0gaGFuZGxlX3RvX3NlcnZpY2UoaGFuZGxlKTsKKwlCVUdfT04oIXNlcnZpY2UpOworCXVzZXJfc2VydmljZSA9IChVU0VSX1NFUlZJQ0VfVCAqKXNlcnZpY2UtPmJhc2UudXNlcmRhdGE7CisJaW5zdGFuY2UgPSB1c2VyX3NlcnZpY2UtPmluc3RhbmNlOworCisJaWYgKCFpbnN0YW5jZSB8fCBpbnN0YW5jZS0+Y2xvc2luZykKKwkJcmV0dXJuIFZDSElRX1NVQ0NFU1M7CisKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJInNlcnZpY2VfY2FsbGJhY2sgLSBzZXJ2aWNlICVseCglZCwlcCksIHJlYXNvbiAlZCwgaGVhZGVyICVseCwgIgorCQkiaW5zdGFuY2UgJWx4LCBidWxrX3VzZXJkYXRhICVseCIsCisJCSh1bnNpZ25lZCBsb25nKXVzZXJfc2VydmljZSwKKwkJc2VydmljZS0+bG9jYWxwb3J0LCB1c2VyX3NlcnZpY2UtPnVzZXJkYXRhLAorCQlyZWFzb24sICh1bnNpZ25lZCBsb25nKWhlYWRlciwKKwkJKHVuc2lnbmVkIGxvbmcpaW5zdGFuY2UsICh1bnNpZ25lZCBsb25nKWJ1bGtfdXNlcmRhdGEpOworCisJaWYgKGhlYWRlciAmJiB1c2VyX3NlcnZpY2UtPmlzX3ZjaGkpIHsKKwkJc3Bpbl9sb2NrKCZtc2dfcXVldWVfc3BpbmxvY2spOworCQl3aGlsZSAodXNlcl9zZXJ2aWNlLT5tc2dfaW5zZXJ0ID09CisJCQkodXNlcl9zZXJ2aWNlLT5tc2dfcmVtb3ZlICsgTVNHX1FVRVVFX1NJWkUpKSB7CisJCQlzcGluX3VubG9jaygmbXNnX3F1ZXVlX3NwaW5sb2NrKTsKKwkJCURFQlVHX1RSQUNFKFNFUlZJQ0VfQ0FMTEJBQ0tfTElORSk7CisJCQlERUJVR19DT1VOVChNU0dfUVVFVUVfRlVMTF9DT1VOVCk7CisJCQl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCQkic2VydmljZV9jYWxsYmFjayAtIG1zZyBxdWV1ZSBmdWxsIik7CisJCQkvKiBJZiB0aGVyZSBpcyBubyBNRVNTQUdFX0FWQUlMQUJMRSBpbiB0aGUgY29tcGxldGlvbgorCQkJKiogcXVldWUsIGFkZCBvbmUKKwkJCSovCisJCQlpZiAoKHVzZXJfc2VydmljZS0+bWVzc2FnZV9hdmFpbGFibGVfcG9zIC0KKwkJCQlpbnN0YW5jZS0+Y29tcGxldGlvbl9yZW1vdmUpIDwgMCkgeworCQkJCVZDSElRX1NUQVRVU19UIHN0YXR1czsKKwkJCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkJCQkiSW5zZXJ0aW5nIGV4dHJhIE1FU1NBR0VfQVZBSUxBQkxFIik7CisJCQkJREVCVUdfVFJBQ0UoU0VSVklDRV9DQUxMQkFDS19MSU5FKTsKKwkJCQlzdGF0dXMgPSBhZGRfY29tcGxldGlvbihpbnN0YW5jZSwgcmVhc29uLAorCQkJCQlOVUxMLCB1c2VyX3NlcnZpY2UsIGJ1bGtfdXNlcmRhdGEpOworCQkJCWlmIChzdGF0dXMgIT0gVkNISVFfU1VDQ0VTUykgeworCQkJCQlERUJVR19UUkFDRShTRVJWSUNFX0NBTExCQUNLX0xJTkUpOworCQkJCQlyZXR1cm4gc3RhdHVzOworCQkJCX0KKwkJCX0KKworCQkJREVCVUdfVFJBQ0UoU0VSVklDRV9DQUxMQkFDS19MSU5FKTsKKwkJCWlmIChkb3duX2ludGVycnVwdGlibGUoJnVzZXJfc2VydmljZS0+cmVtb3ZlX2V2ZW50KQorCQkJCSE9IDApIHsKKwkJCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkJCQkic2VydmljZV9jYWxsYmFjayBpbnRlcnJ1cHRlZCIpOworCQkJCURFQlVHX1RSQUNFKFNFUlZJQ0VfQ0FMTEJBQ0tfTElORSk7CisJCQkJcmV0dXJuIFZDSElRX1JFVFJZOworCQkJfSBlbHNlIGlmIChpbnN0YW5jZS0+Y2xvc2luZykgeworCQkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkJCSJzZXJ2aWNlX2NhbGxiYWNrIGNsb3NpbmciKTsKKwkJCQlERUJVR19UUkFDRShTRVJWSUNFX0NBTExCQUNLX0xJTkUpOworCQkJCXJldHVybiBWQ0hJUV9FUlJPUjsKKwkJCX0KKwkJCURFQlVHX1RSQUNFKFNFUlZJQ0VfQ0FMTEJBQ0tfTElORSk7CisJCQlzcGluX2xvY2soJm1zZ19xdWV1ZV9zcGlubG9jayk7CisJCX0KKworCQl1c2VyX3NlcnZpY2UtPm1zZ19xdWV1ZVt1c2VyX3NlcnZpY2UtPm1zZ19pbnNlcnQgJgorCQkJKE1TR19RVUVVRV9TSVpFIC0gMSldID0gaGVhZGVyOworCQl1c2VyX3NlcnZpY2UtPm1zZ19pbnNlcnQrKzsKKwkJc3Bpbl91bmxvY2soJm1zZ19xdWV1ZV9zcGlubG9jayk7CisKKwkJdXAoJnVzZXJfc2VydmljZS0+aW5zZXJ0X2V2ZW50KTsKKworCQkvKiBJZiB0aGVyZSBpcyBhIHRocmVhZCB3YWl0aW5nIGluIERFUVVFVUVfTUVTU0FHRSwgb3IgaWYKKwkJKiogdGhlcmUgaXMgYSBNRVNTQUdFX0FWQUlMQUJMRSBpbiB0aGUgY29tcGxldGlvbiBxdWV1ZSB0aGVuCisJCSoqIGJ5cGFzcyB0aGUgY29tcGxldGlvbiBxdWV1ZS4KKwkJKi8KKwkJaWYgKCgodXNlcl9zZXJ2aWNlLT5tZXNzYWdlX2F2YWlsYWJsZV9wb3MgLQorCQkJaW5zdGFuY2UtPmNvbXBsZXRpb25fcmVtb3ZlKSA+PSAwKSB8fAorCQkJdXNlcl9zZXJ2aWNlLT5kZXF1ZXVlX3BlbmRpbmcpIHsKKwkJCURFQlVHX1RSQUNFKFNFUlZJQ0VfQ0FMTEJBQ0tfTElORSk7CisJCQl1c2VyX3NlcnZpY2UtPmRlcXVldWVfcGVuZGluZyA9IDA7CisJCQlyZXR1cm4gVkNISVFfU1VDQ0VTUzsKKwkJfQorCisJCWhlYWRlciA9IE5VTEw7CisJfQorCURFQlVHX1RSQUNFKFNFUlZJQ0VfQ0FMTEJBQ0tfTElORSk7CisKKwlyZXR1cm4gYWRkX2NvbXBsZXRpb24oaW5zdGFuY2UsIHJlYXNvbiwgaGVhZGVyLCB1c2VyX3NlcnZpY2UsCisJCWJ1bGtfdXNlcmRhdGEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIHVzZXJfc2VydmljZV9mcmVlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAordXNlcl9zZXJ2aWNlX2ZyZWUodm9pZCAqdXNlcmRhdGEpCit7CisJa2ZyZWUodXNlcmRhdGEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIGNsb3NlX2RlbGl2ZXJlZAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgY2xvc2VfZGVsaXZlcmVkKFVTRVJfU0VSVklDRV9UICp1c2VyX3NlcnZpY2UpCit7CisJdmNoaXFfbG9nX2luZm8odmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJImNsb3NlX2RlbGl2ZXJlZChoYW5kbGU9JXgpIiwKKwkJdXNlcl9zZXJ2aWNlLT5zZXJ2aWNlLT5oYW5kbGUpOworCisJaWYgKHVzZXJfc2VydmljZS0+Y2xvc2VfcGVuZGluZykgeworCQkvKiBBbGxvdyB0aGUgdW5kZXJseWluZyBzZXJ2aWNlIHRvIGJlIGN1bGxlZCAqLworCQl1bmxvY2tfc2VydmljZSh1c2VyX3NlcnZpY2UtPnNlcnZpY2UpOworCisJCS8qIFdha2UgdGhlIHVzZXItdGhyZWFkIGJsb2NrZWQgaW4gY2xvc2VfIG9yIHJlbW92ZV9zZXJ2aWNlICovCisJCXVwKCZ1c2VyX3NlcnZpY2UtPmNsb3NlX2V2ZW50KTsKKworCQl1c2VyX3NlcnZpY2UtPmNsb3NlX3BlbmRpbmcgPSAwOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICB2Y2hpcV9pb2N0bAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGxvbmcKK3ZjaGlxX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCVZDSElRX1NUQVRVU19UIHN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlID0gTlVMTDsKKwlsb25nIHJldCA9IDA7CisJaW50IGksIHJjOworCURFQlVHX0lOSVRJQUxJU0UoZ19zdGF0ZS5sb2NhbCkKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkgInZjaGlxX2lvY3RsIC0gaW5zdGFuY2UgJXgsIGNtZCAlcywgYXJnICVseCIsCisJCSh1bnNpZ25lZCBpbnQpaW5zdGFuY2UsCisJCSgoX0lPQ19UWVBFKGNtZCkgPT0gVkNISVFfSU9DX01BR0lDKSAmJgorCQkoX0lPQ19OUihjbWQpIDw9IFZDSElRX0lPQ19NQVgpKSA/CisJCWlvY3RsX25hbWVzW19JT0NfTlIoY21kKV0gOiAiPGludmFsaWQ+IiwgYXJnKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBWQ0hJUV9JT0NfU0hVVERPV046CisJCWlmICghaW5zdGFuY2UtPmNvbm5lY3RlZCkKKwkJCWJyZWFrOworCisJCS8qIFJlbW92ZSBhbGwgc2VydmljZXMgKi8KKwkJaSA9IDA7CisJCXdoaWxlICgoc2VydmljZSA9IG5leHRfc2VydmljZV9ieV9pbnN0YW5jZShpbnN0YW5jZS0+c3RhdGUsCisJCQlpbnN0YW5jZSwgJmkpKSAhPSBOVUxMKSB7CisJCQlzdGF0dXMgPSB2Y2hpcV9yZW1vdmVfc2VydmljZShzZXJ2aWNlLT5oYW5kbGUpOworCQkJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisJCQlpZiAoc3RhdHVzICE9IFZDSElRX1NVQ0NFU1MpCisJCQkJYnJlYWs7CisJCX0KKwkJc2VydmljZSA9IE5VTEw7CisKKwkJaWYgKHN0YXR1cyA9PSBWQ0hJUV9TVUNDRVNTKSB7CisJCQkvKiBXYWtlIHRoZSBjb21wbGV0aW9uIHRocmVhZCBhbmQgYXNrIGl0IHRvIGV4aXQgKi8KKwkJCWluc3RhbmNlLT5jbG9zaW5nID0gMTsKKwkJCXVwKCZpbnN0YW5jZS0+aW5zZXJ0X2V2ZW50KTsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBWQ0hJUV9JT0NfQ09OTkVDVDoKKwkJaWYgKGluc3RhbmNlLT5jb25uZWN0ZWQpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlyYyA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmaW5zdGFuY2UtPnN0YXRlLT5tdXRleCk7CisJCWlmIChyYyAhPSAwKSB7CisJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCQkidmNoaXE6IGNvbm5lY3Q6IGNvdWxkIG5vdCBsb2NrIG11dGV4IGZvciAiCisJCQkJInN0YXRlICVkOiAlZCIsCisJCQkJaW5zdGFuY2UtPnN0YXRlLT5pZCwgcmMpOworCQkJcmV0ID0gLUVJTlRSOworCQkJYnJlYWs7CisJCX0KKwkJc3RhdHVzID0gdmNoaXFfY29ubmVjdF9pbnRlcm5hbChpbnN0YW5jZS0+c3RhdGUsIGluc3RhbmNlKTsKKwkJbXV0ZXhfdW5sb2NrKCZpbnN0YW5jZS0+c3RhdGUtPm11dGV4KTsKKworCQlpZiAoc3RhdHVzID09IFZDSElRX1NVQ0NFU1MpCisJCQlpbnN0YW5jZS0+Y29ubmVjdGVkID0gMTsKKwkJZWxzZQorCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkJInZjaGlxOiBjb3VsZCBub3QgY29ubmVjdDogJWQiLCBzdGF0dXMpOworCQlicmVhazsKKworCWNhc2UgVkNISVFfSU9DX0NSRUFURV9TRVJWSUNFOiB7CisJCVZDSElRX0NSRUFURV9TRVJWSUNFX1QgYXJnczsKKwkJVVNFUl9TRVJWSUNFX1QgKnVzZXJfc2VydmljZSA9IE5VTEw7CisJCXZvaWQgKnVzZXJkYXRhOworCQlpbnQgc3J2c3RhdGU7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyCisJCQkgKCZhcmdzLCAoY29uc3Qgdm9pZCBfX3VzZXIgKilhcmcsCisJCQkgIHNpemVvZihhcmdzKSkgIT0gMCkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJdXNlcl9zZXJ2aWNlID0ga21hbGxvYyhzaXplb2YoVVNFUl9TRVJWSUNFX1QpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF1c2VyX3NlcnZpY2UpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlicmVhazsKKwkJfQorCisJCWlmIChhcmdzLmlzX29wZW4pIHsKKwkJCWlmICghaW5zdGFuY2UtPmNvbm5lY3RlZCkgeworCQkJCXJldCA9IC1FTk9UQ09OTjsKKwkJCQlrZnJlZSh1c2VyX3NlcnZpY2UpOworCQkJCWJyZWFrOworCQkJfQorCQkJc3J2c3RhdGUgPSBWQ0hJUV9TUlZTVEFURV9PUEVOSU5HOworCQl9IGVsc2UgeworCQkJc3J2c3RhdGUgPQorCQkJCSBpbnN0YW5jZS0+Y29ubmVjdGVkID8KKwkJCQkgVkNISVFfU1JWU1RBVEVfTElTVEVOSU5HIDoKKwkJCQkgVkNISVFfU1JWU1RBVEVfSElEREVOOworCQl9CisKKwkJdXNlcmRhdGEgPSBhcmdzLnBhcmFtcy51c2VyZGF0YTsKKwkJYXJncy5wYXJhbXMuY2FsbGJhY2sgPSBzZXJ2aWNlX2NhbGxiYWNrOworCQlhcmdzLnBhcmFtcy51c2VyZGF0YSA9IHVzZXJfc2VydmljZTsKKwkJc2VydmljZSA9IHZjaGlxX2FkZF9zZXJ2aWNlX2ludGVybmFsKAorCQkJCWluc3RhbmNlLT5zdGF0ZSwKKwkJCQkmYXJncy5wYXJhbXMsIHNydnN0YXRlLAorCQkJCWluc3RhbmNlLCB1c2VyX3NlcnZpY2VfZnJlZSk7CisKKwkJaWYgKHNlcnZpY2UgIT0gTlVMTCkgeworCQkJdXNlcl9zZXJ2aWNlLT5zZXJ2aWNlID0gc2VydmljZTsKKwkJCXVzZXJfc2VydmljZS0+dXNlcmRhdGEgPSB1c2VyZGF0YTsKKwkJCXVzZXJfc2VydmljZS0+aW5zdGFuY2UgPSBpbnN0YW5jZTsKKwkJCXVzZXJfc2VydmljZS0+aXNfdmNoaSA9IChhcmdzLmlzX3ZjaGkgIT0gMCk7CisJCQl1c2VyX3NlcnZpY2UtPmRlcXVldWVfcGVuZGluZyA9IDA7CisJCQl1c2VyX3NlcnZpY2UtPmNsb3NlX3BlbmRpbmcgPSAwOworCQkJdXNlcl9zZXJ2aWNlLT5tZXNzYWdlX2F2YWlsYWJsZV9wb3MgPQorCQkJCWluc3RhbmNlLT5jb21wbGV0aW9uX3JlbW92ZSAtIDE7CisJCQl1c2VyX3NlcnZpY2UtPm1zZ19pbnNlcnQgPSAwOworCQkJdXNlcl9zZXJ2aWNlLT5tc2dfcmVtb3ZlID0gMDsKKwkJCXNlbWFfaW5pdCgmdXNlcl9zZXJ2aWNlLT5pbnNlcnRfZXZlbnQsIDApOworCQkJc2VtYV9pbml0KCZ1c2VyX3NlcnZpY2UtPnJlbW92ZV9ldmVudCwgMCk7CisJCQlzZW1hX2luaXQoJnVzZXJfc2VydmljZS0+Y2xvc2VfZXZlbnQsIDApOworCisJCQlpZiAoYXJncy5pc19vcGVuKSB7CisJCQkJc3RhdHVzID0gdmNoaXFfb3Blbl9zZXJ2aWNlX2ludGVybmFsCisJCQkJCShzZXJ2aWNlLCBpbnN0YW5jZS0+cGlkKTsKKwkJCQlpZiAoc3RhdHVzICE9IFZDSElRX1NVQ0NFU1MpIHsKKwkJCQkJdmNoaXFfcmVtb3ZlX3NlcnZpY2Uoc2VydmljZS0+aGFuZGxlKTsKKwkJCQkJc2VydmljZSA9IE5VTEw7CisJCQkJCXJldCA9IChzdGF0dXMgPT0gVkNISVFfUkVUUlkpID8KKwkJCQkJCS1FSU5UUiA6IC1FSU87CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikKKwkJCQkmKCgoVkNISVFfQ1JFQVRFX1NFUlZJQ0VfVCBfX3VzZXIgKikKKwkJCQkJYXJnKS0+aGFuZGxlKSwKKwkJCQkoY29uc3Qgdm9pZCAqKSZzZXJ2aWNlLT5oYW5kbGUsCisJCQkJc2l6ZW9mKHNlcnZpY2UtPmhhbmRsZSkpICE9IDApIHsKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJCXZjaGlxX3JlbW92ZV9zZXJ2aWNlKHNlcnZpY2UtPmhhbmRsZSk7CisJCQl9CisKKwkJCXNlcnZpY2UgPSBOVUxMOworCQl9IGVsc2UgeworCQkJcmV0ID0gLUVFWElTVDsKKwkJCWtmcmVlKHVzZXJfc2VydmljZSk7CisJCX0KKwl9IGJyZWFrOworCisJY2FzZSBWQ0hJUV9JT0NfQ0xPU0VfU0VSVklDRTogeworCQlWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSA9IChWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UKWFyZzsKKworCQlzZXJ2aWNlID0gZmluZF9zZXJ2aWNlX2Zvcl9pbnN0YW5jZShpbnN0YW5jZSwgaGFuZGxlKTsKKwkJaWYgKHNlcnZpY2UgIT0gTlVMTCkgeworCQkJVVNFUl9TRVJWSUNFX1QgKnVzZXJfc2VydmljZSA9CisJCQkJKFVTRVJfU0VSVklDRV9UICopc2VydmljZS0+YmFzZS51c2VyZGF0YTsKKwkJCS8qIGNsb3NlX3BlbmRpbmcgaXMgZmFsc2Ugb24gZmlyc3QgZW50cnksIGFuZCB3aGVuIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdCBpbiB2Y2hpcV9jbG9zZV9zZXJ2aWNlIGhhcyBiZWVuIGludGVycnVwdGVkLiAqLworCQkJaWYgKCF1c2VyX3NlcnZpY2UtPmNsb3NlX3BlbmRpbmcpIHsKKwkJCQlzdGF0dXMgPSB2Y2hpcV9jbG9zZV9zZXJ2aWNlKHNlcnZpY2UtPmhhbmRsZSk7CisJCQkJaWYgKHN0YXR1cyAhPSBWQ0hJUV9TVUNDRVNTKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJLyogY2xvc2VfcGVuZGluZyBpcyB0cnVlIG9uY2UgdGhlIHVuZGVybHlpbmcgc2VydmljZQorCQkJICAgaGFzIGJlZW4gY2xvc2VkIHVudGlsIHRoZSBjbGllbnQgbGlicmFyeSBjYWxscyB0aGUKKwkJCSAgIENMT1NFX0RFTElWRVJFRCBpb2N0bCwgc2lnbmFsbGluZyBjbG9zZV9ldmVudC4gKi8KKwkJCWlmICh1c2VyX3NlcnZpY2UtPmNsb3NlX3BlbmRpbmcgJiYKKwkJCQlkb3duX2ludGVycnVwdGlibGUoJnVzZXJfc2VydmljZS0+Y2xvc2VfZXZlbnQpKQorCQkJCXN0YXR1cyA9IFZDSElRX1JFVFJZOworCQl9CisJCWVsc2UKKwkJCXJldCA9IC1FSU5WQUw7CisJfSBicmVhazsKKworCWNhc2UgVkNISVFfSU9DX1JFTU9WRV9TRVJWSUNFOiB7CisJCVZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlID0gKFZDSElRX1NFUlZJQ0VfSEFORExFX1QpYXJnOworCisJCXNlcnZpY2UgPSBmaW5kX3NlcnZpY2VfZm9yX2luc3RhbmNlKGluc3RhbmNlLCBoYW5kbGUpOworCQlpZiAoc2VydmljZSAhPSBOVUxMKSB7CisJCQlVU0VSX1NFUlZJQ0VfVCAqdXNlcl9zZXJ2aWNlID0KKwkJCQkoVVNFUl9TRVJWSUNFX1QgKilzZXJ2aWNlLT5iYXNlLnVzZXJkYXRhOworCQkJLyogY2xvc2VfcGVuZGluZyBpcyBmYWxzZSBvbiBmaXJzdCBlbnRyeSwgYW5kIHdoZW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0IGluIHZjaGlxX2Nsb3NlX3NlcnZpY2UgaGFzIGJlZW4gaW50ZXJydXB0ZWQuICovCisJCQlpZiAoIXVzZXJfc2VydmljZS0+Y2xvc2VfcGVuZGluZykgeworCQkJCXN0YXR1cyA9IHZjaGlxX3JlbW92ZV9zZXJ2aWNlKHNlcnZpY2UtPmhhbmRsZSk7CisJCQkJaWYgKHN0YXR1cyAhPSBWQ0hJUV9TVUNDRVNTKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJLyogY2xvc2VfcGVuZGluZyBpcyB0cnVlIG9uY2UgdGhlIHVuZGVybHlpbmcgc2VydmljZQorCQkJICAgaGFzIGJlZW4gY2xvc2VkIHVudGlsIHRoZSBjbGllbnQgbGlicmFyeSBjYWxscyB0aGUKKwkJCSAgIENMT1NFX0RFTElWRVJFRCBpb2N0bCwgc2lnbmFsbGluZyBjbG9zZV9ldmVudC4gKi8KKwkJCWlmICh1c2VyX3NlcnZpY2UtPmNsb3NlX3BlbmRpbmcgJiYKKwkJCQlkb3duX2ludGVycnVwdGlibGUoJnVzZXJfc2VydmljZS0+Y2xvc2VfZXZlbnQpKQorCQkJCXN0YXR1cyA9IFZDSElRX1JFVFJZOworCQl9CisJCWVsc2UKKwkJCXJldCA9IC1FSU5WQUw7CisJfSBicmVhazsKKworCWNhc2UgVkNISVFfSU9DX1VTRV9TRVJWSUNFOgorCWNhc2UgVkNISVFfSU9DX1JFTEVBU0VfU0VSVklDRToJeworCQlWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSA9IChWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UKWFyZzsKKworCQlzZXJ2aWNlID0gZmluZF9zZXJ2aWNlX2Zvcl9pbnN0YW5jZShpbnN0YW5jZSwgaGFuZGxlKTsKKwkJaWYgKHNlcnZpY2UgIT0gTlVMTCkgeworCQkJc3RhdHVzID0gKGNtZCA9PSBWQ0hJUV9JT0NfVVNFX1NFUlZJQ0UpCT8KKwkJCQl2Y2hpcV91c2Vfc2VydmljZV9pbnRlcm5hbChzZXJ2aWNlKSA6CisJCQkJdmNoaXFfcmVsZWFzZV9zZXJ2aWNlX2ludGVybmFsKHNlcnZpY2UpOworCQkJaWYgKHN0YXR1cyAhPSBWQ0hJUV9TVUNDRVNTKSB7CisJCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkJCQkiJXM6IGNtZCAlcyByZXR1cm5lZCBlcnJvciAlZCBmb3IgIgorCQkJCQkic2VydmljZSAlYyVjJWMlYzolMDNkIiwKKwkJCQkJX19mdW5jX18sCisJCQkJCShjbWQgPT0gVkNISVFfSU9DX1VTRV9TRVJWSUNFKSA/CisJCQkJCQkiVkNISVFfSU9DX1VTRV9TRVJWSUNFIiA6CisJCQkJCQkiVkNISVFfSU9DX1JFTEVBU0VfU0VSVklDRSIsCisJCQkJCXN0YXR1cywKKwkJCQkJVkNISVFfRk9VUkNDX0FTXzRDSEFSUygKKwkJCQkJCXNlcnZpY2UtPmJhc2UuZm91cmNjKSwKKwkJCQkJc2VydmljZS0+Y2xpZW50X2lkKTsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJfQorCQl9IGVsc2UKKwkJCXJldCA9IC1FSU5WQUw7CisJfSBicmVhazsKKworCWNhc2UgVkNISVFfSU9DX1FVRVVFX01FU1NBR0U6IHsKKwkJVkNISVFfUVVFVUVfTUVTU0FHRV9UIGFyZ3M7CisJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJICgmYXJncywgKGNvbnN0IHZvaWQgX191c2VyICopYXJnLAorCQkJICBzaXplb2YoYXJncykpICE9IDApIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCXNlcnZpY2UgPSBmaW5kX3NlcnZpY2VfZm9yX2luc3RhbmNlKGluc3RhbmNlLCBhcmdzLmhhbmRsZSk7CisKKwkJaWYgKChzZXJ2aWNlICE9IE5VTEwpICYmIChhcmdzLmNvdW50IDw9IE1BWF9FTEVNRU5UUykpIHsKKwkJCS8qIENvcHkgZWxlbWVudHMgaW50byBrZXJuZWwgc3BhY2UgKi8KKwkJCVZDSElRX0VMRU1FTlRfVCBlbGVtZW50c1tNQVhfRUxFTUVOVFNdOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGVsZW1lbnRzLCBhcmdzLmVsZW1lbnRzLAorCQkJCWFyZ3MuY291bnQgKiBzaXplb2YoVkNISVFfRUxFTUVOVF9UKSkgPT0gMCkKKwkJCQlzdGF0dXMgPSB2Y2hpcV9xdWV1ZV9tZXNzYWdlCisJCQkJCShhcmdzLmhhbmRsZSwKKwkJCQkJZWxlbWVudHMsIGFyZ3MuY291bnQpOworCQkJZWxzZQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCX0gZWxzZSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9CisJfSBicmVhazsKKworCWNhc2UgVkNISVFfSU9DX1FVRVVFX0JVTEtfVFJBTlNNSVQ6CisJY2FzZSBWQ0hJUV9JT0NfUVVFVUVfQlVMS19SRUNFSVZFOiB7CisJCVZDSElRX1FVRVVFX0JVTEtfVFJBTlNGRVJfVCBhcmdzOworCQlzdHJ1Y3QgYnVsa193YWl0ZXJfbm9kZSAqd2FpdGVyID0gTlVMTDsKKwkJVkNISVFfQlVMS19ESVJfVCBkaXIgPQorCQkJKGNtZCA9PSBWQ0hJUV9JT0NfUVVFVUVfQlVMS19UUkFOU01JVCkgPworCQkJVkNISVFfQlVMS19UUkFOU01JVCA6IFZDSElRX0JVTEtfUkVDRUlWRTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCSgmYXJncywgKGNvbnN0IHZvaWQgX191c2VyICopYXJnLAorCQkJc2l6ZW9mKGFyZ3MpKSAhPSAwKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlzZXJ2aWNlID0gZmluZF9zZXJ2aWNlX2Zvcl9pbnN0YW5jZShpbnN0YW5jZSwgYXJncy5oYW5kbGUpOworCQlpZiAoIXNlcnZpY2UpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChhcmdzLm1vZGUgPT0gVkNISVFfQlVMS19NT0RFX0JMT0NLSU5HKSB7CisJCQl3YWl0ZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnVsa193YWl0ZXJfbm9kZSksCisJCQkJR0ZQX0tFUk5FTCk7CisJCQlpZiAoIXdhaXRlcikgeworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJYnJlYWs7CisJCQl9CisJCQlhcmdzLnVzZXJkYXRhID0gJndhaXRlci0+YnVsa193YWl0ZXI7CisJCX0gZWxzZSBpZiAoYXJncy5tb2RlID09IFZDSElRX0JVTEtfTU9ERV9XQUlUSU5HKSB7CisJCQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJCQltdXRleF9sb2NrKCZpbnN0YW5jZS0+YnVsa193YWl0ZXJfbGlzdF9tdXRleCk7CisJCQlsaXN0X2Zvcl9lYWNoKHBvcywgJmluc3RhbmNlLT5idWxrX3dhaXRlcl9saXN0KSB7CisJCQkJaWYgKGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgYnVsa193YWl0ZXJfbm9kZSwKKwkJCQkJbGlzdCktPnBpZCA9PSBjdXJyZW50LT5waWQpIHsKKwkJCQkJd2FpdGVyID0gbGlzdF9lbnRyeShwb3MsCisJCQkJCQlzdHJ1Y3QgYnVsa193YWl0ZXJfbm9kZSwKKwkJCQkJCWxpc3QpOworCQkJCQlsaXN0X2RlbChwb3MpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCX0KKwkJCW11dGV4X3VubG9jaygmaW5zdGFuY2UtPmJ1bGtfd2FpdGVyX2xpc3RfbXV0ZXgpOworCQkJaWYgKCF3YWl0ZXIpIHsKKwkJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCQkJIm5vIGJ1bGtfd2FpdGVyIGZvdW5kIGZvciBwaWQgJWQiLAorCQkJCQljdXJyZW50LT5waWQpOworCQkJCXJldCA9IC1FU1JDSDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkJImZvdW5kIGJ1bGtfd2FpdGVyICV4IGZvciBwaWQgJWQiLAorCQkJCSh1bnNpZ25lZCBpbnQpd2FpdGVyLCBjdXJyZW50LT5waWQpOworCQkJYXJncy51c2VyZGF0YSA9ICZ3YWl0ZXItPmJ1bGtfd2FpdGVyOworCQl9CisJCXN0YXR1cyA9IHZjaGlxX2J1bGtfdHJhbnNmZXIKKwkJCShhcmdzLmhhbmRsZSwKKwkJCSBWQ0hJX01FTV9IQU5ETEVfSU5WQUxJRCwKKwkJCSBhcmdzLmRhdGEsIGFyZ3Muc2l6ZSwKKwkJCSBhcmdzLnVzZXJkYXRhLCBhcmdzLm1vZGUsCisJCQkgZGlyKTsKKwkJaWYgKCF3YWl0ZXIpCisJCQlicmVhazsKKwkJaWYgKChzdGF0dXMgIT0gVkNISVFfUkVUUlkpIHx8IGZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpIHx8CisJCQkhd2FpdGVyLT5idWxrX3dhaXRlci5idWxrKSB7CisJCQlpZiAod2FpdGVyLT5idWxrX3dhaXRlci5idWxrKSB7CisJCQkJLyogQ2FuY2VsIHRoZSBzaWduYWwgd2hlbiB0aGUgdHJhbnNmZXIKKwkJCQkqKiBjb21wbGV0ZXMuICovCisJCQkJc3Bpbl9sb2NrKCZidWxrX3dhaXRlcl9zcGlubG9jayk7CisJCQkJd2FpdGVyLT5idWxrX3dhaXRlci5idWxrLT51c2VyZGF0YSA9IE5VTEw7CisJCQkJc3Bpbl91bmxvY2soJmJ1bGtfd2FpdGVyX3NwaW5sb2NrKTsKKwkJCX0KKwkJCWtmcmVlKHdhaXRlcik7CisJCX0gZWxzZSB7CisJCQljb25zdCBWQ0hJUV9CVUxLX01PREVfVCBtb2RlX3dhaXRpbmcgPQorCQkJCVZDSElRX0JVTEtfTU9ERV9XQUlUSU5HOworCQkJd2FpdGVyLT5waWQgPSBjdXJyZW50LT5waWQ7CisJCQltdXRleF9sb2NrKCZpbnN0YW5jZS0+YnVsa193YWl0ZXJfbGlzdF9tdXRleCk7CisJCQlsaXN0X2FkZCgmd2FpdGVyLT5saXN0LCAmaW5zdGFuY2UtPmJ1bGtfd2FpdGVyX2xpc3QpOworCQkJbXV0ZXhfdW5sb2NrKCZpbnN0YW5jZS0+YnVsa193YWl0ZXJfbGlzdF9tdXRleCk7CisJCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkJCSJzYXZlZCBidWxrX3dhaXRlciAleCBmb3IgcGlkICVkIiwKKwkJCQkodW5zaWduZWQgaW50KXdhaXRlciwgY3VycmVudC0+cGlkKTsKKworCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikKKwkJCQkmKCgoVkNISVFfUVVFVUVfQlVMS19UUkFOU0ZFUl9UIF9fdXNlciAqKQorCQkJCQlhcmcpLT5tb2RlKSwKKwkJCQkoY29uc3Qgdm9pZCAqKSZtb2RlX3dhaXRpbmcsCisJCQkJc2l6ZW9mKG1vZGVfd2FpdGluZykpICE9IDApCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJfQorCX0gYnJlYWs7CisKKwljYXNlIFZDSElRX0lPQ19BV0FJVF9DT01QTEVUSU9OOiB7CisJCVZDSElRX0FXQUlUX0NPTVBMRVRJT05fVCBhcmdzOworCisJCURFQlVHX1RSQUNFKEFXQUlUX0NPTVBMRVRJT05fTElORSk7CisJCWlmICghaW5zdGFuY2UtPmNvbm5lY3RlZCkgeworCQkJcmV0ID0gLUVOT1RDT05OOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmFyZ3MsIChjb25zdCB2b2lkIF9fdXNlciAqKWFyZywKKwkJCXNpemVvZihhcmdzKSkgIT0gMCkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJbXV0ZXhfbG9jaygmaW5zdGFuY2UtPmNvbXBsZXRpb25fbXV0ZXgpOworCisJCURFQlVHX1RSQUNFKEFXQUlUX0NPTVBMRVRJT05fTElORSk7CisJCXdoaWxlICgoaW5zdGFuY2UtPmNvbXBsZXRpb25fcmVtb3ZlID09CisJCQlpbnN0YW5jZS0+Y29tcGxldGlvbl9pbnNlcnQpCisJCQkmJiAhaW5zdGFuY2UtPmNsb3NpbmcpIHsKKwkJCWludCByYzsKKwkJCURFQlVHX1RSQUNFKEFXQUlUX0NPTVBMRVRJT05fTElORSk7CisJCQltdXRleF91bmxvY2soJmluc3RhbmNlLT5jb21wbGV0aW9uX211dGV4KTsKKwkJCXJjID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZpbnN0YW5jZS0+aW5zZXJ0X2V2ZW50KTsKKwkJCW11dGV4X2xvY2soJmluc3RhbmNlLT5jb21wbGV0aW9uX211dGV4KTsKKwkJCWlmIChyYyAhPSAwKSB7CisJCQkJREVCVUdfVFJBQ0UoQVdBSVRfQ09NUExFVElPTl9MSU5FKTsKKwkJCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkJCQkiQVdBSVRfQ09NUExFVElPTiBpbnRlcnJ1cHRlZCIpOworCQkJCXJldCA9IC1FSU5UUjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlERUJVR19UUkFDRShBV0FJVF9DT01QTEVUSU9OX0xJTkUpOworCisJCS8qIEEgcmVhZCBtZW1vcnkgYmFycmllciBpcyBuZWVkZWQgdG8gc3RvcCBwcmVmZXRjaCBvZiBhIHN0YWxlCisJCSoqIGNvbXBsZXRpb24gcmVjb3JkCisJCSovCisJCXJtYigpOworCisJCWlmIChyZXQgPT0gMCkgeworCQkJaW50IG1zZ2J1ZmNvdW50ID0gYXJncy5tc2didWZjb3VudDsKKwkJCWZvciAocmV0ID0gMDsgcmV0IDwgYXJncy5jb3VudDsgcmV0KyspIHsKKwkJCQlWQ0hJUV9DT01QTEVUSU9OX0RBVEFfVCAqY29tcGxldGlvbjsKKwkJCQlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2U7CisJCQkJVVNFUl9TRVJWSUNFX1QgKnVzZXJfc2VydmljZTsKKwkJCQlWQ0hJUV9IRUFERVJfVCAqaGVhZGVyOworCQkJCWlmIChpbnN0YW5jZS0+Y29tcGxldGlvbl9yZW1vdmUgPT0KKwkJCQkJaW5zdGFuY2UtPmNvbXBsZXRpb25faW5zZXJ0KQorCQkJCQlicmVhazsKKwkJCQljb21wbGV0aW9uID0gJmluc3RhbmNlLT5jb21wbGV0aW9uc1sKKwkJCQkJaW5zdGFuY2UtPmNvbXBsZXRpb25fcmVtb3ZlICYKKwkJCQkJKE1BWF9DT01QTEVUSU9OUyAtIDEpXTsKKworCQkJCXNlcnZpY2UgPSBjb21wbGV0aW9uLT5zZXJ2aWNlX3VzZXJkYXRhOworCQkJCXVzZXJfc2VydmljZSA9IHNlcnZpY2UtPmJhc2UudXNlcmRhdGE7CisJCQkJY29tcGxldGlvbi0+c2VydmljZV91c2VyZGF0YSA9CisJCQkJCXVzZXJfc2VydmljZS0+dXNlcmRhdGE7CisKKwkJCQloZWFkZXIgPSBjb21wbGV0aW9uLT5oZWFkZXI7CisJCQkJaWYgKGhlYWRlcikgeworCQkJCQl2b2lkIF9fdXNlciAqbXNnYnVmOworCQkJCQlpbnQgbXNnbGVuOworCisJCQkJCW1zZ2xlbiA9IGhlYWRlci0+c2l6ZSArCisJCQkJCQlzaXplb2YoVkNISVFfSEVBREVSX1QpOworCQkJCQkvKiBUaGlzIG11c3QgYmUgYSBWQ0hJUS1zdHlsZSBzZXJ2aWNlICovCisJCQkJCWlmIChhcmdzLm1zZ2J1ZnNpemUgPCBtc2dsZW4pIHsKKwkJCQkJCXZjaGlxX2xvZ19lcnJvcigKKwkJCQkJCQl2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkJCQkJCSJoZWFkZXIgJXg6IG1zZ2J1ZnNpemUiCisJCQkJCQkJIiAleCA8IG1zZ2xlbiAleCIsCisJCQkJCQkJKHVuc2lnbmVkIGludCloZWFkZXIsCisJCQkJCQkJYXJncy5tc2didWZzaXplLAorCQkJCQkJCW1zZ2xlbik7CisJCQkJCQlXQVJOKDEsICJpbnZhbGlkIG1lc3NhZ2UgIgorCQkJCQkJCSJzaXplXG4iKTsKKwkJCQkJCWlmIChyZXQgPT0gMCkKKwkJCQkJCQlyZXQgPSAtRU1TR1NJWkU7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlpZiAobXNnYnVmY291bnQgPD0gMCkKKwkJCQkJCS8qIFN0YWxsIGhlcmUgZm9yIGxhY2sgb2YgYQorCQkJCQkJKiogYnVmZmVyIGZvciB0aGUgbWVzc2FnZS4gKi8KKwkJCQkJCWJyZWFrOworCQkJCQkvKiBHZXQgdGhlIHBvaW50ZXIgZnJvbSB1c2VyIHNwYWNlICovCisJCQkJCW1zZ2J1ZmNvdW50LS07CisJCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmbXNnYnVmLAorCQkJCQkJKGNvbnN0IHZvaWQgX191c2VyICopCisJCQkJCQkmYXJncy5tc2didWZzW21zZ2J1ZmNvdW50XSwKKwkJCQkJCXNpemVvZihtc2didWYpKSAhPSAwKSB7CisJCQkJCQlpZiAocmV0ID09IDApCisJCQkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJLyogQ29weSB0aGUgbWVzc2FnZSB0byB1c2VyIHNwYWNlICovCisJCQkJCWlmIChjb3B5X3RvX3VzZXIobXNnYnVmLCBoZWFkZXIsCisJCQkJCQltc2dsZW4pICE9IDApIHsKKwkJCQkJCWlmIChyZXQgPT0gMCkKKwkJCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvKiBOb3cgaXQgaGFzIGJlZW4gY29waWVkLCB0aGUgbWVzc2FnZQorCQkJCQkqKiBjYW4gYmUgcmVsZWFzZWQuICovCisJCQkJCXZjaGlxX3JlbGVhc2VfbWVzc2FnZShzZXJ2aWNlLT5oYW5kbGUsCisJCQkJCQloZWFkZXIpOworCisJCQkJCS8qIFRoZSBjb21wbGV0aW9uIG11c3QgcG9pbnQgdG8gdGhlCisJCQkJCSoqIG1zZ2J1Zi4gKi8KKwkJCQkJY29tcGxldGlvbi0+aGVhZGVyID0gbXNnYnVmOworCQkJCX0KKworCQkJCWlmICgoY29tcGxldGlvbi0+cmVhc29uID09CisJCQkJCVZDSElRX1NFUlZJQ0VfQ0xPU0VEKSAmJgorCQkJCQkhaW5zdGFuY2UtPnVzZV9jbG9zZV9kZWxpdmVyZWQpCisJCQkJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCisJCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikoCisJCQkJCShzaXplX3QpYXJncy5idWYgKworCQkJCQlyZXQgKiBzaXplb2YoVkNISVFfQ09NUExFVElPTl9EQVRBX1QpKSwKKwkJCQkJY29tcGxldGlvbiwKKwkJCQkJc2l6ZW9mKFZDSElRX0NPTVBMRVRJT05fREFUQV9UKSkgIT0gMCkgeworCQkJCQkJaWYgKHJldCA9PSAwKQorCQkJCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWluc3RhbmNlLT5jb21wbGV0aW9uX3JlbW92ZSsrOworCQkJfQorCisJCQlpZiAobXNnYnVmY291bnQgIT0gYXJncy5tc2didWZjb3VudCkgeworCQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopCisJCQkJCSYoKFZDSElRX0FXQUlUX0NPTVBMRVRJT05fVCAqKWFyZyktPgorCQkJCQkJbXNnYnVmY291bnQsCisJCQkJCSZtc2didWZjb3VudCwKKwkJCQkJc2l6ZW9mKG1zZ2J1ZmNvdW50KSkgIT0gMCkgeworCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChyZXQgIT0gMCkKKwkJCXVwKCZpbnN0YW5jZS0+cmVtb3ZlX2V2ZW50KTsKKwkJbXV0ZXhfdW5sb2NrKCZpbnN0YW5jZS0+Y29tcGxldGlvbl9tdXRleCk7CisJCURFQlVHX1RSQUNFKEFXQUlUX0NPTVBMRVRJT05fTElORSk7CisJfSBicmVhazsKKworCWNhc2UgVkNISVFfSU9DX0RFUVVFVUVfTUVTU0FHRTogeworCQlWQ0hJUV9ERVFVRVVFX01FU1NBR0VfVCBhcmdzOworCQlVU0VSX1NFUlZJQ0VfVCAqdXNlcl9zZXJ2aWNlOworCQlWQ0hJUV9IRUFERVJfVCAqaGVhZGVyOworCisJCURFQlVHX1RSQUNFKERFUVVFVUVfTUVTU0FHRV9MSU5FKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyCisJCQkgKCZhcmdzLCAoY29uc3Qgdm9pZCBfX3VzZXIgKilhcmcsCisJCQkgIHNpemVvZihhcmdzKSkgIT0gMCkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXNlcnZpY2UgPSBmaW5kX3NlcnZpY2VfZm9yX2luc3RhbmNlKGluc3RhbmNlLCBhcmdzLmhhbmRsZSk7CisJCWlmICghc2VydmljZSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCXVzZXJfc2VydmljZSA9IChVU0VSX1NFUlZJQ0VfVCAqKXNlcnZpY2UtPmJhc2UudXNlcmRhdGE7CisJCWlmICh1c2VyX3NlcnZpY2UtPmlzX3ZjaGkgPT0gMCkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJc3Bpbl9sb2NrKCZtc2dfcXVldWVfc3BpbmxvY2spOworCQlpZiAodXNlcl9zZXJ2aWNlLT5tc2dfcmVtb3ZlID09IHVzZXJfc2VydmljZS0+bXNnX2luc2VydCkgeworCQkJaWYgKCFhcmdzLmJsb2NraW5nKSB7CisJCQkJc3Bpbl91bmxvY2soJm1zZ19xdWV1ZV9zcGlubG9jayk7CisJCQkJREVCVUdfVFJBQ0UoREVRVUVVRV9NRVNTQUdFX0xJTkUpOworCQkJCXJldCA9IC1FV09VTERCTE9DSzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXVzZXJfc2VydmljZS0+ZGVxdWV1ZV9wZW5kaW5nID0gMTsKKwkJCWRvIHsKKwkJCQlzcGluX3VubG9jaygmbXNnX3F1ZXVlX3NwaW5sb2NrKTsKKwkJCQlERUJVR19UUkFDRShERVFVRVVFX01FU1NBR0VfTElORSk7CisJCQkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgKKwkJCQkJJnVzZXJfc2VydmljZS0+aW5zZXJ0X2V2ZW50KSAhPSAwKSB7CisJCQkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkJCQkiREVRVUVVRV9NRVNTQUdFIGludGVycnVwdGVkIik7CisJCQkJCXJldCA9IC1FSU5UUjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXNwaW5fbG9jaygmbXNnX3F1ZXVlX3NwaW5sb2NrKTsKKwkJCX0gd2hpbGUgKHVzZXJfc2VydmljZS0+bXNnX3JlbW92ZSA9PQorCQkJCXVzZXJfc2VydmljZS0+bXNnX2luc2VydCk7CisKKwkJCWlmIChyZXQpCisJCQkJYnJlYWs7CisJCX0KKworCQlCVUdfT04oKGludCkodXNlcl9zZXJ2aWNlLT5tc2dfaW5zZXJ0IC0KKwkJCXVzZXJfc2VydmljZS0+bXNnX3JlbW92ZSkgPCAwKTsKKworCQloZWFkZXIgPSB1c2VyX3NlcnZpY2UtPm1zZ19xdWV1ZVt1c2VyX3NlcnZpY2UtPm1zZ19yZW1vdmUgJgorCQkJKE1TR19RVUVVRV9TSVpFIC0gMSldOworCQl1c2VyX3NlcnZpY2UtPm1zZ19yZW1vdmUrKzsKKwkJc3Bpbl91bmxvY2soJm1zZ19xdWV1ZV9zcGlubG9jayk7CisKKwkJdXAoJnVzZXJfc2VydmljZS0+cmVtb3ZlX2V2ZW50KTsKKwkJaWYgKGhlYWRlciA9PSBOVUxMKQorCQkJcmV0ID0gLUVOT1RDT05OOworCQllbHNlIGlmIChoZWFkZXItPnNpemUgPD0gYXJncy5idWZzaXplKSB7CisJCQkvKiBDb3B5IHRvIHVzZXIgc3BhY2UgaWYgbXNnYnVmIGlzIG5vdCBOVUxMICovCisJCQlpZiAoKGFyZ3MuYnVmID09IE5VTEwpIHx8CisJCQkJKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmdzLmJ1ZiwKKwkJCQloZWFkZXItPmRhdGEsCisJCQkJaGVhZGVyLT5zaXplKSA9PSAwKSkgeworCQkJCXJldCA9IGhlYWRlci0+c2l6ZTsKKwkJCQl2Y2hpcV9yZWxlYXNlX21lc3NhZ2UoCisJCQkJCXNlcnZpY2UtPmhhbmRsZSwKKwkJCQkJaGVhZGVyKTsKKwkJCX0gZWxzZQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCX0gZWxzZSB7CisJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCQkiaGVhZGVyICV4OiBidWZzaXplICV4IDwgc2l6ZSAleCIsCisJCQkJKHVuc2lnbmVkIGludCloZWFkZXIsIGFyZ3MuYnVmc2l6ZSwKKwkJCQloZWFkZXItPnNpemUpOworCQkJV0FSTigxLCAiaW52YWxpZCBzaXplXG4iKTsKKwkJCXJldCA9IC1FTVNHU0laRTsKKwkJfQorCQlERUJVR19UUkFDRShERVFVRVVFX01FU1NBR0VfTElORSk7CisJfSBicmVhazsKKworCWNhc2UgVkNISVFfSU9DX0dFVF9DTElFTlRfSUQ6IHsKKwkJVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUgPSAoVkNISVFfU0VSVklDRV9IQU5ETEVfVClhcmc7CisKKwkJcmV0ID0gdmNoaXFfZ2V0X2NsaWVudF9pZChoYW5kbGUpOworCX0gYnJlYWs7CisKKwljYXNlIFZDSElRX0lPQ19HRVRfQ09ORklHOiB7CisJCVZDSElRX0dFVF9DT05GSUdfVCBhcmdzOworCQlWQ0hJUV9DT05GSUdfVCBjb25maWc7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZhcmdzLCAoY29uc3Qgdm9pZCBfX3VzZXIgKilhcmcsCisJCQlzaXplb2YoYXJncykpICE9IDApIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlpZiAoYXJncy5jb25maWdfc2l6ZSA+IHNpemVvZihjb25maWcpKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJc3RhdHVzID0gdmNoaXFfZ2V0X2NvbmZpZyhpbnN0YW5jZSwgYXJncy5jb25maWdfc2l6ZSwgJmNvbmZpZyk7CisJCWlmIChzdGF0dXMgPT0gVkNISVFfU1VDQ0VTUykgeworCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmdzLnBjb25maWcsCisJCQkJICAgICZjb25maWcsIGFyZ3MuY29uZmlnX3NpemUpICE9IDApIHsKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfSBicmVhazsKKworCWNhc2UgVkNISVFfSU9DX1NFVF9TRVJWSUNFX09QVElPTjogeworCQlWQ0hJUV9TRVRfU0VSVklDRV9PUFRJT05fVCBhcmdzOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigKKwkJCSZhcmdzLCAoY29uc3Qgdm9pZCBfX3VzZXIgKilhcmcsCisJCQlzaXplb2YoYXJncykpICE9IDApIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCXNlcnZpY2UgPSBmaW5kX3NlcnZpY2VfZm9yX2luc3RhbmNlKGluc3RhbmNlLCBhcmdzLmhhbmRsZSk7CisJCWlmICghc2VydmljZSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJc3RhdHVzID0gdmNoaXFfc2V0X3NlcnZpY2Vfb3B0aW9uKAorCQkJCWFyZ3MuaGFuZGxlLCBhcmdzLm9wdGlvbiwgYXJncy52YWx1ZSk7CisJfSBicmVhazsKKworCWNhc2UgVkNISVFfSU9DX0RVTVBfUEhZU19NRU06IHsKKwkJVkNISVFfRFVNUF9NRU1fVCAgYXJnczsKKworCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCSAoJmFyZ3MsIChjb25zdCB2b2lkIF9fdXNlciAqKWFyZywKKwkJCSAgc2l6ZW9mKGFyZ3MpKSAhPSAwKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJZHVtcF9waHlzX21lbShhcmdzLnZpcnRfYWRkciwgYXJncy5udW1fYnl0ZXMpOworCX0gYnJlYWs7CisKKwljYXNlIFZDSElRX0lPQ19MSUJfVkVSU0lPTjogeworCQl1bnNpZ25lZCBpbnQgbGliX3ZlcnNpb24gPSAodW5zaWduZWQgaW50KWFyZzsKKworCQlpZiAobGliX3ZlcnNpb24gPCBWQ0hJUV9WRVJTSU9OX01JTikKKwkJCXJldCA9IC1FSU5WQUw7CisJCWVsc2UgaWYgKGxpYl92ZXJzaW9uID49IFZDSElRX1ZFUlNJT05fQ0xPU0VfREVMSVZFUkVEKQorCQkJaW5zdGFuY2UtPnVzZV9jbG9zZV9kZWxpdmVyZWQgPSAxOworCX0gYnJlYWs7CisKKwljYXNlIFZDSElRX0lPQ19DTE9TRV9ERUxJVkVSRUQ6IHsKKwkJVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUgPSAoVkNISVFfU0VSVklDRV9IQU5ETEVfVClhcmc7CisKKwkJc2VydmljZSA9IGZpbmRfY2xvc2VkX3NlcnZpY2VfZm9yX2luc3RhbmNlKGluc3RhbmNlLCBoYW5kbGUpOworCQlpZiAoc2VydmljZSAhPSBOVUxMKSB7CisJCQlVU0VSX1NFUlZJQ0VfVCAqdXNlcl9zZXJ2aWNlID0KKwkJCQkoVVNFUl9TRVJWSUNFX1QgKilzZXJ2aWNlLT5iYXNlLnVzZXJkYXRhOworCQkJY2xvc2VfZGVsaXZlcmVkKHVzZXJfc2VydmljZSk7CisJCX0KKwkJZWxzZQorCQkJcmV0ID0gLUVJTlZBTDsKKwl9IGJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT1RUWTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHNlcnZpY2UpCisJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCisJaWYgKHJldCA9PSAwKSB7CisJCWlmIChzdGF0dXMgPT0gVkNISVFfRVJST1IpCisJCQlyZXQgPSAtRUlPOworCQllbHNlIGlmIChzdGF0dXMgPT0gVkNISVFfUkVUUlkpCisJCQlyZXQgPSAtRUlOVFI7CisJfQorCisJaWYgKChzdGF0dXMgPT0gVkNISVFfU1VDQ0VTUykgJiYgKHJldCA8IDApICYmIChyZXQgIT0gLUVJTlRSKSAmJgorCQkocmV0ICE9IC1FV09VTERCTE9DSykpCisJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkiICBpb2N0bCBpbnN0YW5jZSAlbHgsIGNtZCAlcyAtPiBzdGF0dXMgJWQsICVsZCIsCisJCQkodW5zaWduZWQgbG9uZylpbnN0YW5jZSwKKwkJCShfSU9DX05SKGNtZCkgPD0gVkNISVFfSU9DX01BWCkgPworCQkJCWlvY3RsX25hbWVzW19JT0NfTlIoY21kKV0gOgorCQkJCSI8aW52YWxpZD4iLAorCQkJc3RhdHVzLCByZXQpOworCWVsc2UKKwkJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkiICBpb2N0bCBpbnN0YW5jZSAlbHgsIGNtZCAlcyAtPiBzdGF0dXMgJWQsICVsZCIsCisJCQkodW5zaWduZWQgbG9uZylpbnN0YW5jZSwKKwkJCShfSU9DX05SKGNtZCkgPD0gVkNISVFfSU9DX01BWCkgPworCQkJCWlvY3RsX25hbWVzW19JT0NfTlIoY21kKV0gOgorCQkJCSI8aW52YWxpZD4iLAorCQkJc3RhdHVzLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICB2Y2hpcV9vcGVuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK3ZjaGlxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IGRldiA9IGltaW5vcihpbm9kZSkgJiAweDBmOworCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2FybV9sb2dfbGV2ZWwsICJ2Y2hpcV9vcGVuIik7CisJc3dpdGNoIChkZXYpIHsKKwljYXNlIFZDSElRX01JTk9SOiB7CisJCWludCByZXQ7CisJCVZDSElRX1NUQVRFX1QgKnN0YXRlID0gdmNoaXFfZ2V0X3N0YXRlKCk7CisJCVZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2U7CisKKwkJaWYgKCFzdGF0ZSkgeworCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkJInZjaGlxIGhhcyBubyBjb25uZWN0aW9uIHRvIFZpZGVvQ29yZSIpOworCQkJcmV0dXJuIC1FTk9UQ09OTjsKKwkJfQorCisJCWluc3RhbmNlID0ga3phbGxvYyhzaXplb2YoKmluc3RhbmNlKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaW5zdGFuY2UpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlpbnN0YW5jZS0+c3RhdGUgPSBzdGF0ZTsKKwkJaW5zdGFuY2UtPnBpZCA9IGN1cnJlbnQtPnRnaWQ7CisKKwkJcmV0ID0gdmNoaXFfZGVidWdmc19hZGRfaW5zdGFuY2UoaW5zdGFuY2UpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCWtmcmVlKGluc3RhbmNlKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlzZW1hX2luaXQoJmluc3RhbmNlLT5pbnNlcnRfZXZlbnQsIDApOworCQlzZW1hX2luaXQoJmluc3RhbmNlLT5yZW1vdmVfZXZlbnQsIDApOworCQltdXRleF9pbml0KCZpbnN0YW5jZS0+Y29tcGxldGlvbl9tdXRleCk7CisJCW11dGV4X2luaXQoJmluc3RhbmNlLT5idWxrX3dhaXRlcl9saXN0X211dGV4KTsKKwkJSU5JVF9MSVNUX0hFQUQoJmluc3RhbmNlLT5idWxrX3dhaXRlcl9saXN0KTsKKworCQlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbnN0YW5jZTsKKwl9IGJyZWFrOworCisJZGVmYXVsdDoKKwkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkiVW5rbm93biBtaW5vciBkZXZpY2U6ICVkIiwgZGV2KTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICB2Y2hpcV9yZWxlYXNlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK3ZjaGlxX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IGRldiA9IGltaW5vcihpbm9kZSkgJiAweDBmOworCWludCByZXQgPSAwOworCXN3aXRjaCAoZGV2KSB7CisJY2FzZSBWQ0hJUV9NSU5PUjogeworCQlWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCQlWQ0hJUV9TVEFURV9UICpzdGF0ZSA9IHZjaGlxX2dldF9zdGF0ZSgpOworCQlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2U7CisJCWludCBpOworCisJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkidmNoaXFfcmVsZWFzZTogaW5zdGFuY2U9JWx4IiwKKwkJCSh1bnNpZ25lZCBsb25nKWluc3RhbmNlKTsKKworCQlpZiAoIXN0YXRlKSB7CisJCQlyZXQgPSAtRVBFUk07CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIEVuc3VyZSB2aWRlb2NvcmUgaXMgYXdha2UgdG8gYWxsb3cgdGVybWluYXRpb24uICovCisJCXZjaGlxX3VzZV9pbnRlcm5hbChpbnN0YW5jZS0+c3RhdGUsIE5VTEwsCisJCQkJVVNFX1RZUEVfVkNISVEpOworCisJCW11dGV4X2xvY2soJmluc3RhbmNlLT5jb21wbGV0aW9uX211dGV4KTsKKworCQkvKiBXYWtlIHRoZSBjb21wbGV0aW9uIHRocmVhZCBhbmQgYXNrIGl0IHRvIGV4aXQgKi8KKwkJaW5zdGFuY2UtPmNsb3NpbmcgPSAxOworCQl1cCgmaW5zdGFuY2UtPmluc2VydF9ldmVudCk7CisKKwkJbXV0ZXhfdW5sb2NrKCZpbnN0YW5jZS0+Y29tcGxldGlvbl9tdXRleCk7CisKKwkJLyogV2FrZSB0aGUgc2xvdCBoYW5kbGVyIGlmIHRoZSBjb21wbGV0aW9uIHF1ZXVlIGlzIGZ1bGwuICovCisJCXVwKCZpbnN0YW5jZS0+cmVtb3ZlX2V2ZW50KTsKKworCQkvKiBNYXJrIGFsbCBzZXJ2aWNlcyBmb3IgdGVybWluYXRpb24uLi4gKi8KKwkJaSA9IDA7CisJCXdoaWxlICgoc2VydmljZSA9IG5leHRfc2VydmljZV9ieV9pbnN0YW5jZShzdGF0ZSwgaW5zdGFuY2UsCisJCQkmaSkpICE9CU5VTEwpIHsKKwkJCVVTRVJfU0VSVklDRV9UICp1c2VyX3NlcnZpY2UgPSBzZXJ2aWNlLT5iYXNlLnVzZXJkYXRhOworCisJCQkvKiBXYWtlIHRoZSBzbG90IGhhbmRsZXIgaWYgdGhlIG1zZyBxdWV1ZSBpcyBmdWxsLiAqLworCQkJdXAoJnVzZXJfc2VydmljZS0+cmVtb3ZlX2V2ZW50KTsKKworCQkJdmNoaXFfdGVybWluYXRlX3NlcnZpY2VfaW50ZXJuYWwoc2VydmljZSk7CisJCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKwkJfQorCisJCS8qIC4uLmFuZCB3YWl0IGZvciB0aGVtIHRvIGRpZSAqLworCQlpID0gMDsKKwkJd2hpbGUgKChzZXJ2aWNlID0gbmV4dF9zZXJ2aWNlX2J5X2luc3RhbmNlKHN0YXRlLCBpbnN0YW5jZSwgJmkpKQorCQkJIT0gTlVMTCkgeworCQkJVVNFUl9TRVJWSUNFX1QgKnVzZXJfc2VydmljZSA9IHNlcnZpY2UtPmJhc2UudXNlcmRhdGE7CisKKwkJCWRvd24oJnNlcnZpY2UtPnJlbW92ZV9ldmVudCk7CisKKwkJCUJVR19PTihzZXJ2aWNlLT5zcnZzdGF0ZSAhPSBWQ0hJUV9TUlZTVEFURV9GUkVFKTsKKworCQkJc3Bpbl9sb2NrKCZtc2dfcXVldWVfc3BpbmxvY2spOworCisJCQl3aGlsZSAodXNlcl9zZXJ2aWNlLT5tc2dfcmVtb3ZlICE9CisJCQkJdXNlcl9zZXJ2aWNlLT5tc2dfaW5zZXJ0KSB7CisJCQkJVkNISVFfSEVBREVSX1QgKmhlYWRlciA9IHVzZXJfc2VydmljZS0+CisJCQkJCW1zZ19xdWV1ZVt1c2VyX3NlcnZpY2UtPm1zZ19yZW1vdmUgJgorCQkJCQkJKE1TR19RVUVVRV9TSVpFIC0gMSldOworCQkJCXVzZXJfc2VydmljZS0+bXNnX3JlbW92ZSsrOworCQkJCXNwaW5fdW5sb2NrKCZtc2dfcXVldWVfc3BpbmxvY2spOworCisJCQkJaWYgKGhlYWRlcikKKwkJCQkJdmNoaXFfcmVsZWFzZV9tZXNzYWdlKAorCQkJCQkJc2VydmljZS0+aGFuZGxlLAorCQkJCQkJaGVhZGVyKTsKKwkJCQlzcGluX2xvY2soJm1zZ19xdWV1ZV9zcGlubG9jayk7CisJCQl9CisKKwkJCXNwaW5fdW5sb2NrKCZtc2dfcXVldWVfc3BpbmxvY2spOworCisJCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKwkJfQorCisJCS8qIFJlbGVhc2UgYW55IGNsb3NlZCBzZXJ2aWNlcyAqLworCQl3aGlsZSAoaW5zdGFuY2UtPmNvbXBsZXRpb25fcmVtb3ZlICE9CisJCQlpbnN0YW5jZS0+Y29tcGxldGlvbl9pbnNlcnQpIHsKKwkJCVZDSElRX0NPTVBMRVRJT05fREFUQV9UICpjb21wbGV0aW9uOworCQkJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlOworCQkJY29tcGxldGlvbiA9ICZpbnN0YW5jZS0+Y29tcGxldGlvbnNbCisJCQkJaW5zdGFuY2UtPmNvbXBsZXRpb25fcmVtb3ZlICYKKwkJCQkoTUFYX0NPTVBMRVRJT05TIC0gMSldOworCQkJc2VydmljZSA9IGNvbXBsZXRpb24tPnNlcnZpY2VfdXNlcmRhdGE7CisJCQlpZiAoY29tcGxldGlvbi0+cmVhc29uID09IFZDSElRX1NFUlZJQ0VfQ0xPU0VEKQorCQkJeworCQkJCVVTRVJfU0VSVklDRV9UICp1c2VyX3NlcnZpY2UgPQorCQkJCQlzZXJ2aWNlLT5iYXNlLnVzZXJkYXRhOworCisJCQkJLyogV2FrZSBhbnkgYmxvY2tlZCB1c2VyLXRocmVhZCAqLworCQkJCWlmIChpbnN0YW5jZS0+dXNlX2Nsb3NlX2RlbGl2ZXJlZCkKKwkJCQkJdXAoJnVzZXJfc2VydmljZS0+Y2xvc2VfZXZlbnQpOworCQkJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCQkJfQorCQkJaW5zdGFuY2UtPmNvbXBsZXRpb25fcmVtb3ZlKys7CisJCX0KKworCQkvKiBSZWxlYXNlIHRoZSBQRUVSIHNlcnZpY2UgY291bnQuICovCisJCXZjaGlxX3JlbGVhc2VfaW50ZXJuYWwoaW5zdGFuY2UtPnN0YXRlLCBOVUxMKTsKKworCQl7CisJCQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICpuZXh0OworCQkJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbmV4dCwKKwkJCQkmaW5zdGFuY2UtPmJ1bGtfd2FpdGVyX2xpc3QpIHsKKwkJCQlzdHJ1Y3QgYnVsa193YWl0ZXJfbm9kZSAqd2FpdGVyOworCQkJCXdhaXRlciA9IGxpc3RfZW50cnkocG9zLAorCQkJCQlzdHJ1Y3QgYnVsa193YWl0ZXJfbm9kZSwKKwkJCQkJbGlzdCk7CisJCQkJbGlzdF9kZWwocG9zKTsKKwkJCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkJCQkiYnVsa193YWl0ZXIgLSBjbGVhbmVkIHVwICV4ICIKKwkJCQkJImZvciBwaWQgJWQiLAorCQkJCQkodW5zaWduZWQgaW50KXdhaXRlciwgd2FpdGVyLT5waWQpOworCQkJCWtmcmVlKHdhaXRlcik7CisJCQl9CisJCX0KKworCQl2Y2hpcV9kZWJ1Z2ZzX3JlbW92ZV9pbnN0YW5jZShpbnN0YW5jZSk7CisKKwkJa2ZyZWUoaW5zdGFuY2UpOworCQlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCX0gYnJlYWs7CisKKwlkZWZhdWx0OgorCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCSJVbmtub3duIG1pbm9yIGRldmljZTogJWQiLCBkZXYpOworCQlyZXQgPSAtRU5YSU87CisJfQorCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICB2Y2hpcV9kdW1wCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQKK3ZjaGlxX2R1bXAodm9pZCAqZHVtcF9jb250ZXh0LCBjb25zdCBjaGFyICpzdHIsIGludCBsZW4pCit7CisJRFVNUF9DT05URVhUX1QgKmNvbnRleHQgPSAoRFVNUF9DT05URVhUX1QgKilkdW1wX2NvbnRleHQ7CisKKwlpZiAoY29udGV4dC0+YWN0dWFsIDwgY29udGV4dC0+c3BhY2UpIHsKKwkJaW50IGNvcHlfYnl0ZXM7CisJCWlmIChjb250ZXh0LT5vZmZzZXQgPiAwKSB7CisJCQlpbnQgc2tpcF9ieXRlcyA9IG1pbihsZW4sIChpbnQpY29udGV4dC0+b2Zmc2V0KTsKKwkJCXN0ciArPSBza2lwX2J5dGVzOworCQkJbGVuIC09IHNraXBfYnl0ZXM7CisJCQljb250ZXh0LT5vZmZzZXQgLT0gc2tpcF9ieXRlczsKKwkJCWlmIChjb250ZXh0LT5vZmZzZXQgPiAwKQorCQkJCXJldHVybjsKKwkJfQorCQljb3B5X2J5dGVzID0gbWluKGxlbiwgKGludCkoY29udGV4dC0+c3BhY2UgLSBjb250ZXh0LT5hY3R1YWwpKTsKKwkJaWYgKGNvcHlfYnl0ZXMgPT0gMCkKKwkJCXJldHVybjsKKwkJaWYgKGNvcHlfdG9fdXNlcihjb250ZXh0LT5idWYgKyBjb250ZXh0LT5hY3R1YWwsIHN0ciwKKwkJCWNvcHlfYnl0ZXMpKQorCQkJY29udGV4dC0+YWN0dWFsID0gLUVGQVVMVDsKKwkJY29udGV4dC0+YWN0dWFsICs9IGNvcHlfYnl0ZXM7CisJCWxlbiAtPSBjb3B5X2J5dGVzOworCisJCS8qIElmIHRuZSB0ZXJtaW5hdGluZyBOVUwgaXMgaW5jbHVkZWQgaW4gdGhlIGxlbmd0aCwgdGhlbiBpdAorCQkqKiBtYXJrcyB0aGUgZW5kIG9mIGEgbGluZSBhbmQgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggYQorCQkqKiBjYXJyaWFnZSByZXR1cm4uICovCisJCWlmICgobGVuID09IDApICYmIChzdHJbY29weV9ieXRlcyAtIDFdID09ICdcMCcpKSB7CisJCQljaGFyIGNyID0gJ1xuJzsKKwkJCWlmIChjb3B5X3RvX3VzZXIoY29udGV4dC0+YnVmICsgY29udGV4dC0+YWN0dWFsIC0gMSwKKwkJCQkmY3IsIDEpKQorCQkJCWNvbnRleHQtPmFjdHVhbCA9IC1FRkFVTFQ7CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgdmNoaXFfZHVtcF9wbGF0Zm9ybV9pbnN0YW5jZV9zdGF0ZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCit2Y2hpcV9kdW1wX3BsYXRmb3JtX2luc3RhbmNlcyh2b2lkICpkdW1wX2NvbnRleHQpCit7CisJVkNISVFfU1RBVEVfVCAqc3RhdGUgPSB2Y2hpcV9nZXRfc3RhdGUoKTsKKwljaGFyIGJ1Zls4MF07CisJaW50IGxlbjsKKwlpbnQgaTsKKworCS8qIFRoZXJlIGlzIG5vIGxpc3Qgb2YgaW5zdGFuY2VzLCBzbyBpbnN0ZWFkIHNjYW4gYWxsIHNlcnZpY2VzLAorCQltYXJraW5nIHRob3NlIHRoYXQgaGF2ZSBiZWVuIGR1bXBlZC4gKi8KKworCWZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+dW51c2VkX3NlcnZpY2U7IGkrKykgeworCQlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UgPSBzdGF0ZS0+c2VydmljZXNbaV07CisJCVZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2U7CisKKwkJaWYgKHNlcnZpY2UgJiYgKHNlcnZpY2UtPmJhc2UuY2FsbGJhY2sgPT0gc2VydmljZV9jYWxsYmFjaykpIHsKKwkJCWluc3RhbmNlID0gc2VydmljZS0+aW5zdGFuY2U7CisJCQlpZiAoaW5zdGFuY2UpCisJCQkJaW5zdGFuY2UtPm1hcmsgPSAwOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IHN0YXRlLT51bnVzZWRfc2VydmljZTsgaSsrKSB7CisJCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IHN0YXRlLT5zZXJ2aWNlc1tpXTsKKwkJVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZTsKKworCQlpZiAoc2VydmljZSAmJiAoc2VydmljZS0+YmFzZS5jYWxsYmFjayA9PSBzZXJ2aWNlX2NhbGxiYWNrKSkgeworCQkJaW5zdGFuY2UgPSBzZXJ2aWNlLT5pbnN0YW5jZTsKKwkJCWlmIChpbnN0YW5jZSAmJiAhaW5zdGFuY2UtPm1hcmspIHsKKwkJCQlsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLAorCQkJCQkiSW5zdGFuY2UgJXg6IHBpZCAlZCwlcyBjb21wbGV0aW9ucyAiCisJCQkJCQkiJWQvJWQiLAorCQkJCQkodW5zaWduZWQgaW50KWluc3RhbmNlLCBpbnN0YW5jZS0+cGlkLAorCQkJCQlpbnN0YW5jZS0+Y29ubmVjdGVkID8gIiBjb25uZWN0ZWQsICIgOgorCQkJCQkJIiIsCisJCQkJCWluc3RhbmNlLT5jb21wbGV0aW9uX2luc2VydCAtCisJCQkJCQlpbnN0YW5jZS0+Y29tcGxldGlvbl9yZW1vdmUsCisJCQkJCU1BWF9DT01QTEVUSU9OUyk7CisKKwkJCQl2Y2hpcV9kdW1wKGR1bXBfY29udGV4dCwgYnVmLCBsZW4gKyAxKTsKKworCQkJCWluc3RhbmNlLT5tYXJrID0gMTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICB2Y2hpcV9kdW1wX3BsYXRmb3JtX3NlcnZpY2Vfc3RhdGUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAordmNoaXFfZHVtcF9wbGF0Zm9ybV9zZXJ2aWNlX3N0YXRlKHZvaWQgKmR1bXBfY29udGV4dCwgVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlKQoreworCVVTRVJfU0VSVklDRV9UICp1c2VyX3NlcnZpY2UgPSAoVVNFUl9TRVJWSUNFX1QgKilzZXJ2aWNlLT5iYXNlLnVzZXJkYXRhOworCWNoYXIgYnVmWzgwXTsKKwlpbnQgbGVuOworCisJbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiAgaW5zdGFuY2UgJXgiLAorCQkodW5zaWduZWQgaW50KXNlcnZpY2UtPmluc3RhbmNlKTsKKworCWlmICgoc2VydmljZS0+YmFzZS5jYWxsYmFjayA9PSBzZXJ2aWNlX2NhbGxiYWNrKSAmJgorCQl1c2VyX3NlcnZpY2UtPmlzX3ZjaGkpIHsKKwkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sCisJCQkiLCAlZC8lZCBtZXNzYWdlcyIsCisJCQl1c2VyX3NlcnZpY2UtPm1zZ19pbnNlcnQgLSB1c2VyX3NlcnZpY2UtPm1zZ19yZW1vdmUsCisJCQlNU0dfUVVFVUVfU0laRSk7CisKKwkJaWYgKHVzZXJfc2VydmljZS0+ZGVxdWV1ZV9wZW5kaW5nKQorCQkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sCisJCQkJIiAoZGVxdWV1ZSBwZW5kaW5nKSIpOworCX0KKworCXZjaGlxX2R1bXAoZHVtcF9jb250ZXh0LCBidWYsIGxlbiArIDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIGR1bXBfdXNlcl9tZW0KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2R1bXBfcGh5c19tZW0odm9pZCAqdmlydF9hZGRyLCB1aW50MzJfdCBudW1fYnl0ZXMpCit7CisJaW50ICAgICAgICAgICAgcmM7CisJdWludDhfdCAgICAgICAqZW5kX3ZpcnRfYWRkciA9IHZpcnRfYWRkciArIG51bV9ieXRlczsKKwlpbnQgICAgICAgICAgICBudW1fcGFnZXM7CisJaW50ICAgICAgICAgICAgb2Zmc2V0OworCWludCAgICAgICAgICAgIGVuZF9vZmZzZXQ7CisJaW50ICAgICAgICAgICAgcGFnZV9pZHg7CisJaW50ICAgICAgICAgICAgcHJldl9pZHg7CisJc3RydWN0IHBhZ2UgICAqcGFnZTsKKwlzdHJ1Y3QgcGFnZSAgKipwYWdlczsKKwl1aW50OF90ICAgICAgICprbWFwcGVkX3ZpcnRfcHRyOworCisJLyogQWxpZ24gdmlydEFkZHIgYW5kIGVuZFZpcnRBZGRyIHRvIDE2IGJ5dGUgYm91bmRhcmllcy4gKi8KKworCXZpcnRfYWRkciA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXZpcnRfYWRkciAmIH4weDBmdUwpOworCWVuZF92aXJ0X2FkZHIgPSAodm9pZCAqKSgoKHVuc2lnbmVkIGxvbmcpZW5kX3ZpcnRfYWRkciArIDE1dUwpICYKKwkJfjB4MGZ1TCk7CisKKwlvZmZzZXQgPSAoaW50KShsb25nKXZpcnRfYWRkciAmIChQQUdFX1NJWkUgLSAxKTsKKwllbmRfb2Zmc2V0ID0gKGludCkobG9uZyllbmRfdmlydF9hZGRyICYgKFBBR0VfU0laRSAtIDEpOworCisJbnVtX3BhZ2VzID0gKG9mZnNldCArIG51bV9ieXRlcyArIFBBR0VfU0laRSAtIDEpIC8gUEFHRV9TSVpFOworCisJcGFnZXMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGFnZSAqKSAqIG51bV9wYWdlcywgR0ZQX0tFUk5FTCk7CisJaWYgKHBhZ2VzID09IE5VTEwpIHsKKwkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkiVW5hYmxlIHRvIGFsbG9jYXRpb24gbWVtb3J5IGZvciAlZCBwYWdlc1xuIiwKKwkJCW51bV9wYWdlcyk7CisJCXJldHVybjsKKwl9CisKKwlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJcmMgPSBnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCAgICAgIC8qIHRhc2sgKi8KKwkJY3VycmVudC0+bW0sICAgICAgICAgICAgICAvKiBtbSAqLworCQkodW5zaWduZWQgbG9uZyl2aXJ0X2FkZHIsIC8qIHN0YXJ0ICovCisJCW51bV9wYWdlcywgICAgICAgICAgICAgICAgLyogbGVuICovCisJCTAsICAgICAgICAgICAgICAgICAgICAgICAgLyogd3JpdGUgKi8KKwkJMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3JjZSAqLworCQlwYWdlcywgICAgICAgICAgICAgICAgICAgIC8qIHBhZ2VzIChhcnJheSBvZiBwYWdlIHBvaW50ZXJzKSAqLworCQlOVUxMKTsgICAgICAgICAgICAgICAgICAgIC8qIHZtYXMgKi8KKwl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCisJcHJldl9pZHggPSAtMTsKKwlwYWdlID0gTlVMTDsKKworCXdoaWxlIChvZmZzZXQgPCBlbmRfb2Zmc2V0KSB7CisKKwkJaW50IHBhZ2Vfb2Zmc2V0ID0gb2Zmc2V0ICUgUEFHRV9TSVpFOworCQlwYWdlX2lkeCA9IG9mZnNldCAvIFBBR0VfU0laRTsKKworCQlpZiAocGFnZV9pZHggIT0gcHJldl9pZHgpIHsKKworCQkJaWYgKHBhZ2UgIT0gTlVMTCkKKwkJCQlrdW5tYXAocGFnZSk7CisJCQlwYWdlID0gcGFnZXNbcGFnZV9pZHhdOworCQkJa21hcHBlZF92aXJ0X3B0ciA9IGttYXAocGFnZSk7CisKKwkJCXByZXZfaWR4ID0gcGFnZV9pZHg7CisJCX0KKworCQlpZiAodmNoaXFfYXJtX2xvZ19sZXZlbCA+PSBWQ0hJUV9MT0dfVFJBQ0UpCisJCQl2Y2hpcV9sb2dfZHVtcF9tZW0oInBoIiwKKwkJCQkodWludDMyX3QpKHVuc2lnbmVkIGxvbmcpJmttYXBwZWRfdmlydF9wdHJbCisJCQkJCXBhZ2Vfb2Zmc2V0XSwKKwkJCQkma21hcHBlZF92aXJ0X3B0cltwYWdlX29mZnNldF0sIDE2KTsKKworCQlvZmZzZXQgKz0gMTY7CisJfQorCWlmIChwYWdlICE9IE5VTEwpCisJCWt1bm1hcChwYWdlKTsKKworCWZvciAocGFnZV9pZHggPSAwOyBwYWdlX2lkeCA8IG51bV9wYWdlczsgcGFnZV9pZHgrKykKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2VzW3BhZ2VfaWR4XSk7CisKKwlrZnJlZShwYWdlcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgdmNoaXFfcmVhZAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3NpemVfdAordmNoaXFfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlEVU1QX0NPTlRFWFRfVCBjb250ZXh0OworCWNvbnRleHQuYnVmID0gYnVmOworCWNvbnRleHQuYWN0dWFsID0gMDsKKwljb250ZXh0LnNwYWNlID0gY291bnQ7CisJY29udGV4dC5vZmZzZXQgPSAqcHBvczsKKworCXZjaGlxX2R1bXBfc3RhdGUoJmNvbnRleHQsICZnX3N0YXRlKTsKKworCSpwcG9zICs9IGNvbnRleHQuYWN0dWFsOworCisJcmV0dXJuIGNvbnRleHQuYWN0dWFsOworfQorCitWQ0hJUV9TVEFURV9UICoKK3ZjaGlxX2dldF9zdGF0ZSh2b2lkKQoreworCisJaWYgKGdfc3RhdGUucmVtb3RlID09IE5VTEwpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGdfc3RhdGUucmVtb3RlID09IE5VTExcbiIsIF9fZnVuY19fKTsKKwllbHNlIGlmIChnX3N0YXRlLnJlbW90ZS0+aW5pdGlhbGlzZWQgIT0gMSkKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogZ19zdGF0ZS5yZW1vdGUtPmluaXRpYWxpc2VkICE9IDEgKCVkKVxuIiwKKwkJCV9fZnVuY19fLCBnX3N0YXRlLnJlbW90ZS0+aW5pdGlhbGlzZWQpOworCisJcmV0dXJuICgoZ19zdGF0ZS5yZW1vdGUgIT0gTlVMTCkgJiYKKwkJKGdfc3RhdGUucmVtb3RlLT5pbml0aWFsaXNlZCA9PSAxKSkgPyAmZ19zdGF0ZSA6IE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zCit2Y2hpcV9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS51bmxvY2tlZF9pb2N0bCA9IHZjaGlxX2lvY3RsLAorCS5vcGVuID0gdmNoaXFfb3BlbiwKKwkucmVsZWFzZSA9IHZjaGlxX3JlbGVhc2UsCisJLnJlYWQgPSB2Y2hpcV9yZWFkCit9OworCisvKgorICogQXV0b3N1c3BlbmQgcmVsYXRlZCBmdW5jdGlvbmFsaXR5CisgKi8KKworaW50Cit2Y2hpcV92aWRlb2NvcmVfd2FudGVkKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCVZDSElRX0FSTV9TVEFURV9UICphcm1fc3RhdGUgPSB2Y2hpcV9wbGF0Zm9ybV9nZXRfYXJtX3N0YXRlKHN0YXRlKTsKKwlpZiAoIWFybV9zdGF0ZSkKKwkJLyogYXV0b3N1c3BlbmQgbm90IHN1cHBvcnRlZCAtIGFsd2F5cyByZXR1cm4gd2FudGVkICovCisJCXJldHVybiAxOworCWVsc2UgaWYgKGFybV9zdGF0ZS0+YmxvY2tlZF9jb3VudCkKKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAoIWFybV9zdGF0ZS0+dmlkZW9jb3JlX3VzZV9jb3VudCkKKwkJLyogdXNhZ2UgY291bnQgemVybyAtIGNoZWNrIGZvciBvdmVycmlkZSB1bmxlc3Mgd2UncmUgZm9yY2luZyAqLworCQlpZiAoYXJtX3N0YXRlLT5yZXN1bWVfYmxvY2tlZCkKKwkJCXJldHVybiAwOworCQllbHNlCisJCQlyZXR1cm4gdmNoaXFfcGxhdGZvcm1fdmlkZW9jb3JlX3dhbnRlZChzdGF0ZSk7CisJZWxzZQorCQkvKiBub24temVybyB1c2FnZSBjb3VudCAtIHZpZGVvY29yZSBzdGlsbCByZXF1aXJlZCAqLworCQlyZXR1cm4gMTsKK30KKworc3RhdGljIFZDSElRX1NUQVRVU19UCit2Y2hpcV9rZWVwYWxpdmVfdmNoaXFfY2FsbGJhY2soVkNISVFfUkVBU09OX1QgcmVhc29uLAorCVZDSElRX0hFQURFUl9UICpoZWFkZXIsCisJVkNISVFfU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlX3VzZXIsCisJdm9pZCAqYnVsa191c2VyKQoreworCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9zdXNwX2xvZ19sZXZlbCwKKwkJIiVzIGNhbGxiYWNrIHJlYXNvbiAlZCIsIF9fZnVuY19fLCByZWFzb24pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit2Y2hpcV9rZWVwYWxpdmVfdGhyZWFkX2Z1bmModm9pZCAqdikKK3sKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZSA9IChWQ0hJUV9TVEFURV9UICopIHY7CisJVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZSA9IHZjaGlxX3BsYXRmb3JtX2dldF9hcm1fc3RhdGUoc3RhdGUpOworCisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzOworCVZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2U7CisJVkNISVFfU0VSVklDRV9IQU5ETEVfVCBrYV9oYW5kbGU7CisKKwlWQ0hJUV9TRVJWSUNFX1BBUkFNU19UIHBhcmFtcyA9IHsKKwkJLmZvdXJjYyAgICAgID0gVkNISVFfTUFLRV9GT1VSQ0MoJ0snLCAnRScsICdFJywgJ1AnKSwKKwkJLmNhbGxiYWNrICAgID0gdmNoaXFfa2VlcGFsaXZlX3ZjaGlxX2NhbGxiYWNrLAorCQkudmVyc2lvbiAgICAgPSBLRUVQQUxJVkVfVkVSLAorCQkudmVyc2lvbl9taW4gPSBLRUVQQUxJVkVfVkVSX01JTgorCX07CisKKwlzdGF0dXMgPSB2Y2hpcV9pbml0aWFsaXNlKCZpbnN0YW5jZSk7CisJaWYgKHN0YXR1cyAhPSBWQ0hJUV9TVUNDRVNTKSB7CisJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9zdXNwX2xvZ19sZXZlbCwKKwkJCSIlcyB2Y2hpcV9pbml0aWFsaXNlIGZhaWxlZCAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOworCQlnb3RvIGV4aXQ7CisJfQorCisJc3RhdHVzID0gdmNoaXFfY29ubmVjdChpbnN0YW5jZSk7CisJaWYgKHN0YXR1cyAhPSBWQ0hJUV9TVUNDRVNTKSB7CisJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9zdXNwX2xvZ19sZXZlbCwKKwkJCSIlcyB2Y2hpcV9jb25uZWN0IGZhaWxlZCAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOworCQlnb3RvIHNodXRkb3duOworCX0KKworCXN0YXR1cyA9IHZjaGlxX2FkZF9zZXJ2aWNlKGluc3RhbmNlLCAmcGFyYW1zLCAma2FfaGFuZGxlKTsKKwlpZiAoc3RhdHVzICE9IFZDSElRX1NVQ0NFU1MpIHsKKwkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkJIiVzIHZjaGlxX29wZW5fc2VydmljZSBmYWlsZWQgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKKwkJZ290byBzaHV0ZG93bjsKKwl9CisKKwl3aGlsZSAoMSkgeworCQlsb25nIHJjID0gMCwgdWMgPSAwOworCQlpZiAod2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZhcm1fc3RhdGUtPmthX2V2dCkKKwkJCQkhPSAwKSB7CisJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCQkJIiVzIGludGVycnVwdGVkIiwgX19mdW5jX18pOworCQkJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogcmVhZCBhbmQgY2xlYXIgY291bnRlcnMuICBEbyByZWxlYXNlX2NvdW50IHRoZW4gdXNlX2NvdW50IHRvCisJCSAqIHByZXZlbnQgZ2V0dGluZyBtb3JlIHJlbGVhc2VzIHRoYW4gdXNlcyAqLworCQlyYyA9IGF0b21pY194Y2hnKCZhcm1fc3RhdGUtPmthX3JlbGVhc2VfY291bnQsIDApOworCQl1YyA9IGF0b21pY194Y2hnKCZhcm1fc3RhdGUtPmthX3VzZV9jb3VudCwgMCk7CisKKwkJLyogQ2FsbCB1c2UvcmVsZWFzZSBzZXJ2aWNlIHRoZSByZXF1aXNpdGUgbnVtYmVyIG9mIHRpbWVzLgorCQkgKiBQcm9jZXNzIHVzZSBiZWZvcmUgcmVsZWFzZSBzbyB1c2UgY291bnRzIGRvbid0IGdvIG5lZ2F0aXZlICovCisJCXdoaWxlICh1Yy0tKSB7CisJCQlhdG9taWNfaW5jKCZhcm1fc3RhdGUtPmthX3VzZV9hY2tfY291bnQpOworCQkJc3RhdHVzID0gdmNoaXFfdXNlX3NlcnZpY2Uoa2FfaGFuZGxlKTsKKwkJCWlmIChzdGF0dXMgIT0gVkNISVFfU1VDQ0VTUykgeworCQkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9zdXNwX2xvZ19sZXZlbCwKKwkJCQkJIiVzIHZjaGlxX3VzZV9zZXJ2aWNlIGVycm9yICVkIiwKKwkJCQkJX19mdW5jX18sIHN0YXR1cyk7CisJCQl9CisJCX0KKwkJd2hpbGUgKHJjLS0pIHsKKwkJCXN0YXR1cyA9IHZjaGlxX3JlbGVhc2Vfc2VydmljZShrYV9oYW5kbGUpOworCQkJaWYgKHN0YXR1cyAhPSBWQ0hJUV9TVUNDRVNTKSB7CisJCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkJCQkiJXMgdmNoaXFfcmVsZWFzZV9zZXJ2aWNlIGVycm9yICVkIiwKKwkJCQkJX19mdW5jX18sIHN0YXR1cyk7CisJCQl9CisJCX0KKwl9CisKK3NodXRkb3duOgorCXZjaGlxX3NodXRkb3duKGluc3RhbmNlKTsKK2V4aXQ6CisJcmV0dXJuIDA7Cit9CisKKworCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfYXJtX2luaXRfc3RhdGUoVkNISVFfU1RBVEVfVCAqc3RhdGUsIFZDSElRX0FSTV9TVEFURV9UICphcm1fc3RhdGUpCit7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzID0gVkNISVFfU1VDQ0VTUzsKKworCWlmIChhcm1fc3RhdGUpIHsKKwkJcndsb2NrX2luaXQoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisKKwkJaW5pdF9jb21wbGV0aW9uKCZhcm1fc3RhdGUtPmthX2V2dCk7CisJCWF0b21pY19zZXQoJmFybV9zdGF0ZS0+a2FfdXNlX2NvdW50LCAwKTsKKwkJYXRvbWljX3NldCgmYXJtX3N0YXRlLT5rYV91c2VfYWNrX2NvdW50LCAwKTsKKwkJYXRvbWljX3NldCgmYXJtX3N0YXRlLT5rYV9yZWxlYXNlX2NvdW50LCAwKTsKKworCQlpbml0X2NvbXBsZXRpb24oJmFybV9zdGF0ZS0+dmNfc3VzcGVuZF9jb21wbGV0ZSk7CisKKwkJaW5pdF9jb21wbGV0aW9uKCZhcm1fc3RhdGUtPnZjX3Jlc3VtZV9jb21wbGV0ZSk7CisJCS8qIEluaXRpYWxpc2UgdG8gJ2RvbmUnIHN0YXRlLiAgV2Ugb25seSB3YW50IHRvIGJsb2NrIG9uIHJlc3VtZQorCQkgKiBjb21wbGV0aW9uIHdoaWxlIHZpZGVvY29yZSBpcyBzdXNwZW5kZWQuICovCisJCXNldF9yZXN1bWVfc3RhdGUoYXJtX3N0YXRlLCBWQ19SRVNVTUVfUkVTVU1FRCk7CisKKwkJaW5pdF9jb21wbGV0aW9uKCZhcm1fc3RhdGUtPnJlc3VtZV9ibG9ja2VyKTsKKwkJLyogSW5pdGlhbGlzZSB0byAnZG9uZScgc3RhdGUuICBXZSBvbmx5IHdhbnQgdG8gYmxvY2sgb24gdGhpcworCQkgKiBjb21wbGV0aW9uIHdoaWxlIHJlc3VtZSBpcyBibG9ja2VkICovCisJCWNvbXBsZXRlX2FsbCgmYXJtX3N0YXRlLT5yZXN1bWVfYmxvY2tlcik7CisKKwkJaW5pdF9jb21wbGV0aW9uKCZhcm1fc3RhdGUtPmJsb2NrZWRfYmxvY2tlcik7CisJCS8qIEluaXRpYWxpc2UgdG8gJ2RvbmUnIHN0YXRlLiAgV2Ugb25seSB3YW50IHRvIGJsb2NrIG9uIHRoaXMKKwkJICogY29tcGxldGlvbiB3aGlsZSB0aGluZ3MgYXJlIHdhaXRpbmcgb24gdGhlIHJlc3VtZSBibG9ja2VyICovCisJCWNvbXBsZXRlX2FsbCgmYXJtX3N0YXRlLT5ibG9ja2VkX2Jsb2NrZXIpOworCisJCWFybV9zdGF0ZS0+c3VzcGVuZF90aW1lcl90aW1lb3V0ID0gU1VTUEVORF9USU1FUl9USU1FT1VUX01TOworCQlhcm1fc3RhdGUtPnN1c3BlbmRfdGltZXJfcnVubmluZyA9IDA7CisJCWluaXRfdGltZXIoJmFybV9zdGF0ZS0+c3VzcGVuZF90aW1lcik7CisJCWFybV9zdGF0ZS0+c3VzcGVuZF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpKHN0YXRlKTsKKwkJYXJtX3N0YXRlLT5zdXNwZW5kX3RpbWVyLmZ1bmN0aW9uID0gc3VzcGVuZF90aW1lcl9jYWxsYmFjazsKKworCQlhcm1fc3RhdGUtPmZpcnN0X2Nvbm5lY3QgPSAwOworCisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisqKiBGdW5jdGlvbnMgdG8gbW9kaWZ5IHRoZSBzdGF0ZSB2YXJpYWJsZXM7CisqKglzZXRfc3VzcGVuZF9zdGF0ZQorKioJc2V0X3Jlc3VtZV9zdGF0ZQorKioKKyoqIFRoZXJlIGFyZSBtb3JlIHN0YXRlIHZhcmlhYmxlcyB0aGFuIHdlIG1pZ2h0IGxpa2UsIHNvIGVuc3VyZSB0aGV5IHJlbWFpbiBpbgorKiogc3RlcC4gIFN1c3BlbmQgYW5kIHJlc3VtZSBzdGF0ZSBhcmUgbWFpbnRhaW5lZCBzZXBhcmF0ZWx5LCBzaW5jZSBtb3N0IG9mCisqKiB0aGVzZSBzdGF0ZSBtYWNoaW5lcyBjYW4gb3BlcmF0ZSBpbmRlcGVuZGVudGx5LiAgSG93ZXZlciwgdGhlcmUgYXJlIGEgZmV3CisqKiBzdGF0ZXMgd2hlcmUgc3RhdGUgdHJhbnNpdGlvbnMgaW4gb25lIHN0YXRlIG1hY2hpbmUgY2F1c2UgYSByZXNldCB0byB0aGUKKyoqIG90aGVyIHN0YXRlIG1hY2hpbmUuICBJbiBhZGRpdGlvbiwgdGhlcmUgYXJlIHNvbWUgY29tcGxldGlvbiBldmVudHMgd2hpY2gKKyoqIG5lZWQgdG8gb2NjdXIgb24gc3RhdGUgbWFjaGluZSByZXNldCBhbmQgZW5kLXN0YXRlKHMpLCBzbyB0aGVzZSBhcmUgYWxzbworKiogZGVhbHQgd2l0aCBpbiB0aGVzZSBmdW5jdGlvbnMuCisqKgorKiogSW4gYWxsIHN0YXRlcyB3ZSBzZXQgdGhlIHN0YXRlIHZhcmlhYmxlIGFjY29yZGluZyB0byB0aGUgaW5wdXQsIGJ1dCBpbiBzb21lCisqKiBjYXNlcyB3ZSBwZXJmb3JtIGFkZGl0aW9uYWwgc3RlcHMgb3V0bGluZWQgYmVsb3c7CisqKgorKiogVkNfU1VTUEVORF9JRExFIC0gSW5pdGlhbGlzZSB0aGUgc3VzcGVuZCBjb21wbGV0aW9uIGF0IHRoZSBzYW1lIHRpbWUuCisqKgkJCVRoZSBzdXNwZW5kIGNvbXBsZXRpb24gaXMgY29tcGxldGVkIGFmdGVyIGFueSBzdXNwZW5kCisqKgkJCWF0dGVtcHQuICBXaGVuIHdlIHJlc2V0IHRoZSBzdGF0ZSBtYWNoaW5lIHdlIGFsc28gcmVzZXQKKyoqCQkJdGhlIGNvbXBsZXRpb24uICBUaGlzIHJlc2V0IG9jY3VycyB3aGVuIHZpZGVvY29yZSBpcworKioJCQlyZXN1bWVkLCBhbmQgYWxzbyBpZiB3ZSBpbml0aWF0ZSBzdXNwZW5kIGFmdGVyIGEgc3VzcGVuZAorKioJCQlmYWlsdXJlLgorKioKKyoqIFZDX1NVU1BFTkRfSU5fUFJPR1JFU1MgLSBUaGlzIHN0YXRlIGlzIGNvbnNpZGVyZWQgdGhlIHBvaW50IG9mIG5vIHJldHVybiBmb3IKKyoqCQkJc3VzcGVuZCAtIGllIGZyb20gdGhpcyBwb2ludCBvbiB3ZSBtdXN0IHRyeSB0byBzdXNwZW5kCisqKgkJCWJlZm9yZSByZXN1bWluZyBjYW4gb2NjdXIuICBXZSB0aGVyZWZvcmUgYWxzbyByZXNldCB0aGUKKyoqCQkJcmVzdW1lIHN0YXRlIG1hY2hpbmUgdG8gVkNfUkVTVU1FX0lETEUgaW4gdGhpcyBzdGF0ZS4KKyoqCisqKiBWQ19TVVNQRU5EX1NVU1BFTkRFRCAtIFN1c3BlbmQgaGFzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIEFsc28gY2FsbAorKioJCQljb21wbGV0ZV9hbGwgb24gdGhlIHN1c3BlbmQgY29tcGxldGlvbiB0byBub3RpZnkKKyoqCQkJYW55dGhpbmcgd2FpdGluZyBmb3Igc3VzcGVuZCB0byBoYXBwZW4uCisqKgorKiogVkNfU1VTUEVORF9SRUpFQ1RFRCAtIFZpZGVvY29yZSByZWplY3RlZCBzdXNwZW5kLiBWaWRlb2NvcmUgd2lsbCBhbHNvCisqKgkJCWluaXRpYXRlIHJlc3VtZSwgc28gbm8gbmVlZCB0byBhbHRlciByZXN1bWUgc3RhdGUuCisqKgkJCVdlIGNhbGwgY29tcGxldGVfYWxsIG9uIHRoZSBzdXNwZW5kIGNvbXBsZXRpb24gdG8gbm90aWZ5CisqKgkJCW9mIHN1c3BlbmQgcmVqZWN0aW9uLgorKioKKyoqIFZDX1NVU1BFTkRfRkFJTEVEIC0gV2UgZmFpbGVkIHRvIGluaXRpYXRlIHZpZGVvY29yZSBzdXNwZW5kLiAgV2Ugbm90aWZ5IHRoZQorKioJCQlzdXNwZW5kIGNvbXBsZXRpb24gYW5kIHJlc2V0IHRoZSByZXN1bWUgc3RhdGUgbWFjaGluZS4KKyoqCisqKiBWQ19SRVNVTUVfSURMRSAtIEluaXRpYWxpc2UgdGhlIHJlc3VtZSBjb21wbGV0aW9uIGF0IHRoZSBzYW1lIHRpbWUuICBUaGUKKyoqCQkJcmVzdW1lIGNvbXBsZXRpb24gaXMgaW4gaXQncyAnZG9uZScgc3RhdGUgd2hlbmV2ZXIKKyoqCQkJdmlkZWNvcmUgaXMgcnVubmluZy4gIFRoZXJmb3JlLCB0aGUgVkNfUkVTVU1FX0lETEUgc3RhdGUKKyoqCQkJaW1wbGllcyB0aGF0IHZpZGVvY29yZSBpcyBzdXNwZW5kZWQuCisqKgkJCUhlbmNlLCBhbnkgdGhyZWFkIHdoaWNoIG5lZWRzIHRvIHdhaXQgdW50aWwgdmlkZW9jb3JlIGlzCisqKgkJCXJ1bm5pbmcgY2FuIHdhaXQgb24gdGhpcyBjb21wbGV0aW9uIC0gaXQgd2lsbCBvbmx5IGJsb2NrCisqKgkJCWlmIHZpZGVvY29yZSBpcyBzdXNwZW5kZWQuCisqKgorKiogVkNfUkVTVU1FX1JFU1VNRUQgLSBSZXN1bWUgaGFzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuICBWaWRlb2NvcmUgaXMgcnVubmluZy4KKyoqCQkJQ2FsbCBjb21wbGV0ZV9hbGwgb24gdGhlIHJlc3VtZSBjb21wbGV0aW9uIHRvIHVuYmxvY2sKKyoqCQkJYW55IHRocmVhZHMgd2FpdGluZyBmb3IgcmVzdW1lLgkgQWxzbyByZXNldCB0aGUgc3VzcGVuZAorKioJCQlzdGF0ZSBtYWNoaW5lIHRvIGl0J3MgaWRsZSBzdGF0ZS4KKyoqCisqKiBWQ19SRVNVTUVfRkFJTEVEIC0gQ3VycmVudGx5IHVudXNlZCAtIG5vIG1lY2hhbmlzbSB0byBmYWlsIHJlc3VtZSBleGlzdHMuCisqLworCit2b2lkCitzZXRfc3VzcGVuZF9zdGF0ZShWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlLAorCWVudW0gdmNfc3VzcGVuZF9zdGF0dXMgbmV3X3N0YXRlKQoreworCS8qIHNldCB0aGUgc3RhdGUgaW4gYWxsIGNhc2VzICovCisJYXJtX3N0YXRlLT52Y19zdXNwZW5kX3N0YXRlID0gbmV3X3N0YXRlOworCisJLyogc3RhdGUgc3BlY2lmaWMgYWRkaXRpb25hbCBhY3Rpb25zICovCisJc3dpdGNoIChuZXdfc3RhdGUpIHsKKwljYXNlIFZDX1NVU1BFTkRfRk9SQ0VfQ0FOQ0VMRUQ6CisJCWNvbXBsZXRlX2FsbCgmYXJtX3N0YXRlLT52Y19zdXNwZW5kX2NvbXBsZXRlKTsKKwkJYnJlYWs7CisJY2FzZSBWQ19TVVNQRU5EX1JFSkVDVEVEOgorCQljb21wbGV0ZV9hbGwoJmFybV9zdGF0ZS0+dmNfc3VzcGVuZF9jb21wbGV0ZSk7CisJCWJyZWFrOworCWNhc2UgVkNfU1VTUEVORF9GQUlMRUQ6CisJCWNvbXBsZXRlX2FsbCgmYXJtX3N0YXRlLT52Y19zdXNwZW5kX2NvbXBsZXRlKTsKKwkJYXJtX3N0YXRlLT52Y19yZXN1bWVfc3RhdGUgPSBWQ19SRVNVTUVfUkVTVU1FRDsKKwkJY29tcGxldGVfYWxsKCZhcm1fc3RhdGUtPnZjX3Jlc3VtZV9jb21wbGV0ZSk7CisJCWJyZWFrOworCWNhc2UgVkNfU1VTUEVORF9JRExFOgorCQlyZWluaXRfY29tcGxldGlvbigmYXJtX3N0YXRlLT52Y19zdXNwZW5kX2NvbXBsZXRlKTsKKwkJYnJlYWs7CisJY2FzZSBWQ19TVVNQRU5EX1JFUVVFU1RFRDoKKwkJYnJlYWs7CisJY2FzZSBWQ19TVVNQRU5EX0lOX1BST0dSRVNTOgorCQlzZXRfcmVzdW1lX3N0YXRlKGFybV9zdGF0ZSwgVkNfUkVTVU1FX0lETEUpOworCQlicmVhazsKKwljYXNlIFZDX1NVU1BFTkRfU1VTUEVOREVEOgorCQljb21wbGV0ZV9hbGwoJmFybV9zdGF0ZS0+dmNfc3VzcGVuZF9jb21wbGV0ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlicmVhazsKKwl9Cit9CisKK3ZvaWQKK3NldF9yZXN1bWVfc3RhdGUoVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZSwKKwllbnVtIHZjX3Jlc3VtZV9zdGF0dXMgbmV3X3N0YXRlKQoreworCS8qIHNldCB0aGUgc3RhdGUgaW4gYWxsIGNhc2VzICovCisJYXJtX3N0YXRlLT52Y19yZXN1bWVfc3RhdGUgPSBuZXdfc3RhdGU7CisKKwkvKiBzdGF0ZSBzcGVjaWZpYyBhZGRpdGlvbmFsIGFjdGlvbnMgKi8KKwlzd2l0Y2ggKG5ld19zdGF0ZSkgeworCWNhc2UgVkNfUkVTVU1FX0ZBSUxFRDoKKwkJYnJlYWs7CisJY2FzZSBWQ19SRVNVTUVfSURMRToKKwkJcmVpbml0X2NvbXBsZXRpb24oJmFybV9zdGF0ZS0+dmNfcmVzdW1lX2NvbXBsZXRlKTsKKwkJYnJlYWs7CisJY2FzZSBWQ19SRVNVTUVfUkVRVUVTVEVEOgorCQlicmVhazsKKwljYXNlIFZDX1JFU1VNRV9JTl9QUk9HUkVTUzoKKwkJYnJlYWs7CisJY2FzZSBWQ19SRVNVTUVfUkVTVU1FRDoKKwkJY29tcGxldGVfYWxsKCZhcm1fc3RhdGUtPnZjX3Jlc3VtZV9jb21wbGV0ZSk7CisJCXNldF9zdXNwZW5kX3N0YXRlKGFybV9zdGF0ZSwgVkNfU1VTUEVORF9JRExFKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCWJyZWFrOworCX0KK30KKworCisvKiBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIHdyaXRlIGxvY2sgaGVsZCAqLworaW5saW5lIHZvaWQKK3N0YXJ0X3N1c3BlbmRfdGltZXIoVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZSkKK3sKKwlkZWxfdGltZXIoJmFybV9zdGF0ZS0+c3VzcGVuZF90aW1lcik7CisJYXJtX3N0YXRlLT5zdXNwZW5kX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsKKwkJbXNlY3NfdG9famlmZmllcyhhcm1fc3RhdGUtPgorCQkJc3VzcGVuZF90aW1lcl90aW1lb3V0KTsKKwlhZGRfdGltZXIoJmFybV9zdGF0ZS0+c3VzcGVuZF90aW1lcik7CisJYXJtX3N0YXRlLT5zdXNwZW5kX3RpbWVyX3J1bm5pbmcgPSAxOworfQorCisvKiBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIHdyaXRlIGxvY2sgaGVsZCAqLworc3RhdGljIGlubGluZSB2b2lkCitzdG9wX3N1c3BlbmRfdGltZXIoVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZSkKK3sKKwlpZiAoYXJtX3N0YXRlLT5zdXNwZW5kX3RpbWVyX3J1bm5pbmcpIHsKKwkJZGVsX3RpbWVyKCZhcm1fc3RhdGUtPnN1c3BlbmRfdGltZXIpOworCQlhcm1fc3RhdGUtPnN1c3BlbmRfdGltZXJfcnVubmluZyA9IDA7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludAorbmVlZF9yZXN1bWUoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZSA9IHZjaGlxX3BsYXRmb3JtX2dldF9hcm1fc3RhdGUoc3RhdGUpOworCXJldHVybiAoYXJtX3N0YXRlLT52Y19zdXNwZW5kX3N0YXRlID4gVkNfU1VTUEVORF9JRExFKSAmJgorCQkJKGFybV9zdGF0ZS0+dmNfcmVzdW1lX3N0YXRlIDwgVkNfUkVTVU1FX1JFUVVFU1RFRCkgJiYKKwkJCXZjaGlxX3ZpZGVvY29yZV93YW50ZWQoc3RhdGUpOworfQorCitzdGF0aWMgaW50CitibG9ja19yZXN1bWUoVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZSkKK3sKKwlpbnQgc3RhdHVzID0gVkNISVFfU1VDQ0VTUzsKKwljb25zdCB1bnNpZ25lZCBsb25nIHRpbWVvdXRfdmFsID0KKwkJCQltc2Vjc190b19qaWZmaWVzKEZPUkNFX1NVU1BFTkRfVElNRU9VVF9NUyk7CisJaW50IHJlc3VtZV9jb3VudCA9IDA7CisKKwkvKiBBbGxvdyBhbnkgdGhyZWFkcyB3aGljaCB3ZXJlIGJsb2NrZWQgYnkgdGhlIGxhc3QgZm9yY2Ugc3VzcGVuZCB0bworCSAqIGNvbXBsZXRlIGlmIHRoZXkgaGF2ZW4ndCBhbHJlYWR5LiAgT25seSBnaXZlIHRoaXMgb25lIHNob3Q7IGlmCisJICogYmxvY2tlZF9jb3VudCBpcyBpbmNyZW1lbnRlZCBhZnRlciBibG9ja2VkX2Jsb2NrZXIgaXMgY29tcGxldGVkCisJICogKHdoaWNoIG9ubHkgaGFwcGVucyB3aGVuIGJsb2NrZWRfY291bnQgaGl0cyAwKSB0aGVuIHRob3NlIHRocmVhZHMKKwkgKiB3aWxsIGhhdmUgdG8gd2FpdCB1bnRpbCBuZXh0IHRpbWUgYXJvdW5kICovCisJaWYgKGFybV9zdGF0ZS0+YmxvY2tlZF9jb3VudCkgeworCQlyZWluaXRfY29tcGxldGlvbigmYXJtX3N0YXRlLT5ibG9ja2VkX2Jsb2NrZXIpOworCQl3cml0ZV91bmxvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgd2FpdCBmb3IgcHJldmlvdXNseSAiCisJCQkiYmxvY2tlZCBjbGllbnRzIiwgX19mdW5jX18pOworCQlpZiAod2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCisJCQkJJmFybV9zdGF0ZS0+YmxvY2tlZF9ibG9ja2VyLCB0aW1lb3V0X3ZhbCkKKwkJCQkJPD0gMCkgeworCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgd2FpdCBmb3IgIgorCQkJCSJwcmV2aW91c2x5IGJsb2NrZWQgY2xpZW50cyBmYWlsZWQiICwgX19mdW5jX18pOworCQkJc3RhdHVzID0gVkNISVFfRVJST1I7CisJCQl3cml0ZV9sb2NrX2JoKCZhcm1fc3RhdGUtPnN1c3BfcmVzX2xvY2spOworCQkJZ290byBvdXQ7CisJCX0KKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyBwcmV2aW91c2x5IGJsb2NrZWQgIgorCQkJImNsaWVudHMgcmVzdW1lZCIsIF9fZnVuY19fKTsKKwkJd3JpdGVfbG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKwl9CisKKwkvKiBXZSBuZWVkIHRvIHdhaXQgZm9yIHJlc3VtZSB0byBjb21wbGV0ZSBpZiBpdCdzIGluIHByb2Nlc3MgKi8KKwl3aGlsZSAoYXJtX3N0YXRlLT52Y19yZXN1bWVfc3RhdGUgIT0gVkNfUkVTVU1FX1JFU1VNRUQgJiYKKwkJCWFybV9zdGF0ZS0+dmNfcmVzdW1lX3N0YXRlID4gVkNfUkVTVU1FX0lETEUpIHsKKwkJaWYgKHJlc3VtZV9jb3VudCA+IDEpIHsKKwkJCXN0YXR1cyA9IFZDSElRX0VSUk9SOworCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgd2FpdGVkIHRvbyAiCisJCQkJIm1hbnkgdGltZXMgZm9yIHJlc3VtZSIgLCBfX2Z1bmNfXyk7CisJCQlnb3RvIG91dDsKKwkJfQorCQl3cml0ZV91bmxvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgd2FpdCBmb3IgcmVzdW1lIiwKKwkJCV9fZnVuY19fKTsKKwkJaWYgKHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KAorCQkJCSZhcm1fc3RhdGUtPnZjX3Jlc3VtZV9jb21wbGV0ZSwgdGltZW91dF92YWwpCisJCQkJCTw9IDApIHsKKwkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIHdhaXQgZm9yICIKKwkJCQkicmVzdW1lIGZhaWxlZCAoJXMpIiwgX19mdW5jX18sCisJCQkJcmVzdW1lX3N0YXRlX25hbWVzW2FybV9zdGF0ZS0+dmNfcmVzdW1lX3N0YXRlICsKKwkJCQkJCQlWQ19SRVNVTUVfTlVNX09GRlNFVF0pOworCQkJc3RhdHVzID0gVkNISVFfRVJST1I7CisJCQl3cml0ZV9sb2NrX2JoKCZhcm1fc3RhdGUtPnN1c3BfcmVzX2xvY2spOworCQkJZ290byBvdXQ7CisJCX0KKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyByZXN1bWVkIiwgX19mdW5jX18pOworCQl3cml0ZV9sb2NrX2JoKCZhcm1fc3RhdGUtPnN1c3BfcmVzX2xvY2spOworCQlyZXN1bWVfY291bnQrKzsKKwl9CisJcmVpbml0X2NvbXBsZXRpb24oJmFybV9zdGF0ZS0+cmVzdW1lX2Jsb2NrZXIpOworCWFybV9zdGF0ZS0+cmVzdW1lX2Jsb2NrZWQgPSAxOworCitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit1bmJsb2NrX3Jlc3VtZShWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlKQoreworCWNvbXBsZXRlX2FsbCgmYXJtX3N0YXRlLT5yZXN1bWVfYmxvY2tlcik7CisJYXJtX3N0YXRlLT5yZXN1bWVfYmxvY2tlZCA9IDA7Cit9CisKKy8qIEluaXRpYXRlIHN1c3BlbmQgdmlhIHNsb3QgaGFuZGxlci4gU2hvdWxkIGJlIGNhbGxlZCB3aXRoIHRoZSB3cml0ZSBsb2NrCisgKiBoZWxkICovCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfYXJtX3Zjc3VzcGVuZChWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXMgPSBWQ0hJUV9FUlJPUjsKKwlWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlID0gdmNoaXFfcGxhdGZvcm1fZ2V0X2FybV9zdGF0ZShzdGF0ZSk7CisKKwlpZiAoIWFybV9zdGF0ZSkKKwkJZ290byBvdXQ7CisKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyIsIF9fZnVuY19fKTsKKwlzdGF0dXMgPSBWQ0hJUV9TVUNDRVNTOworCisKKwlzd2l0Y2ggKGFybV9zdGF0ZS0+dmNfc3VzcGVuZF9zdGF0ZSkgeworCWNhc2UgVkNfU1VTUEVORF9SRVFVRVNURUQ6CisJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXM6IHN1c3BlbmQgYWxyZWFkeSAiCisJCQkicmVxdWVzdGVkIiwgX19mdW5jX18pOworCQlicmVhazsKKwljYXNlIFZDX1NVU1BFTkRfSU5fUFJPR1JFU1M6CisJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXM6IHN1c3BlbmQgYWxyZWFkeSBpbiAiCisJCQkicHJvZ3Jlc3MiLCBfX2Z1bmNfXyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogV2UgZG9uJ3QgZXhwZWN0IHRvIGJlIGluIG90aGVyIHN0YXRlcywgc28gbG9nIGJ1dCBjb250aW51ZQorCQkgKiBhbnl3YXkgKi8KKwkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkJIiVzIHVuZXhwZWN0ZWQgc3VzcGVuZCBzdGF0ZSAlcyIsIF9fZnVuY19fLAorCQkJc3VzcGVuZF9zdGF0ZV9uYW1lc1thcm1fc3RhdGUtPnZjX3N1c3BlbmRfc3RhdGUgKworCQkJCQkJVkNfU1VTUEVORF9OVU1fT0ZGU0VUXSk7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgVkNfU1VTUEVORF9SRUpFQ1RFRDoKKwljYXNlIFZDX1NVU1BFTkRfRkFJTEVEOgorCQkvKiBFbnN1cmUgYW55IGlkbGUgc3RhdGUgYWN0aW9ucyBoYXZlIGJlZW4gcnVuICovCisJCXNldF9zdXNwZW5kX3N0YXRlKGFybV9zdGF0ZSwgVkNfU1VTUEVORF9JRExFKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBWQ19TVVNQRU5EX0lETEU6CisJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkJIiVzOiBzdXNwZW5kaW5nIiwgX19mdW5jX18pOworCQlzZXRfc3VzcGVuZF9zdGF0ZShhcm1fc3RhdGUsIFZDX1NVU1BFTkRfUkVRVUVTVEVEKTsKKwkJLyoga2ljayB0aGUgc2xvdCBoYW5kbGVyIHRocmVhZCB0byBpbml0aWF0ZSBzdXNwZW5kICovCisJCXJlcXVlc3RfcG9sbChzdGF0ZSwgTlVMTCwgMCk7CisJCWJyZWFrOworCX0KKworb3V0OgorCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIGV4aXQgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkCit2Y2hpcV9wbGF0Zm9ybV9jaGVja19zdXNwZW5kKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCVZDSElRX0FSTV9TVEFURV9UICphcm1fc3RhdGUgPSB2Y2hpcV9wbGF0Zm9ybV9nZXRfYXJtX3N0YXRlKHN0YXRlKTsKKwlpbnQgc3VzcCA9IDA7CisKKwlpZiAoIWFybV9zdGF0ZSkKKwkJZ290byBvdXQ7CisKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyIsIF9fZnVuY19fKTsKKworCXdyaXRlX2xvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisJaWYgKGFybV9zdGF0ZS0+dmNfc3VzcGVuZF9zdGF0ZSA9PSBWQ19TVVNQRU5EX1JFUVVFU1RFRCAmJgorCQkJYXJtX3N0YXRlLT52Y19yZXN1bWVfc3RhdGUgPT0gVkNfUkVTVU1FX1JFU1VNRUQpIHsKKwkJc2V0X3N1c3BlbmRfc3RhdGUoYXJtX3N0YXRlLCBWQ19TVVNQRU5EX0lOX1BST0dSRVNTKTsKKwkJc3VzcCA9IDE7CisJfQorCXdyaXRlX3VubG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKworCWlmIChzdXNwKQorCQl2Y2hpcV9wbGF0Zm9ybV9zdXNwZW5kKHN0YXRlKTsKKworb3V0OgorCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIGV4aXQiLCBfX2Z1bmNfXyk7CisJcmV0dXJuOworfQorCisKK3N0YXRpYyB2b2lkCitvdXRwdXRfdGltZW91dF9lcnJvcihWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKKwlWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlID0gdmNoaXFfcGxhdGZvcm1fZ2V0X2FybV9zdGF0ZShzdGF0ZSk7CisJY2hhciBzZXJ2aWNlX2Vycls1MF0gPSAiIjsKKwlpbnQgdmNfdXNlX2NvdW50ID0gYXJtX3N0YXRlLT52aWRlb2NvcmVfdXNlX2NvdW50OworCWludCBhY3RpdmVfc2VydmljZXMgPSBzdGF0ZS0+dW51c2VkX3NlcnZpY2U7CisJaW50IGk7CisKKwlpZiAoIWFybV9zdGF0ZS0+dmlkZW9jb3JlX3VzZV9jb3VudCkgeworCQlzbnByaW50ZihzZXJ2aWNlX2VyciwgNTAsICIgVmlkZW9jb3JlIHVzZWNvdW50IGlzIDAiKTsKKwkJZ290byBvdXRwdXRfbXNnOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgYWN0aXZlX3NlcnZpY2VzOyBpKyspIHsKKwkJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlX3B0ciA9IHN0YXRlLT5zZXJ2aWNlc1tpXTsKKwkJaWYgKHNlcnZpY2VfcHRyICYmIHNlcnZpY2VfcHRyLT5zZXJ2aWNlX3VzZV9jb3VudCAmJgorCQkJKHNlcnZpY2VfcHRyLT5zcnZzdGF0ZSAhPSBWQ0hJUV9TUlZTVEFURV9GUkVFKSkgeworCQkJc25wcmludGYoc2VydmljZV9lcnIsIDUwLCAiICVjJWMlYyVjKCVkKSBzZXJ2aWNlIGhhcyAiCisJCQkJInVzZSBjb3VudCAlZCVzIiwgVkNISVFfRk9VUkNDX0FTXzRDSEFSUygKKwkJCQkJc2VydmljZV9wdHItPmJhc2UuZm91cmNjKSwKKwkJCQkgc2VydmljZV9wdHItPmNsaWVudF9pZCwKKwkJCQkgc2VydmljZV9wdHItPnNlcnZpY2VfdXNlX2NvdW50LAorCQkJCSBzZXJ2aWNlX3B0ci0+c2VydmljZV91c2VfY291bnQgPT0KKwkJCQkJIHZjX3VzZV9jb3VudCA/ICIiIDogIiAoKyBtb3JlKSIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKK291dHB1dF9tc2c6CisJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkidGltZWQgb3V0IHdhaXRpbmcgZm9yIHZjIHN1c3BlbmQgKCVkKS4lcyIsCisJCSBhcm1fc3RhdGUtPmF1dG9zdXNwZW5kX292ZXJyaWRlLCBzZXJ2aWNlX2Vycik7CisKK30KKworLyogVHJ5IHRvIGdldCB2aWRlb2NvcmUgaW50byBzdXNwZW5kZWQgc3RhdGUsIHJlZ2FyZGxlc3Mgb2YgYXV0b3N1c3BlbmQgc3RhdGUuCisqKiBXZSBkb24ndCBhY3R1YWxseSBmb3JjZSBzdXNwZW5kLCBzaW5jZSB2aWRlb2NvcmUgbWF5IGdldCBpbnRvIGEgYmFkIHN0YXRlCisqKiBpZiB3ZSBmb3JjZSBzdXNwZW5kIGF0IGEgYmFkIHRpbWUuICBJbnN0ZWFkLCB3ZSB3YWl0IGZvciBhdXRvc3VzcGVuZCB0bworKiogZGV0ZXJtaW5lIGEgZ29vZCBwb2ludCB0byBzdXNwZW5kLiAgSWYgdGhpcyBkb2Vzbid0IGhhcHBlbiB3aXRoaW4gMTAwbXMgd2UKKyoqIHJlcG9ydCBmYWlsdXJlLgorKioKKyoqIFJldHVybnMgVkNISVFfU1VDQ0VTUyBpZiB2aWRlb2NvcmUgc3VzcGVuZGVkIHN1Y2Nlc3NmdWxseSwgVkNISVFfUkVUUlkgaWYKKyoqIHZpZGVvY29yZSBmYWlsZWQgdG8gc3VzcGVuZCBpbiB0aW1lIG9yIFZDSElRX0VSUk9SIGlmIGludGVycnVwdGVkLgorKi8KK1ZDSElRX1NUQVRVU19UCit2Y2hpcV9hcm1fZm9yY2Vfc3VzcGVuZChWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKKwlWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlID0gdmNoaXFfcGxhdGZvcm1fZ2V0X2FybV9zdGF0ZShzdGF0ZSk7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzID0gVkNISVFfRVJST1I7CisJbG9uZyByYyA9IDA7CisJaW50IHJlcGVhdCA9IC0xOworCisJaWYgKCFhcm1fc3RhdGUpCisJCWdvdG8gb3V0OworCisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMiLCBfX2Z1bmNfXyk7CisKKwl3cml0ZV9sb2NrX2JoKCZhcm1fc3RhdGUtPnN1c3BfcmVzX2xvY2spOworCisJc3RhdHVzID0gYmxvY2tfcmVzdW1lKGFybV9zdGF0ZSk7CisJaWYgKHN0YXR1cyAhPSBWQ0hJUV9TVUNDRVNTKQorCQlnb3RvIHVubG9jazsKKwlpZiAoYXJtX3N0YXRlLT52Y19zdXNwZW5kX3N0YXRlID09IFZDX1NVU1BFTkRfU1VTUEVOREVEKSB7CisJCS8qIEFscmVhZHkgc3VzcGVuZGVkIC0ganVzdCBibG9jayByZXN1bWUgYW5kIGV4aXQgKi8KKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyBhbHJlYWR5IHN1c3BlbmRlZCIsCisJCQlfX2Z1bmNfXyk7CisJCXN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisJCWdvdG8gdW5sb2NrOworCX0gZWxzZSBpZiAoYXJtX3N0YXRlLT52Y19zdXNwZW5kX3N0YXRlIDw9IFZDX1NVU1BFTkRfSURMRSkgeworCQkvKiBpbml0aWF0ZSBzdXNwZW5kIGltbWVkaWF0ZWx5IGluIHRoZSBjYXNlIHRoYXQgd2UncmUgd2FpdGluZworCQkgKiBmb3IgdGhlIHRpbWVvdXQgKi8KKwkJc3RvcF9zdXNwZW5kX3RpbWVyKGFybV9zdGF0ZSk7CisJCWlmICghdmNoaXFfdmlkZW9jb3JlX3dhbnRlZChzdGF0ZSkpIHsKKwkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgdmlkZW9jb3JlICIKKwkJCQkiaWRsZSwgaW5pdGlhdGluZyBzdXNwZW5kIiwgX19mdW5jX18pOworCQkJc3RhdHVzID0gdmNoaXFfYXJtX3Zjc3VzcGVuZChzdGF0ZSk7CisJCX0gZWxzZSBpZiAoYXJtX3N0YXRlLT5hdXRvc3VzcGVuZF9vdmVycmlkZSA8CisJCQkJCQlGT1JDRV9TVVNQRU5EX0ZBSUxfTUFYKSB7CisJCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIGxldHRpbmcgIgorCQkJCSJ2aWRlb2NvcmUgZ28gaWRsZSIsIF9fZnVuY19fKTsKKwkJCXN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisJCX0gZWxzZSB7CisJCQl2Y2hpcV9sb2dfd2FybmluZyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIGZhaWxlZCB0b28gIgorCQkJCSJtYW55IHRpbWVzIC0gYXR0ZW1wdGluZyBzdXNwZW5kIiwgX19mdW5jX18pOworCQkJc3RhdHVzID0gdmNoaXFfYXJtX3Zjc3VzcGVuZChzdGF0ZSk7CisJCX0KKwl9IGVsc2UgeworCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIHZpZGVvY29yZSBzdXNwZW5kICIKKwkJCSJpbiBwcm9ncmVzcyAtIHdhaXQgZm9yIGNvbXBsZXRpb24iLCBfX2Z1bmNfXyk7CisJCXN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisJfQorCisJLyogV2FpdCBmb3Igc3VzcGVuZCB0byBoYXBwZW4gZHVlIHRvIHN5c3RlbSBpZGxlIChub3QgZm9yY2VkLi4pICovCisJaWYgKHN0YXR1cyAhPSBWQ0hJUV9TVUNDRVNTKQorCQlnb3RvIHVuYmxvY2tfcmVzdW1lOworCisJZG8geworCQl3cml0ZV91bmxvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisKKwkJcmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgKKwkJCQkmYXJtX3N0YXRlLT52Y19zdXNwZW5kX2NvbXBsZXRlLAorCQkJCW1zZWNzX3RvX2ppZmZpZXMoRk9SQ0VfU1VTUEVORF9USU1FT1VUX01TKSk7CisKKwkJd3JpdGVfbG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJdmNoaXFfbG9nX3dhcm5pbmcodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyAiCisJCQkJImludGVycnVwdGVkIHdhaXRpbmcgZm9yIHN1c3BlbmQiLCBfX2Z1bmNfXyk7CisJCQlzdGF0dXMgPSBWQ0hJUV9FUlJPUjsKKwkJCWdvdG8gdW5ibG9ja19yZXN1bWU7CisJCX0gZWxzZSBpZiAocmMgPT0gMCkgeworCQkJaWYgKGFybV9zdGF0ZS0+dmNfc3VzcGVuZF9zdGF0ZSA+IFZDX1NVU1BFTkRfSURMRSkgeworCQkJCS8qIFJlcGVhdCB0aW1lb3V0IG9uY2UgaWYgaW4gcHJvZ3Jlc3MgKi8KKwkJCQlpZiAocmVwZWF0IDwgMCkgeworCQkJCQlyZXBlYXQgPSAxOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCQlhcm1fc3RhdGUtPmF1dG9zdXNwZW5kX292ZXJyaWRlKys7CisJCQlvdXRwdXRfdGltZW91dF9lcnJvcihzdGF0ZSk7CisKKwkJCXN0YXR1cyA9IFZDSElRX1JFVFJZOworCQkJZ290byB1bmJsb2NrX3Jlc3VtZTsKKwkJfQorCX0gd2hpbGUgKDAgPCAocmVwZWF0LS0pKTsKKworCS8qIENoZWNrIGFuZCByZXBvcnQgc3RhdGUgaW4gY2FzZSB3ZSBuZWVkIHRvIGFib3J0IEFSTSBzdXNwZW5kICovCisJaWYgKGFybV9zdGF0ZS0+dmNfc3VzcGVuZF9zdGF0ZSAhPSBWQ19TVVNQRU5EX1NVU1BFTkRFRCkgeworCQlzdGF0dXMgPSBWQ0hJUV9SRVRSWTsKKwkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkJIiVzIHZpZGVvY29yZSBzdXNwZW5kIGZhaWxlZCAoc3RhdGUgJXMpIiwgX19mdW5jX18sCisJCQlzdXNwZW5kX3N0YXRlX25hbWVzW2FybV9zdGF0ZS0+dmNfc3VzcGVuZF9zdGF0ZSArCisJCQkJCQlWQ19TVVNQRU5EX05VTV9PRkZTRVRdKTsKKwkJLyogUmVzZXQgdGhlIHN0YXRlIG9ubHkgaWYgaXQncyBzdGlsbCBpbiBhbiBlcnJvciBzdGF0ZS4KKwkJICogU29tZXRoaW5nIGNvdWxkIGhhdmUgYWxyZWFkeSBpbml0aWF0ZWQgYW5vdGhlciBzdXNwZW5kLiAqLworCQlpZiAoYXJtX3N0YXRlLT52Y19zdXNwZW5kX3N0YXRlIDwgVkNfU1VTUEVORF9JRExFKQorCQkJc2V0X3N1c3BlbmRfc3RhdGUoYXJtX3N0YXRlLCBWQ19TVVNQRU5EX0lETEUpOworCisJCWdvdG8gdW5ibG9ja19yZXN1bWU7CisJfQorCisJLyogc3VjY2Vzc2Z1bGx5IHN1c3BlbmRlZCAtIHVubG9jayBhbmQgZXhpdCAqLworCWdvdG8gdW5sb2NrOworCit1bmJsb2NrX3Jlc3VtZToKKwkvKiBhbGwgZXJyb3Igc3RhdGVzIG5lZWQgdG8gdW5ibG9jayByZXN1bWUgYmVmb3JlIGV4aXQgKi8KKwl1bmJsb2NrX3Jlc3VtZShhcm1fc3RhdGUpOworCit1bmxvY2s6CisJd3JpdGVfdW5sb2NrX2JoKCZhcm1fc3RhdGUtPnN1c3BfcmVzX2xvY2spOworCitvdXQ6CisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgZXhpdCAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQKK3ZjaGlxX2NoZWNrX3N1c3BlbmQoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZSA9IHZjaGlxX3BsYXRmb3JtX2dldF9hcm1fc3RhdGUoc3RhdGUpOworCisJaWYgKCFhcm1fc3RhdGUpCisJCWdvdG8gb3V0OworCisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMiLCBfX2Z1bmNfXyk7CisKKwl3cml0ZV9sb2NrX2JoKCZhcm1fc3RhdGUtPnN1c3BfcmVzX2xvY2spOworCWlmIChhcm1fc3RhdGUtPnZjX3N1c3BlbmRfc3RhdGUgIT0gVkNfU1VTUEVORF9TVVNQRU5ERUQgJiYKKwkJCWFybV9zdGF0ZS0+Zmlyc3RfY29ubmVjdCAmJgorCQkJIXZjaGlxX3ZpZGVvY29yZV93YW50ZWQoc3RhdGUpKSB7CisJCXZjaGlxX2FybV92Y3N1c3BlbmQoc3RhdGUpOworCX0KKwl3cml0ZV91bmxvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisKK291dDoKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyBleGl0IiwgX19mdW5jX18pOworCXJldHVybjsKK30KKworCitpbnQKK3ZjaGlxX2FybV9hbGxvd19yZXN1bWUoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZSA9IHZjaGlxX3BsYXRmb3JtX2dldF9hcm1fc3RhdGUoc3RhdGUpOworCWludCByZXN1bWUgPSAwOworCWludCByZXQgPSAtMTsKKworCWlmICghYXJtX3N0YXRlKQorCQlnb3RvIG91dDsKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIiwgX19mdW5jX18pOworCisJd3JpdGVfbG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKwl1bmJsb2NrX3Jlc3VtZShhcm1fc3RhdGUpOworCXJlc3VtZSA9IHZjaGlxX2NoZWNrX3Jlc3VtZShzdGF0ZSk7CisJd3JpdGVfdW5sb2NrX2JoKCZhcm1fc3RhdGUtPnN1c3BfcmVzX2xvY2spOworCisJaWYgKHJlc3VtZSkgeworCQlpZiAod2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKAorCQkJJmFybV9zdGF0ZS0+dmNfcmVzdW1lX2NvbXBsZXRlKSA8IDApIHsKKwkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9zdXNwX2xvZ19sZXZlbCwKKwkJCQkiJXMgaW50ZXJydXB0ZWQiLCBfX2Z1bmNfXyk7CisJCQkvKiBmYWlsZWQsIGNhbm5vdCBhY2N1cmF0ZWx5IGRlcml2ZSBzdXNwZW5kCisJCQkgKiBzdGF0ZSwgc28gZXhpdCBlYXJseS4gKi8KKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJcmVhZF9sb2NrX2JoKCZhcm1fc3RhdGUtPnN1c3BfcmVzX2xvY2spOworCWlmIChhcm1fc3RhdGUtPnZjX3N1c3BlbmRfc3RhdGUgPT0gVkNfU1VTUEVORF9TVVNQRU5ERUQpIHsKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCQkJIiVzOiBWaWRlb2NvcmUgcmVtYWlucyBzdXNwZW5kZWQiLCBfX2Z1bmNfXyk7CisJfSBlbHNlIHsKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCQkJIiVzOiBWaWRlb2NvcmUgcmVzdW1lZCIsIF9fZnVuY19fKTsKKwkJcmV0ID0gMDsKKwl9CisJcmVhZF91bmxvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CitvdXQ6CisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgZXhpdCAlZCIsIF9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHRoZSB3cml0ZSBsb2NrIGhlbGQgKi8KK2ludAordmNoaXFfY2hlY2tfcmVzdW1lKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCVZDSElRX0FSTV9TVEFURV9UICphcm1fc3RhdGUgPSB2Y2hpcV9wbGF0Zm9ybV9nZXRfYXJtX3N0YXRlKHN0YXRlKTsKKwlpbnQgcmVzdW1lID0gMDsKKworCWlmICghYXJtX3N0YXRlKQorCQlnb3RvIG91dDsKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIiwgX19mdW5jX18pOworCisJaWYgKG5lZWRfcmVzdW1lKHN0YXRlKSkgeworCQlzZXRfcmVzdW1lX3N0YXRlKGFybV9zdGF0ZSwgVkNfUkVTVU1FX1JFUVVFU1RFRCk7CisJCXJlcXVlc3RfcG9sbChzdGF0ZSwgTlVMTCwgMCk7CisJCXJlc3VtZSA9IDE7CisJfQorCitvdXQ6CisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgZXhpdCIsIF9fZnVuY19fKTsKKwlyZXR1cm4gcmVzdW1lOworfQorCit2b2lkCit2Y2hpcV9wbGF0Zm9ybV9jaGVja19yZXN1bWUoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZSA9IHZjaGlxX3BsYXRmb3JtX2dldF9hcm1fc3RhdGUoc3RhdGUpOworCWludCByZXMgPSAwOworCisJaWYgKCFhcm1fc3RhdGUpCisJCWdvdG8gb3V0OworCisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMiLCBfX2Z1bmNfXyk7CisKKwl3cml0ZV9sb2NrX2JoKCZhcm1fc3RhdGUtPnN1c3BfcmVzX2xvY2spOworCWlmIChhcm1fc3RhdGUtPndha2VfYWRkcmVzcyA9PSAwKSB7CisJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkJCQkiJXM6IGFscmVhZHkgYXdha2UiLCBfX2Z1bmNfXyk7CisJCWdvdG8gdW5sb2NrOworCX0KKwlpZiAoYXJtX3N0YXRlLT52Y19yZXN1bWVfc3RhdGUgPT0gVkNfUkVTVU1FX0lOX1BST0dSRVNTKSB7CisJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkJCQkiJXM6IGFscmVhZHkgcmVzdW1pbmciLCBfX2Z1bmNfXyk7CisJCWdvdG8gdW5sb2NrOworCX0KKworCWlmIChhcm1fc3RhdGUtPnZjX3Jlc3VtZV9zdGF0ZSA9PSBWQ19SRVNVTUVfUkVRVUVTVEVEKSB7CisJCXNldF9yZXN1bWVfc3RhdGUoYXJtX3N0YXRlLCBWQ19SRVNVTUVfSU5fUFJPR1JFU1MpOworCQlyZXMgPSAxOworCX0gZWxzZQorCQl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCQkJIiVzOiBub3QgcmVzdW1pbmcgKHJlc3VtZSBzdGF0ZSAlcykiLCBfX2Z1bmNfXywKKwkJCQlyZXN1bWVfc3RhdGVfbmFtZXNbYXJtX3N0YXRlLT52Y19yZXN1bWVfc3RhdGUgKworCQkJCQkJCVZDX1JFU1VNRV9OVU1fT0ZGU0VUXSk7CisKK3VubG9jazoKKwl3cml0ZV91bmxvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisKKwlpZiAocmVzKQorCQl2Y2hpcV9wbGF0Zm9ybV9yZXN1bWUoc3RhdGUpOworCitvdXQ6CisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgZXhpdCIsIF9fZnVuY19fKTsKKwlyZXR1cm47CisKK30KKworCisKK1ZDSElRX1NUQVRVU19UCit2Y2hpcV91c2VfaW50ZXJuYWwoVkNISVFfU1RBVEVfVCAqc3RhdGUsIFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSwKKwkJZW51bSBVU0VfVFlQRV9FIHVzZV90eXBlKQoreworCVZDSElRX0FSTV9TVEFURV9UICphcm1fc3RhdGUgPSB2Y2hpcV9wbGF0Zm9ybV9nZXRfYXJtX3N0YXRlKHN0YXRlKTsKKwlWQ0hJUV9TVEFUVVNfVCByZXQgPSBWQ0hJUV9TVUNDRVNTOworCWNoYXIgZW50aXR5WzE2XTsKKwlpbnQgKmVudGl0eV91YzsKKwlpbnQgbG9jYWxfdWMsIGxvY2FsX2VudGl0eV91YzsKKworCWlmICghYXJtX3N0YXRlKQorCQlnb3RvIG91dDsKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIiwgX19mdW5jX18pOworCisJaWYgKHVzZV90eXBlID09IFVTRV9UWVBFX1ZDSElRKSB7CisJCXNwcmludGYoZW50aXR5LCAiVkNISVE6ICAgIik7CisJCWVudGl0eV91YyA9ICZhcm1fc3RhdGUtPnBlZXJfdXNlX2NvdW50OworCX0gZWxzZSBpZiAoc2VydmljZSkgeworCQlzcHJpbnRmKGVudGl0eSwgIiVjJWMlYyVjOiUwM2QiLAorCQkJVkNISVFfRk9VUkNDX0FTXzRDSEFSUyhzZXJ2aWNlLT5iYXNlLmZvdXJjYyksCisJCQlzZXJ2aWNlLT5jbGllbnRfaWQpOworCQllbnRpdHlfdWMgPSAmc2VydmljZS0+c2VydmljZV91c2VfY291bnQ7CisJfSBlbHNlIHsKKwkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgbnVsbCBzZXJ2aWNlICIKKwkJCQkicHRyIiwgX19mdW5jX18pOworCQlyZXQgPSBWQ0hJUV9FUlJPUjsKKwkJZ290byBvdXQ7CisJfQorCisJd3JpdGVfbG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKwl3aGlsZSAoYXJtX3N0YXRlLT5yZXN1bWVfYmxvY2tlZCkgeworCQkvKiBJZiB3ZSBjYWxsICd1c2UnIHdoaWxlIGZvcmNlIHN1c3BlbmQgaXMgd2FpdGluZyBmb3Igc3VzcGVuZCwKKwkJICogdGhlbiB3ZSdyZSBhYm91dCB0byBibG9jayB0aGUgdGhyZWFkIHdoaWNoIHRoZSBmb3JjZSBpcworCQkgKiB3YWl0aW5nIHRvIGNvbXBsZXRlLCBzbyB3ZSdyZSBib3VuZCB0byBqdXN0IHRpbWUgb3V0LiBJbiB0aGlzCisJCSAqIGNhc2UsIHNldCB0aGUgc3VzcGVuZCBzdGF0ZSBzdWNoIHRoYXQgdGhlIHdhaXQgd2lsbCBiZQorCQkgKiBjYW5jZWxlZCwgc28gd2UgY2FuIGNvbXBsZXRlIGFzIHF1aWNrbHkgYXMgcG9zc2libGUuICovCisJCWlmIChhcm1fc3RhdGUtPnJlc3VtZV9ibG9ja2VkICYmIGFybV9zdGF0ZS0+dmNfc3VzcGVuZF9zdGF0ZSA9PQorCQkJCVZDX1NVU1BFTkRfSURMRSkgeworCQkJc2V0X3N1c3BlbmRfc3RhdGUoYXJtX3N0YXRlLCBWQ19TVVNQRU5EX0ZPUkNFX0NBTkNFTEVEKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIElmIHN1c3BlbmQgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcyB0aGVuIHdlIG5lZWQgdG8gYmxvY2sgKi8KKwkJaWYgKCF0cnlfd2FpdF9mb3JfY29tcGxldGlvbigmYXJtX3N0YXRlLT5yZXN1bWVfYmxvY2tlcikpIHsKKwkJCS8qIEluZGljYXRlIHRoYXQgdGhlcmUgYXJlIHRocmVhZHMgd2FpdGluZyBvbiB0aGUgcmVzdW1lCisJCQkgKiBibG9ja2VyLiAgVGhlc2UgbmVlZCB0byBiZSBhbGxvd2VkIHRvIGNvbXBsZXRlIGJlZm9yZQorCQkJICogYSBfc2Vjb25kXyBjYWxsIHRvIGZvcmNlIHN1c3BlbmQgY2FuIGNvbXBsZXRlLAorCQkJICogb3RoZXJ3aXNlIGxvdyBwcmlvcml0eSB0aHJlYWRzIG1pZ2h0IG5ldmVyIGFjdHVhbGx5CisJCQkgKiBjb250aW51ZSAqLworCQkJYXJtX3N0YXRlLT5ibG9ja2VkX2NvdW50Kys7CisJCQl3cml0ZV91bmxvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisJCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzICVzIHJlc3VtZSAiCisJCQkJImJsb2NrZWQgLSB3YWl0aW5nLi4uIiwgX19mdW5jX18sIGVudGl0eSk7CisJCQlpZiAod2FpdF9mb3JfY29tcGxldGlvbl9raWxsYWJsZSgKKwkJCQkJJmFybV9zdGF0ZS0+cmVzdW1lX2Jsb2NrZXIpICE9IDApIHsKKwkJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyAlcyAiCisJCQkJCSJ3YWl0IGZvciByZXN1bWUgYmxvY2tlciBpbnRlcnJ1cHRlZCIsCisJCQkJCV9fZnVuY19fLCBlbnRpdHkpOworCQkJCXJldCA9IFZDSElRX0VSUk9SOworCQkJCXdyaXRlX2xvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisJCQkJYXJtX3N0YXRlLT5ibG9ja2VkX2NvdW50LS07CisJCQkJd3JpdGVfdW5sb2NrX2JoKCZhcm1fc3RhdGUtPnN1c3BfcmVzX2xvY2spOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyAlcyByZXN1bWUgIgorCQkJCSJ1bmJsb2NrZWQiLCBfX2Z1bmNfXywgZW50aXR5KTsKKwkJCXdyaXRlX2xvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisJCQlpZiAoLS1hcm1fc3RhdGUtPmJsb2NrZWRfY291bnQgPT0gMCkKKwkJCQljb21wbGV0ZV9hbGwoJmFybV9zdGF0ZS0+YmxvY2tlZF9ibG9ja2VyKTsKKwkJfQorCX0KKworCXN0b3Bfc3VzcGVuZF90aW1lcihhcm1fc3RhdGUpOworCisJbG9jYWxfdWMgPSArK2FybV9zdGF0ZS0+dmlkZW9jb3JlX3VzZV9jb3VudDsKKwlsb2NhbF9lbnRpdHlfdWMgPSArKygqZW50aXR5X3VjKTsKKworCS8qIElmIHRoZXJlJ3MgYSBwZW5kaW5nIHJlcXVlc3Qgd2hpY2ggaGFzbid0IHlldCBiZWVuIHNlcnZpY2VkIHRoZW4KKwkgKiBqdXN0IGNsZWFyIGl0LiAgSWYgd2UncmUgcGFzdCBWQ19TVVNQRU5EX1JFUVVFU1RFRCBzdGF0ZSB0aGVuCisJICogdmNfcmVzdW1lX2NvbXBsZXRlIHdpbGwgYmxvY2sgdW50aWwgd2UgZWl0aGVyIHJlc3VtZSBvciBmYWlsIHRvCisJICogc3VzcGVuZCAqLworCWlmIChhcm1fc3RhdGUtPnZjX3N1c3BlbmRfc3RhdGUgPD0gVkNfU1VTUEVORF9SRVFVRVNURUQpCisJCXNldF9zdXNwZW5kX3N0YXRlKGFybV9zdGF0ZSwgVkNfU1VTUEVORF9JRExFKTsKKworCWlmICgodXNlX3R5cGUgIT0gVVNFX1RZUEVfU0VSVklDRV9OT19SRVNVTUUpICYmIG5lZWRfcmVzdW1lKHN0YXRlKSkgeworCQlzZXRfcmVzdW1lX3N0YXRlKGFybV9zdGF0ZSwgVkNfUkVTVU1FX1JFUVVFU1RFRCk7CisJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkJIiVzICVzIGNvdW50ICVkLCBzdGF0ZSBjb3VudCAlZCIsCisJCQlfX2Z1bmNfXywgZW50aXR5LCBsb2NhbF9lbnRpdHlfdWMsIGxvY2FsX3VjKTsKKwkJcmVxdWVzdF9wb2xsKHN0YXRlLCBOVUxMLCAwKTsKKwl9IGVsc2UKKwkJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkJIiVzICVzIGNvdW50ICVkLCBzdGF0ZSBjb3VudCAlZCIsCisJCQlfX2Z1bmNfXywgZW50aXR5LCAqZW50aXR5X3VjLCBsb2NhbF91Yyk7CisKKworCXdyaXRlX3VubG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKworCS8qIENvbXBsZXRpb24gaXMgaW4gYSBkb25lIHN0YXRlIHdoZW4gd2UncmUgbm90IHN1c3BlbmRlZCwgc28gdGhpcyB3b24ndAorCSAqIGJsb2NrIGZvciB0aGUgbm9uLXN1c3BlbmRlZCBjYXNlLiAqLworCWlmICghdHJ5X3dhaXRfZm9yX2NvbXBsZXRpb24oJmFybV9zdGF0ZS0+dmNfcmVzdW1lX2NvbXBsZXRlKSkgeworCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzICVzIHdhaXQgZm9yIHJlc3VtZSIsCisJCQlfX2Z1bmNfXywgZW50aXR5KTsKKwkJaWYgKHdhaXRfZm9yX2NvbXBsZXRpb25fa2lsbGFibGUoCisJCQkJJmFybV9zdGF0ZS0+dmNfcmVzdW1lX2NvbXBsZXRlKSAhPSAwKSB7CisJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyAlcyB3YWl0IGZvciAiCisJCQkJInJlc3VtZSBpbnRlcnJ1cHRlZCIsIF9fZnVuY19fLCBlbnRpdHkpOworCQkJcmV0ID0gVkNISVFfRVJST1I7CisJCQlnb3RvIG91dDsKKwkJfQorCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzICVzIHJlc3VtZWQiLCBfX2Z1bmNfXywKKwkJCWVudGl0eSk7CisJfQorCisJaWYgKHJldCA9PSBWQ0hJUV9TVUNDRVNTKSB7CisJCVZDSElRX1NUQVRVU19UIHN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisJCWxvbmcgYWNrX2NudCA9IGF0b21pY194Y2hnKCZhcm1fc3RhdGUtPmthX3VzZV9hY2tfY291bnQsIDApOworCQl3aGlsZSAoYWNrX2NudCAmJiAoc3RhdHVzID09IFZDSElRX1NVQ0NFU1MpKSB7CisJCQkvKiBTZW5kIHRoZSB1c2Ugbm90aWZ5IHRvIHZpZGVvY29yZSAqLworCQkJc3RhdHVzID0gdmNoaXFfc2VuZF9yZW1vdGVfdXNlX2FjdGl2ZShzdGF0ZSk7CisJCQlpZiAoc3RhdHVzID09IFZDSElRX1NVQ0NFU1MpCisJCQkJYWNrX2NudC0tOworCQkJZWxzZQorCQkJCWF0b21pY19hZGQoYWNrX2NudCwKKwkJCQkJJmFybV9zdGF0ZS0+a2FfdXNlX2Fja19jb3VudCk7CisJCX0KKwl9CisKK291dDoKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyBleGl0ICVkIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3JlbGVhc2VfaW50ZXJuYWwoVkNISVFfU1RBVEVfVCAqc3RhdGUsIFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSkKK3sKKwlWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlID0gdmNoaXFfcGxhdGZvcm1fZ2V0X2FybV9zdGF0ZShzdGF0ZSk7CisJVkNISVFfU1RBVFVTX1QgcmV0ID0gVkNISVFfU1VDQ0VTUzsKKwljaGFyIGVudGl0eVsxNl07CisJaW50ICplbnRpdHlfdWM7CisJaW50IGxvY2FsX3VjLCBsb2NhbF9lbnRpdHlfdWM7CisKKwlpZiAoIWFybV9zdGF0ZSkKKwkJZ290byBvdXQ7CisKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyIsIF9fZnVuY19fKTsKKworCWlmIChzZXJ2aWNlKSB7CisJCXNwcmludGYoZW50aXR5LCAiJWMlYyVjJWM6JTAzZCIsCisJCQlWQ0hJUV9GT1VSQ0NfQVNfNENIQVJTKHNlcnZpY2UtPmJhc2UuZm91cmNjKSwKKwkJCXNlcnZpY2UtPmNsaWVudF9pZCk7CisJCWVudGl0eV91YyA9ICZzZXJ2aWNlLT5zZXJ2aWNlX3VzZV9jb3VudDsKKwl9IGVsc2UgeworCQlzcHJpbnRmKGVudGl0eSwgIlBFRVI6ICAgIik7CisJCWVudGl0eV91YyA9ICZhcm1fc3RhdGUtPnBlZXJfdXNlX2NvdW50OworCX0KKworCXdyaXRlX2xvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisJaWYgKCFhcm1fc3RhdGUtPnZpZGVvY29yZV91c2VfY291bnQgfHwgISgqZW50aXR5X3VjKSkgeworCQkvKiBEb24ndCB1c2UgQlVHX09OIC0gZG9uJ3QgYWxsb3cgdXNlciB0aHJlYWQgdG8gY3Jhc2gga2VybmVsICovCisJCVdBUk5fT04oIWFybV9zdGF0ZS0+dmlkZW9jb3JlX3VzZV9jb3VudCk7CisJCVdBUk5fT04oISgqZW50aXR5X3VjKSk7CisJCXJldCA9IFZDSElRX0VSUk9SOworCQlnb3RvIHVubG9jazsKKwl9CisJbG9jYWxfdWMgPSAtLWFybV9zdGF0ZS0+dmlkZW9jb3JlX3VzZV9jb3VudDsKKwlsb2NhbF9lbnRpdHlfdWMgPSAtLSgqZW50aXR5X3VjKTsKKworCWlmICghdmNoaXFfdmlkZW9jb3JlX3dhbnRlZChzdGF0ZSkpIHsKKwkJaWYgKHZjaGlxX3BsYXRmb3JtX3VzZV9zdXNwZW5kX3RpbWVyKCkgJiYKKwkJCQkhYXJtX3N0YXRlLT5yZXN1bWVfYmxvY2tlZCkgeworCQkJLyogT25seSB1c2UgdGhlIHRpbWVyIGlmIHdlJ3JlIG5vdCB0cnlpbmcgdG8gZm9yY2UKKwkJCSAqIHN1c3BlbmQgKD0+IHJlc3VtZV9ibG9ja2VkKSAqLworCQkJc3RhcnRfc3VzcGVuZF90aW1lcihhcm1fc3RhdGUpOworCQl9IGVsc2UgeworCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCQkJIiVzICVzIGNvdW50ICVkLCBzdGF0ZSBjb3VudCAlZCAtIHN1c3BlbmRpbmciLAorCQkJCV9fZnVuY19fLCBlbnRpdHksICplbnRpdHlfdWMsCisJCQkJYXJtX3N0YXRlLT52aWRlb2NvcmVfdXNlX2NvdW50KTsKKwkJCXZjaGlxX2FybV92Y3N1c3BlbmQoc3RhdGUpOworCQl9CisJfSBlbHNlCisJCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwKKwkJCSIlcyAlcyBjb3VudCAlZCwgc3RhdGUgY291bnQgJWQiLAorCQkJX19mdW5jX18sIGVudGl0eSwgKmVudGl0eV91YywKKwkJCWFybV9zdGF0ZS0+dmlkZW9jb3JlX3VzZV9jb3VudCk7CisKK3VubG9jazoKKwl3cml0ZV91bmxvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisKK291dDoKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyBleGl0ICVkIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZAordmNoaXFfb25fcmVtb3RlX3VzZShWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKKwlWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlID0gdmNoaXFfcGxhdGZvcm1fZ2V0X2FybV9zdGF0ZShzdGF0ZSk7CisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMiLCBfX2Z1bmNfXyk7CisJYXRvbWljX2luYygmYXJtX3N0YXRlLT5rYV91c2VfY291bnQpOworCWNvbXBsZXRlKCZhcm1fc3RhdGUtPmthX2V2dCk7Cit9CisKK3ZvaWQKK3ZjaGlxX29uX3JlbW90ZV9yZWxlYXNlKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCVZDSElRX0FSTV9TVEFURV9UICphcm1fc3RhdGUgPSB2Y2hpcV9wbGF0Zm9ybV9nZXRfYXJtX3N0YXRlKHN0YXRlKTsKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyIsIF9fZnVuY19fKTsKKwlhdG9taWNfaW5jKCZhcm1fc3RhdGUtPmthX3JlbGVhc2VfY291bnQpOworCWNvbXBsZXRlKCZhcm1fc3RhdGUtPmthX2V2dCk7Cit9CisKK1ZDSElRX1NUQVRVU19UCit2Y2hpcV91c2Vfc2VydmljZV9pbnRlcm5hbChWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UpCit7CisJcmV0dXJuIHZjaGlxX3VzZV9pbnRlcm5hbChzZXJ2aWNlLT5zdGF0ZSwgc2VydmljZSwgVVNFX1RZUEVfU0VSVklDRSk7Cit9CisKK1ZDSElRX1NUQVRVU19UCit2Y2hpcV9yZWxlYXNlX3NlcnZpY2VfaW50ZXJuYWwoVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlKQoreworCXJldHVybiB2Y2hpcV9yZWxlYXNlX2ludGVybmFsKHNlcnZpY2UtPnN0YXRlLCBzZXJ2aWNlKTsKK30KKworVkNISVFfREVCVUdGU19OT0RFX1QgKgordmNoaXFfaW5zdGFuY2VfZ2V0X2RlYnVnZnNfbm9kZShWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlKQoreworCXJldHVybiAmaW5zdGFuY2UtPmRlYnVnZnNfbm9kZTsKK30KKworaW50Cit2Y2hpcV9pbnN0YW5jZV9nZXRfdXNlX2NvdW50KFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UpCit7CisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlOworCWludCB1c2VfY291bnQgPSAwLCBpOworCWkgPSAwOworCXdoaWxlICgoc2VydmljZSA9IG5leHRfc2VydmljZV9ieV9pbnN0YW5jZShpbnN0YW5jZS0+c3RhdGUsCisJCWluc3RhbmNlLCAmaSkpICE9IE5VTEwpIHsKKwkJdXNlX2NvdW50ICs9IHNlcnZpY2UtPnNlcnZpY2VfdXNlX2NvdW50OworCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKwl9CisJcmV0dXJuIHVzZV9jb3VudDsKK30KKworaW50Cit2Y2hpcV9pbnN0YW5jZV9nZXRfcGlkKFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UpCit7CisJcmV0dXJuIGluc3RhbmNlLT5waWQ7Cit9CisKK2ludAordmNoaXFfaW5zdGFuY2VfZ2V0X3RyYWNlKFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UpCit7CisJcmV0dXJuIGluc3RhbmNlLT50cmFjZTsKK30KKwordm9pZAordmNoaXFfaW5zdGFuY2Vfc2V0X3RyYWNlKFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UsIGludCB0cmFjZSkKK3sKKwlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2U7CisJaW50IGk7CisJaSA9IDA7CisJd2hpbGUgKChzZXJ2aWNlID0gbmV4dF9zZXJ2aWNlX2J5X2luc3RhbmNlKGluc3RhbmNlLT5zdGF0ZSwKKwkJaW5zdGFuY2UsICZpKSkgIT0gTlVMTCkgeworCQlzZXJ2aWNlLT50cmFjZSA9IHRyYWNlOworCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKwl9CisJaW5zdGFuY2UtPnRyYWNlID0gKHRyYWNlICE9IDApOworfQorCitzdGF0aWMgdm9pZCBzdXNwZW5kX3RpbWVyX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3sKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZSA9IChWQ0hJUV9TVEFURV9UICopY29udGV4dDsKKwlWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlID0gdmNoaXFfcGxhdGZvcm1fZ2V0X2FybV9zdGF0ZShzdGF0ZSk7CisJaWYgKCFhcm1fc3RhdGUpCisJCWdvdG8gb3V0OworCXZjaGlxX2xvZ19pbmZvKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkiJXMgLSBzdXNwZW5kIHRpbWVyIGV4cGlyZWQgLSBjaGVjayBzdXNwZW5kIiwgX19mdW5jX18pOworCXZjaGlxX2NoZWNrX3N1c3BlbmQoc3RhdGUpOworb3V0OgorCXJldHVybjsKK30KKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3VzZV9zZXJ2aWNlX25vX3Jlc3VtZShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSkKK3sKKwlWQ0hJUV9TVEFUVVNfVCByZXQgPSBWQ0hJUV9FUlJPUjsKKwlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UgPSBmaW5kX3NlcnZpY2VfYnlfaGFuZGxlKGhhbmRsZSk7CisJaWYgKHNlcnZpY2UpIHsKKwkJcmV0ID0gdmNoaXFfdXNlX2ludGVybmFsKHNlcnZpY2UtPnN0YXRlLCBzZXJ2aWNlLAorCQkJCVVTRV9UWVBFX1NFUlZJQ0VfTk9fUkVTVU1FKTsKKwkJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK1ZDSElRX1NUQVRVU19UCit2Y2hpcV91c2Vfc2VydmljZShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSkKK3sKKwlWQ0hJUV9TVEFUVVNfVCByZXQgPSBWQ0hJUV9FUlJPUjsKKwlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UgPSBmaW5kX3NlcnZpY2VfYnlfaGFuZGxlKGhhbmRsZSk7CisJaWYgKHNlcnZpY2UpIHsKKwkJcmV0ID0gdmNoaXFfdXNlX2ludGVybmFsKHNlcnZpY2UtPnN0YXRlLCBzZXJ2aWNlLAorCQkJCVVTRV9UWVBFX1NFUlZJQ0UpOworCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3JlbGVhc2Vfc2VydmljZShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSkKK3sKKwlWQ0hJUV9TVEFUVVNfVCByZXQgPSBWQ0hJUV9FUlJPUjsKKwlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UgPSBmaW5kX3NlcnZpY2VfYnlfaGFuZGxlKGhhbmRsZSk7CisJaWYgKHNlcnZpY2UpIHsKKwkJcmV0ID0gdmNoaXFfcmVsZWFzZV9pbnRlcm5hbChzZXJ2aWNlLT5zdGF0ZSwgc2VydmljZSk7CisJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCX0KKwlyZXR1cm4gcmV0OworfQorCit2b2lkCit2Y2hpcV9kdW1wX3NlcnZpY2VfdXNlX3N0YXRlKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCVZDSElRX0FSTV9TVEFURV9UICphcm1fc3RhdGUgPSB2Y2hpcV9wbGF0Zm9ybV9nZXRfYXJtX3N0YXRlKHN0YXRlKTsKKwlpbnQgaSwgaiA9IDA7CisJLyogT25seSBkdW1wIDY0IHNlcnZpY2VzICovCisJc3RhdGljIGNvbnN0IGludCBsb2NhbF9tYXhfc2VydmljZXMgPSA2NDsKKwkvKiBJZiB0aGVyZSdzIG1vcmUgdGhhbiA2NCBzZXJ2aWNlcywgb25seSBkdW1wIG9uZXMgd2l0aAorCSAqIG5vbi16ZXJvIGNvdW50cyAqLworCWludCBvbmx5X25vbnplcm8gPSAwOworCXN0YXRpYyBjb25zdCBjaGFyICpueiA9ICI8LS0gcHJldmVudGluZyBzdXNwZW5kIjsKKworCWVudW0gdmNfc3VzcGVuZF9zdGF0dXMgdmNfc3VzcGVuZF9zdGF0ZTsKKwllbnVtIHZjX3Jlc3VtZV9zdGF0dXMgIHZjX3Jlc3VtZV9zdGF0ZTsKKwlpbnQgcGVlcl9jb3VudDsKKwlpbnQgdmNfdXNlX2NvdW50OworCWludCBhY3RpdmVfc2VydmljZXM7CisJc3RydWN0IHNlcnZpY2VfZGF0YV9zdHJ1Y3QgeworCQlpbnQgZm91cmNjOworCQlpbnQgY2xpZW50aWQ7CisJCWludCB1c2VfY291bnQ7CisJfSBzZXJ2aWNlX2RhdGFbbG9jYWxfbWF4X3NlcnZpY2VzXTsKKworCWlmICghYXJtX3N0YXRlKQorCQlyZXR1cm47CisKKwlyZWFkX2xvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisJdmNfc3VzcGVuZF9zdGF0ZSA9IGFybV9zdGF0ZS0+dmNfc3VzcGVuZF9zdGF0ZTsKKwl2Y19yZXN1bWVfc3RhdGUgID0gYXJtX3N0YXRlLT52Y19yZXN1bWVfc3RhdGU7CisJcGVlcl9jb3VudCA9IGFybV9zdGF0ZS0+cGVlcl91c2VfY291bnQ7CisJdmNfdXNlX2NvdW50ID0gYXJtX3N0YXRlLT52aWRlb2NvcmVfdXNlX2NvdW50OworCWFjdGl2ZV9zZXJ2aWNlcyA9IHN0YXRlLT51bnVzZWRfc2VydmljZTsKKwlpZiAoYWN0aXZlX3NlcnZpY2VzID4gbG9jYWxfbWF4X3NlcnZpY2VzKQorCQlvbmx5X25vbnplcm8gPSAxOworCisJZm9yIChpID0gMDsgKGkgPCBhY3RpdmVfc2VydmljZXMpICYmIChqIDwgbG9jYWxfbWF4X3NlcnZpY2VzKTsgaSsrKSB7CisJCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZV9wdHIgPSBzdGF0ZS0+c2VydmljZXNbaV07CisJCWlmICghc2VydmljZV9wdHIpCisJCQljb250aW51ZTsKKworCQlpZiAob25seV9ub256ZXJvICYmICFzZXJ2aWNlX3B0ci0+c2VydmljZV91c2VfY291bnQpCisJCQljb250aW51ZTsKKworCQlpZiAoc2VydmljZV9wdHItPnNydnN0YXRlICE9IFZDSElRX1NSVlNUQVRFX0ZSRUUpIHsKKwkJCXNlcnZpY2VfZGF0YVtqXS5mb3VyY2MgPSBzZXJ2aWNlX3B0ci0+YmFzZS5mb3VyY2M7CisJCQlzZXJ2aWNlX2RhdGFbal0uY2xpZW50aWQgPSBzZXJ2aWNlX3B0ci0+Y2xpZW50X2lkOworCQkJc2VydmljZV9kYXRhW2orK10udXNlX2NvdW50ID0gc2VydmljZV9wdHItPgorCQkJCQkJCXNlcnZpY2VfdXNlX2NvdW50OworCQl9CisJfQorCisJcmVhZF91bmxvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisKKwl2Y2hpcV9sb2dfd2FybmluZyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwKKwkJIi0tIFZpZGVjb3JlIHN1c3BlbmQgc3RhdGU6ICVzIC0tIiwKKwkJc3VzcGVuZF9zdGF0ZV9uYW1lc1t2Y19zdXNwZW5kX3N0YXRlICsgVkNfU1VTUEVORF9OVU1fT0ZGU0VUXSk7CisJdmNoaXFfbG9nX3dhcm5pbmcodmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCSItLSBWaWRlY29yZSByZXN1bWUgc3RhdGU6ICVzIC0tIiwKKwkJcmVzdW1lX3N0YXRlX25hbWVzW3ZjX3Jlc3VtZV9zdGF0ZSArIFZDX1JFU1VNRV9OVU1fT0ZGU0VUXSk7CisKKwlpZiAob25seV9ub256ZXJvKQorCQl2Y2hpcV9sb2dfd2FybmluZyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIlRvbyBtYW55IGFjdGl2ZSAiCisJCQkic2VydmljZXMgKCVkKS4gIE9ubHkgZHVtcGluZyB1cCB0byBmaXJzdCAlZCBzZXJ2aWNlcyAiCisJCQkid2l0aCBub24temVybyB1c2UtY291bnQiLCBhY3RpdmVfc2VydmljZXMsCisJCQlsb2NhbF9tYXhfc2VydmljZXMpOworCisJZm9yIChpID0gMDsgaSA8IGo7IGkrKykgeworCQl2Y2hpcV9sb2dfd2FybmluZyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwKKwkJCSItLS0tLSAlYyVjJWMlYzolZCBzZXJ2aWNlIGNvdW50ICVkICVzIiwKKwkJCVZDSElRX0ZPVVJDQ19BU180Q0hBUlMoc2VydmljZV9kYXRhW2ldLmZvdXJjYyksCisJCQlzZXJ2aWNlX2RhdGFbaV0uY2xpZW50aWQsCisJCQlzZXJ2aWNlX2RhdGFbaV0udXNlX2NvdW50LAorCQkJc2VydmljZV9kYXRhW2ldLnVzZV9jb3VudCA/IG56IDogIiIpOworCX0KKwl2Y2hpcV9sb2dfd2FybmluZyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwKKwkJIi0tLS0tIFZDSElRIHVzZSBjb3VudCBjb3VudCAlZCIsIHBlZXJfY291bnQpOworCXZjaGlxX2xvZ193YXJuaW5nKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkiLS0tIE92ZXJhbGwgdmNoaXEgaW5zdGFuY2UgdXNlIGNvdW50ICVkIiwgdmNfdXNlX2NvdW50KTsKKworCXZjaGlxX2R1bXBfcGxhdGZvcm1fdXNlX3N0YXRlKHN0YXRlKTsKK30KKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX2NoZWNrX3NlcnZpY2UoVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlKQoreworCVZDSElRX0FSTV9TVEFURV9UICphcm1fc3RhdGU7CisJVkNISVFfU1RBVFVTX1QgcmV0ID0gVkNISVFfRVJST1I7CisKKwlpZiAoIXNlcnZpY2UgfHwgIXNlcnZpY2UtPnN0YXRlKQorCQlnb3RvIG91dDsKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIiwgX19mdW5jX18pOworCisJYXJtX3N0YXRlID0gdmNoaXFfcGxhdGZvcm1fZ2V0X2FybV9zdGF0ZShzZXJ2aWNlLT5zdGF0ZSk7CisKKwlyZWFkX2xvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisJaWYgKHNlcnZpY2UtPnNlcnZpY2VfdXNlX2NvdW50KQorCQlyZXQgPSBWQ0hJUV9TVUNDRVNTOworCXJlYWRfdW5sb2NrX2JoKCZhcm1fc3RhdGUtPnN1c3BfcmVzX2xvY2spOworCisJaWYgKHJldCA9PSBWQ0hJUV9FUlJPUikgeworCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCQkiJXMgRVJST1IgLSAlYyVjJWMlYzolZCBzZXJ2aWNlIGNvdW50ICVkLCAiCisJCQkic3RhdGUgY291bnQgJWQsIHZpZGVvY29yZSBzdXNwZW5kIHN0YXRlICVzIiwgX19mdW5jX18sCisJCQlWQ0hJUV9GT1VSQ0NfQVNfNENIQVJTKHNlcnZpY2UtPmJhc2UuZm91cmNjKSwKKwkJCXNlcnZpY2UtPmNsaWVudF9pZCwgc2VydmljZS0+c2VydmljZV91c2VfY291bnQsCisJCQlhcm1fc3RhdGUtPnZpZGVvY29yZV91c2VfY291bnQsCisJCQlzdXNwZW5kX3N0YXRlX25hbWVzW2FybV9zdGF0ZS0+dmNfc3VzcGVuZF9zdGF0ZSArCisJCQkJCQlWQ19TVVNQRU5EX05VTV9PRkZTRVRdKTsKKwkJdmNoaXFfZHVtcF9zZXJ2aWNlX3VzZV9zdGF0ZShzZXJ2aWNlLT5zdGF0ZSk7CisJfQorb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qIHN0dWIgZnVuY3Rpb25zICovCit2b2lkIHZjaGlxX29uX3JlbW90ZV91c2VfYWN0aXZlKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCSh2b2lkKXN0YXRlOworfQorCit2b2lkIHZjaGlxX3BsYXRmb3JtX2Nvbm5fc3RhdGVfY2hhbmdlZChWQ0hJUV9TVEFURV9UICpzdGF0ZSwKKwlWQ0hJUV9DT05OU1RBVEVfVCBvbGRzdGF0ZSwgVkNISVFfQ09OTlNUQVRFX1QgbmV3c3RhdGUpCit7CisJVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZSA9IHZjaGlxX3BsYXRmb3JtX2dldF9hcm1fc3RhdGUoc3RhdGUpOworCXZjaGlxX2xvZ19pbmZvKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJWQ6ICVzLT4lcyIsIHN0YXRlLT5pZCwKKwkJZ2V0X2Nvbm5fc3RhdGVfbmFtZShvbGRzdGF0ZSksIGdldF9jb25uX3N0YXRlX25hbWUobmV3c3RhdGUpKTsKKwlpZiAoc3RhdGUtPmNvbm5fc3RhdGUgPT0gVkNISVFfQ09OTlNUQVRFX0NPTk5FQ1RFRCkgeworCQl3cml0ZV9sb2NrX2JoKCZhcm1fc3RhdGUtPnN1c3BfcmVzX2xvY2spOworCQlpZiAoIWFybV9zdGF0ZS0+Zmlyc3RfY29ubmVjdCkgeworCQkJY2hhciB0aHJlYWRuYW1lWzEwXTsKKwkJCWFybV9zdGF0ZS0+Zmlyc3RfY29ubmVjdCA9IDE7CisJCQl3cml0ZV91bmxvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisJCQlzbnByaW50Zih0aHJlYWRuYW1lLCBzaXplb2YodGhyZWFkbmFtZSksICJWQ0hJUWthLSVkIiwKKwkJCQlzdGF0ZS0+aWQpOworCQkJYXJtX3N0YXRlLT5rYV90aHJlYWQgPSBrdGhyZWFkX2NyZWF0ZSgKKwkJCQkmdmNoaXFfa2VlcGFsaXZlX3RocmVhZF9mdW5jLAorCQkJCSh2b2lkICopc3RhdGUsCisJCQkJdGhyZWFkbmFtZSk7CisJCQlpZiAoYXJtX3N0YXRlLT5rYV90aHJlYWQgPT0gTlVMTCkgeworCQkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9zdXNwX2xvZ19sZXZlbCwKKwkJCQkJInZjaGlxOiBGQVRBTDogY291bGRuJ3QgY3JlYXRlIHRocmVhZCAlcyIsCisJCQkJCXRocmVhZG5hbWUpOworCQkJfSBlbHNlIHsKKwkJCQl3YWtlX3VwX3Byb2Nlc3MoYXJtX3N0YXRlLT5rYV90aHJlYWQpOworCQkJfQorCQl9IGVsc2UKKwkJCXdyaXRlX3VubG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdmNoaXFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmZ3X25vZGU7CisJc3RydWN0IHJwaV9maXJtd2FyZSAqZnc7CisJaW50IGVycjsKKwl2b2lkICpwdHJfZXJyOworCisJZndfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUocGRldi0+ZGV2Lm9mX25vZGUsICJmaXJtd2FyZSIsIDApOworLyogUmVtb3ZlIGNvbW1lbnQgd2hlbiBib290aW5nIHdpdGhvdXQgRGV2aWNlIFRyZWUgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZAorCWlmICghZndfbm9kZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNaXNzaW5nIGZpcm13YXJlIG5vZGVcbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisqLworCWZ3ID0gcnBpX2Zpcm13YXJlX2dldChmd19ub2RlKTsKKwlpZiAoIWZ3KQorCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGZ3KTsKKworCS8qIGNyZWF0ZSBkZWJ1Z2ZzIGVudHJpZXMgKi8KKwllcnIgPSB2Y2hpcV9kZWJ1Z2ZzX2luaXQoKTsKKwlpZiAoZXJyICE9IDApCisJCWdvdG8gZmFpbGVkX2RlYnVnZnNfaW5pdDsKKworCWVyciA9IGFsbG9jX2NocmRldl9yZWdpb24oJnZjaGlxX2RldmlkLCBWQ0hJUV9NSU5PUiwgMSwgREVWSUNFX05BTUUpOworCWlmIChlcnIgIT0gMCkgeworCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCSJVbmFibGUgdG8gYWxsb2NhdGUgZGV2aWNlIG51bWJlciIpOworCQlnb3RvIGZhaWxlZF9hbGxvY19jaHJkZXY7CisJfQorCWNkZXZfaW5pdCgmdmNoaXFfY2RldiwgJnZjaGlxX2ZvcHMpOworCXZjaGlxX2NkZXYub3duZXIgPSBUSElTX01PRFVMRTsKKwllcnIgPSBjZGV2X2FkZCgmdmNoaXFfY2RldiwgdmNoaXFfZGV2aWQsIDEpOworCWlmIChlcnIgIT0gMCkgeworCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCSJVbmFibGUgdG8gcmVnaXN0ZXIgZGV2aWNlIik7CisJCWdvdG8gZmFpbGVkX2NkZXZfYWRkOworCX0KKworCS8qIGNyZWF0ZSBzeXNmcyBlbnRyaWVzICovCisJdmNoaXFfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsIERFVklDRV9OQU1FKTsKKwlwdHJfZXJyID0gdmNoaXFfY2xhc3M7CisJaWYgKElTX0VSUihwdHJfZXJyKSkKKwkJZ290byBmYWlsZWRfY2xhc3NfY3JlYXRlOworCisJdmNoaXFfZGV2ID0gZGV2aWNlX2NyZWF0ZSh2Y2hpcV9jbGFzcywgTlVMTCwKKwkJdmNoaXFfZGV2aWQsIE5VTEwsICJ2Y2hpcSIpOworCXB0cl9lcnIgPSB2Y2hpcV9kZXY7CisJaWYgKElTX0VSUihwdHJfZXJyKSkKKwkJZ290byBmYWlsZWRfZGV2aWNlX2NyZWF0ZTsKKworCWVyciA9IHZjaGlxX3BsYXRmb3JtX2luaXQocGRldiwgJmdfc3RhdGUpOworCWlmIChlcnIgIT0gMCkKKwkJZ290byBmYWlsZWRfcGxhdGZvcm1faW5pdDsKKworCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCSJ2Y2hpcTogaW5pdGlhbGlzZWQgLSB2ZXJzaW9uICVkIChtaW4gJWQpLCBkZXZpY2UgJWQuJWQiLAorCQlWQ0hJUV9WRVJTSU9OLCBWQ0hJUV9WRVJTSU9OX01JTiwKKwkJTUFKT1IodmNoaXFfZGV2aWQpLCBNSU5PUih2Y2hpcV9kZXZpZCkpOworCisJcmV0dXJuIDA7CisKK2ZhaWxlZF9wbGF0Zm9ybV9pbml0OgorCWRldmljZV9kZXN0cm95KHZjaGlxX2NsYXNzLCB2Y2hpcV9kZXZpZCk7CitmYWlsZWRfZGV2aWNlX2NyZWF0ZToKKwljbGFzc19kZXN0cm95KHZjaGlxX2NsYXNzKTsKK2ZhaWxlZF9jbGFzc19jcmVhdGU6CisJY2Rldl9kZWwoJnZjaGlxX2NkZXYpOworCWVyciA9IFBUUl9FUlIocHRyX2Vycik7CitmYWlsZWRfY2Rldl9hZGQ6CisJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKHZjaGlxX2RldmlkLCAxKTsKK2ZhaWxlZF9hbGxvY19jaHJkZXY6CisJdmNoaXFfZGVidWdmc19kZWluaXQoKTsKK2ZhaWxlZF9kZWJ1Z2ZzX2luaXQ6CisJdmNoaXFfbG9nX3dhcm5pbmcodmNoaXFfYXJtX2xvZ19sZXZlbCwgImNvdWxkIG5vdCBsb2FkIHZjaGlxIik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2Y2hpcV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlkZXZpY2VfZGVzdHJveSh2Y2hpcV9jbGFzcywgdmNoaXFfZGV2aWQpOworCWNsYXNzX2Rlc3Ryb3kodmNoaXFfY2xhc3MpOworCWNkZXZfZGVsKCZ2Y2hpcV9jZGV2KTsKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24odmNoaXFfZGV2aWQsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHZjaGlxX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJicmNtLGJjbTI4MzUtdmNoaXEiLCB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHZjaGlxX29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdmNoaXFfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImJjbTI4MzVfdmNoaXEiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gdmNoaXFfb2ZfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSB2Y2hpcV9wcm9iZSwKKwkucmVtb3ZlID0gdmNoaXFfcmVtb3ZlLAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIodmNoaXFfZHJpdmVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQnJvYWRjb20gQ29ycG9yYXRpb24iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfYXJtLmggYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2FybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NDBlMWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2FybS5oCkBAIC0wLDAgKzEsMjIwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCBSYXNwYmVycnkgUGkgKFRyYWRpbmcpIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEyIEJyb2FkY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbWF5IG5vdCBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFZDSElRX0FSTV9ICisjZGVmaW5lIFZDSElRX0FSTV9ICisKKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgInZjaGlxX2NvcmUuaCIKKyNpbmNsdWRlICJ2Y2hpcV9kZWJ1Z2ZzLmgiCisKKworZW51bSB2Y19zdXNwZW5kX3N0YXR1cyB7CisJVkNfU1VTUEVORF9GT1JDRV9DQU5DRUxFRCA9IC0zLCAvKiBGb3JjZSBzdXNwZW5kIGNhbmNlbGVkLCB0b28gYnVzeSAqLworCVZDX1NVU1BFTkRfUkVKRUNURUQgPSAtMiwgIC8qIFZpZGVvY29yZSByZWplY3RlZCBzdXNwZW5kIHJlcXVlc3QgKi8KKwlWQ19TVVNQRU5EX0ZBSUxFRCA9IC0xLCAgICAvKiBWaWRlb2NvcmUgc3VzcGVuZCBmYWlsZWQgKi8KKwlWQ19TVVNQRU5EX0lETEUgPSAwLCAgICAgICAvKiBWQyBhY3RpdmUsIG5vIHN1c3BlbmQgYWN0aW9ucyAqLworCVZDX1NVU1BFTkRfUkVRVUVTVEVELCAgICAgIC8qIFVzZXIgaGFzIHJlcXVlc3RlZCBzdXNwZW5kICovCisJVkNfU1VTUEVORF9JTl9QUk9HUkVTUywgICAgLyogU2xvdCBoYW5kbGVyIGhhcyByZWN2ZCBzdXNwZW5kIHJlcXVlc3QgKi8KKwlWQ19TVVNQRU5EX1NVU1BFTkRFRCAgICAgICAvKiBWaWRlb2NvcmUgc3VzcGVuZCBzdWNjZWVkZWQgKi8KK307CisKK2VudW0gdmNfcmVzdW1lX3N0YXR1cyB7CisJVkNfUkVTVU1FX0ZBSUxFRCA9IC0xLCAvKiBWaWRlb2NvcmUgcmVzdW1lIGZhaWxlZCAqLworCVZDX1JFU1VNRV9JRExFID0gMCwgICAgLyogVkMgc3VzcGVuZGVkLCBubyByZXN1bWUgYWN0aW9ucyAqLworCVZDX1JFU1VNRV9SRVFVRVNURUQsICAgLyogVXNlciBoYXMgcmVxdWVzdGVkIHJlc3VtZSAqLworCVZDX1JFU1VNRV9JTl9QUk9HUkVTUywgLyogU2xvdCBoYW5kbGVyIGhhcyByZWNlaXZlZCByZXN1bWUgcmVxdWVzdCAqLworCVZDX1JFU1VNRV9SRVNVTUVEICAgICAgLyogVmlkZW9jb3JlIHJlc3VtZWQgc3VjY2Vzc2Z1bGx5IChhY3RpdmUpICovCit9OworCisKK2VudW0gVVNFX1RZUEVfRSB7CisJVVNFX1RZUEVfU0VSVklDRSwKKwlVU0VfVFlQRV9TRVJWSUNFX05PX1JFU1VNRSwKKwlVU0VfVFlQRV9WQ0hJUQorfTsKKworCisKK3R5cGVkZWYgc3RydWN0IHZjaGlxX2FybV9zdGF0ZV9zdHJ1Y3QgeworCS8qIEtlZXBhbGl2ZS1yZWxhdGVkIGRhdGEgKi8KKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmthX3RocmVhZDsKKwlzdHJ1Y3QgY29tcGxldGlvbiBrYV9ldnQ7CisJYXRvbWljX3Qga2FfdXNlX2NvdW50OworCWF0b21pY190IGthX3VzZV9hY2tfY291bnQ7CisJYXRvbWljX3Qga2FfcmVsZWFzZV9jb3VudDsKKworCXN0cnVjdCBjb21wbGV0aW9uIHZjX3N1c3BlbmRfY29tcGxldGU7CisJc3RydWN0IGNvbXBsZXRpb24gdmNfcmVzdW1lX2NvbXBsZXRlOworCisJcndsb2NrX3Qgc3VzcF9yZXNfbG9jazsKKwllbnVtIHZjX3N1c3BlbmRfc3RhdHVzIHZjX3N1c3BlbmRfc3RhdGU7CisJZW51bSB2Y19yZXN1bWVfc3RhdHVzIHZjX3Jlc3VtZV9zdGF0ZTsKKworCXVuc2lnbmVkIGludCB3YWtlX2FkZHJlc3M7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCBzdXNwZW5kX3RpbWVyOworCWludCBzdXNwZW5kX3RpbWVyX3RpbWVvdXQ7CisJaW50IHN1c3BlbmRfdGltZXJfcnVubmluZzsKKworCS8qIEdsb2JhbCB1c2UgY291bnQgZm9yIHZpZGVvY29yZS4KKwkqKiBUaGlzIGlzIGVxdWFsIHRvIHRoZSBzdW0gb2YgdGhlIHVzZSBjb3VudHMgZm9yIGFsbCBzZXJ2aWNlcy4gIFdoZW4KKwkqKiB0aGlzIGhpdHMgemVybyB0aGUgdmlkZW9jb3JlIHN1c3BlbmQgcHJvY2VkdXJlIHdpbGwgYmUgaW5pdGlhdGVkLgorCSovCisJaW50IHZpZGVvY29yZV91c2VfY291bnQ7CisKKwkvKiBVc2UgY291bnQgdG8gdHJhY2sgcmVxdWVzdHMgZnJvbSB2aWRlb2NvcmUgcGVlci4KKwkqKiBUaGlzIHVzZSBjb3VudCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgc2VydmljZSwgc28gbmVlZHMgdG8gYmUKKwkqKiB0cmFja2VkIHNlcGFyYXRlbHkgd2l0aCB0aGUgc3RhdGUuCisJKi8KKwlpbnQgcGVlcl91c2VfY291bnQ7CisKKwkvKiBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgcmVzdW1lIGlzIGJsb2NrZWQuICBUaGlzIGhhcHBlbnMgd2hlbiB0aGUKKwkqKiBBUk0gaXMgc3VzcGVuZGluZworCSovCisJc3RydWN0IGNvbXBsZXRpb24gcmVzdW1lX2Jsb2NrZXI7CisJaW50IHJlc3VtZV9ibG9ja2VkOworCXN0cnVjdCBjb21wbGV0aW9uIGJsb2NrZWRfYmxvY2tlcjsKKwlpbnQgYmxvY2tlZF9jb3VudDsKKworCWludCBhdXRvc3VzcGVuZF9vdmVycmlkZTsKKworCS8qIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZmlyc3QgdmNoaXEgY29ubmVjdCBoYXMgbWFkZSBpdCB0aHJvdWdoLgorCSoqIFRoaXMgbWVhbnMgdGhhdCBib3RoIHNpZGVzIHNob3VsZCBiZSBmdWxseSByZWFkeSwgYW5kIHdlIHNob3VsZAorCSoqIGJlIGFibGUgdG8gc3VzcGVuZCBhZnRlciB0aGlzIHBvaW50LgorCSovCisJaW50IGZpcnN0X2Nvbm5lY3Q7CisKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3VzcGVuZF9zdGFydF90aW1lOworCXVuc2lnbmVkIGxvbmcgbG9uZyBzbGVlcF9zdGFydF90aW1lOworCXVuc2lnbmVkIGxvbmcgbG9uZyByZXN1bWVfc3RhcnRfdGltZTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbGFzdF93YWtlX3RpbWU7CisKK30gVkNISVFfQVJNX1NUQVRFX1Q7CisKK2V4dGVybiBpbnQgdmNoaXFfYXJtX2xvZ19sZXZlbDsKK2V4dGVybiBpbnQgdmNoaXFfc3VzcF9sb2dfbGV2ZWw7CisKK2ludCB2Y2hpcV9wbGF0Zm9ybV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIFZDSElRX1NUQVRFX1QgKgordmNoaXFfZ2V0X3N0YXRlKHZvaWQpOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX2FybV92Y3N1c3BlbmQoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX2FybV9mb3JjZV9zdXNwZW5kKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIGludAordmNoaXFfYXJtX2FsbG93X3Jlc3VtZShWQ0hJUV9TVEFURV9UICpzdGF0ZSk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVAordmNoaXFfYXJtX3ZjcmVzdW1lKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIFZDSElRX1NUQVRVU19UCit2Y2hpcV9hcm1faW5pdF9zdGF0ZShWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZSk7CisKK2V4dGVybiBpbnQKK3ZjaGlxX2NoZWNrX3Jlc3VtZShWQ0hJUV9TVEFURV9UICpzdGF0ZSk7CisKK2V4dGVybiB2b2lkCit2Y2hpcV9jaGVja19zdXNwZW5kKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKyBWQ0hJUV9TVEFUVVNfVAordmNoaXFfdXNlX3NlcnZpY2UoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUpOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3JlbGVhc2Vfc2VydmljZShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVAordmNoaXFfY2hlY2tfc2VydmljZShWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UpOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3BsYXRmb3JtX3N1c3BlbmQoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gaW50Cit2Y2hpcV9wbGF0Zm9ybV92aWRlb2NvcmVfd2FudGVkKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIGludAordmNoaXFfcGxhdGZvcm1fdXNlX3N1c3BlbmRfdGltZXIodm9pZCk7CisKK2V4dGVybiB2b2lkCit2Y2hpcV9kdW1wX3BsYXRmb3JtX3VzZV9zdGF0ZShWQ0hJUV9TVEFURV9UICpzdGF0ZSk7CisKK2V4dGVybiB2b2lkCit2Y2hpcV9kdW1wX3NlcnZpY2VfdXNlX3N0YXRlKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIFZDSElRX0FSTV9TVEFURV9UKgordmNoaXFfcGxhdGZvcm1fZ2V0X2FybV9zdGF0ZShWQ0hJUV9TVEFURV9UICpzdGF0ZSk7CisKK2V4dGVybiBpbnQKK3ZjaGlxX3ZpZGVvY29yZV93YW50ZWQoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3VzZV9pbnRlcm5hbChWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlLAorCQllbnVtIFVTRV9UWVBFX0UgdXNlX3R5cGUpOworZXh0ZXJuIFZDSElRX1NUQVRVU19UCit2Y2hpcV9yZWxlYXNlX2ludGVybmFsKFZDSElRX1NUQVRFX1QgKnN0YXRlLCBWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UpOworCitleHRlcm4gVkNISVFfREVCVUdGU19OT0RFX1QgKgordmNoaXFfaW5zdGFuY2VfZ2V0X2RlYnVnZnNfbm9kZShWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlKTsKKworZXh0ZXJuIGludAordmNoaXFfaW5zdGFuY2VfZ2V0X3VzZV9jb3VudChWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlKTsKKworZXh0ZXJuIGludAordmNoaXFfaW5zdGFuY2VfZ2V0X3BpZChWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlKTsKKworZXh0ZXJuIGludAordmNoaXFfaW5zdGFuY2VfZ2V0X3RyYWNlKFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UpOworCitleHRlcm4gdm9pZAordmNoaXFfaW5zdGFuY2Vfc2V0X3RyYWNlKFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UsIGludCB0cmFjZSk7CisKK2V4dGVybiB2b2lkCitzZXRfc3VzcGVuZF9zdGF0ZShWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlLAorCWVudW0gdmNfc3VzcGVuZF9zdGF0dXMgbmV3X3N0YXRlKTsKKworZXh0ZXJuIHZvaWQKK3NldF9yZXN1bWVfc3RhdGUoVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZSwKKwllbnVtIHZjX3Jlc3VtZV9zdGF0dXMgbmV3X3N0YXRlKTsKKworZXh0ZXJuIHZvaWQKK3N0YXJ0X3N1c3BlbmRfdGltZXIoVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZSk7CisKKworI2VuZGlmIC8qIFZDSElRX0FSTV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2J1aWxkX2luZm8uaCBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfYnVpbGRfaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNjQ1ODEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2J1aWxkX2luZm8uaApAQCAtMCwwICsxLDM3IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEyIEJyb2FkY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbWF5IG5vdCBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitjb25zdCBjaGFyICp2Y2hpcV9nZXRfYnVpbGRfaG9zdG5hbWUodm9pZCk7Citjb25zdCBjaGFyICp2Y2hpcV9nZXRfYnVpbGRfdmVyc2lvbih2b2lkKTsKK2NvbnN0IGNoYXIgKnZjaGlxX2dldF9idWlsZF90aW1lKHZvaWQpOworY29uc3QgY2hhciAqdmNoaXFfZ2V0X2J1aWxkX2RhdGUodm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2NmZy5oIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9jZmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjc5N2RiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9jZmcuaApAQCAtMCwwICsxLDY5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDE0IEJyb2FkY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbWF5IG5vdCBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFZDSElRX0NGR19ICisjZGVmaW5lIFZDSElRX0NGR19ICisKKyNkZWZpbmUgVkNISVFfTUFHSUMgICAgICAgICAgICAgIFZDSElRX01BS0VfRk9VUkNDKCdWJywgJ0MnLCAnSCcsICdJJykKKy8qIFRoZSB2ZXJzaW9uIG9mIFZDSElRIC0gY2hhbmdlIHdpdGggYW55IG5vbi10cml2aWFsIGNoYW5nZSAqLworI2RlZmluZSBWQ0hJUV9WRVJTSU9OICAgICAgICAgICAgOAorLyogVGhlIG1pbmltdW0gY29tcGF0aWJsZSB2ZXJzaW9uIC0gdXBkYXRlIHRvIG1hdGNoIFZDSElRX1ZFUlNJT04gd2l0aCBhbnkKKyoqIGluY29tcGF0aWJsZSBjaGFuZ2UgKi8KKyNkZWZpbmUgVkNISVFfVkVSU0lPTl9NSU4gICAgICAgIDMKKworLyogVGhlIHZlcnNpb24gdGhhdCBpbnRyb2R1Y2VkIHRoZSBWQ0hJUV9JT0NfTElCX1ZFUlNJT04gaW9jdGwgKi8KKyNkZWZpbmUgVkNISVFfVkVSU0lPTl9MSUJfVkVSU0lPTiA3CisKKy8qIFRoZSB2ZXJzaW9uIHRoYXQgaW50cm9kdWNlZCB0aGUgVkNISVFfSU9DX0NMT1NFX0RFTElWRVJFRCBpb2N0bCAqLworI2RlZmluZSBWQ0hJUV9WRVJTSU9OX0NMT1NFX0RFTElWRVJFRCA3CisKKy8qIFRoZSB2ZXJzaW9uIHRoYXQgbWFkZSBpdCBzYWZlIHRvIHVzZSBTWU5DSFJPTk9VUyBtb2RlICovCisjZGVmaW5lIFZDSElRX1ZFUlNJT05fU1lOQ0hST05PVVNfTU9ERSA4CisKKyNkZWZpbmUgVkNISVFfTUFYX1NUQVRFUyAgICAgICAgIDEKKyNkZWZpbmUgVkNISVFfTUFYX1NFUlZJQ0VTICAgICAgIDQwOTYKKyNkZWZpbmUgVkNISVFfTUFYX1NMT1RTICAgICAgICAgIDEyOAorI2RlZmluZSBWQ0hJUV9NQVhfU0xPVFNfUEVSX1NJREUgNjQKKworI2RlZmluZSBWQ0hJUV9OVU1fQ1VSUkVOVF9CVUxLUyAgICAgICAgMzIKKyNkZWZpbmUgVkNISVFfTlVNX1NFUlZJQ0VfQlVMS1MgICAgICAgIDQKKworI2lmbmRlZiBWQ0hJUV9FTkFCTEVfREVCVUcKKyNkZWZpbmUgVkNISVFfRU5BQkxFX0RFQlVHICAgICAgICAgICAgIDEKKyNlbmRpZgorCisjaWZuZGVmIFZDSElRX0VOQUJMRV9TVEFUUworI2RlZmluZSBWQ0hJUV9FTkFCTEVfU1RBVFMgICAgICAgICAgICAgMQorI2VuZGlmCisKKyNlbmRpZiAvKiBWQ0hJUV9DRkdfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9jb25uZWN0ZWQuYyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfY29ubmVjdGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVmYzYyZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfY29ubmVjdGVkLmMKQEAgLTAsMCArMSwxMjAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJ2Y2hpcV9jb25uZWN0ZWQuaCIKKyNpbmNsdWRlICJ2Y2hpcV9jb3JlLmgiCisjaW5jbHVkZSAidmNoaXFfa2lsbGFibGUuaCIKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorCisjZGVmaW5lICBNQVhfQ0FMTEJBQ0tTICAxMAorCitzdGF0aWMgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBnX2Nvbm5lY3RlZDsKK3N0YXRpYyAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGdfbnVtX2RlZmVycmVkX2NhbGxiYWNrczsKK3N0YXRpYyAgIFZDSElRX0NPTk5FQ1RFRF9DQUxMQkFDS19UIGdfZGVmZXJyZWRfY2FsbGJhY2tbTUFYX0NBTExCQUNLU107CitzdGF0aWMgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBnX29uY2VfaW5pdDsKK3N0YXRpYyAgIHN0cnVjdCBtdXRleCAgICAgICAgICAgICAgIGdfY29ubmVjdGVkX211dGV4OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGdW5jdGlvbiB0byBpbml0aWFsaXplIG91ciBsb2NrLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBjb25uZWN0ZWRfaW5pdCh2b2lkKQoreworCWlmICghZ19vbmNlX2luaXQpIHsKKwkJbXV0ZXhfaW5pdCgmZ19jb25uZWN0ZWRfbXV0ZXgpOworCQlnX29uY2VfaW5pdCA9IDE7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZGVmZXIgaW5pdGlhbGl6YXRpb24gdW50aWwgdGhlIHZjaGlxIHN0YWNrIGlzCisqIGluaXRpYWxpemVkLiBJZiB0aGUgc3RhY2sgaXMgYWxyZWFkeSBpbml0aWFsaXplZCwgdGhlbiB0aGUgY2FsbGJhY2sgd2lsbAorKiBiZSBtYWRlIGltbWVkaWF0ZWx5LCBvdGhlcndpc2UgaXQgd2lsbCBiZSBkZWZlcnJlZCB1bnRpbAorKiB2Y2hpcV9jYWxsX2Nvbm5lY3RlZF9jYWxsYmFja3MgaXMgY2FsbGVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIHZjaGlxX2FkZF9jb25uZWN0ZWRfY2FsbGJhY2soVkNISVFfQ09OTkVDVEVEX0NBTExCQUNLX1QgY2FsbGJhY2spCit7CisJY29ubmVjdGVkX2luaXQoKTsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmdfY29ubmVjdGVkX211dGV4KSAhPSAwKQorCQlyZXR1cm47CisKKwlpZiAoZ19jb25uZWN0ZWQpCisJCS8qIFdlJ3JlIGFscmVhZHkgY29ubmVjdGVkLiBDYWxsIHRoZSBjYWxsYmFjayBpbW1lZGlhdGVseS4gKi8KKworCQljYWxsYmFjaygpOworCWVsc2UgeworCQlpZiAoZ19udW1fZGVmZXJyZWRfY2FsbGJhY2tzID49IE1BWF9DQUxMQkFDS1MpCisJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJIlRoZXJlIGFscmVhZHkgJWQgY2FsbGJhY2sgcmVnaXN0ZXJlZCAtICIKKwkJCQkicGxlYXNlIGluY3JlYXNlIE1BWF9DQUxMQkFDS1MiLAorCQkJCWdfbnVtX2RlZmVycmVkX2NhbGxiYWNrcyk7CisJCWVsc2UgeworCQkJZ19kZWZlcnJlZF9jYWxsYmFja1tnX251bV9kZWZlcnJlZF9jYWxsYmFja3NdID0KKwkJCQljYWxsYmFjazsKKwkJCWdfbnVtX2RlZmVycmVkX2NhbGxiYWNrcysrOworCQl9CisJfQorCW11dGV4X3VubG9jaygmZ19jb25uZWN0ZWRfbXV0ZXgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgdmNoaXEgc3RhY2sgb25jZSBpdCBoYXMgYmVlbiBjb25uZWN0ZWQgdG8KKyogdGhlIHZpZGVvY29yZSBhbmQgY2xpZW50cyBjYW4gc3RhcnQgdG8gdXNlIHRoZSBzdGFjay4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCB2Y2hpcV9jYWxsX2Nvbm5lY3RlZF9jYWxsYmFja3Modm9pZCkKK3sKKwlpbnQgaTsKKworCWNvbm5lY3RlZF9pbml0KCk7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZnX2Nvbm5lY3RlZF9tdXRleCkgIT0gMCkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8ICBnX251bV9kZWZlcnJlZF9jYWxsYmFja3M7IGkrKykKKwkJZ19kZWZlcnJlZF9jYWxsYmFja1tpXSgpOworCisJZ19udW1fZGVmZXJyZWRfY2FsbGJhY2tzID0gMDsKKwlnX2Nvbm5lY3RlZCA9IDE7CisJbXV0ZXhfdW5sb2NrKCZnX2Nvbm5lY3RlZF9tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MKHZjaGlxX2FkZF9jb25uZWN0ZWRfY2FsbGJhY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9jb25uZWN0ZWQuaCBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfY29ubmVjdGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYzYjNlMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfY29ubmVjdGVkLmgKQEAgLTAsMCArMSw1MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBWQ0hJUV9DT05ORUNURURfSAorI2RlZmluZSBWQ0hJUV9DT05ORUNURURfSAorCisvKiAtLS0tIEluY2x1ZGUgRmlsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLSBDb25zdGFudHMgYW5kIFR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordHlwZWRlZiB2b2lkICgqVkNISVFfQ09OTkVDVEVEX0NBTExCQUNLX1QpKHZvaWQpOworCisvKiAtLS0tIFZhcmlhYmxlIEV4dGVybnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tIEZ1bmN0aW9uIFByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIHZjaGlxX2FkZF9jb25uZWN0ZWRfY2FsbGJhY2soVkNISVFfQ09OTkVDVEVEX0NBTExCQUNLX1QgY2FsbGJhY2spOwordm9pZCB2Y2hpcV9jYWxsX2Nvbm5lY3RlZF9jYWxsYmFja3Modm9pZCk7CisKKyNlbmRpZiAvKiBWQ0hJUV9DT05ORUNURURfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzk4ZGE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9jb3JlLmMKQEAgLTAsMCArMSwzOTM0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEyIEJyb2FkY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbWF5IG5vdCBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAidmNoaXFfY29yZS5oIgorI2luY2x1ZGUgInZjaGlxX2tpbGxhYmxlLmgiCisKKyNkZWZpbmUgVkNISVFfU0xPVF9IQU5ETEVSX1NUQUNLIDgxOTIKKworI2RlZmluZSBIQU5ETEVfU1RBVEVfU0hJRlQgMTIKKworI2RlZmluZSBTTE9UX0lORk9fRlJPTV9JTkRFWChzdGF0ZSwgaW5kZXgpIChzdGF0ZS0+c2xvdF9pbmZvICsgKGluZGV4KSkKKyNkZWZpbmUgU0xPVF9EQVRBX0ZST01fSU5ERVgoc3RhdGUsIGluZGV4KSAoc3RhdGUtPnNsb3RfZGF0YSArIChpbmRleCkpCisjZGVmaW5lIFNMT1RfSU5ERVhfRlJPTV9EQVRBKHN0YXRlLCBkYXRhKSBcCisJKCgodW5zaWduZWQgaW50KSgoY2hhciAqKWRhdGEgLSAoY2hhciAqKXN0YXRlLT5zbG90X2RhdGEpKSAvIFwKKwlWQ0hJUV9TTE9UX1NJWkUpCisjZGVmaW5lIFNMT1RfSU5ERVhfRlJPTV9JTkZPKHN0YXRlLCBpbmZvKSBcCisJKCh1bnNpZ25lZCBpbnQpKGluZm8gLSBzdGF0ZS0+c2xvdF9pbmZvKSkKKyNkZWZpbmUgU0xPVF9RVUVVRV9JTkRFWF9GUk9NX1BPUyhwb3MpIFwKKwkoKGludCkoKHVuc2lnbmVkIGludCkocG9zKSAvIFZDSElRX1NMT1RfU0laRSkpCisKKyNkZWZpbmUgQlVMS19JTkRFWCh4KSAoeCAmIChWQ0hJUV9OVU1fU0VSVklDRV9CVUxLUyAtIDEpKQorCisjZGVmaW5lIFNSVlRSQUNFX0xFVkVMKHNydikgXAorCSgoKHNydikgJiYgKHNydiktPnRyYWNlKSA/IFZDSElRX0xPR19UUkFDRSA6IHZjaGlxX2NvcmVfbXNnX2xvZ19sZXZlbCkKKyNkZWZpbmUgU1JWVFJBQ0VfRU5BQkxFRChzcnYsIGxldikgXAorCSgoKHNydikgJiYgKHNydiktPnRyYWNlKSB8fCAodmNoaXFfY29yZV9tc2dfbG9nX2xldmVsID49IChsZXYpKSkKKworc3RydWN0IHZjaGlxX29wZW5fcGF5bG9hZCB7CisJaW50IGZvdXJjYzsKKwlpbnQgY2xpZW50X2lkOworCXNob3J0IHZlcnNpb247CisJc2hvcnQgdmVyc2lvbl9taW47Cit9OworCitzdHJ1Y3QgdmNoaXFfb3BlbmFja19wYXlsb2FkIHsKKwlzaG9ydCB2ZXJzaW9uOworfTsKKworZW51bQoreworCVFNRkxBR1NfSVNfQkxPQ0tJTkcgICAgID0gKDEgPDwgMCksCisJUU1GTEFHU19OT19NVVRFWF9MT0NLICAgPSAoMSA8PCAxKSwKKwlRTUZMQUdTX05PX01VVEVYX1VOTE9DSyA9ICgxIDw8IDIpCit9OworCisvKiB3ZSByZXF1aXJlIHRoaXMgZm9yIGNvbnNpc3RlbmN5IGJldHdlZW4gZW5kcG9pbnRzICovCit2Y2hpcV9zdGF0aWNfYXNzZXJ0KHNpemVvZihWQ0hJUV9IRUFERVJfVCkgPT0gOCk7Cit2Y2hpcV9zdGF0aWNfYXNzZXJ0KElTX1BPVzIoc2l6ZW9mKFZDSElRX0hFQURFUl9UKSkpOwordmNoaXFfc3RhdGljX2Fzc2VydChJU19QT1cyKFZDSElRX05VTV9DVVJSRU5UX0JVTEtTKSk7Cit2Y2hpcV9zdGF0aWNfYXNzZXJ0KElTX1BPVzIoVkNISVFfTlVNX1NFUlZJQ0VfQlVMS1MpKTsKK3ZjaGlxX3N0YXRpY19hc3NlcnQoSVNfUE9XMihWQ0hJUV9NQVhfU0VSVklDRVMpKTsKK3ZjaGlxX3N0YXRpY19hc3NlcnQoVkNISVFfVkVSU0lPTiA+PSBWQ0hJUV9WRVJTSU9OX01JTik7CisKKy8qIFJ1biB0aW1lIGNvbnRyb2wgb2YgbG9nIGxldmVsLCBiYXNlZCBvbiBLRVJOX1hYWCBsZXZlbC4gKi8KK2ludCB2Y2hpcV9jb3JlX2xvZ19sZXZlbCA9IFZDSElRX0xPR19ERUZBVUxUOworaW50IHZjaGlxX2NvcmVfbXNnX2xvZ19sZXZlbCA9IFZDSElRX0xPR19ERUZBVUxUOworaW50IHZjaGlxX3N5bmNfbG9nX2xldmVsID0gVkNISVFfTE9HX0RFRkFVTFQ7CisKK3N0YXRpYyBhdG9taWNfdCBwYXVzZV9idWxrc19jb3VudCA9IEFUT01JQ19JTklUKDApOworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNlcnZpY2Vfc3BpbmxvY2spOworREVGSU5FX1NQSU5MT0NLKGJ1bGtfd2FpdGVyX3NwaW5sb2NrKTsKK0RFRklORV9TUElOTE9DSyhxdW90YV9zcGlubG9jayk7CisKK1ZDSElRX1NUQVRFX1QgKnZjaGlxX3N0YXRlc1tWQ0hJUV9NQVhfU1RBVEVTXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaGFuZGxlX3NlcTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNydnN0YXRlX25hbWVzW10gPSB7CisJIkZSRUUiLAorCSJISURERU4iLAorCSJMSVNURU5JTkciLAorCSJPUEVOSU5HIiwKKwkiT1BFTiIsCisJIk9QRU5TWU5DIiwKKwkiQ0xPU0VTRU5UIiwKKwkiQ0xPU0VSRUNWRCIsCisJIkNMT1NFV0FJVCIsCisJIkNMT1NFRCIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCByZWFzb25fbmFtZXNbXSA9IHsKKwkiU0VSVklDRV9PUEVORUQiLAorCSJTRVJWSUNFX0NMT1NFRCIsCisJIk1FU1NBR0VfQVZBSUxBQkxFIiwKKwkiQlVMS19UUkFOU01JVF9ET05FIiwKKwkiQlVMS19SRUNFSVZFX0RPTkUiLAorCSJCVUxLX1RSQU5TTUlUX0FCT1JURUQiLAorCSJCVUxLX1JFQ0VJVkVfQUJPUlRFRCIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb25uX3N0YXRlX25hbWVzW10gPSB7CisJIkRJU0NPTk5FQ1RFRCIsCisJIkNPTk5FQ1RJTkciLAorCSJDT05ORUNURUQiLAorCSJQQVVTSU5HIiwKKwkiUEFVU0VfU0VOVCIsCisJIlBBVVNFRCIsCisJIlJFU1VNSU5HIiwKKwkiUEFVU0VfVElNRU9VVCIsCisJIlJFU1VNRV9USU1FT1VUIgorfTsKKworCitzdGF0aWMgdm9pZAorcmVsZWFzZV9tZXNzYWdlX3N5bmMoVkNISVFfU1RBVEVfVCAqc3RhdGUsIFZDSElRX0hFQURFUl9UICpoZWFkZXIpOworCitzdGF0aWMgY29uc3QgY2hhciAqbXNnX3R5cGVfc3RyKHVuc2lnbmVkIGludCBtc2dfdHlwZSkKK3sKKwlzd2l0Y2ggKG1zZ190eXBlKSB7CisJY2FzZSBWQ0hJUV9NU0dfUEFERElORzogICAgICAgcmV0dXJuICJQQURESU5HIjsKKwljYXNlIFZDSElRX01TR19DT05ORUNUOiAgICAgICByZXR1cm4gIkNPTk5FQ1QiOworCWNhc2UgVkNISVFfTVNHX09QRU46ICAgICAgICAgIHJldHVybiAiT1BFTiI7CisJY2FzZSBWQ0hJUV9NU0dfT1BFTkFDSzogICAgICAgcmV0dXJuICJPUEVOQUNLIjsKKwljYXNlIFZDSElRX01TR19DTE9TRTogICAgICAgICByZXR1cm4gIkNMT1NFIjsKKwljYXNlIFZDSElRX01TR19EQVRBOiAgICAgICAgICByZXR1cm4gIkRBVEEiOworCWNhc2UgVkNISVFfTVNHX0JVTEtfUlg6ICAgICAgIHJldHVybiAiQlVMS19SWCI7CisJY2FzZSBWQ0hJUV9NU0dfQlVMS19UWDogICAgICAgcmV0dXJuICJCVUxLX1RYIjsKKwljYXNlIFZDSElRX01TR19CVUxLX1JYX0RPTkU6ICByZXR1cm4gIkJVTEtfUlhfRE9ORSI7CisJY2FzZSBWQ0hJUV9NU0dfQlVMS19UWF9ET05FOiAgcmV0dXJuICJCVUxLX1RYX0RPTkUiOworCWNhc2UgVkNISVFfTVNHX1BBVVNFOiAgICAgICAgIHJldHVybiAiUEFVU0UiOworCWNhc2UgVkNISVFfTVNHX1JFU1VNRTogICAgICAgIHJldHVybiAiUkVTVU1FIjsKKwljYXNlIFZDSElRX01TR19SRU1PVEVfVVNFOiAgICByZXR1cm4gIlJFTU9URV9VU0UiOworCWNhc2UgVkNISVFfTVNHX1JFTU9URV9SRUxFQVNFOiAgICAgIHJldHVybiAiUkVNT1RFX1JFTEVBU0UiOworCWNhc2UgVkNISVFfTVNHX1JFTU9URV9VU0VfQUNUSVZFOiAgIHJldHVybiAiUkVNT1RFX1VTRV9BQ1RJVkUiOworCX0KKwlyZXR1cm4gIj8/PyI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAordmNoaXFfc2V0X3NlcnZpY2Vfc3RhdGUoVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlLCBpbnQgbmV3c3RhdGUpCit7CisJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsICIlZDogc3J2OiVkICVzLT4lcyIsCisJCXNlcnZpY2UtPnN0YXRlLT5pZCwgc2VydmljZS0+bG9jYWxwb3J0LAorCQlzcnZzdGF0ZV9uYW1lc1tzZXJ2aWNlLT5zcnZzdGF0ZV0sCisJCXNydnN0YXRlX25hbWVzW25ld3N0YXRlXSk7CisJc2VydmljZS0+c3J2c3RhdGUgPSBuZXdzdGF0ZTsKK30KKworVkNISVFfU0VSVklDRV9UICoKK2ZpbmRfc2VydmljZV9ieV9oYW5kbGUoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUpCit7CisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlOworCisJc3Bpbl9sb2NrKCZzZXJ2aWNlX3NwaW5sb2NrKTsKKwlzZXJ2aWNlID0gaGFuZGxlX3RvX3NlcnZpY2UoaGFuZGxlKTsKKwlpZiAoc2VydmljZSAmJiAoc2VydmljZS0+c3J2c3RhdGUgIT0gVkNISVFfU1JWU1RBVEVfRlJFRSkgJiYKKwkJKHNlcnZpY2UtPmhhbmRsZSA9PSBoYW5kbGUpKSB7CisJCUJVR19PTihzZXJ2aWNlLT5yZWZfY291bnQgPT0gMCk7CisJCXNlcnZpY2UtPnJlZl9jb3VudCsrOworCX0gZWxzZQorCQlzZXJ2aWNlID0gTlVMTDsKKwlzcGluX3VubG9jaygmc2VydmljZV9zcGlubG9jayk7CisKKwlpZiAoIXNlcnZpY2UpCisJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJIkludmFsaWQgc2VydmljZSBoYW5kbGUgMHgleCIsIGhhbmRsZSk7CisKKwlyZXR1cm4gc2VydmljZTsKK30KKworVkNISVFfU0VSVklDRV9UICoKK2ZpbmRfc2VydmljZV9ieV9wb3J0KFZDSElRX1NUQVRFX1QgKnN0YXRlLCBpbnQgbG9jYWxwb3J0KQoreworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IE5VTEw7CisJaWYgKCh1bnNpZ25lZCBpbnQpbG9jYWxwb3J0IDw9IFZDSElRX1BPUlRfTUFYKSB7CisJCXNwaW5fbG9jaygmc2VydmljZV9zcGlubG9jayk7CisJCXNlcnZpY2UgPSBzdGF0ZS0+c2VydmljZXNbbG9jYWxwb3J0XTsKKwkJaWYgKHNlcnZpY2UgJiYgKHNlcnZpY2UtPnNydnN0YXRlICE9IFZDSElRX1NSVlNUQVRFX0ZSRUUpKSB7CisJCQlCVUdfT04oc2VydmljZS0+cmVmX2NvdW50ID09IDApOworCQkJc2VydmljZS0+cmVmX2NvdW50Kys7CisJCX0gZWxzZQorCQkJc2VydmljZSA9IE5VTEw7CisJCXNwaW5fdW5sb2NrKCZzZXJ2aWNlX3NwaW5sb2NrKTsKKwl9CisKKwlpZiAoIXNlcnZpY2UpCisJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJIkludmFsaWQgcG9ydCAlZCIsIGxvY2FscG9ydCk7CisKKwlyZXR1cm4gc2VydmljZTsKK30KKworVkNISVFfU0VSVklDRV9UICoKK2ZpbmRfc2VydmljZV9mb3JfaW5zdGFuY2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSwKKwlWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSkgeworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZTsKKworCXNwaW5fbG9jaygmc2VydmljZV9zcGlubG9jayk7CisJc2VydmljZSA9IGhhbmRsZV90b19zZXJ2aWNlKGhhbmRsZSk7CisJaWYgKHNlcnZpY2UgJiYgKHNlcnZpY2UtPnNydnN0YXRlICE9IFZDSElRX1NSVlNUQVRFX0ZSRUUpICYmCisJCShzZXJ2aWNlLT5oYW5kbGUgPT0gaGFuZGxlKSAmJgorCQkoc2VydmljZS0+aW5zdGFuY2UgPT0gaW5zdGFuY2UpKSB7CisJCUJVR19PTihzZXJ2aWNlLT5yZWZfY291bnQgPT0gMCk7CisJCXNlcnZpY2UtPnJlZl9jb3VudCsrOworCX0gZWxzZQorCQlzZXJ2aWNlID0gTlVMTDsKKwlzcGluX3VubG9jaygmc2VydmljZV9zcGlubG9jayk7CisKKwlpZiAoIXNlcnZpY2UpCisJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJIkludmFsaWQgc2VydmljZSBoYW5kbGUgMHgleCIsIGhhbmRsZSk7CisKKwlyZXR1cm4gc2VydmljZTsKK30KKworVkNISVFfU0VSVklDRV9UICoKK2ZpbmRfY2xvc2VkX3NlcnZpY2VfZm9yX2luc3RhbmNlKFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UsCisJVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUpIHsKKwlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2U7CisKKwlzcGluX2xvY2soJnNlcnZpY2Vfc3BpbmxvY2spOworCXNlcnZpY2UgPSBoYW5kbGVfdG9fc2VydmljZShoYW5kbGUpOworCWlmIChzZXJ2aWNlICYmCisJCSgoc2VydmljZS0+c3J2c3RhdGUgPT0gVkNISVFfU1JWU1RBVEVfRlJFRSkgfHwKKwkJIChzZXJ2aWNlLT5zcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9DTE9TRUQpKSAmJgorCQkoc2VydmljZS0+aGFuZGxlID09IGhhbmRsZSkgJiYKKwkJKHNlcnZpY2UtPmluc3RhbmNlID09IGluc3RhbmNlKSkgeworCQlCVUdfT04oc2VydmljZS0+cmVmX2NvdW50ID09IDApOworCQlzZXJ2aWNlLT5yZWZfY291bnQrKzsKKwl9IGVsc2UKKwkJc2VydmljZSA9IE5VTEw7CisJc3Bpbl91bmxvY2soJnNlcnZpY2Vfc3BpbmxvY2spOworCisJaWYgKCFzZXJ2aWNlKQorCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCSJJbnZhbGlkIHNlcnZpY2UgaGFuZGxlIDB4JXgiLCBoYW5kbGUpOworCisJcmV0dXJuIHNlcnZpY2U7Cit9CisKK1ZDSElRX1NFUlZJQ0VfVCAqCituZXh0X3NlcnZpY2VfYnlfaW5zdGFuY2UoVkNISVFfU1RBVEVfVCAqc3RhdGUsIFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UsCisJaW50ICpwaWR4KQoreworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IE5VTEw7CisJaW50IGlkeCA9ICpwaWR4OworCisJc3Bpbl9sb2NrKCZzZXJ2aWNlX3NwaW5sb2NrKTsKKwl3aGlsZSAoaWR4IDwgc3RhdGUtPnVudXNlZF9zZXJ2aWNlKSB7CisJCVZDSElRX1NFUlZJQ0VfVCAqc3J2ID0gc3RhdGUtPnNlcnZpY2VzW2lkeCsrXTsKKwkJaWYgKHNydiAmJiAoc3J2LT5zcnZzdGF0ZSAhPSBWQ0hJUV9TUlZTVEFURV9GUkVFKSAmJgorCQkJKHNydi0+aW5zdGFuY2UgPT0gaW5zdGFuY2UpKSB7CisJCQlzZXJ2aWNlID0gc3J2OworCQkJQlVHX09OKHNlcnZpY2UtPnJlZl9jb3VudCA9PSAwKTsKKwkJCXNlcnZpY2UtPnJlZl9jb3VudCsrOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJnNlcnZpY2Vfc3BpbmxvY2spOworCisJKnBpZHggPSBpZHg7CisKKwlyZXR1cm4gc2VydmljZTsKK30KKwordm9pZAorbG9ja19zZXJ2aWNlKFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSkKK3sKKwlzcGluX2xvY2soJnNlcnZpY2Vfc3BpbmxvY2spOworCUJVR19PTighc2VydmljZSB8fCAoc2VydmljZS0+cmVmX2NvdW50ID09IDApKTsKKwlpZiAoc2VydmljZSkKKwkJc2VydmljZS0+cmVmX2NvdW50Kys7CisJc3Bpbl91bmxvY2soJnNlcnZpY2Vfc3BpbmxvY2spOworfQorCit2b2lkCit1bmxvY2tfc2VydmljZShWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UpCit7CisJVkNISVFfU1RBVEVfVCAqc3RhdGUgPSBzZXJ2aWNlLT5zdGF0ZTsKKwlzcGluX2xvY2soJnNlcnZpY2Vfc3BpbmxvY2spOworCUJVR19PTighc2VydmljZSB8fCAoc2VydmljZS0+cmVmX2NvdW50ID09IDApKTsKKwlpZiAoc2VydmljZSAmJiBzZXJ2aWNlLT5yZWZfY291bnQpIHsKKwkJc2VydmljZS0+cmVmX2NvdW50LS07CisJCWlmICghc2VydmljZS0+cmVmX2NvdW50KSB7CisJCQlCVUdfT04oc2VydmljZS0+c3J2c3RhdGUgIT0gVkNISVFfU1JWU1RBVEVfRlJFRSk7CisJCQlzdGF0ZS0+c2VydmljZXNbc2VydmljZS0+bG9jYWxwb3J0XSA9IE5VTEw7CisJCX0gZWxzZQorCQkJc2VydmljZSA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrKCZzZXJ2aWNlX3NwaW5sb2NrKTsKKworCWlmIChzZXJ2aWNlICYmIHNlcnZpY2UtPnVzZXJkYXRhX3Rlcm0pCisJCXNlcnZpY2UtPnVzZXJkYXRhX3Rlcm0oc2VydmljZS0+YmFzZS51c2VyZGF0YSk7CisKKwlrZnJlZShzZXJ2aWNlKTsKK30KKworaW50Cit2Y2hpcV9nZXRfY2xpZW50X2lkKFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlKQoreworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IGZpbmRfc2VydmljZV9ieV9oYW5kbGUoaGFuZGxlKTsKKwlpbnQgaWQ7CisKKwlpZCA9IHNlcnZpY2UgPyBzZXJ2aWNlLT5jbGllbnRfaWQgOiAwOworCWlmIChzZXJ2aWNlKQorCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKworCXJldHVybiBpZDsKK30KKwordm9pZCAqCit2Y2hpcV9nZXRfc2VydmljZV91c2VyZGF0YShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSkKK3sKKwlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UgPSBoYW5kbGVfdG9fc2VydmljZShoYW5kbGUpOworCisJcmV0dXJuIHNlcnZpY2UgPyBzZXJ2aWNlLT5iYXNlLnVzZXJkYXRhIDogTlVMTDsKK30KKworaW50Cit2Y2hpcV9nZXRfc2VydmljZV9mb3VyY2MoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUpCit7CisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlID0gaGFuZGxlX3RvX3NlcnZpY2UoaGFuZGxlKTsKKworCXJldHVybiBzZXJ2aWNlID8gc2VydmljZS0+YmFzZS5mb3VyY2MgOiAwOworfQorCitzdGF0aWMgdm9pZAorbWFya19zZXJ2aWNlX2Nsb3NpbmdfaW50ZXJuYWwoVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlLCBpbnQgc2hfdGhyZWFkKQoreworCVZDSElRX1NUQVRFX1QgKnN0YXRlID0gc2VydmljZS0+c3RhdGU7CisJVkNISVFfU0VSVklDRV9RVU9UQV9UICpzZXJ2aWNlX3F1b3RhOworCisJc2VydmljZS0+Y2xvc2luZyA9IDE7CisKKwkvKiBTeW5jaHJvbmlzZSB3aXRoIG90aGVyIHRocmVhZHMuICovCisJbXV0ZXhfbG9jaygmc3RhdGUtPnJlY3ljbGVfbXV0ZXgpOworCW11dGV4X3VubG9jaygmc3RhdGUtPnJlY3ljbGVfbXV0ZXgpOworCWlmICghc2hfdGhyZWFkIHx8IChzdGF0ZS0+Y29ubl9zdGF0ZSAhPSBWQ0hJUV9DT05OU1RBVEVfUEFVU0VfU0VOVCkpIHsKKwkJLyogSWYgd2UncmUgcGF1c2luZyB0aGVuIHRoZSBzbG90X211dGV4IGlzIGhlbGQgdW50aWwgcmVzdW1lCisJCSAqIGJ5IHRoZSBzbG90IGhhbmRsZXIuICBUaGVyZWZvcmUgZG9uJ3QgdHJ5IHRvIGFjcXVpcmUgdGhpcworCQkgKiBtdXRleCBpZiB3ZSdyZSB0aGUgc2xvdCBoYW5kbGVyIGFuZCBpbiB0aGUgcGF1c2Ugc2VudCBzdGF0ZS4KKwkJICogV2UgZG9uJ3QgbmVlZCB0byBpbiB0aGlzIGNhc2UgYW55d2F5LiAqLworCQltdXRleF9sb2NrKCZzdGF0ZS0+c2xvdF9tdXRleCk7CisJCW11dGV4X3VubG9jaygmc3RhdGUtPnNsb3RfbXV0ZXgpOworCX0KKworCS8qIFVuYmxvY2sgYW55IHNlbmRpbmcgdGhyZWFkLiAqLworCXNlcnZpY2VfcXVvdGEgPSAmc3RhdGUtPnNlcnZpY2VfcXVvdGFzW3NlcnZpY2UtPmxvY2FscG9ydF07CisJdXAoJnNlcnZpY2VfcXVvdGEtPnF1b3RhX2V2ZW50KTsKK30KKworc3RhdGljIHZvaWQKK21hcmtfc2VydmljZV9jbG9zaW5nKFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSkKK3sKKwltYXJrX3NlcnZpY2VfY2xvc2luZ19pbnRlcm5hbChzZXJ2aWNlLCAwKTsKK30KKworc3RhdGljIGlubGluZSBWQ0hJUV9TVEFUVVNfVAorbWFrZV9zZXJ2aWNlX2NhbGxiYWNrKFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSwgVkNISVFfUkVBU09OX1QgcmVhc29uLAorCVZDSElRX0hFQURFUl9UICpoZWFkZXIsIHZvaWQgKmJ1bGtfdXNlcmRhdGEpCit7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzOworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwgIiVkOiBjYWxsYmFjazolZCAoJXMsICV4LCAleCkiLAorCQlzZXJ2aWNlLT5zdGF0ZS0+aWQsIHNlcnZpY2UtPmxvY2FscG9ydCwgcmVhc29uX25hbWVzW3JlYXNvbl0sCisJCSh1bnNpZ25lZCBpbnQpaGVhZGVyLCAodW5zaWduZWQgaW50KWJ1bGtfdXNlcmRhdGEpOworCXN0YXR1cyA9IHNlcnZpY2UtPmJhc2UuY2FsbGJhY2socmVhc29uLCBoZWFkZXIsIHNlcnZpY2UtPmhhbmRsZSwKKwkJYnVsa191c2VyZGF0YSk7CisJaWYgKHN0YXR1cyA9PSBWQ0hJUV9FUlJPUikgeworCQl2Y2hpcV9sb2dfd2FybmluZyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCSIlZDogaWdub3JpbmcgRVJST1IgZnJvbSBjYWxsYmFjayB0byBzZXJ2aWNlICV4IiwKKwkJCXNlcnZpY2UtPnN0YXRlLT5pZCwgc2VydmljZS0+aGFuZGxlKTsKKwkJc3RhdHVzID0gVkNISVFfU1VDQ0VTUzsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworaW5saW5lIHZvaWQKK3ZjaGlxX3NldF9jb25uX3N0YXRlKFZDSElRX1NUQVRFX1QgKnN0YXRlLCBWQ0hJUV9DT05OU1RBVEVfVCBuZXdzdGF0ZSkKK3sKKwlWQ0hJUV9DT05OU1RBVEVfVCBvbGRzdGF0ZSA9IHN0YXRlLT5jb25uX3N0YXRlOworCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2NvcmVfbG9nX2xldmVsLCAiJWQ6ICVzLT4lcyIsIHN0YXRlLT5pZCwKKwkJY29ubl9zdGF0ZV9uYW1lc1tvbGRzdGF0ZV0sCisJCWNvbm5fc3RhdGVfbmFtZXNbbmV3c3RhdGVdKTsKKwlzdGF0ZS0+Y29ubl9zdGF0ZSA9IG5ld3N0YXRlOworCXZjaGlxX3BsYXRmb3JtX2Nvbm5fc3RhdGVfY2hhbmdlZChzdGF0ZSwgb2xkc3RhdGUsIG5ld3N0YXRlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCityZW1vdGVfZXZlbnRfY3JlYXRlKFJFTU9URV9FVkVOVF9UICpldmVudCkKK3sKKwlldmVudC0+YXJtZWQgPSAwOworCS8qIERvbid0IGNsZWFyIHRoZSAnZmlyZWQnIGZsYWcgYmVjYXVzZSBpdCBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gc2V0CisJKiogYnkgdGhlIG90aGVyIHNpZGUuICovCisJc2VtYV9pbml0KGV2ZW50LT5ldmVudCwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcmVtb3RlX2V2ZW50X2Rlc3Ryb3koUkVNT1RFX0VWRU5UX1QgKmV2ZW50KQoreworCSh2b2lkKWV2ZW50OworfQorCitzdGF0aWMgaW5saW5lIGludAorcmVtb3RlX2V2ZW50X3dhaXQoUkVNT1RFX0VWRU5UX1QgKmV2ZW50KQoreworCWlmICghZXZlbnQtPmZpcmVkKSB7CisJCWV2ZW50LT5hcm1lZCA9IDE7CisJCWRzYigpOworCQlpZiAoIWV2ZW50LT5maXJlZCkgeworCQkJaWYgKGRvd25faW50ZXJydXB0aWJsZShldmVudC0+ZXZlbnQpICE9IDApIHsKKwkJCQlldmVudC0+YXJtZWQgPSAwOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCWV2ZW50LT5hcm1lZCA9IDA7CisJCXdtYigpOworCX0KKworCWV2ZW50LT5maXJlZCA9IDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcmVtb3RlX2V2ZW50X3NpZ25hbF9sb2NhbChSRU1PVEVfRVZFTlRfVCAqZXZlbnQpCit7CisJZXZlbnQtPmFybWVkID0gMDsKKwl1cChldmVudC0+ZXZlbnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3JlbW90ZV9ldmVudF9wb2xsKFJFTU9URV9FVkVOVF9UICpldmVudCkKK3sKKwlpZiAoZXZlbnQtPmZpcmVkICYmIGV2ZW50LT5hcm1lZCkKKwkJcmVtb3RlX2V2ZW50X3NpZ25hbF9sb2NhbChldmVudCk7Cit9CisKK3ZvaWQKK3JlbW90ZV9ldmVudF9wb2xsYWxsKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCXJlbW90ZV9ldmVudF9wb2xsKCZzdGF0ZS0+bG9jYWwtPnN5bmNfdHJpZ2dlcik7CisJcmVtb3RlX2V2ZW50X3BvbGwoJnN0YXRlLT5sb2NhbC0+c3luY19yZWxlYXNlKTsKKwlyZW1vdGVfZXZlbnRfcG9sbCgmc3RhdGUtPmxvY2FsLT50cmlnZ2VyKTsKKwlyZW1vdGVfZXZlbnRfcG9sbCgmc3RhdGUtPmxvY2FsLT5yZWN5Y2xlKTsKK30KKworLyogUm91bmQgdXAgbWVzc2FnZSBzaXplcyBzbyB0aGF0IGFueSBzcGFjZSBhdCB0aGUgZW5kIG9mIGEgc2xvdCBpcyBhbHdheXMgYmlnCisqKiBlbm91Z2ggZm9yIGEgaGVhZGVyLiBUaGlzIHJlbGllcyBvbiBoZWFkZXIgc2l6ZSBiZWluZyBhIHBvd2VyIG9mIHR3bywgd2hpY2gKKyoqIGhhcyBiZWVuIHZlcmlmaWVkIGVhcmxpZXIgYnkgYSBzdGF0aWMgYXNzZXJ0aW9uLiAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAorY2FsY19zdHJpZGUodW5zaWduZWQgaW50IHNpemUpCit7CisJLyogQWxsb3cgcm9vbSBmb3IgdGhlIGhlYWRlciAqLworCXNpemUgKz0gc2l6ZW9mKFZDSElRX0hFQURFUl9UKTsKKworCS8qIFJvdW5kIHVwICovCisJcmV0dXJuIChzaXplICsgc2l6ZW9mKFZDSElRX0hFQURFUl9UKSAtIDEpICYgfihzaXplb2YoVkNISVFfSEVBREVSX1QpCisJCS0gMSk7Cit9CisKKy8qIENhbGxlZCBieSB0aGUgc2xvdCBoYW5kbGVyIHRocmVhZCAqLworc3RhdGljIFZDSElRX1NFUlZJQ0VfVCAqCitnZXRfbGlzdGVuaW5nX3NlcnZpY2UoVkNISVFfU1RBVEVfVCAqc3RhdGUsIGludCBmb3VyY2MpCit7CisJaW50IGk7CisKKwlXQVJOX09OKGZvdXJjYyA9PSBWQ0hJUV9GT1VSQ0NfSU5WQUxJRCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3RhdGUtPnVudXNlZF9zZXJ2aWNlOyBpKyspIHsKKwkJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlID0gc3RhdGUtPnNlcnZpY2VzW2ldOworCQlpZiAoc2VydmljZSAmJgorCQkJKHNlcnZpY2UtPnB1YmxpY19mb3VyY2MgPT0gZm91cmNjKSAmJgorCQkJKChzZXJ2aWNlLT5zcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9MSVNURU5JTkcpIHx8CisJCQkoKHNlcnZpY2UtPnNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX09QRU4pICYmCisJCQkoc2VydmljZS0+cmVtb3RlcG9ydCA9PSBWQ0hJUV9QT1JUX0ZSRUUpKSkpIHsKKwkJCWxvY2tfc2VydmljZShzZXJ2aWNlKTsKKwkJCXJldHVybiBzZXJ2aWNlOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIENhbGxlZCBieSB0aGUgc2xvdCBoYW5kbGVyIHRocmVhZCAqLworc3RhdGljIFZDSElRX1NFUlZJQ0VfVCAqCitnZXRfY29ubmVjdGVkX3NlcnZpY2UoVkNISVFfU1RBVEVfVCAqc3RhdGUsIHVuc2lnbmVkIGludCBwb3J0KQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+dW51c2VkX3NlcnZpY2U7IGkrKykgeworCQlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UgPSBzdGF0ZS0+c2VydmljZXNbaV07CisJCWlmIChzZXJ2aWNlICYmIChzZXJ2aWNlLT5zcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9PUEVOKQorCQkJJiYgKHNlcnZpY2UtPnJlbW90ZXBvcnQgPT0gcG9ydCkpIHsKKwkJCWxvY2tfc2VydmljZShzZXJ2aWNlKTsKKwkJCXJldHVybiBzZXJ2aWNlOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitpbmxpbmUgdm9pZAorcmVxdWVzdF9wb2xsKFZDSElRX1NUQVRFX1QgKnN0YXRlLCBWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UsIGludCBwb2xsX3R5cGUpCit7CisJdWludDMyX3QgdmFsdWU7CisKKwlpZiAoc2VydmljZSkgeworCQlkbyB7CisJCQl2YWx1ZSA9IGF0b21pY19yZWFkKCZzZXJ2aWNlLT5wb2xsX2ZsYWdzKTsKKwkJfSB3aGlsZSAoYXRvbWljX2NtcHhjaGcoJnNlcnZpY2UtPnBvbGxfZmxhZ3MsIHZhbHVlLAorCQkJdmFsdWUgfCAoMSA8PCBwb2xsX3R5cGUpKSAhPSB2YWx1ZSk7CisKKwkJZG8geworCQkJdmFsdWUgPSBhdG9taWNfcmVhZCgmc3RhdGUtPnBvbGxfc2VydmljZXNbCisJCQkJc2VydmljZS0+bG9jYWxwb3J0Pj41XSk7CisJCX0gd2hpbGUgKGF0b21pY19jbXB4Y2hnKAorCQkJJnN0YXRlLT5wb2xsX3NlcnZpY2VzW3NlcnZpY2UtPmxvY2FscG9ydD4+NV0sCisJCQl2YWx1ZSwgdmFsdWUgfCAoMSA8PCAoc2VydmljZS0+bG9jYWxwb3J0ICYgMHgxZikpKQorCQkJIT0gdmFsdWUpOworCX0KKworCXN0YXRlLT5wb2xsX25lZWRlZCA9IDE7CisJd21iKCk7CisKKwkvKiAuLi4gYW5kIGVuc3VyZSB0aGUgc2xvdCBoYW5kbGVyIHJ1bnMuICovCisJcmVtb3RlX2V2ZW50X3NpZ25hbF9sb2NhbCgmc3RhdGUtPmxvY2FsLT50cmlnZ2VyKTsKK30KKworLyogQ2FsbGVkIGZyb20gcXVldWVfbWVzc2FnZSwgYnkgdGhlIHNsb3QgaGFuZGxlciBhbmQgYXBwbGljYXRpb24gdGhyZWFkcywKKyoqIHdpdGggc2xvdF9tdXRleCBoZWxkICovCitzdGF0aWMgVkNISVFfSEVBREVSX1QgKgorcmVzZXJ2ZV9zcGFjZShWQ0hJUV9TVEFURV9UICpzdGF0ZSwgaW50IHNwYWNlLCBpbnQgaXNfYmxvY2tpbmcpCit7CisJVkNISVFfU0hBUkVEX1NUQVRFX1QgKmxvY2FsID0gc3RhdGUtPmxvY2FsOworCWludCB0eF9wb3MgPSBzdGF0ZS0+bG9jYWxfdHhfcG9zOworCWludCBzbG90X3NwYWNlID0gVkNISVFfU0xPVF9TSVpFIC0gKHR4X3BvcyAmIFZDSElRX1NMT1RfTUFTSyk7CisKKwlpZiAoc3BhY2UgPiBzbG90X3NwYWNlKSB7CisJCVZDSElRX0hFQURFUl9UICpoZWFkZXI7CisJCS8qIEZpbGwgdGhlIHJlbWFpbmluZyBzcGFjZSB3aXRoIHBhZGRpbmcgKi8KKwkJV0FSTl9PTihzdGF0ZS0+dHhfZGF0YSA9PSBOVUxMKTsKKwkJaGVhZGVyID0gKFZDSElRX0hFQURFUl9UICopCisJCQkoc3RhdGUtPnR4X2RhdGEgKyAodHhfcG9zICYgVkNISVFfU0xPVF9NQVNLKSk7CisJCWhlYWRlci0+bXNnaWQgPSBWQ0hJUV9NU0dJRF9QQURESU5HOworCQloZWFkZXItPnNpemUgPSBzbG90X3NwYWNlIC0gc2l6ZW9mKFZDSElRX0hFQURFUl9UKTsKKworCQl0eF9wb3MgKz0gc2xvdF9zcGFjZTsKKwl9CisKKwkvKiBJZiBuZWNlc3NhcnksIGdldCB0aGUgbmV4dCBzbG90LiAqLworCWlmICgodHhfcG9zICYgVkNISVFfU0xPVF9NQVNLKSA9PSAwKSB7CisJCWludCBzbG90X2luZGV4OworCisJCS8qIElmIHRoZXJlIGlzIG5vIGZyZWUgc2xvdC4uLiAqLworCisJCWlmIChkb3duX3RyeWxvY2soJnN0YXRlLT5zbG90X2F2YWlsYWJsZV9ldmVudCkgIT0gMCkgeworCQkJLyogLi4ud2FpdCBmb3Igb25lLiAqLworCisJCQlWQ0hJUV9TVEFUU19JTkMoc3RhdGUsIHNsb3Rfc3RhbGxzKTsKKworCQkJLyogQnV0IGZpcnN0LCBmbHVzaCB0aHJvdWdoIHRoZSBsYXN0IHNsb3QuICovCisJCQlzdGF0ZS0+bG9jYWxfdHhfcG9zID0gdHhfcG9zOworCQkJbG9jYWwtPnR4X3BvcyA9IHR4X3BvczsKKwkJCXJlbW90ZV9ldmVudF9zaWduYWwoJnN0YXRlLT5yZW1vdGUtPnRyaWdnZXIpOworCisJCQlpZiAoIWlzX2Jsb2NraW5nIHx8CisJCQkJKGRvd25faW50ZXJydXB0aWJsZSgKKwkJCQkmc3RhdGUtPnNsb3RfYXZhaWxhYmxlX2V2ZW50KSAhPSAwKSkKKwkJCQlyZXR1cm4gTlVMTDsgLyogTm8gc3BhY2UgYXZhaWxhYmxlICovCisJCX0KKworCQlCVUdfT04odHhfcG9zID09CisJCQkoc3RhdGUtPnNsb3RfcXVldWVfYXZhaWxhYmxlICogVkNISVFfU0xPVF9TSVpFKSk7CisKKwkJc2xvdF9pbmRleCA9IGxvY2FsLT5zbG90X3F1ZXVlWworCQkJU0xPVF9RVUVVRV9JTkRFWF9GUk9NX1BPUyh0eF9wb3MpICYKKwkJCVZDSElRX1NMT1RfUVVFVUVfTUFTS107CisJCXN0YXRlLT50eF9kYXRhID0KKwkJCShjaGFyICopU0xPVF9EQVRBX0ZST01fSU5ERVgoc3RhdGUsIHNsb3RfaW5kZXgpOworCX0KKworCXN0YXRlLT5sb2NhbF90eF9wb3MgPSB0eF9wb3MgKyBzcGFjZTsKKworCXJldHVybiAoVkNISVFfSEVBREVSX1QgKikoc3RhdGUtPnR4X2RhdGEgKyAodHhfcG9zICYgVkNISVFfU0xPVF9NQVNLKSk7Cit9CisKKy8qIENhbGxlZCBieSB0aGUgcmVjeWNsZSB0aHJlYWQuICovCitzdGF0aWMgdm9pZAorcHJvY2Vzc19mcmVlX3F1ZXVlKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCVZDSElRX1NIQVJFRF9TVEFURV9UICpsb2NhbCA9IHN0YXRlLT5sb2NhbDsKKwlCSVRTRVRfVCBzZXJ2aWNlX2ZvdW5kW0JJVFNFVF9TSVpFKFZDSElRX01BWF9TRVJWSUNFUyldOworCWludCBzbG90X3F1ZXVlX2F2YWlsYWJsZTsKKworCS8qIFVzZSBhIHJlYWQgbWVtb3J5IGJhcnJpZXIgdG8gZW5zdXJlIHRoYXQgYW55IHN0YXRlIHRoYXQgbWF5IGhhdmUKKwkqKiBiZWVuIG1vZGlmaWVkIGJ5IGFub3RoZXIgdGhyZWFkIGlzIG5vdCBtYXNrZWQgYnkgc3RhbGUgcHJlZmV0Y2hlZAorCSoqIHZhbHVlcy4gKi8KKwlybWIoKTsKKworCS8qIEZpbmQgc2xvdHMgd2hpY2ggaGF2ZSBiZWVuIGZyZWVkIGJ5IHRoZSBvdGhlciBzaWRlLCBhbmQgcmV0dXJuIHRoZW0KKwkqKiB0byB0aGUgYXZhaWxhYmxlIHF1ZXVlLiAqLworCXNsb3RfcXVldWVfYXZhaWxhYmxlID0gc3RhdGUtPnNsb3RfcXVldWVfYXZhaWxhYmxlOworCisJd2hpbGUgKHNsb3RfcXVldWVfYXZhaWxhYmxlICE9IGxvY2FsLT5zbG90X3F1ZXVlX3JlY3ljbGUpIHsKKwkJdW5zaWduZWQgaW50IHBvczsKKwkJaW50IHNsb3RfaW5kZXggPSBsb2NhbC0+c2xvdF9xdWV1ZVtzbG90X3F1ZXVlX2F2YWlsYWJsZSsrICYKKwkJCVZDSElRX1NMT1RfUVVFVUVfTUFTS107CisJCWNoYXIgKmRhdGEgPSAoY2hhciAqKVNMT1RfREFUQV9GUk9NX0lOREVYKHN0YXRlLCBzbG90X2luZGV4KTsKKwkJaW50IGRhdGFfZm91bmQgPSAwOworCisJCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwgIiVkOiBwZnEgJWQ9JXggJXggJXgiLAorCQkJc3RhdGUtPmlkLCBzbG90X2luZGV4LCAodW5zaWduZWQgaW50KWRhdGEsCisJCQlsb2NhbC0+c2xvdF9xdWV1ZV9yZWN5Y2xlLCBzbG90X3F1ZXVlX2F2YWlsYWJsZSk7CisKKwkJLyogSW5pdGlhbGlzZSB0aGUgYml0bWFzayBmb3Igc2VydmljZXMgd2hpY2ggaGF2ZSB1c2VkIHRoaXMKKwkJKiogc2xvdCAqLworCQlCSVRTRVRfWkVSTyhzZXJ2aWNlX2ZvdW5kKTsKKworCQlwb3MgPSAwOworCisJCXdoaWxlIChwb3MgPCBWQ0hJUV9TTE9UX1NJWkUpIHsKKwkJCVZDSElRX0hFQURFUl9UICpoZWFkZXIgPQorCQkJCShWQ0hJUV9IRUFERVJfVCAqKShkYXRhICsgcG9zKTsKKwkJCWludCBtc2dpZCA9IGhlYWRlci0+bXNnaWQ7CisJCQlpZiAoVkNISVFfTVNHX1RZUEUobXNnaWQpID09IFZDSElRX01TR19EQVRBKSB7CisJCQkJaW50IHBvcnQgPSBWQ0hJUV9NU0dfU1JDUE9SVChtc2dpZCk7CisJCQkJVkNISVFfU0VSVklDRV9RVU9UQV9UICpzZXJ2aWNlX3F1b3RhID0KKwkJCQkJJnN0YXRlLT5zZXJ2aWNlX3F1b3Rhc1twb3J0XTsKKwkJCQlpbnQgY291bnQ7CisJCQkJc3Bpbl9sb2NrKCZxdW90YV9zcGlubG9jayk7CisJCQkJY291bnQgPSBzZXJ2aWNlX3F1b3RhLT5tZXNzYWdlX3VzZV9jb3VudDsKKwkJCQlpZiAoY291bnQgPiAwKQorCQkJCQlzZXJ2aWNlX3F1b3RhLT5tZXNzYWdlX3VzZV9jb3VudCA9CisJCQkJCQljb3VudCAtIDE7CisJCQkJc3Bpbl91bmxvY2soJnF1b3RhX3NwaW5sb2NrKTsKKworCQkJCWlmIChjb3VudCA9PSBzZXJ2aWNlX3F1b3RhLT5tZXNzYWdlX3F1b3RhKQorCQkJCQkvKiBTaWduYWwgdGhlIHNlcnZpY2UgdGhhdCBpdAorCQkJCQkqKiBoYXMgZHJvcHBlZCBiZWxvdyBpdHMgcXVvdGEKKwkJCQkJKi8KKwkJCQkJdXAoJnNlcnZpY2VfcXVvdGEtPnF1b3RhX2V2ZW50KTsKKwkJCQllbHNlIGlmIChjb3VudCA9PSAwKSB7CisJCQkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkJCSJzZXJ2aWNlICVkICIKKwkJCQkJCSJtZXNzYWdlX3VzZV9jb3VudD0lZCAiCisJCQkJCQkiKGhlYWRlciAleCwgbXNnaWQgJXgsICIKKwkJCQkJCSJoZWFkZXItPm1zZ2lkICV4LCAiCisJCQkJCQkiaGVhZGVyLT5zaXplICV4KSIsCisJCQkJCQlwb3J0LAorCQkJCQkJc2VydmljZV9xdW90YS0+CisJCQkJCQkJbWVzc2FnZV91c2VfY291bnQsCisJCQkJCQkodW5zaWduZWQgaW50KWhlYWRlciwgbXNnaWQsCisJCQkJCQloZWFkZXItPm1zZ2lkLAorCQkJCQkJaGVhZGVyLT5zaXplKTsKKwkJCQkJV0FSTigxLCAiaW52YWxpZCBtZXNzYWdlIHVzZSBjb3VudFxuIik7CisJCQkJfQorCQkJCWlmICghQklUU0VUX0lTX1NFVChzZXJ2aWNlX2ZvdW5kLCBwb3J0KSkgeworCQkJCQkvKiBTZXQgdGhlIGZvdW5kIGJpdCBmb3IgdGhpcyBzZXJ2aWNlICovCisJCQkJCUJJVFNFVF9TRVQoc2VydmljZV9mb3VuZCwgcG9ydCk7CisKKwkJCQkJc3Bpbl9sb2NrKCZxdW90YV9zcGlubG9jayk7CisJCQkJCWNvdW50ID0gc2VydmljZV9xdW90YS0+c2xvdF91c2VfY291bnQ7CisJCQkJCWlmIChjb3VudCA+IDApCisJCQkJCQlzZXJ2aWNlX3F1b3RhLT5zbG90X3VzZV9jb3VudCA9CisJCQkJCQkJY291bnQgLSAxOworCQkJCQlzcGluX3VubG9jaygmcXVvdGFfc3BpbmxvY2spOworCisJCQkJCWlmIChjb3VudCA+IDApIHsKKwkJCQkJCS8qIFNpZ25hbCB0aGUgc2VydmljZSBpbiBjYXNlCisJCQkJCQkqKiBpdCBoYXMgZHJvcHBlZCBiZWxvdyBpdHMKKwkJCQkJCSoqIHF1b3RhICovCisJCQkJCQl1cCgmc2VydmljZV9xdW90YS0+cXVvdGFfZXZlbnQpOworCQkJCQkJdmNoaXFfbG9nX3RyYWNlKAorCQkJCQkJCXZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCQkJCSIlZDogcGZxOiVkICV4QCV4IC0gIgorCQkJCQkJCSJzbG90X3VzZS0+JWQiLAorCQkJCQkJCXN0YXRlLT5pZCwgcG9ydCwKKwkJCQkJCQloZWFkZXItPnNpemUsCisJCQkJCQkJKHVuc2lnbmVkIGludCloZWFkZXIsCisJCQkJCQkJY291bnQgLSAxKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXZjaGlxX2xvZ19lcnJvcigKKwkJCQkJCQl2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkJCQkJInNlcnZpY2UgJWQgIgorCQkJCQkJCQkic2xvdF91c2VfY291bnQiCisJCQkJCQkJCSI9JWQgKGhlYWRlciAleCIKKwkJCQkJCQkJIiwgbXNnaWQgJXgsICIKKwkJCQkJCQkJImhlYWRlci0+bXNnaWQiCisJCQkJCQkJCSIgJXgsIGhlYWRlci0+IgorCQkJCQkJCQkic2l6ZSAleCkiLAorCQkJCQkJCXBvcnQsIGNvdW50LAorCQkJCQkJCSh1bnNpZ25lZCBpbnQpaGVhZGVyLAorCQkJCQkJCW1zZ2lkLAorCQkJCQkJCWhlYWRlci0+bXNnaWQsCisJCQkJCQkJaGVhZGVyLT5zaXplKTsKKwkJCQkJCVdBUk4oMSwgImJhZCBzbG90IHVzZSBjb3VudFxuIik7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlkYXRhX2ZvdW5kID0gMTsKKwkJCX0KKworCQkJcG9zICs9IGNhbGNfc3RyaWRlKGhlYWRlci0+c2l6ZSk7CisJCQlpZiAocG9zID4gVkNISVFfU0xPVF9TSVpFKSB7CisJCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCQkicGZxIC0gcG9zICV4OiBoZWFkZXIgJXgsIG1zZ2lkICV4LCAiCisJCQkJCSJoZWFkZXItPm1zZ2lkICV4LCBoZWFkZXItPnNpemUgJXgiLAorCQkJCQlwb3MsICh1bnNpZ25lZCBpbnQpaGVhZGVyLCBtc2dpZCwKKwkJCQkJaGVhZGVyLT5tc2dpZCwgaGVhZGVyLT5zaXplKTsKKwkJCQlXQVJOKDEsICJpbnZhbGlkIHNsb3QgcG9zaXRpb25cbiIpOworCQkJfQorCQl9CisKKwkJaWYgKGRhdGFfZm91bmQpIHsKKwkJCWludCBjb3VudDsKKwkJCXNwaW5fbG9jaygmcXVvdGFfc3BpbmxvY2spOworCQkJY291bnQgPSBzdGF0ZS0+ZGF0YV91c2VfY291bnQ7CisJCQlpZiAoY291bnQgPiAwKQorCQkJCXN0YXRlLT5kYXRhX3VzZV9jb3VudCA9CisJCQkJCWNvdW50IC0gMTsKKwkJCXNwaW5fdW5sb2NrKCZxdW90YV9zcGlubG9jayk7CisJCQlpZiAoY291bnQgPT0gc3RhdGUtPmRhdGFfcXVvdGEpCisJCQkJdXAoJnN0YXRlLT5kYXRhX3F1b3RhX2V2ZW50KTsKKwkJfQorCisJCXN0YXRlLT5zbG90X3F1ZXVlX2F2YWlsYWJsZSA9IHNsb3RfcXVldWVfYXZhaWxhYmxlOworCQl1cCgmc3RhdGUtPnNsb3RfYXZhaWxhYmxlX2V2ZW50KTsKKwl9Cit9CisKKy8qIENhbGxlZCBieSB0aGUgc2xvdCBoYW5kbGVyIGFuZCBhcHBsaWNhdGlvbiB0aHJlYWRzICovCitzdGF0aWMgVkNISVFfU1RBVFVTX1QKK3F1ZXVlX21lc3NhZ2UoVkNISVFfU1RBVEVfVCAqc3RhdGUsIFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSwKKwlpbnQgbXNnaWQsIGNvbnN0IFZDSElRX0VMRU1FTlRfVCAqZWxlbWVudHMsCisJaW50IGNvdW50LCBpbnQgc2l6ZSwgaW50IGZsYWdzKQoreworCVZDSElRX1NIQVJFRF9TVEFURV9UICpsb2NhbDsKKwlWQ0hJUV9TRVJWSUNFX1FVT1RBX1QgKnNlcnZpY2VfcXVvdGEgPSBOVUxMOworCVZDSElRX0hFQURFUl9UICpoZWFkZXI7CisJaW50IHR5cGUgPSBWQ0hJUV9NU0dfVFlQRShtc2dpZCk7CisKKwl1bnNpZ25lZCBpbnQgc3RyaWRlOworCisJbG9jYWwgPSBzdGF0ZS0+bG9jYWw7CisKKwlzdHJpZGUgPSBjYWxjX3N0cmlkZShzaXplKTsKKworCVdBUk5fT04oIShzdHJpZGUgPD0gVkNISVFfU0xPVF9TSVpFKSk7CisKKwlpZiAoIShmbGFncyAmIFFNRkxBR1NfTk9fTVVURVhfTE9DSykgJiYKKwkJKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc3RhdGUtPnNsb3RfbXV0ZXgpICE9IDApKQorCQlyZXR1cm4gVkNISVFfUkVUUlk7CisKKwlpZiAodHlwZSA9PSBWQ0hJUV9NU0dfREFUQSkgeworCQlpbnQgdHhfZW5kX2luZGV4OworCisJCUJVR19PTighc2VydmljZSk7CisJCUJVR19PTigoZmxhZ3MgJiAoUU1GTEFHU19OT19NVVRFWF9MT0NLIHwKKwkJCQkgUU1GTEFHU19OT19NVVRFWF9VTkxPQ0spKSAhPSAwKTsKKworCQlpZiAoc2VydmljZS0+Y2xvc2luZykgeworCQkJLyogVGhlIHNlcnZpY2UgaGFzIGJlZW4gY2xvc2VkICovCisJCQltdXRleF91bmxvY2soJnN0YXRlLT5zbG90X211dGV4KTsKKwkJCXJldHVybiBWQ0hJUV9FUlJPUjsKKwkJfQorCisJCXNlcnZpY2VfcXVvdGEgPSAmc3RhdGUtPnNlcnZpY2VfcXVvdGFzW3NlcnZpY2UtPmxvY2FscG9ydF07CisKKwkJc3Bpbl9sb2NrKCZxdW90YV9zcGlubG9jayk7CisKKwkJLyogRW5zdXJlIHRoaXMgc2VydmljZSBkb2Vzbid0IHVzZSBtb3JlIHRoYW4gaXRzIHF1b3RhIG9mCisJCSoqIG1lc3NhZ2VzIG9yIHNsb3RzICovCisJCXR4X2VuZF9pbmRleCA9IFNMT1RfUVVFVUVfSU5ERVhfRlJPTV9QT1MoCisJCQlzdGF0ZS0+bG9jYWxfdHhfcG9zICsgc3RyaWRlIC0gMSk7CisKKwkJLyogRW5zdXJlIGRhdGEgbWVzc2FnZXMgZG9uJ3QgdXNlIG1vcmUgdGhhbiB0aGVpciBxdW90YSBvZgorCQkqKiBzbG90cyAqLworCQl3aGlsZSAoKHR4X2VuZF9pbmRleCAhPSBzdGF0ZS0+cHJldmlvdXNfZGF0YV9pbmRleCkgJiYKKwkJCShzdGF0ZS0+ZGF0YV91c2VfY291bnQgPT0gc3RhdGUtPmRhdGFfcXVvdGEpKSB7CisJCQlWQ0hJUV9TVEFUU19JTkMoc3RhdGUsIGRhdGFfc3RhbGxzKTsKKwkJCXNwaW5fdW5sb2NrKCZxdW90YV9zcGlubG9jayk7CisJCQltdXRleF91bmxvY2soJnN0YXRlLT5zbG90X211dGV4KTsKKworCQkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmc3RhdGUtPmRhdGFfcXVvdGFfZXZlbnQpCisJCQkJIT0gMCkKKwkJCQlyZXR1cm4gVkNISVFfUkVUUlk7CisKKwkJCW11dGV4X2xvY2soJnN0YXRlLT5zbG90X211dGV4KTsKKwkJCXNwaW5fbG9jaygmcXVvdGFfc3BpbmxvY2spOworCQkJdHhfZW5kX2luZGV4ID0gU0xPVF9RVUVVRV9JTkRFWF9GUk9NX1BPUygKKwkJCQlzdGF0ZS0+bG9jYWxfdHhfcG9zICsgc3RyaWRlIC0gMSk7CisJCQlpZiAoKHR4X2VuZF9pbmRleCA9PSBzdGF0ZS0+cHJldmlvdXNfZGF0YV9pbmRleCkgfHwKKwkJCQkoc3RhdGUtPmRhdGFfdXNlX2NvdW50IDwgc3RhdGUtPmRhdGFfcXVvdGEpKSB7CisJCQkJLyogUGFzcyB0aGUgc2lnbmFsIG9uIHRvIG90aGVyIHdhaXRlcnMgKi8KKwkJCQl1cCgmc3RhdGUtPmRhdGFfcXVvdGFfZXZlbnQpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJd2hpbGUgKChzZXJ2aWNlX3F1b3RhLT5tZXNzYWdlX3VzZV9jb3VudCA9PQorCQkJCXNlcnZpY2VfcXVvdGEtPm1lc3NhZ2VfcXVvdGEpIHx8CisJCQkoKHR4X2VuZF9pbmRleCAhPSBzZXJ2aWNlX3F1b3RhLT5wcmV2aW91c190eF9pbmRleCkgJiYKKwkJCShzZXJ2aWNlX3F1b3RhLT5zbG90X3VzZV9jb3VudCA9PQorCQkJCXNlcnZpY2VfcXVvdGEtPnNsb3RfcXVvdGEpKSkgeworCQkJc3Bpbl91bmxvY2soJnF1b3RhX3NwaW5sb2NrKTsKKwkJCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkiJWQ6IHFtOiVkICVzLCV4IC0gcXVvdGEgc3RhbGwgIgorCQkJCSIobXNnICVkLCBzbG90ICVkKSIsCisJCQkJc3RhdGUtPmlkLCBzZXJ2aWNlLT5sb2NhbHBvcnQsCisJCQkJbXNnX3R5cGVfc3RyKHR5cGUpLCBzaXplLAorCQkJCXNlcnZpY2VfcXVvdGEtPm1lc3NhZ2VfdXNlX2NvdW50LAorCQkJCXNlcnZpY2VfcXVvdGEtPnNsb3RfdXNlX2NvdW50KTsKKwkJCVZDSElRX1NFUlZJQ0VfU1RBVFNfSU5DKHNlcnZpY2UsIHF1b3RhX3N0YWxscyk7CisJCQltdXRleF91bmxvY2soJnN0YXRlLT5zbG90X211dGV4KTsKKwkJCWlmIChkb3duX2ludGVycnVwdGlibGUoJnNlcnZpY2VfcXVvdGEtPnF1b3RhX2V2ZW50KQorCQkJCSE9IDApCisJCQkJcmV0dXJuIFZDSElRX1JFVFJZOworCQkJaWYgKHNlcnZpY2UtPmNsb3NpbmcpCisJCQkJcmV0dXJuIFZDSElRX0VSUk9SOworCQkJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc3RhdGUtPnNsb3RfbXV0ZXgpICE9IDApCisJCQkJcmV0dXJuIFZDSElRX1JFVFJZOworCQkJaWYgKHNlcnZpY2UtPnNydnN0YXRlICE9IFZDSElRX1NSVlNUQVRFX09QRU4pIHsKKwkJCQkvKiBUaGUgc2VydmljZSBoYXMgYmVlbiBjbG9zZWQgKi8KKwkJCQltdXRleF91bmxvY2soJnN0YXRlLT5zbG90X211dGV4KTsKKwkJCQlyZXR1cm4gVkNISVFfRVJST1I7CisJCQl9CisJCQlzcGluX2xvY2soJnF1b3RhX3NwaW5sb2NrKTsKKwkJCXR4X2VuZF9pbmRleCA9IFNMT1RfUVVFVUVfSU5ERVhfRlJPTV9QT1MoCisJCQkJc3RhdGUtPmxvY2FsX3R4X3BvcyArIHN0cmlkZSAtIDEpOworCQl9CisKKwkJc3Bpbl91bmxvY2soJnF1b3RhX3NwaW5sb2NrKTsKKwl9CisKKwloZWFkZXIgPSByZXNlcnZlX3NwYWNlKHN0YXRlLCBzdHJpZGUsIGZsYWdzICYgUU1GTEFHU19JU19CTE9DS0lORyk7CisKKwlpZiAoIWhlYWRlcikgeworCQlpZiAoc2VydmljZSkKKwkJCVZDSElRX1NFUlZJQ0VfU1RBVFNfSU5DKHNlcnZpY2UsIHNsb3Rfc3RhbGxzKTsKKwkJLyogSW4gdGhlIGV2ZW50IG9mIGEgZmFpbHVyZSwgcmV0dXJuIHRoZSBtdXRleCB0byB0aGUKKwkJICAgc3RhdGUgaXQgd2FzIGluICovCisJCWlmICghKGZsYWdzICYgUU1GTEFHU19OT19NVVRFWF9MT0NLKSkKKwkJCW11dGV4X3VubG9jaygmc3RhdGUtPnNsb3RfbXV0ZXgpOworCQlyZXR1cm4gVkNISVFfUkVUUlk7CisJfQorCisJaWYgKHR5cGUgPT0gVkNISVFfTVNHX0RBVEEpIHsKKwkJaW50IGksIHBvczsKKwkJaW50IHR4X2VuZF9pbmRleDsKKwkJaW50IHNsb3RfdXNlX2NvdW50OworCisJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJIiVkOiBxbSAlc0AleCwleCAoJWQtPiVkKSIsCisJCQlzdGF0ZS0+aWQsCisJCQltc2dfdHlwZV9zdHIoVkNISVFfTVNHX1RZUEUobXNnaWQpKSwKKwkJCSh1bnNpZ25lZCBpbnQpaGVhZGVyLCBzaXplLAorCQkJVkNISVFfTVNHX1NSQ1BPUlQobXNnaWQpLAorCQkJVkNISVFfTVNHX0RTVFBPUlQobXNnaWQpKTsKKworCQlCVUdfT04oIXNlcnZpY2UpOworCQlCVUdfT04oKGZsYWdzICYgKFFNRkxBR1NfTk9fTVVURVhfTE9DSyB8CisJCQkJIFFNRkxBR1NfTk9fTVVURVhfVU5MT0NLKSkgIT0gMCk7CisKKwkJZm9yIChpID0gMCwgcG9zID0gMDsgaSA8ICh1bnNpZ25lZCBpbnQpY291bnQ7CisJCQlwb3MgKz0gZWxlbWVudHNbaSsrXS5zaXplKQorCQkJaWYgKGVsZW1lbnRzW2ldLnNpemUpIHsKKwkJCQlpZiAodmNoaXFfY29weV9mcm9tX3VzZXIKKwkJCQkJKGhlYWRlci0+ZGF0YSArIHBvcywgZWxlbWVudHNbaV0uZGF0YSwKKwkJCQkJKHNpemVfdCkgZWxlbWVudHNbaV0uc2l6ZSkgIT0KKwkJCQkJVkNISVFfU1VDQ0VTUykgeworCQkJCQltdXRleF91bmxvY2soJnN0YXRlLT5zbG90X211dGV4KTsKKwkJCQkJVkNISVFfU0VSVklDRV9TVEFUU19JTkMoc2VydmljZSwKKwkJCQkJCWVycm9yX2NvdW50KTsKKwkJCQkJcmV0dXJuIFZDSElRX0VSUk9SOworCQkJCX0KKwkJCQlpZiAoaSA9PSAwKSB7CisJCQkJCWlmIChTUlZUUkFDRV9FTkFCTEVEKHNlcnZpY2UsCisJCQkJCQkJVkNISVFfTE9HX0lORk8pKQorCQkJCQkJdmNoaXFfbG9nX2R1bXBfbWVtKCJTZW50IiwgMCwKKwkJCQkJCQloZWFkZXItPmRhdGEgKyBwb3MsCisJCQkJCQkJbWluKDY0dSwKKwkJCQkJCQllbGVtZW50c1swXS5zaXplKSk7CisJCQkJfQorCQkJfQorCisJCXNwaW5fbG9jaygmcXVvdGFfc3BpbmxvY2spOworCQlzZXJ2aWNlX3F1b3RhLT5tZXNzYWdlX3VzZV9jb3VudCsrOworCisJCXR4X2VuZF9pbmRleCA9CisJCQlTTE9UX1FVRVVFX0lOREVYX0ZST01fUE9TKHN0YXRlLT5sb2NhbF90eF9wb3MgLSAxKTsKKworCQkvKiBJZiB0aGlzIHRyYW5zbWlzc2lvbiBjYW4ndCBmaXQgaW4gdGhlIGxhc3Qgc2xvdCB1c2VkIGJ5IGFueQorCQkqKiBzZXJ2aWNlLCB0aGUgZGF0YV91c2VfY291bnQgbXVzdCBiZSBpbmNyZWFzZWQuICovCisJCWlmICh0eF9lbmRfaW5kZXggIT0gc3RhdGUtPnByZXZpb3VzX2RhdGFfaW5kZXgpIHsKKwkJCXN0YXRlLT5wcmV2aW91c19kYXRhX2luZGV4ID0gdHhfZW5kX2luZGV4OworCQkJc3RhdGUtPmRhdGFfdXNlX2NvdW50Kys7CisJCX0KKworCQkvKiBJZiB0aGlzIGlzbid0IHRoZSBzYW1lIHNsb3QgbGFzdCB1c2VkIGJ5IHRoaXMgc2VydmljZSwKKwkJKiogdGhlIHNlcnZpY2UncyBzbG90X3VzZV9jb3VudCBtdXN0IGJlIGluY3JlYXNlZC4gKi8KKwkJaWYgKHR4X2VuZF9pbmRleCAhPSBzZXJ2aWNlX3F1b3RhLT5wcmV2aW91c190eF9pbmRleCkgeworCQkJc2VydmljZV9xdW90YS0+cHJldmlvdXNfdHhfaW5kZXggPSB0eF9lbmRfaW5kZXg7CisJCQlzbG90X3VzZV9jb3VudCA9ICsrc2VydmljZV9xdW90YS0+c2xvdF91c2VfY291bnQ7CisJCX0gZWxzZSB7CisJCQlzbG90X3VzZV9jb3VudCA9IDA7CisJCX0KKworCQlzcGluX3VubG9jaygmcXVvdGFfc3BpbmxvY2spOworCisJCWlmIChzbG90X3VzZV9jb3VudCkKKwkJCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkiJWQ6IHFtOiVkICVzLCV4IC0gc2xvdF91c2UtPiVkIChoZHIgJXApIiwKKwkJCQlzdGF0ZS0+aWQsIHNlcnZpY2UtPmxvY2FscG9ydCwKKwkJCQltc2dfdHlwZV9zdHIoVkNISVFfTVNHX1RZUEUobXNnaWQpKSwgc2l6ZSwKKwkJCQlzbG90X3VzZV9jb3VudCwgaGVhZGVyKTsKKworCQlWQ0hJUV9TRVJWSUNFX1NUQVRTX0lOQyhzZXJ2aWNlLCBjdHJsX3R4X2NvdW50KTsKKwkJVkNISVFfU0VSVklDRV9TVEFUU19BREQoc2VydmljZSwgY3RybF90eF9ieXRlcywgc2l6ZSk7CisJfSBlbHNlIHsKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkiJWQ6IHFtICVzQCV4LCV4ICglZC0+JWQpIiwgc3RhdGUtPmlkLAorCQkJbXNnX3R5cGVfc3RyKFZDSElRX01TR19UWVBFKG1zZ2lkKSksCisJCQkodW5zaWduZWQgaW50KWhlYWRlciwgc2l6ZSwKKwkJCVZDSElRX01TR19TUkNQT1JUKG1zZ2lkKSwKKwkJCVZDSElRX01TR19EU1RQT1JUKG1zZ2lkKSk7CisJCWlmIChzaXplICE9IDApIHsKKwkJCVdBUk5fT04oISgoY291bnQgPT0gMSkgJiYgKHNpemUgPT0gZWxlbWVudHNbMF0uc2l6ZSkpKTsKKwkJCW1lbWNweShoZWFkZXItPmRhdGEsIGVsZW1lbnRzWzBdLmRhdGEsCisJCQkJZWxlbWVudHNbMF0uc2l6ZSk7CisJCX0KKwkJVkNISVFfU1RBVFNfSU5DKHN0YXRlLCBjdHJsX3R4X2NvdW50KTsKKwl9CisKKwloZWFkZXItPm1zZ2lkID0gbXNnaWQ7CisJaGVhZGVyLT5zaXplID0gc2l6ZTsKKworCXsKKwkJaW50IHN2Y19mb3VyY2M7CisKKwkJc3ZjX2ZvdXJjYyA9IHNlcnZpY2UKKwkJCT8gc2VydmljZS0+YmFzZS5mb3VyY2MKKwkJCTogVkNISVFfTUFLRV9GT1VSQ0MoJz8nLCAnPycsICc/JywgJz8nKTsKKworCQl2Y2hpcV9sb2dfaW5mbyhTUlZUUkFDRV9MRVZFTChzZXJ2aWNlKSwKKwkJCSJTZW50IE1zZyAlcygldSkgdG8gJWMlYyVjJWMgczoldSBkOiVkIGxlbjolZCIsCisJCQltc2dfdHlwZV9zdHIoVkNISVFfTVNHX1RZUEUobXNnaWQpKSwKKwkJCVZDSElRX01TR19UWVBFKG1zZ2lkKSwKKwkJCVZDSElRX0ZPVVJDQ19BU180Q0hBUlMoc3ZjX2ZvdXJjYyksCisJCQlWQ0hJUV9NU0dfU1JDUE9SVChtc2dpZCksCisJCQlWQ0hJUV9NU0dfRFNUUE9SVChtc2dpZCksCisJCQlzaXplKTsKKwl9CisKKwkvKiBNYWtlIHN1cmUgdGhlIG5ldyBoZWFkZXIgaXMgdmlzaWJsZSB0byB0aGUgcGVlci4gKi8KKwl3bWIoKTsKKworCS8qIE1ha2UgdGhlIG5ldyB0eF9wb3MgdmlzaWJsZSB0byB0aGUgcGVlci4gKi8KKwlsb2NhbC0+dHhfcG9zID0gc3RhdGUtPmxvY2FsX3R4X3BvczsKKwl3bWIoKTsKKworCWlmIChzZXJ2aWNlICYmICh0eXBlID09IFZDSElRX01TR19DTE9TRSkpCisJCXZjaGlxX3NldF9zZXJ2aWNlX3N0YXRlKHNlcnZpY2UsIFZDSElRX1NSVlNUQVRFX0NMT1NFU0VOVCk7CisKKwlpZiAoIShmbGFncyAmIFFNRkxBR1NfTk9fTVVURVhfVU5MT0NLKSkKKwkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2xvdF9tdXRleCk7CisKKwlyZW1vdGVfZXZlbnRfc2lnbmFsKCZzdGF0ZS0+cmVtb3RlLT50cmlnZ2VyKTsKKworCXJldHVybiBWQ0hJUV9TVUNDRVNTOworfQorCisvKiBDYWxsZWQgYnkgdGhlIHNsb3QgaGFuZGxlciBhbmQgYXBwbGljYXRpb24gdGhyZWFkcyAqLworc3RhdGljIFZDSElRX1NUQVRVU19UCitxdWV1ZV9tZXNzYWdlX3N5bmMoVkNISVFfU1RBVEVfVCAqc3RhdGUsIFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSwKKwlpbnQgbXNnaWQsIGNvbnN0IFZDSElRX0VMRU1FTlRfVCAqZWxlbWVudHMsCisJaW50IGNvdW50LCBpbnQgc2l6ZSwgaW50IGlzX2Jsb2NraW5nKQoreworCVZDSElRX1NIQVJFRF9TVEFURV9UICpsb2NhbDsKKwlWQ0hJUV9IRUFERVJfVCAqaGVhZGVyOworCisJbG9jYWwgPSBzdGF0ZS0+bG9jYWw7CisKKwlpZiAoKFZDSElRX01TR19UWVBFKG1zZ2lkKSAhPSBWQ0hJUV9NU0dfUkVTVU1FKSAmJgorCQkobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+c3luY19tdXRleCkgIT0gMCkpCisJCXJldHVybiBWQ0hJUV9SRVRSWTsKKworCXJlbW90ZV9ldmVudF93YWl0KCZsb2NhbC0+c3luY19yZWxlYXNlKTsKKworCXJtYigpOworCisJaGVhZGVyID0gKFZDSElRX0hFQURFUl9UICopU0xPVF9EQVRBX0ZST01fSU5ERVgoc3RhdGUsCisJCWxvY2FsLT5zbG90X3N5bmMpOworCisJeworCQlpbnQgb2xkbXNnaWQgPSBoZWFkZXItPm1zZ2lkOworCQlpZiAob2xkbXNnaWQgIT0gVkNISVFfTVNHSURfUEFERElORykKKwkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkiJWQ6IHFtcyAtIG1zZ2lkICV4LCBub3QgUEFERElORyIsCisJCQkJc3RhdGUtPmlkLCBvbGRtc2dpZCk7CisJfQorCisJaWYgKHNlcnZpY2UpIHsKKwkJaW50IGksIHBvczsKKworCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9zeW5jX2xvZ19sZXZlbCwKKwkJCSIlZDogcW1zICVzQCV4LCV4ICglZC0+JWQpIiwgc3RhdGUtPmlkLAorCQkJbXNnX3R5cGVfc3RyKFZDSElRX01TR19UWVBFKG1zZ2lkKSksCisJCQkodW5zaWduZWQgaW50KWhlYWRlciwgc2l6ZSwKKwkJCVZDSElRX01TR19TUkNQT1JUKG1zZ2lkKSwKKwkJCVZDSElRX01TR19EU1RQT1JUKG1zZ2lkKSk7CisKKwkJZm9yIChpID0gMCwgcG9zID0gMDsgaSA8ICh1bnNpZ25lZCBpbnQpY291bnQ7CisJCQlwb3MgKz0gZWxlbWVudHNbaSsrXS5zaXplKQorCQkJaWYgKGVsZW1lbnRzW2ldLnNpemUpIHsKKwkJCQlpZiAodmNoaXFfY29weV9mcm9tX3VzZXIKKwkJCQkJKGhlYWRlci0+ZGF0YSArIHBvcywgZWxlbWVudHNbaV0uZGF0YSwKKwkJCQkJKHNpemVfdCkgZWxlbWVudHNbaV0uc2l6ZSkgIT0KKwkJCQkJVkNISVFfU1VDQ0VTUykgeworCQkJCQltdXRleF91bmxvY2soJnN0YXRlLT5zeW5jX211dGV4KTsKKwkJCQkJVkNISVFfU0VSVklDRV9TVEFUU19JTkMoc2VydmljZSwKKwkJCQkJCWVycm9yX2NvdW50KTsKKwkJCQkJcmV0dXJuIFZDSElRX0VSUk9SOworCQkJCX0KKwkJCQlpZiAoaSA9PSAwKSB7CisJCQkJCWlmICh2Y2hpcV9zeW5jX2xvZ19sZXZlbCA+PQorCQkJCQkJVkNISVFfTE9HX1RSQUNFKQorCQkJCQkJdmNoaXFfbG9nX2R1bXBfbWVtKCJTZW50IFN5bmMiLAorCQkJCQkJCTAsIGhlYWRlci0+ZGF0YSArIHBvcywKKwkJCQkJCQltaW4oNjR1LAorCQkJCQkJCWVsZW1lbnRzWzBdLnNpemUpKTsKKwkJCQl9CisJCQl9CisKKwkJVkNISVFfU0VSVklDRV9TVEFUU19JTkMoc2VydmljZSwgY3RybF90eF9jb3VudCk7CisJCVZDSElRX1NFUlZJQ0VfU1RBVFNfQUREKHNlcnZpY2UsIGN0cmxfdHhfYnl0ZXMsIHNpemUpOworCX0gZWxzZSB7CisJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX3N5bmNfbG9nX2xldmVsLAorCQkJIiVkOiBxbXMgJXNAJXgsJXggKCVkLT4lZCkiLCBzdGF0ZS0+aWQsCisJCQltc2dfdHlwZV9zdHIoVkNISVFfTVNHX1RZUEUobXNnaWQpKSwKKwkJCSh1bnNpZ25lZCBpbnQpaGVhZGVyLCBzaXplLAorCQkJVkNISVFfTVNHX1NSQ1BPUlQobXNnaWQpLAorCQkJVkNISVFfTVNHX0RTVFBPUlQobXNnaWQpKTsKKwkJaWYgKHNpemUgIT0gMCkgeworCQkJV0FSTl9PTighKChjb3VudCA9PSAxKSAmJiAoc2l6ZSA9PSBlbGVtZW50c1swXS5zaXplKSkpOworCQkJbWVtY3B5KGhlYWRlci0+ZGF0YSwgZWxlbWVudHNbMF0uZGF0YSwKKwkJCQllbGVtZW50c1swXS5zaXplKTsKKwkJfQorCQlWQ0hJUV9TVEFUU19JTkMoc3RhdGUsIGN0cmxfdHhfY291bnQpOworCX0KKworCWhlYWRlci0+c2l6ZSA9IHNpemU7CisJaGVhZGVyLT5tc2dpZCA9IG1zZ2lkOworCisJaWYgKHZjaGlxX3N5bmNfbG9nX2xldmVsID49IFZDSElRX0xPR19UUkFDRSkgeworCQlpbnQgc3ZjX2ZvdXJjYzsKKworCQlzdmNfZm91cmNjID0gc2VydmljZQorCQkJPyBzZXJ2aWNlLT5iYXNlLmZvdXJjYworCQkJOiBWQ0hJUV9NQUtFX0ZPVVJDQygnPycsICc/JywgJz8nLCAnPycpOworCisJCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9zeW5jX2xvZ19sZXZlbCwKKwkJCSJTZW50IFN5bmMgTXNnICVzKCV1KSB0byAlYyVjJWMlYyBzOiV1IGQ6JWQgbGVuOiVkIiwKKwkJCW1zZ190eXBlX3N0cihWQ0hJUV9NU0dfVFlQRShtc2dpZCkpLAorCQkJVkNISVFfTVNHX1RZUEUobXNnaWQpLAorCQkJVkNISVFfRk9VUkNDX0FTXzRDSEFSUyhzdmNfZm91cmNjKSwKKwkJCVZDSElRX01TR19TUkNQT1JUKG1zZ2lkKSwKKwkJCVZDSElRX01TR19EU1RQT1JUKG1zZ2lkKSwKKwkJCXNpemUpOworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGUgbmV3IGhlYWRlciBpcyB2aXNpYmxlIHRvIHRoZSBwZWVyLiAqLworCXdtYigpOworCisJcmVtb3RlX2V2ZW50X3NpZ25hbCgmc3RhdGUtPnJlbW90ZS0+c3luY190cmlnZ2VyKTsKKworCWlmIChWQ0hJUV9NU0dfVFlQRShtc2dpZCkgIT0gVkNISVFfTVNHX1BBVVNFKQorCQltdXRleF91bmxvY2soJnN0YXRlLT5zeW5jX211dGV4KTsKKworCXJldHVybiBWQ0hJUV9TVUNDRVNTOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2NsYWltX3Nsb3QoVkNISVFfU0xPVF9JTkZPX1QgKnNsb3QpCit7CisJc2xvdC0+dXNlX2NvdW50Kys7Cit9CisKK3N0YXRpYyB2b2lkCityZWxlYXNlX3Nsb3QoVkNISVFfU1RBVEVfVCAqc3RhdGUsIFZDSElRX1NMT1RfSU5GT19UICpzbG90X2luZm8sCisJVkNISVFfSEVBREVSX1QgKmhlYWRlciwgVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlKQoreworCWludCByZWxlYXNlX2NvdW50OworCisJbXV0ZXhfbG9jaygmc3RhdGUtPnJlY3ljbGVfbXV0ZXgpOworCisJaWYgKGhlYWRlcikgeworCQlpbnQgbXNnaWQgPSBoZWFkZXItPm1zZ2lkOworCQlpZiAoKChtc2dpZCAmIFZDSElRX01TR0lEX0NMQUlNRUQpID09IDApIHx8CisJCQkoc2VydmljZSAmJiBzZXJ2aWNlLT5jbG9zaW5nKSkgeworCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+cmVjeWNsZV9tdXRleCk7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBSZXdyaXRlIHRoZSBtZXNzYWdlIGhlYWRlciB0byBwcmV2ZW50IGEgZG91YmxlCisJCSoqIHJlbGVhc2UgKi8KKwkJaGVhZGVyLT5tc2dpZCA9IG1zZ2lkICYgflZDSElRX01TR0lEX0NMQUlNRUQ7CisJfQorCisJcmVsZWFzZV9jb3VudCA9IHNsb3RfaW5mby0+cmVsZWFzZV9jb3VudDsKKwlzbG90X2luZm8tPnJlbGVhc2VfY291bnQgPSArK3JlbGVhc2VfY291bnQ7CisKKwlpZiAocmVsZWFzZV9jb3VudCA9PSBzbG90X2luZm8tPnVzZV9jb3VudCkgeworCQlpbnQgc2xvdF9xdWV1ZV9yZWN5Y2xlOworCQkvKiBBZGQgdG8gdGhlIGZyZWVkIHF1ZXVlICovCisKKwkJLyogQSByZWFkIGJhcnJpZXIgaXMgbmVjZXNzYXJ5IGhlcmUgdG8gcHJldmVudCBzcGVjdWxhdGl2ZQorCQkqKiBmZXRjaGVzIG9mIHJlbW90ZS0+c2xvdF9xdWV1ZV9yZWN5Y2xlIGZyb20gb3ZlcnRha2luZyB0aGUKKwkJKiogbXV0ZXguICovCisJCXJtYigpOworCisJCXNsb3RfcXVldWVfcmVjeWNsZSA9IHN0YXRlLT5yZW1vdGUtPnNsb3RfcXVldWVfcmVjeWNsZTsKKwkJc3RhdGUtPnJlbW90ZS0+c2xvdF9xdWV1ZVtzbG90X3F1ZXVlX3JlY3ljbGUgJgorCQkJVkNISVFfU0xPVF9RVUVVRV9NQVNLXSA9CisJCQlTTE9UX0lOREVYX0ZST01fSU5GTyhzdGF0ZSwgc2xvdF9pbmZvKTsKKwkJc3RhdGUtPnJlbW90ZS0+c2xvdF9xdWV1ZV9yZWN5Y2xlID0gc2xvdF9xdWV1ZV9yZWN5Y2xlICsgMTsKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkiJWQ6IHJlbGVhc2Vfc2xvdCAlZCAtIHJlY3ljbGUtPiV4IiwKKwkJCXN0YXRlLT5pZCwgU0xPVF9JTkRFWF9GUk9NX0lORk8oc3RhdGUsIHNsb3RfaW5mbyksCisJCQlzdGF0ZS0+cmVtb3RlLT5zbG90X3F1ZXVlX3JlY3ljbGUpOworCisJCS8qIEEgd3JpdGUgYmFycmllciBpcyBuZWNlc3NhcnksIGJ1dCByZW1vdGVfZXZlbnRfc2lnbmFsCisJCSoqIGNvbnRhaW5zIG9uZS4gKi8KKwkJcmVtb3RlX2V2ZW50X3NpZ25hbCgmc3RhdGUtPnJlbW90ZS0+cmVjeWNsZSk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+cmVjeWNsZV9tdXRleCk7Cit9CisKKy8qIENhbGxlZCBieSB0aGUgc2xvdCBoYW5kbGVyIC0gZG9uJ3QgaG9sZCB0aGUgYnVsayBtdXRleCAqLworc3RhdGljIFZDSElRX1NUQVRVU19UCitub3RpZnlfYnVsa3MoVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlLCBWQ0hJUV9CVUxLX1FVRVVFX1QgKnF1ZXVlLAorCWludCByZXRyeV9wb2xsKQoreworCVZDSElRX1NUQVRVU19UIHN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCSIlZDogbmI6JWQgJWN4IC0gcD0leCBybj0leCByPSV4IiwKKwkJc2VydmljZS0+c3RhdGUtPmlkLCBzZXJ2aWNlLT5sb2NhbHBvcnQsCisJCShxdWV1ZSA9PSAmc2VydmljZS0+YnVsa190eCkgPyAndCcgOiAncicsCisJCXF1ZXVlLT5wcm9jZXNzLCBxdWV1ZS0+cmVtb3RlX25vdGlmeSwgcXVldWUtPnJlbW92ZSk7CisKKwlpZiAoc2VydmljZS0+c3RhdGUtPmlzX21hc3RlcikgeworCQl3aGlsZSAocXVldWUtPnJlbW90ZV9ub3RpZnkgIT0gcXVldWUtPnByb2Nlc3MpIHsKKwkJCVZDSElRX0JVTEtfVCAqYnVsayA9CisJCQkJJnF1ZXVlLT5idWxrc1tCVUxLX0lOREVYKHF1ZXVlLT5yZW1vdGVfbm90aWZ5KV07CisJCQlpbnQgbXNndHlwZSA9IChidWxrLT5kaXIgPT0gVkNISVFfQlVMS19UUkFOU01JVCkgPworCQkJCVZDSElRX01TR19CVUxLX1JYX0RPTkUgOiBWQ0hJUV9NU0dfQlVMS19UWF9ET05FOworCQkJaW50IG1zZ2lkID0gVkNISVFfTUFLRV9NU0cobXNndHlwZSwgc2VydmljZS0+bG9jYWxwb3J0LAorCQkJCXNlcnZpY2UtPnJlbW90ZXBvcnQpOworCQkJVkNISVFfRUxFTUVOVF9UIGVsZW1lbnQgPSB7ICZidWxrLT5hY3R1YWwsIDQgfTsKKwkJCS8qIE9ubHkgcmVwbHkgdG8gbm9uLWR1bW15IGJ1bGsgcmVxdWVzdHMgKi8KKwkJCWlmIChidWxrLT5yZW1vdGVfZGF0YSkgeworCQkJCXN0YXR1cyA9IHF1ZXVlX21lc3NhZ2Uoc2VydmljZS0+c3RhdGUsIE5VTEwsCisJCQkJCW1zZ2lkLCAmZWxlbWVudCwgMSwgNCwgMCk7CisJCQkJaWYgKHN0YXR1cyAhPSBWQ0hJUV9TVUNDRVNTKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCXF1ZXVlLT5yZW1vdGVfbm90aWZ5Kys7CisJCX0KKwl9IGVsc2UgeworCQlxdWV1ZS0+cmVtb3RlX25vdGlmeSA9IHF1ZXVlLT5wcm9jZXNzOworCX0KKworCWlmIChzdGF0dXMgPT0gVkNISVFfU1VDQ0VTUykgeworCQl3aGlsZSAocXVldWUtPnJlbW92ZSAhPSBxdWV1ZS0+cmVtb3RlX25vdGlmeSkgeworCQkJVkNISVFfQlVMS19UICpidWxrID0KKwkJCQkmcXVldWUtPmJ1bGtzW0JVTEtfSU5ERVgocXVldWUtPnJlbW92ZSldOworCisJCQkvKiBPbmx5IGdlbmVyYXRlIGNhbGxiYWNrcyBmb3Igbm9uLWR1bW15IGJ1bGsKKwkJCSoqIHJlcXVlc3RzLCBhbmQgbm9uLXRlcm1pbmF0ZWQgc2VydmljZXMgKi8KKwkJCWlmIChidWxrLT5kYXRhICYmIHNlcnZpY2UtPmluc3RhbmNlKSB7CisJCQkJaWYgKGJ1bGstPmFjdHVhbCAhPSBWQ0hJUV9CVUxLX0FDVFVBTF9BQk9SVEVEKSB7CisJCQkJCWlmIChidWxrLT5kaXIgPT0gVkNISVFfQlVMS19UUkFOU01JVCkgeworCQkJCQkJVkNISVFfU0VSVklDRV9TVEFUU19JTkMoc2VydmljZSwKKwkJCQkJCQlidWxrX3R4X2NvdW50KTsKKwkJCQkJCVZDSElRX1NFUlZJQ0VfU1RBVFNfQUREKHNlcnZpY2UsCisJCQkJCQkJYnVsa190eF9ieXRlcywKKwkJCQkJCQlidWxrLT5hY3R1YWwpOworCQkJCQl9IGVsc2UgeworCQkJCQkJVkNISVFfU0VSVklDRV9TVEFUU19JTkMoc2VydmljZSwKKwkJCQkJCQlidWxrX3J4X2NvdW50KTsKKwkJCQkJCVZDSElRX1NFUlZJQ0VfU1RBVFNfQUREKHNlcnZpY2UsCisJCQkJCQkJYnVsa19yeF9ieXRlcywKKwkJCQkJCQlidWxrLT5hY3R1YWwpOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJVkNISVFfU0VSVklDRV9TVEFUU19JTkMoc2VydmljZSwKKwkJCQkJCWJ1bGtfYWJvcnRlZF9jb3VudCk7CisJCQkJfQorCQkJCWlmIChidWxrLT5tb2RlID09IFZDSElRX0JVTEtfTU9ERV9CTE9DS0lORykgeworCQkJCQlzdHJ1Y3QgYnVsa193YWl0ZXIgKndhaXRlcjsKKwkJCQkJc3Bpbl9sb2NrKCZidWxrX3dhaXRlcl9zcGlubG9jayk7CisJCQkJCXdhaXRlciA9IGJ1bGstPnVzZXJkYXRhOworCQkJCQlpZiAod2FpdGVyKSB7CisJCQkJCQl3YWl0ZXItPmFjdHVhbCA9IGJ1bGstPmFjdHVhbDsKKwkJCQkJCXVwKCZ3YWl0ZXItPmV2ZW50KTsKKwkJCQkJfQorCQkJCQlzcGluX3VubG9jaygmYnVsa193YWl0ZXJfc3BpbmxvY2spOworCQkJCX0gZWxzZSBpZiAoYnVsay0+bW9kZSA9PQorCQkJCQlWQ0hJUV9CVUxLX01PREVfQ0FMTEJBQ0spIHsKKwkJCQkJVkNISVFfUkVBU09OX1QgcmVhc29uID0gKGJ1bGstPmRpciA9PQorCQkJCQkJVkNISVFfQlVMS19UUkFOU01JVCkgPworCQkJCQkJKChidWxrLT5hY3R1YWwgPT0KKwkJCQkJCVZDSElRX0JVTEtfQUNUVUFMX0FCT1JURUQpID8KKwkJCQkJCVZDSElRX0JVTEtfVFJBTlNNSVRfQUJPUlRFRCA6CisJCQkJCQlWQ0hJUV9CVUxLX1RSQU5TTUlUX0RPTkUpIDoKKwkJCQkJCSgoYnVsay0+YWN0dWFsID09CisJCQkJCQlWQ0hJUV9CVUxLX0FDVFVBTF9BQk9SVEVEKSA/CisJCQkJCQlWQ0hJUV9CVUxLX1JFQ0VJVkVfQUJPUlRFRCA6CisJCQkJCQlWQ0hJUV9CVUxLX1JFQ0VJVkVfRE9ORSk7CisJCQkJCXN0YXR1cyA9IG1ha2Vfc2VydmljZV9jYWxsYmFjayhzZXJ2aWNlLAorCQkJCQkJcmVhc29uLAlOVUxMLCBidWxrLT51c2VyZGF0YSk7CisJCQkJCWlmIChzdGF0dXMgPT0gVkNISVFfUkVUUlkpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCXF1ZXVlLT5yZW1vdmUrKzsKKwkJCXVwKCZzZXJ2aWNlLT5idWxrX3JlbW92ZV9ldmVudCk7CisJCX0KKwkJaWYgKCFyZXRyeV9wb2xsKQorCQkJc3RhdHVzID0gVkNISVFfU1VDQ0VTUzsKKwl9CisKKwlpZiAoc3RhdHVzID09IFZDSElRX1JFVFJZKQorCQlyZXF1ZXN0X3BvbGwoc2VydmljZS0+c3RhdGUsIHNlcnZpY2UsCisJCQkocXVldWUgPT0gJnNlcnZpY2UtPmJ1bGtfdHgpID8KKwkJCVZDSElRX1BPTExfVFhOT1RJRlkgOiBWQ0hJUV9QT0xMX1JYTk9USUZZKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIENhbGxlZCBieSB0aGUgc2xvdCBoYW5kbGVyIHRocmVhZCAqLworc3RhdGljIHZvaWQKK3BvbGxfc2VydmljZXMoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJaW50IGdyb3VwLCBpOworCisJZm9yIChncm91cCA9IDA7IGdyb3VwIDwgQklUU0VUX1NJWkUoc3RhdGUtPnVudXNlZF9zZXJ2aWNlKTsgZ3JvdXArKykgeworCQl1aW50MzJfdCBmbGFnczsKKwkJZmxhZ3MgPSBhdG9taWNfeGNoZygmc3RhdGUtPnBvbGxfc2VydmljZXNbZ3JvdXBdLCAwKTsKKwkJZm9yIChpID0gMDsgZmxhZ3M7IGkrKykgeworCQkJaWYgKGZsYWdzICYgKDEgPDwgaSkpIHsKKwkJCQlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UgPQorCQkJCQlmaW5kX3NlcnZpY2VfYnlfcG9ydChzdGF0ZSwKKwkJCQkJCShncm91cDw8NSkgKyBpKTsKKwkJCQl1aW50MzJfdCBzZXJ2aWNlX2ZsYWdzOworCQkJCWZsYWdzICY9IH4oMSA8PCBpKTsKKwkJCQlpZiAoIXNlcnZpY2UpCisJCQkJCWNvbnRpbnVlOworCQkJCXNlcnZpY2VfZmxhZ3MgPQorCQkJCQlhdG9taWNfeGNoZygmc2VydmljZS0+cG9sbF9mbGFncywgMCk7CisJCQkJaWYgKHNlcnZpY2VfZmxhZ3MgJgorCQkJCQkoMSA8PCBWQ0hJUV9QT0xMX1JFTU9WRSkpIHsKKwkJCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJCQkiJWQ6IHBzIC0gcmVtb3ZlICVkPC0+JWQiLAorCQkJCQkJc3RhdGUtPmlkLCBzZXJ2aWNlLT5sb2NhbHBvcnQsCisJCQkJCQlzZXJ2aWNlLT5yZW1vdGVwb3J0KTsKKworCQkJCQkvKiBNYWtlIGl0IGxvb2sgbGlrZSBhIGNsaWVudCwgYmVjYXVzZQorCQkJCQkgICBpdCBtdXN0IGJlIHJlbW92ZWQgYW5kIG5vdCBsZWZ0IGluCisJCQkJCSAgIHRoZSBMSVNURU5JTkcgc3RhdGUuICovCisJCQkJCXNlcnZpY2UtPnB1YmxpY19mb3VyY2MgPQorCQkJCQkJVkNISVFfRk9VUkNDX0lOVkFMSUQ7CisKKwkJCQkJaWYgKHZjaGlxX2Nsb3NlX3NlcnZpY2VfaW50ZXJuYWwoCisJCQkJCQlzZXJ2aWNlLCAwLyohY2xvc2VfcmVjdmQqLykgIT0KKwkJCQkJCVZDSElRX1NVQ0NFU1MpCisJCQkJCQlyZXF1ZXN0X3BvbGwoc3RhdGUsIHNlcnZpY2UsCisJCQkJCQkJVkNISVFfUE9MTF9SRU1PVkUpOworCQkJCX0gZWxzZSBpZiAoc2VydmljZV9mbGFncyAmCisJCQkJCSgxIDw8IFZDSElRX1BPTExfVEVSTUlOQVRFKSkgeworCQkJCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkJCSIlZDogcHMgLSB0ZXJtaW5hdGUgJWQ8LT4lZCIsCisJCQkJCQlzdGF0ZS0+aWQsIHNlcnZpY2UtPmxvY2FscG9ydCwKKwkJCQkJCXNlcnZpY2UtPnJlbW90ZXBvcnQpOworCQkJCQlpZiAodmNoaXFfY2xvc2Vfc2VydmljZV9pbnRlcm5hbCgKKwkJCQkJCXNlcnZpY2UsIDAvKiFjbG9zZV9yZWN2ZCovKSAhPQorCQkJCQkJVkNISVFfU1VDQ0VTUykKKwkJCQkJCXJlcXVlc3RfcG9sbChzdGF0ZSwgc2VydmljZSwKKwkJCQkJCQlWQ0hJUV9QT0xMX1RFUk1JTkFURSk7CisJCQkJfQorCQkJCWlmIChzZXJ2aWNlX2ZsYWdzICYgKDEgPDwgVkNISVFfUE9MTF9UWE5PVElGWSkpCisJCQkJCW5vdGlmeV9idWxrcyhzZXJ2aWNlLAorCQkJCQkJJnNlcnZpY2UtPmJ1bGtfdHgsCisJCQkJCQkxLypyZXRyeV9wb2xsKi8pOworCQkJCWlmIChzZXJ2aWNlX2ZsYWdzICYgKDEgPDwgVkNISVFfUE9MTF9SWE5PVElGWSkpCisJCQkJCW5vdGlmeV9idWxrcyhzZXJ2aWNlLAorCQkJCQkJJnNlcnZpY2UtPmJ1bGtfcngsCisJCQkJCQkxLypyZXRyeV9wb2xsKi8pOworCQkJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCQkJfQorCQl9CisJfQorfQorCisvKiBDYWxsZWQgYnkgdGhlIHNsb3QgaGFuZGxlciBvciBhcHBsaWNhdGlvbiB0aHJlYWRzLCBob2xkaW5nIHRoZSBidWxrIG11dGV4LiAqLworc3RhdGljIGludAorcmVzb2x2ZV9idWxrcyhWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UsIFZDSElRX0JVTEtfUVVFVUVfVCAqcXVldWUpCit7CisJVkNISVFfU1RBVEVfVCAqc3RhdGUgPSBzZXJ2aWNlLT5zdGF0ZTsKKwlpbnQgcmVzb2x2ZWQgPSAwOworCWludCByYzsKKworCXdoaWxlICgocXVldWUtPnByb2Nlc3MgIT0gcXVldWUtPmxvY2FsX2luc2VydCkgJiYKKwkJKHF1ZXVlLT5wcm9jZXNzICE9IHF1ZXVlLT5yZW1vdGVfaW5zZXJ0KSkgeworCQlWQ0hJUV9CVUxLX1QgKmJ1bGsgPSAmcXVldWUtPmJ1bGtzW0JVTEtfSU5ERVgocXVldWUtPnByb2Nlc3MpXTsKKworCQl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkiJWQ6IHJiOiVkICVjeCAtIGxpPSV4IHJpPSV4IHA9JXgiLAorCQkJc3RhdGUtPmlkLCBzZXJ2aWNlLT5sb2NhbHBvcnQsCisJCQkocXVldWUgPT0gJnNlcnZpY2UtPmJ1bGtfdHgpID8gJ3QnIDogJ3InLAorCQkJcXVldWUtPmxvY2FsX2luc2VydCwgcXVldWUtPnJlbW90ZV9pbnNlcnQsCisJCQlxdWV1ZS0+cHJvY2Vzcyk7CisKKwkJV0FSTl9PTighKChpbnQpKHF1ZXVlLT5sb2NhbF9pbnNlcnQgLSBxdWV1ZS0+cHJvY2VzcykgPiAwKSk7CisJCVdBUk5fT04oISgoaW50KShxdWV1ZS0+cmVtb3RlX2luc2VydCAtIHF1ZXVlLT5wcm9jZXNzKSA+IDApKTsKKworCQlyYyA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc3RhdGUtPmJ1bGtfdHJhbnNmZXJfbXV0ZXgpOworCQlpZiAocmMgIT0gMCkKKwkJCWJyZWFrOworCisJCXZjaGlxX3RyYW5zZmVyX2J1bGsoYnVsayk7CisJCW11dGV4X3VubG9jaygmc3RhdGUtPmJ1bGtfdHJhbnNmZXJfbXV0ZXgpOworCisJCWlmIChTUlZUUkFDRV9FTkFCTEVEKHNlcnZpY2UsIFZDSElRX0xPR19JTkZPKSkgeworCQkJY29uc3QgY2hhciAqaGVhZGVyID0gKHF1ZXVlID09ICZzZXJ2aWNlLT5idWxrX3R4KSA/CisJCQkJIlNlbmQgQnVsayB0byIgOiAiUmVjdiBCdWxrIGZyb20iOworCQkJaWYgKGJ1bGstPmFjdHVhbCAhPSBWQ0hJUV9CVUxLX0FDVFVBTF9BQk9SVEVEKQorCQkJCXZjaGlxX2xvZ19pbmZvKFNSVlRSQUNFX0xFVkVMKHNlcnZpY2UpLAorCQkJCQkiJXMgJWMlYyVjJWMgZDolZCBsZW46JWQgJXg8LT4leCIsCisJCQkJCWhlYWRlciwKKwkJCQkJVkNISVFfRk9VUkNDX0FTXzRDSEFSUygKKwkJCQkJCXNlcnZpY2UtPmJhc2UuZm91cmNjKSwKKwkJCQkJc2VydmljZS0+cmVtb3RlcG9ydCwKKwkJCQkJYnVsay0+c2l6ZSwKKwkJCQkJKHVuc2lnbmVkIGludClidWxrLT5kYXRhLAorCQkJCQkodW5zaWduZWQgaW50KWJ1bGstPnJlbW90ZV9kYXRhKTsKKwkJCWVsc2UKKwkJCQl2Y2hpcV9sb2dfaW5mbyhTUlZUUkFDRV9MRVZFTChzZXJ2aWNlKSwKKwkJCQkJIiVzICVjJWMlYyVjIGQ6JWQgQUJPUlRFRCAtIHR4IGxlbjolZCwiCisJCQkJCSIgcnggbGVuOiVkICV4PC0+JXgiLAorCQkJCQloZWFkZXIsCisJCQkJCVZDSElRX0ZPVVJDQ19BU180Q0hBUlMoCisJCQkJCQlzZXJ2aWNlLT5iYXNlLmZvdXJjYyksCisJCQkJCXNlcnZpY2UtPnJlbW90ZXBvcnQsCisJCQkJCWJ1bGstPnNpemUsCisJCQkJCWJ1bGstPnJlbW90ZV9zaXplLAorCQkJCQkodW5zaWduZWQgaW50KWJ1bGstPmRhdGEsCisJCQkJCSh1bnNpZ25lZCBpbnQpYnVsay0+cmVtb3RlX2RhdGEpOworCQl9CisKKwkJdmNoaXFfY29tcGxldGVfYnVsayhidWxrKTsKKwkJcXVldWUtPnByb2Nlc3MrKzsKKwkJcmVzb2x2ZWQrKzsKKwl9CisJcmV0dXJuIHJlc29sdmVkOworfQorCisvKiBDYWxsZWQgd2l0aCB0aGUgYnVsa19tdXRleCBoZWxkICovCitzdGF0aWMgdm9pZAorYWJvcnRfb3V0c3RhbmRpbmdfYnVsa3MoVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlLCBWQ0hJUV9CVUxLX1FVRVVFX1QgKnF1ZXVlKQoreworCWludCBpc190eCA9IChxdWV1ZSA9PSAmc2VydmljZS0+YnVsa190eCk7CisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkiJWQ6IGFvYjolZCAlY3ggLSBsaT0leCByaT0leCBwPSV4IiwKKwkJc2VydmljZS0+c3RhdGUtPmlkLCBzZXJ2aWNlLT5sb2NhbHBvcnQsIGlzX3R4ID8gJ3QnIDogJ3InLAorCQlxdWV1ZS0+bG9jYWxfaW5zZXJ0LCBxdWV1ZS0+cmVtb3RlX2luc2VydCwgcXVldWUtPnByb2Nlc3MpOworCisJV0FSTl9PTighKChpbnQpKHF1ZXVlLT5sb2NhbF9pbnNlcnQgLSBxdWV1ZS0+cHJvY2VzcykgPj0gMCkpOworCVdBUk5fT04oISgoaW50KShxdWV1ZS0+cmVtb3RlX2luc2VydCAtIHF1ZXVlLT5wcm9jZXNzKSA+PSAwKSk7CisKKwl3aGlsZSAoKHF1ZXVlLT5wcm9jZXNzICE9IHF1ZXVlLT5sb2NhbF9pbnNlcnQpIHx8CisJCShxdWV1ZS0+cHJvY2VzcyAhPSBxdWV1ZS0+cmVtb3RlX2luc2VydCkpIHsKKwkJVkNISVFfQlVMS19UICpidWxrID0gJnF1ZXVlLT5idWxrc1tCVUxLX0lOREVYKHF1ZXVlLT5wcm9jZXNzKV07CisKKwkJaWYgKHF1ZXVlLT5wcm9jZXNzID09IHF1ZXVlLT5yZW1vdGVfaW5zZXJ0KSB7CisJCQkvKiBmYWJyaWNhdGUgYSBtYXRjaGluZyBkdW1teSBidWxrICovCisJCQlidWxrLT5yZW1vdGVfZGF0YSA9IE5VTEw7CisJCQlidWxrLT5yZW1vdGVfc2l6ZSA9IDA7CisJCQlxdWV1ZS0+cmVtb3RlX2luc2VydCsrOworCQl9CisKKwkJaWYgKHF1ZXVlLT5wcm9jZXNzICE9IHF1ZXVlLT5sb2NhbF9pbnNlcnQpIHsKKwkJCXZjaGlxX2NvbXBsZXRlX2J1bGsoYnVsayk7CisKKwkJCXZjaGlxX2xvZ19pbmZvKFNSVlRSQUNFX0xFVkVMKHNlcnZpY2UpLAorCQkJCSIlcyAlYyVjJWMlYyBkOiVkIEFCT1JURUQgLSB0eCBsZW46JWQsICIKKwkJCQkicnggbGVuOiVkIiwKKwkJCQlpc190eCA/ICJTZW5kIEJ1bGsgdG8iIDogIlJlY3YgQnVsayBmcm9tIiwKKwkJCQlWQ0hJUV9GT1VSQ0NfQVNfNENIQVJTKHNlcnZpY2UtPmJhc2UuZm91cmNjKSwKKwkJCQlzZXJ2aWNlLT5yZW1vdGVwb3J0LAorCQkJCWJ1bGstPnNpemUsCisJCQkJYnVsay0+cmVtb3RlX3NpemUpOworCQl9IGVsc2UgeworCQkJLyogZmFicmljYXRlIGEgbWF0Y2hpbmcgZHVtbXkgYnVsayAqLworCQkJYnVsay0+ZGF0YSA9IE5VTEw7CisJCQlidWxrLT5zaXplID0gMDsKKwkJCWJ1bGstPmFjdHVhbCA9IFZDSElRX0JVTEtfQUNUVUFMX0FCT1JURUQ7CisJCQlidWxrLT5kaXIgPSBpc190eCA/IFZDSElRX0JVTEtfVFJBTlNNSVQgOgorCQkJCVZDSElRX0JVTEtfUkVDRUlWRTsKKwkJCXF1ZXVlLT5sb2NhbF9pbnNlcnQrKzsKKwkJfQorCisJCXF1ZXVlLT5wcm9jZXNzKys7CisJfQorfQorCisvKiBDYWxsZWQgZnJvbSB0aGUgc2xvdCBoYW5kbGVyIHRocmVhZCAqLworc3RhdGljIHZvaWQKK3BhdXNlX2J1bGtzKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCWlmICh1bmxpa2VseShhdG9taWNfaW5jX3JldHVybigmcGF1c2VfYnVsa3NfY291bnQpICE9IDEpKSB7CisJCVdBUk5fT05fT05DRSgxKTsKKwkJYXRvbWljX3NldCgmcGF1c2VfYnVsa3NfY291bnQsIDEpOworCQlyZXR1cm47CisJfQorCisJLyogQmxvY2sgYnVsayB0cmFuc2ZlcnMgZnJvbSBhbGwgc2VydmljZXMgKi8KKwltdXRleF9sb2NrKCZzdGF0ZS0+YnVsa190cmFuc2Zlcl9tdXRleCk7Cit9CisKKy8qIENhbGxlZCBmcm9tIHRoZSBzbG90IGhhbmRsZXIgdGhyZWFkICovCitzdGF0aWMgdm9pZAorcmVzdW1lX2J1bGtzKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCWludCBpOworCWlmICh1bmxpa2VseShhdG9taWNfZGVjX3JldHVybigmcGF1c2VfYnVsa3NfY291bnQpICE9IDApKSB7CisJCVdBUk5fT05fT05DRSgxKTsKKwkJYXRvbWljX3NldCgmcGF1c2VfYnVsa3NfY291bnQsIDApOworCQlyZXR1cm47CisJfQorCisJLyogQWxsb3cgYnVsayB0cmFuc2ZlcnMgZnJvbSBhbGwgc2VydmljZXMgKi8KKwltdXRleF91bmxvY2soJnN0YXRlLT5idWxrX3RyYW5zZmVyX211dGV4KTsKKworCWlmIChzdGF0ZS0+ZGVmZXJyZWRfYnVsa3MgPT0gMCkKKwkJcmV0dXJuOworCisJLyogRGVhbCB3aXRoIGFueSBidWxrcyB3aGljaCBoYWQgdG8gYmUgZGVmZXJyZWQgZHVlIHRvIGJlaW5nIGluCisJICogcGF1c2VkIHN0YXRlLiAgRG9uJ3QgdHJ5IHRvIG1hdGNoIHVwIHRvIG51bWJlciBvZiBkZWZlcnJlZCBidWxrcworCSAqIGluIGNhc2Ugd2UndmUgaGFkIHNvbWV0aGluZyBjb21lIGFuZCBjbG9zZSB0aGUgc2VydmljZSBpbiB0aGUKKwkgKiBpbnRlcmltIC0ganVzdCBwcm9jZXNzIGFsbCBidWxrIHF1ZXVlcyBmb3IgYWxsIHNlcnZpY2VzICovCisJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsICIlczogcHJvY2Vzc2luZyAlZCBkZWZlcnJlZCBidWxrcyIsCisJCV9fZnVuY19fLCBzdGF0ZS0+ZGVmZXJyZWRfYnVsa3MpOworCisJZm9yIChpID0gMDsgaSA8IHN0YXRlLT51bnVzZWRfc2VydmljZTsgaSsrKSB7CisJCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IHN0YXRlLT5zZXJ2aWNlc1tpXTsKKwkJaW50IHJlc29sdmVkX3J4ID0gMDsKKwkJaW50IHJlc29sdmVkX3R4ID0gMDsKKwkJaWYgKCFzZXJ2aWNlIHx8IChzZXJ2aWNlLT5zcnZzdGF0ZSAhPSBWQ0hJUV9TUlZTVEFURV9PUEVOKSkKKwkJCWNvbnRpbnVlOworCisJCW11dGV4X2xvY2soJnNlcnZpY2UtPmJ1bGtfbXV0ZXgpOworCQlyZXNvbHZlZF9yeCA9IHJlc29sdmVfYnVsa3Moc2VydmljZSwgJnNlcnZpY2UtPmJ1bGtfcngpOworCQlyZXNvbHZlZF90eCA9IHJlc29sdmVfYnVsa3Moc2VydmljZSwgJnNlcnZpY2UtPmJ1bGtfdHgpOworCQltdXRleF91bmxvY2soJnNlcnZpY2UtPmJ1bGtfbXV0ZXgpOworCQlpZiAocmVzb2x2ZWRfcngpCisJCQlub3RpZnlfYnVsa3Moc2VydmljZSwgJnNlcnZpY2UtPmJ1bGtfcngsIDEpOworCQlpZiAocmVzb2x2ZWRfdHgpCisJCQlub3RpZnlfYnVsa3Moc2VydmljZSwgJnNlcnZpY2UtPmJ1bGtfdHgsIDEpOworCX0KKwlzdGF0ZS0+ZGVmZXJyZWRfYnVsa3MgPSAwOworfQorCitzdGF0aWMgaW50CitwYXJzZV9vcGVuKFZDSElRX1NUQVRFX1QgKnN0YXRlLCBWQ0hJUV9IRUFERVJfVCAqaGVhZGVyKQoreworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IE5VTEw7CisJaW50IG1zZ2lkLCBzaXplOworCWludCB0eXBlOworCXVuc2lnbmVkIGludCBsb2NhbHBvcnQsIHJlbW90ZXBvcnQ7CisKKwltc2dpZCA9IGhlYWRlci0+bXNnaWQ7CisJc2l6ZSA9IGhlYWRlci0+c2l6ZTsKKwl0eXBlID0gVkNISVFfTVNHX1RZUEUobXNnaWQpOworCWxvY2FscG9ydCA9IFZDSElRX01TR19EU1RQT1JUKG1zZ2lkKTsKKwlyZW1vdGVwb3J0ID0gVkNISVFfTVNHX1NSQ1BPUlQobXNnaWQpOworCWlmIChzaXplID49IHNpemVvZihzdHJ1Y3QgdmNoaXFfb3Blbl9wYXlsb2FkKSkgeworCQljb25zdCBzdHJ1Y3QgdmNoaXFfb3Blbl9wYXlsb2FkICpwYXlsb2FkID0KKwkJCShzdHJ1Y3QgdmNoaXFfb3Blbl9wYXlsb2FkICopaGVhZGVyLT5kYXRhOworCQl1bnNpZ25lZCBpbnQgZm91cmNjOworCisJCWZvdXJjYyA9IHBheWxvYWQtPmZvdXJjYzsKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkiJWQ6IHBycyBPUEVOQCV4ICglZC0+JyVjJWMlYyVjJykiLAorCQkJc3RhdGUtPmlkLCAodW5zaWduZWQgaW50KWhlYWRlciwKKwkJCWxvY2FscG9ydCwKKwkJCVZDSElRX0ZPVVJDQ19BU180Q0hBUlMoZm91cmNjKSk7CisKKwkJc2VydmljZSA9IGdldF9saXN0ZW5pbmdfc2VydmljZShzdGF0ZSwgZm91cmNjKTsKKworCQlpZiAoc2VydmljZSkgeworCQkJLyogQSBtYXRjaGluZyBzZXJ2aWNlIGV4aXN0cyAqLworCQkJc2hvcnQgdmVyc2lvbiA9IHBheWxvYWQtPnZlcnNpb247CisJCQlzaG9ydCB2ZXJzaW9uX21pbiA9IHBheWxvYWQtPnZlcnNpb25fbWluOworCQkJaWYgKChzZXJ2aWNlLT52ZXJzaW9uIDwgdmVyc2lvbl9taW4pIHx8CisJCQkJKHZlcnNpb24gPCBzZXJ2aWNlLT52ZXJzaW9uX21pbikpIHsKKwkJCQkvKiBWZXJzaW9uIG1pc21hdGNoICovCisJCQkJdmNoaXFfbG91ZF9lcnJvcl9oZWFkZXIoKTsKKwkJCQl2Y2hpcV9sb3VkX2Vycm9yKCIlZDogc2VydmljZSAlZCAoJWMlYyVjJWMpICIKKwkJCQkJInZlcnNpb24gbWlzbWF0Y2ggLSBsb2NhbCAoJWQsIG1pbiAlZCkiCisJCQkJCSIgdnMuIHJlbW90ZSAoJWQsIG1pbiAlZCkiLAorCQkJCQlzdGF0ZS0+aWQsIHNlcnZpY2UtPmxvY2FscG9ydCwKKwkJCQkJVkNISVFfRk9VUkNDX0FTXzRDSEFSUyhmb3VyY2MpLAorCQkJCQlzZXJ2aWNlLT52ZXJzaW9uLCBzZXJ2aWNlLT52ZXJzaW9uX21pbiwKKwkJCQkJdmVyc2lvbiwgdmVyc2lvbl9taW4pOworCQkJCXZjaGlxX2xvdWRfZXJyb3JfZm9vdGVyKCk7CisJCQkJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisJCQkJc2VydmljZSA9IE5VTEw7CisJCQkJZ290byBmYWlsX29wZW47CisJCQl9CisJCQlzZXJ2aWNlLT5wZWVyX3ZlcnNpb24gPSB2ZXJzaW9uOworCisJCQlpZiAoc2VydmljZS0+c3J2c3RhdGUgPT0gVkNISVFfU1JWU1RBVEVfTElTVEVOSU5HKSB7CisJCQkJc3RydWN0IHZjaGlxX29wZW5hY2tfcGF5bG9hZCBhY2tfcGF5bG9hZCA9IHsKKwkJCQkJc2VydmljZS0+dmVyc2lvbgorCQkJCX07CisJCQkJVkNISVFfRUxFTUVOVF9UIGJvZHkgPSB7CisJCQkJCSZhY2tfcGF5bG9hZCwKKwkJCQkJc2l6ZW9mKGFja19wYXlsb2FkKQorCQkJCX07CisKKwkJCQlpZiAoc3RhdGUtPnZlcnNpb25fY29tbW9uIDwKKwkJCQkgICAgVkNISVFfVkVSU0lPTl9TWU5DSFJPTk9VU19NT0RFKQorCQkJCQlzZXJ2aWNlLT5zeW5jID0gMDsKKworCQkJCS8qIEFja25vd2xlZGdlIHRoZSBPUEVOICovCisJCQkJaWYgKHNlcnZpY2UtPnN5bmMgJiYKKwkJCQkgICAgKHN0YXRlLT52ZXJzaW9uX2NvbW1vbiA+PQorCQkJCSAgICAgVkNISVFfVkVSU0lPTl9TWU5DSFJPTk9VU19NT0RFKSkgeworCQkJCQlpZiAocXVldWVfbWVzc2FnZV9zeW5jKHN0YXRlLCBOVUxMLAorCQkJCQkJVkNISVFfTUFLRV9NU0coCisJCQkJCQkJVkNISVFfTVNHX09QRU5BQ0ssCisJCQkJCQkJc2VydmljZS0+bG9jYWxwb3J0LAorCQkJCQkJCXJlbW90ZXBvcnQpLAorCQkJCQkJJmJvZHksIDEsIHNpemVvZihhY2tfcGF5bG9hZCksCisJCQkJCQkwKSA9PSBWQ0hJUV9SRVRSWSkKKwkJCQkJCWdvdG8gYmFpbF9ub3RfcmVhZHk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHF1ZXVlX21lc3NhZ2Uoc3RhdGUsIE5VTEwsCisJCQkJCQlWQ0hJUV9NQUtFX01TRygKKwkJCQkJCQlWQ0hJUV9NU0dfT1BFTkFDSywKKwkJCQkJCQlzZXJ2aWNlLT5sb2NhbHBvcnQsCisJCQkJCQkJcmVtb3RlcG9ydCksCisJCQkJCQkmYm9keSwgMSwgc2l6ZW9mKGFja19wYXlsb2FkKSwKKwkJCQkJCTApID09IFZDSElRX1JFVFJZKQorCQkJCQkJZ290byBiYWlsX25vdF9yZWFkeTsKKwkJCQl9CisKKwkJCQkvKiBUaGUgc2VydmljZSBpcyBub3cgb3BlbiAqLworCQkJCXZjaGlxX3NldF9zZXJ2aWNlX3N0YXRlKHNlcnZpY2UsCisJCQkJCXNlcnZpY2UtPnN5bmMgPyBWQ0hJUV9TUlZTVEFURV9PUEVOU1lOQworCQkJCQk6IFZDSElRX1NSVlNUQVRFX09QRU4pOworCQkJfQorCisJCQlzZXJ2aWNlLT5yZW1vdGVwb3J0ID0gcmVtb3RlcG9ydDsKKwkJCXNlcnZpY2UtPmNsaWVudF9pZCA9ICgoaW50ICopaGVhZGVyLT5kYXRhKVsxXTsKKwkJCWlmIChtYWtlX3NlcnZpY2VfY2FsbGJhY2soc2VydmljZSwgVkNISVFfU0VSVklDRV9PUEVORUQsCisJCQkJTlVMTCwgTlVMTCkgPT0gVkNISVFfUkVUUlkpIHsKKwkJCQkvKiBCYWlsIG91dCBpZiBub3QgcmVhZHkgKi8KKwkJCQlzZXJ2aWNlLT5yZW1vdGVwb3J0ID0gVkNISVFfUE9SVF9GUkVFOworCQkJCWdvdG8gYmFpbF9ub3RfcmVhZHk7CisJCQl9CisKKwkJCS8qIFN1Y2Nlc3MgLSB0aGUgbWVzc2FnZSBoYXMgYmVlbiBkZWFsdCB3aXRoICovCisJCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCitmYWlsX29wZW46CisJLyogTm8gYXZhaWxhYmxlIHNlcnZpY2UsIG9yIGFuIGludmFsaWQgcmVxdWVzdCAtIHNlbmQgYSBDTE9TRSAqLworCWlmIChxdWV1ZV9tZXNzYWdlKHN0YXRlLCBOVUxMLAorCQlWQ0hJUV9NQUtFX01TRyhWQ0hJUV9NU0dfQ0xPU0UsIDAsIFZDSElRX01TR19TUkNQT1JUKG1zZ2lkKSksCisJCU5VTEwsIDAsIDAsIDApID09IFZDSElRX1JFVFJZKQorCQlnb3RvIGJhaWxfbm90X3JlYWR5OworCisJcmV0dXJuIDE7CisKK2JhaWxfbm90X3JlYWR5OgorCWlmIChzZXJ2aWNlKQorCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKworCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgYnkgdGhlIHNsb3QgaGFuZGxlciB0aHJlYWQgKi8KK3N0YXRpYyB2b2lkCitwYXJzZV9yeF9zbG90cyhWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKKwlWQ0hJUV9TSEFSRURfU1RBVEVfVCAqcmVtb3RlID0gc3RhdGUtPnJlbW90ZTsKKwlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UgPSBOVUxMOworCWludCB0eF9wb3M7CisJREVCVUdfSU5JVElBTElTRShzdGF0ZS0+bG9jYWwpCisKKwl0eF9wb3MgPSByZW1vdGUtPnR4X3BvczsKKworCXdoaWxlIChzdGF0ZS0+cnhfcG9zICE9IHR4X3BvcykgeworCQlWQ0hJUV9IRUFERVJfVCAqaGVhZGVyOworCQlpbnQgbXNnaWQsIHNpemU7CisJCWludCB0eXBlOworCQl1bnNpZ25lZCBpbnQgbG9jYWxwb3J0LCByZW1vdGVwb3J0OworCisJCURFQlVHX1RSQUNFKFBBUlNFX0xJTkUpOworCQlpZiAoIXN0YXRlLT5yeF9kYXRhKSB7CisJCQlpbnQgcnhfaW5kZXg7CisJCQlXQVJOX09OKCEoKHN0YXRlLT5yeF9wb3MgJiBWQ0hJUV9TTE9UX01BU0spID09IDApKTsKKwkJCXJ4X2luZGV4ID0gcmVtb3RlLT5zbG90X3F1ZXVlWworCQkJCVNMT1RfUVVFVUVfSU5ERVhfRlJPTV9QT1Moc3RhdGUtPnJ4X3BvcykgJgorCQkJCVZDSElRX1NMT1RfUVVFVUVfTUFTS107CisJCQlzdGF0ZS0+cnhfZGF0YSA9IChjaGFyICopU0xPVF9EQVRBX0ZST01fSU5ERVgoc3RhdGUsCisJCQkJcnhfaW5kZXgpOworCQkJc3RhdGUtPnJ4X2luZm8gPSBTTE9UX0lORk9fRlJPTV9JTkRFWChzdGF0ZSwgcnhfaW5kZXgpOworCisJCQkvKiBJbml0aWFsaXNlIHVzZV9jb3VudCB0byBvbmUsIGFuZCBpbmNyZW1lbnQKKwkJCSoqIHJlbGVhc2VfY291bnQgYXQgdGhlIGVuZCBvZiB0aGUgc2xvdCB0byBhdm9pZAorCQkJKiogcmVsZWFzaW5nIHRoZSBzbG90IHByZW1hdHVyZWx5LiAqLworCQkJc3RhdGUtPnJ4X2luZm8tPnVzZV9jb3VudCA9IDE7CisJCQlzdGF0ZS0+cnhfaW5mby0+cmVsZWFzZV9jb3VudCA9IDA7CisJCX0KKworCQloZWFkZXIgPSAoVkNISVFfSEVBREVSX1QgKikoc3RhdGUtPnJ4X2RhdGEgKworCQkJKHN0YXRlLT5yeF9wb3MgJiBWQ0hJUV9TTE9UX01BU0spKTsKKwkJREVCVUdfVkFMVUUoUEFSU0VfSEVBREVSLCAoaW50KWhlYWRlcik7CisJCW1zZ2lkID0gaGVhZGVyLT5tc2dpZDsKKwkJREVCVUdfVkFMVUUoUEFSU0VfTVNHSUQsIG1zZ2lkKTsKKwkJc2l6ZSA9IGhlYWRlci0+c2l6ZTsKKwkJdHlwZSA9IFZDSElRX01TR19UWVBFKG1zZ2lkKTsKKwkJbG9jYWxwb3J0ID0gVkNISVFfTVNHX0RTVFBPUlQobXNnaWQpOworCQlyZW1vdGVwb3J0ID0gVkNISVFfTVNHX1NSQ1BPUlQobXNnaWQpOworCisJCWlmICh0eXBlICE9IFZDSElRX01TR19EQVRBKQorCQkJVkNISVFfU1RBVFNfSU5DKHN0YXRlLCBjdHJsX3J4X2NvdW50KTsKKworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBWQ0hJUV9NU0dfT1BFTkFDSzoKKwkJY2FzZSBWQ0hJUV9NU0dfQ0xPU0U6CisJCWNhc2UgVkNISVFfTVNHX0RBVEE6CisJCWNhc2UgVkNISVFfTVNHX0JVTEtfUlg6CisJCWNhc2UgVkNISVFfTVNHX0JVTEtfVFg6CisJCWNhc2UgVkNISVFfTVNHX0JVTEtfUlhfRE9ORToKKwkJY2FzZSBWQ0hJUV9NU0dfQlVMS19UWF9ET05FOgorCQkJc2VydmljZSA9IGZpbmRfc2VydmljZV9ieV9wb3J0KHN0YXRlLCBsb2NhbHBvcnQpOworCQkJaWYgKCghc2VydmljZSB8fAorCQkJICAgICAoKHNlcnZpY2UtPnJlbW90ZXBvcnQgIT0gcmVtb3RlcG9ydCkgJiYKKwkJCSAgICAgIChzZXJ2aWNlLT5yZW1vdGVwb3J0ICE9IFZDSElRX1BPUlRfRlJFRSkpKSAmJgorCQkJICAgIChsb2NhbHBvcnQgPT0gMCkgJiYKKwkJCSAgICAodHlwZSA9PSBWQ0hJUV9NU0dfQ0xPU0UpKSB7CisJCQkJLyogVGhpcyBjb3VsZCBiZSBhIENMT1NFIGZyb20gYSBjbGllbnQgd2hpY2gKKwkJCQkgICBoYWRuJ3QgeWV0IHJlY2VpdmVkIHRoZSBPUEVOQUNLIC0gbG9vayBmb3IKKwkJCQkgICB0aGUgY29ubmVjdGVkIHNlcnZpY2UgKi8KKwkJCQlpZiAoc2VydmljZSkKKwkJCQkJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisJCQkJc2VydmljZSA9IGdldF9jb25uZWN0ZWRfc2VydmljZShzdGF0ZSwKKwkJCQkJcmVtb3RlcG9ydCk7CisJCQkJaWYgKHNlcnZpY2UpCisJCQkJCXZjaGlxX2xvZ193YXJuaW5nKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCQkJIiVkOiBwcnMgJXNAJXggKCVkLT4lZCkgLSAiCisJCQkJCQkiZm91bmQgY29ubmVjdGVkIHNlcnZpY2UgJWQiLAorCQkJCQkJc3RhdGUtPmlkLCBtc2dfdHlwZV9zdHIodHlwZSksCisJCQkJCQkodW5zaWduZWQgaW50KWhlYWRlciwKKwkJCQkJCXJlbW90ZXBvcnQsIGxvY2FscG9ydCwKKwkJCQkJCXNlcnZpY2UtPmxvY2FscG9ydCk7CisJCQl9CisKKwkJCWlmICghc2VydmljZSkgeworCQkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkJIiVkOiBwcnMgJXNAJXggKCVkLT4lZCkgLSAiCisJCQkJCSJpbnZhbGlkL2Nsb3NlZCBzZXJ2aWNlICVkIiwKKwkJCQkJc3RhdGUtPmlkLCBtc2dfdHlwZV9zdHIodHlwZSksCisJCQkJCSh1bnNpZ25lZCBpbnQpaGVhZGVyLAorCQkJCQlyZW1vdGVwb3J0LCBsb2NhbHBvcnQsIGxvY2FscG9ydCk7CisJCQkJZ290byBza2lwX21lc3NhZ2U7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKFNSVlRSQUNFX0VOQUJMRUQoc2VydmljZSwgVkNISVFfTE9HX0lORk8pKSB7CisJCQlpbnQgc3ZjX2ZvdXJjYzsKKworCQkJc3ZjX2ZvdXJjYyA9IHNlcnZpY2UKKwkJCQk/IHNlcnZpY2UtPmJhc2UuZm91cmNjCisJCQkJOiBWQ0hJUV9NQUtFX0ZPVVJDQygnPycsICc/JywgJz8nLCAnPycpOworCQkJdmNoaXFfbG9nX2luZm8oU1JWVFJBQ0VfTEVWRUwoc2VydmljZSksCisJCQkJIlJjdmQgTXNnICVzKCV1KSBmcm9tICVjJWMlYyVjIHM6JWQgZDolZCAiCisJCQkJImxlbjolZCIsCisJCQkJbXNnX3R5cGVfc3RyKHR5cGUpLCB0eXBlLAorCQkJCVZDSElRX0ZPVVJDQ19BU180Q0hBUlMoc3ZjX2ZvdXJjYyksCisJCQkJcmVtb3RlcG9ydCwgbG9jYWxwb3J0LCBzaXplKTsKKwkJCWlmIChzaXplID4gMCkKKwkJCQl2Y2hpcV9sb2dfZHVtcF9tZW0oIlJjdmQiLCAwLCBoZWFkZXItPmRhdGEsCisJCQkJCW1pbig2NCwgc2l6ZSkpOworCQl9CisKKwkJaWYgKCgodW5zaWduZWQgaW50KWhlYWRlciAmIFZDSElRX1NMT1RfTUFTSykgKyBjYWxjX3N0cmlkZShzaXplKQorCQkJPiBWQ0hJUV9TTE9UX1NJWkUpIHsKKwkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkiaGVhZGVyICV4IChtc2dpZCAleCkgLSBzaXplICV4IHRvbyBiaWcgZm9yICIKKwkJCQkic2xvdCIsCisJCQkJKHVuc2lnbmVkIGludCloZWFkZXIsICh1bnNpZ25lZCBpbnQpbXNnaWQsCisJCQkJKHVuc2lnbmVkIGludClzaXplKTsKKwkJCVdBUk4oMSwgIm92ZXJzaXplZCBmb3Igc2xvdFxuIik7CisJCX0KKworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBWQ0hJUV9NU0dfT1BFTjoKKwkJCVdBUk5fT04oIShWQ0hJUV9NU0dfRFNUUE9SVChtc2dpZCkgPT0gMCkpOworCQkJaWYgKCFwYXJzZV9vcGVuKHN0YXRlLCBoZWFkZXIpKQorCQkJCWdvdG8gYmFpbF9ub3RfcmVhZHk7CisJCQlicmVhazsKKwkJY2FzZSBWQ0hJUV9NU0dfT1BFTkFDSzoKKwkJCWlmIChzaXplID49IHNpemVvZihzdHJ1Y3QgdmNoaXFfb3BlbmFja19wYXlsb2FkKSkgeworCQkJCWNvbnN0IHN0cnVjdCB2Y2hpcV9vcGVuYWNrX3BheWxvYWQgKnBheWxvYWQgPQorCQkJCQkoc3RydWN0IHZjaGlxX29wZW5hY2tfcGF5bG9hZCAqKQorCQkJCQloZWFkZXItPmRhdGE7CisJCQkJc2VydmljZS0+cGVlcl92ZXJzaW9uID0gcGF5bG9hZC0+dmVyc2lvbjsKKwkJCX0KKwkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCSIlZDogcHJzIE9QRU5BQ0tAJXgsJXggKCVkLT4lZCkgdjolZCIsCisJCQkJc3RhdGUtPmlkLCAodW5zaWduZWQgaW50KWhlYWRlciwgc2l6ZSwKKwkJCQlyZW1vdGVwb3J0LCBsb2NhbHBvcnQsIHNlcnZpY2UtPnBlZXJfdmVyc2lvbik7CisJCQlpZiAoc2VydmljZS0+c3J2c3RhdGUgPT0KKwkJCQlWQ0hJUV9TUlZTVEFURV9PUEVOSU5HKSB7CisJCQkJc2VydmljZS0+cmVtb3RlcG9ydCA9IHJlbW90ZXBvcnQ7CisJCQkJdmNoaXFfc2V0X3NlcnZpY2Vfc3RhdGUoc2VydmljZSwKKwkJCQkJVkNISVFfU1JWU1RBVEVfT1BFTik7CisJCQkJdXAoJnNlcnZpY2UtPnJlbW92ZV9ldmVudCk7CisJCQl9IGVsc2UKKwkJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJCSJPUEVOQUNLIHJlY2VpdmVkIGluIHN0YXRlICVzIiwKKwkJCQkJc3J2c3RhdGVfbmFtZXNbc2VydmljZS0+c3J2c3RhdGVdKTsKKwkJCWJyZWFrOworCQljYXNlIFZDSElRX01TR19DTE9TRToKKwkJCVdBUk5fT04oc2l6ZSAhPSAwKTsgLyogVGhlcmUgc2hvdWxkIGJlIG5vIGRhdGEgKi8KKworCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJIiVkOiBwcnMgQ0xPU0VAJXggKCVkLT4lZCkiLAorCQkJCXN0YXRlLT5pZCwgKHVuc2lnbmVkIGludCloZWFkZXIsCisJCQkJcmVtb3RlcG9ydCwgbG9jYWxwb3J0KTsKKworCQkJbWFya19zZXJ2aWNlX2Nsb3NpbmdfaW50ZXJuYWwoc2VydmljZSwgMSk7CisKKwkJCWlmICh2Y2hpcV9jbG9zZV9zZXJ2aWNlX2ludGVybmFsKHNlcnZpY2UsCisJCQkJMS8qY2xvc2VfcmVjdmQqLykgPT0gVkNISVFfUkVUUlkpCisJCQkJZ290byBiYWlsX25vdF9yZWFkeTsKKworCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJIkNsb3NlIFNlcnZpY2UgJWMlYyVjJWMgczoldSBkOiVkIiwKKwkJCQlWQ0hJUV9GT1VSQ0NfQVNfNENIQVJTKHNlcnZpY2UtPmJhc2UuZm91cmNjKSwKKwkJCQlzZXJ2aWNlLT5sb2NhbHBvcnQsCisJCQkJc2VydmljZS0+cmVtb3RlcG9ydCk7CisJCQlicmVhazsKKwkJY2FzZSBWQ0hJUV9NU0dfREFUQToKKwkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCSIlZDogcHJzIERBVEFAJXgsJXggKCVkLT4lZCkiLAorCQkJCXN0YXRlLT5pZCwgKHVuc2lnbmVkIGludCloZWFkZXIsIHNpemUsCisJCQkJcmVtb3RlcG9ydCwgbG9jYWxwb3J0KTsKKworCQkJaWYgKChzZXJ2aWNlLT5yZW1vdGVwb3J0ID09IHJlbW90ZXBvcnQpCisJCQkJJiYgKHNlcnZpY2UtPnNydnN0YXRlID09CisJCQkJVkNISVFfU1JWU1RBVEVfT1BFTikpIHsKKwkJCQloZWFkZXItPm1zZ2lkID0gbXNnaWQgfCBWQ0hJUV9NU0dJRF9DTEFJTUVEOworCQkJCWNsYWltX3Nsb3Qoc3RhdGUtPnJ4X2luZm8pOworCQkJCURFQlVHX1RSQUNFKFBBUlNFX0xJTkUpOworCQkJCWlmIChtYWtlX3NlcnZpY2VfY2FsbGJhY2soc2VydmljZSwKKwkJCQkJVkNISVFfTUVTU0FHRV9BVkFJTEFCTEUsIGhlYWRlciwKKwkJCQkJTlVMTCkgPT0gVkNISVFfUkVUUlkpIHsKKwkJCQkJREVCVUdfVFJBQ0UoUEFSU0VfTElORSk7CisJCQkJCWdvdG8gYmFpbF9ub3RfcmVhZHk7CisJCQkJfQorCQkJCVZDSElRX1NFUlZJQ0VfU1RBVFNfSU5DKHNlcnZpY2UsIGN0cmxfcnhfY291bnQpOworCQkJCVZDSElRX1NFUlZJQ0VfU1RBVFNfQUREKHNlcnZpY2UsIGN0cmxfcnhfYnl0ZXMsCisJCQkJCXNpemUpOworCQkJfSBlbHNlIHsKKwkJCQlWQ0hJUV9TVEFUU19JTkMoc3RhdGUsIGVycm9yX2NvdW50KTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFZDSElRX01TR19DT05ORUNUOgorCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJIiVkOiBwcnMgQ09OTkVDVEAleCIsCisJCQkJc3RhdGUtPmlkLCAodW5zaWduZWQgaW50KWhlYWRlcik7CisJCQlzdGF0ZS0+dmVyc2lvbl9jb21tb24gPSAoKFZDSElRX1NMT1RfWkVST19UICopCisJCQkJCQkgc3RhdGUtPnNsb3RfZGF0YSktPnZlcnNpb247CisJCQl1cCgmc3RhdGUtPmNvbm5lY3QpOworCQkJYnJlYWs7CisJCWNhc2UgVkNISVFfTVNHX0JVTEtfUlg6CisJCWNhc2UgVkNISVFfTVNHX0JVTEtfVFg6IHsKKwkJCVZDSElRX0JVTEtfUVVFVUVfVCAqcXVldWU7CisJCQlXQVJOX09OKCFzdGF0ZS0+aXNfbWFzdGVyKTsKKwkJCXF1ZXVlID0gKHR5cGUgPT0gVkNISVFfTVNHX0JVTEtfUlgpID8KKwkJCQkmc2VydmljZS0+YnVsa190eCA6ICZzZXJ2aWNlLT5idWxrX3J4OworCQkJaWYgKChzZXJ2aWNlLT5yZW1vdGVwb3J0ID09IHJlbW90ZXBvcnQpCisJCQkJJiYgKHNlcnZpY2UtPnNydnN0YXRlID09CisJCQkJVkNISVFfU1JWU1RBVEVfT1BFTikpIHsKKwkJCQlWQ0hJUV9CVUxLX1QgKmJ1bGs7CisJCQkJaW50IHJlc29sdmVkID0gMDsKKworCQkJCURFQlVHX1RSQUNFKFBBUlNFX0xJTkUpOworCQkJCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoCisJCQkJCSZzZXJ2aWNlLT5idWxrX211dGV4KSAhPSAwKSB7CisJCQkJCURFQlVHX1RSQUNFKFBBUlNFX0xJTkUpOworCQkJCQlnb3RvIGJhaWxfbm90X3JlYWR5OworCQkJCX0KKworCQkJCVdBUk5fT04oIShxdWV1ZS0+cmVtb3RlX2luc2VydCA8IHF1ZXVlLT5yZW1vdmUgKworCQkJCQlWQ0hJUV9OVU1fU0VSVklDRV9CVUxLUykpOworCQkJCWJ1bGsgPSAmcXVldWUtPmJ1bGtzWworCQkJCQlCVUxLX0lOREVYKHF1ZXVlLT5yZW1vdGVfaW5zZXJ0KV07CisJCQkJYnVsay0+cmVtb3RlX2RhdGEgPQorCQkJCQkodm9pZCAqKSgoaW50ICopaGVhZGVyLT5kYXRhKVswXTsKKwkJCQlidWxrLT5yZW1vdGVfc2l6ZSA9ICgoaW50ICopaGVhZGVyLT5kYXRhKVsxXTsKKwkJCQl3bWIoKTsKKworCQkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCQkiJWQ6IHBycyAlc0AleCAoJWQtPiVkKSAleEAleCIsCisJCQkJCXN0YXRlLT5pZCwgbXNnX3R5cGVfc3RyKHR5cGUpLAorCQkJCQkodW5zaWduZWQgaW50KWhlYWRlciwKKwkJCQkJcmVtb3RlcG9ydCwgbG9jYWxwb3J0LAorCQkJCQlidWxrLT5yZW1vdGVfc2l6ZSwKKwkJCQkJKHVuc2lnbmVkIGludClidWxrLT5yZW1vdGVfZGF0YSk7CisKKwkJCQlxdWV1ZS0+cmVtb3RlX2luc2VydCsrOworCisJCQkJaWYgKGF0b21pY19yZWFkKCZwYXVzZV9idWxrc19jb3VudCkpIHsKKwkJCQkJc3RhdGUtPmRlZmVycmVkX2J1bGtzKys7CisJCQkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCQkJIiVzOiBkZWZlcnJpbmcgYnVsayAoJWQpIiwKKwkJCQkJCV9fZnVuY19fLAorCQkJCQkJc3RhdGUtPmRlZmVycmVkX2J1bGtzKTsKKwkJCQkJaWYgKHN0YXRlLT5jb25uX3N0YXRlICE9CisJCQkJCQlWQ0hJUV9DT05OU1RBVEVfUEFVU0VfU0VOVCkKKwkJCQkJCXZjaGlxX2xvZ19lcnJvcigKKwkJCQkJCQl2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkJCQkiJXM6IGJ1bGtzIHBhdXNlZCBpbiAiCisJCQkJCQkJInVuZXhwZWN0ZWQgc3RhdGUgJXMiLAorCQkJCQkJCV9fZnVuY19fLAorCQkJCQkJCWNvbm5fc3RhdGVfbmFtZXNbCisJCQkJCQkJc3RhdGUtPmNvbm5fc3RhdGVdKTsKKwkJCQl9IGVsc2UgaWYgKHN0YXRlLT5jb25uX3N0YXRlID09CisJCQkJCVZDSElRX0NPTk5TVEFURV9DT05ORUNURUQpIHsKKwkJCQkJREVCVUdfVFJBQ0UoUEFSU0VfTElORSk7CisJCQkJCXJlc29sdmVkID0gcmVzb2x2ZV9idWxrcyhzZXJ2aWNlLAorCQkJCQkJcXVldWUpOworCQkJCX0KKworCQkJCW11dGV4X3VubG9jaygmc2VydmljZS0+YnVsa19tdXRleCk7CisJCQkJaWYgKHJlc29sdmVkKQorCQkJCQlub3RpZnlfYnVsa3Moc2VydmljZSwgcXVldWUsCisJCQkJCQkxLypyZXRyeV9wb2xsKi8pOworCQkJfQorCQl9IGJyZWFrOworCQljYXNlIFZDSElRX01TR19CVUxLX1JYX0RPTkU6CisJCWNhc2UgVkNISVFfTVNHX0JVTEtfVFhfRE9ORToKKwkJCVdBUk5fT04oc3RhdGUtPmlzX21hc3Rlcik7CisJCQlpZiAoKHNlcnZpY2UtPnJlbW90ZXBvcnQgPT0gcmVtb3RlcG9ydCkKKwkJCQkmJiAoc2VydmljZS0+c3J2c3RhdGUgIT0KKwkJCQlWQ0hJUV9TUlZTVEFURV9GUkVFKSkgeworCQkJCVZDSElRX0JVTEtfUVVFVUVfVCAqcXVldWU7CisJCQkJVkNISVFfQlVMS19UICpidWxrOworCisJCQkJcXVldWUgPSAodHlwZSA9PSBWQ0hJUV9NU0dfQlVMS19SWF9ET05FKSA/CisJCQkJCSZzZXJ2aWNlLT5idWxrX3J4IDogJnNlcnZpY2UtPmJ1bGtfdHg7CisKKwkJCQlERUJVR19UUkFDRShQQVJTRV9MSU5FKTsKKwkJCQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKAorCQkJCQkmc2VydmljZS0+YnVsa19tdXRleCkgIT0gMCkgeworCQkJCQlERUJVR19UUkFDRShQQVJTRV9MSU5FKTsKKwkJCQkJZ290byBiYWlsX25vdF9yZWFkeTsKKwkJCQl9CisJCQkJaWYgKChpbnQpKHF1ZXVlLT5yZW1vdGVfaW5zZXJ0IC0KKwkJCQkJcXVldWUtPmxvY2FsX2luc2VydCkgPj0gMCkgeworCQkJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJCQkiJWQ6IHBycyAlc0AleCAoJWQtPiVkKSAiCisJCQkJCQkidW5leHBlY3RlZCAocmk9JWQsbGk9JWQpIiwKKwkJCQkJCXN0YXRlLT5pZCwgbXNnX3R5cGVfc3RyKHR5cGUpLAorCQkJCQkJKHVuc2lnbmVkIGludCloZWFkZXIsCisJCQkJCQlyZW1vdGVwb3J0LCBsb2NhbHBvcnQsCisJCQkJCQlxdWV1ZS0+cmVtb3RlX2luc2VydCwKKwkJCQkJCXF1ZXVlLT5sb2NhbF9pbnNlcnQpOworCQkJCQltdXRleF91bmxvY2soJnNlcnZpY2UtPmJ1bGtfbXV0ZXgpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlCVUdfT04ocXVldWUtPnByb2Nlc3MgPT0gcXVldWUtPmxvY2FsX2luc2VydCk7CisJCQkJQlVHX09OKHF1ZXVlLT5wcm9jZXNzICE9IHF1ZXVlLT5yZW1vdGVfaW5zZXJ0KTsKKworCQkJCWJ1bGsgPSAmcXVldWUtPmJ1bGtzWworCQkJCQlCVUxLX0lOREVYKHF1ZXVlLT5yZW1vdGVfaW5zZXJ0KV07CisJCQkJYnVsay0+YWN0dWFsID0gKihpbnQgKiloZWFkZXItPmRhdGE7CisJCQkJcXVldWUtPnJlbW90ZV9pbnNlcnQrKzsKKworCQkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCQkiJWQ6IHBycyAlc0AleCAoJWQtPiVkKSAleEAleCIsCisJCQkJCXN0YXRlLT5pZCwgbXNnX3R5cGVfc3RyKHR5cGUpLAorCQkJCQkodW5zaWduZWQgaW50KWhlYWRlciwKKwkJCQkJcmVtb3RlcG9ydCwgbG9jYWxwb3J0LAorCQkJCQlidWxrLT5hY3R1YWwsICh1bnNpZ25lZCBpbnQpYnVsay0+ZGF0YSk7CisKKwkJCQl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJCSIlZDogcHJzOiVkICVjeCBsaT0leCByaT0leCBwPSV4IiwKKwkJCQkJc3RhdGUtPmlkLCBsb2NhbHBvcnQsCisJCQkJCSh0eXBlID09IFZDSElRX01TR19CVUxLX1JYX0RPTkUpID8KKwkJCQkJCSdyJyA6ICd0JywKKwkJCQkJcXVldWUtPmxvY2FsX2luc2VydCwKKwkJCQkJcXVldWUtPnJlbW90ZV9pbnNlcnQsIHF1ZXVlLT5wcm9jZXNzKTsKKworCQkJCURFQlVHX1RSQUNFKFBBUlNFX0xJTkUpOworCQkJCVdBUk5fT04ocXVldWUtPnByb2Nlc3MgPT0gcXVldWUtPmxvY2FsX2luc2VydCk7CisJCQkJdmNoaXFfY29tcGxldGVfYnVsayhidWxrKTsKKwkJCQlxdWV1ZS0+cHJvY2VzcysrOworCQkJCW11dGV4X3VubG9jaygmc2VydmljZS0+YnVsa19tdXRleCk7CisJCQkJREVCVUdfVFJBQ0UoUEFSU0VfTElORSk7CisJCQkJbm90aWZ5X2J1bGtzKHNlcnZpY2UsIHF1ZXVlLCAxLypyZXRyeV9wb2xsKi8pOworCQkJCURFQlVHX1RSQUNFKFBBUlNFX0xJTkUpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVkNISVFfTVNHX1BBRERJTkc6CisJCQl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJIiVkOiBwcnMgUEFERElOR0AleCwleCIsCisJCQkJc3RhdGUtPmlkLCAodW5zaWduZWQgaW50KWhlYWRlciwgc2l6ZSk7CisJCQlicmVhazsKKwkJY2FzZSBWQ0hJUV9NU0dfUEFVU0U6CisJCQkvKiBJZiBpbml0aWF0ZWQsIHNpZ25hbCB0aGUgYXBwbGljYXRpb24gdGhyZWFkICovCisJCQl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJIiVkOiBwcnMgUEFVU0VAJXgsJXgiLAorCQkJCXN0YXRlLT5pZCwgKHVuc2lnbmVkIGludCloZWFkZXIsIHNpemUpOworCQkJaWYgKHN0YXRlLT5jb25uX3N0YXRlID09IFZDSElRX0NPTk5TVEFURV9QQVVTRUQpIHsKKwkJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJCSIlZDogUEFVU0UgcmVjZWl2ZWQgaW4gc3RhdGUgUEFVU0VEIiwKKwkJCQkJc3RhdGUtPmlkKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzdGF0ZS0+Y29ubl9zdGF0ZSAhPSBWQ0hJUV9DT05OU1RBVEVfUEFVU0VfU0VOVCkgeworCQkJCS8qIFNlbmQgYSBQQVVTRSBpbiByZXNwb25zZSAqLworCQkJCWlmIChxdWV1ZV9tZXNzYWdlKHN0YXRlLCBOVUxMLAorCQkJCQlWQ0hJUV9NQUtFX01TRyhWQ0hJUV9NU0dfUEFVU0UsIDAsIDApLAorCQkJCQlOVUxMLCAwLCAwLCBRTUZMQUdTX05PX01VVEVYX1VOTE9DSykKKwkJCQkgICAgPT0gVkNISVFfUkVUUlkpCisJCQkJCWdvdG8gYmFpbF9ub3RfcmVhZHk7CisJCQkJaWYgKHN0YXRlLT5pc19tYXN0ZXIpCisJCQkJCXBhdXNlX2J1bGtzKHN0YXRlKTsKKwkJCX0KKwkJCS8qIEF0IHRoaXMgcG9pbnQgc2xvdF9tdXRleCBpcyBoZWxkICovCisJCQl2Y2hpcV9zZXRfY29ubl9zdGF0ZShzdGF0ZSwgVkNISVFfQ09OTlNUQVRFX1BBVVNFRCk7CisJCQl2Y2hpcV9wbGF0Zm9ybV9wYXVzZWQoc3RhdGUpOworCQkJYnJlYWs7CisJCWNhc2UgVkNISVFfTVNHX1JFU1VNRToKKwkJCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkiJWQ6IHBycyBSRVNVTUVAJXgsJXgiLAorCQkJCXN0YXRlLT5pZCwgKHVuc2lnbmVkIGludCloZWFkZXIsIHNpemUpOworCQkJLyogUmVsZWFzZSB0aGUgc2xvdCBtdXRleCAqLworCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2xvdF9tdXRleCk7CisJCQlpZiAoc3RhdGUtPmlzX21hc3RlcikKKwkJCQlyZXN1bWVfYnVsa3Moc3RhdGUpOworCQkJdmNoaXFfc2V0X2Nvbm5fc3RhdGUoc3RhdGUsIFZDSElRX0NPTk5TVEFURV9DT05ORUNURUQpOworCQkJdmNoaXFfcGxhdGZvcm1fcmVzdW1lZChzdGF0ZSk7CisJCQlicmVhazsKKworCQljYXNlIFZDSElRX01TR19SRU1PVEVfVVNFOgorCQkJdmNoaXFfb25fcmVtb3RlX3VzZShzdGF0ZSk7CisJCQlicmVhazsKKwkJY2FzZSBWQ0hJUV9NU0dfUkVNT1RFX1JFTEVBU0U6CisJCQl2Y2hpcV9vbl9yZW1vdGVfcmVsZWFzZShzdGF0ZSk7CisJCQlicmVhazsKKwkJY2FzZSBWQ0hJUV9NU0dfUkVNT1RFX1VTRV9BQ1RJVkU6CisJCQl2Y2hpcV9vbl9yZW1vdGVfdXNlX2FjdGl2ZShzdGF0ZSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCSIlZDogcHJzIGludmFsaWQgbXNnaWQgJXhAJXgsJXgiLAorCQkJCXN0YXRlLT5pZCwgbXNnaWQsICh1bnNpZ25lZCBpbnQpaGVhZGVyLCBzaXplKTsKKwkJCVdBUk4oMSwgImludmFsaWQgbWVzc2FnZVxuIik7CisJCQlicmVhazsKKwkJfQorCitza2lwX21lc3NhZ2U6CisJCWlmIChzZXJ2aWNlKSB7CisJCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKwkJCXNlcnZpY2UgPSBOVUxMOworCQl9CisKKwkJc3RhdGUtPnJ4X3BvcyArPSBjYWxjX3N0cmlkZShzaXplKTsKKworCQlERUJVR19UUkFDRShQQVJTRV9MSU5FKTsKKwkJLyogUGVyZm9ybSBzb21lIGhvdXNla2VlcGluZyB3aGVuIHRoZSBlbmQgb2YgdGhlIHNsb3QgaXMKKwkJKiogcmVhY2hlZC4gKi8KKwkJaWYgKChzdGF0ZS0+cnhfcG9zICYgVkNISVFfU0xPVF9NQVNLKSA9PSAwKSB7CisJCQkvKiBSZW1vdmUgdGhlIGV4dHJhIHJlZmVyZW5jZSBjb3VudC4gKi8KKwkJCXJlbGVhc2Vfc2xvdChzdGF0ZSwgc3RhdGUtPnJ4X2luZm8sIE5VTEwsIE5VTEwpOworCQkJc3RhdGUtPnJ4X2RhdGEgPSBOVUxMOworCQl9CisJfQorCitiYWlsX25vdF9yZWFkeToKKwlpZiAoc2VydmljZSkKKwkJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7Cit9CisKKy8qIENhbGxlZCBieSB0aGUgc2xvdCBoYW5kbGVyIHRocmVhZCAqLworc3RhdGljIGludAorc2xvdF9oYW5kbGVyX2Z1bmModm9pZCAqdikKK3sKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZSA9IChWQ0hJUV9TVEFURV9UICopIHY7CisJVkNISVFfU0hBUkVEX1NUQVRFX1QgKmxvY2FsID0gc3RhdGUtPmxvY2FsOworCURFQlVHX0lOSVRJQUxJU0UobG9jYWwpCisKKwl3aGlsZSAoMSkgeworCQlERUJVR19DT1VOVChTTE9UX0hBTkRMRVJfQ09VTlQpOworCQlERUJVR19UUkFDRShTTE9UX0hBTkRMRVJfTElORSk7CisJCXJlbW90ZV9ldmVudF93YWl0KCZsb2NhbC0+dHJpZ2dlcik7CisKKwkJcm1iKCk7CisKKwkJREVCVUdfVFJBQ0UoU0xPVF9IQU5ETEVSX0xJTkUpOworCQlpZiAoc3RhdGUtPnBvbGxfbmVlZGVkKSB7CisJCQkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIHN1c3BlbmQgLSBtYXkgY2hhbmdlIG91cgorCQkJICogY29ubl9zdGF0ZSAqLworCQkJdmNoaXFfcGxhdGZvcm1fY2hlY2tfc3VzcGVuZChzdGF0ZSk7CisKKwkJCXN0YXRlLT5wb2xsX25lZWRlZCA9IDA7CisKKwkJCS8qIEhhbmRsZSBzZXJ2aWNlIHBvbGxpbmcgYW5kIG90aGVyIHJhcmUgY29uZGl0aW9ucyBoZXJlCisJCQkqKiBvdXQgb2YgdGhlIG1haW5saW5lIGNvZGUgKi8KKwkJCXN3aXRjaCAoc3RhdGUtPmNvbm5fc3RhdGUpIHsKKwkJCWNhc2UgVkNISVFfQ09OTlNUQVRFX0NPTk5FQ1RFRDoKKwkJCQkvKiBQb2xsIHRoZSBzZXJ2aWNlcyBhcyByZXF1ZXN0ZWQgKi8KKwkJCQlwb2xsX3NlcnZpY2VzKHN0YXRlKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBWQ0hJUV9DT05OU1RBVEVfUEFVU0lORzoKKwkJCQlpZiAoc3RhdGUtPmlzX21hc3RlcikKKwkJCQkJcGF1c2VfYnVsa3Moc3RhdGUpOworCQkJCWlmIChxdWV1ZV9tZXNzYWdlKHN0YXRlLCBOVUxMLAorCQkJCQlWQ0hJUV9NQUtFX01TRyhWQ0hJUV9NU0dfUEFVU0UsIDAsIDApLAorCQkJCQlOVUxMLCAwLCAwLAorCQkJCQlRTUZMQUdTX05PX01VVEVYX1VOTE9DSykKKwkJCQkgICAgIT0gVkNISVFfUkVUUlkpIHsKKwkJCQkJdmNoaXFfc2V0X2Nvbm5fc3RhdGUoc3RhdGUsCisJCQkJCQlWQ0hJUV9DT05OU1RBVEVfUEFVU0VfU0VOVCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHN0YXRlLT5pc19tYXN0ZXIpCisJCQkJCQlyZXN1bWVfYnVsa3Moc3RhdGUpOworCQkJCQkvKiBSZXRyeSBsYXRlciAqLworCQkJCQlzdGF0ZS0+cG9sbF9uZWVkZWQgPSAxOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBWQ0hJUV9DT05OU1RBVEVfUEFVU0VEOgorCQkJCXZjaGlxX3BsYXRmb3JtX3Jlc3VtZShzdGF0ZSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgVkNISVFfQ09OTlNUQVRFX1JFU1VNSU5HOgorCQkJCWlmIChxdWV1ZV9tZXNzYWdlKHN0YXRlLCBOVUxMLAorCQkJCQlWQ0hJUV9NQUtFX01TRyhWQ0hJUV9NU0dfUkVTVU1FLCAwLCAwKSwKKwkJCQkJTlVMTCwgMCwgMCwgUU1GTEFHU19OT19NVVRFWF9MT0NLKQorCQkJCQkhPSBWQ0hJUV9SRVRSWSkgeworCQkJCQlpZiAoc3RhdGUtPmlzX21hc3RlcikKKwkJCQkJCXJlc3VtZV9idWxrcyhzdGF0ZSk7CisJCQkJCXZjaGlxX3NldF9jb25uX3N0YXRlKHN0YXRlLAorCQkJCQkJVkNISVFfQ09OTlNUQVRFX0NPTk5FQ1RFRCk7CisJCQkJCXZjaGlxX3BsYXRmb3JtX3Jlc3VtZWQoc3RhdGUpOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIFRoaXMgc2hvdWxkIHJlYWxseSBiZSBpbXBvc3NpYmxlLAorCQkJCQkqKiBzaW5jZSB0aGUgUEFVU0Ugc2hvdWxkIGhhdmUgZmx1c2hlZAorCQkJCQkqKiB0aHJvdWdoIG91dHN0YW5kaW5nIG1lc3NhZ2VzLiAqLworCQkJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJCQkiRmFpbGVkIHRvIHNlbmQgUkVTVU1FICIKKwkJCQkJCSJtZXNzYWdlIik7CisJCQkJCUJVRygpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBWQ0hJUV9DT05OU1RBVEVfUEFVU0VfVElNRU9VVDoKKwkJCWNhc2UgVkNISVFfQ09OTlNUQVRFX1JFU1VNRV9USU1FT1VUOgorCQkJCXZjaGlxX3BsYXRmb3JtX2hhbmRsZV90aW1lb3V0KHN0YXRlKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisKKworCQl9CisKKwkJREVCVUdfVFJBQ0UoU0xPVF9IQU5ETEVSX0xJTkUpOworCQlwYXJzZV9yeF9zbG90cyhzdGF0ZSk7CisJfQorCXJldHVybiAwOworfQorCisKKy8qIENhbGxlZCBieSB0aGUgcmVjeWNsZSB0aHJlYWQgKi8KK3N0YXRpYyBpbnQKK3JlY3ljbGVfZnVuYyh2b2lkICp2KQoreworCVZDSElRX1NUQVRFX1QgKnN0YXRlID0gKFZDSElRX1NUQVRFX1QgKikgdjsKKwlWQ0hJUV9TSEFSRURfU1RBVEVfVCAqbG9jYWwgPSBzdGF0ZS0+bG9jYWw7CisKKwl3aGlsZSAoMSkgeworCQlyZW1vdGVfZXZlbnRfd2FpdCgmbG9jYWwtPnJlY3ljbGUpOworCisJCXByb2Nlc3NfZnJlZV9xdWV1ZShzdGF0ZSk7CisJfQorCXJldHVybiAwOworfQorCisKKy8qIENhbGxlZCBieSB0aGUgc3luYyB0aHJlYWQgKi8KK3N0YXRpYyBpbnQKK3N5bmNfZnVuYyh2b2lkICp2KQoreworCVZDSElRX1NUQVRFX1QgKnN0YXRlID0gKFZDSElRX1NUQVRFX1QgKikgdjsKKwlWQ0hJUV9TSEFSRURfU1RBVEVfVCAqbG9jYWwgPSBzdGF0ZS0+bG9jYWw7CisJVkNISVFfSEVBREVSX1QgKmhlYWRlciA9IChWQ0hJUV9IRUFERVJfVCAqKVNMT1RfREFUQV9GUk9NX0lOREVYKHN0YXRlLAorCQlzdGF0ZS0+cmVtb3RlLT5zbG90X3N5bmMpOworCisJd2hpbGUgKDEpIHsKKwkJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlOworCQlpbnQgbXNnaWQsIHNpemU7CisJCWludCB0eXBlOworCQl1bnNpZ25lZCBpbnQgbG9jYWxwb3J0LCByZW1vdGVwb3J0OworCisJCXJlbW90ZV9ldmVudF93YWl0KCZsb2NhbC0+c3luY190cmlnZ2VyKTsKKworCQlybWIoKTsKKworCQltc2dpZCA9IGhlYWRlci0+bXNnaWQ7CisJCXNpemUgPSBoZWFkZXItPnNpemU7CisJCXR5cGUgPSBWQ0hJUV9NU0dfVFlQRShtc2dpZCk7CisJCWxvY2FscG9ydCA9IFZDSElRX01TR19EU1RQT1JUKG1zZ2lkKTsKKwkJcmVtb3RlcG9ydCA9IFZDSElRX01TR19TUkNQT1JUKG1zZ2lkKTsKKworCQlzZXJ2aWNlID0gZmluZF9zZXJ2aWNlX2J5X3BvcnQoc3RhdGUsIGxvY2FscG9ydCk7CisKKwkJaWYgKCFzZXJ2aWNlKSB7CisJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfc3luY19sb2dfbGV2ZWwsCisJCQkJIiVkOiBzZiAlc0AleCAoJWQtPiVkKSAtICIKKwkJCQkiaW52YWxpZC9jbG9zZWQgc2VydmljZSAlZCIsCisJCQkJc3RhdGUtPmlkLCBtc2dfdHlwZV9zdHIodHlwZSksCisJCQkJKHVuc2lnbmVkIGludCloZWFkZXIsCisJCQkJcmVtb3RlcG9ydCwgbG9jYWxwb3J0LCBsb2NhbHBvcnQpOworCQkJcmVsZWFzZV9tZXNzYWdlX3N5bmMoc3RhdGUsIGhlYWRlcik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICh2Y2hpcV9zeW5jX2xvZ19sZXZlbCA+PSBWQ0hJUV9MT0dfVFJBQ0UpIHsKKwkJCWludCBzdmNfZm91cmNjOworCisJCQlzdmNfZm91cmNjID0gc2VydmljZQorCQkJCT8gc2VydmljZS0+YmFzZS5mb3VyY2MKKwkJCQk6IFZDSElRX01BS0VfRk9VUkNDKCc/JywgJz8nLCAnPycsICc/Jyk7CisJCQl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfc3luY19sb2dfbGV2ZWwsCisJCQkJIlJjdmQgTXNnICVzIGZyb20gJWMlYyVjJWMgczolZCBkOiVkIGxlbjolZCIsCisJCQkJbXNnX3R5cGVfc3RyKHR5cGUpLAorCQkJCVZDSElRX0ZPVVJDQ19BU180Q0hBUlMoc3ZjX2ZvdXJjYyksCisJCQkJcmVtb3RlcG9ydCwgbG9jYWxwb3J0LCBzaXplKTsKKwkJCWlmIChzaXplID4gMCkKKwkJCQl2Y2hpcV9sb2dfZHVtcF9tZW0oIlJjdmQiLCAwLCBoZWFkZXItPmRhdGEsCisJCQkJCW1pbig2NCwgc2l6ZSkpOworCQl9CisKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgVkNISVFfTVNHX09QRU5BQ0s6CisJCQlpZiAoc2l6ZSA+PSBzaXplb2Yoc3RydWN0IHZjaGlxX29wZW5hY2tfcGF5bG9hZCkpIHsKKwkJCQljb25zdCBzdHJ1Y3QgdmNoaXFfb3BlbmFja19wYXlsb2FkICpwYXlsb2FkID0KKwkJCQkJKHN0cnVjdCB2Y2hpcV9vcGVuYWNrX3BheWxvYWQgKikKKwkJCQkJaGVhZGVyLT5kYXRhOworCQkJCXNlcnZpY2UtPnBlZXJfdmVyc2lvbiA9IHBheWxvYWQtPnZlcnNpb247CisJCQl9CisJCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9zeW5jX2xvZ19sZXZlbCwKKwkJCQkiJWQ6IHNmIE9QRU5BQ0tAJXgsJXggKCVkLT4lZCkgdjolZCIsCisJCQkJc3RhdGUtPmlkLCAodW5zaWduZWQgaW50KWhlYWRlciwgc2l6ZSwKKwkJCQlyZW1vdGVwb3J0LCBsb2NhbHBvcnQsIHNlcnZpY2UtPnBlZXJfdmVyc2lvbik7CisJCQlpZiAoc2VydmljZS0+c3J2c3RhdGUgPT0gVkNISVFfU1JWU1RBVEVfT1BFTklORykgeworCQkJCXNlcnZpY2UtPnJlbW90ZXBvcnQgPSByZW1vdGVwb3J0OworCQkJCXZjaGlxX3NldF9zZXJ2aWNlX3N0YXRlKHNlcnZpY2UsCisJCQkJCVZDSElRX1NSVlNUQVRFX09QRU5TWU5DKTsKKwkJCQlzZXJ2aWNlLT5zeW5jID0gMTsKKwkJCQl1cCgmc2VydmljZS0+cmVtb3ZlX2V2ZW50KTsKKwkJCX0KKwkJCXJlbGVhc2VfbWVzc2FnZV9zeW5jKHN0YXRlLCBoZWFkZXIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBWQ0hJUV9NU0dfREFUQToKKwkJCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9zeW5jX2xvZ19sZXZlbCwKKwkJCQkiJWQ6IHNmIERBVEFAJXgsJXggKCVkLT4lZCkiLAorCQkJCXN0YXRlLT5pZCwgKHVuc2lnbmVkIGludCloZWFkZXIsIHNpemUsCisJCQkJcmVtb3RlcG9ydCwgbG9jYWxwb3J0KTsKKworCQkJaWYgKChzZXJ2aWNlLT5yZW1vdGVwb3J0ID09IHJlbW90ZXBvcnQpICYmCisJCQkJKHNlcnZpY2UtPnNydnN0YXRlID09CisJCQkJVkNISVFfU1JWU1RBVEVfT1BFTlNZTkMpKSB7CisJCQkJaWYgKG1ha2Vfc2VydmljZV9jYWxsYmFjayhzZXJ2aWNlLAorCQkJCQlWQ0hJUV9NRVNTQUdFX0FWQUlMQUJMRSwgaGVhZGVyLAorCQkJCQlOVUxMKSA9PSBWQ0hJUV9SRVRSWSkKKwkJCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX3N5bmNfbG9nX2xldmVsLAorCQkJCQkJInN5bmNocm9ub3VzIGNhbGxiYWNrIHRvICIKKwkJCQkJCSJzZXJ2aWNlICVkIHJldHVybnMgIgorCQkJCQkJIlZDSElRX1JFVFJZIiwKKwkJCQkJCWxvY2FscG9ydCk7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX3N5bmNfbG9nX2xldmVsLAorCQkJCSIlZDogc2YgdW5leHBlY3RlZCBtc2dpZCAleEAleCwleCIsCisJCQkJc3RhdGUtPmlkLCBtc2dpZCwgKHVuc2lnbmVkIGludCloZWFkZXIsIHNpemUpOworCQkJcmVsZWFzZV9tZXNzYWdlX3N5bmMoc3RhdGUsIGhlYWRlcik7CisJCQlicmVhazsKKwkJfQorCisJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkCitpbml0X2J1bGtfcXVldWUoVkNISVFfQlVMS19RVUVVRV9UICpxdWV1ZSkKK3sKKwlxdWV1ZS0+bG9jYWxfaW5zZXJ0ID0gMDsKKwlxdWV1ZS0+cmVtb3RlX2luc2VydCA9IDA7CisJcXVldWUtPnByb2Nlc3MgPSAwOworCXF1ZXVlLT5yZW1vdGVfbm90aWZ5ID0gMDsKKwlxdWV1ZS0+cmVtb3ZlID0gMDsKK30KKworCitpbmxpbmUgY29uc3QgY2hhciAqCitnZXRfY29ubl9zdGF0ZV9uYW1lKFZDSElRX0NPTk5TVEFURV9UIGNvbm5fc3RhdGUpCit7CisJcmV0dXJuIGNvbm5fc3RhdGVfbmFtZXNbY29ubl9zdGF0ZV07Cit9CisKKworVkNISVFfU0xPVF9aRVJPX1QgKgordmNoaXFfaW5pdF9zbG90cyh2b2lkICptZW1fYmFzZSwgaW50IG1lbV9zaXplKQoreworCWludCBtZW1fYWxpZ24gPSAoVkNISVFfU0xPVF9TSVpFIC0gKGludCltZW1fYmFzZSkgJiBWQ0hJUV9TTE9UX01BU0s7CisJVkNISVFfU0xPVF9aRVJPX1QgKnNsb3RfemVybyA9CisJCShWQ0hJUV9TTE9UX1pFUk9fVCAqKSgoY2hhciAqKW1lbV9iYXNlICsgbWVtX2FsaWduKTsKKwlpbnQgbnVtX3Nsb3RzID0gKG1lbV9zaXplIC0gbWVtX2FsaWduKS9WQ0hJUV9TTE9UX1NJWkU7CisJaW50IGZpcnN0X2RhdGFfc2xvdCA9IFZDSElRX1NMT1RfWkVST19TTE9UUzsKKworCS8qIEVuc3VyZSB0aGVyZSBpcyBlbm91Z2ggbWVtb3J5IHRvIHJ1biBhbiBhYnNvbHV0ZWx5IG1pbmltdW0gc3lzdGVtICovCisJbnVtX3Nsb3RzIC09IGZpcnN0X2RhdGFfc2xvdDsKKworCWlmIChudW1fc2xvdHMgPCA0KSB7CisJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCSJ2Y2hpcV9pbml0X3Nsb3RzIC0gaW5zdWZmaWNpZW50IG1lbW9yeSAleCBieXRlcyIsCisJCQltZW1fc2l6ZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChzbG90X3plcm8sIDAsIHNpemVvZihWQ0hJUV9TTE9UX1pFUk9fVCkpOworCisJc2xvdF96ZXJvLT5tYWdpYyA9IFZDSElRX01BR0lDOworCXNsb3RfemVyby0+dmVyc2lvbiA9IFZDSElRX1ZFUlNJT047CisJc2xvdF96ZXJvLT52ZXJzaW9uX21pbiA9IFZDSElRX1ZFUlNJT05fTUlOOworCXNsb3RfemVyby0+c2xvdF96ZXJvX3NpemUgPSBzaXplb2YoVkNISVFfU0xPVF9aRVJPX1QpOworCXNsb3RfemVyby0+c2xvdF9zaXplID0gVkNISVFfU0xPVF9TSVpFOworCXNsb3RfemVyby0+bWF4X3Nsb3RzID0gVkNISVFfTUFYX1NMT1RTOworCXNsb3RfemVyby0+bWF4X3Nsb3RzX3Blcl9zaWRlID0gVkNISVFfTUFYX1NMT1RTX1BFUl9TSURFOworCisJc2xvdF96ZXJvLT5tYXN0ZXIuc2xvdF9zeW5jID0gZmlyc3RfZGF0YV9zbG90OworCXNsb3RfemVyby0+bWFzdGVyLnNsb3RfZmlyc3QgPSBmaXJzdF9kYXRhX3Nsb3QgKyAxOworCXNsb3RfemVyby0+bWFzdGVyLnNsb3RfbGFzdCA9IGZpcnN0X2RhdGFfc2xvdCArIChudW1fc2xvdHMvMikgLSAxOworCXNsb3RfemVyby0+c2xhdmUuc2xvdF9zeW5jID0gZmlyc3RfZGF0YV9zbG90ICsgKG51bV9zbG90cy8yKTsKKwlzbG90X3plcm8tPnNsYXZlLnNsb3RfZmlyc3QgPSBmaXJzdF9kYXRhX3Nsb3QgKyAobnVtX3Nsb3RzLzIpICsgMTsKKwlzbG90X3plcm8tPnNsYXZlLnNsb3RfbGFzdCA9IGZpcnN0X2RhdGFfc2xvdCArIG51bV9zbG90cyAtIDE7CisKKwlyZXR1cm4gc2xvdF96ZXJvOworfQorCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfaW5pdF9zdGF0ZShWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfU0xPVF9aRVJPX1QgKnNsb3RfemVybywKKwkJIGludCBpc19tYXN0ZXIpCit7CisJVkNISVFfU0hBUkVEX1NUQVRFX1QgKmxvY2FsOworCVZDSElRX1NIQVJFRF9TVEFURV9UICpyZW1vdGU7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzOworCWNoYXIgdGhyZWFkbmFtZVsxMF07CisJc3RhdGljIGludCBpZDsKKwlpbnQgaTsKKworCXZjaGlxX2xvZ193YXJuaW5nKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkiJXM6IHNsb3RfemVybyA9IDB4JTA4bHgsIGlzX21hc3RlciA9ICVkIiwKKwkJX19mdW5jX18sICh1bnNpZ25lZCBsb25nKXNsb3RfemVybywgaXNfbWFzdGVyKTsKKworCS8qIENoZWNrIHRoZSBpbnB1dCBjb25maWd1cmF0aW9uICovCisKKwlpZiAoc2xvdF96ZXJvLT5tYWdpYyAhPSBWQ0hJUV9NQUdJQykgeworCQl2Y2hpcV9sb3VkX2Vycm9yX2hlYWRlcigpOworCQl2Y2hpcV9sb3VkX2Vycm9yKCJJbnZhbGlkIFZDSElRIG1hZ2ljIHZhbHVlIGZvdW5kLiIpOworCQl2Y2hpcV9sb3VkX2Vycm9yKCJzbG90X3plcm89JXg6IG1hZ2ljPSV4IChleHBlY3RlZCAleCkiLAorCQkJKHVuc2lnbmVkIGludClzbG90X3plcm8sIHNsb3RfemVyby0+bWFnaWMsIFZDSElRX01BR0lDKTsKKwkJdmNoaXFfbG91ZF9lcnJvcl9mb290ZXIoKTsKKwkJcmV0dXJuIFZDSElRX0VSUk9SOworCX0KKworCWlmIChzbG90X3plcm8tPnZlcnNpb24gPCBWQ0hJUV9WRVJTSU9OX01JTikgeworCQl2Y2hpcV9sb3VkX2Vycm9yX2hlYWRlcigpOworCQl2Y2hpcV9sb3VkX2Vycm9yKCJJbmNvbXBhdGlibGUgVkNISVEgdmVyc2lvbnMgZm91bmQuIik7CisJCXZjaGlxX2xvdWRfZXJyb3IoInNsb3RfemVybz0leDogVmlkZW9Db3JlIHZlcnNpb249JWQgIgorCQkJIihtaW5pbXVtICVkKSIsCisJCQkodW5zaWduZWQgaW50KXNsb3RfemVybywgc2xvdF96ZXJvLT52ZXJzaW9uLAorCQkJVkNISVFfVkVSU0lPTl9NSU4pOworCQl2Y2hpcV9sb3VkX2Vycm9yKCJSZXN0YXJ0IHdpdGggYSBuZXdlciBWaWRlb0NvcmUgaW1hZ2UuIik7CisJCXZjaGlxX2xvdWRfZXJyb3JfZm9vdGVyKCk7CisJCXJldHVybiBWQ0hJUV9FUlJPUjsKKwl9CisKKwlpZiAoVkNISVFfVkVSU0lPTiA8IHNsb3RfemVyby0+dmVyc2lvbl9taW4pIHsKKwkJdmNoaXFfbG91ZF9lcnJvcl9oZWFkZXIoKTsKKwkJdmNoaXFfbG91ZF9lcnJvcigiSW5jb21wYXRpYmxlIFZDSElRIHZlcnNpb25zIGZvdW5kLiIpOworCQl2Y2hpcV9sb3VkX2Vycm9yKCJzbG90X3plcm89JXg6IHZlcnNpb249JWQgKFZpZGVvQ29yZSAiCisJCQkibWluaW11bSAlZCkiLAorCQkJKHVuc2lnbmVkIGludClzbG90X3plcm8sIFZDSElRX1ZFUlNJT04sCisJCQlzbG90X3plcm8tPnZlcnNpb25fbWluKTsKKwkJdmNoaXFfbG91ZF9lcnJvcigiUmVzdGFydCB3aXRoIGEgbmV3ZXIga2VybmVsLiIpOworCQl2Y2hpcV9sb3VkX2Vycm9yX2Zvb3RlcigpOworCQlyZXR1cm4gVkNISVFfRVJST1I7CisJfQorCisJaWYgKChzbG90X3plcm8tPnNsb3RfemVyb19zaXplICE9IHNpemVvZihWQ0hJUV9TTE9UX1pFUk9fVCkpIHx8CisJCSAoc2xvdF96ZXJvLT5zbG90X3NpemUgIT0gVkNISVFfU0xPVF9TSVpFKSB8fAorCQkgKHNsb3RfemVyby0+bWF4X3Nsb3RzICE9IFZDSElRX01BWF9TTE9UUykgfHwKKwkJIChzbG90X3plcm8tPm1heF9zbG90c19wZXJfc2lkZSAhPSBWQ0hJUV9NQVhfU0xPVFNfUEVSX1NJREUpKSB7CisJCXZjaGlxX2xvdWRfZXJyb3JfaGVhZGVyKCk7CisJCWlmIChzbG90X3plcm8tPnNsb3RfemVyb19zaXplICE9IHNpemVvZihWQ0hJUV9TTE9UX1pFUk9fVCkpCisJCQl2Y2hpcV9sb3VkX2Vycm9yKCJzbG90X3plcm89JXg6IHNsb3RfemVyb19zaXplPSV4ICIKKwkJCQkiKGV4cGVjdGVkICV4KSIsCisJCQkJKHVuc2lnbmVkIGludClzbG90X3plcm8sCisJCQkJc2xvdF96ZXJvLT5zbG90X3plcm9fc2l6ZSwKKwkJCQlzaXplb2YoVkNISVFfU0xPVF9aRVJPX1QpKTsKKwkJaWYgKHNsb3RfemVyby0+c2xvdF9zaXplICE9IFZDSElRX1NMT1RfU0laRSkKKwkJCXZjaGlxX2xvdWRfZXJyb3IoInNsb3RfemVybz0leDogc2xvdF9zaXplPSVkICIKKwkJCQkiKGV4cGVjdGVkICVkIiwKKwkJCQkodW5zaWduZWQgaW50KXNsb3RfemVybywgc2xvdF96ZXJvLT5zbG90X3NpemUsCisJCQkJVkNISVFfU0xPVF9TSVpFKTsKKwkJaWYgKHNsb3RfemVyby0+bWF4X3Nsb3RzICE9IFZDSElRX01BWF9TTE9UUykKKwkJCXZjaGlxX2xvdWRfZXJyb3IoInNsb3RfemVybz0leDogbWF4X3Nsb3RzPSVkICIKKwkJCQkiKGV4cGVjdGVkICVkKSIsCisJCQkJKHVuc2lnbmVkIGludClzbG90X3plcm8sIHNsb3RfemVyby0+bWF4X3Nsb3RzLAorCQkJCVZDSElRX01BWF9TTE9UUyk7CisJCWlmIChzbG90X3plcm8tPm1heF9zbG90c19wZXJfc2lkZSAhPSBWQ0hJUV9NQVhfU0xPVFNfUEVSX1NJREUpCisJCQl2Y2hpcV9sb3VkX2Vycm9yKCJzbG90X3plcm89JXg6IG1heF9zbG90c19wZXJfc2lkZT0lZCAiCisJCQkJIihleHBlY3RlZCAlZCkiLAorCQkJCSh1bnNpZ25lZCBpbnQpc2xvdF96ZXJvLAorCQkJCXNsb3RfemVyby0+bWF4X3Nsb3RzX3Blcl9zaWRlLAorCQkJCVZDSElRX01BWF9TTE9UU19QRVJfU0lERSk7CisJCXZjaGlxX2xvdWRfZXJyb3JfZm9vdGVyKCk7CisJCXJldHVybiBWQ0hJUV9FUlJPUjsKKwl9CisKKwlpZiAoVkNISVFfVkVSU0lPTiA8IHNsb3RfemVyby0+dmVyc2lvbikKKwkJc2xvdF96ZXJvLT52ZXJzaW9uID0gVkNISVFfVkVSU0lPTjsKKworCWlmIChpc19tYXN0ZXIpIHsKKwkJbG9jYWwgPSAmc2xvdF96ZXJvLT5tYXN0ZXI7CisJCXJlbW90ZSA9ICZzbG90X3plcm8tPnNsYXZlOworCX0gZWxzZSB7CisJCWxvY2FsID0gJnNsb3RfemVyby0+c2xhdmU7CisJCXJlbW90ZSA9ICZzbG90X3plcm8tPm1hc3RlcjsKKwl9CisKKwlpZiAobG9jYWwtPmluaXRpYWxpc2VkKSB7CisJCXZjaGlxX2xvdWRfZXJyb3JfaGVhZGVyKCk7CisJCWlmIChyZW1vdGUtPmluaXRpYWxpc2VkKQorCQkJdmNoaXFfbG91ZF9lcnJvcigibG9jYWwgc3RhdGUgaGFzIGFscmVhZHkgYmVlbiAiCisJCQkJImluaXRpYWxpc2VkIik7CisJCWVsc2UKKwkJCXZjaGlxX2xvdWRfZXJyb3IoIm1hc3Rlci9zbGF2ZSBtaXNtYXRjaCAtIHR3byAlc3MiLAorCQkJCWlzX21hc3RlciA/ICJtYXN0ZXIiIDogInNsYXZlIik7CisJCXZjaGlxX2xvdWRfZXJyb3JfZm9vdGVyKCk7CisJCXJldHVybiBWQ0hJUV9FUlJPUjsKKwl9CisKKwltZW1zZXQoc3RhdGUsIDAsIHNpemVvZihWQ0hJUV9TVEFURV9UKSk7CisKKwlzdGF0ZS0+aWQgPSBpZCsrOworCXN0YXRlLT5pc19tYXN0ZXIgPSBpc19tYXN0ZXI7CisKKwkvKgorCQlpbml0aWFsaXplIHNoYXJlZCBzdGF0ZSBwb2ludGVycworCSAqLworCisJc3RhdGUtPmxvY2FsID0gbG9jYWw7CisJc3RhdGUtPnJlbW90ZSA9IHJlbW90ZTsKKwlzdGF0ZS0+c2xvdF9kYXRhID0gKFZDSElRX1NMT1RfVCAqKXNsb3RfemVybzsKKworCS8qCisJCWluaXRpYWxpemUgZXZlbnRzIGFuZCBtdXRleGVzCisJICovCisKKwlzZW1hX2luaXQoJnN0YXRlLT5jb25uZWN0LCAwKTsKKwltdXRleF9pbml0KCZzdGF0ZS0+bXV0ZXgpOworCXNlbWFfaW5pdCgmc3RhdGUtPnRyaWdnZXJfZXZlbnQsIDApOworCXNlbWFfaW5pdCgmc3RhdGUtPnJlY3ljbGVfZXZlbnQsIDApOworCXNlbWFfaW5pdCgmc3RhdGUtPnN5bmNfdHJpZ2dlcl9ldmVudCwgMCk7CisJc2VtYV9pbml0KCZzdGF0ZS0+c3luY19yZWxlYXNlX2V2ZW50LCAwKTsKKworCW11dGV4X2luaXQoJnN0YXRlLT5zbG90X211dGV4KTsKKwltdXRleF9pbml0KCZzdGF0ZS0+cmVjeWNsZV9tdXRleCk7CisJbXV0ZXhfaW5pdCgmc3RhdGUtPnN5bmNfbXV0ZXgpOworCW11dGV4X2luaXQoJnN0YXRlLT5idWxrX3RyYW5zZmVyX211dGV4KTsKKworCXNlbWFfaW5pdCgmc3RhdGUtPnNsb3RfYXZhaWxhYmxlX2V2ZW50LCAwKTsKKwlzZW1hX2luaXQoJnN0YXRlLT5zbG90X3JlbW92ZV9ldmVudCwgMCk7CisJc2VtYV9pbml0KCZzdGF0ZS0+ZGF0YV9xdW90YV9ldmVudCwgMCk7CisKKwlzdGF0ZS0+c2xvdF9xdWV1ZV9hdmFpbGFibGUgPSAwOworCisJZm9yIChpID0gMDsgaSA8IFZDSElRX01BWF9TRVJWSUNFUzsgaSsrKSB7CisJCVZDSElRX1NFUlZJQ0VfUVVPVEFfVCAqc2VydmljZV9xdW90YSA9CisJCQkmc3RhdGUtPnNlcnZpY2VfcXVvdGFzW2ldOworCQlzZW1hX2luaXQoJnNlcnZpY2VfcXVvdGEtPnF1b3RhX2V2ZW50LCAwKTsKKwl9CisKKwlmb3IgKGkgPSBsb2NhbC0+c2xvdF9maXJzdDsgaSA8PSBsb2NhbC0+c2xvdF9sYXN0OyBpKyspIHsKKwkJbG9jYWwtPnNsb3RfcXVldWVbc3RhdGUtPnNsb3RfcXVldWVfYXZhaWxhYmxlKytdID0gaTsKKwkJdXAoJnN0YXRlLT5zbG90X2F2YWlsYWJsZV9ldmVudCk7CisJfQorCisJc3RhdGUtPmRlZmF1bHRfc2xvdF9xdW90YSA9IHN0YXRlLT5zbG90X3F1ZXVlX2F2YWlsYWJsZS8yOworCXN0YXRlLT5kZWZhdWx0X21lc3NhZ2VfcXVvdGEgPQorCQltaW4oKHVuc2lnbmVkIHNob3J0KShzdGF0ZS0+ZGVmYXVsdF9zbG90X3F1b3RhICogMjU2KSwKKwkJKHVuc2lnbmVkIHNob3J0KX4wKTsKKworCXN0YXRlLT5wcmV2aW91c19kYXRhX2luZGV4ID0gLTE7CisJc3RhdGUtPmRhdGFfdXNlX2NvdW50ID0gMDsKKwlzdGF0ZS0+ZGF0YV9xdW90YSA9IHN0YXRlLT5zbG90X3F1ZXVlX2F2YWlsYWJsZSAtIDE7CisKKwlsb2NhbC0+dHJpZ2dlci5ldmVudCA9ICZzdGF0ZS0+dHJpZ2dlcl9ldmVudDsKKwlyZW1vdGVfZXZlbnRfY3JlYXRlKCZsb2NhbC0+dHJpZ2dlcik7CisJbG9jYWwtPnR4X3BvcyA9IDA7CisKKwlsb2NhbC0+cmVjeWNsZS5ldmVudCA9ICZzdGF0ZS0+cmVjeWNsZV9ldmVudDsKKwlyZW1vdGVfZXZlbnRfY3JlYXRlKCZsb2NhbC0+cmVjeWNsZSk7CisJbG9jYWwtPnNsb3RfcXVldWVfcmVjeWNsZSA9IHN0YXRlLT5zbG90X3F1ZXVlX2F2YWlsYWJsZTsKKworCWxvY2FsLT5zeW5jX3RyaWdnZXIuZXZlbnQgPSAmc3RhdGUtPnN5bmNfdHJpZ2dlcl9ldmVudDsKKwlyZW1vdGVfZXZlbnRfY3JlYXRlKCZsb2NhbC0+c3luY190cmlnZ2VyKTsKKworCWxvY2FsLT5zeW5jX3JlbGVhc2UuZXZlbnQgPSAmc3RhdGUtPnN5bmNfcmVsZWFzZV9ldmVudDsKKwlyZW1vdGVfZXZlbnRfY3JlYXRlKCZsb2NhbC0+c3luY19yZWxlYXNlKTsKKworCS8qIEF0IHN0YXJ0LW9mLWRheSwgdGhlIHNsb3QgaXMgZW1wdHkgYW5kIGF2YWlsYWJsZSAqLworCSgoVkNISVFfSEVBREVSX1QgKilTTE9UX0RBVEFfRlJPTV9JTkRFWChzdGF0ZSwgbG9jYWwtPnNsb3Rfc3luYykpLT5tc2dpZAorCQk9IFZDSElRX01TR0lEX1BBRERJTkc7CisJcmVtb3RlX2V2ZW50X3NpZ25hbF9sb2NhbCgmbG9jYWwtPnN5bmNfcmVsZWFzZSk7CisKKwlsb2NhbC0+ZGVidWdbREVCVUdfRU5UUklFU10gPSBERUJVR19NQVg7CisKKwlzdGF0dXMgPSB2Y2hpcV9wbGF0Zm9ybV9pbml0X3N0YXRlKHN0YXRlKTsKKworCS8qCisJCWJyaW5nIHVwIHNsb3QgaGFuZGxlciB0aHJlYWQKKwkgKi8KKwlzbnByaW50Zih0aHJlYWRuYW1lLCBzaXplb2YodGhyZWFkbmFtZSksICJWQ0hJUS0lZCIsIHN0YXRlLT5pZCk7CisJc3RhdGUtPnNsb3RfaGFuZGxlcl90aHJlYWQgPSBrdGhyZWFkX2NyZWF0ZSgmc2xvdF9oYW5kbGVyX2Z1bmMsCisJCSh2b2lkICopc3RhdGUsCisJCXRocmVhZG5hbWUpOworCisJaWYgKHN0YXRlLT5zbG90X2hhbmRsZXJfdGhyZWFkID09IE5VTEwpIHsKKwkJdmNoaXFfbG91ZF9lcnJvcl9oZWFkZXIoKTsKKwkJdmNoaXFfbG91ZF9lcnJvcigiY291bGRuJ3QgY3JlYXRlIHRocmVhZCAlcyIsIHRocmVhZG5hbWUpOworCQl2Y2hpcV9sb3VkX2Vycm9yX2Zvb3RlcigpOworCQlyZXR1cm4gVkNISVFfRVJST1I7CisJfQorCXNldF91c2VyX25pY2Uoc3RhdGUtPnNsb3RfaGFuZGxlcl90aHJlYWQsIC0xOSk7CisJd2FrZV91cF9wcm9jZXNzKHN0YXRlLT5zbG90X2hhbmRsZXJfdGhyZWFkKTsKKworCXNucHJpbnRmKHRocmVhZG5hbWUsIHNpemVvZih0aHJlYWRuYW1lKSwgIlZDSElRci0lZCIsIHN0YXRlLT5pZCk7CisJc3RhdGUtPnJlY3ljbGVfdGhyZWFkID0ga3RocmVhZF9jcmVhdGUoJnJlY3ljbGVfZnVuYywKKwkJKHZvaWQgKilzdGF0ZSwKKwkJdGhyZWFkbmFtZSk7CisJaWYgKHN0YXRlLT5yZWN5Y2xlX3RocmVhZCA9PSBOVUxMKSB7CisJCXZjaGlxX2xvdWRfZXJyb3JfaGVhZGVyKCk7CisJCXZjaGlxX2xvdWRfZXJyb3IoImNvdWxkbid0IGNyZWF0ZSB0aHJlYWQgJXMiLCB0aHJlYWRuYW1lKTsKKwkJdmNoaXFfbG91ZF9lcnJvcl9mb290ZXIoKTsKKwkJcmV0dXJuIFZDSElRX0VSUk9SOworCX0KKwlzZXRfdXNlcl9uaWNlKHN0YXRlLT5yZWN5Y2xlX3RocmVhZCwgLTE5KTsKKwl3YWtlX3VwX3Byb2Nlc3Moc3RhdGUtPnJlY3ljbGVfdGhyZWFkKTsKKworCXNucHJpbnRmKHRocmVhZG5hbWUsIHNpemVvZih0aHJlYWRuYW1lKSwgIlZDSElRcy0lZCIsIHN0YXRlLT5pZCk7CisJc3RhdGUtPnN5bmNfdGhyZWFkID0ga3RocmVhZF9jcmVhdGUoJnN5bmNfZnVuYywKKwkJKHZvaWQgKilzdGF0ZSwKKwkJdGhyZWFkbmFtZSk7CisJaWYgKHN0YXRlLT5zeW5jX3RocmVhZCA9PSBOVUxMKSB7CisJCXZjaGlxX2xvdWRfZXJyb3JfaGVhZGVyKCk7CisJCXZjaGlxX2xvdWRfZXJyb3IoImNvdWxkbid0IGNyZWF0ZSB0aHJlYWQgJXMiLCB0aHJlYWRuYW1lKTsKKwkJdmNoaXFfbG91ZF9lcnJvcl9mb290ZXIoKTsKKwkJcmV0dXJuIFZDSElRX0VSUk9SOworCX0KKwlzZXRfdXNlcl9uaWNlKHN0YXRlLT5zeW5jX3RocmVhZCwgLTIwKTsKKwl3YWtlX3VwX3Byb2Nlc3Moc3RhdGUtPnN5bmNfdGhyZWFkKTsKKworCUJVR19PTihzdGF0ZS0+aWQgPj0gVkNISVFfTUFYX1NUQVRFUyk7CisJdmNoaXFfc3RhdGVzW3N0YXRlLT5pZF0gPSBzdGF0ZTsKKworCS8qIEluZGljYXRlIHJlYWRpbmVzcyB0byB0aGUgb3RoZXIgc2lkZSAqLworCWxvY2FsLT5pbml0aWFsaXNlZCA9IDE7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBDYWxsZWQgZnJvbSBhcHBsaWNhdGlvbiB0aHJlYWQgd2hlbiBhIGNsaWVudCBvciBzZXJ2ZXIgc2VydmljZSBpcyBjcmVhdGVkLiAqLworVkNISVFfU0VSVklDRV9UICoKK3ZjaGlxX2FkZF9zZXJ2aWNlX2ludGVybmFsKFZDSElRX1NUQVRFX1QgKnN0YXRlLAorCWNvbnN0IFZDSElRX1NFUlZJQ0VfUEFSQU1TX1QgKnBhcmFtcywgaW50IHNydnN0YXRlLAorCVZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UsIFZDSElRX1VTRVJEQVRBX1RFUk1fVCB1c2VyZGF0YV90ZXJtKQoreworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZTsKKworCXNlcnZpY2UgPSBrbWFsbG9jKHNpemVvZihWQ0hJUV9TRVJWSUNFX1QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2VydmljZSkgeworCQlzZXJ2aWNlLT5iYXNlLmZvdXJjYyAgID0gcGFyYW1zLT5mb3VyY2M7CisJCXNlcnZpY2UtPmJhc2UuY2FsbGJhY2sgPSBwYXJhbXMtPmNhbGxiYWNrOworCQlzZXJ2aWNlLT5iYXNlLnVzZXJkYXRhID0gcGFyYW1zLT51c2VyZGF0YTsKKwkJc2VydmljZS0+aGFuZGxlICAgICAgICA9IFZDSElRX1NFUlZJQ0VfSEFORExFX0lOVkFMSUQ7CisJCXNlcnZpY2UtPnJlZl9jb3VudCAgICAgPSAxOworCQlzZXJ2aWNlLT5zcnZzdGF0ZSAgICAgID0gVkNISVFfU1JWU1RBVEVfRlJFRTsKKwkJc2VydmljZS0+dXNlcmRhdGFfdGVybSA9IHVzZXJkYXRhX3Rlcm07CisJCXNlcnZpY2UtPmxvY2FscG9ydCAgICAgPSBWQ0hJUV9QT1JUX0ZSRUU7CisJCXNlcnZpY2UtPnJlbW90ZXBvcnQgICAgPSBWQ0hJUV9QT1JUX0ZSRUU7CisKKwkJc2VydmljZS0+cHVibGljX2ZvdXJjYyA9IChzcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9PUEVOSU5HKSA/CisJCQlWQ0hJUV9GT1VSQ0NfSU5WQUxJRCA6IHBhcmFtcy0+Zm91cmNjOworCQlzZXJ2aWNlLT5jbGllbnRfaWQgICAgID0gMDsKKwkJc2VydmljZS0+YXV0b19jbG9zZSAgICA9IDE7CisJCXNlcnZpY2UtPnN5bmMgICAgICAgICAgPSAwOworCQlzZXJ2aWNlLT5jbG9zaW5nICAgICAgID0gMDsKKwkJc2VydmljZS0+dHJhY2UgICAgICAgICA9IDA7CisJCWF0b21pY19zZXQoJnNlcnZpY2UtPnBvbGxfZmxhZ3MsIDApOworCQlzZXJ2aWNlLT52ZXJzaW9uICAgICAgID0gcGFyYW1zLT52ZXJzaW9uOworCQlzZXJ2aWNlLT52ZXJzaW9uX21pbiAgID0gcGFyYW1zLT52ZXJzaW9uX21pbjsKKwkJc2VydmljZS0+c3RhdGUgICAgICAgICA9IHN0YXRlOworCQlzZXJ2aWNlLT5pbnN0YW5jZSAgICAgID0gaW5zdGFuY2U7CisJCXNlcnZpY2UtPnNlcnZpY2VfdXNlX2NvdW50ID0gMDsKKwkJaW5pdF9idWxrX3F1ZXVlKCZzZXJ2aWNlLT5idWxrX3R4KTsKKwkJaW5pdF9idWxrX3F1ZXVlKCZzZXJ2aWNlLT5idWxrX3J4KTsKKwkJc2VtYV9pbml0KCZzZXJ2aWNlLT5yZW1vdmVfZXZlbnQsIDApOworCQlzZW1hX2luaXQoJnNlcnZpY2UtPmJ1bGtfcmVtb3ZlX2V2ZW50LCAwKTsKKwkJbXV0ZXhfaW5pdCgmc2VydmljZS0+YnVsa19tdXRleCk7CisJCW1lbXNldCgmc2VydmljZS0+c3RhdHMsIDAsIHNpemVvZihzZXJ2aWNlLT5zdGF0cykpOworCX0gZWxzZSB7CisJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCSJPdXQgb2YgbWVtb3J5Iik7CisJfQorCisJaWYgKHNlcnZpY2UpIHsKKwkJVkNISVFfU0VSVklDRV9UICoqcHNlcnZpY2UgPSBOVUxMOworCQlpbnQgaTsKKworCQkvKiBBbHRob3VnaCBpdCBpcyBwZXJmZWN0bHkgcG9zc2libGUgdG8gdXNlIHNlcnZpY2Vfc3BpbmxvY2sKKwkJKiogdG8gcHJvdGVjdCB0aGUgY3JlYXRpb24gb2Ygc2VydmljZXMsIGl0IGlzIG92ZXJraWxsIGFzIGl0CisJCSoqIGRpc2FibGVzIGludGVycnVwdHMgd2hpbGUgdGhlIGFycmF5IGlzIHNlYXJjaGVkLgorCQkqKiBUaGUgb25seSBkYW5nZXIgaXMgb2YgYW5vdGhlciB0aHJlYWQgdHJ5aW5nIHRvIGNyZWF0ZSBhCisJCSoqIHNlcnZpY2UgLSBzZXJ2aWNlIGRlbGV0aW9uIGlzIHNhZmUuCisJCSoqIFRoZXJlZm9yZSBpdCBpcyBwcmVmZXJhYmxlIHRvIHVzZSBzdGF0ZS0+bXV0ZXggd2hpY2gsCisJCSoqIGFsdGhvdWdoIHNsb3dlciB0byBjbGFpbSwgZG9lc24ndCBibG9jayBpbnRlcnJ1cHRzIHdoaWxlCisJCSoqIGl0IGlzIGhlbGQuCisJCSovCisKKwkJbXV0ZXhfbG9jaygmc3RhdGUtPm11dGV4KTsKKworCQkvKiBQcmVwYXJlIHRvIHVzZSBhIHByZXZpb3VzbHkgdW51c2VkIHNlcnZpY2UgKi8KKwkJaWYgKHN0YXRlLT51bnVzZWRfc2VydmljZSA8IFZDSElRX01BWF9TRVJWSUNFUykKKwkJCXBzZXJ2aWNlID0gJnN0YXRlLT5zZXJ2aWNlc1tzdGF0ZS0+dW51c2VkX3NlcnZpY2VdOworCisJCWlmIChzcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9PUEVOSU5HKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgc3RhdGUtPnVudXNlZF9zZXJ2aWNlOyBpKyspIHsKKwkJCQlWQ0hJUV9TRVJWSUNFX1QgKnNydiA9IHN0YXRlLT5zZXJ2aWNlc1tpXTsKKwkJCQlpZiAoIXNydikgeworCQkJCQlwc2VydmljZSA9ICZzdGF0ZS0+c2VydmljZXNbaV07CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZvciAoaSA9IChzdGF0ZS0+dW51c2VkX3NlcnZpY2UgLSAxKTsgaSA+PSAwOyBpLS0pIHsKKwkJCQlWQ0hJUV9TRVJWSUNFX1QgKnNydiA9IHN0YXRlLT5zZXJ2aWNlc1tpXTsKKwkJCQlpZiAoIXNydikKKwkJCQkJcHNlcnZpY2UgPSAmc3RhdGUtPnNlcnZpY2VzW2ldOworCQkJCWVsc2UgaWYgKChzcnYtPnB1YmxpY19mb3VyY2MgPT0gcGFyYW1zLT5mb3VyY2MpCisJCQkJCSYmICgoc3J2LT5pbnN0YW5jZSAhPSBpbnN0YW5jZSkgfHwKKwkJCQkJKHNydi0+YmFzZS5jYWxsYmFjayAhPQorCQkJCQlwYXJhbXMtPmNhbGxiYWNrKSkpIHsKKwkJCQkJLyogVGhlcmUgaXMgYW5vdGhlciBzZXJ2ZXIgdXNpbmcgdGhpcworCQkJCQkqKiBmb3VyY2Mgd2hpY2ggZG9lc24ndCBtYXRjaC4gKi8KKwkJCQkJcHNlcnZpY2UgPSBOVUxMOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAocHNlcnZpY2UpIHsKKwkJCXNlcnZpY2UtPmxvY2FscG9ydCA9IChwc2VydmljZSAtIHN0YXRlLT5zZXJ2aWNlcyk7CisJCQlpZiAoIWhhbmRsZV9zZXEpCisJCQkJaGFuZGxlX3NlcSA9IFZDSElRX01BWF9TVEFURVMgKgorCQkJCQkgVkNISVFfTUFYX1NFUlZJQ0VTOworCQkJc2VydmljZS0+aGFuZGxlID0gaGFuZGxlX3NlcSB8CisJCQkJKHN0YXRlLT5pZCAqIFZDSElRX01BWF9TRVJWSUNFUykgfAorCQkJCXNlcnZpY2UtPmxvY2FscG9ydDsKKwkJCWhhbmRsZV9zZXEgKz0gVkNISVFfTUFYX1NUQVRFUyAqIFZDSElRX01BWF9TRVJWSUNFUzsKKwkJCSpwc2VydmljZSA9IHNlcnZpY2U7CisJCQlpZiAocHNlcnZpY2UgPT0gJnN0YXRlLT5zZXJ2aWNlc1tzdGF0ZS0+dW51c2VkX3NlcnZpY2VdKQorCQkJCXN0YXRlLT51bnVzZWRfc2VydmljZSsrOworCQl9CisKKwkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+bXV0ZXgpOworCisJCWlmICghcHNlcnZpY2UpIHsKKwkJCWtmcmVlKHNlcnZpY2UpOworCQkJc2VydmljZSA9IE5VTEw7CisJCX0KKwl9CisKKwlpZiAoc2VydmljZSkgeworCQlWQ0hJUV9TRVJWSUNFX1FVT1RBX1QgKnNlcnZpY2VfcXVvdGEgPQorCQkJJnN0YXRlLT5zZXJ2aWNlX3F1b3Rhc1tzZXJ2aWNlLT5sb2NhbHBvcnRdOworCQlzZXJ2aWNlX3F1b3RhLT5zbG90X3F1b3RhID0gc3RhdGUtPmRlZmF1bHRfc2xvdF9xdW90YTsKKwkJc2VydmljZV9xdW90YS0+bWVzc2FnZV9xdW90YSA9IHN0YXRlLT5kZWZhdWx0X21lc3NhZ2VfcXVvdGE7CisJCWlmIChzZXJ2aWNlX3F1b3RhLT5zbG90X3VzZV9jb3VudCA9PSAwKQorCQkJc2VydmljZV9xdW90YS0+cHJldmlvdXNfdHhfaW5kZXggPQorCQkJCVNMT1RfUVVFVUVfSU5ERVhfRlJPTV9QT1Moc3RhdGUtPmxvY2FsX3R4X3BvcykKKwkJCQktIDE7CisKKwkJLyogQnJpbmcgdGhpcyBzZXJ2aWNlIG9ubGluZSAqLworCQl2Y2hpcV9zZXRfc2VydmljZV9zdGF0ZShzZXJ2aWNlLCBzcnZzdGF0ZSk7CisKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9tc2dfbG9nX2xldmVsLAorCQkJIiVzIFNlcnZpY2UgJWMlYyVjJWMgU3JjUG9ydDolZCIsCisJCQkoc3J2c3RhdGUgPT0gVkNISVFfU1JWU1RBVEVfT1BFTklORykKKwkJCT8gIk9wZW4iIDogIkFkZCIsCisJCQlWQ0hJUV9GT1VSQ0NfQVNfNENIQVJTKHBhcmFtcy0+Zm91cmNjKSwKKwkJCXNlcnZpY2UtPmxvY2FscG9ydCk7CisJfQorCisJLyogRG9uJ3QgdW5sb2NrIHRoZSBzZXJ2aWNlIC0gbGVhdmUgaXQgd2l0aCBhIHJlZl9jb3VudCBvZiAxLiAqLworCisJcmV0dXJuIHNlcnZpY2U7Cit9CisKK1ZDSElRX1NUQVRVU19UCit2Y2hpcV9vcGVuX3NlcnZpY2VfaW50ZXJuYWwoVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlLCBpbnQgY2xpZW50X2lkKQoreworCXN0cnVjdCB2Y2hpcV9vcGVuX3BheWxvYWQgcGF5bG9hZCA9IHsKKwkJc2VydmljZS0+YmFzZS5mb3VyY2MsCisJCWNsaWVudF9pZCwKKwkJc2VydmljZS0+dmVyc2lvbiwKKwkJc2VydmljZS0+dmVyc2lvbl9taW4KKwl9OworCVZDSElRX0VMRU1FTlRfVCBib2R5ID0geyAmcGF5bG9hZCwgc2l6ZW9mKHBheWxvYWQpIH07CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzID0gVkNISVFfU1VDQ0VTUzsKKworCXNlcnZpY2UtPmNsaWVudF9pZCA9IGNsaWVudF9pZDsKKwl2Y2hpcV91c2Vfc2VydmljZV9pbnRlcm5hbChzZXJ2aWNlKTsKKwlzdGF0dXMgPSBxdWV1ZV9tZXNzYWdlKHNlcnZpY2UtPnN0YXRlLCBOVUxMLAorCQlWQ0hJUV9NQUtFX01TRyhWQ0hJUV9NU0dfT1BFTiwgc2VydmljZS0+bG9jYWxwb3J0LCAwKSwKKwkJJmJvZHksIDEsIHNpemVvZihwYXlsb2FkKSwgUU1GTEFHU19JU19CTE9DS0lORyk7CisJaWYgKHN0YXR1cyA9PSBWQ0hJUV9TVUNDRVNTKSB7CisJCS8qIFdhaXQgZm9yIHRoZSBBQ0svTkFLICovCisJCWlmIChkb3duX2ludGVycnVwdGlibGUoJnNlcnZpY2UtPnJlbW92ZV9ldmVudCkgIT0gMCkgeworCQkJc3RhdHVzID0gVkNISVFfUkVUUlk7CisJCQl2Y2hpcV9yZWxlYXNlX3NlcnZpY2VfaW50ZXJuYWwoc2VydmljZSk7CisJCX0gZWxzZSBpZiAoKHNlcnZpY2UtPnNydnN0YXRlICE9IFZDSElRX1NSVlNUQVRFX09QRU4pICYmCisJCQkoc2VydmljZS0+c3J2c3RhdGUgIT0gVkNISVFfU1JWU1RBVEVfT1BFTlNZTkMpKSB7CisJCQlpZiAoc2VydmljZS0+c3J2c3RhdGUgIT0gVkNISVFfU1JWU1RBVEVfQ0xPU0VXQUlUKQorCQkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkJIiVkOiBvc2kgLSBzcnZzdGF0ZSA9ICVzIChyZWYgJWQpIiwKKwkJCQkJc2VydmljZS0+c3RhdGUtPmlkLAorCQkJCQlzcnZzdGF0ZV9uYW1lc1tzZXJ2aWNlLT5zcnZzdGF0ZV0sCisJCQkJCXNlcnZpY2UtPnJlZl9jb3VudCk7CisJCQlzdGF0dXMgPSBWQ0hJUV9FUlJPUjsKKwkJCVZDSElRX1NFUlZJQ0VfU1RBVFNfSU5DKHNlcnZpY2UsIGVycm9yX2NvdW50KTsKKwkJCXZjaGlxX3JlbGVhc2Vfc2VydmljZV9pbnRlcm5hbChzZXJ2aWNlKTsKKwkJfQorCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZAorcmVsZWFzZV9zZXJ2aWNlX21lc3NhZ2VzKFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSkKK3sKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZSA9IHNlcnZpY2UtPnN0YXRlOworCWludCBzbG90X2xhc3QgPSBzdGF0ZS0+cmVtb3RlLT5zbG90X2xhc3Q7CisJaW50IGk7CisKKwkvKiBSZWxlYXNlIGFueSBjbGFpbWVkIG1lc3NhZ2VzIGFpbWVkIGF0IHRoaXMgc2VydmljZSAqLworCisJaWYgKHNlcnZpY2UtPnN5bmMpIHsKKwkJVkNISVFfSEVBREVSX1QgKmhlYWRlciA9CisJCQkoVkNISVFfSEVBREVSX1QgKilTTE9UX0RBVEFfRlJPTV9JTkRFWChzdGF0ZSwKKwkJCQkJCXN0YXRlLT5yZW1vdGUtPnNsb3Rfc3luYyk7CisJCWlmIChWQ0hJUV9NU0dfRFNUUE9SVChoZWFkZXItPm1zZ2lkKSA9PSBzZXJ2aWNlLT5sb2NhbHBvcnQpCisJCQlyZWxlYXNlX21lc3NhZ2Vfc3luYyhzdGF0ZSwgaGVhZGVyKTsKKworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gc3RhdGUtPnJlbW90ZS0+c2xvdF9maXJzdDsgaSA8PSBzbG90X2xhc3Q7IGkrKykgeworCQlWQ0hJUV9TTE9UX0lORk9fVCAqc2xvdF9pbmZvID0KKwkJCVNMT1RfSU5GT19GUk9NX0lOREVYKHN0YXRlLCBpKTsKKwkJaWYgKHNsb3RfaW5mby0+cmVsZWFzZV9jb3VudCAhPSBzbG90X2luZm8tPnVzZV9jb3VudCkgeworCQkJY2hhciAqZGF0YSA9CisJCQkJKGNoYXIgKilTTE9UX0RBVEFfRlJPTV9JTkRFWChzdGF0ZSwgaSk7CisJCQl1bnNpZ25lZCBpbnQgcG9zLCBlbmQ7CisKKwkJCWVuZCA9IFZDSElRX1NMT1RfU0laRTsKKwkJCWlmIChkYXRhID09IHN0YXRlLT5yeF9kYXRhKQorCQkJCS8qIFRoaXMgYnVmZmVyIGlzIHN0aWxsIGJlaW5nIHJlYWQgZnJvbSAtIHN0b3AKKwkJCQkqKiBhdCB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uICovCisJCQkJZW5kID0gc3RhdGUtPnJ4X3BvcyAmIFZDSElRX1NMT1RfTUFTSzsKKworCQkJcG9zID0gMDsKKworCQkJd2hpbGUgKHBvcyA8IGVuZCkgeworCQkJCVZDSElRX0hFQURFUl9UICpoZWFkZXIgPQorCQkJCQkoVkNISVFfSEVBREVSX1QgKikoZGF0YSArIHBvcyk7CisJCQkJaW50IG1zZ2lkID0gaGVhZGVyLT5tc2dpZDsKKwkJCQlpbnQgcG9ydCA9IFZDSElRX01TR19EU1RQT1JUKG1zZ2lkKTsKKwkJCQlpZiAoKHBvcnQgPT0gc2VydmljZS0+bG9jYWxwb3J0KSAmJgorCQkJCQkobXNnaWQgJiBWQ0hJUV9NU0dJRF9DTEFJTUVEKSkgeworCQkJCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkJCSIgIGZzaSAtIGhkciAleCIsCisJCQkJCQkodW5zaWduZWQgaW50KWhlYWRlcik7CisJCQkJCXJlbGVhc2Vfc2xvdChzdGF0ZSwgc2xvdF9pbmZvLCBoZWFkZXIsCisJCQkJCQlOVUxMKTsKKwkJCQl9CisJCQkJcG9zICs9IGNhbGNfc3RyaWRlKGhlYWRlci0+c2l6ZSk7CisJCQkJaWYgKHBvcyA+IFZDSElRX1NMT1RfU0laRSkgeworCQkJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJCQkiZnNpIC0gcG9zICV4OiBoZWFkZXIgJXgsICIKKwkJCQkJCSJtc2dpZCAleCwgaGVhZGVyLT5tc2dpZCAleCwgIgorCQkJCQkJImhlYWRlci0+c2l6ZSAleCIsCisJCQkJCQlwb3MsICh1bnNpZ25lZCBpbnQpaGVhZGVyLAorCQkJCQkJbXNnaWQsIGhlYWRlci0+bXNnaWQsCisJCQkJCQloZWFkZXItPnNpemUpOworCQkJCQlXQVJOKDEsICJpbnZhbGlkIHNsb3QgcG9zaXRpb25cbiIpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIGludAorZG9fYWJvcnRfYnVsa3MoVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlKQoreworCVZDSElRX1NUQVRVU19UIHN0YXR1czsKKworCS8qIEFib3J0IGFueSBvdXRzdGFuZGluZyBidWxrIHRyYW5zZmVycyAqLworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnNlcnZpY2UtPmJ1bGtfbXV0ZXgpICE9IDApCisJCXJldHVybiAwOworCWFib3J0X291dHN0YW5kaW5nX2J1bGtzKHNlcnZpY2UsICZzZXJ2aWNlLT5idWxrX3R4KTsKKwlhYm9ydF9vdXRzdGFuZGluZ19idWxrcyhzZXJ2aWNlLCAmc2VydmljZS0+YnVsa19yeCk7CisJbXV0ZXhfdW5sb2NrKCZzZXJ2aWNlLT5idWxrX211dGV4KTsKKworCXN0YXR1cyA9IG5vdGlmeV9idWxrcyhzZXJ2aWNlLCAmc2VydmljZS0+YnVsa190eCwgMC8qIXJldHJ5X3BvbGwqLyk7CisJaWYgKHN0YXR1cyA9PSBWQ0hJUV9TVUNDRVNTKQorCQlzdGF0dXMgPSBub3RpZnlfYnVsa3Moc2VydmljZSwgJnNlcnZpY2UtPmJ1bGtfcngsCisJCQkwLyohcmV0cnlfcG9sbCovKTsKKwlyZXR1cm4gKHN0YXR1cyA9PSBWQ0hJUV9TVUNDRVNTKTsKK30KKworc3RhdGljIFZDSElRX1NUQVRVU19UCitjbG9zZV9zZXJ2aWNlX2NvbXBsZXRlKFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSwgaW50IGZhaWxzdGF0ZSkKK3sKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXM7CisJaW50IGlzX3NlcnZlciA9IChzZXJ2aWNlLT5wdWJsaWNfZm91cmNjICE9IFZDSElRX0ZPVVJDQ19JTlZBTElEKTsKKwlpbnQgbmV3c3RhdGU7CisKKwlzd2l0Y2ggKHNlcnZpY2UtPnNydnN0YXRlKSB7CisJY2FzZSBWQ0hJUV9TUlZTVEFURV9PUEVOOgorCWNhc2UgVkNISVFfU1JWU1RBVEVfQ0xPU0VTRU5UOgorCWNhc2UgVkNISVFfU1JWU1RBVEVfQ0xPU0VSRUNWRDoKKwkJaWYgKGlzX3NlcnZlcikgeworCQkJaWYgKHNlcnZpY2UtPmF1dG9fY2xvc2UpIHsKKwkJCQlzZXJ2aWNlLT5jbGllbnRfaWQgPSAwOworCQkJCXNlcnZpY2UtPnJlbW90ZXBvcnQgPSBWQ0hJUV9QT1JUX0ZSRUU7CisJCQkJbmV3c3RhdGUgPSBWQ0hJUV9TUlZTVEFURV9MSVNURU5JTkc7CisJCQl9IGVsc2UKKwkJCQluZXdzdGF0ZSA9IFZDSElRX1NSVlNUQVRFX0NMT1NFV0FJVDsKKwkJfSBlbHNlCisJCQluZXdzdGF0ZSA9IFZDSElRX1NSVlNUQVRFX0NMT1NFRDsKKwkJdmNoaXFfc2V0X3NlcnZpY2Vfc3RhdGUoc2VydmljZSwgbmV3c3RhdGUpOworCQlicmVhazsKKwljYXNlIFZDSElRX1NSVlNUQVRFX0xJU1RFTklORzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJImNsb3NlX3NlcnZpY2VfY29tcGxldGUoJXgpIGNhbGxlZCBpbiBzdGF0ZSAlcyIsCisJCQlzZXJ2aWNlLT5oYW5kbGUsIHNydnN0YXRlX25hbWVzW3NlcnZpY2UtPnNydnN0YXRlXSk7CisJCVdBUk4oMSwgImNsb3NlX3NlcnZpY2VfY29tcGxldGUgaW4gdW5leHBlY3RlZCBzdGF0ZVxuIik7CisJCXJldHVybiBWQ0hJUV9FUlJPUjsKKwl9CisKKwlzdGF0dXMgPSBtYWtlX3NlcnZpY2VfY2FsbGJhY2soc2VydmljZSwKKwkJVkNISVFfU0VSVklDRV9DTE9TRUQsIE5VTEwsIE5VTEwpOworCisJaWYgKHN0YXR1cyAhPSBWQ0hJUV9SRVRSWSkgeworCQlpbnQgdWMgPSBzZXJ2aWNlLT5zZXJ2aWNlX3VzZV9jb3VudDsKKwkJaW50IGk7CisJCS8qIENvbXBsZXRlIHRoZSBjbG9zZSBwcm9jZXNzICovCisJCWZvciAoaSA9IDA7IGkgPCB1YzsgaSsrKQorCQkJLyogY2F0ZXIgZm9yIGNhc2VzIHdoZXJlIGNsb3NlIGlzIGZvcmNlZCBhbmQgdGhlCisJCQkqKiBjbGllbnQgbWF5IG5vdCBjbG9zZSBhbGwgaXQncyBoYW5kbGVzICovCisJCQl2Y2hpcV9yZWxlYXNlX3NlcnZpY2VfaW50ZXJuYWwoc2VydmljZSk7CisKKwkJc2VydmljZS0+Y2xpZW50X2lkID0gMDsKKwkJc2VydmljZS0+cmVtb3RlcG9ydCA9IFZDSElRX1BPUlRfRlJFRTsKKworCQlpZiAoc2VydmljZS0+c3J2c3RhdGUgPT0gVkNISVFfU1JWU1RBVEVfQ0xPU0VEKQorCQkJdmNoaXFfZnJlZV9zZXJ2aWNlX2ludGVybmFsKHNlcnZpY2UpOworCQllbHNlIGlmIChzZXJ2aWNlLT5zcnZzdGF0ZSAhPSBWQ0hJUV9TUlZTVEFURV9DTE9TRVdBSVQpIHsKKwkJCWlmIChpc19zZXJ2ZXIpCisJCQkJc2VydmljZS0+Y2xvc2luZyA9IDA7CisKKwkJCXVwKCZzZXJ2aWNlLT5yZW1vdmVfZXZlbnQpOworCQl9CisJfSBlbHNlCisJCXZjaGlxX3NldF9zZXJ2aWNlX3N0YXRlKHNlcnZpY2UsIGZhaWxzdGF0ZSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBDYWxsZWQgYnkgdGhlIHNsb3QgaGFuZGxlciAqLworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX2Nsb3NlX3NlcnZpY2VfaW50ZXJuYWwoVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlLCBpbnQgY2xvc2VfcmVjdmQpCit7CisJVkNISVFfU1RBVEVfVCAqc3RhdGUgPSBzZXJ2aWNlLT5zdGF0ZTsKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXMgPSBWQ0hJUV9TVUNDRVNTOworCWludCBpc19zZXJ2ZXIgPSAoc2VydmljZS0+cHVibGljX2ZvdXJjYyAhPSBWQ0hJUV9GT1VSQ0NfSU5WQUxJRCk7CisKKwl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwgIiVkOiBjc2k6JWQsJWQgKCVzKSIsCisJCXNlcnZpY2UtPnN0YXRlLT5pZCwgc2VydmljZS0+bG9jYWxwb3J0LCBjbG9zZV9yZWN2ZCwKKwkJc3J2c3RhdGVfbmFtZXNbc2VydmljZS0+c3J2c3RhdGVdKTsKKworCXN3aXRjaCAoc2VydmljZS0+c3J2c3RhdGUpIHsKKwljYXNlIFZDSElRX1NSVlNUQVRFX0NMT1NFRDoKKwljYXNlIFZDSElRX1NSVlNUQVRFX0hJRERFTjoKKwljYXNlIFZDSElRX1NSVlNUQVRFX0xJU1RFTklORzoKKwljYXNlIFZDSElRX1NSVlNUQVRFX0NMT1NFV0FJVDoKKwkJaWYgKGNsb3NlX3JlY3ZkKQorCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCSJ2Y2hpcV9jbG9zZV9zZXJ2aWNlX2ludGVybmFsKDEpIGNhbGxlZCAiCisJCQkJImluIHN0YXRlICVzIiwKKwkJCQlzcnZzdGF0ZV9uYW1lc1tzZXJ2aWNlLT5zcnZzdGF0ZV0pOworCQllbHNlIGlmIChpc19zZXJ2ZXIpIHsKKwkJCWlmIChzZXJ2aWNlLT5zcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9MSVNURU5JTkcpIHsKKwkJCQlzdGF0dXMgPSBWQ0hJUV9FUlJPUjsKKwkJCX0gZWxzZSB7CisJCQkJc2VydmljZS0+Y2xpZW50X2lkID0gMDsKKwkJCQlzZXJ2aWNlLT5yZW1vdGVwb3J0ID0gVkNISVFfUE9SVF9GUkVFOworCQkJCWlmIChzZXJ2aWNlLT5zcnZzdGF0ZSA9PQorCQkJCQlWQ0hJUV9TUlZTVEFURV9DTE9TRVdBSVQpCisJCQkJCXZjaGlxX3NldF9zZXJ2aWNlX3N0YXRlKHNlcnZpY2UsCisJCQkJCQlWQ0hJUV9TUlZTVEFURV9MSVNURU5JTkcpOworCQkJfQorCQkJdXAoJnNlcnZpY2UtPnJlbW92ZV9ldmVudCk7CisJCX0gZWxzZQorCQkJdmNoaXFfZnJlZV9zZXJ2aWNlX2ludGVybmFsKHNlcnZpY2UpOworCQlicmVhazsKKwljYXNlIFZDSElRX1NSVlNUQVRFX09QRU5JTkc6CisJCWlmIChjbG9zZV9yZWN2ZCkgeworCQkJLyogVGhlIG9wZW4gd2FzIHJlamVjdGVkIC0gdGVsbCB0aGUgdXNlciAqLworCQkJdmNoaXFfc2V0X3NlcnZpY2Vfc3RhdGUoc2VydmljZSwKKwkJCQlWQ0hJUV9TUlZTVEFURV9DTE9TRVdBSVQpOworCQkJdXAoJnNlcnZpY2UtPnJlbW92ZV9ldmVudCk7CisJCX0gZWxzZSB7CisJCQkvKiBTaHV0ZG93biBtaWQtb3BlbiAtIGxldCB0aGUgb3RoZXIgc2lkZSBrbm93ICovCisJCQlzdGF0dXMgPSBxdWV1ZV9tZXNzYWdlKHN0YXRlLCBzZXJ2aWNlLAorCQkJCVZDSElRX01BS0VfTVNHCisJCQkJKFZDSElRX01TR19DTE9TRSwKKwkJCQlzZXJ2aWNlLT5sb2NhbHBvcnQsCisJCQkJVkNISVFfTVNHX0RTVFBPUlQoc2VydmljZS0+cmVtb3RlcG9ydCkpLAorCQkJCU5VTEwsIDAsIDAsIDApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBWQ0hJUV9TUlZTVEFURV9PUEVOU1lOQzoKKwkJbXV0ZXhfbG9jaygmc3RhdGUtPnN5bmNfbXV0ZXgpOworCQkvKiBEcm9wIHRocm91Z2ggKi8KKworCWNhc2UgVkNISVFfU1JWU1RBVEVfT1BFTjoKKwkJaWYgKHN0YXRlLT5pc19tYXN0ZXIgfHwgY2xvc2VfcmVjdmQpIHsKKwkJCWlmICghZG9fYWJvcnRfYnVsa3Moc2VydmljZSkpCisJCQkJc3RhdHVzID0gVkNISVFfUkVUUlk7CisJCX0KKworCQlyZWxlYXNlX3NlcnZpY2VfbWVzc2FnZXMoc2VydmljZSk7CisKKwkJaWYgKHN0YXR1cyA9PSBWQ0hJUV9TVUNDRVNTKQorCQkJc3RhdHVzID0gcXVldWVfbWVzc2FnZShzdGF0ZSwgc2VydmljZSwKKwkJCQlWQ0hJUV9NQUtFX01TRworCQkJCShWQ0hJUV9NU0dfQ0xPU0UsCisJCQkJc2VydmljZS0+bG9jYWxwb3J0LAorCQkJCVZDSElRX01TR19EU1RQT1JUKHNlcnZpY2UtPnJlbW90ZXBvcnQpKSwKKwkJCQlOVUxMLCAwLCAwLCBRTUZMQUdTX05PX01VVEVYX1VOTE9DSyk7CisKKwkJaWYgKHN0YXR1cyA9PSBWQ0hJUV9TVUNDRVNTKSB7CisJCQlpZiAoIWNsb3NlX3JlY3ZkKSB7CisJCQkJLyogQ2hhbmdlIHRoZSBzdGF0ZSB3aGlsZSB0aGUgbXV0ZXggaXMKKwkJCQkgICBzdGlsbCBoZWxkICovCisJCQkJdmNoaXFfc2V0X3NlcnZpY2Vfc3RhdGUoc2VydmljZSwKKwkJCQkJCQlWQ0hJUV9TUlZTVEFURV9DTE9TRVNFTlQpOworCQkJCW11dGV4X3VubG9jaygmc3RhdGUtPnNsb3RfbXV0ZXgpOworCQkJCWlmIChzZXJ2aWNlLT5zeW5jKQorCQkJCQltdXRleF91bmxvY2soJnN0YXRlLT5zeW5jX211dGV4KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIGlmIChzZXJ2aWNlLT5zcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9PUEVOU1lOQykgeworCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c3luY19tdXRleCk7CisJCQlicmVhazsKKwkJfSBlbHNlCisJCQlicmVhazsKKworCQkvKiBDaGFuZ2UgdGhlIHN0YXRlIHdoaWxlIHRoZSBtdXRleCBpcyBzdGlsbCBoZWxkICovCisJCXZjaGlxX3NldF9zZXJ2aWNlX3N0YXRlKHNlcnZpY2UsIFZDSElRX1NSVlNUQVRFX0NMT1NFUkVDVkQpOworCQltdXRleF91bmxvY2soJnN0YXRlLT5zbG90X211dGV4KTsKKwkJaWYgKHNlcnZpY2UtPnN5bmMpCisJCQltdXRleF91bmxvY2soJnN0YXRlLT5zeW5jX211dGV4KTsKKworCQlzdGF0dXMgPSBjbG9zZV9zZXJ2aWNlX2NvbXBsZXRlKHNlcnZpY2UsCisJCQkJVkNISVFfU1JWU1RBVEVfQ0xPU0VSRUNWRCk7CisJCWJyZWFrOworCisJY2FzZSBWQ0hJUV9TUlZTVEFURV9DTE9TRVNFTlQ6CisJCWlmICghY2xvc2VfcmVjdmQpCisJCQkvKiBUaGlzIGhhcHBlbnMgd2hlbiBhIHByb2Nlc3MgaXMga2lsbGVkIG1pZC1jbG9zZSAqLworCQkJYnJlYWs7CisKKwkJaWYgKCFzdGF0ZS0+aXNfbWFzdGVyKSB7CisJCQlpZiAoIWRvX2Fib3J0X2J1bGtzKHNlcnZpY2UpKSB7CisJCQkJc3RhdHVzID0gVkNISVFfUkVUUlk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoc3RhdHVzID09IFZDSElRX1NVQ0NFU1MpCisJCQlzdGF0dXMgPSBjbG9zZV9zZXJ2aWNlX2NvbXBsZXRlKHNlcnZpY2UsCisJCQkJVkNISVFfU1JWU1RBVEVfQ0xPU0VSRUNWRCk7CisJCWJyZWFrOworCisJY2FzZSBWQ0hJUV9TUlZTVEFURV9DTE9TRVJFQ1ZEOgorCQlpZiAoIWNsb3NlX3JlY3ZkICYmIGlzX3NlcnZlcikKKwkJCS8qIEZvcmNlIGludG8gTElTVEVOSU5HIG1vZGUgKi8KKwkJCXZjaGlxX3NldF9zZXJ2aWNlX3N0YXRlKHNlcnZpY2UsCisJCQkJVkNISVFfU1JWU1RBVEVfTElTVEVOSU5HKTsKKwkJc3RhdHVzID0gY2xvc2Vfc2VydmljZV9jb21wbGV0ZShzZXJ2aWNlLAorCQkJVkNISVFfU1JWU1RBVEVfQ0xPU0VSRUNWRCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJInZjaGlxX2Nsb3NlX3NlcnZpY2VfaW50ZXJuYWwoJWQpIGNhbGxlZCBpbiBzdGF0ZSAlcyIsCisJCQljbG9zZV9yZWN2ZCwgc3J2c3RhdGVfbmFtZXNbc2VydmljZS0+c3J2c3RhdGVdKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogQ2FsbGVkIGZyb20gdGhlIGFwcGxpY2F0aW9uIHByb2Nlc3MgdXBvbiBwcm9jZXNzIGRlYXRoICovCit2b2lkCit2Y2hpcV90ZXJtaW5hdGVfc2VydmljZV9pbnRlcm5hbChWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UpCit7CisJVkNISVFfU1RBVEVfVCAqc3RhdGUgPSBzZXJ2aWNlLT5zdGF0ZTsKKworCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2NvcmVfbG9nX2xldmVsLCAiJWQ6IHRzaSAtICglZDwtPiVkKSIsCisJCXN0YXRlLT5pZCwgc2VydmljZS0+bG9jYWxwb3J0LCBzZXJ2aWNlLT5yZW1vdGVwb3J0KTsKKworCW1hcmtfc2VydmljZV9jbG9zaW5nKHNlcnZpY2UpOworCisJLyogTWFyayB0aGUgc2VydmljZSBmb3IgcmVtb3ZhbCBieSB0aGUgc2xvdCBoYW5kbGVyICovCisJcmVxdWVzdF9wb2xsKHN0YXRlLCBzZXJ2aWNlLCBWQ0hJUV9QT0xMX1JFTU9WRSk7Cit9CisKKy8qIENhbGxlZCBmcm9tIHRoZSBzbG90IGhhbmRsZXIgKi8KK3ZvaWQKK3ZjaGlxX2ZyZWVfc2VydmljZV9pbnRlcm5hbChWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UpCit7CisJVkNISVFfU1RBVEVfVCAqc3RhdGUgPSBzZXJ2aWNlLT5zdGF0ZTsKKworCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2NvcmVfbG9nX2xldmVsLCAiJWQ6IGZzaSAtICglZCkiLAorCQlzdGF0ZS0+aWQsIHNlcnZpY2UtPmxvY2FscG9ydCk7CisKKwlzd2l0Y2ggKHNlcnZpY2UtPnNydnN0YXRlKSB7CisJY2FzZSBWQ0hJUV9TUlZTVEFURV9PUEVOSU5HOgorCWNhc2UgVkNISVFfU1JWU1RBVEVfQ0xPU0VEOgorCWNhc2UgVkNISVFfU1JWU1RBVEVfSElEREVOOgorCWNhc2UgVkNISVFfU1JWU1RBVEVfTElTVEVOSU5HOgorCWNhc2UgVkNISVFfU1JWU1RBVEVfQ0xPU0VXQUlUOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkiJWQ6IGZzaSAtICglZCkgaW4gc3RhdGUgJXMiLAorCQkJc3RhdGUtPmlkLCBzZXJ2aWNlLT5sb2NhbHBvcnQsCisJCQlzcnZzdGF0ZV9uYW1lc1tzZXJ2aWNlLT5zcnZzdGF0ZV0pOworCQlyZXR1cm47CisJfQorCisJdmNoaXFfc2V0X3NlcnZpY2Vfc3RhdGUoc2VydmljZSwgVkNISVFfU1JWU1RBVEVfRlJFRSk7CisKKwl1cCgmc2VydmljZS0+cmVtb3ZlX2V2ZW50KTsKKworCS8qIFJlbGVhc2UgdGhlIGluaXRpYWwgbG9jayAqLworCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworfQorCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfY29ubmVjdF9pbnRlcm5hbChWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSkKK3sKKwlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2U7CisJaW50IGk7CisKKwkvKiBGaW5kIGFsbCBzZXJ2aWNlcyByZWdpc3RlcmVkIHRvIHRoaXMgY2xpZW50IGFuZCBlbmFibGUgdGhlbS4gKi8KKwlpID0gMDsKKwl3aGlsZSAoKHNlcnZpY2UgPSBuZXh0X3NlcnZpY2VfYnlfaW5zdGFuY2Uoc3RhdGUsIGluc3RhbmNlLAorCQkmaSkpICE9CU5VTEwpIHsKKwkJaWYgKHNlcnZpY2UtPnNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX0hJRERFTikKKwkJCXZjaGlxX3NldF9zZXJ2aWNlX3N0YXRlKHNlcnZpY2UsCisJCQkJVkNISVFfU1JWU1RBVEVfTElTVEVOSU5HKTsKKwkJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisJfQorCisJaWYgKHN0YXRlLT5jb25uX3N0YXRlID09IFZDSElRX0NPTk5TVEFURV9ESVNDT05ORUNURUQpIHsKKwkJaWYgKHF1ZXVlX21lc3NhZ2Uoc3RhdGUsIE5VTEwsCisJCQlWQ0hJUV9NQUtFX01TRyhWQ0hJUV9NU0dfQ09OTkVDVCwgMCwgMCksIE5VTEwsIDAsCisJCQkwLCBRTUZMQUdTX0lTX0JMT0NLSU5HKSA9PSBWQ0hJUV9SRVRSWSkKKwkJCXJldHVybiBWQ0hJUV9SRVRSWTsKKworCQl2Y2hpcV9zZXRfY29ubl9zdGF0ZShzdGF0ZSwgVkNISVFfQ09OTlNUQVRFX0NPTk5FQ1RJTkcpOworCX0KKworCWlmIChzdGF0ZS0+Y29ubl9zdGF0ZSA9PSBWQ0hJUV9DT05OU1RBVEVfQ09OTkVDVElORykgeworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+Y29ubmVjdCkgIT0gMCkKKwkJCXJldHVybiBWQ0hJUV9SRVRSWTsKKworCQl2Y2hpcV9zZXRfY29ubl9zdGF0ZShzdGF0ZSwgVkNISVFfQ09OTlNUQVRFX0NPTk5FQ1RFRCk7CisJCXVwKCZzdGF0ZS0+Y29ubmVjdCk7CisJfQorCisJcmV0dXJuIFZDSElRX1NVQ0NFU1M7Cit9CisKK1ZDSElRX1NUQVRVU19UCit2Y2hpcV9zaHV0ZG93bl9pbnRlcm5hbChWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSkKK3sKKwlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2U7CisJaW50IGk7CisKKwkvKiBGaW5kIGFsbCBzZXJ2aWNlcyByZWdpc3RlcmVkIHRvIHRoaXMgY2xpZW50IGFuZCBlbmFibGUgdGhlbS4gKi8KKwlpID0gMDsKKwl3aGlsZSAoKHNlcnZpY2UgPSBuZXh0X3NlcnZpY2VfYnlfaW5zdGFuY2Uoc3RhdGUsIGluc3RhbmNlLAorCQkmaSkpICE9CU5VTEwpIHsKKwkJKHZvaWQpdmNoaXFfcmVtb3ZlX3NlcnZpY2Uoc2VydmljZS0+aGFuZGxlKTsKKwkJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisJfQorCisJcmV0dXJuIFZDSElRX1NVQ0NFU1M7Cit9CisKK1ZDSElRX1NUQVRVU19UCit2Y2hpcV9wYXVzZV9pbnRlcm5hbChWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXMgPSBWQ0hJUV9TVUNDRVNTOworCisJc3dpdGNoIChzdGF0ZS0+Y29ubl9zdGF0ZSkgeworCWNhc2UgVkNISVFfQ09OTlNUQVRFX0NPTk5FQ1RFRDoKKwkJLyogUmVxdWVzdCBhIHBhdXNlICovCisJCXZjaGlxX3NldF9jb25uX3N0YXRlKHN0YXRlLCBWQ0hJUV9DT05OU1RBVEVfUEFVU0lORyk7CisJCXJlcXVlc3RfcG9sbChzdGF0ZSwgTlVMTCwgMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCSJ2Y2hpcV9wYXVzZV9pbnRlcm5hbCBpbiBzdGF0ZSAlc1xuIiwKKwkJCWNvbm5fc3RhdGVfbmFtZXNbc3RhdGUtPmNvbm5fc3RhdGVdKTsKKwkJc3RhdHVzID0gVkNISVFfRVJST1I7CisJCVZDSElRX1NUQVRTX0lOQyhzdGF0ZSwgZXJyb3JfY291bnQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfcmVzdW1lX2ludGVybmFsKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCVZDSElRX1NUQVRVU19UIHN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisKKwlpZiAoc3RhdGUtPmNvbm5fc3RhdGUgPT0gVkNISVFfQ09OTlNUQVRFX1BBVVNFRCkgeworCQl2Y2hpcV9zZXRfY29ubl9zdGF0ZShzdGF0ZSwgVkNISVFfQ09OTlNUQVRFX1JFU1VNSU5HKTsKKwkJcmVxdWVzdF9wb2xsKHN0YXRlLCBOVUxMLCAwKTsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSBWQ0hJUV9FUlJPUjsKKwkJVkNISVFfU1RBVFNfSU5DKHN0YXRlLCBlcnJvcl9jb3VudCk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX2Nsb3NlX3NlcnZpY2UoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUpCit7CisJLyogVW5yZWdpc3RlciB0aGUgc2VydmljZSAqLworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IGZpbmRfc2VydmljZV9ieV9oYW5kbGUoaGFuZGxlKTsKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXMgPSBWQ0hJUV9TVUNDRVNTOworCisJaWYgKCFzZXJ2aWNlKQorCQlyZXR1cm4gVkNISVFfRVJST1I7CisKKwl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJIiVkOiBjbG9zZV9zZXJ2aWNlOiVkIiwKKwkJc2VydmljZS0+c3RhdGUtPmlkLCBzZXJ2aWNlLT5sb2NhbHBvcnQpOworCisJaWYgKChzZXJ2aWNlLT5zcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9GUkVFKSB8fAorCQkoc2VydmljZS0+c3J2c3RhdGUgPT0gVkNISVFfU1JWU1RBVEVfTElTVEVOSU5HKSB8fAorCQkoc2VydmljZS0+c3J2c3RhdGUgPT0gVkNISVFfU1JWU1RBVEVfSElEREVOKSkgeworCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKwkJcmV0dXJuIFZDSElRX0VSUk9SOworCX0KKworCW1hcmtfc2VydmljZV9jbG9zaW5nKHNlcnZpY2UpOworCisJaWYgKGN1cnJlbnQgPT0gc2VydmljZS0+c3RhdGUtPnNsb3RfaGFuZGxlcl90aHJlYWQpIHsKKwkJc3RhdHVzID0gdmNoaXFfY2xvc2Vfc2VydmljZV9pbnRlcm5hbChzZXJ2aWNlLAorCQkJMC8qIWNsb3NlX3JlY3ZkKi8pOworCQlCVUdfT04oc3RhdHVzID09IFZDSElRX1JFVFJZKTsKKwl9IGVsc2UgeworCS8qIE1hcmsgdGhlIHNlcnZpY2UgZm9yIHRlcm1pbmF0aW9uIGJ5IHRoZSBzbG90IGhhbmRsZXIgKi8KKwkJcmVxdWVzdF9wb2xsKHNlcnZpY2UtPnN0YXRlLCBzZXJ2aWNlLCBWQ0hJUV9QT0xMX1RFUk1JTkFURSk7CisJfQorCisJd2hpbGUgKDEpIHsKKwkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmc2VydmljZS0+cmVtb3ZlX2V2ZW50KSAhPSAwKSB7CisJCQlzdGF0dXMgPSBWQ0hJUV9SRVRSWTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKChzZXJ2aWNlLT5zcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9GUkVFKSB8fAorCQkJKHNlcnZpY2UtPnNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX0xJU1RFTklORykgfHwKKwkJCShzZXJ2aWNlLT5zcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9PUEVOKSkKKwkJCWJyZWFrOworCisJCXZjaGlxX2xvZ193YXJuaW5nKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJIiVkOiBjbG9zZV9zZXJ2aWNlOiVkIC0gd2FpdGluZyBpbiBzdGF0ZSAlcyIsCisJCQlzZXJ2aWNlLT5zdGF0ZS0+aWQsIHNlcnZpY2UtPmxvY2FscG9ydCwKKwkJCXNydnN0YXRlX25hbWVzW3NlcnZpY2UtPnNydnN0YXRlXSk7CisJfQorCisJaWYgKChzdGF0dXMgPT0gVkNISVFfU1VDQ0VTUykgJiYKKwkJKHNlcnZpY2UtPnNydnN0YXRlICE9IFZDSElRX1NSVlNUQVRFX0ZSRUUpICYmCisJCShzZXJ2aWNlLT5zcnZzdGF0ZSAhPSBWQ0hJUV9TUlZTVEFURV9MSVNURU5JTkcpKQorCQlzdGF0dXMgPSBWQ0hJUV9FUlJPUjsKKworCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3JlbW92ZV9zZXJ2aWNlKFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlKQoreworCS8qIFVucmVnaXN0ZXIgdGhlIHNlcnZpY2UgKi8KKwlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UgPSBmaW5kX3NlcnZpY2VfYnlfaGFuZGxlKGhhbmRsZSk7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzID0gVkNISVFfU1VDQ0VTUzsKKworCWlmICghc2VydmljZSkKKwkJcmV0dXJuIFZDSElRX0VSUk9SOworCisJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCSIlZDogcmVtb3ZlX3NlcnZpY2U6JWQiLAorCQlzZXJ2aWNlLT5zdGF0ZS0+aWQsIHNlcnZpY2UtPmxvY2FscG9ydCk7CisKKwlpZiAoc2VydmljZS0+c3J2c3RhdGUgPT0gVkNISVFfU1JWU1RBVEVfRlJFRSkgeworCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKwkJcmV0dXJuIFZDSElRX0VSUk9SOworCX0KKworCW1hcmtfc2VydmljZV9jbG9zaW5nKHNlcnZpY2UpOworCisJaWYgKChzZXJ2aWNlLT5zcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9ISURERU4pIHx8CisJCShjdXJyZW50ID09IHNlcnZpY2UtPnN0YXRlLT5zbG90X2hhbmRsZXJfdGhyZWFkKSkgeworCQkvKiBNYWtlIGl0IGxvb2sgbGlrZSBhIGNsaWVudCwgYmVjYXVzZSBpdCBtdXN0IGJlIHJlbW92ZWQgYW5kCisJCSAgIG5vdCBsZWZ0IGluIHRoZSBMSVNURU5JTkcgc3RhdGUuICovCisJCXNlcnZpY2UtPnB1YmxpY19mb3VyY2MgPSBWQ0hJUV9GT1VSQ0NfSU5WQUxJRDsKKworCQlzdGF0dXMgPSB2Y2hpcV9jbG9zZV9zZXJ2aWNlX2ludGVybmFsKHNlcnZpY2UsCisJCQkwLyohY2xvc2VfcmVjdmQqLyk7CisJCUJVR19PTihzdGF0dXMgPT0gVkNISVFfUkVUUlkpOworCX0gZWxzZSB7CisJCS8qIE1hcmsgdGhlIHNlcnZpY2UgZm9yIHJlbW92YWwgYnkgdGhlIHNsb3QgaGFuZGxlciAqLworCQlyZXF1ZXN0X3BvbGwoc2VydmljZS0+c3RhdGUsIHNlcnZpY2UsIFZDSElRX1BPTExfUkVNT1ZFKTsKKwl9CisJd2hpbGUgKDEpIHsKKwkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmc2VydmljZS0+cmVtb3ZlX2V2ZW50KSAhPSAwKSB7CisJCQlzdGF0dXMgPSBWQ0hJUV9SRVRSWTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKChzZXJ2aWNlLT5zcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9GUkVFKSB8fAorCQkJKHNlcnZpY2UtPnNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX09QRU4pKQorCQkJYnJlYWs7CisKKwkJdmNoaXFfbG9nX3dhcm5pbmcodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkiJWQ6IHJlbW92ZV9zZXJ2aWNlOiVkIC0gd2FpdGluZyBpbiBzdGF0ZSAlcyIsCisJCQlzZXJ2aWNlLT5zdGF0ZS0+aWQsIHNlcnZpY2UtPmxvY2FscG9ydCwKKwkJCXNydnN0YXRlX25hbWVzW3NlcnZpY2UtPnNydnN0YXRlXSk7CisJfQorCisJaWYgKChzdGF0dXMgPT0gVkNISVFfU1VDQ0VTUykgJiYKKwkJKHNlcnZpY2UtPnNydnN0YXRlICE9IFZDSElRX1NSVlNUQVRFX0ZSRUUpKQorCQlzdGF0dXMgPSBWQ0hJUV9FUlJPUjsKKworCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworCisvKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgYnkga2VybmVsIHRocmVhZHMgb3IgdXNlciB0aHJlYWRzLgorICogVXNlciB0aHJlYWRzIG1heSByZWNlaXZlIFZDSElRX1JFVFJZIHRvIGluZGljYXRlIHRoYXQgYSBzaWduYWwgaGFzIGJlZW4KKyAqIHJlY2VpdmVkIGFuZCB0aGUgY2FsbCBzaG91bGQgYmUgcmV0cmllZCBhZnRlciBiZWluZyByZXR1cm5lZCB0byB1c2VyCisgKiBjb250ZXh0LgorICogV2hlbiBjYWxsZWQgaW4gYmxvY2tpbmcgbW9kZSwgdGhlIHVzZXJkYXRhIGZpZWxkIHBvaW50cyB0byBhIGJ1bGtfd2FpdGVyCisgKiBzdHJ1Y3R1cmUuCisgKi8KK1ZDSElRX1NUQVRVU19UCit2Y2hpcV9idWxrX3RyYW5zZmVyKFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorCVZDSElfTUVNX0hBTkRMRV9UIG1lbWhhbmRsZSwgdm9pZCAqb2Zmc2V0LCBpbnQgc2l6ZSwgdm9pZCAqdXNlcmRhdGEsCisJVkNISVFfQlVMS19NT0RFX1QgbW9kZSwgVkNISVFfQlVMS19ESVJfVCBkaXIpCit7CisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlID0gZmluZF9zZXJ2aWNlX2J5X2hhbmRsZShoYW5kbGUpOworCVZDSElRX0JVTEtfUVVFVUVfVCAqcXVldWU7CisJVkNISVFfQlVMS19UICpidWxrOworCVZDSElRX1NUQVRFX1QgKnN0YXRlOworCXN0cnVjdCBidWxrX3dhaXRlciAqYnVsa193YWl0ZXIgPSBOVUxMOworCWNvbnN0IGNoYXIgZGlyX2NoYXIgPSAoZGlyID09IFZDSElRX0JVTEtfVFJBTlNNSVQpID8gJ3QnIDogJ3InOworCWNvbnN0IGludCBkaXJfbXNndHlwZSA9IChkaXIgPT0gVkNISVFfQlVMS19UUkFOU01JVCkgPworCQlWQ0hJUV9NU0dfQlVMS19UWCA6IFZDSElRX01TR19CVUxLX1JYOworCVZDSElRX1NUQVRVU19UIHN0YXR1cyA9IFZDSElRX0VSUk9SOworCisJaWYgKCFzZXJ2aWNlIHx8CisJCSAoc2VydmljZS0+c3J2c3RhdGUgIT0gVkNISVFfU1JWU1RBVEVfT1BFTikgfHwKKwkJICgobWVtaGFuZGxlID09IFZDSElfTUVNX0hBTkRMRV9JTlZBTElEKSAmJiAob2Zmc2V0ID09IE5VTEwpKSB8fAorCQkgKHZjaGlxX2NoZWNrX3NlcnZpY2Uoc2VydmljZSkgIT0gVkNISVFfU1VDQ0VTUykpCisJCWdvdG8gZXJyb3JfZXhpdDsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgVkNISVFfQlVMS19NT0RFX05PQ0FMTEJBQ0s6CisJY2FzZSBWQ0hJUV9CVUxLX01PREVfQ0FMTEJBQ0s6CisJCWJyZWFrOworCWNhc2UgVkNISVFfQlVMS19NT0RFX0JMT0NLSU5HOgorCQlidWxrX3dhaXRlciA9IChzdHJ1Y3QgYnVsa193YWl0ZXIgKil1c2VyZGF0YTsKKwkJc2VtYV9pbml0KCZidWxrX3dhaXRlci0+ZXZlbnQsIDApOworCQlidWxrX3dhaXRlci0+YWN0dWFsID0gMDsKKwkJYnVsa193YWl0ZXItPmJ1bGsgPSBOVUxMOworCQlicmVhazsKKwljYXNlIFZDSElRX0JVTEtfTU9ERV9XQUlUSU5HOgorCQlidWxrX3dhaXRlciA9IChzdHJ1Y3QgYnVsa193YWl0ZXIgKil1c2VyZGF0YTsKKwkJYnVsayA9IGJ1bGtfd2FpdGVyLT5idWxrOworCQlnb3RvIHdhaXRpbmc7CisJZGVmYXVsdDoKKwkJZ290byBlcnJvcl9leGl0OworCX0KKworCXN0YXRlID0gc2VydmljZS0+c3RhdGU7CisKKwlxdWV1ZSA9IChkaXIgPT0gVkNISVFfQlVMS19UUkFOU01JVCkgPworCQkmc2VydmljZS0+YnVsa190eCA6ICZzZXJ2aWNlLT5idWxrX3J4OworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc2VydmljZS0+YnVsa19tdXRleCkgIT0gMCkgeworCQlzdGF0dXMgPSBWQ0hJUV9SRVRSWTsKKwkJZ290byBlcnJvcl9leGl0OworCX0KKworCWlmIChxdWV1ZS0+bG9jYWxfaW5zZXJ0ID09IHF1ZXVlLT5yZW1vdmUgKyBWQ0hJUV9OVU1fU0VSVklDRV9CVUxLUykgeworCQlWQ0hJUV9TRVJWSUNFX1NUQVRTX0lOQyhzZXJ2aWNlLCBidWxrX3N0YWxscyk7CisJCWRvIHsKKwkJCW11dGV4X3VubG9jaygmc2VydmljZS0+YnVsa19tdXRleCk7CisJCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZzZXJ2aWNlLT5idWxrX3JlbW92ZV9ldmVudCkKKwkJCQkhPSAwKSB7CisJCQkJc3RhdHVzID0gVkNISVFfUkVUUlk7CisJCQkJZ290byBlcnJvcl9leGl0OworCQkJfQorCQkJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc2VydmljZS0+YnVsa19tdXRleCkKKwkJCQkhPSAwKSB7CisJCQkJc3RhdHVzID0gVkNISVFfUkVUUlk7CisJCQkJZ290byBlcnJvcl9leGl0OworCQkJfQorCQl9IHdoaWxlIChxdWV1ZS0+bG9jYWxfaW5zZXJ0ID09IHF1ZXVlLT5yZW1vdmUgKworCQkJCVZDSElRX05VTV9TRVJWSUNFX0JVTEtTKTsKKwl9CisKKwlidWxrID0gJnF1ZXVlLT5idWxrc1tCVUxLX0lOREVYKHF1ZXVlLT5sb2NhbF9pbnNlcnQpXTsKKworCWJ1bGstPm1vZGUgPSBtb2RlOworCWJ1bGstPmRpciA9IGRpcjsKKwlidWxrLT51c2VyZGF0YSA9IHVzZXJkYXRhOworCWJ1bGstPnNpemUgPSBzaXplOworCWJ1bGstPmFjdHVhbCA9IFZDSElRX0JVTEtfQUNUVUFMX0FCT1JURUQ7CisKKwlpZiAodmNoaXFfcHJlcGFyZV9idWxrX2RhdGEoYnVsaywgbWVtaGFuZGxlLCBvZmZzZXQsIHNpemUsIGRpcikgIT0KKwkJVkNISVFfU1VDQ0VTUykKKwkJZ290byB1bmxvY2tfZXJyb3JfZXhpdDsKKworCXdtYigpOworCisJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCSIlZDogYnQgKCVkLT4lZCkgJWN4ICV4QCV4ICV4IiwKKwkJc3RhdGUtPmlkLAorCQlzZXJ2aWNlLT5sb2NhbHBvcnQsIHNlcnZpY2UtPnJlbW90ZXBvcnQsIGRpcl9jaGFyLAorCQlzaXplLCAodW5zaWduZWQgaW50KWJ1bGstPmRhdGEsICh1bnNpZ25lZCBpbnQpdXNlcmRhdGEpOworCisJLyogVGhlIHNsb3QgbXV0ZXggbXVzdCBiZSBoZWxkIHdoZW4gdGhlIHNlcnZpY2UgaXMgYmVpbmcgY2xvc2VkLCBzbworCSAgIGNsYWltIGl0IGhlcmUgdG8gZW5zdXJlIHRoYXQgaXNuJ3QgaGFwcGVuaW5nICovCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc3RhdGUtPnNsb3RfbXV0ZXgpICE9IDApIHsKKwkJc3RhdHVzID0gVkNISVFfUkVUUlk7CisJCWdvdG8gY2FuY2VsX2J1bGtfZXJyb3JfZXhpdDsKKwl9CisKKwlpZiAoc2VydmljZS0+c3J2c3RhdGUgIT0gVkNISVFfU1JWU1RBVEVfT1BFTikKKwkJZ290byB1bmxvY2tfYm90aF9lcnJvcl9leGl0OworCisJaWYgKHN0YXRlLT5pc19tYXN0ZXIpIHsKKwkJcXVldWUtPmxvY2FsX2luc2VydCsrOworCQlpZiAocmVzb2x2ZV9idWxrcyhzZXJ2aWNlLCBxdWV1ZSkpCisJCQlyZXF1ZXN0X3BvbGwoc3RhdGUsIHNlcnZpY2UsCisJCQkJKGRpciA9PSBWQ0hJUV9CVUxLX1RSQU5TTUlUKSA/CisJCQkJVkNISVFfUE9MTF9UWE5PVElGWSA6IFZDSElRX1BPTExfUlhOT1RJRlkpOworCX0gZWxzZSB7CisJCWludCBwYXlsb2FkWzJdID0geyAoaW50KWJ1bGstPmRhdGEsIGJ1bGstPnNpemUgfTsKKwkJVkNISVFfRUxFTUVOVF9UIGVsZW1lbnQgPSB7IHBheWxvYWQsIHNpemVvZihwYXlsb2FkKSB9OworCisJCXN0YXR1cyA9IHF1ZXVlX21lc3NhZ2Uoc3RhdGUsIE5VTEwsCisJCQlWQ0hJUV9NQUtFX01TRyhkaXJfbXNndHlwZSwKKwkJCQlzZXJ2aWNlLT5sb2NhbHBvcnQsIHNlcnZpY2UtPnJlbW90ZXBvcnQpLAorCQkJJmVsZW1lbnQsIDEsIHNpemVvZihwYXlsb2FkKSwKKwkJCVFNRkxBR1NfSVNfQkxPQ0tJTkcgfAorCQkJUU1GTEFHU19OT19NVVRFWF9MT0NLIHwKKwkJCVFNRkxBR1NfTk9fTVVURVhfVU5MT0NLKTsKKwkJaWYgKHN0YXR1cyAhPSBWQ0hJUV9TVUNDRVNTKSB7CisJCQlnb3RvIHVubG9ja19ib3RoX2Vycm9yX2V4aXQ7CisJCX0KKwkJcXVldWUtPmxvY2FsX2luc2VydCsrOworCX0KKworCW11dGV4X3VubG9jaygmc3RhdGUtPnNsb3RfbXV0ZXgpOworCW11dGV4X3VubG9jaygmc2VydmljZS0+YnVsa19tdXRleCk7CisKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCSIlZDogYnQ6JWQgJWN4IGxpPSV4IHJpPSV4IHA9JXgiLAorCQlzdGF0ZS0+aWQsCisJCXNlcnZpY2UtPmxvY2FscG9ydCwgZGlyX2NoYXIsCisJCXF1ZXVlLT5sb2NhbF9pbnNlcnQsIHF1ZXVlLT5yZW1vdGVfaW5zZXJ0LCBxdWV1ZS0+cHJvY2Vzcyk7CisKK3dhaXRpbmc6CisJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisKKwlzdGF0dXMgPSBWQ0hJUV9TVUNDRVNTOworCisJaWYgKGJ1bGtfd2FpdGVyKSB7CisJCWJ1bGtfd2FpdGVyLT5idWxrID0gYnVsazsKKwkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYnVsa193YWl0ZXItPmV2ZW50KSAhPSAwKQorCQkJc3RhdHVzID0gVkNISVFfUkVUUlk7CisJCWVsc2UgaWYgKGJ1bGtfd2FpdGVyLT5hY3R1YWwgPT0gVkNISVFfQlVMS19BQ1RVQUxfQUJPUlRFRCkKKwkJCXN0YXR1cyA9IFZDSElRX0VSUk9SOworCX0KKworCXJldHVybiBzdGF0dXM7CisKK3VubG9ja19ib3RoX2Vycm9yX2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2xvdF9tdXRleCk7CitjYW5jZWxfYnVsa19lcnJvcl9leGl0OgorCXZjaGlxX2NvbXBsZXRlX2J1bGsoYnVsayk7Cit1bmxvY2tfZXJyb3JfZXhpdDoKKwltdXRleF91bmxvY2soJnNlcnZpY2UtPmJ1bGtfbXV0ZXgpOworCitlcnJvcl9leGl0OgorCWlmIChzZXJ2aWNlKQorCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfcXVldWVfbWVzc2FnZShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwKKwljb25zdCBWQ0hJUV9FTEVNRU5UX1QgKmVsZW1lbnRzLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlID0gZmluZF9zZXJ2aWNlX2J5X2hhbmRsZShoYW5kbGUpOworCVZDSElRX1NUQVRVU19UIHN0YXR1cyA9IFZDSElRX0VSUk9SOworCisJdW5zaWduZWQgaW50IHNpemUgPSAwOworCXVuc2lnbmVkIGludCBpOworCisJaWYgKCFzZXJ2aWNlIHx8CisJCSh2Y2hpcV9jaGVja19zZXJ2aWNlKHNlcnZpY2UpICE9IFZDSElRX1NVQ0NFU1MpKQorCQlnb3RvIGVycm9yX2V4aXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgKHVuc2lnbmVkIGludCljb3VudDsgaSsrKSB7CisJCWlmIChlbGVtZW50c1tpXS5zaXplKSB7CisJCQlpZiAoZWxlbWVudHNbaV0uZGF0YSA9PSBOVUxMKSB7CisJCQkJVkNISVFfU0VSVklDRV9TVEFUU19JTkMoc2VydmljZSwgZXJyb3JfY291bnQpOworCQkJCWdvdG8gZXJyb3JfZXhpdDsKKwkJCX0KKwkJCXNpemUgKz0gZWxlbWVudHNbaV0uc2l6ZTsKKwkJfQorCX0KKworCWlmIChzaXplID4gVkNISVFfTUFYX01TR19TSVpFKSB7CisJCVZDSElRX1NFUlZJQ0VfU1RBVFNfSU5DKHNlcnZpY2UsIGVycm9yX2NvdW50KTsKKwkJZ290byBlcnJvcl9leGl0OworCX0KKworCXN3aXRjaCAoc2VydmljZS0+c3J2c3RhdGUpIHsKKwljYXNlIFZDSElRX1NSVlNUQVRFX09QRU46CisJCXN0YXR1cyA9IHF1ZXVlX21lc3NhZ2Uoc2VydmljZS0+c3RhdGUsIHNlcnZpY2UsCisJCQkJVkNISVFfTUFLRV9NU0coVkNISVFfTVNHX0RBVEEsCisJCQkJCXNlcnZpY2UtPmxvY2FscG9ydCwKKwkJCQkJc2VydmljZS0+cmVtb3RlcG9ydCksCisJCQkJZWxlbWVudHMsIGNvdW50LCBzaXplLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBWQ0hJUV9TUlZTVEFURV9PUEVOU1lOQzoKKwkJc3RhdHVzID0gcXVldWVfbWVzc2FnZV9zeW5jKHNlcnZpY2UtPnN0YXRlLCBzZXJ2aWNlLAorCQkJCVZDSElRX01BS0VfTVNHKFZDSElRX01TR19EQVRBLAorCQkJCQlzZXJ2aWNlLT5sb2NhbHBvcnQsCisJCQkJCXNlcnZpY2UtPnJlbW90ZXBvcnQpLAorCQkJCWVsZW1lbnRzLCBjb3VudCwgc2l6ZSwgMSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0YXR1cyA9IFZDSElRX0VSUk9SOworCQlicmVhazsKKwl9CisKK2Vycm9yX2V4aXQ6CisJaWYgKHNlcnZpY2UpCisJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCisJcmV0dXJuIHN0YXR1czsKK30KKwordm9pZAordmNoaXFfcmVsZWFzZV9tZXNzYWdlKFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLCBWQ0hJUV9IRUFERVJfVCAqaGVhZGVyKQoreworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IGZpbmRfc2VydmljZV9ieV9oYW5kbGUoaGFuZGxlKTsKKwlWQ0hJUV9TSEFSRURfU1RBVEVfVCAqcmVtb3RlOworCVZDSElRX1NUQVRFX1QgKnN0YXRlOworCWludCBzbG90X2luZGV4OworCisJaWYgKCFzZXJ2aWNlKQorCQlyZXR1cm47CisKKwlzdGF0ZSA9IHNlcnZpY2UtPnN0YXRlOworCXJlbW90ZSA9IHN0YXRlLT5yZW1vdGU7CisKKwlzbG90X2luZGV4ID0gU0xPVF9JTkRFWF9GUk9NX0RBVEEoc3RhdGUsICh2b2lkICopaGVhZGVyKTsKKworCWlmICgoc2xvdF9pbmRleCA+PSByZW1vdGUtPnNsb3RfZmlyc3QpICYmCisJCShzbG90X2luZGV4IDw9IHJlbW90ZS0+c2xvdF9sYXN0KSkgeworCQlpbnQgbXNnaWQgPSBoZWFkZXItPm1zZ2lkOworCQlpZiAobXNnaWQgJiBWQ0hJUV9NU0dJRF9DTEFJTUVEKSB7CisJCQlWQ0hJUV9TTE9UX0lORk9fVCAqc2xvdF9pbmZvID0KKwkJCQlTTE9UX0lORk9fRlJPTV9JTkRFWChzdGF0ZSwgc2xvdF9pbmRleCk7CisKKwkJCXJlbGVhc2Vfc2xvdChzdGF0ZSwgc2xvdF9pbmZvLCBoZWFkZXIsIHNlcnZpY2UpOworCQl9CisJfSBlbHNlIGlmIChzbG90X2luZGV4ID09IHJlbW90ZS0+c2xvdF9zeW5jKQorCQlyZWxlYXNlX21lc3NhZ2Vfc3luYyhzdGF0ZSwgaGVhZGVyKTsKKworCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworfQorCitzdGF0aWMgdm9pZAorcmVsZWFzZV9tZXNzYWdlX3N5bmMoVkNISVFfU1RBVEVfVCAqc3RhdGUsIFZDSElRX0hFQURFUl9UICpoZWFkZXIpCit7CisJaGVhZGVyLT5tc2dpZCA9IFZDSElRX01TR0lEX1BBRERJTkc7CisJd21iKCk7CisJcmVtb3RlX2V2ZW50X3NpZ25hbCgmc3RhdGUtPnJlbW90ZS0+c3luY19yZWxlYXNlKTsKK30KKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX2dldF9wZWVyX3ZlcnNpb24oVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsIHNob3J0ICpwZWVyX3ZlcnNpb24pCit7CisgICBWQ0hJUV9TVEFUVVNfVCBzdGF0dXMgPSBWQ0hJUV9FUlJPUjsKKyAgIFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IGZpbmRfc2VydmljZV9ieV9oYW5kbGUoaGFuZGxlKTsKKworICAgaWYgKCFzZXJ2aWNlIHx8CisgICAgICAodmNoaXFfY2hlY2tfc2VydmljZShzZXJ2aWNlKSAhPSBWQ0hJUV9TVUNDRVNTKSB8fAorICAgICAgIXBlZXJfdmVyc2lvbikKKyAgICAgIGdvdG8gZXhpdDsKKyAgICpwZWVyX3ZlcnNpb24gPSBzZXJ2aWNlLT5wZWVyX3ZlcnNpb247CisgICBzdGF0dXMgPSBWQ0hJUV9TVUNDRVNTOworCitleGl0OgorICAgaWYgKHNlcnZpY2UpCisgICAgICB1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKyAgIHJldHVybiBzdGF0dXM7Cit9CisKK1ZDSElRX1NUQVRVU19UCit2Y2hpcV9nZXRfY29uZmlnKFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UsCisJaW50IGNvbmZpZ19zaXplLCBWQ0hJUV9DT05GSUdfVCAqcGNvbmZpZykKK3sKKwlWQ0hJUV9DT05GSUdfVCBjb25maWc7CisKKwkodm9pZClpbnN0YW5jZTsKKworCWNvbmZpZy5tYXhfbXNnX3NpemUgICAgICAgICAgID0gVkNISVFfTUFYX01TR19TSVpFOworCWNvbmZpZy5idWxrX3RocmVzaG9sZCAgICAgICAgID0gVkNISVFfTUFYX01TR19TSVpFOworCWNvbmZpZy5tYXhfb3V0c3RhbmRpbmdfYnVsa3MgID0gVkNISVFfTlVNX1NFUlZJQ0VfQlVMS1M7CisJY29uZmlnLm1heF9zZXJ2aWNlcyAgICAgICAgICAgPSBWQ0hJUV9NQVhfU0VSVklDRVM7CisJY29uZmlnLnZlcnNpb24gICAgICAgICAgICAgICAgPSBWQ0hJUV9WRVJTSU9OOworCWNvbmZpZy52ZXJzaW9uX21pbiAgICAgICAgICAgID0gVkNISVFfVkVSU0lPTl9NSU47CisKKwlpZiAoY29uZmlnX3NpemUgPiBzaXplb2YoVkNISVFfQ09ORklHX1QpKQorCQlyZXR1cm4gVkNISVFfRVJST1I7CisKKwltZW1jcHkocGNvbmZpZywgJmNvbmZpZywKKwkJbWluKGNvbmZpZ19zaXplLCAoaW50KShzaXplb2YoVkNISVFfQ09ORklHX1QpKSkpOworCisJcmV0dXJuIFZDSElRX1NVQ0NFU1M7Cit9CisKK1ZDSElRX1NUQVRVU19UCit2Y2hpcV9zZXRfc2VydmljZV9vcHRpb24oVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisJVkNISVFfU0VSVklDRV9PUFRJT05fVCBvcHRpb24sIGludCB2YWx1ZSkKK3sKKwlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UgPSBmaW5kX3NlcnZpY2VfYnlfaGFuZGxlKGhhbmRsZSk7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzID0gVkNISVFfRVJST1I7CisKKwlpZiAoc2VydmljZSkgeworCQlzd2l0Y2ggKG9wdGlvbikgeworCQljYXNlIFZDSElRX1NFUlZJQ0VfT1BUSU9OX0FVVE9DTE9TRToKKwkJCXNlcnZpY2UtPmF1dG9fY2xvc2UgPSB2YWx1ZTsKKwkJCXN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisJCQlicmVhazsKKworCQljYXNlIFZDSElRX1NFUlZJQ0VfT1BUSU9OX1NMT1RfUVVPVEE6IHsKKwkJCVZDSElRX1NFUlZJQ0VfUVVPVEFfVCAqc2VydmljZV9xdW90YSA9CisJCQkJJnNlcnZpY2UtPnN0YXRlLT5zZXJ2aWNlX3F1b3Rhc1sKKwkJCQkJc2VydmljZS0+bG9jYWxwb3J0XTsKKwkJCWlmICh2YWx1ZSA9PSAwKQorCQkJCXZhbHVlID0gc2VydmljZS0+c3RhdGUtPmRlZmF1bHRfc2xvdF9xdW90YTsKKwkJCWlmICgodmFsdWUgPj0gc2VydmljZV9xdW90YS0+c2xvdF91c2VfY291bnQpICYmCisJCQkJICh2YWx1ZSA8ICh1bnNpZ25lZCBzaG9ydCl+MCkpIHsKKwkJCQlzZXJ2aWNlX3F1b3RhLT5zbG90X3F1b3RhID0gdmFsdWU7CisJCQkJaWYgKCh2YWx1ZSA+PSBzZXJ2aWNlX3F1b3RhLT5zbG90X3VzZV9jb3VudCkgJiYKKwkJCQkJKHNlcnZpY2VfcXVvdGEtPm1lc3NhZ2VfcXVvdGEgPj0KKwkJCQkJIHNlcnZpY2VfcXVvdGEtPm1lc3NhZ2VfdXNlX2NvdW50KSkgeworCQkJCQkvKiBTaWduYWwgdGhlIHNlcnZpY2UgdGhhdCBpdCBtYXkgaGF2ZQorCQkJCQkqKiBkcm9wcGVkIGJlbG93IGl0cyBxdW90YSAqLworCQkJCQl1cCgmc2VydmljZV9xdW90YS0+cXVvdGFfZXZlbnQpOworCQkJCX0KKwkJCQlzdGF0dXMgPSBWQ0hJUV9TVUNDRVNTOworCQkJfQorCQl9IGJyZWFrOworCisJCWNhc2UgVkNISVFfU0VSVklDRV9PUFRJT05fTUVTU0FHRV9RVU9UQTogeworCQkJVkNISVFfU0VSVklDRV9RVU9UQV9UICpzZXJ2aWNlX3F1b3RhID0KKwkJCQkmc2VydmljZS0+c3RhdGUtPnNlcnZpY2VfcXVvdGFzWworCQkJCQlzZXJ2aWNlLT5sb2NhbHBvcnRdOworCQkJaWYgKHZhbHVlID09IDApCisJCQkJdmFsdWUgPSBzZXJ2aWNlLT5zdGF0ZS0+ZGVmYXVsdF9tZXNzYWdlX3F1b3RhOworCQkJaWYgKCh2YWx1ZSA+PSBzZXJ2aWNlX3F1b3RhLT5tZXNzYWdlX3VzZV9jb3VudCkgJiYKKwkJCQkgKHZhbHVlIDwgKHVuc2lnbmVkIHNob3J0KX4wKSkgeworCQkJCXNlcnZpY2VfcXVvdGEtPm1lc3NhZ2VfcXVvdGEgPSB2YWx1ZTsKKwkJCQlpZiAoKHZhbHVlID49CisJCQkJCXNlcnZpY2VfcXVvdGEtPm1lc3NhZ2VfdXNlX2NvdW50KSAmJgorCQkJCQkoc2VydmljZV9xdW90YS0+c2xvdF9xdW90YSA+PQorCQkJCQlzZXJ2aWNlX3F1b3RhLT5zbG90X3VzZV9jb3VudCkpCisJCQkJCS8qIFNpZ25hbCB0aGUgc2VydmljZSB0aGF0IGl0IG1heSBoYXZlCisJCQkJCSoqIGRyb3BwZWQgYmVsb3cgaXRzIHF1b3RhICovCisJCQkJCXVwKCZzZXJ2aWNlX3F1b3RhLT5xdW90YV9ldmVudCk7CisJCQkJc3RhdHVzID0gVkNISVFfU1VDQ0VTUzsKKwkJCX0KKwkJfSBicmVhazsKKworCQljYXNlIFZDSElRX1NFUlZJQ0VfT1BUSU9OX1NZTkNIUk9OT1VTOgorCQkJaWYgKChzZXJ2aWNlLT5zcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9ISURERU4pIHx8CisJCQkJKHNlcnZpY2UtPnNydnN0YXRlID09CisJCQkJVkNISVFfU1JWU1RBVEVfTElTVEVOSU5HKSkgeworCQkJCXNlcnZpY2UtPnN5bmMgPSB2YWx1ZTsKKwkJCQlzdGF0dXMgPSBWQ0hJUV9TVUNDRVNTOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBWQ0hJUV9TRVJWSUNFX09QVElPTl9UUkFDRToKKwkJCXNlcnZpY2UtPnRyYWNlID0gdmFsdWU7CisJCQlzdGF0dXMgPSBWQ0hJUV9TVUNDRVNTOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQKK3ZjaGlxX2R1bXBfc2hhcmVkX3N0YXRlKHZvaWQgKmR1bXBfY29udGV4dCwgVkNISVFfU1RBVEVfVCAqc3RhdGUsCisJVkNISVFfU0hBUkVEX1NUQVRFX1QgKnNoYXJlZCwgY29uc3QgY2hhciAqbGFiZWwpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGRlYnVnX25hbWVzW10gPSB7CisJCSI8ZW50cmllcz4iLAorCQkiU0xPVF9IQU5ETEVSX0NPVU5UIiwKKwkJIlNMT1RfSEFORExFUl9MSU5FIiwKKwkJIlBBUlNFX0xJTkUiLAorCQkiUEFSU0VfSEVBREVSIiwKKwkJIlBBUlNFX01TR0lEIiwKKwkJIkFXQUlUX0NPTVBMRVRJT05fTElORSIsCisJCSJERVFVRVVFX01FU1NBR0VfTElORSIsCisJCSJTRVJWSUNFX0NBTExCQUNLX0xJTkUiLAorCQkiTVNHX1FVRVVFX0ZVTExfQ09VTlQiLAorCQkiQ09NUExFVElPTl9RVUVVRV9GVUxMX0NPVU5UIgorCX07CisJaW50IGk7CisKKwljaGFyIGJ1Zls4MF07CisJaW50IGxlbjsKKwlsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLAorCQkiICAlczogc2xvdHMgJWQtJWQgdHhfcG9zPSV4IHJlY3ljbGU9JXgiLAorCQlsYWJlbCwgc2hhcmVkLT5zbG90X2ZpcnN0LCBzaGFyZWQtPnNsb3RfbGFzdCwKKwkJc2hhcmVkLT50eF9wb3MsIHNoYXJlZC0+c2xvdF9xdWV1ZV9yZWN5Y2xlKTsKKwl2Y2hpcV9kdW1wKGR1bXBfY29udGV4dCwgYnVmLCBsZW4gKyAxKTsKKworCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCSIgICAgU2xvdHMgY2xhaW1lZDoiKTsKKwl2Y2hpcV9kdW1wKGR1bXBfY29udGV4dCwgYnVmLCBsZW4gKyAxKTsKKworCWZvciAoaSA9IHNoYXJlZC0+c2xvdF9maXJzdDsgaSA8PSBzaGFyZWQtPnNsb3RfbGFzdDsgaSsrKSB7CisJCVZDSElRX1NMT1RfSU5GT19UIHNsb3RfaW5mbyA9ICpTTE9UX0lORk9fRlJPTV9JTkRFWChzdGF0ZSwgaSk7CisJCWlmIChzbG90X2luZm8udXNlX2NvdW50ICE9IHNsb3RfaW5mby5yZWxlYXNlX2NvdW50KSB7CisJCQlsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLAorCQkJCSIgICAgICAlZDogJWQvJWQiLCBpLCBzbG90X2luZm8udXNlX2NvdW50LAorCQkJCXNsb3RfaW5mby5yZWxlYXNlX2NvdW50KTsKKwkJCXZjaGlxX2R1bXAoZHVtcF9jb250ZXh0LCBidWYsIGxlbiArIDEpOworCQl9CisJfQorCisJZm9yIChpID0gMTsgaSA8IHNoYXJlZC0+ZGVidWdbREVCVUdfRU5UUklFU107IGkrKykgeworCQlsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiICAgIERFQlVHOiAlcyA9ICVkKCV4KSIsCisJCQlkZWJ1Z19uYW1lc1tpXSwgc2hhcmVkLT5kZWJ1Z1tpXSwgc2hhcmVkLT5kZWJ1Z1tpXSk7CisJCXZjaGlxX2R1bXAoZHVtcF9jb250ZXh0LCBidWYsIGxlbiArIDEpOworCX0KK30KKwordm9pZAordmNoaXFfZHVtcF9zdGF0ZSh2b2lkICpkdW1wX2NvbnRleHQsIFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCWNoYXIgYnVmWzgwXTsKKwlpbnQgbGVuOworCWludCBpOworCisJbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIlN0YXRlICVkOiAlcyIsIHN0YXRlLT5pZCwKKwkJY29ubl9zdGF0ZV9uYW1lc1tzdGF0ZS0+Y29ubl9zdGF0ZV0pOworCXZjaGlxX2R1bXAoZHVtcF9jb250ZXh0LCBidWYsIGxlbiArIDEpOworCisJbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKwkJIiAgdHhfcG9zPSV4KEAleCksIHJ4X3Bvcz0leChAJXgpIiwKKwkJc3RhdGUtPmxvY2FsLT50eF9wb3MsCisJCSh1aW50MzJfdClzdGF0ZS0+dHhfZGF0YSArCisJCQkoc3RhdGUtPmxvY2FsX3R4X3BvcyAmIFZDSElRX1NMT1RfTUFTSyksCisJCXN0YXRlLT5yeF9wb3MsCisJCSh1aW50MzJfdClzdGF0ZS0+cnhfZGF0YSArCisJCQkoc3RhdGUtPnJ4X3BvcyAmIFZDSElRX1NMT1RfTUFTSykpOworCXZjaGlxX2R1bXAoZHVtcF9jb250ZXh0LCBidWYsIGxlbiArIDEpOworCisJbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKwkJIiAgVmVyc2lvbjogJWQgKG1pbiAlZCkiLAorCQlWQ0hJUV9WRVJTSU9OLCBWQ0hJUV9WRVJTSU9OX01JTik7CisJdmNoaXFfZHVtcChkdW1wX2NvbnRleHQsIGJ1ZiwgbGVuICsgMSk7CisKKwlpZiAoVkNISVFfRU5BQkxFX1NUQVRTKSB7CisJCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCQkiICBTdGF0czogY3RybF90eF9jb3VudD0lZCwgY3RybF9yeF9jb3VudD0lZCwgIgorCQkJImVycm9yX2NvdW50PSVkIiwKKwkJCXN0YXRlLT5zdGF0cy5jdHJsX3R4X2NvdW50LCBzdGF0ZS0+c3RhdHMuY3RybF9yeF9jb3VudCwKKwkJCXN0YXRlLT5zdGF0cy5lcnJvcl9jb3VudCk7CisJCXZjaGlxX2R1bXAoZHVtcF9jb250ZXh0LCBidWYsIGxlbiArIDEpOworCX0KKworCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCSIgIFNsb3RzOiAlZCBhdmFpbGFibGUgKCVkIGRhdGEpLCAlZCByZWN5Y2xhYmxlLCAlZCBzdGFsbHMgIgorCQkiKCVkIGRhdGEpIiwKKwkJKChzdGF0ZS0+c2xvdF9xdWV1ZV9hdmFpbGFibGUgKiBWQ0hJUV9TTE9UX1NJWkUpIC0KKwkJCXN0YXRlLT5sb2NhbF90eF9wb3MpIC8gVkNISVFfU0xPVF9TSVpFLAorCQlzdGF0ZS0+ZGF0YV9xdW90YSAtIHN0YXRlLT5kYXRhX3VzZV9jb3VudCwKKwkJc3RhdGUtPmxvY2FsLT5zbG90X3F1ZXVlX3JlY3ljbGUgLSBzdGF0ZS0+c2xvdF9xdWV1ZV9hdmFpbGFibGUsCisJCXN0YXRlLT5zdGF0cy5zbG90X3N0YWxscywgc3RhdGUtPnN0YXRzLmRhdGFfc3RhbGxzKTsKKwl2Y2hpcV9kdW1wKGR1bXBfY29udGV4dCwgYnVmLCBsZW4gKyAxKTsKKworCXZjaGlxX2R1bXBfcGxhdGZvcm1fc3RhdGUoZHVtcF9jb250ZXh0KTsKKworCXZjaGlxX2R1bXBfc2hhcmVkX3N0YXRlKGR1bXBfY29udGV4dCwgc3RhdGUsIHN0YXRlLT5sb2NhbCwgIkxvY2FsIik7CisJdmNoaXFfZHVtcF9zaGFyZWRfc3RhdGUoZHVtcF9jb250ZXh0LCBzdGF0ZSwgc3RhdGUtPnJlbW90ZSwgIlJlbW90ZSIpOworCisJdmNoaXFfZHVtcF9wbGF0Zm9ybV9pbnN0YW5jZXMoZHVtcF9jb250ZXh0KTsKKworCWZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+dW51c2VkX3NlcnZpY2U7IGkrKykgeworCQlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UgPSBmaW5kX3NlcnZpY2VfYnlfcG9ydChzdGF0ZSwgaSk7CisKKwkJaWYgKHNlcnZpY2UpIHsKKwkJCXZjaGlxX2R1bXBfc2VydmljZV9zdGF0ZShkdW1wX2NvbnRleHQsIHNlcnZpY2UpOworCQkJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisJCX0KKwl9Cit9CisKK3ZvaWQKK3ZjaGlxX2R1bXBfc2VydmljZV9zdGF0ZSh2b2lkICpkdW1wX2NvbnRleHQsIFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSkKK3sKKwljaGFyIGJ1Zls4MF07CisJaW50IGxlbjsKKworCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJTZXJ2aWNlICVkOiAlcyAocmVmICV1KSIsCisJCXNlcnZpY2UtPmxvY2FscG9ydCwgc3J2c3RhdGVfbmFtZXNbc2VydmljZS0+c3J2c3RhdGVdLAorCQlzZXJ2aWNlLT5yZWZfY291bnQgLSAxKTsgLypEb24ndCBpbmNsdWRlIHRoZSBsb2NrIGp1c3QgdGFrZW4qLworCisJaWYgKHNlcnZpY2UtPnNydnN0YXRlICE9IFZDSElRX1NSVlNUQVRFX0ZSRUUpIHsKKwkJY2hhciByZW1vdGVwb3J0WzMwXTsKKwkJVkNISVFfU0VSVklDRV9RVU9UQV9UICpzZXJ2aWNlX3F1b3RhID0KKwkJCSZzZXJ2aWNlLT5zdGF0ZS0+c2VydmljZV9xdW90YXNbc2VydmljZS0+bG9jYWxwb3J0XTsKKwkJaW50IGZvdXJjYyA9IHNlcnZpY2UtPmJhc2UuZm91cmNjOworCQlpbnQgdHhfcGVuZGluZywgcnhfcGVuZGluZzsKKwkJaWYgKHNlcnZpY2UtPnJlbW90ZXBvcnQgIT0gVkNISVFfUE9SVF9GUkVFKSB7CisJCQlpbnQgbGVuMiA9IHNucHJpbnRmKHJlbW90ZXBvcnQsIHNpemVvZihyZW1vdGVwb3J0KSwKKwkJCQkiJWQiLCBzZXJ2aWNlLT5yZW1vdGVwb3J0KTsKKwkJCWlmIChzZXJ2aWNlLT5wdWJsaWNfZm91cmNjICE9IFZDSElRX0ZPVVJDQ19JTlZBTElEKQorCQkJCXNucHJpbnRmKHJlbW90ZXBvcnQgKyBsZW4yLAorCQkJCQlzaXplb2YocmVtb3RlcG9ydCkgLSBsZW4yLAorCQkJCQkiIChjbGllbnQgJXgpIiwgc2VydmljZS0+Y2xpZW50X2lkKTsKKwkJfSBlbHNlCisJCQlzdHJjcHkocmVtb3RlcG9ydCwgIm4vYSIpOworCisJCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuLAorCQkJIiAnJWMlYyVjJWMnIHJlbW90ZSAlcyAobXNnIHVzZSAlZC8lZCwgc2xvdCB1c2UgJWQvJWQpIiwKKwkJCVZDSElRX0ZPVVJDQ19BU180Q0hBUlMoZm91cmNjKSwKKwkJCXJlbW90ZXBvcnQsCisJCQlzZXJ2aWNlX3F1b3RhLT5tZXNzYWdlX3VzZV9jb3VudCwKKwkJCXNlcnZpY2VfcXVvdGEtPm1lc3NhZ2VfcXVvdGEsCisJCQlzZXJ2aWNlX3F1b3RhLT5zbG90X3VzZV9jb3VudCwKKwkJCXNlcnZpY2VfcXVvdGEtPnNsb3RfcXVvdGEpOworCisJCXZjaGlxX2R1bXAoZHVtcF9jb250ZXh0LCBidWYsIGxlbiArIDEpOworCisJCXR4X3BlbmRpbmcgPSBzZXJ2aWNlLT5idWxrX3R4LmxvY2FsX2luc2VydCAtCisJCQlzZXJ2aWNlLT5idWxrX3R4LnJlbW90ZV9pbnNlcnQ7CisKKwkJcnhfcGVuZGluZyA9IHNlcnZpY2UtPmJ1bGtfcngubG9jYWxfaW5zZXJ0IC0KKwkJCXNlcnZpY2UtPmJ1bGtfcngucmVtb3RlX2luc2VydDsKKworCQlsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLAorCQkJIiAgQnVsazogdHhfcGVuZGluZz0lZCAoc2l6ZSAlZCksIgorCQkJIiByeF9wZW5kaW5nPSVkIChzaXplICVkKSIsCisJCQl0eF9wZW5kaW5nLAorCQkJdHhfcGVuZGluZyA/IHNlcnZpY2UtPmJ1bGtfdHguYnVsa3NbCisJCQlCVUxLX0lOREVYKHNlcnZpY2UtPmJ1bGtfdHgucmVtb3ZlKV0uc2l6ZSA6IDAsCisJCQlyeF9wZW5kaW5nLAorCQkJcnhfcGVuZGluZyA/IHNlcnZpY2UtPmJ1bGtfcnguYnVsa3NbCisJCQlCVUxLX0lOREVYKHNlcnZpY2UtPmJ1bGtfcngucmVtb3ZlKV0uc2l6ZSA6IDApOworCisJCWlmIChWQ0hJUV9FTkFCTEVfU1RBVFMpIHsKKwkJCXZjaGlxX2R1bXAoZHVtcF9jb250ZXh0LCBidWYsIGxlbiArIDEpOworCisJCQlsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLAorCQkJCSIgIEN0cmw6IHR4X2NvdW50PSVkLCB0eF9ieXRlcz0lbGx1LCAiCisJCQkJInJ4X2NvdW50PSVkLCByeF9ieXRlcz0lbGx1IiwKKwkJCQlzZXJ2aWNlLT5zdGF0cy5jdHJsX3R4X2NvdW50LAorCQkJCXNlcnZpY2UtPnN0YXRzLmN0cmxfdHhfYnl0ZXMsCisJCQkJc2VydmljZS0+c3RhdHMuY3RybF9yeF9jb3VudCwKKwkJCQlzZXJ2aWNlLT5zdGF0cy5jdHJsX3J4X2J5dGVzKTsKKwkJCXZjaGlxX2R1bXAoZHVtcF9jb250ZXh0LCBidWYsIGxlbiArIDEpOworCisJCQlsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLAorCQkJCSIgIEJ1bGs6IHR4X2NvdW50PSVkLCB0eF9ieXRlcz0lbGx1LCAiCisJCQkJInJ4X2NvdW50PSVkLCByeF9ieXRlcz0lbGx1IiwKKwkJCQlzZXJ2aWNlLT5zdGF0cy5idWxrX3R4X2NvdW50LAorCQkJCXNlcnZpY2UtPnN0YXRzLmJ1bGtfdHhfYnl0ZXMsCisJCQkJc2VydmljZS0+c3RhdHMuYnVsa19yeF9jb3VudCwKKwkJCQlzZXJ2aWNlLT5zdGF0cy5idWxrX3J4X2J5dGVzKTsKKwkJCXZjaGlxX2R1bXAoZHVtcF9jb250ZXh0LCBidWYsIGxlbiArIDEpOworCisJCQlsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLAorCQkJCSIgICVkIHF1b3RhIHN0YWxscywgJWQgc2xvdCBzdGFsbHMsICIKKwkJCQkiJWQgYnVsayBzdGFsbHMsICVkIGFib3J0ZWQsICVkIGVycm9ycyIsCisJCQkJc2VydmljZS0+c3RhdHMucXVvdGFfc3RhbGxzLAorCQkJCXNlcnZpY2UtPnN0YXRzLnNsb3Rfc3RhbGxzLAorCQkJCXNlcnZpY2UtPnN0YXRzLmJ1bGtfc3RhbGxzLAorCQkJCXNlcnZpY2UtPnN0YXRzLmJ1bGtfYWJvcnRlZF9jb3VudCwKKwkJCQlzZXJ2aWNlLT5zdGF0cy5lcnJvcl9jb3VudCk7CisJCSB9CisJfQorCisJdmNoaXFfZHVtcChkdW1wX2NvbnRleHQsIGJ1ZiwgbGVuICsgMSk7CisKKwlpZiAoc2VydmljZS0+c3J2c3RhdGUgIT0gVkNISVFfU1JWU1RBVEVfRlJFRSkKKwkJdmNoaXFfZHVtcF9wbGF0Zm9ybV9zZXJ2aWNlX3N0YXRlKGR1bXBfY29udGV4dCwgc2VydmljZSk7Cit9CisKKwordm9pZAordmNoaXFfbG91ZF9lcnJvcl9oZWFkZXIodm9pZCkKK3sKKwl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCSI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCisJCSI9PT09PT09PT09PT09PT09Iik7CisJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorCQkiPT09PT09PT09PT09PT09PSIpOworCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwgIj09PT09Iik7Cit9CisKK3ZvaWQKK3ZjaGlxX2xvdWRfZXJyb3JfZm9vdGVyKHZvaWQpCit7CisJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLCAiPT09PT0iKTsKKwl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCSI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCisJCSI9PT09PT09PT09PT09PT09Iik7CisJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorCQkiPT09PT09PT09PT09PT09PSIpOworfQorCisKK1ZDSElRX1NUQVRVU19UIHZjaGlxX3NlbmRfcmVtb3RlX3VzZShWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXMgPSBWQ0hJUV9SRVRSWTsKKwlpZiAoc3RhdGUtPmNvbm5fc3RhdGUgIT0gVkNISVFfQ09OTlNUQVRFX0RJU0NPTk5FQ1RFRCkKKwkJc3RhdHVzID0gcXVldWVfbWVzc2FnZShzdGF0ZSwgTlVMTCwKKwkJCVZDSElRX01BS0VfTVNHKFZDSElRX01TR19SRU1PVEVfVVNFLCAwLCAwKSwKKwkJCU5VTEwsIDAsIDAsIDApOworCXJldHVybiBzdGF0dXM7Cit9CisKK1ZDSElRX1NUQVRVU19UIHZjaGlxX3NlbmRfcmVtb3RlX3JlbGVhc2UoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzID0gVkNISVFfUkVUUlk7CisJaWYgKHN0YXRlLT5jb25uX3N0YXRlICE9IFZDSElRX0NPTk5TVEFURV9ESVNDT05ORUNURUQpCisJCXN0YXR1cyA9IHF1ZXVlX21lc3NhZ2Uoc3RhdGUsIE5VTEwsCisJCQlWQ0hJUV9NQUtFX01TRyhWQ0hJUV9NU0dfUkVNT1RFX1JFTEVBU0UsIDAsIDApLAorCQkJTlVMTCwgMCwgMCwgMCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworVkNISVFfU1RBVFVTX1QgdmNoaXFfc2VuZF9yZW1vdGVfdXNlX2FjdGl2ZShWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXMgPSBWQ0hJUV9SRVRSWTsKKwlpZiAoc3RhdGUtPmNvbm5fc3RhdGUgIT0gVkNISVFfQ09OTlNUQVRFX0RJU0NPTk5FQ1RFRCkKKwkJc3RhdHVzID0gcXVldWVfbWVzc2FnZShzdGF0ZSwgTlVMTCwKKwkJCVZDSElRX01BS0VfTVNHKFZDSElRX01TR19SRU1PVEVfVVNFX0FDVElWRSwgMCwgMCksCisJCQlOVUxMLCAwLCAwLCAwKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkIHZjaGlxX2xvZ19kdW1wX21lbShjb25zdCBjaGFyICpsYWJlbCwgdWludDMyX3QgYWRkciwgY29uc3Qgdm9pZCAqdm9pZE1lbSwKKwlzaXplX3QgbnVtQnl0ZXMpCit7CisJY29uc3QgdWludDhfdCAgKm1lbSA9IChjb25zdCB1aW50OF90ICopdm9pZE1lbTsKKwlzaXplX3QgICAgICAgICAgb2Zmc2V0OworCWNoYXIgICAgICAgICAgICBsaW5lQnVmWzEwMF07CisJY2hhciAgICAgICAgICAgKnM7CisKKwl3aGlsZSAobnVtQnl0ZXMgPiAwKSB7CisJCXMgPSBsaW5lQnVmOworCisJCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgMTY7IG9mZnNldCsrKSB7CisJCQlpZiAob2Zmc2V0IDwgbnVtQnl0ZXMpCisJCQkJcyArPSBzbnByaW50ZihzLCA0LCAiJTAyeCAiLCBtZW1bb2Zmc2V0XSk7CisJCQllbHNlCisJCQkJcyArPSBzbnByaW50ZihzLCA0LCAiICAgIik7CisJCX0KKworCQlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IDE2OyBvZmZzZXQrKykgeworCQkJaWYgKG9mZnNldCA8IG51bUJ5dGVzKSB7CisJCQkJdWludDhfdCBjaCA9IG1lbVtvZmZzZXRdOworCisJCQkJaWYgKChjaCA8ICcgJykgfHwgKGNoID4gJ34nKSkKKwkJCQkJY2ggPSAnLic7CisJCQkJKnMrKyA9IChjaGFyKWNoOworCQkJfQorCQl9CisJCSpzKysgPSAnXDAnOworCisJCWlmICgobGFiZWwgIT0gTlVMTCkgJiYgKCpsYWJlbCAhPSAnXDAnKSkKKwkJCXZjaGlxX2xvZ190cmFjZShWQ0hJUV9MT0dfVFJBQ0UsCisJCQkJIiVzOiAlMDh4OiAlcyIsIGxhYmVsLCBhZGRyLCBsaW5lQnVmKTsKKwkJZWxzZQorCQkJdmNoaXFfbG9nX3RyYWNlKFZDSElRX0xPR19UUkFDRSwKKwkJCQkiJTA4eDogJXMiLCBhZGRyLCBsaW5lQnVmKTsKKworCQlhZGRyICs9IDE2OworCQltZW0gKz0gMTY7CisJCWlmIChudW1CeXRlcyA+IDE2KQorCQkJbnVtQnl0ZXMgLT0gMTY7CisJCWVsc2UKKwkJCW51bUJ5dGVzID0gMDsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2NvcmUuaCBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZTQ4NGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2NvcmUuaApAQCAtMCwwICsxLDcxMiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBWQ0hJUV9DT1JFX0gKKyNkZWZpbmUgVkNISVFfQ09SRV9ICisKKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKworI2luY2x1ZGUgInZjaGlxX2NmZy5oIgorCisjaW5jbHVkZSAidmNoaXEuaCIKKworLyogUnVuIHRpbWUgY29udHJvbCBvZiBsb2cgbGV2ZWwsIGJhc2VkIG9uIEtFUk5fWFhYIGxldmVsLiAqLworI2RlZmluZSBWQ0hJUV9MT0dfREVGQVVMVCAgNAorI2RlZmluZSBWQ0hJUV9MT0dfRVJST1IgICAgMworI2RlZmluZSBWQ0hJUV9MT0dfV0FSTklORyAgNAorI2RlZmluZSBWQ0hJUV9MT0dfSU5GTyAgICAgNgorI2RlZmluZSBWQ0hJUV9MT0dfVFJBQ0UgICAgNworCisjZGVmaW5lIFZDSElRX0xPR19QUkVGSVggICBLRVJOX0lORk8gInZjaGlxOiAiCisKKyNpZm5kZWYgdmNoaXFfbG9nX2Vycm9yCisjZGVmaW5lIHZjaGlxX2xvZ19lcnJvcihjYXQsIGZtdCwgLi4uKSBcCisJZG8geyBpZiAoY2F0ID49IFZDSElRX0xPR19FUlJPUikgXAorCQlwcmludGsoVkNISVFfTE9HX1BSRUZJWCBmbXQgIlxuIiwgIyNfX1ZBX0FSR1NfXyk7IH0gd2hpbGUgKDApCisjZW5kaWYKKyNpZm5kZWYgdmNoaXFfbG9nX3dhcm5pbmcKKyNkZWZpbmUgdmNoaXFfbG9nX3dhcm5pbmcoY2F0LCBmbXQsIC4uLikgXAorCWRvIHsgaWYgKGNhdCA+PSBWQ0hJUV9MT0dfV0FSTklORykgXAorCQkgcHJpbnRrKFZDSElRX0xPR19QUkVGSVggZm10ICJcbiIsICMjX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKQorI2VuZGlmCisjaWZuZGVmIHZjaGlxX2xvZ19pbmZvCisjZGVmaW5lIHZjaGlxX2xvZ19pbmZvKGNhdCwgZm10LCAuLi4pIFwKKwlkbyB7IGlmIChjYXQgPj0gVkNISVFfTE9HX0lORk8pIFwKKwkJcHJpbnRrKFZDSElRX0xPR19QUkVGSVggZm10ICJcbiIsICMjX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKQorI2VuZGlmCisjaWZuZGVmIHZjaGlxX2xvZ190cmFjZQorI2RlZmluZSB2Y2hpcV9sb2dfdHJhY2UoY2F0LCBmbXQsIC4uLikgXAorCWRvIHsgaWYgKGNhdCA+PSBWQ0hJUV9MT0dfVFJBQ0UpIFwKKwkJcHJpbnRrKFZDSElRX0xPR19QUkVGSVggZm10ICJcbiIsICMjX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNkZWZpbmUgdmNoaXFfbG91ZF9lcnJvciguLi4pIFwKKwl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsICI9PT09PSAiIF9fVkFfQVJHU19fKQorCisjaWZuZGVmIHZjaGlxX3N0YXRpY19hc3NlcnQKKyNkZWZpbmUgdmNoaXFfc3RhdGljX2Fzc2VydChjb25kKSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBcCisJZXh0ZXJuIGludCB2Y2hpcV9zdGF0aWNfYXNzZXJ0Wyhjb25kKSA/IDEgOiAtMV0KKyNlbmRpZgorCisjZGVmaW5lIElTX1BPVzIoeCkgKHggJiYgKCh4ICYgKHggLSAxKSkgPT0gMCkpCisKKy8qIEVuc3VyZSB0aGF0IHRoZSBzbG90IHNpemUgYW5kIG1heGltdW0gbnVtYmVyIG9mIHNsb3RzIGFyZSBwb3dlcnMgb2YgMiAqLwordmNoaXFfc3RhdGljX2Fzc2VydChJU19QT1cyKFZDSElRX1NMT1RfU0laRSkpOwordmNoaXFfc3RhdGljX2Fzc2VydChJU19QT1cyKFZDSElRX01BWF9TTE9UUykpOwordmNoaXFfc3RhdGljX2Fzc2VydChJU19QT1cyKFZDSElRX01BWF9TTE9UU19QRVJfU0lERSkpOworCisjZGVmaW5lIFZDSElRX1NMT1RfTUFTSyAgICAgICAgKFZDSElRX1NMT1RfU0laRSAtIDEpCisjZGVmaW5lIFZDSElRX1NMT1RfUVVFVUVfTUFTSyAgKFZDSElRX01BWF9TTE9UU19QRVJfU0lERSAtIDEpCisjZGVmaW5lIFZDSElRX1NMT1RfWkVST19TTE9UUyAgKChzaXplb2YoVkNISVFfU0xPVF9aRVJPX1QpICsgXAorCVZDSElRX1NMT1RfU0laRSAtIDEpIC8gVkNISVFfU0xPVF9TSVpFKQorCisjZGVmaW5lIFZDSElRX01TR19QQURESU5HICAgICAgICAgICAgMCAgLyogLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFZDSElRX01TR19DT05ORUNUICAgICAgICAgICAgMSAgLyogLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFZDSElRX01TR19PUEVOICAgICAgICAgICAgICAgMiAgLyogKyAoc3JjcG9ydCwgLSksIGZvdXJjYywgY2xpZW50X2lkICovCisjZGVmaW5lIFZDSElRX01TR19PUEVOQUNLICAgICAgICAgICAgMyAgLyogKyAoc3JjcG9ydCwgZHN0cG9ydCkgICAgICAgICAgICAgICovCisjZGVmaW5lIFZDSElRX01TR19DTE9TRSAgICAgICAgICAgICAgNCAgLyogKyAoc3JjcG9ydCwgZHN0cG9ydCkgICAgICAgICAgICAgICovCisjZGVmaW5lIFZDSElRX01TR19EQVRBICAgICAgICAgICAgICAgNSAgLyogKyAoc3JjcG9ydCwgZHN0cG9ydCkgICAgICAgICAgICAgICovCisjZGVmaW5lIFZDSElRX01TR19CVUxLX1JYICAgICAgICAgICAgNiAgLyogKyAoc3JjcG9ydCwgZHN0cG9ydCksIGRhdGEsIHNpemUgICovCisjZGVmaW5lIFZDSElRX01TR19CVUxLX1RYICAgICAgICAgICAgNyAgLyogKyAoc3JjcG9ydCwgZHN0cG9ydCksIGRhdGEsIHNpemUgICovCisjZGVmaW5lIFZDSElRX01TR19CVUxLX1JYX0RPTkUgICAgICAgOCAgLyogKyAoc3JjcG9ydCwgZHN0cG9ydCksIGFjdHVhbCAgICAgICovCisjZGVmaW5lIFZDSElRX01TR19CVUxLX1RYX0RPTkUgICAgICAgOSAgLyogKyAoc3JjcG9ydCwgZHN0cG9ydCksIGFjdHVhbCAgICAgICovCisjZGVmaW5lIFZDSElRX01TR19QQVVTRSAgICAgICAgICAgICAxMCAgLyogLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFZDSElRX01TR19SRVNVTUUgICAgICAgICAgICAxMSAgLyogLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFZDSElRX01TR19SRU1PVEVfVVNFICAgICAgICAxMiAgLyogLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFZDSElRX01TR19SRU1PVEVfUkVMRUFTRSAgICAxMyAgLyogLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFZDSElRX01TR19SRU1PVEVfVVNFX0FDVElWRSAxNCAgLyogLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgVkNISVFfUE9SVF9NQVggICAgICAgICAgICAgICAgIChWQ0hJUV9NQVhfU0VSVklDRVMgLSAxKQorI2RlZmluZSBWQ0hJUV9QT1JUX0ZSRUUgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFZDSElRX1BPUlRfSVNfVkFMSUQocG9ydCkgICAgICAocG9ydCA8IFZDSElRX1BPUlRfRlJFRSkKKyNkZWZpbmUgVkNISVFfTUFLRV9NU0codHlwZSwgc3JjcG9ydCwgZHN0cG9ydCkgXAorCSgodHlwZTw8MjQpIHwgKHNyY3BvcnQ8PDEyKSB8IChkc3Rwb3J0PDwwKSkKKyNkZWZpbmUgVkNISVFfTVNHX1RZUEUobXNnaWQpICAgICAgICAgICgodW5zaWduZWQgaW50KW1zZ2lkID4+IDI0KQorI2RlZmluZSBWQ0hJUV9NU0dfU1JDUE9SVChtc2dpZCkgXAorCSh1bnNpZ25lZCBzaG9ydCkoKCh1bnNpZ25lZCBpbnQpbXNnaWQgPj4gMTIpICYgMHhmZmYpCisjZGVmaW5lIFZDSElRX01TR19EU1RQT1JUKG1zZ2lkKSBcCisJKCh1bnNpZ25lZCBzaG9ydCltc2dpZCAmIDB4ZmZmKQorCisjZGVmaW5lIFZDSElRX0ZPVVJDQ19BU180Q0hBUlMoZm91cmNjKQlcCisJKChmb3VyY2MpID4+IDI0KSAmIDB4ZmYsIFwKKwkoKGZvdXJjYykgPj4gMTYpICYgMHhmZiwgXAorCSgoZm91cmNjKSA+PiAgOCkgJiAweGZmLCBcCisJKGZvdXJjYykgJiAweGZmCisKKy8qIEVuc3VyZSB0aGUgZmllbGRzIGFyZSB3aWRlIGVub3VnaCAqLwordmNoaXFfc3RhdGljX2Fzc2VydChWQ0hJUV9NU0dfU1JDUE9SVChWQ0hJUV9NQUtFX01TRygwLCAwLCBWQ0hJUV9QT1JUX01BWCkpCisJPT0gMCk7Cit2Y2hpcV9zdGF0aWNfYXNzZXJ0KFZDSElRX01TR19UWVBFKFZDSElRX01BS0VfTVNHKDAsIFZDSElRX1BPUlRfTUFYLCAwKSkgPT0gMCk7Cit2Y2hpcV9zdGF0aWNfYXNzZXJ0KCh1bnNpZ25lZCBpbnQpVkNISVFfUE9SVF9NQVggPAorCSh1bnNpZ25lZCBpbnQpVkNISVFfUE9SVF9GUkVFKTsKKworI2RlZmluZSBWQ0hJUV9NU0dJRF9QQURESU5HICAgICAgICAgICAgVkNISVFfTUFLRV9NU0coVkNISVFfTVNHX1BBRERJTkcsIDAsIDApCisjZGVmaW5lIFZDSElRX01TR0lEX0NMQUlNRUQgICAgICAgICAgICAweDQwMDAwMDAwCisKKyNkZWZpbmUgVkNISVFfRk9VUkNDX0lOVkFMSUQgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgVkNISVFfRk9VUkNDX0lTX0xFR0FMKGZvdXJjYykgIChmb3VyY2MgIT0gVkNISVFfRk9VUkNDX0lOVkFMSUQpCisKKyNkZWZpbmUgVkNISVFfQlVMS19BQ1RVQUxfQUJPUlRFRCAtMQorCit0eXBlZGVmIHVpbnQzMl90IEJJVFNFVF9UOworCit2Y2hpcV9zdGF0aWNfYXNzZXJ0KChzaXplb2YoQklUU0VUX1QpICogOCkgPT0gMzIpOworCisjZGVmaW5lIEJJVFNFVF9TSVpFKGIpICAgICAgICAoKGIgKyAzMSkgPj4gNSkKKyNkZWZpbmUgQklUU0VUX1dPUkQoYikgICAgICAgIChiID4+IDUpCisjZGVmaW5lIEJJVFNFVF9CSVQoYikgICAgICAgICAoMSA8PCAoYiAmIDMxKSkKKyNkZWZpbmUgQklUU0VUX1pFUk8oYnMpICAgICAgIG1lbXNldChicywgMCwgc2l6ZW9mKGJzKSkKKyNkZWZpbmUgQklUU0VUX0lTX1NFVChicywgYikgIChic1tCSVRTRVRfV09SRChiKV0gJiBCSVRTRVRfQklUKGIpKQorI2RlZmluZSBCSVRTRVRfU0VUKGJzLCBiKSAgICAgKGJzW0JJVFNFVF9XT1JEKGIpXSB8PSBCSVRTRVRfQklUKGIpKQorI2RlZmluZSBCSVRTRVRfQ0xSKGJzLCBiKSAgICAgKGJzW0JJVFNFVF9XT1JEKGIpXSAmPSB+QklUU0VUX0JJVChiKSkKKworI2lmIFZDSElRX0VOQUJMRV9TVEFUUworI2RlZmluZSBWQ0hJUV9TVEFUU19JTkMoc3RhdGUsIHN0YXQpIChzdGF0ZS0+c3RhdHMuIHN0YXQrKykKKyNkZWZpbmUgVkNISVFfU0VSVklDRV9TVEFUU19JTkMoc2VydmljZSwgc3RhdCkgKHNlcnZpY2UtPnN0YXRzLiBzdGF0KyspCisjZGVmaW5lIFZDSElRX1NFUlZJQ0VfU1RBVFNfQUREKHNlcnZpY2UsIHN0YXQsIGFkZGVuZCkgXAorCShzZXJ2aWNlLT5zdGF0cy4gc3RhdCArPSBhZGRlbmQpCisjZWxzZQorI2RlZmluZSBWQ0hJUV9TVEFUU19JTkMoc3RhdGUsIHN0YXQpICgodm9pZCkwKQorI2RlZmluZSBWQ0hJUV9TRVJWSUNFX1NUQVRTX0lOQyhzZXJ2aWNlLCBzdGF0KSAoKHZvaWQpMCkKKyNkZWZpbmUgVkNISVFfU0VSVklDRV9TVEFUU19BREQoc2VydmljZSwgc3RhdCwgYWRkZW5kKSAoKHZvaWQpMCkKKyNlbmRpZgorCitlbnVtIHsKKwlERUJVR19FTlRSSUVTLAorI2lmIFZDSElRX0VOQUJMRV9ERUJVRworCURFQlVHX1NMT1RfSEFORExFUl9DT1VOVCwKKwlERUJVR19TTE9UX0hBTkRMRVJfTElORSwKKwlERUJVR19QQVJTRV9MSU5FLAorCURFQlVHX1BBUlNFX0hFQURFUiwKKwlERUJVR19QQVJTRV9NU0dJRCwKKwlERUJVR19BV0FJVF9DT01QTEVUSU9OX0xJTkUsCisJREVCVUdfREVRVUVVRV9NRVNTQUdFX0xJTkUsCisJREVCVUdfU0VSVklDRV9DQUxMQkFDS19MSU5FLAorCURFQlVHX01TR19RVUVVRV9GVUxMX0NPVU5ULAorCURFQlVHX0NPTVBMRVRJT05fUVVFVUVfRlVMTF9DT1VOVCwKKyNlbmRpZgorCURFQlVHX01BWAorfTsKKworI2lmIFZDSElRX0VOQUJMRV9ERUJVRworCisjZGVmaW5lIERFQlVHX0lOSVRJQUxJU0UobG9jYWwpIGludCAqZGVidWdfcHRyID0gKGxvY2FsKS0+ZGVidWc7CisjZGVmaW5lIERFQlVHX1RSQUNFKGQpIFwKKwlkbyB7IGRlYnVnX3B0cltERUJVR18gIyMgZF0gPSBfX0xJTkVfXzsgZHNiKCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIERFQlVHX1ZBTFVFKGQsIHYpIFwKKwlkbyB7IGRlYnVnX3B0cltERUJVR18gIyMgZF0gPSAodik7IGRzYigpOyB9IHdoaWxlICgwKQorI2RlZmluZSBERUJVR19DT1VOVChkKSBcCisJZG8geyBkZWJ1Z19wdHJbREVCVUdfICMjIGRdKys7IGRzYigpOyB9IHdoaWxlICgwKQorCisjZWxzZSAvKiBWQ0hJUV9FTkFCTEVfREVCVUcgKi8KKworI2RlZmluZSBERUJVR19JTklUSUFMSVNFKGxvY2FsKQorI2RlZmluZSBERUJVR19UUkFDRShkKQorI2RlZmluZSBERUJVR19WQUxVRShkLCB2KQorI2RlZmluZSBERUJVR19DT1VOVChkKQorCisjZW5kaWYgLyogVkNISVFfRU5BQkxFX0RFQlVHICovCisKK3R5cGVkZWYgZW51bSB7CisJVkNISVFfQ09OTlNUQVRFX0RJU0NPTk5FQ1RFRCwKKwlWQ0hJUV9DT05OU1RBVEVfQ09OTkVDVElORywKKwlWQ0hJUV9DT05OU1RBVEVfQ09OTkVDVEVELAorCVZDSElRX0NPTk5TVEFURV9QQVVTSU5HLAorCVZDSElRX0NPTk5TVEFURV9QQVVTRV9TRU5ULAorCVZDSElRX0NPTk5TVEFURV9QQVVTRUQsCisJVkNISVFfQ09OTlNUQVRFX1JFU1VNSU5HLAorCVZDSElRX0NPTk5TVEFURV9QQVVTRV9USU1FT1VULAorCVZDSElRX0NPTk5TVEFURV9SRVNVTUVfVElNRU9VVAorfSBWQ0hJUV9DT05OU1RBVEVfVDsKKworZW51bSB7CisJVkNISVFfU1JWU1RBVEVfRlJFRSwKKwlWQ0hJUV9TUlZTVEFURV9ISURERU4sCisJVkNISVFfU1JWU1RBVEVfTElTVEVOSU5HLAorCVZDSElRX1NSVlNUQVRFX09QRU5JTkcsCisJVkNISVFfU1JWU1RBVEVfT1BFTiwKKwlWQ0hJUV9TUlZTVEFURV9PUEVOU1lOQywKKwlWQ0hJUV9TUlZTVEFURV9DTE9TRVNFTlQsCisJVkNISVFfU1JWU1RBVEVfQ0xPU0VSRUNWRCwKKwlWQ0hJUV9TUlZTVEFURV9DTE9TRVdBSVQsCisJVkNISVFfU1JWU1RBVEVfQ0xPU0VECit9OworCitlbnVtIHsKKwlWQ0hJUV9QT0xMX1RFUk1JTkFURSwKKwlWQ0hJUV9QT0xMX1JFTU9WRSwKKwlWQ0hJUV9QT0xMX1RYTk9USUZZLAorCVZDSElRX1BPTExfUlhOT1RJRlksCisJVkNISVFfUE9MTF9DT1VOVAorfTsKKwordHlwZWRlZiBlbnVtIHsKKwlWQ0hJUV9CVUxLX1RSQU5TTUlULAorCVZDSElRX0JVTEtfUkVDRUlWRQorfSBWQ0hJUV9CVUxLX0RJUl9UOworCit0eXBlZGVmIHZvaWQgKCpWQ0hJUV9VU0VSREFUQV9URVJNX1QpKHZvaWQgKnVzZXJkYXRhKTsKKwordHlwZWRlZiBzdHJ1Y3QgdmNoaXFfYnVsa19zdHJ1Y3QgeworCXNob3J0IG1vZGU7CisJc2hvcnQgZGlyOworCXZvaWQgKnVzZXJkYXRhOworCVZDSElfTUVNX0hBTkRMRV9UIGhhbmRsZTsKKwl2b2lkICpkYXRhOworCWludCBzaXplOworCXZvaWQgKnJlbW90ZV9kYXRhOworCWludCByZW1vdGVfc2l6ZTsKKwlpbnQgYWN0dWFsOworfSBWQ0hJUV9CVUxLX1Q7CisKK3R5cGVkZWYgc3RydWN0IHZjaGlxX2J1bGtfcXVldWVfc3RydWN0IHsKKwlpbnQgbG9jYWxfaW5zZXJ0OyAgLyogV2hlcmUgdG8gaW5zZXJ0IHRoZSBuZXh0IGxvY2FsIGJ1bGsgKi8KKwlpbnQgcmVtb3RlX2luc2VydDsgLyogV2hlcmUgdG8gaW5zZXJ0IHRoZSBuZXh0IHJlbW90ZSBidWxrIChtYXN0ZXIpICovCisJaW50IHByb2Nlc3M7ICAgICAgIC8qIEJ1bGsgdG8gdHJhbnNmZXIgbmV4dCAqLworCWludCByZW1vdGVfbm90aWZ5OyAvKiBCdWxrIHRvIG5vdGlmeSB0aGUgcmVtb3RlIGNsaWVudCBvZiBuZXh0IChtc3RyKSAqLworCWludCByZW1vdmU7ICAgICAgICAvKiBCdWxrIHRvIG5vdGlmeSB0aGUgbG9jYWwgY2xpZW50IG9mLCBhbmQgcmVtb3ZlLAorCQkJICAgKiogbmV4dCAqLworCVZDSElRX0JVTEtfVCBidWxrc1tWQ0hJUV9OVU1fU0VSVklDRV9CVUxLU107Cit9IFZDSElRX0JVTEtfUVVFVUVfVDsKKwordHlwZWRlZiBzdHJ1Y3QgcmVtb3RlX2V2ZW50X3N0cnVjdCB7CisJaW50IGFybWVkOworCWludCBmaXJlZDsKKwlzdHJ1Y3Qgc2VtYXBob3JlICpldmVudDsKK30gUkVNT1RFX0VWRU5UX1Q7CisKK3R5cGVkZWYgc3RydWN0IG9wYXF1ZV9wbGF0Zm9ybV9zdGF0ZV90ICpWQ0hJUV9QTEFURk9STV9TVEFURV9UOworCit0eXBlZGVmIHN0cnVjdCB2Y2hpcV9zdGF0ZV9zdHJ1Y3QgVkNISVFfU1RBVEVfVDsKKwordHlwZWRlZiBzdHJ1Y3QgdmNoaXFfc2xvdF9zdHJ1Y3QgeworCWNoYXIgZGF0YVtWQ0hJUV9TTE9UX1NJWkVdOworfSBWQ0hJUV9TTE9UX1Q7CisKK3R5cGVkZWYgc3RydWN0IHZjaGlxX3Nsb3RfaW5mb19zdHJ1Y3QgeworCS8qIFVzZSB0d28gY291bnRlcnMgcmF0aGVyIHRoYW4gb25lIHRvIGF2b2lkIHRoZSBuZWVkIGZvciBhIG11dGV4LiAqLworCXNob3J0IHVzZV9jb3VudDsKKwlzaG9ydCByZWxlYXNlX2NvdW50OworfSBWQ0hJUV9TTE9UX0lORk9fVDsKKwordHlwZWRlZiBzdHJ1Y3QgdmNoaXFfc2VydmljZV9zdHJ1Y3QgeworCVZDSElRX1NFUlZJQ0VfQkFTRV9UIGJhc2U7CisJVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGU7CisJdW5zaWduZWQgaW50IHJlZl9jb3VudDsKKwlpbnQgc3J2c3RhdGU7CisJVkNISVFfVVNFUkRBVEFfVEVSTV9UIHVzZXJkYXRhX3Rlcm07CisJdW5zaWduZWQgaW50IGxvY2FscG9ydDsKKwl1bnNpZ25lZCBpbnQgcmVtb3RlcG9ydDsKKwlpbnQgcHVibGljX2ZvdXJjYzsKKwlpbnQgY2xpZW50X2lkOworCWNoYXIgYXV0b19jbG9zZTsKKwljaGFyIHN5bmM7CisJY2hhciBjbG9zaW5nOworCWNoYXIgdHJhY2U7CisJYXRvbWljX3QgcG9sbF9mbGFnczsKKwlzaG9ydCB2ZXJzaW9uOworCXNob3J0IHZlcnNpb25fbWluOworCXNob3J0IHBlZXJfdmVyc2lvbjsKKworCVZDSElRX1NUQVRFX1QgKnN0YXRlOworCVZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2U7CisKKwlpbnQgc2VydmljZV91c2VfY291bnQ7CisKKwlWQ0hJUV9CVUxLX1FVRVVFX1QgYnVsa190eDsKKwlWQ0hJUV9CVUxLX1FVRVVFX1QgYnVsa19yeDsKKworCXN0cnVjdCBzZW1hcGhvcmUgcmVtb3ZlX2V2ZW50OworCXN0cnVjdCBzZW1hcGhvcmUgYnVsa19yZW1vdmVfZXZlbnQ7CisJc3RydWN0IG11dGV4IGJ1bGtfbXV0ZXg7CisKKwlzdHJ1Y3Qgc2VydmljZV9zdGF0c19zdHJ1Y3QgeworCQlpbnQgcXVvdGFfc3RhbGxzOworCQlpbnQgc2xvdF9zdGFsbHM7CisJCWludCBidWxrX3N0YWxsczsKKwkJaW50IGVycm9yX2NvdW50OworCQlpbnQgY3RybF90eF9jb3VudDsKKwkJaW50IGN0cmxfcnhfY291bnQ7CisJCWludCBidWxrX3R4X2NvdW50OworCQlpbnQgYnVsa19yeF9jb3VudDsKKwkJaW50IGJ1bGtfYWJvcnRlZF9jb3VudDsKKwkJdWludDY0X3QgY3RybF90eF9ieXRlczsKKwkJdWludDY0X3QgY3RybF9yeF9ieXRlczsKKwkJdWludDY0X3QgYnVsa190eF9ieXRlczsKKwkJdWludDY0X3QgYnVsa19yeF9ieXRlczsKKwl9IHN0YXRzOworfSBWQ0hJUV9TRVJWSUNFX1Q7CisKKy8qIFRoZSBxdW90YSBpbmZvcm1hdGlvbiBpcyBvdXRzaWRlIFZDSElRX1NFUlZJQ0VfVCBzbyB0aGF0IGl0IGNhbiBiZQorCXN0YXRpY2FsbHkgYWxsb2NhdGVkLCBzaW5jZSBmb3IgYWNjb3VudGluZyByZWFzb25zIGEgc2VydmljZSdzIHNsb3QKKwl1c2FnZSBpcyBjYXJyaWVkIG92ZXIgYmV0d2VlbiB1c2VycyBvZiB0aGUgc2FtZSBwb3J0IG51bWJlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgdmNoaXFfc2VydmljZV9xdW90YV9zdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0IHNsb3RfcXVvdGE7CisJdW5zaWduZWQgc2hvcnQgc2xvdF91c2VfY291bnQ7CisJdW5zaWduZWQgc2hvcnQgbWVzc2FnZV9xdW90YTsKKwl1bnNpZ25lZCBzaG9ydCBtZXNzYWdlX3VzZV9jb3VudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHF1b3RhX2V2ZW50OworCWludCBwcmV2aW91c190eF9pbmRleDsKK30gVkNISVFfU0VSVklDRV9RVU9UQV9UOworCit0eXBlZGVmIHN0cnVjdCB2Y2hpcV9zaGFyZWRfc3RhdGVfc3RydWN0IHsKKworCS8qIEEgbm9uLXplcm8gdmFsdWUgaGVyZSBpbmRpY2F0ZXMgdGhhdCB0aGUgY29udGVudCBpcyB2YWxpZC4gKi8KKwlpbnQgaW5pdGlhbGlzZWQ7CisKKwkvKiBUaGUgZmlyc3QgYW5kIGxhc3QgKGluY2x1c2l2ZSkgc2xvdHMgYWxsb2NhdGVkIHRvIHRoZSBvd25lci4gKi8KKwlpbnQgc2xvdF9maXJzdDsKKwlpbnQgc2xvdF9sYXN0OworCisJLyogVGhlIHNsb3QgYWxsb2NhdGVkIHRvIHN5bmNocm9ub3VzIG1lc3NhZ2VzIGZyb20gdGhlIG93bmVyLiAqLworCWludCBzbG90X3N5bmM7CisKKwkvKiBTaWduYWxsaW5nIHRoaXMgZXZlbnQgaW5kaWNhdGVzIHRoYXQgb3duZXIncyBzbG90IGhhbmRsZXIgdGhyZWFkCisJKiogc2hvdWxkIHJ1bi4gKi8KKwlSRU1PVEVfRVZFTlRfVCB0cmlnZ2VyOworCisJLyogSW5kaWNhdGVzIHRoZSBieXRlIHBvc2l0aW9uIHdpdGhpbiB0aGUgc3RyZWFtIHdoZXJlIHRoZSBuZXh0IG1lc3NhZ2UKKwkqKiB3aWxsIGJlIHdyaXR0ZW4uIFRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIGFyZSBhbiBpbmRleCBpbnRvIHRoZQorCSoqIHNsb3QuIFRoZSBuZXh0IGJpdHMgYXJlIHRoZSBpbmRleCBvZiB0aGUgc2xvdCBpbiBzbG90X3F1ZXVlLiAqLworCWludCB0eF9wb3M7CisKKwkvKiBUaGlzIGV2ZW50IHNob3VsZCBiZSBzaWduYWxsZWQgd2hlbiBhIHNsb3QgaXMgcmVjeWNsZWQuICovCisJUkVNT1RFX0VWRU5UX1QgcmVjeWNsZTsKKworCS8qIFRoZSBzbG90X3F1ZXVlIGluZGV4IHdoZXJlIHRoZSBuZXh0IHJlY3ljbGVkIHNsb3Qgd2lsbCBiZSB3cml0dGVuLiAqLworCWludCBzbG90X3F1ZXVlX3JlY3ljbGU7CisKKwkvKiBUaGlzIGV2ZW50IHNob3VsZCBiZSBzaWduYWxsZWQgd2hlbiBhIHN5bmNocm9ub3VzIG1lc3NhZ2UgaXMgc2VudC4gKi8KKwlSRU1PVEVfRVZFTlRfVCBzeW5jX3RyaWdnZXI7CisKKwkvKiBUaGlzIGV2ZW50IHNob3VsZCBiZSBzaWduYWxsZWQgd2hlbiBhIHN5bmNocm9ub3VzIG1lc3NhZ2UgaGFzIGJlZW4KKwkqKiByZWxlYXNlZC4gKi8KKwlSRU1PVEVfRVZFTlRfVCBzeW5jX3JlbGVhc2U7CisKKwkvKiBBIGNpcmN1bGFyIGJ1ZmZlciBvZiBzbG90IGluZGV4ZXMuICovCisJaW50IHNsb3RfcXVldWVbVkNISVFfTUFYX1NMT1RTX1BFUl9TSURFXTsKKworCS8qIERlYnVnZ2luZyBzdGF0ZSAqLworCWludCBkZWJ1Z1tERUJVR19NQVhdOworfSBWQ0hJUV9TSEFSRURfU1RBVEVfVDsKKwordHlwZWRlZiBzdHJ1Y3QgdmNoaXFfc2xvdF96ZXJvX3N0cnVjdCB7CisJaW50IG1hZ2ljOworCXNob3J0IHZlcnNpb247CisJc2hvcnQgdmVyc2lvbl9taW47CisJaW50IHNsb3RfemVyb19zaXplOworCWludCBzbG90X3NpemU7CisJaW50IG1heF9zbG90czsKKwlpbnQgbWF4X3Nsb3RzX3Blcl9zaWRlOworCWludCBwbGF0Zm9ybV9kYXRhWzJdOworCVZDSElRX1NIQVJFRF9TVEFURV9UIG1hc3RlcjsKKwlWQ0hJUV9TSEFSRURfU1RBVEVfVCBzbGF2ZTsKKwlWQ0hJUV9TTE9UX0lORk9fVCBzbG90c1tWQ0hJUV9NQVhfU0xPVFNdOworfSBWQ0hJUV9TTE9UX1pFUk9fVDsKKworc3RydWN0IHZjaGlxX3N0YXRlX3N0cnVjdCB7CisJaW50IGlkOworCWludCBpbml0aWFsaXNlZDsKKwlWQ0hJUV9DT05OU1RBVEVfVCBjb25uX3N0YXRlOworCWludCBpc19tYXN0ZXI7CisJc2hvcnQgdmVyc2lvbl9jb21tb247CisKKwlWQ0hJUV9TSEFSRURfU1RBVEVfVCAqbG9jYWw7CisJVkNISVFfU0hBUkVEX1NUQVRFX1QgKnJlbW90ZTsKKwlWQ0hJUV9TTE9UX1QgKnNsb3RfZGF0YTsKKworCXVuc2lnbmVkIHNob3J0IGRlZmF1bHRfc2xvdF9xdW90YTsKKwl1bnNpZ25lZCBzaG9ydCBkZWZhdWx0X21lc3NhZ2VfcXVvdGE7CisKKwkvKiBFdmVudCBpbmRpY2F0aW5nIGNvbm5lY3QgbWVzc2FnZSByZWNlaXZlZCAqLworCXN0cnVjdCBzZW1hcGhvcmUgY29ubmVjdDsKKworCS8qIE11dGV4IHByb3RlY3Rpbmcgc2VydmljZXMgKi8KKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJVkNISVFfSU5TVEFOQ0VfVCAqaW5zdGFuY2U7CisKKwkvKiBQcm9jZXNzZXMgaW5jb21pbmcgbWVzc2FnZXMgKi8KKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnNsb3RfaGFuZGxlcl90aHJlYWQ7CisKKwkvKiBQcm9jZXNzZXMgcmVjeWNsZWQgc2xvdHMgKi8KKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnJlY3ljbGVfdGhyZWFkOworCisJLyogUHJvY2Vzc2VzIHN5bmNocm9ub3VzIG1lc3NhZ2VzICovCisJc3RydWN0IHRhc2tfc3RydWN0ICpzeW5jX3RocmVhZDsKKworCS8qIExvY2FsIGltcGxlbWVudGF0aW9uIG9mIHRoZSB0cmlnZ2VyIHJlbW90ZSBldmVudCAqLworCXN0cnVjdCBzZW1hcGhvcmUgdHJpZ2dlcl9ldmVudDsKKworCS8qIExvY2FsIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZWN5Y2xlIHJlbW90ZSBldmVudCAqLworCXN0cnVjdCBzZW1hcGhvcmUgcmVjeWNsZV9ldmVudDsKKworCS8qIExvY2FsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzeW5jIHRyaWdnZXIgcmVtb3RlIGV2ZW50ICovCisJc3RydWN0IHNlbWFwaG9yZSBzeW5jX3RyaWdnZXJfZXZlbnQ7CisKKwkvKiBMb2NhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3luYyByZWxlYXNlIHJlbW90ZSBldmVudCAqLworCXN0cnVjdCBzZW1hcGhvcmUgc3luY19yZWxlYXNlX2V2ZW50OworCisJY2hhciAqdHhfZGF0YTsKKwljaGFyICpyeF9kYXRhOworCVZDSElRX1NMT1RfSU5GT19UICpyeF9pbmZvOworCisJc3RydWN0IG11dGV4IHNsb3RfbXV0ZXg7CisKKwlzdHJ1Y3QgbXV0ZXggcmVjeWNsZV9tdXRleDsKKworCXN0cnVjdCBtdXRleCBzeW5jX211dGV4OworCisJc3RydWN0IG11dGV4IGJ1bGtfdHJhbnNmZXJfbXV0ZXg7CisKKwkvKiBJbmRpY2F0ZXMgdGhlIGJ5dGUgcG9zaXRpb24gd2l0aGluIHRoZSBzdHJlYW0gZnJvbSB3aGVyZSB0aGUgbmV4dAorCSoqIG1lc3NhZ2Ugd2lsbCBiZSByZWFkLiBUaGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBhcmUgYW4gaW5kZXggaW50bworCSoqIHRoZSBzbG90LlRoZSBuZXh0IGJpdHMgYXJlIHRoZSBpbmRleCBvZiB0aGUgc2xvdCBpbgorCSoqIHJlbW90ZS0+c2xvdF9xdWV1ZS4gKi8KKwlpbnQgcnhfcG9zOworCisJLyogQSBjYWNoZWQgY29weSBvZiBsb2NhbC0+dHhfcG9zLiBPbmx5IHdyaXRlIHRvIGxvY2FsLT50eF9wb3MsIGFuZCByZWFkCisJCWZyb20gcmVtb3RlLT50eF9wb3MuICovCisJaW50IGxvY2FsX3R4X3BvczsKKworCS8qIFRoZSBzbG90X3F1ZXVlIGluZGV4IG9mIHRoZSBzbG90IHRvIGJlY29tZSBhdmFpbGFibGUgbmV4dC4gKi8KKwlpbnQgc2xvdF9xdWV1ZV9hdmFpbGFibGU7CisKKwkvKiBBIGZsYWcgdG8gaW5kaWNhdGUgaWYgYW55IHBvbGwgaGFzIGJlZW4gcmVxdWVzdGVkICovCisJaW50IHBvbGxfbmVlZGVkOworCisJLyogVGhzIGluZGV4IG9mIHRoZSBwcmV2aW91cyBzbG90IHVzZWQgZm9yIGRhdGEgbWVzc2FnZXMuICovCisJaW50IHByZXZpb3VzX2RhdGFfaW5kZXg7CisKKwkvKiBUaGUgbnVtYmVyIG9mIHNsb3RzIG9jY3VwaWVkIGJ5IGRhdGEgbWVzc2FnZXMuICovCisJdW5zaWduZWQgc2hvcnQgZGF0YV91c2VfY291bnQ7CisKKwkvKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc2xvdHMgdG8gYmUgb2NjdXBpZWQgYnkgZGF0YSBtZXNzYWdlcy4gKi8KKwl1bnNpZ25lZCBzaG9ydCBkYXRhX3F1b3RhOworCisJLyogQW4gYXJyYXkgb2YgYml0IHNldHMgaW5kaWNhdGluZyB3aGljaCBzZXJ2aWNlcyBtdXN0IGJlIHBvbGxlZC4gKi8KKwlhdG9taWNfdCBwb2xsX3NlcnZpY2VzW0JJVFNFVF9TSVpFKFZDSElRX01BWF9TRVJWSUNFUyldOworCisJLyogVGhlIG51bWJlciBvZiB0aGUgZmlyc3QgdW51c2VkIHNlcnZpY2UgKi8KKwlpbnQgdW51c2VkX3NlcnZpY2U7CisKKwkvKiBTaWduYWxsZWQgd2hlbiBhIGZyZWUgc2xvdCBiZWNvbWVzIGF2YWlsYWJsZS4gKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIHNsb3RfYXZhaWxhYmxlX2V2ZW50OworCisJc3RydWN0IHNlbWFwaG9yZSBzbG90X3JlbW92ZV9ldmVudDsKKworCS8qIFNpZ25hbGxlZCB3aGVuIGEgZnJlZSBkYXRhIHNsb3QgYmVjb21lcyBhdmFpbGFibGUuICovCisJc3RydWN0IHNlbWFwaG9yZSBkYXRhX3F1b3RhX2V2ZW50OworCisJLyogSW5jcmVtZW50ZWQgd2hlbiB0aGVyZSBhcmUgYnVsayB0cmFuc2ZlcnMgd2hpY2ggY2Fubm90IGJlIHByb2Nlc3NlZAorCSAqIHdoaWxzdCBwYXVzZWQgYW5kIG11c3QgYmUgcHJvY2Vzc2VkIG9uIHJlc3VtZSAqLworCWludCBkZWZlcnJlZF9idWxrczsKKworCXN0cnVjdCBzdGF0ZV9zdGF0c19zdHJ1Y3QgeworCQlpbnQgc2xvdF9zdGFsbHM7CisJCWludCBkYXRhX3N0YWxsczsKKwkJaW50IGN0cmxfdHhfY291bnQ7CisJCWludCBjdHJsX3J4X2NvdW50OworCQlpbnQgZXJyb3JfY291bnQ7CisJfSBzdGF0czsKKworCVZDSElRX1NFUlZJQ0VfVCAqIHNlcnZpY2VzW1ZDSElRX01BWF9TRVJWSUNFU107CisJVkNISVFfU0VSVklDRV9RVU9UQV9UIHNlcnZpY2VfcXVvdGFzW1ZDSElRX01BWF9TRVJWSUNFU107CisJVkNISVFfU0xPVF9JTkZPX1Qgc2xvdF9pbmZvW1ZDSElRX01BWF9TTE9UU107CisKKwlWQ0hJUV9QTEFURk9STV9TVEFURV9UIHBsYXRmb3JtX3N0YXRlOworfTsKKworc3RydWN0IGJ1bGtfd2FpdGVyIHsKKwlWQ0hJUV9CVUxLX1QgKmJ1bGs7CisJc3RydWN0IHNlbWFwaG9yZSBldmVudDsKKwlpbnQgYWN0dWFsOworfTsKKworZXh0ZXJuIHNwaW5sb2NrX3QgYnVsa193YWl0ZXJfc3BpbmxvY2s7CisKK2V4dGVybiBpbnQgdmNoaXFfY29yZV9sb2dfbGV2ZWw7CitleHRlcm4gaW50IHZjaGlxX2NvcmVfbXNnX2xvZ19sZXZlbDsKK2V4dGVybiBpbnQgdmNoaXFfc3luY19sb2dfbGV2ZWw7CisKK2V4dGVybiBWQ0hJUV9TVEFURV9UICp2Y2hpcV9zdGF0ZXNbVkNISVFfTUFYX1NUQVRFU107CisKK2V4dGVybiBjb25zdCBjaGFyICoKK2dldF9jb25uX3N0YXRlX25hbWUoVkNISVFfQ09OTlNUQVRFX1QgY29ubl9zdGF0ZSk7CisKK2V4dGVybiBWQ0hJUV9TTE9UX1pFUk9fVCAqCit2Y2hpcV9pbml0X3Nsb3RzKHZvaWQgKm1lbV9iYXNlLCBpbnQgbWVtX3NpemUpOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX2luaXRfc3RhdGUoVkNISVFfU1RBVEVfVCAqc3RhdGUsIFZDSElRX1NMT1RfWkVST19UICpzbG90X3plcm8sCisJaW50IGlzX21hc3Rlcik7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVAordmNoaXFfY29ubmVjdF9pbnRlcm5hbChWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSk7CisKK2V4dGVybiBWQ0hJUV9TRVJWSUNFX1QgKgordmNoaXFfYWRkX3NlcnZpY2VfaW50ZXJuYWwoVkNISVFfU1RBVEVfVCAqc3RhdGUsCisJY29uc3QgVkNISVFfU0VSVklDRV9QQVJBTVNfVCAqcGFyYW1zLCBpbnQgc3J2c3RhdGUsCisJVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSwgVkNISVFfVVNFUkRBVEFfVEVSTV9UIHVzZXJkYXRhX3Rlcm0pOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX29wZW5fc2VydmljZV9pbnRlcm5hbChWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UsIGludCBjbGllbnRfaWQpOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX2Nsb3NlX3NlcnZpY2VfaW50ZXJuYWwoVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlLCBpbnQgY2xvc2VfcmVjdmQpOworCitleHRlcm4gdm9pZAordmNoaXFfdGVybWluYXRlX3NlcnZpY2VfaW50ZXJuYWwoVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlKTsKKworZXh0ZXJuIHZvaWQKK3ZjaGlxX2ZyZWVfc2VydmljZV9pbnRlcm5hbChWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UpOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3NodXRkb3duX2ludGVybmFsKFZDSElRX1NUQVRFX1QgKnN0YXRlLCBWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlKTsKKworZXh0ZXJuIFZDSElRX1NUQVRVU19UCit2Y2hpcV9wYXVzZV9pbnRlcm5hbChWQ0hJUV9TVEFURV9UICpzdGF0ZSk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVAordmNoaXFfcmVzdW1lX2ludGVybmFsKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIHZvaWQKK3JlbW90ZV9ldmVudF9wb2xsYWxsKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIFZDSElRX1NUQVRVU19UCit2Y2hpcV9idWxrX3RyYW5zZmVyKFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorCVZDSElfTUVNX0hBTkRMRV9UIG1lbWhhbmRsZSwgdm9pZCAqb2Zmc2V0LCBpbnQgc2l6ZSwgdm9pZCAqdXNlcmRhdGEsCisJVkNISVFfQlVMS19NT0RFX1QgbW9kZSwgVkNISVFfQlVMS19ESVJfVCBkaXIpOworCitleHRlcm4gdm9pZAordmNoaXFfZHVtcF9zdGF0ZSh2b2lkICpkdW1wX2NvbnRleHQsIFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIHZvaWQKK3ZjaGlxX2R1bXBfc2VydmljZV9zdGF0ZSh2b2lkICpkdW1wX2NvbnRleHQsIFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSk7CisKK2V4dGVybiB2b2lkCit2Y2hpcV9sb3VkX2Vycm9yX2hlYWRlcih2b2lkKTsKKworZXh0ZXJuIHZvaWQKK3ZjaGlxX2xvdWRfZXJyb3JfZm9vdGVyKHZvaWQpOworCitleHRlcm4gdm9pZAorcmVxdWVzdF9wb2xsKFZDSElRX1NUQVRFX1QgKnN0YXRlLCBWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UsIGludCBwb2xsX3R5cGUpOworCitzdGF0aWMgaW5saW5lIFZDSElRX1NFUlZJQ0VfVCAqCitoYW5kbGVfdG9fc2VydmljZShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSkKK3sKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZSA9IHZjaGlxX3N0YXRlc1soaGFuZGxlIC8gVkNISVFfTUFYX1NFUlZJQ0VTKSAmCisJCShWQ0hJUV9NQVhfU1RBVEVTIC0gMSldOworCWlmICghc3RhdGUpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIHN0YXRlLT5zZXJ2aWNlc1toYW5kbGUgJiAoVkNISVFfTUFYX1NFUlZJQ0VTIC0gMSldOworfQorCitleHRlcm4gVkNISVFfU0VSVklDRV9UICoKK2ZpbmRfc2VydmljZV9ieV9oYW5kbGUoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUpOworCitleHRlcm4gVkNISVFfU0VSVklDRV9UICoKK2ZpbmRfc2VydmljZV9ieV9wb3J0KFZDSElRX1NUQVRFX1QgKnN0YXRlLCBpbnQgbG9jYWxwb3J0KTsKKworZXh0ZXJuIFZDSElRX1NFUlZJQ0VfVCAqCitmaW5kX3NlcnZpY2VfZm9yX2luc3RhbmNlKFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UsCisJVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUpOworCitleHRlcm4gVkNISVFfU0VSVklDRV9UICoKK2ZpbmRfY2xvc2VkX3NlcnZpY2VfZm9yX2luc3RhbmNlKFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UsCisJVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUpOworCitleHRlcm4gVkNISVFfU0VSVklDRV9UICoKK25leHRfc2VydmljZV9ieV9pbnN0YW5jZShWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSwKKwlpbnQgKnBpZHgpOworCitleHRlcm4gdm9pZAorbG9ja19zZXJ2aWNlKFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSk7CisKK2V4dGVybiB2b2lkCit1bmxvY2tfc2VydmljZShWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UpOworCisvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGZyb20gdmNoaXFfY29yZSwgYW5kIGV4dGVybmFsCisqKiBpbXBsZW1lbnRhdGlvbnMgbXVzdCBiZSBwcm92aWRlZC4gKi8KKworZXh0ZXJuIFZDSElRX1NUQVRVU19UCit2Y2hpcV9wcmVwYXJlX2J1bGtfZGF0YShWQ0hJUV9CVUxLX1QgKmJ1bGssCisJVkNISV9NRU1fSEFORExFX1QgbWVtaGFuZGxlLCB2b2lkICpvZmZzZXQsIGludCBzaXplLCBpbnQgZGlyKTsKKworZXh0ZXJuIHZvaWQKK3ZjaGlxX3RyYW5zZmVyX2J1bGsoVkNISVFfQlVMS19UICpidWxrKTsKKworZXh0ZXJuIHZvaWQKK3ZjaGlxX2NvbXBsZXRlX2J1bGsoVkNISVFfQlVMS19UICpidWxrKTsKKworZXh0ZXJuIFZDSElRX1NUQVRVU19UCit2Y2hpcV9jb3B5X2Zyb21fdXNlcih2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgaW50IHNpemUpOworCitleHRlcm4gdm9pZAorcmVtb3RlX2V2ZW50X3NpZ25hbChSRU1PVEVfRVZFTlRfVCAqZXZlbnQpOworCit2b2lkCit2Y2hpcV9wbGF0Zm9ybV9jaGVja19zdXNwZW5kKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIHZvaWQKK3ZjaGlxX3BsYXRmb3JtX3BhdXNlZChWQ0hJUV9TVEFURV9UICpzdGF0ZSk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVAordmNoaXFfcGxhdGZvcm1fcmVzdW1lKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIHZvaWQKK3ZjaGlxX3BsYXRmb3JtX3Jlc3VtZWQoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gdm9pZAordmNoaXFfZHVtcCh2b2lkICpkdW1wX2NvbnRleHQsIGNvbnN0IGNoYXIgKnN0ciwgaW50IGxlbik7CisKK2V4dGVybiB2b2lkCit2Y2hpcV9kdW1wX3BsYXRmb3JtX3N0YXRlKHZvaWQgKmR1bXBfY29udGV4dCk7CisKK2V4dGVybiB2b2lkCit2Y2hpcV9kdW1wX3BsYXRmb3JtX2luc3RhbmNlcyh2b2lkICpkdW1wX2NvbnRleHQpOworCitleHRlcm4gdm9pZAordmNoaXFfZHVtcF9wbGF0Zm9ybV9zZXJ2aWNlX3N0YXRlKHZvaWQgKmR1bXBfY29udGV4dCwKKwlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UpOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3VzZV9zZXJ2aWNlX2ludGVybmFsKFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVAordmNoaXFfcmVsZWFzZV9zZXJ2aWNlX2ludGVybmFsKFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSk7CisKK2V4dGVybiB2b2lkCit2Y2hpcV9vbl9yZW1vdGVfdXNlKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIHZvaWQKK3ZjaGlxX29uX3JlbW90ZV9yZWxlYXNlKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIFZDSElRX1NUQVRVU19UCit2Y2hpcV9wbGF0Zm9ybV9pbml0X3N0YXRlKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIFZDSElRX1NUQVRVU19UCit2Y2hpcV9jaGVja19zZXJ2aWNlKFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSk7CisKK2V4dGVybiB2b2lkCit2Y2hpcV9vbl9yZW1vdGVfdXNlX2FjdGl2ZShWQ0hJUV9TVEFURV9UICpzdGF0ZSk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVAordmNoaXFfc2VuZF9yZW1vdGVfdXNlKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIFZDSElRX1NUQVRVU19UCit2Y2hpcV9zZW5kX3JlbW90ZV9yZWxlYXNlKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIFZDSElRX1NUQVRVU19UCit2Y2hpcV9zZW5kX3JlbW90ZV91c2VfYWN0aXZlKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIHZvaWQKK3ZjaGlxX3BsYXRmb3JtX2Nvbm5fc3RhdGVfY2hhbmdlZChWQ0hJUV9TVEFURV9UICpzdGF0ZSwKKwlWQ0hJUV9DT05OU1RBVEVfVCBvbGRzdGF0ZSwgVkNISVFfQ09OTlNUQVRFX1QgbmV3c3RhdGUpOworCitleHRlcm4gdm9pZAordmNoaXFfcGxhdGZvcm1faGFuZGxlX3RpbWVvdXQoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gdm9pZAordmNoaXFfc2V0X2Nvbm5fc3RhdGUoVkNISVFfU1RBVEVfVCAqc3RhdGUsIFZDSElRX0NPTk5TVEFURV9UIG5ld3N0YXRlKTsKKworCitleHRlcm4gdm9pZAordmNoaXFfbG9nX2R1bXBfbWVtKGNvbnN0IGNoYXIgKmxhYmVsLCB1aW50MzJfdCBhZGRyLCBjb25zdCB2b2lkICp2b2lkTWVtLAorCXNpemVfdCBudW1CeXRlcyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2RlYnVnZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTAzMjEzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9kZWJ1Z2ZzLmMKQEAgLTAsMCArMSwzODMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0IFJhc3BiZXJyeSBQaSAoVHJhZGluZykgTHRkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKworI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlICJ2Y2hpcV9jb3JlLmgiCisjaW5jbHVkZSAidmNoaXFfYXJtLmgiCisjaW5jbHVkZSAidmNoaXFfZGVidWdmcy5oIgorCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgbG9nIGNhdGVnb3J5IGVudHJpZXMKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgREVCVUdGU19XUklURV9CVUZfU0laRSAyNTYKKworI2RlZmluZSBWQ0hJUV9MT0dfRVJST1JfU1RSICAgImVycm9yIgorI2RlZmluZSBWQ0hJUV9MT0dfV0FSTklOR19TVFIgIndhcm5pbmciCisjZGVmaW5lIFZDSElRX0xPR19JTkZPX1NUUiAgICAiaW5mbyIKKyNkZWZpbmUgVkNISVFfTE9HX1RSQUNFX1NUUiAgICJ0cmFjZSIKKworCisvKiBUb3AtbGV2ZWwgZGVidWcgaW5mbyAqLworc3RydWN0IHZjaGlxX2RlYnVnZnNfaW5mbyB7CisJLyogR2xvYmFsICd2Y2hpcScgZGVidWdmcyBlbnRyeSB1c2VkIGJ5IGFsbCBpbnN0YW5jZXMgKi8KKwlzdHJ1Y3QgZGVudHJ5ICp2Y2hpcV9jZmdfZGlyOworCisJLyogb25lIGVudHJ5IHBlciBjbGllbnQgcHJvY2VzcyAqLworCXN0cnVjdCBkZW50cnkgKmNsaWVudHM7CisKKwkvKiBsb2cgY2F0ZWdvcmllcyAqLworCXN0cnVjdCBkZW50cnkgKmxvZ19jYXRlZ29yaWVzOworfTsKKworc3RhdGljIHN0cnVjdCB2Y2hpcV9kZWJ1Z2ZzX2luZm8gZGVidWdmc19pbmZvOworCisvKiBMb2cgY2F0ZWdvcnkgZGVidWdmcyBlbnRyaWVzICovCitzdHJ1Y3QgdmNoaXFfZGVidWdmc19sb2dfZW50cnkgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50ICpwbGV2ZWw7CisJc3RydWN0IGRlbnRyeSAqZGlyOworfTsKKworc3RhdGljIHN0cnVjdCB2Y2hpcV9kZWJ1Z2ZzX2xvZ19lbnRyeSB2Y2hpcV9kZWJ1Z2ZzX2xvZ19lbnRyaWVzW10gPSB7CisJeyAiY29yZSIsICZ2Y2hpcV9jb3JlX2xvZ19sZXZlbCB9LAorCXsgIm1zZyIsICAmdmNoaXFfY29yZV9tc2dfbG9nX2xldmVsIH0sCisJeyAic3luYyIsICZ2Y2hpcV9zeW5jX2xvZ19sZXZlbCB9LAorCXsgInN1c3AiLCAmdmNoaXFfc3VzcF9sb2dfbGV2ZWwgfSwKKwl7ICJhcm0iLCAgJnZjaGlxX2FybV9sb2dfbGV2ZWwgfSwKK307CitzdGF0aWMgaW50IG5fbG9nX2VudHJpZXMgPQorCXNpemVvZih2Y2hpcV9kZWJ1Z2ZzX2xvZ19lbnRyaWVzKS9zaXplb2YodmNoaXFfZGVidWdmc19sb2dfZW50cmllc1swXSk7CisKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKnZjaGlxX2NsaWVudHNfdG9wKHZvaWQpOworc3RhdGljIHN0cnVjdCBkZW50cnkgKnZjaGlxX2RlYnVnZnNfdG9wKHZvaWQpOworCitzdGF0aWMgaW50IGRlYnVnZnNfbG9nX3Nob3coc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICpvZmZzZXQpCit7CisJaW50ICpsZXZwID0gZi0+cHJpdmF0ZTsKKwljaGFyICpsb2dfdmFsdWUgPSBOVUxMOworCisJc3dpdGNoICgqbGV2cCkgeworCWNhc2UgVkNISVFfTE9HX0VSUk9SOgorCQlsb2dfdmFsdWUgPSBWQ0hJUV9MT0dfRVJST1JfU1RSOworCQlicmVhazsKKwljYXNlIFZDSElRX0xPR19XQVJOSU5HOgorCQlsb2dfdmFsdWUgPSBWQ0hJUV9MT0dfV0FSTklOR19TVFI7CisJCWJyZWFrOworCWNhc2UgVkNISVFfTE9HX0lORk86CisJCWxvZ192YWx1ZSA9IFZDSElRX0xPR19JTkZPX1NUUjsKKwkJYnJlYWs7CisJY2FzZSBWQ0hJUV9MT0dfVFJBQ0U6CisJCWxvZ192YWx1ZSA9IFZDSElRX0xPR19UUkFDRV9TVFI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXNlcV9wcmludGYoZiwgIiVzXG4iLCBsb2dfdmFsdWUgPyBsb2dfdmFsdWUgOiAiKG51bGwpIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWJ1Z2ZzX2xvZ19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBkZWJ1Z2ZzX2xvZ19zaG93LCBpbm9kZS0+aV9wcml2YXRlKTsKK30KKworc3RhdGljIGludCBkZWJ1Z2ZzX2xvZ193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwljb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBzZXFfZmlsZSAqZiA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50ICpsZXZwID0gZi0+cHJpdmF0ZTsKKwljaGFyIGtidWZbREVCVUdGU19XUklURV9CVUZfU0laRSArIDFdOworCisJbWVtc2V0KGtidWYsIDAsIERFQlVHRlNfV1JJVEVfQlVGX1NJWkUgKyAxKTsKKwlpZiAoY291bnQgPj0gREVCVUdGU19XUklURV9CVUZfU0laRSkKKwkJY291bnQgPSBERUJVR0ZTX1dSSVRFX0JVRl9TSVpFOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGtidWYsIGJ1ZmZlciwgY291bnQpICE9IDApCisJCXJldHVybiAtRUZBVUxUOworCWtidWZbY291bnQgLSAxXSA9IDA7CisKKwlpZiAoc3RybmNtcCgiZXJyb3IiLCBrYnVmLCBzdHJsZW4oImVycm9yIikpID09IDApCisJCSpsZXZwID0gVkNISVFfTE9HX0VSUk9SOworCWVsc2UgaWYgKHN0cm5jbXAoIndhcm5pbmciLCBrYnVmLCBzdHJsZW4oIndhcm5pbmciKSkgPT0gMCkKKwkJKmxldnAgPSBWQ0hJUV9MT0dfV0FSTklORzsKKwllbHNlIGlmIChzdHJuY21wKCJpbmZvIiwga2J1Ziwgc3RybGVuKCJpbmZvIikpID09IDApCisJCSpsZXZwID0gVkNISVFfTE9HX0lORk87CisJZWxzZSBpZiAoc3RybmNtcCgidHJhY2UiLCBrYnVmLCBzdHJsZW4oInRyYWNlIikpID09IDApCisJCSpsZXZwID0gVkNISVFfTE9HX1RSQUNFOworCWVsc2UKKwkJKmxldnAgPSBWQ0hJUV9MT0dfREVGQVVMVDsKKworCSpwcG9zICs9IGNvdW50OworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z2ZzX2xvZ19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBkZWJ1Z2ZzX2xvZ19vcGVuLAorCS53cml0ZQkJPSBkZWJ1Z2ZzX2xvZ193cml0ZSwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworLyogY3JlYXRlIGFuIGVudHJ5IHVuZGVyIDxkZWJ1Z2ZzPi92Y2hpcS9sb2cgZm9yIGVhY2ggbG9nIGNhdGVnb3J5ICovCitzdGF0aWMgaW50IHZjaGlxX2RlYnVnZnNfY3JlYXRlX2xvZ19lbnRyaWVzKHN0cnVjdCBkZW50cnkgKnRvcCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkaXI7CisJc2l6ZV90IGk7CisJaW50IHJldCA9IDA7CisJZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJsb2ciLCB2Y2hpcV9kZWJ1Z2ZzX3RvcCgpKTsKKwlpZiAoIWRpcikKKwkJcmV0dXJuIC1FTk9NRU07CisJZGVidWdmc19pbmZvLmxvZ19jYXRlZ29yaWVzID0gZGlyOworCisJZm9yIChpID0gMDsgaSA8IG5fbG9nX2VudHJpZXM7IGkrKykgeworCQl2b2lkICpsZXZwID0gKHZvaWQgKil2Y2hpcV9kZWJ1Z2ZzX2xvZ19lbnRyaWVzW2ldLnBsZXZlbDsKKwkJZGlyID0gZGVidWdmc19jcmVhdGVfZmlsZSh2Y2hpcV9kZWJ1Z2ZzX2xvZ19lbnRyaWVzW2ldLm5hbWUsCisJCQkJCSAgMDY0NCwKKwkJCQkJICBkZWJ1Z2ZzX2luZm8ubG9nX2NhdGVnb3JpZXMsCisJCQkJCSAgbGV2cCwKKwkJCQkJICAmZGVidWdmc19sb2dfZm9wcyk7CisJCWlmICghZGlyKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKworCQl2Y2hpcV9kZWJ1Z2ZzX2xvZ19lbnRyaWVzW2ldLmRpciA9IGRpcjsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkZWJ1Z2ZzX3VzZWNvdW50X3Nob3coc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICpvZmZzZXQpCit7CisJVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSA9IGYtPnByaXZhdGU7CisJaW50IHVzZV9jb3VudDsKKworCXVzZV9jb3VudCA9IHZjaGlxX2luc3RhbmNlX2dldF91c2VfY291bnQoaW5zdGFuY2UpOworCXNlcV9wcmludGYoZiwgIiVkXG4iLCB1c2VfY291bnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVidWdmc191c2Vjb3VudF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBkZWJ1Z2ZzX3VzZWNvdW50X3Nob3csIGlub2RlLT5pX3ByaXZhdGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z2ZzX3VzZWNvdW50X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IGRlYnVnZnNfdXNlY291bnRfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBkZWJ1Z2ZzX3RyYWNlX3Nob3coc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICpvZmZzZXQpCit7CisJVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSA9IGYtPnByaXZhdGU7CisJaW50IHRyYWNlOworCisJdHJhY2UgPSB2Y2hpcV9pbnN0YW5jZV9nZXRfdHJhY2UoaW5zdGFuY2UpOworCXNlcV9wcmludGYoZiwgIiVzXG4iLCB0cmFjZSA/ICJZIiA6ICJOIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWJ1Z2ZzX3RyYWNlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGRlYnVnZnNfdHJhY2Vfc2hvdywgaW5vZGUtPmlfcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgZGVidWdmc190cmFjZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwljb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBzZXFfZmlsZSAqZiA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSA9IGYtPnByaXZhdGU7CisJY2hhciBmaXJzdGNoYXI7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmZpcnN0Y2hhciwgYnVmZmVyLCAxKSAhPSAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN3aXRjaCAoZmlyc3RjaGFyKSB7CisJY2FzZSAnWSc6CisJY2FzZSAneSc6CisJY2FzZSAnMSc6CisJCXZjaGlxX2luc3RhbmNlX3NldF90cmFjZShpbnN0YW5jZSwgMSk7CisJCWJyZWFrOworCWNhc2UgJ04nOgorCWNhc2UgJ24nOgorCWNhc2UgJzAnOgorCQl2Y2hpcV9pbnN0YW5jZV9zZXRfdHJhY2UoaW5zdGFuY2UsIDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwkqcHBvcyArPSBjb3VudDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVidWdmc190cmFjZV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBkZWJ1Z2ZzX3RyYWNlX29wZW4sCisJLndyaXRlCQk9IGRlYnVnZnNfdHJhY2Vfd3JpdGUsCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKKy8qIGFkZCBhbiBpbnN0YW5jZSAocHJvY2VzcykgdG8gdGhlIGRlYnVnZnMgZW50cmllcyAqLworaW50IHZjaGlxX2RlYnVnZnNfYWRkX2luc3RhbmNlKFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UpCit7CisJY2hhciBwaWRzdHJbMTZdOworCXN0cnVjdCBkZW50cnkgKnRvcCwgKnVzZV9jb3VudCwgKnRyYWNlOworCXN0cnVjdCBkZW50cnkgKmNsaWVudHMgPSB2Y2hpcV9jbGllbnRzX3RvcCgpOworCisJc25wcmludGYocGlkc3RyLCBzaXplb2YocGlkc3RyKSwgIiVkIiwKKwkJIHZjaGlxX2luc3RhbmNlX2dldF9waWQoaW5zdGFuY2UpKTsKKworCXRvcCA9IGRlYnVnZnNfY3JlYXRlX2RpcihwaWRzdHIsIGNsaWVudHMpOworCWlmICghdG9wKQorCQlnb3RvIGZhaWxfdG9wOworCisJdXNlX2NvdW50ID0gZGVidWdmc19jcmVhdGVfZmlsZSgidXNlX2NvdW50IiwKKwkJCQkJMDQ0NCwgdG9wLAorCQkJCQlpbnN0YW5jZSwKKwkJCQkJJmRlYnVnZnNfdXNlY291bnRfZm9wcyk7CisJaWYgKCF1c2VfY291bnQpCisJCWdvdG8gZmFpbF91c2VfY291bnQ7CisKKwl0cmFjZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInRyYWNlIiwKKwkJCQkgICAgMDY0NCwgdG9wLAorCQkJCSAgICBpbnN0YW5jZSwKKwkJCQkgICAgJmRlYnVnZnNfdHJhY2VfZm9wcyk7CisJaWYgKCF0cmFjZSkKKwkJZ290byBmYWlsX3RyYWNlOworCisJdmNoaXFfaW5zdGFuY2VfZ2V0X2RlYnVnZnNfbm9kZShpbnN0YW5jZSktPmRlbnRyeSA9IHRvcDsKKworCXJldHVybiAwOworCitmYWlsX3RyYWNlOgorCWRlYnVnZnNfcmVtb3ZlKHVzZV9jb3VudCk7CitmYWlsX3VzZV9jb3VudDoKKwlkZWJ1Z2ZzX3JlbW92ZSh0b3ApOworZmFpbF90b3A6CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3ZvaWQgdmNoaXFfZGVidWdmc19yZW1vdmVfaW5zdGFuY2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSkKK3sKKwlWQ0hJUV9ERUJVR0ZTX05PREVfVCAqbm9kZSA9IHZjaGlxX2luc3RhbmNlX2dldF9kZWJ1Z2ZzX25vZGUoaW5zdGFuY2UpOworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShub2RlLT5kZW50cnkpOworfQorCisKK2ludCB2Y2hpcV9kZWJ1Z2ZzX2luaXQodm9pZCkKK3sKKwlCVUdfT04oZGVidWdmc19pbmZvLnZjaGlxX2NmZ19kaXIgIT0gTlVMTCk7CisKKwlkZWJ1Z2ZzX2luZm8udmNoaXFfY2ZnX2RpciA9IGRlYnVnZnNfY3JlYXRlX2RpcigidmNoaXEiLCBOVUxMKTsKKwlpZiAoZGVidWdmc19pbmZvLnZjaGlxX2NmZ19kaXIgPT0gTlVMTCkKKwkJZ290byBmYWlsOworCisJZGVidWdmc19pbmZvLmNsaWVudHMgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImNsaWVudHMiLAorCQkJCXZjaGlxX2RlYnVnZnNfdG9wKCkpOworCWlmICghZGVidWdmc19pbmZvLmNsaWVudHMpCisJCWdvdG8gZmFpbDsKKworCWlmICh2Y2hpcV9kZWJ1Z2ZzX2NyZWF0ZV9sb2dfZW50cmllcyh2Y2hpcV9kZWJ1Z2ZzX3RvcCgpKSAhPSAwKQorCQlnb3RvIGZhaWw7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwl2Y2hpcV9kZWJ1Z2ZzX2RlaW5pdCgpOworCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkiJXM6IGZhaWxlZCB0byBjcmVhdGUgZGVidWdmcyBkaXJlY3RvcnkiLAorCQlfX2Z1bmNfXyk7CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyogcmVtb3ZlIGFsbCB0aGUgZGVidWdmcyBlbnRyaWVzICovCit2b2lkIHZjaGlxX2RlYnVnZnNfZGVpbml0KHZvaWQpCit7CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKHZjaGlxX2RlYnVnZnNfdG9wKCkpOworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqdmNoaXFfY2xpZW50c190b3Aodm9pZCkKK3sKKwlyZXR1cm4gZGVidWdmc19pbmZvLmNsaWVudHM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICp2Y2hpcV9kZWJ1Z2ZzX3RvcCh2b2lkKQoreworCUJVR19PTihkZWJ1Z2ZzX2luZm8udmNoaXFfY2ZnX2RpciA9PSBOVUxMKTsKKwlyZXR1cm4gZGVidWdmc19pbmZvLnZjaGlxX2NmZ19kaXI7Cit9CisKKyNlbHNlIC8qIENPTkZJR19ERUJVR19GUyAqLworCitpbnQgdmNoaXFfZGVidWdmc19pbml0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgdmNoaXFfZGVidWdmc19kZWluaXQodm9pZCkKK3sKK30KKworaW50IHZjaGlxX2RlYnVnZnNfYWRkX2luc3RhbmNlKFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgdmNoaXFfZGVidWdmc19yZW1vdmVfaW5zdGFuY2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSkKK3sKK30KKworI2VuZGlmIC8qIENPTkZJR19ERUJVR19GUyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9kZWJ1Z2ZzLmggYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2RlYnVnZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDZhMzc4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9kZWJ1Z2ZzLmgKQEAgLTAsMCArMSw1MiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgUmFzcGJlcnJ5IFBpIChUcmFkaW5nKSBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVkNISVFfREVCVUdGU19ICisjZGVmaW5lIFZDSElRX0RFQlVHRlNfSAorCisjaW5jbHVkZSAidmNoaXFfY29yZS5oIgorCit0eXBlZGVmIHN0cnVjdCB2Y2hpcV9kZWJ1Z2ZzX25vZGVfc3RydWN0Cit7CisgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5OworfSBWQ0hJUV9ERUJVR0ZTX05PREVfVDsKKworaW50IHZjaGlxX2RlYnVnZnNfaW5pdCh2b2lkKTsKKwordm9pZCB2Y2hpcV9kZWJ1Z2ZzX2RlaW5pdCh2b2lkKTsKKworaW50IHZjaGlxX2RlYnVnZnNfYWRkX2luc3RhbmNlKFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UpOworCit2b2lkIHZjaGlxX2RlYnVnZnNfcmVtb3ZlX2luc3RhbmNlKFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UpOworCisjZW5kaWYgLyogVkNISVFfREVCVUdGU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2dlbnZlcnNpb24gYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2dlbnZlcnNpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY1YjYzNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfZ2VudmVyc2lvbgpAQCAtMCwwICsxLDg3IEBACisjIS91c3IvYmluL3BlcmwgLXcKKwordXNlIHN0cmljdDsKKworIworIyBHZW5lcmF0ZSBhIHZlcnNpb24gZnJvbSBhdmFpbGFibGUgaW5mb3JtYXRpb24KKyMKKworbXkgJHByZWZpeCA9IHNoaWZ0IEBBUkdWOworbXkgJHJvb3QgPSBzaGlmdCBAQVJHVjsKKworCitpZiAoIG5vdCBkZWZpbmVkICRyb290ICkgeworCWRpZSAidXNhZ2U6ICQwIHByZWZpeCByb290LWRpclxuIjsKK30KKworaWYgKCAhIC1kICRyb290ICkgeworCWRpZSAicm9vdCBkaXJlY3RvcnkgJHJvb3Qgbm90IGZvdW5kXG4iOworfQorCitteSAkdmVyc2lvbiA9ICJ1bmtub3duIjsKK215ICR0YWludGVkID0gIiI7CisKK2lmICggLWQgIiRyb290Ly5naXQiICkgeworCSMgYXR0ZW1wdCB0byB3b3JrIG91dCBnaXQgdmVyc2lvbi4gb25seSBkbyBzbworCSMgb24gYSBsaW51eCBidWlsZCBob3N0LCBhcyBjeWd3aW4gYnVpbGRzIGFyZQorCSMgYWxyZWFkeSBzbG93IGVub3VnaAorCisJaWYgKCAtZiAiL3Vzci9iaW4vZ2l0IiB8fCAtZiAiL3Vzci9sb2NhbC9iaW4vZ2l0IiApIHsKKwkJaWYgKG5vdCBvcGVuKEYsICJnaXQgLS1naXQtZGlyICRyb290Ly5naXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUR8IikpIHsKKwkJCSR2ZXJzaW9uID0gIm5vIGdpdCB2ZXJzaW9uIjsKKwkJfQorCQllbHNlIHsKKwkJCSR2ZXJzaW9uID0gPEY+OworCQkJJHZlcnNpb24gPX4gcy9bIFxyXG5dKiQvLzsgICAgICMgY2hvbXAgbWF5IG5vdCBiZSBlbm91Z2ggKGN5Z3dpbikuCisJCQkkdmVyc2lvbiA9fiBzL15bIFxyXG5dKi8vOyAgICAgIyBjaG9tcCBtYXkgbm90IGJlIGVub3VnaCAoY3lnd2luKS4KKwkJfQorCisJCWlmIChvcGVuKEcsICJnaXQgLS1naXQtZGlyICRyb290Ly5naXQgc3RhdHVzIC0tcG9yY2VsYWlufCIpKSB7CisJCQkkdGFpbnRlZCA9IDxHPjsKKwkJCSR0YWludGVkID1+IHMvWyBcclxuXSokLy87ICAgICAjIGNob21wIG1heSBub3QgYmUgZW5vdWdoIChjeWd3aW4pLgorCQkJJHRhaW50ZWQgPX4gcy9eWyBcclxuXSovLzsgICAgICMgY2hvbXAgbWF5IG5vdCBiZSBlbm91Z2ggKGN5Z3dpbikuCisJCQlpZiAobGVuZ3RoICR0YWludGVkKSB7CisJCQkkdmVyc2lvbiA9IGpvaW4gJyAnLCAkdmVyc2lvbiwgIih0YWludGVkKSI7CisJCX0KKwkJZWxzZSB7CisJCQkkdmVyc2lvbiA9IGpvaW4gJyAnLCAkdmVyc2lvbiwgIihjbGVhbikiOworICAgICAgICAgfQorCQl9CisJfQorfQorCitteSAkaG9zdG5hbWUgPSBgaG9zdG5hbWVgOworJGhvc3RuYW1lID1+IHMvWyBcclxuXSokLy87ICAgICAjIGNob21wIG1heSBub3QgYmUgZW5vdWdoIChjeWd3aW4pLgorJGhvc3RuYW1lID1+IHMvXlsgXHJcbl0qLy87ICAgICAjIGNob21wIG1heSBub3QgYmUgZW5vdWdoIChjeWd3aW4pLgorCisKK3ByaW50IFNUREVSUiAiVmVyc2lvbiAkdmVyc2lvblxuIjsKK3ByaW50IDw8RU9GOworI2luY2x1ZGUgIiR7cHJlZml4fV9idWlsZF9pbmZvLmgiCisjaW5jbHVkZSA8bGludXgvYnJvYWRjb20vdmNfZGVidWdfc3ltLmg+CisKK1ZDX0RFQlVHX0RFQ0xBUkVfU1RSSU5HX1ZBUiggJHtwcmVmaXh9X2J1aWxkX2hvc3RuYW1lLCAiJGhvc3RuYW1lIiApOworVkNfREVCVUdfREVDTEFSRV9TVFJJTkdfVkFSKCAke3ByZWZpeH1fYnVpbGRfdmVyc2lvbiwgIiR2ZXJzaW9uIiApOworVkNfREVCVUdfREVDTEFSRV9TVFJJTkdfVkFSKCAke3ByZWZpeH1fYnVpbGRfdGltZSwgICAgX19USU1FX18gKTsKK1ZDX0RFQlVHX0RFQ0xBUkVfU1RSSU5HX1ZBUiggJHtwcmVmaXh9X2J1aWxkX2RhdGUsICAgIF9fREFURV9fICk7CisKK2NvbnN0IGNoYXIgKnZjaGlxX2dldF9idWlsZF9ob3N0bmFtZSggdm9pZCApCit7CisgICByZXR1cm4gdmNoaXFfYnVpbGRfaG9zdG5hbWU7Cit9CisKK2NvbnN0IGNoYXIgKnZjaGlxX2dldF9idWlsZF92ZXJzaW9uKCB2b2lkICkKK3sKKyAgIHJldHVybiB2Y2hpcV9idWlsZF92ZXJzaW9uOworfQorCitjb25zdCBjaGFyICp2Y2hpcV9nZXRfYnVpbGRfZGF0ZSggdm9pZCApCit7CisgICByZXR1cm4gdmNoaXFfYnVpbGRfZGF0ZTsKK30KKworY29uc3QgY2hhciAqdmNoaXFfZ2V0X2J1aWxkX3RpbWUoIHZvaWQgKQoreworICAgcmV0dXJuIHZjaGlxX2J1aWxkX3RpbWU7Cit9CitFT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfaWYuaCBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfaWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDY3YmJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9pZi5oCkBAIC0wLDAgKzEsMTg5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEyIEJyb2FkY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbWF5IG5vdCBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFZDSElRX0lGX0gKKyNkZWZpbmUgVkNISVFfSUZfSAorCisjaW5jbHVkZSAiaW50ZXJmYWNlL3ZjaGkvdmNoaV9taC5oIgorCisjZGVmaW5lIFZDSElRX1NFUlZJQ0VfSEFORExFX0lOVkFMSUQgMAorCisjZGVmaW5lIFZDSElRX1NMT1RfU0laRSAgICAgNDA5NgorI2RlZmluZSBWQ0hJUV9NQVhfTVNHX1NJWkUgIChWQ0hJUV9TTE9UX1NJWkUgLSBzaXplb2YoVkNISVFfSEVBREVSX1QpKQorI2RlZmluZSBWQ0hJUV9DSEFOTkVMX1NJWkUgIFZDSElRX01BWF9NU0dfU0laRSAvKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKworI2RlZmluZSBWQ0hJUV9NQUtFX0ZPVVJDQyh4MCwgeDEsIHgyLCB4MykgXAorCQkJKCgoeDApIDw8IDI0KSB8ICgoeDEpIDw8IDE2KSB8ICgoeDIpIDw8IDgpIHwgKHgzKSkKKyNkZWZpbmUgVkNISVFfR0VUX1NFUlZJQ0VfVVNFUkRBVEEoc2VydmljZSkgdmNoaXFfZ2V0X3NlcnZpY2VfdXNlcmRhdGEoc2VydmljZSkKKyNkZWZpbmUgVkNISVFfR0VUX1NFUlZJQ0VfRk9VUkNDKHNlcnZpY2UpICAgdmNoaXFfZ2V0X3NlcnZpY2VfZm91cmNjKHNlcnZpY2UpCisKK3R5cGVkZWYgZW51bSB7CisJVkNISVFfU0VSVklDRV9PUEVORUQsICAgICAgICAgLyogc2VydmljZSwgLSwgLSAgICAgICAgICAgICAqLworCVZDSElRX1NFUlZJQ0VfQ0xPU0VELCAgICAgICAgIC8qIHNlcnZpY2UsIC0sIC0gICAgICAgICAgICAgKi8KKwlWQ0hJUV9NRVNTQUdFX0FWQUlMQUJMRSwgICAgICAvKiBzZXJ2aWNlLCBoZWFkZXIsIC0gICAgICAgICovCisJVkNISVFfQlVMS19UUkFOU01JVF9ET05FLCAgICAgLyogc2VydmljZSwgLSwgYnVsa191c2VyZGF0YSAqLworCVZDSElRX0JVTEtfUkVDRUlWRV9ET05FLCAgICAgIC8qIHNlcnZpY2UsIC0sIGJ1bGtfdXNlcmRhdGEgKi8KKwlWQ0hJUV9CVUxLX1RSQU5TTUlUX0FCT1JURUQsICAvKiBzZXJ2aWNlLCAtLCBidWxrX3VzZXJkYXRhICovCisJVkNISVFfQlVMS19SRUNFSVZFX0FCT1JURUQgICAgLyogc2VydmljZSwgLSwgYnVsa191c2VyZGF0YSAqLworfSBWQ0hJUV9SRUFTT05fVDsKKwordHlwZWRlZiBlbnVtIHsKKwlWQ0hJUV9FUlJPUiAgID0gLTEsCisJVkNISVFfU1VDQ0VTUyA9IDAsCisJVkNISVFfUkVUUlkgICA9IDEKK30gVkNISVFfU1RBVFVTX1Q7CisKK3R5cGVkZWYgZW51bSB7CisJVkNISVFfQlVMS19NT0RFX0NBTExCQUNLLAorCVZDSElRX0JVTEtfTU9ERV9CTE9DS0lORywKKwlWQ0hJUV9CVUxLX01PREVfTk9DQUxMQkFDSywKKwlWQ0hJUV9CVUxLX01PREVfV0FJVElORwkJLyogUmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZSAqLworfSBWQ0hJUV9CVUxLX01PREVfVDsKKwordHlwZWRlZiBlbnVtIHsKKwlWQ0hJUV9TRVJWSUNFX09QVElPTl9BVVRPQ0xPU0UsCisJVkNISVFfU0VSVklDRV9PUFRJT05fU0xPVF9RVU9UQSwKKwlWQ0hJUV9TRVJWSUNFX09QVElPTl9NRVNTQUdFX1FVT1RBLAorCVZDSElRX1NFUlZJQ0VfT1BUSU9OX1NZTkNIUk9OT1VTLAorCVZDSElRX1NFUlZJQ0VfT1BUSU9OX1RSQUNFCit9IFZDSElRX1NFUlZJQ0VfT1BUSU9OX1Q7CisKK3R5cGVkZWYgc3RydWN0IHZjaGlxX2hlYWRlcl9zdHJ1Y3QgeworCS8qIFRoZSBtZXNzYWdlIGlkZW50aWZpZXIgLSBvcGFxdWUgdG8gYXBwbGljYXRpb25zLiAqLworCWludCBtc2dpZDsKKworCS8qIFNpemUgb2YgbWVzc2FnZSBkYXRhLiAqLworCXVuc2lnbmVkIGludCBzaXplOworCisJY2hhciBkYXRhWzBdOyAgICAgICAgICAgLyogbWVzc2FnZSAqLworfSBWQ0hJUV9IRUFERVJfVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWNvbnN0IHZvaWQgKmRhdGE7CisJdW5zaWduZWQgaW50IHNpemU7Cit9IFZDSElRX0VMRU1FTlRfVDsKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgVkNISVFfU0VSVklDRV9IQU5ETEVfVDsKKwordHlwZWRlZiBWQ0hJUV9TVEFUVVNfVCAoKlZDSElRX0NBTExCQUNLX1QpKFZDSElRX1JFQVNPTl9ULCBWQ0hJUV9IRUFERVJfVCAqLAorCVZDSElRX1NFUlZJQ0VfSEFORExFX1QsIHZvaWQgKik7CisKK3R5cGVkZWYgc3RydWN0IHZjaGlxX3NlcnZpY2VfYmFzZV9zdHJ1Y3QgeworCWludCBmb3VyY2M7CisJVkNISVFfQ0FMTEJBQ0tfVCBjYWxsYmFjazsKKwl2b2lkICp1c2VyZGF0YTsKK30gVkNISVFfU0VSVklDRV9CQVNFX1Q7CisKK3R5cGVkZWYgc3RydWN0IHZjaGlxX3NlcnZpY2VfcGFyYW1zX3N0cnVjdCB7CisJaW50IGZvdXJjYzsKKwlWQ0hJUV9DQUxMQkFDS19UIGNhbGxiYWNrOworCXZvaWQgKnVzZXJkYXRhOworCXNob3J0IHZlcnNpb247ICAgICAgIC8qIEluY3JlbWVudCBmb3Igbm9uLXRyaXZpYWwgY2hhbmdlcyAqLworCXNob3J0IHZlcnNpb25fbWluOyAgIC8qIFVwZGF0ZSBmb3IgaW5jb21wYXRpYmxlIGNoYW5nZXMgKi8KK30gVkNISVFfU0VSVklDRV9QQVJBTVNfVDsKKwordHlwZWRlZiBzdHJ1Y3QgdmNoaXFfY29uZmlnX3N0cnVjdCB7CisJdW5zaWduZWQgaW50IG1heF9tc2dfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgYnVsa190aHJlc2hvbGQ7IC8qIFRoZSBtZXNzYWdlIHNpemUgYWJvdmUgd2hpY2ggaXQKKwkJCQkJaXMgYmV0dGVyIHRvIHVzZSBhIGJ1bGsgdHJhbnNmZXIKKwkJCQkJKDw9IG1heF9tc2dfc2l6ZSkgKi8KKwl1bnNpZ25lZCBpbnQgbWF4X291dHN0YW5kaW5nX2J1bGtzOworCXVuc2lnbmVkIGludCBtYXhfc2VydmljZXM7CisJc2hvcnQgdmVyc2lvbjsgICAgICAvKiBUaGUgdmVyc2lvbiBvZiBWQ0hJUSAqLworCXNob3J0IHZlcnNpb25fbWluOyAgLyogVGhlIG1pbmltdW0gY29tcGF0aWJsZSB2ZXJzaW9uIG9mIFZDSElRICovCit9IFZDSElRX0NPTkZJR19UOworCit0eXBlZGVmIHN0cnVjdCB2Y2hpcV9pbnN0YW5jZV9zdHJ1Y3QgKlZDSElRX0lOU1RBTkNFX1Q7Cit0eXBlZGVmIHZvaWQgKCpWQ0hJUV9SRU1PVEVfVVNFX0NBTExCQUNLX1QpKHZvaWQgKmNiX2FyZyk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9pbml0aWFsaXNlKFZDSElRX0lOU1RBTkNFX1QgKnBpbnN0YW5jZSk7CitleHRlcm4gVkNISVFfU1RBVFVTX1QgdmNoaXFfc2h1dGRvd24oVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSk7CitleHRlcm4gVkNISVFfU1RBVFVTX1QgdmNoaXFfY29ubmVjdChWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlKTsKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9hZGRfc2VydmljZShWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlLAorCWNvbnN0IFZDSElRX1NFUlZJQ0VfUEFSQU1TX1QgKnBhcmFtcywKKwlWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UICpwc2VydmljZSk7CitleHRlcm4gVkNISVFfU1RBVFVTX1QgdmNoaXFfb3Blbl9zZXJ2aWNlKFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UsCisJY29uc3QgVkNISVFfU0VSVklDRV9QQVJBTVNfVCAqcGFyYW1zLAorCVZDSElRX1NFUlZJQ0VfSEFORExFX1QgKnBzZXJ2aWNlKTsKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9jbG9zZV9zZXJ2aWNlKFZDSElRX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZSk7CitleHRlcm4gVkNISVFfU1RBVFVTX1QgdmNoaXFfcmVtb3ZlX3NlcnZpY2UoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlKTsKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV91c2Vfc2VydmljZShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2UpOworZXh0ZXJuIFZDSElRX1NUQVRVU19UIHZjaGlxX3VzZV9zZXJ2aWNlX25vX3Jlc3VtZSgKKwlWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2UpOworZXh0ZXJuIFZDSElRX1NUQVRVU19UIHZjaGlxX3JlbGVhc2Vfc2VydmljZShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2UpOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QgdmNoaXFfcXVldWVfbWVzc2FnZShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2UsCisJY29uc3QgVkNISVFfRUxFTUVOVF9UICplbGVtZW50cywgdW5zaWduZWQgaW50IGNvdW50KTsKK2V4dGVybiB2b2lkICAgICAgICAgICB2Y2hpcV9yZWxlYXNlX21lc3NhZ2UoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlLAorCVZDSElRX0hFQURFUl9UICpoZWFkZXIpOworZXh0ZXJuIFZDSElRX1NUQVRVU19UIHZjaGlxX3F1ZXVlX2J1bGtfdHJhbnNtaXQoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlLAorCWNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBzaXplLCB2b2lkICp1c2VyZGF0YSk7CitleHRlcm4gVkNISVFfU1RBVFVTX1QgdmNoaXFfcXVldWVfYnVsa19yZWNlaXZlKFZDSElRX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZSwKKwl2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSwgdm9pZCAqdXNlcmRhdGEpOworZXh0ZXJuIFZDSElRX1NUQVRVU19UIHZjaGlxX3F1ZXVlX2J1bGtfdHJhbnNtaXRfaGFuZGxlKAorCVZDSElRX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZSwgVkNISV9NRU1fSEFORExFX1QgaGFuZGxlLAorCWNvbnN0IHZvaWQgKm9mZnNldCwgdW5zaWduZWQgaW50IHNpemUsIHZvaWQgKnVzZXJkYXRhKTsKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9xdWV1ZV9idWxrX3JlY2VpdmVfaGFuZGxlKAorCVZDSElRX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZSwgVkNISV9NRU1fSEFORExFX1QgaGFuZGxlLAorCXZvaWQgKm9mZnNldCwgdW5zaWduZWQgaW50IHNpemUsIHZvaWQgKnVzZXJkYXRhKTsKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9idWxrX3RyYW5zbWl0KFZDSElRX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZSwKKwljb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSwgdm9pZCAqdXNlcmRhdGEsCisJVkNISVFfQlVMS19NT0RFX1QgbW9kZSk7CitleHRlcm4gVkNISVFfU1RBVFVTX1QgdmNoaXFfYnVsa19yZWNlaXZlKFZDSElRX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZSwKKwl2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSwgdm9pZCAqdXNlcmRhdGEsCisJVkNISVFfQlVMS19NT0RFX1QgbW9kZSk7CitleHRlcm4gVkNISVFfU1RBVFVTX1QgdmNoaXFfYnVsa190cmFuc21pdF9oYW5kbGUoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlLAorCVZDSElfTUVNX0hBTkRMRV9UIGhhbmRsZSwgY29uc3Qgdm9pZCAqb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc2l6ZSwKKwl2b2lkICp1c2VyZGF0YSwJVkNISVFfQlVMS19NT0RFX1QgbW9kZSk7CitleHRlcm4gVkNISVFfU1RBVFVTX1QgdmNoaXFfYnVsa19yZWNlaXZlX2hhbmRsZShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2UsCisJVkNISV9NRU1fSEFORExFX1QgaGFuZGxlLCB2b2lkICpvZmZzZXQsIHVuc2lnbmVkIGludCBzaXplLAorCXZvaWQgKnVzZXJkYXRhLCBWQ0hJUV9CVUxLX01PREVfVCBtb2RlKTsKK2V4dGVybiBpbnQgICB2Y2hpcV9nZXRfY2xpZW50X2lkKFZDSElRX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZSk7CitleHRlcm4gdm9pZCAqdmNoaXFfZ2V0X3NlcnZpY2VfdXNlcmRhdGEoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlKTsKK2V4dGVybiBpbnQgICB2Y2hpcV9nZXRfc2VydmljZV9mb3VyY2MoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlKTsKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9nZXRfY29uZmlnKFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UsCisJaW50IGNvbmZpZ19zaXplLCBWQ0hJUV9DT05GSUdfVCAqcGNvbmZpZyk7CitleHRlcm4gVkNISVFfU1RBVFVTX1QgdmNoaXFfc2V0X3NlcnZpY2Vfb3B0aW9uKFZDSElRX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZSwKKwlWQ0hJUV9TRVJWSUNFX09QVElPTl9UIG9wdGlvbiwgaW50IHZhbHVlKTsKKworZXh0ZXJuIFZDSElRX1NUQVRVU19UIHZjaGlxX3JlbW90ZV91c2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSwKKwlWQ0hJUV9SRU1PVEVfVVNFX0NBTExCQUNLX1QgY2FsbGJhY2ssIHZvaWQgKmNiX2FyZyk7CitleHRlcm4gVkNISVFfU1RBVFVTX1QgdmNoaXFfcmVtb3RlX3JlbGVhc2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9kdW1wX3BoeXNfbWVtKFZDSElRX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZSwKKwl2b2lkICpwdHIsIHNpemVfdCBudW1fYnl0ZXMpOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QgdmNoaXFfZ2V0X3BlZXJfdmVyc2lvbihWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwKKyAgICAgIHNob3J0ICpwZWVyX3ZlcnNpb24pOworCisjZW5kaWYgLyogVkNISVFfSUZfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9pb2N0bC5oIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMzdhZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2lvY3RsLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVkNISVFfSU9DVExTX0gKKyNkZWZpbmUgVkNISVFfSU9DVExTX0gKKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSAidmNoaXFfaWYuaCIKKworI2RlZmluZSBWQ0hJUV9JT0NfTUFHSUMgMHhjNAorI2RlZmluZSBWQ0hJUV9JTlZBTElEX0hBTkRMRSAofjApCisKK3R5cGVkZWYgc3RydWN0IHsKKwlWQ0hJUV9TRVJWSUNFX1BBUkFNU19UIHBhcmFtczsKKwlpbnQgaXNfb3BlbjsKKwlpbnQgaXNfdmNoaTsKKwl1bnNpZ25lZCBpbnQgaGFuZGxlOyAgICAgICAvKiBPVVQgKi8KK30gVkNISVFfQ1JFQVRFX1NFUlZJQ0VfVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBoYW5kbGU7CisJdW5zaWduZWQgaW50IGNvdW50OworCWNvbnN0IFZDSElRX0VMRU1FTlRfVCAqZWxlbWVudHM7Cit9IFZDSElRX1FVRVVFX01FU1NBR0VfVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBoYW5kbGU7CisJdm9pZCAqZGF0YTsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl2b2lkICp1c2VyZGF0YTsKKwlWQ0hJUV9CVUxLX01PREVfVCBtb2RlOworfSBWQ0hJUV9RVUVVRV9CVUxLX1RSQU5TRkVSX1Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlWQ0hJUV9SRUFTT05fVCByZWFzb247CisJVkNISVFfSEVBREVSX1QgKmhlYWRlcjsKKwl2b2lkICpzZXJ2aWNlX3VzZXJkYXRhOworCXZvaWQgKmJ1bGtfdXNlcmRhdGE7Cit9IFZDSElRX0NPTVBMRVRJT05fREFUQV9UOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGNvdW50OworCVZDSElRX0NPTVBMRVRJT05fREFUQV9UICpidWY7CisJdW5zaWduZWQgaW50IG1zZ2J1ZnNpemU7CisJdW5zaWduZWQgaW50IG1zZ2J1ZmNvdW50OyAvKiBJTi9PVVQgKi8KKwl2b2lkICoqbXNnYnVmczsKK30gVkNISVFfQVdBSVRfQ09NUExFVElPTl9UOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGhhbmRsZTsKKwlpbnQgYmxvY2tpbmc7CisJdW5zaWduZWQgaW50IGJ1ZnNpemU7CisJdm9pZCAqYnVmOworfSBWQ0hJUV9ERVFVRVVFX01FU1NBR0VfVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBjb25maWdfc2l6ZTsKKwlWQ0hJUV9DT05GSUdfVCAqcGNvbmZpZzsKK30gVkNISVFfR0VUX0NPTkZJR19UOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGhhbmRsZTsKKwlWQ0hJUV9TRVJWSUNFX09QVElPTl9UIG9wdGlvbjsKKwlpbnQgdmFsdWU7Cit9IFZDSElRX1NFVF9TRVJWSUNFX09QVElPTl9UOworCit0eXBlZGVmIHN0cnVjdCB7CisJdm9pZCAgICAgKnZpcnRfYWRkcjsKKwlzaXplX3QgICAgbnVtX2J5dGVzOworfSBWQ0hJUV9EVU1QX01FTV9UOworCisjZGVmaW5lIFZDSElRX0lPQ19DT05ORUNUICAgICAgICAgICAgICBfSU8oVkNISVFfSU9DX01BR0lDLCAgIDApCisjZGVmaW5lIFZDSElRX0lPQ19TSFVURE9XTiAgICAgICAgICAgICBfSU8oVkNISVFfSU9DX01BR0lDLCAgIDEpCisjZGVmaW5lIFZDSElRX0lPQ19DUkVBVEVfU0VSVklDRSBcCisJX0lPV1IoVkNISVFfSU9DX01BR0lDLCAyLCBWQ0hJUV9DUkVBVEVfU0VSVklDRV9UKQorI2RlZmluZSBWQ0hJUV9JT0NfUkVNT1ZFX1NFUlZJQ0UgICAgICAgX0lPKFZDSElRX0lPQ19NQUdJQywgICAzKQorI2RlZmluZSBWQ0hJUV9JT0NfUVVFVUVfTUVTU0FHRSBcCisJX0lPVyhWQ0hJUV9JT0NfTUFHSUMsICA0LCBWQ0hJUV9RVUVVRV9NRVNTQUdFX1QpCisjZGVmaW5lIFZDSElRX0lPQ19RVUVVRV9CVUxLX1RSQU5TTUlUIFwKKwlfSU9XUihWQ0hJUV9JT0NfTUFHSUMsIDUsIFZDSElRX1FVRVVFX0JVTEtfVFJBTlNGRVJfVCkKKyNkZWZpbmUgVkNISVFfSU9DX1FVRVVFX0JVTEtfUkVDRUlWRSBcCisJX0lPV1IoVkNISVFfSU9DX01BR0lDLCA2LCBWQ0hJUV9RVUVVRV9CVUxLX1RSQU5TRkVSX1QpCisjZGVmaW5lIFZDSElRX0lPQ19BV0FJVF9DT01QTEVUSU9OIFwKKwlfSU9XUihWQ0hJUV9JT0NfTUFHSUMsIDcsIFZDSElRX0FXQUlUX0NPTVBMRVRJT05fVCkKKyNkZWZpbmUgVkNISVFfSU9DX0RFUVVFVUVfTUVTU0FHRSBcCisJX0lPV1IoVkNISVFfSU9DX01BR0lDLCA4LCBWQ0hJUV9ERVFVRVVFX01FU1NBR0VfVCkKKyNkZWZpbmUgVkNISVFfSU9DX0dFVF9DTElFTlRfSUQgICAgICAgIF9JTyhWQ0hJUV9JT0NfTUFHSUMsICAgOSkKKyNkZWZpbmUgVkNISVFfSU9DX0dFVF9DT05GSUcgXAorCV9JT1dSKFZDSElRX0lPQ19NQUdJQywgMTAsIFZDSElRX0dFVF9DT05GSUdfVCkKKyNkZWZpbmUgVkNISVFfSU9DX0NMT1NFX1NFUlZJQ0UgICAgICAgIF9JTyhWQ0hJUV9JT0NfTUFHSUMsICAgMTEpCisjZGVmaW5lIFZDSElRX0lPQ19VU0VfU0VSVklDRSAgICAgICAgICBfSU8oVkNISVFfSU9DX01BR0lDLCAgIDEyKQorI2RlZmluZSBWQ0hJUV9JT0NfUkVMRUFTRV9TRVJWSUNFICAgICAgX0lPKFZDSElRX0lPQ19NQUdJQywgICAxMykKKyNkZWZpbmUgVkNISVFfSU9DX1NFVF9TRVJWSUNFX09QVElPTiBcCisJX0lPVyhWQ0hJUV9JT0NfTUFHSUMsICAxNCwgVkNISVFfU0VUX1NFUlZJQ0VfT1BUSU9OX1QpCisjZGVmaW5lIFZDSElRX0lPQ19EVU1QX1BIWVNfTUVNIFwKKwlfSU9XKFZDSElRX0lPQ19NQUdJQywgIDE1LCBWQ0hJUV9EVU1QX01FTV9UKQorI2RlZmluZSBWQ0hJUV9JT0NfTElCX1ZFUlNJT04gICAgICAgICAgX0lPKFZDSElRX0lPQ19NQUdJQywgICAxNikKKyNkZWZpbmUgVkNISVFfSU9DX0NMT1NFX0RFTElWRVJFRCAgICAgIF9JTyhWQ0hJUV9JT0NfTUFHSUMsICAgMTcpCisjZGVmaW5lIFZDSElRX0lPQ19NQVggICAgICAgICAgICAgICAgICAxNworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfa2Vybl9saWIuYyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfa2Vybl9saWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWU3MDExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9rZXJuX2xpYi5jCkBAIC0wLDAgKzEsNDU4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEyIEJyb2FkY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbWF5IG5vdCBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKiAtLS0tIEluY2x1ZGUgRmlsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKworI2luY2x1ZGUgInZjaGlxX2NvcmUuaCIKKyNpbmNsdWRlICJ2Y2hpcV9hcm0uaCIKKyNpbmNsdWRlICJ2Y2hpcV9raWxsYWJsZS5oIgorCisvKiAtLS0tIFB1YmxpYyBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tIFByaXZhdGUgQ29uc3RhbnRzIGFuZCBUeXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgYnVsa193YWl0ZXJfbm9kZSB7CisJc3RydWN0IGJ1bGtfd2FpdGVyIGJ1bGtfd2FpdGVyOworCWludCBwaWQ7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworc3RydWN0IHZjaGlxX2luc3RhbmNlX3N0cnVjdCB7CisJVkNISVFfU1RBVEVfVCAqc3RhdGU7CisKKwlpbnQgY29ubmVjdGVkOworCisJc3RydWN0IGxpc3RfaGVhZCBidWxrX3dhaXRlcl9saXN0OworCXN0cnVjdCBtdXRleCBidWxrX3dhaXRlcl9saXN0X211dGV4OworfTsKKworc3RhdGljIFZDSElRX1NUQVRVU19UCit2Y2hpcV9ibG9ja2luZ19idWxrX3RyYW5zZmVyKFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLCB2b2lkICpkYXRhLAorCXVuc2lnbmVkIGludCBzaXplLCBWQ0hJUV9CVUxLX0RJUl9UIGRpcik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgdmNoaXFfaW5pdGlhbGlzZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBWQ0hJUV9JTklUX1JFVFJJRVMgMTAKK1ZDSElRX1NUQVRVU19UIHZjaGlxX2luaXRpYWxpc2UoVkNISVFfSU5TVEFOQ0VfVCAqaW5zdGFuY2VPdXQpCit7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzID0gVkNISVFfRVJST1I7CisJVkNISVFfU1RBVEVfVCAqc3RhdGU7CisJVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSA9IE5VTEw7CisgICAgICAgIGludCBpOworCisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2NvcmVfbG9nX2xldmVsLCAiJXMgY2FsbGVkIiwgX19mdW5jX18pOworCisgICAgICAgIC8qIFZpZGVvQ29yZSBtYXkgbm90IGJlIHJlYWR5IGR1ZSB0byBib290IHVwIHRpbWluZy4KKyAgICAgICAgICAgSXQgbWF5IG5ldmVyIGJlIHJlYWR5IGlmIGtlcm5lbCBhbmQgZmlybXdhcmUgYXJlIG1pc21hdGNoZWQsIHNvIGRvbid0IGJsb2NrIGZvcmV2ZXIuICovCisgICAgICAgIGZvciAoaT0wOyBpPFZDSElRX0lOSVRfUkVUUklFUzsgaSsrKSB7CisJCXN0YXRlID0gdmNoaXFfZ2V0X3N0YXRlKCk7CisJCWlmIChzdGF0ZSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoNTAwKTsKKwl9CisJaWYgKGk9PVZDSElRX0lOSVRfUkVUUklFUykgeworCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkiJXM6IHZpZGVvY29yZSBub3QgaW5pdGlhbGl6ZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBmYWlsZWQ7CisJfSBlbHNlIGlmIChpPjApIHsKKwkJdmNoaXFfbG9nX3dhcm5pbmcodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkiJXM6IHZpZGVvY29yZSBpbml0aWFsaXplZCBhZnRlciAlZCByZXRyaWVzXG4iLCBfX2Z1bmNfXywgaSk7CisJfQorCisJaW5zdGFuY2UgPSBremFsbG9jKHNpemVvZigqaW5zdGFuY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluc3RhbmNlKSB7CisJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCSIlczogZXJyb3IgYWxsb2NhdGluZyB2Y2hpcSBpbnN0YW5jZVxuIiwgX19mdW5jX18pOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlpbnN0YW5jZS0+Y29ubmVjdGVkID0gMDsKKwlpbnN0YW5jZS0+c3RhdGUgPSBzdGF0ZTsKKwltdXRleF9pbml0KCZpbnN0YW5jZS0+YnVsa193YWl0ZXJfbGlzdF9tdXRleCk7CisJSU5JVF9MSVNUX0hFQUQoJmluc3RhbmNlLT5idWxrX3dhaXRlcl9saXN0KTsKKworCSppbnN0YW5jZU91dCA9IGluc3RhbmNlOworCisJc3RhdHVzID0gVkNISVFfU1VDQ0VTUzsKKworZmFpbGVkOgorCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJIiVzKCVwKTogcmV0dXJuaW5nICVkIiwgX19mdW5jX18sIGluc3RhbmNlLCBzdGF0dXMpOworCisJcmV0dXJuIHN0YXR1czsKK30KK0VYUE9SVF9TWU1CT0wodmNoaXFfaW5pdGlhbGlzZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgdmNoaXFfc2h1dGRvd24KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworVkNISVFfU1RBVFVTX1QgdmNoaXFfc2h1dGRvd24oVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSkKK3sKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXM7CisJVkNISVFfU1RBVEVfVCAqc3RhdGUgPSBpbnN0YW5jZS0+c3RhdGU7CisKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCSIlcyglcCkgY2FsbGVkIiwgX19mdW5jX18sIGluc3RhbmNlKTsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnN0YXRlLT5tdXRleCkgIT0gMCkKKwkJcmV0dXJuIFZDSElRX1JFVFJZOworCisJLyogUmVtb3ZlIGFsbCBzZXJ2aWNlcyAqLworCXN0YXR1cyA9IHZjaGlxX3NodXRkb3duX2ludGVybmFsKHN0YXRlLCBpbnN0YW5jZSk7CisKKwltdXRleF91bmxvY2soJnN0YXRlLT5tdXRleCk7CisKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCSIlcyglcCk6IHJldHVybmluZyAlZCIsIF9fZnVuY19fLCBpbnN0YW5jZSwgc3RhdHVzKTsKKworCWlmIChzdGF0dXMgPT0gVkNISVFfU1VDQ0VTUykgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICpuZXh0OworCQlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuZXh0LAorCQkJCSZpbnN0YW5jZS0+YnVsa193YWl0ZXJfbGlzdCkgeworCQkJc3RydWN0IGJ1bGtfd2FpdGVyX25vZGUgKndhaXRlcjsKKwkJCXdhaXRlciA9IGxpc3RfZW50cnkocG9zLAorCQkJCQlzdHJ1Y3QgYnVsa193YWl0ZXJfbm9kZSwKKwkJCQkJbGlzdCk7CisJCQlsaXN0X2RlbChwb3MpOworCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCQkJImJ1bGtfd2FpdGVyIC0gY2xlYW5lZCB1cCAleCAiCisJCQkJCSJmb3IgcGlkICVkIiwKKwkJCQkJKHVuc2lnbmVkIGludCl3YWl0ZXIsIHdhaXRlci0+cGlkKTsKKwkJCWtmcmVlKHdhaXRlcik7CisJCX0KKwkJa2ZyZWUoaW5zdGFuY2UpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CitFWFBPUlRfU1lNQk9MKHZjaGlxX3NodXRkb3duKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICB2Y2hpcV9pc19jb25uZWN0ZWQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IHZjaGlxX2lzX2Nvbm5lY3RlZChWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlKQoreworCXJldHVybiBpbnN0YW5jZS0+Y29ubmVjdGVkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIHZjaGlxX2Nvbm5lY3QKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworVkNISVFfU1RBVFVTX1QgdmNoaXFfY29ubmVjdChWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlKQoreworCVZDSElRX1NUQVRVU19UIHN0YXR1czsKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZSA9IGluc3RhbmNlLT5zdGF0ZTsKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJIiVzKCVwKSBjYWxsZWQiLCBfX2Z1bmNfXywgaW5zdGFuY2UpOworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc3RhdGUtPm11dGV4KSAhPSAwKSB7CisJCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCSIlczogY2FsbCB0byBtdXRleF9sb2NrIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJc3RhdHVzID0gVkNISVFfUkVUUlk7CisJCWdvdG8gZmFpbGVkOworCX0KKwlzdGF0dXMgPSB2Y2hpcV9jb25uZWN0X2ludGVybmFsKHN0YXRlLCBpbnN0YW5jZSk7CisKKwlpZiAoc3RhdHVzID09IFZDSElRX1NVQ0NFU1MpCisJCWluc3RhbmNlLT5jb25uZWN0ZWQgPSAxOworCisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+bXV0ZXgpOworCitmYWlsZWQ6CisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkiJXMoJXApOiByZXR1cm5pbmcgJWQiLCBfX2Z1bmNfXywgaW5zdGFuY2UsIHN0YXR1cyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorRVhQT1JUX1NZTUJPTCh2Y2hpcV9jb25uZWN0KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICB2Y2hpcV9hZGRfc2VydmljZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9hZGRfc2VydmljZSgKKwlWQ0hJUV9JTlNUQU5DRV9UICAgICAgICAgICAgICBpbnN0YW5jZSwKKwljb25zdCBWQ0hJUV9TRVJWSUNFX1BBUkFNU19UICpwYXJhbXMsCisJVkNISVFfU0VSVklDRV9IQU5ETEVfVCAgICAgICAqcGhhbmRsZSkKK3sKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXM7CisJVkNISVFfU1RBVEVfVCAqc3RhdGUgPSBpbnN0YW5jZS0+c3RhdGU7CisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlID0gTlVMTDsKKwlpbnQgc3J2c3RhdGU7CisKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCSIlcyglcCkgY2FsbGVkIiwgX19mdW5jX18sIGluc3RhbmNlKTsKKworCSpwaGFuZGxlID0gVkNISVFfU0VSVklDRV9IQU5ETEVfSU5WQUxJRDsKKworCXNydnN0YXRlID0gdmNoaXFfaXNfY29ubmVjdGVkKGluc3RhbmNlKQorCQk/IFZDSElRX1NSVlNUQVRFX0xJU1RFTklORworCQk6IFZDSElRX1NSVlNUQVRFX0hJRERFTjsKKworCXNlcnZpY2UgPSB2Y2hpcV9hZGRfc2VydmljZV9pbnRlcm5hbCgKKwkJc3RhdGUsCisJCXBhcmFtcywKKwkJc3J2c3RhdGUsCisJCWluc3RhbmNlLAorCQlOVUxMKTsKKworCWlmIChzZXJ2aWNlKSB7CisJCSpwaGFuZGxlID0gc2VydmljZS0+aGFuZGxlOworCQlzdGF0dXMgPSBWQ0hJUV9TVUNDRVNTOworCX0gZWxzZQorCQlzdGF0dXMgPSBWQ0hJUV9FUlJPUjsKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJIiVzKCVwKTogcmV0dXJuaW5nICVkIiwgX19mdW5jX18sIGluc3RhbmNlLCBzdGF0dXMpOworCisJcmV0dXJuIHN0YXR1czsKK30KK0VYUE9SVF9TWU1CT0wodmNoaXFfYWRkX3NlcnZpY2UpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIHZjaGlxX29wZW5fc2VydmljZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9vcGVuX3NlcnZpY2UoCisJVkNISVFfSU5TVEFOQ0VfVCAgICAgICAgICAgICAgaW5zdGFuY2UsCisJY29uc3QgVkNISVFfU0VSVklDRV9QQVJBTVNfVCAqcGFyYW1zLAorCVZDSElRX1NFUlZJQ0VfSEFORExFX1QgICAgICAgKnBoYW5kbGUpCit7CisJVkNISVFfU1RBVFVTX1QgICBzdGF0dXMgPSBWQ0hJUV9FUlJPUjsKKwlWQ0hJUV9TVEFURV9UICAgKnN0YXRlID0gaW5zdGFuY2UtPnN0YXRlOworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IE5VTEw7CisKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCSIlcyglcCkgY2FsbGVkIiwgX19mdW5jX18sIGluc3RhbmNlKTsKKworCSpwaGFuZGxlID0gVkNISVFfU0VSVklDRV9IQU5ETEVfSU5WQUxJRDsKKworCWlmICghdmNoaXFfaXNfY29ubmVjdGVkKGluc3RhbmNlKSkKKwkJZ290byBmYWlsZWQ7CisKKwlzZXJ2aWNlID0gdmNoaXFfYWRkX3NlcnZpY2VfaW50ZXJuYWwoc3RhdGUsCisJCXBhcmFtcywKKwkJVkNISVFfU1JWU1RBVEVfT1BFTklORywKKwkJaW5zdGFuY2UsCisJCU5VTEwpOworCisJaWYgKHNlcnZpY2UpIHsKKwkJKnBoYW5kbGUgPSBzZXJ2aWNlLT5oYW5kbGU7CisJCXN0YXR1cyA9IHZjaGlxX29wZW5fc2VydmljZV9pbnRlcm5hbChzZXJ2aWNlLCBjdXJyZW50LT5waWQpOworCQlpZiAoc3RhdHVzICE9IFZDSElRX1NVQ0NFU1MpIHsKKwkJCXZjaGlxX3JlbW92ZV9zZXJ2aWNlKHNlcnZpY2UtPmhhbmRsZSk7CisJCQkqcGhhbmRsZSA9IFZDSElRX1NFUlZJQ0VfSEFORExFX0lOVkFMSUQ7CisJCX0KKwl9CisKK2ZhaWxlZDoKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCSIlcyglcCk6IHJldHVybmluZyAlZCIsIF9fZnVuY19fLCBpbnN0YW5jZSwgc3RhdHVzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CitFWFBPUlRfU1lNQk9MKHZjaGlxX29wZW5fc2VydmljZSk7CisKK1ZDSElRX1NUQVRVU19UCit2Y2hpcV9xdWV1ZV9idWxrX3RyYW5zbWl0KFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorCWNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBzaXplLCB2b2lkICp1c2VyZGF0YSkKK3sKKwlyZXR1cm4gdmNoaXFfYnVsa190cmFuc2ZlcihoYW5kbGUsCisJCVZDSElfTUVNX0hBTkRMRV9JTlZBTElELCAodm9pZCAqKWRhdGEsIHNpemUsIHVzZXJkYXRhLAorCQlWQ0hJUV9CVUxLX01PREVfQ0FMTEJBQ0ssIFZDSElRX0JVTEtfVFJBTlNNSVQpOworfQorRVhQT1JUX1NZTUJPTCh2Y2hpcV9xdWV1ZV9idWxrX3RyYW5zbWl0KTsKKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3F1ZXVlX2J1bGtfcmVjZWl2ZShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwgdm9pZCAqZGF0YSwKKwl1bnNpZ25lZCBpbnQgc2l6ZSwgdm9pZCAqdXNlcmRhdGEpCit7CisJcmV0dXJuIHZjaGlxX2J1bGtfdHJhbnNmZXIoaGFuZGxlLAorCQlWQ0hJX01FTV9IQU5ETEVfSU5WQUxJRCwgZGF0YSwgc2l6ZSwgdXNlcmRhdGEsCisJCVZDSElRX0JVTEtfTU9ERV9DQUxMQkFDSywgVkNISVFfQlVMS19SRUNFSVZFKTsKK30KK0VYUE9SVF9TWU1CT0wodmNoaXFfcXVldWVfYnVsa19yZWNlaXZlKTsKKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX2J1bGtfdHJhbnNtaXQoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsIGNvbnN0IHZvaWQgKmRhdGEsCisJdW5zaWduZWQgaW50IHNpemUsIHZvaWQgKnVzZXJkYXRhLCBWQ0hJUV9CVUxLX01PREVfVCBtb2RlKQoreworCVZDSElRX1NUQVRVU19UIHN0YXR1czsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgVkNISVFfQlVMS19NT0RFX05PQ0FMTEJBQ0s6CisJY2FzZSBWQ0hJUV9CVUxLX01PREVfQ0FMTEJBQ0s6CisJCXN0YXR1cyA9IHZjaGlxX2J1bGtfdHJhbnNmZXIoaGFuZGxlLAorCQkJVkNISV9NRU1fSEFORExFX0lOVkFMSUQsICh2b2lkICopZGF0YSwgc2l6ZSwgdXNlcmRhdGEsCisJCQltb2RlLCBWQ0hJUV9CVUxLX1RSQU5TTUlUKTsKKwkJYnJlYWs7CisJY2FzZSBWQ0hJUV9CVUxLX01PREVfQkxPQ0tJTkc6CisJCXN0YXR1cyA9IHZjaGlxX2Jsb2NraW5nX2J1bGtfdHJhbnNmZXIoaGFuZGxlLAorCQkJKHZvaWQgKilkYXRhLCBzaXplLCBWQ0hJUV9CVUxLX1RSQU5TTUlUKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIFZDSElRX0VSUk9SOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CitFWFBPUlRfU1lNQk9MKHZjaGlxX2J1bGtfdHJhbnNtaXQpOworCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfYnVsa19yZWNlaXZlKFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLCB2b2lkICpkYXRhLAorCXVuc2lnbmVkIGludCBzaXplLCB2b2lkICp1c2VyZGF0YSwgVkNISVFfQlVMS19NT0RFX1QgbW9kZSkKK3sKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXM7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIFZDSElRX0JVTEtfTU9ERV9OT0NBTExCQUNLOgorCWNhc2UgVkNISVFfQlVMS19NT0RFX0NBTExCQUNLOgorCQlzdGF0dXMgPSB2Y2hpcV9idWxrX3RyYW5zZmVyKGhhbmRsZSwKKwkJCVZDSElfTUVNX0hBTkRMRV9JTlZBTElELCBkYXRhLCBzaXplLCB1c2VyZGF0YSwKKwkJCW1vZGUsIFZDSElRX0JVTEtfUkVDRUlWRSk7CisJCWJyZWFrOworCWNhc2UgVkNISVFfQlVMS19NT0RFX0JMT0NLSU5HOgorCQlzdGF0dXMgPSB2Y2hpcV9ibG9ja2luZ19idWxrX3RyYW5zZmVyKGhhbmRsZSwKKwkJCSh2b2lkICopZGF0YSwgc2l6ZSwgVkNISVFfQlVMS19SRUNFSVZFKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIFZDSElRX0VSUk9SOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CitFWFBPUlRfU1lNQk9MKHZjaGlxX2J1bGtfcmVjZWl2ZSk7CisKK3N0YXRpYyBWQ0hJUV9TVEFUVVNfVAordmNoaXFfYmxvY2tpbmdfYnVsa190cmFuc2ZlcihWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwgdm9pZCAqZGF0YSwKKwl1bnNpZ25lZCBpbnQgc2l6ZSwgVkNISVFfQlVMS19ESVJfVCBkaXIpCit7CisJVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZTsKKwlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2U7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzOworCXN0cnVjdCBidWxrX3dhaXRlcl9ub2RlICp3YWl0ZXIgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKworCXNlcnZpY2UgPSBmaW5kX3NlcnZpY2VfYnlfaGFuZGxlKGhhbmRsZSk7CisJaWYgKCFzZXJ2aWNlKQorCQlyZXR1cm4gVkNISVFfRVJST1I7CisKKwlpbnN0YW5jZSA9IHNlcnZpY2UtPmluc3RhbmNlOworCisJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisKKwltdXRleF9sb2NrKCZpbnN0YW5jZS0+YnVsa193YWl0ZXJfbGlzdF9tdXRleCk7CisJbGlzdF9mb3JfZWFjaChwb3MsICZpbnN0YW5jZS0+YnVsa193YWl0ZXJfbGlzdCkgeworCQlpZiAobGlzdF9lbnRyeShwb3MsIHN0cnVjdCBidWxrX3dhaXRlcl9ub2RlLAorCQkJCWxpc3QpLT5waWQgPT0gY3VycmVudC0+cGlkKSB7CisJCQl3YWl0ZXIgPSBsaXN0X2VudHJ5KHBvcywKKwkJCQlzdHJ1Y3QgYnVsa193YWl0ZXJfbm9kZSwKKwkJCQlsaXN0KTsKKwkJCWxpc3RfZGVsKHBvcyk7CisJCQlicmVhazsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmluc3RhbmNlLT5idWxrX3dhaXRlcl9saXN0X211dGV4KTsKKworCWlmICh3YWl0ZXIpIHsKKwkJVkNISVFfQlVMS19UICpidWxrID0gd2FpdGVyLT5idWxrX3dhaXRlci5idWxrOworCQlpZiAoYnVsaykgeworCQkJLyogVGhpcyB0aHJlYWQgaGFzIGFuIG91dHN0YW5kaW5nIGJ1bGsgdHJhbnNmZXIuICovCisJCQlpZiAoKGJ1bGstPmRhdGEgIT0gZGF0YSkgfHwKKwkJCQkoYnVsay0+c2l6ZSAhPSBzaXplKSkgeworCQkJCS8qIFRoaXMgaXMgbm90IGEgcmV0cnkgb2YgdGhlIHByZXZpb3VzIG9uZS4KKwkJCQkqKiBDYW5jZWwgdGhlIHNpZ25hbCB3aGVuIHRoZSB0cmFuc2ZlcgorCQkJCSoqIGNvbXBsZXRlcy4gKi8KKwkJCQlzcGluX2xvY2soJmJ1bGtfd2FpdGVyX3NwaW5sb2NrKTsKKwkJCQlidWxrLT51c2VyZGF0YSA9IE5VTEw7CisJCQkJc3Bpbl91bmxvY2soJmJ1bGtfd2FpdGVyX3NwaW5sb2NrKTsKKwkJCX0KKwkJfQorCX0KKworCWlmICghd2FpdGVyKSB7CisJCXdhaXRlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBidWxrX3dhaXRlcl9ub2RlKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghd2FpdGVyKSB7CisJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJIiVzIC0gb3V0IG9mIG1lbW9yeSIsIF9fZnVuY19fKTsKKwkJCXJldHVybiBWQ0hJUV9FUlJPUjsKKwkJfQorCX0KKworCXN0YXR1cyA9IHZjaGlxX2J1bGtfdHJhbnNmZXIoaGFuZGxlLCBWQ0hJX01FTV9IQU5ETEVfSU5WQUxJRCwKKwkJZGF0YSwgc2l6ZSwgJndhaXRlci0+YnVsa193YWl0ZXIsIFZDSElRX0JVTEtfTU9ERV9CTE9DS0lORywKKwkJZGlyKTsKKwlpZiAoKHN0YXR1cyAhPSBWQ0hJUV9SRVRSWSkgfHwgZmF0YWxfc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgfHwKKwkJIXdhaXRlci0+YnVsa193YWl0ZXIuYnVsaykgeworCQlWQ0hJUV9CVUxLX1QgKmJ1bGsgPSB3YWl0ZXItPmJ1bGtfd2FpdGVyLmJ1bGs7CisJCWlmIChidWxrKSB7CisJCQkvKiBDYW5jZWwgdGhlIHNpZ25hbCB3aGVuIHRoZSB0cmFuc2ZlcgorCQkJICoqIGNvbXBsZXRlcy4gKi8KKwkJCXNwaW5fbG9jaygmYnVsa193YWl0ZXJfc3BpbmxvY2spOworCQkJYnVsay0+dXNlcmRhdGEgPSBOVUxMOworCQkJc3Bpbl91bmxvY2soJmJ1bGtfd2FpdGVyX3NwaW5sb2NrKTsKKwkJfQorCQlrZnJlZSh3YWl0ZXIpOworCX0gZWxzZSB7CisJCXdhaXRlci0+cGlkID0gY3VycmVudC0+cGlkOworCQltdXRleF9sb2NrKCZpbnN0YW5jZS0+YnVsa193YWl0ZXJfbGlzdF9tdXRleCk7CisJCWxpc3RfYWRkKCZ3YWl0ZXItPmxpc3QsICZpbnN0YW5jZS0+YnVsa193YWl0ZXJfbGlzdCk7CisJCW11dGV4X3VubG9jaygmaW5zdGFuY2UtPmJ1bGtfd2FpdGVyX2xpc3RfbXV0ZXgpOworCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkJCSJzYXZlZCBidWxrX3dhaXRlciAleCBmb3IgcGlkICVkIiwKKwkJCQkodW5zaWduZWQgaW50KXdhaXRlciwgY3VycmVudC0+cGlkKTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9raWxsYWJsZS5oIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9raWxsYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNTQ0NmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2tpbGxhYmxlLmgKQEAgLTAsMCArMSw2OSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBWQ0hJUV9LSUxMQUJMRV9ICisjZGVmaW5lIFZDSElRX0tJTExBQkxFX0gKKworI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisKKyNkZWZpbmUgU0hVVERPV05fU0lHUyAgIChzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdJTlQpIHwgc2lnbWFzayhTSUdRVUlUKSB8IHNpZ21hc2soU0lHVFJBUCkgfCBzaWdtYXNrKFNJR1NUT1ApIHwgc2lnbWFzayhTSUdDT05UKSkKKworc3RhdGljIGlubGluZSBpbnQgX19tdXN0X2NoZWNrIGRvd25faW50ZXJydXB0aWJsZV9raWxsYWJsZShzdHJ1Y3Qgc2VtYXBob3JlICpzZW0pCit7CisJLyogQWxsb3cgaW50ZXJjZXB0aW9uIG9mIGtpbGxhYmxlIHNpZ25hbHMgb25seS4gV2UgZG9uJ3Qgd2FudCB0byBiZSBpbnRlcnJ1cHRlZCBieSBoYXJtbGVzcyBzaWduYWxzIGxpa2UgU0lHQUxSTSAqLworCWludCByZXQ7CisJc2lnc2V0X3QgYmxvY2tlZCwgb2xkc2V0OworCXNpZ2luaXRzZXRpbnYoJmJsb2NrZWQsIFNIVVRET1dOX1NJR1MpOworCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmYmxvY2tlZCwgJm9sZHNldCk7CisJcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKHNlbSk7CisJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbGRzZXQsIE5VTEwpOworCXJldHVybiByZXQ7Cit9CisjZGVmaW5lIGRvd25faW50ZXJydXB0aWJsZSBkb3duX2ludGVycnVwdGlibGVfa2lsbGFibGUKKworCitzdGF0aWMgaW5saW5lIGludCBfX211c3RfY2hlY2sgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlX2tpbGxhYmxlKHN0cnVjdCBtdXRleCAqbG9jaykKK3sKKwkvKiBBbGxvdyBpbnRlcmNlcHRpb24gb2Yga2lsbGFibGUgc2lnbmFscyBvbmx5LiBXZSBkb24ndCB3YW50IHRvIGJlIGludGVycnVwdGVkIGJ5IGhhcm1sZXNzIHNpZ25hbHMgbGlrZSBTSUdBTFJNICovCisJaW50IHJldDsKKwlzaWdzZXRfdCBibG9ja2VkLCBvbGRzZXQ7CisJc2lnaW5pdHNldGludigmYmxvY2tlZCwgU0hVVERPV05fU0lHUyk7CisJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZibG9ja2VkLCAmb2xkc2V0KTsKKwlyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUobG9jayk7CisJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbGRzZXQsIE5VTEwpOworCXJldHVybiByZXQ7Cit9CisjZGVmaW5lIG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSBtdXRleF9sb2NrX2ludGVycnVwdGlibGVfa2lsbGFibGUKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX21lbWRydi5oIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9tZW1kcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDJlNzc2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9tZW1kcnYuaApAQCAtMCwwICsxLDcxIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEyIEJyb2FkY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbWF5IG5vdCBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFZDSElRX01FTURSVl9ICisjZGVmaW5lIFZDSElRX01FTURSVl9ICisKKy8qIC0tLS0gSW5jbHVkZSBGaWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSAidmNoaXFfaWYuaCIKKworLyogLS0tLSBDb25zdGFudHMgYW5kIFR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCSB2b2lkICAgICAgICAgICAgICAgICAgICphcm1TaGFyZWRNZW1WaXJ0OworCSBkbWFfYWRkcl90ICAgICAgICAgICAgICBhcm1TaGFyZWRNZW1QaHlzOworCSBzaXplX3QgICAgICAgICAgICAgICAgICBhcm1TaGFyZWRNZW1TaXplOworCisJIHZvaWQgICAgICAgICAgICAgICAgICAgKnZjU2hhcmVkTWVtVmlydDsKKwkgZG1hX2FkZHJfdCAgICAgICAgICAgICAgdmNTaGFyZWRNZW1QaHlzOworCSBzaXplX3QgICAgICAgICAgICAgICAgICB2Y1NoYXJlZE1lbVNpemU7Cit9IFZDSElRX1NIQVJFRF9NRU1fSU5GT19UOworCisvKiAtLS0tIFZhcmlhYmxlIEV4dGVybnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tIEZ1bmN0aW9uIFByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIHZjaGlxX2dldF9zaGFyZWRfbWVtX2luZm8oVkNISVFfU0hBUkVEX01FTV9JTkZPX1QgKmluZm8pOworCitWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9tZW1kcnZfaW5pdGlhbGlzZSh2b2lkKTsKKworVkNISVFfU1RBVFVTX1QgdmNoaXFfdXNlcmRydl9jcmVhdGVfaW5zdGFuY2UoCisJY29uc3QgVkNISVFfUExBVEZPUk1fREFUQV9UICogcGxhdGZvcm1fZGF0YSk7CisKK1ZDSElRX1NUQVRVU19UIHZjaGlxX3VzZXJkcnZfc3VzcGVuZCgKKwljb25zdCBWQ0hJUV9QTEFURk9STV9EQVRBX1QgKiBwbGF0Zm9ybV9kYXRhKTsKKworVkNISVFfU1RBVFVTX1QgdmNoaXFfdXNlcmRydl9yZXN1bWUoCisJY29uc3QgVkNISVFfUExBVEZPUk1fREFUQV9UICogcGxhdGZvcm1fZGF0YSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9wYWdlbGlzdC5oIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9wYWdlbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YTNlY2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX3BhZ2VsaXN0LmgKQEAgLTAsMCArMSw1OCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBWQ0hJUV9QQUdFTElTVF9ICisjZGVmaW5lIFZDSElRX1BBR0VMSVNUX0gKKworI2lmbmRlZiBQQUdFX1NJWkUKKyNkZWZpbmUgUEFHRV9TSVpFIDQwOTYKKyNlbmRpZgorI2RlZmluZSBDQUNIRV9MSU5FX1NJWkUgMzIKKyNkZWZpbmUgUEFHRUxJU1RfV1JJVEUgMAorI2RlZmluZSBQQUdFTElTVF9SRUFEIDEKKyNkZWZpbmUgUEFHRUxJU1RfUkVBRF9XSVRIX0ZSQUdNRU5UUyAyCisKK3R5cGVkZWYgc3RydWN0IHBhZ2VsaXN0X3N0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBsZW5ndGg7CisJdW5zaWduZWQgc2hvcnQgdHlwZTsKKwl1bnNpZ25lZCBzaG9ydCBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBhZGRyc1sxXTsJLyogTi5CLiAxMiBMU0JzIGhvbGQgdGhlIG51bWJlciBvZiBmb2xsb3dpbmcKKwkJCQkgICBwYWdlcyBhdCBjb25zZWN1dGl2ZSBhZGRyZXNzZXMuICovCit9IFBBR0VMSVNUX1Q7CisKK3R5cGVkZWYgc3RydWN0IGZyYWdtZW50c19zdHJ1Y3QgeworCWNoYXIgaGVhZGJ1ZltDQUNIRV9MSU5FX1NJWkVdOworCWNoYXIgdGFpbGJ1ZltDQUNIRV9MSU5FX1NJWkVdOworfSBGUkFHTUVOVFNfVDsKKworI2VuZGlmIC8qIFZDSElRX1BBR0VMSVNUX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfc2hpbS5jIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9zaGltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA3MmZmNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfc2hpbS5jCkBAIC0wLDAgKzEsODYwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEyIEJyb2FkY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbWF5IG5vdCBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UvdmNoaS92Y2hpLmgiCisjaW5jbHVkZSAidmNoaXEuaCIKKyNpbmNsdWRlICJ2Y2hpcV9jb3JlLmgiCisKKyNpbmNsdWRlICJ2Y2hpcV91dGlsLmgiCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2RlZmluZSB2Y2hpcV9zdGF0dXNfdG9fdmNoaShzdGF0dXMpICgoaW50MzJfdClzdGF0dXMpCisKK3R5cGVkZWYgc3RydWN0IHsKKwlWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZTsKKworCVZDSElVX1FVRVVFX1QgcXVldWU7CisKKwlWQ0hJX0NBTExCQUNLX1QgY2FsbGJhY2s7CisJdm9pZCAqY2FsbGJhY2tfcGFyYW07Cit9IFNISU1fU0VSVklDRV9UOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiByZXR1cm4gcG9pbnRlciB0byB0aGUgbXBoaSBtZXNzYWdlIGRyaXZlciBmdW5jdGlvbiB0YWJsZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2NvbnN0IFZDSElfTUVTU0FHRV9EUklWRVJfVCAqCit2Y2hpX21waGlfbWVzc2FnZV9kcml2ZXJfZnVuY190YWJsZSh2b2lkKQoreworCXJldHVybiBOVUxMOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSAnc2luZ2xlJyBjb25uZWN0aW9uIGRyaXZlciBmb3BzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworY29uc3QgVkNISV9DT05ORUNUSU9OX0FQSV9UICoKK3NpbmdsZV9nZXRfZnVuY190YWJsZSh2b2lkKQoreworCXJldHVybiBOVUxMOworfQorCitWQ0hJX0NPTk5FQ1RJT05fVCAqdmNoaV9jcmVhdGVfY29ubmVjdGlvbigKKwljb25zdCBWQ0hJX0NPTk5FQ1RJT05fQVBJX1QgKmZ1bmN0aW9uX3RhYmxlLAorCWNvbnN0IFZDSElfTUVTU0FHRV9EUklWRVJfVCAqbG93X2xldmVsKQoreworCSh2b2lkKWZ1bmN0aW9uX3RhYmxlOworCSh2b2lkKWxvd19sZXZlbDsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOYW1lOiB2Y2hpX21zZ19wZWVrCisgKgorICogQXJndW1lbnRzOiAgY29uc3QgVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwKKyAqICAgICAgICAgICAgIHZvaWQgKipkYXRhLAorICogICAgICAgICAgICAgdWludDMyX3QgKm1zZ19zaXplLAorCisKKyAqICAgICAgICAgICAgIFZDSElfRkxBR1NfVCBmbGFncworICoKKyAqIERlc2NyaXB0aW9uOiBSb3V0aW5lIHRvIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWVzc2FnZSAodG8gYWxsb3cgaW4KKyAqICAgICAgICAgICAgICBwbGFjZSBwcm9jZXNzaW5nKS4gVGhlIG1lc3NhZ2UgY2FuIGJlIHJlbW92ZWQgdXNpbmcKKyAqICAgICAgICAgICAgICB2Y2hpX21zZ19yZW1vdmUgd2hlbiB5b3UncmUgZmluaXNoZWQKKyAqCisgKiBSZXR1cm5zOiBpbnQzMl90IC0gc3VjY2VzcyA9PSAwCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdCB2Y2hpX21zZ19wZWVrKFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisJdm9pZCAqKmRhdGEsCisJdWludDMyX3QgKm1zZ19zaXplLAorCVZDSElfRkxBR1NfVCBmbGFncykKK3sKKwlTSElNX1NFUlZJQ0VfVCAqc2VydmljZSA9IChTSElNX1NFUlZJQ0VfVCAqKWhhbmRsZTsKKwlWQ0hJUV9IRUFERVJfVCAqaGVhZGVyOworCisJV0FSTl9PTigoZmxhZ3MgIT0gVkNISV9GTEFHU19OT05FKSAmJgorCQkoZmxhZ3MgIT0gVkNISV9GTEFHU19CTE9DS19VTlRJTF9PUF9DT01QTEVURSkpOworCisJaWYgKGZsYWdzID09IFZDSElfRkxBR1NfTk9ORSkKKwkJaWYgKHZjaGl1X3F1ZXVlX2lzX2VtcHR5KCZzZXJ2aWNlLT5xdWV1ZSkpCisJCQlyZXR1cm4gLTE7CisKKwloZWFkZXIgPSB2Y2hpdV9xdWV1ZV9wZWVrKCZzZXJ2aWNlLT5xdWV1ZSk7CisKKwkqZGF0YSA9IGhlYWRlci0+ZGF0YTsKKwkqbXNnX3NpemUgPSBoZWFkZXItPnNpemU7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wodmNoaV9tc2dfcGVlayk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTmFtZTogdmNoaV9tc2dfcmVtb3ZlCisgKgorICogQXJndW1lbnRzOiAgY29uc3QgVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwKKyAqCisgKiBEZXNjcmlwdGlvbjogUm91dGluZSB0byByZW1vdmUgYSBtZXNzYWdlIChhZnRlciBpdCBoYXMgYmVlbiByZWFkIHdpdGgKKyAqICAgICAgICAgICAgICB2Y2hpX21zZ19wZWVrKQorICoKKyAqIFJldHVybnM6IGludDMyX3QgLSBzdWNjZXNzID09IDAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IHZjaGlfbXNnX3JlbW92ZShWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlKQoreworCVNISU1fU0VSVklDRV9UICpzZXJ2aWNlID0gKFNISU1fU0VSVklDRV9UICopaGFuZGxlOworCVZDSElRX0hFQURFUl9UICpoZWFkZXI7CisKKwloZWFkZXIgPSB2Y2hpdV9xdWV1ZV9wb3AoJnNlcnZpY2UtPnF1ZXVlKTsKKworCXZjaGlxX3JlbGVhc2VfbWVzc2FnZShzZXJ2aWNlLT5oYW5kbGUsIGhlYWRlcik7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wodmNoaV9tc2dfcmVtb3ZlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOYW1lOiB2Y2hpX21zZ19xdWV1ZQorICoKKyAqIEFyZ3VtZW50czogIFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisgKiAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLAorICogICAgICAgICAgICAgdWludDMyX3QgZGF0YV9zaXplLAorICogICAgICAgICAgICAgVkNISV9GTEFHU19UIGZsYWdzLAorICogICAgICAgICAgICAgdm9pZCAqbXNnX2hhbmRsZSwKKyAqCisgKiBEZXNjcmlwdGlvbjogVGhpbiB3cmFwcGVyIHRvIHF1ZXVlIGEgbWVzc2FnZSBvbnRvIGEgY29ubmVjdGlvbgorICoKKyAqIFJldHVybnM6IGludDMyX3QgLSBzdWNjZXNzID09IDAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IHZjaGlfbXNnX3F1ZXVlKFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisJY29uc3Qgdm9pZCAqZGF0YSwKKwl1aW50MzJfdCBkYXRhX3NpemUsCisJVkNISV9GTEFHU19UIGZsYWdzLAorCXZvaWQgKm1zZ19oYW5kbGUpCit7CisJU0hJTV9TRVJWSUNFX1QgKnNlcnZpY2UgPSAoU0hJTV9TRVJWSUNFX1QgKiloYW5kbGU7CisJVkNISVFfRUxFTUVOVF9UIGVsZW1lbnQgPSB7ZGF0YSwgZGF0YV9zaXplfTsKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXM7CisKKwkodm9pZCltc2dfaGFuZGxlOworCisJV0FSTl9PTihmbGFncyAhPSBWQ0hJX0ZMQUdTX0JMT0NLX1VOVElMX1FVRVVFRCk7CisKKwlzdGF0dXMgPSB2Y2hpcV9xdWV1ZV9tZXNzYWdlKHNlcnZpY2UtPmhhbmRsZSwgJmVsZW1lbnQsIDEpOworCisJLyogdmNoaXFfcXVldWVfbWVzc2FnZSgpIG1heSByZXR1cm4gVkNISVFfUkVUUlksIHNvIHdlIG5lZWQgdG8KKwkqKiBpbXBsZW1lbnQgYSByZXRyeSBtZWNoYW5pc20gc2luY2UgdGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZAorCSoqIHRvIGJsb2NrIHVudGlsIHF1ZXVlZAorCSovCisJd2hpbGUgKHN0YXR1cyA9PSBWQ0hJUV9SRVRSWSkgeworCQltc2xlZXAoMSk7CisJCXN0YXR1cyA9IHZjaGlxX3F1ZXVlX21lc3NhZ2Uoc2VydmljZS0+aGFuZGxlLCAmZWxlbWVudCwgMSk7CisJfQorCisJcmV0dXJuIHZjaGlxX3N0YXR1c190b192Y2hpKHN0YXR1cyk7Cit9CitFWFBPUlRfU1lNQk9MKHZjaGlfbXNnX3F1ZXVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOYW1lOiB2Y2hpX2J1bGtfcXVldWVfcmVjZWl2ZQorICoKKyAqIEFyZ3VtZW50czogIFZDSElfQlVMS19IQU5ETEVfVCBoYW5kbGUsCisgKiAgICAgICAgICAgICB2b2lkICpkYXRhX2RzdCwKKyAqICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGRhdGFfc2l6ZSwKKyAqICAgICAgICAgICAgIFZDSElfRkxBR1NfVCBmbGFncworICogICAgICAgICAgICAgdm9pZCAqYnVsa19oYW5kbGUKKyAqCisgKiBEZXNjcmlwdGlvbjogUm91dGluZSB0byBzZXR1cCBhIHJjdiBidWZmZXIKKyAqCisgKiBSZXR1cm5zOiBpbnQzMl90IC0gc3VjY2VzcyA9PSAwCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdCB2Y2hpX2J1bGtfcXVldWVfcmVjZWl2ZShWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorCXZvaWQgKmRhdGFfZHN0LAorCXVpbnQzMl90IGRhdGFfc2l6ZSwKKwlWQ0hJX0ZMQUdTX1QgZmxhZ3MsCisJdm9pZCAqYnVsa19oYW5kbGUpCit7CisJU0hJTV9TRVJWSUNFX1QgKnNlcnZpY2UgPSAoU0hJTV9TRVJWSUNFX1QgKiloYW5kbGU7CisJVkNISVFfQlVMS19NT0RFX1QgbW9kZTsKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXM7CisKKwlzd2l0Y2ggKChpbnQpZmxhZ3MpIHsKKwljYXNlIFZDSElfRkxBR1NfQ0FMTEJBQ0tfV0hFTl9PUF9DT01QTEVURQorCQl8IFZDSElfRkxBR1NfQkxPQ0tfVU5USUxfUVVFVUVEOgorCQlXQVJOX09OKCFzZXJ2aWNlLT5jYWxsYmFjayk7CisJCW1vZGUgPSBWQ0hJUV9CVUxLX01PREVfQ0FMTEJBQ0s7CisJCWJyZWFrOworCWNhc2UgVkNISV9GTEFHU19CTE9DS19VTlRJTF9PUF9DT01QTEVURToKKwkJbW9kZSA9IFZDSElRX0JVTEtfTU9ERV9CTE9DS0lORzsKKwkJYnJlYWs7CisJY2FzZSBWQ0hJX0ZMQUdTX0JMT0NLX1VOVElMX1FVRVVFRDoKKwljYXNlIFZDSElfRkxBR1NfTk9ORToKKwkJbW9kZSA9IFZDSElRX0JVTEtfTU9ERV9OT0NBTExCQUNLOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlXQVJOKDEsICJ1bnN1cHBvcnRlZCBtZXNzYWdlXG4iKTsKKwkJcmV0dXJuIHZjaGlxX3N0YXR1c190b192Y2hpKFZDSElRX0VSUk9SKTsKKwl9CisKKwlzdGF0dXMgPSB2Y2hpcV9idWxrX3JlY2VpdmUoc2VydmljZS0+aGFuZGxlLCBkYXRhX2RzdCwgZGF0YV9zaXplLAorCQlidWxrX2hhbmRsZSwgbW9kZSk7CisKKwkvKiB2Y2hpcV9idWxrX3JlY2VpdmUoKSBtYXkgcmV0dXJuIFZDSElRX1JFVFJZLCBzbyB3ZSBuZWVkIHRvCisJKiogaW1wbGVtZW50IGEgcmV0cnkgbWVjaGFuaXNtIHNpbmNlIHRoaXMgZnVuY3Rpb24gaXMgc3VwcG9zZWQKKwkqKiB0byBibG9jayB1bnRpbCBxdWV1ZWQKKwkqLworCXdoaWxlIChzdGF0dXMgPT0gVkNISVFfUkVUUlkpIHsKKwkJbXNsZWVwKDEpOworCQlzdGF0dXMgPSB2Y2hpcV9idWxrX3JlY2VpdmUoc2VydmljZS0+aGFuZGxlLCBkYXRhX2RzdCwKKwkJCWRhdGFfc2l6ZSwgYnVsa19oYW5kbGUsIG1vZGUpOworCX0KKworCXJldHVybiB2Y2hpcV9zdGF0dXNfdG9fdmNoaShzdGF0dXMpOworfQorRVhQT1JUX1NZTUJPTCh2Y2hpX2J1bGtfcXVldWVfcmVjZWl2ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTmFtZTogdmNoaV9idWxrX3F1ZXVlX3RyYW5zbWl0CisgKgorICogQXJndW1lbnRzOiAgVkNISV9CVUxLX0hBTkRMRV9UIGhhbmRsZSwKKyAqICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGFfc3JjLAorICogICAgICAgICAgICAgdWludDMyX3QgZGF0YV9zaXplLAorICogICAgICAgICAgICAgVkNISV9GTEFHU19UIGZsYWdzLAorICogICAgICAgICAgICAgdm9pZCAqYnVsa19oYW5kbGUKKyAqCisgKiBEZXNjcmlwdGlvbjogUm91dGluZSB0byB0cmFuc21pdCBzb21lIGRhdGEKKyAqCisgKiBSZXR1cm5zOiBpbnQzMl90IC0gc3VjY2VzcyA9PSAwCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdCB2Y2hpX2J1bGtfcXVldWVfdHJhbnNtaXQoVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwKKwljb25zdCB2b2lkICpkYXRhX3NyYywKKwl1aW50MzJfdCBkYXRhX3NpemUsCisJVkNISV9GTEFHU19UIGZsYWdzLAorCXZvaWQgKmJ1bGtfaGFuZGxlKQoreworCVNISU1fU0VSVklDRV9UICpzZXJ2aWNlID0gKFNISU1fU0VSVklDRV9UICopaGFuZGxlOworCVZDSElRX0JVTEtfTU9ERV9UIG1vZGU7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzOworCisJc3dpdGNoICgoaW50KWZsYWdzKSB7CisJY2FzZSBWQ0hJX0ZMQUdTX0NBTExCQUNLX1dIRU5fT1BfQ09NUExFVEUKKwkJfCBWQ0hJX0ZMQUdTX0JMT0NLX1VOVElMX1FVRVVFRDoKKwkJV0FSTl9PTighc2VydmljZS0+Y2FsbGJhY2spOworCQltb2RlID0gVkNISVFfQlVMS19NT0RFX0NBTExCQUNLOworCQlicmVhazsKKwljYXNlIFZDSElfRkxBR1NfQkxPQ0tfVU5USUxfREFUQV9SRUFEOgorCWNhc2UgVkNISV9GTEFHU19CTE9DS19VTlRJTF9PUF9DT01QTEVURToKKwkJbW9kZSA9IFZDSElRX0JVTEtfTU9ERV9CTE9DS0lORzsKKwkJYnJlYWs7CisJY2FzZSBWQ0hJX0ZMQUdTX0JMT0NLX1VOVElMX1FVRVVFRDoKKwljYXNlIFZDSElfRkxBR1NfTk9ORToKKwkJbW9kZSA9IFZDSElRX0JVTEtfTU9ERV9OT0NBTExCQUNLOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlXQVJOKDEsICJ1bnN1cHBvcnRlZCBtZXNzYWdlXG4iKTsKKwkJcmV0dXJuIHZjaGlxX3N0YXR1c190b192Y2hpKFZDSElRX0VSUk9SKTsKKwl9CisKKwlzdGF0dXMgPSB2Y2hpcV9idWxrX3RyYW5zbWl0KHNlcnZpY2UtPmhhbmRsZSwgZGF0YV9zcmMsIGRhdGFfc2l6ZSwKKwkJYnVsa19oYW5kbGUsIG1vZGUpOworCisJLyogdmNoaXFfYnVsa190cmFuc21pdCgpIG1heSByZXR1cm4gVkNISVFfUkVUUlksIHNvIHdlIG5lZWQgdG8KKwkqKiBpbXBsZW1lbnQgYSByZXRyeSBtZWNoYW5pc20gc2luY2UgdGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZAorCSoqIHRvIGJsb2NrIHVudGlsIHF1ZXVlZAorCSovCisJd2hpbGUgKHN0YXR1cyA9PSBWQ0hJUV9SRVRSWSkgeworCQltc2xlZXAoMSk7CisJCXN0YXR1cyA9IHZjaGlxX2J1bGtfdHJhbnNtaXQoc2VydmljZS0+aGFuZGxlLCBkYXRhX3NyYywKKwkJCWRhdGFfc2l6ZSwgYnVsa19oYW5kbGUsIG1vZGUpOworCX0KKworCXJldHVybiB2Y2hpcV9zdGF0dXNfdG9fdmNoaShzdGF0dXMpOworfQorRVhQT1JUX1NZTUJPTCh2Y2hpX2J1bGtfcXVldWVfdHJhbnNtaXQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5hbWU6IHZjaGlfbXNnX2RlcXVldWUKKyAqCisgKiBBcmd1bWVudHM6ICBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorICogICAgICAgICAgICAgdm9pZCAqZGF0YSwKKyAqICAgICAgICAgICAgIHVpbnQzMl90IG1heF9kYXRhX3NpemVfdG9fcmVhZCwKKyAqICAgICAgICAgICAgIHVpbnQzMl90ICphY3R1YWxfbXNnX3NpemUKKyAqICAgICAgICAgICAgIFZDSElfRkxBR1NfVCBmbGFncworICoKKyAqIERlc2NyaXB0aW9uOiBSb3V0aW5lIHRvIGRlcXVldWUgYSBtZXNzYWdlIGludG8gdGhlIHN1cHBsaWVkIGJ1ZmZlcgorICoKKyAqIFJldHVybnM6IGludDMyX3QgLSBzdWNjZXNzID09IDAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IHZjaGlfbXNnX2RlcXVldWUoVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwKKwl2b2lkICpkYXRhLAorCXVpbnQzMl90IG1heF9kYXRhX3NpemVfdG9fcmVhZCwKKwl1aW50MzJfdCAqYWN0dWFsX21zZ19zaXplLAorCVZDSElfRkxBR1NfVCBmbGFncykKK3sKKwlTSElNX1NFUlZJQ0VfVCAqc2VydmljZSA9IChTSElNX1NFUlZJQ0VfVCAqKWhhbmRsZTsKKwlWQ0hJUV9IRUFERVJfVCAqaGVhZGVyOworCisJV0FSTl9PTigoZmxhZ3MgIT0gVkNISV9GTEFHU19OT05FKSAmJgorCQkoZmxhZ3MgIT0gVkNISV9GTEFHU19CTE9DS19VTlRJTF9PUF9DT01QTEVURSkpOworCisJaWYgKGZsYWdzID09IFZDSElfRkxBR1NfTk9ORSkKKwkJaWYgKHZjaGl1X3F1ZXVlX2lzX2VtcHR5KCZzZXJ2aWNlLT5xdWV1ZSkpCisJCQlyZXR1cm4gLTE7CisKKwloZWFkZXIgPSB2Y2hpdV9xdWV1ZV9wb3AoJnNlcnZpY2UtPnF1ZXVlKTsKKworCW1lbWNweShkYXRhLCBoZWFkZXItPmRhdGEsIGhlYWRlci0+c2l6ZSA8IG1heF9kYXRhX3NpemVfdG9fcmVhZCA/CisJCWhlYWRlci0+c2l6ZSA6IG1heF9kYXRhX3NpemVfdG9fcmVhZCk7CisKKwkqYWN0dWFsX21zZ19zaXplID0gaGVhZGVyLT5zaXplOworCisJdmNoaXFfcmVsZWFzZV9tZXNzYWdlKHNlcnZpY2UtPmhhbmRsZSwgaGVhZGVyKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh2Y2hpX21zZ19kZXF1ZXVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOYW1lOiB2Y2hpX21zZ19xdWV1ZXYKKyAqCisgKiBBcmd1bWVudHM6ICBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorICogICAgICAgICAgICAgVkNISV9NU0dfVkVDVE9SX1QgKnZlY3RvciwKKyAqICAgICAgICAgICAgIHVpbnQzMl90IGNvdW50LAorICogICAgICAgICAgICAgVkNISV9GTEFHU19UIGZsYWdzLAorICogICAgICAgICAgICAgdm9pZCAqbXNnX2hhbmRsZQorICoKKyAqIERlc2NyaXB0aW9uOiBUaGluIHdyYXBwZXIgdG8gcXVldWUgYSBtZXNzYWdlIG9udG8gYSBjb25uZWN0aW9uCisgKgorICogUmV0dXJuczogaW50MzJfdCAtIHN1Y2Nlc3MgPT0gMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordmNoaXFfc3RhdGljX2Fzc2VydChzaXplb2YoVkNISV9NU0dfVkVDVE9SX1QpID09IHNpemVvZihWQ0hJUV9FTEVNRU5UX1QpKTsKK3ZjaGlxX3N0YXRpY19hc3NlcnQob2Zmc2V0b2YoVkNISV9NU0dfVkVDVE9SX1QsIHZlY19iYXNlKSA9PQorCW9mZnNldG9mKFZDSElRX0VMRU1FTlRfVCwgZGF0YSkpOwordmNoaXFfc3RhdGljX2Fzc2VydChvZmZzZXRvZihWQ0hJX01TR19WRUNUT1JfVCwgdmVjX2xlbikgPT0KKwlvZmZzZXRvZihWQ0hJUV9FTEVNRU5UX1QsIHNpemUpKTsKKworaW50MzJfdCB2Y2hpX21zZ19xdWV1ZXYoVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwKKwlWQ0hJX01TR19WRUNUT1JfVCAqdmVjdG9yLAorCXVpbnQzMl90IGNvdW50LAorCVZDSElfRkxBR1NfVCBmbGFncywKKwl2b2lkICptc2dfaGFuZGxlKQoreworCVNISU1fU0VSVklDRV9UICpzZXJ2aWNlID0gKFNISU1fU0VSVklDRV9UICopaGFuZGxlOworCisJKHZvaWQpbXNnX2hhbmRsZTsKKworCVdBUk5fT04oZmxhZ3MgIT0gVkNISV9GTEFHU19CTE9DS19VTlRJTF9RVUVVRUQpOworCisJcmV0dXJuIHZjaGlxX3N0YXR1c190b192Y2hpKHZjaGlxX3F1ZXVlX21lc3NhZ2Uoc2VydmljZS0+aGFuZGxlLAorCQkoY29uc3QgVkNISVFfRUxFTUVOVF9UICopdmVjdG9yLCBjb3VudCkpOworfQorRVhQT1JUX1NZTUJPTCh2Y2hpX21zZ19xdWV1ZXYpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5hbWU6IHZjaGlfaGVsZF9tc2dfcmVsZWFzZQorICoKKyAqIEFyZ3VtZW50czogIFZDSElfSEVMRF9NU0dfVCAqbWVzc2FnZQorICoKKyAqIERlc2NyaXB0aW9uOiBSb3V0aW5lIHRvIHJlbGVhc2UgYSBoZWxkIG1lc3NhZ2UgKGFmdGVyIGl0IGhhcyBiZWVuIHJlYWQgd2l0aAorICogICAgICAgICAgICAgIHZjaGlfbXNnX2hvbGQpCisgKgorICogUmV0dXJuczogaW50MzJfdCAtIHN1Y2Nlc3MgPT0gMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgdmNoaV9oZWxkX21zZ19yZWxlYXNlKFZDSElfSEVMRF9NU0dfVCAqbWVzc2FnZSkKK3sKKwl2Y2hpcV9yZWxlYXNlX21lc3NhZ2UoKFZDSElRX1NFUlZJQ0VfSEFORExFX1QpbWVzc2FnZS0+c2VydmljZSwKKwkJKFZDSElRX0hFQURFUl9UICopbWVzc2FnZS0+bWVzc2FnZSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wodmNoaV9oZWxkX21zZ19yZWxlYXNlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOYW1lOiB2Y2hpX21zZ19ob2xkCisgKgorICogQXJndW1lbnRzOiAgVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwKKyAqICAgICAgICAgICAgIHZvaWQgKipkYXRhLAorICogICAgICAgICAgICAgdWludDMyX3QgKm1zZ19zaXplLAorICogICAgICAgICAgICAgVkNISV9GTEFHU19UIGZsYWdzLAorICogICAgICAgICAgICAgVkNISV9IRUxEX01TR19UICptZXNzYWdlX2hhbmRsZQorICoKKyAqIERlc2NyaXB0aW9uOiBSb3V0aW5lIHRvIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWVzc2FnZSAodG8gYWxsb3cKKyAqICAgICAgICAgICAgICBpbiBwbGFjZSBwcm9jZXNzaW5nKS4gVGhlIG1lc3NhZ2UgaXMgZGVxdWV1ZWQgLSBkb24ndCBmb3JnZXQKKyAqICAgICAgICAgICAgICB0byByZWxlYXNlIHRoZSBtZXNzYWdlIHVzaW5nIHZjaGlfaGVsZF9tc2dfcmVsZWFzZSB3aGVuIHlvdSdyZQorICogICAgICAgICAgICAgIGZpbmlzaGVkLgorICoKKyAqIFJldHVybnM6IGludDMyX3QgLSBzdWNjZXNzID09IDAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IHZjaGlfbXNnX2hvbGQoVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwKKwl2b2lkICoqZGF0YSwKKwl1aW50MzJfdCAqbXNnX3NpemUsCisJVkNISV9GTEFHU19UIGZsYWdzLAorCVZDSElfSEVMRF9NU0dfVCAqbWVzc2FnZV9oYW5kbGUpCit7CisJU0hJTV9TRVJWSUNFX1QgKnNlcnZpY2UgPSAoU0hJTV9TRVJWSUNFX1QgKiloYW5kbGU7CisJVkNISVFfSEVBREVSX1QgKmhlYWRlcjsKKworCVdBUk5fT04oKGZsYWdzICE9IFZDSElfRkxBR1NfTk9ORSkgJiYKKwkJKGZsYWdzICE9IFZDSElfRkxBR1NfQkxPQ0tfVU5USUxfT1BfQ09NUExFVEUpKTsKKworCWlmIChmbGFncyA9PSBWQ0hJX0ZMQUdTX05PTkUpCisJCWlmICh2Y2hpdV9xdWV1ZV9pc19lbXB0eSgmc2VydmljZS0+cXVldWUpKQorCQkJcmV0dXJuIC0xOworCisJaGVhZGVyID0gdmNoaXVfcXVldWVfcG9wKCZzZXJ2aWNlLT5xdWV1ZSk7CisKKwkqZGF0YSA9IGhlYWRlci0+ZGF0YTsKKwkqbXNnX3NpemUgPSBoZWFkZXItPnNpemU7CisKKwltZXNzYWdlX2hhbmRsZS0+c2VydmljZSA9CisJCShzdHJ1Y3Qgb3BhcXVlX3ZjaGlfc2VydmljZV90ICopc2VydmljZS0+aGFuZGxlOworCW1lc3NhZ2VfaGFuZGxlLT5tZXNzYWdlID0gaGVhZGVyOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHZjaGlfbXNnX2hvbGQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5hbWU6IHZjaGlfaW5pdGlhbGlzZQorICoKKyAqIEFyZ3VtZW50czogVkNISV9JTlNUQU5DRV9UICppbnN0YW5jZV9oYW5kbGUKKyAqCisgKiBEZXNjcmlwdGlvbjogSW5pdGlhbGlzZXMgdGhlIGhhcmR3YXJlIGJ1dCBkb2VzIG5vdCB0cmFuc21pdCBhbnl0aGluZworICogICAgICAgICAgICAgIFdoZW4gcnVuIGFzIGEgSG9zdCBBcHAgdGhpcyB3aWxsIGJlIGNhbGxlZCB0d2ljZSBoZW5jZSB0aGUgbmVlZAorICogICAgICAgICAgICAgIHRvIG1hbGxvYyB0aGUgc3RhdGUgaW5mb3JtYXRpb24KKyAqCisgKiBSZXR1cm5zOiAwIGlmIHN1Y2Nlc3NmdWwsIGZhaWx1cmUgb3RoZXJ3aXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQzMl90IHZjaGlfaW5pdGlhbGlzZShWQ0hJX0lOU1RBTkNFX1QgKmluc3RhbmNlX2hhbmRsZSkKK3sKKwlWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlOworCVZDSElRX1NUQVRVU19UIHN0YXR1czsKKworCXN0YXR1cyA9IHZjaGlxX2luaXRpYWxpc2UoJmluc3RhbmNlKTsKKworCSppbnN0YW5jZV9oYW5kbGUgPSAoVkNISV9JTlNUQU5DRV9UKWluc3RhbmNlOworCisJcmV0dXJuIHZjaGlxX3N0YXR1c190b192Y2hpKHN0YXR1cyk7Cit9CitFWFBPUlRfU1lNQk9MKHZjaGlfaW5pdGlhbGlzZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTmFtZTogdmNoaV9jb25uZWN0CisgKgorICogQXJndW1lbnRzOiBWQ0hJX0NPTk5FQ1RJT05fVCAqKmNvbm5lY3Rpb25zCisgKiAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IG51bV9jb25uZWN0aW9ucworICogICAgICAgICAgICBWQ0hJX0lOU1RBTkNFX1QgaW5zdGFuY2VfaGFuZGxlKQorICoKKyAqIERlc2NyaXB0aW9uOiBTdGFydHMgdGhlIGNvbW1hbmQgc2VydmljZSBvbiBlYWNoIGNvbm5lY3Rpb24sCisgKiAgICAgICAgICAgICAgY2F1c2luZyBJTklUIG1lc3NhZ2VzIHRvIGJlIHBpbmdlZCBiYWNrIGFuZCBmb3J0aAorICoKKyAqIFJldHVybnM6IDAgaWYgc3VjY2Vzc2Z1bCwgZmFpbHVyZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IHZjaGlfY29ubmVjdChWQ0hJX0NPTk5FQ1RJT05fVCAqKmNvbm5lY3Rpb25zLAorCWNvbnN0IHVpbnQzMl90IG51bV9jb25uZWN0aW9ucywKKwlWQ0hJX0lOU1RBTkNFX1QgaW5zdGFuY2VfaGFuZGxlKQoreworCVZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UgPSAoVkNISVFfSU5TVEFOQ0VfVClpbnN0YW5jZV9oYW5kbGU7CisKKwkodm9pZCljb25uZWN0aW9uczsKKwkodm9pZCludW1fY29ubmVjdGlvbnM7CisKKwlyZXR1cm4gdmNoaXFfY29ubmVjdChpbnN0YW5jZSk7Cit9CitFWFBPUlRfU1lNQk9MKHZjaGlfY29ubmVjdCk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOYW1lOiB2Y2hpX2Rpc2Nvbm5lY3QKKyAqCisgKiBBcmd1bWVudHM6IFZDSElfSU5TVEFOQ0VfVCBpbnN0YW5jZV9oYW5kbGUKKyAqCisgKiBEZXNjcmlwdGlvbjogU3RvcHMgdGhlIGNvbW1hbmQgc2VydmljZSBvbiBlYWNoIGNvbm5lY3Rpb24sCisgKiAgICAgICAgICAgICAgY2F1c2luZyBERS1JTklUIG1lc3NhZ2VzIHRvIGJlIHBpbmdlZCBiYWNrIGFuZCBmb3J0aAorICoKKyAqIFJldHVybnM6IDAgaWYgc3VjY2Vzc2Z1bCwgZmFpbHVyZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IHZjaGlfZGlzY29ubmVjdChWQ0hJX0lOU1RBTkNFX1QgaW5zdGFuY2VfaGFuZGxlKQoreworCVZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UgPSAoVkNISVFfSU5TVEFOQ0VfVClpbnN0YW5jZV9oYW5kbGU7CisJcmV0dXJuIHZjaGlxX3N0YXR1c190b192Y2hpKHZjaGlxX3NodXRkb3duKGluc3RhbmNlKSk7Cit9CitFWFBPUlRfU1lNQk9MKHZjaGlfZGlzY29ubmVjdCk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOYW1lOiB2Y2hpX3NlcnZpY2Vfb3BlbgorICogTmFtZTogdmNoaV9zZXJ2aWNlX2NyZWF0ZQorICoKKyAqIEFyZ3VtZW50czogVkNISV9JTlNUQU5DRV9UICppbnN0YW5jZV9oYW5kbGUKKyAqICAgICAgICAgICAgU0VSVklDRV9DUkVBVElPTl9UICpzZXR1cCwKKyAqICAgICAgICAgICAgVkNISV9TRVJWSUNFX0hBTkRMRV9UICpoYW5kbGUKKyAqCisgKiBEZXNjcmlwdGlvbjogUm91dGluZSB0byBvcGVuIGEgc2VydmljZQorICoKKyAqIFJldHVybnM6IGludDMyX3QgLSBzdWNjZXNzID09IDAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBWQ0hJUV9TVEFUVVNfVCBzaGltX2NhbGxiYWNrKFZDSElRX1JFQVNPTl9UIHJlYXNvbiwKKwlWQ0hJUV9IRUFERVJfVCAqaGVhZGVyLCBWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwgdm9pZCAqYnVsa191c2VyKQoreworCVNISU1fU0VSVklDRV9UICpzZXJ2aWNlID0KKwkJKFNISU1fU0VSVklDRV9UICopVkNISVFfR0VUX1NFUlZJQ0VfVVNFUkRBVEEoaGFuZGxlKTsKKworICAgICAgICBpZiAoIXNlcnZpY2UtPmNhbGxiYWNrKQorCQlnb3RvIHJlbGVhc2U7CisKKwlzd2l0Y2ggKHJlYXNvbikgeworCWNhc2UgVkNISVFfTUVTU0FHRV9BVkFJTEFCTEU6CisJCXZjaGl1X3F1ZXVlX3B1c2goJnNlcnZpY2UtPnF1ZXVlLCBoZWFkZXIpOworCisJCXNlcnZpY2UtPmNhbGxiYWNrKHNlcnZpY2UtPmNhbGxiYWNrX3BhcmFtLAorCQkJCSAgVkNISV9DQUxMQkFDS19NU0dfQVZBSUxBQkxFLCBOVUxMKTsKKworCQlnb3RvIGRvbmU7CisJCWJyZWFrOworCisJY2FzZSBWQ0hJUV9CVUxLX1RSQU5TTUlUX0RPTkU6CisJCXNlcnZpY2UtPmNhbGxiYWNrKHNlcnZpY2UtPmNhbGxiYWNrX3BhcmFtLAorCQkJCSAgVkNISV9DQUxMQkFDS19CVUxLX1NFTlQsIGJ1bGtfdXNlcik7CisJCWJyZWFrOworCisJY2FzZSBWQ0hJUV9CVUxLX1JFQ0VJVkVfRE9ORToKKwkJc2VydmljZS0+Y2FsbGJhY2soc2VydmljZS0+Y2FsbGJhY2tfcGFyYW0sCisJCQkJICBWQ0hJX0NBTExCQUNLX0JVTEtfUkVDRUlWRUQsIGJ1bGtfdXNlcik7CisJCWJyZWFrOworCisJY2FzZSBWQ0hJUV9TRVJWSUNFX0NMT1NFRDoKKwkJc2VydmljZS0+Y2FsbGJhY2soc2VydmljZS0+Y2FsbGJhY2tfcGFyYW0sCisJCQkJICBWQ0hJX0NBTExCQUNLX1NFUlZJQ0VfQ0xPU0VELCBOVUxMKTsKKwkJYnJlYWs7CisKKwljYXNlIFZDSElRX1NFUlZJQ0VfT1BFTkVEOgorCQkvKiBObyBlcXVpdmFsZW50IFZDSEkgcmVhc29uICovCisJCWJyZWFrOworCisJY2FzZSBWQ0hJUV9CVUxLX1RSQU5TTUlUX0FCT1JURUQ6CisJCXNlcnZpY2UtPmNhbGxiYWNrKHNlcnZpY2UtPmNhbGxiYWNrX3BhcmFtLAorCQkJCSAgVkNISV9DQUxMQkFDS19CVUxLX1RSQU5TTUlUX0FCT1JURUQsCisJCQkJICBidWxrX3VzZXIpOworCQlicmVhazsKKworCWNhc2UgVkNISVFfQlVMS19SRUNFSVZFX0FCT1JURUQ6CisJCXNlcnZpY2UtPmNhbGxiYWNrKHNlcnZpY2UtPmNhbGxiYWNrX3BhcmFtLAorCQkJCSAgVkNISV9DQUxMQkFDS19CVUxLX1JFQ0VJVkVfQUJPUlRFRCwKKwkJCQkgIGJ1bGtfdXNlcik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJV0FSTigxLCAibm90IHN1cHBvcnRlZFxuIik7CisJCWJyZWFrOworCX0KKworcmVsZWFzZToKKyAgICAgICAgdmNoaXFfcmVsZWFzZV9tZXNzYWdlKHNlcnZpY2UtPmhhbmRsZSwgaGVhZGVyKTsKK2RvbmU6CisJcmV0dXJuIFZDSElRX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBTSElNX1NFUlZJQ0VfVCAqc2VydmljZV9hbGxvYyhWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlLAorCVNFUlZJQ0VfQ1JFQVRJT05fVCAqc2V0dXApCit7CisJU0hJTV9TRVJWSUNFX1QgKnNlcnZpY2UgPSBremFsbG9jKHNpemVvZihTSElNX1NFUlZJQ0VfVCksIEdGUF9LRVJORUwpOworCisJKHZvaWQpaW5zdGFuY2U7CisKKwlpZiAoc2VydmljZSkgeworCQlpZiAodmNoaXVfcXVldWVfaW5pdCgmc2VydmljZS0+cXVldWUsIDY0KSkgeworCQkJc2VydmljZS0+Y2FsbGJhY2sgPSBzZXR1cC0+Y2FsbGJhY2s7CisJCQlzZXJ2aWNlLT5jYWxsYmFja19wYXJhbSA9IHNldHVwLT5jYWxsYmFja19wYXJhbTsKKwkJfSBlbHNlIHsKKwkJCWtmcmVlKHNlcnZpY2UpOworCQkJc2VydmljZSA9IE5VTEw7CisJCX0KKwl9CisKKwlyZXR1cm4gc2VydmljZTsKK30KKworc3RhdGljIHZvaWQgc2VydmljZV9mcmVlKFNISU1fU0VSVklDRV9UICpzZXJ2aWNlKQoreworCWlmIChzZXJ2aWNlKSB7CisJCXZjaGl1X3F1ZXVlX2RlbGV0ZSgmc2VydmljZS0+cXVldWUpOworCQlrZnJlZShzZXJ2aWNlKTsKKwl9Cit9CisKK2ludDMyX3QgdmNoaV9zZXJ2aWNlX29wZW4oVkNISV9JTlNUQU5DRV9UIGluc3RhbmNlX2hhbmRsZSwKKwlTRVJWSUNFX0NSRUFUSU9OX1QgKnNldHVwLAorCVZDSElfU0VSVklDRV9IQU5ETEVfVCAqaGFuZGxlKQoreworCVZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UgPSAoVkNISVFfSU5TVEFOQ0VfVClpbnN0YW5jZV9oYW5kbGU7CisJU0hJTV9TRVJWSUNFX1QgKnNlcnZpY2UgPSBzZXJ2aWNlX2FsbG9jKGluc3RhbmNlLCBzZXR1cCk7CisKKwkqaGFuZGxlID0gKFZDSElfU0VSVklDRV9IQU5ETEVfVClzZXJ2aWNlOworCisJaWYgKHNlcnZpY2UpIHsKKwkJVkNISVFfU0VSVklDRV9QQVJBTVNfVCBwYXJhbXM7CisJCVZDSElRX1NUQVRVU19UIHN0YXR1czsKKworCQltZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOworCQlwYXJhbXMuZm91cmNjID0gc2V0dXAtPnNlcnZpY2VfaWQ7CisJCXBhcmFtcy5jYWxsYmFjayA9IHNoaW1fY2FsbGJhY2s7CisJCXBhcmFtcy51c2VyZGF0YSA9IHNlcnZpY2U7CisJCXBhcmFtcy52ZXJzaW9uID0gc2V0dXAtPnZlcnNpb24udmVyc2lvbjsKKwkJcGFyYW1zLnZlcnNpb25fbWluID0gc2V0dXAtPnZlcnNpb24udmVyc2lvbl9taW47CisKKwkJc3RhdHVzID0gdmNoaXFfb3Blbl9zZXJ2aWNlKGluc3RhbmNlLCAmcGFyYW1zLAorCQkJJnNlcnZpY2UtPmhhbmRsZSk7CisJCWlmIChzdGF0dXMgIT0gVkNISVFfU1VDQ0VTUykgeworCQkJc2VydmljZV9mcmVlKHNlcnZpY2UpOworCQkJc2VydmljZSA9IE5VTEw7CisJCQkqaGFuZGxlID0gTlVMTDsKKwkJfQorCX0KKworCXJldHVybiAoc2VydmljZSAhPSBOVUxMKSA/IDAgOiAtMTsKK30KK0VYUE9SVF9TWU1CT0wodmNoaV9zZXJ2aWNlX29wZW4pOworCitpbnQzMl90IHZjaGlfc2VydmljZV9jcmVhdGUoVkNISV9JTlNUQU5DRV9UIGluc3RhbmNlX2hhbmRsZSwKKwlTRVJWSUNFX0NSRUFUSU9OX1QgKnNldHVwLAorCVZDSElfU0VSVklDRV9IQU5ETEVfVCAqaGFuZGxlKQoreworCVZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UgPSAoVkNISVFfSU5TVEFOQ0VfVClpbnN0YW5jZV9oYW5kbGU7CisJU0hJTV9TRVJWSUNFX1QgKnNlcnZpY2UgPSBzZXJ2aWNlX2FsbG9jKGluc3RhbmNlLCBzZXR1cCk7CisKKwkqaGFuZGxlID0gKFZDSElfU0VSVklDRV9IQU5ETEVfVClzZXJ2aWNlOworCisJaWYgKHNlcnZpY2UpIHsKKwkJVkNISVFfU0VSVklDRV9QQVJBTVNfVCBwYXJhbXM7CisJCVZDSElRX1NUQVRVU19UIHN0YXR1czsKKworCQltZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOworCQlwYXJhbXMuZm91cmNjID0gc2V0dXAtPnNlcnZpY2VfaWQ7CisJCXBhcmFtcy5jYWxsYmFjayA9IHNoaW1fY2FsbGJhY2s7CisJCXBhcmFtcy51c2VyZGF0YSA9IHNlcnZpY2U7CisJCXBhcmFtcy52ZXJzaW9uID0gc2V0dXAtPnZlcnNpb24udmVyc2lvbjsKKwkJcGFyYW1zLnZlcnNpb25fbWluID0gc2V0dXAtPnZlcnNpb24udmVyc2lvbl9taW47CisJCXN0YXR1cyA9IHZjaGlxX2FkZF9zZXJ2aWNlKGluc3RhbmNlLCAmcGFyYW1zLCAmc2VydmljZS0+aGFuZGxlKTsKKworCQlpZiAoc3RhdHVzICE9IFZDSElRX1NVQ0NFU1MpIHsKKwkJCXNlcnZpY2VfZnJlZShzZXJ2aWNlKTsKKwkJCXNlcnZpY2UgPSBOVUxMOworCQkJKmhhbmRsZSA9IE5VTEw7CisJCX0KKwl9CisKKwlyZXR1cm4gKHNlcnZpY2UgIT0gTlVMTCkgPyAwIDogLTE7Cit9CitFWFBPUlRfU1lNQk9MKHZjaGlfc2VydmljZV9jcmVhdGUpOworCitpbnQzMl90IHZjaGlfc2VydmljZV9jbG9zZShjb25zdCBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlKQoreworCWludDMyX3QgcmV0ID0gLTE7CisJU0hJTV9TRVJWSUNFX1QgKnNlcnZpY2UgPSAoU0hJTV9TRVJWSUNFX1QgKiloYW5kbGU7CisJaWYgKHNlcnZpY2UpIHsKKwkJVkNISVFfU1RBVFVTX1Qgc3RhdHVzID0gdmNoaXFfY2xvc2Vfc2VydmljZShzZXJ2aWNlLT5oYW5kbGUpOworCQlpZiAoc3RhdHVzID09IFZDSElRX1NVQ0NFU1MpIHsKKwkJCXNlcnZpY2VfZnJlZShzZXJ2aWNlKTsKKwkJCXNlcnZpY2UgPSBOVUxMOworCQl9CisKKwkJcmV0ID0gdmNoaXFfc3RhdHVzX3RvX3ZjaGkoc3RhdHVzKTsKKwl9CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wodmNoaV9zZXJ2aWNlX2Nsb3NlKTsKKworaW50MzJfdCB2Y2hpX3NlcnZpY2VfZGVzdHJveShjb25zdCBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlKQoreworCWludDMyX3QgcmV0ID0gLTE7CisJU0hJTV9TRVJWSUNFX1QgKnNlcnZpY2UgPSAoU0hJTV9TRVJWSUNFX1QgKiloYW5kbGU7CisJaWYgKHNlcnZpY2UpIHsKKwkJVkNISVFfU1RBVFVTX1Qgc3RhdHVzID0gdmNoaXFfcmVtb3ZlX3NlcnZpY2Uoc2VydmljZS0+aGFuZGxlKTsKKwkJaWYgKHN0YXR1cyA9PSBWQ0hJUV9TVUNDRVNTKSB7CisJCQlzZXJ2aWNlX2ZyZWUoc2VydmljZSk7CisJCQlzZXJ2aWNlID0gTlVMTDsKKwkJfQorCisJCXJldCA9IHZjaGlxX3N0YXR1c190b192Y2hpKHN0YXR1cyk7CisJfQorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHZjaGlfc2VydmljZV9kZXN0cm95KTsKKworaW50MzJfdCB2Y2hpX3NlcnZpY2Vfc2V0X29wdGlvbihjb25zdCBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorCQkJCVZDSElfU0VSVklDRV9PUFRJT05fVCBvcHRpb24sCisJCQkJaW50IHZhbHVlKQoreworCWludDMyX3QgcmV0ID0gLTE7CisJU0hJTV9TRVJWSUNFX1QgKnNlcnZpY2UgPSAoU0hJTV9TRVJWSUNFX1QgKiloYW5kbGU7CisJVkNISVFfU0VSVklDRV9PUFRJT05fVCB2Y2hpcV9vcHRpb247CisJc3dpdGNoIChvcHRpb24pIHsKKwljYXNlIFZDSElfU0VSVklDRV9PUFRJT05fVFJBQ0U6CisJCXZjaGlxX29wdGlvbiA9IFZDSElRX1NFUlZJQ0VfT1BUSU9OX1RSQUNFOworCQlicmVhazsKKwljYXNlIFZDSElfU0VSVklDRV9PUFRJT05fU1lOQ0hST05PVVM6CisJCXZjaGlxX29wdGlvbiA9IFZDSElRX1NFUlZJQ0VfT1BUSU9OX1NZTkNIUk9OT1VTOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzZXJ2aWNlID0gTlVMTDsKKwkJYnJlYWs7CisJfQorCWlmIChzZXJ2aWNlKSB7CisJCVZDSElRX1NUQVRVU19UIHN0YXR1cyA9CisJCQl2Y2hpcV9zZXRfc2VydmljZV9vcHRpb24oc2VydmljZS0+aGFuZGxlLAorCQkJCQkJdmNoaXFfb3B0aW9uLAorCQkJCQkJdmFsdWUpOworCisJCXJldCA9IHZjaGlxX3N0YXR1c190b192Y2hpKHN0YXR1cyk7CisJfQorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHZjaGlfc2VydmljZV9zZXRfb3B0aW9uKTsKKworaW50MzJfdCB2Y2hpX2dldF9wZWVyX3ZlcnNpb24oIGNvbnN0IFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsIHNob3J0ICpwZWVyX3ZlcnNpb24gKQoreworICAgaW50MzJfdCByZXQgPSAtMTsKKyAgIFNISU1fU0VSVklDRV9UICpzZXJ2aWNlID0gKFNISU1fU0VSVklDRV9UICopaGFuZGxlOworICAgaWYoc2VydmljZSkKKyAgIHsKKyAgICAgIFZDSElRX1NUQVRVU19UIHN0YXR1cyA9IHZjaGlxX2dldF9wZWVyX3ZlcnNpb24oc2VydmljZS0+aGFuZGxlLCBwZWVyX3ZlcnNpb24pOworICAgICAgcmV0ID0gdmNoaXFfc3RhdHVzX3RvX3ZjaGkoIHN0YXR1cyApOworICAgfQorICAgcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wodmNoaV9nZXRfcGVlcl92ZXJzaW9uKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcmVhZCBhIHVpbnQzMl90IGZyb20gYnVmZmVyLgorICogbmV0d29yayBmb3JtYXQgaXMgZGVmaW5lZCB0byBiZSBsaXR0bGUgZW5kaWFuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordWludDMyX3QKK3ZjaGlfcmVhZGJ1Zl91aW50MzIoY29uc3Qgdm9pZCAqX3B0cikKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwdHIgPSBfcHRyOworCXJldHVybiBwdHJbMF0gfCAocHRyWzFdIDw8IDgpIHwgKHB0clsyXSA8PCAxNikgfCAocHRyWzNdIDw8IDI0KTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogd3JpdGUgYSB1aW50MzJfdCB0byBidWZmZXIuCisgKiBuZXR3b3JrIGZvcm1hdCBpcyBkZWZpbmVkIHRvIGJlIGxpdHRsZSBlbmRpYW4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit2b2lkCit2Y2hpX3dyaXRlYnVmX3VpbnQzMih2b2lkICpfcHRyLCB1aW50MzJfdCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBjaGFyICpwdHIgPSBfcHRyOworCXB0clswXSA9ICh1bnNpZ25lZCBjaGFyKSgodmFsdWUgPj4gMCkgICYgMHhGRik7CisJcHRyWzFdID0gKHVuc2lnbmVkIGNoYXIpKCh2YWx1ZSA+PiA4KSAgJiAweEZGKTsKKwlwdHJbMl0gPSAodW5zaWduZWQgY2hhcikoKHZhbHVlID4+IDE2KSAmIDB4RkYpOworCXB0clszXSA9ICh1bnNpZ25lZCBjaGFyKSgodmFsdWUgPj4gMjQpICYgMHhGRik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJlYWQgYSB1aW50MTZfdCBmcm9tIGJ1ZmZlci4KKyAqIG5ldHdvcmsgZm9ybWF0IGlzIGRlZmluZWQgdG8gYmUgbGl0dGxlIGVuZGlhbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3VpbnQxNl90Cit2Y2hpX3JlYWRidWZfdWludDE2KGNvbnN0IHZvaWQgKl9wdHIpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcHRyID0gX3B0cjsKKwlyZXR1cm4gcHRyWzBdIHwgKHB0clsxXSA8PCA4KTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogd3JpdGUgYSB1aW50MTZfdCBpbnRvIHRoZSBidWZmZXIuCisgKiBuZXR3b3JrIGZvcm1hdCBpcyBkZWZpbmVkIHRvIGJlIGxpdHRsZSBlbmRpYW4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit2b2lkCit2Y2hpX3dyaXRlYnVmX3VpbnQxNih2b2lkICpfcHRyLCB1aW50MTZfdCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBjaGFyICpwdHIgPSBfcHRyOworCXB0clswXSA9ICh2YWx1ZSA+PiAwKSAgJiAweEZGOworCXB0clsxXSA9ICh2YWx1ZSA+PiA4KSAgJiAweEZGOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5hbWU6IHZjaGlfc2VydmljZV91c2UKKyAqCisgKiBBcmd1bWVudHM6IGNvbnN0IFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUKKyAqCisgKiBEZXNjcmlwdGlvbjogUm91dGluZSB0byBpbmNyZW1lbnQgcmVmY291bnQgb24gYSBzZXJ2aWNlCisgKgorICogUmV0dXJuczogdm9pZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgdmNoaV9zZXJ2aWNlX3VzZShjb25zdCBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlKQoreworCWludDMyX3QgcmV0ID0gLTE7CisJU0hJTV9TRVJWSUNFX1QgKnNlcnZpY2UgPSAoU0hJTV9TRVJWSUNFX1QgKiloYW5kbGU7CisJaWYgKHNlcnZpY2UpCisJCXJldCA9IHZjaGlxX3N0YXR1c190b192Y2hpKHZjaGlxX3VzZV9zZXJ2aWNlKHNlcnZpY2UtPmhhbmRsZSkpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHZjaGlfc2VydmljZV91c2UpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5hbWU6IHZjaGlfc2VydmljZV9yZWxlYXNlCisgKgorICogQXJndW1lbnRzOiBjb25zdCBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlCisgKgorICogRGVzY3JpcHRpb246IFJvdXRpbmUgdG8gZGVjcmVtZW50IHJlZmNvdW50IG9uIGEgc2VydmljZQorICoKKyAqIFJldHVybnM6IHZvaWQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IHZjaGlfc2VydmljZV9yZWxlYXNlKGNvbnN0IFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUpCit7CisJaW50MzJfdCByZXQgPSAtMTsKKwlTSElNX1NFUlZJQ0VfVCAqc2VydmljZSA9IChTSElNX1NFUlZJQ0VfVCAqKWhhbmRsZTsKKwlpZiAoc2VydmljZSkKKwkJcmV0ID0gdmNoaXFfc3RhdHVzX3RvX3ZjaGkoCisJCQl2Y2hpcV9yZWxlYXNlX3NlcnZpY2Uoc2VydmljZS0+aGFuZGxlKSk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wodmNoaV9zZXJ2aWNlX3JlbGVhc2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV91dGlsLmMgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODRhY2I4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV91dGlsLmMKQEAgLTAsMCArMSwxNTYgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJ2Y2hpcV91dGlsLmgiCisjaW5jbHVkZSAidmNoaXFfa2lsbGFibGUuaCIKKworc3RhdGljIGlubGluZSBpbnQgaXNfcG93MihpbnQgaSkKK3sKKwlyZXR1cm4gaSAmJiAhKGkgJiAoaSAtIDEpKTsKK30KKworaW50IHZjaGl1X3F1ZXVlX2luaXQoVkNISVVfUVVFVUVfVCAqcXVldWUsIGludCBzaXplKQoreworCVdBUk5fT04oIWlzX3BvdzIoc2l6ZSkpOworCisJcXVldWUtPnNpemUgPSBzaXplOworCXF1ZXVlLT5yZWFkID0gMDsKKwlxdWV1ZS0+d3JpdGUgPSAwOworCXF1ZXVlLT5pbml0aWFsaXplZCA9IDE7CisKKwlzZW1hX2luaXQoJnF1ZXVlLT5wb3AsIDApOworCXNlbWFfaW5pdCgmcXVldWUtPnB1c2gsIDApOworCisJcXVldWUtPnN0b3JhZ2UgPSBremFsbG9jKHNpemUgKiBzaXplb2YoVkNISVFfSEVBREVSX1QgKiksIEdGUF9LRVJORUwpOworCWlmIChxdWV1ZS0+c3RvcmFnZSA9PSBOVUxMKSB7CisJCXZjaGl1X3F1ZXVlX2RlbGV0ZShxdWV1ZSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKwordm9pZCB2Y2hpdV9xdWV1ZV9kZWxldGUoVkNISVVfUVVFVUVfVCAqcXVldWUpCit7CisJaWYgKHF1ZXVlLT5zdG9yYWdlICE9IE5VTEwpCisJCWtmcmVlKHF1ZXVlLT5zdG9yYWdlKTsKK30KKworaW50IHZjaGl1X3F1ZXVlX2lzX2VtcHR5KFZDSElVX1FVRVVFX1QgKnF1ZXVlKQoreworCXJldHVybiBxdWV1ZS0+cmVhZCA9PSBxdWV1ZS0+d3JpdGU7Cit9CisKK2ludCB2Y2hpdV9xdWV1ZV9pc19mdWxsKFZDSElVX1FVRVVFX1QgKnF1ZXVlKQoreworCXJldHVybiBxdWV1ZS0+d3JpdGUgPT0gcXVldWUtPnJlYWQgKyBxdWV1ZS0+c2l6ZTsKK30KKwordm9pZCB2Y2hpdV9xdWV1ZV9wdXNoKFZDSElVX1FVRVVFX1QgKnF1ZXVlLCBWQ0hJUV9IRUFERVJfVCAqaGVhZGVyKQoreworCWlmICghcXVldWUtPmluaXRpYWxpemVkKQorCQlyZXR1cm47CisKKwl3aGlsZSAocXVldWUtPndyaXRlID09IHF1ZXVlLT5yZWFkICsgcXVldWUtPnNpemUpIHsKKwkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmcXVldWUtPnBvcCkgIT0gMCkgeworCQkJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKKwkJfQorCX0KKworCS8qCisJICogV3JpdGUgdG8gcXVldWUtPnN0b3JhZ2UgbXVzdCBiZSB2aXNpYmxlIGFmdGVyIHJlYWQgZnJvbQorCSAqIHF1ZXVlLT5yZWFkCisJICovCisJc21wX21iKCk7CisKKwlxdWV1ZS0+c3RvcmFnZVtxdWV1ZS0+d3JpdGUgJiAocXVldWUtPnNpemUgLSAxKV0gPSBoZWFkZXI7CisKKwkvKgorCSAqIFdyaXRlIHRvIHF1ZXVlLT5zdG9yYWdlIG11c3QgYmUgdmlzaWJsZSBiZWZvcmUgd3JpdGUgdG8KKwkgKiBxdWV1ZS0+d3JpdGUKKwkgKi8KKwlzbXBfd21iKCk7CisKKwlxdWV1ZS0+d3JpdGUrKzsKKworCXVwKCZxdWV1ZS0+cHVzaCk7Cit9CisKK1ZDSElRX0hFQURFUl9UICp2Y2hpdV9xdWV1ZV9wZWVrKFZDSElVX1FVRVVFX1QgKnF1ZXVlKQoreworCXdoaWxlIChxdWV1ZS0+d3JpdGUgPT0gcXVldWUtPnJlYWQpIHsKKwkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmcXVldWUtPnB1c2gpICE9IDApIHsKKwkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CisJCX0KKwl9CisKKwl1cCgmcXVldWUtPnB1c2gpOyAvLyBXZSBoYXZlbid0IHJlbW92ZWQgYW55dGhpbmcgZnJvbSB0aGUgcXVldWUuCisKKwkvKgorCSAqIFJlYWQgZnJvbSBxdWV1ZS0+c3RvcmFnZSBtdXN0IGJlIHZpc2libGUgYWZ0ZXIgcmVhZCBmcm9tCisJICogcXVldWUtPndyaXRlCisJICovCisJc21wX3JtYigpOworCisJcmV0dXJuIHF1ZXVlLT5zdG9yYWdlW3F1ZXVlLT5yZWFkICYgKHF1ZXVlLT5zaXplIC0gMSldOworfQorCitWQ0hJUV9IRUFERVJfVCAqdmNoaXVfcXVldWVfcG9wKFZDSElVX1FVRVVFX1QgKnF1ZXVlKQoreworCVZDSElRX0hFQURFUl9UICpoZWFkZXI7CisKKwl3aGlsZSAocXVldWUtPndyaXRlID09IHF1ZXVlLT5yZWFkKSB7CisJCWlmIChkb3duX2ludGVycnVwdGlibGUoJnF1ZXVlLT5wdXNoKSAhPSAwKSB7CisJCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOworCQl9CisJfQorCisJLyoKKwkgKiBSZWFkIGZyb20gcXVldWUtPnN0b3JhZ2UgbXVzdCBiZSB2aXNpYmxlIGFmdGVyIHJlYWQgZnJvbQorCSAqIHF1ZXVlLT53cml0ZQorCSAqLworCXNtcF9ybWIoKTsKKworCWhlYWRlciA9IHF1ZXVlLT5zdG9yYWdlW3F1ZXVlLT5yZWFkICYgKHF1ZXVlLT5zaXplIC0gMSldOworCisJLyoKKwkgKiBSZWFkIGZyb20gcXVldWUtPnN0b3JhZ2UgbXVzdCBiZSB2aXNpYmxlIGJlZm9yZSB3cml0ZSB0bworCSAqIHF1ZXVlLT5yZWFkCisJICovCisJc21wX21iKCk7CisKKwlxdWV1ZS0+cmVhZCsrOworCisJdXAoJnF1ZXVlLT5wb3ApOworCisJcmV0dXJuIGhlYWRlcjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfdXRpbC5oIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA1NWQ0YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfdXRpbC5oCkBAIC0wLDAgKzEsODIgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVkNISVFfVVRJTF9ICisjZGVmaW5lIFZDSElRX1VUSUxfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+ICAvKiBmb3IgdGltZV90ICovCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2luY2x1ZGUgInZjaGlxX2lmLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgc2l6ZTsKKwlpbnQgcmVhZDsKKwlpbnQgd3JpdGU7CisJaW50IGluaXRpYWxpemVkOworCisJc3RydWN0IHNlbWFwaG9yZSBwb3A7CisJc3RydWN0IHNlbWFwaG9yZSBwdXNoOworCisJVkNISVFfSEVBREVSX1QgKipzdG9yYWdlOworfSBWQ0hJVV9RVUVVRV9UOworCitleHRlcm4gaW50ICB2Y2hpdV9xdWV1ZV9pbml0KFZDSElVX1FVRVVFX1QgKnF1ZXVlLCBpbnQgc2l6ZSk7CitleHRlcm4gdm9pZCB2Y2hpdV9xdWV1ZV9kZWxldGUoVkNISVVfUVVFVUVfVCAqcXVldWUpOworCitleHRlcm4gaW50IHZjaGl1X3F1ZXVlX2lzX2VtcHR5KFZDSElVX1FVRVVFX1QgKnF1ZXVlKTsKK2V4dGVybiBpbnQgdmNoaXVfcXVldWVfaXNfZnVsbChWQ0hJVV9RVUVVRV9UICpxdWV1ZSk7CisKK2V4dGVybiB2b2lkIHZjaGl1X3F1ZXVlX3B1c2goVkNISVVfUVVFVUVfVCAqcXVldWUsIFZDSElRX0hFQURFUl9UICpoZWFkZXIpOworCitleHRlcm4gVkNISVFfSEVBREVSX1QgKnZjaGl1X3F1ZXVlX3BlZWsoVkNISVVfUVVFVUVfVCAqcXVldWUpOworZXh0ZXJuIFZDSElRX0hFQURFUl9UICp2Y2hpdV9xdWV1ZV9wb3AoVkNISVVfUVVFVUVfVCAqcXVldWUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfdmVyc2lvbi5jIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV92ZXJzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZiZmEyMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfdmVyc2lvbi5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisjaW5jbHVkZSAidmNoaXFfYnVpbGRfaW5mby5oIgorI2luY2x1ZGUgPGxpbnV4L2Jyb2FkY29tL3ZjX2RlYnVnX3N5bS5oPgorCitWQ19ERUJVR19ERUNMQVJFX1NUUklOR19WQVIoIHZjaGlxX2J1aWxkX2hvc3RuYW1lLCAiZGM0LWFybS0wMSIgKTsKK1ZDX0RFQlVHX0RFQ0xBUkVfU1RSSU5HX1ZBUiggdmNoaXFfYnVpbGRfdmVyc2lvbiwgIjkyNDViNGMzNWI5OWIzODcwZTFmN2RjNTk4YzU2OTJiM2M2NmE2ZjAgKHRhaW50ZWQpIiApOworVkNfREVCVUdfREVDTEFSRV9TVFJJTkdfVkFSKCB2Y2hpcV9idWlsZF90aW1lLCAgICBfX1RJTUVfXyApOworVkNfREVCVUdfREVDTEFSRV9TVFJJTkdfVkFSKCB2Y2hpcV9idWlsZF9kYXRlLCAgICBfX0RBVEVfXyApOworCitjb25zdCBjaGFyICp2Y2hpcV9nZXRfYnVpbGRfaG9zdG5hbWUoIHZvaWQgKQoreworICAgcmV0dXJuIHZjaGlxX2J1aWxkX2hvc3RuYW1lOworfQorCitjb25zdCBjaGFyICp2Y2hpcV9nZXRfYnVpbGRfdmVyc2lvbiggdm9pZCApCit7CisgICByZXR1cm4gdmNoaXFfYnVpbGRfdmVyc2lvbjsKK30KKworY29uc3QgY2hhciAqdmNoaXFfZ2V0X2J1aWxkX2RhdGUoIHZvaWQgKQoreworICAgcmV0dXJuIHZjaGlxX2J1aWxkX2RhdGU7Cit9CisKK2NvbnN0IGNoYXIgKnZjaGlxX2dldF9idWlsZF90aW1lKCB2b2lkICkKK3sKKyAgIHJldHVybiB2Y2hpcV9idWlsZF90aW1lOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV9waW8yX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvZGV2aWNlcy92bWVfcGlvMl9jb3JlLmMKaW5kZXggMjhhNDU2OC4uOGU2NmE1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV9waW8yX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL2RldmljZXMvdm1lX3BpbzJfY29yZS5jCkBAIC00NjYsMjMgKzQ2NiwyMyBAQAogCiAvKiBUaGVzZSBhcmUgcmVxdWlyZWQgZm9yIGVhY2ggYm9hcmQgKi8KIE1PRFVMRV9QQVJNX0RFU0MoYnVzLCAiRW51bWVyYXRpb24gb2YgVk1FYnVzIHRvIHdoaWNoIHRoZSBib2FyZCBpcyBjb25uZWN0ZWQiKTsKLW1vZHVsZV9wYXJhbV9hcnJheShidXMsIGludCwgJmJ1c19udW0sIFNfSVJVR08pOworbW9kdWxlX3BhcmFtX2FycmF5KGJ1cywgaW50LCAmYnVzX251bSwgMDQ0NCk7CiAKIE1PRFVMRV9QQVJNX0RFU0MoYmFzZSwgIkJhc2UgVk1FIGFkZHJlc3MgZm9yIFBJTzIgUmVnaXN0ZXJzIik7Ci1tb2R1bGVfcGFyYW1fYXJyYXkoYmFzZSwgbG9uZywgJmJhc2VfbnVtLCBTX0lSVUdPKTsKK21vZHVsZV9wYXJhbV9hcnJheShiYXNlLCBsb25nLCAmYmFzZV9udW0sIDA0NDQpOwogCiBNT0RVTEVfUEFSTV9ERVNDKHZlY3RvciwgIlZNRSBJUlEgVmVjdG9yIChMb3dlciA0IGJpdHMgbWFza2VkKSIpOwotbW9kdWxlX3BhcmFtX2FycmF5KHZlY3RvciwgaW50LCAmdmVjdG9yX251bSwgU19JUlVHTyk7Cittb2R1bGVfcGFyYW1fYXJyYXkodmVjdG9yLCBpbnQsICZ2ZWN0b3JfbnVtLCAwNDQ0KTsKIAogTU9EVUxFX1BBUk1fREVTQyhsZXZlbCwgIlZNRSBJUlEgTGV2ZWwiKTsKLW1vZHVsZV9wYXJhbV9hcnJheShsZXZlbCwgaW50LCAmbGV2ZWxfbnVtLCBTX0lSVUdPKTsKK21vZHVsZV9wYXJhbV9hcnJheShsZXZlbCwgaW50LCAmbGV2ZWxfbnVtLCAwNDQ0KTsKIAogTU9EVUxFX1BBUk1fREVTQyh2YXJpYW50LCAiTGFzdCA0IGNoYXJhY3RlcnMgb2YgUElPMiBib2FyZCB2YXJpYW50Iik7Ci1tb2R1bGVfcGFyYW1fYXJyYXkodmFyaWFudCwgY2hhcnAsICZ2YXJpYW50X251bSwgU19JUlVHTyk7Cittb2R1bGVfcGFyYW1fYXJyYXkodmFyaWFudCwgY2hhcnAsICZ2YXJpYW50X251bSwgMDQ0NCk7CiAKIC8qIFRoaXMgaXMgZm9yIGRlYnVnZ2luZyAqLwogTU9EVUxFX1BBUk1fREVTQyhsb29wYmFjaywgIkVuYWJsZSBsb29wYmFjayBtb2RlIG9uIGFsbCBjYXJkcyIpOwotbW9kdWxlX3BhcmFtKGxvb3BiYWNrLCBib29sLCBTX0lSVUdPKTsKK21vZHVsZV9wYXJhbShsb29wYmFjaywgYm9vbCwgMDQ0NCk7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiR0UgUElPMiA2VSBWTUUgSS9PIERyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiTWFydHluIFdlbGNoIDxtYXJ0eW4ud2VsY2hAZ2UuY29tIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2RldmljZXMvdm1lX3VzZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvZGV2aWNlcy92bWVfdXNlci5jCmluZGV4IGI5NTg4M2IuLjVkZDQzMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92bWUvZGV2aWNlcy92bWVfdXNlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvZGV2aWNlcy92bWVfdXNlci5jCkBAIC03NzMsNyArNzczLDcgQEAKIH0KIAogTU9EVUxFX1BBUk1fREVTQyhidXMsICJFbnVtZXJhdGlvbiBvZiBWTUVidXMgdG8gd2hpY2ggdGhlIGRyaXZlciBpcyBjb25uZWN0ZWQiKTsKLW1vZHVsZV9wYXJhbV9hcnJheShidXMsIGludCwgJmJ1c19udW0sIDApOworbW9kdWxlX3BhcmFtX2FycmF5KGJ1cywgaW50LCAmYnVzX251bSwgMDAwMCk7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiVk1FIFVzZXIgU3BhY2UgQWNjZXNzIERyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiTWFydHluIFdlbGNoIDxtYXJ0eW4ud2VsY2hAZ2UuY29tIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2Jhc2ViYW5kLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2Jhc2ViYW5kLmMKaW5kZXggNjU0ZDA3Mi4uZGU1MDNhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9iYXNlYmFuZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvYmFzZWJhbmQuYwpAQCAtMTcyOSw3ICsxNzI5LDcgQEAKIAl1bnNpZ25lZCBpbnQgdUZyYW1lVGltZTsKIAl1bnNpZ25lZCBpbnQgdVByZWFtYmxlOwogCXVuc2lnbmVkIGludCB1VG1wOwotCXVuc2lnbmVkIGludCB1UmF0ZUlkeCA9ICh1bnNpZ25lZCBpbnQpIHdSYXRlOworCXVuc2lnbmVkIGludCB1UmF0ZUlkeCA9ICh1bnNpZ25lZCBpbnQpd1JhdGU7CiAJdW5zaWduZWQgaW50IHVSYXRlID0gMDsKIAogCWlmICh1UmF0ZUlkeCA+IFJBVEVfNTRNKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9jYXJkLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2NhcmQuYwppbmRleCBhZmIxZThiLi5kYmNlYTQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2NhcmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2NhcmQuYwpAQCAtNjE5LDcgKzYxOSw3IEBACiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgQ0FSRHdHZXRDQ0tDb250cm9sUmF0ZShzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYsCiAJCQkJCSAgICAgdW5zaWduZWQgc2hvcnQgd1JhdGVJZHgpCiB7Ci0JdW5zaWduZWQgaW50IHVpID0gKHVuc2lnbmVkIGludCkgd1JhdGVJZHg7CisJdW5zaWduZWQgaW50IHVpID0gKHVuc2lnbmVkIGludCl3UmF0ZUlkeDsKIAogCXdoaWxlICh1aSA+IFJBVEVfMU0pIHsKIAkJaWYgKHByaXYtPmJhc2ljX3JhdGVzICYgKCh1MzIpMHgxIDw8IHVpKSkKQEAgLTY0NSw3ICs2NDUsNyBAQAogc3RhdGljIHVuc2lnbmVkIHNob3J0IENBUkR3R2V0T0ZETUNvbnRyb2xSYXRlKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiwKIAkJCQkJICAgICAgdW5zaWduZWQgc2hvcnQgd1JhdGVJZHgpCiB7Ci0JdW5zaWduZWQgaW50IHVpID0gKHVuc2lnbmVkIGludCkgd1JhdGVJZHg7CisJdW5zaWduZWQgaW50IHVpID0gKHVuc2lnbmVkIGludCl3UmF0ZUlkeDsKIAogCXByX2RlYnVnKCJCQVNJQyBSQVRFOiAlWFxuIiwgcHJpdi0+YmFzaWNfcmF0ZXMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2NoYW5uZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY2hhbm5lbC5jCmluZGV4IGI3ZDQzYTUuLjAyOWE4ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY2hhbm5lbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY2hhbm5lbC5jCkBAIC0xOTMsNyArMTkzLDggQEAKIAlNQUN2UmVnQml0c09uKHByaXYtPlBvcnRPZmZzZXQsIE1BQ19SRUdfTUFDQ1IsIE1BQ0NSX0NMUk5BVik7CiAKIAkvKiBUWF9QRSB3aWxsIHJlc2VydmUgMyB1cyBmb3IgTUFYMjgyOSBBIG1vZGUgb25seSwKLQkgICBpdCBpcyBmb3IgYmV0dGVyIFRYIHRocm91Z2hwdXQgKi8KKwkgKiBpdCBpcyBmb3IgYmV0dGVyIFRYIHRocm91Z2hwdXQKKwkgKi8KIAogCWlmIChwcml2LT5ieVJGVHlwZSA9PSBSRl9BSVJPSEE3MjMwKQogCQlSRmJBTDcyMzBTZWxlY3RDaGFubmVsUG9zdFByb2Nlc3MocHJpdiwgcHJpdi0+YnlDdXJyZW50Q2gsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RldmljZV9tYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RldmljZV9tYWluLmMKaW5kZXggNDk0MTY0MC4uZjEwOWVlYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGV2aWNlX21haW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RldmljZV9tYWluLmMKQEAgLTExMywxMCArMTEzLDEwIEBACiBERVZJQ0VfUEFSQU0oTG9uZ1JldHJ5TGltaXQsICJsb25nIGZyYW1lIHJldHJ5IGxpbWl0cyIpOwogCiAvKiBCYXNlYmFuZFR5cGVbXSBiYXNlYmFuZCB0eXBlIHNlbGVjdGVkCi0gICAwOiBpbmRpY2F0ZSA4MDIuMTFhIHR5cGUKLSAgIDE6IGluZGljYXRlIDgwMi4xMWIgdHlwZQotICAgMjogaW5kaWNhdGUgODAyLjExZyB0eXBlCi0qLworICogMDogaW5kaWNhdGUgODAyLjExYSB0eXBlCisgKiAxOiBpbmRpY2F0ZSA4MDIuMTFiIHR5cGUKKyAqIDI6IGluZGljYXRlIDgwMi4xMWcgdHlwZQorICovCiAjZGVmaW5lIEJCUF9UWVBFX01JTiAgICAgMAogI2RlZmluZSBCQlBfVFlQRV9NQVggICAgIDIKICNkZWZpbmUgQkJQX1RZUEVfREVGICAgICAyCkBAIC00NzcsNyArNDc3LDcgQEAKIAkJCQkJICAgICBDQl9NQVhfQlVGX1NJWkUsCiAJCQkJCSAgICAgJnByaXYtPnR4X2J1ZnNfZG1hMCwKIAkJCQkJICAgICBHRlBfQVRPTUlDKTsKLQlpZiAocHJpdi0+dHgwX2J1ZnMgPT0gTlVMTCkgeworCWlmICghcHJpdi0+dHgwX2J1ZnMpIHsKIAkJZGV2X2VycigmcHJpdi0+cGNpZC0+ZGV2LCAiYWxsb2NhdGUgYnVmIGRtYSBtZW1vcnkgZmFpbGVkXG4iKTsKIAogCQlkbWFfZnJlZV9jb2hlcmVudCgmcHJpdi0+cGNpZC0+ZGV2LApAQCAtNzM1LDcgKzczNSw3IEBACiAJc3RydWN0IHZudF9yZF9pbmZvICpyZF9pbmZvID0gcmQtPnJkX2luZm87CiAKIAlyZF9pbmZvLT5za2IgPSBkZXZfYWxsb2Nfc2tiKChpbnQpcHJpdi0+cnhfYnVmX3N6KTsKLQlpZiAocmRfaW5mby0+c2tiID09IE5VTEwpCisJaWYgKCFyZF9pbmZvLT5za2IpCiAJCXJldHVybiBmYWxzZTsKIAogCXJkX2luZm8tPnNrYl9kbWEgPQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9rZXkuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUva2V5LmMKaW5kZXggZmZjYWYyNS4uZTE2MWQ1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9rZXkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2tleS5jCkBAIC0zMSwxNiArMzEsNiBAQAogI2luY2x1ZGUgImtleS5oIgogI2luY2x1ZGUgIm1hYy5oIgogCi1pbnQgdm50X2tleV9pbml0X3RhYmxlKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdikKLXsKLQl1MzIgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfS0VZX1RBQkxFOyBpKyspCi0JCU1BQ3ZEaXNhYmxlS2V5RW50cnkocHJpdiwgaSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCB2bnRfc2V0X2tleW1vZGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4ICptYWNfYWRkciwKIAlzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXksIHUzMiBrZXlfdHlwZSwgdTMyIG1vZGUsCiAJYm9vbCBvbmZseV9sYXRjaCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUva2V5LmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2tleS5oCmluZGV4IDI2MWY4MTguLmQ3MjcxOTc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2tleS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUva2V5LmgKQEAgLTYxLDggKzYxLDYgQEAKIAogc3RydWN0IHZudF9wcml2YXRlOwogCi1pbnQgdm50X2tleV9pbml0X3RhYmxlKHN0cnVjdCB2bnRfcHJpdmF0ZSAqKTsKLQogaW50IHZudF9zZXRfa2V5cyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKIAkJIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvcG93ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvcG93ZXIuYwppbmRleCBiYzhjYTk4Li43ZDZlNzQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3Bvd2VyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9wb3dlci5jCkBAIC01Miw3ICs1Miw3IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgRnVuY3Rpb25zICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLS8qKworLyoKICAqCiAgKiBSb3V0aW5lIERlc2NyaXB0aW9uOgogICogRW5hYmxlIGh3IHBvd2VyIHNhdmluZyBmdW5jdGlvbnMKQEAgLTYwLDcgKzYwLDcgQEAKICAqIFJldHVybiBWYWx1ZToKICAqICAgIE5vbmUuCiAgKgotIC0qLworICovCiAKIHZvaWQKIFBTdkVuYWJsZVBvd2VyU2F2aW5nKApAQCAtMTA0LDcgKzEwNCw3IEBACiAJcHJfZGVidWcoIlBTOlBvd2VyIFNhdmluZyBNb2RlIEVuYWJsZS4uLlxuIik7CiB9CiAKLS8qKworLyoKICAqCiAgKiBSb3V0aW5lIERlc2NyaXB0aW9uOgogICogRGlzYWJsZSBodyBwb3dlciBzYXZpbmcgZnVuY3Rpb25zCkBAIC0xMTIsNyArMTEyLDcgQEAKICAqIFJldHVybiBWYWx1ZToKICAqICAgIE5vbmUuCiAgKgotIC0qLworICovCiAKIHZvaWQKIFBTdkRpc2FibGVQb3dlclNhdmluZygKQEAgLTEzNCw3ICsxMzQsNyBAQAogfQogCiAKLS8qKworLyoKICAqCiAgKiBSb3V0aW5lIERlc2NyaXB0aW9uOgogICogQ2hlY2sgaWYgTmV4dCBUQlRUIG11c3Qgd2FrZSB1cApAQCAtMTQyLDcgKzE0Miw3IEBACiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICBOb25lLgogICoKLSAtKi8KKyAqLwogCiBib29sCiBQU2JJc05leHRUQlRUV2FrZVVwKApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9yZi5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9yZi5jCmluZGV4IGFlMTBkYTIuLjQ0Nzg4MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvcmYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3JmLmMKQEAgLTE2OSw3ICsxNjksOCBAQAogfTsKIAogLyogNDBNSHogcmVmZXJlbmNlIGZyZXF1ZW5jeQotICogTmVlZCB0byBQdWxsIFBMTE9OKFBFMykgbG93IHdoZW4gd3JpdGluZyBjaGFubmVsIHJlZ2lzdGVycyB0aHJvdWdoIDMtd2lyZS4qLworICogTmVlZCB0byBQdWxsIFBMTE9OKFBFMykgbG93IHdoZW4gd3JpdGluZyBjaGFubmVsIHJlZ2lzdGVycyB0aHJvdWdoIDMtd2lyZS4KKyAqLwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgZHdBTDcyMzBJbml0VGFibGVbQ0JfQUw3MjMwX0lOSVRfU0VRXSA9IHsKIAkweDAwMzc5MDAwKyhCWV9BTDcyMzBfUkVHX0xFTjw8MykrSUZSRUdDVExfUkVHVywgLyogQ2hhbm5lbDEgLy8gTmVlZCBtb2RpZnkgZm9yIDExYSAqLwogCTB4MTMzMzMxMDArKEJZX0FMNzIzMF9SRUdfTEVOPDwzKStJRlJFR0NUTF9SRUdXLCAvKiBDaGFubmVsMSAvLyBOZWVkIG1vZGlmeSBmb3IgMTFhICovCkBAIC00NjMsNyArNDY0LDggQEAKIH0KIAogLyogTmVlZCB0byBQdWxsIFBMTE9OIGxvdyB3aGVuIHdyaXRpbmcgY2hhbm5lbCByZWdpc3RlcnMgdGhyb3VnaAotICogMy13aXJlIGludGVyZmFjZSAqLworICogMy13aXJlIGludGVyZmFjZQorICovCiBzdGF0aWMgYm9vbCBzX2JBTDcyMzBTZWxlY3RDaGFubmVsKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiwgdW5zaWduZWQgY2hhciBieUNoYW5uZWwpCiB7CiAJdm9pZCBfX2lvbWVtICpkd0lvQmFzZSA9IHByaXYtPlBvcnRPZmZzZXQ7CkBAIC04NzMsNyArODc1LDggQEAKIAogCWNhc2UgUkZfQUlST0hBNzIzMDoKIAkJLyogMHgwODBGMUIwMCBmb3IgMyB3aXJlIGNvbnRyb2wgVHhHYWluKEQxMCkKLQkJICogYW5kIDB4MzEgYXMgVFggR2FpbiB2YWx1ZSAqLworCQkgKiBhbmQgMHgzMSBhcyBUWCBHYWluIHZhbHVlCisJCSAqLwogCQlkd01heDcyMzBQd3IgPSAweDA4MEMwQjAwIHwgKChieVB3cikgPDwgMTIpIHwKIAkJCShCWV9BTDcyMzBfUkVHX0xFTiA8PCAzKSAgfCBJRlJFR0NUTF9SRUdXOwogCkBAIC04ODYsNyArODg5LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKisKKy8qCiAgKgogICogUm91dGluZSBEZXNjcmlwdGlvbjoKICAqICAgICBUcmFuc2xhdGUgUlNTSSB0byBkQm0KQEAgLTkwMCw3ICs5MDMsNyBAQAogICoKICAqIFJldHVybiBWYWx1ZTogbm9uZQogICoKLSAtKi8KKyAqLwogdm9pZAogUkZ2UlNTSVRvZEJtKAogCXN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiwKQEAgLTkyNyw3ICs5MzAsOCBAQAogfQogCiAvKiBQb3N0IHByb2Nlc3NpbmcgZm9yIHRoZSAxMWIvZyBhbmQgMTFhLgotICogZm9yIHNhdmUgdGltZSBvbiBjaGFuZ2luZyBSZWcyLDMsNSw3LDEwLDEyLDE1ICovCisgKiBmb3Igc2F2ZSB0aW1lIG9uIGNoYW5naW5nIFJlZzIsMyw1LDcsMTAsMTIsMTUKKyAqLwogYm9vbCBSRmJBTDcyMzBTZWxlY3RDaGFubmVsUG9zdFByb2Nlc3Moc3RydWN0IHZudF9wcml2YXRlICpwcml2LAogCQkJCSAgICAgICB1MTYgYnlPbGRDaGFubmVsLAogCQkJCSAgICAgICB1MTYgYnlOZXdDaGFubmVsKQpAQCAtOTM4LDcgKzk0Miw4IEBACiAKIAkvKiBpZiBjaGFuZ2UgYmV0d2VlbiAxMSBiL2cgYW5kIDExYSBuZWVkIHRvIHVwZGF0ZSB0aGUgZm9sbG93aW5nCiAJICogcmVnaXN0ZXIKLQkgKiBDaGFubmVsIEluZGV4IDF+MTQgKi8KKwkgKiBDaGFubmVsIEluZGV4IDF+MTQKKwkgKi8KIAlpZiAoKGJ5T2xkQ2hhbm5lbCA8PSBDQl9NQVhfQ0hBTk5FTF8yNEcpICYmIChieU5ld0NoYW5uZWwgPiBDQl9NQVhfQ0hBTk5FTF8yNEcpKSB7CiAJCS8qIENoYW5nZSBmcm9tIDIuNEcgdG8gNUcgW1JlZ10gKi8KIAkJcmV0ICY9IElGUkZiV3JpdGVFbWJlZGRlZChwcml2LCBkd0FMNzIzMEluaXRUYWJsZUFNb2RlWzJdKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvcnh0eC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9yeHR4LmMKaW5kZXggZTRjMzE2NS4uN2U2OWJjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9yeHR4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9yeHR4LmMKQEAgLTY0LDggKzY0LDEwIEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgU3RhdGljIEZ1bmN0aW9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgU3RhdGljIERlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBDUklUSUNBTF9QQUNLRVRfTEVOICAgICAgMjU2ICAgIC8qIGlmIHBhY2tldCBzaXplIDwgMjU2IC0+IGluLWRpcmVjdCBzZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldCBzaXplID49IDI1NiAtPiBkaXJlY3Qgc2VuZCAqLworLyogaWYgcGFja2V0IHNpemUgPCAyNTYgLT4gaW4tZGlyZWN0IHNlbmQKKyAqIHZwYWNrZXQgc2l6ZSA+PSAyNTYgLT4gZGlyZWN0IHNlbmQKKyAqLworI2RlZmluZSBDUklUSUNBTF9QQUNLRVRfTEVOICAgICAgMjU2CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCB3VGltZVN0YW1wT2ZmWzJdW01BWF9SQVRFXSA9IHsKIAl7Mzg0LCAyODgsIDIyNiwgMjA5LCA1NCwgNDMsIDM3LCAzMSwgMjgsIDI1LCAyNCwgMjN9LCAvKiBMb25nIFByZWFtYmxlICovCkBAIC0xNTgsMTEgKzE2MCwxMSBAQAogCQkJCQkJCVtyYXRlICUgTUFYX1JBVEVdKTsKIH0KIAotLypieVBrdFR5cGUgOiBQS19UWVBFXzExQSAgICAgMAotICBQS19UWVBFXzExQiAgICAgMQotICBQS19UWVBFXzExR0IgICAgMgotICBQS19UWVBFXzExR0EgICAgMwotKi8KKy8qIGJ5UGt0VHlwZSA6IFBLX1RZUEVfMTFBICAgICAwCisgKiBQS19UWVBFXzExQiAgICAgMQorICogUEtfVFlQRV8xMUdCICAgIDIKKyAqIFBLX1RZUEVfMTFHQSAgICAzCisgKi8KIHN0YXRpYwogdW5zaWduZWQgaW50CiBzX3VHZXRUeFJzdlRpbWUoCkBAIC01MDIsNyArNTA0LDcgQEAKICkKIHsKIAotCWlmIChwVHhEYXRhSGVhZCA9PSBOVUxMKQorCWlmICghcFR4RGF0YUhlYWQpCiAJCXJldHVybiAwOwogCiAKQEAgLTY0NiwxNyArNjQ4LDIwIEBACiB7CiAJdW5zaWduZWQgaW50IHVSVFNGcmFtZUxlbiA9IDIwOwogCi0JaWYgKHB2UlRTID09IE5VTEwpCisJaWYgKCFwdlJUUykKIAkJcmV0dXJuOwogCiAJaWYgKGJEaXNDUkMpIHsKLQkJLyogV2hlbiBDUkNESVMgYml0IGlzIG9uLCBIL1cgZm9yZ290IHRvIGdlbmVyYXRlIEZDUyBmb3IgUlRTIGZyYW1lLAotCQkgaW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gZGVjcmVhc2UgaXRzIGxlbmd0aCBieSA0LiAqLworCQkvKiBXaGVuIENSQ0RJUyBiaXQgaXMgb24sIEgvVyBmb3Jnb3QgdG8gZ2VuZXJhdGUgRkNTIGZvcgorCQkgKiBSVFMgZnJhbWUsIGluIHRoaXMgY2FzZSB3ZSBuZWVkIHRvIGRlY3JlYXNlIGl0cyBsZW5ndGggYnkgNC4KKwkJICovCiAJCXVSVFNGcmFtZUxlbiAtPSA0OwogCX0KIAotCS8qIE5vdGU6IFNvIGZhciBSVFNIZWFkIGRvZXNuJ3QgYXBwZWFyIGluIEFUSU0gJiBCZWFjb20gRE1BLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHRha2UgdGhlbSBpbnRvIGFjY291bnQuCi0JICAgICAgIE90aGVyd2lzZSwgd2UgbmVlZCB0byBtb2RpZnkgY29kZXMgZm9yIHRoZW0uICovCisJLyogTm90ZTogU28gZmFyIFJUU0hlYWQgZG9lc24ndCBhcHBlYXIgaW4gQVRJTSAmIEJlYWNvbSBETUEsCisJICogc28gd2UgZG9uJ3QgbmVlZCB0byB0YWtlIHRoZW0gaW50byBhY2NvdW50LgorCSAqIE90aGVyd2lzZSwgd2UgbmVlZCB0byBtb2RpZnkgY29kZXMgZm9yIHRoZW0uCisJICovCiAJaWYgKGJ5UGt0VHlwZSA9PSBQS19UWVBFXzExR0IgfHwgYnlQa3RUeXBlID09IFBLX1RZUEVfMTFHQSkgewogCQlpZiAoYnlGQk9wdGlvbiA9PSBBVVRPX0ZCX05PTkUpIHsKIAkJCXN0cnVjdCB2bnRfcnRzX2cgKmJ1ZiA9IHB2UlRTOwpAQCAtODM4LDEyICs4NDMsMTMgQEAKIHsKIAl1bnNpZ25lZCBpbnQgdUNUU0ZyYW1lTGVuID0gMTQ7CiAKLQlpZiAocHZDVFMgPT0gTlVMTCkKKwlpZiAoIXB2Q1RTKQogCQlyZXR1cm47CiAKIAlpZiAoYkRpc0NSQykgewotCQkvKiBXaGVuIENSQ0RJUyBiaXQgaXMgb24sIEgvVyBmb3Jnb3QgdG8gZ2VuZXJhdGUgRkNTIGZvciBDVFMgZnJhbWUsCi0JCSBpbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byBkZWNyZWFzZSBpdHMgbGVuZ3RoIGJ5IDQuICovCisJCS8qIFdoZW4gQ1JDRElTIGJpdCBpcyBvbiwgSC9XIGZvcmdvdCB0byBnZW5lcmF0ZSBGQ1MgZm9yCisJCSAqIENUUyBmcmFtZSwgaW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gZGVjcmVhc2UgaXRzIGxlbmd0aCBieSA0LgorCQkgKi8KIAkJdUNUU0ZyYW1lTGVuIC09IDQ7CiAJfQogCkBAIC05MTUsNyArOTIxLDcgQEAKIAl9CiB9CiAKLS8qKworLyoKICAqCiAgKiBEZXNjcmlwdGlvbjoKICAqICAgICAgR2VuZXJhdGUgRklGTyBjb250cm9sIGZvciBNQUMgJiBCYXNlYmFuZCBjb250cm9sbGVyCkBAIC05MzcsNyArOTQzLDggQEAKICAqIFJldHVybiBWYWx1ZTogbm9uZQogICoKICAtCi0gKiB1bnNpZ25lZCBpbnQgY2JGcmFtZVNpemUsIEhkcitQYXlsb2FkK0ZDUyAqLworICogdW5zaWduZWQgaW50IGNiRnJhbWVTaXplLCBIZHIrUGF5bG9hZCtGQ1MKKyAqLwogc3RhdGljCiB2b2lkCiBzX3ZHZW5lcmF0ZVR4UGFyYW1ldGVyKApAQCAtOTcyLDggKzk3OSw4IEBACiAJCXJldHVybjsKIAogCWlmIChieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUdCIHx8IGJ5UGt0VHlwZSA9PSBQS19UWVBFXzExR0EpIHsKLQkJaWYgKHB2UlRTICE9IE5VTEwpIHsgLyogUlRTX25lZWQKLQkJCSBGaWxsIFJzdlRpbWUgKi8KKwkJaWYgKHB2UlRTICE9IE5VTEwpIHsgLyogUlRTX25lZWQgKi8KKwkJCS8qIEZpbGwgUnN2VGltZSAqLwogCQkJc3RydWN0IHZudF9ycnZfdGltZV9ydHMgKmJ1ZiA9IHB2UnJ2VGltZTsKIAogCQkJYnVmLT5ydHNfcnJ2X3RpbWVfYWEgPSBzX3VHZXRSVFNDVFNSc3ZUaW1lKHBEZXZpY2UsIDIsIGJ5UGt0VHlwZSwgY2JGcmFtZVNpemUsIHdDdXJyZW50UmF0ZSk7CkBAIC0xMDAyLDcgKzEwMDksNyBAQAogCiAJCQkvKiBGaWxsIFJUUyAqLwogCQkJc192RmlsbFJUU0hlYWQocERldmljZSwgYnlQa3RUeXBlLCBwdlJUUywgY2JGcmFtZVNpemUsIGJOZWVkQUNLLCBiRGlzQ1JDLCBwc0V0aEhlYWRlciwgd0N1cnJlbnRSYXRlLCBieUZCT3B0aW9uKTsKLQkJfSBlbHNlIGlmIChwdlJUUyA9PSBOVUxMKSB7LyogUlRTX25lZWRsZXNzLCBub24gUENGIG1vZGUgKi8KKwkJfSBlbHNlIGlmICghcHZSVFMpIHsvKiBSVFNfbmVlZGxlc3MsIG5vbiBQQ0YgbW9kZSAqLwogCQkJc3RydWN0IHZudF9ycnZfdGltZV9hYiAqYnVmID0gcHZScnZUaW1lOwogCiAJCQlidWYtPnJydl90aW1lID0gdm50X3J4dHhfcnN2dGltZV9sZTE2KHBEZXZpY2UsIFBLX1RZUEVfMTFBLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFDSyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Jhc2ViYW5kLmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Jhc2ViYW5kLmgKaW5kZXggODA3YTU4MC4uN2NjMTM4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9iYXNlYmFuZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvYmFzZWJhbmQuaApAQCAtODQsMTAgKzg0LDEwIEBACiB9IF9fcGFja2VkOwogCiB1bnNpZ25lZCBpbnQgdm50X2dldF9mcmFtZV90aW1lKHU4IHByZWFtYmxlX3R5cGUsIHU4IHBrdF90eXBlLAotCXVuc2lnbmVkIGludCBmcmFtZV9sZW5ndGgsIHUxNiB0eF9yYXRlKTsKKwkJCQl1bnNpZ25lZCBpbnQgZnJhbWVfbGVuZ3RoLCB1MTYgdHhfcmF0ZSk7CiAKIHZvaWQgdm50X2dldF9waHlfZmllbGQoc3RydWN0IHZudF9wcml2YXRlICosIHUzMiBmcmFtZV9sZW5ndGgsCi0JdTE2IHR4X3JhdGUsIHU4IHBrdF90eXBlLCBzdHJ1Y3Qgdm50X3BoeV9maWVsZCAqKTsKKwkJICAgICAgIHUxNiB0eF9yYXRlLCB1OCBwa3RfdHlwZSwgc3RydWN0IHZudF9waHlfZmllbGQgKik7CiAKIHZvaWQgdm50X3NldF9zaG9ydF9zbG90X3RpbWUoc3RydWN0IHZudF9wcml2YXRlICopOwogdm9pZCB2bnRfc2V0X3ZnYV9nYWluX29mZnNldChzdHJ1Y3Qgdm50X3ByaXZhdGUgKiwgdTgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9jYXJkLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2NhcmQuYwppbmRleCBhMzgyZmM2Li41M2I0NjljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2NhcmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2NhcmQuYwpAQCAtNDYsMTAgKzQ2LDExIEBACiAjaW5jbHVkZSAia2V5LmgiCiAjaW5jbHVkZSAidXNicGlwZS5oIgogCi0vKiBjb25zdCB1MTYgY3dSWEJDTlRTRk9mZltNQVhfUkFURV0gPQotICAgezE3LCAzNCwgOTYsIDE5MiwgMzQsIDIzLCAxNywgMTEsIDgsIDUsIDQsIDN9OyAqLworLyogY29uc3QgdTE2IGN3X3J4YmNudHNmX29mZltNQVhfUkFURV0gPQorICogICB7MTcsIDM0LCA5NiwgMTkyLCAzNCwgMjMsIDE3LCAxMSwgOCwgNSwgNCwgM307CisgKi8KIAotc3RhdGljIGNvbnN0IHUxNiBjd1JYQkNOVFNGT2ZmW01BWF9SQVRFXSA9IHsKK3N0YXRpYyBjb25zdCB1MTYgY3dfcnhiY250c2Zfb2ZmW01BWF9SQVRFXSA9IHsKIAkxOTIsIDk2LCAzNCwgMTcsIDM0LCAyMywgMTcsIDExLCA4LCA1LCA0LCAzCiB9OwogCkBAIC02NSw3ICs2Niw2IEBACiAgKi8KIHZvaWQgdm50X3NldF9jaGFubmVsKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiwgdTMyIGNvbm5lY3Rpb25fY2hhbm5lbCkKIHsKLQogCWlmIChjb25uZWN0aW9uX2NoYW5uZWwgPiBDQl9NQVhfQ0hBTk5FTCB8fCAhY29ubmVjdGlvbl9jaGFubmVsKQogCQlyZXR1cm47CiAKQEAgLTc2LDEwICs3NiwxMCBAQAogCXZudF9tYWNfcmVnX2JpdHNfb2ZmKHByaXYsIE1BQ19SRUdfQ0hBTk5FTCwgMHhiMCk7CiAKIAl2bnRfY29udHJvbF9vdXQocHJpdiwgTUVTU0FHRV9UWVBFX1NFTEVDVF9DSEFOTkVMLAotCQkJCQljb25uZWN0aW9uX2NoYW5uZWwsIDAsIDAsIE5VTEwpOworCQkJY29ubmVjdGlvbl9jaGFubmVsLCAwLCAwLCBOVUxMKTsKIAogCXZudF9jb250cm9sX291dF91OChwcml2LCBNRVNTQUdFX1JFUVVFU1RfTUFDUkVHLCBNQUNfUkVHX0NIQU5ORUwsCi0JCSh1OCkoY29ubmVjdGlvbl9jaGFubmVsIHwgMHg4MCkpOworCQkJICAgKHU4KShjb25uZWN0aW9uX2NoYW5uZWwgfCAweDgwKSk7CiB9CiAKIC8qCkBAIC0xMjYsMTEgKzEyNiwxMSBAQAogCXUxNiB1aSA9IHJhdGVfaWR4OwogCiAJZGV2X2RiZygmcHJpdi0+dXNiLT5kZXYsICIlcyBiYXNpYyByYXRlOiAlZFxuIiwKLQkJCQkJX19mdW5jX18sICBwcml2LT5iYXNpY19yYXRlcyk7CisJCV9fZnVuY19fLCAgcHJpdi0+YmFzaWNfcmF0ZXMpOwogCiAJaWYgKCF2bnRfb2ZkbV9taW5fcmF0ZShwcml2KSkgewogCQlkZXZfZGJnKCZwcml2LT51c2ItPmRldiwgIiVzIChOTyBPRkRNKSAlZFxuIiwKLQkJCQkJCV9fZnVuY19fLCByYXRlX2lkeCk7CisJCQlfX2Z1bmNfXywgcmF0ZV9pZHgpOwogCQlpZiAocmF0ZV9pZHggPiBSQVRFXzI0TSkKIAkJCXJhdGVfaWR4ID0gUkFURV8yNE07CiAJCXJldHVybiByYXRlX2lkeDsKQEAgLTEzOSw3ICsxMzksNyBAQAogCXdoaWxlICh1aSA+IFJBVEVfMTFNKSB7CiAJCWlmIChwcml2LT5iYXNpY19yYXRlcyAmICgxIDw8IHVpKSkgewogCQkJZGV2X2RiZygmcHJpdi0+dXNiLT5kZXYsICIlcyByYXRlOiAlZFxuIiwKLQkJCQkJCQlfX2Z1bmNfXywgdWkpOworCQkJCV9fZnVuY19fLCB1aSk7CiAJCQlyZXR1cm4gdWk7CiAJCX0KIAkJdWktLTsKQEAgLTE2NSw5ICsxNjUsOCBAQAogICoKICAqLwogc3RhdGljIHZvaWQgdm50X2NhbGN1bGF0ZV9vZmRtX3JhdGUodTE2IHJhdGUsIHU4IGJiX3R5cGUsCi0JCQkJCXU4ICp0eF9yYXRlLCB1OCAqcnN2X3RpbWUpCisJCQkJICAgIHU4ICp0eF9yYXRlLCB1OCAqcnN2X3RpbWUpCiB7Ci0KIAlzd2l0Y2ggKHJhdGUpIHsKIAljYXNlIFJBVEVfNk06CiAJCWlmIChiYl90eXBlID09IEJCX1RZUEVfMTFBKSB7CkBAIC0yNjcsMjAgKzI2NiwyMCBAQAogCWludCBpOwogCiAJLypSU1BJTkZfYl8xKi8KLQl2bnRfZ2V0X3BoeV9maWVsZChwcml2LCAxNCwKLQkJdm50X2dldF9jY2tfcmF0ZShwcml2LCBSQVRFXzFNKSwgUEtfVFlQRV8xMUIsICZwaHlbMF0pOworCXZudF9nZXRfcGh5X2ZpZWxkKHByaXYsIDE0LCB2bnRfZ2V0X2Nja19yYXRlKHByaXYsIFJBVEVfMU0pLAorCQkJICBQS19UWVBFXzExQiwgJnBoeVswXSk7CiAKIAkvKlJTUElORl9iXzIqLwotCXZudF9nZXRfcGh5X2ZpZWxkKHByaXYsIDE0LAotCQl2bnRfZ2V0X2Nja19yYXRlKHByaXYsIFJBVEVfMk0pLCBQS19UWVBFXzExQiwgJnBoeVsxXSk7CisJdm50X2dldF9waHlfZmllbGQocHJpdiwgMTQsIHZudF9nZXRfY2NrX3JhdGUocHJpdiwgUkFURV8yTSksCisJCQkgIFBLX1RZUEVfMTFCLCAmcGh5WzFdKTsKIAogCS8qUlNQSU5GX2JfNSovCi0Jdm50X2dldF9waHlfZmllbGQocHJpdiwgMTQsCi0JCXZudF9nZXRfY2NrX3JhdGUocHJpdiwgUkFURV81TSksIFBLX1RZUEVfMTFCLCAmcGh5WzJdKTsKKwl2bnRfZ2V0X3BoeV9maWVsZChwcml2LCAxNCwgdm50X2dldF9jY2tfcmF0ZShwcml2LCBSQVRFXzVNKSwKKwkJCSAgUEtfVFlQRV8xMUIsICZwaHlbMl0pOwogCiAJLypSU1BJTkZfYl8xMSovCi0Jdm50X2dldF9waHlfZmllbGQocHJpdiwgMTQsCi0JCXZudF9nZXRfY2NrX3JhdGUocHJpdiwgUkFURV8xMU0pLCBQS19UWVBFXzExQiwgJnBoeVszXSk7CisJdm50X2dldF9waHlfZmllbGQocHJpdiwgMTQsIHZudF9nZXRfY2NrX3JhdGUocHJpdiwgUkFURV8xMU0pLAorCQkJICBQS19UWVBFXzExQiwgJnBoeVszXSk7CiAKIAkvKlJTUElORl9hXzYqLwogCXZudF9jYWxjdWxhdGVfb2ZkbV9yYXRlKFJBVEVfNk0sIGJiX3R5cGUsICZ0eF9yYXRlWzBdLCAmcnN2X3RpbWVbMF0pOwpAQCAtMjk5LDE5ICsyOTgsMTkgQEAKIAogCS8qUlNQSU5GX2FfMzYqLwogCXZudF9jYWxjdWxhdGVfb2ZkbV9yYXRlKHZudF9nZXRfb2ZkbV9yYXRlKHByaXYsIFJBVEVfMzZNKSwKLQkJCQkJYmJfdHlwZSwgJnR4X3JhdGVbNV0sICZyc3ZfdGltZVs1XSk7CisJCQkJYmJfdHlwZSwgJnR4X3JhdGVbNV0sICZyc3ZfdGltZVs1XSk7CiAKIAkvKlJTUElORl9hXzQ4Ki8KIAl2bnRfY2FsY3VsYXRlX29mZG1fcmF0ZSh2bnRfZ2V0X29mZG1fcmF0ZShwcml2LCBSQVRFXzQ4TSksCi0JCQkJCWJiX3R5cGUsICZ0eF9yYXRlWzZdLCAmcnN2X3RpbWVbNl0pOworCQkJCWJiX3R5cGUsICZ0eF9yYXRlWzZdLCAmcnN2X3RpbWVbNl0pOwogCiAJLypSU1BJTkZfYV81NCovCiAJdm50X2NhbGN1bGF0ZV9vZmRtX3JhdGUodm50X2dldF9vZmRtX3JhdGUocHJpdiwgUkFURV81NE0pLAotCQkJCQliYl90eXBlLCAmdHhfcmF0ZVs3XSwgJnJzdl90aW1lWzddKTsKKwkJCQliYl90eXBlLCAmdHhfcmF0ZVs3XSwgJnJzdl90aW1lWzddKTsKIAogCS8qUlNQSU5GX2FfNzIqLwogCXZudF9jYWxjdWxhdGVfb2ZkbV9yYXRlKHZudF9nZXRfb2ZkbV9yYXRlKHByaXYsIFJBVEVfNTRNKSwKLQkJCQkJYmJfdHlwZSwgJnR4X3JhdGVbOF0sICZyc3ZfdGltZVs4XSk7CisJCQkJYmJfdHlwZSwgJnR4X3JhdGVbOF0sICZyc3ZfdGltZVs4XSk7CiAKIAlwdXRfdW5hbGlnbmVkKHBoeVswXS5sZW4sICh1MTYgKikmZGF0YVswXSk7CiAJZGF0YVsyXSA9IHBoeVswXS5zaWduYWw7CkBAIC0zMzQsOCArMzMzLDggQEAKIAkJZGF0YVsxNiArIGkgKiAyICsgMV0gPSByc3ZfdGltZVtpXTsKIAl9CiAKLQl2bnRfY29udHJvbF9vdXQocHJpdiwgTUVTU0FHRV9UWVBFX1dSSVRFLAotCQlNQUNfUkVHX1JTUElORl9CXzEsIE1FU1NBR0VfUkVRVUVTVF9NQUNSRUcsIDM0LCAmZGF0YVswXSk7CisJdm50X2NvbnRyb2xfb3V0KHByaXYsIE1FU1NBR0VfVFlQRV9XUklURSwgTUFDX1JFR19SU1BJTkZfQl8xLAorCQkJTUVTU0FHRV9SRVFVRVNUX01BQ1JFRywgMzQsICZkYXRhWzBdKTsKIH0KIAogLyoKQEAgLTQyOSwxMiArNDI4LDEyIEBACiAJZGF0YVszXSA9ICh1OClwcml2LT5zbG90OwogCiAJdm50X2NvbnRyb2xfb3V0KHByaXYsIE1FU1NBR0VfVFlQRV9XUklURSwgTUFDX1JFR19TSUZTLAotCQlNRVNTQUdFX1JFUVVFU1RfTUFDUkVHLCA0LCAmZGF0YVswXSk7CisJCQlNRVNTQUdFX1JFUVVFU1RfTUFDUkVHLCA0LCAmZGF0YVswXSk7CiAKIAltYXhfbWluIHw9IDB4YTA7CiAKIAl2bnRfY29udHJvbF9vdXQocHJpdiwgTUVTU0FHRV9UWVBFX1dSSVRFLCBNQUNfUkVHX0NXTUFYTUlOMCwKLQkJTUVTU0FHRV9SRVFVRVNUX01BQ1JFRywgMSwgJm1heF9taW4pOworCQkJTUVTU0FHRV9SRVFVRVNUX01BQ1JFRywgMSwgJm1heF9taW4pOwogfQogCiB2b2lkIHZudF91cGRhdGVfdG9wX3JhdGVzKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdikKQEAgLTQ3OCw3ICs0NzcsNiBAQAogCiB1OCB2bnRfZ2V0X3BrdF90eXBlKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdikKIHsKLQogCWlmIChwcml2LT5iYl90eXBlID09IEJCX1RZUEVfMTFBIHx8IHByaXYtPmJiX3R5cGUgPT0gQkJfVFlQRV8xMUIpCiAJCXJldHVybiAodTgpcHJpdi0+YmJfdHlwZTsKIAllbHNlIGlmICh2bnRfb2ZkbV9taW5fcmF0ZShwcml2KSkKQEAgLTUwNiw3ICs1MDQsNyBAQAogCXU2NCB0c2Zfb2Zmc2V0ID0gMDsKIAl1MTYgcnhfYmNuX29mZnNldDsKIAotCXJ4X2Jjbl9vZmZzZXQgPSBjd1JYQkNOVFNGT2ZmW3J4X3JhdGUgJSBNQVhfUkFURV07CisJcnhfYmNuX29mZnNldCA9IGN3X3J4YmNudHNmX29mZltyeF9yYXRlICUgTUFYX1JBVEVdOwogCiAJdHNmMiArPSAodTY0KXJ4X2Jjbl9vZmZzZXQ7CiAKQEAgLTUzMSw3ICs1MjksNyBAQAogICoKICAqLwogdm9pZCB2bnRfYWRqdXN0X3RzZihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYsIHU4IHJ4X3JhdGUsCi0JCXU2NCB0aW1lX3N0YW1wLCB1NjQgbG9jYWxfdHNmKQorCQkgICAgdTY0IHRpbWVfc3RhbXAsIHU2NCBsb2NhbF90c2YpCiB7CiAJdTY0IHRzZl9vZmZzZXQgPSAwOwogCXU4IGRhdGFbOF07CkBAIC01NDgsOCArNTQ2LDkgQEAKIAlkYXRhWzddID0gKHU4KSh0c2Zfb2Zmc2V0ID4+IDU2KTsKIAogCXZudF9jb250cm9sX291dChwcml2LCBNRVNTQUdFX1RZUEVfU0VUX1RTRlRCVFQsCi0JCU1FU1NBR0VfUkVRVUVTVF9UU0YsIDAsIDgsIGRhdGEpOworCQkJTUVTU0FHRV9SRVFVRVNUX1RTRiwgMCwgOCwgZGF0YSk7CiB9CisKIC8qCiAgKiBEZXNjcmlwdGlvbjogUmVhZCBOSUMgVFNGIGNvdW50ZXIKICAqICAgICAgICAgICAgICBHZXQgbG9jYWwgVFNGIGNvdW50ZXIKQEAgLTU2NSw3ICs1NjQsNiBAQAogICovCiBib29sIHZudF9nZXRfY3VycmVudF90c2Yoc3RydWN0IHZudF9wcml2YXRlICpwcml2LCB1NjQgKmN1cnJlbnRfdHNmKQogewotCiAJKmN1cnJlbnRfdHNmID0gcHJpdi0+Y3VycmVudF90c2Y7CiAKIAlyZXR1cm4gdHJ1ZTsKQEAgLTU4NCw3ICs1ODIsNiBAQAogICovCiBib29sIHZudF9jbGVhcl9jdXJyZW50X3RzZihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYpCiB7Ci0KIAl2bnRfbWFjX3JlZ19iaXRzX29uKHByaXYsIE1BQ19SRUdfVEZUQ1RMLCBURlRDVExfVFNGQ05UUlNUKTsKIAogCXByaXYtPmN1cnJlbnRfdHNmID0gMDsKQEAgLTY1Nyw3ICs2NTQsNyBAQAogCWRhdGFbN10gPSAodTgpKG5leHRfdGJ0dCA+PiA1Nik7CiAKIAl2bnRfY29udHJvbF9vdXQocHJpdiwgTUVTU0FHRV9UWVBFX1NFVF9UU0ZUQlRULAotCQlNRVNTQUdFX1JFUVVFU1RfVEJUVCwgMCwgOCwgZGF0YSk7CisJCQlNRVNTQUdFX1JFUVVFU1RfVEJUVCwgMCwgOCwgZGF0YSk7CiB9CiAKIC8qCkBAIC02NzYsNyArNjczLDcgQEAKICAqCiAgKi8KIHZvaWQgdm50X3VwZGF0ZV9uZXh0X3RidHQoc3RydWN0IHZudF9wcml2YXRlICpwcml2LCB1NjQgdHNmLAotCQkJdTE2IGJlYWNvbl9pbnRlcnZhbCkKKwkJCSAgdTE2IGJlYWNvbl9pbnRlcnZhbCkKIHsKIAl1OCBkYXRhWzhdOwogCkBAIC03MjEsNyArNzE4LDcgQEAKIAljYXNlIFJGX1ZUMzIyNkQwOgogCWNhc2UgUkZfVlQzMzQyQTA6CiAJCXZudF9tYWNfcmVnX2JpdHNfb2ZmKHByaXYsIE1BQ19SRUdfU09GVFBXUkNUTCwKLQkJCQkoU09GVFBXUkNUTF9TV1BFMiB8IFNPRlRQV1JDVExfU1dQRTMpKTsKKwkJCQkgICAgIChTT0ZUUFdSQ1RMX1NXUEUyIHwgU09GVFBXUkNUTF9TV1BFMykpOwogCQlicmVhazsKIAl9CiAKQEAgLTc2Miw3ICs3NTksNyBAQAogCWNhc2UgUkZfVlQzMjI2RDA6CiAJY2FzZSBSRl9WVDMzNDJBMDoKIAkJdm50X21hY19yZWdfYml0c19vbihwcml2LCBNQUNfUkVHX1NPRlRQV1JDVEwsCi0JCQkoU09GVFBXUkNUTF9TV1BFMiB8IFNPRlRQV1JDVExfU1dQRTMpKTsKKwkJCQkgICAgKFNPRlRQV1JDVExfU1dQRTIgfCBTT0ZUUFdSQ1RMX1NXUEUzKSk7CiAJCWJyZWFrOwogCX0KIApAQCAtNzk1LDcgKzc5Miw3IEBACiAJCQlwcml2LT5iYl92Z2FbMF0gPSAweDIwOwogCiAJCQl2bnRfY29udHJvbF9vdXRfdTgocHJpdiwgTUVTU0FHRV9SRVFVRVNUX0JCUkVHLAotCQkJCQkJMHhlNywgcHJpdi0+YmJfdmdhWzBdKTsKKwkJCQkJICAgMHhlNywgcHJpdi0+YmJfdmdhWzBdKTsKIAkJfQogCiAJCXByaXYtPmJiX3ZnYVsyXSA9IDB4MTA7CkBAIC04MDUsNyArODAyLDcgQEAKIAkJCXByaXYtPmJiX3ZnYVswXSA9IDB4MWM7CiAKIAkJCXZudF9jb250cm9sX291dF91OChwcml2LCBNRVNTQUdFX1JFUVVFU1RfQkJSRUcsCi0JCQkJCQkweGU3LCBwcml2LT5iYl92Z2FbMF0pOworCQkJCQkgICAweGU3LCBwcml2LT5iYl92Z2FbMF0pOwogCQl9CiAKIAkJcHJpdi0+YmJfdmdhWzJdID0gMHgwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kcGMuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZHBjLmMKaW5kZXggNjAxOWFhYy4uNjU1ZjAwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kcGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RwYy5jCkBAIC0zNCw3ICszNCw3IEBACiAjaW5jbHVkZSAicmYuaCIKIAogaW50IHZudF9yeF9kYXRhKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiwgc3RydWN0IHZudF9yY2IgKnB0cl9yY2IsCi0JdW5zaWduZWQgbG9uZyBieXRlc19yZWNlaXZlZCkKKwkJdW5zaWduZWQgbG9uZyBieXRlc19yZWNlaXZlZCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHByaXYtPmh3OwogCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOwpAQCAtNDYsNyArNDYsNyBAQAogCV9fbGU2NCAqdHNmX3RpbWU7CiAJdTMyIGZyYW1lX3NpemU7CiAJaW50IGlpLCByOwotCXU4ICpyeF9zdHMsICpyeF9yYXRlLCAqc3EsICpzcV8zOworCXU4ICpyeF9yYXRlLCAqc3EsICpzcV8zOwogCXUzMiB3Ymtfc3RhdHVzOwogCXU4ICpza2JfZGF0YTsKIAl1MTYgKnBheV9sb2FkX2xlbjsKQEAgLTc1LDIyICs3NSwyMSBAQAogCiAJc2tiX2RhdGEgPSAodTggKilza2ItPmRhdGE7CiAKLQlyeF9zdHMgPSBza2JfZGF0YSs0OwotCXJ4X3JhdGUgPSBza2JfZGF0YSs1OworCXJ4X3JhdGUgPSBza2JfZGF0YSArIDU7CiAKIAkvKiByZWFsIEZyYW1lIFNpemUgPSBVU0JmcmFtZV9zaXplIC00V2JrU3RhdHVzIC0gNFJ4U3RhdHVzICovCiAJLyogLThUU0YgLSA0UlNSIC0gNFNRMyAtID9QYWRkaW5nICovCiAKIAkvKiBpZiBTUTMgdGhlIHJhbmdlIGlzIDI0fjI3LCBpZiBubyBTUTMgdGhlIHJhbmdlIGlzIDIwfjIzICovCiAKLQlwYXlfbG9hZF9sZW4gPSAodTE2ICopIChza2JfZGF0YSArIDYpOworCXBheV9sb2FkX2xlbiA9ICh1MTYgKikoc2tiX2RhdGEgKyA2KTsKIAogCS8qRml4IGhhcmR3YXJlIGJ1ZyA9PiBQTENQX0xlbmd0aCBlcnJvciAqLwogCWlmICgoKGJ5dGVzX3JlY2VpdmVkIC0gKCpwYXlfbG9hZF9sZW4pKSA+IDI3KSB8fAotCQkoKGJ5dGVzX3JlY2VpdmVkIC0gKCpwYXlfbG9hZF9sZW4pKSA8IDI0KSB8fAotCQkJKGJ5dGVzX3JlY2VpdmVkIDwgKCpwYXlfbG9hZF9sZW4pKSkgeworCSAgICAoKGJ5dGVzX3JlY2VpdmVkIC0gKCpwYXlfbG9hZF9sZW4pKSA8IDI0KSB8fAorCSAgICAoYnl0ZXNfcmVjZWl2ZWQgPCAoKnBheV9sb2FkX2xlbikpKSB7CiAJCWRldl9kYmcoJnByaXYtPnVzYi0+ZGV2LCAiV3JvbmcgUExDUCBMZW5ndGggJXhcbiIsCi0JCQkJCQkJKnBheV9sb2FkX2xlbik7CisJCQkqcGF5X2xvYWRfbGVuKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kcGMuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZHBjLmgKaW5kZXggNWE5MmJkOC4uZmYxODUwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kcGMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RwYy5oCkBAIC0yOSw2ICsyOSw2IEBACiAjaW5jbHVkZSAiZGV2aWNlLmgiCiAKIGludCB2bnRfcnhfZGF0YShzdHJ1Y3Qgdm50X3ByaXZhdGUgKiwgc3RydWN0IHZudF9yY2IgKiwKLQl1bnNpZ25lZCBsb25nIGJ5dGVzX3JlY2VpdmVkKTsKKwkJdW5zaWduZWQgbG9uZyBieXRlc19yZWNlaXZlZCk7CiAKICNlbmRpZiAvKiBfX1JYVFhfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21haW5fdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21haW5fdXNiLmMKaW5kZXggYWM0ZmVjYi4uMDU5NDgyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9tYWluX3VzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFpbl91c2IuYwpAQCAtNDQwLDEwICs0NDAsOCBAQAogCiAJCS8qIGFsbG9jYXRlIFVSQnMgKi8KIAkJdHhfY29udGV4dC0+dXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCF0eF9jb250ZXh0LT51cmIpIHsKLQkJCWRldl9lcnIoJnByaXYtPnVzYi0+ZGV2LCAiYWxsb2MgdHggdXJiIGZhaWxlZFxuIik7CisJCWlmICghdHhfY29udGV4dC0+dXJiKQogCQkJZ290byBmcmVlX3R4OwotCQl9CiAKIAkJdHhfY29udGV4dC0+aW5fdXNlID0gZmFsc2U7CiAJfQpAQCAtNDYyLDEwICs0NjAsOCBAQAogCiAJCS8qIGFsbG9jYXRlIFVSQnMgKi8KIAkJcmNiLT51cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCQlpZiAoIXJjYi0+dXJiKSB7Ci0JCQlkZXZfZXJyKCZwcml2LT51c2ItPmRldiwgIkZhaWxlZCB0byBhbGxvYyByeCB1cmJcbiIpOworCQlpZiAoIXJjYi0+dXJiKQogCQkJZ290byBmcmVlX3J4X3R4OwotCQl9CiAKIAkJcmNiLT5za2IgPSBkZXZfYWxsb2Nfc2tiKHByaXYtPnJ4X2J1Zl9zeik7CiAJCWlmICghcmNiLT5za2IpCkBAIC00NzksMTAgKzQ3NSw4IEBACiAJfQogCiAJcHJpdi0+aW50ZXJydXB0X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcml2LT5pbnRlcnJ1cHRfdXJiKSB7Ci0JCWRldl9lcnIoJnByaXYtPnVzYi0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jIGludCB1cmJcbiIpOworCWlmICghcHJpdi0+aW50ZXJydXB0X3VyYikKIAkJZ290byBmcmVlX3J4X3R4OwotCX0KIAogCXByaXYtPmludF9idWYuZGF0YV9idWYgPSBrbWFsbG9jKE1BWF9JTlRFUlJVUFRfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwcml2LT5pbnRfYnVmLmRhdGFfYnVmKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3VzYnBpcGUuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvdXNicGlwZS5jCmluZGV4IGY1NDY1NTMuLmU5YjZiMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvdXNicGlwZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvdXNicGlwZS5jCkBAIC0yOCw4ICsyOCw5IEBACiAgKgl2bnRfY29udHJvbF9pbl91OCAtIFJlYWQgb25lIGJ5dGUgZnJvbSBNRU0vQkIvTUFDL0VFUFJPTQogICoKICAqIFJldmlzaW9uIEhpc3Rvcnk6Ci0gKiAgICAgIDA0LTA1LTIwMDQgSmVycnkgQ2hlbjogIEluaXRpYWwgcmVsZWFzZQotICogICAgICAxMS0yNC0yMDA0IFdhcnJlbiBIc3U6IEFkZCBDb250cm9sdldyaXRlQnl0ZSxDb250cm9sdlJlYWRCeXRlLENvbnRyb2x2TWFza0J5dGUKKyAqICAgICAgMDQtMDUtMjAwNCBKZXJyeSBDaGVuOiBJbml0aWFsIHJlbGVhc2UKKyAqICAgICAgMTEtMjQtMjAwNCBXYXJyZW4gSHN1OiBBZGQgQ29udHJvbHZXcml0ZUJ5dGUsQ29udHJvbHZSZWFkQnl0ZSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sdk1hc2tCeXRlCiAgKgogICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL1RPRE8KaW5kZXggZWM5M2IyZS4uYWU2MWI1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL1RPRE8KKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL1RPRE8KQEAgLTMsNyArMyw2IEBACiAtIHJlbW92ZSBPUyB3cmFwcGVyIGZ1bmN0aW9ucwogLSByZW1vdmUgY3VzdG9tIGRlYnVnIGFuZCB0cmFjaW5nIGZ1bmN0aW9ucwogLSByZXdvcmsgY29tbWVudHMgYW5kIGZ1bmN0aW9uIGhlYWRlcnMoYWxzbyBjb2Rpbmcgc3R5bGUpCi0tIHJlcGxhY2UgYWxsIHNlbWFwaG9yZXMgd2l0aCBtdXRleGVzIG9yIGNvbXBsZXRpb25zCiAtIE1vdmUgaGFuZGxpbmcgZm9yIGVhY2ggaW5kaXZpZHVhbCBtZW1iZXJzIG9mICd1bmlvbiBtZXNzYWdlX2JvZHknIG91dAogICBpbnRvIGEgc2VwYXJhdGUgJ3N0cnVjdCB3b3JrX3N0cnVjdCcgYW5kIGNvbXBsZXRlbHkgcmVtb3ZlIHRoZSBtdWx0aXBsZXhlcgogICB0aGF0IGlzIGN1cnJlbnRseSBwYXJ0IG9mIGhvc3RfaWZfd29yaygpLCBhbGxvd2luZyBtb3ZlbWVudCBvZiB0aGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC9jb3JlY29uZmlndXJhdG9yLmggYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvY29yZWNvbmZpZ3VyYXRvci5oCmluZGV4IDA3NmUwNmEuLmNmZjE2OTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC9jb3JlY29uZmlndXJhdG9yLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL2NvcmVjb25maWd1cmF0b3IuaApAQCAtNzAsMTEgKzcwLDExIEBACiAJQ09OTkVDVF9TVFNfRk9SQ0VfMTZfQklUID0gMHhGRkZGCiB9OwogCi10eXBlZGVmIHN0cnVjdCB7CitzdHJ1Y3QgdHN0clJTU0kgewogCXU4IHU4RnVsbDsKIAl1OCB1OEluZGV4OwogCXM4IGFzOFJTU0lbTlVNX1JTU0ldOwotfSB0c3RyUlNTSTsKK307CiAKIHN0cnVjdCBuZXR3b3JrX2luZm8gewogCXM4IHJzc2k7CkBAIC05Myw3ICs5Myw3IEBACiAJdTggKmllczsKIAl1MTYgaWVzX2xlbjsKIAl2b2lkICpqb2luX3BhcmFtczsKLQl0c3RyUlNTSSBzdHJfcnNzaTsKKwlzdHJ1Y3QgdHN0clJTU0kgc3RyX3Jzc2k7CiAJdTY0IHRzZl9oaTsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC9ob3N0X2ludGVyZmFjZS5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL2hvc3RfaW50ZXJmYWNlLmMKaW5kZXggMGIxNzYwYy4uNzhmNTYxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL2hvc3RfaW50ZXJmYWNlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL2hvc3RfaW50ZXJmYWNlLmMKQEAgLTMyNzksNyArMzI3OSw2IEBACiBpbnQgd2lsY19oaWZfc2V0X2NmZyhzdHJ1Y3Qgd2lsY192aWYgKnZpZiwKIAkJICAgICBzdHJ1Y3QgY2ZnX3BhcmFtX2F0dHIgKmNmZ19wYXJhbSkKIHsKLQlpbnQgcmVzdWx0ID0gMDsKIAlzdHJ1Y3QgaG9zdF9pZl9tc2cgbXNnOwogCXN0cnVjdCBob3N0X2lmX2RydiAqaGlmX2RydiA9IHZpZi0+aGlmX2RydjsKIApAQCAtMzI5Myw5ICszMjkyLDcgQEAKIAltc2cuYm9keS5jZmdfaW5mbyA9ICpjZmdfcGFyYW07CiAJbXNnLnZpZiA9IHZpZjsKIAotCXJlc3VsdCA9IHdpbGNfZW5xdWV1ZV9jbWQoJm1zZyk7Ci0KLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiB3aWxjX2VucXVldWVfY21kKCZtc2cpOwogfQogCiBzdGF0aWMgdm9pZCBHZXRQZXJpb2RpY1JTU0kodW5zaWduZWQgbG9uZyBhcmcpCkBAIC0zMzI5LDcgKzMzMjYsNyBAQAogCiAJaW5pdF9jb21wbGV0aW9uKCZoaWZfd2FpdF9yZXNwb25zZSk7CiAKLQloaWZfZHJ2ICA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBob3N0X2lmX2RydiksIEdGUF9LRVJORUwpOworCWhpZl9kcnYgID0ga3phbGxvYyhzaXplb2YoKmhpZl9kcnYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWhpZl9kcnYpIHsKIAkJcmVzdWx0ID0gLUVOT01FTTsKIAkJZ290byBfZmFpbF87CkBAIC0zMzYzLDcgKzMzNjAsNyBAQAogCQlpZiAoIWhpZl93b3JrcXVldWUpIHsKIAkJCW5ldGRldl9lcnIodmlmLT5uZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSB3b3JrcXVldWVcbiIpOwogCQkJcmVzdWx0ID0gLUVOT01FTTsKLQkJCWdvdG8gX2ZhaWxfbXFfOworCQkJZ290byBfZmFpbF87CiAJCX0KIAogCQlzZXR1cF90aW1lcigmcGVyaW9kaWNfcnNzaSwgR2V0UGVyaW9kaWNSU1NJLApAQCAtMzM5MSw3ICszMzg4LDYgQEAKIAogCWNsaWVudHNfY291bnQrKzsKIAotX2ZhaWxfbXFfOgogCWRlc3Ryb3lfd29ya3F1ZXVlKGhpZl93b3JrcXVldWUpOwogX2ZhaWxfOgogCXJldHVybiByZXN1bHQ7CkBAIC0zODc5LDcgKzM4NzUsNyBAQAogCXB1OElFcyA9IHB0c3RyTmV0d29ya0luZm8tPmllczsKIAl1MTZJRXNMZW4gPSBwdHN0ck5ldHdvcmtJbmZvLT5pZXNfbGVuOwogCi0JcE5ld0pvaW5Cc3NQYXJhbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBqb2luX2Jzc19wYXJhbSksIEdGUF9LRVJORUwpOworCXBOZXdKb2luQnNzUGFyYW0gPSBremFsbG9jKHNpemVvZigqcE5ld0pvaW5Cc3NQYXJhbSksIEdGUF9LRVJORUwpOwogCWlmIChwTmV3Sm9pbkJzc1BhcmFtKSB7CiAJCXBOZXdKb2luQnNzUGFyYW0tPmR0aW1fcGVyaW9kID0gcHRzdHJOZXR3b3JrSW5mby0+ZHRpbV9wZXJpb2Q7CiAJCXBOZXdKb2luQnNzUGFyYW0tPmJlYWNvbl9wZXJpb2QgPSBwdHN0ck5ldHdvcmtJbmZvLT5iZWFjb25fcGVyaW9kOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL2xpbnV4X3dsYW4uYyBiL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC9saW51eF93bGFuLmMKaW5kZXggM2E2NjI1NS4uNjM3MGE1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL2xpbnV4X3dsYW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvbGludXhfd2xhbi5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAKIHN0YXRpYyBpbnQgZGV2X3N0YXRlX2V2X2hhbmRsZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLApAQCAtNjQ4LDcgKzY0Nyw3IEBACiAJCQltdXRleF91bmxvY2soJndsLT5oaWZfY3MpOwogCQl9CiAJCWlmICgmd2wtPnR4cV9ldmVudCkKLQkJCXdhaXRfZm9yX2NvbXBsZXRpb24oJndsLT50eHFfZXZlbnQpOworCQkJY29tcGxldGUoJndsLT50eHFfZXZlbnQpOwogCiAJCXdsYW5fZGVpbml0aWFsaXplX3RocmVhZHMoZGV2KTsKIAkJZGVpbml0X2lycShkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL3dpbGNfZGVidWdmcy5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL3dpbGNfZGVidWdmcy5jCmluZGV4IGZjYmM5NWQuLjgwMmJiMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC93aWxjX2RlYnVnZnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY19kZWJ1Z2ZzLmMKQEAgLTI5LDcgKzI5LDcgQEAKICNkZWZpbmUgRVJSICAgICAgICAgICAgIEJJVCgzKQogCiAjZGVmaW5lIERCR19MRVZFTF9BTEwJKERFQlVHIHwgSU5GTyB8IFdSTiB8IEVSUikKLWF0b21pY190IFdJTENfREVCVUdfTEVWRUwgPSBBVE9NSUNfSU5JVChFUlIpOworc3RhdGljIGF0b21pY190IFdJTENfREVCVUdfTEVWRUwgPSBBVE9NSUNfSU5JVChFUlIpOwogRVhQT1JUX1NZTUJPTF9HUEwoV0lMQ19ERUJVR19MRVZFTCk7CiAKIC8qCkBAIC0xMDIsMzUgKzEwMiwxNiBAQAogc3RhdGljIGludCBfX2luaXQgd2lsY19kZWJ1Z2ZzX2luaXQodm9pZCkKIHsKIAlpbnQgaTsKLQotCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfZmlsZXM7CiAJc3RydWN0IHdpbGNfZGVidWdmc19pbmZvX3QgKmluZm87CiAKIAl3aWxjX2RpciA9IGRlYnVnZnNfY3JlYXRlX2Rpcigid2lsY193aWZpIiwgTlVMTCk7Ci0JaWYgKHdpbGNfZGlyID09ICBFUlJfUFRSKC1FTk9ERVYpKSB7Ci0JCS8qIGl0J3Mgbm90IGVycm9yLiB0aGUgZGVidWdmcyBpcyBqdXN0IG5vdCBiZWluZyBlbmFibGVkLiAqLwotCQlwcmludGsoIkVSUiwga2VybmVsIGhhcyBidWlsdCB3aXRob3V0IGRlYnVnZnMgc3VwcG9ydFxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICghd2lsY19kaXIpIHsKLQkJcHJpbnRrKCJFUlIsIGRlYnVnZnMgY3JlYXRlIGRpclxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZWJ1Z2ZzX2luZm8pOyBpKyspIHsKIAkJaW5mbyA9ICZkZWJ1Z2ZzX2luZm9baV07Ci0JCWRlYnVnZnNfZmlsZXMgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGluZm8tPm5hbWUsCi0JCQkJCQkgICAgaW5mby0+cGVybSwKLQkJCQkJCSAgICB3aWxjX2RpciwKLQkJCQkJCSAgICAmaW5mby0+ZGF0YSwKLQkJCQkJCSAgICAmaW5mby0+Zm9wcyk7Ci0KLQkJaWYgKCFkZWJ1Z2ZzX2ZpbGVzKSB7Ci0JCQlwcmludGsoIkVSUiBmYWlsIHRvIGNyZWF0ZSB0aGUgZGVidWdmcyBmaWxlLCAlc1xuIiwgaW5mby0+bmFtZSk7Ci0JCQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUod2lsY19kaXIpOwotCQkJcmV0dXJuIC0xOwotCQl9CisJCWRlYnVnZnNfY3JlYXRlX2ZpbGUoaW5mby0+bmFtZSwKKwkJCQkgICAgaW5mby0+cGVybSwKKwkJCQkgICAgd2lsY19kaXIsCisJCQkJICAgICZpbmZvLT5kYXRhLAorCQkJCSAgICAmaW5mby0+Zm9wcyk7CiAJfQogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL3dpbGNfc3BpLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY19zcGkuYwppbmRleCAyMmNmNGI3Li5mMDhjZjZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY19zcGkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY19zcGkuYwpAQCAtNDEwLDggKzQxMCw3IEBACiAJaWYgKGxlbjIgPiBBUlJBWV9TSVpFKHdiKSkgewogCQlkZXZfZXJyKCZzcGktPmRldiwgInNwaSBidWZmZXIgc2l6ZSB0b28gc21hbGwgKCVkKSAoJXp1KVxuIiwKIAkJCSBsZW4yLCBBUlJBWV9TSVpFKHdiKSk7Ci0JCXJlc3VsdCA9IE5fRkFJTDsKLQkJcmV0dXJuIHJlc3VsdDsKKwkJcmV0dXJuIE5fRkFJTDsKIAl9CiAJLyogemVybyBzcGkgd3JpdGUgYnVmZmVycy4gKi8KIAlmb3IgKHdpeCA9IGxlbjsgd2l4IDwgbGVuMjsgd2l4KyspCkBAIC00MjAsOCArNDE5LDcgQEAKIAogCWlmICh3aWxjX3NwaV90eF9yeCh3aWxjLCB3YiwgcmIsIGxlbjIpKSB7CiAJCWRldl9lcnIoJnNwaS0+ZGV2LCAiRmFpbGVkIGNtZCB3cml0ZSwgYnVzIGVycm9yLi4uXG4iKTsKLQkJcmVzdWx0ID0gTl9GQUlMOwotCQlyZXR1cm4gcmVzdWx0OworCQlyZXR1cm4gTl9GQUlMOwogCX0KIAogCS8qKgpAQCAtNDQyLDggKzQ0MCw3IEBACiAJCWRldl9lcnIoJnNwaS0+ZGV2LAogCQkJIkZhaWxlZCBjbWQgcmVzcG9uc2UsIGNtZCAoJTAyeCksIHJlc3AgKCUwMngpXG4iLAogCQkJY21kLCByc3ApOwotCQlyZXN1bHQgPSBOX0ZBSUw7Ci0JCXJldHVybiByZXN1bHQ7CisJCXJldHVybiBOX0ZBSUw7CiAJfQogCiAJLyoqCkBAIC00NTMsOCArNDUwLDcgQEAKIAlpZiAocnNwICE9IDB4MDApIHsKIAkJZGV2X2Vycigmc3BpLT5kZXYsICJGYWlsZWQgY21kIHN0YXRlIHJlc3BvbnNlIHN0YXRlICglMDJ4KVxuIiwKIAkJCXJzcCk7Ci0JCXJlc3VsdCA9IE5fRkFJTDsKLQkJcmV0dXJuIHJlc3VsdDsKKwkJcmV0dXJuIE5fRkFJTDsKIAl9CiAKIAlpZiAoKGNtZCA9PSBDTURfSU5URVJOQUxfUkVBRCkgfHwgKGNtZCA9PSBDTURfU0lOR0xFX1JFQUQpCkBAIC00ODEsOCArNDc3LDcgQEAKIAkJaWYgKHJldHJ5IDw9IDApIHsKIAkJCWRldl9lcnIoJnNwaS0+ZGV2LAogCQkJCSJFcnJvciwgZGF0YSByZWFkIHJlc3BvbnNlICglMDJ4KVxuIiwgcnNwKTsKLQkJCXJlc3VsdCA9IE5fUkVTRVQ7Ci0JCQlyZXR1cm4gcmVzdWx0OworCQkJcmV0dXJuIE5fUkVTRVQ7CiAJCX0KIAogCQlpZiAoKGNtZCA9PSBDTURfSU5URVJOQUxfUkVBRCkgfHwgKGNtZCA9PSBDTURfU0lOR0xFX1JFQUQpKSB7CkBAIC00OTcsOCArNDkyLDcgQEAKIAkJCX0gZWxzZSB7CiAJCQkJZGV2X2Vycigmc3BpLT5kZXYsCiAJCQkJCSJidWZmZXIgb3ZlcnJ1biB3aGVuIHJlYWRpbmcgZGF0YS5cbiIpOwotCQkJCXJlc3VsdCA9IE5fRkFJTDsKLQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCXJldHVybiBOX0ZBSUw7CiAJCQl9CiAKIAkJCWlmICghZ19zcGkuY3JjX29mZikgewpAQCAtNTEwLDggKzUwNCw3IEBACiAJCQkJCWNyY1sxXSA9IHJiW3JpeCsrXTsKIAkJCQl9IGVsc2UgewogCQkJCQlkZXZfZXJyKCZzcGktPmRldiwgImJ1ZmZlciBvdmVycnVuIHdoZW4gcmVhZGluZyBjcmMuXG4iKTsKLQkJCQkJcmVzdWx0ID0gTl9GQUlMOwotCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJCQlyZXR1cm4gTl9GQUlMOwogCQkJCX0KIAkJCX0KIAkJfSBlbHNlIGlmICgoY21kID09IENNRF9ETUFfUkVBRCkgfHwgKGNtZCA9PSBDTURfRE1BX0VYVF9SRUFEKSkgewpAQCAtNTUxLDcgKzU0NCw2IEBACiAJCQkJCX0KIAkJCQl9CiAKLQogCQkJCWl4ICs9IG5ieXRlczsKIAkJCQlzeiAtPSBuYnl0ZXM7CiAJCQl9CkBAIC01ODcsNyArNTc5LDYgQEAKIAkJCQlpZiAocmVzdWx0ID09IE5fRkFJTCkKIAkJCQkJYnJlYWs7CiAKLQogCQkJCS8qKgogCQkJCSAqIFJlYWQgYnl0ZXMKIAkJCQkgKiovCkBAIC02ODcsNyArNjc4LDYgQEAKIAkJc3ogLT0gbmJ5dGVzOwogCX0gd2hpbGUgKHN6KTsKIAotCiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtODUwLDcgKzg0MCw2IEBACiAJc3RhdGljIGludCBpc2luaXQ7CiAKIAlpZiAoaXNpbml0KSB7Ci0KIAkJaWYgKCF3aWxjX3NwaV9yZWFkX3JlZyh3aWxjLCAweDEwMDAsICZjaGlwaWQpKSB7CiAJCQlkZXZfZXJyKCZzcGktPmRldiwgIkZhaWwgY21kIHJlYWQgY2hpcCBpZC4uLlxuIik7CiAJCQlyZXR1cm4gMDsKQEAgLTg3MSw3ICs4NjAsNyBAQAogCQkvKiBSZWFkIGZhaWxlZC4gVHJ5IHdpdGggQ1JDIG9mZi4gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiBtb2R1bGUKIAkJICogaXMgcmVtb3ZlZCBidXQgY2hpcCBpc24ndCByZXNldCovCiAJCWdfc3BpLmNyY19vZmYgPSAxOwotCQlkZXZfZXJyKCZzcGktPmRldiwgIkZhaWxlZCBpbnRlcm5hbCByZWFkIHByb3RvY29sIHdpdGggQ1JDIG9uLCByZXR5cmluZyB3aXRoIENSQyBvZmYuLi5cbiIpOworCQlkZXZfZXJyKCZzcGktPmRldiwgIkZhaWxlZCBpbnRlcm5hbCByZWFkIHByb3RvY29sIHdpdGggQ1JDIG9uLCByZXRyeWluZyB3aXRoIENSQyBvZmYuLi5cbiIpOwogCQlpZiAoIXNwaV9pbnRlcm5hbF9yZWFkKHdpbGMsIFdJTENfU1BJX1BST1RPQ09MX09GRlNFVCwgJnJlZykpIHsKIAkJCS8qIFJlYWFkIGZhaWxlZCB3aXRoIGJvdGggQ1JDIG9uIGFuZCBvZmYsIHNvbWV0aGluZyB3ZW50IGJhZCAqLwogCQkJZGV2X2Vycigmc3BpLT5kZXYsCkBAIC04OTAsNyArODc5LDYgQEAKIAkJZ19zcGkuY3JjX29mZiA9IDE7CiAJfQogCi0KIAkvKioKIAkgKiAgICAgIG1ha2Ugc3VyZSBjYW4gcmVhZCBiYWNrIGNoaXAgaWQgY29ycmVjdGx5CiAJICoqLwpAQCAtOTMxLDE0ICs5MTksMTAgQEAKIAkJKnNpemUgPSB0bXA7CiAJfQogCi0KLQogX2ZhaWxfOgogCXJldHVybiByZXQ7CiB9CiAKLQotCiBzdGF0aWMgaW50IHdpbGNfc3BpX3JlYWRfaW50KHN0cnVjdCB3aWxjICp3aWxjLCB1MzIgKmludF9zdGF0dXMpCiB7CiAJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2Uod2lsYy0+ZGV2KTsKQEAgLTk5Myw3ICs5NzcsNiBAQAogCQl9CiAKIAkJKmludF9zdGF0dXMgPSB0bXA7Ci0KIAl9CiAKIF9mYWlsXzoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC93aWxjX3dmaV9jZmdvcGVyYXRpb25zLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY193ZmlfY2Znb3BlcmF0aW9ucy5jCmluZGV4IDkwOTI2MDAuLjYwZDhiMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC93aWxjX3dmaV9jZmdvcGVyYXRpb25zLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL3dpbGNfd2ZpX2NmZ29wZXJhdGlvbnMuYwpAQCAtMTE5MSw3ICsxMTkxLDcgQEAKIAlzdHJ1Y3Qgd2lsY19wcml2ICpwcml2OwogCXN0cnVjdCB3aWxjX3ZpZiAqdmlmOwogCXUzMiBpID0gMDsKLQl1MzIgYXNzb2NpYXRlZHN0YSA9IDA7CisJdTMyIGFzc29jaWF0ZWRzdGEgPSB+MDsKIAl1MzIgaW5hY3RpdmVfdGltZSA9IDA7CiAJcHJpdiA9IHdpcGh5X3ByaXYod2lwaHkpOwogCXZpZiA9IG5ldGRldl9wcml2KGRldik7CkBAIC0xMjA0LDcgKzEyMDQsNyBAQAogCQkJfQogCQl9CiAKLQkJaWYgKGFzc29jaWF0ZWRzdGEgPT0gLTEpIHsKKwkJaWYgKGFzc29jaWF0ZWRzdGEgPT0gfjApIHsKIAkJCW5ldGRldl9lcnIoZGV2LCAic3RhIHJlcXVpcmVkIGlzIG5vdCBhc3NvY2lhdGVkXG4iKTsKIAkJCXJldHVybiAtRU5PRU5UOwogCQl9CkBAIC0yMjAwLDcgKzIyMDAsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY2ZnODAyMTFfb3BzIHdpbGNfY2ZnODAyMTFfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9vcHMgd2lsY19jZmc4MDIxMV9vcHMgPSB7CiAJLnNldF9tb25pdG9yX2NoYW5uZWwgPSBzZXRfY2hhbm5lbCwKIAkuc2NhbiA9IHNjYW4sCiAJLmNvbm5lY3QgPSBjb25uZWN0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL3dpbGNfd2ZpX25ldGRldmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL3dpbGNfd2ZpX25ldGRldmljZS5oCmluZGV4IDVjYzZhODIuLmVjNmIxNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC93aWxjX3dmaV9uZXRkZXZpY2UuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY193ZmlfbmV0ZGV2aWNlLmgKQEAgLTEzMSw3ICsxMzEsNyBAQAogCXN0cnVjdCB3aWxjX3dmaV9rZXkgKndpbGNfZ3RrW01BWF9OVU1fU1RBXTsKIAlzdHJ1Y3Qgd2lsY193Zmlfa2V5ICp3aWxjX3B0a1tNQVhfTlVNX1NUQV07CiAJdTggd2lsY19ncm91cGtleTsKLQkvKiBzZW1hcGhvcmVzICovCisJLyogbXV0ZXhlcyAqLwogCXN0cnVjdCBtdXRleCBzY2FuX3JlcV9sb2NrOwogCS8qICAqLwogCWJvb2wgZ2JBdXRvUmF0ZUFkanVzdGVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL3dpbGNfd2xhbi5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL3dpbGNfd2xhbi5jCmluZGV4IDE5YTU4MDkuLmJjNWFkMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC93aWxjX3dsYW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY193bGFuLmMKQEAgLTYyMSw5ICs2MjEsOSBAQAogCQkJaWYgKCFyZXQpCiAJCQkJYnJlYWs7CiAKLQkJCWlmICgocmVnICYgMHgxKSA9PSAwKSB7CisJCQlpZiAoKHJlZyAmIDB4MSkgPT0gMCkKIAkJCQlicmVhazsKLQkJCX0KKwogCQkJY291bnRlcisrOwogCQkJaWYgKGNvdW50ZXIgPiAyMDApIHsKIAkJCQljb3VudGVyID0gMDsKQEAgLTEwMDEsOCArMTAwMSw3IEBACiAJcmV0ID0gd2lsYy0+aGlmX2Z1bmMtPmhpZl93cml0ZV9yZWcod2lsYywgV0lMQ19WTU1fQ09SRV9DRkcsIHJlZyk7CiAJaWYgKCFyZXQpIHsKIAkJcmVsZWFzZV9idXMod2lsYywgUkVMRUFTRV9PTkxZKTsKLQkJcmV0ID0gLUVJTzsKLQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIC1FSU87CiAJfQogCXJlZyA9IDA7CiAJaWYgKHdpbGMtPmlvX3R5cGUgPT0gSElGX1NESU8gJiYgd2lsYy0+ZGV2X2lycV9udW0pCkBAIC0xMDM0LDggKzEwMzMsNyBAQAogCXJldCA9IHdpbGMtPmhpZl9mdW5jLT5oaWZfd3JpdGVfcmVnKHdpbGMsIFdJTENfR1BfUkVHXzEsIHJlZyk7CiAJaWYgKCFyZXQpIHsKIAkJcmVsZWFzZV9idXMod2lsYywgUkVMRUFTRV9PTkxZKTsKLQkJcmV0ID0gLUVJTzsKLQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIC1FSU87CiAJfQogCiAJd2lsYy0+aGlmX2Z1bmMtPmhpZl9zeW5jX2V4dCh3aWxjLCBOVU1fSU5UX0VYVCk7CkBAIC0xMDQzLDggKzEwNDEsNyBAQAogCXJldCA9IHdpbGMtPmhpZl9mdW5jLT5oaWZfcmVhZF9yZWcod2lsYywgMHgxMDAwLCAmY2hpcGlkKTsKIAlpZiAoIXJldCkgewogCQlyZWxlYXNlX2J1cyh3aWxjLCBSRUxFQVNFX09OTFkpOwotCQlyZXQgPSAtRUlPOwotCQlyZXR1cm4gcmV0OworCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAl3aWxjLT5oaWZfZnVuYy0+aGlmX3JlYWRfcmVnKHdpbGMsIFdJTENfR0xCX1JFU0VUXzAsICZyZWcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL3dpbGNfd2xhbi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL3dpbGNfd2xhbi5oCmluZGV4IDMwZTUzMTIuLmRlNmM0ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC93aWxjX3dsYW4uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY193bGFuLmgKQEAgLTE5Miw3ICsxOTIsNyBAQAogCiAjZGVmaW5lIEVOQUJMRV9SWF9WTU0JCShTRUxfVk1NX1RCTDEgfCBFTl9WTU0pCiAjZGVmaW5lIEVOQUJMRV9UWF9WTU0JCShTRUxfVk1NX1RCTDAgfCBFTl9WTU0pCi0vKnRpbWUgZm9yIGV4cGlyaW5nIHRoZSBzZW1hcGhvcmVzIG9mIGNmZyBwYWNrZXRzKi8KKy8qdGltZSBmb3IgZXhwaXJpbmcgdGhlIGNvbXBsZXRpb24gb2YgY2ZnIHBhY2tldHMqLwogI2RlZmluZSBDRkdfUEtUU19USU1FT1VUCTIwMDAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC93aWxjX3dsYW5faWYuaCBiL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC93aWxjX3dsYW5faWYuaAppbmRleCA0MTBiZmMwLi40MzlhYzZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY193bGFuX2lmLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL3dpbGNfd2xhbl9pZi5oCkBAIC0xMCw3ICsxMCw2IEBACiAjaWZuZGVmIFdJTENfV0xBTl9JRl9ICiAjZGVmaW5lIFdJTENfV0xBTl9JRl9ICiAKLSNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9jZmc4MDIxMS5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvY2ZnODAyMTEuYwppbmRleCBmNDZkZmU2Li4xODJiMmQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9jZmc4MDIxMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2NmZzgwMjExLmMKQEAgLTM1LDcgKzM1LDcgQEAKIAogLyogcHJpc20yIGRldmljZSBwcml2YXRlIGRhdGEgKi8KIHN0cnVjdCBwcmlzbTJfd2lwaHlfcHJpdmF0ZSB7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2OworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2OwogCiAJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCBiYW5kOwogCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCBjaGFubmVsc1tBUlJBWV9TSVpFKHByaXNtMl9jaGFubmVscyldOwpAQCAtNjksMTEgKzY5LDExIEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBwcmlzbTJfZG9taWJzZXRfdWludDMyKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTMyIGRpZCwgdTMyIGRhdGEpCitzdGF0aWMgaW50IHByaXNtMl9kb21pYnNldF91aW50MzIoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHUzMiBkaWQsIHUzMiBkYXRhKQogewogCXN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0IG1zZzsKLQlwODAyMTFpdGVtX3VpbnQzMl90ICptaWJpdGVtID0KLQkJCShwODAyMTFpdGVtX3VpbnQzMl90ICopJm1zZy5taWJhdHRyaWJ1dGUuZGF0YTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgKm1pYml0ZW0gPQorCQkJKHN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiAqKSZtc2cubWliYXR0cmlidXRlLmRhdGE7CiAKIAltc2cubXNnY29kZSA9IERJRG1zZ19kb3QxMXJlcV9taWJzZXQ7CiAJbWliaXRlbS0+ZGlkID0gZGlkOwpAQCAtODIsMTIgKzgyLDEyIEBACiAJcmV0dXJuIHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldiwgKHU4ICopJm1zZyk7CiB9CiAKLXN0YXRpYyBpbnQgcHJpc20yX2RvbWlic2V0X3BzdHIzMih3bGFuZGV2aWNlX3QgKndsYW5kZXYsCitzdGF0aWMgaW50IHByaXNtMl9kb21pYnNldF9wc3RyMzIoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCiAJCQkJICB1MzIgZGlkLCB1OCBsZW4sIGNvbnN0IHU4ICpkYXRhKQogewogCXN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0IG1zZzsKLQlwODAyMTFpdGVtX3BzdHIzMl90ICptaWJpdGVtID0KLQkJCShwODAyMTFpdGVtX3BzdHIzMl90ICopJm1zZy5taWJhdHRyaWJ1dGUuZGF0YTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV9wc3RyMzIgKm1pYml0ZW0gPQorCQkJKHN0cnVjdCBwODAyMTFpdGVtX3BzdHIzMiAqKSZtc2cubWliYXR0cmlidXRlLmRhdGE7CiAKIAltc2cubXNnY29kZSA9IERJRG1zZ19kb3QxMXJlcV9taWJzZXQ7CiAJbWliaXRlbS0+ZGlkID0gZGlkOwpAQCAtMTAzLDcgKzEwMyw3IEBACiAJCQkJICAgICAgZW51bSBubDgwMjExX2lmdHlwZSB0eXBlLCB1MzIgKmZsYWdzLAogCQkJCSAgICAgIHN0cnVjdCB2aWZfcGFyYW1zICpwYXJhbXMpCiB7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OwogCXUzMiBkYXRhOwogCWludCByZXN1bHQ7CiAJaW50IGVyciA9IDA7CkBAIC0xNDQsMTIgKzE0NCwxNSBAQAogCQkJICB1OCBrZXlfaW5kZXgsIGJvb2wgcGFpcndpc2UsIGNvbnN0IHU4ICptYWNfYWRkciwKIAkJCSAgc3RydWN0IGtleV9wYXJhbXMgKnBhcmFtcykKIHsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CiAJdTMyIGRpZDsKIAogCWludCBlcnIgPSAwOwogCWludCByZXN1bHQgPSAwOwogCisJaWYgKGtleV9pbmRleCA+PSBOVU1fV0VQS0VZUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlzd2l0Y2ggKHBhcmFtcy0+Y2lwaGVyKSB7CiAJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKIAljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKQEAgLTE2MCwyNyArMTYzLDcgQEAKIAkJCWdvdG8gZXhpdDsKIAogCQkvKiBzZW5kIGtleSB0byBkcml2ZXIgKi8KLQkJc3dpdGNoIChrZXlfaW5kZXgpIHsKLQkJY2FzZSAwOgotCQkJZGlkID0gRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkwOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAxOgotCQkJZGlkID0gRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkxOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAyOgotCQkJZGlkID0gRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkyOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAzOgotCQkJZGlkID0gRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkzOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWVyciA9IC1FSU5WQUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KKwkJZGlkID0gRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9rZXkoa2V5X2luZGV4ICsgMSk7CiAKIAkJcmVzdWx0ID0gcHJpc20yX2RvbWlic2V0X3BzdHIzMih3bGFuZGV2LCBkaWQsCiAJCQkJCQlwYXJhbXMtPmtleV9sZW4sIHBhcmFtcy0+a2V5KTsKQEAgLTIwNSw3ICsxODgsNyBAQAogCQkJICBjb25zdCB1OCAqbWFjX2FkZHIsIHZvaWQgKmNvb2tpZSwKIAkJCSAgdm9pZCAoKmNhbGxiYWNrKSh2b2lkICpjb29raWUsIHN0cnVjdCBrZXlfcGFyYW1zKikpCiB7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OwogCXN0cnVjdCBrZXlfcGFyYW1zIHBhcmFtczsKIAlpbnQgbGVuOwogCkBAIC0yMzMsNyArMjE2LDcgQEAKIHN0YXRpYyBpbnQgcHJpc20yX2RlbF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgdTgga2V5X2luZGV4LCBib29sIHBhaXJ3aXNlLCBjb25zdCB1OCAqbWFjX2FkZHIpCiB7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OwogCXUzMiBkaWQ7CiAJaW50IGVyciA9IDA7CiAJaW50IHJlc3VsdCA9IDA7CkBAIC0yNDIsMzYgKzIyNSwxMyBAQAogCSAqIGEga2V5LCBzbyB3ZSB3aWxsIGNoZWF0IGJ5IHNldHRpbmcgdGhlIGtleSB0byBhIGJvZ3VzIHZhbHVlCiAJICovCiAKKwlpZiAoa2V5X2luZGV4ID49IE5VTV9XRVBLRVlTKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCS8qIHNlbmQga2V5IHRvIGRyaXZlciAqLwotCXN3aXRjaCAoa2V5X2luZGV4KSB7Ci0JY2FzZSAwOgotCQlkaWQgPQotCQkgICAgRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkwOwotCQlicmVhazsKLQotCWNhc2UgMToKLQkJZGlkID0KLQkJICAgIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MTsKLQkJYnJlYWs7Ci0KLQljYXNlIDI6Ci0JCWRpZCA9Ci0JCSAgICBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTI7Ci0JCWJyZWFrOwotCi0JY2FzZSAzOgotCQlkaWQgPQotCQkgICAgRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkzOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KKwlkaWQgPSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2tleShrZXlfaW5kZXggKyAxKTsKIAlyZXN1bHQgPSBwcmlzbTJfZG9taWJzZXRfcHN0cjMyKHdsYW5kZXYsIGRpZCwgMTMsICIwMDAwMDAwMDAwMDAwIik7CiAKLWV4aXQ6CiAJaWYgKHJlc3VsdCkKIAkJZXJyID0gLUVGQVVMVDsKIApAQCAtMjgxLDcgKzI0MSw3IEBACiBzdGF0aWMgaW50IHByaXNtMl9zZXRfZGVmYXVsdF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgIHU4IGtleV9pbmRleCwgYm9vbCB1bmljYXN0LCBib29sIG11bHRpY2FzdCkKIHsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CiAKIAlpbnQgZXJyID0gMDsKIAlpbnQgcmVzdWx0ID0gMDsKQEAgLTI5OSwxMyArMjU5LDEzIEBACiBzdGF0aWMgaW50IHByaXNtMl9nZXRfc3RhdGlvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICAgICAgY29uc3QgdTggKm1hYywgc3RydWN0IHN0YXRpb25faW5mbyAqc2luZm8pCiB7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OwogCXN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2NvbW1zcXVhbGl0eSBxdWFsaXR5OwogCWludCByZXN1bHQ7CiAKIAltZW1zZXQoc2luZm8sIDAsIHNpemVvZigqc2luZm8pKTsKIAotCWlmICgod2xhbmRldiA9PSBOVUxMKSB8fCAod2xhbmRldi0+bXNkc3RhdGUgIT0gV0xBTl9NU0RfUlVOTklORykpCisJaWYgKCF3bGFuZGV2IHx8ICh3bGFuZGV2LT5tc2RzdGF0ZSAhPSBXTEFOX01TRF9SVU5OSU5HKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJLyogYnVpbGQgcmVxdWVzdCBtZXNzYWdlICovCkBAIC0zMTQsNyArMjc0LDcgQEAKIAlxdWFsaXR5LmRibS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7CiAKIAkvKiBzZW5kIG1lc3NhZ2UgdG8gbnNkICovCi0JaWYgKHdsYW5kZXYtPm1sbWVyZXF1ZXN0ID09IE5VTEwpCisJaWYgKCF3bGFuZGV2LT5tbG1lcmVxdWVzdCkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJcmVzdWx0ID0gd2xhbmRldi0+bWxtZXJlcXVlc3Qod2xhbmRldiwgKHN0cnVjdCBwODAyMTFtc2cgKikmcXVhbGl0eSk7CkBAIC0zMzQsNyArMjk0LDcgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXN0cnVjdCBwcmlzbTJfd2lwaHlfcHJpdmF0ZSAqcHJpdiA9IHdpcGh5X3ByaXYod2lwaHkpOwotCXdsYW5kZXZpY2VfdCAqd2xhbmRldjsKKwlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldjsKIAlzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX3NjYW4gbXNnMTsKIAlzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX3NjYW5fcmVzdWx0cyBtc2cyOwogCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzczsKQEAgLTM3NCw3ICszMzQsNyBAQAogCQltc2cxLnNjYW50eXBlLmRhdGEgPSBQODAyMTFFTlVNX3NjYW50eXBlX2FjdGl2ZTsKIAkJbXNnMS5zc2lkLmRhdGEubGVuID0gcmVxdWVzdC0+c3NpZHMtPnNzaWRfbGVuOwogCQltZW1jcHkobXNnMS5zc2lkLmRhdGEuZGF0YSwKLQkJCXJlcXVlc3QtPnNzaWRzLT5zc2lkLCByZXF1ZXN0LT5zc2lkcy0+c3NpZF9sZW4pOworCQkgICAgICAgcmVxdWVzdC0+c3NpZHMtPnNzaWQsIHJlcXVlc3QtPnNzaWRzLT5zc2lkX2xlbik7CiAJfSBlbHNlIHsKIAkJbXNnMS5zY2FudHlwZS5kYXRhID0gMDsKIAl9CkBAIC00NTEsNyArNDExLDcgQEAKIHN0YXRpYyBpbnQgcHJpc20yX3NldF93aXBoeV9wYXJhbXMoc3RydWN0IHdpcGh5ICp3aXBoeSwgdTMyIGNoYW5nZWQpCiB7CiAJc3RydWN0IHByaXNtMl93aXBoeV9wcml2YXRlICpwcml2ID0gd2lwaHlfcHJpdih3aXBoeSk7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gcHJpdi0+d2xhbmRldjsKKwlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiA9IHByaXYtPndsYW5kZXY7CiAJdTMyIGRhdGE7CiAJaW50IHJlc3VsdDsKIAlpbnQgZXJyID0gMDsKQEAgLTQ5Myw3ICs0NTMsNyBAQAogc3RhdGljIGludCBwcmlzbTJfY29ubmVjdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICBzdHJ1Y3QgY2ZnODAyMTFfY29ubmVjdF9wYXJhbXMgKnNtZSkKIHsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsID0gc21lLT5jaGFubmVsOwogCXN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2F1dG9qb2luIG1zZ19qb2luOwogCXUzMiBkaWQ7CkBAIC01MTYsMTEgKzQ3NiwxMSBAQAogCiAJLyogU2V0IHRoZSBhdXRob3JpemF0aW9uICovCiAJaWYgKChzbWUtPmF1dGhfdHlwZSA9PSBOTDgwMjExX0FVVEhUWVBFX09QRU5fU1lTVEVNKSB8fAotCQkoKHNtZS0+YXV0aF90eXBlID09IE5MODAyMTFfQVVUSFRZUEVfQVVUT01BVElDKSAmJiAhaXNfd2VwKSkKLQkJCW1zZ19qb2luLmF1dGh0eXBlLmRhdGEgPSBQODAyMTFFTlVNX2F1dGhhbGdfb3BlbnN5c3RlbTsKKwkgICAgKChzbWUtPmF1dGhfdHlwZSA9PSBOTDgwMjExX0FVVEhUWVBFX0FVVE9NQVRJQykgJiYgIWlzX3dlcCkpCisJCW1zZ19qb2luLmF1dGh0eXBlLmRhdGEgPSBQODAyMTFFTlVNX2F1dGhhbGdfb3BlbnN5c3RlbTsKIAllbHNlIGlmICgoc21lLT5hdXRoX3R5cGUgPT0gTkw4MDIxMV9BVVRIVFlQRV9TSEFSRURfS0VZKSB8fAotCQkoKHNtZS0+YXV0aF90eXBlID09IE5MODAyMTFfQVVUSFRZUEVfQVVUT01BVElDKSAmJiBpc193ZXApKQotCQkJbXNnX2pvaW4uYXV0aHR5cGUuZGF0YSA9IFA4MDIxMUVOVU1fYXV0aGFsZ19zaGFyZWRrZXk7CisJCSAoKHNtZS0+YXV0aF90eXBlID09IE5MODAyMTFfQVVUSFRZUEVfQVVUT01BVElDKSAmJiBpc193ZXApKQorCQltc2dfam9pbi5hdXRodHlwZS5kYXRhID0gUDgwMjExRU5VTV9hdXRoYWxnX3NoYXJlZGtleTsKIAllbHNlCiAJCW5ldGRldl93YXJuKGRldiwKIAkJCSJVbmhhbmRsZWQgYXV0aG9yaXNhdGlvbiB0eXBlIGZvciBjb25uZWN0ICglZClcbiIsCkBAIC01MjksNiArNDg5LDExIEBACiAJLyogU2V0IHRoZSBlbmNyeXB0aW9uIC0gd2Ugb25seSBzdXBwb3J0IHdlcCAqLwogCWlmIChpc193ZXApIHsKIAkJaWYgKHNtZS0+a2V5KSB7CisJCQlpZiAoc21lLT5rZXlfaWR4ID49IE5VTV9XRVBLRVlTKSB7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlnb3RvIGV4aXQ7CisJCQl9CisKIAkJCXJlc3VsdCA9IHByaXNtMl9kb21pYnNldF91aW50MzIod2xhbmRldiwKIAkJCQlESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFXRVBEZWZhdWx0S2V5SUQsCiAJCQkJc21lLT5rZXlfaWR4KTsKQEAgLTUzNiwyOCArNTAxLDggQEAKIAkJCQlnb3RvIGV4aXQ7CiAKIAkJCS8qIHNlbmQga2V5IHRvIGRyaXZlciAqLwotCQkJc3dpdGNoIChzbWUtPmtleV9pZHgpIHsKLQkJCWNhc2UgMDoKLQkJCQlkaWQgPSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTA7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgMToKLQkJCQlkaWQgPSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTE7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgMjoKLQkJCQlkaWQgPSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTI7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgMzoKLQkJCQlkaWQgPSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTM7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJZXJyID0gLUVJTlZBTDsKLQkJCQlnb3RvIGV4aXQ7Ci0JCQl9Ci0KKwkJCWRpZCA9IERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfa2V5KAorCQkJCQlzbWUtPmtleV9pZHggKyAxKTsKIAkJCXJlc3VsdCA9IHByaXNtMl9kb21pYnNldF9wc3RyMzIod2xhbmRldiwKIAkJCQkJCQlkaWQsIHNtZS0+a2V5X2xlbiwKIAkJCQkJCQkodTggKilzbWUtPmtleSk7CkBAIC02MTgsNyArNTYzLDcgQEAKIHN0YXRpYyBpbnQgcHJpc20yX2Rpc2Nvbm5lY3Qoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgICAgdTE2IHJlYXNvbl9jb2RlKQogewotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKIAlzdHJ1Y3QgcDgwMjExbXNnX2xueHJlcV9hdXRvam9pbiBtc2dfam9pbjsKIAlpbnQgcmVzdWx0OwogCWludCBlcnIgPSAwOwpAQCAtNjUyLDcgKzU5Nyw3IEBACiAJCQkgICAgICAgZW51bSBubDgwMjExX3R4X3Bvd2VyX3NldHRpbmcgdHlwZSwgaW50IG1ibSkKIHsKIAlzdHJ1Y3QgcHJpc20yX3dpcGh5X3ByaXZhdGUgKnByaXYgPSB3aXBoeV9wcml2KHdpcGh5KTsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBwcml2LT53bGFuZGV2OworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2ID0gcHJpdi0+d2xhbmRldjsKIAl1MzIgZGF0YTsKIAlpbnQgcmVzdWx0OwogCWludCBlcnIgPSAwOwpAQCAtNjc5LDEzICs2MjQsMTMgQEAKIAkJCSAgICAgICBpbnQgKmRibSkKIHsKIAlzdHJ1Y3QgcHJpc20yX3dpcGh5X3ByaXZhdGUgKnByaXYgPSB3aXBoeV9wcml2KHdpcGh5KTsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBwcml2LT53bGFuZGV2OworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2ID0gcHJpdi0+d2xhbmRldjsKIAlzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYmdldCBtc2c7Ci0JcDgwMjExaXRlbV91aW50MzJfdCAqbWliaXRlbTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgKm1pYml0ZW07CiAJaW50IHJlc3VsdDsKIAlpbnQgZXJyID0gMDsKIAotCW1pYml0ZW0gPSAocDgwMjExaXRlbV91aW50MzJfdCAqKSZtc2cubWliYXR0cmlidXRlLmRhdGE7CisJbWliaXRlbSA9IChzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgKikmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhOwogCW1zZy5tc2djb2RlID0gRElEbXNnX2RvdDExcmVxX21pYmdldDsKIAltaWJpdGVtLT5kaWQgPQogCSAgICBESURtaWJfZG90MTFwaHlfZG90MTFQaHlUeFBvd2VyVGFibGVfZG90MTFDdXJyZW50VHhQb3dlckxldmVsOwpAQCAtNzA0LDcgKzY0OSw3IEBACiB9CiAKIC8qIEludGVyZmFjZSBjYWxsYmFjayBmdW5jdGlvbnMsIHBhc3NpbmcgZGF0YSBiYWNrIHVwIHRvIHRoZSBjZmc4MDIxMSBsYXllciAqLwotdm9pZCBwcmlzbTJfY29ubmVjdF9yZXN1bHQod2xhbmRldmljZV90ICp3bGFuZGV2LCB1OCBmYWlsZWQpCit2b2lkIHByaXNtMl9jb25uZWN0X3Jlc3VsdChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTggZmFpbGVkKQogewogCXUxNiBzdGF0dXMgPSBmYWlsZWQgPwogCQkgICAgIFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkUgOiBXTEFOX1NUQVRVU19TVUNDRVNTOwpAQCAtNzEzLDEzICs2NTgsMTMgQEAKIAkJCQlOVUxMLCAwLCBOVUxMLCAwLCBzdGF0dXMsIEdGUF9LRVJORUwpOwogfQogCi12b2lkIHByaXNtMl9kaXNjb25uZWN0ZWQod2xhbmRldmljZV90ICp3bGFuZGV2KQordm9pZCBwcmlzbTJfZGlzY29ubmVjdGVkKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KQogewogCWNmZzgwMjExX2Rpc2Nvbm5lY3RlZCh3bGFuZGV2LT5uZXRkZXYsIDAsIE5VTEwsCi0JCTAsIGZhbHNlLCBHRlBfS0VSTkVMKTsKKwkJCSAgICAgIDAsIGZhbHNlLCBHRlBfS0VSTkVMKTsKIH0KIAotdm9pZCBwcmlzbTJfcm9hbWVkKHdsYW5kZXZpY2VfdCAqd2xhbmRldikKK3ZvaWQgcHJpc20yX3JvYW1lZChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldikKIHsKIAljZmc4MDIxMV9yb2FtZWQod2xhbmRldi0+bmV0ZGV2LCBOVUxMLCB3bGFuZGV2LT5ic3NpZCwKIAkJTlVMTCwgMCwgTlVMTCwgMCwgR0ZQX0tFUk5FTCk7CkBAIC03NDQsNyArNjg5LDcgQEAKIH07CiAKIC8qIEZ1bmN0aW9ucyB0byBjcmVhdGUvZnJlZSB3aXBoeSBpbnRlcmZhY2UgKi8KLXN0YXRpYyBzdHJ1Y3Qgd2lwaHkgKndsYW5fY3JlYXRlX3dpcGh5KHN0cnVjdCBkZXZpY2UgKmRldiwgd2xhbmRldmljZV90ICp3bGFuZGV2KQorc3RhdGljIHN0cnVjdCB3aXBoeSAqd2xhbl9jcmVhdGVfd2lwaHkoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldikKIHsKIAlzdHJ1Y3Qgd2lwaHkgKndpcGh5OwogCXN0cnVjdCBwcmlzbTJfd2lwaHlfcHJpdmF0ZSAqcHJpdjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHguaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHguaAppbmRleCBjZWM2ZDBiLi40M2MyOTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eC5oCkBAIC0xLDU3ICsxLDU3IEBACiAvKiBoZmEzODR4LmgKLSoKLSogRGVmaW5lcyB0aGUgY29uc3RhbnRzIGFuZCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoZSBoZmEzODR4Ci0qCi0qIENvcHlyaWdodCAoQykgMTk5OSBBYnNvbHV0ZVZhbHVlIFN5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qCi0qIGxpbnV4LXdsYW4KLSoKLSogICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYwotKiAgIExpY2Vuc2UgVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCi0qICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCi0qICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCi0qCi0qICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTCi0qICAgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotKiAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZwotKiAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qCi0qICAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKLSogICB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAodGhlICJHUEwiKSwgaW4gd2hpY2gKLSogICBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUKLSogICBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93IHRoZSB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQotKiAgIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlCi0qICAgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uCi0qICAgYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKLSogICBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLiAgSWYgeW91IGRvIG5vdCBkZWxldGUKLSogICB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcwotKiAgIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIEdQTC4KLSoKLSogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoKLSogSW5xdWlyaWVzIHJlZ2FyZGluZyB0aGUgbGludXgtd2xhbiBPcGVuIFNvdXJjZSBwcm9qZWN0IGNhbiBiZQotKiBtYWRlIGRpcmVjdGx5IHRvOgotKgotKiBBYnNvbHV0ZVZhbHVlIFN5c3RlbXMgSW5jLgotKiBpbmZvQGxpbnV4LXdsYW4uY29tCi0qIGh0dHA6Ly93d3cubGludXgtd2xhbi5jb20KLSoKLSogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoKLSogUG9ydGlvbnMgb2YgdGhlIGRldmVsb3BtZW50IG9mIHRoaXMgc29mdHdhcmUgd2VyZSBmdW5kZWQgYnkKLSogSW50ZXJzaWwgQ29ycG9yYXRpb24gYXMgcGFydCBvZiBQUklTTShSKSBjaGlwc2V0IHByb2R1Y3QgZGV2ZWxvcG1lbnQuCi0qCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qCi0qICAgW0ltcGxlbWVudGF0aW9uIGFuZCB1c2FnZSBub3Rlc10KLSoKLSogICBbUmVmZXJlbmNlc10KLSoJQ1cxMCBQcm9ncmFtbWVyJ3MgTWFudWFsIHYxLjUKLSoJSUVFRSA4MDIuMTEgRDEwLjAKLSoKLSogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCisgKgorICogRGVmaW5lcyB0aGUgY29uc3RhbnRzIGFuZCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoZSBoZmEzODR4CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5IEFic29sdXRlVmFsdWUgU3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogbGludXgtd2xhbgorICoKKyAqICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMKKyAqICAgTGljZW5zZSBWZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKKyAqICAgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLworICoKKyAqICAgU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTCisgKiAgIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAqICAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworICogICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqICAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyAqICAgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIiksIGluIHdoaWNoCisgKiAgIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRoZQorICogICBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93IHRoZSB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQorICogICBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZQorICogICB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSBNUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24KKyAqICAgYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKKyAqICAgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4gIElmIHlvdSBkbyBub3QgZGVsZXRlCisgKiAgIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzCisgKiAgIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIEdQTC4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIElucXVpcmllcyByZWdhcmRpbmcgdGhlIGxpbnV4LXdsYW4gT3BlbiBTb3VyY2UgcHJvamVjdCBjYW4gYmUKKyAqIG1hZGUgZGlyZWN0bHkgdG86CisgKgorICogQWJzb2x1dGVWYWx1ZSBTeXN0ZW1zIEluYy4KKyAqIGluZm9AbGludXgtd2xhbi5jb20KKyAqIGh0dHA6Ly93d3cubGludXgtd2xhbi5jb20KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFBvcnRpb25zIG9mIHRoZSBkZXZlbG9wbWVudCBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgZnVuZGVkIGJ5CisgKiBJbnRlcnNpbCBDb3Jwb3JhdGlvbiBhcyBwYXJ0IG9mIFBSSVNNKFIpIGNoaXBzZXQgcHJvZHVjdCBkZXZlbG9wbWVudC4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgW0ltcGxlbWVudGF0aW9uIGFuZCB1c2FnZSBub3Rlc10KKyAqCisgKiAgIFtSZWZlcmVuY2VzXQorICoJQ1cxMCBQcm9ncmFtbWVyJ3MgTWFudWFsIHYxLjUKKyAqCUlFRUUgODAyLjExIEQxMC4wCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogCiAjaWZuZGVmIF9IRkEzODR4X0gKICNkZWZpbmUgX0hGQTM4NHhfSApAQCAtNjMsNyArNjMsNyBAQAogCiAvKi0tLSBNaW5zICYgTWF4cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjZGVmaW5lCUhGQTM4NHhfUE9SVElEX01BWAkJKCh1MTYpNykKLSNkZWZpbmUJSEZBMzg0eF9OVU1QT1JUU19NQVgJCSgodTE2KShIRkEzODR4X1BPUlRJRF9NQVgrMSkpCisjZGVmaW5lCUhGQTM4NHhfTlVNUE9SVFNfTUFYCQkoKHUxNikoSEZBMzg0eF9QT1JUSURfTUFYICsgMSkpCiAjZGVmaW5lCUhGQTM4NHhfUERSX0xFTl9NQVgJCSgodTE2KTUxMikgLyogaW4gYnl0ZXMsIGZyb20gRUsgKi8KICNkZWZpbmUJSEZBMzg0eF9QREFfUkVDU19NQVgJCSgodTE2KTIwMCkgLyogYSBndWVzcyAqLwogI2RlZmluZQlIRkEzODR4X1BEQV9MRU5fTUFYCQkoKHUxNikxMDI0KSAvKiBpbiBieXRlcywgZnJvbSBFSyovCkBAIC0xMTAsMjAgKzExMCwyMSBAQAogI2RlZmluZQkJSEZBMzg0eF9BRERSX0ZMQVRfQ01EX09GRl9NQVNLCSgweDAwMDBmZmZmKQogCiAvKiBNYXNrIGJpdHMgZm9yIGRpc2NhcmRpbmcgdW53YW50ZWQgcGllY2VzIGluIEFVWCBmb3JtYXQKLSAgIDE2LWJpdCBhZGRyZXNzIHBhcnRzICovCisgKiAxNi1iaXQgYWRkcmVzcyBwYXJ0cworICovCiAjZGVmaW5lCQlIRkEzODR4X0FERFJfQVVYX1BBR0VfTUFTSwkoMHhmZmZmKQogI2RlZmluZQkJSEZBMzg0eF9BRERSX0FVWF9PRkZfTUFTSwkoMHgwMDdmKQogCiAvKiBNYWtlIGEgMzItYml0IGZsYXQgYWRkcmVzcyBmcm9tIEFVWCBmb3JtYXQgMTYtYml0IHBhZ2UgYW5kIG9mZnNldCAqLwogI2RlZmluZQkJSEZBMzg0eF9BRERSX0FVWF9NS0ZMQVQocCwgbykJXAotCQkoKCgodTMyKSgoKHUxNikocCkpJkhGQTM4NHhfQUREUl9BVVhfUEFHRV9NQVNLKSkgPDwgNykgfCBcCi0JCSgodTMyKSgoKHUxNikobykpJkhGQTM4NHhfQUREUl9BVVhfT0ZGX01BU0spKSkKKwkJKCgoKHUzMikoKCh1MTYpKHApKSAmIEhGQTM4NHhfQUREUl9BVVhfUEFHRV9NQVNLKSkgPDwgNykgfCBcCisJCSgodTMyKSgoKHUxNikobykpICYgSEZBMzg0eF9BRERSX0FVWF9PRkZfTUFTSykpKQogCiAvKiBNYWtlIENNRCBmb3JtYXQgb2Zmc2V0IGFuZCBwYWdlIGZyb20gYSAzMi1iaXQgZmxhdCBhZGRyZXNzICovCiAjZGVmaW5lCQlIRkEzODR4X0FERFJfQ01EX01LUEFHRShmKSBcCi0JCSgodTE2KSgoKCh1MzIpKGYpKSZIRkEzODR4X0FERFJfRkxBVF9DTURfUEFHRV9NQVNLKT4+MTYpKQorCQkoKHUxNikoKCgodTMyKShmKSkgJiBIRkEzODR4X0FERFJfRkxBVF9DTURfUEFHRV9NQVNLKSA+PiAxNikpCiAjZGVmaW5lCQlIRkEzODR4X0FERFJfQ01EX01LT0ZGKGYpIFwKLQkJKCh1MTYpKCgodTMyKShmKSkmSEZBMzg0eF9BRERSX0ZMQVRfQ01EX09GRl9NQVNLKSkKKwkJKCh1MTYpKCgodTMyKShmKSkgJiBIRkEzODR4X0FERFJfRkxBVF9DTURfT0ZGX01BU0spKQogCiAvKi0tLSBDb250cm9sbGVyIE1lbW9yeSBhZGRyZXNzZXMgLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjZGVmaW5lCQlIRkEzODQyX1BEQV9CQVNFCSgweDAwN2YwMDAwVUwpCkBAIC0xNzMsMTEgKzE3NCwxMiBAQAogI2RlZmluZQkJSEZBMzg0eF9DTURfRVJSCQkJKCh1MTYpKDB4N0YpKQogCiAvKi0tLSBQcm9ncmFtbWluZyBNb2RlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCU1PREUgMDogRGlzYWJsZSBwcm9ncmFtbWluZwotCU1PREUgMTogRW5hYmxlIHZvbGF0aWxlIG1lbW9yeSBwcm9ncmFtbWluZwotCU1PREUgMjogRW5hYmxlIG5vbi12b2xhdGlsZSBtZW1vcnkgcHJvZ3JhbW1pbmcKLQlNT0RFIDM6IFByb2dyYW0gbm9uLXZvbGF0aWxlIG1lbW9yeSBzZWN0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKglNT0RFIDA6IERpc2FibGUgcHJvZ3JhbW1pbmcKKyAqCU1PREUgMTogRW5hYmxlIHZvbGF0aWxlIG1lbW9yeSBwcm9ncmFtbWluZworICoJTU9ERSAyOiBFbmFibGUgbm9uLXZvbGF0aWxlIG1lbW9yeSBwcm9ncmFtbWluZworICoJTU9ERSAzOiBQcm9ncmFtIG5vbi12b2xhdGlsZSBtZW1vcnkgc2VjdGlvbgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KICNkZWZpbmUJCUhGQTM4NHhfUFJPR01PREVfRElTQUJMRQkoKHUxNikweDAwKQogI2RlZmluZQkJSEZBMzg0eF9QUk9HTU9ERV9SQU0JCSgodTE2KTB4MDEpCiAjZGVmaW5lCQlIRkEzODR4X1BST0dNT0RFX05WCQkoKHUxNikweDAyKQpAQCAtMTg1LDggKzE4Nyw5IEBACiAKIC8qLS0tIFJlY29yZCBJRCBDb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29uZmlndXJhdGlvbiBSSURzOiBOZXR3b3JrIFBhcmFtZXRlcnMsIFN0YXRpYyBDb25maWd1cmF0aW9uIEVudGl0aWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiBDb25maWd1cmF0aW9uIFJJRHM6IE5ldHdvcmsgUGFyYW1ldGVycywgU3RhdGljIENvbmZpZ3VyYXRpb24gRW50aXRpZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GUE9SVFRZUEUJCSgodTE2KTB4RkMwMCkKICNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTk1BQ0FERFIJKCh1MTYpMHhGQzAxKQogI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GREVTSVJFRFNTSUQJKCh1MTYpMHhGQzAyKQpAQCAtMTk1LDE3ICsxOTgsMTkgQEAKICNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk1BWERBVEFMRU4JKCh1MTYpMHhGQzA3KQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db25maWd1cmF0aW9uIFJJRCBsZW5ndGhzOiBOZXR3b3JrIFBhcmFtcywgU3RhdGljIENvbmZpZyBFbnRpdGllcwotICBUaGlzIGlzIHRoZSBsZW5ndGggb2YgSlVTVCB0aGUgREFUQSBwYXJ0IG9mIHRoZSBSSUQgKGRvZXMgbm90Ci0gIGluY2x1ZGUgdGhlIGxlbiBvciBjb2RlIGZpZWxkcykKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqIENvbmZpZ3VyYXRpb24gUklEIGxlbmd0aHM6IE5ldHdvcmsgUGFyYW1zLCBTdGF0aWMgQ29uZmlnIEVudGl0aWVzCisgKiBUaGlzIGlzIHRoZSBsZW5ndGggb2YgSlVTVCB0aGUgREFUQSBwYXJ0IG9mIHRoZSBSSUQgKGRvZXMgbm90CisgKiBpbmNsdWRlIHRoZSBsZW4gb3IgY29kZSBmaWVsZHMpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KICNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTk1BQ0FERFJfTEVOCSgodTE2KTYpCiAjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZERVNJUkVEU1NJRF9MRU4JKCh1MTYpMzQpCiAjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZPV05TU0lEX0xFTgkoKHUxNikzNCkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29uZmlndXJhdGlvbiBSSURzOiBOZXR3b3JrIFBhcmFtZXRlcnMsIER5bmFtaWMgQ29uZmlndXJhdGlvbiBFbnRpdGllcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICogQ29uZmlndXJhdGlvbiBSSURzOiBOZXR3b3JrIFBhcmFtZXRlcnMsIER5bmFtaWMgQ29uZmlndXJhdGlvbiBFbnRpdGllcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAjZGVmaW5lCQlIRkEzODR4X1JJRF9DUkVBVEVJQlNTCQkoKHUxNikweEZDODEpCiAjZGVmaW5lCQlIRkEzODR4X1JJRF9GUkFHVEhSRVNICQkoKHUxNikweEZDODIpCiAjZGVmaW5lCQlIRkEzODR4X1JJRF9SVFNUSFJFU0gJCSgodTE2KTB4RkM4MykKQEAgLTIxMyw4ICsyMTgsOSBAQAogI2RlZmluZQkJSEZBMzg0eF9SSURfUFJPTUlTQ01PREUJCSgodTE2KTB4RkM4NSkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1JbmZvcm1hdGlvbiBSSURzOiBOSUMgSW5mb3JtYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqIEluZm9ybWF0aW9uIFJJRHM6IE5JQyBJbmZvcm1hdGlvbgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KICNkZWZpbmUJCUhGQTM4NHhfUklEX01BWExPQURUSU1FCQkoKHUxNikweEZEMDApCiAjZGVmaW5lCQlIRkEzODR4X1JJRF9ET1dOTE9BREJVRkZFUgkoKHUxNikweEZEMDEpCiAjZGVmaW5lCQlIRkEzODR4X1JJRF9QUklJREVOVElUWQkJKCh1MTYpMHhGRDAyKQpAQCAtMjMwLDE1ICsyMzYsMTcgQEAKICNkZWZpbmUJCUhGQTM4NHhfUklEX1NUQV9DRklBQ1RSQU5HRVMJKCh1MTYpMHhGRDIzKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUluZm9ybWF0aW9uIFJJRCBMZW5ndGhzOiBOSUMgSW5mb3JtYXRpb24KLSAgVGhpcyBpcyB0aGUgbGVuZ3RoIG9mIEpVU1QgdGhlIERBVEEgcGFydCBvZiB0aGUgUklEIChkb2VzIG5vdAotICBpbmNsdWRlIHRoZSBsZW4gb3IgY29kZSBmaWVsZHMpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiBJbmZvcm1hdGlvbiBSSUQgTGVuZ3RoczogTklDIEluZm9ybWF0aW9uCisgKiBUaGlzIGlzIHRoZSBsZW5ndGggb2YgSlVTVCB0aGUgREFUQSBwYXJ0IG9mIHRoZSBSSUQgKGRvZXMgbm90CisgKiBpbmNsdWRlIHRoZSBsZW4gb3IgY29kZSBmaWVsZHMpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAjZGVmaW5lCQlIRkEzODR4X1JJRF9OSUNTRVJJQUxOVU1CRVJfTEVOCQkoKHUxNikxMikKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotSW5mb3JtYXRpb24gUklEczogIE1BQyBJbmZvcm1hdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICogSW5mb3JtYXRpb24gUklEczogIE1BQyBJbmZvcm1hdGlvbgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAjZGVmaW5lCQlIRkEzODR4X1JJRF9QT1JUU1RBVFVTCQkoKHUxNikweEZENDApCiAjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UU1NJRAkJKCh1MTYpMHhGRDQxKQogI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVEJTU0lECSgodTE2KTB4RkQ0MikKQEAgLTI1MCwyMyArMjU4LDI2IEBACiAjZGVmaW5lCQlIRkEzODR4X1JJRF9EQk1DT01NU1FVQUxJVFkJKCh1MTYpMHhGRDUxKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1JbmZvcm1hdGlvbiBSSUQgTGVuZ3RoczogIE1BQyBJbmZvcm1hdGlvbgotICBUaGlzIGlzIHRoZSBsZW5ndGggb2YgSlVTVCB0aGUgREFUQSBwYXJ0IG9mIHRoZSBSSUQgKGRvZXMgbm90Ci0gIGluY2x1ZGUgdGhlIGxlbiBvciBjb2RlIGZpZWxkcykKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqIEluZm9ybWF0aW9uIFJJRCBMZW5ndGhzOiAgTUFDIEluZm9ybWF0aW9uCisgKiBUaGlzIGlzIHRoZSBsZW5ndGggb2YgSlVTVCB0aGUgREFUQSBwYXJ0IG9mIHRoZSBSSUQgKGRvZXMgbm90CisgKiBpbmNsdWRlIHRoZSBsZW4gb3IgY29kZSBmaWVsZHMpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KICNkZWZpbmUJCUhGQTM4NHhfUklEX0RCTUNPTU1TUVVBTElUWV9MRU4JIFwKLQkoKHUxNikgc2l6ZW9mKGhmYTM4NHhfZGJtY29tbXNxdWFsaXR5X3QpKQorCSgodTE2KXNpemVvZihzdHJ1Y3QgaGZhMzg0eF9kYm1jb21tc3F1YWxpdHkpKQogI2RlZmluZQkJSEZBMzg0eF9SSURfSk9JTlJFUVVFU1RfTEVOIFwKLQkoKHUxNilzaXplb2YoaGZhMzg0eF9Kb2luUmVxdWVzdF9kYXRhX3QpKQorCSgodTE2KXNpemVvZihzdHJ1Y3QgaGZhMzg0eF9Kb2luUmVxdWVzdF9kYXRhKSkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotSW5mb3JtYXRpb24gUklEczogIE1vZGVtIEluZm9ybWF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiBJbmZvcm1hdGlvbiBSSURzOiAgTW9kZW0gSW5mb3JtYXRpb24KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogI2RlZmluZQkJSEZBMzg0eF9SSURfQ1VSUkVOVENIQU5ORUwJKCh1MTYpMHhGREMxKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BUEkgRU5IQU5DRU1FTlRTIChOT1QgQUxSRUFEWSBJTVBMRU1FTlRFRCkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqIEFQSSBFTkhBTkNFTUVOVFMgKE5PVCBBTFJFQURZIElNUExFTUVOVEVEKQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZSUQJKCh1MTYpMHhGQzIzKQogI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWTAJKCh1MTYpMHhGQzI0KQogI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWTEJKCh1MTYpMHhGQzI1KQpAQCAtMjkwLDggKzMwMSw5IEBACiAjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVAxMjhERUZBVUxUS0VZX0xFTgkoKHUxNikxNCkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotUEQgUmVjb3JkIGNvZGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiBQRCBSZWNvcmQgY29kZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogI2RlZmluZSBIRkEzODR4X1BEUl9QQ0JfUEFSVE5VTQkJKCh1MTYpMHgwMDAxKQogI2RlZmluZSBIRkEzODR4X1BEUl9QREFWRVIJCSgodTE2KTB4MDAwMikKICNkZWZpbmUgSEZBMzg0eF9QRFJfTklDX1NFUklBTAkJKCh1MTYpMHgwMDAzKQpAQCAtMzU1LDMxICszNjcsMzIgQEAKIAl1OCBkYXRhWzBdOwogfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyMzIgeworc3RydWN0IGhmYTM4NHhfYnl0ZXN0cjMyIHsKIAl1MTYgbGVuOwogCXU4IGRhdGFbMzJdOwotfSBfX3BhY2tlZCBoZmEzODR4X2J5dGVzdHIzMl90OworfSBfX3BhY2tlZDsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29uZmlndXJhdGlvbiBSZWNvcmQgU3RydWN0dXJlczoKLQlOZXR3b3JrIFBhcmFtZXRlcnMsIFN0YXRpYyBDb25maWd1cmF0aW9uIEVudGl0aWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiBDb25maWd1cmF0aW9uIFJlY29yZCBTdHJ1Y3R1cmVzOgorICoJTmV0d29yayBQYXJhbWV0ZXJzLCBTdGF0aWMgQ29uZmlndXJhdGlvbiBFbnRpdGllcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAKIC8qLS0gSGFyZHdhcmUvRmlybXdhcmUgQ29tcG9uZW50IEluZm9ybWF0aW9uIC0tLS0tLS0tLS0qLwotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jb21waWRlbnQgeworc3RydWN0IGhmYTM4NHhfY29tcGlkZW50IHsKIAl1MTYgaWQ7CiAJdTE2IHZhcmlhbnQ7CiAJdTE2IG1ham9yOwogCXUxNiBtaW5vcjsKLX0gX19wYWNrZWQgaGZhMzg0eF9jb21waWRlbnRfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwgeworc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwgewogCXUxNiByb2xlOwogCXUxNiBpZDsKIAl1MTYgdmFyaWFudDsKIAl1MTYgYm90dG9tOwogCXUxNiB0b3A7Ci19IF9fcGFja2VkIGhmYTM4NHhfY2FwbGV2ZWxfdDsKK30gX19wYWNrZWQ7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGNuZkF1dGhlbnRpY2F0aW9uIC0tKi8KICNkZWZpbmUgSEZBMzg0eF9DTkZBVVRIRU5USUNBVElPTl9PUEVOU1lTVEVNCTB4MDAwMQpAQCAtMzg3LDc3ICs0MDAsODEgQEAKICNkZWZpbmUgSEZBMzg0eF9DTkZBVVRIRU5USUNBVElPTl9MRUFQCQkweDAwMDQKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29uZmlndXJhdGlvbiBSZWNvcmQgU3RydWN0dXJlczoKLQlOZXR3b3JrIFBhcmFtZXRlcnMsIER5bmFtaWMgQ29uZmlndXJhdGlvbiBFbnRpdGllcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICogQ29uZmlndXJhdGlvbiBSZWNvcmQgU3RydWN0dXJlczoKKyAqCU5ldHdvcmsgUGFyYW1ldGVycywgRHluYW1pYyBDb25maWd1cmF0aW9uIEVudGl0aWVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIAogI2RlZmluZSBIRkEzODR4X0NSRUFURUlCU1NfSk9JTkNSRUFURUlCU1MgICAgICAgICAgMAogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBIb3N0U2NhblJlcXVlc3QgKGRhdGEgcG9ydGlvbiBvbmx5KSAtLSovCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X0hvc3RTY2FuUmVxdWVzdF9kYXRhIHsKK3N0cnVjdCBoZmEzODR4X0hvc3RTY2FuUmVxdWVzdF9kYXRhIHsKIAl1MTYgY2hhbm5lbExpc3Q7CiAJdTE2IHR4UmF0ZTsKLQloZmEzODR4X2J5dGVzdHIzMl90IHNzaWQ7Ci19IF9fcGFja2VkIGhmYTM4NHhfSG9zdFNjYW5SZXF1ZXN0X2RhdGFfdDsKKwlzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyMzIgc3NpZDsKK30gX19wYWNrZWQ7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IEpvaW5SZXF1ZXN0IChkYXRhIHBvcnRpb24gb25seSkgLS0qLwotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9Kb2luUmVxdWVzdF9kYXRhIHsKK3N0cnVjdCBoZmEzODR4X0pvaW5SZXF1ZXN0X2RhdGEgewogCXU4IGJzc2lkW1dMQU5fQlNTSURfTEVOXTsKIAl1MTYgY2hhbm5lbDsKLX0gX19wYWNrZWQgaGZhMzg0eF9Kb2luUmVxdWVzdF9kYXRhX3Q7Cit9IF9fcGFja2VkOwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBhdXRoZW50aWNhdGVTdGF0aW9uIChkYXRhIHBvcnRpb24gb25seSkgLS0qLwotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9hdXRoZW50aWNhdGVTdGF0aW9uX2RhdGEgeworc3RydWN0IGhmYTM4NHhfYXV0aGVudGljYXRlU3RhdGlvbl9kYXRhIHsKIAl1OCBhZGRyZXNzW0VUSF9BTEVOXTsKIAl1MTYgc3RhdHVzOwogCXUxNiBhbGdvcml0aG07Ci19IF9fcGFja2VkIGhmYTM4NHhfYXV0aGVudGljYXRlU3RhdGlvbl9kYXRhX3Q7Cit9IF9fcGFja2VkOwogCiAvKi0tIENvbmZpZ3VyYXRpb24gUmVjb3JkOiBXUEFEYXRhICAgICAgIChkYXRhIHBvcnRpb24gb25seSkgLS0qLwotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9XUEFEYXRhIHsKK3N0cnVjdCBoZmEzODR4X1dQQURhdGEgewogCXUxNiBkYXRhbGVuOwogCXU4IGRhdGFbMF07CQkvKiBtYXggODAgKi8KLX0gX19wYWNrZWQgaGZhMzg0eF9XUEFEYXRhX3Q7Cit9IF9fcGFja2VkOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1JbmZvcm1hdGlvbiBSZWNvcmQgU3RydWN0dXJlczogTklDIEluZm9ybWF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiBJbmZvcm1hdGlvbiBSZWNvcmQgU3RydWN0dXJlczogTklDIEluZm9ybWF0aW9uCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IERvd25Mb2FkQnVmZmVyIC0tKi8KIC8qIE5PVEU6IFRoZSBwYWdlIGFuZCBvZmZzZXQgYXJlIGluIEFVWCBmb3JtYXQgKi8KLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfZG93bmxvYWRidWZmZXIgeworc3RydWN0IGhmYTM4NHhfZG93bmxvYWRidWZmZXIgewogCXUxNiBwYWdlOwogCXUxNiBvZmZzZXQ7CiAJdTE2IGxlbjsKLX0gX19wYWNrZWQgaGZhMzg0eF9kb3dubG9hZGJ1ZmZlcl90OworfSBfX3BhY2tlZDsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotSW5mb3JtYXRpb24gUmVjb3JkIFN0cnVjdHVyZXM6IE5JQyBJbmZvcm1hdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICogSW5mb3JtYXRpb24gUmVjb3JkIFN0cnVjdHVyZXM6IE5JQyBJbmZvcm1hdGlvbgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAKICNkZWZpbmUgSEZBMzg0eF9QU1RBVFVTX0NPTk5fSUJTUwkoKHUxNikzKQogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogY29tbXNxdWFsaXR5IC0tKi8KLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfY29tbXNxdWFsaXR5IHsKK3N0cnVjdCBoZmEzODR4X2NvbW1zcXVhbGl0eSB7CiAJdTE2IENRX2N1cnJCU1M7CiAJdTE2IEFTTF9jdXJyQlNTOwogCXUxNiBBTkxfY3VyckZDOwotfSBfX3BhY2tlZCBoZmEzODR4X2NvbW1zcXVhbGl0eV90OworfSBfX3BhY2tlZDsKIAogLyotLSBJbmZvcm1hdGlvbiBSZWNvcmQ6IGRtYmNvbW1zcXVhbGl0eSAtLSovCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X2RibWNvbW1zcXVhbGl0eSB7CitzdHJ1Y3QgaGZhMzg0eF9kYm1jb21tc3F1YWxpdHkgewogCXUxNiBDUWRibV9jdXJyQlNTOwogCXUxNiBBU0xkYm1fY3VyckJTUzsKIAl1MTYgQU5MZGJtX2N1cnJGQzsKLX0gX19wYWNrZWQgaGZhMzg0eF9kYm1jb21tc3F1YWxpdHlfdDsKK30gX19wYWNrZWQ7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUZSQU1FIFNUUlVDVFVSRVM6IENvbW11bmljYXRpb24gRnJhbWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db21tdW5pY2F0aW9uIEZyYW1lczogVHJhbnNtaXQgRnJhbWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiBGUkFNRSBTVFJVQ1RVUkVTOiBDb21tdW5pY2F0aW9uIEZyYW1lcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29tbXVuaWNhdGlvbiBGcmFtZXM6IFRyYW5zbWl0IEZyYW1lcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAvKi0tIENvbW11bmljYXRpb24gRnJhbWU6IFRyYW5zbWl0IEZyYW1lIFN0cnVjdHVyZSAtLSovCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3R4X2ZyYW1lIHsKK3N0cnVjdCBoZmEzODR4X3R4X2ZyYW1lIHsKIAl1MTYgc3RhdHVzOwogCXUxNiByZXNlcnZlZDE7CiAJdTE2IHJlc2VydmVkMjsKQEAgLTQ4MiwxMCArNDk5LDExIEBACiAJdTggZGVzdF9hZGRyWzZdOwogCXU4IHNyY19hZGRyWzZdOwogCXUxNiBkYXRhX2xlbmd0aDsJLyogYmlnIGVuZGlhbiBmb3JtYXQgKi8KLX0gX19wYWNrZWQgaGZhMzg0eF90eF9mcmFtZV90OworfSBfX3BhY2tlZDsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvbW11bmljYXRpb24gRnJhbWVzOiBGaWVsZCBNYXNrcyBmb3IgVHJhbnNtaXQgRnJhbWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiBDb21tdW5pY2F0aW9uIEZyYW1lczogRmllbGQgTWFza3MgZm9yIFRyYW5zbWl0IEZyYW1lcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAvKi0tIFN0YXR1cyBGaWVsZCAtLSovCiAjZGVmaW5lCQlIRkEzODR4X1RYU1RBVFVTX0FDS0VSUgkJCSgodTE2KUJJVCg1KSkKICNkZWZpbmUJCUhGQTM4NHhfVFhTVEFUVVNfRk9STUVSUgkJKCh1MTYpQklUKDMpKQpAQCAtNDk5LDE2ICs1MTcsMTcgQEAKICNkZWZpbmUJCUhGQTM4NHhfVFhfVFhFWAkJCQkoKHUxNilCSVQoMikpCiAjZGVmaW5lCQlIRkEzODR4X1RYX1RYT0sJCQkJKCh1MTYpQklUKDEpKQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29tbXVuaWNhdGlvbiBGcmFtZXM6IFRlc3QvR2V0L1NldCBGaWVsZCBWYWx1ZXMgZm9yIFRyYW5zbWl0IEZyYW1lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICogQ29tbXVuaWNhdGlvbiBGcmFtZXM6IFRlc3QvR2V0L1NldCBGaWVsZCBWYWx1ZXMgZm9yIFRyYW5zbWl0IEZyYW1lcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAvKi0tIFN0YXR1cyBGaWVsZCAtLSovCiAjZGVmaW5lIEhGQTM4NHhfVFhTVEFUVVNfSVNFUlJPUih2KQlcCi0JKCgodTE2KSh2KSkmXAotCShIRkEzODR4X1RYU1RBVFVTX0FDS0VSUnxIRkEzODR4X1RYU1RBVFVTX0ZPUk1FUlJ8XAotCUhGQTM4NHhfVFhTVEFUVVNfRElTQ09OfEhGQTM4NHhfVFhTVEFUVVNfQUdFREVSUnxcCisJKCgodTE2KSh2KSkgJiBcCisJKEhGQTM4NHhfVFhTVEFUVVNfQUNLRVJSIHwgSEZBMzg0eF9UWFNUQVRVU19GT1JNRVJSIHwgXAorCUhGQTM4NHhfVFhTVEFUVVNfRElTQ09OIHwgSEZBMzg0eF9UWFNUQVRVU19BR0VERVJSIHwgXAogCUhGQTM4NHhfVFhTVEFUVVNfUkVUUllFUlIpKQogCi0jZGVmaW5lCUhGQTM4NHhfVFhfU0VUKHYsIG0sIHMpCQkoKCgodTE2KSh2KSk8PCgodTE2KShzKSkpJigodTE2KShtKSkpCisjZGVmaW5lCUhGQTM4NHhfVFhfU0VUKHYsIG0sIHMpCQkoKCgodTE2KSh2KSkgPDwgKCh1MTYpKHMpKSkgJiAoKHUxNikobSkpKQogCiAjZGVmaW5lCUhGQTM4NHhfVFhfTUFDUE9SVF9TRVQodikJSEZBMzg0eF9UWF9TRVQodiwgSEZBMzg0eF9UWF9NQUNQT1JULCA4KQogI2RlZmluZQlIRkEzODR4X1RYX1NUUlVDVFlQRV9TRVQodikJSEZBMzg0eF9UWF9TRVQodiwgXApAQCAtNTE2LDEwICs1MzUsMTEgQEAKICNkZWZpbmUJSEZBMzg0eF9UWF9UWEVYX1NFVCh2KQkJSEZBMzg0eF9UWF9TRVQodiwgSEZBMzg0eF9UWF9UWEVYLCAyKQogI2RlZmluZQlIRkEzODR4X1RYX1RYT0tfU0VUKHYpCQlIRkEzODR4X1RYX1NFVCh2LCBIRkEzODR4X1RYX1RYT0ssIDEpCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db21tdW5pY2F0aW9uIEZyYW1lczogUmVjZWl2ZSBGcmFtZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqIENvbW11bmljYXRpb24gRnJhbWVzOiBSZWNlaXZlIEZyYW1lcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAvKi0tIENvbW11bmljYXRpb24gRnJhbWU6IFJlY2VpdmUgRnJhbWUgU3RydWN0dXJlIC0tKi8KLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcnhfZnJhbWUgeworc3RydWN0IGhmYTM4NHhfcnhfZnJhbWUgewogCS8qLS0gTUFDIHJ4IGRlc2NyaXB0b3IgKGhmYTM4NHggYnl0ZSBvcmRlcikgLS0qLwogCXUxNiBzdGF0dXM7CiAJdTMyIHRpbWU7CkBAIC01NDQsMTAgKzU2NCwxMSBAQAogCXU4IGRlc3RfYWRkcls2XTsKIAl1OCBzcmNfYWRkcls2XTsKIAl1MTYgZGF0YV9sZW5ndGg7CS8qIElFRUU/IChiaWcgZW5kaWFuKSBmb3JtYXQgKi8KLX0gX19wYWNrZWQgaGZhMzg0eF9yeF9mcmFtZV90OworfSBfX3BhY2tlZDsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvbW11bmljYXRpb24gRnJhbWVzOiBGaWVsZCBNYXNrcyBmb3IgUmVjZWl2ZSBGcmFtZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqIENvbW11bmljYXRpb24gRnJhbWVzOiBGaWVsZCBNYXNrcyBmb3IgUmVjZWl2ZSBGcmFtZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogCiAvKi0tIFN0YXR1cyBGaWVsZHMgLS0qLwogI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19NQUNQT1JUCQkoKHUxNikoQklUKDEwKSB8IFwKQEAgLTU1NSwxNyArNTc2LDE5IEBACiAJCQkJCQkJCUJJVCg4KSkpCiAjZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX0ZDU0VSUgkJCSgodTE2KUJJVCgwKSkKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvbW11bmljYXRpb24gRnJhbWVzOiBUZXN0L0dldC9TZXQgRmllbGQgVmFsdWVzIGZvciBSZWNlaXZlIEZyYW1lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICogQ29tbXVuaWNhdGlvbiBGcmFtZXM6IFRlc3QvR2V0L1NldCBGaWVsZCBWYWx1ZXMgZm9yIFJlY2VpdmUgRnJhbWVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KICNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfTUFDUE9SVF9HRVQodmFsdWUpCSgodTE2KSgoKCh1MTYpKHZhbHVlKSkgXAogCQkJCQkgICAgJiBIRkEzODR4X1JYU1RBVFVTX01BQ1BPUlQpID4+IDgpKQogI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19JU0ZDU0VSUih2YWx1ZSkJKCh1MTYpKCgodTE2KSh2YWx1ZSkpIFwKIAkJCQkJCSAgJiBIRkEzODR4X1JYU1RBVFVTX0ZDU0VSUikpCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gRlJBTUUgU1RSVUNUVVJFUzogSW5mb3JtYXRpb24gVHlwZXMgYW5kIEluZm9ybWF0aW9uIEZyYW1lIFN0cnVjdHVyZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUluZm9ybWF0aW9uIFR5cGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiBGUkFNRSBTVFJVQ1RVUkVTOiBJbmZvcm1hdGlvbiBUeXBlcyBhbmQgSW5mb3JtYXRpb24gRnJhbWUgU3RydWN0dXJlcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5mb3JtYXRpb24gVHlwZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogI2RlZmluZQkJSEZBMzg0eF9JVF9IQU5ET1ZFUkFERFIJCQkoKHUxNikweEYwMDBVTCkKICNkZWZpbmUJCUhGQTM4NHhfSVRfQ09NTVRBTExJRVMJCQkoKHUxNikweEYxMDBVTCkKICNkZWZpbmUJCUhGQTM4NHhfSVRfU0NBTlJFU1VMVFMJCQkoKHUxNikweEYxMDFVTCkKQEAgLTU4MCwxMyArNjAzLDE0IEBACiAjZGVmaW5lCQlIRkEzODR4X0lUX01JQ0ZBSUxVUkUJCQkoKHUxNikweEYyMDZVTCkKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotSW5mb3JtYXRpb24gRnJhbWVzIFN0cnVjdHVyZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUluZm9ybWF0aW9uIEZyYW1lczogTm90aWZpY2F0aW9uIEZyYW1lIFN0cnVjdHVyZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqIEluZm9ybWF0aW9uIEZyYW1lcyBTdHJ1Y3R1cmVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmZvcm1hdGlvbiBGcmFtZXM6IE5vdGlmaWNhdGlvbiBGcmFtZSBTdHJ1Y3R1cmVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIAogLyotLSAgSW5xdWlyeSBGcmFtZSwgRGlhZ25vc2U6IENvbW11bmljYXRpb24gVGFsbGllcyAtLSovCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X0NvbW1UYWxsaWVzMTYgeworc3RydWN0IGhmYTM4NHhfQ29tbVRhbGxpZXMxNiB7CiAJdTE2IHR4dW5pY2FzdGZyYW1lczsKIAl1MTYgdHhtdWx0aWNhc3RmcmFtZXM7CiAJdTE2IHR4ZnJhZ21lbnRzOwpAQCAtNjA4LDkgKzYzMiw5IEBACiAJdTE2IHJ4ZGlzY2FyZHN3ZXB1bmRlY3I7CiAJdTE2IHJ4bXNnaW5tc2dmcmFnOwogCXUxNiByeG1zZ2luYmFkbXNnZnJhZzsKLX0gX19wYWNrZWQgaGZhMzg0eF9Db21tVGFsbGllczE2X3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X0NvbW1UYWxsaWVzMzIgeworc3RydWN0IGhmYTM4NHhfQ29tbVRhbGxpZXMzMiB7CiAJdTMyIHR4dW5pY2FzdGZyYW1lczsKIAl1MzIgdHhtdWx0aWNhc3RmcmFtZXM7CiAJdTMyIHR4ZnJhZ21lbnRzOwpAQCAtNjMyLDYyICs2NTYsNjIgQEAKIAl1MzIgcnhkaXNjYXJkc3dlcHVuZGVjcjsKIAl1MzIgcnhtc2dpbm1zZ2ZyYWc7CiAJdTMyIHJ4bXNnaW5iYWRtc2dmcmFnOwotfSBfX3BhY2tlZCBoZmEzODR4X0NvbW1UYWxsaWVzMzJfdDsKK30gX19wYWNrZWQ7CiAKIC8qLS0gIElucXVpcnkgRnJhbWUsIERpYWdub3NlOiBTY2FuIFJlc3VsdHMgJiBTdWJmaWVsZHMtLSovCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X1NjYW5SZXN1bHRTdWIgeworc3RydWN0IGhmYTM4NHhfU2NhblJlc3VsdFN1YiB7CiAJdTE2IGNoaWQ7CiAJdTE2IGFubDsKIAl1MTYgc2w7CiAJdTggYnNzaWRbV0xBTl9CU1NJRF9MRU5dOwogCXUxNiBiY25pbnQ7CiAJdTE2IGNhcGluZm87Ci0JaGZhMzg0eF9ieXRlc3RyMzJfdCBzc2lkOworCXN0cnVjdCBoZmEzODR4X2J5dGVzdHIzMiBzc2lkOwogCXU4IHN1cHByYXRlc1sxMF07CS8qIDgwMi4xMSBpbmZvIGVsZW1lbnQgKi8KIAl1MTYgcHJvYmVyZXNwX3JhdGU7Ci19IF9fcGFja2VkIGhmYTM4NHhfU2NhblJlc3VsdFN1Yl90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9TY2FuUmVzdWx0IHsKK3N0cnVjdCBoZmEzODR4X1NjYW5SZXN1bHQgewogCXUxNiByc3ZkOwogCXUxNiBzY2FucmVhc29uOwotCWhmYTM4NHhfU2NhblJlc3VsdFN1Yl90IHJlc3VsdFtIRkEzODR4X1NDQU5SRVNVTFRfTUFYXTsKLX0gX19wYWNrZWQgaGZhMzg0eF9TY2FuUmVzdWx0X3Q7CisJc3RydWN0IGhmYTM4NHhfU2NhblJlc3VsdFN1YiByZXN1bHRbSEZBMzg0eF9TQ0FOUkVTVUxUX01BWF07Cit9IF9fcGFja2VkOwogCiAvKi0tICBJbnF1aXJ5IEZyYW1lLCBEaWFnbm9zZTogQ2hJbmZvIFJlc3VsdHMgJiBTdWJmaWVsZHMtLSovCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X0NoSW5mb1Jlc3VsdFN1YiB7CitzdHJ1Y3QgaGZhMzg0eF9DaEluZm9SZXN1bHRTdWIgewogCXUxNiBjaGlkOwogCXUxNiBhbmw7CiAJdTE2IHBubDsKIAl1MTYgYWN0aXZlOwotfSBfX3BhY2tlZCBoZmEzODR4X0NoSW5mb1Jlc3VsdFN1Yl90OworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBIRkEzODR4X0NISU5GT1JFU1VMVF9CU1NBQ1RJVkUJQklUKDApCiAjZGVmaW5lIEhGQTM4NHhfQ0hJTkZPUkVTVUxUX1BDRkFDVElWRQlCSVQoMSkKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9DaEluZm9SZXN1bHQgeworc3RydWN0IGhmYTM4NHhfQ2hJbmZvUmVzdWx0IHsKIAl1MTYgc2NhbmNoYW5uZWxzOwotCWhmYTM4NHhfQ2hJbmZvUmVzdWx0U3ViX3QgcmVzdWx0W0hGQTM4NHhfQ0hJTkZPUkVTVUxUX01BWF07Ci19IF9fcGFja2VkIGhmYTM4NHhfQ2hJbmZvUmVzdWx0X3Q7CisJc3RydWN0IGhmYTM4NHhfQ2hJbmZvUmVzdWx0U3ViIHJlc3VsdFtIRkEzODR4X0NISU5GT1JFU1VMVF9NQVhdOworfSBfX3BhY2tlZDsKIAogLyotLSAgSW5xdWlyeSBGcmFtZSwgRGlhZ25vc2U6IEhvc3QgU2NhbiBSZXN1bHRzICYgU3ViZmllbGRzLS0qLwotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9IU2NhblJlc3VsdFN1YiB7CitzdHJ1Y3QgaGZhMzg0eF9IU2NhblJlc3VsdFN1YiB7CiAJdTE2IGNoaWQ7CiAJdTE2IGFubDsKIAl1MTYgc2w7CiAJdTggYnNzaWRbV0xBTl9CU1NJRF9MRU5dOwogCXUxNiBiY25pbnQ7CiAJdTE2IGNhcGluZm87Ci0JaGZhMzg0eF9ieXRlc3RyMzJfdCBzc2lkOworCXN0cnVjdCBoZmEzODR4X2J5dGVzdHIzMiBzc2lkOwogCXU4IHN1cHByYXRlc1sxMF07CS8qIDgwMi4xMSBpbmZvIGVsZW1lbnQgKi8KIAl1MTYgcHJvYmVyZXNwX3JhdGU7CiAJdTE2IGF0aW07Ci19IF9fcGFja2VkIGhmYTM4NHhfSFNjYW5SZXN1bHRTdWJfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfSFNjYW5SZXN1bHQgeworc3RydWN0IGhmYTM4NHhfSFNjYW5SZXN1bHQgewogCXUxNiBucmVzdWx0OwogCXUxNiByc3ZkOwotCWhmYTM4NHhfSFNjYW5SZXN1bHRTdWJfdCByZXN1bHRbSEZBMzg0eF9IU0NBTlJFU1VMVF9NQVhdOwotfSBfX3BhY2tlZCBoZmEzODR4X0hTY2FuUmVzdWx0X3Q7CisJc3RydWN0IGhmYTM4NHhfSFNjYW5SZXN1bHRTdWIgcmVzdWx0W0hGQTM4NHhfSFNDQU5SRVNVTFRfTUFYXTsKK30gX19wYWNrZWQ7CiAKIC8qLS0gIFVuc29saWNpdGVkIEZyYW1lLCBNQUMgTWdtdDogTGlua1N0YXR1cyAtLSovCiAKQEAgLTY5OSw5ICs3MjMsOSBAQAogI2RlZmluZSBIRkEzODR4X0xJTktfQVBfSU5SQU5HRQkJKCh1MTYpNSkKICNkZWZpbmUgSEZBMzg0eF9MSU5LX0FTU09DRkFJTAkJKCh1MTYpNikKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9MaW5rU3RhdHVzIHsKK3N0cnVjdCBoZmEzODR4X0xpbmtTdGF0dXMgewogCXUxNiBsaW5rc3RhdHVzOwotfSBfX3BhY2tlZCBoZmEzODR4X0xpbmtTdGF0dXNfdDsKK30gX19wYWNrZWQ7CiAKIC8qLS0gIFVuc29saWNpdGVkIEZyYW1lLCBNQUMgTWdtdDogQXNzb2NpYXRpb25TdGF0dXMgKC0tKi8KIApAQCAtNzA5LDU2ICs3MzMsNTcgQEAKICNkZWZpbmUgSEZBMzg0eF9BU1NPQ1NUQVRVU19SRUFTU09DCSgodTE2KTIpCiAjZGVmaW5lIEhGQTM4NHhfQVNTT0NTVEFUVVNfQVVUSEZBSUwJKCh1MTYpNSkKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9Bc3NvY1N0YXR1cyB7CitzdHJ1Y3QgaGZhMzg0eF9Bc3NvY1N0YXR1cyB7CiAJdTE2IGFzc29jc3RhdHVzOwogCXU4IHN0YV9hZGRyW0VUSF9BTEVOXTsKIAkvKiBvbGRfYXBfYWRkciBpcyBvbmx5IHZhbGlkIGlmIGFzc29jc3RhdHVzID09IDIgKi8KIAl1OCBvbGRfYXBfYWRkcltFVEhfQUxFTl07CiAJdTE2IHJlYXNvbjsKIAl1MTYgcmVzZXJ2ZWQ7Ci19IF9fcGFja2VkIGhmYTM4NHhfQXNzb2NTdGF0dXNfdDsKK30gX19wYWNrZWQ7CiAKIC8qLS0gIFVuc29saWNpdGVkIEZyYW1lLCBNQUMgTWdtdDogQXV0aFJlcXVlc3QgKEFQIE9ubHkpIC0tKi8KIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9BdXRoUmVxdWVzdCB7CitzdHJ1Y3QgaGZhMzg0eF9BdXRoUmVxdWVzdCB7CiAJdTggc3RhX2FkZHJbRVRIX0FMRU5dOwogCXUxNiBhbGdvcml0aG07Ci19IF9fcGFja2VkIGhmYTM4NHhfQXV0aFJlcV90OworfSBfX3BhY2tlZDsKIAogLyotLSAgVW5zb2xpY2l0ZWQgRnJhbWUsIE1BQyBNZ210OiBQU1VzZXJDb3VudCAoQVAgT25seSkgLS0qLwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X1BTVXNlckNvdW50IHsKK3N0cnVjdCBoZmEzODR4X1BTVXNlckNvdW50IHsKIAl1MTYgdXNlcmNudDsKLX0gX19wYWNrZWQgaGZhMzg0eF9QU1VzZXJDb3VudF90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9LZXlJRENoYW5nZWQgeworc3RydWN0IGhmYTM4NHhfS2V5SURDaGFuZ2VkIHsKIAl1OCBzdGFfYWRkcltFVEhfQUxFTl07CiAJdTE2IGtleWlkOwotfSBfX3BhY2tlZCBoZmEzODR4X0tleUlEQ2hhbmdlZF90OworfSBfX3BhY2tlZDsKIAogLyotLSAgQ29sbGVjdGlvbiBvZiBhbGwgSW5mIGZyYW1lcyAtLS0tLS0tLS0tLS0tLS0qLwotdHlwZWRlZiB1bmlvbiBoZmEzODR4X2luZm9kYXRhIHsKLQloZmEzODR4X0NvbW1UYWxsaWVzMTZfdCBjb21tdGFsbGllczE2OwotCWhmYTM4NHhfQ29tbVRhbGxpZXMzMl90IGNvbW10YWxsaWVzMzI7Ci0JaGZhMzg0eF9TY2FuUmVzdWx0X3Qgc2NhbnJlc3VsdDsKLQloZmEzODR4X0NoSW5mb1Jlc3VsdF90IGNoaW5mb3Jlc3VsdDsKLQloZmEzODR4X0hTY2FuUmVzdWx0X3QgaHNjYW5yZXN1bHQ7Ci0JaGZhMzg0eF9MaW5rU3RhdHVzX3QgbGlua3N0YXR1czsKLQloZmEzODR4X0Fzc29jU3RhdHVzX3QgYXNzb2NzdGF0dXM7Ci0JaGZhMzg0eF9BdXRoUmVxX3QgYXV0aHJlcTsKLQloZmEzODR4X1BTVXNlckNvdW50X3QgcHN1c2VyY250OwotCWhmYTM4NHhfS2V5SURDaGFuZ2VkX3Qga2V5aWRjaGFuZ2VkOwotfSBfX3BhY2tlZCBoZmEzODR4X2luZm9kYXRhX3Q7Cit1bmlvbiBoZmEzODR4X2luZm9kYXRhIHsKKwlzdHJ1Y3QgaGZhMzg0eF9Db21tVGFsbGllczE2IGNvbW10YWxsaWVzMTY7CisJc3RydWN0IGhmYTM4NHhfQ29tbVRhbGxpZXMzMiBjb21tdGFsbGllczMyOworCXN0cnVjdCBoZmEzODR4X1NjYW5SZXN1bHQgc2NhbnJlc3VsdDsKKwlzdHJ1Y3QgaGZhMzg0eF9DaEluZm9SZXN1bHQgY2hpbmZvcmVzdWx0OworCXN0cnVjdCBoZmEzODR4X0hTY2FuUmVzdWx0IGhzY2FucmVzdWx0OworCXN0cnVjdCBoZmEzODR4X0xpbmtTdGF0dXMgbGlua3N0YXR1czsKKwlzdHJ1Y3QgaGZhMzg0eF9Bc3NvY1N0YXR1cyBhc3NvY3N0YXR1czsKKwlzdHJ1Y3QgaGZhMzg0eF9BdXRoUmVxdWVzdCBhdXRocmVxOworCXN0cnVjdCBoZmEzODR4X1BTVXNlckNvdW50IHBzdXNlcmNudDsKKwlzdHJ1Y3QgaGZhMzg0eF9LZXlJRENoYW5nZWQga2V5aWRjaGFuZ2VkOworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSB7CitzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSB7CiAJdTE2IGZyYW1lbGVuOwogCXUxNiBpbmZvdHlwZTsKLQloZmEzODR4X2luZm9kYXRhX3QgaW5mbzsKLX0gX19wYWNrZWQgaGZhMzg0eF9JbmZGcmFtZV90OworCXVuaW9uIGhmYTM4NHhfaW5mb2RhdGEgaW5mbzsKK30gX19wYWNrZWQ7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVVTQiBQYWNrZXQgc3RydWN0dXJlcyBhbmQgY29uc3RhbnRzLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICogVVNCIFBhY2tldCBzdHJ1Y3R1cmVzIGFuZCBjb25zdGFudHMuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIAogLyogU2hvdWxkIGJlIHNlbnQgdG8gdGhlIGJ1bGtvdXQgZW5kcG9pbnQgKi8KICNkZWZpbmUgSEZBMzg0eF9VU0JfVFhGUk0JMApAQCAtNzgzLDE0MyArODA4LDE0MCBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogUmVxdWVzdCAoYnVsayBPVVQpIHBhY2tldCBjb250ZW50cyAqLwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl90eGZybSB7Ci0JaGZhMzg0eF90eF9mcmFtZV90IGRlc2M7CitzdHJ1Y3QgaGZhMzg0eF91c2JfdHhmcm0geworCXN0cnVjdCBoZmEzODR4X3R4X2ZyYW1lIGRlc2M7CiAJdTggZGF0YVtXTEFOX0RBVEFfTUFYTEVOXTsKLX0gX19wYWNrZWQgaGZhMzg0eF91c2JfdHhmcm1fdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX2NtZHJlcSB7CitzdHJ1Y3QgaGZhMzg0eF91c2JfY21kcmVxIHsKIAl1MTYgdHlwZTsKIAl1MTYgY21kOwogCXUxNiBwYXJtMDsKIAl1MTYgcGFybTE7CiAJdTE2IHBhcm0yOwogCXU4IHBhZFs1NF07Ci19IF9fcGFja2VkIGhmYTM4NHhfdXNiX2NtZHJlcV90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2Jfd3JpZHJlcSB7CitzdHJ1Y3QgaGZhMzg0eF91c2Jfd3JpZHJlcSB7CiAJdTE2IHR5cGU7CiAJdTE2IGZybWxlbjsKIAl1MTYgcmlkOwogCXU4IGRhdGFbSEZBMzg0eF9SSUREQVRBX01BWExFTl07Ci19IF9fcGFja2VkIGhmYTM4NHhfdXNiX3dyaWRyZXFfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX3JyaWRyZXEgeworc3RydWN0IGhmYTM4NHhfdXNiX3JyaWRyZXEgewogCXUxNiB0eXBlOwogCXUxNiBmcm1sZW47CiAJdTE2IHJpZDsKIAl1OCBwYWRbNThdOwotfSBfX3BhY2tlZCBoZmEzODR4X3VzYl9ycmlkcmVxX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl93bWVtcmVxIHsKK3N0cnVjdCBoZmEzODR4X3VzYl93bWVtcmVxIHsKIAl1MTYgdHlwZTsKIAl1MTYgZnJtbGVuOwogCXUxNiBvZmZzZXQ7CiAJdTE2IHBhZ2U7CiAJdTggZGF0YVtIRkEzODR4X1VTQl9SV01FTV9NQVhMRU5dOwotfSBfX3BhY2tlZCBoZmEzODR4X3VzYl93bWVtcmVxX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl9ybWVtcmVxIHsKK3N0cnVjdCBoZmEzODR4X3VzYl9ybWVtcmVxIHsKIAl1MTYgdHlwZTsKIAl1MTYgZnJtbGVuOwogCXUxNiBvZmZzZXQ7CiAJdTE2IHBhZ2U7CiAJdTggcGFkWzU2XTsKLX0gX19wYWNrZWQgaGZhMzg0eF91c2Jfcm1lbXJlcV90OworfSBfX3BhY2tlZDsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogUmVzcG9uc2UgKGJ1bGsgSU4pIHBhY2tldCBjb250ZW50cyAqLwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl9yeGZybSB7Ci0JaGZhMzg0eF9yeF9mcmFtZV90IGRlc2M7CitzdHJ1Y3QgaGZhMzg0eF91c2Jfcnhmcm0geworCXN0cnVjdCBoZmEzODR4X3J4X2ZyYW1lIGRlc2M7CiAJdTggZGF0YVtXTEFOX0RBVEFfTUFYTEVOXTsKLX0gX19wYWNrZWQgaGZhMzg0eF91c2Jfcnhmcm1fdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX2luZm9mcm0geworc3RydWN0IGhmYTM4NHhfdXNiX2luZm9mcm0gewogCXUxNiB0eXBlOwotCWhmYTM4NHhfSW5mRnJhbWVfdCBpbmZvOwotfSBfX3BhY2tlZCBoZmEzODR4X3VzYl9pbmZvZnJtX3Q7CisJc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgaW5mbzsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX3N0YXR1c3Jlc3Ageworc3RydWN0IGhmYTM4NHhfdXNiX3N0YXR1c3Jlc3AgewogCXUxNiB0eXBlOwogCXUxNiBzdGF0dXM7CiAJdTE2IHJlc3AwOwogCXUxNiByZXNwMTsKIAl1MTYgcmVzcDI7Ci19IF9fcGFja2VkIGhmYTM4NHhfdXNiX2NtZHJlc3BfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgaGZhMzg0eF91c2JfY21kcmVzcF90IGhmYTM4NHhfdXNiX3dyaWRyZXNwX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX3JyaWRyZXNwIHsKK3N0cnVjdCBoZmEzODR4X3VzYl9ycmlkcmVzcCB7CiAJdTE2IHR5cGU7CiAJdTE2IGZybWxlbjsKIAl1MTYgcmlkOwogCXU4IGRhdGFbSEZBMzg0eF9SSUREQVRBX01BWExFTl07Ci19IF9fcGFja2VkIGhmYTM4NHhfdXNiX3JyaWRyZXNwX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIGhmYTM4NHhfdXNiX2NtZHJlc3BfdCBoZmEzODR4X3VzYl93bWVtcmVzcF90OwotCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl9ybWVtcmVzcCB7CitzdHJ1Y3QgaGZhMzg0eF91c2Jfcm1lbXJlc3AgewogCXUxNiB0eXBlOwogCXUxNiBmcm1sZW47CiAJdTggZGF0YVtIRkEzODR4X1VTQl9SV01FTV9NQVhMRU5dOwotfSBfX3BhY2tlZCBoZmEzODR4X3VzYl9ybWVtcmVzcF90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2JfYnVmYXZhaWwgeworc3RydWN0IGhmYTM4NHhfdXNiX2J1ZmF2YWlsIHsKIAl1MTYgdHlwZTsKIAl1MTYgZnJtbGVuOwotfSBfX3BhY2tlZCBoZmEzODR4X3VzYl9idWZhdmFpbF90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2JfZXJyb3Igeworc3RydWN0IGhmYTM4NHhfdXNiX2Vycm9yIHsKIAl1MTYgdHlwZTsKIAl1MTYgZXJyb3J0eXBlOwotfSBfX3BhY2tlZCBoZmEzODR4X3VzYl9lcnJvcl90OworfSBfX3BhY2tlZDsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIFVuaW9ucyBmb3IgcGFja2FnaW5nIGFsbCB0aGUga25vd24gcGFja2V0IHR5cGVzIHRvZ2V0aGVyICovCiAKLXR5cGVkZWYgdW5pb24gaGZhMzg0eF91c2JvdXQgewordW5pb24gaGZhMzg0eF91c2JvdXQgewogCV9fbGUxNiB0eXBlOwotCWhmYTM4NHhfdXNiX3R4ZnJtX3QgdHhmcm07Ci0JaGZhMzg0eF91c2JfY21kcmVxX3QgY21kcmVxOwotCWhmYTM4NHhfdXNiX3dyaWRyZXFfdCB3cmlkcmVxOwotCWhmYTM4NHhfdXNiX3JyaWRyZXFfdCBycmlkcmVxOwotCWhmYTM4NHhfdXNiX3dtZW1yZXFfdCB3bWVtcmVxOwotCWhmYTM4NHhfdXNiX3JtZW1yZXFfdCBybWVtcmVxOwotfSBfX3BhY2tlZCBoZmEzODR4X3VzYm91dF90OworCXN0cnVjdCBoZmEzODR4X3VzYl90eGZybSB0eGZybTsKKwlzdHJ1Y3QgaGZhMzg0eF91c2JfY21kcmVxIGNtZHJlcTsKKwlzdHJ1Y3QgaGZhMzg0eF91c2Jfd3JpZHJlcSB3cmlkcmVxOworCXN0cnVjdCBoZmEzODR4X3VzYl9ycmlkcmVxIHJyaWRyZXE7CisJc3RydWN0IGhmYTM4NHhfdXNiX3dtZW1yZXEgd21lbXJlcTsKKwlzdHJ1Y3QgaGZhMzg0eF91c2Jfcm1lbXJlcSBybWVtcmVxOworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiB1bmlvbiBoZmEzODR4X3VzYmluIHsKK3VuaW9uIGhmYTM4NHhfdXNiaW4gewogCV9fbGUxNiB0eXBlOwotCWhmYTM4NHhfdXNiX3J4ZnJtX3Qgcnhmcm07Ci0JaGZhMzg0eF91c2JfdHhmcm1fdCB0eGZybTsKLQloZmEzODR4X3VzYl9pbmZvZnJtX3QgaW5mb2ZybTsKLQloZmEzODR4X3VzYl9jbWRyZXNwX3QgY21kcmVzcDsKLQloZmEzODR4X3VzYl93cmlkcmVzcF90IHdyaWRyZXNwOwotCWhmYTM4NHhfdXNiX3JyaWRyZXNwX3QgcnJpZHJlc3A7Ci0JaGZhMzg0eF91c2Jfd21lbXJlc3BfdCB3bWVtcmVzcDsKLQloZmEzODR4X3VzYl9ybWVtcmVzcF90IHJtZW1yZXNwOwotCWhmYTM4NHhfdXNiX2J1ZmF2YWlsX3QgYnVmYXZhaWw7Ci0JaGZhMzg0eF91c2JfZXJyb3JfdCB1c2JlcnJvcjsKKwlzdHJ1Y3QgaGZhMzg0eF91c2Jfcnhmcm0gcnhmcm07CisJc3RydWN0IGhmYTM4NHhfdXNiX3R4ZnJtIHR4ZnJtOworCXN0cnVjdCBoZmEzODR4X3VzYl9pbmZvZnJtIGluZm9mcm07CisJc3RydWN0IGhmYTM4NHhfdXNiX3N0YXR1c3Jlc3AgY21kcmVzcDsKKwlzdHJ1Y3QgaGZhMzg0eF91c2Jfc3RhdHVzcmVzcCB3cmlkcmVzcDsKKwlzdHJ1Y3QgaGZhMzg0eF91c2JfcnJpZHJlc3AgcnJpZHJlc3A7CisJc3RydWN0IGhmYTM4NHhfdXNiX3N0YXR1c3Jlc3Agd21lbXJlc3A7CisJc3RydWN0IGhmYTM4NHhfdXNiX3JtZW1yZXNwIHJtZW1yZXNwOworCXN0cnVjdCBoZmEzODR4X3VzYl9idWZhdmFpbCBidWZhdmFpbDsKKwlzdHJ1Y3QgaGZhMzg0eF91c2JfZXJyb3IgdXNiZXJyb3I7CiAJdTggYm9ndXNwYWRbMzAwMF07Ci19IF9fcGFja2VkIGhmYTM4NHhfdXNiaW5fdDsKK30gX19wYWNrZWQ7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVBEIHJlY29yZCBzdHJ1Y3R1cmVzLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICogUEQgcmVjb3JkIHN0cnVjdHVyZXMuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfcGNiX3BhcnRudW0geworc3RydWN0IGhmYTM4NHhfcGRyX3BjYl9wYXJ0bnVtIHsKIAl1OCBudW1bOF07Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX3BjYl9wYXJ0bnVtX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9wY2JfdHJhY2VudW0geworc3RydWN0IGhmYTM4NHhfcGRyX3BjYl90cmFjZW51bSB7CiAJdTggbnVtWzhdOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl9wY2JfdHJhY2VudW1fdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX25pY19zZXJpYWwgeworc3RydWN0IGhmYTM4NHhfcGRyX25pY19zZXJpYWwgewogCXU4IG51bVsxMl07Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX25pY19zZXJpYWxfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX21ra19tZWFzdXJlbWVudHMgeworc3RydWN0IGhmYTM4NHhfcGRyX21ra19tZWFzdXJlbWVudHMgewogCWRvdWJsZSBjYXJyaWVyX2ZyZXE7CiAJZG91YmxlIG9jY3VwaWVkX2JhbmQ7CiAJZG91YmxlIHBvd2VyX2RlbnNpdHk7CkBAIC05MzUsMTkyICs5NTcsMTkzIEBACiAJZG91YmxlIHJ4X3NwdXJfZjI7CiAJZG91YmxlIHJ4X3NwdXJfbDE7CiAJZG91YmxlIHJ4X3NwdXJfbDI7Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX21ra19tZWFzdXJlbWVudHNfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX25pY19yYW1zaXplIHsKK3N0cnVjdCBoZmEzODR4X3Bkcl9uaWNfcmFtc2l6ZSB7CiAJdTggc2l6ZVsxMl07CQkvKiB1bml0cyBvZiBLQiAqLwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl9uaWNfcmFtc2l6ZV90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfbWZpc3VwcmFuZ2Ugeworc3RydWN0IGhmYTM4NHhfcGRyX21maXN1cHJhbmdlIHsKIAl1MTYgaWQ7CiAJdTE2IHZhcmlhbnQ7CiAJdTE2IGJvdHRvbTsKIAl1MTYgdG9wOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl9tZmlzdXByYW5nZV90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfY2Zpc3VwcmFuZ2Ugeworc3RydWN0IGhmYTM4NHhfcGRyX2NmaXN1cHJhbmdlIHsKIAl1MTYgaWQ7CiAJdTE2IHZhcmlhbnQ7CiAJdTE2IGJvdHRvbTsKIAl1MTYgdG9wOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl9jZmlzdXByYW5nZV90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfbmljaWQgeworc3RydWN0IGhmYTM4NHhfcGRyX25pY2lkIHsKIAl1MTYgaWQ7CiAJdTE2IHZhcmlhbnQ7CiAJdTE2IG1ham9yOwogCXUxNiBtaW5vcjsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfbmljaWRfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3JlZmRhY19tZWFzdXJlbWVudHMgeworc3RydWN0IGhmYTM4NHhfcGRyX3JlZmRhY19tZWFzdXJlbWVudHMgewogCXUxNiB2YWx1ZVswXTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfcmVmZGFjX21lYXN1cmVtZW50c190OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfdmdkYWNfbWVhc3VyZW1lbnRzIHsKK3N0cnVjdCBoZmEzODR4X3Bkcl92Z2RhY19tZWFzdXJlbWVudHMgewogCXUxNiB2YWx1ZVswXTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfdmdkYWNfbWVhc3VyZW1lbnRzX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9sZXZlbF9jb21wX21lYXN1cmVtZW50cyB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfbGV2ZWxfY29tcF9tZWFzdXJlbWVudHMgewogCXUxNiB2YWx1ZVswXTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfbGV2ZWxfY29tcGNfbWVhc3VyZW1lbnRzX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9tYWNfYWRkcmVzcyB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfbWFjX2FkZHJlc3MgewogCXU4IGFkZHJbNl07Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX21hY19hZGRyZXNzX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9ta2tfY2FsbG5hbWUgeworc3RydWN0IGhmYTM4NHhfcGRyX21ra19jYWxsbmFtZSB7CiAJdTggY2FsbG5hbWVbOF07Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX21ra19jYWxsbmFtZV90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfcmVnZG9tYWluIHsKK3N0cnVjdCBoZmEzODR4X3Bkcl9yZWdkb21haW4gewogCXUxNiBudW1kb21haW5zOwogCXUxNiBkb21haW5bNV07Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX3JlZ2RvbWFpbl90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfYWxsb3dlZF9jaGFubmVsIHsKK3N0cnVjdCBoZmEzODR4X3Bkcl9hbGxvd2VkX2NoYW5uZWwgewogCXUxNiBjaF9iaXRtYXA7Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX2FsbG93ZWRfY2hhbm5lbF90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfZGVmYXVsdF9jaGFubmVsIHsKK3N0cnVjdCBoZmEzODR4X3Bkcl9kZWZhdWx0X2NoYW5uZWwgewogCXUxNiBjaGFubmVsOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl9kZWZhdWx0X2NoYW5uZWxfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3ByaXZhY3lfb3B0aW9uIHsKK3N0cnVjdCBoZmEzODR4X3Bkcl9wcml2YWN5X29wdGlvbiB7CiAJdTE2IGF2YWlsYWJsZTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfcHJpdmFjeV9vcHRpb25fdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3RlbXB0eXBlIHsKK3N0cnVjdCBoZmEzODR4X3Bkcl90ZW1wdHlwZSB7CiAJdTE2IHR5cGU7Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX3RlbXB0eXBlX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9yZWZkYWNfc2V0dXAgeworc3RydWN0IGhmYTM4NHhfcGRyX3JlZmRhY19zZXR1cCB7CiAJdTE2IGNoX3ZhbHVlWzE0XTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfcmVmZGFjX3NldHVwX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl92Z2RhY19zZXR1cCB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfdmdkYWNfc2V0dXAgewogCXUxNiBjaF92YWx1ZVsxNF07Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX3ZnZGFjX3NldHVwX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9sZXZlbF9jb21wX3NldHVwIHsKK3N0cnVjdCBoZmEzODR4X3Bkcl9sZXZlbF9jb21wX3NldHVwIHsKIAl1MTYgY2hfdmFsdWVbMTRdOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl9sZXZlbF9jb21wX3NldHVwX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl90cmltZGFjX3NldHVwIHsKK3N0cnVjdCBoZmEzODR4X3Bkcl90cmltZGFjX3NldHVwIHsKIAl1MTYgdHJpbWlkYWM7CiAJdTE2IHRyaW1xZGFjOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl90cmltZGFjX3NldHVwX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9pZnJfc2V0dGluZyB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfaWZyX3NldHRpbmcgewogCXUxNiB2YWx1ZVszXTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfaWZyX3NldHRpbmdfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3Jmcl9zZXR0aW5nIHsKK3N0cnVjdCBoZmEzODR4X3Bkcl9yZnJfc2V0dGluZyB7CiAJdTE2IHZhbHVlWzNdOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl9yZnJfc2V0dGluZ190OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9iYXNlbGluZSB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9iYXNlbGluZSB7CiAJdTE2IHZhbHVlWzUwXTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfaGZhMzg2MV9iYXNlbGluZV90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9zaGFkb3cgeworc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfc2hhZG93IHsKIAl1MzIgdmFsdWVbMzJdOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl9oZmEzODYxX3NoYWRvd190OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9pZnJmIHsKK3N0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX2lmcmYgewogCXUzMiB2YWx1ZVsyMF07Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX2hmYTM4NjFfaWZyZl90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9jaGNhbHNwIHsKK3N0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX2NoY2Fsc3AgewogCXUxNiB2YWx1ZVsxNF07Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX2hmYTM4NjFfY2hjYWxzcF90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9jaGNhbGkgeworc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfY2hjYWxpIHsKIAl1MTYgdmFsdWVbMTddOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl9oZmEzODYxX2NoY2FsaV90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9uaWNfY29uZmlnIHsKK3N0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX25pY19jb25maWcgewogCXUxNiBjb25maWdfYml0bWFwOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl9uaWNfY29uZmlnX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZm9fZGVsYXkgeworc3RydWN0IGhmYTM4NHhfcGRyX2hmb19kZWxheSB7CiAJdTggaGZvX2RlbGF5OwotfSBfX3BhY2tlZCBoZmEzODR4X2hmb19kZWxheV90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9tYW5mX3Rlc3RzcCB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9tYW5mX3Rlc3RzcCB7CiAJdTE2IHZhbHVlWzMwXTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfaGZhMzg2MV9tYW5mX3Rlc3RzcF90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9tYW5mX3Rlc3RpIHsKK3N0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX21hbmZfdGVzdGkgewogCXUxNiB2YWx1ZVszMF07Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX2hmYTM4NjFfbWFuZl90ZXN0aV90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9lbmRfb2ZfcGRhIHsKK3N0cnVjdCBoZmEzODR4X3Bkcl9lbmRfb2ZfcGRhIHsKIAl1MTYgY3JjOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl9lbmRfb2ZfcGRhX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3BkcmVjIHsKK3N0cnVjdCBoZmEzODR4X3BkcmVjIHsKIAl1MTYgbGVuOwkJLyogaW4gd29yZHMgKi8KIAl1MTYgY29kZTsKIAl1bmlvbiBwZHIgewotCQloZmEzODR4X3Bkcl9wY2JfcGFydG51bV90IHBjYl9wYXJ0bnVtOwotCQloZmEzODR4X3Bkcl9wY2JfdHJhY2VudW1fdCBwY2JfdHJhY2VudW07Ci0JCWhmYTM4NHhfcGRyX25pY19zZXJpYWxfdCBuaWNfc2VyaWFsOwotCQloZmEzODR4X3Bkcl9ta2tfbWVhc3VyZW1lbnRzX3QgbWtrX21lYXN1cmVtZW50czsKLQkJaGZhMzg0eF9wZHJfbmljX3JhbXNpemVfdCBuaWNfcmFtc2l6ZTsKLQkJaGZhMzg0eF9wZHJfbWZpc3VwcmFuZ2VfdCBtZmlzdXByYW5nZTsKLQkJaGZhMzg0eF9wZHJfY2Zpc3VwcmFuZ2VfdCBjZmlzdXByYW5nZTsKLQkJaGZhMzg0eF9wZHJfbmljaWRfdCBuaWNpZDsKLQkJaGZhMzg0eF9wZHJfcmVmZGFjX21lYXN1cmVtZW50c190IHJlZmRhY19tZWFzdXJlbWVudHM7Ci0JCWhmYTM4NHhfcGRyX3ZnZGFjX21lYXN1cmVtZW50c190IHZnZGFjX21lYXN1cmVtZW50czsKLQkJaGZhMzg0eF9wZHJfbGV2ZWxfY29tcGNfbWVhc3VyZW1lbnRzX3QgbGV2ZWxfY29tcGNfbWVhc3VyZW1lbnRzOwotCQloZmEzODR4X3Bkcl9tYWNfYWRkcmVzc190IG1hY19hZGRyZXNzOwotCQloZmEzODR4X3Bkcl9ta2tfY2FsbG5hbWVfdCBta2tfY2FsbG5hbWU7Ci0JCWhmYTM4NHhfcGRyX3JlZ2RvbWFpbl90IHJlZ2RvbWFpbjsKLQkJaGZhMzg0eF9wZHJfYWxsb3dlZF9jaGFubmVsX3QgYWxsb3dlZF9jaGFubmVsOwotCQloZmEzODR4X3Bkcl9kZWZhdWx0X2NoYW5uZWxfdCBkZWZhdWx0X2NoYW5uZWw7Ci0JCWhmYTM4NHhfcGRyX3ByaXZhY3lfb3B0aW9uX3QgcHJpdmFjeV9vcHRpb247Ci0JCWhmYTM4NHhfcGRyX3RlbXB0eXBlX3QgdGVtcHR5cGU7Ci0JCWhmYTM4NHhfcGRyX3JlZmRhY19zZXR1cF90IHJlZmRhY19zZXR1cDsKLQkJaGZhMzg0eF9wZHJfdmdkYWNfc2V0dXBfdCB2Z2RhY19zZXR1cDsKLQkJaGZhMzg0eF9wZHJfbGV2ZWxfY29tcF9zZXR1cF90IGxldmVsX2NvbXBfc2V0dXA7Ci0JCWhmYTM4NHhfcGRyX3RyaW1kYWNfc2V0dXBfdCB0cmltZGFjX3NldHVwOwotCQloZmEzODR4X3Bkcl9pZnJfc2V0dGluZ190IGlmcl9zZXR0aW5nOwotCQloZmEzODR4X3Bkcl9yZnJfc2V0dGluZ190IHJmcl9zZXR0aW5nOwotCQloZmEzODR4X3Bkcl9oZmEzODYxX2Jhc2VsaW5lX3QgaGZhMzg2MV9iYXNlbGluZTsKLQkJaGZhMzg0eF9wZHJfaGZhMzg2MV9zaGFkb3dfdCBoZmEzODYxX3NoYWRvdzsKLQkJaGZhMzg0eF9wZHJfaGZhMzg2MV9pZnJmX3QgaGZhMzg2MV9pZnJmOwotCQloZmEzODR4X3Bkcl9oZmEzODYxX2NoY2Fsc3BfdCBoZmEzODYxX2NoY2Fsc3A7Ci0JCWhmYTM4NHhfcGRyX2hmYTM4NjFfY2hjYWxpX3QgaGZhMzg2MV9jaGNhbGk7Ci0JCWhmYTM4NHhfcGRyX25pY19jb25maWdfdCBuaWNfY29uZmlnOwotCQloZmEzODR4X2hmb19kZWxheV90IGhmb19kZWxheTsKLQkJaGZhMzg0eF9wZHJfaGZhMzg2MV9tYW5mX3Rlc3RzcF90IGhmYTM4NjFfbWFuZl90ZXN0c3A7Ci0JCWhmYTM4NHhfcGRyX2hmYTM4NjFfbWFuZl90ZXN0aV90IGhmYTM4NjFfbWFuZl90ZXN0aTsKLQkJaGZhMzg0eF9wZHJfZW5kX29mX3BkYV90IGVuZF9vZl9wZGE7CisJCXN0cnVjdCBoZmEzODR4X3Bkcl9wY2JfcGFydG51bSBwY2JfcGFydG51bTsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX3BjYl90cmFjZW51bSBwY2JfdHJhY2VudW07CisJCXN0cnVjdCBoZmEzODR4X3Bkcl9uaWNfc2VyaWFsIG5pY19zZXJpYWw7CisJCXN0cnVjdCBoZmEzODR4X3Bkcl9ta2tfbWVhc3VyZW1lbnRzIG1ra19tZWFzdXJlbWVudHM7CisJCXN0cnVjdCBoZmEzODR4X3Bkcl9uaWNfcmFtc2l6ZSBuaWNfcmFtc2l6ZTsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX21maXN1cHJhbmdlIG1maXN1cHJhbmdlOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfY2Zpc3VwcmFuZ2UgY2Zpc3VwcmFuZ2U7CisJCXN0cnVjdCBoZmEzODR4X3Bkcl9uaWNpZCBuaWNpZDsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX3JlZmRhY19tZWFzdXJlbWVudHMgcmVmZGFjX21lYXN1cmVtZW50czsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX3ZnZGFjX21lYXN1cmVtZW50cyB2Z2RhY19tZWFzdXJlbWVudHM7CisJCXN0cnVjdCBoZmEzODR4X3Bkcl9sZXZlbF9jb21wX21lYXN1cmVtZW50cyBsZXZlbF9jb21wY19tZWFzdXJlbWVudHM7CisJCXN0cnVjdCBoZmEzODR4X3Bkcl9tYWNfYWRkcmVzcyBtYWNfYWRkcmVzczsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX21ra19jYWxsbmFtZSBta2tfY2FsbG5hbWU7CisJCXN0cnVjdCBoZmEzODR4X3Bkcl9yZWdkb21haW4gcmVnZG9tYWluOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfYWxsb3dlZF9jaGFubmVsIGFsbG93ZWRfY2hhbm5lbDsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX2RlZmF1bHRfY2hhbm5lbCBkZWZhdWx0X2NoYW5uZWw7CisJCXN0cnVjdCBoZmEzODR4X3Bkcl9wcml2YWN5X29wdGlvbiBwcml2YWN5X29wdGlvbjsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX3RlbXB0eXBlIHRlbXB0eXBlOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfcmVmZGFjX3NldHVwIHJlZmRhY19zZXR1cDsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX3ZnZGFjX3NldHVwIHZnZGFjX3NldHVwOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfbGV2ZWxfY29tcF9zZXR1cCBsZXZlbF9jb21wX3NldHVwOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfdHJpbWRhY19zZXR1cCB0cmltZGFjX3NldHVwOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfaWZyX3NldHRpbmcgaWZyX3NldHRpbmc7CisJCXN0cnVjdCBoZmEzODR4X3Bkcl9yZnJfc2V0dGluZyByZnJfc2V0dGluZzsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfYmFzZWxpbmUgaGZhMzg2MV9iYXNlbGluZTsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfc2hhZG93IGhmYTM4NjFfc2hhZG93OworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9pZnJmIGhmYTM4NjFfaWZyZjsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfY2hjYWxzcCBoZmEzODYxX2NoY2Fsc3A7CisJCXN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX2NoY2FsaSBoZmEzODYxX2NoY2FsaTsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfbmljX2NvbmZpZyBuaWNfY29uZmlnOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZvX2RlbGF5IGhmb19kZWxheTsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfbWFuZl90ZXN0c3AgaGZhMzg2MV9tYW5mX3Rlc3RzcDsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfbWFuZl90ZXN0aSBoZmEzODYxX21hbmZfdGVzdGk7CisJCXN0cnVjdCBoZmEzODR4X3Bkcl9lbmRfb2ZfcGRhIGVuZF9vZl9wZGE7CiAKIAl9IGRhdGE7Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyZWNfdDsKK30gX19wYWNrZWQ7CiAKICNpZmRlZiBfX0tFUk5FTF9fCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tLS0gIE1BQyBzdGF0ZSBzdHJ1Y3R1cmUsIGFyZ3VtZW50IHRvIGFsbCBmdW5jdGlvbnMgLS0KLS0tLSAgQWxzbywgYSBjb2xsZWN0aW9uIG9mIHN1cHBvcnQgdHlwZXMgLS0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfc3RhdHVzcmVzdWx0IHsKKyAqIC0tLSAgTUFDIHN0YXRlIHN0cnVjdHVyZSwgYXJndW1lbnQgdG8gYWxsIGZ1bmN0aW9ucyAtLQorICogLS0tICBBbHNvLCBhIGNvbGxlY3Rpb24gb2Ygc3VwcG9ydCB0eXBlcyAtLQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdHJ1Y3QgaGZhMzg0eF9jbWRyZXN1bHQgewogCXUxNiBzdGF0dXM7CiAJdTE2IHJlc3AwOwogCXUxNiByZXNwMTsKIAl1MTYgcmVzcDI7Ci19IGhmYTM4NHhfY21kcmVzdWx0X3Q7Cit9OwogCiAvKiBVU0IgQ29udHJvbCBFeGNoYW5nZSAoQ1RMWCk6CiAgKiAgQSBxdWV1ZSBvZiB0aGUgc3RydWN0dXJlIGJlbG93IGlzIG1haW50YWluZWQgZm9yIGFsbCBvZiB0aGUKQEAgLTExMjksMTEgKzExNTIsMTEgQEAKIC8qIFRoZSBmb2xsb3dpbmcgaGZhMzg0eF8qIHN0cnVjdHVyZXMgYXJlIGFyZ3VtZW50cyB0bwogICogdGhlIHVzZXJjYigpIGZvciB0aGUgZGlmZmVyZW50IENUTFggdHlwZXMuCiAgKi8KLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcnJpZHJlc3VsdCB7CitzdHJ1Y3QgaGZhMzg0eF9ycmlkcmVzdWx0IHsKIAl1MTYgcmlkOwogCWNvbnN0IHZvaWQgKnJpZGRhdGE7CiAJdW5zaWduZWQgaW50IHJpZGRhdGFfbGVuOwotfSBoZmEzODR4X3JyaWRyZXN1bHRfdDsKK307CiAKIGVudW0gY3RseF9zdGF0ZSB7CiAJQ1RMWF9TVEFSVCA9IDAsCQkvKiBTdGFydCBzdGF0ZSwgbm90IHF1ZXVlZCAqLwpAQCAtMTE1NiwxMiArMTE3OSwxMiBAQAogdHlwZWRlZiB2b2lkICgqY3RseF91c2VyY2JfdCkgKHN0cnVjdCBoZmEzODR4ICpodywKIAkJCSAgICAgICB2b2lkICpjdGx4cmVzdWx0LCB2b2lkICp1c2VyY2JfZGF0YSk7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiY3RseCB7CitzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAKIAlzaXplX3Qgb3V0YnVmc2l6ZTsKLQloZmEzODR4X3VzYm91dF90IG91dGJ1ZjsJLyogcGt0IGJ1ZiBmb3IgT1VUICovCi0JaGZhMzg0eF91c2Jpbl90IGluYnVmOwkvKiBwa3QgYnVmIGZvciBJTihhIGNvcHkpICovCisJdW5pb24gaGZhMzg0eF91c2JvdXQgb3V0YnVmOwkvKiBwa3QgYnVmIGZvciBPVVQgKi8KKwl1bmlvbiBoZmEzODR4X3VzYmluIGluYnVmOwkvKiBwa3QgYnVmIGZvciBJTihhIGNvcHkpICovCiAKIAlDVExYX1NUQVRFIHN0YXRlOwkvKiBUcmFja3MgcnVubmluZyBzdGF0ZSAqLwogCkBAIC0xMTczLDI1ICsxMTk2LDI1IEBACiAJdm9pZCAqdXNlcmNiX2RhdGE7CS8qICBhdCBDVExYIGNvbXBsZXRpb24gICovCiAKIAlpbnQgdmFyaWFudDsJCS8qIElkZW50aWZpZXMgY21kIHZhcmlhbnQgKi8KLX0gaGZhMzg0eF91c2JjdGx4X3Q7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYmN0bHhxIHsKK3N0cnVjdCBoZmEzODR4X3VzYmN0bHhxIHsKIAlzcGlubG9ja190IGxvY2s7CiAJc3RydWN0IGxpc3RfaGVhZCBwZW5kaW5nOwogCXN0cnVjdCBsaXN0X2hlYWQgYWN0aXZlOwogCXN0cnVjdCBsaXN0X2hlYWQgY29tcGxldGluZzsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHJlYXBhYmxlOwotfSBoZmEzODR4X3VzYmN0bHhxX3Q7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBoZmE0ODR4X21ldGFjbWQgeworc3RydWN0IGhmYTM4NHhfbWV0YWNtZCB7CiAJdTE2IGNtZDsKIAogCXUxNiBwYXJtMDsKIAl1MTYgcGFybTE7CiAJdTE2IHBhcm0yOwogCi0JaGZhMzg0eF9jbWRyZXN1bHRfdCByZXN1bHQ7Ci19IGhmYTM4NHhfbWV0YWNtZF90OworCXN0cnVjdCBoZmEzODR4X2NtZHJlc3VsdCByZXN1bHQ7Cit9OwogCiAjZGVmaW5lCU1BWF9HUlBfQUREUgkJMzIKICNkZWZpbmUgV0xBTl9DT01NRU5UX01BWAk4MCAgLyogTWF4LiBsZW5ndGggb2YgdXNlciBjb21tZW50IHN0cmluZy4gKi8KQEAgLTEyMTgsMTUgKzEyNDEsMTUgQEAKIAl1OCBhZGRyMVtXTEFOX0FDQ0VTU19NQVhdW0VUSF9BTEVOXTsKIH07CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHggeworc3RydWN0IGhmYTM4NHggewogCS8qIFVTQiBzdXBwb3J0IGRhdGEgKi8KIAlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiOwogCXN0cnVjdCB1cmIgcnhfdXJiOwogCXN0cnVjdCBza19idWZmICpyeF91cmJfc2tiOwogCXN0cnVjdCB1cmIgdHhfdXJiOwogCXN0cnVjdCB1cmIgY3RseF91cmI7Ci0JaGZhMzg0eF91c2JvdXRfdCB0eGJ1ZmY7Ci0JaGZhMzg0eF91c2JjdGx4cV90IGN0bHhxOworCXVuaW9uIGhmYTM4NHhfdXNib3V0IHR4YnVmZjsKKwlzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4cSBjdGx4cTsKIAlzdHJ1Y3QgdGltZXJfbGlzdCByZXF0aW1lcjsKIAlzdHJ1Y3QgdGltZXJfbGlzdCByZXNwdGltZXI7CiAKQEAgLTEyNjUsMjAgKzEyODgsMjAgQEAKIAogCS8qIERvd25sb2FkIHN1cHBvcnQgKi8KIAl1bnNpZ25lZCBpbnQgZGxzdGF0ZTsKLQloZmEzODR4X2Rvd25sb2FkYnVmZmVyX3QgYnVmaW5mbzsKKwlzdHJ1Y3QgaGZhMzg0eF9kb3dubG9hZGJ1ZmZlciBidWZpbmZvOwogCXUxNiBkbHRpbWVvdXQ7CiAKIAlpbnQgc2NhbmZsYWc7CQkvKiB0byBzaWduYWwgc2NhbiBjb21wbGV0ZSAqLwogCWludCBqb2luX2FwOwkJLyogYXJlIHdlIGpvaW5lZCB0byBhIHNwZWNpZmljIGFwICovCiAJaW50IGpvaW5fcmV0cmllczsJLyogbnVtYmVyIG9mIGpvaW4gcmV0cmllcyB0aWxsIHdlIGZhaWwgKi8KLQloZmEzODR4X0pvaW5SZXF1ZXN0X2RhdGFfdCBqb2lucmVxOwkvKiBqb2luIHJlcXVlc3Qgc2F2ZWQgZGF0YSAqLworCXN0cnVjdCBoZmEzODR4X0pvaW5SZXF1ZXN0X2RhdGEgam9pbnJlcTsJLyogam9pbiByZXF1ZXN0IHNhdmVkIGRhdGEgKi8KIAotCXdsYW5kZXZpY2VfdCAqd2xhbmRldjsKKwlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldjsKIAkvKiBUaW1lciB0byBhbGxvdyBmb3IgdGhlIGRlZmVycmVkIHByb2Nlc3Npbmcgb2YgbGlua3N0YXR1cyBtZXNzYWdlcyAqLwogCXN0cnVjdCB3b3JrX3N0cnVjdCBsaW5rX2JoOwogCiAJc3RydWN0IHdvcmtfc3RydWN0IGNvbW1zcXVhbF9iaDsKLQloZmEzODR4X2NvbW1zcXVhbGl0eV90IHF1YWw7CisJc3RydWN0IGhmYTM4NHhfY29tbXNxdWFsaXR5IHF1YWw7CiAJc3RydWN0IHRpbWVyX2xpc3QgY29tbXNxdWFsX3RpbWVyOwogCiAJdTE2IGxpbmtfc3RhdHVzOwpAQCAtMTI5Nyw5MiArMTMyMCw5MyBAQAogCWludCBkYm1hZGp1c3Q7CiAKIAkvKiBHcm91cCBBZGRyZXNzZXMgLSByaWdodCBub3csIHRoZXJlIGFyZSB1cCB0byBhIHRvdGFsCi0JICAgb2YgTUFYX0dSUF9BRERSIGdyb3VwIGFkZHJlc3NlcyAqLworCSAqIG9mIE1BWF9HUlBfQUREUiBncm91cCBhZGRyZXNzZXMKKwkgKi8KIAl1OCBkb3QxMV9ncnBfYWRkcltNQVhfR1JQX0FERFJdW0VUSF9BTEVOXTsKIAl1bnNpZ25lZCBpbnQgZG90MTFfZ3JwY250OwogCiAJLyogQ29tcG9uZW50IElkZW50aXRpZXMgKi8KLQloZmEzODR4X2NvbXBpZGVudF90IGlkZW50X25pYzsKLQloZmEzODR4X2NvbXBpZGVudF90IGlkZW50X3ByaV9mdzsKLQloZmEzODR4X2NvbXBpZGVudF90IGlkZW50X3N0YV9mdzsKLQloZmEzODR4X2NvbXBpZGVudF90IGlkZW50X2FwX2Z3OworCXN0cnVjdCBoZmEzODR4X2NvbXBpZGVudCBpZGVudF9uaWM7CisJc3RydWN0IGhmYTM4NHhfY29tcGlkZW50IGlkZW50X3ByaV9mdzsKKwlzdHJ1Y3QgaGZhMzg0eF9jb21waWRlbnQgaWRlbnRfc3RhX2Z3OworCXN0cnVjdCBoZmEzODR4X2NvbXBpZGVudCBpZGVudF9hcF9mdzsKIAl1MTYgbW1fbW9kczsKIAogCS8qIFN1cHBsaWVyIGNvbXBhdGliaWxpdHkgcmFuZ2VzICovCi0JaGZhMzg0eF9jYXBsZXZlbF90IGNhcF9zdXBfbWZpOwotCWhmYTM4NHhfY2FwbGV2ZWxfdCBjYXBfc3VwX2NmaTsKLQloZmEzODR4X2NhcGxldmVsX3QgY2FwX3N1cF9wcmk7Ci0JaGZhMzg0eF9jYXBsZXZlbF90IGNhcF9zdXBfc3RhOwotCWhmYTM4NHhfY2FwbGV2ZWxfdCBjYXBfc3VwX2FwOworCXN0cnVjdCBoZmEzODR4X2NhcGxldmVsIGNhcF9zdXBfbWZpOworCXN0cnVjdCBoZmEzODR4X2NhcGxldmVsIGNhcF9zdXBfY2ZpOworCXN0cnVjdCBoZmEzODR4X2NhcGxldmVsIGNhcF9zdXBfcHJpOworCXN0cnVjdCBoZmEzODR4X2NhcGxldmVsIGNhcF9zdXBfc3RhOworCXN0cnVjdCBoZmEzODR4X2NhcGxldmVsIGNhcF9zdXBfYXA7CiAKIAkvKiBBY3RvciBjb21wYXRpYmlsaXR5IHJhbmdlcyAqLwotCWhmYTM4NHhfY2FwbGV2ZWxfdCBjYXBfYWN0X3ByaV9jZmk7CS8qCi0JCQkJCQkgKiBwcmkgZi93IHRvIGNvbnRyb2xsZXIKLQkJCQkJCSAqIGludGVyZmFjZQotCQkJCQkJICovCisJc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwgY2FwX2FjdF9wcmlfY2ZpOyAvKgorCQkJCQkJICAqIHByaSBmL3cgdG8gY29udHJvbGxlcgorCQkJCQkJICAqIGludGVyZmFjZQorCQkJCQkJICAqLwogCi0JaGZhMzg0eF9jYXBsZXZlbF90IGNhcF9hY3Rfc3RhX2NmaTsJLyoKLQkJCQkJCSAqIHN0YSBmL3cgdG8gY29udHJvbGxlcgotCQkJCQkJICogaW50ZXJmYWNlCi0JCQkJCQkgKi8KKwlzdHJ1Y3QgaGZhMzg0eF9jYXBsZXZlbCBjYXBfYWN0X3N0YV9jZmk7IC8qCisJCQkJCQkgICogc3RhIGYvdyB0byBjb250cm9sbGVyCisJCQkJCQkgICogaW50ZXJmYWNlCisJCQkJCQkgICovCiAKLQloZmEzODR4X2NhcGxldmVsX3QgY2FwX2FjdF9zdGFfbWZpOwkvKiBzdGEgZi93IHRvIG1vZGVtIGludGVyZmFjZSAqLworCXN0cnVjdCBoZmEzODR4X2NhcGxldmVsIGNhcF9hY3Rfc3RhX21maTsgLyogc3RhIGYvdyB0byBtb2RlbSBpbnRlcmZhY2UgKi8KIAotCWhmYTM4NHhfY2FwbGV2ZWxfdCBjYXBfYWN0X2FwX2NmaTsJLyoKKwlzdHJ1Y3QgaGZhMzg0eF9jYXBsZXZlbCBjYXBfYWN0X2FwX2NmaTsJLyoKIAkJCQkJCSAqIGFwIGYvdyB0byBjb250cm9sbGVyCiAJCQkJCQkgKiBpbnRlcmZhY2UKIAkJCQkJCSAqLwogCi0JaGZhMzg0eF9jYXBsZXZlbF90IGNhcF9hY3RfYXBfbWZpOwkvKiBhcCBmL3cgdG8gbW9kZW0gaW50ZXJmYWNlICovCisJc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwgY2FwX2FjdF9hcF9tZmk7CS8qIGFwIGYvdyB0byBtb2RlbSBpbnRlcmZhY2UgKi8KIAogCXUzMiBwc3VzZXJjb3VudDsJLyogUG93ZXIgc2F2ZSB1c2VyIGNvdW50LiAqLwotCWhmYTM4NHhfQ29tbVRhbGxpZXMzMl90IHRhbGxpZXM7CS8qIENvbW11bmljYXRpb24gdGFsbGllcy4gKi8KKwlzdHJ1Y3QgaGZhMzg0eF9Db21tVGFsbGllczMyIHRhbGxpZXM7CS8qIENvbW11bmljYXRpb24gdGFsbGllcy4gKi8KIAl1OCBjb21tZW50W1dMQU5fQ09NTUVOVF9NQVggKyAxXTsJLyogVXNlciBjb21tZW50ICovCiAKIAkvKiBDaGFubmVsIEluZm8gcmVxdWVzdCByZXN1bHRzIChBUCBvbmx5KSAqLwogCXN0cnVjdCB7CiAJCWF0b21pY190IGRvbmU7CiAJCXU4IGNvdW50OwotCQloZmEzODR4X0NoSW5mb1Jlc3VsdF90IHJlc3VsdHM7CisJCXN0cnVjdCBoZmEzODR4X0NoSW5mb1Jlc3VsdCByZXN1bHRzOwogCX0gY2hhbm5lbF9pbmZvOwogCi0JaGZhMzg0eF9JbmZGcmFtZV90ICpzY2FucmVzdWx0czsKKwlzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqc2NhbnJlc3VsdHM7CiAKIAlzdHJ1Y3QgcHJpc20yc3RhX2F1dGhsaXN0IGF1dGhsaXN0OwkvKiBBdXRoZW50aWNhdGVkIHN0YXRpb24gbGlzdC4gKi8KIAl1bnNpZ25lZCBpbnQgYWNjZXNzbW9kZTsJCS8qIEFjY2VzcyBtb2RlLiAqLwogCXN0cnVjdCBwcmlzbTJzdGFfYWNjZXNzbGlzdCBhbGxvdzsJLyogQWxsb3dlZCBzdGF0aW9uIGxpc3QuICovCiAJc3RydWN0IHByaXNtMnN0YV9hY2Nlc3NsaXN0IGRlbnk7CS8qIERlbmllZCBzdGF0aW9uIGxpc3QuICovCiAKLX0gaGZhMzg0eF90OworfTsKIAotdm9pZCBoZmEzODR4X2NyZWF0ZShoZmEzODR4X3QgKmh3LCBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiKTsKLXZvaWQgaGZhMzg0eF9kZXN0cm95KGhmYTM4NHhfdCAqaHcpOwordm9pZCBoZmEzODR4X2NyZWF0ZShzdHJ1Y3QgaGZhMzg0eCAqaHcsIHN0cnVjdCB1c2JfZGV2aWNlICp1c2IpOwordm9pZCBoZmEzODR4X2Rlc3Ryb3koc3RydWN0IGhmYTM4NHggKmh3KTsKIAogaW50Ci1oZmEzODR4X2NvcmVyZXNldChoZmEzODR4X3QgKmh3LCBpbnQgaG9sZHRpbWUsIGludCBzZXR0bGV0aW1lLCBpbnQgZ2VuZXNpcyk7Ci1pbnQgaGZhMzg0eF9kcnZyX2Rpc2FibGUoaGZhMzg0eF90ICpodywgdTE2IG1hY3BvcnQpOwotaW50IGhmYTM4NHhfZHJ2cl9lbmFibGUoaGZhMzg0eF90ICpodywgdTE2IG1hY3BvcnQpOwotaW50IGhmYTM4NHhfZHJ2cl9mbGFzaGRsX2VuYWJsZShoZmEzODR4X3QgKmh3KTsKLWludCBoZmEzODR4X2RydnJfZmxhc2hkbF9kaXNhYmxlKGhmYTM4NHhfdCAqaHcpOwotaW50IGhmYTM4NHhfZHJ2cl9mbGFzaGRsX3dyaXRlKGhmYTM4NHhfdCAqaHcsIHUzMiBkYWRkciwgdm9pZCAqYnVmLCB1MzIgbGVuKTsKLWludCBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGhmYTM4NHhfdCAqaHcsIHUxNiByaWQsIHZvaWQgKmJ1ZiwgdTE2IGxlbik7Ci1pbnQgaGZhMzg0eF9kcnZyX3JhbWRsX2VuYWJsZShoZmEzODR4X3QgKmh3LCB1MzIgZXhlYWRkcik7Ci1pbnQgaGZhMzg0eF9kcnZyX3JhbWRsX2Rpc2FibGUoaGZhMzg0eF90ICpodyk7Ci1pbnQgaGZhMzg0eF9kcnZyX3JhbWRsX3dyaXRlKGhmYTM4NHhfdCAqaHcsIHUzMiBkYWRkciwgdm9pZCAqYnVmLCB1MzIgbGVuKTsKLWludCBoZmEzODR4X2RydnJfcmVhZHBkYShoZmEzODR4X3QgKmh3LCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pOwotaW50IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaGZhMzg0eF90ICpodywgdTE2IHJpZCwgdm9pZCAqYnVmLCB1MTYgbGVuKTsKK2hmYTM4NHhfY29yZXJlc2V0KHN0cnVjdCBoZmEzODR4ICpodywgaW50IGhvbGR0aW1lLCBpbnQgc2V0dGxldGltZSwgaW50IGdlbmVzaXMpOworaW50IGhmYTM4NHhfZHJ2cl9kaXNhYmxlKHN0cnVjdCBoZmEzODR4ICpodywgdTE2IG1hY3BvcnQpOworaW50IGhmYTM4NHhfZHJ2cl9lbmFibGUoc3RydWN0IGhmYTM4NHggKmh3LCB1MTYgbWFjcG9ydCk7CitpbnQgaGZhMzg0eF9kcnZyX2ZsYXNoZGxfZW5hYmxlKHN0cnVjdCBoZmEzODR4ICpodyk7CitpbnQgaGZhMzg0eF9kcnZyX2ZsYXNoZGxfZGlzYWJsZShzdHJ1Y3QgaGZhMzg0eCAqaHcpOworaW50IGhmYTM4NHhfZHJ2cl9mbGFzaGRsX3dyaXRlKHN0cnVjdCBoZmEzODR4ICpodywgdTMyIGRhZGRyLCB2b2lkICpidWYsIHUzMiBsZW4pOworaW50IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoc3RydWN0IGhmYTM4NHggKmh3LCB1MTYgcmlkLCB2b2lkICpidWYsIHUxNiBsZW4pOworaW50IGhmYTM4NHhfZHJ2cl9yYW1kbF9lbmFibGUoc3RydWN0IGhmYTM4NHggKmh3LCB1MzIgZXhlYWRkcik7CitpbnQgaGZhMzg0eF9kcnZyX3JhbWRsX2Rpc2FibGUoc3RydWN0IGhmYTM4NHggKmh3KTsKK2ludCBoZmEzODR4X2RydnJfcmFtZGxfd3JpdGUoc3RydWN0IGhmYTM4NHggKmh3LCB1MzIgZGFkZHIsIHZvaWQgKmJ1ZiwgdTMyIGxlbik7CitpbnQgaGZhMzg0eF9kcnZyX3JlYWRwZGEoc3RydWN0IGhmYTM4NHggKmh3LCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pOworaW50IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoc3RydWN0IGhmYTM4NHggKmh3LCB1MTYgcmlkLCB2b2lkICpidWYsIHUxNiBsZW4pOwogCi1zdGF0aWMgaW5saW5lIGludCBoZmEzODR4X2RydnJfZ2V0Y29uZmlnMTYoaGZhMzg0eF90ICpodywgdTE2IHJpZCwgdm9pZCAqdmFsKQorc3RhdGljIGlubGluZSBpbnQgaGZhMzg0eF9kcnZyX2dldGNvbmZpZzE2KHN0cnVjdCBoZmEzODR4ICpodywgdTE2IHJpZCwgdm9pZCAqdmFsKQogewogCWludCByZXN1bHQgPSAwOwogCiAJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgcmlkLCB2YWwsIHNpemVvZih1MTYpKTsKIAlpZiAocmVzdWx0ID09IDApCi0JCSooKHUxNiAqKSB2YWwpID0gbGUxNl90b19jcHUoKigodTE2ICopIHZhbCkpOworCQkqKCh1MTYgKil2YWwpID0gbGUxNl90b19jcHUoKigodTE2ICopdmFsKSk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2KGhmYTM4NHhfdCAqaHcsIHUxNiByaWQsIHUxNiB2YWwpCitzdGF0aWMgaW5saW5lIGludCBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoc3RydWN0IGhmYTM4NHggKmh3LCB1MTYgcmlkLCB1MTYgdmFsKQogewogCXUxNiB2YWx1ZSA9IGNwdV90b19sZTE2KHZhbCk7CiAKQEAgLTEzOTAsMTMgKzE0MTQsMTMgQEAKIH0KIAogaW50Ci1oZmEzODR4X2RydnJfc2V0Y29uZmlnX2FzeW5jKGhmYTM4NHhfdCAqaHcsCitoZmEzODR4X2RydnJfc2V0Y29uZmlnX2FzeW5jKHN0cnVjdCBoZmEzODR4ICpodywKIAkJCSAgICAgdTE2IHJpZCwKIAkJCSAgICAgdm9pZCAqYnVmLAogCQkJICAgICB1MTYgbGVuLCBjdGx4X3VzZXJjYl90IHVzZXJjYiwgdm9pZCAqdXNlcmNiX2RhdGEpOwogCiBzdGF0aWMgaW5saW5lIGludAotaGZhMzg0eF9kcnZyX3NldGNvbmZpZzE2X2FzeW5jKGhmYTM4NHhfdCAqaHcsIHUxNiByaWQsIHUxNiB2YWwpCitoZmEzODR4X2RydnJfc2V0Y29uZmlnMTZfYXN5bmMoc3RydWN0IGhmYTM4NHggKmh3LCB1MTYgcmlkLCB1MTYgdmFsKQogewogCXUxNiB2YWx1ZSA9IGNwdV90b19sZTE2KHZhbCk7CiAKQEAgLTE0MDQsMjEgKzE0MjgsMjEgQEAKIAkJCQkJICAgIE5VTEwsIE5VTEwpOwogfQogCi1pbnQgaGZhMzg0eF9kcnZyX3N0YXJ0KGhmYTM4NHhfdCAqaHcpOwotaW50IGhmYTM4NHhfZHJ2cl9zdG9wKGhmYTM4NHhfdCAqaHcpOworaW50IGhmYTM4NHhfZHJ2cl9zdGFydChzdHJ1Y3QgaGZhMzg0eCAqaHcpOworaW50IGhmYTM4NHhfZHJ2cl9zdG9wKHN0cnVjdCBoZmEzODR4ICpodyk7CiBpbnQKLWhmYTM4NHhfZHJ2cl90eGZyYW1lKGhmYTM4NHhfdCAqaHcsIHN0cnVjdCBza19idWZmICpza2IsCitoZmEzODR4X2RydnJfdHhmcmFtZShzdHJ1Y3QgaGZhMzg0eCAqaHcsIHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgICAgdW5pb24gcDgwMjExX2hkciAqcDgwMjExX2hkciwKIAkJICAgICBzdHJ1Y3QgcDgwMjExX21ldGF3ZXAgKnA4MDIxMV93ZXApOwotdm9pZCBoZmEzODR4X3R4X3RpbWVvdXQod2xhbmRldmljZV90ICp3bGFuZGV2KTsKK3ZvaWQgaGZhMzg0eF90eF90aW1lb3V0KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KTsKIAotaW50IGhmYTM4NHhfY21kX2luaXRpYWxpemUoaGZhMzg0eF90ICpodyk7Ci1pbnQgaGZhMzg0eF9jbWRfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIHUxNiBtYWNwb3J0KTsKLWludCBoZmEzODR4X2NtZF9kaXNhYmxlKGhmYTM4NHhfdCAqaHcsIHUxNiBtYWNwb3J0KTsKLWludCBoZmEzODR4X2NtZF9hbGxvY2F0ZShoZmEzODR4X3QgKmh3LCB1MTYgbGVuKTsKLWludCBoZmEzODR4X2NtZF9tb25pdG9yKGhmYTM4NHhfdCAqaHcsIHUxNiBlbmFibGUpOworaW50IGhmYTM4NHhfY21kX2luaXRpYWxpemUoc3RydWN0IGhmYTM4NHggKmh3KTsKK2ludCBoZmEzODR4X2NtZF9lbmFibGUoc3RydWN0IGhmYTM4NHggKmh3LCB1MTYgbWFjcG9ydCk7CitpbnQgaGZhMzg0eF9jbWRfZGlzYWJsZShzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUxNiBtYWNwb3J0KTsKK2ludCBoZmEzODR4X2NtZF9hbGxvY2F0ZShzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUxNiBsZW4pOworaW50IGhmYTM4NHhfY21kX21vbml0b3Ioc3RydWN0IGhmYTM4NHggKmh3LCB1MTYgZW5hYmxlKTsKIGludAotaGZhMzg0eF9jbWRfZG93bmxvYWQoaGZhMzg0eF90ICpodywKK2hmYTM4NHhfY21kX2Rvd25sb2FkKHN0cnVjdCBoZmEzODR4ICpodywKIAkJICAgICB1MTYgbW9kZSwgdTE2IGxvd2FkZHIsIHUxNiBoaWdoYWRkciwgdTE2IGNvZGVsZW4pOwogCiAjZW5kaWYgLypfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4X3VzYi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eF91c2IuYwppbmRleCAzMzc4MTA3Li42YTEwN2Y4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4X3VzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHhfdXNiLmMKQEAgLTE1NCwxMyArMTU0LDEzIEBACiAjZW5kaWYKIAogc3RhdGljIHZvaWQKLWhmYTM4NHhfaW50X3J4bW9uaXRvcih3bGFuZGV2aWNlX3QgKndsYW5kZXYsIGhmYTM4NHhfdXNiX3J4ZnJtX3QgKnJ4ZnJtKTsKK2hmYTM4NHhfaW50X3J4bW9uaXRvcihzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgc3RydWN0IGhmYTM4NHhfdXNiX3J4ZnJtICpyeGZybSk7CiAKIHN0YXRpYyB2b2lkIGhmYTM4NHhfdXNiX2RlZmVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSk7CiAKLXN0YXRpYyBpbnQgc3VibWl0X3J4X3VyYihoZmEzODR4X3QgKmh3LCBnZnBfdCBmbGFncyk7CitzdGF0aWMgaW50IHN1Ym1pdF9yeF91cmIoc3RydWN0IGhmYTM4NHggKmh3LCBnZnBfdCBmbGFncyk7CiAKLXN0YXRpYyBpbnQgc3VibWl0X3R4X3VyYihoZmEzODR4X3QgKmh3LCBzdHJ1Y3QgdXJiICp0eF91cmIsIGdmcF90IGZsYWdzKTsKK3N0YXRpYyBpbnQgc3VibWl0X3R4X3VyYihzdHJ1Y3QgaGZhMzg0eCAqaHcsIHN0cnVjdCB1cmIgKnR4X3VyYiwgZ2ZwX3QgZmxhZ3MpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBDYWxsYmFja3MgKi8KQEAgLTE2OSwxOSArMTY5LDE5IEBACiBzdGF0aWMgdm9pZCBoZmEzODR4X3VzYmluX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYik7CiAKIHN0YXRpYyB2b2lkCi1oZmEzODR4X3VzYmluX3R4Y29tcGwod2xhbmRldmljZV90ICp3bGFuZGV2LCBoZmEzODR4X3VzYmluX3QgKnVzYmluKTsKK2hmYTM4NHhfdXNiaW5fdHhjb21wbChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdW5pb24gaGZhMzg0eF91c2JpbiAqdXNiaW4pOwogCi1zdGF0aWMgdm9pZCBoZmEzODR4X3VzYmluX3J4KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCBoZmEzODR4X3VzYmluX3J4KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAotc3RhdGljIHZvaWQgaGZhMzg0eF91c2Jpbl9pbmZvKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgaGZhMzg0eF91c2Jpbl90ICp1c2Jpbik7CitzdGF0aWMgdm9pZCBoZmEzODR4X3VzYmluX2luZm8oc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHVuaW9uIGhmYTM4NHhfdXNiaW4gKnVzYmluKTsKIAotc3RhdGljIHZvaWQgaGZhMzg0eF91c2Jpbl9jdGx4KGhmYTM4NHhfdCAqaHcsIGhmYTM4NHhfdXNiaW5fdCAqdXNiaW4sCitzdGF0aWMgdm9pZCBoZmEzODR4X3VzYmluX2N0bHgoc3RydWN0IGhmYTM4NHggKmh3LCB1bmlvbiBoZmEzODR4X3VzYmluICp1c2JpbiwKIAkJCSAgICAgICBpbnQgdXJiX3N0YXR1cyk7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEZ1bmN0aW9ucyB0byBzdXBwb3J0IHRoZSBwcmlzbTIgdXNiIGNvbW1hbmQgcXVldWUgKi8KIAotc3RhdGljIHZvaWQgaGZhMzg0eF91c2JjdGx4cV9ydW4oaGZhMzg0eF90ICpodyk7CitzdGF0aWMgdm9pZCBoZmEzODR4X3VzYmN0bHhxX3J1bihzdHJ1Y3QgaGZhMzg0eCAqaHcpOwogCiBzdGF0aWMgdm9pZCBoZmEzODR4X3VzYmN0bHhfcmVxdGltZXJmbih1bnNpZ25lZCBsb25nIGRhdGEpOwogCkBAIC0xOTMsNDIgKzE5Myw0MiBAQAogCiBzdGF0aWMgdm9pZCBoZmEzODR4X3VzYmN0bHhfcmVhcGVyX3Rhc2sodW5zaWduZWQgbG9uZyBkYXRhKTsKIAotc3RhdGljIGludCBoZmEzODR4X3VzYmN0bHhfc3VibWl0KGhmYTM4NHhfdCAqaHcsIGhmYTM4NHhfdXNiY3RseF90ICpjdGx4KTsKK3N0YXRpYyBpbnQgaGZhMzg0eF91c2JjdGx4X3N1Ym1pdChzdHJ1Y3QgaGZhMzg0eCAqaHcsIHN0cnVjdCBoZmEzODR4X3VzYmN0bHggKmN0bHgpOwogCi1zdGF0aWMgdm9pZCB1bmxvY2tlZF91c2JjdGx4X2NvbXBsZXRlKGhmYTM4NHhfdCAqaHcsIGhmYTM4NHhfdXNiY3RseF90ICpjdGx4KTsKK3N0YXRpYyB2b2lkIHVubG9ja2VkX3VzYmN0bHhfY29tcGxldGUoc3RydWN0IGhmYTM4NHggKmh3LCBzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4ICpjdGx4KTsKIAogc3RydWN0IHVzYmN0bHhfY29tcGxldG9yIHsKIAlpbnQgKCpjb21wbGV0ZSkoc3RydWN0IHVzYmN0bHhfY29tcGxldG9yICopOwogfTsKIAogc3RhdGljIGludAotaGZhMzg0eF91c2JjdGx4X2NvbXBsZXRlX3N5bmMoaGZhMzg0eF90ICpodywKLQkJCSAgICAgIGhmYTM4NHhfdXNiY3RseF90ICpjdGx4LAoraGZhMzg0eF91c2JjdGx4X2NvbXBsZXRlX3N5bmMoc3RydWN0IGhmYTM4NHggKmh3LAorCQkJICAgICAgc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqY3RseCwKIAkJCSAgICAgIHN0cnVjdCB1c2JjdGx4X2NvbXBsZXRvciAqY29tcGxldG9yKTsKIAogc3RhdGljIGludAotdW5sb2NrZWRfdXNiY3RseF9jYW5jZWxfYXN5bmMoaGZhMzg0eF90ICpodywgaGZhMzg0eF91c2JjdGx4X3QgKmN0bHgpOwordW5sb2NrZWRfdXNiY3RseF9jYW5jZWxfYXN5bmMoc3RydWN0IGhmYTM4NHggKmh3LCBzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4ICpjdGx4KTsKIAotc3RhdGljIHZvaWQgaGZhMzg0eF9jYl9zdGF0dXMoaGZhMzg0eF90ICpodywgY29uc3QgaGZhMzg0eF91c2JjdGx4X3QgKmN0bHgpOworc3RhdGljIHZvaWQgaGZhMzg0eF9jYl9zdGF0dXMoc3RydWN0IGhmYTM4NHggKmh3LCBjb25zdCBzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4ICpjdGx4KTsKIAogc3RhdGljIGludAotdXNiY3RseF9nZXRfc3RhdHVzKGNvbnN0IGhmYTM4NHhfdXNiX2NtZHJlc3BfdCAqY21kcmVzcCwKLQkJICAgaGZhMzg0eF9jbWRyZXN1bHRfdCAqcmVzdWx0KTsKK3VzYmN0bHhfZ2V0X3N0YXR1cyhjb25zdCBzdHJ1Y3QgaGZhMzg0eF91c2Jfc3RhdHVzcmVzcCAqY21kcmVzcCwKKwkJICAgc3RydWN0IGhmYTM4NHhfY21kcmVzdWx0ICpyZXN1bHQpOwogCiBzdGF0aWMgdm9pZAotdXNiY3RseF9nZXRfcnJpZHJlc3VsdChjb25zdCBoZmEzODR4X3VzYl9ycmlkcmVzcF90ICpycmlkcmVzcCwKLQkJICAgICAgIGhmYTM4NHhfcnJpZHJlc3VsdF90ICpyZXN1bHQpOwordXNiY3RseF9nZXRfcnJpZHJlc3VsdChjb25zdCBzdHJ1Y3QgaGZhMzg0eF91c2JfcnJpZHJlc3AgKnJyaWRyZXNwLAorCQkgICAgICAgc3RydWN0IGhmYTM4NHhfcnJpZHJlc3VsdCAqcmVzdWx0KTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogTG93IGxldmVsIHJlcS9yZXNwIENUTFggZm9ybWF0dGVycyBhbmQgc3VibWl0dGVycyAqLwogc3RhdGljIGludAotaGZhMzg0eF9kb2NtZChoZmEzODR4X3QgKmh3LAoraGZhMzg0eF9kb2NtZChzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJICAgICAgZW51bSBjbWRfbW9kZSBtb2RlLAotCSAgICAgIGhmYTM4NHhfbWV0YWNtZF90ICpjbWQsCisJICAgICAgc3RydWN0IGhmYTM4NHhfbWV0YWNtZCAqY21kLAogCSAgICAgIGN0bHhfY21kY2JfdCBjbWRjYiwgY3RseF91c2VyY2JfdCB1c2VyY2IsIHZvaWQgKnVzZXJjYl9kYXRhKTsKIAogc3RhdGljIGludAotaGZhMzg0eF9kb3JyaWQoaGZhMzg0eF90ICpodywKK2hmYTM4NHhfZG9ycmlkKHN0cnVjdCBoZmEzODR4ICpodywKIAkgICAgICAgZW51bSBjbWRfbW9kZSBtb2RlLAogCSAgICAgICB1MTYgcmlkLAogCSAgICAgICB2b2lkICpyaWRkYXRhLApAQCAtMjM2LDcgKzIzNiw3IEBACiAJICAgICAgIGN0bHhfY21kY2JfdCBjbWRjYiwgY3RseF91c2VyY2JfdCB1c2VyY2IsIHZvaWQgKnVzZXJjYl9kYXRhKTsKIAogc3RhdGljIGludAotaGZhMzg0eF9kb3dyaWQoaGZhMzg0eF90ICpodywKK2hmYTM4NHhfZG93cmlkKHN0cnVjdCBoZmEzODR4ICpodywKIAkgICAgICAgZW51bSBjbWRfbW9kZSBtb2RlLAogCSAgICAgICB1MTYgcmlkLAogCSAgICAgICB2b2lkICpyaWRkYXRhLApAQCAtMjQ0LDcgKzI0NCw3IEBACiAJICAgICAgIGN0bHhfY21kY2JfdCBjbWRjYiwgY3RseF91c2VyY2JfdCB1c2VyY2IsIHZvaWQgKnVzZXJjYl9kYXRhKTsKIAogc3RhdGljIGludAotaGZhMzg0eF9kb3JtZW0oaGZhMzg0eF90ICpodywKK2hmYTM4NHhfZG9ybWVtKHN0cnVjdCBoZmEzODR4ICpodywKIAkgICAgICAgZW51bSBjbWRfbW9kZSBtb2RlLAogCSAgICAgICB1MTYgcGFnZSwKIAkgICAgICAgdTE2IG9mZnNldCwKQEAgLTI1Myw3ICsyNTMsNyBAQAogCSAgICAgICBjdGx4X2NtZGNiX3QgY21kY2IsIGN0bHhfdXNlcmNiX3QgdXNlcmNiLCB2b2lkICp1c2VyY2JfZGF0YSk7CiAKIHN0YXRpYyBpbnQKLWhmYTM4NHhfZG93bWVtKGhmYTM4NHhfdCAqaHcsCitoZmEzODR4X2Rvd21lbShzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJICAgICAgIGVudW0gY21kX21vZGUgbW9kZSwKIAkgICAgICAgdTE2IHBhZ2UsCiAJICAgICAgIHUxNiBvZmZzZXQsCkBAIC0yNzgsOSArMjc4LDkgQEAKIAlyZXR1cm4gY3RseF9zdHJbc107CiB9OwogCi1zdGF0aWMgaW5saW5lIGhmYTM4NHhfdXNiY3RseF90ICpnZXRfYWN0aXZlX2N0bHgoaGZhMzg0eF90ICpodykKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqZ2V0X2FjdGl2ZV9jdGx4KHN0cnVjdCBoZmEzODR4ICpodykKIHsKLQlyZXR1cm4gbGlzdF9lbnRyeShody0+Y3RseHEuYWN0aXZlLm5leHQsIGhmYTM4NHhfdXNiY3RseF90LCBsaXN0KTsKKwlyZXR1cm4gbGlzdF9lbnRyeShody0+Y3RseHEuYWN0aXZlLm5leHQsIHN0cnVjdCBoZmEzODR4X3VzYmN0bHgsIGxpc3QpOwogfQogCiAjaWZkZWYgREVCVUdfVVNCCkBAIC0zMjIsMTIgKzMyMiwxMiBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCUFueQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IHN1Ym1pdF9yeF91cmIoaGZhMzg0eF90ICpodywgZ2ZwX3QgbWVtZmxhZ3MpCitzdGF0aWMgaW50IHN1Ym1pdF9yeF91cmIoc3RydWN0IGhmYTM4NHggKmh3LCBnZnBfdCBtZW1mbGFncykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCByZXN1bHQ7CiAKLQlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihoZmEzODR4X3VzYmluX3QpKTsKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZih1bmlvbiBoZmEzODR4X3VzYmluKSk7CiAJaWYgKCFza2IpIHsKIAkJcmVzdWx0ID0gLUVOT01FTTsKIAkJZ290byBkb25lOwpAQCAtMzM2LDcgKzMzNiw3IEBACiAJLyogUG9zdCB0aGUgSU4gdXJiICovCiAJdXNiX2ZpbGxfYnVsa191cmIoJmh3LT5yeF91cmIsIGh3LT51c2IsCiAJCQkgIGh3LT5lbmRwX2luLAotCQkJICBza2ItPmRhdGEsIHNpemVvZihoZmEzODR4X3VzYmluX3QpLAorCQkJICBza2ItPmRhdGEsIHNpemVvZih1bmlvbiBoZmEzODR4X3VzYmluKSwKIAkJCSAgaGZhMzg0eF91c2Jpbl9jYWxsYmFjaywgaHctPndsYW5kZXYpOwogCiAJaHctPnJ4X3VyYl9za2IgPSBza2I7CkBAIC0zODQsNyArMzg0LDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglBbnkKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCBzdWJtaXRfdHhfdXJiKGhmYTM4NHhfdCAqaHcsIHN0cnVjdCB1cmIgKnR4X3VyYiwgZ2ZwX3QgbWVtZmxhZ3MpCitzdGF0aWMgaW50IHN1Ym1pdF90eF91cmIoc3RydWN0IGhmYTM4NHggKmh3LCBzdHJ1Y3QgdXJiICp0eF91cmIsIGdmcF90IG1lbWZsYWdzKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBody0+d2xhbmRldi0+bmV0ZGV2OwogCWludCByZXN1bHQ7CkBAIC00MjksNyArNDI5LDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIHZvaWQgaGZhMzg0eF91c2JfZGVmZXIoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQogewotCWhmYTM4NHhfdCAqaHcgPSBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGhmYTM4NHgsIHVzYl93b3JrKTsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGhmYTM4NHgsIHVzYl93b3JrKTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gaHctPndsYW5kZXYtPm5ldGRldjsKIAogCS8qIERvbid0IGJvdGhlciB0cnlpbmcgdG8gcmVzZXQgYW55dGhpbmcgaWYgdGhlIHBsdWcKQEAgLTUwMyw3ICs1MDMsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGhmYTM4NHhfY3JlYXRlCiAqCi0qIFNldHMgdXAgdGhlIGhmYTM4NHhfdCBkYXRhIHN0cnVjdHVyZSBmb3IgdXNlLiAgTm90ZSB0aGlzCisqIFNldHMgdXAgdGhlIHN0cnVjdCBoZmEzODR4IGRhdGEgc3RydWN0dXJlIGZvciB1c2UuICBOb3RlIHRoaXMKICogZG9lcyBfbm90XyBpbml0aWFsaXplIHRoZSBhY3R1YWwgaGFyZHdhcmUsIGp1c3QgdGhlIGRhdGEgc3RydWN0dXJlcwogKiB3ZSB1c2UgdG8ga2VlcCB0cmFjayBvZiBpdHMgc3RhdGUuCiAqCkBAIC01MjEsOSArNTIxLDkgQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgaGZhMzg0eF9jcmVhdGUoaGZhMzg0eF90ICpodywgc3RydWN0IHVzYl9kZXZpY2UgKnVzYikKK3ZvaWQgaGZhMzg0eF9jcmVhdGUoc3RydWN0IGhmYTM4NHggKmh3LCBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiKQogewotCW1lbXNldChodywgMCwgc2l6ZW9mKGhmYTM4NHhfdCkpOworCW1lbXNldChodywgMCwgc2l6ZW9mKHN0cnVjdCBoZmEzODR4KSk7CiAJaHctPnVzYiA9IHVzYjsKIAogCS8qIHNldCB1cCB0aGUgZW5kcG9pbnRzICovCkBAIC01OTIsNyArNTkyLDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgaGZhMzg0eF9kZXN0cm95KGhmYTM4NHhfdCAqaHcpCit2b2lkIGhmYTM4NHhfZGVzdHJveShzdHJ1Y3QgaGZhMzg0eCAqaHcpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIApAQCAtNjA4LDkgKzYwOCw5IEBACiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKIH0KIAotc3RhdGljIGhmYTM4NHhfdXNiY3RseF90ICp1c2JjdGx4X2FsbG9jKHZvaWQpCitzdGF0aWMgc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqdXNiY3RseF9hbGxvYyh2b2lkKQogewotCWhmYTM4NHhfdXNiY3RseF90ICpjdGx4OworCXN0cnVjdCBoZmEzODR4X3VzYmN0bHggKmN0bHg7CiAKIAljdGx4ID0ga3phbGxvYyhzaXplb2YoKmN0bHgpLAogCQkgICAgICAgaW5faW50ZXJydXB0KCkgPyBHRlBfQVRPTUlDIDogR0ZQX0tFUk5FTCk7CkBAIC02MjEsOCArNjIxLDggQEAKIH0KIAogc3RhdGljIGludAotdXNiY3RseF9nZXRfc3RhdHVzKGNvbnN0IGhmYTM4NHhfdXNiX2NtZHJlc3BfdCAqY21kcmVzcCwKLQkJICAgaGZhMzg0eF9jbWRyZXN1bHRfdCAqcmVzdWx0KQordXNiY3RseF9nZXRfc3RhdHVzKGNvbnN0IHN0cnVjdCBoZmEzODR4X3VzYl9zdGF0dXNyZXNwICpjbWRyZXNwLAorCQkgICBzdHJ1Y3QgaGZhMzg0eF9jbWRyZXN1bHQgKnJlc3VsdCkKIHsKIAlyZXN1bHQtPnN0YXR1cyA9IGxlMTZfdG9fY3B1KGNtZHJlc3AtPnN0YXR1cyk7CiAJcmVzdWx0LT5yZXNwMCA9IGxlMTZfdG9fY3B1KGNtZHJlc3AtPnJlc3AwKTsKQEAgLTYzNiw4ICs2MzYsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotdXNiY3RseF9nZXRfcnJpZHJlc3VsdChjb25zdCBoZmEzODR4X3VzYl9ycmlkcmVzcF90ICpycmlkcmVzcCwKLQkJICAgICAgIGhmYTM4NHhfcnJpZHJlc3VsdF90ICpyZXN1bHQpCit1c2JjdGx4X2dldF9ycmlkcmVzdWx0KGNvbnN0IHN0cnVjdCBoZmEzODR4X3VzYl9ycmlkcmVzcCAqcnJpZHJlc3AsCisJCSAgICAgICBzdHJ1Y3QgaGZhMzg0eF9ycmlkcmVzdWx0ICpyZXN1bHQpCiB7CiAJcmVzdWx0LT5yaWQgPSBsZTE2X3RvX2NwdShycmlkcmVzcC0+cmlkKTsKIAlyZXN1bHQtPnJpZGRhdGEgPSBycmlkcmVzcC0+ZGF0YTsKQEAgLTY0NywxMyArNjQ3LDEzIEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogQ29tcGxldG9yIG9iamVjdDoKICogVGhpcyBjb21wbGV0b3IgbXVzdCBiZSBwYXNzZWQgdG8gaGZhMzg0eF91c2JjdGx4X2NvbXBsZXRlX3N5bmMoKQotKiB3aGVuIHByb2Nlc3NpbmcgYSBDVExYIHRoYXQgcmV0dXJucyBhIGhmYTM4NHhfY21kcmVzdWx0X3Qgc3RydWN0dXJlLgorKiB3aGVuIHByb2Nlc3NpbmcgYSBDVExYIHRoYXQgcmV0dXJucyBhIHN0cnVjdCBoZmEzODR4X2NtZHJlc3VsdCBzdHJ1Y3R1cmUuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0cnVjdCB1c2JjdGx4X2NtZF9jb21wbGV0b3IgewogCXN0cnVjdCB1c2JjdGx4X2NvbXBsZXRvciBoZWFkOwogCi0JY29uc3QgaGZhMzg0eF91c2JfY21kcmVzcF90ICpjbWRyZXNwOwotCWhmYTM4NHhfY21kcmVzdWx0X3QgKnJlc3VsdDsKKwljb25zdCBzdHJ1Y3QgaGZhMzg0eF91c2Jfc3RhdHVzcmVzcCAqY21kcmVzcDsKKwlzdHJ1Y3QgaGZhMzg0eF9jbWRyZXN1bHQgKnJlc3VsdDsKIH07CiAKIHN0YXRpYyBpbmxpbmUgaW50IHVzYmN0bHhfY21kX2NvbXBsZXRvcl9mbihzdHJ1Y3QgdXNiY3RseF9jb21wbGV0b3IgKmhlYWQpCkBAIC02NjcsOSArNjY3LDkgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHVzYmN0bHhfY29tcGxldG9yICppbml0X2NtZF9jb21wbGV0b3IoCiAJCQkJCQlzdHJ1Y3QgdXNiY3RseF9jbWRfY29tcGxldG9yCiAJCQkJCQkJKmNvbXBsZXRvciwKLQkJCQkJCWNvbnN0IGhmYTM4NHhfdXNiX2NtZHJlc3BfdAorCQkJCQkJY29uc3Qgc3RydWN0IGhmYTM4NHhfdXNiX3N0YXR1c3Jlc3AKIAkJCQkJCQkqY21kcmVzcCwKLQkJCQkJCWhmYTM4NHhfY21kcmVzdWx0X3QgKnJlc3VsdCkKKwkJCQkJCXN0cnVjdCBoZmEzODR4X2NtZHJlc3VsdCAqcmVzdWx0KQogewogCWNvbXBsZXRvci0+aGVhZC5jb21wbGV0ZSA9IHVzYmN0bHhfY21kX2NvbXBsZXRvcl9mbjsKIAljb21wbGV0b3ItPmNtZHJlc3AgPSBjbWRyZXNwOwpAQCAtNjg1LDcgKzY4NSw3IEBACiBzdHJ1Y3QgdXNiY3RseF9ycmlkX2NvbXBsZXRvciB7CiAJc3RydWN0IHVzYmN0bHhfY29tcGxldG9yIGhlYWQ7CiAKLQljb25zdCBoZmEzODR4X3VzYl9ycmlkcmVzcF90ICpycmlkcmVzcDsKKwljb25zdCBzdHJ1Y3QgaGZhMzg0eF91c2JfcnJpZHJlc3AgKnJyaWRyZXNwOwogCXZvaWQgKnJpZGRhdGE7CiAJdW5zaWduZWQgaW50IHJpZGRhdGFsZW47CiB9OwpAQCAtNjkzLDcgKzY5Myw3IEBACiBzdGF0aWMgaW50IHVzYmN0bHhfcnJpZF9jb21wbGV0b3JfZm4oc3RydWN0IHVzYmN0bHhfY29tcGxldG9yICpoZWFkKQogewogCXN0cnVjdCB1c2JjdGx4X3JyaWRfY29tcGxldG9yICpjb21wbGV0ZTsKLQloZmEzODR4X3JyaWRyZXN1bHRfdCBycmlkcmVzdWx0OworCXN0cnVjdCBoZmEzODR4X3JyaWRyZXN1bHQgcnJpZHJlc3VsdDsKIAogCWNvbXBsZXRlID0gKHN0cnVjdCB1c2JjdGx4X3JyaWRfY29tcGxldG9yICopaGVhZDsKIAl1c2JjdGx4X2dldF9ycmlkcmVzdWx0KGNvbXBsZXRlLT5ycmlkcmVzcCwgJnJyaWRyZXN1bHQpOwpAQCAtNzEzLDcgKzcxMyw3IEBACiBzdGF0aWMgaW5saW5lIHN0cnVjdCB1c2JjdGx4X2NvbXBsZXRvciAqaW5pdF9ycmlkX2NvbXBsZXRvcigKIAkJCQkJCXN0cnVjdCB1c2JjdGx4X3JyaWRfY29tcGxldG9yCiAJCQkJCQkJKmNvbXBsZXRvciwKLQkJCQkJCWNvbnN0IGhmYTM4NHhfdXNiX3JyaWRyZXNwX3QKKwkJCQkJCWNvbnN0IHN0cnVjdCBoZmEzODR4X3VzYl9ycmlkcmVzcAogCQkJCQkJCSpycmlkcmVzcCwKIAkJCQkJCXZvaWQgKnJpZGRhdGEsCiAJCQkJCQl1bnNpZ25lZCBpbnQgcmlkZGF0YWxlbikKQEAgLTc0NCw3ICs3NDQsNyBAQAogc3RydWN0IHVzYmN0bHhfcm1lbV9jb21wbGV0b3IgewogCXN0cnVjdCB1c2JjdGx4X2NvbXBsZXRvciBoZWFkOwogCi0JY29uc3QgaGZhMzg0eF91c2Jfcm1lbXJlc3BfdCAqcm1lbXJlc3A7CisJY29uc3Qgc3RydWN0IGhmYTM4NHhfdXNiX3JtZW1yZXNwICpybWVtcmVzcDsKIAl2b2lkICpkYXRhOwogCXVuc2lnbmVkIGludCBsZW47CiB9OwpAQCAtNzYyLDcgKzc2Miw3IEBACiBzdGF0aWMgaW5saW5lIHN0cnVjdCB1c2JjdGx4X2NvbXBsZXRvciAqaW5pdF9ybWVtX2NvbXBsZXRvcigKIAkJCQkJCXN0cnVjdCB1c2JjdGx4X3JtZW1fY29tcGxldG9yCiAJCQkJCQkJKmNvbXBsZXRvciwKLQkJCQkJCWhmYTM4NHhfdXNiX3JtZW1yZXNwX3QKKwkJCQkJCXN0cnVjdCBoZmEzODR4X3VzYl9ybWVtcmVzcAogCQkJCQkJCSpybWVtcmVzcCwKIAkJCQkJCXZvaWQgKmRhdGEsCiAJCQkJCQl1bnNpZ25lZCBpbnQgbGVuKQpAQCAtNzk1LDEwICs3OTUsMTAgQEAKICogQ2FsbCBjb250ZXh0OgogKglpbnRlcnJ1cHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgaGZhMzg0eF9jYl9zdGF0dXMoaGZhMzg0eF90ICpodywgY29uc3QgaGZhMzg0eF91c2JjdGx4X3QgKmN0bHgpCitzdGF0aWMgdm9pZCBoZmEzODR4X2NiX3N0YXR1cyhzdHJ1Y3QgaGZhMzg0eCAqaHcsIGNvbnN0IHN0cnVjdCBoZmEzODR4X3VzYmN0bHggKmN0bHgpCiB7CiAJaWYgKGN0bHgtPnVzZXJjYikgewotCQloZmEzODR4X2NtZHJlc3VsdF90IGNtZHJlc3VsdDsKKwkJc3RydWN0IGhmYTM4NHhfY21kcmVzdWx0IGNtZHJlc3VsdDsKIAogCQlpZiAoY3RseC0+c3RhdGUgIT0gQ1RMWF9DT01QTEVURSkgewogCQkJbWVtc2V0KCZjbWRyZXN1bHQsIDAsIHNpemVvZihjbWRyZXN1bHQpKTsKQEAgLTgxMiwyMSArODEyLDIxIEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIGludCBoZmEzODR4X2RvY21kX3dhaXQoaGZhMzg0eF90ICpodywgaGZhMzg0eF9tZXRhY21kX3QgKmNtZCkKK3N0YXRpYyBpbmxpbmUgaW50IGhmYTM4NHhfZG9jbWRfd2FpdChzdHJ1Y3QgaGZhMzg0eCAqaHcsIHN0cnVjdCBoZmEzODR4X21ldGFjbWQgKmNtZCkKIHsKIAlyZXR1cm4gaGZhMzg0eF9kb2NtZChodywgRE9XQUlULCBjbWQsIE5VTEwsIE5VTEwsIE5VTEwpOwogfQogCiBzdGF0aWMgaW5saW5lIGludAotaGZhMzg0eF9kb2NtZF9hc3luYyhoZmEzODR4X3QgKmh3LAotCQkgICAgaGZhMzg0eF9tZXRhY21kX3QgKmNtZCwKK2hmYTM4NHhfZG9jbWRfYXN5bmMoc3RydWN0IGhmYTM4NHggKmh3LAorCQkgICAgc3RydWN0IGhmYTM4NHhfbWV0YWNtZCAqY21kLAogCQkgICAgY3RseF9jbWRjYl90IGNtZGNiLCBjdGx4X3VzZXJjYl90IHVzZXJjYiwgdm9pZCAqdXNlcmNiX2RhdGEpCiB7CiAJcmV0dXJuIGhmYTM4NHhfZG9jbWQoaHcsIERPQVNZTkMsIGNtZCwgY21kY2IsIHVzZXJjYiwgdXNlcmNiX2RhdGEpOwogfQogCiBzdGF0aWMgaW5saW5lIGludAotaGZhMzg0eF9kb3JyaWRfd2FpdChoZmEzODR4X3QgKmh3LCB1MTYgcmlkLCB2b2lkICpyaWRkYXRhLAoraGZhMzg0eF9kb3JyaWRfd2FpdChzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUxNiByaWQsIHZvaWQgKnJpZGRhdGEsCiAJCSAgICB1bnNpZ25lZCBpbnQgcmlkZGF0YWxlbikKIHsKIAlyZXR1cm4gaGZhMzg0eF9kb3JyaWQoaHcsIERPV0FJVCwKQEAgLTgzNCw3ICs4MzQsNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludAotaGZhMzg0eF9kb3JyaWRfYXN5bmMoaGZhMzg0eF90ICpodywKK2hmYTM4NHhfZG9ycmlkX2FzeW5jKHN0cnVjdCBoZmEzODR4ICpodywKIAkJICAgICB1MTYgcmlkLCB2b2lkICpyaWRkYXRhLCB1bnNpZ25lZCBpbnQgcmlkZGF0YWxlbiwKIAkJICAgICBjdGx4X2NtZGNiX3QgY21kY2IsCiAJCSAgICAgY3RseF91c2VyY2JfdCB1c2VyY2IsIHZvaWQgKnVzZXJjYl9kYXRhKQpAQCAtODQ1LDcgKzg0NSw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2Rvd3JpZF93YWl0KGhmYTM4NHhfdCAqaHcsIHUxNiByaWQsIHZvaWQgKnJpZGRhdGEsCitoZmEzODR4X2Rvd3JpZF93YWl0KHN0cnVjdCBoZmEzODR4ICpodywgdTE2IHJpZCwgdm9pZCAqcmlkZGF0YSwKIAkJICAgIHVuc2lnbmVkIGludCByaWRkYXRhbGVuKQogewogCXJldHVybiBoZmEzODR4X2Rvd3JpZChodywgRE9XQUlULApAQCAtODUzLDcgKzg1Myw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2Rvd3JpZF9hc3luYyhoZmEzODR4X3QgKmh3LAoraGZhMzg0eF9kb3dyaWRfYXN5bmMoc3RydWN0IGhmYTM4NHggKmh3LAogCQkgICAgIHUxNiByaWQsIHZvaWQgKnJpZGRhdGEsIHVuc2lnbmVkIGludCByaWRkYXRhbGVuLAogCQkgICAgIGN0bHhfY21kY2JfdCBjbWRjYiwKIAkJICAgICBjdGx4X3VzZXJjYl90IHVzZXJjYiwgdm9pZCAqdXNlcmNiX2RhdGEpCkBAIC04NjQsNyArODY0LDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLWhmYTM4NHhfZG9ybWVtX3dhaXQoaGZhMzg0eF90ICpodywKK2hmYTM4NHhfZG9ybWVtX3dhaXQoc3RydWN0IGhmYTM4NHggKmh3LAogCQkgICAgdTE2IHBhZ2UsIHUxNiBvZmZzZXQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJcmV0dXJuIGhmYTM4NHhfZG9ybWVtKGh3LCBET1dBSVQsCkBAIC04NzIsNyArODcyLDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLWhmYTM4NHhfZG9ybWVtX2FzeW5jKGhmYTM4NHhfdCAqaHcsCitoZmEzODR4X2Rvcm1lbV9hc3luYyhzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJCSAgICAgdTE2IHBhZ2UsIHUxNiBvZmZzZXQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4sCiAJCSAgICAgY3RseF9jbWRjYl90IGNtZGNiLAogCQkgICAgIGN0bHhfdXNlcmNiX3QgdXNlcmNiLCB2b2lkICp1c2VyY2JfZGF0YSkKQEAgLTg4Myw3ICs4ODMsNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludAotaGZhMzg0eF9kb3dtZW1fd2FpdChoZmEzODR4X3QgKmh3LAoraGZhMzg0eF9kb3dtZW1fd2FpdChzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJCSAgICB1MTYgcGFnZSwgdTE2IG9mZnNldCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbikKIHsKIAlyZXR1cm4gaGZhMzg0eF9kb3dtZW0oaHcsIERPV0FJVCwKQEAgLTg5MSw3ICs4OTEsNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludAotaGZhMzg0eF9kb3dtZW1fYXN5bmMoaGZhMzg0eF90ICpodywKK2hmYTM4NHhfZG93bWVtX2FzeW5jKHN0cnVjdCBoZmEzODR4ICpodywKIAkJICAgICB1MTYgcGFnZSwKIAkJICAgICB1MTYgb2Zmc2V0LAogCQkgICAgIHZvaWQgKmRhdGEsCkBAIC05MjMsMTEgKzkyMywxMSBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY21kX2luaXRpYWxpemUoaGZhMzg0eF90ICpodykKK2ludCBoZmEzODR4X2NtZF9pbml0aWFsaXplKHN0cnVjdCBoZmEzODR4ICpodykKIHsKIAlpbnQgcmVzdWx0ID0gMDsKIAlpbnQgaTsKLQloZmEzODR4X21ldGFjbWRfdCBjbWQ7CisJc3RydWN0IGhmYTM4NHhfbWV0YWNtZCBjbWQ7CiAKIAljbWQuY21kID0gSEZBMzg0eF9DTURDT0RFX0lOSVQ7CiAJY21kLnBhcm0wID0gMDsKQEAgLTk2OSw5ICs5NjksOSBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY21kX2Rpc2FibGUoaGZhMzg0eF90ICpodywgdTE2IG1hY3BvcnQpCitpbnQgaGZhMzg0eF9jbWRfZGlzYWJsZShzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUxNiBtYWNwb3J0KQogewotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKKwlzdHJ1Y3QgaGZhMzg0eF9tZXRhY21kIGNtZDsKIAogCWNtZC5jbWQgPSBIRkEzODR4X0NNRF9DTURDT0RFX1NFVChIRkEzODR4X0NNRENPREVfRElTQUJMRSkgfAogCSAgICBIRkEzODR4X0NNRF9NQUNQT1JUX1NFVChtYWNwb3J0KTsKQEAgLTEwMDIsOSArMTAwMiw5IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIHUxNiBtYWNwb3J0KQoraW50IGhmYTM4NHhfY21kX2VuYWJsZShzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUxNiBtYWNwb3J0KQogewotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKKwlzdHJ1Y3QgaGZhMzg0eF9tZXRhY21kIGNtZDsKIAogCWNtZC5jbWQgPSBIRkEzODR4X0NNRF9DTURDT0RFX1NFVChIRkEzODR4X0NNRENPREVfRU5BQkxFKSB8CiAJICAgIEhGQTM4NHhfQ01EX01BQ1BPUlRfU0VUKG1hY3BvcnQpOwpAQCAtMTA0NCw5ICsxMDQ0LDkgQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NtZF9tb25pdG9yKGhmYTM4NHhfdCAqaHcsIHUxNiBlbmFibGUpCitpbnQgaGZhMzg0eF9jbWRfbW9uaXRvcihzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUxNiBlbmFibGUpCiB7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOworCXN0cnVjdCBoZmEzODR4X21ldGFjbWQgY21kOwogCiAJY21kLmNtZCA9IEhGQTM4NHhfQ01EX0NNRENPREVfU0VUKEhGQTM4NHhfQ01EQ09ERV9NT05JVE9SKSB8CiAJICAgIEhGQTM4NHhfQ01EX0FJTkZPX1NFVChlbmFibGUpOwpAQCAtMTA5NSwxMCArMTA5NSwxMCBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY21kX2Rvd25sb2FkKGhmYTM4NHhfdCAqaHcsIHUxNiBtb2RlLCB1MTYgbG93YWRkciwKK2ludCBoZmEzODR4X2NtZF9kb3dubG9hZChzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUxNiBtb2RlLCB1MTYgbG93YWRkciwKIAkJCSB1MTYgaGlnaGFkZHIsIHUxNiBjb2RlbGVuKQogewotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKKwlzdHJ1Y3QgaGZhMzg0eF9tZXRhY21kIGNtZDsKIAogCXByX2RlYnVnKCJtb2RlPSVkLCBsb3dhZGRyPTB4JTA0eCwgaGlnaGFkZHI9MHglMDR4LCBjb2RlbGVuPSVkXG4iLAogCQkgbW9kZSwgbG93YWRkciwgaGlnaGFkZHIsIGNvZGVsZW4pOwpAQCAtMTEzNiw3ICsxMTM2LDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NvcmVyZXNldChoZmEzODR4X3QgKmh3LCBpbnQgaG9sZHRpbWUsIGludCBzZXR0bGV0aW1lLCBpbnQgZ2VuZXNpcykKK2ludCBoZmEzODR4X2NvcmVyZXNldChzdHJ1Y3QgaGZhMzg0eCAqaHcsIGludCBob2xkdGltZSwgaW50IHNldHRsZXRpbWUsIGludCBnZW5lc2lzKQogewogCWludCByZXN1bHQ7CiAKQEAgLTExNzMsOCArMTE3Myw4IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IGhmYTM4NHhfdXNiY3RseF9jb21wbGV0ZV9zeW5jKGhmYTM4NHhfdCAqaHcsCi0JCQkJCSBoZmEzODR4X3VzYmN0bHhfdCAqY3RseCwKK3N0YXRpYyBpbnQgaGZhMzg0eF91c2JjdGx4X2NvbXBsZXRlX3N5bmMoc3RydWN0IGhmYTM4NHggKmh3LAorCQkJCQkgc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqY3RseCwKIAkJCQkJIHN0cnVjdCB1c2JjdGx4X2NvbXBsZXRvciAqY29tcGxldG9yKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xMjg5LDEzICsxMjg5LDEzIEBACiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIGludAotaGZhMzg0eF9kb2NtZChoZmEzODR4X3QgKmh3LAoraGZhMzg0eF9kb2NtZChzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJICAgICAgZW51bSBjbWRfbW9kZSBtb2RlLAotCSAgICAgIGhmYTM4NHhfbWV0YWNtZF90ICpjbWQsCisJICAgICAgc3RydWN0IGhmYTM4NHhfbWV0YWNtZCAqY21kLAogCSAgICAgIGN0bHhfY21kY2JfdCBjbWRjYiwgY3RseF91c2VyY2JfdCB1c2VyY2IsIHZvaWQgKnVzZXJjYl9kYXRhKQogewogCWludCByZXN1bHQ7Ci0JaGZhMzg0eF91c2JjdGx4X3QgKmN0bHg7CisJc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqY3RseDsKIAogCWN0bHggPSB1c2JjdGx4X2FsbG9jKCk7CiAJaWYgKCFjdGx4KSB7CkBAIC0xMzc3LDcgKzEzNzcsNyBAQAogKglwcm9jZXNzIChET1dBSVQgb3IgRE9BU1lOQykKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIGludAotaGZhMzg0eF9kb3JyaWQoaGZhMzg0eF90ICpodywKK2hmYTM4NHhfZG9ycmlkKHN0cnVjdCBoZmEzODR4ICpodywKIAkgICAgICAgZW51bSBjbWRfbW9kZSBtb2RlLAogCSAgICAgICB1MTYgcmlkLAogCSAgICAgICB2b2lkICpyaWRkYXRhLApAQCAtMTM4NSw3ICsxMzg1LDcgQEAKIAkgICAgICAgY3RseF9jbWRjYl90IGNtZGNiLCBjdGx4X3VzZXJjYl90IHVzZXJjYiwgdm9pZCAqdXNlcmNiX2RhdGEpCiB7CiAJaW50IHJlc3VsdDsKLQloZmEzODR4X3VzYmN0bHhfdCAqY3RseDsKKwlzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4ICpjdGx4OwogCiAJY3RseCA9IHVzYmN0bHhfYWxsb2MoKTsKIAlpZiAoIWN0bHgpIHsKQEAgLTE0NTgsNyArMTQ1OCw3IEBACiAqCXByb2Nlc3MgKERPV0FJVCBvciBET0FTWU5DKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgaW50Ci1oZmEzODR4X2Rvd3JpZChoZmEzODR4X3QgKmh3LAoraGZhMzg0eF9kb3dyaWQoc3RydWN0IGhmYTM4NHggKmh3LAogCSAgICAgICBlbnVtIGNtZF9tb2RlIG1vZGUsCiAJICAgICAgIHUxNiByaWQsCiAJICAgICAgIHZvaWQgKnJpZGRhdGEsCkBAIC0xNDY2LDcgKzE0NjYsNyBAQAogCSAgICAgICBjdGx4X2NtZGNiX3QgY21kY2IsIGN0bHhfdXNlcmNiX3QgdXNlcmNiLCB2b2lkICp1c2VyY2JfZGF0YSkKIHsKIAlpbnQgcmVzdWx0OwotCWhmYTM4NHhfdXNiY3RseF90ICpjdGx4OworCXN0cnVjdCBoZmEzODR4X3VzYmN0bHggKmN0bHg7CiAKIAljdGx4ID0gdXNiY3RseF9hbGxvYygpOwogCWlmICghY3RseCkgewpAQCAtMTQ5Nyw3ICsxNDk3LDcgQEAKIAkJa2ZyZWUoY3RseCk7CiAJfSBlbHNlIGlmIChtb2RlID09IERPV0FJVCkgewogCQlzdHJ1Y3QgdXNiY3RseF9jbWRfY29tcGxldG9yIGNvbXBsZXRvcjsKLQkJaGZhMzg0eF9jbWRyZXN1bHRfdCB3cmlkcmVzdWx0OworCQlzdHJ1Y3QgaGZhMzg0eF9jbWRyZXN1bHQgd3JpZHJlc3VsdDsKIAogCQlyZXN1bHQgPSBoZmEzODR4X3VzYmN0bHhfY29tcGxldGVfc3luYyhodywKIAkJCQkJCSAgICAgICBjdGx4LApAQCAtMTU0NSw3ICsxNTQ1LDcgQEAKICoJcHJvY2VzcyAoRE9XQUlUIG9yIERPQVNZTkMpCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyBpbnQKLWhmYTM4NHhfZG9ybWVtKGhmYTM4NHhfdCAqaHcsCitoZmEzODR4X2Rvcm1lbShzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJICAgICAgIGVudW0gY21kX21vZGUgbW9kZSwKIAkgICAgICAgdTE2IHBhZ2UsCiAJICAgICAgIHUxNiBvZmZzZXQsCkBAIC0xNTU0LDcgKzE1NTQsNyBAQAogCSAgICAgICBjdGx4X2NtZGNiX3QgY21kY2IsIGN0bHhfdXNlcmNiX3QgdXNlcmNiLCB2b2lkICp1c2VyY2JfZGF0YSkKIHsKIAlpbnQgcmVzdWx0OwotCWhmYTM4NHhfdXNiY3RseF90ICpjdGx4OworCXN0cnVjdCBoZmEzODR4X3VzYmN0bHggKmN0bHg7CiAKIAljdGx4ID0gdXNiY3RseF9hbGxvYygpOwogCWlmICghY3RseCkgewpAQCAtMTYzNiw3ICsxNjM2LDcgQEAKICoJcHJvY2VzcyAoRE9XQUlUIG9yIERPQVNZTkMpCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyBpbnQKLWhmYTM4NHhfZG93bWVtKGhmYTM4NHhfdCAqaHcsCitoZmEzODR4X2Rvd21lbShzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJICAgICAgIGVudW0gY21kX21vZGUgbW9kZSwKIAkgICAgICAgdTE2IHBhZ2UsCiAJICAgICAgIHUxNiBvZmZzZXQsCkBAIC0xNjQ1LDcgKzE2NDUsNyBAQAogCSAgICAgICBjdGx4X2NtZGNiX3QgY21kY2IsIGN0bHhfdXNlcmNiX3QgdXNlcmNiLCB2b2lkICp1c2VyY2JfZGF0YSkKIHsKIAlpbnQgcmVzdWx0OwotCWhmYTM4NHhfdXNiY3RseF90ICpjdGx4OworCXN0cnVjdCBoZmEzODR4X3VzYmN0bHggKmN0bHg7CiAKIAlwcl9kZWJ1ZygicGFnZT0weCUwNHggb2Zmc2V0PTB4JTA0eCBsZW49JWRcbiIsIHBhZ2UsIG9mZnNldCwgbGVuKTsKIApAQCAtMTY3OSw3ICsxNjc5LDcgQEAKIAkJa2ZyZWUoY3RseCk7CiAJfSBlbHNlIGlmIChtb2RlID09IERPV0FJVCkgewogCQlzdHJ1Y3QgdXNiY3RseF9jbWRfY29tcGxldG9yIGNvbXBsZXRvcjsKLQkJaGZhMzg0eF9jbWRyZXN1bHRfdCB3bWVtcmVzdWx0OworCQlzdHJ1Y3QgaGZhMzg0eF9jbWRyZXN1bHQgd21lbXJlc3VsdDsKIAogCQlyZXN1bHQgPSBoZmEzODR4X3VzYmN0bHhfY29tcGxldGVfc3luYyhodywKIAkJCQkJCSAgICAgICBjdGx4LApAQCAtMTcxNSw3ICsxNzE1LDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfZGlzYWJsZShoZmEzODR4X3QgKmh3LCB1MTYgbWFjcG9ydCkKK2ludCBoZmEzODR4X2RydnJfZGlzYWJsZShzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUxNiBtYWNwb3J0KQogewogCWludCByZXN1bHQgPSAwOwogCkBAIC0xNzUzLDcgKzE3NTMsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9lbmFibGUoaGZhMzg0eF90ICpodywgdTE2IG1hY3BvcnQpCitpbnQgaGZhMzg0eF9kcnZyX2VuYWJsZShzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUxNiBtYWNwb3J0KQogewogCWludCByZXN1bHQgPSAwOwogCkBAIC0xNzkwLDcgKzE3OTAsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9mbGFzaGRsX2VuYWJsZShoZmEzODR4X3QgKmh3KQoraW50IGhmYTM4NHhfZHJ2cl9mbGFzaGRsX2VuYWJsZShzdHJ1Y3QgaGZhMzg0eCAqaHcpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJaW50IGk7CkBAIC0xODQ5LDcgKzE4NDksNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9mbGFzaGRsX2Rpc2FibGUoaGZhMzg0eF90ICpodykKK2ludCBoZmEzODR4X2RydnJfZmxhc2hkbF9kaXNhYmxlKHN0cnVjdCBoZmEzODR4ICpodykKIHsKIAkvKiBDaGVjayB0aGF0IHdlJ3JlIGFscmVhZHkgaW4gdGhlIGRvd25sb2FkIHN0YXRlICovCiAJaWYgKGh3LT5kbHN0YXRlICE9IEhGQTM4NHhfRExTVEFURV9GTEFTSEVOQUJMRUQpCkBAIC0xODk0LDcgKzE4OTQsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9mbGFzaGRsX3dyaXRlKGhmYTM4NHhfdCAqaHcsIHUzMiBkYWRkciwgdm9pZCAqYnVmLCB1MzIgbGVuKQoraW50IGhmYTM4NHhfZHJ2cl9mbGFzaGRsX3dyaXRlKHN0cnVjdCBoZmEzODR4ICpodywgdTMyIGRhZGRyLCB2b2lkICpidWYsIHUzMiBsZW4pCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJdTMyIGRsYnVmYWRkcjsKQEAgLTIwMzIsNyArMjAzMiw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhoZmEzODR4X3QgKmh3LCB1MTYgcmlkLCB2b2lkICpidWYsIHUxNiBsZW4pCitpbnQgaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUxNiByaWQsIHZvaWQgKmJ1ZiwgdTE2IGxlbikKIHsKIAlyZXR1cm4gaGZhMzg0eF9kb3JyaWRfd2FpdChodywgcmlkLCBidWYsIGxlbik7CiB9CkBAIC0yMDYxLDcgKzIwNjEsNyBAQAogICogICAgICAgcHJvY2VzcwogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogaW50Ci1oZmEzODR4X2RydnJfc2V0Y29uZmlnX2FzeW5jKGhmYTM4NHhfdCAqaHcsCitoZmEzODR4X2RydnJfc2V0Y29uZmlnX2FzeW5jKHN0cnVjdCBoZmEzODR4ICpodywKIAkJCSAgICAgdTE2IHJpZCwKIAkJCSAgICAgdm9pZCAqYnVmLAogCQkJICAgICB1MTYgbGVuLCBjdGx4X3VzZXJjYl90IHVzZXJjYiwgdm9pZCAqdXNlcmNiX2RhdGEpCkBAIC0yMDg4LDcgKzIwODgsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9yYW1kbF9kaXNhYmxlKGhmYTM4NHhfdCAqaHcpCitpbnQgaGZhMzg0eF9kcnZyX3JhbWRsX2Rpc2FibGUoc3RydWN0IGhmYTM4NHggKmh3KQogewogCS8qIENoZWNrIHRoYXQgd2UncmUgYWxyZWFkeSBpbiB0aGUgZG93bmxvYWQgc3RhdGUgKi8KIAlpZiAoaHctPmRsc3RhdGUgIT0gSEZBMzg0eF9ETFNUQVRFX1JBTUVOQUJMRUQpCkBAIC0yMTI4LDcgKzIxMjgsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9yYW1kbF9lbmFibGUoaGZhMzg0eF90ICpodywgdTMyIGV4ZWFkZHIpCitpbnQgaGZhMzg0eF9kcnZyX3JhbWRsX2VuYWJsZShzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUzMiBleGVhZGRyKQogewogCWludCByZXN1bHQgPSAwOwogCXUxNiBsb3dhZGRyOwpAQCAtMjE5Niw3ICsyMTk2LDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfcmFtZGxfd3JpdGUoaGZhMzg0eF90ICpodywgdTMyIGRhZGRyLCB2b2lkICpidWYsIHUzMiBsZW4pCitpbnQgaGZhMzg0eF9kcnZyX3JhbWRsX3dyaXRlKHN0cnVjdCBoZmEzODR4ICpodywgdTMyIGRhZGRyLCB2b2lkICpidWYsIHUzMiBsZW4pCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJaW50IG53cml0ZXM7CkBAIC0yMjc2LDcgKzIyNzYsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3Mgb3Igbm9uLWNhcmQgaW50ZXJydXB0LgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX3JlYWRwZGEoaGZhMzg0eF90ICpodywgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQoraW50IGhmYTM4NHhfZHJ2cl9yZWFkcGRhKHN0cnVjdCBoZmEzODR4ICpodywgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCWludCByZXN1bHQgPSAwOwogCXUxNiAqcGRhID0gYnVmOwpAQCAtMjM4Niw3ICsyMzg2LDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfc2V0Y29uZmlnKGhmYTM4NHhfdCAqaHcsIHUxNiByaWQsIHZvaWQgKmJ1ZiwgdTE2IGxlbikKK2ludCBoZmEzODR4X2RydnJfc2V0Y29uZmlnKHN0cnVjdCBoZmEzODR4ICpodywgdTE2IHJpZCwgdm9pZCAqYnVmLCB1MTYgbGVuKQogewogCXJldHVybiBoZmEzODR4X2Rvd3JpZF93YWl0KGh3LCByaWQsIGJ1ZiwgbGVuKTsKIH0KQEAgLTI0MTEsNyArMjQxMSw3IEBACiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1pbnQgaGZhMzg0eF9kcnZyX3N0YXJ0KGhmYTM4NHhfdCAqaHcpCitpbnQgaGZhMzg0eF9kcnZyX3N0YXJ0KHN0cnVjdCBoZmEzODR4ICpodykKIHsKIAlpbnQgcmVzdWx0LCByZXN1bHQxLCByZXN1bHQyOwogCXUxNiBzdGF0dXM7CkBAIC0yNTEyLDcgKzI1MTIsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9zdG9wKGhmYTM4NHhfdCAqaHcpCitpbnQgaGZhMzg0eF9kcnZyX3N0b3Aoc3RydWN0IGhmYTM4NHggKmh3KQogewogCWludCBpOwogCkBAIC0yNTYyLDExICsyNTYyLDExIEBACiAqIENhbGwgY29udGV4dDoKICoJaW50ZXJydXB0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfdHhmcmFtZShoZmEzODR4X3QgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAoraW50IGhmYTM4NHhfZHJ2cl90eGZyYW1lKHN0cnVjdCBoZmEzODR4ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSB1bmlvbiBwODAyMTFfaGRyICpwODAyMTFfaGRyLAogCQkJIHN0cnVjdCBwODAyMTFfbWV0YXdlcCAqcDgwMjExX3dlcCkKIHsKLQlpbnQgdXNicGt0bGVuID0gc2l6ZW9mKGhmYTM4NHhfdHhfZnJhbWVfdCk7CisJaW50IHVzYnBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgaGZhMzg0eF90eF9mcmFtZSk7CiAJaW50IHJlc3VsdDsKIAlpbnQgcmV0OwogCWNoYXIgKnB0cjsKQEAgLTI2NTYsOSArMjY1Niw5IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotdm9pZCBoZmEzODR4X3R4X3RpbWVvdXQod2xhbmRldmljZV90ICp3bGFuZGV2KQordm9pZCBoZmEzODR4X3R4X3RpbWVvdXQoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpCiB7Ci0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5jdGx4cS5sb2NrLCBmbGFncyk7CkBAIC0yNjgxLDcgKzI2ODEsNyBAQAogKiBUYXNrbGV0IHRvIGRlbGV0ZSBkZWFkIENUTFggb2JqZWN0cwogKgogKiBBcmd1bWVudHM6Ci0qCWRhdGEJcHRyIHRvIGEgaGZhMzg0eF90CisqCWRhdGEJcHRyIHRvIGEgc3RydWN0IGhmYTM4NHgKICoKICogUmV0dXJuczoKICoKQEAgLTI2OTAsOCArMjY5MCw4IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyB2b2lkIGhmYTM4NHhfdXNiY3RseF9yZWFwZXJfdGFzayh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0JaGZhMzg0eF90ICpodyA9IChoZmEzODR4X3QgKilkYXRhOwotCWhmYTM4NHhfdXNiY3RseF90ICpjdGx4LCAqdGVtcDsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSAoc3RydWN0IGhmYTM4NHggKilkYXRhOworCXN0cnVjdCBoZmEzODR4X3VzYmN0bHggKmN0bHgsICp0ZW1wOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmN0bHhxLmxvY2ssIGZsYWdzKTsKQEAgLTI3MTMsNyArMjcxMyw3IEBACiAqIFRhc2tsZXQgdG8gY2FsbCBjb21wbGV0aW9uIGhhbmRsZXJzIGZvciByZXR1cm5lZCBDVExYcwogKgogKiBBcmd1bWVudHM6Ci0qCWRhdGEJcHRyIHRvIGhmYTM4NHhfdAorKglkYXRhCXB0ciB0byBzdHJ1Y3QgaGZhMzg0eAogKgogKiBSZXR1cm5zOgogKglOb3RoaW5nCkBAIC0yNzIzLDggKzI3MjMsOCBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgdm9pZCBoZmEzODR4X3VzYmN0bHhfY29tcGxldGlvbl90YXNrKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQloZmEzODR4X3QgKmh3ID0gKGhmYTM4NHhfdCAqKWRhdGE7Ci0JaGZhMzg0eF91c2JjdGx4X3QgKmN0bHgsICp0ZW1wOworCXN0cnVjdCBoZmEzODR4ICpodyA9IChzdHJ1Y3QgaGZhMzg0eCAqKWRhdGE7CisJc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqY3RseCwgKnRlbXA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWludCByZWFwID0gMDsKQEAgLTI3ODcsNyArMjc4Nyw3IEBACiAqIG5leHQgY29tbWFuZCBvbiB0aGUgcXVldWUgaXMgcnVuIGFmdGVyd2FyZHMuCiAqCiAqIEFyZ3VtZW50czoKLSoJaHcJcHRyIHRvIHRoZSBoZmEzODR4X3Qgc3RydWN0dXJlCisqCWh3CXB0ciB0byB0aGUgc3RydWN0IGhmYTM4NHggc3RydWN0dXJlCiAqCWN0bHgJcHRyIHRvIGEgQ1RMWCBzdHJ1Y3R1cmUKICoKICogUmV0dXJuczoKQEAgLTI3OTcsOCArMjc5Nyw4IEBACiAqIENhbGwgY29udGV4dDoKICoJRWl0aGVyIHByb2Nlc3Mgb3IgaW50ZXJydXB0LCBidXQgcHJlc3VtYWJseSBpbnRlcnJ1cHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCB1bmxvY2tlZF91c2JjdGx4X2NhbmNlbF9hc3luYyhoZmEzODR4X3QgKmh3LAotCQkJCQkgaGZhMzg0eF91c2JjdGx4X3QgKmN0bHgpCitzdGF0aWMgaW50IHVubG9ja2VkX3VzYmN0bHhfY2FuY2VsX2FzeW5jKHN0cnVjdCBoZmEzODR4ICpodywKKwkJCQkJIHN0cnVjdCBoZmEzODR4X3VzYmN0bHggKmN0bHgpCiB7CiAJaW50IHJldDsKIApAQCAtMjgzNiw3ICsyODM2LDcgQEAKICogdGFza2xldCBpcyBzY2hlZHVsZWQuCiAqCiAqIEFyZ3VtZW50czoKLSoJaHcJCXB0ciB0byBhIGhmYTM4NHhfdCBzdHJ1Y3R1cmUKKyoJaHcJCXB0ciB0byBhIHN0cnVjdCBoZmEzODR4IHN0cnVjdHVyZQogKgljdGx4CQlwdHIgdG8gYSBjdGx4IHN0cnVjdHVyZQogKgogKiBSZXR1cm5zOgpAQCAtMjg0Nyw3ICsyODQ3LDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglFaXRoZXIsIGFzc3VtZSBpbnRlcnJ1cHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgdW5sb2NrZWRfdXNiY3RseF9jb21wbGV0ZShoZmEzODR4X3QgKmh3LCBoZmEzODR4X3VzYmN0bHhfdCAqY3RseCkKK3N0YXRpYyB2b2lkIHVubG9ja2VkX3VzYmN0bHhfY29tcGxldGUoc3RydWN0IGhmYTM4NHggKmh3LCBzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4ICpjdGx4KQogewogCS8qIFRpbWVycyBoYXZlIGJlZW4gc3RvcHBlZCwgYW5kIGN0bHggc2hvdWxkIGJlIGluCiAJICogYSB0ZXJtaW5hbCBzdGF0ZS4gUmV0aXJlIGl0IGZyb20gdGhlICJhY3RpdmUiCkBAIC0yODc2LDcgKzI4NzYsNyBAQAogKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBoZWFkIGl0ZW0gaXMgcnVubmluZy4gIElmIG5vdCwgc3RhcnRzIGl0LgogKgogKiBBcmd1bWVudHM6Ci0qCWh3CXB0ciB0byBoZmEzODR4X3QKKyoJaHcJcHRyIHRvIHN0cnVjdCBoZmEzODR4CiAqCiAqIFJldHVybnM6CiAqCW5vdGhpbmcKQEAgLTI4ODYsNyArMjg4Niw3IEBACiAqIENhbGwgY29udGV4dDoKICoJYW55CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIGhmYTM4NHhfdXNiY3RseHFfcnVuKGhmYTM4NHhfdCAqaHcpCitzdGF0aWMgdm9pZCBoZmEzODR4X3VzYmN0bHhxX3J1bihzdHJ1Y3QgaGZhMzg0eCAqaHcpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMjkwNSwxMiArMjkwNSwxMiBAQAogCQlnb3RvIHVubG9jazsKIAogCXdoaWxlICghbGlzdF9lbXB0eSgmaHctPmN0bHhxLnBlbmRpbmcpKSB7Ci0JCWhmYTM4NHhfdXNiY3RseF90ICpoZWFkOworCQlzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4ICpoZWFkOwogCQlpbnQgcmVzdWx0OwogCiAJCS8qIFRoaXMgaXMgdGhlIGZpcnN0IHBlbmRpbmcgY29tbWFuZCAqLwogCQloZWFkID0gbGlzdF9lbnRyeShody0+Y3RseHEucGVuZGluZy5uZXh0LAotCQkJCSAgaGZhMzg0eF91c2JjdGx4X3QsIGxpc3QpOworCQkJCSAgc3RydWN0IGhmYTM4NHhfdXNiY3RseCwgbGlzdCk7CiAKIAkJLyogV2UgbmVlZCB0byBzcGxpdCB0aGlzIG9mZiB0byBhdm9pZCBhIHJhY2UgY29uZGl0aW9uICovCiAJCWxpc3RfbW92ZV90YWlsKCZoZWFkLT5saXN0LCAmaHctPmN0bHhxLmFjdGl2ZSk7CkBAIC0yOTg4LDkgKzI5ODgsOSBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgdm9pZCBoZmEzODR4X3VzYmluX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSB1cmItPmNvbnRleHQ7Ci0JaGZhMzg0eF90ICpodzsKLQloZmEzODR4X3VzYmluX3QgKnVzYmluID0gKGhmYTM4NHhfdXNiaW5fdCAqKXVyYi0+dHJhbnNmZXJfYnVmZmVyOworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2ID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCBoZmEzODR4ICpodzsKKwl1bmlvbiBoZmEzODR4X3VzYmluICp1c2JpbiA9ICh1bmlvbiBoZmEzODR4X3VzYmluICopdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CiAJaW50IHJlc3VsdDsKIAlpbnQgdXJiX3N0YXR1czsKQEAgLTMxNTQsNyArMzE1NCw3IEBACiAqIHF1ZXVlIGFuZCBvdXIgc3RhdGUgdXBkYXRlZCBhY2NvcmRpbmdseS4KICoKICogQXJndW1lbnRzOgotKglodwkJcHRyIHRvIGhmYTM4NHhfdAorKglodwkJcHRyIHRvIHN0cnVjdCBoZmEzODR4CiAqCXVzYmluCQlwdHIgdG8gVVNCIElOIHBhY2tldAogKgl1cmJfc3RhdHVzCXN0YXR1cyBvZiB0aGlzIEJ1bGstSW4gVVJCCiAqCkBAIC0zMTY2LDEwICszMTY2LDEwIEBACiAqIENhbGwgY29udGV4dDoKICoJaW50ZXJydXB0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIGhmYTM4NHhfdXNiaW5fY3RseChoZmEzODR4X3QgKmh3LCBoZmEzODR4X3VzYmluX3QgKnVzYmluLAorc3RhdGljIHZvaWQgaGZhMzg0eF91c2Jpbl9jdGx4KHN0cnVjdCBoZmEzODR4ICpodywgdW5pb24gaGZhMzg0eF91c2JpbiAqdXNiaW4sCiAJCQkgICAgICAgaW50IHVyYl9zdGF0dXMpCiB7Ci0JaGZhMzg0eF91c2JjdGx4X3QgKmN0bHg7CisJc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqY3RseDsKIAlpbnQgcnVuX3F1ZXVlID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0zMjg1LDggKzMyODUsOCBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCWludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBoZmEzODR4X3VzYmluX3R4Y29tcGwod2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCSAgaGZhMzg0eF91c2Jpbl90ICp1c2JpbikKK3N0YXRpYyB2b2lkIGhmYTM4NHhfdXNiaW5fdHhjb21wbChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkgIHVuaW9uIGhmYTM4NHhfdXNiaW4gKnVzYmluKQogewogCXUxNiBzdGF0dXM7CiAKQEAgLTMzMTYsMTAgKzMzMTYsMTAgQEAKICogQ2FsbCBjb250ZXh0OgogKglpbnRlcnJ1cHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgaGZhMzg0eF91c2Jpbl9yeCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgdm9pZCBoZmEzODR4X3VzYmluX3J4KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCWhmYTM4NHhfdXNiaW5fdCAqdXNiaW4gPSAoaGZhMzg0eF91c2Jpbl90ICopc2tiLT5kYXRhOwotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXVuaW9uIGhmYTM4NHhfdXNiaW4gKnVzYmluID0gKHVuaW9uIGhmYTM4NHhfdXNiaW4gKilza2ItPmRhdGE7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKIAlpbnQgaGRybGVuOwogCXN0cnVjdCBwODAyMTFfcnhtZXRhICpyeG1ldGE7CiAJdTE2IGRhdGFfbGVuOwpAQCAtMzM0Niw3ICszMzQ2LDcgQEAKIAkJaGRybGVuID0gcDgwMjExX2hlYWRlcmxlbihmYyk7CiAKIAkJLyogUHVsbCBvZmYgdGhlIGRlc2NyaXB0b3IgKi8KLQkJc2tiX3B1bGwoc2tiLCBzaXplb2YoaGZhMzg0eF9yeF9mcmFtZV90KSk7CisJCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBoZmEzODR4X3J4X2ZyYW1lKSk7CiAKIAkJLyogTm93IHNodW50IHRoZSBoZWFkZXIgYmxvY2sgdXAgYWdhaW5zdCB0aGUgZGF0YSBibG9jawogCQkgKiB3aXRoIGFuICJvdmVybGFwcGluZyIgY29weQpAQCAtMzQxNiwxNyArMzQxNiwxNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCWludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBoZmEzODR4X2ludF9yeG1vbml0b3Iod2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCSAgaGZhMzg0eF91c2Jfcnhmcm1fdCAqcnhmcm0pCitzdGF0aWMgdm9pZCBoZmEzODR4X2ludF9yeG1vbml0b3Ioc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJICBzdHJ1Y3QgaGZhMzg0eF91c2Jfcnhmcm0gKnJ4ZnJtKQogewotCWhmYTM4NHhfcnhfZnJhbWVfdCAqcnhkZXNjID0gJihyeGZybS0+ZGVzYyk7CisJc3RydWN0IGhmYTM4NHhfcnhfZnJhbWUgKnJ4ZGVzYyA9ICYocnhmcm0tPmRlc2MpOwogCXVuc2lnbmVkIGludCBoZHJsZW4gPSAwOwogCXVuc2lnbmVkIGludCBkYXRhbGVuID0gMDsKIAl1bnNpZ25lZCBpbnQgc2tibGVuID0gMDsKIAl1OCAqZGF0YXA7CiAJdTE2IGZjOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKIAogCS8qIFJlbWVtYmVyIHRoZSBzdGF0dXMsIHRpbWUsIGFuZCBkYXRhX2xlbiBmaWVsZHMgYXJlIGluIGhvc3Qgb3JkZXIgKi8KIAkvKiBGaWd1cmUgb3V0IGhvdyBiaWcgdGhlIGZyYW1lIGlzICovCkBAIC0zNTE3LDcgKzM1MTcsOCBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCWludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBoZmEzODR4X3VzYmluX2luZm8od2xhbmRldmljZV90ICp3bGFuZGV2LCBoZmEzODR4X3VzYmluX3QgKnVzYmluKQorc3RhdGljIHZvaWQgaGZhMzg0eF91c2Jpbl9pbmZvKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJICAgICAgIHVuaW9uIGhmYTM4NHhfdXNiaW4gKnVzYmluKQogewogCXVzYmluLT5pbmZvZnJtLmluZm8uZnJhbWVsZW4gPQogCSAgICBsZTE2X3RvX2NwdSh1c2Jpbi0+aW5mb2ZybS5pbmZvLmZyYW1lbGVuKTsKQEAgLTM1NDIsNyArMzU0Myw3IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyB2b2lkIGhmYTM4NHhfdXNib3V0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSB1cmItPmNvbnRleHQ7CiAKICNpZmRlZiBERUJVR19VU0IKIAlkYnByaW50X3VyYih1cmIpOwpAQCAtMzU1Niw3ICszNTU3LDcgQEAKIAogCQljYXNlIC1FUElQRToKIAkJCXsKLQkJCQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKKwkJCQlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCiAJCQkJbmV0ZGV2X3dhcm4oaHctPndsYW5kZXYtPm5ldGRldiwKIAkJCQkJICAgICIlcyB0eCBwaXBlIHN0YWxsZWQ6IHJlcXVlc3RpbmcgcmVzZXRcbiIsCkBAIC0zNTcyLDcgKzM1NzMsNyBAQAogCQljYXNlIC1FVElNRURPVVQ6CiAJCWNhc2UgLUVJTFNFUToKIAkJCXsKLQkJCQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKKwkJCQlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCiAJCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0CiAJCQkJICAgIChUSFJPVFRMRV9UWCwgJmh3LT51c2JfZmxhZ3MpICYmCkBAIC0zNjE3LDExICszNjE4LDExIEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyB2b2lkIGhmYTM4NHhfY3RseG91dF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0JaGZhMzg0eF90ICpodyA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB1cmItPmNvbnRleHQ7CiAJaW50IGRlbGV0ZV9yZXNwdGltZXIgPSAwOwogCWludCB0aW1lcl9vayA9IDE7CiAJaW50IHJ1bl9xdWV1ZSA9IDA7Ci0JaGZhMzg0eF91c2JjdGx4X3QgKmN0bHg7CisJc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqY3RseDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJcHJfZGVidWcoInVyYi0+c3RhdHVzPSVkXG4iLCB1cmItPnN0YXR1cyk7CkBAIC0zNzM2LDcgKzM3MzcsNyBAQAogKiBVUkIgY29udGFpbmluZyBhIFByaXNtMi54IFhYWF9SZXF1ZXN0IHdhcyBuZXZlciBjYWxsZWQuCiAqCiAqIEFyZ3VtZW50czoKLSoJZGF0YQkJYSBwdHIgdG8gdGhlIGhmYTM4NHhfdAorKglkYXRhCQlhIHB0ciB0byB0aGUgc3RydWN0IGhmYTM4NHgKICoKICogUmV0dXJuczoKICoJbm90aGluZwpAQCAtMzc0OCw3ICszNzQ5LDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIHZvaWQgaGZhMzg0eF91c2JjdGx4X3JlcXRpbWVyZm4odW5zaWduZWQgbG9uZyBkYXRhKQogewotCWhmYTM4NHhfdCAqaHcgPSAoaGZhMzg0eF90ICopZGF0YTsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSAoc3RydWN0IGhmYTM4NHggKilkYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmN0bHhxLmxvY2ssIGZsYWdzKTsKQEAgLTM3NjUsNyArMzc2Niw3IEBACiAJCSAqLwogCQlody0+Y3RseF91cmIudHJhbnNmZXJfZmxhZ3MgfD0gVVJCX0FTWU5DX1VOTElOSzsKIAkJaWYgKHVzYl91bmxpbmtfdXJiKCZody0+Y3RseF91cmIpID09IC1FSU5QUk9HUkVTUykgewotCQkJaGZhMzg0eF91c2JjdGx4X3QgKmN0bHggPSBnZXRfYWN0aXZlX2N0bHgoaHcpOworCQkJc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqY3RseCA9IGdldF9hY3RpdmVfY3RseChodyk7CiAKIAkJCWN0bHgtPnN0YXRlID0gQ1RMWF9SRVFfRkFJTEVEOwogCkBAIC0zNzk0LDcgKzM3OTUsNyBAQAogKiBVUkIgY29udGFpbmluZyBhIFByaXNtMi54IFhYWF9SZXNwb25zZSB3YXMgbmV2ZXIgY2FsbGVkLgogKgogKiBBcmd1bWVudHM6Ci0qCWRhdGEJCWEgcHRyIHRvIHRoZSBoZmEzODR4X3QKKyoJZGF0YQkJYSBwdHIgdG8gdGhlIHN0cnVjdCBoZmEzODR4CiAqCiAqIFJldHVybnM6CiAqCW5vdGhpbmcKQEAgLTM4MDYsNyArMzgwNyw3IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyB2b2lkIGhmYTM4NHhfdXNiY3RseF9yZXNwdGltZXJmbih1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0JaGZhMzg0eF90ICpodyA9IChoZmEzODR4X3QgKilkYXRhOworCXN0cnVjdCBoZmEzODR4ICpodyA9IChzdHJ1Y3QgaGZhMzg0eCAqKWRhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZody0+Y3RseHEubG9jaywgZmxhZ3MpOwpAQCAtMzgxNyw3ICszODE4LDcgQEAKIAkgKiBhZGFwdGVyIGhhcyBiZWVuIHVucGx1Z2dlZCAuLi4KIAkgKi8KIAlpZiAoIWxpc3RfZW1wdHkoJmh3LT5jdGx4cS5hY3RpdmUpKSB7Ci0JCWhmYTM4NHhfdXNiY3RseF90ICpjdGx4ID0gZ2V0X2FjdGl2ZV9jdGx4KGh3KTsKKwkJc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqY3RseCA9IGdldF9hY3RpdmVfY3RseChodyk7CiAKIAkJaWYgKHVubG9ja2VkX3VzYmN0bHhfY2FuY2VsX2FzeW5jKGh3LCBjdGx4KSA9PSAwKSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZody0+Y3RseHEubG9jaywgZmxhZ3MpOwpAQCAtMzg0NSw3ICszODQ2LDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIHZvaWQgaGZhMzg0eF91c2JfdGhyb3R0bGVmbih1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0JaGZhMzg0eF90ICpodyA9IChoZmEzODR4X3QgKilkYXRhOworCXN0cnVjdCBoZmEzODR4ICpodyA9IChzdHJ1Y3QgaGZhMzg0eCAqKWRhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZody0+Y3RseHEubG9jaywgZmxhZ3MpOwpAQCAtMzg4NSw3ICszODg2LDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzIG9yIGludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IGhmYTM4NHhfdXNiY3RseF9zdWJtaXQoaGZhMzg0eF90ICpodywgaGZhMzg0eF91c2JjdGx4X3QgKmN0bHgpCitzdGF0aWMgaW50IGhmYTM4NHhfdXNiY3RseF9zdWJtaXQoc3RydWN0IGhmYTM4NHggKmh3LCBzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4ICpjdGx4KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWNvbnYuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWNvbnYuYwppbmRleCA2MzU0MDM2Li4wMjQ3Y2JjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFjb252LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExY29udi5jCkBAIC0xMDQsNyArMTA0LDcgQEAKICoJTWF5IGJlIGNhbGxlZCBpbiBpbnRlcnJ1cHQgb3Igbm9uLWludGVycnVwdCBjb250ZXh0CiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KLWludCBza2JfZXRoZXJfdG9fcDgwMjExKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTMyIGV0aGNvbnYsCitpbnQgc2tiX2V0aGVyX3RvX3A4MDIxMShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTMyIGV0aGNvbnYsCiAJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bmlvbiBwODAyMTFfaGRyICpwODAyMTFfaGRyLAogCQkJc3RydWN0IHA4MDIxMV9tZXRhd2VwICpwODAyMTFfd2VwKQogewpAQCAtMjMyLDcgKzIzMiw3IEBACiB9CiAKIC8qIGprcmllZ2w6IGZyb20gb3Jpbm9jbywgbW9kaWZpZWQgKi8KLXN0YXRpYyB2b2lkIG9yaW5vY29fc3B5X2dhdGhlcih3bGFuZGV2aWNlX3QgKndsYW5kZXYsIGNoYXIgKm1hYywKK3N0YXRpYyB2b2lkIG9yaW5vY29fc3B5X2dhdGhlcihzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgY2hhciAqbWFjLAogCQkJICAgICAgIHN0cnVjdCBwODAyMTFfcnhtZXRhICpyeG1ldGEpCiB7CiAJaW50IGk7CkBAIC0yNzQsMTAgKzI3NCwxMCBAQAogKglNYXkgYmUgY2FsbGVkIGluIGludGVycnVwdCBvciBub24taW50ZXJydXB0IGNvbnRleHQKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwotaW50IHNrYl9wODAyMTFfdG9fZXRoZXIod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MzIgZXRoY29udiwKK2ludCBza2JfcDgwMjExX3RvX2V0aGVyKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB1MzIgZXRoY29udiwKIAkJCXN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JbmV0ZGV2aWNlX3QgKm5ldGRldiA9IHdsYW5kZXYtPm5ldGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gd2xhbmRldi0+bmV0ZGV2OwogCXUxNiBmYzsKIAl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW5ndGg7CiAJdW5zaWduZWQgaW50IHBheWxvYWRfb2Zmc2V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YWRlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YWRlZi5oCmluZGV4IDBjY2ZiYTEuLmIwZDM1NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFkZWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhZGVmLmgKQEAgLTE1NSwyMiArMTU1LDkgQEAKICNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZSBcCiAJCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDQpKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTAgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMSkgfCAweDBjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTEgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMikgfCAweDBjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTIgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oMykgfCAweDBjMDAwMDAwKQotI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTMgXAotCQkJKFA4MDIxMURJRF9NS1NFQ1RJT04oMSkgfCBcCi0JCQlQODAyMTFESURfTUtHUk9VUCg0KSB8IFwKLQkJCVA4MDIxMURJRF9NS0lURU0oNCkgfCAweDBjMDAwMDAwKQorI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2tleShfaSkgXAorCQkJKERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGUgfCBcCisJCQlQODAyMTFESURfTUtJVEVNKF9pKSB8IDB4MGMwMDAwMDApCiAjZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZSBcCiAJCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKIAkJCVA4MDIxMURJRF9NS0dST1VQKDYpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YXN0cnVjdC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YXN0cnVjdC5oCmluZGV4IGM1MDExNjIuLjg1MGQ4OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFzdHJ1Y3QuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhc3RydWN0LmgKQEAgLTUxLDIyMSArNTEsMjIxIEBACiAJdTMyIG1zZ2NvZGU7CiAJdTMyIG1zZ2xlbjsKIAl1OCBkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOwotCXA4MDIxMWl0ZW1fdW5rMzkyX3QgbWliYXR0cmlidXRlOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgcmVzdWx0Y29kZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91bmszOTIgbWliYXR0cmlidXRlOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiByZXN1bHRjb2RlOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgewogCXUzMiBtc2djb2RlOwogCXUzMiBtc2dsZW47CiAJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKLQlwODAyMTFpdGVtX3VuazM5Ml90IG1pYmF0dHJpYnV0ZTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdW5rMzkyIG1pYmF0dHJpYnV0ZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgcmVzdWx0Y29kZTsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfc2NhbiB7CiAJdTMyIG1zZ2NvZGU7CiAJdTMyIG1zZ2xlbjsKIAl1OCBkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYnNzdHlwZTsKLQlwODAyMTFpdGVtX3BzdHI2X3QgYnNzaWQ7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGJzc3R5cGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fcHN0cjYgYnNzaWQ7CiAJdTggcGFkXzBDWzFdOwotCXA4MDIxMWl0ZW1fcHN0cjMyX3Qgc3NpZDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV9wc3RyMzIgc3NpZDsKIAl1OCBwYWRfMURbM107Ci0JcDgwMjExaXRlbV91aW50MzJfdCBzY2FudHlwZTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHByb2JlZGVsYXk7Ci0JcDgwMjExaXRlbV9wc3RyMTRfdCBjaGFubmVsbGlzdDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgc2NhbnR5cGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHByb2JlZGVsYXk7CisJc3RydWN0IHA4MDIxMWl0ZW1fcHN0cjE0IGNoYW5uZWxsaXN0OwogCXU4IHBhZF8yQ1sxXTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IG1pbmNoYW5uZWx0aW1lOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgbWF4Y2hhbm5lbHRpbWU7Ci0JcDgwMjExaXRlbV91aW50MzJfdCByZXN1bHRjb2RlOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgbnVtYnNzOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYXBwZW5kOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBtaW5jaGFubmVsdGltZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgbWF4Y2hhbm5lbHRpbWU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHJlc3VsdGNvZGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIG51bWJzczsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYXBwZW5kOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9zY2FuX3Jlc3VsdHMgewogCXUzMiBtc2djb2RlOwogCXUzMiBtc2dsZW47CiAJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGJzc2luZGV4OwotCXA4MDIxMWl0ZW1fdWludDMyX3QgcmVzdWx0Y29kZTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHNpZ25hbDsKLQlwODAyMTFpdGVtX3VpbnQzMl90IG5vaXNlOwotCXA4MDIxMWl0ZW1fcHN0cjZfdCBic3NpZDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYnNzaW5kZXg7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHJlc3VsdGNvZGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHNpZ25hbDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgbm9pc2U7CisJc3RydWN0IHA4MDIxMWl0ZW1fcHN0cjYgYnNzaWQ7CiAJdTggcGFkXzNDWzFdOwotCXA4MDIxMWl0ZW1fcHN0cjMyX3Qgc3NpZDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV9wc3RyMzIgc3NpZDsKIAl1OCBwYWRfNERbM107Ci0JcDgwMjExaXRlbV91aW50MzJfdCBic3N0eXBlOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYmVhY29ucGVyaW9kOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgZHRpbXBlcmlvZDsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHRpbWVzdGFtcDsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGxvY2FsdGltZTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGZoZHdlbGx0aW1lOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgZmhob3BzZXQ7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBmaGhvcHBhdHRlcm47Ci0JcDgwMjExaXRlbV91aW50MzJfdCBmaGhvcGluZGV4OwotCXA4MDIxMWl0ZW1fdWludDMyX3QgZHNjaGFubmVsOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgY2ZwY291bnQ7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBjZnBwZXJpb2Q7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBjZnBtYXhkdXJhdGlvbjsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGNmcGR1cnJlbWFpbmluZzsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGlic3NhdGltd2luZG93OwotCXA4MDIxMWl0ZW1fdWludDMyX3QgY2Zwb2xsYWJsZTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGNmcG9sbHJlcTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHByaXZhY3k7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBjYXBpbmZvOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYmFzaWNyYXRlMTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGJhc2ljcmF0ZTI7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBiYXNpY3JhdGUzOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYmFzaWNyYXRlNDsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGJhc2ljcmF0ZTU7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBiYXNpY3JhdGU2OwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYmFzaWNyYXRlNzsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGJhc2ljcmF0ZTg7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBzdXBwcmF0ZTE7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBzdXBwcmF0ZTI7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBzdXBwcmF0ZTM7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBzdXBwcmF0ZTQ7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBzdXBwcmF0ZTU7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBzdXBwcmF0ZTY7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBzdXBwcmF0ZTc7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBzdXBwcmF0ZTg7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGJzc3R5cGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGJlYWNvbnBlcmlvZDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgZHRpbXBlcmlvZDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgdGltZXN0YW1wOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBsb2NhbHRpbWU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGZoZHdlbGx0aW1lOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBmaGhvcHNldDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgZmhob3BwYXR0ZXJuOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBmaGhvcGluZGV4OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBkc2NoYW5uZWw7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGNmcGNvdW50OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBjZnBwZXJpb2Q7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGNmcG1heGR1cmF0aW9uOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBjZnBkdXJyZW1haW5pbmc7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGlic3NhdGltd2luZG93OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBjZnBvbGxhYmxlOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBjZnBvbGxyZXE7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHByaXZhY3k7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGNhcGluZm87CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGJhc2ljcmF0ZTE7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGJhc2ljcmF0ZTI7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGJhc2ljcmF0ZTM7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGJhc2ljcmF0ZTQ7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGJhc2ljcmF0ZTU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGJhc2ljcmF0ZTY7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGJhc2ljcmF0ZTc7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGJhc2ljcmF0ZTg7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHN1cHByYXRlMTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgc3VwcHJhdGUyOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBzdXBwcmF0ZTM7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHN1cHByYXRlNDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgc3VwcHJhdGU1OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBzdXBwcmF0ZTY7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHN1cHByYXRlNzsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgc3VwcHJhdGU4OwogfSBfX3BhY2tlZDsKIAogc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9zdGFydCB7CiAJdTMyIG1zZ2NvZGU7CiAJdTMyIG1zZ2xlbjsKIAl1OCBkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOwotCXA4MDIxMWl0ZW1fcHN0cjMyX3Qgc3NpZDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV9wc3RyMzIgc3NpZDsKIAl1OCBwYWRfMTJEWzNdOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYnNzdHlwZTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGJlYWNvbnBlcmlvZDsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGR0aW1wZXJpb2Q7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBjZnBwZXJpb2Q7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBjZnBtYXhkdXJhdGlvbjsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGZoZHdlbGx0aW1lOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgZmhob3BzZXQ7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBmaGhvcHBhdHRlcm47Ci0JcDgwMjExaXRlbV91aW50MzJfdCBkc2NoYW5uZWw7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBpYnNzYXRpbXdpbmRvdzsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHByb2JlZGVsYXk7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBjZnBvbGxhYmxlOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgY2Zwb2xscmVxOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYmFzaWNyYXRlMTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGJhc2ljcmF0ZTI7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBiYXNpY3JhdGUzOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYmFzaWNyYXRlNDsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGJhc2ljcmF0ZTU7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBiYXNpY3JhdGU2OwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYmFzaWNyYXRlNzsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGJhc2ljcmF0ZTg7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBvcGVyYXRpb25hbHJhdGUxOwotCXA4MDIxMWl0ZW1fdWludDMyX3Qgb3BlcmF0aW9uYWxyYXRlMjsKLQlwODAyMTFpdGVtX3VpbnQzMl90IG9wZXJhdGlvbmFscmF0ZTM7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBvcGVyYXRpb25hbHJhdGU0OwotCXA4MDIxMWl0ZW1fdWludDMyX3Qgb3BlcmF0aW9uYWxyYXRlNTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IG9wZXJhdGlvbmFscmF0ZTY7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBvcGVyYXRpb25hbHJhdGU3OwotCXA4MDIxMWl0ZW1fdWludDMyX3Qgb3BlcmF0aW9uYWxyYXRlODsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGJzc3R5cGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGJlYWNvbnBlcmlvZDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgZHRpbXBlcmlvZDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgY2ZwcGVyaW9kOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBjZnBtYXhkdXJhdGlvbjsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgZmhkd2VsbHRpbWU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGZoaG9wc2V0OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBmaGhvcHBhdHRlcm47CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGRzY2hhbm5lbDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgaWJzc2F0aW13aW5kb3c7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHByb2JlZGVsYXk7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGNmcG9sbGFibGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGNmcG9sbHJlcTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmFzaWNyYXRlMTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmFzaWNyYXRlMjsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmFzaWNyYXRlMzsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmFzaWNyYXRlNDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmFzaWNyYXRlNTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmFzaWNyYXRlNjsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmFzaWNyYXRlNzsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmFzaWNyYXRlODsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgb3BlcmF0aW9uYWxyYXRlMTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgb3BlcmF0aW9uYWxyYXRlMjsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgb3BlcmF0aW9uYWxyYXRlMzsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgb3BlcmF0aW9uYWxyYXRlNDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgb3BlcmF0aW9uYWxyYXRlNTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgb3BlcmF0aW9uYWxyYXRlNjsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgb3BlcmF0aW9uYWxyYXRlNzsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgb3BlcmF0aW9uYWxyYXRlODsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgcmVzdWx0Y29kZTsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2lmc3RhdGUgewogCXUzMiBtc2djb2RlOwogCXUzMiBtc2dsZW47CiAJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGlmc3RhdGU7Ci0JcDgwMjExaXRlbV91aW50MzJfdCByZXN1bHRjb2RlOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBpZnN0YXRlOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiByZXN1bHRjb2RlOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfd2xhbnNuaWZmIHsKIAl1MzIgbXNnY29kZTsKIAl1MzIgbXNnbGVuOwogCXU4IGRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07Ci0JcDgwMjExaXRlbV91aW50MzJfdCBlbmFibGU7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBjaGFubmVsOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgcHJpc21oZWFkZXI7Ci0JcDgwMjExaXRlbV91aW50MzJfdCB3bGFuaGVhZGVyOwotCXA4MDIxMWl0ZW1fdWludDMyX3Qga2VlcHdlcGZsYWdzOwotCXA4MDIxMWl0ZW1fdWludDMyX3Qgc3RyaXBmY3M7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBwYWNrZXRfdHJ1bmM7Ci0JcDgwMjExaXRlbV91aW50MzJfdCByZXN1bHRjb2RlOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBlbmFibGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGNoYW5uZWw7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHByaXNtaGVhZGVyOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiB3bGFuaGVhZGVyOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBrZWVwd2VwZmxhZ3M7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHN0cmlwZmNzOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBwYWNrZXRfdHJ1bmM7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHJlc3VsdGNvZGU7CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgcDgwMjExbXNnX2xueHJlcV9ob3N0d2VwIHsKIAl1MzIgbXNnY29kZTsKIAl1MzIgbXNnbGVuOwogCXU4IGRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07Ci0JcDgwMjExaXRlbV91aW50MzJfdCByZXN1bHRjb2RlOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgZGVjcnlwdDsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGVuY3J5cHQ7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHJlc3VsdGNvZGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGRlY3J5cHQ7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGVuY3J5cHQ7CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgcDgwMjExbXNnX2xueHJlcV9jb21tc3F1YWxpdHkgewogCXUzMiBtc2djb2RlOwogCXUzMiBtc2dsZW47CiAJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBkYm07Ci0JcDgwMjExaXRlbV91aW50MzJfdCBsaW5rOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgbGV2ZWw7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBub2lzZTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHR4cmF0ZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgcmVzdWx0Y29kZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgZGJtOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBsaW5rOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBsZXZlbDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgbm9pc2U7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHR4cmF0ZTsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2F1dG9qb2luIHsKIAl1MzIgbXNnY29kZTsKIAl1MzIgbXNnbGVuOwogCXU4IGRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07Ci0JcDgwMjExaXRlbV9wc3RyMzJfdCBzc2lkOworCXN0cnVjdCBwODAyMTFpdGVtX3BzdHIzMiBzc2lkOwogCXU4IHBhZF8xOURbM107Ci0JcDgwMjExaXRlbV91aW50MzJfdCBhdXRodHlwZTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGF1dGh0eXBlOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiByZXN1bHRjb2RlOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9yZWFkcGRhIHsKIAl1MzIgbXNnY29kZTsKIAl1MzIgbXNnbGVuOwogCXU4IGRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07Ci0JcDgwMjExaXRlbV91bmsxMDI0X3QgcGRhOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgcmVzdWx0Y29kZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91bmsxMDI0IHBkYTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgcmVzdWx0Y29kZTsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfcmFtZGxfc3RhdGUgewogCXUzMiBtc2djb2RlOwogCXUzMiBtc2dsZW47CiAJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGVuYWJsZTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGV4ZWFkZHI7Ci0JcDgwMjExaXRlbV91aW50MzJfdCByZXN1bHRjb2RlOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBlbmFibGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGV4ZWFkZHI7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHJlc3VsdGNvZGU7CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX3JhbWRsX3dyaXRlIHsKIAl1MzIgbXNnY29kZTsKIAl1MzIgbXNnbGVuOwogCXU4IGRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07Ci0JcDgwMjExaXRlbV91aW50MzJfdCBhZGRyOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgbGVuOwotCXA4MDIxMWl0ZW1fdW5rNDA5Nl90IGRhdGE7Ci0JcDgwMjExaXRlbV91aW50MzJfdCByZXN1bHRjb2RlOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBhZGRyOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBsZW47CisJc3RydWN0IHA4MDIxMWl0ZW1fdW5rNDA5NiBkYXRhOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiByZXN1bHRjb2RlOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9mbGFzaGRsX3N0YXRlIHsKIAl1MzIgbXNnY29kZTsKIAl1MzIgbXNnbGVuOwogCXU4IGRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07Ci0JcDgwMjExaXRlbV91aW50MzJfdCBlbmFibGU7Ci0JcDgwMjExaXRlbV91aW50MzJfdCByZXN1bHRjb2RlOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBlbmFibGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHJlc3VsdGNvZGU7CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX2ZsYXNoZGxfd3JpdGUgewogCXUzMiBtc2djb2RlOwogCXUzMiBtc2dsZW47CiAJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGFkZHI7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBsZW47Ci0JcDgwMjExaXRlbV91bms0MDk2X3QgZGF0YTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGFkZHI7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGxlbjsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91bms0MDk2IGRhdGE7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHJlc3VsdGNvZGU7CiB9IF9fcGFja2VkOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmMKaW5kZXggOTBjYzhjZC4uODI1YTYzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmMKQEAgLTkxLDE3ICs5MSwxNyBAQAogI2luY2x1ZGUgImNmZzgwMjExLmMiCiAKIC8qIG5ldGRldmljZSBtZXRob2QgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IHA4MDIxMWtuZXRkZXZfaW5pdChuZXRkZXZpY2VfdCAqbmV0ZGV2KTsKLXN0YXRpYyBpbnQgcDgwMjExa25ldGRldl9vcGVuKG5ldGRldmljZV90ICpuZXRkZXYpOwotc3RhdGljIGludCBwODAyMTFrbmV0ZGV2X3N0b3AobmV0ZGV2aWNlX3QgKm5ldGRldik7CitzdGF0aWMgaW50IHA4MDIxMWtuZXRkZXZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKK3N0YXRpYyBpbnQgcDgwMjExa25ldGRldl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOworc3RhdGljIGludCBwODAyMTFrbmV0ZGV2X3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CiBzdGF0aWMgaW50IHA4MDIxMWtuZXRkZXZfaGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCSBuZXRkZXZpY2VfdCAqbmV0ZGV2KTsKLXN0YXRpYyB2b2lkIHA4MDIxMWtuZXRkZXZfc2V0X211bHRpY2FzdF9saXN0KG5ldGRldmljZV90ICpkZXYpOwotc3RhdGljIGludCBwODAyMTFrbmV0ZGV2X2RvX2lvY3RsKG5ldGRldmljZV90ICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLAorCQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitzdGF0aWMgdm9pZCBwODAyMTFrbmV0ZGV2X3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgcDgwMjExa25ldGRldl9kb19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwKIAkJCQkgIGludCBjbWQpOwotc3RhdGljIGludCBwODAyMTFrbmV0ZGV2X3NldF9tYWNfYWRkcmVzcyhuZXRkZXZpY2VfdCAqZGV2LCB2b2lkICphZGRyKTsKLXN0YXRpYyB2b2lkIHA4MDIxMWtuZXRkZXZfdHhfdGltZW91dChuZXRkZXZpY2VfdCAqbmV0ZGV2KTsKLXN0YXRpYyBpbnQgcDgwMjExX3J4X3R5cGVkcm9wKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTE2IGZjKTsKK3N0YXRpYyBpbnQgcDgwMjExa25ldGRldl9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcik7CitzdGF0aWMgdm9pZCBwODAyMTFrbmV0ZGV2X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitzdGF0aWMgaW50IHA4MDIxMV9yeF90eXBlZHJvcChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTE2IGZjKTsKIAogaW50IHdsYW5fd2F0Y2hkb2cgPSA1MDAwOwogbW9kdWxlX3BhcmFtKHdsYW5fd2F0Y2hkb2csIGludCwgMDY0NCk7CkBAIC0xMjMsNyArMTIzLDcgQEAKICogUmV0dXJuczoKICoJbm90aGluZwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IHA4MDIxMWtuZXRkZXZfaW5pdChuZXRkZXZpY2VfdCAqbmV0ZGV2KQorc3RhdGljIGludCBwODAyMTFrbmV0ZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKIAkvKiBDYWxsZWQgaW4gcmVzcG9uc2UgdG8gcmVnaXN0ZXJfbmV0ZGV2ICovCiAJLyogVGhpcyBpcyB1c3VhbGx5IHRoZSBwcm9iZSBmdW5jdGlvbiwgYnV0IHRoZSBwcm9iZSBoYXMgKi8KQEAgLTE0NiwxMCArMTQ2LDEwIEBACiAqIFJldHVybnM6CiAqCXplcm8gb24gc3VjY2Vzcywgbm9uLXplcm8gb3RoZXJ3aXNlCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgcDgwMjExa25ldGRldl9vcGVuKG5ldGRldmljZV90ICpuZXRkZXYpCitzdGF0aWMgaW50IHA4MDIxMWtuZXRkZXZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCWludCByZXN1bHQgPSAwOwkJLyogc3VjY2VzcyAqLwotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IG5ldGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiA9IG5ldGRldi0+bWxfcHJpdjsKIAogCS8qIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgTVNEIGlzIHJ1bm5pbmcgKi8KIAlpZiAod2xhbmRldi0+bXNkc3RhdGUgIT0gV0xBTl9NU0RfUlVOTklORykKQEAgLTE4MSwxMCArMTgxLDEwIEBACiAqIFJldHVybnM6CiAqCXplcm8gb24gc3VjY2Vzcywgbm9uLXplcm8gb3RoZXJ3aXNlCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgcDgwMjExa25ldGRldl9zdG9wKG5ldGRldmljZV90ICpuZXRkZXYpCitzdGF0aWMgaW50IHA4MDIxMWtuZXRkZXZfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCWludCByZXN1bHQgPSAwOwotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IG5ldGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiA9IG5ldGRldi0+bWxfcHJpdjsKIAogCWlmICh3bGFuZGV2LT5jbG9zZSkKIAkJcmVzdWx0ID0gd2xhbmRldi0+Y2xvc2Uod2xhbmRldik7CkBAIC0yMDgsNyArMjA4LDcgQEAKICogU2lkZSBlZmZlY3RzOgogKgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIHA4MDIxMW5ldGRldl9yeCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHN0cnVjdCBza19idWZmICpza2IpCit2b2lkIHA4MDIxMW5ldGRldl9yeChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAkvKiBFbnF1ZXVlIGZvciBwb3N0LWlycSBwcm9jZXNzaW5nICovCiAJc2tiX3F1ZXVlX3RhaWwoJndsYW5kZXYtPm5zZF9yeHEsIHNrYik7CkBAIC0yMjcsMTEgKzIyNywxMSBAQAogICoJICAgIENPTlZfVE9fRVRIRVJfRkFJTEVEIGlmIGNvbnZlcnNpb24gZmFpbGVkCiAgKgkgICAgQ09OVl9UT19FVEhFUl9TS0lQUEVEIGlmIGZyYW1lIGlzIGlnbm9yZWQKICAqLwotc3RhdGljIGludCBwODAyMTFfY29udmVydF90b19ldGhlcih3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW50IHA4MDIxMV9jb252ZXJ0X3RvX2V0aGVyKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBwODAyMTFfaGRyX2EzICpoZHI7CiAKLQloZHIgPSAoc3RydWN0IHA4MDIxMV9oZHJfYTMgKikgc2tiLT5kYXRhOworCWhkciA9IChzdHJ1Y3QgcDgwMjExX2hkcl9hMyAqKXNrYi0+ZGF0YTsKIAlpZiAocDgwMjExX3J4X3R5cGVkcm9wKHdsYW5kZXYsIGhkci0+ZmMpKQogCQlyZXR1cm4gQ09OVl9UT19FVEhFUl9TS0lQUEVEOwogCkBAIC0yNjUsOSArMjY1LDkgQEAKICAqLwogc3RhdGljIHZvaWQgcDgwMjExbmV0ZGV2X3J4X2JoKHVuc2lnbmVkIGxvbmcgYXJnKQogewotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9ICh3bGFuZGV2aWNlX3QgKikgYXJnOworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2ID0gKHN0cnVjdCB3bGFuZGV2aWNlICopYXJnOwogCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwotCW5ldGRldmljZV90ICpkZXYgPSB3bGFuZGV2LT5uZXRkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHdsYW5kZXYtPm5ldGRldjsKIAogCS8qIExldCdzIGVtcHR5IG91ciBvdXIgcXVldWUgKi8KIAl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZ3bGFuZGV2LT5uc2RfcnhxKSkpIHsKQEAgLTMxOCwxMSArMzE4LDExIEBACiAqCXplcm8gb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZmFpbHVyZS4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIGludCBwODAyMTFrbmV0ZGV2X2hhcmRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkgbmV0ZGV2aWNlX3QgKm5ldGRldikKKwkJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJaW50IHR4cmVzdWx0ID0gLTE7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gbmV0ZGV2LT5tbF9wcml2OworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2ID0gbmV0ZGV2LT5tbF9wcml2OwogCXVuaW9uIHA4MDIxMV9oZHIgcDgwMjExX2hkcjsKIAlzdHJ1Y3QgcDgwMjExX21ldGF3ZXAgcDgwMjExX3dlcDsKIApAQCAtNDQ2LDkgKzQ0Niw5IEBACiAqIFJldHVybnM6CiAqCW5vdGhpbmcKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgcDgwMjExa25ldGRldl9zZXRfbXVsdGljYXN0X2xpc3QobmV0ZGV2aWNlX3QgKmRldikKK3N0YXRpYyB2b2lkIHA4MDIxMWtuZXRkZXZfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OwogCiAJLyogVE9ETzogIHJlYWwgbXVsdGljYXN0IHN1cHBvcnQgYXMgd2VsbCAqLwogCkBAIC00NTksNyArNDU5LDcgQEAKIAogI2lmZGVmIFNJT0NFVEhUT09MCiAKLXN0YXRpYyBpbnQgcDgwMjExbmV0ZGV2X2V0aHRvb2wod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkIF9fdXNlciAqdXNlcmFkZHIpCitzdGF0aWMgaW50IHA4MDIxMW5ldGRldl9ldGh0b29sKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB2b2lkIF9fdXNlciAqdXNlcmFkZHIpCiB7CiAJdTMyIGV0aGNtZDsKIAlzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvIGluZm87CkBAIC01MzEsMTEgKzUzMSwxMSBAQAogKglQcm9jZXNzIHRocmVhZCAoaW9jdGwgY2FsbGVyKS4gIFRPRE86IFNNUCBzdXBwb3J0IG1heSByZXF1aXJlCiAqCWxvY2tzLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IHA4MDIxMWtuZXRkZXZfZG9faW9jdGwobmV0ZGV2aWNlX3QgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCitzdGF0aWMgaW50IHA4MDIxMWtuZXRkZXZfZG9faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCiB7CiAJaW50IHJlc3VsdCA9IDA7Ci0Jc3RydWN0IHA4MDIxMWlvY3RsX3JlcSAqcmVxID0gKHN0cnVjdCBwODAyMTFpb2N0bF9yZXEgKikgaWZyOwotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3QgcDgwMjExaW9jdGxfcmVxICpyZXEgPSAoc3RydWN0IHA4MDIxMWlvY3RsX3JlcSAqKWlmcjsKKwlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKIAl1OCAqbXNnYnVmOwogCiAJbmV0ZGV2X2RiZyhkZXYsICJyeCdkIGlvY3RsLCBjbWQ9JWQsIGxlbj0lZFxuIiwgY21kLCByZXEtPmxlbik7CkBAIC02MTAsMTMgKzYxMCwxMyBAQAogKgogKiBieTogQ29sbGluIFIuIE11bGxpbmVyIDxjb2xsaW5AbXVsbGluZXIub3JnPgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IHA4MDIxMWtuZXRkZXZfc2V0X21hY19hZGRyZXNzKG5ldGRldmljZV90ICpkZXYsIHZvaWQgKmFkZHIpCitzdGF0aWMgaW50IHA4MDIxMWtuZXRkZXZfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCiB7CiAJc3RydWN0IHNvY2thZGRyICpuZXdfYWRkciA9IGFkZHI7CiAJc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgZG90MTFyZXE7Ci0JcDgwMjExaXRlbV91bmszOTJfdCAqbWliYXR0cjsKLQlwODAyMTFpdGVtX3BzdHI2X3QgKm1hY2FkZHI7Ci0JcDgwMjExaXRlbV91aW50MzJfdCAqcmVzdWx0Y29kZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91bmszOTIgKm1pYmF0dHI7CisJc3RydWN0IHA4MDIxMWl0ZW1fcHN0cjYgKm1hY2FkZHI7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyICpyZXN1bHRjb2RlOwogCWludCByZXN1bHQ7CiAKIAkvKiBJZiB3ZSdyZSBydW5uaW5nLCB3ZSBkb24ndCBhbGxvdyBNQUMgYWRkcmVzcyBjaGFuZ2VzICovCkBAIC02MjUsNyArNjI1LDcgQEAKIAogCS8qIFNldCB1cCBzb21lIGNvbnZlbmllbmNlIHBvaW50ZXJzLiAqLwogCW1pYmF0dHIgPSAmZG90MTFyZXEubWliYXR0cmlidXRlOwotCW1hY2FkZHIgPSAocDgwMjExaXRlbV9wc3RyNl90ICopICZtaWJhdHRyLT5kYXRhOworCW1hY2FkZHIgPSAoc3RydWN0IHA4MDIxMWl0ZW1fcHN0cjYgKikmbWliYXR0ci0+ZGF0YTsKIAlyZXN1bHRjb2RlID0gJmRvdDExcmVxLnJlc3VsdGNvZGU7CiAKIAkvKiBTZXQgdXAgYSBkb3QxMXJlcV9taWJzZXQgKi8KQEAgLTYzMyw3ICs2MzMsNyBAQAogCWRvdDExcmVxLm1zZ2NvZGUgPSBESURtc2dfZG90MTFyZXFfbWlic2V0OwogCWRvdDExcmVxLm1zZ2xlbiA9IHNpemVvZihzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCk7CiAJbWVtY3B5KGRvdDExcmVxLmRldm5hbWUsCi0JICAgICAgICgod2xhbmRldmljZV90ICopIGRldi0+bWxfcHJpdiktPm5hbWUsIFdMQU5fREVWTkFNRUxFTl9NQVggLSAxKTsKKwkgICAgICAgKChzdHJ1Y3Qgd2xhbmRldmljZSAqKWRldi0+bWxfcHJpdiktPm5hbWUsIFdMQU5fREVWTkFNRUxFTl9NQVggLSAxKTsKIAogCS8qIFNldCB1cCB0aGUgbWliYXR0cmlidXRlIGFyZ3VtZW50ICovCiAJbWliYXR0ci0+ZGlkID0gRElEbXNnX2RvdDExcmVxX21pYnNldF9taWJhdHRyaWJ1dGU7CkBAIC02NTMsNyArNjUzLDcgQEAKIAlyZXN1bHRjb2RlLT5kYXRhID0gMDsKIAogCS8qIG5vdyBmaXJlIHRoZSByZXF1ZXN0ICovCi0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdChkZXYtPm1sX3ByaXYsICh1OCAqKSAmZG90MTFyZXEpOworCXJlc3VsdCA9IHA4MDIxMXJlcV9kb3JlcXVlc3QoZGV2LT5tbF9wcml2LCAodTggKikmZG90MTFyZXEpOwogCiAJLyogSWYgdGhlIHJlcXVlc3Qgd2Fzbid0IHN1Y2Nlc3NmdWwsIHJlcG9ydCBhbiBlcnJvciBhbmQgZG9uJ3QKIAkgKiBjaGFuZ2UgdGhlIG5ldGRldiBhZGRyZXNzCkBAIC02NjksNyArNjY5LDcgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgaW50IHdsYW5fY2hhbmdlX210dShuZXRkZXZpY2VfdCAqZGV2LCBpbnQgbmV3X210dSkKK3N0YXRpYyBpbnQgd2xhbl9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQogewogCS8qIDIzMTIgaXMgbWF4IDgwMi4xMSBwYXlsb2FkLCAyMCBpcyBvdmVyaGVhZCwgKGV0aGVyICsgbGxjICtzbmFwKQogCSAgIGFuZCBhbm90aGVyIDggZm9yIHdlcC4gKi8KQEAgLTcxNywxMCArNzE3LDEwIEBACiAqCWNvbXBpbGVkIGRyaXZlcnMsIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgaW4gdGhlCiAqCWNvbnRleHQgb2YgdGhlIGtlcm5lbCBzdGFydHVwIGNvZGUuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCB3bGFuX3NldHVwKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgc3RydWN0IGRldmljZSAqcGh5c2RldikKK2ludCB3bGFuX3NldHVwKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBzdHJ1Y3QgZGV2aWNlICpwaHlzZGV2KQogewogCWludCByZXN1bHQgPSAwOwotCW5ldGRldmljZV90ICpuZXRkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKIAlzdHJ1Y3Qgd2lwaHkgKndpcGh5OwogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXY7CiAKQEAgLTc4Myw3ICs3ODMsNyBAQAogKgljb21waWxlZCBkcml2ZXJzLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGluIHRoZQogKgljb250ZXh0IG9mIHRoZSBrZXJuZWwgc3RhcnR1cCBjb2RlLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIHdsYW5fdW5zZXR1cCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCit2b2lkIHdsYW5fdW5zZXR1cChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldikKIHsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2OwogCkBAIC04MTcsNyArODE3LDcgQEAKICogQ2FsbCBDb250ZXh0OgogKglDYW4gYmUgZWl0aGVyIGludGVycnVwdCBvciBub3QuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCByZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXZpY2VfdCAqd2xhbmRldikKK2ludCByZWdpc3Rlcl93bGFuZGV2KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KQogewogCXJldHVybiByZWdpc3Rlcl9uZXRkZXYod2xhbmRldi0+bmV0ZGV2KTsKIH0KQEAgLTgzOSw3ICs4MzksNyBAQAogKiBDYWxsIENvbnRleHQ6CiAqCUNhbiBiZSBlaXRoZXIgaW50ZXJydXB0IG9yIG5vdC4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHVucmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2aWNlX3QgKndsYW5kZXYpCitpbnQgdW5yZWdpc3Rlcl93bGFuZGV2KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAKQEAgLTg4Miw3ICs4ODIsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCVVzdWFsbHkgaW50ZXJydXB0LgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIHA4MDIxMW5ldGRldl9od3JlbW92ZWQod2xhbmRldmljZV90ICp3bGFuZGV2KQordm9pZCBwODAyMTFuZXRkZXZfaHdyZW1vdmVkKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KQogewogCXdsYW5kZXYtPmh3cmVtb3ZlZCA9IDE7CiAJaWYgKHdsYW5kZXYtPnN0YXRlID09IFdMQU5fREVWSUNFX09QRU4pCkBAIC05MTIsNyArOTEyLDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglpbnRlcnJ1cHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCBwODAyMTFfcnhfdHlwZWRyb3Aod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MTYgZmMpCitzdGF0aWMgaW50IHA4MDIxMV9yeF90eXBlZHJvcChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTE2IGZjKQogewogCXUxNiBmdHlwZTsKIAl1MTYgZnN0eXBlOwpAQCAtMTA3MSw5ICsxMDcxLDkgQEAKIAlyZXR1cm4gZHJvcDsKIH0KIAotc3RhdGljIHZvaWQgcDgwMjExa25ldGRldl90eF90aW1lb3V0KG5ldGRldmljZV90ICpuZXRkZXYpCitzdGF0aWMgdm9pZCBwODAyMTFrbmV0ZGV2X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBuZXRkZXYtPm1sX3ByaXY7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSBuZXRkZXYtPm1sX3ByaXY7CiAKIAlpZiAod2xhbmRldi0+dHhfdGltZW91dCkgewogCQl3bGFuZGV2LT50eF90aW1lb3V0KHdsYW5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuaAppbmRleCA4MjBhMGUyLi4xZTZhNzc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuaApAQCAtNTcsOSArNTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAKLSN1bmRlZiBuZXRkZXZpY2VfdAotdHlwZWRlZiBzdHJ1Y3QgbmV0X2RldmljZSBuZXRkZXZpY2VfdDsKLQogI2RlZmluZSBXTEFOX1JFTEVBU0UJIjAuMy4wLXN0YWdpbmciCiAKICNkZWZpbmUgV0xBTl9ERVZJQ0VfQ0xPU0VECTAKQEAgLTEwMSw3ICs5OCw3IEBACiAjZGVmaW5lIFA4MDIxMV9OU0RDQVBfTk9TQ0FOICAgICAgICAgICAgICAgIDB4MjAwIC8qIG5zZCBjYW4gc2NhbiAqLwogCiAvKiBSZWNlaXZlZCBmcmFtZSBzdGF0aXN0aWNzICovCi10eXBlZGVmIHN0cnVjdCBwODAyMTFfZnJtcnhfdCB7CitzdHJ1Y3QgcDgwMjExX2ZybXJ4IHsKIAl1MzIgbWdtdDsKIAl1MzIgYXNzb2NyZXE7CiAJdTMyIGFzc29jcmVzcDsKQEAgLTEzNSwxMCArMTMyLDEwIEBACiAJdTMyIGRhdGFfdW5rbm93bjsKIAl1MzIgZGVjcnlwdDsKIAl1MzIgZGVjcnlwdF9lcnI7Ci19IHA4MDIxMV9mcm1yeF90OworfTsKIAogLyogY2FsbGVkIGJ5IC9wcm9jL25ldC93aXJlbGVzcyAqLwotc3RydWN0IGl3X3N0YXRpc3RpY3MgKnA4MDIxMXdleHRfZ2V0X3dpcmVsZXNzX3N0YXRzKG5ldGRldmljZV90ICpkZXYpOworc3RydWN0IGl3X3N0YXRpc3RpY3MgKnA4MDIxMXdleHRfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogLyogd2lyZWxlc3MgZXh0ZW5zaW9ucycgaW9jdGxzICovCiBleHRlcm4gc3RydWN0IGl3X2hhbmRsZXJfZGVmIHA4MDIxMXdleHRfaGFuZGxlcl9kZWY7CiAKQEAgLTE1Nyw3ICsxNTQsNyBAQAogZXh0ZXJuIGludCB3bGFuX3dleHRfd3JpdGU7CiAKIC8qIFdMQU4gZGV2aWNlIHR5cGUgKi8KLXR5cGVkZWYgc3RydWN0IHdsYW5kZXZpY2Ugeworc3RydWN0IHdsYW5kZXZpY2UgewogCXZvaWQgKnByaXY7CQkvKiBwcml2YXRlIGRhdGEgZm9yIE1TRCAqLwogCiAJLyogU3Vic3lzdGVtIFN0YXRlICovCkBAIC0xODYsMTIgKzE4MywxMiBAQAogCQkJc3RydWN0IHA4MDIxMV9tZXRhd2VwICpwODAyMTFfd2VwKTsKIAlpbnQgKCptbG1lcmVxdWVzdCkoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHN0cnVjdCBwODAyMTFtc2cgKm1zZyk7CiAJaW50ICgqc2V0X211bHRpY2FzdF9saXN0KShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKLQkJCQkgICBuZXRkZXZpY2VfdCAqZGV2KTsKKwkJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAl2b2lkICgqdHhfdGltZW91dCkoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpOwogCiAJLyogODAyLjExIFN0YXRlICovCiAJdTggYnNzaWRbV0xBTl9CU1NJRF9MRU5dOwotCXA4MDIxMXBzdHIzMl90IHNzaWQ7CisJc3RydWN0IHA4MDIxMXBzdHIzMiBzc2lkOwogCXUzMiBtYWNtb2RlOwogCWludCBsaW5rc3RhdHVzOwogCkBAIC0yMDYsNyArMjAzLDcgQEAKIAkvKiBuZXRsaW5rIHNvY2tldCAqLwogCS8qIHF1ZXVlIGZvciBpbmRpY2F0aW9ucyB3YWl0aW5nIGZvciBjbWQgY29tcGxldGlvbiAqLwogCS8qIExpbnV4IG5ldGRldmljZSBhbmQgc3VwcG9ydCAqLwotCW5ldGRldmljZV90ICpuZXRkZXY7CS8qIHB0ciB0byBsaW51eCBuZXRkZXZpY2UgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwkvKiBwdHIgdG8gbGludXggbmV0ZGV2aWNlICovCiAKIAkvKiBSeCBib3R0b20gaGFsZiAqLwogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCByeF9iaDsKQEAgLTIxNCw3ICsyMTEsNyBAQAogCXN0cnVjdCBza19idWZmX2hlYWQgbnNkX3J4cTsKIAogCS8qIDgwMi4xMSBkZXZpY2Ugc3RhdGlzdGljcyAqLwotCXN0cnVjdCBwODAyMTFfZnJtcnhfdCByeDsKKwlzdHJ1Y3QgcDgwMjExX2ZybXJ4IHJ4OwogCiAJc3RydWN0IGl3X3N0YXRpc3RpY3Mgd3N0YXRzOwogCkBAIC0yMjIsMTkgKzIxOSwxOSBAQAogCXU4IHNweV9udW1iZXI7CiAJY2hhciBzcHlfYWRkcmVzc1tJV19NQVhfU1BZXVtFVEhfQUxFTl07CiAJc3RydWN0IGl3X3F1YWxpdHkgc3B5X3N0YXRbSVdfTUFYX1NQWV07Ci19IHdsYW5kZXZpY2VfdDsKK307CiAKIC8qIFdFUCBzdHVmZiAqLwotaW50IHdlcF9jaGFuZ2Vfa2V5KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgaW50IGtleW51bSwgdTggKmtleSwgaW50IGtleWxlbik7Ci1pbnQgd2VwX2RlY3J5cHQod2xhbmRldmljZV90ICp3bGFuZGV2LCB1OCAqYnVmLCB1MzIgbGVuLCBpbnQga2V5X292ZXJyaWRlLAoraW50IHdlcF9jaGFuZ2Vfa2V5KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBpbnQga2V5bnVtLCB1OCAqa2V5LCBpbnQga2V5bGVuKTsKK2ludCB3ZXBfZGVjcnlwdChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTggKmJ1ZiwgdTMyIGxlbiwgaW50IGtleV9vdmVycmlkZSwKIAkJdTggKml2LCB1OCAqaWN2KTsKLWludCB3ZXBfZW5jcnlwdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHU4ICpidWYsIHU4ICpkc3QsIHUzMiBsZW4sIGludCBrZXludW0sCi0JCXU4ICppdiwgdTggKmljdik7CitpbnQgd2VwX2VuY3J5cHQoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHU4ICpidWYsIHU4ICpkc3QsIHUzMiBsZW4sCisJCWludCBrZXludW0sIHU4ICppdiwgdTggKmljdik7CiAKLWludCB3bGFuX3NldHVwKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgc3RydWN0IGRldmljZSAqcGh5c2Rldik7Ci12b2lkIHdsYW5fdW5zZXR1cCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwotaW50IHJlZ2lzdGVyX3dsYW5kZXYod2xhbmRldmljZV90ICp3bGFuZGV2KTsKLWludCB1bnJlZ2lzdGVyX3dsYW5kZXYod2xhbmRldmljZV90ICp3bGFuZGV2KTsKLXZvaWQgcDgwMjExbmV0ZGV2X3J4KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci12b2lkIHA4MDIxMW5ldGRldl9od3JlbW92ZWQod2xhbmRldmljZV90ICp3bGFuZGV2KTsKK2ludCB3bGFuX3NldHVwKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBzdHJ1Y3QgZGV2aWNlICpwaHlzZGV2KTsKK3ZvaWQgd2xhbl91bnNldHVwKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KTsKK2ludCByZWdpc3Rlcl93bGFuZGV2KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KTsKK2ludCB1bnJlZ2lzdGVyX3dsYW5kZXYoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpOwordm9pZCBwODAyMTFuZXRkZXZfcngoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHN0cnVjdCBza19idWZmICpza2IpOwordm9pZCBwODAyMTFuZXRkZXZfaHdyZW1vdmVkKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExcmVxLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFyZXEuYwppbmRleCA0Yjg0YjU2Li5kNDNlODViNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExcmVxLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExcmVxLmMKQEAgLTcyLDExICs3MiwyNiBAQAogI2luY2x1ZGUgInA4MDIxMW1ldGFzdHJ1Y3QuaCIKICNpbmNsdWRlICJwODAyMTFyZXEuaCIKIAotc3RhdGljIHZvaWQgcDgwMjExcmVxX2hhbmRsZW1zZyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHN0cnVjdCBwODAyMTFtc2cgKm1zZyk7Ci1zdGF0aWMgdm9pZCBwODAyMTFyZXFfbWlic2V0X21pYmdldCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsCitzdGF0aWMgdm9pZCBwODAyMTFyZXFfaGFuZGxlbXNnKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBzdHJ1Y3QgcDgwMjExbXNnICptc2cpOworc3RhdGljIHZvaWQgcDgwMjExcmVxX21pYnNldF9taWJnZXQoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCiAJCQkJICAgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJnZXQgKm1pYl9tc2csCiAJCQkJICAgaW50IGlzZ2V0KTsKIAorc3RhdGljIHZvaWQgcDgwMjExcmVxX2hhbmRsZV9hY3Rpb24oc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHUzMiAqZGF0YSwKKwkJCQkgICAgaW50IGlzZ2V0LCB1MzIgZmxhZykKK3sKKwlpZiAoaXNnZXQpIHsKKwkJaWYgKHdsYW5kZXYtPmhvc3R3ZXAgJiBmbGFnKQorCQkJKmRhdGEgPSBQODAyMTFFTlVNX3RydXRoX3RydWU7CisJCWVsc2UKKwkJCSpkYXRhID0gUDgwMjExRU5VTV90cnV0aF9mYWxzZTsKKwl9IGVsc2UgeworCQl3bGFuZGV2LT5ob3N0d2VwICY9IH5mbGFnOworCQlpZiAoKmRhdGEgPT0gUDgwMjExRU5VTV90cnV0aF90cnVlKQorCQkJd2xhbmRldi0+aG9zdHdlcCB8PSBmbGFnOworCX0KK30KKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHA4MDIxMXJlcV9kb3JlcXVlc3QKICoKQEAgLTkzLDkgKzEwOCw5IEBACiAqCVBvdGVudGlhbGx5IGJsb2NrcyB0aGUgY2FsbGVyLCBzbyBpdCdzIGEgZ29vZCBpZGVhIHRvCiAqCW5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gZnJvbSBhbiBpbnRlcnJ1cHQgY29udGV4dC4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHA4MDIxMXJlcV9kb3JlcXVlc3Qod2xhbmRldmljZV90ICp3bGFuZGV2LCB1OCAqbXNnYnVmKQoraW50IHA4MDIxMXJlcV9kb3JlcXVlc3Qoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHU4ICptc2didWYpCiB7Ci0Jc3RydWN0IHA4MDIxMW1zZyAqbXNnID0gKHN0cnVjdCBwODAyMTFtc2cgKikgbXNnYnVmOworCXN0cnVjdCBwODAyMTFtc2cgKm1zZyA9IChzdHJ1Y3QgcDgwMjExbXNnICopbXNnYnVmOwogCiAJLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBNU0QgaXMgcnVubmluZyAqLwogCWlmICghKCh3bGFuZGV2LT5tc2RzdGF0ZSA9PSBXTEFOX01TRF9IV1BSRVNFTlQgJiYKQEAgLTE0OSwxMyArMTY0LDEzIEBACiAqIENhbGwgY29udGV4dDoKICoJUHJvY2VzcyB0aHJlYWQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgcDgwMjExcmVxX2hhbmRsZW1zZyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHN0cnVjdCBwODAyMTFtc2cgKm1zZykKK3N0YXRpYyB2b2lkIHA4MDIxMXJlcV9oYW5kbGVtc2coc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHN0cnVjdCBwODAyMTFtc2cgKm1zZykKIHsKIAlzd2l0Y2ggKG1zZy0+bXNnY29kZSkgewogCiAJY2FzZSBESURtc2dfbG54cmVxX2hvc3R3ZXA6ewogCQlzdHJ1Y3QgcDgwMjExbXNnX2xueHJlcV9ob3N0d2VwICpyZXEgPQotCQkJKHN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2hvc3R3ZXAgKikgbXNnOworCQkJKHN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2hvc3R3ZXAgKiltc2c7CiAJCXdsYW5kZXYtPmhvc3R3ZXAgJj0KIAkJCQl+KEhPU1RXRVBfREVDUllQVCB8IEhPU1RXRVBfRU5DUllQVCk7CiAJCWlmIChyZXEtPmRlY3J5cHQuZGF0YSA9PSBQODAyMTFFTlVNX3RydXRoX3RydWUpCkBAIC0xNjksNDQgKzE4NCwzNCBAQAogCWNhc2UgRElEbXNnX2RvdDExcmVxX21pYnNldDp7CiAJCWludCBpc2dldCA9IChtc2ctPm1zZ2NvZGUgPT0gRElEbXNnX2RvdDExcmVxX21pYmdldCk7CiAJCXN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWliZ2V0ICptaWJfbXNnID0KLQkJCShzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYmdldCAqKSBtc2c7CisJCQkoc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJnZXQgKiltc2c7CiAJCXA4MDIxMXJlcV9taWJzZXRfbWliZ2V0KHdsYW5kZXYsIG1pYl9tc2csIGlzZ2V0KTsKIAlicmVhazsKIAl9CiAJfQkJCS8qIHN3aXRjaCBtc2ctPm1zZ2NvZGUgKi8KIH0KIAotc3RhdGljIHZvaWQgcDgwMjExcmVxX21pYnNldF9taWJnZXQod2xhbmRldmljZV90ICp3bGFuZGV2LAorc3RhdGljIHZvaWQgcDgwMjExcmVxX21pYnNldF9taWJnZXQoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCiAJCQkJICAgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJnZXQgKm1pYl9tc2csCiAJCQkJICAgaW50IGlzZ2V0KQogewotCXA4MDIxMWl0ZW1kX3QgKm1pYml0ZW0gPSAocDgwMjExaXRlbWRfdCAqKSBtaWJfbXNnLT5taWJhdHRyaWJ1dGUuZGF0YTsKLQlwODAyMTFwc3RyZF90ICpwc3RyID0gKHA4MDIxMXBzdHJkX3QgKikgbWliaXRlbS0+ZGF0YTsKLQl1OCAqa2V5ID0gbWliaXRlbS0+ZGF0YSArIHNpemVvZihwODAyMTFwc3RyZF90KTsKKwlzdHJ1Y3QgcDgwMjExaXRlbWQgKm1pYml0ZW0gPSAoc3RydWN0IHA4MDIxMWl0ZW1kICopbWliX21zZy0+bWliYXR0cmlidXRlLmRhdGE7CisJc3RydWN0IHA4MDIxMXBzdHJkICpwc3RyID0gKHN0cnVjdCBwODAyMTFwc3RyZCAqKW1pYml0ZW0tPmRhdGE7CisJdTggKmtleSA9IG1pYml0ZW0tPmRhdGEgKyBzaXplb2Yoc3RydWN0IHA4MDIxMXBzdHJkKTsKIAogCXN3aXRjaCAobWliaXRlbS0+ZGlkKSB7Ci0JY2FzZSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTA6eworCWNhc2UgRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9rZXkoMSk6CisJY2FzZSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2tleSgyKToKKwljYXNlIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfa2V5KDMpOgorCWNhc2UgRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9rZXkoNCk6CiAJCWlmICghaXNnZXQpCi0JCQl3ZXBfY2hhbmdlX2tleSh3bGFuZGV2LCAwLCBrZXksIHBzdHItPmxlbik7Ci0JYnJlYWs7Ci0JfQotCWNhc2UgRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkxOnsKLQkJaWYgKCFpc2dldCkKLQkJCXdlcF9jaGFuZ2Vfa2V5KHdsYW5kZXYsIDEsIGtleSwgcHN0ci0+bGVuKTsKLQlicmVhazsKLQl9Ci0JY2FzZSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTI6ewotCQlpZiAoIWlzZ2V0KQotCQkJd2VwX2NoYW5nZV9rZXkod2xhbmRldiwgMiwga2V5LCBwc3RyLT5sZW4pOwotCWJyZWFrOwotCX0KLQljYXNlIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5Mzp7Ci0JCWlmICghaXNnZXQpCi0JCQl3ZXBfY2hhbmdlX2tleSh3bGFuZGV2LCAzLCBrZXksIHBzdHItPmxlbik7Ci0JYnJlYWs7Ci0JfQorCQkJd2VwX2NoYW5nZV9rZXkod2xhbmRldiwKKwkJCQkgICAgICAgUDgwMjExRElEX0lURU0obWliaXRlbS0+ZGlkKSAtIDEsCisJCQkJICAgICAgIGtleSwgcHN0ci0+bGVuKTsKKwkJYnJlYWs7CisKIAljYXNlIERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXlJRDp7Ci0JCXUzMiAqZGF0YSA9ICh1MzIgKikgbWliaXRlbS0+ZGF0YTsKKwkJdTMyICpkYXRhID0gKHUzMiAqKW1pYml0ZW0tPmRhdGE7CiAKIAkJaWYgKGlzZ2V0KSB7CiAJCQkqZGF0YSA9IHdsYW5kZXYtPmhvc3R3ZXAgJiBIT1NUV0VQX0RFRkFVTFRLRVlfTUFTSzsKQEAgLTIxNywzMyArMjIyLDE3IEBACiAJYnJlYWs7CiAJfQogCWNhc2UgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExUHJpdmFjeUludm9rZWQ6ewotCQl1MzIgKmRhdGEgPSAodTMyICopIG1pYml0ZW0tPmRhdGE7CisJCXUzMiAqZGF0YSA9ICh1MzIgKiltaWJpdGVtLT5kYXRhOwogCi0JCWlmIChpc2dldCkgewotCQkJaWYgKHdsYW5kZXYtPmhvc3R3ZXAgJiBIT1NUV0VQX1BSSVZBQ1lJTlZPS0VEKQotCQkJCSpkYXRhID0gUDgwMjExRU5VTV90cnV0aF90cnVlOwotCQkJZWxzZQotCQkJCSpkYXRhID0gUDgwMjExRU5VTV90cnV0aF9mYWxzZTsKLQkJfSBlbHNlIHsKLQkJCXdsYW5kZXYtPmhvc3R3ZXAgJj0gfihIT1NUV0VQX1BSSVZBQ1lJTlZPS0VEKTsKLQkJCWlmICgqZGF0YSA9PSBQODAyMTFFTlVNX3RydXRoX3RydWUpCi0JCQkJd2xhbmRldi0+aG9zdHdlcCB8PSBIT1NUV0VQX1BSSVZBQ1lJTlZPS0VEOwotCQl9CisJCXA4MDIxMXJlcV9oYW5kbGVfYWN0aW9uKHdsYW5kZXYsIGRhdGEsIGlzZ2V0LAorCQkJCQlIT1NUV0VQX1BSSVZBQ1lJTlZPS0VEKTsKIAlicmVhazsKIAl9CiAJY2FzZSBESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFFeGNsdWRlVW5lbmNyeXB0ZWQ6ewotCQl1MzIgKmRhdGEgPSAodTMyICopIG1pYml0ZW0tPmRhdGE7CisJCXUzMiAqZGF0YSA9ICh1MzIgKiltaWJpdGVtLT5kYXRhOwogCi0JCWlmIChpc2dldCkgewotCQkJaWYgKHdsYW5kZXYtPmhvc3R3ZXAgJiBIT1NUV0VQX0VYQ0xVREVVTkVOQ1JZUFRFRCkKLQkJCQkqZGF0YSA9IFA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZTsKLQkJCWVsc2UKLQkJCQkqZGF0YSA9IFA4MDIxMUVOVU1fdHJ1dGhfZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQl3bGFuZGV2LT5ob3N0d2VwICY9IH4oSE9TVFdFUF9FWENMVURFVU5FTkNSWVBURUQpOwotCQkJaWYgKCpkYXRhID09IFA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZSkKLQkJCQl3bGFuZGV2LT5ob3N0d2VwIHw9IEhPU1RXRVBfRVhDTFVERVVORU5DUllQVEVEOwotCQl9CisJCXA4MDIxMXJlcV9oYW5kbGVfYWN0aW9uKHdsYW5kZXYsIGRhdGEsIGlzZ2V0LAorCQkJCQlIT1NUV0VQX0VYQ0xVREVVTkVOQ1JZUFRFRCk7CiAJYnJlYWs7CiAJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXJlcS5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExcmVxLmgKaW5kZXggYTk1YTQ1YS4uOGQzMDU0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExcmVxLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExcmVxLmgKQEAgLTQ4LDYgKzQ4LDYgQEAKICNpZm5kZWYgX0xJTlVYX1A4MDIxMVJFUV9ICiAjZGVmaW5lIF9MSU5VWF9QODAyMTFSRVFfSAogCi1pbnQgcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHU4ICptc2didWYpOworaW50IHA4MDIxMXJlcV9kb3JlcXVlc3Qoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHU4ICptc2didWYpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXR5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTF0eXBlcy5oCmluZGV4IDhjYjRmYzYuLjI2M2VmMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXR5cGVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExdHlwZXMuaApAQCAtMSw1OCArMSw1OSBAQAotLyogcDgwMjExdHlwZXMuaAotKgotKiBNYWNyb3MsIGNvbnN0YW50cywgdHlwZXMsIGFuZCBmdW5jcyBmb3IgcDgwMjExIGRhdGEgdHlwZXMKLSoKLSogQ29weXJpZ2h0IChDKSAxOTk5IEFic29sdXRlVmFsdWUgU3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoKLSogbGludXgtd2xhbgotKgotKiAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljCi0qICAgTGljZW5zZSBWZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KLSoKLSogICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMKLSogICBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQotKiAgIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgIkdQTCIpLCBpbiB3aGljaAotKiAgIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRoZQotKiAgIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlCi0qICAgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UKLSogICB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSBNUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24KLSogICBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQotKiAgIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuICBJZiB5b3UgZG8gbm90IGRlbGV0ZQotKiAgIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzCi0qICAgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUgR1BMLgotKgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKiBJbnF1aXJpZXMgcmVnYXJkaW5nIHRoZSBsaW51eC13bGFuIE9wZW4gU291cmNlIHByb2plY3QgY2FuIGJlCi0qIG1hZGUgZGlyZWN0bHkgdG86Ci0qCi0qIEFic29sdXRlVmFsdWUgU3lzdGVtcyBJbmMuCi0qIGluZm9AbGludXgtd2xhbi5jb20KLSogaHR0cDovL3d3dy5saW51eC13bGFuLmNvbQotKgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKiBQb3J0aW9ucyBvZiB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIGZ1bmRlZCBieQotKiBJbnRlcnNpbCBDb3Jwb3JhdGlvbiBhcyBwYXJ0IG9mIFBSSVNNKFIpIGNoaXBzZXQgcHJvZHVjdCBkZXZlbG9wbWVudC4KLSoKLSogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoKLSogVGhpcyBmaWxlIGRlY2xhcmVzIHNvbWUgb2YgdGhlIGNvbnN0YW50cyBhbmQgdHlwZXMgdXNlZCBpbiB2YXJpb3VzCi0qIHBhcnRzIG9mIHRoZSBsaW51eC13bGFuIHN5c3RlbS4KLSoKLSogTm90ZXM6Ci0qICAgLSBDb25zdGFudCB2YWx1ZXMgYXJlIGFsd2F5cyBpbiBIT1NUIGJ5dGUgb3JkZXIuCi0qCi0qIEFsbCBmdW5jdGlvbnMgYW5kIHN0YXRpY3MgZGVjbGFyZWQgaGVyZSBhcmUgaW1wbGVtZW50ZWQgaW4gcDgwMjExdHlwZXMuYwotKiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLworLyoKKyAqIHA4MDIxMXR5cGVzLmgKKyAqCisgKiBNYWNyb3MsIGNvbnN0YW50cywgdHlwZXMsIGFuZCBmdW5jcyBmb3IgcDgwMjExIGRhdGEgdHlwZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgQWJzb2x1dGVWYWx1ZSBTeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBsaW51eC13bGFuCisgKgorICogICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYworICogICBMaWNlbnNlIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICogICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCisgKgorICogICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMKKyAqICAgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICogICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyAqICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiAgIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCisgKiAgIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgIkdQTCIpLCBpbiB3aGljaAorICogICBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUKKyAqICAgYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdyB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKKyAqICAgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UKKyAqICAgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgTVBMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uCisgKiAgIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCisgKiAgIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuICBJZiB5b3UgZG8gbm90IGRlbGV0ZQorICogICB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcworICogICBmaWxlIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBJbnF1aXJpZXMgcmVnYXJkaW5nIHRoZSBsaW51eC13bGFuIE9wZW4gU291cmNlIHByb2plY3QgY2FuIGJlCisgKiBtYWRlIGRpcmVjdGx5IHRvOgorICoKKyAqIEFic29sdXRlVmFsdWUgU3lzdGVtcyBJbmMuCisgKiBpbmZvQGxpbnV4LXdsYW4uY29tCisgKiBodHRwOi8vd3d3LmxpbnV4LXdsYW4uY29tCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBQb3J0aW9ucyBvZiB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIGZ1bmRlZCBieQorICogSW50ZXJzaWwgQ29ycG9yYXRpb24gYXMgcGFydCBvZiBQUklTTShSKSBjaGlwc2V0IHByb2R1Y3QgZGV2ZWxvcG1lbnQuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGlzIGZpbGUgZGVjbGFyZXMgc29tZSBvZiB0aGUgY29uc3RhbnRzIGFuZCB0eXBlcyB1c2VkIGluIHZhcmlvdXMKKyAqIHBhcnRzIG9mIHRoZSBsaW51eC13bGFuIHN5c3RlbS4KKyAqCisgKiBOb3RlczoKKyAqICAgLSBDb25zdGFudCB2YWx1ZXMgYXJlIGFsd2F5cyBpbiBIT1NUIGJ5dGUgb3JkZXIuCisgKgorICogQWxsIGZ1bmN0aW9ucyBhbmQgc3RhdGljcyBkZWNsYXJlZCBoZXJlIGFyZSBpbXBsZW1lbnRlZCBpbiBwODAyMTF0eXBlcy5jCisgKiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIAogI2lmbmRlZiBfUDgwMjExVFlQRVNfSAogI2RlZmluZSBfUDgwMjExVFlQRVNfSApAQCAtMTIzLDE4ICsxMjQsMTggQEAKICNkZWZpbmUgTUtFTlVNTkFNRShuYW1lKSBwODAyMTFlbnVtXyAjIyBuYW1lCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBhbmQgbWFjcm9zIGFyZSB1c2VkIHRvIGNvbnN0cnVjdCBhbmQKLSogZGVjb25zdHJ1Y3QgdGhlIERhdGEgSUQgY29kZXMuICBUaGUgY29kaW5nIGlzIGFzIGZvbGxvd3M6Ci0qCi0qICAgICAuLi5yd3Rubm5ubm5ubmlpaWlpaWdnZ2dnZ3Nzc3NzcyAgICAgIHMgLSBTZWN0aW9uCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgLSBHcm91cAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpIC0gSXRlbQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuIC0gSW5kZXgKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAtIFRhYmxlIGZsYWcKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyAtIFdyaXRlIGZsYWcKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciAtIFJlYWQgZmxhZwotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuIC0gVW51c2VkCi0qLworICogVGhlIGZvbGxvd2luZyBjb25zdGFudHMgYW5kIG1hY3JvcyBhcmUgdXNlZCB0byBjb25zdHJ1Y3QgYW5kCisgKiBkZWNvbnN0cnVjdCB0aGUgRGF0YSBJRCBjb2Rlcy4gIFRoZSBjb2RpbmcgaXMgYXMgZm9sbG93czoKKyAqCisgKiAgICAgLi4ucnd0bm5ubm5ubm5paWlpaWlnZ2dnZ2dzc3Nzc3MgICAgICBzIC0gU2VjdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyAtIEdyb3VwCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpIC0gSXRlbQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAtIEluZGV4CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0IC0gVGFibGUgZmxhZworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyAtIFdyaXRlIGZsYWcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgLSBSZWFkIGZsYWcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gLSBVbnVzZWQKKyAqLwogCiAjZGVmaW5lIFA4MDIxMURJRF9MU0JfU0VDVElPTgkJKDApCiAjZGVmaW5lIFA4MDIxMURJRF9MU0JfR1JPVVAJCSg2KQpAQCAtMjAwLDEzOCArMjAxLDEzOCBAQAogLyogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgdHlwZXMgYXJlIHVzZWQgZm9yIHRoZSByZXByZXNlbnRhdGlvbiAqLwogLyogIG9mIEVOVU1pbnQgdHlwZSBtZXRhZGF0YS4gKi8KIAotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExZW51bXBhaXIgeworc3RydWN0IHA4MDIxMWVudW1wYWlyIHsKIAl1MzIgdmFsOwogCWNoYXIgKm5hbWU7Ci19IHA4MDIxMWVudW1wYWlyX3Q7Cit9OwogCi10eXBlZGVmIHN0cnVjdCBwODAyMTFlbnVtIHsKK3N0cnVjdCBwODAyMTFlbnVtIHsKIAlpbnQgbml0ZW1zOwotCXA4MDIxMWVudW1wYWlyX3QgKmxpc3Q7Ci19IHA4MDIxMWVudW1fdDsKKwlzdHJ1Y3QgcDgwMjExZW51bXBhaXIgKmxpc3Q7Cit9OwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgdHlwZXMgYXJlIHVzZWQgdG8gc3RvcmUgZGF0YSBpdGVtcyBpbiAqLwogLyogIG1lc3NhZ2VzLiAqLwogCiAvKiBUZW1wbGF0ZSBwYXNjYWwgc3RyaW5nICovCi10eXBlZGVmIHN0cnVjdCBwODAyMTFwc3RyIHsKK3N0cnVjdCBwODAyMTFwc3RyIHsKIAl1OCBsZW47Ci19IF9fcGFja2VkIHA4MDIxMXBzdHJfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IHA4MDIxMXBzdHJkIHsKK3N0cnVjdCBwODAyMTFwc3RyZCB7CiAJdTggbGVuOwogCXU4IGRhdGFbMF07Ci19IF9fcGFja2VkIHA4MDIxMXBzdHJkX3Q7Cit9IF9fcGFja2VkOwogCiAvKiBNYXhpbXVtIHBhc2NhbCBzdHJpbmcgKi8KLXR5cGVkZWYgc3RydWN0IHA4MDIxMXBzdHIyNTUgeworc3RydWN0IHA4MDIxMXBzdHIyNTUgewogCXU4IGxlbjsKIAl1OCBkYXRhW01BWExFTl9QU1RSMjU1XTsKLX0gX19wYWNrZWQgcDgwMjExcHN0cjI1NV90OworfSBfX3BhY2tlZDsKIAogLyogcGFzY2FsIHN0cmluZyBmb3IgbWFjYWRkcmVzcyBhbmQgYnNzaWQgKi8KLXR5cGVkZWYgc3RydWN0IHA4MDIxMXBzdHI2IHsKK3N0cnVjdCBwODAyMTFwc3RyNiB7CiAJdTggbGVuOwogCXU4IGRhdGFbTUFYTEVOX1BTVFI2XTsKLX0gX19wYWNrZWQgcDgwMjExcHN0cjZfdDsKK30gX19wYWNrZWQ7CiAKIC8qIHBhc2NhbCBzdHJpbmcgZm9yIGNoYW5uZWwgbGlzdCAqLwotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExcHN0cjE0IHsKK3N0cnVjdCBwODAyMTFwc3RyMTQgewogCXU4IGxlbjsKIAl1OCBkYXRhW01BWExFTl9QU1RSMTRdOwotfSBfX3BhY2tlZCBwODAyMTFwc3RyMTRfdDsKK30gX19wYWNrZWQ7CiAKIC8qIHBhc2NhbCBzdHJpbmcgZm9yIHNzaWQgKi8KLXR5cGVkZWYgc3RydWN0IHA4MDIxMXBzdHIzMiB7CitzdHJ1Y3QgcDgwMjExcHN0cjMyIHsKIAl1OCBsZW47CiAJdTggZGF0YVtNQVhMRU5fUFNUUjMyXTsKLX0gX19wYWNrZWQgcDgwMjExcHN0cjMyX3Q7Cit9IF9fcGFja2VkOwogCiAvKiBNQUMgYWRkcmVzcyBhcnJheSAqLwotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExbWFjYXJyYXkgeworc3RydWN0IHA4MDIxMW1hY2FycmF5IHsKIAl1MzIgY250OwogCXU4IGRhdGFbMV1bTUFYTEVOX1BTVFI2XTsKLX0gX19wYWNrZWQgcDgwMjExbWFjYXJyYXlfdDsKK30gX19wYWNrZWQ7CiAKIC8qIHByb3RvdHlwZSB0ZW1wbGF0ZSAqLwotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExaXRlbSB7CitzdHJ1Y3QgcDgwMjExaXRlbSB7CiAJdTMyIGRpZDsKIAl1MTYgc3RhdHVzOwogCXUxNiBsZW47Ci19IF9fcGFja2VkIHA4MDIxMWl0ZW1fdDsKK30gX19wYWNrZWQ7CiAKIC8qIHByb3RvdHlwZSB0ZW1wbGF0ZSB3LyBkYXRhIGl0ZW0gKi8KLXR5cGVkZWYgc3RydWN0IHA4MDIxMWl0ZW1kIHsKK3N0cnVjdCBwODAyMTFpdGVtZCB7CiAJdTMyIGRpZDsKIAl1MTYgc3RhdHVzOwogCXUxNiBsZW47CiAJdTggZGF0YVswXTsKLX0gX19wYWNrZWQgcDgwMjExaXRlbWRfdDsKK30gX19wYWNrZWQ7CiAKIC8qIG1lc3NhZ2UgZGF0YSBpdGVtIGZvciBpbnQsIEJPVU5ERURJTlQsIEVOVU1JTlQgKi8KLXR5cGVkZWYgc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHsKK3N0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiB7CiAJdTMyIGRpZDsKIAl1MTYgc3RhdHVzOwogCXUxNiBsZW47CiAJdTMyIGRhdGE7Ci19IF9fcGFja2VkIHA4MDIxMWl0ZW1fdWludDMyX3Q7Cit9IF9fcGFja2VkOwogCiAvKiBtZXNzYWdlIGRhdGEgaXRlbSBmb3IgT0NURVRTVFIsIERJU1BMQVlTVFIgKi8KLXR5cGVkZWYgc3RydWN0IHA4MDIxMWl0ZW1fcHN0cjYgeworc3RydWN0IHA4MDIxMWl0ZW1fcHN0cjYgewogCXUzMiBkaWQ7CiAJdTE2IHN0YXR1czsKIAl1MTYgbGVuOwotCXA4MDIxMXBzdHI2X3QgZGF0YTsKLX0gX19wYWNrZWQgcDgwMjExaXRlbV9wc3RyNl90OworCXN0cnVjdCBwODAyMTFwc3RyNiBkYXRhOworfSBfX3BhY2tlZDsKIAogLyogbWVzc2FnZSBkYXRhIGl0ZW0gZm9yIE9DVEVUU1RSLCBESVNQTEFZU1RSICovCi10eXBlZGVmIHN0cnVjdCBwODAyMTFpdGVtX3BzdHIxNCB7CitzdHJ1Y3QgcDgwMjExaXRlbV9wc3RyMTQgewogCXUzMiBkaWQ7CiAJdTE2IHN0YXR1czsKIAl1MTYgbGVuOwotCXA4MDIxMXBzdHIxNF90IGRhdGE7Ci19IF9fcGFja2VkIHA4MDIxMWl0ZW1fcHN0cjE0X3Q7CisJc3RydWN0IHA4MDIxMXBzdHIxNCBkYXRhOworfSBfX3BhY2tlZDsKIAogLyogbWVzc2FnZSBkYXRhIGl0ZW0gZm9yIE9DVEVUU1RSLCBESVNQTEFZU1RSICovCi10eXBlZGVmIHN0cnVjdCBwODAyMTFpdGVtX3BzdHIzMiB7CitzdHJ1Y3QgcDgwMjExaXRlbV9wc3RyMzIgewogCXUzMiBkaWQ7CiAJdTE2IHN0YXR1czsKIAl1MTYgbGVuOwotCXA4MDIxMXBzdHIzMl90IGRhdGE7Ci19IF9fcGFja2VkIHA4MDIxMWl0ZW1fcHN0cjMyX3Q7CisJc3RydWN0IHA4MDIxMXBzdHIzMiBkYXRhOworfSBfX3BhY2tlZDsKIAogLyogbWVzc2FnZSBkYXRhIGl0ZW0gZm9yIE9DVEVUU1RSLCBESVNQTEFZU1RSICovCi10eXBlZGVmIHN0cnVjdCBwODAyMTFpdGVtX3BzdHIyNTUgeworc3RydWN0IHA4MDIxMWl0ZW1fcHN0cjI1NSB7CiAJdTMyIGRpZDsKIAl1MTYgc3RhdHVzOwogCXUxNiBsZW47Ci0JcDgwMjExcHN0cjI1NV90IGRhdGE7Ci19IF9fcGFja2VkIHA4MDIxMWl0ZW1fcHN0cjI1NV90OworCXN0cnVjdCBwODAyMTFwc3RyMjU1IGRhdGE7Cit9IF9fcGFja2VkOwogCiAvKiBtZXNzYWdlIGRhdGEgaXRlbSBmb3IgVU5LIDM5MiwgbmFtZWx5IG1pYiBpdGVtcyAqLwotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExaXRlbV91bmszOTIgeworc3RydWN0IHA4MDIxMWl0ZW1fdW5rMzkyIHsKIAl1MzIgZGlkOwogCXUxNiBzdGF0dXM7CiAJdTE2IGxlbjsKIAl1OCBkYXRhW01BWExFTl9NSUJBVFRSSUJVVEVdOwotfSBfX3BhY2tlZCBwODAyMTFpdGVtX3VuazM5Ml90OworfSBfX3BhY2tlZDsKIAogLyogbWVzc2FnZSBkYXRhIGl0ZW0gZm9yIFVOSyAxMDI1LCBuYW1lbHkgcDIgcGRhcyAqLwotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExaXRlbV91bmsxMDI0IHsKK3N0cnVjdCBwODAyMTFpdGVtX3VuazEwMjQgewogCXUzMiBkaWQ7CiAJdTE2IHN0YXR1czsKIAl1MTYgbGVuOwogCXU4IGRhdGFbMTAyNF07Ci19IF9fcGFja2VkIHA4MDIxMWl0ZW1fdW5rMTAyNF90OworfSBfX3BhY2tlZDsKIAogLyogbWVzc2FnZSBkYXRhIGl0ZW0gZm9yIFVOSyA0MDk2LCBuYW1lbHkgcDIgZG93bmxvYWQgY2h1bmtzICovCi10eXBlZGVmIHN0cnVjdCBwODAyMTFpdGVtX3VuazQwOTYgeworc3RydWN0IHA4MDIxMWl0ZW1fdW5rNDA5NiB7CiAJdTMyIGRpZDsKIAl1MTYgc3RhdHVzOwogCXUxNiBsZW47CiAJdTggZGF0YVs0MDk2XTsKLX0gX19wYWNrZWQgcDgwMjExaXRlbV91bms0MDk2X3Q7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgY2F0bGlzdGl0ZW07CiAKQEAgLTM1MSwyNSArMzUyLDI1IEBACiAvKiAgVGhlIGZvbGxvd2luZyBhcmUgdGhlIGV4dGVybmFsIGRlY2xhcmF0aW9ucyAqLwogLyogIGZvciBhbGwgZW51bWVyYXRpb25zICAqLwogCi1leHRlcm4gcDgwMjExZW51bV90IE1LRU5VTU5BTUUodHJ1dGgpOwotZXh0ZXJuIHA4MDIxMWVudW1fdCBNS0VOVU1OQU1FKGlmc3RhdGUpOwotZXh0ZXJuIHA4MDIxMWVudW1fdCBNS0VOVU1OQU1FKHBvd2VybWdtdCk7Ci1leHRlcm4gcDgwMjExZW51bV90IE1LRU5VTU5BTUUoYnNzdHlwZSk7Ci1leHRlcm4gcDgwMjExZW51bV90IE1LRU5VTU5BTUUoYXV0aGFsZyk7Ci1leHRlcm4gcDgwMjExZW51bV90IE1LRU5VTU5BTUUocGh5dHlwZSk7Ci1leHRlcm4gcDgwMjExZW51bV90IE1LRU5VTU5BTUUodGVtcHR5cGUpOwotZXh0ZXJuIHA4MDIxMWVudW1fdCBNS0VOVU1OQU1FKHJlZ2RvbWFpbik7Ci1leHRlcm4gcDgwMjExZW51bV90IE1LRU5VTU5BTUUoY2NhbW9kZSk7Ci1leHRlcm4gcDgwMjExZW51bV90IE1LRU5VTU5BTUUoZGl2ZXJzaXR5KTsKLWV4dGVybiBwODAyMTFlbnVtX3QgTUtFTlVNTkFNRShzY2FudHlwZSk7Ci1leHRlcm4gcDgwMjExZW51bV90IE1LRU5VTU5BTUUocmVzdWx0Y29kZSk7Ci1leHRlcm4gcDgwMjExZW51bV90IE1LRU5VTU5BTUUocmVhc29uKTsKLWV4dGVybiBwODAyMTFlbnVtX3QgTUtFTlVNTkFNRShzdGF0dXMpOwotZXh0ZXJuIHA4MDIxMWVudW1fdCBNS0VOVU1OQU1FKG1zZ2NvZGUpOwotZXh0ZXJuIHA4MDIxMWVudW1fdCBNS0VOVU1OQU1FKG1zZ2l0ZW1fc3RhdHVzKTsKK2V4dGVybiBzdHJ1Y3QgcDgwMjExZW51bSBNS0VOVU1OQU1FKHRydXRoKTsKK2V4dGVybiBzdHJ1Y3QgcDgwMjExZW51bSBNS0VOVU1OQU1FKGlmc3RhdGUpOworZXh0ZXJuIHN0cnVjdCBwODAyMTFlbnVtIE1LRU5VTU5BTUUocG93ZXJtZ210KTsKK2V4dGVybiBzdHJ1Y3QgcDgwMjExZW51bSBNS0VOVU1OQU1FKGJzc3R5cGUpOworZXh0ZXJuIHN0cnVjdCBwODAyMTFlbnVtIE1LRU5VTU5BTUUoYXV0aGFsZyk7CitleHRlcm4gc3RydWN0IHA4MDIxMWVudW0gTUtFTlVNTkFNRShwaHl0eXBlKTsKK2V4dGVybiBzdHJ1Y3QgcDgwMjExZW51bSBNS0VOVU1OQU1FKHRlbXB0eXBlKTsKK2V4dGVybiBzdHJ1Y3QgcDgwMjExZW51bSBNS0VOVU1OQU1FKHJlZ2RvbWFpbik7CitleHRlcm4gc3RydWN0IHA4MDIxMWVudW0gTUtFTlVNTkFNRShjY2Ftb2RlKTsKK2V4dGVybiBzdHJ1Y3QgcDgwMjExZW51bSBNS0VOVU1OQU1FKGRpdmVyc2l0eSk7CitleHRlcm4gc3RydWN0IHA4MDIxMWVudW0gTUtFTlVNTkFNRShzY2FudHlwZSk7CitleHRlcm4gc3RydWN0IHA4MDIxMWVudW0gTUtFTlVNTkFNRShyZXN1bHRjb2RlKTsKK2V4dGVybiBzdHJ1Y3QgcDgwMjExZW51bSBNS0VOVU1OQU1FKHJlYXNvbik7CitleHRlcm4gc3RydWN0IHA4MDIxMWVudW0gTUtFTlVNTkFNRShzdGF0dXMpOworZXh0ZXJuIHN0cnVjdCBwODAyMTFlbnVtIE1LRU5VTU5BTUUobXNnY29kZSk7CitleHRlcm4gc3RydWN0IHA4MDIxMWVudW0gTUtFTlVNTkFNRShtc2dpdGVtX3N0YXR1cyk7CiAKLWV4dGVybiBwODAyMTFlbnVtX3QgTUtFTlVNTkFNRShsbnhyb2FtX3JlYXNvbik7CitleHRlcm4gc3RydWN0IHA4MDIxMWVudW0gTUtFTlVNTkFNRShsbnhyb2FtX3JlYXNvbik7CiAKLWV4dGVybiBwODAyMTFlbnVtX3QgTUtFTlVNTkFNRShwMnByZWFtYmxlKTsKK2V4dGVybiBzdHJ1Y3QgcDgwMjExZW51bSBNS0VOVU1OQU1FKHAycHJlYW1ibGUpOwogCiAjZW5kaWYgLyogX1A4MDIxMVRZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXdlcC5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExd2VwLmMKaW5kZXggMjJjNzk3MC4uMjNiMTgzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExd2VwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExd2VwLmMKQEAgLTExOSw3ICsxMTksNyBAQAogCiAvKiBrZXlsZW4gaW4gYnl0ZXMhICovCiAKLWludCB3ZXBfY2hhbmdlX2tleSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIGludCBrZXludW0sIHU4ICprZXksIGludCBrZXlsZW4pCitpbnQgd2VwX2NoYW5nZV9rZXkoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIGludCBrZXludW0sIHU4ICprZXksIGludCBrZXlsZW4pCiB7CiAJaWYgKGtleWxlbiA8IDApCiAJCXJldHVybiAtMTsKQEAgLTE0Myw3ICsxNDMsNyBAQAogICogNC1ieXRlIElWIGF0IHN0YXJ0IG9mIGJ1ZmZlciwgNC1ieXRlIElDViBhdCBlbmQgb2YgYnVmZmVyLgogICogaWYgc3VjY2Vzc2Z1bCwgYnVmIHN0YXJ0IGlzIHBheWxvYWQgYmVnaW4sIGxlbmd0aCAtPSA4OwogICovCi1pbnQgd2VwX2RlY3J5cHQod2xhbmRldmljZV90ICp3bGFuZGV2LCB1OCAqYnVmLCB1MzIgbGVuLCBpbnQga2V5X292ZXJyaWRlLAoraW50IHdlcF9kZWNyeXB0KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB1OCAqYnVmLCB1MzIgbGVuLCBpbnQga2V5X292ZXJyaWRlLAogCQl1OCAqaXYsIHU4ICppY3YpCiB7CiAJdTMyIGksIGosIGssIGNyYywga2V5bGVuOwpAQCAtMjE3LDcgKzIxNyw3IEBACiB9CiAKIC8qIGVuY3J5cHRzIGluLXBsYWNlLiAqLwotaW50IHdlcF9lbmNyeXB0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTggKmJ1ZiwgdTggKmRzdCwgdTMyIGxlbiwgaW50IGtleW51bSwKK2ludCB3ZXBfZW5jcnlwdChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTggKmJ1ZiwgdTggKmRzdCwgdTMyIGxlbiwgaW50IGtleW51bSwKIAkJdTggKml2LCB1OCAqaWN2KQogewogCXUzMiBpLCBqLCBrLCBjcmMsIGtleWxlbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMmZ3LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJmdy5jCmluZGV4IDU2YmZmZDkuLjk2YWEyMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMmZ3LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yZncuYwpAQCAtOTYsMTYgKzk2LDE2IEBACiAJdTE2IGxlbjsKIAl1MTYgdHlwZTsKIAl1bmlvbiB7Ci0JCWhmYTM4NHhfY29tcGlkZW50X3QgdmVyc2lvbjsKLQkJaGZhMzg0eF9jYXBsZXZlbF90IGNvbXBhdDsKKwkJc3RydWN0IGhmYTM4NHhfY29tcGlkZW50IHZlcnNpb247CisJCXN0cnVjdCBoZmEzODR4X2NhcGxldmVsIGNvbXBhdDsKIAkJdTE2IGJ1aWxkc2VxOwotCQloZmEzODR4X2NvbXBpZGVudF90IHBsYXRmb3JtOworCQlzdHJ1Y3QgaGZhMzg0eF9jb21waWRlbnQgcGxhdGZvcm07CiAJfSBpbmZvOwogfTsKIAogc3RydWN0IHBkYSB7CiAJdTggYnVmW0hGQTM4NHhfUERBX0xFTl9NQVhdOwotCWhmYTM4NHhfcGRyZWNfdCAqcmVjW0hGQTM4NHhfUERBX1JFQ1NfTUFYXTsKKwlzdHJ1Y3QgaGZhMzg0eF9wZHJlYyAqcmVjW0hGQTM4NHhfUERBX1JFQ1NfTUFYXTsKIAl1bnNpZ25lZCBpbnQgbnJlYzsKIH07CiAKQEAgLTE1MiwyMiArMTUyLDIyIEBACiAvKiBQREEsIGJ1aWx0IGZyb20gW2NhcmR8bmV3ZmlsZV0rW2FkZGZpbGUxK2FkZGZpbGUyLi4uXSAqLwogCiBzdGF0aWMgc3RydWN0IHBkYSBwZGE7Ci1zdGF0aWMgaGZhMzg0eF9jb21waWRlbnRfdCBuaWNpZDsKLXN0YXRpYyBoZmEzODR4X2NhcGxldmVsX3QgcmZpZDsKLXN0YXRpYyBoZmEzODR4X2NhcGxldmVsX3QgbWFjaWQ7Ci1zdGF0aWMgaGZhMzg0eF9jYXBsZXZlbF90IHByaWlkOworc3RhdGljIHN0cnVjdCBoZmEzODR4X2NvbXBpZGVudCBuaWNpZDsKK3N0YXRpYyBzdHJ1Y3QgaGZhMzg0eF9jYXBsZXZlbCByZmlkOworc3RhdGljIHN0cnVjdCBoZmEzODR4X2NhcGxldmVsIG1hY2lkOworc3RhdGljIHN0cnVjdCBoZmEzODR4X2NhcGxldmVsIHByaWlkOwogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogTG9jYWwgRnVuY3Rpb24gRGVjbGFyYXRpb25zICovCiAKIHN0YXRpYyBpbnQgcHJpc20yX2Z3YXBwbHkoY29uc3Qgc3RydWN0IGloZXhfYmlucmVjICpyZnB0ciwKLXdsYW5kZXZpY2VfdCAqd2xhbmRldik7CitzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldik7CiAKIHN0YXRpYyBpbnQgcmVhZF9md2ZpbGUoY29uc3Qgc3RydWN0IGloZXhfYmlucmVjICpyZnB0cik7CiAKIHN0YXRpYyBpbnQgbWtpbWFnZShzdHJ1Y3QgaW1nY2h1bmsgKmNsaXN0LCB1bnNpZ25lZCBpbnQgKmNjbnQpOwogCi1zdGF0aWMgaW50IHJlYWRfY2FyZHBkYShzdHJ1Y3QgcGRhICpwZGEsIHdsYW5kZXZpY2VfdCAqd2xhbmRldik7CitzdGF0aWMgaW50IHJlYWRfY2FyZHBkYShzdHJ1Y3QgcGRhICpwZGEsIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KTsKIAogc3RhdGljIGludCBta3Bkcmxpc3Qoc3RydWN0IHBkYSAqcGRhKTsKIApAQCAtMTc3LDcgKzE3Nyw3IEBACiBzdGF0aWMgaW50IGNyY2ltYWdlKHN0cnVjdCBpbWdjaHVuayAqZmNodW5rLCB1bnNpZ25lZCBpbnQgbmZjaHVua3MsCiAJICAgICBzdHJ1Y3QgczNjcmNyZWMgKnMzY3JjLCB1bnNpZ25lZCBpbnQgbnMzY3JjKTsKIAotc3RhdGljIGludCB3cml0ZWltYWdlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgc3RydWN0IGltZ2NodW5rICpmY2h1bmssCitzdGF0aWMgaW50IHdyaXRlaW1hZ2Uoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHN0cnVjdCBpbWdjaHVuayAqZmNodW5rLAogCSAgICAgICB1bnNpZ25lZCBpbnQgbmZjaHVua3MpOwogc3RhdGljIHZvaWQgZnJlZV9jaHVua3Moc3RydWN0IGltZ2NodW5rICpmY2h1bmssIHVuc2lnbmVkIGludCAqbmZjaHVua3MpOwogCkBAIC0yMDEsNyArMjAxLDcgQEAKICoJMAktIHN1Y2Nlc3MKICoJfjAJLSBmYWlsdXJlCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgcHJpc20yX2Z3dHJ5KHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCB3bGFuZGV2aWNlX3QgKndsYW5kZXYpCitzdGF0aWMgaW50IHByaXNtMl9md3RyeShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpCiB7CiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmd19lbnRyeSA9IE5VTEw7CiAKQEAgLTIzOSwxMSArMjM5LDExIEBACiAqCX4wCS0gZmFpbHVyZQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgaW50IHByaXNtMl9md2FwcGx5KGNvbnN0IHN0cnVjdCBpaGV4X2JpbnJlYyAqcmZwdHIsCi0JCQkgIHdsYW5kZXZpY2VfdCAqd2xhbmRldikKKwkJCSAgc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpCiB7CiAJc2lnbmVkIGludCByZXN1bHQgPSAwOwogCXN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWliZ2V0IGdldG1zZzsKLQlwODAyMTFpdGVtZF90ICppdGVtOworCXN0cnVjdCBwODAyMTFpdGVtZCAqaXRlbTsKIAl1MzIgKmRhdGE7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBkYXRhIHN0cnVjdHVyZXMgKi8KQEAgLTI2Niw3ICsyNjYsNyBAQAogCiAJLyogY2xlYXIgdGhlIHBkYSBhbmQgYWRkIGFuIGluaXRpYWwgRU5EIHJlY29yZCAqLwogCW1lbXNldCgmcGRhLCAwLCBzaXplb2YocGRhKSk7Ci0JcGRhLnJlY1swXSA9IChoZmEzODR4X3BkcmVjX3QgKikgcGRhLmJ1ZjsKKwlwZGEucmVjWzBdID0gKHN0cnVjdCBoZmEzODR4X3BkcmVjICopcGRhLmJ1ZjsKIAlwZGEucmVjWzBdLT5sZW4gPSBjcHVfdG9fbGUxNigyKTsJLyogbGVuIGluIHdvcmRzICovCiAJcGRhLnJlY1swXS0+Y29kZSA9IGNwdV90b19sZTE2KEhGQTM4NHhfUERSX0VORF9PRl9QREEpOwogCXBkYS5ucmVjID0gMTsKQEAgLTI5MywxMSArMjkzLDExIEBACiAJZ2V0bXNnLnJlc3VsdGNvZGUuZGlkID0gRElEbXNnX2RvdDExcmVxX21pYmdldF9yZXN1bHRjb2RlOwogCWdldG1zZy5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfbm9fdmFsdWU7CiAKLQlpdGVtID0gKHA4MDIxMWl0ZW1kX3QgKikgZ2V0bXNnLm1pYmF0dHJpYnV0ZS5kYXRhOworCWl0ZW0gPSAoc3RydWN0IHA4MDIxMWl0ZW1kICopZ2V0bXNnLm1pYmF0dHJpYnV0ZS5kYXRhOwogCWl0ZW0tPmRpZCA9IERJRG1pYl9wMl9wMk5JQ19wMlBSSVN1cFJhbmdlOwogCWl0ZW0tPnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfbm9fdmFsdWU7CiAKLQlkYXRhID0gKHUzMiAqKSBpdGVtLT5kYXRhOworCWRhdGEgPSAodTMyICopaXRlbS0+ZGF0YTsKIAogCS8qIERJRG1zZ19kb3QxMXJlcV9taWJnZXQgKi8KIAlwcmlzbTJtZ210X21pYnNldF9taWJnZXQod2xhbmRldiwgJmdldG1zZyk7CkBAIC01OTIsMTQgKzU5MiwxNCBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgaW50IG1rcGRybGlzdChzdHJ1Y3QgcGRhICpwZGEpCiB7Ci0JdTE2ICpwZGExNiA9ICh1MTYgKikgcGRhLT5idWY7CisJdTE2ICpwZGExNiA9ICh1MTYgKilwZGEtPmJ1ZjsKIAlpbnQgY3Vycm9mZjsJCS8qIGluICd3b3JkcycgKi8KIAogCXBkYS0+bnJlYyA9IDA7CiAJY3Vycm9mZiA9IDA7CiAJd2hpbGUgKGN1cnJvZmYgPCAoSEZBMzg0eF9QREFfTEVOX01BWCAvIDIgLSAxKSAmJgogCSAgICAgICBsZTE2X3RvX2NwdShwZGExNltjdXJyb2ZmICsgMV0pICE9IEhGQTM4NHhfUERSX0VORF9PRl9QREEpIHsKLQkJcGRhLT5yZWNbcGRhLT5ucmVjXSA9IChoZmEzODR4X3BkcmVjX3QgKikgJihwZGExNltjdXJyb2ZmXSk7CisJCXBkYS0+cmVjW3BkYS0+bnJlY10gPSAoc3RydWN0IGhmYTM4NHhfcGRyZWMgKikmKHBkYTE2W2N1cnJvZmZdKTsKIAogCQlpZiAobGUxNl90b19jcHUocGRhLT5yZWNbcGRhLT5ucmVjXS0+Y29kZSkgPT0KIAkJICAgIEhGQTM4NHhfUERSX05JQ0lEKSB7CkBAIC02MzgsNyArNjM4LDcgQEAKIAkJICAgICAgIGN1cnJvZmYsIHBkYS0+bnJlYyk7CiAJCXJldHVybiAxOwogCX0KLQlwZGEtPnJlY1twZGEtPm5yZWNdID0gKGhmYTM4NHhfcGRyZWNfdCAqKSAmKHBkYTE2W2N1cnJvZmZdKTsKKwlwZGEtPnJlY1twZGEtPm5yZWNdID0gKHN0cnVjdCBoZmEzODR4X3BkcmVjICopJihwZGExNltjdXJyb2ZmXSk7CiAJKHBkYS0+bnJlYykrKzsKIAlyZXR1cm4gMDsKIH0KQEAgLTc2Niw3ICs3NjYsNyBAQAogKgkwCS0gc3VjY2VzcwogKgl+MAktIGZhaWx1cmUgKHByb2JhYmx5IGFuIGVycm5vKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IHJlYWRfY2FyZHBkYShzdHJ1Y3QgcGRhICpwZGEsIHdsYW5kZXZpY2VfdCAqd2xhbmRldikKK3N0YXRpYyBpbnQgcmVhZF9jYXJkcGRhKHN0cnVjdCBwZGEgKnBkYSwgc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9yZWFkcGRhICptc2c7CkBAIC04NzksOCArODc5LDggQEAKIAkJYWRkciA9IGJlMzJfdG9fY3B1KHJlY29yZC0+YWRkcik7CiAKIAkJLyogUG9pbnQgaW50byBkYXRhIGZvciBkaWZmZXJlbnQgd29yZCBsZW5ndGhzICovCi0JCXB0cjMyID0gKHUzMiAqKSByZWNvcmQtPmRhdGE7Ci0JCXB0cjE2ID0gKHUxNiAqKSByZWNvcmQtPmRhdGE7CisJCXB0cjMyID0gKHUzMiAqKXJlY29yZC0+ZGF0YTsKKwkJcHRyMTYgPSAodTE2ICopcmVjb3JkLT5kYXRhOwogCiAJCS8qIHBhcnNlIHdoYXQgd2FzIGFuIFMzIHNyZWMgYW5kIHB1dCBpdCBpbiB0aGUgcmlnaHQgYXJyYXkgKi8KIAkJc3dpdGNoIChhZGRyKSB7CkBAIC05NTQsNyArOTU0LDcgQEAKIAkJZGVmYXVsdDoJLyogRGF0YSByZWNvcmQgKi8KIAkJCXMzZGF0YVtuczNkYXRhXS5hZGRyID0gYWRkcjsKIAkJCXMzZGF0YVtuczNkYXRhXS5sZW4gPSBsZW47Ci0JCQlzM2RhdGFbbnMzZGF0YV0uZGF0YSA9ICh1aW50OF90ICopIHJlY29yZC0+ZGF0YTsKKwkJCXMzZGF0YVtuczNkYXRhXS5kYXRhID0gKHVpbnQ4X3QgKilyZWNvcmQtPmRhdGE7CiAJCQluczNkYXRhKys7CiAJCQlpZiAobnMzZGF0YSA9PSBTM0RBVEFfTUFYKSB7CiAJCQkJcHJfZXJyKCJTMyBkYXRhcmVjIGxpbWl0IHJlYWNoZWQgLSBhYm9ydGluZ1xuIik7CkBAIC05ODIsNyArOTgyLDcgQEAKICoJMAlzdWNjZXNzCiAqCX4wCWZhaWx1cmUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCB3cml0ZWltYWdlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgc3RydWN0IGltZ2NodW5rICpmY2h1bmssCitzdGF0aWMgaW50IHdyaXRlaW1hZ2Uoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHN0cnVjdCBpbWdjaHVuayAqZmNodW5rLAogCSAgICAgICB1bnNpZ25lZCBpbnQgbmZjaHVua3MpCiB7CiAJaW50IHJlc3VsdCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtZ210LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtZ210LmMKaW5kZXggZDhlZDlhMC4uMTcwZGUxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWdtdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1nbXQuYwpAQCAtMTEzLDE2ICsxMTMsMTYgQEAKICoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQogKglpbnRlcnJ1cHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfc2Nhbih3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCitpbnQgcHJpc20ybWdtdF9zY2FuKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB2b2lkICptc2dwKQogewogCWludCByZXN1bHQgPSAwOwotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAJc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9zY2FuICptc2cgPSBtc2dwOwogCXUxNiByb2FtaW5nbW9kZSwgd29yZDsKIAlpbnQgaSwgdGltZW91dDsKIAlpbnQgaXN0bXBlbmFibGUgPSAwOwogCi0JaGZhMzg0eF9Ib3N0U2NhblJlcXVlc3RfZGF0YV90IHNjYW5yZXE7CisJc3RydWN0IGhmYTM4NHhfSG9zdFNjYW5SZXF1ZXN0X2RhdGEgc2NhbnJlcTsKIAogCS8qIGdhdGVrZWVwZXIgY2hlY2sgKi8KIAlpZiAoSEZBMzg0eF9GSVJNV0FSRV9WRVJTSU9OKGh3LT5pZGVudF9zdGFfZncubWFqb3IsCkBAIC0yOTIsNyArMjkyLDcgQEAKIAogCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaHcsCiAJCQkJCUhGQTM4NHhfUklEX0hPU1RTQ0FOLCAmc2NhbnJlcSwKLQkJCQkJc2l6ZW9mKGhmYTM4NHhfSG9zdFNjYW5SZXF1ZXN0X2RhdGFfdCkpOworCQkJCQlzaXplb2Yoc3RydWN0IGhmYTM4NHhfSG9zdFNjYW5SZXF1ZXN0X2RhdGEpKTsKIAlpZiAocmVzdWx0KSB7CiAJCW5ldGRldl9lcnIod2xhbmRldi0+bmV0ZGV2LAogCQkJICAgInNldGNvbmZpZyhTQ0FOUkVRVUVTVCkgZmFpbGVkLiByZXN1bHQ9JWRcbiIsCkBAIC0zNjYsMTIgKzM2NiwxMiBAQAogKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCiAqCWludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9zY2FuX3Jlc3VsdHMod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQoraW50IHByaXNtMm1nbXRfc2Nhbl9yZXN1bHRzKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB2b2lkICptc2dwKQogewogCWludCByZXN1bHQgPSAwOwogCXN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfc2Nhbl9yZXN1bHRzICpyZXE7Ci0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7Ci0JaGZhMzg0eF9IU2NhblJlc3VsdFN1Yl90ICppdGVtID0gTlVMTDsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXN0cnVjdCBoZmEzODR4X0hTY2FuUmVzdWx0U3ViICppdGVtID0gTlVMTDsKIAogCWludCBjb3VudDsKIApAQCAtNTI1LDE1ICs1MjUsMTUgQEAKICoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQogKglpbnRlcnJ1cHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfc3RhcnQod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQoraW50IHByaXNtMm1nbXRfc3RhcnQoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCiB7CiAJaW50IHJlc3VsdCA9IDA7Ci0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKIAlzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX3N0YXJ0ICptc2cgPSBtc2dwOwogCi0JcDgwMjExcHN0cmRfdCAqcHN0cjsKKwlzdHJ1Y3QgcDgwMjExcHN0cmQgKnBzdHI7CiAJdTggYnl0ZWJ1Zls4MF07Ci0Jc3RydWN0IGhmYTM4NHhfYnl0ZXN0ciAqcDJieXRlc3RyID0gKHN0cnVjdCBoZmEzODR4X2J5dGVzdHIgKikgYnl0ZWJ1ZjsKKwlzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyICpwMmJ5dGVzdHIgPSAoc3RydWN0IGhmYTM4NHhfYnl0ZXN0ciAqKWJ5dGVidWY7CiAJdTE2IHdvcmQ7CiAKIAl3bGFuZGV2LT5tYWNtb2RlID0gV0xBTl9NQUNNT0RFX05PTkU7CkBAIC01NTgsNyArNTU4LDcgQEAKIAkvKioqIFNUQVRJT04gKioqLwogCS8qIFNldCB0aGUgUkVRVUlSRUQgY29uZmlnIGl0ZW1zICovCiAJLyogU1NJRCAqLwotCXBzdHIgPSAocDgwMjExcHN0cmRfdCAqKSAmKG1zZy0+c3NpZC5kYXRhKTsKKwlwc3RyID0gKHN0cnVjdCBwODAyMTFwc3RyZCAqKSYobXNnLT5zc2lkLmRhdGEpOwogCXByaXNtMm1nbXRfcHN0cjJieXRlc3RyKHAyYnl0ZXN0ciwgcHN0cik7CiAJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhodywgSEZBMzg0eF9SSURfQ05GT1dOU1NJRCwKIAkJCQkJYnl0ZWJ1ZiwgSEZBMzg0eF9SSURfQ05GT1dOU1NJRF9MRU4pOwpAQCAtNjg1LDkgKzY4NSw3IEBACiAJbXNnLT5yZXN1bHRjb2RlLmRhdGEgPSBQODAyMTFFTlVNX3Jlc3VsdGNvZGVfaW52YWxpZF9wYXJhbWV0ZXJzOwogCiBkb25lOgotCXJlc3VsdCA9IDA7Ci0KLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiAwOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTcwOCw5ICs3MDYsOSBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfcmVhZHBkYSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCitpbnQgcHJpc20ybWdtdF9yZWFkcGRhKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB2b2lkICptc2dwKQogewotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAJc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9yZWFkcGRhICptc2cgPSBtc2dwOwogCWludCByZXN1bHQ7CiAKQEAgLTc3NCw5ICs3NzIsOSBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfcmFtZGxfc3RhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQoraW50IHByaXNtMm1nbXRfcmFtZGxfc3RhdGUoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCiB7Ci0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKIAlzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX3JhbWRsX3N0YXRlICptc2cgPSBtc2dwOwogCiAJaWYgKHdsYW5kZXYtPm1zZHN0YXRlICE9IFdMQU5fTVNEX0ZXTE9BRCkgewpAQCAtODI5LDkgKzgyNyw5IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9yYW1kbF93cml0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCitpbnQgcHJpc20ybWdtdF9yYW1kbF93cml0ZShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdm9pZCAqbXNncCkKIHsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCXN0cnVjdCBwODAyMTFtc2dfcDJyZXFfcmFtZGxfd3JpdGUgKm1zZyA9IG1zZ3A7CiAJdTMyIGFkZHI7CiAJdTMyIGxlbjsKQEAgLTg5MCwxMCArODg4LDEwIEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9mbGFzaGRsX3N0YXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKK2ludCBwcmlzbTJtZ210X2ZsYXNoZGxfc3RhdGUoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCiB7CiAJaW50IHJlc3VsdCA9IDA7Ci0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKIAlzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX2ZsYXNoZGxfc3RhdGUgKm1zZyA9IG1zZ3A7CiAKIAlpZiAod2xhbmRldi0+bXNkc3RhdGUgIT0gV0xBTl9NU0RfRldMT0FEKSB7CkBAIC05NjEsOSArOTU5LDkgQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X2ZsYXNoZGxfd3JpdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQoraW50IHByaXNtMm1nbXRfZmxhc2hkbF93cml0ZShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdm9pZCAqbXNncCkKIHsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCXN0cnVjdCBwODAyMTFtc2dfcDJyZXFfZmxhc2hkbF93cml0ZSAqbXNnID0gbXNncDsKIAl1MzIgYWRkcjsKIAl1MzIgbGVuOwpAQCAtMTAyMSwxNiArMTAxOSwxNiBAQAogKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCiAqCWludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9hdXRvam9pbih3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCitpbnQgcHJpc20ybWdtdF9hdXRvam9pbihzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdm9pZCAqbXNncCkKIHsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCWludCByZXN1bHQgPSAwOwogCXUxNiByZWc7CiAJdTE2IHBvcnRfdHlwZTsKIAlzdHJ1Y3QgcDgwMjExbXNnX2xueHJlcV9hdXRvam9pbiAqbXNnID0gbXNncDsKLQlwODAyMTFwc3RyZF90ICpwc3RyOworCXN0cnVjdCBwODAyMTFwc3RyZCAqcHN0cjsKIAl1OCBieXRlYnVmWzI1Nl07Ci0Jc3RydWN0IGhmYTM4NHhfYnl0ZXN0ciAqcDJieXRlc3RyID0gKHN0cnVjdCBoZmEzODR4X2J5dGVzdHIgKikgYnl0ZWJ1ZjsKKwlzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyICpwMmJ5dGVzdHIgPSAoc3RydWN0IGhmYTM4NHhfYnl0ZXN0ciAqKWJ5dGVidWY7CiAKIAl3bGFuZGV2LT5tYWNtb2RlID0gV0xBTl9NQUNNT0RFX05PTkU7CiAKQEAgLTEwNTQsNyArMTA1Miw3IEBACiAKIAkvKiBTZXQgdGhlIHNzaWQgKi8KIAltZW1zZXQoYnl0ZWJ1ZiwgMCwgMjU2KTsKLQlwc3RyID0gKHA4MDIxMXBzdHJkX3QgKikgJihtc2ctPnNzaWQuZGF0YSk7CisJcHN0ciA9IChzdHJ1Y3QgcDgwMjExcHN0cmQgKikmKG1zZy0+c3NpZC5kYXRhKTsKIAlwcmlzbTJtZ210X3BzdHIyYnl0ZXN0cihwMmJ5dGVzdHIsIHBzdHIpOwogCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX0NORkRFU0lSRURTU0lELAogCQkJCQlieXRlYnVmLApAQCAtMTA5MiwxMiArMTA5MCwxMiBAQAogKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCiAqCWludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF93bGFuc25pZmYod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQoraW50IHByaXNtMm1nbXRfd2xhbnNuaWZmKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB2b2lkICptc2dwKQogewogCWludCByZXN1bHQgPSAwOwogCXN0cnVjdCBwODAyMTFtc2dfbG54cmVxX3dsYW5zbmlmZiAqbXNnID0gbXNncDsKIAotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAJdTE2IHdvcmQ7CiAKIAltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWdtdC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWdtdC5oCmluZGV4IGU2NDcyMDMuLmNjMWFjN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1nbXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtZ210LmgKQEAgLTYzLDQzICs2Myw0NCBAQAogZXh0ZXJuIGludCBwcmlzbTJfcmVzZXRfaG9sZHRpbWU7CiBleHRlcm4gaW50IHByaXNtMl9yZXNldF9zZXR0bGV0aW1lOwogCi11MzIgcHJpc20yc3RhX2lmc3RhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MzIgaWZzdGF0ZSk7Cit1MzIgcHJpc20yc3RhX2lmc3RhdGUoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHUzMiBpZnN0YXRlKTsKIAotdm9pZCBwcmlzbTJzdGFfZXZfaW5mbyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIGhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mKTsKLXZvaWQgcHJpc20yc3RhX2V2X3R4ZXhjKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTE2IHN0YXR1cyk7Ci12b2lkIHByaXNtMnN0YV9ldl90eCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUxNiBzdGF0dXMpOwotdm9pZCBwcmlzbTJzdGFfZXZfYWxsb2Mod2xhbmRldmljZV90ICp3bGFuZGV2KTsKK3ZvaWQgcHJpc20yc3RhX2V2X2luZm8oc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHN0cnVjdCBoZmEzODR4X0luZkZyYW1lICppbmYpOwordm9pZCBwcmlzbTJzdGFfZXZfdHhleGMoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHUxNiBzdGF0dXMpOwordm9pZCBwcmlzbTJzdGFfZXZfdHgoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHUxNiBzdGF0dXMpOwordm9pZCBwcmlzbTJzdGFfZXZfYWxsb2Moc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpOwogCi1pbnQgcHJpc20ybWdtdF9taWJzZXRfbWliZ2V0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9zY2FuKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9zY2FuX3Jlc3VsdHMod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X3N0YXJ0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF93bGFuc25pZmYod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X3JlYWRwZGEod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X3JhbWRsX3N0YXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9yYW1kbF93cml0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfZmxhc2hkbF9zdGF0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfZmxhc2hkbF93cml0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfYXV0b2pvaW4od2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKK2ludCBwcmlzbTJtZ210X21pYnNldF9taWJnZXQoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOworaW50IHByaXNtMm1nbXRfc2NhbihzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdm9pZCAqbXNncCk7CitpbnQgcHJpc20ybWdtdF9zY2FuX3Jlc3VsdHMoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOworaW50IHByaXNtMm1nbXRfc3RhcnQoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOworaW50IHByaXNtMm1nbXRfd2xhbnNuaWZmKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB2b2lkICptc2dwKTsKK2ludCBwcmlzbTJtZ210X3JlYWRwZGEoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOworaW50IHByaXNtMm1nbXRfcmFtZGxfc3RhdGUoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOworaW50IHByaXNtMm1nbXRfcmFtZGxfd3JpdGUoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOworaW50IHByaXNtMm1nbXRfZmxhc2hkbF9zdGF0ZShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdm9pZCAqbXNncCk7CitpbnQgcHJpc20ybWdtdF9mbGFzaGRsX3dyaXRlKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB2b2lkICptc2dwKTsKK2ludCBwcmlzbTJtZ210X2F1dG9qb2luKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB2b2lkICptc2dwKTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogY29udmVyc2lvbiBmdW5jdGlvbnMgZ29pbmcgYmV0d2VlbiB3bGFuIG1lc3NhZ2UgZGF0YSB0eXBlcyBhbmQKICogUHJpc20yIGRhdGEgdHlwZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBieXRlIGFyZWEgY29udmVyc2lvbiBmdW5jdGlvbnMqLwotdm9pZCBwcmlzbTJtZ210X2J5dGVhcmVhMnBzdHIodTggKmJ5dGVhcmVhLCBwODAyMTFwc3RyZF90ICpwc3RyLCBpbnQgbGVuKTsKK3ZvaWQgcHJpc20ybWdtdF9ieXRlYXJlYTJwc3RyKHU4ICpieXRlYXJlYSwgc3RydWN0IHA4MDIxMXBzdHJkICpwc3RyLCBpbnQgbGVuKTsKIAogLyogYnl0ZSBzdHJpbmcgY29udmVyc2lvbiBmdW5jdGlvbnMqLwogdm9pZCBwcmlzbTJtZ210X3BzdHIyYnl0ZXN0cihzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyICpieXRlc3RyLAotCQkJICAgICBwODAyMTFwc3RyZF90ICpwc3RyKTsKKwkJCSAgICAgc3RydWN0IHA4MDIxMXBzdHJkICpwc3RyKTsKIHZvaWQgcHJpc20ybWdtdF9ieXRlc3RyMnBzdHIoc3RydWN0IGhmYTM4NHhfYnl0ZXN0ciAqYnl0ZXN0ciwKLQkJCSAgICAgcDgwMjExcHN0cmRfdCAqcHN0cik7CisJCQkgICAgIHN0cnVjdCBwODAyMTFwc3RyZCAqcHN0cik7CiAKIC8qIGZ1bmN0aW9ucyB0byBjb252ZXJ0IEdyb3VwIEFkZHJlc3NlcyAqLwotdm9pZCBwcmlzbTJtZ210X2dldF9ncnBhZGRyKHUzMiBkaWQsIHA4MDIxMXBzdHJkX3QgKnBzdHIsIGhmYTM4NHhfdCAqcHJpdik7Cit2b2lkIHByaXNtMm1nbXRfZ2V0X2dycGFkZHIodTMyIGRpZCwgc3RydWN0IHA4MDIxMXBzdHJkICpwc3RyLAorCQkJICAgIHN0cnVjdCBoZmEzODR4ICpwcml2KTsKIGludCBwcmlzbTJtZ210X3NldF9ncnBhZGRyKHUzMiBkaWQsCi0JCQkgICB1OCAqcHJpc20yYnVmLCBwODAyMTFwc3RyZF90ICpwc3RyLAotCQkJICAgaGZhMzg0eF90ICpwcml2KTsKKwkJCSAgIHU4ICpwcmlzbTJidWYsIHN0cnVjdCBwODAyMTFwc3RyZCAqcHN0ciwKKwkJCSAgIHN0cnVjdCBoZmEzODR4ICpwcml2KTsKIGludCBwcmlzbTJtZ210X2dldF9ncnBhZGRyX2luZGV4KHUzMiBkaWQpOwogCiB2b2lkIHByaXNtMnN0YV9wcm9jZXNzaW5nX2RlZmVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSk7CkBAIC0xMDgsOCArMTA5LDggQEAKIHZvaWQgcHJpc20yc3RhX2NvbW1zcXVhbF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOwogCiAvKiBJbnRlcmZhY2UgY2FsbGJhY2sgZnVuY3Rpb25zLCBwYXNzaW5nIGRhdGEgYmFjayB1cCB0byB0aGUgY2ZnODAyMTEgbGF5ZXIgKi8KLXZvaWQgcHJpc20yX2Nvbm5lY3RfcmVzdWx0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTggZmFpbGVkKTsKLXZvaWQgcHJpc20yX2Rpc2Nvbm5lY3RlZCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwotdm9pZCBwcmlzbTJfcm9hbWVkKHdsYW5kZXZpY2VfdCAqd2xhbmRldik7Cit2b2lkIHByaXNtMl9jb25uZWN0X3Jlc3VsdChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTggZmFpbGVkKTsKK3ZvaWQgcHJpc20yX2Rpc2Nvbm5lY3RlZChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldik7Cit2b2lkIHByaXNtMl9yb2FtZWQoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1pYi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWliLmMKaW5kZXggZmU5MTRiMS4uNjNhYjZiYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1pYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1pYi5jCkBAIC04Nyw4MCArODcsODAgQEAKIAl1MTYgcGFybTM7CiAJaW50ICgqZnVuYykoc3RydWN0IG1pYnJlYyAqbWliLAogCQkgICAgIGludCBpc2dldCwKLQkJICAgICB3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCSAgICAgaGZhMzg0eF90ICpodywKKwkJICAgICBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJICAgICBzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJCSAgICAgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgKm1zZywgdm9pZCAqZGF0YSk7CiB9OwogCiBzdGF0aWMgaW50IHByaXNtMm1pYl9ieXRlYXJlYTJwc3RyKHN0cnVjdCBtaWJyZWMgKm1pYiwKIAkJCQkgICBpbnQgaXNnZXQsCi0JCQkJICAgd2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCSAgIGhmYTM4NHhfdCAqaHcsCisJCQkJICAgc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJICAgc3RydWN0IGhmYTM4NHggKmh3LAogCQkJCSAgIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csCiAJCQkJICAgdm9pZCAqZGF0YSk7CiAKIHN0YXRpYyBpbnQgcHJpc20ybWliX3VpbnQzMihzdHJ1Y3QgbWlicmVjICptaWIsCiAJCQkgICAgaW50IGlzZ2V0LAotCQkJICAgIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCSAgICBoZmEzODR4X3QgKmh3LAorCQkJICAgIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJICAgIHN0cnVjdCBoZmEzODR4ICpodywKIAkJCSAgICBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCAqbXNnLCB2b2lkICpkYXRhKTsKIAogc3RhdGljIGludCBwcmlzbTJtaWJfZmxhZyhzdHJ1Y3QgbWlicmVjICptaWIsCiAJCQkgIGludCBpc2dldCwKLQkJCSAgd2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJICBoZmEzODR4X3QgKmh3LAorCQkJICBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCSAgc3RydWN0IGhmYTM4NHggKmh3LAogCQkJICBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCAqbXNnLCB2b2lkICpkYXRhKTsKIAogc3RhdGljIGludCBwcmlzbTJtaWJfd2VwZGVmYXVsdGtleShzdHJ1Y3QgbWlicmVjICptaWIsCiAJCQkJICAgaW50IGlzZ2V0LAotCQkJCSAgIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCQkgICBoZmEzODR4X3QgKmh3LAorCQkJCSAgIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCSAgIHN0cnVjdCBoZmEzODR4ICpodywKIAkJCQkgICBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCAqbXNnLAogCQkJCSAgIHZvaWQgKmRhdGEpOwogCiBzdGF0aWMgaW50IHByaXNtMm1pYl9wcml2YWN5aW52b2tlZChzdHJ1Y3QgbWlicmVjICptaWIsCiAJCQkJICAgIGludCBpc2dldCwKLQkJCQkgICAgd2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCSAgICBoZmEzODR4X3QgKmh3LAorCQkJCSAgICBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkgICAgc3RydWN0IGhmYTM4NHggKmh3LAogCQkJCSAgICBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCAqbXNnLAogCQkJCSAgICB2b2lkICpkYXRhKTsKIAogc3RhdGljIGludCBwcmlzbTJtaWJfZXhjbHVkZXVuZW5jcnlwdGVkKHN0cnVjdCBtaWJyZWMgKm1pYiwKIAkJCQkJaW50IGlzZ2V0LAotCQkJCQl3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJCWhmYTM4NHhfdCAqaHcsCisJCQkJCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCQlzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJCQkJCXN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csCiAJCQkJCXZvaWQgKmRhdGEpOwogCiBzdGF0aWMgaW50IHByaXNtMm1pYl9mcmFnbWVudGF0aW9udGhyZXNob2xkKHN0cnVjdCBtaWJyZWMgKm1pYiwKIAkJCQkJICAgIGludCBpc2dldCwKLQkJCQkJICAgIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCQkJICAgIGhmYTM4NHhfdCAqaHcsCisJCQkJCSAgICBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkJICAgIHN0cnVjdCBoZmEzODR4ICpodywKIAkJCQkJICAgIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csCiAJCQkJCSAgICB2b2lkICpkYXRhKTsKIAogc3RhdGljIGludCBwcmlzbTJtaWJfcHJpdihzdHJ1Y3QgbWlicmVjICptaWIsCiAJCQkgIGludCBpc2dldCwKLQkJCSAgd2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJICBoZmEzODR4X3QgKmh3LAorCQkJICBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCSAgc3RydWN0IGhmYTM4NHggKmh3LAogCQkJICBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCAqbXNnLCB2b2lkICpkYXRhKTsKIAogc3RhdGljIHN0cnVjdCBtaWJyZWMgbWlidGFiW10gPSB7CiAKIAkvKiBkb3QxMXNtdCBNSUIncyAqLwotCXtESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTAsCisJe0RJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfa2V5KDEpLAogCSBGX1NUQSB8IEZfV1JJVEUsCiAJIEhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkwLCAwLCAwLAogCSBwcmlzbTJtaWJfd2VwZGVmYXVsdGtleX0sCi0Je0RJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MSwKKwl7RElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9rZXkoMiksCiAJIEZfU1RBIHwgRl9XUklURSwKIAkgSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWTEsIDAsIDAsCiAJIHByaXNtMm1pYl93ZXBkZWZhdWx0a2V5fSwKLQl7RElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkyLAorCXtESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2tleSgzKSwKIAkgRl9TVEEgfCBGX1dSSVRFLAogCSBIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMiwgMCwgMCwKIAkgcHJpc20ybWliX3dlcGRlZmF1bHRrZXl9LAotCXtESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTMsCisJe0RJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfa2V5KDQpLAogCSBGX1NUQSB8IEZfV1JJVEUsCiAJIEhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkzLCAwLCAwLAogCSBwcmlzbTJtaWJfd2VwZGVmYXVsdGtleX0sCkBAIC0yMzcsMzYgKzIzNywzNiBAQAogCXswLCAwLCAwLCAwLCAwLCBOVUxMfQogfTsKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfbWlic2V0X21pYmdldAotKgotKiBTZXQgdGhlIHZhbHVlIG9mIGEgbWliIGl0ZW0uCi0qCi0qIEFyZ3VtZW50czoKLSoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCi0qCW1zZ3AJCXB0ciB0byBtc2cgYnVmZmVyCi0qCi0qIFJldHVybnM6Ci0qCTAJc3VjY2VzcyBhbmQgZG9uZQotKgk8MAlzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KLSoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCi0qIFNpZGUgZWZmZWN0czoKLSoKLSogQ2FsbCBjb250ZXh0OgotKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCi0qCWludGVycnVwdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogcHJpc20ybWdtdF9taWJzZXRfbWliZ2V0CisgKgorICogU2V0IHRoZSB2YWx1ZSBvZiBhIG1pYiBpdGVtLgorICoKKyAqIEFyZ3VtZW50czoKKyAqCXdsYW5kZXYJCXdsYW4gZGV2aWNlIHN0cnVjdHVyZQorICoJbXNncAkJcHRyIHRvIG1zZyBidWZmZXIKKyAqCisgKiBSZXR1cm5zOgorICoJMAlzdWNjZXNzIGFuZCBkb25lCisgKgk8MAlzdWNjZXNzLCBidXQgd2UncmUgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGZpbmlzaC4KKyAqCT4wCWFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHRoZSBtZXNzYWdlLgorICogU2lkZSBlZmZlY3RzOgorICoKKyAqIENhbGwgY29udGV4dDoKKyAqCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKKyAqCWludGVycnVwdAorICovCiAKLWludCBwcmlzbTJtZ210X21pYnNldF9taWJnZXQod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQoraW50IHByaXNtMm1nbXRfbWlic2V0X21pYmdldChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdm9pZCAqbXNncCkKIHsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCWludCByZXN1bHQsIGlzZ2V0OwogCXN0cnVjdCBtaWJyZWMgKm1pYjsKIAogCXUxNiB3aGljaDsKIAogCXN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2cgPSBtc2dwOwotCXA4MDIxMWl0ZW1kX3QgKm1pYml0ZW07CisJc3RydWN0IHA4MDIxMWl0ZW1kICptaWJpdGVtOwogCiAJbXNnLT5yZXN1bHRjb2RlLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKIAltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9zdWNjZXNzOwpAQCAtMjg0LDcgKzI4NCw3IEBACiAJICoqIE1JQiB0YWJsZS4KIAkgKi8KIAotCW1pYml0ZW0gPSAocDgwMjExaXRlbWRfdCAqKSBtc2ctPm1pYmF0dHJpYnV0ZS5kYXRhOworCW1pYml0ZW0gPSAoc3RydWN0IHA4MDIxMWl0ZW1kICopbXNnLT5taWJhdHRyaWJ1dGUuZGF0YTsKIAogCWZvciAobWliID0gbWlidGFiOyBtaWItPmRpZCAhPSAwOyBtaWIrKykKIAkJaWYgKG1pYi0+ZGlkID09IG1pYml0ZW0tPmRpZCAmJiAobWliLT5mbGFnICYgd2hpY2gpKQpAQCAtMzQ2LDQwICszNDYsNDAgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl9ieXRlYXJlYTJwc3RyCi0qCi0qIEdldC9zZXQgcHN0ciBkYXRhIHRvL2Zyb20gYSBieXRlIGFyZWEuCi0qCi0qIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKLSogICAgICAgcGFybTEgICAgUHJpc20yIFJJRCB2YWx1ZS4KLSogICAgICAgcGFybTIgICAgTnVtYmVyIG9mIGJ5dGVzIG9mIFJJRCBkYXRhLgotKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgotKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCi0qICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgotKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgIC0gU3VjY2Vzcy4KLSogICAgICAgfjAgIC0gRXJyb3IuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0cgorICoKKyAqIEdldC9zZXQgcHN0ciBkYXRhIHRvL2Zyb20gYSBieXRlIGFyZWEuCisgKgorICogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgorICogICAgICAgcGFybTEgICAgUHJpc20yIFJJRCB2YWx1ZS4KKyAqICAgICAgIHBhcm0yICAgIE51bWJlciBvZiBieXRlcyBvZiBSSUQgZGF0YS4KKyAqICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgorICoKKyAqIEFyZ3VtZW50czoKKyAqICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCisgKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCisgKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCisgKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgorICogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCisgKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KKyAqICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgorICoKKyAqIFJldHVybnM6CisgKiAgICAgICAwICAgLSBTdWNjZXNzLgorICogICAgICAgfjAgIC0gRXJyb3IuCisgKgorICovCiAKIHN0YXRpYyBpbnQgcHJpc20ybWliX2J5dGVhcmVhMnBzdHIoc3RydWN0IG1pYnJlYyAqbWliLAogCQkJCSAgIGludCBpc2dldCwKLQkJCQkgICB3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICAgaGZhMzg0eF90ICpodywKKwkJCQkgICBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkgICBzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJCQkJICAgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgKm1zZywKIAkJCQkgICB2b2lkICpkYXRhKQogewogCWludCByZXN1bHQ7Ci0JcDgwMjExcHN0cmRfdCAqcHN0ciA9IGRhdGE7CisJc3RydWN0IHA4MDIxMXBzdHJkICpwc3RyID0gZGF0YTsKIAl1OCBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKIAogCWlmIChpc2dldCkgewpAQCAtMzk2LDQxICszOTYsNDEgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX3VpbnQzMgotKgotKiBHZXQvc2V0IHVpbnQzMiBkYXRhLgotKgotKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6Ci0qICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCi0qICAgICAgIHBhcm0yICAgIE5vdCB1c2VkLgotKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgotKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCi0qICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgotKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgIC0gU3VjY2Vzcy4KLSogICAgICAgfjAgIC0gRXJyb3IuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBwcmlzbTJtaWJfdWludDMyCisgKgorICogR2V0L3NldCB1aW50MzIgZGF0YS4KKyAqCisgKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6CisgKiAgICAgICBwYXJtMSAgICBQcmlzbTIgUklEIHZhbHVlLgorICogICAgICAgcGFybTIgICAgTm90IHVzZWQuCisgKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KKyAqCisgKiBBcmd1bWVudHM6CisgKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgorICogICAgICAgaXNnZXQgICAgTUlCR0VUL01JQlNFVCBmbGFnLgorICogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgorICogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KKyAqICAgICAgIGh3ICAgICAgICJodyIgc3RydWN0dXJlLgorICogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCisgKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KKyAqCisgKiBSZXR1cm5zOgorICogICAgICAgMCAgIC0gU3VjY2Vzcy4KKyAqICAgICAgIH4wICAtIEVycm9yLgorICoKKyAqLwogCiBzdGF0aWMgaW50IHByaXNtMm1pYl91aW50MzIoc3RydWN0IG1pYnJlYyAqbWliLAogCQkJICAgIGludCBpc2dldCwKLQkJCSAgICB3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkgICAgaGZhMzg0eF90ICpodywKKwkJCSAgICBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCSAgICBzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJCQkgICAgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgKm1zZywgdm9pZCAqZGF0YSkKIHsKIAlpbnQgcmVzdWx0OwogCXUzMiAqdWludDMyID0gZGF0YTsKIAl1OCBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKLQl1MTYgKndvcmRidWYgPSAodTE2ICopIGJ5dGVidWY7CisJdTE2ICp3b3JkYnVmID0gKHUxNiAqKWJ5dGVidWY7CiAKIAlpZiAoaXNnZXQpIHsKIAkJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZzE2KGh3LCBtaWItPnBhcm0xLCB3b3JkYnVmKTsKQEAgLTQ0Myw0MSArNDQzLDQxIEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl9mbGFnCi0qCi0qIEdldC9zZXQgYSBmbGFnLgotKgotKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6Ci0qICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCi0qICAgICAgIHBhcm0yICAgIEJpdCB0byBnZXQvc2V0LgotKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgotKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCi0qICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgotKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgIC0gU3VjY2Vzcy4KLSogICAgICAgfjAgIC0gRXJyb3IuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBwcmlzbTJtaWJfZmxhZworICoKKyAqIEdldC9zZXQgYSBmbGFnLgorICoKKyAqIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKKyAqICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCisgKiAgICAgICBwYXJtMiAgICBCaXQgdG8gZ2V0L3NldC4KKyAqICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgorICoKKyAqIEFyZ3VtZW50czoKKyAqICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCisgKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCisgKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCisgKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgorICogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCisgKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KKyAqICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgorICoKKyAqIFJldHVybnM6CisgKiAgICAgICAwICAgLSBTdWNjZXNzLgorICogICAgICAgfjAgIC0gRXJyb3IuCisgKgorICovCiAKIHN0YXRpYyBpbnQgcHJpc20ybWliX2ZsYWcoc3RydWN0IG1pYnJlYyAqbWliLAogCQkJICBpbnQgaXNnZXQsCi0JCQkgIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCSAgaGZhMzg0eF90ICpodywKKwkJCSAgc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkgIHN0cnVjdCBoZmEzODR4ICpodywKIAkJCSAgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgKm1zZywgdm9pZCAqZGF0YSkKIHsKIAlpbnQgcmVzdWx0OwogCXUzMiAqdWludDMyID0gZGF0YTsKIAl1OCBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKLQl1MTYgKndvcmRidWYgPSAodTE2ICopIGJ5dGVidWY7CisJdTE2ICp3b3JkYnVmID0gKHUxNiAqKWJ5dGVidWY7CiAJdTMyIGZsYWdzOwogCiAJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZzE2KGh3LCBtaWItPnBhcm0xLCB3b3JkYnVmKTsKQEAgLTUwMCw0MCArNTAwLDQwIEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl93ZXBkZWZhdWx0a2V5Ci0qCi0qIEdldC9zZXQgV0VQIGRlZmF1bHQga2V5cy4KLSoKLSogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgotKiAgICAgICBwYXJtMSAgICBQcmlzbTIgUklEIHZhbHVlLgotKiAgICAgICBwYXJtMiAgICBOdW1iZXIgb2YgYnl0ZXMgb2YgUklEIGRhdGEuCi0qICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIHByaXNtMm1pYl93ZXBkZWZhdWx0a2V5CisgKgorICogR2V0L3NldCBXRVAgZGVmYXVsdCBrZXlzLgorICoKKyAqIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKKyAqICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCisgKiAgICAgICBwYXJtMiAgICBOdW1iZXIgb2YgYnl0ZXMgb2YgUklEIGRhdGEuCisgKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KKyAqCisgKiBBcmd1bWVudHM6CisgKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgorICogICAgICAgaXNnZXQgICAgTUlCR0VUL01JQlNFVCBmbGFnLgorICogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgorICogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KKyAqICAgICAgIGh3ICAgICAgICJodyIgc3RydWN0dXJlLgorICogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCisgKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KKyAqCisgKiBSZXR1cm5zOgorICogICAgICAgMCAgIC0gU3VjY2Vzcy4KKyAqICAgICAgIH4wICAtIEVycm9yLgorICoKKyAqLwogCiBzdGF0aWMgaW50IHByaXNtMm1pYl93ZXBkZWZhdWx0a2V5KHN0cnVjdCBtaWJyZWMgKm1pYiwKIAkJCQkgICBpbnQgaXNnZXQsCi0JCQkJICAgd2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCSAgIGhmYTM4NHhfdCAqaHcsCisJCQkJICAgc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJICAgc3RydWN0IGhmYTM4NHggKmh3LAogCQkJCSAgIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csCiAJCQkJICAgdm9pZCAqZGF0YSkKIHsKIAlpbnQgcmVzdWx0OwotCXA4MDIxMXBzdHJkX3QgKnBzdHIgPSBkYXRhOworCXN0cnVjdCBwODAyMTFwc3RyZCAqcHN0ciA9IGRhdGE7CiAJdTggYnl0ZWJ1ZltNSUJfVE1QX01BWExFTl07CiAJdTE2IGxlbjsKIApAQCAtNTUwLDM1ICs1NTAsMzUgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX3ByaXZhY3lpbnZva2VkCi0qCi0qIEdldC9zZXQgdGhlIGRvdDExUHJpdmFjeUludm9rZWQgdmFsdWUuCi0qCi0qIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKLSogICAgICAgcGFybTEgICAgUHJpc20yIFJJRCB2YWx1ZS4KLSogICAgICAgcGFybTIgICAgQml0IHZhbHVlIGZvciBQcml2YWN5SW52b2tlZCBmbGFnLgotKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgotKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCi0qICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgotKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgIC0gU3VjY2Vzcy4KLSogICAgICAgfjAgIC0gRXJyb3IuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBwcmlzbTJtaWJfcHJpdmFjeWludm9rZWQKKyAqCisgKiBHZXQvc2V0IHRoZSBkb3QxMVByaXZhY3lJbnZva2VkIHZhbHVlLgorICoKKyAqIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKKyAqICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCisgKiAgICAgICBwYXJtMiAgICBCaXQgdmFsdWUgZm9yIFByaXZhY3lJbnZva2VkIGZsYWcuCisgKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KKyAqCisgKiBBcmd1bWVudHM6CisgKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgorICogICAgICAgaXNnZXQgICAgTUlCR0VUL01JQlNFVCBmbGFnLgorICogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgorICogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KKyAqICAgICAgIGh3ICAgICAgICJodyIgc3RydWN0dXJlLgorICogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCisgKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KKyAqCisgKiBSZXR1cm5zOgorICogICAgICAgMCAgIC0gU3VjY2Vzcy4KKyAqICAgICAgIH4wICAtIEVycm9yLgorICoKKyAqLwogCiBzdGF0aWMgaW50IHByaXNtMm1pYl9wcml2YWN5aW52b2tlZChzdHJ1Y3QgbWlicmVjICptaWIsCiAJCQkJICAgIGludCBpc2dldCwKLQkJCQkgICAgd2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCSAgICBoZmEzODR4X3QgKmh3LAorCQkJCSAgICBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkgICAgc3RydWN0IGhmYTM4NHggKmh3LAogCQkJCSAgICBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCAqbXNnLAogCQkJCSAgICB2b2lkICpkYXRhKQogewpAQCAtNTkyLDM1ICs1OTIsMzUgQEAKIAlyZXR1cm4gcHJpc20ybWliX2ZsYWcobWliLCBpc2dldCwgd2xhbmRldiwgaHcsIG1zZywgZGF0YSk7CiB9CiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfZXhjbHVkZXVuZW5jcnlwdGVkCi0qCi0qIEdldC9zZXQgdGhlIGRvdDExRXhjbHVkZVVuZW5jcnlwdGVkIHZhbHVlLgotKgotKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6Ci0qICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCi0qICAgICAgIHBhcm0yICAgIEJpdCB2YWx1ZSBmb3IgRXhjbHVkZVVuZW5jcnlwdGVkIGZsYWcuCi0qICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIHByaXNtMm1pYl9leGNsdWRldW5lbmNyeXB0ZWQKKyAqCisgKiBHZXQvc2V0IHRoZSBkb3QxMUV4Y2x1ZGVVbmVuY3J5cHRlZCB2YWx1ZS4KKyAqCisgKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6CisgKiAgICAgICBwYXJtMSAgICBQcmlzbTIgUklEIHZhbHVlLgorICogICAgICAgcGFybTIgICAgQml0IHZhbHVlIGZvciBFeGNsdWRlVW5lbmNyeXB0ZWQgZmxhZy4KKyAqICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgorICoKKyAqIEFyZ3VtZW50czoKKyAqICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCisgKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCisgKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCisgKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgorICogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCisgKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KKyAqICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgorICoKKyAqIFJldHVybnM6CisgKiAgICAgICAwICAgLSBTdWNjZXNzLgorICogICAgICAgfjAgIC0gRXJyb3IuCisgKgorICovCiAKIHN0YXRpYyBpbnQgcHJpc20ybWliX2V4Y2x1ZGV1bmVuY3J5cHRlZChzdHJ1Y3QgbWlicmVjICptaWIsCiAJCQkJCWludCBpc2dldCwKLQkJCQkJd2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCQloZmEzODR4X3QgKmh3LAorCQkJCQlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkJc3RydWN0IGhmYTM4NHggKmh3LAogCQkJCQlzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCAqbXNnLAogCQkJCQl2b2lkICpkYXRhKQogewpAQCAtNjI4LDM1ICs2MjgsMzUgQEAKIAlyZXR1cm4gcHJpc20ybWliX2ZsYWcobWliLCBpc2dldCwgd2xhbmRldiwgaHcsIG1zZywgZGF0YSk7CiB9CiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfZnJhZ21lbnRhdGlvbnRocmVzaG9sZAotKgotKiBHZXQvc2V0IHRoZSBmcmFnbWVudGF0aW9uIHRocmVzaG9sZC4KLSoKLSogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgotKiAgICAgICBwYXJtMSAgICBQcmlzbTIgUklEIHZhbHVlLgotKiAgICAgICBwYXJtMiAgICBOb3QgdXNlZC4KLSogICAgICAgcGFybTMgICAgTm90IHVzZWQuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KLSogICAgICAgaXNnZXQgICAgTUlCR0VUL01JQlNFVCBmbGFnLgotKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCi0qICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGh3ICAgICAgICJodyIgc3RydWN0dXJlLgotKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KLSogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIDAgICAtIFN1Y2Nlc3MuCi0qICAgICAgIH4wICAtIEVycm9yLgotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogcHJpc20ybWliX2ZyYWdtZW50YXRpb250aHJlc2hvbGQKKyAqCisgKiBHZXQvc2V0IHRoZSBmcmFnbWVudGF0aW9uIHRocmVzaG9sZC4KKyAqCisgKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6CisgKiAgICAgICBwYXJtMSAgICBQcmlzbTIgUklEIHZhbHVlLgorICogICAgICAgcGFybTIgICAgTm90IHVzZWQuCisgKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KKyAqCisgKiBBcmd1bWVudHM6CisgKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgorICogICAgICAgaXNnZXQgICAgTUlCR0VUL01JQlNFVCBmbGFnLgorICogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgorICogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KKyAqICAgICAgIGh3ICAgICAgICJodyIgc3RydWN0dXJlLgorICogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCisgKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KKyAqCisgKiBSZXR1cm5zOgorICogICAgICAgMCAgIC0gU3VjY2Vzcy4KKyAqICAgICAgIH4wICAtIEVycm9yLgorICoKKyAqLwogCiBzdGF0aWMgaW50IHByaXNtMm1pYl9mcmFnbWVudGF0aW9udGhyZXNob2xkKHN0cnVjdCBtaWJyZWMgKm1pYiwKIAkJCQkJICAgIGludCBpc2dldCwKLQkJCQkJICAgIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCQkJICAgIGhmYTM4NHhfdCAqaHcsCisJCQkJCSAgICBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkJICAgIHN0cnVjdCBoZmEzODR4ICpodywKIAkJCQkJICAgIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csCiAJCQkJCSAgICB2b2lkICpkYXRhKQogewpAQCAtNjc0LDQ3ICs2NzQsNDcgQEAKIAlyZXR1cm4gcHJpc20ybWliX3VpbnQzMihtaWIsIGlzZ2V0LCB3bGFuZGV2LCBodywgbXNnLCBkYXRhKTsKIH0KIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl9wcml2Ci0qCi0qIEdldC9zZXQgdmFsdWVzIGluIHRoZSAicHJpdiIgZGF0YSBzdHJ1Y3R1cmUuCi0qCi0qIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKLSogICAgICAgcGFybTEgICAgTm90IHVzZWQuCi0qICAgICAgIHBhcm0yICAgIE5vdCB1c2VkLgotKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgotKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCi0qICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgotKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgIC0gU3VjY2Vzcy4KLSogICAgICAgfjAgIC0gRXJyb3IuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBwcmlzbTJtaWJfcHJpdgorICoKKyAqIEdldC9zZXQgdmFsdWVzIGluIHRoZSAicHJpdiIgZGF0YSBzdHJ1Y3R1cmUuCisgKgorICogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgorICogICAgICAgcGFybTEgICAgTm90IHVzZWQuCisgKiAgICAgICBwYXJtMiAgICBOb3QgdXNlZC4KKyAqICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgorICoKKyAqIEFyZ3VtZW50czoKKyAqICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCisgKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCisgKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCisgKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgorICogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCisgKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KKyAqICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgorICoKKyAqIFJldHVybnM6CisgKiAgICAgICAwICAgLSBTdWNjZXNzLgorICogICAgICAgfjAgIC0gRXJyb3IuCisgKgorICovCiAKIHN0YXRpYyBpbnQgcHJpc20ybWliX3ByaXYoc3RydWN0IG1pYnJlYyAqbWliLAogCQkJICBpbnQgaXNnZXQsCi0JCQkgIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCSAgaGZhMzg0eF90ICpodywKKwkJCSAgc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkgIHN0cnVjdCBoZmEzODR4ICpodywKIAkJCSAgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgKm1zZywgdm9pZCAqZGF0YSkKIHsKLQlwODAyMTFwc3RyZF90ICpwc3RyID0gZGF0YTsKKwlzdHJ1Y3QgcDgwMjExcHN0cmQgKnBzdHIgPSBkYXRhOwogCiAJc3dpdGNoIChtaWItPmRpZCkgewogCWNhc2UgRElEbWliX2xueF9sbnhDb25maWdUYWJsZV9sbnhSU05BSUU6ewotCQkJaGZhMzg0eF9XUEFEYXRhX3Qgd3BhOworCQkJc3RydWN0IGhmYTM4NHhfV1BBRGF0YSB3cGE7CiAKIAkJCWlmIChpc2dldCkgewogCQkJCWhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsCiAJCQkJCQkgICAgICAgSEZBMzg0eF9SSURfQ05GV1BBREFUQSwKLQkJCQkJCSAgICAgICAodTggKikgJndwYSwKKwkJCQkJCSAgICAgICAodTggKikmd3BhLAogCQkJCQkJICAgICAgIHNpemVvZih3cGEpKTsKIAkJCQlwc3RyLT5sZW4gPSBsZTE2X3RvX2NwdSh3cGEuZGF0YWxlbik7CiAJCQkJbWVtY3B5KHBzdHItPmRhdGEsIHdwYS5kYXRhLCBwc3RyLT5sZW4pOwpAQCAtNzI0LDcgKzcyNCw3IEBACiAKIAkJCQloZmEzODR4X2RydnJfc2V0Y29uZmlnKGh3LAogCQkJCQkJICAgICAgIEhGQTM4NHhfUklEX0NORldQQURBVEEsCi0JCQkJCQkgICAgICAgKHU4ICopICZ3cGEsCisJCQkJCQkgICAgICAgKHU4ICopJndwYSwKIAkJCQkJCSAgICAgICBzaXplb2Yod3BhKSk7CiAJCQl9CiAJCQlicmVhazsKQEAgLTczNiw2NyArNzM2LDY3IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X3BzdHIyYnl0ZXN0cgotKgotKiBDb252ZXJ0IHRoZSBwc3RyIGRhdGEgaW4gdGhlIFdMQU4gbWVzc2FnZSBzdHJ1Y3R1cmUgaW50byBhbiBoZmEzODR4Ci0qIGJ5dGUgc3RyaW5nIGZvcm1hdC4KLSoKLSogQXJndW1lbnRzOgotKglieXRlc3RyCQloZmEzODR4IGJ5dGUgc3RyaW5nIGRhdGEgdHlwZQotKglwc3RyCQl3bGFuIG1lc3NhZ2UgZGF0YQotKgotKiBSZXR1cm5zOgotKglOb3RoaW5nCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBwcmlzbTJtZ210X3BzdHIyYnl0ZXN0cgorICoKKyAqIENvbnZlcnQgdGhlIHBzdHIgZGF0YSBpbiB0aGUgV0xBTiBtZXNzYWdlIHN0cnVjdHVyZSBpbnRvIGFuIGhmYTM4NHgKKyAqIGJ5dGUgc3RyaW5nIGZvcm1hdC4KKyAqCisgKiBBcmd1bWVudHM6CisgKglieXRlc3RyCQloZmEzODR4IGJ5dGUgc3RyaW5nIGRhdGEgdHlwZQorICoJcHN0cgkJd2xhbiBtZXNzYWdlIGRhdGEKKyAqCisgKiBSZXR1cm5zOgorICogCU5vdGhpbmcKKyAqCisgKi8KIAogdm9pZCBwcmlzbTJtZ210X3BzdHIyYnl0ZXN0cihzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyICpieXRlc3RyLAotCQkJICAgICBwODAyMTFwc3RyZF90ICpwc3RyKQorCQkJICAgICBzdHJ1Y3QgcDgwMjExcHN0cmQgKnBzdHIpCiB7Ci0JYnl0ZXN0ci0+bGVuID0gY3B1X3RvX2xlMTYoKHUxNikgKHBzdHItPmxlbikpOworCWJ5dGVzdHItPmxlbiA9IGNwdV90b19sZTE2KCh1MTYpKHBzdHItPmxlbikpOwogCW1lbWNweShieXRlc3RyLT5kYXRhLCBwc3RyLT5kYXRhLCBwc3RyLT5sZW4pOwogfQogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9ieXRlc3RyMnBzdHIKLSoKLSogQ29udmVydCB0aGUgZGF0YSBpbiBhbiBoZmEzODR4IGJ5dGUgc3RyaW5nIGZvcm1hdCBpbnRvIGEKLSogcHN0ciBpbiB0aGUgV0xBTiBtZXNzYWdlLgotKgotKiBBcmd1bWVudHM6Ci0qCWJ5dGVzdHIJCWhmYTM4NHggYnl0ZSBzdHJpbmcgZGF0YSB0eXBlCi0qCW1zZwkJd2xhbiBtZXNzYWdlCi0qCi0qIFJldHVybnM6Ci0qCU5vdGhpbmcKLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIHByaXNtMm1nbXRfYnl0ZXN0cjJwc3RyCisgKgorICogQ29udmVydCB0aGUgZGF0YSBpbiBhbiBoZmEzODR4IGJ5dGUgc3RyaW5nIGZvcm1hdCBpbnRvIGEKKyAqIHBzdHIgaW4gdGhlIFdMQU4gbWVzc2FnZS4KKyAqCisgKiBBcmd1bWVudHM6CisgKglieXRlc3RyCQloZmEzODR4IGJ5dGUgc3RyaW5nIGRhdGEgdHlwZQorICoJbXNnCQl3bGFuIG1lc3NhZ2UKKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICoKKyAqLwogCiB2b2lkIHByaXNtMm1nbXRfYnl0ZXN0cjJwc3RyKHN0cnVjdCBoZmEzODR4X2J5dGVzdHIgKmJ5dGVzdHIsCi0JCQkgICAgIHA4MDIxMXBzdHJkX3QgKnBzdHIpCisJCQkgICAgIHN0cnVjdCBwODAyMTFwc3RyZCAqcHN0cikKIHsKLQlwc3RyLT5sZW4gPSAodTgpIChsZTE2X3RvX2NwdSgodTE2KSAoYnl0ZXN0ci0+bGVuKSkpOworCXBzdHItPmxlbiA9ICh1OCkobGUxNl90b19jcHUoKHUxNikoYnl0ZXN0ci0+bGVuKSkpOwogCW1lbWNweShwc3RyLT5kYXRhLCBieXRlc3RyLT5kYXRhLCBwc3RyLT5sZW4pOwogfQogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9ieXRlYXJlYTJwc3RyCi0qCi0qIENvbnZlcnQgdGhlIGRhdGEgaW4gYW4gaGZhMzg0eCBieXRlIGFyZWEgZm9ybWF0IGludG8gYSBwc3RyCi0qIGluIHRoZSBXTEFOIG1lc3NhZ2UuCi0qCi0qIEFyZ3VtZW50czoKLSoJYnl0ZWFyZWEJaGZhMzg0eCBieXRlIGFyZWEgZGF0YSB0eXBlCi0qCW1zZwkJd2xhbiBtZXNzYWdlCi0qCi0qIFJldHVybnM6Ci0qCU5vdGhpbmcKLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIHByaXNtMm1nbXRfYnl0ZWFyZWEycHN0cgorICoKKyAqIENvbnZlcnQgdGhlIGRhdGEgaW4gYW4gaGZhMzg0eCBieXRlIGFyZWEgZm9ybWF0IGludG8gYSBwc3RyCisgKiBpbiB0aGUgV0xBTiBtZXNzYWdlLgorICoKKyAqIEFyZ3VtZW50czoKKyAqCWJ5dGVhcmVhCWhmYTM4NHggYnl0ZSBhcmVhIGRhdGEgdHlwZQorICoJbXNnCQl3bGFuIG1lc3NhZ2UKKyAqCisgKiBSZXR1cm5zOgorICoJTm90aGluZworICoKKyAqLwogCi12b2lkIHByaXNtMm1nbXRfYnl0ZWFyZWEycHN0cih1OCAqYnl0ZWFyZWEsIHA4MDIxMXBzdHJkX3QgKnBzdHIsIGludCBsZW4pCit2b2lkIHByaXNtMm1nbXRfYnl0ZWFyZWEycHN0cih1OCAqYnl0ZWFyZWEsIHN0cnVjdCBwODAyMTFwc3RyZCAqcHN0ciwgaW50IGxlbikKIHsKLQlwc3RyLT5sZW4gPSAodTgpIGxlbjsKKwlwc3RyLT5sZW4gPSAodTgpbGVuOwogCW1lbWNweShwc3RyLT5kYXRhLCBieXRlYXJlYSwgbGVuKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMnN0YS5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yc3RhLmMKaW5kZXggNjRmOTA3Mi4uZTFiNGE5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yc3RhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yc3RhLmMKQEAgLTgxLDcgKzgxLDcgQEAKICNpbmNsdWRlICJwcmlzbTJtZ210LmgiCiAKIHN0YXRpYyBjaGFyICpkZXZfaW5mbyA9ICJwcmlzbTJfdXNiIjsKLXN0YXRpYyB3bGFuZGV2aWNlX3QgKmNyZWF0ZV93bGFuKHZvaWQpOworc3RhdGljIHN0cnVjdCB3bGFuZGV2aWNlICpjcmVhdGVfd2xhbih2b2lkKTsKIAogaW50IHByaXNtMl9yZXNldF9ob2xkdGltZSA9IDMwOwkvKiBSZXNldCBob2xkIHRpbWUgaW4gbXMgKi8KIGludCBwcmlzbTJfcmVzZXRfc2V0dGxldGltZSA9IDEwMDsJLyogUmVzZXQgc2V0dGxlIHRpbWUgaW4gbXMgKi8KQEAgLTk4LDM3ICs5OCwzOCBAQAogCiBNT0RVTEVfTElDRU5TRSgiRHVhbCBNUEwvR1BMIik7CiAKLXN0YXRpYyBpbnQgcHJpc20yc3RhX29wZW4od2xhbmRldmljZV90ICp3bGFuZGV2KTsKLXN0YXRpYyBpbnQgcHJpc20yc3RhX2Nsb3NlKHdsYW5kZXZpY2VfdCAqd2xhbmRldik7Ci1zdGF0aWMgdm9pZCBwcmlzbTJzdGFfcmVzZXQod2xhbmRldmljZV90ICp3bGFuZGV2KTsKLXN0YXRpYyBpbnQgcHJpc20yc3RhX3R4ZnJhbWUod2xhbmRldmljZV90ICp3bGFuZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorc3RhdGljIGludCBwcmlzbTJzdGFfb3BlbihzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldik7CitzdGF0aWMgaW50IHByaXNtMnN0YV9jbG9zZShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldik7CitzdGF0aWMgdm9pZCBwcmlzbTJzdGFfcmVzZXQoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpOworc3RhdGljIGludCBwcmlzbTJzdGFfdHhmcmFtZShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgdW5pb24gcDgwMjExX2hkciAqcDgwMjExX2hkciwKIAkJCSAgICAgc3RydWN0IHA4MDIxMV9tZXRhd2VwICpwODAyMTFfd2VwKTsKLXN0YXRpYyBpbnQgcHJpc20yc3RhX21sbWVyZXF1ZXN0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgc3RydWN0IHA4MDIxMW1zZyAqbXNnKTsKLXN0YXRpYyBpbnQgcHJpc20yc3RhX2dldGNhcmRpbmZvKHdsYW5kZXZpY2VfdCAqd2xhbmRldik7Ci1zdGF0aWMgaW50IHByaXNtMnN0YV9nbG9iYWxzZXR1cCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwotc3RhdGljIGludCBwcmlzbTJzdGFfc2V0bXVsdGljYXN0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgbmV0ZGV2aWNlX3QgKmRldik7CitzdGF0aWMgaW50IHByaXNtMnN0YV9tbG1lcmVxdWVzdChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgc3RydWN0IHA4MDIxMW1zZyAqbXNnKTsKK3N0YXRpYyBpbnQgcHJpc20yc3RhX2dldGNhcmRpbmZvKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KTsKK3N0YXRpYyBpbnQgcHJpc20yc3RhX2dsb2JhbHNldHVwKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KTsKK3N0YXRpYyBpbnQgcHJpc20yc3RhX3NldG11bHRpY2FzdChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCi1zdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2hhbmRvdmVyKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCQkgICBoZmEzODR4X0luZkZyYW1lX3QgKmluZik7Ci1zdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX3RhbGxpZXMod2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCSAgaGZhMzg0eF9JbmZGcmFtZV90ICppbmYpOwotc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl9ob3N0c2NhbnJlc3VsdHMod2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCQkgIGhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mKTsKLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfc2NhbnJlc3VsdHMod2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCSAgICAgIGhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mKTsKLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfY2hpbmZvcmVzdWx0cyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJCWhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mKTsKLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfbGlua3N0YXR1cyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICAgICBoZmEzODR4X0luZkZyYW1lX3QgKmluZik7Ci1zdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2Fzc29jc3RhdHVzKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCQkgICAgICBoZmEzODR4X0luZkZyYW1lX3QgKmluZik7Ci1zdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2F1dGhyZXEod2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCSAgaGZhMzg0eF9JbmZGcmFtZV90ICppbmYpOwotc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl9hdXRocmVxX2RlZmVyKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCQkJaGZhMzg0eF9JbmZGcmFtZV90ICppbmYpOwotc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl9wc3VzZXJjbnQod2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCSAgICBoZmEzODR4X0luZkZyYW1lX3QgKmluZik7CitzdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2hhbmRvdmVyKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCSAgIHN0cnVjdCBoZmEzODR4X0luZkZyYW1lICppbmYpOworc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl90YWxsaWVzKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCSAgc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgKmluZik7CitzdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2hvc3RzY2FucmVzdWx0cyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkJICBzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqaW5mKTsKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfc2NhbnJlc3VsdHMoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJICAgICAgc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgKmluZik7CitzdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2NoaW5mb3Jlc3VsdHMoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJCXN0cnVjdCBoZmEzODR4X0luZkZyYW1lICppbmYpOworc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl9saW5rc3RhdHVzKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCSAgICAgc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgKmluZik7CitzdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2Fzc29jc3RhdHVzKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCSAgICAgIHN0cnVjdCBoZmEzODR4X0luZkZyYW1lICppbmYpOworc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl9hdXRocmVxKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCSAgc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgKmluZik7CitzdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2F1dGhyZXFfZGVmZXIoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJCXN0cnVjdCBoZmEzODR4X0luZkZyYW1lICppbmYpOworc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl9wc3VzZXJjbnQoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJICAgIHN0cnVjdCBoZmEzODR4X0luZkZyYW1lICppbmYpOwogCiAvKgogICogcHJpc20yc3RhX29wZW4KQEAgLTE1MSw3ICsxNTIsNyBAQAogICogQ2FsbCBjb250ZXh0OgogICoJcHJvY2VzcyB0aHJlYWQKICAqLwotc3RhdGljIGludCBwcmlzbTJzdGFfb3Blbih3bGFuZGV2aWNlX3QgKndsYW5kZXYpCitzdGF0aWMgaW50IHByaXNtMnN0YV9vcGVuKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KQogewogCS8qIFdlIGRvbid0IGN1cnJlbnRseSBoYXZlIHRvIGRvIGFueXRoaW5nIGVsc2UuCiAJICogVGhlIHNldHVwIG9mIHRoZSBNQUMgc2hvdWxkIGJlIHN1YnNlcXVlbnRseSBjb21wbGV0ZWQgdmlhCkBAIC0xODUsNyArMTg2LDcgQEAKICAqIENhbGwgY29udGV4dDoKICAqCXByb2Nlc3MgdGhyZWFkCiAgKi8KLXN0YXRpYyBpbnQgcHJpc20yc3RhX2Nsb3NlKHdsYW5kZXZpY2VfdCAqd2xhbmRldikKK3N0YXRpYyBpbnQgcHJpc20yc3RhX2Nsb3NlKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KQogewogCS8qIFdlIGRvbid0IGN1cnJlbnRseSBoYXZlIHRvIGRvIGFueXRoaW5nIGVsc2UuCiAJICogSGlnaGVyIGxheWVycyBrbm93IHdlJ3JlIG5vdCByZWFkeSBmcm9tIGRldi0+c3RhcnQ9PTAgYW5kCkBAIC0yMTMsNyArMjE0LDcgQEAKICAqIENhbGwgY29udGV4dDoKICAqCXByb2Nlc3MgdGhyZWFkCiAgKi8KLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9yZXNldCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCitzdGF0aWMgdm9pZCBwcmlzbTJzdGFfcmVzZXQoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpCiB7CiB9CiAKQEAgLTIzOCwxMSArMjM5LDExIEBACiAgKiBDYWxsIGNvbnRleHQ6CiAgKglwcm9jZXNzIHRocmVhZAogICovCi1zdGF0aWMgaW50IHByaXNtMnN0YV90eGZyYW1lKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKK3N0YXRpYyBpbnQgcHJpc20yc3RhX3R4ZnJhbWUoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgIHVuaW9uIHA4MDIxMV9oZHIgKnA4MDIxMV9oZHIsCiAJCQkgICAgIHN0cnVjdCBwODAyMTFfbWV0YXdlcCAqcDgwMjExX3dlcCkKIHsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCiAJLyogSWYgbmVjZXNzYXJ5LCBzZXQgdGhlIDgwMi4xMSBXRVAgYml0ICovCiAJaWYgKCh3bGFuZGV2LT5ob3N0d2VwICYgKEhPU1RXRVBfUFJJVkFDWUlOVk9LRUQgfCBIT1NUV0VQX0VOQ1JZUFQpKSA9PQpAQCAtMjc3LDkgKzI3OCw5IEBACiAgKiBDYWxsIGNvbnRleHQ6CiAgKglwcm9jZXNzIHRocmVhZAogICovCi1zdGF0aWMgaW50IHByaXNtMnN0YV9tbG1lcmVxdWVzdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHN0cnVjdCBwODAyMTFtc2cgKm1zZykKK3N0YXRpYyBpbnQgcHJpc20yc3RhX21sbWVyZXF1ZXN0KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBzdHJ1Y3QgcDgwMjExbXNnICptc2cpCiB7Ci0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKIAogCWludCByZXN1bHQgPSAwOwogCkBAIC0zMzcsNyArMzM4LDcgQEAKIAkJCXN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2lmc3RhdGUgKmlmc3RhdGVtc2c7CiAKIAkJCXByX2RlYnVnKCJSZWNlaXZlZCBtbG1lIGlmc3RhdGUgcmVxdWVzdFxuIik7Ci0JCQlpZnN0YXRlbXNnID0gKHN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2lmc3RhdGUgKikgbXNnOworCQkJaWZzdGF0ZW1zZyA9IChzdHJ1Y3QgcDgwMjExbXNnX2xueHJlcV9pZnN0YXRlICopbXNnOwogCQkJcmVzdWx0ID0KIAkJCSAgICBwcmlzbTJzdGFfaWZzdGF0ZSh3bGFuZGV2LAogCQkJCQkgICAgICBpZnN0YXRlbXNnLT5pZnN0YXRlLmRhdGEpOwpAQCAtMzYwLDcgKzM2MSw3IEBACiAKIAkJCXByX2RlYnVnKCJSZWNlaXZlZCBjb21tc3F1YWxpdHkgcmVxdWVzdFxuIik7CiAKLQkJCXF1YWxtc2cgPSAoc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfY29tbXNxdWFsaXR5ICopIG1zZzsKKwkJCXF1YWxtc2cgPSAoc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfY29tbXNxdWFsaXR5ICopbXNnOwogCiAJCQlxdWFsbXNnLT5saW5rLnN0YXR1cyA9CiAJCQkgICAgUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwpAQCAtNDA3LDkgKzQwOCw5IEBACiAgKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCiAgKglpbnRlcnJ1cHQKICAqLwotdTMyIHByaXNtMnN0YV9pZnN0YXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTMyIGlmc3RhdGUpCit1MzIgcHJpc20yc3RhX2lmc3RhdGUoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHUzMiBpZnN0YXRlKQogewotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAJdTMyIHJlc3VsdDsKIAogCXJlc3VsdCA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9pbXBsZW1lbnRhdGlvbl9mYWlsdXJlOwpAQCAtNTgwLDEwICs1ODEsMTAgQEAKICAqIENhbGwgY29udGV4dDoKICAqCUVpdGhlci4KICAqLwotc3RhdGljIGludCBwcmlzbTJzdGFfZ2V0Y2FyZGluZm8od2xhbmRldmljZV90ICp3bGFuZGV2KQorc3RhdGljIGludCBwcmlzbTJzdGFfZ2V0Y2FyZGluZm8oc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpCiB7CiAJaW50IHJlc3VsdCA9IDA7Ci0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKIAl1MTYgdGVtcDsKIAl1OCBzbnVtW0hGQTM4NHhfUklEX05JQ1NFUklBTE5VTUJFUl9MRU5dOwogCkBAIC01OTIsNyArNTkzLDcgQEAKIAkvKiBOSUMgaWRlbnRpdHkgKi8KIAlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCBIRkEzODR4X1JJRF9OSUNJREVOVElUWSwKIAkJCQkJJmh3LT5pZGVudF9uaWMsCi0JCQkJCXNpemVvZihoZmEzODR4X2NvbXBpZGVudF90KSk7CisJCQkJCXNpemVvZihzdHJ1Y3QgaGZhMzg0eF9jb21waWRlbnQpKTsKIAlpZiAocmVzdWx0KSB7CiAJCW5ldGRldl9lcnIod2xhbmRldi0+bmV0ZGV2LCAiRmFpbGVkIHRvIHJldHJpZXZlIE5JQ0lERU5USVRZXG4iKTsKIAkJZ290byBmYWlsZWQ7CkBAIC02MTEsNyArNjEyLDcgQEAKIAkvKiBQcmltYXJ5IGYvdyBpZGVudGl0eSAqLwogCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX1BSSUlERU5USVRZLAogCQkJCQkmaHctPmlkZW50X3ByaV9mdywKLQkJCQkJc2l6ZW9mKGhmYTM4NHhfY29tcGlkZW50X3QpKTsKKwkJCQkJc2l6ZW9mKHN0cnVjdCBoZmEzODR4X2NvbXBpZGVudCkpOwogCWlmIChyZXN1bHQpIHsKIAkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsICJGYWlsZWQgdG8gcmV0cmlldmUgUFJJSURFTlRJVFlcbiIpOwogCQlnb3RvIGZhaWxlZDsKQEAgLTYzMCw3ICs2MzEsNyBAQAogCS8qIFN0YXRpb24gKFNlY29uZGFyeT8pIGYvdyBpZGVudGl0eSAqLwogCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX1NUQUlERU5USVRZLAogCQkJCQkmaHctPmlkZW50X3N0YV9mdywKLQkJCQkJc2l6ZW9mKGhmYTM4NHhfY29tcGlkZW50X3QpKTsKKwkJCQkJc2l6ZW9mKHN0cnVjdCBoZmEzODR4X2NvbXBpZGVudCkpOwogCWlmIChyZXN1bHQpIHsKIAkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsICJGYWlsZWQgdG8gcmV0cmlldmUgU1RBSURFTlRJVFlcbiIpOwogCQlnb3RvIGZhaWxlZDsKQEAgLTY1MSw3ICs2NTIsNyBAQAogCiAJLyogc3RyaXAgb3V0IHRoZSAnc3BlY2lhbCcgdmFyaWFudCBiaXRzICovCiAJaHctPm1tX21vZHMgPSBody0+aWRlbnRfc3RhX2Z3LnZhcmlhbnQgJiAoQklUKDE0KSB8IEJJVCgxNSkpOwotCWh3LT5pZGVudF9zdGFfZncudmFyaWFudCAmPSB+KCh1MTYpIChCSVQoMTQpIHwgQklUKDE1KSkpOworCWh3LT5pZGVudF9zdGFfZncudmFyaWFudCAmPSB+KCh1MTYpKEJJVCgxNCkgfCBCSVQoMTUpKSk7CiAKIAlpZiAoaHctPmlkZW50X3N0YV9mdy5pZCA9PSAweDFmKSB7CiAJCW5ldGRldl9pbmZvKHdsYW5kZXYtPm5ldGRldiwKQEAgLTY3MCw3ICs2NzEsNyBAQAogCS8qIENvbXBhdGliaWxpdHkgcmFuZ2UsIE1vZGVtIHN1cHBsaWVyICovCiAJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgSEZBMzg0eF9SSURfTUZJU1VQUkFOR0UsCiAJCQkJCSZody0+Y2FwX3N1cF9tZmksCi0JCQkJCXNpemVvZihoZmEzODR4X2NhcGxldmVsX3QpKTsKKwkJCQkJc2l6ZW9mKHN0cnVjdCBoZmEzODR4X2NhcGxldmVsKSk7CiAJaWYgKHJlc3VsdCkgewogCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBNRklTVVBSQU5HRVxuIik7CiAJCWdvdG8gZmFpbGVkOwpAQCAtNjk0LDcgKzY5NSw3IEBACiAJLyogQ29tcGF0aWJpbGl0eSByYW5nZSwgQ29udHJvbGxlciBzdXBwbGllciAqLwogCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX0NGSVNVUFJBTkdFLAogCQkJCQkmaHctPmNhcF9zdXBfY2ZpLAotCQkJCQlzaXplb2YoaGZhMzg0eF9jYXBsZXZlbF90KSk7CisJCQkJCXNpemVvZihzdHJ1Y3QgaGZhMzg0eF9jYXBsZXZlbCkpOwogCWlmIChyZXN1bHQpIHsKIAkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsICJGYWlsZWQgdG8gcmV0cmlldmUgQ0ZJU1VQUkFOR0VcbiIpOwogCQlnb3RvIGZhaWxlZDsKQEAgLTcxOCw3ICs3MTksNyBAQAogCS8qIENvbXBhdGliaWxpdHkgcmFuZ2UsIFByaW1hcnkgZi93IHN1cHBsaWVyICovCiAJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgSEZBMzg0eF9SSURfUFJJU1VQUkFOR0UsCiAJCQkJCSZody0+Y2FwX3N1cF9wcmksCi0JCQkJCXNpemVvZihoZmEzODR4X2NhcGxldmVsX3QpKTsKKwkJCQkJc2l6ZW9mKHN0cnVjdCBoZmEzODR4X2NhcGxldmVsKSk7CiAJaWYgKHJlc3VsdCkgewogCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBQUklTVVBSQU5HRVxuIik7CiAJCWdvdG8gZmFpbGVkOwpAQCAtNzQyLDcgKzc0Myw3IEBACiAJLyogQ29tcGF0aWJpbGl0eSByYW5nZSwgU3RhdGlvbiBmL3cgc3VwcGxpZXIgKi8KIAlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCBIRkEzODR4X1JJRF9TVEFTVVBSQU5HRSwKIAkJCQkJJmh3LT5jYXBfc3VwX3N0YSwKLQkJCQkJc2l6ZW9mKGhmYTM4NHhfY2FwbGV2ZWxfdCkpOworCQkJCQlzaXplb2Yoc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwpKTsKIAlpZiAocmVzdWx0KSB7CiAJCW5ldGRldl9lcnIod2xhbmRldi0+bmV0ZGV2LCAiRmFpbGVkIHRvIHJldHJpZXZlIFNUQVNVUFJBTkdFXG4iKTsKIAkJZ290byBmYWlsZWQ7CkBAIC03NzQsNyArNzc1LDcgQEAKIAkvKiBDb21wYXRpYmlsaXR5IHJhbmdlLCBwcmltYXJ5IGYvdyBhY3RvciwgQ0ZJIHN1cHBsaWVyICovCiAJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgSEZBMzg0eF9SSURfUFJJX0NGSUFDVFJBTkdFUywKIAkJCQkJJmh3LT5jYXBfYWN0X3ByaV9jZmksCi0JCQkJCXNpemVvZihoZmEzODR4X2NhcGxldmVsX3QpKTsKKwkJCQkJc2l6ZW9mKHN0cnVjdCBoZmEzODR4X2NhcGxldmVsKSk7CiAJaWYgKHJlc3VsdCkgewogCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBQUklfQ0ZJQUNUUkFOR0VTXG4iKTsKIAkJZ290byBmYWlsZWQ7CkBAIC03OTgsNyArNzk5LDcgQEAKIAkvKiBDb21wYXRpYmlsaXR5IHJhbmdlLCBzdGEgZi93IGFjdG9yLCBDRkkgc3VwcGxpZXIgKi8KIAlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCBIRkEzODR4X1JJRF9TVEFfQ0ZJQUNUUkFOR0VTLAogCQkJCQkmaHctPmNhcF9hY3Rfc3RhX2NmaSwKLQkJCQkJc2l6ZW9mKGhmYTM4NHhfY2FwbGV2ZWxfdCkpOworCQkJCQlzaXplb2Yoc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwpKTsKIAlpZiAocmVzdWx0KSB7CiAJCW5ldGRldl9lcnIod2xhbmRldi0+bmV0ZGV2LCAiRmFpbGVkIHRvIHJldHJpZXZlIFNUQV9DRklBQ1RSQU5HRVNcbiIpOwogCQlnb3RvIGZhaWxlZDsKQEAgLTgyMiw3ICs4MjMsNyBAQAogCS8qIENvbXBhdGliaWxpdHkgcmFuZ2UsIHN0YSBmL3cgYWN0b3IsIE1GSSBzdXBwbGllciAqLwogCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX1NUQV9NRklBQ1RSQU5HRVMsCiAJCQkJCSZody0+Y2FwX2FjdF9zdGFfbWZpLAotCQkJCQlzaXplb2YoaGZhMzg0eF9jYXBsZXZlbF90KSk7CisJCQkJCXNpemVvZihzdHJ1Y3QgaGZhMzg0eF9jYXBsZXZlbCkpOwogCWlmIChyZXN1bHQpIHsKIAkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsICJGYWlsZWQgdG8gcmV0cmlldmUgU1RBX01GSUFDVFJBTkdFU1xuIik7CiAJCWdvdG8gZmFpbGVkOwpAQCAtOTA5LDE5ICs5MTAsMjAgQEAKICAqIENhbGwgY29udGV4dDoKICAqCXByb2Nlc3MgdGhyZWFkCiAgKi8KLXN0YXRpYyBpbnQgcHJpc20yc3RhX2dsb2JhbHNldHVwKHdsYW5kZXZpY2VfdCAqd2xhbmRldikKK3N0YXRpYyBpbnQgcHJpc20yc3RhX2dsb2JhbHNldHVwKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KQogewotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAKIAkvKiBTZXQgdGhlIG1heGltdW0gZnJhbWUgc2l6ZSAqLwogCXJldHVybiBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaHcsIEhGQTM4NHhfUklEX0NORk1BWERBVEFMRU4sCiAJCQkJCVdMQU5fREFUQV9NQVhMRU4pOwogfQogCi1zdGF0aWMgaW50IHByaXNtMnN0YV9zZXRtdWx0aWNhc3Qod2xhbmRldmljZV90ICp3bGFuZGV2LCBuZXRkZXZpY2VfdCAqZGV2KQorc3RhdGljIGludCBwcmlzbTJzdGFfc2V0bXVsdGljYXN0KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWludCByZXN1bHQgPSAwOwotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAKIAl1MTYgcHJvbWlzYzsKIApAQCAtOTU5LDggKzk2MSw4IEBACiAgKiBDYWxsIGNvbnRleHQ6CiAgKglpbnRlcnJ1cHQKICAqLwotc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl9oYW5kb3Zlcih3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICAgaGZhMzg0eF9JbmZGcmFtZV90ICppbmYpCitzdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2hhbmRvdmVyKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCSAgIHN0cnVjdCBoZmEzODR4X0luZkZyYW1lICppbmYpCiB7CiAJcHJfZGVidWcoInJlY2VpdmVkIGluZm9mcmFtZTpIQU5ET1ZFUiAodW5oYW5kbGVkKVxuIik7CiB9CkBAIC05ODIsMTAgKzk4NCwxMCBAQAogICogQ2FsbCBjb250ZXh0OgogICoJaW50ZXJydXB0CiAgKi8KLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfdGFsbGllcyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICBoZmEzODR4X0luZkZyYW1lX3QgKmluZikKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfdGFsbGllcyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkgIHN0cnVjdCBoZmEzODR4X0luZkZyYW1lICppbmYpCiB7Ci0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKIAl1MTYgKnNyYzE2OwogCXUzMiAqZHN0OwogCXUzMiAqc3JjMzI7CkBAIC05OTcsMTUgKzk5OSwxNSBAQAogCSAqIHJlY29yZCBsZW5ndGggb2YgdGhlIGluZm8gcmVjb3JkLgogCSAqLwogCi0JY250ID0gc2l6ZW9mKGhmYTM4NHhfQ29tbVRhbGxpZXMzMl90KSAvIHNpemVvZih1MzIpOworCWNudCA9IHNpemVvZihzdHJ1Y3QgaGZhMzg0eF9Db21tVGFsbGllczMyKSAvIHNpemVvZih1MzIpOwogCWlmIChpbmYtPmZyYW1lbGVuID4gMjIpIHsKLQkJZHN0ID0gKHUzMiAqKSAmaHctPnRhbGxpZXM7Ci0JCXNyYzMyID0gKHUzMiAqKSAmaW5mLT5pbmZvLmNvbW10YWxsaWVzMzI7CisJCWRzdCA9ICh1MzIgKikmaHctPnRhbGxpZXM7CisJCXNyYzMyID0gKHUzMiAqKSZpbmYtPmluZm8uY29tbXRhbGxpZXMzMjsKIAkJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrLCBkc3QrKywgc3JjMzIrKykKIAkJCSpkc3QgKz0gbGUzMl90b19jcHUoKnNyYzMyKTsKIAl9IGVsc2UgewotCQlkc3QgPSAodTMyICopICZody0+dGFsbGllczsKLQkJc3JjMTYgPSAodTE2ICopICZpbmYtPmluZm8uY29tbXRhbGxpZXMxNjsKKwkJZHN0ID0gKHUzMiAqKSZody0+dGFsbGllczsKKwkJc3JjMTYgPSAodTE2ICopJmluZi0+aW5mby5jb21tdGFsbGllczE2OwogCQlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyssIGRzdCsrLCBzcmMxNisrKQogCQkJKmRzdCArPSBsZTE2X3RvX2NwdSgqc3JjMTYpOwogCX0KQEAgLTEwMjgsMjEgKzEwMzAsMjAgQEAKICAqIENhbGwgY29udGV4dDoKICAqCWludGVycnVwdAogICovCi1zdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX3NjYW5yZXN1bHRzKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCQkgICAgICBoZmEzODR4X0luZkZyYW1lX3QgKmluZikKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfc2NhbnJlc3VsdHMoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJICAgICAgc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgKmluZikKIHsKLQotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAJaW50IG5ic3M7Ci0JaGZhMzg0eF9TY2FuUmVzdWx0X3QgKnNyID0gJihpbmYtPmluZm8uc2NhbnJlc3VsdCk7CisJc3RydWN0IGhmYTM4NHhfU2NhblJlc3VsdCAqc3IgPSAmKGluZi0+aW5mby5zY2FucmVzdWx0KTsKIAlpbnQgaTsKLQloZmEzODR4X0pvaW5SZXF1ZXN0X2RhdGFfdCBqb2lucmVxOworCXN0cnVjdCBoZmEzODR4X0pvaW5SZXF1ZXN0X2RhdGEgam9pbnJlcTsKIAlpbnQgcmVzdWx0OwogCiAJLyogR2V0IHRoZSBudW1iZXIgb2YgcmVzdWx0cywgZmlyc3QgaW4gYnl0ZXMsIHRoZW4gaW4gcmVzdWx0cyAqLwogCW5ic3MgPSAoaW5mLT5mcmFtZWxlbiAqIHNpemVvZih1MTYpKSAtCiAJICAgIHNpemVvZihpbmYtPmluZm90eXBlKSAtIHNpemVvZihpbmYtPmluZm8uc2NhbnJlc3VsdC5zY2FucmVhc29uKTsKLQluYnNzIC89IHNpemVvZihoZmEzODR4X1NjYW5SZXN1bHRTdWJfdCk7CisJbmJzcyAvPSBzaXplb2Yoc3RydWN0IGhmYTM4NHhfU2NhblJlc3VsdFN1Yik7CiAKIAkvKiBQcmludCBlbSAqLwogCXByX2RlYnVnKCJyeCBzY2FucmVzdWx0cywgcmVhc29uPSVkLCBuYnNzPSVkOlxuIiwKQEAgLTEwODQsMTAgKzEwODUsMTAgQEAKICAqIENhbGwgY29udGV4dDoKICAqCWludGVycnVwdAogICovCi1zdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2hvc3RzY2FucmVzdWx0cyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJCSAgaGZhMzg0eF9JbmZGcmFtZV90ICppbmYpCitzdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2hvc3RzY2FucmVzdWx0cyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkJICBzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqaW5mKQogewotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAJaW50IG5ic3M7CiAKIAluYnNzID0gKGluZi0+ZnJhbWVsZW4gLSAzKSAvIDMyOwpAQCAtMTA5OCw3ICsxMDk5LDcgQEAKIAogCWtmcmVlKGh3LT5zY2FucmVzdWx0cyk7CiAKLQlody0+c2NhbnJlc3VsdHMgPSBrbWVtZHVwKGluZiwgc2l6ZW9mKGhmYTM4NHhfSW5mRnJhbWVfdCksIEdGUF9BVE9NSUMpOworCWh3LT5zY2FucmVzdWx0cyA9IGttZW1kdXAoaW5mLCBzaXplb2Yoc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUpLCBHRlBfQVRPTUlDKTsKIAogCWlmIChuYnNzID09IDApCiAJCW5ic3MgPSAtMTsKQEAgLTExMjUsMTggKzExMjYsMTggQEAKICAqIENhbGwgY29udGV4dDoKICAqCWludGVycnVwdAogICovCi1zdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2NoaW5mb3Jlc3VsdHMod2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCQloZmEzODR4X0luZkZyYW1lX3QgKmluZikKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfY2hpbmZvcmVzdWx0cyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkJc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgKmluZikKIHsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCXVuc2lnbmVkIGludCBpLCBuOwogCiAJaHctPmNoYW5uZWxfaW5mby5yZXN1bHRzLnNjYW5jaGFubmVscyA9CiAJICAgIGxlMTZfdG9fY3B1KGluZi0+aW5mby5jaGluZm9yZXN1bHQuc2NhbmNoYW5uZWxzKTsKIAogCWZvciAoaSA9IDAsIG4gPSAwOyBpIDwgSEZBMzg0eF9DSElORk9SRVNVTFRfTUFYOyBpKyspIHsKLQkJaGZhMzg0eF9DaEluZm9SZXN1bHRTdWJfdCAqcmVzdWx0OwotCQloZmEzODR4X0NoSW5mb1Jlc3VsdFN1Yl90ICpjaGluZm9yZXN1bHQ7CisJCXN0cnVjdCBoZmEzODR4X0NoSW5mb1Jlc3VsdFN1YiAqcmVzdWx0OworCQlzdHJ1Y3QgaGZhMzg0eF9DaEluZm9SZXN1bHRTdWIgKmNoaW5mb3Jlc3VsdDsKIAkJaW50IGNoYW47CiAKIAkJaWYgKCEoaHctPmNoYW5uZWxfaW5mby5yZXN1bHRzLnNjYW5jaGFubmVscyAmICgxIDw8IGkpKSkKQEAgLTExNzAsMTggKzExNzEsMTggQEAKIAogdm9pZCBwcmlzbTJzdGFfcHJvY2Vzc2luZ19kZWZlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCiB7Ci0JaGZhMzg0eF90ICpodyA9IGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaGZhMzg0eCwgbGlua19iaCk7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gaHctPndsYW5kZXY7Ci0JaGZhMzg0eF9ieXRlc3RyMzJfdCBzc2lkOworCXN0cnVjdCBoZmEzODR4ICpodyA9IGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaGZhMzg0eCwgbGlua19iaCk7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSBody0+d2xhbmRldjsKKwlzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyMzIgc3NpZDsKIAlpbnQgcmVzdWx0OwogCiAJLyogRmlyc3QgbGV0J3MgcHJvY2VzcyB0aGUgYXV0aCBmcmFtZXMgKi8KIAl7CiAJCXN0cnVjdCBza19idWZmICpza2I7Ci0JCWhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mOworCQlzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqaW5mOwogCiAJCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmh3LT5hdXRocSkpKSB7Ci0JCQlpbmYgPSAoaGZhMzg0eF9JbmZGcmFtZV90ICopIHNrYi0+ZGF0YTsKKwkJCWluZiA9IChzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqKXNrYi0+ZGF0YTsKIAkJCXByaXNtMnN0YV9pbmZfYXV0aHJlcV9kZWZlcih3bGFuZGV2LCBpbmYpOwogCQl9CiAKQEAgLTEyNTYsOCArMTI1Nyw4IEBACiAJCQkJcmV0dXJuOwogCQkJfQogCQkJcHJpc20ybWdtdF9ieXRlc3RyMnBzdHIoCi0JCQkJCShzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyICopICZzc2lkLAotCQkJCQkocDgwMjExcHN0cmRfdCAqKSAmd2xhbmRldi0+c3NpZCk7CisJCQkJCShzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyICopJnNzaWQsCisJCQkJCShzdHJ1Y3QgcDgwMjExcHN0cmQgKikmd2xhbmRldi0+c3NpZCk7CiAKIAkJCS8qIENvbGxlY3QgdGhlIHBvcnQgc3RhdHVzICovCiAJCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnMTYoaHcsCkBAIC0xMzM3LDggKzEzMzgsOCBAQAogCQkJCSBIRkEzODR4X1JJRF9DVVJSRU5UU1NJRCwgcmVzdWx0KTsKIAkJCXJldHVybjsKIAkJfQotCQlwcmlzbTJtZ210X2J5dGVzdHIycHN0cigoc3RydWN0IGhmYTM4NHhfYnl0ZXN0ciAqKSAmc3NpZCwKLQkJCQkJKHA4MDIxMXBzdHJkX3QgKikgJndsYW5kZXYtPnNzaWQpOworCQlwcmlzbTJtZ210X2J5dGVzdHIycHN0cigoc3RydWN0IGhmYTM4NHhfYnl0ZXN0ciAqKSZzc2lkLAorCQkJCQkoc3RydWN0IHA4MDIxMXBzdHJkICopJndsYW5kZXYtPnNzaWQpOwogCiAJCWh3LT5saW5rX3N0YXR1cyA9IEhGQTM4NHhfTElOS19DT05ORUNURUQ7CiAJCW5ldGlmX2NhcnJpZXJfb24od2xhbmRldi0+bmV0ZGV2KTsKQEAgLTEzOTAsNyArMTM5MSw3IEBACiAJCSAqIERpc2FibGUgVHJhbnNtaXRzLCBJZ25vcmUgcmVjZWl2ZXMgb2YgZGF0YSBmcmFtZXMKIAkJICovCiAJCWlmIChody0+am9pbl9hcCAmJiAtLWh3LT5qb2luX3JldHJpZXMgPiAwKSB7Ci0JCQloZmEzODR4X0pvaW5SZXF1ZXN0X2RhdGFfdCBqb2lucmVxOworCQkJc3RydWN0IGhmYTM4NHhfSm9pblJlcXVlc3RfZGF0YSBqb2lucmVxOwogCiAJCQlqb2lucmVxID0gaHctPmpvaW5yZXE7CiAJCQkvKiBTZW5kIHRoZSBqb2luIHJlcXVlc3QgKi8KQEAgLTE0MzgsMTAgKzE0MzksMTAgQEAKICAqIENhbGwgY29udGV4dDoKICAqCWludGVycnVwdAogICovCi1zdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2xpbmtzdGF0dXMod2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCSAgICAgaGZhMzg0eF9JbmZGcmFtZV90ICppbmYpCitzdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2xpbmtzdGF0dXMoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJICAgICBzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqaW5mKQogewotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAKIAlody0+bGlua19zdGF0dXNfbmV3ID0gbGUxNl90b19jcHUoaW5mLT5pbmZvLmxpbmtzdGF0dXMubGlua3N0YXR1cyk7CiAKQEAgLTE0NjYsMTEgKzE0NjcsMTEgQEAKICAqIENhbGwgY29udGV4dDoKICAqCWludGVycnVwdAogICovCi1zdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2Fzc29jc3RhdHVzKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCQkgICAgICBoZmEzODR4X0luZkZyYW1lX3QgKmluZikKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfYXNzb2NzdGF0dXMoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJICAgICAgc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgKmluZikKIHsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKLQloZmEzODR4X0Fzc29jU3RhdHVzX3QgcmVjOworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHhfQXNzb2NTdGF0dXMgcmVjOwogCWludCBpOwogCiAJbWVtY3B5KCZyZWMsICZpbmYtPmluZm8uYXNzb2NzdGF0dXMsIHNpemVvZihyZWMpKTsKQEAgLTE1MjcsMTAgKzE1MjgsMTAgQEAKICAqCWludGVycnVwdAogICoKICAqLwotc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl9hdXRocmVxKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCQkgIGhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mKQorc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl9hdXRocmVxKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCSAgc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgKmluZikKIHsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCXN0cnVjdCBza19idWZmICpza2I7CiAKIAlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZigqaW5mKSk7CkBAIC0xNTQyLDExICsxNTQzLDExIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2F1dGhyZXFfZGVmZXIod2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCQloZmEzODR4X0luZkZyYW1lX3QgKmluZikKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfYXV0aHJlcV9kZWZlcihzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkJc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgKmluZikKIHsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKLQloZmEzODR4X2F1dGhlbnRpY2F0ZVN0YXRpb25fZGF0YV90IHJlYzsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXN0cnVjdCBoZmEzODR4X2F1dGhlbnRpY2F0ZVN0YXRpb25fZGF0YSByZWM7CiAKIAlpbnQgaSwgYWRkZWQsIHJlc3VsdCwgY250OwogCXU4ICphZGRyOwpAQCAtMTcxNiwxMCArMTcxNywxMCBAQAogICogQ2FsbCBjb250ZXh0OgogICoJaW50ZXJydXB0CiAgKi8KLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfcHN1c2VyY250KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCQkgICAgaGZhMzg0eF9JbmZGcmFtZV90ICppbmYpCitzdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX3BzdXNlcmNudChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkgICAgc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgKmluZikKIHsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCiAJaHctPnBzdXNlcmNvdW50ID0gbGUxNl90b19jcHUoaW5mLT5pbmZvLnBzdXNlcmNudC51c2VyY250KTsKIH0KQEAgLTE3NDEsNyArMTc0Miw3IEBACiAgKiBDYWxsIGNvbnRleHQ6CiAgKglpbnRlcnJ1cHQKICAqLwotdm9pZCBwcmlzbTJzdGFfZXZfaW5mbyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIGhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mKQordm9pZCBwcmlzbTJzdGFfZXZfaW5mbyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgKmluZikKIHsKIAlpbmYtPmluZm90eXBlID0gbGUxNl90b19jcHUoaW5mLT5pbmZvdHlwZSk7CiAJLyogRGlzcGF0Y2ggKi8KQEAgLTE4MDgsNyArMTgwOSw3IEBACiAgKiBDYWxsIGNvbnRleHQ6CiAgKglpbnRlcnJ1cHQKICAqLwotdm9pZCBwcmlzbTJzdGFfZXZfdHhleGMod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MTYgc3RhdHVzKQordm9pZCBwcmlzbTJzdGFfZXZfdHhleGMoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHUxNiBzdGF0dXMpCiB7CiAJcHJfZGVidWcoIlR4RXhjIHN0YXR1cz0weCV4LlxuIiwgc3RhdHVzKTsKIH0KQEAgLTE4MjksNyArMTgzMCw3IEBACiAgKiBDYWxsIGNvbnRleHQ6CiAgKglpbnRlcnJ1cHQKICAqLwotdm9pZCBwcmlzbTJzdGFfZXZfdHgod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MTYgc3RhdHVzKQordm9pZCBwcmlzbTJzdGFfZXZfdHgoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHUxNiBzdGF0dXMpCiB7CiAJcHJfZGVidWcoIlR4IENvbXBsZXRlLCBzdGF0dXM9MHglMDR4XG4iLCBzdGF0dXMpOwogCS8qIHVwZGF0ZSBsaW51eCBuZXR3b3JrIHN0YXRzICovCkBAIC0xODUyLDcgKzE4NTMsNyBAQAogICogQ2FsbCBjb250ZXh0OgogICoJaW50ZXJydXB0CiAgKi8KLXZvaWQgcHJpc20yc3RhX2V2X2FsbG9jKHdsYW5kZXZpY2VfdCAqd2xhbmRldikKK3ZvaWQgcHJpc20yc3RhX2V2X2FsbG9jKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KQogewogCW5ldGlmX3dha2VfcXVldWUod2xhbmRldi0+bmV0ZGV2KTsKIH0KQEAgLTE4NjAsMTQgKzE4NjEsMTQgQEAKIC8qCiAqIGNyZWF0ZV93bGFuCiAqCi0qIENhbGxlZCBhdCBtb2R1bGUgaW5pdCB0aW1lLiAgVGhpcyBjcmVhdGVzIHRoZSB3bGFuZGV2aWNlX3Qgc3RydWN0dXJlCisqIENhbGxlZCBhdCBtb2R1bGUgaW5pdCB0aW1lLiAgVGhpcyBjcmVhdGVzIHRoZSBzdHJ1Y3Qgd2xhbmRldmljZSBzdHJ1Y3R1cmUKICogYW5kIGluaXRpYWxpemVzIGl0IHdpdGggcmVsZXZhbnQgYml0cy4KICoKICogQXJndW1lbnRzOgogKglub25lCiAqCiAqIFJldHVybnM6Ci0qCXRoZSBjcmVhdGVkIHdsYW5kZXZpY2VfdCBzdHJ1Y3R1cmUuCisqCXRoZSBjcmVhdGVkIHN0cnVjdCB3bGFuZGV2aWNlIHN0cnVjdHVyZS4KICoKICogU2lkZSBlZmZlY3RzOgogKglhbHNvIGFsbG9jYXRlcyB0aGUgcHJpdi9odyBzdHJ1Y3R1cmVzLgpAQCAtMTg3NiwxNCArMTg3NywxNCBAQAogKglwcm9jZXNzIHRocmVhZAogKgogKi8KLXN0YXRpYyB3bGFuZGV2aWNlX3QgKmNyZWF0ZV93bGFuKHZvaWQpCitzdGF0aWMgc3RydWN0IHdsYW5kZXZpY2UgKmNyZWF0ZV93bGFuKHZvaWQpCiB7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gTlVMTDsKLQloZmEzODR4X3QgKmh3ID0gTlVMTDsKKwlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiA9IE5VTEw7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gTlVMTDsKIAogCS8qIEFsbG9jIG91ciBzdHJ1Y3R1cmVzICovCi0Jd2xhbmRldiA9IGt6YWxsb2Moc2l6ZW9mKHdsYW5kZXZpY2VfdCksIEdGUF9LRVJORUwpOwotCWh3ID0ga3phbGxvYyhzaXplb2YoaGZhMzg0eF90KSwgR0ZQX0tFUk5FTCk7CisJd2xhbmRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3bGFuZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaHcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaGZhMzg0eCksIEdGUF9LRVJORUwpOwogCiAJaWYgKCF3bGFuZGV2IHx8ICFodykgewogCQlrZnJlZSh3bGFuZGV2KTsKQEAgLTE5MTMsMTEgKzE5MTQsMTEgQEAKIAogdm9pZCBwcmlzbTJzdGFfY29tbXNxdWFsX2RlZmVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSkKIHsKLQloZmEzODR4X3QgKmh3ID0gY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBoZmEzODR4LCBjb21tc3F1YWxfYmgpOwotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IGh3LT53bGFuZGV2OwotCWhmYTM4NHhfYnl0ZXN0cjMyX3Qgc3NpZDsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGhmYTM4NHgsIGNvbW1zcXVhbF9iaCk7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSBody0+d2xhbmRldjsKKwlzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyMzIgc3NpZDsKIAlzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYmdldCBtc2c7Ci0JcDgwMjExaXRlbV91aW50MzJfdCAqbWliaXRlbSA9IChwODAyMTFpdGVtX3VpbnQzMl90ICopCisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyICptaWJpdGVtID0gKHN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiAqKQogCQkJCQkJJm1zZy5taWJhdHRyaWJ1dGUuZGF0YTsKIAlpbnQgcmVzdWx0ID0gMDsKIApAQCAtMTk1MCw3ICsxOTUxLDcgQEAKIAkvKiBHZXQgdGhlIHNpZ25hbCByYXRlICovCiAJbXNnLm1zZ2NvZGUgPSBESURtc2dfZG90MTFyZXFfbWliZ2V0OwogCW1pYml0ZW0tPmRpZCA9IERJRG1pYl9wMl9wMk1BQ19wMkN1cnJlbnRUeFJhdGU7Ci0JcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTggKikgJm1zZyk7CisJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTggKikmbXNnKTsKIAogCWlmIChyZXN1bHQpIHsKIAkJcHJfZGVidWcoImdldCBzaWduYWwgcmF0ZSBmYWlsZWQsIHJlc3VsdCA9ICVkXG4iLApAQCAtMTk5Myw4ICsxOTk0LDggQEAKIAkJCSBIRkEzODR4X1JJRF9DVVJSRU5UU1NJRCwgcmVzdWx0KTsKIAkJcmV0dXJuOwogCX0KLQlwcmlzbTJtZ210X2J5dGVzdHIycHN0cigoc3RydWN0IGhmYTM4NHhfYnl0ZXN0ciAqKSAmc3NpZCwKLQkJCQkocDgwMjExcHN0cmRfdCAqKSAmd2xhbmRldi0+c3NpZCk7CisJcHJpc20ybWdtdF9ieXRlc3RyMnBzdHIoKHN0cnVjdCBoZmEzODR4X2J5dGVzdHIgKikmc3NpZCwKKwkJCQkoc3RydWN0IHA4MDIxMXBzdHJkICopJndsYW5kZXYtPnNzaWQpOwogCiAJLyogUmVzY2hlZHVsZSB0aW1lciAqLwogCW1vZF90aW1lcigmaHctPmNvbW1zcXVhbF90aW1lciwgamlmZmllcyArIEhaKTsKQEAgLTIwMDIsNyArMjAwMyw3IEBACiAKIHZvaWQgcHJpc20yc3RhX2NvbW1zcXVhbF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0JaGZhMzg0eF90ICpodyA9IChoZmEzODR4X3QgKikgZGF0YTsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSAoc3RydWN0IGhmYTM4NHggKilkYXRhOwogCiAJc2NoZWR1bGVfd29yaygmaHctPmNvbW1zcXVhbF9iaCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJ1c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMnVzYi5jCmluZGV4IGIyNmQwOWYuLmJmYjZiMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMnVzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMnVzYi5jCkBAIC00NywxMSArNDcsMTEgQEAKIAlQUklTTV9ERVYoMHgwYmIyLCAweDAzMDIsICJBbWJpdCBNaWNyb3N5c3RlbXMgQ29ycC4iKSwKIAlQUklTTV9ERVYoMHg5MDE2LCAweDE4MmQsICJTaXRlY29tIFdMLTAyMiA4MDIuMTFiIFVTQiBBZGFwdGVyIiksCiAJUFJJU01fREVWKDB4MDU0MywgMHgwZjAxLAotCQkiVmlld1NvbmljIEFpcnN5bmMgVVNCIEFkYXB0ZXIgMTFNYnBzIChQcmlzbTIuNSkiKSwKKwkJICAiVmlld1NvbmljIEFpcnN5bmMgVVNCIEFkYXB0ZXIgMTFNYnBzIChQcmlzbTIuNSkiKSwKIAlQUklTTV9ERVYoMHgwNjdjLCAweDEwMjIsCi0JCSJTaWVtZW5zIFNwZWVkU3RyZWFtIDEwMjIgMTFNYnBzIFdMQU4gVVNCIEFkYXB0ZXIiKSwKKwkJICAiU2llbWVucyBTcGVlZFN0cmVhbSAxMDIyIDExTWJwcyBXTEFOIFVTQiBBZGFwdGVyIiksCiAJUFJJU01fREVWKDB4MDQ5ZiwgMHgwMDMzLAotCQkiQ29tcGFxL0ludGVsIFcxMDAgUFJPL1dpcmVsZXNzIDExTWJwcyBtdWx0aXBvcnQgV0xBTiBBZGFwdGVyIiksCisJCSAgIkNvbXBhcS9JbnRlbCBXMTAwIFBSTy9XaXJlbGVzcyAxMU1icHMgbXVsdGlwb3J0IFdMQU4gQWRhcHRlciIpLAogCXsgfSAvKiB0ZXJtaW5hdG9yICovCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHVzYl9wcmlzbV90YmwpOwpAQCAtNjEsOCArNjEsOCBAQAogewogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXY7CiAKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBOVUxMOwotCWhmYTM4NHhfdCAqaHcgPSBOVUxMOworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSBOVUxMOwogCWludCByZXN1bHQgPSAwOwogCiAJZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpOwpAQCAtNzQsNyArNzQsNyBAQAogCX0KIAlodyA9IHdsYW5kZXYtPnByaXY7CiAKLQlpZiAod2xhbl9zZXR1cCh3bGFuZGV2LCAmKGludGVyZmFjZS0+ZGV2KSkgIT0gMCkgeworCWlmICh3bGFuX3NldHVwKHdsYW5kZXYsICZpbnRlcmZhY2UtPmRldikgIT0gMCkgewogCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIndsYW5fc2V0dXAoKSBmYWlsZWQuXG4iKTsKIAkJcmVzdWx0ID0gLUVJTzsKIAkJZ290byBmYWlsZWQ7CkBAIC04Nyw3ICs4Nyw3IEBACiAJLyogUmVnaXN0ZXIgdGhlIHdsYW5kZXYsIHRoaXMgZ2V0cyB1cyBhIG5hbWUgYW5kIHJlZ2lzdGVycyB0aGUKIAkgKiBsaW51eCBuZXRkZXZpY2UuCiAJICovCi0JU0VUX05FVERFVl9ERVYod2xhbmRldi0+bmV0ZGV2LCAmKGludGVyZmFjZS0+ZGV2KSk7CisJU0VUX05FVERFVl9ERVYod2xhbmRldi0+bmV0ZGV2LCAmaW50ZXJmYWNlLT5kZXYpOwogCiAJLyogRG8gYSBjaGlwLWxldmVsIHJlc2V0IG9uIHRoZSBNQUMgKi8KIAlpZiAocHJpc20yX2RvcmVzZXQpIHsKQEAgLTEzNCwxNSArMTM0LDE1IEBACiAKIHN0YXRpYyB2b2lkIHByaXNtMnN0YV9kaXNjb25uZWN0X3VzYihzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQogewotCXdsYW5kZXZpY2VfdCAqd2xhbmRldjsKKwlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldjsKIAotCXdsYW5kZXYgPSAod2xhbmRldmljZV90ICopdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOwotCWlmICh3bGFuZGV2ICE9IE5VTEwpIHsKKwl3bGFuZGV2ID0gKHN0cnVjdCB3bGFuZGV2aWNlICopdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCWlmICh3bGFuZGV2KSB7CiAJCUxJU1RfSEVBRChjbGVhbmxpc3QpOwotCQloZmEzODR4X3VzYmN0bHhfdCAqY3RseCwgKnRlbXA7CisJCXN0cnVjdCBoZmEzODR4X3VzYmN0bHggKmN0bHgsICp0ZW1wOwogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCQlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCiAJCWlmICghaHcpCiAJCQlnb3RvIGV4aXQ7CkBAIC0yMTYsMTIgKzIxNiwxMiBAQAogCiAjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IHByaXNtMnN0YV9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCi0JCQkJcG1fbWVzc2FnZV90IG1lc3NhZ2UpCisJCQkgICAgIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQogewotCWhmYTM4NHhfdCAqaHcgPSBOVUxMOwotCXdsYW5kZXZpY2VfdCAqd2xhbmRldjsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSBOVUxMOworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2OwogCi0Jd2xhbmRldiA9ICh3bGFuZGV2aWNlX3QgKil1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisJd2xhbmRldiA9IChzdHJ1Y3Qgd2xhbmRldmljZSAqKXVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKIAlpZiAoIXdsYW5kZXYpCiAJCXJldHVybiAtRU5PREVWOwogCkBAIC0yNDEsMTAgKzI0MSwxMCBAQAogc3RhdGljIGludCBwcmlzbTJzdGFfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCiB7CiAJaW50IHJlc3VsdCA9IDA7Ci0JaGZhMzg0eF90ICpodyA9IE5VTEw7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IE5VTEw7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXY7CiAKLQl3bGFuZGV2ID0gKHdsYW5kZXZpY2VfdCAqKXVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKKwl3bGFuZGV2ID0gKHN0cnVjdCB3bGFuZGV2aWNlICopdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOwogCWlmICghd2xhbmRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0lfbWFpbl8yNi5jIGIvZHJpdmVycy9zdGFnaW5nL3hnaWZiL1hHSV9tYWluXzI2LmMKaW5kZXggZDU2ZWYxNC4uMGM3ODQ5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL1hHSV9tYWluXzI2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3hnaWZiL1hHSV9tYWluXzI2LmMKQEAgLTYyLDcgKzYyLDYgQEAKIAl1bnNpZ25lZCBzaG9ydCBNb2RlTm8gPSBtb2Rlbm87CiAJdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXggPSAwLCBDbG9ja0luZGV4ID0gMDsKIAl1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXggPSAwOwotCWludCBDbG9jazsKIAogCUluaXRUbzMzMFBvaW50ZXIoSHdEZXZpY2VFeHRlbnNpb24tPmpDaGlwVHlwZSwgWEdJX1ByKTsKIApAQCAtNzMsOSArNzIsNyBAQAogCiAJQ2xvY2tJbmRleCA9IFhHSTMzMF9SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9DUlRWQ0xLOwogCi0JQ2xvY2sgPSBYR0lfVkNMS0RhdGFbQ2xvY2tJbmRleF0uQ0xPQ0sgKiAxMDAwOwotCi0JcmV0dXJuIENsb2NrOworCXJldHVybiBYR0lfVkNMS0RhdGFbQ2xvY2tJbmRleF0uQ0xPQ0sgKiAxMDAwOwogfQogCiBzdGF0aWMgaW50IFhHSWZiX21vZGVfcmF0ZV90b19kZGF0YShzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKlhHSV9QciwKQEAgLTEyMjcsNyArMTIyNCw3IEBACiAJdW5zaWduZWQgaW50IHZ0b3RhbCA9IDA7CiAJdW5zaWduZWQgaW50IGRyYXRlID0gMCwgaHJhdGUgPSAwOwogCWludCBmb3VuZF9tb2RlID0gMDsKLQlpbnQgcmVmcmVzaF9yYXRlLCBzZWFyY2hfaWR4OworCWludCBzZWFyY2hfaWR4OwogCiAJaWYgKCh2YXItPnZtb2RlICYgRkJfVk1PREVfTUFTSykgPT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRCkgewogCQl2dG90YWwgPSB2YXItPnVwcGVyX21hcmdpbiArIHZhci0+eXJlcyArIHZhci0+bG93ZXJfbWFyZ2luCkBAIC0xMjYzLDEwICsxMjYwLDYgQEAKIAkJeGdpZmJfaW5mby0+cmVmcmVzaF9yYXRlID0gNjA7CiAJfQogCi0JLyogQ2FsY3VsYXRpb24gd3JvbmcgZm9yIDEwMjR4NjAwIC0gZm9yY2UgaXQgdG8gNjBIeiAqLwotCWlmICgodmFyLT54cmVzID09IDEwMjQpICYmICh2YXItPnlyZXMgPT0gNjAwKSkKLQkJcmVmcmVzaF9yYXRlID0gNjA7Ci0KIAlzZWFyY2hfaWR4ID0gMDsKIAl3aGlsZSAoKFhHSWJpb3NfbW9kZVtzZWFyY2hfaWR4XS5tb2RlX25vICE9IDApICYmCiAJCShYR0liaW9zX21vZGVbc2VhcmNoX2lkeF0ueHJlcyA8PSB2YXItPnhyZXMpKSB7CkBAIC0yMDg1LDcgKzIwNzgsNyBAQAogewogCWNoYXIgKm9wdGlvbiA9IE5VTEw7CiAKLQlpZiAoZm9yY2VjcnQydHlwZSAhPSBOVUxMKQorCWlmIChmb3JjZWNydDJ0eXBlKQogCQlYR0lmYl9zZWFyY2hfY3J0MnR5cGUoZm9yY2VjcnQydHlwZSk7CiAJaWYgKGZiX2dldF9vcHRpb25zKCJ4Z2lmYiIsICZvcHRpb24pKQogCQlyZXR1cm4gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl9zZXRtb2RlLmMgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfc2V0bW9kZS5jCmluZGV4IDUwYzhlYTQuLmQ4MDEwYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl9zZXRtb2RlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX3NldG1vZGUuYwpAQCAtMjE0LDcgKzIxNCw3IEBACiAJCWlmICghKHBWQkluZm8tPlZCSW5mbyAmIFRWU2V0UEFMKSAmJgogCQkgICAgKG1vZGVmbGFnICYgTm9TdXBwb3J0U2ltdVRWKSAmJgogCQkgICAgKHBWQkluZm8tPlZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSAmJgotCQkgICAgKCEocFZCSW5mby0+VkJJbmZvICYgU2V0Tm90U2ltdU1vZGUpKSkKKwkJICAgICEocFZCSW5mby0+VkJJbmZvICYgU2V0Tm90U2ltdU1vZGUpKQogCQkJcmV0dXJuIDA7CiAJfQogCkBAIC0xNjQ3LDcgKzE2NDcsNiBAQAogc3RhdGljIHVuc2lnbmVkIGNoYXIgWEdJX0dldFZDTEtQdHIodW5zaWduZWQgc2hvcnQgUmVmcmVzaFJhdGVUYWJsZUluZGV4LAogCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotCiAJdW5zaWduZWQgc2hvcnQgaW5kZXgsIG1vZGVmbGFnOwogCXVuc2lnbmVkIGNoYXIgdGVtcGFsOwogCkBAIC0xNjU1LDcgKzE2NTQsNyBAQAogCW1vZGVmbGFnID0gWEdJMzMwX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uRXh0X01vZGVGbGFnOwogCiAJaWYgKChwVkJJbmZvLT5TZXRGbGFnICYgUHJvZ3JhbW1pbmdDUlQyKSAmJgotCSAgICAoIShwVkJJbmZvLT5MQ0RJbmZvICYgRW5hYmxlU2NhbGluZ0xDRCkpKSB7IC8qIHtMQ0RBL0xDREJ9ICovCisJICAgICEocFZCSW5mby0+TENESW5mbyAmIEVuYWJsZVNjYWxpbmdMQ0QpKSB7IC8qIHtMQ0RBL0xDREJ9ICovCiAJCWluZGV4ID0gWEdJX0dldExDRENhcFB0cihwVkJJbmZvKTsKIAkJdGVtcGFsID0gcFZCSW5mby0+TENEQ2FwTGlzdFtpbmRleF0uTENEX1ZDTEs7CiAKQEAgLTE2NzgsNyArMTY3Nyw2IEBACiAJCQkJCWlmICghKG1vZGVmbGFnICYgQ2hhcng4RG90KSkKIAkJCQkJCXRlbXBhbCA9IFRWQ0xLQkFTRV8zMTUgKwogCQkJCQkJCQlIaVRWVGV4dFZDTEs7Ci0KIAkJCQl9CiAJCQkJcmV0dXJuIHRlbXBhbDsKIAkJCX0KQEAgLTE3MTYsNyArMTcxNCw3IEBACiB7CiAJaWYgKHBWQkluZm8tPlZCVHlwZSAmIChWQl9TSVMzMDEgfCBWQl9TSVMzMDFCIHwgVkJfU0lTMzAyQgogCQkJfCBWQl9TSVMzMDFMViB8IFZCX1NJUzMwMkxWIHwgVkJfWEdJMzAxQykpIHsKLQkJaWYgKCghKHBWQkluZm8tPlZCSW5mbyAmIFhHSV9TZXRDUlQyVG9MQ0RBKSkgJiYKKwkJaWYgKCEocFZCSW5mby0+VkJJbmZvICYgWEdJX1NldENSVDJUb0xDREEpICYmCiAJCSAgICAocFZCSW5mby0+U2V0RmxhZyAmIFByb2dyYW1taW5nQ1JUMikpIHsKIAkJCSpkaV8wID0gWEdJX1ZCVkNMS0RhdGFbdGVtcGFsXS5QYXJ0NF9BOwogCQkJKmRpXzEgPSBYR0lfVkJWQ0xLRGF0YVt0ZW1wYWxdLlBhcnQ0X0I7CkBAIC0xNzQxLDggKzE3MzksOCBAQAogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKIAkJeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QM2Q0LCAweDMxLCB+MHgzMCwKIAkJCQkodW5zaWduZWQgc2hvcnQpICgweDEwICogaSkpOwotCQlpZiAoKCEocFZCSW5mby0+VkJJbmZvICYgWEdJX1NldENSVDJUb0xDREEpKQotCQkJCSYmICghKHBWQkluZm8tPlZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSkpIHsKKwkJaWYgKCEocFZCSW5mby0+VkJJbmZvICYgWEdJX1NldENSVDJUb0xDREEpICYmCisJCSAgICAhKHBWQkluZm8tPlZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSkgewogCQkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2M0LCAweDJlLCBkaV8wKTsKIAkJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNjNCwgMHgyZiwgZGlfMSk7CiAJCX0gZWxzZSB7CkBAIC0xOTE1LDcgKzE5MTMsNyBAQAogCQl9CiAJfQogCi0JaWYgKHBWQkluZm8tPlZCVHlwZSAmIChWQl9TSVMzMDFMVnxWQl9TSVMzMDJMVnxWQl9YR0kzMDFDKSkgeworCWlmIChwVkJJbmZvLT5WQlR5cGUgJiAoVkJfU0lTMzAxTFYgfCBWQl9TSVMzMDJMViB8IFZCX1hHSTMwMUMpKSB7CiAJCWlmICh0ZW1wICYgU2V0WVBiUHIpIHsKIAkJCS8qIHNoYW1wb28gYWRkIGZvciBuZXcgc2NyYXRjaCAqLwogCQkJdGVtcCA9IHhnaWZiX3JlZ19nZXQocFZCSW5mby0+UDNkNCwgMHgzNSk7CkBAIC0xOTg2LDcgKzE5ODQsNyBAQAogCX0KIAogCWlmICghKHRlbXBieCAmIERpc2FibGVDUlQyRGlzcGxheSkpIHsKLQkJaWYgKCghKHRlbXBieCAmIERyaXZlck1vZGUpKSB8fCAoIShtb2RlZmxhZyAmIENSVDJNb2RlKSkpIHsKKwkJaWYgKCEodGVtcGJ4ICYgRHJpdmVyTW9kZSkgfHwgIShtb2RlZmxhZyAmIENSVDJNb2RlKSkgewogCQkJaWYgKCEodGVtcGJ4ICYgWEdJX1NldENSVDJUb0xDREEpKQogCQkJCXRlbXBieCB8PSAoU2V0SW5TbGF2ZU1vZGUgfCBTZXRTaW11U2Nhbk1vZGUpOwogCQl9CkBAIC0yMTMyLDcgKzIxMzAsNyBAQAogCiAJaWYgKChwVkJJbmZvLT5MQ0RSZXNJbmZvID09IFBhbmVsXzE0MDB4MTA1MCkgJiYKIAkgICAgKHBWQkluZm8tPlZCSW5mbyAmIFNldENSVDJUb0xDRCkgJiYgKHJlc2luZm8gPT0gOSkgJiYKLQkgICAgKCEodGVtcGJ4ICYgRW5hYmxlU2NhbGluZ0xDRCkpKQorCSAgICAhKHRlbXBieCAmIEVuYWJsZVNjYWxpbmdMQ0QpKQogCQkvKgogCQkgKiBzZXQgdG8gY2VudGVyIGluIDEyODB4MTAyNCBMQ0RCCiAJCSAqIGZvciBQYW5lbF8xNDAweDEwNTAKQEAgLTIyNDUsNyArMjI0Myw2IEBACiAKIAkJLyogQ1IgQjRbMV0gKi8KIAkJeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QM2Q0LCAweEI0LCB+MHgwMiwgdGVtcCk7Ci0KIAl9CiAKIAl0ZW1wID0geGdpZmJfcmVnX2dldChwVkJJbmZvLT5QM2Q0LCAweDQ4KTsKQEAgLTIyNzQsNyArMjI3MSw2IEBACiAKIAkJLyogQ1IgQjRbMV0gKi8KIAkJeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QM2Q0LCAweEI0LCB+MHgwMiwgdGVtcCk7Ci0KIAl9CiAJeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QM2Q0LCAweEI0LCB+dGVtcGJoMCwgdGVtcGJsMCk7CiAKQEAgLTIyOTEsNyArMjI4Nyw2IEBACiAJCXN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKnBYR0lIV0RFLAogCQlzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0KIAl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzYzQsIDB4MDEsIDB4REYsIDB4MDApOwogCWlmIChwWEdJSFdERS0+akNoaXBUeXBlID09IFhHMjEpIHsKIAkJaWYgKHBWQkluZm8tPklGX0RFRl9MVkRTID09IDEpIHsKQEAgLTIzMTAsNyArMjMwNSw2IEBACiAJCQkvKiBEVk8vRFZJIHNpZ25hbCBvbiAqLwogCQkJWEdJX1hHMjFCTFNpZ25hbFZERCgweDIwLCAweDIwLCBwVkJJbmZvKTsKIAkJfQotCiAJfQogCiAJaWYgKHBYR0lIV0RFLT5qQ2hpcFR5cGUgPT0gWEcyNykgewpAQCAtMjMzMCw3ICsyMzI0LDYgQEAKIAkJCS8qIERWTy9EVkkgc2lnbmFsIG9uICovCiAJCQlYR0lfWEcyN0JMU2lnbmFsVkREKDB4MjAsIDB4MjAsIHBWQkluZm8pOwogCQl9Ci0KIAl9CiB9CiAKQEAgLTIzMzgsNyArMjMzMSw2IEBACiAJCXN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKnBYR0lIV0RFLAogCQlzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0KIAlpZiAocFhHSUhXREUtPmpDaGlwVHlwZSA9PSBYRzIxKSB7CiAJCWlmIChwVkJJbmZvLT5JRl9ERUZfTFZEUyA9PSAxKSB7CiAJCQkvKiBMVkRTIGJhY2tsaWdodCBvZmYgKi8KQEAgLTI0NTUsNyArMjQ0Nyw2IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIFhHSV9Jc0xDRER1YWxMaW5rKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLQogCWlmICgocFZCSW5mby0+VkJJbmZvICYgKFNldENSVDJUb0xDRCB8IFhHSV9TZXRDUlQyVG9MQ0RBKSkgJiYKIAkJCShwVkJJbmZvLT5MQ0RJbmZvICYgU2V0TENERHVhbExpbmspKSAvKiBzaGFtcG9vMDEyOSAqLwogCQlyZXR1cm4gMTsKQEAgLTM5MjIsNyArMzkxMyw3IEBACiAJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UGFydDJQb3J0LCBpLCBUYXA0VGltaW5nUHRyLT5SZWdbal0pOwogCiAJaWYgKChwVkJJbmZvLT5WQkluZm8gJiBTZXRDUlQyVG9UVikgJiYKLQkgICAgKCEocFZCSW5mby0+VkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pKSkgeworCSAgICAhKHBWQkluZm8tPlZCSW5mbyAmIFNldENSVDJUb0hpVmlzaW9uKSkgewogCQkvKiBTZXQgVmVydGljYWwgU2NhbGluZyAqLwogCQlUYXA0VGltaW5nUHRyID0gWEdJX0dldFRhcDRQdHIoMSwgcFZCSW5mbyk7CiAJCWZvciAoaSA9IDB4QzAsIGogPSAwOyBpIDwgMHhGRjsgaSsrLCBqKyspCkBAIC0zOTMyLDcgKzM5MjMsNyBAQAogCX0KIAogCWlmICgocFZCSW5mby0+VkJJbmZvICYgU2V0Q1JUMlRvVFYpICYmCi0JICAgICghKHBWQkluZm8tPlZCSW5mbyAmIFNldENSVDJUb0hpVmlzaW9uKSkpCisJICAgICEocFZCSW5mby0+VkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pKQogCQkvKiBFbmFibGUgVi5TY2FsaW5nICovCiAJCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UGFydDJQb3J0LCAweDRFLCB+MHgxNCwgMHgwNCk7CiAJZWxzZQpAQCAtNDEzMiw3ICs0MTIzLDYgQEAKIAkJaWYgKHBWQkluZm8tPlZCSW5mbyAmIChTZXRDUlQyVG9UViB8IFNldENSVDJUb0hpVmlzaW9uKSkgewogCQkJaWYgKHBWQkluZm8tPlZHQUhERSA+IDgwMCkKIAkJCQl4Z2lmYl9yZWdfb3IocFZCSW5mby0+UGFydDRQb3J0LCAweDFFLCAweDA4KTsKLQogCQl9CiAJCXRlbXAgPSAweDAwMzY7CiAKQEAgLTQxNDEsOSArNDEzMSw5IEBACiAJCQkJCXwgVFZTZXRZUGJQcjUyNXAgfCBUVlNldFlQYlByNzUwcAogCQkJCQl8IFRWU2V0SGlWaXNpb24pKSkgewogCQkJCXRlbXAgfD0gMHgwMDAxOwotCQkJCWlmICgocFZCSW5mby0+VkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpCi0JCQkJCQkmJiAoIShwVkJJbmZvLT5UVkluZm8KLQkJCQkJCQkJJiBUVlNpbXVNb2RlKSkpCisJCQkJaWYgKChwVkJJbmZvLT5WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgJiYKKwkJCQkJCSEocFZCSW5mby0+VFZJbmZvCisJCQkJCQkJCSYgVFZTaW11TW9kZSkpCiAJCQkJCXRlbXAgJj0gKH4weDAwMDEpOwogCQkJfQogCQl9CkBAIC00Mzg5LDcgKzQzNzksNiBAQAogCQkJCQkodmFsdWUgPDwgMikgJiAweDdDKTsKIAogCWZvciAodGVtcCA9IDAsIHZhbHVlID0gMDsgdGVtcCA8IDM7IHRlbXArKykgewotCiAJCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UDNjNCwgMHgzMSwgfjB4MzAsIHZhbHVlKTsKIAkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2M0LAogCQkJICAgICAgMHgyQiwgeGdpZmJfaW5mby0+bHZkc19kYXRhLlZDTEtEYXRhMSk7CkBAIC00NDA5LDcgKzQzOTgsNiBAQAogCiAJCWluYihwVkJJbmZvLT5QM2RhKTsgLyogcmVzZXQgM2RhICovCiAJfQotCiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNDQ3Niw3ICs0NDY0LDcgQEAKIAogCQlpZiAoKHBWQkluZm8tPlZCSW5mbyAmCiAJCQkoRGlzYWJsZUNSVDJEaXNwbGF5IHwgU2V0U2ltdVNjYW5Nb2RlKSkgfHwKLQkJICAgICgoIShwVkJJbmZvLT5WQkluZm8gJiBYR0lfU2V0Q1JUMlRvTENEQSkpICYmCisJCSAgICAoIShwVkJJbmZvLT5WQkluZm8gJiBYR0lfU2V0Q1JUMlRvTENEQSkgJiYKIAkJICAgIChwVkJJbmZvLT5WQkluZm8gJgogCQkJKFNldENSVDJUb1JBTURBQyB8IFNldENSVDJUb0xDRCB8IFNldENSVDJUb1RWKSkpKQogCQkJeGdpZmJfcmVnX29yKHBWQkluZm8tPlBhcnQxUG9ydCwgMHgwMCwgMHg4MCk7CkBAIC00NTg3LDcgKzQ1NzUsNyBAQAogCiAJaWYgKHBWQkluZm8tPlZCVHlwZSAmIChWQl9TSVMzMDFCIHwgVkJfU0lTMzAyQiB8IFZCX1NJUzMwMUxWCiAJCQl8IFZCX1NJUzMwMkxWIHwgVkJfWEdJMzAxQykpIHsKLQkJaWYgKCghKHBWQkluZm8tPlZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSkgfHwgKHBWQkluZm8tPlRWSW5mbworCQlpZiAoIShwVkJJbmZvLT5WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkgfHwgKHBWQkluZm8tPlRWSW5mbwogCQkJCSYgVFZTaW11TW9kZSkpIHsKIAkJCSp0ZW1wYnggKz0gODsKIAkJCSp0ZW1wY2wgKz0gMTsKQEAgLTQ5ODgsOCArNDk3Niw4IEBACiAJaWYgKHBWQkluZm8tPlZCSW5mbyAmIChTZXRDUlQyVG9SQU1EQUMgfCBTZXRDUlQyVG9UViB8IFNldENSVDJUb0xDRAogCQkJfCBYR0lfU2V0Q1JUMlRvTENEQSkpIHsKIAkJdGVtcGFoICY9ICh+MHgwOCk7Ci0JCWlmICgocFZCSW5mby0+TW9kZVR5cGUgPT0gTW9kZVZHQSkgJiYgKCEocFZCSW5mby0+VkJJbmZvCi0JCQkJJiBTZXRJblNsYXZlTW9kZSkpKSB7CisJCWlmICgocFZCSW5mby0+TW9kZVR5cGUgPT0gTW9kZVZHQSkgJiYgIShwVkJJbmZvLT5WQkluZm8KKwkJCQkmIFNldEluU2xhdmVNb2RlKSkgewogCQkJdGVtcGFoIHw9IDB4MDEwOwogCQl9CiAJCXRlbXBhaCB8PSAweDA4MDsKQEAgLTU0MTYsNyArNTQwNCw2IEBACiAJaWYgKEh3RGV2aWNlRXh0ZW5zaW9uLT5qQ2hpcFR5cGUgPj0gWEcyMSkgewogCQl0ZW1wID0geGdpZmJfcmVnX2dldChwVkJJbmZvLT5QM2Q0LCAweDM4KTsKIAkJaWYgKHRlbXAgJiAweEEwKSB7Ci0KIAkJCWlmIChId0RldmljZUV4dGVuc2lvbi0+akNoaXBUeXBlID09IFhHMjcpCiAJCQkJWEdJX1NldFhHMjdDUlRDKFJlZnJlc2hSYXRlVGFibGVJbmRleCwgcFZCSW5mbyk7CiAJCQllbHNlCkBAIC01NDg2LDcgKzU0NzMsNyBAQAogCQlYR0lfRGlzYWJsZUJyaWRnZSh4Z2lmYl9pbmZvLCBId0RldmljZUV4dGVuc2lvbiwgcFZCSW5mbyk7CiAKIAkJaWYgKHBWQkluZm8tPlZCSW5mbyAmIChTZXRTaW11U2Nhbk1vZGUgfCBYR0lfU2V0Q1JUMlRvTENEQSkgfHwKLQkJCSghKHBWQkluZm8tPlZCSW5mbyAmIFN3aXRjaENSVDIpKSkgeworCQkJIShwVkJJbmZvLT5WQkluZm8gJiBTd2l0Y2hDUlQyKSkgewogCQkJWEdJX1NldENSVDFHcm91cCh4Z2lmYl9pbmZvLCBId0RldmljZUV4dGVuc2lvbiwgTW9kZU5vLAogCQkJCQlNb2RlSWRJbmRleCwgcFZCSW5mbyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2N4Z2JpdC9jeGdiaXRfY20uYyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2N4Z2JpdC9jeGdiaXRfY20uYwppbmRleCAwYWUwYjEzLi4yZmIxYmYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9jeGdiaXQvY3hnYml0X2NtLmMKKysrIGIvZHJpdmVycy90YXJnZXQvaXNjc2kvY3hnYml0L2N4Z2JpdF9jbS5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bmV0L2lwNl9yb3V0ZS5oPgogI2luY2x1ZGUgPG5ldC9hZGRyY29uZi5oPgogCisjaW5jbHVkZSA8bGliY3hnYl9jbS5oPgogI2luY2x1ZGUgImN4Z2JpdC5oIgogI2luY2x1ZGUgImNsaXBfdGJsLmgiCiAKQEAgLTcyLDE1ICs3Myw2IEBACiAJcmV0dXJuIHdyX3dhaXRwLT5yZXQ7CiB9CiAKLS8qIFJldHVybnMgd2hldGhlciBhIENQTCBzdGF0dXMgY29udmV5cyBuZWdhdGl2ZSBhZHZpY2UuCi0gKi8KLXN0YXRpYyBpbnQgY3hnYml0X2lzX25lZ19hZHYodW5zaWduZWQgaW50IHN0YXR1cykKLXsKLQlyZXR1cm4gc3RhdHVzID09IENQTF9FUlJfUlRYX05FR19BRFZJQ0UgfHwKLQkJc3RhdHVzID09IENQTF9FUlJfUEVSU0lTVF9ORUdfQURWSUNFIHx8Ci0JCXN0YXR1cyA9PSBDUExfRVJSX0tFRVBBTFZfTkVHX0FEVklDRTsKLX0KLQogc3RhdGljIGludCBjeGdiaXRfbnBfaGFzaGZuKGNvbnN0IHN0cnVjdCBjeGdiaXRfbnAgKmNucCkKIHsKIAlyZXR1cm4gKCh1bnNpZ25lZCBsb25nKWNucCA+PiAxMCkgJiAoTlBfSU5GT19IQVNIX1NJWkUgLSAxKTsKQEAgLTYyMywyMSArNjE1LDE0IEBACiBzdGF0aWMgdm9pZCBjeGdiaXRfc2VuZF9oYWxmY2xvc2Uoc3RydWN0IGN4Z2JpdF9zb2NrICpjc2spCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgY3BsX2Nsb3NlX2Nvbl9yZXEgKnJlcTsKLQl1bnNpZ25lZCBpbnQgbGVuID0gcm91bmR1cChzaXplb2Yoc3RydWN0IGNwbF9jbG9zZV9jb25fcmVxKSwgMTYpOworCXUzMiBsZW4gPSByb3VuZHVwKHNpemVvZihzdHJ1Y3QgY3BsX2Nsb3NlX2Nvbl9yZXEpLCAxNik7CiAKIAlza2IgPSBhbGxvY19za2IobGVuLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXNrYikKIAkJcmV0dXJuOwogCi0JcmVxID0gKHN0cnVjdCBjcGxfY2xvc2VfY29uX3JlcSAqKV9fc2tiX3B1dChza2IsIGxlbik7Ci0JbWVtc2V0KHJlcSwgMCwgbGVuKTsKLQotCXNldF93cl90eHEoc2tiLCBDUExfUFJJT1JJVFlfREFUQSwgY3NrLT50eHFfaWR4KTsKLQlJTklUX1RQX1dSKHJlcSwgY3NrLT50aWQpOwotCU9QQ09ERV9USUQocmVxKSA9IGNwdV90b19iZTMyKE1LX09QQ09ERV9USUQoQ1BMX0NMT1NFX0NPTl9SRVEsCi0JCQkJCQkgICAgY3NrLT50aWQpKTsKLQlyZXEtPnJzdmQgPSAwOworCWN4Z2JfbWtfY2xvc2VfY29uX3JlcShza2IsIGxlbiwgY3NrLT50aWQsIGNzay0+dHhxX2lkeCwKKwkJCSAgICAgIE5VTEwsIE5VTEwpOwogCiAJY3hnYml0X3NrY2JfZmxhZ3Moc2tiKSB8PSBTS0NCRl9UWF9GTEFHX0NPTVBMOwogCV9fc2tiX3F1ZXVlX3RhaWwoJmNzay0+dHhxLCBza2IpOwpAQCAtNjYyLDkgKzY0Nyw4IEBACiAKIHN0YXRpYyBpbnQgY3hnYml0X3NlbmRfYWJvcnRfcmVxKHN0cnVjdCBjeGdiaXRfc29jayAqY3NrKQogewotCXN0cnVjdCBjcGxfYWJvcnRfcmVxICpyZXE7Ci0JdW5zaWduZWQgaW50IGxlbiA9IHJvdW5kdXAoc2l6ZW9mKCpyZXEpLCAxNik7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1MzIgbGVuID0gcm91bmR1cChzaXplb2Yoc3RydWN0IGNwbF9hYm9ydF9yZXEpLCAxNik7CiAKIAlwcl9kZWJ1ZygiJXM6IGNzayAlcCB0aWQgJXU7IHN0YXRlICVkXG4iLAogCQkgX19mdW5jX18sIGNzaywgY3NrLT50aWQsIGNzay0+Y29tLnN0YXRlKTsKQEAgLTY3NSwxNSArNjU5LDkgQEAKIAkJY3hnYml0X3NlbmRfdHhfZmxvd2Nfd3IoY3NrKTsKIAogCXNrYiA9IF9fc2tiX2RlcXVldWUoJmNzay0+c2ticSk7Ci0JcmVxID0gKHN0cnVjdCBjcGxfYWJvcnRfcmVxICopX19za2JfcHV0KHNrYiwgbGVuKTsKLQltZW1zZXQocmVxLCAwLCBsZW4pOworCWN4Z2JfbWtfYWJvcnRfcmVxKHNrYiwgbGVuLCBjc2stPnRpZCwgY3NrLT50eHFfaWR4LAorCQkJICBjc2stPmNvbS5jZGV2LCBjeGdiaXRfYWJvcnRfYXJwX2ZhaWx1cmUpOwogCi0Jc2V0X3dyX3R4cShza2IsIENQTF9QUklPUklUWV9EQVRBLCBjc2stPnR4cV9pZHgpOwotCXQ0X3NldF9hcnBfZXJyX2hhbmRsZXIoc2tiLCBjc2stPmNvbS5jZGV2LCBjeGdiaXRfYWJvcnRfYXJwX2ZhaWx1cmUpOwotCUlOSVRfVFBfV1IocmVxLCBjc2stPnRpZCk7Ci0JT1BDT0RFX1RJRChyZXEpID0gY3B1X3RvX2JlMzIoTUtfT1BDT0RFX1RJRChDUExfQUJPUlRfUkVRLAotCQkJCQkJICAgIGNzay0+dGlkKSk7Ci0JcmVxLT5jbWQgPSBDUExfQUJPUlRfU0VORF9SU1Q7CiAJcmV0dXJuIGN4Z2JpdF9sMnRfc2VuZChjc2stPmNvbS5jZGV2LCBza2IsIGNzay0+bDJ0KTsKIH0KIApAQCAtNzg5LDEwOSArNzY3LDYgQEAKIAlrZnJlZShjc2spOwogfQogCi1zdGF0aWMgdm9pZAotY3hnYml0X2dldF90dXBsZV9pbmZvKHN0cnVjdCBjcGxfcGFzc19hY2NlcHRfcmVxICpyZXEsIGludCAqaXB0eXBlLAotCQkgICAgICBfX3U4ICpsb2NhbF9pcCwgX191OCAqcGVlcl9pcCwgX19iZTE2ICpsb2NhbF9wb3J0LAotCQkgICAgICBfX2JlMTYgKnBlZXJfcG9ydCkKLXsKLQl1MzIgZXRoX2xlbiA9IEVUSF9IRFJfTEVOX0coYmUzMl90b19jcHUocmVxLT5oZHJfbGVuKSk7Ci0JdTMyIGlwX2xlbiA9IElQX0hEUl9MRU5fRyhiZTMyX3RvX2NwdShyZXEtPmhkcl9sZW4pKTsKLQlzdHJ1Y3QgaXBoZHIgKmlwID0gKHN0cnVjdCBpcGhkciAqKSgodTggKikocmVxICsgMSkgKyBldGhfbGVuKTsKLQlzdHJ1Y3QgaXB2NmhkciAqaXA2ID0gKHN0cnVjdCBpcHY2aGRyICopKCh1OCAqKShyZXEgKyAxKSArIGV0aF9sZW4pOwotCXN0cnVjdCB0Y3BoZHIgKnRjcCA9IChzdHJ1Y3QgdGNwaGRyICopCi0JCQkgICAgICAoKHU4ICopKHJlcSArIDEpICsgZXRoX2xlbiArIGlwX2xlbik7Ci0KLQlpZiAoaXAtPnZlcnNpb24gPT0gNCkgewotCQlwcl9kZWJ1ZygiJXMgc2FkZHIgMHgleCBkYWRkciAweCV4IHNwb3J0ICV1IGRwb3J0ICV1XG4iLAotCQkJIF9fZnVuY19fLAotCQkJIG50b2hsKGlwLT5zYWRkciksIG50b2hsKGlwLT5kYWRkciksCi0JCQkgbnRvaHModGNwLT5zb3VyY2UpLAotCQkJIG50b2hzKHRjcC0+ZGVzdCkpOwotCQkqaXB0eXBlID0gNDsKLQkJbWVtY3B5KHBlZXJfaXAsICZpcC0+c2FkZHIsIDQpOwotCQltZW1jcHkobG9jYWxfaXAsICZpcC0+ZGFkZHIsIDQpOwotCX0gZWxzZSB7Ci0JCXByX2RlYnVnKCIlcyBzYWRkciAlcEk2IGRhZGRyICVwSTYgc3BvcnQgJXUgZHBvcnQgJXVcbiIsCi0JCQkgX19mdW5jX18sCi0JCQkgaXA2LT5zYWRkci5zNl9hZGRyLCBpcDYtPmRhZGRyLnM2X2FkZHIsCi0JCQkgbnRvaHModGNwLT5zb3VyY2UpLAotCQkJIG50b2hzKHRjcC0+ZGVzdCkpOwotCQkqaXB0eXBlID0gNjsKLQkJbWVtY3B5KHBlZXJfaXAsIGlwNi0+c2FkZHIuczZfYWRkciwgMTYpOwotCQltZW1jcHkobG9jYWxfaXAsIGlwNi0+ZGFkZHIuczZfYWRkciwgMTYpOwotCX0KLQotCSpwZWVyX3BvcnQgPSB0Y3AtPnNvdXJjZTsKLQkqbG9jYWxfcG9ydCA9IHRjcC0+ZGVzdDsKLX0KLQotc3RhdGljIGludAotY3hnYml0X291cl9pbnRlcmZhY2Uoc3RydWN0IGN4Z2JpdF9kZXZpY2UgKmNkZXYsIHN0cnVjdCBuZXRfZGV2aWNlICplZ3Jlc3NfZGV2KQotewotCXU4IGk7Ci0KLQllZ3Jlc3NfZGV2ID0gY3hnYml0X2dldF9yZWFsX2RldihlZ3Jlc3NfZGV2KTsKLQlmb3IgKGkgPSAwOyBpIDwgY2Rldi0+bGxkaS5ucG9ydHM7IGkrKykKLQkJaWYgKGNkZXYtPmxsZGkucG9ydHNbaV0gPT0gZWdyZXNzX2RldikKLQkJCXJldHVybiAxOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGRzdF9lbnRyeSAqCi1jeGdiaXRfZmluZF9yb3V0ZTYoc3RydWN0IGN4Z2JpdF9kZXZpY2UgKmNkZXYsIF9fdTggKmxvY2FsX2lwLCBfX3U4ICpwZWVyX2lwLAotCQkgICBfX2JlMTYgbG9jYWxfcG9ydCwgX19iZTE2IHBlZXJfcG9ydCwgdTggdG9zLAotCQkgICBfX3UzMiBzaW42X3Njb3BlX2lkKQotewotCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IE5VTEw7Ci0KLQlpZiAoSVNfRU5BQkxFRChDT05GSUdfSVBWNikpIHsKLQkJc3RydWN0IGZsb3dpNiBmbDY7Ci0KLQkJbWVtc2V0KCZmbDYsIDAsIHNpemVvZihmbDYpKTsKLQkJbWVtY3B5KCZmbDYuZGFkZHIsIHBlZXJfaXAsIDE2KTsKLQkJbWVtY3B5KCZmbDYuc2FkZHIsIGxvY2FsX2lwLCAxNik7Ci0JCWlmIChpcHY2X2FkZHJfdHlwZSgmZmw2LmRhZGRyKSAmIElQVjZfQUREUl9MSU5LTE9DQUwpCi0JCQlmbDYuZmxvd2k2X29pZiA9IHNpbjZfc2NvcGVfaWQ7Ci0JCWRzdCA9IGlwNl9yb3V0ZV9vdXRwdXQoJmluaXRfbmV0LCBOVUxMLCAmZmw2KTsKLQkJaWYgKCFkc3QpCi0JCQlnb3RvIG91dDsKLQkJaWYgKCFjeGdiaXRfb3VyX2ludGVyZmFjZShjZGV2LCBpcDZfZHN0X2lkZXYoZHN0KS0+ZGV2KSAmJgotCQkgICAgIShpcDZfZHN0X2lkZXYoZHN0KS0+ZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykpIHsKLQkJCWRzdF9yZWxlYXNlKGRzdCk7Ci0JCQlkc3QgPSBOVUxMOwotCQl9Ci0JfQotb3V0OgotCXJldHVybiBkc3Q7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZHN0X2VudHJ5ICoKLWN4Z2JpdF9maW5kX3JvdXRlKHN0cnVjdCBjeGdiaXRfZGV2aWNlICpjZGV2LCBfX2JlMzIgbG9jYWxfaXAsIF9fYmUzMiBwZWVyX2lwLAotCQkgIF9fYmUxNiBsb2NhbF9wb3J0LCBfX2JlMTYgcGVlcl9wb3J0LCB1OCB0b3MpCi17Ci0Jc3RydWN0IHJ0YWJsZSAqcnQ7Ci0Jc3RydWN0IGZsb3dpNCBmbDQ7Ci0Jc3RydWN0IG5laWdoYm91ciAqbjsKLQotCXJ0ID0gaXBfcm91dGVfb3V0cHV0X3BvcnRzKCZpbml0X25ldCwgJmZsNCwgTlVMTCwgcGVlcl9pcCwKLQkJCQkgICBsb2NhbF9pcCwKLQkJCQkgICBwZWVyX3BvcnQsIGxvY2FsX3BvcnQsIElQUFJPVE9fVENQLAotCQkJCSAgIHRvcywgMCk7Ci0JaWYgKElTX0VSUihydCkpCi0JCXJldHVybiBOVUxMOwotCW4gPSBkc3RfbmVpZ2hfbG9va3VwKCZydC0+ZHN0LCAmcGVlcl9pcCk7Ci0JaWYgKCFuKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWN4Z2JpdF9vdXJfaW50ZXJmYWNlKGNkZXYsIG4tPmRldikgJiYKLQkgICAgIShuLT5kZXYtPmZsYWdzICYgSUZGX0xPT1BCQUNLKSkgewotCQluZWlnaF9yZWxlYXNlKG4pOwotCQlkc3RfcmVsZWFzZSgmcnQtPmRzdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQluZWlnaF9yZWxlYXNlKG4pOwotCXJldHVybiAmcnQtPmRzdDsKLX0KLQogc3RhdGljIHZvaWQgY3hnYml0X3NldF90Y3Bfd2luZG93KHN0cnVjdCBjeGdiaXRfc29jayAqY3NrLCBzdHJ1Y3QgcG9ydF9pbmZvICpwaSkKIHsKIAl1bnNpZ25lZCBpbnQgbGlua3NwZWVkOwpAQCAtMTA3MiwyMSArOTQ3LDE0IEBACiAKIHN0YXRpYyB2b2lkIGN4Z2JpdF9yZWxlYXNlX3RpZChzdHJ1Y3QgY3hnYml0X2RldmljZSAqY2RldiwgdTMyIHRpZCkKIHsKLQlzdHJ1Y3QgY3BsX3RpZF9yZWxlYXNlICpyZXE7Ci0JdW5zaWduZWQgaW50IGxlbiA9IHJvdW5kdXAoc2l6ZW9mKCpyZXEpLCAxNik7CisJdTMyIGxlbiA9IHJvdW5kdXAoc2l6ZW9mKHN0cnVjdCBjcGxfdGlkX3JlbGVhc2UpLCAxNik7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAogCXNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9BVE9NSUMpOwogCWlmICghc2tiKQogCQlyZXR1cm47CiAKLQlyZXEgPSAoc3RydWN0IGNwbF90aWRfcmVsZWFzZSAqKV9fc2tiX3B1dChza2IsIGxlbik7Ci0JbWVtc2V0KHJlcSwgMCwgbGVuKTsKLQotCUlOSVRfVFBfV1IocmVxLCB0aWQpOwotCU9QQ09ERV9USUQocmVxKSA9IGNwdV90b19iZTMyKE1LX09QQ09ERV9USUQoCi0JCSAgIENQTF9USURfUkVMRUFTRSwgdGlkKSk7Ci0Jc2V0X3dyX3R4cShza2IsIENQTF9QUklPUklUWV9TRVRVUCwgMCk7CisJY3hnYl9ta190aWRfcmVsZWFzZShza2IsIGxlbiwgdGlkLCAwKTsKIAljeGdiaXRfb2ZsZF9zZW5kKGNkZXYsIHNrYik7CiB9CiAKQEAgLTExMDgsMjAgKzk3Niw2IEBACiAJcmV0dXJuIHJldCA8IDAgPyByZXQgOiAwOwogfQogCi1zdGF0aWMgdm9pZAotY3hnYml0X2Jlc3RfbXR1KGNvbnN0IHVuc2lnbmVkIHNob3J0ICptdHVzLCB1bnNpZ25lZCBzaG9ydCBtdHUsCi0JCXVuc2lnbmVkIGludCAqaWR4LCBpbnQgdXNlX3RzLCBpbnQgaXB2NikKLXsKLQl1bnNpZ25lZCBzaG9ydCBoZHJfc2l6ZSA9IChpcHY2ID8gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSA6Ci0JCQkJICAgc2l6ZW9mKHN0cnVjdCBpcGhkcikpICsKLQkJCQkgICBzaXplb2Yoc3RydWN0IHRjcGhkcikgKwotCQkJCSAgICh1c2VfdHMgPyByb3VuZF91cChUQ1BPTEVOX1RJTUVTVEFNUCwKLQkJCQkgICAgNCkgOiAwKTsKLQl1bnNpZ25lZCBzaG9ydCBkYXRhX3NpemUgPSBtdHUgLSBoZHJfc2l6ZTsKLQotCWN4Z2I0X2Jlc3RfYWxpZ25lZF9tdHUobXR1cywgaGRyX3NpemUsIGRhdGFfc2l6ZSwgOCwgaWR4KTsKLX0KLQogc3RhdGljIHZvaWQgY3hnYml0X3NlbmRfcnhfY3JlZGl0cyhzdHJ1Y3QgY3hnYml0X3NvY2sgKmNzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpZiAoY3NrLT5jb20uc3RhdGUgIT0gQ1NLX1NUQVRFX0VTVEFCTElTSEVEKSB7CkBAIC0xMTQwLDIyICs5OTQsMTggQEAKIGludCBjeGdiaXRfcnhfZGF0YV9hY2soc3RydWN0IGN4Z2JpdF9zb2NrICpjc2spCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgY3BsX3J4X2RhdGFfYWNrICpyZXE7Ci0JdW5zaWduZWQgaW50IGxlbiA9IHJvdW5kdXAoc2l6ZW9mKCpyZXEpLCAxNik7CisJdTMyIGxlbiA9IHJvdW5kdXAoc2l6ZW9mKHN0cnVjdCBjcGxfcnhfZGF0YV9hY2spLCAxNik7CisJdTMyIGNyZWRpdF9kYWNrOwogCiAJc2tiID0gYWxsb2Nfc2tiKGxlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFza2IpCiAJCXJldHVybiAtMTsKIAotCXJlcSA9IChzdHJ1Y3QgY3BsX3J4X2RhdGFfYWNrICopX19za2JfcHV0KHNrYiwgbGVuKTsKLQltZW1zZXQocmVxLCAwLCBsZW4pOworCWNyZWRpdF9kYWNrID0gUlhfREFDS19DSEFOR0VfRiB8IFJYX0RBQ0tfTU9ERV9WKDEpIHwKKwkJICAgICAgUlhfQ1JFRElUU19WKGNzay0+cnhfY3JlZGl0cyk7CiAKLQlzZXRfd3JfdHhxKHNrYiwgQ1BMX1BSSU9SSVRZX0FDSywgY3NrLT5jdHJscV9pZHgpOwotCUlOSVRfVFBfV1IocmVxLCBjc2stPnRpZCk7Ci0JT1BDT0RFX1RJRChyZXEpID0gY3B1X3RvX2JlMzIoTUtfT1BDT0RFX1RJRChDUExfUlhfREFUQV9BQ0ssCi0JCQkJCQkgICAgY3NrLT50aWQpKTsKLQlyZXEtPmNyZWRpdF9kYWNrID0gY3B1X3RvX2JlMzIoUlhfREFDS19DSEFOR0VfRiB8IFJYX0RBQ0tfTU9ERV9WKDEpIHwKLQkJCQkgICAgICAgUlhfQ1JFRElUU19WKGNzay0+cnhfY3JlZGl0cykpOworCWN4Z2JfbWtfcnhfZGF0YV9hY2soc2tiLCBsZW4sIGNzay0+dGlkLCBjc2stPmN0cmxxX2lkeCwKKwkJCSAgICBjcmVkaXRfZGFjayk7CiAKIAljc2stPnJ4X2NyZWRpdHMgPSAwOwogCkBAIC0xMjEwLDE1ICsxMDYwLDYgQEAKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAotc3RhdGljIHUzMiBjeGdiaXRfY29tcHV0ZV93c2NhbGUodTMyIHdpbikKLXsKLQl1MzIgd3NjYWxlID0gMDsKLQotCXdoaWxlICh3c2NhbGUgPCAxNCAmJiAoNjU1MzUgPDwgd3NjYWxlKSA8IHdpbikKLQkJd3NjYWxlKys7Ci0JcmV0dXJuIHdzY2FsZTsKLX0KLQogc3RhdGljIHZvaWQKIGN4Z2JpdF9wYXNzX2FjY2VwdF9ycGwoc3RydWN0IGN4Z2JpdF9zb2NrICpjc2ssIHN0cnVjdCBjcGxfcGFzc19hY2NlcHRfcmVxICpyZXEpCiB7CkBAIC0xMjQ2LDEwICsxMDg3LDEwIEBACiAJSU5JVF9UUF9XUihycGw1LCBjc2stPnRpZCk7CiAJT1BDT0RFX1RJRChycGw1KSA9IGNwdV90b19iZTMyKE1LX09QQ09ERV9USUQoQ1BMX1BBU1NfQUNDRVBUX1JQTCwKIAkJCQkJCSAgICAgY3NrLT50aWQpKTsKLQljeGdiaXRfYmVzdF9tdHUoY3NrLT5jb20uY2Rldi0+bGxkaS5tdHVzLCBjc2stPm10dSwgJm10dV9pZHgsCi0JCQlyZXEtPnRjcG9wdC50c3RhbXAsCi0JCQkoY3NrLT5jb20ucmVtb3RlX2FkZHIuc3NfZmFtaWx5ID09IEFGX0lORVQpID8gMCA6IDEpOwotCXdzY2FsZSA9IGN4Z2JpdF9jb21wdXRlX3dzY2FsZShjc2stPnJjdl93aW4pOworCWN4Z2JfYmVzdF9tdHUoY3NrLT5jb20uY2Rldi0+bGxkaS5tdHVzLCBjc2stPm10dSwgJm10dV9pZHgsCisJCSAgICAgIHJlcS0+dGNwb3B0LnRzdGFtcCwKKwkJICAgICAgKGNzay0+Y29tLnJlbW90ZV9hZGRyLnNzX2ZhbWlseSA9PSBBRl9JTkVUKSA/IDAgOiAxKTsKKwl3c2NhbGUgPSBjeGdiX2NvbXB1dGVfd3NjYWxlKGNzay0+cmN2X3dpbik7CiAJLyoKIAkgKiBTcGVjaWZ5IHRoZSBsYXJnZXN0IHdpbmRvdyB0aGF0IHdpbGwgZml0IGluIG9wdDAuIFRoZQogCSAqIHJlbWFpbmRlciB3aWxsIGJlIHNwZWNpZmllZCBpbiB0aGUgcnhfZGF0YV9hY2suCkBAIC0xMzQwLDggKzExODEsOCBAQAogCQlnb3RvIHJlbF9za2I7CiAJfQogCi0JY3hnYml0X2dldF90dXBsZV9pbmZvKHJlcSwgJmlwdHlwZSwgbG9jYWxfaXAsIHBlZXJfaXAsCi0JCQkgICAgICAmbG9jYWxfcG9ydCwgJnBlZXJfcG9ydCk7CisJY3hnYl9nZXRfNHR1cGxlKHJlcSwgY2Rldi0+bGxkaS5hZGFwdGVyX3R5cGUsICZpcHR5cGUsIGxvY2FsX2lwLAorCQkJcGVlcl9pcCwgJmxvY2FsX3BvcnQsICZwZWVyX3BvcnQpOwogCiAJLyogRmluZCBvdXRwdXQgcm91dGUgKi8KIAlpZiAoaXB0eXBlID09IDQpICB7CkBAIC0xMzUwLDIxICsxMTkxLDIzIEBACiAJCQkgLCBfX2Z1bmNfXywgY25wLCB0aWQsCiAJCQkgbG9jYWxfaXAsIHBlZXJfaXAsIG50b2hzKGxvY2FsX3BvcnQpLAogCQkJIG50b2hzKHBlZXJfcG9ydCksIHBlZXJfbXNzKTsKLQkJZHN0ID0gY3hnYml0X2ZpbmRfcm91dGUoY2RldiwgKihfX2JlMzIgKilsb2NhbF9pcCwKLQkJCQkJKihfX2JlMzIgKilwZWVyX2lwLAotCQkJCQlsb2NhbF9wb3J0LCBwZWVyX3BvcnQsCi0JCQkJCVBBU1NfT1BFTl9UT1NfRyhudG9obChyZXEtPnRvc19zdGlkKSkpOworCQlkc3QgPSBjeGdiX2ZpbmRfcm91dGUoJmNkZXYtPmxsZGksIGN4Z2JpdF9nZXRfcmVhbF9kZXYsCisJCQkJICAgICAgKihfX2JlMzIgKilsb2NhbF9pcCwKKwkJCQkgICAgICAqKF9fYmUzMiAqKXBlZXJfaXAsCisJCQkJICAgICAgbG9jYWxfcG9ydCwgcGVlcl9wb3J0LAorCQkJCSAgICAgIFBBU1NfT1BFTl9UT1NfRyhudG9obChyZXEtPnRvc19zdGlkKSkpOwogCX0gZWxzZSB7CiAJCXByX2RlYnVnKCIlcyBwYXJlbnQgc29jayAlcCB0aWQgJXUgbGFkZHIgJXBJNiByYWRkciAlcEk2ICIKIAkJCSAibHBvcnQgJWQgcnBvcnQgJWQgcGVlcl9tc3MgJWRcbiIKIAkJCSAsIF9fZnVuY19fLCBjbnAsIHRpZCwKIAkJCSBsb2NhbF9pcCwgcGVlcl9pcCwgbnRvaHMobG9jYWxfcG9ydCksCiAJCQkgbnRvaHMocGVlcl9wb3J0KSwgcGVlcl9tc3MpOwotCQlkc3QgPSBjeGdiaXRfZmluZF9yb3V0ZTYoY2RldiwgbG9jYWxfaXAsIHBlZXJfaXAsCi0JCQkJCSBsb2NhbF9wb3J0LCBwZWVyX3BvcnQsCi0JCQkJCSBQQVNTX09QRU5fVE9TX0cobnRvaGwocmVxLT50b3Nfc3RpZCkpLAotCQkJCQkgKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopCi0JCQkJCSAmY25wLT5jb20ubG9jYWxfYWRkciktPnNpbjZfc2NvcGVfaWQpOworCQlkc3QgPSBjeGdiX2ZpbmRfcm91dGU2KCZjZGV2LT5sbGRpLCBjeGdiaXRfZ2V0X3JlYWxfZGV2LAorCQkJCSAgICAgICBsb2NhbF9pcCwgcGVlcl9pcCwKKwkJCQkgICAgICAgbG9jYWxfcG9ydCwgcGVlcl9wb3J0LAorCQkJCSAgICAgICBQQVNTX09QRU5fVE9TX0cobnRvaGwocmVxLT50b3Nfc3RpZCkpLAorCQkJCSAgICAgICAoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikKKwkJCQkJJmNucC0+Y29tLmxvY2FsX2FkZHIpLT5zaW42X3Njb3BlX2lkKTsKIAl9CiAJaWYgKCFkc3QpIHsKIAkJcHJfZXJyKCIlcyAtIGZhaWxlZCB0byBmaW5kIGRzdCBlbnRyeSFcbiIsCkBAIC0xNzk1LDE2ICsxNjM4LDE1IEBACiB7CiAJc3RydWN0IGNwbF9hYm9ydF9yZXFfcnNzICpoZHIgPSBjcGxoZHIoc2tiKTsKIAl1bnNpZ25lZCBpbnQgdGlkID0gR0VUX1RJRChoZHIpOwotCXN0cnVjdCBjcGxfYWJvcnRfcnBsICpycGw7CiAJc3RydWN0IHNrX2J1ZmYgKnJwbF9za2I7CiAJYm9vbCByZWxlYXNlID0gZmFsc2U7CiAJYm9vbCB3YWtldXBfdGhyZWFkID0gZmFsc2U7Ci0JdW5zaWduZWQgaW50IGxlbiA9IHJvdW5kdXAoc2l6ZW9mKCpycGwpLCAxNik7CisJdTMyIGxlbiA9IHJvdW5kdXAoc2l6ZW9mKHN0cnVjdCBjcGxfYWJvcnRfcnBsKSwgMTYpOwogCiAJcHJfZGVidWcoIiVzOiBjc2sgJXA7IHRpZCAldTsgc3RhdGUgJWRcbiIsCiAJCSBfX2Z1bmNfXywgY3NrLCB0aWQsIGNzay0+Y29tLnN0YXRlKTsKIAotCWlmIChjeGdiaXRfaXNfbmVnX2FkdihoZHItPnN0YXR1cykpIHsKKwlpZiAoY3hnYl9pc19uZWdfYWR2KGhkci0+c3RhdHVzKSkgewogCQlwcl9lcnIoIiVzOiBnb3QgbmVnIGFkdmlzZSAlZCBvbiB0aWQgJXVcbiIsCiAJCSAgICAgICBfX2Z1bmNfXywgaGRyLT5zdGF0dXMsIHRpZCk7CiAJCWdvdG8gcmVsX3NrYjsKQEAgLTE4MzksMTQgKzE2ODEsOCBAQAogCQljeGdiaXRfc2VuZF90eF9mbG93Y193cihjc2spOwogCiAJcnBsX3NrYiA9IF9fc2tiX2RlcXVldWUoJmNzay0+c2ticSk7Ci0Jc2V0X3dyX3R4cShza2IsIENQTF9QUklPUklUWV9EQVRBLCBjc2stPnR4cV9pZHgpOwogCi0JcnBsID0gKHN0cnVjdCBjcGxfYWJvcnRfcnBsICopX19za2JfcHV0KHJwbF9za2IsIGxlbik7Ci0JbWVtc2V0KHJwbCwgMCwgbGVuKTsKLQotCUlOSVRfVFBfV1IocnBsLCBjc2stPnRpZCk7Ci0JT1BDT0RFX1RJRChycGwpID0gY3B1X3RvX2JlMzIoTUtfT1BDT0RFX1RJRChDUExfQUJPUlRfUlBMLCB0aWQpKTsKLQlycGwtPmNtZCA9IENQTF9BQk9SVF9OT19SU1Q7CisJY3hnYl9ta19hYm9ydF9ycGwocnBsX3NrYiwgbGVuLCBjc2stPnRpZCwgY3NrLT50eHFfaWR4KTsKIAljeGdiaXRfb2ZsZF9zZW5kKGNzay0+Y29tLmNkZXYsIHJwbF9za2IpOwogCiAJaWYgKHdha2V1cF90aHJlYWQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2N4Z2JpdC9jeGdiaXRfbWFpbi5jIGIvZHJpdmVycy90YXJnZXQvaXNjc2kvY3hnYml0L2N4Z2JpdF9tYWluLmMKaW5kZXggMjdkZDExYS4uYWQyNmI5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvaXNjc2kvY3hnYml0L2N4Z2JpdF9tYWluLmMKKysrIGIvZHJpdmVycy90YXJnZXQvaXNjc2kvY3hnYml0L2N4Z2JpdF9tYWluLmMKQEAgLTY1Miw2ICs2NTIsOSBAQAogCiBzdGF0aWMgc3RydWN0IGN4Z2I0X3VsZF9pbmZvIGN4Z2JpdF91bGRfaW5mbyA9IHsKIAkubmFtZQkJPSBEUlZfTkFNRSwKKwkubnJ4cQkJPSBNQVhfVUxEX1FTRVRTLAorCS5yeHFfc2l6ZQk9IDEwMjQsCisJLmxybwkJPSB0cnVlLAogCS5hZGQJCT0gY3hnYml0X3VsZF9hZGQsCiAJLnN0YXRlX2NoYW5nZQk9IGN4Z2JpdF91bGRfc3RhdGVfY2hhbmdlLAogCS5scm9fcnhfaGFuZGxlciA9IGN4Z2JpdF91bGRfbHJvX3J4X2hhbmRsZXIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RoZXJtYWwvY3B1X2Nvb2xpbmcuYyBiL2RyaXZlcnMvdGhlcm1hbC9jcHVfY29vbGluZy5jCmluZGV4IDM3ODhlZDcuLmEzMmI0MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGhlcm1hbC9jcHVfY29vbGluZy5jCisrKyBiL2RyaXZlcnMvdGhlcm1hbC9jcHVfY29vbGluZy5jCkBAIC03NDAsMTIgKzc0MCwyMiBAQAogfQogCiAvKiBCaW5kIGNwdWZyZXEgY2FsbGJhY2tzIHRvIHRoZXJtYWwgY29vbGluZyBkZXZpY2Ugb3BzICovCisKIHN0YXRpYyBzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZV9vcHMgY3B1ZnJlcV9jb29saW5nX29wcyA9IHsKIAkuZ2V0X21heF9zdGF0ZSA9IGNwdWZyZXFfZ2V0X21heF9zdGF0ZSwKIAkuZ2V0X2N1cl9zdGF0ZSA9IGNwdWZyZXFfZ2V0X2N1cl9zdGF0ZSwKIAkuc2V0X2N1cl9zdGF0ZSA9IGNwdWZyZXFfc2V0X2N1cl9zdGF0ZSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZV9vcHMgY3B1ZnJlcV9wb3dlcl9jb29saW5nX29wcyA9IHsKKwkuZ2V0X21heF9zdGF0ZQkJPSBjcHVmcmVxX2dldF9tYXhfc3RhdGUsCisJLmdldF9jdXJfc3RhdGUJCT0gY3B1ZnJlcV9nZXRfY3VyX3N0YXRlLAorCS5zZXRfY3VyX3N0YXRlCQk9IGNwdWZyZXFfc2V0X2N1cl9zdGF0ZSwKKwkuZ2V0X3JlcXVlc3RlZF9wb3dlcgk9IGNwdWZyZXFfZ2V0X3JlcXVlc3RlZF9wb3dlciwKKwkuc3RhdGUycG93ZXIJCT0gY3B1ZnJlcV9zdGF0ZTJwb3dlciwKKwkucG93ZXIyc3RhdGUJCT0gY3B1ZnJlcV9wb3dlcjJzdGF0ZSwKK307CisKIC8qIE5vdGlmaWVyIGZvciBjcHVmcmVxIHBvbGljeSBjaGFuZ2UgKi8KIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgdGhlcm1hbF9jcHVmcmVxX25vdGlmaWVyX2Jsb2NrID0gewogCS5ub3RpZmllcl9jYWxsID0gY3B1ZnJlcV90aGVybWFsX25vdGlmaWVyLApAQCAtNzk1LDYgKzgwNSw3IEBACiAJc3RydWN0IGNwdW1hc2sgdGVtcF9tYXNrOwogCXVuc2lnbmVkIGludCBmcmVxLCBpLCBudW1fY3B1czsKIAlpbnQgcmV0OworCXN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX29wcyAqY29vbGluZ19vcHM7CiAKIAljcHVtYXNrX2FuZCgmdGVtcF9tYXNrLCBjbGlwX2NwdXMsIGNwdV9vbmxpbmVfbWFzayk7CiAJcG9saWN5ID0gY3B1ZnJlcV9jcHVfZ2V0KGNwdW1hc2tfZmlyc3QoJnRlbXBfbWFzaykpOwpAQCAtODUwLDEwICs4NjEsNiBAQAogCWNwdW1hc2tfY29weSgmY3B1ZnJlcV9kZXYtPmFsbG93ZWRfY3B1cywgY2xpcF9jcHVzKTsKIAogCWlmIChjYXBhY2l0YW5jZSkgewotCQljcHVmcmVxX2Nvb2xpbmdfb3BzLmdldF9yZXF1ZXN0ZWRfcG93ZXIgPQotCQkJY3B1ZnJlcV9nZXRfcmVxdWVzdGVkX3Bvd2VyOwotCQljcHVmcmVxX2Nvb2xpbmdfb3BzLnN0YXRlMnBvd2VyID0gY3B1ZnJlcV9zdGF0ZTJwb3dlcjsKLQkJY3B1ZnJlcV9jb29saW5nX29wcy5wb3dlcjJzdGF0ZSA9IGNwdWZyZXFfcG93ZXIyc3RhdGU7CiAJCWNwdWZyZXFfZGV2LT5wbGF0X2dldF9zdGF0aWNfcG93ZXIgPSBwbGF0X3N0YXRpY19mdW5jOwogCiAJCXJldCA9IGJ1aWxkX2R5bl9wb3dlcl90YWJsZShjcHVmcmVxX2RldiwgY2FwYWNpdGFuY2UpOwpAQCAtODYxLDYgKzg2OCwxMCBAQAogCQkJY29vbF9kZXYgPSBFUlJfUFRSKHJldCk7CiAJCQlnb3RvIGZyZWVfdGFibGU7CiAJCX0KKworCQljb29saW5nX29wcyA9ICZjcHVmcmVxX3Bvd2VyX2Nvb2xpbmdfb3BzOworCX0gZWxzZSB7CisJCWNvb2xpbmdfb3BzID0gJmNwdWZyZXFfY29vbGluZ19vcHM7CiAJfQogCiAJcmV0ID0gZ2V0X2lkcigmY3B1ZnJlcV9pZHIsICZjcHVmcmVxX2Rldi0+aWQpOwpAQCAtODg1LDcgKzg5Niw3IEBACiAJCSBjcHVmcmVxX2Rldi0+aWQpOwogCiAJY29vbF9kZXYgPSB0aGVybWFsX29mX2Nvb2xpbmdfZGV2aWNlX3JlZ2lzdGVyKG5wLCBkZXZfbmFtZSwgY3B1ZnJlcV9kZXYsCi0JCQkJCQkgICAgICAmY3B1ZnJlcV9jb29saW5nX29wcyk7CisJCQkJCQkgICAgICBjb29saW5nX29wcyk7CiAJaWYgKElTX0VSUihjb29sX2RldikpCiAJCWdvdG8gcmVtb3ZlX2lkcjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90aGVybWFsL2lteF90aGVybWFsLmMgYi9kcml2ZXJzL3RoZXJtYWwvaW14X3RoZXJtYWwuYwppbmRleCBjNTU0N2JkLi5lNDczNTQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RoZXJtYWwvaW14X3RoZXJtYWwuYworKysgYi9kcml2ZXJzL3RoZXJtYWwvaW14X3RoZXJtYWwuYwpAQCAtNDcxLDggKzQ3MSw2IEBACiAKIHN0YXRpYyBpbnQgaW14X3RoZXJtYWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZCA9Ci0JCW9mX21hdGNoX2RldmljZShvZl9pbXhfdGhlcm1hbF9tYXRjaCwgJnBkZXYtPmRldik7CiAJc3RydWN0IGlteF90aGVybWFsX2RhdGEgKmRhdGE7CiAJc3RydWN0IHJlZ21hcCAqbWFwOwogCWludCBtZWFzdXJlX2ZyZXE7CkBAIC00OTAsNyArNDg4LDcgQEAKIAl9CiAJZGF0YS0+dGVtcG1vbiA9IG1hcDsKIAotCWRhdGEtPnNvY2RhdGEgPSBvZl9pZC0+ZGF0YTsKKwlkYXRhLT5zb2NkYXRhID0gb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKCZwZGV2LT5kZXYpOwogCiAJLyogbWFrZSBzdXJlIHRoZSBJUlEgZmxhZyBpcyBjbGVhciBiZWZvcmUgZW5hYmxpbmcgaXJxIG9uIGkuTVg2U1ggKi8KIAlpZiAoZGF0YS0+c29jZGF0YS0+dmVyc2lvbiA9PSBURU1QTU9OX0lNWDZTWCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy90aGVybWFsL2ludDM0MHhfdGhlcm1hbC9pbnQzNDA2X3RoZXJtYWwuYyBiL2RyaXZlcnMvdGhlcm1hbC9pbnQzNDB4X3RoZXJtYWwvaW50MzQwNl90aGVybWFsLmMKaW5kZXggYTU3OGNkMi4uMTg5MWYzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy90aGVybWFsL2ludDM0MHhfdGhlcm1hbC9pbnQzNDA2X3RoZXJtYWwuYworKysgYi9kcml2ZXJzL3RoZXJtYWwvaW50MzQweF90aGVybWFsL2ludDM0MDZfdGhlcm1hbC5jCkBAIC0yMjUsNyArMjI1LDYgQEAKIAkucmVtb3ZlID0gaW50MzQwNl90aGVybWFsX3JlbW92ZSwKIAkuZHJpdmVyID0gewogCQkgICAubmFtZSA9ICJpbnQzNDA2IHRoZXJtYWwiLAotCQkgICAub3duZXIgPSBUSElTX01PRFVMRSwKIAkJICAgLmFjcGlfbWF0Y2hfdGFibGUgPSBpbnQzNDA2X3RoZXJtYWxfbWF0Y2gsCiAJCSAgIH0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90aGVybWFsL3JjYXJfdGhlcm1hbC5jIGIvZHJpdmVycy90aGVybWFsL3JjYXJfdGhlcm1hbC5jCmluZGV4IDcxYTMzOTIuLjVmODE3OTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGhlcm1hbC9yY2FyX3RoZXJtYWwuYworKysgYi9kcml2ZXJzL3RoZXJtYWwvcmNhcl90aGVybWFsLmMKQEAgLTUwNCw2ICs1MDQsNyBAQAogCQlpZiAoSVNfRVJSKHByaXYtPnpvbmUpKSB7CiAJCQlkZXZfZXJyKGRldiwgImNhbid0IHJlZ2lzdGVyIHRoZXJtYWwgem9uZVxuIik7CiAJCQlyZXQgPSBQVFJfRVJSKHByaXYtPnpvbmUpOworCQkJcHJpdi0+em9uZSA9IE5VTEw7CiAJCQlnb3RvIGVycm9yX3VucmVnaXN0ZXI7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90aHVuZGVyYm9sdC9uaGkuYyBiL2RyaXZlcnMvdGh1bmRlcmJvbHQvbmhpLmMKaW5kZXggOWMxNTM0NC4uYThjMjA0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy90aHVuZGVyYm9sdC9uaGkuYworKysgYi9kcml2ZXJzL3RodW5kZXJib2x0L25oaS5jCkBAIC02NTEsNiArNjUxLDEyIEBACiAJewogCQkuY2xhc3MgPSBQQ0lfQ0xBU1NfU1lTVEVNX09USEVSIDw8IDgsIC5jbGFzc19tYXNrID0gfjAsCiAJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAorCQkuZGV2aWNlID0gUENJX0RFVklDRV9JRF9JTlRFTF9GQUxDT05fUklER0VfMkNfTkhJLAorCQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwgLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCisJfSwKKwl7CisJCS5jbGFzcyA9IFBDSV9DTEFTU19TWVNURU1fT1RIRVIgPDwgOCwgLmNsYXNzX21hc2sgPSB+MCwKKwkJLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCiAJCS5kZXZpY2UgPSBQQ0lfREVWSUNFX0lEX0lOVEVMX0ZBTENPTl9SSURHRV80Q19OSEksCiAJCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELCAuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy90aHVuZGVyYm9sdC9zd2l0Y2guYyBiL2RyaXZlcnMvdGh1bmRlcmJvbHQvc3dpdGNoLmMKaW5kZXggMWUxMTZmNS4uOTg0MGZkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy90aHVuZGVyYm9sdC9zd2l0Y2guYworKysgYi9kcml2ZXJzL3RodW5kZXJib2x0L3N3aXRjaC5jCkBAIC0zNzIsNyArMzcyLDkgQEAKIAogCWlmIChzdy0+Y29uZmlnLmRldmljZV9pZCAhPSBQQ0lfREVWSUNFX0lEX0lOVEVMX0xJR0hUX1JJREdFICYmCiAJICAgIHN3LT5jb25maWcuZGV2aWNlX2lkICE9IFBDSV9ERVZJQ0VfSURfSU5URUxfQ0FDVFVTX1JJREdFXzRDICYmCi0JICAgIHN3LT5jb25maWcuZGV2aWNlX2lkICE9IFBDSV9ERVZJQ0VfSURfSU5URUxfUE9SVF9SSURHRSkKKwkgICAgc3ctPmNvbmZpZy5kZXZpY2VfaWQgIT0gUENJX0RFVklDRV9JRF9JTlRFTF9QT1JUX1JJREdFICYmCisJICAgIHN3LT5jb25maWcuZGV2aWNlX2lkICE9IFBDSV9ERVZJQ0VfSURfSU5URUxfRkFMQ09OX1JJREdFXzJDX0JSSURHRSAmJgorCSAgICBzdy0+Y29uZmlnLmRldmljZV9pZCAhPSBQQ0lfREVWSUNFX0lEX0lOVEVMX0ZBTENPTl9SSURHRV80Q19CUklER0UpCiAJCXRiX3N3X3dhcm4oc3csICJ1bnN1cHBvcnRlZCBzd2l0Y2ggZGV2aWNlIGlkICUjeFxuIiwKIAkJCSAgIHN3LT5jb25maWcuZGV2aWNlX2lkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvcHR5LmMgYi9kcml2ZXJzL3R0eS9wdHkuYwppbmRleCA1MWUwZDMyLi5hMjNmYTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9wdHkuYworKysgYi9kcml2ZXJzL3R0eS9wdHkuYwpAQCAtODAwLDcgKzgwMCw3IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHRteF9mb3BzOworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHRteF9mb3BzIF9fcm9fYWZ0ZXJfaW5pdDsKIAogc3RhdGljIHZvaWQgX19pbml0IHVuaXg5OF9wdHlfaW5pdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MC5oIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MC5oCmluZGV4IDEyMmUwZTQuLmE2OTdhODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTAuaAorKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwLmgKQEAgLTE1LDggKzE1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CiAKLSNpbmNsdWRlICIuLi9zZXJpYWxfbWN0cmxfZ3Bpby5oIgotCiBzdHJ1Y3QgdWFydF84MjUwX2RtYSB7CiAJaW50ICgqdHhfZG1hKShzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnApOwogCWludCAoKnJ4X2RtYSkoc3RydWN0IHVhcnRfODI1MF9wb3J0ICpwKTsKQEAgLTMzLDYgKzMxLDExIEBACiAJc3RydWN0IGRtYV9jaGFuCQkqcnhjaGFuOwogCXN0cnVjdCBkbWFfY2hhbgkJKnR4Y2hhbjsKIAorCS8qIERldmljZSBhZGRyZXNzIGJhc2UgZm9yIERNQSBvcGVyYXRpb25zICovCisJcGh5c19hZGRyX3QJCXJ4X2RtYV9hZGRyOworCXBoeXNfYWRkcl90CQl0eF9kbWFfYWRkcjsKKworCS8qIERNQSBhZGRyZXNzIG9mIHRoZSBidWZmZXIgaW4gbWVtb3J5ICovCiAJZG1hX2FkZHJfdAkJcnhfYWRkcjsKIAlkbWFfYWRkcl90CQl0eF9hZGRyOwogCkBAIC0xMzMsNDMgKzEzNiwxMiBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2VyaWFsODI1MF9vdXRfTUNSKHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqdXAsIGludCB2YWx1ZSkKIHsKLQlpbnQgbWN0cmxfZ3BpbyA9IDA7Ci0KIAlzZXJpYWxfb3V0KHVwLCBVQVJUX01DUiwgdmFsdWUpOwotCi0JaWYgKHZhbHVlICYgVUFSVF9NQ1JfUlRTKQotCQltY3RybF9ncGlvIHw9IFRJT0NNX1JUUzsKLQlpZiAodmFsdWUgJiBVQVJUX01DUl9EVFIpCi0JCW1jdHJsX2dwaW8gfD0gVElPQ01fRFRSOwotCi0JbWN0cmxfZ3Bpb19zZXQodXAtPmdwaW9zLCBtY3RybF9ncGlvKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgc2VyaWFsODI1MF9pbl9NQ1Ioc3RydWN0IHVhcnRfODI1MF9wb3J0ICp1cCkKIHsKLQlpbnQgbWN0cmwsIG1jdHJsX2dwaW8gPSAwOwotCi0JbWN0cmwgPSBzZXJpYWxfaW4odXAsIFVBUlRfTUNSKTsKLQotCS8qIHNhdmUgY3VycmVudCBNQ1IgdmFsdWVzICovCi0JaWYgKG1jdHJsICYgVUFSVF9NQ1JfUlRTKQotCQltY3RybF9ncGlvIHw9IFRJT0NNX1JUUzsKLQlpZiAobWN0cmwgJiBVQVJUX01DUl9EVFIpCi0JCW1jdHJsX2dwaW8gfD0gVElPQ01fRFRSOwotCi0JbWN0cmxfZ3BpbyA9IG1jdHJsX2dwaW9fZ2V0X291dHB1dHModXAtPmdwaW9zLCAmbWN0cmxfZ3Bpbyk7Ci0KLQlpZiAobWN0cmxfZ3BpbyAmIFRJT0NNX1JUUykKLQkJbWN0cmwgfD0gVUFSVF9NQ1JfUlRTOwotCWVsc2UKLQkJbWN0cmwgJj0gflVBUlRfTUNSX1JUUzsKLQotCWlmIChtY3RybF9ncGlvICYgVElPQ01fRFRSKQotCQltY3RybCB8PSBVQVJUX01DUl9EVFI7Ci0JZWxzZQotCQltY3RybCAmPSB+VUFSVF9NQ1JfRFRSOwotCi0JcmV0dXJuIG1jdHJsOworCXJldHVybiBzZXJpYWxfaW4odXAsIFVBUlRfTUNSKTsKIH0KIAogI2lmIGRlZmluZWQoX19hbHBoYV9fKSAmJiAhZGVmaW5lZChDT05GSUdfUENJKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9jb3JlLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2NvcmUuYwppbmRleCAxM2FkNWMzLi4yNDBhMzYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2NvcmUuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2NvcmUuYwpAQCAtNjM5LDcgKzYzOSw3IEBACiB7CiAJY2hhciBtYXRjaFtdID0gInVhcnQiOwkvKiA4MjUwLXNwZWNpZmljIGVhcmx5Y29uIG5hbWUgKi8KIAl1bnNpZ25lZCBjaGFyIGlvdHlwZTsKLQl1bnNpZ25lZCBsb25nIGFkZHI7CisJcmVzb3VyY2Vfc2l6ZV90IGFkZHI7CiAJaW50IGk7CiAKIAlpZiAoc3RybmNtcChuYW1lLCBtYXRjaCwgNCkgIT0gMCkKQEAgLTk3NCw4ICs5NzQsNiBAQAogCiAJdWFydCA9IHNlcmlhbDgyNTBfZmluZF9tYXRjaF9vcl91bnVzZWQoJnVwLT5wb3J0KTsKIAlpZiAodWFydCAmJiB1YXJ0LT5wb3J0LnR5cGUgIT0gUE9SVF84MjUwX0NJUikgewotCQlzdHJ1Y3QgbWN0cmxfZ3Bpb3MgKmdwaW9zOwotCiAJCWlmICh1YXJ0LT5wb3J0LmRldikKIAkJCXVhcnRfcmVtb3ZlX29uZV9wb3J0KCZzZXJpYWw4MjUwX3JlZywgJnVhcnQtPnBvcnQpOwogCkBAIC0xMDEzLDEzICsxMDExLDYgQEAKIAkJaWYgKHVwLT5wb3J0LmZsYWdzICYgVVBGX0ZJWEVEX1RZUEUpCiAJCQl1YXJ0LT5wb3J0LnR5cGUgPSB1cC0+cG9ydC50eXBlOwogCi0JCWdwaW9zID0gbWN0cmxfZ3Bpb19pbml0KCZ1YXJ0LT5wb3J0LCAwKTsKLQkJaWYgKElTX0VSUihncGlvcykpIHsKLQkJCWlmIChQVFJfRVJSKGdwaW9zKSAhPSAtRU5PU1lTKQotCQkJCXJldHVybiBQVFJfRVJSKGdwaW9zKTsKLQkJfSBlbHNlCi0JCQl1YXJ0LT5ncGlvcyA9IGdwaW9zOwotCiAJCXNlcmlhbDgyNTBfc2V0X2RlZmF1bHRzKHVhcnQpOwogCiAJCS8qIFBvc3NpYmx5IG92ZXJyaWRlIGRlZmF1bHQgSS9PIGZ1bmN0aW9ucy4gICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2RtYS5jIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9kbWEuYwppbmRleCAzNTkwZDAxLi5mZGJkZGJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2RtYS5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfZG1hLmMKQEAgLTE0Miw3ICsxNDIsNyBAQAogCWlmIChkbWEtPnJ4X3J1bm5pbmcpIHsKIAkJZG1hZW5naW5lX3BhdXNlKGRtYS0+cnhjaGFuKTsKIAkJX19kbWFfcnhfY29tcGxldGUocCk7Ci0JCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKGRtYS0+cnhjaGFuKTsKKwkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9hc3luYyhkbWEtPnJ4Y2hhbik7CiAJfQogfQogRVhQT1JUX1NZTUJPTF9HUEwoc2VyaWFsODI1MF9yeF9kbWFfZmx1c2gpOwpAQCAtMTUwLDYgKzE1MCwxMCBAQAogaW50IHNlcmlhbDgyNTBfcmVxdWVzdF9kbWEoc3RydWN0IHVhcnRfODI1MF9wb3J0ICpwKQogewogCXN0cnVjdCB1YXJ0XzgyNTBfZG1hCSpkbWEgPSBwLT5kbWE7CisJcGh5c19hZGRyX3QgcnhfZG1hX2FkZHIgPSBkbWEtPnJ4X2RtYV9hZGRyID8KKwkJCQkgIGRtYS0+cnhfZG1hX2FkZHIgOiBwLT5wb3J0Lm1hcGJhc2U7CisJcGh5c19hZGRyX3QgdHhfZG1hX2FkZHIgPSBkbWEtPnR4X2RtYV9hZGRyID8KKwkJCQkgIGRtYS0+dHhfZG1hX2FkZHIgOiBwLT5wb3J0Lm1hcGJhc2U7CiAJZG1hX2NhcF9tYXNrX3QJCW1hc2s7CiAJc3RydWN0IGRtYV9zbGF2ZV9jYXBzCWNhcHM7CiAJaW50CQkJcmV0OwpAQCAtMTU3LDExICsxNjEsMTEgQEAKIAkvKiBEZWZhdWx0IHNsYXZlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqLwogCWRtYS0+cnhjb25mLmRpcmVjdGlvbgkJPSBETUFfREVWX1RPX01FTTsKIAlkbWEtPnJ4Y29uZi5zcmNfYWRkcl93aWR0aAk9IERNQV9TTEFWRV9CVVNXSURUSF8xX0JZVEU7Ci0JZG1hLT5yeGNvbmYuc3JjX2FkZHIJCT0gcC0+cG9ydC5tYXBiYXNlICsgVUFSVF9SWDsKKwlkbWEtPnJ4Y29uZi5zcmNfYWRkcgkJPSByeF9kbWFfYWRkciArIFVBUlRfUlg7CiAKIAlkbWEtPnR4Y29uZi5kaXJlY3Rpb24JCT0gRE1BX01FTV9UT19ERVY7CiAJZG1hLT50eGNvbmYuZHN0X2FkZHJfd2lkdGgJPSBETUFfU0xBVkVfQlVTV0lEVEhfMV9CWVRFOwotCWRtYS0+dHhjb25mLmRzdF9hZGRyCQk9IHAtPnBvcnQubWFwYmFzZSArIFVBUlRfVFg7CisJZG1hLT50eGNvbmYuZHN0X2FkZHIJCT0gdHhfZG1hX2FkZHIgKyBVQVJUX1RYOwogCiAJZG1hX2NhcF96ZXJvKG1hc2spOwogCWRtYV9jYXBfc2V0KERNQV9TTEFWRSwgbWFzayk7CkBAIC0yNDcsMTQgKzI1MSwxNCBAQAogCQlyZXR1cm47CiAKIAkvKiBSZWxlYXNlIFJYIHJlc291cmNlcyAqLwotCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKGRtYS0+cnhjaGFuKTsKKwlkbWFlbmdpbmVfdGVybWluYXRlX3N5bmMoZG1hLT5yeGNoYW4pOwogCWRtYV9mcmVlX2NvaGVyZW50KGRtYS0+cnhjaGFuLT5kZXZpY2UtPmRldiwgZG1hLT5yeF9zaXplLCBkbWEtPnJ4X2J1ZiwKIAkJCSAgZG1hLT5yeF9hZGRyKTsKIAlkbWFfcmVsZWFzZV9jaGFubmVsKGRtYS0+cnhjaGFuKTsKIAlkbWEtPnJ4Y2hhbiA9IE5VTEw7CiAKIAkvKiBSZWxlYXNlIFRYIHJlc291cmNlcyAqLwotCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKGRtYS0+dHhjaGFuKTsKKwlkbWFlbmdpbmVfdGVybWluYXRlX3N5bmMoZG1hLT50eGNoYW4pOwogCWRtYV91bm1hcF9zaW5nbGUoZG1hLT50eGNoYW4tPmRldmljZS0+ZGV2LCBkbWEtPnR4X2FkZHIsCiAJCQkgVUFSVF9YTUlUX1NJWkUsIERNQV9UT19ERVZJQ0UpOwogCWRtYV9yZWxlYXNlX2NoYW5uZWwoZG1hLT50eGNoYW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9kdy5jIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9kdy5jCmluZGV4IGUxOTk2OTYuLjQ1OWQ3MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfZHcuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2R3LmMKQEAgLTI5OCwxMiArMjk4LDE3IEBACiAJCQlwLT5zZXJpYWxfb3V0ID0gZHc4MjUwX3NlcmlhbF9vdXQzMmJlOwogCQl9CiAJfSBlbHNlIGlmIChoYXNfYWNwaV9jb21wYW5pb24ocC0+ZGV2KSkgewotCQlwLT5pb3R5cGUgPSBVUElPX01FTTMyOwotCQlwLT5yZWdzaGlmdCA9IDI7Ci0JCXAtPnNlcmlhbF9pbiA9IGR3ODI1MF9zZXJpYWxfaW4zMjsKKwkJY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkICppZDsKKworCQlpZCA9IGFjcGlfbWF0Y2hfZGV2aWNlKHAtPmRldi0+ZHJpdmVyLT5hY3BpX21hdGNoX3RhYmxlLAorCQkJCSAgICAgICBwLT5kZXYpOworCQlpZiAoaWQgJiYgIXN0cmNtcChpZC0+aWQsICJBUE1DMEQwOCIpKSB7CisJCQlwLT5pb3R5cGUgPSBVUElPX01FTTMyOworCQkJcC0+cmVnc2hpZnQgPSAyOworCQkJcC0+c2VyaWFsX2luID0gZHc4MjUwX3NlcmlhbF9pbjMyOworCQkJZGF0YS0+dWFydF8xNjU1MF9jb21wYXRpYmxlID0gdHJ1ZTsKKwkJfQogCQlwLT5zZXRfdGVybWlvcyA9IGR3ODI1MF9zZXRfdGVybWlvczsKLQkJLyogU28gZmFyIG5vbmUgb2YgdGhlcmUgaW1wbGVtZW50IHRoZSBCdXN5IEZ1bmN0aW9uYWxpdHkgKi8KLQkJZGF0YS0+dWFydF8xNjU1MF9jb21wYXRpYmxlID0gdHJ1ZTsKIAl9CiAKIAkvKiBQbGF0Zm9ybXMgd2l0aCBpRE1BICovCkBAIC0zNjAsMTggKzM2NSwxOSBAQAogCXN0cnVjdCByZXNvdXJjZSAqcmVncyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaW50IGlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CiAJc3RydWN0IHVhcnRfcG9ydCAqcCA9ICZ1YXJ0LnBvcnQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKIAlzdHJ1Y3QgZHc4MjUwX2RhdGEgKmRhdGE7CiAJaW50IGVycjsKIAl1MzIgdmFsOwogCiAJaWYgKCFyZWdzKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIHJlZ2lzdGVycyBkZWZpbmVkXG4iKTsKKwkJZGV2X2VycihkZXYsICJubyByZWdpc3RlcnMgZGVmaW5lZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmIChpcnEgPCAwKSB7CiAJCWlmIChpcnEgIT0gLUVQUk9CRV9ERUZFUikKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBnZXQgaXJxXG4iKTsKKwkJCWRldl9lcnIoZGV2LCAiY2Fubm90IGdldCBpcnFcbiIpOwogCQlyZXR1cm4gaXJxOwogCX0KIApAQCAtMzgyLDE2ICszODgsMTYgQEAKIAlwLT5wbQkJPSBkdzgyNTBfZG9fcG07CiAJcC0+dHlwZQkJPSBQT1JUXzgyNTA7CiAJcC0+ZmxhZ3MJPSBVUEZfU0hBUkVfSVJRIHwgVVBGX0ZJWEVEX1BPUlQ7Ci0JcC0+ZGV2CQk9ICZwZGV2LT5kZXY7CisJcC0+ZGV2CQk9IGRldjsKIAlwLT5pb3R5cGUJPSBVUElPX01FTTsKIAlwLT5zZXJpYWxfaW4JPSBkdzgyNTBfc2VyaWFsX2luOwogCXAtPnNlcmlhbF9vdXQJPSBkdzgyNTBfc2VyaWFsX291dDsKIAotCXAtPm1lbWJhc2UgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgcmVncy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVncykpOworCXAtPm1lbWJhc2UgPSBkZXZtX2lvcmVtYXAoZGV2LCByZWdzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZWdzKSk7CiAJaWYgKCFwLT5tZW1iYXNlKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CisJZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTM5OSw1NyArNDA1LDU3IEBACiAJZGF0YS0+dXNyX3JlZyA9IERXX1VBUlRfVVNSOwogCXAtPnByaXZhdGVfZGF0YSA9IGRhdGE7CiAKLQlkYXRhLT51YXJ0XzE2NTUwX2NvbXBhdGlibGUgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKHAtPmRldiwKKwlkYXRhLT51YXJ0XzE2NTUwX2NvbXBhdGlibGUgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwKIAkJCQkJCSJzbnBzLHVhcnQtMTY1NTAtY29tcGF0aWJsZSIpOwogCi0JZXJyID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKHAtPmRldiwgInJlZy1zaGlmdCIsICZ2YWwpOworCWVyciA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMihkZXYsICJyZWctc2hpZnQiLCAmdmFsKTsKIAlpZiAoIWVycikKIAkJcC0+cmVnc2hpZnQgPSB2YWw7CiAKLQllcnIgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIocC0+ZGV2LCAicmVnLWlvLXdpZHRoIiwgJnZhbCk7CisJZXJyID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKGRldiwgInJlZy1pby13aWR0aCIsICZ2YWwpOwogCWlmICghZXJyICYmIHZhbCA9PSA0KSB7CiAJCXAtPmlvdHlwZSA9IFVQSU9fTUVNMzI7CiAJCXAtPnNlcmlhbF9pbiA9IGR3ODI1MF9zZXJpYWxfaW4zMjsKIAkJcC0+c2VyaWFsX291dCA9IGR3ODI1MF9zZXJpYWxfb3V0MzI7CiAJfQogCi0JaWYgKGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2wocC0+ZGV2LCAiZGNkLW92ZXJyaWRlIikpIHsKKwlpZiAoZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsICJkY2Qtb3ZlcnJpZGUiKSkgewogCQkvKiBBbHdheXMgcmVwb3J0IERDRCBhcyBhY3RpdmUgKi8KIAkJZGF0YS0+bXNyX21hc2tfb24gfD0gVUFSVF9NU1JfRENEOwogCQlkYXRhLT5tc3JfbWFza19vZmYgfD0gVUFSVF9NU1JfRERDRDsKIAl9CiAKLQlpZiAoZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChwLT5kZXYsICJkc3Itb3ZlcnJpZGUiKSkgeworCWlmIChkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwgImRzci1vdmVycmlkZSIpKSB7CiAJCS8qIEFsd2F5cyByZXBvcnQgRFNSIGFzIGFjdGl2ZSAqLwogCQlkYXRhLT5tc3JfbWFza19vbiB8PSBVQVJUX01TUl9EU1I7CiAJCWRhdGEtPm1zcl9tYXNrX29mZiB8PSBVQVJUX01TUl9ERFNSOwogCX0KIAotCWlmIChkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKHAtPmRldiwgImN0cy1vdmVycmlkZSIpKSB7CisJaWYgKGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LCAiY3RzLW92ZXJyaWRlIikpIHsKIAkJLyogQWx3YXlzIHJlcG9ydCBDVFMgYXMgYWN0aXZlICovCiAJCWRhdGEtPm1zcl9tYXNrX29uIHw9IFVBUlRfTVNSX0NUUzsKIAkJZGF0YS0+bXNyX21hc2tfb2ZmIHw9IFVBUlRfTVNSX0RDVFM7CiAJfQogCi0JaWYgKGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2wocC0+ZGV2LCAicmktb3ZlcnJpZGUiKSkgeworCWlmIChkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwgInJpLW92ZXJyaWRlIikpIHsKIAkJLyogQWx3YXlzIHJlcG9ydCBSaW5nIGluZGljYXRvciBhcyBpbmFjdGl2ZSAqLwogCQlkYXRhLT5tc3JfbWFza19vZmYgfD0gVUFSVF9NU1JfUkk7CiAJCWRhdGEtPm1zcl9tYXNrX29mZiB8PSBVQVJUX01TUl9URVJJOwogCX0KIAogCS8qIEFsd2F5cyBhc2sgZm9yIGZpeGVkIGNsb2NrIHJhdGUgZnJvbSBhIHByb3BlcnR5LiAqLwotCWRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMihwLT5kZXYsICJjbG9jay1mcmVxdWVuY3kiLCAmcC0+dWFydGNsayk7CisJZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKGRldiwgImNsb2NrLWZyZXF1ZW5jeSIsICZwLT51YXJ0Y2xrKTsKIAogCS8qIElmIHRoZXJlIGlzIHNlcGFyYXRlIGJhdWRjbGssIGdldCB0aGUgcmF0ZSBmcm9tIGl0LiAqLwotCWRhdGEtPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAiYmF1ZGNsayIpOworCWRhdGEtPmNsayA9IGRldm1fY2xrX2dldChkZXYsICJiYXVkY2xrIik7CiAJaWYgKElTX0VSUihkYXRhLT5jbGspICYmIFBUUl9FUlIoZGF0YS0+Y2xrKSAhPSAtRVBST0JFX0RFRkVSKQotCQlkYXRhLT5jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CisJCWRhdGEtPmNsayA9IGRldm1fY2xrX2dldChkZXYsIE5VTEwpOwogCWlmIChJU19FUlIoZGF0YS0+Y2xrKSAmJiBQVFJfRVJSKGRhdGEtPmNsaykgPT0gLUVQUk9CRV9ERUZFUikKIAkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CiAJaWYgKCFJU19FUlJfT1JfTlVMTChkYXRhLT5jbGspKSB7CiAJCWVyciA9IGNsa19wcmVwYXJlX2VuYWJsZShkYXRhLT5jbGspOwogCQlpZiAoZXJyKQotCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImNvdWxkIG5vdCBlbmFibGUgb3B0aW9uYWwgYmF1ZGNsazogJWRcbiIsCisJCQlkZXZfd2FybihkZXYsICJjb3VsZCBub3QgZW5hYmxlIG9wdGlvbmFsIGJhdWRjbGs6ICVkXG4iLAogCQkJCSBlcnIpOwogCQllbHNlCiAJCQlwLT51YXJ0Y2xrID0gY2xrX2dldF9yYXRlKGRhdGEtPmNsayk7CkBAIC00NTcsMjQgKzQ2MywyNCBAQAogCiAJLyogSWYgbm8gY2xvY2sgcmF0ZSBpcyBkZWZpbmVkLCBmYWlsLiAqLwogCWlmICghcC0+dWFydGNsaykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjbG9jayByYXRlIG5vdCBkZWZpbmVkXG4iKTsKKwkJZGV2X2VycihkZXYsICJjbG9jayByYXRlIG5vdCBkZWZpbmVkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZGF0YS0+cGNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAiYXBiX3BjbGsiKTsKLQlpZiAoSVNfRVJSKGRhdGEtPmNsaykgJiYgUFRSX0VSUihkYXRhLT5jbGspID09IC1FUFJPQkVfREVGRVIpIHsKKwlkYXRhLT5wY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgImFwYl9wY2xrIik7CisJaWYgKElTX0VSUihkYXRhLT5wY2xrKSAmJiBQVFJfRVJSKGRhdGEtPnBjbGspID09IC1FUFJPQkVfREVGRVIpIHsKIAkJZXJyID0gLUVQUk9CRV9ERUZFUjsKIAkJZ290byBlcnJfY2xrOwogCX0KIAlpZiAoIUlTX0VSUihkYXRhLT5wY2xrKSkgewogCQllcnIgPSBjbGtfcHJlcGFyZV9lbmFibGUoZGF0YS0+cGNsayk7CiAJCWlmIChlcnIpIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBlbmFibGUgYXBiX3BjbGtcbiIpOworCQkJZGV2X2VycihkZXYsICJjb3VsZCBub3QgZW5hYmxlIGFwYl9wY2xrXG4iKTsKIAkJCWdvdG8gZXJyX2NsazsKIAkJfQogCX0KIAotCWRhdGEtPnJzdCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXRfb3B0aW9uYWwoJnBkZXYtPmRldiwgTlVMTCk7CisJZGF0YS0+cnN0ID0gZGV2bV9yZXNldF9jb250cm9sX2dldF9vcHRpb25hbChkZXYsIE5VTEwpOwogCWlmIChJU19FUlIoZGF0YS0+cnN0KSAmJiBQVFJfRVJSKGRhdGEtPnJzdCkgPT0gLUVQUk9CRV9ERUZFUikgewogCQllcnIgPSAtRVBST0JFX0RFRkVSOwogCQlnb3RvIGVycl9wY2xrOwpAQCAtNTA2LDggKzUxMiw4IEBACiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkYXRhKTsKIAotCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZSgmcGRldi0+ZGV2KTsKLQlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoZGV2KTsKKwlwbV9ydW50aW1lX2VuYWJsZShkZXYpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTYxOSw2ICs2MjUsNyBAQAogCXsgIkFQTUMwRDA4IiwgMH0sCiAJeyAiQU1EMDAyMCIsIDAgfSwKIAl7ICJBTURJMDAyMCIsIDAgfSwKKwl7ICJISVNJMDAzMSIsIDAgfSwKIAl7IH0sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShhY3BpLCBkdzgyNTBfYWNwaV9tYXRjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2ZpbnRlay5jIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9maW50ZWsuYwppbmRleCA3MzdiNGIzLi4wZmFjYzc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2ZpbnRlay5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfZmludGVrLmMKQEAgLTMxLDcgKzMxLDcgQEAKICNkZWZpbmUgSU9fQUREUjIgMHg2MAogI2RlZmluZSBMRE4gMHg3CiAKLSNkZWZpbmUgSVJRX01PREUJMHg3MAorI2RlZmluZSBGSU5URUtfSVJRX01PREUJMHg3MAogI2RlZmluZSBJUlFfU0hBUkUJQklUKDQpCiAjZGVmaW5lIElSUV9NT0RFX01BU0sJKEJJVCg2KSB8IEJJVCg1KSkKICNkZWZpbmUgSVJRX0xFVkVMX0xPVwkwCkBAIC0xOTUsNyArMTk1LDcgQEAKIAlvdXRiKExETiwgcGRhdGEtPmJhc2VfcG9ydCArIEFERFJfUE9SVCk7CiAJb3V0YihwZGF0YS0+aW5kZXgsIHBkYXRhLT5iYXNlX3BvcnQgKyBEQVRBX1BPUlQpOwogCi0Jb3V0YihJUlFfTU9ERSwgcGRhdGEtPmJhc2VfcG9ydCArIEFERFJfUE9SVCk7CisJb3V0YihGSU5URUtfSVJRX01PREUsIHBkYXRhLT5iYXNlX3BvcnQgKyBBRERSX1BPUlQpOwogCXRtcCA9IGluYihwZGF0YS0+YmFzZV9wb3J0ICsgREFUQV9QT1JUKTsKIAogCXRtcCAmPSB+SVJRX01PREVfTUFTSzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfbHBzcy5jIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9scHNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg2ZmNmMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfbHBzcy5jCkBAIC0wLDAgKzEsMzc4IEBACisvKgorICogODI1MF9scHNzLmMgLSBEcml2ZXIgZm9yIFVBUlQgb24gSW50ZWwgQnJhc3dlbGwgYW5kIHZhcmlvdXMgb3RoZXIgSW50ZWwgU29DcworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBJbnRlbCBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBBbmR5IFNoZXZjaGVua28gPGFuZHJpeS5zaGV2Y2hlbmtvQGxpbnV4LmludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRpb25hbC5oPgorCisjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CisjaW5jbHVkZSA8bGludXgvZG1hL2R3Lmg+CisKKyNpbmNsdWRlICI4MjUwLmgiCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9RUktfVUFSVHgJMHgwOTM2CisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9CWVRfVUFSVDEJMHgwZjBhCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfQllUX1VBUlQyCTB4MGYwYworCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfQlNXX1VBUlQxCTB4MjI4YQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JTV19VQVJUMgkweDIyOGMKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JEV19VQVJUMQkweDljZTMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9CRFdfVUFSVDIJMHg5Y2U0CisKKy8qIEludGVsIExQU1Mgc3BlY2lmaWMgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgQllUX1BSVl9DTEsJCQkweDgwMAorI2RlZmluZSBCWVRfUFJWX0NMS19FTgkJCUJJVCgwKQorI2RlZmluZSBCWVRfUFJWX0NMS19NX1ZBTF9TSElGVAkJMQorI2RlZmluZSBCWVRfUFJWX0NMS19OX1ZBTF9TSElGVAkJMTYKKyNkZWZpbmUgQllUX1BSVl9DTEtfVVBEQVRFCQlCSVQoMzEpCisKKyNkZWZpbmUgQllUX1RYX09WRl9JTlQJCQkweDgyMAorI2RlZmluZSBCWVRfVFhfT1ZGX0lOVF9NQVNLCQlCSVQoMSkKKworc3RydWN0IGxwc3M4MjUwOworCitzdHJ1Y3QgbHBzczgyNTBfYm9hcmQgeworCXVuc2lnbmVkIGxvbmcgZnJlcTsKKwl1bnNpZ25lZCBpbnQgYmFzZV9iYXVkOworCWludCAoKnNldHVwKShzdHJ1Y3QgbHBzczgyNTAgKiwgc3RydWN0IHVhcnRfcG9ydCAqcCk7CisJdm9pZCAoKmV4aXQpKHN0cnVjdCBscHNzODI1MCAqKTsKK307CisKK3N0cnVjdCBscHNzODI1MCB7CisJaW50IGxpbmU7CisJc3RydWN0IGxwc3M4MjUwX2JvYXJkICpib2FyZDsKKworCS8qIERNQSBwYXJhbWV0ZXJzICovCisJc3RydWN0IHVhcnRfODI1MF9kbWEgZG1hOworCXN0cnVjdCBkd19kbWFfY2hpcCBkbWFfY2hpcDsKKwlzdHJ1Y3QgZHdfZG1hX3NsYXZlIGRtYV9wYXJhbTsKKwl1OCBkbWFfbWF4YnVyc3Q7Cit9OworCitzdGF0aWMgdm9pZCBieXRfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqcCwgc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zLAorCQkJICAgIHN0cnVjdCBrdGVybWlvcyAqb2xkKQoreworCXVuc2lnbmVkIGludCBiYXVkID0gdHR5X3Rlcm1pb3NfYmF1ZF9yYXRlKHRlcm1pb3MpOworCXN0cnVjdCBscHNzODI1MCAqbHBzcyA9IHAtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZyZWYgPSBscHNzLT5ib2FyZC0+ZnJlcSwgZnVhcnQgPSBiYXVkICogMTY7CisJdW5zaWduZWQgbG9uZyB3ID0gQklUKDE1KSAtIDE7CisJdW5zaWduZWQgbG9uZyBtLCBuOworCXUzMiByZWc7CisKKwkvKiBHcmFjZWZ1bGx5IGhhbmRsZSB0aGUgQjAgY2FzZTogZmFsbCBiYWNrIHRvIEI5NjAwICovCisJZnVhcnQgPSBmdWFydCA/IGZ1YXJ0IDogOTYwMCAqIDE2OworCisJLyogR2V0IEZ1YXJ0IGNsb3NlciB0byBGcmVmICovCisJZnVhcnQgKj0gcm91bmRkb3duX3Bvd19vZl90d28oZnJlZiAvIGZ1YXJ0KTsKKworCS8qCisJICogRm9yIGJhdWQgcmF0ZXMgMC41TSwgMU0sIDEuNU0sIDJNLCAyLjVNLCAzTSwgMy41TSBhbmQgNE0gdGhlCisJICogZGl2aWRlcnMgbXVzdCBiZSBhZGp1c3RlZC4KKwkgKgorCSAqIHVhcnRjbGsgPSAobSAvIG4pICogMTAwIE1Ieiwgd2hlcmUgbSA8PSBuCisJICovCisJcmF0aW9uYWxfYmVzdF9hcHByb3hpbWF0aW9uKGZ1YXJ0LCBmcmVmLCB3LCB3LCAmbSwgJm4pOworCXAtPnVhcnRjbGsgPSBmdWFydDsKKworCS8qIFJlc2V0IHRoZSBjbG9jayAqLworCXJlZyA9IChtIDw8IEJZVF9QUlZfQ0xLX01fVkFMX1NISUZUKSB8IChuIDw8IEJZVF9QUlZfQ0xLX05fVkFMX1NISUZUKTsKKwl3cml0ZWwocmVnLCBwLT5tZW1iYXNlICsgQllUX1BSVl9DTEspOworCXJlZyB8PSBCWVRfUFJWX0NMS19FTiB8IEJZVF9QUlZfQ0xLX1VQREFURTsKKwl3cml0ZWwocmVnLCBwLT5tZW1iYXNlICsgQllUX1BSVl9DTEspOworCisJcC0+c3RhdHVzICY9IH5VUFNUQVRfQVVUT0NUUzsKKwlpZiAodGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpCisJCXAtPnN0YXR1cyB8PSBVUFNUQVRfQVVUT0NUUzsKKworCXNlcmlhbDgyNTBfZG9fc2V0X3Rlcm1pb3MocCwgdGVybWlvcywgb2xkKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBieXRfZ2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJdW5zaWduZWQgaW50IHJldCA9IHNlcmlhbDgyNTBfZG9fZ2V0X21jdHJsKHBvcnQpOworCisJLyogRm9yY2UgRENEIGFuZCBEU1Igc2lnbmFscyB0byBwZXJtYW5lbnRseSBiZSByZXBvcnRlZCBhcyBhY3RpdmUgKi8KKwlyZXQgfD0gVElPQ01fQ0FSIHwgVElPQ01fRFNSOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBieXRfc2VyaWFsX3NldHVwKHN0cnVjdCBscHNzODI1MCAqbHBzcywgc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgZHdfZG1hX3NsYXZlICpwYXJhbSA9ICZscHNzLT5kbWFfcGFyYW07CisJc3RydWN0IHVhcnRfODI1MF9wb3J0ICp1cCA9IHVwX3RvX3U4MjUwcChwb3J0KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYocG9ydC0+ZGV2KTsKKwl1bnNpZ25lZCBpbnQgZG1hX2RldmZuID0gUENJX0RFVkZOKFBDSV9TTE9UKHBkZXYtPmRldmZuKSwgMCk7CisJc3RydWN0IHBjaV9kZXYgKmRtYV9kZXYgPSBwY2lfZ2V0X3Nsb3QocGRldi0+YnVzLCBkbWFfZGV2Zm4pOworCisJc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfQllUX1VBUlQxOgorCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9CU1dfVUFSVDE6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JEV19VQVJUMToKKwkJcGFyYW0tPnNyY19pZCA9IDM7CisJCXBhcmFtLT5kc3RfaWQgPSAyOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfQllUX1VBUlQyOgorCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9CU1dfVUFSVDI6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JEV19VQVJUMjoKKwkJcGFyYW0tPnNyY19pZCA9IDU7CisJCXBhcmFtLT5kc3RfaWQgPSA0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwYXJhbS0+ZG1hX2RldiA9ICZkbWFfZGV2LT5kZXY7CisJcGFyYW0tPm1fbWFzdGVyID0gMDsKKwlwYXJhbS0+cF9tYXN0ZXIgPSAxOworCisJLyogVE9ETzogRGV0ZWN0IEZJRk8gc2l6ZSBhdXRvbWF0aWNhbHkgZm9yIERlc2lnbldhcmUgODI1MCAqLworCXBvcnQtPmZpZm9zaXplID0gNjQ7CisJdXAtPnR4X2xvYWRzeiA9IDY0OworCisJbHBzcy0+ZG1hX21heGJ1cnN0ID0gMTY7CisKKwlwb3J0LT5zZXRfdGVybWlvcyA9IGJ5dF9zZXRfdGVybWlvczsKKwlwb3J0LT5nZXRfbWN0cmwgPSBieXRfZ2V0X21jdHJsOworCisJLyogRGlzYWJsZSBUWCBjb3VudGVyIGludGVycnVwdHMgKi8KKwl3cml0ZWwoQllUX1RYX09WRl9JTlRfTUFTSywgcG9ydC0+bWVtYmFzZSArIEJZVF9UWF9PVkZfSU5UKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1NFUklBTF84MjUwX0RNQQorc3RhdGljIGNvbnN0IHN0cnVjdCBkd19kbWFfcGxhdGZvcm1fZGF0YSBxcmtfc2VyaWFsX2RtYV9wZGF0YSA9IHsKKwkubnJfY2hhbm5lbHMgPSAyLAorCS5pc19wcml2YXRlID0gdHJ1ZSwKKwkuaXNfbm9sbHAgPSB0cnVlLAorCS5jaGFuX2FsbG9jYXRpb25fb3JkZXIgPSBDSEFOX0FMTE9DQVRJT05fQVNDRU5ESU5HLAorCS5jaGFuX3ByaW9yaXR5ID0gQ0hBTl9QUklPUklUWV9BU0NFTkRJTkcsCisJLmJsb2NrX3NpemUgPSA0MDk1LAorCS5ucl9tYXN0ZXJzID0gMSwKKwkuZGF0YV93aWR0aCA9IHs0fSwKK307CisKK3N0YXRpYyB2b2lkIHFya19zZXJpYWxfc2V0dXBfZG1hKHN0cnVjdCBscHNzODI1MCAqbHBzcywgc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgdWFydF84MjUwX2RtYSAqZG1hID0gJmxwc3MtPmRtYTsKKwlzdHJ1Y3QgZHdfZG1hX2NoaXAgKmNoaXAgPSAmbHBzcy0+ZG1hX2NoaXA7CisJc3RydWN0IGR3X2RtYV9zbGF2ZSAqcGFyYW0gPSAmbHBzcy0+ZG1hX3BhcmFtOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihwb3J0LT5kZXYpOworCWludCByZXQ7CisKKwljaGlwLT5kZXYgPSAmcGRldi0+ZGV2OworCWNoaXAtPmlycSA9IHBkZXYtPmlycTsKKwljaGlwLT5yZWdzID0gcGNpX2lvcmVtYXBfYmFyKHBkZXYsIDEpOworCWNoaXAtPnBkYXRhID0gJnFya19zZXJpYWxfZG1hX3BkYXRhOworCisJLyogRmFsbGluZyBiYWNrIHRvIFBJTyBtb2RlIGlmIERNQSBwcm9iaW5nIGZhaWxzICovCisJcmV0ID0gZHdfZG1hX3Byb2JlKGNoaXApOworCWlmIChyZXQpCisJCXJldHVybjsKKworCS8qIFNwZWNpYWwgRE1BIGFkZHJlc3MgZm9yIFVBUlQgKi8KKwlkbWEtPnJ4X2RtYV9hZGRyID0gMHhmZmZmZjAwMDsKKwlkbWEtPnR4X2RtYV9hZGRyID0gMHhmZmZmZjAwMDsKKworCXBhcmFtLT5kbWFfZGV2ID0gJnBkZXYtPmRldjsKKwlwYXJhbS0+c3JjX2lkID0gMDsKKwlwYXJhbS0+ZHN0X2lkID0gMTsKKwlwYXJhbS0+aHNfcG9sYXJpdHkgPSB0cnVlOworCisJbHBzcy0+ZG1hX21heGJ1cnN0ID0gODsKK30KKworc3RhdGljIHZvaWQgcXJrX3NlcmlhbF9leGl0X2RtYShzdHJ1Y3QgbHBzczgyNTAgKmxwc3MpCit7CisJc3RydWN0IGR3X2RtYV9zbGF2ZSAqcGFyYW0gPSAmbHBzcy0+ZG1hX3BhcmFtOworCisJaWYgKCFwYXJhbS0+ZG1hX2RldikKKwkJcmV0dXJuOworCWR3X2RtYV9yZW1vdmUoJmxwc3MtPmRtYV9jaGlwKTsKK30KKyNlbHNlCS8qIENPTkZJR19TRVJJQUxfODI1MF9ETUEgKi8KK3N0YXRpYyB2b2lkIHFya19zZXJpYWxfc2V0dXBfZG1hKHN0cnVjdCBscHNzODI1MCAqbHBzcywgc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkge30KK3N0YXRpYyB2b2lkIHFya19zZXJpYWxfZXhpdF9kbWEoc3RydWN0IGxwc3M4MjUwICpscHNzKSB7fQorI2VuZGlmCS8qICFDT05GSUdfU0VSSUFMXzgyNTBfRE1BICovCisKK3N0YXRpYyBpbnQgcXJrX3NlcmlhbF9zZXR1cChzdHJ1Y3QgbHBzczgyNTAgKmxwc3MsIHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KHBvcnQtPmRldik7CisJaW50IHJldDsKKworCXJldCA9IHBjaV9hbGxvY19pcnFfdmVjdG9ycyhwZGV2LCAxLCAxLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXBvcnQtPmlycSA9IHBjaV9pcnFfdmVjdG9yKHBkZXYsIDApOworCisJcXJrX3NlcmlhbF9zZXR1cF9kbWEobHBzcywgcG9ydCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHFya19zZXJpYWxfZXhpdChzdHJ1Y3QgbHBzczgyNTAgKmxwc3MpCit7CisJcXJrX3NlcmlhbF9leGl0X2RtYShscHNzKTsKK30KKworc3RhdGljIGJvb2wgbHBzczgyNTBfZG1hX2ZpbHRlcihzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIHZvaWQgKnBhcmFtKQoreworCXN0cnVjdCBkd19kbWFfc2xhdmUgKmR3cyA9IHBhcmFtOworCisJaWYgKGR3cy0+ZG1hX2RldiAhPSBjaGFuLT5kZXZpY2UtPmRldikKKwkJcmV0dXJuIGZhbHNlOworCisJY2hhbi0+cHJpdmF0ZSA9IGR3czsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludCBscHNzODI1MF9kbWFfc2V0dXAoc3RydWN0IGxwc3M4MjUwICpscHNzLCBzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHVhcnRfODI1MF9kbWEgKmRtYSA9ICZscHNzLT5kbWE7CisJc3RydWN0IGR3X2RtYV9zbGF2ZSAqcnhfcGFyYW0sICp0eF9wYXJhbTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBwb3J0LT5wb3J0LmRldjsKKworCWlmICghbHBzcy0+ZG1hX3BhcmFtLmRtYV9kZXYpCisJCXJldHVybiAwOworCisJcnhfcGFyYW0gPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnJ4X3BhcmFtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyeF9wYXJhbSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0eF9wYXJhbSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqdHhfcGFyYW0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXR4X3BhcmFtKQorCQlyZXR1cm4gLUVOT01FTTsKKworCSpyeF9wYXJhbSA9IGxwc3MtPmRtYV9wYXJhbTsKKwlkbWEtPnJ4Y29uZi5zcmNfbWF4YnVyc3QgPSBscHNzLT5kbWFfbWF4YnVyc3Q7CisKKwkqdHhfcGFyYW0gPSBscHNzLT5kbWFfcGFyYW07CisJZG1hLT50eGNvbmYuZHN0X21heGJ1cnN0ID0gbHBzcy0+ZG1hX21heGJ1cnN0OworCisJZG1hLT5mbiA9IGxwc3M4MjUwX2RtYV9maWx0ZXI7CisJZG1hLT5yeF9wYXJhbSA9IHJ4X3BhcmFtOworCWRtYS0+dHhfcGFyYW0gPSB0eF9wYXJhbTsKKworCXBvcnQtPmRtYSA9IGRtYTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBscHNzODI1MF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1YXJ0XzgyNTBfcG9ydCB1YXJ0OworCXN0cnVjdCBscHNzODI1MCAqbHBzczsKKwlpbnQgcmV0OworCisJcmV0ID0gcGNpbV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWxwc3MgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpscHNzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFscHNzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxwc3MtPmJvYXJkID0gKHN0cnVjdCBscHNzODI1MF9ib2FyZCAqKWlkLT5kcml2ZXJfZGF0YTsKKworCW1lbXNldCgmdWFydCwgMCwgc2l6ZW9mKHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCkpOworCisJdWFydC5wb3J0LmRldiA9ICZwZGV2LT5kZXY7CisJdWFydC5wb3J0LmlycSA9IHBkZXYtPmlycTsKKwl1YXJ0LnBvcnQucHJpdmF0ZV9kYXRhID0gbHBzczsKKwl1YXJ0LnBvcnQudHlwZSA9IFBPUlRfMTY1NTBBOworCXVhcnQucG9ydC5pb3R5cGUgPSBVUElPX01FTTsKKwl1YXJ0LnBvcnQucmVnc2hpZnQgPSAyOworCXVhcnQucG9ydC51YXJ0Y2xrID0gbHBzcy0+Ym9hcmQtPmJhc2VfYmF1ZCAqIDE2OworCXVhcnQucG9ydC5mbGFncyA9IFVQRl9TSEFSRV9JUlEgfCBVUEZfRklYRURfUE9SVCB8IFVQRl9GSVhFRF9UWVBFOworCXVhcnQuY2FwYWJpbGl0aWVzID0gVUFSVF9DQVBfRklGTyB8IFVBUlRfQ0FQX0FGRTsKKwl1YXJ0LnBvcnQubWFwYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwl1YXJ0LnBvcnQubWVtYmFzZSA9IHBjaW1faW9tYXAocGRldiwgMCwgMCk7CisJaWYgKCF1YXJ0LnBvcnQubWVtYmFzZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBscHNzLT5ib2FyZC0+c2V0dXAobHBzcywgJnVhcnQucG9ydCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGxwc3M4MjUwX2RtYV9zZXR1cChscHNzLCAmdWFydCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZXhpdDsKKworCXJldCA9IHNlcmlhbDgyNTBfcmVnaXN0ZXJfODI1MF9wb3J0KCZ1YXJ0KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfZXhpdDsKKworCWxwc3MtPmxpbmUgPSByZXQ7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgbHBzcyk7CisJcmV0dXJuIDA7CisKK2Vycl9leGl0OgorCWlmIChscHNzLT5ib2FyZC0+ZXhpdCkKKwkJbHBzcy0+Ym9hcmQtPmV4aXQobHBzcyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbHBzczgyNTBfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBscHNzODI1MCAqbHBzcyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChscHNzLT5ib2FyZC0+ZXhpdCkKKwkJbHBzcy0+Ym9hcmQtPmV4aXQobHBzcyk7CisKKwlzZXJpYWw4MjUwX3VucmVnaXN0ZXJfcG9ydChscHNzLT5saW5lKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBscHNzODI1MF9ib2FyZCBieXRfYm9hcmQgPSB7CisJLmZyZXEgPSAxMDAwMDAwMDAsCisJLmJhc2VfYmF1ZCA9IDI3NjQ4MDAsCisJLnNldHVwID0gYnl0X3NlcmlhbF9zZXR1cCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbHBzczgyNTBfYm9hcmQgcXJrX2JvYXJkID0geworCS5mcmVxID0gNDQyMzY4MDAsCisJLmJhc2VfYmF1ZCA9IDI3NjQ4MDAsCisJLnNldHVwID0gcXJrX3NlcmlhbF9zZXR1cCwKKwkuZXhpdCA9IHFya19zZXJpYWxfZXhpdCwKK307CisKKyNkZWZpbmUgTFBTU19ERVZJQ0UoaWQsIGJvYXJkKSB7IFBDSV9WREVWSUNFKElOVEVMLCBpZCksIChrZXJuZWxfdWxvbmdfdCkmYm9hcmQgfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpX2lkc1tdID0geworCUxQU1NfREVWSUNFKFBDSV9ERVZJQ0VfSURfSU5URUxfUVJLX1VBUlR4LCBxcmtfYm9hcmQpLAorCUxQU1NfREVWSUNFKFBDSV9ERVZJQ0VfSURfSU5URUxfQllUX1VBUlQxLCBieXRfYm9hcmQpLAorCUxQU1NfREVWSUNFKFBDSV9ERVZJQ0VfSURfSU5URUxfQllUX1VBUlQyLCBieXRfYm9hcmQpLAorCUxQU1NfREVWSUNFKFBDSV9ERVZJQ0VfSURfSU5URUxfQlNXX1VBUlQxLCBieXRfYm9hcmQpLAorCUxQU1NfREVWSUNFKFBDSV9ERVZJQ0VfSURfSU5URUxfQlNXX1VBUlQyLCBieXRfYm9hcmQpLAorCUxQU1NfREVWSUNFKFBDSV9ERVZJQ0VfSURfSU5URUxfQkRXX1VBUlQxLCBieXRfYm9hcmQpLAorCUxQU1NfREVWSUNFKFBDSV9ERVZJQ0VfSURfSU5URUxfQkRXX1VBUlQyLCBieXRfYm9hcmQpLAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcGNpX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBscHNzODI1MF9wY2lfZHJpdmVyID0geworCS5uYW1lICAgICAgICAgICA9ICI4MjUwX2xwc3MiLAorCS5pZF90YWJsZSAgICAgICA9IHBjaV9pZHMsCisJLnByb2JlICAgICAgICAgID0gbHBzczgyNTBfcHJvYmUsCisJLnJlbW92ZSAgICAgICAgID0gbHBzczgyNTBfcmVtb3ZlLAorfTsKKworbW9kdWxlX3BjaV9kcml2ZXIobHBzczgyNTBfcGNpX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkludGVsIENvcnBvcmF0aW9uIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIExQU1MgVUFSVCBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfbWlkLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX21pZC5jCmluZGV4IDMzOWRlOWMuLjM5YzIzMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfbWlkLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9taWQuYwpAQCAtOTksMjcgKzk5LDI3IEBACiAJc3RydWN0IHVhcnRfODI1MF9wb3J0ICp1cCA9IHVwX3RvX3U4MjUwcChwKTsKIAl1bnNpZ25lZCBpbnQgZmlzciA9IHNlcmlhbF9wb3J0X2luKHAsIElOVEVMX01JRF9VQVJUX0ROVl9GSVNSKTsKIAl1MzIgc3RhdHVzOwotCWludCByZXQgPSBJUlFfTk9ORTsKKwlpbnQgcmV0ID0gMDsKIAlpbnQgZXJyOwogCiAJaWYgKGZpc3IgJiBCSVQoMikpIHsKIAkJZXJyID0gaHN1X2RtYV9nZXRfc3RhdHVzKCZtaWQtPmRtYV9jaGlwLCAxLCAmc3RhdHVzKTsKIAkJaWYgKGVyciA+IDApIHsKIAkJCXNlcmlhbDgyNTBfcnhfZG1hX2ZsdXNoKHVwKTsKLQkJCXJldCB8PSBJUlFfSEFORExFRDsKKwkJCXJldCB8PSAxOwogCQl9IGVsc2UgaWYgKGVyciA9PSAwKQogCQkJcmV0IHw9IGhzdV9kbWFfZG9faXJxKCZtaWQtPmRtYV9jaGlwLCAxLCBzdGF0dXMpOwogCX0KIAlpZiAoZmlzciAmIEJJVCgxKSkgewogCQllcnIgPSBoc3VfZG1hX2dldF9zdGF0dXMoJm1pZC0+ZG1hX2NoaXAsIDAsICZzdGF0dXMpOwogCQlpZiAoZXJyID4gMCkKLQkJCXJldCB8PSBJUlFfSEFORExFRDsKKwkJCXJldCB8PSAxOwogCQllbHNlIGlmIChlcnIgPT0gMCkKIAkJCXJldCB8PSBoc3VfZG1hX2RvX2lycSgmbWlkLT5kbWFfY2hpcCwgMCwgc3RhdHVzKTsKIAl9CiAJaWYgKGZpc3IgJiBCSVQoMCkpCiAJCXJldCB8PSBzZXJpYWw4MjUwX2hhbmRsZV9pcnEocCwgc2VyaWFsX3BvcnRfaW4ocCwgVUFSVF9JSVIpKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiBJUlFfUkVUVkFMKHJldCk7CiB9CiAKICNkZWZpbmUgRE5WX0RNQV9DSEFOX09GRlNFVCAweDgwCkBAIC0xNjgsNiArMTY4LDkgQEAKIAl1bnNpZ25lZCBsb25nIHcgPSBCSVQoMjQpIC0gMTsKIAl1bnNpZ25lZCBsb25nIG11bCwgZGl2OwogCisJLyogR3JhY2VmdWxseSBoYW5kbGUgdGhlIEIwIGNhc2U6IGZhbGwgYmFjayB0byBCOTYwMCAqLworCWZ1YXJ0ID0gZnVhcnQgPyBmdWFydCA6IDk2MDAgKiAxNjsKKwogCWlmIChtaWQtPmJvYXJkLT5mcmVxIDwgZnVhcnQpIHsKIAkJLyogRmluZCBwcmVzY2FsZXIgdmFsdWUgdGhhdCBzYXRpc2ZpZXMgRnVhcnQgPCBGcmVmICovCiAJCWlmIChtaWQtPmJvYXJkLT5mcmVxID4gYmF1ZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfbXRrLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX210ay5jCmluZGV4IDM2MTFlYzkuLmNlMGNjNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfbXRrLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9tdGsuYwpAQCAtNjIsNyArNjIsNyBAQAogCSAqLwogCWJhdWQgPSB1YXJ0X2dldF9iYXVkX3JhdGUocG9ydCwgdGVybWlvcywgb2xkLAogCQkJCSAgcG9ydC0+dWFydGNsayAvIDE2IC8gMHhmZmZmLAotCQkJCSAgcG9ydC0+dWFydGNsayAvIDE2KTsKKwkJCQkgIHBvcnQtPnVhcnRjbGspOwogCiAJaWYgKGJhdWQgPD0gMTE1MjAwKSB7CiAJCXNlcmlhbF9wb3J0X291dChwb3J0LCBVQVJUX01US19ISUdIUywgMHgwKTsKQEAgLTc2LDEwICs3Niw2IEBACiAJCXF1b3QgPSBESVZfUk9VTkRfVVAocG9ydC0+dWFydGNsaywgNCAqIGJhdWQpOwogCX0gZWxzZSB7CiAJCXNlcmlhbF9wb3J0X291dChwb3J0LCBVQVJUX01US19ISUdIUywgMHgzKTsKLQotCQkvKiBTZXQgdG8gaGlnaGVzdCBiYXVkcmF0ZSBzdXBwb3J0ZWQgKi8KLQkJaWYgKGJhdWQgPj0gMTE1MjAwMCkKLQkJCWJhdWQgPSA5MjE2MDA7CiAJCXF1b3QgPSBESVZfUk9VTkRfVVAocG9ydC0+dWFydGNsaywgMjU2ICogYmF1ZCk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX29mLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX29mLmMKaW5kZXggMzg5NjNkNy4uN2E4YjVmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9vZi5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfb2YuYwpAQCAtMTk1LDYgKzE5NSw3IEBACiAJc3dpdGNoIChwb3J0X3R5cGUpIHsKIAljYXNlIFBPUlRfODI1MCAuLi4gUE9SVF9NQVhfODI1MDoKIAl7CisJCXUzMiB0eF90aHJlc2hvbGQ7CiAJCXN0cnVjdCB1YXJ0XzgyNTBfcG9ydCBwb3J0ODI1MDsKIAkJbWVtc2V0KCZwb3J0ODI1MCwgMCwgc2l6ZW9mKHBvcnQ4MjUwKSk7CiAJCXBvcnQ4MjUwLnBvcnQgPSBwb3J0OwpAQCAtMjAyLDYgKzIwMywxMiBAQAogCQlpZiAocG9ydC5maWZvc2l6ZSkKIAkJCXBvcnQ4MjUwLmNhcGFiaWxpdGllcyA9IFVBUlRfQ0FQX0ZJRk87CiAKKwkJLyogQ2hlY2sgZm9yIFRYIEZJRk8gdGhyZXNob2xkICYgc2V0IHR4X2xvYWRzeiAqLworCQlpZiAoKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG9mZGV2LT5kZXYub2Zfbm9kZSwgInR4LXRocmVzaG9sZCIsCisJCQkJCSAgJnR4X3RocmVzaG9sZCkgPT0gMCkgJiYKKwkJICAgICh0eF90aHJlc2hvbGQgPCBwb3J0LmZpZm9zaXplKSkKKwkJCXBvcnQ4MjUwLnR4X2xvYWRzeiA9IHBvcnQuZmlmb3NpemUgLSB0eF90aHJlc2hvbGQ7CisKIAkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChvZmRldi0+ZGV2Lm9mX25vZGUsCiAJCQkJCSAgImF1dG8tZmxvdy1jb250cm9sIikpCiAJCQlwb3J0ODI1MC5jYXBhYmlsaXRpZXMgfD0gVUFSVF9DQVBfQUZFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9vbWFwLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX29tYXAuYwppbmRleCBlMTQ5ODJmLi42MWFkNmMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX29tYXAuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX29tYXAuYwpAQCAtMTM0LDIxICsxMzQsMTggQEAKIAogCXNlcmlhbDgyNTBfZG9fc2V0X21jdHJsKHBvcnQsIG1jdHJsKTsKIAotCWlmIChJU19FUlJfT1JfTlVMTChtY3RybF9ncGlvX3RvX2dwaW9kKHVwLT5ncGlvcywKLQkJCQkJCVVBUlRfR1BJT19SVFMpKSkgewotCQkvKgotCQkgKiBUdXJuIG9mZiBhdXRvUlRTIGlmIFJUUyBpcyBsb3dlcmVkIGFuZCByZXN0b3JlIGF1dG9SVFMKLQkJICogc2V0dGluZyBpZiBSVFMgaXMgcmFpc2VkCi0JCSAqLwotCQlsY3IgPSBzZXJpYWxfaW4odXAsIFVBUlRfTENSKTsKLQkJc2VyaWFsX291dCh1cCwgVUFSVF9MQ1IsIFVBUlRfTENSX0NPTkZfTU9ERV9CKTsKLQkJaWYgKChtY3RybCAmIFRJT0NNX1JUUykgJiYgKHBvcnQtPnN0YXR1cyAmIFVQU1RBVF9BVVRPUlRTKSkKLQkJCXByaXYtPmVmciB8PSBVQVJUX0VGUl9SVFM7Ci0JCWVsc2UKLQkJCXByaXYtPmVmciAmPSB+VUFSVF9FRlJfUlRTOwotCQlzZXJpYWxfb3V0KHVwLCBVQVJUX0VGUiwgcHJpdi0+ZWZyKTsKLQkJc2VyaWFsX291dCh1cCwgVUFSVF9MQ1IsIGxjcik7Ci0JfQorCS8qCisJICogVHVybiBvZmYgYXV0b1JUUyBpZiBSVFMgaXMgbG93ZXJlZCBhbmQgcmVzdG9yZSBhdXRvUlRTIHNldHRpbmcKKwkgKiBpZiBSVFMgaXMgcmFpc2VkCisJICovCisJbGNyID0gc2VyaWFsX2luKHVwLCBVQVJUX0xDUik7CisJc2VyaWFsX291dCh1cCwgVUFSVF9MQ1IsIFVBUlRfTENSX0NPTkZfTU9ERV9CKTsKKwlpZiAoKG1jdHJsICYgVElPQ01fUlRTKSAmJiAocG9ydC0+c3RhdHVzICYgVVBTVEFUX0FVVE9SVFMpKQorCQlwcml2LT5lZnIgfD0gVUFSVF9FRlJfUlRTOworCWVsc2UKKwkJcHJpdi0+ZWZyICY9IH5VQVJUX0VGUl9SVFM7CisJc2VyaWFsX291dCh1cCwgVUFSVF9FRlIsIHByaXYtPmVmcik7CisJc2VyaWFsX291dCh1cCwgVUFSVF9MQ1IsIGxjcik7CiB9CiAKIC8qCkBAIC00NDksOSArNDQ2LDcgQEAKIAlwcml2LT5lZnIgPSAwOwogCXVwLT5wb3J0LnN0YXR1cyAmPSB+KFVQU1RBVF9BVVRPQ1RTIHwgVVBTVEFUX0FVVE9SVFMgfCBVUFNUQVRfQVVUT1hPRkYpOwogCi0JaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTICYmIHVwLT5wb3J0LmZsYWdzICYgVVBGX0hBUkRfRkxPVwotCQkmJiBJU19FUlJfT1JfTlVMTChtY3RybF9ncGlvX3RvX2dwaW9kKHVwLT5ncGlvcywKLQkJCQkJCQlVQVJUX0dQSU9fUlRTKSkpIHsKKwlpZiAodGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMgJiYgdXAtPnBvcnQuZmxhZ3MgJiBVUEZfSEFSRF9GTE9XKSB7CiAJCS8qIEVuYWJsZSBBVVRPQ1RTIChhdXRvUlRTIGlzIGVuYWJsZWQgd2hlbiBSVFMgaXMgcmFpc2VkKSAqLwogCQl1cC0+cG9ydC5zdGF0dXMgfD0gVVBTVEFUX0FVVE9DVFMgfCBVUFNUQVRfQVVUT1JUUzsKIAkJcHJpdi0+ZWZyIHw9IFVBUlRfRUZSX0NUUzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfcGNpLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX3BjaS5jCmluZGV4IDIwZWJhZWEuLmI5OGMxNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfcGNpLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9wY2kuYwpAQCAtMjEsMTQgKzIxLDEwIEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC84MjUwX3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L3JhdGlvbmFsLmg+CiAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLSNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL2RtYS1kdy5oPgotCiAjaW5jbHVkZSAiODI1MC5oIgogCiAvKgpAQCAtMTM0OSwxNjAgKzEzNDUsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9CWVRfVUFSVDEJMHgwZjBhCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfQllUX1VBUlQyCTB4MGYwYwotCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfQlNXX1VBUlQxCTB4MjI4YQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JTV19VQVJUMgkweDIyOGMKLQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JEV19VQVJUMQkweDljZTMKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9CRFdfVUFSVDIJMHg5Y2U0Ci0KLSNkZWZpbmUgQllUX1BSVl9DTEsJCQkweDgwMAotI2RlZmluZSBCWVRfUFJWX0NMS19FTgkJCSgxIDw8IDApCi0jZGVmaW5lIEJZVF9QUlZfQ0xLX01fVkFMX1NISUZUCQkxCi0jZGVmaW5lIEJZVF9QUlZfQ0xLX05fVkFMX1NISUZUCQkxNgotI2RlZmluZSBCWVRfUFJWX0NMS19VUERBVEUJCSgxIDw8IDMxKQotCi0jZGVmaW5lIEJZVF9UWF9PVkZfSU5UCQkJMHg4MjAKLSNkZWZpbmUgQllUX1RYX09WRl9JTlRfTUFTSwkJKDEgPDwgMSkKLQotc3RhdGljIHZvaWQKLWJ5dF9zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICpwLCBzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MsCi0JCXN0cnVjdCBrdGVybWlvcyAqb2xkKQotewotCXVuc2lnbmVkIGludCBiYXVkID0gdHR5X3Rlcm1pb3NfYmF1ZF9yYXRlKHRlcm1pb3MpOwotCXVuc2lnbmVkIGxvbmcgZnJlZiA9IDEwMDAwMDAwMCwgZnVhcnQgPSBiYXVkICogMTY7Ci0JdW5zaWduZWQgbG9uZyB3ID0gQklUKDE1KSAtIDE7Ci0JdW5zaWduZWQgbG9uZyBtLCBuOwotCXUzMiByZWc7Ci0KLQkvKiBHcmFjZWZ1bGx5IGhhbmRsZSB0aGUgQjAgY2FzZTogZmFsbCBiYWNrIHRvIEI5NjAwICovCi0JZnVhcnQgPSBmdWFydCA/IGZ1YXJ0IDogOTYwMCAqIDE2OwotCi0JLyogR2V0IEZ1YXJ0IGNsb3NlciB0byBGcmVmICovCi0JZnVhcnQgKj0gcm91bmRkb3duX3Bvd19vZl90d28oZnJlZiAvIGZ1YXJ0KTsKLQotCS8qCi0JICogRm9yIGJhdWQgcmF0ZXMgMC41TSwgMU0sIDEuNU0sIDJNLCAyLjVNLCAzTSwgMy41TSBhbmQgNE0gdGhlCi0JICogZGl2aWRlcnMgbXVzdCBiZSBhZGp1c3RlZC4KLQkgKgotCSAqIHVhcnRjbGsgPSAobSAvIG4pICogMTAwIE1Ieiwgd2hlcmUgbSA8PSBuCi0JICovCi0JcmF0aW9uYWxfYmVzdF9hcHByb3hpbWF0aW9uKGZ1YXJ0LCBmcmVmLCB3LCB3LCAmbSwgJm4pOwotCXAtPnVhcnRjbGsgPSBmdWFydDsKLQotCS8qIFJlc2V0IHRoZSBjbG9jayAqLwotCXJlZyA9IChtIDw8IEJZVF9QUlZfQ0xLX01fVkFMX1NISUZUKSB8IChuIDw8IEJZVF9QUlZfQ0xLX05fVkFMX1NISUZUKTsKLQl3cml0ZWwocmVnLCBwLT5tZW1iYXNlICsgQllUX1BSVl9DTEspOwotCXJlZyB8PSBCWVRfUFJWX0NMS19FTiB8IEJZVF9QUlZfQ0xLX1VQREFURTsKLQl3cml0ZWwocmVnLCBwLT5tZW1iYXNlICsgQllUX1BSVl9DTEspOwotCi0JcC0+c3RhdHVzICY9IH5VUFNUQVRfQVVUT0NUUzsKLQlpZiAodGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpCi0JCXAtPnN0YXR1cyB8PSBVUFNUQVRfQVVUT0NUUzsKLQotCXNlcmlhbDgyNTBfZG9fc2V0X3Rlcm1pb3MocCwgdGVybWlvcywgb2xkKTsKLX0KLQotc3RhdGljIGJvb2wgYnl0X2RtYV9maWx0ZXIoc3RydWN0IGRtYV9jaGFuICpjaGFuLCB2b2lkICpwYXJhbSkKLXsKLQlzdHJ1Y3QgZHdfZG1hX3NsYXZlICpkd3MgPSBwYXJhbTsKLQotCWlmIChkd3MtPmRtYV9kZXYgIT0gY2hhbi0+ZGV2aWNlLT5kZXYpCi0JCXJldHVybiBmYWxzZTsKLQotCWNoYW4tPnByaXZhdGUgPSBkd3M7Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWJ5dF9nZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKLXsKLQl1bnNpZ25lZCBpbnQgcmV0ID0gc2VyaWFsODI1MF9kb19nZXRfbWN0cmwocG9ydCk7Ci0KLQkvKiBGb3JjZSBEQ0QgYW5kIERTUiBzaWduYWxzIHRvIHBlcm1hbmVudGx5IGJlIHJlcG9ydGVkIGFzIGFjdGl2ZS4gKi8KLQlyZXQgfD0gVElPQ01fQ0FSIHwgVElPQ01fRFNSOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludAotYnl0X3NlcmlhbF9zZXR1cChzdHJ1Y3Qgc2VyaWFsX3ByaXZhdGUgKnByaXYsCi0JCSBjb25zdCBzdHJ1Y3QgcGNpc2VyaWFsX2JvYXJkICpib2FyZCwKLQkJIHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqcG9ydCwgaW50IGlkeCkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHByaXYtPmRldjsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBwb3J0LT5wb3J0LmRldjsKLQlzdHJ1Y3QgdWFydF84MjUwX2RtYSAqZG1hOwotCXN0cnVjdCBkd19kbWFfc2xhdmUgKnR4X3BhcmFtLCAqcnhfcGFyYW07Ci0Jc3RydWN0IHBjaV9kZXYgKmRtYV9kZXY7Ci0JaW50IHJldDsKLQotCWRtYSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZG1hKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkbWEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JdHhfcGFyYW0gPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnR4X3BhcmFtKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0eF9wYXJhbSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyeF9wYXJhbSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcnhfcGFyYW0pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJ4X3BhcmFtKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXN3aXRjaCAocGRldi0+ZGV2aWNlKSB7Ci0JY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JZVF9VQVJUMToKLQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfQlNXX1VBUlQxOgotCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9CRFdfVUFSVDE6Ci0JCXJ4X3BhcmFtLT5zcmNfaWQgPSAzOwotCQl0eF9wYXJhbS0+ZHN0X2lkID0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JZVF9VQVJUMjoKLQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfQlNXX1VBUlQyOgotCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9CRFdfVUFSVDI6Ci0JCXJ4X3BhcmFtLT5zcmNfaWQgPSA1OwotCQl0eF9wYXJhbS0+ZHN0X2lkID0gNDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcnhfcGFyYW0tPm1fbWFzdGVyID0gMDsKLQlyeF9wYXJhbS0+cF9tYXN0ZXIgPSAxOwotCi0JZG1hLT5yeGNvbmYuc3JjX21heGJ1cnN0ID0gMTY7Ci0KLQl0eF9wYXJhbS0+bV9tYXN0ZXIgPSAwOwotCXR4X3BhcmFtLT5wX21hc3RlciA9IDE7Ci0KLQlkbWEtPnR4Y29uZi5kc3RfbWF4YnVyc3QgPSAxNjsKLQotCWRtYV9kZXYgPSBwY2lfZ2V0X3Nsb3QocGRldi0+YnVzLCBQQ0lfREVWRk4oUENJX1NMT1QocGRldi0+ZGV2Zm4pLCAwKSk7Ci0JcnhfcGFyYW0tPmRtYV9kZXYgPSAmZG1hX2Rldi0+ZGV2OwotCXR4X3BhcmFtLT5kbWFfZGV2ID0gJmRtYV9kZXYtPmRldjsKLQotCWRtYS0+Zm4gPSBieXRfZG1hX2ZpbHRlcjsKLQlkbWEtPnJ4X3BhcmFtID0gcnhfcGFyYW07Ci0JZG1hLT50eF9wYXJhbSA9IHR4X3BhcmFtOwotCi0JcmV0ID0gcGNpX2RlZmF1bHRfc2V0dXAocHJpdiwgYm9hcmQsIHBvcnQsIGlkeCk7Ci0JcG9ydC0+cG9ydC5pb3R5cGUgPSBVUElPX01FTTsKLQlwb3J0LT5wb3J0LnR5cGUgPSBQT1JUXzE2NTUwQTsKLQlwb3J0LT5wb3J0LmZsYWdzID0gKHBvcnQtPnBvcnQuZmxhZ3MgfCBVUEZfRklYRURfUE9SVCB8IFVQRl9GSVhFRF9UWVBFKTsKLQlwb3J0LT5wb3J0LnNldF90ZXJtaW9zID0gYnl0X3NldF90ZXJtaW9zOwotCXBvcnQtPnBvcnQuZ2V0X21jdHJsID0gYnl0X2dldF9tY3RybDsKLQlwb3J0LT5wb3J0LmZpZm9zaXplID0gNjQ7Ci0JcG9ydC0+dHhfbG9hZHN6ID0gNjQ7Ci0JcG9ydC0+ZG1hID0gZG1hOwotCXBvcnQtPmNhcGFiaWxpdGllcyA9IFVBUlRfQ0FQX0ZJRk8gfCBVQVJUX0NBUF9BRkU7Ci0KLQkvKiBEaXNhYmxlIFR4IGNvdW50ZXIgaW50ZXJydXB0cyAqLwotCXdyaXRlbChCWVRfVFhfT1ZGX0lOVF9NQVNLLCBwb3J0LT5wb3J0Lm1lbWJhc2UgKyBCWVRfVFhfT1ZGX0lOVCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCiBzdGF0aWMgaW50CiBwY2lfb21lZ2FwY2lfc2V0dXAoc3RydWN0IHNlcmlhbF9wcml2YXRlICpwcml2LAogCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNpc2VyaWFsX2JvYXJkICpib2FyZCwKQEAgLTE3NDEsNiArMTU4MywxOSBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VYQVJfWFIxN1Y0MzU4CTB4NDM1OAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VYQVJfWFIxN1Y4MzU4CTB4ODM1OAogCisjZGVmaW5lIFVBUlRfRVhBUl9NUElPSU5UXzdfMAkweDhmCS8qIE1QSU9JTlRbNzowXSAqLworI2RlZmluZSBVQVJUX0VYQVJfTVBJT0xWTF83XzAJMHg5MAkvKiBNUElPTFZMWzc6MF0gKi8KKyNkZWZpbmUgVUFSVF9FWEFSX01QSU8zVF83XzAJMHg5MQkvKiBNUElPM1RbNzowXSAqLworI2RlZmluZSBVQVJUX0VYQVJfTVBJT0lOVl83XzAJMHg5MgkvKiBNUElPSU5WWzc6MF0gKi8KKyNkZWZpbmUgVUFSVF9FWEFSX01QSU9TRUxfN18wCTB4OTMJLyogTVBJT1NFTFs3OjBdICovCisjZGVmaW5lIFVBUlRfRVhBUl9NUElPT0RfN18wCTB4OTQJLyogTVBJT09EWzc6MF0gKi8KKyNkZWZpbmUgVUFSVF9FWEFSX01QSU9JTlRfMTVfOAkweDk1CS8qIE1QSU9JTlRbMTU6OF0gKi8KKyNkZWZpbmUgVUFSVF9FWEFSX01QSU9MVkxfMTVfOAkweDk2CS8qIE1QSU9MVkxbMTU6OF0gKi8KKyNkZWZpbmUgVUFSVF9FWEFSX01QSU8zVF8xNV84CTB4OTcJLyogTVBJTzNUWzE1OjhdICovCisjZGVmaW5lIFVBUlRfRVhBUl9NUElPSU5WXzE1XzgJMHg5OAkvKiBNUElPSU5WWzE1OjhdICovCisjZGVmaW5lIFVBUlRfRVhBUl9NUElPU0VMXzE1XzgJMHg5OQkvKiBNUElPU0VMWzE1OjhdICovCisjZGVmaW5lIFVBUlRfRVhBUl9NUElPT0RfMTVfOAkweDlhCS8qIE1QSU9PRFsxNTo4XSAqLworCiBzdGF0aWMgaW50CiBwY2lfeHIxN2MxNTRfc2V0dXAoc3RydWN0IHNlcmlhbF9wcml2YXRlICpwcml2LAogCQkgIGNvbnN0IHN0cnVjdCBwY2lzZXJpYWxfYm9hcmQgKmJvYXJkLApAQCAtMTc4MywxOCArMTYzOCwxOCBAQAogCSAqIFNldHVwIE11bHRpcHVycG9zZSBJbnB1dC9PdXRwdXQgcGlucy4KIAkgKi8KIAlpZiAoaWR4ID09IDApIHsKLQkJd3JpdGViKDB4MDAsIHAgKyAweDhmKTsgLypNUElPSU5UWzc6MF0qLwotCQl3cml0ZWIoMHgwMCwgcCArIDB4OTApOyAvKk1QSU9MVkxbNzowXSovCi0JCXdyaXRlYigweDAwLCBwICsgMHg5MSk7IC8qTVBJTzNUWzc6MF0qLwotCQl3cml0ZWIoMHgwMCwgcCArIDB4OTIpOyAvKk1QSU9JTlZbNzowXSovCi0JCXdyaXRlYigweDAwLCBwICsgMHg5Myk7IC8qTVBJT1NFTFs3OjBdKi8KLQkJd3JpdGViKDB4MDAsIHAgKyAweDk0KTsgLypNUElPT0RbNzowXSovCi0JCXdyaXRlYigweDAwLCBwICsgMHg5NSk7IC8qTVBJT0lOVFsxNTo4XSovCi0JCXdyaXRlYigweDAwLCBwICsgMHg5Nik7IC8qTVBJT0xWTFsxNTo4XSovCi0JCXdyaXRlYigweDAwLCBwICsgMHg5Nyk7IC8qTVBJTzNUWzE1OjhdKi8KLQkJd3JpdGViKDB4MDAsIHAgKyAweDk4KTsgLypNUElPSU5WWzE1OjhdKi8KLQkJd3JpdGViKDB4MDAsIHAgKyAweDk5KTsgLypNUElPU0VMWzE1OjhdKi8KLQkJd3JpdGViKDB4MDAsIHAgKyAweDlhKTsgLypNUElPT0RbMTU6OF0qLworCQl3cml0ZWIoMHgwMCwgcCArIFVBUlRfRVhBUl9NUElPSU5UXzdfMCk7CisJCXdyaXRlYigweDAwLCBwICsgVUFSVF9FWEFSX01QSU9MVkxfN18wKTsKKwkJd3JpdGViKDB4MDAsIHAgKyBVQVJUX0VYQVJfTVBJTzNUXzdfMCk7CisJCXdyaXRlYigweDAwLCBwICsgVUFSVF9FWEFSX01QSU9JTlZfN18wKTsKKwkJd3JpdGViKDB4MDAsIHAgKyBVQVJUX0VYQVJfTVBJT1NFTF83XzApOworCQl3cml0ZWIoMHgwMCwgcCArIFVBUlRfRVhBUl9NUElPT0RfN18wKTsKKwkJd3JpdGViKDB4MDAsIHAgKyBVQVJUX0VYQVJfTVBJT0lOVF8xNV84KTsKKwkJd3JpdGViKDB4MDAsIHAgKyBVQVJUX0VYQVJfTVBJT0xWTF8xNV84KTsKKwkJd3JpdGViKDB4MDAsIHAgKyBVQVJUX0VYQVJfTVBJTzNUXzE1XzgpOworCQl3cml0ZWIoMHgwMCwgcCArIFVBUlRfRVhBUl9NUElPSU5WXzE1XzgpOworCQl3cml0ZWIoMHgwMCwgcCArIFVBUlRfRVhBUl9NUElPU0VMXzE1XzgpOworCQl3cml0ZWIoMHgwMCwgcCArIFVBUlRfRVhBUl9NUElPT0RfMTVfOCk7CiAJfQogCXdyaXRlYigweDAwLCBwICsgVUFSVF9FWEFSXzhYTU9ERSk7CiAJd3JpdGViKFVBUlRfRkNUUl9FWEFSX1RSR0QsIHAgKyBVQVJUX0VYQVJfRkNUUik7CkBAIC0xODMwLDIwICsxNjg1LDIwIEBACiAJCXN3aXRjaCAocHJpdi0+ZGV2LT5kZXZpY2UpIHsKIAkJY2FzZSBQQ0lfREVWSUNFX0lEX0NPTU1URUNIXzQyMjJQQ0kzMzU6CiAJCWNhc2UgUENJX0RFVklDRV9JRF9DT01NVEVDSF80MjI0UENJMzM1OgotCQkJd3JpdGViKDB4NzgsIHAgKyAweDkwKTsgLyogTVBJT0xWTFs3OjBdICovCi0JCQl3cml0ZWIoMHgwMCwgcCArIDB4OTIpOyAvKiBNUElPSU5WWzc6MF0gKi8KLQkJCXdyaXRlYigweDAwLCBwICsgMHg5Myk7IC8qIE1QSU9TRUxbNzowXSAqLworCQkJd3JpdGViKDB4NzgsIHAgKyBVQVJUX0VYQVJfTVBJT0xWTF83XzApOworCQkJd3JpdGViKDB4MDAsIHAgKyBVQVJUX0VYQVJfTVBJT0lOVl83XzApOworCQkJd3JpdGViKDB4MDAsIHAgKyBVQVJUX0VYQVJfTVBJT1NFTF83XzApOwogCQkJYnJlYWs7CiAJCWNhc2UgUENJX0RFVklDRV9JRF9DT01NVEVDSF8yMzI0UENJMzM1OgogCQljYXNlIFBDSV9ERVZJQ0VfSURfQ09NTVRFQ0hfMjMyOFBDSTMzNToKLQkJCXdyaXRlYigweDAwLCBwICsgMHg5MCk7IC8qIE1QSU9MVkxbNzowXSAqLwotCQkJd3JpdGViKDB4YzAsIHAgKyAweDkyKTsgLyogTVBJT0lOVls3OjBdICovCi0JCQl3cml0ZWIoMHhjMCwgcCArIDB4OTMpOyAvKiBNUElPU0VMWzc6MF0gKi8KKwkJCXdyaXRlYigweDAwLCBwICsgVUFSVF9FWEFSX01QSU9MVkxfN18wKTsKKwkJCXdyaXRlYigweGMwLCBwICsgVUFSVF9FWEFSX01QSU9JTlZfN18wKTsKKwkJCXdyaXRlYigweGMwLCBwICsgVUFSVF9FWEFSX01QSU9TRUxfN18wKTsKIAkJCWJyZWFrOwogCQl9Ci0JCXdyaXRlYigweDAwLCBwICsgMHg4Zik7IC8qIE1QSU9JTlRbNzowXSAqLwotCQl3cml0ZWIoMHgwMCwgcCArIDB4OTEpOyAvKiBNUElPM1RbNzowXSAqLwotCQl3cml0ZWIoMHgwMCwgcCArIDB4OTQpOyAvKiBNUElPT0RbNzowXSAqLworCQl3cml0ZWIoMHgwMCwgcCArIFVBUlRfRVhBUl9NUElPSU5UXzdfMCk7CisJCXdyaXRlYigweDAwLCBwICsgVUFSVF9FWEFSX01QSU8zVF83XzApOworCQl3cml0ZWIoMHgwMCwgcCArIFVBUlRfRVhBUl9NUElPT0RfN18wKTsKIAl9CiAJd3JpdGViKDB4MDAsIHAgKyBVQVJUX0VYQVJfOFhNT0RFKTsKIAl3cml0ZWIoVUFSVF9GQ1RSX0VYQVJfVFJHRCwgcCArIFVBUlRfRVhBUl9GQ1RSKTsKQEAgLTE5MzQsNyArMTc4OSw2IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ09NTVRFQ0hfNDIyMlBDSUUJMHgwMDIyCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQlJPQURDT01fVFJVTUFOQUdFIDB4MTYwYQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNQ0NfQURESURBVEFfQVBDSTc4MDAgMHg4MThlCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfUVJLX1VBUlQJMHgwOTM2CiAKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9TVU5JWAkJMHgxZmQ0CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU1VOSVhfMTk5OQkweDE5OTkKQEAgLTE5NTAsNiArMTgwNCw0MyBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BFUklDT01fUEk3QzlYNzk1NAkweDc5NTQKICNkZWZpbmUgUENJX0RFVklDRV9JRF9QRVJJQ09NX1BJN0M5WDc5NTgJMHg3OTU4CiAKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BQ0NFU0lPCQkJMHg0OTRmCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTV8yU0RCCTB4MTA1MQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fTVBDSUVfQ09NXzJTCTB4MTA1MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT01fNFNEQgkweDEwNUMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX01QQ0lFX0NPTV80UwkweDEwNUUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NMjMyXzJEQgkweDEwOTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX01QQ0lFX0NPTTIzMl8yCTB4MTA5MworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT00yMzJfNERCCTB4MTA5OQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fTVBDSUVfQ09NMjMyXzQJMHgxMDlCCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTV8yU01EQgkweDEwRDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX01QQ0lFX0NPTV8yU00JMHgxMEQzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTV80U01EQgkweDEwREEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX01QQ0lFX0NPTV80U00JMHgxMERDCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19NUENJRV9JQ000ODVfMQkweDExMDgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX01QQ0lFX0lDTTQyMl8yCTB4MTExMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fTVBDSUVfSUNNNDg1XzIJMHgxMTExCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19NUENJRV9JQ000MjJfNAkweDExMTgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX01QQ0lFX0lDTTQ4NV80CTB4MTExOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9JQ01fMlMJMHgxMTUyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0lDTV80UwkweDExNUEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfSUNNMjMyXzIJMHgxMTkwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19NUENJRV9JQ00yMzJfMgkweDExOTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfSUNNMjMyXzQJMHgxMTk4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19NUENJRV9JQ00yMzJfNAkweDExOTkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfSUNNXzJTTQkweDExRDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NNDIyXzQJMHgxMDVBCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTTQ4NV80CTB4MTA1QgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT000MjJfOAkweDEwNkEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NNDg1XzgJMHgxMDZCCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTTIzMl80CTB4MTA5OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT00yMzJfOAkweDEwQTkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NXzRTTQkweDEwRDkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NXzhTTQkweDEwRTkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfSUNNXzRTTQkweDExRDgKKworCisKIC8qIFVua25vd24gdmVuZG9ycy9jYXJkcyAtIHRoaXMgc2hvdWxkIG5vdCBiZSBpbiBsaW51eC9wY2lfaWRzLmggKi8KICNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9VTktOT1dOXzB4MTU4NAkweDE1ODQKICNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9VTktOT1dOXzB4MTU4OAkweDE1ODgKQEAgLTIwNDEsNDggKzE5MzIsNiBAQAogCQkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKIAkJLnNldHVwCQk9IGt0X3NlcmlhbF9zZXR1cCwKIAl9LAotCXsKLQkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCQkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfSU5URUxfQllUX1VBUlQxLAotCQkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKLQkJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCi0JCS5zZXR1cAkJPSBieXRfc2VyaWFsX3NldHVwLAotCX0sCi0JewotCQkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9JTlRFTF9CWVRfVUFSVDIsCi0JCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAotCQkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKLQkJLnNldHVwCQk9IGJ5dF9zZXJpYWxfc2V0dXAsCi0JfSwKLQl7Ci0JCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JTV19VQVJUMSwKLQkJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCi0JCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAotCQkuc2V0dXAJCT0gYnl0X3NlcmlhbF9zZXR1cCwKLQl9LAotCXsKLQkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCQkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfSU5URUxfQlNXX1VBUlQyLAotCQkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKLQkJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCi0JCS5zZXR1cAkJPSBieXRfc2VyaWFsX3NldHVwLAotCX0sCi0JewotCQkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9JTlRFTF9CRFdfVUFSVDEsCi0JCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAotCQkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKLQkJLnNldHVwCQk9IGJ5dF9zZXJpYWxfc2V0dXAsCi0JfSwKLQl7Ci0JCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JEV19VQVJUMiwKLQkJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCi0JCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAotCQkuc2V0dXAJCT0gYnl0X3NlcmlhbF9zZXR1cCwKLQl9LAogCS8qCiAJICogSVRFCiAJICovCkBAIC0yOTU1LDggKzI4MDQsNiBAQAogCXBibl9BRERJREFUQV9QQ0llXzRfMzkwNjI1MCwKIAlwYm5fQURESURBVEFfUENJZV84XzM5MDYyNTAsCiAJcGJuX2NlNDEwMF8xXzExNTIwMCwKLQlwYm5fYnl0LAotCXBibl9xcmssCiAJcGJuX29tZWdhcGNpLAogCXBibl9ORVRNT1M5OTAwXzJzXzExNTIwMCwKIAlwYm5fYnJjbV90cnVtYW5hZ2UsCkBAIC0zNzMyLDE4ICszNTc5LDYgQEAKIAkJLmJhc2VfYmF1ZAk9IDkyMTYwMCwKIAkJLnJlZ19zaGlmdCAgICAgID0gMiwKIAl9LAotCVtwYm5fYnl0XSA9IHsKLQkJLmZsYWdzCQk9IEZMX0JBU0UwLAotCQkubnVtX3BvcnRzCT0gMSwKLQkJLmJhc2VfYmF1ZAk9IDI3NjQ4MDAsCi0JCS5yZWdfc2hpZnQgICAgICA9IDIsCi0JfSwKLQlbcGJuX3Fya10gPSB7Ci0JCS5mbGFncwkJPSBGTF9CQVNFMCwKLQkJLm51bV9wb3J0cwk9IDEsCi0JCS5iYXNlX2JhdWQJPSAyNzY0ODAwLAotCQkucmVnX3NoaWZ0CT0gMiwKLQl9LAogCVtwYm5fb21lZ2FwY2ldID0gewogCQkuZmxhZ3MJCT0gRkxfQkFTRTAsCiAJCS5udW1fcG9ydHMJPSA4LApAQCAtMzg1NSw2ICszNjkwLDE1IEBACiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgwODFkKSwgfSwKIAl7IFBDSV9WREVWSUNFKElOVEVMLCAweDExOTEpLCB9LAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MTlkOCksIH0sCisKKwkvKiBJbnRlbCBwbGF0Zm9ybXMgd2l0aCBEZXNpZ25XYXJlIFVBUlQgKi8KKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDA5MzYpLCB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MGYwYSksIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgwZjBjKSwgfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDIyOGEpLCB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjI4YyksIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHg5Y2UzKSwgfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDljZTQpLCB9LAogfTsKIAogLyoKQEAgLTUxMTMsNiArNDk1NywxMDggQEAKIAkJMCwKIAkJMCwgcGJuX3Blcmljb21fUEk3QzlYNzk1OCB9LAogCS8qCisJICogQUNDRVMgSS9PIFByb2R1Y3RzIHF1YWQKKwkgKi8KKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NXzJTREIsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTQgfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX01QQ0lFX0NPTV8yUywKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1NCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT01fNFNEQiwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1NCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fTVBDSUVfQ09NXzRTLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU0IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTTIzMl8yREIsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTQgfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX01QQ0lFX0NPTTIzMl8yLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU0IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTTIzMl80REIsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTQgfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX01QQ0lFX0NPTTIzMl80LAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU0IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTV8yU01EQiwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1NCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fTVBDSUVfQ09NXzJTTSwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1NCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT01fNFNNREIsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTQgfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX01QQ0lFX0NPTV80U00sCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTQgfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX01QQ0lFX0lDTTQ4NV8xLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU0IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19NUENJRV9JQ000MjJfMiwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1NCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fTVBDSUVfSUNNNDg1XzIsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTQgfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX01QQ0lFX0lDTTQyMl80LAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU0IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19NUENJRV9JQ000ODVfNCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1NCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9JQ01fMlMsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTQgfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfSUNNXzRTLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU0IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0lDTTIzMl8yLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU0IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19NUENJRV9JQ00yMzJfMiwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1NCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9JQ00yMzJfNCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1NCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fTVBDSUVfSUNNMjMyXzQsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTQgfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfSUNNXzJTTSwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1NCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT000MjJfNCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1OCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT000ODVfNCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1OCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT000MjJfOCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1OCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT000ODVfOCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1OCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT00yMzJfNCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1OCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT00yMzJfOCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1OCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT01fNFNNLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU4IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTV84U00sCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTggfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfSUNNXzRTTSwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1OCB9LAorCS8qCiAJICogVG9waWMgVFA1NjAgRGF0YS9GYXgvVm9pY2UgNTZrIG1vZGVtIChyZXBvcnRlZCBieSBFdmFuIENsYXJrZSkKIAkgKi8KIAl7CVBDSV9WRU5ET1JfSURfVE9QSUMsIFBDSV9ERVZJQ0VfSURfVE9QSUNfVFA1NjAsCkBAIC01NTIwLDQwICs1NDY2LDcgQEAKIAl7CVBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfQ0U0MTAwX1VBUlQsCiAJCVBDSV9BTllfSUQsICBQQ0lfQU5ZX0lELCAwLCAwLAogCQlwYm5fY2U0MTAwXzFfMTE1MjAwIH0sCi0JLyogSW50ZWwgQmF5VHJhaWwgKi8KLQl7CVBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfQllUX1VBUlQxLAotCQlQQ0lfQU5ZX0lELCAgUENJX0FOWV9JRCwKLQkJUENJX0NMQVNTX0NPTU1VTklDQVRJT05fU0VSSUFMIDw8IDgsIDB4ZmYwMDAwLAotCQlwYm5fYnl0IH0sCi0JewlQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0JZVF9VQVJUMiwKLQkJUENJX0FOWV9JRCwgIFBDSV9BTllfSUQsCi0JCVBDSV9DTEFTU19DT01NVU5JQ0FUSU9OX1NFUklBTCA8PCA4LCAweGZmMDAwMCwKLQkJcGJuX2J5dCB9LAotCXsJUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9CU1dfVUFSVDEsCi0JCVBDSV9BTllfSUQsICBQQ0lfQU5ZX0lELAotCQlQQ0lfQ0xBU1NfQ09NTVVOSUNBVElPTl9TRVJJQUwgPDwgOCwgMHhmZjAwMDAsCi0JCXBibl9ieXQgfSwKLQl7CVBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfQlNXX1VBUlQyLAotCQlQQ0lfQU5ZX0lELCAgUENJX0FOWV9JRCwKLQkJUENJX0NMQVNTX0NPTU1VTklDQVRJT05fU0VSSUFMIDw8IDgsIDB4ZmYwMDAwLAotCQlwYm5fYnl0IH0sCiAKLQkvKiBJbnRlbCBCcm9hZHdlbGwgKi8KLQl7CVBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfQkRXX1VBUlQxLAotCQlQQ0lfQU5ZX0lELCAgUENJX0FOWV9JRCwKLQkJUENJX0NMQVNTX0NPTU1VTklDQVRJT05fU0VSSUFMIDw8IDgsIDB4ZmYwMDAwLAotCQlwYm5fYnl0IH0sCi0JewlQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0JEV19VQVJUMiwKLQkJUENJX0FOWV9JRCwgIFBDSV9BTllfSUQsCi0JCVBDSV9DTEFTU19DT01NVU5JQ0FUSU9OX1NFUklBTCA8PCA4LCAweGZmMDAwMCwKLQkJcGJuX2J5dCB9LAotCi0JLyoKLQkgKiBJbnRlbCBRdWFyayB4MTAwMAotCSAqLwotCXsJUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9RUktfVUFSVCwKLQkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKLQkJcGJuX3FyayB9LAogCS8qCiAJICogQ3Jvbnl4IE9tZWdhIFBDSQogCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9wb3J0LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX3BvcnQuYwppbmRleCA3NDgxYjk1Li4xYmZiNmZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX3BvcnQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX3BvcnQuYwpAQCAtMTc4LDcgKzE3OCw3IEBACiAJCS5maWZvX3NpemUJPSAxNiwKIAkJLnR4X2xvYWRzegk9IDE2LAogCQkuZmNyCQk9IFVBUlRfRkNSX0VOQUJMRV9GSUZPIHwgVUFSVF9GQ1JfUl9UUklHXzAwLAotCQkuZmxhZ3MJCT0gVUFSVF9DQVBfRklGTyB8IFVBUlRfQ0FQX0FGRSwKKwkJLmZsYWdzCQk9IFVBUlRfQ0FQX0ZJRk8gLyogfCBVQVJUX0NBUF9BRkUgKi8sCiAJfSwKIAlbUE9SVF9VNl8xNjU1MEFdID0gewogCQkubmFtZQkJPSAiVTZfMTY1NTBBIiwKQEAgLTU4NSwxMSArNTg1LDExIEBACiAgKi8KIGludCBzZXJpYWw4MjUwX2VtNDg1X2luaXQoc3RydWN0IHVhcnRfODI1MF9wb3J0ICpwKQogewotCWlmIChwLT5lbTQ4NSAhPSBOVUxMKQorCWlmIChwLT5lbTQ4NSkKIAkJcmV0dXJuIDA7CiAKIAlwLT5lbTQ4NSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1YXJ0XzgyNTBfZW00ODUpLCBHRlBfQVRPTUlDKTsKLQlpZiAocC0+ZW00ODUgPT0gTlVMTCkKKwlpZiAoIXAtPmVtNDg1KQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXNldHVwX3RpbWVyKCZwLT5lbTQ4NS0+c3RvcF90eF90aW1lciwKQEAgLTYxOSw3ICs2MTksNyBAQAogICovCiB2b2lkIHNlcmlhbDgyNTBfZW00ODVfZGVzdHJveShzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnApCiB7Ci0JaWYgKHAtPmVtNDg1ID09IE5VTEwpCisJaWYgKCFwLT5lbTQ4NSkKIAkJcmV0dXJuOwogCiAJZGVsX3RpbWVyKCZwLT5lbTQ4NS0+c3RhcnRfdHhfdGltZXIpOwpAQCAtMTQwMiwxMCArMTQwMiw4IEBACiAKIHN0YXRpYyB2b2lkIF9fZG9fc3RvcF90eF9yczQ4NShzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnApCiB7Ci0JaWYgKCFwLT5lbTQ4NSkKLQkJcmV0dXJuOwotCiAJc2VyaWFsODI1MF9lbTQ4NV9ydHNfYWZ0ZXJfc2VuZChwKTsKKwogCS8qCiAJICogRW1wdHkgdGhlIFJYIEZJRk8sIHdlIGFyZSBub3QgaW50ZXJlc3RlZCBpbiBhbnl0aGluZwogCSAqIHJlY2VpdmVkIGR1cmluZyB0aGUgaGFsZi1kdXBsZXggdHJhbnNtaXNzaW9uLgpAQCAtMTQxNCwxMiArMTQxMiw4IEBACiAJaWYgKCEocC0+cG9ydC5yczQ4NS5mbGFncyAmIFNFUl9SUzQ4NV9SWF9EVVJJTkdfVFgpKSB7CiAJCXNlcmlhbDgyNTBfY2xlYXJfZmlmb3MocCk7CiAKLQkJc2VyaWFsODI1MF9ycG1fZ2V0KHApOwotCiAJCXAtPmllciB8PSBVQVJUX0lFUl9STFNJIHwgVUFSVF9JRVJfUkRJOwogCQlzZXJpYWxfcG9ydF9vdXQoJnAtPnBvcnQsIFVBUlRfSUVSLCBwLT5pZXIpOwotCi0JCXNlcmlhbDgyNTBfcnBtX3B1dChwKTsKIAl9CiB9CiAKQEAgLTE0MjksNiArMTQyMyw3IEBACiAJc3RydWN0IHVhcnRfODI1MF9lbTQ4NSAqZW00ODUgPSBwLT5lbTQ4NTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJc2VyaWFsODI1MF9ycG1fZ2V0KHApOwogCXNwaW5fbG9ja19pcnFzYXZlKCZwLT5wb3J0LmxvY2ssIGZsYWdzKTsKIAlpZiAoZW00ODUgJiYKIAkgICAgZW00ODUtPmFjdGl2ZV90aW1lciA9PSAmZW00ODUtPnN0b3BfdHhfdGltZXIpIHsKQEAgLTE0MzYsMTUgKzE0MzEsMTMgQEAKIAkJZW00ODUtPmFjdGl2ZV90aW1lciA9IE5VTEw7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnAtPnBvcnQubG9jaywgZmxhZ3MpOworCXNlcmlhbDgyNTBfcnBtX3B1dChwKTsKIH0KIAogc3RhdGljIHZvaWQgX19zdG9wX3R4X3JzNDg1KHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqcCkKIHsKIAlzdHJ1Y3QgdWFydF84MjUwX2VtNDg1ICplbTQ4NSA9IHAtPmVtNDg1OwogCi0JaWYgKCFlbTQ4NSkKLQkJcmV0dXJuOwotCiAJLyoKIAkgKiBfX2RvX3N0b3BfdHhfcnM0ODUgaXMgZ29pbmcgdG8gc2V0IFJUUyBhY2NvcmRpbmcgdG8gY29uZmlnCiAJICogQU5EIGZsdXNoIFJYIEZJRk8gaWYgcmVxdWlyZWQuCkBAIC0xNDc1LDcgKzE0NjgsNyBAQAogCQl1bnNpZ25lZCBjaGFyIGxzciA9IHNlcmlhbF9pbihwLCBVQVJUX0xTUik7CiAJCS8qCiAJCSAqIFRvIHByb3ZpZGUgcmVxdWlyZWQgdGltZWluZyBhbmQgYWxsb3cgRklGTyB0cmFuc2ZlciwKLQkJICogX19zdG9wX3R4X3JzNDg1IG11c3QgYmUgY2FsbGVkIG9ubHkgd2hlbiBib3RoIEZJRk8gYW5kCisJCSAqIF9fc3RvcF90eF9yczQ4NSgpIG11c3QgYmUgY2FsbGVkIG9ubHkgd2hlbiBib3RoIEZJRk8gYW5kCiAJCSAqIHNoaWZ0IHJlZ2lzdGVyIGFyZSBlbXB0eS4gSXQgaXMgZm9yIGRldmljZSBkcml2ZXIgdG8gZW5hYmxlCiAJCSAqIGludGVycnVwdCBvbiBURU1ULgogCQkgKi8KQEAgLTE0ODQsOSArMTQ3NywxMCBAQAogCiAJCWRlbF90aW1lcigmZW00ODUtPnN0YXJ0X3R4X3RpbWVyKTsKIAkJZW00ODUtPmFjdGl2ZV90aW1lciA9IE5VTEw7CisKKwkJX19zdG9wX3R4X3JzNDg1KHApOwogCX0KIAlfX2RvX3N0b3BfdHgocCk7Ci0JX19zdG9wX3R4X3JzNDg1KHApOwogfQogCiBzdGF0aWMgdm9pZCBzZXJpYWw4MjUwX3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKQEAgLTE2MTgsOCArMTYxMiw2IEBACiAJaWYgKHVwLT5idWdzICYgVUFSVF9CVUdfTk9NU1IpCiAJCXJldHVybjsKIAotCW1jdHJsX2dwaW9fZGlzYWJsZV9tcyh1cC0+Z3Bpb3MpOwotCiAJdXAtPmllciAmPSB+VUFSVF9JRVJfTVNJOwogCXNlcmlhbF9wb3J0X291dChwb3J0LCBVQVJUX0lFUiwgdXAtPmllcik7CiB9CkBAIC0xNjMyLDggKzE2MjQsNiBAQAogCWlmICh1cC0+YnVncyAmIFVBUlRfQlVHX05PTVNSKQogCQlyZXR1cm47CiAKLQltY3RybF9ncGlvX2VuYWJsZV9tcyh1cC0+Z3Bpb3MpOwotCiAJdXAtPmllciB8PSBVQVJUX0lFUl9NU0k7CiAKIAlzZXJpYWw4MjUwX3JwbV9nZXQodXApOwpAQCAtMTg4MCw2ICsxODcwLDMwIEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyoKKyAqIE5ld2VyIDE2NTUwIGNvbXBhdGlibGUgcGFydHMgc3VjaCBhcyB0aGUgU0MxNkM2NTAgJiBBbHRlcmEgMTY1NTAgU29mdCBJUAorICogaGF2ZSBhIHByb2dyYW1tYWJsZSBUWCB0aHJlc2hvbGQgdGhhdCB0cmlnZ2VycyB0aGUgVEhSRSBpbnRlcnJ1cHQgaW4KKyAqIHRoZSBJSVIgcmVnaXN0ZXIuIEluIHRoaXMgY2FzZSwgdGhlIFRIUkUgaW50ZXJydXB0IGluZGljYXRlcyB0aGUgRklGTworICogaGFzIHNwYWNlIGF2YWlsYWJsZS4gTG9hZCBpdCB1cCB3aXRoIHR4X2xvYWRzeiBieXRlcy4KKyAqLworc3RhdGljIGludCBzZXJpYWw4MjUwX3R4X3RocmVzaG9sZF9oYW5kbGVfaXJxKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgaWlyID0gc2VyaWFsX3BvcnRfaW4ocG9ydCwgVUFSVF9JSVIpOworCisJLyogVFggVGhyZXNob2xkIElSUSB0cmlnZ2VyZWQgc28gbG9hZCB1cCBGSUZPICovCisJaWYgKChpaXIgJiBVQVJUX0lJUl9JRCkgPT0gVUFSVF9JSVJfVEhSSSkgeworCQlzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVwID0gdXBfdG9fdTgyNTBwKHBvcnQpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJCXNlcmlhbDgyNTBfdHhfY2hhcnModXApOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJfQorCisJaWlyID0gc2VyaWFsX3BvcnRfaW4ocG9ydCwgVUFSVF9JSVIpOworCXJldHVybiBzZXJpYWw4MjUwX2hhbmRsZV9pcnEocG9ydCwgaWlyKTsKK30KKwogc3RhdGljIHVuc2lnbmVkIGludCBzZXJpYWw4MjUwX3R4X2VtcHR5KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IHVhcnRfODI1MF9wb3J0ICp1cCA9IHVwX3RvX3U4MjUwcChwb3J0KTsKQEAgLTE5MTcsOCArMTkzMSw3IEBACiAJCXJldCB8PSBUSU9DTV9EU1I7CiAJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0NUUykKIAkJcmV0IHw9IFRJT0NNX0NUUzsKLQotCXJldHVybiBtY3RybF9ncGlvX2dldCh1cC0+Z3Bpb3MsICZyZXQpOworCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzZXJpYWw4MjUwX2RvX2dldF9tY3RybCk7CiAKQEAgLTE5OTMsNiArMjAwNiw3IEBACiAJCWlmICgtLXRtb3V0ID09IDApCiAJCQlicmVhazsKIAkJdWRlbGF5KDEpOworCQl0b3VjaF9ubWlfd2F0Y2hkb2coKTsKIAl9CiAKIAkvKiBXYWl0IHVwIHRvIDFzIGZvciBmbG93IGNvbnRyb2wgaWYgbmVjZXNzYXJ5ICovCkBAIC0yMTY5LDYgKzIxODMsMjUgQEAKIAkJc2VyaWFsX3BvcnRfb3V0KHBvcnQsIFVBUlRfTENSLCAwKTsKIAl9CiAKKwkvKgorCSAqIEZvciB0aGUgQWx0ZXJhIDE2NTUwIHZhcmlhbnRzLCBzZXQgVFggdGhyZXNob2xkIHRyaWdnZXIgbGV2ZWwuCisJICovCisJaWYgKCgocG9ydC0+dHlwZSA9PSBQT1JUX0FMVFJfMTY1NTBfRjMyKSB8fAorCSAgICAgKHBvcnQtPnR5cGUgPT0gUE9SVF9BTFRSXzE2NTUwX0Y2NCkgfHwKKwkgICAgIChwb3J0LT50eXBlID09IFBPUlRfQUxUUl8xNjU1MF9GMTI4KSkgJiYgKHBvcnQtPmZpZm9zaXplID4gMSkpIHsKKwkJLyogQm91bmRzIGNoZWNraW5nIG9mIFRYIHRocmVzaG9sZCAodmFsaWQgMCB0byBmaWZvc2l6ZS0yKSAqLworCQlpZiAoKHVwLT50eF9sb2Fkc3ogPCAyKSB8fCAodXAtPnR4X2xvYWRzeiA+IHBvcnQtPmZpZm9zaXplKSkgeworCQkJcHJfZXJyKCJ0dHlTJWQgVFggRklGTyBUaHJlc2hvbGQgZXJyb3JzLCBza2lwcGluZ1xuIiwKKwkJCSAgICAgICBzZXJpYWxfaW5kZXgocG9ydCkpOworCQl9IGVsc2UgeworCQkJc2VyaWFsX3BvcnRfb3V0KHBvcnQsIFVBUlRfQUxUUl9BRlIsCisJCQkJCVVBUlRfQUxUUl9FTl9UWEZJRk9fTFcpOworCQkJc2VyaWFsX3BvcnRfb3V0KHBvcnQsIFVBUlRfQUxUUl9UWF9MT1csCisJCQkJCXBvcnQtPmZpZm9zaXplIC0gdXAtPnR4X2xvYWRzeik7CisJCQlwb3J0LT5oYW5kbGVfaXJxID0gc2VyaWFsODI1MF90eF90aHJlc2hvbGRfaGFuZGxlX2lycTsKKwkJfQorCX0KKwogCWlmIChwb3J0LT5pcnEpIHsKIAkJdW5zaWduZWQgY2hhciBpaXIxOwogCQkvKgpAQCAtMjUwNCw4ICsyNTM3LDYgQEAKIAkJCQkJICAgICBzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MsCiAJCQkJCSAgICAgc3RydWN0IGt0ZXJtaW9zICpvbGQpCiB7Ci0JdW5zaWduZWQgaW50IHRvbGVyYW5jZSA9IHBvcnQtPnVhcnRjbGsgLyAxMDA7Ci0KIAkvKgogCSAqIEFzayB0aGUgY29yZSB0byBjYWxjdWxhdGUgdGhlIGRpdmlzb3IgZm9yIHVzLgogCSAqIEFsbG93IDElIHRvbGVyYW5jZSBhdCB0aGUgdXBwZXIgbGltaXQgc28gdWFydCBjbGtzIG1hcmdpbmFsbHkKQEAgLTI1MTQsNyArMjU0NSw3IEBACiAJICovCiAJcmV0dXJuIHVhcnRfZ2V0X2JhdWRfcmF0ZShwb3J0LCB0ZXJtaW9zLCBvbGQsCiAJCQkJICBwb3J0LT51YXJ0Y2xrIC8gMTYgLyAweGZmZmYsCi0JCQkJICAocG9ydC0+dWFydGNsayArIHRvbGVyYW5jZSkgLyAxNik7CisJCQkJICBwb3J0LT51YXJ0Y2xrKTsKIH0KIAogdm9pZApAQCAtMjU1MSwxMiArMjU4Miw5IEBACiAJLyoKIAkgKiBNQ1ItYmFzZWQgYXV0byBmbG93IGNvbnRyb2wuICBXaGVuIEFGRSBpcyBlbmFibGVkLCBSVFMgd2lsbCBiZQogCSAqIGRlYXNzZXJ0ZWQgd2hlbiB0aGUgcmVjZWl2ZSBGSUZPIGNvbnRhaW5zIG1vcmUgY2hhcmFjdGVycyB0aGFuCi0JICogdGhlIHRyaWdnZXIsIG9yIHRoZSBNQ1IgUlRTIGJpdCBpcyBjbGVhcmVkLiAgSW4gdGhlIGNhc2Ugd2hlcmUKLQkgKiB0aGUgcmVtb3RlIFVBUlQgaXMgbm90IHVzaW5nIENUUyBhdXRvIGZsb3cgY29udHJvbCwgd2UgbXVzdAotCSAqIGhhdmUgc3VmZmljaWVudCBGSUZPIGVudHJpZXMgZm9yIHRoZSBsYXRlbmN5IG9mIHRoZSByZW1vdGUKLQkgKiBVQVJUIHRvIHJlc3BvbmQuICBJT1csIGF0IGxlYXN0IDMyIGJ5dGVzIG9mIEZJRk8uCisJICogdGhlIHRyaWdnZXIsIG9yIHRoZSBNQ1IgUlRTIGJpdCBpcyBjbGVhcmVkLgogCSAqLwotCWlmICh1cC0+Y2FwYWJpbGl0aWVzICYgVUFSVF9DQVBfQUZFICYmIHBvcnQtPmZpZm9zaXplID49IDMyKSB7CisJaWYgKHVwLT5jYXBhYmlsaXRpZXMgJiBVQVJUX0NBUF9BRkUpIHsKIAkJdXAtPm1jciAmPSB+VUFSVF9NQ1JfQUZFOwogCQlpZiAodGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpCiAJCQl1cC0+bWNyIHw9IFVBUlRfTUNSX0FGRTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwL0tjb25maWcgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC9LY29uZmlnCmluZGV4IGM5ZWM4MzkuLjg5OTgzNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwL0tjb25maWcKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvS2NvbmZpZwpAQCAtNiw3ICs2LDYgQEAKIGNvbmZpZyBTRVJJQUxfODI1MAogCXRyaXN0YXRlICI4MjUwLzE2NTUwIGFuZCBjb21wYXRpYmxlIHNlcmlhbCBzdXBwb3J0IgogCXNlbGVjdCBTRVJJQUxfQ09SRQotCXNlbGVjdCBTRVJJQUxfTUNUUkxfR1BJTyBpZiBHUElPTElCCiAJLS0taGVscC0tLQogCSAgVGhpcyBzZWxlY3RzIHdoZXRoZXIgeW91IHdhbnQgdG8gaW5jbHVkZSB0aGUgZHJpdmVyIGZvciB0aGUgc3RhbmRhcmQKIAkgIHNlcmlhbCBwb3J0cy4gIFRoZSBzdGFuZGFyZCBhbnN3ZXIgaXMgWS4gIFBlb3BsZSB3aG8gbWlnaHQgc2F5IE4KQEAgLTEyMSw3ICsxMjAsNiBAQAogCXRyaXN0YXRlICI4MjUwLzE2NTUwIFBDSSBkZXZpY2Ugc3VwcG9ydCIgaWYgRVhQRVJUCiAJZGVwZW5kcyBvbiBTRVJJQUxfODI1MCAmJiBQQ0kKIAlkZWZhdWx0IFNFUklBTF84MjUwCi0Jc2VsZWN0IFJBVElPTkFMCiAJaGVscAogCSAgVGhpcyBidWlsZHMgc3RhbmRhcmQgUENJIHNlcmlhbCBzdXBwb3J0LiBZb3UgbWF5IGJlIGFibGUgdG8KIAkgIGRpc2FibGUgdGhpcyBmZWF0dXJlIGlmIHlvdSBvbmx5IG5lZWQgbGVnYWN5IHNlcmlhbCBzdXBwb3J0LgpAQCAtNDAzLDYgKzQwMSwyMSBAQAogCSAgSWYgeW91IGhhdmUgYSBzeXN0ZW0gdXNpbmcgYW4gSW5nZW5pYyBTb0MgYW5kIHdpc2ggdG8gbWFrZSB1c2Ugb2YKIAkgIGl0cyBVQVJUcywgc2F5IFkgdG8gdGhpcyBvcHRpb24uIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBTRVJJQUxfODI1MF9MUFNTCisJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIHNlcmlhbCBwb3J0cyBvbiBJbnRlbCBMUFNTIHBsYXRmb3JtcyIgaWYgRVhQRVJUCisJZGVmYXVsdCBTRVJJQUxfODI1MAorCWRlcGVuZHMgb24gU0VSSUFMXzgyNTAgJiYgUENJCisJZGVwZW5kcyBvbiBYODYgfHwgQ09NUElMRV9URVNUCisJc2VsZWN0IERXX0RNQUNfQ09SRSBpZiBTRVJJQUxfODI1MF9ETUEKKwlzZWxlY3QgRFdfRE1BQ19QQ0kgaWYgKFNFUklBTF84MjUwX0RNQSAmJiBYODZfSU5URUxfTFBTUykKKwlzZWxlY3QgUkFUSU9OQUwKKwloZWxwCisJICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gd2lsbCBlbmFibGUgaGFuZGxpbmcgb2YgdGhlIGV4dHJhIGZlYXR1cmVzCisJICBwcmVzZW50IG9uIHRoZSBVQVJUIGZvdW5kIG9uIHZhcmlvdXMgSW50ZWwgcGxhdGZvcm1zIHN1Y2ggYXM6CisJICAgIC0gSW50ZWwgQmF5dHJhaWwgU29DCisJICAgIC0gSW50ZWwgQnJhc3dlbGwgU29DCisJICAgIC0gSW50ZWwgUXVhcmsgWDEwMDAgU29DCisKIGNvbmZpZyBTRVJJQUxfODI1MF9NSUQKIAl0cmlzdGF0ZSAiU3VwcG9ydCBmb3Igc2VyaWFsIHBvcnRzIG9uIEludGVsIE1JRCBwbGF0Zm9ybXMiIGlmIEVYUEVSVAogCWRlZmF1bHQgU0VSSUFMXzgyNTAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwL01ha2VmaWxlIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvTWFrZWZpbGUKaW5kZXggMzY3ZDQwMy4uMjc2YzZmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvTWFrZWZpbGUKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvTWFrZWZpbGUKQEAgLTI4LDYgKzI4LDcgQEAKIG9iai0kKENPTkZJR19TRVJJQUxfODI1MF9NVDY1NzcpCSs9IDgyNTBfbXRrLm8KIG9iai0kKENPTkZJR19TRVJJQUxfODI1MF9VTklQSElFUikJKz0gODI1MF91bmlwaGllci5vCiBvYmotJChDT05GSUdfU0VSSUFMXzgyNTBfSU5HRU5JQykJKz0gODI1MF9pbmdlbmljLm8KK29iai0kKENPTkZJR19TRVJJQUxfODI1MF9MUFNTKQkJKz0gODI1MF9scHNzLm8KIG9iai0kKENPTkZJR19TRVJJQUxfODI1MF9NSUQpCQkrPSA4MjUwX21pZC5vCiBvYmotJChDT05GSUdfU0VSSUFMXzgyNTBfTU9YQSkJCSs9IDgyNTBfbW94YS5vCiBvYmotJChDT05GSUdfU0VSSUFMX09GX1BMQVRGT1JNKQkrPSA4MjUwX29mLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9LY29uZmlnIGIvZHJpdmVycy90dHkvc2VyaWFsL0tjb25maWcKaW5kZXggNTE4ZGIyNGEuLmM3ODMxNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9LY29uZmlnCkBAIC0xMzgwLDcgKzEzODAsNyBAQAogCiBjb25maWcgU0VSSUFMX1BDSF9VQVJUCiAJdHJpc3RhdGUgIkludGVsIEVHMjBUIFBDSC9MQVBJUyBTZW1pY29uIElPSChNTDcyMTMvTUw3MjIzL01MNzgzMSkgVUFSVCIKLQlkZXBlbmRzIG9uIFBDSSAmJiAoWDg2XzMyIHx8IENPTVBJTEVfVEVTVCkKKwlkZXBlbmRzIG9uIFBDSSAmJiAoWDg2XzMyIHx8IE1JUFMgfHwgIENPTVBJTEVfVEVTVCkKIAlzZWxlY3QgU0VSSUFMX0NPUkUKIAloZWxwCiAJICBUaGlzIGRyaXZlciBpcyBmb3IgUENIKFBsYXRmb3JtIGNvbnRyb2xsZXIgSHViKSBVQVJUIG9mIEludGVsIEVHMjBUCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvYWx0ZXJhX2p0YWd1YXJ0LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYWx0ZXJhX2p0YWd1YXJ0LmMKaW5kZXggMzJkZjJhMC4uZTQwOWQ3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2FsdGVyYV9qdGFndWFydC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9hbHRlcmFfanRhZ3VhcnQuYwpAQCAtMjgwLDcgKzI4MCw3IEBACiAvKgogICoJRGVmaW5lIHRoZSBiYXNpYyBzZXJpYWwgZnVuY3Rpb25zIHdlIHN1cHBvcnQuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgdWFydF9vcHMgYWx0ZXJhX2p0YWd1YXJ0X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWFydF9vcHMgYWx0ZXJhX2p0YWd1YXJ0X29wcyA9IHsKIAkudHhfZW1wdHkJPSBhbHRlcmFfanRhZ3VhcnRfdHhfZW1wdHksCiAJLmdldF9tY3RybAk9IGFsdGVyYV9qdGFndWFydF9nZXRfbWN0cmwsCiAJLnNldF9tY3RybAk9IGFsdGVyYV9qdGFndWFydF9zZXRfbWN0cmwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvYWx0ZXJhX3VhcnQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9hbHRlcmFfdWFydC5jCmluZGV4IDYxYjYwN2YuLjgyMGE3NDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9hbHRlcmFfdWFydC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9hbHRlcmFfdWFydC5jCkBAIC00MDQsNyArNDA0LDcgQEAKIC8qCiAgKglEZWZpbmUgdGhlIGJhc2ljIHNlcmlhbCBmdW5jdGlvbnMgd2Ugc3VwcG9ydC4KICAqLwotc3RhdGljIHN0cnVjdCB1YXJ0X29wcyBhbHRlcmFfdWFydF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHVhcnRfb3BzIGFsdGVyYV91YXJ0X29wcyA9IHsKIAkudHhfZW1wdHkJPSBhbHRlcmFfdWFydF90eF9lbXB0eSwKIAkuZ2V0X21jdHJsCT0gYWx0ZXJhX3VhcnRfZ2V0X21jdHJsLAogCS5zZXRfbWN0cmwJPSBhbHRlcmFfdWFydF9zZXRfbWN0cmwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvYW1iYS1wbDAxMS5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2FtYmEtcGwwMTEuYwppbmRleCA4YTllMjEzLi5lMmMzM2I5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvYW1iYS1wbDAxMS5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9hbWJhLXBsMDExLmMKQEAgLTkzLDYgKzkzLDEwIEBACiBzdHJ1Y3QgdmVuZG9yX2RhdGEgewogCWNvbnN0IHUxNgkJKnJlZ19vZmZzZXQ7CiAJdW5zaWduZWQgaW50CQlpZmxzOworCXVuc2lnbmVkIGludAkJZnJfYnVzeTsKKwl1bnNpZ25lZCBpbnQJCWZyX2RzcjsKKwl1bnNpZ25lZCBpbnQJCWZyX2N0czsKKwl1bnNpZ25lZCBpbnQJCWZyX3JpOwogCWJvb2wJCQlhY2Nlc3NfMzJiOwogCWJvb2wJCQlvdmVyc2FtcGxpbmc7CiAJYm9vbAkJCWRtYV90aHJlc2hvbGQ7CkBAIC0xMTEsNiArMTE1LDEwIEBACiBzdGF0aWMgc3RydWN0IHZlbmRvcl9kYXRhIHZlbmRvcl9hcm0gPSB7CiAJLnJlZ19vZmZzZXQJCT0gcGwwMTFfc3RkX29mZnNldHMsCiAJLmlmbHMJCQk9IFVBUlQwMTFfSUZMU19SWDRfOHxVQVJUMDExX0lGTFNfVFg0XzgsCisJLmZyX2J1c3kJCT0gVUFSVDAxeF9GUl9CVVNZLAorCS5mcl9kc3IJCQk9IFVBUlQwMXhfRlJfRFNSLAorCS5mcl9jdHMJCQk9IFVBUlQwMXhfRlJfQ1RTLAorCS5mcl9yaQkJCT0gVUFSVDAxMV9GUl9SSSwKIAkub3ZlcnNhbXBsaW5nCQk9IGZhbHNlLAogCS5kbWFfdGhyZXNob2xkCQk9IGZhbHNlLAogCS5jdHNfZXZlbnRfd29ya2Fyb3VuZAk9IGZhbHNlLApAQCAtMTIxLDYgKzEyOSwxMCBAQAogCiBzdGF0aWMgc3RydWN0IHZlbmRvcl9kYXRhIHZlbmRvcl9zYnNhID0gewogCS5yZWdfb2Zmc2V0CQk9IHBsMDExX3N0ZF9vZmZzZXRzLAorCS5mcl9idXN5CQk9IFVBUlQwMXhfRlJfQlVTWSwKKwkuZnJfZHNyCQkJPSBVQVJUMDF4X0ZSX0RTUiwKKwkuZnJfY3RzCQkJPSBVQVJUMDF4X0ZSX0NUUywKKwkuZnJfcmkJCQk9IFVBUlQwMTFfRlJfUkksCiAJLmFjY2Vzc18zMmIJCT0gdHJ1ZSwKIAkub3ZlcnNhbXBsaW5nCQk9IGZhbHNlLAogCS5kbWFfdGhyZXNob2xkCQk9IGZhbHNlLApAQCAtMTY0LDYgKzE3NiwxMCBAQAogc3RhdGljIHN0cnVjdCB2ZW5kb3JfZGF0YSB2ZW5kb3Jfc3QgPSB7CiAJLnJlZ19vZmZzZXQJCT0gcGwwMTFfc3Rfb2Zmc2V0cywKIAkuaWZscwkJCT0gVUFSVDAxMV9JRkxTX1JYX0hBTEZ8VUFSVDAxMV9JRkxTX1RYX0hBTEYsCisJLmZyX2J1c3kJCT0gVUFSVDAxeF9GUl9CVVNZLAorCS5mcl9kc3IJCQk9IFVBUlQwMXhfRlJfRFNSLAorCS5mcl9jdHMJCQk9IFVBUlQwMXhfRlJfQ1RTLAorCS5mcl9yaQkJCT0gVUFSVDAxMV9GUl9SSSwKIAkub3ZlcnNhbXBsaW5nCQk9IHRydWUsCiAJLmRtYV90aHJlc2hvbGQJCT0gdHJ1ZSwKIAkuY3RzX2V2ZW50X3dvcmthcm91bmQJPSB0cnVlLApAQCAtMTg4LDExICsyMDQsMjAgQEAKIAlbUkVHX0RNQUNSXSA9IFpYX1VBUlQwMTFfRE1BQ1IsCiB9OwogCi1zdGF0aWMgc3RydWN0IHZlbmRvcl9kYXRhIHZlbmRvcl96dGUgX19tYXliZV91bnVzZWQgPSB7CitzdGF0aWMgdW5zaWduZWQgaW50IGdldF9maWZvc2l6ZV96dGUoc3RydWN0IGFtYmFfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDE2OworfQorCitzdGF0aWMgc3RydWN0IHZlbmRvcl9kYXRhIHZlbmRvcl96dGUgPSB7CiAJLnJlZ19vZmZzZXQJCT0gcGwwMTFfenRlX29mZnNldHMsCiAJLmFjY2Vzc18zMmIJCT0gdHJ1ZSwKIAkuaWZscwkJCT0gVUFSVDAxMV9JRkxTX1JYNF84fFVBUlQwMTFfSUZMU19UWDRfOCwKLQkuZ2V0X2ZpZm9zaXplCQk9IGdldF9maWZvc2l6ZV9hcm0sCisJLmZyX2J1c3kJCT0gWlhfVUFSVDAxeF9GUl9CVVNZLAorCS5mcl9kc3IJCQk9IFpYX1VBUlQwMXhfRlJfRFNSLAorCS5mcl9jdHMJCQk9IFpYX1VBUlQwMXhfRlJfQ1RTLAorCS5mcl9yaQkJCT0gWlhfVUFSVDAxMV9GUl9SSSwKKwkuZ2V0X2ZpZm9zaXplCQk9IGdldF9maWZvc2l6ZV96dGUsCiB9OwogCiAvKiBEZWFscyB3aXRoIERNQSB0cmFuc2FjdGlvbnMgKi8KQEAgLTExNjcsNyArMTE5Miw3IEBACiAJCXJldHVybjsKIAogCS8qIERpc2FibGUgUlggYW5kIFRYIERNQSAqLwotCXdoaWxlIChwbDAxMV9yZWFkKHVhcCwgUkVHX0ZSKSAmIFVBUlQwMXhfRlJfQlVTWSkKKwl3aGlsZSAocGwwMTFfcmVhZCh1YXAsIFJFR19GUikgJiB1YXAtPnZlbmRvci0+ZnJfYnVzeSkKIAkJY3B1X3JlbGF4KCk7CiAKIAlzcGluX2xvY2tfaXJxKCZ1YXAtPnBvcnQubG9jayk7CkBAIC0xNDE2LDExICsxNDQxLDEyIEBACiAJaWYgKGRlbHRhICYgVUFSVDAxeF9GUl9EQ0QpCiAJCXVhcnRfaGFuZGxlX2RjZF9jaGFuZ2UoJnVhcC0+cG9ydCwgc3RhdHVzICYgVUFSVDAxeF9GUl9EQ0QpOwogCi0JaWYgKGRlbHRhICYgVUFSVDAxeF9GUl9EU1IpCisJaWYgKGRlbHRhICYgdWFwLT52ZW5kb3ItPmZyX2RzcikKIAkJdWFwLT5wb3J0Lmljb3VudC5kc3IrKzsKIAotCWlmIChkZWx0YSAmIFVBUlQwMXhfRlJfQ1RTKQotCQl1YXJ0X2hhbmRsZV9jdHNfY2hhbmdlKCZ1YXAtPnBvcnQsIHN0YXR1cyAmIFVBUlQwMXhfRlJfQ1RTKTsKKwlpZiAoZGVsdGEgJiB1YXAtPnZlbmRvci0+ZnJfY3RzKQorCQl1YXJ0X2hhbmRsZV9jdHNfY2hhbmdlKCZ1YXAtPnBvcnQsCisJCQkJICAgICAgIHN0YXR1cyAmIHVhcC0+dmVuZG9yLT5mcl9jdHMpOwogCiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ1YXAtPnBvcnQuc3RhdGUtPnBvcnQuZGVsdGFfbXNyX3dhaXQpOwogfQpAQCAtMTQ5Myw3ICsxNTE5LDggQEAKIAlzdHJ1Y3QgdWFydF9hbWJhX3BvcnQgKnVhcCA9CiAJICAgIGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3QgdWFydF9hbWJhX3BvcnQsIHBvcnQpOwogCXVuc2lnbmVkIGludCBzdGF0dXMgPSBwbDAxMV9yZWFkKHVhcCwgUkVHX0ZSKTsKLQlyZXR1cm4gc3RhdHVzICYgKFVBUlQwMXhfRlJfQlVTWXxVQVJUMDF4X0ZSX1RYRkYpID8gMCA6IFRJT0NTRVJfVEVNVDsKKwlyZXR1cm4gc3RhdHVzICYgKHVhcC0+dmVuZG9yLT5mcl9idXN5IHwgVUFSVDAxeF9GUl9UWEZGKSA/CisJCQkJCQkJMCA6IFRJT0NTRVJfVEVNVDsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBwbDAxMV9nZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKQEAgLTE1MDgsOSArMTUzNSw5IEBACiAJCXJlc3VsdCB8PSB0aW9jbWJpdAogCiAJVElPQ01CSVQoVUFSVDAxeF9GUl9EQ0QsIFRJT0NNX0NBUik7Ci0JVElPQ01CSVQoVUFSVDAxeF9GUl9EU1IsIFRJT0NNX0RTUik7Ci0JVElPQ01CSVQoVUFSVDAxeF9GUl9DVFMsIFRJT0NNX0NUUyk7Ci0JVElPQ01CSVQoVUFSVDAxMV9GUl9SSSwgVElPQ01fUk5HKTsKKwlUSU9DTUJJVCh1YXAtPnZlbmRvci0+ZnJfZHNyLCBUSU9DTV9EU1IpOworCVRJT0NNQklUKHVhcC0+dmVuZG9yLT5mcl9jdHMsIFRJT0NNX0NUUyk7CisJVElPQ01CSVQodWFwLT52ZW5kb3ItPmZyX3JpLCBUSU9DTV9STkcpOwogI3VuZGVmIFRJT0NNQklUCiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTIxOTEsNyArMjIxOCw3IEBACiAJICoJRmluYWxseSwgd2FpdCBmb3IgdHJhbnNtaXR0ZXIgdG8gYmVjb21lIGVtcHR5CiAJICoJYW5kIHJlc3RvcmUgdGhlIFRDUgogCSAqLwotCXdoaWxlIChwbDAxMV9yZWFkKHVhcCwgUkVHX0ZSKSAmIFVBUlQwMXhfRlJfQlVTWSkKKwl3aGlsZSAocGwwMTFfcmVhZCh1YXAsIFJFR19GUikgJiB1YXAtPnZlbmRvci0+ZnJfYnVzeSkKIAkJY3B1X3JlbGF4KCk7CiAJaWYgKCF1YXAtPnZlbmRvci0+YWx3YXlzX2VuYWJsZWQpCiAJCXBsMDExX3dyaXRlKG9sZF9jciwgdWFwLCBSRUdfQ1IpOwpAQCAtMjU1NSw3ICsyNTgyLDggQEAKIAogCXJldCA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IG9idGFpbiBpcnFcbiIpOworCQlpZiAocmV0ICE9IC1FUFJPQkVfREVGRVIpCisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3Qgb2J0YWluIGlycVxuIik7CiAJCXJldHVybiByZXQ7CiAJfQogCXVhcC0+cG9ydC5pcnEJPSByZXQ7CkBAIC0yNjIyLDYgKzI2NTAsMTEgQEAKIAkJLm1hc2sJPSAweDAwZmZmZmZmLAogCQkuZGF0YQk9ICZ2ZW5kb3Jfc3QsCiAJfSwKKwl7CisJCS5pZAk9IEFNQkFfTElOVVhfSUQoMHgwMCwgMHgxLCAweGZmZSksCisJCS5tYXNrCT0gMHgwMGZmZmZmZiwKKwkJLmRhdGEJPSAmdmVuZG9yX3p0ZSwKKwl9LAogCXsgMCwgMCB9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2FyY191YXJ0LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYXJjX3VhcnQuYwppbmRleCAzYTFkZTVjLi41YWMwNmZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvYXJjX3VhcnQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYXJjX3VhcnQuYwpAQCAtNDY0LDcgKzQ2NCw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCB1YXJ0X29wcyBhcmNfc2VyaWFsX3BvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHVhcnRfb3BzIGFyY19zZXJpYWxfcG9wcyA9IHsKIAkudHhfZW1wdHkJPSBhcmNfc2VyaWFsX3R4X2VtcHR5LAogCS5zZXRfbWN0cmwJPSBhcmNfc2VyaWFsX3NldF9tY3RybCwKIAkuZ2V0X21jdHJsCT0gYXJjX3NlcmlhbF9nZXRfbWN0cmwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvYXRtZWxfc2VyaWFsLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYXRtZWxfc2VyaWFsLmMKaW5kZXggMmVhYTE4ZC4uZmQ4YWExZiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9hdG1lbF9zZXJpYWwuYwpAQCAtMTY2LDYgKzE2Niw3IEBACiAJdTMyCQkJcnRzX2xvdzsKIAlib29sCQkJbXNfaXJxX2VuYWJsZWQ7CiAJdTMyCQkJcnRvcjsJLyogYWRkcmVzcyBvZiByZWNlaXZlciB0aW1lb3V0IHJlZ2lzdGVyIGlmIGl0IGV4aXN0cyAqLworCWJvb2wJCQloYXNfZnJhY19iYXVkcmF0ZTsKIAlib29sCQkJaGFzX2h3X3RpbWVyOwogCXN0cnVjdCB0aW1lcl9saXN0CXVhcnRfdGltZXI7CiAKQEAgLTE2MzQsOCArMTYzNSw4IEBACiAKIAlpZiAobnApIHsKIAkJLyogRE1BL1BEQyB1c2FnZSBzcGVjaWZpY2F0aW9uICovCi0JCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJhdG1lbCx1c2UtZG1hLXJ4IiwgTlVMTCkpIHsKLQkJCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJkbWFzIiwgTlVMTCkpIHsKKwkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImF0bWVsLHVzZS1kbWEtcngiKSkgeworCQkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImRtYXMiKSkgewogCQkJCWF0bWVsX3BvcnQtPnVzZV9kbWFfcnggID0gdHJ1ZTsKIAkJCQlhdG1lbF9wb3J0LT51c2VfcGRjX3J4ICA9IGZhbHNlOwogCQkJfSBlbHNlIHsKQEAgLTE2NDcsOCArMTY0OCw4IEBACiAJCQlhdG1lbF9wb3J0LT51c2VfcGRjX3J4ICA9IGZhbHNlOwogCQl9CiAKLQkJaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgImF0bWVsLHVzZS1kbWEtdHgiLCBOVUxMKSkgewotCQkJaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgImRtYXMiLCBOVUxMKSkgeworCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiYXRtZWwsdXNlLWRtYS10eCIpKSB7CisJCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiZG1hcyIpKSB7CiAJCQkJYXRtZWxfcG9ydC0+dXNlX2RtYV90eCAgPSB0cnVlOwogCQkJCWF0bWVsX3BvcnQtPnVzZV9wZGNfdHggID0gZmFsc2U7CiAJCQl9IGVsc2UgewpAQCAtMTc0NSw2ICsxNzQ2LDExIEBACiAJZGJndV91YXJ0ID0gMHg0NDQyNDc1NTsJLyogREJHVSAqLwogCW5ld191YXJ0ID0gMHg1NTQxNTI1NDsJLyogVUFSVCAqLwogCisJLyoKKwkgKiBPbmx5IFVTQVJUIGRldmljZXMgZnJvbSBhdDkxc2FtOTI2MCBTT0MgaW1wbGVtZW50IGZyYWN0aW9uYWwKKwkgKiBiYXVkcmF0ZS4KKwkgKi8KKwlhdG1lbF9wb3J0LT5oYXNfZnJhY19iYXVkcmF0ZSA9IGZhbHNlOwogCWF0bWVsX3BvcnQtPmhhc19od190aW1lciA9IGZhbHNlOwogCiAJaWYgKG5hbWUgPT0gbmV3X3VhcnQpIHsKQEAgLTE3NTMsNiArMTc1OSw3IEBACiAJCWF0bWVsX3BvcnQtPnJ0b3IgPSBBVE1FTF9VQV9SVE9SOwogCX0gZWxzZSBpZiAobmFtZSA9PSB1c2FydCkgewogCQlkZXZfZGJnKHBvcnQtPmRldiwgIlVzYXJ0XG4iKTsKKwkJYXRtZWxfcG9ydC0+aGFzX2ZyYWNfYmF1ZHJhdGUgPSB0cnVlOwogCQlhdG1lbF9wb3J0LT5oYXNfaHdfdGltZXIgPSB0cnVlOwogCQlhdG1lbF9wb3J0LT5ydG9yID0gQVRNRUxfVVNfUlRPUjsKIAl9IGVsc2UgaWYgKG5hbWUgPT0gZGJndV91YXJ0KSB7CkBAIC0xNzY0LDYgKzE3NzEsNyBAQAogCQljYXNlIDB4MzAyOgogCQljYXNlIDB4MTAyMTM6CiAJCQlkZXZfZGJnKHBvcnQtPmRldiwgIlRoaXMgdmVyc2lvbiBpcyB1c2FydFxuIik7CisJCQlhdG1lbF9wb3J0LT5oYXNfZnJhY19iYXVkcmF0ZSA9IHRydWU7CiAJCQlhdG1lbF9wb3J0LT5oYXNfaHdfdGltZXIgPSB0cnVlOwogCQkJYXRtZWxfcG9ydC0+cnRvciA9IEFUTUVMX1VTX1JUT1I7CiAJCQlicmVhazsKQEAgLTE5MjksNiArMTkzNyw5IEBACiB7CiAJc3RydWN0IGF0bWVsX3VhcnRfcG9ydCAqYXRtZWxfcG9ydCA9IHRvX2F0bWVsX3VhcnRfcG9ydChwb3J0KTsKIAorCS8qIERpc2FibGUgbW9kZW0gY29udHJvbCBsaW5lcyBpbnRlcnJ1cHRzICovCisJYXRtZWxfZGlzYWJsZV9tcyhwb3J0KTsKKwogCS8qIERpc2FibGUgaW50ZXJydXB0cyBhdCBkZXZpY2UgbGV2ZWwgKi8KIAlhdG1lbF91YXJ0X3dyaXRlbChwb3J0LCBBVE1FTF9VU19JRFIsIC0xKTsKIApAQCAtMTk3OSw4ICsxOTkwLDYgQEAKIAkgKi8KIAlmcmVlX2lycShwb3J0LT5pcnEsIHBvcnQpOwogCi0JYXRtZWxfcG9ydC0+bXNfaXJxX2VuYWJsZWQgPSBmYWxzZTsKLQogCWF0bWVsX2ZsdXNoX2J1ZmZlcihwb3J0KTsKIH0KIApAQCAtMjAyNSw4ICsyMDM0LDkgQEAKIHN0YXRpYyB2b2lkIGF0bWVsX3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBrdGVybWlvcyAqdGVybWlvcywKIAkJCSAgICAgIHN0cnVjdCBrdGVybWlvcyAqb2xkKQogeworCXN0cnVjdCBhdG1lbF91YXJ0X3BvcnQgKmF0bWVsX3BvcnQgPSB0b19hdG1lbF91YXJ0X3BvcnQocG9ydCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgb2xkX21vZGUsIG1vZGUsIGltciwgcXVvdCwgYmF1ZDsKKwl1bnNpZ25lZCBpbnQgb2xkX21vZGUsIG1vZGUsIGltciwgcXVvdCwgYmF1ZCwgZGl2LCBjZCwgZnAgPSAwOwogCiAJLyogc2F2ZSB0aGUgY3VycmVudCBtb2RlIHJlZ2lzdGVyICovCiAJbW9kZSA9IG9sZF9tb2RlID0gYXRtZWxfdWFydF9yZWFkbChwb3J0LCBBVE1FTF9VU19NUik7CkBAIC0yMDM2LDEyICsyMDQ2LDYgQEAKIAkJICBBVE1FTF9VU19QQVIgfCBBVE1FTF9VU19VU01PREUpOwogCiAJYmF1ZCA9IHVhcnRfZ2V0X2JhdWRfcmF0ZShwb3J0LCB0ZXJtaW9zLCBvbGQsIDAsIHBvcnQtPnVhcnRjbGsgLyAxNik7Ci0JcXVvdCA9IHVhcnRfZ2V0X2Rpdmlzb3IocG9ydCwgYmF1ZCk7Ci0KLQlpZiAocXVvdCA+IDY1NTM1KSB7CS8qIEJSR1IgaXMgMTYtYml0LCBzbyBzd2l0Y2ggdG8gc2xvd2VyIGNsb2NrICovCi0JCXF1b3QgLz0gODsKLQkJbW9kZSB8PSBBVE1FTF9VU19VU0NMS1NfTUNLX0RJVjg7Ci0JfQogCiAJLyogYnl0ZSBzaXplICovCiAJc3dpdGNoICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1NJWkUpIHsKQEAgLTIxNjAsNyArMjE2NCwzMSBAQAogCQlhdG1lbF91YXJ0X3dyaXRlbChwb3J0LCBBVE1FTF9VU19DUiwgcnRzX3N0YXRlKTsKIAl9CiAKLQkvKiBzZXQgdGhlIGJhdWQgcmF0ZSAqLworCS8qCisJICogU2V0IHRoZSBiYXVkIHJhdGU6CisJICogRnJhY3Rpb25hbCBiYXVkcmF0ZSBhbGxvd3MgdG8gc2V0dXAgb3V0cHV0IGZyZXF1ZW5jeSBtb3JlCisJICogYWNjdXJhdGVseS4gVGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQgb25seSB3aGVuIHVzaW5nIG5vcm1hbCBtb2RlLgorCSAqIGJhdWRyYXRlID0gc2VsZWN0ZWQgY2xvY2sgLyAoOCAqICgyIC0gT1ZFUikgKiAoQ0QgKyBGUCAvIDgpKQorCSAqIEN1cnJlbnRseSwgT1ZFUiBpcyBhbHdheXMgc2V0IHRvIDAgc28gd2UgZ2V0CisJICogYmF1ZHJhdGUgPSBzZWxlY3RlZCBjbG9jayAvICgxNiAqIChDRCArIEZQIC8gOCkpCisJICogdGhlbgorCSAqIDggQ0QgKyBGUCA9IHNlbGVjdGVkIGNsb2NrIC8gKDIgKiBiYXVkcmF0ZSkKKwkgKi8KKwlpZiAoYXRtZWxfcG9ydC0+aGFzX2ZyYWNfYmF1ZHJhdGUgJiYKKwkgICAgKG1vZGUgJiBBVE1FTF9VU19VU01PREUpID09IEFUTUVMX1VTX1VTTU9ERV9OT1JNQUwpIHsKKwkJZGl2ID0gRElWX1JPVU5EX0NMT1NFU1QocG9ydC0+dWFydGNsaywgYmF1ZCAqIDIpOworCQljZCA9IGRpdiA+PiAzOworCQlmcCA9IGRpdiAmIEFUTUVMX1VTX0ZQX01BU0s7CisJfSBlbHNlIHsKKwkJY2QgPSB1YXJ0X2dldF9kaXZpc29yKHBvcnQsIGJhdWQpOworCX0KKworCWlmIChjZCA+IDY1NTM1KSB7CS8qIEJSR1IgaXMgMTYtYml0LCBzbyBzd2l0Y2ggdG8gc2xvd2VyIGNsb2NrICovCisJCWNkIC89IDg7CisJCW1vZGUgfD0gQVRNRUxfVVNfVVNDTEtTX01DS19ESVY4OworCX0KKwlxdW90ID0gY2QgfCBmcCA8PCBBVE1FTF9VU19GUF9PRkZTRVQ7CisKIAlhdG1lbF91YXJ0X3dyaXRlbChwb3J0LCBBVE1FTF9VU19CUkdSLCBxdW90KTsKIAlhdG1lbF91YXJ0X3dyaXRlbChwb3J0LCBBVE1FTF9VU19DUiwgQVRNRUxfVVNfUlNUU1RBIHwgQVRNRUxfVVNfUlNUUlgpOwogCWF0bWVsX3VhcnRfd3JpdGVsKHBvcnQsIEFUTUVMX1VTX0NSLCBBVE1FTF9VU19UWEVOIHwgQVRNRUxfVVNfUlhFTik7CkBAIC0yMjkyLDcgKzIzMjAsNyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3QgdWFydF9vcHMgYXRtZWxfcG9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWFydF9vcHMgYXRtZWxfcG9wcyA9IHsKIAkudHhfZW1wdHkJPSBhdG1lbF90eF9lbXB0eSwKIAkuc2V0X21jdHJsCT0gYXRtZWxfc2V0X21jdHJsLAogCS5nZXRfbWN0cmwJPSBhdG1lbF9nZXRfbWN0cmwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvYmNtNjN4eF91YXJ0LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYmNtNjN4eF91YXJ0LmMKaW5kZXggNTEwOGZhYi4uNTgzYzlhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2JjbTYzeHhfdWFydC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9iY202M3h4X3VhcnQuYwpAQCAtNjMxLDcgKzYzMSw3IEBACiB9CiAKIC8qIHNlcmlhbCBjb3JlIGNhbGxiYWNrcyAqLwotc3RhdGljIHN0cnVjdCB1YXJ0X29wcyBiY21fdWFydF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHVhcnRfb3BzIGJjbV91YXJ0X29wcyA9IHsKIAkudHhfZW1wdHkJPSBiY21fdWFydF90eF9lbXB0eSwKIAkuZ2V0X21jdHJsCT0gYmNtX3VhcnRfZ2V0X21jdHJsLAogCS5zZXRfbWN0cmwJPSBiY21fdWFydF9zZXRfbWN0cmwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvZWFybHljb24tYXJtLXNlbWlob3N0LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvZWFybHljb24tYXJtLXNlbWlob3N0LmMKaW5kZXggMzgzZGIxMC4uNmJiZWI2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2Vhcmx5Y29uLWFybS1zZW1paG9zdC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9lYXJseWNvbi1hcm0tc2VtaWhvc3QuYwpAQCAtNTMsNyArNTMsOCBAQAogCXVhcnRfY29uc29sZV93cml0ZSgmZGV2LT5wb3J0LCBzLCBuLCBzbWhfcHV0Yyk7CiB9CiAKLWludCBfX2luaXQgZWFybHlfc21oX3NldHVwKHN0cnVjdCBlYXJseWNvbl9kZXZpY2UgKmRldmljZSwgY29uc3QgY2hhciAqb3B0KQorc3RhdGljIGludAorX19pbml0IGVhcmx5X3NtaF9zZXR1cChzdHJ1Y3QgZWFybHljb25fZGV2aWNlICpkZXZpY2UsIGNvbnN0IGNoYXIgKm9wdCkKIHsKIAlkZXZpY2UtPmNvbi0+d3JpdGUgPSBzbWhfd3JpdGU7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvZWFybHljb24uYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9lYXJseWNvbi5jCmluZGV4IDA2Nzc4M2YuLmMzNjUxNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9lYXJseWNvbi5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9lYXJseWNvbi5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2l6ZXMuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2ZkdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KIAogI2lmZGVmIENPTkZJR19GSVhfRUFSTFlDT05fTUVNCiAjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgpAQCAtMzgsNyArMzksNyBAQAogCS5jb24gPSAmZWFybHlfY29uLAogfTsKIAotc3RhdGljIHZvaWQgX19pb21lbSAqIF9faW5pdCBlYXJseWNvbl9tYXAodW5zaWduZWQgbG9uZyBwYWRkciwgc2l6ZV90IHNpemUpCitzdGF0aWMgdm9pZCBfX2lvbWVtICogX19pbml0IGVhcmx5Y29uX21hcChyZXNvdXJjZV9zaXplX3QgcGFkZHIsIHNpemVfdCBzaXplKQogewogCXZvaWQgX19pb21lbSAqYmFzZTsKICNpZmRlZiBDT05GSUdfRklYX0VBUkxZQ09OX01FTQpAQCAtNDksOCArNTAsNyBAQAogCWJhc2UgPSBpb3JlbWFwKHBhZGRyLCBzaXplKTsKICNlbmRpZgogCWlmICghYmFzZSkKLQkJcHJfZXJyKCIlczogQ291bGRuJ3QgbWFwIDB4JWxseFxuIiwgX19mdW5jX18sCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBhZGRyKTsKKwkJcHJfZXJyKCIlczogQ291bGRuJ3QgbWFwICVwYVxuIiwgX19mdW5jX18sICZwYWRkcik7CiAKIAlyZXR1cm4gYmFzZTsKIH0KQEAgLTkyLDcgKzkyLDcgQEAKIHsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gJmRldmljZS0+cG9ydDsKIAlpbnQgbGVuZ3RoOwotCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwlyZXNvdXJjZV9zaXplX3QgYWRkcjsKIAogCWlmICh1YXJ0X3BhcnNlX2Vhcmx5Y29uKG9wdGlvbnMsICZwb3J0LT5pb3R5cGUsICZhZGRyLCAmb3B0aW9ucykpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTk5LDYgKzE5OSwxNCBAQAogCXJldHVybiAtRU5PRU5UOwogfQogCisvKgorICogV2hlbiBDT05GSUdfQUNQSV9TUENSX1RBQkxFIGlzIGRlZmluZWQsICJlYXJseWNvbiIgd2l0aG91dCBwYXJhbWV0ZXJzIGluCisgKiBjb21tYW5kIGxpbmUgZG9lcyBub3Qgc3RhcnQgRFQgZWFybHljb24gaW1tZWRpYXRlbHksIGluc3RlYWQgaXQgZGVmZXJzCisgKiBzdGFydGluZyBpdCB1bnRpbCBEVC9BQ1BJIGRlY2lzaW9uIGlzIG1hZGUuICBBdCB0aGF0IHRpbWUgaWYgQUNQSSBpcyBlbmFibGVkCisgKiBjYWxsIHBhcnNlX3NwY3IoKSwgZWxzZSBjYWxsIGVhcmx5X2luaXRfZHRfc2Nhbl9jaG9zZW5fc3Rkb3V0KCkKKyAqLworYm9vbCBlYXJseWNvbl9pbml0X2lzX2RlZmVycmVkIF9faW5pdGRhdGE7CisKIC8qIGVhcmx5X3BhcmFtIHdyYXBwZXIgZm9yIHNldHVwX2Vhcmx5Y29uKCkgKi8KIHN0YXRpYyBpbnQgX19pbml0IHBhcmFtX3NldHVwX2Vhcmx5Y29uKGNoYXIgKmJ1ZikKIHsKQEAgLTIwOCw4ICsyMTYsMTQgQEAKIAkgKiBKdXN0ICdlYXJseWNvbicgaXMgYSB2YWxpZCBwYXJhbSBmb3IgZGV2aWNldHJlZSBlYXJseWNvbnM7CiAJICogZG9uJ3QgZ2VuZXJhdGUgYSB3YXJuaW5nIGZyb20gcGFyc2VfZWFybHlfcGFyYW1zKCkgaW4gdGhhdCBjYXNlCiAJICovCi0JaWYgKCFidWYgfHwgIWJ1ZlswXSkKLQkJcmV0dXJuIDA7CisJaWYgKCFidWYgfHwgIWJ1ZlswXSkgeworCQlpZiAoSVNfRU5BQkxFRChDT05GSUdfQUNQSV9TUENSX1RBQkxFKSkgeworCQkJZWFybHljb25faW5pdF9pc19kZWZlcnJlZCA9IHRydWU7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBlYXJseV9pbml0X2R0X3NjYW5fY2hvc2VuX3N0ZG91dCgpOworCQl9CisJfQogCiAJZXJyID0gc2V0dXBfZWFybHljb24oYnVmKTsKIAlpZiAoZXJyID09IC1FTk9FTlQgfHwgZXJyID09IC1FQUxSRUFEWSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9mc2xfbHB1YXJ0LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvZnNsX2xwdWFydC5jCmluZGV4IDdmOTVmNzguLmRlOWQ1MTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9mc2xfbHB1YXJ0LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2ZzbF9scHVhcnQuYwpAQCAtMjI0LDcgKzIyNCw4IEBACiAjZGVmaW5lIFVBUlRXQVRFUl9UWFdBVEVSX09GRgkwCiAjZGVmaW5lIFVBUlRXQVRFUl9SWFdBVEVSX09GRgkxNgogCi0jZGVmaW5lIEZTTF9VQVJUX1JYX0RNQV9CVUZGRVJfU0laRQk2NAorLyogUnggRE1BIHRpbWVvdXQgaW4gbXMsIHdoaWNoIGlzIHVzZWQgdG8gY2FsY3VsYXRlIFJ4IHJpbmcgYnVmZmVyIHNpemUgKi8KKyNkZWZpbmUgRE1BX1JYX1RJTUVPVVQJCSgxMCkKIAogI2RlZmluZSBEUklWRVJfTkFNRQkiZnNsLWxwdWFydCIKICNkZWZpbmUgREVWX05BTUUJInR0eUxQIgpAQCAtMjQzLDE4ICsyNDQsMTggQEAKIAlzdHJ1Y3QgZG1hX2NoYW4JCSpkbWFfcnhfY2hhbjsKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgICpkbWFfdHhfZGVzYzsKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgICpkbWFfcnhfZGVzYzsKLQlkbWFfYWRkcl90CQlkbWFfdHhfYnVmX2J1czsKLQlkbWFfYWRkcl90CQlkbWFfcnhfYnVmX2J1czsKIAlkbWFfY29va2llX3QJCWRtYV90eF9jb29raWU7CiAJZG1hX2Nvb2tpZV90CQlkbWFfcnhfY29va2llOwotCXVuc2lnbmVkIGNoYXIJCSpkbWFfdHhfYnVmX3ZpcnQ7Ci0JdW5zaWduZWQgY2hhcgkJKmRtYV9yeF9idWZfdmlydDsKIAl1bnNpZ25lZCBpbnQJCWRtYV90eF9ieXRlczsKIAl1bnNpZ25lZCBpbnQJCWRtYV9yeF9ieXRlczsKLQlpbnQJCQlkbWFfdHhfaW5fcHJvZ3Jlc3M7Ci0JaW50CQkJZG1hX3J4X2luX3Byb2dyZXNzOworCWJvb2wJCQlkbWFfdHhfaW5fcHJvZ3Jlc3M7CiAJdW5zaWduZWQgaW50CQlkbWFfcnhfdGltZW91dDsKIAlzdHJ1Y3QgdGltZXJfbGlzdAlscHVhcnRfdGltZXI7CisJc3RydWN0IHNjYXR0ZXJsaXN0CXJ4X3NnbCwgdHhfc2dsWzJdOworCXN0cnVjdCBjaXJjX2J1ZgkJcnhfcmluZzsKKwlpbnQJCQlyeF9kbWFfcm5nX2J1Zl9sZW47CisJdW5zaWduZWQgaW50CQlkbWFfdHhfbmVudHM7CisJd2FpdF9xdWV1ZV9oZWFkX3QJZG1hX3dhaXQ7CiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBscHVhcnRfZHRfaWRzW10gPSB7CkBAIC0yNzAsNyArMjcxLDYgQEAKIAogLyogRm9yd2FyZCBkZWNsYXJlIHRoaXMgZm9yIHRoZSBkbWEgY2FsbGJhY2tzKi8KIHN0YXRpYyB2b2lkIGxwdWFydF9kbWFfdHhfY29tcGxldGUodm9pZCAqYXJnKTsKLXN0YXRpYyB2b2lkIGxwdWFydF9kbWFfcnhfY29tcGxldGUodm9pZCAqYXJnKTsKIAogc3RhdGljIHUzMiBscHVhcnQzMl9yZWFkKHZvaWQgX19pb21lbSAqYWRkcikKIHsKQEAgLTMxNiwyMTcgKzMxNiwxMjEgQEAKIAlscHVhcnQzMl93cml0ZSh0ZW1wICYgflVBUlRDVFJMX1JFLCBwb3J0LT5tZW1iYXNlICsgVUFSVENUUkwpOwogfQogCi1zdGF0aWMgdm9pZCBscHVhcnRfY29weV9yeF90b190dHkoc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCwKLQkJc3RydWN0IHR0eV9wb3J0ICp0dHksIGludCBjb3VudCkKK3N0YXRpYyB2b2lkIGxwdWFydF9kbWFfdHgoc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCkKIHsKLQlpbnQgY29waWVkOworCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZzcG9ydC0+cG9ydC5zdGF0ZS0+eG1pdDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCA9IHNwb3J0LT50eF9zZ2w7CisJc3RydWN0IGRldmljZSAqZGV2ID0gc3BvcnQtPnBvcnQuZGV2OworCWludCByZXQ7CiAKLQlzcG9ydC0+cG9ydC5pY291bnQucnggKz0gY291bnQ7CisJaWYgKHNwb3J0LT5kbWFfdHhfaW5fcHJvZ3Jlc3MpCisJCXJldHVybjsKIAotCWlmICghdHR5KSB7Ci0JCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LCAiTm8gdHR5IHBvcnRcbiIpOworCXNwb3J0LT5kbWFfdHhfYnl0ZXMgPSB1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZyh4bWl0KTsKKworCWlmICh4bWl0LT50YWlsIDwgeG1pdC0+aGVhZCkgeworCQlzcG9ydC0+ZG1hX3R4X25lbnRzID0gMTsKKwkJc2dfaW5pdF9vbmUoc2dsLCB4bWl0LT5idWYgKyB4bWl0LT50YWlsLCBzcG9ydC0+ZG1hX3R4X2J5dGVzKTsKKwl9IGVsc2UgeworCQlzcG9ydC0+ZG1hX3R4X25lbnRzID0gMjsKKwkJc2dfaW5pdF90YWJsZShzZ2wsIDIpOworCQlzZ19zZXRfYnVmKHNnbCwgeG1pdC0+YnVmICsgeG1pdC0+dGFpbCwKKwkJCQlVQVJUX1hNSVRfU0laRSAtIHhtaXQtPnRhaWwpOworCQlzZ19zZXRfYnVmKHNnbCArIDEsIHhtaXQtPmJ1ZiwgeG1pdC0+aGVhZCk7CisJfQorCisJcmV0ID0gZG1hX21hcF9zZyhkZXYsIHNnbCwgc3BvcnQtPmRtYV90eF9uZW50cywgRE1BX1RPX0RFVklDRSk7CisJaWYgKCFyZXQpIHsKKwkJZGV2X2VycihkZXYsICJETUEgbWFwcGluZyBlcnJvciBmb3IgVFguXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHNwb3J0LT5wb3J0LmRldiwgc3BvcnQtPmRtYV9yeF9idWZfYnVzLAotCQkJRlNMX1VBUlRfUlhfRE1BX0JVRkZFUl9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOwotCWNvcGllZCA9IHR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LAotCQkJKCh1bnNpZ25lZCBjaGFyICopKHNwb3J0LT5kbWFfcnhfYnVmX3ZpcnQpKSwgY291bnQpOwotCi0JaWYgKGNvcGllZCAhPSBjb3VudCkgewotCQlXQVJOX09OKDEpOwotCQlkZXZfZXJyKHNwb3J0LT5wb3J0LmRldiwgIlJ4RGF0YSBjb3B5IHRvIHR0eSBsYXllciBmYWlsZWRcbiIpOwotCX0KLQotCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHNwb3J0LT5wb3J0LmRldiwgc3BvcnQtPmRtYV9yeF9idWZfYnVzLAotCQkJRlNMX1VBUlRfUlhfRE1BX0JVRkZFUl9TSVpFLCBETUFfVE9fREVWSUNFKTsKLX0KLQotc3RhdGljIHZvaWQgbHB1YXJ0X3Bpb190eChzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0KQotewotCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZzcG9ydC0+cG9ydC5zdGF0ZS0+eG1pdDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKLQotCXdoaWxlICghdWFydF9jaXJjX2VtcHR5KHhtaXQpICYmCi0JCXJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUVENGSUZPKSA8IHNwb3J0LT50eGZpZm9fc2l6ZSkgewotCQl3cml0ZWIoeG1pdC0+YnVmW3htaXQtPnRhaWxdLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVERSKTsKLQkJeG1pdC0+dGFpbCA9ICh4bWl0LT50YWlsICsgMSkgJiAoVUFSVF9YTUlUX1NJWkUgLSAxKTsKLQkJc3BvcnQtPnBvcnQuaWNvdW50LnR4Kys7Ci0JfQotCi0JaWYgKHVhcnRfY2lyY19jaGFyc19wZW5kaW5nKHhtaXQpIDwgV0FLRVVQX0NIQVJTKQotCQl1YXJ0X3dyaXRlX3dha2V1cCgmc3BvcnQtPnBvcnQpOwotCi0JaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSkKLQkJd3JpdGViKHJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I1KSB8IFVBUlRDUjVfVERNQVMsCi0JCQlzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgbHB1YXJ0X2RtYV90eChzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0LCB1bnNpZ25lZCBsb25nIGNvdW50KQotewotCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZzcG9ydC0+cG9ydC5zdGF0ZS0+eG1pdDsKLQlkbWFfYWRkcl90IHR4X2J1c19hZGRyOwotCi0JZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3BvcnQtPnBvcnQuZGV2LCBzcG9ydC0+ZG1hX3R4X2J1Zl9idXMsCi0JCQkJVUFSVF9YTUlUX1NJWkUsIERNQV9UT19ERVZJQ0UpOwotCXNwb3J0LT5kbWFfdHhfYnl0ZXMgPSBjb3VudCAmIH4oc3BvcnQtPnR4Zmlmb19zaXplIC0gMSk7Ci0JdHhfYnVzX2FkZHIgPSBzcG9ydC0+ZG1hX3R4X2J1Zl9idXMgKyB4bWl0LT50YWlsOwotCXNwb3J0LT5kbWFfdHhfZGVzYyA9IGRtYWVuZ2luZV9wcmVwX3NsYXZlX3NpbmdsZShzcG9ydC0+ZG1hX3R4X2NoYW4sCi0JCQkJCXR4X2J1c19hZGRyLCBzcG9ydC0+ZG1hX3R4X2J5dGVzLAorCXNwb3J0LT5kbWFfdHhfZGVzYyA9IGRtYWVuZ2luZV9wcmVwX3NsYXZlX3NnKHNwb3J0LT5kbWFfdHhfY2hhbiwgc2dsLAorCQkJCQlzcG9ydC0+ZG1hX3R4X25lbnRzLAogCQkJCQlETUFfTUVNX1RPX0RFViwgRE1BX1BSRVBfSU5URVJSVVBUKTsKLQogCWlmICghc3BvcnQtPmRtYV90eF9kZXNjKSB7Ci0JCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LCAiTm90IGFibGUgdG8gZ2V0IGRlc2MgZm9yIHR4XG4iKTsKLQkJcmV0dXJuIC1FSU87CisJCWRtYV91bm1hcF9zZyhkZXYsIHNnbCwgc3BvcnQtPmRtYV90eF9uZW50cywgRE1BX1RPX0RFVklDRSk7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IHByZXBhcmUgVFggc2xhdmUgRE1BIVxuIik7CisJCXJldHVybjsKIAl9CiAKIAlzcG9ydC0+ZG1hX3R4X2Rlc2MtPmNhbGxiYWNrID0gbHB1YXJ0X2RtYV90eF9jb21wbGV0ZTsKIAlzcG9ydC0+ZG1hX3R4X2Rlc2MtPmNhbGxiYWNrX3BhcmFtID0gc3BvcnQ7Ci0Jc3BvcnQtPmRtYV90eF9pbl9wcm9ncmVzcyA9IDE7CisJc3BvcnQtPmRtYV90eF9pbl9wcm9ncmVzcyA9IHRydWU7CiAJc3BvcnQtPmRtYV90eF9jb29raWUgPSBkbWFlbmdpbmVfc3VibWl0KHNwb3J0LT5kbWFfdHhfZGVzYyk7CiAJZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcoc3BvcnQtPmRtYV90eF9jaGFuKTsKIAotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBscHVhcnRfcHJlcGFyZV90eChzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0KQotewotCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZzcG9ydC0+cG9ydC5zdGF0ZS0+eG1pdDsKLQl1bnNpZ25lZCBsb25nIGNvdW50ID0gIENJUkNfQ05UX1RPX0VORCh4bWl0LT5oZWFkLAotCQkJCQl4bWl0LT50YWlsLCBVQVJUX1hNSVRfU0laRSk7Ci0KLQlpZiAoIWNvdW50KQotCQlyZXR1cm47Ci0KLQlpZiAoY291bnQgPCBzcG9ydC0+dHhmaWZvX3NpemUpCi0JCXdyaXRlYihyZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSkgJiB+VUFSVENSNV9URE1BUywKLQkJCQlzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSk7Ci0JZWxzZSB7Ci0JCXdyaXRlYihyZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSkgfCBVQVJUQ1I1X1RETUFTLAotCQkJCXNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I1KTsKLQkJbHB1YXJ0X2RtYV90eChzcG9ydCwgY291bnQpOwotCX0KIH0KIAogc3RhdGljIHZvaWQgbHB1YXJ0X2RtYV90eF9jb21wbGV0ZSh2b2lkICphcmcpCiB7CiAJc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGFyZzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCA9ICZzcG9ydC0+dHhfc2dsWzBdOwogCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZzcG9ydC0+cG9ydC5zdGF0ZS0+eG1pdDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JYXN5bmNfdHhfYWNrKHNwb3J0LT5kbWFfdHhfZGVzYyk7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOwogCisJZG1hX3VubWFwX3NnKHNwb3J0LT5wb3J0LmRldiwgc2dsLCBzcG9ydC0+ZG1hX3R4X25lbnRzLCBETUFfVE9fREVWSUNFKTsKKwogCXhtaXQtPnRhaWwgPSAoeG1pdC0+dGFpbCArIHNwb3J0LT5kbWFfdHhfYnl0ZXMpICYgKFVBUlRfWE1JVF9TSVpFIC0gMSk7Ci0Jc3BvcnQtPmRtYV90eF9pbl9wcm9ncmVzcyA9IDA7CisKKwlzcG9ydC0+cG9ydC5pY291bnQudHggKz0gc3BvcnQtPmRtYV90eF9ieXRlczsKKwlzcG9ydC0+ZG1hX3R4X2luX3Byb2dyZXNzID0gZmFsc2U7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOwogCiAJaWYgKHVhcnRfY2lyY19jaGFyc19wZW5kaW5nKHhtaXQpIDwgV0FLRVVQX0NIQVJTKQogCQl1YXJ0X3dyaXRlX3dha2V1cCgmc3BvcnQtPnBvcnQpOwogCi0JbHB1YXJ0X3ByZXBhcmVfdHgoc3BvcnQpOworCWlmICh3YWl0cXVldWVfYWN0aXZlKCZzcG9ydC0+ZG1hX3dhaXQpKSB7CisJCXdha2VfdXAoJnNwb3J0LT5kbWFfd2FpdCk7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOworCisJaWYgKCF1YXJ0X2NpcmNfZW1wdHkoeG1pdCkgJiYgIXVhcnRfdHhfc3RvcHBlZCgmc3BvcnQtPnBvcnQpKQorCQlscHVhcnRfZG1hX3R4KHNwb3J0KTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIGludCBscHVhcnRfZG1hX3J4KHN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQpCitzdGF0aWMgaW50IGxwdWFydF9kbWFfdHhfcmVxdWVzdChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewotCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHNwb3J0LT5wb3J0LmRldiwgc3BvcnQtPmRtYV9yeF9idWZfYnVzLAotCQkJRlNMX1VBUlRfUlhfRE1BX0JVRkZFUl9TSVpFLCBETUFfVE9fREVWSUNFKTsKLQlzcG9ydC0+ZG1hX3J4X2Rlc2MgPSBkbWFlbmdpbmVfcHJlcF9zbGF2ZV9zaW5nbGUoc3BvcnQtPmRtYV9yeF9jaGFuLAotCQkJc3BvcnQtPmRtYV9yeF9idWZfYnVzLCBGU0xfVUFSVF9SWF9ETUFfQlVGRkVSX1NJWkUsCi0JCQlETUFfREVWX1RPX01FTSwgRE1BX1BSRVBfSU5URVJSVVBUKTsKKwlzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0ID0gY29udGFpbmVyX29mKHBvcnQsCisJCQkJCXN0cnVjdCBscHVhcnRfcG9ydCwgcG9ydCk7CisJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgZG1hX3R4X3Njb25maWcgPSB7fTsKKwlpbnQgcmV0OwogCi0JaWYgKCFzcG9ydC0+ZG1hX3J4X2Rlc2MpIHsKLQkJZGV2X2VycihzcG9ydC0+cG9ydC5kZXYsICJOb3QgYWJsZSB0byBnZXQgZGVzYyBmb3IgcnhcbiIpOwotCQlyZXR1cm4gLUVJTzsKKwlkbWFfdHhfc2NvbmZpZy5kc3RfYWRkciA9IHNwb3J0LT5wb3J0Lm1hcGJhc2UgKyBVQVJURFI7CisJZG1hX3R4X3Njb25maWcuZHN0X2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfMV9CWVRFOworCWRtYV90eF9zY29uZmlnLmRzdF9tYXhidXJzdCA9IDE7CisJZG1hX3R4X3Njb25maWcuZGlyZWN0aW9uID0gRE1BX01FTV9UT19ERVY7CisJcmV0ID0gZG1hZW5naW5lX3NsYXZlX2NvbmZpZyhzcG9ydC0+ZG1hX3R4X2NoYW4sICZkbWFfdHhfc2NvbmZpZyk7CisKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LAorCQkJCSJETUEgc2xhdmUgY29uZmlnIGZhaWxlZCwgZXJyID0gJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CiAJfQogCi0Jc3BvcnQtPmRtYV9yeF9kZXNjLT5jYWxsYmFjayA9IGxwdWFydF9kbWFfcnhfY29tcGxldGU7Ci0Jc3BvcnQtPmRtYV9yeF9kZXNjLT5jYWxsYmFja19wYXJhbSA9IHNwb3J0OwotCXNwb3J0LT5kbWFfcnhfaW5fcHJvZ3Jlc3MgPSAxOwotCXNwb3J0LT5kbWFfcnhfY29va2llID0gZG1hZW5naW5lX3N1Ym1pdChzcG9ydC0+ZG1hX3J4X2Rlc2MpOwotCWRtYV9hc3luY19pc3N1ZV9wZW5kaW5nKHNwb3J0LT5kbWFfcnhfY2hhbik7Ci0KIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgbHB1YXJ0X2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IGxwdWFydF9wb3J0LCBwb3J0KTsKKwogCWlmIChzcG9ydC0+bHB1YXJ0X2RtYV90eF91c2UpIHsKKwkJaWYgKHNwb3J0LT5kbWFfdHhfaW5fcHJvZ3Jlc3MpIHsKKwkJCWRtYV91bm1hcF9zZyhzcG9ydC0+cG9ydC5kZXYsICZzcG9ydC0+dHhfc2dsWzBdLAorCQkJCXNwb3J0LT5kbWFfdHhfbmVudHMsIERNQV9UT19ERVZJQ0UpOworCQkJc3BvcnQtPmRtYV90eF9pbl9wcm9ncmVzcyA9IGZhbHNlOworCQl9CiAJCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKHNwb3J0LT5kbWFfdHhfY2hhbik7Ci0JCXNwb3J0LT5kbWFfdHhfaW5fcHJvZ3Jlc3MgPSAwOwogCX0KIH0KIAotc3RhdGljIHZvaWQgbHB1YXJ0X2RtYV9yeF9jb21wbGV0ZSh2b2lkICphcmcpCi17Ci0Jc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGFyZzsKLQlzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQgPSAmc3BvcnQtPnBvcnQuc3RhdGUtPnBvcnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWFzeW5jX3R4X2FjayhzcG9ydC0+ZG1hX3J4X2Rlc2MpOwotCW1vZF90aW1lcigmc3BvcnQtPmxwdWFydF90aW1lciwgamlmZmllcyArIHNwb3J0LT5kbWFfcnhfdGltZW91dCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOwotCi0Jc3BvcnQtPmRtYV9yeF9pbl9wcm9ncmVzcyA9IDA7Ci0JbHB1YXJ0X2NvcHlfcnhfdG9fdHR5KHNwb3J0LCBwb3J0LCBGU0xfVUFSVF9SWF9ETUFfQlVGRkVSX1NJWkUpOwotCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHBvcnQpOwotCWxwdWFydF9kbWFfcngoc3BvcnQpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBscHVhcnRfdGltZXJfZnVuYyh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IChzdHJ1Y3QgbHB1YXJ0X3BvcnQgKilkYXRhOwotCXN0cnVjdCB0dHlfcG9ydCAqcG9ydCA9ICZzcG9ydC0+cG9ydC5zdGF0ZS0+cG9ydDsKLQlzdHJ1Y3QgZG1hX3R4X3N0YXRlIHN0YXRlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgY2hhciB0ZW1wOwotCWludCBjb3VudDsKLQotCWRlbF90aW1lcigmc3BvcnQtPmxwdWFydF90aW1lcik7Ci0JZG1hZW5naW5lX3BhdXNlKHNwb3J0LT5kbWFfcnhfY2hhbik7Ci0JZG1hZW5naW5lX3R4X3N0YXR1cyhzcG9ydC0+ZG1hX3J4X2NoYW4sIHNwb3J0LT5kbWFfcnhfY29va2llLCAmc3RhdGUpOwotCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKHNwb3J0LT5kbWFfcnhfY2hhbik7Ci0JY291bnQgPSBGU0xfVUFSVF9SWF9ETUFfQlVGRkVSX1NJWkUgLSBzdGF0ZS5yZXNpZHVlOwotCWFzeW5jX3R4X2FjayhzcG9ydC0+ZG1hX3J4X2Rlc2MpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKLQotCXNwb3J0LT5kbWFfcnhfaW5fcHJvZ3Jlc3MgPSAwOwotCWxwdWFydF9jb3B5X3J4X3RvX3R0eShzcG9ydCwgcG9ydCwgY291bnQpOwotCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHBvcnQpOwotCXRlbXAgPSByZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSk7Ci0Jd3JpdGViKHRlbXAgJiB+VUFSVENSNV9SRE1BUywgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjUpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbHB1YXJ0X3ByZXBhcmVfcngoc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGNoYXIgdGVtcDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7Ci0KLQlzcG9ydC0+bHB1YXJ0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgc3BvcnQtPmRtYV9yeF90aW1lb3V0OwotCWFkZF90aW1lcigmc3BvcnQtPmxwdWFydF90aW1lcik7Ci0KLQlscHVhcnRfZG1hX3J4KHNwb3J0KTsKLQl0ZW1wID0gcmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjUpOwotCXdyaXRlYih0ZW1wIHwgVUFSVENSNV9SRE1BUywgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjUpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgbHB1YXJ0X3RyYW5zbWl0X2J1ZmZlcihzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0KQogewogCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZzcG9ydC0+cG9ydC5zdGF0ZS0+eG1pdDsKQEAgLTU4MCw4ICs0ODQsOCBAQAogCXdyaXRlYih0ZW1wIHwgVUFSVENSMl9USUUsIHBvcnQtPm1lbWJhc2UgKyBVQVJUQ1IyKTsKIAogCWlmIChzcG9ydC0+bHB1YXJ0X2RtYV90eF91c2UpIHsKLQkJaWYgKCF1YXJ0X2NpcmNfZW1wdHkoeG1pdCkgJiYgIXNwb3J0LT5kbWFfdHhfaW5fcHJvZ3Jlc3MpCi0JCQlscHVhcnRfcHJlcGFyZV90eChzcG9ydCk7CisJCWlmICghdWFydF9jaXJjX2VtcHR5KHhtaXQpICYmICF1YXJ0X3R4X3N0b3BwZWQocG9ydCkpCisJCQlscHVhcnRfZG1hX3R4KHNwb3J0KTsKIAl9IGVsc2UgewogCQlpZiAocmVhZGIocG9ydC0+bWVtYmFzZSArIFVBUlRTUjEpICYgVUFSVFNSMV9URFJFKQogCQkJbHB1YXJ0X3RyYW5zbWl0X2J1ZmZlcihzcG9ydCk7CkBAIC02MDAsNiArNTA0LDI5IEBACiAJCWxwdWFydDMyX3RyYW5zbWl0X2J1ZmZlcihzcG9ydCk7CiB9CiAKKy8qIHJldHVybiBUSU9DU0VSX1RFTVQgd2hlbiB0cmFuc21pdHRlciBpcyBub3QgYnVzeSAqLworc3RhdGljIHVuc2lnbmVkIGludCBscHVhcnRfdHhfZW1wdHkoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0ID0gY29udGFpbmVyX29mKHBvcnQsCisJCQlzdHJ1Y3QgbHB1YXJ0X3BvcnQsIHBvcnQpOworCXVuc2lnbmVkIGNoYXIgc3IxID0gcmVhZGIocG9ydC0+bWVtYmFzZSArIFVBUlRTUjEpOworCXVuc2lnbmVkIGNoYXIgc2ZpZm8gPSByZWFkYihwb3J0LT5tZW1iYXNlICsgVUFSVFNGSUZPKTsKKworCWlmIChzcG9ydC0+ZG1hX3R4X2luX3Byb2dyZXNzKQorCQlyZXR1cm4gMDsKKworCWlmIChzcjEgJiBVQVJUU1IxX1RDICYmIHNmaWZvICYgVUFSVFNGSUZPX1RYRU1QVCkKKwkJcmV0dXJuIFRJT0NTRVJfVEVNVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGxwdWFydDMyX3R4X2VtcHR5KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJcmV0dXJuIChscHVhcnQzMl9yZWFkKHBvcnQtPm1lbWJhc2UgKyBVQVJUU1RBVCkgJiBVQVJUU1RBVF9UQykgPworCQlUSU9DU0VSX1RFTVQgOiAwOworfQorCiBzdGF0aWMgaXJxcmV0dXJuX3QgbHB1YXJ0X3R4aW50KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0ID0gZGV2X2lkOwpAQCAtNzY2LDIzICs2OTMsMTUgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBscHVhcnRfaW50KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0ID0gZGV2X2lkOwotCXVuc2lnbmVkIGNoYXIgc3RzLCBjcmRtYTsKKwl1bnNpZ25lZCBjaGFyIHN0czsKIAogCXN0cyA9IHJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUU1IxKTsKLQljcmRtYSA9IHJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I1KTsKIAotCWlmIChzdHMgJiBVQVJUU1IxX1JEUkYgJiYgIShjcmRtYSAmIFVBUlRDUjVfUkRNQVMpKSB7Ci0JCWlmIChzcG9ydC0+bHB1YXJ0X2RtYV9yeF91c2UpCi0JCQlscHVhcnRfcHJlcGFyZV9yeChzcG9ydCk7Ci0JCWVsc2UKLQkJCWxwdWFydF9yeGludChpcnEsIGRldl9pZCk7Ci0JfQotCWlmIChzdHMgJiBVQVJUU1IxX1REUkUgJiYgIShjcmRtYSAmIFVBUlRDUjVfVERNQVMpKSB7Ci0JCWlmIChzcG9ydC0+bHB1YXJ0X2RtYV90eF91c2UpCi0JCQlscHVhcnRfcGlvX3R4KHNwb3J0KTsKLQkJZWxzZQotCQkJbHB1YXJ0X3R4aW50KGlycSwgZGV2X2lkKTsKLQl9CisJaWYgKHN0cyAmIFVBUlRTUjFfUkRSRikKKwkJbHB1YXJ0X3J4aW50KGlycSwgZGV2X2lkKTsKKworCWlmIChzdHMgJiBVQVJUU1IxX1REUkUpCisJCWxwdWFydF90eGludChpcnEsIGRldl9pZCk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC04MDcsMTcgKzcyNiwyNDEgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLS8qIHJldHVybiBUSU9DU0VSX1RFTVQgd2hlbiB0cmFuc21pdHRlciBpcyBub3QgYnVzeSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBscHVhcnRfdHhfZW1wdHkoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3N0YXRpYyB2b2lkIGxwdWFydF9jb3B5X3J4X3RvX3R0eShzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0KQogewotCXJldHVybiAocmVhZGIocG9ydC0+bWVtYmFzZSArIFVBUlRTUjEpICYgVUFSVFNSMV9UQykgPwotCQlUSU9DU0VSX1RFTVQgOiAwOworCXN0cnVjdCB0dHlfcG9ydCAqcG9ydCA9ICZzcG9ydC0+cG9ydC5zdGF0ZS0+cG9ydDsKKwlzdHJ1Y3QgZG1hX3R4X3N0YXRlIHN0YXRlOworCWVudW0gZG1hX3N0YXR1cyBkbWFzdGF0OworCXN0cnVjdCBjaXJjX2J1ZiAqcmluZyA9ICZzcG9ydC0+cnhfcmluZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjb3VudCA9IDA7CisJdW5zaWduZWQgY2hhciBzcjsKKworCXNyID0gcmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRTUjEpOworCisJaWYgKHNyICYgKFVBUlRTUjFfUEUgfCBVQVJUU1IxX0ZFKSkgeworCQkvKiBSZWFkIERSIHRvIGNsZWFyIHRoZSBlcnJvciBmbGFncyAqLworCQlyZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVERSKTsKKworCQlpZiAoc3IgJiBVQVJUU1IxX1BFKQorCQkgICAgc3BvcnQtPnBvcnQuaWNvdW50LnBhcml0eSsrOworCQllbHNlIGlmIChzciAmIFVBUlRTUjFfRkUpCisJCSAgICBzcG9ydC0+cG9ydC5pY291bnQuZnJhbWUrKzsKKwl9CisKKwlhc3luY190eF9hY2soc3BvcnQtPmRtYV9yeF9kZXNjKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7CisKKwlkbWFzdGF0ID0gZG1hZW5naW5lX3R4X3N0YXR1cyhzcG9ydC0+ZG1hX3J4X2NoYW4sCisJCQkJc3BvcnQtPmRtYV9yeF9jb29raWUsCisJCQkJJnN0YXRlKTsKKworCWlmIChkbWFzdGF0ID09IERNQV9FUlJPUikgeworCQlkZXZfZXJyKHNwb3J0LT5wb3J0LmRldiwgIlJ4IERNQSB0cmFuc2ZlciBmYWlsZWQhXG4iKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogQ1BVIGNsYWltcyBvd25lcnNoaXAgb2YgUlggRE1BIGJ1ZmZlciAqLworCWRtYV9zeW5jX3NnX2Zvcl9jcHUoc3BvcnQtPnBvcnQuZGV2LCAmc3BvcnQtPnJ4X3NnbCwgMSwgRE1BX0ZST01fREVWSUNFKTsKKworCS8qCisJICogcmluZy0+aGVhZCBwb2ludHMgdG8gdGhlIGVuZCBvZiBkYXRhIGFscmVhZHkgd3JpdHRlbiBieSB0aGUgRE1BLgorCSAqIHJpbmctPnRhaWwgcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgZGF0YSB0byBiZSByZWFkIGJ5IHRoZQorCSAqIGZyYW1ld29yay4KKwkgKiBUaGUgY3VycmVudCB0cmFuc2ZlciBzaXplIHNob3VsZCBub3QgYmUgbGFyZ2VyIHRoYW4gdGhlIGRtYSBidWZmZXIKKwkgKiBsZW5ndGguCisJICovCisJcmluZy0+aGVhZCA9IHNwb3J0LT5yeF9zZ2wubGVuZ3RoIC0gc3RhdGUucmVzaWR1ZTsKKwlCVUdfT04ocmluZy0+aGVhZCA+IHNwb3J0LT5yeF9zZ2wubGVuZ3RoKTsKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQgcmluZy0+aGVhZCBtYXkgcG9pbnQgdG8gdGhlIGZpcnN0IGJ5dGUgcmlnaHQgYWZ0ZXIgdGhlCisJICogbGFzdCBieXRlIG9mIHRoZSBkbWEgYnVmZmVyOgorCSAqIDAgPD0gcmluZy0+aGVhZCA8PSBzcG9ydC0+cnhfc2dsLmxlbmd0aAorCSAqCisJICogSG93ZXZlciByaW5nLT50YWlsIG11c3QgYWx3YXlzIHBvaW50cyBpbnNpZGUgdGhlIGRtYSBidWZmZXI6CisJICogMCA8PSByaW5nLT50YWlsIDw9IHNwb3J0LT5yeF9zZ2wubGVuZ3RoIC0gMQorCSAqCisJICogU2luY2Ugd2UgdXNlIGEgcmluZyBidWZmZXIsIHdlIGhhdmUgdG8gaGFuZGxlIHRoZSBjYXNlCisJICogd2hlcmUgaGVhZCBpcyBsb3dlciB0aGFuIHRhaWwuIEluIHN1Y2ggYSBjYXNlLCB3ZSBmaXJzdCByZWFkIGZyb20KKwkgKiB0YWlsIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB0aGVuIHJlc2V0IHRhaWwuCisJICovCisJaWYgKHJpbmctPmhlYWQgPCByaW5nLT50YWlsKSB7CisJCWNvdW50ID0gc3BvcnQtPnJ4X3NnbC5sZW5ndGggLSByaW5nLT50YWlsOworCisJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcocG9ydCwgcmluZy0+YnVmICsgcmluZy0+dGFpbCwgY291bnQpOworCQlyaW5nLT50YWlsID0gMDsKKwkJc3BvcnQtPnBvcnQuaWNvdW50LnJ4ICs9IGNvdW50OworCX0KKworCS8qIEZpbmFsbHkgd2UgcmVhZCBkYXRhIGZyb20gdGFpbCB0byBoZWFkICovCisJaWYgKHJpbmctPnRhaWwgPCByaW5nLT5oZWFkKSB7CisJCWNvdW50ID0gcmluZy0+aGVhZCAtIHJpbmctPnRhaWw7CisJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcocG9ydCwgcmluZy0+YnVmICsgcmluZy0+dGFpbCwgY291bnQpOworCQkvKiBXcmFwIHJpbmctPmhlYWQgaWYgbmVlZGVkICovCisJCWlmIChyaW5nLT5oZWFkID49IHNwb3J0LT5yeF9zZ2wubGVuZ3RoKQorCQkJcmluZy0+aGVhZCA9IDA7CisJCXJpbmctPnRhaWwgPSByaW5nLT5oZWFkOworCQlzcG9ydC0+cG9ydC5pY291bnQucnggKz0gY291bnQ7CisJfQorCisJZG1hX3N5bmNfc2dfZm9yX2RldmljZShzcG9ydC0+cG9ydC5kZXYsICZzcG9ydC0+cnhfc2dsLCAxLAorCQkJICAgICAgIERNQV9GUk9NX0RFVklDRSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7CisKKwl0dHlfZmxpcF9idWZmZXJfcHVzaChwb3J0KTsKKwltb2RfdGltZXIoJnNwb3J0LT5scHVhcnRfdGltZXIsIGppZmZpZXMgKyBzcG9ydC0+ZG1hX3J4X3RpbWVvdXQpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IGxwdWFydDMyX3R4X2VtcHR5KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCitzdGF0aWMgdm9pZCBscHVhcnRfZG1hX3J4X2NvbXBsZXRlKHZvaWQgKmFyZykKIHsKLQlyZXR1cm4gKGxwdWFydDMyX3JlYWQocG9ydC0+bWVtYmFzZSArIFVBUlRTVEFUKSAmIFVBUlRTVEFUX1RDKSA/Ci0JCVRJT0NTRVJfVEVNVCA6IDA7CisJc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGFyZzsKKworCWxwdWFydF9jb3B5X3J4X3RvX3R0eShzcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIGxwdWFydF90aW1lcl9mdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0ID0gKHN0cnVjdCBscHVhcnRfcG9ydCAqKWRhdGE7CisKKwlscHVhcnRfY29weV9yeF90b190dHkoc3BvcnQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBscHVhcnRfc3RhcnRfcnhfZG1hKHN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQpCit7CisJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgZG1hX3J4X3Njb25maWcgPSB7fTsKKwlzdHJ1Y3QgY2lyY19idWYgKnJpbmcgPSAmc3BvcnQtPnJ4X3Jpbmc7CisJaW50IHJldCwgbmVudDsKKwlpbnQgYml0cywgYmF1ZDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmc3BvcnQtPnBvcnQuc3RhdGUtPnBvcnQpOworCXN0cnVjdCBrdGVybWlvcyAqdGVybWlvcyA9ICZ0dHktPnRlcm1pb3M7CisKKwliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUodHR5KTsKKworCWJpdHMgPSAodGVybWlvcy0+Y19jZmxhZyAmIENTSVpFKSA9PSBDUzcgPyA5IDogMTA7CisJaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBQQVJFTkIpCisJCWJpdHMrKzsKKworCS8qCisJICogQ2FsY3VsYXRlIGxlbmd0aCBvZiBvbmUgRE1BIGJ1ZmZlciBzaXplIHRvIGtlZXAgbGF0ZW5jeSBiZWxvdworCSAqIDEwbXMgYXQgYW55IGJhdWQgcmF0ZS4KKwkgKi8KKwlzcG9ydC0+cnhfZG1hX3JuZ19idWZfbGVuID0gKERNQV9SWF9USU1FT1VUICogYmF1ZCAvICBiaXRzIC8gMTAwMCkgKiAyOworCXNwb3J0LT5yeF9kbWFfcm5nX2J1Zl9sZW4gPSAoMSA8PCAoZmxzKHNwb3J0LT5yeF9kbWFfcm5nX2J1Zl9sZW4pIC0gMSkpOworCWlmIChzcG9ydC0+cnhfZG1hX3JuZ19idWZfbGVuIDwgMTYpCisJCXNwb3J0LT5yeF9kbWFfcm5nX2J1Zl9sZW4gPSAxNjsKKworCXJpbmctPmJ1ZiA9IGttYWxsb2Moc3BvcnQtPnJ4X2RtYV9ybmdfYnVmX2xlbiwgR0ZQX0FUT01JQyk7CisJaWYgKCFyaW5nLT5idWYpIHsKKwkJZGV2X2VycihzcG9ydC0+cG9ydC5kZXYsICJSaW5nIGJ1ZiBhbGxvYyBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzZ19pbml0X29uZSgmc3BvcnQtPnJ4X3NnbCwgcmluZy0+YnVmLCBzcG9ydC0+cnhfZG1hX3JuZ19idWZfbGVuKTsKKwlzZ19zZXRfYnVmKCZzcG9ydC0+cnhfc2dsLCByaW5nLT5idWYsIHNwb3J0LT5yeF9kbWFfcm5nX2J1Zl9sZW4pOworCW5lbnQgPSBkbWFfbWFwX3NnKHNwb3J0LT5wb3J0LmRldiwgJnNwb3J0LT5yeF9zZ2wsIDEsIERNQV9GUk9NX0RFVklDRSk7CisKKwlpZiAoIW5lbnQpIHsKKwkJZGV2X2VycihzcG9ydC0+cG9ydC5kZXYsICJETUEgUnggbWFwcGluZyBlcnJvclxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRtYV9yeF9zY29uZmlnLnNyY19hZGRyID0gc3BvcnQtPnBvcnQubWFwYmFzZSArIFVBUlREUjsKKwlkbWFfcnhfc2NvbmZpZy5zcmNfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF8xX0JZVEU7CisJZG1hX3J4X3Njb25maWcuc3JjX21heGJ1cnN0ID0gMTsKKwlkbWFfcnhfc2NvbmZpZy5kaXJlY3Rpb24gPSBETUFfREVWX1RPX01FTTsKKwlyZXQgPSBkbWFlbmdpbmVfc2xhdmVfY29uZmlnKHNwb3J0LT5kbWFfcnhfY2hhbiwgJmRtYV9yeF9zY29uZmlnKTsKKworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LAorCQkJCSJETUEgUnggc2xhdmUgY29uZmlnIGZhaWxlZCwgZXJyID0gJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJc3BvcnQtPmRtYV9yeF9kZXNjID0gZG1hZW5naW5lX3ByZXBfZG1hX2N5Y2xpYyhzcG9ydC0+ZG1hX3J4X2NoYW4sCisJCQkJIHNnX2RtYV9hZGRyZXNzKCZzcG9ydC0+cnhfc2dsKSwKKwkJCQkgc3BvcnQtPnJ4X3NnbC5sZW5ndGgsCisJCQkJIHNwb3J0LT5yeF9zZ2wubGVuZ3RoIC8gMiwKKwkJCQkgRE1BX0RFVl9UT19NRU0sCisJCQkJIERNQV9QUkVQX0lOVEVSUlVQVCk7CisJaWYgKCFzcG9ydC0+ZG1hX3J4X2Rlc2MpIHsKKwkJZGV2X2VycihzcG9ydC0+cG9ydC5kZXYsICJDYW5ub3QgcHJlcGFyZSBjeWNsaWMgRE1BXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJc3BvcnQtPmRtYV9yeF9kZXNjLT5jYWxsYmFjayA9IGxwdWFydF9kbWFfcnhfY29tcGxldGU7CisJc3BvcnQtPmRtYV9yeF9kZXNjLT5jYWxsYmFja19wYXJhbSA9IHNwb3J0OworCXNwb3J0LT5kbWFfcnhfY29va2llID0gZG1hZW5naW5lX3N1Ym1pdChzcG9ydC0+ZG1hX3J4X2Rlc2MpOworCWRtYV9hc3luY19pc3N1ZV9wZW5kaW5nKHNwb3J0LT5kbWFfcnhfY2hhbik7CisKKwl3cml0ZWIocmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjUpIHwgVUFSVENSNV9SRE1BUywKKwkJCQlzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbHB1YXJ0X2RtYV9yeF9mcmVlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGNvbnRhaW5lcl9vZihwb3J0LAorCQkJCQlzdHJ1Y3QgbHB1YXJ0X3BvcnQsIHBvcnQpOworCisJaWYgKHNwb3J0LT5kbWFfcnhfY2hhbikKKwkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoc3BvcnQtPmRtYV9yeF9jaGFuKTsKKworCWRtYV91bm1hcF9zZyhzcG9ydC0+cG9ydC5kZXYsICZzcG9ydC0+cnhfc2dsLCAxLCBETUFfRlJPTV9ERVZJQ0UpOworCWtmcmVlKHNwb3J0LT5yeF9yaW5nLmJ1Zik7CisJc3BvcnQtPnJ4X3JpbmcudGFpbCA9IDA7CisJc3BvcnQtPnJ4X3JpbmcuaGVhZCA9IDA7CisJc3BvcnQtPmRtYV9yeF9kZXNjID0gTlVMTDsKKwlzcG9ydC0+ZG1hX3J4X2Nvb2tpZSA9IC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgbHB1YXJ0X2NvbmZpZ19yczQ4NShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LAorCQkJc3RydWN0IHNlcmlhbF9yczQ4NSAqcnM0ODUpCit7CisJc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGNvbnRhaW5lcl9vZihwb3J0LAorCQkJc3RydWN0IGxwdWFydF9wb3J0LCBwb3J0KTsKKworCXU4IG1vZGVtID0gcmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRNT0RFTSkgJgorCQl+KFVBUlRNT0RFTV9UWFJUU1BPTCB8IFVBUlRNT0RFTV9UWFJUU0UpOworCXdyaXRlYihtb2RlbSwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRNT0RFTSk7CisKKwlpZiAocnM0ODUtPmZsYWdzICYgU0VSX1JTNDg1X0VOQUJMRUQpIHsKKwkJLyogRW5hYmxlIGF1dG8gUlMtNDg1IFJUUyBtb2RlICovCisJCW1vZGVtIHw9IFVBUlRNT0RFTV9UWFJUU0U7CisKKwkJLyoKKwkJICogUlRTIG5lZWRzIHRvIGJlIGxvZ2ljIEhJR0ggZWl0aGVyIGR1cmluZyB0cmFuc2VyIF9vcl8gYWZ0ZXIKKwkJICogdHJhbnNmZXIsIG90aGVyIHZhcmlhbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZS4KKwkJICovCisKKwkJaWYgKCEocnM0ODUtPmZsYWdzICYgKFNFUl9SUzQ4NV9SVFNfT05fU0VORCB8CisJCQkJU0VSX1JTNDg1X1JUU19BRlRFUl9TRU5EKSkpCisJCQlyczQ4NS0+ZmxhZ3MgfD0gU0VSX1JTNDg1X1JUU19PTl9TRU5EOworCisJCWlmIChyczQ4NS0+ZmxhZ3MgJiBTRVJfUlM0ODVfUlRTX09OX1NFTkQgJiYKKwkJCQlyczQ4NS0+ZmxhZ3MgJiBTRVJfUlM0ODVfUlRTX0FGVEVSX1NFTkQpCisJCQlyczQ4NS0+ZmxhZ3MgJj0gflNFUl9SUzQ4NV9SVFNfQUZURVJfU0VORDsKKworCQkvKgorCQkgKiBUaGUgaGFyZHdhcmUgZGVmYXVsdHMgdG8gUlRTIGxvZ2ljIEhJR0ggd2hpbGUgdHJhbnNmZXIuCisJCSAqIFN3aXRjaCBwb2xhcml0eSBpbiBjYXNlIFJUUyBzaGFsbCBiZSBsb2dpYyBISUdICisJCSAqIGFmdGVyIHRyYW5zZmVyLgorCQkgKiBOb3RlOiBVQVJUIGlzIGFzc3VtZWQgdG8gYmUgYWN0aXZlIGhpZ2guCisJCSAqLworCQlpZiAocnM0ODUtPmZsYWdzICYgU0VSX1JTNDg1X1JUU19PTl9TRU5EKQorCQkJbW9kZW0gJj0gflVBUlRNT0RFTV9UWFJUU1BPTDsKKwkJZWxzZSBpZiAocnM0ODUtPmZsYWdzICYgU0VSX1JTNDg1X1JUU19BRlRFUl9TRU5EKQorCQkJbW9kZW0gfD0gVUFSVE1PREVNX1RYUlRTUE9MOworCX0KKworCS8qIFN0b3JlIHRoZSBuZXcgY29uZmlndXJhdGlvbiAqLworCXNwb3J0LT5wb3J0LnJzNDg1ID0gKnJzNDg1OworCisJd3JpdGViKG1vZGVtLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVE1PREVNKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBscHVhcnRfZ2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCkBAIC04NTMsMTcgKzk5NiwyMiBAQAogc3RhdGljIHZvaWQgbHB1YXJ0X3NldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgbWN0cmwpCiB7CiAJdW5zaWduZWQgY2hhciB0ZW1wOworCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBjb250YWluZXJfb2YocG9ydCwKKwkJCQlzdHJ1Y3QgbHB1YXJ0X3BvcnQsIHBvcnQpOwogCi0JdGVtcCA9IHJlYWRiKHBvcnQtPm1lbWJhc2UgKyBVQVJUTU9ERU0pICYKKwkvKiBNYWtlIHN1cmUgUlhSVFNFIGJpdCBpcyBub3Qgc2V0IHdoZW4gUlM0ODUgaXMgZW5hYmxlZCAqLworCWlmICghKHNwb3J0LT5wb3J0LnJzNDg1LmZsYWdzICYgU0VSX1JTNDg1X0VOQUJMRUQpKSB7CisJCXRlbXAgPSByZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVE1PREVNKSAmCiAJCQl+KFVBUlRNT0RFTV9SWFJUU0UgfCBVQVJUTU9ERU1fVFhDVFNFKTsKIAotCWlmIChtY3RybCAmIFRJT0NNX1JUUykKLQkJdGVtcCB8PSBVQVJUTU9ERU1fUlhSVFNFOworCQlpZiAobWN0cmwgJiBUSU9DTV9SVFMpCisJCQl0ZW1wIHw9IFVBUlRNT0RFTV9SWFJUU0U7CiAKLQlpZiAobWN0cmwgJiBUSU9DTV9DVFMpCi0JCXRlbXAgfD0gVUFSVE1PREVNX1RYQ1RTRTsKKwkJaWYgKG1jdHJsICYgVElPQ01fQ1RTKQorCQkJdGVtcCB8PSBVQVJUTU9ERU1fVFhDVFNFOwogCi0Jd3JpdGViKHRlbXAsIHBvcnQtPm1lbWJhc2UgKyBVQVJUTU9ERU0pOworCQl3cml0ZWIodGVtcCwgcG9ydC0+bWVtYmFzZSArIFVBUlRNT0RFTSk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBscHVhcnQzMl9zZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IG1jdHJsKQpAQCAtOTIxLDEzICsxMDY5LDE2IEBACiAJd3JpdGViKHZhbCB8IFVBUlRQRklGT19UWEZFIHwgVUFSVFBGSUZPX1JYRkUsCiAJCQlzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVFBGSUZPKTsKIAotCS8qIGV4cGxpY2l0bHkgY2xlYXIgUkRSRiAqLwotCXJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUU1IxKTsKLQogCS8qIGZsdXNoIFR4IGFuZCBSeCBGSUZPICovCiAJd3JpdGViKFVBUlRDRklGT19UWEZMVVNIIHwgVUFSVENGSUZPX1JYRkxVU0gsCiAJCQlzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENGSUZPKTsKIAorCS8qIGV4cGxpY2l0bHkgY2xlYXIgUkRSRiAqLworCWlmIChyZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVFNSMSkgJiBVQVJUU1IxX1JEUkYpIHsKKwkJcmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlREUik7CisJCXdyaXRlYihVQVJUU0ZJRk9fUlhVRiwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRTRklGTyk7CisJfQorCiAJd3JpdGViKDAsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUVFdGSUZPKTsKIAl3cml0ZWIoMSwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRSV0ZJRk8pOwogCkBAIC05NjAsMTEwICsxMTExLDEyIEBACiAJbHB1YXJ0MzJfd3JpdGUoY3RybF9zYXZlZCwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDVFJMKTsKIH0KIAotc3RhdGljIGludCBscHVhcnRfZG1hX3R4X3JlcXVlc3Qoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3N0YXRpYyB2b2lkIHJ4X2RtYV90aW1lcl9pbml0KHN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQpCiB7Ci0Jc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGNvbnRhaW5lcl9vZihwb3J0LAotCQkJCQlzdHJ1Y3QgbHB1YXJ0X3BvcnQsIHBvcnQpOwotCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnIGRtYV90eF9zY29uZmlnOwotCWRtYV9hZGRyX3QgZG1hX2J1czsKLQl1bnNpZ25lZCBjaGFyICpkbWFfYnVmOwotCWludCByZXQ7Ci0KLQlkbWFfYnVzID0gZG1hX21hcF9zaW5nbGUoc3BvcnQtPmRtYV90eF9jaGFuLT5kZXZpY2UtPmRldiwKLQkJCQlzcG9ydC0+cG9ydC5zdGF0ZS0+eG1pdC5idWYsCi0JCQkJVUFSVF9YTUlUX1NJWkUsIERNQV9UT19ERVZJQ0UpOwotCi0JaWYgKGRtYV9tYXBwaW5nX2Vycm9yKHNwb3J0LT5kbWFfdHhfY2hhbi0+ZGV2aWNlLT5kZXYsIGRtYV9idXMpKSB7Ci0JCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LCAiZG1hX21hcF9zaW5nbGUgdHggZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JZG1hX2J1ZiA9IHNwb3J0LT5wb3J0LnN0YXRlLT54bWl0LmJ1ZjsKLQlkbWFfdHhfc2NvbmZpZy5kc3RfYWRkciA9IHNwb3J0LT5wb3J0Lm1hcGJhc2UgKyBVQVJURFI7Ci0JZG1hX3R4X3Njb25maWcuZHN0X2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfMV9CWVRFOwotCWRtYV90eF9zY29uZmlnLmRzdF9tYXhidXJzdCA9IHNwb3J0LT50eGZpZm9fc2l6ZTsKLQlkbWFfdHhfc2NvbmZpZy5kaXJlY3Rpb24gPSBETUFfTUVNX1RPX0RFVjsKLQlyZXQgPSBkbWFlbmdpbmVfc2xhdmVfY29uZmlnKHNwb3J0LT5kbWFfdHhfY2hhbiwgJmRtYV90eF9zY29uZmlnKTsKLQotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LAotCQkJCSJEbWEgc2xhdmUgY29uZmlnIGZhaWxlZCwgZXJyID0gJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0Jc3BvcnQtPmRtYV90eF9idWZfdmlydCA9IGRtYV9idWY7Ci0Jc3BvcnQtPmRtYV90eF9idWZfYnVzID0gZG1hX2J1czsKLQlzcG9ydC0+ZG1hX3R4X2luX3Byb2dyZXNzID0gMDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGxwdWFydF9kbWFfcnhfcmVxdWVzdChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQotewotCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBjb250YWluZXJfb2YocG9ydCwKLQkJCQkJc3RydWN0IGxwdWFydF9wb3J0LCBwb3J0KTsKLQlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyBkbWFfcnhfc2NvbmZpZzsKLQlkbWFfYWRkcl90IGRtYV9idXM7Ci0JdW5zaWduZWQgY2hhciAqZG1hX2J1ZjsKLQlpbnQgcmV0OwotCi0JZG1hX2J1ZiA9IGRldm1fa3phbGxvYyhzcG9ydC0+cG9ydC5kZXYsCi0JCQkJRlNMX1VBUlRfUlhfRE1BX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKTsKLQotCWlmICghZG1hX2J1ZikgewotCQlkZXZfZXJyKHNwb3J0LT5wb3J0LmRldiwgIkRtYSByeCBhbGxvYyBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlkbWFfYnVzID0gZG1hX21hcF9zaW5nbGUoc3BvcnQtPmRtYV9yeF9jaGFuLT5kZXZpY2UtPmRldiwgZG1hX2J1ZiwKLQkJCQlGU0xfVUFSVF9SWF9ETUFfQlVGRkVSX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7Ci0KLQlpZiAoZG1hX21hcHBpbmdfZXJyb3Ioc3BvcnQtPmRtYV9yeF9jaGFuLT5kZXZpY2UtPmRldiwgZG1hX2J1cykpIHsKLQkJZGV2X2VycihzcG9ydC0+cG9ydC5kZXYsICJkbWFfbWFwX3NpbmdsZSByeCBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlkbWFfcnhfc2NvbmZpZy5zcmNfYWRkciA9IHNwb3J0LT5wb3J0Lm1hcGJhc2UgKyBVQVJURFI7Ci0JZG1hX3J4X3Njb25maWcuc3JjX2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfMV9CWVRFOwotCWRtYV9yeF9zY29uZmlnLnNyY19tYXhidXJzdCA9IDE7Ci0JZG1hX3J4X3Njb25maWcuZGlyZWN0aW9uID0gRE1BX0RFVl9UT19NRU07Ci0JcmV0ID0gZG1hZW5naW5lX3NsYXZlX2NvbmZpZyhzcG9ydC0+ZG1hX3J4X2NoYW4sICZkbWFfcnhfc2NvbmZpZyk7Ci0KLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHNwb3J0LT5wb3J0LmRldiwKLQkJCQkiRG1hIHNsYXZlIGNvbmZpZyBmYWlsZWQsIGVyciA9ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXNwb3J0LT5kbWFfcnhfYnVmX3ZpcnQgPSBkbWFfYnVmOwotCXNwb3J0LT5kbWFfcnhfYnVmX2J1cyA9IGRtYV9idXM7Ci0Jc3BvcnQtPmRtYV9yeF9pbl9wcm9ncmVzcyA9IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbHB1YXJ0X2RtYV90eF9mcmVlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0Jc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGNvbnRhaW5lcl9vZihwb3J0LAotCQkJCQlzdHJ1Y3QgbHB1YXJ0X3BvcnQsIHBvcnQpOwotCi0JZG1hX3VubWFwX3NpbmdsZShzcG9ydC0+cG9ydC5kZXYsIHNwb3J0LT5kbWFfdHhfYnVmX2J1cywKLQkJCVVBUlRfWE1JVF9TSVpFLCBETUFfVE9fREVWSUNFKTsKLQotCXNwb3J0LT5kbWFfdHhfYnVmX2J1cyA9IDA7Ci0Jc3BvcnQtPmRtYV90eF9idWZfdmlydCA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIGxwdWFydF9kbWFfcnhfZnJlZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQotewotCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBjb250YWluZXJfb2YocG9ydCwKLQkJCQkJc3RydWN0IGxwdWFydF9wb3J0LCBwb3J0KTsKLQotCWRtYV91bm1hcF9zaW5nbGUoc3BvcnQtPnBvcnQuZGV2LCBzcG9ydC0+ZG1hX3J4X2J1Zl9idXMsCi0JCQlGU0xfVUFSVF9SWF9ETUFfQlVGRkVSX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7Ci0KLQlzcG9ydC0+ZG1hX3J4X2J1Zl9idXMgPSAwOwotCXNwb3J0LT5kbWFfcnhfYnVmX3ZpcnQgPSBOVUxMOworCQlzZXR1cF90aW1lcigmc3BvcnQtPmxwdWFydF90aW1lciwgbHB1YXJ0X3RpbWVyX2Z1bmMsCisJCQkJKHVuc2lnbmVkIGxvbmcpc3BvcnQpOworCQlzcG9ydC0+bHB1YXJ0X3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgc3BvcnQtPmRtYV9yeF90aW1lb3V0OworCQlhZGRfdGltZXIoJnNwb3J0LT5scHVhcnRfdGltZXIpOwogfQogCiBzdGF0aWMgaW50IGxwdWFydF9zdGFydHVwKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCkBAIC0xMDg0LDIyICsxMTM3LDYgQEAKIAlzcG9ydC0+cnhmaWZvX3NpemUgPSAweDEgPDwgKCgodGVtcCA+PiBVQVJUUEZJRk9fUlhTSVpFX09GRikgJgogCQlVQVJUUEZJRk9fRklGT1NJWkVfTUFTSykgKyAxKTsKIAotCWlmIChzcG9ydC0+ZG1hX3J4X2NoYW4gJiYgIWxwdWFydF9kbWFfcnhfcmVxdWVzdChwb3J0KSkgewotCQlzcG9ydC0+bHB1YXJ0X2RtYV9yeF91c2UgPSB0cnVlOwotCQlzZXR1cF90aW1lcigmc3BvcnQtPmxwdWFydF90aW1lciwgbHB1YXJ0X3RpbWVyX2Z1bmMsCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcpc3BvcnQpOwotCX0gZWxzZQotCQlzcG9ydC0+bHB1YXJ0X2RtYV9yeF91c2UgPSBmYWxzZTsKLQotCi0JaWYgKHNwb3J0LT5kbWFfdHhfY2hhbiAmJiAhbHB1YXJ0X2RtYV90eF9yZXF1ZXN0KHBvcnQpKSB7Ci0JCXNwb3J0LT5scHVhcnRfZG1hX3R4X3VzZSA9IHRydWU7Ci0JCXRlbXAgPSByZWFkYihwb3J0LT5tZW1iYXNlICsgVUFSVENSNSk7Ci0JCXRlbXAgJj0gflVBUlRDUjVfUkRNQVM7Ci0JCXdyaXRlYih0ZW1wIHwgVUFSVENSNV9URE1BUywgcG9ydC0+bWVtYmFzZSArIFVBUlRDUjUpOwotCX0gZWxzZQotCQlzcG9ydC0+bHB1YXJ0X2RtYV90eF91c2UgPSBmYWxzZTsKLQogCXJldCA9IGRldm1fcmVxdWVzdF9pcnEocG9ydC0+ZGV2LCBwb3J0LT5pcnEsIGxwdWFydF9pbnQsIDAsCiAJCQkJRFJJVkVSX05BTUUsIHNwb3J0KTsKIAlpZiAocmV0KQpAQCAtMTExMyw3ICsxMTUwLDI5IEBACiAJdGVtcCB8PSAoVUFSVENSMl9SSUUgfCBVQVJUQ1IyX1RJRSB8IFVBUlRDUjJfUkUgfCBVQVJUQ1IyX1RFKTsKIAl3cml0ZWIodGVtcCwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjIpOwogCisJaWYgKHNwb3J0LT5kbWFfcnhfY2hhbiAmJiAhbHB1YXJ0X3N0YXJ0X3J4X2RtYShzcG9ydCkpIHsKKwkJLyogc2V0IFJ4IERNQSB0aW1lb3V0ICovCisJCXNwb3J0LT5kbWFfcnhfdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMoRE1BX1JYX1RJTUVPVVQpOworCQlpZiAoIXNwb3J0LT5kbWFfcnhfdGltZW91dCkKKwkJICAgICBzcG9ydC0+ZG1hX3J4X3RpbWVvdXQgPSAxOworCisJCXNwb3J0LT5scHVhcnRfZG1hX3J4X3VzZSA9IHRydWU7CisJCXJ4X2RtYV90aW1lcl9pbml0KHNwb3J0KTsKKwl9IGVsc2UgeworCQlzcG9ydC0+bHB1YXJ0X2RtYV9yeF91c2UgPSBmYWxzZTsKKwl9CisKKwlpZiAoc3BvcnQtPmRtYV90eF9jaGFuICYmICFscHVhcnRfZG1hX3R4X3JlcXVlc3QocG9ydCkpIHsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmc3BvcnQtPmRtYV93YWl0KTsKKwkJc3BvcnQtPmxwdWFydF9kbWFfdHhfdXNlID0gdHJ1ZTsKKwkJdGVtcCA9IHJlYWRiKHBvcnQtPm1lbWJhc2UgKyBVQVJUQ1I1KTsKKwkJd3JpdGViKHRlbXAgfCBVQVJUQ1I1X1RETUFTLCBwb3J0LT5tZW1iYXNlICsgVUFSVENSNSk7CisJfSBlbHNlIHsKKwkJc3BvcnQtPmxwdWFydF9kbWFfdHhfdXNlID0gZmFsc2U7CisJfQorCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExNzAsMTIgKzEyMjksMTkgQEAKIAlkZXZtX2ZyZWVfaXJxKHBvcnQtPmRldiwgcG9ydC0+aXJxLCBzcG9ydCk7CiAKIAlpZiAoc3BvcnQtPmxwdWFydF9kbWFfcnhfdXNlKSB7Ci0JCWxwdWFydF9kbWFfcnhfZnJlZSgmc3BvcnQtPnBvcnQpOwogCQlkZWxfdGltZXJfc3luYygmc3BvcnQtPmxwdWFydF90aW1lcik7CisJCWxwdWFydF9kbWFfcnhfZnJlZSgmc3BvcnQtPnBvcnQpOwogCX0KIAotCWlmIChzcG9ydC0+bHB1YXJ0X2RtYV90eF91c2UpCi0JCWxwdWFydF9kbWFfdHhfZnJlZSgmc3BvcnQtPnBvcnQpOworCWlmIChzcG9ydC0+bHB1YXJ0X2RtYV90eF91c2UpIHsKKwkJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzcG9ydC0+ZG1hX3dhaXQsCisJCQkhc3BvcnQtPmRtYV90eF9pbl9wcm9ncmVzcykgIT0gZmFsc2UpIHsKKwkJCXNwb3J0LT5kbWFfdHhfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKKwkJCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKHNwb3J0LT5kbWFfdHhfY2hhbik7CisJCX0KKworCQlscHVhcnRfc3RvcF90eChwb3J0KTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGxwdWFydDMyX3NodXRkb3duKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCkBAIC0xMjAzLDEzICsxMjY5LDE0IEBACiB7CiAJc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3QgbHB1YXJ0X3BvcnQsIHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgY2hhciBjcjEsIG9sZF9jcjEsIG9sZF9jcjIsIGNyNCwgYmRoLCBtb2RlbTsKKwl1bnNpZ25lZCBjaGFyIGNyMSwgb2xkX2NyMSwgb2xkX2NyMiwgY3IzLCBjcjQsIGJkaCwgbW9kZW07CiAJdW5zaWduZWQgaW50ICBiYXVkOwogCXVuc2lnbmVkIGludCBvbGRfY3NpemUgPSBvbGQgPyBvbGQtPmNfY2ZsYWcgJiBDU0laRSA6IENTODsKIAl1bnNpZ25lZCBpbnQgc2JyLCBicmZhOwogCiAJY3IxID0gb2xkX2NyMSA9IHJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1IxKTsKIAlvbGRfY3IyID0gcmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjIpOworCWNyMyA9IHJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1IzKTsKIAljcjQgPSByZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNCk7CiAJYmRoID0gcmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRCREgpOwogCW1vZGVtID0gcmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRNT0RFTSk7CkBAIC0xMjQwLDYgKzEzMDcsMTMgQEAKIAkJY3IxIHw9IFVBUlRDUjFfTTsKIAl9CiAKKwkvKgorCSAqIFdoZW4gYXV0byBSUy00ODUgUlRTIG1vZGUgaXMgZW5hYmxlZCwKKwkgKiBoYXJkd2FyZSBmbG93IGNvbnRyb2wgbmVlZCB0byBiZSBkaXNhYmxlZC4KKwkgKi8KKwlpZiAoc3BvcnQtPnBvcnQucnM0ODUuZmxhZ3MgJiBTRVJfUlM0ODVfRU5BQkxFRCkKKwkJdGVybWlvcy0+Y19jZmxhZyAmPSB+Q1JUU0NUUzsKKwogCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgewogCQltb2RlbSB8PSAoVUFSVE1PREVNX1JYUlRTRSB8IFVBUlRNT0RFTV9UWENUU0UpOwogCX0gZWxzZSB7CkBAIC0xMjU3LDcgKzEzMzEsMTAgQEAKIAlpZiAoKHRlcm1pb3MtPmNfY2ZsYWcgJiBQQVJFTkIpKSB7CiAJCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ01TUEFSKSB7CiAJCQljcjEgJj0gflVBUlRDUjFfUEU7Ci0JCQljcjEgfD0gVUFSVENSMV9NOworCQkJaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBQQVJPREQpCisJCQkJY3IzIHw9IFVBUlRDUjNfVDg7CisJCQllbHNlCisJCQkJY3IzICY9IH5VQVJUQ1IzX1Q4OwogCQl9IGVsc2UgewogCQkJY3IxIHw9IFVBUlRDUjFfUEU7CiAJCQlpZiAoKHRlcm1pb3MtPmNfY2ZsYWcgJiBDU0laRSkgPT0gQ1M4KQpAQCAtMTI5NywxNyArMTM3NCw2IEBACiAJLyogdXBkYXRlIHRoZSBwZXItcG9ydCB0aW1lb3V0ICovCiAJdWFydF91cGRhdGVfdGltZW91dChwb3J0LCB0ZXJtaW9zLT5jX2NmbGFnLCBiYXVkKTsKIAotCWlmIChzcG9ydC0+bHB1YXJ0X2RtYV9yeF91c2UpIHsKLQkJLyogQ2FsY3VsYXRlIGRlbGF5IGZvciAxLjUgRE1BIGJ1ZmZlcnMgKi8KLQkJc3BvcnQtPmRtYV9yeF90aW1lb3V0ID0gKHNwb3J0LT5wb3J0LnRpbWVvdXQgLSBIWiAvIDUwKSAqCi0JCQkJCUZTTF9VQVJUX1JYX0RNQV9CVUZGRVJfU0laRSAqIDMgLwotCQkJCQlzcG9ydC0+cnhmaWZvX3NpemUgLyAyOwotCQlkZXZfZGJnKHBvcnQtPmRldiwgIkRNQSBSeCB0LW91dCAldW1zLCB0dHkgdC1vdXQgJXUgamlmZmllc1xuIiwKLQkJCXNwb3J0LT5kbWFfcnhfdGltZW91dCAqIDEwMDAgLyBIWiwgc3BvcnQtPnBvcnQudGltZW91dCk7Ci0JCWlmIChzcG9ydC0+ZG1hX3J4X3RpbWVvdXQgPCBtc2Vjc190b19qaWZmaWVzKDIwKSkKLQkJCXNwb3J0LT5kbWFfcnhfdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMoMjApOwotCX0KLQogCS8qIHdhaXQgdHJhbnNtaXQgZW5naW4gY29tcGxldGUgKi8KIAl3aGlsZSAoIShyZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVFNSMSkgJiBVQVJUU1IxX1RDKSkKIAkJYmFycmllcigpOwpAQCAtMTMyNSwxMiArMTM5MSwzMSBAQAogCXdyaXRlYihjcjQgfCBicmZhLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNCk7CiAJd3JpdGViKGJkaCwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRCREgpOwogCXdyaXRlYihzYnIgJiAweEZGLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVEJETCk7CisJd3JpdGViKGNyMywgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjMpOwogCXdyaXRlYihjcjEsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1IxKTsKIAl3cml0ZWIobW9kZW0sIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUTU9ERU0pOwogCiAJLyogcmVzdG9yZSBjb250cm9sIHJlZ2lzdGVyICovCiAJd3JpdGViKG9sZF9jcjIsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1IyKTsKIAorCS8qCisJICogSWYgbmV3IGJhdWQgcmF0ZSBpcyBzZXQsIHdlIHdpbGwgYWxzbyBuZWVkIHRvIHVwZGF0ZSB0aGUgUmluZyBidWZmZXIKKwkgKiBsZW5ndGggYWNjb3JkaW5nIHRvIHRoZSBzZWxlY3RlZCBiYXVkIHJhdGUgYW5kIHJlc3RhcnQgUnggRE1BIHBhdGguCisJICovCisJaWYgKG9sZCkgeworCQlpZiAoc3BvcnQtPmxwdWFydF9kbWFfcnhfdXNlKSB7CisJCQlkZWxfdGltZXJfc3luYygmc3BvcnQtPmxwdWFydF90aW1lcik7CisJCQlscHVhcnRfZG1hX3J4X2ZyZWUoJnNwb3J0LT5wb3J0KTsKKwkJfQorCisJCWlmIChzcG9ydC0+ZG1hX3J4X2NoYW4gJiYgIWxwdWFydF9zdGFydF9yeF9kbWEoc3BvcnQpKSB7CisJCQlzcG9ydC0+bHB1YXJ0X2RtYV9yeF91c2UgPSB0cnVlOworCQkJcnhfZG1hX3RpbWVyX2luaXQoc3BvcnQpOworCQl9IGVsc2UgeworCQkJc3BvcnQtPmxwdWFydF9kbWFfcnhfdXNlID0gZmFsc2U7CisJCX0KKwl9CisKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTE0OTQsNyArMTU3OSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCB1YXJ0X29wcyBscHVhcnRfcG9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWFydF9vcHMgbHB1YXJ0X3BvcHMgPSB7CiAJLnR4X2VtcHR5CT0gbHB1YXJ0X3R4X2VtcHR5LAogCS5zZXRfbWN0cmwJPSBscHVhcnRfc2V0X21jdHJsLAogCS5nZXRfbWN0cmwJPSBscHVhcnRfZ2V0X21jdHJsLApAQCAtMTUxMyw3ICsxNTk4LDcgQEAKIAkuZmx1c2hfYnVmZmVyCT0gbHB1YXJ0X2ZsdXNoX2J1ZmZlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdWFydF9vcHMgbHB1YXJ0MzJfcG9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWFydF9vcHMgbHB1YXJ0MzJfcG9wcyA9IHsKIAkudHhfZW1wdHkJPSBscHVhcnQzMl90eF9lbXB0eSwKIAkuc2V0X21jdHJsCT0gbHB1YXJ0MzJfc2V0X21jdHJsLAogCS5nZXRfbWN0cmwJPSBscHVhcnQzMl9nZXRfbWN0cmwsCkBAIC0xODQzLDYgKzE5MjgsOCBAQAogCQlzcG9ydC0+cG9ydC5vcHMgPSAmbHB1YXJ0X3BvcHM7CiAJc3BvcnQtPnBvcnQuZmxhZ3MgPSBVUEZfQk9PVF9BVVRPQ09ORjsKIAorCXNwb3J0LT5wb3J0LnJzNDg1X2NvbmZpZyA9IGxwdWFydF9jb25maWdfcnM0ODU7CisKIAlzcG9ydC0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJpcGciKTsKIAlpZiAoSVNfRVJSKHNwb3J0LT5jbGspKSB7CiAJCXJldCA9IFBUUl9FUlIoc3BvcnQtPmNsayk7CkBAIC0xODgzLDYgKzE5NzAsMTIgQEAKIAkJZGV2X2luZm8oc3BvcnQtPnBvcnQuZGV2LCAiRE1BIHJ4IGNoYW5uZWwgcmVxdWVzdCBmYWlsZWQsICIKIAkJCQkib3BlcmF0aW5nIHdpdGhvdXQgcnggRE1BXG4iKTsKIAorCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJsaW51eCxyczQ4NS1lbmFibGVkLWF0LWJvb3QtdGltZSIpKSB7CisJCXNwb3J0LT5wb3J0LnJzNDg1LmZsYWdzIHw9IFNFUl9SUzQ4NV9FTkFCTEVEOworCQlzcG9ydC0+cG9ydC5yczQ4NS5mbGFncyB8PSBTRVJfUlM0ODVfUlRTX09OX1NFTkQ7CisJCXdyaXRlYihVQVJUTU9ERU1fVFhSVFNFLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVE1PREVNKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTkyMyw2ICsyMDE2LDMyIEBACiAKIAl1YXJ0X3N1c3BlbmRfcG9ydCgmbHB1YXJ0X3JlZywgJnNwb3J0LT5wb3J0KTsKIAorCWlmIChzcG9ydC0+bHB1YXJ0X2RtYV9yeF91c2UpIHsKKwkJLyoKKwkJICogRURNQSBkcml2ZXIgZHVyaW5nIHN1c3BlbmQgd2lsbCBmb3JjZWZ1bGx5IHJlbGVhc2UgYW55CisJCSAqIG5vbi1pZGxlIERNQSBjaGFubmVscy4gSWYgcG9ydCB3YWtldXAgaXMgZW5hYmxlZCBvciBpZiBwb3J0CisJCSAqIGlzIGNvbnNvbGUgcG9ydCBvciAnbm9fY29uc29sZV9zdXNwZW5kJyBpcyBzZXQgdGhlIFJ4IERNQQorCQkgKiBjYW5ub3QgcmVzdW1lIGFzIGFzIGV4cGVjdGVkLCBoZW5jZSBncmFjZWZ1bGx5IHJlbGVhc2UgdGhlCisJCSAqIFJ4IERNQSBwYXRoIGJlZm9yZSBzdXNwZW5kIGFuZCBzdGFydCBSeCBETUEgcGF0aCBvbiByZXN1bWUuCisJCSAqLworCQlpZiAoc3BvcnQtPnBvcnQuaXJxX3dha2UpIHsKKwkJCWRlbF90aW1lcl9zeW5jKCZzcG9ydC0+bHB1YXJ0X3RpbWVyKTsKKwkJCWxwdWFydF9kbWFfcnhfZnJlZSgmc3BvcnQtPnBvcnQpOworCQl9CisKKwkJLyogRGlzYWJsZSBSeCBETUEgdG8gdXNlIFVBUlQgcG9ydCBhcyB3YWtldXAgc291cmNlICovCisJCXdyaXRlYihyZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSkgJiB+VUFSVENSNV9SRE1BUywKKwkJCQkJc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjUpOworCX0KKworCWlmIChzcG9ydC0+bHB1YXJ0X2RtYV90eF91c2UpIHsKKwkJc3BvcnQtPmRtYV90eF9pbl9wcm9ncmVzcyA9IGZhbHNlOworCQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChzcG9ydC0+ZG1hX3R4X2NoYW4pOworCX0KKworCWlmIChzcG9ydC0+cG9ydC5zdXNwZW5kZWQgJiYgIXNwb3J0LT5wb3J0LmlycV93YWtlKQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUoc3BvcnQtPmNsayk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTkzMSw2ICsyMDUwLDkgQEAKIAlzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJdW5zaWduZWQgbG9uZyB0ZW1wOwogCisJaWYgKHNwb3J0LT5wb3J0LnN1c3BlbmRlZCAmJiAhc3BvcnQtPnBvcnQuaXJxX3dha2UpCisJCWNsa19wcmVwYXJlX2VuYWJsZShzcG9ydC0+Y2xrKTsKKwogCWlmIChzcG9ydC0+bHB1YXJ0MzIpIHsKIAkJbHB1YXJ0MzJfc2V0dXBfd2F0ZXJtYXJrKHNwb3J0KTsKIAkJdGVtcCA9IGxwdWFydDMyX3JlYWQoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDVFJMKTsKQEAgLTE5NDQsNiArMjA2NiwyNiBAQAogCQl3cml0ZWIodGVtcCwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjIpOwogCX0KIAorCWlmIChzcG9ydC0+bHB1YXJ0X2RtYV9yeF91c2UpIHsKKwkJaWYgKHNwb3J0LT5wb3J0LmlycV93YWtlKSB7CisJCQlpZiAoIWxwdWFydF9zdGFydF9yeF9kbWEoc3BvcnQpKSB7CisJCQkJc3BvcnQtPmxwdWFydF9kbWFfcnhfdXNlID0gdHJ1ZTsKKwkJCQlyeF9kbWFfdGltZXJfaW5pdChzcG9ydCk7CisJCQl9IGVsc2UgeworCQkJCXNwb3J0LT5scHVhcnRfZG1hX3J4X3VzZSA9IGZhbHNlOworCQkJfQorCQl9CisJfQorCisJaWYgKHNwb3J0LT5kbWFfdHhfY2hhbiAmJiAhbHB1YXJ0X2RtYV90eF9yZXF1ZXN0KCZzcG9ydC0+cG9ydCkpIHsKKwkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNwb3J0LT5kbWFfd2FpdCk7CisJCQlzcG9ydC0+bHB1YXJ0X2RtYV90eF91c2UgPSB0cnVlOworCQkJd3JpdGViKHJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I1KSB8CisJCQkJVUFSVENSNV9URE1BUywgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjUpOworCX0gZWxzZSB7CisJCXNwb3J0LT5scHVhcnRfZG1hX3R4X3VzZSA9IGZhbHNlOworCX0KKwogCXVhcnRfcmVzdW1lX3BvcnQoJmxwdWFydF9yZWcsICZzcG9ydC0+cG9ydCk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9pbXguYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9pbXguYwppbmRleCAwZGYyYjFjLi5hNzAzNTZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvaW14LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2lteC5jCkBAIC0xOTAsNiArMTkwLDcgQEAKIGVudW0gaW14X3VhcnRfdHlwZSB7CiAJSU1YMV9VQVJULAogCUlNWDIxX1VBUlQsCisJSU1YNTNfVUFSVCwKIAlJTVg2UV9VQVJULAogfTsKIApAQCAtMjIyLDYgKzIyMyw5IEBACiAJc3RydWN0IGRtYV9jaGFuCQkqZG1hX2NoYW5fcngsICpkbWFfY2hhbl90eDsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QJcnhfc2dsLCB0eF9zZ2xbMl07CiAJdm9pZAkJCSpyeF9idWY7CisJc3RydWN0IGNpcmNfYnVmCQlyeF9yaW5nOworCXVuc2lnbmVkIGludAkJcnhfcGVyaW9kczsKKwlkbWFfY29va2llX3QJCXJ4X2Nvb2tpZTsKIAl1bnNpZ25lZCBpbnQJCXR4X2J5dGVzOwogCXVuc2lnbmVkIGludAkJZG1hX3R4X25lbnRzOwogCXdhaXRfcXVldWVfaGVhZF90CWRtYV93YWl0OwpAQCAtMjQ0LDYgKzI0OCwxMCBAQAogCQkudXRzX3JlZyA9IElNWDIxX1VUUywKIAkJLmRldnR5cGUgPSBJTVgyMV9VQVJULAogCX0sCisJW0lNWDUzX1VBUlRdID0geworCQkudXRzX3JlZyA9IElNWDIxX1VUUywKKwkJLmRldnR5cGUgPSBJTVg1M19VQVJULAorCX0sCiAJW0lNWDZRX1VBUlRdID0gewogCQkudXRzX3JlZyA9IElNWDIxX1VUUywKIAkJLmRldnR5cGUgPSBJTVg2UV9VQVJULApAQCAtMjU4LDYgKzI2Niw5IEBACiAJCS5uYW1lID0gImlteDIxLXVhcnQiLAogCQkuZHJpdmVyX2RhdGEgPSAoa2VybmVsX3Vsb25nX3QpICZpbXhfdWFydF9kZXZkYXRhW0lNWDIxX1VBUlRdLAogCX0sIHsKKwkJLm5hbWUgPSAiaW14NTMtdWFydCIsCisJCS5kcml2ZXJfZGF0YSA9IChrZXJuZWxfdWxvbmdfdCkgJmlteF91YXJ0X2RldmRhdGFbSU1YNTNfVUFSVF0sCisJfSwgewogCQkubmFtZSA9ICJpbXg2cS11YXJ0IiwKIAkJLmRyaXZlcl9kYXRhID0gKGtlcm5lbF91bG9uZ190KSAmaW14X3VhcnRfZGV2ZGF0YVtJTVg2UV9VQVJUXSwKIAl9LCB7CkBAIC0yNjgsNiArMjc5LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgaW14X3VhcnRfZHRfaWRzW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtdWFydCIsIC5kYXRhID0gJmlteF91YXJ0X2RldmRhdGFbSU1YNlFfVUFSVF0sIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14NTMtdWFydCIsIC5kYXRhID0gJmlteF91YXJ0X2RldmRhdGFbSU1YNTNfVUFSVF0sIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14MS11YXJ0IiwgLmRhdGEgPSAmaW14X3VhcnRfZGV2ZGF0YVtJTVgxX1VBUlRdLCB9LAogCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDIxLXVhcnQiLCAuZGF0YSA9ICZpbXhfdWFydF9kZXZkYXRhW0lNWDIxX1VBUlRdLCB9LAogCXsgLyogc2VudGluZWwgKi8gfQpAQCAtMjg5LDYgKzMwMSwxMSBAQAogCXJldHVybiBzcG9ydC0+ZGV2ZGF0YS0+ZGV2dHlwZSA9PSBJTVgyMV9VQVJUOwogfQogCitzdGF0aWMgaW5saW5lIGludCBpc19pbXg1M191YXJ0KHN0cnVjdCBpbXhfcG9ydCAqc3BvcnQpCit7CisJcmV0dXJuIHNwb3J0LT5kZXZkYXRhLT5kZXZ0eXBlID09IElNWDUzX1VBUlQ7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGlzX2lteDZxX3VhcnQoc3RydWN0IGlteF9wb3J0ICpzcG9ydCkKIHsKIAlyZXR1cm4gc3BvcnQtPmRldmRhdGEtPmRldnR5cGUgPT0gSU1YNlFfVUFSVDsKQEAgLTcwMSw2ICs3MTgsNyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAorc3RhdGljIHZvaWQgY2xlYXJfcnhfZXJyb3JzKHN0cnVjdCBpbXhfcG9ydCAqc3BvcnQpOwogc3RhdGljIGludCBzdGFydF9yeF9kbWEoc3RydWN0IGlteF9wb3J0ICpzcG9ydCk7CiAvKgogICogSWYgdGhlIFJYRklGTyBpcyBmaWxsZWQgd2l0aCBzb21lIGRhdGEsIGFuZCB0aGVuIHdlCkBAIC03MjYsNiArNzQ0LDExIEBACiAJCXRlbXAgJj0gfihVQ1IyX0FURU4pOwogCQl3cml0ZWwodGVtcCwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjIpOwogCisJCS8qIGRpc2FibGUgdGhlIHJ4IGVycm9ycyBpbnRlcnJ1cHRzICovCisJCXRlbXAgPSByZWFkbChzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUNSNCk7CisJCXRlbXAgJj0gflVDUjRfT1JFTjsKKwkJd3JpdGVsKHRlbXAsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1I0KTsKKwogCQkvKiB0ZWxsIHRoZSBETUEgdG8gcmVjZWl2ZSB0aGUgZGF0YS4gKi8KIAkJc3RhcnRfcnhfZG1hKHNwb3J0KTsKIAl9CkBAIC03NDAsMTIgKzc2MywxMyBAQAogewogCXVuc2lnbmVkIGludCB0bXAgPSBUSU9DTV9EU1I7CiAJdW5zaWduZWQgdXNyMSA9IHJlYWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVU1IxKTsKKwl1bnNpZ25lZCB1c3IyID0gcmVhZGwoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVTUjIpOwogCiAJaWYgKHVzcjEgJiBVU1IxX1JUU1MpCiAJCXRtcCB8PSBUSU9DTV9DVFM7CiAKIAkvKiBpbiBEQ0UgbW9kZSBEQ0RJTiBpcyBhbHdheXMgMCAqLwotCWlmICghKHVzcjEgJiBVU1IyX0RDRElOKSkKKwlpZiAoISh1c3IyICYgVVNSMl9EQ0RJTikpCiAJCXRtcCB8PSBUSU9DTV9DQVI7CiAKIAlpZiAoc3BvcnQtPmR0ZV9tb2RlKQpAQCAtOTMyLDMwICs5NTYsNiBAQAogfQogCiAjZGVmaW5lIFJYX0JVRl9TSVpFCShQQUdFX1NJWkUpCi1zdGF0aWMgdm9pZCBpbXhfcnhfZG1hX2RvbmUoc3RydWN0IGlteF9wb3J0ICpzcG9ydCkKLXsKLQl1bnNpZ25lZCBsb25nIHRlbXA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7Ci0KLQkvKiByZS1lbmFibGUgaW50ZXJydXB0cyB0byBnZXQgbm90aWZpZWQgd2hlbiBuZXcgc3ltYm9scyBhcmUgaW5jb21pbmcgKi8KLQl0ZW1wID0gcmVhZGwoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjEpOwotCXRlbXAgfD0gVUNSMV9SUkRZRU47Ci0Jd3JpdGVsKHRlbXAsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1IxKTsKLQotCXRlbXAgPSByZWFkbChzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUNSMik7Ci0JdGVtcCB8PSBVQ1IyX0FURU47Ci0Jd3JpdGVsKHRlbXAsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1IyKTsKLQotCXNwb3J0LT5kbWFfaXNfcnhpbmcgPSAwOwotCi0JLyogSXMgdGhlIHNodXRkb3duIHdhaXRpbmcgZm9yIHVzPyAqLwotCWlmICh3YWl0cXVldWVfYWN0aXZlKCZzcG9ydC0+ZG1hX3dhaXQpKQotCQl3YWtlX3VwKCZzcG9ydC0+ZG1hX3dhaXQpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOwotfQogCiAvKgogICogVGhlcmUgYXJlIHR3byBraW5kcyBvZiBSWCBETUEgaW50ZXJydXB0cyhzdWNoIGFzIGluIHRoZSBNWDZRKToKQEAgLTk3Miw0MyArOTcyLDc2IEBACiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wgPSAmc3BvcnQtPnJ4X3NnbDsKIAlzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQgPSAmc3BvcnQtPnBvcnQuc3RhdGUtPnBvcnQ7CiAJc3RydWN0IGRtYV90eF9zdGF0ZSBzdGF0ZTsKKwlzdHJ1Y3QgY2lyY19idWYgKnJ4X3JpbmcgPSAmc3BvcnQtPnJ4X3Jpbmc7CiAJZW51bSBkbWFfc3RhdHVzIHN0YXR1czsKLQl1bnNpZ25lZCBpbnQgY291bnQ7Ci0KLQkvKiB1bm1hcCBpdCBmaXJzdCAqLwotCWRtYV91bm1hcF9zZyhzcG9ydC0+cG9ydC5kZXYsIHNnbCwgMSwgRE1BX0ZST01fREVWSUNFKTsKKwl1bnNpZ25lZCBpbnQgd19ieXRlcyA9IDA7CisJdW5zaWduZWQgaW50IHJfYnl0ZXM7CisJdW5zaWduZWQgaW50IGJkX3NpemU7CiAKIAlzdGF0dXMgPSBkbWFlbmdpbmVfdHhfc3RhdHVzKGNoYW4sIChkbWFfY29va2llX3QpMCwgJnN0YXRlKTsKLQljb3VudCA9IFJYX0JVRl9TSVpFIC0gc3RhdGUucmVzaWR1ZTsKIAotCWRldl9kYmcoc3BvcnQtPnBvcnQuZGV2LCAiV2UgZ2V0ICVkIGJ5dGVzLlxuIiwgY291bnQpOwotCi0JaWYgKGNvdW50KSB7Ci0JCWlmICghKHNwb3J0LT5wb3J0Lmlnbm9yZV9zdGF0dXNfbWFzayAmIFVSWERfRFVNTVlfUkVBRCkpIHsKLQkJCWludCBieXRlcyA9IHR0eV9pbnNlcnRfZmxpcF9zdHJpbmcocG9ydCwgc3BvcnQtPnJ4X2J1ZiwKLQkJCQkJY291bnQpOwotCi0JCQlpZiAoYnl0ZXMgIT0gY291bnQpCi0JCQkJc3BvcnQtPnBvcnQuaWNvdW50LmJ1Zl9vdmVycnVuKys7Ci0JCX0KLQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2gocG9ydCk7Ci0JCXNwb3J0LT5wb3J0Lmljb3VudC5yeCArPSBjb3VudDsKKwlpZiAoc3RhdHVzID09IERNQV9FUlJPUikgeworCQlkZXZfZXJyKHNwb3J0LT5wb3J0LmRldiwgIkRNQSB0cmFuc2FjdGlvbiBlcnJvci5cbiIpOworCQljbGVhcl9yeF9lcnJvcnMoc3BvcnQpOworCQlyZXR1cm47CiAJfQogCi0JLyoKLQkgKiBSZXN0YXJ0IFJYIERNQSBkaXJlY3RseSBpZiBtb3JlIGRhdGEgaXMgYXZhaWxhYmxlIGluIG9yZGVyIHRvIHNraXAKLQkgKiB0aGUgcm91bmR0cmlwIHRocm91Z2ggdGhlIElSUSBoYW5kbGVyLiBJZiB0aGVyZSBpcyBzb21lIGRhdGEgYWxyZWFkeQotCSAqIGluIHRoZSBGSUZPLCBETUEgbmVlZHMgdG8gYmUgcmVzdGFydGVkIHNvb24gYW55d2F5cy4KLQkgKgotCSAqIE90aGVyd2lzZSBzdG9wIHRoZSBETUEgYW5kIHJlYWN0aXZhdGUgRklGTyBJUlFzIHRvIHJlc3RhcnQgRE1BIG9uY2UKLQkgKiBkYXRhIHN0YXJ0cyB0byBhcnJpdmUgYWdhaW4uCi0JICovCi0JaWYgKHJlYWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVU1IyKSAmIFVTUjJfUkRSKQotCQlzdGFydF9yeF9kbWEoc3BvcnQpOwotCWVsc2UKLQkJaW14X3J4X2RtYV9kb25lKHNwb3J0KTsKKwlpZiAoIShzcG9ydC0+cG9ydC5pZ25vcmVfc3RhdHVzX21hc2sgJiBVUlhEX0RVTU1ZX1JFQUQpKSB7CisKKwkJLyoKKwkJICogVGhlIHN0YXRlLXJlc2lkdWUgdmFyaWFibGUgcmVwcmVzZW50cyB0aGUgZW1wdHkgc3BhY2UKKwkJICogcmVsYXRpdmUgdG8gdGhlIGVudGlyZSBidWZmZXIuIFRha2luZyB0aGlzIGluIGNvbnNpZGVyYXRpb24KKwkJICogdGhlIGhlYWQgaXMgYWx3YXlzIGNhbGN1bGF0ZWQgYmFzZSBvbiB0aGUgYnVmZmVyIHRvdGFsCisJCSAqIGxlbmd0aCAtIERNQSB0cmFuc2FjdGlvbiByZXNpZHVlLiBUaGUgVUFSVCBzY3JpcHQgZnJvbSB0aGUKKwkJICogU0RNQSBmaXJtd2FyZSB3aWxsIGp1bXAgdG8gdGhlIG5leHQgYnVmZmVyIGRlc2NyaXB0b3IsCisJCSAqIG9uY2UgYSBETUEgdHJhbnNhY3Rpb24gaWYgZmluYWxpemVkIChJTVg1MyBSTSAtIEEuNC4xLjIuNCkuCisJCSAqIFRha2luZyB0aGlzIGluIGNvbnNpZGVyYXRpb24gdGhlIHRhaWwgaXMgYWx3YXlzIGF0IHRoZQorCQkgKiBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciBkZXNjcmlwdG9yIHRoYXQgY29udGFpbnMgdGhlIGhlYWQuCisJCSAqLworCisJCS8qIENhbGN1bGF0ZSB0aGUgaGVhZCAqLworCQlyeF9yaW5nLT5oZWFkID0gc2dfZG1hX2xlbihzZ2wpIC0gc3RhdGUucmVzaWR1ZTsKKworCQkvKiBDYWxjdWxhdGUgdGhlIHRhaWwuICovCisJCWJkX3NpemUgPSBzZ19kbWFfbGVuKHNnbCkgLyBzcG9ydC0+cnhfcGVyaW9kczsKKwkJcnhfcmluZy0+dGFpbCA9ICgocnhfcmluZy0+aGVhZC0xKSAvIGJkX3NpemUpICogYmRfc2l6ZTsKKworCQlpZiAocnhfcmluZy0+aGVhZCA8PSBzZ19kbWFfbGVuKHNnbCkgJiYKKwkJICAgIHJ4X3JpbmctPmhlYWQgPiByeF9yaW5nLT50YWlsKSB7CisKKwkJCS8qIE1vdmUgZGF0YSBmcm9tIHRhaWwgdG8gaGVhZCAqLworCQkJcl9ieXRlcyA9IHJ4X3JpbmctPmhlYWQgLSByeF9yaW5nLT50YWlsOworCisJCQkvKiBDUFUgY2xhaW1zIG93bmVyc2hpcCBvZiBSWCBETUEgYnVmZmVyICovCisJCQlkbWFfc3luY19zZ19mb3JfY3B1KHNwb3J0LT5wb3J0LmRldiwgc2dsLCAxLAorCQkJCURNQV9GUk9NX0RFVklDRSk7CisKKwkJCXdfYnl0ZXMgPSB0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHBvcnQsCisJCQkJc3BvcnQtPnJ4X2J1ZiArIHJ4X3JpbmctPnRhaWwsIHJfYnl0ZXMpOworCisJCQkvKiBVQVJUIHJldHJpZXZlcyBvd25lcnNoaXAgb2YgUlggRE1BIGJ1ZmZlciAqLworCQkJZG1hX3N5bmNfc2dfZm9yX2RldmljZShzcG9ydC0+cG9ydC5kZXYsIHNnbCwgMSwKKwkJCQlETUFfRlJPTV9ERVZJQ0UpOworCisJCQlpZiAod19ieXRlcyAhPSByX2J5dGVzKQorCQkJCXNwb3J0LT5wb3J0Lmljb3VudC5idWZfb3ZlcnJ1bisrOworCisJCQlzcG9ydC0+cG9ydC5pY291bnQucnggKz0gd19ieXRlczsKKwkJfSBlbHNlCXsKKwkJCVdBUk5fT04ocnhfcmluZy0+aGVhZCA+IHNnX2RtYV9sZW4oc2dsKSk7CisJCQlXQVJOX09OKHJ4X3JpbmctPmhlYWQgPD0gcnhfcmluZy0+dGFpbCk7CisJCX0KKwl9CisKKwlpZiAod19ieXRlcykgeworCQl0dHlfZmxpcF9idWZmZXJfcHVzaChwb3J0KTsKKwkJZGV2X2RiZyhzcG9ydC0+cG9ydC5kZXYsICJXZSBnZXQgJWQgYnl0ZXMuXG4iLCB3X2J5dGVzKTsKKwl9CiB9CiAKKy8qIFJYIERNQSBidWZmZXIgcGVyaW9kcyAqLworI2RlZmluZSBSWF9ETUFfUEVSSU9EUyA0CisKIHN0YXRpYyBpbnQgc3RhcnRfcnhfZG1hKHN0cnVjdCBpbXhfcG9ydCAqc3BvcnQpCiB7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wgPSAmc3BvcnQtPnJ4X3NnbDsKQEAgLTEwMTcsMTQgKzEwNTAsMjEgQEAKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2M7CiAJaW50IHJldDsKIAorCXNwb3J0LT5yeF9yaW5nLmhlYWQgPSAwOworCXNwb3J0LT5yeF9yaW5nLnRhaWwgPSAwOworCXNwb3J0LT5yeF9wZXJpb2RzID0gUlhfRE1BX1BFUklPRFM7CisKIAlzZ19pbml0X29uZShzZ2wsIHNwb3J0LT5yeF9idWYsIFJYX0JVRl9TSVpFKTsKIAlyZXQgPSBkbWFfbWFwX3NnKGRldiwgc2dsLCAxLCBETUFfRlJPTV9ERVZJQ0UpOwogCWlmIChyZXQgPT0gMCkgewogCQlkZXZfZXJyKGRldiwgIkRNQSBtYXBwaW5nIGVycm9yIGZvciBSWC5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JZGVzYyA9IGRtYWVuZ2luZV9wcmVwX3NsYXZlX3NnKGNoYW4sIHNnbCwgMSwgRE1BX0RFVl9UT19NRU0sCi0JCQkJCURNQV9QUkVQX0lOVEVSUlVQVCk7CisKKwlkZXNjID0gZG1hZW5naW5lX3ByZXBfZG1hX2N5Y2xpYyhjaGFuLCBzZ19kbWFfYWRkcmVzcyhzZ2wpLAorCQlzZ19kbWFfbGVuKHNnbCksIHNnX2RtYV9sZW4oc2dsKSAvIHNwb3J0LT5yeF9wZXJpb2RzLAorCQlETUFfREVWX1RPX01FTSwgRE1BX1BSRVBfSU5URVJSVVBUKTsKKwogCWlmICghZGVzYykgewogCQlkbWFfdW5tYXBfc2coZGV2LCBzZ2wsIDEsIERNQV9GUk9NX0RFVklDRSk7CiAJCWRldl9lcnIoZGV2LCAiV2UgY2Fubm90IHByZXBhcmUgZm9yIHRoZSBSWCBzbGF2ZSBkbWEhXG4iKTsKQEAgLTEwMzQsMTEgKzEwNzQsMzYgQEAKIAlkZXNjLT5jYWxsYmFja19wYXJhbSA9IHNwb3J0OwogCiAJZGV2X2RiZyhkZXYsICJSWDogcHJlcGFyZSBmb3IgdGhlIERNQS5cbiIpOwotCWRtYWVuZ2luZV9zdWJtaXQoZGVzYyk7CisJc3BvcnQtPnJ4X2Nvb2tpZSA9IGRtYWVuZ2luZV9zdWJtaXQoZGVzYyk7CiAJZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcoY2hhbik7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGNsZWFyX3J4X2Vycm9ycyhzdHJ1Y3QgaW14X3BvcnQgKnNwb3J0KQoreworCXVuc2lnbmVkIGludCBzdGF0dXNfdXNyMSwgc3RhdHVzX3VzcjI7CisKKwlzdGF0dXNfdXNyMSA9IHJlYWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVU1IxKTsKKwlzdGF0dXNfdXNyMiA9IHJlYWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVU1IyKTsKKworCWlmIChzdGF0dXNfdXNyMiAmIFVTUjJfQlJDRCkgeworCQlzcG9ydC0+cG9ydC5pY291bnQuYnJrKys7CisJCXdyaXRlbChVU1IyX0JSQ0QsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVU1IyKTsKKwl9IGVsc2UgaWYgKHN0YXR1c191c3IxICYgVVNSMV9GUkFNRVJSKSB7CisJCXNwb3J0LT5wb3J0Lmljb3VudC5mcmFtZSsrOworCQl3cml0ZWwoVVNSMV9GUkFNRVJSLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVVNSMSk7CisJfSBlbHNlIGlmIChzdGF0dXNfdXNyMSAmIFVTUjFfUEFSSVRZRVJSKSB7CisJCXNwb3J0LT5wb3J0Lmljb3VudC5wYXJpdHkrKzsKKwkJd3JpdGVsKFVTUjFfUEFSSVRZRVJSLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVVNSMSk7CisJfQorCisJaWYgKHN0YXR1c191c3IyICYgVVNSMl9PUkUpIHsKKwkJc3BvcnQtPnBvcnQuaWNvdW50Lm92ZXJydW4rKzsKKwkJd3JpdGVsKFVTUjJfT1JFLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVVNSMik7CisJfQorCit9CisKICNkZWZpbmUgVFhUTF9ERUZBVUxUIDIgLyogcmVzZXQgZGVmYXVsdCAqLwogI2RlZmluZSBSWFRMX0RFRkFVTFQgMSAvKiByZXNldCBkZWZhdWx0ICovCiAjZGVmaW5lIFRYVExfRE1BIDggLyogRE1BIGJ1cnN0IHNldHRpbmcgKi8KQEAgLTEwNTgsMTQgKzExMjMsMTYgQEAKIHN0YXRpYyB2b2lkIGlteF91YXJ0X2RtYV9leGl0KHN0cnVjdCBpbXhfcG9ydCAqc3BvcnQpCiB7CiAJaWYgKHNwb3J0LT5kbWFfY2hhbl9yeCkgeworCQlkbWFlbmdpbmVfdGVybWluYXRlX3N5bmMoc3BvcnQtPmRtYV9jaGFuX3J4KTsKIAkJZG1hX3JlbGVhc2VfY2hhbm5lbChzcG9ydC0+ZG1hX2NoYW5fcngpOwogCQlzcG9ydC0+ZG1hX2NoYW5fcnggPSBOVUxMOwotCisJCXNwb3J0LT5yeF9jb29raWUgPSAtRUlOVkFMOwogCQlrZnJlZShzcG9ydC0+cnhfYnVmKTsKIAkJc3BvcnQtPnJ4X2J1ZiA9IE5VTEw7CiAJfQogCiAJaWYgKHNwb3J0LT5kbWFfY2hhbl90eCkgeworCQlkbWFlbmdpbmVfdGVybWluYXRlX3N5bmMoc3BvcnQtPmRtYV9jaGFuX3R4KTsKIAkJZG1hX3JlbGVhc2VfY2hhbm5lbChzcG9ydC0+ZG1hX2NoYW5fdHgpOwogCQlzcG9ydC0+ZG1hX2NoYW5fdHggPSBOVUxMOwogCX0KQEAgLTExMDMsNiArMTE3MCw3IEBACiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyOwogCX0KKwlzcG9ydC0+cnhfcmluZy5idWYgPSBzcG9ydC0+cnhfYnVmOwogCiAJLyogUHJlcGFyZSBmb3IgVFggOiAqLwogCXNwb3J0LT5kbWFfY2hhbl90eCA9IGRtYV9yZXF1ZXN0X3NsYXZlX2NoYW5uZWwoZGV2LCAidHgiKTsKQEAgLTEyMDEsOCArMTI2OSw3IEBACiAJd3JpdGVsKHRlbXAgJiB+VUNSNF9EUkVOLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUNSNCk7CiAKIAkvKiBDYW4gd2UgZW5hYmxlIHRoZSBETUEgc3VwcG9ydD8gKi8KLQlpZiAoaXNfaW14NnFfdWFydChzcG9ydCkgJiYgIXVhcnRfY29uc29sZShwb3J0KSAmJgotCSAgICAhc3BvcnQtPmRtYV9pc19pbml0ZWQpCisJaWYgKCF1YXJ0X2NvbnNvbGUocG9ydCkgJiYgIXNwb3J0LT5kbWFfaXNfaW5pdGVkKQogCQlpbXhfdWFydF9kbWFfaW5pdChzcG9ydCk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOwpAQCAtMTI4MywxNyArMTM1MCwxMSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoc3BvcnQtPmRtYV9pc19lbmFibGVkKSB7Ci0JCWludCByZXQ7CisJCXNwb3J0LT5kbWFfaXNfcnhpbmcgPSAwOworCQlzcG9ydC0+ZG1hX2lzX3R4aW5nID0gMDsKKwkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9zeW5jKHNwb3J0LT5kbWFfY2hhbl90eCk7CisJCWRtYWVuZ2luZV90ZXJtaW5hdGVfc3luYyhzcG9ydC0+ZG1hX2NoYW5fcngpOwogCi0JCS8qIFdlIGhhdmUgdG8gd2FpdCBmb3IgdGhlIERNQSB0byBmaW5pc2guICovCi0JCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzcG9ydC0+ZG1hX3dhaXQsCi0JCQkhc3BvcnQtPmRtYV9pc19yeGluZyAmJiAhc3BvcnQtPmRtYV9pc190eGluZyk7Ci0JCWlmIChyZXQgIT0gMCkgewotCQkJc3BvcnQtPmRtYV9pc19yeGluZyA9IDA7Ci0JCQlzcG9ydC0+ZG1hX2lzX3R4aW5nID0gMDsKLQkJCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKHNwb3J0LT5kbWFfY2hhbl90eCk7Ci0JCQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChzcG9ydC0+ZG1hX2NoYW5fcngpOwotCQl9CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7CiAJCWlteF9zdG9wX3R4KHBvcnQpOwogCQlpbXhfc3RvcF9yeChwb3J0KTsKQEAgLTE2OTAsNyArMTc1MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdWFydF9vcHMgaW14X3BvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHVhcnRfb3BzIGlteF9wb3BzID0gewogCS50eF9lbXB0eQk9IGlteF90eF9lbXB0eSwKIAkuc2V0X21jdHJsCT0gaW14X3NldF9tY3RybCwKIAkuZ2V0X21jdHJsCT0gaW14X2dldF9tY3RybCwKQEAgLTIwNzcsOCArMjEzOCwxMCBAQAogCiAJLyogRm9yIHJlZ2lzdGVyIGFjY2Vzcywgd2Ugb25seSBuZWVkIHRvIGVuYWJsZSB0aGUgaXBnIGNsb2NrLiAqLwogCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShzcG9ydC0+Y2xrX2lwZyk7Ci0JaWYgKHJldCkKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBlbmFibGUgcGVyIGNsazogJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CisJfQogCiAJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGJlZm9yZSByZXF1ZXN0aW5nIHRoZW0gKi8KIAlyZWcgPSByZWFkbF9yZWxheGVkKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1IxKTsKQEAgLTIwOTUsMTggKzIxNTgsMjYgQEAKIAlpZiAodHhpcnEgPiAwKSB7CiAJCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgcnhpcnEsIGlteF9yeGludCwgMCwKIAkJCQkgICAgICAgZGV2X25hbWUoJnBkZXYtPmRldiksIHNwb3J0KTsKLQkJaWYgKHJldCkKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgcnggaXJxOiAlZFxuIiwKKwkJCQlyZXQpOwogCQkJcmV0dXJuIHJldDsKKwkJfQogCiAJCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgdHhpcnEsIGlteF90eGludCwgMCwKIAkJCQkgICAgICAgZGV2X25hbWUoJnBkZXYtPmRldiksIHNwb3J0KTsKLQkJaWYgKHJldCkKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgdHggaXJxOiAlZFxuIiwKKwkJCQlyZXQpOwogCQkJcmV0dXJuIHJldDsKKwkJfQogCX0gZWxzZSB7CiAJCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgcnhpcnEsIGlteF9pbnQsIDAsCiAJCQkJICAgICAgIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBzcG9ydCk7Ci0JCWlmIChyZXQpCisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IGlycTogJWRcbiIsIHJldCk7CiAJCQlyZXR1cm4gcmV0OworCQl9CiAJfQogCiAJaW14X3BvcnRzW3Nwb3J0LT5wb3J0LmxpbmVdID0gc3BvcnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvanNtL2pzbV90dHkuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9qc20vanNtX3R0eS5jCmluZGV4IGM1ZGRmZTUuLmVjN2Q4MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9qc20vanNtX3R0eS5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9qc20vanNtX3R0eS5jCkBAIC0zNDYsNyArMzQ2LDcgQEAKIAlwb3J0LT50eXBlID0gUE9SVF9KU007CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdWFydF9vcHMganNtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWFydF9vcHMganNtX29wcyA9IHsKIAkudHhfZW1wdHkJPSBqc21fdHR5X3R4X2VtcHR5LAogCS5zZXRfbWN0cmwJPSBqc21fdHR5X3NldF9tY3RybCwKIAkuZ2V0X21jdHJsCT0ganNtX3R0eV9nZXRfbWN0cmwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvbWF4MzEwMC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL21heDMxMDAuYwppbmRleCA1YzRjMjgwLi5hY2U4MjY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvbWF4MzEwMC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9tYXgzMTAwLmMKQEAgLTcxMiw3ICs3MTIsNyBAQAogCWRldl9kYmcoJnMtPnNwaS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIH0KIAotc3RhdGljIHN0cnVjdCB1YXJ0X29wcyBtYXgzMTAwX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWFydF9vcHMgbWF4MzEwMF9vcHMgPSB7CiAJLnR4X2VtcHR5CT0gbWF4MzEwMF90eF9lbXB0eSwKIAkuc2V0X21jdHJsCT0gbWF4MzEwMF9zZXRfbWN0cmwsCiAJLmdldF9tY3RybAk9IG1heDMxMDBfZ2V0X21jdHJsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL21heDMxMHguYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9tYXgzMTB4LmMKaW5kZXggOTM2MDgwMS4uOGEzZTkyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL21heDMxMHguYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvbWF4MzEweC5jCkBAIC0xMzI5LDkgKzEzMjksOSBAQAogCQljb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCAqaWRfZW50cnkgPSBzcGlfZ2V0X2RldmljZV9pZChzcGkpOwogCiAJCWRldnR5cGUgPSAoc3RydWN0IG1heDMxMHhfZGV2dHlwZSAqKWlkX2VudHJ5LT5kcml2ZXJfZGF0YTsKLQkJZmxhZ3MgPSBJUlFGX1RSSUdHRVJfRkFMTElORzsKIAl9CiAKKwlmbGFncyA9IElSUUZfVFJJR0dFUl9GQUxMSU5HOwogCXJlZ2NmZy5tYXhfcmVnaXN0ZXIgPSBkZXZ0eXBlLT5uciAqIDB4MjAgLSAxOwogCXJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfc3BpKHNwaSwgJnJlZ2NmZyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tZW5fejEzNV91YXJ0LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvbWVuX3oxMzVfdWFydC5jCmluZGV4IGE0NDI5MGUuLmU3MmVhNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tZW5fejEzNV91YXJ0LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL21lbl96MTM1X3VhcnQuYwpAQCAtNzc1LDcgKzc3NSw3IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdWFydF9vcHMgbWVuX3oxMzVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB1YXJ0X29wcyBtZW5fejEzNV9vcHMgPSB7CiAJLnR4X2VtcHR5ID0gbWVuX3oxMzVfdHhfZW1wdHksCiAJLnNldF9tY3RybCA9IG1lbl96MTM1X3NldF9tY3RybCwKIAkuZ2V0X21jdHJsID0gbWVuX3oxMzVfZ2V0X21jdHJsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL214cy1hdWFydC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL214cy1hdWFydC5jCmluZGV4IGViNTRlNWMuLjc3MDQ1NGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9teHMtYXVhcnQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvbXhzLWF1YXJ0LmMKQEAgLTEzMTcsNyArMTMxNyw3IEBACiAJCW14c19jbHIoQVVBUlRfTElORUNUUkxfQlJLLCBzLCBSRUdfTElORUNUUkwpOwogfQogCi1zdGF0aWMgc3RydWN0IHVhcnRfb3BzIG14c19hdWFydF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHVhcnRfb3BzIG14c19hdWFydF9vcHMgPSB7CiAJLnR4X2VtcHR5ICAgICAgID0gbXhzX2F1YXJ0X3R4X2VtcHR5LAogCS5zdGFydF90eCAgICAgICA9IG14c19hdWFydF9zdGFydF90eCwKIAkuc3RvcF90eAk9IG14c19hdWFydF9zdG9wX3R4LApAQCAtMTUxMCwxMCArMTUxMCw3IEBACiAKIAlpZiAoIWlzX2FzbTkyNjBfYXVhcnQocykpIHsKIAkJcy0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOwotCQlpZiAoSVNfRVJSKHMtPmNsaykpCi0JCQlyZXR1cm4gUFRSX0VSUihzLT5jbGspOwotCi0JCXJldHVybiAwOworCQlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKHMtPmNsayk7CiAJfQogCiAJcy0+Y2xrID0gZGV2bV9jbGtfZ2V0KHMtPmRldiwgIm1vZCIpOwpAQCAtMTUzNywxNiArMTUzNCwyMCBAQAogCWVyciA9IGNsa19zZXRfcmF0ZShzLT5jbGssIGNsa19nZXRfcmF0ZShzLT5jbGtfYWhiKSk7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKHMtPmRldiwgIkZhaWxlZCB0byBzZXQgcmF0ZSFcbiIpOwotCQlyZXR1cm4gZXJyOworCQlnb3RvIGRpc2FibGVfY2xrX2FoYjsKIAl9CiAKIAllcnIgPSBjbGtfcHJlcGFyZV9lbmFibGUocy0+Y2xrKTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIocy0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBjbGshXG4iKTsKLQkJcmV0dXJuIGVycjsKKwkJZ290byBkaXNhYmxlX2Nsa19haGI7CiAJfQogCiAJcmV0dXJuIDA7CisKK2Rpc2FibGVfY2xrX2FoYjoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocy0+Y2xrX2FoYik7CisJcmV0dXJuIGVycjsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9wY2hfdWFydC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3BjaF91YXJ0LmMKaW5kZXggZWE0ZmZjMi4uZDM5MTY1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3BjaF91YXJ0LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3BjaF91YXJ0LmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KICNpbmNsdWRlIDxsaW51eC9ubWkuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAKICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CkBAIC0xNjAzLDcgKzE2MDQsNyBAQAogfQogI2VuZGlmIC8qIENPTkZJR19DT05TT0xFX1BPTEwgKi8KIAotc3RhdGljIHN0cnVjdCB1YXJ0X29wcyBwY2hfdWFydF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHVhcnRfb3BzIHBjaF91YXJ0X29wcyA9IHsKIAkudHhfZW1wdHkgPSBwY2hfdWFydF90eF9lbXB0eSwKIAkuc2V0X21jdHJsID0gcGNoX3VhcnRfc2V0X21jdHJsLAogCS5nZXRfbWN0cmwgPSBwY2hfdWFydF9nZXRfbWN0cmwsCkBAIC0xODI2LDYgKzE4MjcsMTAgQEAKIAlwcml2LT50cmlnZ2VyX2xldmVsID0gMTsKIAlwcml2LT5mY3IgPSAwOwogCisJaWYgKHBkZXYtPmRldi5vZl9ub2RlKQorCQlvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwgImNsb2NrLWZyZXF1ZW5jeSIKKwkJCQkJICwgJnVzZXJfdWFydGNsayk7CisKICNpZmRlZiBDT05GSUdfU0VSSUFMX1BDSF9VQVJUX0NPTlNPTEUKIAlwY2hfdWFydF9wb3J0c1tib2FyZC0+bGluZV9ub10gPSBwcml2OwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2Ftc3VuZy5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3NhbXN1bmcuYwppbmRleCBhZTIwOTVhLi5mNDQ2MTVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2Ftc3VuZy5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zYW1zdW5nLmMKQEAgLTE1NzcsNyArMTU3Nyw3IEBACiB9CiAKIAotI2lmZGVmIENPTkZJR19DUFVfRlJFUQorI2lmZGVmIENPTkZJR19BUk1fUzNDMjRYWF9DUFVGUkVRCiAKIHN0YXRpYyBpbnQgczNjMjR4eF9zZXJpYWxfY3B1ZnJlcV90cmFuc2l0aW9uKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCiAJCQkJCSAgICAgdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmRhdGEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2Ftc3VuZy5oIGIvZHJpdmVycy90dHkvc2VyaWFsL3NhbXN1bmcuaAppbmRleCAyYWU0ZmNlLi5hMDRhY2VmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2Ftc3VuZy5oCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zYW1zdW5nLmgKQEAgLTEwMiw3ICsxMDIsNyBAQAogCiAJc3RydWN0IHMzYzI0eHhfdWFydF9kbWEJCSpkbWE7CiAKLSNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKKyNpZmRlZiBDT05GSUdfQVJNX1MzQzI0WFhfQ1BVRlJFUQogCXN0cnVjdCBub3RpZmllcl9ibG9jawkJZnJlcV90cmFuc2l0aW9uOwogI2VuZGlmCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3NjMTZpczd4eC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3NjMTZpczd4eC5jCmluZGV4IGYzNmU2ZGYuLmE5ZDk0ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zYzE2aXM3eHguYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2MxNmlzN3h4LmMKQEAgLTEyMDUsNiArMTIwNSwxMCBAQAogCX0KICNlbmRpZgogCisJLyogcmVzZXQgZGV2aWNlLCBwdXJnaW5nIGFueSBwZW5kaW5nIGlycSAvIGRhdGEgKi8KKwlyZWdtYXBfd3JpdGUocy0+cmVnbWFwLCBTQzE2SVM3WFhfSU9DT05UUk9MX1JFRyA8PCBTQzE2SVM3WFhfUkVHX1NISUZULAorCQkJU0MxNklTN1hYX0lPQ09OVFJPTF9TUkVTRVRfQklUKTsKKwogCWZvciAoaSA9IDA7IGkgPCBkZXZ0eXBlLT5ucl91YXJ0OyArK2kpIHsKIAkJcy0+cFtpXS5saW5lCQk9IGk7CiAJCS8qIEluaXRpYWxpemUgcG9ydCBkYXRhICovCkBAIC0xMjM0LDYgKzEyMzgsMjIgQEAKIAkJaW5pdF9rdGhyZWFkX3dvcmsoJnMtPnBbaV0ucmVnX3dvcmssIHNjMTZpczd4eF9yZWdfcHJvYyk7CiAJCS8qIFJlZ2lzdGVyIHBvcnQgKi8KIAkJdWFydF9hZGRfb25lX3BvcnQoJnNjMTZpczd4eF91YXJ0LCAmcy0+cFtpXS5wb3J0KTsKKworCQkvKiBFbmFibGUgRUZSICovCisJCXNjMTZpczd4eF9wb3J0X3dyaXRlKCZzLT5wW2ldLnBvcnQsIFNDMTZJUzdYWF9MQ1JfUkVHLAorCQkJCSAgICAgU0MxNklTN1hYX0xDUl9DT05GX01PREVfQik7CisKKwkJcmVnY2FjaGVfY2FjaGVfYnlwYXNzKHMtPnJlZ21hcCwgdHJ1ZSk7CisKKwkJLyogRW5hYmxlIHdyaXRlIGFjY2VzcyB0byBlbmhhbmNlZCBmZWF0dXJlcyAqLworCQlzYzE2aXM3eHhfcG9ydF93cml0ZSgmcy0+cFtpXS5wb3J0LCBTQzE2SVM3WFhfRUZSX1JFRywKKwkJCQkgICAgIFNDMTZJUzdYWF9FRlJfRU5BQkxFX0JJVCk7CisKKwkJcmVnY2FjaGVfY2FjaGVfYnlwYXNzKHMtPnJlZ21hcCwgZmFsc2UpOworCisJCS8qIFJlc3RvcmUgYWNjZXNzIHRvIGdlbmVyYWwgcmVnaXN0ZXJzICovCisJCXNjMTZpczd4eF9wb3J0X3dyaXRlKCZzLT5wW2ldLnBvcnQsIFNDMTZJUzdYWF9MQ1JfUkVHLCAweDAwKTsKKwogCQkvKiBHbyB0byBzdXNwZW5kIG1vZGUgKi8KIAkJc2MxNmlzN3h4X3Bvd2VyKCZzLT5wW2ldLnBvcnQsIDApOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zZXJpYWxfY29yZS5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3NlcmlhbF9jb3JlLmMKaW5kZXggOWZjMTUzMy4uNmU0ZjYzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3NlcmlhbF9jb3JlLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3NlcmlhbF9jb3JlLmMKQEAgLTIzNSwxOCArMjM1LDkgQEAKIAlpZiAodHR5X3BvcnRfaW5pdGlhbGl6ZWQocG9ydCkpCiAJCXJldHVybiAwOwogCi0JLyoKLQkgKiBTZXQgdGhlIFRUWSBJTyBlcnJvciBtYXJrZXIgLSB3ZSB3aWxsIG9ubHkgY2xlYXIgdGhpcwotCSAqIG9uY2Ugd2UgaGF2ZSBzdWNjZXNzZnVsbHkgb3BlbmVkIHRoZSBwb3J0LgotCSAqLwotCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncyk7Ci0KIAlyZXR2YWwgPSB1YXJ0X3BvcnRfc3RhcnR1cCh0dHksIHN0YXRlLCBpbml0X2h3KTsKLQlpZiAoIXJldHZhbCkgewotCQl0dHlfcG9ydF9zZXRfaW5pdGlhbGl6ZWQocG9ydCwgMSk7Ci0JCWNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKTsKLQl9IGVsc2UgaWYgKHJldHZhbCA+IDApCi0JCXJldHZhbCA9IDA7CisJaWYgKHJldHZhbCkKKwkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZ0dHktPmZsYWdzKTsKIAogCXJldHVybiByZXR2YWw7CiB9CkBAIC05NzIsOCArOTYzLDExIEBACiAJCQl9CiAJCQl1YXJ0X2NoYW5nZV9zcGVlZCh0dHksIHN0YXRlLCBOVUxMKTsKIAkJfQotCX0gZWxzZQorCX0gZWxzZSB7CiAJCXJldHZhbCA9IHVhcnRfc3RhcnR1cCh0dHksIHN0YXRlLCAxKTsKKwkJaWYgKHJldHZhbCA+IDApCisJCQlyZXR2YWwgPSAwOworCX0KICBleGl0OgogCXJldHVybiByZXR2YWw7CiB9CkBAIC0xMTM5LDYgKzExMzMsOCBAQAogCQl1cG9ydC0+b3BzLT5jb25maWdfcG9ydCh1cG9ydCwgZmxhZ3MpOwogCiAJCXJldCA9IHVhcnRfc3RhcnR1cCh0dHksIHN0YXRlLCAxKTsKKwkJaWYgKHJldCA+IDApCisJCQlyZXQgPSAwOwogCX0KIG91dDoKIAltdXRleF91bmxvY2soJnBvcnQtPm11dGV4KTsKQEAgLTE0NjUsNyArMTQ2MSw2IEBACiB7CiAJc3RydWN0IHVhcnRfc3RhdGUgKnN0YXRlID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQ7Ci0Jc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQ7CiAKIAlpZiAoIXN0YXRlKSB7CiAJCXN0cnVjdCB1YXJ0X2RyaXZlciAqZHJ2ID0gdHR5LT5kcml2ZXItPmRyaXZlcl9zdGF0ZTsKQEAgLTE0ODEsNTYgKzE0NzYsMzYgQEAKIAlwb3J0ID0gJnN0YXRlLT5wb3J0OwogCXByX2RlYnVnKCJ1YXJ0X2Nsb3NlKCVkKSBjYWxsZWRcbiIsIHR0eS0+aW5kZXgpOwogCi0JaWYgKHR0eV9wb3J0X2Nsb3NlX3N0YXJ0KHBvcnQsIHR0eSwgZmlscCkgPT0gMCkKLQkJcmV0dXJuOworCXR0eV9wb3J0X2Nsb3NlKHR0eS0+cG9ydCwgdHR5LCBmaWxwKTsKK30KIAotCW11dGV4X2xvY2soJnBvcnQtPm11dGV4KTsKLQl1cG9ydCA9IHVhcnRfcG9ydF9jaGVjayhzdGF0ZSk7CitzdGF0aWMgdm9pZCB1YXJ0X3R0eV9wb3J0X3NodXRkb3duKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgdWFydF9zdGF0ZSAqc3RhdGUgPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IHVhcnRfc3RhdGUsIHBvcnQpOworCXN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0ID0gdWFydF9wb3J0X2NoZWNrKHN0YXRlKTsKIAogCS8qCiAJICogQXQgdGhpcyBwb2ludCwgd2Ugc3RvcCBhY2NlcHRpbmcgaW5wdXQuICBUbyBkbyB0aGlzLCB3ZQogCSAqIGRpc2FibGUgdGhlIHJlY2VpdmUgbGluZSBzdGF0dXMgaW50ZXJydXB0cy4KIAkgKi8KLQlpZiAodHR5X3BvcnRfaW5pdGlhbGl6ZWQocG9ydCkgJiYKLQkgICAgIVdBUk4oIXVwb3J0LCAiZGV0YWNoZWQgcG9ydCBzdGlsbCBpbml0aWFsaXplZCFcbiIpKSB7Ci0JCXNwaW5fbG9ja19pcnEoJnVwb3J0LT5sb2NrKTsKLQkJdXBvcnQtPm9wcy0+c3RvcF9yeCh1cG9ydCk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmdXBvcnQtPmxvY2spOwotCQkvKgotCQkgKiBCZWZvcmUgd2UgZHJvcCBEVFIsIG1ha2Ugc3VyZSB0aGUgVUFSVCB0cmFuc21pdHRlcgotCQkgKiBoYXMgY29tcGxldGVseSBkcmFpbmVkOyB0aGlzIGlzIGVzcGVjaWFsbHkKLQkJICogaW1wb3J0YW50IGlmIHRoZXJlIGlzIGEgdHJhbnNtaXQgRklGTyEKLQkJICovCi0JCXVhcnRfd2FpdF91bnRpbF9zZW50KHR0eSwgdXBvcnQtPnRpbWVvdXQpOwotCX0KKwlpZiAoV0FSTighdXBvcnQsICJkZXRhY2hlZCBwb3J0IHN0aWxsIGluaXRpYWxpemVkIVxuIikpCisJCXJldHVybjsKIAotCXVhcnRfc2h1dGRvd24odHR5LCBzdGF0ZSk7Ci0JdHR5X3BvcnRfdHR5X3NldChwb3J0LCBOVUxMKTsKKwlzcGluX2xvY2tfaXJxKCZ1cG9ydC0+bG9jayk7CisJdXBvcnQtPm9wcy0+c3RvcF9yeCh1cG9ydCk7CisJc3Bpbl91bmxvY2tfaXJxKCZ1cG9ydC0+bG9jayk7CiAKLQlzcGluX2xvY2tfaXJxKCZwb3J0LT5sb2NrKTsKLQotCWlmIChwb3J0LT5ibG9ja2VkX29wZW4pIHsKLQkJc3Bpbl91bmxvY2tfaXJxKCZwb3J0LT5sb2NrKTsKLQkJaWYgKHBvcnQtPmNsb3NlX2RlbGF5KQotCQkJbXNsZWVwX2ludGVycnVwdGlibGUoamlmZmllc190b19tc2Vjcyhwb3J0LT5jbG9zZV9kZWxheSkpOwotCQlzcGluX2xvY2tfaXJxKCZwb3J0LT5sb2NrKTsKLQl9IGVsc2UgaWYgKHVwb3J0ICYmICF1YXJ0X2NvbnNvbGUodXBvcnQpKSB7Ci0JCXNwaW5fdW5sb2NrX2lycSgmcG9ydC0+bG9jayk7Ci0JCXVhcnRfY2hhbmdlX3BtKHN0YXRlLCBVQVJUX1BNX1NUQVRFX09GRik7Ci0JCXNwaW5fbG9ja19pcnEoJnBvcnQtPmxvY2spOwotCX0KLQlzcGluX3VubG9ja19pcnEoJnBvcnQtPmxvY2spOwotCXR0eV9wb3J0X3NldF9hY3RpdmUocG9ydCwgMCk7CisJdWFydF9wb3J0X3NodXRkb3duKHBvcnQpOwogCiAJLyoKLQkgKiBXYWtlIHVwIGFueW9uZSB0cnlpbmcgdG8gb3BlbiB0aGlzIHBvcnQuCisJICogSXQncyBwb3NzaWJsZSBmb3Igc2h1dGRvd24gdG8gYmUgY2FsbGVkIGFmdGVyIHN1c3BlbmQgaWYgd2UgZ2V0CisJICogYSBEQ0QgZHJvcCAoaGFuZ3VwKSBhdCBqdXN0IHRoZSByaWdodCB0aW1lLiAgQ2xlYXIgc3VzcGVuZGVkIGJpdCBzbworCSAqIHdlIGRvbid0IHRyeSB0byByZXN1bWUgYSBwb3J0IHRoYXQgaGFzIGJlZW4gc2h1dGRvd24uCiAJICovCi0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwb3J0LT5vcGVuX3dhaXQpOworCXR0eV9wb3J0X3NldF9zdXNwZW5kZWQocG9ydCwgMCk7CiAKLQltdXRleF91bmxvY2soJnBvcnQtPm11dGV4KTsKKwl1YXJ0X2NoYW5nZV9wbShzdGF0ZSwgVUFSVF9QTV9TVEFURV9PRkYpOwogCi0JdHR5X2xkaXNjX2ZsdXNoKHR0eSk7Ci0JdHR5LT5jbG9zaW5nID0gMDsKIH0KIAogc3RhdGljIHZvaWQgdWFydF93YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpCkBAIC0xNzExLDUyICsxNjg2LDMxIEBACiAJc3RydWN0IHVhcnRfZHJpdmVyICpkcnYgPSB0dHktPmRyaXZlci0+ZHJpdmVyX3N0YXRlOwogCWludCByZXR2YWwsIGxpbmUgPSB0dHktPmluZGV4OwogCXN0cnVjdCB1YXJ0X3N0YXRlICpzdGF0ZSA9IGRydi0+c3RhdGUgKyBsaW5lOwotCXN0cnVjdCB0dHlfcG9ydCAqcG9ydCA9ICZzdGF0ZS0+cG9ydDsKLQlzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydDsKLQotCXByX2RlYnVnKCJ1YXJ0X29wZW4oJWQpIGNhbGxlZFxuIiwgbGluZSk7Ci0KLQlzcGluX2xvY2tfaXJxKCZwb3J0LT5sb2NrKTsKLQkrK3BvcnQtPmNvdW50OwotCXNwaW5fdW5sb2NrX2lycSgmcG9ydC0+bG9jayk7Ci0KLQkvKgotCSAqIFdlIHRha2UgdGhlIHNlbWFwaG9yZSBoZXJlIHRvIGd1YXJhbnRlZSB0aGF0IHdlIHdvbid0IGJlIHJlLWVudGVyZWQKLQkgKiB3aGlsZSBhbGxvY2F0aW5nIHRoZSBzdGF0ZSBzdHJ1Y3R1cmUsIG9yIHdoaWxlIHdlIHJlcXVlc3QgYW55IElSUXMKLQkgKiB0aGF0IHRoZSBkcml2ZXIgbWF5IG5lZWQuICBUaGlzIGFsc28gaGFzIHRoZSBuaWNlIHNpZGUtZWZmZWN0IHRoYXQKLQkgKiBpdCBkZWxheXMgdGhlIGFjdGlvbiBvZiB1YXJ0X2hhbmd1cCwgc28gd2UgY2FuIGd1YXJhbnRlZSB0aGF0Ci0JICogc3RhdGUtPnBvcnQudHR5IHdpbGwgYWx3YXlzIGNvbnRhaW4gc29tZXRoaW5nIHJlYXNvbmFibGUuCi0JICovCi0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmcG9ydC0+bXV0ZXgpKSB7Ci0JCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKLQkJZ290byBlbmQ7Ci0JfQotCi0JdXBvcnQgPSB1YXJ0X3BvcnRfY2hlY2soc3RhdGUpOwotCWlmICghdXBvcnQgfHwgdXBvcnQtPmZsYWdzICYgVVBGX0RFQUQpIHsKLQkJcmV0dmFsID0gLUVOWElPOwotCQlnb3RvIGVycl91bmxvY2s7Ci0JfQogCiAJdHR5LT5kcml2ZXJfZGF0YSA9IHN0YXRlOwotCXVwb3J0LT5zdGF0ZSA9IHN0YXRlOworCisJcmV0dmFsID0gdHR5X3BvcnRfb3Blbigmc3RhdGUtPnBvcnQsIHR0eSwgZmlscCk7CisJaWYgKHJldHZhbCA+IDApCisJCXJldHZhbCA9IDA7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHVhcnRfcG9ydF9hY3RpdmF0ZShzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHVhcnRfc3RhdGUgKnN0YXRlID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCB1YXJ0X3N0YXRlLCBwb3J0KTsKKwlzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydDsKKworCXVwb3J0ID0gdWFydF9wb3J0X2NoZWNrKHN0YXRlKTsKKwlpZiAoIXVwb3J0IHx8IHVwb3J0LT5mbGFncyAmIFVQRl9ERUFEKQorCQlyZXR1cm4gLUVOWElPOworCiAJcG9ydC0+bG93X2xhdGVuY3kgPSAodXBvcnQtPmZsYWdzICYgVVBGX0xPV19MQVRFTkNZKSA/IDEgOiAwOwotCXR0eV9wb3J0X3R0eV9zZXQocG9ydCwgdHR5KTsKIAogCS8qCiAJICogU3RhcnQgdXAgdGhlIHNlcmlhbCBwb3J0LgogCSAqLwotCXJldHZhbCA9IHVhcnRfc3RhcnR1cCh0dHksIHN0YXRlLCAwKTsKLQotCS8qCi0JICogSWYgd2Ugc3VjY2VlZGVkLCB3YWl0IHVudGlsIHRoZSBwb3J0IGlzIHJlYWR5LgotCSAqLwotZXJyX3VubG9jazoKLQltdXRleF91bmxvY2soJnBvcnQtPm11dGV4KTsKLQlpZiAocmV0dmFsID09IDApCi0JCXJldHZhbCA9IHR0eV9wb3J0X2Jsb2NrX3RpbF9yZWFkeShwb3J0LCB0dHksIGZpbHApOwotZW5kOgotCXJldHVybiByZXR2YWw7CisJcmV0dXJuIHVhcnRfc3RhcnR1cCh0dHksIHN0YXRlLCAwKTsKIH0KIAogc3RhdGljIGNvbnN0IGNoYXIgKnVhcnRfdHlwZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQpAQCAtMTk0MCw3ICsxODk0LDcgQEAKICAqCiAgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciAtRUlOVkFMIG9uIGZhaWx1cmUKICAqLwotaW50IHVhcnRfcGFyc2VfZWFybHljb24oY2hhciAqcCwgdW5zaWduZWQgY2hhciAqaW90eXBlLCB1bnNpZ25lZCBsb25nICphZGRyLAoraW50IHVhcnRfcGFyc2VfZWFybHljb24oY2hhciAqcCwgdW5zaWduZWQgY2hhciAqaW90eXBlLCByZXNvdXJjZV9zaXplX3QgKmFkZHIsCiAJCQljaGFyICoqb3B0aW9ucykKIHsKIAlpZiAoc3RybmNtcChwLCAibW1pbywiLCA1KSA9PSAwKSB7CkBAIC0xOTY4LDcgKzE5MjIsMTEgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JKmFkZHIgPSBzaW1wbGVfc3RydG91bChwLCBOVUxMLCAwKTsKKwkvKgorCSAqIEJlZm9yZSB5b3UgcmVwbGFjZSBpdCB3aXRoIGtzdHJ0b3VsbCgpLCB0aGluayBhYm91dCBvcHRpb25zIHNlcGFyYXRvcgorCSAqICgnLCcpIGl0IHdpbGwgbm90IHRvbGVyYXRlCisJICovCisJKmFkZHIgPSBzaW1wbGVfc3RydG91bGwocCwgTlVMTCwgMCk7CiAJcCA9IHN0cmNocihwLCAnLCcpOwogCWlmIChwKQogCQlwKys7CkBAIC0yNDcwLDYgKzI0MjgsOCBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCB0dHlfcG9ydF9vcGVyYXRpb25zIHVhcnRfcG9ydF9vcHMgPSB7CiAJLmNhcnJpZXJfcmFpc2VkID0gdWFydF9jYXJyaWVyX3JhaXNlZCwKIAkuZHRyX3J0cwk9IHVhcnRfZHRyX3J0cywKKwkuYWN0aXZhdGUJPSB1YXJ0X3BvcnRfYWN0aXZhdGUsCisJLnNodXRkb3duCT0gdWFydF90dHlfcG9ydF9zaHV0ZG93biwKIH07CiAKIC8qKgpAQCAtMjc4Niw2ICsyNzQ2LDggQEAKIAl1cG9ydC0+Y29ucyA9IGRydi0+Y29uczsKIAl1cG9ydC0+bWlub3IgPSBkcnYtPnR0eV9kcml2ZXItPm1pbm9yX3N0YXJ0ICsgdXBvcnQtPmxpbmU7CiAKKwlwb3J0LT5jb25zb2xlID0gdWFydF9jb25zb2xlKHVwb3J0KTsKKwogCS8qCiAJICogSWYgdGhpcyBwb3J0IGlzIGEgY29uc29sZSwgdGhlbiB0aGUgc3BpbmxvY2sgaXMgYWxyZWFkeQogCSAqIGluaXRpYWxpc2VkLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3NoLXNjaS5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3NoLXNjaS5jCmluZGV4IGQ4NmVlZTMuLjRiMjYyNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zaC1zY2kuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2gtc2NpLmMKQEAgLTI1MzMsNyArMjUzMyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdWFydF9vcHMgc2NpX3VhcnRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB1YXJ0X29wcyBzY2lfdWFydF9vcHMgPSB7CiAJLnR4X2VtcHR5CT0gc2NpX3R4X2VtcHR5LAogCS5zZXRfbWN0cmwJPSBzY2lfc2V0X21jdHJsLAogCS5nZXRfbWN0cmwJPSBzY2lfZ2V0X21jdHJsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3N0LWFzYy5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3N0LWFzYy5jCmluZGV4IDJkNzhjYjMuLjM3OWU1YmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zdC1hc2MuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc3QtYXNjLmMKQEAgLTYzOSw3ICs2MzksNyBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0YXRpYyBzdHJ1Y3QgdWFydF9vcHMgYXNjX3VhcnRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB1YXJ0X29wcyBhc2NfdWFydF9vcHMgPSB7CiAJLnR4X2VtcHR5CT0gYXNjX3R4X2VtcHR5LAogCS5zZXRfbWN0cmwJPSBhc2Nfc2V0X21jdHJsLAogCS5nZXRfbWN0cmwJPSBhc2NfZ2V0X21jdHJsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3N0bTMyLXVzYXJ0LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc3RtMzItdXNhcnQuYwppbmRleCBmODlkMWY3Li4wMzM4NTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvc3RtMzItdXNhcnQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc3RtMzItdXNhcnQuYwpAQCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIE1heGltZSBDb3F1ZWxpbiAyMDE1Ci0gKiBBdXRob3I6ICBNYXhpbWUgQ29xdWVsaW4gPG1jb3F1ZWxpbi5zdG0zMkBnbWFpbC5jb20+CisgKiBBdXRob3JzOiAgTWF4aW1lIENvcXVlbGluIDxtY29xdWVsaW4uc3RtMzJAZ21haWwuY29tPgorICoJICAgICBHZXJhbGQgQmFlemEgPGdlcmFsZC5iYWV6YUBzdC5jb20+CiAgKiBMaWNlbnNlIHRlcm1zOiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIHZlcnNpb24gMgogICoKICAqIEluc3BpcmVkIGJ5IHN0LWFzYy5jIGZyb20gU1RNaWNyb2VsZWN0cm9uaWNzIChjKQpAQCAtMTAsMTIwICsxMSwzMSBAQAogI2RlZmluZSBTVVBQT1JUX1NZU1JRCiAjZW5kaWYKIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNycS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvdHR5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1kaXJlY3Rpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogCi0jZGVmaW5lIERSSVZFUl9OQU1FICJzdG0zMi11c2FydCIKLQotLyogUmVnaXN0ZXIgb2Zmc2V0cyAqLwotI2RlZmluZSBVU0FSVF9TUgkJMHgwMAotI2RlZmluZSBVU0FSVF9EUgkJMHgwNAotI2RlZmluZSBVU0FSVF9CUlIJCTB4MDgKLSNkZWZpbmUgVVNBUlRfQ1IxCQkweDBjCi0jZGVmaW5lIFVTQVJUX0NSMgkJMHgxMAotI2RlZmluZSBVU0FSVF9DUjMJCTB4MTQKLSNkZWZpbmUgVVNBUlRfR1RQUgkJMHgxOAotCi0vKiBVU0FSVF9TUiAqLwotI2RlZmluZSBVU0FSVF9TUl9QRQkJQklUKDApCi0jZGVmaW5lIFVTQVJUX1NSX0ZFCQlCSVQoMSkKLSNkZWZpbmUgVVNBUlRfU1JfTkYJCUJJVCgyKQotI2RlZmluZSBVU0FSVF9TUl9PUkUJCUJJVCgzKQotI2RlZmluZSBVU0FSVF9TUl9JRExFCQlCSVQoNCkKLSNkZWZpbmUgVVNBUlRfU1JfUlhORQkJQklUKDUpCi0jZGVmaW5lIFVTQVJUX1NSX1RDCQlCSVQoNikKLSNkZWZpbmUgVVNBUlRfU1JfVFhFCQlCSVQoNykKLSNkZWZpbmUgVVNBUlRfU1JfTEJECQlCSVQoOCkKLSNkZWZpbmUgVVNBUlRfU1JfQ1RTCQlCSVQoOSkKLSNkZWZpbmUgVVNBUlRfU1JfRVJSX01BU0sJKFVTQVJUX1NSX0xCRCB8IFVTQVJUX1NSX09SRSB8IFwKLQkJCQkgVVNBUlRfU1JfRkUgfCBVU0FSVF9TUl9QRSkKLS8qIER1bW15IGJpdHMgKi8KLSNkZWZpbmUgVVNBUlRfU1JfRFVNTVlfUlgJQklUKDE2KQotCi0vKiBVU0FSVF9EUiAqLwotI2RlZmluZSBVU0FSVF9EUl9NQVNLCQlHRU5NQVNLKDgsIDApCi0KLS8qIFVTQVJUX0JSUiAqLwotI2RlZmluZSBVU0FSVF9CUlJfRElWX0ZfTUFTSwlHRU5NQVNLKDMsIDApCi0jZGVmaW5lIFVTQVJUX0JSUl9ESVZfTV9NQVNLCUdFTk1BU0soMTUsIDQpCi0jZGVmaW5lIFVTQVJUX0JSUl9ESVZfTV9TSElGVAk0Ci0KLS8qIFVTQVJUX0NSMSAqLwotI2RlZmluZSBVU0FSVF9DUjFfU0JLCQlCSVQoMCkKLSNkZWZpbmUgVVNBUlRfQ1IxX1JXVQkJQklUKDEpCi0jZGVmaW5lIFVTQVJUX0NSMV9SRQkJQklUKDIpCi0jZGVmaW5lIFVTQVJUX0NSMV9URQkJQklUKDMpCi0jZGVmaW5lIFVTQVJUX0NSMV9JRExFSUUJQklUKDQpCi0jZGVmaW5lIFVTQVJUX0NSMV9SWE5FSUUJQklUKDUpCi0jZGVmaW5lIFVTQVJUX0NSMV9UQ0lFCQlCSVQoNikKLSNkZWZpbmUgVVNBUlRfQ1IxX1RYRUlFCQlCSVQoNykKLSNkZWZpbmUgVVNBUlRfQ1IxX1BFSUUJCUJJVCg4KQotI2RlZmluZSBVU0FSVF9DUjFfUFMJCUJJVCg5KQotI2RlZmluZSBVU0FSVF9DUjFfUENFCQlCSVQoMTApCi0jZGVmaW5lIFVTQVJUX0NSMV9XQUtFCQlCSVQoMTEpCi0jZGVmaW5lIFVTQVJUX0NSMV9NCQlCSVQoMTIpCi0jZGVmaW5lIFVTQVJUX0NSMV9VRQkJQklUKDEzKQotI2RlZmluZSBVU0FSVF9DUjFfT1ZFUjgJCUJJVCgxNSkKLSNkZWZpbmUgVVNBUlRfQ1IxX0lFX01BU0sJR0VOTUFTSyg4LCA0KQotCi0vKiBVU0FSVF9DUjIgKi8KLSNkZWZpbmUgVVNBUlRfQ1IyX0FERF9NQVNLCUdFTk1BU0soMywgMCkKLSNkZWZpbmUgVVNBUlRfQ1IyX0xCREwJCUJJVCg1KQotI2RlZmluZSBVU0FSVF9DUjJfTEJESUUJCUJJVCg2KQotI2RlZmluZSBVU0FSVF9DUjJfTEJDTAkJQklUKDgpCi0jZGVmaW5lIFVTQVJUX0NSMl9DUEhBCQlCSVQoOSkKLSNkZWZpbmUgVVNBUlRfQ1IyX0NQT0wJCUJJVCgxMCkKLSNkZWZpbmUgVVNBUlRfQ1IyX0NMS0VOCQlCSVQoMTEpCi0jZGVmaW5lIFVTQVJUX0NSMl9TVE9QXzJCCUJJVCgxMykKLSNkZWZpbmUgVVNBUlRfQ1IyX1NUT1BfTUFTSwlHRU5NQVNLKDEzLCAxMikKLSNkZWZpbmUgVVNBUlRfQ1IyX0xJTkVOCQlCSVQoMTQpCi0KLS8qIFVTQVJUX0NSMyAqLwotI2RlZmluZSBVU0FSVF9DUjNfRUlFCQlCSVQoMCkKLSNkZWZpbmUgVVNBUlRfQ1IzX0lSRU4JCUJJVCgxKQotI2RlZmluZSBVU0FSVF9DUjNfSVJMUAkJQklUKDIpCi0jZGVmaW5lIFVTQVJUX0NSM19IRFNFTAkJQklUKDMpCi0jZGVmaW5lIFVTQVJUX0NSM19OQUNLCQlCSVQoNCkKLSNkZWZpbmUgVVNBUlRfQ1IzX1NDRU4JCUJJVCg1KQotI2RlZmluZSBVU0FSVF9DUjNfRE1BUgkJQklUKDYpCi0jZGVmaW5lIFVTQVJUX0NSM19ETUFUCQlCSVQoNykKLSNkZWZpbmUgVVNBUlRfQ1IzX1JUU0UJCUJJVCg4KQotI2RlZmluZSBVU0FSVF9DUjNfQ1RTRQkJQklUKDkpCi0jZGVmaW5lIFVTQVJUX0NSM19DVFNJRQkJQklUKDEwKQotI2RlZmluZSBVU0FSVF9DUjNfT05FQklUCUJJVCgxMSkKLQotLyogVVNBUlRfR1RQUiAqLwotI2RlZmluZSBVU0FSVF9HVFBSX1BTQ19NQVNLCUdFTk1BU0soNywgMCkKLSNkZWZpbmUgVVNBUlRfR1RQUl9HVF9NQVNLCUdFTk1BU0soMTUsIDgpCi0KLSNkZWZpbmUgRFJJVkVSX05BTUUgInN0bTMyLXVzYXJ0IgotI2RlZmluZSBTVE0zMl9TRVJJQUxfTkFNRSAidHR5UyIKLSNkZWZpbmUgU1RNMzJfTUFYX1BPUlRTIDYKLQotc3RydWN0IHN0bTMyX3BvcnQgewotCXN0cnVjdCB1YXJ0X3BvcnQgcG9ydDsKLQlzdHJ1Y3QgY2xrICpjbGs7Ci0JYm9vbCBod19mbG93X2NvbnRyb2w7Ci19OwotCi1zdGF0aWMgc3RydWN0IHN0bTMyX3BvcnQgc3RtMzJfcG9ydHNbU1RNMzJfTUFYX1BPUlRTXTsKLXN0YXRpYyBzdHJ1Y3QgdWFydF9kcml2ZXIgc3RtMzJfdXNhcnRfZHJpdmVyOworI2luY2x1ZGUgInN0bTMyLXVzYXJ0LmgiCiAKIHN0YXRpYyB2b2lkIHN0bTMyX3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCk7CitzdGF0aWMgdm9pZCBzdG0zMl90cmFuc21pdF9jaGFycyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3RtMzJfcG9ydCAqdG9fc3RtMzJfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewpAQCAtMTQ4LDE5ICs2MCw2NCBAQAogCXdyaXRlbF9yZWxheGVkKHZhbCwgcG9ydC0+bWVtYmFzZSArIHJlZyk7CiB9CiAKLXN0YXRpYyB2b2lkIHN0bTMyX3JlY2VpdmVfY2hhcnMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3N0YXRpYyBpbnQgc3RtMzJfcGVuZGluZ19yeChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1MzIgKnNyLCBpbnQgKmxhc3RfcmVzLAorCQkJICAgIGJvb2wgdGhyZWFkZWQpCit7CisJc3RydWN0IHN0bTMyX3BvcnQgKnN0bTMyX3BvcnQgPSB0b19zdG0zMl9wb3J0KHBvcnQpOworCXN0cnVjdCBzdG0zMl91c2FydF9vZmZzZXRzICpvZnMgPSAmc3RtMzJfcG9ydC0+aW5mby0+b2ZzOworCWVudW0gZG1hX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGRtYV90eF9zdGF0ZSBzdGF0ZTsKKworCSpzciA9IHJlYWRsX3JlbGF4ZWQocG9ydC0+bWVtYmFzZSArIG9mcy0+aXNyKTsKKworCWlmICh0aHJlYWRlZCAmJiBzdG0zMl9wb3J0LT5yeF9jaCkgeworCQlzdGF0dXMgPSBkbWFlbmdpbmVfdHhfc3RhdHVzKHN0bTMyX3BvcnQtPnJ4X2NoLAorCQkJCQkgICAgIHN0bTMyX3BvcnQtPnJ4X2NoLT5jb29raWUsCisJCQkJCSAgICAgJnN0YXRlKTsKKwkJaWYgKChzdGF0dXMgPT0gRE1BX0lOX1BST0dSRVNTKSAmJgorCQkgICAgKCpsYXN0X3JlcyAhPSBzdGF0ZS5yZXNpZHVlKSkKKwkJCXJldHVybiAxOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKCpzciAmIFVTQVJUX1NSX1JYTkUpIHsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZworc3RtMzJfZ2V0X2NoYXIoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdTMyICpzciwgaW50ICpsYXN0X3JlcykKK3sKKwlzdHJ1Y3Qgc3RtMzJfcG9ydCAqc3RtMzJfcG9ydCA9IHRvX3N0bTMyX3BvcnQocG9ydCk7CisJc3RydWN0IHN0bTMyX3VzYXJ0X29mZnNldHMgKm9mcyA9ICZzdG0zMl9wb3J0LT5pbmZvLT5vZnM7CisJdW5zaWduZWQgbG9uZyBjOworCisJaWYgKHN0bTMyX3BvcnQtPnJ4X2NoKSB7CisJCWMgPSBzdG0zMl9wb3J0LT5yeF9idWZbUlhfQlVGX0wgLSAoKmxhc3RfcmVzKS0tXTsKKwkJaWYgKCgqbGFzdF9yZXMpID09IDApCisJCQkqbGFzdF9yZXMgPSBSWF9CVUZfTDsKKwkJcmV0dXJuIGM7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHJlYWRsX3JlbGF4ZWQocG9ydC0+bWVtYmFzZSArIG9mcy0+cmRyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN0bTMyX3JlY2VpdmVfY2hhcnMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgYm9vbCB0aHJlYWRlZCkKIHsKIAlzdHJ1Y3QgdHR5X3BvcnQgKnRwb3J0ID0gJnBvcnQtPnN0YXRlLT5wb3J0OworCXN0cnVjdCBzdG0zMl9wb3J0ICpzdG0zMl9wb3J0ID0gdG9fc3RtMzJfcG9ydChwb3J0KTsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfb2Zmc2V0cyAqb2ZzID0gJnN0bTMyX3BvcnQtPmluZm8tPm9mczsKIAl1bnNpZ25lZCBsb25nIGM7CiAJdTMyIHNyOwogCWNoYXIgZmxhZzsKKwlzdGF0aWMgaW50IGxhc3RfcmVzID0gUlhfQlVGX0w7CiAKIAlpZiAocG9ydC0+aXJxX3dha2UpCiAJCXBtX3dha2V1cF9ldmVudCh0cG9ydC0+dHR5LT5kZXYsIDApOwogCi0Jd2hpbGUgKChzciA9IHJlYWRsX3JlbGF4ZWQocG9ydC0+bWVtYmFzZSArIFVTQVJUX1NSKSkgJiBVU0FSVF9TUl9SWE5FKSB7CisJd2hpbGUgKHN0bTMyX3BlbmRpbmdfcngocG9ydCwgJnNyLCAmbGFzdF9yZXMsIHRocmVhZGVkKSkgewogCQlzciB8PSBVU0FSVF9TUl9EVU1NWV9SWDsKLQkJYyA9IHJlYWRsX3JlbGF4ZWQocG9ydC0+bWVtYmFzZSArIFVTQVJUX0RSKTsKKwkJYyA9IHN0bTMyX2dldF9jaGFyKHBvcnQsICZzciwgJmxhc3RfcmVzKTsKIAkJZmxhZyA9IFRUWV9OT1JNQUw7CiAJCXBvcnQtPmljb3VudC5yeCsrOwogCkBAIC0xNzAsNiArMTI3LDEwIEBACiAJCQkJaWYgKHVhcnRfaGFuZGxlX2JyZWFrKHBvcnQpKQogCQkJCQljb250aW51ZTsKIAkJCX0gZWxzZSBpZiAoc3IgJiBVU0FSVF9TUl9PUkUpIHsKKwkJCQlpZiAob2ZzLT5pY3IgIT0gVU5ERUZfUkVHKQorCQkJCQl3cml0ZWxfcmVsYXhlZChVU0FSVF9JQ1JfT1JFQ0YsCisJCQkJCQkgICAgICAgcG9ydC0+bWVtYmFzZSArCisJCQkJCQkgICAgICAgb2ZzLT5pY3IpOwogCQkJCXBvcnQtPmljb3VudC5vdmVycnVuKys7CiAJCQl9IGVsc2UgaWYgKHNyICYgVVNBUlRfU1JfUEUpIHsKIAkJCQlwb3J0LT5pY291bnQucGFyaXR5Kys7CkBAIC0xOTcsMTQgKzE1OCwxMzggQEAKIAlzcGluX2xvY2soJnBvcnQtPmxvY2spOwogfQogCitzdGF0aWMgdm9pZCBzdG0zMl90eF9kbWFfY29tcGxldGUodm9pZCAqYXJnKQoreworCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSBhcmc7CisJc3RydWN0IHN0bTMyX3BvcnQgKnN0bTMycG9ydCA9IHRvX3N0bTMyX3BvcnQocG9ydCk7CisJc3RydWN0IHN0bTMyX3VzYXJ0X29mZnNldHMgKm9mcyA9ICZzdG0zMnBvcnQtPmluZm8tPm9mczsKKwl1bnNpZ25lZCBpbnQgaXNyOworCWludCByZXQ7CisKKwlyZXQgPSByZWFkbF9yZWxheGVkX3BvbGxfdGltZW91dF9hdG9taWMocG9ydC0+bWVtYmFzZSArIG9mcy0+aXNyLAorCQkJCQkJaXNyLAorCQkJCQkJKGlzciAmIFVTQVJUX1NSX1RDKSwKKwkJCQkJCTEwLCAxMDAwMDApOworCisJaWYgKHJldCkKKwkJZGV2X2Vycihwb3J0LT5kZXYsICJ0ZXJtaW5hbCBjb3VudCBub3Qgc2V0XG4iKTsKKworCWlmIChvZnMtPmljciA9PSBVTkRFRl9SRUcpCisJCXN0bTMyX2Nscl9iaXRzKHBvcnQsIG9mcy0+aXNyLCBVU0FSVF9TUl9UQyk7CisJZWxzZQorCQlzdG0zMl9zZXRfYml0cyhwb3J0LCBvZnMtPmljciwgVVNBUlRfQ1JfVEMpOworCisJc3RtMzJfY2xyX2JpdHMocG9ydCwgb2ZzLT5jcjMsIFVTQVJUX0NSM19ETUFUKTsKKwlzdG0zMnBvcnQtPnR4X2RtYV9idXN5ID0gZmFsc2U7CisKKwkvKiBMZXQncyBzZWUgaWYgd2UgaGF2ZSBwZW5kaW5nIGRhdGEgdG8gc2VuZCAqLworCXN0bTMyX3RyYW5zbWl0X2NoYXJzKHBvcnQpOworfQorCitzdGF0aWMgdm9pZCBzdG0zMl90cmFuc21pdF9jaGFyc19waW8oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3Qgc3RtMzJfcG9ydCAqc3RtMzJfcG9ydCA9IHRvX3N0bTMyX3BvcnQocG9ydCk7CisJc3RydWN0IHN0bTMyX3VzYXJ0X29mZnNldHMgKm9mcyA9ICZzdG0zMl9wb3J0LT5pbmZvLT5vZnM7CisJc3RydWN0IGNpcmNfYnVmICp4bWl0ID0gJnBvcnQtPnN0YXRlLT54bWl0OworCXVuc2lnbmVkIGludCBpc3I7CisJaW50IHJldDsKKworCWlmIChzdG0zMl9wb3J0LT50eF9kbWFfYnVzeSkgeworCQlzdG0zMl9jbHJfYml0cyhwb3J0LCBvZnMtPmNyMywgVVNBUlRfQ1IzX0RNQVQpOworCQlzdG0zMl9wb3J0LT50eF9kbWFfYnVzeSA9IGZhbHNlOworCX0KKworCXJldCA9IHJlYWRsX3JlbGF4ZWRfcG9sbF90aW1lb3V0X2F0b21pYyhwb3J0LT5tZW1iYXNlICsgb2ZzLT5pc3IsCisJCQkJCQlpc3IsCisJCQkJCQkoaXNyICYgVVNBUlRfU1JfVFhFKSwKKwkJCQkJCTEwLCAxMDApOworCisJaWYgKHJldCkKKwkJZGV2X2Vycihwb3J0LT5kZXYsICJ0eCBlbXB0eSBub3Qgc2V0XG4iKTsKKworCXN0bTMyX3NldF9iaXRzKHBvcnQsIG9mcy0+Y3IxLCBVU0FSVF9DUjFfVFhFSUUpOworCisJd3JpdGVsX3JlbGF4ZWQoeG1pdC0+YnVmW3htaXQtPnRhaWxdLCBwb3J0LT5tZW1iYXNlICsgb2ZzLT50ZHIpOworCXhtaXQtPnRhaWwgPSAoeG1pdC0+dGFpbCArIDEpICYgKFVBUlRfWE1JVF9TSVpFIC0gMSk7CisJcG9ydC0+aWNvdW50LnR4Kys7Cit9CisKK3N0YXRpYyB2b2lkIHN0bTMyX3RyYW5zbWl0X2NoYXJzX2RtYShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBzdG0zMl9wb3J0ICpzdG0zMnBvcnQgPSB0b19zdG0zMl9wb3J0KHBvcnQpOworCXN0cnVjdCBzdG0zMl91c2FydF9vZmZzZXRzICpvZnMgPSAmc3RtMzJwb3J0LT5pbmZvLT5vZnM7CisJc3RydWN0IGNpcmNfYnVmICp4bWl0ID0gJnBvcnQtPnN0YXRlLT54bWl0OworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVzYyA9IE5VTEw7CisJZG1hX2Nvb2tpZV90IGNvb2tpZTsKKwl1bnNpZ25lZCBpbnQgY291bnQsIGk7CisKKwlpZiAoc3RtMzJwb3J0LT50eF9kbWFfYnVzeSkKKwkJcmV0dXJuOworCisJc3RtMzJwb3J0LT50eF9kbWFfYnVzeSA9IHRydWU7CisKKwljb3VudCA9IHVhcnRfY2lyY19jaGFyc19wZW5kaW5nKHhtaXQpOworCisJaWYgKGNvdW50ID4gVFhfQlVGX0wpCisJCWNvdW50ID0gVFhfQlVGX0w7CisKKwlpZiAoeG1pdC0+dGFpbCA8IHhtaXQtPmhlYWQpIHsKKwkJbWVtY3B5KCZzdG0zMnBvcnQtPnR4X2J1ZlswXSwgJnhtaXQtPmJ1Zlt4bWl0LT50YWlsXSwgY291bnQpOworCX0gZWxzZSB7CisJCXNpemVfdCBvbmUgPSBVQVJUX1hNSVRfU0laRSAtIHhtaXQtPnRhaWw7CisJCXNpemVfdCB0d287CisKKwkJaWYgKG9uZSA+IGNvdW50KQorCQkJb25lID0gY291bnQ7CisJCXR3byA9IGNvdW50IC0gb25lOworCisJCW1lbWNweSgmc3RtMzJwb3J0LT50eF9idWZbMF0sICZ4bWl0LT5idWZbeG1pdC0+dGFpbF0sIG9uZSk7CisJCWlmICh0d28pCisJCQltZW1jcHkoJnN0bTMycG9ydC0+dHhfYnVmW29uZV0sICZ4bWl0LT5idWZbMF0sIHR3byk7CisJfQorCisJZGVzYyA9IGRtYWVuZ2luZV9wcmVwX3NsYXZlX3NpbmdsZShzdG0zMnBvcnQtPnR4X2NoLAorCQkJCQkgICBzdG0zMnBvcnQtPnR4X2RtYV9idWYsCisJCQkJCSAgIGNvdW50LAorCQkJCQkgICBETUFfTUVNX1RPX0RFViwKKwkJCQkJICAgRE1BX1BSRVBfSU5URVJSVVBUKTsKKworCWlmICghZGVzYykgeworCQlmb3IgKGkgPSBjb3VudDsgaSA+IDA7IGktLSkKKwkJCXN0bTMyX3RyYW5zbWl0X2NoYXJzX3Bpbyhwb3J0KTsKKwkJcmV0dXJuOworCX0KKworCWRlc2MtPmNhbGxiYWNrID0gc3RtMzJfdHhfZG1hX2NvbXBsZXRlOworCWRlc2MtPmNhbGxiYWNrX3BhcmFtID0gcG9ydDsKKworCS8qIFB1c2ggY3VycmVudCBETUEgVFggdHJhbnNhY3Rpb24gaW4gdGhlIHBlbmRpbmcgcXVldWUgKi8KKwljb29raWUgPSBkbWFlbmdpbmVfc3VibWl0KGRlc2MpOworCisJLyogSXNzdWUgcGVuZGluZyBETUEgVFggcmVxdWVzdHMgKi8KKwlkbWFfYXN5bmNfaXNzdWVfcGVuZGluZyhzdG0zMnBvcnQtPnR4X2NoKTsKKworCXN0bTMyX2Nscl9iaXRzKHBvcnQsIG9mcy0+aXNyLCBVU0FSVF9TUl9UQyk7CisJc3RtMzJfc2V0X2JpdHMocG9ydCwgb2ZzLT5jcjMsIFVTQVJUX0NSM19ETUFUKTsKKworCXhtaXQtPnRhaWwgPSAoeG1pdC0+dGFpbCArIGNvdW50KSAmIChVQVJUX1hNSVRfU0laRSAtIDEpOworCXBvcnQtPmljb3VudC50eCArPSBjb3VudDsKK30KKwogc3RhdGljIHZvaWQgc3RtMzJfdHJhbnNtaXRfY2hhcnMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKKwlzdHJ1Y3Qgc3RtMzJfcG9ydCAqc3RtMzJfcG9ydCA9IHRvX3N0bTMyX3BvcnQocG9ydCk7CisJc3RydWN0IHN0bTMyX3VzYXJ0X29mZnNldHMgKm9mcyA9ICZzdG0zMl9wb3J0LT5pbmZvLT5vZnM7CiAJc3RydWN0IGNpcmNfYnVmICp4bWl0ID0gJnBvcnQtPnN0YXRlLT54bWl0OwogCiAJaWYgKHBvcnQtPnhfY2hhcikgewotCQl3cml0ZWxfcmVsYXhlZChwb3J0LT54X2NoYXIsIHBvcnQtPm1lbWJhc2UgKyBVU0FSVF9EUik7CisJCWlmIChzdG0zMl9wb3J0LT50eF9kbWFfYnVzeSkKKwkJCXN0bTMyX2Nscl9iaXRzKHBvcnQsIG9mcy0+Y3IzLCBVU0FSVF9DUjNfRE1BVCk7CisJCXdyaXRlbF9yZWxheGVkKHBvcnQtPnhfY2hhciwgcG9ydC0+bWVtYmFzZSArIG9mcy0+dGRyKTsKIAkJcG9ydC0+eF9jaGFyID0gMDsKIAkJcG9ydC0+aWNvdW50LnR4Kys7CisJCWlmIChzdG0zMl9wb3J0LT50eF9kbWFfYnVzeSkKKwkJCXN0bTMyX3NldF9iaXRzKHBvcnQsIG9mcy0+Y3IzLCBVU0FSVF9DUjNfRE1BVCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTIxOCw5ICszMDMsMTAgQEAKIAkJcmV0dXJuOwogCX0KIAotCXdyaXRlbF9yZWxheGVkKHhtaXQtPmJ1Zlt4bWl0LT50YWlsXSwgcG9ydC0+bWVtYmFzZSArIFVTQVJUX0RSKTsKLQl4bWl0LT50YWlsID0gKHhtaXQtPnRhaWwgKyAxKSAmIChVQVJUX1hNSVRfU0laRSAtIDEpOwotCXBvcnQtPmljb3VudC50eCsrOworCWlmIChzdG0zMl9wb3J0LT50eF9jaCkKKwkJc3RtMzJfdHJhbnNtaXRfY2hhcnNfZG1hKHBvcnQpOworCWVsc2UKKwkJc3RtMzJfdHJhbnNtaXRfY2hhcnNfcGlvKHBvcnQpOwogCiAJaWYgKHVhcnRfY2lyY19jaGFyc19wZW5kaW5nKHhtaXQpIDwgV0FLRVVQX0NIQVJTKQogCQl1YXJ0X3dyaXRlX3dha2V1cChwb3J0KTsKQEAgLTIzMiwzNCArMzE4LDYwIEBACiBzdGF0aWMgaXJxcmV0dXJuX3Qgc3RtMzJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKnB0cikKIHsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gcHRyOworCXN0cnVjdCBzdG0zMl9wb3J0ICpzdG0zMl9wb3J0ID0gdG9fc3RtMzJfcG9ydChwb3J0KTsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfb2Zmc2V0cyAqb2ZzID0gJnN0bTMyX3BvcnQtPmluZm8tPm9mczsKIAl1MzIgc3I7CiAKIAlzcGluX2xvY2soJnBvcnQtPmxvY2spOwogCi0Jc3IgPSByZWFkbF9yZWxheGVkKHBvcnQtPm1lbWJhc2UgKyBVU0FSVF9TUik7CisJc3IgPSByZWFkbF9yZWxheGVkKHBvcnQtPm1lbWJhc2UgKyBvZnMtPmlzcik7CiAKLQlpZiAoc3IgJiBVU0FSVF9TUl9SWE5FKQotCQlzdG0zMl9yZWNlaXZlX2NoYXJzKHBvcnQpOworCWlmICgoc3IgJiBVU0FSVF9TUl9SWE5FKSAmJiAhKHN0bTMyX3BvcnQtPnJ4X2NoKSkKKwkJc3RtMzJfcmVjZWl2ZV9jaGFycyhwb3J0LCBmYWxzZSk7CiAKLQlpZiAoc3IgJiBVU0FSVF9TUl9UWEUpCisJaWYgKChzciAmIFVTQVJUX1NSX1RYRSkgJiYgIShzdG0zMl9wb3J0LT50eF9jaCkpCiAJCXN0bTMyX3RyYW5zbWl0X2NoYXJzKHBvcnQpOwogCiAJc3Bpbl91bmxvY2soJnBvcnQtPmxvY2spOwogCisJaWYgKHN0bTMyX3BvcnQtPnJ4X2NoKQorCQlyZXR1cm4gSVJRX1dBS0VfVEhSRUFEOworCWVsc2UKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc3RtMzJfdGhyZWFkZWRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gcHRyOworCXN0cnVjdCBzdG0zMl9wb3J0ICpzdG0zMl9wb3J0ID0gdG9fc3RtMzJfcG9ydChwb3J0KTsKKworCXNwaW5fbG9jaygmcG9ydC0+bG9jayk7CisKKwlpZiAoc3RtMzJfcG9ydC0+cnhfY2gpCisJCXN0bTMyX3JlY2VpdmVfY2hhcnMocG9ydCwgdHJ1ZSk7CisKKwlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7CisKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc3RtMzJfdHhfZW1wdHkoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKLQlyZXR1cm4gcmVhZGxfcmVsYXhlZChwb3J0LT5tZW1iYXNlICsgVVNBUlRfU1IpICYgVVNBUlRfU1JfVFhFOworCXN0cnVjdCBzdG0zMl9wb3J0ICpzdG0zMl9wb3J0ID0gdG9fc3RtMzJfcG9ydChwb3J0KTsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfb2Zmc2V0cyAqb2ZzID0gJnN0bTMyX3BvcnQtPmluZm8tPm9mczsKKworCXJldHVybiByZWFkbF9yZWxheGVkKHBvcnQtPm1lbWJhc2UgKyBvZnMtPmlzcikgJiBVU0FSVF9TUl9UWEU7CiB9CiAKIHN0YXRpYyB2b2lkIHN0bTMyX3NldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgbWN0cmwpCiB7CisJc3RydWN0IHN0bTMyX3BvcnQgKnN0bTMyX3BvcnQgPSB0b19zdG0zMl9wb3J0KHBvcnQpOworCXN0cnVjdCBzdG0zMl91c2FydF9vZmZzZXRzICpvZnMgPSAmc3RtMzJfcG9ydC0+aW5mby0+b2ZzOworCiAJaWYgKChtY3RybCAmIFRJT0NNX1JUUykgJiYgKHBvcnQtPnN0YXR1cyAmIFVQU1RBVF9BVVRPUlRTKSkKLQkJc3RtMzJfc2V0X2JpdHMocG9ydCwgVVNBUlRfQ1IzLCBVU0FSVF9DUjNfUlRTRSk7CisJCXN0bTMyX3NldF9iaXRzKHBvcnQsIG9mcy0+Y3IzLCBVU0FSVF9DUjNfUlRTRSk7CiAJZWxzZQotCQlzdG0zMl9jbHJfYml0cyhwb3J0LCBVU0FSVF9DUjMsIFVTQVJUX0NSM19SVFNFKTsKKwkJc3RtMzJfY2xyX2JpdHMocG9ydCwgb2ZzLT5jcjMsIFVTQVJUX0NSM19SVFNFKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBzdG0zMl9nZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKQEAgLTI3MSw3ICszODMsMTAgQEAKIC8qIFRyYW5zbWl0IHN0b3AgKi8KIHN0YXRpYyB2b2lkIHN0bTMyX3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKLQlzdG0zMl9jbHJfYml0cyhwb3J0LCBVU0FSVF9DUjEsIFVTQVJUX0NSMV9UWEVJRSk7CisJc3RydWN0IHN0bTMyX3BvcnQgKnN0bTMyX3BvcnQgPSB0b19zdG0zMl9wb3J0KHBvcnQpOworCXN0cnVjdCBzdG0zMl91c2FydF9vZmZzZXRzICpvZnMgPSAmc3RtMzJfcG9ydC0+aW5mby0+b2ZzOworCisJc3RtMzJfY2xyX2JpdHMocG9ydCwgb2ZzLT5jcjEsIFVTQVJUX0NSMV9UWEVJRSk7CiB9CiAKIC8qIFRoZXJlIGFyZSBwcm9iYWJseSBjaGFyYWN0ZXJzIHdhaXRpbmcgdG8gYmUgdHJhbnNtaXR0ZWQuICovCkBAIC0yODIsMzMgKzM5Nyw0MCBAQAogCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpCiAJCXJldHVybjsKIAotCXN0bTMyX3NldF9iaXRzKHBvcnQsIFVTQVJUX0NSMSwgVVNBUlRfQ1IxX1RYRUlFIHwgVVNBUlRfQ1IxX1RFKTsKKwlzdG0zMl90cmFuc21pdF9jaGFycyhwb3J0KTsKIH0KIAogLyogVGhyb3R0bGUgdGhlIHJlbW90ZSB3aGVuIGlucHV0IGJ1ZmZlciBpcyBhYm91dCB0byBvdmVyZmxvdy4gKi8KIHN0YXRpYyB2b2lkIHN0bTMyX3Rocm90dGxlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CisJc3RydWN0IHN0bTMyX3BvcnQgKnN0bTMyX3BvcnQgPSB0b19zdG0zMl9wb3J0KHBvcnQpOworCXN0cnVjdCBzdG0zMl91c2FydF9vZmZzZXRzICpvZnMgPSAmc3RtMzJfcG9ydC0+aW5mby0+b2ZzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCXN0bTMyX2Nscl9iaXRzKHBvcnQsIFVTQVJUX0NSMSwgVVNBUlRfQ1IxX1JYTkVJRSk7CisJc3RtMzJfY2xyX2JpdHMocG9ydCwgb2ZzLT5jcjEsIFVTQVJUX0NSMV9SWE5FSUUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIH0KIAogLyogVW50aHJvdHRsZSB0aGUgcmVtb3RlLCB0aGUgaW5wdXQgYnVmZmVyIGNhbiBub3cgYWNjZXB0IGRhdGEuICovCiBzdGF0aWMgdm9pZCBzdG0zMl91bnRocm90dGxlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CisJc3RydWN0IHN0bTMyX3BvcnQgKnN0bTMyX3BvcnQgPSB0b19zdG0zMl9wb3J0KHBvcnQpOworCXN0cnVjdCBzdG0zMl91c2FydF9vZmZzZXRzICpvZnMgPSAmc3RtMzJfcG9ydC0+aW5mby0+b2ZzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCXN0bTMyX3NldF9iaXRzKHBvcnQsIFVTQVJUX0NSMSwgVVNBUlRfQ1IxX1JYTkVJRSk7CisJc3RtMzJfc2V0X2JpdHMocG9ydCwgb2ZzLT5jcjEsIFVTQVJUX0NSMV9SWE5FSUUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIH0KIAogLyogUmVjZWl2ZSBzdG9wICovCiBzdGF0aWMgdm9pZCBzdG0zMl9zdG9wX3J4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7Ci0Jc3RtMzJfY2xyX2JpdHMocG9ydCwgVVNBUlRfQ1IxLCBVU0FSVF9DUjFfUlhORUlFKTsKKwlzdHJ1Y3Qgc3RtMzJfcG9ydCAqc3RtMzJfcG9ydCA9IHRvX3N0bTMyX3BvcnQocG9ydCk7CisJc3RydWN0IHN0bTMyX3VzYXJ0X29mZnNldHMgKm9mcyA9ICZzdG0zMl9wb3J0LT5pbmZvLT5vZnM7CisKKwlzdG0zMl9jbHJfYml0cyhwb3J0LCBvZnMtPmNyMSwgVVNBUlRfQ1IxX1JYTkVJRSk7CiB9CiAKIC8qIEhhbmRsZSBicmVha3MgLSBpZ25vcmVkIGJ5IHVzICovCkBAIC0zMTgsMjYgKzQ0MCwzNCBAQAogCiBzdGF0aWMgaW50IHN0bTMyX3N0YXJ0dXAoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKKwlzdHJ1Y3Qgc3RtMzJfcG9ydCAqc3RtMzJfcG9ydCA9IHRvX3N0bTMyX3BvcnQocG9ydCk7CisJc3RydWN0IHN0bTMyX3VzYXJ0X29mZnNldHMgKm9mcyA9ICZzdG0zMl9wb3J0LT5pbmZvLT5vZnM7CiAJY29uc3QgY2hhciAqbmFtZSA9IHRvX3BsYXRmb3JtX2RldmljZShwb3J0LT5kZXYpLT5uYW1lOwogCXUzMiB2YWw7CiAJaW50IHJldDsKIAotCXJldCA9IHJlcXVlc3RfaXJxKHBvcnQtPmlycSwgc3RtMzJfaW50ZXJydXB0LCAwLCBuYW1lLCBwb3J0KTsKKwlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShwb3J0LT5pcnEsIHN0bTMyX2ludGVycnVwdCwKKwkJCQkgICBzdG0zMl90aHJlYWRlZF9pbnRlcnJ1cHQsCisJCQkJICAgSVJRRl9OT19TVVNQRU5ELCBuYW1lLCBwb3J0KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJdmFsID0gVVNBUlRfQ1IxX1JYTkVJRSB8IFVTQVJUX0NSMV9URSB8IFVTQVJUX0NSMV9SRTsKLQlzdG0zMl9zZXRfYml0cyhwb3J0LCBVU0FSVF9DUjEsIHZhbCk7CisJc3RtMzJfc2V0X2JpdHMocG9ydCwgb2ZzLT5jcjEsIHZhbCk7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgc3RtMzJfc2h1dGRvd24oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKKwlzdHJ1Y3Qgc3RtMzJfcG9ydCAqc3RtMzJfcG9ydCA9IHRvX3N0bTMyX3BvcnQocG9ydCk7CisJc3RydWN0IHN0bTMyX3VzYXJ0X29mZnNldHMgKm9mcyA9ICZzdG0zMl9wb3J0LT5pbmZvLT5vZnM7CisJc3RydWN0IHN0bTMyX3VzYXJ0X2NvbmZpZyAqY2ZnID0gJnN0bTMyX3BvcnQtPmluZm8tPmNmZzsKIAl1MzIgdmFsOwogCiAJdmFsID0gVVNBUlRfQ1IxX1RYRUlFIHwgVVNBUlRfQ1IxX1JYTkVJRSB8IFVTQVJUX0NSMV9URSB8IFVTQVJUX0NSMV9SRTsKLQlzdG0zMl9zZXRfYml0cyhwb3J0LCBVU0FSVF9DUjEsIHZhbCk7CisJdmFsIHw9IEJJVChjZmctPnVhcnRfZW5hYmxlX2JpdCk7CisJc3RtMzJfY2xyX2JpdHMocG9ydCwgb2ZzLT5jcjEsIHZhbCk7CiAKIAlmcmVlX2lycShwb3J0LT5pcnEsIHBvcnQpOwogfQpAQCAtMzQ2LDYgKzQ3Niw4IEBACiAJCQkgICAgc3RydWN0IGt0ZXJtaW9zICpvbGQpCiB7CiAJc3RydWN0IHN0bTMyX3BvcnQgKnN0bTMyX3BvcnQgPSB0b19zdG0zMl9wb3J0KHBvcnQpOworCXN0cnVjdCBzdG0zMl91c2FydF9vZmZzZXRzICpvZnMgPSAmc3RtMzJfcG9ydC0+aW5mby0+b2ZzOworCXN0cnVjdCBzdG0zMl91c2FydF9jb25maWcgKmNmZyA9ICZzdG0zMl9wb3J0LT5pbmZvLT5jZmc7CiAJdW5zaWduZWQgaW50IGJhdWQ7CiAJdTMyIHVzYXJ0ZGl2LCBtYW50aXNzYSwgZnJhY3Rpb24sIG92ZXJzYW1wbGluZzsKIAl0Y2ZsYWdfdCBjZmxhZyA9IHRlcm1pb3MtPmNfY2ZsYWc7CkBAIC0zNjAsOSArNDkyLDEwIEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIAogCS8qIFN0b3Agc2VyaWFsIHBvcnQgYW5kIHJlc2V0IHZhbHVlICovCi0Jd3JpdGVsX3JlbGF4ZWQoMCwgcG9ydC0+bWVtYmFzZSArIFVTQVJUX0NSMSk7CisJd3JpdGVsX3JlbGF4ZWQoMCwgcG9ydC0+bWVtYmFzZSArIG9mcy0+Y3IxKTsKIAotCWNyMSA9IFVTQVJUX0NSMV9URSB8IFVTQVJUX0NSMV9SRSB8IFVTQVJUX0NSMV9VRSB8IFVTQVJUX0NSMV9SWE5FSUU7CisJY3IxID0gVVNBUlRfQ1IxX1RFIHwgVVNBUlRfQ1IxX1JFIHwgVVNBUlRfQ1IxX1JYTkVJRTsKKwljcjEgfD0gQklUKGNmZy0+dWFydF9lbmFibGVfYml0KTsKIAljcjIgPSAwOwogCWNyMyA9IDA7CiAKQEAgLTM3MSw4ICs1MDQsMTIgQEAKIAogCWlmIChjZmxhZyAmIFBBUkVOQikgewogCQljcjEgfD0gVVNBUlRfQ1IxX1BDRTsKLQkJaWYgKChjZmxhZyAmIENTSVpFKSA9PSBDUzgpCi0JCQljcjEgfD0gVVNBUlRfQ1IxX007CisJCWlmICgoY2ZsYWcgJiBDU0laRSkgPT0gQ1M4KSB7CisJCQlpZiAoY2ZnLT5oYXNfN2JpdHNfZGF0YSkKKwkJCQljcjEgfD0gVVNBUlRfQ1IxX00wOworCQkJZWxzZQorCQkJCWNyMSB8PSBVU0FSVF9DUjFfTTsKKwkJfQogCX0KIAogCWlmIChjZmxhZyAmIFBBUk9ERCkKQEAgLTM5NCwxNSArNTMxLDE1IEBACiAJICovCiAJaWYgKHVzYXJ0ZGl2IDwgMTYpIHsKIAkJb3ZlcnNhbXBsaW5nID0gODsKLQkJc3RtMzJfc2V0X2JpdHMocG9ydCwgVVNBUlRfQ1IxLCBVU0FSVF9DUjFfT1ZFUjgpOworCQlzdG0zMl9zZXRfYml0cyhwb3J0LCBvZnMtPmNyMSwgVVNBUlRfQ1IxX09WRVI4KTsKIAl9IGVsc2UgewogCQlvdmVyc2FtcGxpbmcgPSAxNjsKLQkJc3RtMzJfY2xyX2JpdHMocG9ydCwgVVNBUlRfQ1IxLCBVU0FSVF9DUjFfT1ZFUjgpOworCQlzdG0zMl9jbHJfYml0cyhwb3J0LCBvZnMtPmNyMSwgVVNBUlRfQ1IxX09WRVI4KTsKIAl9CiAKIAltYW50aXNzYSA9ICh1c2FydGRpdiAvIG92ZXJzYW1wbGluZykgPDwgVVNBUlRfQlJSX0RJVl9NX1NISUZUOwogCWZyYWN0aW9uID0gdXNhcnRkaXYgJSBvdmVyc2FtcGxpbmc7Ci0Jd3JpdGVsX3JlbGF4ZWQobWFudGlzc2EgfCBmcmFjdGlvbiwgcG9ydC0+bWVtYmFzZSArIFVTQVJUX0JSUik7CisJd3JpdGVsX3JlbGF4ZWQobWFudGlzc2EgfCBmcmFjdGlvbiwgcG9ydC0+bWVtYmFzZSArIG9mcy0+YnJyKTsKIAogCXVhcnRfdXBkYXRlX3RpbWVvdXQocG9ydCwgY2ZsYWcsIGJhdWQpOwogCkBAIC00MzAsOSArNTY3LDEyIEBACiAJaWYgKCh0ZXJtaW9zLT5jX2NmbGFnICYgQ1JFQUQpID09IDApCiAJCXBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBVU0FSVF9TUl9EVU1NWV9SWDsKIAotCXdyaXRlbF9yZWxheGVkKGNyMywgcG9ydC0+bWVtYmFzZSArIFVTQVJUX0NSMyk7Ci0Jd3JpdGVsX3JlbGF4ZWQoY3IyLCBwb3J0LT5tZW1iYXNlICsgVVNBUlRfQ1IyKTsKLQl3cml0ZWxfcmVsYXhlZChjcjEsIHBvcnQtPm1lbWJhc2UgKyBVU0FSVF9DUjEpOworCWlmIChzdG0zMl9wb3J0LT5yeF9jaCkKKwkJY3IzIHw9IFVTQVJUX0NSM19ETUFSOworCisJd3JpdGVsX3JlbGF4ZWQoY3IzLCBwb3J0LT5tZW1iYXNlICsgb2ZzLT5jcjMpOworCXdyaXRlbF9yZWxheGVkKGNyMiwgcG9ydC0+bWVtYmFzZSArIG9mcy0+Y3IyKTsKKwl3cml0ZWxfcmVsYXhlZChjcjEsIHBvcnQtPm1lbWJhc2UgKyBvZnMtPmNyMSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiB9CkBAIC00NjksNiArNjA5LDggQEAKIHsKIAlzdHJ1Y3Qgc3RtMzJfcG9ydCAqc3RtMzJwb3J0ID0gY29udGFpbmVyX29mKHBvcnQsCiAJCQlzdHJ1Y3Qgc3RtMzJfcG9ydCwgcG9ydCk7CisJc3RydWN0IHN0bTMyX3VzYXJ0X29mZnNldHMgKm9mcyA9ICZzdG0zMnBvcnQtPmluZm8tPm9mczsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfY29uZmlnICpjZmcgPSAmc3RtMzJwb3J0LT5pbmZvLT5jZmc7CiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CiAKIAlzd2l0Y2ggKHN0YXRlKSB7CkBAIC00NzcsNyArNjE5LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBVQVJUX1BNX1NUQVRFX09GRjoKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJc3RtMzJfY2xyX2JpdHMocG9ydCwgVVNBUlRfQ1IxLCBVU0FSVF9DUjFfVUUpOworCQlzdG0zMl9jbHJfYml0cyhwb3J0LCBvZnMtPmNyMSwgQklUKGNmZy0+dWFydF9lbmFibGVfYml0KSk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIAkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHN0bTMycG9ydC0+Y2xrKTsKIAkJYnJlYWs7CkBAIC01MzksOCArNjgxLDYgQEAKIAlpZiAoIXN0bTMycG9ydC0+cG9ydC51YXJ0Y2xrKQogCQlyZXQgPSAtRUlOVkFMOwogCi0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHN0bTMycG9ydC0+Y2xrKTsKLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTU2MCwzMCArNzAwLDE2MiBAQAogCQlyZXR1cm4gTlVMTDsKIAogCXN0bTMyX3BvcnRzW2lkXS5od19mbG93X2NvbnRyb2wgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsCi0JCQkJCQkJImF1dG8tZmxvdy1jb250cm9sIik7CisJCQkJCQkJInN0LGh3LWZsb3ctY3RybCIpOwogCXN0bTMyX3BvcnRzW2lkXS5wb3J0LmxpbmUgPSBpZDsKIAlyZXR1cm4gJnN0bTMyX3BvcnRzW2lkXTsKIH0KIAogI2lmZGVmIENPTkZJR19PRgogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3RtMzJfbWF0Y2hbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInN0LHN0bTMyLXVzYXJ0IiwgfSwKLQl7IC5jb21wYXRpYmxlID0gInN0LHN0bTMyLXVhcnQiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RtMzItdXNhcnQiLCAuZGF0YSA9ICZzdG0zMmY0X2luZm99LAorCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RtMzItdWFydCIsIC5kYXRhID0gJnN0bTMyZjRfaW5mb30sCisJeyAuY29tcGF0aWJsZSA9ICJzdCxzdG0zMmY3LXVzYXJ0IiwgLmRhdGEgPSAmc3RtMzJmN19pbmZvfSwKKwl7IC5jb21wYXRpYmxlID0gInN0LHN0bTMyZjctdWFydCIsIC5kYXRhID0gJnN0bTMyZjdfaW5mb30sCiAJe30sCiB9OwogCiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzdG0zMl9tYXRjaCk7CiAjZW5kaWYKIAorc3RhdGljIGludCBzdG0zMl9vZl9kbWFfcnhfcHJvYmUoc3RydWN0IHN0bTMyX3BvcnQgKnN0bTMycG9ydCwKKwkJCQkgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfb2Zmc2V0cyAqb2ZzID0gJnN0bTMycG9ydC0+aW5mby0+b2ZzOworCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSAmc3RtMzJwb3J0LT5wb3J0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgY29uZmlnOworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVzYyA9IE5VTEw7CisJZG1hX2Nvb2tpZV90IGNvb2tpZTsKKwlpbnQgcmV0OworCisJLyogUmVxdWVzdCBETUEgUlggY2hhbm5lbCAqLworCXN0bTMycG9ydC0+cnhfY2ggPSBkbWFfcmVxdWVzdF9zbGF2ZV9jaGFubmVsKGRldiwgInJ4Iik7CisJaWYgKCFzdG0zMnBvcnQtPnJ4X2NoKSB7CisJCWRldl9pbmZvKGRldiwgInJ4IGRtYSBhbGxvYyBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJc3RtMzJwb3J0LT5yeF9idWYgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBkZXYtPmRldiwgUlhfQlVGX0wsCisJCQkJCQkgJnN0bTMycG9ydC0+cnhfZG1hX2J1ZiwKKwkJCQkJCSBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0bTMycG9ydC0+cnhfYnVmKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gYWxsb2NfZXJyOworCX0KKworCS8qIENvbmZpZ3VyZSBETUEgY2hhbm5lbCAqLworCW1lbXNldCgmY29uZmlnLCAwLCBzaXplb2YoY29uZmlnKSk7CisJY29uZmlnLnNyY19hZGRyID0gcG9ydC0+bWFwYmFzZSArIG9mcy0+cmRyOworCWNvbmZpZy5zcmNfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF8xX0JZVEU7CisKKwlyZXQgPSBkbWFlbmdpbmVfc2xhdmVfY29uZmlnKHN0bTMycG9ydC0+cnhfY2gsICZjb25maWcpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAicnggZG1hIGNoYW5uZWwgY29uZmlnIGZhaWxlZFxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gY29uZmlnX2VycjsKKwl9CisKKwkvKiBQcmVwYXJlIGEgRE1BIGN5Y2xpYyB0cmFuc2FjdGlvbiAqLworCWRlc2MgPSBkbWFlbmdpbmVfcHJlcF9kbWFfY3ljbGljKHN0bTMycG9ydC0+cnhfY2gsCisJCQkJCSBzdG0zMnBvcnQtPnJ4X2RtYV9idWYsCisJCQkJCSBSWF9CVUZfTCwgUlhfQlVGX1AsIERNQV9ERVZfVE9fTUVNLAorCQkJCQkgRE1BX1BSRVBfSU5URVJSVVBUKTsKKwlpZiAoIWRlc2MpIHsKKwkJZGV2X2VycihkZXYsICJyeCBkbWEgcHJlcCBjeWNsaWMgZmFpbGVkXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBjb25maWdfZXJyOworCX0KKworCS8qIE5vIGNhbGxiYWNrIGFzIGRtYSBidWZmZXIgaXMgZHJhaW5lZCBvbiB1c2FydCBpbnRlcnJ1cHQgKi8KKwlkZXNjLT5jYWxsYmFjayA9IE5VTEw7CisJZGVzYy0+Y2FsbGJhY2tfcGFyYW0gPSBOVUxMOworCisJLyogUHVzaCBjdXJyZW50IERNQSB0cmFuc2FjdGlvbiBpbiB0aGUgcGVuZGluZyBxdWV1ZSAqLworCWNvb2tpZSA9IGRtYWVuZ2luZV9zdWJtaXQoZGVzYyk7CisKKwkvKiBJc3N1ZSBwZW5kaW5nIERNQSByZXF1ZXN0cyAqLworCWRtYV9hc3luY19pc3N1ZV9wZW5kaW5nKHN0bTMycG9ydC0+cnhfY2gpOworCisJcmV0dXJuIDA7CisKK2NvbmZpZ19lcnI6CisJZG1hX2ZyZWVfY29oZXJlbnQoJnBkZXYtPmRldiwKKwkJCSAgUlhfQlVGX0wsIHN0bTMycG9ydC0+cnhfYnVmLAorCQkJICBzdG0zMnBvcnQtPnJ4X2RtYV9idWYpOworCithbGxvY19lcnI6CisJZG1hX3JlbGVhc2VfY2hhbm5lbChzdG0zMnBvcnQtPnJ4X2NoKTsKKwlzdG0zMnBvcnQtPnJ4X2NoID0gTlVMTDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3RtMzJfb2ZfZG1hX3R4X3Byb2JlKHN0cnVjdCBzdG0zMl9wb3J0ICpzdG0zMnBvcnQsCisJCQkJIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHN0bTMyX3VzYXJ0X29mZnNldHMgKm9mcyA9ICZzdG0zMnBvcnQtPmluZm8tPm9mczsKKwlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gJnN0bTMycG9ydC0+cG9ydDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnIGNvbmZpZzsKKwlpbnQgcmV0OworCisJc3RtMzJwb3J0LT50eF9kbWFfYnVzeSA9IGZhbHNlOworCisJLyogUmVxdWVzdCBETUEgVFggY2hhbm5lbCAqLworCXN0bTMycG9ydC0+dHhfY2ggPSBkbWFfcmVxdWVzdF9zbGF2ZV9jaGFubmVsKGRldiwgInR4Iik7CisJaWYgKCFzdG0zMnBvcnQtPnR4X2NoKSB7CisJCWRldl9pbmZvKGRldiwgInR4IGRtYSBhbGxvYyBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJc3RtMzJwb3J0LT50eF9idWYgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBkZXYtPmRldiwgVFhfQlVGX0wsCisJCQkJCQkgJnN0bTMycG9ydC0+dHhfZG1hX2J1ZiwKKwkJCQkJCSBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0bTMycG9ydC0+dHhfYnVmKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gYWxsb2NfZXJyOworCX0KKworCS8qIENvbmZpZ3VyZSBETUEgY2hhbm5lbCAqLworCW1lbXNldCgmY29uZmlnLCAwLCBzaXplb2YoY29uZmlnKSk7CisJY29uZmlnLmRzdF9hZGRyID0gcG9ydC0+bWFwYmFzZSArIG9mcy0+dGRyOworCWNvbmZpZy5kc3RfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF8xX0JZVEU7CisKKwlyZXQgPSBkbWFlbmdpbmVfc2xhdmVfY29uZmlnKHN0bTMycG9ydC0+dHhfY2gsICZjb25maWcpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAidHggZG1hIGNoYW5uZWwgY29uZmlnIGZhaWxlZFxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gY29uZmlnX2VycjsKKwl9CisKKwlyZXR1cm4gMDsKKworY29uZmlnX2VycjoKKwlkbWFfZnJlZV9jb2hlcmVudCgmcGRldi0+ZGV2LAorCQkJICBUWF9CVUZfTCwgc3RtMzJwb3J0LT50eF9idWYsCisJCQkgIHN0bTMycG9ydC0+dHhfZG1hX2J1Zik7CisKK2FsbG9jX2VycjoKKwlkbWFfcmVsZWFzZV9jaGFubmVsKHN0bTMycG9ydC0+dHhfY2gpOworCXN0bTMycG9ydC0+dHhfY2ggPSBOVUxMOworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBzdG0zMl9zZXJpYWxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlpbnQgcmV0OworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwogCXN0cnVjdCBzdG0zMl9wb3J0ICpzdG0zMnBvcnQ7CisJaW50IHJldDsKIAogCXN0bTMycG9ydCA9IHN0bTMyX29mX2dldF9zdG0zMl9wb3J0KHBkZXYpOwogCWlmICghc3RtMzJwb3J0KQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKHN0bTMyX21hdGNoLCAmcGRldi0+ZGV2KTsKKwlpZiAobWF0Y2ggJiYgbWF0Y2gtPmRhdGEpCisJCXN0bTMycG9ydC0+aW5mbyA9IChzdHJ1Y3Qgc3RtMzJfdXNhcnRfaW5mbyAqKW1hdGNoLT5kYXRhOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlyZXQgPSBzdG0zMl9pbml0X3BvcnQoc3RtMzJwb3J0LCBwZGV2KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtNTkyLDYgKzg2NCwxNCBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKKwlyZXQgPSBzdG0zMl9vZl9kbWFfcnhfcHJvYmUoc3RtMzJwb3J0LCBwZGV2KTsKKwlpZiAocmV0KQorCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiaW50ZXJydXB0IG1vZGUgdXNlZCBmb3IgcnggKG5vIGRtYSlcbiIpOworCisJcmV0ID0gc3RtMzJfb2ZfZG1hX3R4X3Byb2JlKHN0bTMycG9ydCwgcGRldik7CisJaWYgKHJldCkKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgImludGVycnVwdCBtb2RlIHVzZWQgZm9yIHR4IChubyBkbWEpXG4iKTsKKwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsICZzdG0zMnBvcnQtPnBvcnQpOwogCiAJcmV0dXJuIDA7CkBAIC02MDAsNiArODgwLDMwIEBACiBzdGF0aWMgaW50IHN0bTMyX3NlcmlhbF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHN0bTMyX3BvcnQgKnN0bTMyX3BvcnQgPSB0b19zdG0zMl9wb3J0KHBvcnQpOworCXN0cnVjdCBzdG0zMl91c2FydF9vZmZzZXRzICpvZnMgPSAmc3RtMzJfcG9ydC0+aW5mby0+b2ZzOworCisJc3RtMzJfY2xyX2JpdHMocG9ydCwgb2ZzLT5jcjMsIFVTQVJUX0NSM19ETUFSKTsKKworCWlmIChzdG0zMl9wb3J0LT5yeF9jaCkKKwkJZG1hX3JlbGVhc2VfY2hhbm5lbChzdG0zMl9wb3J0LT5yeF9jaCk7CisKKwlpZiAoc3RtMzJfcG9ydC0+cnhfZG1hX2J1ZikKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJnBkZXYtPmRldiwKKwkJCQkgIFJYX0JVRl9MLCBzdG0zMl9wb3J0LT5yeF9idWYsCisJCQkJICBzdG0zMl9wb3J0LT5yeF9kbWFfYnVmKTsKKworCXN0bTMyX2Nscl9iaXRzKHBvcnQsIG9mcy0+Y3IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKwlpZiAoc3RtMzJfcG9ydC0+dHhfY2gpCisJCWRtYV9yZWxlYXNlX2NoYW5uZWwoc3RtMzJfcG9ydC0+dHhfY2gpOworCisJaWYgKHN0bTMyX3BvcnQtPnR4X2RtYV9idWYpCisJCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2LT5kZXYsCisJCQkJICBUWF9CVUZfTCwgc3RtMzJfcG9ydC0+dHhfYnVmLAorCQkJCSAgc3RtMzJfcG9ydC0+dHhfZG1hX2J1Zik7CisKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoc3RtMzJfcG9ydC0+Y2xrKTsKIAogCXJldHVybiB1YXJ0X3JlbW92ZV9vbmVfcG9ydCgmc3RtMzJfdXNhcnRfZHJpdmVyLCBwb3J0KTsKIH0KQEAgLTYwOCwxNSArOTEyLDIxIEBACiAjaWZkZWYgQ09ORklHX1NFUklBTF9TVE0zMl9DT05TT0xFCiBzdGF0aWMgdm9pZCBzdG0zMl9jb25zb2xlX3B1dGNoYXIoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgaW50IGNoKQogewotCXdoaWxlICghKHJlYWRsX3JlbGF4ZWQocG9ydC0+bWVtYmFzZSArIFVTQVJUX1NSKSAmIFVTQVJUX1NSX1RYRSkpCisJc3RydWN0IHN0bTMyX3BvcnQgKnN0bTMyX3BvcnQgPSB0b19zdG0zMl9wb3J0KHBvcnQpOworCXN0cnVjdCBzdG0zMl91c2FydF9vZmZzZXRzICpvZnMgPSAmc3RtMzJfcG9ydC0+aW5mby0+b2ZzOworCisJd2hpbGUgKCEocmVhZGxfcmVsYXhlZChwb3J0LT5tZW1iYXNlICsgb2ZzLT5pc3IpICYgVVNBUlRfU1JfVFhFKSkKIAkJY3B1X3JlbGF4KCk7CiAKLQl3cml0ZWxfcmVsYXhlZChjaCwgcG9ydC0+bWVtYmFzZSArIFVTQVJUX0RSKTsKKwl3cml0ZWxfcmVsYXhlZChjaCwgcG9ydC0+bWVtYmFzZSArIG9mcy0+dGRyKTsKIH0KIAogc3RhdGljIHZvaWQgc3RtMzJfY29uc29sZV93cml0ZShzdHJ1Y3QgY29uc29sZSAqY28sIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGNudCkKIHsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gJnN0bTMyX3BvcnRzW2NvLT5pbmRleF0ucG9ydDsKKwlzdHJ1Y3Qgc3RtMzJfcG9ydCAqc3RtMzJfcG9ydCA9IHRvX3N0bTMyX3BvcnQocG9ydCk7CisJc3RydWN0IHN0bTMyX3VzYXJ0X29mZnNldHMgKm9mcyA9ICZzdG0zMl9wb3J0LT5pbmZvLT5vZnM7CisJc3RydWN0IHN0bTMyX3VzYXJ0X2NvbmZpZyAqY2ZnID0gJnN0bTMyX3BvcnQtPmluZm8tPmNmZzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiBvbGRfY3IxLCBuZXdfY3IxOwogCWludCBsb2NrZWQgPSAxOwpAQCAtNjI5LDE1ICs5MzksMTYgQEAKIAllbHNlCiAJCXNwaW5fbG9jaygmcG9ydC0+bG9jayk7CiAKLQkvKiBTYXZlIGFuZCBkaXNhYmxlIGludGVycnVwdHMgKi8KLQlvbGRfY3IxID0gcmVhZGxfcmVsYXhlZChwb3J0LT5tZW1iYXNlICsgVVNBUlRfQ1IxKTsKKwkvKiBTYXZlIGFuZCBkaXNhYmxlIGludGVycnVwdHMsIGVuYWJsZSB0aGUgdHJhbnNtaXR0ZXIgKi8KKwlvbGRfY3IxID0gcmVhZGxfcmVsYXhlZChwb3J0LT5tZW1iYXNlICsgb2ZzLT5jcjEpOwogCW5ld19jcjEgPSBvbGRfY3IxICYgflVTQVJUX0NSMV9JRV9NQVNLOwotCXdyaXRlbF9yZWxheGVkKG5ld19jcjEsIHBvcnQtPm1lbWJhc2UgKyBVU0FSVF9DUjEpOworCW5ld19jcjEgfD0gIFVTQVJUX0NSMV9URSB8IEJJVChjZmctPnVhcnRfZW5hYmxlX2JpdCk7CisJd3JpdGVsX3JlbGF4ZWQobmV3X2NyMSwgcG9ydC0+bWVtYmFzZSArIG9mcy0+Y3IxKTsKIAogCXVhcnRfY29uc29sZV93cml0ZShwb3J0LCBzLCBjbnQsIHN0bTMyX2NvbnNvbGVfcHV0Y2hhcik7CiAKIAkvKiBSZXN0b3JlIGludGVycnVwdCBzdGF0ZSAqLwotCXdyaXRlbF9yZWxheGVkKG9sZF9jcjEsIHBvcnQtPm1lbWJhc2UgKyBVU0FSVF9DUjEpOworCXdyaXRlbF9yZWxheGVkKG9sZF9jcjEsIHBvcnQtPm1lbWJhc2UgKyBvZnMtPmNyMSk7CiAKIAlpZiAobG9ja2VkKQogCQlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvc3RtMzItdXNhcnQuaCBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zdG0zMi11c2FydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZDk3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc3RtMzItdXNhcnQuaApAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgTWF4aW1lIENvcXVlbGluIDIwMTUKKyAqIEF1dGhvcnM6ICBNYXhpbWUgQ29xdWVsaW4gPG1jb3F1ZWxpbi5zdG0zMkBnbWFpbC5jb20+CisgKgkgICAgIEdlcmFsZCBCYWV6YSA8Z2VyYWxkX2JhZXphQHlhaG9vLmZyPgorICogTGljZW5zZSB0ZXJtczogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCB2ZXJzaW9uIDIKKyAqLworCisjZGVmaW5lIERSSVZFUl9OQU1FICJzdG0zMi11c2FydCIKKworc3RydWN0IHN0bTMyX3VzYXJ0X29mZnNldHMgeworCXU4IGNyMTsKKwl1OCBjcjI7CisJdTggY3IzOworCXU4IGJycjsKKwl1OCBndHByOworCXU4IHJ0b3I7CisJdTggcnFyOworCXU4IGlzcjsKKwl1OCBpY3I7CisJdTggcmRyOworCXU4IHRkcjsKK307CisKK3N0cnVjdCBzdG0zMl91c2FydF9jb25maWcgeworCXU4IHVhcnRfZW5hYmxlX2JpdDsgLyogVVNBUlRfQ1IxX1VFICovCisJYm9vbCBoYXNfN2JpdHNfZGF0YTsKK307CisKK3N0cnVjdCBzdG0zMl91c2FydF9pbmZvIHsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfb2Zmc2V0cyBvZnM7CisJc3RydWN0IHN0bTMyX3VzYXJ0X2NvbmZpZyBjZmc7Cit9OworCisjZGVmaW5lIFVOREVGX1JFRyB+MAorCisvKiBSZWdpc3RlciBvZmZzZXRzICovCitzdHJ1Y3Qgc3RtMzJfdXNhcnRfaW5mbyBzdG0zMmY0X2luZm8gPSB7CisJLm9mcyA9IHsKKwkJLmlzcgk9IDB4MDAsCisJCS5yZHIJPSAweDA0LAorCQkudGRyCT0gMHgwNCwKKwkJLmJycgk9IDB4MDgsCisJCS5jcjEJPSAweDBjLAorCQkuY3IyCT0gMHgxMCwKKwkJLmNyMwk9IDB4MTQsCisJCS5ndHByCT0gMHgxOCwKKwkJLnJ0b3IJPSBVTkRFRl9SRUcsCisJCS5ycXIJPSBVTkRFRl9SRUcsCisJCS5pY3IJPSBVTkRFRl9SRUcsCisJfSwKKwkuY2ZnID0geworCQkudWFydF9lbmFibGVfYml0ID0gMTMsCisJCS5oYXNfN2JpdHNfZGF0YSA9IGZhbHNlLAorCX0KK307CisKK3N0cnVjdCBzdG0zMl91c2FydF9pbmZvIHN0bTMyZjdfaW5mbyA9IHsKKwkub2ZzID0geworCQkuY3IxCT0gMHgwMCwKKwkJLmNyMgk9IDB4MDQsCisJCS5jcjMJPSAweDA4LAorCQkuYnJyCT0gMHgwYywKKwkJLmd0cHIJPSAweDEwLAorCQkucnRvcgk9IDB4MTQsCisJCS5ycXIJPSAweDE4LAorCQkuaXNyCT0gMHgxYywKKwkJLmljcgk9IDB4MjAsCisJCS5yZHIJPSAweDI0LAorCQkudGRyCT0gMHgyOCwKKwl9LAorCS5jZmcgPSB7CisJCS51YXJ0X2VuYWJsZV9iaXQgPSAwLAorCQkuaGFzXzdiaXRzX2RhdGEgPSB0cnVlLAorCX0KK307CisKKy8qIFVTQVJUX1NSIChGNCkgLyBVU0FSVF9JU1IgKEY3KSAqLworI2RlZmluZSBVU0FSVF9TUl9QRQkJQklUKDApCisjZGVmaW5lIFVTQVJUX1NSX0ZFCQlCSVQoMSkKKyNkZWZpbmUgVVNBUlRfU1JfTkYJCUJJVCgyKQorI2RlZmluZSBVU0FSVF9TUl9PUkUJCUJJVCgzKQorI2RlZmluZSBVU0FSVF9TUl9JRExFCQlCSVQoNCkKKyNkZWZpbmUgVVNBUlRfU1JfUlhORQkJQklUKDUpCisjZGVmaW5lIFVTQVJUX1NSX1RDCQlCSVQoNikKKyNkZWZpbmUgVVNBUlRfU1JfVFhFCQlCSVQoNykKKyNkZWZpbmUgVVNBUlRfU1JfTEJECQlCSVQoOCkKKyNkZWZpbmUgVVNBUlRfU1JfQ1RTSUYJCUJJVCg5KQorI2RlZmluZSBVU0FSVF9TUl9DVFMJCUJJVCgxMCkJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX1NSX1JUT0YJCUJJVCgxMSkJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX1NSX0VPQkYJCUJJVCgxMikJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX1NSX0FCUkUJCUJJVCgxNCkJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX1NSX0FCUkYJCUJJVCgxNSkJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX1NSX0JVU1kJCUJJVCgxNikJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX1NSX0NNRgkJQklUKDE3KQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfU1JfU0JLRgkJQklUKDE4KQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfU1JfVEVBQ0sJCUJJVCgyMSkJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX1NSX0VSUl9NQVNLCShVU0FSVF9TUl9MQkQgfCBVU0FSVF9TUl9PUkUgfCBcCisJCQkJIFVTQVJUX1NSX0ZFIHwgVVNBUlRfU1JfUEUpCisvKiBEdW1teSBiaXRzICovCisjZGVmaW5lIFVTQVJUX1NSX0RVTU1ZX1JYCUJJVCgxNikKKworLyogVVNBUlRfSUNSIChGNykgKi8KKyNkZWZpbmUgVVNBUlRfQ1JfVEMJCUJJVCg2KQorCisvKiBVU0FSVF9EUiAqLworI2RlZmluZSBVU0FSVF9EUl9NQVNLCQlHRU5NQVNLKDgsIDApCisKKy8qIFVTQVJUX0JSUiAqLworI2RlZmluZSBVU0FSVF9CUlJfRElWX0ZfTUFTSwlHRU5NQVNLKDMsIDApCisjZGVmaW5lIFVTQVJUX0JSUl9ESVZfTV9NQVNLCUdFTk1BU0soMTUsIDQpCisjZGVmaW5lIFVTQVJUX0JSUl9ESVZfTV9TSElGVAk0CisKKy8qIFVTQVJUX0NSMSAqLworI2RlZmluZSBVU0FSVF9DUjFfU0JLCQlCSVQoMCkKKyNkZWZpbmUgVVNBUlRfQ1IxX1JXVQkJQklUKDEpCQkvKiBGNCAqLworI2RlZmluZSBVU0FSVF9DUjFfUkUJCUJJVCgyKQorI2RlZmluZSBVU0FSVF9DUjFfVEUJCUJJVCgzKQorI2RlZmluZSBVU0FSVF9DUjFfSURMRUlFCUJJVCg0KQorI2RlZmluZSBVU0FSVF9DUjFfUlhORUlFCUJJVCg1KQorI2RlZmluZSBVU0FSVF9DUjFfVENJRQkJQklUKDYpCisjZGVmaW5lIFVTQVJUX0NSMV9UWEVJRQkJQklUKDcpCisjZGVmaW5lIFVTQVJUX0NSMV9QRUlFCQlCSVQoOCkKKyNkZWZpbmUgVVNBUlRfQ1IxX1BTCQlCSVQoOSkKKyNkZWZpbmUgVVNBUlRfQ1IxX1BDRQkJQklUKDEwKQorI2RlZmluZSBVU0FSVF9DUjFfV0FLRQkJQklUKDExKQorI2RlZmluZSBVU0FSVF9DUjFfTQkJQklUKDEyKQorI2RlZmluZSBVU0FSVF9DUjFfTTAJCUJJVCgxMikJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0NSMV9NTUUJCUJJVCgxMykJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0NSMV9DTUlFCQlCSVQoMTQpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9DUjFfT1ZFUjgJCUJJVCgxNSkKKyNkZWZpbmUgVVNBUlRfQ1IxX0RFRFRfTUFTSwlHRU5NQVNLKDIwLCAxNikJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfQ1IxX0RFQVRfTUFTSwlHRU5NQVNLKDI1LCAyMSkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfQ1IxX1JUT0lFCQlCSVQoMjYpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9DUjFfRU9CSUUJCUJJVCgyNykJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0NSMV9NMQkJQklUKDI4KQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfQ1IxX0lFX01BU0sJKEdFTk1BU0soOCwgNCkgfCBCSVQoMTQpIHwgQklUKDI2KSB8IEJJVCgyNykpCisKKy8qIFVTQVJUX0NSMiAqLworI2RlZmluZSBVU0FSVF9DUjJfQUREX01BU0sJR0VOTUFTSygzLCAwKQkvKiBGNCAqLworI2RlZmluZSBVU0FSVF9DUjJfQURETTcJCUJJVCg0KQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfQ1IyX0xCREwJCUJJVCg1KQorI2RlZmluZSBVU0FSVF9DUjJfTEJESUUJCUJJVCg2KQorI2RlZmluZSBVU0FSVF9DUjJfTEJDTAkJQklUKDgpCisjZGVmaW5lIFVTQVJUX0NSMl9DUEhBCQlCSVQoOSkKKyNkZWZpbmUgVVNBUlRfQ1IyX0NQT0wJCUJJVCgxMCkKKyNkZWZpbmUgVVNBUlRfQ1IyX0NMS0VOCQlCSVQoMTEpCisjZGVmaW5lIFVTQVJUX0NSMl9TVE9QXzJCCUJJVCgxMykKKyNkZWZpbmUgVVNBUlRfQ1IyX1NUT1BfTUFTSwlHRU5NQVNLKDEzLCAxMikKKyNkZWZpbmUgVVNBUlRfQ1IyX0xJTkVOCQlCSVQoMTQpCisjZGVmaW5lIFVTQVJUX0NSMl9TV0FQCQlCSVQoMTUpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9DUjJfUlhJTlYJCUJJVCgxNikJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0NSMl9UWElOVgkJQklUKDE3KQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfQ1IyX0RBVEFJTlYJQklUKDE4KQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfQ1IyX01TQkZJUlNUCUJJVCgxOSkJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0NSMl9BQlJFTgkJQklUKDIwKQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfQ1IyX0FCUk1PRF9NQVNLCUdFTk1BU0soMjIsIDIxKQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9DUjJfUlRPRU4JCUJJVCgyMykJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0NSMl9BRERfRjdfTUFTSwlHRU5NQVNLKDMxLCAyNCkJLyogRjcgKi8KKworLyogVVNBUlRfQ1IzICovCisjZGVmaW5lIFVTQVJUX0NSM19FSUUJCUJJVCgwKQorI2RlZmluZSBVU0FSVF9DUjNfSVJFTgkJQklUKDEpCisjZGVmaW5lIFVTQVJUX0NSM19JUkxQCQlCSVQoMikKKyNkZWZpbmUgVVNBUlRfQ1IzX0hEU0VMCQlCSVQoMykKKyNkZWZpbmUgVVNBUlRfQ1IzX05BQ0sJCUJJVCg0KQorI2RlZmluZSBVU0FSVF9DUjNfU0NFTgkJQklUKDUpCisjZGVmaW5lIFVTQVJUX0NSM19ETUFSCQlCSVQoNikKKyNkZWZpbmUgVVNBUlRfQ1IzX0RNQVQJCUJJVCg3KQorI2RlZmluZSBVU0FSVF9DUjNfUlRTRQkJQklUKDgpCisjZGVmaW5lIFVTQVJUX0NSM19DVFNFCQlCSVQoOSkKKyNkZWZpbmUgVVNBUlRfQ1IzX0NUU0lFCQlCSVQoMTApCisjZGVmaW5lIFVTQVJUX0NSM19PTkVCSVQJQklUKDExKQorI2RlZmluZSBVU0FSVF9DUjNfT1ZSRElTCUJJVCgxMikJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0NSM19ERFJFCQlCSVQoMTMpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9DUjNfREVNCQlCSVQoMTQpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9DUjNfREVQCQlCSVQoMTUpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9DUjNfU0NBUkNOVF9NQVNLCUdFTk1BU0soMTksIDE3KQkvKiBGNyAqLworCisvKiBVU0FSVF9HVFBSICovCisjZGVmaW5lIFVTQVJUX0dUUFJfUFNDX01BU0sJR0VOTUFTSyg3LCAwKQorI2RlZmluZSBVU0FSVF9HVFBSX0dUX01BU0sJR0VOTUFTSygxNSwgOCkKKworLyogVVNBUlRfUlRPUiAqLworI2RlZmluZSBVU0FSVF9SVE9SX1JUT19NQVNLCUdFTk1BU0soMjMsIDApCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX1JUT1JfQkxFTl9NQVNLCUdFTk1BU0soMzEsIDI0KQkvKiBGNyAqLworCisvKiBVU0FSVF9SUVIgKi8KKyNkZWZpbmUgVVNBUlRfUlFSX0FCUlJRCQlCSVQoMCkJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX1JRUl9TQktSUQkJQklUKDEpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9SUVJfTU1SUQkJQklUKDIpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9SUVJfUlhGUlEJCUJJVCgzKQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfUlFSX1RYRlJRCQlCSVQoNCkJCS8qIEY3ICovCisKKy8qIFVTQVJUX0lDUiAqLworI2RlZmluZSBVU0FSVF9JQ1JfUEVDRgkJQklUKDApCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9JQ1JfRkZFQ0YJCUJJVCgxKQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfSUNSX05DRgkJQklUKDIpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9JQ1JfT1JFQ0YJCUJJVCgzKQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfSUNSX0lETEVDRglCSVQoNCkJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0lDUl9UQ0NGCQlCSVQoNikJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0lDUl9MQkRDRgkJQklUKDgpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9JQ1JfQ1RTQ0YJCUJJVCg5KQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfSUNSX1JUT0NGCQlCSVQoMTEpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9JQ1JfRU9CQ0YJCUJJVCgxMikJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0lDUl9DTUNGCQlCSVQoMTcpCQkvKiBGNyAqLworCisjZGVmaW5lIFNUTTMyX1NFUklBTF9OQU1FICJ0dHlTIgorI2RlZmluZSBTVE0zMl9NQVhfUE9SVFMgNgorCisjZGVmaW5lIFJYX0JVRl9MIDIwMAkJIC8qIGRtYSByeCBidWZmZXIgbGVuZ3RoICAgICAqLworI2RlZmluZSBSWF9CVUZfUCBSWF9CVUZfTAkgLyogZG1hIHJ4IGJ1ZmZlciBwZXJpb2QgICAgICovCisjZGVmaW5lIFRYX0JVRl9MIDIwMAkJIC8qIGRtYSB0eCBidWZmZXIgbGVuZ3RoICAgICAqLworCitzdHJ1Y3Qgc3RtMzJfcG9ydCB7CisJc3RydWN0IHVhcnRfcG9ydCBwb3J0OworCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgZG1hX2NoYW4gKnJ4X2NoOyAgLyogZG1hIHJ4IGNoYW5uZWwgICAgICAgICAgICAqLworCWRtYV9hZGRyX3QgcnhfZG1hX2J1ZjsgICAvKiBkbWEgcnggYnVmZmVyIGJ1cyBhZGRyZXNzICovCisJdW5zaWduZWQgY2hhciAqcnhfYnVmOyAgIC8qIGRtYSByeCBidWZmZXIgY3B1IGFkZHJlc3MgKi8KKwlzdHJ1Y3QgZG1hX2NoYW4gKnR4X2NoOyAgLyogZG1hIHR4IGNoYW5uZWwgICAgICAgICAgICAqLworCWRtYV9hZGRyX3QgdHhfZG1hX2J1ZjsgICAvKiBkbWEgdHggYnVmZmVyIGJ1cyBhZGRyZXNzICovCisJdW5zaWduZWQgY2hhciAqdHhfYnVmOyAgIC8qIGRtYSB0eCBidWZmZXIgY3B1IGFkZHJlc3MgKi8KKwlib29sIHR4X2RtYV9idXN5OwkgLyogZG1hIHR4IGJ1c3kgICAgICAgICAgICAgICAqLworCWJvb2wgaHdfZmxvd19jb250cm9sOworfTsKKworc3RhdGljIHN0cnVjdCBzdG0zMl9wb3J0IHN0bTMyX3BvcnRzW1NUTTMyX01BWF9QT1JUU107CitzdGF0aWMgc3RydWN0IHVhcnRfZHJpdmVyIHN0bTMyX3VzYXJ0X2RyaXZlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC90aW1idWFydC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3RpbWJ1YXJ0LmMKaW5kZXggNTEyYzE2Mi4uNWRhN2ZlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3RpbWJ1YXJ0LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3RpbWJ1YXJ0LmMKQEAgLTM5NCw3ICszOTQsNyBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgc3RydWN0IHVhcnRfb3BzIHRpbWJ1YXJ0X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWFydF9vcHMgdGltYnVhcnRfb3BzID0gewogCS50eF9lbXB0eSA9IHRpbWJ1YXJ0X3R4X2VtcHR5LAogCS5zZXRfbWN0cmwgPSB0aW1idWFydF9zZXRfbWN0cmwsCiAJLmdldF9tY3RybCA9IHRpbWJ1YXJ0X2dldF9tY3RybCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC91YXJ0bGl0ZS5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3VhcnRsaXRlLmMKaW5kZXggMDUwODliNi4uODE3YmIwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3VhcnRsaXRlLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3VhcnRsaXRlLmMKQEAgLTM4Nyw3ICszODcsNyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3QgdWFydF9vcHMgdWxpdGVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB1YXJ0X29wcyB1bGl0ZV9vcHMgPSB7CiAJLnR4X2VtcHR5CT0gdWxpdGVfdHhfZW1wdHksCiAJLnNldF9tY3RybAk9IHVsaXRlX3NldF9tY3RybCwKIAkuZ2V0X21jdHJsCT0gdWxpdGVfZ2V0X21jdHJsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3Z0ODUwMF9zZXJpYWwuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC92dDg1MDBfc2VyaWFsLmMKaW5kZXggMjNjZmM1ZS4uNmI4NWFkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3Z0ODUwMF9zZXJpYWwuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvdnQ4NTAwX3NlcmlhbC5jCkBAIC0xMTgsNyArMTE4LDcgQEAKICAqIGhhdmUgYmVlbiBhbGxvY2F0ZWQgYXMgd2UgY2FuJ3QgdXNlIHBkZXYtPmlkIGluCiAgKiBkZXZpY2V0cmVlCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHZ0ODUwMF9wb3J0c19pbl91c2U7CitzdGF0aWMgREVDTEFSRV9CSVRNQVAodnQ4NTAwX3BvcnRzX2luX3VzZSwgVlQ4NTAwX01BWF9QT1JUUyk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB2dDg1MDBfd3JpdGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHZhbCwKIAkJCSAgICAgdW5zaWduZWQgaW50IG9mZikKQEAgLTY2MywxNSArNjYzLDE1IEBACiAKIAlpZiAocG9ydCA8IDApIHsKIAkJLyogY2FsY3VsYXRlIHRoZSBwb3J0IGlkICovCi0JCXBvcnQgPSBmaW5kX2ZpcnN0X3plcm9fYml0KCZ2dDg1MDBfcG9ydHNfaW5fdXNlLAotCQkJCQlzaXplb2YodnQ4NTAwX3BvcnRzX2luX3VzZSkpOworCQlwb3J0ID0gZmluZF9maXJzdF96ZXJvX2JpdCh2dDg1MDBfcG9ydHNfaW5fdXNlLAorCQkJCQkgICBWVDg1MDBfTUFYX1BPUlRTKTsKIAl9CiAKIAlpZiAocG9ydCA+PSBWVDg1MDBfTUFYX1BPUlRTKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIHJlc2VydmUgdGhlIHBvcnQgaWQgKi8KLQlpZiAodGVzdF9hbmRfc2V0X2JpdChwb3J0LCAmdnQ4NTAwX3BvcnRzX2luX3VzZSkpIHsKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChwb3J0LCB2dDg1MDBfcG9ydHNfaW5fdXNlKSkgewogCQkvKiBwb3J0IGFscmVhZHkgaW4gdXNlIC0gc2hvdWxkbid0IHJlYWxseSBoYXBwZW4gKi8KIAkJcmV0dXJuIC1FQlVTWTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwveGlsaW54X3VhcnRwcy5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3hpbGlueF91YXJ0cHMuYwppbmRleCA5Y2ExYTRkLi5mMzdlZGFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwveGlsaW54X3VhcnRwcy5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC94aWxpbnhfdWFydHBzLmMKQEAgLTU3LDcgKzU3LDcgQEAKICNkZWZpbmUgQ0ROU19VQVJUX0lNUgkJMHgxMCAgLyogSW50ZXJydXB0IE1hc2sgKi8KICNkZWZpbmUgQ0ROU19VQVJUX0lTUgkJMHgxNCAgLyogSW50ZXJydXB0IFN0YXR1cyAqLwogI2RlZmluZSBDRE5TX1VBUlRfQkFVREdFTgkweDE4ICAvKiBCYXVkIFJhdGUgR2VuZXJhdG9yICovCi0jZGVmaW5lIENETlNfVUFSVF9SWFRPVVQJCTB4MUMgIC8qIFJYIFRpbWVvdXQgKi8KKyNkZWZpbmUgQ0ROU19VQVJUX1JYVE9VVAkweDFDICAvKiBSWCBUaW1lb3V0ICovCiAjZGVmaW5lIENETlNfVUFSVF9SWFdNCQkweDIwICAvKiBSWCBGSUZPIFRyaWdnZXIgTGV2ZWwgKi8KICNkZWZpbmUgQ0ROU19VQVJUX01PREVNQ1IJMHgyNCAgLyogTW9kZW0gQ29udHJvbCAqLwogI2RlZmluZSBDRE5TX1VBUlRfTU9ERU1TUgkweDI4ICAvKiBNb2RlbSBTdGF0dXMgKi8KQEAgLTY4LDYgKzY4LDcgQEAKICNkZWZpbmUgQ0ROU19VQVJUX0lSUlhfUFdJRFRICTB4M0MgIC8qIElSIE1pbiBSZWNlaXZlZCBQdWxzZSBXaWR0aCAqLwogI2RlZmluZSBDRE5TX1VBUlRfSVJUWF9QV0lEVEgJMHg0MCAgLyogSVIgVHJhbnNtaXR0ZWQgcHVsc2UgV2lkdGggKi8KICNkZWZpbmUgQ0ROU19VQVJUX1RYV00JCTB4NDQgIC8qIFRYIEZJRk8gVHJpZ2dlciBMZXZlbCAqLworI2RlZmluZSBDRE5TX1VBUlRfUlhCUwkJMHg0OCAgLyogUlggRklGTyBieXRlIHN0YXR1cyByZWdpc3RlciAqLwogCiAvKiBDb250cm9sIFJlZ2lzdGVyIEJpdCBEZWZpbml0aW9ucyAqLwogI2RlZmluZSBDRE5TX1VBUlRfQ1JfU1RPUEJSSwkweDAwMDAwMTAwICAvKiBTdG9wIFRYIGJyZWFrICovCkBAIC03OSw2ICs4MCw5IEBACiAjZGVmaW5lIENETlNfVUFSVF9DUl9UWFJTVAkweDAwMDAwMDAyICAvKiBUWCBsb2dpYyByZXNldCAqLwogI2RlZmluZSBDRE5TX1VBUlRfQ1JfUlhSU1QJMHgwMDAwMDAwMSAgLyogUlggbG9naWMgcmVzZXQgKi8KICNkZWZpbmUgQ0ROU19VQVJUX0NSX1JTVF9UTwkweDAwMDAwMDQwICAvKiBSZXN0YXJ0IFRpbWVvdXQgQ291bnRlciAqLworI2RlZmluZSBDRE5TX1VBUlRfUlhCU19QQVJJVFkgICAgMHgwMDAwMDAwMSAvKiBQYXJpdHkgZXJyb3Igc3RhdHVzICovCisjZGVmaW5lIENETlNfVUFSVF9SWEJTX0ZSQU1JTkcgICAweDAwMDAwMDAyIC8qIEZyYW1pbmcgZXJyb3Igc3RhdHVzICovCisjZGVmaW5lIENETlNfVUFSVF9SWEJTX0JSSyAgICAgICAweDAwMDAwMDA0IC8qIE92ZXJydW4gZXJyb3Igc3RhdHVzICovCiAKIC8qCiAgKiBNb2RlIFJlZ2lzdGVyOgpAQCAtMTI2LDEzICsxMzAsMjcgQEAKICNkZWZpbmUgQ0ROU19VQVJUX0lYUl9SWEVNUFRZCTB4MDAwMDAwMDIgLyogUlggRklGTyBlbXB0eSBpbnRlcnJ1cHQuICovCiAjZGVmaW5lIENETlNfVUFSVF9JWFJfTUFTSwkweDAwMDAxRkZGIC8qIFZhbGlkIGJpdCBtYXNrICovCiAKLSNkZWZpbmUgQ0ROU19VQVJUX1JYX0lSUVMJKENETlNfVUFSVF9JWFJfUEFSSVRZIHwgQ0ROU19VQVJUX0lYUl9GUkFNSU5HIHwgXAotCQkJCSBDRE5TX1VBUlRfSVhSX09WRVJSVU4gfCBDRE5TX1VBUlRfSVhSX1JYVFJJRyB8IFwKKwkvKgorCSAqIERvIG5vdCBlbmFibGUgcGFyaXR5IGVycm9yIGludGVycnVwdCBmb3IgdGhlIGZvbGxvd2luZworCSAqIHJlYXNvbjogV2hlbiBwYXJpdHkgZXJyb3IgaW50ZXJydXB0IGlzIGVuYWJsZWQsIGVhY2ggUngKKwkgKiBwYXJpdHkgZXJyb3IgYWx3YXlzIHJlc3VsdHMgaW4gMiBldmVudHMuIFRoZSBmaXJzdCBvbmUKKwkgKiBiZWluZyBwYXJpdHkgZXJyb3IgaW50ZXJydXB0IGFuZCB0aGUgc2Vjb25kIG9uZSB3aXRoIGEKKwkgKiBwcm9wZXIgUnggaW50ZXJydXB0IHdpdGggdGhlIGluY29taW5nIGRhdGEuICBEaXNhYmxpbmcKKwkgKiBwYXJpdHkgZXJyb3IgaW50ZXJydXB0IGVuc3VyZXMgYmV0dGVyIGhhbmRsaW5nIG9mIHBhcml0eQorCSAqIGVycm9yIGV2ZW50cy4gV2l0aCB0aGlzIGNoYW5nZSwgZm9yIGEgcGFyaXR5IGVycm9yIGNhc2UsIHdlCisJICogZ2V0IGEgUnggaW50ZXJydXB0IHdpdGggcGFyaXR5IGVycm9yIHNldCBpbiBJU1IgcmVnaXN0ZXIKKwkgKiBhbmQgd2Ugc3RpbGwgaGFuZGxlIHBhcml0eSBlcnJvcnMgaW4gdGhlIGRlc2lyZWQgd2F5LgorCSAqLworCisjZGVmaW5lIENETlNfVUFSVF9SWF9JUlFTCShDRE5TX1VBUlRfSVhSX0ZSQU1JTkcgfCBcCisJCQkJIENETlNfVUFSVF9JWFJfT1ZFUlJVTiB8IFwKKwkJCQkgQ0ROU19VQVJUX0lYUl9SWFRSSUcgfAkgXAogCQkJCSBDRE5TX1VBUlRfSVhSX1RPVVQpCiAKIC8qIEdvZXMgaW4gcmVhZF9zdGF0dXNfbWFzayBmb3IgYnJlYWsgZGV0ZWN0aW9uIGFzIHRoZSBIVyBkb2Vzbid0IGRvIGl0Ki8KLSNkZWZpbmUgQ0ROU19VQVJUX0lYUl9CUksJMHg4MDAwMDAwMAorI2RlZmluZSBDRE5TX1VBUlRfSVhSX0JSSwkweDAwMDAyMDAwCiAKKyNkZWZpbmUgQ0ROU19VQVJUX1JYQlNfU1VQUE9SVCBCSVQoMSkKIC8qCiAgKiBNb2RlbSBDb250cm9sIHJlZ2lzdGVyOgogICogVGhlIHJlYWQvd3JpdGUgTW9kZW0gQ29udHJvbCByZWdpc3RlciBjb250cm9scyB0aGUgaW50ZXJmYWNlIHdpdGggdGhlIG1vZGVtCkBAIC0xNzIsNDYgKzE5MCw2NiBAQAogCXN0cnVjdCBjbGsJCSpwY2xrOwogCXVuc2lnbmVkIGludAkJYmF1ZDsKIAlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sJY2xrX3JhdGVfY2hhbmdlX25iOworCXUzMgkJCXF1aXJrczsKK307CitzdHJ1Y3QgY2Ruc19wbGF0Zm9ybV9kYXRhIHsKKwl1MzIgcXVpcmtzOwogfTsKICNkZWZpbmUgdG9fY2Ruc191YXJ0KF9uYikgY29udGFpbmVyX29mKF9uYiwgc3RydWN0IGNkbnNfdWFydCwgXAogCQljbGtfcmF0ZV9jaGFuZ2VfbmIpOwogCi1zdGF0aWMgdm9pZCBjZG5zX3VhcnRfaGFuZGxlX3J4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBpc3JzdGF0dXMpCisvKioKKyAqIGNkbnNfdWFydF9oYW5kbGVfcnggLSBIYW5kbGUgdGhlIHJlY2VpdmVkIGJ5dGVzIGFsb25nIHdpdGggUnggZXJyb3JzLgorICogQGRldl9pZDogSWQgb2YgdGhlIFVBUlQgcG9ydAorICogQGlzcnN0YXR1czogVGhlIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgdmFsdWUgYXMgcmVhZAorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGNkbnNfdWFydF9oYW5kbGVfcngodm9pZCAqZGV2X2lkLCB1bnNpZ25lZCBpbnQgaXNyc3RhdHVzKQogewotCS8qCi0JICogVGhlcmUgaXMgbm8gaGFyZHdhcmUgYnJlYWsgZGV0ZWN0aW9uLCBzbyB3ZSBpbnRlcnByZXQgZnJhbWluZwotCSAqIGVycm9yIHdpdGggYWxsLXplcm9zIGRhdGEgYXMgYSBicmVhayBzZXF1ZW5jZS4gTW9zdCBvZiB0aGUgdGltZSwKLQkgKiB0aGVyZSdzIGFub3RoZXIgbm9uLXplcm8gYnl0ZSBhdCB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZS4KLQkgKi8KLQlpZiAoaXNyc3RhdHVzICYgQ0ROU19VQVJUX0lYUl9GUkFNSU5HKSB7Ci0JCXdoaWxlICghKHJlYWRsKHBvcnQtPm1lbWJhc2UgKyBDRE5TX1VBUlRfU1IpICYKLQkJCQkJQ0ROU19VQVJUX1NSX1JYRU1QVFkpKSB7Ci0JCQlpZiAoIXJlYWRsKHBvcnQtPm1lbWJhc2UgKyBDRE5TX1VBUlRfRklGTykpIHsKKwlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1YXJ0X3BvcnQgKilkZXZfaWQ7CisJc3RydWN0IGNkbnNfdWFydCAqY2Ruc191YXJ0ID0gcG9ydC0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCBkYXRhOworCXVuc2lnbmVkIGludCByeGJzX3N0YXR1cyA9IDA7CisJdW5zaWduZWQgaW50IHN0YXR1c19tYXNrOworCXVuc2lnbmVkIGludCBmcmFtZXJycHJvY2Vzc2VkID0gMDsKKwljaGFyIHN0YXR1cyA9IFRUWV9OT1JNQUw7CisJYm9vbCBpc19yeGJzX3N1cHBvcnQ7CisKKwlpc19yeGJzX3N1cHBvcnQgPSBjZG5zX3VhcnQtPnF1aXJrcyAmIENETlNfVUFSVF9SWEJTX1NVUFBPUlQ7CisKKwl3aGlsZSAoKHJlYWRsKHBvcnQtPm1lbWJhc2UgKyBDRE5TX1VBUlRfU1IpICYKKwkJQ0ROU19VQVJUX1NSX1JYRU1QVFkpICE9IENETlNfVUFSVF9TUl9SWEVNUFRZKSB7CisJCWlmIChpc19yeGJzX3N1cHBvcnQpCisJCQlyeGJzX3N0YXR1cyA9IHJlYWRsKHBvcnQtPm1lbWJhc2UgKyBDRE5TX1VBUlRfUlhCUyk7CisJCWRhdGEgPSByZWFkbChwb3J0LT5tZW1iYXNlICsgQ0ROU19VQVJUX0ZJRk8pOworCQlwb3J0LT5pY291bnQucngrKzsKKwkJLyoKKwkJICogVGhlcmUgaXMgbm8gaGFyZHdhcmUgYnJlYWsgZGV0ZWN0aW9uIGluIFp5bnEsIHNvIHdlIGludGVycHJldAorCQkgKiBmcmFtaW5nIGVycm9yIHdpdGggYWxsLXplcm9zIGRhdGEgYXMgYSBicmVhayBzZXF1ZW5jZS4KKwkJICogTW9zdCBvZiB0aGUgdGltZSwgdGhlcmUncyBhbm90aGVyIG5vbi16ZXJvIGJ5dGUgYXQgdGhlCisJCSAqIGVuZCBvZiB0aGUgc2VxdWVuY2UuCisJCSAqLworCQlpZiAoIWlzX3J4YnNfc3VwcG9ydCAmJiAoaXNyc3RhdHVzICYgQ0ROU19VQVJUX0lYUl9GUkFNSU5HKSkgeworCQkJaWYgKCFkYXRhKSB7CiAJCQkJcG9ydC0+cmVhZF9zdGF0dXNfbWFzayB8PSBDRE5TX1VBUlRfSVhSX0JSSzsKLQkJCQlpc3JzdGF0dXMgJj0gfkNETlNfVUFSVF9JWFJfRlJBTUlORzsKKwkJCQlmcmFtZXJycHJvY2Vzc2VkID0gMTsKKwkJCQljb250aW51ZTsKIAkJCX0KIAkJfQotCQl3cml0ZWwoQ0ROU19VQVJUX0lYUl9GUkFNSU5HLCBwb3J0LT5tZW1iYXNlICsgQ0ROU19VQVJUX0lTUik7Ci0JfQorCQlpZiAoaXNfcnhic19zdXBwb3J0ICYmIChyeGJzX3N0YXR1cyAmIENETlNfVUFSVF9SWEJTX0JSSykpIHsKKwkJCXBvcnQtPmljb3VudC5icmsrKzsKKwkJCXN0YXR1cyA9IFRUWV9CUkVBSzsKKwkJCWlmICh1YXJ0X2hhbmRsZV9icmVhayhwb3J0KSkKKwkJCQljb250aW51ZTsKKwkJfQogCi0JLyogZHJvcCBieXRlIHdpdGggcGFyaXR5IGVycm9yIGlmIElHTlBBUiBzcGVjaWZpZWQgKi8KLQlpZiAoaXNyc3RhdHVzICYgcG9ydC0+aWdub3JlX3N0YXR1c19tYXNrICYgQ0ROU19VQVJUX0lYUl9QQVJJVFkpCi0JCWlzcnN0YXR1cyAmPSB+KENETlNfVUFSVF9JWFJfUlhUUklHIHwgQ0ROU19VQVJUX0lYUl9UT1VUKTsKKwkJaXNyc3RhdHVzICY9IHBvcnQtPnJlYWRfc3RhdHVzX21hc2s7CisJCWlzcnN0YXR1cyAmPSB+cG9ydC0+aWdub3JlX3N0YXR1c19tYXNrOworCQlzdGF0dXNfbWFzayA9IHBvcnQtPnJlYWRfc3RhdHVzX21hc2s7CisJCXN0YXR1c19tYXNrICY9IH5wb3J0LT5pZ25vcmVfc3RhdHVzX21hc2s7CiAKLQlpc3JzdGF0dXMgJj0gcG9ydC0+cmVhZF9zdGF0dXNfbWFzazsKLQlpc3JzdGF0dXMgJj0gfnBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzazsKLQotCWlmICghKGlzcnN0YXR1cyAmIChDRE5TX1VBUlRfSVhSX1RPVVQgfCBDRE5TX1VBUlRfSVhSX1JYVFJJRykpKQotCQlyZXR1cm47Ci0KLQl3aGlsZSAoIShyZWFkbChwb3J0LT5tZW1iYXNlICsgQ0ROU19VQVJUX1NSKSAmIENETlNfVUFSVF9TUl9SWEVNUFRZKSkgewotCQl1MzIgZGF0YTsKLQkJY2hhciBzdGF0dXMgPSBUVFlfTk9STUFMOwotCi0JCWRhdGEgPSByZWFkbChwb3J0LT5tZW1iYXNlICsgQ0ROU19VQVJUX0ZJRk8pOwotCi0JCS8qIE5vbi1OVUxMIGJ5dGUgYWZ0ZXIgQlJFQUsgaXMgZ2FyYmFnZSAoOTklKSAqLwotCQlpZiAoZGF0YSAmJiAocG9ydC0+cmVhZF9zdGF0dXNfbWFzayAmIENETlNfVUFSVF9JWFJfQlJLKSkgeworCQlpZiAoZGF0YSAmJgorCQkgICAgKHBvcnQtPnJlYWRfc3RhdHVzX21hc2sgJiBDRE5TX1VBUlRfSVhSX0JSSykpIHsKIAkJCXBvcnQtPnJlYWRfc3RhdHVzX21hc2sgJj0gfkNETlNfVUFSVF9JWFJfQlJLOwogCQkJcG9ydC0+aWNvdW50LmJyaysrOwogCQkJaWYgKHVhcnRfaGFuZGxlX2JyZWFrKHBvcnQpKQpAQCAtMjIxLDU3ICsyNTksODMgQEAKIAkJaWYgKHVhcnRfaGFuZGxlX3N5c3JxX2NoYXIocG9ydCwgZGF0YSkpCiAJCQljb250aW51ZTsKIAotCQlwb3J0LT5pY291bnQucngrKzsKLQotCQlpZiAoaXNyc3RhdHVzICYgQ0ROU19VQVJUX0lYUl9QQVJJVFkpIHsKLQkJCXBvcnQtPmljb3VudC5wYXJpdHkrKzsKLQkJCXN0YXR1cyA9IFRUWV9QQVJJVFk7Ci0JCX0gZWxzZSBpZiAoaXNyc3RhdHVzICYgQ0ROU19VQVJUX0lYUl9GUkFNSU5HKSB7Ci0JCQlwb3J0LT5pY291bnQuZnJhbWUrKzsKLQkJCXN0YXR1cyA9IFRUWV9GUkFNRTsKLQkJfSBlbHNlIGlmIChpc3JzdGF0dXMgJiBDRE5TX1VBUlRfSVhSX09WRVJSVU4pIHsKLQkJCXBvcnQtPmljb3VudC5vdmVycnVuKys7CisJCWlmIChpc19yeGJzX3N1cHBvcnQpIHsKKwkJCWlmICgocnhic19zdGF0dXMgJiBDRE5TX1VBUlRfUlhCU19QQVJJVFkpCisJCQkgICAgJiYgKHN0YXR1c19tYXNrICYgQ0ROU19VQVJUX0lYUl9QQVJJVFkpKSB7CisJCQkJcG9ydC0+aWNvdW50LnBhcml0eSsrOworCQkJCXN0YXR1cyA9IFRUWV9QQVJJVFk7CisJCQl9CisJCQlpZiAoKHJ4YnNfc3RhdHVzICYgQ0ROU19VQVJUX1JYQlNfRlJBTUlORykKKwkJCSAgICAmJiAoc3RhdHVzX21hc2sgJiBDRE5TX1VBUlRfSVhSX1BBUklUWSkpIHsKKwkJCQlwb3J0LT5pY291bnQuZnJhbWUrKzsKKwkJCQlzdGF0dXMgPSBUVFlfRlJBTUU7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoaXNyc3RhdHVzICYgQ0ROU19VQVJUX0lYUl9QQVJJVFkpIHsKKwkJCQlwb3J0LT5pY291bnQucGFyaXR5Kys7CisJCQkJc3RhdHVzID0gVFRZX1BBUklUWTsKKwkJCX0KKwkJCWlmICgoaXNyc3RhdHVzICYgQ0ROU19VQVJUX0lYUl9GUkFNSU5HKSAmJgorCQkJICAgICFmcmFtZXJycHJvY2Vzc2VkKSB7CisJCQkJcG9ydC0+aWNvdW50LmZyYW1lKys7CisJCQkJc3RhdHVzID0gVFRZX0ZSQU1FOworCQkJfQogCQl9Ci0KLQkJdWFydF9pbnNlcnRfY2hhcihwb3J0LCBpc3JzdGF0dXMsIENETlNfVUFSVF9JWFJfT1ZFUlJVTiwKLQkJCQkgZGF0YSwgc3RhdHVzKTsKKwkJaWYgKGlzcnN0YXR1cyAmIENETlNfVUFSVF9JWFJfT1ZFUlJVTikgeworCQkJcG9ydC0+aWNvdW50Lm92ZXJydW4rKzsKKwkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKCZwb3J0LT5zdGF0ZS0+cG9ydCwgMCwKKwkJCQkJICAgICBUVFlfT1ZFUlJVTik7CisJCX0KKwkJdHR5X2luc2VydF9mbGlwX2NoYXIoJnBvcnQtPnN0YXRlLT5wb3J0LCBkYXRhLCBzdGF0dXMpOworCQlpc3JzdGF0dXMgPSAwOwogCX0KKwlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7CiAJdHR5X2ZsaXBfYnVmZmVyX3B1c2goJnBvcnQtPnN0YXRlLT5wb3J0KTsKKwlzcGluX2xvY2soJnBvcnQtPmxvY2spOwogfQogCi1zdGF0aWMgdm9pZCBjZG5zX3VhcnRfaGFuZGxlX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCisvKioKKyAqIGNkbnNfdWFydF9oYW5kbGVfdHggLSBIYW5kbGUgdGhlIGJ5dGVzIHRvIGJlIFR4ZWQuCisgKiBAZGV2X2lkOiBJZCBvZiB0aGUgVUFSVCBwb3J0CisgKiBSZXR1cm46IE5vbmUKKyAqLworc3RhdGljIHZvaWQgY2Ruc191YXJ0X2hhbmRsZV90eCh2b2lkICpkZXZfaWQpCiB7CisJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdWFydF9wb3J0ICopZGV2X2lkOwogCXVuc2lnbmVkIGludCBudW1ieXRlczsKIAogCWlmICh1YXJ0X2NpcmNfZW1wdHkoJnBvcnQtPnN0YXRlLT54bWl0KSkgewogCQl3cml0ZWwoQ0ROU19VQVJUX0lYUl9UWEVNUFRZLCBwb3J0LT5tZW1iYXNlICsgQ0ROU19VQVJUX0lEUik7Ci0JCXJldHVybjsKKwl9IGVsc2UgeworCQludW1ieXRlcyA9IHBvcnQtPmZpZm9zaXplOworCQl3aGlsZSAobnVtYnl0ZXMgJiYgIXVhcnRfY2lyY19lbXB0eSgmcG9ydC0+c3RhdGUtPnhtaXQpICYmCisJCSAgICAgICAhKHJlYWRsKHBvcnQtPm1lbWJhc2UgKyBDRE5TX1VBUlRfU1IpICYgQ0ROU19VQVJUX1NSX1RYRlVMTCkpIHsKKwkJCS8qCisJCQkgKiBHZXQgdGhlIGRhdGEgZnJvbSB0aGUgVUFSVCBjaXJjdWxhciBidWZmZXIKKwkJCSAqIGFuZCB3cml0ZSBpdCB0byB0aGUgY2Ruc191YXJ0J3MgVFhfRklGTworCQkJICogcmVnaXN0ZXIuCisJCQkgKi8KKwkJCXdyaXRlbCgKKwkJCQlwb3J0LT5zdGF0ZS0+eG1pdC5idWZbcG9ydC0+c3RhdGUtPnhtaXQuCisJCQkJdGFpbF0sIHBvcnQtPm1lbWJhc2UgKyBDRE5TX1VBUlRfRklGTyk7CisKKwkJCXBvcnQtPmljb3VudC50eCsrOworCisJCQkvKgorCQkJICogQWRqdXN0IHRoZSB0YWlsIG9mIHRoZSBVQVJUIGJ1ZmZlciBhbmQgd3JhcAorCQkJICogdGhlIGJ1ZmZlciBpZiBpdCByZWFjaGVzIGxpbWl0LgorCQkJICovCisJCQlwb3J0LT5zdGF0ZS0+eG1pdC50YWlsID0KKwkJCQkocG9ydC0+c3RhdGUtPnhtaXQudGFpbCArIDEpICYKKwkJCQkJKFVBUlRfWE1JVF9TSVpFIC0gMSk7CisKKwkJCW51bWJ5dGVzLS07CisJCX0KKworCQlpZiAodWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoCisJCQkJJnBvcnQtPnN0YXRlLT54bWl0KSA8IFdBS0VVUF9DSEFSUykKKwkJCXVhcnRfd3JpdGVfd2FrZXVwKHBvcnQpOwogCX0KLQotCW51bWJ5dGVzID0gcG9ydC0+Zmlmb3NpemU7Ci0Jd2hpbGUgKG51bWJ5dGVzICYmICF1YXJ0X2NpcmNfZW1wdHkoJnBvcnQtPnN0YXRlLT54bWl0KSAmJgotCSAgICAgICAhKHJlYWRsKHBvcnQtPm1lbWJhc2UgKyBDRE5TX1VBUlRfU1IpICYgQ0ROU19VQVJUX1NSX1RYRlVMTCkpIHsKLQkJLyoKLQkJICogR2V0IHRoZSBkYXRhIGZyb20gdGhlIFVBUlQgY2lyY3VsYXIgYnVmZmVyCi0JCSAqIGFuZCB3cml0ZSBpdCB0byB0aGUgY2Ruc191YXJ0J3MgVFhfRklGTwotCQkgKiByZWdpc3Rlci4KLQkJICovCi0JCXdyaXRlbChwb3J0LT5zdGF0ZS0+eG1pdC5idWZbcG9ydC0+c3RhdGUtPnhtaXQudGFpbF0sCi0JCQlwb3J0LT5tZW1iYXNlICsgQ0ROU19VQVJUX0ZJRk8pOwotCQlwb3J0LT5pY291bnQudHgrKzsKLQotCQkvKgotCQkgKiBBZGp1c3QgdGhlIHRhaWwgb2YgdGhlIFVBUlQgYnVmZmVyIGFuZCB3cmFwCi0JCSAqIHRoZSBidWZmZXIgaWYgaXQgcmVhY2hlcyBsaW1pdC4KLQkJICovCi0JCXBvcnQtPnN0YXRlLT54bWl0LnRhaWwgPQotCQkJKHBvcnQtPnN0YXRlLT54bWl0LnRhaWwgKyAxKSAmIChVQVJUX1hNSVRfU0laRSAtIDEpOwotCi0JCW51bWJ5dGVzLS07Ci0JfQotCi0JaWYgKHVhcnRfY2lyY19jaGFyc19wZW5kaW5nKCZwb3J0LT5zdGF0ZS0+eG1pdCkgPCBXQUtFVVBfQ0hBUlMpCi0JCXVhcnRfd3JpdGVfd2FrZXVwKHBvcnQpOwogfQogCiAvKioKQEAgLTI4NCwyNyArMzQ4LDI0IEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgY2Ruc191YXJ0X2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdWFydF9wb3J0ICopZGV2X2lkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGlzcnN0YXR1czsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrKCZwb3J0LT5sb2NrKTsKIAogCS8qIFJlYWQgdGhlIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgdG8gZGV0ZXJtaW5lIHdoaWNoCi0JICogaW50ZXJydXB0KHMpIGlzL2FyZSBhY3RpdmUuCisJICogaW50ZXJydXB0KHMpIGlzL2FyZSBhY3RpdmUgYW5kIGNsZWFyIHRoZW0uCiAJICovCiAJaXNyc3RhdHVzID0gcmVhZGwocG9ydC0+bWVtYmFzZSArIENETlNfVUFSVF9JU1IpOwotCi0JaWYgKGlzcnN0YXR1cyAmIENETlNfVUFSVF9SWF9JUlFTKQotCQljZG5zX3VhcnRfaGFuZGxlX3J4KHBvcnQsIGlzcnN0YXR1cyk7Ci0KLQlpZiAoKGlzcnN0YXR1cyAmIENETlNfVUFSVF9JWFJfVFhFTVBUWSkgPT0gQ0ROU19VQVJUX0lYUl9UWEVNUFRZKQotCQljZG5zX3VhcnRfaGFuZGxlX3R4KHBvcnQpOwotCiAJd3JpdGVsKGlzcnN0YXR1cywgcG9ydC0+bWVtYmFzZSArIENETlNfVUFSVF9JU1IpOwogCi0JLyogYmUgc3VyZSB0byByZWxlYXNlIHRoZSBsb2NrIGFuZCB0dHkgYmVmb3JlIGxlYXZpbmcgKi8KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJaWYgKGlzcnN0YXR1cyAmIENETlNfVUFSVF9JWFJfVFhFTVBUWSkgeworCQljZG5zX3VhcnRfaGFuZGxlX3R4KGRldl9pZCk7CisJCWlzcnN0YXR1cyAmPSB+Q0ROU19VQVJUX0lYUl9UWEVNUFRZOworCX0KKwlpZiAoaXNyc3RhdHVzICYgQ0ROU19VQVJUX0lYUl9NQVNLKQorCQljZG5zX3VhcnRfaGFuZGxlX3J4KGRldl9pZCwgaXNyc3RhdHVzKTsKIAorCXNwaW5fdW5sb2NrKCZwb3J0LT5sb2NrKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKQEAgLTY1Myw2ICs3MTQsMTAgQEAKIAljdHJsX3JlZyB8PSBDRE5TX1VBUlRfQ1JfVFhSU1QgfCBDRE5TX1VBUlRfQ1JfUlhSU1Q7CiAJd3JpdGVsKGN0cmxfcmVnLCBwb3J0LT5tZW1iYXNlICsgQ0ROU19VQVJUX0NSKTsKIAorCXdoaWxlIChyZWFkbChwb3J0LT5tZW1iYXNlICsgQ0ROU19VQVJUX0NSKSAmCisJCShDRE5TX1VBUlRfQ1JfVFhSU1QgfCBDRE5TX1VBUlRfQ1JfUlhSU1QpKQorCQljcHVfcmVsYXgoKTsKKwogCS8qCiAJICogQ2xlYXIgdGhlIFJYIGRpc2FibGUgYW5kIFRYIGRpc2FibGUgYml0cyBhbmQgdGhlbiBzZXQgdGhlIFRYIGVuYWJsZQogCSAqIGJpdCBhbmQgUlggZW5hYmxlIGJpdCB0byBlbmFibGUgdGhlIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlci4KQEAgLTczNiwxMCArODAxLDE0IEBACiAgKi8KIHN0YXRpYyBpbnQgY2Ruc191YXJ0X3N0YXJ0dXAoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKKwlzdHJ1Y3QgY2Ruc191YXJ0ICpjZG5zX3VhcnQgPSBwb3J0LT5wcml2YXRlX2RhdGE7CisJYm9vbCBpc19icmtfc3VwcG9ydDsKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IHN0YXR1cyA9IDA7CiAKKwlpc19icmtfc3VwcG9ydCA9IGNkbnNfdWFydC0+cXVpcmtzICYgQ0ROU19VQVJUX1JYQlNfU1VQUE9SVDsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiAKIAkvKiBEaXNhYmxlIHRoZSBUWCBhbmQgUlggKi8KQEAgLTc1Miw2ICs4MjEsMTAgQEAKIAl3cml0ZWwoQ0ROU19VQVJUX0NSX1RYUlNUIHwgQ0ROU19VQVJUX0NSX1JYUlNULAogCQkJcG9ydC0+bWVtYmFzZSArIENETlNfVUFSVF9DUik7CiAKKwl3aGlsZSAocmVhZGwocG9ydC0+bWVtYmFzZSArIENETlNfVUFSVF9DUikgJgorCQkoQ0ROU19VQVJUX0NSX1RYUlNUIHwgQ0ROU19VQVJUX0NSX1JYUlNUKSkKKwkJY3B1X3JlbGF4KCk7CisKIAkvKgogCSAqIENsZWFyIHRoZSBSWCBkaXNhYmxlIGJpdCBhbmQgdGhlbiBzZXQgdGhlIFJYIGVuYWJsZSBiaXQgdG8gZW5hYmxlCiAJICogdGhlIHJlY2VpdmVyLgpAQCAtNzk0LDcgKzg2NywxMSBAQAogCX0KIAogCS8qIFNldCB0aGUgSW50ZXJydXB0IFJlZ2lzdGVycyB3aXRoIGRlc2lyZWQgaW50ZXJydXB0cyAqLwotCXdyaXRlbChDRE5TX1VBUlRfUlhfSVJRUywgcG9ydC0+bWVtYmFzZSArIENETlNfVUFSVF9JRVIpOworCWlmIChpc19icmtfc3VwcG9ydCkKKwkJd3JpdGVsKENETlNfVUFSVF9SWF9JUlFTIHwgQ0ROU19VQVJUX0lYUl9CUkssCisJCQkJCXBvcnQtPm1lbWJhc2UgKyBDRE5TX1VBUlRfSUVSKTsKKwllbHNlCisJCXdyaXRlbChDRE5TX1VBUlRfUlhfSVJRUywgcG9ydC0+bWVtYmFzZSArIENETlNfVUFSVF9JRVIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05OTMsNyArMTA3MCw3IEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IHVhcnRfb3BzIGNkbnNfdWFydF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHVhcnRfb3BzIGNkbnNfdWFydF9vcHMgPSB7CiAJLnNldF9tY3RybAk9IGNkbnNfdWFydF9zZXRfbWN0cmwsCiAJLmdldF9tY3RybAk9IGNkbnNfdWFydF9nZXRfbWN0cmwsCiAJLnN0YXJ0X3R4CT0gY2Ruc191YXJ0X3N0YXJ0X3R4LApAQCAtMTA4OCw5ICsxMTY1LDM0IEBACiBzdGF0aWMgaW50IF9faW5pdCBjZG5zX2Vhcmx5X2NvbnNvbGVfc2V0dXAoc3RydWN0IGVhcmx5Y29uX2RldmljZSAqZGV2aWNlLAogCQkJCQkgICBjb25zdCBjaGFyICpvcHQpCiB7Ci0JaWYgKCFkZXZpY2UtPnBvcnQubWVtYmFzZSkKKwlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gJmRldmljZS0+cG9ydDsKKworCWlmICghcG9ydC0+bWVtYmFzZSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwkvKiBpbml0aWFsaXNlIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwl3cml0ZWwoQ0ROU19VQVJUX0NSX1RYX0VOfENETlNfVUFSVF9DUl9UWFJTVHxDRE5TX1VBUlRfQ1JfUlhSU1QsCisJICAgICAgIHBvcnQtPm1lbWJhc2UgKyBDRE5TX1VBUlRfQ1IpOworCisJLyogb25seSBzZXQgYmF1ZCBpZiBzcGVjaWZpZWQgb24gY29tbWFuZCBsaW5lIC0gb3RoZXJ3aXNlCisJICogYXNzdW1lIGl0IGhhcyBiZWVuIGluaXRpYWxpemVkIGJ5IGEgYm9vdCBsb2FkZXIuCisJICovCisJaWYgKGRldmljZS0+YmF1ZCkgeworCQl1MzIgY2QgPSAwLCBiZGl2ID0gMDsKKwkJdTMyIG1yOworCQlpbnQgZGl2ODsKKworCQljZG5zX3VhcnRfY2FsY19iYXVkX2RpdnMocG9ydC0+dWFydGNsaywgZGV2aWNlLT5iYXVkLAorCQkJCQkgJmJkaXYsICZjZCwgJmRpdjgpOworCQltciA9IENETlNfVUFSVF9NUl9QQVJJVFlfTk9ORTsKKwkJaWYgKGRpdjgpCisJCQltciB8PSBDRE5TX1VBUlRfTVJfQ0xLU0VMOworCisJCXdyaXRlbChtciwgICBwb3J0LT5tZW1iYXNlICsgQ0ROU19VQVJUX01SKTsKKwkJd3JpdGVsKGNkLCAgIHBvcnQtPm1lbWJhc2UgKyBDRE5TX1VBUlRfQkFVREdFTik7CisJCXdyaXRlbChiZGl2LCBwb3J0LT5tZW1iYXNlICsgQ0ROU19VQVJUX0JBVURESVYpOworCX0KKwogCWRldmljZS0+Y29uLT53cml0ZSA9IGNkbnNfZWFybHlfd3JpdGU7CiAKIAlyZXR1cm4gMDsKQEAgLTEzMjgsNiArMTQzMCwxOCBAQAogc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGNkbnNfdWFydF9kZXZfcG1fb3BzLCBjZG5zX3VhcnRfc3VzcGVuZCwKIAkJY2Ruc191YXJ0X3Jlc3VtZSk7CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2Ruc19wbGF0Zm9ybV9kYXRhIHp5bnFtcF91YXJ0X2RlZiA9IHsKKwkJCQkucXVpcmtzID0gQ0ROU19VQVJUX1JYQlNfU1VQUE9SVCwgfTsKKworLyogTWF0Y2ggdGFibGUgZm9yIG9mX3BsYXRmb3JtIGJpbmRpbmcgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGNkbnNfdWFydF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAieGxueCx4dWFydHBzIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImNkbnMsdWFydC1yMXA4IiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImNkbnMsdWFydC1yMXAxMiIsIC5kYXRhID0gJnp5bnFtcF91YXJ0X2RlZiB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgY2Ruc191YXJ0X29mX21hdGNoKTsKKwogLyoqCiAgKiBjZG5zX3VhcnRfcHJvYmUgLSBQbGF0Zm9ybSBkcml2ZXIgcHJvYmUKICAqIEBwZGV2OiBQb2ludGVyIHRvIHRoZSBwbGF0Zm9ybSBkZXZpY2Ugc3RydWN0dXJlCkBAIC0xMzQwLDEyICsxNDU0LDIwIEBACiAJc3RydWN0IHVhcnRfcG9ydCAqcG9ydDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlzdHJ1Y3QgY2Ruc191YXJ0ICpjZG5zX3VhcnRfZGF0YTsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKIAogCWNkbnNfdWFydF9kYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqY2Ruc191YXJ0X2RhdGEpLAogCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFjZG5zX3VhcnRfZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwltYXRjaCA9IG9mX21hdGNoX25vZGUoY2Ruc191YXJ0X29mX21hdGNoLCBwZGV2LT5kZXYub2Zfbm9kZSk7CisJaWYgKG1hdGNoICYmIG1hdGNoLT5kYXRhKSB7CisJCWNvbnN0IHN0cnVjdCBjZG5zX3BsYXRmb3JtX2RhdGEgKmRhdGEgPSBtYXRjaC0+ZGF0YTsKKworCQljZG5zX3VhcnRfZGF0YS0+cXVpcmtzID0gZGF0YS0+cXVpcmtzOworCX0KKwogCWNkbnNfdWFydF9kYXRhLT5wY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJwY2xrIik7CiAJaWYgKElTX0VSUihjZG5zX3VhcnRfZGF0YS0+cGNsaykpIHsKIAkJY2Ruc191YXJ0X2RhdGEtPnBjbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgImFwZXJfY2xrIik7CkBAIC0xNDcxLDE0ICsxNTkzLDYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLS8qIE1hdGNoIHRhYmxlIGZvciBvZl9wbGF0Zm9ybSBiaW5kaW5nICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBjZG5zX3VhcnRfb2ZfbWF0Y2hbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInhsbngseHVhcnRwcyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJjZG5zLHVhcnQtcjFwOCIsIH0sCi0Je30KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBjZG5zX3VhcnRfb2ZfbWF0Y2gpOwotCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjZG5zX3VhcnRfcGxhdGZvcm1fZHJpdmVyID0gewogCS5wcm9iZSAgID0gY2Ruc191YXJ0X3Byb2JlLAogCS5yZW1vdmUgID0gY2Ruc191YXJ0X3JlbW92ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3Z0L3Z0LmMgYi9kcml2ZXJzL3R0eS92dC92dC5jCmluZGV4IDI3MDVjYTkuLmU4NDFhNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3Z0L3Z0LmMKKysrIGIvZHJpdmVycy90dHkvdnQvdnQuYwpAQCAtMTMxMiwxMiArMTMxMiwxMiBAQAogCWlmIChpID4gdmMtPnZjX25wYXIpCiAJCXJldHVybiBpOwogCi0JaWYgKHZjLT52Y19wYXJbaV0gPT0gNSAmJiBpIDwgdmMtPnZjX25wYXIpIHsKLQkJLyogMjU2IGNvbG91cnMgLS0gdWJpcXVpdG91cyAqLworCWlmICh2Yy0+dmNfcGFyW2ldID09IDUgJiYgaSArIDEgPD0gdmMtPnZjX25wYXIpIHsKKwkJLyogMjU2IGNvbG91cnMgKi8KIAkJaSsrOwogCQlyZ2JfZnJvbV8yNTYodmMtPnZjX3BhcltpXSwgJmMpOwotCX0gZWxzZSBpZiAodmMtPnZjX3BhcltpXSA9PSAyICYmIGkgPD0gdmMtPnZjX25wYXIgKyAzKSB7Ci0JCS8qIDI0IGJpdCAtLSBleHRyZW1lbHkgcmFyZSAqLworCX0gZWxzZSBpZiAodmMtPnZjX3BhcltpXSA9PSAyICYmIGkgKyAzIDw9IHZjLT52Y19ucGFyKSB7CisJCS8qIDI0IGJpdCAqLwogCQljLnIgPSB2Yy0+dmNfcGFyW2kgKyAxXTsKIAkJYy5nID0gdmMtPnZjX3BhcltpICsgMl07CiAJCWMuYiA9IHZjLT52Y19wYXJbaSArIDNdOwpAQCAtMTQxNSw2ICsxNDE1LDExIEBACiAJCQkJKHZjLT52Y19jb2xvciAmIDB4MGYpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CisJCQlpZiAodmMtPnZjX3BhcltpXSA+PSA5MCAmJiB2Yy0+dmNfcGFyW2ldIDw9IDEwNykgeworCQkJCWlmICh2Yy0+dmNfcGFyW2ldIDwgMTAwKQorCQkJCQl2Yy0+dmNfaW50ZW5zaXR5ID0gMjsKKwkJCQl2Yy0+dmNfcGFyW2ldIC09IDYwOworCQkJfQogCQkJaWYgKHZjLT52Y19wYXJbaV0gPj0gMzAgJiYgdmMtPnZjX3BhcltpXSA8PSAzNykKIAkJCQl2Yy0+dmNfY29sb3IgPSBjb2xvcl90YWJsZVt2Yy0+dmNfcGFyW2ldIC0gMzBdCiAJCQkJCXwgKHZjLT52Y19jb2xvciAmIDB4ZjApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91aW8vdWlvX2RtZW1fZ2VuaXJxLmMgYi9kcml2ZXJzL3Vpby91aW9fZG1lbV9nZW5pcnEuYwppbmRleCA5MTVmYWNiLi5lMTEzNGE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Vpby91aW9fZG1lbV9nZW5pcnEuYworKysgYi9kcml2ZXJzL3Vpby91aW9fZG1lbV9nZW5pcnEuYwpAQCAtMjI5LDcgKzIyOSw3IEBACiAJCSsrdWlvbWVtOwogCX0KIAotCXByaXYtPmRtZW1fcmVnaW9uX3N0YXJ0ID0gaTsKKwlwcml2LT5kbWVtX3JlZ2lvbl9zdGFydCA9IHVpb21lbSAtICZ1aW9pbmZvLT5tZW1bMF07CiAJcHJpdi0+bnVtX2RtZW1fcmVnaW9ucyA9IHBkYXRhLT5udW1fZHluYW1pY19yZWdpb25zOwogCiAJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fZHluYW1pY19yZWdpb25zOyArK2kpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL0tjb25maWcgYi9kcml2ZXJzL3VzYi9LY29uZmlnCmluZGV4IDg2ODlkY2IuLjY0NGU5NzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvS2NvbmZpZwpAQCAtMTUyLDcgKzE1Miw4IEBACiAKIGNvbmZpZyBVU0JfTEVEX1RSSUcKIAlib29sICJVU0IgTEVEIFRyaWdnZXJzIgotCWRlcGVuZHMgb24gTEVEU19DTEFTUyAmJiBVU0JfQ09NTU9OICYmIExFRFNfVFJJR0dFUlMKKwlkZXBlbmRzIG9uIExFRFNfQ0xBU1MgJiYgTEVEU19UUklHR0VSUworCXNlbGVjdCBVU0JfQ09NTU9OCiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWRkcyBMRUQgdHJpZ2dlcnMgZm9yIFVTQiBob3N0IGFuZC9vciBnYWRnZXQgYWN0aXZpdHkuCiAKQEAgLTE2MCw0ICsxNjEsMjUgQEAKIAkgIExFRHMgYW5kIHlvdSB3YW50IHRvIHVzZSB0aGVtIGFzIGFjdGl2aXR5IGluZGljYXRvcnMgZm9yIFVTQiBob3N0IG9yCiAJICBnYWRnZXQuCiAKK2NvbmZpZyBVU0JfVUxQSV9CVVMKKwl0cmlzdGF0ZSAiVVNCIFVMUEkgUEhZIGludGVyZmFjZSBzdXBwb3J0IgorCXNlbGVjdCBVU0JfQ09NTU9OCisJaGVscAorCSAgVVRNSSsgTG93IFBpbiBJbnRlcmZhY2UgKFVMUEkpIGlzIHNwZWNpZmljYXRpb24gZm9yIGEgY29tbW9ubHkgdXNlZAorCSAgVVNCIDIuMCBQSFkgaW50ZXJmYWNlLiBUaGUgVUxQSSBzcGVjaWZpY2F0aW9uIGRlZmluZXMgYSBzdGFuZGFyZCBzZXQKKwkgIG9mIHJlZ2lzdGVycyB0aGF0IGNhbiBiZSB1c2VkIHRvIGRldGVjdCB0aGUgdmVuZG9yIGFuZCBwcm9kdWN0IHdoaWNoCisJICBhbGxvd3MgVUxQSSB0byBiZSBoYW5kbGVkIGFzIGEgYnVzLiBUaGlzIG1vZHVsZSBpcyB0aGUgZHJpdmVyIGZvciB0aGF0CisJICBidXMuCisKKwkgIFRoZSBVTFBJIGludGVyZmFjZXMgKHRoZSBidXNlcykgYXJlIHJlZ2lzdGVyZWQgYnkgdGhlIGRyaXZlcnMgZm9yIFVTQgorCSAgY29udHJvbGxlcnMgd2hpY2ggc3VwcG9ydCBVTFBJIHJlZ2lzdGVyIGFjY2VzcyBhbmQgaGF2ZSBVTFBJIFBIWQorCSAgYXR0YWNoZWQgdG8gdGhlbS4gVGhlIFVMUEkgUEhZIGRyaXZlcnMgdGhlbXNlbHZlcyBhcmUgbm9ybWFsIFBIWQorCSAgZHJpdmVycy4KKworCSAgVUxQSSBQSFlzIHByb3ZpZGUgb2Z0ZW4gZnVuY3Rpb25zIHN1Y2ggYXMgQURQIHNlbnNpbmcvcHJvYmluZyAoT1RHCisJICBwcm90b2NvbCkgYW5kIFVTQiBjaGFyZ2VyIGRldGVjdGlvbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgdWxwaS4KKwogZW5kaWYgIyBVU0JfU1VQUE9SVApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvYXRtL2N4YWNydS5jIGIvZHJpdmVycy91c2IvYXRtL2N4YWNydS5jCmluZGV4IDBhODY2ZTkuLmY5ZmU4NmI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vY3hhY3J1LmMKKysrIGIvZHJpdmVycy91c2IvYXRtL2N4YWNydS5jCkBAIC0xMTM5LDEwICsxMTM5LDggQEAKIAogCS8qIGluc3RhbmNlIGluaXQgKi8KIAlpbnN0YW5jZSA9IGt6YWxsb2Moc2l6ZW9mKCppbnN0YW5jZSksIEdGUF9LRVJORUwpOwotCWlmICghaW5zdGFuY2UpIHsKLQkJdXNiX2RiZyh1c2JhdG1faW5zdGFuY2UsICJjeGFjcnVfYmluZDogbm8gbWVtb3J5IGZvciBpbnN0YW5jZSBkYXRhXG4iKTsKKwlpZiAoIWluc3RhbmNlKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlpbnN0YW5jZS0+dXNiYXRtID0gdXNiYXRtX2luc3RhbmNlOwogCWluc3RhbmNlLT5tb2RlbV90eXBlID0gKHN0cnVjdCBjeGFjcnVfbW9kZW1fdHlwZSAqKSBpZC0+ZHJpdmVyX2luZm87CkBAIC0xMTY4LDEzICsxMTY2LDExIEBACiAJfQogCWluc3RhbmNlLT5yY3ZfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluc3RhbmNlLT5yY3ZfdXJiKSB7Ci0JCXVzYl9kYmcodXNiYXRtX2luc3RhbmNlLCAiY3hhY3J1X2JpbmQ6IG5vIG1lbW9yeSBmb3IgcmN2X3VyYlxuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZmFpbDsKIAl9CiAJaW5zdGFuY2UtPnNuZF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCWlmICghaW5zdGFuY2UtPnNuZF91cmIpIHsKLQkJdXNiX2RiZyh1c2JhdG1faW5zdGFuY2UsICJjeGFjcnVfYmluZDogbm8gbWVtb3J5IGZvciBzbmRfdXJiXG4iKTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBmYWlsOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS9zcGVlZHRjaC5jIGIvZHJpdmVycy91c2IvYXRtL3NwZWVkdGNoLmMKaW5kZXggMDI3MGQxMy4uNTA4M2ViNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvYXRtL3NwZWVkdGNoLmMKKysrIGIvZHJpdmVycy91c2IvYXRtL3NwZWVkdGNoLmMKQEAgLTgxNyw3ICs4MTcsNiBAQAogCWluc3RhbmNlID0ga3phbGxvYyhzaXplb2YoKmluc3RhbmNlKSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIWluc3RhbmNlKSB7Ci0JCXVzYl9lcnIodXNiYXRtLCAiJXM6IG5vIG1lbW9yeSBmb3IgaW5zdGFuY2UgZGF0YSFcbiIsIF9fZnVuY19fKTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBmYWlsX3JlbGVhc2U7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvYXRtL3VlYWdsZS1hdG0uYyBiL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMKaW5kZXggNDMzM2RjNS4uZGY2NzgxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvYXRtL3VlYWdsZS1hdG0uYworKysgYi9kcml2ZXJzL3VzYi9hdG0vdWVhZ2xlLWF0bS5jCkBAIC0yMTk2LDE3ICsyMTk2LDEyIEBACiAJCWxvYWRfWElMSU5YX2Zpcm13YXJlKHNjKTsKIAogCWludHIgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwotCWlmICghaW50cikgewotCQl1ZWFfZXJyKElOU19UT19VU0JERVYoc2MpLAotCQkgICAgICAgImNhbm5vdCBhbGxvY2F0ZSBpbnRlcnJ1cHQgcGFja2FnZVxuIik7CisJaWYgKCFpbnRyKQogCQlnb3RvIGVycjA7Ci0JfQogCiAJc2MtPnVyYl9pbnQgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghc2MtPnVyYl9pbnQpIHsKLQkJdWVhX2VycihJTlNfVE9fVVNCREVWKHNjKSwgImNhbm5vdCBhbGxvY2F0ZSBpbnRlcnJ1cHQgVVJCXG4iKTsKKwlpZiAoIXNjLT51cmJfaW50KQogCQlnb3RvIGVycjE7Ci0JfQogCiAJdXNiX2ZpbGxfaW50X3VyYihzYy0+dXJiX2ludCwgc2MtPnVzYl9kZXYsCiAJCQkgdXNiX3JjdmludHBpcGUoc2MtPnVzYl9kZXYsIFVFQV9JTlRSX1BJUEUpLApAQCAtMjU2MSwxMCArMjU1Niw4IEBACiAJfQogCiAJc2MgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdWVhX3NvZnRjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzYykgewotCQl1ZWFfZXJyKHVzYiwgInVlYV9pbml0OiBub3QgZW5vdWdoIG1lbW9yeSAhXG4iKTsKKwlpZiAoIXNjKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlzYy0+dXNiX2RldiA9IHVzYjsKIAl1c2JhdG0tPmRyaXZlcl9kYXRhID0gc2M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9hdG0vdXNiYXRtLmMgYi9kcml2ZXJzL3VzYi9hdG0vdXNiYXRtLmMKaW5kZXggZGIzMjJkOS4uNGRlYzlkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvYXRtL3VzYmF0bS5jCisrKyBiL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uYwpAQCAtODE5LDcgKzgxOSw2IEBACiAKIAluZXcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdXNiYXRtX3ZjY19kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFuZXcpIHsKLQkJYXRtX2VycihpbnN0YW5jZSwgIiVzOiBubyBtZW1vcnkgZm9yIHZjY19kYXRhIVxuIiwgX19mdW5jX18pOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWw7CiAJfQpAQCAtMTAzMiwxMCArMTAzMSw4IEBACiAKIAkvKiBpbnN0YW5jZSBpbml0ICovCiAJaW5zdGFuY2UgPSBremFsbG9jKHNpemVvZigqaW5zdGFuY2UpICsgc2l6ZW9mKHN0cnVjdCB1cmIgKikgKiAobnVtX3Jjdl91cmJzICsgbnVtX3NuZF91cmJzKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpbnN0YW5jZSkgewotCQlkZXZfZXJyKGRldiwgIiVzOiBubyBtZW1vcnkgZm9yIGluc3RhbmNlIGRhdGEhXG4iLCBfX2Z1bmNfXyk7CisJaWYgKCFpbnN0YW5jZSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJLyogcHVibGljIGZpZWxkcyAqLwogCkBAIC0xMTQxLDcgKzExMzgsNiBAQAogCiAJCXVyYiA9IHVzYl9hbGxvY191cmIoaXNvX3BhY2tldHMsIEdGUF9LRVJORUwpOwogCQlpZiAoIXVyYikgewotCQkJZGV2X2VycihkZXYsICIlczogbm8gbWVtb3J5IGZvciB1cmIgJWQhXG4iLCBfX2Z1bmNfXywgaSk7CiAJCQllcnJvciA9IC1FTk9NRU07CiAJCQlnb3RvIGZhaWxfdW5iaW5kOwogCQl9CkBAIC0xMTUxLDcgKzExNDcsNiBAQAogCQkvKiB6ZXJvIHRoZSB0eCBwYWRkaW5nIHRvIGF2b2lkIGxlYWtpbmcgaW5mb3JtYXRpb24gKi8KIAkJYnVmZmVyID0ga3phbGxvYyhjaGFubmVsLT5idWZfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghYnVmZmVyKSB7Ci0JCQlkZXZfZXJyKGRldiwgIiVzOiBubyBtZW1vcnkgZm9yIGJ1ZmZlciAlZCFcbiIsIF9fZnVuY19fLCBpKTsKIAkJCWVycm9yID0gLUVOT01FTTsKIAkJCWdvdG8gZmFpbF91bmJpbmQ7CiAJCX0KQEAgLTExODIsNyArMTE3Nyw2IEBACiAJaW5zdGFuY2UtPmNlbGxfYnVmID0ga21hbGxvYyhpbnN0YW5jZS0+cnhfY2hhbm5lbC5zdHJpZGUsIEdGUF9LRVJORUwpOwogCiAJaWYgKCFpbnN0YW5jZS0+Y2VsbF9idWYpIHsKLQkJZGV2X2VycihkZXYsICIlczogbm8gbWVtb3J5IGZvciBjZWxsIGJ1ZmZlciFcbiIsIF9fZnVuY19fKTsKIAkJZXJyb3IgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWxfdW5iaW5kOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NpX2hkcmNfaW14LmMgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jaV9oZHJjX2lteC5jCmluZGV4IGRlZGMzM2UuLjA5OTE3OTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NpX2hkcmNfaW14LmMKKysrIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvY2lfaGRyY19pbXguYwpAQCAtMTQwLDYgKzE0MCw5IEBACiAJaWYgKG9mX2ZpbmRfcHJvcGVydHkobnAsICJkaXNhYmxlLW92ZXItY3VycmVudCIsIE5VTEwpKQogCQlkYXRhLT5kaXNhYmxlX29jID0gMTsKIAorCWlmIChvZl9maW5kX3Byb3BlcnR5KG5wLCAib3Zlci1jdXJyZW50LWFjdGl2ZS1oaWdoIiwgTlVMTCkpCisJCWRhdGEtPm9jX3BvbGFyaXR5ID0gMTsKKwogCWlmIChvZl9maW5kX3Byb3BlcnR5KG5wLCAiZXh0ZXJuYWwtdmJ1cy1kaXZpZGVyIiwgTlVMTCkpCiAJCWRhdGEtPmV2ZG8gPSAxOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jaV9oZHJjX2lteC5oIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvY2lfaGRyY19pbXguaAppbmRleCA2MzU3MTdlLi40MDlhYTVjYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NpX2hkcmNfaW14LmgKKysrIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvY2lfaGRyY19pbXguaApAQCAtMTcsNiArMTcsNyBAQAogCWludCBpbmRleDsKIAogCXVuc2lnbmVkIGludCBkaXNhYmxlX29jOjE7IC8qIG92ZXIgY3VycmVudCBkZXRlY3QgZGlzYWJsZWQgKi8KKwl1bnNpZ25lZCBpbnQgb2NfcG9sYXJpdHk6MTsgLyogb3ZlciBjdXJyZW50IHBvbGFyaXR5IGlmIG9jIGVuYWJsZWQgKi8KIAl1bnNpZ25lZCBpbnQgZXZkbzoxOyAvKiBzZXQgZXh0ZXJuYWwgdmJ1cyBkaXZpZGVyIG9wdGlvbiAqLwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2hpcGlkZWEvaG9zdC5jIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvaG9zdC5jCmluZGV4IDA1M2JhYzkuLjk2YWU2OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2hvc3QuYworKysgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS9ob3N0LmMKQEAgLTgxLDEyICs4MSwxNSBAQAogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IGhjZC0+c2VsZi5jb250cm9sbGVyOwogCXN0cnVjdCBjaV9oZHJjICpjaSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBlaGNpX2hjZCAqZWhjaSA9IGhjZF90b19laGNpKGhjZCk7CiAJaW50IHJldDsKIAogCXJldCA9IGVoY2lfc2V0dXAoaGNkKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJZWhjaS0+bmVlZF9pb193YXRjaGRvZyA9IDA7CisKIAljaV9wbGF0Zm9ybV9jb25maWd1cmUoY2kpOwogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL3VkYy5jIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvdWRjLmMKaW5kZXggMDY1ZjVkOS4uNjYxZjQzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2hpcGlkZWEvdWRjLmMKKysrIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvdWRjLmMKQEAgLTU5LDcgKzU5LDcgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgaHdfZXBfYml0KGludCBudW0sIGludCBkaXIpCiB7Ci0JcmV0dXJuIG51bSArIChkaXIgPyAxNiA6IDApOworCXJldHVybiBudW0gKyAoKGRpciA9PSBUWCkgPyAxNiA6IDApOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBlcF90b19iaXQoc3RydWN0IGNpX2hkcmMgKmNpLCBpbnQgbikKQEAgLTEyMSw5ICsxMjEsOCBAQAogICovCiBzdGF0aWMgaW50IGh3X2VwX2Rpc2FibGUoc3RydWN0IGNpX2hkcmMgKmNpLCBpbnQgbnVtLCBpbnQgZGlyKQogewotCWh3X2VwX2ZsdXNoKGNpLCBudW0sIGRpcik7CiAJaHdfd3JpdGUoY2ksIE9QX0VORFBUQ1RSTCArIG51bSwKLQkJIGRpciA/IEVORFBUQ1RSTF9UWEUgOiBFTkRQVENUUkxfUlhFLCAwKTsKKwkJIChkaXIgPT0gVFgpID8gRU5EUFRDVFJMX1RYRSA6IEVORFBUQ1RSTF9SWEUsIDApOwogCXJldHVybiAwOwogfQogCkBAIC0xMzksNyArMTM4LDcgQEAKIHsKIAl1MzIgbWFzaywgZGF0YTsKIAotCWlmIChkaXIpIHsKKwlpZiAoZGlyID09IFRYKSB7CiAJCW1hc2sgID0gRU5EUFRDVFJMX1RYVDsgIC8qIHR5cGUgICAgKi8KIAkJZGF0YSAgPSB0eXBlIDw8IF9fZmZzKG1hc2spOwogCkBAIC0xNzEsNyArMTcwLDcgQEAKICAqLwogc3RhdGljIGludCBod19lcF9nZXRfaGFsdChzdHJ1Y3QgY2lfaGRyYyAqY2ksIGludCBudW0sIGludCBkaXIpCiB7Ci0JdTMyIG1hc2sgPSBkaXIgPyBFTkRQVENUUkxfVFhTIDogRU5EUFRDVFJMX1JYUzsKKwl1MzIgbWFzayA9IChkaXIgPT0gVFgpID8gRU5EUFRDVFJMX1RYUyA6IEVORFBUQ1RSTF9SWFM7CiAKIAlyZXR1cm4gaHdfcmVhZChjaSwgT1BfRU5EUFRDVFJMICsgbnVtLCBtYXNrKSA/IDEgOiAwOwogfQpAQCAtMTg4LDYgKzE4Nyw5IEBACiB7CiAJaW50IG4gPSBod19lcF9iaXQobnVtLCBkaXIpOwogCisJLyogU3luY2hyb25pemUgYmVmb3JlIGVwIHByaW1lICovCisJd21iKCk7CisKIAlpZiAoaXNfY3RybCAmJiBkaXIgPT0gUlggJiYgaHdfcmVhZChjaSwgT1BfRU5EUFRTRVRVUFNUQVQsIEJJVChudW0pKSkKIAkJcmV0dXJuIC1FQUdBSU47CiAKQEAgLTIxOCw4ICsyMjAsOCBAQAogCiAJZG8gewogCQllbnVtIGNpX2h3X3JlZ3MgcmVnID0gT1BfRU5EUFRDVFJMICsgbnVtOwotCQl1MzIgbWFza194cyA9IGRpciA/IEVORFBUQ1RSTF9UWFMgOiBFTkRQVENUUkxfUlhTOwotCQl1MzIgbWFza194ciA9IGRpciA/IEVORFBUQ1RSTF9UWFIgOiBFTkRQVENUUkxfUlhSOworCQl1MzIgbWFza194cyA9IChkaXIgPT0gVFgpID8gRU5EUFRDVFJMX1RYUyA6IEVORFBUQ1RSTF9SWFM7CisJCXUzMiBtYXNrX3hyID0gKGRpciA9PSBUWCkgPyBFTkRQVENUUkxfVFhSIDogRU5EUFRDVFJMX1JYUjsKIAogCQkvKiBkYXRhIHRvZ2dsZSAtIHJlc2VydmVkIGZvciBFUDAgYnV0IGl0J3MgaW4gRVNTICovCiAJCWh3X3dyaXRlKGNpLCByZWcsIG1hc2tfeHN8bWFza194ciwKQEAgLTM0OCw4ICszNTAsNyBAQAogCWlmIChub2RlID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jbm9kZS0+cHRyID0gZG1hX3Bvb2xfemFsbG9jKGh3ZXAtPnRkX3Bvb2wsIEdGUF9BVE9NSUMsCi0JCQkJICAgJm5vZGUtPmRtYSk7CisJbm9kZS0+cHRyID0gZG1hX3Bvb2xfemFsbG9jKGh3ZXAtPnRkX3Bvb2wsIEdGUF9BVE9NSUMsICZub2RlLT5kbWEpOwogCWlmIChub2RlLT5wdHIgPT0gTlVMTCkgewogCQlrZnJlZShub2RlKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC01MDYsOCArNTA3LDYgQEAKIAkJaHdlcC0+cWgucHRyLT5jYXAgfD0gbXVsIDw8IF9fZmZzKFFIX01VTFQpOwogCX0KIAotCXdtYigpOyAgIC8qIHN5bmNocm9uaXplIGJlZm9yZSBlcCBwcmltZSAqLwotCiAJcmV0ID0gaHdfZXBfcHJpbWUoY2ksIGh3ZXAtPm51bSwgaHdlcC0+ZGlyLAogCQkJICAgaHdlcC0+dHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MKTsKIGRvbmU6CkBAIC01MzQsOSArNTMzLDYgQEAKIAlod2VwLT5xaC5wdHItPnRkLnRva2VuICY9CiAJCWNwdV90b19sZTMyKH4oVERfU1RBVFVTX0hBTFRFRCB8IFREX1NUQVRVU19BQ1RJVkUpKTsKIAotCS8qIFN5bmNocm9uaXplIGJlZm9yZSBlcCBwcmltZSAqLwotCXdtYigpOwotCiAJcmV0dXJuIGh3X2VwX3ByaW1lKGNpLCBod2VwLT5udW0sIGh3ZXAtPmRpciwKIAkJCQlod2VwLT50eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wpOwogfQpAQCAtNTkwLDcgKzU4Niw3IEBACiAJCX0KIAogCQlpZiAocmVtYWluaW5nX2xlbmd0aCkgewotCQkJaWYgKGh3ZXAtPmRpcikgeworCQkJaWYgKGh3ZXAtPmRpciA9PSBUWCkgewogCQkJCWh3cmVxLT5yZXEuc3RhdHVzID0gLUVQUk9UTzsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTk0OSw2ICs5NDUsMTUgQEAKIAlpbnQgcmV0dmFsOwogCXN0cnVjdCBjaV9od19lcCAqaHdlcDsKIAorCS8qCisJICogVW5leHBlY3RlZCBVU0IgY29udHJvbGxlciBiZWhhdmlvciwgY2F1c2VkIGJ5IGJhZCBzaWduYWwgaW50ZWdyaXR5CisJICogb3IgZ3JvdW5kIHJlZmVyZW5jZSBwcm9ibGVtcywgY2FuIGxlYWQgdG8gaXNyX3NldHVwX3N0YXR1c19waGFzZQorCSAqIGJlaW5nIGNhbGxlZCB3aXRoIGNpLT5zdGF0dXMgZXF1YWwgdG8gTlVMTC4KKwkgKiBJZiB0aGlzIHNpdHVhdGlvbiBvY2N1cnMsIHlvdSBzaG91bGQgcmV2aWV3IHlvdXIgVVNCIGhhcmR3YXJlIGRlc2lnbi4KKwkgKi8KKwlpZiAoV0FSTl9PTl9PTkNFKCFjaS0+c3RhdHVzKSkKKwkJcmV0dXJuIC1FUElQRTsKKwogCWh3ZXAgPSAoY2ktPmVwMF9kaXIgPT0gVFgpID8gY2ktPmVwMG91dCA6IGNpLT5lcDBpbjsKIAljaS0+c3RhdHVzLT5jb250ZXh0ID0gY2k7CiAJY2ktPnN0YXR1cy0+Y29tcGxldGUgPSBpc3Jfc2V0dXBfc3RhdHVzX2NvbXBsZXRlOwpAQCAtMTA0Miw5ICsxMDQ3LDkgQEAKIAkJCWlmIChyZXEud0xlbmd0aCAhPSAwKQogCQkJCWJyZWFrOwogCQkJbnVtICA9IGxlMTZfdG9fY3B1KHJlcS53SW5kZXgpOwotCQkJZGlyID0gbnVtICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLOworCQkJZGlyID0gKG51bSAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPyBUWCA6IFJYOwogCQkJbnVtICY9IFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKLQkJCWlmIChkaXIpIC8qIFRYICovCisJCQlpZiAoZGlyID09IFRYKQogCQkJCW51bSArPSBjaS0+aHdfZXBfbWF4IC8gMjsKIAkJCWlmICghY2ktPmNpX2h3X2VwW251bV0ud2VkZ2UpIHsKIAkJCQlzcGluX3VubG9jaygmY2ktPmxvY2spOwpAQCAtMTA5NCw5ICsxMDk5LDkgQEAKIAkJCWlmIChyZXEud0xlbmd0aCAhPSAwKQogCQkJCWJyZWFrOwogCQkJbnVtICA9IGxlMTZfdG9fY3B1KHJlcS53SW5kZXgpOwotCQkJZGlyID0gbnVtICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLOworCQkJZGlyID0gKG51bSAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPyBUWCA6IFJYOwogCQkJbnVtICY9IFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKLQkJCWlmIChkaXIpIC8qIFRYICovCisJCQlpZiAoZGlyID09IFRYKQogCQkJCW51bSArPSBjaS0+aHdfZXBfbWF4IC8gMjsKIAogCQkJc3Bpbl91bmxvY2soJmNpLT5sb2NrKTsKQEAgLTE1OTYsOCArMTYwMSwxMSBAQAogewogCXN0cnVjdCBjaV9oZHJjICpjaSA9IGNvbnRhaW5lcl9vZihfZ2FkZ2V0LCBzdHJ1Y3QgY2lfaGRyYywgZ2FkZ2V0KTsKIAotCS8qIERhdGErIHB1bGx1cCBjb250cm9sbGVkIGJ5IE9URyBzdGF0ZSBtYWNoaW5lIGluIE9URyBmc20gbW9kZSAqLwotCWlmIChjaV9vdGdfaXNfZnNtX21vZGUoY2kpKQorCS8qCisJICogRGF0YSsgcHVsbHVwIGNvbnRyb2xsZWQgYnkgT1RHIHN0YXRlIG1hY2hpbmUgaW4gT1RHIGZzbSBtb2RlOworCSAqIGFuZCBkb24ndCB0b3VjaCBEYXRhKyBpbiBob3N0IG1vZGUgZm9yIGR1YWwgcm9sZSBjb25maWcuCisJICovCisJaWYgKGNpX290Z19pc19mc21fbW9kZShjaSkgfHwgY2ktPnJvbGUgPT0gQ0lfUk9MRV9IT1NUKQogCQlyZXR1cm4gMDsKIAogCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJmNpLT5nYWRnZXQuZGV2KTsKQEAgLTE2NjgsMTIgKzE2NzYsMTAgQEAKIAkJCXVzYl9lcF9zZXRfbWF4cGFja2V0X2xpbWl0KCZod2VwLT5lcCwgKHVuc2lnbmVkIHNob3J0KX4wKTsKIAogCQkJSU5JVF9MSVNUX0hFQUQoJmh3ZXAtPnFoLnF1ZXVlKTsKLQkJCWh3ZXAtPnFoLnB0ciA9IGRtYV9wb29sX2FsbG9jKGNpLT5xaF9wb29sLCBHRlBfS0VSTkVMLAotCQkJCQkJICAgICAmaHdlcC0+cWguZG1hKTsKKwkJCWh3ZXAtPnFoLnB0ciA9IGRtYV9wb29sX3phbGxvYyhjaS0+cWhfcG9vbCwgR0ZQX0tFUk5FTCwKKwkJCQkJCSAgICAgICAmaHdlcC0+cWguZG1hKTsKIAkJCWlmIChod2VwLT5xaC5wdHIgPT0gTlVMTCkKIAkJCQlyZXR2YWwgPSAtRU5PTUVNOwotCQkJZWxzZQotCQkJCW1lbXNldChod2VwLT5xaC5wdHIsIDAsIHNpemVvZigqaHdlcC0+cWgucHRyKSk7CiAKIAkJCS8qCiAJCQkgKiBzZXQgdXAgc2hvcnRoYW5kcyBmb3IgZXAwIG91dCBhbmQgaW4gZW5kcG9pbnRzLApAQCAtMTk4Nyw3ICsxOTkzLDcgQEAKIAlpZiAoIWh3X3JlYWQoY2ksIENBUF9EQ0NQQVJBTVMsIERDQ1BBUkFNU19EQykpCiAJCXJldHVybiAtRU5YSU87CiAKLQlyZHJ2ID0gZGV2bV9remFsbG9jKGNpLT5kZXYsIHNpemVvZihzdHJ1Y3QgY2lfcm9sZV9kcml2ZXIpLCBHRlBfS0VSTkVMKTsKKwlyZHJ2ID0gZGV2bV9remFsbG9jKGNpLT5kZXYsIHNpemVvZigqcmRydiksIEdGUF9LRVJORUwpOwogCWlmICghcmRydikKIAkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL3VzYm1pc2NfaW14LmMgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS91c2JtaXNjX2lteC5jCmluZGV4IGFiOGIwMjcuLjIwZDAyYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL3VzYm1pc2NfaW14LmMKKysrIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvdXNibWlzY19pbXguYwpAQCAtNTYsNiArNTYsNyBAQAogCiAjZGVmaW5lIE1YNl9CTV9OT05fQlVSU1RfU0VUVElORwlCSVQoMSkKICNkZWZpbmUgTVg2X0JNX09WRVJfQ1VSX0RJUwkJQklUKDcpCisjZGVmaW5lIE1YNl9CTV9PVkVSX0NVUl9QT0xBUklUWQlCSVQoOCkKICNkZWZpbmUgTVg2X0JNX1dBS0VVUF9FTkFCTEUJCUJJVCgxMCkKICNkZWZpbmUgTVg2X0JNX0lEX1dBS0VVUAkJQklUKDE2KQogI2RlZmluZSBNWDZfQk1fVkJVU19XQUtFVVAJCUJJVCgxNykKQEAgLTI2NiwxMSArMjY3LDE0IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdXNibWlzYy0+bG9jaywgZmxhZ3MpOwogCisJcmVnID0gcmVhZGwodXNibWlzYy0+YmFzZSArIGRhdGEtPmluZGV4ICogNCk7CiAJaWYgKGRhdGEtPmRpc2FibGVfb2MpIHsKLQkJcmVnID0gcmVhZGwodXNibWlzYy0+YmFzZSArIGRhdGEtPmluZGV4ICogNCk7Ci0JCXdyaXRlbChyZWcgfCBNWDZfQk1fT1ZFUl9DVVJfRElTLAotCQkJdXNibWlzYy0+YmFzZSArIGRhdGEtPmluZGV4ICogNCk7CisJCXJlZyB8PSBNWDZfQk1fT1ZFUl9DVVJfRElTOworCX0gZWxzZSBpZiAoZGF0YS0+b2NfcG9sYXJpdHkgPT0gMSkgeworCQkvKiBIaWdoIGFjdGl2ZSAqLworCQlyZWcgJj0gfihNWDZfQk1fT1ZFUl9DVVJfRElTIHwgTVg2X0JNX09WRVJfQ1VSX1BPTEFSSVRZKTsKIAl9CisJd3JpdGVsKHJlZywgdXNibWlzYy0+YmFzZSArIGRhdGEtPmluZGV4ICogNCk7CiAKIAkvKiBTb0Mgbm9uLWJ1cnN0IHNldHRpbmcgKi8KIAlyZWcgPSByZWFkbCh1c2JtaXNjLT5iYXNlICsgZGF0YS0+aW5kZXggKiA0KTsKQEAgLTM2NSwxMCArMzY5LDE0IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnVzYm1pc2MtPmxvY2ssIGZsYWdzKTsKKwlyZWcgPSByZWFkbCh1c2JtaXNjLT5iYXNlKTsKIAlpZiAoZGF0YS0+ZGlzYWJsZV9vYykgewotCQlyZWcgPSByZWFkbCh1c2JtaXNjLT5iYXNlKTsKLQkJd3JpdGVsKHJlZyB8IE1YNl9CTV9PVkVSX0NVUl9ESVMsIHVzYm1pc2MtPmJhc2UpOworCQlyZWcgfD0gTVg2X0JNX09WRVJfQ1VSX0RJUzsKKwl9IGVsc2UgaWYgKGRhdGEtPm9jX3BvbGFyaXR5ID09IDEpIHsKKwkJLyogSGlnaCBhY3RpdmUgKi8KKwkJcmVnICY9IH4oTVg2X0JNX09WRVJfQ1VSX0RJUyB8IE1YNl9CTV9PVkVSX0NVUl9QT0xBUklUWSk7CiAJfQorCXdyaXRlbChyZWcsIHVzYm1pc2MtPmJhc2UpOwogCiAJcmVnID0gcmVhZGwodXNibWlzYy0+YmFzZSArIE1YN0RfVVNCTkNfVVNCX0NUUkwyKTsKIAlyZWcgJj0gfk1YN0RfVVNCX1ZCVVNfV0FLRVVQX1NPVVJDRV9NQVNLOwpAQCAtNDkyLDYgKzUwMCwxMCBAQAogCQkuY29tcGF0aWJsZSA9ICJmc2wsaW14NnVsLXVzYm1pc2MiLAogCQkuZGF0YSA9ICZpbXg2c3hfdXNibWlzY19vcHMsCiAJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gImZzbCxpbXg3ZC11c2JtaXNjIiwKKwkJLmRhdGEgPSAmaW14N2RfdXNibWlzY19vcHMsCisJfSwKIAl7IC8qIHNlbnRpbmVsICovIH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB1c2JtaXNjX2lteF9kdF9pZHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jCmluZGV4IDcxOTEyMzAuLjc4ZjBmODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYworKysgYi9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMKQEAgLTM2OCwxNyArMzY4LDE3IEBACiAJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoaW5kZXgsICZhY20tPnJlYWRfdXJic19mcmVlKSkKIAkJcmV0dXJuIDA7CiAKLQlkZXZfdmRiZygmYWNtLT5kYXRhLT5kZXYsICIlcyAtIHVyYiAlZFxuIiwgX19mdW5jX18sIGluZGV4KTsKLQogCXJlcyA9IHVzYl9zdWJtaXRfdXJiKGFjbS0+cmVhZF91cmJzW2luZGV4XSwgbWVtX2ZsYWdzKTsKIAlpZiAocmVzKSB7CiAJCWlmIChyZXMgIT0gLUVQRVJNKSB7CiAJCQlkZXZfZXJyKCZhY20tPmRhdGEtPmRldiwKLQkJCQkJIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkOiAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHJlcyk7CisJCQkJCSJ1cmIgJWQgZmFpbGVkIHN1Ym1pc3Npb24gd2l0aCAlZFxuIiwKKwkJCQkJaW5kZXgsIHJlcyk7CiAJCX0KIAkJc2V0X2JpdChpbmRleCwgJmFjbS0+cmVhZF91cmJzX2ZyZWUpOwogCQlyZXR1cm4gcmVzOworCX0gZWxzZSB7CisJCWRldl92ZGJnKCZhY20tPmRhdGEtPmRldiwgInN1Ym1pdHRlZCB1cmIgJWRcbiIsIGluZGV4KTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTQxNSw4ICs0MTUsOSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCi0JZGV2X3ZkYmcoJmFjbS0+ZGF0YS0+ZGV2LCAiJXMgLSB1cmIgJWQsIGxlbiAlZFxuIiwgX19mdW5jX18sCi0JCQkJCXJiLT5pbmRleCwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwlkZXZfdmRiZygmYWNtLT5kYXRhLT5kZXYsICJnb3QgdXJiICVkLCBsZW4gJWQsIHN0YXR1cyAlZFxuIiwKKwkJCQkJcmItPmluZGV4LCB1cmItPmFjdHVhbF9sZW5ndGgsCisJCQkJCXN0YXR1cyk7CiAKIAlpZiAoIWFjbS0+ZGV2KSB7CiAJCXNldF9iaXQocmItPmluZGV4LCAmYWNtLT5yZWFkX3VyYnNfZnJlZSk7CkBAIC00MjYsOCArNDI3LDYgQEAKIAogCWlmIChzdGF0dXMpIHsKIAkJc2V0X2JpdChyYi0+aW5kZXgsICZhY20tPnJlYWRfdXJic19mcmVlKTsKLQkJZGV2X2RiZygmYWNtLT5kYXRhLT5kZXYsICIlcyAtIG5vbi16ZXJvIHVyYiBzdGF0dXM6ICVkXG4iLAotCQkJCQkJCV9fZnVuY19fLCBzdGF0dXMpOwogCQlpZiAoKHN0YXR1cyAhPSAtRU5PRU5UKSB8fCAodXJiLT5hY3R1YWxfbGVuZ3RoID09IDApKQogCQkJcmV0dXJuOwogCX0KQEAgLTQ2Miw4ICs0NjEsNyBAQAogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAogCWlmIChzdGF0dXMgfHwgKHVyYi0+YWN0dWFsX2xlbmd0aCAhPSB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpKQotCQlkZXZfdmRiZygmYWNtLT5kYXRhLT5kZXYsICIlcyAtIGxlbiAlZC8lZCwgc3RhdHVzICVkXG4iLAotCQkJX19mdW5jX18sCisJCWRldl92ZGJnKCZhY20tPmRhdGEtPmRldiwgIndyb3RlIGxlbiAlZC8lZCwgc3RhdHVzICVkXG4iLAogCQkJdXJiLT5hY3R1YWxfbGVuZ3RoLAogCQkJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAogCQkJc3RhdHVzKTsKQEAgLTQ3OCw4ICs0NzYsNiBAQAogewogCXN0cnVjdCBhY20gKmFjbSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWNtLCB3b3JrKTsKIAotCWRldl92ZGJnKCZhY20tPmRhdGEtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KIAl0dHlfcG9ydF90dHlfd2FrZXVwKCZhY20tPnBvcnQpOwogfQogCkBAIC00OTIsOCArNDg4LDYgQEAKIAlzdHJ1Y3QgYWNtICphY207CiAJaW50IHJldHZhbDsKIAotCWRldl9kYmcodHR5LT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwotCiAJYWNtID0gYWNtX2dldF9ieV9taW5vcih0dHktPmluZGV4KTsKIAlpZiAoIWFjbSkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC01MTUsOCArNTA5LDYgQEAKIHsKIAlzdHJ1Y3QgYWNtICphY20gPSB0dHktPmRyaXZlcl9kYXRhOwogCi0JZGV2X2RiZyh0dHktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KIAlyZXR1cm4gdHR5X3BvcnRfb3BlbigmYWNtLT5wb3J0LCB0dHksIGZpbHApOwogfQogCkBAIC01NDUsOCArNTM3LDYgQEAKIAlpbnQgcmV0dmFsID0gLUVOT0RFVjsKIAlpbnQgaTsKIAotCWRldl9kYmcoJmFjbS0+Y29udHJvbC0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKLQogCW11dGV4X2xvY2soJmFjbS0+bXV0ZXgpOwogCWlmIChhY20tPmRpc2Nvbm5lY3RlZCkKIAkJZ290byBkaXNjb25uZWN0ZWQ7CkBAIC02MDcsOCArNTk3LDYgQEAKIHsKIAlzdHJ1Y3QgYWNtICphY20gPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IGFjbSwgcG9ydCk7CiAKLQlkZXZfZGJnKCZhY20tPmNvbnRyb2wtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KIAlhY21fcmVsZWFzZV9taW5vcihhY20pOwogCXVzYl9wdXRfaW50ZihhY20tPmNvbnRyb2wpOwogCWtmcmVlKGFjbS0+Y291bnRyeV9jb2Rlcyk7CkBAIC02MjIsOCArNjEwLDYgQEAKIAlzdHJ1Y3QgYWNtX3diICp3YjsKIAlpbnQgaTsKIAotCWRldl9kYmcoJmFjbS0+Y29udHJvbC0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKLQogCS8qCiAJICogTmVlZCB0byBncmFiIHdyaXRlX2xvY2sgdG8gcHJldmVudCByYWNlIHdpdGggcmVzdW1lLCBidXQgbm8gbmVlZCB0bwogCSAqIGhvbGQgaXQgZHVlIHRvIHRoZSB0dHktcG9ydCBpbml0aWFsaXNlZCBmbGFnLgpAQCAtNjU0LDIxICs2NDAsMjEgQEAKIHN0YXRpYyB2b2lkIGFjbV90dHlfY2xlYW51cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCXN0cnVjdCBhY20gKmFjbSA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JZGV2X2RiZygmYWNtLT5jb250cm9sLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCiAJdHR5X3BvcnRfcHV0KCZhY20tPnBvcnQpOwogfQogCiBzdGF0aWMgdm9pZCBhY21fdHR5X2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCXN0cnVjdCBhY20gKmFjbSA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JZGV2X2RiZygmYWNtLT5jb250cm9sLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCiAJdHR5X3BvcnRfaGFuZ3VwKCZhY20tPnBvcnQpOwogfQogCiBzdGF0aWMgdm9pZCBhY21fdHR5X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQogewogCXN0cnVjdCBhY20gKmFjbSA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JZGV2X2RiZygmYWNtLT5jb250cm9sLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCiAJdHR5X3BvcnRfY2xvc2UoJmFjbS0+cG9ydCwgdHR5LCBmaWxwKTsKIH0KIApAQCAtNjg0LDcgKzY3MCw3IEBACiAJaWYgKCFjb3VudCkKIAkJcmV0dXJuIDA7CiAKLQlkZXZfdmRiZygmYWNtLT5kYXRhLT5kZXYsICIlcyAtIGNvdW50ICVkXG4iLCBfX2Z1bmNfXywgY291bnQpOworCWRldl92ZGJnKCZhY20tPmRhdGEtPmRldiwgIiVkIGJ5dGVzIGZyb20gdHR5IGxheWVyXG4iLCBjb3VudCk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYWNtLT53cml0ZV9sb2NrLCBmbGFncyk7CiAJd2JuID0gYWNtX3diX2FsbG9jKGFjbSk7CkBAIC03MDEsNyArNjg3LDcgQEAKIAl9CiAKIAljb3VudCA9IChjb3VudCA+IGFjbS0+d3JpdGVzaXplKSA/IGFjbS0+d3JpdGVzaXplIDogY291bnQ7Ci0JZGV2X3ZkYmcoJmFjbS0+ZGF0YS0+ZGV2LCAiJXMgLSB3cml0ZSAlZFxuIiwgX19mdW5jX18sIGNvdW50KTsKKwlkZXZfdmRiZygmYWNtLT5kYXRhLT5kZXYsICJ3cml0aW5nICVkIGJ5dGVzXG4iLCBjb3VudCk7CiAJbWVtY3B5KHdiLT5idWYsIGJ1ZiwgY291bnQpOwogCXdiLT5sZW4gPSBjb3VudDsKIApAQCAtMTE5Myw2ICsxMTc5LDkgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJaWYgKCFpbnRmLT5jdXJfYWx0c2V0dGluZykKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlpZiAoIWJ1ZmxlbikgewogCQlpZiAoaW50Zi0+Y3VyX2FsdHNldHRpbmctPmVuZHBvaW50ICYmCiAJCQkJaW50Zi0+Y3VyX2FsdHNldHRpbmctPmVuZHBvaW50LT5leHRyYWxlbiAmJgpAQCAtMTI0Niw2ICsxMjM1LDggQEAKIAkJZGV2X2RiZygmaW50Zi0+ZGV2LCAibm8gaW50ZXJmYWNlc1xuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KKwlpZiAoIWRhdGFfaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZyB8fCAhY29udHJvbF9pbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nKQorCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmIChkYXRhX2ludGZfbnVtICE9IGNhbGxfaW50Zl9udW0pCiAJCWRldl9kYmcoJmludGYtPmRldiwgIlNlcGFyYXRlIGNhbGwgY29udHJvbCBpbnRlcmZhY2UuIFRoYXQgaXMgbm90IGZ1bGx5IHN1cHBvcnRlZC5cbiIpOwpAQCAtMTM1NCw3ICsxMzQ1LDYgQEAKIAlzcGluX2xvY2tfaW5pdCgmYWNtLT53cml0ZV9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmYWNtLT5yZWFkX2xvY2spOwogCW11dGV4X2luaXQoJmFjbS0+bXV0ZXgpOwotCWFjbS0+cnhfZW5kcG9pbnQgPSB1c2JfcmN2YnVsa3BpcGUodXNiX2RldiwgZXByZWFkLT5iRW5kcG9pbnRBZGRyZXNzKTsKIAlhY20tPmlzX2ludF9lcCA9IHVzYl9lbmRwb2ludF94ZmVyX2ludChlcHJlYWQpOwogCWlmIChhY20tPmlzX2ludF9lcCkKIAkJYWNtLT5iSW50ZXJ2YWwgPSBlcHJlYWQtPmJJbnRlcnZhbDsKQEAgLTEzOTQsMTQgKzEzODQsMTQgQEAKIAkJdXJiLT50cmFuc2Zlcl9kbWEgPSByYi0+ZG1hOwogCQlpZiAoYWNtLT5pc19pbnRfZXApIHsKIAkJCXVzYl9maWxsX2ludF91cmIodXJiLCBhY20tPmRldiwKLQkJCQkJIGFjbS0+cnhfZW5kcG9pbnQsCisJCQkJCSB1c2JfcmN2aW50cGlwZSh1c2JfZGV2LCBlcHJlYWQtPmJFbmRwb2ludEFkZHJlc3MpLAogCQkJCQkgcmItPmJhc2UsCiAJCQkJCSBhY20tPnJlYWRzaXplLAogCQkJCQkgYWNtX3JlYWRfYnVsa19jYWxsYmFjaywgcmIsCiAJCQkJCSBhY20tPmJJbnRlcnZhbCk7CiAJCX0gZWxzZSB7CiAJCQl1c2JfZmlsbF9idWxrX3VyYih1cmIsIGFjbS0+ZGV2LAotCQkJCQkgIGFjbS0+cnhfZW5kcG9pbnQsCisJCQkJCSAgdXNiX3JjdmJ1bGtwaXBlKHVzYl9kZXYsIGVwcmVhZC0+YkVuZHBvaW50QWRkcmVzcyksCiAJCQkJCSAgcmItPmJhc2UsCiAJCQkJCSAgYWNtLT5yZWFkc2l6ZSwKIAkJCQkJICBhY21fcmVhZF9idWxrX2NhbGxiYWNrLCByYik7CkBAIC0xNTM0LDggKzE1MjQsNiBAQAogewogCWludCBpOwogCi0JZGV2X2RiZygmYWNtLT5jb250cm9sLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwotCiAJdXNiX2tpbGxfdXJiKGFjbS0+Y3RybHVyYik7CiAJZm9yIChpID0gMDsgaSA8IEFDTV9OVzsgaSsrKQogCQl1c2Jfa2lsbF91cmIoYWNtLT53YltpXS51cmIpOwpAQCAtMTU1Miw4ICsxNTQwLDYgQEAKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCWludCBpOwogCi0JZGV2X2RiZygmaW50Zi0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKLQogCS8qIHNpYmxpbmcgaW50ZXJmYWNlIGlzIGFscmVhZHkgY2xlYW5pbmcgdXAgKi8KIAlpZiAoIWFjbSkKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5oIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5oCmluZGV4IDA1Y2UzMDguLjFmMWVhYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uaAorKysgYi9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmgKQEAgLTk2LDcgKzk2LDYgQEAKIAlzdHJ1Y3QgYWNtX3JiIHJlYWRfYnVmZmVyc1tBQ01fTlJdOwogCXN0cnVjdCBhY21fd2IgKnB1dGJ1ZmZlcjsJCQkvKiBmb3IgYWNtX3R0eV9wdXRfY2hhcigpICovCiAJaW50IHJ4X2J1ZmxpbWl0OwotCWludCByeF9lbmRwb2ludDsKIAlzcGlubG9ja190IHJlYWRfbG9jazsKIAlpbnQgd3JpdGVfdXNlZDsJCQkJCS8qIG51bWJlciBvZiBub24tZW1wdHkgd3JpdGUgYnVmZmVycyAqLwogCWludCB0cmFuc21pdHRpbmc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtd2RtLmMgYi9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtd2RtLmMKaW5kZXggMzM3OTQ4Yy4uMGE2MzY5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2xhc3MvY2RjLXdkbS5jCisrKyBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy13ZG0uYwpAQCAtNTgsNiArNTgsNyBAQAogI2RlZmluZSBXRE1fU1VTUEVORElORwkJOAogI2RlZmluZSBXRE1fUkVTRVRUSU5HCQk5CiAjZGVmaW5lIFdETV9PVkVSRkxPVwkJMTAKKyNkZWZpbmUgV0RNX0RSQUlOX09OX09QRU4JMTEKIAogI2RlZmluZSBXRE1fTUFYCQkJMTYKIApAQCAtMTU0LDYgKzE1NSw5IEBACiAJd2FrZV91cCgmZGVzYy0+d2FpdCk7CiB9CiAKKy8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3N0YXRpYyBpbnQgc2VydmljZV9vdXRzdGFuZGluZ19pbnRlcnJ1cHQoc3RydWN0IHdkbV9kZXZpY2UgKmRlc2MpOworCiBzdGF0aWMgdm9pZCB3ZG1faW5fY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewogCXN0cnVjdCB3ZG1fZGV2aWNlICpkZXNjID0gdXJiLT5jb250ZXh0OwpAQCAtMTY3LDE4ICsxNzEsMTggQEAKIAkJc3dpdGNoIChzdGF0dXMpIHsKIAkJY2FzZSAtRU5PRU5UOgogCQkJZGV2X2RiZygmZGVzYy0+aW50Zi0+ZGV2LAotCQkJCSJub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6IC1FTk9FTlQiKTsKKwkJCQkibm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAtRU5PRU5UXG4iKTsKIAkJCWdvdG8gc2tpcF9lcnJvcjsKIAkJY2FzZSAtRUNPTk5SRVNFVDoKIAkJCWRldl9kYmcoJmRlc2MtPmludGYtPmRldiwKLQkJCQkibm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAtRUNPTk5SRVNFVCIpOworCQkJCSJub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6IC1FQ09OTlJFU0VUXG4iKTsKIAkJCWdvdG8gc2tpcF9lcnJvcjsKIAkJY2FzZSAtRVNIVVRET1dOOgogCQkJZGV2X2RiZygmZGVzYy0+aW50Zi0+ZGV2LAotCQkJCSJub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6IC1FU0hVVERPV04iKTsKKwkJCQkibm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAtRVNIVVRET1dOXG4iKTsKIAkJCWdvdG8gc2tpcF9lcnJvcjsKIAkJY2FzZSAtRVBJUEU6Ci0JCQlkZXZfZXJyKCZkZXNjLT5pbnRmLT5kZXYsCisJCQlkZXZfZGJnKCZkZXNjLT5pbnRmLT5kZXYsCiAJCQkJIm5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogLUVQSVBFXG4iKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgpAQCAtMTg4LDcgKzE5MiwxMyBAQAogCQl9CiAJfQogCi0JZGVzYy0+cmVyciA9IHN0YXR1czsKKwkvKgorCSAqIG9ubHkgc2V0IGEgbmV3IGVycm9yIGlmIHRoZXJlIGlzIG5vIHByZXZpb3VzIGVycm9yLgorCSAqIEVycm9ycyBhcmUgb25seSBjbGVhcmVkIGR1cmluZyByZWFkL29wZW4KKwkgKi8KKwlpZiAoZGVzYy0+cmVyciAgPT0gMCkKKwkJZGVzYy0+cmVyciA9IHN0YXR1czsKKwogCWlmIChsZW5ndGggKyBkZXNjLT5sZW5ndGggPiBkZXNjLT53TWF4Q29tbWFuZCkgewogCQkvKiBUaGUgYnVmZmVyIHdvdWxkIG92ZXJmbG93ICovCiAJCXNldF9iaXQoV0RNX09WRVJGTE9XLCAmZGVzYy0+ZmxhZ3MpOwpAQCAtMjAwLDEwICsyMTAsNDAgQEAKIAkJCWRlc2MtPnJlc2xlbmd0aCA9IGxlbmd0aDsKIAkJfQogCX0KKworCS8qCisJICogSGFuZGxpbmcgZGV2aWNlcyB3aXRoIHRoZSBXRE1fRFJBSU5fT05fT1BFTiBmbGFnIHNldDoKKwkgKiBJZiBkZXNjLT5yZXNwX2NvdW50IGlzIHVuc2V0LCB0aGVuIHRoZSB1cmIgd2FzIHN1Ym1pdHRlZAorCSAqIHdpdGhvdXQgYSBwcmlvciBub3RpZmljYXRpb24uICBJZiB0aGUgZGV2aWNlIHJldHVybmVkIGFueQorCSAqIGRhdGEsIHRoZW4gdGhpcyBpbXBsaWVzIHRoYXQgaXQgaGFkIG1lc3NhZ2VzIHF1ZXVlZCB3aXRob3V0CisJICogbm90aWZ5aW5nIHVzLiAgQ29udGludWUgcmVhZGluZyB1bnRpbCB0aGF0IHF1ZXVlIGlzIGZsdXNoZWQuCisJICovCisJaWYgKCFkZXNjLT5yZXNwX2NvdW50KSB7CisJCWlmICghbGVuZ3RoKSB7CisJCQkvKiBkbyBub3QgcHJvcGFnYXRlIHRoZSBleHBlY3RlZCAtRVBJUEUgKi8KKwkJCWRlc2MtPnJlcnIgPSAwOworCQkJZ290byB1bmxvY2s7CisJCX0KKwkJZGV2X2RiZygmZGVzYy0+aW50Zi0+ZGV2LCAiZ290ICVkIGJ5dGVzIHdpdGhvdXQgbm90aWZpY2F0aW9uXG4iLCBsZW5ndGgpOworCQlzZXRfYml0KFdETV9SRVNQT05ESU5HLCAmZGVzYy0+ZmxhZ3MpOworCQl1c2Jfc3VibWl0X3VyYihkZXNjLT5yZXNwb25zZSwgR0ZQX0FUT01JQyk7CisJfQorCiBza2lwX2Vycm9yOgorCXNldF9iaXQoV0RNX1JFQUQsICZkZXNjLT5mbGFncyk7CiAJd2FrZV91cCgmZGVzYy0+d2FpdCk7CiAKLQlzZXRfYml0KFdETV9SRUFELCAmZGVzYy0+ZmxhZ3MpOworCWlmIChkZXNjLT5yZXJyKSB7CisJCS8qCisJCSAqIFNpbmNlIHRoZXJlIHdhcyBhbiBlcnJvciwgdXNlcnNwYWNlIG1heSBkZWNpZGUgdG8gbm90IHJlYWQKKwkJICogYW55IGRhdGEgYWZ0ZXIgcG9sbCdpbmcuCisJCSAqIFdlIHNob3VsZCByZXNwb25kIHRvIGZ1cnRoZXIgYXR0ZW1wdHMgZnJvbSB0aGUgZGV2aWNlIHRvIHNlbmQKKwkJICogZGF0YSwgc28gdGhhdCB3ZSBjYW4gZ2V0IHVuc3R1Y2suCisJCSAqLworCQlzZXJ2aWNlX291dHN0YW5kaW5nX2ludGVycnVwdChkZXNjKTsKKwl9CisKK3VubG9jazoKIAlzcGluX3VubG9jaygmZGVzYy0+aXVzcGluKTsKIH0KIApAQCAtMjQ0LDE4ICsyODQsMTggQEAKIAlzd2l0Y2ggKGRyLT5iTm90aWZpY2F0aW9uVHlwZSkgewogCWNhc2UgVVNCX0NEQ19OT1RJRllfUkVTUE9OU0VfQVZBSUxBQkxFOgogCQlkZXZfZGJnKCZkZXNjLT5pbnRmLT5kZXYsCi0JCQkiTk9USUZZX1JFU1BPTlNFX0FWQUlMQUJMRSByZWNlaXZlZDogaW5kZXggJWQgbGVuICVkIiwKKwkJCSJOT1RJRllfUkVTUE9OU0VfQVZBSUxBQkxFIHJlY2VpdmVkOiBpbmRleCAlZCBsZW4gJWRcbiIsCiAJCQlsZTE2X3RvX2NwdShkci0+d0luZGV4KSwgbGUxNl90b19jcHUoZHItPndMZW5ndGgpKTsKIAkJYnJlYWs7CiAKIAljYXNlIFVTQl9DRENfTk9USUZZX05FVFdPUktfQ09OTkVDVElPTjoKIAogCQlkZXZfZGJnKCZkZXNjLT5pbnRmLT5kZXYsCi0JCQkiTk9USUZZX05FVFdPUktfQ09OTkVDVElPTiAlcyBuZXR3b3JrIiwKKwkJCSJOT1RJRllfTkVUV09SS19DT05ORUNUSU9OICVzIG5ldHdvcmtcbiIsCiAJCQlkci0+d1ZhbHVlID8gImNvbm5lY3RlZCB0byIgOiAiZGlzY29ubmVjdGVkIGZyb20iKTsKIAkJZ290byBleGl0OwogCWNhc2UgVVNCX0NEQ19OT1RJRllfU1BFRURfQ0hBTkdFOgotCQlkZXZfZGJnKCZkZXNjLT5pbnRmLT5kZXYsICJTUEVFRF9DSEFOR0UgcmVjZWl2ZWQgKGxlbiAldSkiLAorCQlkZXZfZGJnKCZkZXNjLT5pbnRmLT5kZXYsICJTUEVFRF9DSEFOR0UgcmVjZWl2ZWQgKGxlbiAldSlcbiIsCiAJCQl1cmItPmFjdHVhbF9sZW5ndGgpOwogCQlnb3RvIGV4aXQ7CiAJZGVmYXVsdDoKQEAgLTI3NCw4ICszMTQsNyBAQAogCQkmJiAhdGVzdF9iaXQoV0RNX0RJU0NPTk5FQ1RJTkcsICZkZXNjLT5mbGFncykKIAkJJiYgIXRlc3RfYml0KFdETV9TVVNQRU5ESU5HLCAmZGVzYy0+ZmxhZ3MpKSB7CiAJCXJ2ID0gdXNiX3N1Ym1pdF91cmIoZGVzYy0+cmVzcG9uc2UsIEdGUF9BVE9NSUMpOwotCQlkZXZfZGJnKCZkZXNjLT5pbnRmLT5kZXYsICIlczogdXNiX3N1Ym1pdF91cmIgJWQiLAotCQkJX19mdW5jX18sIHJ2KTsKKwkJZGV2X2RiZygmZGVzYy0+aW50Zi0+ZGV2LCAic3VibWl0IHJlc3BvbnNlIFVSQiAlZFxuIiwgcnYpOwogCX0KIAlzcGluX3VubG9jaygmZGVzYy0+aXVzcGluKTsKIAlpZiAocnYgPCAwKSB7CkBAIC00MTcsNyArNDU2LDcgQEAKIAkJcnYgPSB1c2JfdHJhbnNsYXRlX2Vycm9ycyhydik7CiAJCWdvdG8gb3V0X2ZyZWVfbWVtX3BtOwogCX0gZWxzZSB7Ci0JCWRldl9kYmcoJmRlc2MtPmludGYtPmRldiwgIlR4IFVSQiBoYXMgYmVlbiBzdWJtaXR0ZWQgaW5kZXg9JWQiLAorCQlkZXZfZGJnKCZkZXNjLT5pbnRmLT5kZXYsICJUeCBVUkIgaGFzIGJlZW4gc3VibWl0dGVkIGluZGV4PSVkXG4iLAogCQkJbGUxNl90b19jcHUocmVxLT53SW5kZXgpKTsKIAl9CiAKQEAgLTQzNiwxNyArNDc1LDE0IEBACiB9CiAKIC8qCi0gKiBjbGVhciBXRE1fUkVBRCBmbGFnIGFuZCBwb3NzaWJseSBzdWJtaXQgdGhlIHJlYWQgdXJiIGlmIHJlc3BfY291bnQKLSAqIGlzIG5vbi16ZXJvLgorICogU3VibWl0IHRoZSByZWFkIHVyYiBpZiByZXNwX2NvdW50IGlzIG5vbi16ZXJvLgogICoKICAqIENhbGxlZCB3aXRoIGRlc2MtPml1c3BpbiBsb2NrZWQKICAqLwotc3RhdGljIGludCBjbGVhcl93ZG1fcmVhZF9mbGFnKHN0cnVjdCB3ZG1fZGV2aWNlICpkZXNjKQorc3RhdGljIGludCBzZXJ2aWNlX291dHN0YW5kaW5nX2ludGVycnVwdChzdHJ1Y3Qgd2RtX2RldmljZSAqZGVzYykKIHsKIAlpbnQgcnYgPSAwOwogCi0JY2xlYXJfYml0KFdETV9SRUFELCAmZGVzYy0+ZmxhZ3MpOwotCiAJLyogc3VibWl0IHJlYWQgdXJiIG9ubHkgaWYgdGhlIGRldmljZSBpcyB3YWl0aW5nIGZvciBpdCAqLwogCWlmICghZGVzYy0+cmVzcF9jb3VudCB8fCAhLS1kZXNjLT5yZXNwX2NvdW50KQogCQlnb3RvIG91dDsKQEAgLTUzNyw4ICs1NzMsOSBAQAogCQl9CiAKIAkJaWYgKCFkZXNjLT5yZXNsZW5ndGgpIHsgLyogemVybyBsZW5ndGggcmVhZCAqLwotCQkJZGV2X2RiZygmZGVzYy0+aW50Zi0+ZGV2LCAiJXM6IHplcm8gbGVuZ3RoIC0gY2xlYXJpbmcgV0RNX1JFQURcbiIsIF9fZnVuY19fKTsKLQkJCXJ2ID0gY2xlYXJfd2RtX3JlYWRfZmxhZyhkZXNjKTsKKwkJCWRldl9kYmcoJmRlc2MtPmludGYtPmRldiwgInplcm8gbGVuZ3RoIC0gY2xlYXJpbmcgV0RNX1JFQURcbiIpOworCQkJY2xlYXJfYml0KFdETV9SRUFELCAmZGVzYy0+ZmxhZ3MpOworCQkJcnYgPSBzZXJ2aWNlX291dHN0YW5kaW5nX2ludGVycnVwdChkZXNjKTsKIAkJCXNwaW5fdW5sb2NrX2lycSgmZGVzYy0+aXVzcGluKTsKIAkJCWlmIChydiA8IDApCiAJCQkJZ290byBlcnI7CkBAIC01NjMsOCArNjAwLDEwIEBACiAKIAlkZXNjLT5sZW5ndGggLT0gY250cjsKIAkvKiBpbiBjYXNlIHdlIGhhZCBvdXRzdGFuZGluZyBkYXRhICovCi0JaWYgKCFkZXNjLT5sZW5ndGgpCi0JCWNsZWFyX3dkbV9yZWFkX2ZsYWcoZGVzYyk7CisJaWYgKCFkZXNjLT5sZW5ndGgpIHsKKwkJY2xlYXJfYml0KFdETV9SRUFELCAmZGVzYy0+ZmxhZ3MpOworCQlzZXJ2aWNlX291dHN0YW5kaW5nX2ludGVycnVwdChkZXNjKTsKKwl9CiAJc3Bpbl91bmxvY2tfaXJxKCZkZXNjLT5pdXNwaW4pOwogCXJ2ID0gY250cjsKIApAQCAtNjQ3LDYgKzY4NiwxNyBAQAogCQkJZGV2X2VycigmZGVzYy0+aW50Zi0+ZGV2LAogCQkJCSJFcnJvciBzdWJtaXR0aW5nIGludCB1cmIgLSAlZFxuIiwgcnYpOwogCQkJcnYgPSB1c2JfdHJhbnNsYXRlX2Vycm9ycyhydik7CisJCX0gZWxzZSBpZiAodGVzdF9iaXQoV0RNX0RSQUlOX09OX09QRU4sICZkZXNjLT5mbGFncykpIHsKKwkJCS8qCisJCQkgKiBTb21lIGRldmljZXMga2VlcCBwZW5kaW5nIG1lc3NhZ2VzIHF1ZXVlZAorCQkJICogd2l0aG91dCByZXNlbmRpbmcgbm90aWZpY2F0aW9ucy4gIFdlIG11c3QKKwkJCSAqIGZsdXNoIHRoZSBtZXNzYWdlIHF1ZXVlIGJlZm9yZSB3ZSBjYW4KKwkJCSAqIGFzc3VtZSBhIG9uZS10by1vbmUgcmVsYXRpb25zaGlwIGJldHdlZW4KKwkJCSAqIG5vdGlmaWNhdGlvbnMgYW5kIG1lc3NhZ2VzIGluIHRoZSBxdWV1ZQorCQkJICovCisJCQlkZXZfZGJnKCZkZXNjLT5pbnRmLT5kZXYsICJkcmFpbmluZyBxdWV1ZWQgZGF0YVxuIik7CisJCQlzZXRfYml0KFdETV9SRVNQT05ESU5HLCAmZGVzYy0+ZmxhZ3MpOworCQkJcnYgPSB1c2Jfc3VibWl0X3VyYihkZXNjLT5yZXNwb25zZSwgR0ZQX0tFUk5FTCk7CiAJCX0KIAl9IGVsc2UgewogCQlydiA9IDA7CkBAIC02NzMsNyArNzIzLDcgQEAKIAogCWlmICghZGVzYy0+Y291bnQpIHsKIAkJaWYgKCF0ZXN0X2JpdChXRE1fRElTQ09OTkVDVElORywgJmRlc2MtPmZsYWdzKSkgewotCQkJZGV2X2RiZygmZGVzYy0+aW50Zi0+ZGV2LCAid2RtX3JlbGVhc2U6IGNsZWFudXAiKTsKKwkJCWRldl9kYmcoJmRlc2MtPmludGYtPmRldiwgIndkbV9yZWxlYXNlOiBjbGVhbnVwXG4iKTsKIAkJCWtpbGxfdXJicyhkZXNjKTsKIAkJCXNwaW5fbG9ja19pcnEoJmRlc2MtPml1c3Bpbik7CiAJCQlkZXNjLT5yZXNwX2NvdW50ID0gMDsKQEAgLTc1Myw3ICs4MDMsOCBAQAogLyogLS0tIGhvdHBsdWcgLS0tICovCiAKIHN0YXRpYyBpbnQgd2RtX2NyZWF0ZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Ziwgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcCwKLQkJdTE2IGJ1ZnNpemUsIGludCAoKm1hbmFnZV9wb3dlcikoc3RydWN0IHVzYl9pbnRlcmZhY2UgKiwgaW50KSkKKwkJdTE2IGJ1ZnNpemUsIGludCAoKm1hbmFnZV9wb3dlcikoc3RydWN0IHVzYl9pbnRlcmZhY2UgKiwgaW50KSwKKwkJYm9vbCBkcmFpbl9vbl9vcGVuKQogewogCWludCBydiA9IC1FTk9NRU07CiAJc3RydWN0IHdkbV9kZXZpY2UgKmRlc2M7CkBAIC04NDAsNiArODkxLDY4IEBACiAKIAlkZXNjLT5tYW5hZ2VfcG93ZXIgPSBtYW5hZ2VfcG93ZXI7CiAKKwkvKgorCSAqICJkcmFpbl9vbl9vcGVuIiBlbmFibGVzIGEgaGFjayB0byB3b3JrIGFyb3VuZCBhIGZpcm13YXJlCisJICogaXNzdWUgb2JzZXJ2ZWQgb24gbmV0d29yayBmdW5jdGlvbnMsIGluIHBhcnRpY3VsYXIgTUJJTQorCSAqIGZ1bmN0aW9ucy4KKwkgKgorCSAqIFF1b3Rpbmcgc2VjdGlvbiA3IG9mIHRoZSBDREMtV01DIHIxLjEgc3BlY2lmaWNhdGlvbjoKKwkgKgorCSAqICAiVGhlIGZpcm13YXJlIHNoYWxsIGludGVycHJldCBHZXRFbmNhcHN1bGF0ZWRSZXNwb25zZSBhcyBhCisJICogICByZXF1ZXN0IHRvIHJlYWQgcmVzcG9uc2UgYnl0ZXMuIFRoZSBmaXJtd2FyZSBzaGFsbCBzZW5kCisJICogICB0aGUgbmV4dCB3TGVuZ3RoIGJ5dGVzIGZyb20gdGhlIHJlc3BvbnNlLiBUaGUgZmlybXdhcmUKKwkgKiAgIHNoYWxsIGFsbG93IHRoZSBob3N0IHRvIHJldHJpZXZlIGRhdGEgdXNpbmcgYW55IG51bWJlciBvZgorCSAqICAgR2V0RW5jYXBzdWxhdGVkUmVzcG9uc2UgcmVxdWVzdHMuIFRoZSBmaXJtd2FyZSBzaGFsbAorCSAqICAgcmV0dXJuIGEgemVyby0gbGVuZ3RoIHJlcGx5IGlmIHRoZXJlIGFyZSBubyBkYXRhIGJ5dGVzCisJICogICBhdmFpbGFibGUuCisJICoKKwkgKiAgIFRoZSBmaXJtd2FyZSBzaGFsbCBzZW5kIFJlc3BvbnNlQXZhaWxhYmxlIG5vdGlmaWNhdGlvbnMKKwkgKiAgIHBlcmlvZGljYWxseSwgdXNpbmcgYW55IGFwcHJvcHJpYXRlIGFsZ29yaXRobSwgdG8gaW5mb3JtCisJICogICB0aGUgaG9zdCB0aGF0IHRoZXJlIGlzIGRhdGEgYXZhaWxhYmxlIGluIHRoZSByZXBseQorCSAqICAgYnVmZmVyLiBUaGUgZmlybXdhcmUgaXMgYWxsb3dlZCB0byBzZW5kIFJlc3BvbnNlQXZhaWxhYmxlCisJICogICBub3RpZmljYXRpb25zIGV2ZW4gaWYgdGhlcmUgaXMgbm8gZGF0YSBhdmFpbGFibGUsIGJ1dAorCSAqICAgdGhpcyB3aWxsIG9idmlvdXNseSByZWR1Y2Ugb3ZlcmFsbCBwZXJmb3JtYW5jZS4iCisJICoKKwkgKiBUaGVzZSByZXF1aXJlbWVudHMsIGFsdGhvdWdoIHRoZXkgbWFrZSBlcXVhbGx5IHNlbnNlLCBhcmUKKwkgKiBvZnRlbiBub3QgaW1wbGVtZW50ZWQgYnkgbmV0d29yayBmdW5jdGlvbnMuIFNvbWUgZmlybXdhcmVzCisJICogd2lsbCBxdWV1ZSBkYXRhIGluZGVmaW5pdGVseSwgd2l0aG91dCBldmVyIHJlc2VuZGluZyBhCisJICogbm90aWZpY2F0aW9uLiBUaGUgcmVzdWx0IGlzIHRoYXQgdGhlIGRyaXZlciBhbmQgZmlybXdhcmUKKwkgKiBsb3NlcyAic3luY3Jvbml6YXRpb24iIGlmIHRoZSBkcml2ZXIgZXZlciBmYWlscyB0byByZXNwb25kCisJICogdG8gYSBzaW5nbGUgbm90aWZpY2F0aW9uLCBzb21ldGhpbmcgd2hpY2ggZWFzaWx5IGNhbiBoYXBwZW4KKwkgKiBvbiByZWxlYXNlKCkuIFdoZW4gdGhpcyBoYXBwZW5zLCB0aGUgZHJpdmVyIHdpbGwgYXBwZWFyIHRvCisJICogbmV2ZXIgcmVjZWl2ZSBub3RpZmljYXRpb25zIGZvciB0aGUgbW9zdCBjdXJyZW50IGRhdGEuIEVhY2gKKwkgKiBub3RpZmljYXRpb24gd2lsbCBvbmx5IGNhdXNlIGEgc2luZ2xlIHJlYWQsIHdoaWNoIHJldHVybnMKKwkgKiB0aGUgb2xkZXN0IGRhdGEgaW4gdGhlIGZpcm13YXJlJ3MgcXVldWUuCisJICoKKwkgKiBUaGUgImRyYWluX29uX29wZW4iIGhhY2sgcmVzb2x2ZXMgdGhlIHNpdHVhdGlvbiBieSBkcmFpbmluZworCSAqIGRhdGEgZnJvbSB0aGUgZmlybXdhcmUgdW50aWwgbm9uZSBpcyByZXR1cm5lZCwgd2l0aG91dCBhCisJICogcHJpb3Igbm90aWZpY2F0aW9uLgorCSAqCisJICogVGhpcyB3aWxsIGluZXZpdGFibHkgcmFjZSB3aXRoIHRoZSBmaXJtd2FyZSwgcmlza2luZyB0aGF0CisJICogd2UgcmVhZCBkYXRhIGZyb20gdGhlIGRldmljZSBiZWZvcmUgaGFuZGxpbmcgdGhlIGFzc29jaWF0ZWQKKwkgKiBub3RpZmljYXRpb24uIFRvIG1ha2UgdGhpbmdzIHdvcnNlLCBzb21lIG9mIHRoZSBkZXZpY2VzCisJICogbmVlZGluZyB0aGUgaGFjayBkbyBub3QgaW1wbGVtZW50IHRoZSAicmV0dXJuIHplcm8gaWYgbm8KKwkgKiBkYXRhIGlzIGF2YWlsYWJsZSIgcmVxdWlyZW1lbnQgZWl0aGVyLiBJbnN0ZWFkIHRoZXkgcmV0dXJuCisJICogYW4gZXJyb3Igb24gdGhlIHN1YnNlcXVlbnQgcmVhZCBpbiB0aGlzIGNhc2UuICBUaGlzIG1lYW5zCisJICogdGhhdCAid2lubmluZyIgdGhlIHJhY2UgY2FuIGNhdXNlIGFuIHVuZXhwZWN0ZWQgRUlPIHRvCisJICogdXNlcnNwYWNlLgorCSAqCisJICogIndpbm5pbmciIHRoZSByYWNlIGlzIG1vcmUgbGlrZWx5IG9uIHJlc3VtZSgpIHRoYW4gb24KKwkgKiBvcGVuKCksIGFuZCB0aGUgdW5leHBlY3RlZCBlcnJvciBpcyBtb3JlIGhhcm1mdWwgaW4gdGhlCisJICogbWlkZGxlIG9mIGFuIG9wZW4gc2Vzc2lvbi4gVGhlIGhhY2sgaXMgdGhlcmVmb3JlIG9ubHkKKwkgKiBhcHBsaWVkIG9uIG9wZW4oKSwgYW5kIG5vdCBvbiByZXN1bWUoKSB3aGVyZSBpdCBsb2dpY2FsbHkKKwkgKiB3b3VsZCBiZSBlcXVhbGx5IG5lY2Vzc2FyeS4gU28gd2UgZGVmaW5lIG9wZW4oKSBhcyB0aGUgb25seQorCSAqIGRyaXZlciA8LT4gZGV2aWNlICJzeW5jcm9uaXphdGlvbiBwb2ludCIuICBTaG91bGQgd2UgaGFwcGVuCisJICogdG8gbG9zZSBhIG5vdGlmaWNhdGlvbiBhZnRlciBvcGVuKCksIHRoZW4gc3luY3Jvbml6YXRpb24KKwkgKiB3aWxsIGJlIGxvc3QgdW50aWwgcmVsZWFzZSgpCisJICoKKwkgKiBUaGUgaGFjayBzaG91bGQgbm90IGJlIGVuYWJsZWQgZm9yIENEQyBXRE0gZGV2aWNlcworCSAqIGNvbmZvcm1pbmcgdG8gdGhlIENEQy1XTUMgcjEuMSBzcGVjaWZpY2F0aW9uLiAgVGhpcyBpcworCSAqIGVuc3VyZWQgYnkgc2V0dGluZyBkcmFpbl9vbl9vcGVuIHRvIGZhbHNlIGluIHdkbV9wcm9iZSgpLgorCSAqLworCWlmIChkcmFpbl9vbl9vcGVuKQorCQlzZXRfYml0KFdETV9EUkFJTl9PTl9PUEVOLCAmZGVzYy0+ZmxhZ3MpOworCiAJc3Bpbl9sb2NrKCZ3ZG1fZGV2aWNlX2xpc3RfbG9jayk7CiAJbGlzdF9hZGQoJmRlc2MtPmRldmljZV9saXN0LCAmd2RtX2RldmljZV9saXN0KTsKIAlzcGluX3VubG9jaygmd2RtX2RldmljZV9saXN0X2xvY2spOwpAQCAtODkzLDcgKzEwMDYsNyBAQAogCQlnb3RvIGVycjsKIAllcCA9ICZpZmFjZS0+ZW5kcG9pbnRbMF0uZGVzYzsKIAotCXJ2ID0gd2RtX2NyZWF0ZShpbnRmLCBlcCwgbWF4Y29tLCAmd2RtX21hbmFnZV9wb3dlcik7CisJcnYgPSB3ZG1fY3JlYXRlKGludGYsIGVwLCBtYXhjb20sICZ3ZG1fbWFuYWdlX3Bvd2VyLCBmYWxzZSk7CiAKIGVycjoKIAlyZXR1cm4gcnY7CkBAIC05MjUsNyArMTAzOCw3IEBACiB7CiAJaW50IHJ2ID0gLUVJTlZBTDsKIAotCXJ2ID0gd2RtX2NyZWF0ZShpbnRmLCBlcCwgYnVmc2l6ZSwgbWFuYWdlX3Bvd2VyKTsKKwlydiA9IHdkbV9jcmVhdGUoaW50ZiwgZXAsIGJ1ZnNpemUsIG1hbmFnZV9wb3dlciwgdHJ1ZSk7CiAJaWYgKHJ2IDwgMCkKIAkJZ290byBlcnI7CiAKQEAgLTk2Nyw3ICsxMDgwLDcgQEAKIAlpZiAoIWRlc2MtPmNvdW50KQogCQljbGVhbnVwKGRlc2MpOwogCWVsc2UKLQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAiJXM6ICVkIG9wZW4gZmlsZXMgLSBwb3N0cG9uaW5nIGNsZWFudXBcbiIsIF9fZnVuY19fLCBkZXNjLT5jb3VudCk7CisJCWRldl9kYmcoJmludGYtPmRldiwgIiVkIG9wZW4gZmlsZXMgLSBwb3N0cG9uaW5nIGNsZWFudXBcbiIsIGRlc2MtPmNvdW50KTsKIAltdXRleF91bmxvY2soJndkbV9tdXRleCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NsYXNzL3VzYnRtYy5jIGIvZHJpdmVycy91c2IvY2xhc3MvdXNidG1jLmMKaW5kZXggOTE3YTU1Yy4uYTZjMWZhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2xhc3MvdXNidG1jLmMKKysrIGIvZHJpdmVycy91c2IvY2xhc3MvdXNidG1jLmMKQEAgLTE0MSw2ICsxNDEsNyBAQAogCXN0cnVjdCB1c2J0bWNfZGV2aWNlX2RhdGEgKmRhdGEgPSB0b191c2J0bWNfZGF0YShrcmVmKTsKIAogCXVzYl9wdXRfZGV2KGRhdGEtPnVzYl9kZXYpOworCWtmcmVlKGRhdGEpOwogfQogCiBzdGF0aWMgaW50IHVzYnRtY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQpAQCAtMTM3OSw3ICsxMzgwLDcgQEAKIAogCWRldl9kYmcoJmludGYtPmRldiwgIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOwogCi0JZGF0YSA9IGRldm1fa3phbGxvYygmaW50Zi0+ZGV2LCBzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKKwlkYXRhID0ga21hbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xNDY3LDEwICsxNDY4LDggQEAKIAlpZiAoZGF0YS0+aWluX2VwX3ByZXNlbnQpIHsKIAkJLyogYWxsb2NhdGUgaW50IHVyYiAqLwogCQlkYXRhLT5paW5fdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFkYXRhLT5paW5fdXJiKSB7Ci0JCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgaW50IHVyYlxuIik7CisJCWlmICghZGF0YS0+aWluX3VyYikKIAkJCWdvdG8gZXJyb3JfcmVnaXN0ZXI7Ci0JCX0KIAogCQkvKiB3aWxsIHJlZmVyZW5jZSBkYXRhIGluIGludCB1cmIgKi8KIAkJa3JlZl9nZXQoJmRhdGEtPmtyZWYpOwpAQCAtMTQ3OCwxMCArMTQ3Nyw4IEBACiAJCS8qIGFsbG9jYXRlIGJ1ZmZlciBmb3IgaW50ZXJydXB0IGluICovCiAJCWRhdGEtPmlpbl9idWZmZXIgPSBrbWFsbG9jKGRhdGEtPmlpbl93TWF4UGFja2V0U2l6ZSwKIAkJCQkJR0ZQX0tFUk5FTCk7Ci0JCWlmICghZGF0YS0+aWluX2J1ZmZlcikgewotCQkJZGV2X2VycigmaW50Zi0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIGludCBidWZcbiIpOworCQlpZiAoIWRhdGEtPmlpbl9idWZmZXIpCiAJCQlnb3RvIGVycm9yX3JlZ2lzdGVyOwotCQl9CiAKIAkJLyogZmlsbCBpbnRlcnJ1cHQgdXJiICovCiAJCXVzYl9maWxsX2ludF91cmIoZGF0YS0+aWluX3VyYiwgZGF0YS0+dXNiX2RldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvbW1vbi91bHBpLmMgYi9kcml2ZXJzL3VzYi9jb21tb24vdWxwaS5jCmluZGV4IDAxYzBjMDQuLjhiMzE3NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvbW1vbi91bHBpLmMKKysrIGIvZHJpdmVycy91c2IvY29tbW9uL3VscGkuYwpAQCAtMjEsMTMgKzIxLDEzIEBACiAKIGludCB1bHBpX3JlYWQoc3RydWN0IHVscGkgKnVscGksIHU4IGFkZHIpCiB7Ci0JcmV0dXJuIHVscGktPm9wcy0+cmVhZCh1bHBpLT5vcHMsIGFkZHIpOworCXJldHVybiB1bHBpLT5vcHMtPnJlYWQodWxwaS0+ZGV2LnBhcmVudCwgYWRkcik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1bHBpX3JlYWQpOwogCiBpbnQgdWxwaV93cml0ZShzdHJ1Y3QgdWxwaSAqdWxwaSwgdTggYWRkciwgdTggdmFsKQogewotCXJldHVybiB1bHBpLT5vcHMtPndyaXRlKHVscGktPm9wcywgYWRkciwgdmFsKTsKKwlyZXR1cm4gdWxwaS0+b3BzLT53cml0ZSh1bHBpLT5kZXYucGFyZW50LCBhZGRyLCB2YWwpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodWxwaV93cml0ZSk7CiAKQEAgLTEyNywxNiArMTI3LDE3IEBACiAgKgogICogUmVnaXN0ZXJzIGEgZHJpdmVyIHdpdGggdGhlIFVMUEkgYnVzLgogICovCi1pbnQgdWxwaV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHVscGlfZHJpdmVyICpkcnYpCitpbnQgX191bHBpX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdWxwaV9kcml2ZXIgKmRydiwgc3RydWN0IG1vZHVsZSAqbW9kdWxlKQogewogCWlmICghZHJ2LT5wcm9iZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlkcnYtPmRyaXZlci5vd25lciA9IG1vZHVsZTsKIAlkcnYtPmRyaXZlci5idXMgPSAmdWxwaV9idXM7CiAKIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTCh1bHBpX3JlZ2lzdGVyX2RyaXZlcik7CitFWFBPUlRfU1lNQk9MX0dQTChfX3VscGlfcmVnaXN0ZXJfZHJpdmVyKTsKIAogLyoqCiAgKiB1bHBpX3VucmVnaXN0ZXJfZHJpdmVyIC0gdW5yZWdpc3RlciBhIGRyaXZlciB3aXRoIHRoZSBVTFBJIGJ1cwpAQCAtMTU2LDYgKzE1Nyw4IEBACiB7CiAJaW50IHJldDsKIAorCXVscGktPmRldi5wYXJlbnQgPSBkZXY7IC8qIG5lZWRlZCBlYXJseSBmb3Igb3BzICovCisKIAkvKiBUZXN0IHRoZSBpbnRlcmZhY2UgKi8KIAlyZXQgPSB1bHBpX3dyaXRlKHVscGksIFVMUElfU0NSQVRDSCwgMHhhYSk7CiAJaWYgKHJldCA8IDApCkBAIC0xNzQsNyArMTc3LDYgQEAKIAl1bHBpLT5pZC5wcm9kdWN0ID0gdWxwaV9yZWFkKHVscGksIFVMUElfUFJPRFVDVF9JRF9MT1cpOwogCXVscGktPmlkLnByb2R1Y3QgfD0gdWxwaV9yZWFkKHVscGksIFVMUElfUFJPRFVDVF9JRF9ISUdIKSA8PCA4OwogCi0JdWxwaS0+ZGV2LnBhcmVudCA9IGRldjsKIAl1bHBpLT5kZXYuYnVzID0gJnVscGlfYnVzOwogCXVscGktPmRldi50eXBlID0gJnVscGlfZGV2X3R5cGU7CiAJZGV2X3NldF9uYW1lKCZ1bHBpLT5kZXYsICIlcy51bHBpIiwgZGV2X25hbWUoZGV2KSk7CkBAIC0yMDEsNyArMjAzLDggQEAKICAqIEFsbG9jYXRlcyBhbmQgcmVnaXN0ZXJzIGEgVUxQSSBkZXZpY2UgYW5kIGFuIGludGVyZmFjZSBmb3IgaXQuIENhbGxlZCBmcm9tCiAgKiB0aGUgVVNCIGNvbnRyb2xsZXIgdGhhdCBwcm92aWRlcyB0aGUgVUxQSSBpbnRlcmZhY2UuCiAgKi8KLXN0cnVjdCB1bHBpICp1bHBpX3JlZ2lzdGVyX2ludGVyZmFjZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCB1bHBpX29wcyAqb3BzKQorc3RydWN0IHVscGkgKnVscGlfcmVnaXN0ZXJfaW50ZXJmYWNlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCB1bHBpX29wcyAqb3BzKQogewogCXN0cnVjdCB1bHBpICp1bHBpOwogCWludCByZXQ7CkBAIC0yMTEsNyArMjE0LDYgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAl1bHBpLT5vcHMgPSBvcHM7Ci0Jb3BzLT5kZXYgPSBkZXY7CiAKIAlyZXQgPSB1bHBpX3JlZ2lzdGVyKGRldiwgdWxwaSk7CiAJaWYgKHJldCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9LY29uZmlnIGIvZHJpdmVycy91c2IvY29yZS9LY29uZmlnCmluZGV4IGRkMjgwMTAuLjBlNWE4ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9jb3JlL0tjb25maWcKQEAgLTgzLDIzICs4MywxMCBAQAogCSAgSW1wbGVtZW50cyBPVEcgRmluaXRlIFN0YXRlIE1hY2hpbmUgYXMgc3BlY2lmaWVkIGluIE9uLVRoZS1HbwogCSAgYW5kIEVtYmVkZGVkIEhvc3QgU3VwcGxlbWVudCB0byB0aGUgVVNCIFJldmlzaW9uIDIuMCBTcGVjaWZpY2F0aW9uLgogCi1jb25maWcgVVNCX1VMUElfQlVTCi0JdHJpc3RhdGUgIlVTQiBVTFBJIFBIWSBpbnRlcmZhY2Ugc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFVTQl9TVVBQT1JUCitjb25maWcgVVNCX0xFRFNfVFJJR0dFUl9VU0JQT1JUCisJdHJpc3RhdGUgIlVTQiBwb3J0IExFRCB0cmlnZ2VyIgorCWRlcGVuZHMgb24gVVNCICYmIExFRFNfVFJJR0dFUlMKIAloZWxwCi0JICBVVE1JKyBMb3cgUGluIEludGVyZmFjZSAoVUxQSSkgaXMgc3BlY2lmaWNhdGlvbiBmb3IgYSBjb21tb25seSB1c2VkCi0JICBVU0IgMi4wIFBIWSBpbnRlcmZhY2UuIFRoZSBVTFBJIHNwZWNpZmljYXRpb24gZGVmaW5lcyBhIHN0YW5kYXJkIHNldAotCSAgb2YgcmVnaXN0ZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGV0ZWN0IHRoZSB2ZW5kb3IgYW5kIHByb2R1Y3Qgd2hpY2gKLQkgIGFsbG93cyBVTFBJIHRvIGJlIGhhbmRsZWQgYXMgYSBidXMuIFRoaXMgbW9kdWxlIGlzIHRoZSBkcml2ZXIgZm9yIHRoYXQKLQkgIGJ1cy4KLQotCSAgVGhlIFVMUEkgaW50ZXJmYWNlcyAodGhlIGJ1c2VzKSBhcmUgcmVnaXN0ZXJlZCBieSB0aGUgZHJpdmVycyBmb3IgVVNCCi0JICBjb250cm9sbGVycyB3aGljaCBzdXBwb3J0IFVMUEkgcmVnaXN0ZXIgYWNjZXNzIGFuZCBoYXZlIFVMUEkgUEhZCi0JICBhdHRhY2hlZCB0byB0aGVtLiBUaGUgVUxQSSBQSFkgZHJpdmVycyB0aGVtc2VsdmVzIGFyZSBub3JtYWwgUEhZCi0JICBkcml2ZXJzLgotCi0JICBVTFBJIFBIWXMgcHJvdmlkZSBvZnRlbiBmdW5jdGlvbnMgc3VjaCBhcyBBRFAgc2Vuc2luZy9wcm9iaW5nIChPVEcKLQkgIHByb3RvY29sKSBhbmQgVVNCIGNoYXJnZXIgZGV0ZWN0aW9uLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKLQkgIGJlIGNhbGxlZCB1bHBpLgorCSAgVGhpcyBkcml2ZXIgYWxsb3dzIExFRHMgdG8gYmUgY29udHJvbGxlZCBieSBVU0IgZXZlbnRzLiBFbmFibGluZyB0aGlzCisJICB0cmlnZ2VyIGFsbG93cyBzcGVjaWZ5aW5nIGxpc3Qgb2YgVVNCIHBvcnRzIHRoYXQgc2hvdWxkIHR1cm4gb24gTEVECisJICB3aGVuIHNvbWUgVVNCIGRldmljZSBnZXRzIGNvbm5lY3RlZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9jb3JlL01ha2VmaWxlCmluZGV4IDk3ODA4NzcuLmI5OWI4NzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvY29yZS9NYWtlZmlsZQpAQCAtNSw5ICs1LDEyIEBACiB1c2Jjb3JlLXkgOj0gdXNiLm8gaHViLm8gaGNkLm8gdXJiLm8gbWVzc2FnZS5vIGRyaXZlci5vCiB1c2Jjb3JlLXkgKz0gY29uZmlnLm8gZmlsZS5vIGJ1ZmZlci5vIHN5c2ZzLm8gZW5kcG9pbnQubwogdXNiY29yZS15ICs9IGRldmlvLm8gbm90aWZ5Lm8gZ2VuZXJpYy5vIHF1aXJrcy5vIGRldmljZXMubwotdXNiY29yZS15ICs9IHBvcnQubyBvZi5vCit1c2Jjb3JlLXkgKz0gcG9ydC5vCiAKK3VzYmNvcmUtJChDT05GSUdfT0YpCQkrPSBvZi5vCiB1c2Jjb3JlLSQoQ09ORklHX1BDSSkJCSs9IGhjZC1wY2kubwogdXNiY29yZS0kKENPTkZJR19BQ1BJKQkJKz0gdXNiLWFjcGkubwogCiBvYmotJChDT05GSUdfVVNCKQkJKz0gdXNiY29yZS5vCisKK29iai0kKENPTkZJR19VU0JfTEVEU19UUklHR0VSX1VTQlBPUlQpCSs9IGxlZHRyaWctdXNicG9ydC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2NvbmZpZy5jIGIvZHJpdmVycy91c2IvY29yZS9jb25maWcuYwppbmRleCAzMWNjZGNjLi5hMmQ5MGFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2NvbmZpZy5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvY29uZmlnLmMKQEAgLTE3MSw2ICsxNzEsMzEgQEAKIAkJCQkJCQllcCwgYnVmZmVyLCBzaXplKTsKIH0KIAorc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGxvd19zcGVlZF9tYXhwYWNrZXRfbWF4ZXNbNF0gPSB7CisJW1VTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0xdID0gOCwKKwlbVVNCX0VORFBPSU5UX1hGRVJfSVNPQ10gPSAwLAorCVtVU0JfRU5EUE9JTlRfWEZFUl9CVUxLXSA9IDAsCisJW1VTQl9FTkRQT0lOVF9YRkVSX0lOVF0gPSA4LAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBmdWxsX3NwZWVkX21heHBhY2tldF9tYXhlc1s0XSA9IHsKKwlbVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTF0gPSA2NCwKKwlbVVNCX0VORFBPSU5UX1hGRVJfSVNPQ10gPSAxMDIzLAorCVtVU0JfRU5EUE9JTlRfWEZFUl9CVUxLXSA9IDY0LAorCVtVU0JfRU5EUE9JTlRfWEZFUl9JTlRdID0gNjQsCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGhpZ2hfc3BlZWRfbWF4cGFja2V0X21heGVzWzRdID0geworCVtVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MXSA9IDY0LAorCVtVU0JfRU5EUE9JTlRfWEZFUl9JU09DXSA9IDEwMjQsCisJW1VTQl9FTkRQT0lOVF9YRkVSX0JVTEtdID0gNTEyLAorCVtVU0JfRU5EUE9JTlRfWEZFUl9JTlRdID0gMTAyNCwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgc3VwZXJfc3BlZWRfbWF4cGFja2V0X21heGVzWzRdID0geworCVtVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MXSA9IDUxMiwKKwlbVVNCX0VORFBPSU5UX1hGRVJfSVNPQ10gPSAxMDI0LAorCVtVU0JfRU5EUE9JTlRfWEZFUl9CVUxLXSA9IDEwMjQsCisJW1VTQl9FTkRQT0lOVF9YRkVSX0lOVF0gPSAxMDI0LAorfTsKKwogc3RhdGljIGludCB1c2JfcGFyc2VfZW5kcG9pbnQoc3RydWN0IGRldmljZSAqZGRldiwgaW50IGNmZ25vLCBpbnQgaW51bSwKICAgICBpbnQgYXNudW0sIHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmlmcCwgaW50IG51bV9lcCwKICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBzaXplKQpAQCAtMTc5LDYgKzIwNCw4IEBACiAJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkOwogCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZW5kcG9pbnQ7CiAJaW50IG4sIGksIGosIHJldHZhbDsKKwl1bnNpZ25lZCBpbnQgbWF4cDsKKwljb25zdCB1bnNpZ25lZCBzaG9ydCAqbWF4cGFja2V0X21heGVzOwogCiAJZCA9IChzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKikgYnVmZmVyOwogCWJ1ZmZlciArPSBkLT5iTGVuZ3RoOwpAQCAtMjEzLDggKzI0MCwxMCBAQAogCW1lbWNweSgmZW5kcG9pbnQtPmRlc2MsIGQsIG4pOwogCUlOSVRfTElTVF9IRUFEKCZlbmRwb2ludC0+dXJiX2xpc3QpOwogCi0JLyogRml4IHVwIGJJbnRlcnZhbCB2YWx1ZXMgb3V0c2lkZSB0aGUgbGVnYWwgcmFuZ2UuIFVzZSAzMiBtcyBpZiBubwotCSAqIHByb3BlciB2YWx1ZSBjYW4gYmUgZ3Vlc3NlZC4gKi8KKwkvKgorCSAqIEZpeCB1cCBiSW50ZXJ2YWwgdmFsdWVzIG91dHNpZGUgdGhlIGxlZ2FsIHJhbmdlLgorCSAqIFVzZSAxMCBvciA4IG1zIGlmIG5vIHByb3BlciB2YWx1ZSBjYW4gYmUgZ3Vlc3NlZC4KKwkgKi8KIAlpID0gMDsJCS8qIGkgPSBtaW4sIGogPSBtYXgsIG4gPSBkZWZhdWx0ICovCiAJaiA9IDI1NTsKIAlpZiAodXNiX2VuZHBvaW50X3hmZXJfaW50KGQpKSB7CkBAIC0yMjMsMTMgKzI1MiwxNSBAQAogCQljYXNlIFVTQl9TUEVFRF9TVVBFUl9QTFVTOgogCQljYXNlIFVTQl9TUEVFRF9TVVBFUjoKIAkJY2FzZSBVU0JfU1BFRURfSElHSDoKLQkJCS8qIE1hbnkgZGV2aWNlIG1hbnVmYWN0dXJlcnMgYXJlIHVzaW5nIGZ1bGwtc3BlZWQKKwkJCS8qCisJCQkgKiBNYW55IGRldmljZSBtYW51ZmFjdHVyZXJzIGFyZSB1c2luZyBmdWxsLXNwZWVkCiAJCQkgKiBiSW50ZXJ2YWwgdmFsdWVzIGluIGhpZ2gtc3BlZWQgaW50ZXJydXB0IGVuZHBvaW50Ci0JCQkgKiBkZXNjcmlwdG9ycy4gVHJ5IHRvIGZpeCB0aG9zZSBhbmQgZmFsbCBiYWNrIHRvIGEKLQkJCSAqIDMyIG1zIGRlZmF1bHQgdmFsdWUgb3RoZXJ3aXNlLiAqLworCQkJICogZGVzY3JpcHRvcnMuIFRyeSB0byBmaXggdGhvc2UgYW5kIGZhbGwgYmFjayB0byBhbgorCQkJICogOC1tcyBkZWZhdWx0IHZhbHVlIG90aGVyd2lzZS4KKwkJCSAqLwogCQkJbiA9IGZscyhkLT5iSW50ZXJ2YWwqOCk7CiAJCQlpZiAobiA9PSAwKQotCQkJCW4gPSA5OwkvKiAzMiBtcyA9IDJeKDktMSkgdWZyYW1lcyAqLworCQkJCW4gPSA3OwkvKiA4IG1zID0gMl4oNy0xKSB1ZnJhbWVzICovCiAJCQlqID0gMTY7CiAKIAkJCS8qCkBAIC0yNDQsMTAgKzI3NSwxMiBAQAogCQkJfQogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CQkvKiBVU0JfU1BFRURfRlVMTCBvciBfTE9XICovCi0JCQkvKiBGb3IgbG93LXNwZWVkLCAxMCBtcyBpcyB0aGUgb2ZmaWNpYWwgbWluaW11bS4KKwkJCS8qCisJCQkgKiBGb3IgbG93LXNwZWVkLCAxMCBtcyBpcyB0aGUgb2ZmaWNpYWwgbWluaW11bS4KIAkJCSAqIEJ1dCBzb21lICJvdmVyY2xvY2tlZCIgZGV2aWNlcyBtaWdodCB3YW50IGZhc3RlcgotCQkJICogcG9sbGluZyBzbyB3ZSdsbCBhbGxvdyBpdC4gKi8KLQkJCW4gPSAzMjsKKwkJCSAqIHBvbGxpbmcgc28gd2UnbGwgYWxsb3cgaXQuCisJCQkgKi8KKwkJCW4gPSAxMDsKIAkJCWJyZWFrOwogCQl9CiAJfSBlbHNlIGlmICh1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGQpKSB7CkBAIC0yNTUsMTAgKzI4OCwxMCBAQAogCQlqID0gMTY7CiAJCXN3aXRjaCAodG9fdXNiX2RldmljZShkZGV2KS0+c3BlZWQpIHsKIAkJY2FzZSBVU0JfU1BFRURfSElHSDoKLQkJCW4gPSA5OwkJLyogMzIgbXMgPSAyXig5LTEpIHVmcmFtZXMgKi8KKwkJCW4gPSA3OwkJLyogOCBtcyA9IDJeKDctMSkgdWZyYW1lcyAqLwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CQkvKiBVU0JfU1BFRURfRlVMTCAqLwotCQkJbiA9IDY7CQkvKiAzMiBtcyA9IDJeKDYtMSkgZnJhbWVzICovCisJCQluID0gNDsJCS8qIDggbXMgPSAyXig0LTEpIGZyYW1lcyAqLwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0yODYsNiArMzE5LDQyIEBACiAJCQllbmRwb2ludC0+ZGVzYy53TWF4UGFja2V0U2l6ZSA9IGNwdV90b19sZTE2KDgpOwogCX0KIAorCS8qIFZhbGlkYXRlIHRoZSB3TWF4UGFja2V0U2l6ZSBmaWVsZCAqLworCW1heHAgPSB1c2JfZW5kcG9pbnRfbWF4cCgmZW5kcG9pbnQtPmRlc2MpOworCisJLyogRmluZCB0aGUgaGlnaGVzdCBsZWdhbCBtYXhwYWNrZXQgc2l6ZSBmb3IgdGhpcyBlbmRwb2ludCAqLworCWkgPSAwOwkJLyogYWRkaXRpb25hbCB0cmFuc2FjdGlvbnMgcGVyIG1pY3JvZnJhbWUgKi8KKwlzd2l0Y2ggKHRvX3VzYl9kZXZpY2UoZGRldiktPnNwZWVkKSB7CisJY2FzZSBVU0JfU1BFRURfTE9XOgorCQltYXhwYWNrZXRfbWF4ZXMgPSBsb3dfc3BlZWRfbWF4cGFja2V0X21heGVzOworCQlicmVhazsKKwljYXNlIFVTQl9TUEVFRF9GVUxMOgorCQltYXhwYWNrZXRfbWF4ZXMgPSBmdWxsX3NwZWVkX21heHBhY2tldF9tYXhlczsKKwkJYnJlYWs7CisJY2FzZSBVU0JfU1BFRURfSElHSDoKKwkJLyogQml0cyAxMi4uMTEgYXJlIGFsbG93ZWQgb25seSBmb3IgSFMgcGVyaW9kaWMgZW5kcG9pbnRzICovCisJCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pbnQoZCkgfHwgdXNiX2VuZHBvaW50X3hmZXJfaXNvYyhkKSkgeworCQkJaSA9IG1heHAgJiAoQklUKDEyKSB8IEJJVCgxMSkpOworCQkJbWF4cCAmPSB+aTsKKwkJfQorCQkvKiBmYWxsdGhyb3VnaCAqLworCWRlZmF1bHQ6CisJCW1heHBhY2tldF9tYXhlcyA9IGhpZ2hfc3BlZWRfbWF4cGFja2V0X21heGVzOworCQlicmVhazsKKwljYXNlIFVTQl9TUEVFRF9TVVBFUjoKKwljYXNlIFVTQl9TUEVFRF9TVVBFUl9QTFVTOgorCQltYXhwYWNrZXRfbWF4ZXMgPSBzdXBlcl9zcGVlZF9tYXhwYWNrZXRfbWF4ZXM7CisJCWJyZWFrOworCX0KKwlqID0gbWF4cGFja2V0X21heGVzW3VzYl9lbmRwb2ludF90eXBlKCZlbmRwb2ludC0+ZGVzYyldOworCisJaWYgKG1heHAgPiBqKSB7CisJCWRldl93YXJuKGRkZXYsICJjb25maWcgJWQgaW50ZXJmYWNlICVkIGFsdHNldHRpbmcgJWQgZW5kcG9pbnQgMHglWCBoYXMgaW52YWxpZCBtYXhwYWNrZXQgJWQsIHNldHRpbmcgdG8gJWRcbiIsCisJCSAgICBjZmdubywgaW51bSwgYXNudW0sIGQtPmJFbmRwb2ludEFkZHJlc3MsIG1heHAsIGopOworCQltYXhwID0gajsKKwkJZW5kcG9pbnQtPmRlc2Mud01heFBhY2tldFNpemUgPSBjcHVfdG9fbGUxNihpIHwgbWF4cCk7CisJfQorCiAJLyoKIAkgKiBTb21lIGJ1Z2d5IGhpZ2ggc3BlZWQgZGV2aWNlcyBoYXZlIGJ1bGsgZW5kcG9pbnRzIHVzaW5nCiAJICogbWF4cGFja2V0IHNpemVzIG90aGVyIHRoYW4gNTEyLiAgSGlnaCBzcGVlZCBIQ0RzIG1heSBub3QKQEAgLTI5Myw5ICszNjIsNiBAQAogCSAqLwogCWlmICh0b191c2JfZGV2aWNlKGRkZXYpLT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSAogCQkJJiYgdXNiX2VuZHBvaW50X3hmZXJfYnVsayhkKSkgewotCQl1bnNpZ25lZCBtYXhwOwotCi0JCW1heHAgPSB1c2JfZW5kcG9pbnRfbWF4cCgmZW5kcG9pbnQtPmRlc2MpICYgMHgwN2ZmOwogCQlpZiAobWF4cCAhPSA1MTIpCiAJCQlkZXZfd2FybihkZGV2LCAiY29uZmlnICVkIGludGVyZmFjZSAlZCBhbHRzZXR0aW5nICVkICIKIAkJCQkiYnVsayBlbmRwb2ludCAweCVYIGhhcyBpbnZhbGlkIG1heHBhY2tldCAlZFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYyBiL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYwppbmRleCBlOWY1MDQzLi4wOWM4ZDljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9kZXZpby5jCkBAIC0yNDEsNyArMjQxLDggQEAKIAkJZ290byBlcnJvcl9kZWNyZWFzZV9tZW07CiAJfQogCi0JbWVtID0gdXNiX2FsbG9jX2NvaGVyZW50KHBzLT5kZXYsIHNpemUsIEdGUF9VU0VSLCAmZG1hX2hhbmRsZSk7CisJbWVtID0gdXNiX2FsbG9jX2NvaGVyZW50KHBzLT5kZXYsIHNpemUsIEdGUF9VU0VSIHwgX19HRlBfTk9XQVJOLAorCQkJJmRtYV9oYW5kbGUpOwogCWlmICghbWVtKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3JfZnJlZV91c2JtOwpAQCAtMTcwOCwxMSArMTcwOSwxNyBAQAogCWFzLT51cmItPnN0YXJ0X2ZyYW1lID0gdXVyYi0+c3RhcnRfZnJhbWU7CiAJYXMtPnVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSBudW1iZXJfb2ZfcGFja2V0czsKIAlhcy0+dXJiLT5zdHJlYW1faWQgPSBzdHJlYW1faWQ7Ci0JaWYgKHV1cmItPnR5cGUgPT0gVVNCREVWRlNfVVJCX1RZUEVfSVNPIHx8Ci0JCQlwcy0+ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkKLQkJYXMtPnVyYi0+aW50ZXJ2YWwgPSAxIDw8IG1pbigxNSwgZXAtPmRlc2MuYkludGVydmFsIC0gMSk7Ci0JZWxzZQotCQlhcy0+dXJiLT5pbnRlcnZhbCA9IGVwLT5kZXNjLmJJbnRlcnZhbDsKKworCWlmIChlcC0+ZGVzYy5iSW50ZXJ2YWwpIHsKKwkJaWYgKHV1cmItPnR5cGUgPT0gVVNCREVWRlNfVVJCX1RZUEVfSVNPIHx8CisJCQkJcHMtPmRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0ggfHwKKwkJCQlwcy0+ZGV2LT5zcGVlZCA+PSBVU0JfU1BFRURfU1VQRVIpCisJCQlhcy0+dXJiLT5pbnRlcnZhbCA9IDEgPDwKKwkJCQkJbWluKDE1LCBlcC0+ZGVzYy5iSW50ZXJ2YWwgLSAxKTsKKwkJZWxzZQorCQkJYXMtPnVyYi0+aW50ZXJ2YWwgPSBlcC0+ZGVzYy5iSW50ZXJ2YWw7CisJfQorCiAJYXMtPnVyYi0+Y29udGV4dCA9IGFzOwogCWFzLT51cmItPmNvbXBsZXRlID0gYXN5bmNfY29tcGxldGVkOwogCWZvciAodG90bGVuID0gdSA9IDA7IHUgPCBudW1iZXJfb2ZfcGFja2V0czsgdSsrKSB7CkBAIC0yNTgyLDcgKzI1ODksOSBAQAogCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSAmJiAhbGlzdF9lbXB0eSgmcHMtPmFzeW5jX2NvbXBsZXRlZCkpCiAJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CiAJaWYgKCFjb25uZWN0ZWQocHMpKQotCQltYXNrIHw9IFBPTExFUlIgfCBQT0xMSFVQOworCQltYXNrIHw9IFBPTExIVVA7CisJaWYgKGxpc3RfZW1wdHkoJnBzLT5saXN0KSkKKwkJbWFzayB8PSBQT0xMRVJSOwogCXJldHVybiBtYXNrOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jIGIvZHJpdmVycy91c2IvY29yZS9oY2QuYwppbmRleCBkMmUzZjY1Li40NzllMjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKQEAgLTQ2LDYgKzQ2LDcgQEAKICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvaGNkLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9vdGcuaD4KIAogI2luY2x1ZGUgInVzYi5oIgogCkBAIC0yNTE3LDEwICsyNTE4LDggQEAKIAlzdHJ1Y3QgdXNiX2hjZCAqaGNkOwogCiAJaGNkID0ga3phbGxvYyhzaXplb2YoKmhjZCkgKyBkcml2ZXItPmhjZF9wcml2X3NpemUsIEdGUF9LRVJORUwpOwotCWlmICghaGNkKSB7Ci0JCWRldl9kYmcgKGRldiwgImhjZCBhbGxvYyBmYWlsZWRcbiIpOworCWlmICghaGNkKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAJaWYgKHByaW1hcnlfaGNkID09IE5VTEwpIHsKIAkJaGNkLT5hZGRyZXNzMF9tdXRleCA9IGttYWxsb2Moc2l6ZW9mKCpoY2QtPmFkZHJlc3MwX211dGV4KSwKIAkJCQlHRlBfS0VSTkVMKTsKQEAgLTMwMzMsNyArMzAzMiw3IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19VU0JfTU9OKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfTU9OX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19VU0JfTU9OKQogCiBjb25zdCBzdHJ1Y3QgdXNiX21vbl9vcGVyYXRpb25zICptb25fb3BzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwppbmRleCBiZWUxMzUxLi5jYmIxNDY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKQEAgLTEwNTIsMTQgKzEwNTIsMTEgQEAKIAogCS8qIENvbnRpbnVlIGEgcGFydGlhbCBpbml0aWFsaXphdGlvbiAqLwogCWlmICh0eXBlID09IEhVQl9JTklUMiB8fCB0eXBlID09IEhVQl9JTklUMykgewotCQlkZXZpY2VfbG9jayhodWItPmludGZkZXYpOworCQlkZXZpY2VfbG9jaygmaGRldi0+ZGV2KTsKIAogCQkvKiBXYXMgdGhlIGh1YiBkaXNjb25uZWN0ZWQgd2hpbGUgd2Ugd2VyZSB3YWl0aW5nPyAqLwotCQlpZiAoaHViLT5kaXNjb25uZWN0ZWQpIHsKLQkJCWRldmljZV91bmxvY2soaHViLT5pbnRmZGV2KTsKLQkJCWtyZWZfcHV0KCZodWItPmtyZWYsIGh1Yl9yZWxlYXNlKTsKLQkJCXJldHVybjsKLQkJfQorCQlpZiAoaHViLT5kaXNjb25uZWN0ZWQpCisJCQlnb3RvIGRpc2Nvbm5lY3RlZDsKIAkJaWYgKHR5cGUgPT0gSFVCX0lOSVQyKQogCQkJZ290byBpbml0MjsKIAkJZ290byBpbml0MzsKQEAgLTEyNjIsNyArMTI1OSw3IEBACiAJCQlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX3Bvd2VyX2VmZmljaWVudF93cSwKIAkJCQkJJmh1Yi0+aW5pdF93b3JrLAogCQkJCQltc2Vjc190b19qaWZmaWVzKGRlbGF5KSk7Ci0JCQlkZXZpY2VfdW5sb2NrKGh1Yi0+aW50ZmRldik7CisJCQlkZXZpY2VfdW5sb2NrKCZoZGV2LT5kZXYpOwogCQkJcmV0dXJuOwkJLyogQ29udGludWVzIGF0IGluaXQzOiBiZWxvdyAqLwogCQl9IGVsc2UgewogCQkJbXNsZWVwKGRlbGF5KTsKQEAgLTEyODEsMTIgKzEyNzgsMTIgQEAKIAkvKiBTY2FuIGFsbCBwb3J0cyB0aGF0IG5lZWQgYXR0ZW50aW9uICovCiAJa2lja19odWJfd3EoaHViKTsKIAotCS8qIEFsbG93IGF1dG9zdXNwZW5kIGlmIGl0IHdhcyBzdXBwcmVzc2VkICovCi0JaWYgKHR5cGUgPD0gSFVCX0lOSVQzKQorCWlmICh0eXBlID09IEhVQl9JTklUMiB8fCB0eXBlID09IEhVQl9JTklUMykgeworCQkvKiBBbGxvdyBhdXRvc3VzcGVuZCBpZiBpdCB3YXMgc3VwcHJlc3NlZCAqLworIGRpc2Nvbm5lY3RlZDoKIAkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlX2FzeW5jKHRvX3VzYl9pbnRlcmZhY2UoaHViLT5pbnRmZGV2KSk7Ci0KLQlpZiAodHlwZSA9PSBIVUJfSU5JVDIgfHwgdHlwZSA9PSBIVUJfSU5JVDMpCi0JCWRldmljZV91bmxvY2soaHViLT5pbnRmZGV2KTsKKwkJZGV2aWNlX3VubG9jaygmaGRldi0+ZGV2KTsKKwl9CiAKIAlrcmVmX3B1dCgmaHViLT5rcmVmLCBodWJfcmVsZWFzZSk7CiB9CkBAIC0xMzE1LDggKzEzMTIsNiBAQAogCXN0cnVjdCB1c2JfZGV2aWNlICpoZGV2ID0gaHViLT5oZGV2OwogCWludCBpOwogCi0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZodWItPmluaXRfd29yayk7Ci0KIAkvKiBodWJfd3EgYW5kIHJlbGF0ZWQgYWN0aXZpdHkgd29uJ3QgcmUtdHJpZ2dlciAqLwogCWh1Yi0+cXVpZXNjaW5nID0gMTsKIApAQCAtMTgyOCwxMCArMTgyMyw4IEBACiAJZGV2X2luZm8oJmludGYtPmRldiwgIlVTQiBodWIgZm91bmRcbiIpOwogCiAJaHViID0ga3phbGxvYyhzaXplb2YoKmh1YiksIEdGUF9LRVJORUwpOwotCWlmICghaHViKSB7Ci0JCWRldl9kYmcoJmludGYtPmRldiwgImNvdWxkbid0IGttYWxsb2MgaHViIHN0cnVjdFxuIik7CisJaWYgKCFodWIpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWtyZWZfaW5pdCgmaHViLT5rcmVmKTsKIAlodWItPmludGZkZXYgPSAmaW50Zi0+ZGV2OwpAQCAtMzExMSw3ICszMTA0LDcgQEAKIAkJCQlVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CiAJZWxzZQogCQlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKLQkJCQlVU0JfUkVRX0NMRUFSX0ZFQVRVUkUsIFVTQl9SRUNJUF9JTlRFUkZBQ0UsCisJCQkJVVNCX1JFUV9TRVRfRkVBVFVSRSwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKIAkJCQlVU0JfSU5UUkZfRlVOQ19TVVNQRU5ELAkwLCBOVUxMLCAwLAogCQkJCVVTQl9DVFJMX1NFVF9USU1FT1VUKTsKIH0KQEAgLTUzNDIsMTEgKzUzMzUsMTAgQEAKIAl9CiAKIAlidWYgPSBrbWFsbG9jKGxlbiwgR0ZQX05PSU8pOwotCWlmIChidWYgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJubyBtZW0gdG8gcmUtcmVhZCBjb25maWdzIGFmdGVyIHJlc2V0XG4iKTsKKwlpZiAoIWJ1ZikKIAkJLyogYXNzdW1lIHRoZSB3b3JzdCAqLwogCQlyZXR1cm4gMTsKLQl9CisKIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB1ZGV2LT5kZXNjcmlwdG9yLmJOdW1Db25maWd1cmF0aW9uczsgaW5kZXgrKykgewogCQlvbGRfbGVuZ3RoID0gbGUxNl90b19jcHUodWRldi0+Y29uZmlnW2luZGV4XS5kZXNjLndUb3RhbExlbmd0aCk7CiAJCWxlbmd0aCA9IHVzYl9nZXRfZGVzY3JpcHRvcih1ZGV2LCBVU0JfRFRfQ09ORklHLCBpbmRleCwgYnVmLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9sZWR0cmlnLXVzYnBvcnQuYyBiL2RyaXZlcnMvdXNiL2NvcmUvbGVkdHJpZy11c2Jwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VkNTE2MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvbGVkdHJpZy11c2Jwb3J0LmMKQEAgLTAsMCArMSwzMTQgQEAKKy8qCisgKiBVU0IgcG9ydCBMRUQgdHJpZ2dlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBSYWZhxYIgTWnFgmVja2kgPHJhZmFsQG1pbGVja2kucGw+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGVkcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworc3RydWN0IHVzYnBvcnRfdHJpZ19kYXRhIHsKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHBvcnRzOworCXN0cnVjdCBub3RpZmllcl9ibG9jayBuYjsKKwlpbnQgY291bnQ7IC8qIEFtb3VudCBvZiBjb25uZWN0ZWQgbWF0Y2hpbmcgZGV2aWNlcyAqLworfTsKKworc3RydWN0IHVzYnBvcnRfdHJpZ19wb3J0IHsKKwlzdHJ1Y3QgdXNicG9ydF90cmlnX2RhdGEgKmRhdGE7CisJc3RydWN0IHVzYl9kZXZpY2UgKmh1YjsKKwlpbnQgcG9ydG51bTsKKwljaGFyICpwb3J0X25hbWU7CisJYm9vbCBvYnNlcnZlZDsKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBhdHRyOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEhlbHBlcnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogdXNicG9ydF90cmlnX3VzYl9kZXZfb2JzZXJ2ZWQgLSBDaGVjayBpZiBkZXYgaXMgY29ubmVjdGVkIHRvIG9ic2VydmVkIHBvcnQKKyAqLworc3RhdGljIGJvb2wgdXNicG9ydF90cmlnX3VzYl9kZXZfb2JzZXJ2ZWQoc3RydWN0IHVzYnBvcnRfdHJpZ19kYXRhICp1c2Jwb3J0X2RhdGEsCisJCQkJCSAgc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYpCit7CisJc3RydWN0IHVzYnBvcnRfdHJpZ19wb3J0ICpwb3J0OworCisJaWYgKCF1c2JfZGV2LT5wYXJlbnQpCisJCXJldHVybiBmYWxzZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocG9ydCwgJnVzYnBvcnRfZGF0YS0+cG9ydHMsIGxpc3QpIHsKKwkJaWYgKHVzYl9kZXYtPnBhcmVudCA9PSBwb3J0LT5odWIgJiYKKwkJICAgIHVzYl9kZXYtPnBvcnRudW0gPT0gcG9ydC0+cG9ydG51bSkKKwkJCXJldHVybiBwb3J0LT5vYnNlcnZlZDsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgdXNicG9ydF90cmlnX3VzYl9kZXZfY2hlY2soc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHVzYnBvcnRfdHJpZ19kYXRhICp1c2Jwb3J0X2RhdGEgPSBkYXRhOworCisJaWYgKHVzYnBvcnRfdHJpZ191c2JfZGV2X29ic2VydmVkKHVzYnBvcnRfZGF0YSwgdXNiX2RldikpCisJCXVzYnBvcnRfZGF0YS0+Y291bnQrKzsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHVzYnBvcnRfdHJpZ191cGRhdGVfY291bnQgLSBSZWNhbGN1bGF0ZSBhbW91bnQgb2YgY29ubmVjdGVkIG1hdGNoaW5nIGRldmljZXMKKyAqLworc3RhdGljIHZvaWQgdXNicG9ydF90cmlnX3VwZGF0ZV9jb3VudChzdHJ1Y3QgdXNicG9ydF90cmlnX2RhdGEgKnVzYnBvcnRfZGF0YSkKK3sKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiA9IHVzYnBvcnRfZGF0YS0+bGVkX2NkZXY7CisKKwl1c2Jwb3J0X2RhdGEtPmNvdW50ID0gMDsKKwl1c2JfZm9yX2VhY2hfZGV2KHVzYnBvcnRfZGF0YSwgdXNicG9ydF90cmlnX3VzYl9kZXZfY2hlY2spOworCWxlZF9jZGV2LT5icmlnaHRuZXNzX3NldChsZWRfY2RldiwKKwkJCQkgdXNicG9ydF9kYXRhLT5jb3VudCA/IExFRF9GVUxMIDogTEVEX09GRik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERldmljZSBhdHRyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3NpemVfdCB1c2Jwb3J0X3RyaWdfcG9ydF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB1c2Jwb3J0X3RyaWdfcG9ydCAqcG9ydCA9IGNvbnRhaW5lcl9vZihhdHRyLAorCQkJCQkJICAgICAgc3RydWN0IHVzYnBvcnRfdHJpZ19wb3J0LAorCQkJCQkJICAgICAgYXR0cik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcG9ydC0+b2JzZXJ2ZWQpICsgMTsKK30KKworc3RhdGljIHNzaXplX3QgdXNicG9ydF90cmlnX3BvcnRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgdXNicG9ydF90cmlnX3BvcnQgKnBvcnQgPSBjb250YWluZXJfb2YoYXR0ciwKKwkJCQkJCSAgICAgIHN0cnVjdCB1c2Jwb3J0X3RyaWdfcG9ydCwKKwkJCQkJCSAgICAgIGF0dHIpOworCisJaWYgKCFzdHJjbXAoYnVmLCAiMCIpIHx8ICFzdHJjbXAoYnVmLCAiMFxuIikpCisJCXBvcnQtPm9ic2VydmVkID0gMDsKKwllbHNlIGlmICghc3RyY21wKGJ1ZiwgIjEiKSB8fCAhc3RyY21wKGJ1ZiwgIjFcbiIpKQorCQlwb3J0LT5vYnNlcnZlZCA9IDE7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXVzYnBvcnRfdHJpZ191cGRhdGVfY291bnQocG9ydC0+ZGF0YSk7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnBvcnRzX2F0dHJzW10gPSB7CisJTlVMTCwKK307CitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBwb3J0c19ncm91cCA9IHsKKwkubmFtZSA9ICJwb3J0cyIsCisJLmF0dHJzID0gcG9ydHNfYXR0cnMsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBZGRpbmcgJiByZW1vdmluZyBwb3J0cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCB1c2Jwb3J0X3RyaWdfYWRkX3BvcnQoc3RydWN0IHVzYnBvcnRfdHJpZ19kYXRhICp1c2Jwb3J0X2RhdGEsCisJCQkJIHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LAorCQkJCSBjb25zdCBjaGFyICpodWJfbmFtZSwgaW50IHBvcnRudW0pCit7CisJc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYgPSB1c2Jwb3J0X2RhdGEtPmxlZF9jZGV2OworCXN0cnVjdCB1c2Jwb3J0X3RyaWdfcG9ydCAqcG9ydDsKKwlzaXplX3QgbGVuOworCWludCBlcnI7CisKKwlwb3J0ID0ga3phbGxvYyhzaXplb2YoKnBvcnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBvcnQpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCXBvcnQtPmRhdGEgPSB1c2Jwb3J0X2RhdGE7CisJcG9ydC0+aHViID0gdXNiX2RldjsKKwlwb3J0LT5wb3J0bnVtID0gcG9ydG51bTsKKworCWxlbiA9IHN0cmxlbihodWJfbmFtZSkgKyA4OworCXBvcnQtPnBvcnRfbmFtZSA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBvcnQtPnBvcnRfbmFtZSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlX3BvcnQ7CisJfQorCXNucHJpbnRmKHBvcnQtPnBvcnRfbmFtZSwgbGVuLCAiJXMtcG9ydCVkIiwgaHViX25hbWUsIHBvcnRudW0pOworCisJcG9ydC0+YXR0ci5hdHRyLm5hbWUgPSBwb3J0LT5wb3J0X25hbWU7CisJcG9ydC0+YXR0ci5hdHRyLm1vZGUgPSBTX0lSVVNSIHwgU19JV1VTUjsKKwlwb3J0LT5hdHRyLnNob3cgPSB1c2Jwb3J0X3RyaWdfcG9ydF9zaG93OworCXBvcnQtPmF0dHIuc3RvcmUgPSB1c2Jwb3J0X3RyaWdfcG9ydF9zdG9yZTsKKworCWVyciA9IHN5c2ZzX2FkZF9maWxlX3RvX2dyb3VwKCZsZWRfY2Rldi0+ZGV2LT5rb2JqLCAmcG9ydC0+YXR0ci5hdHRyLAorCQkJCSAgICAgIHBvcnRzX2dyb3VwLm5hbWUpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2ZyZWVfcG9ydF9uYW1lOworCisJbGlzdF9hZGRfdGFpbCgmcG9ydC0+bGlzdCwgJnVzYnBvcnRfZGF0YS0+cG9ydHMpOworCisJcmV0dXJuIDA7CisKK2Vycl9mcmVlX3BvcnRfbmFtZToKKwlrZnJlZShwb3J0LT5wb3J0X25hbWUpOworZXJyX2ZyZWVfcG9ydDoKKwlrZnJlZShwb3J0KTsKK2Vycl9vdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB1c2Jwb3J0X3RyaWdfYWRkX3VzYl9kZXZfcG9ydHMoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsCisJCQkJCSAgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdXNicG9ydF90cmlnX2RhdGEgKnVzYnBvcnRfZGF0YSA9IGRhdGE7CisJaW50IGk7CisKKwlmb3IgKGkgPSAxOyBpIDw9IHVzYl9kZXYtPm1heGNoaWxkOyBpKyspCisJCXVzYnBvcnRfdHJpZ19hZGRfcG9ydCh1c2Jwb3J0X2RhdGEsIHVzYl9kZXYsCisJCQkJICAgICAgZGV2X25hbWUoJnVzYl9kZXYtPmRldiksIGkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVzYnBvcnRfdHJpZ19yZW1vdmVfcG9ydChzdHJ1Y3QgdXNicG9ydF90cmlnX2RhdGEgKnVzYnBvcnRfZGF0YSwKKwkJCQkgICAgIHN0cnVjdCB1c2Jwb3J0X3RyaWdfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiA9IHVzYnBvcnRfZGF0YS0+bGVkX2NkZXY7CisKKwlsaXN0X2RlbCgmcG9ydC0+bGlzdCk7CisJc3lzZnNfcmVtb3ZlX2ZpbGVfZnJvbV9ncm91cCgmbGVkX2NkZXYtPmRldi0+a29iaiwgJnBvcnQtPmF0dHIuYXR0ciwKKwkJCQkgICAgIHBvcnRzX2dyb3VwLm5hbWUpOworCWtmcmVlKHBvcnQtPnBvcnRfbmFtZSk7CisJa2ZyZWUocG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIHVzYnBvcnRfdHJpZ19yZW1vdmVfdXNiX2Rldl9wb3J0cyhzdHJ1Y3QgdXNicG9ydF90cmlnX2RhdGEgKnVzYnBvcnRfZGF0YSwKKwkJCQkJICAgICAgc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYpCit7CisJc3RydWN0IHVzYnBvcnRfdHJpZ19wb3J0ICpwb3J0LCAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcnQsIHRtcCwgJnVzYnBvcnRfZGF0YS0+cG9ydHMsIGxpc3QpIHsKKwkJaWYgKHBvcnQtPmh1YiA9PSB1c2JfZGV2KQorCQkJdXNicG9ydF90cmlnX3JlbW92ZV9wb3J0KHVzYnBvcnRfZGF0YSwgcG9ydCk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbml0LCBleGl0LCBldGMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHVzYnBvcnRfdHJpZ19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sCisJCQkgICAgICAgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdXNicG9ydF90cmlnX2RhdGEgKnVzYnBvcnRfZGF0YSA9CisJCWNvbnRhaW5lcl9vZihuYiwgc3RydWN0IHVzYnBvcnRfdHJpZ19kYXRhLCBuYik7CisJc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYgPSB1c2Jwb3J0X2RhdGEtPmxlZF9jZGV2OworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gZGF0YTsKKwlib29sIG9ic2VydmVkOworCisJb2JzZXJ2ZWQgPSB1c2Jwb3J0X3RyaWdfdXNiX2Rldl9vYnNlcnZlZCh1c2Jwb3J0X2RhdGEsIHVzYl9kZXYpOworCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIFVTQl9ERVZJQ0VfQUREOgorCQl1c2Jwb3J0X3RyaWdfYWRkX3VzYl9kZXZfcG9ydHModXNiX2RldiwgdXNicG9ydF9kYXRhKTsKKwkJaWYgKG9ic2VydmVkICYmIHVzYnBvcnRfZGF0YS0+Y291bnQrKyA9PSAwKQorCQkJbGVkX2NkZXYtPmJyaWdodG5lc3Nfc2V0KGxlZF9jZGV2LCBMRURfRlVMTCk7CisJCXJldHVybiBOT1RJRllfT0s7CisJY2FzZSBVU0JfREVWSUNFX1JFTU9WRToKKwkJdXNicG9ydF90cmlnX3JlbW92ZV91c2JfZGV2X3BvcnRzKHVzYnBvcnRfZGF0YSwgdXNiX2Rldik7CisJCWlmIChvYnNlcnZlZCAmJiAtLXVzYnBvcnRfZGF0YS0+Y291bnQgPT0gMCkKKwkJCWxlZF9jZGV2LT5icmlnaHRuZXNzX3NldChsZWRfY2RldiwgTEVEX09GRik7CisJCXJldHVybiBOT1RJRllfT0s7CisJfQorCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgdm9pZCB1c2Jwb3J0X3RyaWdfYWN0aXZhdGUoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYpCit7CisJc3RydWN0IHVzYnBvcnRfdHJpZ19kYXRhICp1c2Jwb3J0X2RhdGE7CisJaW50IGVycjsKKworCXVzYnBvcnRfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCp1c2Jwb3J0X2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVzYnBvcnRfZGF0YSkKKwkJcmV0dXJuOworCXVzYnBvcnRfZGF0YS0+bGVkX2NkZXYgPSBsZWRfY2RldjsKKworCS8qIExpc3Qgb2YgcG9ydHMgKi8KKwlJTklUX0xJU1RfSEVBRCgmdXNicG9ydF9kYXRhLT5wb3J0cyk7CisJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZsZWRfY2Rldi0+ZGV2LT5rb2JqLCAmcG9ydHNfZ3JvdXApOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2ZyZWU7CisJdXNiX2Zvcl9lYWNoX2Rldih1c2Jwb3J0X2RhdGEsIHVzYnBvcnRfdHJpZ19hZGRfdXNiX2Rldl9wb3J0cyk7CisKKwkvKiBOb3RpZmljYXRpb25zICovCisJdXNicG9ydF9kYXRhLT5uYi5ub3RpZmllcl9jYWxsID0gdXNicG9ydF90cmlnX25vdGlmeSwKKwlsZWRfY2Rldi0+dHJpZ2dlcl9kYXRhID0gdXNicG9ydF9kYXRhOworCXVzYl9yZWdpc3Rlcl9ub3RpZnkoJnVzYnBvcnRfZGF0YS0+bmIpOworCisJbGVkX2NkZXYtPmFjdGl2YXRlZCA9IHRydWU7CisJcmV0dXJuOworCitlcnJfZnJlZToKKwlrZnJlZSh1c2Jwb3J0X2RhdGEpOworfQorCitzdGF0aWMgdm9pZCB1c2Jwb3J0X3RyaWdfZGVhY3RpdmF0ZShzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldikKK3sKKwlzdHJ1Y3QgdXNicG9ydF90cmlnX2RhdGEgKnVzYnBvcnRfZGF0YSA9IGxlZF9jZGV2LT50cmlnZ2VyX2RhdGE7CisJc3RydWN0IHVzYnBvcnRfdHJpZ19wb3J0ICpwb3J0LCAqdG1wOworCisJaWYgKCFsZWRfY2Rldi0+YWN0aXZhdGVkKQorCQlyZXR1cm47CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9ydCwgdG1wLCAmdXNicG9ydF9kYXRhLT5wb3J0cywgbGlzdCkgeworCQl1c2Jwb3J0X3RyaWdfcmVtb3ZlX3BvcnQodXNicG9ydF9kYXRhLCBwb3J0KTsKKwl9CisKKwl1c2JfdW5yZWdpc3Rlcl9ub3RpZnkoJnVzYnBvcnRfZGF0YS0+bmIpOworCisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZsZWRfY2Rldi0+ZGV2LT5rb2JqLCAmcG9ydHNfZ3JvdXApOworCisJa2ZyZWUodXNicG9ydF9kYXRhKTsKKworCWxlZF9jZGV2LT5hY3RpdmF0ZWQgPSBmYWxzZTsKK30KKworc3RhdGljIHN0cnVjdCBsZWRfdHJpZ2dlciB1c2Jwb3J0X2xlZF90cmlnZ2VyID0geworCS5uYW1lICAgICA9ICJ1c2Jwb3J0IiwKKwkuYWN0aXZhdGUgPSB1c2Jwb3J0X3RyaWdfYWN0aXZhdGUsCisJLmRlYWN0aXZhdGUgPSB1c2Jwb3J0X3RyaWdfZGVhY3RpdmF0ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHVzYnBvcnRfdHJpZ19pbml0KHZvaWQpCit7CisJcmV0dXJuIGxlZF90cmlnZ2VyX3JlZ2lzdGVyKCZ1c2Jwb3J0X2xlZF90cmlnZ2VyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVzYnBvcnRfdHJpZ19leGl0KHZvaWQpCit7CisJbGVkX3RyaWdnZXJfdW5yZWdpc3RlcigmdXNicG9ydF9sZWRfdHJpZ2dlcik7Cit9CisKK21vZHVsZV9pbml0KHVzYnBvcnRfdHJpZ19pbml0KTsKK21vZHVsZV9leGl0KHVzYnBvcnRfdHJpZ19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUmFmYcWCIE1pxYJlY2tpIDxyYWZhbEBtaWxlY2tpLnBsPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJVU0IgcG9ydCB0cmlnZ2VyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYyBiL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCmluZGV4IDA0MDZhNTkuLjNhNDcwNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCkBAIC0xNzYwLDE3ICsxNzYwLDE0IEBACiAJCW5pbnRmID0gY3AtPmRlc2MuYk51bUludGVyZmFjZXM7CiAJCW5ld19pbnRlcmZhY2VzID0ga21hbGxvYyhuaW50ZiAqIHNpemVvZigqbmV3X2ludGVyZmFjZXMpLAogCQkJCUdGUF9OT0lPKTsKLQkJaWYgKCFuZXdfaW50ZXJmYWNlcykgewotCQkJZGV2X2VycigmZGV2LT5kZXYsICJPdXQgb2YgbWVtb3J5XG4iKTsKKwkJaWYgKCFuZXdfaW50ZXJmYWNlcykKIAkJCXJldHVybiAtRU5PTUVNOwotCQl9CiAKIAkJZm9yICg7IG4gPCBuaW50ZjsgKytuKSB7CiAJCQluZXdfaW50ZXJmYWNlc1tuXSA9IGt6YWxsb2MoCiAJCQkJCXNpemVvZihzdHJ1Y3QgdXNiX2ludGVyZmFjZSksCiAJCQkJCUdGUF9OT0lPKTsKIAkJCWlmICghbmV3X2ludGVyZmFjZXNbbl0pIHsKLQkJCQlkZXZfZXJyKCZkZXYtPmRldiwgIk91dCBvZiBtZW1vcnlcbiIpOwogCQkJCXJldCA9IC1FTk9NRU07CiBmcmVlX2ludGVyZmFjZXM6CiAJCQkJd2hpbGUgKC0tbiA+PSAwKQpAQCAtMTg2Miw3ICsxODU5LDEyIEBACiAJCWludGYtPmRldi5idXMgPSAmdXNiX2J1c190eXBlOwogCQlpbnRmLT5kZXYudHlwZSA9ICZ1c2JfaWZfZGV2aWNlX3R5cGU7CiAJCWludGYtPmRldi5ncm91cHMgPSB1c2JfaW50ZXJmYWNlX2dyb3VwczsKKwkJLyoKKwkJICogUGxlYXNlIHJlZmVyIHRvIHVzYl9hbGxvY19kZXYoKSB0byBzZWUgd2h5IHdlIHNldAorCQkgKiBkbWFfbWFzayBhbmQgZG1hX3Bmbl9vZmZzZXQuCisJCSAqLwogCQlpbnRmLT5kZXYuZG1hX21hc2sgPSBkZXYtPmRldi5kbWFfbWFzazsKKwkJaW50Zi0+ZGV2LmRtYV9wZm5fb2Zmc2V0ID0gZGV2LT5kZXYuZG1hX3Bmbl9vZmZzZXQ7CiAJCUlOSVRfV09SSygmaW50Zi0+cmVzZXRfd3MsIF9fdXNiX3F1ZXVlX3Jlc2V0X2RldmljZSk7CiAJCWludGYtPm1pbm9yID0gLTE7CiAJCWRldmljZV9pbml0aWFsaXplKCZpbnRmLT5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9vZi5jIGIvZHJpdmVycy91c2IvY29yZS9vZi5jCmluZGV4IDIyODk3MDAuLjNkZTRmODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvb2YuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL29mLmMKQEAgLTE4LDYgKzE4LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC91c2Ivb2YuaD4KIAogLyoqCiAgKiB1c2Jfb2ZfZ2V0X2NoaWxkX25vZGUgLSBGaW5kIHRoZSBkZXZpY2Ugbm9kZSBtYXRjaCBwb3J0IG51bWJlcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9vdGdfd2hpdGVsaXN0LmggYi9kcml2ZXJzL3VzYi9jb3JlL290Z193aGl0ZWxpc3QuaAppbmRleCBhOTViMGM5Li4wODUwNDlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL290Z193aGl0ZWxpc3QuaAorKysgYi9kcml2ZXJzL3VzYi9jb3JlL290Z193aGl0ZWxpc3QuaApAQCAtMzgsNyArMzgsNyBAQAogeyBVU0JfREVWSUNFKDB4MDUyNSwgMHhhNGEyKSwgfSwKICNlbmRpZgogCi0jaWYJZGVmaW5lZChDT05GSUdfVVNCX1RFU1QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9URVNUX01PRFVMRSkKKyNpZglJU19FTkFCTEVEKENPTkZJR19VU0JfVEVTVCkKIC8qIGdhZGdldCB6ZXJvLCBmb3IgdGVzdGluZyAqLwogeyBVU0JfREVWSUNFKDB4MDUyNSwgMHhhNGEwKSwgfSwKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS91cmIuYyBiL2RyaXZlcnMvdXNiL2NvcmUvdXJiLmMKaW5kZXggYzYwMWUyNS4uYTkwMzk2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS91cmIuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL3VyYi5jCkBAIC02OCwxMCArNjgsOCBAQAogCXVyYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1cmIpICsKIAkJaXNvX3BhY2tldHMgKiBzaXplb2Yoc3RydWN0IHVzYl9pc29fcGFja2V0X2Rlc2NyaXB0b3IpLAogCQltZW1fZmxhZ3MpOwotCWlmICghdXJiKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiYWxsb2NfdXJiOiBrbWFsbG9jIGZhaWxlZFxuIik7CisJaWYgKCF1cmIpCiAJCXJldHVybiBOVUxMOwotCX0KIAl1c2JfaW5pdF91cmIodXJiKTsKIAlyZXR1cm4gdXJiOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS91c2IuYyBiL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmMKaW5kZXggNWU4MDY5Ny4uNTkyMTUxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS91c2IuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jCkBAIC00NDAsNyArNDQwLDE4IEBACiAJZGV2LT5kZXYuYnVzID0gJnVzYl9idXNfdHlwZTsKIAlkZXYtPmRldi50eXBlID0gJnVzYl9kZXZpY2VfdHlwZTsKIAlkZXYtPmRldi5ncm91cHMgPSB1c2JfZGV2aWNlX2dyb3VwczsKKwkvKgorCSAqIEZha2UgYSBkbWFfbWFzay9vZmZzZXQgZm9yIHRoZSBVU0IgZGV2aWNlOgorCSAqIFdlIGNhbm5vdCByZWFsbHkgdXNlIHRoZSBkbWEtbWFwcGluZyBBUEkgKGRtYV9hbGxvY18qIGFuZAorCSAqIGRtYV9tYXBfKikgZm9yIFVTQiBkZXZpY2VzIGJ1dCBpbnN0ZWFkIG5lZWQgdG8gdXNlCisJICogdXNiX2FsbG9jX2NvaGVyZW50IGFuZCBwYXNzIGRhdGEgaW4gJ3VyYidzLCBidXQgc29tZSBzdWJzeXN0ZW1zCisJICogbWFudWFsbHkgbG9vayBpbnRvIHRoZSBtYXNrL29mZnNldCBwYWlyIHRvIGRldGVybWluZSB3aGV0aGVyCisJICogdGhleSBuZWVkIGJvdW5jZSBidWZmZXJzLgorCSAqIE5vdGU6IGNhbGxpbmcgZG1hX3NldF9tYXNrKCkgb24gYSBVU0IgZGV2aWNlIHdvdWxkIHNldCB0aGUKKwkgKiBtYXNrIGZvciB0aGUgZW50aXJlIEhDRCwgc28gZG9uJ3QgZG8gdGhhdC4KKwkgKi8KIAlkZXYtPmRldi5kbWFfbWFzayA9IGJ1cy0+Y29udHJvbGxlci0+ZG1hX21hc2s7CisJZGV2LT5kZXYuZG1hX3Bmbl9vZmZzZXQgPSBidXMtPmNvbnRyb2xsZXItPmRtYV9wZm5fb2Zmc2V0OwogCXNldF9kZXZfbm9kZSgmZGV2LT5kZXYsIGRldl90b19ub2RlKGJ1cy0+Y29udHJvbGxlcikpOwogCWRldi0+c3RhdGUgPSBVU0JfU1RBVEVfQVRUQUNIRUQ7CiAJZGV2LT5scG1fZGlzYWJsZV9jb3VudCA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MyL2NvcmUuYyBiL2RyaXZlcnMvdXNiL2R3YzIvY29yZS5jCmluZGV4IDQxMzVhNWYuLmZhOWIyNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzIvY29yZS5jCisrKyBiL2RyaXZlcnMvdXNiL2R3YzIvY29yZS5jCkBAIC0yMzgsNiArMjM4LDc3IEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyoqCisgKiBkd2MyX3dhaXRfZm9yX21vZGUoKSAtIFdhaXRzIGZvciB0aGUgY29udHJvbGxlciBtb2RlLgorICogQGhzb3RnOglQcm9ncmFtbWluZyB2aWV3IG9mIHRoZSBEV0Nfb3RnIGNvbnRyb2xsZXIuCisgKiBAaG9zdF9tb2RlOglJZiB0cnVlLCB3YWl0cyBmb3IgaG9zdCBtb2RlLCBvdGhlcndpc2UgZGV2aWNlIG1vZGUuCisgKi8KK3N0YXRpYyB2b2lkIGR3YzJfd2FpdF9mb3JfbW9kZShzdHJ1Y3QgZHdjMl9oc290ZyAqaHNvdGcsCisJCQkgICAgICAgYm9vbCBob3N0X21vZGUpCit7CisJa3RpbWVfdCBzdGFydDsKKwlrdGltZV90IGVuZDsKKwl1bnNpZ25lZCBpbnQgdGltZW91dCA9IDExMDsKKworCWRldl92ZGJnKGhzb3RnLT5kZXYsICJXYWl0aW5nIGZvciAlcyBtb2RlXG4iLAorCQkgaG9zdF9tb2RlID8gImhvc3QiIDogImRldmljZSIpOworCisJc3RhcnQgPSBrdGltZV9nZXQoKTsKKworCXdoaWxlICgxKSB7CisJCXM2NCBtczsKKworCQlpZiAoZHdjMl9pc19ob3N0X21vZGUoaHNvdGcpID09IGhvc3RfbW9kZSkgeworCQkJZGV2X3ZkYmcoaHNvdGctPmRldiwgIiVzIG1vZGUgc2V0XG4iLAorCQkJCSBob3N0X21vZGUgPyAiSG9zdCIgOiAiRGV2aWNlIik7CisJCQlicmVhazsKKwkJfQorCisJCWVuZCA9IGt0aW1lX2dldCgpOworCQltcyA9IGt0aW1lX3RvX21zKGt0aW1lX3N1YihlbmQsIHN0YXJ0KSk7CisKKwkJaWYgKG1zID49IChzNjQpdGltZW91dCkgeworCQkJZGV2X3dhcm4oaHNvdGctPmRldiwgIiVzOiBDb3VsZG4ndCBzZXQgJXMgbW9kZVxuIiwKKwkJCQkgX19mdW5jX18sIGhvc3RfbW9kZSA/ICJob3N0IiA6ICJkZXZpY2UiKTsKKwkJCWJyZWFrOworCQl9CisKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOworCX0KK30KKworLyoqCisgKiBkd2MyX2lkZGlnX2ZpbHRlcl9lbmFibGVkKCkgLSBSZXR1cm5zIHRydWUgaWYgdGhlIElERElHIGRlYm91bmNlCisgKiBmaWx0ZXIgaXMgZW5hYmxlZC4KKyAqLworc3RhdGljIGJvb2wgZHdjMl9pZGRpZ19maWx0ZXJfZW5hYmxlZChzdHJ1Y3QgZHdjMl9oc290ZyAqaHNvdGcpCit7CisJdTMyIGdzbnBzaWQ7CisJdTMyIGdod2NmZzQ7CisKKwlpZiAoIWR3YzJfaHdfaXNfb3RnKGhzb3RnKSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogQ2hlY2sgaWYgY29yZSBjb25maWd1cmF0aW9uIGluY2x1ZGVzIHRoZSBJRERJRyBmaWx0ZXIuICovCisJZ2h3Y2ZnNCA9IGR3YzJfcmVhZGwoaHNvdGctPnJlZ3MgKyBHSFdDRkc0KTsKKwlpZiAoIShnaHdjZmc0ICYgR0hXQ0ZHNF9JRERJR19GSUxUX0VOKSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyoKKwkgKiBDaGVjayBpZiB0aGUgSURESUcgZGVib3VuY2UgZmlsdGVyIGlzIGJ5cGFzc2VkLiBBdmFpbGFibGUKKwkgKiBpbiBjb3JlIHZlcnNpb24gPj0gMy4xMGEuCisJICovCisJZ3NucHNpZCA9IGR3YzJfcmVhZGwoaHNvdGctPnJlZ3MgKyBHU05QU0lEKTsKKwlpZiAoZ3NucHNpZCA+PSBEV0MyX0NPUkVfUkVWXzNfMTBhKSB7CisJCXUzMiBnb3RnY3RsID0gZHdjMl9yZWFkbChoc290Zy0+cmVncyArIEdPVEdDVEwpOworCisJCWlmIChnb3RnY3RsICYgR09UR0NUTF9EQk5DRV9GTFRSX0JZUEFTUykKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKwogLyoKICAqIERvIGNvcmUgYSBzb2Z0IHJlc2V0IG9mIHRoZSBjb3JlLiAgQmUgY2FyZWZ1bCB3aXRoIHRoaXMgYmVjYXVzZSBpdAogICogcmVzZXRzIGFsbCB0aGUgaW50ZXJuYWwgc3RhdGUgbWFjaGluZXMgb2YgdGhlIGNvcmUuCkBAIC0yNDYsOSArMzE3LDMwIEBACiB7CiAJdTMyIGdyZXNldDsKIAlpbnQgY291bnQgPSAwOworCWJvb2wgd2FpdF9mb3JfaG9zdF9tb2RlID0gZmFsc2U7CiAKIAlkZXZfdmRiZyhoc290Zy0+ZGV2LCAiJXMoKVxuIiwgX19mdW5jX18pOwogCisJLyoKKwkgKiBJZiB0aGUgY3VycmVudCBtb2RlIGlzIGhvc3QsIGVpdGhlciBkdWUgdG8gdGhlIGZvcmNlIG1vZGUKKwkgKiBiaXQgYmVpbmcgc2V0ICh3aGljaCBwZXJzaXN0cyBhZnRlciBjb3JlIHJlc2V0KSBvciB0aGUKKwkgKiBjb25uZWN0b3IgaWQgcGluLCBhIGNvcmUgc29mdCByZXNldCB3aWxsIHRlbXBvcmFyaWx5IHJlc2V0CisJICogdGhlIG1vZGUgdG8gZGV2aWNlLiBBIGRlbGF5IGZyb20gdGhlIElERElHIGRlYm91bmNlIGZpbHRlcgorCSAqIHdpbGwgb2NjdXIgYmVmb3JlIGdvaW5nIGJhY2sgdG8gaG9zdCBtb2RlLgorCSAqCisJICogRGV0ZXJtaW5lIHdoZXRoZXIgd2Ugd2lsbCBnbyBiYWNrIGludG8gaG9zdCBtb2RlIGFmdGVyIGEKKwkgKiByZXNldCBhbmQgYWNjb3VudCBmb3IgdGhpcyBkZWxheSBhZnRlciB0aGUgcmVzZXQuCisJICovCisJaWYgKGR3YzJfaWRkaWdfZmlsdGVyX2VuYWJsZWQoaHNvdGcpKSB7CisJCXUzMiBnb3RnY3RsID0gZHdjMl9yZWFkbChoc290Zy0+cmVncyArIEdPVEdDVEwpOworCQl1MzIgZ3VzYmNmZyA9IGR3YzJfcmVhZGwoaHNvdGctPnJlZ3MgKyBHVVNCQ0ZHKTsKKworCQlpZiAoIShnb3RnY3RsICYgR09UR0NUTF9DT05JRF9CKSB8fAorCQkgICAgKGd1c2JjZmcgJiBHVVNCQ0ZHX0ZPUkNFSE9TVE1PREUpKSB7CisJCQl3YWl0X2Zvcl9ob3N0X21vZGUgPSB0cnVlOworCQl9CisJfQorCiAJLyogQ29yZSBTb2Z0IFJlc2V0ICovCiAJZ3Jlc2V0ID0gZHdjMl9yZWFkbChoc290Zy0+cmVncyArIEdSU1RDVEwpOwogCWdyZXNldCB8PSBHUlNUQ1RMX0NTRlRSU1Q7CkBAIC0yNzcsNiArMzY5LDkgQEAKIAkJfQogCX0gd2hpbGUgKCEoZ3Jlc2V0ICYgR1JTVENUTF9BSEJJRExFKSk7CiAKKwlpZiAod2FpdF9mb3JfaG9zdF9tb2RlKQorCQlkd2MyX3dhaXRfZm9yX21vZGUoaHNvdGcsIHRydWUpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMwMCw5ICszOTUsOSBAQAogICogQ2hlY2tzIGFyZSBkb25lIGluIHRoaXMgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgZG9pbmcgYSBmb3JjZQogICogd291bGQgYmUgdmFsaWQgb3Igbm90LgogICoKLSAqIElmIGEgZm9yY2UgaXMgZG9uZSwgaXQgcmVxdWlyZXMgYSAyNW1zIGRlbGF5IHRvIHRha2UgZWZmZWN0LgotICoKLSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbW9kZSB3YXMgZm9yY2VkLgorICogSWYgYSBmb3JjZSBpcyBkb25lLCBpdCByZXF1aXJlcyBhIElERElHIGRlYm91bmNlIGZpbHRlciBkZWxheSBpZgorICogdGhlIGZpbHRlciBpcyBjb25maWd1cmVkIGFuZCBlbmFibGVkLiBXZSBwb2xsIHRoZSBjdXJyZW50IG1vZGUgb2YKKyAqIHRoZSBjb250cm9sbGVyIHRvIGFjY291bnQgZm9yIHRoaXMgZGVsYXkuCiAgKi8KIHN0YXRpYyBib29sIGR3YzJfZm9yY2VfbW9kZShzdHJ1Y3QgZHdjMl9oc290ZyAqaHNvdGcsIGJvb2wgaG9zdCkKIHsKQEAgLTMzNywxMiArNDMyLDE4IEBACiAJZ3VzYmNmZyB8PSBzZXQ7CiAJZHdjMl93cml0ZWwoZ3VzYmNmZywgaHNvdGctPnJlZ3MgKyBHVVNCQ0ZHKTsKIAotCW1zbGVlcCgyNSk7CisJZHdjMl93YWl0X2Zvcl9tb2RlKGhzb3RnLCBob3N0KTsKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotLyoKLSAqIENsZWFycyB0aGUgZm9yY2UgbW9kZSBiaXRzLgorLyoqCisgKiBkd2MyX2NsZWFyX2ZvcmNlX21vZGUoKSAtIENsZWFycyB0aGUgZm9yY2UgbW9kZSBiaXRzLgorICoKKyAqIEFmdGVyIGNsZWFyaW5nIHRoZSBiaXRzLCB3YWl0IHVwIHRvIDEwMCBtcyB0byBhY2NvdW50IGZvciBhbnkKKyAqIHBvdGVudGlhbCBJRERJRyBmaWx0ZXIgZGVsYXkuIFdlIGNhbid0IGtub3cgaWYgd2UgZXhwZWN0IHRoaXMgZGVsYXkKKyAqIG9yIG5vdCBiZWNhdXNlIHRoZSB2YWx1ZSBvZiB0aGUgY29ubmVjdG9yIElEIHN0YXR1cyBpcyBhZmZlY3RlZCBieQorICogdGhlIGZvcmNlIG1vZGUuIFdlIG9ubHkgbmVlZCB0byBjYWxsIHRoaXMgb25jZSBkdXJpbmcgcHJvYmUgaWYKKyAqIGRyX21vZGUgPT0gT1RHLgogICovCiBzdGF0aWMgdm9pZCBkd2MyX2NsZWFyX2ZvcmNlX21vZGUoc3RydWN0IGR3YzJfaHNvdGcgKmhzb3RnKQogewpAQCAtMzUzLDExICs0NTQsOCBAQAogCWd1c2JjZmcgJj0gfkdVU0JDRkdfRk9SQ0VERVZNT0RFOwogCWR3YzJfd3JpdGVsKGd1c2JjZmcsIGhzb3RnLT5yZWdzICsgR1VTQkNGRyk7CiAKLQkvKgotCSAqIE5PVEU6IFRoaXMgbG9uZyBzbGVlcCBpcyBfdmVyeV8gaW1wb3J0YW50LCBvdGhlcndpc2UgdGhlIGNvcmUgd2lsbAotCSAqIG5vdCBzdGF5IGluIGhvc3QgbW9kZSBhZnRlciBhIGNvbm5lY3RvciBJRCBjaGFuZ2UhCi0JICovCi0JbXNsZWVwKDI1KTsKKwlpZiAoZHdjMl9pZGRpZ19maWx0ZXJfZW5hYmxlZChoc290ZykpCisJCXVzbGVlcF9yYW5nZSgxMDAwMDAsIDExMDAwMCk7CiB9CiAKIC8qCkBAIC0zODAsMTIgKzQ3OCw2IEBACiAJCQkgX19mdW5jX18sIGhzb3RnLT5kcl9tb2RlKTsKIAkJYnJlYWs7CiAJfQotCi0JLyoKLQkgKiBOT1RFOiBUaGlzIGlzIHJlcXVpcmVkIGZvciBzb21lIHJvY2tjaGlwIHNvYyBiYXNlZAotCSAqIHBsYXRmb3Jtcy4KLQkgKi8KLQltc2xlZXAoNTApOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMi9jb3JlLmggYi9kcml2ZXJzL3VzYi9kd2MyL2NvcmUuaAppbmRleCA5ZmFlMDI5Li5hYWQ0MTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9kd2MyL2NvcmUuaAorKysgYi9kcml2ZXJzL3VzYi9kd2MyL2NvcmUuaApAQCAtMjU5LDEzICsyNTksNiBAQAogCURXQzJfTDMsCS8qIE9mZiBzdGF0ZSAqLwogfTsKIAotLyoKLSAqIEdhZGdldCBwZXJpb2RpYyB0eCBmaWZvIHNpemVzIGFzIHVzZWQgYnkgbGVnYWN5IGRyaXZlcgotICogRVAwIGlzIG5vdCBpbmNsdWRlZAotICovCi0jZGVmaW5lIERXQzJfR19QX0xFR0FDWV9UWF9GSUZPX1NJWkUgezI1NiwgMjU2LCAyNTYsIDI1NiwgNzY4LCA3NjgsIDc2OCwgXAotCQkJCQkgICA3NjgsIDAsIDAsIDAsIDAsIDAsIDAsIDB9Ci0KIC8qIEdhZGdldCBlcDAgc3RhdGVzICovCiBlbnVtIGR3YzJfZXAwX3N0YXRlIHsKIAlEV0MyX0VQMF9TRVRVUCwKQEAgLTg2OCw2ICs4NjEsNyBAQAogCXZvaWQgKnByaXY7CiAJaW50ICAgICBpcnE7CiAJc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCByZXNldF9jb250cm9sICpyZXNldDsKIAogCXVuc2lnbmVkIGludCBxdWV1aW5nX2hpZ2hfYmFuZHdpZHRoOjE7CiAJdW5zaWduZWQgaW50IHNycF9zdWNjZXNzOjE7CkBAIC04ODksNiArODgzLDcgQEAKICNkZWZpbmUgRFdDMl9DT1JFX1JFVl8yXzkyYQkweDRmNTQyOTJhCiAjZGVmaW5lIERXQzJfQ09SRV9SRVZfMl85NGEJMHg0ZjU0Mjk0YQogI2RlZmluZSBEV0MyX0NPUkVfUkVWXzNfMDBhCTB4NGY1NDMwMGEKKyNkZWZpbmUgRFdDMl9DT1JFX1JFVl8zXzEwYQkweDRmNTQzMTBhCiAKICNpZiBJU19FTkFCTEVEKENPTkZJR19VU0JfRFdDMl9IT1NUKSB8fCBJU19FTkFCTEVEKENPTkZJR19VU0JfRFdDMl9EVUFMX1JPTEUpCiAJdW5pb24gZHdjMl9oY2RfaW50ZXJuYWxfZmxhZ3MgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMi9nYWRnZXQuYyBiL2RyaXZlcnMvdXNiL2R3YzIvZ2FkZ2V0LmMKaW5kZXggYWY0NmFkZi4uNGNkNjQwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZHdjMi9nYWRnZXQuYworKysgYi9kcml2ZXJzL3VzYi9kd2MyL2dhZGdldC5jCkBAIC0xODYsOSArMTg2LDEwIEBACiAgKi8KIHN0YXRpYyB2b2lkIGR3YzJfaHNvdGdfaW5pdF9maWZvKHN0cnVjdCBkd2MyX2hzb3RnICpoc290ZykKIHsKLQl1bnNpZ25lZCBpbnQgZXA7CisJdW5zaWduZWQgaW50IGZpZm87CiAJdW5zaWduZWQgaW50IGFkZHI7CiAJaW50IHRpbWVvdXQ7CisJdTMyIGRwdHhmc2l6bjsKIAl1MzIgdmFsOwogCiAJLyogUmVzZXQgZmlmbyBtYXAgaWYgbm90IGNvcnJlY3RseSBjbGVhcmVkIGR1cmluZyBwcmV2aW91cyBzZXNzaW9uICovCkBAIC0yMTYsMTYgKzIxNywxNiBAQAogCSAqIHRoZW0gdG8gZW5kcG9pbnRzIGR5bmFtaWNhbGx5IGFjY29yZGluZyB0byBtYXhwYWNrZXQgc2l6ZSB2YWx1ZSBvZgogCSAqIGdpdmVuIGVuZHBvaW50LgogCSAqLwotCWZvciAoZXAgPSAxOyBlcCA8IE1BWF9FUFNfQ0hBTk5FTFM7IGVwKyspIHsKLQkJaWYgKCFoc290Zy0+Z190eF9maWZvX3N6W2VwXSkKLQkJCWNvbnRpbnVlOwotCQl2YWwgPSBhZGRyOwotCQl2YWwgfD0gaHNvdGctPmdfdHhfZmlmb19zeltlcF0gPDwgRklGT1NJWkVfREVQVEhfU0hJRlQ7Ci0JCVdBUk5fT05DRShhZGRyICsgaHNvdGctPmdfdHhfZmlmb19zeltlcF0gPiBoc290Zy0+Zmlmb19tZW0sCi0JCQkgICJpbnN1ZmZpY2llbnQgZmlmbyBtZW1vcnkiKTsKLQkJYWRkciArPSBoc290Zy0+Z190eF9maWZvX3N6W2VwXTsKKwlmb3IgKGZpZm8gPSAxOyBmaWZvIDwgTUFYX0VQU19DSEFOTkVMUzsgZmlmbysrKSB7CisJCWRwdHhmc2l6biA9IGR3YzJfcmVhZGwoaHNvdGctPnJlZ3MgKyBEUFRYRlNJWk4oZmlmbykpOwogCi0JCWR3YzJfd3JpdGVsKHZhbCwgaHNvdGctPnJlZ3MgKyBEUFRYRlNJWk4oZXApKTsKKwkJdmFsID0gKGRwdHhmc2l6biAmIEZJRk9TSVpFX0RFUFRIX01BU0spIHwgYWRkcjsKKwkJYWRkciArPSBkcHR4ZnNpem4gPj4gRklGT1NJWkVfREVQVEhfU0hJRlQ7CisKKwkJaWYgKGFkZHIgPiBoc290Zy0+Zmlmb19tZW0pCisJCQlicmVhazsKKworCQlkd2MyX3dyaXRlbCh2YWwsIGhzb3RnLT5yZWdzICsgRFBUWEZTSVpOKGZpZm8pKTsKIAl9CiAKIAkvKgpAQCAtMzg4LDcgKzM4OSw4IEBACiAJCQlyZXR1cm4gLUVOT1NQQzsKIAkJfQogCX0gZWxzZSBpZiAoaHNvdGctPmRlZGljYXRlZF9maWZvcyAmJiBoc19lcC0+aW5kZXggIT0gMCkgewotCQljYW5fd3JpdGUgPSBkd2MyX3JlYWRsKGhzb3RnLT5yZWdzICsgRFRYRlNUUyhoc19lcC0+aW5kZXgpKTsKKwkJY2FuX3dyaXRlID0gZHdjMl9yZWFkbChoc290Zy0+cmVncyArCisJCQkJRFRYRlNUUyhoc19lcC0+Zmlmb19pbmRleCkpOwogCiAJCWNhbl93cml0ZSAmPSAweGZmZmY7CiAJCWNhbl93cml0ZSAqPSA0OwpAQCAtMjQzMiw3ICsyNDM0LDcgQEAKIAogCWlmICghaHNvdGctPmRlZGljYXRlZF9maWZvcykKIAkJcmV0dXJuOwotCXNpemUgPSAoZHdjMl9yZWFkbChoc290Zy0+cmVncyArIERUWEZTVFMoZXAtPmluZGV4KSkgJiAweGZmZmYpICogNDsKKwlzaXplID0gKGR3YzJfcmVhZGwoaHNvdGctPnJlZ3MgKyBEVFhGU1RTKGVwLT5maWZvX2luZGV4KSkgJiAweGZmZmYpICogNDsKIAlpZiAoc2l6ZSA8IGVwLT5maWZvX3NpemUpCiAJCWR3YzJfaHNvdGdfdHhmaWZvX2ZsdXNoKGhzb3RnLCBlcC0+Zmlmb19pbmRleCk7CiB9CkBAIC0zMDQxLDIyICszMDQzLDExIEBACiAJCWJyZWFrOwogCX0KIAotCS8qIElmIGZpZm8gaXMgYWxyZWFkeSBhbGxvY2F0ZWQgZm9yIHRoaXMgZXAgKi8KLQlpZiAoaHNfZXAtPmZpZm9faW5kZXgpIHsKLQkJc2l6ZSA9ICBoc19lcC0+ZXAubWF4cGFja2V0ICogaHNfZXAtPm1jOwotCQkvKiBJZiBiaWdnZXIgZmlmbyBpcyByZXF1aXJlZCBkZWFsbG9jYXRlIGN1cnJlbnQgb25lICovCi0JCWlmIChzaXplID4gaHNfZXAtPmZpZm9fc2l6ZSkgewotCQkJaHNvdGctPmZpZm9fbWFwICY9IH4oMSA8PCBoc19lcC0+Zmlmb19pbmRleCk7Ci0JCQloc19lcC0+Zmlmb19pbmRleCA9IDA7Ci0JCQloc19lcC0+Zmlmb19zaXplID0gMDsKLQkJfQotCX0KLQogCS8qCiAJICogaWYgdGhlIGhhcmR3YXJlIGhhcyBkZWRpY2F0ZWQgZmlmb3MsIHdlIG11c3QgZ2l2ZSBlYWNoIElOIEVQCiAJICogYSB1bmlxdWUgdHgtZmlmbyBldmVuIGlmIGl0IGlzIG5vbi1wZXJpb2RpYy4KIAkgKi8KLQlpZiAoZGlyX2luICYmIGhzb3RnLT5kZWRpY2F0ZWRfZmlmb3MgJiYgIWhzX2VwLT5maWZvX2luZGV4KSB7CisJaWYgKGRpcl9pbiAmJiBoc290Zy0+ZGVkaWNhdGVkX2ZpZm9zKSB7CiAJCXUzMiBmaWZvX2luZGV4ID0gMDsKIAkJdTMyIGZpZm9fc2l6ZSA9IFVJTlRfTUFYOwogCQlzaXplID0gaHNfZXAtPmVwLm1heHBhY2tldCpoc19lcC0+bWM7CkBAIC0zMTI5LDEwICszMTIwLDYgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZoc290Zy0+bG9jaywgZmxhZ3MpOwogCi0JaHNvdGctPmZpZm9fbWFwICY9IH4oMTw8aHNfZXAtPmZpZm9faW5kZXgpOwotCWhzX2VwLT5maWZvX2luZGV4ID0gMDsKLQloc19lcC0+Zmlmb19zaXplID0gMDsKLQogCWN0cmwgPSBkd2MyX3JlYWRsKGhzb3RnLT5yZWdzICsgZXBjdHJsX3JlZyk7CiAJY3RybCAmPSB+RFhFUENUTF9FUEVOQTsKIAljdHJsICY9IH5EWEVQQ1RMX1VTQkFDVEVQOwpAQCAtMzE0Nyw2ICszMTM0LDEwIEBACiAJLyogdGVybWluYXRlIGFsbCByZXF1ZXN0cyB3aXRoIHNodXRkb3duICovCiAJa2lsbF9hbGxfcmVxdWVzdHMoaHNvdGcsIGhzX2VwLCAtRVNIVVRET1dOKTsKIAorCWhzb3RnLT5maWZvX21hcCAmPSB+KDEgPDwgaHNfZXAtPmZpZm9faW5kZXgpOworCWhzX2VwLT5maWZvX2luZGV4ID0gMDsKKwloc19lcC0+Zmlmb19zaXplID0gMDsKKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhzb3RnLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIDA7CiB9CkBAIC0zNDc1LDggKzM0NjYsMTEgQEAKIAkJb3RnX3NldF9wZXJpcGhlcmFsKGhzb3RnLT51cGh5LT5vdGcsICZoc290Zy0+Z2FkZ2V0KTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZoc290Zy0+bG9jaywgZmxhZ3MpOwotCWR3YzJfaHNvdGdfaW5pdChoc290Zyk7Ci0JZHdjMl9oc290Z19jb3JlX2luaXRfZGlzY29ubmVjdGVkKGhzb3RnLCBmYWxzZSk7CisJaWYgKGR3YzJfaHdfaXNfZGV2aWNlKGhzb3RnKSkgeworCQlkd2MyX2hzb3RnX2luaXQoaHNvdGcpOworCQlkd2MyX2hzb3RnX2NvcmVfaW5pdF9kaXNjb25uZWN0ZWQoaHNvdGcsIGZhbHNlKTsKKwl9CisKIAloc290Zy0+ZW5hYmxlZCA9IDA7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHNvdGctPmxvY2ssIGZsYWdzKTsKIApAQCAtMzgxMywzNiArMzgwNywxMCBAQAogc3RhdGljIHZvaWQgZHdjMl9oc290Z19vZl9wcm9iZShzdHJ1Y3QgZHdjMl9oc290ZyAqaHNvdGcpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGhzb3RnLT5kZXYtPm9mX25vZGU7Ci0JdTMyIGxlbiA9IDA7Ci0JdTMyIGkgPSAwOwogCiAJLyogRW5hYmxlIGRtYSBpZiByZXF1ZXN0ZWQgaW4gZGV2aWNlIHRyZWUgKi8KIAloc290Zy0+Z191c2luZ19kbWEgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJnLXVzZS1kbWEiKTsKIAotCS8qCi0JKiBSZWdpc3RlciBUWCBwZXJpb2RpYyBmaWZvIHNpemUgcGVyIGVuZHBvaW50LgotCSogRVAwIGlzIGV4Y2x1ZGVkIHNpbmNlIGl0IGhhcyBubyBmaWZvIGNvbmZpZ3VyYXRpb24uCi0JKi8KLQlpZiAoIW9mX2ZpbmRfcHJvcGVydHkobnAsICJnLXR4LWZpZm8tc2l6ZSIsICZsZW4pKQotCQlnb3RvIHJ4X2ZpZm87Ci0KLQlsZW4gLz0gc2l6ZW9mKHUzMik7Ci0KLQkvKiBSZWFkIHR4IGZpZm8gc2l6ZXMgb3RoZXIgdGhhbiBlcDAgKi8KLQlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkobnAsICJnLXR4LWZpZm8tc2l6ZSIsCi0JCQkJCQkmaHNvdGctPmdfdHhfZmlmb19zelsxXSwgbGVuKSkKLQkJZ290byByeF9maWZvOwotCi0JLyogQWRkIGVwMCAqLwotCWxlbisrOwotCi0JLyogTWFrZSByZW1haW5pbmcgVFggZmlmb3MgdW5hdmFpbGFibGUgKi8KLQlpZiAobGVuIDwgTUFYX0VQU19DSEFOTkVMUykgewotCQlmb3IgKGkgPSBsZW47IGkgPCBNQVhfRVBTX0NIQU5ORUxTOyBpKyspCi0JCQloc290Zy0+Z190eF9maWZvX3N6W2ldID0gMDsKLQl9Ci0KLXJ4X2ZpZm86CiAJLyogUmVnaXN0ZXIgUlggZmlmbyBzaXplICovCiAJb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJnLXJ4LWZpZm8tc2l6ZSIsICZoc290Zy0+Z19yeF9maWZvX3N6KTsKIApAQCAtMzg2NCwxMyArMzgzMiwxMCBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9IGhzb3RnLT5kZXY7CiAJaW50IGVwbnVtOwogCWludCByZXQ7Ci0JaW50IGk7Ci0JdTMyIHBfdHhfZmlmb1tdID0gRFdDMl9HX1BfTEVHQUNZX1RYX0ZJRk9fU0laRTsKIAogCS8qIEluaXRpYWxpemUgdG8gbGVnYWN5IGZpZm8gY29uZmlndXJhdGlvbiB2YWx1ZXMgKi8KIAloc290Zy0+Z19yeF9maWZvX3N6ID0gMjA0ODsKIAloc290Zy0+Z19ucF9nX3R4X2ZpZm9fc3ogPSAxMDI0OwotCW1lbWNweSgmaHNvdGctPmdfdHhfZmlmb19zelsxXSwgcF90eF9maWZvLCBzaXplb2YocF90eF9maWZvKSk7CiAJLyogRGV2aWNlIHRyZWUgc3BlY2lmaWMgcHJvYmUgKi8KIAlkd2MyX2hzb3RnX29mX3Byb2JlKGhzb3RnKTsKIApAQCAtMzg4OCw5ICszODUzLDYgQEAKIAlkZXZfZGJnKGRldiwgIk5vblBlcmlvZGljIFRYRklGTyBzaXplOiAlZFxuIiwKIAkJCQkJCWhzb3RnLT5nX25wX2dfdHhfZmlmb19zeik7CiAJZGV2X2RiZyhkZXYsICJSWEZJRk8gc2l6ZTogJWRcbiIsIGhzb3RnLT5nX3J4X2ZpZm9fc3opOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfRVBTX0NIQU5ORUxTOyBpKyspCi0JCWRldl9kYmcoZGV2LCAiUGVyaW9kaWMgVFhGSUZPJTJkIHNpemU6ICVkXG4iLCBpLAotCQkJCQkJaHNvdGctPmdfdHhfZmlmb19zeltpXSk7CiAKIAloc290Zy0+Z2FkZ2V0Lm1heF9zcGVlZCA9IFVTQl9TUEVFRF9ISUdIOwogCWhzb3RnLT5nYWRnZXQub3BzID0gJmR3YzJfaHNvdGdfZ2FkZ2V0X29wczsKQEAgLTM5MDgsMTcgKzM4NzAsMTMgQEAKIAogCWhzb3RnLT5jdHJsX2J1ZmYgPSBkZXZtX2t6YWxsb2MoaHNvdGctPmRldiwKIAkJCURXQzJfQ1RSTF9CVUZGX1NJWkUsIEdGUF9LRVJORUwpOwotCWlmICghaHNvdGctPmN0cmxfYnVmZikgewotCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBjdHJsIHJlcXVlc3QgYnVmZlxuIik7CisJaWYgKCFoc290Zy0+Y3RybF9idWZmKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAloc290Zy0+ZXAwX2J1ZmYgPSBkZXZtX2t6YWxsb2MoaHNvdGctPmRldiwKIAkJCURXQzJfQ1RSTF9CVUZGX1NJWkUsIEdGUF9LRVJORUwpOwotCWlmICghaHNvdGctPmVwMF9idWZmKSB7Ci0JCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGN0cmwgcmVwbHkgYnVmZlxuIik7CisJaWYgKCFoc290Zy0+ZXAwX2J1ZmYpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoaHNvdGctPmRldiwgaXJxLCBkd2MyX2hzb3RnX2lycSwgSVJRRl9TSEFSRUQsCiAJCQkJZGV2X25hbWUoaHNvdGctPmRldiksIGhzb3RnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzIvaGNkLmMgYi9kcml2ZXJzL3VzYi9kd2MyL2hjZC5jCmluZGV4IDJkZjNkMDQuLmRmNWEwNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzIvaGNkLmMKKysrIGIvZHJpdmVycy91c2IvZHdjMi9oY2QuYwpAQCAtNTA0MCw3ICs1MDQwLDcgQEAKIAogCS8qIENyZWF0ZSBuZXcgd29ya3F1ZXVlIGFuZCBpbml0IHdvcmsgKi8KIAlyZXR2YWwgPSAtRU5PTUVNOwotCWhzb3RnLT53cV9vdGcgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiZHdjMiIpOworCWhzb3RnLT53cV9vdGcgPSBhbGxvY19vcmRlcmVkX3dvcmtxdWV1ZSgiZHdjMiIsIDApOwogCWlmICghaHNvdGctPndxX290ZykgewogCQlkZXZfZXJyKGhzb3RnLT5kZXYsICJGYWlsZWQgdG8gY3JlYXRlIHdvcmtxdWV1ZVxuIik7CiAJCWdvdG8gZXJyb3IyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMi9ody5oIGIvZHJpdmVycy91c2IvZHdjMi9ody5oCmluZGV4IGVmYzNiY2QuLjkxMDU4NDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzIvaHcuaAorKysgYi9kcml2ZXJzL3VzYi9kd2MyL2h3LmgKQEAgLTQ4LDYgKzQ4LDcgQEAKICNkZWZpbmUgR09UR0NUTF9BU0VTVkxECQkJKDEgPDwgMTgpCiAjZGVmaW5lIEdPVEdDVExfREJOQ19TSE9SVAkJKDEgPDwgMTcpCiAjZGVmaW5lIEdPVEdDVExfQ09OSURfQgkJCSgxIDw8IDE2KQorI2RlZmluZSBHT1RHQ1RMX0RCTkNFX0ZMVFJfQllQQVNTCSgxIDw8IDE1KQogI2RlZmluZSBHT1RHQ1RMX0RFVkhOUEVOCQkoMSA8PCAxMSkKICNkZWZpbmUgR09UR0NUTF9IU1RTRVRITlBFTgkJKDEgPDwgMTApCiAjZGVmaW5lIEdPVEdDVExfSE5QUkVRCQkJKDEgPDwgOSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzIvcGxhdGZvcm0uYyBiL2RyaXZlcnMvdXNiL2R3YzIvcGxhdGZvcm0uYwppbmRleCBmYzZmNTI1Li41MzA5NTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9kd2MyL3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy91c2IvZHdjMi9wbGF0Zm9ybS5jCkBAIC00NSw2ICs0NSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvczNjLWhzb3RnLmg+CisjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3VzYi9vZi5oPgogCkBAIC0zMzcsNiArMzM4LDI0IEBACiB7CiAJaW50IGksIHJldDsKIAorCWhzb3RnLT5yZXNldCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXRfb3B0aW9uYWwoaHNvdGctPmRldiwgImR3YzIiKTsKKwlpZiAoSVNfRVJSKGhzb3RnLT5yZXNldCkpIHsKKwkJcmV0ID0gUFRSX0VSUihoc290Zy0+cmVzZXQpOworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIC1FTk9FTlQ6CisJCWNhc2UgLUVOT1RTVVBQOgorCQkJaHNvdGctPnJlc2V0ID0gTlVMTDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X2Vycihoc290Zy0+ZGV2LCAiZXJyb3IgZ2V0dGluZyByZXNldCBjb250cm9sICVkXG4iLAorCQkJCXJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJaWYgKGhzb3RnLT5yZXNldCkKKwkJcmVzZXRfY29udHJvbF9kZWFzc2VydChoc290Zy0+cmVzZXQpOworCiAJLyogU2V0IGRlZmF1bHQgVVRNSSB3aWR0aCAqLwogCWhzb3RnLT5waHlpZiA9IEdVU0JDRkdfUEhZSUYxNjsKIApAQCAtNDM0LDYgKzQ1Myw5IEBACiAJaWYgKGhzb3RnLT5sbF9od19lbmFibGVkKQogCQlkd2MyX2xvd2xldmVsX2h3X2Rpc2FibGUoaHNvdGcpOwogCisJaWYgKGhzb3RnLT5yZXNldCkKKwkJcmVzZXRfY29udHJvbF9hc3NlcnQoaHNvdGctPnJlc2V0KTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MzL0tjb25maWcgYi9kcml2ZXJzL3VzYi9kd2MzL0tjb25maWcKaW5kZXggYTY0Y2UxYy4uYjk3Y2RlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZHdjMy9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2R3YzMvS2NvbmZpZwpAQCAtMSw3ICsxLDcgQEAKIGNvbmZpZyBVU0JfRFdDMwogCXRyaXN0YXRlICJEZXNpZ25XYXJlIFVTQjMgRFJEIENvcmUgU3VwcG9ydCIKIAlkZXBlbmRzIG9uIChVU0IgfHwgVVNCX0dBREdFVCkgJiYgSEFTX0RNQQotCXNlbGVjdCBVU0JfWEhDSV9QTEFURk9STSBpZiBVU0JfU1VQUE9SVCAmJiBVU0JfWEhDSV9IQ0QKKwlzZWxlY3QgVVNCX1hIQ0lfUExBVEZPUk0gaWYgVVNCX1hIQ0lfSENECiAJaGVscAogCSAgU2F5IFkgb3IgTSBoZXJlIGlmIHlvdXIgc3lzdGVtIGhhcyBhIER1YWwgUm9sZSBTdXBlclNwZWVkCiAJICBVU0IgY29udHJvbGxlciBiYXNlZCBvbiB0aGUgRGVzaWduV2FyZSBVU0IzIElQIENvcmUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MzL2NvcmUuYyBiL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5jCmluZGV4IDk0NjY0MzEuLjcyODdhNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5jCisrKyBiL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5jCkBAIC00OSw2ICs0OSw1NyBAQAogCiAjZGVmaW5lIERXQzNfREVGQVVMVF9BVVRPU1VTUEVORF9ERUxBWQk1MDAwIC8qIG1zICovCiAKKy8qKgorICogZHdjM19nZXRfZHJfbW9kZSAtIFZhbGlkYXRlcyBhbmQgc2V0cyBkcl9tb2RlCisgKiBAZHdjOiBwb2ludGVyIHRvIG91ciBjb250ZXh0IHN0cnVjdHVyZQorICovCitzdGF0aWMgaW50IGR3YzNfZ2V0X2RyX21vZGUoc3RydWN0IGR3YzMgKmR3YykKK3sKKwllbnVtIHVzYl9kcl9tb2RlIG1vZGU7CisJc3RydWN0IGRldmljZSAqZGV2ID0gZHdjLT5kZXY7CisJdW5zaWduZWQgaW50IGh3X21vZGU7CisKKwlpZiAoZHdjLT5kcl9tb2RlID09IFVTQl9EUl9NT0RFX1VOS05PV04pCisJCWR3Yy0+ZHJfbW9kZSA9IFVTQl9EUl9NT0RFX09URzsKKworCW1vZGUgPSBkd2MtPmRyX21vZGU7CisJaHdfbW9kZSA9IERXQzNfR0hXUEFSQU1TMF9NT0RFKGR3Yy0+aHdwYXJhbXMuaHdwYXJhbXMwKTsKKworCXN3aXRjaCAoaHdfbW9kZSkgeworCWNhc2UgRFdDM19HSFdQQVJBTVMwX01PREVfR0FER0VUOgorCQlpZiAoSVNfRU5BQkxFRChDT05GSUdfVVNCX0RXQzNfSE9TVCkpIHsKKwkJCWRldl9lcnIoZGV2LAorCQkJCSJDb250cm9sbGVyIGRvZXMgbm90IHN1cHBvcnQgaG9zdCBtb2RlLlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQltb2RlID0gVVNCX0RSX01PREVfUEVSSVBIRVJBTDsKKwkJYnJlYWs7CisJY2FzZSBEV0MzX0dIV1BBUkFNUzBfTU9ERV9IT1NUOgorCQlpZiAoSVNfRU5BQkxFRChDT05GSUdfVVNCX0RXQzNfR0FER0VUKSkgeworCQkJZGV2X2VycihkZXYsCisJCQkJIkNvbnRyb2xsZXIgZG9lcyBub3Qgc3VwcG9ydCBkZXZpY2UgbW9kZS5cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJbW9kZSA9IFVTQl9EUl9NT0RFX0hPU1Q7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmIChJU19FTkFCTEVEKENPTkZJR19VU0JfRFdDM19IT1NUKSkKKwkJCW1vZGUgPSBVU0JfRFJfTU9ERV9IT1NUOworCQllbHNlIGlmIChJU19FTkFCTEVEKENPTkZJR19VU0JfRFdDM19HQURHRVQpKQorCQkJbW9kZSA9IFVTQl9EUl9NT0RFX1BFUklQSEVSQUw7CisJfQorCisJaWYgKG1vZGUgIT0gZHdjLT5kcl9tb2RlKSB7CisJCWRldl93YXJuKGRldiwKKwkJCSAiQ29uZmlndXJhdGlvbiBtaXNtYXRjaC4gZHJfbW9kZSBmb3JjZWQgdG8gJXNcbiIsCisJCQkgbW9kZSA9PSBVU0JfRFJfTU9ERV9IT1NUID8gImhvc3QiIDogImdhZGdldCIpOworCisJCWR3Yy0+ZHJfbW9kZSA9IG1vZGU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHZvaWQgZHdjM19zZXRfbW9kZShzdHJ1Y3QgZHdjMyAqZHdjLCB1MzIgbW9kZSkKIHsKIAl1MzIgcmVnOwpAQCAtNDQ4LDYgKzQ5OSw5IEBACiAJaWYgKGR3Yy0+ZGlzX3UzX3N1c3BoeV9xdWlyaykKIAkJcmVnICY9IH5EV0MzX0dVU0IzUElQRUNUTF9TVVNQSFk7CiAKKwlpZiAoZHdjLT5kaXNfZGVsX3BoeV9wb3dlcl9jaGdfcXVpcmspCisJCXJlZyAmPSB+RFdDM19HVVNCM1BJUEVDVExfREVQT0NIQU5HRTsKKwogCWR3YzNfd3JpdGVsKGR3Yy0+cmVncywgRFdDM19HVVNCM1BJUEVDVEwoMCksIHJlZyk7CiAKIAlyZWcgPSBkd2MzX3JlYWRsKGR3Yy0+cmVncywgRFdDM19HVVNCMlBIWUNGRygwKSk7CkBAIC00ODUsNiArNTM5LDIzIEBACiAJCWJyZWFrOwogCX0KIAorCXN3aXRjaCAoZHdjLT5oc3BoeV9tb2RlKSB7CisJY2FzZSBVU0JQSFlfSU5URVJGQUNFX01PREVfVVRNSToKKwkJcmVnICY9IH4oRFdDM19HVVNCMlBIWUNGR19QSFlJRl9NQVNLIHwKKwkJICAgICAgIERXQzNfR1VTQjJQSFlDRkdfVVNCVFJEVElNX01BU0spOworCQlyZWcgfD0gRFdDM19HVVNCMlBIWUNGR19QSFlJRihVVE1JX1BIWUlGXzhfQklUKSB8CisJCSAgICAgICBEV0MzX0dVU0IyUEhZQ0ZHX1VTQlRSRFRJTShVU0JUUkRUSU1fVVRNSV84X0JJVCk7CisJCWJyZWFrOworCWNhc2UgVVNCUEhZX0lOVEVSRkFDRV9NT0RFX1VUTUlXOgorCQlyZWcgJj0gfihEV0MzX0dVU0IyUEhZQ0ZHX1BIWUlGX01BU0sgfAorCQkgICAgICAgRFdDM19HVVNCMlBIWUNGR19VU0JUUkRUSU1fTUFTSyk7CisJCXJlZyB8PSBEV0MzX0dVU0IyUEhZQ0ZHX1BIWUlGKFVUTUlfUEhZSUZfMTZfQklUKSB8CisJCSAgICAgICBEV0MzX0dVU0IyUEhZQ0ZHX1VTQlRSRFRJTShVU0JUUkRUSU1fVVRNSV8xNl9CSVQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKIAkvKgogCSAqIEFib3ZlIDEuOTRhLCBpdCBpcyByZWNvbW1lbmRlZCB0byBzZXQgRFdDM19HVVNCMlBIWUNGR19TVVNQSFkgdG8KIAkgKiAnMCcgZHVyaW5nIGNvcmVDb25zdWx0YW50IGNvbmZpZ3VyYXRpb24uIFNvIGRlZmF1bHQgdmFsdWUgd2lsbApAQCAtNTAwLDYgKzU3MSw5IEBACiAJaWYgKGR3Yy0+ZGlzX2VuYmxzbHBtX3F1aXJrKQogCQlyZWcgJj0gfkRXQzNfR1VTQjJQSFlDRkdfRU5CTFNMUE07CiAKKwlpZiAoZHdjLT5kaXNfdTJfZnJlZWNsa19leGlzdHNfcXVpcmspCisJCXJlZyAmPSB+RFdDM19HVVNCMlBIWUNGR19VMl9GUkVFQ0xLX0VYSVNUUzsKKwogCWR3YzNfd3JpdGVsKGR3Yy0+cmVncywgRFdDM19HVVNCMlBIWUNGRygwKSwgcmVnKTsKIAogCXJldHVybiAwOwpAQCAtNjY2LDYgKzc0MCwzMiBAQAogCQlnb3RvIGVycjQ7CiAJfQogCisJc3dpdGNoIChkd2MtPmRyX21vZGUpIHsKKwljYXNlIFVTQl9EUl9NT0RFX1BFUklQSEVSQUw6CisJCWR3YzNfc2V0X21vZGUoZHdjLCBEV0MzX0dDVExfUFJUQ0FQX0RFVklDRSk7CisJCWJyZWFrOworCWNhc2UgVVNCX0RSX01PREVfSE9TVDoKKwkJZHdjM19zZXRfbW9kZShkd2MsIERXQzNfR0NUTF9QUlRDQVBfSE9TVCk7CisJCWJyZWFrOworCWNhc2UgVVNCX0RSX01PREVfT1RHOgorCQlkd2MzX3NldF9tb2RlKGR3YywgRFdDM19HQ1RMX1BSVENBUF9PVEcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfd2Fybihkd2MtPmRldiwgIlVuc3VwcG9ydGVkIG1vZGUgJWRcbiIsIGR3Yy0+ZHJfbW9kZSk7CisJCWJyZWFrOworCX0KKworCS8qCisJICogRU5EWEZFUiBwb2xsaW5nIGlzIGF2YWlsYWJsZSBvbiB2ZXJzaW9uIDMuMTBhIGFuZCBsYXRlciBvZgorCSAqIHRoZSBEV0NfdXNiMyBjb250cm9sbGVyLiBJdCBpcyBOT1QgYXZhaWxhYmxlIGluIHRoZQorCSAqIERXQ191c2IzMSBjb250cm9sbGVyLgorCSAqLworCWlmICghZHdjM19pc191c2IzMShkd2MpICYmIGR3Yy0+cmV2aXNpb24gPj0gRFdDM19SRVZJU0lPTl8zMTBBKSB7CisJCXJlZyA9IGR3YzNfcmVhZGwoZHdjLT5yZWdzLCBEV0MzX0dVQ1RMMik7CisJCXJlZyB8PSBEV0MzX0dVQ1RMMl9SU1RfQUNUQklUTEFURVI7CisJCWR3YzNfd3JpdGVsKGR3Yy0+cmVncywgRFdDM19HVUNUTDIsIHJlZyk7CisJfQorCiAJcmV0dXJuIDA7CiAKIGVycjQ6CkBAIC03NjMsNyArODYzLDYgQEAKIAogCXN3aXRjaCAoZHdjLT5kcl9tb2RlKSB7CiAJY2FzZSBVU0JfRFJfTU9ERV9QRVJJUEhFUkFMOgotCQlkd2MzX3NldF9tb2RlKGR3YywgRFdDM19HQ1RMX1BSVENBUF9ERVZJQ0UpOwogCQlyZXQgPSBkd2MzX2dhZGdldF9pbml0KGR3Yyk7CiAJCWlmIChyZXQpIHsKIAkJCWlmIChyZXQgIT0gLUVQUk9CRV9ERUZFUikKQEAgLTc3Miw3ICs4NzEsNiBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgVVNCX0RSX01PREVfSE9TVDoKLQkJZHdjM19zZXRfbW9kZShkd2MsIERXQzNfR0NUTF9QUlRDQVBfSE9TVCk7CiAJCXJldCA9IGR3YzNfaG9zdF9pbml0KGR3Yyk7CiAJCWlmIChyZXQpIHsKIAkJCWlmIChyZXQgIT0gLUVQUk9CRV9ERUZFUikKQEAgLTc4MSw3ICs4NzksNiBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgVVNCX0RSX01PREVfT1RHOgotCQlkd2MzX3NldF9tb2RlKGR3YywgRFdDM19HQ1RMX1BSVENBUF9PVEcpOwogCQlyZXQgPSBkd2MzX2hvc3RfaW5pdChkd2MpOwogCQlpZiAocmV0KSB7CiAJCQlpZiAocmV0ICE9IC1FUFJPQkVfREVGRVIpCkBAIC04ODgsNiArOTg1LDcgQEAKIAogCWR3Yy0+bWF4aW11bV9zcGVlZCA9IHVzYl9nZXRfbWF4aW11bV9zcGVlZChkZXYpOwogCWR3Yy0+ZHJfbW9kZSA9IHVzYl9nZXRfZHJfbW9kZShkZXYpOworCWR3Yy0+aHNwaHlfbW9kZSA9IG9mX3VzYl9nZXRfcGh5X21vZGUoZGV2LT5vZl9ub2RlKTsKIAogCWR3Yy0+aGFzX2xwbV9lcnJhdHVtID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsCiAJCQkJInNucHMsaGFzLWxwbS1lcnJhdHVtIik7CkBAIC05MjQsNiArMTAyMiwxMCBAQAogCQkJCSJzbnBzLGRpc19lbmJsc2xwbV9xdWlyayIpOwogCWR3Yy0+ZGlzX3J4ZGV0X2lucDNfcXVpcmsgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwKIAkJCQkic25wcyxkaXNfcnhkZXRfaW5wM19xdWlyayIpOworCWR3Yy0+ZGlzX3UyX2ZyZWVjbGtfZXhpc3RzX3F1aXJrID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsCisJCQkJInNucHMsZGlzLXUyLWZyZWVjbGstZXhpc3RzLXF1aXJrIik7CisJZHdjLT5kaXNfZGVsX3BoeV9wb3dlcl9jaGdfcXVpcmsgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwKKwkJCQkic25wcyxkaXMtZGVsLXBoeS1wb3dlci1jaGctcXVpcmsiKTsKIAogCWR3Yy0+dHhfZGVfZW1waGFzaXNfcXVpcmsgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwKIAkJCQkic25wcyx0eF9kZV9lbXBoYXNpc19xdWlyayIpOwpAQCAtOTcyLDE3ICsxMDc0LDkgQEAKIAkJZ290byBlcnIyOwogCX0KIAotCWlmIChJU19FTkFCTEVEKENPTkZJR19VU0JfRFdDM19IT1NUKSAmJgotCQkJKGR3Yy0+ZHJfbW9kZSA9PSBVU0JfRFJfTU9ERV9PVEcgfHwKLQkJCQkJZHdjLT5kcl9tb2RlID09IFVTQl9EUl9NT0RFX1VOS05PV04pKQotCQlkd2MtPmRyX21vZGUgPSBVU0JfRFJfTU9ERV9IT1NUOwotCWVsc2UgaWYgKElTX0VOQUJMRUQoQ09ORklHX1VTQl9EV0MzX0dBREdFVCkgJiYKLQkJCShkd2MtPmRyX21vZGUgPT0gVVNCX0RSX01PREVfT1RHIHx8Ci0JCQkJCWR3Yy0+ZHJfbW9kZSA9PSBVU0JfRFJfTU9ERV9VTktOT1dOKSkKLQkJZHdjLT5kcl9tb2RlID0gVVNCX0RSX01PREVfUEVSSVBIRVJBTDsKLQotCWlmIChkd2MtPmRyX21vZGUgPT0gVVNCX0RSX01PREVfVU5LTk9XTikKLQkJZHdjLT5kcl9tb2RlID0gVVNCX0RSX01PREVfT1RHOworCXJldCA9IGR3YzNfZ2V0X2RyX21vZGUoZHdjKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjM7CiAKIAlyZXQgPSBkd2MzX2FsbG9jX3NjcmF0Y2hfYnVmZmVycyhkd2MpOwogCWlmIChyZXQpCkBAIC0xMTkyLDYgKzEyODYsNyBAQAogCX0KIAogCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koZGV2KTsKKwlwbV9ydW50aW1lX3B1dChkZXYpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MzL2NvcmUuaCBiL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5oCmluZGV4IDQ1ZDZkZTUuLjZiNjBlNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5oCisrKyBiL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5oCkBAIC0xMDksNiArMTA5LDcgQEAKICNkZWZpbmUgRFdDM19HUFJUQklNQVBfSFMxCTB4YzE4NAogI2RlZmluZSBEV0MzX0dQUlRCSU1BUF9GUzAJMHhjMTg4CiAjZGVmaW5lIERXQzNfR1BSVEJJTUFQX0ZTMQkweGMxOGMKKyNkZWZpbmUgRFdDM19HVUNUTDIJCTB4YzE5YwogCiAjZGVmaW5lIERXQzNfVkVSX05VTUJFUgkJMHhjMWEwCiAjZGVmaW5lIERXQzNfVkVSX1RZUEUJCTB4YzFhNApAQCAtMTk5LDkgKzIwMCwxOCBAQAogCiAvKiBHbG9iYWwgVVNCMiBQSFkgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwogI2RlZmluZSBEV0MzX0dVU0IyUEhZQ0ZHX1BIWVNPRlRSU1QJKDEgPDwgMzEpCisjZGVmaW5lIERXQzNfR1VTQjJQSFlDRkdfVTJfRlJFRUNMS19FWElTVFMJKDEgPDwgMzApCiAjZGVmaW5lIERXQzNfR1VTQjJQSFlDRkdfU1VTUEhZCQkoMSA8PCA2KQogI2RlZmluZSBEV0MzX0dVU0IyUEhZQ0ZHX1VMUElfVVRNSQkoMSA8PCA0KQogI2RlZmluZSBEV0MzX0dVU0IyUEhZQ0ZHX0VOQkxTTFBNCSgxIDw8IDgpCisjZGVmaW5lIERXQzNfR1VTQjJQSFlDRkdfUEhZSUYobikJKG4gPDwgMykKKyNkZWZpbmUgRFdDM19HVVNCMlBIWUNGR19QSFlJRl9NQVNLCURXQzNfR1VTQjJQSFlDRkdfUEhZSUYoMSkKKyNkZWZpbmUgRFdDM19HVVNCMlBIWUNGR19VU0JUUkRUSU0obikJKG4gPDwgMTApCisjZGVmaW5lIERXQzNfR1VTQjJQSFlDRkdfVVNCVFJEVElNX01BU0sJRFdDM19HVVNCMlBIWUNGR19VU0JUUkRUSU0oMHhmKQorI2RlZmluZSBVU0JUUkRUSU1fVVRNSV84X0JJVAkJOQorI2RlZmluZSBVU0JUUkRUSU1fVVRNSV8xNl9CSVQJCTUKKyNkZWZpbmUgVVRNSV9QSFlJRl8xNl9CSVQJCTEKKyNkZWZpbmUgVVRNSV9QSFlJRl84X0JJVAkJMAogCiAvKiBHbG9iYWwgVVNCMiBQSFkgVmVuZG9yIENvbnRyb2wgUmVnaXN0ZXIgKi8KICNkZWZpbmUgRFdDM19HVVNCMlBIWUFDQ19ORVdSRUdSRVEJKDEgPDwgMjUpCkBAIC0yMzUsNyArMjQ1LDEwIEBACiAjZGVmaW5lIERXQzNfR0VWTlRTSVpfU0laRShuKQkJKChuKSAmIDB4ZmZmZikKIAogLyogR2xvYmFsIEhXUEFSQU1TMCBSZWdpc3RlciAqLwotI2RlZmluZSBEV0MzX0dIV1BBUkFNUzBfVVNCM19NT0RFKG4pCSgobikgJiAweDMpCisjZGVmaW5lIERXQzNfR0hXUEFSQU1TMF9NT0RFKG4pCQkoKG4pICYgMHgzKQorI2RlZmluZSBEV0MzX0dIV1BBUkFNUzBfTU9ERV9HQURHRVQJMAorI2RlZmluZSBEV0MzX0dIV1BBUkFNUzBfTU9ERV9IT1NUCTEKKyNkZWZpbmUgRFdDM19HSFdQQVJBTVMwX01PREVfRFJECTIKICNkZWZpbmUgRFdDM19HSFdQQVJBTVMwX01CVVNfVFlQRShuKQkoKChuKSA+PiAzKSAmIDB4NykKICNkZWZpbmUgRFdDM19HSFdQQVJBTVMwX1NCVVNfVFlQRShuKQkoKChuKSA+PiA2KSAmIDB4MykKICNkZWZpbmUgRFdDM19HSFdQQVJBTVMwX01EV0lEVEgobikJKCgobikgPj4gOCkgJiAweGZmKQpAQCAtMjc5LDYgKzI5Miw5IEBACiAjZGVmaW5lIERXQzNfR0ZMQURKXzMwTUhaX1NEQk5EX1NFTAkJKDEgPDwgNykKICNkZWZpbmUgRFdDM19HRkxBREpfMzBNSFpfTUFTSwkJCTB4M2YKIAorLyogR2xvYmFsIFVzZXIgQ29udHJvbCBSZWdpc3RlciAyICovCisjZGVmaW5lIERXQzNfR1VDVEwyX1JTVF9BQ1RCSVRMQVRFUgkJKDEgPDwgMTQpCisKIC8qIERldmljZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCiAjZGVmaW5lIERXQzNfRENGR19ERVZBRERSKGFkZHIpCSgoYWRkcikgPDwgMykKICNkZWZpbmUgRFdDM19EQ0ZHX0RFVkFERFJfTUFTSwlEV0MzX0RDRkdfREVWQUREUigweDdmKQpAQCAtNjg1LDYgKzcwMSw4IEBACiAgKiBAcmVxdWVzdDogc3RydWN0IHVzYl9yZXF1ZXN0IHRvIGJlIHRyYW5zZmVycmVkCiAgKiBAbGlzdDogYSBsaXN0X2hlYWQgdXNlZCBmb3IgcmVxdWVzdCBxdWV1ZWluZwogICogQGRlcDogc3RydWN0IGR3YzNfZXAgb3duaW5nIHRoaXMgcmVxdWVzdAorICogQHNnOiBwb2ludGVyIHRvIGZpcnN0IGluY29tcGxldGUgc2cKKyAqIEBudW1fcGVuZGluZ19zZ3M6IGNvdW50ZXIgdG8gcGVuZGluZyBzZ3MKICAqIEBmaXJzdF90cmJfaW5kZXg6IGluZGV4IHRvIGZpcnN0IHRyYiB1c2VkIGJ5IHRoaXMgcmVxdWVzdAogICogQGVwbnVtOiBlbmRwb2ludCBudW1iZXIgdG8gd2hpY2ggdGhpcyByZXF1ZXN0IHJlZmVycwogICogQHRyYjogcG9pbnRlciB0byBzdHJ1Y3QgZHdjM190cmIKQEAgLTY5Nyw3ICs3MTUsOSBAQAogCXN0cnVjdCB1c2JfcmVxdWVzdAlyZXF1ZXN0OwogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKIAlzdHJ1Y3QgZHdjM19lcAkJKmRlcDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKnNnOwogCisJdW5zaWduZWQJCW51bV9wZW5kaW5nX3NnczsKIAl1OAkJCWZpcnN0X3RyYl9pbmRleDsKIAl1OAkJCWVwbnVtOwogCXN0cnVjdCBkd2MzX3RyYgkJKnRyYjsKQEAgLTc0Myw2ICs3NjMsOSBAQAogICogQG1heGltdW1fc3BlZWQ6IG1heGltdW0gc3BlZWQgcmVxdWVzdGVkIChtYWlubHkgZm9yIHRlc3RpbmcgcHVycG9zZXMpCiAgKiBAcmV2aXNpb246IHJldmlzaW9uIHJlZ2lzdGVyIGNvbnRlbnRzCiAgKiBAZHJfbW9kZTogcmVxdWVzdGVkIG1vZGUgb2Ygb3BlcmF0aW9uCisgKiBAaHNwaHlfbW9kZTogVVRNSSBwaHkgbW9kZSwgb25lIG9mIGZvbGxvd2luZzoKKyAqCQktIFVTQlBIWV9JTlRFUkZBQ0VfTU9ERV9VVE1JCisgKgkJLSBVU0JQSFlfSU5URVJGQUNFX01PREVfVVRNSVcKICAqIEB1c2IyX3BoeTogcG9pbnRlciB0byBVU0IyIFBIWQogICogQHVzYjNfcGh5OiBwb2ludGVyIHRvIFVTQjMgUEhZCiAgKiBAdXNiMl9nZW5lcmljX3BoeTogcG9pbnRlciB0byBVU0IyIFBIWQpAQCAtNzk5LDYgKzgyMiwxMSBAQAogICogQGRpc191Ml9zdXNwaHlfcXVpcms6IHNldCBpZiB3ZSBkaXNhYmxlIHVzYjIgc3VzcGVuZCBwaHkKICAqIEBkaXNfZW5ibHNscG1fcXVpcms6IHNldCBpZiB3ZSBjbGVhciBlbmJsc2xwbSBpbiBHVVNCMlBIWUNGRywKICAqICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGluZyB0aGUgc3VzcGVuZCBzaWduYWwgdG8gdGhlIFBIWS4KKyAqIEBkaXNfdTJfZnJlZWNsa19leGlzdHNfcXVpcmsgOiBzZXQgaWYgd2UgY2xlYXIgdTJfZnJlZWNsa19leGlzdHMKKyAqCQkJaW4gR1VTQjJQSFlDRkcsIHNwZWNpZnkgdGhhdCBVU0IyIFBIWSBkb2Vzbid0CisgKgkJCXByb3ZpZGUgYSBmcmVlLXJ1bm5pbmcgUEhZIGNsb2NrLgorICogQGRpc19kZWxfcGh5X3Bvd2VyX2NoZ19xdWlyazogc2V0IGlmIHdlIGRpc2FibGUgZGVsYXkgcGh5IHBvd2VyCisgKgkJCWNoYW5nZSBxdWlyay4KICAqIEB0eF9kZV9lbXBoYXNpc19xdWlyazogc2V0IGlmIHdlIGVuYWJsZSBUeCBkZS1lbXBoYXNpcyBxdWlyawogICogQHR4X2RlX2VtcGhhc2lzOiBUeCBkZS1lbXBoYXNpcyB2YWx1ZQogICogCTAJLSAtNmRCIGRlLWVtcGhhc2lzCkBAIC04NDUsNiArODczLDcgQEAKIAlzaXplX3QJCQlyZWdzX3NpemU7CiAKIAllbnVtIHVzYl9kcl9tb2RlCWRyX21vZGU7CisJZW51bSB1c2JfcGh5X2ludGVyZmFjZQloc3BoeV9tb2RlOwogCiAJdTMyCQkJZmxhZGo7CiAJdTMyCQkJaXJxX2dhZGdldDsKQEAgLTg4MCw2ICs5MDksOCBAQAogI2RlZmluZSBEV0MzX1JFVklTSU9OXzI2MEEJMHg1NTMzMjYwYQogI2RlZmluZSBEV0MzX1JFVklTSU9OXzI3MEEJMHg1NTMzMjcwYQogI2RlZmluZSBEV0MzX1JFVklTSU9OXzI4MEEJMHg1NTMzMjgwYQorI2RlZmluZSBEV0MzX1JFVklTSU9OXzMwMEEJMHg1NTMzMzAwYQorI2RlZmluZSBEV0MzX1JFVklTSU9OXzMxMEEJMHg1NTMzMzEwYQogCiAvKgogICogTk9USUNFOiB3ZSdyZSB1c2luZyBiaXQgMzEgYXMgYSAiaXMgdXNiIDMuMSIgZmxhZy4gVGhpcyBpcyByZWFsbHkKQEAgLTk0Miw2ICs5NzMsOCBAQAogCXVuc2lnbmVkCQlkaXNfdTJfc3VzcGh5X3F1aXJrOjE7CiAJdW5zaWduZWQJCWRpc19lbmJsc2xwbV9xdWlyazoxOwogCXVuc2lnbmVkCQlkaXNfcnhkZXRfaW5wM19xdWlyazoxOworCXVuc2lnbmVkCQlkaXNfdTJfZnJlZWNsa19leGlzdHNfcXVpcms6MTsKKwl1bnNpZ25lZAkJZGlzX2RlbF9waHlfcG93ZXJfY2hnX3F1aXJrOjE7CiAKIAl1bnNpZ25lZAkJdHhfZGVfZW1waGFzaXNfcXVpcms6MTsKIAl1bnNpZ25lZAkJdHhfZGVfZW1waGFzaXM6MjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzMvZGVidWcuaCBiL2RyaXZlcnMvdXNiL2R3YzMvZGVidWcuaAppbmRleCAyMmRmYzNkLi4zM2FiMmEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9kd2MzL2RlYnVnLmgKKysrIGIvZHJpdmVycy91c2IvZHdjMy9kZWJ1Zy5oCkBAIC0xOTIsNyArMTkyLDcgQEAKIAlpbnQgcmV0OwogCiAJcmV0ID0gc3ByaW50ZihzdHIsICJlcCVkJXM6ICIsIGVwbnVtID4+IDEsCi0JCQkoZXBudW0gJiAxKSA/ICJpbiIgOiAiaW4iKTsKKwkJCShlcG51bSAmIDEpID8gImluIiA6ICJvdXQiKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuICJVTktOT1dOIjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMy9kd2MzLW9mLXNpbXBsZS5jIGIvZHJpdmVycy91c2IvZHdjMy9kd2MzLW9mLXNpbXBsZS5jCmluZGV4IDk3NDMzNTMuLmZlNDE0ZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzMvZHdjMy1vZi1zaW1wbGUuYworKysgYi9kcml2ZXJzL3VzYi9kd2MzL2R3YzMtb2Ytc2ltcGxlLmMKQEAgLTM2LDM1ICszNiwyNSBAQAogCWludAkJCW51bV9jbG9ja3M7CiB9OwogCi1zdGF0aWMgaW50IGR3YzNfb2Zfc2ltcGxlX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IGR3YzNfb2Zfc2ltcGxlX2Nsa19pbml0KHN0cnVjdCBkd2MzX29mX3NpbXBsZSAqc2ltcGxlLCBpbnQgY291bnQpCiB7Ci0Jc3RydWN0IGR3YzNfb2Zfc2ltcGxlCSpzaW1wbGU7Ci0Jc3RydWN0IGRldmljZQkJKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGRldmljZQkJKmRldiA9IHNpbXBsZS0+ZGV2OwogCXN0cnVjdCBkZXZpY2Vfbm9kZQkqbnAgPSBkZXYtPm9mX25vZGU7Ci0KLQl1bnNpZ25lZCBpbnQJCWNvdW50OwotCWludAkJCXJldDsKIAlpbnQJCQlpOwogCi0Jc2ltcGxlID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpzaW1wbGUpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNpbXBsZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQljb3VudCA9IG9mX2Nsa19nZXRfcGFyZW50X2NvdW50KG5wKTsKLQlpZiAoIWNvdW50KQotCQlyZXR1cm4gLUVOT0VOVDsKLQogCXNpbXBsZS0+bnVtX2Nsb2NrcyA9IGNvdW50OwogCisJaWYgKCFjb3VudCkKKwkJcmV0dXJuIDA7CisKIAlzaW1wbGUtPmNsa3MgPSBkZXZtX2tjYWxsb2MoZGV2LCBzaW1wbGUtPm51bV9jbG9ja3MsCiAJCQlzaXplb2Yoc3RydWN0IGNsayAqKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzaW1wbGUtPmNsa3MpCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jc2ltcGxlLT5kZXYgPSBkZXY7Ci0KIAlmb3IgKGkgPSAwOyBpIDwgc2ltcGxlLT5udW1fY2xvY2tzOyBpKyspIHsKIAkJc3RydWN0IGNsawkqY2xrOworCQlpbnQJCXJldDsKIAogCQljbGsgPSBvZl9jbGtfZ2V0KG5wLCBpKTsKIAkJaWYgKElTX0VSUihjbGspKSB7CkBAIC04Nyw2ICs3NywyOSBAQAogCQlzaW1wbGUtPmNsa3NbaV0gPSBjbGs7CiAJfQogCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHdjM19vZl9zaW1wbGVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZHdjM19vZl9zaW1wbGUJKnNpbXBsZTsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUJKm5wID0gZGV2LT5vZl9ub2RlOworCisJaW50CQkJcmV0OworCWludAkJCWk7CisKKwlzaW1wbGUgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnNpbXBsZSksIEdGUF9LRVJORUwpOworCWlmICghc2ltcGxlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHNpbXBsZSk7CisJc2ltcGxlLT5kZXYgPSBkZXY7CisKKwlyZXQgPSBkd2MzX29mX3NpbXBsZV9jbGtfaW5pdChzaW1wbGUsIG9mX2Nsa19nZXRfcGFyZW50X2NvdW50KG5wKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCXJldCA9IG9mX3BsYXRmb3JtX3BvcHVsYXRlKG5wLCBOVUxMLCBOVUxMLCBkZXYpOwogCWlmIChyZXQpIHsKIAkJZm9yIChpID0gMDsgaSA8IHNpbXBsZS0+bnVtX2Nsb2NrczsgaSsrKSB7CkBAIC0xMTEsNyArMTI0LDcgQEAKIAlpbnQJCQlpOwogCiAJZm9yIChpID0gMDsgaSA8IHNpbXBsZS0+bnVtX2Nsb2NrczsgaSsrKSB7Ci0JCWNsa191bnByZXBhcmUoc2ltcGxlLT5jbGtzW2ldKTsKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNpbXBsZS0+Y2xrc1tpXSk7CiAJCWNsa19wdXQoc2ltcGxlLT5jbGtzW2ldKTsKIAl9CiAKQEAgLTE2MSw3ICsxNzQsOSBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvZl9kd2MzX3NpbXBsZV9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAicWNvbSxkd2MzIiB9LAorCXsgLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMzk5LWR3YzMiIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJ4bG54LHp5bnFtcC1kd2MzIiB9LAorCXsgLmNvbXBhdGlibGUgPSAiY2F2aXVtLG9jdGVvbi03MTMwLXVzYi11Y3RsIiB9LAogCXsgLyogU2VudGluZWwgKi8gfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG9mX2R3YzNfc2ltcGxlX21hdGNoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzMvZHdjMy1wY2kuYyBiL2RyaXZlcnMvdXNiL2R3YzMvZHdjMy1wY2kuYwppbmRleCA0NWY1YTIzLi42ZGYwZjVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9kd2MzL2R3YzMtcGNpLmMKKysrIGIvZHJpdmVycy91c2IvZHdjMy9kd2MzLXBjaS5jCkBAIC0zNyw2ICszNyw3IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfQlhUCQkJMHgwYWFhCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfQlhUX00JCTB4MWFhYQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0FQTAkJCTB4NWFhYQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0tCUAkJCTB4YTJiMAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZ3Bpb19wYXJhbXMgcmVzZXRfZ3Bpb3MgPSB7IDAsIDAsIGZhbHNlIH07CiBzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZ3Bpb19wYXJhbXMgY3NfZ3Bpb3MgPSB7IDEsIDAsIGZhbHNlIH07CkBAIC0yMjcsNiArMjI4LDcgQEAKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9CWFQpLCB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0JYVF9NKSwgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9BUEwpLCB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0tCUCksIH0sCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF9OTF9VU0IpLCB9LAogCXsgIH0JLyogVGVybWluYXRpbmcgRW50cnkgKi8KIH07CkBAIC0yNDEsNiArMjQzLDE1IEBACiAJcmV0dXJuIC1FQlVTWTsKIH0KIAorc3RhdGljIGludCBkd2MzX3BjaV9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHdjMyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0dXJuIHBtX3J1bnRpbWVfZ2V0KCZkd2MzLT5kZXYpOworfQorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiBzdGF0aWMgaW50IGR3YzNfcGNpX3BtX2R1bW15KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAkvKgpAQCAtMjUzLDExICsyNjQsMTEgQEAKIAkgKi8KIAlyZXR1cm4gMDsKIH0KLSNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKyNlbmRpZiAvKiBDT05GSUdfUE1fU0xFRVAgKi8KIAogc3RhdGljIHN0cnVjdCBkZXZfcG1fb3BzIGR3YzNfcGNpX2Rldl9wbV9vcHMgPSB7CiAJU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMoZHdjM19wY2lfcG1fZHVtbXksIGR3YzNfcGNpX3BtX2R1bW15KQotCVNFVF9SVU5USU1FX1BNX09QUyhkd2MzX3BjaV9ydW50aW1lX3N1c3BlbmQsIGR3YzNfcGNpX3BtX2R1bW15LAorCVNFVF9SVU5USU1FX1BNX09QUyhkd2MzX3BjaV9ydW50aW1lX3N1c3BlbmQsIGR3YzNfcGNpX3J1bnRpbWVfcmVzdW1lLAogCQlOVUxMKQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMy9nYWRnZXQuYyBiL2RyaXZlcnMvdXNiL2R3YzMvZ2FkZ2V0LmMKaW5kZXggOGY4YzIxNS4uMDdjYzg5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZHdjMy9nYWRnZXQuYworKysgYi9kcml2ZXJzL3VzYi9kd2MzL2dhZGdldC5jCkBAIC0xNzQsMTUgKzE3NCw4IEBACiAJCWludCBzdGF0dXMpCiB7CiAJc3RydWN0IGR3YzMJCQkqZHdjID0gZGVwLT5kd2M7Ci0JaW50CQkJCWk7CiAKLQlpZiAocmVxLT5zdGFydGVkKSB7Ci0JCWkgPSAwOwotCQlkbyB7Ci0JCQlkd2MzX2VwX2luY19kZXEoZGVwKTsKLQkJfSB3aGlsZSgrK2kgPCByZXEtPnJlcXVlc3QubnVtX21hcHBlZF9zZ3MpOwotCQlyZXEtPnN0YXJ0ZWQgPSBmYWxzZTsKLQl9CisJcmVxLT5zdGFydGVkID0gZmFsc2U7CiAJbGlzdF9kZWwoJnJlcS0+bGlzdCk7CiAJcmVxLT50cmIgPSBOVUxMOwogCkBAIC0zNDgsNyArMzQxLDggQEAKIAkgKiBJTiB0cmFuc2ZlcnMgZHVlIHRvIGEgbWlzaGFuZGxlZCBlcnJvciBjb25kaXRpb24uIFN5bm9wc3lzCiAJICogU1RBUiA5MDAwNjE0MjUyLgogCSAqLwotCWlmIChkZXAtPmRpcmVjdGlvbiAmJiAoZHdjLT5yZXZpc2lvbiA+PSBEV0MzX1JFVklTSU9OXzI2MEEpKQorCWlmIChkZXAtPmRpcmVjdGlvbiAmJiAoZHdjLT5yZXZpc2lvbiA+PSBEV0MzX1JFVklTSU9OXzI2MEEpICYmCisJICAgIChkd2MtPmdhZGdldC5zcGVlZCA+PSBVU0JfU1BFRURfU1VQRVIpKQogCQljbWQgfD0gRFdDM19ERVBDTURfQ0xFQVJQRU5ESU47CiAKIAltZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOwpAQCAtNDkwLDcgKzQ4NCw4IEBACiAJCXBhcmFtcy5wYXJhbTAgfD0gRFdDM19ERVBDRkdfQUNUSU9OX0lOSVQ7CiAJfQogCi0JcGFyYW1zLnBhcmFtMSA9IERXQzNfREVQQ0ZHX1hGRVJfQ09NUExFVEVfRU47CisJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2NvbnRyb2woZGVzYykpCisJCXBhcmFtcy5wYXJhbTEgPSBEV0MzX0RFUENGR19YRkVSX0NPTVBMRVRFX0VOOwogCiAJaWYgKGRlcC0+bnVtYmVyIDw9IDEgfHwgdXNiX2VuZHBvaW50X3hmZXJfaXNvYyhkZXNjKSkKIAkJcGFyYW1zLnBhcmFtMSB8PSBEV0MzX0RFUENGR19YRkVSX05PVF9SRUFEWV9FTjsKQEAgLTc2NCw2ICs3NTksOCBAQAogCWtmcmVlKHJlcSk7CiB9CiAKK3N0YXRpYyB1MzIgZHdjM19jYWxjX3RyYnNfbGVmdChzdHJ1Y3QgZHdjM19lcCAqZGVwKTsKKwogLyoqCiAgKiBkd2MzX3ByZXBhcmVfb25lX3RyYiAtIHNldHVwIG9uZSBUUkIgZnJvbSBvbmUgcmVxdWVzdAogICogQGRlcDogZW5kcG9pbnQgZm9yIHdoaWNoIHRoaXMgcmVxdWVzdCBpcyBwcmVwYXJlZApAQCAtNzcxLDE1ICs3NjgsMTMgQEAKICAqLwogc3RhdGljIHZvaWQgZHdjM19wcmVwYXJlX29uZV90cmIoc3RydWN0IGR3YzNfZXAgKmRlcCwKIAkJc3RydWN0IGR3YzNfcmVxdWVzdCAqcmVxLCBkbWFfYWRkcl90IGRtYSwKLQkJdW5zaWduZWQgbGVuZ3RoLCB1bnNpZ25lZCBsYXN0LCB1bnNpZ25lZCBjaGFpbiwgdW5zaWduZWQgbm9kZSkKKwkJdW5zaWduZWQgbGVuZ3RoLCB1bnNpZ25lZCBjaGFpbiwgdW5zaWduZWQgbm9kZSkKIHsKIAlzdHJ1Y3QgZHdjM190cmIJCSp0cmI7CiAKLQlkd2MzX3RyYWNlKHRyYWNlX2R3YzNfZ2FkZ2V0LCAiJXM6IHJlcSAlcCBkbWEgJTA4bGx4IGxlbmd0aCAlZCVzJXMiLAorCWR3YzNfdHJhY2UodHJhY2VfZHdjM19nYWRnZXQsICIlczogcmVxICVwIGRtYSAlMDhsbHggbGVuZ3RoICVkJXMiLAogCQkJZGVwLT5uYW1lLCByZXEsICh1bnNpZ25lZCBsb25nIGxvbmcpIGRtYSwKLQkJCWxlbmd0aCwgbGFzdCA/ICIgbGFzdCIgOiAiIiwKLQkJCWNoYWluID8gIiBjaGFpbiIgOiAiIik7Ci0KKwkJCWxlbmd0aCwgY2hhaW4gPyAiIGNoYWluIiA6ICIiKTsKIAogCXRyYiA9ICZkZXAtPnRyYl9wb29sW2RlcC0+dHJiX2VucXVldWVdOwogCkBAIC04MjYsMTIgKzgyMSwxMCBAQAogCS8qIGFsd2F5cyBlbmFibGUgQ29udGludWUgb24gU2hvcnQgUGFja2V0ICovCiAJdHJiLT5jdHJsIHw9IERXQzNfVFJCX0NUUkxfQ1NQOwogCi0JaWYgKCFyZXEtPnJlcXVlc3Qubm9faW50ZXJydXB0ICYmICFjaGFpbikKKwlpZiAoKCFyZXEtPnJlcXVlc3Qubm9faW50ZXJydXB0ICYmICFjaGFpbikgfHwKKwkJCShkd2MzX2NhbGNfdHJic19sZWZ0KGRlcCkgPT0gMCkpCiAJCXRyYi0+Y3RybCB8PSBEV0MzX1RSQl9DVFJMX0lPQyB8IERXQzNfVFJCX0NUUkxfSVNQX0lNSTsKIAotCWlmIChsYXN0KQotCQl0cmItPmN0cmwgfD0gRFdDM19UUkJfQ1RSTF9MU1Q7Ci0KIAlpZiAoY2hhaW4pCiAJCXRyYi0+Y3RybCB8PSBEV0MzX1RSQl9DVFJMX0NITjsKIApAQCAtODU2LDEyICs4NDksMTIgQEAKICAqLwogc3RhdGljIHN0cnVjdCBkd2MzX3RyYiAqZHdjM19lcF9wcmV2X3RyYihzdHJ1Y3QgZHdjM19lcCAqZGVwLCB1OCBpbmRleCkKIHsKLQlpZiAoIWluZGV4KQotCQlpbmRleCA9IERXQzNfVFJCX05VTSAtIDI7Ci0JZWxzZQotCQlpbmRleCA9IGRlcC0+dHJiX2VucXVldWUgLSAxOworCXU4IHRtcCA9IGluZGV4OwogCi0JcmV0dXJuICZkZXAtPnRyYl9wb29sW2luZGV4XTsKKwlpZiAoIXRtcCkKKwkJdG1wID0gRFdDM19UUkJfTlVNIC0gMTsKKworCXJldHVybiAmZGVwLT50cmJfcG9vbFt0bXAgLSAxXTsKIH0KIAogc3RhdGljIHUzMiBkd2MzX2NhbGNfdHJic19sZWZ0KHN0cnVjdCBkd2MzX2VwICpkZXApCkBAIC04OTQsNjUgKzg4Nyw0MiBAQAogfQogCiBzdGF0aWMgdm9pZCBkd2MzX3ByZXBhcmVfb25lX3RyYl9zZyhzdHJ1Y3QgZHdjM19lcCAqZGVwLAotCQlzdHJ1Y3QgZHdjM19yZXF1ZXN0ICpyZXEsIHVuc2lnbmVkIGludCB0cmJzX2xlZnQsCi0JCXVuc2lnbmVkIGludCBtb3JlX2NvbWluZykKKwkJc3RydWN0IGR3YzNfcmVxdWVzdCAqcmVxKQogewotCXN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxdWVzdCA9ICZyZXEtPnJlcXVlc3Q7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IHJlcXVlc3QtPnNnOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSByZXEtPnNnOwogCXN0cnVjdCBzY2F0dGVybGlzdCAqczsKLQl1bnNpZ25lZCBpbnQJbGFzdCA9IGZhbHNlOwogCXVuc2lnbmVkIGludAlsZW5ndGg7CiAJZG1hX2FkZHJfdAlkbWE7CiAJaW50CQlpOwogCi0JZm9yX2VhY2hfc2coc2csIHMsIHJlcXVlc3QtPm51bV9tYXBwZWRfc2dzLCBpKSB7CisJZm9yX2VhY2hfc2coc2csIHMsIHJlcS0+bnVtX3BlbmRpbmdfc2dzLCBpKSB7CiAJCXVuc2lnbmVkIGNoYWluID0gdHJ1ZTsKIAogCQlsZW5ndGggPSBzZ19kbWFfbGVuKHMpOwogCQlkbWEgPSBzZ19kbWFfYWRkcmVzcyhzKTsKIAotCQlpZiAoc2dfaXNfbGFzdChzKSkgewotCQkJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2ludChkZXAtPmVuZHBvaW50LmRlc2MpIHx8Ci0JCQkJIW1vcmVfY29taW5nKQotCQkJCWxhc3QgPSB0cnVlOwotCi0JCQljaGFpbiA9IGZhbHNlOwotCQl9Ci0KLQkJaWYgKCF0cmJzX2xlZnQtLSkKLQkJCWxhc3QgPSB0cnVlOwotCi0JCWlmIChsYXN0KQorCQlpZiAoc2dfaXNfbGFzdChzKSkKIAkJCWNoYWluID0gZmFsc2U7CiAKIAkJZHdjM19wcmVwYXJlX29uZV90cmIoZGVwLCByZXEsIGRtYSwgbGVuZ3RoLAotCQkJCWxhc3QsIGNoYWluLCBpKTsKKwkJCQljaGFpbiwgaSk7CiAKLQkJaWYgKGxhc3QpCisJCWlmICghZHdjM19jYWxjX3RyYnNfbGVmdChkZXApKQogCQkJYnJlYWs7CiAJfQogfQogCiBzdGF0aWMgdm9pZCBkd2MzX3ByZXBhcmVfb25lX3RyYl9saW5lYXIoc3RydWN0IGR3YzNfZXAgKmRlcCwKLQkJc3RydWN0IGR3YzNfcmVxdWVzdCAqcmVxLCB1bnNpZ25lZCBpbnQgdHJic19sZWZ0LAotCQl1bnNpZ25lZCBpbnQgbW9yZV9jb21pbmcpCisJCXN0cnVjdCBkd2MzX3JlcXVlc3QgKnJlcSkKIHsKLQl1bnNpZ25lZCBpbnQJbGFzdCA9IGZhbHNlOwogCXVuc2lnbmVkIGludAlsZW5ndGg7CiAJZG1hX2FkZHJfdAlkbWE7CiAKIAlkbWEgPSByZXEtPnJlcXVlc3QuZG1hOwogCWxlbmd0aCA9IHJlcS0+cmVxdWVzdC5sZW5ndGg7CiAKLQlpZiAoIXRyYnNfbGVmdCkKLQkJbGFzdCA9IHRydWU7Ci0KLQkvKiBJcyB0aGlzIHRoZSBsYXN0IHJlcXVlc3Q/ICovCi0JaWYgKHVzYl9lbmRwb2ludF94ZmVyX2ludChkZXAtPmVuZHBvaW50LmRlc2MpIHx8ICFtb3JlX2NvbWluZykKLQkJbGFzdCA9IHRydWU7Ci0KIAlkd2MzX3ByZXBhcmVfb25lX3RyYihkZXAsIHJlcSwgZG1hLCBsZW5ndGgsCi0JCQlsYXN0LCBmYWxzZSwgMCk7CisJCQlmYWxzZSwgMCk7CiB9CiAKIC8qCkBAIC05NjYsMjYgKzkzNiwxOSBAQAogc3RhdGljIHZvaWQgZHdjM19wcmVwYXJlX3RyYnMoc3RydWN0IGR3YzNfZXAgKmRlcCkKIHsKIAlzdHJ1Y3QgZHdjM19yZXF1ZXN0CSpyZXEsICpuOwotCXVuc2lnbmVkIGludAkJbW9yZV9jb21pbmc7Ci0JdTMyCQkJdHJic19sZWZ0OwogCiAJQlVJTERfQlVHX09OX05PVF9QT1dFUl9PRl8yKERXQzNfVFJCX05VTSk7CiAKLQl0cmJzX2xlZnQgPSBkd2MzX2NhbGNfdHJic19sZWZ0KGRlcCk7Ci0JaWYgKCF0cmJzX2xlZnQpCisJaWYgKCFkd2MzX2NhbGNfdHJic19sZWZ0KGRlcCkpCiAJCXJldHVybjsKIAotCW1vcmVfY29taW5nID0gZGVwLT5hbGxvY2F0ZWRfcmVxdWVzdHMgLSBkZXAtPnF1ZXVlZF9yZXF1ZXN0czsKLQogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXEsIG4sICZkZXAtPnBlbmRpbmdfbGlzdCwgbGlzdCkgewotCQlpZiAocmVxLT5yZXF1ZXN0Lm51bV9tYXBwZWRfc2dzID4gMCkKLQkJCWR3YzNfcHJlcGFyZV9vbmVfdHJiX3NnKGRlcCwgcmVxLCB0cmJzX2xlZnQtLSwKLQkJCQkJbW9yZV9jb21pbmcpOworCQlpZiAocmVxLT5udW1fcGVuZGluZ19zZ3MgPiAwKQorCQkJZHdjM19wcmVwYXJlX29uZV90cmJfc2coZGVwLCByZXEpOwogCQllbHNlCi0JCQlkd2MzX3ByZXBhcmVfb25lX3RyYl9saW5lYXIoZGVwLCByZXEsIHRyYnNfbGVmdC0tLAotCQkJCQltb3JlX2NvbWluZyk7CisJCQlkd2MzX3ByZXBhcmVfb25lX3RyYl9saW5lYXIoZGVwLCByZXEpOwogCi0JCWlmICghdHJic19sZWZ0KQorCQlpZiAoIWR3YzNfY2FsY190cmJzX2xlZnQoZGVwKSkKIAkJCXJldHVybjsKIAl9CiB9CkBAIC0xMTAxLDkzICsxMDY0LDI5IEBACiAKIAl0cmFjZV9kd2MzX2VwX3F1ZXVlKHJlcSk7CiAKLQkvKgotCSAqIFdlIG9ubHkgYWRkIHRvIG91ciBsaXN0IG9mIHJlcXVlc3RzIG5vdyBhbmQKLQkgKiBzdGFydCBjb25zdW1pbmcgdGhlIGxpc3Qgb25jZSB3ZSBnZXQgWGZlck5vdFJlYWR5Ci0JICogSVJRLgotCSAqCi0JICogVGhhdCB3YXksIHdlIGF2b2lkIGRvaW5nIGFueXRoaW5nIHRoYXQgd2UgZG9uJ3QgbmVlZAotCSAqIHRvIGRvIG5vdyBhbmQgZGVmZXIgaXQgdW50aWwgdGhlIHBvaW50IHdlIHJlY2VpdmUgYQotCSAqIHBhcnRpY3VsYXIgdG9rZW4gZnJvbSB0aGUgSG9zdCBzaWRlLgotCSAqCi0JICogVGhpcyB3aWxsIGFsc28gYXZvaWQgSG9zdCBjYW5jZWxsaW5nIFVSQnMgZHVlIHRvIHRvbwotCSAqIG1hbnkgTkFLcy4KLQkgKi8KIAlyZXQgPSB1c2JfZ2FkZ2V0X21hcF9yZXF1ZXN0KCZkd2MtPmdhZGdldCwgJnJlcS0+cmVxdWVzdCwKIAkJCWRlcC0+ZGlyZWN0aW9uKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJcmVxLT5zZwkJCT0gcmVxLT5yZXF1ZXN0LnNnOworCXJlcS0+bnVtX3BlbmRpbmdfc2dzCT0gcmVxLT5yZXF1ZXN0Lm51bV9tYXBwZWRfc2dzOworCiAJbGlzdF9hZGRfdGFpbCgmcmVxLT5saXN0LCAmZGVwLT5wZW5kaW5nX2xpc3QpOwogCi0JLyoKLQkgKiBJZiB0aGVyZSBhcmUgbm8gcGVuZGluZyByZXF1ZXN0cyBhbmQgdGhlIGVuZHBvaW50IGlzbid0IGFscmVhZHkKLQkgKiBidXN5LCB3ZSB3aWxsIGp1c3Qgc3RhcnQgdGhlIHJlcXVlc3Qgc3RyYWlnaHQgYXdheS4KLQkgKgotCSAqIFRoaXMgd2lsbCBzYXZlIG9uZSBJUlEgKFhGRVJfTk9UX1JFQURZKSBhbmQgcG9zc2libHkgbWFrZSBpdCBhCi0JICogbGl0dGxlIGJpdCBmYXN0ZXIuCi0JICovCi0JaWYgKCF1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGRlcC0+ZW5kcG9pbnQuZGVzYykgJiYKLQkJCSF1c2JfZW5kcG9pbnRfeGZlcl9pbnQoZGVwLT5lbmRwb2ludC5kZXNjKSkgewotCQlyZXQgPSBfX2R3YzNfZ2FkZ2V0X2tpY2tfdHJhbnNmZXIoZGVwLCAwKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyoKLQkgKiBUaGVyZSBhcmUgYSBmZXcgc3BlY2lhbCBjYXNlczoKLQkgKgotCSAqIDEuIFhmZXJOb3RSZWFkeSB3aXRoIGVtcHR5IGxpc3Qgb2YgcmVxdWVzdHMuIFdlIG5lZWQgdG8ga2ljayB0aGUKLQkgKiAgICB0cmFuc2ZlciBoZXJlIGluIHRoYXQgc2l0dWF0aW9uLCBvdGhlcndpc2Ugd2Ugd2lsbCBiZSBOQUtpbmcKLQkgKiAgICBmb3JldmVyLiBJZiB3ZSBnZXQgWGZlck5vdFJlYWR5IGJlZm9yZSBnYWRnZXQgZHJpdmVyIGhhcyBhCi0JICogICAgY2hhbmNlIHRvIHF1ZXVlIGEgcmVxdWVzdCwgd2Ugd2lsbCBBQ0sgdGhlIElSUSBidXQgd29uJ3QgYmUKLQkgKiAgICBhYmxlIHRvIHJlY2VpdmUgdGhlIGRhdGEgdW50aWwgdGhlIG5leHQgcmVxdWVzdCBpcyBxdWV1ZWQuCi0JICogICAgVGhlIGZvbGxvd2luZyBjb2RlIGlzIGhhbmRsaW5nIGV4YWN0bHkgdGhhdC4KLQkgKgotCSAqLwotCWlmIChkZXAtPmZsYWdzICYgRFdDM19FUF9QRU5ESU5HX1JFUVVFU1QpIHsKLQkJLyoKLQkJICogSWYgeGZlcm5vdHJlYWR5IGlzIGFscmVhZHkgZWxhcHNlZCBhbmQgaXQgaXMgYSBjYXNlCi0JCSAqIG9mIGlzb2MgdHJhbnNmZXIsIHRoZW4gaXNzdWUgRU5EIFRSQU5TRkVSLCBzbyB0aGF0Ci0JCSAqIHlvdSBjYW4gcmVjZWl2ZSB4ZmVybm90cmVhZHkgYWdhaW4gYW5kIGNhbiBoYXZlCi0JCSAqIG5vdGlvbiBvZiBjdXJyZW50IG1pY3JvZnJhbWUuCi0JCSAqLwotCQlpZiAodXNiX2VuZHBvaW50X3hmZXJfaXNvYyhkZXAtPmVuZHBvaW50LmRlc2MpKSB7Ci0JCQlpZiAobGlzdF9lbXB0eSgmZGVwLT5zdGFydGVkX2xpc3QpKSB7Ci0JCQkJZHdjM19zdG9wX2FjdGl2ZV90cmFuc2Zlcihkd2MsIGRlcC0+bnVtYmVyLCB0cnVlKTsKLQkJCQlkZXAtPmZsYWdzID0gRFdDM19FUF9FTkFCTEVEOwotCQkJfQotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlyZXQgPSBfX2R3YzNfZ2FkZ2V0X2tpY2tfdHJhbnNmZXIoZGVwLCAwKTsKLQkJaWYgKCFyZXQpCi0JCQlkZXAtPmZsYWdzICY9IH5EV0MzX0VQX1BFTkRJTkdfUkVRVUVTVDsKLQotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKgotCSAqIDIuIFhmZXJJblByb2dyZXNzIG9uIElzb2MgRVAgd2l0aCBhbiBhY3RpdmUgdHJhbnNmZXIuIFdlIG5lZWQgdG8KLQkgKiAgICBraWNrIHRoZSB0cmFuc2ZlciBoZXJlIGFmdGVyIHF1ZXVpbmcgYSByZXF1ZXN0LCBvdGhlcndpc2UgdGhlCi0JICogICAgY29yZSBtYXkgbm90IHNlZSB0aGUgbW9kaWZpZWQgVFJCKHMpLgotCSAqLwogCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGRlcC0+ZW5kcG9pbnQuZGVzYykgJiYKLQkJCShkZXAtPmZsYWdzICYgRFdDM19FUF9CVVNZKSAmJgotCQkJIShkZXAtPmZsYWdzICYgRFdDM19FUF9NSVNTRURfSVNPQykpIHsKLQkJV0FSTl9PTl9PTkNFKCFkZXAtPnJlc291cmNlX2luZGV4KTsKLQkJcmV0ID0gX19kd2MzX2dhZGdldF9raWNrX3RyYW5zZmVyKGRlcCwgZGVwLT5yZXNvdXJjZV9pbmRleCk7Ci0JCWdvdG8gb3V0OworCQkJZGVwLT5mbGFncyAmIERXQzNfRVBfUEVORElOR19SRVFVRVNUKSB7CisJCWlmIChsaXN0X2VtcHR5KCZkZXAtPnN0YXJ0ZWRfbGlzdCkpIHsKKwkJCWR3YzNfc3RvcF9hY3RpdmVfdHJhbnNmZXIoZHdjLCBkZXAtPm51bWJlciwgdHJ1ZSk7CisJCQlkZXAtPmZsYWdzID0gRFdDM19FUF9FTkFCTEVEOworCQl9CisJCXJldHVybiAwOwogCX0KIAotCS8qCi0JICogNC4gU3RyZWFtIENhcGFibGUgQnVsayBFbmRwb2ludHMuIFdlIG5lZWQgdG8gc3RhcnQgdGhlIHRyYW5zZmVyCi0JICogcmlnaHQgYXdheSwgb3RoZXJ3aXNlIGhvc3Qgd2lsbCBub3Qga25vdyB3ZSBoYXZlIHN0cmVhbXMgdG8gYmUKLQkgKiBoYW5kbGVkLgotCSAqLwotCWlmIChkZXAtPnN0cmVhbV9jYXBhYmxlKQotCQlyZXQgPSBfX2R3YzNfZ2FkZ2V0X2tpY2tfdHJhbnNmZXIoZGVwLCAwKTsKKwlpZiAoIWR3YzNfY2FsY190cmJzX2xlZnQoZGVwKSkKKwkJcmV0dXJuIDA7CiAKLW91dDoKKwlyZXQgPSBfX2R3YzNfZ2FkZ2V0X2tpY2tfdHJhbnNmZXIoZGVwLCAwKTsKIAlpZiAocmV0ICYmIHJldCAhPSAtRUJVU1kpCiAJCWR3YzNfdHJhY2UodHJhY2VfZHdjM19nYWRnZXQsCiAJCQkJIiVzOiBmYWlsZWQgdG8ga2ljayB0cmFuc2ZlcnMiLApAQCAtMTQzMyw3ICsxMzMyLDcgQEAKIAogc3RhdGljIGludCBfX2R3YzNfZ2FkZ2V0X3dha2V1cChzdHJ1Y3QgZHdjMyAqZHdjKQogewotCXVuc2lnbmVkIGxvbmcJCXRpbWVvdXQ7CisJaW50CQkJcmV0cmllczsKIAogCWludAkJCXJldDsKIAl1MzIJCQlyZWc7CkBAIC0xNDg0LDkgKzEzODMsOSBAQAogCX0KIAogCS8qIHBvbGwgdW50aWwgTGluayBTdGF0ZSBjaGFuZ2VzIHRvIE9OICovCi0JdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMCk7CisJcmV0cmllcyA9IDIwMDAwOwogCi0Jd2hpbGUgKCF0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJd2hpbGUgKHJldHJpZXMtLSkgewogCQlyZWcgPSBkd2MzX3JlYWRsKGR3Yy0+cmVncywgRFdDM19EU1RTKTsKIAogCQkvKiBpbiBIUywgbWVhbnMgT04gKi8KQEAgLTE5NTUsMjcgKzE4NTQsMzUgQEAKIAogc3RhdGljIGludCBfX2R3YzNfY2xlYW51cF9kb25lX3RyYnMoc3RydWN0IGR3YzMgKmR3Yywgc3RydWN0IGR3YzNfZXAgKmRlcCwKIAkJc3RydWN0IGR3YzNfcmVxdWVzdCAqcmVxLCBzdHJ1Y3QgZHdjM190cmIgKnRyYiwKLQkJY29uc3Qgc3RydWN0IGR3YzNfZXZlbnRfZGVwZXZ0ICpldmVudCwgaW50IHN0YXR1cykKKwkJY29uc3Qgc3RydWN0IGR3YzNfZXZlbnRfZGVwZXZ0ICpldmVudCwgaW50IHN0YXR1cywKKwkJaW50IGNoYWluKQogewogCXVuc2lnbmVkIGludAkJY291bnQ7CiAJdW5zaWduZWQgaW50CQlzX3BrdCA9IDA7CiAJdW5zaWduZWQgaW50CQl0cmJfc3RhdHVzOwogCiAJZGVwLT5xdWV1ZWRfcmVxdWVzdHMtLTsKKwlkd2MzX2VwX2luY19kZXEoZGVwKTsKIAl0cmFjZV9kd2MzX2NvbXBsZXRlX3RyYihkZXAsIHRyYik7CiAKKwkvKgorCSAqIElmIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2Ygc2VyaWVzIG9mIGNoYWluZWQgVFJCcyBhbmQgd2UKKwkgKiByZWNlaXZlIGEgc2hvcnQgdHJhbnNmZXIgYWxvbmcgdGhlIHdheSwgRFdDMyB3aWxsIHNraXAKKwkgKiB0aHJvdWdoIGFsbCBUUkJzIGluY2x1ZGluZyB0aGUgbGFzdCBUUkIgaW4gdGhlIGNoYWluICh0aGUKKwkgKiB3aGVyZSBDSE4gYml0IGlzIHplcm8uIERXQzMgd2lsbCBhbHNvIGF2b2lkIGNsZWFyaW5nIEhXTworCSAqIGJpdCBhbmQgU1cgaGFzIHRvIGRvIGl0IG1hbnVhbGx5LgorCSAqCisJICogV2UncmUgZ29pbmcgdG8gZG8gdGhhdCBoZXJlIHRvIGF2b2lkIHByb2JsZW1zIG9mIEhXIHRyeWluZworCSAqIHRvIHVzZSBib2d1cyBUUkJzIGZvciB0cmFuc2ZlcnMuCisJICovCisJaWYgKGNoYWluICYmICh0cmItPmN0cmwgJiBEV0MzX1RSQl9DVFJMX0hXTykpCisJCXRyYi0+Y3RybCAmPSB+RFdDM19UUkJfQ1RSTF9IV087CisKIAlpZiAoKHRyYi0+Y3RybCAmIERXQzNfVFJCX0NUUkxfSFdPKSAmJiBzdGF0dXMgIT0gLUVTSFVURE9XTikKLQkJLyoKLQkJICogV2UgY29udGludWUgZGVzcGl0ZSB0aGUgZXJyb3IuIFRoZXJlIGlzIG5vdCBtdWNoIHdlCi0JCSAqIGNhbiBkby4gSWYgd2UgZG9uJ3QgY2xlYW4gaXQgdXAgd2UgbG9vcCBmb3JldmVyLiBJZgotCQkgKiB3ZSBza2lwIHRoZSBUUkIgdGhlbiBpdCBnZXRzIG92ZXJ3cml0dGVuIGFmdGVyIGEKLQkJICogd2hpbGUgc2luY2Ugd2UgdXNlIHRoZW0gaW4gYSByaW5nIGJ1ZmZlci4gQSBCVUcoKQotCQkgKiB3b3VsZCBoZWxwLiBMZXRzIGhvcGUgdGhhdCBpZiB0aGlzIG9jY3Vycywgc29tZW9uZQotCQkgKiBmaXhlcyB0aGUgcm9vdCBjYXVzZSBpbnN0ZWFkIG9mIGxvb2tpbmcgYXdheSA6KQotCQkgKi8KLQkJZGV2X2Vycihkd2MtPmRldiwgIiVzJ3MgVFJCICglcCkgc3RpbGwgb3duZWQgYnkgSFdcbiIsCi0JCQkJZGVwLT5uYW1lLCB0cmIpOworCQlyZXR1cm4gMTsKKwogCWNvdW50ID0gdHJiLT5zaXplICYgRFdDM19UUkJfU0laRV9NQVNLOworCXJlcS0+cmVxdWVzdC5hY3R1YWwgKz0gY291bnQ7CiAKIAlpZiAoZGVwLT5kaXJlY3Rpb24pIHsKIAkJaWYgKGNvdW50KSB7CkBAIC0yMDEzLDU5ICsxOTIwLDc2IEBACiAJCQlzX3BrdCA9IDE7CiAJfQogCi0JLyoKLQkgKiBXZSBhc3N1bWUgaGVyZSB3ZSB3aWxsIGFsd2F5cyByZWNlaXZlIHRoZSBlbnRpcmUgZGF0YSBibG9jawotCSAqIHdoaWNoIHdlIHNob3VsZCByZWNlaXZlLiBNZWFuaW5nLCBpZiB3ZSBwcm9ncmFtIFJYIHRvCi0JICogcmVjZWl2ZSA0SyBidXQgd2UgcmVjZWl2ZSBvbmx5IDJLLCB3ZSBhc3N1bWUgdGhhdCdzIGFsbCB3ZQotCSAqIHNob3VsZCByZWNlaXZlIGFuZCB3ZSBzaW1wbHkgYm91bmNlIHRoZSByZXF1ZXN0IGJhY2sgdG8gdGhlCi0JICogZ2FkZ2V0IGRyaXZlciBmb3IgZnVydGhlciBwcm9jZXNzaW5nLgotCSAqLwotCXJlcS0+cmVxdWVzdC5hY3R1YWwgKz0gcmVxLT5yZXF1ZXN0Lmxlbmd0aCAtIGNvdW50OwotCWlmIChzX3BrdCkKKwlpZiAoc19wa3QgJiYgIWNoYWluKQogCQlyZXR1cm4gMTsKLQlpZiAoKGV2ZW50LT5zdGF0dXMgJiBERVBFVlRfU1RBVFVTX0xTVCkgJiYKLQkJCSh0cmItPmN0cmwgJiAoRFdDM19UUkJfQ1RSTF9MU1QgfAotCQkJCURXQzNfVFJCX0NUUkxfSFdPKSkpCi0JCXJldHVybiAxOworCiAJaWYgKChldmVudC0+c3RhdHVzICYgREVQRVZUX1NUQVRVU19JT0MpICYmCiAJCQkodHJiLT5jdHJsICYgRFdDM19UUkJfQ1RSTF9JT0MpKQogCQlyZXR1cm4gMTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGR3YzNfY2xlYW51cF9kb25lX3JlcXMoc3RydWN0IGR3YzMgKmR3Yywgc3RydWN0IGR3YzNfZXAgKmRlcCwKIAkJY29uc3Qgc3RydWN0IGR3YzNfZXZlbnRfZGVwZXZ0ICpldmVudCwgaW50IHN0YXR1cykKIHsKLQlzdHJ1Y3QgZHdjM19yZXF1ZXN0CSpyZXE7CisJc3RydWN0IGR3YzNfcmVxdWVzdAkqcmVxLCAqbjsKIAlzdHJ1Y3QgZHdjM190cmIJCSp0cmI7Ci0JdW5zaWduZWQgaW50CQlzbG90OwotCXVuc2lnbmVkIGludAkJaTsKKwlib29sCQkJaW9jID0gZmFsc2U7CiAJaW50CQkJcmV0OwogCi0JZG8gewotCQlyZXEgPSBuZXh0X3JlcXVlc3QoJmRlcC0+c3RhcnRlZF9saXN0KTsKLQkJaWYgKFdBUk5fT05fT05DRSghcmVxKSkKLQkJCXJldHVybiAxOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXEsIG4sICZkZXAtPnN0YXJ0ZWRfbGlzdCwgbGlzdCkgeworCQl1bnNpZ25lZCBsZW5ndGg7CisJCXVuc2lnbmVkIGFjdHVhbDsKKwkJaW50IGNoYWluOwogCi0JCWkgPSAwOwotCQlkbyB7Ci0JCQlzbG90ID0gcmVxLT5maXJzdF90cmJfaW5kZXggKyBpOwotCQkJaWYgKHNsb3QgPT0gRFdDM19UUkJfTlVNIC0gMSkKLQkJCQlzbG90Kys7Ci0JCQlzbG90ICU9IERXQzNfVFJCX05VTTsKLQkJCXRyYiA9ICZkZXAtPnRyYl9wb29sW3Nsb3RdOworCQlsZW5ndGggPSByZXEtPnJlcXVlc3QubGVuZ3RoOworCQljaGFpbiA9IHJlcS0+bnVtX3BlbmRpbmdfc2dzID4gMDsKKwkJaWYgKGNoYWluKSB7CisJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gcmVxLT5zZzsKKwkJCXN0cnVjdCBzY2F0dGVybGlzdCAqczsKKwkJCXVuc2lnbmVkIGludCBwZW5kaW5nID0gcmVxLT5udW1fcGVuZGluZ19zZ3M7CisJCQl1bnNpZ25lZCBpbnQgaTsKIAorCQkJZm9yX2VhY2hfc2coc2csIHMsIHBlbmRpbmcsIGkpIHsKKwkJCQl0cmIgPSAmZGVwLT50cmJfcG9vbFtkZXAtPnRyYl9kZXF1ZXVlXTsKKworCQkJCXJlcS0+c2cgPSBzZ19uZXh0KHMpOworCQkJCXJlcS0+bnVtX3BlbmRpbmdfc2dzLS07CisKKwkJCQlyZXQgPSBfX2R3YzNfY2xlYW51cF9kb25lX3RyYnMoZHdjLCBkZXAsIHJlcSwgdHJiLAorCQkJCQkJZXZlbnQsIHN0YXR1cywgY2hhaW4pOworCQkJCWlmIChyZXQpCisJCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJdHJiID0gJmRlcC0+dHJiX3Bvb2xbZGVwLT50cmJfZGVxdWV1ZV07CiAJCQlyZXQgPSBfX2R3YzNfY2xlYW51cF9kb25lX3RyYnMoZHdjLCBkZXAsIHJlcSwgdHJiLAotCQkJCQlldmVudCwgc3RhdHVzKTsKLQkJCWlmIChyZXQpCi0JCQkJYnJlYWs7Ci0JCX0gd2hpbGUgKCsraSA8IHJlcS0+cmVxdWVzdC5udW1fbWFwcGVkX3Nncyk7CisJCQkJCWV2ZW50LCBzdGF0dXMsIGNoYWluKTsKKwkJfQorCisJCS8qCisJCSAqIFdlIGFzc3VtZSBoZXJlIHdlIHdpbGwgYWx3YXlzIHJlY2VpdmUgdGhlIGVudGlyZSBkYXRhIGJsb2NrCisJCSAqIHdoaWNoIHdlIHNob3VsZCByZWNlaXZlLiBNZWFuaW5nLCBpZiB3ZSBwcm9ncmFtIFJYIHRvCisJCSAqIHJlY2VpdmUgNEsgYnV0IHdlIHJlY2VpdmUgb25seSAySywgd2UgYXNzdW1lIHRoYXQncyBhbGwgd2UKKwkJICogc2hvdWxkIHJlY2VpdmUgYW5kIHdlIHNpbXBseSBib3VuY2UgdGhlIHJlcXVlc3QgYmFjayB0byB0aGUKKwkJICogZ2FkZ2V0IGRyaXZlciBmb3IgZnVydGhlciBwcm9jZXNzaW5nLgorCQkgKi8KKwkJYWN0dWFsID0gbGVuZ3RoIC0gcmVxLT5yZXF1ZXN0LmFjdHVhbDsKKwkJcmVxLT5yZXF1ZXN0LmFjdHVhbCA9IGFjdHVhbDsKKworCQlpZiAocmV0ICYmIGNoYWluICYmIChhY3R1YWwgPCBsZW5ndGgpICYmIHJlcS0+bnVtX3BlbmRpbmdfc2dzKQorCQkJcmV0dXJuIF9fZHdjM19nYWRnZXRfa2lja190cmFuc2ZlcihkZXAsIDApOwogCiAJCWR3YzNfZ2FkZ2V0X2dpdmViYWNrKGRlcCwgcmVxLCBzdGF0dXMpOwogCi0JCWlmIChyZXQpCisJCWlmIChyZXQpIHsKKwkJCWlmICgoZXZlbnQtPnN0YXR1cyAmIERFUEVWVF9TVEFUVVNfSU9DKSAmJgorCQkJICAgICh0cmItPmN0cmwgJiBEV0MzX1RSQl9DVFJMX0lPQykpCisJCQkJaW9jID0gdHJ1ZTsKIAkJCWJyZWFrOwotCX0gd2hpbGUgKDEpOworCQl9CisJfQogCiAJLyoKIAkgKiBPdXIgZW5kcG9pbnQgbWlnaHQgZ2V0IGRpc2FibGVkIGJ5IGFub3RoZXIgdGhyZWFkIGR1cmluZwpAQCAtMjA5MiwxMCArMjAxNiw5IEBACiAJCXJldHVybiAxOwogCX0KIAotCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGRlcC0+ZW5kcG9pbnQuZGVzYykpCi0JCWlmICgoZXZlbnQtPnN0YXR1cyAmIERFUEVWVF9TVEFUVVNfSU9DKSAmJgotCQkJCSh0cmItPmN0cmwgJiBEV0MzX1RSQl9DVFJMX0lPQykpCi0JCQlyZXR1cm4gMDsKKwlpZiAodXNiX2VuZHBvaW50X3hmZXJfaXNvYyhkZXAtPmVuZHBvaW50LmRlc2MpICYmIGlvYykKKwkJcmV0dXJuIDA7CisKIAlyZXR1cm4gMTsKIH0KIApAQCAtMjMxMSw2ICsyMjM0LDE4IEBACiAJICoKIAkgKiAtIElzc3VlIEVuZFRyYW5zZmVyIFdJVEggQ01ESU9DIGJpdCBzZXQKIAkgKiAtIFdhaXQgMTAwdXMKKwkgKgorCSAqIEFzIG9mIElQIHZlcnNpb24gMy4xMGEgb2YgdGhlIERXQ191c2IzIElQLCB0aGUgY29udHJvbGxlcgorCSAqIHN1cHBvcnRzIGEgbW9kZSB0byB3b3JrIGFyb3VuZCB0aGUgYWJvdmUgbGltaXRhdGlvbi4gVGhlCisJICogc29mdHdhcmUgY2FuIHBvbGwgdGhlIENNREFDVCBiaXQgaW4gdGhlIERFUENNRCByZWdpc3RlcgorCSAqIGFmdGVyIGlzc3VpbmcgYSBFbmRUcmFuc2ZlciBjb21tYW5kLiBUaGlzIG1vZGUgaXMgZW5hYmxlZAorCSAqIGJ5IHdyaXRpbmcgR1VDVEwyWzE0XS4gVGhpcyBwb2xsaW5nIGlzIGFscmVhZHkgZG9uZSBpbiB0aGUKKwkgKiBkd2MzX3NlbmRfZ2FkZ2V0X2VwX2NtZCgpIGZ1bmN0aW9uIHNvIGlmIHRoZSBtb2RlIGlzCisJICogZW5hYmxlZCwgdGhlIEVuZFRyYW5zZmVyIGNvbW1hbmQgd2lsbCBoYXZlIGNvbXBsZXRlZCB1cG9uCisJICogcmV0dXJuaW5nIGZyb20gdGhpcyBmdW5jdGlvbiBhbmQgd2UgZG9uJ3QgbmVlZCB0byBkZWxheSBmb3IKKwkgKiAxMDB1cy4KKwkgKgorCSAqIFRoaXMgbW9kZSBpcyBOT1QgYXZhaWxhYmxlIG9uIHRoZSBEV0NfdXNiMzEgSVAuCiAJICovCiAKIAljbWQgPSBEV0MzX0RFUENNRF9FTkRUUkFOU0ZFUjsKQEAgLTIzMjIsNyArMjI1Nyw5IEBACiAJV0FSTl9PTl9PTkNFKHJldCk7CiAJZGVwLT5yZXNvdXJjZV9pbmRleCA9IDA7CiAJZGVwLT5mbGFncyAmPSB+RFdDM19FUF9CVVNZOwotCXVkZWxheSgxMDApOworCisJaWYgKGR3YzNfaXNfdXNiMzEoZHdjKSB8fCBkd2MtPnJldmlzaW9uIDwgRFdDM19SRVZJU0lPTl8zMTBBKQorCQl1ZGVsYXkoMTAwKTsKIH0KIAogc3RhdGljIHZvaWQgZHdjM19zdG9wX2FjdGl2ZV90cmFuc2ZlcnMoc3RydWN0IGR3YzMgKmR3YykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzMvdWxwaS5jIGIvZHJpdmVycy91c2IvZHdjMy91bHBpLmMKaW5kZXggZWMwMDRjNi4uYmQ4NmY4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZHdjMy91bHBpLmMKKysrIGIvZHJpdmVycy91c2IvZHdjMy91bHBpLmMKQEAgLTM1LDkgKzM1LDkgQEAKIAlyZXR1cm4gLUVUSU1FRE9VVDsKIH0KIAotc3RhdGljIGludCBkd2MzX3VscGlfcmVhZChzdHJ1Y3QgdWxwaV9vcHMgKm9wcywgdTggYWRkcikKK3N0YXRpYyBpbnQgZHdjM191bHBpX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCB1OCBhZGRyKQogewotCXN0cnVjdCBkd2MzICpkd2MgPSBkZXZfZ2V0X2RydmRhdGEob3BzLT5kZXYpOworCXN0cnVjdCBkd2MzICpkd2MgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAl1MzIgcmVnOwogCWludCByZXQ7CiAKQEAgLTUzLDkgKzUzLDkgQEAKIAlyZXR1cm4gRFdDM19HVVNCMlBIWUFDQ19EQVRBKHJlZyk7CiB9CiAKLXN0YXRpYyBpbnQgZHdjM191bHBpX3dyaXRlKHN0cnVjdCB1bHBpX29wcyAqb3BzLCB1OCBhZGRyLCB1OCB2YWwpCitzdGF0aWMgaW50IGR3YzNfdWxwaV93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4IGFkZHIsIHU4IHZhbCkKIHsKLQlzdHJ1Y3QgZHdjMyAqZHdjID0gZGV2X2dldF9kcnZkYXRhKG9wcy0+ZGV2KTsKKwlzdHJ1Y3QgZHdjMyAqZHdjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJdTMyIHJlZzsKIAogCXJlZyA9IERXQzNfR1VTQjJQSFlBQ0NfTkVXUkVHUkVRIHwgRFdDM19VTFBJX0FERFIoYWRkcik7CkBAIC02NSw3ICs2NSw3IEBACiAJcmV0dXJuIGR3YzNfdWxwaV9idXN5bG9vcChkd2MpOwogfQogCi1zdGF0aWMgc3RydWN0IHVscGlfb3BzIGR3YzNfdWxwaV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHVscGlfb3BzIGR3YzNfdWxwaV9vcHMgPSB7CiAJLnJlYWQgPSBkd2MzX3VscGlfcmVhZCwKIAkud3JpdGUgPSBkd2MzX3VscGlfd3JpdGUsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWcgYi9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZwppbmRleCAzYzNmMzFjLi44YWQyMDMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZwpAQCAtMjA5LDI1ICsyMDksNiBAQAogY29uZmlnIFVTQl9GX1RDTQogCXRyaXN0YXRlCiAKLWNob2ljZQotCXRyaXN0YXRlICJVU0IgR2FkZ2V0IERyaXZlcnMiCi0JZGVmYXVsdCBVU0JfRVRICi0JaGVscAotCSAgQSBMaW51eCAiR2FkZ2V0IERyaXZlciIgdGFsa3MgdG8gdGhlIFVTQiBQZXJpcGhlcmFsIENvbnRyb2xsZXIKLQkgIGRyaXZlciB0aHJvdWdoIHRoZSBhYnN0cmFjdCAiZ2FkZ2V0IiBBUEkuICBTb21lIG90aGVyIG9wZXJhdGluZwotCSAgc3lzdGVtcyBjYWxsIHRoZXNlICJjbGllbnQiIGRyaXZlcnMsIG9mIHdoaWNoICJjbGFzcyBkcml2ZXJzIgotCSAgYXJlIGEgc3Vic2V0IChpbXBsZW1lbnRpbmcgYSBVU0IgZGV2aWNlIGNsYXNzIHNwZWNpZmljYXRpb24pLgotCSAgQSBnYWRnZXQgZHJpdmVyIGltcGxlbWVudHMgb25lIG9yIG1vcmUgVVNCIGZ1bmN0aW9ucyB1c2luZwotCSAgdGhlIHBlcmlwaGVyYWwgaGFyZHdhcmUuCi0KLQkgIEdhZGdldCBkcml2ZXJzIGFyZSBoYXJkd2FyZS1uZXV0cmFsLCBvciAicGxhdGZvcm0gaW5kZXBlbmRlbnQiLAotCSAgZXhjZXB0IHRoYXQgdGhleSBzb21ldGltZXMgbXVzdCB1bmRlcnN0YW5kIHF1aXJrcyBvciBsaW1pdGF0aW9ucwotCSAgb2YgdGhlIHBhcnRpY3VsYXIgY29udHJvbGxlcnMgdGhleSB3b3JrIHdpdGguICBGb3IgZXhhbXBsZSwgd2hlbgotCSAgYSBjb250cm9sbGVyIGRvZXNuJ3Qgc3VwcG9ydCBhbHRlcm5hdGUgY29uZmlndXJhdGlvbnMgb3IgcHJvdmlkZQotCSAgZW5vdWdoIG9mIHRoZSByaWdodCB0eXBlcyBvZiBlbmRwb2ludHMsIHRoZSBnYWRnZXQgZHJpdmVyIG1pZ2h0Ci0JICBub3QgYmUgYWJsZSB3b3JrIHdpdGggdGhhdCBjb250cm9sbGVyLCBvciBtaWdodCBuZWVkIHRvIGltcGxlbWVudAotCSAgYSBsZXNzIGNvbW1vbiB2YXJpYW50IG9mIGEgZGV2aWNlIGNsYXNzIHByb3RvY29sLgotCiAjIHRoaXMgZmlyc3Qgc2V0IG9mIGRyaXZlcnMgYWxsIGRlcGVuZCBvbiBidWxrLWNhcGFibGUgaGFyZHdhcmUuCiAKIGNvbmZpZyBVU0JfQ09ORklHRlMKQEAgLTQzOSw2ICs0MjAsNyBAQAogY29uZmlnIFVTQl9DT05GSUdGU19GX1VWQwogCWJvb2wgIlVTQiBXZWJjYW0gZnVuY3Rpb24iCiAJZGVwZW5kcyBvbiBVU0JfQ09ORklHRlMKKwlkZXBlbmRzIG9uIFZJREVPX1Y0TDIKIAlkZXBlbmRzIG9uIFZJREVPX0RFVgogCXNlbGVjdCBWSURFT0JVRjJfVk1BTExPQwogCXNlbGVjdCBVU0JfRl9VVkMKQEAgLTQ3NSw2ICs0NTcsMjUgQEAKIAkgIEJvdGggcHJvdG9jb2xzIGNhbiB3b3JrIG9uIFVTQjIuMCBhbmQgVVNCMy4wLgogCSAgVUFTIHV0aWxpemVzIHRoZSBVU0IgMy4wIGZlYXR1cmUgY2FsbGVkIHN0cmVhbXMgc3VwcG9ydC4KIAorY2hvaWNlCisJdHJpc3RhdGUgIlVTQiBHYWRnZXQgRHJpdmVycyIKKwlkZWZhdWx0IFVTQl9FVEgKKwloZWxwCisJICBBIExpbnV4ICJHYWRnZXQgRHJpdmVyIiB0YWxrcyB0byB0aGUgVVNCIFBlcmlwaGVyYWwgQ29udHJvbGxlcgorCSAgZHJpdmVyIHRocm91Z2ggdGhlIGFic3RyYWN0ICJnYWRnZXQiIEFQSS4gIFNvbWUgb3RoZXIgb3BlcmF0aW5nCisJICBzeXN0ZW1zIGNhbGwgdGhlc2UgImNsaWVudCIgZHJpdmVycywgb2Ygd2hpY2ggImNsYXNzIGRyaXZlcnMiCisJICBhcmUgYSBzdWJzZXQgKGltcGxlbWVudGluZyBhIFVTQiBkZXZpY2UgY2xhc3Mgc3BlY2lmaWNhdGlvbikuCisJICBBIGdhZGdldCBkcml2ZXIgaW1wbGVtZW50cyBvbmUgb3IgbW9yZSBVU0IgZnVuY3Rpb25zIHVzaW5nCisJICB0aGUgcGVyaXBoZXJhbCBoYXJkd2FyZS4KKworCSAgR2FkZ2V0IGRyaXZlcnMgYXJlIGhhcmR3YXJlLW5ldXRyYWwsIG9yICJwbGF0Zm9ybSBpbmRlcGVuZGVudCIsCisJICBleGNlcHQgdGhhdCB0aGV5IHNvbWV0aW1lcyBtdXN0IHVuZGVyc3RhbmQgcXVpcmtzIG9yIGxpbWl0YXRpb25zCisJICBvZiB0aGUgcGFydGljdWxhciBjb250cm9sbGVycyB0aGV5IHdvcmsgd2l0aC4gIEZvciBleGFtcGxlLCB3aGVuCisJICBhIGNvbnRyb2xsZXIgZG9lc24ndCBzdXBwb3J0IGFsdGVybmF0ZSBjb25maWd1cmF0aW9ucyBvciBwcm92aWRlCisJICBlbm91Z2ggb2YgdGhlIHJpZ2h0IHR5cGVzIG9mIGVuZHBvaW50cywgdGhlIGdhZGdldCBkcml2ZXIgbWlnaHQKKwkgIG5vdCBiZSBhYmxlIHdvcmsgd2l0aCB0aGF0IGNvbnRyb2xsZXIsIG9yIG1pZ2h0IG5lZWQgdG8gaW1wbGVtZW50CisJICBhIGxlc3MgY29tbW9uIHZhcmlhbnQgb2YgYSBkZXZpY2UgY2xhc3MgcHJvdG9jb2wuCisKIHNvdXJjZSAiZHJpdmVycy91c2IvZ2FkZ2V0L2xlZ2FjeS9LY29uZmlnIgogCiBlbmRjaG9pY2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9jb21wb3NpdGUuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9jb21wb3NpdGUuYwppbmRleCBlYjY0ODQ4Li4zMjE3NmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvY29tcG9zaXRlLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2NvbXBvc2l0ZS5jCkBAIC0xODkzLDE3ICsxODkzLDIxIEBACiAJCS8qIGZ1bmN0aW9ucyBhbHdheXMgaGFuZGxlIHRoZWlyIGludGVyZmFjZXMgYW5kIGVuZHBvaW50cy4uLgogCQkgKiBwdW50IG90aGVyIHJlY2lwaWVudHMgKG90aGVyLCBXVVNCLCAuLi4pIHRvIHRoZSBjdXJyZW50CiAJCSAqIGNvbmZpZ3VyYXRpb24gY29kZS4KLQkJICoKLQkJICogUkVWSVNJVCBpdCBjb3VsZCBtYWtlIHNlbnNlIHRvIGxldCB0aGUgY29tcG9zaXRlIGRldmljZQotCQkgKiB0YWtlIHN1Y2ggcmVxdWVzdHMgdG9vLCBpZiB0aGF0J3MgZXZlciBuZWVkZWQ6ICB0byB3b3JrCi0JCSAqIGluIGNvbmZpZyAwLCBldGMuCiAJCSAqLwogCQlpZiAoY2Rldi0+Y29uZmlnKSB7CiAJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGYsICZjZGV2LT5jb25maWctPmZ1bmN0aW9ucywgbGlzdCkKLQkJCQlpZiAoZi0+cmVxX21hdGNoICYmIGYtPnJlcV9tYXRjaChmLCBjdHJsKSkKKwkJCQlpZiAoZi0+cmVxX21hdGNoICYmCisJCQkJICAgIGYtPnJlcV9tYXRjaChmLCBjdHJsLCBmYWxzZSkpCiAJCQkJCWdvdG8gdHJ5X2Z1bl9zZXR1cDsKLQkJCWYgPSBOVUxMOworCQl9IGVsc2UgeworCQkJc3RydWN0IHVzYl9jb25maWd1cmF0aW9uICpjOworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmY2Rldi0+Y29uZmlncywgbGlzdCkKKwkJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGYsICZjLT5mdW5jdGlvbnMsIGxpc3QpCisJCQkJCWlmIChmLT5yZXFfbWF0Y2ggJiYKKwkJCQkJICAgIGYtPnJlcV9tYXRjaChmLCBjdHJsLCB0cnVlKSkKKwkJCQkJCWdvdG8gdHJ5X2Z1bl9zZXR1cDsKIAkJfQorCQlmID0gTlVMTDsKIAogCQlzd2l0Y2ggKGN0cmwtPmJSZXF1ZXN0VHlwZSAmIFVTQl9SRUNJUF9NQVNLKSB7CiAJCWNhc2UgVVNCX1JFQ0lQX0lOVEVSRkFDRToKQEAgLTE5MTMsNiArMTkxNyw4IEBACiAJCQlicmVhazsKIAogCQljYXNlIFVTQl9SRUNJUF9FTkRQT0lOVDoKKwkJCWlmICghY2Rldi0+Y29uZmlnKQorCQkJCWJyZWFrOwogCQkJZW5kcCA9ICgod19pbmRleCAmIDB4ODApID4+IDMpIHwgKHdfaW5kZXggJiAweDBmKTsKIAkJCWxpc3RfZm9yX2VhY2hfZW50cnkoZiwgJmNkZXYtPmNvbmZpZy0+ZnVuY3Rpb25zLCBsaXN0KSB7CiAJCQkJaWYgKHRlc3RfYml0KGVuZHAsIGYtPmVuZHBvaW50cykpCkBAIC0yMTI0LDE0ICsyMTMwLDE0IEBACiAKIAljZGV2LT5vc19kZXNjX3JlcSA9IHVzYl9lcF9hbGxvY19yZXF1ZXN0KGVwMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjZGV2LT5vc19kZXNjX3JlcSkgewotCQlyZXQgPSBQVFJfRVJSKGNkZXYtPm9zX2Rlc2NfcmVxKTsKKwkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlbmQ7CiAJfQogCiAJLyogT1MgZmVhdHVyZSBkZXNjcmlwdG9yIGxlbmd0aCA8PSA0a0IgKi8KIAljZGV2LT5vc19kZXNjX3JlcS0+YnVmID0ga21hbGxvYyg0MDk2LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNkZXYtPm9zX2Rlc2NfcmVxLT5idWYpIHsKLQkJcmV0ID0gUFRSX0VSUihjZGV2LT5vc19kZXNjX3JlcS0+YnVmKTsKKwkJcmV0ID0gLUVOT01FTTsKIAkJa2ZyZWUoY2Rldi0+b3NfZGVzY19yZXEpOwogCQlnb3RvIGVuZDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvY29uZmlnZnMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9jb25maWdmcy5jCmluZGV4IDcwY2YzNDcuLjM5ODQ3ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9jb25maWdmcy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9jb25maWdmcy5jCkBAIC0xMjExLDggKzEyMTEsOSBAQAogCiAJCQlsaXN0X21vdmVfdGFpbCgmZi0+bGlzdCwgJmNmZy0+ZnVuY19saXN0KTsKIAkJCWlmIChmLT51bmJpbmQpIHsKLQkJCQlkZXZfZXJyKCZnaS0+Y2Rldi5nYWRnZXQtPmRldiwgInVuYmluZCBmdW5jdGlvbiIKLQkJCQkJCSIgJyVzJy8lcFxuIiwgZi0+bmFtZSwgZik7CisJCQkJZGV2X2RiZygmZ2ktPmNkZXYuZ2FkZ2V0LT5kZXYsCisJCQkJICAgICAgICAgInVuYmluZCBmdW5jdGlvbiAnJXMnLyVwXG4iLAorCQkJCSAgICAgICAgIGYtPm5hbWUsIGYpOwogCQkJCWYtPnVuYmluZChjLCBmKTsKIAkJCX0KIAkJfQpAQCAtMTQ5MCw3ICsxNDkxLDkgQEAKIHsKIAlzdHJ1Y3QgZ2FkZ2V0X2luZm8gKmdpID0gdG9fZ2FkZ2V0X2luZm8oaXRlbSk7CiAKKwltdXRleF9sb2NrKCZnaS0+bG9jayk7CiAJdW5yZWdpc3Rlcl9nYWRnZXQoZ2kpOworCW11dGV4X3VubG9jaygmZ2ktPmxvY2spOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodW5yZWdpc3Rlcl9nYWRnZXRfaXRlbSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2VlbS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfZWVtLmMKaW5kZXggZDU4YmZjMy4uMDA3ZWM2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfZWVtLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfZWVtLmMKQEAgLTM0MSwxMSArMzQxLDE1IEBACiB7CiAJc3RydWN0IHNrX2J1ZmYJKnNrYjIgPSBOVUxMOwogCXN0cnVjdCB1c2JfZXAJKmluID0gcG9ydC0+aW5fZXA7Ci0JaW50CQlwYWRsZW4gPSAwOwotCXUxNgkJbGVuID0gc2tiLT5sZW47CisJaW50CQloZWFkcm9vbSwgdGFpbHJvb20sIHBhZGxlbiA9IDA7CisJdTE2CQlsZW47CiAKLQlpbnQgaGVhZHJvb20gPSBza2JfaGVhZHJvb20oc2tiKTsKLQlpbnQgdGFpbHJvb20gPSBza2JfdGFpbHJvb20oc2tiKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwlsZW4gPSBza2ItPmxlbjsKKwloZWFkcm9vbSA9IHNrYl9oZWFkcm9vbShza2IpOworCXRhaWxyb29tID0gc2tiX3RhaWxyb29tKHNrYik7CiAKIAkvKiBXaGVuIChsZW4gKyBFRU1fSExFTiArIEVUSF9GQ1NfTEVOKSAlIGluLT5tYXhwYWNrZXQpIGlzIDAsCiAJICogc3RpY2sgdHdvIGJ5dGVzIG9mIHplcm8tbGVuZ3RoIEVFTSBwYWNrZXQgb24gdGhlIGVuZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2ZzLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9mcy5jCmluZGV4IDVjODQyOWYuLjBhZWVkODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2ZzLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfZnMuYwpAQCAtOTgsNiArOTgsOSBAQAogc3RhdGljIHZvaWQgZmZzX2Z1bmNfZGlzYWJsZShzdHJ1Y3QgdXNiX2Z1bmN0aW9uICopOwogc3RhdGljIGludCBmZnNfZnVuY19zZXR1cChzdHJ1Y3QgdXNiX2Z1bmN0aW9uICosCiAJCQkgIGNvbnN0IHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKik7CitzdGF0aWMgYm9vbCBmZnNfZnVuY19yZXFfbWF0Y2goc3RydWN0IHVzYl9mdW5jdGlvbiAqLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKiwKKwkJCSAgICAgICBib29sIGNvbmZpZzApOwogc3RhdGljIHZvaWQgZmZzX2Z1bmNfc3VzcGVuZChzdHJ1Y3QgdXNiX2Z1bmN0aW9uICopOwogc3RhdGljIHZvaWQgZmZzX2Z1bmNfcmVzdW1lKHN0cnVjdCB1c2JfZnVuY3Rpb24gKik7CiAKQEAgLTIyNDMsNyArMjI0Niw5IEBACiAJCQkgICAgICBGVU5DVElPTkZTX0hBU19TU19ERVNDIHwKIAkJCSAgICAgIEZVTkNUSU9ORlNfSEFTX01TX09TX0RFU0MgfAogCQkJICAgICAgRlVOQ1RJT05GU19WSVJUVUFMX0FERFIgfAotCQkJICAgICAgRlVOQ1RJT05GU19FVkVOVEZEKSkgeworCQkJICAgICAgRlVOQ1RJT05GU19FVkVOVEZEIHwKKwkJCSAgICAgIEZVTkNUSU9ORlNfQUxMX0NUUkxfUkVDSVAgfAorCQkJICAgICAgRlVOQ1RJT05GU19DT05GSUcwX1NFVFVQKSkgewogCQkJcmV0ID0gLUVOT1NZUzsKIAkJCWdvdG8gZXJyb3I7CiAJCX0KQEAgLTMwOTQsOCArMzA5OSw5IEBACiAJICogaGFuZGxlIHRoZW0uICBBbGwgb3RoZXIgZWl0aGVyIGhhbmRsZWQgYnkgY29tcG9zaXRlIG9yCiAJICogcGFzc2VkIHRvIHVzYl9jb25maWd1cmF0aW9uLT5zZXR1cCgpIChpZiBvbmUgaXMgc2V0KS4gIE5vCiAJICogbWF0dGVyLCB3ZSB3aWxsIGhhbmRsZSByZXF1ZXN0cyBkaXJlY3RlZCB0byBlbmRwb2ludCBoZXJlCi0JICogYXMgd2VsbCAoYXMgaXQncyBzdHJhaWdodGZvcndhcmQpIGJ1dCB3aGF0IHRvIGRvIHdpdGggYW55Ci0JICogb3RoZXIgcmVxdWVzdD8KKwkgKiBhcyB3ZWxsIChhcyBpdCdzIHN0cmFpZ2h0Zm9yd2FyZCkuICBPdGhlciByZXF1ZXN0IHJlY2lwaWVudAorCSAqIHR5cGVzIGFyZSBvbmx5IGhhbmRsZWQgd2hlbiB0aGUgdXNlciBmbGFnIEZVTkNUSU9ORlNfQUxMX0NUUkxfUkVDSVAKKwkgKiBpcyBiZWluZyB1c2VkLgogCSAqLwogCWlmIChmZnMtPnN0YXRlICE9IEZGU19BQ1RJVkUpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMzExNiw3ICszMTIyLDEwIEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQlpZiAoZnVuYy0+ZmZzLT51c2VyX2ZsYWdzICYgRlVOQ1RJT05GU19BTExfQ1RSTF9SRUNJUCkKKwkJCXJldCA9IGxlMTZfdG9fY3B1KGNyZXEtPndJbmRleCk7CisJCWVsc2UKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZmZzLT5ldi53YWl0cS5sb2NrLCBmbGFncyk7CkBAIC0zMTI4LDYgKzMxMzcsMjggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGJvb2wgZmZzX2Z1bmNfcmVxX21hdGNoKHN0cnVjdCB1c2JfZnVuY3Rpb24gKmYsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3JlcSwKKwkJCSAgICAgICBib29sIGNvbmZpZzApCit7CisJc3RydWN0IGZmc19mdW5jdGlvbiAqZnVuYyA9IGZmc19mdW5jX2Zyb21fdXNiKGYpOworCisJaWYgKGNvbmZpZzAgJiYgIShmdW5jLT5mZnMtPnVzZXJfZmxhZ3MgJiBGVU5DVElPTkZTX0NPTkZJRzBfU0VUVVApKQorCQlyZXR1cm4gZmFsc2U7CisKKwlzd2l0Y2ggKGNyZXEtPmJSZXF1ZXN0VHlwZSAmIFVTQl9SRUNJUF9NQVNLKSB7CisJY2FzZSBVU0JfUkVDSVBfSU5URVJGQUNFOgorCQlyZXR1cm4gZmZzX2Z1bmNfcmV2bWFwX2ludGYoZnVuYywKKwkJCQkJICAgIGxlMTZfdG9fY3B1KGNyZXEtPndJbmRleCkgPj0gMCk7CisJY2FzZSBVU0JfUkVDSVBfRU5EUE9JTlQ6CisJCXJldHVybiBmZnNfZnVuY19yZXZtYXBfZXAoZnVuYywKKwkJCQkJICBsZTE2X3RvX2NwdShjcmVxLT53SW5kZXgpID49IDApOworCWRlZmF1bHQ6CisJCXJldHVybiAoYm9vbCkgKGZ1bmMtPmZmcy0+dXNlcl9mbGFncyAmCisJCQkgICAgICAgRlVOQ1RJT05GU19BTExfQ1RSTF9SRUNJUCk7CisJfQorfQorCiBzdGF0aWMgdm9pZCBmZnNfZnVuY19zdXNwZW5kKHN0cnVjdCB1c2JfZnVuY3Rpb24gKmYpCiB7CiAJRU5URVIoKTsKQEAgLTMzNzgsNiArMzQwOSw3IEBACiAJZnVuYy0+ZnVuY3Rpb24uc2V0X2FsdCA9IGZmc19mdW5jX3NldF9hbHQ7CiAJZnVuYy0+ZnVuY3Rpb24uZGlzYWJsZSA9IGZmc19mdW5jX2Rpc2FibGU7CiAJZnVuYy0+ZnVuY3Rpb24uc2V0dXAgICA9IGZmc19mdW5jX3NldHVwOworCWZ1bmMtPmZ1bmN0aW9uLnJlcV9tYXRjaCA9IGZmc19mdW5jX3JlcV9tYXRjaDsKIAlmdW5jLT5mdW5jdGlvbi5zdXNwZW5kID0gZmZzX2Z1bmNfc3VzcGVuZDsKIAlmdW5jLT5mdW5jdGlvbi5yZXN1bWUgID0gZmZzX2Z1bmNfcmVzdW1lOwogCWZ1bmMtPmZ1bmN0aW9uLmZyZWVfZnVuYyA9IGZmc19mcmVlOwpAQCAtMzQ3MCw2ICszNTAyLDExIEBACiAJbGlzdF9kZWwoJmRldi0+ZW50cnkpOwogCWlmIChkZXYtPm5hbWVfYWxsb2NhdGVkKQogCQlrZnJlZShkZXYtPm5hbWUpOworCisJLyogQ2xlYXIgdGhlIHByaXZhdGVfZGF0YSBwb2ludGVyIHRvIHN0b3AgaW5jb3JyZWN0IGRldiBhY2Nlc3MgKi8KKwlpZiAoZGV2LT5mZnNfZGF0YSkKKwkJZGV2LT5mZnNfZGF0YS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwogCWtmcmVlKGRldik7CiAJaWYgKGxpc3RfZW1wdHkoJmZmc19kZXZpY2VzKSkKIAkJZnVuY3Rpb25mc19jbGVhbnVwKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9oaWQuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2hpZC5jCmluZGV4IDUxOTgwYzUuLmUyOTY2ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2hpZC5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2hpZC5jCkBAIC0zNjUsNyArMzY1LDcgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHVzYl9yZXF1ZXN0ICpoaWRnX2FsbG9jX2VwX3JlcShzdHJ1Y3QgdXNiX2VwICplcCwKIAkJCQkJCSAgICB1bnNpZ25lZCBsZW5ndGgpCiB7Ci0JcmV0dXJuIGFsbG9jX2VwX3JlcShlcCwgbGVuZ3RoLCBsZW5ndGgpOworCXJldHVybiBhbGxvY19lcF9yZXEoZXAsIGxlbmd0aCk7CiB9CiAKIHN0YXRpYyB2b2lkIGhpZGdfc2V0X3JlcG9ydF9jb21wbGV0ZShzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpCkBAIC02MTcsMTQgKzYxNywxMCBAQAogCiAJLyogcHJlYWxsb2NhdGUgcmVxdWVzdCBhbmQgYnVmZmVyICovCiAJc3RhdHVzID0gLUVOT01FTTsKLQloaWRnLT5yZXEgPSB1c2JfZXBfYWxsb2NfcmVxdWVzdChoaWRnLT5pbl9lcCwgR0ZQX0tFUk5FTCk7CisJaGlkZy0+cmVxID0gYWxsb2NfZXBfcmVxKGhpZGctPmluX2VwLCBoaWRnLT5yZXBvcnRfbGVuZ3RoKTsKIAlpZiAoIWhpZGctPnJlcSkKIAkJZ290byBmYWlsOwogCi0JaGlkZy0+cmVxLT5idWYgPSBrbWFsbG9jKGhpZGctPnJlcG9ydF9sZW5ndGgsIEdGUF9LRVJORUwpOwotCWlmICghaGlkZy0+cmVxLT5idWYpCi0JCWdvdG8gZmFpbDsKLQogCS8qIHNldCBkZXNjcmlwdG9yIGR5bmFtaWMgdmFsdWVzICovCiAJaGlkZ19pbnRlcmZhY2VfZGVzYy5iSW50ZXJmYWNlU3ViQ2xhc3MgPSBoaWRnLT5iSW50ZXJmYWNlU3ViQ2xhc3M7CiAJaGlkZ19pbnRlcmZhY2VfZGVzYy5iSW50ZXJmYWNlUHJvdG9jb2wgPSBoaWRnLT5iSW50ZXJmYWNlUHJvdG9jb2w7CkBAIC02NzcsMTEgKzY3Myw4IEBACiAJdXNiX2ZyZWVfYWxsX2Rlc2NyaXB0b3JzKGYpOwogZmFpbDoKIAlFUlJPUihmLT5jb25maWctPmNkZXYsICJoaWRnX2JpbmQgRkFJTEVEXG4iKTsKLQlpZiAoaGlkZy0+cmVxICE9IE5VTEwpIHsKLQkJa2ZyZWUoaGlkZy0+cmVxLT5idWYpOwotCQlpZiAoaGlkZy0+aW5fZXAgIT0gTlVMTCkKLQkJCXVzYl9lcF9mcmVlX3JlcXVlc3QoaGlkZy0+aW5fZXAsIGhpZGctPnJlcSk7Ci0JfQorCWlmIChoaWRnLT5yZXEgIT0gTlVMTCkKKwkJZnJlZV9lcF9yZXEoaGlkZy0+aW5fZXAsIGhpZGctPnJlcSk7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtODA5LDExICs4MDIsMjEgQEAKIAogQ09ORklHRlNfQVRUUihmX2hpZF9vcHRzXywgcmVwb3J0X2Rlc2MpOwogCitzdGF0aWMgc3NpemVfdCBmX2hpZF9vcHRzX2Rldl9zaG93KHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSwgY2hhciAqcGFnZSkKK3sKKwlzdHJ1Y3QgZl9oaWRfb3B0cyAqb3B0cyA9IHRvX2ZfaGlkX29wdHMoaXRlbSk7CisKKwlyZXR1cm4gc3ByaW50ZihwYWdlLCAiJWQ6JWRcbiIsIG1ham9yLCBvcHRzLT5taW5vcik7Cit9CisKK0NPTkZJR0ZTX0FUVFJfUk8oZl9oaWRfb3B0c18sIGRldik7CisKIHN0YXRpYyBzdHJ1Y3QgY29uZmlnZnNfYXR0cmlidXRlICpoaWRfYXR0cnNbXSA9IHsKIAkmZl9oaWRfb3B0c19hdHRyX3N1YmNsYXNzLAogCSZmX2hpZF9vcHRzX2F0dHJfcHJvdG9jb2wsCiAJJmZfaGlkX29wdHNfYXR0cl9yZXBvcnRfbGVuZ3RoLAogCSZmX2hpZF9vcHRzX2F0dHJfcmVwb3J0X2Rlc2MsCisJJmZfaGlkX29wdHNfYXR0cl9kZXYsCiAJTlVMTCwKIH07CiAKQEAgLTkxMCw4ICs5MTMsNyBAQAogCiAJLyogZGlzYWJsZS9mcmVlIHJlcXVlc3QgYW5kIGVuZCBwb2ludCAqLwogCXVzYl9lcF9kaXNhYmxlKGhpZGctPmluX2VwKTsKLQlrZnJlZShoaWRnLT5yZXEtPmJ1Zik7Ci0JdXNiX2VwX2ZyZWVfcmVxdWVzdChoaWRnLT5pbl9lcCwgaGlkZy0+cmVxKTsKKwlmcmVlX2VwX3JlcShoaWRnLT5pbl9lcCwgaGlkZy0+cmVxKTsKIAogCXVzYl9mcmVlX2FsbF9kZXNjcmlwdG9ycyhmKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2xvb3BiYWNrLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9sb29wYmFjay5jCmluZGV4IDNhOWY4ZjkuLmU3MDA5MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2xvb3BiYWNrLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfbG9vcGJhY2suYwpAQCAtMzA4LDkgKzMwOCw3IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHVzYl9yZXF1ZXN0ICpsYl9hbGxvY19lcF9yZXEoc3RydWN0IHVzYl9lcCAqZXAsIGludCBsZW4pCiB7Ci0Jc3RydWN0IGZfbG9vcGJhY2sJKmxvb3AgPSBlcC0+ZHJpdmVyX2RhdGE7Ci0KLQlyZXR1cm4gYWxsb2NfZXBfcmVxKGVwLCBsZW4sIGxvb3AtPmJ1Zmxlbik7CisJcmV0dXJuIGFsbG9jX2VwX3JlcShlcCwgbGVuKTsKIH0KIAogc3RhdGljIGludCBhbGxvY19yZXF1ZXN0cyhzdHJ1Y3QgdXNiX2NvbXBvc2l0ZV9kZXYgKmNkZXYsCkBAIC0zMzMsNyArMzMxLDcgQEAKIAkJaWYgKCFpbl9yZXEpCiAJCQlnb3RvIGZhaWw7CiAKLQkJb3V0X3JlcSA9IGxiX2FsbG9jX2VwX3JlcShsb29wLT5vdXRfZXAsIDApOworCQlvdXRfcmVxID0gbGJfYWxsb2NfZXBfcmVxKGxvb3AtPm91dF9lcCwgbG9vcC0+YnVmbGVuKTsKIAkJaWYgKCFvdXRfcmVxKQogCQkJZ290byBmYWlsX2luOwogCkBAIC01OTMsMTMgKzU5MSw5IEBACiAKIGludCBfX2luaXQgbGJfbW9kaW5pdCh2b2lkKQogewotCWludCByZXQ7Ci0KLQlyZXQgPSB1c2JfZnVuY3Rpb25fcmVnaXN0ZXIoJkxvb3BiYWNrdXNiX2Z1bmMpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gdXNiX2Z1bmN0aW9uX3JlZ2lzdGVyKCZMb29wYmFja3VzYl9mdW5jKTsKIH0KKwogdm9pZCBfX2V4aXQgbGJfbW9kZXhpdCh2b2lkKQogewogCXVzYl9mdW5jdGlvbl91bnJlZ2lzdGVyKCZMb29wYmFja3VzYl9mdW5jKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX21hc3Nfc3RvcmFnZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfbWFzc19zdG9yYWdlLmMKaW5kZXggMjUwNTExNy4uOGYzNjU5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfbWFzc19zdG9yYWdlLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfbWFzc19zdG9yYWdlLmMKQEAgLTMxMSwxMSArMzExLDcgQEAKIAkvKiBHYWRnZXQncyBwcml2YXRlIGRhdGEuICovCiAJdm9pZAkJCSpwcml2YXRlX2RhdGE7CiAKLQkvKgotCSAqIFZlbmRvciAoOCBjaGFycyksIHByb2R1Y3QgKDE2IGNoYXJzKSwgcmVsZWFzZSAoNAotCSAqIGhleGFkZWNpbWFsIGRpZ2l0cykgYW5kIE5VTCBieXRlCi0JICovCi0JY2hhciBpbnF1aXJ5X3N0cmluZ1s4ICsgMTYgKyA0ICsgMV07CisJY2hhciBpbnF1aXJ5X3N0cmluZ1tJTlFVSVJZX1NUUklOR19MRU5dOwogCiAJc3RydWN0IGtyZWYJCXJlZjsKIH07CkBAIC0xMTA3LDcgKzExMDMsMTIgQEAKIAlidWZbNV0gPSAwOwkJLyogTm8gc3BlY2lhbCBvcHRpb25zICovCiAJYnVmWzZdID0gMDsKIAlidWZbN10gPSAwOwotCW1lbWNweShidWYgKyA4LCBjb21tb24tPmlucXVpcnlfc3RyaW5nLCBzaXplb2YgY29tbW9uLT5pbnF1aXJ5X3N0cmluZyk7CisJaWYgKGN1cmx1bi0+aW5xdWlyeV9zdHJpbmdbMF0pCisJCW1lbWNweShidWYgKyA4LCBjdXJsdW4tPmlucXVpcnlfc3RyaW5nLAorCQkgICAgICAgc2l6ZW9mKGN1cmx1bi0+aW5xdWlyeV9zdHJpbmcpKTsKKwllbHNlCisJCW1lbWNweShidWYgKyA4LCBjb21tb24tPmlucXVpcnlfc3RyaW5nLAorCQkgICAgICAgc2l6ZW9mKGNvbW1vbi0+aW5xdWlyeV9zdHJpbmcpKTsKIAlyZXR1cm4gMzY7CiB9CiAKQEAgLTMyMDksMTIgKzMyMTAsMjcgQEAKIAogQ09ORklHRlNfQVRUUihmc2dfbHVuX29wdHNfLCBub2Z1YSk7CiAKK3N0YXRpYyBzc2l6ZV90IGZzZ19sdW5fb3B0c19pbnF1aXJ5X3N0cmluZ19zaG93KHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSwKKwkJCQkJCWNoYXIgKnBhZ2UpCit7CisJcmV0dXJuIGZzZ19zaG93X2lucXVpcnlfc3RyaW5nKHRvX2ZzZ19sdW5fb3B0cyhpdGVtKS0+bHVuLCBwYWdlKTsKK30KKworc3RhdGljIHNzaXplX3QgZnNnX2x1bl9vcHRzX2lucXVpcnlfc3RyaW5nX3N0b3JlKHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSwKKwkJCQkJCSBjb25zdCBjaGFyICpwYWdlLCBzaXplX3QgbGVuKQoreworCXJldHVybiBmc2dfc3RvcmVfaW5xdWlyeV9zdHJpbmcodG9fZnNnX2x1bl9vcHRzKGl0ZW0pLT5sdW4sIHBhZ2UsIGxlbik7Cit9CisKK0NPTkZJR0ZTX0FUVFIoZnNnX2x1bl9vcHRzXywgaW5xdWlyeV9zdHJpbmcpOworCiBzdGF0aWMgc3RydWN0IGNvbmZpZ2ZzX2F0dHJpYnV0ZSAqZnNnX2x1bl9hdHRyc1tdID0gewogCSZmc2dfbHVuX29wdHNfYXR0cl9maWxlLAogCSZmc2dfbHVuX29wdHNfYXR0cl9ybywKIAkmZnNnX2x1bl9vcHRzX2F0dHJfcmVtb3ZhYmxlLAogCSZmc2dfbHVuX29wdHNfYXR0cl9jZHJvbSwKIAkmZnNnX2x1bl9vcHRzX2F0dHJfbm9mdWEsCisJJmZzZ19sdW5fb3B0c19hdHRyX2lucXVpcnlfc3RyaW5nLAogCU5VTEwsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9tYXNzX3N0b3JhZ2UuaCBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX21hc3Nfc3RvcmFnZS5oCmluZGV4IGI2YTk5MThlYS4uZDM5MDIzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfbWFzc19zdG9yYWdlLmgKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfbWFzc19zdG9yYWdlLmgKQEAgLTEwMCw2ICsxMDAsNyBAQAogCWNoYXIgcmVtb3ZhYmxlOwogCWNoYXIgY2Ryb207CiAJY2hhciBub2Z1YTsKKwljaGFyIGlucXVpcnlfc3RyaW5nW0lOUVVJUllfU1RSSU5HX0xFTl07CiB9OwogCiBzdHJ1Y3QgZnNnX2NvbmZpZyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9taWRpLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9taWRpLmMKaW5kZXggNThmYzE5OS4uYTU3MTlmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfbWlkaS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX21pZGkuYwpAQCAtNTEsNiArNTEsMTkgQEAKICAqLwogI2RlZmluZSBNQVhfUE9SVFMgMTYKIAorLyogTUlESSBtZXNzYWdlIHN0YXRlcyAqLworZW51bSB7CisJU1RBVEVfSU5JVElBTCA9IDAsCS8qIHBzZXVkbyBzdGF0ZSAqLworCVNUQVRFXzFQQVJBTSwKKwlTVEFURV8yUEFSQU1fMSwKKwlTVEFURV8yUEFSQU1fMiwKKwlTVEFURV9TWVNFWF8wLAorCVNUQVRFX1NZU0VYXzEsCisJU1RBVEVfU1lTRVhfMiwKKwlTVEFURV9SRUFMX1RJTUUsCisJU1RBVEVfRklOSVNIRUQsCQkvKiBwc2V1ZG8gc3RhdGUgKi8KK307CisKIC8qCiAgKiBUaGlzIGlzIGEgZ2FkZ2V0LCBhbmQgdGhlIElOL09VVCBuYW1pbmcgaXMgZnJvbSB0aGUgaG9zdCdzIHBlcnNwZWN0aXZlLgogICogVVNCIC0+IE9VVCBlbmRwb2ludCAtPiByYXdtaWRpCkBAIC02MSwxMyArNzQsNiBAQAogCWludCBhY3RpdmU7CiAJdWludDhfdCBjYWJsZTsKIAl1aW50OF90IHN0YXRlOwotI2RlZmluZSBTVEFURV9VTktOT1dOCTAKLSNkZWZpbmUgU1RBVEVfMVBBUkFNCTEKLSNkZWZpbmUgU1RBVEVfMlBBUkFNXzEJMgotI2RlZmluZSBTVEFURV8yUEFSQU1fMgkzCi0jZGVmaW5lIFNUQVRFX1NZU0VYXzAJNAotI2RlZmluZSBTVEFURV9TWVNFWF8xCTUKLSNkZWZpbmUgU1RBVEVfU1lTRVhfMgk2CiAJdWludDhfdCBkYXRhWzJdOwogfTsKIApAQCAtMjA1LDcgKzIxMSw3IEBACiBzdGF0aWMgaW5saW5lIHN0cnVjdCB1c2JfcmVxdWVzdCAqbWlkaV9hbGxvY19lcF9yZXEoc3RydWN0IHVzYl9lcCAqZXAsCiAJCQkJCQkgICAgdW5zaWduZWQgbGVuZ3RoKQogewotCXJldHVybiBhbGxvY19lcF9yZXEoZXAsIGxlbmd0aCwgbGVuZ3RoKTsKKwlyZXR1cm4gYWxsb2NfZXBfcmVxKGVwLCBsZW5ndGgpOwogfQogCiBzdGF0aWMgY29uc3QgdWludDhfdCBmX21pZGlfY2luX2xlbmd0aFtdID0gewpAQCAtMjk5LDYgKzMwNSwxOSBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgZl9taWRpX2Ryb3Bfb3V0X3N1YnN0cmVhbXMoc3RydWN0IGZfbWlkaSAqbWlkaSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBtaWRpLT5pbl9wb3J0czsgaSsrKSB7CisJCXN0cnVjdCBnbWlkaV9pbl9wb3J0ICpwb3J0ID0gbWlkaS0+aW5fcG9ydHNfYXJyYXkgKyBpOworCQlzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBwb3J0LT5zdWJzdHJlYW07CisKKwkJaWYgKHBvcnQtPmFjdGl2ZSAmJiBzdWJzdHJlYW0pCisJCQlzbmRfcmF3bWlkaV9kcm9wX291dHB1dChzdWJzdHJlYW0pOworCX0KK30KKwogc3RhdGljIGludCBmX21pZGlfc3RhcnRfZXAoc3RydWN0IGZfbWlkaSAqbWlkaSwKIAkJCSAgIHN0cnVjdCB1c2JfZnVuY3Rpb24gKmYsCiAJCQkgICBzdHJ1Y3QgdXNiX2VwICplcCkKQEAgLTM2MCw5ICszNzksOCBAQAogCS8qIGFsbG9jYXRlIGEgYnVuY2ggb2YgcmVhZCBidWZmZXJzIGFuZCBxdWV1ZSB0aGVtIGFsbCBhdCBvbmNlLiAqLwogCWZvciAoaSA9IDA7IGkgPCBtaWRpLT5xbGVuICYmIGVyciA9PSAwOyBpKyspIHsKIAkJc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEgPQotCQkJbWlkaV9hbGxvY19lcF9yZXEobWlkaS0+b3V0X2VwLAotCQkJCW1heF90KHVuc2lnbmVkLCBtaWRpLT5idWZsZW4sCi0JCQkJCWJ1bGtfb3V0X2Rlc2Mud01heFBhY2tldFNpemUpKTsKKwkJCW1pZGlfYWxsb2NfZXBfcmVxKG1pZGktPm91dF9lcCwgbWlkaS0+YnVmbGVuKTsKKwogCQlpZiAocmVxID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMzk3LDYgKzQxNSw4IEBACiAJLyogcmVsZWFzZSBJTiByZXF1ZXN0cyAqLwogCXdoaWxlIChrZmlmb19nZXQoJm1pZGktPmluX3JlcV9maWZvLCAmcmVxKSkKIAkJZnJlZV9lcF9yZXEobWlkaS0+aW5fZXAsIHJlcSk7CisKKwlmX21pZGlfZHJvcF9vdXRfc3Vic3RyZWFtcyhtaWRpKTsKIH0KIAogc3RhdGljIGludCBmX21pZGlfc25kX2ZyZWUoc3RydWN0IHNuZF9kZXZpY2UgKmRldmljZSkKQEAgLTQwNCwxMzAgKzQyNCwxNjYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZl9taWRpX3RyYW5zbWl0X3BhY2tldChzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSwgdWludDhfdCBwMCwKLQkJCQkJdWludDhfdCBwMSwgdWludDhfdCBwMiwgdWludDhfdCBwMykKLXsKLQl1bnNpZ25lZCBsZW5ndGggPSByZXEtPmxlbmd0aDsKLQl1OCAqYnVmID0gKHU4ICopcmVxLT5idWYgKyBsZW5ndGg7Ci0KLQlidWZbMF0gPSBwMDsKLQlidWZbMV0gPSBwMTsKLQlidWZbMl0gPSBwMjsKLQlidWZbM10gPSBwMzsKLQlyZXEtPmxlbmd0aCA9IGxlbmd0aCArIDQ7Ci19Ci0KIC8qCiAgKiBDb252ZXJ0cyBNSURJIGNvbW1hbmRzIHRvIFVTQiBNSURJIHBhY2tldHMuCiAgKi8KIHN0YXRpYyB2b2lkIGZfbWlkaV90cmFuc21pdF9ieXRlKHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxLAogCQkJCSBzdHJ1Y3QgZ21pZGlfaW5fcG9ydCAqcG9ydCwgdWludDhfdCBiKQogewotCXVpbnQ4X3QgcDAgPSBwb3J0LT5jYWJsZSA8PCA0OworCXVpbnQ4X3QgcFs0XSA9IHsgcG9ydC0+Y2FibGUgPDwgNCwgMCwgMCwgMCB9OworCXVpbnQ4X3QgbmV4dF9zdGF0ZSA9IFNUQVRFX0lOSVRJQUw7CiAKLQlpZiAoYiA+PSAweGY4KSB7Ci0JCWZfbWlkaV90cmFuc21pdF9wYWNrZXQocmVxLCBwMCB8IDB4MGYsIGIsIDAsIDApOwotCX0gZWxzZSBpZiAoYiA+PSAweGYwKSB7CisJc3dpdGNoIChiKSB7CisJY2FzZSAweGY4IC4uLiAweGZmOgorCQkvKiBTeXN0ZW0gUmVhbC1UaW1lIE1lc3NhZ2VzICovCisJCXBbMF0gfD0gMHgwZjsKKwkJcFsxXSA9IGI7CisJCW5leHRfc3RhdGUgPSBwb3J0LT5zdGF0ZTsKKwkJcG9ydC0+c3RhdGUgPSBTVEFURV9SRUFMX1RJTUU7CisJCWJyZWFrOworCisJY2FzZSAweGY3OgorCQkvKiBFbmQgb2YgU3lzRXggKi8KKwkJc3dpdGNoIChwb3J0LT5zdGF0ZSkgeworCQljYXNlIFNUQVRFX1NZU0VYXzA6CisJCQlwWzBdIHw9IDB4MDU7CisJCQlwWzFdID0gMHhmNzsKKwkJCW5leHRfc3RhdGUgPSBTVEFURV9GSU5JU0hFRDsKKwkJCWJyZWFrOworCQljYXNlIFNUQVRFX1NZU0VYXzE6CisJCQlwWzBdIHw9IDB4MDY7CisJCQlwWzFdID0gcG9ydC0+ZGF0YVswXTsKKwkJCXBbMl0gPSAweGY3OworCQkJbmV4dF9zdGF0ZSA9IFNUQVRFX0ZJTklTSEVEOworCQkJYnJlYWs7CisJCWNhc2UgU1RBVEVfU1lTRVhfMjoKKwkJCXBbMF0gfD0gMHgwNzsKKwkJCXBbMV0gPSBwb3J0LT5kYXRhWzBdOworCQkJcFsyXSA9IHBvcnQtPmRhdGFbMV07CisJCQlwWzNdID0gMHhmNzsKKwkJCW5leHRfc3RhdGUgPSBTVEFURV9GSU5JU0hFRDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogSWdub3JlIGJ5dGUgKi8KKwkJCW5leHRfc3RhdGUgPSBwb3J0LT5zdGF0ZTsKKwkJCXBvcnQtPnN0YXRlID0gU1RBVEVfSU5JVElBTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgMHhmMCAuLi4gMHhmNjoKKwkJLyogU3lzdGVtIENvbW1vbiBNZXNzYWdlcyAqLworCQlwb3J0LT5kYXRhWzBdID0gcG9ydC0+ZGF0YVsxXSA9IDA7CisJCXBvcnQtPnN0YXRlID0gU1RBVEVfSU5JVElBTDsKIAkJc3dpdGNoIChiKSB7CiAJCWNhc2UgMHhmMDoKIAkJCXBvcnQtPmRhdGFbMF0gPSBiOwotCQkJcG9ydC0+c3RhdGUgPSBTVEFURV9TWVNFWF8xOworCQkJcG9ydC0+ZGF0YVsxXSA9IDA7CisJCQluZXh0X3N0YXRlID0gU1RBVEVfU1lTRVhfMTsKIAkJCWJyZWFrOwogCQljYXNlIDB4ZjE6CiAJCWNhc2UgMHhmMzoKIAkJCXBvcnQtPmRhdGFbMF0gPSBiOwotCQkJcG9ydC0+c3RhdGUgPSBTVEFURV8xUEFSQU07CisJCQluZXh0X3N0YXRlID0gU1RBVEVfMVBBUkFNOwogCQkJYnJlYWs7CiAJCWNhc2UgMHhmMjoKIAkJCXBvcnQtPmRhdGFbMF0gPSBiOwotCQkJcG9ydC0+c3RhdGUgPSBTVEFURV8yUEFSQU1fMTsKKwkJCW5leHRfc3RhdGUgPSBTVEFURV8yUEFSQU1fMTsKIAkJCWJyZWFrOwogCQljYXNlIDB4ZjQ6CiAJCWNhc2UgMHhmNToKLQkJCXBvcnQtPnN0YXRlID0gU1RBVEVfVU5LTk9XTjsKKwkJCW5leHRfc3RhdGUgPSBTVEFURV9JTklUSUFMOwogCQkJYnJlYWs7CiAJCWNhc2UgMHhmNjoKLQkJCWZfbWlkaV90cmFuc21pdF9wYWNrZXQocmVxLCBwMCB8IDB4MDUsIDB4ZjYsIDAsIDApOwotCQkJcG9ydC0+c3RhdGUgPSBTVEFURV9VTktOT1dOOwotCQkJYnJlYWs7Ci0JCWNhc2UgMHhmNzoKLQkJCXN3aXRjaCAocG9ydC0+c3RhdGUpIHsKLQkJCWNhc2UgU1RBVEVfU1lTRVhfMDoKLQkJCQlmX21pZGlfdHJhbnNtaXRfcGFja2V0KHJlcSwKLQkJCQkJcDAgfCAweDA1LCAweGY3LCAwLCAwKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1RBVEVfU1lTRVhfMToKLQkJCQlmX21pZGlfdHJhbnNtaXRfcGFja2V0KHJlcSwKLQkJCQkJcDAgfCAweDA2LCBwb3J0LT5kYXRhWzBdLCAweGY3LCAwKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1RBVEVfU1lTRVhfMjoKLQkJCQlmX21pZGlfdHJhbnNtaXRfcGFja2V0KHJlcSwKLQkJCQkJcDAgfCAweDA3LCBwb3J0LT5kYXRhWzBdLAotCQkJCQlwb3J0LT5kYXRhWzFdLCAweGY3KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXBvcnQtPnN0YXRlID0gU1RBVEVfVU5LTk9XTjsKKwkJCXBbMF0gfD0gMHgwNTsKKwkJCXBbMV0gPSAweGY2OworCQkJbmV4dF9zdGF0ZSA9IFNUQVRFX0ZJTklTSEVEOwogCQkJYnJlYWs7CiAJCX0KLQl9IGVsc2UgaWYgKGIgPj0gMHg4MCkgeworCQlicmVhazsKKworCWNhc2UgMHg4MCAuLi4gMHhlZjoKKwkJLyoKKwkJICogQ2hhbm5lbCBWb2ljZSBNZXNzYWdlcywgQ2hhbm5lbCBNb2RlIE1lc3NhZ2VzCisJCSAqIGFuZCBDb250cm9sIENoYW5nZSBNZXNzYWdlcy4KKwkJICovCiAJCXBvcnQtPmRhdGFbMF0gPSBiOworCQlwb3J0LT5kYXRhWzFdID0gMDsKKwkJcG9ydC0+c3RhdGUgPSBTVEFURV9JTklUSUFMOwogCQlpZiAoYiA+PSAweGMwICYmIGIgPD0gMHhkZikKLQkJCXBvcnQtPnN0YXRlID0gU1RBVEVfMVBBUkFNOworCQkJbmV4dF9zdGF0ZSA9IFNUQVRFXzFQQVJBTTsKIAkJZWxzZQotCQkJcG9ydC0+c3RhdGUgPSBTVEFURV8yUEFSQU1fMTsKLQl9IGVsc2UgeyAvKiBiIDwgMHg4MCAqLworCQkJbmV4dF9zdGF0ZSA9IFNUQVRFXzJQQVJBTV8xOworCQlicmVhazsKKworCWNhc2UgMHgwMCAuLi4gMHg3ZjoKKwkJLyogTWVzc2FnZSBwYXJhbWV0ZXJzICovCiAJCXN3aXRjaCAocG9ydC0+c3RhdGUpIHsKIAkJY2FzZSBTVEFURV8xUEFSQU06Ci0JCQlpZiAocG9ydC0+ZGF0YVswXSA8IDB4ZjApIHsKLQkJCQlwMCB8PSBwb3J0LT5kYXRhWzBdID4+IDQ7Ci0JCQl9IGVsc2UgewotCQkJCXAwIHw9IDB4MDI7Ci0JCQkJcG9ydC0+c3RhdGUgPSBTVEFURV9VTktOT1dOOwotCQkJfQotCQkJZl9taWRpX3RyYW5zbWl0X3BhY2tldChyZXEsIHAwLCBwb3J0LT5kYXRhWzBdLCBiLCAwKTsKKwkJCWlmIChwb3J0LT5kYXRhWzBdIDwgMHhmMCkKKwkJCQlwWzBdIHw9IHBvcnQtPmRhdGFbMF0gPj4gNDsKKwkJCWVsc2UKKwkJCQlwWzBdIHw9IDB4MDI7CisKKwkJCXBbMV0gPSBwb3J0LT5kYXRhWzBdOworCQkJcFsyXSA9IGI7CisJCQkvKiBUaGlzIGlzIHRvIGFsbG93IFJ1bm5pbmcgU3RhdGUgTWVzc2FnZXMgKi8KKwkJCW5leHRfc3RhdGUgPSBTVEFURV8xUEFSQU07CiAJCQlicmVhazsKIAkJY2FzZSBTVEFURV8yUEFSQU1fMToKIAkJCXBvcnQtPmRhdGFbMV0gPSBiOwotCQkJcG9ydC0+c3RhdGUgPSBTVEFURV8yUEFSQU1fMjsKKwkJCW5leHRfc3RhdGUgPSBTVEFURV8yUEFSQU1fMjsKIAkJCWJyZWFrOwogCQljYXNlIFNUQVRFXzJQQVJBTV8yOgotCQkJaWYgKHBvcnQtPmRhdGFbMF0gPCAweGYwKSB7Ci0JCQkJcDAgfD0gcG9ydC0+ZGF0YVswXSA+PiA0OwotCQkJCXBvcnQtPnN0YXRlID0gU1RBVEVfMlBBUkFNXzE7Ci0JCQl9IGVsc2UgewotCQkJCXAwIHw9IDB4MDM7Ci0JCQkJcG9ydC0+c3RhdGUgPSBTVEFURV9VTktOT1dOOwotCQkJfQotCQkJZl9taWRpX3RyYW5zbWl0X3BhY2tldChyZXEsCi0JCQkJcDAsIHBvcnQtPmRhdGFbMF0sIHBvcnQtPmRhdGFbMV0sIGIpOworCQkJaWYgKHBvcnQtPmRhdGFbMF0gPCAweGYwKQorCQkJCXBbMF0gfD0gcG9ydC0+ZGF0YVswXSA+PiA0OworCQkJZWxzZQorCQkJCXBbMF0gfD0gMHgwMzsKKworCQkJcFsxXSA9IHBvcnQtPmRhdGFbMF07CisJCQlwWzJdID0gcG9ydC0+ZGF0YVsxXTsKKwkJCXBbM10gPSBiOworCQkJLyogVGhpcyBpcyB0byBhbGxvdyBSdW5uaW5nIFN0YXRlIE1lc3NhZ2VzICovCisJCQluZXh0X3N0YXRlID0gU1RBVEVfMlBBUkFNXzE7CiAJCQlicmVhazsKIAkJY2FzZSBTVEFURV9TWVNFWF8wOgogCQkJcG9ydC0+ZGF0YVswXSA9IGI7Ci0JCQlwb3J0LT5zdGF0ZSA9IFNUQVRFX1NZU0VYXzE7CisJCQluZXh0X3N0YXRlID0gU1RBVEVfU1lTRVhfMTsKIAkJCWJyZWFrOwogCQljYXNlIFNUQVRFX1NZU0VYXzE6CiAJCQlwb3J0LT5kYXRhWzFdID0gYjsKLQkJCXBvcnQtPnN0YXRlID0gU1RBVEVfU1lTRVhfMjsKKwkJCW5leHRfc3RhdGUgPSBTVEFURV9TWVNFWF8yOwogCQkJYnJlYWs7CiAJCWNhc2UgU1RBVEVfU1lTRVhfMjoKLQkJCWZfbWlkaV90cmFuc21pdF9wYWNrZXQocmVxLAotCQkJCXAwIHwgMHgwNCwgcG9ydC0+ZGF0YVswXSwgcG9ydC0+ZGF0YVsxXSwgYik7Ci0JCQlwb3J0LT5zdGF0ZSA9IFNUQVRFX1NZU0VYXzA7CisJCQlwWzBdIHw9IDB4MDQ7CisJCQlwWzFdID0gcG9ydC0+ZGF0YVswXTsKKwkJCXBbMl0gPSBwb3J0LT5kYXRhWzFdOworCQkJcFszXSA9IGI7CisJCQluZXh0X3N0YXRlID0gU1RBVEVfU1lTRVhfMDsKIAkJCWJyZWFrOwogCQl9CisJCWJyZWFrOwogCX0KLX0KIAotc3RhdGljIHZvaWQgZl9taWRpX2Ryb3Bfb3V0X3N1YnN0cmVhbXMoc3RydWN0IGZfbWlkaSAqbWlkaSkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKKwkvKiBTdGF0ZXMgd2hlcmUgd2UgaGF2ZSB0byB3cml0ZSBpbnRvIHRoZSBVU0IgcmVxdWVzdCAqLworCWlmIChuZXh0X3N0YXRlID09IFNUQVRFX0ZJTklTSEVEIHx8CisJICAgIHBvcnQtPnN0YXRlID09IFNUQVRFX1NZU0VYXzIgfHwKKwkgICAgcG9ydC0+c3RhdGUgPT0gU1RBVEVfMVBBUkFNIHx8CisJICAgIHBvcnQtPnN0YXRlID09IFNUQVRFXzJQQVJBTV8yIHx8CisJICAgIHBvcnQtPnN0YXRlID09IFNUQVRFX1JFQUxfVElNRSkgewogCi0JZm9yIChpID0gMDsgaSA8IG1pZGktPmluX3BvcnRzOyBpKyspIHsKLQkJc3RydWN0IGdtaWRpX2luX3BvcnQgKnBvcnQgPSBtaWRpLT5pbl9wb3J0c19hcnJheSArIGk7Ci0JCXN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IHBvcnQtPnN1YnN0cmVhbTsKLQkJaWYgKHBvcnQtPmFjdGl2ZSAmJiBzdWJzdHJlYW0pCi0JCQlzbmRfcmF3bWlkaV9kcm9wX291dHB1dChzdWJzdHJlYW0pOworCQl1bnNpZ25lZCBpbnQgbGVuZ3RoID0gcmVxLT5sZW5ndGg7CisJCXU4ICpidWYgPSAodTggKilyZXEtPmJ1ZiArIGxlbmd0aDsKKworCQltZW1jcHkoYnVmLCBwLCBzaXplb2YocCkpOworCQlyZXEtPmxlbmd0aCA9IGxlbmd0aCArIHNpemVvZihwKTsKKworCQlpZiAobmV4dF9zdGF0ZSA9PSBTVEFURV9GSU5JU0hFRCkgeworCQkJbmV4dF9zdGF0ZSA9IFNUQVRFX0lOSVRJQUw7CisJCQlwb3J0LT5kYXRhWzBdID0gcG9ydC0+ZGF0YVsxXSA9IDA7CisJCX0KIAl9CisKKwlwb3J0LT5zdGF0ZSA9IG5leHRfc3RhdGU7CiB9CiAKIHN0YXRpYyBpbnQgZl9taWRpX2RvX3RyYW5zbWl0KHN0cnVjdCBmX21pZGkgKm1pZGksIHN0cnVjdCB1c2JfZXAgKmVwKQpAQCAtNjQyLDcgKzY5OCw3IEBACiAJVkRCRyhtaWRpLCAiJXMoKVxuIiwgX19mdW5jX18pOwogCXBvcnQgPSBtaWRpLT5pbl9wb3J0c19hcnJheSArIHN1YnN0cmVhbS0+bnVtYmVyOwogCXBvcnQtPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKLQlwb3J0LT5zdGF0ZSA9IFNUQVRFX1VOS05PV047CisJcG9ydC0+c3RhdGUgPSBTVEFURV9JTklUSUFMOwogCXJldHVybiAwOwogfQogCkBAIC0xMTIzLDcgKzExNzksNyBAQAogCW9wdHMtPmZ1bmNfaW5zdC5mcmVlX2Z1bmNfaW5zdCA9IGZfbWlkaV9mcmVlX2luc3Q7CiAJb3B0cy0+aW5kZXggPSBTTkRSVl9ERUZBVUxUX0lEWDE7CiAJb3B0cy0+aWQgPSBTTkRSVl9ERUZBVUxUX1NUUjE7Ci0Jb3B0cy0+YnVmbGVuID0gMjU2OworCW9wdHMtPmJ1ZmxlbiA9IDUxMjsKIAlvcHRzLT5xbGVuID0gMzI7CiAJb3B0cy0+aW5fcG9ydHMgPSAxOwogCW9wdHMtPm91dF9wb3J0cyA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9uY20uYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX25jbS5jCmluZGV4IDk3ZjBhOWIuLjYzOTYwMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX25jbS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX25jbS5jCkBAIC05MCw3ICs5MCw5IEBACiAvKiBwZWFrICh0aGVvcmV0aWNhbCkgYnVsayB0cmFuc2ZlciByYXRlIGluIGJpdHMtcGVyLXNlY29uZCAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBuY21fYml0cmF0ZShzdHJ1Y3QgdXNiX2dhZGdldCAqZykKIHsKLQlpZiAoZ2FkZ2V0X2lzX2R1YWxzcGVlZChnKSAmJiBnLT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkKKwlpZiAoZ2FkZ2V0X2lzX3N1cGVyc3BlZWQoZykgJiYgZy0+c3BlZWQgPT0gVVNCX1NQRUVEX1NVUEVSKQorCQlyZXR1cm4gMTMgKiAxMDI0ICogOCAqIDEwMDAgKiA4OworCWVsc2UgaWYgKGdhZGdldF9pc19kdWFsc3BlZWQoZykgJiYgZy0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpCiAJCXJldHVybiAxMyAqIDUxMiAqIDggKiAxMDAwICogODsKIAllbHNlCiAJCXJldHVybiAxOSAqICA2NCAqIDEgKiAxMDAwICogODsKQEAgLTMzMyw2ICszMzUsNzYgQEAKIAlOVUxMLAogfTsKIAorCisvKiBzdXBlciBzcGVlZCBzdXBwb3J0OiAqLworCitzdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIHNzX25jbV9ub3RpZnlfZGVzYyA9IHsKKwkuYkxlbmd0aCA9CQlVU0JfRFRfRU5EUE9JTlRfU0laRSwKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0VORFBPSU5ULAorCisJLmJFbmRwb2ludEFkZHJlc3MgPQlVU0JfRElSX0lOLAorCS5ibUF0dHJpYnV0ZXMgPQkJVVNCX0VORFBPSU5UX1hGRVJfSU5ULAorCS53TWF4UGFja2V0U2l6ZSA9CWNwdV90b19sZTE2KE5DTV9TVEFUVVNfQllURUNPVU5UKSwKKwkuYkludGVydmFsID0JCVVTQl9NU19UT19IU19JTlRFUlZBTChOQ01fU1RBVFVTX0lOVEVSVkFMX01TKQorfTsKKworc3RhdGljIHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIHNzX25jbV9ub3RpZnlfY29tcF9kZXNjID0geworCS5iTGVuZ3RoID0JCXNpemVvZihzc19uY21fbm90aWZ5X2NvbXBfZGVzYyksCisJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9TU19FTkRQT0lOVF9DT01QLAorCisJLyogdGhlIGZvbGxvd2luZyAzIHZhbHVlcyBjYW4gYmUgdHdlYWtlZCBpZiBuZWNlc3NhcnkgKi8KKwkvKiAuYk1heEJ1cnN0ID0JCTAsICovCisJLyogLmJtQXR0cmlidXRlcyA9CTAsICovCisJLndCeXRlc1BlckludGVydmFsID0JY3B1X3RvX2xlMTYoTkNNX1NUQVRVU19CWVRFQ09VTlQpLAorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBzc19uY21faW5fZGVzYyA9IHsKKwkuYkxlbmd0aCA9CQlVU0JfRFRfRU5EUE9JTlRfU0laRSwKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0VORFBPSU5ULAorCisJLmJFbmRwb2ludEFkZHJlc3MgPQlVU0JfRElSX0lOLAorCS5ibUF0dHJpYnV0ZXMgPQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKKwkud01heFBhY2tldFNpemUgPQljcHVfdG9fbGUxNigxMDI0KSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Igc3NfbmNtX291dF9kZXNjID0geworCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCisKKwkuYkVuZHBvaW50QWRkcmVzcyA9CVVTQl9ESVJfT1VULAorCS5ibUF0dHJpYnV0ZXMgPQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKKwkud01heFBhY2tldFNpemUgPQljcHVfdG9fbGUxNigxMDI0KSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX3NzX2VwX2NvbXBfZGVzY3JpcHRvciBzc19uY21fYnVsa19jb21wX2Rlc2MgPSB7CisJLmJMZW5ndGggPQkJc2l6ZW9mKHNzX25jbV9idWxrX2NvbXBfZGVzYyksCisJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9TU19FTkRQT0lOVF9DT01QLAorCisJLyogdGhlIGZvbGxvd2luZyAyIHZhbHVlcyBjYW4gYmUgdHdlYWtlZCBpZiBuZWNlc3NhcnkgKi8KKwkvKiAuYk1heEJ1cnN0ID0JCTAsICovCisJLyogLmJtQXR0cmlidXRlcyA9CTAsICovCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqbmNtX3NzX2Z1bmN0aW9uW10gPSB7CisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJm5jbV9pYWRfZGVzYywKKwkvKiBDREMgTkNNIGNvbnRyb2wgZGVzY3JpcHRvcnMgKi8KKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmbmNtX2NvbnRyb2xfaW50ZiwKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmbmNtX2hlYWRlcl9kZXNjLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZuY21fdW5pb25fZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmZWNtX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJm5jbV9kZXNjLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZzc19uY21fbm90aWZ5X2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnNzX25jbV9ub3RpZnlfY29tcF9kZXNjLAorCS8qIGRhdGEgaW50ZXJmYWNlLCBhbHRzZXR0aW5ncyAwIGFuZCAxICovCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJm5jbV9kYXRhX25vcF9pbnRmLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZuY21fZGF0YV9pbnRmLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZzc19uY21faW5fZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmc3NfbmNtX2J1bGtfY29tcF9kZXNjLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZzc19uY21fb3V0X2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnNzX25jbV9idWxrX2NvbXBfZGVzYywKKwlOVUxMLAorfTsKKwogLyogc3RyaW5nIGRlc2NyaXB0b3JzOiAqLwogCiAjZGVmaW5lIFNUUklOR19DVFJMX0lEWAkwCkBAIC04NTIsNiArOTI0LDggQEAKIAkJCSAqLwogCQkJbmNtLT5wb3J0LmlzX3pscF9vayA9CiAJCQkJZ2FkZ2V0X2lzX3pscF9zdXBwb3J0ZWQoY2Rldi0+Z2FkZ2V0KTsKKwkJCW5jbS0+cG9ydC5ub19za2JfcmVzZXJ2ZSA9CisJCQkJZ2FkZ2V0X2F2b2lkc19za2JfcmVzZXJ2ZShjZGV2LT5nYWRnZXQpOwogCQkJbmNtLT5wb3J0LmNkY19maWx0ZXIgPSBERUZBVUxUX0ZJTFRFUjsKIAkJCURCRyhjZGV2LCAiYWN0aXZhdGUgbmNtXG4iKTsKIAkJCW5ldCA9IGdldGhlcl9jb25uZWN0KCZuY20tPnBvcnQpOwpAQCAtMTQzMSw4ICsxNTA1LDEzIEBACiAJaHNfbmNtX25vdGlmeV9kZXNjLmJFbmRwb2ludEFkZHJlc3MgPQogCQlmc19uY21fbm90aWZ5X2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKIAorCXNzX25jbV9pbl9kZXNjLmJFbmRwb2ludEFkZHJlc3MgPSBmc19uY21faW5fZGVzYy5iRW5kcG9pbnRBZGRyZXNzOworCXNzX25jbV9vdXRfZGVzYy5iRW5kcG9pbnRBZGRyZXNzID0gZnNfbmNtX291dF9kZXNjLmJFbmRwb2ludEFkZHJlc3M7CisJc3NfbmNtX25vdGlmeV9kZXNjLmJFbmRwb2ludEFkZHJlc3MgPQorCQlmc19uY21fbm90aWZ5X2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKKwogCXN0YXR1cyA9IHVzYl9hc3NpZ25fZGVzY3JpcHRvcnMoZiwgbmNtX2ZzX2Z1bmN0aW9uLCBuY21faHNfZnVuY3Rpb24sCi0JCQlOVUxMLCBOVUxMKTsKKwkJCW5jbV9zc19mdW5jdGlvbiwgTlVMTCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBmYWlsOwogCkBAIC0xNDUwLDYgKzE1MjksNyBAQAogCW5jbS0+dGFza190aW1lci5mdW5jdGlvbiA9IG5jbV90eF90aW1lb3V0OwogCiAJREJHKGNkZXYsICJDREMgTmV0d29yazogJXMgc3BlZWQgSU4vJXMgT1VULyVzIE5PVElGWS8lc1xuIiwKKwkJCWdhZGdldF9pc19zdXBlcnNwZWVkKGMtPmNkZXYtPmdhZGdldCkgPyAic3VwZXIiIDoKIAkJCWdhZGdldF9pc19kdWFsc3BlZWQoYy0+Y2Rldi0+Z2FkZ2V0KSA/ICJkdWFsIiA6ICJmdWxsIiwKIAkJCW5jbS0+cG9ydC5pbl9lcC0+bmFtZSwgbmNtLT5wb3J0Lm91dF9lcC0+bmFtZSwKIAkJCW5jbS0+bm90aWZ5LT5uYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX3ByaW50ZXIuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX3ByaW50ZXIuYwppbmRleCA2NDcwNmE3Li4wZGUzNmNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9wcmludGVyLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfcHJpbnRlci5jCkBAIC04ODksMTMgKzg4OSwxNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljIGJvb2wgZ3ByaW50ZXJfcmVxX21hdGNoKHN0cnVjdCB1c2JfZnVuY3Rpb24gKmYsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3RybCkKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjdHJsLAorCQkJICAgICAgIGJvb2wgY29uZmlnMCkKIHsKIAlzdHJ1Y3QgcHJpbnRlcl9kZXYJKmRldiA9IGZ1bmNfdG9fcHJpbnRlcihmKTsKIAl1MTYJCQl3X2luZGV4ID0gbGUxNl90b19jcHUoY3RybC0+d0luZGV4KTsKIAl1MTYJCQl3X3ZhbHVlID0gbGUxNl90b19jcHUoY3RybC0+d1ZhbHVlKTsKIAl1MTYJCQl3X2xlbmd0aCA9IGxlMTZfdG9fY3B1KGN0cmwtPndMZW5ndGgpOwogCisJaWYgKGNvbmZpZzApCisJCXJldHVybiBmYWxzZTsKKwogCWlmICgoY3RybC0+YlJlcXVlc3RUeXBlICYgVVNCX1JFQ0lQX01BU0spICE9IFVTQl9SRUNJUF9JTlRFUkZBQ0UgfHwKIAkgICAgKGN0cmwtPmJSZXF1ZXN0VHlwZSAmIFVTQl9UWVBFX01BU0spICE9IFVTQl9UWVBFX0NMQVNTKQogCQlyZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9ybmRpcy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2Zfcm5kaXMuYwppbmRleCBjODAwNTgyLi4xNjU2MmU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9ybmRpcy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX3JuZGlzLmMKQEAgLTM3NCw2ICszNzQsOSBAQAogewogCXN0cnVjdCBza19idWZmICpza2IyOwogCisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCiAJc2tiMiA9IHNrYl9yZWFsbG9jX2hlYWRyb29tKHNrYiwgc2l6ZW9mKHN0cnVjdCBybmRpc19wYWNrZXRfbXNnX3R5cGUpKTsKIAlybmRpc19hZGRfaGRyKHNrYjIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9zb3VyY2VzaW5rLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9zb3VyY2VzaW5rLmMKaW5kZXggZGYwMTg5ZC4uODc4NGZhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2Zfc291cmNlc2luay5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX3NvdXJjZXNpbmsuYwpAQCAtMjkzLDkgKzI5Myw3IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHVzYl9yZXF1ZXN0ICpzc19hbGxvY19lcF9yZXEoc3RydWN0IHVzYl9lcCAqZXAsIGludCBsZW4pCiB7Ci0Jc3RydWN0IGZfc291cmNlc2luawkJKnNzID0gZXAtPmRyaXZlcl9kYXRhOwotCi0JcmV0dXJuIGFsbG9jX2VwX3JlcShlcCwgbGVuLCBzcy0+YnVmbGVuKTsKKwlyZXR1cm4gYWxsb2NfZXBfcmVxKGVwLCBsZW4pOwogfQogCiBzdGF0aWMgdm9pZCBkaXNhYmxlX2VwKHN0cnVjdCB1c2JfY29tcG9zaXRlX2RldiAqY2Rldiwgc3RydWN0IHVzYl9lcCAqZXApCkBAIC02MDYsNyArNjA0LDcgQEAKIAl9IGVsc2UgewogCQllcCA9IGlzX2luID8gc3MtPmluX2VwIDogc3MtPm91dF9lcDsKIAkJcWxlbiA9IHNzLT5idWxrX3FsZW47Ci0JCXNpemUgPSAwOworCQlzaXplID0gc3MtPmJ1ZmxlbjsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgcWxlbjsgaSsrKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl91dmMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX3V2Yy5jCmluZGV4IDI5YjQxYjUuLjI3ZWQ1MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX3V2Yy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX3V2Yy5jCkBAIC0yNTgsNiArMjU4LDEzIEBACiAJbWVtY3B5KCZ1dmNfZXZlbnQtPnJlcSwgY3RybCwgc2l6ZW9mKHV2Y19ldmVudC0+cmVxKSk7CiAJdjRsMl9ldmVudF9xdWV1ZSgmdXZjLT52ZGV2LCAmdjRsMl9ldmVudCk7CiAKKwkvKiBQYXNzIGFkZGl0aW9uYWwgc2V0dXAgZGF0YSB0byB1c2Vyc3BhY2UgKi8KKwlpZiAodXZjLT5ldmVudF9zZXR1cF9vdXQgJiYgdXZjLT5ldmVudF9sZW5ndGgpIHsKKwkJdXZjLT5jb250cm9sX3JlcS0+bGVuZ3RoID0gdXZjLT5ldmVudF9sZW5ndGg7CisJCXJldHVybiB1c2JfZXBfcXVldWUodXZjLT5mdW5jLmNvbmZpZy0+Y2Rldi0+Z2FkZ2V0LT5lcDAsCisJCQl1dmMtPmNvbnRyb2xfcmVxLCBHRlBfQVRPTUlDKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL3JuZGlzLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vcm5kaXMuYwppbmRleCA5NDNjMjFhLi5hYjZhYzFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vcm5kaXMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vcm5kaXMuYwpAQCAtNjgwLDYgKzY4MCwxMiBAQAogewogCXJuZGlzX3Jlc2V0X2NtcGx0X3R5cGUgKnJlc3A7CiAJcm5kaXNfcmVzcF90ICpyOworCXU4ICp4YnVmOworCXUzMiBsZW5ndGg7CisKKwkvKiBkcmFpbiB0aGUgcmVzcG9uc2UgcXVldWUgKi8KKwl3aGlsZSAoKHhidWYgPSBybmRpc19nZXRfbmV4dF9yZXNwb25zZShwYXJhbXMsICZsZW5ndGgpKSkKKwkJcm5kaXNfZnJlZV9yZXNwb25zZShwYXJhbXMsIHhidWYpOwogCiAJciA9IHJuZGlzX2FkZF9yZXNwb25zZShwYXJhbXMsIHNpemVvZihybmRpc19yZXNldF9jbXBsdF90eXBlKSk7CiAJaWYgKCFyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL3N0b3JhZ2VfY29tbW9uLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vc3RvcmFnZV9jb21tb24uYwppbmRleCA5OTBkZjIyLi44ZmJmNjg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vc3RvcmFnZV9jb21tb24uYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vc3RvcmFnZV9jb21tb24uYwpAQCAtMzY5LDYgKzM2OSwxMiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZnNnX3Nob3dfcmVtb3ZhYmxlKTsKIAorc3NpemVfdCBmc2dfc2hvd19pbnF1aXJ5X3N0cmluZyhzdHJ1Y3QgZnNnX2x1biAqY3VybHVuLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGN1cmx1bi0+aW5xdWlyeV9zdHJpbmcpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZnNnX3Nob3dfaW5xdWlyeV9zdHJpbmcpOworCiAvKgogICogVGhlIGNhbGxlciBtdXN0IGhvbGQgZnNnLT5maWxlc2VtIGZvciByZWFkaW5nIHdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgogICovCkBAIC00OTksNCArNTA1LDIyIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChmc2dfc3RvcmVfcmVtb3ZhYmxlKTsKIAorc3NpemVfdCBmc2dfc3RvcmVfaW5xdWlyeV9zdHJpbmcoc3RydWN0IGZzZ19sdW4gKmN1cmx1biwgY29uc3QgY2hhciAqYnVmLAorCQkJCSBzaXplX3QgY291bnQpCit7CisJY29uc3Qgc2l6ZV90IGxlbiA9IG1pbihjb3VudCwgc2l6ZW9mKGN1cmx1bi0+aW5xdWlyeV9zdHJpbmcpKTsKKworCWlmIChsZW4gPT0gMCB8fCBidWZbMF0gPT0gJ1xuJykgeworCQljdXJsdW4tPmlucXVpcnlfc3RyaW5nWzBdID0gMDsKKwl9IGVsc2UgeworCQlzbnByaW50ZihjdXJsdW4tPmlucXVpcnlfc3RyaW5nLAorCQkJIHNpemVvZihjdXJsdW4tPmlucXVpcnlfc3RyaW5nKSwgIiUtMjhzIiwgYnVmKTsKKwkJaWYgKGN1cmx1bi0+aW5xdWlyeV9zdHJpbmdbbGVuLTFdID09ICdcbicpCisJCQljdXJsdW4tPmlucXVpcnlfc3RyaW5nW2xlbi0xXSA9ICcgJzsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmc2dfc3RvcmVfaW5xdWlyeV9zdHJpbmcpOworCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vc3RvcmFnZV9jb21tb24uaCBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9zdG9yYWdlX2NvbW1vbi5oCmluZGV4IGMzNTQ0ZTYuLmU2OTg0ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9zdG9yYWdlX2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9zdG9yYWdlX2NvbW1vbi5oCkBAIC04OCw2ICs4OCwxMiBAQAogI2RlZmluZSBBU0MoeCkJCSgodTgpICgoeCkgPj4gOCkpCiAjZGVmaW5lIEFTQ1EoeCkJCSgodTgpICh4KSkKIAorLyoKKyAqIFZlbmRvciAoOCBjaGFycyksIHByb2R1Y3QgKDE2IGNoYXJzKSwgcmVsZWFzZSAoNCBoZXhhZGVjaW1hbCBkaWdpdHMpIGFuZCBOVUwKKyAqIGJ5dGUKKyAqLworI2RlZmluZSBJTlFVSVJZX1NUUklOR19MRU4gKChzaXplX3QpICg4ICsgMTYgKyA0ICsgMSkpCisKIHN0cnVjdCBmc2dfbHVuIHsKIAlzdHJ1Y3QgZmlsZQkqZmlscDsKIAlsb2ZmX3QJCWZpbGVfbGVuZ3RoOwpAQCAtMTEyLDYgKzExOCw3IEBACiAJc3RydWN0IGRldmljZQlkZXY7CiAJY29uc3QgY2hhcgkqbmFtZTsJCS8qICJsdW4ubmFtZSIgKi8KIAljb25zdCBjaGFyCSoqbmFtZV9wZng7CS8qICJmdW5jdGlvbi5uYW1lIiAqLworCWNoYXIJCWlucXVpcnlfc3RyaW5nW0lOUVVJUllfU1RSSU5HX0xFTl07CiB9OwogCiBzdGF0aWMgaW5saW5lIGJvb2wgZnNnX2x1bl9pc19vcGVuKHN0cnVjdCBmc2dfbHVuICpjdXJsdW4pCkBAIC0yMTAsNiArMjE3LDcgQEAKIHNzaXplX3QgZnNnX3Nob3dfbm9mdWEoc3RydWN0IGZzZ19sdW4gKmN1cmx1biwgY2hhciAqYnVmKTsKIHNzaXplX3QgZnNnX3Nob3dfZmlsZShzdHJ1Y3QgZnNnX2x1biAqY3VybHVuLCBzdHJ1Y3Qgcndfc2VtYXBob3JlICpmaWxlc2VtLAogCQkgICAgICBjaGFyICpidWYpOworc3NpemVfdCBmc2dfc2hvd19pbnF1aXJ5X3N0cmluZyhzdHJ1Y3QgZnNnX2x1biAqY3VybHVuLCBjaGFyICpidWYpOwogc3NpemVfdCBmc2dfc2hvd19jZHJvbShzdHJ1Y3QgZnNnX2x1biAqY3VybHVuLCBjaGFyICpidWYpOwogc3NpemVfdCBmc2dfc2hvd19yZW1vdmFibGUoc3RydWN0IGZzZ19sdW4gKmN1cmx1biwgY2hhciAqYnVmKTsKIHNzaXplX3QgZnNnX3N0b3JlX3JvKHN0cnVjdCBmc2dfbHVuICpjdXJsdW4sIHN0cnVjdCByd19zZW1hcGhvcmUgKmZpbGVzZW0sCkBAIC0yMjEsNSArMjI5LDcgQEAKIAkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKIHNzaXplX3QgZnNnX3N0b3JlX3JlbW92YWJsZShzdHJ1Y3QgZnNnX2x1biAqY3VybHVuLCBjb25zdCBjaGFyICpidWYsCiAJCQkgICAgc2l6ZV90IGNvdW50KTsKK3NzaXplX3QgZnNnX3N0b3JlX2lucXVpcnlfc3RyaW5nKHN0cnVjdCBmc2dfbHVuICpjdXJsdW4sIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkgc2l6ZV90IGNvdW50KTsKIAogI2VuZGlmIC8qIFVTQl9TVE9SQUdFX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vdV9ldGhlci5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL3VfZXRoZXIuYwppbmRleCBhM2Y3ZTdjLi45YzhjOWVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vdV9ldGhlci5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi91X2V0aGVyLmMKQEAgLTgyLDYgKzgyLDcgQEAKICNkZWZpbmUJV09SS19SWF9NRU1PUlkJCTAKIAogCWJvb2wJCQl6bHA7CisJYm9vbAkJCW5vX3NrYl9yZXNlcnZlOwogCXU4CQkJaG9zdF9tYWNbRVRIX0FMRU5dOwogCXU4CQkJZGV2X21hY1tFVEhfQUxFTl07CiB9OwpAQCAtMjMzLDcgKzIzNCw4IEBACiAJICogYnV0IG9uIGF0IGxlYXN0IG9uZSwgY2hlY2tzdW1taW5nIGZhaWxzIG90aGVyd2lzZS4gIE5vdGU6CiAJICogUk5ESVMgaGVhZGVycyBpbnZvbHZlIHZhcmlhYmxlIG51bWJlcnMgb2YgTEUzMiB2YWx1ZXMuCiAJICovCi0Jc2tiX3Jlc2VydmUoc2tiLCBORVRfSVBfQUxJR04pOworCWlmIChsaWtlbHkoIWRldi0+bm9fc2tiX3Jlc2VydmUpKQorCQlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7CiAKIAlyZXEtPmJ1ZiA9IHNrYi0+ZGF0YTsKIAlyZXEtPmxlbmd0aCA9IHNpemU7CkBAIC01NTYsNyArNTU4LDggQEAKIAkJCS8qIE11bHRpIGZyYW1lIENEQyBwcm90b2NvbHMgbWF5IHN0b3JlIHRoZSBmcmFtZSBmb3IKIAkJCSAqIGxhdGVyIHdoaWNoIGlzIG5vdCBhIGRyb3BwZWQgZnJhbWUuCiAJCQkgKi8KLQkJCWlmIChkZXYtPnBvcnRfdXNiLT5zdXBwb3J0c19tdWx0aV9mcmFtZSkKKwkJCWlmIChkZXYtPnBvcnRfdXNiICYmCisJCQkJCWRldi0+cG9ydF91c2ItPnN1cHBvcnRzX211bHRpX2ZyYW1lKQogCQkJCWdvdG8gbXVsdGlmcmFtZTsKIAkJCWdvdG8gZHJvcDsKIAkJfQpAQCAtNTY4LDcgKzU3MSw4IEBACiAJcmVxLT5jb21wbGV0ZSA9IHR4X2NvbXBsZXRlOwogCiAJLyogTkNNIHJlcXVpcmVzIG5vIHpscCBpZiB0cmFuc2ZlciBpcyBkd050YkluTWF4U2l6ZSAqLwotCWlmIChkZXYtPnBvcnRfdXNiLT5pc19maXhlZCAmJgorCWlmIChkZXYtPnBvcnRfdXNiICYmCisJICAgIGRldi0+cG9ydF91c2ItPmlzX2ZpeGVkICYmCiAJICAgIGxlbmd0aCA9PSBkZXYtPnBvcnRfdXNiLT5maXhlZF9pbl9sZW4gJiYKIAkgICAgKGxlbmd0aCAlIGluLT5tYXhwYWNrZXQpID09IDApCiAJCXJlcS0+emVybyA9IDA7CkBAIC0xMDYyLDYgKzEwNjYsNyBAQAogCiAJaWYgKHJlc3VsdCA9PSAwKSB7CiAJCWRldi0+emxwID0gbGluay0+aXNfemxwX29rOworCQlkZXYtPm5vX3NrYl9yZXNlcnZlID0gbGluay0+bm9fc2tiX3Jlc2VydmU7CiAJCURCRyhkZXYsICJxbGVuICVkXG4iLCBxbGVuKGRldi0+Z2FkZ2V0LCBkZXYtPnFtdWx0KSk7CiAKIAkJZGV2LT5oZWFkZXJfbGVuID0gbGluay0+aGVhZGVyX2xlbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi91X2V0aGVyLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vdV9ldGhlci5oCmluZGV4IGM3NzE0NWIuLjgxZDk0YTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi91X2V0aGVyLmgKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL3VfZXRoZXIuaApAQCAtNjQsNiArNjQsNyBAQAogCXN0cnVjdCB1c2JfZXAJCQkqb3V0X2VwOwogCiAJYm9vbAkJCQlpc196bHBfb2s7CisJYm9vbAkJCQlub19za2JfcmVzZXJ2ZTsKIAogCXUxNgkJCQljZGNfZmlsdGVyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vdV9zZXJpYWwuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi91X3NlcmlhbC5jCmluZGV4IDZkZWQ2MzQuLmUwY2QxZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi91X3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi91X3NlcmlhbC5jCkBAIC0zNzUsMTAgKzM3NSwxNSBAQAogKi8KIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSpwb29sID0gJnBvcnQtPndyaXRlX3Bvb2w7Ci0Jc3RydWN0IHVzYl9lcAkJKmluID0gcG9ydC0+cG9ydF91c2ItPmluOworCXN0cnVjdCB1c2JfZXAJCSppbjsKIAlpbnQJCQlzdGF0dXMgPSAwOwogCWJvb2wJCQlkb190dHlfd2FrZSA9IGZhbHNlOwogCisJaWYgKCFwb3J0LT5wb3J0X3VzYikKKwkJcmV0dXJuIHN0YXR1czsKKworCWluID0gcG9ydC0+cG9ydF91c2ItPmluOworCiAJd2hpbGUgKCFwb3J0LT53cml0ZV9idXN5ICYmICFsaXN0X2VtcHR5KHBvb2wpKSB7CiAJCXN0cnVjdCB1c2JfcmVxdWVzdAkqcmVxOwogCQlpbnQJCQlsZW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vdXZjX2NvbmZpZ2ZzLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vdXZjX2NvbmZpZ2ZzLmMKaW5kZXggNjY3NTNiYS4uMzExMjVhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL3V2Y19jb25maWdmcy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi91dmNfY29uZmlnZnMuYwpAQCAtMjAyMyw3ICsyMDIzLDcgQEAKIAlpZiAoIWRhdGEpIHsKIAkJa2ZyZWUoKmNsYXNzX2FycmF5KTsKIAkJKmNsYXNzX2FycmF5ID0gTlVMTDsKLQkJcmV0ID0gUFRSX0VSUihkYXRhKTsKKwkJcmV0ID0gLUVOT01FTTsKIAkJZ290byB1bmxvY2s7CiAJfQogCWNsX2FyciA9ICpjbGFzc19hcnJheTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9sZWdhY3kvZ21pZGkuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9sZWdhY3kvZ21pZGkuYwppbmRleCBmYzJhYzE1Li4wYmYzOWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvbGVnYWN5L2dtaWRpLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2xlZ2FjeS9nbWlkaS5jCkBAIC00Nyw3ICs0Nyw3IEBACiBtb2R1bGVfcGFyYW0oaWQsIGNoYXJwLCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MoaWQsICJJRCBzdHJpbmcgZm9yIHRoZSBVU0IgTUlESSBHYWRnZXQgYWRhcHRlci4iKTsKIAotc3RhdGljIHVuc2lnbmVkIGludCBidWZsZW4gPSAyNTY7CitzdGF0aWMgdW5zaWduZWQgaW50IGJ1ZmxlbiA9IDUxMjsKIG1vZHVsZV9wYXJhbShidWZsZW4sIHVpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhidWZsZW4sICJNSURJIGJ1ZmZlciBsZW5ndGgiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2xlZ2FjeS9pbm9kZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2xlZ2FjeS9pbm9kZS5jCmluZGV4IGFhMzcwN2IuLjE2MTA0YjVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvbGVnYWN5L2lub2RlLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2xlZ2FjeS9pbm9kZS5jCkBAIC01NDIsNyArNTQyLDcgQEAKIAkgKi8KIAlzcGluX2xvY2tfaXJxKCZlcGRhdGEtPmRldi0+bG9jayk7CiAJdmFsdWUgPSAtRU5PREVWOwotCWlmICh1bmxpa2VseShlcGRhdGEtPmVwKSkKKwlpZiAodW5saWtlbHkoZXBkYXRhLT5lcCA9PSBOVUxMKSkKIAkJZ290byBmYWlsOwogCiAJcmVxID0gdXNiX2VwX2FsbG9jX3JlcXVlc3QoZXBkYXRhLT5lcCwgR0ZQX0FUT01JQyk7CkBAIC02MDYsNyArNjA2LDcgQEAKIAl9CiAJaWYgKGlzX3N5bmNfa2lvY2IoaW9jYikpIHsKIAkJdmFsdWUgPSBlcF9pbyhlcGRhdGEsIGJ1ZiwgbGVuKTsKLQkJaWYgKHZhbHVlID49IDAgJiYgY29weV90b19pdGVyKGJ1ZiwgdmFsdWUsIHRvKSkKKwkJaWYgKHZhbHVlID49IDAgJiYgKGNvcHlfdG9faXRlcihidWYsIHZhbHVlLCB0bykgIT0gdmFsdWUpKQogCQkJdmFsdWUgPSAtRUZBVUxUOwogCX0gZWxzZSB7CiAJCXN0cnVjdCBraW9jYl9wcml2ICpwcml2ID0ga3phbGxvYyhzaXplb2YgKnByaXYsIEdGUF9LRVJORUwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZi5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZi5jCmluZGV4IDRiYzdlZWEuLjE4ODM5NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC91X2YuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdV9mLmMKQEAgLTEyLDE0ICsxMiwxNiBAQAogICovCiAKICNpbmNsdWRlICJ1X2YuaCIKKyNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CiAKLXN0cnVjdCB1c2JfcmVxdWVzdCAqYWxsb2NfZXBfcmVxKHN0cnVjdCB1c2JfZXAgKmVwLCBpbnQgbGVuLCBpbnQgZGVmYXVsdF9sZW4pCitzdHJ1Y3QgdXNiX3JlcXVlc3QgKmFsbG9jX2VwX3JlcShzdHJ1Y3QgdXNiX2VwICplcCwgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3QgdXNiX3JlcXVlc3QgICAgICAqcmVxOwogCiAJcmVxID0gdXNiX2VwX2FsbG9jX3JlcXVlc3QoZXAsIEdGUF9BVE9NSUMpOwogCWlmIChyZXEpIHsKLQkJcmVxLT5sZW5ndGggPSBsZW4gPzogZGVmYXVsdF9sZW47CisJCXJlcS0+bGVuZ3RoID0gdXNiX2VuZHBvaW50X2Rpcl9vdXQoZXAtPmRlc2MpID8KKwkJCXVzYl9lcF9hbGlnbihlcCwgbGVuKSA6IGxlbjsKIAkJcmVxLT5idWYgPSBrbWFsbG9jKHJlcS0+bGVuZ3RoLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCFyZXEtPmJ1ZikgewogCQkJdXNiX2VwX2ZyZWVfcmVxdWVzdChlcCwgcmVxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91X2YuaCBiL2RyaXZlcnMvdXNiL2dhZGdldC91X2YuaAppbmRleCA0MjQ3Y2MwLi43ZDUzYTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdV9mLmgKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZi5oCkBAIC00Nyw4ICs0NywyMSBAQAogc3RydWN0IHVzYl9lcDsKIHN0cnVjdCB1c2JfcmVxdWVzdDsKIAotLyogUmVxdWVzdHMgYWxsb2NhdGVkIHZpYSBhbGxvY19lcF9yZXEoKSBtdXN0IGJlIGZyZWVkIGJ5IGZyZWVfZXBfcmVxKCkuICovCi1zdHJ1Y3QgdXNiX3JlcXVlc3QgKmFsbG9jX2VwX3JlcShzdHJ1Y3QgdXNiX2VwICplcCwgaW50IGxlbiwgaW50IGRlZmF1bHRfbGVuKTsKKy8qKgorICogYWxsb2NfZXBfcmVxIC0gcmV0dXJucyBhIHVzYl9yZXF1ZXN0IGFsbG9jYXRlZCBieSB0aGUgZ2FkZ2V0IGRyaXZlciBhbmQKKyAqIGFsbG9jYXRlcyB0aGUgcmVxdWVzdCdzIGJ1ZmZlci4KKyAqCisgKiBAZXA6IHRoZSBlbmRwb2ludCB0byBhbGxvY2F0ZSBhIHVzYl9yZXF1ZXN0CisgKiBAbGVuOiB1c2JfcmVxdWVzdHMncyBidWZmZXIgc3VnZ2VzdGVkIHNpemUKKyAqCisgKiBJbiBjYXNlIEBlcCBkaXJlY3Rpb24gaXMgT1VULCB0aGUgQGxlbiB3aWxsIGJlIGFsaWduZWQgdG8gZXAncworICogd01heFBhY2tldFNpemUuIEluIG9yZGVyIHRvIGF2b2lkIG1lbW9yeSBsZWFrcyBvciBkcm9wcywgKmFsd2F5cyogdXNlCisgKiB1c2JfcmVxdWVzdHMncyBsZW5ndGggKHJlcS0+bGVuZ3RoKSB0byByZWZlciB0byB0aGUgYWxsb2NhdGVkIGJ1ZmZlciBzaXplLgorICogUmVxdWVzdHMgYWxsb2NhdGVkIHZpYSBhbGxvY19lcF9yZXEoKSAqbXVzdCogYmUgZnJlZWQgYnkgZnJlZV9lcF9yZXEoKS4KKyAqLworc3RydWN0IHVzYl9yZXF1ZXN0ICphbGxvY19lcF9yZXEoc3RydWN0IHVzYl9lcCAqZXAsIHNpemVfdCBsZW4pOworCisvKiBGcmVlcyBhIHVzYl9yZXF1ZXN0IHByZXZpb3VzbHkgYWxsb2NhdGVkIGJ5IGFsbG9jX2VwX3JlcSgpICovCiBzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9lcF9yZXEoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKQogewogCWtmcmVlKHJlcS0+YnVmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvY29yZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9jb3JlLmMKaW5kZXggZmY4Njg1ZS4uOTQ4MzQ4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9jb3JlLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9jb3JlLmMKQEAgLTEwNywxMCArMTA3LDggQEAKIAkJZ290byBvdXQ7CiAKIAlyZXQgPSBlcC0+b3BzLT5lbmFibGUoZXAsIGVwLT5kZXNjKTsKLQlpZiAocmV0KSB7Ci0JCXJldCA9IHJldDsKKwlpZiAocmV0KQogCQlnb3RvIG91dDsKLQl9CiAKIAllcC0+ZW5hYmxlZCA9IHRydWU7CiAKQEAgLTgyNyw3ICs4MjUsNyBAQAogCQlyZXR1cm47CiAKIAlpZiAocmVxLT5udW1fbWFwcGVkX3NncykgewotCQlkbWFfdW5tYXBfc2coZGV2LCByZXEtPnNnLCByZXEtPm51bV9tYXBwZWRfc2dzLAorCQlkbWFfdW5tYXBfc2coZGV2LCByZXEtPnNnLCByZXEtPm51bV9zZ3MsCiAJCQkJaXNfaW4gPyBETUFfVE9fREVWSUNFIDogRE1BX0ZST01fREVWSUNFKTsKIAogCQlyZXEtPm51bV9tYXBwZWRfc2dzID0gMDsKQEAgLTExNDUsNyArMTE0Myw3IEBACiAJCQlpZiAocmV0ICE9IC1FUFJPQkVfREVGRVIpCiAJCQkJbGlzdF9kZWwoJmRyaXZlci0+cGVuZGluZyk7CiAJCQlpZiAocmV0KQotCQkJCWdvdG8gZXJyNDsKKwkJCQlnb3RvIGVycjU7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTExNTQsNiArMTE1Miw5IEBACiAKIAlyZXR1cm4gMDsKIAorZXJyNToKKwlkZXZpY2VfZGVsKCZ1ZGMtPmRldik7CisKIGVycjQ6CiAJbGlzdF9kZWwoJnVkYy0+bGlzdCk7CiAJbXV0ZXhfdW5sb2NrKCZ1ZGNfbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2ZzbF9xZV91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvZnNsX3FlX3VkYy5jCmluZGV4IDkzZDI4Y2IuLjRmZmY1MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvZnNsX3FlX3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvZnNsX3FlX3VkYy5jCkBAIC00MjEsMTAgKzQyMSw4IEBACiAJYmQgPSBlcC0+cnhiYXNlOwogCiAJZXAtPnJ4ZnJhbWUgPSBrbWFsbG9jKHNpemVvZigqZXAtPnJ4ZnJhbWUpLCBHRlBfQVRPTUlDKTsKLQlpZiAoZXAtPnJ4ZnJhbWUgPT0gTlVMTCkgewotCQlkZXZfZXJyKGVwLT51ZGMtPmRldiwgIm1hbGxvYyByeGZyYW1lIGZhaWxlZFxuIik7CisJaWYgKCFlcC0+cnhmcmFtZSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJcWVfZnJhbWVfaW5pdChlcC0+cnhmcmFtZSk7CiAKQEAgLTQzNSw5ICs0MzMsNyBAQAogCiAJc2l6ZSA9IChlcC0+ZXAubWF4cGFja2V0ICsgVVNCX0NSQ19TSVpFICsgMikgKiAoYmRyaW5nX2xlbiArIDEpOwogCWVwLT5yeGJ1ZmZlciA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7Ci0JaWYgKGVwLT5yeGJ1ZmZlciA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoZXAtPnVkYy0+ZGV2LCAibWFsbG9jIHJ4YnVmZmVyIGZhaWxlZCxzaXplPSVkXG4iLAotCQkJCXNpemUpOworCWlmICghZXAtPnJ4YnVmZmVyKSB7CiAJCWtmcmVlKGVwLT5yeGZyYW1lKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtNjY4LDEwICs2NjQsOCBAQAogCiAJaWYgKChlcC0+dG0gPT0gVVNCUF9UTV9DVEwpIHx8IChlcC0+ZGlyID09IFVTQl9ESVJfSU4pKSB7CiAJCWVwLT50eGZyYW1lID0ga21hbGxvYyhzaXplb2YoKmVwLT50eGZyYW1lKSwgR0ZQX0FUT01JQyk7Ci0JCWlmIChlcC0+dHhmcmFtZSA9PSBOVUxMKSB7Ci0JCQlkZXZfZXJyKHVkYy0+ZGV2LCAibWFsbG9jIHR4ZnJhbWUgZmFpbGVkXG4iKTsKKwkJaWYgKCFlcC0+dHhmcmFtZSkKIAkJCWdvdG8gZW5fZG9uZTI7Ci0JCX0KIAkJcWVfZnJhbWVfaW5pdChlcC0+dHhmcmFtZSk7CiAJfQogCkBAIC0xODc4LDExICsxODcyLDggQEAKIAogCXRtcCA9IGluX2JlMTYoJnVkYy0+dXNiX3BhcmFtLT5mcmFtZV9uKTsKIAlpZiAodG1wICYgMHg4MDAwKQotCQl0bXAgPSB0bXAgJiAweDA3ZmY7Ci0JZWxzZQotCQl0bXAgPSAtRUlOVkFMOwotCi0JcmV0dXJuIChpbnQpdG1wOworCQlyZXR1cm4gdG1wICYgMHgwN2ZmOworCXJldHVybiAtRUlOVkFMOwogfQogCiBzdGF0aWMgaW50IGZzbF9xZV9zdGFydChzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0LApAQCAtMjA1Myw3ICsyMDQ0LDcgQEAKIAkJCXN0cnVjdCBxZV9lcCAqZXA7CiAKIAkJCWlmICh3VmFsdWUgIT0gMCB8fCB3TGVuZ3RoICE9IDAKLQkJCQl8fCBwaXBlID4gVVNCX01BWF9FTkRQT0lOVFMpCisJCQkJfHwgcGlwZSA+PSBVU0JfTUFYX0VORFBPSU5UUykKIAkJCQlicmVhazsKIAkJCWVwID0gJnVkYy0+ZXBzW3BpcGVdOwogCkBAIC0yMzQ3LDEwICsyMzM4LDggQEAKIAl1MzIgb2Zmc2V0OwogCiAJdWRjID0ga3phbGxvYyhzaXplb2YoKnVkYyksIEdGUF9LRVJORUwpOwotCWlmICh1ZGMgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZvZmRldi0+ZGV2LCAibWFsbG9jIHVkYyBmYWlsZWRcbiIpOworCWlmICghdWRjKQogCQlnb3RvIGNsZWFudXA7Ci0JfQogCiAJdWRjLT5kZXYgPSAmb2ZkZXYtPmRldjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9nb2t1X3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9nb2t1X3VkYy5jCmluZGV4IGQyMjA1ZDkuLjUxMDc5ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvZ29rdV91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2dva3VfdWRjLmMKQEAgLTE3NjcsOCArMTc2Nyw3IEBACiAKIAkvKiBhbGxvYywgYW5kIHN0YXJ0IGluaXQgKi8KIAlkZXYgPSBremFsbG9jIChzaXplb2YgKmRldiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRldiA9PSBOVUxMKXsKLQkJcHJfZGVidWcoImVub21lbSAlc1xuIiwgcGNpX25hbWUocGRldikpOworCWlmICghZGV2KSB7CiAJCXJldHZhbCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyOwogCX0KQEAgLTE4MzksNiArMTgzOCw4IEBACiBlcnI6CiAJaWYgKGRldikKIAkJZ29rdV9yZW1vdmUgKHBkZXYpOworCS8qIGdhZGdldF9yZWxlYXNlIGlzIG5vdCByZWdpc3RlcmVkIHlldCwga2ZyZWUgZXhwbGljaXRseSAqLworCWtmcmVlKGRldik7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9uZXQyMjgwLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL25ldDIyODAuYwppbmRleCA2MTRhYjk1MS4uNjFjOTM4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9uZXQyMjgwLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9uZXQyMjgwLmMKQEAgLTU4OSw3ICs1ODksNyBAQAogCiAJZXAgPSBjb250YWluZXJfb2YoX2VwLCBzdHJ1Y3QgbmV0MjI4MF9lcCwgZXApOwogCWlmICghX2VwIHx8ICFfcmVxKSB7Ci0JCWRldl9lcnIoJmVwLT5kZXYtPnBkZXYtPmRldiwgIiVzOiBJbmF2bGlkIGVwPSVwIG9yIHJlcT0lcFxuIiwKKwkJZGV2X2VycigmZXAtPmRldi0+cGRldi0+ZGV2LCAiJXM6IEludmFsaWQgZXA9JXAgb3IgcmVxPSVwXG4iLAogCQkJCQkJCV9fZnVuY19fLCBfZXAsIF9yZXEpOwogCQlyZXR1cm47CiAJfQpAQCAtMTEzNyw4ICsxMTM3LDEwIEBACiAJZG9uZShlcCwgcmVxLCBzdGF0dXMpOwogfQogCi1zdGF0aWMgdm9pZCBzY2FuX2RtYV9jb21wbGV0aW9ucyhzdHJ1Y3QgbmV0MjI4MF9lcCAqZXApCitzdGF0aWMgaW50IHNjYW5fZG1hX2NvbXBsZXRpb25zKHN0cnVjdCBuZXQyMjgwX2VwICplcCkKIHsKKwlpbnQgbnVtX2NvbXBsZXRlZCA9IDA7CisKIAkvKiBvbmx5IGxvb2sgYXQgZGVzY3JpcHRvcnMgdGhhdCB3ZXJlICJuYXR1cmFsbHkiIHJldGlyZWQsCiAJICogc28gZmlmbyBhbmQgbGlzdCBoZWFkIHN0YXRlIHdvbid0IG1hdHRlcgogCSAqLwpAQCAtMTE2Niw2ICsxMTY4LDcgQEAKIAkJCQlicmVhazsKIAkJCS8qIHNpbmdsZSB0cmFuc2ZlciBtb2RlICovCiAJCQlkbWFfZG9uZShlcCwgcmVxLCB0bXAsIDApOworCQkJbnVtX2NvbXBsZXRlZCsrOwogCQkJYnJlYWs7CiAJCX0gZWxzZSBpZiAoIWVwLT5pc19pbiAmJgogCQkJICAgKHJlcS0+cmVxLmxlbmd0aCAlIGVwLT5lcC5tYXhwYWNrZXQpICYmCkBAIC0xMTk0LDcgKzExOTcsMTAgQEAKIAkJCX0KIAkJfQogCQlkbWFfZG9uZShlcCwgcmVxLCB0bXAsIDApOworCQludW1fY29tcGxldGVkKys7CiAJfQorCisJcmV0dXJuIG51bV9jb21wbGV0ZWQ7CiB9CiAKIHN0YXRpYyB2b2lkIHJlc3RhcnRfZG1hKHN0cnVjdCBuZXQyMjgwX2VwICplcCkKQEAgLTE1NjcsNiArMTU3Myw0NCBAQAogCQkJcmV0dXJuIGVwOwogCX0KIAorCS8qIFVTQjMzODA6IE9ubHkgZmlyc3QgZm91ciBlbmRwb2ludHMgaGF2ZSBETUEgY2hhbm5lbHMuIEFsbG9jYXRlCisJICogc2xvd2VyIGludGVycnVwdCBlbmRwb2ludHMgZnJvbSBQSU8gaHcgZW5kcG9pbnRzLCB0byBhbGxvdyBidWxrL2lzb2MKKwkgKiBlbmRwb2ludHMgdXNlIERNQSBodyBlbmRwb2ludHMuCisJICovCisJaWYgKHVzYl9lbmRwb2ludF90eXBlKGRlc2MpID09IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCAmJgorCSAgICB1c2JfZW5kcG9pbnRfZGlyX2luKGRlc2MpKSB7CisJCWVwID0gZ2FkZ2V0X2ZpbmRfZXBfYnlfbmFtZShfZ2FkZ2V0LCAiZXAyaW4iKTsKKwkJaWYgKGVwICYmIHVzYl9nYWRnZXRfZXBfbWF0Y2hfZGVzYyhfZ2FkZ2V0LCBlcCwgZGVzYywgZXBfY29tcCkpCisJCQlyZXR1cm4gZXA7CisJCWVwID0gZ2FkZ2V0X2ZpbmRfZXBfYnlfbmFtZShfZ2FkZ2V0LCAiZXA0aW4iKTsKKwkJaWYgKGVwICYmIHVzYl9nYWRnZXRfZXBfbWF0Y2hfZGVzYyhfZ2FkZ2V0LCBlcCwgZGVzYywgZXBfY29tcCkpCisJCQlyZXR1cm4gZXA7CisJfSBlbHNlIGlmICh1c2JfZW5kcG9pbnRfdHlwZShkZXNjKSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQgJiYKKwkJICAgIXVzYl9lbmRwb2ludF9kaXJfaW4oZGVzYykpIHsKKwkJZXAgPSBnYWRnZXRfZmluZF9lcF9ieV9uYW1lKF9nYWRnZXQsICJlcDFvdXQiKTsKKwkJaWYgKGVwICYmIHVzYl9nYWRnZXRfZXBfbWF0Y2hfZGVzYyhfZ2FkZ2V0LCBlcCwgZGVzYywgZXBfY29tcCkpCisJCQlyZXR1cm4gZXA7CisJCWVwID0gZ2FkZ2V0X2ZpbmRfZXBfYnlfbmFtZShfZ2FkZ2V0LCAiZXAzb3V0Iik7CisJCWlmIChlcCAmJiB1c2JfZ2FkZ2V0X2VwX21hdGNoX2Rlc2MoX2dhZGdldCwgZXAsIGRlc2MsIGVwX2NvbXApKQorCQkJcmV0dXJuIGVwOworCX0gZWxzZSBpZiAodXNiX2VuZHBvaW50X3R5cGUoZGVzYykgIT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSyAmJgorCQkgICB1c2JfZW5kcG9pbnRfZGlyX2luKGRlc2MpKSB7CisJCWVwID0gZ2FkZ2V0X2ZpbmRfZXBfYnlfbmFtZShfZ2FkZ2V0LCAiZXAxaW4iKTsKKwkJaWYgKGVwICYmIHVzYl9nYWRnZXRfZXBfbWF0Y2hfZGVzYyhfZ2FkZ2V0LCBlcCwgZGVzYywgZXBfY29tcCkpCisJCQlyZXR1cm4gZXA7CisJCWVwID0gZ2FkZ2V0X2ZpbmRfZXBfYnlfbmFtZShfZ2FkZ2V0LCAiZXAzaW4iKTsKKwkJaWYgKGVwICYmIHVzYl9nYWRnZXRfZXBfbWF0Y2hfZGVzYyhfZ2FkZ2V0LCBlcCwgZGVzYywgZXBfY29tcCkpCisJCQlyZXR1cm4gZXA7CisJfSBlbHNlIGlmICh1c2JfZW5kcG9pbnRfdHlwZShkZXNjKSAhPSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLICYmCisJCSAgICF1c2JfZW5kcG9pbnRfZGlyX2luKGRlc2MpKSB7CisJCWVwID0gZ2FkZ2V0X2ZpbmRfZXBfYnlfbmFtZShfZ2FkZ2V0LCAiZXAyb3V0Iik7CisJCWlmIChlcCAmJiB1c2JfZ2FkZ2V0X2VwX21hdGNoX2Rlc2MoX2dhZGdldCwgZXAsIGRlc2MsIGVwX2NvbXApKQorCQkJcmV0dXJuIGVwOworCQllcCA9IGdhZGdldF9maW5kX2VwX2J5X25hbWUoX2dhZGdldCwgImVwNG91dCIpOworCQlpZiAoZXAgJiYgdXNiX2dhZGdldF9lcF9tYXRjaF9kZXNjKF9nYWRnZXQsIGVwLCBkZXNjLCBlcF9jb21wKSkKKwkJCXJldHVybiBlcDsKKwl9CisKIAkvKiBVU0IzMzgwOiB1c2Ugc2FtZSBhZGRyZXNzIGZvciB1c2IgYW5kIGhhcmR3YXJlIGVuZHBvaW50cyAqLwogCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgImVwJWQlcyIsIHVzYl9lbmRwb2ludF9udW0oZGVzYyksCiAJCQl1c2JfZW5kcG9pbnRfZGlyX2luKGRlc2MpID8gImluIiA6ICJvdXQiKTsKQEAgLTI1NDcsOCArMjU5MSwxMSBAQAogCS8qIG1hbnVhbCBETUEgcXVldWUgYWR2YW5jZSBhZnRlciBzaG9ydCBPVVQgKi8KIAlpZiAobGlrZWx5KGVwLT5kbWEpKSB7CiAJCWlmICh0ICYgQklUKFNIT1JUX1BBQ0tFVF9UUkFOU0ZFUlJFRF9JTlRFUlJVUFQpKSB7Ci0JCQl1MzIJY291bnQ7CisJCQlzdHJ1Y3QgbmV0MjI4MF9yZXF1ZXN0ICpzdHVja19yZXEgPSBOVUxMOwogCQkJaW50CXN0b3BwZWQgPSBlcC0+c3RvcHBlZDsKKwkJCWludAludW1fY29tcGxldGVkOworCQkJaW50CXN0dWNrID0gMDsKKwkJCXUzMgljb3VudDsKIAogCQkJLyogVFJBTlNGRVJSRUQgd29ya3MgYXJvdW5kIE9VVF9ET05FIGVycmF0dW0gMDExMi4KIAkJCSAqIHdlIGV4cGVjdCAoTiA8PSBtYXhwYWNrZXQpIGJ5dGVzOyBob3N0IHdyb3RlIE0uCkBAIC0yNTYwLDcgKzI2MDcsNyBAQAogCQkJCS8qIGFueSBwcmVjZWRpbmcgZG1hIHRyYW5zZmVycyBtdXN0IGZpbmlzaC4KIAkJCQkgKiBkbWEgaGFuZGxlcyAoTSA+PSBOKSwgbWF5IGVtcHR5IHRoZSBxdWV1ZQogCQkJCSAqLwotCQkJCXNjYW5fZG1hX2NvbXBsZXRpb25zKGVwKTsKKwkJCQludW1fY29tcGxldGVkID0gc2Nhbl9kbWFfY29tcGxldGlvbnMoZXApOwogCQkJCWlmICh1bmxpa2VseShsaXN0X2VtcHR5KCZlcC0+cXVldWUpIHx8CiAJCQkJCQllcC0+b3V0X292ZXJmbG93KSkgewogCQkJCQlyZXEgPSBOVUxMOwpAQCAtMjU4MCw2ICsyNjI3LDMxIEBACiAJCQkJCQlyZXEgPSBOVUxMOwogCQkJCQlicmVhazsKIAkJCQl9CisKKwkJCQkvKiBFc2NhcGUgbG9vcCBpZiBubyBkbWEgdHJhbnNmZXJzIGNvbXBsZXRlZAorCQkJCSAqIGFmdGVyIGZldyByZXRyaWVzLgorCQkJCSAqLworCQkJCWlmIChudW1fY29tcGxldGVkID09IDApIHsKKwkJCQkJaWYgKHN0dWNrX3JlcSA9PSByZXEgJiYKKwkJCQkJICAgIHJlYWRsKCZlcC0+ZG1hLT5kbWFkZXNjKSAhPQorCQkJCQkJICByZXEtPnRkX2RtYSAmJiBzdHVjaysrID4gNSkgeworCQkJCQkJY291bnQgPSByZWFkbCgKKwkJCQkJCQkmZXAtPmRtYS0+ZG1hY291bnQpOworCQkJCQkJY291bnQgJj0gRE1BX0JZVEVfQ09VTlRfTUFTSzsKKwkJCQkJCXJlcSA9IE5VTEw7CisJCQkJCQllcF9kYmcoZXAtPmRldiwgIiVzIGVzY2FwZSBzdHVjayAlZCwgY291bnQgJXVcbiIsCisJCQkJCQkJZXAtPmVwLm5hbWUsIHN0dWNrLAorCQkJCQkJCWNvdW50KTsKKwkJCQkJCWJyZWFrOworCQkJCQl9IGVsc2UgaWYgKHN0dWNrX3JlcSAhPSByZXEpIHsKKwkJCQkJCXN0dWNrX3JlcSA9IHJlcTsKKwkJCQkJCXN0dWNrID0gMDsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXN0dWNrX3JlcSA9IE5VTEw7CisJCQkJCXN0dWNrID0gMDsKKwkJCQl9CisKIAkJCQl1ZGVsYXkoMSk7CiAJCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvb21hcF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvb21hcF91ZGMuYwppbmRleCA5YjdkMzk0Li5hODcwOWY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL29tYXBfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9vbWFwX3VkYy5jCkBAIC0yODc1LDcgKzI4NzUsNyBAQAogCXhjZWl2ID0gTlVMTDsKIAkvKiAidWRjIiBpcyBub3cgdmFsaWQgKi8KIAlwdWxsdXBfZGlzYWJsZSh1ZGMpOwotI2lmCWRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEX01PRFVMRSkKKyNpZglJU19FTkFCTEVEKENPTkZJR19VU0JfT0hDSV9IQ0QpCiAJdWRjLT5nYWRnZXQuaXNfb3RnID0gKGNvbmZpZy0+b3RnICE9IDApOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvcHhhMjd4X3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9weGEyN3hfdWRjLmMKaW5kZXggYWQxNDBhYS4uN2ZhNjBmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9weGEyN3hfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9weGEyN3hfdWRjLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2dhZGdldC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9waHkuaD4KIAogI2luY2x1ZGUgInB4YTI3eF91ZGMuaCIKIApAQCAtMTY1NSw2ICsxNjU2LDM3IEBACiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQogCisvKioKKyAqIHB4YV91ZGNfcGh5X2V2ZW50IC0gQ2FsbGVkIGJ5IHBoeSB1cG9uIFZCdXMgZXZlbnQKKyAqIEBuYjogbm90aWZpZXIgYmxvY2sKKyAqIEBhY3Rpb246IHBoeSBhY3Rpb24sIGlzIHZidXMgY29ubmVjdCBvciBkaXNjb25uZWN0CisgKiBAZGF0YTogdGhlIHVzYl9nYWRnZXQgc3RydWN0dXJlIGluIHB4YV91ZGMKKyAqCisgKiBDYWxsZWQgYnkgdGhlIFVTQiBQaHkgd2hlbiBhIGNhYmxlIGNvbm5lY3Qgb3IgZGlzY29ubmVjdCBpcyBzZW5zZWQuCisgKgorICogUmV0dXJucyAwCisgKi8KK3N0YXRpYyBpbnQgcHhhX3VkY19waHlfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sCisJCQkgICAgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCA9IGRhdGE7CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgVVNCX0VWRU5UX1ZCVVM6CisJCXVzYl9nYWRnZXRfdmJ1c19jb25uZWN0KGdhZGdldCk7CisJCXJldHVybiBOT1RJRllfT0s7CisJY2FzZSBVU0JfRVZFTlRfTk9ORToKKwkJdXNiX2dhZGdldF92YnVzX2Rpc2Nvbm5lY3QoZ2FkZ2V0KTsKKwkJcmV0dXJuIE5PVElGWV9PSzsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisJfQorfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHB4YTI3eF91ZGNfcGh5ID0geworCS5ub3RpZmllcl9jYWxsID0gcHhhX3VkY19waHlfZXZlbnQsCit9OworCiBzdGF0aWMgaW50IHB4YTI3eF91ZGNfc3RhcnQoc3RydWN0IHVzYl9nYWRnZXQgKmcsCiAJCXN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKTsKIHN0YXRpYyBpbnQgcHhhMjd4X3VkY19zdG9wKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnKTsKQEAgLTI0MzIsNyArMjQ2NCwxNCBAQAogCQlyZXR1cm4gdWRjLT5pcnE7CiAKIAl1ZGMtPmRldiA9ICZwZGV2LT5kZXY7Ci0JdWRjLT50cmFuc2NlaXZlciA9IHVzYl9nZXRfcGh5KFVTQl9QSFlfVFlQRV9VU0IyKTsKKwlpZiAob2ZfaGF2ZV9wb3B1bGF0ZWRfZHQoKSkgeworCQl1ZGMtPnRyYW5zY2VpdmVyID0KKwkJCWRldm1fdXNiX2dldF9waHlfYnlfcGhhbmRsZSh1ZGMtPmRldiwgInBoeXMiLCAwKTsKKwkJaWYgKElTX0VSUih1ZGMtPnRyYW5zY2VpdmVyKSkKKwkJCXJldHVybiBQVFJfRVJSKHVkYy0+dHJhbnNjZWl2ZXIpOworCX0gZWxzZSB7CisJCXVkYy0+dHJhbnNjZWl2ZXIgPSB1c2JfZ2V0X3BoeShVU0JfUEhZX1RZUEVfVVNCMik7CisJfQogCiAJaWYgKElTX0VSUih1ZGMtPmdwaW9kKSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDb3VsZG4ndCBmaW5kIG9yIHJlcXVlc3QgRCsgZ3BpbyA6ICVsZFxuIiwKQEAgLTI0NjUsMTQgKzI1MDQsMjAgQEAKIAkJZ290byBlcnI7CiAJfQogCisJaWYgKCFJU19FUlJfT1JfTlVMTCh1ZGMtPnRyYW5zY2VpdmVyKSkKKwkJdXNiX3JlZ2lzdGVyX25vdGlmaWVyKHVkYy0+dHJhbnNjZWl2ZXIsICZweGEyN3hfdWRjX3BoeSk7CiAJcmV0dmFsID0gdXNiX2FkZF9nYWRnZXRfdWRjKCZwZGV2LT5kZXYsICZ1ZGMtPmdhZGdldCk7CiAJaWYgKHJldHZhbCkKLQkJZ290byBlcnI7CisJCWdvdG8gZXJyX2FkZF9nYWRnZXQ7CiAKIAlweGFfaW5pdF9kZWJ1Z2ZzKHVkYyk7CiAJaWYgKHNob3VsZF9lbmFibGVfdWRjKHVkYykpCiAJCXVkY19lbmFibGUodWRjKTsKIAlyZXR1cm4gMDsKKworZXJyX2FkZF9nYWRnZXQ6CisJaWYgKCFJU19FUlJfT1JfTlVMTCh1ZGMtPnRyYW5zY2VpdmVyKSkKKwkJdXNiX3VucmVnaXN0ZXJfbm90aWZpZXIodWRjLT50cmFuc2NlaXZlciwgJnB4YTI3eF91ZGNfcGh5KTsKIGVycjoKIAljbGtfdW5wcmVwYXJlKHVkYy0+Y2xrKTsKIAlyZXR1cm4gcmV0dmFsOwpAQCAtMjQ4OSw2ICsyNTM0LDggQEAKIAl1c2JfZGVsX2dhZGdldF91ZGMoJnVkYy0+Z2FkZ2V0KTsKIAlweGFfY2xlYW51cF9kZWJ1Z2ZzKHVkYyk7CiAKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKHVkYy0+dHJhbnNjZWl2ZXIpKQorCQl1c2JfdW5yZWdpc3Rlcl9ub3RpZmllcih1ZGMtPnRyYW5zY2VpdmVyLCAmcHhhMjd4X3VkY19waHkpOwogCXVzYl9wdXRfcGh5KHVkYy0+dHJhbnNjZWl2ZXIpOwogCiAJdWRjLT50cmFuc2NlaXZlciA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL3JlbmVzYXNfdXNiMy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9yZW5lc2FzX3VzYjMuYwppbmRleCA5M2EzYmVjLi5mYjhmYzM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL3JlbmVzYXNfdXNiMy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvcmVuZXNhc191c2IzLmMKQEAgLTEwNiw2ICsxMDYsNyBAQAogCiAvKiBEUkRfQ09OICovCiAjZGVmaW5lIERSRF9DT05fUEVSSV9DT04JQklUKDI0KQorI2RlZmluZSBEUkRfQ09OX1ZCT1VUCQlCSVQoMCkKIAogLyogVVNCX0lOVF9FTkFfMSBhbmQgVVNCX0lOVF9TVEFfMSAqLwogI2RlZmluZSBVU0JfSU5UXzFfQjNfUExMV0tVUAlCSVQoMzEpCkBAIC0zNjMsNiArMzY0LDcgQEAKIHsKIAkvKiBGSVhNRTogSG93IHRvIGNoYW5nZSBob3N0IC8gcGVyaXBoZXJhbCBtb2RlIGFzIHdlbGw/ICovCiAJdXNiM19zZXRfYml0KHVzYjMsIERSRF9DT05fUEVSSV9DT04sIFVTQjNfRFJEX0NPTik7CisJdXNiM19jbGVhcl9iaXQodXNiMywgRFJEX0NPTl9WQk9VVCwgVVNCM19EUkRfQ09OKTsKIAogCXVzYjNfd3JpdGUodXNiMywgfjAsIFVTQjNfVVNCX0lOVF9TVEFfMSk7CiAJdXNiM19lbmFibGVfaXJxXzEodXNiMywgVVNCX0lOVF8xX1ZCVVNfQ05HKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvdWRjLXhpbGlueC5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy91ZGMteGlsaW54LmMKaW5kZXggZjhiZjI5MC4uNTg4ZTI1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy91ZGMteGlsaW54LmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy91ZGMteGlsaW54LmMKQEAgLTk3MywxMCArOTczLDggQEAKIAogCXVkYyA9IGVwLT51ZGM7CiAJcmVxID0ga3phbGxvYyhzaXplb2YoKnJlcSksIGdmcF9mbGFncyk7Ci0JaWYgKCFyZXEpIHsKLQkJZGV2X2Vycih1ZGMtPmRldiwgIiVzOm5vdCBlbm91Z2ggbWVtb3J5IiwgX19mdW5jX18pOworCWlmICghcmVxKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAlyZXEtPmVwID0gZXA7CiAJSU5JVF9MSVNUX0hFQUQoJnJlcS0+cXVldWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9LY29uZmlnIGIvZHJpdmVycy91c2IvaG9zdC9LY29uZmlnCmluZGV4IDJlNzEwYTQuLjBiODBjZWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvaG9zdC9LY29uZmlnCkBAIC00NzIsNyArNDcyLDcgQEAKIAogY29uZmlnIFVTQl9PSENJX0hDRF9PTUFQMwogCXRyaXN0YXRlICJPSENJIHN1cHBvcnQgZm9yIE9NQVAzIGFuZCBsYXRlciBjaGlwcyIKLQlkZXBlbmRzIG9uIChBUkNIX09NQVAzIHx8IEFSQ0hfT01BUDQpCisJZGVwZW5kcyBvbiAoQVJDSF9PTUFQMyB8fCBBUkNIX09NQVA0IHx8IFNPQ19PTUFQNSkKIAlkZWZhdWx0IHkKIAktLS1oZWxwLS0tCiAJICBFbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBvbi1jaGlwIE9IQ0kgY29udHJvbGxlciBvbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9iY21hLWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9iY21hLWhjZC5jCmluZGV4IDE3MmVmMTcuLjVmNDI1YzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvYmNtYS1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2JjbWEtaGNkLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC91c2IvZWhjaV9wZHJpdmVyLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL29oY2lfcGRyaXZlci5oPgogCkBAIC0zNCw2ICszNSw5IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkNvbW1vbiBVU0IgZHJpdmVyIGZvciBCQ01BIEJ1cyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCisvKiBTZWUgQkNNQV9DTEtDVExTVF9FWFRSRVNSRVEgYW5kIEJDTUFfQ0xLQ1RMU1RfRVhUUkVTU1QgKi8KKyNkZWZpbmUgVVNCX0JDTUFfQ0xLQ1RMU1RfVVNCX0NMS19SRVEJCQkweDAwMDAwMTAwCisKIHN0cnVjdCBiY21hX2hjZF9kZXZpY2UgewogCXN0cnVjdCBiY21hX2RldmljZSAqY29yZTsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICplaGNpX2RldjsKQEAgLTE2NSw0NCArMTY5LDgwIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBiY21hX2hjZF9pbml0X2NoaXBfYXJtX3BoeShzdHJ1Y3QgYmNtYV9kZXZpY2UgKmRldikKKy8qKgorICogYmNtYV9oY2RfdXNiMjBfb2xkX2FybV9pbml0IC0gSW5pdGlhbGl6ZSBvbGQgVVNCIDIuMCBjb250cm9sbGVyIG9uIEFSTQorICoKKyAqIE9sZCBVU0IgMi4wIGNvcmUgaXMgaWRlbnRpZmllZCBhcyBCQ01BX0NPUkVfVVNCMjBfSE9TVCBhbmQgd2FzIGludHJvZHVjZWQKKyAqIGxvbmcgYmVmb3JlIE5vcnRoc3RhciBkZXZpY2VzLiBJdCBzZWVtcyBzb21lIGNoZWFwZXIgY2hpcHNldHMgbGlrZSBCQ001MzU3MworICogc3RpbGwgdXNlIGl0LgorICogSW5pdGlhbGl6YXRpb24gb2YgdGhpcyBvbGQgY29yZSBkaWZmZXJzIGJldHdlZW4gTUlQUyBhbmQgQVJNLgorICovCitzdGF0aWMgaW50IGJjbWFfaGNkX3VzYjIwX29sZF9hcm1faW5pdChzdHJ1Y3QgYmNtYV9oY2RfZGV2aWNlICp1c2JfZGV2KQogewotCXN0cnVjdCBiY21hX2RldmljZSAqYXJtX2NvcmU7Ci0Jdm9pZCBfX2lvbWVtICpkbXU7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlID0gdXNiX2Rldi0+Y29yZTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY29yZS0+ZGV2OworCXN0cnVjdCBiY21hX2RldmljZSAqcG11X2NvcmU7CiAKLQlhcm1fY29yZSA9IGJjbWFfZmluZF9jb3JlKGRldi0+YnVzLCBCQ01BX0NPUkVfQVJNQ0E5KTsKLQlpZiAoIWFybV9jb3JlKSB7Ci0JCWRldl9lcnIoJmRldi0+ZGV2LCAiY2FuIG5vdCBmaW5kIEFSTSBDb3J0ZXggQTkgaWhvc3QgY29yZVxuIik7Ci0JCXJldHVybjsKKwl1c2xlZXBfcmFuZ2UoMTAwMDAsIDIwMDAwKTsKKwlpZiAoY29yZS0+aWQucmV2IDwgNSkKKwkJcmV0dXJuIDA7CisKKwlwbXVfY29yZSA9IGJjbWFfZmluZF9jb3JlKGNvcmUtPmJ1cywgQkNNQV9DT1JFX1BNVSk7CisJaWYgKCFwbXVfY29yZSkgeworCQlkZXZfZXJyKGRldiwgIkNvdWxkIG5vdCBmaW5kIFBNVSBjb3JlXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JZG11ID0gaW9yZW1hcF9ub2NhY2hlKGFybV9jb3JlLT5hZGRyX3NbMF0sIDB4MTAwMCk7Ci0JaWYgKCFkbXUpIHsKLQkJZGV2X2VycigmZGV2LT5kZXYsICJjYW4gbm90IG1hcCBBUk0gQ29ydGV4IEE5IGlob3N0IGNvcmVcbiIpOwotCQlyZXR1cm47Ci0JfQorCS8qIFRha2UgVVNCIGNvcmUgb3V0IG9mIHJlc2V0ICovCisJYmNtYV9hd3JpdGUzMihjb3JlLCBCQ01BX0lPQ1RMLCBCQ01BX0lPQ1RMX0NMSyB8IEJDTUFfSU9DVExfRkdDKTsKKwl1c2xlZXBfcmFuZ2UoMTAwLCAyMDApOworCWJjbWFfYXdyaXRlMzIoY29yZSwgQkNNQV9SRVNFVF9DVEwsIEJDTUFfUkVTRVRfQ1RMX1JFU0VUKTsKKwl1c2xlZXBfcmFuZ2UoMTAwLCAyMDApOworCWJjbWFfYXdyaXRlMzIoY29yZSwgQkNNQV9SRVNFVF9DVEwsIDApOworCXVzbGVlcF9yYW5nZSgxMDAsIDIwMCk7CisJYmNtYV9hd3JpdGUzMihjb3JlLCBCQ01BX0lPQ1RMLCBCQ01BX0lPQ1RMX0NMSyk7CisJdXNsZWVwX3JhbmdlKDEwMCwgMjAwKTsKIAotCS8qIFVubG9jayBETVUgUExMIHNldHRpbmdzICovCi0JaW93cml0ZTMyKDB4MDAwMGVhNjgsIGRtdSArIDB4MTgwKTsKKwkvKiBFbmFibGUgTWlzYyBQTEwgKi8KKwliY21hX3dyaXRlMzIoY29yZSwgQkNNQV9DTEtDVExTVCwgQkNNQV9DTEtDVExTVF9GT1JDRUhUIHwKKwkJCQkJICBCQ01BX0NMS0NUTFNUX0hRQ0xLUkVRIHwKKwkJCQkJICBVU0JfQkNNQV9DTEtDVExTVF9VU0JfQ0xLX1JFUSk7CisJdXNsZWVwX3JhbmdlKDEwMCwgMjAwKTsKIAotCS8qIFdyaXRlIFVTQiAyLjAgUExMIGNvbnRyb2wgc2V0dGluZyAqLwotCWlvd3JpdGUzMigweDAwZGQxMGMzLCBkbXUgKyAweDE2NCk7CisJYmNtYV93cml0ZTMyKGNvcmUsIDB4NTEwLCAweGM3Zjg1MDAwKTsKKwliY21hX3dyaXRlMzIoY29yZSwgMHg1MTAsIDB4YzdmODUwMDMpOworCXVzbGVlcF9yYW5nZSgzMDAsIDYwMCk7CiAKLQkvKiBMb2NrIERNVSBQTEwgc2V0dGluZ3MgKi8KLQlpb3dyaXRlMzIoMHgwMDAwMDAwMCwgZG11ICsgMHgxODApOworCS8qIFByb2dyYW0gVVNCIFBIWSBQTEwgcGFyYW1ldGVycyAqLworCWJjbWFfd3JpdGUzMihwbXVfY29yZSwgQkNNQV9DQ19QTVVfUExMQ1RMX0FERFIsIDB4Nik7CisJYmNtYV93cml0ZTMyKHBtdV9jb3JlLCBCQ01BX0NDX1BNVV9QTExDVExfREFUQSwgMHgwMDUzNjBjMSk7CisJdXNsZWVwX3JhbmdlKDEwMCwgMjAwKTsKKwliY21hX3dyaXRlMzIocG11X2NvcmUsIEJDTUFfQ0NfUE1VX1BMTENUTF9BRERSLCAweDcpOworCWJjbWFfd3JpdGUzMihwbXVfY29yZSwgQkNNQV9DQ19QTVVfUExMQ1RMX0RBVEEsIDB4MCk7CisJdXNsZWVwX3JhbmdlKDEwMCwgMjAwKTsKKwliY21hX3NldDMyKHBtdV9jb3JlLCBCQ01BX0NDX1BNVV9DVEwsIEJDTUFfQ0NfUE1VX0NUTF9QTExfVVBEKTsKKwl1c2xlZXBfcmFuZ2UoMTAwLCAyMDApOwogCi0JaW91bm1hcChkbXUpOworCWJjbWFfd3JpdGUzMihjb3JlLCAweDUxMCwgMHg3ZjhkMDA3KTsKKwl1ZGVsYXkoMTAwMCk7CisKKwkvKiBUYWtlIGNvbnRyb2xsZXIgb3V0IG9mIHJlc2V0ICovCisJYmNtYV93cml0ZTMyKGNvcmUsIDB4MjAwLCAweDRmZik7CisJdXNsZWVwX3JhbmdlKDI1LCA1MCk7CisJYmNtYV93cml0ZTMyKGNvcmUsIDB4MjAwLCAweDZmZik7CisJdXNsZWVwX3JhbmdlKDI1LCA1MCk7CisJYmNtYV93cml0ZTMyKGNvcmUsIDB4MjAwLCAweDdmZik7CisJdXNsZWVwX3JhbmdlKDI1LCA1MCk7CisKKwlvZl9wbGF0Zm9ybV9kZWZhdWx0X3BvcHVsYXRlKGRldi0+b2Zfbm9kZSwgTlVMTCwgZGV2KTsKKworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBiY21hX2hjZF9pbml0X2NoaXBfYXJtX2hjKHN0cnVjdCBiY21hX2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgYmNtYV9oY2RfdXNiMjBfbnNfaW5pdF9oYyhzdHJ1Y3QgYmNtYV9kZXZpY2UgKmRldikKIHsKIAl1MzIgdmFsOwogCi0JLyoKLQkgKiBEZWxheSBhZnRlciBQSFkgaW5pdGlhbGl6ZWQgdG8gZW5zdXJlIEhDIGlzIHJlYWR5IHRvIGJlIGNvbmZpZ3VyZWQKLQkgKi8KLQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7Ci0KIAkvKiBTZXQgcGFja2V0IGJ1ZmZlciBPVVQgdGhyZXNob2xkICovCiAJdmFsID0gYmNtYV9yZWFkMzIoZGV2LCAweDk0KTsKIAl2YWwgJj0gMHhmZmZmOwpAQCAtMjEzLDIwICsyNTMsMzMgQEAKIAl2YWwgPSBiY21hX3JlYWQzMihkZXYsIDB4OWMpOwogCXZhbCB8PSAxOwogCWJjbWFfd3JpdGUzMihkZXYsIDB4OWMsIHZhbCk7CisKKwkvKgorCSAqIEJyb2FkY29tIGluaXRpYWxpemVzIFBIWSBhbmQgdGhlbiB3YWl0cyB0byBlbnN1cmUgSEMgaXMgcmVhZHkgdG8gYmUKKwkgKiBjb25maWd1cmVkLiBJbiBvdXIgY2FzZSB0aGUgb3JkZXIgaXMgcmV2ZXJzZWQuIFdlIGp1c3QgaW5pdGlhbGl6ZWQKKwkgKiBjb250cm9sbGVyIGFuZCB3ZSBsZXQgSENEIGluaXRpYWxpemUgUEhZLCBzbyBsZXQncyB3YWl0IChzbGVlcCkgbm93LgorCSAqLworCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKIH0KIAotc3RhdGljIHZvaWQgYmNtYV9oY2RfaW5pdF9jaGlwX2FybShzdHJ1Y3QgYmNtYV9kZXZpY2UgKmRldikKKy8qKgorICogYmNtYV9oY2RfdXNiMjBfbnNfaW5pdCAtIEluaXRpYWxpemUgTm9ydGhzdGFyIFVTQiAyLjAgY29udHJvbGxlcgorICovCitzdGF0aWMgaW50IGJjbWFfaGNkX3VzYjIwX25zX2luaXQoc3RydWN0IGJjbWFfaGNkX2RldmljZSAqYmNtYV9oY2QpCiB7Ci0JYmNtYV9jb3JlX2VuYWJsZShkZXYsIDApOworCXN0cnVjdCBiY21hX2RldmljZSAqY29yZSA9IGJjbWFfaGNkLT5jb3JlOworCXN0cnVjdCBiY21hX2NoaXBpbmZvICpjaSA9ICZjb3JlLT5idXMtPmNoaXBpbmZvOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjb3JlLT5kZXY7CiAKLQlpZiAoZGV2LT5idXMtPmNoaXBpbmZvLmlkID09IEJDTUFfQ0hJUF9JRF9CQ000NzA3IHx8Ci0JICAgIGRldi0+YnVzLT5jaGlwaW5mby5pZCA9PSBCQ01BX0NISVBfSURfQkNNNTMwMTgpIHsKLQkJaWYgKGRldi0+YnVzLT5jaGlwaW5mby5wa2cgPT0gQkNNQV9QS0dfSURfQkNNNDcwNyB8fAotCQkgICAgZGV2LT5idXMtPmNoaXBpbmZvLnBrZyA9PSBCQ01BX1BLR19JRF9CQ000NzA4KQotCQkJYmNtYV9oY2RfaW5pdF9jaGlwX2FybV9waHkoZGV2KTsKKwliY21hX2NvcmVfZW5hYmxlKGNvcmUsIDApOwogCi0JCWJjbWFfaGNkX2luaXRfY2hpcF9hcm1faGMoZGV2KTsKLQl9CisJaWYgKGNpLT5pZCA9PSBCQ01BX0NISVBfSURfQkNNNDcwNyB8fAorCSAgICBjaS0+aWQgPT0gQkNNQV9DSElQX0lEX0JDTTUzMDE4KQorCQliY21hX2hjZF91c2IyMF9uc19pbml0X2hjKGNvcmUpOworCisJb2ZfcGxhdGZvcm1fZGVmYXVsdF9wb3B1bGF0ZShkZXYtPm9mX25vZGUsIE5VTEwsIGRldik7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgYmNtYV9oY2lfcGxhdGZvcm1fcG93ZXJfZ3BpbyhzdHJ1Y3QgYmNtYV9kZXZpY2UgKmRldiwgYm9vbCB2YWwpCkBAIC0yOTksMTYgKzM1Miw3IEBACiAJaWYgKGRtYV9zZXRfbWFza19hbmRfY29oZXJlbnQoZGV2LT5kbWFfZGV2LCBETUFfQklUX01BU0soMzIpKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0Jc3dpdGNoIChkZXYtPmlkLmlkKSB7Ci0JY2FzZSBCQ01BX0NPUkVfTlNfVVNCMjA6Ci0JCWJjbWFfaGNkX2luaXRfY2hpcF9hcm0oZGV2KTsKLQkJYnJlYWs7Ci0JY2FzZSBCQ01BX0NPUkVfVVNCMjBfSE9TVDoKLQkJYmNtYV9oY2RfaW5pdF9jaGlwX21pcHMoZGV2KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQorCWJjbWFfaGNkX2luaXRfY2hpcF9taXBzKGRldik7CiAKIAkvKiBJbiBBSSBjaGlwcyBFSENJIGlzIGFkZHJzcGFjZSAwLCBPSENJIGlzIDEgKi8KIAlvaGNpX2FkZHIgPSBkZXYtPmFkZHJfc1swXTsKQEAgLTMzOCw2ICszODIsMTggQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IGJjbWFfaGNkX3VzYjMwX2luaXQoc3RydWN0IGJjbWFfaGNkX2RldmljZSAqYmNtYV9oY2QpCit7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlID0gYmNtYV9oY2QtPmNvcmU7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmNvcmUtPmRldjsKKworCWJjbWFfY29yZV9lbmFibGUoY29yZSwgMCk7CisKKwlvZl9wbGF0Zm9ybV9kZWZhdWx0X3BvcHVsYXRlKGRldi0+b2Zfbm9kZSwgTlVMTCwgZGV2KTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGJjbWFfaGNkX3Byb2JlKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSkKIHsKIAlpbnQgZXJyOwpAQCAtMzU3LDE0ICs0MTMsMjQgQEAKIAogCXN3aXRjaCAoY29yZS0+aWQuaWQpIHsKIAljYXNlIEJDTUFfQ09SRV9VU0IyMF9IT1NUOgorCQlpZiAoSVNfRU5BQkxFRChDT05GSUdfQVJNKSkKKwkJCWVyciA9IGJjbWFfaGNkX3VzYjIwX29sZF9hcm1faW5pdCh1c2JfZGV2KTsKKwkJZWxzZSBpZiAoSVNfRU5BQkxFRChDT05GSUdfTUlQUykpCisJCQllcnIgPSBiY21hX2hjZF91c2IyMF9pbml0KHVzYl9kZXYpOworCQllbHNlCisJCQllcnIgPSAtRU5PVFNVUFA7CisJCWJyZWFrOwogCWNhc2UgQkNNQV9DT1JFX05TX1VTQjIwOgotCQllcnIgPSBiY21hX2hjZF91c2IyMF9pbml0KHVzYl9kZXYpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKKwkJZXJyID0gYmNtYV9oY2RfdXNiMjBfbnNfaW5pdCh1c2JfZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBCQ01BX0NPUkVfTlNfVVNCMzA6CisJCWVyciA9IGJjbWFfaGNkX3VzYjMwX2luaXQodXNiX2Rldik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PREVWOwogCX0KKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCiAJYmNtYV9zZXRfZHJ2ZGF0YShjb3JlLCB1c2JfZGV2KTsKIAlyZXR1cm4gMDsKQEAgLTQxNiw2ICs0ODIsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBiY21hX2RldmljZV9pZCBiY21hX2hjZF90YWJsZVtdID0gewogCUJDTUFfQ09SRShCQ01BX01BTlVGX0JDTSwgQkNNQV9DT1JFX1VTQjIwX0hPU1QsIEJDTUFfQU5ZX1JFViwgQkNNQV9BTllfQ0xBU1MpLAogCUJDTUFfQ09SRShCQ01BX01BTlVGX0JDTSwgQkNNQV9DT1JFX05TX1VTQjIwLCBCQ01BX0FOWV9SRVYsIEJDTUFfQU5ZX0NMQVNTKSwKKwlCQ01BX0NPUkUoQkNNQV9NQU5VRl9CQ00sIEJDTUFfQ09SRV9OU19VU0IzMCwgQkNNQV9BTllfUkVWLCBCQ01BX0FOWV9DTEFTUyksCiAJe30sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShiY21hLCBiY21hX2hjZF90YWJsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMKaW5kZXggYTk2MmI4OS4uMWU1ZjUyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYwpAQCAtMzMyLDExICszMzIsMTEgQEAKIAlpbnQJcG9ydCA9IEhDU19OX1BPUlRTKGVoY2ktPmhjc19wYXJhbXMpOwogCiAJd2hpbGUgKHBvcnQtLSkgewotCQllaGNpX3dyaXRlbChlaGNpLCBQT1JUX1JXQ19CSVRTLAotCQkJCSZlaGNpLT5yZWdzLT5wb3J0X3N0YXR1c1twb3J0XSk7CiAJCXNwaW5fdW5sb2NrX2lycSgmZWhjaS0+bG9jayk7CiAJCWVoY2lfcG9ydF9wb3dlcihlaGNpLCBwb3J0LCBmYWxzZSk7CiAJCXNwaW5fbG9ja19pcnEoJmVoY2ktPmxvY2spOworCQllaGNpX3dyaXRlbChlaGNpLCBQT1JUX1JXQ19CSVRTLAorCQkJCSZlaGNpLT5yZWdzLT5wb3J0X3N0YXR1c1twb3J0XSk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcGxhdGZvcm0uYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wbGF0Zm9ybS5jCmluZGV4IDY4MTZiOGMuLjg3NmRjYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wbGF0Zm9ybS5jCkBAIC0zOCw3ICszOCw3IEBACiAjaW5jbHVkZSAiZWhjaS5oIgogCiAjZGVmaW5lIERSSVZFUl9ERVNDICJFSENJIGdlbmVyaWMgcGxhdGZvcm0gZHJpdmVyIgotI2RlZmluZSBFSENJX01BWF9DTEtTIDMKKyNkZWZpbmUgRUhDSV9NQVhfQ0xLUyA0CiAjZGVmaW5lIEVIQ0lfTUFYX1JTVFMgMwogI2RlZmluZSBoY2RfdG9fZWhjaV9wcml2KGgpICgoc3RydWN0IGVoY2lfcGxhdGZvcm1fcHJpdiAqKWhjZF90b19laGNpKGgpLT5wcml2KQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2ZoY2ktaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2ZoY2ktaGNkLmMKaW5kZXggMDk2MGY0MS4uNTVhMGFlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9maGNpLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZmhjaS1oY2QuYwpAQCAtMzEwLDEwICszMTAsOCBAQAogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBTQ0MgZGF0YSBzdHJ1Y3R1cmUgKi8KIAl1c2IgPSBremFsbG9jKHNpemVvZigqdXNiKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF1c2IpIHsKLQkJZmhjaV9lcnIoZmhjaSwgIm5vIG1lbW9yeSBmb3IgU0NDIGRhdGEgc3RydWN0XG4iKTsKKwlpZiAoIXVzYikKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJdXNiLT5maGNpID0gZmhjaTsKIAl1c2ItPmhjX2xpc3QgPSBmaGNpLT5oY19saXN0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9mc2wtbXBoLWRyLW9mLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2ZzbC1tcGgtZHItb2YuYwppbmRleCAxMDQ0YjBmLi5mMDdjY2IyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2ZzbC1tcGgtZHItb2YuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2ZzbC1tcGgtZHItb2YuYwpAQCAtMjIyLDIzICsyMjIsMTcgQEAKIAlwZGF0YS0+Y29udHJvbGxlcl92ZXIgPSB1c2JfZ2V0X3Zlcl9pbmZvKG5wKTsKIAogCS8qIEFjdGl2YXRlIEVycmF0dW0gYnkgcmVhZGluZyBwcm9wZXJ0eSBpbiBkZXZpY2UgdHJlZSAqLwotCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJmc2wsdXNiLWVycmF0dW0tYTAwNzc5MiIsIE5VTEwpKQotCQlwZGF0YS0+aGFzX2ZzbF9lcnJhdHVtX2EwMDc3OTIgPSAxOwotCWVsc2UKLQkJcGRhdGEtPmhhc19mc2xfZXJyYXR1bV9hMDA3NzkyID0gMDsKLQlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZnNsLHVzYi1lcnJhdHVtLWEwMDUyNzUiLCBOVUxMKSkKLQkJcGRhdGEtPmhhc19mc2xfZXJyYXR1bV9hMDA1Mjc1ID0gMTsKLQllbHNlCi0JCXBkYXRhLT5oYXNfZnNsX2VycmF0dW1fYTAwNTI3NSA9IDA7CisJcGRhdGEtPmhhc19mc2xfZXJyYXR1bV9hMDA3NzkyID0KKwkJb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiZnNsLHVzYi1lcnJhdHVtLWEwMDc3OTIiKTsKKwlwZGF0YS0+aGFzX2ZzbF9lcnJhdHVtX2EwMDUyNzUgPQorCQlvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJmc2wsdXNiLWVycmF0dW0tYTAwNTI3NSIpOwogCiAJLyoKIAkgKiBEZXRlcm1pbmUgd2hldGhlciBwaHlfY2xrX3ZhbGlkIG5lZWRzIHRvIGJlIGNoZWNrZWQKIAkgKiBieSByZWFkaW5nIHByb3BlcnR5IGluIGRldmljZSB0cmVlCiAJICovCi0JaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgInBoeS1jbGstdmFsaWQiLCBOVUxMKSkKLQkJcGRhdGEtPmNoZWNrX3BoeV9jbGtfdmFsaWQgPSAxOwotCWVsc2UKLQkJcGRhdGEtPmNoZWNrX3BoeV9jbGtfdmFsaWQgPSAwOworCXBkYXRhLT5jaGVja19waHlfY2xrX3ZhbGlkID0KKwkJb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAicGh5LWNsay12YWxpZCIpOwogCiAJaWYgKHBkYXRhLT5oYXZlX3N5c2lmX3JlZ3MpIHsKIAkJaWYgKHBkYXRhLT5jb250cm9sbGVyX3ZlciA9PSBGU0xfVVNCX1ZFUl9OT05FKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L21heDM0MjEtaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L21heDM0MjEtaGNkLmMKaW5kZXggYzM2OWMyOS4uMzY5ODY5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9tYXgzNDIxLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvbWF4MzQyMS1oY2QuYwpAQCAtMTY3NSw3ICsxNjc1LDcgQEAKIAlpZiAocGluX251bWJlciA+IDcpCiAJCXJldHVybjsKIAotCW1hc2sgPSAxdSA8PCBwaW5fbnVtYmVyOworCW1hc2sgPSAxdSA8PCAocGluX251bWJlciAlIDQpOwogCWlkeCA9IHBpbl9udW1iZXIgLyA0OwogCiAJaWYgKHZhbHVlKQpAQCAtMTg1NiwxNSArMTg1NiwxMSBAQAogCUlOSVRfTElTVF9IRUFEKCZtYXgzNDIxX2hjZC0+ZXBfbGlzdCk7CiAKIAltYXgzNDIxX2hjZC0+dHggPSBrbWFsbG9jKHNpemVvZigqbWF4MzQyMV9oY2QtPnR4KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtYXgzNDIxX2hjZC0+dHgpIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICJmYWlsZWQgdG8ga21hbGxvYyB0eCBidWZmZXJcbiIpOworCWlmICghbWF4MzQyMV9oY2QtPnR4KQogCQlnb3RvIGVycm9yOwotCX0KIAltYXgzNDIxX2hjZC0+cnggPSBrbWFsbG9jKHNpemVvZigqbWF4MzQyMV9oY2QtPnJ4KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtYXgzNDIxX2hjZC0+cngpIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICJmYWlsZWQgdG8ga21hbGxvYyByeCBidWZmZXJcbiIpOworCWlmICghbWF4MzQyMV9oY2QtPnJ4KQogCQlnb3RvIGVycm9yOwotCX0KIAogCW1heDM0MjFfaGNkLT5zcGlfdGhyZWFkID0ga3RocmVhZF9ydW4obWF4MzQyMV9zcGlfdGhyZWFkLCBoY2QsCiAJCQkJCSAgICAgICJtYXgzNDIxX3NwaV90aHJlYWQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1hdDkxLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktYXQ5MS5jCmluZGV4IGQxNzczNzIuLjViNTg4MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1hdDkxLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWF0OTEuYwpAQCAtMjEsOCArMjEsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9zeXNjb24uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvaGNkLmg+CisjaW5jbHVkZSA8c29jL2F0OTEvYXRtZWwtc2ZyLmg+CiAKICNpbmNsdWRlICJvaGNpLmgiCiAKQEAgLTUxLDYgKzU0LDcgQEAKIAlzdHJ1Y3QgY2xrICpoY2xrOwogCWJvb2wgY2xvY2tlZDsKIAlib29sIHdha2V1cDsJCS8qIFNhdmVkIHdha2UtdXAgc3RhdGUgZm9yIHJlc3VtZSAqLworCXN0cnVjdCByZWdtYXAgKnNmcl9yZWdtYXA7CiB9OwogLyogaW50ZXJmYWNlIGFuZCBmdW5jdGlvbiBjbG9ja3M7IHNvbWV0aW1lcyBhbHNvIGFuIEFIQiBjbG9jayAqLwogCkBAIC0xMzQsNiArMTM4LDE3IEBACiAKIHN0YXRpYyB2b2lkIHVzYl9oY2RfYXQ5MV9yZW1vdmUgKHN0cnVjdCB1c2JfaGNkICosIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKik7CiAKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwICphdDkxX2R0X3N5c2Nvbl9zZnIodm9pZCkKK3sKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisKKwlyZWdtYXAgPSBzeXNjb25fcmVnbWFwX2xvb2t1cF9ieV9jb21wYXRpYmxlKCJhdG1lbCxzYW1hNWQyLXNmciIpOworCWlmIChJU19FUlIocmVnbWFwKSkKKwkJcmVnbWFwID0gTlVMTDsKKworCXJldHVybiByZWdtYXA7Cit9CisKIC8qIGNvbmZpZ3VyZSBzbyBhbiBIQyBkZXZpY2UgYW5kIGlkIGFyZSBhbHdheXMgcHJvdmlkZWQgKi8KIC8qIGFsd2F5cyBjYWxsZWQgd2l0aCBwcm9jZXNzIGNvbnRleHQ7IHNsZWVwaW5nIGlzIE9LICovCiAKQEAgLTE5Nyw2ICsyMTIsMTAgQEAKIAkJZ290byBlcnI7CiAJfQogCisJb2hjaV9hdDkxLT5zZnJfcmVnbWFwID0gYXQ5MV9kdF9zeXNjb25fc2ZyKCk7CisJaWYgKCFvaGNpX2F0OTEtPnNmcl9yZWdtYXApCisJCWRldl93YXJuKGRldiwgImZhaWxlZCB0byBmaW5kIHNmciBub2RlXG4iKTsKKwogCWJvYXJkID0gaGNkLT5zZWxmLmNvbnRyb2xsZXItPnBsYXRmb3JtX2RhdGE7CiAJb2hjaSA9IGhjZF90b19vaGNpKGhjZCk7CiAJb2hjaS0+bnVtX3BvcnRzID0gYm9hcmQtPnBvcnRzOwpAQCAtMjgyLDYgKzMwMSwyOCBAQAogCXJldHVybiBsZW5ndGg7CiB9CiAKK3N0YXRpYyBpbnQgb2hjaV9hdDkxX3BvcnRfc3VzcGVuZChzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIHU4IHNldCkKK3sKKwl1MzIgcmVndmFsOworCWludCByZXQ7CisKKwlpZiAoIXJlZ21hcCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIEFUOTFfU0ZSX09IQ0lJQ1IsICZyZWd2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoc2V0KQorCQlyZWd2YWwgfD0gQVQ5MV9PSENJSUNSX1VTQl9TVVNQRU5EOworCWVsc2UKKwkJcmVndmFsICY9IH5BVDkxX09IQ0lJQ1JfVVNCX1NVU1BFTkQ7CisKKwlyZWdtYXBfd3JpdGUocmVnbWFwLCBBVDkxX1NGUl9PSENJSUNSLCByZWd2YWwpOworCisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBMb29rIGF0IHRoZSBjb250cm9sIHJlcXVlc3RzIHRvIHRoZSByb290IGh1YiBhbmQgc2VlIGlmIHdlIG5lZWQgdG8gb3ZlcnJpZGUuCiAgKi8KQEAgLTI4OSw2ICszMzAsNyBAQAogCQkJCSB1MTYgd0luZGV4LCBjaGFyICpidWYsIHUxNiB3TGVuZ3RoKQogewogCXN0cnVjdCBhdDkxX3VzYmhfZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGhjZC0+c2VsZi5jb250cm9sbGVyKTsKKwlzdHJ1Y3Qgb2hjaV9hdDkxX3ByaXYgKm9oY2lfYXQ5MSA9IGhjZF90b19vaGNpX2F0OTFfcHJpdihoY2QpOwogCXN0cnVjdCB1c2JfaHViX2Rlc2NyaXB0b3IgKmRlc2M7CiAJaW50IHJldCA9IC1FSU5WQUw7CiAJdTMyICpkYXRhID0gKHUzMiAqKWJ1ZjsKQEAgLTMwMSw3ICszNDMsOCBAQAogCiAJc3dpdGNoICh0eXBlUmVxKSB7CiAJY2FzZSBTZXRQb3J0RmVhdHVyZToKLQkJaWYgKHdWYWx1ZSA9PSBVU0JfUE9SVF9GRUFUX1BPV0VSKSB7CisJCXN3aXRjaCAod1ZhbHVlKSB7CisJCWNhc2UgVVNCX1BPUlRfRkVBVF9QT1dFUjoKIAkJCWRldl9kYmcoaGNkLT5zZWxmLmNvbnRyb2xsZXIsICJTZXRQb3J0RmVhdDogUE9XRVJcbiIpOwogCQkJaWYgKHZhbGlkX3BvcnQod0luZGV4KSkgewogCQkJCW9oY2lfYXQ5MV91c2Jfc2V0X3Bvd2VyKHBkYXRhLCB3SW5kZXgsIDEpOwpAQCAtMzA5LDYgKzM1MiwxNSBAQAogCQkJfQogCiAJCQlnb3RvIG91dDsKKworCQljYXNlIFVTQl9QT1JUX0ZFQVRfU1VTUEVORDoKKwkJCWRldl9kYmcoaGNkLT5zZWxmLmNvbnRyb2xsZXIsICJTZXRQb3J0RmVhdDogU1VTUEVORFxuIik7CisJCQlpZiAodmFsaWRfcG9ydCh3SW5kZXgpKSB7CisJCQkJb2hjaV9hdDkxX3BvcnRfc3VzcGVuZChvaGNpX2F0OTEtPnNmcl9yZWdtYXAsCisJCQkJCQkgICAgICAgMSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlicmVhazsKIAkJfQogCQlicmVhazsKIApAQCAtMzQyLDYgKzM5NCwxNiBAQAogCQkJCW9oY2lfYXQ5MV91c2Jfc2V0X3Bvd2VyKHBkYXRhLCB3SW5kZXgsIDApOwogCQkJCXJldHVybiAwOwogCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX1NVU1BFTkQ6CisJCQlkZXZfZGJnKGhjZC0+c2VsZi5jb250cm9sbGVyLCAiQ2xlYXJQb3J0RmVhdHVyZTogU1VTUEVORFxuIik7CisJCQlpZiAodmFsaWRfcG9ydCh3SW5kZXgpKSB7CisJCQkJb2hjaV9hdDkxX3BvcnRfc3VzcGVuZChvaGNpX2F0OTEtPnNmcl9yZWdtYXAsCisJCQkJCQkgICAgICAgMCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlicmVhazsKIAkJfQogCQlicmVhazsKIAl9CkBAIC01OTksNiArNjYxLDggQEAKIAlpZiAob2hjaV9hdDkxLT53YWtldXApCiAJCWVuYWJsZV9pcnFfd2FrZShoY2QtPmlycSk7CiAKKwlvaGNpX2F0OTFfcG9ydF9zdXNwZW5kKG9oY2lfYXQ5MS0+c2ZyX3JlZ21hcCwgMSk7CisKIAlyZXQgPSBvaGNpX3N1c3BlbmQoaGNkLCBvaGNpX2F0OTEtPndha2V1cCk7CiAJaWYgKHJldCkgewogCQlpZiAob2hjaV9hdDkxLT53YWtldXApCkBAIC02MzgsNiArNzAyLDkgQEAKIAlhdDkxX3N0YXJ0X2Nsb2NrKG9oY2lfYXQ5MSk7CiAKIAlvaGNpX3Jlc3VtZShoY2QsIGZhbHNlKTsKKworCW9oY2lfYXQ5MV9wb3J0X3N1c3BlbmQob2hjaV9hdDkxLT5zZnJfcmVnbWFwLCAwKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktb21hcC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLW9tYXAuYwppbmRleCBkZTdjNjg2Li40OTVjMTQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktb21hcC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1vbWFwLmMKQEAgLTM2LDcgKzM2LDYgQEAKICNpbmNsdWRlIDxtYWNoL211eC5oPgogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogI2luY2x1ZGUgPG1hY2gvdXNiLmg+CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXNhMTExMS5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXNhMTExMS5jCmluZGV4IDJhYzI2NmQuLjNhOWVhMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zYTExMTEuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktc2ExMTExLmMKQEAgLTEzLDkgKzEzLDcgQEAKICAqIFRoaXMgZmlsZSBpcyBsaWNlbmNlZCB1bmRlciB0aGUgR1BMLgogICovCiAKLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxtYWNoL2Fzc2FiZXQuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvc2ExMTExLmg+CiAKICNpZm5kZWYgQ09ORklHX1NBMTExMQpAQCAtMTI3LDcgKzEyNSw3IEBACiAJZGV2X2RiZygmZGV2LT5kZXYsICJzdGFydGluZyBTQS0xMTExIE9IQ0kgVVNCIENvbnRyb2xsZXJcbiIpOwogCiAJaWYgKG1hY2hpbmVfaXNfeHA4NjAoKSB8fAotCSAgICBtYWNoaW5lX2hhc19uZXBvbnNldCgpIHx8CisJICAgIG1hY2hpbmVfaXNfYXNzYWJldCgpIHx8CiAJICAgIG1hY2hpbmVfaXNfcGZzMTY4KCkgfHwKIAkgICAgbWFjaGluZV9pc19iYWRnZTQoKSkKIAkJdXNiX3JzdCA9IFVTQl9SRVNFVF9QV1JTRU5TRUxPVyB8IFVTQl9SRVNFVF9QV1JDVFJMTE9XOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC91aGNpLWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC91aGNpLWhjZC5jCmluZGV4IGE3ZGU4ZTguLjVkM2Q5MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaGNkLmMKQEAgLTYwMSwxMSArNjAxLDggQEAKIAogCXVoY2ktPmZyYW1lX2NwdSA9IGtjYWxsb2MoVUhDSV9OVU1GUkFNRVMsIHNpemVvZigqdWhjaS0+ZnJhbWVfY3B1KSwKIAkJCUdGUF9LRVJORUwpOwotCWlmICghdWhjaS0+ZnJhbWVfY3B1KSB7Ci0JCWRldl9lcnIodWhjaV9kZXYodWhjaSksCi0JCQkidW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZnJhbWUgcG9pbnRlcnNcbiIpOworCWlmICghdWhjaS0+ZnJhbWVfY3B1KQogCQlnb3RvIGVycl9hbGxvY19mcmFtZV9jcHU7Ci0JfQogCiAJdWhjaS0+dGRfcG9vbCA9IGRtYV9wb29sX2NyZWF0ZSgidWhjaV90ZCIsIHVoY2lfZGV2KHVoY2kpLAogCQkJc2l6ZW9mKHN0cnVjdCB1aGNpX3RkKSwgMTYsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC93aGNpL2luaXQuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9pbml0LmMKaW5kZXggZTM2MzcyMy4uYWQ4ZWI1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC93aGNpL2luaXQuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3doY2kvaW5pdC5jCkBAIC02NSw3ICs2NSw3IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmd2hjLT5jbWRfd3EpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJndoYy0+YXN5bmNfbGlzdF93cSk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmd2hjLT5wZXJpb2RpY19saXN0X3dxKTsKLQl3aGMtPndvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKGRldl9uYW1lKCZ3aGMtPnVtYy0+ZGV2KSk7CisJd2hjLT53b3JrcXVldWUgPSBhbGxvY19vcmRlcmVkX3dvcmtxdWV1ZShkZXZfbmFtZSgmd2hjLT51bWMtPmRldiksIDApOwogCWlmICh3aGMtPndvcmtxdWV1ZSA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktaHViLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktaHViLmMKaW5kZXggZDYxZmNjNC4uNzMwYjlmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLWh1Yi5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1odWIuYwpAQCAtMzg2LDYgKzM4Niw5IEBACiAKIAlyZXQgPSAwOwogCXZpcnRfZGV2ID0geGhjaS0+ZGV2c1tzbG90X2lkXTsKKwlpZiAoIXZpcnRfZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCWNtZCA9IHhoY2lfYWxsb2NfY29tbWFuZCh4aGNpLCBmYWxzZSwgdHJ1ZSwgR0ZQX05PSU8pOwogCWlmICghY21kKSB7CiAJCXhoY2lfZGJnKHhoY2ksICJDb3VsZG4ndCBhbGxvY2F0ZSBjb21tYW5kIHN0cnVjdHVyZS5cbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLXBjaS5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXBjaS5jCmluZGV4IDRmZDA0MWIuLmQ3YjBmOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wY2kuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGNpLmMKQEAgLTMxNCwxMSArMzE0LDEyIEBACiAJCXVzYl9yZW1vdmVfaGNkKHhoY2ktPnNoYXJlZF9oY2QpOwogCQl1c2JfcHV0X2hjZCh4aGNpLT5zaGFyZWRfaGNkKTsKIAl9Ci0JdXNiX2hjZF9wY2lfcmVtb3ZlKGRldik7CiAKIAkvKiBXb3JrYXJvdW5kIGZvciBzcHVyaW91cyB3YWtldXBzIGF0IHNodXRkb3duIHdpdGggSFNXICovCiAJaWYgKHhoY2ktPnF1aXJrcyAmIFhIQ0lfU1BVUklPVVNfV0FLRVVQKQogCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKGRldiwgUENJX0QzaG90KTsKKworCXVzYl9oY2RfcGNpX3JlbW92ZShkZXYpOwogfQogCiAjaWZkZWYgQ09ORklHX1BNCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcmluZy5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXJpbmcuYwppbmRleCA5MThlMGM3Li43OTcxMzdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcmluZy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1yaW5nLmMKQEAgLTg1MCw2ICs4NTAsMTAgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmeGhjaS0+bG9jaywgZmxhZ3MpOwogCiAJZXAtPnN0b3BfY21kc19wZW5kaW5nLS07CisJaWYgKHhoY2ktPnhoY19zdGF0ZSAmIFhIQ0lfU1RBVEVfUkVNT1ZJTkcpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeGhjaS0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQogCWlmICh4aGNpLT54aGNfc3RhdGUgJiBYSENJX1NUQVRFX0RZSU5HKSB7CiAJCXhoY2lfZGJnX3RyYWNlKHhoY2ksIHRyYWNlX3hoY2lfZGJnX2NhbmNlbF91cmIsCiAJCQkJIlN0b3AgRVAgdGltZXIgcmFuLCBidXQgYW5vdGhlciB0aW1lciBtYXJrZWQgIgpAQCAtOTAzLDcgKzkwNyw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeGhjaS0+bG9jaywgZmxhZ3MpOwogCXhoY2lfZGJnX3RyYWNlKHhoY2ksIHRyYWNlX3hoY2lfZGJnX2NhbmNlbF91cmIsCiAJCQkiQ2FsbGluZyB1c2JfaGNfZGllZCgpIik7Ci0JdXNiX2hjX2RpZWQoeGhjaV90b19oY2QoeGhjaSktPnByaW1hcnlfaGNkKTsKKwl1c2JfaGNfZGllZCh4aGNpX3RvX2hjZCh4aGNpKSk7CiAJeGhjaV9kYmdfdHJhY2UoeGhjaSwgdHJhY2VfeGhjaV9kYmdfY2FuY2VsX3VyYiwKIAkJCSJ4SENJIGhvc3QgY29udHJvbGxlciBpcyBkZWFkLiIpOwogfQpAQCAtMTMzNCwxMiArMTMzOCw2IEBACiAKIAljbWQgPSBsaXN0X2VudHJ5KHhoY2ktPmNtZF9saXN0Lm5leHQsIHN0cnVjdCB4aGNpX2NvbW1hbmQsIGNtZF9saXN0KTsKIAotCWlmIChjbWQtPmNvbW1hbmRfdHJiICE9IHhoY2ktPmNtZF9yaW5nLT5kZXF1ZXVlKSB7Ci0JCXhoY2lfZXJyKHhoY2ksCi0JCQkgIkNvbW1hbmQgY29tcGxldGlvbiBldmVudCBkb2VzIG5vdCBtYXRjaCBjb21tYW5kXG4iKTsKLQkJcmV0dXJuOwotCX0KLQogCWRlbF90aW1lcigmeGhjaS0+Y21kX3RpbWVyKTsKIAogCXRyYWNlX3hoY2lfY21kX2NvbXBsZXRpb24oY21kX3RyYiwgKHN0cnVjdCB4aGNpX2dlbmVyaWNfdHJiICopIGV2ZW50KTsKQEAgLTEzNTEsNiArMTM0OSwxMyBAQAogCQl4aGNpX2hhbmRsZV9zdG9wcGVkX2NtZF9yaW5nKHhoY2ksIGNtZCk7CiAJCXJldHVybjsKIAl9CisKKwlpZiAoY21kLT5jb21tYW5kX3RyYiAhPSB4aGNpLT5jbWRfcmluZy0+ZGVxdWV1ZSkgeworCQl4aGNpX2Vycih4aGNpLAorCQkJICJDb21tYW5kIGNvbXBsZXRpb24gZXZlbnQgZG9lcyBub3QgbWF0Y2ggY29tbWFuZFxuIik7CisJCXJldHVybjsKKwl9CisKIAkvKgogCSAqIEhvc3QgYWJvcnRlZCB0aGUgY29tbWFuZCByaW5nLCBjaGVjayBpZiB0aGUgY3VycmVudCBjb21tYW5kIHdhcwogCSAqIHN1cHBvc2VkIHRvIGJlIGFib3J0ZWQsIG90aGVyd2lzZSBjb250aW51ZSBub3JtYWxseS4KQEAgLTMyNDMsNyArMzI0OCw4IEBACiAJc2VuZF9hZGRyID0gYWRkcjsKIAogCS8qIFF1ZXVlIHRoZSBUUkJzLCBldmVuIGlmIHRoZXkgYXJlIHplcm8tbGVuZ3RoICovCi0JZm9yIChlbnFkX2xlbiA9IDA7IGVucWRfbGVuIDwgZnVsbF9sZW47IGVucWRfbGVuICs9IHRyYl9idWZmX2xlbikgeworCWZvciAoZW5xZF9sZW4gPSAwOyBmaXJzdF90cmIgfHwgZW5xZF9sZW4gPCBmdWxsX2xlbjsKKwkJCWVucWRfbGVuICs9IHRyYl9idWZmX2xlbikgewogCQlmaWVsZCA9IFRSQl9UWVBFKFRSQl9OT1JNQUwpOwogCiAJCS8qIFRSQiBidWZmZXIgc2hvdWxkIG5vdCBjcm9zcyA2NEtCIGJvdW5kYXJpZXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS10ZWdyYS5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXRlZ3JhLmMKaW5kZXggMGY1M2FlMC4uYTU5ZmFmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLXRlZ3JhLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXRlZ3JhLmMKQEAgLTEwMzMsNyArMTAzMyw2IEBACiAJdGVncmEtPnBoeXMgPSBkZXZtX2tjYWxsb2MoJnBkZXYtPmRldiwgdGVncmEtPm51bV9waHlzLAogCQkJCSAgIHNpemVvZigqdGVncmEtPnBoeXMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRlZ3JhLT5waHlzKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBQSFkgYXJyYXlcbiIpOwogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIHB1dF9wYWRjdGw7CiAJfQpAQCAtMTExNyw2ICsxMTE2LDcgQEAKIAkJCQkJCSB0ZWdyYS0+aGNkKTsKIAlpZiAoIXhoY2ktPnNoYXJlZF9oY2QpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBzaGFyZWQgSENEXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKIAkJZ290byByZW1vdmVfdXNiMjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLmMKaW5kZXggMDFkOTZjOS4uMWE0Y2EwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLmMKQEAgLTI5NSwxMCArMjk1LDggQEAKIAl4aGNpLT5tc2l4X2VudHJpZXMgPQogCQlrbWFsbG9jKChzaXplb2Yoc3RydWN0IG1zaXhfZW50cnkpKSp4aGNpLT5tc2l4X2NvdW50LAogCQkJCUdGUF9LRVJORUwpOwotCWlmICgheGhjaS0+bXNpeF9lbnRyaWVzKSB7Ci0JCXhoY2lfZXJyKHhoY2ksICJGYWlsZWQgdG8gYWxsb2NhdGUgTVNJLVggZW50cmllc1xuIik7CisJaWYgKCF4aGNpLT5tc2l4X2VudHJpZXMpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWZvciAoaSA9IDA7IGkgPCB4aGNpLT5tc2l4X2NvdW50OyBpKyspIHsKIAkJeGhjaS0+bXNpeF9lbnRyaWVzW2ldLmVudHJ5ID0gaTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL21pc2MvS2NvbmZpZwppbmRleCBlYjhmOGQzLi40N2IzNTc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvbWlzYy9LY29uZmlnCkBAIC0yNDAsNiArMjQwLDEyIEBACiAgICAgICAgaGVscAogICAgICAgICAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBTTVNDIFVTQjM1MDMgSFNJQyB0byBVU0IgMi4wIERyaXZlci4KIAorY29uZmlnIFVTQl9IU0lDX1VTQjQ2MDQKKyAgICAgICB0cmlzdGF0ZSAiVVNCNDYwNCBIU0lDIHRvIFVTQjIwIERyaXZlciIKKyAgICAgICBkZXBlbmRzIG9uIEkyQworICAgICAgIGhlbHAKKyAgICAgICAgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgU01TQyBVU0I0NjA0IEhTSUMgdG8gVVNCIDIuMCBEcml2ZXIuCisKIGNvbmZpZyBVU0JfTElOS19MQVlFUl9URVNUCiAJdHJpc3RhdGUgIlVTQiBMaW5rIExheWVyIFRlc3QgZHJpdmVyIgogCWhlbHAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9taXNjL01ha2VmaWxlCmluZGV4IDNkNzlmYWEuLjNkMTk5MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvbWlzYy9NYWtlZmlsZQpAQCAtMjQsNiArMjQsNyBAQAogb2JqLSQoQ09ORklHX1VTQl9TRVZTRUcpCQkrPSB1c2JzZXZzZWcubwogb2JqLSQoQ09ORklHX1VTQl9ZVVJFWCkJCQkrPSB5dXJleC5vCiBvYmotJChDT05GSUdfVVNCX0hTSUNfVVNCMzUwMykJCSs9IHVzYjM1MDMubworb2JqLSQoQ09ORklHX1VTQl9IU0lDX1VTQjQ2MDQpCQkrPSB1c2I0NjA0Lm8KIG9iai0kKENPTkZJR19VU0JfQ0hBT1NLRVkpCQkrPSBjaGFvc2tleS5vCiBvYmotJChDT05GSUdfVUNTSSkJCQkrPSB1Y3NpLm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9hZHV0dXguYyBiL2RyaXZlcnMvdXNiL21pc2MvYWR1dHV4LmMKaW5kZXggMzA3MWMwZS4uNTY0MjY4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9hZHV0dXguYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2FkdXR1eC5jCkBAIC02NzIsOCArNjcyLDcgQEAKIAogCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGRldmljZSBzdGF0ZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLwogCWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZHVfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRldiA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiT3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCFkZXYpIHsKIAkJcmV0dmFsID0gLUVOT01FTTsKIAkJZ290byBleGl0OwogCX0KQEAgLTcxMCw3ICs3MDksNiBAQAogCiAJZGV2LT5yZWFkX2J1ZmZlcl9wcmltYXJ5ID0ga21hbGxvYygoNCAqIGluX2VuZF9zaXplKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkZXYtPnJlYWRfYnVmZmVyX3ByaW1hcnkpIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSByZWFkX2J1ZmZlcl9wcmltYXJ5XG4iKTsKIAkJcmV0dmFsID0gLUVOT01FTTsKIAkJZ290byBlcnJvcjsKIAl9CkBAIC03MjMsNyArNzIxLDYgQEAKIAogCWRldi0+cmVhZF9idWZmZXJfc2Vjb25kYXJ5ID0ga21hbGxvYygoNCAqIGluX2VuZF9zaXplKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkZXYtPnJlYWRfYnVmZmVyX3NlY29uZGFyeSkgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIHJlYWRfYnVmZmVyX3NlY29uZGFyeVxuIik7CiAJCXJldHZhbCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3I7CiAJfQpAQCAtNzM1LDI5ICs3MzIsMjEgQEAKIAltZW1zZXQoZGV2LT5yZWFkX2J1ZmZlcl9zZWNvbmRhcnkgKyAoMyAqIGluX2VuZF9zaXplKSwgJ2gnLCBpbl9lbmRfc2l6ZSk7CiAKIAlkZXYtPmludGVycnVwdF9pbl9idWZmZXIgPSBrbWFsbG9jKGluX2VuZF9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldi0+aW50ZXJydXB0X2luX2J1ZmZlcikgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdF9pbl9idWZmZXJcbiIpOworCWlmICghZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyKQogCQlnb3RvIGVycm9yOwotCX0KIAogCS8qIGRlYnVnIGNvZGUgcHJpbWUgdGhlIGJ1ZmZlciAqLwogCW1lbXNldChkZXYtPmludGVycnVwdF9pbl9idWZmZXIsICdpJywgaW5fZW5kX3NpemUpOwogCiAJZGV2LT5pbnRlcnJ1cHRfaW5fdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldi0+aW50ZXJydXB0X2luX3VyYikgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdF9pbl91cmJcbiIpOworCWlmICghZGV2LT5pbnRlcnJ1cHRfaW5fdXJiKQogCQlnb3RvIGVycm9yOwotCX0KIAlkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyID0ga21hbGxvYyhvdXRfZW5kX3NpemUsIEdGUF9LRVJORUwpOwotCWlmICghZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlcikgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdF9vdXRfYnVmZmVyXG4iKTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X291dF9idWZmZXIpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCWRldi0+aW50ZXJydXB0X291dF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYikgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdF9vdXRfdXJiXG4iKTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X291dF91cmIpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCiAJaWYgKCF1c2Jfc3RyaW5nKHVkZXYsIHVkZXYtPmRlc2NyaXB0b3IuaVNlcmlhbE51bWJlciwgZGV2LT5zZXJpYWxfbnVtYmVyLAogCQkJc2l6ZW9mKGRldi0+c2VyaWFsX251bWJlcikpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2FwcGxlZGlzcGxheS5jIGIvZHJpdmVycy91c2IvbWlzYy9hcHBsZWRpc3BsYXkuYwppbmRleCBhMGEzODI3Li5kYTVmZjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2FwcGxlZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvYXBwbGVkaXNwbGF5LmMKQEAgLTg1LDcgKzg1LDYgQEAKIH07CiAKIHN0YXRpYyBhdG9taWNfdCBjb3VudF9kaXNwbGF5cyA9IEFUT01JQ19JTklUKDApOwotc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKIAogc3RhdGljIHZvaWQgYXBwbGVkaXNwbGF5X2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYikKIHsKQEAgLTEyMiw3ICsxMjEsNyBAQAogCWNhc2UgQUNEX0JUTl9CUklHSFRfVVA6CiAJY2FzZSBBQ0RfQlROX0JSSUdIVF9ET1dOOgogCQlwZGF0YS0+YnV0dG9uX3ByZXNzZWQgPSAxOwotCQlxdWV1ZV9kZWxheWVkX3dvcmsod3EsICZwZGF0YS0+d29yaywgMCk7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcGRhdGEtPndvcmssIDApOwogCQlicmVhazsKIAljYXNlIEFDRF9CVE5fTk9ORToKIAlkZWZhdWx0OgpAQCAtMjM5LDcgKzIzOCw2IEBACiAJcGRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXBwbGVkaXNwbGF5KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwZGF0YSkgewogCQlyZXR2YWwgPSAtRU5PTUVNOwotCQlkZXZfZXJyKCZpZmFjZS0+ZGV2LCAiT3V0IG9mIG1lbW9yeVxuIik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCkBAIC0yNTMsOCArMjUxLDYgQEAKIAlwZGF0YS0+bXNnZGF0YSA9IGttYWxsb2MoQUNEX01TR19CVUZGRVJfTEVOLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBkYXRhLT5tc2dkYXRhKSB7CiAJCXJldHZhbCA9IC1FTk9NRU07Ci0JCWRldl9lcnIoJmlmYWNlLT5kZXYsCi0JCQkiQWxsb2NhdGluZyBidWZmZXIgZm9yIGNvbnRyb2wgbWVzc2FnZXMgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJvcjsKIAl9CiAKQEAgLTI2Miw3ICsyNTgsNiBAQAogCXBkYXRhLT51cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCWlmICghcGRhdGEtPnVyYikgewogCQlyZXR2YWwgPSAtRU5PTUVNOwotCQlkZXZfZXJyKCZpZmFjZS0+ZGV2LCAiQWxsb2NhdGluZyBVUkIgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJvcjsKIAl9CiAKQEAgLTM0NCw3ICszMzksNyBAQAogCiAJaWYgKHBkYXRhKSB7CiAJCXVzYl9raWxsX3VyYihwZGF0YS0+dXJiKTsKLQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcGRhdGEtPndvcmspOworCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnBkYXRhLT53b3JrKTsKIAkJYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKHBkYXRhLT5iZCk7CiAJCXVzYl9mcmVlX2NvaGVyZW50KHBkYXRhLT51ZGV2LCBBQ0RfVVJCX0JVRkZFUl9MRU4sCiAJCQlwZGF0YS0+dXJiZGF0YSwgcGRhdGEtPnVyYi0+dHJhbnNmZXJfZG1hKTsKQEAgLTM2NSwxOSArMzYwLDExIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGFwcGxlZGlzcGxheV9pbml0KHZvaWQpCiB7Ci0Jd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiYXBwbGVkaXNwbGF5Iik7Ci0JaWYgKCF3cSkgewotCQlwcmludGsoS0VSTl9FUlIgImFwcGxlZGlzcGxheTogQ291bGQgbm90IGNyZWF0ZSB3b3JrIHF1ZXVlXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCiAJcmV0dXJuIHVzYl9yZWdpc3RlcigmYXBwbGVkaXNwbGF5X2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhcHBsZWRpc3BsYXlfZXhpdCh2b2lkKQogewotCWZsdXNoX3dvcmtxdWV1ZSh3cSk7Ci0JZGVzdHJveV93b3JrcXVldWUod3EpOwogCXVzYl9kZXJlZ2lzdGVyKCZhcHBsZWRpc3BsYXlfZHJpdmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9jeXByZXNzX2N5N2M2My5jIGIvZHJpdmVycy91c2IvbWlzYy9jeXByZXNzX2N5N2M2My5jCmluZGV4IDQwMmI5NGQuLjVjOTNhODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvY3lwcmVzc19jeTdjNjMuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2N5cHJlc3NfY3k3YzYzLmMKQEAgLTc5LDcgKzc5LDYgQEAKIAkvKiBhbGxvY2F0ZSBzb21lIG1lbW9yeSBmb3IgdGhlIGkvbyBidWZmZXIqLwogCWlvYnVmID0ga3phbGxvYyhDWVBSRVNTX01BWF9SRVFTSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWlvYnVmKSB7Ci0JCWRldl9lcnIoJmRldi0+dWRldi0+ZGV2LCAiT3V0IG9mIG1lbW9yeSFcbiIpOwogCQlyZXR2YWwgPSAtRU5PTUVNOwogCQlnb3RvIGVycm9yOwogCX0KQEAgLTIwOCwxMCArMjA3LDggQEAKIAogCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGRldmljZSBzdGF0ZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLwogCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoZGV2ID09IE5VTEwpIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJPdXQgb2YgbWVtb3J5IVxuIik7CisJaWYgKCFkZXYpCiAJCWdvdG8gZXJyb3JfbWVtOwotCX0KIAogCWRldi0+dWRldiA9IHVzYl9nZXRfZGV2KGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvY3l0aGVybS5jIGIvZHJpdmVycy91c2IvbWlzYy9jeXRoZXJtLmMKaW5kZXggOWJhYjFhMy4uOWQ4YmI4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9jeXRoZXJtLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9jeXRoZXJtLmMKQEAgLTEwMSwxMCArMTAxLDggQEAKIAlpbnQgcmV0dmFsOwogICAgCiAJYnVmZmVyID0ga21hbGxvYyg4LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZmZlcikgewotCQlkZXZfZXJyKCZjeXRoZXJtLT51ZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAoIWJ1ZmZlcikKIAkJcmV0dXJuIDA7Ci0JfQogCiAJY3l0aGVybS0+YnJpZ2h0bmVzcyA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwogICAgCkBAIC0xNDgsMTAgKzE0Niw4IEBACiAJaW50IHRlbXAsIHNpZ247CiAgICAKIAlidWZmZXIgPSBrbWFsbG9jKDgsIEdGUF9LRVJORUwpOwotCWlmICghYnVmZmVyKSB7Ci0JCWRldl9lcnIoJmN5dGhlcm0tPnVkZXYtPmRldiwgIm91dCBvZiBtZW1vcnlcbiIpOworCWlmICghYnVmZmVyKQogCQlyZXR1cm4gMDsKLQl9CiAKIAkvKiByZWFkIHRlbXBlcmF0dXJlICovCiAJcmV0dmFsID0gdmVuZG9yX2NvbW1hbmQoY3l0aGVybS0+dWRldiwgUkVBRF9SQU0sIFRFTVAsIDAsIGJ1ZmZlciwgOCk7CkBAIC0xOTIsMTAgKzE4OCw4IEBACiAJdW5zaWduZWQgY2hhciAqYnVmZmVyOwogCiAJYnVmZmVyID0ga21hbGxvYyg4LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZmZlcikgewotCQlkZXZfZXJyKCZjeXRoZXJtLT51ZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAoIWJ1ZmZlcikKIAkJcmV0dXJuIDA7Ci0JfQogCiAJLyogY2hlY2sgYnV0dG9uICovCiAJcmV0dmFsID0gdmVuZG9yX2NvbW1hbmQoY3l0aGVybS0+dWRldiwgUkVBRF9SQU0sIEJVVFRPTiwgMCwgYnVmZmVyLCA4KTsKQEAgLTIzMCwxMCArMjI0LDggQEAKIAl1bnNpZ25lZCBjaGFyICpidWZmZXI7CiAKIAlidWZmZXIgPSBrbWFsbG9jKDgsIEdGUF9LRVJORUwpOwotCWlmICghYnVmZmVyKSB7Ci0JCWRldl9lcnIoJmN5dGhlcm0tPnVkZXYtPmRldiwgIm91dCBvZiBtZW1vcnlcbiIpOworCWlmICghYnVmZmVyKQogCQlyZXR1cm4gMDsKLQl9CiAKIAlyZXR2YWwgPSB2ZW5kb3JfY29tbWFuZChjeXRoZXJtLT51ZGV2LCBSRUFEX1BPUlQsIDAsIDAsIGJ1ZmZlciwgOCk7CiAJaWYgKHJldHZhbCkKQEAgLTI1NywxMCArMjQ5LDggQEAKIAlpbnQgdG1wOwogICAgCiAJYnVmZmVyID0ga21hbGxvYyg4LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZmZlcikgewotCQlkZXZfZXJyKCZjeXRoZXJtLT51ZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAoIWJ1ZmZlcikKIAkJcmV0dXJuIDA7Ci0JfQogCiAJdG1wID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CiAgICAKQEAgLTI5MCwxMCArMjgwLDggQEAKIAl1bnNpZ25lZCBjaGFyICpidWZmZXI7CiAKIAlidWZmZXIgPSBrbWFsbG9jKDgsIEdGUF9LRVJORUwpOwotCWlmICghYnVmZmVyKSB7Ci0JCWRldl9lcnIoJmN5dGhlcm0tPnVkZXYtPmRldiwgIm91dCBvZiBtZW1vcnlcbiIpOworCWlmICghYnVmZmVyKQogCQlyZXR1cm4gMDsKLQl9CiAKIAlyZXR2YWwgPSB2ZW5kb3JfY29tbWFuZChjeXRoZXJtLT51ZGV2LCBSRUFEX1BPUlQsIDEsIDAsIGJ1ZmZlciwgOCk7CiAJaWYgKHJldHZhbCkKQEAgLTMxNywxMCArMzA1LDggQEAKIAlpbnQgdG1wOwogICAgCiAJYnVmZmVyID0ga21hbGxvYyg4LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZmZlcikgewotCQlkZXZfZXJyKCZjeXRoZXJtLT51ZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAoIWJ1ZmZlcikKIAkJcmV0dXJuIDA7Ci0JfQogCiAJdG1wID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CiAgICAKQEAgLTM1MSwxMCArMzM3LDggQEAKIAlpbnQgcmV0dmFsID0gLUVOT01FTTsKIAogCWRldiA9IGt6YWxsb2MgKHNpemVvZihzdHJ1Y3QgdXNiX2N5dGhlcm0pLCBHRlBfS0VSTkVMKTsKLQlpZiAoZGV2ID09IE5VTEwpIHsKLQkJZGV2X2VyciAoJmludGVyZmFjZS0+ZGV2LCAiT3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCFkZXYpCiAJCWdvdG8gZXJyb3JfbWVtOwotCX0KIAogCWRldi0+dWRldiA9IHVzYl9nZXRfZGV2KHVkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2V6dXNiLmMgYi9kcml2ZXJzL3VzYi9taXNjL2V6dXNiLmMKaW5kZXggOTQ3ODExYi4uODM3MjA4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9lenVzYi5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvZXp1c2IuYwpAQCAtMjIsNyArMjIsNyBAQAogCXVuc2lnbmVkIHNob3J0IG1heF9pbnRlcm5hbF9hZHJlc3M7CiB9OwogCi1zdGF0aWMgc3RydWN0IGV6dXNiX2Z4X3R5cGUgZXp1c2JfZngxID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBlenVzYl9meF90eXBlIGV6dXNiX2Z4MSA9IHsKIAkuY3B1Y3NfcmVnID0gMHg3RjkyLAogCS5tYXhfaW50ZXJuYWxfYWRyZXNzID0gMHgxQjNGLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvZnRkaS1lbGFuLmMgYi9kcml2ZXJzL3VzYi9taXNjL2Z0ZGktZWxhbi5jCmluZGV4IDUyYzI3Y2EuLjlhODJmODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvZnRkaS1lbGFuLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9mdGRpLWVsYW4uYwpAQCAtNjEsOSArNjEsNiBAQAogTU9EVUxFX1BBUk1fREVTQyhkaXN0cnVzdF9maXJtd2FyZSwKIAkJICJ0cnVlIHRvIGRpc3RydXN0IGZpcm13YXJlIHBvd2VyL292ZXJjdXJyZW50IHNldHVwIik7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RyaXZlciB1MTMyX3BsYXRmb3JtX2RyaXZlcjsKLXN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqc3RhdHVzX3F1ZXVlOwotc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpjb21tYW5kX3F1ZXVlOwotc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpyZXNwb25kX3F1ZXVlOwogLyoKICAqIGZ0ZGlfbW9kdWxlX2xvY2sgZXhpc3RzIHRvIHByb3RlY3QgYWNjZXNzIHRvIGdsb2JhbCB2YXJpYWJsZXMKICAqCkBAIC0yMjgsNTYgKzIyNSw1NiBAQAogCiBzdGF0aWMgdm9pZCBmdGRpX3N0YXR1c19yZXF1ZXVlX3dvcmsoc3RydWN0IHVzYl9mdGRpICpmdGRpLCB1bnNpZ25lZCBpbnQgZGVsdGEpCiB7Ci0JaWYgKCFxdWV1ZV9kZWxheWVkX3dvcmsoc3RhdHVzX3F1ZXVlLCAmZnRkaS0+c3RhdHVzX3dvcmssIGRlbHRhKSkKKwlpZiAoIXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZnRkaS0+c3RhdHVzX3dvcmssIGRlbHRhKSkKIAkJa3JlZl9wdXQoJmZ0ZGktPmtyZWYsIGZ0ZGlfZWxhbl9kZWxldGUpOwogfQogCiBzdGF0aWMgdm9pZCBmdGRpX3N0YXR1c19xdWV1ZV93b3JrKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSwgdW5zaWduZWQgaW50IGRlbHRhKQogewotCWlmIChxdWV1ZV9kZWxheWVkX3dvcmsoc3RhdHVzX3F1ZXVlLCAmZnRkaS0+c3RhdHVzX3dvcmssIGRlbHRhKSkKKwlpZiAoc2NoZWR1bGVfZGVsYXllZF93b3JrKCZmdGRpLT5zdGF0dXNfd29yaywgZGVsdGEpKQogCQlrcmVmX2dldCgmZnRkaS0+a3JlZik7CiB9CiAKIHN0YXRpYyB2b2lkIGZ0ZGlfc3RhdHVzX2NhbmNlbF93b3JrKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSkKIHsKLQlpZiAoY2FuY2VsX2RlbGF5ZWRfd29yaygmZnRkaS0+c3RhdHVzX3dvcmspKQorCWlmIChjYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmZ0ZGktPnN0YXR1c193b3JrKSkKIAkJa3JlZl9wdXQoJmZ0ZGktPmtyZWYsIGZ0ZGlfZWxhbl9kZWxldGUpOwogfQogCiBzdGF0aWMgdm9pZCBmdGRpX2NvbW1hbmRfcmVxdWV1ZV93b3JrKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSwgdW5zaWduZWQgaW50IGRlbHRhKQogewotCWlmICghcXVldWVfZGVsYXllZF93b3JrKGNvbW1hbmRfcXVldWUsICZmdGRpLT5jb21tYW5kX3dvcmssIGRlbHRhKSkKKwlpZiAoIXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZnRkaS0+Y29tbWFuZF93b3JrLCBkZWx0YSkpCiAJCWtyZWZfcHV0KCZmdGRpLT5rcmVmLCBmdGRpX2VsYW5fZGVsZXRlKTsKIH0KIAogc3RhdGljIHZvaWQgZnRkaV9jb21tYW5kX3F1ZXVlX3dvcmsoc3RydWN0IHVzYl9mdGRpICpmdGRpLCB1bnNpZ25lZCBpbnQgZGVsdGEpCiB7Ci0JaWYgKHF1ZXVlX2RlbGF5ZWRfd29yayhjb21tYW5kX3F1ZXVlLCAmZnRkaS0+Y29tbWFuZF93b3JrLCBkZWx0YSkpCisJaWYgKHNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZnRkaS0+Y29tbWFuZF93b3JrLCBkZWx0YSkpCiAJCWtyZWZfZ2V0KCZmdGRpLT5rcmVmKTsKIH0KIAogc3RhdGljIHZvaWQgZnRkaV9jb21tYW5kX2NhbmNlbF93b3JrKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSkKIHsKLQlpZiAoY2FuY2VsX2RlbGF5ZWRfd29yaygmZnRkaS0+Y29tbWFuZF93b3JrKSkKKwlpZiAoY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZmdGRpLT5jb21tYW5kX3dvcmspKQogCQlrcmVmX3B1dCgmZnRkaS0+a3JlZiwgZnRkaV9lbGFuX2RlbGV0ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGZ0ZGlfcmVzcG9uc2VfcmVxdWV1ZV93b3JrKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSwKIAkJCQkgICAgICAgdW5zaWduZWQgaW50IGRlbHRhKQogewotCWlmICghcXVldWVfZGVsYXllZF93b3JrKHJlc3BvbmRfcXVldWUsICZmdGRpLT5yZXNwb25kX3dvcmssIGRlbHRhKSkKKwlpZiAoIXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZnRkaS0+cmVzcG9uZF93b3JrLCBkZWx0YSkpCiAJCWtyZWZfcHV0KCZmdGRpLT5rcmVmLCBmdGRpX2VsYW5fZGVsZXRlKTsKIH0KIAogc3RhdGljIHZvaWQgZnRkaV9yZXNwb25kX3F1ZXVlX3dvcmsoc3RydWN0IHVzYl9mdGRpICpmdGRpLCB1bnNpZ25lZCBpbnQgZGVsdGEpCiB7Ci0JaWYgKHF1ZXVlX2RlbGF5ZWRfd29yayhyZXNwb25kX3F1ZXVlLCAmZnRkaS0+cmVzcG9uZF93b3JrLCBkZWx0YSkpCisJaWYgKHNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZnRkaS0+cmVzcG9uZF93b3JrLCBkZWx0YSkpCiAJCWtyZWZfZ2V0KCZmdGRpLT5rcmVmKTsKIH0KIAogc3RhdGljIHZvaWQgZnRkaV9yZXNwb25zZV9jYW5jZWxfd29yayhzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkpCiB7Ci0JaWYgKGNhbmNlbF9kZWxheWVkX3dvcmsoJmZ0ZGktPnJlc3BvbmRfd29yaykpCisJaWYgKGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZnRkaS0+cmVzcG9uZF93b3JrKSkKIAkJa3JlZl9wdXQoJmZ0ZGktPmtyZWYsIGZ0ZGlfZWxhbl9kZWxldGUpOwogfQogCkBAIC02NjUsNyArNjYyLDcgQEAKIHsKIAljaGFyIGRhdGFbMzAgKjMgKyA0XTsKIAljaGFyICpkID0gZGF0YTsKLQlpbnQgbSA9IChzaXplb2YoZGF0YSkgLSAxKSAvIDM7CisJaW50IG0gPSAoc2l6ZW9mKGRhdGEpIC0gMSkgLyAzIC0gMTsKIAlpbnQgYnl0ZXNfcmVhZCA9IDA7CiAJaW50IHJldHJ5X29uX2VtcHR5ID0gMTA7CiAJaW50IHJldHJ5X29uX3RpbWVvdXQgPSA1OwpAQCAtNzg1LDExICs3ODIsOCBAQAogCQlyZXR1cm4gMDsKIAl0b3RhbF9zaXplID0gZnRkaV9lbGFuX3RvdGFsX2NvbW1hbmRfc2l6ZShmdGRpLCBjb21tYW5kX3NpemUpOwogCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF1cmIpIHsKLQkJZGV2X2VycigmZnRkaS0+dWRldi0+ZGV2LCAiY291bGQgbm90IGdldCBhIHVyYiB0byB3cml0ZSAlZCBjb21tYW5kcyB0b3RhbGluZyAlZCBieXRlcyB0byB0aGUgVXh4eFxuIiwKLQkJCWNvbW1hbmRfc2l6ZSwgdG90YWxfc2l6ZSk7CisJaWYgKCF1cmIpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAlidWYgPSB1c2JfYWxsb2NfY29oZXJlbnQoZnRkaS0+dWRldiwgdG90YWxfc2l6ZSwgR0ZQX0tFUk5FTCwKIAkJCQkgJnVyYi0+dHJhbnNmZXJfZG1hKTsKIAlpZiAoIWJ1ZikgewpAQCAtMTY4NCw3ICsxNjc4LDcgQEAKIAkJCWludCBpID0gMDsKIAkJCWNoYXIgZGF0YVszMCAqMyArIDRdOwogCQkJY2hhciAqZCA9IGRhdGE7Ci0JCQlpbnQgbSA9IChzaXplb2YoZGF0YSkgLSAxKSAvIDM7CisJCQlpbnQgbSA9IChzaXplb2YoZGF0YSkgLSAxKSAvIDMgLSAxOwogCQkJaW50IGwgPSAwOwogCQkJc3RydWN0IHUxMzJfdGFyZ2V0ICp0YXJnZXQgPSAmZnRkaS0+dGFyZ2V0W2VkXTsKIAkJCXN0cnVjdCB1MTMyX2NvbW1hbmQgKmNvbW1hbmQgPSAmZnRkaS0+Y29tbWFuZFsKQEAgLTE4NzYsNyArMTg3MCw3IEBACiAJCWlmIChwYWNrZXRfYnl0ZXMgPiAyKSB7CiAJCQljaGFyIGRpYWdbMzAgKjMgKyA0XTsKIAkJCWNoYXIgKmQgPSBkaWFnOwotCQkJaW50IG0gPSAoc2l6ZW9mKGRpYWcpIC0gMSkgLyAzOworCQkJaW50IG0gPSAoc2l6ZW9mKGRpYWcpIC0gMSkgLyAzIC0gMTsKIAkJCWNoYXIgKmIgPSBmdGRpLT5idWxrX2luX2J1ZmZlcjsKIAkJCWludCBieXRlc19yZWFkID0gMDsKIAkJCWRpYWdbMF0gPSAwOwpAQCAtMTk0OCwxMCArMTk0Miw4IEBACiAJaW50IEkgPSAyNTc7CiAJaW50IGkgPSAwOwogCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF1cmIpIHsKLQkJZGV2X2VycigmZnRkaS0+dWRldi0+ZGV2LCAiY291bGQgbm90IGFsbG9jIGEgdXJiIGZvciBmbHVzaCBzZXF1ZW5jZVxuIik7CisJaWYgKCF1cmIpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAlidWYgPSB1c2JfYWxsb2NfY29oZXJlbnQoZnRkaS0+dWRldiwgSSwgR0ZQX0tFUk5FTCwgJnVyYi0+dHJhbnNmZXJfZG1hKTsKIAlpZiAoIWJ1ZikgewogCQlkZXZfZXJyKCZmdGRpLT51ZGV2LT5kZXYsICJjb3VsZCBub3QgZ2V0IGEgYnVmZmVyIGZvciBmbHVzaCBzZXF1ZW5jZVxuIik7CkBAIC0xOTg4LDEwICsxOTgwLDggQEAKIAlpbnQgSSA9IDQ7CiAJaW50IGkgPSAwOwogCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF1cmIpIHsKLQkJZGV2X2VycigmZnRkaS0+dWRldi0+ZGV2LCAiY291bGQgbm90IGdldCBhIHVyYiBmb3IgdGhlIHJlc2V0IHNlcXVlbmNlXG4iKTsKKwlpZiAoIXVyYikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCWJ1ZiA9IHVzYl9hbGxvY19jb2hlcmVudChmdGRpLT51ZGV2LCBJLCBHRlBfS0VSTkVMLCAmdXJiLT50cmFuc2Zlcl9kbWEpOwogCWlmICghYnVmKSB7CiAJCWRldl9lcnIoJmZ0ZGktPnVkZXYtPmRldiwgImNvdWxkIG5vdCBnZXQgYSBidWZmZXIgZm9yIHRoZSByZXNldCBzZXF1ZW5jZVxuIik7CkBAIC0yMDUzLDcgKzIwNDMsNyBAQAogCQkJaWYgKHBhY2tldF9ieXRlcyA+IDIpIHsKIAkJCQljaGFyIGRpYWdbMzAgKjMgKyA0XTsKIAkJCQljaGFyICpkID0gZGlhZzsKLQkJCQlpbnQgbSA9IChzaXplb2YoZGlhZykgLSAxKSAvIDM7CisJCQkJaW50IG0gPSAoc2l6ZW9mKGRpYWcpIC0gMSkgLyAzIC0gMTsKIAkJCQljaGFyICpiID0gZnRkaS0+YnVsa19pbl9idWZmZXI7CiAJCQkJaW50IGJ5dGVzX3JlYWQgPSAwOwogCQkJCXVuc2lnbmVkIGNoYXIgYyA9IDA7CkBAIC0yMTU1LDcgKzIxNDUsNyBAQAogCQlpZiAocGFja2V0X2J5dGVzID4gMikgewogCQkJY2hhciBkaWFnWzMwICozICsgNF07CiAJCQljaGFyICpkID0gZGlhZzsKLQkJCWludCBtID0gKHNpemVvZihkaWFnKSAtIDEpIC8gMzsKKwkJCWludCBtID0gKHNpemVvZihkaWFnKSAtIDEpIC8gMyAtIDE7CiAJCQljaGFyICpiID0gZnRkaS0+YnVsa19pbl9idWZmZXI7CiAJCQlpbnQgYnl0ZXNfcmVhZCA9IDA7CiAJCQlkaWFnWzBdID0gMDsKQEAgLTI3NDAsNyArMjczMCw2IEBACiAJCQlmdGRpLT5idWxrX2luX2VuZHBvaW50QWRkciA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOwogCQkJZnRkaS0+YnVsa19pbl9idWZmZXIgPSBrbWFsbG9jKGJ1ZmZlcl9zaXplLCBHRlBfS0VSTkVMKTsKIAkJCWlmICghZnRkaS0+YnVsa19pbl9idWZmZXIpIHsKLQkJCQlkZXZfZXJyKCZmdGRpLT51ZGV2LT5kZXYsICJDb3VsZCBub3QgYWxsb2NhdGUgYnVsa19pbl9idWZmZXJcbiIpOwogCQkJCXJldHZhbCA9IC1FTk9NRU07CiAJCQkJZ290byBlcnJvcjsKIAkJCX0KQEAgLTI4MjMsOSArMjgxMiw2IEBACiAJCQlmdGRpLT5pbml0aWFsaXplZCA9IDA7CiAJCQlmdGRpLT5yZWdpc3RlcmVkID0gMDsKIAkJfQotCQlmbHVzaF93b3JrcXVldWUoc3RhdHVzX3F1ZXVlKTsKLQkJZmx1c2hfd29ya3F1ZXVlKGNvbW1hbmRfcXVldWUpOwotCQlmbHVzaF93b3JrcXVldWUocmVzcG9uZF9xdWV1ZSk7CiAJCWZ0ZGktPmRpc2Nvbm5lY3RlZCArPSAxOwogCQl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7CiAJCWRldl9pbmZvKCZmdGRpLT51ZGV2LT5kZXYsICJVU0IgRlRESSBVMTMyIGhvc3QgY29udHJvbGxlciBpbnRlcmZhY2Ugbm93IGRpc2Nvbm5lY3RlZFxuIik7CkBAIC0yODQ1LDMxICsyODMxLDEyIEBACiAJcHJfaW5mbygiZHJpdmVyICVzXG4iLCBmdGRpX2VsYW5fZHJpdmVyLm5hbWUpOwogCW11dGV4X2luaXQoJmZ0ZGlfbW9kdWxlX2xvY2spOwogCUlOSVRfTElTVF9IRUFEKCZmdGRpX3N0YXRpY19saXN0KTsKLQlzdGF0dXNfcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiZnRkaS1zdGF0dXMtY29udHJvbCIpOwotCWlmICghc3RhdHVzX3F1ZXVlKQotCQlnb3RvIGVycl9zdGF0dXNfcXVldWU7Ci0JY29tbWFuZF9xdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJmdGRpLWNvbW1hbmQtZW5naW5lIik7Ci0JaWYgKCFjb21tYW5kX3F1ZXVlKQotCQlnb3RvIGVycl9jb21tYW5kX3F1ZXVlOwotCXJlc3BvbmRfcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiZnRkaS1yZXNwb25kLWVuZ2luZSIpOwotCWlmICghcmVzcG9uZF9xdWV1ZSkKLQkJZ290byBlcnJfcmVzcG9uZF9xdWV1ZTsKIAlyZXN1bHQgPSB1c2JfcmVnaXN0ZXIoJmZ0ZGlfZWxhbl9kcml2ZXIpOwogCWlmIChyZXN1bHQpIHsKLQkJZGVzdHJveV93b3JrcXVldWUoc3RhdHVzX3F1ZXVlKTsKLQkJZGVzdHJveV93b3JrcXVldWUoY29tbWFuZF9xdWV1ZSk7Ci0JCWRlc3Ryb3lfd29ya3F1ZXVlKHJlc3BvbmRfcXVldWUpOwogCQlwcl9lcnIoInVzYl9yZWdpc3RlciBmYWlsZWQuIEVycm9yIG51bWJlciAlZFxuIiwgcmVzdWx0KTsKIAl9CiAJcmV0dXJuIHJlc3VsdDsKIAotZXJyX3Jlc3BvbmRfcXVldWU6Ci0JZGVzdHJveV93b3JrcXVldWUoY29tbWFuZF9xdWV1ZSk7Ci1lcnJfY29tbWFuZF9xdWV1ZToKLQlkZXN0cm95X3dvcmtxdWV1ZShzdGF0dXNfcXVldWUpOwotZXJyX3N0YXR1c19xdWV1ZToKLQlwcl9lcnIoIiVzIGNvdWxkbid0IGNyZWF0ZSB3b3JrcXVldWVcbiIsIGZ0ZGlfZWxhbl9kcml2ZXIubmFtZSk7Ci0JcmV0dXJuIC1FTk9NRU07CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBmdGRpX2VsYW5fZXhpdCh2b2lkKQpAQCAtMjg4MiwxNSArMjg0OSw3IEBACiAJCWZ0ZGlfc3RhdHVzX2NhbmNlbF93b3JrKGZ0ZGkpOwogCQlmdGRpX2NvbW1hbmRfY2FuY2VsX3dvcmsoZnRkaSk7CiAJCWZ0ZGlfcmVzcG9uc2VfY2FuY2VsX3dvcmsoZnRkaSk7Ci0JfSBmbHVzaF93b3JrcXVldWUoc3RhdHVzX3F1ZXVlKTsKLQlkZXN0cm95X3dvcmtxdWV1ZShzdGF0dXNfcXVldWUpOwotCXN0YXR1c19xdWV1ZSA9IE5VTEw7Ci0JZmx1c2hfd29ya3F1ZXVlKGNvbW1hbmRfcXVldWUpOwotCWRlc3Ryb3lfd29ya3F1ZXVlKGNvbW1hbmRfcXVldWUpOwotCWNvbW1hbmRfcXVldWUgPSBOVUxMOwotCWZsdXNoX3dvcmtxdWV1ZShyZXNwb25kX3F1ZXVlKTsKLQlkZXN0cm95X3dvcmtxdWV1ZShyZXNwb25kX3F1ZXVlKTsKLQlyZXNwb25kX3F1ZXVlID0gTlVMTDsKKwl9CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9pZG1vdXNlLmMgYi9kcml2ZXJzL3VzYi9taXNjL2lkbW91c2UuYwppbmRleCA1MTA1Mzk3Li4yOTc1ZTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2lkbW91c2UuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2lkbW91c2UuYwpAQCAtMzY2LDcgKzM2Niw2IEBACiAJCQlrbWFsbG9jKElNR1NJWkUgKyBkZXYtPmJ1bGtfaW5fc2l6ZSwgR0ZQX0tFUk5FTCk7CiAKIAkJaWYgKCFkZXYtPmJ1bGtfaW5fYnVmZmVyKSB7Ci0JCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBpbnB1dCBidWZmZXIuXG4iKTsKIAkJCWlkbW91c2VfZGVsZXRlKGRldik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9pb3dhcnJpb3IuYyBiL2RyaXZlcnMvdXNiL21pc2MvaW93YXJyaW9yLmMKaW5kZXggMTk1MGU4Ny4uMDk1Nzc4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9pb3dhcnJpb3IuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2lvd2Fycmlvci5jCkBAIC0yNzgsNyArMjc4LDcgQEAKIAlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKIAkvKiB2ZXJpZnkgdGhhdCB0aGUgZGV2aWNlIHdhc24ndCB1bnBsdWdnZWQgKi8KLQlpZiAoZGV2ID09IE5VTEwgfHwgIWRldi0+cHJlc2VudCkKKwlpZiAoIWRldiB8fCAhZGV2LT5wcmVzZW50KQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWRldl9kYmcoJmRldi0+aW50ZXJmYWNlLT5kZXYsICJtaW5vciAlZCwgY291bnQgPSAlemRcbiIsCkBAIC00MTMsOCArNDEzLDYgQEAKIAkJaW50X291dF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCQlpZiAoIWludF9vdXRfdXJiKSB7CiAJCQlyZXR2YWwgPSAtRU5PTUVNOwotCQkJZGV2X2RiZygmZGV2LT5pbnRlcmZhY2UtPmRldiwKLQkJCQkiVW5hYmxlIHRvIGFsbG9jYXRlIHVyYlxuIik7CiAJCQlnb3RvIGVycm9yX25vX3VyYjsKIAkJfQogCQlidWYgPSB1c2JfYWxsb2NfY29oZXJlbnQoZGV2LT51ZGV2LCBkZXYtPnJlcG9ydF9zaXplLApAQCAtNDgyLDkgKzQ4MCw4IEBACiAJaW50IGlvX3JlczsJCS8qIGNoZWNrcyBmb3IgYnl0ZXMgcmVhZC93cml0dGVuIGFuZCBjb3B5X3RvL2Zyb21fdXNlciByZXN1bHRzICovCiAKIAlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaWYgKGRldiA9PSBOVUxMKSB7CisJaWYgKCFkZXYpCiAJCXJldHVybiAtRU5PREVWOwotCX0KIAogCWJ1ZmZlciA9IGt6YWxsb2MoZGV2LT5yZXBvcnRfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWZmZXIpCkBAIC02NTQsOSArNjUxLDggQEAKIAlpbnQgcmV0dmFsID0gMDsKIAogCWRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpZiAoZGV2ID09IE5VTEwpIHsKKwlpZiAoIWRldikKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JfQogCiAJZGV2X2RiZygmZGV2LT5pbnRlcmZhY2UtPmRldiwgIm1pbm9yICVkXG4iLCBkZXYtPm1pbm9yKTsKIApAQCAtNzY2LDEwICs3NjIsOCBAQAogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZGV2aWNlIHN0YXRlIGFuZCBpbml0aWFsaXplIGl0ICovCiAJZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlvd2FycmlvciksIEdGUF9LRVJORUwpOwotCWlmIChkZXYgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIk91dCBvZiBtZW1vcnlcbiIpOworCWlmICghZGV2KQogCQlyZXR1cm4gcmV0dmFsOwotCX0KIAogCW11dGV4X2luaXQoJmRldi0+bXV0ZXgpOwogCkBAIC04MTIsMTUgKzgwNiwxMSBAQAogCiAJLyogY3JlYXRlIHRoZSB1cmIgYW5kIGJ1ZmZlciBmb3IgcmVhZGluZyAqLwogCWRldi0+aW50X2luX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYtPmludF9pbl91cmIpIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfaW5fdXJiXG4iKTsKKwlpZiAoIWRldi0+aW50X2luX3VyYikKIAkJZ290byBlcnJvcjsKLQl9CiAJZGV2LT5pbnRfaW5fYnVmZmVyID0ga21hbGxvYyhkZXYtPnJlcG9ydF9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldi0+aW50X2luX2J1ZmZlcikgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludF9pbl9idWZmZXJcbiIpOworCWlmICghZGV2LT5pbnRfaW5fYnVmZmVyKQogCQlnb3RvIGVycm9yOwotCX0KIAl1c2JfZmlsbF9pbnRfdXJiKGRldi0+aW50X2luX3VyYiwgZGV2LT51ZGV2LAogCQkJIHVzYl9yY3ZpbnRwaXBlKGRldi0+dWRldiwKIAkJCQkJZGV2LT5pbnRfaW5fZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpLApAQCAtODMxLDEwICs4MjEsOCBAQAogCWRldi0+cmVhZF9xdWV1ZSA9CiAJICAgIGttYWxsb2MoKChkZXYtPnJlcG9ydF9zaXplICsgMSkgKiBNQVhfSU5URVJSVVBUX0JVRkZFUiksCiAJCSAgICBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldi0+cmVhZF9xdWV1ZSkgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIHJlYWRfcXVldWVcbiIpOworCWlmICghZGV2LT5yZWFkX3F1ZXVlKQogCQlnb3RvIGVycm9yOwotCX0KIAkvKiBHZXQgdGhlIHNlcmlhbC1udW1iZXIgb2YgdGhlIGNoaXAgKi8KIAltZW1zZXQoZGV2LT5jaGlwX3NlcmlhbCwgMHgwMCwgc2l6ZW9mKGRldi0+Y2hpcF9zZXJpYWwpKTsKIAl1c2Jfc3RyaW5nKHVkZXYsIHVkZXYtPmRlc2NyaXB0b3IuaVNlcmlhbE51bWJlciwgZGV2LT5jaGlwX3NlcmlhbCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvbGR1c2IuYyBiL2RyaXZlcnMvdXNiL21pc2MvbGR1c2IuYwppbmRleCBjY2UyMmZmLi45Y2E1OTU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2xkdXNiLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9sZHVzYi5jCkBAIC02NTgsMTAgKzY1OCw4IEBACiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZGV2aWNlIHN0YXRlIGFuZCBpbml0aWFsaXplIGl0ICovCiAKIAlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRldiA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJmludGYtPmRldiwgIk91dCBvZiBtZW1vcnlcbiIpOworCWlmICghZGV2KQogCQlnb3RvIGV4aXQ7Ci0JfQogCW11dGV4X2luaXQoJmRldi0+bXV0ZXgpOwogCXNwaW5fbG9ja19pbml0KCZkZXYtPnJic2wpOwogCWRldi0+aW50ZiA9IGludGY7CkBAIC02NzQsMTAgKzY3Miw4IEBACiAJICAgICAobGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpID09IFVTQl9ERVZJQ0VfSURfTERfQ09NM0xBQikpICYmCiAJICAgIChsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSkgPD0gMHgxMDMpKSB7CiAJCWJ1ZmZlciA9IGttYWxsb2MoMjU2LCBHRlBfS0VSTkVMKTsKLQkJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0JCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBzdHJpbmcgYnVmZmVyXG4iKTsKKwkJaWYgKCFidWZmZXIpCiAJCQlnb3RvIGVycm9yOwotCQl9CiAJCS8qIHVzYl9zdHJpbmcgbWFrZXMgU0VUVVArU1RBTEwgdG8gbGVhdmUgYWx3YXlzIENvbnRyb2xSZWFkTG9vcCAqLwogCQl1c2Jfc3RyaW5nKHVkZXYsIDI1NSwgYnVmZmVyLCAyNTYpOwogCQlrZnJlZShidWZmZXIpOwpAQCAtNzA0LDMyICs3MDAsMjIgQEAKIAogCWRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50X3NpemUgPSB1c2JfZW5kcG9pbnRfbWF4cChkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludCk7CiAJZGV2LT5yaW5nX2J1ZmZlciA9IGttYWxsb2MocmluZ19idWZmZXJfc2l6ZSooc2l6ZW9mKHNpemVfdCkrZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnRfc2l6ZSksIEdGUF9LRVJORUwpOwotCWlmICghZGV2LT5yaW5nX2J1ZmZlcikgewotCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSByaW5nX2J1ZmZlclxuIik7CisJaWYgKCFkZXYtPnJpbmdfYnVmZmVyKQogCQlnb3RvIGVycm9yOwotCX0KIAlkZXYtPmludGVycnVwdF9pbl9idWZmZXIgPSBrbWFsbG9jKGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50X3NpemUsIEdGUF9LRVJORUwpOwotCWlmICghZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyKSB7Ci0JCWRldl9lcnIoJmludGYtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdF9pbl9idWZmZXJcbiIpOworCWlmICghZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyKQogCQlnb3RvIGVycm9yOwotCX0KIAlkZXYtPmludGVycnVwdF9pbl91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghZGV2LT5pbnRlcnJ1cHRfaW5fdXJiKSB7Ci0JCWRldl9lcnIoJmludGYtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdF9pbl91cmJcbiIpOworCWlmICghZGV2LT5pbnRlcnJ1cHRfaW5fdXJiKQogCQlnb3RvIGVycm9yOwotCX0KIAlkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnRfc2l6ZSA9IGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludCA/IHVzYl9lbmRwb2ludF9tYXhwKGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludCkgOgogCQkJCQkJCQkJIHVkZXYtPmRlc2NyaXB0b3IuYk1heFBhY2tldFNpemUwOwogCWRldi0+aW50ZXJydXB0X291dF9idWZmZXIgPSBrbWFsbG9jKHdyaXRlX2J1ZmZlcl9zaXplKmRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludF9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldi0+aW50ZXJydXB0X291dF9idWZmZXIpIHsKLQkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X291dF9idWZmZXJcbiIpOworCWlmICghZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlcikKIAkJZ290byBlcnJvcjsKLQl9CiAJZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYtPmludGVycnVwdF9vdXRfdXJiKSB7Ci0JCWRldl9lcnIoJmludGYtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdF9vdXRfdXJiXG4iKTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X291dF91cmIpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCWRldi0+aW50ZXJydXB0X2luX2ludGVydmFsID0gbWluX2ludGVycnVwdF9pbl9pbnRlcnZhbCA+IGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT5iSW50ZXJ2YWwgPyBtaW5faW50ZXJydXB0X2luX2ludGVydmFsIDogZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQtPmJJbnRlcnZhbDsKIAlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50KQogCQlkZXYtPmludGVycnVwdF9vdXRfaW50ZXJ2YWwgPSBtaW5faW50ZXJydXB0X291dF9pbnRlcnZhbCA+IGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludC0+YkludGVydmFsID8gbWluX2ludGVycnVwdF9vdXRfaW50ZXJ2YWwgOiBkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQtPmJJbnRlcnZhbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvbGVnb3VzYnRvd2VyLmMgYi9kcml2ZXJzL3VzYi9taXNjL2xlZ291c2J0b3dlci5jCmluZGV4IDc3NzFiZTMuLmM4ZmJlN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvbGVnb3VzYnRvd2VyLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9sZWdvdXNidG93ZXIuYwpAQCAtODE3LDEwICs4MTcsOCBAQAogCiAJZGV2ID0ga21hbGxvYyAoc2l6ZW9mKHN0cnVjdCBsZWdvX3VzYl90b3dlciksIEdGUF9LRVJORUwpOwogCi0JaWYgKGRldiA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoaWRldiwgIk91dCBvZiBtZW1vcnlcbiIpOworCWlmICghZGV2KQogCQlnb3RvIGV4aXQ7Ci0JfQogCiAJbXV0ZXhfaW5pdCgmZGV2LT5sb2NrKTsKIApAQCAtODcxLDUxICs4NjksMjMgQEAKIAl9CiAKIAlkZXYtPnJlYWRfYnVmZmVyID0ga21hbGxvYyAocmVhZF9idWZmZXJfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYtPnJlYWRfYnVmZmVyKSB7Ci0JCWRldl9lcnIoaWRldiwgIkNvdWxkbid0IGFsbG9jYXRlIHJlYWRfYnVmZmVyXG4iKTsKKwlpZiAoIWRldi0+cmVhZF9idWZmZXIpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCWRldi0+aW50ZXJydXB0X2luX2J1ZmZlciA9IGttYWxsb2MgKHVzYl9lbmRwb2ludF9tYXhwKGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYtPmludGVycnVwdF9pbl9idWZmZXIpIHsKLQkJZGV2X2VycihpZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X2luX2J1ZmZlclxuIik7CisJaWYgKCFkZXYtPmludGVycnVwdF9pbl9idWZmZXIpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCWRldi0+aW50ZXJydXB0X2luX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYtPmludGVycnVwdF9pbl91cmIpIHsKLQkJZGV2X2VycihpZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X2luX3VyYlxuIik7CisJaWYgKCFkZXYtPmludGVycnVwdF9pbl91cmIpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCWRldi0+aW50ZXJydXB0X291dF9idWZmZXIgPSBrbWFsbG9jICh3cml0ZV9idWZmZXJfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyKSB7Ci0JCWRldl9lcnIoaWRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdF9vdXRfYnVmZmVyXG4iKTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X291dF9idWZmZXIpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCWRldi0+aW50ZXJydXB0X291dF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYikgewotCQlkZXZfZXJyKGlkZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfb3V0X3VyYlxuIik7CisJaWYgKCFkZXYtPmludGVycnVwdF9vdXRfdXJiKQogCQlnb3RvIGVycm9yOwotCX0KIAlkZXYtPmludGVycnVwdF9pbl9pbnRlcnZhbCA9IGludGVycnVwdF9pbl9pbnRlcnZhbCA/IGludGVycnVwdF9pbl9pbnRlcnZhbCA6IGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT5iSW50ZXJ2YWw7CiAJZGV2LT5pbnRlcnJ1cHRfb3V0X2ludGVydmFsID0gaW50ZXJydXB0X291dF9pbnRlcnZhbCA/IGludGVycnVwdF9vdXRfaW50ZXJ2YWwgOiBkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQtPmJJbnRlcnZhbDsKIAotCS8qIHdlIGNhbiByZWdpc3RlciB0aGUgZGV2aWNlIG5vdywgYXMgaXQgaXMgcmVhZHkgKi8KLQl1c2Jfc2V0X2ludGZkYXRhIChpbnRlcmZhY2UsIGRldik7Ci0KLQlyZXR2YWwgPSB1c2JfcmVnaXN0ZXJfZGV2IChpbnRlcmZhY2UsICZ0b3dlcl9jbGFzcyk7Ci0KLQlpZiAocmV0dmFsKSB7Ci0JCS8qIHNvbWV0aGluZyBwcmV2ZW50ZWQgdXMgZnJvbSByZWdpc3RlcmluZyB0aGlzIGRyaXZlciAqLwotCQlkZXZfZXJyKGlkZXYsICJOb3QgYWJsZSB0byBnZXQgYSBtaW5vciBmb3IgdGhpcyBkZXZpY2UuXG4iKTsKLQkJdXNiX3NldF9pbnRmZGF0YSAoaW50ZXJmYWNlLCBOVUxMKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JZGV2LT5taW5vciA9IGludGVyZmFjZS0+bWlub3I7Ci0KLQkvKiBsZXQgdGhlIHVzZXIga25vdyB3aGF0IG5vZGUgdGhpcyBkZXZpY2UgaXMgbm93IGF0dGFjaGVkIHRvICovCi0JZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LCAiTEVHTyBVU0IgVG93ZXIgIyVkIG5vdyBhdHRhY2hlZCB0byBtYWpvciAiCi0JCSAiJWQgbWlub3IgJWRcbiIsIChkZXYtPm1pbm9yIC0gTEVHT19VU0JfVE9XRVJfTUlOT1JfQkFTRSksCi0JCSBVU0JfTUFKT1IsIGRldi0+bWlub3IpOwotCiAJLyogZ2V0IHRoZSBmaXJtd2FyZSB2ZXJzaW9uIGFuZCBsb2cgaXQgKi8KIAlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2cgKHVkZXYsCiAJCQkJICB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksCkBAIC05MzYsNiArOTA2LDIzIEBACiAJCSBnZXRfdmVyc2lvbl9yZXBseS5taW5vciwKIAkJIGxlMTZfdG9fY3B1KGdldF92ZXJzaW9uX3JlcGx5LmJ1aWxkX25vKSk7CiAKKwkvKiB3ZSBjYW4gcmVnaXN0ZXIgdGhlIGRldmljZSBub3csIGFzIGl0IGlzIHJlYWR5ICovCisJdXNiX3NldF9pbnRmZGF0YSAoaW50ZXJmYWNlLCBkZXYpOworCisJcmV0dmFsID0gdXNiX3JlZ2lzdGVyX2RldiAoaW50ZXJmYWNlLCAmdG93ZXJfY2xhc3MpOworCisJaWYgKHJldHZhbCkgeworCQkvKiBzb21ldGhpbmcgcHJldmVudGVkIHVzIGZyb20gcmVnaXN0ZXJpbmcgdGhpcyBkcml2ZXIgKi8KKwkJZGV2X2VycihpZGV2LCAiTm90IGFibGUgdG8gZ2V0IGEgbWlub3IgZm9yIHRoaXMgZGV2aWNlLlxuIik7CisJCXVzYl9zZXRfaW50ZmRhdGEgKGludGVyZmFjZSwgTlVMTCk7CisJCWdvdG8gZXJyb3I7CisJfQorCWRldi0+bWlub3IgPSBpbnRlcmZhY2UtPm1pbm9yOworCisJLyogbGV0IHRoZSB1c2VyIGtub3cgd2hhdCBub2RlIHRoaXMgZGV2aWNlIGlzIG5vdyBhdHRhY2hlZCB0byAqLworCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwgIkxFR08gVVNCIFRvd2VyICMlZCBub3cgYXR0YWNoZWQgdG8gbWFqb3IgIgorCQkgIiVkIG1pbm9yICVkXG4iLCAoZGV2LT5taW5vciAtIExFR09fVVNCX1RPV0VSX01JTk9SX0JBU0UpLAorCQkgVVNCX01BSk9SLCBkZXYtPm1pbm9yKTsKIAogZXhpdDoKIAlyZXR1cm4gcmV0dmFsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9sdnN0ZXN0LmMgYi9kcml2ZXJzL3VzYi9taXNjL2x2c3Rlc3QuYwppbmRleCA4NmI0ZTRiLi43NzE3NjUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2x2c3Rlc3QuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2x2c3Rlc3QuYwpAQCAtMzQsOCArMzQsNiBAQAogCXN0cnVjdCB1c2JfaHViX2Rlc2NyaXB0b3IgZGVzY3JpcHRvcjsKIAkvKiB1cmIgZm9yIHBvbGxpbmcgaW50ZXJydXB0IHBpcGUgKi8KIAlzdHJ1Y3QgdXJiICp1cmI7Ci0JLyogTFZTIFJIIHdvcmsgcXVldWUgKi8KLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqcmhfcXVldWU7CiAJLyogTFZIIFJIIHdvcmsgKi8KIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJcmhfd29yazsKIAkvKiBSSCBwb3J0IHN0YXR1cyAqLwpAQCAtMjQ3LDEwICsyNDUsOCBAQAogCWludCByZXQ7CiAKIAlkZXNjcmlwdG9yID0ga21hbGxvYyhzaXplb2YoKmRlc2NyaXB0b3IpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRlc2NyaXB0b3IpIHsKLQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgZGVzY3JpcHRvciBtZW1vcnlcbiIpOworCWlmICghZGVzY3JpcHRvcikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJdWRldiA9IGNyZWF0ZV9sdnNfZGV2aWNlKGludGYpOwogCWlmICghdWRldikgewpAQCAtMzU1LDcgKzM1MSw3IEBACiB7CiAJc3RydWN0IGx2c19yaCAqbHZzID0gdXJiLT5jb250ZXh0OwogCi0JcXVldWVfd29yayhsdnMtPnJoX3F1ZXVlLCAmbHZzLT5yaF93b3JrKTsKKwlzY2hlZHVsZV93b3JrKCZsdnMtPnJoX3dvcmspOwogfQogCiBzdGF0aWMgaW50IGx2c19yaF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKQEAgLTM5NywyNCArMzkzLDE1IEBACiAKIAkvKiBzdWJtaXQgdXJiIHRvIHBvbGwgaW50ZXJydXB0IGVuZHBvaW50ICovCiAJbHZzLT51cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghbHZzLT51cmIpIHsKLQkJZGV2X2VycigmaW50Zi0+ZGV2LCAiY291bGRuJ3QgYWxsb2NhdGUgbHZzIHVyYlxuIik7CisJaWYgKCFsdnMtPnVyYikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JbHZzLT5yaF9xdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJsdnNfcmhfcXVldWUiKTsKLQlpZiAoIWx2cy0+cmhfcXVldWUpIHsKLQkJZGV2X2VycigmaW50Zi0+ZGV2LCAiY291bGRuJ3QgY3JlYXRlIHdvcmtxdWV1ZVxuIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZnJlZV91cmI7Ci0JfQogCiAJSU5JVF9XT1JLKCZsdnMtPnJoX3dvcmssIGx2c19yaF93b3JrKTsKIAogCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmaW50Zi0+ZGV2LmtvYmosICZsdnNfYXR0cl9ncm91cCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmaW50Zi0+ZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBub2RlICVkXG4iLCByZXQpOwotCQlnb3RvIGRlc3Ryb3lfcXVldWU7CisJCWdvdG8gZnJlZV91cmI7CiAJfQogCiAJcGlwZSA9IHVzYl9yY3ZpbnRwaXBlKGhkZXYsIGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKTsKQEAgLTQzMiw4ICs0MTksNiBAQAogCiBzeXNmc19yZW1vdmU6CiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZpbnRmLT5kZXYua29iaiwgJmx2c19hdHRyX2dyb3VwKTsKLWRlc3Ryb3lfcXVldWU6Ci0JZGVzdHJveV93b3JrcXVldWUobHZzLT5yaF9xdWV1ZSk7CiBmcmVlX3VyYjoKIAl1c2JfZnJlZV91cmIobHZzLT51cmIpOwogCXJldHVybiByZXQ7CkBAIC00NDQsNyArNDI5LDcgQEAKIAlzdHJ1Y3QgbHZzX3JoICpsdnMgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZpbnRmLT5kZXYua29iaiwgJmx2c19hdHRyX2dyb3VwKTsKLQlkZXN0cm95X3dvcmtxdWV1ZShsdnMtPnJoX3F1ZXVlKTsKKwlmbHVzaF93b3JrKCZsdnMtPnJoX3dvcmspOwogCXVzYl9mcmVlX3VyYihsdnMtPnVyYik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2Mvc2lzdXNidmdhL3Npc3VzYi5jIGIvZHJpdmVycy91c2IvbWlzYy9zaXN1c2J2Z2Evc2lzdXNiLmMKaW5kZXggMDJhYmZjZC4uMDViZDM5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9zaXN1c2J2Z2Evc2lzdXNiLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9zaXN1c2J2Z2Evc2lzdXNiLmMKQEAgLTMwODQsNyArMzA4NCw2IEBACiAJLyogQWxsb2NhdGUgVVJCcyAqLwogCXNpc3VzYi0+c2lzdXJiaW4gPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCWlmICghc2lzdXNiLT5zaXN1cmJpbikgewotCQlkZXZfZXJyKCZzaXN1c2ItPnNpc3VzYl9kZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBVUkJzXG4iKTsKIAkJcmV0dmFsID0gLUVOT01FTTsKIAkJZ290byBlcnJvcl8zOwogCX0KQEAgLTMwOTMsOCArMzA5Miw2IEBACiAJZm9yIChpID0gMDsgaSA8IHNpc3VzYi0+bnVtb2J1ZnM7IGkrKykgewogCQlzaXN1c2ItPnNpc3VyYm91dFtpXSA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJCWlmICghc2lzdXNiLT5zaXN1cmJvdXRbaV0pIHsKLQkJCWRldl9lcnIoJnNpc3VzYi0+c2lzdXNiX2Rldi0+ZGV2LAotCQkJCQkiRmFpbGVkIHRvIGFsbG9jYXRlIFVSQnNcbiIpOwogCQkJcmV0dmFsID0gLUVOT01FTTsKIAkJCWdvdG8gZXJyb3JfNDsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy90cmFuY2V2aWJyYXRvci5jIGIvZHJpdmVycy91c2IvbWlzYy90cmFuY2V2aWJyYXRvci5jCmluZGV4IDQxNDUzMTQuLjk3OTU0NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvdHJhbmNldmlicmF0b3IuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL3RyYW5jZXZpYnJhdG9yLmMKQEAgLTk1LDggKzk1LDcgQEAKIAlpbnQgcmV0dmFsOwogCiAJZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRyYW5jZXZpYnJhdG9yKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRldiA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiT3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCFkZXYpIHsKIAkJcmV0dmFsID0gLUVOT01FTTsKIAkJZ290byBlcnJvcjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL3VzYjQ2MDQuYyBiL2RyaXZlcnMvdXNiL21pc2MvdXNiNDYwNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZjM3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9taXNjL3VzYjQ2MDQuYwpAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqIERyaXZlciBmb3IgU01TQyBVU0I0NjA0IFVTQiBIU0lDIDQtcG9ydCAyLjAgaHViIGNvbnRyb2xsZXIgZHJpdmVyCisgKiBCYXNlZCBvbiB1c2IzNTAzIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDEzIERvbmdqaW4gS2ltICh0b2JldHRlckBnbWFpbC5jb20pCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgTGluYXJvIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8vY29uc3VtZXIuaD4KKworZW51bSB1c2I0NjA0X21vZGUgeworCVVTQjQ2MDRfTU9ERV9VTktOT1dOLAorCVVTQjQ2MDRfTU9ERV9IVUIsCisJVVNCNDYwNF9NT0RFX1NUQU5EQlksCit9OworCitzdHJ1Y3QgdXNiNDYwNCB7CisJZW51bSB1c2I0NjA0X21vZGUJbW9kZTsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworCXN0cnVjdCBncGlvX2Rlc2MJKmdwaW9fcmVzZXQ7Cit9OworCitzdGF0aWMgdm9pZCB1c2I0NjA0X3Jlc2V0KHN0cnVjdCB1c2I0NjA0ICpodWIsIGludCBzdGF0ZSkKK3sKKwlncGlvZF9zZXRfdmFsdWVfY2Fuc2xlZXAoaHViLT5ncGlvX3Jlc2V0LCBzdGF0ZSk7CisKKwkvKiBXYWl0IGZvciBpMmMgbG9naWMgdG8gY29tZSB1cCAqLworCWlmIChzdGF0ZSkKKwkJbXNsZWVwKDI1MCk7Cit9CisKK3N0YXRpYyBpbnQgdXNiNDYwNF9jb25uZWN0KHN0cnVjdCB1c2I0NjA0ICpodWIpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaHViLT5kZXY7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlpbnQgZXJyOworCXU4IGNvbm5lY3RfY21kW10gPSB7IDB4YWEsIDB4NTUsIDB4MDAgfTsKKworCXVzYjQ2MDRfcmVzZXQoaHViLCAxKTsKKworCWVyciA9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGNvbm5lY3RfY21kLCBBUlJBWV9TSVpFKGNvbm5lY3RfY21kKSk7CisJaWYgKGVyciA8IDApIHsKKwkJdXNiNDYwNF9yZXNldChodWIsIDApOworCQlyZXR1cm4gZXJyOworCX0KKworCWh1Yi0+bW9kZSA9IFVTQjQ2MDRfTU9ERV9IVUI7CisJZGV2X2RiZyhkZXYsICJzd2l0Y2hlZCB0byBIVUIgbW9kZVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2I0NjA0X3N3aXRjaF9tb2RlKHN0cnVjdCB1c2I0NjA0ICpodWIsIGVudW0gdXNiNDYwNF9tb2RlIG1vZGUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaHViLT5kZXY7CisJaW50IGVyciA9IDA7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIFVTQjQ2MDRfTU9ERV9IVUI6CisJCWVyciA9IHVzYjQ2MDRfY29ubmVjdChodWIpOworCQlicmVhazsKKworCWNhc2UgVVNCNDYwNF9NT0RFX1NUQU5EQlk6CisJCXVzYjQ2MDRfcmVzZXQoaHViLCAwKTsKKwkJZGV2X2RiZyhkZXYsICJzd2l0Y2hlZCB0byBTVEFOREJZIG1vZGVcbiIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGV2LCAidW5rbm93biBtb2RlIGlzIHJlcXVlc3RlZFxuIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdXNiNDYwNF9wcm9iZShzdHJ1Y3QgdXNiNDYwNCAqaHViKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGh1Yi0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CisJc3RydWN0IGdwaW9fZGVzYyAqZ3BpbzsKKwl1MzIgbW9kZSA9IFVTQjQ2MDRfTU9ERV9IVUI7CisKKwlncGlvID0gZGV2bV9ncGlvZF9nZXRfb3B0aW9uYWwoZGV2LCAicmVzZXQiLCBHUElPRF9PVVRfTE9XKTsKKwlpZiAoSVNfRVJSKGdwaW8pKQorCQlyZXR1cm4gUFRSX0VSUihncGlvKTsKKwlodWItPmdwaW9fcmVzZXQgPSBncGlvOworCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiaW5pdGlhbC1tb2RlIiwgJmh1Yi0+bW9kZSkpCisJCWh1Yi0+bW9kZSA9IG1vZGU7CisKKwlyZXR1cm4gdXNiNDYwNF9zd2l0Y2hfbW9kZShodWIsIGh1Yi0+bW9kZSk7Cit9CisKK3N0YXRpYyBpbnQgdXNiNDYwNF9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywKKwkJCSAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2I0NjA0ICpodWI7CisKKwlodWIgPSBkZXZtX2t6YWxsb2MoJmkyYy0+ZGV2LCBzaXplb2YoKmh1YiksIEdGUF9LRVJORUwpOworCWlmICghaHViKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWkyY19zZXRfY2xpZW50ZGF0YShpMmMsIGh1Yik7CisJaHViLT5kZXYgPSAmaTJjLT5kZXY7CisKKwlyZXR1cm4gdXNiNDYwNF9wcm9iZShodWIpOworfQorCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IHVzYjQ2MDRfaTJjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHVzYjQ2MDQgKmh1YiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJdXNiNDYwNF9zd2l0Y2hfbW9kZShodWIsIFVTQjQ2MDRfTU9ERV9TVEFOREJZKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYjQ2MDRfaTJjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdXNiNDYwNCAqaHViID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwl1c2I0NjA0X3N3aXRjaF9tb2RlKGh1YiwgaHViLT5tb2RlKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyh1c2I0NjA0X2kyY19wbV9vcHMsIHVzYjQ2MDRfaTJjX3N1c3BlbmQsCisJCXVzYjQ2MDRfaTJjX3Jlc3VtZSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB1c2I0NjA0X2lkW10gPSB7CisJeyAidXNiNDYwNCIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgdXNiNDYwNF9pZCk7CisKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHVzYjQ2MDRfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInNtc2MsdXNiNDYwNCIgfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHVzYjQ2MDRfb2ZfbWF0Y2gpOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB1c2I0NjA0X2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAidXNiNDYwNCIsCisJCS5wbSA9ICZ1c2I0NjA0X2kyY19wbV9vcHMsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cih1c2I0NjA0X29mX21hdGNoKSwKKwl9LAorCS5wcm9iZQkJPSB1c2I0NjA0X2kyY19wcm9iZSwKKwkuaWRfdGFibGUJPSB1c2I0NjA0X2lkLAorfTsKK21vZHVsZV9pMmNfZHJpdmVyKHVzYjQ2MDRfaTJjX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiVVNCNDYwNCBVU0IgSFVCIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy91c2JsY2QuYyBiL2RyaXZlcnMvdXNiL21pc2MvdXNibGNkLmMKaW5kZXggMTE4NDM5MC4uOWY0ODQxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy91c2JsY2QuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL3VzYmxjZC5jCkBAIC0zMjEsMTAgKzMyMSw4IEBACiAKIAkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBkZXZpY2Ugc3RhdGUgYW5kIGluaXRpYWxpemUgaXQgKi8KIAlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRldiA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiT3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCFkZXYpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCWtyZWZfaW5pdCgmZGV2LT5rcmVmKTsKIAlzZW1hX2luaXQoJmRldi0+bGltaXRfc2VtLCBVU0JfTENEX0NPTkNVUlJFTlRfV1JJVEVTKTsKIAlpbml0X3VzYl9hbmNob3IoJmRldi0+c3VibWl0dGVkKTsKQEAgLTM1MSwxMSArMzQ5LDggQEAKIAkJCWRldi0+YnVsa19pbl9zaXplID0gYnVmZmVyX3NpemU7CiAJCQlkZXYtPmJ1bGtfaW5fZW5kcG9pbnRBZGRyID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CiAJCQlkZXYtPmJ1bGtfaW5fYnVmZmVyID0ga21hbGxvYyhidWZmZXJfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIWRldi0+YnVsa19pbl9idWZmZXIpIHsKLQkJCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwKLQkJCQkJIkNvdWxkIG5vdCBhbGxvY2F0ZSBidWxrX2luX2J1ZmZlclxuIik7CisJCQlpZiAoIWRldi0+YnVsa19pbl9idWZmZXIpCiAJCQkJZ290byBlcnJvcjsKLQkJCX0KIAkJfQogCiAJCWlmICghZGV2LT5idWxrX291dF9lbmRwb2ludEFkZHIgJiYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvdXNic2V2c2VnLmMgYi9kcml2ZXJzL3VzYi9taXNjL3VzYnNldnNlZy5jCmluZGV4IDFmZTZiNzMuLmEwYmE1MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvdXNic2V2c2VnLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy91c2JzZXZzZWcuYwpAQCAtMTI4LDEwICsxMjgsOCBAQAogCQlyZXR1cm47CiAKIAlidWZmZXIgPSBremFsbG9jKE1BWExFTiwgbWYpOwotCWlmICghYnVmZmVyKSB7Ci0JCWRldl9lcnIoJm15ZGV2LT51ZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAoIWJ1ZmZlcikKIAkJcmV0dXJuOwotCX0KIAogCS8qIFRoZSBkZXZpY2UgaXMgcmlnaHQgdG8gbGVmdCwgd2hlcmUgYXMgeW91IHdyaXRlIGxlZnQgdG8gcmlnaHQgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbXlkZXYtPnRleHRsZW5ndGg7IGkrKykKQEAgLTM0NiwxMCArMzQ0LDggQEAKIAlpbnQgcmMgPSAtRU5PTUVNOwogCiAJbXlkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdXNiX3NldnNlZ2RldiksIEdGUF9LRVJORUwpOwotCWlmIChteWRldiA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiT3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCFteWRldikKIAkJZ290byBlcnJvcl9tZW07Ci0JfQogCiAJbXlkZXYtPnVkZXYgPSB1c2JfZ2V0X2Rldih1ZGV2KTsKIAlteWRldi0+aW50ZiA9IGludGVyZmFjZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvdXNidGVzdC5jIGIvZHJpdmVycy91c2IvbWlzYy91c2J0ZXN0LmMKaW5kZXggNmI5NzhmMC4uNWM4MjEwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy91c2J0ZXN0LmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy91c2J0ZXN0LmMKQEAgLTU4NSw3ICs1ODUsNiBAQAogewogCXN0cnVjdCB1c2Jfc2dfcmVxdWVzdAkqcmVxID0gKHN0cnVjdCB1c2Jfc2dfcmVxdWVzdCAqKSBfcmVxOwogCi0JcmVxLT5zdGF0dXMgPSAtRVRJTUVET1VUOwogCXVzYl9zZ19jYW5jZWwocmVxKTsKIH0KIApAQCAtNjE2LDggKzYxNSwxMCBAQAogCQltb2RfdGltZXIoJnNnX3RpbWVyLCBqaWZmaWVzICsKIAkJCQltc2Vjc190b19qaWZmaWVzKFNJTVBMRV9JT19USU1FT1VUKSk7CiAJCXVzYl9zZ193YWl0KHJlcSk7Ci0JCWRlbF90aW1lcl9zeW5jKCZzZ190aW1lcik7Ci0JCXJldHZhbCA9IHJlcS0+c3RhdHVzOworCQlpZiAoIWRlbF90aW1lcl9zeW5jKCZzZ190aW1lcikpCisJCQlyZXR2YWwgPSAtRVRJTUVET1VUOworCQllbHNlCisJCQlyZXR2YWwgPSByZXEtPnN0YXR1czsKIAogCQkvKiBGSVhNRSBjaGVjayByZXN1bHRpbmcgZGF0YSBwYXR0ZXJuICovCiAKQEAgLTI2MDIsNyArMjYwMyw3IEBACiAJa3RpbWVfZ2V0X3RzNjQoJnN0YXJ0KTsKIAogCXJldHZhbCA9IHVzYnRlc3RfZG9faW9jdGwoaW50ZiwgcGFyYW1fMzIpOwotCWlmIChyZXR2YWwpCisJaWYgKHJldHZhbCA8IDApCiAJCWdvdG8gZnJlZV9tdXRleDsKIAogCWt0aW1lX2dldF90czY0KCZlbmQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy91c3M3MjAuYyBiL2RyaXZlcnMvdXNiL21pc2MvdXNzNzIwLmMKaW5kZXggYmJkMDI5Yy4uMzU2ZDMxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy91c3M3MjAuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL3VzczcyMC5jCkBAIC0xNTAsMTAgKzE1MCw4IEBACiAJaWYgKCF1c2JkZXYpCiAJCXJldHVybiBOVUxMOwogCXJxID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVzczcyMF9hc3luY19yZXF1ZXN0KSwgbWVtX2ZsYWdzKTsKLQlpZiAoIXJxKSB7Ci0JCWRldl9lcnIoJnVzYmRldi0+ZGV2LCAic3VibWl0X2FzeW5jX3JlcXVlc3Qgb3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCFycSkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCWtyZWZfaW5pdCgmcnEtPnJlZl9jb3VudCk7CiAJSU5JVF9MSVNUX0hFQUQoJnJxLT5hc3luY2xpc3QpOwogCWluaXRfY29tcGxldGlvbigmcnEtPmNvbXBsKTsKQEAgLTE2Miw3ICsxNjAsNiBAQAogCXJxLT51cmIgPSB1c2JfYWxsb2NfdXJiKDAsIG1lbV9mbGFncyk7CiAJaWYgKCFycS0+dXJiKSB7CiAJCWtyZWZfcHV0KCZycS0+cmVmX2NvdW50LCBkZXN0cm95X2FzeW5jKTsKLQkJZGV2X2VycigmdXNiZGV2LT5kZXYsICJzdWJtaXRfYXN5bmNfcmVxdWVzdCBvdXQgb2YgbWVtb3J5XG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCXJxLT5kciA9IGttYWxsb2Moc2l6ZW9mKCpycS0+ZHIpLCBtZW1fZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy95dXJleC5jIGIvZHJpdmVycy91c2IvbWlzYy95dXJleC5jCmluZGV4IDM0M2ZhNmYuLjU0ZTUzYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MveXVyZXguYworKysgYi9kcml2ZXJzL3VzYi9taXNjL3l1cmV4LmMKQEAgLTIwMCwxMCArMjAwLDggQEAKIAogCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGRldmljZSBzdGF0ZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLwogCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldikgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIk91dCBvZiBtZW1vcnlcbiIpOworCWlmICghZGV2KQogCQlnb3RvIGVycm9yOwotCX0KIAlrcmVmX2luaXQoJmRldi0+a3JlZik7CiAJbXV0ZXhfaW5pdCgmZGV2LT5pb19tdXRleCk7CiAJc3Bpbl9sb2NrX2luaXQoJmRldi0+bG9jayk7CkBAIC0yMzEsMTcgKzIyOSwxMyBAQAogCiAJLyogYWxsb2NhdGUgY29udHJvbCBVUkIgKi8KIAlkZXYtPmNudGxfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldi0+Y250bF91cmIpIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJDb3VsZCBub3QgYWxsb2NhdGUgY29udHJvbCBVUkJcbiIpOworCWlmICghZGV2LT5jbnRsX3VyYikKIAkJZ290byBlcnJvcjsKLQl9CiAKIAkvKiBhbGxvY2F0ZSBidWZmZXIgZm9yIGNvbnRyb2wgcmVxICovCiAJZGV2LT5jbnRsX3JlcSA9IGttYWxsb2MoWVVSRVhfQlVGX1NJWkUsIEdGUF9LRVJORUwpOwotCWlmICghZGV2LT5jbnRsX3JlcSkgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBjbnRsX3JlcVxuIik7CisJaWYgKCFkZXYtPmNudGxfcmVxKQogCQlnb3RvIGVycm9yOwotCX0KIAogCS8qIGFsbG9jYXRlIGJ1ZmZlciBmb3IgY29udHJvbCBtc2cgKi8KIAlkZXYtPmNudGxfYnVmZmVyID0gdXNiX2FsbG9jX2NvaGVyZW50KGRldi0+dWRldiwgWVVSRVhfQlVGX1NJWkUsCkBAIC0yNjksMTAgKzI2Myw4IEBACiAKIAkvKiBhbGxvY2F0ZSBpbnRlcnJ1cHQgVVJCICovCiAJZGV2LT51cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghZGV2LT51cmIpIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJDb3VsZCBub3QgYWxsb2NhdGUgVVJCXG4iKTsKKwlpZiAoIWRldi0+dXJiKQogCQlnb3RvIGVycm9yOwotCX0KIAogCS8qIGFsbG9jYXRlIGJ1ZmZlciBmb3IgaW50ZXJydXB0IGluICovCiAJZGV2LT5pbnRfYnVmZmVyID0gdXNiX2FsbG9jX2NvaGVyZW50KGRldi0+dWRldiwgWVVSRVhfQlVGX1NJWkUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL0tjb25maWcgYi9kcml2ZXJzL3VzYi9tdXNiL0tjb25maWcKaW5kZXggODg2NTI2Yi4uNzJhMmE1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL211c2IvS2NvbmZpZwpAQCAtODIsMTIgKzgyLDEyIEBACiAJdHJpc3RhdGUgIkRBOHh4L09NQVAtTDF4IgogCWRlcGVuZHMgb24gQVJDSF9EQVZJTkNJX0RBOFhYCiAJZGVwZW5kcyBvbiBOT1BfVVNCX1hDRUlWCi0JZGVwZW5kcyBvbiBCUk9LRU4KKwlzZWxlY3QgUEhZX0RBOFhYX1VTQgogCiBjb25maWcgVVNCX01VU0JfVFVTQjYwMTAKIAl0cmlzdGF0ZSAiVFVTQjYwMTAiCiAJZGVwZW5kcyBvbiBIQVNfSU9NRU0KLQlkZXBlbmRzIG9uIEFSQ0hfT01BUDJQTFVTIHx8IENPTVBJTEVfVEVTVAorCWRlcGVuZHMgb24gKEFSQ0hfT01BUDJQTFVTIHx8IENPTVBJTEVfVEVTVCkgJiYgIUJMQUNLRklOCiAJZGVwZW5kcyBvbiBOT1BfVVNCX1hDRUlWID0gVVNCX01VU0JfSERSQyAjIGJvdGggYnVpbHQtaW4gb3IgYm90aCBtb2R1bGVzCiAKIGNvbmZpZyBVU0JfTVVTQl9PTUFQMlBMVVMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvYW0zNXguYyBiL2RyaXZlcnMvdXNiL211c2IvYW0zNXguYwppbmRleCBjNDFmZTU4Li41MGNhODA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL2FtMzV4LmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9hbTM1eC5jCkBAIC00NzQsMTAgKzQ3NCw4IEBACiAJaW50CQkJCXJldCA9IC1FTk9NRU07CiAKIAlnbHVlID0ga3phbGxvYyhzaXplb2YoKmdsdWUpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWdsdWUpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGdsdWUgY29udGV4dFxuIik7CisJaWYgKCFnbHVlKQogCQlnb3RvIGVycjA7Ci0JfQogCiAJcGh5X2NsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgImZjayIpOwogCWlmIChJU19FUlIocGh5X2NsaykpIHsKQEAgLTUxMiw4ICs1MTAsMTAgQEAKIAlwZGF0YS0+cGxhdGZvcm1fb3BzCQk9ICZhbTM1eF9vcHM7CiAKIAlnbHVlLT5waHkgPSB1c2JfcGh5X2dlbmVyaWNfcmVnaXN0ZXIoKTsKLQlpZiAoSVNfRVJSKGdsdWUtPnBoeSkpCisJaWYgKElTX0VSUihnbHVlLT5waHkpKSB7CisJCXJldCA9IFBUUl9FUlIoZ2x1ZS0+cGh5KTsKIAkJZ290byBlcnI3OworCX0KIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBnbHVlKTsKIAogCXBpbmZvID0gYW0zNXhfZGV2X2luZm87CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL2RhOHh4LmMgYi9kcml2ZXJzL3VzYi9tdXNiL2RhOHh4LmMKaW5kZXggYjAzZDNiOC4uMjEwYjdlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9kYTh4eC5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvZGE4eHguYwpAQCAtMzAsMTMgKzMwLDExIEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvdXNiX3BoeV9nZW5lcmljLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2RhOHh4Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS91c2ItZGF2aW5jaS5oPgotCiAjaW5jbHVkZSAibXVzYl9jb3JlLmgiCiAKIC8qCkBAIC04MCw2MSArNzgsMTUgQEAKIAogI2RlZmluZSBEQThYWF9NRU5UT1JfQ09SRV9PRkZTRVQgMHg0MDAKIAotI2RlZmluZSBDRkdDSElQMglJT19BRERSRVNTKERBOFhYX1NZU0NGRzBfQkFTRSArIERBOFhYX0NGR0NISVAyX1JFRykKLQogc3RydWN0IGRhOHh4X2dsdWUgewogCXN0cnVjdCBkZXZpY2UJCSpkZXY7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqbXVzYjsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwaHk7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqdXNiX3BoeTsKIAlzdHJ1Y3QgY2xrCQkqY2xrOworCXN0cnVjdCBwaHkJCSpwaHk7CiB9OwogCiAvKgotICogUkVWSVNJVCAoUE0pOiB3ZSBzaG91bGQgYmUgYWJsZSB0byBrZWVwIHRoZSBQSFkgaW4gbG93IHBvd2VyIG1vZGUgbW9zdAotICogb2YgdGhlIHRpbWUgKDI0IE1IeiBvc2NpbGxhdG9yIGFuZCBQTEwgb2ZmLCBldGMuKSBieSBzZXR0aW5nIFBPV0VSLkQwCi0gKiBhbmQsIHdoZW4gaW4gaG9zdCBtb2RlLCBhdXRvc3VzcGVuZGluZyBpZGxlIHJvb3QgcG9ydHMuLi4gUEhZX1BMTE9OCi0gKiAob3ZlcnJpZGluZyBTVVNQRU5ETT8pIHRoZW4gbGlrZWx5IG5lZWRzIHRvIHN0YXkgb2ZmLgotICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwaHlfb24odm9pZCkKLXsKLQl1MzIgY2ZnY2hpcDIgPSBfX3Jhd19yZWFkbChDRkdDSElQMik7Ci0KLQkvKgotCSAqIFN0YXJ0IHRoZSBvbi1jaGlwIFBIWSBhbmQgaXRzIFBMTC4KLQkgKi8KLQljZmdjaGlwMiAmPSB+KENGR0NISVAyX1JFU0VUIHwgQ0ZHQ0hJUDJfUEhZUFdSRE4gfCBDRkdDSElQMl9PVEdQV1JETik7Ci0JY2ZnY2hpcDIgfD0gQ0ZHQ0hJUDJfUEhZX1BMTE9OOwotCV9fcmF3X3dyaXRlbChjZmdjaGlwMiwgQ0ZHQ0hJUDIpOwotCi0JcHJfaW5mbygiV2FpdGluZyBmb3IgVVNCIFBIWSBjbG9jayBnb29kLi4uXG4iKTsKLQl3aGlsZSAoIShfX3Jhd19yZWFkbChDRkdDSElQMikgJiBDRkdDSElQMl9QSFlDTEtHRCkpCi0JCWNwdV9yZWxheCgpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcGh5X29mZih2b2lkKQotewotCXUzMiBjZmdjaGlwMiA9IF9fcmF3X3JlYWRsKENGR0NISVAyKTsKLQotCS8qCi0JICogRW5zdXJlIHRoYXQgVVNCIDEuMSByZWZlcmVuY2UgY2xvY2sgaXMgbm90IGJlaW5nIHNvdXJjZWQgZnJvbQotCSAqIFVTQiAyLjAgUEhZLiAgT3RoZXJ3aXNlIGRvIG5vdCBwb3dlciBkb3duIHRoZSBQSFkuCi0JICovCi0JaWYgKCEoY2ZnY2hpcDIgJiBDRkdDSElQMl9VU0IxUEhZQ0xLTVVYKSAmJgotCSAgICAgKGNmZ2NoaXAyICYgQ0ZHQ0hJUDJfVVNCMVNVU1BFTkRNKSkgewotCQlwcl93YXJuaW5nKCJVU0IgMS4xIGNsb2NrZWQgZnJvbSBVU0IgMi4wIFBIWSAtLSAiCi0JCQkgICAiY2FuJ3QgcG93ZXIgaXQgZG93blxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqIFBvd2VyIGRvd24gdGhlIG9uLWNoaXAgUEhZLgotCSAqLwotCWNmZ2NoaXAyIHw9IENGR0NISVAyX1BIWVBXUkROIHwgQ0ZHQ0hJUDJfT1RHUFdSRE47Ci0JX19yYXdfd3JpdGVsKGNmZ2NoaXAyLCBDRkdDSElQMik7Ci19Ci0KLS8qCiAgKiBCZWNhdXNlIHdlIGRvbid0IHNldCBDVFJMLlVJTlQsIGl0J3MgImltcG9ydGFudCIgdG86CiAgKgktIG5vdCByZWFkL3dyaXRlIElOVFJVU0IvSU5UUlVTQkUgKGV4Y2VwdCBkdXJpbmcKICAqCSAgaW5pdGlhbCBzZXR1cCwgYXMgYSB3b3JrYXJvdW5kKTsKQEAgLTM4NSwyOSArMzM3LDI5IEBACiAKIHN0YXRpYyBpbnQgZGE4eHhfbXVzYl9zZXRfbW9kZShzdHJ1Y3QgbXVzYiAqbXVzYiwgdTggbXVzYl9tb2RlKQogewotCXUzMiBjZmdjaGlwMiA9IF9fcmF3X3JlYWRsKENGR0NISVAyKTsKKwlzdHJ1Y3QgZGE4eHhfZ2x1ZSAqZ2x1ZSA9IGRldl9nZXRfZHJ2ZGF0YShtdXNiLT5jb250cm9sbGVyLT5wYXJlbnQpOworCWVudW0gcGh5X21vZGUgcGh5X21vZGU7CiAKLQljZmdjaGlwMiAmPSB+Q0ZHQ0hJUDJfT1RHTU9ERTsKIAlzd2l0Y2ggKG11c2JfbW9kZSkgewogCWNhc2UgTVVTQl9IT1NUOgkJLyogRm9yY2UgVkJVUyB2YWxpZCwgSUQgPSAwICovCi0JCWNmZ2NoaXAyIHw9IENGR0NISVAyX0ZPUkNFX0hPU1Q7CisJCXBoeV9tb2RlID0gUEhZX01PREVfVVNCX0hPU1Q7CiAJCWJyZWFrOwogCWNhc2UgTVVTQl9QRVJJUEhFUkFMOgkvKiBGb3JjZSBWQlVTIHZhbGlkLCBJRCA9IDEgKi8KLQkJY2ZnY2hpcDIgfD0gQ0ZHQ0hJUDJfRk9SQ0VfREVWSUNFOworCQlwaHlfbW9kZSA9IFBIWV9NT0RFX1VTQl9ERVZJQ0U7CiAJCWJyZWFrOwogCWNhc2UgTVVTQl9PVEc6CQkvKiBEb24ndCBvdmVycmlkZSB0aGUgVkJVUy9JRCBjb21wYXJhdG9ycyAqLwotCQljZmdjaGlwMiB8PSBDRkdDSElQMl9OT19PVkVSUklERTsKKwkJcGh5X21vZGUgPSBQSFlfTU9ERV9VU0JfT1RHOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfZGJnKG11c2ItPmNvbnRyb2xsZXIsICJUcnlpbmcgdG8gc2V0IHVuc3VwcG9ydGVkIG1vZGUgJXVcbiIsIG11c2JfbW9kZSk7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCV9fcmF3X3dyaXRlbChjZmdjaGlwMiwgQ0ZHQ0hJUDIpOwotCXJldHVybiAwOworCXJldHVybiBwaHlfc2V0X21vZGUoZ2x1ZS0+cGh5LCBwaHlfbW9kZSk7CiB9CiAKIHN0YXRpYyBpbnQgZGE4eHhfbXVzYl9pbml0KHN0cnVjdCBtdXNiICptdXNiKQogeworCXN0cnVjdCBkYTh4eF9nbHVlICpnbHVlID0gZGV2X2dldF9kcnZkYXRhKG11c2ItPmNvbnRyb2xsZXItPnBhcmVudCk7CiAJdm9pZCBfX2lvbWVtICpyZWdfYmFzZSA9IG11c2ItPmN0cmxfYmFzZTsKIAl1MzIgcmV2OwogCWludCByZXQgPSAtRU5PREVWOwpAQCAtNDI1LDMyICszNzcsNTYgQEAKIAkJZ290byBmYWlsOwogCX0KIAorCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShnbHVlLT5jbGspOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihnbHVlLT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIGNsb2NrXG4iKTsKKwkJZ290byBmYWlsOworCX0KKwogCXNldHVwX3RpbWVyKCZvdGdfd29ya2Fyb3VuZCwgb3RnX3RpbWVyLCAodW5zaWduZWQgbG9uZyltdXNiKTsKIAogCS8qIFJlc2V0IHRoZSBjb250cm9sbGVyICovCiAJbXVzYl93cml0ZWwocmVnX2Jhc2UsIERBOFhYX1VTQl9DVFJMX1JFRywgREE4WFhfU09GVF9SRVNFVF9NQVNLKTsKIAogCS8qIFN0YXJ0IHRoZSBvbi1jaGlwIFBIWSBhbmQgaXRzIFBMTC4gKi8KLQlwaHlfb24oKTsKKwlyZXQgPSBwaHlfaW5pdChnbHVlLT5waHkpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihnbHVlLT5kZXYsICJGYWlsZWQgdG8gaW5pdCBwaHkuXG4iKTsKKwkJZ290byBlcnJfcGh5X2luaXQ7CisJfQorCisJcmV0ID0gcGh5X3Bvd2VyX29uKGdsdWUtPnBoeSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGdsdWUtPmRldiwgIkZhaWxlZCB0byBwb3dlciBvbiBwaHkuXG4iKTsKKwkJZ290byBlcnJfcGh5X3Bvd2VyX29uOworCX0KIAogCW1zbGVlcCg1KTsKIAogCS8qIE5PVEU6IElSUXMgYXJlIGluIG1peGVkIG1vZGUsIG5vdCBieXBhc3MgdG8gcHVyZSBNVVNCICovCi0JcHJfZGVidWcoIkRBOHh4IE9URyByZXZpc2lvbiAlMDh4LCBQSFkgJTAzeCwgY29udHJvbCAlMDJ4XG4iLAotCQkgcmV2LCBfX3Jhd19yZWFkbChDRkdDSElQMiksCisJcHJfZGVidWcoIkRBOHh4IE9URyByZXZpc2lvbiAlMDh4LCBjb250cm9sICUwMnhcbiIsIHJldiwKIAkJIG11c2JfcmVhZGIocmVnX2Jhc2UsIERBOFhYX1VTQl9DVFJMX1JFRykpOwogCiAJbXVzYi0+aXNyID0gZGE4eHhfbXVzYl9pbnRlcnJ1cHQ7CiAJcmV0dXJuIDA7CisKK2Vycl9waHlfcG93ZXJfb246CisJcGh5X2V4aXQoZ2x1ZS0+cGh5KTsKK2Vycl9waHlfaW5pdDoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoZ2x1ZS0+Y2xrKTsKIGZhaWw6CiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBkYTh4eF9tdXNiX2V4aXQoc3RydWN0IG11c2IgKm11c2IpCiB7CisJc3RydWN0IGRhOHh4X2dsdWUgKmdsdWUgPSBkZXZfZ2V0X2RydmRhdGEobXVzYi0+Y29udHJvbGxlci0+cGFyZW50KTsKKwogCWRlbF90aW1lcl9zeW5jKCZvdGdfd29ya2Fyb3VuZCk7CiAKLQlwaHlfb2ZmKCk7CisJcGh5X3Bvd2VyX29mZihnbHVlLT5waHkpOworCXBoeV9leGl0KGdsdWUtPnBoeSk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGdsdWUtPmNsayk7CiAKIAl1c2JfcHV0X3BoeShtdXNiLT54Y2Vpdik7CiAKQEAgLTQ4NiwzMCArNDYyLDI1IEBACiB7CiAJc3RydWN0IHJlc291cmNlIG11c2JfcmVzb3VyY2VzWzJdOwogCXN0cnVjdCBtdXNiX2hkcmNfcGxhdGZvcm1fZGF0YQkqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJCSptdXNiOwogCXN0cnVjdCBkYTh4eF9nbHVlCQkqZ2x1ZTsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2luZm8JcGluZm87CiAJc3RydWN0IGNsawkJCSpjbGs7CisJaW50CQkJCXJldDsKIAotCWludAkJCQlyZXQgPSAtRU5PTUVNOworCWdsdWUgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpnbHVlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFnbHVlKQorCQlyZXR1cm4gLUVOT01FTTsKIAotCWdsdWUgPSBremFsbG9jKHNpemVvZigqZ2x1ZSksIEdGUF9LRVJORUwpOwotCWlmICghZ2x1ZSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgZ2x1ZSBjb250ZXh0XG4iKTsKLQkJZ290byBlcnIwOwotCX0KLQotCWNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgInVzYjIwIik7CisJY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJ1c2IyMCIpOwogCWlmIChJU19FUlIoY2xrKSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGNsb2NrXG4iKTsKLQkJcmV0ID0gUFRSX0VSUihjbGspOwotCQlnb3RvIGVycjM7CisJCXJldHVybiBQVFJfRVJSKGNsayk7CiAJfQogCi0JcmV0ID0gY2xrX2VuYWJsZShjbGspOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBjbG9ja1xuIik7Ci0JCWdvdG8gZXJyNDsKKwlnbHVlLT5waHkgPSBkZXZtX3BoeV9nZXQoJnBkZXYtPmRldiwgInVzYi1waHkiKTsKKwlpZiAoSVNfRVJSKGdsdWUtPnBoeSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBwaHlcbiIpOworCQlyZXR1cm4gUFRSX0VSUihnbHVlLT5waHkpOwogCX0KIAogCWdsdWUtPmRldgkJCT0gJnBkZXYtPmRldjsKQEAgLTUxNywxMCArNDg4LDExIEBACiAKIAlwZGF0YS0+cGxhdGZvcm1fb3BzCQk9ICZkYTh4eF9vcHM7CiAKLQlnbHVlLT5waHkgPSB1c2JfcGh5X2dlbmVyaWNfcmVnaXN0ZXIoKTsKLQlpZiAoSVNfRVJSKGdsdWUtPnBoeSkpIHsKLQkJcmV0ID0gUFRSX0VSUihnbHVlLT5waHkpOwotCQlnb3RvIGVycjU7CisJZ2x1ZS0+dXNiX3BoeSA9IHVzYl9waHlfZ2VuZXJpY19yZWdpc3RlcigpOworCXJldCA9IFBUUl9FUlJfT1JfWkVSTyhnbHVlLT51c2JfcGh5KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciB1c2JfcGh5XG4iKTsKKwkJcmV0dXJuIHJldDsKIAl9CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZ2x1ZSk7CiAKQEAgLTU0NCwyOCArNTE2LDEzIEBACiAJcGluZm8uZGF0YSA9IHBkYXRhOwogCXBpbmZvLnNpemVfZGF0YSA9IHNpemVvZigqcGRhdGEpOwogCi0JZ2x1ZS0+bXVzYiA9IG11c2IgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfZnVsbCgmcGluZm8pOwotCWlmIChJU19FUlIobXVzYikpIHsKLQkJcmV0ID0gUFRSX0VSUihtdXNiKTsKKwlnbHVlLT5tdXNiID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX2Z1bGwoJnBpbmZvKTsKKwlyZXQgPSBQVFJfRVJSX09SX1pFUk8oZ2x1ZS0+bXVzYik7CisJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgbXVzYiBkZXZpY2U6ICVkXG4iLCByZXQpOwotCQlnb3RvIGVycjY7CisJCXVzYl9waHlfZ2VuZXJpY191bnJlZ2lzdGVyKGdsdWUtPnVzYl9waHkpOwogCX0KIAotCXJldHVybiAwOwotCi1lcnI2OgotCXVzYl9waHlfZ2VuZXJpY191bnJlZ2lzdGVyKGdsdWUtPnBoeSk7Ci0KLWVycjU6Ci0JY2xrX2Rpc2FibGUoY2xrKTsKLQotZXJyNDoKLQljbGtfcHV0KGNsayk7Ci0KLWVycjM6Ci0Ja2ZyZWUoZ2x1ZSk7Ci0KLWVycjA6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTc0LDEwICs1MzEsNyBAQAogCXN0cnVjdCBkYTh4eF9nbHVlCQkqZ2x1ZSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCiAJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZ2x1ZS0+bXVzYik7Ci0JdXNiX3BoeV9nZW5lcmljX3VucmVnaXN0ZXIoZ2x1ZS0+cGh5KTsKLQljbGtfZGlzYWJsZShnbHVlLT5jbGspOwotCWNsa19wdXQoZ2x1ZS0+Y2xrKTsKLQlrZnJlZShnbHVlKTsKKwl1c2JfcGh5X2dlbmVyaWNfdW5yZWdpc3RlcihnbHVlLT51c2JfcGh5KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmMKaW5kZXggNzRmYzMwNi4uMjdkYWRjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jCkBAIC0xNDQ4LDcgKzE0NDgsNyBAQAogewogCXU4IHJlZzsKIAljaGFyICp0eXBlOwotCWNoYXIgYUluZm9bOTBdLCBhUmV2aXNpb25bMzJdLCBhRGF0ZVsxMl07CisJY2hhciBhSW5mb1s5MF07CiAJdm9pZCBfX2lvbWVtCSptYmFzZSA9IG11c2ItPm1yZWdzOwogCWludAkJc3RhdHVzID0gMDsKIAlpbnQJCWk7CkBAIC0xNDgyLDcgKzE0ODIsNiBAQAogCiAJcHJfZGVidWcoIiVzOiBDb25maWdEYXRhPTB4JTAyeCAoJXMpXG4iLCBtdXNiX2RyaXZlcl9uYW1lLCByZWcsIGFJbmZvKTsKIAotCWFEYXRlWzBdID0gMDsKIAlpZiAoTVVTQl9DT05UUk9MTEVSX01IRFJDID09IG11c2JfdHlwZSkgewogCQltdXNiLT5pc19tdWx0aXBvaW50ID0gMTsKIAkJdHlwZSA9ICJNIjsKQEAgLTE0OTcsMTEgKzE0OTYsMTAgQEAKIAogCS8qIGxvZyByZWxlYXNlIGluZm8gKi8KIAltdXNiLT5od3ZlcnMgPSBtdXNiX3JlYWRfaHd2ZXJzKG1iYXNlKTsKLQlzbnByaW50ZihhUmV2aXNpb24sIDMyLCAiJWQuJWQlcyIsIE1VU0JfSFdWRVJTX01BSk9SKG11c2ItPmh3dmVycyksCi0JCU1VU0JfSFdWRVJTX01JTk9SKG11c2ItPmh3dmVycyksCi0JCShtdXNiLT5od3ZlcnMgJiBNVVNCX0hXVkVSU19SQykgPyAiUkMiIDogIiIpOwotCXByX2RlYnVnKCIlczogJXNIRFJDIFJUTCB2ZXJzaW9uICVzICVzXG4iLAotCQkgbXVzYl9kcml2ZXJfbmFtZSwgdHlwZSwgYVJldmlzaW9uLCBhRGF0ZSk7CisJcHJfZGVidWcoIiVzOiAlc0hEUkMgUlRMIHZlcnNpb24gJWQuJWQlc1xuIiwKKwkJIG11c2JfZHJpdmVyX25hbWUsIHR5cGUsIE1VU0JfSFdWRVJTX01BSk9SKG11c2ItPmh3dmVycyksCisJCSBNVVNCX0hXVkVSU19NSU5PUihtdXNiLT5od3ZlcnMpLAorCQkgKG11c2ItPmh3dmVycyAmIE1VU0JfSFdWRVJTX1JDKSA/ICJSQyIgOiAiIik7CiAKIAkvKiBjb25maWd1cmUgZXAwICovCiAJbXVzYl9jb25maWd1cmVfZXAwKG11c2IpOwpAQCAtMTgzMSwxMSArMTgyOSw4MCBAQAogCS5hdHRycyA9IG11c2JfYXR0cmlidXRlcywKIH07CiAKKyNkZWZpbmUgTVVTQl9RVUlSS19CX0lOVkFMSURfVkJVU185MQkoTVVTQl9ERVZDVExfQkRFVklDRSB8IFwKKwkJCQkJICgyIDw8IE1VU0JfREVWQ1RMX1ZCVVNfU0hJRlQpIHwgXAorCQkJCQkgTVVTQl9ERVZDVExfU0VTU0lPTikKKyNkZWZpbmUgTVVTQl9RVUlSS19BX0RJU0NPTk5FQ1RfMTkJKCgzIDw8IE1VU0JfREVWQ1RMX1ZCVVNfU0hJRlQpIHwgXAorCQkJCQkgTVVTQl9ERVZDVExfU0VTU0lPTikKKworLyoKKyAqIENoZWNrIHRoZSBtdXNiIGRldmN0bCBzZXNzaW9uIGJpdCB0byBkZXRlcm1pbmUgaWYgd2Ugd2FudCB0bworICogYWxsb3cgUE0gcnVudGltZSBmb3IgdGhlIGRldmljZS4gSW4gZ2VuZXJhbCwgd2Ugd2FudCB0byBrZWVwIHRoaW5ncworICogYWN0aXZlIHdoZW4gdGhlIHNlc3Npb24gYml0IGlzIHNldCBleGNlcHQgYWZ0ZXIgaG9zdCBkaXNjb25uZWN0LgorICoKKyAqIE9ubHkgY2FsbGVkIGZyb20gbXVzYl9pcnFfd29yay4gSWYgdGhpcyBldmVyIG5lZWRzIHRvIGdldCBjYWxsZWQKKyAqIGVsc2V3aGVyZSwgcHJvcGVyIGxvY2tpbmcgbXVzdCBiZSBpbXBsZW1lbnRlZCBmb3IgbXVzYi0+c2Vzc2lvbi4KKyAqLworc3RhdGljIHZvaWQgbXVzYl9wbV9ydW50aW1lX2NoZWNrX3Nlc3Npb24oc3RydWN0IG11c2IgKm11c2IpCit7CisJdTggZGV2Y3RsLCBzOworCWludCBlcnJvcjsKKworCWRldmN0bCA9IG11c2JfcmVhZGIobXVzYi0+bXJlZ3MsIE1VU0JfREVWQ1RMKTsKKworCS8qIEhhbmRsZSBzZXNzaW9uIHN0YXR1cyBxdWlya3MgZmlyc3QgKi8KKwlzID0gTVVTQl9ERVZDVExfRlNERVYgfCBNVVNCX0RFVkNUTF9MU0RFViB8CisJCU1VU0JfREVWQ1RMX0hSOworCXN3aXRjaCAoZGV2Y3RsICYgfnMpIHsKKwljYXNlIE1VU0JfUVVJUktfQl9JTlZBTElEX1ZCVVNfOTE6CisJCWlmICghbXVzYi0+c2Vzc2lvbiAmJiAhbXVzYi0+cXVpcmtfaW52YWxpZF92YnVzKSB7CisJCQltdXNiLT5xdWlya19pbnZhbGlkX3ZidXMgPSB0cnVlOworCQkJbXVzYl9kYmcobXVzYiwKKwkJCQkgIkZpcnN0IGludmFsaWQgdmJ1cywgYXNzdW1lIG5vIHNlc3Npb24iKTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKwljYXNlIE1VU0JfUVVJUktfQV9ESVNDT05ORUNUXzE5OgorCQlpZiAoIW11c2ItPnNlc3Npb24pCisJCQlicmVhazsKKwkJbXVzYl9kYmcobXVzYiwgIkFsbG93IFBNIG9uIHBvc3NpYmxlIGhvc3QgbW9kZSBkaXNjb25uZWN0Iik7CisJCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3kobXVzYi0+Y29udHJvbGxlcik7CisJCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKG11c2ItPmNvbnRyb2xsZXIpOworCQltdXNiLT5zZXNzaW9uID0gZmFsc2U7CisJCXJldHVybjsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwkvKiBObyBuZWVkIHRvIGRvIGFueXRoaW5nIGlmIHNlc3Npb24gaGFzIG5vdCBjaGFuZ2VkICovCisJcyA9IGRldmN0bCAmIE1VU0JfREVWQ1RMX1NFU1NJT047CisJaWYgKHMgPT0gbXVzYi0+c2Vzc2lvbikKKwkJcmV0dXJuOworCisJLyogQmxvY2sgUE0gb3IgYWxsb3cgUE0/ICovCisJaWYgKHMpIHsKKwkJbXVzYl9kYmcobXVzYiwgIkJsb2NrIFBNIG9uIGFjdGl2ZSBzZXNzaW9uOiAlMDJ4IiwgZGV2Y3RsKTsKKwkJZXJyb3IgPSBwbV9ydW50aW1lX2dldF9zeW5jKG11c2ItPmNvbnRyb2xsZXIpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZGV2X2VycihtdXNiLT5jb250cm9sbGVyLCAiQ291bGQgbm90IGVuYWJsZTogJWlcbiIsCisJCQkJZXJyb3IpOworCX0gZWxzZSB7CisJCW11c2JfZGJnKG11c2IsICJBbGxvdyBQTSB3aXRoIG5vIHNlc3Npb246ICUwMngiLCBkZXZjdGwpOworCQltdXNiLT5xdWlya19pbnZhbGlkX3ZidXMgPSBmYWxzZTsKKwkJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShtdXNiLT5jb250cm9sbGVyKTsKKwkJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQobXVzYi0+Y29udHJvbGxlcik7CisJfQorCisJbXVzYi0+c2Vzc2lvbiA9IHM7Cit9CisKIC8qIE9ubHkgdXNlZCB0byBwcm92aWRlIGRyaXZlciBtb2RlIGNoYW5nZSBldmVudHMgKi8KIHN0YXRpYyB2b2lkIG11c2JfaXJxX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQogewogCXN0cnVjdCBtdXNiICptdXNiID0gY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBtdXNiLCBpcnFfd29yayk7CiAKKwltdXNiX3BtX3J1bnRpbWVfY2hlY2tfc2Vzc2lvbihtdXNiKTsKKwogCWlmIChtdXNiLT54Y2Vpdi0+b3RnLT5zdGF0ZSAhPSBtdXNiLT54Y2Vpdl9vbGRfc3RhdGUpIHsKIAkJbXVzYi0+eGNlaXZfb2xkX3N0YXRlID0gbXVzYi0+eGNlaXYtPm90Zy0+c3RhdGU7CiAJCXN5c2ZzX25vdGlmeSgmbXVzYi0+Y29udHJvbGxlci0+a29iaiwgTlVMTCwgIm1vZGUiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmggYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5oCmluZGV4IGI1NWE3NzYuLjJjYjg4YTQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5oCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmgKQEAgLTM3OCw2ICszNzgsOCBAQAogCXU4CQkJbWluX3Bvd2VyOwkvKiB2YnVzIGZvciBwZXJpcGgsIGluIG1BLzIgKi8KIAogCWludAkJCXBvcnRfbW9kZTsJLyogTVVTQl9QT1JUX01PREVfKiAqLworCWJvb2wJCQlzZXNzaW9uOworCWJvb2wJCQlxdWlya19pbnZhbGlkX3ZidXM7CiAJYm9vbAkJCWlzX2hvc3Q7CiAKIAlpbnQJCQlhX3dhaXRfYmNvbjsJLyogVkJVUyB0aW1lb3V0IGluIG1zZWNzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfZHNwcy5jIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2RzcHMuYwppbmRleCAyNTM3MTc5Li4wZjE3ZDIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfZHNwcy5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9kc3BzLmMKQEAgLTE0NSw0MyArMTQ1LDYgQEAKIAl7ICJtb2RlIiwJCTB4ZTggfSwKIH07CiAKLXN0YXRpYyB2b2lkIGRzcHNfbXVzYl90cnlfaWRsZShzdHJ1Y3QgbXVzYiAqbXVzYiwgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IG11c2ItPmNvbnRyb2xsZXI7Ci0Jc3RydWN0IGRzcHNfZ2x1ZSAqZ2x1ZSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7Ci0KLQlpZiAodGltZW91dCA9PSAwKQotCQl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMyk7Ci0KLQkvKiBOZXZlciBpZGxlIGlmIGFjdGl2ZSwgb3Igd2hlbiBWQlVTIHRpbWVvdXQgaXMgbm90IHNldCBhcyBob3N0ICovCi0JaWYgKG11c2ItPmlzX2FjdGl2ZSB8fCAobXVzYi0+YV93YWl0X2Jjb24gPT0gMCAmJgotCQkJbXVzYi0+eGNlaXYtPm90Zy0+c3RhdGUgPT0gT1RHX1NUQVRFX0FfV0FJVF9CQ09OKSkgewotCQlkZXZfZGJnKG11c2ItPmNvbnRyb2xsZXIsICIlcyBhY3RpdmUsIGRlbGV0aW5nIHRpbWVyXG4iLAotCQkJCXVzYl9vdGdfc3RhdGVfc3RyaW5nKG11c2ItPnhjZWl2LT5vdGctPnN0YXRlKSk7Ci0JCWRlbF90aW1lcigmZ2x1ZS0+dGltZXIpOwotCQlnbHVlLT5sYXN0X3RpbWVyID0gamlmZmllczsKLQkJcmV0dXJuOwotCX0KLQlpZiAobXVzYi0+cG9ydF9tb2RlICE9IE1VU0JfUE9SVF9NT0RFX0RVQUxfUk9MRSkKLQkJcmV0dXJuOwotCi0JaWYgKCFtdXNiLT5nLmRldi5kcml2ZXIpCi0JCXJldHVybjsKLQotCWlmICh0aW1lX2FmdGVyKGdsdWUtPmxhc3RfdGltZXIsIHRpbWVvdXQpICYmCi0JCQkJdGltZXJfcGVuZGluZygmZ2x1ZS0+dGltZXIpKSB7Ci0JCWRldl9kYmcobXVzYi0+Y29udHJvbGxlciwKLQkJCSJMb25nZXIgaWRsZSB0aW1lciBhbHJlYWR5IHBlbmRpbmcsIGlnbm9yaW5nLi4uXG4iKTsKLQkJcmV0dXJuOwotCX0KLQlnbHVlLT5sYXN0X3RpbWVyID0gdGltZW91dDsKLQotCWRldl9kYmcobXVzYi0+Y29udHJvbGxlciwgIiVzIGluYWN0aXZlLCBzdGFydGluZyBpZGxlIHRpbWVyIGZvciAldSBtc1xuIiwKLQkJdXNiX290Z19zdGF0ZV9zdHJpbmcobXVzYi0+eGNlaXYtPm90Zy0+c3RhdGUpLAotCQkJamlmZmllc190b19tc2Vjcyh0aW1lb3V0IC0gamlmZmllcykpOwotCW1vZF90aW1lcigmZ2x1ZS0+dGltZXIsIHRpbWVvdXQpOwotfQotCiAvKioKICAqIGRzcHNfbXVzYl9lbmFibGUgLSBlbmFibGUgaW50ZXJydXB0cwogICovCkBAIC0yMDYsNyArMTY5LDYgQEAKIAkJCW11c2ItPnBvcnRfbW9kZSA9PSBNVVNCX1BPUlRfTU9ERV9EVUFMX1JPTEUpCiAJCW1vZF90aW1lcigmZ2x1ZS0+dGltZXIsIGppZmZpZXMgKwogCQkJCW1zZWNzX3RvX2ppZmZpZXMod3JwLT5wb2xsX3RpbWVvdXQpKTsKLQlkc3BzX211c2JfdHJ5X2lkbGUobXVzYiwgMCk7CiB9CiAKIC8qKgpAQCAtMjM2LDYgKzE5OCwxMSBAQAogCXU4IGRldmN0bDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBza2lwX3Nlc3Npb24gPSAwOworCWludCBlcnI7CisKKwllcnIgPSBwbV9ydW50aW1lX2dldF9zeW5jKGRldik7CisJaWYgKGVyciA8IDApCisJCWRldl9lcnIoZGV2LCAiUG9sbCBjb3VsZCBub3QgcG1fcnVudGltZV9nZXQ6ICVpXG4iLCBlcnIpOwogCiAJLyoKIAkgKiBXZSBwb2xsIGJlY2F1c2UgRFNQUyBJUCdzIHdvbid0IGV4cG9zZSBzZXZlcmFsIE9URy1jcml0aWNhbApAQCAtMjQ3LDYgKzIxNCwxMCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKIAlzd2l0Y2ggKG11c2ItPnhjZWl2LT5vdGctPnN0YXRlKSB7CisJY2FzZSBPVEdfU1RBVEVfQV9XQUlUX1ZSSVNFOgorCQltb2RfdGltZXIoJmdsdWUtPnRpbWVyLCBqaWZmaWVzICsKKwkJCQltc2Vjc190b19qaWZmaWVzKHdycC0+cG9sbF90aW1lb3V0KSk7CisJCWJyZWFrOwogCWNhc2UgT1RHX1NUQVRFX0FfV0FJVF9CQ09OOgogCQltdXNiX3dyaXRlYihtdXNiLT5tcmVncywgTVVTQl9ERVZDVEwsIDApOwogCQlza2lwX3Nlc3Npb24gPSAxOwpAQCAtMjc1LDYgKzI0Niw5IEBACiAJCWJyZWFrOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdXNiLT5sb2NrLCBmbGFncyk7CisKKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KGRldik7CisJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoZGV2KTsKIH0KIAogc3RhdGljIGlycXJldHVybl90IGRzcHNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmhjaSkKQEAgLTMzOCw3ICszMTIsOCBAQAogCQkJTVVTQl9IU1RfTU9ERShtdXNiKTsKIAkJCW11c2ItPnhjZWl2LT5vdGctPmRlZmF1bHRfYSA9IDE7CiAJCQltdXNiLT54Y2Vpdi0+b3RnLT5zdGF0ZSA9IE9UR19TVEFURV9BX1dBSVRfVlJJU0U7Ci0JCQlkZWxfdGltZXIoJmdsdWUtPnRpbWVyKTsKKwkJCW1vZF90aW1lcigmZ2x1ZS0+dGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyh3cnAtPnBvbGxfdGltZW91dCkpOwogCQl9IGVsc2UgewogCQkJbXVzYi0+aXNfYWN0aXZlID0gMDsKIAkJCU1VU0JfREVWX01PREUobXVzYik7CkBAIC0zNTgsMTEgKzMzMywxNyBAQAogCWlmIChtdXNiLT5pbnRfdHggfHwgbXVzYi0+aW50X3J4IHx8IG11c2ItPmludF91c2IpCiAJCXJldCB8PSBtdXNiX2ludGVycnVwdChtdXNiKTsKIAotCS8qIFBvbGwgZm9yIElEIGNoYW5nZSBpbiBPVEcgcG9ydCBtb2RlICovCi0JaWYgKG11c2ItPnhjZWl2LT5vdGctPnN0YXRlID09IE9UR19TVEFURV9CX0lETEUgJiYKLQkJCW11c2ItPnBvcnRfbW9kZSA9PSBNVVNCX1BPUlRfTU9ERV9EVUFMX1JPTEUpCisJLyogUG9sbCBmb3IgSUQgY2hhbmdlIGFuZCBjb25uZWN0ICovCisJc3dpdGNoIChtdXNiLT54Y2Vpdi0+b3RnLT5zdGF0ZSkgeworCWNhc2UgT1RHX1NUQVRFX0JfSURMRToKKwljYXNlIE9UR19TVEFURV9BX1dBSVRfQkNPTjoKIAkJbW9kX3RpbWVyKCZnbHVlLT50aW1lciwgamlmZmllcyArCiAJCQkJbXNlY3NfdG9famlmZmllcyh3cnAtPnBvbGxfdGltZW91dCkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKIG91dDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdXNiLT5sb2NrLCBmbGFncyk7CiAKQEAgLTQ2MSw2ICs0NDIsOSBAQAogCQltdXNiX3dyaXRlYihtdXNiLT5tcmVncywgTVVTQl9CQUJCTEVfQ1RMLCB2YWwpOwogCX0KIAorCW1vZF90aW1lcigmZ2x1ZS0+dGltZXIsIGppZmZpZXMgKworCQkgIG1zZWNzX3RvX2ppZmZpZXMoZ2x1ZS0+d3JwLT5wb2xsX3RpbWVvdXQpKTsKKwogCXJldHVybiBkc3BzX211c2JfZGJnX2luaXQobXVzYiwgZ2x1ZSk7CiB9CiAKQEAgLTYyMCw3ICs2MDQsNiBAQAogCS5lbmFibGUJCT0gZHNwc19tdXNiX2VuYWJsZSwKIAkuZGlzYWJsZQk9IGRzcHNfbXVzYl9kaXNhYmxlLAogCi0JLnRyeV9pZGxlCT0gZHNwc19tdXNiX3RyeV9pZGxlLAogCS5zZXRfbW9kZQk9IGRzcHNfbXVzYl9zZXRfbW9kZSwKIAkucmVjb3Zlcgk9IGRzcHNfbXVzYl9yZWNvdmVyLAogfTsKQEAgLTc4NCw2ICs3NjcsOCBAQAogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZ2x1ZSk7CiAJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CisJcG1fcnVudGltZV91c2VfYXV0b3N1c3BlbmQoJnBkZXYtPmRldik7CisJcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXkoJnBkZXYtPmRldiwgMjAwKTsKIAogCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoJnBkZXYtPmRldik7CiAJaWYgKHJldCA8IDApIHsKQEAgLTc5NSwxMSArNzgwLDE1IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnIzOwogCisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeSgmcGRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZCgmcGRldi0+ZGV2KTsKKwogCXJldHVybiAwOwogCiBlcnIzOgotCXBtX3J1bnRpbWVfcHV0KCZwZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnBkZXYtPmRldik7CiBlcnIyOgorCXBtX3J1bnRpbWVfZG9udF91c2VfYXV0b3N1c3BlbmQoJnBkZXYtPmRldik7CiAJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwogCXJldHVybiByZXQ7CiB9CkBAIC04MTEsNyArODAwLDggQEAKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihnbHVlLT5tdXNiKTsKIAogCS8qIGRpc2FibGUgdXNic3MgY2xvY2tzICovCi0JcG1fcnVudGltZV9wdXQoJnBkZXYtPmRldik7CisJcG1fcnVudGltZV9kb250X3VzZV9hdXRvc3VzcGVuZCgmcGRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9zeW5jKCZwZGV2LT5kZXYpOwogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldC5jIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldC5jCmluZGV4IDZkMWU5NzUuLmJmZjQ4NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9nYWRnZXQuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0LmMKQEAgLTE5NjQsNiArMTk2NCw5IEBACiAJICogdGhhdCBjdXJyZW50bHkgbWlzYmVoYXZlcy4KIAkgKi8KIAorCS8qIEZvcmNlIGNoZWNrIG9mIGRldmN0bCByZWdpc3RlciBmb3IgUE0gcnVudGltZSAqLworCXNjaGVkdWxlX3dvcmsoJm11c2ItPmlycV93b3JrKTsKKwogCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3kobXVzYi0+Y29udHJvbGxlcik7CiAJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQobXVzYi0+Y29udHJvbGxlcik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl92aXJ0aHViLmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfdmlydGh1Yi5jCmluZGV4IDE5MjI0OGYuLjYxYjVmMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl92aXJ0aHViLmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX3ZpcnRodWIuYwpAQCAtMjQ1LDYgKzI0NSw3IEBACiAJCQl1c2Jfb3RnX3N0YXRlX3N0cmluZyhtdXNiLT54Y2Vpdi0+b3RnLT5zdGF0ZSkpOwogCX0KIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG11c2Jfcm9vdF9kaXNjb25uZWN0KTsKIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0yOTAsNiArMjkxLDcgQEAKIAl1MzIJCXRlbXA7CiAJaW50CQlyZXR2YWwgPSAwOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJYm9vbAkJc3RhcnRfbXVzYiA9IGZhbHNlOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKIApAQCAtMzkwLDcgKzM5Miw3IEBACiAJCQkgKiBsb2dpYyByZWxhdGluZyB0byBWQlVTIHBvd2VyLXVwLgogCQkJICovCiAJCQlpZiAoIWhjZC0+c2VsZi5pc19iX2hvc3QgJiYgbXVzYl9oYXNfZ2FkZ2V0KG11c2IpKQotCQkJCW11c2Jfc3RhcnQobXVzYik7CisJCQkJc3RhcnRfbXVzYiA9IHRydWU7CiAJCQlicmVhazsKIAkJY2FzZSBVU0JfUE9SVF9GRUFUX1JFU0VUOgogCQkJbXVzYl9wb3J0X3Jlc2V0KG11c2IsIHRydWUpOwpAQCAtNDUxLDUgKzQ1Myw5IEBACiAJCXJldHZhbCA9IC1FUElQRTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXVzYi0+bG9jaywgZmxhZ3MpOworCisJaWYgKHN0YXJ0X211c2IpCisJCW11c2Jfc3RhcnQobXVzYik7CisKIAlyZXR1cm4gcmV0dmFsOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9vbWFwMjQzMC5jIGIvZHJpdmVycy91c2IvbXVzYi9vbWFwMjQzMC5jCmluZGV4IDBiNGNlYzkuLjFhYjY5NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2Ivb21hcDI0MzAuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL29tYXAyNDMwLmMKQEAgLTQ5LDkgKzQ5LDYgQEAKIAllbnVtIG11c2JfdmJ1c19pZF9zdGF0dXMgc3RhdHVzOwogCXN0cnVjdCB3b3JrX3N0cnVjdAlvbWFwX211c2JfbWFpbGJveF93b3JrOwogCXN0cnVjdCBkZXZpY2UJCSpjb250cm9sX290Z2hzOwotCWJvb2wJCQljYWJsZV9jb25uZWN0ZWQ7Ci0JYm9vbAkJCWVuYWJsZWQ7Ci0JYm9vbAkJCXBvd2VyZWQ7CiB9OwogI2RlZmluZSBnbHVlX3RvX211c2IoZykJCXBsYXRmb3JtX2dldF9kcnZkYXRhKGctPm11c2IpCiAKQEAgLTE0MSw0NSArMTM4LDYgQEAKIAltdXNiX3dyaXRlbChtdXNiLT5tcmVncywgT1RHX0ZPUkNFU1REQlksIGwpOwogfQogCi0vKgotICogV2UgY2FuIGdldCBtdWx0aXBsZSBjYWJsZSBldmVudHMgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrCi0gKiBvZiB0aGUgcG93ZXIgc3RhdGUuIE9ubHkga2VlcCBwb3dlciBlbmFibGVkIGlmIFVTQiBjYWJsZSBpcwotICogY29ubmVjdGVkIGFuZCBhIGdhZGdldCBpcyBzdGFydGVkLgotICovCi1zdGF0aWMgdm9pZCBvbWFwMjQzMF9zZXRfcG93ZXIoc3RydWN0IG11c2IgKm11c2IsIGJvb2wgZW5hYmxlZCwgYm9vbCBjYWJsZSkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBtdXNiLT5jb250cm9sbGVyOwotCXN0cnVjdCBvbWFwMjQzMF9nbHVlICpnbHVlID0gZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50KTsKLQlib29sIHBvd2VyX3VwOwotCWludCByZXM7Ci0KLQlpZiAoZ2x1ZS0+ZW5hYmxlZCAhPSBlbmFibGVkKQotCQlnbHVlLT5lbmFibGVkID0gZW5hYmxlZDsKLQotCWlmIChnbHVlLT5jYWJsZV9jb25uZWN0ZWQgIT0gY2FibGUpCi0JCWdsdWUtPmNhYmxlX2Nvbm5lY3RlZCA9IGNhYmxlOwotCi0JcG93ZXJfdXAgPSBnbHVlLT5lbmFibGVkICYmIGdsdWUtPmNhYmxlX2Nvbm5lY3RlZDsKLQlpZiAocG93ZXJfdXAgPT0gZ2x1ZS0+cG93ZXJlZCkgewotCQlkZXZfd2FybihtdXNiLT5jb250cm9sbGVyLCAicG93ZXIgc3RhdGUgYWxyZWFkeSAlaVxuIiwKLQkJCSBwb3dlcl91cCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlnbHVlLT5wb3dlcmVkID0gcG93ZXJfdXA7Ci0KLQlpZiAocG93ZXJfdXApIHsKLQkJcmVzID0gcG1fcnVudGltZV9nZXRfc3luYyhtdXNiLT5jb250cm9sbGVyKTsKLQkJaWYgKHJlcyA8IDApIHsKLQkJCWRldl9lcnIobXVzYi0+Y29udHJvbGxlciwgImNvdWxkIG5vdCBlbmFibGU6ICVpIiwgcmVzKTsKLQkJCWdsdWUtPnBvd2VyZWQgPSBmYWxzZTsKLQkJfQotCX0gZWxzZSB7Ci0JCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3kobXVzYi0+Y29udHJvbGxlcik7Ci0JCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKG11c2ItPmNvbnRyb2xsZXIpOwotCX0KLX0KLQogc3RhdGljIGludCBvbWFwMjQzMF9tdXNiX21haWxib3goZW51bSBtdXNiX3ZidXNfaWRfc3RhdHVzIHN0YXR1cykKIHsKIAlzdHJ1Y3Qgb21hcDI0MzBfZ2x1ZQkqZ2x1ZSA9IF9nbHVlOwpAQCAtMjAzLDIxICsxNjEsMTUgQEAKIHN0YXRpYyB2b2lkIG9tYXBfbXVzYl9zZXRfbWFpbGJveChzdHJ1Y3Qgb21hcDI0MzBfZ2x1ZSAqZ2x1ZSkKIHsKIAlzdHJ1Y3QgbXVzYiAqbXVzYiA9IGdsdWVfdG9fbXVzYihnbHVlKTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBtdXNiLT5jb250cm9sbGVyOwotCXN0cnVjdCBtdXNiX2hkcmNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7CisJc3RydWN0IG11c2JfaGRyY19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9CisJCWRldl9nZXRfcGxhdGRhdGEobXVzYi0+Y29udHJvbGxlcik7CiAJc3RydWN0IG9tYXBfbXVzYl9ib2FyZF9kYXRhICpkYXRhID0gcGRhdGEtPmJvYXJkX2RhdGE7CiAJc3RydWN0IHVzYl9vdGcgKm90ZyA9IG11c2ItPnhjZWl2LT5vdGc7Ci0JYm9vbCBjYWJsZV9jb25uZWN0ZWQ7CiAKLQljYWJsZV9jb25uZWN0ZWQgPSAoKGdsdWUtPnN0YXR1cyA9PSBNVVNCX0lEX0dST1VORCkgfHwKLQkJCSAgIChnbHVlLT5zdGF0dXMgPT0gTVVTQl9WQlVTX1ZBTElEKSk7Ci0KLQlpZiAoY2FibGVfY29ubmVjdGVkKQotCQlvbWFwMjQzMF9zZXRfcG93ZXIobXVzYiwgZ2x1ZS0+ZW5hYmxlZCwgY2FibGVfY29ubmVjdGVkKTsKLQorCXBtX3J1bnRpbWVfZ2V0X3N5bmMobXVzYi0+Y29udHJvbGxlcik7CiAJc3dpdGNoIChnbHVlLT5zdGF0dXMpIHsKIAljYXNlIE1VU0JfSURfR1JPVU5EOgotCQlkZXZfZGJnKGRldiwgIklEIEdORFxuIik7CisJCWRldl9kYmcobXVzYi0+Y29udHJvbGxlciwgIklEIEdORFxuIik7CiAKIAkJb3RnLT5kZWZhdWx0X2EgPSB0cnVlOwogCQltdXNiLT54Y2Vpdi0+b3RnLT5zdGF0ZSA9IE9UR19TVEFURV9BX0lETEU7CkBAIC0yMzAsNyArMTgyLDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIE1VU0JfVkJVU19WQUxJRDoKLQkJZGV2X2RiZyhkZXYsICJWQlVTIENvbm5lY3RcbiIpOworCQlkZXZfZGJnKG11c2ItPmNvbnRyb2xsZXIsICJWQlVTIENvbm5lY3RcbiIpOwogCiAJCW90Zy0+ZGVmYXVsdF9hID0gZmFsc2U7CiAJCW11c2ItPnhjZWl2LT5vdGctPnN0YXRlID0gT1RHX1NUQVRFX0JfSURMRTsKQEAgLTI0MCw3ICsxOTIsNyBAQAogCiAJY2FzZSBNVVNCX0lEX0ZMT0FUOgogCWNhc2UgTVVTQl9WQlVTX09GRjoKLQkJZGV2X2RiZyhkZXYsICJWQlVTIERpc2Nvbm5lY3RcbiIpOworCQlkZXZfZGJnKG11c2ItPmNvbnRyb2xsZXIsICJWQlVTIERpc2Nvbm5lY3RcbiIpOwogCiAJCW11c2ItPnhjZWl2LT5sYXN0X2V2ZW50ID0gVVNCX0VWRU5UX05PTkU7CiAJCWlmIChtdXNiLT5nYWRnZXRfZHJpdmVyKQpAQCAtMjUzLDEyICsyMDUsMTAgQEAKIAkJCVVTQl9NT0RFX0RJU0NPTk5FQ1QpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfZGJnKGRldiwgIklEIGZsb2F0XG4iKTsKKwkJZGV2X2RiZyhtdXNiLT5jb250cm9sbGVyLCAiSUQgZmxvYXRcbiIpOwogCX0KLQotCWlmICghY2FibGVfY29ubmVjdGVkKQotCQlvbWFwMjQzMF9zZXRfcG93ZXIobXVzYiwgZ2x1ZS0+ZW5hYmxlZCwgY2FibGVfY29ubmVjdGVkKTsKLQorCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3kobXVzYi0+Y29udHJvbGxlcik7CisJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQobXVzYi0+Y29udHJvbGxlcik7CiAJYXRvbWljX25vdGlmaWVyX2NhbGxfY2hhaW4oJm11c2ItPnhjZWl2LT5ub3RpZmllciwKIAkJCW11c2ItPnhjZWl2LT5sYXN0X2V2ZW50LCBOVUxMKTsKIH0KQEAgLTM3Niw4ICszMjYsNiBAQAogCWlmICghV0FSTl9PTighbXVzYi0+cGh5KSkKIAkJcGh5X3Bvd2VyX29uKG11c2ItPnBoeSk7CiAKLQlvbWFwMjQzMF9zZXRfcG93ZXIobXVzYiwgdHJ1ZSwgZ2x1ZS0+Y2FibGVfY29ubmVjdGVkKTsKLQogCXN3aXRjaCAoZ2x1ZS0+c3RhdHVzKSB7CiAKIAljYXNlIE1VU0JfSURfR1JPVU5EOgpAQCAtNDE5LDggKzM2Nyw2IEBACiAJaWYgKGdsdWUtPnN0YXR1cyAhPSBNVVNCX1VOS05PV04pCiAJCW9tYXBfY29udHJvbF91c2Jfc2V0X21vZGUoZ2x1ZS0+Y29udHJvbF9vdGdocywKIAkJCVVTQl9NT0RFX0RJU0NPTk5FQ1QpOwotCi0Jb21hcDI0MzBfc2V0X3Bvd2VyKG11c2IsIGZhbHNlLCBnbHVlLT5jYWJsZV9jb25uZWN0ZWQpOwogfQogCiBzdGF0aWMgaW50IG9tYXAyNDMwX211c2JfZXhpdChzdHJ1Y3QgbXVzYiAqbXVzYikKQEAgLTU3MSw3ICs1MTcsNyBAQAogCiAJcG1fcnVudGltZV9lbmFibGUoZ2x1ZS0+ZGV2KTsKIAlwbV9ydW50aW1lX3VzZV9hdXRvc3VzcGVuZChnbHVlLT5kZXYpOwotCXBtX3J1bnRpbWVfc2V0X2F1dG9zdXNwZW5kX2RlbGF5KGdsdWUtPmRldiwgNTAwKTsKKwlwbV9ydW50aW1lX3NldF9hdXRvc3VzcGVuZF9kZWxheShnbHVlLT5kZXYsIDEwMCk7CiAKIAlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKG11c2IpOwogCWlmIChyZXQpIHsKQEAgLTU5MSwxMSArNTM3LDkgQEAKIHN0YXRpYyBpbnQgb21hcDI0MzBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IG9tYXAyNDMwX2dsdWUgKmdsdWUgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgbXVzYiAqbXVzYiA9IGdsdWVfdG9fbXVzYihnbHVlKTsKIAogCXBtX3J1bnRpbWVfZ2V0X3N5bmMoZ2x1ZS0+ZGV2KTsKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihnbHVlLT5tdXNiKTsKLQlvbWFwMjQzMF9zZXRfcG93ZXIobXVzYiwgZmFsc2UsIGZhbHNlKTsKIAlwbV9ydW50aW1lX3B1dF9zeW5jKGdsdWUtPmRldik7CiAJcG1fcnVudGltZV9kb250X3VzZV9hdXRvc3VzcGVuZChnbHVlLT5kZXYpOwogCXBtX3J1bnRpbWVfZGlzYWJsZShnbHVlLT5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9zdW54aS5jIGIvZHJpdmVycy91c2IvbXVzYi9zdW54aS5jCmluZGV4IGM2ZWUxNjYuLjE0MDgyNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2Ivc3VueGkuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL3N1bnhpLmMKQEAgLTc0LDYgKzc0LDcgQEAKICNkZWZpbmUgU1VOWElfTVVTQl9GTF9IQVNfU1JBTQkJCTUKICNkZWZpbmUgU1VOWElfTVVTQl9GTF9IQVNfUkVTRVQJCQk2CiAjZGVmaW5lIFNVTlhJX01VU0JfRkxfTk9fQ09ORklHREFUQQkJNworI2RlZmluZSBTVU5YSV9NVVNCX0ZMX1BIWV9NT0RFX1BFTkQJCTgKIAogLyogT3VyIHJlYWQvd3JpdGUgbWV0aG9kcyBuZWVkIGFjY2VzcyBhbmQgZG8gbm90IGdldCBwYXNzZWQgaW4gYSBtdXNiIHJlZiA6fCAqLwogc3RhdGljIHN0cnVjdCBtdXNiICpzdW54aV9tdXNiOwpAQCAtODcsNiArODgsNyBAQAogCXN0cnVjdCBwaHkJCSpwaHk7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqdXNiX3BoeTsKIAlzdHJ1Y3QgdXNiX3BoeQkJKnhjZWl2OworCWVudW0gcGh5X21vZGUJCXBoeV9tb2RlOwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOwogCXN0cnVjdCBleHRjb25fZGV2CSpleHRjb247CkBAIC0xNDAsNiArMTQyLDkgQEAKIAkJCWNsZWFyX2JpdChTVU5YSV9NVVNCX0ZMX1BIWV9PTiwgJmdsdWUtPmZsYWdzKTsKIAkJfQogCX0KKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU1VOWElfTVVTQl9GTF9QSFlfTU9ERV9QRU5ELCAmZ2x1ZS0+ZmxhZ3MpKQorCQlwaHlfc2V0X21vZGUoZ2x1ZS0+cGh5LCBnbHVlLT5waHlfbW9kZSk7CiB9CiAKIHN0YXRpYyB2b2lkIHN1bnhpX211c2Jfc2V0X3ZidXMoc3RydWN0IG11c2IgKm11c2IsIGludCBpc19vbikKQEAgLTM0MSw2ICszNDYsNTAgQEAKIHsKIH0KIAorc3RhdGljIGludCBzdW54aV9tdXNiX3NldF9tb2RlKHN0cnVjdCBtdXNiICptdXNiLCB1OCBtb2RlKQoreworCXN0cnVjdCBzdW54aV9nbHVlICpnbHVlID0gZGV2X2dldF9kcnZkYXRhKG11c2ItPmNvbnRyb2xsZXItPnBhcmVudCk7CisJZW51bSBwaHlfbW9kZSBuZXdfbW9kZTsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgTVVTQl9IT1NUOgorCQluZXdfbW9kZSA9IFBIWV9NT0RFX1VTQl9IT1NUOworCQlicmVhazsKKwljYXNlIE1VU0JfUEVSSVBIRVJBTDoKKwkJbmV3X21vZGUgPSBQSFlfTU9ERV9VU0JfREVWSUNFOworCQlicmVhazsKKwljYXNlIE1VU0JfT1RHOgorCQluZXdfbW9kZSA9IFBIWV9NT0RFX1VTQl9PVEc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIobXVzYi0+Y29udHJvbGxlci0+cGFyZW50LAorCQkJIkVycm9yIHJlcXVlc3RlZCBtb2RlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBrZXJuZWxcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZ2x1ZS0+cGh5X21vZGUgPT0gbmV3X21vZGUpCisJCXJldHVybiAwOworCisJaWYgKG11c2ItPnBvcnRfbW9kZSAhPSBNVVNCX1BPUlRfTU9ERV9EVUFMX1JPTEUpIHsKKwkJZGV2X2VycihtdXNiLT5jb250cm9sbGVyLT5wYXJlbnQsCisJCQkiRXJyb3IgY2hhbmdpbmcgbW9kZXMgaXMgb25seSBzdXBwb3J0ZWQgaW4gZHVhbCByb2xlIG1vZGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobXVzYi0+cG9ydDFfc3RhdHVzICYgVVNCX1BPUlRfU1RBVF9FTkFCTEUpCisJCW11c2Jfcm9vdF9kaXNjb25uZWN0KG11c2IpOworCisJLyoKKwkgKiBwaHlfc2V0X21vZGUgbWF5IHNsZWVwLCBhbmQgd2UncmUgY2FsbGVkIHdpdGggYSBzcGlubG9jayBoZWxkLAorCSAqIHNvIGxldCBzdW54aV9tdXNiX3dvcmsgZGVhbCB3aXRoIGl0LgorCSAqLworCWdsdWUtPnBoeV9tb2RlID0gbmV3X21vZGU7CisJc2V0X2JpdChTVU5YSV9NVVNCX0ZMX1BIWV9NT0RFX1BFTkQsICZnbHVlLT5mbGFncyk7CisJc2NoZWR1bGVfd29yaygmZ2x1ZS0+d29yayk7CisKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIHN1bnhpIG11c2IgcmVnaXN0ZXIgbGF5b3V0CiAgKiAweDAwIC0gMHgxNwlmaWZvIHJlZ3MsIDEgbG9uZyBwZXIgZmlmbwpAQCAtNTY4LDYgKzYxNyw3IEBACiAJLndyaXRldwkJPSBzdW54aV9tdXNiX3dyaXRldywKIAkuZG1hX2luaXQJPSBzdW54aV9tdXNiX2RtYV9jb250cm9sbGVyX2NyZWF0ZSwKIAkuZG1hX2V4aXQJPSBzdW54aV9tdXNiX2RtYV9jb250cm9sbGVyX2Rlc3Ryb3ksCisJLnNldF9tb2RlCT0gc3VueGlfbXVzYl9zZXRfbW9kZSwKIAkuc2V0X3ZidXMJPSBzdW54aV9tdXNiX3NldF92YnVzLAogCS5wcmVfcm9vdF9yZXNldF9lbmQgPSBzdW54aV9tdXNiX3ByZV9yb290X3Jlc2V0X2VuZCwKIAkucG9zdF9yb290X3Jlc2V0X2VuZCA9IHN1bnhpX211c2JfcG9zdF9yb290X3Jlc2V0X2VuZCwKQEAgLTYxNCwyMSArNjY0LDI4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWdsdWUgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpnbHVlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFnbHVlKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCW1lbXNldCgmcGRhdGEsIDAsIHNpemVvZihwZGF0YSkpOwogCXN3aXRjaCAodXNiX2dldF9kcl9tb2RlKCZwZGV2LT5kZXYpKSB7CiAjaWYgZGVmaW5lZCBDT05GSUdfVVNCX01VU0JfRFVBTF9ST0xFIHx8IGRlZmluZWQgQ09ORklHX1VTQl9NVVNCX0hPU1QKIAljYXNlIFVTQl9EUl9NT0RFX0hPU1Q6CiAJCXBkYXRhLm1vZGUgPSBNVVNCX1BPUlRfTU9ERV9IT1NUOworCQlnbHVlLT5waHlfbW9kZSA9IFBIWV9NT0RFX1VTQl9IT1NUOwogCQlicmVhazsKICNlbmRpZgogI2lmIGRlZmluZWQgQ09ORklHX1VTQl9NVVNCX0RVQUxfUk9MRSB8fCBkZWZpbmVkIENPTkZJR19VU0JfTVVTQl9HQURHRVQKIAljYXNlIFVTQl9EUl9NT0RFX1BFUklQSEVSQUw6CiAJCXBkYXRhLm1vZGUgPSBNVVNCX1BPUlRfTU9ERV9HQURHRVQ7CisJCWdsdWUtPnBoeV9tb2RlID0gUEhZX01PREVfVVNCX0RFVklDRTsKIAkJYnJlYWs7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfVVNCX01VU0JfRFVBTF9ST0xFCiAJY2FzZSBVU0JfRFJfTU9ERV9PVEc6CiAJCXBkYXRhLm1vZGUgPSBNVVNCX1BPUlRfTU9ERV9EVUFMX1JPTEU7CisJCWdsdWUtPnBoeV9tb2RlID0gUEhZX01PREVfVVNCX09URzsKIAkJYnJlYWs7CiAjZW5kaWYKIAlkZWZhdWx0OgpAQCAtNjM4LDEwICs2OTUsNiBAQAogCXBkYXRhLnBsYXRmb3JtX29wcwk9ICZzdW54aV9tdXNiX29wczsKIAlwZGF0YS5jb25maWcJCT0gJnN1bnhpX211c2JfaGRyY19jb25maWc7CiAKLQlnbHVlID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZ2x1ZSksIEdGUF9LRVJORUwpOwotCWlmICghZ2x1ZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAlnbHVlLT5kZXYgPSAmcGRldi0+ZGV2OwogCUlOSVRfV09SSygmZ2x1ZS0+d29yaywgc3VueGlfbXVzYl93b3JrKTsKIAlnbHVlLT5ob3N0X25iLm5vdGlmaWVyX2NhbGwgPSBzdW54aV9tdXNiX2hvc3Rfbm90aWZpZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9waHkvcGh5LWFiODUwMC11c2IuYyBiL2RyaXZlcnMvdXNiL3BoeS9waHktYWI4NTAwLXVzYi5jCmluZGV4IDBjOTEyZDMuLmEwM2NhZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3BoeS9waHktYWI4NTAwLXVzYi5jCisrKyBiL2RyaXZlcnMvdXNiL3BoeS9waHktYWI4NTAwLXVzYi5jCkBAIC0xMjQ4LDcgKzEyNDgsNyBAQAogCWVyciA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShhYi0+ZGV2LAogCQkJQUI4NTAwX0RFQlVHLCBBQjg1MDBfVVNCX1BIWV9UVU5FMywgMHg3OCk7CiAJaWYgKGVyciA8IDApCi0JCWRldl9lcnIoYWItPmRldiwgIkZhaWxlZCB0byBzZXQgUEhZX1RVTkUzIHJlZ2VzdGVyIGVycj0lZFxuIiwKKwkJZGV2X2VycihhYi0+ZGV2LCAiRmFpbGVkIHRvIHNldCBQSFlfVFVORTMgcmVnaXN0ZXIgZXJyPSVkXG4iLAogCQkJCWVycik7CiAKIAkvKiBTd2l0Y2ggdG8gbm9ybWFsIG1vZGUvZGlzYWJsZSBCYW5rIDB4MTIgYWNjZXNzICovCkBAIC0xMjkwLDcgKzEyOTAsNyBAQAogCQkJMHhGQywgMHg4MCk7CiAKIAlpZiAoZXJyIDwgMCkKLQkJZGV2X2VycihhYi0+ZGV2LCAiRmFpbGVkIHRvIHNldCBQSFlfVFVORTMgcmVnZXN0ZXIgZXJyPSVkXG4iLAorCQlkZXZfZXJyKGFiLT5kZXYsICJGYWlsZWQgdG8gc2V0IFBIWV9UVU5FMyByZWdpc3RlciBlcnI9JWRcbiIsCiAJCQkJZXJyKTsKIAogCS8qIFN3aXRjaCB0byBub3JtYWwgbW9kZS9kaXNhYmxlIEJhbmsgMHgxMiBhY2Nlc3MgKi8KQEAgLTEzMjEsNyArMTMyMSw3IEBACiAJZXJyID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGFiLT5kZXYsCiAJCQlBQjg1NDBfREVCVUcsIEFCODUwMF9VU0JfUEhZX1RVTkUzLCAweDkwKTsKIAlpZiAoZXJyIDwgMCkKLQkJZGV2X2VycihhYi0+ZGV2LCAiRmFpbGVkIHRvIHNldCBQSFlfVFVORTMgcmVnZXN0ZXIgcmV0PSVkXG4iLAorCQlkZXZfZXJyKGFiLT5kZXYsICJGYWlsZWQgdG8gc2V0IFBIWV9UVU5FMyByZWdpc3RlciByZXQ9JWRcbiIsCiAJCQkJZXJyKTsKIH0KIApAQCAtMTM1MSw3ICsxMzUxLDcgQEAKIAllcnIgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoYWItPmRldiwKIAkJCUFCODUwMF9ERUJVRywgQUI4NTAwX1VTQl9QSFlfVFVORTMsIDB4ODApOwogCWlmIChlcnIgPCAwKQotCQlkZXZfZXJyKGFiLT5kZXYsICJGYWlsZWQgdG8gc2V0IFBIWV9UVU5FMyByZWdlc3RlciBlcnI9JWRcbiIsCisJCWRldl9lcnIoYWItPmRldiwgIkZhaWxlZCB0byBzZXQgUEhZX1RVTkUzIHJlZ2lzdGVyIGVycj0lZFxuIiwKIAkJCQllcnIpOwogCiAJLyogU3dpdGNoIHRvIG5vcm1hbCBtb2RlL2Rpc2FibGUgQmFuayAweDEyIGFjY2VzcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcGh5L3BoeS1nZW5lcmljLmMgYi9kcml2ZXJzL3VzYi9waHkvcGh5LWdlbmVyaWMuYwppbmRleCA5ODBjOWRlLi44MzExYmEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9waHkvcGh5LWdlbmVyaWMuYworKysgYi9kcml2ZXJzL3VzYi9waHkvcGh5LWdlbmVyaWMuYwpAQCAtMTE4LDggKzExOCw2IEBACiAJCXN0YXR1cyA9IFVTQl9FVkVOVF9WQlVTOwogCQlvdGctPnN0YXRlID0gT1RHX1NUQVRFX0JfUEVSSVBIRVJBTDsKIAkJbm9wLT5waHkubGFzdF9ldmVudCA9IHN0YXR1czsKLQkJaWYgKG90Zy0+Z2FkZ2V0KQotCQkJdXNiX2dhZGdldF92YnVzX2Nvbm5lY3Qob3RnLT5nYWRnZXQpOwogCiAJCS8qIGRyYXdpbmcgYSAidW5pdCBsb2FkIiBpcyAqYWx3YXlzKiBPSywgZXhjZXB0IGZvciBPVEcgKi8KIAkJbm9wX3NldF92YnVzX2RyYXcobm9wLCAxMDApOwpAQCAtMTI5LDggKzEyNyw2IEBACiAJfSBlbHNlIHsKIAkJbm9wX3NldF92YnVzX2RyYXcobm9wLCAwKTsKIAotCQlpZiAob3RnLT5nYWRnZXQpCi0JCQl1c2JfZ2FkZ2V0X3ZidXNfZGlzY29ubmVjdChvdGctPmdhZGdldCk7CiAJCXN0YXR1cyA9IFVTQl9FVkVOVF9OT05FOwogCQlvdGctPnN0YXRlID0gT1RHX1NUQVRFX0JfSURMRTsKIAkJbm9wLT5waHkubGFzdF9ldmVudCA9IHN0YXR1czsKQEAgLTE0NCwxNCArMTQwLDE4IEBACiBpbnQgdXNiX2dlbl9waHlfaW5pdChzdHJ1Y3QgdXNiX3BoeSAqcGh5KQogewogCXN0cnVjdCB1c2JfcGh5X2dlbmVyaWMgKm5vcCA9IGRldl9nZXRfZHJ2ZGF0YShwaHktPmRldik7CisJaW50IHJldDsKIAogCWlmICghSVNfRVJSKG5vcC0+dmNjKSkgewogCQlpZiAocmVndWxhdG9yX2VuYWJsZShub3AtPnZjYykpCiAJCQlkZXZfZXJyKHBoeS0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBwb3dlclxuIik7CiAJfQogCi0JaWYgKCFJU19FUlIobm9wLT5jbGspKQotCQljbGtfcHJlcGFyZV9lbmFibGUobm9wLT5jbGspOworCWlmICghSVNfRVJSKG5vcC0+Y2xrKSkgeworCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUobm9wLT5jbGspOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CiAKIAlub3BfcmVzZXQobm9wKTsKIApAQCAtMTg3LDcgKzE4Nyw4IEBACiAKIAlvdGctPmdhZGdldCA9IGdhZGdldDsKIAlpZiAob3RnLT5zdGF0ZSA9PSBPVEdfU1RBVEVfQl9QRVJJUEhFUkFMKQotCQl1c2JfZ2FkZ2V0X3ZidXNfY29ubmVjdChnYWRnZXQpOworCQlhdG9taWNfbm90aWZpZXJfY2FsbF9jaGFpbigmb3RnLT51c2JfcGh5LT5ub3RpZmllciwKKwkJCQkJICAgVVNCX0VWRU5UX1ZCVVMsIG90Zy0+Z2FkZ2V0KTsKIAllbHNlCiAJCW90Zy0+c3RhdGUgPSBPVEdfU1RBVEVfQl9JRExFOwogCXJldHVybiAwOwpAQCAtMzIyLDYgKzMyMyw4IEBACiAJCQkJZ3Bpb2RfdG9faXJxKG5vcC0+Z3Bpb2RfdmJ1cyksIGVycik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CisJCW5vcC0+cGh5Lm90Zy0+c3RhdGUgPSBncGlvZF9nZXRfdmFsdWUobm9wLT5ncGlvZF92YnVzKSA/CisJCQlPVEdfU1RBVEVfQl9QRVJJUEhFUkFMIDogT1RHX1NUQVRFX0JfSURMRTsKIAl9CiAKIAlub3AtPnBoeS5pbml0CQk9IHVzYl9nZW5fcGh5X2luaXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9waHkvcGh5LW14cy11c2IuYyBiL2RyaXZlcnMvdXNiL3BoeS9waHktbXhzLXVzYi5jCmluZGV4IDAwYmZlYTAuLjBlMmYxYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3BoeS9waHktbXhzLXVzYi5jCisrKyBiL2RyaXZlcnMvdXNiL3BoeS9waHktbXhzLXVzYi5jCkBAIC0yNyw2ICsyNyw3IEBACiAjZGVmaW5lIERSSVZFUl9OQU1FICJteHNfcGh5IgogCiAjZGVmaW5lIEhXX1VTQlBIWV9QV0QJCQkJMHgwMAorI2RlZmluZSBIV19VU0JQSFlfVFgJCQkJMHgxMAogI2RlZmluZSBIV19VU0JQSFlfQ1RSTAkJCQkweDMwCiAjZGVmaW5lIEhXX1VTQlBIWV9DVFJMX1NFVAkJCTB4MzQKICNkZWZpbmUgSFdfVVNCUEhZX0NUUkxfQ0xSCQkJMHgzOApAQCAtMzgsNiArMzksMTAgQEAKICNkZWZpbmUgSFdfVVNCUEhZX0lQX1NFVAkJCTB4OTQKICNkZWZpbmUgSFdfVVNCUEhZX0lQX0NMUgkJCTB4OTgKIAorI2RlZmluZSBHTV9VU0JQSFlfVFhfVFhDQUw0NURQKHgpICAgICAgICAgICAgKCgoeCkgJiAweGYpIDw8IDE2KQorI2RlZmluZSBHTV9VU0JQSFlfVFhfVFhDQUw0NUROKHgpICAgICAgICAgICAgKCgoeCkgJiAweGYpIDw8IDgpCisjZGVmaW5lIEdNX1VTQlBIWV9UWF9EX0NBTCh4KSAgICAgICAgICAgICAgICAoKCh4KSAmIDB4ZikgPDwgMCkKKwogI2RlZmluZSBCTV9VU0JQSFlfQ1RSTF9TRlRSU1QJCQlCSVQoMzEpCiAjZGVmaW5lIEJNX1VTQlBIWV9DVFJMX0NMS0dBVEUJCQlCSVQoMzApCiAjZGVmaW5lIEJNX1VTQlBIWV9DVFJMX09UR19JRF9WQUxVRQkJQklUKDI3KQpAQCAtMTE1LDYgKzEyMCwxMiBAQAogICovCiAjZGVmaW5lIE1YU19QSFlfTkVFRF9JUF9GSVgJCQlCSVQoMykKIAorLyogTWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgZm9yIGRldmljZSB0cmVlIGVudHJpZXMgKi8KKyNkZWZpbmUgTVhTX1BIWV9UWF9DQUw0NV9NSU4JCQkzMAorI2RlZmluZSBNWFNfUEhZX1RYX0NBTDQ1X01BWAkJCTU1CisjZGVmaW5lIE1YU19QSFlfVFhfRF9DQUxfTUlOCQkJNzkKKyNkZWZpbmUgTVhTX1BIWV9UWF9EX0NBTF9NQVgJCQkxMTkKKwogc3RydWN0IG14c19waHlfZGF0YSB7CiAJdW5zaWduZWQgaW50IGZsYWdzOwogfTsKQEAgLTE2NCw2ICsxNzUsOCBAQAogCWNvbnN0IHN0cnVjdCBteHNfcGh5X2RhdGEgKmRhdGE7CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwX2FuYXRvcDsKIAlpbnQgcG9ydF9pZDsKKwl1MzIgdHhfcmVnX3NldDsKKwl1MzIgdHhfcmVnX21hc2s7CiB9OwogCiBzdGF0aWMgaW5saW5lIGJvb2wgaXNfaW14NnFfcGh5KHN0cnVjdCBteHNfcGh5ICpteHNfcGh5KQpAQCAtMTg1LDYgKzE5OCwyMCBAQAogCXVzbGVlcF9yYW5nZSgzMDAsIDQwMCk7CiB9CiAKK3N0YXRpYyB2b2lkIG14c19waHlfdHhfaW5pdChzdHJ1Y3QgbXhzX3BoeSAqbXhzX3BoeSkKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBteHNfcGh5LT5waHkuaW9fcHJpdjsKKwl1MzIgcGh5dHg7CisKKwkvKiBVcGRhdGUgVFggcmVnaXN0ZXIgaWYgdGhlcmUgaXMgYW55dGhpbmcgdG8gd3JpdGUgKi8KKwlpZiAobXhzX3BoeS0+dHhfcmVnX21hc2spIHsKKwkJcGh5dHggPSByZWFkbChiYXNlICsgSFdfVVNCUEhZX1RYKTsKKwkJcGh5dHggJj0gfm14c19waHktPnR4X3JlZ19tYXNrOworCQlwaHl0eCB8PSBteHNfcGh5LT50eF9yZWdfc2V0OworCQl3cml0ZWwocGh5dHgsIGJhc2UgKyBIV19VU0JQSFlfVFgpOworCX0KK30KKwogc3RhdGljIGludCBteHNfcGh5X2h3X2luaXQoc3RydWN0IG14c19waHkgKm14c19waHkpCiB7CiAJaW50IHJldDsKQEAgLTIxNCw2ICsyNDEsOCBAQAogCWlmIChteHNfcGh5LT5kYXRhLT5mbGFncyAmIE1YU19QSFlfTkVFRF9JUF9GSVgpCiAJCXdyaXRlbChCTV9VU0JQSFlfSVBfRklYLCBiYXNlICsgSFdfVVNCUEhZX0lQX1NFVCk7CiAKKwlteHNfcGh5X3R4X2luaXQobXhzX3BoeSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDU5LDYgKzQ4OCw3IEBACiAJaW50IHJldDsKIAljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJdTMyIHZhbDsKIAogCW9mX2lkID0gb2ZfbWF0Y2hfZGV2aWNlKG14c19waHlfZHRfaWRzLCAmcGRldi0+ZGV2KTsKIAlpZiAoIW9mX2lkKQpAQCAtNDkxLDYgKzUyMSwzNyBAQAogCQl9CiAJfQogCisJLyogUHJlY29tcHV0ZSB3aGljaCBiaXRzIG9mIHRoZSBUWCByZWdpc3RlciBhcmUgdG8gYmUgdXBkYXRlZCwgaWYgYW55ICovCisJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImZzbCx0eC1jYWwtNDUtZG4tb2htcyIsICZ2YWwpICYmCisJICAgIHZhbCA+PSBNWFNfUEhZX1RYX0NBTDQ1X01JTiAmJiB2YWwgPD0gTVhTX1BIWV9UWF9DQUw0NV9NQVgpIHsKKwkJLyogU2NhbGUgdG8gYSA0LWJpdCB2YWx1ZSAqLworCQl2YWwgPSAoTVhTX1BIWV9UWF9DQUw0NV9NQVggLSB2YWwpICogMHhGCisJCQkvIChNWFNfUEhZX1RYX0NBTDQ1X01BWCAtIE1YU19QSFlfVFhfQ0FMNDVfTUlOKTsKKwkJbXhzX3BoeS0+dHhfcmVnX21hc2sgfD0gR01fVVNCUEhZX1RYX1RYQ0FMNDVETih+MCk7CisJCW14c19waHktPnR4X3JlZ19zZXQgIHw9IEdNX1VTQlBIWV9UWF9UWENBTDQ1RE4odmFsKTsKKwl9CisKKwlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiZnNsLHR4LWNhbC00NS1kcC1vaG1zIiwgJnZhbCkgJiYKKwkgICAgdmFsID49IE1YU19QSFlfVFhfQ0FMNDVfTUlOICYmIHZhbCA8PSBNWFNfUEhZX1RYX0NBTDQ1X01BWCkgeworCQkvKiBTY2FsZSB0byBhIDQtYml0IHZhbHVlLiAqLworCQl2YWwgPSAoTVhTX1BIWV9UWF9DQUw0NV9NQVggLSB2YWwpICogMHhGCisJCQkvIChNWFNfUEhZX1RYX0NBTDQ1X01BWCAtIE1YU19QSFlfVFhfQ0FMNDVfTUlOKTsKKwkJbXhzX3BoeS0+dHhfcmVnX21hc2sgfD0gR01fVVNCUEhZX1RYX1RYQ0FMNDVEUCh+MCk7CisJCW14c19waHktPnR4X3JlZ19zZXQgIHw9IEdNX1VTQlBIWV9UWF9UWENBTDQ1RFAodmFsKTsKKwl9CisKKwlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiZnNsLHR4LWQtY2FsIiwgJnZhbCkgJiYKKwkgICAgdmFsID49IE1YU19QSFlfVFhfRF9DQUxfTUlOICYmIHZhbCA8PSBNWFNfUEhZX1RYX0RfQ0FMX01BWCkgeworCQkvKiBTY2FsZSB0byBhIDQtYml0IHZhbHVlLiAgUm91bmQgdXAgdGhlIHZhbHVlcyBhbmQgaGVhdmlseQorCQkgKiB3ZWlnaHQgdGhlIHJvdW5kaW5nIGJ5IGFkZGluZyAyLzMgb2YgdGhlIGRlbm9taW5hdG9yLgorCQkgKi8KKwkJdmFsID0gKChNWFNfUEhZX1RYX0RfQ0FMX01BWCAtIHZhbCkgKiAweEYKKwkJCSsgKE1YU19QSFlfVFhfRF9DQUxfTUFYIC0gTVhTX1BIWV9UWF9EX0NBTF9NSU4pICogMi8zKQorCQkJLyAoTVhTX1BIWV9UWF9EX0NBTF9NQVggLSBNWFNfUEhZX1RYX0RfQ0FMX01JTik7CisJCW14c19waHktPnR4X3JlZ19tYXNrIHw9IEdNX1VTQlBIWV9UWF9EX0NBTCh+MCk7CisJCW14c19waHktPnR4X3JlZ19zZXQgIHw9IEdNX1VTQlBIWV9UWF9EX0NBTCh2YWwpOworCX0KKwogCXJldCA9IG9mX2FsaWFzX2dldF9pZChucCwgInVzYnBoeSIpOwogCWlmIChyZXQgPCAwKQogCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGFsaWFzIGlkLCBlcnJubyAlZFxuIiwgcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3BoeS9waHktb21hcC1vdGcuYyBiL2RyaXZlcnMvdXNiL3BoeS9waHktb21hcC1vdGcuYwppbmRleCA2ZjZkMmE3Li42NTIzYWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9waHkvcGh5LW9tYXAtb3RnLmMKKysrIGIvZHJpdmVycy91c2IvcGh5L3BoeS1vbWFwLW90Zy5jCkBAIC0xNDAsNiArMTQwLDggQEAKIAkJIChyZXYgPj4gNCkgJiAweGYsIHJldiAmIDB4ZiwgY29uZmlnLT5leHRjb24sIG90Z19kZXYtPmlkLAogCQkgb3RnX2Rldi0+dmJ1cyk7CiAKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBvdGdfZGV2KTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL2NvbW1vbi5jIGIvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9jb21tb24uYwppbmRleCA4ZmJiYzJkLi4wMTJhMzdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvY29tbW9uLmMKQEAgLTQ4Miw2ICs0ODIsMTAgQEAKIAkJLmRhdGEgPSAodm9pZCAqKVVTQkhTX1RZUEVfUkNBUl9HRU4zLAogCX0sCiAJeworCQkuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHVzYmhzLXI4YTc3OTYiLAorCQkuZGF0YSA9ICh2b2lkICopVVNCSFNfVFlQRV9SQ0FSX0dFTjMsCisJfSwKKwl7CiAJCS5jb21wYXRpYmxlID0gInJlbmVzYXMscmNhci1nZW4yLXVzYmhzIiwKIAkJLmRhdGEgPSAodm9pZCAqKVVTQkhTX1RZUEVfUkNBUl9HRU4yLAogCX0sCkBAIC01MTQsNyArNTE4LDggQEAKIAlpZiAoZ3BpbyA+IDApCiAJCWRwYXJhbS0+ZW5hYmxlX2dwaW8gPSBncGlvOwogCi0JaWYgKGRwYXJhbS0+dHlwZSA9PSBVU0JIU19UWVBFX1JDQVJfR0VOMikKKwlpZiAoZHBhcmFtLT50eXBlID09IFVTQkhTX1RZUEVfUkNBUl9HRU4yIHx8CisJICAgIGRwYXJhbS0+dHlwZSA9PSBVU0JIU19UWVBFX1JDQVJfR0VOMykKIAkJZHBhcmFtLT5oYXNfdXNiX2RtYWMgPSAxOwogCiAJcmV0dXJuIGluZm87CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL2ZpZm8uYyBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvZmlmby5jCmluZGV4IDI4MGVkNWYuLjg1N2U3ODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvZmlmby5jCisrKyBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvZmlmby5jCkBAIC04NzEsNyArODcxLDcgQEAKIAogCS8qIHVzZSBQSU8gaWYgcGFja2V0IGlzIGxlc3MgdGhhbiBwaW9fZG1hX2JvcmRlciBvciBwaXBlIGlzIERDUCAqLwogCWlmICgobGVuIDwgdXNiaHNfZ2V0X2RwYXJhbShwcml2LCBwaW9fZG1hX2JvcmRlcikpIHx8Ci0JICAgIHVzYmhzX3BpcGVfaXNfZGNwKHBpcGUpKQorCSAgICB1c2Joc19waXBlX3R5cGVfaXMocGlwZSwgVVNCX0VORFBPSU5UX1hGRVJfSVNPQykpCiAJCWdvdG8gdXNiaHNmX3Bpb19wcmVwYXJlX3B1c2g7CiAKIAkvKiBjaGVjayBkYXRhIGxlbmd0aCBpZiB0aGlzIGRyaXZlciBkb24ndCB1c2UgVVNCLURNQUMgKi8KQEAgLTk3Niw3ICs5NzYsNyBAQAogCiAJLyogdXNlIFBJTyBpZiBwYWNrZXQgaXMgbGVzcyB0aGFuIHBpb19kbWFfYm9yZGVyIG9yIHBpcGUgaXMgRENQICovCiAJaWYgKChwa3QtPmxlbmd0aCA8IHVzYmhzX2dldF9kcGFyYW0ocHJpdiwgcGlvX2RtYV9ib3JkZXIpKSB8fAotCSAgICB1c2Joc19waXBlX2lzX2RjcChwaXBlKSkKKwkgICAgdXNiaHNfcGlwZV90eXBlX2lzKHBpcGUsIFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpKQogCQlnb3RvIHVzYmhzZl9waW9fcHJlcGFyZV9wb3A7CiAKIAlmaWZvID0gdXNiaHNmX2dldF9kbWFfZmlmbyhwcml2LCBwa3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9tb2QuYyBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvbW9kLmMKaW5kZXggZDRiZTVkNS4uMjg5NjVlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9tb2QuYworKysgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL21vZC5jCkBAIC0yODIsOSArMjgyLDE2IEBACiAJaWYgKHVzYmhzX21vZF9pc19ob3N0KHByaXYpKQogCQl1c2Joc193cml0ZShwcml2LCBJTlRTVFMxLCB+aXJxX3N0YXRlLmludHN0czEgJiBJTlRTVFMxX01BR0lDKTsKIAotCXVzYmhzX3dyaXRlKHByaXYsIEJSRFlTVFMsIH5pcnFfc3RhdGUuYnJkeXN0cyk7CisJLyoKKwkgKiBUaGUgZHJpdmVyIHNob3VsZCBub3QgY2xlYXIgdGhlIHh4eFNUUyBhZnRlciB0aGUgbGluZSBvZgorCSAqICJjYWxsIGlycSBjYWxsYmFjayBmdW5jdGlvbnMiIGJlY2F1c2UgZWFjaCAiaWYiIHN0YXRlbWVudCBpcworCSAqIHBvc3NpYmxlIHRvIGNhbGwgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBhdm9pZGluZyBhbnkgc2lkZSBlZmZlY3RzLgorCSAqLworCWlmIChpcnFfc3RhdGUuaW50c3RzMCAmIEJSRFkpCisJCXVzYmhzX3dyaXRlKHByaXYsIEJSRFlTVFMsIH5pcnFfc3RhdGUuYnJkeXN0cyk7CiAJdXNiaHNfd3JpdGUocHJpdiwgTlJEWVNUUywgfmlycV9zdGF0ZS5ucmR5c3RzKTsKLQl1c2Joc193cml0ZShwcml2LCBCRU1QU1RTLCB+aXJxX3N0YXRlLmJlbXBzdHMpOworCWlmIChpcnFfc3RhdGUuaW50c3RzMCAmIEJFTVApCisJCXVzYmhzX3dyaXRlKHByaXYsIEJFTVBTVFMsIH5pcnFfc3RhdGUuYmVtcHN0cyk7CiAKIAkvKgogCSAqIGNhbGwgaXJxIGNhbGxiYWNrIGZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9tb2RfZ2FkZ2V0LmMgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL21vZF9nYWRnZXQuYwppbmRleCA1MGYzMzYzLi41YmM3YTYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL21vZF9nYWRnZXQuYworKysgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL21vZF9nYWRnZXQuYwpAQCAtMzM1LDcgKzMzNSw2IEBACiAJYnVmID0ga21hbGxvYyhzaXplb2YoKmJ1ZiksIEdGUF9BVE9NSUMpOwogCWlmICghYnVmKSB7CiAJCXVzYl9lcF9mcmVlX3JlcXVlc3QoJmRjcC0+ZXAsIHJlcSk7Ci0JCWRldl9lcnIoZGV2LCAicmVjaXAgZGF0YSBhbGxvY2F0aW9uIGZhaWxcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC02MTcsMTAgKzYxNiwxMyBAQAogCQkgKiB1c2UgZG1hZW5naW5lIGlmIHBvc3NpYmxlLgogCQkgKiBJdCB3aWxsIHVzZSBwaW8gaGFuZGxlciBpZiBpbXBvc3NpYmxlLgogCQkgKi8KLQkJaWYgKHVzYl9lbmRwb2ludF9kaXJfaW4oZGVzYykpCisJCWlmICh1c2JfZW5kcG9pbnRfZGlyX2luKGRlc2MpKSB7CiAJCQlwaXBlLT5oYW5kbGVyID0gJnVzYmhzX2ZpZm9fZG1hX3B1c2hfaGFuZGxlcjsKLQkJZWxzZQorCQl9IGVsc2UgewogCQkJcGlwZS0+aGFuZGxlciA9ICZ1c2Joc19maWZvX2RtYV9wb3BfaGFuZGxlcjsKKwkJCXVzYmhzX3h4eHN0c19jbGVhcihwcml2LCBCUkRZU1RTLAorCQkJCQkgICB1c2Joc19waXBlX251bWJlcihwaXBlKSk7CisJCX0KIAogCQlyZXQgPSAwOwogCX0KQEAgLTEwNTksMjEgKzEwNjEsMTggQEAKIAlpbnQgcmV0OwogCiAJZ3ByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdXNiaHNnX2dwcml2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFncHJpdikgewotCQlkZXZfZXJyKGRldiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBnYWRnZXQgcHJpdlxuIik7CisJaWYgKCFncHJpdikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJdWVwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVzYmhzZ191ZXApICogcGlwZV9zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXVlcCkgewotCQlkZXZfZXJyKGRldiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBlcFxuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gdXNiaHNfbW9kX2dhZGdldF9wcm9iZV9lcnJfZ3ByaXY7CiAJfQogCiAJZ3ByaXYtPnRyYW5zY2VpdmVyID0gdXNiX2dldF9waHkoVVNCX1BIWV9UWVBFX1VOREVGSU5FRCk7CiAJZGV2X2luZm8oZGV2LCAiJXN0cmFuc2NlaXZlciBmb3VuZFxuIiwKLQkJIGdwcml2LT50cmFuc2NlaXZlciA/ICIiIDogIm5vICIpOworCQkgIUlTX0VSUihncHJpdi0+dHJhbnNjZWl2ZXIpID8gIiIgOiAibm8gIik7CiAKIAkvKgogCSAqIENBVVRJT04KQEAgLTExMDMsNiArMTEwMiw4IEBACiAJZ3ByaXYtPmdhZGdldC5uYW1lCQk9ICJyZW5lc2FzX3VzYmhzX3VkYyI7CiAJZ3ByaXYtPmdhZGdldC5vcHMJCT0gJnVzYmhzZ19nYWRnZXRfb3BzOwogCWdwcml2LT5nYWRnZXQubWF4X3NwZWVkCQk9IFVTQl9TUEVFRF9ISUdIOworCWdwcml2LT5nYWRnZXQucXVpcmtfYXZvaWRzX3NrYl9yZXNlcnZlID0gdXNiaHNfZ2V0X2RwYXJhbShwcml2LAorCQkJCQkJCQloYXNfdXNiX2RtYWMpOwogCiAJSU5JVF9MSVNUX0hFQUQoJmdwcml2LT5nYWRnZXQuZXBfbGlzdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvbW9kX2hvc3QuYyBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvbW9kX2hvc3QuYwppbmRleCAzYmYwYjcyLi4xNjVlODFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL21vZF9ob3N0LmMKKysrIGIvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9tb2RfaG9zdC5jCkBAIC0xNjYsMTQgKzE2NiwxMCBAQAogCQkJCQkgICAgICAgZ2ZwX3QgbWVtX2ZsYWdzKQogewogCXN0cnVjdCB1c2Joc2hfcmVxdWVzdCAqdXJlcTsKLQlzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdiA9IHVzYmhzaF9ocHJpdl90b19wcml2KGhwcml2KTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB1c2Joc19wcml2X3RvX2Rldihwcml2KTsKIAogCXVyZXEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdXNiaHNoX3JlcXVlc3QpLCBtZW1fZmxhZ3MpOwotCWlmICghdXJlcSkgewotCQlkZXZfZXJyKGRldiwgInVyZXEgYWxsb2MgZmFpbFxuIik7CisJaWYgKCF1cmVxKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAl1c2Joc19wa3RfaW5pdCgmdXJlcS0+cGt0KTsKIAl1cmVxLT51cmIgPSB1cmI7CkBAIC0zODgsMTAgKzM4NCw4IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXVlcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2Joc2hfZXApLCBtZW1fZmxhZ3MpOwotCWlmICghdWVwKSB7Ci0JCWRldl9lcnIoZGV2LCAidXNiaHNoX2VwIGFsbG9jIGZhaWxcbiIpOworCWlmICghdWVwKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAkvKioqKioqKioqKioqKioqKioqKiogIHNwaW4gbG9jayAqKioqKioqKioqKioqKioqKioqKi8KIAl1c2Joc19sb2NrKHByaXYsIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvcGlwZS5jIGIvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9waXBlLmMKaW5kZXggYzIzODc3Mi4uOTM5NmE4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9waXBlLmMKKysrIGIvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9waXBlLmMKQEAgLTgwNCwxMCArODA0LDggQEAKIAl9CiAKIAlpbmZvLT5waXBlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVzYmhzX3BpcGUpICogcGlwZV9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWluZm8tPnBpcGUpIHsKLQkJZGV2X2VycihkZXYsICJDb3VsZCBub3QgYWxsb2NhdGUgcGlwZVxuIik7CisJaWYgKCFpbmZvLT5waXBlKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlpbmZvLT5zaXplID0gcGlwZV9zaXplOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvY3AyMTB4LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY3AyMTB4LmMKaW5kZXggNGQ2YTVjNi4uNTRhNGRlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2NwMjEweC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jcDIxMHguYwpAQCAtMTE4LDYgKzExOCw3IEBACiAJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4NDExKSB9LCAvKiBLeW9jZXJhIEdQUyBNb2R1bGUgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDg0MTgpIH0sIC8qIElSWiBBdXRvbWF0aW9uIFRlbGVwb3J0IFNHLTEwIEdTTS9HUFJTIE1vZGVtICovCiAJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4NDZFKSB9LCAvKiBCRUkgVVNCIFNlbnNvciBJbnRlcmZhY2UgKFZDUCkgKi8KKwl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDg0NzApIH0sIC8qIEp1bmlwZXIgTmV0d29ya3MgQlggU2VyaWVzIFN5c3RlbSBDb25zb2xlICovCiAJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4NDc3KSB9LCAvKiBCYWxsdWZmIFJGSUQgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDg0QjYpIH0sIC8qIFN0YXJpem9uYSBIeXBlcmlvbiAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODVFQSkgfSwgLyogQUMtU2VydmljZXMgSUJVUy1JRiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYwppbmRleCAwMDgyMDgwLi5iMmQ3NjdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYwpAQCAtNjQ4LDYgKzY0OCw4IEBACiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0VMVl9URkQxMjhfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfRk0zUlhfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfV1M3NzdfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9QQUxNU0VOU19QSUQpIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0lWSVVNX1hTVEFUX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIExJTlhfU0RNVVNCUVNTX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIExJTlhfTUFTVEVSREVWRUwyX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIExJTlhfRlVUVVJFXzBfUElEKSB9LApAQCAtMTAwOCw2ICsxMDEwLDcgQEAKIAl7IFVTQl9ERVZJQ0UoSUNQREFTX1ZJRCwgSUNQREFTX0k3NTYwVV9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKElDUERBU19WSUQsIElDUERBU19JNzU2MVVfUElEKSB9LAogCXsgVVNCX0RFVklDRShJQ1BEQVNfVklELCBJQ1BEQVNfSTc1NjNVX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoV0lDRURfVklELCBXSUNFRF9VU0IyMDcwNlYyX1BJRCkgfSwKIAl7IH0JCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW9faWRzLmggYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW9faWRzLmgKaW5kZXggYzVkNmMxZS4uZjg3YTkzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvX2lkcy5oCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npb19pZHMuaApAQCAtNDA2LDYgKzQwNiwxMiBAQAogI2RlZmluZSBGVERJXzROX0dBTEFYWV9ERV8zX1BJRAkweEYzQzIKIAogLyoKKyAqIEl2aXVtIFRlY2hub2xvZ2llcyBwcm9kdWN0IElEcworICovCisjZGVmaW5lIEZURElfUEFMTVNFTlNfUElECTB4ZjQ0MAorI2RlZmluZSBGVERJX0lWSVVNX1hTVEFUX1BJRAkweGY0NDEKKworLyoKICAqIExpbnggVGVjaG5vbG9naWVzIHByb2R1Y3QgaWRzCiAgKi8KICNkZWZpbmUgTElOWF9TRE1VU0JRU1NfUElECTB4RjQ0OAkvKiBMaW54IFNETS1VU0ItUVMtUyAqLwpAQCAtNjczLDYgKzY3OSwxMiBAQAogI2RlZmluZSBJTlRSRVBJRF9ORU9WSV9QSUQJMHgwNzAxCiAKIC8qCisgKiBXSUNFRCBVU0IgVUFSVAorICovCisjZGVmaW5lIFdJQ0VEX1ZJRAkJMHgwQTVDCisjZGVmaW5lIFdJQ0VEX1VTQjIwNzA2VjJfUElECTB4NjQyMgorCisvKgogICogRGVmaW5pdGlvbnMgZm9yIElEIFRFQ0ggKHd3dy5pZHQtbmV0LmNvbSkgZGV2aWNlcwogICovCiAjZGVmaW5lIElEVEVDSF9WSUQJCTB4MEFDRAkvKiBJRCBURUNIIFZlbmRvciBJRCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbl9wZGEuYwppbmRleCA0ZjdlMDcyLi5lNDlhZDBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbl9wZGEuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbl9wZGEuYwpAQCAtMzAsMTIgKzMwLDEyIEBACiAjaW5jbHVkZSA8bGludXgvdXNiL2V6dXNiLmg+CiAKIC8qIG1ha2UgYSBzaW1wbGUgZGVmaW5lIHRvIGhhbmRsZSBpZiB3ZSBhcmUgY29tcGlsaW5nIGtleXNwYW5fcGRhIG9yIHhpcmNvbSBzdXBwb3J0ICovCi0jaWYgZGVmaW5lZChDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1BEQSkgfHwgZGVmaW5lZChDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1BEQV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1BEQSkKIAkjZGVmaW5lIEtFWVNQQU4KICNlbHNlCiAJI3VuZGVmIEtFWVNQQU4KICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX1VTQl9TRVJJQUxfWElSQ09NKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfU0VSSUFMX1hJUkNPTV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfVVNCX1NFUklBTF9YSVJDT00pCiAJI2RlZmluZSBYSVJDT00KICNlbHNlCiAJI3VuZGVmIFhJUkNPTQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL21vczc3MjAuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3NzIwLmMKaW5kZXggNTYwOGFmNC4uZGU5OTkyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL21vczc3MjAuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzcyMC5jCkBAIC0xMjUyLDcgKzEyNTIsNyBAQAogCiAJaWYgKHVyYi0+dHJhbnNmZXJfYnVmZmVyID09IE5VTEwpIHsKIAkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBrbWFsbG9jKFVSQl9UUkFOU0ZFUl9CVUZGRVJfU0laRSwKLQkJCQkJICAgICAgIEdGUF9LRVJORUwpOworCQkJCQkgICAgICAgR0ZQX0FUT01JQyk7CiAJCWlmICghdXJiLT50cmFuc2Zlcl9idWZmZXIpCiAJCQlnb3RvIGV4aXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL21vczc4NDAuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMKaW5kZXggZWQzNzhmYi4uNTc0MjZkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL21vczc4NDAuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jCkBAIC0xMzQwLDggKzEzNDAsOCBAQAogCX0KIAogCWlmICh1cmItPnRyYW5zZmVyX2J1ZmZlciA9PSBOVUxMKSB7Ci0JCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0KLQkJICAgIGttYWxsb2MoVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKTsKKwkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBrbWFsbG9jKFVSQl9UUkFOU0ZFUl9CVUZGRVJfU0laRSwKKwkJCQkJICAgICAgIEdGUF9BVE9NSUMpOwogCQlpZiAoIXVyYi0+dHJhbnNmZXJfYnVmZmVyKQogCQkJZ290byBleGl0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYwppbmRleCA4ZTA3NTM2Li45ODk0ZTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCkBAIC0yNzQsNiArMjc0LDEyIEBACiAjZGVmaW5lIFRFTElUX1BST0RVQ1RfTEU5MjAJCQkweDEyMDAKICNkZWZpbmUgVEVMSVRfUFJPRFVDVF9MRTkxMAkJCTB4MTIwMQogI2RlZmluZSBURUxJVF9QUk9EVUNUX0xFOTEwX1VTQkNGRzQJCTB4MTIwNgorI2RlZmluZSBURUxJVF9QUk9EVUNUX0xFOTIwQTRfMTIwNwkJMHgxMjA3CisjZGVmaW5lIFRFTElUX1BST0RVQ1RfTEU5MjBBNF8xMjA4CQkweDEyMDgKKyNkZWZpbmUgVEVMSVRfUFJPRFVDVF9MRTkyMEE0XzEyMTEJCTB4MTIxMQorI2RlZmluZSBURUxJVF9QUk9EVUNUX0xFOTIwQTRfMTIxMgkJMHgxMjEyCisjZGVmaW5lIFRFTElUX1BST0RVQ1RfTEU5MjBBNF8xMjEzCQkweDEyMTMKKyNkZWZpbmUgVEVMSVRfUFJPRFVDVF9MRTkyMEE0XzEyMTQJCTB4MTIxNAogCiAvKiBaVEUgUFJPRFVDVFMgKi8KICNkZWZpbmUgWlRFX1ZFTkRPUl9JRAkJCQkweDE5ZDIKQEAgLTUxOSw2ICs1MjUsMTIgQEAKICNkZWZpbmUgVklBVEVMRUNPTV9WRU5ET1JfSUQJCQkweDE1ZWIKICNkZWZpbmUgVklBVEVMRUNPTV9QUk9EVUNUX0NEUzcJCQkweDAwMDEKIAorLyogV2VUZWxlY29tIHByb2R1Y3RzICovCisjZGVmaW5lIFdFVEVMRUNPTV9WRU5ET1JfSUQJCQkweDIyZGUKKyNkZWZpbmUgV0VURUxFQ09NX1BST0RVQ1RfV01EMjAwCQkweDY4MDEKKyNkZWZpbmUgV0VURUxFQ09NX1BST0RVQ1RfNjgwMgkJCTB4NjgwMgorI2RlZmluZSBXRVRFTEVDT01fUFJPRFVDVF9XTUQzMDAJCTB4NjgwMworCiBzdHJ1Y3Qgb3B0aW9uX2JsYWNrbGlzdF9pbmZvIHsKIAkvKiBiaXRtYXNrIG9mIGludGVyZmFjZSBudW1iZXJzIGJsYWNrbGlzdGVkIGZvciBzZW5kX3NldHVwICovCiAJY29uc3QgdW5zaWduZWQgbG9uZyBzZW5kc2V0dXA7CkBAIC02MjgsNiArNjQwLDExIEBACiAJLnJlc2VydmVkID0gQklUKDEpIHwgQklUKDUpLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb25fYmxhY2tsaXN0X2luZm8gdGVsaXRfbGU5MjBhNF9ibGFja2xpc3RfMSA9IHsKKwkuc2VuZHNldHVwID0gQklUKDApLAorCS5yZXNlcnZlZCA9IEJJVCgxKSwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uX2JsYWNrbGlzdF9pbmZvIHRlbGl0X2xlOTIyX2JsYWNrbGlzdF91c2JjZmcwID0gewogCS5zZW5kc2V0dXAgPSBCSVQoMiksCiAJLnJlc2VydmVkID0gQklUKDApIHwgQklUKDEpIHwgQklUKDMpLApAQCAtMTIwMyw2ICsxMjIwLDE2IEBACiAJCS5kcml2ZXJfaW5mbyA9IChrZXJuZWxfdWxvbmdfdCkmdGVsaXRfbGU5MjJfYmxhY2tsaXN0X3VzYmNmZzMgfSwKIAl7IFVTQl9ERVZJQ0UoVEVMSVRfVkVORE9SX0lELCBURUxJVF9QUk9EVUNUX0xFOTIwKSwKIAkJLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KSZ0ZWxpdF9sZTkyMF9ibGFja2xpc3QgfSwKKwl7IFVTQl9ERVZJQ0UoVEVMSVRfVkVORE9SX0lELCBURUxJVF9QUk9EVUNUX0xFOTIwQTRfMTIwNykgfSwKKwl7IFVTQl9ERVZJQ0UoVEVMSVRfVkVORE9SX0lELCBURUxJVF9QUk9EVUNUX0xFOTIwQTRfMTIwOCksCisJCS5kcml2ZXJfaW5mbyA9IChrZXJuZWxfdWxvbmdfdCkmdGVsaXRfbGU5MjBhNF9ibGFja2xpc3RfMSB9LAorCXsgVVNCX0RFVklDRShURUxJVF9WRU5ET1JfSUQsIFRFTElUX1BST0RVQ1RfTEU5MjBBNF8xMjExKSwKKwkJLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KSZ0ZWxpdF9sZTkyMl9ibGFja2xpc3RfdXNiY2ZnMyB9LAorCXsgVVNCX0RFVklDRShURUxJVF9WRU5ET1JfSUQsIFRFTElUX1BST0RVQ1RfTEU5MjBBNF8xMjEyKSwKKwkJLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KSZ0ZWxpdF9sZTkyMGE0X2JsYWNrbGlzdF8xIH0sCisJeyBVU0JfREVWSUNFX0lOVEVSRkFDRV9DTEFTUyhURUxJVF9WRU5ET1JfSUQsIFRFTElUX1BST0RVQ1RfTEU5MjBBNF8xMjEzLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRShURUxJVF9WRU5ET1JfSUQsIFRFTElUX1BST0RVQ1RfTEU5MjBBNF8xMjE0KSwKKwkJLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KSZ0ZWxpdF9sZTkyMl9ibGFja2xpc3RfdXNiY2ZnMyB9LAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgWlRFX1BST0RVQ1RfTUY2MjIsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sIC8qIFpURSBXQ0RNQSBwcm9kdWN0cyAqLwogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oWlRFX1ZFTkRPUl9JRCwgMHgwMDAyLCAweGZmLCAweGZmLCAweGZmKSwKIAkJLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KSZuZXRfaW50ZjFfYmxhY2tsaXN0IH0sCkBAIC0xOTY2LDkgKzE5OTMsMTMgQEAKIAkgIC5kcml2ZXJfaW5mbyA9IChrZXJuZWxfdWxvbmdfdCkmbmV0X2ludGY0X2JsYWNrbGlzdCB9LAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oMHgwN2QxLCAweDNlMDEsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sIC8qIEQtTGluayBEV00tMTUyL0MxICovCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTygweDA3ZDEsIDB4M2UwMiwgMHhmZiwgMHhmZiwgMHhmZikgfSwgLyogRC1MaW5rIERXTS0xNTYvQzEgKi8KKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKDB4MDdkMSwgMHg3ZTExLCAweGZmLCAweGZmLCAweGZmKSB9LCAvKiBELUxpbmsgRFdNLTE1Ni9BMyAqLwogCXsgVVNCX0RFVklDRV9JTlRFUkZBQ0VfQ0xBU1MoMHgyMDIwLCAweDQwMDAsIDB4ZmYpIH0sICAgICAgICAgICAgICAgIC8qIE9MSUNBUkQzMDAgLSBNVDYyMjUgKi8KIAl7IFVTQl9ERVZJQ0UoSU5PVklBX1ZFTkRPUl9JRCwgSU5PVklBX1NFVzg1OCkgfSwKIAl7IFVTQl9ERVZJQ0UoVklBVEVMRUNPTV9WRU5ET1JfSUQsIFZJQVRFTEVDT01fUFJPRFVDVF9DRFM3KSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oV0VURUxFQ09NX1ZFTkRPUl9JRCwgV0VURUxFQ09NX1BST0RVQ1RfV01EMjAwLCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oV0VURUxFQ09NX1ZFTkRPUl9JRCwgV0VURUxFQ09NX1BST0RVQ1RfNjgwMiwgMHhmZiwgMHhmZiwgMHhmZikgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFdFVEVMRUNPTV9WRU5ET1JfSUQsIFdFVEVMRUNPTV9QUk9EVUNUX1dNRDMwMCwgMHhmZiwgMHhmZiwgMHhmZikgfSwKIAl7IH0gLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgb3B0aW9uX2lkcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3RpX3VzYl8zNDEwXzUwNTIuYwppbmRleCAwN2I0YmYwLi5hOGI5YmRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC90aV91c2JfMzQxMF81MDUyLmMKQEAgLTE3OSwyMyArMTc5LDIzIEBACiAKIC8qIENvbmZpZyBzdHJ1Y3QgKi8KIHN0cnVjdCB0aV91YXJ0X2NvbmZpZyB7Ci0JX191MTYJd0JhdWRSYXRlOwotCV9fdTE2CXdGbGFnczsKLQlfX3U4CWJEYXRhQml0czsKLQlfX3U4CWJQYXJpdHk7Ci0JX191OAliU3RvcEJpdHM7CisJX19iZTE2CXdCYXVkUmF0ZTsKKwlfX2JlMTYJd0ZsYWdzOworCXU4CWJEYXRhQml0czsKKwl1OAliUGFyaXR5OworCXU4CWJTdG9wQml0czsKIAljaGFyCWNYb247CiAJY2hhcgljWG9mZjsKLQlfX3U4CWJVYXJ0TW9kZTsKKwl1OAliVWFydE1vZGU7CiB9IF9fcGFja2VkOwogCiAvKiBHZXQgcG9ydCBzdGF0dXMgKi8KIHN0cnVjdCB0aV9wb3J0X3N0YXR1cyB7Ci0JX191OAliQ21kQ29kZTsKLQlfX3U4CWJNb2R1bGVJZDsKLQlfX3U4CWJFcnJvckNvZGU7Ci0JX191OAliTVNSOwotCV9fdTgJYkxTUjsKKwl1OCBiQ21kQ29kZTsKKwl1OCBiTW9kdWxlSWQ7CisJdTggYkVycm9yQ29kZTsKKwl1OCBiTVNSOworCXU4IGJMU1I7CiB9IF9fcGFja2VkOwogCiAvKiBQdXJnZSBtb2RlcyAqLwpAQCAtMjE4LDEyICsyMTgsMTIgQEAKICNkZWZpbmUgVElfUldfREFUQV9ET1VCTEVfV09SRAkJMHgwNAogCiBzdHJ1Y3QgdGlfd3JpdGVfZGF0YV9ieXRlcyB7Ci0JX191OAliQWRkclR5cGU7Ci0JX191OAliRGF0YVR5cGU7Ci0JX191OAliRGF0YUNvdW50ZXI7CisJdTgJYkFkZHJUeXBlOworCXU4CWJEYXRhVHlwZTsKKwl1OAliRGF0YUNvdW50ZXI7CiAJX19iZTE2CXdCYXNlQWRkckhpOwogCV9fYmUxNgl3QmFzZUFkZHJMbzsKLQlfX3U4CWJEYXRhWzBdOworCXU4CWJEYXRhWzBdOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IHRpX3JlYWRfZGF0YV9yZXF1ZXN0IHsKQEAgLTI1OCw3ICsyNTgsNyBAQAogLyogRmlybXdhcmUgaW1hZ2UgaGVhZGVyICovCiBzdHJ1Y3QgdGlfZmlybXdhcmVfaGVhZGVyIHsKIAlfX2xlMTYJd0xlbmd0aDsKLQlfX3U4CWJDaGVja1N1bTsKKwl1OAliQ2hlY2tTdW07CiB9IF9fcGFja2VkOwogCiAvKiBVQVJUIGFkZHJlc3NlcyAqLwpAQCAtMjc2LDkgKzI3Niw2IEBACiAKICNkZWZpbmUgVElfREVGQVVMVF9DTE9TSU5HX1dBSVQJNDAwMAkJLyogaW4gLjAxIHNlY3MgKi8KIAotLyogc3VwcG9ydGVkIHNldHNlcmlhbCBmbGFncyAqLwotI2RlZmluZSBUSV9TRVRfU0VSSUFMX0ZMQUdTCTAKLQogLyogcmVhZCB1cmIgc3RhdGVzICovCiAjZGVmaW5lIFRJX1JFQURfVVJCX1JVTk5JTkcJMAogI2RlZmluZSBUSV9SRUFEX1VSQl9TVE9QUElORwkxCkBAIC0yODgsMTEgKzI4NSwxMCBAQAogCiBzdHJ1Y3QgdGlfcG9ydCB7CiAJaW50CQkJdHBfaXNfb3BlbjsKLQlfX3U4CQkJdHBfbXNyOwotCV9fdTgJCQl0cF9zaGFkb3dfbWNyOwotCV9fdTgJCQl0cF91YXJ0X21vZGU7CS8qIDIzMiBvciA0ODUgbW9kZXMgKi8KKwl1OAkJCXRwX21zcjsKKwl1OAkJCXRwX3NoYWRvd19tY3I7CisJdTgJCQl0cF91YXJ0X21vZGU7CS8qIDIzMiBvciA0ODUgbW9kZXMgKi8KIAl1bnNpZ25lZCBpbnQJCXRwX3VhcnRfYmFzZV9hZGRyOwotCWludAkJCXRwX2ZsYWdzOwogCXN0cnVjdCB0aV9kZXZpY2UJKnRwX3RkZXY7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydAkqdHBfcG9ydDsKIAlzcGlubG9ja190CQl0cF9sb2NrOwpAQCAtMzA2LDcgKzMwMiw2IEBACiAJc3RydWN0IHVzYl9zZXJpYWwJKnRkX3NlcmlhbDsKIAlpbnQJCQl0ZF9pc18zNDEwOwogCWJvb2wJCQl0ZF9yczQ4NV9vbmx5OwotCWludAkJCXRkX3VyYl9lcnJvcjsKIH07CiAKIHN0YXRpYyBpbnQgdGlfc3RhcnR1cChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKQEAgLTM0Myw3ICszMzgsNyBAQAogCXN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqcmV0X2FyZyk7CiBzdGF0aWMgaW50IHRpX3NldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGlfcG9ydCAqdHBvcnQsCiAJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpuZXdfYXJnKTsKLXN0YXRpYyB2b2lkIHRpX2hhbmRsZV9uZXdfbXNyKHN0cnVjdCB0aV9wb3J0ICp0cG9ydCwgX191OCBtc3IpOworc3RhdGljIHZvaWQgdGlfaGFuZGxlX25ld19tc3Ioc3RydWN0IHRpX3BvcnQgKnRwb3J0LCB1OCBtc3IpOwogCiBzdGF0aWMgdm9pZCB0aV9zdG9wX3JlYWQoc3RydWN0IHRpX3BvcnQgKnRwb3J0LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKIHN0YXRpYyBpbnQgdGlfcmVzdGFydF9yZWFkKHN0cnVjdCB0aV9wb3J0ICp0cG9ydCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CkBAIC0zNTQsNyArMzQ5LDcgQEAKIAlfX3UxNiBtb2R1bGVpZCwgX191MTYgdmFsdWUsIF9fdTggKmRhdGEsIGludCBzaXplKTsKIAogc3RhdGljIGludCB0aV93cml0ZV9ieXRlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCB0aV9kZXZpY2UgKnRkZXYsCi0JCQkgdW5zaWduZWQgbG9uZyBhZGRyLCBfX3U4IG1hc2ssIF9fdTggYnl0ZSk7CisJCQkgdW5zaWduZWQgbG9uZyBhZGRyLCB1OCBtYXNrLCB1OCBieXRlKTsKIAogc3RhdGljIGludCB0aV9kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgdGlfZGV2aWNlICp0ZGV2KTsKIApAQCAtNjQ3LDEyICs2NDIsMTEgQEAKIAlzdHJ1Y3QgdXJiICp1cmI7CiAJaW50IHBvcnRfbnVtYmVyOwogCWludCBzdGF0dXM7Ci0JX191MTYgb3Blbl9zZXR0aW5ncyA9IChfX3U4KShUSV9QSVBFX01PREVfQ09OVElOVU9VUyB8Ci0JCQkgICAgIFRJX1BJUEVfVElNRU9VVF9FTkFCTEUgfAotCQkJICAgICAoVElfVFJBTlNGRVJfVElNRU9VVCA8PCAyKSk7CisJdTE2IG9wZW5fc2V0dGluZ3M7CiAKLQlpZiAodHBvcnQgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9ERVY7CisJb3Blbl9zZXR0aW5ncyA9IChUSV9QSVBFX01PREVfQ09OVElOVU9VUyB8CisJCQkgVElfUElQRV9USU1FT1VUX0VOQUJMRSB8CisJCQkgKFRJX1RSQU5TRkVSX1RJTUVPVVQgPDwgMikpOwogCiAJZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAJdGRldiA9IHRwb3J0LT50cF90ZGV2OwpAQCAtNjg2LDcgKzY4MCw2IEBACiAJaWYgKHR0eSkKIAkJdGlfc2V0X3Rlcm1pb3ModHR5LCBwb3J0LCAmdHR5LT50ZXJtaW9zKTsKIAotCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gc2VuZGluZyBUSV9PUEVOX1BPUlRcbiIsIF9fZnVuY19fKTsKIAlzdGF0dXMgPSB0aV9jb21tYW5kX291dF9zeW5jKHRkZXYsIFRJX09QRU5fUE9SVCwKIAkJKF9fdTgpKFRJX1VBUlQxX1BPUlQgKyBwb3J0X251bWJlciksIG9wZW5fc2V0dGluZ3MsIE5VTEwsIDApOwogCWlmIChzdGF0dXMpIHsKQEAgLTY5NSw3ICs2ODgsNiBAQAogCQlnb3RvIHVubGlua19pbnRfdXJiOwogCX0KIAotCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gc2VuZGluZyBUSV9TVEFSVF9QT1JUXG4iLCBfX2Z1bmNfXyk7CiAJc3RhdHVzID0gdGlfY29tbWFuZF9vdXRfc3luYyh0ZGV2LCBUSV9TVEFSVF9QT1JULAogCQkoX191OCkoVElfVUFSVDFfUE9SVCArIHBvcnRfbnVtYmVyKSwgMCwgTlVMTCwgMCk7CiAJaWYgKHN0YXR1cykgewpAQCAtNzA0LDcgKzY5Niw2IEBACiAJCWdvdG8gdW5saW5rX2ludF91cmI7CiAJfQogCi0JZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSBzZW5kaW5nIFRJX1BVUkdFX1BPUlRcbiIsIF9fZnVuY19fKTsKIAlzdGF0dXMgPSB0aV9jb21tYW5kX291dF9zeW5jKHRkZXYsIFRJX1BVUkdFX1BPUlQsCiAJCShfX3U4KShUSV9VQVJUMV9QT1JUICsgcG9ydF9udW1iZXIpLCBUSV9QVVJHRV9JTlBVVCwgTlVMTCwgMCk7CiAJaWYgKHN0YXR1cykgewpAQCAtNzI4LDcgKzcxOSw2IEBACiAJaWYgKHR0eSkKIAkJdGlfc2V0X3Rlcm1pb3ModHR5LCBwb3J0LCAmdHR5LT50ZXJtaW9zKTsKIAotCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gc2VuZGluZyBUSV9PUEVOX1BPUlQgKDIpXG4iLCBfX2Z1bmNfXyk7CiAJc3RhdHVzID0gdGlfY29tbWFuZF9vdXRfc3luYyh0ZGV2LCBUSV9PUEVOX1BPUlQsCiAJCShfX3U4KShUSV9VQVJUMV9QT1JUICsgcG9ydF9udW1iZXIpLCBvcGVuX3NldHRpbmdzLCBOVUxMLCAwKTsKIAlpZiAoc3RhdHVzKSB7CkBAIC03MzcsNyArNzI3LDYgQEAKIAkJZ290byB1bmxpbmtfaW50X3VyYjsKIAl9CiAKLQlkZXZfZGJnKCZwb3J0LT5kZXYsICIlcyAtIHNlbmRpbmcgVElfU1RBUlRfUE9SVCAoMilcbiIsIF9fZnVuY19fKTsKIAlzdGF0dXMgPSB0aV9jb21tYW5kX291dF9zeW5jKHRkZXYsIFRJX1NUQVJUX1BPUlQsCiAJCShfX3U4KShUSV9VQVJUMV9QT1JUICsgcG9ydF9udW1iZXIpLCAwLCBOVUxMLCAwKTsKIAlpZiAoc3RhdHVzKSB7CkBAIC03NDcsNyArNzM2LDYgQEAKIAl9CiAKIAkvKiBzdGFydCByZWFkIHVyYiAqLwotCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gc3RhcnQgcmVhZCB1cmJcbiIsIF9fZnVuY19fKTsKIAl1cmIgPSBwb3J0LT5yZWFkX3VyYjsKIAlpZiAoIXVyYikgewogCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIG5vIHJlYWQgdXJiXG4iLCBfX2Z1bmNfXyk7CkBAIC03NzMsNyArNzYxLDYgQEAKIAkJdXNiX2tpbGxfdXJiKHBvcnQtPnNlcmlhbC0+cG9ydFswXS0+aW50ZXJydXB0X2luX3VyYik7CiByZWxlYXNlX2xvY2s6CiAJbXV0ZXhfdW5sb2NrKCZ0ZGV2LT50ZF9vcGVuX2Nsb3NlX2xvY2spOwotCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gZXhpdCAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtNzg5LDggKzc3Niw2IEBACiAKIAl0ZGV2ID0gdXNiX2dldF9zZXJpYWxfZGF0YShwb3J0LT5zZXJpYWwpOwogCXRwb3J0ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwotCWlmICh0ZGV2ID09IE5VTEwgfHwgdHBvcnQgPT0gTlVMTCkKLQkJcmV0dXJuOwogCiAJdHBvcnQtPnRwX2lzX29wZW4gPSAwOwogCkBAIC04MDMsNyArNzg4LDYgQEAKIAogCXBvcnRfbnVtYmVyID0gcG9ydC0+cG9ydF9udW1iZXI7CiAKLQlkZXZfZGJnKCZwb3J0LT5kZXYsICIlcyAtIHNlbmRpbmcgVElfQ0xPU0VfUE9SVFxuIiwgX19mdW5jX18pOwogCXN0YXR1cyA9IHRpX2NvbW1hbmRfb3V0X3N5bmModGRldiwgVElfQ0xPU0VfUE9SVCwKIAkJICAgICAoX191OCkoVElfVUFSVDFfUE9SVCArIHBvcnRfbnVtYmVyKSwgMCwgTlVMTCwgMCk7CiAJaWYgKHN0YXR1cykKQEAgLTgzMCwxMSArODE0LDEwIEBACiAJc3RydWN0IHRpX3BvcnQgKnRwb3J0ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCiAJaWYgKGNvdW50ID09IDApIHsKLQkJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSB3cml0ZSByZXF1ZXN0IG9mIDAgYnl0ZXNcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKHRwb3J0ID09IE5VTEwgfHwgIXRwb3J0LT50cF9pc19vcGVuKQorCWlmICghdHBvcnQtPnRwX2lzX29wZW4pCiAJCXJldHVybiAtRU5PREVWOwogCiAJY291bnQgPSBrZmlmb19pbl9sb2NrZWQoJnBvcnQtPndyaXRlX2ZpZm8sIGRhdGEsIGNvdW50LApAQCAtODUyLDkgKzgzNSw2IEBACiAJaW50IHJvb20gPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAodHBvcnQgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmdHBvcnQtPnRwX2xvY2ssIGZsYWdzKTsKIAlyb29tID0ga2ZpZm9fYXZhaWwoJnBvcnQtPndyaXRlX2ZpZm8pOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwb3J0LT50cF9sb2NrLCBmbGFncyk7CkBAIC04NzEsOSArODUxLDYgQEAKIAlpbnQgY2hhcnMgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAodHBvcnQgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmdHBvcnQtPnRwX2xvY2ssIGZsYWdzKTsKIAljaGFycyA9IGtmaWZvX2xlbigmcG9ydC0+d3JpdGVfZmlmbyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHBvcnQtPnRwX2xvY2ssIGZsYWdzKTsKQEAgLTkwMCw5ICs4NzcsNiBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwogCXN0cnVjdCB0aV9wb3J0ICp0cG9ydCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAotCWlmICh0cG9ydCA9PSBOVUxMKQotCQlyZXR1cm47Ci0KIAlpZiAoSV9JWE9GRih0dHkpIHx8IENfQ1JUU0NUUyh0dHkpKQogCQl0aV9zdG9wX3JlYWQodHBvcnQsIHR0eSk7CiAKQEAgLTkxNSw5ICs4ODksNiBAQAogCXN0cnVjdCB0aV9wb3J0ICp0cG9ydCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlpbnQgc3RhdHVzOwogCi0JaWYgKHRwb3J0ID09IE5VTEwpCi0JCXJldHVybjsKLQogCWlmIChJX0lYT0ZGKHR0eSkgfHwgQ19DUlRTQ1RTKHR0eSkpIHsKIAkJc3RhdHVzID0gdGlfcmVzdGFydF9yZWFkKHRwb3J0LCB0dHkpOwogCQlpZiAoc3RhdHVzKQpAQCAtOTMyLDE2ICs5MDMsMTEgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlzdHJ1Y3QgdGlfcG9ydCAqdHBvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKLQlpZiAodHBvcnQgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgVElPQ0dTRVJJQUw6Ci0JCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gVElPQ0dTRVJJQUxcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIHRpX2dldF9zZXJpYWxfaW5mbyh0cG9ydCwKIAkJCQkoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICopYXJnKTsKIAljYXNlIFRJT0NTU0VSSUFMOgotCQlkZXZfZGJnKCZwb3J0LT5kZXYsICIlcyAtIFRJT0NTU0VSSUFMXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiB0aV9zZXRfc2VyaWFsX2luZm8odHR5LCB0cG9ydCwKIAkJCQkoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICopYXJnKTsKIAl9CkBAIC05NTksNiArOTI1LDggQEAKIAlpbnQgc3RhdHVzOwogCWludCBwb3J0X251bWJlciA9IHBvcnQtPnBvcnRfbnVtYmVyOwogCXVuc2lnbmVkIGludCBtY3I7CisJdTE2IHdiYXVkcmF0ZTsKKwl1MTYgd2ZsYWdzID0gMDsKIAogCWNmbGFnID0gdHR5LT50ZXJtaW9zLmNfY2ZsYWc7CiAJaWZsYWcgPSB0dHktPnRlcm1pb3MuY19pZmxhZzsKQEAgLTk2NywyMSArOTM1LDE2IEBACiAJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSBvbGQgY2xmYWcgJTA4eCwgb2xkIGlmbGFnICUwOHhcbiIsIF9fZnVuY19fLAogCQlvbGRfdGVybWlvcy0+Y19jZmxhZywgb2xkX3Rlcm1pb3MtPmNfaWZsYWcpOwogCi0JaWYgKHRwb3J0ID09IE5VTEwpCi0JCXJldHVybjsKLQogCWNvbmZpZyA9IGttYWxsb2Moc2l6ZW9mKCpjb25maWcpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNvbmZpZykKIAkJcmV0dXJuOwogCi0JY29uZmlnLT53RmxhZ3MgPSAwOwotCiAJLyogdGhlc2UgZmxhZ3MgbXVzdCBiZSBzZXQgKi8KLQljb25maWctPndGbGFncyB8PSBUSV9VQVJUX0VOQUJMRV9NU19JTlRTOwotCWNvbmZpZy0+d0ZsYWdzIHw9IFRJX1VBUlRfRU5BQkxFX0FVVE9fU1RBUlRfRE1BOwotCWNvbmZpZy0+YlVhcnRNb2RlID0gKF9fdTgpKHRwb3J0LT50cF91YXJ0X21vZGUpOworCXdmbGFncyB8PSBUSV9VQVJUX0VOQUJMRV9NU19JTlRTOworCXdmbGFncyB8PSBUSV9VQVJUX0VOQUJMRV9BVVRPX1NUQVJUX0RNQTsKKwljb25maWctPmJVYXJ0TW9kZSA9IHRwb3J0LT50cF91YXJ0X21vZGU7CiAKLQlzd2l0Y2ggKGNmbGFnICYgQ1NJWkUpIHsKKwlzd2l0Y2ggKENfQ1NJWkUodHR5KSkgewogCWNhc2UgQ1M1OgogCQkgICAgY29uZmlnLT5iRGF0YUJpdHMgPSBUSV9VQVJUXzVfREFUQV9CSVRTOwogCQkgICAgYnJlYWs7CkBAIC0xMDAwLDI5ICs5NjMsMjkgQEAKIAkvKiBDTVNQQVIgaXNuJ3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyICovCiAJdHR5LT50ZXJtaW9zLmNfY2ZsYWcgJj0gfkNNU1BBUjsKIAotCWlmIChjZmxhZyAmIFBBUkVOQikgewotCQlpZiAoY2ZsYWcgJiBQQVJPREQpIHsKLQkJCWNvbmZpZy0+d0ZsYWdzIHw9IFRJX1VBUlRfRU5BQkxFX1BBUklUWV9DSEVDS0lORzsKKwlpZiAoQ19QQVJFTkIodHR5KSkgeworCQlpZiAoQ19QQVJPREQodHR5KSkgeworCQkJd2ZsYWdzIHw9IFRJX1VBUlRfRU5BQkxFX1BBUklUWV9DSEVDS0lORzsKIAkJCWNvbmZpZy0+YlBhcml0eSA9IFRJX1VBUlRfT0REX1BBUklUWTsKIAkJfSBlbHNlIHsKLQkJCWNvbmZpZy0+d0ZsYWdzIHw9IFRJX1VBUlRfRU5BQkxFX1BBUklUWV9DSEVDS0lORzsKKwkJCXdmbGFncyB8PSBUSV9VQVJUX0VOQUJMRV9QQVJJVFlfQ0hFQ0tJTkc7CiAJCQljb25maWctPmJQYXJpdHkgPSBUSV9VQVJUX0VWRU5fUEFSSVRZOwogCQl9CiAJfSBlbHNlIHsKLQkJY29uZmlnLT53RmxhZ3MgJj0gflRJX1VBUlRfRU5BQkxFX1BBUklUWV9DSEVDS0lORzsKKwkJd2ZsYWdzICY9IH5USV9VQVJUX0VOQUJMRV9QQVJJVFlfQ0hFQ0tJTkc7CiAJCWNvbmZpZy0+YlBhcml0eSA9IFRJX1VBUlRfTk9fUEFSSVRZOwogCX0KIAotCWlmIChjZmxhZyAmIENTVE9QQikKKwlpZiAoQ19DU1RPUEIodHR5KSkKIAkJY29uZmlnLT5iU3RvcEJpdHMgPSBUSV9VQVJUXzJfU1RPUF9CSVRTOwogCWVsc2UKIAkJY29uZmlnLT5iU3RvcEJpdHMgPSBUSV9VQVJUXzFfU1RPUF9CSVRTOwogCi0JaWYgKGNmbGFnICYgQ1JUU0NUUykgeworCWlmIChDX0NSVFNDVFModHR5KSkgewogCQkvKiBSVFMgZmxvdyBjb250cm9sIG11c3QgYmUgb2ZmIHRvIGRyb3AgUlRTIGZvciBiYXVkIHJhdGUgQjAgKi8KLQkJaWYgKChjZmxhZyAmIENCQVVEKSAhPSBCMCkKLQkJCWNvbmZpZy0+d0ZsYWdzIHw9IFRJX1VBUlRfRU5BQkxFX1JUU19JTjsKLQkJY29uZmlnLT53RmxhZ3MgfD0gVElfVUFSVF9FTkFCTEVfQ1RTX09VVDsKKwkJaWYgKChDX0JBVUQodHR5KSkgIT0gQjApCisJCQl3ZmxhZ3MgfD0gVElfVUFSVF9FTkFCTEVfUlRTX0lOOworCQl3ZmxhZ3MgfD0gVElfVUFSVF9FTkFCTEVfQ1RTX09VVDsKIAl9IGVsc2UgewogCQl0aV9yZXN0YXJ0X3JlYWQodHBvcnQsIHR0eSk7CiAJfQpAQCAtMTAzMiwzNCArOTk1LDM0IEBACiAJCWNvbmZpZy0+Y1hvZmYgPSBTVE9QX0NIQVIodHR5KTsKIAogCQlpZiAoSV9JWE9GRih0dHkpKQotCQkJY29uZmlnLT53RmxhZ3MgfD0gVElfVUFSVF9FTkFCTEVfWF9JTjsKKwkJCXdmbGFncyB8PSBUSV9VQVJUX0VOQUJMRV9YX0lOOwogCQllbHNlCiAJCQl0aV9yZXN0YXJ0X3JlYWQodHBvcnQsIHR0eSk7CiAKIAkJaWYgKElfSVhPTih0dHkpKQotCQkJY29uZmlnLT53RmxhZ3MgfD0gVElfVUFSVF9FTkFCTEVfWF9PVVQ7CisJCQl3ZmxhZ3MgfD0gVElfVUFSVF9FTkFCTEVfWF9PVVQ7CiAJfQogCiAJYmF1ZCA9IHR0eV9nZXRfYmF1ZF9yYXRlKHR0eSk7CiAJaWYgKCFiYXVkKQogCQliYXVkID0gOTYwMDsKIAlpZiAodHBvcnQtPnRwX3RkZXYtPnRkX2lzXzM0MTApCi0JCWNvbmZpZy0+d0JhdWRSYXRlID0gKF9fdTE2KSgoOTIzMDc3ICsgYmF1ZC8yKSAvIGJhdWQpOworCQl3YmF1ZHJhdGUgPSAoOTIzMDc3ICsgYmF1ZC8yKSAvIGJhdWQ7CiAJZWxzZQotCQljb25maWctPndCYXVkUmF0ZSA9IChfX3UxNikoKDQ2MTUzOCArIGJhdWQvMikgLyBiYXVkKTsKKwkJd2JhdWRyYXRlID0gKDQ2MTUzOCArIGJhdWQvMikgLyBiYXVkOwogCiAJLyogRklYTUU6IFNob3VsZCBjYWxjdWxhdGUgcmVzdWx0aW5nIGJhdWQgaGVyZSBhbmQgcmVwb3J0IGl0IGJhY2sgKi8KLQlpZiAoKGNmbGFnICYgQ0JBVUQpICE9IEIwKQorCWlmICgoQ19CQVVEKHR0eSkpICE9IEIwKQogCQl0dHlfZW5jb2RlX2JhdWRfcmF0ZSh0dHksIGJhdWQsIGJhdWQpOwogCiAJZGV2X2RiZygmcG9ydC0+ZGV2LAogCQkiJXMgLSBCYXVkUmF0ZT0lZCwgd0JhdWRSYXRlPSVkLCB3RmxhZ3M9MHglMDRYLCBiRGF0YUJpdHM9JWQsIGJQYXJpdHk9JWQsIGJTdG9wQml0cz0lZCwgY1hvbj0lZCwgY1hvZmY9JWQsIGJVYXJ0TW9kZT0lZFxuIiwKLQkJX19mdW5jX18sIGJhdWQsIGNvbmZpZy0+d0JhdWRSYXRlLCBjb25maWctPndGbGFncywKKwkJX19mdW5jX18sIGJhdWQsIHdiYXVkcmF0ZSwgd2ZsYWdzLAogCQljb25maWctPmJEYXRhQml0cywgY29uZmlnLT5iUGFyaXR5LCBjb25maWctPmJTdG9wQml0cywKIAkJY29uZmlnLT5jWG9uLCBjb25maWctPmNYb2ZmLCBjb25maWctPmJVYXJ0TW9kZSk7CiAKLQljcHVfdG9fYmUxNnMoJmNvbmZpZy0+d0JhdWRSYXRlKTsKLQljcHVfdG9fYmUxNnMoJmNvbmZpZy0+d0ZsYWdzKTsKKwljb25maWctPndCYXVkUmF0ZSA9IGNwdV90b19iZTE2KHdiYXVkcmF0ZSk7CisJY29uZmlnLT53RmxhZ3MgPSBjcHVfdG9fYmUxNih3ZmxhZ3MpOwogCiAJc3RhdHVzID0gdGlfY29tbWFuZF9vdXRfc3luYyh0cG9ydC0+dHBfdGRldiwgVElfU0VUX0NPTkZJRywKIAkJKF9fdTgpKFRJX1VBUlQxX1BPUlQgKyBwb3J0X251bWJlciksIDAsIChfX3U4ICopY29uZmlnLApAQCAtMTA3MSw3ICsxMDM0LDcgQEAKIAkvKiBTRVRfQ09ORklHIGFzc2VydHMgUlRTIGFuZCBEVFIsIHJlc2V0IHRoZW0gY29ycmVjdGx5ICovCiAJbWNyID0gdHBvcnQtPnRwX3NoYWRvd19tY3I7CiAJLyogaWYgYmF1ZCByYXRlIGlzIEIwLCBjbGVhciBSVFMgYW5kIERUUiAqLwotCWlmICgoY2ZsYWcgJiBDQkFVRCkgPT0gQjApCisJaWYgKENfQkFVRCh0dHkpID09IEIwKQogCQltY3IgJj0gfihUSV9NQ1JfRFRSIHwgVElfTUNSX1JUUyk7CiAJc3RhdHVzID0gdGlfc2V0X21jcih0cG9ydCwgbWNyKTsKIAlpZiAoc3RhdHVzKQpAQCAtMTA5Miw5ICsxMDU1LDYgQEAKIAl1bnNpZ25lZCBpbnQgbWNyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAodHBvcnQgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmdHBvcnQtPnRwX2xvY2ssIGZsYWdzKTsKIAltc3IgPSB0cG9ydC0+dHBfbXNyOwogCW1jciA9IHRwb3J0LT50cF9zaGFkb3dfbWNyOwpAQCAtMTEyMiw5ICsxMDgyLDYgQEAKIAl1bnNpZ25lZCBpbnQgbWNyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAodHBvcnQgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmdHBvcnQtPnRwX2xvY2ssIGZsYWdzKTsKIAltY3IgPSB0cG9ydC0+dHBfc2hhZG93X21jcjsKIApAQCAtMTE1NSw5ICsxMTEyLDYgQEAKIAogCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gc3RhdGUgPSAlZFxuIiwgX19mdW5jX18sIGJyZWFrX3N0YXRlKTsKIAotCWlmICh0cG9ydCA9PSBOVUxMKQotCQlyZXR1cm47Ci0KIAlzdGF0dXMgPSB0aV93cml0ZV9ieXRlKHBvcnQsIHRwb3J0LT50cF90ZGV2LAogCQl0cG9ydC0+dHBfdWFydF9iYXNlX2FkZHIgKyBUSV9VQVJUX09GRlNFVF9MQ1IsCiAJCVRJX0xDUl9CUkVBSywgYnJlYWtfc3RhdGUgPT0gLTEgPyBUSV9MQ1JfQlJFQUsgOiAwKTsKQEAgLTExODksNyArMTE0Myw3IEBACiAJaW50IGZ1bmN0aW9uOwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAlpbnQgcmV0dmFsOwotCV9fdTggbXNyOworCXU4IG1zcjsKIAogCXN3aXRjaCAoc3RhdHVzKSB7CiAJY2FzZSAwOgpAQCAtMTE5OCwxMSArMTE1Miw5IEBACiAJY2FzZSAtRU5PRU5UOgogCWNhc2UgLUVTSFVURE9XTjoKIAkJZGV2X2RiZyhkZXYsICIlcyAtIHVyYiBzaHV0dGluZyBkb3duLCAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0JCXRkZXYtPnRkX3VyYl9lcnJvciA9IDE7CiAJCXJldHVybjsKIAlkZWZhdWx0OgogCQlkZXZfZXJyKGRldiwgIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzLCAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0JCXRkZXYtPnRkX3VyYl9lcnJvciA9IDE7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTEyNzUsMTIgKzEyMjcsMTAgQEAKIAljYXNlIC1FTk9FTlQ6CiAJY2FzZSAtRVNIVVRET1dOOgogCQlkZXZfZGJnKGRldiwgIiVzIC0gdXJiIHNodXR0aW5nIGRvd24sICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKLQkJdHBvcnQtPnRwX3RkZXYtPnRkX3VyYl9lcnJvciA9IDE7CiAJCXJldHVybjsKIAlkZWZhdWx0OgogCQlkZXZfZXJyKGRldiwgIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzLCAlZFxuIiwKIAkJCV9fZnVuY19fLCBzdGF0dXMpOwotCQl0cG9ydC0+dHBfdGRldi0+dGRfdXJiX2Vycm9yID0gMTsKIAl9CiAKIAlpZiAoc3RhdHVzID09IC1FUElQRSkKQEAgLTEzMzUsMTIgKzEyODUsMTAgQEAKIAljYXNlIC1FTk9FTlQ6CiAJY2FzZSAtRVNIVVRET1dOOgogCQlkZXZfZGJnKCZwb3J0LT5kZXYsICIlcyAtIHVyYiBzaHV0dGluZyBkb3duLCAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0JCXRwb3J0LT50cF90ZGV2LT50ZF91cmJfZXJyb3IgPSAxOwogCQlyZXR1cm47CiAJZGVmYXVsdDoKIAkJZGV2X2Vycl9jb25zb2xlKHBvcnQsICIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cywgJWRcbiIsCiAJCQlfX2Z1bmNfXywgc3RhdHVzKTsKLQkJdHBvcnQtPnRwX3RkZXYtPnRkX3VyYl9lcnJvciA9IDE7CiAJfQogCiAJLyogc2VuZCBhbnkgYnVmZmVyZWQgZGF0YSAqLwpAQCAtMTQ5MCw3ICsxNDM4LDYgQEAKIAlyZXRfc2VyaWFsLnR5cGUgPSBQT1JUXzE2NTUwQTsKIAlyZXRfc2VyaWFsLmxpbmUgPSBwb3J0LT5taW5vcjsKIAlyZXRfc2VyaWFsLnBvcnQgPSBwb3J0LT5wb3J0X251bWJlcjsKLQlyZXRfc2VyaWFsLmZsYWdzID0gdHBvcnQtPnRwX2ZsYWdzOwogCXJldF9zZXJpYWwueG1pdF9maWZvX3NpemUgPSBrZmlmb19zaXplKCZwb3J0LT53cml0ZV9maWZvKTsKIAlyZXRfc2VyaWFsLmJhdWRfYmFzZSA9IHRwb3J0LT50cF90ZGV2LT50ZF9pc18zNDEwID8gOTIxNjAwIDogNDYwODAwOwogCXJldF9zZXJpYWwuY2xvc2luZ193YWl0ID0gY3dhaXQ7CkBAIC0xNTE1LDE0ICsxNDYyLDEzIEBACiAJaWYgKGN3YWl0ICE9IEFTWU5DX0NMT1NJTkdfV0FJVF9OT05FKQogCQljd2FpdCA9IG1zZWNzX3RvX2ppZmZpZXMoMTAgKiBuZXdfc2VyaWFsLmNsb3Npbmdfd2FpdCk7CiAKLQl0cG9ydC0+dHBfZmxhZ3MgPSBuZXdfc2VyaWFsLmZsYWdzICYgVElfU0VUX1NFUklBTF9GTEFHUzsKIAl0cG9ydC0+dHBfcG9ydC0+cG9ydC5jbG9zaW5nX3dhaXQgPSBjd2FpdDsKIAogCXJldHVybiAwOwogfQogCiAKLXN0YXRpYyB2b2lkIHRpX2hhbmRsZV9uZXdfbXNyKHN0cnVjdCB0aV9wb3J0ICp0cG9ydCwgX191OCBtc3IpCitzdGF0aWMgdm9pZCB0aV9oYW5kbGVfbmV3X21zcihzdHJ1Y3QgdGlfcG9ydCAqdHBvcnQsIHU4IG1zcikKIHsKIAlzdHJ1Y3QgYXN5bmNfaWNvdW50ICppY291bnQ7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKQEAgLTE2MzQsOCArMTU4MCw4IEBACiAKIAogc3RhdGljIGludCB0aV93cml0ZV9ieXRlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCi0JCQlzdHJ1Y3QgdGlfZGV2aWNlICp0ZGV2LCB1bnNpZ25lZCBsb25nIGFkZHIsCi0JCQlfX3U4IG1hc2ssIF9fdTggYnl0ZSkKKwkJCSBzdHJ1Y3QgdGlfZGV2aWNlICp0ZGV2LCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkgdTggbWFzaywgdTggYnl0ZSkKIHsKIAlpbnQgc3RhdHVzOwogCXVuc2lnbmVkIGludCBzaXplOwpAQCAtMTY3OSwxMSArMTYyNSwxMCBAQAogCWludCBsZW47CiAKIAlmb3IgKHBvcyA9IHNpemVvZihzdHJ1Y3QgdGlfZmlybXdhcmVfaGVhZGVyKTsgcG9zIDwgc2l6ZTsgcG9zKyspCi0JCWNzID0gKF9fdTgpKGNzICsgYnVmZmVyW3Bvc10pOworCQljcyA9ICh1OCkoY3MgKyBidWZmZXJbcG9zXSk7CiAKIAloZWFkZXIgPSAoc3RydWN0IHRpX2Zpcm13YXJlX2hlYWRlciAqKWJ1ZmZlcjsKLQloZWFkZXItPndMZW5ndGggPSBjcHVfdG9fbGUxNigoX191MTYpKHNpemUKLQkJCQkJLSBzaXplb2Yoc3RydWN0IHRpX2Zpcm13YXJlX2hlYWRlcikpKTsKKwloZWFkZXItPndMZW5ndGggPSBjcHVfdG9fbGUxNihzaXplIC0gc2l6ZW9mKCpoZWFkZXIpKTsKIAloZWFkZXItPmJDaGVja1N1bSA9IGNzOwogCiAJZGV2X2RiZygmZGV2LT5kZXYsICIlcyAtIGRvd25sb2FkaW5nIGZpcm13YXJlXG4iLCBfX2Z1bmNfXyk7CkBAIC0xNzAxLDcgKzE2NDYsNyBAQAogewogCWludCBzdGF0dXM7CiAJaW50IGJ1ZmZlcl9zaXplOwotCV9fdTggKmJ1ZmZlcjsKKwl1OCAqYnVmZmVyOwogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSB0ZGV2LT50ZF9zZXJpYWwtPmRldjsKIAl1bnNpZ25lZCBpbnQgcGlwZSA9IHVzYl9zbmRidWxrcGlwZShkZXYsCiAJCXRkZXYtPnRkX3NlcmlhbC0+cG9ydFswXS0+YnVsa19vdXRfZW5kcG9pbnRBZGRyZXNzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLXNpbXBsZS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwtc2ltcGxlLmMKaW5kZXggYTIwNDc4Mi4uZTk4YjZlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwtc2ltcGxlLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwtc2ltcGxlLmMKQEAgLTU0LDcgKzU0LDggQEAKIC8qIEluZmluZW9uIEZsYXNobG9hZGVyIGRyaXZlciAqLwogI2RlZmluZSBGTEFTSExPQURFUl9JRFMoKQkJXAogCXsgVVNCX0RFVklDRV9JTlRFUkZBQ0VfQ0xBU1MoMHgwNThiLCAweDAwNDEsIFVTQl9DTEFTU19DRENfREFUQSkgfSwgXAotCXsgVVNCX0RFVklDRSgweDgwODcsIDB4MDcxNikgfQorCXsgVVNCX0RFVklDRSgweDgwODcsIDB4MDcxNikgfSwgXAorCXsgVVNCX0RFVklDRSgweDgwODcsIDB4MDgwMSkgfQogREVWSUNFKGZsYXNobG9hZGVyLCBGTEFTSExPQURFUl9JRFMpOwogCiAvKiBHb29nbGUgU2VyaWFsIFVTQiBTdWJDbGFzcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMKaW5kZXggYjFiOWJhYy4uZDIxM2NmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jCkBAIC0xNDMzLDcgKzE0MzMsNyBAQAogCiAJcmMgPSB1c2JfcmVnaXN0ZXIodWRyaXZlcik7CiAJaWYgKHJjKQotCQlyZXR1cm4gcmM7CisJCWdvdG8gZmFpbGVkX3VzYl9yZWdpc3RlcjsKIAogCWZvciAoc2QgPSBzZXJpYWxfZHJpdmVyczsgKnNkOyArK3NkKSB7CiAJCSgqc2QpLT51c2JfZHJpdmVyID0gdWRyaXZlcjsKQEAgLTE0NTEsNiArMTQ1MSw4IEBACiAJd2hpbGUgKHNkLS0gPiBzZXJpYWxfZHJpdmVycykKIAkJdXNiX3NlcmlhbF9kZXJlZ2lzdGVyKCpzZCk7CiAJdXNiX2RlcmVnaXN0ZXIodWRyaXZlcik7CitmYWlsZWRfdXNiX3JlZ2lzdGVyOgorCWtmcmVlKHVkcml2ZXIpOwogCXJldHVybiByYzsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVzYl9zZXJpYWxfcmVnaXN0ZXJfZHJpdmVycyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL2FsYXVkYS5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9hbGF1ZGEuYwppbmRleCAxZDhiMDNjLi44NzhiNGI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL2FsYXVkYS5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvYWxhdWRhLmMKQEAgLTkzOSwxMCArOTM5LDggQEAKIAogCWxlbiA9IG1pbihzZWN0b3JzLCBibG9ja3NpemUpICogKHBhZ2VzaXplICsgNjQpOwogCWJ1ZmZlciA9IGttYWxsb2MobGVuLCBHRlBfTk9JTyk7Ci0JaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImFsYXVkYV9yZWFkX2RhdGE6IE91dCBvZiBtZW1vcnlcbiIpOworCWlmICghYnVmZmVyKQogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwotCX0KIAogCS8qIEZpZ3VyZSBvdXQgdGhlIGluaXRpYWwgTEJBIGFuZCBwYWdlICovCiAJbGJhID0gYWRkcmVzcyA+PiBibG9ja3NoaWZ0OwpAQCAtMTAzMywxOCArMTAzMSwxNSBAQAogCiAJbGVuID0gbWluKHNlY3RvcnMsIGJsb2Nrc2l6ZSkgKiBwYWdlc2l6ZTsKIAlidWZmZXIgPSBrbWFsbG9jKGxlbiwgR0ZQX05PSU8pOwotCWlmIChidWZmZXIgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJhbGF1ZGFfd3JpdGVfZGF0YTogT3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCFidWZmZXIpCiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7Ci0JfQogCiAJLyoKIAkgKiBXZSBhbHNvIG5lZWQgYSB0ZW1wb3JhcnkgYmxvY2sgYnVmZmVyLCB3aGVyZSB3ZSByZWFkIGluIHRoZSBvbGQgZGF0YSwKIAkgKiBvdmVyd3JpdGUgcGFydHMgd2l0aCB0aGUgbmV3IGRhdGEsIGFuZCBtYW5pcHVsYXRlIHRoZSByZWR1bmRhbmN5IGRhdGEKIAkgKi8KIAlibG9ja2J1ZmZlciA9IGttYWxsb2MoKHBhZ2VzaXplICsgNjQpICogYmxvY2tzaXplLCBHRlBfTk9JTyk7Ci0JaWYgKGJsb2NrYnVmZmVyID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWxhdWRhX3dyaXRlX2RhdGE6IE91dCBvZiBtZW1vcnlcbiIpOworCWlmICghYmxvY2tidWZmZXIpIHsKIAkJa2ZyZWUoYnVmZmVyKTsKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3Njc2lnbHVlLmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3Njc2lnbHVlLmMKaW5kZXggMzNlYjkyMy4uOGNkMjkyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS9zY3NpZ2x1ZS5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2NzaWdsdWUuYwpAQCAtMjk2LDYgKzI5NiwxNCBAQAogCQlpZiAodXMtPmZmbGFncyAmIFVTX0ZMX0JST0tFTl9GVUEpCiAJCQlzZGV2LT5icm9rZW5fZnVhID0gMTsKIAorCQkvKiBTb21lIGV2ZW4gdG90YWxseSBmYWlsIHRvIGluZGljYXRlIGEgY2FjaGUgKi8KKwkJaWYgKHVzLT5mZmxhZ3MgJiBVU19GTF9BTFdBWVNfU1lOQykgeworCQkJLyogZG9uJ3QgcmVhZCBjYWNoaW5nIGluZm9ybWF0aW9uICovCisJCQlzZGV2LT5za2lwX21zX3BhZ2VfOCA9IDE7CisJCQlzZGV2LT5za2lwX21zX3BhZ2VfM2YgPSAxOworCQkJLyogYXNzdW1lIHN5bmMgaXMgbmVlZGVkICovCisJCQlzZGV2LT53Y2VfZGVmYXVsdF9vbiA9IDE7CisJCX0KIAl9IGVsc2UgewogCiAJCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3NkZHIwOS5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9zZGRyMDkuYwppbmRleCBjNTc5N2ZhLi4zYWVhYTUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3NkZHIwOS5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2RkcjA5LmMKQEAgLTc2NiwxMCArNzY2LDggQEAKIAogCWxlbiA9IG1pbihzZWN0b3JzLCAodW5zaWduZWQgaW50KSBpbmZvLT5ibG9ja3NpemUpICogaW5mby0+cGFnZXNpemU7CiAJYnVmZmVyID0ga21hbGxvYyhsZW4sIEdGUF9OT0lPKTsKLQlpZiAoYnVmZmVyID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2RkcjA5X3JlYWRfZGF0YTogT3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCFidWZmZXIpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCS8vIFRoaXMgY291bGQgYmUgbWFkZSBtdWNoIG1vcmUgZWZmaWNpZW50IGJ5IGNoZWNraW5nIGZvcgogCS8vIGNvbnRpZ3VvdXMgTEJBJ3MuIEFub3RoZXIgZXhlcmNpc2UgbGVmdCB0byB0aGUgc3R1ZGVudC4KQEAgLTEwMDQsMTAgKzEwMDIsOCBAQAogCXBhZ2VsZW4gPSAoMSA8PCBpbmZvLT5wYWdlc2hpZnQpICsgKDEgPDwgQ09OVFJPTF9TSElGVCk7CiAJYmxvY2tsZW4gPSAocGFnZWxlbiA8PCBpbmZvLT5ibG9ja3NoaWZ0KTsKIAlibG9ja2J1ZmZlciA9IGttYWxsb2MoYmxvY2tsZW4sIEdGUF9OT0lPKTsKLQlpZiAoIWJsb2NrYnVmZmVyKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInNkZHIwOV93cml0ZV9kYXRhOiBPdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAoIWJsb2NrYnVmZmVyKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAkvKgogCSAqIFNpbmNlIHdlIGRvbid0IHdyaXRlIHRoZSB1c2VyIGRhdGEgZGlyZWN0bHkgdG8gdGhlIGRldmljZSwKQEAgLTEwMTcsOCArMTAxMyw3IEBACiAKIAlsZW4gPSBtaW4oc2VjdG9ycywgKHVuc2lnbmVkIGludCkgaW5mby0+YmxvY2tzaXplKSAqIGluZm8tPnBhZ2VzaXplOwogCWJ1ZmZlciA9IGttYWxsb2MobGVuLCBHRlBfTk9JTyk7Ci0JaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInNkZHIwOV93cml0ZV9kYXRhOiBPdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAoIWJ1ZmZlcikgewogCQlrZnJlZShibG9ja2J1ZmZlcik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTEyNDEsOCArMTIzNiw3IEBACiAJYWxsb2NfYmxvY2tzID0gbWluKG51bWJsb2NrcywgU0REUjA5X1JFQURfTUFQX0JVRlNaID4+IENPTlRST0xfU0hJRlQpOwogCWFsbG9jX2xlbiA9IChhbGxvY19ibG9ja3MgPDwgQ09OVFJPTF9TSElGVCk7CiAJYnVmZmVyID0ga21hbGxvYyhhbGxvY19sZW4sIEdGUF9OT0lPKTsKLQlpZiAoYnVmZmVyID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2RkcjA5X3JlYWRfbWFwOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAoIWJ1ZmZlcikgewogCQlyZXN1bHQgPSAtMTsKIAkJZ290byBkb25lOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oCmluZGV4IGFhMzUzOTIuLmFmM2M3ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaApAQCAtMzM4LDYgKzMzOCwxMyBAQAogCQlVU0JfU0NfREVWSUNFLCBVU0JfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9OT19XUF9ERVRFQ1QpLAogCisvKiBSZXBvcnRlZCBieSBFZ2JlcnQgRWljaCA8ZWljaEBzdXNlLmNvbT4gKi8KK1VOVVNVQUxfREVWKCAgMHgwNDgwLCAweGQwMTAsIDB4MDEwMCwgMHg5OTk5LAorCQkiVG9zaGliYSIsCisJCSJFeHRlcm5hbCBVU0IgMy4wIiwKKwkJVVNCX1NDX0RFVklDRSwgVVNCX1BSX0RFVklDRSwgTlVMTCwKKwkJVVNfRkxfQUxXQVlTX1NZTkMpLAorCiAvKiBQYXRjaCBzdWJtaXR0ZWQgYnkgUGhpbGlwcCBGcmllZHJpY2ggPHBoaWxpcHBAdm9pZC5hdD4gKi8KIFVOVVNVQUxfREVWKCAgMHgwNDgyLCAweDAxMDAsIDB4MDEwMCwgMHgwMTAwLAogCQkiS3lvY2VyYSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYwppbmRleCBlZjJkOGNkLi4yY2JhMTNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMKQEAgLTQ5OCw3ICs0OTgsOCBAQAogCQkJVVNfRkxfTk9fUkVBRF9ESVNDX0lORk8gfCBVU19GTF9OT19SRUFEX0NBUEFDSVRZXzE2IHwKIAkJCVVTX0ZMX0lOSVRJQUxfUkVBRDEwIHwgVVNfRkxfV1JJVEVfQ0FDSEUgfAogCQkJVVNfRkxfTk9fQVRBXzFYIHwgVVNfRkxfTk9fUkVQT1JUX09QQ09ERVMgfAotCQkJVVNfRkxfTUFYX1NFQ1RPUlNfMjQwIHwgVVNfRkxfTk9fUkVQT1JUX0xVTlMpOworCQkJVVNfRkxfTUFYX1NFQ1RPUlNfMjQwIHwgVVNfRkxfTk9fUkVQT1JUX0xVTlMgfAorCQkJVVNfRkxfQUxXQVlTX1NZTkMpOwogCiAJcCA9IHF1aXJrczsKIAl3aGlsZSAoKnApIHsKQEAgLTU4MSw2ICs1ODIsOSBAQAogCQljYXNlICd3JzoKIAkJCWYgfD0gVVNfRkxfTk9fV1BfREVURUNUOwogCQkJYnJlYWs7CisJCWNhc2UgJ3knOgorCQkJZiB8PSBVU19GTF9BTFdBWVNfU1lOQzsKKwkJCWJyZWFrOwogCQkvKiBJZ25vcmUgdW5yZWNvZ25pemVkIGZsYWcgY2hhcmFjdGVycyAqLwogCQl9CiAJfQpAQCAtNzk0LDEwICs3OTgsOCBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGg7CiAKIAl1cy0+Y3VycmVudF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghdXMtPmN1cnJlbnRfdXJiKSB7Ci0JCXVzYl9zdG9yX2RiZyh1cywgIlVSQiBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJaWYgKCF1cy0+Y3VycmVudF91cmIpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCS8qCiAJICogSnVzdCBiZWZvcmUgd2Ugc3RhcnQgb3VyIGNvbnRyb2wgdGhyZWFkLCBpbml0aWFsaXplCkBAIC0xMDcwLDE3ICsxMDcyLDE3IEBACiAJcmVzdWx0ID0gdXNiX3N0b3JfYWNxdWlyZV9yZXNvdXJjZXModXMpOwogCWlmIChyZXN1bHQpCiAJCWdvdG8gQmFkRGV2aWNlOworCXVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZV9ub19yZXN1bWUodXMtPnB1c2JfaW50Zik7CiAJc25wcmludGYodXMtPnNjc2lfbmFtZSwgc2l6ZW9mKHVzLT5zY3NpX25hbWUpLCAidXNiLXN0b3JhZ2UgJXMiLAogCQkJCQlkZXZfbmFtZSgmdXMtPnB1c2JfaW50Zi0+ZGV2KSk7CiAJcmVzdWx0ID0gc2NzaV9hZGRfaG9zdCh1c190b19ob3N0KHVzKSwgZGV2KTsKIAlpZiAocmVzdWx0KSB7CiAJCWRldl93YXJuKGRldiwKIAkJCQkiVW5hYmxlIHRvIGFkZCB0aGUgc2NzaSBob3N0XG4iKTsKLQkJZ290byBCYWREZXZpY2U7CisJCWdvdG8gSG9zdEFkZEVycjsKIAl9CiAKIAkvKiBTdWJtaXQgdGhlIGRlbGF5ZWRfd29yayBmb3IgU0NTSS1kZXZpY2Ugc2Nhbm5pbmcgKi8KLQl1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2Vfbm9fcmVzdW1lKHVzLT5wdXNiX2ludGYpOwogCXNldF9iaXQoVVNfRkxJRFhfU0NBTl9QRU5ESU5HLCAmdXMtPmRmbGFncyk7CiAKIAlpZiAoZGVsYXlfdXNlID4gMCkKQEAgLTEwOTAsNiArMTA5Miw4IEBACiAJcmV0dXJuIDA7CiAKIAkvKiBXZSBjb21lIGhlcmUgaWYgdGhlcmUgYXJlIGFueSBwcm9ibGVtcyAqLworSG9zdEFkZEVycjoKKwl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2Vfbm9fc3VzcGVuZCh1cy0+cHVzYl9pbnRmKTsKIEJhZERldmljZToKIAl1c2Jfc3Rvcl9kYmcodXMsICJzdG9yYWdlX3Byb2JlKCkgZmFpbGVkXG4iKTsKIAlyZWxlYXNlX2V2ZXJ5dGhpbmcodXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvdXNiLXNrZWxldG9uLmMgYi9kcml2ZXJzL3VzYi91c2Itc2tlbGV0b24uYwppbmRleCA1NDVkMDliLi41MTMzYTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi91c2Itc2tlbGV0b24uYworKysgYi9kcml2ZXJzL3VzYi91c2Itc2tlbGV0b24uYwpAQCAtNDk5LDEwICs0OTksOCBAQAogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZGV2aWNlIHN0YXRlIGFuZCBpbml0aWFsaXplIGl0ICovCiAJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOwotCWlmICghZGV2KSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiT3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCFkZXYpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCWtyZWZfaW5pdCgmZGV2LT5rcmVmKTsKIAlzZW1hX2luaXQoJmRldi0+bGltaXRfc2VtLCBXUklURVNfSU5fRkxJR0hUKTsKIAltdXRleF9pbml0KCZkZXYtPmlvX211dGV4KTsKQEAgLTUyNiwxNyArNTI0LDExIEBACiAJCQlkZXYtPmJ1bGtfaW5fc2l6ZSA9IGJ1ZmZlcl9zaXplOwogCQkJZGV2LT5idWxrX2luX2VuZHBvaW50QWRkciA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOwogCQkJZGV2LT5idWxrX2luX2J1ZmZlciA9IGttYWxsb2MoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOwotCQkJaWYgKCFkZXYtPmJ1bGtfaW5fYnVmZmVyKSB7Ci0JCQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsCi0JCQkJCSJDb3VsZCBub3QgYWxsb2NhdGUgYnVsa19pbl9idWZmZXJcbiIpOworCQkJaWYgKCFkZXYtPmJ1bGtfaW5fYnVmZmVyKQogCQkJCWdvdG8gZXJyb3I7Ci0JCQl9CiAJCQlkZXYtPmJ1bGtfaW5fdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQkJCWlmICghZGV2LT5idWxrX2luX3VyYikgewotCQkJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LAotCQkJCQkiQ291bGQgbm90IGFsbG9jYXRlIGJ1bGtfaW5fdXJiXG4iKTsKKwkJCWlmICghZGV2LT5idWxrX2luX3VyYikKIAkJCQlnb3RvIGVycm9yOwotCQkJfQogCQl9CiAKIAkJaWYgKCFkZXYtPmJ1bGtfb3V0X2VuZHBvaW50QWRkciAmJgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvdXNiaXAvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL3VzYmlwL0tjb25maWcKaW5kZXggMTc2NDZiMi4uZWVlZmEyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvdXNiaXAvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi91c2JpcC9LY29uZmlnCkBAIC0xLDYgKzEsNyBAQAogY29uZmlnIFVTQklQX0NPUkUKIAl0cmlzdGF0ZSAiVVNCL0lQIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBVU0JfQ09NTU9OICYmIE5FVAorCWRlcGVuZHMgb24gTkVUCisJc2VsZWN0IFVTQl9DT01NT04KIAktLS1oZWxwLS0tCiAJICBUaGlzIGVuYWJsZXMgcHVzaGluZyBVU0IgcGFja2V0cyBvdmVyIElQIHRvIGFsbG93IHJlbW90ZQogCSAgbWFjaGluZXMgZGlyZWN0IGFjY2VzcyB0byBVU0IgZGV2aWNlcy4gSXQgcHJvdmlkZXMgdGhlCkBAIC0yNCw2ICsyNSwyNyBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdmhjaS1oY2QuCiAKK2NvbmZpZyBVU0JJUF9WSENJX0hDX1BPUlRTCisJaW50ICJOdW1iZXIgb2YgcG9ydHMgcGVyIFVTQi9JUCB2aXJ0dWFsIGhvc3QgY29udHJvbGxlciIKKwlyYW5nZSAxIDMxCisJZGVmYXVsdCA4CisJZGVwZW5kcyBvbiBVU0JJUF9WSENJX0hDRAorCS0tLWhlbHAtLS0KKwkgIFRvIGluY3JlYXNlIG51bWJlciBvZiBwb3J0cyBhdmFpbGFibGUgZm9yIFVTQi9JUCB2aXJ0dWFsCisJICBob3N0IGNvbnRyb2xsZXIgZHJpdmVyLCB0aGlzIGRlZmluZXMgbnVtYmVyIG9mIHBvcnRzIHBlcgorCSAgVVNCL0lQIHZpcnR1YWwgaG9zdCBjb250cm9sbGVyLgorCitjb25maWcgVVNCSVBfVkhDSV9OUl9IQ1MKKwlpbnQgIk51bWJlciBvZiBVU0IvSVAgdmlydHVhbCBob3N0IGNvbnRyb2xsZXJzIgorCXJhbmdlIDEgMTI4CisJZGVmYXVsdCAxCisJZGVwZW5kcyBvbiBVU0JJUF9WSENJX0hDRAorCS0tLWhlbHAtLS0KKwkgIFRvIGluY3JlYXNlIG51bWJlciBvZiBwb3J0cyBhdmFpbGFibGUgZm9yIFVTQi9JUCB2aXJ0dWFsCisJICBob3N0IGNvbnRyb2xsZXIgZHJpdmVyLCB0aGlzIGRlZmluZXMgbnVtYmVyIG9mIFVTQi9JUAorCSAgdmlydHVhbCBob3N0IGNvbnRyb2xsZXJzIGFzIGlmIGFkZGluZyBwaHlzaWNhbCBob3N0CisJICBjb250cm9sbGVycy4KKwogY29uZmlnIFVTQklQX0hPU1QKIAl0cmlzdGF0ZSAiSG9zdCBkcml2ZXIiCiAJZGVwZW5kcyBvbiBVU0JJUF9DT1JFICYmIFVTQgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvdXNiaXAvc3R1Yl9yeC5jIGIvZHJpdmVycy91c2IvdXNiaXAvc3R1Yl9yeC5jCmluZGV4IDJkZjYzZTMuLjE5MWIxNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3VzYmlwL3N0dWJfcnguYworKysgYi9kcml2ZXJzL3VzYi91c2JpcC9zdHViX3J4LmMKQEAgLTQ2MSw3ICs0NjEsNiBAQAogCQlwcml2LT51cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCiAJaWYgKCFwcml2LT51cmIpIHsKLQkJZGV2X2VycigmdWRldi0+ZGV2LCAibWFsbG9jIHVyYlxuIik7CiAJCXVzYmlwX2V2ZW50X2FkZCh1ZCwgU0RFVl9FVkVOVF9FUlJPUl9NQUxMT0MpOwogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvdXNiaXAvdmhjaS5oIGIvZHJpdmVycy91c2IvdXNiaXAvdmhjaS5oCmluZGV4IGE4NjNhOTguLjg4YjcxYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3VzYmlwL3ZoY2kuaAorKysgYi9kcml2ZXJzL3VzYi91c2JpcC92aGNpLmgKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggVGFrYWhpcm8gSGlyb2Z1Y2hpCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgTm9idW8gSXdhdGEKICAqCiAgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC03MiwxMyArNzMsMjUgQEAKIH07CiAKIC8qIE51bWJlciBvZiBzdXBwb3J0ZWQgcG9ydHMuIFZhbHVlIGhhcyBhbiB1cHBlcmJvdW5kIG9mIFVTQl9NQVhDSElMRFJFTiAqLwotI2RlZmluZSBWSENJX05QT1JUUyA4CisjaWZkZWYgQ09ORklHX1VTQklQX1ZIQ0lfSENfUE9SVFMKKyNkZWZpbmUgVkhDSV9IQ19QT1JUUyBDT05GSUdfVVNCSVBfVkhDSV9IQ19QT1JUUworI2Vsc2UKKyNkZWZpbmUgVkhDSV9IQ19QT1JUUyA4CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19VU0JJUF9WSENJX05SX0hDUworI2RlZmluZSBWSENJX05SX0hDUyBDT05GSUdfVVNCSVBfVkhDSV9OUl9IQ1MKKyNlbHNlCisjZGVmaW5lIFZIQ0lfTlJfSENTIDEKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9TVEFUVVNfTkFNRSAxNgogCiAvKiBmb3IgdXNiX2J1cy5oY3ByaXYgKi8KIHN0cnVjdCB2aGNpX2hjZCB7CiAJc3BpbmxvY2tfdCBsb2NrOwogCi0JdTMyIHBvcnRfc3RhdHVzW1ZIQ0lfTlBPUlRTXTsKKwl1MzIgcG9ydF9zdGF0dXNbVkhDSV9IQ19QT1JUU107CiAKIAl1bnNpZ25lZCByZXN1bWluZzoxOwogCXVuc2lnbmVkIGxvbmcgcmVfdGltZW91dDsKQEAgLTkwLDE0ICsxMDMsMTkgQEAKIAkgKiB3SW5kZXggc2hvd3MgdGhlIHBvcnQgbnVtYmVyIGFuZCBiZWdpbnMgZnJvbSAxLgogCSAqIEJ1dCwgdGhlIGluZGV4IG9mIHRoaXMgYXJyYXkgYmVnaW5zIGZyb20gMC4KIAkgKi8KLQlzdHJ1Y3QgdmhjaV9kZXZpY2UgdmRldltWSENJX05QT1JUU107CisJc3RydWN0IHZoY2lfZGV2aWNlIHZkZXZbVkhDSV9IQ19QT1JUU107CiB9OwogCi1leHRlcm4gc3RydWN0IHZoY2lfaGNkICp0aGVfY29udHJvbGxlcjsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGRldl9hdHRyX2dyb3VwOworZXh0ZXJuIGludCB2aGNpX251bV9jb250cm9sbGVyczsKK2V4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICoqdmhjaV9wZGV2czsKK2V4dGVybiBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHZoY2lfYXR0cl9ncm91cDsKIAogLyogdmhjaV9oY2QuYyAqLwotdm9pZCByaF9wb3J0X2Nvbm5lY3QoaW50IHJocG9ydCwgZW51bSB1c2JfZGV2aWNlX3NwZWVkIHNwZWVkKTsKK3ZvaWQgcmhfcG9ydF9jb25uZWN0KHN0cnVjdCB2aGNpX2RldmljZSAqdmRldiwgZW51bSB1c2JfZGV2aWNlX3NwZWVkIHNwZWVkKTsKKworLyogdmhjaV9zeXNmcy5jICovCitpbnQgdmhjaV9pbml0X2F0dHJfZ3JvdXAodm9pZCk7Cit2b2lkIHZoY2lfZmluaXNoX2F0dHJfZ3JvdXAodm9pZCk7CiAKIC8qIHZoY2lfcnguYyAqLwogc3RydWN0IHVyYiAqcGlja3VwX3VyYl9hbmRfZnJlZV9wcml2KHN0cnVjdCB2aGNpX2RldmljZSAqdmRldiwgX191MzIgc2VxbnVtKTsKQEAgLTEwNiw5ICsxMjQsMTQgQEAKIC8qIHZoY2lfdHguYyAqLwogaW50IHZoY2lfdHhfbG9vcCh2b2lkICpkYXRhKTsKIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgdmhjaV9kZXZpY2UgKnBvcnRfdG9fdmRldihfX3UzMiBwb3J0KQorc3RhdGljIGlubGluZSBfX3UzMiBwb3J0X3RvX3JocG9ydChfX3UzMiBwb3J0KQogewotCXJldHVybiAmdGhlX2NvbnRyb2xsZXItPnZkZXZbcG9ydF07CisJcmV0dXJuIHBvcnQgJSBWSENJX0hDX1BPUlRTOworfQorCitzdGF0aWMgaW5saW5lIGludCBwb3J0X3RvX3BkZXZfbnIoX191MzIgcG9ydCkKK3sKKwlyZXR1cm4gcG9ydCAvIFZIQ0lfSENfUE9SVFM7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHZoY2lfaGNkICpoY2RfdG9fdmhjaShzdHJ1Y3QgdXNiX2hjZCAqaGNkKQpAQCAtMTE2LDE0ICsxMzksMjUgQEAKIAlyZXR1cm4gKHN0cnVjdCB2aGNpX2hjZCAqKSAoaGNkLT5oY2RfcHJpdik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRldmljZSAqaGNkX2RldihzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCXJldHVybiAoaGNkKS0+c2VsZi5jb250cm9sbGVyOworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmhjZF9uYW1lKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJcmV0dXJuIChoY2QpLT5zZWxmLmJ1c19uYW1lOworfQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB1c2JfaGNkICp2aGNpX3RvX2hjZChzdHJ1Y3QgdmhjaV9oY2QgKnZoY2kpCiB7CiAJcmV0dXJuIGNvbnRhaW5lcl9vZigodm9pZCAqKSB2aGNpLCBzdHJ1Y3QgdXNiX2hjZCwgaGNkX3ByaXYpOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZpY2UgKnZoY2lfZGV2KHN0cnVjdCB2aGNpX2hjZCAqdmhjaSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHZoY2lfaGNkICp2ZGV2X3RvX3ZoY2koc3RydWN0IHZoY2lfZGV2aWNlICp2ZGV2KQogewotCXJldHVybiB2aGNpX3RvX2hjZCh2aGNpKS0+c2VsZi5jb250cm9sbGVyOworCXJldHVybiBjb250YWluZXJfb2YoCisJCQkodm9pZCAqKSh2ZGV2IC0gdmRldi0+cmhwb3J0KSwgc3RydWN0IHZoY2lfaGNkLCB2ZGV2KTsKIH0KIAogI2VuZGlmIC8qIF9fVVNCSVBfVkhDSV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi91c2JpcC92aGNpX2hjZC5jIGIvZHJpdmVycy91c2IvdXNiaXAvdmhjaV9oY2QuYwppbmRleCAyZTA0NTBiZS4uMDNlY2NmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvdXNiaXAvdmhjaV9oY2QuYworKysgYi9kcml2ZXJzL3VzYi91c2JpcC92aGNpX2hjZC5jCkBAIC0xLDUgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA4IFRha2FoaXJvIEhpcm9mdWNoaQorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgTm9idW8gSXdhdGEKICAqCiAgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC01Niw3ICs1Nyw5IEBACiBzdGF0aWMgY29uc3QgY2hhciBkcml2ZXJfbmFtZVtdID0gInZoY2lfaGNkIjsKIHN0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl9kZXNjW10gPSAiVVNCL0lQIFZpcnR1YWwgSG9zdCBDb250cm9sbGVyIjsKIAotc3RydWN0IHZoY2lfaGNkICp0aGVfY29udHJvbGxlcjsKK2ludCB2aGNpX251bV9jb250cm9sbGVycyA9IFZIQ0lfTlJfSENTOworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICoqdmhjaV9wZGV2czsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBiaXRfZGVzY1tdID0gewogCSJDT05ORUNUSU9OIiwJCS8qMCovCkBAIC0xMTksNDcgKzEyMiw1OSBAQAogCXByX2RlYnVnKCJcbiIpOwogfQogCi12b2lkIHJoX3BvcnRfY29ubmVjdChpbnQgcmhwb3J0LCBlbnVtIHVzYl9kZXZpY2Vfc3BlZWQgc3BlZWQpCit2b2lkIHJoX3BvcnRfY29ubmVjdChzdHJ1Y3QgdmhjaV9kZXZpY2UgKnZkZXYsIGVudW0gdXNiX2RldmljZV9zcGVlZCBzcGVlZCkKIHsKKwlzdHJ1Y3QgdmhjaV9oY2QJKnZoY2kgPSB2ZGV2X3RvX3ZoY2kodmRldik7CisJaW50CQlyaHBvcnQgPSB2ZGV2LT5yaHBvcnQ7CisJdTMyCQlzdGF0dXM7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAogCXVzYmlwX2RiZ192aGNpX3JoKCJyaF9wb3J0X2Nvbm5lY3QgJWRcbiIsIHJocG9ydCk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdGhlX2NvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmhjaS0+bG9jaywgZmxhZ3MpOwogCi0JdGhlX2NvbnRyb2xsZXItPnBvcnRfc3RhdHVzW3JocG9ydF0gfD0gVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OCi0JCXwgKDEgPDwgVVNCX1BPUlRfRkVBVF9DX0NPTk5FQ1RJT04pOworCXN0YXR1cyA9IHZoY2ktPnBvcnRfc3RhdHVzW3JocG9ydF07CisKKwlzdGF0dXMgfD0gVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OIHwgKDEgPDwgVVNCX1BPUlRfRkVBVF9DX0NPTk5FQ1RJT04pOwogCiAJc3dpdGNoIChzcGVlZCkgewogCWNhc2UgVVNCX1NQRUVEX0hJR0g6Ci0JCXRoZV9jb250cm9sbGVyLT5wb3J0X3N0YXR1c1tyaHBvcnRdIHw9IFVTQl9QT1JUX1NUQVRfSElHSF9TUEVFRDsKKwkJc3RhdHVzIHw9IFVTQl9QT1JUX1NUQVRfSElHSF9TUEVFRDsKIAkJYnJlYWs7CiAJY2FzZSBVU0JfU1BFRURfTE9XOgotCQl0aGVfY29udHJvbGxlci0+cG9ydF9zdGF0dXNbcmhwb3J0XSB8PSBVU0JfUE9SVF9TVEFUX0xPV19TUEVFRDsKKwkJc3RhdHVzIHw9IFVTQl9QT1JUX1NUQVRfTE9XX1NQRUVEOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCXZoY2ktPnBvcnRfc3RhdHVzW3JocG9ydF0gPSBzdGF0dXM7CiAKLQl1c2JfaGNkX3BvbGxfcmhfc3RhdHVzKHZoY2lfdG9faGNkKHRoZV9jb250cm9sbGVyKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmhjaS0+bG9jaywgZmxhZ3MpOworCisJdXNiX2hjZF9wb2xsX3JoX3N0YXR1cyh2aGNpX3RvX2hjZCh2aGNpKSk7CiB9CiAKLXN0YXRpYyB2b2lkIHJoX3BvcnRfZGlzY29ubmVjdChpbnQgcmhwb3J0KQorc3RhdGljIHZvaWQgcmhfcG9ydF9kaXNjb25uZWN0KHN0cnVjdCB2aGNpX2RldmljZSAqdmRldikKIHsKKwlzdHJ1Y3QgdmhjaV9oY2QJKnZoY2kgPSB2ZGV2X3RvX3ZoY2kodmRldik7CisJaW50CQlyaHBvcnQgPSB2ZGV2LT5yaHBvcnQ7CisJdTMyCQlzdGF0dXM7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAogCXVzYmlwX2RiZ192aGNpX3JoKCJyaF9wb3J0X2Rpc2Nvbm5lY3QgJWRcbiIsIHJocG9ydCk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdGhlX2NvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmhjaS0+bG9jaywgZmxhZ3MpOwogCi0JdGhlX2NvbnRyb2xsZXItPnBvcnRfc3RhdHVzW3JocG9ydF0gJj0gflVTQl9QT1JUX1NUQVRfQ09OTkVDVElPTjsKLQl0aGVfY29udHJvbGxlci0+cG9ydF9zdGF0dXNbcmhwb3J0XSB8PQotCQkJCQkoMSA8PCBVU0JfUE9SVF9GRUFUX0NfQ09OTkVDVElPTik7CisJc3RhdHVzID0gdmhjaS0+cG9ydF9zdGF0dXNbcmhwb3J0XTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7Ci0JdXNiX2hjZF9wb2xsX3JoX3N0YXR1cyh2aGNpX3RvX2hjZCh0aGVfY29udHJvbGxlcikpOworCXN0YXR1cyAmPSB+VVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OOworCXN0YXR1cyB8PSAoMSA8PCBVU0JfUE9SVF9GRUFUX0NfQ09OTkVDVElPTik7CisKKwl2aGNpLT5wb3J0X3N0YXR1c1tyaHBvcnRdID0gc3RhdHVzOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmhjaS0+bG9jaywgZmxhZ3MpOworCXVzYl9oY2RfcG9sbF9yaF9zdGF0dXModmhjaV90b19oY2QodmhjaSkpOwogfQogCiAjZGVmaW5lIFBPUlRfQ19NQVNLCQkJCVwKQEAgLTE4OCw3ICsyMDMsNyBAQAogCWludAkJY2hhbmdlZCA9IDA7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAotCXJldHZhbCA9IERJVl9ST1VORF9VUChWSENJX05QT1JUUyArIDEsIDgpOworCXJldHZhbCA9IERJVl9ST1VORF9VUChWSENJX0hDX1BPUlRTICsgMSwgOCk7CiAJbWVtc2V0KGJ1ZiwgMCwgcmV0dmFsKTsKIAogCXZoY2kgPSBoY2RfdG9fdmhjaShoY2QpOwpAQCAtMjAwLDcgKzIxNSw3IEBACiAJfQogCiAJLyogY2hlY2sgcHNldWRvIHN0YXR1cyByZWdpc3RlciBmb3IgZWFjaCBwb3J0ICovCi0JZm9yIChyaHBvcnQgPSAwOyByaHBvcnQgPCBWSENJX05QT1JUUzsgcmhwb3J0KyspIHsKKwlmb3IgKHJocG9ydCA9IDA7IHJocG9ydCA8IFZIQ0lfSENfUE9SVFM7IHJocG9ydCsrKSB7CiAJCWlmICgodmhjaS0+cG9ydF9zdGF0dXNbcmhwb3J0XSAmIFBPUlRfQ19NQVNLKSkgewogCQkJLyogVGhlIHN0YXR1cyBvZiBhIHBvcnQgaGFzIGJlZW4gY2hhbmdlZCwgKi8KIAkJCXVzYmlwX2RiZ192aGNpX3JoKCJwb3J0ICVkIHN0YXR1cyBjaGFuZ2VkXG4iLCByaHBvcnQpOwpAQCAtMjI1LDcgKzI0MCw3IEBACiAJZGVzYy0+YkRlc2NMZW5ndGggPSA5OwogCWRlc2MtPndIdWJDaGFyYWN0ZXJpc3RpY3MgPSBjcHVfdG9fbGUxNigKIAkJSFVCX0NIQVJfSU5EVl9QT1JUX0xQU00gfCBIVUJfQ0hBUl9DT01NT05fT0NQTSk7Ci0JZGVzYy0+Yk5iclBvcnRzID0gVkhDSV9OUE9SVFM7CisJZGVzYy0+Yk5iclBvcnRzID0gVkhDSV9IQ19QT1JUUzsKIAlkZXNjLT51LmhzLkRldmljZVJlbW92YWJsZVswXSA9IDB4ZmY7CiAJZGVzYy0+dS5ocy5EZXZpY2VSZW1vdmFibGVbMV0gPSAweGZmOwogfQpAQCAtMjM4LDcgKzI1Myw3IEBACiAJaW50CQlyaHBvcnQ7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAotCXUzMiBwcmV2X3BvcnRfc3RhdHVzW1ZIQ0lfTlBPUlRTXTsKKwl1MzIgcHJldl9wb3J0X3N0YXR1c1tWSENJX0hDX1BPUlRTXTsKIAogCWlmICghSENEX0hXX0FDQ0VTU0lCTEUoaGNkKSkKIAkJcmV0dXJuIC1FVElNRURPVVQ7CkBAIC0yNDksNyArMjY0LDcgQEAKIAkgKi8KIAl1c2JpcF9kYmdfdmhjaV9yaCgidHlwZVJlcSAleCB3VmFsdWUgJXggd0luZGV4ICV4XG4iLCB0eXBlUmVxLCB3VmFsdWUsCiAJCQkgIHdJbmRleCk7Ci0JaWYgKHdJbmRleCA+IFZIQ0lfTlBPUlRTKQorCWlmICh3SW5kZXggPiBWSENJX0hDX1BPUlRTKQogCQlwcl9lcnIoImludmFsaWQgcG9ydCBudW1iZXIgJWRcbiIsIHdJbmRleCk7CiAJcmhwb3J0ID0gKChfX3U4KSh3SW5kZXggJiAweDAwZmYpKSAtIDE7CiAKQEAgLTMxNSw3ICszMzAsNyBAQAogCQlicmVhazsKIAljYXNlIEdldFBvcnRTdGF0dXM6CiAJCXVzYmlwX2RiZ192aGNpX3JoKCIgR2V0UG9ydFN0YXR1cyBwb3J0ICV4XG4iLCB3SW5kZXgpOwotCQlpZiAod0luZGV4ID4gVkhDSV9OUE9SVFMgfHwgd0luZGV4IDwgMSkgeworCQlpZiAod0luZGV4ID4gVkhDSV9IQ19QT1JUUyB8fCB3SW5kZXggPCAxKSB7CiAJCQlwcl9lcnIoImludmFsaWQgcG9ydCBudW1iZXIgJWRcbiIsIHdJbmRleCk7CiAJCQlyZXR2YWwgPSAtRVBJUEU7CiAJCX0KQEAgLTQxNiwxNCArNDMxLDI3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgdmhjaV9kZXZpY2UgKmdldF92ZGV2KHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQogewotCWludCBpOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IHVzYl9oY2QgKmhjZDsKKwlzdHJ1Y3QgdmhjaV9oY2QgKnZoY2k7CisJaW50IHBkZXZfbnIsIHJocG9ydDsKIAogCWlmICghdWRldikKIAkJcmV0dXJuIE5VTEw7CiAKLQlmb3IgKGkgPSAwOyBpIDwgVkhDSV9OUE9SVFM7IGkrKykKLQkJaWYgKHRoZV9jb250cm9sbGVyLT52ZGV2W2ldLnVkZXYgPT0gdWRldikKLQkJCXJldHVybiBwb3J0X3RvX3ZkZXYoaSk7CisJZm9yIChwZGV2X25yID0gMDsgcGRldl9uciA8IHZoY2lfbnVtX2NvbnRyb2xsZXJzOyBwZGV2X25yKyspIHsKKwkJcGRldiA9ICoodmhjaV9wZGV2cyArIHBkZXZfbnIpOworCQlpZiAocGRldiA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWhjZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCQlpZiAoaGNkID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJdmhjaSA9IGhjZF90b192aGNpKGhjZCk7CisJCWZvciAocmhwb3J0ID0gMDsgcmhwb3J0IDwgVkhDSV9IQ19QT1JUUzsgcmhwb3J0KyspIHsKKwkJCWlmICh2aGNpLT52ZGV2W3JocG9ydF0udWRldiA9PSB1ZGV2KQorCQkJCXJldHVybiAmdmhjaS0+dmRldltyaHBvcnRdOworCQl9CisJfQogCiAJcmV0dXJuIE5VTEw7CiB9CkBAIC00MzIsNiArNDYwLDcgQEAKIHsKIAlzdHJ1Y3QgdmhjaV9kZXZpY2UgKnZkZXYgPSBnZXRfdmRldih1cmItPmRldik7CiAJc3RydWN0IHZoY2lfcHJpdiAqcHJpdjsKKwlzdHJ1Y3QgdmhjaV9oY2QgKnZoY2kgPSB2ZGV2X3RvX3ZoY2kodmRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICghdmRldikgewpAQCAtNDQ3LDcgKzQ3Niw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdmRldi0+cHJpdl9sb2NrLCBmbGFncyk7CiAKLQlwcml2LT5zZXFudW0gPSBhdG9taWNfaW5jX3JldHVybigmdGhlX2NvbnRyb2xsZXItPnNlcW51bSk7CisJcHJpdi0+c2VxbnVtID0gYXRvbWljX2luY19yZXR1cm4oJnZoY2ktPnNlcW51bSk7CiAJaWYgKHByaXYtPnNlcW51bSA9PSAweGZmZmYpCiAJCWRldl9pbmZvKCZ1cmItPmRldi0+ZGV2LCAic2VxbnVtIG1heFxuIik7CiAKQEAgLTQ2NSw3ICs0OTQsOSBAQAogc3RhdGljIGludCB2aGNpX3VyYl9lbnF1ZXVlKHN0cnVjdCB1c2JfaGNkICpoY2QsIHN0cnVjdCB1cmIgKnVyYiwKIAkJCSAgICBnZnBfdCBtZW1fZmxhZ3MpCiB7CisJc3RydWN0IHZoY2lfaGNkICp2aGNpID0gaGNkX3RvX3ZoY2koaGNkKTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmdXJiLT5kZXYtPmRldjsKKwl1OCBwb3J0bnVtID0gdXJiLT5kZXYtPnBvcnRudW07CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IHZoY2lfZGV2aWNlICp2ZGV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC00NzMsMjYgKzUwNCwzMCBAQAogCXVzYmlwX2RiZ192aGNpX2hjKCJlbnRlciwgdXNiX2hjZCAlcCB1cmIgJXAgbWVtX2ZsYWdzICVkXG4iLAogCQkJICBoY2QsIHVyYiwgbWVtX2ZsYWdzKTsKIAorCWlmIChwb3J0bnVtID4gVkhDSV9IQ19QT1JUUykgeworCQlwcl9lcnIoImludmFsaWQgcG9ydCBudW1iZXIgJWRcbiIsIHBvcnRudW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJdmRldiA9ICZ2aGNpLT52ZGV2W3BvcnRudW0tMV07CisKIAkvKiBwYXRjaCB0byB1c2Jfc2dfaW5pdCgpIGlzIGluIDIuNS42MCAqLwogCUJVR19PTighdXJiLT50cmFuc2Zlcl9idWZmZXIgJiYgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aGNpLT5sb2NrLCBmbGFncyk7CiAKIAlpZiAodXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTKSB7CiAJCWRldl9lcnIoZGV2LCAiVVJCIGFscmVhZHkgdW5saW5rZWQhLCBzdGF0dXMgJWRcbiIsIHVyYi0+c3RhdHVzKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhlX2NvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmhjaS0+bG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gdXJiLT5zdGF0dXM7CiAJfQogCi0JdmRldiA9IHBvcnRfdG9fdmRldih1cmItPmRldi0+cG9ydG51bS0xKTsKLQogCS8qIHJlZnVzZSBlbnF1ZXVlIGZvciBkZWFkIGNvbm5lY3Rpb24gKi8KIAlzcGluX2xvY2soJnZkZXYtPnVkLmxvY2spOwogCWlmICh2ZGV2LT51ZC5zdGF0dXMgPT0gVkRFVl9TVF9OVUxMIHx8CiAJICAgIHZkZXYtPnVkLnN0YXR1cyA9PSBWREVWX1NUX0VSUk9SKSB7CiAJCWRldl9lcnIoZGV2LCAiZW5xdWV1ZSBmb3IgaW5hY3RpdmUgcG9ydCAlZFxuIiwgdmRldi0+cmhwb3J0KTsKIAkJc3Bpbl91bmxvY2soJnZkZXYtPnVkLmxvY2spOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aGNpLT5sb2NrLCBmbGFncyk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAlzcGluX3VubG9jaygmdmRldi0+dWQubG9jayk7CkBAIC01NjUsMTcgKzYwMCwxNiBAQAogCiBvdXQ6CiAJdmhjaV90eF91cmIodXJiKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZoY2ktPmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwogCiBub19uZWVkX3htaXQ6CiAJdXNiX2hjZF91bmxpbmtfdXJiX2Zyb21fZXAoaGNkLCB1cmIpOwogbm9fbmVlZF91bmxpbms6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhlX2NvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aGNpLT5sb2NrLCBmbGFncyk7CiAJaWYgKCFyZXQpCi0JCXVzYl9oY2RfZ2l2ZWJhY2tfdXJiKHZoY2lfdG9faGNkKHRoZV9jb250cm9sbGVyKSwKLQkJCQkgICAgIHVyYiwgdXJiLT5zdGF0dXMpOworCQl1c2JfaGNkX2dpdmViYWNrX3VyYihoY2QsIHVyYiwgdXJiLT5zdGF0dXMpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTYyNywxOSArNjYxLDIwIEBACiAgKi8KIHN0YXRpYyBpbnQgdmhjaV91cmJfZGVxdWV1ZShzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgdXJiICp1cmIsIGludCBzdGF0dXMpCiB7CisJc3RydWN0IHZoY2lfaGNkICp2aGNpID0gaGNkX3RvX3ZoY2koaGNkKTsKIAlzdHJ1Y3QgdmhjaV9wcml2ICpwcml2OwogCXN0cnVjdCB2aGNpX2RldmljZSAqdmRldjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJcHJfaW5mbygiZGVxdWV1ZSBhIHVyYiAlcFxuIiwgdXJiKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aGNpLT5sb2NrLCBmbGFncyk7CiAKIAlwcml2ID0gdXJiLT5oY3ByaXY7CiAJaWYgKCFwcml2KSB7CiAJCS8qIFVSQiB3YXMgbmV2ZXIgbGlua2VkISBvciB3aWxsIGJlIHNvb24gZ2l2ZW4gYmFjayBieQogCQkgKiB2aGNpX3J4LiAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aGNpLT5sb2NrLCBmbGFncyk7CiAJCXJldHVybiAtRUlEUk07CiAJfQogCkBAIC02NDgsNyArNjgzLDcgQEAKIAogCQlyZXQgPSB1c2JfaGNkX2NoZWNrX3VubGlua191cmIoaGNkLCB1cmIsIHN0YXR1cyk7CiAJCWlmIChyZXQpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aGNpLT5sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQpAQCAtNjc2LDEwICs3MTEsOSBAQAogCiAJCXVzYl9oY2RfdW5saW5rX3VyYl9mcm9tX2VwKGhjZCwgdXJiKTsKIAotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOwotCQl1c2JfaGNkX2dpdmViYWNrX3VyYih2aGNpX3RvX2hjZCh0aGVfY29udHJvbGxlciksIHVyYiwKLQkJCQkgICAgIHVyYi0+c3RhdHVzKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZoY2ktPmxvY2ssIGZsYWdzKTsKKwkJdXNiX2hjZF9naXZlYmFja191cmIodmhjaV90b19oY2QodmhjaSksIHVyYiwgdXJiLT5zdGF0dXMpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdmhjaS0+bG9jaywgZmxhZ3MpOwogCiAJfSBlbHNlIHsKIAkJLyogdGNwIGNvbm5lY3Rpb24gaXMgYWxpdmUgKi8KQEAgLTY5MSwxMiArNzI1LDEyIEBACiAJCXVubGluayA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2aGNpX3VubGluayksIEdGUF9BVE9NSUMpOwogCQlpZiAoIXVubGluaykgewogCQkJc3Bpbl91bmxvY2soJnZkZXYtPnByaXZfbG9jayk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmhjaS0+bG9jaywgZmxhZ3MpOwogCQkJdXNiaXBfZXZlbnRfYWRkKCZ2ZGV2LT51ZCwgVkRFVl9FVkVOVF9FUlJPUl9NQUxMT0MpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAotCQl1bmxpbmstPnNlcW51bSA9IGF0b21pY19pbmNfcmV0dXJuKCZ0aGVfY29udHJvbGxlci0+c2VxbnVtKTsKKwkJdW5saW5rLT5zZXFudW0gPSBhdG9taWNfaW5jX3JldHVybigmdmhjaS0+c2VxbnVtKTsKIAkJaWYgKHVubGluay0+c2VxbnVtID09IDB4ZmZmZikKIAkJCXByX2luZm8oInNlcW51bSBtYXhcbiIpOwogCkBAIC03MTIsNyArNzQ2LDcgQEAKIAkJc3Bpbl91bmxvY2soJnZkZXYtPnByaXZfbG9jayk7CiAJfQogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhlX2NvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aGNpLT5sb2NrLCBmbGFncyk7CiAKIAl1c2JpcF9kYmdfdmhjaV9oYygibGVhdmVcbiIpOwogCXJldHVybiAwOwpAQCAtNzIwLDEwICs3NTQsMTIgQEAKIAogc3RhdGljIHZvaWQgdmhjaV9kZXZpY2VfdW5saW5rX2NsZWFudXAoc3RydWN0IHZoY2lfZGV2aWNlICp2ZGV2KQogeworCXN0cnVjdCB2aGNpX2hjZCAqdmhjaSA9IHZkZXZfdG9fdmhjaSh2ZGV2KTsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gdmhjaV90b19oY2QodmhjaSk7CiAJc3RydWN0IHZoY2lfdW5saW5rICp1bmxpbmssICp0bXA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aGNpLT5sb2NrLCBmbGFncyk7CiAJc3Bpbl9sb2NrKCZ2ZGV2LT5wcml2X2xvY2spOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHVubGluaywgdG1wLCAmdmRldi0+dW5saW5rX3R4LCBsaXN0KSB7CkBAIC03NTIsMjQgKzc4OCwyMyBAQAogCiAJCXVyYi0+c3RhdHVzID0gLUVOT0RFVjsKIAotCQl1c2JfaGNkX3VubGlua191cmJfZnJvbV9lcCh2aGNpX3RvX2hjZCh0aGVfY29udHJvbGxlciksIHVyYik7CisJCXVzYl9oY2RfdW5saW5rX3VyYl9mcm9tX2VwKGhjZCwgdXJiKTsKIAogCQlsaXN0X2RlbCgmdW5saW5rLT5saXN0KTsKIAogCQlzcGluX3VubG9jaygmdmRldi0+cHJpdl9sb2NrKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhlX2NvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmhjaS0+bG9jaywgZmxhZ3MpOwogCi0JCXVzYl9oY2RfZ2l2ZWJhY2tfdXJiKHZoY2lfdG9faGNkKHRoZV9jb250cm9sbGVyKSwgdXJiLAotCQkJCSAgICAgdXJiLT5zdGF0dXMpOworCQl1c2JfaGNkX2dpdmViYWNrX3VyYihoY2QsIHVyYiwgdXJiLT5zdGF0dXMpOwogCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdmhjaS0+bG9jaywgZmxhZ3MpOwogCQlzcGluX2xvY2soJnZkZXYtPnByaXZfbG9jayk7CiAKIAkJa2ZyZWUodW5saW5rKTsKIAl9CiAKIAlzcGluX3VubG9jaygmdmRldi0+cHJpdl9sb2NrKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZoY2ktPmxvY2ssIGZsYWdzKTsKIH0KIAogLyoKQEAgLTgyNyw3ICs4NjIsNyBAQAogCSAqIGlzIGFjdHVhbGx5IGdpdmVuIGJhY2sgYnkgdmhjaV9yeCBhZnRlciByZWNlaXZpbmcgaXRzIHJldHVybiBwZHUuCiAJICoKIAkgKi8KLQlyaF9wb3J0X2Rpc2Nvbm5lY3QodmRldi0+cmhwb3J0KTsKKwlyaF9wb3J0X2Rpc2Nvbm5lY3QodmRldik7CiAKIAlwcl9pbmZvKCJkaXNjb25uZWN0IGRldmljZVxuIik7CiB9CkBAIC04NjYsNyArOTAxLDcgQEAKIAogc3RhdGljIHZvaWQgdmhjaV9kZXZpY2VfaW5pdChzdHJ1Y3QgdmhjaV9kZXZpY2UgKnZkZXYpCiB7Ci0JbWVtc2V0KHZkZXYsIDAsIHNpemVvZigqdmRldikpOworCW1lbXNldCh2ZGV2LCAwLCBzaXplb2Yoc3RydWN0IHZoY2lfZGV2aWNlKSk7CiAKIAl2ZGV2LT51ZC5zaWRlICAgPSBVU0JJUF9WSENJOwogCXZkZXYtPnVkLnN0YXR1cyA9IFZERVZfU1RfTlVMTDsKQEAgLTg4NywxNyArOTIyLDM0IEBACiAJdXNiaXBfc3RhcnRfZWgoJnZkZXYtPnVkKTsKIH0KIAorc3RhdGljIGludCBoY2RfbmFtZV90b19pZChjb25zdCBjaGFyICpuYW1lKQoreworCWNoYXIgKmM7CisJbG9uZyB2YWw7CisJaW50IHJldDsKKworCWMgPSBzdHJjaHIobmFtZSwgJy4nKTsKKwlpZiAoYyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGtzdHJ0b2woYysxLCAxMCwgJnZhbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gdmFsOworfQorCiBzdGF0aWMgaW50IHZoY2lfc3RhcnQoc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKIAlzdHJ1Y3QgdmhjaV9oY2QgKnZoY2kgPSBoY2RfdG9fdmhjaShoY2QpOwotCWludCByaHBvcnQ7CisJaW50IGlkLCByaHBvcnQ7CiAJaW50IGVyciA9IDA7CiAKIAl1c2JpcF9kYmdfdmhjaV9oYygiZW50ZXIgdmhjaV9zdGFydFxuIik7CiAKIAkvKiBpbml0aWFsaXplIHByaXZhdGUgZGF0YSBvZiB1c2JfaGNkICovCiAKLQlmb3IgKHJocG9ydCA9IDA7IHJocG9ydCA8IFZIQ0lfTlBPUlRTOyByaHBvcnQrKykgeworCWZvciAocmhwb3J0ID0gMDsgcmhwb3J0IDwgVkhDSV9IQ19QT1JUUzsgcmhwb3J0KyspIHsKIAkJc3RydWN0IHZoY2lfZGV2aWNlICp2ZGV2ID0gJnZoY2ktPnZkZXZbcmhwb3J0XTsKIAogCQl2aGNpX2RldmljZV9pbml0KHZkZXYpOwpAQCAtOTEwLDExICs5NjIsMjYgQEAKIAloY2QtPnBvd2VyX2J1ZGdldCA9IDA7IC8qIG5vIGxpbWl0ICovCiAJaGNkLT51c2VzX25ld19wb2xsaW5nID0gMTsKIAorCWlkID0gaGNkX25hbWVfdG9faWQoaGNkX25hbWUoaGNkKSk7CisJaWYgKGlkIDwgMCkgeworCQlwcl9lcnIoImludmFsaWQgdmhjaSBuYW1lICVzXG4iLCBoY2RfbmFtZShoY2QpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJLyogdmhjaV9oY2QgaXMgbm93IHJlYWR5IHRvIGJlIGNvbnRyb2xsZWQgdGhyb3VnaCBzeXNmcyAqLwotCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmdmhjaV9kZXYodmhjaSktPmtvYmosICZkZXZfYXR0cl9ncm91cCk7Ci0JaWYgKGVycikgewotCQlwcl9lcnIoImNyZWF0ZSBzeXNmcyBmaWxlc1xuIik7Ci0JCXJldHVybiBlcnI7CisJaWYgKGlkID09IDApIHsKKwkJZXJyID0gdmhjaV9pbml0X2F0dHJfZ3JvdXAoKTsKKwkJaWYgKGVycikgeworCQkJcHJfZXJyKCJpbml0IGF0dHIgZ3JvdXBcbiIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmhjZF9kZXYoaGNkKS0+a29iaiwgJnZoY2lfYXR0cl9ncm91cCk7CisJCWlmIChlcnIpIHsKKwkJCXByX2VycigiY3JlYXRlIHN5c2ZzIGZpbGVzXG4iKTsKKwkJCXZoY2lfZmluaXNoX2F0dHJfZ3JvdXAoKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJcHJfaW5mbygiY3JlYXRlZCBzeXNmcyAlc1xuIiwgaGNkX25hbWUoaGNkKSk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC05MjMsMTUgKzk5MCwxOSBAQAogc3RhdGljIHZvaWQgdmhjaV9zdG9wKHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7CiAJc3RydWN0IHZoY2lfaGNkICp2aGNpID0gaGNkX3RvX3ZoY2koaGNkKTsKLQlpbnQgcmhwb3J0ID0gMDsKKwlpbnQgaWQsIHJocG9ydDsKIAogCXVzYmlwX2RiZ192aGNpX2hjKCJzdG9wIFZIQ0kgY29udHJvbGxlclxuIik7CiAKIAkvKiAxLiByZW1vdmUgdGhlIHVzZXJsYW5kIGludGVyZmFjZSBvZiB2aGNpX2hjZCAqLwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmdmhjaV9kZXYodmhjaSktPmtvYmosICZkZXZfYXR0cl9ncm91cCk7CisJaWQgPSBoY2RfbmFtZV90b19pZChoY2RfbmFtZShoY2QpKTsKKwlpZiAoaWQgPT0gMCkgeworCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmhjZF9kZXYoaGNkKS0+a29iaiwgJnZoY2lfYXR0cl9ncm91cCk7CisJCXZoY2lfZmluaXNoX2F0dHJfZ3JvdXAoKTsKKwl9CiAKIAkvKiAyLiBzaHV0ZG93biBhbGwgdGhlIHBvcnRzIG9mIHZoY2lfaGNkICovCi0JZm9yIChyaHBvcnQgPSAwOyByaHBvcnQgPCBWSENJX05QT1JUUzsgcmhwb3J0KyspIHsKKwlmb3IgKHJocG9ydCA9IDA7IHJocG9ydCA8IFZIQ0lfSENfUE9SVFM7IHJocG9ydCsrKSB7CiAJCXN0cnVjdCB2aGNpX2RldmljZSAqdmRldiA9ICZ2aGNpLT52ZGV2W3JocG9ydF07CiAKIAkJdXNiaXBfZXZlbnRfYWRkKCZ2ZGV2LT51ZCwgVkRFVl9FVkVOVF9SRU1PVkVEKTsKQEAgLTEwMjUsOSArMTA5Niw2IEBACiAJfQogCWhjZC0+aGFzX3R0ID0gMTsKIAotCS8qIHRoaXMgaXMgcHJpdmF0ZSBkYXRhIGZvciB2aGNpX2hjZCAqLwotCXRoZV9jb250cm9sbGVyID0gaGNkX3RvX3ZoY2koaGNkKTsKLQogCS8qCiAJICogRmluaXNoIGdlbmVyaWMgSENEIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbiBhbmQgcmVnaXN0ZXIuCiAJICogQ2FsbCB0aGUgZHJpdmVyJ3MgcmVzZXQoKSBhbmQgc3RhcnQoKSByb3V0aW5lcy4KQEAgLTEwMzYsNyArMTEwNCw2IEBACiAJaWYgKHJldCAhPSAwKSB7CiAJCXByX2VycigidXNiX2FkZF9oY2QgZmFpbGVkICVkXG4iLCByZXQpOwogCQl1c2JfcHV0X2hjZChoY2QpOwotCQl0aGVfY29udHJvbGxlciA9IE5VTEw7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0xMDU5LDcgKzExMjYsNiBAQAogCSAqLwogCXVzYl9yZW1vdmVfaGNkKGhjZCk7CiAJdXNiX3B1dF9oY2QoaGNkKTsKLQl0aGVfY29udHJvbGxlciA9IE5VTEw7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEwNzAsMjEgKzExMzYsMjQgQEAKIHN0YXRpYyBpbnQgdmhjaV9oY2Rfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJc3RydWN0IHVzYl9oY2QgKmhjZDsKLQlpbnQgcmhwb3J0ID0gMDsKKwlzdHJ1Y3QgdmhjaV9oY2QgKnZoY2k7CisJaW50IHJocG9ydDsKIAlpbnQgY29ubmVjdGVkID0gMDsKIAlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaWYgKCFoY2QpCisJCXJldHVybiAwOworCXZoY2kgPSBoY2RfdG9fdmhjaShoY2QpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnZoY2ktPmxvY2ssIGZsYWdzKTsKIAotCWZvciAocmhwb3J0ID0gMDsgcmhwb3J0IDwgVkhDSV9OUE9SVFM7IHJocG9ydCsrKQotCQlpZiAodGhlX2NvbnRyb2xsZXItPnBvcnRfc3RhdHVzW3JocG9ydF0gJgotCQkgICAgVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OKQorCWZvciAocmhwb3J0ID0gMDsgcmhwb3J0IDwgVkhDSV9IQ19QT1JUUzsgcmhwb3J0KyspCisJCWlmICh2aGNpLT5wb3J0X3N0YXR1c1tyaHBvcnRdICYgVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OKQogCQkJY29ubmVjdGVkICs9IDE7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZoY2ktPmxvY2ssIGZsYWdzKTsKIAogCWlmIChjb25uZWN0ZWQgPiAwKSB7CiAJCWRldl9pbmZvKCZwZGV2LT5kZXYsCkBAIC0xMTA2LDYgKzExNzUsOCBAQAogCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAloY2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpZiAoIWhjZCkKKwkJcmV0dXJuIDA7CiAJc2V0X2JpdChIQ0RfRkxBR19IV19BQ0NFU1NJQkxFLCAmaGNkLT5mbGFncyk7CiAJdXNiX2hjZF9wb2xsX3JoX3N0YXR1cyhoY2QpOwogCkBAIC0xMTI5LDUyICsxMjAwLDc4IEBACiAJfSwKIH07CiAKLS8qCi0gKiBUaGUgVkhDSSAnZGV2aWNlJyBpcyAndmlydHVhbCc7IG5vdCBhIHJlYWwgcGx1ZyZwbGF5IGhhcmR3YXJlLgotICogV2UgbmVlZCB0byBhZGQgdGhpcyB2aXJ0dWFsIGRldmljZSBhcyBhIHBsYXRmb3JtIGRldmljZSBhcmJpdHJhcmlseToKLSAqCTEuIHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigpCi0gKi8KLXN0YXRpYyB2b2lkIHRoZV9wZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBhZGRfcGxhdGZvcm1fZGV2aWNlKGludCBpZCkKIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCWludCBkZXZfbnI7CisKKwlpZiAoaWQgPT0gMCkKKwkJZGV2X25yID0gLTE7CisJZWxzZQorCQlkZXZfbnIgPSBpZDsKKworCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKGRyaXZlcl9uYW1lLCBkZXZfbnIsIE5VTEwsIDApOworCWlmIChJU19FUlIocGRldikpCisJCXJldHVybiBQVFJfRVJSKHBkZXYpOworCisJKih2aGNpX3BkZXZzICsgaWQpID0gcGRldjsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdGhlX3BkZXYgPSB7Ci0JLyogc2hvdWxkIGJlIHRoZSBzYW1lIG5hbWUgYXMgZHJpdmVyX25hbWUgKi8KLQkubmFtZSA9IGRyaXZlcl9uYW1lLAotCS5pZCA9IC0xLAotCS5kZXYgPSB7Ci0JCS5yZWxlYXNlID0gdGhlX3BkZXZfcmVsZWFzZSwKLQl9LAotfTsKK3N0YXRpYyB2b2lkIGRlbF9wbGF0Zm9ybV9kZXZpY2VzKHZvaWQpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB2aGNpX251bV9jb250cm9sbGVyczsgaSsrKSB7CisJCXBkZXYgPSAqKHZoY2lfcGRldnMgKyBpKTsKKwkJaWYgKHBkZXYgIT0gTlVMTCkKKwkJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkZXYpOworCQkqKHZoY2lfcGRldnMgKyBpKSA9IE5VTEw7CisJfQorCXN5c2ZzX3JlbW92ZV9saW5rKCZwbGF0Zm9ybV9idXMua29iaiwgZHJpdmVyX25hbWUpOworfQogCiBzdGF0aWMgaW50IF9faW5pdCB2aGNpX2hjZF9pbml0KHZvaWQpCiB7Ci0JaW50IHJldDsKKwlpbnQgaSwgcmV0OwogCiAJaWYgKHVzYl9kaXNhYmxlZCgpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCWlmICh2aGNpX251bV9jb250cm9sbGVycyA8IDEpCisJCXZoY2lfbnVtX2NvbnRyb2xsZXJzID0gMTsKKworCXZoY2lfcGRldnMgPSBrY2FsbG9jKHZoY2lfbnVtX2NvbnRyb2xsZXJzLCBzaXplb2Yodm9pZCAqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHZoY2lfcGRldnMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnZoY2lfZHJpdmVyKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycl9kcml2ZXJfcmVnaXN0ZXI7CiAKLQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnRoZV9wZGV2KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9wbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXI7CisJZm9yIChpID0gMDsgaSA8IHZoY2lfbnVtX2NvbnRyb2xsZXJzOyBpKyspIHsKKwkJcmV0ID0gYWRkX3BsYXRmb3JtX2RldmljZShpKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX3BsYXRmb3JtX2RldmljZV9yZWdpc3RlcjsKKwl9CiAKIAlwcl9pbmZvKERSSVZFUl9ERVNDICIgdiIgVVNCSVBfVkVSU0lPTiAiXG4iKTsKIAlyZXR1cm4gcmV0OwogCiBlcnJfcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyOgorCWRlbF9wbGF0Zm9ybV9kZXZpY2VzKCk7CiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnZoY2lfZHJpdmVyKTsKIGVycl9kcml2ZXJfcmVnaXN0ZXI6CisJa2ZyZWUodmhjaV9wZGV2cyk7CiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHZoY2lfaGNkX2V4aXQodm9pZCkKIHsKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcigmdGhlX3BkZXYpOworCWRlbF9wbGF0Zm9ybV9kZXZpY2VzKCk7CiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnZoY2lfZHJpdmVyKTsKKwlrZnJlZSh2aGNpX3BkZXZzKTsKIH0KIAogbW9kdWxlX2luaXQodmhjaV9oY2RfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi91c2JpcC92aGNpX3J4LmMgYi9kcml2ZXJzL3VzYi91c2JpcC92aGNpX3J4LmMKaW5kZXggZDY1NmUwZS4uZmMyZDMxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvdXNiaXAvdmhjaV9yeC5jCisrKyBiL2RyaXZlcnMvdXNiL3VzYmlwL3ZoY2lfcnguYwpAQCAtNzAsNiArNzAsNyBAQAogc3RhdGljIHZvaWQgdmhjaV9yZWN2X3JldF9zdWJtaXQoc3RydWN0IHZoY2lfZGV2aWNlICp2ZGV2LAogCQkJCSBzdHJ1Y3QgdXNiaXBfaGVhZGVyICpwZHUpCiB7CisJc3RydWN0IHZoY2lfaGNkICp2aGNpID0gdmRldl90b192aGNpKHZkZXYpOwogCXN0cnVjdCB1c2JpcF9kZXZpY2UgKnVkID0gJnZkZXYtPnVkOwogCXN0cnVjdCB1cmIgKnVyYjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtODEsNyArODIsNyBAQAogCWlmICghdXJiKSB7CiAJCXByX2VycigiY2Fubm90IGZpbmQgYSB1cmIgb2Ygc2VxbnVtICV1XG4iLCBwZHUtPmJhc2Uuc2VxbnVtKTsKIAkJcHJfaW5mbygibWF4IHNlcW51bSAlZFxuIiwKLQkJCWF0b21pY19yZWFkKCZ0aGVfY29udHJvbGxlci0+c2VxbnVtKSk7CisJCQlhdG9taWNfcmVhZCgmdmhjaS0+c2VxbnVtKSk7CiAJCXVzYmlwX2V2ZW50X2FkZCh1ZCwgVkRFVl9FVkVOVF9FUlJPUl9UQ1ApOwogCQlyZXR1cm47CiAJfQpAQCAtMTA1LDExICsxMDYsMTEgQEAKIAogCXVzYmlwX2RiZ192aGNpX3J4KCJub3cgZ2l2ZWJhY2sgdXJiICVwXG4iLCB1cmIpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7Ci0JdXNiX2hjZF91bmxpbmtfdXJiX2Zyb21fZXAodmhjaV90b19oY2QodGhlX2NvbnRyb2xsZXIpLCB1cmIpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnZoY2ktPmxvY2ssIGZsYWdzKTsKKwl1c2JfaGNkX3VubGlua191cmJfZnJvbV9lcCh2aGNpX3RvX2hjZCh2aGNpKSwgdXJiKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aGNpLT5sb2NrLCBmbGFncyk7CiAKLQl1c2JfaGNkX2dpdmViYWNrX3VyYih2aGNpX3RvX2hjZCh0aGVfY29udHJvbGxlciksIHVyYiwgdXJiLT5zdGF0dXMpOworCXVzYl9oY2RfZ2l2ZWJhY2tfdXJiKHZoY2lfdG9faGNkKHZoY2kpLCB1cmIsIHVyYi0+c3RhdHVzKTsKIAogCXVzYmlwX2RiZ192aGNpX3J4KCJMZWF2ZVxuIik7CiB9CkBAIC0xNDIsNiArMTQzLDcgQEAKIHN0YXRpYyB2b2lkIHZoY2lfcmVjdl9yZXRfdW5saW5rKHN0cnVjdCB2aGNpX2RldmljZSAqdmRldiwKIAkJCQkgc3RydWN0IHVzYmlwX2hlYWRlciAqcGR1KQogeworCXN0cnVjdCB2aGNpX2hjZCAqdmhjaSA9IHZkZXZfdG9fdmhjaSh2ZGV2KTsKIAlzdHJ1Y3QgdmhjaV91bmxpbmsgKnVubGluazsKIAlzdHJ1Y3QgdXJiICp1cmI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTE3NCwxMiArMTc2LDExIEBACiAJCXVyYi0+c3RhdHVzID0gcGR1LT51LnJldF91bmxpbmsuc3RhdHVzOwogCQlwcl9pbmZvKCJ1cmItPnN0YXR1cyAlZFxuIiwgdXJiLT5zdGF0dXMpOwogCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOwotCQl1c2JfaGNkX3VubGlua191cmJfZnJvbV9lcCh2aGNpX3RvX2hjZCh0aGVfY29udHJvbGxlciksIHVyYik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ2aGNpLT5sb2NrLCBmbGFncyk7CisJCXVzYl9oY2RfdW5saW5rX3VyYl9mcm9tX2VwKHZoY2lfdG9faGNkKHZoY2kpLCB1cmIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aGNpLT5sb2NrLCBmbGFncyk7CiAKLQkJdXNiX2hjZF9naXZlYmFja191cmIodmhjaV90b19oY2QodGhlX2NvbnRyb2xsZXIpLCB1cmIsCi0JCQkJICAgICB1cmItPnN0YXR1cyk7CisJCXVzYl9oY2RfZ2l2ZWJhY2tfdXJiKHZoY2lfdG9faGNkKHZoY2kpLCB1cmIsIHVyYi0+c3RhdHVzKTsKIAl9CiAKIAlrZnJlZSh1bmxpbmspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvdXNiaXAvdmhjaV9zeXNmcy5jIGIvZHJpdmVycy91c2IvdXNiaXAvdmhjaV9zeXNmcy5jCmluZGV4IDViNTQ2MmUuLmM0MDQwMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3VzYmlwL3ZoY2lfc3lzZnMuYworKysgYi9kcml2ZXJzL3VzYi91c2JpcC92aGNpX3N5c2ZzLmMKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggVGFrYWhpcm8gSGlyb2Z1Y2hpCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBOb2J1byBJd2F0YQogICoKICAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTIwLDYgKzIxLDggQEAKICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgInVzYmlwX2NvbW1vbi5oIgogI2luY2x1ZGUgInZoY2kuaCIKQEAgLTI3LDEwNiArMzAsMTkwIEBACiAvKiBUT0RPOiByZWZpbmUgbG9ja2luZyA/Ki8KIAogLyogU3lzZnMgZW50cnkgdG8gc2hvdyBwb3J0IHN0YXR1cyAqLwotc3RhdGljIHNzaXplX3Qgc3RhdHVzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgIGNoYXIgKm91dCkKK3N0YXRpYyBzc2l6ZV90IHN0YXR1c19zaG93X3ZoY2koaW50IHBkZXZfbnIsIGNoYXIgKm91dCkKIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gKih2aGNpX3BkZXZzICsgcGRldl9ucik7CisJc3RydWN0IHZoY2lfaGNkICp2aGNpOwogCWNoYXIgKnMgPSBvdXQ7CiAJaW50IGkgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlCVUdfT04oIXRoZV9jb250cm9sbGVyIHx8ICFvdXQpOworCWlmICghcGRldiB8fCAhb3V0KSB7CisJCXVzYmlwX2RiZ192aGNpX3N5c2ZzKCJzaG93IHN0YXR1cyBlcnJvclxuIik7CisJCXJldHVybiAwOworCX0KIAotCXNwaW5fbG9ja19pcnFzYXZlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCXZoY2kgPSBoY2RfdG9fdmhjaShwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmhjaS0+bG9jaywgZmxhZ3MpOwogCiAJLyoKIAkgKiBvdXRwdXQgZXhhbXBsZToKLQkgKiBwcnQgc3RhIHNwZCBkZXYgc29ja2V0ICAgICAgICAgICBsb2NhbF9idXNpZAotCSAqIDAwMCAwMDQgMDAwIDAwMCAgICAgICAgIGM1YTdiYjgwIDEtMi4zCi0JICogMDAxIDAwNCAwMDAgMDAwICAgICAgICAgZDhjZWU5ODAgMi0zLjQKKwkgKiBwb3J0IHN0YSBzcGQgZGV2ICAgICAgc29ja2V0ICAgICAgICAgICBsb2NhbF9idXNpZAorCSAqIDAwMDAgMDA0IDAwMCAwMDAwMDAwMCAgICAgICAgIGM1YTdiYjgwIDEtMi4zCisJICogMDAwMSAwMDQgMDAwIDAwMDAwMDAwICAgICAgICAgZDhjZWU5ODAgMi0zLjQKIAkgKgogCSAqIElQIGFkZHJlc3MgY2FuIGJlIHJldHJpZXZlZCBmcm9tIGEgc29ja2V0IHBvaW50ZXIgYWRkcmVzcyBieSBsb29raW5nCiAJICogdXAgL3Byb2MvbmV0L3t0Y3AsdGNwNn0uIEFsc28sIGEgdXNlcmxhbmQgcHJvZ3JhbSBtYXkgcmVtZW1iZXIgYQogCSAqIHBvcnQgbnVtYmVyIGFuZCBpdHMgcGVlciBJUCBhZGRyZXNzLgogCSAqLwotCW91dCArPSBzcHJpbnRmKG91dCwKLQkJICAgICAgICJwcnQgc3RhIHNwZCBidXMgZGV2IHNvY2tldCAgICAgICAgICAgbG9jYWxfYnVzaWRcbiIpOwotCi0JZm9yIChpID0gMDsgaSA8IFZIQ0lfTlBPUlRTOyBpKyspIHsKLQkJc3RydWN0IHZoY2lfZGV2aWNlICp2ZGV2ID0gcG9ydF90b192ZGV2KGkpOworCWZvciAoaSA9IDA7IGkgPCBWSENJX0hDX1BPUlRTOyBpKyspIHsKKwkJc3RydWN0IHZoY2lfZGV2aWNlICp2ZGV2ID0gJnZoY2ktPnZkZXZbaV07CiAKIAkJc3Bpbl9sb2NrKCZ2ZGV2LT51ZC5sb2NrKTsKLQkJb3V0ICs9IHNwcmludGYob3V0LCAiJTAzdSAlMDN1ICIsIGksIHZkZXYtPnVkLnN0YXR1cyk7CisJCW91dCArPSBzcHJpbnRmKG91dCwgIiUwNHUgJTAzdSAiLAorCQkJCSAgICAocGRldl9uciAqIFZIQ0lfSENfUE9SVFMpICsgaSwKKwkJCQkgICAgdmRldi0+dWQuc3RhdHVzKTsKIAogCQlpZiAodmRldi0+dWQuc3RhdHVzID09IFZERVZfU1RfVVNFRCkgewogCQkJb3V0ICs9IHNwcmludGYob3V0LCAiJTAzdSAlMDh4ICIsCi0JCQkJICAgICAgIHZkZXYtPnNwZWVkLCB2ZGV2LT5kZXZpZCk7Ci0JCQlvdXQgKz0gc3ByaW50ZihvdXQsICIlMTZwICIsIHZkZXYtPnVkLnRjcF9zb2NrZXQpOwotCQkJb3V0ICs9IHNwcmludGYob3V0LCAiJXMiLCBkZXZfbmFtZSgmdmRldi0+dWRldi0+ZGV2KSk7CisJCQkJCSAgICB2ZGV2LT5zcGVlZCwgdmRldi0+ZGV2aWQpOworCQkJb3V0ICs9IHNwcmludGYob3V0LCAiJTE2cCAlcyIsCisJCQkJCSAgICB2ZGV2LT51ZC50Y3Bfc29ja2V0LAorCQkJCQkgICAgZGV2X25hbWUoJnZkZXYtPnVkZXYtPmRldikpOwogCiAJCX0gZWxzZSB7Ci0JCQlvdXQgKz0gc3ByaW50ZihvdXQsICIwMDAgMDAwIDAwMCAwMDAwMDAwMDAwMDAwMDAwIDAtMCIpOworCQkJb3V0ICs9IHNwcmludGYob3V0LCAiMDAwIDAwMDAwMDAwICIpOworCQkJb3V0ICs9IHNwcmludGYob3V0LCAiMDAwMDAwMDAwMDAwMDAwMCAwLTAiKTsKIAkJfQogCiAJCW91dCArPSBzcHJpbnRmKG91dCwgIlxuIik7CiAJCXNwaW5fdW5sb2NrKCZ2ZGV2LT51ZC5sb2NrKTsKIAl9CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZoY2ktPmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiBvdXQgLSBzOwogfQotc3RhdGljIERFVklDRV9BVFRSX1JPKHN0YXR1cyk7CisKK3N0YXRpYyBzc2l6ZV90IHN0YXR1c19zaG93X25vdF9yZWFkeShpbnQgcGRldl9uciwgY2hhciAqb3V0KQoreworCWNoYXIgKnMgPSBvdXQ7CisJaW50IGkgPSAwOworCisJZm9yIChpID0gMDsgaSA8IFZIQ0lfSENfUE9SVFM7IGkrKykgeworCQlvdXQgKz0gc3ByaW50ZihvdXQsICIlMDR1ICUwM3UgIiwKKwkJCQkgICAgKHBkZXZfbnIgKiBWSENJX0hDX1BPUlRTKSArIGksCisJCQkJICAgIFZERVZfU1RfTk9UQVNTSUdORUQpOworCQlvdXQgKz0gc3ByaW50ZihvdXQsICIwMDAgMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAwLTAiKTsKKwkJb3V0ICs9IHNwcmludGYob3V0LCAiXG4iKTsKKwl9CisJcmV0dXJuIG91dCAtIHM7Cit9CisKK3N0YXRpYyBpbnQgc3RhdHVzX25hbWVfdG9faWQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwljaGFyICpjOworCWxvbmcgdmFsOworCWludCByZXQ7CisKKwljID0gc3RyY2hyKG5hbWUsICcuJyk7CisJaWYgKGMgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBrc3RydG9sKGMrMSwgMTAsICZ2YWwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHNzaXplX3Qgc3RhdHVzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKm91dCkKK3sKKwljaGFyICpzID0gb3V0OworCWludCBwZGV2X25yOworCisJb3V0ICs9IHNwcmludGYob3V0LAorCQkgICAgICAgInBvcnQgc3RhIHNwZCBkZXYgICAgICBzb2NrZXQgICAgICAgICAgIGxvY2FsX2J1c2lkXG4iKTsKKworCXBkZXZfbnIgPSBzdGF0dXNfbmFtZV90b19pZChhdHRyLT5hdHRyLm5hbWUpOworCWlmIChwZGV2X25yIDwgMCkKKwkJb3V0ICs9IHN0YXR1c19zaG93X25vdF9yZWFkeShwZGV2X25yLCBvdXQpOworCWVsc2UKKwkJb3V0ICs9IHN0YXR1c19zaG93X3ZoY2kocGRldl9uciwgb3V0KTsKKworCXJldHVybiBvdXQgLSBzOworfQorCitzdGF0aWMgc3NpemVfdCBucG9ydHNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY2hhciAqb3V0KQoreworCWNoYXIgKnMgPSBvdXQ7CisKKwlvdXQgKz0gc3ByaW50ZihvdXQsICIlZFxuIiwgVkhDSV9IQ19QT1JUUyAqIHZoY2lfbnVtX2NvbnRyb2xsZXJzKTsKKwlyZXR1cm4gb3V0IC0gczsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhucG9ydHMpOwogCiAvKiBTeXNmcyBlbnRyeSB0byBzaHV0ZG93biBhIHZpcnR1YWwgY29ubmVjdGlvbiAqLwotc3RhdGljIGludCB2aGNpX3BvcnRfZGlzY29ubmVjdChfX3UzMiByaHBvcnQpCitzdGF0aWMgaW50IHZoY2lfcG9ydF9kaXNjb25uZWN0KHN0cnVjdCB2aGNpX2hjZCAqdmhjaSwgX191MzIgcmhwb3J0KQogewotCXN0cnVjdCB2aGNpX2RldmljZSAqdmRldjsKKwlzdHJ1Y3QgdmhjaV9kZXZpY2UgKnZkZXYgPSAmdmhjaS0+dmRldltyaHBvcnRdOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAl1c2JpcF9kYmdfdmhjaV9zeXNmcygiZW50ZXJcbiIpOwogCiAJLyogbG9jayAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOwotCi0JdmRldiA9IHBvcnRfdG9fdmRldihyaHBvcnQpOwotCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZoY2ktPmxvY2ssIGZsYWdzKTsKIAlzcGluX2xvY2soJnZkZXYtPnVkLmxvY2spOworCiAJaWYgKHZkZXYtPnVkLnN0YXR1cyA9PSBWREVWX1NUX05VTEwpIHsKIAkJcHJfZXJyKCJub3QgY29ubmVjdGVkICVkXG4iLCB2ZGV2LT51ZC5zdGF0dXMpOwogCiAJCS8qIHVubG9jayAqLwogCQlzcGluX3VubG9jaygmdmRldi0+dWQubG9jayk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZoY2ktPmxvY2ssIGZsYWdzKTsKIAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAkvKiB1bmxvY2sgKi8KIAlzcGluX3VubG9jaygmdmRldi0+dWQubG9jayk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhlX2NvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aGNpLT5sb2NrLCBmbGFncyk7CiAKIAl1c2JpcF9ldmVudF9hZGQoJnZkZXYtPnVkLCBWREVWX0VWRU5UX0RPV04pOwogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgdmFsaWRfcG9ydChfX3UzMiBwZGV2X25yLCBfX3UzMiByaHBvcnQpCit7CisJaWYgKHBkZXZfbnIgPj0gdmhjaV9udW1fY29udHJvbGxlcnMpIHsKKwkJcHJfZXJyKCJwZGV2ICV1XG4iLCBwZGV2X25yKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChyaHBvcnQgPj0gVkhDSV9IQ19QT1JUUykgeworCQlwcl9lcnIoInJocG9ydCAldVxuIiwgcmhwb3J0KTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCiBzdGF0aWMgc3NpemVfdCBzdG9yZV9kZXRhY2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlpbnQgZXJyOwotCV9fdTMyIHJocG9ydCA9IDA7CisJX191MzIgcG9ydCA9IDAsIHBkZXZfbnIgPSAwLCByaHBvcnQgPSAwOworCXN0cnVjdCB1c2JfaGNkICpoY2Q7CisJaW50IHJldDsKIAotCWlmIChzc2NhbmYoYnVmLCAiJXUiLCAmcmhwb3J0KSAhPSAxKQorCWlmIChrc3RydG9pbnQoYnVmLCAxMCwgJnBvcnQpIDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkvKiBjaGVjayByaHBvcnQgKi8KLQlpZiAocmhwb3J0ID49IFZIQ0lfTlBPUlRTKSB7Ci0JCWRldl9lcnIoZGV2LCAiaW52YWxpZCBwb3J0ICV1XG4iLCByaHBvcnQpOworCXBkZXZfbnIgPSBwb3J0X3RvX3BkZXZfbnIocG9ydCk7CisJcmhwb3J0ID0gcG9ydF90b19yaHBvcnQocG9ydCk7CisKKwlpZiAoIXZhbGlkX3BvcnQocGRldl9uciwgcmhwb3J0KSkKIAkJcmV0dXJuIC1FSU5WQUw7CisKKwloY2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YSgqKHZoY2lfcGRldnMgKyBwZGV2X25yKSk7CisJaWYgKGhjZCA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAicG9ydCBpcyBub3QgcmVhZHkgJXVcbiIsIHBvcnQpOworCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAKLQllcnIgPSB2aGNpX3BvcnRfZGlzY29ubmVjdChyaHBvcnQpOwotCWlmIChlcnIgPCAwKQorCXJldCA9IHZoY2lfcG9ydF9kaXNjb25uZWN0KGhjZF90b192aGNpKGhjZCksIHJocG9ydCk7CisJaWYgKHJldCA8IDApCiAJCXJldHVybiAtRUlOVkFMOwogCiAJdXNiaXBfZGJnX3ZoY2lfc3lzZnMoIkxlYXZlXG4iKTsKQEAgLTEzNSwxNiArMjIyLDEyIEBACiB9CiBzdGF0aWMgREVWSUNFX0FUVFIoZGV0YWNoLCBTX0lXVVNSLCBOVUxMLCBzdG9yZV9kZXRhY2gpOwogCi0vKiBTeXNmcyBlbnRyeSB0byBlc3RhYmxpc2ggYSB2aXJ0dWFsIGNvbm5lY3Rpb24gKi8KLXN0YXRpYyBpbnQgdmFsaWRfYXJncyhfX3UzMiByaHBvcnQsIGVudW0gdXNiX2RldmljZV9zcGVlZCBzcGVlZCkKK3N0YXRpYyBpbnQgdmFsaWRfYXJncyhfX3UzMiBwZGV2X25yLCBfX3UzMiByaHBvcnQsIGVudW0gdXNiX2RldmljZV9zcGVlZCBzcGVlZCkKIHsKLQkvKiBjaGVjayByaHBvcnQgKi8KLQlpZiAocmhwb3J0ID49IFZIQ0lfTlBPUlRTKSB7Ci0JCXByX2VycigicG9ydCAldVxuIiwgcmhwb3J0KTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCF2YWxpZF9wb3J0KHBkZXZfbnIsIHJocG9ydCkpIHsKKwkJcmV0dXJuIDA7CiAJfQogCi0JLyogY2hlY2sgc3BlZWQgKi8KIAlzd2l0Y2ggKHNwZWVkKSB7CiAJY2FzZSBVU0JfU1BFRURfTE9XOgogCWNhc2UgVVNCX1NQRUVEX0ZVTEw6CkBAIC0xNTQsMTIgKzIzNywxMyBAQAogCWRlZmF1bHQ6CiAJCXByX2VycigiRmFpbGVkIGF0dGFjaCByZXF1ZXN0IGZvciB1bnN1cHBvcnRlZCBVU0Igc3BlZWQ6ICVzXG4iLAogCQkJdXNiX3NwZWVkX3N0cmluZyhzcGVlZCkpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIDA7CiAJfQogCi0JcmV0dXJuIDA7CisJcmV0dXJuIDE7CiB9CiAKKy8qIFN5c2ZzIGVudHJ5IHRvIGVzdGFibGlzaCBhIHZpcnR1YWwgY29ubmVjdGlvbiAqLwogLyoKICAqIFRvIHN0YXJ0IGEgbmV3IFVTQi9JUCBhdHRhY2htZW50LCBhIHVzZXJsYW5kIHByb2dyYW0gbmVlZHMgdG8gc2V0dXAgYSBUQ1AKICAqIGNvbm5lY3Rpb24gYW5kIHRoZW4gd3JpdGUgaXRzIHNvY2tldCBkZXNjcmlwdG9yIHdpdGggcmVtb3RlIGRldmljZQpAQCAtMTc0LDEwICsyNTgsMTIgQEAKIHN0YXRpYyBzc2l6ZV90IHN0b3JlX2F0dGFjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCB2aGNpX2RldmljZSAqdmRldjsKIAlzdHJ1Y3Qgc29ja2V0ICpzb2NrZXQ7CiAJaW50IHNvY2tmZCA9IDA7Ci0JX191MzIgcmhwb3J0ID0gMCwgZGV2aWQgPSAwLCBzcGVlZCA9IDA7CisJX191MzIgcG9ydCA9IDAsIHBkZXZfbnIgPSAwLCByaHBvcnQgPSAwLCBkZXZpZCA9IDAsIHNwZWVkID0gMDsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkOworCXN0cnVjdCB2aGNpX2hjZCAqdmhjaTsKKwlzdHJ1Y3QgdmhjaV9kZXZpY2UgKnZkZXY7CiAJaW50IGVycjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0xODcsMTYgKzI3MywyOCBAQAogCSAqIEBkZXZpZDogdW5pcXVlIGRldmljZSBpZGVudGlmaWVyIGluIGEgcmVtb3RlIGhvc3QKIAkgKiBAc3BlZWQ6IHVzYiBkZXZpY2Ugc3BlZWQgaW4gYSByZW1vdGUgaG9zdAogCSAqLwotCWlmIChzc2NhbmYoYnVmLCAiJXUgJXUgJXUgJXUiLCAmcmhwb3J0LCAmc29ja2ZkLCAmZGV2aWQsICZzcGVlZCkgIT0gNCkKKwlpZiAoc3NjYW5mKGJ1ZiwgIiV1ICV1ICV1ICV1IiwgJnBvcnQsICZzb2NrZmQsICZkZXZpZCwgJnNwZWVkKSAhPSA0KQogCQlyZXR1cm4gLUVJTlZBTDsKKwlwZGV2X25yID0gcG9ydF90b19wZGV2X25yKHBvcnQpOworCXJocG9ydCA9IHBvcnRfdG9fcmhwb3J0KHBvcnQpOwogCi0JdXNiaXBfZGJnX3ZoY2lfc3lzZnMoInJocG9ydCgldSkgc29ja2ZkKCV1KSBkZXZpZCgldSkgc3BlZWQoJXUpXG4iLAotCQkJICAgICByaHBvcnQsIHNvY2tmZCwgZGV2aWQsIHNwZWVkKTsKKwl1c2JpcF9kYmdfdmhjaV9zeXNmcygicG9ydCgldSkgcGRldiglZCkgcmhwb3J0KCV1KVxuIiwKKwkJCSAgICAgcG9ydCwgcGRldl9uciwgcmhwb3J0KTsKKwl1c2JpcF9kYmdfdmhjaV9zeXNmcygic29ja2ZkKCV1KSBkZXZpZCgldSkgc3BlZWQoJXUpXG4iLAorCQkJICAgICBzb2NrZmQsIGRldmlkLCBzcGVlZCk7CiAKIAkvKiBjaGVjayByZWNlaXZlZCBwYXJhbWV0ZXJzICovCi0JaWYgKHZhbGlkX2FyZ3Mocmhwb3J0LCBzcGVlZCkgPCAwKQorCWlmICghdmFsaWRfYXJncyhwZGV2X25yLCByaHBvcnQsIHNwZWVkKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwloY2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YSgqKHZoY2lfcGRldnMgKyBwZGV2X25yKSk7CisJaWYgKGhjZCA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAicG9ydCAlZCBpcyBub3QgcmVhZHlcbiIsIHBvcnQpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJdmhjaSA9IGhjZF90b192aGNpKGhjZCk7CisJdmRldiA9ICZ2aGNpLT52ZGV2W3JocG9ydF07CisKIAkvKiBFeHRyYWN0IHNvY2tldCBmcm9tIGZkLiAqLwogCXNvY2tldCA9IHNvY2tmZF9sb29rdXAoc29ja2ZkLCAmZXJyKTsKIAlpZiAoIXNvY2tldCkKQEAgLTIwNSwxNCArMzAzLDEzIEBACiAJLyogbm93IG5lZWQgbG9jayB1bnRpbCBzZXR0aW5nIHZkZXYgc3RhdHVzIGFzIHVzZWQgKi8KIAogCS8qIGJlZ2luIGEgbG9jayAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOwotCXZkZXYgPSBwb3J0X3RvX3ZkZXYocmhwb3J0KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmhjaS0+bG9jaywgZmxhZ3MpOwogCXNwaW5fbG9jaygmdmRldi0+dWQubG9jayk7CiAKIAlpZiAodmRldi0+dWQuc3RhdHVzICE9IFZERVZfU1RfTlVMTCkgewogCQkvKiBlbmQgb2YgdGhlIGxvY2sgKi8KIAkJc3Bpbl91bmxvY2soJnZkZXYtPnVkLmxvY2spOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aGNpLT5sb2NrLCBmbGFncyk7CiAKIAkJc29ja2ZkX3B1dChzb2NrZXQpOwogCkBAIC0yMjAsOSArMzE3LDEwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWRldl9pbmZvKGRldiwKLQkJICJyaHBvcnQoJXUpIHNvY2tmZCglZCkgZGV2aWQoJXUpIHNwZWVkKCV1KSBzcGVlZF9zdHIoJXMpXG4iLAotCQkgcmhwb3J0LCBzb2NrZmQsIGRldmlkLCBzcGVlZCwgdXNiX3NwZWVkX3N0cmluZyhzcGVlZCkpOworCWRldl9pbmZvKGRldiwgInBkZXYoJXUpIHJocG9ydCgldSkgc29ja2ZkKCVkKVxuIiwKKwkJIHBkZXZfbnIsIHJocG9ydCwgc29ja2ZkKTsKKwlkZXZfaW5mbyhkZXYsICJkZXZpZCgldSkgc3BlZWQoJXUpIHNwZWVkX3N0ciglcylcbiIsCisJCSBkZXZpZCwgc3BlZWQsIHVzYl9zcGVlZF9zdHJpbmcoc3BlZWQpKTsKIAogCXZkZXYtPmRldmlkICAgICAgICAgPSBkZXZpZDsKIAl2ZGV2LT5zcGVlZCAgICAgICAgID0gc3BlZWQ7CkBAIC0yMzAsMjYgKzMyOCw5MiBAQAogCXZkZXYtPnVkLnN0YXR1cyAgICAgPSBWREVWX1NUX05PVEFTU0lHTkVEOwogCiAJc3Bpbl91bmxvY2soJnZkZXYtPnVkLmxvY2spOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmhjaS0+bG9jaywgZmxhZ3MpOwogCS8qIGVuZCB0aGUgbG9jayAqLwogCiAJdmRldi0+dWQudGNwX3J4ID0ga3RocmVhZF9nZXRfcnVuKHZoY2lfcnhfbG9vcCwgJnZkZXYtPnVkLCAidmhjaV9yeCIpOwogCXZkZXYtPnVkLnRjcF90eCA9IGt0aHJlYWRfZ2V0X3J1bih2aGNpX3R4X2xvb3AsICZ2ZGV2LT51ZCwgInZoY2lfdHgiKTsKIAotCXJoX3BvcnRfY29ubmVjdChyaHBvcnQsIHNwZWVkKTsKKwlyaF9wb3J0X2Nvbm5lY3QodmRldiwgc3BlZWQpOwogCiAJcmV0dXJuIGNvdW50OwogfQogc3RhdGljIERFVklDRV9BVFRSKGF0dGFjaCwgU19JV1VTUiwgTlVMTCwgc3RvcmVfYXR0YWNoKTsKIAotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmRldl9hdHRyc1tdID0gewotCSZkZXZfYXR0cl9zdGF0dXMuYXR0ciwKLQkmZGV2X2F0dHJfZGV0YWNoLmF0dHIsCi0JJmRldl9hdHRyX2F0dGFjaC5hdHRyLAotCSZkZXZfYXR0cl91c2JpcF9kZWJ1Zy5hdHRyLAotCU5VTEwsCisjZGVmaW5lIE1BWF9TVEFUVVNfTkFNRSAxNgorCitzdHJ1Y3Qgc3RhdHVzX2F0dHIgeworCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGF0dHI7CisJY2hhciBuYW1lW01BWF9TVEFUVVNfTkFNRSsxXTsKIH07CiAKLWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgZGV2X2F0dHJfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gZGV2X2F0dHJzLAorc3RhdGljIHN0cnVjdCBzdGF0dXNfYXR0ciAqc3RhdHVzX2F0dHJzOworCitzdGF0aWMgdm9pZCBzZXRfc3RhdHVzX2F0dHIoaW50IGlkKQoreworCXN0cnVjdCBzdGF0dXNfYXR0ciAqc3RhdHVzOworCisJc3RhdHVzID0gc3RhdHVzX2F0dHJzICsgaWQ7CisJaWYgKGlkID09IDApCisJCXN0cmNweShzdGF0dXMtPm5hbWUsICJzdGF0dXMiKTsKKwllbHNlCisJCXNucHJpbnRmKHN0YXR1cy0+bmFtZSwgTUFYX1NUQVRVU19OQU1FKzEsICJzdGF0dXMuJWQiLCBpZCk7CisJc3RhdHVzLT5hdHRyLmF0dHIubmFtZSA9IHN0YXR1cy0+bmFtZTsKKwlzdGF0dXMtPmF0dHIuYXR0ci5tb2RlID0gU19JUlVHTzsKKwlzdGF0dXMtPmF0dHIuc2hvdyA9IHN0YXR1c19zaG93OworfQorCitzdGF0aWMgaW50IGluaXRfc3RhdHVzX2F0dHJzKHZvaWQpCit7CisJaW50IGlkOworCisJc3RhdHVzX2F0dHJzID0ga2NhbGxvYyh2aGNpX251bV9jb250cm9sbGVycywgc2l6ZW9mKHN0cnVjdCBzdGF0dXNfYXR0ciksCisJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKHN0YXR1c19hdHRycyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaWQgPSAwOyBpZCA8IHZoY2lfbnVtX2NvbnRyb2xsZXJzOyBpZCsrKQorCQlzZXRfc3RhdHVzX2F0dHIoaWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmlzaF9zdGF0dXNfYXR0cnModm9pZCkKK3sKKwlrZnJlZShzdGF0dXNfYXR0cnMpOworfQorCitzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHZoY2lfYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSBOVUxMLAogfTsKKworaW50IHZoY2lfaW5pdF9hdHRyX2dyb3VwKHZvaWQpCit7CisJc3RydWN0IGF0dHJpYnV0ZSAqKmF0dHJzOworCWludCByZXQsIGk7CisKKwlhdHRycyA9IGtjYWxsb2MoKHZoY2lfbnVtX2NvbnRyb2xsZXJzICsgNSksIHNpemVvZihzdHJ1Y3QgYXR0cmlidXRlICopLAorCQkJR0ZQX0tFUk5FTCk7CisJaWYgKGF0dHJzID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gaW5pdF9zdGF0dXNfYXR0cnMoKTsKKwlpZiAocmV0KSB7CisJCWtmcmVlKGF0dHJzKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJKmF0dHJzID0gJmRldl9hdHRyX25wb3J0cy5hdHRyOworCSooYXR0cnMgKyAxKSA9ICZkZXZfYXR0cl9kZXRhY2guYXR0cjsKKwkqKGF0dHJzICsgMikgPSAmZGV2X2F0dHJfYXR0YWNoLmF0dHI7CisJKihhdHRycyArIDMpID0gJmRldl9hdHRyX3VzYmlwX2RlYnVnLmF0dHI7CisJZm9yIChpID0gMDsgaSA8IHZoY2lfbnVtX2NvbnRyb2xsZXJzOyBpKyspCisJCSooYXR0cnMgKyBpICsgNCkgPSAmKChzdGF0dXNfYXR0cnMgKyBpKS0+YXR0ci5hdHRyKTsKKwl2aGNpX2F0dHJfZ3JvdXAuYXR0cnMgPSBhdHRyczsKKwlyZXR1cm4gMDsKK30KKwordm9pZCB2aGNpX2ZpbmlzaF9hdHRyX2dyb3VwKHZvaWQpCit7CisJZmluaXNoX3N0YXR1c19hdHRycygpOworCWtmcmVlKHZoY2lfYXR0cl9ncm91cC5hdHRycyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi91c2JpcC92dWRjX2Rldi5jIGIvZHJpdmVycy91c2IvdXNiaXAvdnVkY19kZXYuYwppbmRleCA4OTk0YTEzLi43MDkxODQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi91c2JpcC92dWRjX2Rldi5jCisrKyBiL2RyaXZlcnMvdXNiL3VzYmlwL3Z1ZGNfZGV2LmMKQEAgLTQ1MCw3ICs0NTAsNyBAQAogCWlmICh1ZC0+dGNwX3NvY2tldCkKIAkJa2VybmVsX3NvY2tfc2h1dGRvd24odWQtPnRjcF9zb2NrZXQsIFNIVVRfUkRXUik7CiAKLQlpZiAodWQtPnRjcF90eCkgeworCWlmICh1ZC0+dGNwX3J4KSB7CiAJCWt0aHJlYWRfc3RvcF9wdXQodWQtPnRjcF9yeCk7CiAJCXVkLT50Y3BfcnggPSBOVUxMOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3VzYmlwL3Z1ZGNfcnguYyBiL2RyaXZlcnMvdXNiL3VzYmlwL3Z1ZGNfcnguYwppbmRleCAzNDRiZDk0Li5lNDI5YjU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi91c2JpcC92dWRjX3J4LmMKKysrIGIvZHJpdmVycy91c2IvdXNiaXAvdnVkY19yeC5jCkBAIC0xNDIsNyArMTQyLDcgQEAKIAl1cmJfcC0+dXJiLT5zdGF0dXMgPSAtRUlOUFJPR1JFU1M7CiAKIAkvKiBGSVhNRTogbW9yZSBwaXBlIHNldHVwIHRvIHBsZWFzZSB1c2JpcF9jb21tb24gKi8KLQl1cmJfcC0+dXJiLT5waXBlICY9IH4oMTEgPDwgMzApOworCXVyYl9wLT51cmItPnBpcGUgJj0gfigzIDw8IDMwKTsKIAlzd2l0Y2ggKHVyYl9wLT5lcC0+dHlwZSkgewogCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfQlVMSzoKIAkJdXJiX3AtPnVyYi0+cGlwZSB8PSAoUElQRV9CVUxLIDw8IDMwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL2NiYWYuYyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL2NiYWYuYwppbmRleCBkYTFiODcyLi5mYjcwY2JlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivd3VzYmNvcmUvY2JhZi5jCisrKyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL2NiYWYuYwpAQCAtNjEwLDggKzYxMCw3IEBACiAJY2JhZi0+dXNiX2lmYWNlID0gdXNiX2dldF9pbnRmKGlmYWNlKTsKIAlyZXN1bHQgPSBjYmFmX2NoZWNrKGNiYWYpOwogCWlmIChyZXN1bHQgPCAwKSB7Ci0JCWRldl9lcnIoZGV2LCAiVGhpcyBkZXZpY2UgaXMgbm90IFdVU0ItQ0JBRiBjb21wbGlhbnQiCi0JCQkiYW5kIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LlxuIik7CisJCWRldl9lcnIoZGV2LCAiVGhpcyBkZXZpY2UgaXMgbm90IFdVU0ItQ0JBRiBjb21wbGlhbnQgYW5kIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LlxuIik7CiAJCWdvdG8gZXJyb3JfY2hlY2s7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi93dXNiY29yZS9jcnlwdG8uYyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL2NyeXB0by5jCmluZGV4IDMzYWNkMTUuLjc5YjJiNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL2NyeXB0by5jCisrKyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL2NyeXB0by5jCkBAIC0yMjksMTAgKzIyOSw4IEBACiAJCXplcm9fcGFkZGluZyA9IHNpemVvZihzdHJ1Y3QgYWVzX2NjbV9ibG9jaykgLSB6ZXJvX3BhZGRpbmc7CiAJZHN0X3NpemUgPSBibGVuICsgc2l6ZW9mKGIwKSArIHNpemVvZihiMSkgKyB6ZXJvX3BhZGRpbmc7CiAJZHN0X2J1ZiA9IGt6YWxsb2MoZHN0X3NpemUsIEdGUF9LRVJORUwpOwotCWlmIChkc3RfYnVmID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFOiBjYW4ndCBhbGxvYyBkZXN0aW5hdGlvbiBidWZmZXJcbiIpOworCWlmICghZHN0X2J1ZikKIAkJZ290byBlcnJvcl9kc3RfYnVmOwotCX0KIAogCW1lbXNldChpdiwgMCwgc2l6ZW9mKGl2KSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3NlY3VyaXR5LmMgYi9kcml2ZXJzL3VzYi93dXNiY29yZS9zZWN1cml0eS5jCmluZGV4IGI2NmZhYWYuLjhjOTQyMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3NlY3VyaXR5LmMKKysrIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvc2VjdXJpdHkuYwpAQCAtMzc0LDEwICszNzQsOCBAQAogCXN0cnVjdCB3dXNiX2tleWR2dF9vdXQga2V5ZHZ0X291dDsKIAogCWhzID0ga2NhbGxvYygzLCBzaXplb2YoaHNbMF0pLCBHRlBfS0VSTkVMKTsKLQlpZiAoaHMgPT0gTlVMTCkgewotCQlkZXZfZXJyKGRldiwgImNhbid0IGFsbG9jYXRlIGhhbmRzaGFrZSBkYXRhXG4iKTsKKwlpZiAoIWhzKQogCQlnb3RvIGVycm9yX2t6YWxsb2M7Ci0JfQogCiAJLyogV2UgbmVlZCB0byB0dXJuIGVuY3J5cHRpb24gYmVmb3JlIGJlZ2lubmluZyB0aGUgNHdheQogCSAqIGhzaGFrZSAoV1VTQjEuMFsuMy4yLjJdKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivd3VzYmNvcmUvd2EtbmVwLmMgYi9kcml2ZXJzL3VzYi93dXNiY29yZS93YS1uZXAuYwppbmRleCA2MGExMGQyLi5lZDQ2MjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS1uZXAuYworKysgYi9kcml2ZXJzL3VzYi93dXNiY29yZS93YS1uZXAuYwpAQCAtMjcxLDE2ICsyNzEsMTEgQEAKIAllcGQgPSAmaWZhY2UtPmN1cl9hbHRzZXR0aW5nLT5lbmRwb2ludFswXS5kZXNjOwogCXdhLT5uZXBfYnVmZmVyX3NpemUgPSAxMDI0OwogCXdhLT5uZXBfYnVmZmVyID0ga21hbGxvYyh3YS0+bmVwX2J1ZmZlcl9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAod2EtPm5lcF9idWZmZXIgPT0gTlVMTCkgewotCQlkZXZfZXJyKGRldiwKLQkJCSJVbmFibGUgdG8gYWxsb2NhdGUgbm90aWZpY2F0aW9uJ3MgcmVhZCBidWZmZXJcbiIpOworCWlmICghd2EtPm5lcF9idWZmZXIpCiAJCWdvdG8gZXJyb3JfbmVwX2J1ZmZlcjsKLQl9CiAJd2EtPm5lcF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICh3YS0+bmVwX3VyYiA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIG5vdGlmaWNhdGlvbiBVUkJcbiIpOworCWlmICh3YS0+bmVwX3VyYiA9PSBOVUxMKQogCQlnb3RvIGVycm9yX3VyYl9hbGxvYzsKLQl9CiAJdXNiX2ZpbGxfaW50X3VyYih3YS0+bmVwX3VyYiwgdXNiX2RldiwKIAkJCSB1c2JfcmN2aW50cGlwZSh1c2JfZGV2LCBlcGQtPmJFbmRwb2ludEFkZHJlc3MpLAogCQkJIHdhLT5uZXBfYnVmZmVyLCB3YS0+bmVwX2J1ZmZlcl9zaXplLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivd3VzYmNvcmUvd2EteGZlci5jIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvd2EteGZlci5jCmluZGV4IDY5YWY0ZmQuLjE2N2ZjYzcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi93dXNiY29yZS93YS14ZmVyLmMKKysrIGIvZHJpdmVycy91c2Ivd3VzYmNvcmUvd2EteGZlci5jCkBAIC0yODY1LDEwICsyODY1LDggQEAKIAkJZ290byBvdXQ7CiAKIAl3YS0+ZHRpX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHdhLT5kdGlfdXJiID09IE5VTEwpIHsKLQkJZGV2X2VycihkZXYsICJDYW4ndCBhbGxvY2F0ZSBEVEkgVVJCXG4iKTsKKwlpZiAod2EtPmR0aV91cmIgPT0gTlVMTCkKIAkJZ290byBlcnJvcl9kdGlfdXJiX2FsbG9jOwotCX0KIAl1c2JfZmlsbF9idWxrX3VyYigKIAkJd2EtPmR0aV91cmIsIHdhLT51c2JfZGV2LAogCQl1c2JfcmN2YnVsa3BpcGUod2EtPnVzYl9kZXYsIDB4ODAgfCBkdGlfZXBkLT5iRW5kcG9pbnRBZGRyZXNzKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXdiL2h3YS1yYy5jIGIvZHJpdmVycy91d2IvaHdhLXJjLmMKaW5kZXggMDI1N2YzNS4uMGFhNmMzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91d2IvaHdhLXJjLmMKKysrIGIvZHJpdmVycy91d2IvaHdhLXJjLmMKQEAgLTcwMSwxMCArNzAxLDggQEAKIAkJZ290byBlcnJvcl9yZF9idWZmZXI7CiAJfQogCWh3YXJjLT5uZWVwX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGh3YXJjLT5uZWVwX3VyYiA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIG5vdGlmaWNhdGlvbiBVUkJcbiIpOworCWlmIChod2FyYy0+bmVlcF91cmIgPT0gTlVMTCkKIAkJZ290byBlcnJvcl91cmJfYWxsb2M7Ci0JfQogCXVzYl9maWxsX2ludF91cmIoaHdhcmMtPm5lZXBfdXJiLCB1c2JfZGV2LAogCQkJIHVzYl9yY3ZpbnRwaXBlKHVzYl9kZXYsIGVwZC0+YkVuZHBvaW50QWRkcmVzcyksCiAJCQkgaHdhcmMtPnJkX2J1ZmZlciwgUEFHRV9TSVpFLApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aG9zdC9zY3NpLmMgYi9kcml2ZXJzL3Zob3N0L3Njc2kuYwppbmRleCA5ZDYzMjBlLi42ZTI5ZDA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Zob3N0L3Njc2kuYworKysgYi9kcml2ZXJzL3Zob3N0L3Njc2kuYwpAQCAtODgsNyArODgsNyBAQAogCXN0cnVjdCBzY2F0dGVybGlzdCAqdHZjX3Byb3Rfc2dsOwogCXN0cnVjdCBwYWdlICoqdHZjX3VwYWdlczsKIAkvKiBQb2ludGVyIHRvIHJlc3BvbnNlIGhlYWRlciBpb3ZlYyAqLwotCXN0cnVjdCBpb3ZlYyAqdHZjX3Jlc3BfaW92OworCXN0cnVjdCBpb3ZlYyB0dmNfcmVzcF9pb3Y7CiAJLyogUG9pbnRlciB0byB2aG9zdF9zY3NpIGZvciBvdXIgZGV2aWNlICovCiAJc3RydWN0IHZob3N0X3Njc2kgKnR2Y192aG9zdDsKIAkvKiBQb2ludGVyIHRvIHZob3N0X3ZpcnRxdWV1ZSBmb3IgdGhlIGNtZCAqLwpAQCAtNTQ3LDcgKzU0Nyw3IEBACiAJCW1lbWNweSh2X3JzcC5zZW5zZSwgY21kLT50dmNfc2Vuc2VfYnVmLAogCQkgICAgICAgc2VfY21kLT5zY3NpX3NlbnNlX2xlbmd0aCk7CiAKLQkJaW92X2l0ZXJfaW5pdCgmaW92X2l0ZXIsIFJFQUQsIGNtZC0+dHZjX3Jlc3BfaW92LAorCQlpb3ZfaXRlcl9pbml0KCZpb3ZfaXRlciwgUkVBRCwgJmNtZC0+dHZjX3Jlc3BfaW92LAogCQkJICAgICAgY21kLT50dmNfaW5faW92cywgc2l6ZW9mKHZfcnNwKSk7CiAJCXJldCA9IGNvcHlfdG9faXRlcigmdl9yc3AsIHNpemVvZih2X3JzcCksICZpb3ZfaXRlcik7CiAJCWlmIChsaWtlbHkocmV0ID09IHNpemVvZih2X3JzcCkpKSB7CkBAIC0xMDQ0LDcgKzEwNDQsNyBAQAogCQl9CiAJCWNtZC0+dHZjX3Zob3N0ID0gdnM7CiAJCWNtZC0+dHZjX3ZxID0gdnE7Ci0JCWNtZC0+dHZjX3Jlc3BfaW92ID0gJnZxLT5pb3Zbb3V0XTsKKwkJY21kLT50dmNfcmVzcF9pb3YgPSB2cS0+aW92W291dF07CiAJCWNtZC0+dHZjX2luX2lvdnMgPSBpbjsKIAogCQlwcl9kZWJ1Zygidmhvc3Rfc2NzaSBnb3QgY29tbWFuZCBvcGNvZGU6ICUjMDJ4LCBsdW46ICVkXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aG9zdC90ZXN0LmMgYi9kcml2ZXJzL3Zob3N0L3Rlc3QuYwppbmRleCAzODhlZWM0Li4zY2M5OGMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Zob3N0L3Rlc3QuYworKysgYi9kcml2ZXJzL3Zob3N0L3Rlc3QuYwpAQCAtMjIwLDIwICsyMjAsMjAgQEAKIHsKIAl2b2lkICpwcml2ID0gTlVMTDsKIAlsb25nIGVycjsKLQlzdHJ1Y3Qgdmhvc3RfbWVtb3J5ICptZW1vcnk7CisJc3RydWN0IHZob3N0X3VtZW0gKnVtZW07CiAKIAltdXRleF9sb2NrKCZuLT5kZXYubXV0ZXgpOwogCWVyciA9IHZob3N0X2Rldl9jaGVja19vd25lcigmbi0+ZGV2KTsKIAlpZiAoZXJyKQogCQlnb3RvIGRvbmU7Ci0JbWVtb3J5ID0gdmhvc3RfZGV2X3Jlc2V0X293bmVyX3ByZXBhcmUoKTsKLQlpZiAoIW1lbW9yeSkgeworCXVtZW0gPSB2aG9zdF9kZXZfcmVzZXRfb3duZXJfcHJlcGFyZSgpOworCWlmICghdW1lbSkgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGRvbmU7CiAJfQogCXZob3N0X3Rlc3Rfc3RvcChuLCAmcHJpdik7CiAJdmhvc3RfdGVzdF9mbHVzaChuKTsKLQl2aG9zdF9kZXZfcmVzZXRfb3duZXIoJm4tPmRldiwgbWVtb3J5KTsKKwl2aG9zdF9kZXZfcmVzZXRfb3duZXIoJm4tPmRldiwgdW1lbSk7CiBkb25lOgogCW11dGV4X3VubG9jaygmbi0+ZGV2Lm11dGV4KTsKIAlyZXR1cm4gZXJyOwpAQCAtMzIyLDE4ICszMjIsNyBAQAogCSJ2aG9zdC10ZXN0IiwKIAkmdmhvc3RfdGVzdF9mb3BzLAogfTsKLQotc3RhdGljIGludCB2aG9zdF90ZXN0X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gbWlzY19yZWdpc3Rlcigmdmhvc3RfdGVzdF9taXNjKTsKLX0KLW1vZHVsZV9pbml0KHZob3N0X3Rlc3RfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIHZob3N0X3Rlc3RfZXhpdCh2b2lkKQotewotCW1pc2NfZGVyZWdpc3Rlcigmdmhvc3RfdGVzdF9taXNjKTsKLX0KLW1vZHVsZV9leGl0KHZob3N0X3Rlc3RfZXhpdCk7Cittb2R1bGVfbWlzY19kZXZpY2Uodmhvc3RfdGVzdF9taXNjKTsKIAogTU9EVUxFX1ZFUlNJT04oIjAuMC4xIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9wd21fYmwuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3B3bV9ibC5jCmluZGV4IGIyYjM2NmIuLjEyNjE0MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3B3bV9ibC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3B3bV9ibC5jCkBAIC01NSw3ICs1NSw3IEBACiAJCWRldl9lcnIocGItPmRldiwgImZhaWxlZCB0byBlbmFibGUgcG93ZXIgc3VwcGx5XG4iKTsKIAogCWlmIChwYi0+ZW5hYmxlX2dwaW8pCi0JCWdwaW9kX3NldF92YWx1ZShwYi0+ZW5hYmxlX2dwaW8sIDEpOworCQlncGlvZF9zZXRfdmFsdWVfY2Fuc2xlZXAocGItPmVuYWJsZV9ncGlvLCAxKTsKIAogCXB3bV9lbmFibGUocGItPnB3bSk7CiAJcGItPmVuYWJsZWQgPSB0cnVlOwpAQCAtNzAsNyArNzAsNyBAQAogCXB3bV9kaXNhYmxlKHBiLT5wd20pOwogCiAJaWYgKHBiLT5lbmFibGVfZ3BpbykKLQkJZ3Bpb2Rfc2V0X3ZhbHVlKHBiLT5lbmFibGVfZ3BpbywgMCk7CisJCWdwaW9kX3NldF92YWx1ZV9jYW5zbGVlcChwYi0+ZW5hYmxlX2dwaW8sIDApOwogCiAJcmVndWxhdG9yX2Rpc2FibGUocGItPnBvd2VyX3N1cHBseSk7CiAJcGItPmVuYWJsZWQgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3Rvc2FfYmwuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3Rvc2FfYmwuYwppbmRleCA4Mzc0MmQ4Li45NzA2NzU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC90b3NhX2JsLmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvdG9zYV9ibC5jCkBAIC0xNjMsNyArMTYzLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB0b3NhX2JsX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZQkJPSAidG9zYS1ibCIsCi0JCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkJLnBtCQk9ICZ0b3NhX2JsX3BtX29wcywKIAl9LAogCS5wcm9iZQkJPSB0b3NhX2JsX3Byb2JlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aXJ0aW8vdmlydGlvX3JpbmcuYyBiL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19yaW5nLmMKaW5kZXggZTM4M2VjZC4uZWQ5YzllZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aXJ0aW8vdmlydGlvX3JpbmcuYworKysgYi9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fcmluZy5jCkBAIC0xNjcsNyArMTY3LDcgQEAKICAqIG1ha2luZyBhbGwgb2YgdGhlIGFyY2ggRE1BIG9wcyB3b3JrIG9uIHRoZSB2cmluZyBkZXZpY2UgaXRzZWxmCiAgKiBpcyBhIG1lc3MuICBGb3Igbm93LCB3ZSB1c2UgdGhlIHBhcmVudCBkZXZpY2UgZm9yIERNQSBvcHMuCiAgKi8KLXN0cnVjdCBkZXZpY2UgKnZyaW5nX2RtYV9kZXYoY29uc3Qgc3RydWN0IHZyaW5nX3ZpcnRxdWV1ZSAqdnEpCitzdGF0aWMgc3RydWN0IGRldmljZSAqdnJpbmdfZG1hX2Rldihjb25zdCBzdHJ1Y3QgdnJpbmdfdmlydHF1ZXVlICp2cSkKIHsKIAlyZXR1cm4gdnEtPnZxLnZkZXYtPmRldi5wYXJlbnQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZtZS9icmlkZ2VzL0tjb25maWcgYi9kcml2ZXJzL3ZtZS9icmlkZ2VzL0tjb25maWcKaW5kZXggZjZkODU0NS4uZjZkZGMzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy92bWUvYnJpZGdlcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvdm1lL2JyaWRnZXMvS2NvbmZpZwpAQCAtMTMsMyArMTMsMTEgQEAKIAloZWxwCiAJIElmIHlvdSBzYXkgWSBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFR1bmRyYSBUU0kxNDggVk1FIGJyaWRnZQogCSBjaGlwLgorCitjb25maWcgVk1FX0ZBS0UKKwl0cmlzdGF0ZSAiRmFrZSIKKwloZWxwCisJIElmIHlvdSBzYXkgWSBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIGZha2UgVk1FIGJyaWRnZS4gVGhpcworCSBwcm92aWRlcyBhIHZpcnR1YWxpc2VkIFZNRSBCdXMgZm9yIGRldmljZXMgd2l0aCBubyBWTUUgYnJpZGdlLiBUaGlzCisJIGlzIG1haW5seSB1c2VmdWwgZm9yIFZNRSBkZXZlbG9wbWVudCAoaW4gdGhlIGFic2VuY2Ugb2YgVk1FCisJIGhhcmR3YXJlKS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdm1lL2JyaWRnZXMvTWFrZWZpbGUgYi9kcml2ZXJzL3ZtZS9icmlkZ2VzL01ha2VmaWxlCmluZGV4IDU5NjM4YWYuLmIwNzQ1NDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdm1lL2JyaWRnZXMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy92bWUvYnJpZGdlcy9NYWtlZmlsZQpAQCAtMSwyICsxLDMgQEAKIG9iai0kKENPTkZJR19WTUVfQ0E5MUNYNDIpCSs9IHZtZV9jYTkxY3g0Mi5vCiBvYmotJChDT05GSUdfVk1FX1RTSTE0OCkJKz0gdm1lX3RzaTE0OC5vCitvYmotJChDT05GSUdfVk1FX0ZBS0UpCQkrPSB2bWVfZmFrZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZtZS9icmlkZ2VzL3ZtZV9jYTkxY3g0Mi5jIGIvZHJpdmVycy92bWUvYnJpZGdlcy92bWVfY2E5MWN4NDIuYwppbmRleCA5ZjJjODM0Li42YjVlZTg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZtZS9icmlkZ2VzL3ZtZV9jYTkxY3g0Mi5jCisrKyBiL2RyaXZlcnMvdm1lL2JyaWRnZXMvdm1lX2NhOTFjeDQyLmMKQEAgLTQ3LDYgKzQ3LDggQEAKIAl7IH0sCiB9OwogCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgY2E5MWN4NDJfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGNhOTFjeDQyX2RyaXZlciA9IHsKIAkubmFtZSA9IGRyaXZlcl9uYW1lLAogCS5pZF90YWJsZSA9IGNhOTFjeDQyX2lkcywKQEAgLTY5LDcgKzcxLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCWlmIChzdGF0ICYgQ0E5MUNYNDJfTElOVF9MTVtpXSkgewogCQkJLyogV2Ugb25seSBlbmFibGUgaW50ZXJydXB0cyBpZiB0aGUgY2FsbGJhY2sgaXMgc2V0ICovCi0JCQlicmlkZ2UtPmxtX2NhbGxiYWNrW2ldKGkpOworCQkJYnJpZGdlLT5sbV9jYWxsYmFja1tpXShicmlkZ2UtPmxtX2RhdGFbaV0pOwogCQkJc2VydmljZWQgfD0gQ0E5MUNYNDJfTElOVF9MTVtpXTsKIAkJfQogCX0KQEAgLTE0MTAsNyArMTQxMiw3IEBACiAgKiBDYWxsYmFjayB3aWxsIGJlIHBhc3NlZCB0aGUgbW9uaXRvciB0cmlnZ2VyZWQuCiAgKi8KIHN0YXRpYyBpbnQgY2E5MWN4NDJfbG1fYXR0YWNoKHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UgKmxtLCBpbnQgbW9uaXRvciwKLQl2b2lkICgqY2FsbGJhY2spKGludCkpCisJdm9pZCAoKmNhbGxiYWNrKSh2b2lkICopLCB2b2lkICpkYXRhKQogewogCXUzMiBsbV9jdGwsIHRtcDsKIAlzdHJ1Y3QgY2E5MWN4NDJfZHJpdmVyICpicmlkZ2U7CkBAIC0xNDM4LDYgKzE0NDAsNyBAQAogCiAJLyogQXR0YWNoIGNhbGxiYWNrICovCiAJYnJpZGdlLT5sbV9jYWxsYmFja1ttb25pdG9yXSA9IGNhbGxiYWNrOworCWJyaWRnZS0+bG1fZGF0YVttb25pdG9yXSA9IGRhdGE7CiAKIAkvKiBFbmFibGUgTG9jYXRpb24gTW9uaXRvciBpbnRlcnJ1cHQgKi8KIAl0bXAgPSBpb3JlYWQzMihicmlkZ2UtPmJhc2UgKyBMSU5UX0VOKTsKQEAgLTE0NzcsNiArMTQ4MCw3IEBACiAKIAkvKiBEZXRhY2ggY2FsbGJhY2sgKi8KIAlicmlkZ2UtPmxtX2NhbGxiYWNrW21vbml0b3JdID0gTlVMTDsKKwlicmlkZ2UtPmxtX2RhdGFbbW9uaXRvcl0gPSBOVUxMOwogCiAJLyogSWYgYWxsIGxvY2F0aW9uIG1vbml0b3JzIGRpc2FibGVkLCBkaXNhYmxlIGdsb2JhbCBMb2NhdGlvbiBNb25pdG9yICovCiAJaWYgKCh0bXAgJiAoQ0E5MUNYNDJfTElOVF9MTTAgfCBDQTkxQ1g0Ml9MSU5UX0xNMSB8IENBOTFDWDQyX0xJTlRfTE0yIHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdm1lL2JyaWRnZXMvdm1lX2NhOTFjeDQyLmggYi9kcml2ZXJzL3ZtZS9icmlkZ2VzL3ZtZV9jYTkxY3g0Mi5oCmluZGV4IGQ1NDExOWUuLmYzNWM5ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdm1lL2JyaWRnZXMvdm1lX2NhOTFjeDQyLmgKKysrIGIvZHJpdmVycy92bWUvYnJpZGdlcy92bWVfY2E5MWN4NDIuaApAQCAtNDMsNyArNDMsOCBAQAogCXdhaXRfcXVldWVfaGVhZF90IGRtYV9xdWV1ZTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBpYWNrX3F1ZXVlOwogCXdhaXRfcXVldWVfaGVhZF90IG1ib3hfcXVldWU7Ci0Jdm9pZCAoKmxtX2NhbGxiYWNrWzRdKShpbnQpOwkvKiBDYWxsZWQgaW4gaW50ZXJydXB0IGhhbmRsZXIgKi8KKwl2b2lkICgqbG1fY2FsbGJhY2tbNF0pKHZvaWQgKik7CS8qIENhbGxlZCBpbiBpbnRlcnJ1cHQgaGFuZGxlciAqLworCXZvaWQgKmxtX2RhdGFbNF07CiAJdm9pZCAqY3Jjc3Jfa2VybmVsOwogCWRtYV9hZGRyX3QgY3Jjc3JfYnVzOwogCXN0cnVjdCBtdXRleCB2bWVfcm13OwkJLyogT25seSBvbmUgUk1XIGN5Y2xlIGF0IGEgdGltZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92bWUvYnJpZGdlcy92bWVfZmFrZS5jIGIvZHJpdmVycy92bWUvYnJpZGdlcy92bWVfZmFrZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYjNhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZtZS9icmlkZ2VzL3ZtZV9mYWtlLmMKQEAgLTAsMCArMSwxMzA2IEBACisvKgorICogRmFrZSBWTUUgYnJpZGdlIHN1cHBvcnQuCisgKgorICogVGhpcyBkcml2ZSBwcm92aWRlcyBhIGZha2UgVk1FIGJyaWRnZSBjaGlwLCB0aGlzIGVuYWJsZXMgZGVidWdnaW5nIG9mIHRoZQorICogVk1FIGZyYW1ld29yayBpbiB0aGUgYWJzZW5jZSBvZiBhIFZNRSBzeXN0ZW0uCisgKgorICogVGhpcyBkcml2ZXIgaGFzIHRvIGRvIGEgbnVtYmVyIG9mIHRoaW5ncyBpbiBzb2Z0d2FyZSB0aGF0IHdvdWxkIGJlIGRyaXZlbgorICogYnkgaGFyZHdhcmUgaWYgaXQgd2FzIGF2YWlsYWJsZSwgaXQgd2lsbCBhbHNvIHJlc3VsdCBpbiBleHRyYSBvdmVyaGVhZCBhdAorICogdGltZXMgd2hlbiBjb21wYXJlZCB3aXRoIGRyaXZpbmcgYWN0dWFsIGhhcmR3YXJlLgorICoKKyAqIEF1dGhvcjogTWFydHluIFdlbGNoIDxtYXJ0eW5Ad2VsY2hlcy5tZS51az4KKyAqIENvcHlyaWdodCAoYykgMjAxNCBNYXJ0eW4gV2VsY2gKKyAqCisgKiBCYXNlZCBvbiB2bWVfdHNpMTQ4LmM6CisgKgorICogQXV0aG9yOiBNYXJ0eW4gV2VsY2ggPG1hcnR5bi53ZWxjaEBnZS5jb20+CisgKiBDb3B5cmlnaHQgMjAwOCBHRSBJbnRlbGxpZ2VudCBQbGF0Zm9ybXMgRW1iZWRkZWQgU3lzdGVtcywgSW5jLgorICoKKyAqIEJhc2VkIG9uIHdvcmsgYnkgVG9tIEFybWlzdGVhZCBhbmQgQWppdCBQcmVtCisgKiBDb3B5cmlnaHQgMjAwNCBNb3Rvcm9sYSBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdm1lLmg+CisKKyNpbmNsdWRlICIuLi92bWVfYnJpZGdlLmgiCisKKy8qCisgKiAgRGVmaW5lIHRoZSBudW1iZXIgb2YgZWFjaCB0aGF0IHRoZSBmYWtlIGRyaXZlciBzdXBwb3J0cy4KKyAqLworI2RlZmluZSBGQUtFX01BWF9NQVNURVIJCTgJLyogTWF4IE1hc3RlciBXaW5kb3dzICovCisjZGVmaW5lIEZBS0VfTUFYX1NMQVZFCQk4CS8qIE1heCBTbGF2ZSBXaW5kb3dzICovCisKKy8qIFN0cnVjdHVyZXMgdG8gaG9sZCBpbmZvcm1hdGlvbiBub3JtYWxseSBoZWxkIGluIGRldmljZSByZWdpc3RlcnMgKi8KK3N0cnVjdCBmYWtlX3NsYXZlX3dpbmRvdyB7CisJaW50IGVuYWJsZWQ7CisJdW5zaWduZWQgbG9uZyBsb25nIHZtZV9iYXNlOworCXVuc2lnbmVkIGxvbmcgbG9uZyBzaXplOworCXZvaWQgKmJ1Zl9iYXNlOworCXUzMiBhc3BhY2U7CisJdTMyIGN5Y2xlOworfTsKKworc3RydWN0IGZha2VfbWFzdGVyX3dpbmRvdyB7CisJaW50IGVuYWJsZWQ7CisJdW5zaWduZWQgbG9uZyBsb25nIHZtZV9iYXNlOworCXVuc2lnbmVkIGxvbmcgbG9uZyBzaXplOworCXUzMiBhc3BhY2U7CisJdTMyIGN5Y2xlOworCXUzMiBkd2lkdGg7Cit9OworCisvKiBTdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGRyaXZlciBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLworc3RydWN0IGZha2VfZHJpdmVyIHsKKwlzdHJ1Y3Qgdm1lX2JyaWRnZSAqcGFyZW50OworCXN0cnVjdCBmYWtlX3NsYXZlX3dpbmRvdyBzbGF2ZXNbRkFLRV9NQVhfU0xBVkVdOworCXN0cnVjdCBmYWtlX21hc3Rlcl93aW5kb3cgbWFzdGVyc1tGQUtFX01BWF9NQVNURVJdOworCXUzMiBsbV9lbmFibGVkOworCXVuc2lnbmVkIGxvbmcgbG9uZyBsbV9iYXNlOworCXUzMiBsbV9hc3BhY2U7CisJdTMyIGxtX2N5Y2xlOworCXZvaWQgKCpsbV9jYWxsYmFja1s0XSkodm9pZCAqKTsKKwl2b2lkICpsbV9kYXRhWzRdOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBpbnRfdGFza2xldDsKKwlpbnQgaW50X2xldmVsOworCWludCBpbnRfc3RhdGlkOworCXZvaWQgKmNyY3NyX2tlcm5lbDsKKwlkbWFfYWRkcl90IGNyY3NyX2J1czsKKwkvKiBPbmx5IG9uZSBWTUUgaW50ZXJydXB0IGNhbiBiZSBnZW5lcmF0ZWQgYXQgYSB0aW1lLCBwcm92aWRlIGxvY2tpbmcgKi8KKwlzdHJ1Y3QgbXV0ZXggdm1lX2ludDsKK307CisKKy8qIE1vZHVsZSBwYXJhbWV0ZXIgKi8KK3N0YXRpYyBpbnQgZ2VvaWQ7CisKK3N0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl9uYW1lW10gPSAidm1lX2Zha2UiOworCitzdGF0aWMgc3RydWN0IHZtZV9icmlkZ2UgKmV4aXRfcG9pbnRlcjsKKworc3RhdGljIHN0cnVjdCBkZXZpY2UgKnZtZV9yb290OworCisvKgorICogQ2FsbGluZyBWTUUgYnVzIGludGVycnVwdCBjYWxsYmFjayBpZiBwcm92aWRlZC4KKyAqLworc3RhdGljIHZvaWQgZmFrZV9WSVJRX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCB2bWVfYnJpZGdlICpmYWtlX2JyaWRnZTsKKwlzdHJ1Y3QgZmFrZV9kcml2ZXIgKmJyaWRnZTsKKworCWZha2VfYnJpZGdlID0gKHN0cnVjdCB2bWVfYnJpZGdlICopIGRhdGE7CisJYnJpZGdlID0gZmFrZV9icmlkZ2UtPmRyaXZlcl9wcml2OworCisJdm1lX2lycV9oYW5kbGVyKGZha2VfYnJpZGdlLCBicmlkZ2UtPmludF9sZXZlbCwgYnJpZGdlLT5pbnRfc3RhdGlkKTsKK30KKworLyoKKyAqIENvbmZpZ3VyZSBWTUUgaW50ZXJydXB0CisgKi8KK3N0YXRpYyB2b2lkIGZha2VfaXJxX3NldChzdHJ1Y3Qgdm1lX2JyaWRnZSAqZmFrZV9icmlkZ2UsIGludCBsZXZlbCwKKwkJaW50IHN0YXRlLCBpbnQgc3luYykKK3sKKwkvKiBOb3RoaW5nIHRvIGRvICovCit9CisKK3N0YXRpYyB2b2lkICpmYWtlX3BjaV90b19wdHIoZG1hX2FkZHJfdCBhZGRyKQoreworCXJldHVybiAodm9pZCAqKSh1aW50cHRyX3QpYWRkcjsKK30KKworc3RhdGljIGRtYV9hZGRyX3QgZmFrZV9wdHJfdG9fcGNpKHZvaWQgKmFkZHIpCit7CisJcmV0dXJuIChkbWFfYWRkcl90KSh1aW50cHRyX3QpYWRkcjsKK30KKworLyoKKyAqIEdlbmVyYXRlIGEgVk1FIGJ1cyBpbnRlcnJ1cHQgYXQgdGhlIHJlcXVlc3RlZCBsZXZlbCAmIHZlY3Rvci4gV2FpdCBmb3IKKyAqIGludGVycnVwdCB0byBiZSBhY2tlZC4KKyAqLworc3RhdGljIGludCBmYWtlX2lycV9nZW5lcmF0ZShzdHJ1Y3Qgdm1lX2JyaWRnZSAqZmFrZV9icmlkZ2UsIGludCBsZXZlbCwKKwkJaW50IHN0YXRpZCkKK3sKKwlzdHJ1Y3QgZmFrZV9kcml2ZXIgKmJyaWRnZTsKKworCWJyaWRnZSA9IGZha2VfYnJpZGdlLT5kcml2ZXJfcHJpdjsKKworCW11dGV4X2xvY2soJmJyaWRnZS0+dm1lX2ludCk7CisKKwlicmlkZ2UtPmludF9sZXZlbCA9IGxldmVsOworCisJYnJpZGdlLT5pbnRfc3RhdGlkID0gc3RhdGlkOworCisJLyoKKwkgKiBTY2hlZHVsZSB0YXNrbGV0IHRvIHJ1biBWTUUgaGFuZGxlciB0byBlbXVsYXRlIG5vcm1hbCBWTUUgaW50ZXJydXB0CisJICogaGFuZGxlciBiZWhhdmlvdXIuCisJICovCisJdGFza2xldF9zY2hlZHVsZSgmYnJpZGdlLT5pbnRfdGFza2xldCk7CisKKwltdXRleF91bmxvY2soJmJyaWRnZS0+dm1lX2ludCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluaXRpYWxpemUgYSBzbGF2ZSB3aW5kb3cgd2l0aCB0aGUgcmVxdWVzdGVkIGF0dHJpYnV0ZXMuCisgKi8KK3N0YXRpYyBpbnQgZmFrZV9zbGF2ZV9zZXQoc3RydWN0IHZtZV9zbGF2ZV9yZXNvdXJjZSAqaW1hZ2UsIGludCBlbmFibGVkLAorCQl1bnNpZ25lZCBsb25nIGxvbmcgdm1lX2Jhc2UsIHVuc2lnbmVkIGxvbmcgbG9uZyBzaXplLAorCQlkbWFfYWRkcl90IGJ1Zl9iYXNlLCB1MzIgYXNwYWNlLCB1MzIgY3ljbGUpCit7CisJdW5zaWduZWQgaW50IGksIGdyYW51bGFyaXR5ID0gMDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdm1lX2JvdW5kOworCXN0cnVjdCB2bWVfYnJpZGdlICpmYWtlX2JyaWRnZTsKKwlzdHJ1Y3QgZmFrZV9kcml2ZXIgKmJyaWRnZTsKKworCWZha2VfYnJpZGdlID0gaW1hZ2UtPnBhcmVudDsKKwlicmlkZ2UgPSBmYWtlX2JyaWRnZS0+ZHJpdmVyX3ByaXY7CisKKwlpID0gaW1hZ2UtPm51bWJlcjsKKworCXN3aXRjaCAoYXNwYWNlKSB7CisJY2FzZSBWTUVfQTE2OgorCQlncmFudWxhcml0eSA9IDB4MTA7CisJCWJyZWFrOworCWNhc2UgVk1FX0EyNDoKKwkJZ3JhbnVsYXJpdHkgPSAweDEwMDA7CisJCWJyZWFrOworCWNhc2UgVk1FX0EzMjoKKwkJZ3JhbnVsYXJpdHkgPSAweDEwMDAwOworCQlicmVhazsKKwljYXNlIFZNRV9BNjQ6CisJCWdyYW51bGFyaXR5ID0gMHgxMDAwMDsKKwkJYnJlYWs7CisJY2FzZSBWTUVfQ1JDU1I6CisJY2FzZSBWTUVfVVNFUjE6CisJY2FzZSBWTUVfVVNFUjI6CisJY2FzZSBWTUVfVVNFUjM6CisJY2FzZSBWTUVfVVNFUjQ6CisJZGVmYXVsdDoKKwkJcHJfZXJyKCJJbnZhbGlkIGFkZHJlc3Mgc3BhY2VcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIEJvdW5kIGFkZHJlc3MgaXMgYSB2YWxpZCBhZGRyZXNzIGZvciB0aGUgd2luZG93LCBhZGp1c3QKKwkgKiBhY2NvcmRpbmdseQorCSAqLworCXZtZV9ib3VuZCA9IHZtZV9iYXNlICsgc2l6ZSAtIGdyYW51bGFyaXR5OworCisJaWYgKHZtZV9iYXNlICYgKGdyYW51bGFyaXR5IC0gMSkpIHsKKwkJcHJfZXJyKCJJbnZhbGlkIFZNRSBiYXNlIGFsaWdubWVudFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAodm1lX2JvdW5kICYgKGdyYW51bGFyaXR5IC0gMSkpIHsKKwkJcHJfZXJyKCJJbnZhbGlkIFZNRSBib3VuZCBhbGlnbm1lbnRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltdXRleF9sb2NrKCZpbWFnZS0+bXR4KTsKKworCWJyaWRnZS0+c2xhdmVzW2ldLmVuYWJsZWQgPSBlbmFibGVkOworCWJyaWRnZS0+c2xhdmVzW2ldLnZtZV9iYXNlID0gdm1lX2Jhc2U7CisJYnJpZGdlLT5zbGF2ZXNbaV0uc2l6ZSA9IHNpemU7CisJYnJpZGdlLT5zbGF2ZXNbaV0uYnVmX2Jhc2UgPSBmYWtlX3BjaV90b19wdHIoYnVmX2Jhc2UpOworCWJyaWRnZS0+c2xhdmVzW2ldLmFzcGFjZSA9IGFzcGFjZTsKKwlicmlkZ2UtPnNsYXZlc1tpXS5jeWNsZSA9IGN5Y2xlOworCisJbXV0ZXhfdW5sb2NrKCZpbWFnZS0+bXR4KTsKKworCXJldHVybiAwOworfQorCisvKgorICogR2V0IHNsYXZlIHdpbmRvdyBjb25maWd1cmF0aW9uLgorICovCitzdGF0aWMgaW50IGZha2Vfc2xhdmVfZ2V0KHN0cnVjdCB2bWVfc2xhdmVfcmVzb3VyY2UgKmltYWdlLCBpbnQgKmVuYWJsZWQsCisJCXVuc2lnbmVkIGxvbmcgbG9uZyAqdm1lX2Jhc2UsIHVuc2lnbmVkIGxvbmcgbG9uZyAqc2l6ZSwKKwkJZG1hX2FkZHJfdCAqYnVmX2Jhc2UsIHUzMiAqYXNwYWNlLCB1MzIgKmN5Y2xlKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBmYWtlX2RyaXZlciAqYnJpZGdlOworCisJYnJpZGdlID0gaW1hZ2UtPnBhcmVudC0+ZHJpdmVyX3ByaXY7CisKKwlpID0gaW1hZ2UtPm51bWJlcjsKKworCW11dGV4X2xvY2soJmltYWdlLT5tdHgpOworCisJKmVuYWJsZWQgPSBicmlkZ2UtPnNsYXZlc1tpXS5lbmFibGVkOworCSp2bWVfYmFzZSA9IGJyaWRnZS0+c2xhdmVzW2ldLnZtZV9iYXNlOworCSpzaXplID0gYnJpZGdlLT5zbGF2ZXNbaV0uc2l6ZTsKKwkqYnVmX2Jhc2UgPSBmYWtlX3B0cl90b19wY2koYnJpZGdlLT5zbGF2ZXNbaV0uYnVmX2Jhc2UpOworCSphc3BhY2UgPSBicmlkZ2UtPnNsYXZlc1tpXS5hc3BhY2U7CisJKmN5Y2xlID0gYnJpZGdlLT5zbGF2ZXNbaV0uY3ljbGU7CisKKwltdXRleF91bmxvY2soJmltYWdlLT5tdHgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZXQgdGhlIGF0dHJpYnV0ZXMgb2YgYW4gb3V0Ym91bmQgd2luZG93LgorICovCitzdGF0aWMgaW50IGZha2VfbWFzdGVyX3NldChzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqaW1hZ2UsIGludCBlbmFibGVkLAorCQl1bnNpZ25lZCBsb25nIGxvbmcgdm1lX2Jhc2UsIHVuc2lnbmVkIGxvbmcgbG9uZyBzaXplLAorCQl1MzIgYXNwYWNlLCB1MzIgY3ljbGUsIHUzMiBkd2lkdGgpCit7CisJaW50IHJldHZhbCA9IDA7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IHZtZV9icmlkZ2UgKmZha2VfYnJpZGdlOworCXN0cnVjdCBmYWtlX2RyaXZlciAqYnJpZGdlOworCisJZmFrZV9icmlkZ2UgPSBpbWFnZS0+cGFyZW50OworCisJYnJpZGdlID0gZmFrZV9icmlkZ2UtPmRyaXZlcl9wcml2OworCisJLyogVmVyaWZ5IGlucHV0IGRhdGEgKi8KKwlpZiAodm1lX2Jhc2UgJiAweEZGRkYpIHsKKwkJcHJfZXJyKCJJbnZhbGlkIFZNRSBXaW5kb3cgYWxpZ25tZW50XG4iKTsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBlcnJfd2luZG93OworCX0KKworCWlmIChzaXplICYgMHhGRkZGKSB7CisJCXByX2VycigiSW52YWxpZCBzaXplIGFsaWdubWVudFxuIik7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3dpbmRvdzsKKwl9CisKKwlpZiAoKHNpemUgPT0gMCkgJiYgKGVuYWJsZWQgIT0gMCkpIHsKKwkJcHJfZXJyKCJTaXplIG11c3QgYmUgbm9uLXplcm8gZm9yIGVuYWJsZWQgd2luZG93c1xuIik7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3dpbmRvdzsKKwl9CisKKwkvKiBTZXR1cCBkYXRhIHdpZHRoICovCisJc3dpdGNoIChkd2lkdGgpIHsKKwljYXNlIFZNRV9EODoKKwljYXNlIFZNRV9EMTY6CisJY2FzZSBWTUVfRDMyOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIkludmFsaWQgZGF0YSB3aWR0aFxuIik7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2R3aWR0aDsKKwl9CisKKwkvKiBTZXR1cCBhZGRyZXNzIHNwYWNlICovCisJc3dpdGNoIChhc3BhY2UpIHsKKwljYXNlIFZNRV9BMTY6CisJY2FzZSBWTUVfQTI0OgorCWNhc2UgVk1FX0EzMjoKKwljYXNlIFZNRV9BNjQ6CisJY2FzZSBWTUVfQ1JDU1I6CisJY2FzZSBWTUVfVVNFUjE6CisJY2FzZSBWTUVfVVNFUjI6CisJY2FzZSBWTUVfVVNFUjM6CisJY2FzZSBWTUVfVVNFUjQ6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiSW52YWxpZCBhZGRyZXNzIHNwYWNlXG4iKTsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBlcnJfYXNwYWNlOworCX0KKworCXNwaW5fbG9jaygmaW1hZ2UtPmxvY2spOworCisJaSA9IGltYWdlLT5udW1iZXI7CisKKwlicmlkZ2UtPm1hc3RlcnNbaV0uZW5hYmxlZCA9IGVuYWJsZWQ7CisJYnJpZGdlLT5tYXN0ZXJzW2ldLnZtZV9iYXNlID0gdm1lX2Jhc2U7CisJYnJpZGdlLT5tYXN0ZXJzW2ldLnNpemUgPSBzaXplOworCWJyaWRnZS0+bWFzdGVyc1tpXS5hc3BhY2UgPSBhc3BhY2U7CisJYnJpZGdlLT5tYXN0ZXJzW2ldLmN5Y2xlID0gY3ljbGU7CisJYnJpZGdlLT5tYXN0ZXJzW2ldLmR3aWR0aCA9IGR3aWR0aDsKKworCXNwaW5fdW5sb2NrKCZpbWFnZS0+bG9jayk7CisKKwlyZXR1cm4gMDsKKworZXJyX2FzcGFjZToKK2Vycl9kd2lkdGg6CitlcnJfd2luZG93OgorCXJldHVybiByZXR2YWw7CisKK30KKworLyoKKyAqIFNldCB0aGUgYXR0cmlidXRlcyBvZiBhbiBvdXRib3VuZCB3aW5kb3cuCisgKi8KK3N0YXRpYyBpbnQgX19mYWtlX21hc3Rlcl9nZXQoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLCBpbnQgKmVuYWJsZWQsCisJCXVuc2lnbmVkIGxvbmcgbG9uZyAqdm1lX2Jhc2UsIHVuc2lnbmVkIGxvbmcgbG9uZyAqc2l6ZSwKKwkJdTMyICphc3BhY2UsIHUzMiAqY3ljbGUsIHUzMiAqZHdpZHRoKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBmYWtlX2RyaXZlciAqYnJpZGdlOworCisJYnJpZGdlID0gaW1hZ2UtPnBhcmVudC0+ZHJpdmVyX3ByaXY7CisKKwlpID0gaW1hZ2UtPm51bWJlcjsKKworCSplbmFibGVkID0gYnJpZGdlLT5tYXN0ZXJzW2ldLmVuYWJsZWQ7CisJKnZtZV9iYXNlID0gYnJpZGdlLT5tYXN0ZXJzW2ldLnZtZV9iYXNlOworCSpzaXplID0gYnJpZGdlLT5tYXN0ZXJzW2ldLnNpemU7CisJKmFzcGFjZSA9IGJyaWRnZS0+bWFzdGVyc1tpXS5hc3BhY2U7CisJKmN5Y2xlID0gYnJpZGdlLT5tYXN0ZXJzW2ldLmN5Y2xlOworCSpkd2lkdGggPSBicmlkZ2UtPm1hc3RlcnNbaV0uZHdpZHRoOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBmYWtlX21hc3Rlcl9nZXQoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLCBpbnQgKmVuYWJsZWQsCisJCXVuc2lnbmVkIGxvbmcgbG9uZyAqdm1lX2Jhc2UsIHVuc2lnbmVkIGxvbmcgbG9uZyAqc2l6ZSwKKwkJdTMyICphc3BhY2UsIHUzMiAqY3ljbGUsIHUzMiAqZHdpZHRoKQoreworCWludCByZXR2YWw7CisKKwlzcGluX2xvY2soJmltYWdlLT5sb2NrKTsKKworCXJldHZhbCA9IF9fZmFrZV9tYXN0ZXJfZ2V0KGltYWdlLCBlbmFibGVkLCB2bWVfYmFzZSwgc2l6ZSwgYXNwYWNlLAorCQkJY3ljbGUsIGR3aWR0aCk7CisKKwlzcGluX3VubG9jaygmaW1hZ2UtPmxvY2spOworCisJcmV0dXJuIHJldHZhbDsKK30KKworCitzdGF0aWMgdm9pZCBmYWtlX2xtX2NoZWNrKHN0cnVjdCBmYWtlX2RyaXZlciAqYnJpZGdlLCB1bnNpZ25lZCBsb25nIGxvbmcgYWRkciwKKwkJCSAgdTMyIGFzcGFjZSwgdTMyIGN5Y2xlKQoreworCXN0cnVjdCB2bWVfYnJpZGdlICpmYWtlX2JyaWRnZTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbG1fYmFzZTsKKwl1MzIgbG1fYXNwYWNlLCBsbV9jeWNsZTsKKwlpbnQgaTsKKwlzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICpsbTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MgPSBOVUxMLCAqbjsKKworCS8qIEdldCB2bWVfYnJpZGdlICovCisJZmFrZV9icmlkZ2UgPSBicmlkZ2UtPnBhcmVudDsKKworCS8qIExvb3AgdGhyb3VnaCBlYWNoIGxvY2F0aW9uIG1vbml0b3IgcmVzb3VyY2UgKi8KKwlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuLCAmZmFrZV9icmlkZ2UtPmxtX3Jlc291cmNlcykgeworCQlsbSA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlLCBsaXN0KTsKKworCQkvKiBJZiBkaXNhYmxlZCwgd2UncmUgZG9uZSAqLworCQlpZiAoYnJpZGdlLT5sbV9lbmFibGVkID09IDApCisJCQlyZXR1cm47CisKKwkJbG1fYmFzZSA9IGJyaWRnZS0+bG1fYmFzZTsKKwkJbG1fYXNwYWNlID0gYnJpZGdlLT5sbV9hc3BhY2U7CisJCWxtX2N5Y2xlID0gYnJpZGdlLT5sbV9jeWNsZTsKKworCQkvKiBGaXJzdCBtYWtlIHN1cmUgdGhhdCB0aGUgY3ljbGUgYW5kIGFkZHJlc3Mgc3BhY2UgbWF0Y2ggKi8KKwkJaWYgKChsbV9hc3BhY2UgPT0gYXNwYWNlKSAmJiAobG1fY3ljbGUgPT0gY3ljbGUpKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgbG0tPm1vbml0b3JzOyBpKyspIHsKKwkJCQkvKiBFYWNoIGxvY2F0aW9uIG1vbml0b3IgY292ZXJzIDggYnl0ZXMgKi8KKwkJCQlpZiAoKChsbV9iYXNlICsgKDggKiBpKSkgPD0gYWRkcikgJiYKKwkJCQkgICAgKChsbV9iYXNlICsgKDggKiBpKSArIDgpID4gYWRkcikpIHsKKwkJCQkJaWYgKGJyaWRnZS0+bG1fY2FsbGJhY2tbaV0gIT0gTlVMTCkKKwkJCQkJCWJyaWRnZS0+bG1fY2FsbGJhY2tbaV0oCisJCQkJCQkJYnJpZGdlLT5sbV9kYXRhW2ldKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB1OCBmYWtlX3ZtZXJlYWQ4KHN0cnVjdCBmYWtlX2RyaXZlciAqYnJpZGdlLCB1bnNpZ25lZCBsb25nIGxvbmcgYWRkciwKKwkJdTMyIGFzcGFjZSwgdTMyIGN5Y2xlKQoreworCXU4IHJldHZhbCA9IDB4ZmY7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0LCBlbmQsIG9mZnNldDsKKwl1OCAqbG9jOworCisJZm9yIChpID0gMDsgaSA8IEZBS0VfTUFYX1NMQVZFOyBpKyspIHsKKwkJc3RhcnQgPSBicmlkZ2UtPnNsYXZlc1tpXS52bWVfYmFzZTsKKwkJZW5kID0gYnJpZGdlLT5zbGF2ZXNbaV0udm1lX2Jhc2UgKyBicmlkZ2UtPnNsYXZlc1tpXS5zaXplOworCisJCWlmIChhc3BhY2UgIT0gYnJpZGdlLT5zbGF2ZXNbaV0uYXNwYWNlKQorCQkJY29udGludWU7CisKKwkJaWYgKGN5Y2xlICE9IGJyaWRnZS0+c2xhdmVzW2ldLmN5Y2xlKQorCQkJY29udGludWU7CisKKwkJaWYgKChhZGRyID49IHN0YXJ0KSAmJiAoYWRkciA8IGVuZCkpIHsKKwkJCW9mZnNldCA9IGFkZHIgLSBicmlkZ2UtPnNsYXZlc1tpXS52bWVfYmFzZTsKKwkJCWxvYyA9ICh1OCAqKShicmlkZ2UtPnNsYXZlc1tpXS5idWZfYmFzZSArIG9mZnNldCk7CisJCQlyZXR2YWwgPSAqbG9jOworCisJCQlicmVhazsKKwkJfQorCX0KKworCWZha2VfbG1fY2hlY2soYnJpZGdlLCBhZGRyLCBhc3BhY2UsIGN5Y2xlKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB1MTYgZmFrZV92bWVyZWFkMTYoc3RydWN0IGZha2VfZHJpdmVyICpicmlkZ2UsIHVuc2lnbmVkIGxvbmcgbG9uZyBhZGRyLAorCQl1MzIgYXNwYWNlLCB1MzIgY3ljbGUpCit7CisJdTE2IHJldHZhbCA9IDB4ZmZmZjsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnQsIGVuZCwgb2Zmc2V0OworCXUxNiAqbG9jOworCisJZm9yIChpID0gMDsgaSA8IEZBS0VfTUFYX1NMQVZFOyBpKyspIHsKKwkJaWYgKGFzcGFjZSAhPSBicmlkZ2UtPnNsYXZlc1tpXS5hc3BhY2UpCisJCQljb250aW51ZTsKKworCQlpZiAoY3ljbGUgIT0gYnJpZGdlLT5zbGF2ZXNbaV0uY3ljbGUpCisJCQljb250aW51ZTsKKworCQlzdGFydCA9IGJyaWRnZS0+c2xhdmVzW2ldLnZtZV9iYXNlOworCQllbmQgPSBicmlkZ2UtPnNsYXZlc1tpXS52bWVfYmFzZSArIGJyaWRnZS0+c2xhdmVzW2ldLnNpemU7CisKKwkJaWYgKChhZGRyID49IHN0YXJ0KSAmJiAoKGFkZHIgKyAxKSA8IGVuZCkpIHsKKwkJCW9mZnNldCA9IGFkZHIgLSBicmlkZ2UtPnNsYXZlc1tpXS52bWVfYmFzZTsKKwkJCWxvYyA9ICh1MTYgKikoYnJpZGdlLT5zbGF2ZXNbaV0uYnVmX2Jhc2UgKyBvZmZzZXQpOworCQkJcmV0dmFsID0gKmxvYzsKKworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlmYWtlX2xtX2NoZWNrKGJyaWRnZSwgYWRkciwgYXNwYWNlLCBjeWNsZSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdTMyIGZha2Vfdm1lcmVhZDMyKHN0cnVjdCBmYWtlX2RyaXZlciAqYnJpZGdlLCB1bnNpZ25lZCBsb25nIGxvbmcgYWRkciwKKwkJdTMyIGFzcGFjZSwgdTMyIGN5Y2xlKQoreworCXUzMiByZXR2YWwgPSAweGZmZmZmZmZmOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydCwgZW5kLCBvZmZzZXQ7CisJdTMyICpsb2M7CisKKwlmb3IgKGkgPSAwOyBpIDwgRkFLRV9NQVhfU0xBVkU7IGkrKykgeworCQlpZiAoYXNwYWNlICE9IGJyaWRnZS0+c2xhdmVzW2ldLmFzcGFjZSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjeWNsZSAhPSBicmlkZ2UtPnNsYXZlc1tpXS5jeWNsZSkKKwkJCWNvbnRpbnVlOworCisJCXN0YXJ0ID0gYnJpZGdlLT5zbGF2ZXNbaV0udm1lX2Jhc2U7CisJCWVuZCA9IGJyaWRnZS0+c2xhdmVzW2ldLnZtZV9iYXNlICsgYnJpZGdlLT5zbGF2ZXNbaV0uc2l6ZTsKKworCQlpZiAoKGFkZHIgPj0gc3RhcnQpICYmICgoYWRkciArIDMpIDwgZW5kKSkgeworCQkJb2Zmc2V0ID0gYWRkciAtIGJyaWRnZS0+c2xhdmVzW2ldLnZtZV9iYXNlOworCQkJbG9jID0gKHUzMiAqKShicmlkZ2UtPnNsYXZlc1tpXS5idWZfYmFzZSArIG9mZnNldCk7CisJCQlyZXR2YWwgPSAqbG9jOworCisJCQlicmVhazsKKwkJfQorCX0KKworCWZha2VfbG1fY2hlY2soYnJpZGdlLCBhZGRyLCBhc3BhY2UsIGN5Y2xlKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZha2VfbWFzdGVyX3JlYWQoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLCB2b2lkICpidWYsCisJCXNpemVfdCBjb3VudCwgbG9mZl90IG9mZnNldCkKK3sKKwlpbnQgcmV0dmFsOworCXUzMiBhc3BhY2UsIGN5Y2xlLCBkd2lkdGg7CisJc3RydWN0IHZtZV9icmlkZ2UgKmZha2VfYnJpZGdlOworCXN0cnVjdCBmYWtlX2RyaXZlciAqcHJpdjsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgYWRkcjsKKwl1bnNpZ25lZCBpbnQgZG9uZSA9IDA7CisJdW5zaWduZWQgaW50IGNvdW50MzI7CisKKwlmYWtlX2JyaWRnZSA9IGltYWdlLT5wYXJlbnQ7CisKKwlwcml2ID0gZmFrZV9icmlkZ2UtPmRyaXZlcl9wcml2OworCisJaSA9IGltYWdlLT5udW1iZXI7CisKKwlhZGRyID0gKHVuc2lnbmVkIGxvbmcgbG9uZylwcml2LT5tYXN0ZXJzW2ldLnZtZV9iYXNlICsgb2Zmc2V0OworCWFzcGFjZSA9IHByaXYtPm1hc3RlcnNbaV0uYXNwYWNlOworCWN5Y2xlID0gcHJpdi0+bWFzdGVyc1tpXS5jeWNsZTsKKwlkd2lkdGggPSBwcml2LT5tYXN0ZXJzW2ldLmR3aWR0aDsKKworCXNwaW5fbG9jaygmaW1hZ2UtPmxvY2spOworCisJLyogVGhlIGZvbGxvd2luZyBjb2RlIGhhbmRsZXMgVk1FIGFkZHJlc3MgYWxpZ25tZW50LiBXZSBjYW5ub3QgdXNlCisJICogbWVtY3B5X3h4eCBoZXJlIGJlY2F1c2UgaXQgbWF5IGN1dCBkYXRhIHRyYW5zZmVycyBpbiB0byA4LWJpdAorCSAqIGN5Y2xlcyB3aGVuIEQxNiBvciBEMzIgY3ljbGVzIGFyZSByZXF1aXJlZCBvbiB0aGUgVk1FIGJ1cy4KKwkgKiBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIGJyaWRnZSBpdHNlbGYgYXNzdXJlcyB0aGF0IHRoZSBtYXhpbXVtIGRhdGEKKwkgKiBjeWNsZSBjb25maWd1cmVkIGZvciB0aGUgdHJhbnNmZXIgaXMgdXNlZCBhbmQgc3BsaXRzIGl0CisJICogYXV0b21hdGljYWxseSBmb3Igbm9uLWFsaWduZWQgYWRkcmVzc2VzLCBzbyB3ZSBkb24ndCB3YW50IHRoZQorCSAqIG92ZXJoZWFkIG9mIG5lZWRsZXNzbHkgZm9yY2luZyBzbWFsbCB0cmFuc2ZlcnMgZm9yIHRoZSBlbnRpcmUgY3ljbGUuCisJICovCisJaWYgKGFkZHIgJiAweDEpIHsKKwkJKih1OCAqKWJ1ZiA9IGZha2Vfdm1lcmVhZDgocHJpdiwgYWRkciwgYXNwYWNlLCBjeWNsZSk7CisJCWRvbmUgKz0gMTsKKwkJaWYgKGRvbmUgPT0gY291bnQpCisJCQlnb3RvIG91dDsKKwl9CisJaWYgKChkd2lkdGggPT0gVk1FX0QxNikgfHwgKGR3aWR0aCA9PSBWTUVfRDMyKSkgeworCQlpZiAoKGFkZHIgKyBkb25lKSAmIDB4MikgeworCQkJaWYgKChjb3VudCAtIGRvbmUpIDwgMikgeworCQkJCSoodTggKikoYnVmICsgZG9uZSkgPSBmYWtlX3ZtZXJlYWQ4KHByaXYsCisJCQkJCQlhZGRyICsgZG9uZSwgYXNwYWNlLCBjeWNsZSk7CisJCQkJZG9uZSArPSAxOworCQkJCWdvdG8gb3V0OworCQkJfSBlbHNlIHsKKwkJCQkqKHUxNiAqKShidWYgKyBkb25lKSA9IGZha2Vfdm1lcmVhZDE2KHByaXYsCisJCQkJCQlhZGRyICsgZG9uZSwgYXNwYWNlLCBjeWNsZSk7CisJCQkJZG9uZSArPSAyOworCQkJfQorCQl9CisJfQorCisJaWYgKGR3aWR0aCA9PSBWTUVfRDMyKSB7CisJCWNvdW50MzIgPSAoY291bnQgLSBkb25lKSAmIH4weDM7CisJCXdoaWxlIChkb25lIDwgY291bnQzMikgeworCQkJKih1MzIgKikoYnVmICsgZG9uZSkgPSBmYWtlX3ZtZXJlYWQzMihwcml2LCBhZGRyICsgZG9uZSwKKwkJCQkJYXNwYWNlLCBjeWNsZSk7CisJCQlkb25lICs9IDQ7CisJCX0KKwl9IGVsc2UgaWYgKGR3aWR0aCA9PSBWTUVfRDE2KSB7CisJCWNvdW50MzIgPSAoY291bnQgLSBkb25lKSAmIH4weDM7CisJCXdoaWxlIChkb25lIDwgY291bnQzMikgeworCQkJKih1MTYgKikoYnVmICsgZG9uZSkgPSBmYWtlX3ZtZXJlYWQxNihwcml2LCBhZGRyICsgZG9uZSwKKwkJCQkJYXNwYWNlLCBjeWNsZSk7CisJCQlkb25lICs9IDI7CisJCX0KKwl9IGVsc2UgaWYgKGR3aWR0aCA9PSBWTUVfRDgpIHsKKwkJY291bnQzMiA9IChjb3VudCAtIGRvbmUpOworCQl3aGlsZSAoZG9uZSA8IGNvdW50MzIpIHsKKwkJCSoodTggKikoYnVmICsgZG9uZSkgPSBmYWtlX3ZtZXJlYWQ4KHByaXYsIGFkZHIgKyBkb25lLAorCQkJCQlhc3BhY2UsIGN5Y2xlKTsKKwkJCWRvbmUgKz0gMTsKKwkJfQorCisJfQorCisJaWYgKChkd2lkdGggPT0gVk1FX0QxNikgfHwgKGR3aWR0aCA9PSBWTUVfRDMyKSkgeworCQlpZiAoKGNvdW50IC0gZG9uZSkgJiAweDIpIHsKKwkJCSoodTE2ICopKGJ1ZiArIGRvbmUpID0gZmFrZV92bWVyZWFkMTYocHJpdiwgYWRkciArIGRvbmUsCisJCQkJCWFzcGFjZSwgY3ljbGUpOworCQkJZG9uZSArPSAyOworCQl9CisJfQorCWlmICgoY291bnQgLSBkb25lKSAmIDB4MSkgeworCQkqKHU4ICopKGJ1ZiArIGRvbmUpID0gZmFrZV92bWVyZWFkOChwcml2LCBhZGRyICsgZG9uZSwgYXNwYWNlLAorCQkJCWN5Y2xlKTsKKwkJZG9uZSArPSAxOworCX0KKworb3V0OgorCXJldHZhbCA9IGNvdW50OworCisJc3Bpbl91bmxvY2soJmltYWdlLT5sb2NrKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGZha2Vfdm1ld3JpdGU4KHN0cnVjdCBmYWtlX2RyaXZlciAqYnJpZGdlLCB1OCAqYnVmLAorCQkJICAgdW5zaWduZWQgbG9uZyBsb25nIGFkZHIsIHUzMiBhc3BhY2UsIHUzMiBjeWNsZSkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnQsIGVuZCwgb2Zmc2V0OworCXU4ICpsb2M7CisKKwlmb3IgKGkgPSAwOyBpIDwgRkFLRV9NQVhfU0xBVkU7IGkrKykgeworCQlpZiAoYXNwYWNlICE9IGJyaWRnZS0+c2xhdmVzW2ldLmFzcGFjZSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjeWNsZSAhPSBicmlkZ2UtPnNsYXZlc1tpXS5jeWNsZSkKKwkJCWNvbnRpbnVlOworCisJCXN0YXJ0ID0gYnJpZGdlLT5zbGF2ZXNbaV0udm1lX2Jhc2U7CisJCWVuZCA9IGJyaWRnZS0+c2xhdmVzW2ldLnZtZV9iYXNlICsgYnJpZGdlLT5zbGF2ZXNbaV0uc2l6ZTsKKworCQlpZiAoKGFkZHIgPj0gc3RhcnQpICYmIChhZGRyIDwgZW5kKSkgeworCQkJb2Zmc2V0ID0gYWRkciAtIGJyaWRnZS0+c2xhdmVzW2ldLnZtZV9iYXNlOworCQkJbG9jID0gKHU4ICopKCh2b2lkICopYnJpZGdlLT5zbGF2ZXNbaV0uYnVmX2Jhc2UgKyBvZmZzZXQpOworCQkJKmxvYyA9ICpidWY7CisKKwkJCWJyZWFrOworCQl9CisJfQorCisJZmFrZV9sbV9jaGVjayhicmlkZ2UsIGFkZHIsIGFzcGFjZSwgY3ljbGUpOworCit9CisKK3N0YXRpYyB2b2lkIGZha2Vfdm1ld3JpdGUxNihzdHJ1Y3QgZmFrZV9kcml2ZXIgKmJyaWRnZSwgdTE2ICpidWYsCisJCQkgICAgdW5zaWduZWQgbG9uZyBsb25nIGFkZHIsIHUzMiBhc3BhY2UsIHUzMiBjeWNsZSkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnQsIGVuZCwgb2Zmc2V0OworCXUxNiAqbG9jOworCisJZm9yIChpID0gMDsgaSA8IEZBS0VfTUFYX1NMQVZFOyBpKyspIHsKKwkJaWYgKGFzcGFjZSAhPSBicmlkZ2UtPnNsYXZlc1tpXS5hc3BhY2UpCisJCQljb250aW51ZTsKKworCQlpZiAoY3ljbGUgIT0gYnJpZGdlLT5zbGF2ZXNbaV0uY3ljbGUpCisJCQljb250aW51ZTsKKworCQlzdGFydCA9IGJyaWRnZS0+c2xhdmVzW2ldLnZtZV9iYXNlOworCQllbmQgPSBicmlkZ2UtPnNsYXZlc1tpXS52bWVfYmFzZSArIGJyaWRnZS0+c2xhdmVzW2ldLnNpemU7CisKKwkJaWYgKChhZGRyID49IHN0YXJ0KSAmJiAoKGFkZHIgKyAxKSA8IGVuZCkpIHsKKwkJCW9mZnNldCA9IGFkZHIgLSBicmlkZ2UtPnNsYXZlc1tpXS52bWVfYmFzZTsKKwkJCWxvYyA9ICh1MTYgKikoKHZvaWQgKilicmlkZ2UtPnNsYXZlc1tpXS5idWZfYmFzZSArIG9mZnNldCk7CisJCQkqbG9jID0gKmJ1ZjsKKworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlmYWtlX2xtX2NoZWNrKGJyaWRnZSwgYWRkciwgYXNwYWNlLCBjeWNsZSk7CisKK30KKworc3RhdGljIHZvaWQgZmFrZV92bWV3cml0ZTMyKHN0cnVjdCBmYWtlX2RyaXZlciAqYnJpZGdlLCB1MzIgKmJ1ZiwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGxvbmcgYWRkciwgdTMyIGFzcGFjZSwgdTMyIGN5Y2xlKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydCwgZW5kLCBvZmZzZXQ7CisJdTMyICpsb2M7CisKKwlmb3IgKGkgPSAwOyBpIDwgRkFLRV9NQVhfU0xBVkU7IGkrKykgeworCQlpZiAoYXNwYWNlICE9IGJyaWRnZS0+c2xhdmVzW2ldLmFzcGFjZSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjeWNsZSAhPSBicmlkZ2UtPnNsYXZlc1tpXS5jeWNsZSkKKwkJCWNvbnRpbnVlOworCisJCXN0YXJ0ID0gYnJpZGdlLT5zbGF2ZXNbaV0udm1lX2Jhc2U7CisJCWVuZCA9IGJyaWRnZS0+c2xhdmVzW2ldLnZtZV9iYXNlICsgYnJpZGdlLT5zbGF2ZXNbaV0uc2l6ZTsKKworCQlpZiAoKGFkZHIgPj0gc3RhcnQpICYmICgoYWRkciArIDMpIDwgZW5kKSkgeworCQkJb2Zmc2V0ID0gYWRkciAtIGJyaWRnZS0+c2xhdmVzW2ldLnZtZV9iYXNlOworCQkJbG9jID0gKHUzMiAqKSgodm9pZCAqKWJyaWRnZS0+c2xhdmVzW2ldLmJ1Zl9iYXNlICsgb2Zmc2V0KTsKKwkJCSpsb2MgPSAqYnVmOworCisJCQlicmVhazsKKwkJfQorCX0KKworCWZha2VfbG1fY2hlY2soYnJpZGdlLCBhZGRyLCBhc3BhY2UsIGN5Y2xlKTsKKworfQorCitzdGF0aWMgc3NpemVfdCBmYWtlX21hc3Rlcl93cml0ZShzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqaW1hZ2UsIHZvaWQgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50LCBsb2ZmX3Qgb2Zmc2V0KQoreworCWludCByZXR2YWwgPSAwOworCXUzMiBhc3BhY2UsIGN5Y2xlLCBkd2lkdGg7CisJdW5zaWduZWQgbG9uZyBsb25nIGFkZHI7CisJaW50IGk7CisJdW5zaWduZWQgaW50IGRvbmUgPSAwOworCXVuc2lnbmVkIGludCBjb3VudDMyOworCisJc3RydWN0IHZtZV9icmlkZ2UgKmZha2VfYnJpZGdlOworCXN0cnVjdCBmYWtlX2RyaXZlciAqYnJpZGdlOworCisJZmFrZV9icmlkZ2UgPSBpbWFnZS0+cGFyZW50OworCisJYnJpZGdlID0gZmFrZV9icmlkZ2UtPmRyaXZlcl9wcml2OworCisJaSA9IGltYWdlLT5udW1iZXI7CisKKwlhZGRyID0gYnJpZGdlLT5tYXN0ZXJzW2ldLnZtZV9iYXNlICsgb2Zmc2V0OworCWFzcGFjZSA9IGJyaWRnZS0+bWFzdGVyc1tpXS5hc3BhY2U7CisJY3ljbGUgPSBicmlkZ2UtPm1hc3RlcnNbaV0uY3ljbGU7CisJZHdpZHRoID0gYnJpZGdlLT5tYXN0ZXJzW2ldLmR3aWR0aDsKKworCXNwaW5fbG9jaygmaW1hZ2UtPmxvY2spOworCisJLyogSGVyZSB3ZSBhcHBseSBmb3IgdGhlIHNhbWUgc3RyYXRlZ3kgd2UgZG8gaW4gbWFzdGVyX3JlYWQKKwkgKiBmdW5jdGlvbiBpbiBvcmRlciB0byBhc3N1cmUgdGhlIGNvcnJlY3QgY3ljbGVzLgorCSAqLworCWlmIChhZGRyICYgMHgxKSB7CisJCWZha2Vfdm1ld3JpdGU4KGJyaWRnZSwgKHU4ICopYnVmLCBhZGRyLCBhc3BhY2UsIGN5Y2xlKTsKKwkJZG9uZSArPSAxOworCQlpZiAoZG9uZSA9PSBjb3VudCkKKwkJCWdvdG8gb3V0OworCX0KKworCWlmICgoZHdpZHRoID09IFZNRV9EMTYpIHx8IChkd2lkdGggPT0gVk1FX0QzMikpIHsKKwkJaWYgKChhZGRyICsgZG9uZSkgJiAweDIpIHsKKwkJCWlmICgoY291bnQgLSBkb25lKSA8IDIpIHsKKwkJCQlmYWtlX3ZtZXdyaXRlOChicmlkZ2UsICh1OCAqKShidWYgKyBkb25lKSwKKwkJCQkJCWFkZHIgKyBkb25lLCBhc3BhY2UsIGN5Y2xlKTsKKwkJCQlkb25lICs9IDE7CisJCQkJZ290byBvdXQ7CisJCQl9IGVsc2UgeworCQkJCWZha2Vfdm1ld3JpdGUxNihicmlkZ2UsICh1MTYgKikoYnVmICsgZG9uZSksCisJCQkJCQlhZGRyICsgZG9uZSwgYXNwYWNlLCBjeWNsZSk7CisJCQkJZG9uZSArPSAyOworCQkJfQorCQl9CisJfQorCisJaWYgKGR3aWR0aCA9PSBWTUVfRDMyKSB7CisJCWNvdW50MzIgPSAoY291bnQgLSBkb25lKSAmIH4weDM7CisJCXdoaWxlIChkb25lIDwgY291bnQzMikgeworCQkJZmFrZV92bWV3cml0ZTMyKGJyaWRnZSwgKHUzMiAqKShidWYgKyBkb25lKSwKKwkJCQkJYWRkciArIGRvbmUsIGFzcGFjZSwgY3ljbGUpOworCQkJZG9uZSArPSA0OworCQl9CisJfSBlbHNlIGlmIChkd2lkdGggPT0gVk1FX0QxNikgeworCQljb3VudDMyID0gKGNvdW50IC0gZG9uZSkgJiB+MHgzOworCQl3aGlsZSAoZG9uZSA8IGNvdW50MzIpIHsKKwkJCWZha2Vfdm1ld3JpdGUxNihicmlkZ2UsICh1MTYgKikoYnVmICsgZG9uZSksCisJCQkJCWFkZHIgKyBkb25lLCBhc3BhY2UsIGN5Y2xlKTsKKwkJCWRvbmUgKz0gMjsKKwkJfQorCX0gZWxzZSBpZiAoZHdpZHRoID09IFZNRV9EOCkgeworCQljb3VudDMyID0gKGNvdW50IC0gZG9uZSk7CisJCXdoaWxlIChkb25lIDwgY291bnQzMikgeworCQkJZmFrZV92bWV3cml0ZTgoYnJpZGdlLCAodTggKikoYnVmICsgZG9uZSksIGFkZHIgKyBkb25lLAorCQkJCQlhc3BhY2UsIGN5Y2xlKTsKKwkJCWRvbmUgKz0gMTsKKwkJfQorCisJfQorCisJaWYgKChkd2lkdGggPT0gVk1FX0QxNikgfHwgKGR3aWR0aCA9PSBWTUVfRDMyKSkgeworCQlpZiAoKGNvdW50IC0gZG9uZSkgJiAweDIpIHsKKwkJCWZha2Vfdm1ld3JpdGUxNihicmlkZ2UsICh1MTYgKikoYnVmICsgZG9uZSksCisJCQkJCWFkZHIgKyBkb25lLCBhc3BhY2UsIGN5Y2xlKTsKKwkJCWRvbmUgKz0gMjsKKwkJfQorCX0KKworCWlmICgoY291bnQgLSBkb25lKSAmIDB4MSkgeworCQlmYWtlX3ZtZXdyaXRlOChicmlkZ2UsICh1OCAqKShidWYgKyBkb25lKSwgYWRkciArIGRvbmUsIGFzcGFjZSwKKwkJCQljeWNsZSk7CisJCWRvbmUgKz0gMTsKKwl9CisKK291dDoKKwlyZXR2YWwgPSBjb3VudDsKKworCXNwaW5fdW5sb2NrKCZpbWFnZS0+bG9jayk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogUGVyZm9ybSBhbiBSTVcgY3ljbGUgb24gdGhlIFZNRSBidXMuCisgKgorICogUmVxdWlyZXMgYSBwcmV2aW91c2x5IGNvbmZpZ3VyZWQgbWFzdGVyIHdpbmRvdywgcmV0dXJucyBmaW5hbCB2YWx1ZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBmYWtlX21hc3Rlcl9ybXcoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UgKmltYWdlLAorCQl1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGNvbXBhcmUsIHVuc2lnbmVkIGludCBzd2FwLAorCQlsb2ZmX3Qgb2Zmc2V0KQoreworCXUzMiB0bXAsIGJhc2U7CisJdTMyIGFzcGFjZSwgY3ljbGU7CisJaW50IGk7CisJc3RydWN0IGZha2VfZHJpdmVyICpicmlkZ2U7CisKKwlicmlkZ2UgPSBpbWFnZS0+cGFyZW50LT5kcml2ZXJfcHJpdjsKKworCS8qIEZpbmQgdGhlIFBDSSBhZGRyZXNzIHRoYXQgbWFwcyB0byB0aGUgZGVzaXJlZCBWTUUgYWRkcmVzcyAqLworCWkgPSBpbWFnZS0+bnVtYmVyOworCisJYmFzZSA9IGJyaWRnZS0+bWFzdGVyc1tpXS52bWVfYmFzZTsKKwlhc3BhY2UgPSBicmlkZ2UtPm1hc3RlcnNbaV0uYXNwYWNlOworCWN5Y2xlID0gYnJpZGdlLT5tYXN0ZXJzW2ldLmN5Y2xlOworCisJLyogTG9jayBpbWFnZSAqLworCXNwaW5fbG9jaygmaW1hZ2UtPmxvY2spOworCisJLyogUmVhZCBleGlzdGluZyB2YWx1ZSAqLworCXRtcCA9IGZha2Vfdm1lcmVhZDMyKGJyaWRnZSwgYmFzZSArIG9mZnNldCwgYXNwYWNlLCBjeWNsZSk7CisKKwkvKiBQZXJmb3JtIGNoZWNrICovCisJaWYgKCh0bXAgJiYgbWFzaykgPT0gKGNvbXBhcmUgJiYgbWFzaykpIHsKKwkJdG1wID0gdG1wIHwgKG1hc2sgfCBzd2FwKTsKKwkJdG1wID0gdG1wICYgKH5tYXNrIHwgc3dhcCk7CisKKwkJLyogV3JpdGUgYmFjayAqLworCQlmYWtlX3ZtZXdyaXRlMzIoYnJpZGdlLCAmdG1wLCBiYXNlICsgb2Zmc2V0LCBhc3BhY2UsIGN5Y2xlKTsKKwl9CisKKwkvKiBVbmxvY2sgaW1hZ2UgKi8KKwlzcGluX3VubG9jaygmaW1hZ2UtPmxvY2spOworCisJcmV0dXJuIHRtcDsKK30KKworLyoKKyAqIEFsbCA0IGxvY2F0aW9uIG1vbml0b3JzIHJlc2lkZSBhdCB0aGUgc2FtZSBiYXNlIC0gdGhpcyBpcyB0aGVyZWZvcmUgYQorICogc3lzdGVtIHdpZGUgY29uZmlndXJhdGlvbi4KKyAqCisgKiBUaGlzIGRvZXMgbm90IGVuYWJsZSB0aGUgTE0gbW9uaXRvciAtIHRoYXQgc2hvdWxkIGJlIGRvbmUgd2hlbiB0aGUgZmlyc3QKKyAqIGNhbGxiYWNrIGlzIGF0dGFjaGVkIGFuZCBkaXNhYmxlZCB3aGVuIHRoZSBsYXN0IGNhbGxiYWNrIGlzIHJlbW92ZWQuCisgKi8KK3N0YXRpYyBpbnQgZmFrZV9sbV9zZXQoc3RydWN0IHZtZV9sbV9yZXNvdXJjZSAqbG0sIHVuc2lnbmVkIGxvbmcgbG9uZyBsbV9iYXNlLAorCQl1MzIgYXNwYWNlLCB1MzIgY3ljbGUpCit7CisJaW50IGk7CisJc3RydWN0IHZtZV9icmlkZ2UgKmZha2VfYnJpZGdlOworCXN0cnVjdCBmYWtlX2RyaXZlciAqYnJpZGdlOworCisJZmFrZV9icmlkZ2UgPSBsbS0+cGFyZW50OworCisJYnJpZGdlID0gZmFrZV9icmlkZ2UtPmRyaXZlcl9wcml2OworCisJbXV0ZXhfbG9jaygmbG0tPm10eCk7CisKKwkvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBjYWxsYmFjayBhdHRhY2hlZCwgd2UgY2FuJ3QgbW92ZSBpdCEgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbG0tPm1vbml0b3JzOyBpKyspIHsKKwkJaWYgKGJyaWRnZS0+bG1fY2FsbGJhY2tbaV0gIT0gTlVMTCkgeworCQkJbXV0ZXhfdW5sb2NrKCZsbS0+bXR4KTsKKwkJCXByX2VycigiTG9jYXRpb24gbW9uaXRvciBjYWxsYmFjayBhdHRhY2hlZCwgY2FuJ3QgcmVzZXRcbiIpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKworCXN3aXRjaCAoYXNwYWNlKSB7CisJY2FzZSBWTUVfQTE2OgorCWNhc2UgVk1FX0EyNDoKKwljYXNlIFZNRV9BMzI6CisJY2FzZSBWTUVfQTY0OgorCQlicmVhazsKKwlkZWZhdWx0OgorCQltdXRleF91bmxvY2soJmxtLT5tdHgpOworCQlwcl9lcnIoIkludmFsaWQgYWRkcmVzcyBzcGFjZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJyaWRnZS0+bG1fYmFzZSA9IGxtX2Jhc2U7CisJYnJpZGdlLT5sbV9hc3BhY2UgPSBhc3BhY2U7CisJYnJpZGdlLT5sbV9jeWNsZSA9IGN5Y2xlOworCisJbXV0ZXhfdW5sb2NrKCZsbS0+bXR4KTsKKworCXJldHVybiAwOworfQorCisvKiBHZXQgY29uZmlndXJhdGlvbiBvZiB0aGUgY2FsbGJhY2sgbW9uaXRvciBhbmQgcmV0dXJuIHdoZXRoZXIgaXQgaXMgZW5hYmxlZAorICogb3IgZGlzYWJsZWQuCisgKi8KK3N0YXRpYyBpbnQgZmFrZV9sbV9nZXQoc3RydWN0IHZtZV9sbV9yZXNvdXJjZSAqbG0sCisJCXVuc2lnbmVkIGxvbmcgbG9uZyAqbG1fYmFzZSwgdTMyICphc3BhY2UsIHUzMiAqY3ljbGUpCit7CisJc3RydWN0IGZha2VfZHJpdmVyICpicmlkZ2U7CisKKwlicmlkZ2UgPSBsbS0+cGFyZW50LT5kcml2ZXJfcHJpdjsKKworCW11dGV4X2xvY2soJmxtLT5tdHgpOworCisJKmxtX2Jhc2UgPSBicmlkZ2UtPmxtX2Jhc2U7CisJKmFzcGFjZSA9IGJyaWRnZS0+bG1fYXNwYWNlOworCSpjeWNsZSA9IGJyaWRnZS0+bG1fY3ljbGU7CisKKwltdXRleF91bmxvY2soJmxtLT5tdHgpOworCisJcmV0dXJuIGJyaWRnZS0+bG1fZW5hYmxlZDsKK30KKworLyoKKyAqIEF0dGFjaCBhIGNhbGxiYWNrIHRvIGEgc3BlY2lmaWMgbG9jYXRpb24gbW9uaXRvci4KKyAqCisgKiBDYWxsYmFjayB3aWxsIGJlIHBhc3NlZCB0aGUgbW9uaXRvciB0cmlnZ2VyZWQuCisgKi8KK3N0YXRpYyBpbnQgZmFrZV9sbV9hdHRhY2goc3RydWN0IHZtZV9sbV9yZXNvdXJjZSAqbG0sIGludCBtb25pdG9yLAorCQl2b2lkICgqY2FsbGJhY2spKHZvaWQgKiksIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHZtZV9icmlkZ2UgKmZha2VfYnJpZGdlOworCXN0cnVjdCBmYWtlX2RyaXZlciAqYnJpZGdlOworCisJZmFrZV9icmlkZ2UgPSBsbS0+cGFyZW50OworCisJYnJpZGdlID0gZmFrZV9icmlkZ2UtPmRyaXZlcl9wcml2OworCisJbXV0ZXhfbG9jaygmbG0tPm10eCk7CisKKwkvKiBFbnN1cmUgdGhhdCB0aGUgbG9jYXRpb24gbW9uaXRvciBpcyBjb25maWd1cmVkIC0gbmVlZCBQR00gb3IgREFUQSAqLworCWlmIChicmlkZ2UtPmxtX2N5Y2xlID09IDApIHsKKwkJbXV0ZXhfdW5sb2NrKCZsbS0+bXR4KTsKKwkJcHJfZXJyKCJMb2NhdGlvbiBtb25pdG9yIG5vdCBwcm9wZXJseSBjb25maWd1cmVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ2hlY2sgdGhhdCBhIGNhbGxiYWNrIGlzbid0IGFscmVhZHkgYXR0YWNoZWQgKi8KKwlpZiAoYnJpZGdlLT5sbV9jYWxsYmFja1ttb25pdG9yXSAhPSBOVUxMKSB7CisJCW11dGV4X3VubG9jaygmbG0tPm10eCk7CisJCXByX2VycigiRXhpc3RpbmcgY2FsbGJhY2sgYXR0YWNoZWRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8qIEF0dGFjaCBjYWxsYmFjayAqLworCWJyaWRnZS0+bG1fY2FsbGJhY2tbbW9uaXRvcl0gPSBjYWxsYmFjazsKKwlicmlkZ2UtPmxtX2RhdGFbbW9uaXRvcl0gPSBkYXRhOworCisJLyogRW5zdXJlIHRoYXQgZ2xvYmFsIExvY2F0aW9uIE1vbml0b3IgRW5hYmxlIHNldCAqLworCWJyaWRnZS0+bG1fZW5hYmxlZCA9IDE7CisKKwltdXRleF91bmxvY2soJmxtLT5tdHgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEZXRhY2ggYSBjYWxsYmFjayBmdW5jdGlvbiBmb3JuIGEgc3BlY2lmaWMgbG9jYXRpb24gbW9uaXRvci4KKyAqLworc3RhdGljIGludCBmYWtlX2xtX2RldGFjaChzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICpsbSwgaW50IG1vbml0b3IpCit7CisJdTMyIHRtcDsKKwlpbnQgaTsKKwlzdHJ1Y3QgZmFrZV9kcml2ZXIgKmJyaWRnZTsKKworCWJyaWRnZSA9IGxtLT5wYXJlbnQtPmRyaXZlcl9wcml2OworCisJbXV0ZXhfbG9jaygmbG0tPm10eCk7CisKKwkvKiBEZXRhY2ggY2FsbGJhY2sgKi8KKwlicmlkZ2UtPmxtX2NhbGxiYWNrW21vbml0b3JdID0gTlVMTDsKKwlicmlkZ2UtPmxtX2RhdGFbbW9uaXRvcl0gPSBOVUxMOworCisJLyogSWYgYWxsIGxvY2F0aW9uIG1vbml0b3JzIGRpc2FibGVkLCBkaXNhYmxlIGdsb2JhbCBMb2NhdGlvbiBNb25pdG9yICovCisJdG1wID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbG0tPm1vbml0b3JzOyBpKyspIHsKKwkJaWYgKGJyaWRnZS0+bG1fY2FsbGJhY2tbaV0gIT0gTlVMTCkKKwkJCXRtcCA9IDE7CisJfQorCisJaWYgKHRtcCA9PSAwKQorCQlicmlkZ2UtPmxtX2VuYWJsZWQgPSAwOworCisJbXV0ZXhfdW5sb2NrKCZsbS0+bXR4KTsKKworCXJldHVybiAwOworfQorCisvKgorICogRGV0ZXJtaW5lIEdlb2dyYXBoaWNhbCBBZGRyZXNzaW5nCisgKi8KK3N0YXRpYyBpbnQgZmFrZV9zbG90X2dldChzdHJ1Y3Qgdm1lX2JyaWRnZSAqZmFrZV9icmlkZ2UpCit7CisJcmV0dXJuIGdlb2lkOworfQorCitzdGF0aWMgdm9pZCAqZmFrZV9hbGxvY19jb25zaXN0ZW50KHN0cnVjdCBkZXZpY2UgKnBhcmVudCwgc2l6ZV90IHNpemUsCisJCWRtYV9hZGRyX3QgKmRtYSkKK3sKKwl2b2lkICphbGxvYyA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoYWxsb2MgIT0gTlVMTCkKKwkJKmRtYSA9IGZha2VfcHRyX3RvX3BjaShhbGxvYyk7CisKKwlyZXR1cm4gYWxsb2M7Cit9CisKK3N0YXRpYyB2b2lkIGZha2VfZnJlZV9jb25zaXN0ZW50KHN0cnVjdCBkZXZpY2UgKnBhcmVudCwgc2l6ZV90IHNpemUsCisJCXZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGRtYSkKK3sKKwlrZnJlZSh2YWRkcik7CisvKgorCWRtYV9mcmVlX2NvaGVyZW50KHBhcmVudCwgc2l6ZSwgdmFkZHIsIGRtYSk7CisqLworfQorCisvKgorICogQ29uZmlndXJlIENSL0NTUiBzcGFjZQorICoKKyAqIEFjY2VzcyB0byB0aGUgQ1IvQ1NSIGNhbiBiZSBjb25maWd1cmVkIGF0IHBvd2VyLXVwLiBUaGUgbG9jYXRpb24gb2YgdGhlCisgKiBDUi9DU1IgcmVnaXN0ZXJzIGluIHRoZSBDUi9DU1IgYWRkcmVzcyBzcGFjZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBib2FyZHMKKyAqIEdlb2dyYXBoaWMgYWRkcmVzcy4KKyAqCisgKiBFYWNoIGJvYXJkIGhhcyBhIDUxMmtCIHdpbmRvdywgd2l0aCB0aGUgaGlnaGVzdCA0a0IgYmVpbmcgdXNlZCBmb3IgdGhlCisgKiBib2FyZHMgcmVnaXN0ZXJzLCB0aGlzIG1lYW5zIHRoZXJlIGlzIGEgZml4IGxlbmd0aCA1MDhrQiB3aW5kb3cgd2hpY2ggbXVzdAorICogYmUgbWFwcGVkIG9udG8gUENJIG1lbW9yeS4KKyAqLworc3RhdGljIGludCBmYWtlX2NyY3NyX2luaXQoc3RydWN0IHZtZV9icmlkZ2UgKmZha2VfYnJpZGdlKQoreworCXUzMiB2c3RhdDsKKwlzdHJ1Y3QgZmFrZV9kcml2ZXIgKmJyaWRnZTsKKworCWJyaWRnZSA9IGZha2VfYnJpZGdlLT5kcml2ZXJfcHJpdjsKKworCS8qIEFsbG9jYXRlIG1lbSBmb3IgQ1IvQ1NSIGltYWdlICovCisJYnJpZGdlLT5jcmNzcl9rZXJuZWwgPSBremFsbG9jKFZNRV9DUkNTUl9CVUZfU0laRSwgR0ZQX0tFUk5FTCk7CisJYnJpZGdlLT5jcmNzcl9idXMgPSBmYWtlX3B0cl90b19wY2koYnJpZGdlLT5jcmNzcl9rZXJuZWwpOworCWlmIChicmlkZ2UtPmNyY3NyX2tlcm5lbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXZzdGF0ID0gZmFrZV9zbG90X2dldChmYWtlX2JyaWRnZSk7CisKKwlwcl9pbmZvKCJDUi9DU1IgT2Zmc2V0OiAlZFxuIiwgdnN0YXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZha2VfY3Jjc3JfZXhpdChzdHJ1Y3Qgdm1lX2JyaWRnZSAqZmFrZV9icmlkZ2UpCit7CisJc3RydWN0IGZha2VfZHJpdmVyICpicmlkZ2U7CisKKwlicmlkZ2UgPSBmYWtlX2JyaWRnZS0+ZHJpdmVyX3ByaXY7CisKKwlrZnJlZShicmlkZ2UtPmNyY3NyX2tlcm5lbCk7Cit9CisKKworc3RhdGljIGludCBfX2luaXQgZmFrZV9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbCwgaTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MgPSBOVUxMLCAqbjsKKwlzdHJ1Y3Qgdm1lX2JyaWRnZSAqZmFrZV9icmlkZ2U7CisJc3RydWN0IGZha2VfZHJpdmVyICpmYWtlX2RldmljZTsKKwlzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqbWFzdGVyX2ltYWdlOworCXN0cnVjdCB2bWVfc2xhdmVfcmVzb3VyY2UgKnNsYXZlX2ltYWdlOworCXN0cnVjdCB2bWVfbG1fcmVzb3VyY2UgKmxtOworCisJLyogV2UgbmVlZCBhIGZha2UgcGFyZW50IGRldmljZSAqLworCXZtZV9yb290ID0gX19yb290X2RldmljZV9yZWdpc3Rlcigidm1lIiwgVEhJU19NT0RVTEUpOworCisJLyogSWYgd2Ugd2FudCB0byBzdXBwb3J0IG1vcmUgdGhhbiBvbmUgYnJpZGdlIGF0IHNvbWUgcG9pbnQsIHdlIG5lZWQgdG8KKwkgKiBkeW5hbWljYWxseSBhbGxvY2F0ZSB0aGlzIHNvIHdlIGdldCBvbmUgcGVyIGRldmljZS4KKwkgKi8KKwlmYWtlX2JyaWRnZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2bWVfYnJpZGdlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGZha2VfYnJpZGdlID09IE5VTEwpIHsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBlcnJfc3RydWN0OworCX0KKworCWZha2VfZGV2aWNlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZha2VfZHJpdmVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGZha2VfZGV2aWNlID09IE5VTEwpIHsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBlcnJfZHJpdmVyOworCX0KKworCWZha2VfYnJpZGdlLT5kcml2ZXJfcHJpdiA9IGZha2VfZGV2aWNlOworCisJZmFrZV9icmlkZ2UtPnBhcmVudCA9IHZtZV9yb290OworCisJZmFrZV9kZXZpY2UtPnBhcmVudCA9IGZha2VfYnJpZGdlOworCisJLyogSW5pdGlhbGl6ZSB3YWl0IHF1ZXVlcyAmIG11dHVhbCBleGNsdXNpb24gZmxhZ3MgKi8KKwltdXRleF9pbml0KCZmYWtlX2RldmljZS0+dm1lX2ludCk7CisJbXV0ZXhfaW5pdCgmZmFrZV9icmlkZ2UtPmlycV9tdHgpOworCXRhc2tsZXRfaW5pdCgmZmFrZV9kZXZpY2UtPmludF90YXNrbGV0LCBmYWtlX1ZJUlFfdGFza2xldCwKKwkJCSh1bnNpZ25lZCBsb25nKSBmYWtlX2JyaWRnZSk7CisKKwlzdHJjcHkoZmFrZV9icmlkZ2UtPm5hbWUsIGRyaXZlcl9uYW1lKTsKKworCS8qIEFkZCBtYXN0ZXIgd2luZG93cyB0byBsaXN0ICovCisJSU5JVF9MSVNUX0hFQUQoJmZha2VfYnJpZGdlLT5tYXN0ZXJfcmVzb3VyY2VzKTsKKwlmb3IgKGkgPSAwOyBpIDwgRkFLRV9NQVhfTUFTVEVSOyBpKyspIHsKKwkJbWFzdGVyX2ltYWdlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UpLAorCQkJCUdGUF9LRVJORUwpOworCQlpZiAobWFzdGVyX2ltYWdlID09IE5VTEwpIHsKKwkJCXJldHZhbCA9IC1FTk9NRU07CisJCQlnb3RvIGVycl9tYXN0ZXI7CisJCX0KKwkJbWFzdGVyX2ltYWdlLT5wYXJlbnQgPSBmYWtlX2JyaWRnZTsKKwkJc3Bpbl9sb2NrX2luaXQoJm1hc3Rlcl9pbWFnZS0+bG9jayk7CisJCW1hc3Rlcl9pbWFnZS0+bG9ja2VkID0gMDsKKwkJbWFzdGVyX2ltYWdlLT5udW1iZXIgPSBpOworCQltYXN0ZXJfaW1hZ2UtPmFkZHJlc3NfYXR0ciA9IFZNRV9BMTYgfCBWTUVfQTI0IHwgVk1FX0EzMiB8CisJCQlWTUVfQTY0OworCQltYXN0ZXJfaW1hZ2UtPmN5Y2xlX2F0dHIgPSBWTUVfU0NUIHwgVk1FX0JMVCB8IFZNRV9NQkxUIHwKKwkJCVZNRV8yZVZNRSB8IFZNRV8yZVNTVCB8IFZNRV8yZVNTVEIgfCBWTUVfMmVTU1QxNjAgfAorCQkJVk1FXzJlU1NUMjY3IHwgVk1FXzJlU1NUMzIwIHwgVk1FX1NVUEVSIHwgVk1FX1VTRVIgfAorCQkJVk1FX1BST0cgfCBWTUVfREFUQTsKKwkJbWFzdGVyX2ltYWdlLT53aWR0aF9hdHRyID0gVk1FX0QxNiB8IFZNRV9EMzI7CisJCW1lbXNldCgmbWFzdGVyX2ltYWdlLT5idXNfcmVzb3VyY2UsIDAsCisJCQkJc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOworCQltYXN0ZXJfaW1hZ2UtPmtlcm5fYmFzZSAgPSBOVUxMOworCQlsaXN0X2FkZF90YWlsKCZtYXN0ZXJfaW1hZ2UtPmxpc3QsCisJCQkJJmZha2VfYnJpZGdlLT5tYXN0ZXJfcmVzb3VyY2VzKTsKKwl9CisKKwkvKiBBZGQgc2xhdmUgd2luZG93cyB0byBsaXN0ICovCisJSU5JVF9MSVNUX0hFQUQoJmZha2VfYnJpZGdlLT5zbGF2ZV9yZXNvdXJjZXMpOworCWZvciAoaSA9IDA7IGkgPCBGQUtFX01BWF9TTEFWRTsgaSsrKSB7CisJCXNsYXZlX2ltYWdlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZtZV9zbGF2ZV9yZXNvdXJjZSksCisJCQkJR0ZQX0tFUk5FTCk7CisJCWlmIChzbGF2ZV9pbWFnZSA9PSBOVUxMKSB7CisJCQlyZXR2YWwgPSAtRU5PTUVNOworCQkJZ290byBlcnJfc2xhdmU7CisJCX0KKwkJc2xhdmVfaW1hZ2UtPnBhcmVudCA9IGZha2VfYnJpZGdlOworCQltdXRleF9pbml0KCZzbGF2ZV9pbWFnZS0+bXR4KTsKKwkJc2xhdmVfaW1hZ2UtPmxvY2tlZCA9IDA7CisJCXNsYXZlX2ltYWdlLT5udW1iZXIgPSBpOworCQlzbGF2ZV9pbWFnZS0+YWRkcmVzc19hdHRyID0gVk1FX0ExNiB8IFZNRV9BMjQgfCBWTUVfQTMyIHwKKwkJCVZNRV9BNjQgfCBWTUVfQ1JDU1IgfCBWTUVfVVNFUjEgfCBWTUVfVVNFUjIgfAorCQkJVk1FX1VTRVIzIHwgVk1FX1VTRVI0OworCQlzbGF2ZV9pbWFnZS0+Y3ljbGVfYXR0ciA9IFZNRV9TQ1QgfCBWTUVfQkxUIHwgVk1FX01CTFQgfAorCQkJVk1FXzJlVk1FIHwgVk1FXzJlU1NUIHwgVk1FXzJlU1NUQiB8IFZNRV8yZVNTVDE2MCB8CisJCQlWTUVfMmVTU1QyNjcgfCBWTUVfMmVTU1QzMjAgfCBWTUVfU1VQRVIgfCBWTUVfVVNFUiB8CisJCQlWTUVfUFJPRyB8IFZNRV9EQVRBOworCQlsaXN0X2FkZF90YWlsKCZzbGF2ZV9pbWFnZS0+bGlzdCwKKwkJCQkmZmFrZV9icmlkZ2UtPnNsYXZlX3Jlc291cmNlcyk7CisJfQorCisJLyogQWRkIGxvY2F0aW9uIG1vbml0b3IgdG8gbGlzdCAqLworCUlOSVRfTElTVF9IRUFEKCZmYWtlX2JyaWRnZS0+bG1fcmVzb3VyY2VzKTsKKwlsbSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAobG0gPT0gTlVMTCkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGxvY2F0aW9uIG1vbml0b3IgcmVzb3VyY2Ugc3RydWN0dXJlXG4iKTsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBlcnJfbG07CisJfQorCWxtLT5wYXJlbnQgPSBmYWtlX2JyaWRnZTsKKwltdXRleF9pbml0KCZsbS0+bXR4KTsKKwlsbS0+bG9ja2VkID0gMDsKKwlsbS0+bnVtYmVyID0gMTsKKwlsbS0+bW9uaXRvcnMgPSA0OworCWxpc3RfYWRkX3RhaWwoJmxtLT5saXN0LCAmZmFrZV9icmlkZ2UtPmxtX3Jlc291cmNlcyk7CisKKwlmYWtlX2JyaWRnZS0+c2xhdmVfZ2V0ID0gZmFrZV9zbGF2ZV9nZXQ7CisJZmFrZV9icmlkZ2UtPnNsYXZlX3NldCA9IGZha2Vfc2xhdmVfc2V0OworCWZha2VfYnJpZGdlLT5tYXN0ZXJfZ2V0ID0gZmFrZV9tYXN0ZXJfZ2V0OworCWZha2VfYnJpZGdlLT5tYXN0ZXJfc2V0ID0gZmFrZV9tYXN0ZXJfc2V0OworCWZha2VfYnJpZGdlLT5tYXN0ZXJfcmVhZCA9IGZha2VfbWFzdGVyX3JlYWQ7CisJZmFrZV9icmlkZ2UtPm1hc3Rlcl93cml0ZSA9IGZha2VfbWFzdGVyX3dyaXRlOworCWZha2VfYnJpZGdlLT5tYXN0ZXJfcm13ID0gZmFrZV9tYXN0ZXJfcm13OworCWZha2VfYnJpZGdlLT5pcnFfc2V0ID0gZmFrZV9pcnFfc2V0OworCWZha2VfYnJpZGdlLT5pcnFfZ2VuZXJhdGUgPSBmYWtlX2lycV9nZW5lcmF0ZTsKKwlmYWtlX2JyaWRnZS0+bG1fc2V0ID0gZmFrZV9sbV9zZXQ7CisJZmFrZV9icmlkZ2UtPmxtX2dldCA9IGZha2VfbG1fZ2V0OworCWZha2VfYnJpZGdlLT5sbV9hdHRhY2ggPSBmYWtlX2xtX2F0dGFjaDsKKwlmYWtlX2JyaWRnZS0+bG1fZGV0YWNoID0gZmFrZV9sbV9kZXRhY2g7CisJZmFrZV9icmlkZ2UtPnNsb3RfZ2V0ID0gZmFrZV9zbG90X2dldDsKKwlmYWtlX2JyaWRnZS0+YWxsb2NfY29uc2lzdGVudCA9IGZha2VfYWxsb2NfY29uc2lzdGVudDsKKwlmYWtlX2JyaWRnZS0+ZnJlZV9jb25zaXN0ZW50ID0gZmFrZV9mcmVlX2NvbnNpc3RlbnQ7CisKKwlwcl9pbmZvKCJCb2FyZCBpcyVzIHRoZSBWTUUgc3lzdGVtIGNvbnRyb2xsZXJcbiIsCisJCQkoZ2VvaWQgPT0gMSkgPyAiIiA6ICIgbm90Iik7CisKKwlwcl9pbmZvKCJWTUUgZ2VvZ3JhcGhpY2FsIGFkZHJlc3MgaXMgc2V0IHRvICVkXG4iLCBnZW9pZCk7CisKKwlyZXR2YWwgPSBmYWtlX2NyY3NyX2luaXQoZmFrZV9icmlkZ2UpOworCWlmIChyZXR2YWwpIHsKKwkJcHJfZXJyKCJDUi9DU1IgY29uZmlndXJhdGlvbiBmYWlsZWQuXG4iKTsKKwkJZ290byBlcnJfY3Jjc3I7CisJfQorCisJcmV0dmFsID0gdm1lX3JlZ2lzdGVyX2JyaWRnZShmYWtlX2JyaWRnZSk7CisJaWYgKHJldHZhbCAhPSAwKSB7CisJCXByX2VycigiQ2hpcCBSZWdpc3RyYXRpb24gZmFpbGVkLlxuIik7CisJCWdvdG8gZXJyX3JlZzsKKwl9CisKKwlleGl0X3BvaW50ZXIgPSBmYWtlX2JyaWRnZTsKKworCXJldHVybiAwOworCitlcnJfcmVnOgorCWZha2VfY3Jjc3JfZXhpdChmYWtlX2JyaWRnZSk7CitlcnJfY3Jjc3I6CitlcnJfbG06CisJLyogcmVzb3VyY2VzIGFyZSBzdG9yZWQgaW4gbGluayBsaXN0ICovCisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbiwgJmZha2VfYnJpZGdlLT5sbV9yZXNvdXJjZXMpIHsKKwkJbG0gPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHZtZV9sbV9yZXNvdXJjZSwgbGlzdCk7CisJCWxpc3RfZGVsKHBvcyk7CisJCWtmcmVlKGxtKTsKKwl9CitlcnJfc2xhdmU6CisJLyogcmVzb3VyY2VzIGFyZSBzdG9yZWQgaW4gbGluayBsaXN0ICovCisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbiwgJmZha2VfYnJpZGdlLT5zbGF2ZV9yZXNvdXJjZXMpIHsKKwkJc2xhdmVfaW1hZ2UgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHZtZV9zbGF2ZV9yZXNvdXJjZSwgbGlzdCk7CisJCWxpc3RfZGVsKHBvcyk7CisJCWtmcmVlKHNsYXZlX2ltYWdlKTsKKwl9CitlcnJfbWFzdGVyOgorCS8qIHJlc291cmNlcyBhcmUgc3RvcmVkIGluIGxpbmsgbGlzdCAqLworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG4sICZmYWtlX2JyaWRnZS0+bWFzdGVyX3Jlc291cmNlcykgeworCQltYXN0ZXJfaW1hZ2UgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UsCisJCQkJbGlzdCk7CisJCWxpc3RfZGVsKHBvcyk7CisJCWtmcmVlKG1hc3Rlcl9pbWFnZSk7CisJfQorCisJa2ZyZWUoZmFrZV9kZXZpY2UpOworZXJyX2RyaXZlcjoKKwlrZnJlZShmYWtlX2JyaWRnZSk7CitlcnJfc3RydWN0OgorCXJldHVybiByZXR2YWw7CisKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgZmFrZV9leGl0KHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXBsaXN0OworCXN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICptYXN0ZXJfaW1hZ2U7CisJc3RydWN0IHZtZV9zbGF2ZV9yZXNvdXJjZSAqc2xhdmVfaW1hZ2U7CisJaW50IGk7CisJc3RydWN0IHZtZV9icmlkZ2UgKmZha2VfYnJpZGdlOworCXN0cnVjdCBmYWtlX2RyaXZlciAqYnJpZGdlOworCisJZmFrZV9icmlkZ2UgPSBleGl0X3BvaW50ZXI7CisKKwlicmlkZ2UgPSBmYWtlX2JyaWRnZS0+ZHJpdmVyX3ByaXY7CisKKwlwcl9kZWJ1ZygiRHJpdmVyIGlzIGJlaW5nIHVubG9hZGVkLlxuIik7CisKKwkvKgorCSAqICBTaHV0ZG93biBhbGwgaW5ib3VuZCBhbmQgb3V0Ym91bmQgd2luZG93cy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgRkFLRV9NQVhfTUFTVEVSOyBpKyspCisJCWJyaWRnZS0+bWFzdGVyc1tpXS5lbmFibGVkID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBGQUtFX01BWF9TTEFWRTsgaSsrKQorCQlicmlkZ2UtPnNsYXZlc1tpXS5lbmFibGVkID0gMDsKKworCS8qCisJICogIFNodXRkb3duIExvY2F0aW9uIG1vbml0b3IuCisJICovCisJYnJpZGdlLT5sbV9lbmFibGVkID0gMDsKKworCXZtZV91bnJlZ2lzdGVyX2JyaWRnZShmYWtlX2JyaWRnZSk7CisKKwlmYWtlX2NyY3NyX2V4aXQoZmFrZV9icmlkZ2UpOworCS8qIHJlc291cmNlcyBhcmUgc3RvcmVkIGluIGxpbmsgbGlzdCAqLworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRtcGxpc3QsICZmYWtlX2JyaWRnZS0+c2xhdmVfcmVzb3VyY2VzKSB7CisJCXNsYXZlX2ltYWdlID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCB2bWVfc2xhdmVfcmVzb3VyY2UsIGxpc3QpOworCQlsaXN0X2RlbChwb3MpOworCQlrZnJlZShzbGF2ZV9pbWFnZSk7CisJfQorCisJLyogcmVzb3VyY2VzIGFyZSBzdG9yZWQgaW4gbGluayBsaXN0ICovCisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wbGlzdCwgJmZha2VfYnJpZGdlLT5tYXN0ZXJfcmVzb3VyY2VzKSB7CisJCW1hc3Rlcl9pbWFnZSA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSwKKwkJCQlsaXN0KTsKKwkJbGlzdF9kZWwocG9zKTsKKwkJa2ZyZWUobWFzdGVyX2ltYWdlKTsKKwl9CisKKwlrZnJlZShmYWtlX2JyaWRnZS0+ZHJpdmVyX3ByaXYpOworCisJa2ZyZWUoZmFrZV9icmlkZ2UpOworCisJcm9vdF9kZXZpY2VfdW5yZWdpc3Rlcih2bWVfcm9vdCk7Cit9CisKKworTU9EVUxFX1BBUk1fREVTQyhnZW9pZCwgIlNldCBnZW9ncmFwaGljYWwgYWRkcmVzc2luZyIpOworbW9kdWxlX3BhcmFtKGdlb2lkLCBpbnQsIDApOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkZha2UgVk1FIGJyaWRnZSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoZmFrZV9pbml0KTsKK21vZHVsZV9leGl0KGZha2VfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguYyBiL2RyaXZlcnMvdm1lL2JyaWRnZXMvdm1lX3RzaTE0OC5jCmluZGV4IDRiYzVkNDUuLmZjMWI2MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdm1lL2JyaWRnZXMvdm1lX3RzaTE0OC5jCisrKyBiL2RyaXZlcnMvdm1lL2JyaWRnZXMvdm1lX3RzaTE0OC5jCkBAIC01MCw2ICs1MCw4IEBACiAJeyB9LAogfTsKIAorTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHRzaTE0OF9pZHMpOworCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdHNpMTQ4X2RyaXZlciA9IHsKIAkubmFtZSA9IGRyaXZlcl9uYW1lLAogCS5pZF90YWJsZSA9IHRzaTE0OF9pZHMsCkBAIC0xMDIsNyArMTA0LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCWlmIChzdGF0ICYgVFNJMTQ4X0xDU1JfSU5UU19MTVNbaV0pIHsKIAkJCS8qIFdlIG9ubHkgZW5hYmxlIGludGVycnVwdHMgaWYgdGhlIGNhbGxiYWNrIGlzIHNldCAqLwotCQkJYnJpZGdlLT5sbV9jYWxsYmFja1tpXShpKTsKKwkJCWJyaWRnZS0+bG1fY2FsbGJhY2tbaV0oYnJpZGdlLT5sbV9kYXRhW2ldKTsKIAkJCXNlcnZpY2VkIHw9IFRTSTE0OF9MQ1NSX0lOVENfTE1DW2ldOwogCQl9CiAJfQpAQCAtMjA0Nyw3ICsyMDQ5LDcgQEAKICAqIENhbGxiYWNrIHdpbGwgYmUgcGFzc2VkIHRoZSBtb25pdG9yIHRyaWdnZXJlZC4KICAqLwogc3RhdGljIGludCB0c2kxNDhfbG1fYXR0YWNoKHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UgKmxtLCBpbnQgbW9uaXRvciwKLQl2b2lkICgqY2FsbGJhY2spKGludCkpCisJdm9pZCAoKmNhbGxiYWNrKSh2b2lkICopLCB2b2lkICpkYXRhKQogewogCXUzMiBsbV9jdGwsIHRtcDsKIAlzdHJ1Y3Qgdm1lX2JyaWRnZSAqdHNpMTQ4X2JyaWRnZTsKQEAgLTIwNzcsNiArMjA3OSw3IEBACiAKIAkvKiBBdHRhY2ggY2FsbGJhY2sgKi8KIAlicmlkZ2UtPmxtX2NhbGxiYWNrW21vbml0b3JdID0gY2FsbGJhY2s7CisJYnJpZGdlLT5sbV9kYXRhW21vbml0b3JdID0gZGF0YTsKIAogCS8qIEVuYWJsZSBMb2NhdGlvbiBNb25pdG9yIGludGVycnVwdCAqLwogCXRtcCA9IGlvcmVhZDMyYmUoYnJpZGdlLT5iYXNlICsgVFNJMTQ4X0xDU1JfSU5URU4pOwpAQCAtMjEyNCw2ICsyMTI3LDcgQEAKIAogCS8qIERldGFjaCBjYWxsYmFjayAqLwogCWJyaWRnZS0+bG1fY2FsbGJhY2tbbW9uaXRvcl0gPSBOVUxMOworCWJyaWRnZS0+bG1fZGF0YVttb25pdG9yXSA9IE5VTEw7CiAKIAkvKiBJZiBhbGwgbG9jYXRpb24gbW9uaXRvcnMgZGlzYWJsZWQsIGRpc2FibGUgZ2xvYmFsIExvY2F0aW9uIE1vbml0b3IgKi8KIAlpZiAoKGxtX2VuICYgKFRTSTE0OF9MQ1NSX0lOVFNfTE0wUyB8IFRTSTE0OF9MQ1NSX0lOVFNfTE0xUyB8CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguaCBiL2RyaXZlcnMvdm1lL2JyaWRnZXMvdm1lX3RzaTE0OC5oCmluZGV4IGY1ZWQxNDMuLjA5MzVkODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdm1lL2JyaWRnZXMvdm1lX3RzaTE0OC5oCisrKyBiL2RyaXZlcnMvdm1lL2JyaWRnZXMvdm1lX3RzaTE0OC5oCkBAIC0zOCw3ICszOCw4IEBACiAJdm9pZCBfX2lvbWVtICpiYXNlOwkvKiBCYXNlIEFkZHJlc3Mgb2YgZGV2aWNlIHJlZ2lzdGVycyAqLwogCXdhaXRfcXVldWVfaGVhZF90IGRtYV9xdWV1ZVsyXTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBpYWNrX3F1ZXVlOwotCXZvaWQgKCpsbV9jYWxsYmFja1s0XSkoaW50KTsJLyogQ2FsbGVkIGluIGludGVycnVwdCBoYW5kbGVyICovCisJdm9pZCAoKmxtX2NhbGxiYWNrWzRdKSh2b2lkICopOwkvKiBDYWxsZWQgaW4gaW50ZXJydXB0IGhhbmRsZXIgKi8KKwl2b2lkICpsbV9kYXRhWzRdOwogCXZvaWQgKmNyY3NyX2tlcm5lbDsKIAlkbWFfYWRkcl90IGNyY3NyX2J1czsKIAlzdHJ1Y3Qgdm1lX21hc3Rlcl9yZXNvdXJjZSAqZmx1c2hfaW1hZ2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZtZS92bWUuYyBiL2RyaXZlcnMvdm1lL3ZtZS5jCmluZGV4IDM3YWMwYTUuLjE1YjY0MDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdm1lL3ZtZS5jCisrKyBiL2RyaXZlcnMvdm1lL3ZtZS5jCkBAIC0xMyw4ICsxMyw4IEBACiAgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0zOSw3ICszOSw2IEBACiBzdGF0aWMgTElTVF9IRUFEKHZtZV9idXNfbGlzdCk7CiBzdGF0aWMgREVGSU5FX01VVEVYKHZtZV9idXNlc19sb2NrKTsKIAotc3RhdGljIHZvaWQgX19leGl0IHZtZV9leGl0KHZvaWQpOwogc3RhdGljIGludCBfX2luaXQgdm1lX2luaXQodm9pZCk7CiAKIHN0YXRpYyBzdHJ1Y3Qgdm1lX2RldiAqZGV2X3RvX3ZtZV9kZXYoc3RydWN0IGRldmljZSAqZGV2KQpAQCAtMTMyMSw3ICsxMzIwLDcgQEAKIEVYUE9SVF9TWU1CT0wodm1lX2xtX2dldCk7CiAKIGludCB2bWVfbG1fYXR0YWNoKHN0cnVjdCB2bWVfcmVzb3VyY2UgKnJlc291cmNlLCBpbnQgbW9uaXRvciwKLQl2b2lkICgqY2FsbGJhY2spKGludCkpCisJdm9pZCAoKmNhbGxiYWNrKSh2b2lkICopLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCB2bWVfYnJpZGdlICpicmlkZ2UgPSBmaW5kX2JyaWRnZShyZXNvdXJjZSk7CiAJc3RydWN0IHZtZV9sbV9yZXNvdXJjZSAqbG07CkBAIC0xMzM4LDcgKzEzMzcsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyZXR1cm4gYnJpZGdlLT5sbV9hdHRhY2gobG0sIG1vbml0b3IsIGNhbGxiYWNrKTsKKwlyZXR1cm4gYnJpZGdlLT5sbV9hdHRhY2gobG0sIG1vbml0b3IsIGNhbGxiYWNrLCBkYXRhKTsKIH0KIEVYUE9SVF9TWU1CT0wodm1lX2xtX2F0dGFjaCk7CiAKQEAgLTE2MjIsMjUgKzE2MjEsMTAgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgaW50IHZtZV9idXNfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlpbnQgcmV0dmFsID0gLUVOT0RFVjsKLQlzdHJ1Y3Qgdm1lX2RyaXZlciAqZHJpdmVyOwotCXN0cnVjdCB2bWVfZGV2ICp2ZGV2ID0gZGV2X3RvX3ZtZV9kZXYoZGV2KTsKLQotCWRyaXZlciA9IGRldi0+cGxhdGZvcm1fZGF0YTsKLQotCWlmIChkcml2ZXItPnJlbW92ZSAhPSBOVUxMKQotCQlyZXR2YWwgPSBkcml2ZXItPnJlbW92ZSh2ZGV2KTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KIHN0cnVjdCBidXNfdHlwZSB2bWVfYnVzX3R5cGUgPSB7CiAJLm5hbWUgPSAidm1lIiwKIAkubWF0Y2ggPSB2bWVfYnVzX21hdGNoLAogCS5wcm9iZSA9IHZtZV9idXNfcHJvYmUsCi0JLnJlbW92ZSA9IHZtZV9idXNfcmVtb3ZlLAogfTsKIEVYUE9SVF9TWU1CT0wodm1lX2J1c190eXBlKTsKIApAQCAtMTY0OCwxMSArMTYzMiw0IEBACiB7CiAJcmV0dXJuIGJ1c19yZWdpc3Rlcigmdm1lX2J1c190eXBlKTsKIH0KLQotc3RhdGljIHZvaWQgX19leGl0IHZtZV9leGl0KHZvaWQpCi17Ci0JYnVzX3VucmVnaXN0ZXIoJnZtZV9idXNfdHlwZSk7Ci19Ci0KIHN1YnN5c19pbml0Y2FsbCh2bWVfaW5pdCk7Ci1tb2R1bGVfZXhpdCh2bWVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZtZS92bWVfYnJpZGdlLmggYi9kcml2ZXJzL3ZtZS92bWVfYnJpZGdlLmgKaW5kZXggY2I4MjQ2Zi4uMjY2MmU5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy92bWUvdm1lX2JyaWRnZS5oCisrKyBiL2RyaXZlcnMvdm1lL3ZtZV9icmlkZ2UuaApAQCAtMTYwLDcgKzE2MCw4IEBACiAJaW50ICgqbG1fc2V0KSAoc3RydWN0IHZtZV9sbV9yZXNvdXJjZSAqLCB1bnNpZ25lZCBsb25nIGxvbmcsIHUzMiwgdTMyKTsKIAlpbnQgKCpsbV9nZXQpIChzdHJ1Y3Qgdm1lX2xtX3Jlc291cmNlICosIHVuc2lnbmVkIGxvbmcgbG9uZyAqLCB1MzIgKiwKIAkJdTMyICopOwotCWludCAoKmxtX2F0dGFjaCkgKHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UgKiwgaW50LCB2b2lkICgqY2FsbGJhY2spKGludCkpOworCWludCAoKmxtX2F0dGFjaCkoc3RydWN0IHZtZV9sbV9yZXNvdXJjZSAqLCBpbnQsCisJCQkgdm9pZCAoKmNhbGxiYWNrKSh2b2lkICopLCB2b2lkICopOwogCWludCAoKmxtX2RldGFjaCkgKHN0cnVjdCB2bWVfbG1fcmVzb3VyY2UgKiwgaW50KTsKIAogCS8qIENSL0NTUiBzcGFjZSBmdW5jdGlvbnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvc2xhdmVzL3cxX3RoZXJtLmMgYi9kcml2ZXJzL3cxL3NsYXZlcy93MV90aGVybS5jCmluZGV4IDU4MWEzMDAuLjgyNjExZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvc2xhdmVzL3cxX3RoZXJtLmMKKysrIGIvZHJpdmVycy93MS9zbGF2ZXMvdzFfdGhlcm0uYwpAQCAtNjYsNyArNjYsNyBAQAogCiAvKiByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIHJlZmNudCBpbiB0aGUgZmFtaWx5IGRhdGEgKi8KICNkZWZpbmUgVEhFUk1fUkVGQ05UKGZhbWlseV9kYXRhKSBcCi0JKCYoKHN0cnVjdCB3MV90aGVybV9mYW1pbHlfZGF0YSopZmFtaWx5X2RhdGEpLT5yZWZjbnQpCisJKCYoKHN0cnVjdCB3MV90aGVybV9mYW1pbHlfZGF0YSAqKWZhbWlseV9kYXRhKS0+cmVmY250KQogCiBzdGF0aWMgaW50IHcxX3RoZXJtX2FkZF9zbGF2ZShzdHJ1Y3QgdzFfc2xhdmUgKnNsKQogewpAQCAtODEsNyArODEsOCBAQAogc3RhdGljIHZvaWQgdzFfdGhlcm1fcmVtb3ZlX3NsYXZlKHN0cnVjdCB3MV9zbGF2ZSAqc2wpCiB7CiAJaW50IHJlZmNudCA9IGF0b21pY19zdWJfcmV0dXJuKDEsIFRIRVJNX1JFRkNOVChzbC0+ZmFtaWx5X2RhdGEpKTsKLQl3aGlsZShyZWZjbnQpIHsKKworCXdoaWxlIChyZWZjbnQpIHsKIAkJbXNsZWVwKDEwMDApOwogCQlyZWZjbnQgPSBhdG9taWNfcmVhZChUSEVSTV9SRUZDTlQoc2wtPmZhbWlseV9kYXRhKSk7CiAJfQpAQCAtMTUxLDggKzE1Miw3IEBACiAJLmZvcHMgPSAmdzFfdGhlcm1fZm9wcywKIH07CiAKLXN0cnVjdCB3MV90aGVybV9mYW1pbHlfY29udmVydGVyCi17CitzdHJ1Y3QgdzFfdGhlcm1fZmFtaWx5X2NvbnZlcnRlciB7CiAJdTgJCQlicm9rZW47CiAJdTE2CQkJcmVzZXJ2ZWQ7CiAJc3RydWN0IHcxX2ZhbWlseQkqZjsKQEAgLTI5Myw3ICsyOTMsNyBAQAogCXVpbnQ4X3QgcHJlY2lzaW9uX2JpdHM7CiAJdWludDhfdCBtYXNrID0gMHg2MDsKIAotCWlmKHZhbCA+IDEyIHx8IHZhbCA8IDkpIHsKKwlpZiAodmFsID4gMTIgfHwgdmFsIDwgOSkgewogCQlwcl93YXJuKCJVbnN1cHBvcnRlZCBwcmVjaXNpb25cbiIpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMzM2LDcgKzMzNiw4IEBACiAKIAkJCS8qIHJlYWQgdmFsdWVzIHRvIG9ubHkgYWx0ZXIgcHJlY2lzaW9uIGJpdHMgKi8KIAkJCXcxX3dyaXRlXzgoZGV2LCBXMV9SRUFEX1NDUkFUQ0hQQUQpOwotCQkJaWYgKChjb3VudCA9IHcxX3JlYWRfYmxvY2soZGV2LCByb20sIDkpKSAhPSA5KQorCQkJY291bnQgPSB3MV9yZWFkX2Jsb2NrKGRldiwgcm9tLCA5KTsKKwkJCWlmIChjb3VudCAhPSA5KQogCQkJCWRldl93YXJuKGRldmljZSwgIncxX3JlYWRfYmxvY2soKSByZXR1cm5lZCAldSBpbnN0ZWFkIG9mIDkuXG4iLAljb3VudCk7CiAKIAkJCWNyYyA9IHcxX2NhbGNfY3JjOChyb20sIDgpOwpAQCAtMzY2LDYgKzM2Nyw3IEBACiBzdGF0aWMgaW5saW5lIGludCB3MV9EUzE4QjIwX2NvbnZlcnRfdGVtcCh1OCByb21bOV0pCiB7CiAJczE2IHQgPSBsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKXJvbSk7CisKIAlyZXR1cm4gdCoxMDAwLzE2OwogfQogCkBAIC00MTUsNyArNDE3LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3MV90aGVybV9mYW1pbGllcyk7ICsraSkgewogCQlpZiAodzFfdGhlcm1fZmFtaWxpZXNbaV0uZi0+ZmlkID09IHNsLT5mYW1pbHktPmZpZCkgewogCQkJLyogemVybyB2YWx1ZSBpbmRpY2F0ZXMgdG8gd3JpdGUgY3VycmVudCBjb25maWd1cmF0aW9uIHRvIGVlcHJvbSAqLwotCQkJaWYgKDAgPT0gdmFsKQorCQkJaWYgKHZhbCA9PSAwKQogCQkJCXJldCA9IHcxX3RoZXJtX2ZhbWlsaWVzW2ldLmVlcHJvbShkZXZpY2UpOwogCQkJZWxzZQogCQkJCXJldCA9IHcxX3RoZXJtX2ZhbWlsaWVzW2ldLnByZWNpc2lvbihkZXZpY2UsIHZhbCk7CkBAIC00MzksOCArNDQxLDcgQEAKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gcG9zdF91bmxvY2s7CiAKLQlpZighc2wtPmZhbWlseV9kYXRhKQotCXsKKwlpZiAoIXNsLT5mYW1pbHlfZGF0YSkgewogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIHByZV91bmxvY2s7CiAJfQpAQCAtNDk1LDcgKzQ5Niw4IEBACiAJCQlpZiAoIXcxX3Jlc2V0X3NlbGVjdF9zbGF2ZShzbCkpIHsKIAogCQkJCXcxX3dyaXRlXzgoZGV2LCBXMV9SRUFEX1NDUkFUQ0hQQUQpOwotCQkJCWlmICgoY291bnQgPSB3MV9yZWFkX2Jsb2NrKGRldiwgcm9tLCA5KSkgIT0gOSkgeworCQkJCWNvdW50ID0gdzFfcmVhZF9ibG9jayhkZXYsIHJvbSwgOSk7CisJCQkJaWYgKGNvdW50ICE9IDkpIHsKIAkJCQkJZGV2X3dhcm4oZGV2aWNlLCAidzFfcmVhZF9ibG9jaygpICIKIAkJCQkJCSJyZXR1cm5lZCAldSBpbnN0ZWFkIG9mIDkuXG4iLAogCQkJCQkJY291bnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MS5jIGIvZHJpdmVycy93MS93MS5jCmluZGV4IGJiMzQzNjIuLmUyMTNjNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvdzEuYworKysgYi9kcml2ZXJzL3cxL3cxLmMKQEAgLTUzLDggKzUzLDggQEAKIG1vZHVsZV9wYXJhbV9uYW1lZCh0aW1lb3V0LCB3MV90aW1lb3V0LCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyh0aW1lb3V0LCAidGltZSBpbiBzZWNvbmRzIGJldHdlZW4gYXV0b21hdGljIHNsYXZlIHNlYXJjaGVzIik7CiBtb2R1bGVfcGFyYW1fbmFtZWQodGltZW91dF91cywgdzFfdGltZW91dF91cywgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0ModGltZW91dCwgInRpbWUgaW4gbWljcm9zZWNvbmRzIGJldHdlZW4gYXV0b21hdGljIHNsYXZlIgotCQkgICAgICAgICAgIiBzZWFyY2hlcyIpOworTU9EVUxFX1BBUk1fREVTQyh0aW1lb3V0X3VzLAorCQkgInRpbWUgaW4gbWljcm9zZWNvbmRzIGJldHdlZW4gYXV0b21hdGljIHNsYXZlIHNlYXJjaGVzIik7CiAvKiBBIHNlYXJjaCBzdG9wcyB3aGVuIHcxX21heF9zbGF2ZV9jb3VudCBkZXZpY2VzIGhhdmUgYmVlbiBmb3VuZCBpbiB0aGF0CiAgKiBzZWFyY2guICBUaGUgbmV4dCBzZWFyY2ggd2lsbCBzdGFydCBvdmVyIGFuZCBkZXRlY3QgdGhlIHNhbWUgc2V0IG9mIGRldmljZXMKICAqIG9uIGEgc3RhdGljIDEtd2lyZSBidXMuICBNZW1vcnkgaXMgbm90IGFsbG9jYXRlZCBiYXNlZCBvbiB0aGlzIG51bWJlciwganVzdApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnIGIvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnCmluZGV4IDFiZmZlMDAuLjUwZGJhYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZworKysgYi9kcml2ZXJzL3dhdGNoZG9nL0tjb25maWcKQEAgLTE1Miw2ICsxNTIsMTkgQEAKIAogCSAgVGhpcyBkcml2ZXIgY2FuIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBUaGUgbW9kdWxlIG5hbWUgaXMgdGFuZ294X3dkdC4KIAorY29uZmlnIFdEQVRfV0RUCisJdHJpc3RhdGUgIkFDUEkgV2F0Y2hkb2cgQWN0aW9uIFRhYmxlIChXREFUKSIKKwlkZXBlbmRzIG9uIEFDUEkKKwlzZWxlY3QgQUNQSV9XQVRDSERPRworCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGFkZHMgc3VwcG9ydCBmb3Igc3lzdGVtcyB3aXRoIEFDUEkgV2F0Y2hkb2cgQWN0aW9uCisJICBUYWJsZSAoV0RBVCkgdGFibGUuIFNlcnZlcnMgdHlwaWNhbGx5IGhhdmUgdGhpcyBidXQgaXQgY2FuIGJlCisJICBmb3VuZCBvbiBzb21lIGRlc2t0b3AgbWFjaGluZXMgYXMgd2VsbC4gVGhpcyBkcml2ZXIgd2lsbCB0YWtlCisJICBvdmVyIHRoZSBuYXRpdmUgaVRDTyB3YXRjaGRvZyBkcml2ZXIgZm91bmQgb24gbWFueSBJbnRlbCBDUFVzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgd2RhdF93ZHQuCisKIGNvbmZpZyBXTTgzMVhfV0FUQ0hET0cKIAl0cmlzdGF0ZSAiV004MzF4IHdhdGNoZG9nIgogCWRlcGVuZHMgb24gTUZEX1dNODMxWApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9NYWtlZmlsZSBiL2RyaXZlcnMvd2F0Y2hkb2cvTWFrZWZpbGUKaW5kZXggYzIyYWQzZS4uY2JhMDA0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3dhdGNoZG9nL01ha2VmaWxlCkBAIC0yMDIsNiArMjAyLDcgQEAKIG9iai0kKENPTkZJR19EQTkwNjNfV0FUQ0hET0cpICs9IGRhOTA2M193ZHQubwogb2JqLSQoQ09ORklHX0dQSU9fV0FUQ0hET0cpCSs9IGdwaW9fd2R0Lm8KIG9iai0kKENPTkZJR19UQU5HT1hfV0FUQ0hET0cpICs9IHRhbmdveF93ZHQubworb2JqLSQoQ09ORklHX1dEQVRfV0RUKSArPSB3ZGF0X3dkdC5vCiBvYmotJChDT05GSUdfV004MzFYX1dBVENIRE9HKSArPSB3bTgzMXhfd2R0Lm8KIG9iai0kKENPTkZJR19XTTgzNTBfV0FUQ0hET0cpICs9IHdtODM1MF93ZHQubwogb2JqLSQoQ09ORklHX01BWDYzWFhfV0FUQ0hET0cpICs9IG1heDYzeHhfd2R0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvcGN3ZF91c2IuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvcGN3ZF91c2IuYwppbmRleCA2ODk1MmQ5Li45OWViZjZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3Bjd2RfdXNiLmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9wY3dkX3VzYi5jCkBAIC02NjYsMTAgKzY2Niw4IEBACiAKIAkvKiBhbGxvY2F0ZSB0aGUgdXJiJ3MgKi8KIAl1c2JfcGN3ZC0+aW50cl91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghdXNiX3Bjd2QtPmludHJfdXJiKSB7Ci0JCXByX2VycigiT3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCF1c2JfcGN3ZC0+aW50cl91cmIpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCiAJLyogaW5pdGlhbGlzZSB0aGUgaW50ciB1cmIncyAqLwogCXVzYl9maWxsX2ludF91cmIodXNiX3Bjd2QtPmludHJfdXJiLCB1ZGV2LCBwaXBlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy93ZGF0X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy93ZGF0X3dkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NzNlM2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3dhdGNoZG9nL3dkYXRfd2R0LmMKQEAgLTAsMCArMSw1MjYgQEAKKy8qCisgKiBBQ1BJIEhhcmR3YXJlIFdhdGNoZG9nIChXREFUKSBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2LCBJbnRlbCBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBNaWthIFdlc3RlcmJlcmcgPG1pa2Eud2VzdGVyYmVyZ0BsaW51eC5pbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKworI2RlZmluZSBNQVhfV0RBVF9BQ1RJT05TIEFDUElfV0RBVF9BQ1RJT05fUkVTRVJWRUQKKworLyoqCisgKiBzdHJ1Y3Qgd2RhdF9pbnN0cnVjdGlvbiAtIFNpbmdsZSBBQ1BJIFdEQVQgaW5zdHJ1Y3Rpb24KKyAqIEBlbnRyeTogQ29weSBvZiB0aGUgQUNQSSB0YWJsZSBpbnN0cnVjdGlvbgorICogQHJlZzogUmVnaXN0ZXIgdGhlIGluc3RydWN0aW9uIGlzIGFjY2Vzc2luZworICogQG5vZGU6IE5leHQgaW5zdHJ1Y3Rpb24gaW4gYWN0aW9uIHNlcXVlbmNlCisgKi8KK3N0cnVjdCB3ZGF0X2luc3RydWN0aW9uIHsKKwlzdHJ1Y3QgYWNwaV93ZGF0X2VudHJ5IGVudHJ5OworCXZvaWQgX19pb21lbSAqcmVnOworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKK307CisKKy8qKgorICogc3RydWN0IHdkYXRfd2R0IC0gQUNQSSBXREFUIHdhdGNoZG9nIGRldmljZQorICogQHBkZXY6IFBhcmVudCBwbGF0Zm9ybSBkZXZpY2UKKyAqIEB3ZGQ6IFdhdGNoZG9nIGNvcmUgZGV2aWNlCisgKiBAcGVyaW9kOiBIb3cgbG9uZyBpcyBvbmUgd2F0Y2hkb2cgcGVyaW9kIGluIG1zCisgKiBAc3RvcHBlZF9pbl9zbGVlcDogSXMgdGhpcyB3YXRjaGRvZyBzdG9wcGVkIGJ5IHRoZSBmaXJtd2FyZSBpbiBTMS1TNQorICogQHN0b3BwZWQ6IFdhcyB0aGUgd2F0Y2hkb2cgc3RvcHBlZCBieSB0aGUgZHJpdmVyIGluIHN1c3BlbmQKKyAqIEBhY3Rpb25zOiBBbiBhcnJheSBvZiBpbnN0cnVjdGlvbiBsaXN0cyBpbmRleGVkIGJ5IGFuIGFjdGlvbiBudW1iZXIgZnJvbQorICogICAgICAgICAgIHRoZSBXREFUIHRhYmxlLiBUaGVyZSBjYW4gYmUgJU5VTEwgZW50cmllcyBmb3Igbm90IGltcGxlbWVudGVkCisgKiAgICAgICAgICAgYWN0aW9ucy4KKyAqLworc3RydWN0IHdkYXRfd2R0IHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXN0cnVjdCB3YXRjaGRvZ19kZXZpY2Ugd2RkOworCXVuc2lnbmVkIGludCBwZXJpb2Q7CisJYm9vbCBzdG9wcGVkX2luX3NsZWVwOworCWJvb2wgc3RvcHBlZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICppbnN0cnVjdGlvbnNbTUFYX1dEQVRfQUNUSU9OU107Cit9OworCisjZGVmaW5lIHRvX3dkYXRfd2R0KHdkZCkgY29udGFpbmVyX29mKHdkZCwgc3RydWN0IHdkYXRfd2R0LCB3ZGQpCisKK3N0YXRpYyBib29sIG5vd2F5b3V0ID0gV0FUQ0hET0dfTk9XQVlPVVQ7Cittb2R1bGVfcGFyYW0obm93YXlvdXQsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD0iCisJCSBfX01PRFVMRV9TVFJJTkcoV0FUQ0hET0dfTk9XQVlPVVQpICIpIik7CisKK3N0YXRpYyBpbnQgd2RhdF93ZHRfcmVhZChzdHJ1Y3Qgd2RhdF93ZHQgKndkYXQsCisJIGNvbnN0IHN0cnVjdCB3ZGF0X2luc3RydWN0aW9uICppbnN0ciwgdTMyICp2YWx1ZSkKK3sKKwljb25zdCBzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgKmdhcyA9ICZpbnN0ci0+ZW50cnkucmVnaXN0ZXJfcmVnaW9uOworCisJc3dpdGNoIChnYXMtPmFjY2Vzc193aWR0aCkgeworCWNhc2UgMToKKwkJKnZhbHVlID0gaW9yZWFkOChpbnN0ci0+cmVnKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkqdmFsdWUgPSBpb3JlYWQxNihpbnN0ci0+cmVnKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQkqdmFsdWUgPSBpb3JlYWQzMihpbnN0ci0+cmVnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X2RiZygmd2RhdC0+cGRldi0+ZGV2LCAiUmVhZCAlI3ggZnJvbSAweCUwOGxseFxuIiwgKnZhbHVlLAorCQlnYXMtPmFkZHJlc3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2RhdF93ZHRfd3JpdGUoc3RydWN0IHdkYXRfd2R0ICp3ZGF0LAorCWNvbnN0IHN0cnVjdCB3ZGF0X2luc3RydWN0aW9uICppbnN0ciwgdTMyIHZhbHVlKQoreworCWNvbnN0IHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqZ2FzID0gJmluc3RyLT5lbnRyeS5yZWdpc3Rlcl9yZWdpb247CisKKwlzd2l0Y2ggKGdhcy0+YWNjZXNzX3dpZHRoKSB7CisJY2FzZSAxOgorCQlpb3dyaXRlOCgodTgpdmFsdWUsIGluc3RyLT5yZWcpOworCQlicmVhazsKKwljYXNlIDI6CisJCWlvd3JpdGUxNigodTE2KXZhbHVlLCBpbnN0ci0+cmVnKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlpb3dyaXRlMzIodmFsdWUsIGluc3RyLT5yZWcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfZGJnKCZ3ZGF0LT5wZGV2LT5kZXYsICJXcm90ZSAlI3ggdG8gMHglMDhsbHhcbiIsIHZhbHVlLAorCQlnYXMtPmFkZHJlc3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2RhdF93ZHRfcnVuX2FjdGlvbihzdHJ1Y3Qgd2RhdF93ZHQgKndkYXQsIHVuc2lnbmVkIGludCBhY3Rpb24sCisJCQkgICAgICAgdTMyIHBhcmFtLCB1MzIgKnJldHZhbCkKK3sKKwlzdHJ1Y3Qgd2RhdF9pbnN0cnVjdGlvbiAqaW5zdHI7CisKKwlpZiAoYWN0aW9uID49IEFSUkFZX1NJWkUod2RhdC0+aW5zdHJ1Y3Rpb25zKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXdkYXQtPmluc3RydWN0aW9uc1thY3Rpb25dKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlkZXZfZGJnKCZ3ZGF0LT5wZGV2LT5kZXYsICJSdW5uaW5nIGFjdGlvbiAlI3hcbiIsIGFjdGlvbik7CisKKwkvKiBSdW4gZWFjaCBpbnN0cnVjdGlvbiBzZXF1ZW50aWFsbHkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGluc3RyLCB3ZGF0LT5pbnN0cnVjdGlvbnNbYWN0aW9uXSwgbm9kZSkgeworCQljb25zdCBzdHJ1Y3QgYWNwaV93ZGF0X2VudHJ5ICplbnRyeSA9ICZpbnN0ci0+ZW50cnk7CisJCWNvbnN0IHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqZ2FzOworCQl1MzIgZmxhZ3MsIHZhbHVlLCBtYXNrLCB4LCB5OworCQlib29sIHByZXNlcnZlOworCQlpbnQgcmV0OworCisJCWdhcyA9ICZlbnRyeS0+cmVnaXN0ZXJfcmVnaW9uOworCisJCXByZXNlcnZlID0gZW50cnktPmluc3RydWN0aW9uICYgQUNQSV9XREFUX1BSRVNFUlZFX1JFR0lTVEVSOworCQlmbGFncyA9IGVudHJ5LT5pbnN0cnVjdGlvbiAmIH5BQ1BJX1dEQVRfUFJFU0VSVkVfUkVHSVNURVI7CisJCXZhbHVlID0gZW50cnktPnZhbHVlOworCQltYXNrID0gZW50cnktPm1hc2s7CisKKwkJc3dpdGNoIChmbGFncykgeworCQljYXNlIEFDUElfV0RBVF9SRUFEX1ZBTFVFOgorCQkJcmV0ID0gd2RhdF93ZHRfcmVhZCh3ZGF0LCBpbnN0ciwgJngpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQkJeCA+Pj0gZ2FzLT5iaXRfb2Zmc2V0OworCQkJeCAmPSBtYXNrOworCQkJaWYgKHJldHZhbCkKKwkJCQkqcmV0dmFsID0geCA9PSB2YWx1ZTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9XREFUX1JFQURfQ09VTlRET1dOOgorCQkJcmV0ID0gd2RhdF93ZHRfcmVhZCh3ZGF0LCBpbnN0ciwgJngpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQkJeCA+Pj0gZ2FzLT5iaXRfb2Zmc2V0OworCQkJeCAmPSBtYXNrOworCQkJaWYgKHJldHZhbCkKKwkJCQkqcmV0dmFsID0geDsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9XREFUX1dSSVRFX1ZBTFVFOgorCQkJeCA9IHZhbHVlICYgbWFzazsKKwkJCXggPDw9IGdhcy0+Yml0X29mZnNldDsKKwkJCWlmIChwcmVzZXJ2ZSkgeworCQkJCXJldCA9IHdkYXRfd2R0X3JlYWQod2RhdCwgaW5zdHIsICZ5KTsKKwkJCQlpZiAocmV0KQorCQkJCQlyZXR1cm4gcmV0OworCQkJCXkgPSB5ICYgfihtYXNrIDw8IGdhcy0+Yml0X29mZnNldCk7CisJCQkJeCB8PSB5OworCQkJfQorCQkJcmV0ID0gd2RhdF93ZHRfd3JpdGUod2RhdCwgaW5zdHIsIHgpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1dEQVRfV1JJVEVfQ09VTlRET1dOOgorCQkJeCA9IHBhcmFtOworCQkJeCAmPSBtYXNrOworCQkJeCA8PD0gZ2FzLT5iaXRfb2Zmc2V0OworCQkJaWYgKHByZXNlcnZlKSB7CisJCQkJcmV0ID0gd2RhdF93ZHRfcmVhZCh3ZGF0LCBpbnN0ciwgJnkpOworCQkJCWlmIChyZXQpCisJCQkJCXJldHVybiByZXQ7CisJCQkJeSA9IHkgJiB+KG1hc2sgPDwgZ2FzLT5iaXRfb2Zmc2V0KTsKKwkJCQl4IHw9IHk7CisJCQl9CisJCQlyZXQgPSB3ZGF0X3dkdF93cml0ZSh3ZGF0LCBpbnN0ciwgeCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZGV2X2Vycigmd2RhdC0+cGRldi0+ZGV2LCAiVW5rbm93biBpbnN0cnVjdGlvbjogJXVcbiIsCisJCQkJZmxhZ3MpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3ZGF0X3dkdF9lbmFibGVfcmVib290KHN0cnVjdCB3ZGF0X3dkdCAqd2RhdCkKK3sKKwlpbnQgcmV0OworCisJLyoKKwkgKiBXREFUIHNwZWNpZmljYXRpb24gc2F5cyB0aGF0IHRoZSB3YXRjaGRvZyBpcyByZXF1aXJlZCB0byByZWJvb3QKKwkgKiB0aGUgc3lzdGVtIHdoZW4gaXQgZmlyZXMuIEhvd2V2ZXIsIGl0IGFsc28gc3RhdGVzIHRoYXQgaXQgaXMKKwkgKiByZWNvbW1lZGVkIHRvIG1ha2UgaXQgY29uZmlndXJhYmxlIHRocm91Z2ggaGFyZHdhcmUgcmVnaXN0ZXIuIFdlCisJICogZW5hYmxlIHJlYm9vdCBub3cgaWYgaXQgaXMgY29uZmlncmFibGUsIGp1c3QgaW4gY2FzZS4KKwkgKi8KKwlyZXQgPSB3ZGF0X3dkdF9ydW5fYWN0aW9uKHdkYXQsIEFDUElfV0RBVF9TRVRfUkVCT09ULCAwLCBOVUxMKTsKKwlpZiAocmV0ICYmIHJldCAhPSAtRU9QTk9UU1VQUCkgeworCQlkZXZfZXJyKCZ3ZGF0LT5wZGV2LT5kZXYsCisJCQkiRmFpbGVkIHRvIGVuYWJsZSByZWJvb3Qgd2hlbiB3YXRjaGRvZyB0cmlnZ2Vyc1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHdkYXRfd2R0X2Jvb3Rfc3RhdHVzKHN0cnVjdCB3ZGF0X3dkdCAqd2RhdCkKK3sKKwl1MzIgYm9vdF9zdGF0dXMgPSAwOworCWludCByZXQ7CisKKwlyZXQgPSB3ZGF0X3dkdF9ydW5fYWN0aW9uKHdkYXQsIEFDUElfV0RBVF9HRVRfU1RBVFVTLCAwLCAmYm9vdF9zdGF0dXMpOworCWlmIChyZXQgJiYgcmV0ICE9IC1FT1BOT1RTVVBQKSB7CisJCWRldl9lcnIoJndkYXQtPnBkZXYtPmRldiwgIkZhaWxlZCB0byByZWFkIGJvb3Qgc3RhdHVzXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChib290X3N0YXR1cykKKwkJd2RhdC0+d2RkLmJvb3RzdGF0dXMgPSBXRElPRl9DQVJEUkVTRVQ7CisKKwkvKiBDbGVhciB0aGUgYm9vdCBzdGF0dXMgaW4gY2FzZSBCSU9TIGRpZCBub3QgZG8gaXQgKi8KKwlyZXQgPSB3ZGF0X3dkdF9ydW5fYWN0aW9uKHdkYXQsIEFDUElfV0RBVF9TRVRfU1RBVFVTLCAwLCBOVUxMKTsKKwlpZiAocmV0ICYmIHJldCAhPSAtRU9QTk9UU1VQUCkKKwkJZGV2X2Vycigmd2RhdC0+cGRldi0+ZGV2LCAiRmFpbGVkIHRvIGNsZWFyIGJvb3Qgc3RhdHVzXG4iKTsKK30KKworc3RhdGljIHZvaWQgd2RhdF93ZHRfc2V0X3J1bm5pbmcoc3RydWN0IHdkYXRfd2R0ICp3ZGF0KQoreworCXUzMiBydW5uaW5nID0gMDsKKwlpbnQgcmV0OworCisJcmV0ID0gd2RhdF93ZHRfcnVuX2FjdGlvbih3ZGF0LCBBQ1BJX1dEQVRfR0VUX1JVTk5JTkdfU1RBVEUsIDAsCisJCQkJICAmcnVubmluZyk7CisJaWYgKHJldCAmJiByZXQgIT0gLUVPUE5PVFNVUFApCisJCWRldl9lcnIoJndkYXQtPnBkZXYtPmRldiwgIkZhaWxlZCB0byByZWFkIHJ1bm5pbmcgc3RhdGVcbiIpOworCisJaWYgKHJ1bm5pbmcpCisJCXNldF9iaXQoV0RPR19IV19SVU5OSU5HLCAmd2RhdC0+d2RkLnN0YXR1cyk7Cit9CisKK3N0YXRpYyBpbnQgd2RhdF93ZHRfc3RhcnQoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RkKQoreworCXJldHVybiB3ZGF0X3dkdF9ydW5fYWN0aW9uKHRvX3dkYXRfd2R0KHdkZCksCisJCQkJICAgQUNQSV9XREFUX1NFVF9SVU5OSU5HX1NUQVRFLCAwLCBOVUxMKTsKK30KKworc3RhdGljIGludCB3ZGF0X3dkdF9zdG9wKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCkKK3sKKwlyZXR1cm4gd2RhdF93ZHRfcnVuX2FjdGlvbih0b193ZGF0X3dkdCh3ZGQpLAorCQkJCSAgIEFDUElfV0RBVF9TRVRfU1RPUFBFRF9TVEFURSwgMCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgd2RhdF93ZHRfcGluZyhzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZGQpCit7CisJcmV0dXJuIHdkYXRfd2R0X3J1bl9hY3Rpb24odG9fd2RhdF93ZHQod2RkKSwgQUNQSV9XREFUX1JFU0VULCAwLCBOVUxMKTsKK30KKworc3RhdGljIGludCB3ZGF0X3dkdF9zZXRfdGltZW91dChzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZGQsCisJCQkJdW5zaWduZWQgaW50IHRpbWVvdXQpCit7CisJc3RydWN0IHdkYXRfd2R0ICp3ZGF0ID0gdG9fd2RhdF93ZHQod2RkKTsKKwl1bnNpZ25lZCBpbnQgcGVyaW9kczsKKwlpbnQgcmV0OworCisJcGVyaW9kcyA9IHRpbWVvdXQgKiAxMDAwIC8gd2RhdC0+cGVyaW9kOworCXJldCA9IHdkYXRfd2R0X3J1bl9hY3Rpb24od2RhdCwgQUNQSV9XREFUX1NFVF9DT1VOVERPV04sIHBlcmlvZHMsIE5VTEwpOworCWlmICghcmV0KQorCQl3ZGQtPnRpbWVvdXQgPSB0aW1lb3V0OworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgd2RhdF93ZHRfZ2V0X3RpbWVsZWZ0KHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCkKK3sKKwlzdHJ1Y3Qgd2RhdF93ZHQgKndkYXQgPSB0b193ZGF0X3dkdCh3ZGQpOworCXUzMiBwZXJpb2RzID0gMDsKKworCXdkYXRfd2R0X3J1bl9hY3Rpb24od2RhdCwgQUNQSV9XREFUX0dFVF9DT1VOVERPV04sIDAsICZwZXJpb2RzKTsKKwlyZXR1cm4gcGVyaW9kcyAqIHdkYXQtPnBlcmlvZCAvIDEwMDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyB3ZGF0X3dkdF9pbmZvID0geworCS5vcHRpb25zID0gV0RJT0ZfU0VUVElNRU9VVCB8IFdESU9GX0tFRVBBTElWRVBJTkcgfCBXRElPRl9NQUdJQ0NMT1NFLAorCS5maXJtd2FyZV92ZXJzaW9uID0gMCwKKwkuaWRlbnRpdHkgPSAid2RhdF93ZHQiLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB3YXRjaGRvZ19vcHMgd2RhdF93ZHRfb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5zdGFydCA9IHdkYXRfd2R0X3N0YXJ0LAorCS5zdG9wID0gd2RhdF93ZHRfc3RvcCwKKwkucGluZyA9IHdkYXRfd2R0X3BpbmcsCisJLnNldF90aW1lb3V0ID0gd2RhdF93ZHRfc2V0X3RpbWVvdXQsCisJLmdldF90aW1lbGVmdCA9IHdkYXRfd2R0X2dldF90aW1lbGVmdCwKK307CisKK3N0YXRpYyBpbnQgd2RhdF93ZHRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwljb25zdCBzdHJ1Y3QgYWNwaV93ZGF0X2VudHJ5ICplbnRyaWVzOworCWNvbnN0IHN0cnVjdCBhY3BpX3RhYmxlX3dkYXQgKnRibDsKKwlzdHJ1Y3Qgd2RhdF93ZHQgKndkYXQ7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJdm9pZCBfX2lvbWVtICoqcmVnczsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJaW50IGksIHJldDsKKworCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlKEFDUElfU0lHX1dEQVQsIDAsCisJCQkJKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKikmdGJsKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXJldHVybiAtRU5PREVWOworCisJd2RhdCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKndkYXQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXdkYXQpCisJCXJldHVybiAtRU5PTUVNOworCisJcmVncyA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCBwZGV2LT5udW1fcmVzb3VyY2VzLCBzaXplb2YoKnJlZ3MpLAorCQkJICAgIEdGUF9LRVJORUwpOworCWlmICghcmVncykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBXREFUIHNwZWNpZmljYXRpb24gd2FudHMgdG8gaGF2ZSA+PSAxbXMgcGVyaW9kICovCisJaWYgKHRibC0+dGltZXJfcGVyaW9kIDwgMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHRibC0+bWluX2NvdW50ID4gdGJsLT5tYXhfY291bnQpCisJCXJldHVybiAtRUlOVkFMOworCisJd2RhdC0+cGVyaW9kID0gdGJsLT50aW1lcl9wZXJpb2Q7CisJd2RhdC0+d2RkLm1pbl9od19oZWFydGJlYXRfbXMgPSB3ZGF0LT5wZXJpb2QgKiB0YmwtPm1pbl9jb3VudDsKKwl3ZGF0LT53ZGQubWF4X2h3X2hlYXJ0YmVhdF9tcyA9IHdkYXQtPnBlcmlvZCAqIHRibC0+bWF4X2NvdW50OworCXdkYXQtPnN0b3BwZWRfaW5fc2xlZXAgPSB0YmwtPmZsYWdzICYgQUNQSV9XREFUX1NUT1BQRUQ7CisJd2RhdC0+d2RkLmluZm8gPSAmd2RhdF93ZHRfaW5mbzsKKwl3ZGF0LT53ZGQub3BzID0gJndkYXRfd2R0X29wczsKKwl3ZGF0LT5wZGV2ID0gcGRldjsKKworCS8qIFJlcXVlc3QgYW5kIG1hcCBhbGwgcmVzb3VyY2VzICovCisJZm9yIChpID0gMDsgaSA8IHBkZXYtPm51bV9yZXNvdXJjZXM7IGkrKykgeworCQl2b2lkIF9faW9tZW0gKnJlZzsKKworCQlyZXMgPSAmcGRldi0+cmVzb3VyY2VbaV07CisJCWlmIChyZXNvdXJjZV90eXBlKHJlcykgPT0gSU9SRVNPVVJDRV9NRU0pIHsKKwkJCXJlZyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCQkJaWYgKElTX0VSUihyZWcpKQorCQkJCXJldHVybiBQVFJfRVJSKHJlZyk7CisJCX0gZWxzZSBpZiAocmVzb3VyY2VfdHlwZShyZXMpID09IElPUkVTT1VSQ0VfSU8pIHsKKwkJCXJlZyA9IGRldm1faW9wb3J0X21hcCgmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LCAxKTsKKwkJCWlmICghcmVnKQorCQkJCXJldHVybiAtRU5PTUVNOworCQl9IGVsc2UgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5zdXBwb3J0ZWQgcmVzb3VyY2VcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlyZWdzW2ldID0gcmVnOworCX0KKworCWVudHJpZXMgPSAoc3RydWN0IGFjcGlfd2RhdF9lbnRyeSAqKSh0YmwgKyAxKTsKKwlmb3IgKGkgPSAwOyBpIDwgdGJsLT5lbnRyaWVzOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICpnYXM7CisJCXN0cnVjdCB3ZGF0X2luc3RydWN0aW9uICppbnN0cjsKKwkJc3RydWN0IGxpc3RfaGVhZCAqaW5zdHJ1Y3Rpb25zOworCQl1bnNpZ25lZCBpbnQgYWN0aW9uOworCQlzdHJ1Y3QgcmVzb3VyY2UgcjsKKwkJaW50IGo7CisKKwkJYWN0aW9uID0gZW50cmllc1tpXS5hY3Rpb247CisJCWlmIChhY3Rpb24gPj0gTUFYX1dEQVRfQUNUSU9OUykgeworCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiU2tpcHBpbmcgdW5rbm93biBhY3Rpb246ICV1XG4iLAorCQkJCWFjdGlvbik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWluc3RyID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqaW5zdHIpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFpbnN0cikKKwkJCXJldHVybiAtRU5PTUVNOworCisJCUlOSVRfTElTVF9IRUFEKCZpbnN0ci0+bm9kZSk7CisJCWluc3RyLT5lbnRyeSA9IGVudHJpZXNbaV07CisKKwkJZ2FzID0gJmVudHJpZXNbaV0ucmVnaXN0ZXJfcmVnaW9uOworCisJCW1lbXNldCgmciwgMCwgc2l6ZW9mKHIpKTsKKwkJci5zdGFydCA9IGdhcy0+YWRkcmVzczsKKwkJci5lbmQgPSByLnN0YXJ0ICsgZ2FzLT5hY2Nlc3Nfd2lkdGg7CisJCWlmIChnYXMtPnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1NZU1RFTV9NRU1PUlkpIHsKKwkJCXIuZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKKwkJfSBlbHNlIGlmIChnYXMtPnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTykgeworCQkJci5mbGFncyA9IElPUkVTT1VSQ0VfSU87CisJCX0gZWxzZSB7CisJCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJVbnN1cHBvcnRlZCBhZGRyZXNzIHNwYWNlOiAlZFxuIiwKKwkJCQlnYXMtPnNwYWNlX2lkKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogRmluZCB0aGUgbWF0Y2hpbmcgcmVzb3VyY2UgKi8KKwkJZm9yIChqID0gMDsgaiA8IHBkZXYtPm51bV9yZXNvdXJjZXM7IGorKykgeworCQkJcmVzID0gJnBkZXYtPnJlc291cmNlW2pdOworCQkJaWYgKHJlc291cmNlX2NvbnRhaW5zKHJlcywgJnIpKSB7CisJCQkJaW5zdHItPnJlZyA9IHJlZ3Nbal0gKyByLnN0YXJ0IC0gcmVzLT5zdGFydDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmICghaW5zdHItPnJlZykgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiSS9PIHJlc291cmNlIG5vdCBmb3VuZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWluc3RydWN0aW9ucyA9IHdkYXQtPmluc3RydWN0aW9uc1thY3Rpb25dOworCQlpZiAoIWluc3RydWN0aW9ucykgeworCQkJaW5zdHJ1Y3Rpb25zID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCisJCQkJCXNpemVvZigqaW5zdHJ1Y3Rpb25zKSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWluc3RydWN0aW9ucykKKwkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJSU5JVF9MSVNUX0hFQUQoaW5zdHJ1Y3Rpb25zKTsKKwkJCXdkYXQtPmluc3RydWN0aW9uc1thY3Rpb25dID0gaW5zdHJ1Y3Rpb25zOworCQl9CisKKwkJbGlzdF9hZGRfdGFpbCgmaW5zdHItPm5vZGUsIGluc3RydWN0aW9ucyk7CisJfQorCisJd2RhdF93ZHRfYm9vdF9zdGF0dXMod2RhdCk7CisJd2RhdF93ZHRfc2V0X3J1bm5pbmcod2RhdCk7CisKKwlyZXQgPSB3ZGF0X3dkdF9lbmFibGVfcmVib290KHdkYXQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB3ZGF0KTsKKworCXdhdGNoZG9nX3NldF9ub3dheW91dCgmd2RhdC0+d2RkLCBub3dheW91dCk7CisJcmV0dXJuIGRldm1fd2F0Y2hkb2dfcmVnaXN0ZXJfZGV2aWNlKCZwZGV2LT5kZXYsICZ3ZGF0LT53ZGQpOworfQorCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IHdkYXRfd2R0X3N1c3BlbmRfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgd2RhdF93ZHQgKndkYXQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgcmV0OworCisJaWYgKCF3YXRjaGRvZ19hY3RpdmUoJndkYXQtPndkZCkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIHN0b3AgdGhlIHdhdGNoZG9nIGlmIGZpcm1hcmUgaXMgbm90IGRvaW5nIGl0IG9yIGlmIHdlCisJICogYXJlIGdvaW5nIHN1c3BlbmQgdG8gaWRsZSAod2hlcmUgZmlybXdhcmUgaXMgbm90IGludm9sdmVkKS4gSWYKKwkgKiBmaXJtd2FyZSBpcyBzdG9wcGluZyB0aGUgd2F0Y2hkb2cgd2Uga2ljayBpdCBoZXJlIG9uZSBtb3JlIHRpbWUKKwkgKiB0byBnaXZlIGl0IHNvbWUgdGltZS4KKwkgKi8KKwl3ZGF0LT5zdG9wcGVkID0gZmFsc2U7CisJaWYgKGFjcGlfdGFyZ2V0X3N5c3RlbV9zdGF0ZSgpID09IEFDUElfU1RBVEVfUzAgfHwKKwkgICAgIXdkYXQtPnN0b3BwZWRfaW5fc2xlZXApIHsKKwkJcmV0ID0gd2RhdF93ZHRfc3RvcCgmd2RhdC0+d2RkKTsKKwkJaWYgKCFyZXQpCisJCQl3ZGF0LT5zdG9wcGVkID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlyZXQgPSB3ZGF0X3dkdF9waW5nKCZ3ZGF0LT53ZGQpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd2RhdF93ZHRfcmVzdW1lX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHdkYXRfd2R0ICp3ZGF0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IHJldDsKKworCWlmICghd2F0Y2hkb2dfYWN0aXZlKCZ3ZGF0LT53ZGQpKQorCQlyZXR1cm4gMDsKKworCWlmICghd2RhdC0+c3RvcHBlZCkgeworCQkvKgorCQkgKiBMb29rcyBsaWtlIHRoZSBib290IGZpcm13YXJlIHJlaW5pdGlhbGl6ZXMgdGhlIHdhdGNoZG9nCisJCSAqIGJlZm9yZSBpdCBoYW5kcyBvZmYgdG8gdGhlIE9TIG9uIHJlc3VtZSBmcm9tIHNsZWVwIHNvIHdlCisJCSAqIHN0b3AgYW5kIHJlcHJvZ3JhbSB0aGUgd2F0Y2hkb2cgaGVyZS4KKwkJICovCisJCXJldCA9IHdkYXRfd2R0X3N0b3AoJndkYXQtPndkZCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IHdkYXRfd2R0X3NldF90aW1lb3V0KCZ3ZGF0LT53ZGQsIHdkYXQtPndkZC50aW1lb3V0KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gd2RhdF93ZHRfZW5hYmxlX3JlYm9vdCh3ZGF0KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHdkYXRfd2R0X3N0YXJ0KCZ3ZGF0LT53ZGQpOworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyB3ZGF0X3dkdF9wbV9vcHMgPSB7CisJU0VUX05PSVJRX1NZU1RFTV9TTEVFUF9QTV9PUFMod2RhdF93ZHRfc3VzcGVuZF9ub2lycSwKKwkJCQkgICAgICB3ZGF0X3dkdF9yZXN1bWVfbm9pcnEpCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB3ZGF0X3dkdF9kcml2ZXIgPSB7CisJLnByb2JlID0gd2RhdF93ZHRfcHJvYmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAid2RhdF93ZHQiLAorCQkucG0gPSAmd2RhdF93ZHRfcG1fb3BzLAorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHdkYXRfd2R0X2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIk1pa2EgV2VzdGVyYmVyZyA8bWlrYS53ZXN0ZXJiZXJnQGxpbnV4LmludGVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUNQSSBIYXJkd2FyZSBXYXRjaGRvZyAoV0RBVCkgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOndkYXRfd2R0Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9ldmVudHMvZXZlbnRzX2Jhc2UuYyBiL2RyaXZlcnMveGVuL2V2ZW50cy9ldmVudHNfYmFzZS5jCmluZGV4IGQ1ZGJkYjkuLjllY2ZjZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL2V2ZW50cy9ldmVudHNfYmFzZS5jCisrKyBiL2RyaXZlcnMveGVuL2V2ZW50cy9ldmVudHNfYmFzZS5jCkBAIC0xMzE0LDkgKzEzMTQsNiBAQAogCWlmICghVkFMSURfRVZUQ0hOKGV2dGNobikpCiAJCXJldHVybiAtMTsKIAotCWlmICgheGVuX3N1cHBvcnRfZXZ0Y2huX3JlYmluZCgpKQotCQlyZXR1cm4gLTE7Ci0KIAkvKiBTZW5kIGZ1dHVyZSBpbnN0YW5jZXMgb2YgdGhpcyBpbnRlcnJ1cHQgdG8gb3RoZXIgdmNwdS4gKi8KIAliaW5kX3ZjcHUucG9ydCA9IGV2dGNobjsKIAliaW5kX3ZjcHUudmNwdSA9IHhlbl92Y3B1X25yKHRjcHUpOwpAQCAtMTY1MCwyMCArMTY0NywxNSBAQAogewogCWludCByYzsKIAl1aW50NjRfdCBjYWxsYmFja192aWE7Ci0JaWYgKHhlbl9oYXZlX3ZlY3Rvcl9jYWxsYmFjaykgewotCQljYWxsYmFja192aWEgPSBIVk1fQ0FMTEJBQ0tfVkVDVE9SKEhZUEVSVklTT1JfQ0FMTEJBQ0tfVkVDVE9SKTsKLQkJcmMgPSB4ZW5fc2V0X2NhbGxiYWNrX3ZpYShjYWxsYmFja192aWEpOwotCQlpZiAocmMpIHsKLQkJCXByX2VycigiUmVxdWVzdCBmb3IgWGVuIEhWTSBjYWxsYmFjayB2ZWN0b3IgZmFpbGVkXG4iKTsKLQkJCXhlbl9oYXZlX3ZlY3Rvcl9jYWxsYmFjayA9IDA7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJcHJfaW5mbygiWGVuIEhWTSBjYWxsYmFjayB2ZWN0b3IgZm9yIGV2ZW50IGRlbGl2ZXJ5IGlzIGVuYWJsZWRcbiIpOwotCQkvKiBpbiB0aGUgcmVzdG9yZSBjYXNlIHRoZSB2ZWN0b3IgaGFzIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgKi8KLQkJaWYgKCF0ZXN0X2JpdChIWVBFUlZJU09SX0NBTExCQUNLX1ZFQ1RPUiwgdXNlZF92ZWN0b3JzKSkKLQkJCWFsbG9jX2ludHJfZ2F0ZShIWVBFUlZJU09SX0NBTExCQUNLX1ZFQ1RPUiwKLQkJCQkJeGVuX2h2bV9jYWxsYmFja192ZWN0b3IpOwotCX0KKworCWNhbGxiYWNrX3ZpYSA9IEhWTV9DQUxMQkFDS19WRUNUT1IoSFlQRVJWSVNPUl9DQUxMQkFDS19WRUNUT1IpOworCXJjID0geGVuX3NldF9jYWxsYmFja192aWEoY2FsbGJhY2tfdmlhKTsKKwlCVUdfT04ocmMpOworCXByX2luZm8oIlhlbiBIVk0gY2FsbGJhY2sgdmVjdG9yIGZvciBldmVudCBkZWxpdmVyeSBpcyBlbmFibGVkXG4iKTsKKwkvKiBpbiB0aGUgcmVzdG9yZSBjYXNlIHRoZSB2ZWN0b3IgaGFzIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgKi8KKwlpZiAoIXRlc3RfYml0KEhZUEVSVklTT1JfQ0FMTEJBQ0tfVkVDVE9SLCB1c2VkX3ZlY3RvcnMpKQorCQlhbGxvY19pbnRyX2dhdGUoSFlQRVJWSVNPUl9DQUxMQkFDS19WRUNUT1IsCisJCQkJeGVuX2h2bV9jYWxsYmFja192ZWN0b3IpOwogfQogI2Vsc2UKIHZvaWQgeGVuX2NhbGxiYWNrX3ZlY3Rvcih2b2lkKSB7fQpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZXZlbnRzL2V2ZW50c19maWZvLmMgYi9kcml2ZXJzL3hlbi9ldmVudHMvZXZlbnRzX2ZpZm8uYwppbmRleCAyNjZjMmM3Li43ZWYyN2M2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9ldmVudHMvZXZlbnRzX2ZpZm8uYworKysgYi9kcml2ZXJzL3hlbi9ldmVudHMvZXZlbnRzX2ZpZm8uYwpAQCAtNDE4LDMwICs0MTgsMTggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGV2dGNobl9maWZvX2NwdV9ub3RpZmljYXRpb24oc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAotCQkJCQkJICB1bnNpZ25lZCBsb25nIGFjdGlvbiwKLQkJCQkJCSAgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQgeGVuX2V2dGNobl9jcHVfcHJlcGFyZSh1bnNpZ25lZCBpbnQgY3B1KQogewotCWludCBjcHUgPSAobG9uZyloY3B1OwotCWludCByZXQgPSAwOwotCi0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIENQVV9VUF9QUkVQQVJFOgotCQlpZiAoIXBlcl9jcHUoY3B1X2NvbnRyb2xfYmxvY2ssIGNwdSkpCi0JCQlyZXQgPSBldnRjaG5fZmlmb19hbGxvY19jb250cm9sX2Jsb2NrKGNwdSk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BVX0RFQUQ6Ci0JCV9fZXZ0Y2huX2ZpZm9faGFuZGxlX2V2ZW50cyhjcHUsIHRydWUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJldCA8IDAgPyBOT1RJRllfQkFEIDogTk9USUZZX09LOworCWlmICghcGVyX2NwdShjcHVfY29udHJvbF9ibG9jaywgY3B1KSkKKwkJcmV0dXJuIGV2dGNobl9maWZvX2FsbG9jX2NvbnRyb2xfYmxvY2soY3B1KTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBldnRjaG5fZmlmb19jcHVfbm90aWZpZXIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwJPSBldnRjaG5fZmlmb19jcHVfbm90aWZpY2F0aW9uLAotfTsKK3N0YXRpYyBpbnQgeGVuX2V2dGNobl9jcHVfZGVhZCh1bnNpZ25lZCBpbnQgY3B1KQoreworCV9fZXZ0Y2huX2ZpZm9faGFuZGxlX2V2ZW50cyhjcHUsIHRydWUpOworCXJldHVybiAwOworfQogCiBpbnQgX19pbml0IHhlbl9ldnRjaG5fZmlmb19pbml0KHZvaWQpCiB7CkBAIC00NTYsNyArNDQ0LDkgQEAKIAogCWV2dGNobl9vcHMgPSAmZXZ0Y2huX29wc19maWZvOwogCi0JcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZldnRjaG5fZmlmb19jcHVfbm90aWZpZXIpOworCWNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfWEVOX0VWVENITl9QUkVQQVJFLAorCQkJCSAgIkNQVUhQX1hFTl9FVlRDSE5fUFJFUEFSRSIsCisJCQkJICB4ZW5fZXZ0Y2huX2NwdV9wcmVwYXJlLCB4ZW5fZXZ0Y2huX2NwdV9kZWFkKTsKIG91dDoKIAlwdXRfY3B1KCk7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3BsYXRmb3JtLXBjaS5jIGIvZHJpdmVycy94ZW4vcGxhdGZvcm0tcGNpLmMKaW5kZXggY2Y5NjY2Ni4uYjU5Yzk0NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL3BsYXRmb3JtLXBjaS5jCisrKyBiL2RyaXZlcnMveGVuL3BsYXRmb3JtLXBjaS5jCkBAIC00Miw3ICs0Miw2IEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyBwbGF0Zm9ybV9tbWlvOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgcGxhdGZvcm1fbW1pb19hbGxvYzsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHBsYXRmb3JtX21taW9sZW47Ci1zdGF0aWMgdWludDY0X3QgY2FsbGJhY2tfdmlhOwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBhbGxvY194ZW5fbW1pbyh1bnNpZ25lZCBsb25nIGxlbikKIHsKQEAgLTU1LDUxICs1NCw2IEBACiAJcmV0dXJuIGFkZHI7CiB9CiAKLXN0YXRpYyB1aW50NjRfdCBnZXRfY2FsbGJhY2tfdmlhKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXU4IHBpbjsKLQlpbnQgaXJxOwotCi0JaXJxID0gcGRldi0+aXJxOwotCWlmIChpcnEgPCAxNikKLQkJcmV0dXJuIGlycTsgLyogSVNBIElSUSAqLwotCi0JcGluID0gcGRldi0+cGluOwotCi0JLyogV2UgZG9uJ3Qga25vdyB0aGUgR1NJLiBTcGVjaWZ5IHRoZSBQQ0kgSU5UeCBsaW5lIGluc3RlYWQuICovCi0JcmV0dXJuICgodWludDY0X3QpMHgwMSA8PCA1NikgfCAvKiBQQ0kgSU5UeCBpZGVudGlmaWVyICovCi0JCSgodWludDY0X3QpcGNpX2RvbWFpbl9ucihwZGV2LT5idXMpIDw8IDMyKSB8Ci0JCSgodWludDY0X3QpcGRldi0+YnVzLT5udW1iZXIgPDwgMTYpIHwKLQkJKCh1aW50NjRfdCkocGRldi0+ZGV2Zm4gJiAweGZmKSA8PCA4KSB8Ci0JCSgodWludDY0X3QpKHBpbiAtIDEpICYgMyk7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBkb19odm1fZXZ0Y2huX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXhlbl9odm1fZXZ0Y2huX2RvX3VwY2FsbCgpOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIGludCB4ZW5fYWxsb2NhdGVfaXJxKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXJldHVybiByZXF1ZXN0X2lycShwZGV2LT5pcnEsIGRvX2h2bV9ldnRjaG5faW50ciwKLQkJCUlSUUZfTk9CQUxBTkNJTkcgfCBJUlFGX1RSSUdHRVJfUklTSU5HLAotCQkJInhlbi1wbGF0Zm9ybS1wY2kiLCBwZGV2KTsKLX0KLQotc3RhdGljIGludCBwbGF0Zm9ybV9wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCWludCBlcnI7Ci0JaWYgKHhlbl9oYXZlX3ZlY3Rvcl9jYWxsYmFjaykKLQkJcmV0dXJuIDA7Ci0JZXJyID0geGVuX3NldF9jYWxsYmFja192aWEoY2FsbGJhY2tfdmlhKTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInBsYXRmb3JtX3BjaV9yZXN1bWUgZmFpbHVyZSFcbiIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBwbGF0Zm9ybV9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewpAQCAtMTM4LDIxICs5Miw2IEBACiAJcGxhdGZvcm1fbW1pbyA9IG1taW9fYWRkcjsKIAlwbGF0Zm9ybV9tbWlvbGVuID0gbW1pb19sZW47CiAKLQlpZiAoIXhlbl9oYXZlX3ZlY3Rvcl9jYWxsYmFjaykgewotCQlyZXQgPSB4ZW5fYWxsb2NhdGVfaXJxKHBkZXYpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfd2FybigmcGRldi0+ZGV2LCAicmVxdWVzdF9pcnEgZmFpbGVkIGVycj0lZFxuIiwgcmV0KTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCWNhbGxiYWNrX3ZpYSA9IGdldF9jYWxsYmFja192aWEocGRldik7Ci0JCXJldCA9IHhlbl9zZXRfY2FsbGJhY2tfdmlhKGNhbGxiYWNrX3ZpYSk7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gc2V0IHRoZSBldnRjaG4gY2FsbGJhY2sgIgotCQkJCQkgImVycj0lZFxuIiwgcmV0KTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCiAJbWF4X25yX2dmcmFtZXMgPSBnbnR0YWJfbWF4X2dyYW50X2ZyYW1lcygpOwogCWdyYW50X2ZyYW1lcyA9IGFsbG9jX3hlbl9tbWlvKFBBR0VfU0laRSAqIG1heF9ucl9nZnJhbWVzKTsKIAlyZXQgPSBnbnR0YWJfc2V0dXBfYXV0b194bGF0X2ZyYW1lcyhncmFudF9mcmFtZXMpOwpAQCAtMTg0LDkgKzEyMyw2IEBACiAJLm5hbWUgPSAgICAgICAgICAgRFJWX05BTUUsCiAJLnByb2JlID0gICAgICAgICAgcGxhdGZvcm1fcGNpX3Byb2JlLAogCS5pZF90YWJsZSA9ICAgICAgIHBsYXRmb3JtX3BjaV90YmwsCi0jaWZkZWYgQ09ORklHX1BNCi0JLnJlc3VtZV9lYXJseSA9ICAgcGxhdGZvcm1fcGNpX3Jlc3VtZSwKLSNlbmRpZgogfTsKIAogc3RhdGljIGludCBfX2luaXQgcGxhdGZvcm1fcGNpX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3N5cy1oeXBlcnZpc29yLmMgYi9kcml2ZXJzL3hlbi9zeXMtaHlwZXJ2aXNvci5jCmluZGV4IDY4ODFiM2MuLjg0MTA2ZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL3N5cy1oeXBlcnZpc29yLmMKKysrIGIvZHJpdmVycy94ZW4vc3lzLWh5cGVydmlzb3IuYwpAQCAtMjE1LDcgKzIxNSw3IEBACiAJLmF0dHJzID0geGVuX2NvbXBpbGVfYXR0cnMsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCB4ZW5fY29tcGlsYXRpb25faW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgeGVuX3N5c2ZzX2NvbXBpbGF0aW9uX2luaXQodm9pZCkKIHsKIAlyZXR1cm4gc3lzZnNfY3JlYXRlX2dyb3VwKGh5cGVydmlzb3Jfa29iaiwgJnhlbl9jb21waWxhdGlvbl9ncm91cCk7CiB9CkBAIC0zNDEsNyArMzQxLDcgQEAKIAkuYXR0cnMgPSB4ZW5fcHJvcGVydGllc19hdHRycywKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHhlbl9wcm9wZXJ0aWVzX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHhlbl9zeXNmc19wcm9wZXJ0aWVzX2luaXQodm9pZCkKIHsKIAlyZXR1cm4gc3lzZnNfY3JlYXRlX2dyb3VwKGh5cGVydmlzb3Jfa29iaiwgJnhlbl9wcm9wZXJ0aWVzX2dyb3VwKTsKIH0KQEAgLTQ1NSw3ICs0NTUsNyBAQAogCS5hdHRycyA9IHhlbl9wbXVfYXR0cnMsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCB4ZW5fcG11X2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHhlbl9zeXNmc19wbXVfaW5pdCh2b2lkKQogewogCXJldHVybiBzeXNmc19jcmVhdGVfZ3JvdXAoaHlwZXJ2aXNvcl9rb2JqLCAmeGVuX3BtdV9ncm91cCk7CiB9CkBAIC00NzQsMTggKzQ3NCwxOCBAQAogCXJldCA9IHhlbl9zeXNmc192ZXJzaW9uX2luaXQoKTsKIAlpZiAocmV0KQogCQlnb3RvIHZlcnNpb25fb3V0OwotCXJldCA9IHhlbl9jb21waWxhdGlvbl9pbml0KCk7CisJcmV0ID0geGVuX3N5c2ZzX2NvbXBpbGF0aW9uX2luaXQoKTsKIAlpZiAocmV0KQogCQlnb3RvIGNvbXBfb3V0OwogCXJldCA9IHhlbl9zeXNmc191dWlkX2luaXQoKTsKIAlpZiAocmV0KQogCQlnb3RvIHV1aWRfb3V0OwotCXJldCA9IHhlbl9wcm9wZXJ0aWVzX2luaXQoKTsKKwlyZXQgPSB4ZW5fc3lzZnNfcHJvcGVydGllc19pbml0KCk7CiAJaWYgKHJldCkKIAkJZ290byBwcm9wX291dDsKICNpZmRlZiBDT05GSUdfWEVOX0hBVkVfVlBNVQogCWlmICh4ZW5faW5pdGlhbF9kb21haW4oKSkgewotCQlyZXQgPSB4ZW5fcG11X2luaXQoKTsKKwkJcmV0ID0geGVuX3N5c2ZzX3BtdV9pbml0KCk7CiAJCWlmIChyZXQpIHsKIAkJCXN5c2ZzX3JlbW92ZV9ncm91cChoeXBlcnZpc29yX2tvYmosCiAJCQkJCSAgICZ4ZW5fcHJvcGVydGllc19ncm91cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW4tcGNpYmFjay9wY2lfc3R1Yi5jIGIvZHJpdmVycy94ZW4veGVuLXBjaWJhY2svcGNpX3N0dWIuYwppbmRleCAyNThiN2MzLi42MzMxYTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW4tcGNpYmFjay9wY2lfc3R1Yi5jCisrKyBiL2RyaXZlcnMveGVuL3hlbi1wY2liYWNrL3BjaV9zdHViLmMKQEAgLTI1LDYgKzI1LDggQEAKICNpbmNsdWRlICJjb25mX3NwYWNlLmgiCiAjaW5jbHVkZSAiY29uZl9zcGFjZV9xdWlya3MuaCIKIAorI2RlZmluZSBQQ0lTVFVCX0RSSVZFUl9OQU1FICJwY2liYWNrIgorCiBzdGF0aWMgY2hhciAqcGNpX2RldnNfdG9faGlkZTsKIHdhaXRfcXVldWVfaGVhZF90IHhlbl9wY2lia19hZXJfd2FpdF9xdWV1ZTsKIC8qQWRkIHNlbSBmb3Igc3luYyBBRVIgaGFuZGxpbmcgYW5kIHhlbl9wY2liayByZW1vdmUvcmVjb25maWd1ZSBvcHMsCkBAIC0xNDksMTMgKzE1MSwxMCBAQAogCWtyZWZfcHV0KCZwc2Rldi0+a3JlZiwgcGNpc3R1Yl9kZXZpY2VfcmVsZWFzZSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpc3R1Yl9kZXZpY2UgKnBjaXN0dWJfZGV2aWNlX2ZpbmQoaW50IGRvbWFpbiwgaW50IGJ1cywKLQkJCQkJCSAgaW50IHNsb3QsIGludCBmdW5jKQorc3RhdGljIHN0cnVjdCBwY2lzdHViX2RldmljZSAqcGNpc3R1Yl9kZXZpY2VfZmluZF9sb2NrZWQoaW50IGRvbWFpbiwgaW50IGJ1cywKKwkJCQkJCQkgaW50IHNsb3QsIGludCBmdW5jKQogewotCXN0cnVjdCBwY2lzdHViX2RldmljZSAqcHNkZXYgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGNpc3R1Yl9kZXZpY2VzX2xvY2ssIGZsYWdzKTsKKwlzdHJ1Y3QgcGNpc3R1Yl9kZXZpY2UgKnBzZGV2OwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwc2RldiwgJnBjaXN0dWJfZGV2aWNlcywgZGV2X2xpc3QpIHsKIAkJaWYgKHBzZGV2LT5kZXYgIT0gTlVMTApAQCAtMTYzLDE1ICsxNjIsMjUgQEAKIAkJICAgICYmIGJ1cyA9PSBwc2Rldi0+ZGV2LT5idXMtPm51bWJlcgogCQkgICAgJiYgc2xvdCA9PSBQQ0lfU0xPVChwc2Rldi0+ZGV2LT5kZXZmbikKIAkJICAgICYmIGZ1bmMgPT0gUENJX0ZVTkMocHNkZXYtPmRldi0+ZGV2Zm4pKSB7Ci0JCQlwY2lzdHViX2RldmljZV9nZXQocHNkZXYpOwotCQkJZ290byBvdXQ7CisJCQlyZXR1cm4gcHNkZXY7CiAJCX0KIAl9CiAKLQkvKiBkaWRuJ3QgZmluZCBpdCAqLwotCXBzZGV2ID0gTlVMTDsKKwlyZXR1cm4gTlVMTDsKK30KIAotb3V0Ogorc3RhdGljIHN0cnVjdCBwY2lzdHViX2RldmljZSAqcGNpc3R1Yl9kZXZpY2VfZmluZChpbnQgZG9tYWluLCBpbnQgYnVzLAorCQkJCQkJICBpbnQgc2xvdCwgaW50IGZ1bmMpCit7CisJc3RydWN0IHBjaXN0dWJfZGV2aWNlICpwc2RldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBjaXN0dWJfZGV2aWNlc19sb2NrLCBmbGFncyk7CisKKwlwc2RldiA9IHBjaXN0dWJfZGV2aWNlX2ZpbmRfbG9ja2VkKGRvbWFpbiwgYnVzLCBzbG90LCBmdW5jKTsKKwlpZiAocHNkZXYpCisJCXBjaXN0dWJfZGV2aWNlX2dldChwc2Rldik7CisKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2lzdHViX2RldmljZXNfbG9jaywgZmxhZ3MpOwogCXJldHVybiBwc2RldjsKIH0KQEAgLTIwNywxNiArMjE2LDkgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwY2lzdHViX2RldmljZXNfbG9jaywgZmxhZ3MpOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShwc2RldiwgJnBjaXN0dWJfZGV2aWNlcywgZGV2X2xpc3QpIHsKLQkJaWYgKHBzZGV2LT5kZXYgIT0gTlVMTAotCQkgICAgJiYgZG9tYWluID09IHBjaV9kb21haW5fbnIocHNkZXYtPmRldi0+YnVzKQotCQkgICAgJiYgYnVzID09IHBzZGV2LT5kZXYtPmJ1cy0+bnVtYmVyCi0JCSAgICAmJiBzbG90ID09IFBDSV9TTE9UKHBzZGV2LT5kZXYtPmRldmZuKQotCQkgICAgJiYgZnVuYyA9PSBQQ0lfRlVOQyhwc2Rldi0+ZGV2LT5kZXZmbikpIHsKLQkJCWZvdW5kX2RldiA9IHBjaXN0dWJfZGV2aWNlX2dldF9wY2lfZGV2KHBkZXYsIHBzZGV2KTsKLQkJCWJyZWFrOwotCQl9Ci0JfQorCXBzZGV2ID0gcGNpc3R1Yl9kZXZpY2VfZmluZF9sb2NrZWQoZG9tYWluLCBidXMsIHNsb3QsIGZ1bmMpOworCWlmIChwc2RldikKKwkJZm91bmRfZGV2ID0gcGNpc3R1Yl9kZXZpY2VfZ2V0X3BjaV9kZXYocGRldiwgcHNkZXYpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpc3R1Yl9kZXZpY2VzX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gZm91bmRfZGV2OwpAQCAtNDc4LDE1ICs0ODAsNDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwY2lzdHViX3NlaXplKHN0cnVjdCBwY2lfZGV2ICpkZXYpCitzdGF0aWMgdm9pZCBwY2lzdHViX2RldmljZV9pZF9hZGRfbGlzdChzdHJ1Y3QgcGNpc3R1Yl9kZXZpY2VfaWQgKm5ldywKKwkJCQkgICAgICAgaW50IGRvbWFpbiwgaW50IGJ1cywgdW5zaWduZWQgaW50IGRldmZuKQoreworCXN0cnVjdCBwY2lzdHViX2RldmljZV9pZCAqcGNpX2Rldl9pZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBmb3VuZCA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlX2lkc19sb2NrLCBmbGFncyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBjaV9kZXZfaWQsICZwY2lzdHViX2RldmljZV9pZHMsIHNsb3RfbGlzdCkgeworCQlpZiAocGNpX2Rldl9pZC0+ZG9tYWluID09IGRvbWFpbiAmJiBwY2lfZGV2X2lkLT5idXMgPT0gYnVzICYmCisJCSAgICBwY2lfZGV2X2lkLT5kZXZmbiA9PSBkZXZmbikgeworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWZvdW5kKSB7CisJCW5ldy0+ZG9tYWluID0gZG9tYWluOworCQluZXctPmJ1cyA9IGJ1czsKKwkJbmV3LT5kZXZmbiA9IGRldmZuOworCQlsaXN0X2FkZF90YWlsKCZuZXctPnNsb3RfbGlzdCwgJnBjaXN0dWJfZGV2aWNlX2lkcyk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlX2lkc19sb2NrLCBmbGFncyk7CisKKwlpZiAoZm91bmQpCisJCWtmcmVlKG5ldyk7Cit9CisKK3N0YXRpYyBpbnQgcGNpc3R1Yl9zZWl6ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJIHN0cnVjdCBwY2lzdHViX2RldmljZV9pZCAqcGNpX2Rldl9pZCkKIHsKIAlzdHJ1Y3QgcGNpc3R1Yl9kZXZpY2UgKnBzZGV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGVyciA9IDA7CiAKIAlwc2RldiA9IHBjaXN0dWJfZGV2aWNlX2FsbG9jKGRldik7Ci0JaWYgKCFwc2RldikKKwlpZiAoIXBzZGV2KSB7CisJCWtmcmVlKHBjaV9kZXZfaWQpOwogCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGNpc3R1Yl9kZXZpY2VzX2xvY2ssIGZsYWdzKTsKIApAQCAtNTA3LDggKzU0MiwxMiBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpc3R1Yl9kZXZpY2VzX2xvY2ssIGZsYWdzKTsKIAotCWlmIChlcnIpCisJaWYgKGVycikgeworCQlrZnJlZShwY2lfZGV2X2lkKTsKIAkJcGNpc3R1Yl9kZXZpY2VfcHV0KHBzZGV2KTsKKwl9IGVsc2UgaWYgKHBjaV9kZXZfaWQpCisJCXBjaXN0dWJfZGV2aWNlX2lkX2FkZF9saXN0KHBjaV9kZXZfaWQsIHBjaV9kb21haW5fbnIoZGV2LT5idXMpLAorCQkJCQkgICBkZXYtPmJ1cy0+bnVtYmVyLCBkZXYtPmRldmZuKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC01MTcsMTEgKzU1NiwxNiBAQAogICogb3RoZXIgZnVuY3Rpb25zIHRoYXQgdGFrZSB0aGUgc3lzZnMgbG9jay4gKi8KIHN0YXRpYyBpbnQgcGNpc3R1Yl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7Ci0JaW50IGVyciA9IDA7CisJaW50IGVyciA9IDAsIG1hdGNoOworCXN0cnVjdCBwY2lzdHViX2RldmljZV9pZCAqcGNpX2Rldl9pZCA9IE5VTEw7CiAKIAlkZXZfZGJnKCZkZXYtPmRldiwgInByb2JpbmcuLi5cbiIpOwogCi0JaWYgKHBjaXN0dWJfbWF0Y2goZGV2KSkgeworCW1hdGNoID0gcGNpc3R1Yl9tYXRjaChkZXYpOworCisJaWYgKChkZXYtPmRyaXZlcl9vdmVycmlkZSAmJgorCSAgICAgIXN0cmNtcChkZXYtPmRyaXZlcl9vdmVycmlkZSwgUENJU1RVQl9EUklWRVJfTkFNRSkpIHx8CisJICAgIG1hdGNoKSB7CiAKIAkJaWYgKGRldi0+aGRyX3R5cGUgIT0gUENJX0hFQURFUl9UWVBFX05PUk1BTAogCQkgICAgJiYgZGV2LT5oZHJfdHlwZSAhPSBQQ0lfSEVBREVSX1RZUEVfQlJJREdFKSB7CkBAIC01MzIsOCArNTc2LDE2IEBACiAJCQlnb3RvIG91dDsKIAkJfQogCisJCWlmICghbWF0Y2gpIHsKKwkJCXBjaV9kZXZfaWQgPSBrbWFsbG9jKHNpemVvZigqcGNpX2Rldl9pZCksIEdGUF9BVE9NSUMpOworCQkJaWYgKCFwY2lfZGV2X2lkKSB7CisJCQkJZXJyID0gLUVOT01FTTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCiAJCWRldl9pbmZvKCZkZXYtPmRldiwgInNlaXppbmcgZGV2aWNlXG4iKTsKLQkJZXJyID0gcGNpc3R1Yl9zZWl6ZShkZXYpOworCQllcnIgPSBwY2lzdHViX3NlaXplKGRldiwgcGNpX2Rldl9pZCk7CiAJfSBlbHNlCiAJCS8qIERpZG4ndCBmaW5kIHRoZSBkZXZpY2UgKi8KIAkJZXJyID0gLUVOT0RFVjsKQEAgLTk0NSw3ICs5OTcsNyBAQAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHhlbl9wY2lia19wY2lfZHJpdmVyID0gewogCS8qIFRoZSBuYW1lIHNob3VsZCBiZSB4ZW5fcGNpYmFjaywgYnV0IHVudGlsIHRoZSB0b29scyBhcmUgdXBkYXRlZAogCSAqIHdlIHdpbGwga2VlcCBpdCBhcyBwY2liYWNrLiAqLwotCS5uYW1lID0gInBjaWJhY2siLAorCS5uYW1lID0gUENJU1RVQl9EUklWRVJfTkFNRSwKIAkuaWRfdGFibGUgPSBwY2lzdHViX2lkcywKIAkucHJvYmUgPSBwY2lzdHViX3Byb2JlLAogCS5yZW1vdmUgPSBwY2lzdHViX3JlbW92ZSwKQEAgLTEwMTIsNyArMTA2NCw2IEBACiBzdGF0aWMgaW50IHBjaXN0dWJfZGV2aWNlX2lkX2FkZChpbnQgZG9tYWluLCBpbnQgYnVzLCBpbnQgc2xvdCwgaW50IGZ1bmMpCiB7CiAJc3RydWN0IHBjaXN0dWJfZGV2aWNlX2lkICpwY2lfZGV2X2lkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJjID0gMCwgZGV2Zm4gPSBQQ0lfREVWRk4oc2xvdCwgZnVuYyk7CiAKIAlpZiAoc2xvdCA8IDApIHsKQEAgLTEwNDIsMTYgKzEwOTMsMTAgQEAKIAlpZiAoIXBjaV9kZXZfaWQpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcGNpX2Rldl9pZC0+ZG9tYWluID0gZG9tYWluOwotCXBjaV9kZXZfaWQtPmJ1cyA9IGJ1czsKLQlwY2lfZGV2X2lkLT5kZXZmbiA9IGRldmZuOwotCiAJcHJfZGVidWcoIndhbnRzIHRvIHNlaXplICUwNHg6JTAyeDolMDJ4LiVkXG4iLAogCQkgZG9tYWluLCBidXMsIHNsb3QsIGZ1bmMpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZV9pZHNfbG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJnBjaV9kZXZfaWQtPnNsb3RfbGlzdCwgJnBjaXN0dWJfZGV2aWNlX2lkcyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlX2lkc19sb2NrLCBmbGFncyk7CisJcGNpc3R1Yl9kZXZpY2VfaWRfYWRkX2xpc3QocGNpX2Rldl9pZCwgZG9tYWluLCBidXMsIGRldmZuKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19kZXZfZnJvbnRlbmQuYyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfZGV2X2Zyb250ZW5kLmMKaW5kZXggNzQ4Nzk3MS4uYzEwMTBmMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfZGV2X2Zyb250ZW5kLmMKKysrIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19kZXZfZnJvbnRlbmQuYwpAQCAtMzE2LDcgKzMxNiw3IEBACiAJCQlyYyA9IC1FTk9NRU07CiAJCQlnb3RvIG91dDsKIAkJfQotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChtc2dfdHlwZSA9PSBYU19UUkFOU0FDVElPTl9FTkQpIHsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0cmFucywgJnUtPnRyYW5zYWN0aW9ucywgbGlzdCkKIAkJCWlmICh0cmFucy0+aGFuZGxlLmlkID09IHUtPnUubXNnLnR4X2lkKQogCQkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZnMvS2NvbmZpZyBiL2ZzL0tjb25maWcKaW5kZXggMmJjN2FkNy4uM2VmNjJiYSAxMDA2NDQKLS0tIGEvZnMvS2NvbmZpZworKysgYi9mcy9LY29uZmlnCkBAIC03OSw2ICs3OSw3IEBACiBjb25maWcgRklMRV9MT0NLSU5HCiAJYm9vbCAiRW5hYmxlIFBPU0lYIGZpbGUgbG9ja2luZyBBUEkiIGlmIEVYUEVSVAogCWRlZmF1bHQgeQorCXNlbGVjdCBQRVJDUFVfUldTRU0KIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN0YW5kYXJkIGZpbGUgbG9ja2luZyBzdXBwb3J0LCByZXF1aXJlZAogICAgICAgICAgIGZvciBmaWxlc3lzdGVtcyBsaWtlIE5GUyBhbmQgZm9yIHRoZSBmbG9jaygpIHN5c3RlbQpkaWZmIC0tZ2l0IGEvZnMvS2NvbmZpZy5iaW5mbXQgYi9mcy9LY29uZmlnLmJpbmZtdAppbmRleCBjN2VmZGRmLi40YzA5ZDkzIDEwMDY0NAotLS0gYS9mcy9LY29uZmlnLmJpbmZtdAorKysgYi9mcy9LY29uZmlnLmJpbmZtdApAQCAtODksNyArODksNyBAQAogCiBjb25maWcgQklORk1UX0ZMQVQKIAlib29sICJLZXJuZWwgc3VwcG9ydCBmb3IgZmxhdCBiaW5hcmllcyIKLQlkZXBlbmRzIG9uICFNTVUgfHwgTTY4SworCWRlcGVuZHMgb24gIU1NVSB8fCBBUk0gfHwgTTY4SwogCWRlcGVuZHMgb24gIUZSViB8fCBCUk9LRU4KIAloZWxwCiAJICBTdXBwb3J0IHVDbGludXggRkxBVCBmb3JtYXQgYmluYXJpZXMuCmRpZmYgLS1naXQgYS9mcy9hZnMvY2FsbGJhY2suYyBiL2ZzL2Fmcy9jYWxsYmFjay5jCmluZGV4IDdlZjYzN2QuLjFlOWQyZjggMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9jYWxsYmFjay5jCisrKyBiL2ZzL2Fmcy9jYWxsYmFjay5jCkBAIC00NjEsOCArNDYxLDggQEAKICAqLwogaW50IF9faW5pdCBhZnNfY2FsbGJhY2tfdXBkYXRlX2luaXQodm9pZCkKIHsKLQlhZnNfY2FsbGJhY2tfdXBkYXRlX3dvcmtlciA9Ci0JCWNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJrYWZzX2NhbGxiYWNrZCIpOworCWFmc19jYWxsYmFja191cGRhdGVfd29ya2VyID0gYWxsb2Nfb3JkZXJlZF93b3JrcXVldWUoImthZnNfY2FsbGJhY2tkIiwKKwkJCQkJCQkgICAgIFdRX01FTV9SRUNMQUlNKTsKIAlyZXR1cm4gYWZzX2NhbGxiYWNrX3VwZGF0ZV93b3JrZXIgPyAwIDogLUVOT01FTTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvYWZzL2Ntc2VydmljZS5jIGIvZnMvYWZzL2Ntc2VydmljZS5jCmluZGV4IDRiMGVmZjYuLjIwMzdlN2EgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9jbXNlcnZpY2UuYworKysgYi9mcy9hZnMvY21zZXJ2aWNlLmMKQEAgLTE3LDE5ICsxNywxMiBAQAogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAiYWZzX2NtLmgiCiAKLSNpZiAwCi1zdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYWZzX2NtX3dvcmtxdWV1ZTsKLSNlbmRpZiAgLyogIDAgICovCi0KLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfaW5pdF9jYWxsX2JhY2tfc3RhdGUoc3RydWN0IGFmc19jYWxsICosCi0JCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sKTsKLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfaW5pdF9jYWxsX2JhY2tfc3RhdGUzKHN0cnVjdCBhZnNfY2FsbCAqLAotCQkJCQkJc3RydWN0IHNrX2J1ZmYgKiwgYm9vbCk7Ci1zdGF0aWMgaW50IGFmc19kZWxpdmVyX2NiX3Byb2JlKHN0cnVjdCBhZnNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sKTsKLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfY2FsbGJhY2soc3RydWN0IGFmc19jYWxsICosIHN0cnVjdCBza19idWZmICosIGJvb2wpOwotc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9wcm9iZV91dWlkKHN0cnVjdCBhZnNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sKTsKLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfdGVsbF9tZV9hYm91dF95b3Vyc2VsZihzdHJ1Y3QgYWZzX2NhbGwgKiwKLQkJCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sKTsKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfaW5pdF9jYWxsX2JhY2tfc3RhdGUoc3RydWN0IGFmc19jYWxsICopOworc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9pbml0X2NhbGxfYmFja19zdGF0ZTMoc3RydWN0IGFmc19jYWxsICopOworc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9wcm9iZShzdHJ1Y3QgYWZzX2NhbGwgKik7CitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2NiX2NhbGxiYWNrKHN0cnVjdCBhZnNfY2FsbCAqKTsKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfcHJvYmVfdXVpZChzdHJ1Y3QgYWZzX2NhbGwgKik7CitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2NiX3RlbGxfbWVfYWJvdXRfeW91cnNlbGYoc3RydWN0IGFmc19jYWxsICopOwogc3RhdGljIHZvaWQgYWZzX2NtX2Rlc3RydWN0b3Ioc3RydWN0IGFmc19jYWxsICopOwogCiAvKgpAQCAtMTM0LDcgKzEyNyw3IEBACiAJICogcmVjZWl2ZWQuICBUaGUgc3RlcCBudW1iZXIgaGVyZSBtdXN0IG1hdGNoIHRoZSBmaW5hbCBudW1iZXIgaW4KIAkgKiBhZnNfZGVsaXZlcl9jYl9jYWxsYmFjaygpLgogCSAqLwotCWlmIChjYWxsLT51bm1hcnNoYWxsID09IDYpIHsKKwlpZiAoY2FsbC0+dW5tYXJzaGFsbCA9PSA1KSB7CiAJCUFTU0VSVChjYWxsLT5zZXJ2ZXIgJiYgY2FsbC0+Y291bnQgJiYgY2FsbC0+cmVxdWVzdCk7CiAJCWFmc19icmVha19jYWxsYmFja3MoY2FsbC0+c2VydmVyLCBjYWxsLT5jb3VudCwgY2FsbC0+cmVxdWVzdCk7CiAJfQpAQCAtMTY4LDMyICsxNjEsMjkgQEAKIC8qCiAgKiBkZWxpdmVyIHJlcXVlc3QgZGF0YSB0byBhIENCLkNhbGxCYWNrIGNhbGwKICAqLwotc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9jYWxsYmFjayhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgYm9vbCBsYXN0KQorc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9jYWxsYmFjayhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7CisJc3RydWN0IHNvY2thZGRyX3J4cnBjIHNyeDsKIAlzdHJ1Y3QgYWZzX2NhbGxiYWNrICpjYjsKIAlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOwotCXN0cnVjdCBpbl9hZGRyIGFkZHI7CiAJX19iZTMyICpicDsKIAl1MzIgdG1wOwogCWludCByZXQsIGxvb3A7CiAKLQlfZW50ZXIoInsldX0seyV1fSwlZCIsIGNhbGwtPnVubWFyc2hhbGwsIHNrYi0+bGVuLCBsYXN0KTsKKwlfZW50ZXIoInsldX0iLCBjYWxsLT51bm1hcnNoYWxsKTsKIAogCXN3aXRjaCAoY2FsbC0+dW5tYXJzaGFsbCkgewogCWNhc2UgMDoKKwkJcnhycGNfa2VybmVsX2dldF9wZWVyKGFmc19zb2NrZXQsIGNhbGwtPnJ4Y2FsbCwgJnNyeCk7CiAJCWNhbGwtPm9mZnNldCA9IDA7CiAJCWNhbGwtPnVubWFyc2hhbGwrKzsKIAogCQkvKiBleHRyYWN0IHRoZSBGSUQgYXJyYXkgYW5kIGl0cyBjb3VudCBpbiB0d28gc3RlcHMgKi8KIAljYXNlIDE6CiAJCV9kZWJ1ZygiZXh0cmFjdCBGSUQgY291bnQiKTsKLQkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBza2IsIGxhc3QsICZjYWxsLT50bXAsIDQpOwotCQlzd2l0Y2ggKHJldCkgewotCQljYXNlIDA6CQlicmVhazsKLQkJY2FzZSAtRUFHQUlOOglyZXR1cm4gMDsKLQkJZGVmYXVsdDoJcmV0dXJuIHJldDsKLQkJfQorCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsICZjYWxsLT50bXAsIDQsIHRydWUpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CiAKIAkJY2FsbC0+Y291bnQgPSBudG9obChjYWxsLT50bXApOwogCQlfZGVidWcoIkZJRCBjb3VudDogJXUiLCBjYWxsLT5jb3VudCk7CkBAIC0yMDgsMTMgKzE5OCwxMCBAQAogCiAJY2FzZSAyOgogCQlfZGVidWcoImV4dHJhY3QgRklEIGFycmF5Iik7Ci0JCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCBjYWxsLT5idWZmZXIsCi0JCQkJICAgICAgIGNhbGwtPmNvdW50ICogMyAqIDQpOwotCQlzd2l0Y2ggKHJldCkgewotCQljYXNlIDA6CQlicmVhazsKLQkJY2FzZSAtRUFHQUlOOglyZXR1cm4gMDsKLQkJZGVmYXVsdDoJcmV0dXJuIHJldDsKLQkJfQorCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIGNhbGwtPmJ1ZmZlciwKKwkJCQkgICAgICAgY2FsbC0+Y291bnQgKiAzICogNCwgdHJ1ZSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKIAogCQlfZGVidWcoInVubWFyc2hhbGwgRklEIGFycmF5Iik7CiAJCWNhbGwtPnJlcXVlc3QgPSBrY2FsbG9jKGNhbGwtPmNvdW50LApAQCAtMjM4LDEyICsyMjUsOSBAQAogCQkvKiBleHRyYWN0IHRoZSBjYWxsYmFjayBhcnJheSBhbmQgaXRzIGNvdW50IGluIHR3byBzdGVwcyAqLwogCWNhc2UgMzoKIAkJX2RlYnVnKCJleHRyYWN0IENCIGNvdW50Iik7Ci0JCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCAmY2FsbC0+dG1wLCA0KTsKLQkJc3dpdGNoIChyZXQpIHsKLQkJY2FzZSAwOgkJYnJlYWs7Ci0JCWNhc2UgLUVBR0FJTjoJcmV0dXJuIDA7Ci0JCWRlZmF1bHQ6CXJldHVybiByZXQ7Ci0JCX0KKwkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCAmY2FsbC0+dG1wLCA0LCB0cnVlKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OwogCiAJCXRtcCA9IG50b2hsKGNhbGwtPnRtcCk7CiAJCV9kZWJ1ZygiQ0IgY291bnQ6ICV1IiwgdG1wKTsKQEAgLTI1MSwxOCArMjM1LDEzIEBACiAJCQlyZXR1cm4gLUVCQURNU0c7CiAJCWNhbGwtPm9mZnNldCA9IDA7CiAJCWNhbGwtPnVubWFyc2hhbGwrKzsKLQkJaWYgKHRtcCA9PSAwKQotCQkJZ290byBlbXB0eV9jYl9hcnJheTsKIAogCWNhc2UgNDoKIAkJX2RlYnVnKCJleHRyYWN0IENCIGFycmF5Iik7Ci0JCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCBjYWxsLT5yZXF1ZXN0LAotCQkJCSAgICAgICBjYWxsLT5jb3VudCAqIDMgKiA0KTsKLQkJc3dpdGNoIChyZXQpIHsKLQkJY2FzZSAwOgkJYnJlYWs7Ci0JCWNhc2UgLUVBR0FJTjoJcmV0dXJuIDA7Ci0JCWRlZmF1bHQ6CXJldHVybiByZXQ7Ci0JCX0KKwkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBjYWxsLT5idWZmZXIsCisJCQkJICAgICAgIGNhbGwtPmNvdW50ICogMyAqIDQsIGZhbHNlKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OwogCiAJCV9kZWJ1ZygidW5tYXJzaGFsbCBDQiBhcnJheSIpOwogCQljYiA9IGNhbGwtPnJlcXVlc3Q7CkBAIC0yNzMsMTUgKzI1Miw5IEBACiAJCQljYi0+dHlwZQk9IG50b2hsKCpicCsrKTsKIAkJfQogCi0JZW1wdHlfY2JfYXJyYXk6CiAJCWNhbGwtPm9mZnNldCA9IDA7CiAJCWNhbGwtPnVubWFyc2hhbGwrKzsKIAotCWNhc2UgNToKLQkJX2RlYnVnKCJ0cmFpbGVyIik7Ci0JCWlmIChza2ItPmxlbiAhPSAwKQotCQkJcmV0dXJuIC1FQkFETVNHOwotCiAJCS8qIFJlY29yZCB0aGF0IHRoZSBtZXNzYWdlIHdhcyB1bm1hcnNoYWxsZWQgc3VjY2Vzc2Z1bGx5IHNvCiAJCSAqIHRoYXQgdGhlIGNhbGwgZGVzdHJ1Y3RvciBjYW4ga25vdyBkbyB0aGUgY2FsbGJhY2sgYnJlYWtpbmcKIAkJICogd29yaywgZXZlbiBpZiB0aGUgZmluYWwgQUNLIGlzbid0IHJlY2VpdmVkLgpAQCAtMjkwLDE5ICsyNjMsMTUgQEAKIAkJICogdXBkYXRlZCBhbHNvLgogCQkgKi8KIAkJY2FsbC0+dW5tYXJzaGFsbCsrOwotCWNhc2UgNjoKKwljYXNlIDU6CiAJCWJyZWFrOwogCX0KIAotCWlmICghbGFzdCkKLQkJcmV0dXJuIDA7Ci0KIAljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX1JFUExZSU5HOwogCiAJLyogd2UnbGwgbmVlZCB0aGUgZmlsZSBzZXJ2ZXIgcmVjb3JkIGFzIHRoYXQgdGVsbHMgdXMgd2hpY2ggc2V0IG9mCiAJICogdm5vZGVzIHRvIG9wZXJhdGUgdXBvbiAqLwotCW1lbWNweSgmYWRkciwgJmlwX2hkcihza2IpLT5zYWRkciwgNCk7Ci0Jc2VydmVyID0gYWZzX2ZpbmRfc2VydmVyKCZhZGRyKTsKKwlzZXJ2ZXIgPSBhZnNfZmluZF9zZXJ2ZXIoJnNyeCk7CiAJaWYgKCFzZXJ2ZXIpCiAJCXJldHVybiAtRU5PVENPTk47CiAJY2FsbC0+c2VydmVyID0gc2VydmVyOwpAQCAtMzI5LDI3ICsyOTgsMjYgQEAKIC8qCiAgKiBkZWxpdmVyIHJlcXVlc3QgZGF0YSB0byBhIENCLkluaXRDYWxsQmFja1N0YXRlIGNhbGwKICAqLwotc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9pbml0X2NhbGxfYmFja19zdGF0ZShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCi0JCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkgICAgICAgYm9vbCBsYXN0KQorc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9pbml0X2NhbGxfYmFja19zdGF0ZShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7CisJc3RydWN0IHNvY2thZGRyX3J4cnBjIHNyeDsKIAlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOwotCXN0cnVjdCBpbl9hZGRyIGFkZHI7CisJaW50IHJldDsKIAotCV9lbnRlcigiLHsldX0sJWQiLCBza2ItPmxlbiwgbGFzdCk7CisJX2VudGVyKCIiKTsKIAotCWlmIChza2ItPmxlbiA+IDApCi0JCXJldHVybiAtRUJBRE1TRzsKLQlpZiAoIWxhc3QpCi0JCXJldHVybiAwOworCXJ4cnBjX2tlcm5lbF9nZXRfcGVlcihhZnNfc29ja2V0LCBjYWxsLT5yeGNhbGwsICZzcngpOworCisJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBOVUxMLCAwLCBmYWxzZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAkvKiBubyB1bm1hcnNoYWxsaW5nIHJlcXVpcmVkICovCiAJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9SRVBMWUlORzsKIAogCS8qIHdlJ2xsIG5lZWQgdGhlIGZpbGUgc2VydmVyIHJlY29yZCBhcyB0aGF0IHRlbGxzIHVzIHdoaWNoIHNldCBvZgogCSAqIHZub2RlcyB0byBvcGVyYXRlIHVwb24gKi8KLQltZW1jcHkoJmFkZHIsICZpcF9oZHIoc2tiKS0+c2FkZHIsIDQpOwotCXNlcnZlciA9IGFmc19maW5kX3NlcnZlcigmYWRkcik7CisJc2VydmVyID0gYWZzX2ZpbmRfc2VydmVyKCZzcngpOwogCWlmICghc2VydmVyKQogCQlyZXR1cm4gLUVOT1RDT05OOwogCWNhbGwtPnNlcnZlciA9IHNlcnZlcjsKQEAgLTM2MiwxMDggKzMzMCwyMCBAQAogLyoKICAqIGRlbGl2ZXIgcmVxdWVzdCBkYXRhIHRvIGEgQ0IuSW5pdENhbGxCYWNrU3RhdGUzIGNhbGwKICAqLwotc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9pbml0X2NhbGxfYmFja19zdGF0ZTMoc3RydWN0IGFmc19jYWxsICpjYWxsLAotCQkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJCWJvb2wgbGFzdCkKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfaW5pdF9jYWxsX2JhY2tfc3RhdGUzKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKIHsKKwlzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgc3J4OwogCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7Ci0Jc3RydWN0IGluX2FkZHIgYWRkcjsKLQotCV9lbnRlcigiLHsldX0sJWQiLCBza2ItPmxlbiwgbGFzdCk7Ci0KLQlpZiAoIWxhc3QpCi0JCXJldHVybiAwOwotCi0JLyogbm8gdW5tYXJzaGFsbGluZyByZXF1aXJlZCAqLwotCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfUkVQTFlJTkc7Ci0KLQkvKiB3ZSdsbCBuZWVkIHRoZSBmaWxlIHNlcnZlciByZWNvcmQgYXMgdGhhdCB0ZWxscyB1cyB3aGljaCBzZXQgb2YKLQkgKiB2bm9kZXMgdG8gb3BlcmF0ZSB1cG9uICovCi0JbWVtY3B5KCZhZGRyLCAmaXBfaGRyKHNrYiktPnNhZGRyLCA0KTsKLQlzZXJ2ZXIgPSBhZnNfZmluZF9zZXJ2ZXIoJmFkZHIpOwotCWlmICghc2VydmVyKQotCQlyZXR1cm4gLUVOT1RDT05OOwotCWNhbGwtPnNlcnZlciA9IHNlcnZlcjsKLQotCUlOSVRfV09SSygmY2FsbC0+d29yaywgU1JYQUZTQ0JfSW5pdENhbGxCYWNrU3RhdGUpOwotCXF1ZXVlX3dvcmsoYWZzX3dxLCAmY2FsbC0+d29yayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBhbGxvdyB0aGUgZmlsZXNlcnZlciB0byBzZWUgaWYgdGhlIGNhY2hlIG1hbmFnZXIgaXMgc3RpbGwgYWxpdmUKLSAqLwotc3RhdGljIHZvaWQgU1JYQUZTQ0JfUHJvYmUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhZnNfY2FsbCAqY2FsbCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWZzX2NhbGwsIHdvcmspOwotCi0JX2VudGVyKCIiKTsKLQlhZnNfc2VuZF9lbXB0eV9yZXBseShjYWxsKTsKLQlfbGVhdmUoIiIpOwotfQotCi0vKgotICogZGVsaXZlciByZXF1ZXN0IGRhdGEgdG8gYSBDQi5Qcm9iZSBjYWxsCi0gKi8KLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfcHJvYmUoc3RydWN0IGFmc19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCWJvb2wgbGFzdCkKLXsKLQlfZW50ZXIoIix7JXV9LCVkIiwgc2tiLT5sZW4sIGxhc3QpOwotCi0JaWYgKHNrYi0+bGVuID4gMCkKLQkJcmV0dXJuIC1FQkFETVNHOwotCWlmICghbGFzdCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBubyB1bm1hcnNoYWxsaW5nIHJlcXVpcmVkICovCi0JY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9SRVBMWUlORzsKLQotCUlOSVRfV09SSygmY2FsbC0+d29yaywgU1JYQUZTQ0JfUHJvYmUpOwotCXF1ZXVlX3dvcmsoYWZzX3dxLCAmY2FsbC0+d29yayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBhbGxvdyB0aGUgZmlsZXNlcnZlciB0byBxdWlja2x5IGZpbmQgb3V0IGlmIHRoZSBmaWxlc2VydmVyIGhhcyBiZWVuIHJlYm9vdGVkCi0gKi8KLXN0YXRpYyB2b2lkIFNSWEFGU0NCX1Byb2JlVXVpZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGFmc19jYWxsICpjYWxsID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhZnNfY2FsbCwgd29yayk7Ci0Jc3RydWN0IGFmc191dWlkICpyID0gY2FsbC0+cmVxdWVzdDsKLQotCXN0cnVjdCB7Ci0JCV9fYmUzMgltYXRjaDsKLQl9IHJlcGx5OwotCi0JX2VudGVyKCIiKTsKLQotCi0JaWYgKG1lbWNtcChyLCAmYWZzX3V1aWQsIHNpemVvZihhZnNfdXVpZCkpID09IDApCi0JCXJlcGx5Lm1hdGNoID0gaHRvbmwoMCk7Ci0JZWxzZQotCQlyZXBseS5tYXRjaCA9IGh0b25sKDEpOwotCi0JYWZzX3NlbmRfc2ltcGxlX3JlcGx5KGNhbGwsICZyZXBseSwgc2l6ZW9mKHJlcGx5KSk7Ci0JX2xlYXZlKCIiKTsKLX0KLQotLyoKLSAqIGRlbGl2ZXIgcmVxdWVzdCBkYXRhIHRvIGEgQ0IuUHJvYmVVdWlkIGNhbGwKLSAqLwotc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9wcm9iZV91dWlkKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgIGJvb2wgbGFzdCkKLXsKIAlzdHJ1Y3QgYWZzX3V1aWQgKnI7CiAJdW5zaWduZWQgbG9vcDsKIAlfX2JlMzIgKmI7CiAJaW50IHJldDsKIAotCV9lbnRlcigieyV1fSx7JXV9LCVkIiwgY2FsbC0+dW5tYXJzaGFsbCwgc2tiLT5sZW4sIGxhc3QpOworCV9lbnRlcigiIik7CiAKLQlpZiAoc2tiLT5sZW4gPiAwKQotCQlyZXR1cm4gLUVCQURNU0c7Ci0JaWYgKCFsYXN0KQotCQlyZXR1cm4gMDsKKwlyeHJwY19rZXJuZWxfZ2V0X3BlZXIoYWZzX3NvY2tldCwgY2FsbC0+cnhjYWxsLCAmc3J4KTsKKworCV9lbnRlcigieyV1fSIsIGNhbGwtPnVubWFyc2hhbGwpOwogCiAJc3dpdGNoIChjYWxsLT51bm1hcnNoYWxsKSB7CiAJY2FzZSAwOgpAQCAtNDc1LDggKzM1NSw4IEBACiAKIAljYXNlIDE6CiAJCV9kZWJ1ZygiZXh0cmFjdCBVVUlEIik7Ci0JCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCBjYWxsLT5idWZmZXIsCi0JCQkJICAgICAgIDExICogc2l6ZW9mKF9fYmUzMikpOworCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIGNhbGwtPmJ1ZmZlciwKKwkJCQkgICAgICAgMTEgKiBzaXplb2YoX19iZTMyKSwgZmFsc2UpOwogCQlzd2l0Y2ggKHJldCkgewogCQljYXNlIDA6CQlicmVhazsKIAkJY2FzZSAtRUFHQUlOOglyZXR1cm4gMDsKQEAgLTUwMywxNCArMzgzLDEzMiBAQAogCQljYWxsLT51bm1hcnNoYWxsKys7CiAKIAljYXNlIDI6Ci0JCV9kZWJ1ZygidHJhaWxlciIpOwotCQlpZiAoc2tiLT5sZW4gIT0gMCkKLQkJCXJldHVybiAtRUJBRE1TRzsKIAkJYnJlYWs7CiAJfQogCi0JaWYgKCFsYXN0KQotCQlyZXR1cm4gMDsKKwkvKiBubyB1bm1hcnNoYWxsaW5nIHJlcXVpcmVkICovCisJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9SRVBMWUlORzsKKworCS8qIHdlJ2xsIG5lZWQgdGhlIGZpbGUgc2VydmVyIHJlY29yZCBhcyB0aGF0IHRlbGxzIHVzIHdoaWNoIHNldCBvZgorCSAqIHZub2RlcyB0byBvcGVyYXRlIHVwb24gKi8KKwlzZXJ2ZXIgPSBhZnNfZmluZF9zZXJ2ZXIoJnNyeCk7CisJaWYgKCFzZXJ2ZXIpCisJCXJldHVybiAtRU5PVENPTk47CisJY2FsbC0+c2VydmVyID0gc2VydmVyOworCisJSU5JVF9XT1JLKCZjYWxsLT53b3JrLCBTUlhBRlNDQl9Jbml0Q2FsbEJhY2tTdGF0ZSk7CisJcXVldWVfd29yayhhZnNfd3EsICZjYWxsLT53b3JrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGFsbG93IHRoZSBmaWxlc2VydmVyIHRvIHNlZSBpZiB0aGUgY2FjaGUgbWFuYWdlciBpcyBzdGlsbCBhbGl2ZQorICovCitzdGF0aWMgdm9pZCBTUlhBRlNDQl9Qcm9iZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGFmc19jYWxsICpjYWxsID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhZnNfY2FsbCwgd29yayk7CisKKwlfZW50ZXIoIiIpOworCWFmc19zZW5kX2VtcHR5X3JlcGx5KGNhbGwpOworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBkZWxpdmVyIHJlcXVlc3QgZGF0YSB0byBhIENCLlByb2JlIGNhbGwKKyAqLworc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9wcm9iZShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCit7CisJaW50IHJldDsKKworCV9lbnRlcigiIik7CisKKwlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIE5VTEwsIDAsIGZhbHNlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIG5vIHVubWFyc2hhbGxpbmcgcmVxdWlyZWQgKi8KKwljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX1JFUExZSU5HOworCisJSU5JVF9XT1JLKCZjYWxsLT53b3JrLCBTUlhBRlNDQl9Qcm9iZSk7CisJcXVldWVfd29yayhhZnNfd3EsICZjYWxsLT53b3JrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGFsbG93IHRoZSBmaWxlc2VydmVyIHRvIHF1aWNrbHkgZmluZCBvdXQgaWYgdGhlIGZpbGVzZXJ2ZXIgaGFzIGJlZW4gcmVib290ZWQKKyAqLworc3RhdGljIHZvaWQgU1JYQUZTQ0JfUHJvYmVVdWlkKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFmc19jYWxsLCB3b3JrKTsKKwlzdHJ1Y3QgYWZzX3V1aWQgKnIgPSBjYWxsLT5yZXF1ZXN0OworCisJc3RydWN0IHsKKwkJX19iZTMyCW1hdGNoOworCX0gcmVwbHk7CisKKwlfZW50ZXIoIiIpOworCisJaWYgKG1lbWNtcChyLCAmYWZzX3V1aWQsIHNpemVvZihhZnNfdXVpZCkpID09IDApCisJCXJlcGx5Lm1hdGNoID0gaHRvbmwoMCk7CisJZWxzZQorCQlyZXBseS5tYXRjaCA9IGh0b25sKDEpOworCisJYWZzX3NlbmRfc2ltcGxlX3JlcGx5KGNhbGwsICZyZXBseSwgc2l6ZW9mKHJlcGx5KSk7CisJX2xlYXZlKCIiKTsKK30KKworLyoKKyAqIGRlbGl2ZXIgcmVxdWVzdCBkYXRhIHRvIGEgQ0IuUHJvYmVVdWlkIGNhbGwKKyAqLworc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9wcm9iZV91dWlkKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKK3sKKwlzdHJ1Y3QgYWZzX3V1aWQgKnI7CisJdW5zaWduZWQgbG9vcDsKKwlfX2JlMzIgKmI7CisJaW50IHJldDsKKworCV9lbnRlcigieyV1fSIsIGNhbGwtPnVubWFyc2hhbGwpOworCisJc3dpdGNoIChjYWxsLT51bm1hcnNoYWxsKSB7CisJY2FzZSAwOgorCQljYWxsLT5vZmZzZXQgPSAwOworCQljYWxsLT5idWZmZXIgPSBrbWFsbG9jKDExICogc2l6ZW9mKF9fYmUzMiksIEdGUF9LRVJORUwpOworCQlpZiAoIWNhbGwtPmJ1ZmZlcikKKwkJCXJldHVybiAtRU5PTUVNOworCQljYWxsLT51bm1hcnNoYWxsKys7CisKKwljYXNlIDE6CisJCV9kZWJ1ZygiZXh0cmFjdCBVVUlEIik7CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgY2FsbC0+YnVmZmVyLAorCQkJCSAgICAgICAxMSAqIHNpemVvZihfX2JlMzIpLCBmYWxzZSk7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgMDoJCWJyZWFrOworCQljYXNlIC1FQUdBSU46CXJldHVybiAwOworCQlkZWZhdWx0OglyZXR1cm4gcmV0OworCQl9CisKKwkJX2RlYnVnKCJ1bm1hcnNoYWxsIFVVSUQiKTsKKwkJY2FsbC0+cmVxdWVzdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZnNfdXVpZCksIEdGUF9LRVJORUwpOworCQlpZiAoIWNhbGwtPnJlcXVlc3QpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQliID0gY2FsbC0+YnVmZmVyOworCQlyID0gY2FsbC0+cmVxdWVzdDsKKwkJci0+dGltZV9sb3cJCQk9IG50b2hsKGJbMF0pOworCQlyLT50aW1lX21pZAkJCT0gbnRvaGwoYlsxXSk7CisJCXItPnRpbWVfaGlfYW5kX3ZlcnNpb24JCT0gbnRvaGwoYlsyXSk7CisJCXItPmNsb2NrX3NlcV9oaV9hbmRfcmVzZXJ2ZWQgCT0gbnRvaGwoYlszXSk7CisJCXItPmNsb2NrX3NlcV9sb3cJCT0gbnRvaGwoYls0XSk7CisKKwkJZm9yIChsb29wID0gMDsgbG9vcCA8IDY7IGxvb3ArKykKKwkJCXItPm5vZGVbbG9vcF0gPSBudG9obChiW2xvb3AgKyA1XSk7CisKKwkJY2FsbC0+b2Zmc2V0ID0gMDsKKwkJY2FsbC0+dW5tYXJzaGFsbCsrOworCisJY2FzZSAyOgorCQlicmVhazsKKwl9CiAKIAljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX1JFUExZSU5HOwogCkBAIC01ODUsMTUgKzU4MywxNSBAQAogLyoKICAqIGRlbGl2ZXIgcmVxdWVzdCBkYXRhIHRvIGEgQ0IuVGVsbE1lQWJvdXRZb3Vyc2VsZiBjYWxsCiAgKi8KLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfdGVsbF9tZV9hYm91dF95b3Vyc2VsZihzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCi0JCQkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBsYXN0KQorc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl90ZWxsX21lX2Fib3V0X3lvdXJzZWxmKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKIHsKLQlfZW50ZXIoIix7JXV9LCVkIiwgc2tiLT5sZW4sIGxhc3QpOworCWludCByZXQ7CiAKLQlpZiAoc2tiLT5sZW4gPiAwKQotCQlyZXR1cm4gLUVCQURNU0c7Ci0JaWYgKCFsYXN0KQotCQlyZXR1cm4gMDsKKwlfZW50ZXIoIiIpOworCisJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBOVUxMLCAwLCBmYWxzZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAkvKiBubyB1bm1hcnNoYWxsaW5nIHJlcXVpcmVkICovCiAJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9SRVBMWUlORzsKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9mbG9jay5jIGIvZnMvYWZzL2Zsb2NrLmMKaW5kZXggZDkxYTljOS4uMzE5MWRmZiAxMDA2NDQKLS0tIGEvZnMvYWZzL2Zsb2NrLmMKKysrIGIvZnMvYWZzL2Zsb2NrLmMKQEAgLTM2LDggKzM2LDggQEAKIAlpZiAoIWFmc19sb2NrX21hbmFnZXIpIHsKIAkJbXV0ZXhfbG9jaygmYWZzX2xvY2tfbWFuYWdlcl9tdXRleCk7CiAJCWlmICghYWZzX2xvY2tfbWFuYWdlcikgewotCQkJYWZzX2xvY2tfbWFuYWdlciA9Ci0JCQkJY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImthZnNfbG9ja2QiKTsKKwkJCWFmc19sb2NrX21hbmFnZXIgPSBhbGxvY193b3JrcXVldWUoImthZnNfbG9ja2QiLAorCQkJCQkJCSAgIFdRX01FTV9SRUNMQUlNLCAwKTsKIAkJCWlmICghYWZzX2xvY2tfbWFuYWdlcikKIAkJCQlyZXQgPSAtRU5PTUVNOwogCQl9CmRpZmYgLS1naXQgYS9mcy9hZnMvZnNjbGllbnQuYyBiL2ZzL2Fmcy9mc2NsaWVudC5jCmluZGV4IGMyZTkzMGUuLjk2ZjRkNzYgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9mc2NsaWVudC5jCisrKyBiL2ZzL2Fmcy9mc2NsaWVudC5jCkBAIC0yMzUsMjAgKzIzNSwxNyBAQAogLyoKICAqIGRlbGl2ZXIgcmVwbHkgZGF0YSB0byBhbiBGUy5GZXRjaFN0YXR1cwogICovCi1zdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX2ZldGNoX3N0YXR1cyhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCi0JCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgbGFzdCkKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfZmV0Y2hfc3RhdHVzKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKIHsKIAlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IGNhbGwtPnJlcGx5OwogCWNvbnN0IF9fYmUzMiAqYnA7CisJaW50IHJldDsKIAotCV9lbnRlcigiLCwldSIsIGxhc3QpOworCV9lbnRlcigiIik7CiAKLQlhZnNfdHJhbnNmZXJfcmVwbHkoY2FsbCwgc2tiKTsKLQlpZiAoIWxhc3QpCi0JCXJldHVybiAwOwotCi0JaWYgKGNhbGwtPnJlcGx5X3NpemUgIT0gY2FsbC0+cmVwbHlfbWF4KQotCQlyZXR1cm4gLUVCQURNU0c7CisJcmV0ID0gYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OwogCiAJLyogdW5tYXJzaGFsbCB0aGUgcmVwbHkgb25jZSB3ZSd2ZSByZWNlaXZlZCBhbGwgb2YgaXQgKi8KIAlicCA9IGNhbGwtPmJ1ZmZlcjsKQEAgLTMwOSw4ICszMDYsNyBAQAogLyoKICAqIGRlbGl2ZXIgcmVwbHkgZGF0YSB0byBhbiBGUy5GZXRjaERhdGEKICAqLwotc3RhdGljIGludCBhZnNfZGVsaXZlcl9mc19mZXRjaF9kYXRhKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCwKLQkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgbGFzdCkKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfZmV0Y2hfZGF0YShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7CiAJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBjYWxsLT5yZXBseTsKIAljb25zdCBfX2JlMzIgKmJwOwpAQCAtMzE4LDcgKzMxNCw3IEBACiAJdm9pZCAqYnVmZmVyOwogCWludCByZXQ7CiAKLQlfZW50ZXIoInsldX0seyV1fSwlZCIsIGNhbGwtPnVubWFyc2hhbGwsIHNrYi0+bGVuLCBsYXN0KTsKKwlfZW50ZXIoInsldX0iLCBjYWxsLT51bm1hcnNoYWxsKTsKIAogCXN3aXRjaCAoY2FsbC0+dW5tYXJzaGFsbCkgewogCWNhc2UgMDoKQEAgLTMzNCwxMiArMzMwLDkgQEAKIAkJICogY2xpZW50KSAqLwogCWNhc2UgMToKIAkJX2RlYnVnKCJleHRyYWN0IGRhdGEgbGVuZ3RoIChNU1cpIik7Ci0JCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCAmY2FsbC0+dG1wLCA0KTsKLQkJc3dpdGNoIChyZXQpIHsKLQkJY2FzZSAwOgkJYnJlYWs7Ci0JCWNhc2UgLUVBR0FJTjoJcmV0dXJuIDA7Ci0JCWRlZmF1bHQ6CXJldHVybiByZXQ7Ci0JCX0KKwkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCAmY2FsbC0+dG1wLCA0LCB0cnVlKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OwogCiAJCWNhbGwtPmNvdW50ID0gbnRvaGwoY2FsbC0+dG1wKTsKIAkJX2RlYnVnKCJEQVRBIGxlbmd0aCBNU1c6ICV1IiwgY2FsbC0+Y291bnQpOwpAQCAtMzUyLDEyICszNDUsOSBAQAogCQkvKiBleHRyYWN0IHRoZSByZXR1cm5lZCBkYXRhIGxlbmd0aCAqLwogCWNhc2UgMjoKIAkJX2RlYnVnKCJleHRyYWN0IGRhdGEgbGVuZ3RoIik7Ci0JCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCAmY2FsbC0+dG1wLCA0KTsKLQkJc3dpdGNoIChyZXQpIHsKLQkJY2FzZSAwOgkJYnJlYWs7Ci0JCWNhc2UgLUVBR0FJTjoJcmV0dXJuIDA7Ci0JCWRlZmF1bHQ6CXJldHVybiByZXQ7Ci0JCX0KKwkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCAmY2FsbC0+dG1wLCA0LCB0cnVlKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OwogCiAJCWNhbGwtPmNvdW50ID0gbnRvaGwoY2FsbC0+dG1wKTsKIAkJX2RlYnVnKCJEQVRBIGxlbmd0aDogJXUiLCBjYWxsLT5jb3VudCk7CkBAIC0zNzEsMTUgKzM2MSwxMiBAQAogCQlfZGVidWcoImV4dHJhY3QgZGF0YSIpOwogCQlpZiAoY2FsbC0+Y291bnQgPiAwKSB7CiAJCQlwYWdlID0gY2FsbC0+cmVwbHkzOwotCQkJYnVmZmVyID0ga21hcF9hdG9taWMocGFnZSk7Ci0JCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgYnVmZmVyLAotCQkJCQkgICAgICAgY2FsbC0+Y291bnQpOwotCQkJa3VubWFwX2F0b21pYyhidWZmZXIpOwotCQkJc3dpdGNoIChyZXQpIHsKLQkJCWNhc2UgMDoJCWJyZWFrOwotCQkJY2FzZSAtRUFHQUlOOglyZXR1cm4gMDsKLQkJCWRlZmF1bHQ6CXJldHVybiByZXQ7Ci0JCQl9CisJCQlidWZmZXIgPSBrbWFwKHBhZ2UpOworCQkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBidWZmZXIsCisJCQkJCSAgICAgICBjYWxsLT5jb3VudCwgdHJ1ZSk7CisJCQlrdW5tYXAoYnVmZmVyKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CiAJCX0KIAogCQljYWxsLT5vZmZzZXQgPSAwOwpAQCAtMzg3LDEzICszNzQsMTAgQEAKIAogCQkvKiBleHRyYWN0IHRoZSBtZXRhZGF0YSAqLwogCWNhc2UgNDoKLQkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBza2IsIGxhc3QsIGNhbGwtPmJ1ZmZlciwKLQkJCQkgICAgICAgKDIxICsgMyArIDYpICogNCk7Ci0JCXN3aXRjaCAocmV0KSB7Ci0JCWNhc2UgMDoJCWJyZWFrOwotCQljYXNlIC1FQUdBSU46CXJldHVybiAwOwotCQlkZWZhdWx0OglyZXR1cm4gcmV0OwotCQl9CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgY2FsbC0+YnVmZmVyLAorCQkJCSAgICAgICAoMjEgKyAzICsgNikgKiA0LCBmYWxzZSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKIAogCQlicCA9IGNhbGwtPmJ1ZmZlcjsKIAkJeGRyX2RlY29kZV9BRlNGZXRjaFN0YXR1cygmYnAsICZ2bm9kZS0+c3RhdHVzLCB2bm9kZSwgTlVMTCk7CkBAIC00MDUsMjEgKzM4OSwxNSBAQAogCQljYWxsLT51bm1hcnNoYWxsKys7CiAKIAljYXNlIDU6Ci0JCV9kZWJ1ZygidHJhaWxlciIpOwotCQlpZiAoc2tiLT5sZW4gIT0gMCkKLQkJCXJldHVybiAtRUJBRE1TRzsKIAkJYnJlYWs7CiAJfQogCi0JaWYgKCFsYXN0KQotCQlyZXR1cm4gMDsKLQogCWlmIChjYWxsLT5jb3VudCA8IFBBR0VfU0laRSkgewogCQlfZGVidWcoImNsZWFyIik7CiAJCXBhZ2UgPSBjYWxsLT5yZXBseTM7Ci0JCWJ1ZmZlciA9IGttYXBfYXRvbWljKHBhZ2UpOworCQlidWZmZXIgPSBrbWFwKHBhZ2UpOwogCQltZW1zZXQoYnVmZmVyICsgY2FsbC0+Y291bnQsIDAsIFBBR0VfU0laRSAtIGNhbGwtPmNvdW50KTsKLQkJa3VubWFwX2F0b21pYyhidWZmZXIpOworCQlrdW5tYXAoYnVmZmVyKTsKIAl9CiAKIAlfbGVhdmUoIiA9IDAgW2RvbmVdIik7CkBAIC01MzIsMTQgKzUxMCwxMiBAQAogLyoKICAqIGRlbGl2ZXIgcmVwbHkgZGF0YSB0byBhbiBGUy5HaXZlVXBDYWxsQmFja3MKICAqLwotc3RhdGljIGludCBhZnNfZGVsaXZlcl9mc19naXZlX3VwX2NhbGxiYWNrcyhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCi0JCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIGxhc3QpCitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX2dpdmVfdXBfY2FsbGJhY2tzKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKIHsKLQlfZW50ZXIoIix7JXV9LCVkIiwgc2tiLT5sZW4sIGxhc3QpOworCV9lbnRlcigiIik7CiAKLQlpZiAoc2tiLT5sZW4gPiAwKQotCQlyZXR1cm4gLUVCQURNU0c7IC8qIHNob3VsZG4ndCBiZSBhbnkgcmVwbHkgZGF0YSAqLwotCXJldHVybiAwOworCS8qIHNob3VsZG4ndCBiZSBhbnkgcmVwbHkgZGF0YSAqLworCXJldHVybiBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIE5VTEwsIDAsIGZhbHNlKTsKIH0KIAogLyoKQEAgLTYxNywyMCArNTkzLDE3IEBACiAvKgogICogZGVsaXZlciByZXBseSBkYXRhIHRvIGFuIEZTLkNyZWF0ZUZpbGUgb3IgYW4gRlMuTWFrZURpcgogICovCi1zdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX2NyZWF0ZV92bm9kZShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCi0JCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgbGFzdCkKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfY3JlYXRlX3Zub2RlKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKIHsKIAlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IGNhbGwtPnJlcGx5OwogCWNvbnN0IF9fYmUzMiAqYnA7CisJaW50IHJldDsKIAotCV9lbnRlcigieyV1fSx7JXV9LCVkIiwgY2FsbC0+dW5tYXJzaGFsbCwgc2tiLT5sZW4sIGxhc3QpOworCV9lbnRlcigieyV1fSIsIGNhbGwtPnVubWFyc2hhbGwpOwogCi0JYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwsIHNrYik7Ci0JaWYgKCFsYXN0KQotCQlyZXR1cm4gMDsKLQotCWlmIChjYWxsLT5yZXBseV9zaXplICE9IGNhbGwtPnJlcGx5X21heCkKLQkJcmV0dXJuIC1FQkFETVNHOworCXJldCA9IGFmc190cmFuc2Zlcl9yZXBseShjYWxsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAogCS8qIHVubWFyc2hhbGwgdGhlIHJlcGx5IG9uY2Ugd2UndmUgcmVjZWl2ZWQgYWxsIG9mIGl0ICovCiAJYnAgPSBjYWxsLT5idWZmZXI7CkBAIC03MTYsMjAgKzY4OSwxNyBAQAogLyoKICAqIGRlbGl2ZXIgcmVwbHkgZGF0YSB0byBhbiBGUy5SZW1vdmVGaWxlIG9yIEZTLlJlbW92ZURpcgogICovCi1zdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX3JlbW92ZShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCi0JCQkJIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgbGFzdCkKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfcmVtb3ZlKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKIHsKIAlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IGNhbGwtPnJlcGx5OwogCWNvbnN0IF9fYmUzMiAqYnA7CisJaW50IHJldDsKIAotCV9lbnRlcigieyV1fSx7JXV9LCVkIiwgY2FsbC0+dW5tYXJzaGFsbCwgc2tiLT5sZW4sIGxhc3QpOworCV9lbnRlcigieyV1fSIsIGNhbGwtPnVubWFyc2hhbGwpOwogCi0JYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwsIHNrYik7Ci0JaWYgKCFsYXN0KQotCQlyZXR1cm4gMDsKLQotCWlmIChjYWxsLT5yZXBseV9zaXplICE9IGNhbGwtPnJlcGx5X21heCkKLQkJcmV0dXJuIC1FQkFETVNHOworCXJldCA9IGFmc190cmFuc2Zlcl9yZXBseShjYWxsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAogCS8qIHVubWFyc2hhbGwgdGhlIHJlcGx5IG9uY2Ugd2UndmUgcmVjZWl2ZWQgYWxsIG9mIGl0ICovCiAJYnAgPSBjYWxsLT5idWZmZXI7CkBAIC03OTksMjAgKzc2OSwxNyBAQAogLyoKICAqIGRlbGl2ZXIgcmVwbHkgZGF0YSB0byBhbiBGUy5MaW5rCiAgKi8KLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfbGluayhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCi0JCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBsYXN0KQorc3RhdGljIGludCBhZnNfZGVsaXZlcl9mc19saW5rKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKIHsKIAlzdHJ1Y3QgYWZzX3Zub2RlICpkdm5vZGUgPSBjYWxsLT5yZXBseSwgKnZub2RlID0gY2FsbC0+cmVwbHkyOwogCWNvbnN0IF9fYmUzMiAqYnA7CisJaW50IHJldDsKIAotCV9lbnRlcigieyV1fSx7JXV9LCVkIiwgY2FsbC0+dW5tYXJzaGFsbCwgc2tiLT5sZW4sIGxhc3QpOworCV9lbnRlcigieyV1fSIsIGNhbGwtPnVubWFyc2hhbGwpOwogCi0JYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwsIHNrYik7Ci0JaWYgKCFsYXN0KQotCQlyZXR1cm4gMDsKLQotCWlmIChjYWxsLT5yZXBseV9zaXplICE9IGNhbGwtPnJlcGx5X21heCkKLQkJcmV0dXJuIC1FQkFETVNHOworCXJldCA9IGFmc190cmFuc2Zlcl9yZXBseShjYWxsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAogCS8qIHVubWFyc2hhbGwgdGhlIHJlcGx5IG9uY2Ugd2UndmUgcmVjZWl2ZWQgYWxsIG9mIGl0ICovCiAJYnAgPSBjYWxsLT5idWZmZXI7CkBAIC04ODcsMjAgKzg1NCwxNyBAQAogLyoKICAqIGRlbGl2ZXIgcmVwbHkgZGF0YSB0byBhbiBGUy5TeW1saW5rCiAgKi8KLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfc3ltbGluayhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCi0JCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIGxhc3QpCitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX3N5bWxpbmsoc3RydWN0IGFmc19jYWxsICpjYWxsKQogewogCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0gY2FsbC0+cmVwbHk7CiAJY29uc3QgX19iZTMyICpicDsKKwlpbnQgcmV0OwogCi0JX2VudGVyKCJ7JXV9LHsldX0sJWQiLCBjYWxsLT51bm1hcnNoYWxsLCBza2ItPmxlbiwgbGFzdCk7CisJX2VudGVyKCJ7JXV9IiwgY2FsbC0+dW5tYXJzaGFsbCk7CiAKLQlhZnNfdHJhbnNmZXJfcmVwbHkoY2FsbCwgc2tiKTsKLQlpZiAoIWxhc3QpCi0JCXJldHVybiAwOwotCi0JaWYgKGNhbGwtPnJlcGx5X3NpemUgIT0gY2FsbC0+cmVwbHlfbWF4KQotCQlyZXR1cm4gLUVCQURNU0c7CisJcmV0ID0gYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OwogCiAJLyogdW5tYXJzaGFsbCB0aGUgcmVwbHkgb25jZSB3ZSd2ZSByZWNlaXZlZCBhbGwgb2YgaXQgKi8KIAlicCA9IGNhbGwtPmJ1ZmZlcjsKQEAgLTk5NCwyMCArOTU4LDE3IEBACiAvKgogICogZGVsaXZlciByZXBseSBkYXRhIHRvIGFuIEZTLlJlbmFtZQogICovCi1zdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX3JlbmFtZShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCi0JCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIGxhc3QpCitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX3JlbmFtZShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7CiAJc3RydWN0IGFmc192bm9kZSAqb3JpZ19kdm5vZGUgPSBjYWxsLT5yZXBseSwgKm5ld19kdm5vZGUgPSBjYWxsLT5yZXBseTI7CiAJY29uc3QgX19iZTMyICpicDsKKwlpbnQgcmV0OwogCi0JX2VudGVyKCJ7JXV9LHsldX0sJWQiLCBjYWxsLT51bm1hcnNoYWxsLCBza2ItPmxlbiwgbGFzdCk7CisJX2VudGVyKCJ7JXV9IiwgY2FsbC0+dW5tYXJzaGFsbCk7CiAKLQlhZnNfdHJhbnNmZXJfcmVwbHkoY2FsbCwgc2tiKTsKLQlpZiAoIWxhc3QpCi0JCXJldHVybiAwOwotCi0JaWYgKGNhbGwtPnJlcGx5X3NpemUgIT0gY2FsbC0+cmVwbHlfbWF4KQotCQlyZXR1cm4gLUVCQURNU0c7CisJcmV0ID0gYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OwogCiAJLyogdW5tYXJzaGFsbCB0aGUgcmVwbHkgb25jZSB3ZSd2ZSByZWNlaXZlZCBhbGwgb2YgaXQgKi8KIAlicCA9IGNhbGwtPmJ1ZmZlcjsKQEAgLTExMDAsMjUgKzEwNjEsMTcgQEAKIC8qCiAgKiBkZWxpdmVyIHJlcGx5IGRhdGEgdG8gYW4gRlMuU3RvcmVEYXRhCiAgKi8KLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfc3RvcmVfZGF0YShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCi0JCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIGxhc3QpCitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX3N0b3JlX2RhdGEoc3RydWN0IGFmc19jYWxsICpjYWxsKQogewogCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0gY2FsbC0+cmVwbHk7CiAJY29uc3QgX19iZTMyICpicDsKKwlpbnQgcmV0OwogCi0JX2VudGVyKCIsLCV1IiwgbGFzdCk7CisJX2VudGVyKCIiKTsKIAotCWFmc190cmFuc2Zlcl9yZXBseShjYWxsLCBza2IpOwotCWlmICghbGFzdCkgewotCQlfbGVhdmUoIiA9IDAgW21vcmVdIik7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChjYWxsLT5yZXBseV9zaXplICE9IGNhbGwtPnJlcGx5X21heCkgewotCQlfbGVhdmUoIiA9IC1FQkFETVNHIFsldSAhPSAldV0iLAotCQkgICAgICAgY2FsbC0+cmVwbHlfc2l6ZSwgY2FsbC0+cmVwbHlfbWF4KTsKLQkJcmV0dXJuIC1FQkFETVNHOwotCX0KKwlyZXQgPSBhZnNfdHJhbnNmZXJfcmVwbHkoY2FsbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAkvKiB1bm1hcnNoYWxsIHRoZSByZXBseSBvbmNlIHdlJ3ZlIHJlY2VpdmVkIGFsbCBvZiBpdCAqLwogCWJwID0gY2FsbC0+YnVmZmVyOwpAQCAtMTI4NiwyNiArMTIzOSwxOCBAQAogLyoKICAqIGRlbGl2ZXIgcmVwbHkgZGF0YSB0byBhbiBGUy5TdG9yZVN0YXR1cwogICovCi1zdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX3N0b3JlX3N0YXR1cyhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCi0JCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgbGFzdCkKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfc3RvcmVfc3RhdHVzKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKIHsKIAlhZnNfZGF0YXZlcnNpb25fdCAqc3RvcmVfdmVyc2lvbjsKIAlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IGNhbGwtPnJlcGx5OwogCWNvbnN0IF9fYmUzMiAqYnA7CisJaW50IHJldDsKIAotCV9lbnRlcigiLCwldSIsIGxhc3QpOworCV9lbnRlcigiIik7CiAKLQlhZnNfdHJhbnNmZXJfcmVwbHkoY2FsbCwgc2tiKTsKLQlpZiAoIWxhc3QpIHsKLQkJX2xlYXZlKCIgPSAwIFttb3JlXSIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoY2FsbC0+cmVwbHlfc2l6ZSAhPSBjYWxsLT5yZXBseV9tYXgpIHsKLQkJX2xlYXZlKCIgPSAtRUJBRE1TRyBbJXUgIT0gJXVdIiwKLQkJICAgICAgIGNhbGwtPnJlcGx5X3NpemUsIGNhbGwtPnJlcGx5X21heCk7Ci0JCXJldHVybiAtRUJBRE1TRzsKLQl9CisJcmV0ID0gYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OwogCiAJLyogdW5tYXJzaGFsbCB0aGUgcmVwbHkgb25jZSB3ZSd2ZSByZWNlaXZlZCBhbGwgb2YgaXQgKi8KIAlzdG9yZV92ZXJzaW9uID0gTlVMTDsKQEAgLTE0ODUsMTQgKzE0MzAsMTMgQEAKIC8qCiAgKiBkZWxpdmVyIHJlcGx5IGRhdGEgdG8gYW4gRlMuR2V0Vm9sdW1lU3RhdHVzCiAgKi8KLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfZ2V0X3ZvbHVtZV9zdGF0dXMoc3RydWN0IGFmc19jYWxsICpjYWxsLAotCQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBsYXN0KQorc3RhdGljIGludCBhZnNfZGVsaXZlcl9mc19nZXRfdm9sdW1lX3N0YXR1cyhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7CiAJY29uc3QgX19iZTMyICpicDsKIAljaGFyICpwOwogCWludCByZXQ7CiAKLQlfZW50ZXIoInsldX0seyV1fSwlZCIsIGNhbGwtPnVubWFyc2hhbGwsIHNrYi0+bGVuLCBsYXN0KTsKKwlfZW50ZXIoInsldX0iLCBjYWxsLT51bm1hcnNoYWxsKTsKIAogCXN3aXRjaCAoY2FsbC0+dW5tYXJzaGFsbCkgewogCWNhc2UgMDoKQEAgLTE1MDIsMTMgKzE0NDYsMTAgQEAKIAkJLyogZXh0cmFjdCB0aGUgcmV0dXJuZWQgc3RhdHVzIHJlY29yZCAqLwogCWNhc2UgMToKIAkJX2RlYnVnKCJleHRyYWN0IHN0YXR1cyIpOwotCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgY2FsbC0+YnVmZmVyLAotCQkJCSAgICAgICAxMiAqIDQpOwotCQlzd2l0Y2ggKHJldCkgewotCQljYXNlIDA6CQlicmVhazsKLQkJY2FzZSAtRUFHQUlOOglyZXR1cm4gMDsKLQkJZGVmYXVsdDoJcmV0dXJuIHJldDsKLQkJfQorCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIGNhbGwtPmJ1ZmZlciwKKwkJCQkgICAgICAgMTIgKiA0LCB0cnVlKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OwogCiAJCWJwID0gY2FsbC0+YnVmZmVyOwogCQl4ZHJfZGVjb2RlX0FGU0ZldGNoVm9sdW1lU3RhdHVzKCZicCwgY2FsbC0+cmVwbHkyKTsKQEAgLTE1MTcsMTIgKzE0NTgsOSBAQAogCiAJCS8qIGV4dHJhY3QgdGhlIHZvbHVtZSBuYW1lIGxlbmd0aCAqLwogCWNhc2UgMjoKLQkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBza2IsIGxhc3QsICZjYWxsLT50bXAsIDQpOwotCQlzd2l0Y2ggKHJldCkgewotCQljYXNlIDA6CQlicmVhazsKLQkJY2FzZSAtRUFHQUlOOglyZXR1cm4gMDsKLQkJZGVmYXVsdDoJcmV0dXJuIHJldDsKLQkJfQorCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsICZjYWxsLT50bXAsIDQsIHRydWUpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CiAKIAkJY2FsbC0+Y291bnQgPSBudG9obChjYWxsLT50bXApOwogCQlfZGVidWcoInZvbG5hbWUgbGVuZ3RoOiAldSIsIGNhbGwtPmNvdW50KTsKQEAgLTE1MzUsMTMgKzE0NzMsMTAgQEAKIAljYXNlIDM6CiAJCV9kZWJ1ZygiZXh0cmFjdCB2b2xuYW1lIik7CiAJCWlmIChjYWxsLT5jb3VudCA+IDApIHsKLQkJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCBjYWxsLT5yZXBseTMsCi0JCQkJCSAgICAgICBjYWxsLT5jb3VudCk7Ci0JCQlzd2l0Y2ggKHJldCkgewotCQkJY2FzZSAwOgkJYnJlYWs7Ci0JCQljYXNlIC1FQUdBSU46CXJldHVybiAwOwotCQkJZGVmYXVsdDoJcmV0dXJuIHJldDsKLQkJCX0KKwkJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgY2FsbC0+cmVwbHkzLAorCQkJCQkgICAgICAgY2FsbC0+Y291bnQsIHRydWUpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKIAkJfQogCiAJCXAgPSBjYWxsLT5yZXBseTM7CkBAIC0xNTU5LDEzICsxNDk0LDEwIEBACiAJCWNhbGwtPmNvdW50ID0gNCAtIChjYWxsLT5jb3VudCAmIDMpOwogCiAJY2FzZSA0OgotCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgY2FsbC0+YnVmZmVyLAotCQkJCSAgICAgICBjYWxsLT5jb3VudCk7Ci0JCXN3aXRjaCAocmV0KSB7Ci0JCWNhc2UgMDoJCWJyZWFrOwotCQljYXNlIC1FQUdBSU46CXJldHVybiAwOwotCQlkZWZhdWx0OglyZXR1cm4gcmV0OwotCQl9CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgY2FsbC0+YnVmZmVyLAorCQkJCSAgICAgICBjYWxsLT5jb3VudCwgdHJ1ZSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKIAogCQljYWxsLT5vZmZzZXQgPSAwOwogCQljYWxsLT51bm1hcnNoYWxsKys7CkBAIC0xNTczLDEyICsxNTA1LDkgQEAKIAogCQkvKiBleHRyYWN0IHRoZSBvZmZsaW5lIG1lc3NhZ2UgbGVuZ3RoICovCiAJY2FzZSA1OgotCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgJmNhbGwtPnRtcCwgNCk7Ci0JCXN3aXRjaCAocmV0KSB7Ci0JCWNhc2UgMDoJCWJyZWFrOwotCQljYXNlIC1FQUdBSU46CXJldHVybiAwOwotCQlkZWZhdWx0OglyZXR1cm4gcmV0OwotCQl9CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgJmNhbGwtPnRtcCwgNCwgdHJ1ZSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKIAogCQljYWxsLT5jb3VudCA9IG50b2hsKGNhbGwtPnRtcCk7CiAJCV9kZWJ1Zygib2ZmbGluZSBtc2cgbGVuZ3RoOiAldSIsIGNhbGwtPmNvdW50KTsKQEAgLTE1OTEsMTMgKzE1MjAsMTAgQEAKIAljYXNlIDY6CiAJCV9kZWJ1ZygiZXh0cmFjdCBvZmZsaW5lIik7CiAJCWlmIChjYWxsLT5jb3VudCA+IDApIHsKLQkJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCBjYWxsLT5yZXBseTMsCi0JCQkJCSAgICAgICBjYWxsLT5jb3VudCk7Ci0JCQlzd2l0Y2ggKHJldCkgewotCQkJY2FzZSAwOgkJYnJlYWs7Ci0JCQljYXNlIC1FQUdBSU46CXJldHVybiAwOwotCQkJZGVmYXVsdDoJcmV0dXJuIHJldDsKLQkJCX0KKwkJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgY2FsbC0+cmVwbHkzLAorCQkJCQkgICAgICAgY2FsbC0+Y291bnQsIHRydWUpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKIAkJfQogCiAJCXAgPSBjYWxsLT5yZXBseTM7CkBAIC0xNjE1LDEzICsxNTQxLDEwIEBACiAJCWNhbGwtPmNvdW50ID0gNCAtIChjYWxsLT5jb3VudCAmIDMpOwogCiAJY2FzZSA3OgotCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgY2FsbC0+YnVmZmVyLAotCQkJCSAgICAgICBjYWxsLT5jb3VudCk7Ci0JCXN3aXRjaCAocmV0KSB7Ci0JCWNhc2UgMDoJCWJyZWFrOwotCQljYXNlIC1FQUdBSU46CXJldHVybiAwOwotCQlkZWZhdWx0OglyZXR1cm4gcmV0OwotCQl9CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgY2FsbC0+YnVmZmVyLAorCQkJCSAgICAgICBjYWxsLT5jb3VudCwgdHJ1ZSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKIAogCQljYWxsLT5vZmZzZXQgPSAwOwogCQljYWxsLT51bm1hcnNoYWxsKys7CkBAIC0xNjI5LDEyICsxNTUyLDkgQEAKIAogCQkvKiBleHRyYWN0IHRoZSBtZXNzYWdlIG9mIHRoZSBkYXkgbGVuZ3RoICovCiAJY2FzZSA4OgotCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgJmNhbGwtPnRtcCwgNCk7Ci0JCXN3aXRjaCAocmV0KSB7Ci0JCWNhc2UgMDoJCWJyZWFrOwotCQljYXNlIC1FQUdBSU46CXJldHVybiAwOwotCQlkZWZhdWx0OglyZXR1cm4gcmV0OwotCQl9CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgJmNhbGwtPnRtcCwgNCwgdHJ1ZSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKIAogCQljYWxsLT5jb3VudCA9IG50b2hsKGNhbGwtPnRtcCk7CiAJCV9kZWJ1ZygibW90ZCBsZW5ndGg6ICV1IiwgY2FsbC0+Y291bnQpOwpAQCAtMTY0NywxMyArMTU2NywxMCBAQAogCWNhc2UgOToKIAkJX2RlYnVnKCJleHRyYWN0IG1vdGQiKTsKIAkJaWYgKGNhbGwtPmNvdW50ID4gMCkgewotCQkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBza2IsIGxhc3QsIGNhbGwtPnJlcGx5MywKLQkJCQkJICAgICAgIGNhbGwtPmNvdW50KTsKLQkJCXN3aXRjaCAocmV0KSB7Ci0JCQljYXNlIDA6CQlicmVhazsKLQkJCWNhc2UgLUVBR0FJTjoJcmV0dXJuIDA7Ci0JCQlkZWZhdWx0OglyZXR1cm4gcmV0OwotCQkJfQorCQkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBjYWxsLT5yZXBseTMsCisJCQkJCSAgICAgICBjYWxsLT5jb3VudCwgdHJ1ZSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OwogCQl9CiAKIAkJcCA9IGNhbGwtPnJlcGx5MzsKQEAgLTE2NjQsMzUgKzE1ODEsMjAgQEAKIAkJY2FsbC0+dW5tYXJzaGFsbCsrOwogCiAJCS8qIGV4dHJhY3QgdGhlIG1lc3NhZ2Ugb2YgdGhlIGRheSBwYWRkaW5nICovCi0JCWlmICgoY2FsbC0+Y291bnQgJiAzKSA9PSAwKSB7Ci0JCQljYWxsLT51bm1hcnNoYWxsKys7Ci0JCQlnb3RvIG5vX21vdGRfcGFkZGluZzsKLQkJfQotCQljYWxsLT5jb3VudCA9IDQgLSAoY2FsbC0+Y291bnQgJiAzKTsKKwkJY2FsbC0+Y291bnQgPSAoNCAtIChjYWxsLT5jb3VudCAmIDMpKSAmIDM7CiAKIAljYXNlIDEwOgotCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgY2FsbC0+YnVmZmVyLAotCQkJCSAgICAgICBjYWxsLT5jb3VudCk7Ci0JCXN3aXRjaCAocmV0KSB7Ci0JCWNhc2UgMDoJCWJyZWFrOwotCQljYXNlIC1FQUdBSU46CXJldHVybiAwOwotCQlkZWZhdWx0OglyZXR1cm4gcmV0OwotCQl9CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgY2FsbC0+YnVmZmVyLAorCQkJCSAgICAgICBjYWxsLT5jb3VudCwgZmFsc2UpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CiAKIAkJY2FsbC0+b2Zmc2V0ID0gMDsKIAkJY2FsbC0+dW5tYXJzaGFsbCsrOwotCW5vX21vdGRfcGFkZGluZzoKLQogCWNhc2UgMTE6Ci0JCV9kZWJ1ZygidHJhaWxlciAlZCIsIHNrYi0+bGVuKTsKLQkJaWYgKHNrYi0+bGVuICE9IDApCi0JCQlyZXR1cm4gLUVCQURNU0c7CiAJCWJyZWFrOwogCX0KIAotCWlmICghbGFzdCkKLQkJcmV0dXJuIDA7Ci0KIAlfbGVhdmUoIiA9IDAgW2RvbmVdIik7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNzYwLDE5ICsxNjYyLDE2IEBACiAvKgogICogZGVsaXZlciByZXBseSBkYXRhIHRvIGFuIEZTLlNldExvY2ssIEZTLkV4dGVuZExvY2sgb3IgRlMuUmVsZWFzZUxvY2sKICAqLwotc3RhdGljIGludCBhZnNfZGVsaXZlcl9mc194eHh4X2xvY2soc3RydWN0IGFmc19jYWxsICpjYWxsLAotCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIGxhc3QpCitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX3h4eHhfbG9jayhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7CiAJY29uc3QgX19iZTMyICpicDsKKwlpbnQgcmV0OwogCi0JX2VudGVyKCJ7JXV9LHsldX0sJWQiLCBjYWxsLT51bm1hcnNoYWxsLCBza2ItPmxlbiwgbGFzdCk7CisJX2VudGVyKCJ7JXV9IiwgY2FsbC0+dW5tYXJzaGFsbCk7CiAKLQlhZnNfdHJhbnNmZXJfcmVwbHkoY2FsbCwgc2tiKTsKLQlpZiAoIWxhc3QpCi0JCXJldHVybiAwOwotCi0JaWYgKGNhbGwtPnJlcGx5X3NpemUgIT0gY2FsbC0+cmVwbHlfbWF4KQotCQlyZXR1cm4gLUVCQURNU0c7CisJcmV0ID0gYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OwogCiAJLyogdW5tYXJzaGFsbCB0aGUgcmVwbHkgb25jZSB3ZSd2ZSByZWNlaXZlZCBhbGwgb2YgaXQgKi8KIAlicCA9IGNhbGwtPmJ1ZmZlcjsKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9pbnRlcm5hbC5oIGIvZnMvYWZzL2ludGVybmFsLmgKaW5kZXggNzFkNTk4Mi4uNTQ5N2M4NCAxMDA2NDQKLS0tIGEvZnMvYWZzL2ludGVybmFsLmgKKysrIGIvZnMvYWZzL2ludGVybmFsLmgKQEAgLTEzLDEzICsxMywxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3J4cnBjLmg+CiAjaW5jbHVkZSA8bGludXgva2V5Lmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9mc2NhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KKyNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KIAogI2luY2x1ZGUgImFmcy5oIgogI2luY2x1ZGUgImFmc192bC5oIgpAQCAtNTYsNyArNTYsNyBAQAogICovCiBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSB7CiAJLyogUnhSUEMgcmVjZWl2ZWQgbWVzc2FnZSBub3RpZmljYXRpb24gKi8KLQl2b2lkICgqcnhfd2FrZXVwKShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpOworCXJ4cnBjX25vdGlmeV9yeF90IG5vdGlmeV9yeDsKIAogCS8qIHN5bmNocm9ub3VzIGNhbGwgd2FpdGVyIGFuZCBjYWxsIGRpc3BhdGNoZWQgbm90aWZpY2F0aW9uICovCiAJaW50ICgqd2FpdCkoc3RydWN0IGFmc19jYWxsICpjYWxsKTsKQEAgLTc1LDEwICs3NSw4IEBACiAJY29uc3Qgc3RydWN0IGFmc19jYWxsX3R5cGUgKnR5cGU7CS8qIHR5cGUgb2YgY2FsbCAqLwogCWNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICp3YWl0X21vZGU7CS8qIGNvbXBsZXRpb24gd2FpdCBtb2RlICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdHE7CQkvKiBwcm9jZXNzZXMgYXdhaXRpbmcgY29tcGxldGlvbiAqLwotCXZvaWQgKCphc3luY193b3JrZm4pKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCk7IC8qIGFzeW5jaHJvbm91cyB3b3JrIGZ1bmN0aW9uICovCiAJc3RydWN0IHdvcmtfc3RydWN0CWFzeW5jX3dvcms7CS8qIGFzeW5jaHJvbm91cyB3b3JrIHByb2Nlc3NvciAqLwogCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOwkJLyogYWN0dWFsIHdvcmsgcHJvY2Vzc29yICovCi0Jc3RydWN0IHNrX2J1ZmZfaGVhZAlyeF9xdWV1ZTsJLyogcmVjZWl2ZWQgcGFja2V0cyAqLwogCXN0cnVjdCByeHJwY19jYWxsCSpyeGNhbGw7CS8qIFJ4UlBDIGNhbGwgaGFuZGxlICovCiAJc3RydWN0IGtleQkJKmtleTsJCS8qIHNlY3VyaXR5IGZvciB0aGlzIGNhbGwgKi8KIAlzdHJ1Y3QgYWZzX3NlcnZlcgkqc2VydmVyOwkvKiBzZXJ2ZXIgYWZmZWN0ZWQgYnkgaW5jb21pbmcgQ00gY2FsbCAqLwpAQCAtOTIsNiArOTAsNyBAQAogCXZvaWQJCQkqcmVwbHk0OwkvKiByZXBseSBidWZmZXIgKGZvdXJ0aCBwYXJ0KSAqLwogCXBnb2ZmX3QJCQlmaXJzdDsJCS8qIGZpcnN0IHBhZ2UgaW4gbWFwcGluZyB0byBkZWFsIHdpdGggKi8KIAlwZ29mZl90CQkJbGFzdDsJCS8qIGxhc3QgcGFnZSBpbiBtYXBwaW5nIHRvIGRlYWwgd2l0aCAqLworCXNpemVfdAkJCW9mZnNldDsJCS8qIG9mZnNldCBpbnRvIHJlY2VpdmVkIGRhdGEgc3RvcmUgKi8KIAllbnVtIHsJCQkJCS8qIGNhbGwgc3RhdGUgKi8KIAkJQUZTX0NBTExfUkVRVUVTVElORywJLyogcmVxdWVzdCBpcyBiZWluZyBzZW50IGZvciBvdXRnb2luZyBjYWxsICovCiAJCUFGU19DQUxMX0FXQUlUX1JFUExZLAkvKiBhd2FpdGluZyByZXBseSB0byBvdXRnb2luZyBjYWxsICovCkBAIC05OSwyMSArOTgsMTggQEAKIAkJQUZTX0NBTExfQVdBSVRfUkVRVUVTVCwJLyogYXdhaXRpbmcgcmVxdWVzdCBkYXRhIG9uIGluY29taW5nIGNhbGwgKi8KIAkJQUZTX0NBTExfUkVQTFlJTkcsCS8qIHJlcGx5aW5nIHRvIGluY29taW5nIGNhbGwgKi8KIAkJQUZTX0NBTExfQVdBSVRfQUNLLAkvKiBhd2FpdGluZyBmaW5hbCBBQ0sgb2YgaW5jb21pbmcgY2FsbCAqLwotCQlBRlNfQ0FMTF9DT01QTEVURSwJLyogc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCAqLwotCQlBRlNfQ0FMTF9CVVNZLAkJLyogc2VydmVyIHdhcyBidXN5ICovCi0JCUFGU19DQUxMX0FCT1JURUQsCS8qIGNhbGwgd2FzIGFib3J0ZWQgKi8KLQkJQUZTX0NBTExfRVJST1IsCQkvKiBjYWxsIGZhaWxlZCBkdWUgdG8gZXJyb3IgKi8KKwkJQUZTX0NBTExfQ09NUExFVEUsCS8qIENvbXBsZXRlZCBvciBmYWlsZWQgKi8KIAl9CQkJc3RhdGU7CiAJaW50CQkJZXJyb3I7CQkvKiBlcnJvciBjb2RlICovCisJdTMyCQkJYWJvcnRfY29kZTsJLyogUmVtb3RlIGFib3J0IElEIG9yIDAgKi8KIAl1bnNpZ25lZAkJcmVxdWVzdF9zaXplOwkvKiBzaXplIG9mIHJlcXVlc3QgZGF0YSAqLwogCXVuc2lnbmVkCQlyZXBseV9tYXg7CS8qIG1heGltdW0gc2l6ZSBvZiByZXBseSAqLwotCXVuc2lnbmVkCQlyZXBseV9zaXplOwkvKiBjdXJyZW50IHNpemUgb2YgcmVwbHkgKi8KIAl1bnNpZ25lZAkJZmlyc3Rfb2Zmc2V0OwkvKiBvZmZzZXQgaW50byBtYXBwaW5nW2ZpcnN0XSAqLwogCXVuc2lnbmVkCQlsYXN0X3RvOwkvKiBhbW91bnQgb2YgbWFwcGluZ1tsYXN0XSAqLwotCXVuc2lnbmVkCQlvZmZzZXQ7CQkvKiBvZmZzZXQgaW50byByZWNlaXZlZCBkYXRhIHN0b3JlICovCiAJdW5zaWduZWQgY2hhcgkJdW5tYXJzaGFsbDsJLyogdW5tYXJzaGFsbGluZyBwaGFzZSAqLwogCWJvb2wJCQlpbmNvbWluZzsJLyogVCBpZiBpbmNvbWluZyBjYWxsICovCiAJYm9vbAkJCXNlbmRfcGFnZXM7CS8qIFQgaWYgZGF0YSBmcm9tIG1hcHBpbmcgc2hvdWxkIGJlIHNlbnQgKi8KKwlib29sCQkJbmVlZF9hdHRlbnRpb247CS8qIFQgaWYgUnhSUEMgcG9rZWQgdXMgKi8KIAl1MTYJCQlzZXJ2aWNlX2lkOwkvKiBSeFJQQyBzZXJ2aWNlIElEIHRvIGNhbGwgKi8KIAlfX2JlMTYJCQlwb3J0OwkJLyogdGFyZ2V0IFVEUCBwb3J0ICovCiAJX19iZTMyCQkJb3BlcmF0aW9uX0lEOwkvKiBvcGVyYXRpb24gSUQgZm9yIGFuIGluY29taW5nIGNhbGwgKi8KQEAgLTEyOCw4ICsxMjQsNyBAQAogCS8qIGRlbGl2ZXIgcmVxdWVzdCBvciByZXBseSBkYXRhIHRvIGFuIGNhbGwKIAkgKiAtIHJldHVybmluZyBhbiBlcnJvciB3aWxsIGNhdXNlIHRoZSBjYWxsIHRvIGJlIGFib3J0ZWQKIAkgKi8KLQlpbnQgKCpkZWxpdmVyKShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgICAgICBib29sIGxhc3QpOworCWludCAoKmRlbGl2ZXIpKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCk7CiAKIAkvKiBtYXAgYW4gYWJvcnQgY29kZSB0byBhbiBlcnJvciBudW1iZXIgKi8KIAlpbnQgKCphYm9ydF90b19lcnJvcikodTMyIGFib3J0X2NvZGUpOwpAQCAtNjA3LDYgKzYwMiw4IEBACiAvKgogICogcnhycGMuYwogICovCitleHRlcm4gc3RydWN0IHNvY2tldCAqYWZzX3NvY2tldDsKKwogZXh0ZXJuIGludCBhZnNfb3Blbl9zb2NrZXQodm9pZCk7CiBleHRlcm4gdm9pZCBhZnNfY2xvc2Vfc29ja2V0KHZvaWQpOwogZXh0ZXJuIGludCBhZnNfbWFrZV9jYWxsKHN0cnVjdCBpbl9hZGRyICosIHN0cnVjdCBhZnNfY2FsbCAqLCBnZnBfdCwKQEAgLTYxNCwxMSArNjExLDE0IEBACiBleHRlcm4gc3RydWN0IGFmc19jYWxsICphZnNfYWxsb2NfZmxhdF9jYWxsKGNvbnN0IHN0cnVjdCBhZnNfY2FsbF90eXBlICosCiAJCQkJCSAgICBzaXplX3QsIHNpemVfdCk7CiBleHRlcm4gdm9pZCBhZnNfZmxhdF9jYWxsX2Rlc3RydWN0b3Ioc3RydWN0IGFmc19jYWxsICopOwotZXh0ZXJuIHZvaWQgYWZzX3RyYW5zZmVyX3JlcGx5KHN0cnVjdCBhZnNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKIGV4dGVybiB2b2lkIGFmc19zZW5kX2VtcHR5X3JlcGx5KHN0cnVjdCBhZnNfY2FsbCAqKTsKIGV4dGVybiB2b2lkIGFmc19zZW5kX3NpbXBsZV9yZXBseShzdHJ1Y3QgYWZzX2NhbGwgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOwotZXh0ZXJuIGludCBhZnNfZXh0cmFjdF9kYXRhKHN0cnVjdCBhZnNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sLCB2b2lkICosCi0JCQkgICAgc2l6ZV90KTsKK2V4dGVybiBpbnQgYWZzX2V4dHJhY3RfZGF0YShzdHJ1Y3QgYWZzX2NhbGwgKiwgdm9pZCAqLCBzaXplX3QsIGJvb2wpOworCitzdGF0aWMgaW5saW5lIGludCBhZnNfdHJhbnNmZXJfcmVwbHkoc3RydWN0IGFmc19jYWxsICpjYWxsKQoreworCXJldHVybiBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIGNhbGwtPmJ1ZmZlciwgY2FsbC0+cmVwbHlfbWF4LCBmYWxzZSk7Cit9CiAKIC8qCiAgKiBzZWN1cml0eS5jCkBAIC02NDIsNyArNjQyLDcgQEAKIAogZXh0ZXJuIHN0cnVjdCBhZnNfc2VydmVyICphZnNfbG9va3VwX3NlcnZlcihzdHJ1Y3QgYWZzX2NlbGwgKiwKIAkJCQkJICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICopOwotZXh0ZXJuIHN0cnVjdCBhZnNfc2VydmVyICphZnNfZmluZF9zZXJ2ZXIoY29uc3Qgc3RydWN0IGluX2FkZHIgKik7CitleHRlcm4gc3RydWN0IGFmc19zZXJ2ZXIgKmFmc19maW5kX3NlcnZlcihjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKik7CiBleHRlcm4gdm9pZCBhZnNfcHV0X3NlcnZlcihzdHJ1Y3QgYWZzX3NlcnZlciAqKTsKIGV4dGVybiB2b2lkIF9fZXhpdCBhZnNfcHVyZ2Vfc2VydmVycyh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvZnMvYWZzL21haW4uYyBiL2ZzL2Fmcy9tYWluLmMKaW5kZXggMzVkZTBjMC4uMGIxODdlZiAxMDA2NDQKLS0tIGEvZnMvYWZzL21haW4uYworKysgYi9mcy9hZnMvbWFpbi5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKIE1PRFVMRV9ERVNDUklQVElPTigiQUZTIENsaWVudCBGaWxlIFN5c3RlbSIpOwpkaWZmIC0tZ2l0IGEvZnMvYWZzL3J4cnBjLmMgYi9mcy9hZnMvcnhycGMuYwppbmRleCA0ODMyZGU4NC4uNTliZGFhNyAxMDA2NDQKLS0tIGEvZnMvYWZzL3J4cnBjLmMKKysrIGIvZnMvYWZzL3J4cnBjLmMKQEAgLTE2LDM0ICsxNiwzNiBAQAogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAiYWZzX2NtLmgiCiAKLXN0YXRpYyBzdHJ1Y3Qgc29ja2V0ICphZnNfc29ja2V0OyAvKiBteSBSeFJQQyBzb2NrZXQgKi8KK3N0cnVjdCBzb2NrZXQgKmFmc19zb2NrZXQ7IC8qIG15IFJ4UlBDIHNvY2tldCAqLwogc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICphZnNfYXN5bmNfY2FsbHM7CitzdGF0aWMgc3RydWN0IGFmc19jYWxsICphZnNfc3BhcmVfaW5jb21pbmdfY2FsbDsKIHN0YXRpYyBhdG9taWNfdCBhZnNfb3V0c3RhbmRpbmdfY2FsbHM7Ci1zdGF0aWMgYXRvbWljX3QgYWZzX291dHN0YW5kaW5nX3NrYnM7CiAKLXN0YXRpYyB2b2lkIGFmc193YWtlX3VwX2NhbGxfd2FpdGVyKHN0cnVjdCBhZnNfY2FsbCAqKTsKK3N0YXRpYyB2b2lkIGFmc19mcmVlX2NhbGwoc3RydWN0IGFmc19jYWxsICopOworc3RhdGljIHZvaWQgYWZzX3dha2VfdXBfY2FsbF93YWl0ZXIoc3RydWN0IHNvY2sgKiwgc3RydWN0IHJ4cnBjX2NhbGwgKiwgdW5zaWduZWQgbG9uZyk7CiBzdGF0aWMgaW50IGFmc193YWl0X2Zvcl9jYWxsX3RvX2NvbXBsZXRlKHN0cnVjdCBhZnNfY2FsbCAqKTsKLXN0YXRpYyB2b2lkIGFmc193YWtlX3VwX2FzeW5jX2NhbGwoc3RydWN0IGFmc19jYWxsICopOworc3RhdGljIHZvaWQgYWZzX3dha2VfdXBfYXN5bmNfY2FsbChzdHJ1Y3Qgc29jayAqLCBzdHJ1Y3QgcnhycGNfY2FsbCAqLCB1bnNpZ25lZCBsb25nKTsKIHN0YXRpYyBpbnQgYWZzX2RvbnRfd2FpdF9mb3JfY2FsbF90b19jb21wbGV0ZShzdHJ1Y3QgYWZzX2NhbGwgKik7Ci1zdGF0aWMgdm9pZCBhZnNfcHJvY2Vzc19hc3luY19jYWxsKHN0cnVjdCBhZnNfY2FsbCAqKTsKLXN0YXRpYyB2b2lkIGFmc19yeF9pbnRlcmNlcHRvcihzdHJ1Y3Qgc29jayAqLCB1bnNpZ25lZCBsb25nLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY21fb3BfaWQoc3RydWN0IGFmc19jYWxsICosIHN0cnVjdCBza19idWZmICosIGJvb2wpOworc3RhdGljIHZvaWQgYWZzX3Byb2Nlc3NfYXN5bmNfY2FsbChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBhZnNfcnhfbmV3X2NhbGwoc3RydWN0IHNvY2sgKiwgc3RydWN0IHJ4cnBjX2NhbGwgKiwgdW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdm9pZCBhZnNfcnhfZGlzY2FyZF9uZXdfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqLCB1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY21fb3BfaWQoc3RydWN0IGFmc19jYWxsICopOwogCiAvKiBzeW5jaHJvbm91cyBjYWxsIG1hbmFnZW1lbnQgKi8KIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlIGFmc19zeW5jX2NhbGwgPSB7Ci0JLnJ4X3dha2V1cAk9IGFmc193YWtlX3VwX2NhbGxfd2FpdGVyLAorCS5ub3RpZnlfcngJPSBhZnNfd2FrZV91cF9jYWxsX3dhaXRlciwKIAkud2FpdAkJPSBhZnNfd2FpdF9mb3JfY2FsbF90b19jb21wbGV0ZSwKIH07CiAKIC8qIGFzeW5jaHJvbm91cyBjYWxsIG1hbmFnZW1lbnQgKi8KIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlIGFmc19hc3luY19jYWxsID0gewotCS5yeF93YWtldXAJPSBhZnNfd2FrZV91cF9hc3luY19jYWxsLAorCS5ub3RpZnlfcngJPSBhZnNfd2FrZV91cF9hc3luY19jYWxsLAogCS53YWl0CQk9IGFmc19kb250X3dhaXRfZm9yX2NhbGxfdG9fY29tcGxldGUsCiB9OwogCiAvKiBhc3luY2hyb25vdXMgaW5jb21pbmcgY2FsbCBtYW5hZ2VtZW50ICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgYWZzX2FzeW5jX2luY29taW5nX2NhbGwgPSB7Ci0JLnJ4X3dha2V1cAk9IGFmc193YWtlX3VwX2FzeW5jX2NhbGwsCisJLm5vdGlmeV9yeAk9IGFmc193YWtlX3VwX2FzeW5jX2NhbGwsCiB9OwogCiAvKiBhc3luY2hyb25vdXMgaW5jb21pbmcgY2FsbCBpbml0aWFsIHByb2Nlc3NpbmcgKi8KQEAgLTUzLDE3ICs1NSw5IEBACiAJLmFib3J0X3RvX2Vycm9yCT0gYWZzX2Fib3J0X3RvX2Vycm9yLAogfTsKIAotc3RhdGljIHZvaWQgYWZzX2NvbGxlY3RfaW5jb21pbmdfY2FsbChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBhZnNfY2hhcmdlX3ByZWFsbG9jYXRpb24oc3RydWN0IHdvcmtfc3RydWN0ICopOwogCi1zdGF0aWMgc3RydWN0IHNrX2J1ZmZfaGVhZCBhZnNfaW5jb21pbmdfY2FsbHM7Ci1zdGF0aWMgREVDTEFSRV9XT1JLKGFmc19jb2xsZWN0X2luY29taW5nX2NhbGxfd29yaywgYWZzX2NvbGxlY3RfaW5jb21pbmdfY2FsbCk7Ci0KLXN0YXRpYyB2b2lkIGFmc19hc3luY193b3JrZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhZnNfY2FsbCAqY2FsbCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWZzX2NhbGwsIGFzeW5jX3dvcmspOwotCi0JY2FsbC0+YXN5bmNfd29ya2ZuKGNhbGwpOwotfQorc3RhdGljIERFQ0xBUkVfV09SSyhhZnNfY2hhcmdlX3ByZWFsbG9jYXRpb25fd29yaywgYWZzX2NoYXJnZV9wcmVhbGxvY2F0aW9uKTsKIAogc3RhdGljIGludCBhZnNfd2FpdF9hdG9taWNfdChhdG9taWNfdCAqcCkKIHsKQEAgLTgzLDEwICs3Nyw4IEBACiAKIAlfZW50ZXIoIiIpOwogCi0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmYWZzX2luY29taW5nX2NhbGxzKTsKLQogCXJldCA9IC1FTk9NRU07Ci0JYWZzX2FzeW5jX2NhbGxzID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImthZnNkIik7CisJYWZzX2FzeW5jX2NhbGxzID0gYWxsb2Nfd29ya3F1ZXVlKCJrYWZzZCIsIFdRX01FTV9SRUNMQUlNLCAwKTsKIAlpZiAoIWFmc19hc3luY19jYWxscykKIAkJZ290byBlcnJvcl8wOwogCkBAIC0xMTAsMTMgKzEwMiwxNSBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycm9yXzI7CiAKKwlyeHJwY19rZXJuZWxfbmV3X2NhbGxfbm90aWZpY2F0aW9uKHNvY2tldCwgYWZzX3J4X25ld19jYWxsLAorCQkJCQkgICBhZnNfcnhfZGlzY2FyZF9uZXdfY2FsbCk7CisKIAlyZXQgPSBrZXJuZWxfbGlzdGVuKHNvY2tldCwgSU5UX01BWCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3JfMjsKIAotCXJ4cnBjX2tlcm5lbF9pbnRlcmNlcHRfcnhfbWVzc2FnZXMoc29ja2V0LCBhZnNfcnhfaW50ZXJjZXB0b3IpOwotCiAJYWZzX3NvY2tldCA9IHNvY2tldDsKKwlhZnNfY2hhcmdlX3ByZWFsbG9jYXRpb24oTlVMTCk7CiAJX2xlYXZlKCIgPSAwIik7CiAJcmV0dXJuIDA7CiAKQEAgLTEzNiw1NSArMTMwLDI4IEBACiB7CiAJX2VudGVyKCIiKTsKIAorCWlmIChhZnNfc3BhcmVfaW5jb21pbmdfY2FsbCkgeworCQlhdG9taWNfaW5jKCZhZnNfb3V0c3RhbmRpbmdfY2FsbHMpOworCQlhZnNfZnJlZV9jYWxsKGFmc19zcGFyZV9pbmNvbWluZ19jYWxsKTsKKwkJYWZzX3NwYXJlX2luY29taW5nX2NhbGwgPSBOVUxMOworCX0KKworCV9kZWJ1Zygib3V0c3RhbmRpbmcgJXUiLCBhdG9taWNfcmVhZCgmYWZzX291dHN0YW5kaW5nX2NhbGxzKSk7CiAJd2FpdF9vbl9hdG9taWNfdCgmYWZzX291dHN0YW5kaW5nX2NhbGxzLCBhZnNfd2FpdF9hdG9taWNfdCwKIAkJCSBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJX2RlYnVnKCJubyBvdXRzdGFuZGluZyBjYWxscyIpOwogCisJZmx1c2hfd29ya3F1ZXVlKGFmc19hc3luY19jYWxscyk7CisJa2VybmVsX3NvY2tfc2h1dGRvd24oYWZzX3NvY2tldCwgU0hVVF9SRFdSKTsKKwlmbHVzaF93b3JrcXVldWUoYWZzX2FzeW5jX2NhbGxzKTsKIAlzb2NrX3JlbGVhc2UoYWZzX3NvY2tldCk7CiAKIAlfZGVidWcoImRld29yayIpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKGFmc19hc3luY19jYWxscyk7Ci0KLQlBU1NFUlRDTVAoYXRvbWljX3JlYWQoJmFmc19vdXRzdGFuZGluZ19za2JzKSwgPT0sIDApOwogCV9sZWF2ZSgiIik7CiB9CiAKIC8qCi0gKiBub3RlIHRoYXQgdGhlIGRhdGEgaW4gYSBzb2NrZXQgYnVmZmVyIGlzIG5vdyBkZWxpdmVyZWQgYW5kIHRoYXQgdGhlIGJ1ZmZlcgotICogc2hvdWxkIGJlIGZyZWVkCi0gKi8KLXN0YXRpYyB2b2lkIGFmc19kYXRhX2RlbGl2ZXJlZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCWlmICghc2tiKSB7Ci0JCV9kZWJ1ZygiRExWUiBOVUxMIFslZF0iLCBhdG9taWNfcmVhZCgmYWZzX291dHN0YW5kaW5nX3NrYnMpKTsKLQkJZHVtcF9zdGFjaygpOwotCX0gZWxzZSB7Ci0JCV9kZWJ1ZygiRExWUiAlcHsldX0gWyVkXSIsCi0JCSAgICAgICBza2IsIHNrYi0+bWFyaywgYXRvbWljX3JlYWQoJmFmc19vdXRzdGFuZGluZ19za2JzKSk7Ci0JCWlmIChhdG9taWNfZGVjX3JldHVybigmYWZzX291dHN0YW5kaW5nX3NrYnMpID09IC0xKQotCQkJQlVHKCk7Ci0JCXJ4cnBjX2tlcm5lbF9kYXRhX2RlbGl2ZXJlZChza2IpOwotCX0KLX0KLQotLyoKLSAqIGZyZWUgYSBzb2NrZXQgYnVmZmVyCi0gKi8KLXN0YXRpYyB2b2lkIGFmc19mcmVlX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCWlmICghc2tiKSB7Ci0JCV9kZWJ1ZygiRlJFRSBOVUxMIFslZF0iLCBhdG9taWNfcmVhZCgmYWZzX291dHN0YW5kaW5nX3NrYnMpKTsKLQkJZHVtcF9zdGFjaygpOwotCX0gZWxzZSB7Ci0JCV9kZWJ1ZygiRlJFRSAlcHsldX0gWyVkXSIsCi0JCSAgICAgICBza2IsIHNrYi0+bWFyaywgYXRvbWljX3JlYWQoJmFmc19vdXRzdGFuZGluZ19za2JzKSk7Ci0JCWlmIChhdG9taWNfZGVjX3JldHVybigmYWZzX291dHN0YW5kaW5nX3NrYnMpID09IC0xKQotCQkJQlVHKCk7Ci0JCXJ4cnBjX2tlcm5lbF9mcmVlX3NrYihza2IpOwotCX0KLX0KLQotLyoKICAqIGZyZWUgYSBjYWxsCiAgKi8KIHN0YXRpYyB2b2lkIGFmc19mcmVlX2NhbGwoc3RydWN0IGFmc19jYWxsICpjYWxsKQpAQCAtMTk0LDcgKzE2MSw2IEBACiAKIAlBU1NFUlRDTVAoY2FsbC0+cnhjYWxsLCA9PSwgTlVMTCk7CiAJQVNTRVJUKCF3b3JrX3BlbmRpbmcoJmNhbGwtPmFzeW5jX3dvcmspKTsKLQlBU1NFUlQoc2tiX3F1ZXVlX2VtcHR5KCZjYWxsLT5yeF9xdWV1ZSkpOwogCUFTU0VSVChjYWxsLT50eXBlLT5uYW1lICE9IE5VTEwpOwogCiAJa2ZyZWUoY2FsbC0+cmVxdWVzdCk7CkBAIC0yMTAsNyArMTc2LDcgQEAKIHN0YXRpYyB2b2lkIGFmc19lbmRfY2FsbF9ub2ZyZWUoc3RydWN0IGFmc19jYWxsICpjYWxsKQogewogCWlmIChjYWxsLT5yeGNhbGwpIHsKLQkJcnhycGNfa2VybmVsX2VuZF9jYWxsKGNhbGwtPnJ4Y2FsbCk7CisJCXJ4cnBjX2tlcm5lbF9lbmRfY2FsbChhZnNfc29ja2V0LCBjYWxsLT5yeGNhbGwpOwogCQljYWxsLT5yeGNhbGwgPSBOVUxMOwogCX0KIAlpZiAoY2FsbC0+dHlwZS0+ZGVzdHJ1Y3RvcikKQEAgLTIzMCw3ICsxOTYsNyBAQAogICogYWxsb2NhdGUgYSBjYWxsIHdpdGggZmxhdCByZXF1ZXN0IGFuZCByZXBseSBidWZmZXJzCiAgKi8KIHN0cnVjdCBhZnNfY2FsbCAqYWZzX2FsbG9jX2ZsYXRfY2FsbChjb25zdCBzdHJ1Y3QgYWZzX2NhbGxfdHlwZSAqdHlwZSwKLQkJCQkgICAgIHNpemVfdCByZXF1ZXN0X3NpemUsIHNpemVfdCByZXBseV9zaXplKQorCQkJCSAgICAgc2l6ZV90IHJlcXVlc3Rfc2l6ZSwgc2l6ZV90IHJlcGx5X21heCkKIHsKIAlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGw7CiAKQEAgLTI0NCw3ICsyMTAsNyBAQAogCiAJY2FsbC0+dHlwZSA9IHR5cGU7CiAJY2FsbC0+cmVxdWVzdF9zaXplID0gcmVxdWVzdF9zaXplOwotCWNhbGwtPnJlcGx5X21heCA9IHJlcGx5X3NpemU7CisJY2FsbC0+cmVwbHlfbWF4ID0gcmVwbHlfbWF4OwogCiAJaWYgKHJlcXVlc3Rfc2l6ZSkgewogCQljYWxsLT5yZXF1ZXN0ID0ga21hbGxvYyhyZXF1ZXN0X3NpemUsIEdGUF9OT0ZTKTsKQEAgLTI1MiwxNCArMjE4LDEzIEBACiAJCQlnb3RvIG5vbWVtX2ZyZWU7CiAJfQogCi0JaWYgKHJlcGx5X3NpemUpIHsKLQkJY2FsbC0+YnVmZmVyID0ga21hbGxvYyhyZXBseV9zaXplLCBHRlBfTk9GUyk7CisJaWYgKHJlcGx5X21heCkgeworCQljYWxsLT5idWZmZXIgPSBrbWFsbG9jKHJlcGx5X21heCwgR0ZQX05PRlMpOwogCQlpZiAoIWNhbGwtPmJ1ZmZlcikKIAkJCWdvdG8gbm9tZW1fZnJlZTsKIAl9CiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYWxsLT53YWl0cSk7Ci0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmY2FsbC0+cnhfcXVldWUpOwogCXJldHVybiBjYWxsOwogCiBub21lbV9mcmVlOgpAQCAtMzI4LDggKzI5Myw4IEBACiAJCQkgKiByZXR1cm5zIGZyb20gc2VuZGluZyB0aGUgcmVxdWVzdCAqLwogCQkJaWYgKGZpcnN0ICsgbG9vcCA+PSBsYXN0KQogCQkJCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfQVdBSVRfUkVQTFk7Ci0JCQlyZXQgPSByeHJwY19rZXJuZWxfc2VuZF9kYXRhKGNhbGwtPnJ4Y2FsbCwgbXNnLAotCQkJCQkJICAgICB0byAtIG9mZnNldCk7CisJCQlyZXQgPSByeHJwY19rZXJuZWxfc2VuZF9kYXRhKGFmc19zb2NrZXQsIGNhbGwtPnJ4Y2FsbCwKKwkJCQkJCSAgICAgbXNnLCB0byAtIG9mZnNldCk7CiAJCQlrdW5tYXAocGFnZXNbbG9vcF0pOwogCQkJaWYgKHJldCA8IDApCiAJCQkJYnJlYWs7CkBAIC0zNTcsNyArMzIyLDYgQEAKIAlzdHJ1Y3QgbXNnaGRyIG1zZzsKIAlzdHJ1Y3Qga3ZlYyBpb3ZbMV07CiAJaW50IHJldDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJX2VudGVyKCIleCx7JWR9LCIsIGFkZHItPnNfYWRkciwgbnRvaHMoY2FsbC0+cG9ydCkpOwogCkBAIC0zNjksOCArMzMzLDcgQEAKIAkgICAgICAgYXRvbWljX3JlYWQoJmFmc19vdXRzdGFuZGluZ19jYWxscykpOwogCiAJY2FsbC0+d2FpdF9tb2RlID0gd2FpdF9tb2RlOwotCWNhbGwtPmFzeW5jX3dvcmtmbiA9IGFmc19wcm9jZXNzX2FzeW5jX2NhbGw7Ci0JSU5JVF9XT1JLKCZjYWxsLT5hc3luY193b3JrLCBhZnNfYXN5bmNfd29ya2ZuKTsKKwlJTklUX1dPUksoJmNhbGwtPmFzeW5jX3dvcmssIGFmc19wcm9jZXNzX2FzeW5jX2NhbGwpOwogCiAJbWVtc2V0KCZzcngsIDAsIHNpemVvZihzcngpKTsKIAlzcnguc3J4X2ZhbWlseSA9IEFGX1JYUlBDOwpAQCAtMzgzLDcgKzM0Niw4IEBACiAKIAkvKiBjcmVhdGUgYSBjYWxsICovCiAJcnhjYWxsID0gcnhycGNfa2VybmVsX2JlZ2luX2NhbGwoYWZzX3NvY2tldCwgJnNyeCwgY2FsbC0+a2V5LAotCQkJCQkgKHVuc2lnbmVkIGxvbmcpIGNhbGwsIGdmcCk7CisJCQkJCSAodW5zaWduZWQgbG9uZykgY2FsbCwgZ2ZwLAorCQkJCQkgd2FpdF9tb2RlLT5ub3RpZnlfcngpOwogCWNhbGwtPmtleSA9IE5VTEw7CiAJaWYgKElTX0VSUihyeGNhbGwpKSB7CiAJCXJldCA9IFBUUl9FUlIocnhjYWxsKTsKQEAgLTQwOSw3ICszNzMsOCBAQAogCSAqIHJlcXVlc3QgKi8KIAlpZiAoIWNhbGwtPnNlbmRfcGFnZXMpCiAJCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfQVdBSVRfUkVQTFk7Ci0JcmV0ID0gcnhycGNfa2VybmVsX3NlbmRfZGF0YShyeGNhbGwsICZtc2csIGNhbGwtPnJlcXVlc3Rfc2l6ZSk7CisJcmV0ID0gcnhycGNfa2VybmVsX3NlbmRfZGF0YShhZnNfc29ja2V0LCByeGNhbGwsCisJCQkJICAgICAmbXNnLCBjYWxsLT5yZXF1ZXN0X3NpemUpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycm9yX2RvX2Fib3J0OwogCkBAIC00MjQsOSArMzg5LDcgQEAKIAlyZXR1cm4gd2FpdF9tb2RlLT53YWl0KGNhbGwpOwogCiBlcnJvcl9kb19hYm9ydDoKLQlyeHJwY19rZXJuZWxfYWJvcnRfY2FsbChyeGNhbGwsIFJYX1VTRVJfQUJPUlQpOwotCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmNhbGwtPnJ4X3F1ZXVlKSkpCi0JCWFmc19mcmVlX3NrYihza2IpOworCXJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsKGFmc19zb2NrZXQsIHJ4Y2FsbCwgUlhfVVNFUl9BQk9SVCwgLXJldCwgIktTRCIpOwogZXJyb3Jfa2lsbF9jYWxsOgogCWFmc19lbmRfY2FsbChjYWxsKTsKIAlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKQEAgLTQzNCwxMzUgKzM5Nyw3NyBAQAogfQogCiAvKgotICogSGFuZGxlcyBpbnRlcmNlcHRlZCBtZXNzYWdlcyB0aGF0IHdlcmUgYXJyaXZpbmcgaW4gdGhlIHNvY2tldCdzIFJ4IHF1ZXVlLgotICoKLSAqIENhbGxlZCBmcm9tIHRoZSBBRl9SWFJQQyBjYWxsIHByb2Nlc3NvciBpbiB3YWl0cXVldWUgcHJvY2VzcyBjb250ZXh0LiAgRm9yCi0gKiBlYWNoIGNhbGwsIGl0IGlzIGd1YXJhbnRlZWQgdGhpcyB3aWxsIGJlIGNhbGxlZCBpbiBvcmRlciBvZiBwYWNrZXQgdG8gYmUKLSAqIGRlbGl2ZXJlZC4KLSAqLwotc3RhdGljIHZvaWQgYWZzX3J4X2ludGVyY2VwdG9yKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgbG9uZyB1c2VyX2NhbGxfSUQsCi0JCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwgPSAoc3RydWN0IGFmc19jYWxsICopIHVzZXJfY2FsbF9JRDsKLQotCV9lbnRlcigiJXAsLCV1IiwgY2FsbCwgc2tiLT5tYXJrKTsKLQotCV9kZWJ1ZygiSUNQVCAlcHsldX0gWyVkXSIsCi0JICAgICAgIHNrYiwgc2tiLT5tYXJrLCBhdG9taWNfcmVhZCgmYWZzX291dHN0YW5kaW5nX3NrYnMpKTsKLQotCUFTU0VSVENNUChzaywgPT0sIGFmc19zb2NrZXQtPnNrKTsKLQlhdG9taWNfaW5jKCZhZnNfb3V0c3RhbmRpbmdfc2ticyk7Ci0KLQlpZiAoIWNhbGwpIHsKLQkJLyogaXRzIGFuIGluY29taW5nIGNhbGwgZm9yIG91ciBjYWxsYmFjayBzZXJ2aWNlICovCi0JCXNrYl9xdWV1ZV90YWlsKCZhZnNfaW5jb21pbmdfY2FsbHMsIHNrYik7Ci0JCXF1ZXVlX3dvcmsoYWZzX3dxLCAmYWZzX2NvbGxlY3RfaW5jb21pbmdfY2FsbF93b3JrKTsKLQl9IGVsc2UgewotCQkvKiByb3V0ZSB0aGUgbWVzc2FnZXMgZGlyZWN0bHkgdG8gdGhlIGFwcHJvcHJpYXRlIGNhbGwgKi8KLQkJc2tiX3F1ZXVlX3RhaWwoJmNhbGwtPnJ4X3F1ZXVlLCBza2IpOwotCQljYWxsLT53YWl0X21vZGUtPnJ4X3dha2V1cChjYWxsKTsKLQl9Ci0KLQlfbGVhdmUoIiIpOwotfQotCi0vKgogICogZGVsaXZlciBtZXNzYWdlcyB0byBhIGNhbGwKICAqLwogc3RhdGljIHZvaWQgYWZzX2RlbGl2ZXJfdG9fY2FsbChzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlib29sIGxhc3Q7CiAJdTMyIGFib3J0X2NvZGU7CiAJaW50IHJldDsKIAotCV9lbnRlcigiIik7CisJX2VudGVyKCIlcyIsIGNhbGwtPnR5cGUtPm5hbWUpOwogCi0Jd2hpbGUgKChjYWxsLT5zdGF0ZSA9PSBBRlNfQ0FMTF9BV0FJVF9SRVBMWSB8fAotCQljYWxsLT5zdGF0ZSA9PSBBRlNfQ0FMTF9BV0FJVF9PUF9JRCB8fAotCQljYWxsLT5zdGF0ZSA9PSBBRlNfQ0FMTF9BV0FJVF9SRVFVRVNUIHx8Ci0JCWNhbGwtPnN0YXRlID09IEFGU19DQUxMX0FXQUlUX0FDSykgJiYKLQkgICAgICAgKHNrYiA9IHNrYl9kZXF1ZXVlKCZjYWxsLT5yeF9xdWV1ZSkpKSB7Ci0JCXN3aXRjaCAoc2tiLT5tYXJrKSB7Ci0JCWNhc2UgUlhSUENfU0tCX01BUktfREFUQToKLQkJCV9kZWJ1ZygiUmN2IERBVEEiKTsKLQkJCWxhc3QgPSByeHJwY19rZXJuZWxfaXNfZGF0YV9sYXN0KHNrYik7Ci0JCQlyZXQgPSBjYWxsLT50eXBlLT5kZWxpdmVyKGNhbGwsIHNrYiwgbGFzdCk7Ci0JCQlzd2l0Y2ggKHJldCkgewotCQkJY2FzZSAwOgotCQkJCWlmIChsYXN0ICYmCi0JCQkJICAgIGNhbGwtPnN0YXRlID09IEFGU19DQUxMX0FXQUlUX1JFUExZKQotCQkJCQljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX0NPTVBMRVRFOwotCQkJCWJyZWFrOwotCQkJY2FzZSAtRU5PVENPTk46Ci0JCQkJYWJvcnRfY29kZSA9IFJYX0NBTExfREVBRDsKLQkJCQlnb3RvIGRvX2Fib3J0OwotCQkJY2FzZSAtRU5PVFNVUFA6Ci0JCQkJYWJvcnRfY29kZSA9IFJYX0lOVkFMSURfT1BFUkFUSU9OOwotCQkJCWdvdG8gZG9fYWJvcnQ7Ci0JCQlkZWZhdWx0OgotCQkJCWFib3J0X2NvZGUgPSBSWEdFTl9DQ19VTk1BUlNIQUw7Ci0JCQkJaWYgKGNhbGwtPnN0YXRlICE9IEFGU19DQUxMX0FXQUlUX1JFUExZKQotCQkJCQlhYm9ydF9jb2RlID0gUlhHRU5fU1NfVU5NQVJTSEFMOwotCQkJZG9fYWJvcnQ6Ci0JCQkJcnhycGNfa2VybmVsX2Fib3J0X2NhbGwoY2FsbC0+cnhjYWxsLAotCQkJCQkJCWFib3J0X2NvZGUpOwotCQkJCWNhbGwtPmVycm9yID0gcmV0OwotCQkJCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfRVJST1I7Ci0JCQkJYnJlYWs7CisJd2hpbGUgKGNhbGwtPnN0YXRlID09IEFGU19DQUxMX0FXQUlUX1JFUExZIHx8CisJICAgICAgIGNhbGwtPnN0YXRlID09IEFGU19DQUxMX0FXQUlUX09QX0lEIHx8CisJICAgICAgIGNhbGwtPnN0YXRlID09IEFGU19DQUxMX0FXQUlUX1JFUVVFU1QgfHwKKwkgICAgICAgY2FsbC0+c3RhdGUgPT0gQUZTX0NBTExfQVdBSVRfQUNLCisJICAgICAgICkgeworCQlpZiAoY2FsbC0+c3RhdGUgPT0gQUZTX0NBTExfQVdBSVRfQUNLKSB7CisJCQlzaXplX3Qgb2Zmc2V0ID0gMDsKKwkJCXJldCA9IHJ4cnBjX2tlcm5lbF9yZWN2X2RhdGEoYWZzX3NvY2tldCwgY2FsbC0+cnhjYWxsLAorCQkJCQkJICAgICBOVUxMLCAwLCAmb2Zmc2V0LCBmYWxzZSwKKwkJCQkJCSAgICAgJmNhbGwtPmFib3J0X2NvZGUpOworCQkJaWYgKHJldCA9PSAtRUlOUFJPR1JFU1MgfHwgcmV0ID09IC1FQUdBSU4pCisJCQkJcmV0dXJuOworCQkJaWYgKHJldCA9PSAxKSB7CisJCQkJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9DT01QTEVURTsKKwkJCQlnb3RvIGRvbmU7CiAJCQl9Ci0JCQlhZnNfZGF0YV9kZWxpdmVyZWQoc2tiKTsKLQkJCXNrYiA9IE5VTEw7Ci0JCQljb250aW51ZTsKLQkJY2FzZSBSWFJQQ19TS0JfTUFSS19GSU5BTF9BQ0s6Ci0JCQlfZGVidWcoIlJjdiBBQ0siKTsKLQkJCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfQ09NUExFVEU7Ci0JCQlicmVhazsKLQkJY2FzZSBSWFJQQ19TS0JfTUFSS19CVVNZOgotCQkJX2RlYnVnKCJSY3YgQlVTWSIpOwotCQkJY2FsbC0+ZXJyb3IgPSAtRUJVU1k7Ci0JCQljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX0JVU1k7Ci0JCQlicmVhazsKLQkJY2FzZSBSWFJQQ19TS0JfTUFSS19SRU1PVEVfQUJPUlQ6Ci0JCQlhYm9ydF9jb2RlID0gcnhycGNfa2VybmVsX2dldF9hYm9ydF9jb2RlKHNrYik7Ci0JCQljYWxsLT5lcnJvciA9IGNhbGwtPnR5cGUtPmFib3J0X3RvX2Vycm9yKGFib3J0X2NvZGUpOwotCQkJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9BQk9SVEVEOwotCQkJX2RlYnVnKCJSY3YgQUJPUlQgJXUgLT4gJWQiLCBhYm9ydF9jb2RlLCBjYWxsLT5lcnJvcik7Ci0JCQlicmVhazsKLQkJY2FzZSBSWFJQQ19TS0JfTUFSS19MT0NBTF9BQk9SVDoKLQkJCWFib3J0X2NvZGUgPSByeHJwY19rZXJuZWxfZ2V0X2Fib3J0X2NvZGUoc2tiKTsKLQkJCWNhbGwtPmVycm9yID0gY2FsbC0+dHlwZS0+YWJvcnRfdG9fZXJyb3IoYWJvcnRfY29kZSk7Ci0JCQljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX0FCT1JURUQ7Ci0JCQlfZGVidWcoIkxvYyBBQk9SVCAldSAtPiAlZCIsIGFib3J0X2NvZGUsIGNhbGwtPmVycm9yKTsKLQkJCWJyZWFrOwotCQljYXNlIFJYUlBDX1NLQl9NQVJLX05FVF9FUlJPUjoKLQkJCWNhbGwtPmVycm9yID0gLXJ4cnBjX2tlcm5lbF9nZXRfZXJyb3JfbnVtYmVyKHNrYik7Ci0JCQljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX0VSUk9SOwotCQkJX2RlYnVnKCJSY3YgTkVUIEVSUk9SICVkIiwgY2FsbC0+ZXJyb3IpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUlhSUENfU0tCX01BUktfTE9DQUxfRVJST1I6Ci0JCQljYWxsLT5lcnJvciA9IC1yeHJwY19rZXJuZWxfZ2V0X2Vycm9yX251bWJlcihza2IpOwotCQkJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9FUlJPUjsKLQkJCV9kZWJ1ZygiUmN2IExPQ0FMIEVSUk9SICVkIiwgY2FsbC0+ZXJyb3IpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlCVUcoKTsKLQkJCWJyZWFrOworCQkJcmV0dXJuOwogCQl9CiAKLQkJYWZzX2ZyZWVfc2tiKHNrYik7CisJCXJldCA9IGNhbGwtPnR5cGUtPmRlbGl2ZXIoY2FsbCk7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgMDoKKwkJCWlmIChjYWxsLT5zdGF0ZSA9PSBBRlNfQ0FMTF9BV0FJVF9SRVBMWSkKKwkJCQljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX0NPTVBMRVRFOworCQkJZ290byBkb25lOworCQljYXNlIC1FSU5QUk9HUkVTUzoKKwkJY2FzZSAtRUFHQUlOOgorCQkJZ290byBvdXQ7CisJCWNhc2UgLUVOT1RDT05OOgorCQkJYWJvcnRfY29kZSA9IFJYX0NBTExfREVBRDsKKwkJCXJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsKGFmc19zb2NrZXQsIGNhbGwtPnJ4Y2FsbCwKKwkJCQkJCWFib3J0X2NvZGUsIC1yZXQsICJLTkMiKTsKKwkJCWdvdG8gZG9fYWJvcnQ7CisJCWNhc2UgLUVOT1RTVVBQOgorCQkJYWJvcnRfY29kZSA9IFJYX0lOVkFMSURfT1BFUkFUSU9OOworCQkJcnhycGNfa2VybmVsX2Fib3J0X2NhbGwoYWZzX3NvY2tldCwgY2FsbC0+cnhjYWxsLAorCQkJCQkJYWJvcnRfY29kZSwgLXJldCwgIktJViIpOworCQkJZ290byBkb19hYm9ydDsKKwkJY2FzZSAtRU5PREFUQToKKwkJY2FzZSAtRUJBRE1TRzoKKwkJY2FzZSAtRU1TR1NJWkU6CisJCWRlZmF1bHQ6CisJCQlhYm9ydF9jb2RlID0gUlhHRU5fQ0NfVU5NQVJTSEFMOworCQkJaWYgKGNhbGwtPnN0YXRlICE9IEFGU19DQUxMX0FXQUlUX1JFUExZKQorCQkJCWFib3J0X2NvZGUgPSBSWEdFTl9TU19VTk1BUlNIQUw7CisJCQlyeHJwY19rZXJuZWxfYWJvcnRfY2FsbChhZnNfc29ja2V0LCBjYWxsLT5yeGNhbGwsCisJCQkJCQlhYm9ydF9jb2RlLCBFQkFETVNHLCAiS1VNIik7CisJCQlnb3RvIGRvX2Fib3J0OworCQl9CiAJfQogCi0JLyogbWFrZSBzdXJlIHRoZSBxdWV1ZSBpcyBlbXB0eSBpZiB0aGUgY2FsbCBpcyBkb25lIHdpdGggKHdlIG1pZ2h0IGhhdmUKLQkgKiBhYm9ydGVkIHRoZSBjYWxsIGVhcmx5IGJlY2F1c2Ugb2YgYW4gdW5tYXJzaGFsbGluZyBlcnJvcikgKi8KLQlpZiAoY2FsbC0+c3RhdGUgPj0gQUZTX0NBTExfQ09NUExFVEUpIHsKLQkJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmY2FsbC0+cnhfcXVldWUpKSkKLQkJCWFmc19mcmVlX3NrYihza2IpOwotCQlpZiAoY2FsbC0+aW5jb21pbmcpCi0JCQlhZnNfZW5kX2NhbGwoY2FsbCk7Ci0JfQotCitkb25lOgorCWlmIChjYWxsLT5zdGF0ZSA9PSBBRlNfQ0FMTF9DT01QTEVURSAmJiBjYWxsLT5pbmNvbWluZykKKwkJYWZzX2VuZF9jYWxsKGNhbGwpOworb3V0OgogCV9sZWF2ZSgiIik7CisJcmV0dXJuOworCitkb19hYm9ydDoKKwljYWxsLT5lcnJvciA9IHJldDsKKwljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX0NPTVBMRVRFOworCWdvdG8gZG9uZTsKIH0KIAogLyoKQEAgLTU3MCw3ICs0NzUsNyBAQAogICovCiBzdGF0aWMgaW50IGFmc193YWl0X2Zvcl9jYWxsX3RvX2NvbXBsZXRlKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWNvbnN0IGNoYXIgKmFib3J0X3doeTsKIAlpbnQgcmV0OwogCiAJREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKQEAgLTU4MiwxNSArNDg3LDE4IEBACiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAKIAkJLyogZGVsaXZlciBhbnkgbWVzc2FnZXMgdGhhdCBhcmUgaW4gdGhlIHF1ZXVlICovCi0JCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZjYWxsLT5yeF9xdWV1ZSkpIHsKKwkJaWYgKGNhbGwtPnN0YXRlIDwgQUZTX0NBTExfQ09NUExFVEUgJiYgY2FsbC0+bmVlZF9hdHRlbnRpb24pIHsKKwkJCWNhbGwtPm5lZWRfYXR0ZW50aW9uID0gZmFsc2U7CiAJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAJCQlhZnNfZGVsaXZlcl90b19jYWxsKGNhbGwpOwogCQkJY29udGludWU7CiAJCX0KIAorCQlhYm9ydF93aHkgPSAiS1dDIjsKIAkJcmV0ID0gY2FsbC0+ZXJyb3I7Ci0JCWlmIChjYWxsLT5zdGF0ZSA+PSBBRlNfQ0FMTF9DT01QTEVURSkKKwkJaWYgKGNhbGwtPnN0YXRlID09IEFGU19DQUxMX0NPTVBMRVRFKQogCQkJYnJlYWs7CisJCWFib3J0X3doeSA9ICJLV0kiOwogCQlyZXQgPSAtRUlOVFI7CiAJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJCWJyZWFrOwpAQCAtNjAzLDkgKzUxMSw4IEBACiAJLyoga2lsbCB0aGUgY2FsbCAqLwogCWlmIChjYWxsLT5zdGF0ZSA8IEFGU19DQUxMX0NPTVBMRVRFKSB7CiAJCV9kZWJ1ZygiY2FsbCBpbmNvbXBsZXRlIik7Ci0JCXJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsKGNhbGwtPnJ4Y2FsbCwgUlhfQ0FMTF9ERUFEKTsKLQkJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmY2FsbC0+cnhfcXVldWUpKSkKLQkJCWFmc19mcmVlX3NrYihza2IpOworCQlyeHJwY19rZXJuZWxfYWJvcnRfY2FsbChhZnNfc29ja2V0LCBjYWxsLT5yeGNhbGwsCisJCQkJCVJYX0NBTExfREVBRCwgLXJldCwgYWJvcnRfd2h5KTsKIAl9CiAKIAlfZGVidWcoImNhbGwgY29tcGxldGUiKTsKQEAgLTYxNywxNyArNTI0LDI0IEBACiAvKgogICogd2FrZSB1cCBhIHdhaXRpbmcgY2FsbAogICovCi1zdGF0aWMgdm9pZCBhZnNfd2FrZV91cF9jYWxsX3dhaXRlcihzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCitzdGF0aWMgdm9pZCBhZnNfd2FrZV91cF9jYWxsX3dhaXRlcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCByeHJwY19jYWxsICpyeGNhbGwsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgY2FsbF91c2VyX0lEKQogeworCXN0cnVjdCBhZnNfY2FsbCAqY2FsbCA9IChzdHJ1Y3QgYWZzX2NhbGwgKiljYWxsX3VzZXJfSUQ7CisKKwljYWxsLT5uZWVkX2F0dGVudGlvbiA9IHRydWU7CiAJd2FrZV91cCgmY2FsbC0+d2FpdHEpOwogfQogCiAvKgogICogd2FrZSB1cCBhbiBhc3luY2hyb25vdXMgY2FsbAogICovCi1zdGF0aWMgdm9pZCBhZnNfd2FrZV91cF9hc3luY19jYWxsKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKK3N0YXRpYyB2b2lkIGFmc193YWtlX3VwX2FzeW5jX2NhbGwoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcnhycGNfY2FsbCAqcnhjYWxsLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgY2FsbF91c2VyX0lEKQogewotCV9lbnRlcigiIik7CisJc3RydWN0IGFmc19jYWxsICpjYWxsID0gKHN0cnVjdCBhZnNfY2FsbCAqKWNhbGxfdXNlcl9JRDsKKworCWNhbGwtPm5lZWRfYXR0ZW50aW9uID0gdHJ1ZTsKIAlxdWV1ZV93b3JrKGFmc19hc3luY19jYWxscywgJmNhbGwtPmFzeW5jX3dvcmspOwogfQogCkBAIC02NDUsOCArNTU5LDEwIEBACiAvKgogICogZGVsZXRlIGFuIGFzeW5jaHJvbm91cyBjYWxsCiAgKi8KLXN0YXRpYyB2b2lkIGFmc19kZWxldGVfYXN5bmNfY2FsbChzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCitzdGF0aWMgdm9pZCBhZnNfZGVsZXRlX2FzeW5jX2NhbGwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogeworCXN0cnVjdCBhZnNfY2FsbCAqY2FsbCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWZzX2NhbGwsIGFzeW5jX3dvcmspOworCiAJX2VudGVyKCIiKTsKIAogCWFmc19mcmVlX2NhbGwoY2FsbCk7CkBAIC02NTYsMTcgKzU3MiwxOSBAQAogCiAvKgogICogcGVyZm9ybSBwcm9jZXNzaW5nIG9uIGFuIGFzeW5jaHJvbm91cyBjYWxsCi0gKiAtIG9uIGEgbXVsdGlwbGUtdGhyZWFkIHdvcmtxdWV1ZSB0aGlzIHdvcmsgaXRlbSBtYXkgdHJ5IHRvIHJ1biBvbiBzZXZlcmFsCi0gKiAgIENQVXMgYXQgdGhlIHNhbWUgdGltZQogICovCi1zdGF0aWMgdm9pZCBhZnNfcHJvY2Vzc19hc3luY19jYWxsKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKK3N0YXRpYyB2b2lkIGFmc19wcm9jZXNzX2FzeW5jX2NhbGwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogeworCXN0cnVjdCBhZnNfY2FsbCAqY2FsbCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWZzX2NhbGwsIGFzeW5jX3dvcmspOworCiAJX2VudGVyKCIiKTsKIAotCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZjYWxsLT5yeF9xdWV1ZSkpCisJaWYgKGNhbGwtPnN0YXRlIDwgQUZTX0NBTExfQ09NUExFVEUgJiYgY2FsbC0+bmVlZF9hdHRlbnRpb24pIHsKKwkJY2FsbC0+bmVlZF9hdHRlbnRpb24gPSBmYWxzZTsKIAkJYWZzX2RlbGl2ZXJfdG9fY2FsbChjYWxsKTsKKwl9CiAKLQlpZiAoY2FsbC0+c3RhdGUgPj0gQUZTX0NBTExfQ09NUExFVEUgJiYgY2FsbC0+d2FpdF9tb2RlKSB7CisJaWYgKGNhbGwtPnN0YXRlID09IEFGU19DQUxMX0NPTVBMRVRFICYmIGNhbGwtPndhaXRfbW9kZSkgewogCQlpZiAoY2FsbC0+d2FpdF9tb2RlLT5hc3luY19jb21wbGV0ZSkKIAkJCWNhbGwtPndhaXRfbW9kZS0+YXN5bmNfY29tcGxldGUoY2FsbC0+cmVwbHksCiAJCQkJCQkJY2FsbC0+ZXJyb3IpOwpAQCAtNjc3LDEwNCArNTk1LDkzIEBACiAKIAkJLyogd2UgY2FuJ3QganVzdCBkZWxldGUgdGhlIGNhbGwgYmVjYXVzZSB0aGUgd29yayBpdGVtIG1heSBiZQogCQkgKiBxdWV1ZWQgKi8KLQkJY2FsbC0+YXN5bmNfd29ya2ZuID0gYWZzX2RlbGV0ZV9hc3luY19jYWxsOworCQljYWxsLT5hc3luY193b3JrLmZ1bmMgPSBhZnNfZGVsZXRlX2FzeW5jX2NhbGw7CiAJCXF1ZXVlX3dvcmsoYWZzX2FzeW5jX2NhbGxzLCAmY2FsbC0+YXN5bmNfd29yayk7CiAJfQogCiAJX2xlYXZlKCIiKTsKIH0KIAotLyoKLSAqIGVtcHR5IGEgc29ja2V0IGJ1ZmZlciBpbnRvIGEgZmxhdCByZXBseSBidWZmZXIKLSAqLwotdm9pZCBhZnNfdHJhbnNmZXJfcmVwbHkoc3RydWN0IGFmc19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHZvaWQgYWZzX3J4X2F0dGFjaChzdHJ1Y3QgcnhycGNfY2FsbCAqcnhjYWxsLCB1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCkKIHsKLQlzaXplX3QgbGVuID0gc2tiLT5sZW47CisJc3RydWN0IGFmc19jYWxsICpjYWxsID0gKHN0cnVjdCBhZnNfY2FsbCAqKXVzZXJfY2FsbF9JRDsKIAotCWlmIChza2JfY29weV9iaXRzKHNrYiwgMCwgY2FsbC0+YnVmZmVyICsgY2FsbC0+cmVwbHlfc2l6ZSwgbGVuKSA8IDApCi0JCUJVRygpOwotCWNhbGwtPnJlcGx5X3NpemUgKz0gbGVuOworCWNhbGwtPnJ4Y2FsbCA9IHJ4Y2FsbDsKIH0KIAogLyoKLSAqIGFjY2VwdCB0aGUgYmFja2xvZyBvZiBpbmNvbWluZyBjYWxscworICogQ2hhcmdlIHRoZSBpbmNvbWluZyBjYWxsIHByZWFsbG9jYXRpb24uCiAgKi8KLXN0YXRpYyB2b2lkIGFmc19jb2xsZWN0X2luY29taW5nX2NhbGwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQgYWZzX2NoYXJnZV9wcmVhbGxvY2F0aW9uKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqcnhjYWxsOwotCXN0cnVjdCBhZnNfY2FsbCAqY2FsbCA9IE5VTEw7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwgPSBhZnNfc3BhcmVfaW5jb21pbmdfY2FsbDsKIAotCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmFmc19pbmNvbWluZ19jYWxscykpKSB7Ci0JCV9kZWJ1ZygibmV3IGNhbGwiKTsKLQotCQkvKiBkb24ndCBuZWVkIHRoZSBub3RpZmljYXRpb24gKi8KLQkJYWZzX2ZyZWVfc2tiKHNrYik7Ci0KKwlmb3IgKDs7KSB7CiAJCWlmICghY2FsbCkgewogCQkJY2FsbCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZnNfY2FsbCksIEdGUF9LRVJORUwpOwotCQkJaWYgKCFjYWxsKSB7Ci0JCQkJcnhycGNfa2VybmVsX3JlamVjdF9jYWxsKGFmc19zb2NrZXQpOwotCQkJCXJldHVybjsKLQkJCX0KKwkJCWlmICghY2FsbCkKKwkJCQlicmVhazsKIAotCQkJY2FsbC0+YXN5bmNfd29ya2ZuID0gYWZzX3Byb2Nlc3NfYXN5bmNfY2FsbDsKLQkJCUlOSVRfV09SSygmY2FsbC0+YXN5bmNfd29yaywgYWZzX2FzeW5jX3dvcmtmbik7CisJCQlJTklUX1dPUksoJmNhbGwtPmFzeW5jX3dvcmssIGFmc19wcm9jZXNzX2FzeW5jX2NhbGwpOwogCQkJY2FsbC0+d2FpdF9tb2RlID0gJmFmc19hc3luY19pbmNvbWluZ19jYWxsOwogCQkJY2FsbC0+dHlwZSA9ICZhZnNfUlhDTXh4eHg7CiAJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYWxsLT53YWl0cSk7Ci0JCQlza2JfcXVldWVfaGVhZF9pbml0KCZjYWxsLT5yeF9xdWV1ZSk7CiAJCQljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX0FXQUlUX09QX0lEOwotCi0JCQlfZGVidWcoIkNBTEwgJXB7JXN9IFslZF0iLAotCQkJICAgICAgIGNhbGwsIGNhbGwtPnR5cGUtPm5hbWUsCi0JCQkgICAgICAgYXRvbWljX3JlYWQoJmFmc19vdXRzdGFuZGluZ19jYWxscykpOwotCQkJYXRvbWljX2luYygmYWZzX291dHN0YW5kaW5nX2NhbGxzKTsKIAkJfQogCi0JCXJ4Y2FsbCA9IHJ4cnBjX2tlcm5lbF9hY2NlcHRfY2FsbChhZnNfc29ja2V0LAotCQkJCQkJICAodW5zaWduZWQgbG9uZykgY2FsbCk7Ci0JCWlmICghSVNfRVJSKHJ4Y2FsbCkpIHsKLQkJCWNhbGwtPnJ4Y2FsbCA9IHJ4Y2FsbDsKLQkJCWNhbGwgPSBOVUxMOwotCQl9CisJCWlmIChyeHJwY19rZXJuZWxfY2hhcmdlX2FjY2VwdChhZnNfc29ja2V0LAorCQkJCQkgICAgICAgYWZzX3dha2VfdXBfYXN5bmNfY2FsbCwKKwkJCQkJICAgICAgIGFmc19yeF9hdHRhY2gsCisJCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyljYWxsLAorCQkJCQkgICAgICAgR0ZQX0tFUk5FTCkgPCAwKQorCQkJYnJlYWs7CisJCWNhbGwgPSBOVUxMOwogCX0KLQotCWlmIChjYWxsKQotCQlhZnNfZnJlZV9jYWxsKGNhbGwpOworCWFmc19zcGFyZV9pbmNvbWluZ19jYWxsID0gY2FsbDsKIH0KIAogLyoKLSAqIGdyYWIgdGhlIG9wZXJhdGlvbiBJRCBmcm9tIGFuIGluY29taW5nIGNhY2hlIG1hbmFnZXIgY2FsbAorICogRGlzY2FyZCBhIHByZWFsbG9jYXRlZCBjYWxsIHdoZW4gYSBzb2NrZXQgaXMgc2h1dCBkb3duLgogICovCi1zdGF0aWMgaW50IGFmc19kZWxpdmVyX2NtX29wX2lkKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQlib29sIGxhc3QpCitzdGF0aWMgdm9pZCBhZnNfcnhfZGlzY2FyZF9uZXdfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqcnhjYWxsLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCkKIHsKLQlzaXplX3QgbGVuID0gc2tiLT5sZW47Ci0Jdm9pZCAqb2lidWYgPSAodm9pZCAqKSAmY2FsbC0+b3BlcmF0aW9uX0lEOworCXN0cnVjdCBhZnNfY2FsbCAqY2FsbCA9IChzdHJ1Y3QgYWZzX2NhbGwgKil1c2VyX2NhbGxfSUQ7CiAKLQlfZW50ZXIoInsldX0seyV6dX0sJWQiLCBjYWxsLT5vZmZzZXQsIGxlbiwgbGFzdCk7CisJYXRvbWljX2luYygmYWZzX291dHN0YW5kaW5nX2NhbGxzKTsKKwljYWxsLT5yeGNhbGwgPSBOVUxMOworCWFmc19mcmVlX2NhbGwoY2FsbCk7Cit9CisKKy8qCisgKiBOb3RpZmljYXRpb24gb2YgYW4gaW5jb21pbmcgY2FsbC4KKyAqLworc3RhdGljIHZvaWQgYWZzX3J4X25ld19jYWxsKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHJ4cnBjX2NhbGwgKnJ4Y2FsbCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCkKK3sKKwlhdG9taWNfaW5jKCZhZnNfb3V0c3RhbmRpbmdfY2FsbHMpOworCXF1ZXVlX3dvcmsoYWZzX3dxLCAmYWZzX2NoYXJnZV9wcmVhbGxvY2F0aW9uX3dvcmspOworfQorCisvKgorICogR3JhYiB0aGUgb3BlcmF0aW9uIElEIGZyb20gYW4gaW5jb21pbmcgY2FjaGUgbWFuYWdlciBjYWxsLiAgVGhlIHNvY2tldAorICogYnVmZmVyIGlzIGRpc2NhcmRlZCBvbiBlcnJvciBvciBpZiB3ZSBkb24ndCB5ZXQgaGF2ZSBzdWZmaWNpZW50IGRhdGEuCisgKi8KK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY21fb3BfaWQoc3RydWN0IGFmc19jYWxsICpjYWxsKQoreworCWludCByZXQ7CisKKwlfZW50ZXIoInslenV9IiwgY2FsbC0+b2Zmc2V0KTsKIAogCUFTU0VSVENNUChjYWxsLT5vZmZzZXQsIDwsIDQpOwogCiAJLyogdGhlIG9wZXJhdGlvbiBJRCBmb3JtcyB0aGUgZmlyc3QgZm91ciBieXRlcyBvZiB0aGUgcmVxdWVzdCBkYXRhICovCi0JbGVuID0gbWluX3Qoc2l6ZV90LCBsZW4sIDQgLSBjYWxsLT5vZmZzZXQpOwotCWlmIChza2JfY29weV9iaXRzKHNrYiwgMCwgb2lidWYgKyBjYWxsLT5vZmZzZXQsIGxlbikgPCAwKQotCQlCVUcoKTsKLQlpZiAoIXBza2JfcHVsbChza2IsIGxlbikpCi0JCUJVRygpOwotCWNhbGwtPm9mZnNldCArPSBsZW47Ci0KLQlpZiAoY2FsbC0+b2Zmc2V0IDwgNCkgewotCQlpZiAobGFzdCkgewotCQkJX2xlYXZlKCIgPSAtRUJBRE1TRyBbb3AgSUQgc2hvcnRdIik7Ci0JCQlyZXR1cm4gLUVCQURNU0c7Ci0JCX0KLQkJX2xlYXZlKCIgPSAwIFtpbmNvbXBsZXRlXSIpOwotCQlyZXR1cm4gMDsKLQl9CisJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCAmY2FsbC0+b3BlcmF0aW9uX0lELCA0LCB0cnVlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAogCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfQVdBSVRfUkVRVUVTVDsKKwljYWxsLT5vZmZzZXQgPSAwOwogCiAJLyogYXNrIHRoZSBjYWNoZSBtYW5hZ2VyIHRvIHJvdXRlIHRoZSBjYWxsIChpdCdsbCBjaGFuZ2UgdGhlIGNhbGwgdHlwZQogCSAqIGlmIHN1Y2Nlc3NmdWwpICovCkBAIC03ODMsNyArNjkwLDcgQEAKIAogCS8qIHBhc3MgcmVzcG9uc2liaWxpdHkgZm9yIHRoZSByZW1haW5lciBvZiB0aGlzIG1lc3NhZ2Ugb2ZmIHRvIHRoZQogCSAqIGNhY2hlIG1hbmFnZXIgb3AgKi8KLQlyZXR1cm4gY2FsbC0+dHlwZS0+ZGVsaXZlcihjYWxsLCBza2IsIGxhc3QpOworCXJldHVybiBjYWxsLT50eXBlLT5kZWxpdmVyKGNhbGwpOwogfQogCiAvKgpAQCAtODAzLDE0ICs3MTAsMTUgQEAKIAltc2cubXNnX2ZsYWdzCQk9IDA7CiAKIAljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX0FXQUlUX0FDSzsKLQlzd2l0Y2ggKHJ4cnBjX2tlcm5lbF9zZW5kX2RhdGEoY2FsbC0+cnhjYWxsLCAmbXNnLCAwKSkgeworCXN3aXRjaCAocnhycGNfa2VybmVsX3NlbmRfZGF0YShhZnNfc29ja2V0LCBjYWxsLT5yeGNhbGwsICZtc2csIDApKSB7CiAJY2FzZSAwOgogCQlfbGVhdmUoIiBbcmVwbGllZF0iKTsKIAkJcmV0dXJuOwogCiAJY2FzZSAtRU5PTUVNOgogCQlfZGVidWcoIm9vbSIpOwotCQlyeHJwY19rZXJuZWxfYWJvcnRfY2FsbChjYWxsLT5yeGNhbGwsIFJYX1VTRVJfQUJPUlQpOworCQlyeHJwY19rZXJuZWxfYWJvcnRfY2FsbChhZnNfc29ja2V0LCBjYWxsLT5yeGNhbGwsCisJCQkJCVJYX1VTRVJfQUJPUlQsIEVOT01FTSwgIktPTyIpOwogCWRlZmF1bHQ6CiAJCWFmc19lbmRfY2FsbChjYWxsKTsKIAkJX2xlYXZlKCIgW2Vycm9yXSIpOwpAQCAtODM5LDcgKzc0Nyw3IEBACiAJbXNnLm1zZ19mbGFncwkJPSAwOwogCiAJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9BV0FJVF9BQ0s7Ci0JbiA9IHJ4cnBjX2tlcm5lbF9zZW5kX2RhdGEoY2FsbC0+cnhjYWxsLCAmbXNnLCBsZW4pOworCW4gPSByeHJwY19rZXJuZWxfc2VuZF9kYXRhKGFmc19zb2NrZXQsIGNhbGwtPnJ4Y2FsbCwgJm1zZywgbGVuKTsKIAlpZiAobiA+PSAwKSB7CiAJCS8qIFN1Y2Nlc3MgKi8KIAkJX2xlYXZlKCIgW3JlcGxpZWRdIik7CkBAIC04NDgsMzcgKzc1Niw1MCBAQAogCiAJaWYgKG4gPT0gLUVOT01FTSkgewogCQlfZGVidWcoIm9vbSIpOwotCQlyeHJwY19rZXJuZWxfYWJvcnRfY2FsbChjYWxsLT5yeGNhbGwsIFJYX1VTRVJfQUJPUlQpOworCQlyeHJwY19rZXJuZWxfYWJvcnRfY2FsbChhZnNfc29ja2V0LCBjYWxsLT5yeGNhbGwsCisJCQkJCVJYX1VTRVJfQUJPUlQsIEVOT01FTSwgIktPTyIpOwogCX0KIAlhZnNfZW5kX2NhbGwoY2FsbCk7CiAJX2xlYXZlKCIgW2Vycm9yXSIpOwogfQogCiAvKgotICogZXh0cmFjdCBhIHBpZWNlIG9mIGRhdGEgZnJvbSB0aGUgcmVjZWl2ZWQgZGF0YSBzb2NrZXQgYnVmZmVycworICogRXh0cmFjdCBhIHBpZWNlIG9mIGRhdGEgZnJvbSB0aGUgcmVjZWl2ZWQgZGF0YSBzb2NrZXQgYnVmZmVycy4KICAqLwotaW50IGFmc19leHRyYWN0X2RhdGEoc3RydWN0IGFmc19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgIGJvb2wgbGFzdCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCitpbnQgYWZzX2V4dHJhY3RfZGF0YShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkgICAgIGJvb2wgd2FudF9tb3JlKQogewotCXNpemVfdCBsZW4gPSBza2ItPmxlbjsKKwlpbnQgcmV0OwogCi0JX2VudGVyKCJ7JXV9LHslenV9LCVkLCwlenUiLCBjYWxsLT5vZmZzZXQsIGxlbiwgbGFzdCwgY291bnQpOworCV9lbnRlcigieyVzLCV6dX0sLCV6dSwlZCIsCisJICAgICAgIGNhbGwtPnR5cGUtPm5hbWUsIGNhbGwtPm9mZnNldCwgY291bnQsIHdhbnRfbW9yZSk7CiAKLQlBU1NFUlRDTVAoY2FsbC0+b2Zmc2V0LCA8LCBjb3VudCk7CisJQVNTRVJUQ01QKGNhbGwtPm9mZnNldCwgPD0sIGNvdW50KTsKIAotCWxlbiA9IG1pbl90KHNpemVfdCwgbGVuLCBjb3VudCAtIGNhbGwtPm9mZnNldCk7Ci0JaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCBidWYgKyBjYWxsLT5vZmZzZXQsIGxlbikgPCAwIHx8Ci0JICAgICFwc2tiX3B1bGwoc2tiLCBsZW4pKQotCQlCVUcoKTsKLQljYWxsLT5vZmZzZXQgKz0gbGVuOworCXJldCA9IHJ4cnBjX2tlcm5lbF9yZWN2X2RhdGEoYWZzX3NvY2tldCwgY2FsbC0+cnhjYWxsLAorCQkJCSAgICAgYnVmLCBjb3VudCwgJmNhbGwtPm9mZnNldCwKKwkJCQkgICAgIHdhbnRfbW9yZSwgJmNhbGwtPmFib3J0X2NvZGUpOworCWlmIChyZXQgPT0gMCB8fCByZXQgPT0gLUVBR0FJTikKKwkJcmV0dXJuIHJldDsKIAotCWlmIChjYWxsLT5vZmZzZXQgPCBjb3VudCkgewotCQlpZiAobGFzdCkgewotCQkJX2xlYXZlKCIgPSAtRUJBRE1TRyBbJWQgPCAlenVdIiwgY2FsbC0+b2Zmc2V0LCBjb3VudCk7Ci0JCQlyZXR1cm4gLUVCQURNU0c7CisJaWYgKHJldCA9PSAxKSB7CisJCXN3aXRjaCAoY2FsbC0+c3RhdGUpIHsKKwkJY2FzZSBBRlNfQ0FMTF9BV0FJVF9SRVBMWToKKwkJCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfQ09NUExFVEU7CisJCQlicmVhazsKKwkJY2FzZSBBRlNfQ0FMTF9BV0FJVF9SRVFVRVNUOgorCQkJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9SRVBMWUlORzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CiAJCX0KLQkJX2xlYXZlKCIgPSAtRUFHQUlOIik7Ci0JCXJldHVybiAtRUFHQUlOOworCQlyZXR1cm4gMDsKIAl9Ci0JcmV0dXJuIDA7CisKKwlpZiAocmV0ID09IC1FQ09OTkFCT1JURUQpCisJCWNhbGwtPmVycm9yID0gY2FsbC0+dHlwZS0+YWJvcnRfdG9fZXJyb3IoY2FsbC0+YWJvcnRfY29kZSk7CisJZWxzZQorCQljYWxsLT5lcnJvciA9IHJldDsKKwljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX0NPTVBMRVRFOworCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9mcy9hZnMvc2VydmVyLmMgYi9mcy9hZnMvc2VydmVyLmMKaW5kZXggZjM0MmFjZi4uZDQwNjZhYiAxMDA2NDQKLS0tIGEvZnMvYWZzL3NlcnZlci5jCisrKyBiL2ZzL2Fmcy9zZXJ2ZXIuYwpAQCAtMTc4LDEzICsxNzgsMTggQEAKIC8qCiAgKiBsb29rIHVwIGEgc2VydmVyIGJ5IGl0cyBJUCBhZGRyZXNzCiAgKi8KLXN0cnVjdCBhZnNfc2VydmVyICphZnNfZmluZF9zZXJ2ZXIoY29uc3Qgc3RydWN0IGluX2FkZHIgKl9hZGRyKQorc3RydWN0IGFmc19zZXJ2ZXIgKmFmc19maW5kX3NlcnZlcihjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKnNyeCkKIHsKIAlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyID0gTlVMTDsKIAlzdHJ1Y3QgcmJfbm9kZSAqcDsKLQlzdHJ1Y3QgaW5fYWRkciBhZGRyID0gKl9hZGRyOworCXN0cnVjdCBpbl9hZGRyIGFkZHIgPSBzcngtPnRyYW5zcG9ydC5zaW4uc2luX2FkZHI7CiAKLQlfZW50ZXIoIiVwSTQiLCAmYWRkci5zX2FkZHIpOworCV9lbnRlcigieyVkLCVwSTR9Iiwgc3J4LT50cmFuc3BvcnQuZmFtaWx5LCAmYWRkci5zX2FkZHIpOworCisJaWYgKHNyeC0+dHJhbnNwb3J0LmZhbWlseSAhPSBBRl9JTkVUKSB7CisJCVdBUk4odHJ1ZSwgIkFGUyBkb2VzIG5vdCB5ZXMgc3VwcG9ydCBub24tSVB2NCBhZGRyZXNzZXNcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CiAKIAlyZWFkX2xvY2soJmFmc19zZXJ2ZXJzX2xvY2spOwogCmRpZmYgLS1naXQgYS9mcy9hZnMvdmxjbGllbnQuYyBiL2ZzL2Fmcy92bGNsaWVudC5jCmluZGV4IDM0MGFmZDAuLjk0YmNkOTcgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy92bGNsaWVudC5jCisrKyBiL2ZzL2Fmcy92bGNsaWVudC5jCkBAIC01OCwyMiArNTgsMTggQEAKIC8qCiAgKiBkZWxpdmVyIHJlcGx5IGRhdGEgdG8gYSBWTC5HZXRFbnRyeUJ5WFhYIGNhbGwKICAqLwotc3RhdGljIGludCBhZnNfZGVsaXZlcl92bF9nZXRfZW50cnlfYnlfeHh4KHN0cnVjdCBhZnNfY2FsbCAqY2FsbCwKLQkJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBsYXN0KQorc3RhdGljIGludCBhZnNfZGVsaXZlcl92bF9nZXRfZW50cnlfYnlfeHh4KHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKIHsKIAlzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiAqZW50cnk7CiAJX19iZTMyICpicDsKIAl1MzIgdG1wOwotCWludCBsb29wOworCWludCBsb29wLCByZXQ7CiAKLQlfZW50ZXIoIiwsJXUiLCBsYXN0KTsKKwlfZW50ZXIoIiIpOwogCi0JYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwsIHNrYik7Ci0JaWYgKCFsYXN0KQotCQlyZXR1cm4gMDsKLQotCWlmIChjYWxsLT5yZXBseV9zaXplICE9IGNhbGwtPnJlcGx5X21heCkKLQkJcmV0dXJuIC1FQkFETVNHOworCXJldCA9IGFmc190cmFuc2Zlcl9yZXBseShjYWxsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAogCS8qIHVubWFyc2hhbGwgdGhlIHJlcGx5IG9uY2Ugd2UndmUgcmVjZWl2ZWQgYWxsIG9mIGl0ICovCiAJZW50cnkgPSBjYWxsLT5yZXBseTsKZGlmZiAtLWdpdCBhL2ZzL2Fmcy92bG9jYXRpb24uYyBiL2ZzL2Fmcy92bG9jYXRpb24uYwppbmRleCA1Mjk3Njc4Li40NWE4NjM5IDEwMDY0NAotLS0gYS9mcy9hZnMvdmxvY2F0aW9uLmMKKysrIGIvZnMvYWZzL3Zsb2NhdGlvbi5jCkBAIC01OTQsOCArNTk0LDggQEAKICAqLwogaW50IF9faW5pdCBhZnNfdmxvY2F0aW9uX3VwZGF0ZV9pbml0KHZvaWQpCiB7Ci0JYWZzX3Zsb2NhdGlvbl91cGRhdGVfd29ya2VyID0KLQkJY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImthZnNfdmx1cGRhdGVkIik7CisJYWZzX3Zsb2NhdGlvbl91cGRhdGVfd29ya2VyID0gYWxsb2Nfd29ya3F1ZXVlKCJrYWZzX3ZsdXBkYXRlZCIsCisJCQkJCQkgICAgICBXUV9NRU1fUkVDTEFJTSwgMCk7CiAJcmV0dXJuIGFmc192bG9jYXRpb25fdXBkYXRlX3dvcmtlciA/IDAgOiAtRU5PTUVNOwogfQogCmRpZmYgLS1naXQgYS9mcy9haW8uYyBiL2ZzL2Fpby5jCmluZGV4IGZiOGU0NWIuLjRmZTgxZDEgMTAwNjQ0Ci0tLSBhL2ZzL2Fpby5jCisrKyBiL2ZzL2Fpby5jCkBAIC0yMzksNyArMjM5LDEyIEBACiAJc3RhdGljIGNvbnN0IHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBvcHMgPSB7CiAJCS5kX2RuYW1lCT0gc2ltcGxlX2RuYW1lLAogCX07Ci0JcmV0dXJuIG1vdW50X3BzZXVkbyhmc190eXBlLCAiYWlvOiIsIE5VTEwsICZvcHMsIEFJT19SSU5HX01BR0lDKTsKKwlzdHJ1Y3QgZGVudHJ5ICpyb290ID0gbW91bnRfcHNldWRvKGZzX3R5cGUsICJhaW86IiwgTlVMTCwgJm9wcywKKwkJCQkJICAgQUlPX1JJTkdfTUFHSUMpOworCisJaWYgKCFJU19FUlIocm9vdCkpCisJCXJvb3QtPmRfc2ItPnNfaWZsYWdzIHw9IFNCX0lfTk9FWEVDOworCXJldHVybiByb290OwogfQogCiAvKiBhaW9fc2V0dXAKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mczQvZXhwaXJlLmMgYi9mcy9hdXRvZnM0L2V4cGlyZS5jCmluZGV4IGI0OTM5MDkuLmQ4ZTZkNDIgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mczQvZXhwaXJlLmMKKysrIGIvZnMvYXV0b2ZzNC9leHBpcmUuYwpAQCAtNDE3LDYgKzQxNyw3IEBACiAJfQogCXJldHVybiBOVUxMOwogfQorCiAvKgogICogRmluZCBhbiBlbGlnaWJsZSB0cmVlIHRvIHRpbWUtb3V0CiAgKiBBIHRyZWUgaXMgZWxpZ2libGUgaWYgOi0KQEAgLTQzMiw2ICs0MzMsNyBAQAogCXN0cnVjdCBkZW50cnkgKnJvb3QgPSBzYi0+c19yb290OwogCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAlzdHJ1Y3QgZGVudHJ5ICpleHBpcmVkOworCXN0cnVjdCBkZW50cnkgKmZvdW5kOwogCXN0cnVjdCBhdXRvZnNfaW5mbyAqaW5vOwogCiAJaWYgKCFyb290KQpAQCAtNDQyLDMxICs0NDQsNDYgQEAKIAogCWRlbnRyeSA9IE5VTEw7CiAJd2hpbGUgKChkZW50cnkgPSBnZXRfbmV4dF9wb3NpdGl2ZV9zdWJkaXIoZGVudHJ5LCByb290KSkpIHsKKwkJaW50IGZsYWdzID0gaG93OworCiAJCXNwaW5fbG9jaygmc2JpLT5mc19sb2NrKTsKIAkJaW5vID0gYXV0b2ZzNF9kZW50cnlfaW5vKGRlbnRyeSk7Ci0JCWlmIChpbm8tPmZsYWdzICYgQVVUT0ZTX0lORl9XQU5UX0VYUElSRSkKLQkJCWV4cGlyZWQgPSBOVUxMOwotCQllbHNlCi0JCQlleHBpcmVkID0gc2hvdWxkX2V4cGlyZShkZW50cnksIG1udCwgdGltZW91dCwgaG93KTsKLQkJaWYgKCFleHBpcmVkKSB7CisJCWlmIChpbm8tPmZsYWdzICYgQVVUT0ZTX0lORl9XQU5UX0VYUElSRSkgewogCQkJc3Bpbl91bmxvY2soJnNiaS0+ZnNfbG9jayk7CiAJCQljb250aW51ZTsKIAkJfQorCQlzcGluX3VubG9jaygmc2JpLT5mc19sb2NrKTsKKworCQlleHBpcmVkID0gc2hvdWxkX2V4cGlyZShkZW50cnksIG1udCwgdGltZW91dCwgZmxhZ3MpOworCQlpZiAoIWV4cGlyZWQpCisJCQljb250aW51ZTsKKworCQlzcGluX2xvY2soJnNiaS0+ZnNfbG9jayk7CiAJCWlubyA9IGF1dG9mczRfZGVudHJ5X2lubyhleHBpcmVkKTsKIAkJaW5vLT5mbGFncyB8PSBBVVRPRlNfSU5GX1dBTlRfRVhQSVJFOwogCQlzcGluX3VubG9jaygmc2JpLT5mc19sb2NrKTsKIAkJc3luY2hyb25pemVfcmN1KCk7Ci0JCXNwaW5fbG9jaygmc2JpLT5mc19sb2NrKTsKLQkJaWYgKHNob3VsZF9leHBpcmUoZXhwaXJlZCwgbW50LCB0aW1lb3V0LCBob3cpKSB7Ci0JCQlpZiAoZXhwaXJlZCAhPSBkZW50cnkpCi0JCQkJZHB1dChkZW50cnkpOwotCQkJZ290byBmb3VuZDsKLQkJfQogCisJCS8qIE1ha2Ugc3VyZSBhIHJlZmVyZW5jZSBpcyBub3QgdGFrZW4gb24gZm91bmQgaWYKKwkJICogdGhpbmdzIGhhdmUgY2hhbmdlZC4KKwkJICovCisJCWZsYWdzICY9IH5BVVRPRlNfRVhQX0xFQVZFUzsKKwkJZm91bmQgPSBzaG91bGRfZXhwaXJlKGV4cGlyZWQsIG1udCwgdGltZW91dCwgaG93KTsKKwkJaWYgKCFmb3VuZCB8fCBmb3VuZCAhPSBleHBpcmVkKQorCQkJLyogU29tZXRoaW5nIGhhcyBjaGFuZ2VkLCBjb250aW51ZSAqLworCQkJZ290byBuZXh0OworCisJCWlmIChleHBpcmVkICE9IGRlbnRyeSkKKwkJCWRwdXQoZGVudHJ5KTsKKworCQlzcGluX2xvY2soJnNiaS0+ZnNfbG9jayk7CisJCWdvdG8gZm91bmQ7CituZXh0OgorCQlzcGluX2xvY2soJnNiaS0+ZnNfbG9jayk7CiAJCWluby0+ZmxhZ3MgJj0gfkFVVE9GU19JTkZfV0FOVF9FWFBJUkU7CisJCXNwaW5fdW5sb2NrKCZzYmktPmZzX2xvY2spOwogCQlpZiAoZXhwaXJlZCAhPSBkZW50cnkpCiAJCQlkcHV0KGV4cGlyZWQpOwotCQlzcGluX3VubG9jaygmc2JpLT5mc19sb2NrKTsKIAl9CiAJcmV0dXJuIE5VTEw7CiAKQEAgLTQ4Myw2ICs1MDAsNyBAQAogCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpID0gYXV0b2ZzNF9zYmkoZGVudHJ5LT5kX3NiKTsKIAlzdHJ1Y3QgYXV0b2ZzX2luZm8gKmlubyA9IGF1dG9mczRfZGVudHJ5X2lubyhkZW50cnkpOwogCWludCBzdGF0dXM7CisJaW50IHN0YXRlOwogCiAJLyogQmxvY2sgb24gYW55IHBlbmRpbmcgZXhwaXJlICovCiAJaWYgKCEoaW5vLT5mbGFncyAmIEFVVE9GU19JTkZfV0FOVF9FWFBJUkUpKQpAQCAtNDkwLDggKzUwOCwxOSBAQAogCWlmIChyY3Vfd2FsaykKIAkJcmV0dXJuIC1FQ0hJTEQ7CiAKK3JldHJ5OgogCXNwaW5fbG9jaygmc2JpLT5mc19sb2NrKTsKLQlpZiAoaW5vLT5mbGFncyAmIEFVVE9GU19JTkZfRVhQSVJJTkcpIHsKKwlzdGF0ZSA9IGluby0+ZmxhZ3MgJiAoQVVUT0ZTX0lORl9XQU5UX0VYUElSRSB8IEFVVE9GU19JTkZfRVhQSVJJTkcpOworCWlmIChzdGF0ZSA9PSBBVVRPRlNfSU5GX1dBTlRfRVhQSVJFKSB7CisJCXNwaW5fdW5sb2NrKCZzYmktPmZzX2xvY2spOworCQkvKgorCQkgKiBQb3NzaWJseSBiZWluZyBzZWxlY3RlZCBmb3IgZXhwaXJlLCB3YWl0IHVudGlsCisJCSAqIGl0J3Mgc2VsZWN0ZWQgb3Igbm90LgorCQkgKi8KKwkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoSFovMTApOworCQlnb3RvIHJldHJ5OworCX0KKwlpZiAoc3RhdGUgJiBBVVRPRlNfSU5GX0VYUElSSU5HKSB7CiAJCXNwaW5fdW5sb2NrKCZzYmktPmZzX2xvY2spOwogCiAJCXByX2RlYnVnKCJ3YWl0aW5nIGZvciBleHBpcmUgJXAgbmFtZT0lcGRcbiIsIGRlbnRyeSwgZGVudHJ5KTsKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mczQvd2FpdHEuYyBiL2ZzL2F1dG9mczQvd2FpdHEuYwppbmRleCA0MzFmZDdlLi5lNDQyNzFkIDEwMDY0NAotLS0gYS9mcy9hdXRvZnM0L3dhaXRxLmMKKysrIGIvZnMvYXV0b2ZzNC93YWl0cS5jCkBAIC00MzEsOCArNDMxLDggQEAKIAkJbWVtY3B5KCZ3cS0+bmFtZSwgJnFzdHIsIHNpemVvZihzdHJ1Y3QgcXN0cikpOwogCQl3cS0+ZGV2ID0gYXV0b2ZzNF9nZXRfZGV2KHNiaSk7CiAJCXdxLT5pbm8gPSBhdXRvZnM0X2dldF9pbm8oc2JpKTsKLQkJd3EtPnVpZCA9IGN1cnJlbnRfdWlkKCk7Ci0JCXdxLT5naWQgPSBjdXJyZW50X2dpZCgpOworCQl3cS0+dWlkID0gY3VycmVudF9yZWFsX2NyZWQoKS0+dWlkOworCQl3cS0+Z2lkID0gY3VycmVudF9yZWFsX2NyZWQoKS0+Z2lkOwogCQl3cS0+cGlkID0gcGlkOwogCQl3cS0+dGdpZCA9IHRnaWQ7CiAJCXdxLT5zdGF0dXMgPSAtRUlOVFI7IC8qIFN0YXR1cyByZXR1cm4gaWYgaW50ZXJydXB0ZWQgKi8KZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9lbGYuYyBiL2ZzL2JpbmZtdF9lbGYuYwppbmRleCA3ZjZhZmYzZi4uMjQ3MmFmMiAxMDA2NDQKLS0tIGEvZnMvYmluZm10X2VsZi5jCisrKyBiL2ZzL2JpbmZtdF9lbGYuYwpAQCAtODUzLDYgKzg1Myw3IEBACiAJCWN1cnJlbnQtPmZsYWdzIHw9IFBGX1JBTkRPTUlaRTsKIAogCXNldHVwX25ld19leGVjKGJwcm0pOworCWluc3RhbGxfZXhlY19jcmVkcyhicHJtKTsKIAogCS8qIERvIHRoaXMgc28gdGhhdCB3ZSBjYW4gbG9hZCB0aGUgaW50ZXJwcmV0ZXIsIGlmIG5lZWQgYmUuICBXZSB3aWxsCiAJICAgY2hhbmdlIHNvbWUgb2YgdGhlc2UgbGF0ZXIgKi8KQEAgLTEwNDQsNyArMTA0NSw2IEBACiAJCWdvdG8gb3V0OwogI2VuZGlmIC8qIEFSQ0hfSEFTX1NFVFVQX0FERElUSU9OQUxfUEFHRVMgKi8KIAotCWluc3RhbGxfZXhlY19jcmVkcyhicHJtKTsKIAlyZXR2YWwgPSBjcmVhdGVfZWxmX3RhYmxlcyhicHJtLCAmbG9jLT5lbGZfZXgsCiAJCQkgIGxvYWRfYWRkciwgaW50ZXJwX2xvYWRfYWRkcik7CiAJaWYgKHJldHZhbCA8IDApCkBAIC0xNjI0LDIwICsxNjI0LDEyIEBACiAJCXJlZ3NldC0+d3JpdGViYWNrKHRhc2ssIHJlZ3NldCwgMSk7CiB9CiAKLSNpZm5kZWYgUFJfUkVHX1NJWkUKLSNkZWZpbmUgUFJfUkVHX1NJWkUoUykgc2l6ZW9mKFMpCi0jZW5kaWYKLQogI2lmbmRlZiBQUlNUQVRVU19TSVpFCi0jZGVmaW5lIFBSU1RBVFVTX1NJWkUoUykgc2l6ZW9mKFMpCi0jZW5kaWYKLQotI2lmbmRlZiBQUl9SRUdfUFRSCi0jZGVmaW5lIFBSX1JFR19QVFIoUykgKCYoKFMpLT5wcl9yZWcpKQorI2RlZmluZSBQUlNUQVRVU19TSVpFKFMsIFIpIHNpemVvZihTKQogI2VuZGlmCiAKICNpZm5kZWYgU0VUX1BSX0ZQVkFMSUQKLSNkZWZpbmUgU0VUX1BSX0ZQVkFMSUQoUywgVikgKChTKS0+cHJfZnB2YWxpZCA9IChWKSkKKyNkZWZpbmUgU0VUX1BSX0ZQVkFMSUQoUywgViwgUikgKChTKS0+cHJfZnB2YWxpZCA9IChWKSkKICNlbmRpZgogCiBzdGF0aWMgaW50IGZpbGxfdGhyZWFkX2NvcmVfaW5mbyhzdHJ1Y3QgZWxmX3RocmVhZF9jb3JlX2luZm8gKnQsCkBAIC0xNjQ1LDYgKzE2MzcsNyBAQAogCQkJCSBsb25nIHNpZ25yLCBzaXplX3QgKnRvdGFsKQogewogCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCByZWdzZXRfc2l6ZSA9IHZpZXctPnJlZ3NldHNbMF0ubiAqIHZpZXctPnJlZ3NldHNbMF0uc2l6ZTsKIAogCS8qCiAJICogTlRfUFJTVEFUVVMgaXMgdGhlIG9uZSBzcGVjaWFsIGNhc2UsIGJlY2F1c2UgdGhlIHJlZ3NldCBkYXRhCkBAIC0xNjUzLDEyICsxNjQ2LDExIEBACiAJICogV2UgYXNzdW1lIHRoYXQgcmVnc2V0IDAgaXMgTlRfUFJTVEFUVVMuCiAJICovCiAJZmlsbF9wcnN0YXR1cygmdC0+cHJzdGF0dXMsIHQtPnRhc2ssIHNpZ25yKTsKLQkodm9pZCkgdmlldy0+cmVnc2V0c1swXS5nZXQodC0+dGFzaywgJnZpZXctPnJlZ3NldHNbMF0sCi0JCQkJICAgIDAsIFBSX1JFR19TSVpFKHQtPnByc3RhdHVzLnByX3JlZyksCi0JCQkJICAgIFBSX1JFR19QVFIoJnQtPnByc3RhdHVzKSwgTlVMTCk7CisJKHZvaWQpIHZpZXctPnJlZ3NldHNbMF0uZ2V0KHQtPnRhc2ssICZ2aWV3LT5yZWdzZXRzWzBdLCAwLCByZWdzZXRfc2l6ZSwKKwkJCQkgICAgJnQtPnByc3RhdHVzLnByX3JlZywgTlVMTCk7CiAKIAlmaWxsX25vdGUoJnQtPm5vdGVzWzBdLCAiQ09SRSIsIE5UX1BSU1RBVFVTLAotCQkgIFBSU1RBVFVTX1NJWkUodC0+cHJzdGF0dXMpLCAmdC0+cHJzdGF0dXMpOworCQkgIFBSU1RBVFVTX1NJWkUodC0+cHJzdGF0dXMsIHJlZ3NldF9zaXplKSwgJnQtPnByc3RhdHVzKTsKIAkqdG90YWwgKz0gbm90ZXNpemUoJnQtPm5vdGVzWzBdKTsKIAogCWRvX3RocmVhZF9yZWdzZXRfd3JpdGViYWNrKHQtPnRhc2ssICZ2aWV3LT5yZWdzZXRzWzBdKTsKQEAgLTE2ODgsNyArMTY4MCw4IEBACiAJCQkJCQkgIHJlZ3NldC0+Y29yZV9ub3RlX3R5cGUsCiAJCQkJCQkgIHNpemUsIGRhdGEpOwogCQkJCWVsc2UgewotCQkJCQlTRVRfUFJfRlBWQUxJRCgmdC0+cHJzdGF0dXMsIDEpOworCQkJCQlTRVRfUFJfRlBWQUxJRCgmdC0+cHJzdGF0dXMsCisJCQkJCQkJMSwgcmVnc2V0X3NpemUpOwogCQkJCQlmaWxsX25vdGUoJnQtPm5vdGVzW2ldLCAiQ09SRSIsCiAJCQkJCQkgIE5UX1BSRlBSRUcsIHNpemUsIGRhdGEpOwogCQkJCX0KZGlmZiAtLWdpdCBhL2ZzL2Jsb2NrX2Rldi5jIGIvZnMvYmxvY2tfZGV2LmMKaW5kZXggYzNjZGRlOC4uMDhhZTk5MyAxMDA2NDQKLS0tIGEvZnMvYmxvY2tfZGV2LmMKKysrIGIvZnMvYmxvY2tfZGV2LmMKQEAgLTI0OSw3ICsyNDksOCBAQAogCQkgKiB0aGF3X2JkZXYgZHJvcHMgaXQuCiAJCSAqLwogCQlzYiA9IGdldF9zdXBlcihiZGV2KTsKLQkJZHJvcF9zdXBlcihzYik7CisJCWlmIChzYikKKwkJCWRyb3Bfc3VwZXIoc2IpOwogCQltdXRleF91bmxvY2soJmJkZXYtPmJkX2ZzZnJlZXplX211dGV4KTsKIAkJcmV0dXJuIHNiOwogCX0KQEAgLTY0Niw3ICs2NDcsNyBAQAogewogCXN0cnVjdCBkZW50cnkgKmRlbnQ7CiAJZGVudCA9IG1vdW50X3BzZXVkbyhmc190eXBlLCAiYmRldjoiLCAmYmRldl9zb3BzLCBOVUxMLCBCREVWRlNfTUFHSUMpOwotCWlmIChkZW50KQorCWlmICghSVNfRVJSKGRlbnQpKQogCQlkZW50LT5kX3NiLT5zX2lmbGFncyB8PSBTQl9JX0NHUk9VUFdCOwogCXJldHVybiBkZW50OwogfQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvYmFja3JlZi5jIGIvZnMvYnRyZnMvYmFja3JlZi5jCmluZGV4IDJiODg0MzkuLjQ1NWE2YjIgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2JhY2tyZWYuYworKysgYi9mcy9idHJmcy9iYWNrcmVmLmMKQEAgLTU4OSw2ICs1ODksNyBAQAogCiAJCQlsaXN0X2RlbCgmcmVmMi0+bGlzdCk7CiAJCQlrbWVtX2NhY2hlX2ZyZWUoYnRyZnNfcHJlbGltX3JlZl9jYWNoZSwgcmVmMik7CisJCQljb25kX3Jlc2NoZWQoKTsKIAkJfQogCiAJfQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvY3RyZWUuaCBiL2ZzL2J0cmZzL2N0cmVlLmgKaW5kZXggMmZlOGY4OS4uMzNmZTAzNSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvY3RyZWUuaAorKysgYi9mcy9idHJmcy9jdHJlZS5oCkBAIC00MjcsNiArNDI3LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIHJvX2JnczsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHByaW9yaXR5X3RpY2tldHM7CiAJc3RydWN0IGxpc3RfaGVhZCB0aWNrZXRzOworCXU2NCB0aWNrZXRzX2lkOwogCiAJc3RydWN0IHJ3X3NlbWFwaG9yZSBncm91cHNfc2VtOwogCS8qIGZvciBibG9jayBncm91cHMgaW4gb3VyIHNhbWUgdHlwZSAqLwpAQCAtMTAyOCw2ICsxMDI5LDcgQEAKIAlzdHJ1Y3QgYnRyZnNfd29ya3F1ZXVlICpxZ3JvdXBfcmVzY2FuX3dvcmtlcnM7CiAJc3RydWN0IGNvbXBsZXRpb24gcWdyb3VwX3Jlc2Nhbl9jb21wbGV0aW9uOwogCXN0cnVjdCBidHJmc193b3JrIHFncm91cF9yZXNjYW5fd29yazsKKwlib29sIHFncm91cF9yZXNjYW5fcnVubmluZzsJLyogcHJvdGVjdGVkIGJ5IHFncm91cF9yZXNjYW5fbG9jayAqLwogCiAJLyogZmlsZXN5c3RlbSBzdGF0ZSAqLwogCXVuc2lnbmVkIGxvbmcgZnNfc3RhdGU7CkBAIC0xMDc5LDYgKzEwODEsOCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgcGlubmVkX2NodW5rczsKIAogCWludCBjcmVhdGluZ19mcmVlX3NwYWNlX3RyZWU7CisJLyogVXNlZCB0byByZWNvcmQgaW50ZXJuYWxseSB3aGV0aGVyIGZzIGhhcyBiZWVuIGZyb3plbiAqLworCWludCBmc19mcm96ZW47CiB9OwogCiBzdHJ1Y3QgYnRyZnNfc3Vidm9sdW1lX3dyaXRlcnMgewpAQCAtMjU3OCw3ICsyNTgyLDcgQEAKIAkJCQkgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCQkgICB1NjQgcm9vdF9vYmplY3RpZCwgdTY0IG93bmVyLCB1NjQgb2Zmc2V0LAogCQkJCSAgIHN0cnVjdCBidHJmc19rZXkgKmlucyk7Ci1pbnQgYnRyZnNfcmVzZXJ2ZV9leHRlbnQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBudW1fYnl0ZXMsCitpbnQgYnRyZnNfcmVzZXJ2ZV9leHRlbnQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCByYW1fYnl0ZXMsIHU2NCBudW1fYnl0ZXMsCiAJCQkgdTY0IG1pbl9hbGxvY19zaXplLCB1NjQgZW1wdHlfc2l6ZSwgdTY0IGhpbnRfYnl0ZSwKIAkJCSBzdHJ1Y3QgYnRyZnNfa2V5ICppbnMsIGludCBpc19kYXRhLCBpbnQgZGVsYWxsb2MpOwogaW50IGJ0cmZzX2luY19yZWYoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsIHN0cnVjdCBidHJmc19yb290ICpyb290LApkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZGVsYXllZC1yZWYuYyBiL2ZzL2J0cmZzL2RlbGF5ZWQtcmVmLmMKaW5kZXggZDlkZGNmYy4uYWMwMmUwNCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZGVsYXllZC1yZWYuYworKysgYi9mcy9idHJmcy9kZWxheWVkLXJlZi5jCkBAIC01NDEsNyArNTQxLDYgQEAKIAlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfaGVhZCAqZXhpc3Rpbmc7CiAJc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX2hlYWQgKmhlYWRfcmVmID0gTlVMTDsKIAlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfcm9vdCAqZGVsYXllZF9yZWZzOwotCXN0cnVjdCBidHJmc19xZ3JvdXBfZXh0ZW50X3JlY29yZCAqcWV4aXN0aW5nOwogCWludCBjb3VudF9tb2QgPSAxOwogCWludCBtdXN0X2luc2VydF9yZXNlcnZlZCA9IDA7CiAKQEAgLTYwNiwxMCArNjA1LDggQEAKIAkJcXJlY29yZC0+bnVtX2J5dGVzID0gbnVtX2J5dGVzOwogCQlxcmVjb3JkLT5vbGRfcm9vdHMgPSBOVUxMOwogCi0JCXFleGlzdGluZyA9IGJ0cmZzX3Fncm91cF9pbnNlcnRfZGlydHlfZXh0ZW50KGZzX2luZm8sCi0JCQkJCQkJICAgICBkZWxheWVkX3JlZnMsCi0JCQkJCQkJICAgICBxcmVjb3JkKTsKLQkJaWYgKHFleGlzdGluZykKKwkJaWYoYnRyZnNfcWdyb3VwX2luc2VydF9kaXJ0eV9leHRlbnRfbm9sb2NrKGZzX2luZm8sCisJCQkJCWRlbGF5ZWRfcmVmcywgcXJlY29yZCkpCiAJCQlrZnJlZShxcmVjb3JkKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2Rpc2staW8uYyBiL2ZzL2J0cmZzL2Rpc2staW8uYwppbmRleCA1OWZlYmZiLi41NGJjOGM3IDEwMDY0NAotLS0gYS9mcy9idHJmcy9kaXNrLWlvLmMKKysrIGIvZnMvYnRyZnMvZGlzay1pby5jCkBAIC01NTksOCArNTU5LDI5IEBACiAJdTMyIG5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhsZWFmKTsKIAlpbnQgc2xvdDsKIAotCWlmIChucml0ZW1zID09IDApCisJaWYgKG5yaXRlbXMgPT0gMCkgeworCQlzdHJ1Y3QgYnRyZnNfcm9vdCAqY2hlY2tfcm9vdDsKKworCQlrZXkub2JqZWN0aWQgPSBidHJmc19oZWFkZXJfb3duZXIobGVhZik7CisJCWtleS50eXBlID0gQlRSRlNfUk9PVF9JVEVNX0tFWTsKKwkJa2V5Lm9mZnNldCA9ICh1NjQpLTE7CisKKwkJY2hlY2tfcm9vdCA9IGJ0cmZzX2dldF9mc19yb290KHJvb3QtPmZzX2luZm8sICZrZXksIGZhbHNlKTsKKwkJLyoKKwkJICogVGhlIG9ubHkgcmVhc29uIHdlIGFsc28gY2hlY2sgTlVMTCBoZXJlIGlzIHRoYXQgZHVyaW5nCisJCSAqIG9wZW5fY3RyZWUoKSBzb21lIHJvb3RzIGhhcyBub3QgeWV0IGJlZW4gc2V0IHVwLgorCQkgKi8KKwkJaWYgKCFJU19FUlJfT1JfTlVMTChjaGVja19yb290KSkgeworCQkJLyogaWYgbGVhZiBpcyB0aGUgcm9vdCwgdGhlbiBpdCdzIGZpbmUgKi8KKwkJCWlmIChsZWFmLT5zdGFydCAhPQorCQkJICAgIGJ0cmZzX3Jvb3RfYnl0ZW5yKCZjaGVja19yb290LT5yb290X2l0ZW0pKSB7CisJCQkJQ09SUlVQVCgibm9uLXJvb3QgbGVhZidzIG5yaXRlbXMgaXMgMCIsCisJCQkJCWxlYWYsIHJvb3QsIDApOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQl9CiAJCXJldHVybiAwOworCX0KIAogCS8qIENoZWNrIHRoZSAwIGl0ZW0gKi8KIAlpZiAoYnRyZnNfaXRlbV9vZmZzZXRfbnIobGVhZiwgMCkgKyBidHJmc19pdGVtX3NpemVfbnIobGVhZiwgMCkgIT0KQEAgLTYxMiw2ICs2MzMsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBjaGVja19ub2RlKHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbm9kZSkKK3sKKwl1bnNpZ25lZCBsb25nIG5yID0gYnRyZnNfaGVhZGVyX25yaXRlbXMobm9kZSk7CisKKwlpZiAobnIgPT0gMCB8fCBuciA+IEJUUkZTX05PREVQVFJTX1BFUl9CTE9DSyhyb290KSkgeworCQlidHJmc19jcml0KHJvb3QtPmZzX2luZm8sCisJCQkgICAiY29ycnVwdCBub2RlOiBibG9jayAlbGx1IHJvb3QgJWxsdSBucml0ZW1zICVsdSIsCisJCQkgICBub2RlLT5zdGFydCwgcm9vdC0+b2JqZWN0aWQsIG5yKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGJ0cmVlX3JlYWRwYWdlX2VuZF9pb19ob29rKHN0cnVjdCBidHJmc19pb19iaW8gKmlvX2JpbywKIAkJCQkgICAgICB1NjQgcGh5X29mZnNldCwgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJCQkJICAgICAgdTY0IHN0YXJ0LCB1NjQgZW5kLCBpbnQgbWlycm9yKQpAQCAtNjgyLDYgKzcxNiw5IEBACiAJCXJldCA9IC1FSU87CiAJfQogCisJaWYgKGZvdW5kX2xldmVsID4gMCAmJiBjaGVja19ub2RlKHJvb3QsIGViKSkKKwkJcmV0ID0gLUVJTzsKKwogCWlmICghcmV0KQogCQlzZXRfZXh0ZW50X2J1ZmZlcl91cHRvZGF0ZShlYik7CiBlcnI6CkBAIC0xNjE4LDggKzE2NTUsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYnRyZnNfcm9vdCAqYnRyZnNfbG9va3VwX2ZzX3Jvb3Qoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sCi0JCQkJCSAgICAgICB1NjQgcm9vdF9pZCkKK3N0cnVjdCBidHJmc19yb290ICpidHJmc19sb29rdXBfZnNfcm9vdChzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywKKwkJCQkJdTY0IHJvb3RfaWQpCiB7CiAJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3Q7CiAKQEAgLTIyOTgsNiArMjMzNSw3IEBACiAJZnNfaW5mby0+cXVvdGFfZW5hYmxlZCA9IDA7CiAJZnNfaW5mby0+cGVuZGluZ19xdW90YV9zdGF0ZSA9IDA7CiAJZnNfaW5mby0+cWdyb3VwX3VsaXN0ID0gTlVMTDsKKwlmc19pbmZvLT5xZ3JvdXBfcmVzY2FuX3J1bm5pbmcgPSBmYWxzZTsKIAltdXRleF9pbml0KCZmc19pbmZvLT5xZ3JvdXBfcmVzY2FuX2xvY2spOwogfQogCkBAIC0yNjI0LDYgKzI2NjIsNyBAQAogCWF0b21pY19zZXQoJmZzX2luZm8tPnFncm91cF9vcF9zZXEsIDApOwogCWF0b21pY19zZXQoJmZzX2luZm8tPnJlYWRhX3dvcmtzX2NudCwgMCk7CiAJYXRvbWljNjRfc2V0KCZmc19pbmZvLT50cmVlX21vZF9zZXEsIDApOworCWZzX2luZm8tPmZzX2Zyb3plbiA9IDA7CiAJZnNfaW5mby0+c2IgPSBzYjsKIAlmc19pbmZvLT5tYXhfaW5saW5lID0gQlRSRlNfREVGQVVMVF9NQVhfSU5MSU5FOwogCWZzX2luZm8tPm1ldGFkYXRhX3JhdGlvID0gMDsKQEAgLTM3MzksOCArMzc3OCwxNSBAQAogCWlmIChidHJmc19yb290X3JlZnMoJnJvb3QtPnJvb3RfaXRlbSkgPT0gMCkKIAkJc3luY2hyb25pemVfc3JjdSgmZnNfaW5mby0+c3Vidm9sX3NyY3UpOwogCi0JaWYgKHRlc3RfYml0KEJUUkZTX0ZTX1NUQVRFX0VSUk9SLCAmZnNfaW5mby0+ZnNfc3RhdGUpKQorCWlmICh0ZXN0X2JpdChCVFJGU19GU19TVEFURV9FUlJPUiwgJmZzX2luZm8tPmZzX3N0YXRlKSkgewogCQlidHJmc19mcmVlX2xvZyhOVUxMLCByb290KTsKKwkJaWYgKHJvb3QtPnJlbG9jX3Jvb3QpIHsKKwkJCWZyZWVfZXh0ZW50X2J1ZmZlcihyb290LT5yZWxvY19yb290LT5ub2RlKTsKKwkJCWZyZWVfZXh0ZW50X2J1ZmZlcihyb290LT5yZWxvY19yb290LT5jb21taXRfcm9vdCk7CisJCQlidHJmc19wdXRfZnNfcm9vdChyb290LT5yZWxvY19yb290KTsKKwkJCXJvb3QtPnJlbG9jX3Jvb3QgPSBOVUxMOworCQl9CisJfQogCiAJaWYgKHJvb3QtPmZyZWVfaW5vX3Bpbm5lZCkKIAkJX19idHJmc19yZW1vdmVfZnJlZV9zcGFjZV9jYWNoZShyb290LT5mcmVlX2lub19waW5uZWQpOwpAQCAtMzg1MSw3ICszODk3LDcgQEAKIAlzbXBfbWIoKTsKIAogCS8qIHdhaXQgZm9yIHRoZSBxZ3JvdXAgcmVzY2FuIHdvcmtlciB0byBzdG9wICovCi0JYnRyZnNfcWdyb3VwX3dhaXRfZm9yX2NvbXBsZXRpb24oZnNfaW5mbyk7CisJYnRyZnNfcWdyb3VwX3dhaXRfZm9yX2NvbXBsZXRpb24oZnNfaW5mbywgZmFsc2UpOwogCiAJLyogd2FpdCBmb3IgdGhlIHV1aWRfc2NhbiB0YXNrIHRvIGZpbmlzaCAqLwogCWRvd24oJmZzX2luZm8tPnV1aWRfdHJlZV9yZXNjYW5fc2VtKTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2Rpc2staW8uaCBiL2ZzL2J0cmZzL2Rpc2staW8uaAppbmRleCBiMzIwN2EwZS4uZjE5YTk4MiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZGlzay1pby5oCisrKyBiL2ZzL2J0cmZzL2Rpc2staW8uaApAQCAtNjgsNiArNjgsOCBAQAogc3RydWN0IGJ0cmZzX3Jvb3QgKmJ0cmZzX3JlYWRfZnNfcm9vdChzdHJ1Y3QgYnRyZnNfcm9vdCAqdHJlZV9yb290LAogCQkJCSAgICAgIHN0cnVjdCBidHJmc19rZXkgKmxvY2F0aW9uKTsKIGludCBidHJmc19pbml0X2ZzX3Jvb3Qoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpOworc3RydWN0IGJ0cmZzX3Jvb3QgKmJ0cmZzX2xvb2t1cF9mc19yb290KHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLAorCQkJCQl1NjQgcm9vdF9pZCk7CiBpbnQgYnRyZnNfaW5zZXJ0X2ZzX3Jvb3Qoc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sCiAJCQkgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpOwogdm9pZCBidHJmc19mcmVlX2ZzX3Jvb3RzKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvKTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMgYi9mcy9idHJmcy9leHRlbnQtdHJlZS5jCmluZGV4IDYxYjQ5NGUuLjY2NWRhOGYgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMKKysrIGIvZnMvYnRyZnMvZXh0ZW50LXRyZWUuYwpAQCAtNjAsMjEgKzYwLDYgQEAKIAlDSFVOS19BTExPQ19GT1JDRSA9IDIsCiB9OwogCi0vKgotICogQ29udHJvbCBob3cgcmVzZXJ2YXRpb25zIGFyZSBkZWFsdCB3aXRoLgotICoKLSAqIFJFU0VSVkVfRlJFRSAtIGZyZWVpbmcgYSByZXNlcnZhdGlvbi4KLSAqIFJFU0VSVkVfQUxMT0MgLSBhbGxvY2F0aW5nIHNwYWNlIGFuZCB3ZSBuZWVkIHRvIHVwZGF0ZSBieXRlc19tYXlfdXNlIGZvcgotICogICBFTk9TUEMgYWNjb3VudGluZwotICogUkVTRVJWRV9BTExPQ19OT19BQ0NPVU5UIC0gYWxsb2NhdGluZyBzcGFjZSBhbmQgd2Ugc2hvdWxkIG5vdCB1cGRhdGUKLSAqICAgYnl0ZXNfbWF5X3VzZSBhcyB0aGUgRU5PU1BDIGFjY291bnRpbmcgaXMgZG9uZSBlbHNld2hlcmUKLSAqLwotZW51bSB7Ci0JUkVTRVJWRV9GUkVFID0gMCwKLQlSRVNFUlZFX0FMTE9DID0gMSwKLQlSRVNFUlZFX0FMTE9DX05PX0FDQ09VTlQgPSAyLAotfTsKLQogc3RhdGljIGludCB1cGRhdGVfYmxvY2tfZ3JvdXAoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkgICAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IGJ5dGVuciwKIAkJCSAgICAgIHU2NCBudW1fYnl0ZXMsIGludCBhbGxvYyk7CkBAIC0xMDQsOSArODksMTAgQEAKIAkJCSBzdHJ1Y3QgYnRyZnNfa2V5ICprZXkpOwogc3RhdGljIHZvaWQgZHVtcF9zcGFjZV9pbmZvKHN0cnVjdCBidHJmc19zcGFjZV9pbmZvICppbmZvLCB1NjQgYnl0ZXMsCiAJCQkgICAgaW50IGR1bXBfYmxvY2tfZ3JvdXBzKTsKLXN0YXRpYyBpbnQgYnRyZnNfdXBkYXRlX3Jlc2VydmVkX2J5dGVzKHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqY2FjaGUsCi0JCQkJICAgICAgIHU2NCBudW1fYnl0ZXMsIGludCByZXNlcnZlLAotCQkJCSAgICAgICBpbnQgZGVsYWxsb2MpOworc3RhdGljIGludCBidHJmc19hZGRfcmVzZXJ2ZWRfYnl0ZXMoc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpjYWNoZSwKKwkJCQkgICAgdTY0IHJhbV9ieXRlcywgdTY0IG51bV9ieXRlcywgaW50IGRlbGFsbG9jKTsKK3N0YXRpYyBpbnQgYnRyZnNfZnJlZV9yZXNlcnZlZF9ieXRlcyhzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlLAorCQkJCSAgICAgdTY0IG51bV9ieXRlcywgaW50IGRlbGFsbG9jKTsKIHN0YXRpYyBpbnQgYmxvY2tfcnN2X3VzZV9ieXRlcyhzdHJ1Y3QgYnRyZnNfYmxvY2tfcnN2ICpibG9ja19yc3YsCiAJCQkgICAgICAgdTY0IG51bV9ieXRlcyk7CiBpbnQgYnRyZnNfcGluX2V4dGVudChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKQEAgLTM1MDEsNyArMzQ4Nyw2IEBACiAJCWRjcyA9IEJUUkZTX0RDX1NFVFVQOwogCWVsc2UgaWYgKHJldCA9PSAtRU5PU1BDKQogCQlzZXRfYml0KEJUUkZTX1RSQU5TX0NBQ0hFX0VOT1NQQywgJnRyYW5zLT50cmFuc2FjdGlvbi0+ZmxhZ3MpOwotCWJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZGF0YV9zcGFjZShpbm9kZSwgMCwgbnVtX3BhZ2VzKTsKIAogb3V0X3B1dDoKIAlpcHV0KGlub2RlKTsKQEAgLTQyODYsMTMgKzQyNzEsMTAgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCS8qCi0JICogVXNlIG5ldyBidHJmc19xZ3JvdXBfcmVzZXJ2ZV9kYXRhIHRvIHJlc2VydmUgcHJlY2lvdXMgZGF0YSBzcGFjZQotCSAqCi0JICogVE9ETzogRmluZCBhIGdvb2QgbWV0aG9kIHRvIGF2b2lkIHJlc2VydmUgZGF0YSBzcGFjZSBmb3IgTk9DT1cKLQkgKiByYW5nZSwgYnV0IGRvbid0IGltcGFjdCBwZXJmb3JtYW5jZSBvbiBxdW90YSBkaXNhYmxlIGNhc2UuCi0JICovCisJLyogVXNlIG5ldyBidHJmc19xZ3JvdXBfcmVzZXJ2ZV9kYXRhIHRvIHJlc2VydmUgcHJlY2lvdXMgZGF0YSBzcGFjZS4gKi8KIAlyZXQgPSBidHJmc19xZ3JvdXBfcmVzZXJ2ZV9kYXRhKGlub2RlLCBzdGFydCwgbGVuKTsKKwlpZiAocmV0KQorCQlidHJmc19mcmVlX3Jlc2VydmVkX2RhdGFfc3BhY2Vfbm9xdW90YShpbm9kZSwgc3RhcnQsIGxlbik7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDQ3Miw2ICs0NDU0LDE1IEBACiAJfQogfQogCisvKgorICogSWYgZm9yY2UgaXMgQ0hVTktfQUxMT0NfRk9SQ0U6CisgKiAgICAtIHJldHVybiAxIGlmIGl0IHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZXMgYSBjaHVuaywKKyAqICAgIC0gcmV0dXJuIGVycm9ycyBpbmNsdWRpbmcgLUVOT1NQQyBvdGhlcndpc2UuCisgKiBJZiBmb3JjZSBpcyBOT1QgQ0hVTktfQUxMT0NfRk9SQ0U6CisgKiAgICAtIHJldHVybiAwIGlmIGl0IGRvZXNuJ3QgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBjaHVuaywKKyAqICAgIC0gcmV0dXJuIDEgaWYgaXQgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlcyBhIGNodW5rLAorICogICAgLSByZXR1cm4gZXJyb3JzIGluY2x1ZGluZyAtRU5PU1BDIG90aGVyd2lzZS4KKyAqLwogc3RhdGljIGludCBkb19jaHVua19hbGxvYyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJCSAgc3RydWN0IGJ0cmZzX3Jvb3QgKmV4dGVudF9yb290LCB1NjQgZmxhZ3MsIGludCBmb3JjZSkKIHsKQEAgLTQ4ODIsNyArNDg3Myw3IEBACiAJCQkJICAgICBidHJmc19nZXRfYWxsb2NfcHJvZmlsZShyb290LCAwKSwKIAkJCQkgICAgIENIVU5LX0FMTE9DX05PX0ZPUkNFKTsKIAkJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKLQkJaWYgKHJldCA9PSAtRU5PU1BDKQorCQlpZiAocmV0ID4gMCB8fCByZXQgPT0gLUVOT1NQQykKIAkJCXJldCA9IDA7CiAJCWJyZWFrOwogCWNhc2UgQ09NTUlUX1RSQU5TOgpAQCAtNDkwNywxMSArNDg5OCw2IEBACiAJdTY0IGV4cGVjdGVkOwogCXU2NCB0b19yZWNsYWltID0gMDsKIAotCXRvX3JlY2xhaW0gPSBtaW5fdCh1NjQsIG51bV9vbmxpbmVfY3B1cygpICogU1pfMU0sIFNaXzE2TSk7Ci0JaWYgKGNhbl9vdmVyY29tbWl0KHJvb3QsIHNwYWNlX2luZm8sIHRvX3JlY2xhaW0sCi0JCQkgICBCVFJGU19SRVNFUlZFX0ZMVVNIX0FMTCkpCi0JCXJldHVybiAwOwotCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0aWNrZXQsICZzcGFjZV9pbmZvLT50aWNrZXRzLCBsaXN0KQogCQl0b19yZWNsYWltICs9IHRpY2tldC0+Ynl0ZXM7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0aWNrZXQsICZzcGFjZV9pbmZvLT5wcmlvcml0eV90aWNrZXRzLCBsaXN0KQpAQCAtNDkxOSw2ICs0OTA1LDExIEBACiAJaWYgKHRvX3JlY2xhaW0pCiAJCXJldHVybiB0b19yZWNsYWltOwogCisJdG9fcmVjbGFpbSA9IG1pbl90KHU2NCwgbnVtX29ubGluZV9jcHVzKCkgKiBTWl8xTSwgU1pfMTZNKTsKKwlpZiAoY2FuX292ZXJjb21taXQocm9vdCwgc3BhY2VfaW5mbywgdG9fcmVjbGFpbSwKKwkJCSAgIEJUUkZTX1JFU0VSVkVfRkxVU0hfQUxMKSkKKwkJcmV0dXJuIDA7CisKIAl1c2VkID0gc3BhY2VfaW5mby0+Ynl0ZXNfdXNlZCArIHNwYWNlX2luZm8tPmJ5dGVzX3Jlc2VydmVkICsKIAkgICAgICAgc3BhY2VfaW5mby0+Ynl0ZXNfcGlubmVkICsgc3BhY2VfaW5mby0+Ynl0ZXNfcmVhZG9ubHkgKwogCSAgICAgICBzcGFjZV9pbmZvLT5ieXRlc19tYXlfdXNlOwpAQCAtNDk3MiwxMiArNDk2MywxMiBAQAogICovCiBzdGF0aWMgdm9pZCBidHJmc19hc3luY19yZWNsYWltX21ldGFkYXRhX3NwYWNlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgcmVzZXJ2ZV90aWNrZXQgKmxhc3RfdGlja2V0ID0gTlVMTDsKIAlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbzsKIAlzdHJ1Y3QgYnRyZnNfc3BhY2VfaW5mbyAqc3BhY2VfaW5mbzsKIAl1NjQgdG9fcmVjbGFpbTsKIAlpbnQgZmx1c2hfc3RhdGU7CiAJaW50IGNvbW1pdF9jeWNsZXMgPSAwOworCXU2NCBsYXN0X3RpY2tldHNfaWQ7CiAKIAlmc19pbmZvID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBidHJmc19mc19pbmZvLCBhc3luY19yZWNsYWltX3dvcmspOwogCXNwYWNlX2luZm8gPSBfX2ZpbmRfc3BhY2VfaW5mbyhmc19pbmZvLCBCVFJGU19CTE9DS19HUk9VUF9NRVRBREFUQSk7CkBAIC00OTkwLDggKzQ5ODEsNyBAQAogCQlzcGluX3VubG9jaygmc3BhY2VfaW5mby0+bG9jayk7CiAJCXJldHVybjsKIAl9Ci0JbGFzdF90aWNrZXQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZzcGFjZV9pbmZvLT50aWNrZXRzLAotCQkJCSAgICAgICBzdHJ1Y3QgcmVzZXJ2ZV90aWNrZXQsIGxpc3QpOworCWxhc3RfdGlja2V0c19pZCA9IHNwYWNlX2luZm8tPnRpY2tldHNfaWQ7CiAJc3Bpbl91bmxvY2soJnNwYWNlX2luZm8tPmxvY2spOwogCiAJZmx1c2hfc3RhdGUgPSBGTFVTSF9ERUxBWUVEX0lURU1TX05SOwpAQCAtNTAxMSwxMCArNTAwMSwxMCBAQAogCQkJCQkJCSAgICAgIHNwYWNlX2luZm8pOwogCQl0aWNrZXQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZzcGFjZV9pbmZvLT50aWNrZXRzLAogCQkJCQkgIHN0cnVjdCByZXNlcnZlX3RpY2tldCwgbGlzdCk7Ci0JCWlmIChsYXN0X3RpY2tldCA9PSB0aWNrZXQpIHsKKwkJaWYgKGxhc3RfdGlja2V0c19pZCA9PSBzcGFjZV9pbmZvLT50aWNrZXRzX2lkKSB7CiAJCQlmbHVzaF9zdGF0ZSsrOwogCQl9IGVsc2UgewotCQkJbGFzdF90aWNrZXQgPSB0aWNrZXQ7CisJCQlsYXN0X3RpY2tldHNfaWQgPSBzcGFjZV9pbmZvLT50aWNrZXRzX2lkOwogCQkJZmx1c2hfc3RhdGUgPSBGTFVTSF9ERUxBWUVEX0lURU1TX05SOwogCQkJaWYgKGNvbW1pdF9jeWNsZXMpCiAJCQkJY29tbWl0X2N5Y2xlcy0tOwpAQCAtNTM5MCw2ICs1MzgwLDcgQEAKIAkJCWxpc3RfZGVsX2luaXQoJnRpY2tldC0+bGlzdCk7CiAJCQludW1fYnl0ZXMgLT0gdGlja2V0LT5ieXRlczsKIAkJCXRpY2tldC0+Ynl0ZXMgPSAwOworCQkJc3BhY2VfaW5mby0+dGlja2V0c19pZCsrOwogCQkJd2FrZV91cCgmdGlja2V0LT53YWl0KTsKIAkJfSBlbHNlIHsKIAkJCXRpY2tldC0+Ynl0ZXMgLT0gbnVtX2J5dGVzOwpAQCAtNTQzMiw2ICs1NDIzLDcgQEAKIAkJCW51bV9ieXRlcyAtPSB0aWNrZXQtPmJ5dGVzOwogCQkJc3BhY2VfaW5mby0+Ynl0ZXNfbWF5X3VzZSArPSB0aWNrZXQtPmJ5dGVzOwogCQkJdGlja2V0LT5ieXRlcyA9IDA7CisJCQlzcGFjZV9pbmZvLT50aWNrZXRzX2lkKys7CiAJCQl3YWtlX3VwKCZ0aWNrZXQtPndhaXQpOwogCQl9IGVsc2UgewogCQkJdHJhY2VfYnRyZnNfc3BhY2VfcmVzZXJ2YXRpb24oZnNfaW5mbywgInNwYWNlX2luZm8iLApAQCAtNjQ5NywxOSArNjQ4OSwxNSBAQAogfQogCiAvKioKLSAqIGJ0cmZzX3VwZGF0ZV9yZXNlcnZlZF9ieXRlcyAtIHVwZGF0ZSB0aGUgYmxvY2tfZ3JvdXAgYW5kIHNwYWNlIGluZm8gY291bnRlcnMKKyAqIGJ0cmZzX2FkZF9yZXNlcnZlZF9ieXRlcyAtIHVwZGF0ZSB0aGUgYmxvY2tfZ3JvdXAgYW5kIHNwYWNlIGluZm8gY291bnRlcnMKICAqIEBjYWNoZToJVGhlIGNhY2hlIHdlIGFyZSBtYW5pcHVsYXRpbmcKKyAqIEByYW1fYnl0ZXM6ICBUaGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGZpbGUgY29udGVudCwgYW5kIHdpbGwgYmUgc2FtZSB0bworICogICAgICAgICAgICAgIEBudW1fYnl0ZXMgZXhjZXB0IGZvciB0aGUgY29tcHJlc3MgcGF0aC4KICAqIEBudW1fYnl0ZXM6CVRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gcXVlc3Rpb24KLSAqIEByZXNlcnZlOglPbmUgb2YgdGhlIHJlc2VydmF0aW9uIGVudW1zCiAgKiBAZGVsYWxsb2M6ICAgVGhlIGJsb2NrcyBhcmUgYWxsb2NhdGVkIGZvciB0aGUgZGVsYWxsb2Mgd3JpdGUKICAqCi0gKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgYWxsb2NhdG9yIHdoZW4gaXQgcmVzZXJ2ZXMgc3BhY2UsIG9yIGJ5IHNvbWVib2R5IHdobyBpcwotICogZnJlZWluZyBzcGFjZSB0aGF0IHdhcyBuZXZlciBhY3R1YWxseSB1c2VkIG9uIGRpc2suICBGb3IgZXhhbXBsZSBpZiB5b3UKLSAqIHJlc2VydmUgc29tZSBzcGFjZSBmb3IgYSBuZXcgbGVhZiBpbiB0cmFuc2FjdGlvbiBBIGFuZCBiZWZvcmUgdHJhbnNhY3Rpb24gQQotICogY29tbWl0cyB5b3UgZnJlZSB0aGF0IGxlYWYsIHlvdSBjYWxsIHRoaXMgd2l0aCByZXNlcnZlIHNldCB0byAwIGluIG9yZGVyIHRvCi0gKiBjbGVhciB0aGUgcmVzZXJ2YXRpb24uCi0gKgotICogTWV0YWRhdGEgcmVzZXJ2YXRpb25zIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBSRVNFUlZFX0FMTE9DIHNvIHdlIGRvIHRoZSBwcm9wZXIKKyAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBhbGxvY2F0b3Igd2hlbiBpdCByZXNlcnZlcyBzcGFjZS4gTWV0YWRhdGEKKyAqIHJlc2VydmF0aW9ucyBzaG91bGQgYmUgY2FsbGVkIHdpdGggUkVTRVJWRV9BTExPQyBzbyB3ZSBkbyB0aGUgcHJvcGVyCiAgKiBFTk9TUEMgYWNjb3VudGluZy4gIEZvciBkYXRhIHdlIGhhbmRsZSB0aGUgcmVzZXJ2YXRpb24gdGhyb3VnaCBjbGVhcmluZyB0aGUKICAqIGRlbGFsbG9jIGJpdHMgaW4gdGhlIGlvX3RyZWUuICBXZSBoYXZlIHRvIGRvIHRoaXMgc2luY2Ugd2UgY291bGQgZW5kIHVwCiAgKiBhbGxvY2F0aW5nIGxlc3MgZGlzayBzcGFjZSBmb3IgdGhlIGFtb3VudCBvZiBkYXRhIHdlIGhhdmUgcmVzZXJ2ZWQgaW4gdGhlCkBAIC02NTE5LDQ0ICs2NTA3LDYzIEBACiAgKiBtYWtlIHRoZSByZXNlcnZhdGlvbiBhbmQgcmV0dXJuIC1FQUdBSU4sIG90aGVyd2lzZSB0aGlzIGZ1bmN0aW9uIGFsd2F5cwogICogc3VjY2VlZHMuCiAgKi8KLXN0YXRpYyBpbnQgYnRyZnNfdXBkYXRlX3Jlc2VydmVkX2J5dGVzKHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqY2FjaGUsCi0JCQkJICAgICAgIHU2NCBudW1fYnl0ZXMsIGludCByZXNlcnZlLCBpbnQgZGVsYWxsb2MpCitzdGF0aWMgaW50IGJ0cmZzX2FkZF9yZXNlcnZlZF9ieXRlcyhzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlLAorCQkJCSAgICB1NjQgcmFtX2J5dGVzLCB1NjQgbnVtX2J5dGVzLCBpbnQgZGVsYWxsb2MpCiB7CiAJc3RydWN0IGJ0cmZzX3NwYWNlX2luZm8gKnNwYWNlX2luZm8gPSBjYWNoZS0+c3BhY2VfaW5mbzsKIAlpbnQgcmV0ID0gMDsKIAogCXNwaW5fbG9jaygmc3BhY2VfaW5mby0+bG9jayk7CiAJc3Bpbl9sb2NrKCZjYWNoZS0+bG9jayk7Ci0JaWYgKHJlc2VydmUgIT0gUkVTRVJWRV9GUkVFKSB7Ci0JCWlmIChjYWNoZS0+cm8pIHsKLQkJCXJldCA9IC1FQUdBSU47Ci0JCX0gZWxzZSB7Ci0JCQljYWNoZS0+cmVzZXJ2ZWQgKz0gbnVtX2J5dGVzOwotCQkJc3BhY2VfaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgKz0gbnVtX2J5dGVzOwotCQkJaWYgKHJlc2VydmUgPT0gUkVTRVJWRV9BTExPQykgewotCQkJCXRyYWNlX2J0cmZzX3NwYWNlX3Jlc2VydmF0aW9uKGNhY2hlLT5mc19pbmZvLAotCQkJCQkJInNwYWNlX2luZm8iLCBzcGFjZV9pbmZvLT5mbGFncywKLQkJCQkJCW51bV9ieXRlcywgMCk7Ci0JCQkJc3BhY2VfaW5mby0+Ynl0ZXNfbWF5X3VzZSAtPSBudW1fYnl0ZXM7Ci0JCQl9Ci0KLQkJCWlmIChkZWxhbGxvYykKLQkJCQljYWNoZS0+ZGVsYWxsb2NfYnl0ZXMgKz0gbnVtX2J5dGVzOwotCQl9CisJaWYgKGNhY2hlLT5ybykgeworCQlyZXQgPSAtRUFHQUlOOwogCX0gZWxzZSB7Ci0JCWlmIChjYWNoZS0+cm8pCi0JCQlzcGFjZV9pbmZvLT5ieXRlc19yZWFkb25seSArPSBudW1fYnl0ZXM7Ci0JCWNhY2hlLT5yZXNlcnZlZCAtPSBudW1fYnl0ZXM7Ci0JCXNwYWNlX2luZm8tPmJ5dGVzX3Jlc2VydmVkIC09IG51bV9ieXRlczsKKwkJY2FjaGUtPnJlc2VydmVkICs9IG51bV9ieXRlczsKKwkJc3BhY2VfaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgKz0gbnVtX2J5dGVzOwogCisJCXRyYWNlX2J0cmZzX3NwYWNlX3Jlc2VydmF0aW9uKGNhY2hlLT5mc19pbmZvLAorCQkJCSJzcGFjZV9pbmZvIiwgc3BhY2VfaW5mby0+ZmxhZ3MsCisJCQkJcmFtX2J5dGVzLCAwKTsKKwkJc3BhY2VfaW5mby0+Ynl0ZXNfbWF5X3VzZSAtPSByYW1fYnl0ZXM7CiAJCWlmIChkZWxhbGxvYykKLQkJCWNhY2hlLT5kZWxhbGxvY19ieXRlcyAtPSBudW1fYnl0ZXM7CisJCQljYWNoZS0+ZGVsYWxsb2NfYnl0ZXMgKz0gbnVtX2J5dGVzOwogCX0KIAlzcGluX3VubG9jaygmY2FjaGUtPmxvY2spOwogCXNwaW5fdW5sb2NrKCZzcGFjZV9pbmZvLT5sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCisvKioKKyAqIGJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfYnl0ZXMgLSB1cGRhdGUgdGhlIGJsb2NrX2dyb3VwIGFuZCBzcGFjZSBpbmZvIGNvdW50ZXJzCisgKiBAY2FjaGU6ICAgICAgVGhlIGNhY2hlIHdlIGFyZSBtYW5pcHVsYXRpbmcKKyAqIEBudW1fYnl0ZXM6ICBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHF1ZXN0aW9uCisgKiBAZGVsYWxsb2M6ICAgVGhlIGJsb2NrcyBhcmUgYWxsb2NhdGVkIGZvciB0aGUgZGVsYWxsb2Mgd3JpdGUKKyAqCisgKiBUaGlzIGlzIGNhbGxlZCBieSBzb21lYm9keSB3aG8gaXMgZnJlZWluZyBzcGFjZSB0aGF0IHdhcyBuZXZlciBhY3R1YWxseSB1c2VkCisgKiBvbiBkaXNrLiAgRm9yIGV4YW1wbGUgaWYgeW91IHJlc2VydmUgc29tZSBzcGFjZSBmb3IgYSBuZXcgbGVhZiBpbiB0cmFuc2FjdGlvbgorICogQSBhbmQgYmVmb3JlIHRyYW5zYWN0aW9uIEEgY29tbWl0cyB5b3UgZnJlZSB0aGF0IGxlYWYsIHlvdSBjYWxsIHRoaXMgd2l0aAorICogcmVzZXJ2ZSBzZXQgdG8gMCBpbiBvcmRlciB0byBjbGVhciB0aGUgcmVzZXJ2YXRpb24uCisgKi8KKworc3RhdGljIGludCBidHJmc19mcmVlX3Jlc2VydmVkX2J5dGVzKHN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqY2FjaGUsCisJCQkJICAgICB1NjQgbnVtX2J5dGVzLCBpbnQgZGVsYWxsb2MpCit7CisJc3RydWN0IGJ0cmZzX3NwYWNlX2luZm8gKnNwYWNlX2luZm8gPSBjYWNoZS0+c3BhY2VfaW5mbzsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9jaygmc3BhY2VfaW5mby0+bG9jayk7CisJc3Bpbl9sb2NrKCZjYWNoZS0+bG9jayk7CisJaWYgKGNhY2hlLT5ybykKKwkJc3BhY2VfaW5mby0+Ynl0ZXNfcmVhZG9ubHkgKz0gbnVtX2J5dGVzOworCWNhY2hlLT5yZXNlcnZlZCAtPSBudW1fYnl0ZXM7CisJc3BhY2VfaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgLT0gbnVtX2J5dGVzOworCisJaWYgKGRlbGFsbG9jKQorCQljYWNoZS0+ZGVsYWxsb2NfYnl0ZXMgLT0gbnVtX2J5dGVzOworCXNwaW5fdW5sb2NrKCZjYWNoZS0+bG9jayk7CisJc3Bpbl91bmxvY2soJnNwYWNlX2luZm8tPmxvY2spOworCXJldHVybiByZXQ7Cit9CiB2b2lkIGJ0cmZzX3ByZXBhcmVfZXh0ZW50X2NvbW1pdChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJCQlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKIHsKQEAgLTcxOTEsNyArNzE5OCw3IEBACiAJCVdBUk5fT04odGVzdF9iaXQoRVhURU5UX0JVRkZFUl9ESVJUWSwgJmJ1Zi0+YmZsYWdzKSk7CiAKIAkJYnRyZnNfYWRkX2ZyZWVfc3BhY2UoY2FjaGUsIGJ1Zi0+c3RhcnQsIGJ1Zi0+bGVuKTsKLQkJYnRyZnNfdXBkYXRlX3Jlc2VydmVkX2J5dGVzKGNhY2hlLCBidWYtPmxlbiwgUkVTRVJWRV9GUkVFLCAwKTsKKwkJYnRyZnNfZnJlZV9yZXNlcnZlZF9ieXRlcyhjYWNoZSwgYnVmLT5sZW4sIDApOwogCQlidHJmc19wdXRfYmxvY2tfZ3JvdXAoY2FjaGUpOwogCQl0cmFjZV9idHJmc19yZXNlcnZlZF9leHRlbnRfZnJlZShyb290LCBidWYtPnN0YXJ0LCBidWYtPmxlbik7CiAJCXBpbiA9IDA7CkBAIC03NDE2LDkgKzc0MjMsOSBAQAogICogdGhlIGZyZWUgc3BhY2UgZXh0ZW50IGN1cnJlbnRseS4KICAqLwogc3RhdGljIG5vaW5saW5lIGludCBmaW5kX2ZyZWVfZXh0ZW50KHN0cnVjdCBidHJmc19yb290ICpvcmlnX3Jvb3QsCi0JCQkJICAgICB1NjQgbnVtX2J5dGVzLCB1NjQgZW1wdHlfc2l6ZSwKLQkJCQkgICAgIHU2NCBoaW50X2J5dGUsIHN0cnVjdCBidHJmc19rZXkgKmlucywKLQkJCQkgICAgIHU2NCBmbGFncywgaW50IGRlbGFsbG9jKQorCQkJCXU2NCByYW1fYnl0ZXMsIHU2NCBudW1fYnl0ZXMsIHU2NCBlbXB0eV9zaXplLAorCQkJCXU2NCBoaW50X2J5dGUsIHN0cnVjdCBidHJmc19rZXkgKmlucywKKwkJCQl1NjQgZmxhZ3MsIGludCBkZWxhbGxvYykKIHsKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IG9yaWdfcm9vdC0+ZnNfaW5mby0+ZXh0ZW50X3Jvb3Q7CkBAIC03NDMwLDggKzc0MzcsNiBAQAogCXN0cnVjdCBidHJmc19zcGFjZV9pbmZvICpzcGFjZV9pbmZvOwogCWludCBsb29wID0gMDsKIAlpbnQgaW5kZXggPSBfX2dldF9yYWlkX2luZGV4KGZsYWdzKTsKLQlpbnQgYWxsb2NfdHlwZSA9IChmbGFncyAmIEJUUkZTX0JMT0NLX0dST1VQX0RBVEEpID8KLQkJUkVTRVJWRV9BTExPQ19OT19BQ0NPVU5UIDogUkVTRVJWRV9BTExPQzsKIAlib29sIGZhaWxlZF9jbHVzdGVyX3JlZmlsbCA9IGZhbHNlOwogCWJvb2wgZmFpbGVkX2FsbG9jID0gZmFsc2U7CiAJYm9vbCB1c2VfY2x1c3RlciA9IHRydWU7CkBAIC03NzYzLDggKzc3NjgsOCBAQAogCQkJCQkgICAgIHNlYXJjaF9zdGFydCAtIG9mZnNldCk7CiAJCUJVR19PTihvZmZzZXQgPiBzZWFyY2hfc3RhcnQpOwogCi0JCXJldCA9IGJ0cmZzX3VwZGF0ZV9yZXNlcnZlZF9ieXRlcyhibG9ja19ncm91cCwgbnVtX2J5dGVzLAotCQkJCQkJICBhbGxvY190eXBlLCBkZWxhbGxvYyk7CisJCXJldCA9IGJ0cmZzX2FkZF9yZXNlcnZlZF9ieXRlcyhibG9ja19ncm91cCwgcmFtX2J5dGVzLAorCQkJCW51bV9ieXRlcywgZGVsYWxsb2MpOwogCQlpZiAocmV0ID09IC1FQUdBSU4pIHsKIAkJCWJ0cmZzX2FkZF9mcmVlX3NwYWNlKGJsb2NrX2dyb3VwLCBvZmZzZXQsIG51bV9ieXRlcyk7CiAJCQlnb3RvIGxvb3A7CkBAIC03OTM2LDcgKzc5NDEsNyBAQAogCXVwX3JlYWQoJmluZm8tPmdyb3Vwc19zZW0pOwogfQogCi1pbnQgYnRyZnNfcmVzZXJ2ZV9leHRlbnQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCitpbnQgYnRyZnNfcmVzZXJ2ZV9leHRlbnQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCByYW1fYnl0ZXMsCiAJCQkgdTY0IG51bV9ieXRlcywgdTY0IG1pbl9hbGxvY19zaXplLAogCQkJIHU2NCBlbXB0eV9zaXplLCB1NjQgaGludF9ieXRlLAogCQkJIHN0cnVjdCBidHJmc19rZXkgKmlucywgaW50IGlzX2RhdGEsIGludCBkZWxhbGxvYykKQEAgLTc5NDgsOCArNzk1Myw4IEBACiAJZmxhZ3MgPSBidHJmc19nZXRfYWxsb2NfcHJvZmlsZShyb290LCBpc19kYXRhKTsKIGFnYWluOgogCVdBUk5fT04obnVtX2J5dGVzIDwgcm9vdC0+c2VjdG9yc2l6ZSk7Ci0JcmV0ID0gZmluZF9mcmVlX2V4dGVudChyb290LCBudW1fYnl0ZXMsIGVtcHR5X3NpemUsIGhpbnRfYnl0ZSwgaW5zLAotCQkJICAgICAgIGZsYWdzLCBkZWxhbGxvYyk7CisJcmV0ID0gZmluZF9mcmVlX2V4dGVudChyb290LCByYW1fYnl0ZXMsIG51bV9ieXRlcywgZW1wdHlfc2l6ZSwKKwkJCSAgICAgICBoaW50X2J5dGUsIGlucywgZmxhZ3MsIGRlbGFsbG9jKTsKIAlpZiAoIXJldCAmJiAhaXNfZGF0YSkgewogCQlidHJmc19kZWNfYmxvY2tfZ3JvdXBfcmVzZXJ2YXRpb25zKHJvb3QtPmZzX2luZm8sCiAJCQkJCQkgICBpbnMtPm9iamVjdGlkKTsKQEAgLTc5NTgsNiArNzk2Myw3IEBACiAJCQludW1fYnl0ZXMgPSBtaW4obnVtX2J5dGVzID4+IDEsIGlucy0+b2Zmc2V0KTsKIAkJCW51bV9ieXRlcyA9IHJvdW5kX2Rvd24obnVtX2J5dGVzLCByb290LT5zZWN0b3JzaXplKTsKIAkJCW51bV9ieXRlcyA9IG1heChudW1fYnl0ZXMsIG1pbl9hbGxvY19zaXplKTsKKwkJCXJhbV9ieXRlcyA9IG51bV9ieXRlczsKIAkJCWlmIChudW1fYnl0ZXMgPT0gbWluX2FsbG9jX3NpemUpCiAJCQkJZmluYWxfdHJpZWQgPSB0cnVlOwogCQkJZ290byBhZ2FpbjsKQEAgLTc5OTUsNyArODAwMSw3IEBACiAJCWlmIChidHJmc190ZXN0X29wdChyb290LT5mc19pbmZvLCBESVNDQVJEKSkKIAkJCXJldCA9IGJ0cmZzX2Rpc2NhcmRfZXh0ZW50KHJvb3QsIHN0YXJ0LCBsZW4sIE5VTEwpOwogCQlidHJmc19hZGRfZnJlZV9zcGFjZShjYWNoZSwgc3RhcnQsIGxlbik7Ci0JCWJ0cmZzX3VwZGF0ZV9yZXNlcnZlZF9ieXRlcyhjYWNoZSwgbGVuLCBSRVNFUlZFX0ZSRUUsIGRlbGFsbG9jKTsKKwkJYnRyZnNfZnJlZV9yZXNlcnZlZF9ieXRlcyhjYWNoZSwgbGVuLCBkZWxhbGxvYyk7CiAJCXRyYWNlX2J0cmZzX3Jlc2VydmVkX2V4dGVudF9mcmVlKHJvb3QsIHN0YXJ0LCBsZW4pOwogCX0KIApAQCAtODIwOCw2ICs4MjE0LDcgQEAKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqYmxvY2tfZ3JvdXA7CisJc3RydWN0IGJ0cmZzX3NwYWNlX2luZm8gKnNwYWNlX2luZm87CiAKIAkvKgogCSAqIE1peGVkIGJsb2NrIGdyb3VwcyB3aWxsIGV4Y2x1ZGUgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIGxvZyBzbyB3ZSBvbmx5CkBAIC04MjIzLDkgKzgyMzAsMTQgQEAKIAlpZiAoIWJsb2NrX2dyb3VwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldCA9IGJ0cmZzX3VwZGF0ZV9yZXNlcnZlZF9ieXRlcyhibG9ja19ncm91cCwgaW5zLT5vZmZzZXQsCi0JCQkJCSAgUkVTRVJWRV9BTExPQ19OT19BQ0NPVU5ULCAwKTsKLQlCVUdfT04ocmV0KTsgLyogbG9naWMgZXJyb3IgKi8KKwlzcGFjZV9pbmZvID0gYmxvY2tfZ3JvdXAtPnNwYWNlX2luZm87CisJc3Bpbl9sb2NrKCZzcGFjZV9pbmZvLT5sb2NrKTsKKwlzcGluX2xvY2soJmJsb2NrX2dyb3VwLT5sb2NrKTsKKwlzcGFjZV9pbmZvLT5ieXRlc19yZXNlcnZlZCArPSBpbnMtPm9mZnNldDsKKwlibG9ja19ncm91cC0+cmVzZXJ2ZWQgKz0gaW5zLT5vZmZzZXQ7CisJc3Bpbl91bmxvY2soJmJsb2NrX2dyb3VwLT5sb2NrKTsKKwlzcGluX3VubG9jaygmc3BhY2VfaW5mby0+bG9jayk7CisKIAlyZXQgPSBhbGxvY19yZXNlcnZlZF9maWxlX2V4dGVudCh0cmFucywgcm9vdCwgMCwgcm9vdF9vYmplY3RpZCwKIAkJCQkJIDAsIG93bmVyLCBvZmZzZXQsIGlucywgMSk7CiAJYnRyZnNfcHV0X2Jsb2NrX2dyb3VwKGJsb2NrX2dyb3VwKTsKQEAgLTgzNjgsNyArODM4MCw3IEBACiAJaWYgKElTX0VSUihibG9ja19yc3YpKQogCQlyZXR1cm4gRVJSX0NBU1QoYmxvY2tfcnN2KTsKIAotCXJldCA9IGJ0cmZzX3Jlc2VydmVfZXh0ZW50KHJvb3QsIGJsb2Nrc2l6ZSwgYmxvY2tzaXplLAorCXJldCA9IGJ0cmZzX3Jlc2VydmVfZXh0ZW50KHJvb3QsIGJsb2Nrc2l6ZSwgYmxvY2tzaXplLCBibG9ja3NpemUsCiAJCQkJICAgZW1wdHlfc2l6ZSwgaGludCwgJmlucywgMCwgMCk7CiAJaWYgKHJldCkKIAkJZ290byBvdXRfdW51c2U7CkBAIC04NTIxLDM1ICs4NTMzLDYgQEAKIAl3Yy0+cmVhZGFfc2xvdCA9IHNsb3Q7CiB9CiAKLS8qCi0gKiBUaGVzZSBtYXkgbm90IGJlIHNlZW4gYnkgdGhlIHVzdWFsIGluYy9kZWMgcmVmIGNvZGUgc28gd2UgaGF2ZSB0bwotICogYWRkIHRoZW0gaGVyZS4KLSAqLwotc3RhdGljIGludCByZWNvcmRfb25lX3N1YnRyZWVfZXh0ZW50KHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAotCQkJCSAgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBieXRlbnIsCi0JCQkJICAgICB1NjQgbnVtX2J5dGVzKQotewotCXN0cnVjdCBidHJmc19xZ3JvdXBfZXh0ZW50X3JlY29yZCAqcXJlY29yZDsKLQlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfcm9vdCAqZGVsYXllZF9yZWZzOwotCi0JcXJlY29yZCA9IGttYWxsb2Moc2l6ZW9mKCpxcmVjb3JkKSwgR0ZQX05PRlMpOwotCWlmICghcXJlY29yZCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlxcmVjb3JkLT5ieXRlbnIgPSBieXRlbnI7Ci0JcXJlY29yZC0+bnVtX2J5dGVzID0gbnVtX2J5dGVzOwotCXFyZWNvcmQtPm9sZF9yb290cyA9IE5VTEw7Ci0KLQlkZWxheWVkX3JlZnMgPSAmdHJhbnMtPnRyYW5zYWN0aW9uLT5kZWxheWVkX3JlZnM7Ci0Jc3Bpbl9sb2NrKCZkZWxheWVkX3JlZnMtPmxvY2spOwotCWlmIChidHJmc19xZ3JvdXBfaW5zZXJ0X2RpcnR5X2V4dGVudCh0cmFucy0+ZnNfaW5mbywKLQkJCQkJICAgICBkZWxheWVkX3JlZnMsIHFyZWNvcmQpKQotCQlrZnJlZShxcmVjb3JkKTsKLQlzcGluX3VubG9jaygmZGVsYXllZF9yZWZzLT5sb2NrKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGFjY291bnRfbGVhZl9pdGVtcyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJCSAgICAgIHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJICAgICAgc3RydWN0IGV4dGVudF9idWZmZXIgKmViKQpAQCAtODU4Myw3ICs4NTY2LDggQEAKIAogCQludW1fYnl0ZXMgPSBidHJmc19maWxlX2V4dGVudF9kaXNrX251bV9ieXRlcyhlYiwgZmkpOwogCi0JCXJldCA9IHJlY29yZF9vbmVfc3VidHJlZV9leHRlbnQodHJhbnMsIHJvb3QsIGJ5dGVuciwgbnVtX2J5dGVzKTsKKwkJcmV0ID0gYnRyZnNfcWdyb3VwX2luc2VydF9kaXJ0eV9leHRlbnQodHJhbnMsIHJvb3QtPmZzX2luZm8sCisJCQkJYnl0ZW5yLCBudW1fYnl0ZXMsIEdGUF9OT0ZTKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJfQpAQCAtODczMiw4ICs4NzE2LDkgQEAKIAkJCWJ0cmZzX3NldF9sb2NrX2Jsb2NraW5nX3J3KGViLCBCVFJGU19SRUFEX0xPQ0spOwogCQkJcGF0aC0+bG9ja3NbbGV2ZWxdID0gQlRSRlNfUkVBRF9MT0NLX0JMT0NLSU5HOwogCi0JCQlyZXQgPSByZWNvcmRfb25lX3N1YnRyZWVfZXh0ZW50KHRyYW5zLCByb290LCBjaGlsZF9ieXRlbnIsCi0JCQkJCQkJcm9vdC0+bm9kZXNpemUpOworCQkJcmV0ID0gYnRyZnNfcWdyb3VwX2luc2VydF9kaXJ0eV9leHRlbnQodHJhbnMsCisJCQkJCXJvb3QtPmZzX2luZm8sIGNoaWxkX2J5dGVuciwKKwkJCQkJcm9vdC0+bm9kZXNpemUsIEdGUF9OT0ZTKTsKIAkJCWlmIChyZXQpCiAJCQkJZ290byBvdXQ7CiAJCX0KQEAgLTk5MDYsNiArOTg5MSw3IEBACiAJCQl9IGVsc2UgewogCQkJCXJldCA9IDA7CiAJCQl9CisJCQlmcmVlX2V4dGVudF9tYXAoZW0pOwogCQkJZ290byBvdXQ7CiAJCX0KIAkJcGF0aC0+c2xvdHNbMF0rKzsKQEAgLTk5NDIsNiArOTkyOCw3IEBACiAJCWJsb2NrX2dyb3VwLT5pcmVmID0gMDsKIAkJYmxvY2tfZ3JvdXAtPmlub2RlID0gTlVMTDsKIAkJc3Bpbl91bmxvY2soJmJsb2NrX2dyb3VwLT5sb2NrKTsKKwkJQVNTRVJUKGJsb2NrX2dyb3VwLT5pb19jdGwuaW5vZGUgPT0gTlVMTCk7CiAJCWlwdXQoaW5vZGUpOwogCQlsYXN0ID0gYmxvY2tfZ3JvdXAtPmtleS5vYmplY3RpZCArIGJsb2NrX2dyb3VwLT5rZXkub2Zmc2V0OwogCQlidHJmc19wdXRfYmxvY2tfZ3JvdXAoYmxvY2tfZ3JvdXApOwpAQCAtOTk5OSw2ICs5OTg2LDEwIEBACiAJCQlmcmVlX2V4Y2x1ZGVkX2V4dGVudHMoaW5mby0+ZXh0ZW50X3Jvb3QsIGJsb2NrX2dyb3VwKTsKIAogCQlidHJmc19yZW1vdmVfZnJlZV9zcGFjZV9jYWNoZShibG9ja19ncm91cCk7CisJCUFTU0VSVChsaXN0X2VtcHR5KCZibG9ja19ncm91cC0+ZGlydHlfbGlzdCkpOworCQlBU1NFUlQobGlzdF9lbXB0eSgmYmxvY2tfZ3JvdXAtPmlvX2xpc3QpKTsKKwkJQVNTRVJUKGxpc3RfZW1wdHkoJmJsb2NrX2dyb3VwLT5iZ19saXN0KSk7CisJCUFTU0VSVChhdG9taWNfcmVhZCgmYmxvY2tfZ3JvdXAtPmNvdW50KSA9PSAxKTsKIAkJYnRyZnNfcHV0X2Jsb2NrX2dyb3VwKGJsb2NrX2dyb3VwKTsKIAogCQlzcGluX2xvY2soJmluZm8tPmJsb2NrX2dyb3VwX2NhY2hlX2xvY2spOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZXh0ZW50X2lvLmggYi9mcy9idHJmcy9leHRlbnRfaW8uaAppbmRleCBiYzI3MjlhLi4yOGNkODhmIDEwMDY0NAotLS0gYS9mcy9idHJmcy9leHRlbnRfaW8uaAorKysgYi9mcy9idHJmcy9leHRlbnRfaW8uaApAQCAtMjAsNiArMjAsNyBAQAogI2RlZmluZSBFWFRFTlRfREFNQUdFRAkJKDFVIDw8IDE0KQogI2RlZmluZSBFWFRFTlRfTk9SRVNFUlZFCSgxVSA8PCAxNSkKICNkZWZpbmUgRVhURU5UX1FHUk9VUF9SRVNFUlZFRAkoMVUgPDwgMTYpCisjZGVmaW5lIEVYVEVOVF9DTEVBUl9EQVRBX1JFU1YJKDFVIDw8IDE3KQogI2RlZmluZSBFWFRFTlRfSU9CSVRTCQkoRVhURU5UX0xPQ0tFRCB8IEVYVEVOVF9XUklURUJBQ0spCiAjZGVmaW5lIEVYVEVOVF9DVExCSVRTCQkoRVhURU5UX0RPX0FDQ09VTlRJTkcgfCBFWFRFTlRfRklSU1RfREVMQUxMT0MpCiAKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2ZpbGUuYyBiL2ZzL2J0cmZzL2ZpbGUuYwppbmRleCA1ODQyNDIzLi5mZWEzMWE0IDEwMDY0NAotLS0gYS9mcy9idHJmcy9maWxlLmMKKysrIGIvZnMvYnRyZnMvZmlsZS5jCkBAIC0yMDcwLDcgKzIwNzAsNyBAQAogCX0KIAl0cmFucy0+c3luYyA9IHRydWU7CiAKLQlidHJmc19pbml0X2xvZ19jdHgoJmN0eCk7CisJYnRyZnNfaW5pdF9sb2dfY3R4KCZjdHgsIGlub2RlKTsKIAogCXJldCA9IGJ0cmZzX2xvZ19kZW50cnlfc2FmZSh0cmFucywgcm9vdCwgZGVudHJ5LCBzdGFydCwgZW5kLCAmY3R4KTsKIAlpZiAocmV0IDwgMCkgewpAQCAtMjY3NSw2ICsyNjc1LDcgQEAKIAogCWFsbG9jX3N0YXJ0ID0gcm91bmRfZG93bihvZmZzZXQsIGJsb2Nrc2l6ZSk7CiAJYWxsb2NfZW5kID0gcm91bmRfdXAob2Zmc2V0ICsgbGVuLCBibG9ja3NpemUpOworCWN1cl9vZmZzZXQgPSBhbGxvY19zdGFydDsKIAogCS8qIE1ha2Ugc3VyZSB3ZSBhcmVuJ3QgYmVpbmcgZ2l2ZSBzb21lIGNyYXAgbW9kZSAqLwogCWlmIChtb2RlICYgfihGQUxMT0NfRkxfS0VFUF9TSVpFIHwgRkFMTE9DX0ZMX1BVTkNIX0hPTEUpKQpAQCAtMjc2Nyw3ICsyNzY4LDYgQEAKIAogCS8qIEZpcnN0LCBjaGVjayBpZiB3ZSBleGNlZWQgdGhlIHFncm91cCBsaW1pdCAqLwogCUlOSVRfTElTVF9IRUFEKCZyZXNlcnZlX2xpc3QpOwotCWN1cl9vZmZzZXQgPSBhbGxvY19zdGFydDsKIAl3aGlsZSAoMSkgewogCQllbSA9IGJ0cmZzX2dldF9leHRlbnQoaW5vZGUsIE5VTEwsIDAsIGN1cl9vZmZzZXQsCiAJCQkJICAgICAgYWxsb2NfZW5kIC0gY3VyX29mZnNldCwgMCk7CkBAIC0yNzk0LDYgKzI3OTQsMTQgQEAKIAkJCQkJbGFzdF9ieXRlIC0gY3VyX29mZnNldCk7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBEbyBub3QgbmVlZCB0byByZXNlcnZlIHVud3JpdHRlbiBleHRlbnQgZm9yIHRoaXMKKwkJCSAqIHJhbmdlLCBmcmVlIHJlc2VydmVkIGRhdGEgc3BhY2UgZmlyc3QsIG90aGVyd2lzZQorCQkJICogaXQnbGwgcmVzdWx0IGluIGZhbHNlIEVOT1NQQyBlcnJvci4KKwkJCSAqLworCQkJYnRyZnNfZnJlZV9yZXNlcnZlZF9kYXRhX3NwYWNlKGlub2RlLCBjdXJfb2Zmc2V0LAorCQkJCWxhc3RfYnl0ZSAtIGN1cl9vZmZzZXQpOwogCQl9CiAJCWZyZWVfZXh0ZW50X21hcChlbSk7CiAJCWN1cl9vZmZzZXQgPSBsYXN0X2J5dGU7CkBAIC0yODExLDYgKzI4MTksOSBAQAogCQkJCQlyYW5nZS0+c3RhcnQsCiAJCQkJCXJhbmdlLT5sZW4sIDEgPDwgaW5vZGUtPmlfYmxrYml0cywKIAkJCQkJb2Zmc2V0ICsgbGVuLCAmYWxsb2NfaGludCk7CisJCWVsc2UKKwkJCWJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZGF0YV9zcGFjZShpbm9kZSwgcmFuZ2UtPnN0YXJ0LAorCQkJCQkJICAgICAgIHJhbmdlLT5sZW4pOwogCQlsaXN0X2RlbCgmcmFuZ2UtPmxpc3QpOwogCQlrZnJlZShyYW5nZSk7CiAJfQpAQCAtMjg0NSwxOCArMjg1NiwxMSBAQAogCXVubG9ja19leHRlbnRfY2FjaGVkKCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgYWxsb2Nfc3RhcnQsIGxvY2tlZF9lbmQsCiAJCQkgICAgICZjYWNoZWRfc3RhdGUsIEdGUF9LRVJORUwpOwogb3V0OgotCS8qCi0JICogQXMgd2Ugd2FpdGVkIHRoZSBleHRlbnQgcmFuZ2UsIHRoZSBkYXRhX3Jzdl9tYXAgbXVzdCBiZSBlbXB0eQotCSAqIGluIHRoZSByYW5nZSwgYXMgd3JpdHRlbiBkYXRhIHJhbmdlIHdpbGwgYmUgcmVsZWFzZWQgZnJvbSBpdC4KLQkgKiBBbmQgZm9yIHByZWFsbG9hY3RlZCBleHRlbnQsIGl0IHdpbGwgYWxzbyBiZSByZWxlYXNlZCB3aGVuCi0JICogaXRzIG1ldGFkYXRhIGlzIHdyaXR0ZW4uCi0JICogU28gdGhpcyBpcyBjb21wbGV0ZWx5IHVzZWQgYXMgY2xlYW51cC4KLQkgKi8KLQlidHJmc19xZ3JvdXBfZnJlZV9kYXRhKGlub2RlLCBhbGxvY19zdGFydCwgYWxsb2NfZW5kIC0gYWxsb2Nfc3RhcnQpOwogCWlub2RlX3VubG9jayhpbm9kZSk7CiAJLyogTGV0IGdvIG9mIG91ciByZXNlcnZhdGlvbi4gKi8KLQlidHJmc19mcmVlX3Jlc2VydmVkX2RhdGFfc3BhY2UoaW5vZGUsIGFsbG9jX3N0YXJ0LAotCQkJCSAgICAgICBhbGxvY19lbmQgLSBhbGxvY19zdGFydCk7CisJaWYgKHJldCAhPSAwKQorCQlidHJmc19mcmVlX3Jlc2VydmVkX2RhdGFfc3BhY2UoaW5vZGUsIGFsbG9jX3N0YXJ0LAorCQkJCSAgICAgICBhbGxvY19lbmQgLSBjdXJfb2Zmc2V0KTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9mcy9idHJmcy9pbm9kZS1tYXAuYyBiL2ZzL2J0cmZzL2lub2RlLW1hcC5jCmluZGV4IGFhNmZhYmEuLjM1OWVlODYgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2lub2RlLW1hcC5jCisrKyBiL2ZzL2J0cmZzL2lub2RlLW1hcC5jCkBAIC00OTUsMTAgKzQ5NSw5IEBACiAJcmV0ID0gYnRyZnNfcHJlYWxsb2NfZmlsZV9yYW5nZV90cmFucyhpbm9kZSwgdHJhbnMsIDAsIDAsIHByZWFsbG9jLAogCQkJCQkgICAgICBwcmVhbGxvYywgcHJlYWxsb2MsICZhbGxvY19oaW50KTsKIAlpZiAocmV0KSB7Ci0JCWJ0cmZzX2RlbGFsbG9jX3JlbGVhc2Vfc3BhY2UoaW5vZGUsIDAsIHByZWFsbG9jKTsKKwkJYnRyZnNfZGVsYWxsb2NfcmVsZWFzZV9tZXRhZGF0YShpbm9kZSwgcHJlYWxsb2MpOwogCQlnb3RvIG91dF9wdXQ7CiAJfQotCWJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZGF0YV9zcGFjZShpbm9kZSwgMCwgcHJlYWxsb2MpOwogCiAJcmV0ID0gYnRyZnNfd3JpdGVfb3V0X2lub19jYWNoZShyb290LCB0cmFucywgcGF0aCwgaW5vZGUpOwogb3V0X3B1dDoKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2lub2RlLmMgYi9mcy9idHJmcy9pbm9kZS5jCmluZGV4IDA4ZGZjNTcuLmU2ODExYzQyIDEwMDY0NAotLS0gYS9mcy9idHJmcy9pbm9kZS5jCisrKyBiL2ZzL2J0cmZzL2lub2RlLmMKQEAgLTU2Niw2ICs1NjYsOCBAQAogCQkJCQkJICAgICBQQUdFX1NFVF9XUklURUJBQ0sgfAogCQkJCQkJICAgICBwYWdlX2Vycm9yX29wIHwKIAkJCQkJCSAgICAgUEFHRV9FTkRfV1JJVEVCQUNLKTsKKwkJCWJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZGF0YV9zcGFjZV9ub3F1b3RhKGlub2RlLCBzdGFydCwKKwkJCQkJCWVuZCAtIHN0YXJ0ICsgMSk7CiAJCQlnb3RvIGZyZWVfcGFnZXNfb3V0OwogCQl9CiAJfQpAQCAtNzQyLDcgKzc0NCw3IEBACiAJCWxvY2tfZXh0ZW50KGlvX3RyZWUsIGFzeW5jX2V4dGVudC0+c3RhcnQsCiAJCQkgICAgYXN5bmNfZXh0ZW50LT5zdGFydCArIGFzeW5jX2V4dGVudC0+cmFtX3NpemUgLSAxKTsKIAotCQlyZXQgPSBidHJmc19yZXNlcnZlX2V4dGVudChyb290LAorCQlyZXQgPSBidHJmc19yZXNlcnZlX2V4dGVudChyb290LCBhc3luY19leHRlbnQtPnJhbV9zaXplLAogCQkJCQkgICBhc3luY19leHRlbnQtPmNvbXByZXNzZWRfc2l6ZSwKIAkJCQkJICAgYXN5bmNfZXh0ZW50LT5jb21wcmVzc2VkX3NpemUsCiAJCQkJCSAgIDAsIGFsbG9jX2hpbnQsICZpbnMsIDEsIDEpOwpAQCAtOTY5LDcgKzk3MSw4IEBACiAJCQkJICAgICBFWFRFTlRfREVGUkFHLCBQQUdFX1VOTE9DSyB8CiAJCQkJICAgICBQQUdFX0NMRUFSX0RJUlRZIHwgUEFHRV9TRVRfV1JJVEVCQUNLIHwKIAkJCQkgICAgIFBBR0VfRU5EX1dSSVRFQkFDSyk7Ci0KKwkJCWJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZGF0YV9zcGFjZV9ub3F1b3RhKGlub2RlLCBzdGFydCwKKwkJCQkJCWVuZCAtIHN0YXJ0ICsgMSk7CiAJCQkqbnJfd3JpdHRlbiA9ICpucl93cml0dGVuICsKIAkJCSAgICAgKGVuZCAtIHN0YXJ0ICsgUEFHRV9TSVpFKSAvIFBBR0VfU0laRTsKIAkJCSpwYWdlX3N0YXJ0ZWQgPSAxOwpAQCAtOTg5LDcgKzk5Miw3IEBACiAJCXVuc2lnbmVkIGxvbmcgb3A7CiAKIAkJY3VyX2FsbG9jX3NpemUgPSBkaXNrX251bV9ieXRlczsKLQkJcmV0ID0gYnRyZnNfcmVzZXJ2ZV9leHRlbnQocm9vdCwgY3VyX2FsbG9jX3NpemUsCisJCXJldCA9IGJ0cmZzX3Jlc2VydmVfZXh0ZW50KHJvb3QsIGN1cl9hbGxvY19zaXplLCBjdXJfYWxsb2Nfc2l6ZSwKIAkJCQkJICAgcm9vdC0+c2VjdG9yc2l6ZSwgMCwgYWxsb2NfaGludCwKIAkJCQkJICAgJmlucywgMSwgMSk7CiAJCWlmIChyZXQgPCAwKQpAQCAtMTQ4OSw4ICsxNDkyLDEwIEBACiAJCWV4dGVudF9jbGVhcl91bmxvY2tfZGVsYWxsb2MoaW5vZGUsIGN1cl9vZmZzZXQsCiAJCQkJCSAgICAgY3VyX29mZnNldCArIG51bV9ieXRlcyAtIDEsCiAJCQkJCSAgICAgbG9ja2VkX3BhZ2UsIEVYVEVOVF9MT0NLRUQgfAotCQkJCQkgICAgIEVYVEVOVF9ERUxBTExPQywgUEFHRV9VTkxPQ0sgfAotCQkJCQkgICAgIFBBR0VfU0VUX1BSSVZBVEUyKTsKKwkJCQkJICAgICBFWFRFTlRfREVMQUxMT0MgfAorCQkJCQkgICAgIEVYVEVOVF9DTEVBUl9EQVRBX1JFU1YsCisJCQkJCSAgICAgUEFHRV9VTkxPQ0sgfCBQQUdFX1NFVF9QUklWQVRFMik7CisKIAkJaWYgKCFub2xvY2sgJiYgbm9jb3cpCiAJCQlidHJmc19lbmRfd3JpdGVfbm9fc25hcHNob3Rpbmcocm9vdCk7CiAJCWN1cl9vZmZzZXQgPSBleHRlbnRfZW5kOwpAQCAtMTgwNyw3ICsxODEyLDkgQEAKIAkJCXJldHVybjsKIAogCQlpZiAocm9vdC0+cm9vdF9rZXkub2JqZWN0aWQgIT0gQlRSRlNfREFUQV9SRUxPQ19UUkVFX09CSkVDVElECi0JCSAgICAmJiBkb19saXN0ICYmICEoc3RhdGUtPnN0YXRlICYgRVhURU5UX05PUkVTRVJWRSkpCisJCSAgICAmJiBkb19saXN0ICYmICEoc3RhdGUtPnN0YXRlICYgRVhURU5UX05PUkVTRVJWRSkKKwkJICAgICYmICgqYml0cyAmIChFWFRFTlRfRE9fQUNDT1VOVElORyB8CisJCSAgICBFWFRFTlRfQ0xFQVJfREFUQV9SRVNWKSkpCiAJCQlidHJmc19mcmVlX3Jlc2VydmVkX2RhdGFfc3BhY2Vfbm9xdW90YShpbm9kZSwKIAkJCQkJc3RhdGUtPnN0YXJ0LCBsZW4pOwogCkBAIC03MjUxLDcgKzcyNTgsNyBAQAogCWludCByZXQ7CiAKIAlhbGxvY19oaW50ID0gZ2V0X2V4dGVudF9hbGxvY2F0aW9uX2hpbnQoaW5vZGUsIHN0YXJ0LCBsZW4pOwotCXJldCA9IGJ0cmZzX3Jlc2VydmVfZXh0ZW50KHJvb3QsIGxlbiwgcm9vdC0+c2VjdG9yc2l6ZSwgMCwKKwlyZXQgPSBidHJmc19yZXNlcnZlX2V4dGVudChyb290LCBsZW4sIGxlbiwgcm9vdC0+c2VjdG9yc2l6ZSwgMCwKIAkJCQkgICBhbGxvY19oaW50LCAmaW5zLCAxLCAxKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gRVJSX1BUUihyZXQpOwpAQCAtNzc1MSw2ICs3NzU4LDEzIEBACiAJCQkJcmV0ID0gUFRSX0VSUihlbTIpOwogCQkJCWdvdG8gdW5sb2NrX2VycjsKIAkJCX0KKwkJCS8qCisJCQkgKiBGb3IgaW5vZGUgbWFya2VkIE5PREFUQUNPVyBvciBleHRlbnQgbWFya2VkIFBSRUFMTE9DLAorCQkJICogdXNlIHRoZSBleGlzdGluZyBvciBwcmVhbGxvY2F0ZWQgZXh0ZW50LCBzbyBkb2VzIG5vdAorCQkJICogbmVlZCB0byBhZGp1c3QgYnRyZnNfc3BhY2VfaW5mbydzIGJ5dGVzX21heV91c2UuCisJCQkgKi8KKwkJCWJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZGF0YV9zcGFjZV9ub3F1b3RhKGlub2RlLAorCQkJCQlzdGFydCwgbGVuKTsKIAkJCWdvdG8gdW5sb2NrOwogCQl9CiAJfQpAQCAtNzc4NSw3ICs3Nzk5LDYgQEAKIAkJCWlfc2l6ZV93cml0ZShpbm9kZSwgc3RhcnQgKyBsZW4pOwogCiAJCWFkanVzdF9kaW9fb3V0c3RhbmRpbmdfZXh0ZW50cyhpbm9kZSwgZGlvX2RhdGEsIGxlbik7Ci0JCWJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZGF0YV9zcGFjZShpbm9kZSwgc3RhcnQsIGxlbik7CiAJCVdBUk5fT04oZGlvX2RhdGEtPnJlc2VydmUgPCBsZW4pOwogCQlkaW9fZGF0YS0+cmVzZXJ2ZSAtPSBsZW47CiAJCWRpb19kYXRhLT51bnN1Ym1pdHRlZF9vZV9yYW5nZV9lbmQgPSBzdGFydCArIGxlbjsKQEAgLTEwMzA2LDYgKzEwMzE5LDcgQEAKIAl1NjQgbGFzdF9hbGxvYyA9ICh1NjQpLTE7CiAJaW50IHJldCA9IDA7CiAJYm9vbCBvd25fdHJhbnMgPSB0cnVlOworCXU2NCBlbmQgPSBzdGFydCArIG51bV9ieXRlcyAtIDE7CiAKIAlpZiAodHJhbnMpCiAJCW93bl90cmFucyA9IGZhbHNlOwpAQCAtMTAzMjcsOCArMTAzNDEsOCBAQAogCQkgKiBzaXplZCBjaHVua3MuCiAJCSAqLwogCQljdXJfYnl0ZXMgPSBtaW4oY3VyX2J5dGVzLCBsYXN0X2FsbG9jKTsKLQkJcmV0ID0gYnRyZnNfcmVzZXJ2ZV9leHRlbnQocm9vdCwgY3VyX2J5dGVzLCBtaW5fc2l6ZSwgMCwKLQkJCQkJICAgKmFsbG9jX2hpbnQsICZpbnMsIDEsIDApOworCQlyZXQgPSBidHJmc19yZXNlcnZlX2V4dGVudChyb290LCBjdXJfYnl0ZXMsIGN1cl9ieXRlcywKKwkJCQltaW5fc2l6ZSwgMCwgKmFsbG9jX2hpbnQsICZpbnMsIDEsIDApOwogCQlpZiAocmV0KSB7CiAJCQlpZiAob3duX3RyYW5zKQogCQkJCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CkBAIC0xMDQxNCw2ICsxMDQyOCw5IEBACiAJCWlmIChvd25fdHJhbnMpCiAJCQlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOwogCX0KKwlpZiAoY3VyX29mZnNldCA8IGVuZCkKKwkJYnRyZnNfZnJlZV9yZXNlcnZlZF9kYXRhX3NwYWNlKGlub2RlLCBjdXJfb2Zmc2V0LAorCQkJZW5kIC0gY3VyX29mZnNldCArIDEpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2lvY3RsLmMgYi9mcy9idHJmcy9pb2N0bC5jCmluZGV4IDE0ZWQxZTkuLjdmZDkzOWIgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2lvY3RsLmMKKysrIGIvZnMvYnRyZnMvaW9jdGwuYwpAQCAtMTYzNCw2ICsxNjM0LDkgQEAKIAlpbnQgbmFtZWxlbjsKIAlpbnQgcmV0ID0gMDsKIAorCWlmICghU19JU0RJUihmaWxlX2lub2RlKGZpbGUpLT5pX21vZGUpKQorCQlyZXR1cm4gLUVOT1RESVI7CisKIAlyZXQgPSBtbnRfd2FudF93cml0ZV9maWxlKGZpbGUpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwpAQCAtMTY5MSw2ICsxNjk0LDkgQEAKIAlzdHJ1Y3QgYnRyZnNfaW9jdGxfdm9sX2FyZ3MgKnZvbF9hcmdzOwogCWludCByZXQ7CiAKKwlpZiAoIVNfSVNESVIoZmlsZV9pbm9kZShmaWxlKS0+aV9tb2RlKSkKKwkJcmV0dXJuIC1FTk9URElSOworCiAJdm9sX2FyZ3MgPSBtZW1kdXBfdXNlcihhcmcsIHNpemVvZigqdm9sX2FyZ3MpKTsKIAlpZiAoSVNfRVJSKHZvbF9hcmdzKSkKIAkJcmV0dXJuIFBUUl9FUlIodm9sX2FyZ3MpOwpAQCAtMTcxNCw2ICsxNzIwLDkgQEAKIAlib29sIHJlYWRvbmx5ID0gZmFsc2U7CiAJc3RydWN0IGJ0cmZzX3Fncm91cF9pbmhlcml0ICppbmhlcml0ID0gTlVMTDsKIAorCWlmICghU19JU0RJUihmaWxlX2lub2RlKGZpbGUpLT5pX21vZGUpKQorCQlyZXR1cm4gLUVOT1RESVI7CisKIAl2b2xfYXJncyA9IG1lbWR1cF91c2VyKGFyZywgc2l6ZW9mKCp2b2xfYXJncykpOwogCWlmIChJU19FUlIodm9sX2FyZ3MpKQogCQlyZXR1cm4gUFRSX0VSUih2b2xfYXJncyk7CkBAIC0yMzU3LDYgKzIzNjYsOSBAQAogCWludCByZXQ7CiAJaW50IGVyciA9IDA7CiAKKwlpZiAoIVNfSVNESVIoZGlyLT5pX21vZGUpKQorCQlyZXR1cm4gLUVOT1RESVI7CisKIAl2b2xfYXJncyA9IG1lbWR1cF91c2VyKGFyZywgc2l6ZW9mKCp2b2xfYXJncykpOwogCWlmIChJU19FUlIodm9sX2FyZ3MpKQogCQlyZXR1cm4gUFRSX0VSUih2b2xfYXJncyk7CkBAIC01MDg0LDcgKzUwOTYsNyBAQAogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCXJldHVybiBidHJmc19xZ3JvdXBfd2FpdF9mb3JfY29tcGxldGlvbihyb290LT5mc19pbmZvKTsKKwlyZXR1cm4gYnRyZnNfcWdyb3VwX3dhaXRfZm9yX2NvbXBsZXRpb24ocm9vdC0+ZnNfaW5mbywgdHJ1ZSk7CiB9CiAKIHN0YXRpYyBsb25nIF9idHJmc19pb2N0bF9zZXRfcmVjZWl2ZWRfc3Vidm9sKHN0cnVjdCBmaWxlICpmaWxlLApkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvcWdyb3VwLmMgYi9mcy9idHJmcy9xZ3JvdXAuYwppbmRleCA5M2VlMWMxLi44ZGIyZTI5IDEwMDY0NAotLS0gYS9mcy9idHJmcy9xZ3JvdXAuYworKysgYi9mcy9idHJmcy9xZ3JvdXAuYwpAQCAtOTk1LDcgKzk5NSw3IEBACiAJCWdvdG8gb3V0OwogCWZzX2luZm8tPnF1b3RhX2VuYWJsZWQgPSAwOwogCWZzX2luZm8tPnBlbmRpbmdfcXVvdGFfc3RhdGUgPSAwOwotCWJ0cmZzX3Fncm91cF93YWl0X2Zvcl9jb21wbGV0aW9uKGZzX2luZm8pOworCWJ0cmZzX3Fncm91cF93YWl0X2Zvcl9jb21wbGV0aW9uKGZzX2luZm8sIGZhbHNlKTsKIAlzcGluX2xvY2soJmZzX2luZm8tPnFncm91cF9sb2NrKTsKIAlxdW90YV9yb290ID0gZnNfaW5mby0+cXVvdGFfcm9vdDsKIAlmc19pbmZvLT5xdW90YV9yb290ID0gTlVMTDsKQEAgLTE0NTMsMTAgKzE0NTMsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0cnVjdCBidHJmc19xZ3JvdXBfZXh0ZW50X3JlY29yZCAqCi1idHJmc19xZ3JvdXBfaW5zZXJ0X2RpcnR5X2V4dGVudChzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywKLQkJCQkgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX3Jvb3QgKmRlbGF5ZWRfcmVmcywKLQkJCQkgc3RydWN0IGJ0cmZzX3Fncm91cF9leHRlbnRfcmVjb3JkICpyZWNvcmQpCitpbnQgYnRyZnNfcWdyb3VwX2luc2VydF9kaXJ0eV9leHRlbnRfbm9sb2NrKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLAorCQkJCXN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9yb290ICpkZWxheWVkX3JlZnMsCisJCQkJc3RydWN0IGJ0cmZzX3Fncm91cF9leHRlbnRfcmVjb3JkICpyZWNvcmQpCiB7CiAJc3RydWN0IHJiX25vZGUgKipwID0gJmRlbGF5ZWRfcmVmcy0+ZGlydHlfZXh0ZW50X3Jvb3QucmJfbm9kZTsKIAlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50X25vZGUgPSBOVUxMOwpAQCAtMTQ3NSwxMiArMTQ3NCw0MiBAQAogCQllbHNlIGlmIChieXRlbnIgPiBlbnRyeS0+Ynl0ZW5yKQogCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKIAkJZWxzZQotCQkJcmV0dXJuIGVudHJ5OworCQkJcmV0dXJuIDE7CiAJfQogCiAJcmJfbGlua19ub2RlKCZyZWNvcmQtPm5vZGUsIHBhcmVudF9ub2RlLCBwKTsKIAlyYl9pbnNlcnRfY29sb3IoJnJlY29yZC0+bm9kZSwgJmRlbGF5ZWRfcmVmcy0+ZGlydHlfZXh0ZW50X3Jvb3QpOwotCXJldHVybiBOVUxMOworCXJldHVybiAwOworfQorCitpbnQgYnRyZnNfcWdyb3VwX2luc2VydF9kaXJ0eV9leHRlbnQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLCB1NjQgYnl0ZW5yLCB1NjQgbnVtX2J5dGVzLAorCQlnZnBfdCBnZnBfZmxhZykKK3sKKwlzdHJ1Y3QgYnRyZnNfcWdyb3VwX2V4dGVudF9yZWNvcmQgKnJlY29yZDsKKwlzdHJ1Y3QgYnRyZnNfZGVsYXllZF9yZWZfcm9vdCAqZGVsYXllZF9yZWZzOworCWludCByZXQ7CisKKwlpZiAoIWZzX2luZm8tPnF1b3RhX2VuYWJsZWQgfHwgYnl0ZW5yID09IDAgfHwgbnVtX2J5dGVzID09IDApCisJCXJldHVybiAwOworCWlmIChXQVJOX09OKHRyYW5zID09IE5VTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZWNvcmQgPSBrbWFsbG9jKHNpemVvZigqcmVjb3JkKSwgZ2ZwX2ZsYWcpOworCWlmICghcmVjb3JkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRlbGF5ZWRfcmVmcyA9ICZ0cmFucy0+dHJhbnNhY3Rpb24tPmRlbGF5ZWRfcmVmczsKKwlyZWNvcmQtPmJ5dGVuciA9IGJ5dGVucjsKKwlyZWNvcmQtPm51bV9ieXRlcyA9IG51bV9ieXRlczsKKwlyZWNvcmQtPm9sZF9yb290cyA9IE5VTEw7CisKKwlzcGluX2xvY2soJmRlbGF5ZWRfcmVmcy0+bG9jayk7CisJcmV0ID0gYnRyZnNfcWdyb3VwX2luc2VydF9kaXJ0eV9leHRlbnRfbm9sb2NrKGZzX2luZm8sIGRlbGF5ZWRfcmVmcywKKwkJCQkJCSAgICAgIHJlY29yZCk7CisJc3Bpbl91bmxvY2soJmRlbGF5ZWRfcmVmcy0+bG9jayk7CisJaWYgKHJldCA+IDApCisJCWtmcmVlKHJlY29yZCk7CisJcmV0dXJuIDA7CiB9CiAKICNkZWZpbmUgVVBEQVRFX05FVwkwCkBAIC0yMzAzLDYgKzIzMzIsMTAgQEAKIAlpbnQgZXJyID0gLUVOT01FTTsKIAlpbnQgcmV0ID0gMDsKIAorCW11dGV4X2xvY2soJmZzX2luZm8tPnFncm91cF9yZXNjYW5fbG9jayk7CisJZnNfaW5mby0+cWdyb3VwX3Jlc2Nhbl9ydW5uaW5nID0gdHJ1ZTsKKwltdXRleF91bmxvY2soJmZzX2luZm8tPnFncm91cF9yZXNjYW5fbG9jayk7CisKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwogCWlmICghcGF0aCkKIAkJZ290byBvdXQ7CkBAIC0yMzY5LDYgKzI0MDIsOSBAQAogCX0KIAogZG9uZToKKwltdXRleF9sb2NrKCZmc19pbmZvLT5xZ3JvdXBfcmVzY2FuX2xvY2spOworCWZzX2luZm8tPnFncm91cF9yZXNjYW5fcnVubmluZyA9IGZhbHNlOworCW11dGV4X3VubG9jaygmZnNfaW5mby0+cWdyb3VwX3Jlc2Nhbl9sb2NrKTsKIAljb21wbGV0ZV9hbGwoJmZzX2luZm8tPnFncm91cF9yZXNjYW5fY29tcGxldGlvbik7CiB9CiAKQEAgLTI0ODcsMjAgKzI1MjMsMjYgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGJ0cmZzX3Fncm91cF93YWl0X2Zvcl9jb21wbGV0aW9uKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvKQoraW50IGJ0cmZzX3Fncm91cF93YWl0X2Zvcl9jb21wbGV0aW9uKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvLAorCQkJCSAgICAgYm9vbCBpbnRlcnJ1cHRpYmxlKQogewogCWludCBydW5uaW5nOwogCWludCByZXQgPSAwOwogCiAJbXV0ZXhfbG9jaygmZnNfaW5mby0+cWdyb3VwX3Jlc2Nhbl9sb2NrKTsKIAlzcGluX2xvY2soJmZzX2luZm8tPnFncm91cF9sb2NrKTsKLQlydW5uaW5nID0gZnNfaW5mby0+cWdyb3VwX2ZsYWdzICYgQlRSRlNfUUdST1VQX1NUQVRVU19GTEFHX1JFU0NBTjsKKwlydW5uaW5nID0gZnNfaW5mby0+cWdyb3VwX3Jlc2Nhbl9ydW5uaW5nOwogCXNwaW5fdW5sb2NrKCZmc19pbmZvLT5xZ3JvdXBfbG9jayk7CiAJbXV0ZXhfdW5sb2NrKCZmc19pbmZvLT5xZ3JvdXBfcmVzY2FuX2xvY2spOwogCi0JaWYgKHJ1bm5pbmcpCisJaWYgKCFydW5uaW5nKQorCQlyZXR1cm4gMDsKKworCWlmIChpbnRlcnJ1cHRpYmxlKQogCQlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoCiAJCQkJCSZmc19pbmZvLT5xZ3JvdXBfcmVzY2FuX2NvbXBsZXRpb24pOworCWVsc2UKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmZnNfaW5mby0+cWdyb3VwX3Jlc2Nhbl9jb21wbGV0aW9uKTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9mcy9idHJmcy9xZ3JvdXAuaCBiL2ZzL2J0cmZzL3Fncm91cC5oCmluZGV4IDcxMDg4N2MuLjFiYzY0YzggMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3Fncm91cC5oCisrKyBiL2ZzL2J0cmZzL3Fncm91cC5oCkBAIC00Niw3ICs0Niw4IEBACiAJCQlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyk7CiBpbnQgYnRyZnNfcWdyb3VwX3Jlc2NhbihzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyk7CiB2b2lkIGJ0cmZzX3Fncm91cF9yZXNjYW5fcmVzdW1lKHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvKTsKLWludCBidHJmc19xZ3JvdXBfd2FpdF9mb3JfY29tcGxldGlvbihzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyk7CitpbnQgYnRyZnNfcWdyb3VwX3dhaXRfZm9yX2NvbXBsZXRpb24oc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sCisJCQkJICAgICBib29sIGludGVycnVwdGlibGUpOwogaW50IGJ0cmZzX2FkZF9xZ3JvdXBfcmVsYXRpb24oc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkgICAgICBzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywgdTY0IHNyYywgdTY0IGRzdCk7CiBpbnQgYnRyZnNfZGVsX3Fncm91cF9yZWxhdGlvbihzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKQEAgLTYzLDEwICs2NCwzNSBAQAogc3RydWN0IGJ0cmZzX2RlbGF5ZWRfZXh0ZW50X29wOwogaW50IGJ0cmZzX3Fncm91cF9wcmVwYXJlX2FjY291bnRfZXh0ZW50cyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJCQkJIHN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvKTsKLXN0cnVjdCBidHJmc19xZ3JvdXBfZXh0ZW50X3JlY29yZCAqCi1idHJmc19xZ3JvdXBfaW5zZXJ0X2RpcnR5X2V4dGVudChzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbywKLQkJCQkgc3RydWN0IGJ0cmZzX2RlbGF5ZWRfcmVmX3Jvb3QgKmRlbGF5ZWRfcmVmcywKLQkJCQkgc3RydWN0IGJ0cmZzX3Fncm91cF9leHRlbnRfcmVjb3JkICpyZWNvcmQpOworLyoKKyAqIEluc2VydCBvbmUgZGlydHkgZXh0ZW50IHJlY29yZCBpbnRvIEBkZWxheWVkX3JlZnMsIGluZm9ybWluZyBxZ3JvdXAgdG8KKyAqIGFjY291bnQgdGhhdCBleHRlbnQgYXQgY29tbWl0IHRyYW5zIHRpbWUuCisgKgorICogTm8gbG9jayB2ZXJzaW9uLCBjYWxsZXIgbXVzdCBhY3F1aXJlIGRlbGF5ZWQgcmVmIGxvY2sgYW5kIGFsbG9jYXRlIG1lbW9yeS4KKyAqCisgKiBSZXR1cm4gMCBmb3Igc3VjY2VzcyBpbnNlcnQKKyAqIFJldHVybiA+MCBmb3IgZXhpc3RpbmcgcmVjb3JkLCBjYWxsZXIgY2FuIGZyZWUgQHJlY29yZCBzYWZlbHkuCisgKiBFcnJvciBpcyBub3QgcG9zc2libGUKKyAqLworaW50IGJ0cmZzX3Fncm91cF9pbnNlcnRfZGlydHlfZXh0ZW50X25vbG9jaygKKwkJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sCisJCXN0cnVjdCBidHJmc19kZWxheWVkX3JlZl9yb290ICpkZWxheWVkX3JlZnMsCisJCXN0cnVjdCBidHJmc19xZ3JvdXBfZXh0ZW50X3JlY29yZCAqcmVjb3JkKTsKKworLyoKKyAqIEluc2VydCBvbmUgZGlydHkgZXh0ZW50IHJlY29yZCBpbnRvIEBkZWxheWVkX3JlZnMsIGluZm9ybWluZyBxZ3JvdXAgdG8KKyAqIGFjY291bnQgdGhhdCBleHRlbnQgYXQgY29tbWl0IHRyYW5zIHRpbWUuCisgKgorICogQmV0dGVyIGVuY2Fwc3VsYXRlZCB2ZXJzaW9uLgorICoKKyAqIFJldHVybiAwIGlmIHRoZSBvcGVyYXRpb24gaXMgZG9uZS4KKyAqIFJldHVybiA8MCBmb3IgZXJyb3IsIGxpa2UgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSBvciBpbnZhbGlkIHBhcmFtZXRlcgorICogKE5VTEwgdHJhbnMpCisgKi8KK2ludCBidHJmc19xZ3JvdXBfaW5zZXJ0X2RpcnR5X2V4dGVudChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sIHU2NCBieXRlbnIsIHU2NCBudW1fYnl0ZXMsCisJCWdmcF90IGdmcF9mbGFnKTsKKwogaW50CiBidHJmc19xZ3JvdXBfYWNjb3VudF9leHRlbnQoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCQkgICAgc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8sCmRpZmYgLS1naXQgYS9mcy9idHJmcy9yZWxvY2F0aW9uLmMgYi9mcy9idHJmcy9yZWxvY2F0aW9uLmMKaW5kZXggYjI2YTVhZS4uYzBjMTNkYyAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvcmVsb2NhdGlvbi5jCisrKyBiL2ZzL2J0cmZzL3JlbG9jYXRpb24uYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgImFzeW5jLXRocmVhZC5oIgogI2luY2x1ZGUgImZyZWUtc3BhY2UtY2FjaGUuaCIKICNpbmNsdWRlICJpbm9kZS1tYXAuaCIKKyNpbmNsdWRlICJxZ3JvdXAuaCIKIAogLyoKICAqIGJhY2tyZWZfbm9kZSwgbWFwcGluZ19ub2RlIGFuZCB0cmVlX2Jsb2NrIHN0YXJ0IHdpdGggdGhpcwpAQCAtMzAzNywxNSArMzAzOCwxOSBAQAogCXU2NCBudW1fYnl0ZXM7CiAJaW50IG5yID0gMDsKIAlpbnQgcmV0ID0gMDsKKwl1NjQgcHJlYWxsb2Nfc3RhcnQgPSBjbHVzdGVyLT5zdGFydCAtIG9mZnNldDsKKwl1NjQgcHJlYWxsb2NfZW5kID0gY2x1c3Rlci0+ZW5kIC0gb2Zmc2V0OworCXU2NCBjdXJfb2Zmc2V0OwogCiAJQlVHX09OKGNsdXN0ZXItPnN0YXJ0ICE9IGNsdXN0ZXItPmJvdW5kYXJ5WzBdKTsKIAlpbm9kZV9sb2NrKGlub2RlKTsKIAotCXJldCA9IGJ0cmZzX2NoZWNrX2RhdGFfZnJlZV9zcGFjZShpbm9kZSwgY2x1c3Rlci0+c3RhcnQsCi0JCQkJCSAgY2x1c3Rlci0+ZW5kICsgMSAtIGNsdXN0ZXItPnN0YXJ0KTsKKwlyZXQgPSBidHJmc19jaGVja19kYXRhX2ZyZWVfc3BhY2UoaW5vZGUsIHByZWFsbG9jX3N0YXJ0LAorCQkJCQkgIHByZWFsbG9jX2VuZCArIDEgLSBwcmVhbGxvY19zdGFydCk7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKKwljdXJfb2Zmc2V0ID0gcHJlYWxsb2Nfc3RhcnQ7CiAJd2hpbGUgKG5yIDwgY2x1c3Rlci0+bnIpIHsKIAkJc3RhcnQgPSBjbHVzdGVyLT5ib3VuZGFyeVtucl0gLSBvZmZzZXQ7CiAJCWlmIChuciArIDEgPCBjbHVzdGVyLT5ucikKQEAgLTMwNTUsMTYgKzMwNjAsMjEgQEAKIAogCQlsb2NrX2V4dGVudCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIHN0YXJ0LCBlbmQpOwogCQludW1fYnl0ZXMgPSBlbmQgKyAxIC0gc3RhcnQ7CisJCWlmIChjdXJfb2Zmc2V0IDwgc3RhcnQpCisJCQlidHJmc19mcmVlX3Jlc2VydmVkX2RhdGFfc3BhY2UoaW5vZGUsIGN1cl9vZmZzZXQsCisJCQkJCXN0YXJ0IC0gY3VyX29mZnNldCk7CiAJCXJldCA9IGJ0cmZzX3ByZWFsbG9jX2ZpbGVfcmFuZ2UoaW5vZGUsIDAsIHN0YXJ0LAogCQkJCQkJbnVtX2J5dGVzLCBudW1fYnl0ZXMsCiAJCQkJCQllbmQgKyAxLCAmYWxsb2NfaGludCk7CisJCWN1cl9vZmZzZXQgPSBlbmQgKyAxOwogCQl1bmxvY2tfZXh0ZW50KCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgc3RhcnQsIGVuZCk7CiAJCWlmIChyZXQpCiAJCQlicmVhazsKIAkJbnIrKzsKIAl9Ci0JYnRyZnNfZnJlZV9yZXNlcnZlZF9kYXRhX3NwYWNlKGlub2RlLCBjbHVzdGVyLT5zdGFydCwKLQkJCQkgICAgICAgY2x1c3Rlci0+ZW5kICsgMSAtIGNsdXN0ZXItPnN0YXJ0KTsKKwlpZiAoY3VyX29mZnNldCA8IHByZWFsbG9jX2VuZCkKKwkJYnRyZnNfZnJlZV9yZXNlcnZlZF9kYXRhX3NwYWNlKGlub2RlLCBjdXJfb2Zmc2V0LAorCQkJCSAgICAgICBwcmVhbGxvY19lbmQgKyAxIC0gY3VyX29mZnNldCk7CiBvdXQ6CiAJaW5vZGVfdW5sb2NrKGlub2RlKTsKIAlyZXR1cm4gcmV0OwpAQCAtMzkxNiw2ICszOTI2LDkwIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBRZ3JvdXAgZml4ZXIgZm9yIGRhdGEgY2h1bmsgcmVsb2NhdGlvbi4KKyAqIFRoZSBkYXRhIHJlbG9jYXRpb24gaXMgZG9uZSBpbiB0aGUgZm9sbG93aW5nIHN0ZXBzCisgKiAxKSBDb3B5IGRhdGEgZXh0ZW50cyBpbnRvIGRhdGEgcmVsb2MgdHJlZQorICogMikgQ3JlYXRlIHRyZWUgcmVsb2MgdHJlZShzcGVjaWFsIHNuYXBzaG90KSBmb3IgcmVsYXRlZCBzdWJ2b2x1bWVzCisgKiAzKSBNb2RpZnkgZmlsZSBleHRlbnRzIGluIHRyZWUgcmVsb2MgdHJlZQorICogNCkgTWVyZ2UgdHJlZSByZWxvYyB0cmVlIHdpdGggb3JpZ2luYWwgZnMgdHJlZSwgYnkgc3dhcHBpbmcgdHJlZSBibG9ja3MKKyAqCisgKiBUaGUgcHJvYmxlbSBpcywgZGF0YSBhbmQgdHJlZSByZWxvYyB0cmVlIGFyZSBub3QgYWNjb3VudGVkIHRvIHFncm91cCwKKyAqIGFuZCA0KSB3aWxsIG9ubHkgaW5mbyBxZ3JvdXAgdG8gdHJhY2sgdHJlZSBibG9ja3MgY2hhbmdlLCBub3QgZmlsZSBleHRlbnRzCisgKiBpbiB0aGUgdHJlZSBibG9ja3MuCisgKgorICogVGhlIGdvb2QgbmV3cyBpcywgcmVsYXRlZCBkYXRhIGV4dGVudHMgYXJlIGFsbCBpbiBkYXRhIHJlbG9jIHRyZWUsIHNvIHdlCisgKiBvbmx5IG5lZWQgdG8gaW5mbyBxZ3JvdXAgdG8gdHJhY2sgYWxsIGZpbGUgZXh0ZW50cyBpbiBkYXRhIHJlbG9jIHRyZWUKKyAqIGJlZm9yZSBjb21taXQgdHJhbnMuCisgKi8KK3N0YXRpYyBpbnQgcWdyb3VwX2ZpeF9yZWxvY2F0ZWRfZGF0YV9leHRlbnRzKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCQkgICAgIHN0cnVjdCByZWxvY19jb250cm9sICpyYykKK3sKKwlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IHJjLT5leHRlbnRfcm9vdC0+ZnNfaW5mbzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcmMtPmRhdGFfaW5vZGU7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKmRhdGFfcmVsb2Nfcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCXN0cnVjdCBidHJmc19rZXkga2V5OworCWludCByZXQgPSAwOworCisJaWYgKCFmc19pbmZvLT5xdW90YV9lbmFibGVkKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogT25seSBmb3Igc3RhZ2Ugd2hlcmUgd2UgdXBkYXRlIGRhdGEgcG9pbnRlcnMgdGhlIHFncm91cCBmaXggaXMKKwkgKiB2YWxpZC4KKwkgKiBGb3IgTU9WSU5HX0RBVEEgc3RhZ2UsIHdlIHdpbGwgbWlzcyB0aGUgdGltaW5nIG9mIHN3YXBwaW5nIHRyZWUKKwkgKiBibG9ja3MsIGFuZCB3b24ndCBmaXggaXQuCisJICovCisJaWYgKCEocmMtPnN0YWdlID09IFVQREFURV9EQVRBX1BUUlMgJiYgcmMtPmV4dGVudHNfZm91bmQpKQorCQlyZXR1cm4gMDsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKKwlrZXkub2JqZWN0aWQgPSBidHJmc19pbm8oaW5vZGUpOworCWtleS50eXBlID0gQlRSRlNfRVhURU5UX0RBVEFfS0VZOworCWtleS5vZmZzZXQgPSAwOworCisJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QoTlVMTCwgZGF0YV9yZWxvY19yb290LCAma2V5LCBwYXRoLCAwLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlsb2NrX2V4dGVudCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIDAsICh1NjQpLTEpOworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtICpmaTsKKworCQlidHJmc19pdGVtX2tleV90b19jcHUocGF0aC0+bm9kZXNbMF0sICZrZXksIHBhdGgtPnNsb3RzWzBdKTsKKwkJaWYgKGtleS5vYmplY3RpZCA+IGJ0cmZzX2lubyhpbm9kZSkpCisJCQlicmVhazsKKwkJaWYgKGtleS50eXBlICE9IEJUUkZTX0VYVEVOVF9EQVRBX0tFWSkKKwkJCWdvdG8gbmV4dDsKKwkJZmkgPSBidHJmc19pdGVtX3B0cihwYXRoLT5ub2Rlc1swXSwgcGF0aC0+c2xvdHNbMF0sCisJCQkJICAgIHN0cnVjdCBidHJmc19maWxlX2V4dGVudF9pdGVtKTsKKwkJaWYgKGJ0cmZzX2ZpbGVfZXh0ZW50X3R5cGUocGF0aC0+bm9kZXNbMF0sIGZpKSAhPQorCQkJCUJUUkZTX0ZJTEVfRVhURU5UX1JFRykKKwkJCWdvdG8gbmV4dDsKKwkJcmV0ID0gYnRyZnNfcWdyb3VwX2luc2VydF9kaXJ0eV9leHRlbnQodHJhbnMsIGZzX2luZm8sCisJCQlidHJmc19maWxlX2V4dGVudF9kaXNrX2J5dGVucihwYXRoLT5ub2Rlc1swXSwgZmkpLAorCQkJYnRyZnNfZmlsZV9leHRlbnRfZGlza19udW1fYnl0ZXMocGF0aC0+bm9kZXNbMF0sIGZpKSwKKwkJCUdGUF9OT0ZTKTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKK25leHQ6CisJCXJldCA9IGJ0cmZzX25leHRfaXRlbShkYXRhX3JlbG9jX3Jvb3QsIHBhdGgpOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCQlpZiAocmV0ID4gMCkgeworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCXVubG9ja19leHRlbnQoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLCAwICwgKHU2NCktMSk7CitvdXQ6CisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgaW50IHJlbG9jYXRlX2Jsb2NrX2dyb3VwKHN0cnVjdCByZWxvY19jb250cm9sICpyYykKIHsKIAlzdHJ1Y3QgcmJfcm9vdCBibG9ja3MgPSBSQl9ST09UOwpAQCAtNDEwMiwxMCArNDE5NiwxOCBAQAogCiAJLyogZ2V0IHJpZCBvZiBwaW5uZWQgZXh0ZW50cyAqLwogCXRyYW5zID0gYnRyZnNfam9pbl90cmFuc2FjdGlvbihyYy0+ZXh0ZW50X3Jvb3QpOwotCWlmIChJU19FUlIodHJhbnMpKQorCWlmIChJU19FUlIodHJhbnMpKSB7CiAJCWVyciA9IFBUUl9FUlIodHJhbnMpOwotCWVsc2UKLQkJYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHRyYW5zLCByYy0+ZXh0ZW50X3Jvb3QpOworCQlnb3RvIG91dF9mcmVlOworCX0KKwlyZXQgPSBxZ3JvdXBfZml4X3JlbG9jYXRlZF9kYXRhX2V4dGVudHModHJhbnMsIHJjKTsKKwlpZiAocmV0IDwgMCkgeworCQlidHJmc19hYm9ydF90cmFuc2FjdGlvbih0cmFucywgcmV0KTsKKwkJaWYgKCFlcnIpCisJCQllcnIgPSByZXQ7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCWJ0cmZzX2NvbW1pdF90cmFuc2FjdGlvbih0cmFucywgcmMtPmV4dGVudF9yb290KTsKIG91dF9mcmVlOgogCWJ0cmZzX2ZyZWVfYmxvY2tfcnN2KHJjLT5leHRlbnRfcm9vdCwgcmMtPmJsb2NrX3Jzdik7CiAJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOwpAQCAtNDQ2OCwxMCArNDU3MCwxNiBAQAogCXVuc2V0X3JlbG9jX2NvbnRyb2wocmMpOwogCiAJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJjLT5leHRlbnRfcm9vdCk7Ci0JaWYgKElTX0VSUih0cmFucykpCisJaWYgKElTX0VSUih0cmFucykpIHsKIAkJZXJyID0gUFRSX0VSUih0cmFucyk7Ci0JZWxzZQotCQllcnIgPSBidHJmc19jb21taXRfdHJhbnNhY3Rpb24odHJhbnMsIHJjLT5leHRlbnRfcm9vdCk7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCWVyciA9IHFncm91cF9maXhfcmVsb2NhdGVkX2RhdGFfZXh0ZW50cyh0cmFucywgcmMpOworCWlmIChlcnIgPCAwKSB7CisJCWJ0cmZzX2Fib3J0X3RyYW5zYWN0aW9uKHRyYW5zLCBlcnIpOworCQlnb3RvIG91dF9mcmVlOworCX0KKwllcnIgPSBidHJmc19jb21taXRfdHJhbnNhY3Rpb24odHJhbnMsIHJjLT5leHRlbnRfcm9vdCk7CiBvdXRfZnJlZToKIAlrZnJlZShyYyk7CiBvdXQ6CmRpZmYgLS1naXQgYS9mcy9idHJmcy9yb290LXRyZWUuYyBiL2ZzL2J0cmZzL3Jvb3QtdHJlZS5jCmluZGV4IDdmZDdlMTguLjA5MTI5NjAgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3Jvb3QtdHJlZS5jCisrKyBiL2ZzL2J0cmZzL3Jvb3QtdHJlZS5jCkBAIC0yNzIsNiArMjcyLDIzIEBACiAJCXJvb3Rfa2V5Lm9iamVjdGlkID0ga2V5Lm9mZnNldDsKIAkJa2V5Lm9mZnNldCsrOwogCisJCS8qCisJCSAqIFRoZSByb290IG1pZ2h0IGhhdmUgYmVlbiBpbnNlcnRlZCBhbHJlYWR5LCBhcyBiZWZvcmUgd2UgbG9vaworCQkgKiBmb3Igb3JwaGFuIHJvb3RzLCBsb2cgcmVwbGF5IG1pZ2h0IGhhdmUgaGFwcGVuZWQsIHdoaWNoCisJCSAqIHRyaWdnZXJzIGEgdHJhbnNhY3Rpb24gY29tbWl0IGFuZCBxZ3JvdXAgYWNjb3VudGluZywgd2hpY2gKKwkJICogaW4gdHVybiByZWFkcyBhbmQgaW5zZXJ0cyBmcyByb290cyB3aGlsZSBkb2luZyBiYWNrcmVmCisJCSAqIHdhbGtpbmcuCisJCSAqLworCQlyb290ID0gYnRyZnNfbG9va3VwX2ZzX3Jvb3QodHJlZV9yb290LT5mc19pbmZvLAorCQkJCQkgICAgcm9vdF9rZXkub2JqZWN0aWQpOworCQlpZiAocm9vdCkgeworCQkJV0FSTl9PTighdGVzdF9iaXQoQlRSRlNfUk9PVF9PUlBIQU5fSVRFTV9JTlNFUlRFRCwKKwkJCQkJICAmcm9vdC0+c3RhdGUpKTsKKwkJCWlmIChidHJmc19yb290X3JlZnMoJnJvb3QtPnJvb3RfaXRlbSkgPT0gMCkKKwkJCQlidHJmc19hZGRfZGVhZF9yb290KHJvb3QpOworCQkJY29udGludWU7CisJCX0KKwogCQlyb290ID0gYnRyZnNfcmVhZF9mc19yb290KHRyZWVfcm9vdCwgJnJvb3Rfa2V5KTsKIAkJZXJyID0gUFRSX0VSUl9PUl9aRVJPKHJvb3QpOwogCQlpZiAoZXJyICYmIGVyciAhPSAtRU5PRU5UKSB7CkBAIC0zMTAsMTYgKzMyNyw4IEBACiAJCXNldF9iaXQoQlRSRlNfUk9PVF9PUlBIQU5fSVRFTV9JTlNFUlRFRCwgJnJvb3QtPnN0YXRlKTsKIAogCQllcnIgPSBidHJmc19pbnNlcnRfZnNfcm9vdChyb290LT5mc19pbmZvLCByb290KTsKLQkJLyoKLQkJICogVGhlIHJvb3QgbWlnaHQgaGF2ZSBiZWVuIGluc2VydGVkIGFscmVhZHksIGFzIGJlZm9yZSB3ZSBsb29rCi0JCSAqIGZvciBvcnBoYW4gcm9vdHMsIGxvZyByZXBsYXkgbWlnaHQgaGF2ZSBoYXBwZW5lZCwgd2hpY2gKLQkJICogdHJpZ2dlcnMgYSB0cmFuc2FjdGlvbiBjb21taXQgYW5kIHFncm91cCBhY2NvdW50aW5nLCB3aGljaAotCQkgKiBpbiB0dXJuIHJlYWRzIGFuZCBpbnNlcnRzIGZzIHJvb3RzIHdoaWxlIGRvaW5nIGJhY2tyZWYKLQkJICogd2Fsa2luZy4KLQkJICovCi0JCWlmIChlcnIgPT0gLUVFWElTVCkKLQkJCWVyciA9IDA7CiAJCWlmIChlcnIpIHsKKwkJCUJVR19PTihlcnIgPT0gLUVFWElTVCk7CiAJCQlidHJmc19mcmVlX2ZzX3Jvb3Qocm9vdCk7CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvc2VuZC5jIGIvZnMvYnRyZnMvc2VuZC5jCmluZGV4IGVmZTEyOWYuLmE4NzY3NWYgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3NlbmQuYworKysgYi9mcy9idHJmcy9zZW5kLmMKQEAgLTQyNjgsMTAgKzQyNjgsMTIgQEAKIAl9CiAJYnRyZnNfcmVsZWFzZV9wYXRoKHBhdGgpOwogCisJLyoKKwkgKiBXZSBkb24ndCBhY3R1YWxseSBjYXJlIGFib3V0IHBlbmRpbmdfbW92ZSBhcyB3ZSBhcmUgc2ltcGx5CisJICogcmUtY3JlYXRpbmcgdGhpcyBpbm9kZSBhbmQgd2lsbCBiZSByZW5hbWUnaW5nIGl0IGludG8gcGxhY2Ugb25jZSB3ZQorCSAqIHJlbmFtZSB0aGUgcGFyZW50IGRpcmVjdG9yeS4KKwkgKi8KIAlyZXQgPSBwcm9jZXNzX3JlY29yZGVkX3JlZnMoc2N0eCwgJnBlbmRpbmdfbW92ZSk7Ci0JLyogT25seSBhcHBsaWNhYmxlIHRvIGFuIGluY3JlbWVudGFsIHNlbmQuICovCi0JQVNTRVJUKHBlbmRpbmdfbW92ZSA9PSAwKTsKLQogb3V0OgogCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvc3VwZXIuYyBiL2ZzL2J0cmZzL3N1cGVyLmMKaW5kZXggODY0Y2UzMy4uNDA3MWZlMiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvc3VwZXIuYworKysgYi9mcy9idHJmcy9zdXBlci5jCkBAIC0yMjQxLDYgKzIyNDEsMTMgQEAKIAlzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFuczsKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IGJ0cmZzX3NiKHNiKS0+dHJlZV9yb290OwogCisJcm9vdC0+ZnNfaW5mby0+ZnNfZnJvemVuID0gMTsKKwkvKgorCSAqIFdlIGRvbid0IG5lZWQgYSBiYXJyaWVyIGhlcmUsIHdlJ2xsIHdhaXQgZm9yIGFueSB0cmFuc2FjdGlvbiB0aGF0CisJICogY291bGQgYmUgaW4gcHJvZ3Jlc3Mgb24gb3RoZXIgdGhyZWFkcyAoYW5kIGRvIGRlbGF5ZWQgaXB1dHMgdGhhdAorCSAqIHdlIHdhbnQgdG8gYXZvaWQgb24gYSBmcm96ZW4gZmlsZXN5c3RlbSksIG9yIGRvIHRoZSBjb21taXQKKwkgKiBvdXJzZWx2ZXMuCisJICovCiAJdHJhbnMgPSBidHJmc19hdHRhY2hfdHJhbnNhY3Rpb25fYmFycmllcihyb290KTsKIAlpZiAoSVNfRVJSKHRyYW5zKSkgewogCQkvKiBubyB0cmFuc2FjdGlvbiwgZG9uJ3QgYm90aGVyICovCkBAIC0yMjUxLDYgKzIyNTgsMTQgQEAKIAlyZXR1cm4gYnRyZnNfY29tbWl0X3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKIH0KIAorc3RhdGljIGludCBidHJmc191bmZyZWV6ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gYnRyZnNfc2Ioc2IpLT50cmVlX3Jvb3Q7CisKKwlyb290LT5mc19pbmZvLT5mc19mcm96ZW4gPSAwOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGJ0cmZzX3Nob3dfZGV2bmFtZShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBkZW50cnkgKnJvb3QpCiB7CiAJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8gPSBidHJmc19zYihyb290LT5kX3NiKTsKQEAgLTIyOTksNiArMjMxNCw3IEBACiAJLnN0YXRmcwkJPSBidHJmc19zdGF0ZnMsCiAJLnJlbW91bnRfZnMJPSBidHJmc19yZW1vdW50LAogCS5mcmVlemVfZnMJPSBidHJmc19mcmVlemUsCisJLnVuZnJlZXplX2ZzCT0gYnRyZnNfdW5mcmVlemUsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBidHJmc19jdGxfZm9wcyA9IHsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3RyYW5zYWN0aW9uLmMgYi9mcy9idHJmcy90cmFuc2FjdGlvbi5jCmluZGV4IDljY2EwYTcuLjk1ZDQxOTEgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3RyYW5zYWN0aW9uLmMKKysrIGIvZnMvYnRyZnMvdHJhbnNhY3Rpb24uYwpAQCAtMjI3OCw4ICsyMjc4LDEzIEBACiAKIAlrbWVtX2NhY2hlX2ZyZWUoYnRyZnNfdHJhbnNfaGFuZGxlX2NhY2hlcCwgdHJhbnMpOwogCisJLyoKKwkgKiBJZiBmcyBoYXMgYmVlbiBmcm96ZW4sIHdlIGNhbiBub3QgaGFuZGxlIGRlbGF5ZWQgaXB1dHMsIG90aGVyd2lzZQorCSAqIGl0J2xsIHJlc3VsdCBpbiBkZWFkbG9jayBhYm91dCBTQl9GUkVFWkVfRlMuCisJICovCiAJaWYgKGN1cnJlbnQgIT0gcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fa3RocmVhZCAmJgotCSAgICBjdXJyZW50ICE9IHJvb3QtPmZzX2luZm8tPmNsZWFuZXJfa3RocmVhZCkKKwkgICAgY3VycmVudCAhPSByb290LT5mc19pbmZvLT5jbGVhbmVyX2t0aHJlYWQgJiYKKwkgICAgIXJvb3QtPmZzX2luZm8tPmZzX2Zyb3plbikKIAkJYnRyZnNfcnVuX2RlbGF5ZWRfaXB1dHMocm9vdCk7CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdHJlZS1sb2cuYyBiL2ZzL2J0cmZzL3RyZWUtbG9nLmMKaW5kZXggZmZmM2YzZS4uZWY5YzU1YiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvdHJlZS1sb2cuYworKysgYi9mcy9idHJmcy90cmVlLWxvZy5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSAiYmFja3JlZi5oIgogI2luY2x1ZGUgImhhc2guaCIKICNpbmNsdWRlICJjb21wcmVzc2lvbi5oIgorI2luY2x1ZGUgInFncm91cC5oIgogCiAvKiBtYWdpYyB2YWx1ZXMgZm9yIHRoZSBpbm9kZV9vbmx5IGZpZWxkIGluIGJ0cmZzX2xvZ19pbm9kZToKICAqCkBAIC02ODAsNiArNjgxLDIxIEBACiAJCWlucy50eXBlID0gQlRSRlNfRVhURU5UX0lURU1fS0VZOwogCQlvZmZzZXQgPSBrZXktPm9mZnNldCAtIGJ0cmZzX2ZpbGVfZXh0ZW50X29mZnNldChlYiwgaXRlbSk7CiAKKwkJLyoKKwkJICogTWFudWFsbHkgcmVjb3JkIGRpcnR5IGV4dGVudCwgYXMgaGVyZSB3ZSBkaWQgYSBzaGFsbG93CisJCSAqIGZpbGUgZXh0ZW50IGl0ZW0gY29weSBhbmQgc2tpcCBub3JtYWwgYmFja3JlZiB1cGRhdGUsCisJCSAqIGJ1dCBtb2RpZnlpbmcgZXh0ZW50IHRyZWUgYWxsIGJ5IG91cnNlbHZlcy4KKwkJICogU28gbmVlZCB0byBtYW51YWxseSByZWNvcmQgZGlydHkgZXh0ZW50IGZvciBxZ3JvdXAsCisJCSAqIGFzIHRoZSBvd25lciBvZiB0aGUgZmlsZSBleHRlbnQgY2hhbmdlZCBmcm9tIGxvZyB0cmVlCisJCSAqIChkb2Vzbid0IGFmZmVjdCBxZ3JvdXApIHRvIGZzL2ZpbGUgdHJlZShhZmZlY3RzIHFncm91cCkKKwkJICovCisJCXJldCA9IGJ0cmZzX3Fncm91cF9pbnNlcnRfZGlydHlfZXh0ZW50KHRyYW5zLCByb290LT5mc19pbmZvLAorCQkJCWJ0cmZzX2ZpbGVfZXh0ZW50X2Rpc2tfYnl0ZW5yKGViLCBpdGVtKSwKKwkJCQlidHJmc19maWxlX2V4dGVudF9kaXNrX251bV9ieXRlcyhlYiwgaXRlbSksCisJCQkJR0ZQX05PRlMpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCiAJCWlmIChpbnMub2JqZWN0aWQgPiAwKSB7CiAJCQl1NjQgY3N1bV9zdGFydDsKIAkJCXU2NCBjc3VtX2VuZDsKQEAgLTI4MDcsNyArMjgyMyw3IEBACiAJICovCiAJbXV0ZXhfdW5sb2NrKCZyb290LT5sb2dfbXV0ZXgpOwogCi0JYnRyZnNfaW5pdF9sb2dfY3R4KCZyb290X2xvZ19jdHgpOworCWJ0cmZzX2luaXRfbG9nX2N0eCgmcm9vdF9sb2dfY3R4LCBOVUxMKTsKIAogCW11dGV4X2xvY2soJmxvZ19yb290X3RyZWUtPmxvZ19tdXRleCk7CiAJYXRvbWljX2luYygmbG9nX3Jvb3RfdHJlZS0+bG9nX2JhdGNoKTsKQEAgLTI4NTEsNiArMjg2Nyw3IEBACiAKIAlpZiAobG9nX3Jvb3RfdHJlZS0+bG9nX3RyYW5zaWRfY29tbWl0dGVkID49IHJvb3RfbG9nX2N0eC5sb2dfdHJhbnNpZCkgewogCQlibGtfZmluaXNoX3BsdWcoJnBsdWcpOworCQlsaXN0X2RlbF9pbml0KCZyb290X2xvZ19jdHgubGlzdCk7CiAJCW11dGV4X3VubG9jaygmbG9nX3Jvb3RfdHJlZS0+bG9nX211dGV4KTsKIAkJcmV0ID0gcm9vdF9sb2dfY3R4LmxvZ19yZXQ7CiAJCWdvdG8gb3V0OwpAQCAtNDc0MSw3ICs0NzU4LDggQEAKIAkJCWlmIChyZXQgPCAwKSB7CiAJCQkJZXJyID0gcmV0OwogCQkJCWdvdG8gb3V0X3VubG9jazsKLQkJCX0gZWxzZSBpZiAocmV0ID4gMCkgeworCQkJfSBlbHNlIGlmIChyZXQgPiAwICYmIGN0eCAmJgorCQkJCSAgIG90aGVyX2lubyAhPSBidHJmc19pbm8oY3R4LT5pbm9kZSkpIHsKIAkJCQlzdHJ1Y3QgYnRyZnNfa2V5IGlub2RlX2tleTsKIAkJCQlzdHJ1Y3QgaW5vZGUgKm90aGVyX2lub2RlOwogCmRpZmYgLS1naXQgYS9mcy9idHJmcy90cmVlLWxvZy5oIGIvZnMvYnRyZnMvdHJlZS1sb2cuaAppbmRleCBhOWYxYjc1Li5hYjg1OGUzIDEwMDY0NAotLS0gYS9mcy9idHJmcy90cmVlLWxvZy5oCisrKyBiL2ZzL2J0cmZzL3RyZWUtbG9nLmgKQEAgLTMwLDE1ICszMCwxOCBAQAogCWludCBsb2dfdHJhbnNpZDsKIAlpbnQgaW9fZXJyOwogCWJvb2wgbG9nX25ld19kZW50cmllczsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIH07CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBidHJmc19pbml0X2xvZ19jdHgoc3RydWN0IGJ0cmZzX2xvZ19jdHggKmN0eCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBidHJmc19pbml0X2xvZ19jdHgoc3RydWN0IGJ0cmZzX2xvZ19jdHggKmN0eCwKKwkJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCWN0eC0+bG9nX3JldCA9IDA7CiAJY3R4LT5sb2dfdHJhbnNpZCA9IDA7CiAJY3R4LT5pb19lcnIgPSAwOwogCWN0eC0+bG9nX25ld19kZW50cmllcyA9IGZhbHNlOworCWN0eC0+aW5vZGUgPSBpbm9kZTsKIAlJTklUX0xJU1RfSEVBRCgmY3R4LT5saXN0KTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdm9sdW1lcy5jIGIvZnMvYnRyZnMvdm9sdW1lcy5jCmluZGV4IDUxZjEyNTUuLjAzNWVmY2UgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3ZvbHVtZXMuYworKysgYi9mcy9idHJmcy92b2x1bWVzLmMKQEAgLTgzNCwxMCArODM0LDYgQEAKIAlzdHJ1Y3QgYnRyZnNfZGV2aWNlICpkZXZpY2U7CiAKIAlkZXZpY2UgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGJ0cmZzX2RldmljZSwgcmN1X3dvcmspOwotCi0JaWYgKGRldmljZS0+YmRldikKLQkJYmxrZGV2X3B1dChkZXZpY2UtPmJkZXYsIGRldmljZS0+bW9kZSk7Ci0KIAlyY3Vfc3RyaW5nX2ZyZWUoZGV2aWNlLT5uYW1lKTsKIAlrZnJlZShkZXZpY2UpOwogfQpAQCAtODUyLDYgKzg0OCwxNyBAQAogCXNjaGVkdWxlX3dvcmsoJmRldmljZS0+cmN1X3dvcmspOwogfQogCitzdGF0aWMgdm9pZCBidHJmc19jbG9zZV9iZGV2KHN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZSkKK3sKKwlpZiAoZGV2aWNlLT5iZGV2ICYmIGRldmljZS0+d3JpdGVhYmxlKSB7CisJCXN5bmNfYmxvY2tkZXYoZGV2aWNlLT5iZGV2KTsKKwkJaW52YWxpZGF0ZV9iZGV2KGRldmljZS0+YmRldik7CisJfQorCisJaWYgKGRldmljZS0+YmRldikKKwkJYmxrZGV2X3B1dChkZXZpY2UtPmJkZXYsIGRldmljZS0+bW9kZSk7Cit9CisKIHN0YXRpYyB2b2lkIGJ0cmZzX2Nsb3NlX29uZV9kZXZpY2Uoc3RydWN0IGJ0cmZzX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBidHJmc19mc19kZXZpY2VzICpmc19kZXZpY2VzID0gZGV2aWNlLT5mc19kZXZpY2VzOwpAQCAtODcwLDEwICs4NzcsNyBAQAogCWlmIChkZXZpY2UtPm1pc3NpbmcpCiAJCWZzX2RldmljZXMtPm1pc3NpbmdfZGV2aWNlcy0tOwogCi0JaWYgKGRldmljZS0+YmRldiAmJiBkZXZpY2UtPndyaXRlYWJsZSkgewotCQlzeW5jX2Jsb2NrZGV2KGRldmljZS0+YmRldik7Ci0JCWludmFsaWRhdGVfYmRldihkZXZpY2UtPmJkZXYpOwotCX0KKwlidHJmc19jbG9zZV9iZGV2KGRldmljZSk7CiAKIAluZXdfZGV2aWNlID0gYnRyZnNfYWxsb2NfZGV2aWNlKE5VTEwsICZkZXZpY2UtPmRldmlkLAogCQkJCQlkZXZpY2UtPnV1aWQpOwpAQCAtMTkzMiw2ICsxOTM2LDggQEAKIAkJYnRyZnNfc3lzZnNfcm1fZGV2aWNlX2xpbmsocm9vdC0+ZnNfaW5mby0+ZnNfZGV2aWNlcywgZGV2aWNlKTsKIAl9CiAKKwlidHJmc19jbG9zZV9iZGV2KGRldmljZSk7CisKIAljYWxsX3JjdSgmZGV2aWNlLT5yY3UsIGZyZWVfZGV2aWNlKTsKIAogCW51bV9kZXZpY2VzID0gYnRyZnNfc3VwZXJfbnVtX2RldmljZXMocm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSkgLSAxOwpAQCAtMjAyNSw2ICsyMDMxLDkgQEAKIAkJLyogemVybyBvdXQgdGhlIG9sZCBzdXBlciBpZiBpdCBpcyB3cml0YWJsZSAqLwogCQlidHJmc19zY3JhdGNoX3N1cGVyYmxvY2tzKHNyY2Rldi0+YmRldiwgc3JjZGV2LT5uYW1lLT5zdHIpOwogCX0KKworCWJ0cmZzX2Nsb3NlX2JkZXYoc3JjZGV2KTsKKwogCWNhbGxfcmN1KCZzcmNkZXYtPnJjdSwgZnJlZV9kZXZpY2UpOwogCiAJLyoKQEAgLTIwODAsNiArMjA4OSw4IEBACiAJICogdGhlIGRldmljZV9saXN0X211dGV4IGxvY2suCiAJICovCiAJYnRyZnNfc2NyYXRjaF9zdXBlcmJsb2Nrcyh0Z3RkZXYtPmJkZXYsIHRndGRldi0+bmFtZS0+c3RyKTsKKworCWJ0cmZzX2Nsb3NlX2JkZXYodGd0ZGV2KTsKIAljYWxsX3JjdSgmdGd0ZGV2LT5yY3UsIGZyZWVfZGV2aWNlKTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvY2VwaC9kaXIuYyBiL2ZzL2NlcGgvZGlyLmMKaW5kZXggYzY0YTBiNy4uZGY0YjNlNiAxMDA2NDQKLS0tIGEvZnMvY2VwaC9kaXIuYworKysgYi9mcy9jZXBoL2Rpci5jCkBAIC01OTcsNyArNTk3LDcgQEAKIAlpZiAoaXNfaGFzaF9vcmRlcihuZXdfcG9zKSkgewogCQkvKiBubyBuZWVkIHRvIHJlc2V0IGxhc3RfbmFtZSBmb3IgYSBmb3J3YXJkIHNlZWsgd2hlbgogCQkgKiBkZW50cmllcyBhcmUgc290cmVkIGluIGhhc2ggb3JkZXIgKi8KLQl9IGVsc2UgaWYgKGZpLT5mcmFnIHw9IGZwb3NfZnJhZyhuZXdfcG9zKSkgeworCX0gZWxzZSBpZiAoZmktPmZyYWcgIT0gZnBvc19mcmFnKG5ld19wb3MpKSB7CiAJCXJldHVybiB0cnVlOwogCX0KIAlyaW5mbyA9IGZpLT5sYXN0X3JlYWRkaXIgPyAmZmktPmxhc3RfcmVhZGRpci0+cl9yZXBseV9pbmZvIDogTlVMTDsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2ZzLmMgYi9mcy9jaWZzL2NpZnNmcy5jCmluZGV4IDZiYmVjNWUuLjE0YWU0YjggMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc2ZzLmMKKysrIGIvZnMvY2lmcy9jaWZzZnMuYwpAQCAtNjA5LDYgKzYwOSw5IEBACiAJY2hhciAqcywgKnA7CiAJY2hhciBzZXA7CiAKKwlpZiAoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX1VTRV9QUkVGSVhfUEFUSCkKKwkJcmV0dXJuIGRnZXQoc2ItPnNfcm9vdCk7CisKIAlmdWxsX3BhdGggPSBjaWZzX2J1aWxkX3BhdGhfdG9fcm9vdCh2b2wsIGNpZnNfc2IsCiAJCQkJCSAgICBjaWZzX3NiX21hc3Rlcl90Y29uKGNpZnNfc2IpKTsKIAlpZiAoZnVsbF9wYXRoID09IE5VTEwpCkBAIC02ODYsMjYgKzY4OSwyMiBAQAogCWNpZnNfc2ItPm1vdW50ZGF0YSA9IGtzdHJuZHVwKGRhdGEsIFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNpZnNfc2ItPm1vdW50ZGF0YSA9PSBOVUxMKSB7CiAJCXJvb3QgPSBFUlJfUFRSKC1FTk9NRU0pOwotCQlnb3RvIG91dF9jaWZzX3NiOworCQlnb3RvIG91dF9mcmVlOwogCX0KIAotCWlmICh2b2x1bWVfaW5mby0+cHJlcGF0aCkgewotCQljaWZzX3NiLT5wcmVwYXRoID0ga3N0cmR1cCh2b2x1bWVfaW5mby0+cHJlcGF0aCwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChjaWZzX3NiLT5wcmVwYXRoID09IE5VTEwpIHsKLQkJCXJvb3QgPSBFUlJfUFRSKC1FTk9NRU0pOwotCQkJZ290byBvdXRfY2lmc19zYjsKLQkJfQorCXJjID0gY2lmc19zZXR1cF9jaWZzX3NiKHZvbHVtZV9pbmZvLCBjaWZzX3NiKTsKKwlpZiAocmMpIHsKKwkJcm9vdCA9IEVSUl9QVFIocmMpOworCQlnb3RvIG91dF9mcmVlOwogCX0KIAotCWNpZnNfc2V0dXBfY2lmc19zYih2b2x1bWVfaW5mbywgY2lmc19zYik7Ci0KIAlyYyA9IGNpZnNfbW91bnQoY2lmc19zYiwgdm9sdW1lX2luZm8pOwogCWlmIChyYykgewogCQlpZiAoIShmbGFncyAmIE1TX1NJTEVOVCkpCiAJCQljaWZzX2RiZyhWRlMsICJjaWZzX21vdW50IGZhaWxlZCB3L3JldHVybiBjb2RlID0gJWRcbiIsCiAJCQkJIHJjKTsKIAkJcm9vdCA9IEVSUl9QVFIocmMpOwotCQlnb3RvIG91dF9tb3VudGRhdGE7CisJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCiAJbW50X2RhdGEudm9sID0gdm9sdW1lX2luZm87CkBAIC03MzUsMTEgKzczNCw3IEBACiAJCXNiLT5zX2ZsYWdzIHw9IE1TX0FDVElWRTsKIAl9CiAKLQlpZiAoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX1VTRV9QUkVGSVhfUEFUSCkKLQkJcm9vdCA9IGRnZXQoc2ItPnNfcm9vdCk7Ci0JZWxzZQotCQlyb290ID0gY2lmc19nZXRfcm9vdCh2b2x1bWVfaW5mbywgc2IpOwotCisJcm9vdCA9IGNpZnNfZ2V0X3Jvb3Qodm9sdW1lX2luZm8sIHNiKTsKIAlpZiAoSVNfRVJSKHJvb3QpKQogCQlnb3RvIG91dF9zdXBlcjsKIApAQCAtNzUyLDkgKzc0Nyw5IEBACiAJY2lmc19jbGVhbnVwX3ZvbHVtZV9pbmZvKHZvbHVtZV9pbmZvKTsKIAlyZXR1cm4gcm9vdDsKIAotb3V0X21vdW50ZGF0YToKK291dF9mcmVlOgorCWtmcmVlKGNpZnNfc2ItPnByZXBhdGgpOwogCWtmcmVlKGNpZnNfc2ItPm1vdW50ZGF0YSk7Ci1vdXRfY2lmc19zYjoKIAlrZnJlZShjaWZzX3NiKTsKIG91dF9ubHM6CiAJdW5sb2FkX25scyh2b2x1bWVfaW5mby0+bG9jYWxfbmxzKTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc3Byb3RvLmggYi9mcy9jaWZzL2NpZnNwcm90by5oCmluZGV4IDEyNDNiZDMuLjk1ZGFiNDMgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc3Byb3RvLmgKKysrIGIvZnMvY2lmcy9jaWZzcHJvdG8uaApAQCAtMTg0LDcgKzE4NCw3IEBACiAJCQkgICAgICAgICB1bnNpZ25lZCBpbnQgdG9fcmVhZCk7CiBleHRlcm4gaW50IGNpZnNfcmVhZF9wYWdlX2Zyb21fc29ja2V0KHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwKIAkJCQkgICAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IHRvX3JlYWQpOwotZXh0ZXJuIHZvaWQgY2lmc19zZXR1cF9jaWZzX3NiKHN0cnVjdCBzbWJfdm9sICpwdm9sdW1lX2luZm8sCitleHRlcm4gaW50IGNpZnNfc2V0dXBfY2lmc19zYihzdHJ1Y3Qgc21iX3ZvbCAqcHZvbHVtZV9pbmZvLAogCQkJICAgICAgIHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IpOwogZXh0ZXJuIGludCBjaWZzX21hdGNoX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB2b2lkICopOwogZXh0ZXJuIHZvaWQgY2lmc19jbGVhbnVwX3ZvbHVtZV9pbmZvKHN0cnVjdCBzbWJfdm9sICpwdm9sdW1lX2luZm8pOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jb25uZWN0LmMgYi9mcy9jaWZzL2Nvbm5lY3QuYwppbmRleCA3YWUwMzI4Li4yZTRmNGJhIDEwMDY0NAotLS0gYS9mcy9jaWZzL2Nvbm5lY3QuYworKysgYi9mcy9jaWZzL2Nvbm5lY3QuYwpAQCAtMjc4MSw2ICsyNzgxLDI0IEBACiAJcmV0dXJuIDE7CiB9CiAKK3N0YXRpYyBpbnQKK21hdGNoX3ByZXBhdGgoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGNpZnNfbW50X2RhdGEgKm1udF9kYXRhKQoreworCXN0cnVjdCBjaWZzX3NiX2luZm8gKm9sZCA9IENJRlNfU0Ioc2IpOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKm5ldyA9IG1udF9kYXRhLT5jaWZzX3NiOworCisJaWYgKG9sZC0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX1VTRV9QUkVGSVhfUEFUSCkgeworCQlpZiAoIShuZXctPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9VU0VfUFJFRklYX1BBVEgpKQorCQkJcmV0dXJuIDA7CisJCS8qIFRoZSBwcmVwYXRoIHNob3VsZCBiZSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5ncyAqLworCQlpZiAoc3RyY21wKG5ldy0+cHJlcGF0aCwgb2xkLT5wcmVwYXRoKSkKKwkJCXJldHVybiAwOworCisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKwogaW50CiBjaWZzX21hdGNoX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEpCiB7CkBAIC0yODA4LDcgKzI4MjYsOCBAQAogCiAJaWYgKCFtYXRjaF9zZXJ2ZXIodGNwX3Nydiwgdm9sdW1lX2luZm8pIHx8CiAJICAgICFtYXRjaF9zZXNzaW9uKHNlcywgdm9sdW1lX2luZm8pIHx8Ci0JICAgICFtYXRjaF90Y29uKHRjb24sIHZvbHVtZV9pbmZvLT5VTkMpKSB7CisJICAgICFtYXRjaF90Y29uKHRjb24sIHZvbHVtZV9pbmZvLT5VTkMpIHx8CisJICAgICFtYXRjaF9wcmVwYXRoKHNiLCBtbnRfZGF0YSkpIHsKIAkJcmMgPSAwOwogCQlnb3RvIG91dDsKIAl9CkBAIC0zMjIyLDcgKzMyNDEsNyBAQAogCX0KIH0KIAotdm9pZCBjaWZzX3NldHVwX2NpZnNfc2Ioc3RydWN0IHNtYl92b2wgKnB2b2x1bWVfaW5mbywKK2ludCBjaWZzX3NldHVwX2NpZnNfc2Ioc3RydWN0IHNtYl92b2wgKnB2b2x1bWVfaW5mbywKIAkJCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IpCiB7CiAJSU5JVF9ERUxBWUVEX1dPUksoJmNpZnNfc2ItPnBydW5lX3RsaW5rcywgY2lmc19wcnVuZV90bGlua3MpOwpAQCAtMzMxNiw2ICszMzM1LDE0IEBACiAKIAlpZiAoKHB2b2x1bWVfaW5mby0+Y2lmc19hY2wpICYmIChwdm9sdW1lX2luZm8tPmR5bnBlcm0pKQogCQljaWZzX2RiZyhWRlMsICJtb3VudCBvcHRpb24gZHlucGVybSBpZ25vcmVkIGlmIGNpZnNhY2wgbW91bnQgb3B0aW9uIHN1cHBvcnRlZFxuIik7CisKKwlpZiAocHZvbHVtZV9pbmZvLT5wcmVwYXRoKSB7CisJCWNpZnNfc2ItPnByZXBhdGggPSBrc3RyZHVwKHB2b2x1bWVfaW5mby0+cHJlcGF0aCwgR0ZQX0tFUk5FTCk7CisJCWlmIChjaWZzX3NiLT5wcmVwYXRoID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKZGlmZiAtLWdpdCBhL2ZzL2NvbmZpZ2ZzL2ZpbGUuYyBiL2ZzL2NvbmZpZ2ZzL2ZpbGUuYwppbmRleCBjMzBjZjQ5Li4yYzYzMTJkIDEwMDY0NAotLS0gYS9mcy9jb25maWdmcy9maWxlLmMKKysrIGIvZnMvY29uZmlnZnMvZmlsZS5jCkBAIC0zMzMsNiArMzMzLDcgQEAKIAkJaWYgKGJpbl9hdHRyLT5jYl9tYXhfc2l6ZSAmJgogCQkJKnBwb3MgKyBjb3VudCA+IGJpbl9hdHRyLT5jYl9tYXhfc2l6ZSkgewogCQkJbGVuID0gLUVGQklHOworCQkJZ290byBvdXQ7CiAJCX0KIAogCQl0YnVmID0gdm1hbGxvYygqcHBvcyArIGNvdW50KTsKZGlmZiAtLWdpdCBhL2ZzL2NyeXB0by9wb2xpY3kuYyBiL2ZzL2NyeXB0by9wb2xpY3kuYwppbmRleCAwZjk5NjFlLi5lZDExNWFjIDEwMDY0NAotLS0gYS9mcy9jcnlwdG8vcG9saWN5LmMKKysrIGIvZnMvY3J5cHRvL3BvbGljeS5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZnNjcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogCiBzdGF0aWMgaW50IGlub2RlX2hhc19lbmNyeXB0aW9uX2NvbnRleHQoc3RydWN0IGlub2RlICppbm9kZSkKIHsKQEAgLTkyLDI2ICs5Myw0MiBAQAogCXJldHVybiBpbm9kZS0+aV9zYi0+c19jb3AtPnNldF9jb250ZXh0KGlub2RlLCAmY3R4LCBzaXplb2YoY3R4KSwgTlVMTCk7CiB9CiAKLWludCBmc2NyeXB0X3Byb2Nlc3NfcG9saWN5KHN0cnVjdCBpbm9kZSAqaW5vZGUsCitpbnQgZnNjcnlwdF9wcm9jZXNzX3BvbGljeShzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJCQljb25zdCBzdHJ1Y3QgZnNjcnlwdF9wb2xpY3kgKnBvbGljeSkKIHsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxwKTsKKwlpbnQgcmV0OworCisJaWYgKCFpbm9kZV9vd25lcl9vcl9jYXBhYmxlKGlub2RlKSkKKwkJcmV0dXJuIC1FQUNDRVM7CisKIAlpZiAocG9saWN5LT52ZXJzaW9uICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCisJcmV0ID0gbW50X3dhbnRfd3JpdGVfZmlsZShmaWxwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJaWYgKCFpbm9kZV9oYXNfZW5jcnlwdGlvbl9jb250ZXh0KGlub2RlKSkgewotCQlpZiAoIWlub2RlLT5pX3NiLT5zX2NvcC0+ZW1wdHlfZGlyKQotCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCQlpZiAoIWlub2RlLT5pX3NiLT5zX2NvcC0+ZW1wdHlfZGlyKGlub2RlKSkKLQkJCXJldHVybiAtRU5PVEVNUFRZOwotCQlyZXR1cm4gY3JlYXRlX2VuY3J5cHRpb25fY29udGV4dF9mcm9tX3BvbGljeShpbm9kZSwgcG9saWN5KTsKKwkJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQkJcmV0ID0gLUVJTlZBTDsKKwkJZWxzZSBpZiAoIWlub2RlLT5pX3NiLT5zX2NvcC0+ZW1wdHlfZGlyKQorCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWVsc2UgaWYgKCFpbm9kZS0+aV9zYi0+c19jb3AtPmVtcHR5X2Rpcihpbm9kZSkpCisJCQlyZXQgPSAtRU5PVEVNUFRZOworCQllbHNlCisJCQlyZXQgPSBjcmVhdGVfZW5jcnlwdGlvbl9jb250ZXh0X2Zyb21fcG9saWN5KGlub2RlLAorCQkJCQkJCQkgICAgcG9saWN5KTsKKwl9IGVsc2UgaWYgKCFpc19lbmNyeXB0aW9uX2NvbnRleHRfY29uc2lzdGVudF93aXRoX3BvbGljeShpbm9kZSwKKwkJCQkJCQkJIHBvbGljeSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIiVzOiBQb2xpY3kgaW5jb25zaXN0ZW50IHdpdGggZW5jcnlwdGlvbiBjb250ZXh0XG4iLAorCQkgICAgICAgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOwogCX0KIAotCWlmIChpc19lbmNyeXB0aW9uX2NvbnRleHRfY29uc2lzdGVudF93aXRoX3BvbGljeShpbm9kZSwgcG9saWN5KSkKLQkJcmV0dXJuIDA7Ci0KLQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUG9saWN5IGluY29uc2lzdGVudCB3aXRoIGVuY3J5cHRpb24gY29udGV4dFxuIiwKLQkgICAgICAgX19mdW5jX18pOwotCXJldHVybiAtRUlOVkFMOworCW1udF9kcm9wX3dyaXRlX2ZpbGUoZmlscCk7CisJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0woZnNjcnlwdF9wcm9jZXNzX3BvbGljeSk7CiAKZGlmZiAtLWdpdCBhL2ZzL2RheC5jIGIvZnMvZGF4LmMKaW5kZXggOTkzZGM2Zi4uY2MwMjVmOCAxMDA2NDQKLS0tIGEvZnMvZGF4LmMKKysrIGIvZnMvZGF4LmMKQEAgLTMxLDYgKzMxLDggQEAKICNpbmNsdWRlIDxsaW51eC92bXN0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9wZm5fdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NpemVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9tYXAuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiAvKgogICogV2UgdXNlIGxvd2VzdCBhdmFpbGFibGUgYml0IGluIGV4Y2VwdGlvbmFsIGVudHJ5IGZvciBsb2NraW5nLCBvdGhlciB0d28KQEAgLTU4MCwxNCArNTgyLDEzIEBACiAJcmV0dXJuIFZNX0ZBVUxUX0xPQ0tFRDsKIH0KIAotc3RhdGljIGludCBjb3B5X3VzZXJfYmgoc3RydWN0IHBhZ2UgKnRvLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB1bnNpZ25lZCBsb25nIHZhZGRyKQorc3RhdGljIGludCBjb3B5X3VzZXJfZGF4KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IHNlY3Rvciwgc2l6ZV90IHNpemUsCisJCXN0cnVjdCBwYWdlICp0bywgdW5zaWduZWQgbG9uZyB2YWRkcikKIHsKIAlzdHJ1Y3QgYmxrX2RheF9jdGwgZGF4ID0gewotCQkuc2VjdG9yID0gdG9fc2VjdG9yKGJoLCBpbm9kZSksCi0JCS5zaXplID0gYmgtPmJfc2l6ZSwKKwkJLnNlY3RvciA9IHNlY3RvciwKKwkJLnNpemUgPSBzaXplLAogCX07Ci0Jc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IGJoLT5iX2JkZXY7CiAJdm9pZCAqdnRvOwogCiAJaWYgKGRheF9tYXBfYXRvbWljKGJkZXYsICZkYXgpIDwgMCkKQEAgLTc5MCwxNCArNzkxLDEzIEBACiBFWFBPUlRfU1lNQk9MX0dQTChkYXhfd3JpdGViYWNrX21hcHBpbmdfcmFuZ2UpOwogCiBzdGF0aWMgaW50IGRheF9pbnNlcnRfbWFwcGluZyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKLQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIHZvaWQgKiplbnRyeXAsCi0JCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHZtX2ZhdWx0ICp2bWYpCisJCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IHNlY3Rvciwgc2l6ZV90IHNpemUsCisJCXZvaWQgKiplbnRyeXAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZikKIHsKIAl1bnNpZ25lZCBsb25nIHZhZGRyID0gKHVuc2lnbmVkIGxvbmcpdm1mLT52aXJ0dWFsX2FkZHJlc3M7Ci0Jc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IGJoLT5iX2JkZXY7CiAJc3RydWN0IGJsa19kYXhfY3RsIGRheCA9IHsKLQkJLnNlY3RvciA9IHRvX3NlY3RvcihiaCwgbWFwcGluZy0+aG9zdCksCi0JCS5zaXplID0gYmgtPmJfc2l6ZSwKKwkJLnNlY3RvciA9IHNlY3RvciwKKwkJLnNpemUgPSBzaXplLAogCX07CiAJdm9pZCAqcmV0OwogCXZvaWQgKmVudHJ5ID0gKmVudHJ5cDsKQEAgLTg2OCw3ICs4NjgsOCBAQAogCWlmICh2bWYtPmNvd19wYWdlKSB7CiAJCXN0cnVjdCBwYWdlICpuZXdfcGFnZSA9IHZtZi0+Y293X3BhZ2U7CiAJCWlmIChidWZmZXJfd3JpdHRlbigmYmgpKQotCQkJZXJyb3IgPSBjb3B5X3VzZXJfYmgobmV3X3BhZ2UsIGlub2RlLCAmYmgsIHZhZGRyKTsKKwkJCWVycm9yID0gY29weV91c2VyX2RheChiaC5iX2JkZXYsIHRvX3NlY3RvcigmYmgsIGlub2RlKSwKKwkJCQkJYmguYl9zaXplLCBuZXdfcGFnZSwgdmFkZHIpOwogCQllbHNlCiAJCQljbGVhcl91c2VyX2hpZ2hwYWdlKG5ld19wYWdlLCB2YWRkcik7CiAJCWlmIChlcnJvcikKQEAgLTg5OCw3ICs4OTksOCBAQAogCiAJLyogRmlsZXN5c3RlbSBzaG91bGQgbm90IHJldHVybiB1bndyaXR0ZW4gYnVmZmVycyB0byB1cyEgKi8KIAlXQVJOX09OX09OQ0UoYnVmZmVyX3Vud3JpdHRlbigmYmgpIHx8IGJ1ZmZlcl9uZXcoJmJoKSk7Ci0JZXJyb3IgPSBkYXhfaW5zZXJ0X21hcHBpbmcobWFwcGluZywgJmJoLCAmZW50cnksIHZtYSwgdm1mKTsKKwllcnJvciA9IGRheF9pbnNlcnRfbWFwcGluZyhtYXBwaW5nLCBiaC5iX2JkZXYsIHRvX3NlY3RvcigmYmgsIGlub2RlKSwKKwkJCWJoLmJfc2l6ZSwgJmVudHJ5LCB2bWEsIHZtZik7CiAgdW5sb2NrX2VudHJ5OgogCXB1dF9sb2NrZWRfbWFwcGluZ19lbnRyeShtYXBwaW5nLCB2bWYtPnBnb2ZmLCBlbnRyeSk7CiAgb3V0OgpAQCAtMTI0MSwzICsxMjQzLDIyOSBAQAogCXJldHVybiBkYXhfemVyb19wYWdlX3JhbmdlKGlub2RlLCBmcm9tLCBsZW5ndGgsIGdldF9ibG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChkYXhfdHJ1bmNhdGVfcGFnZSk7CisKKyNpZmRlZiBDT05GSUdfRlNfSU9NQVAKK3N0YXRpYyBsb2ZmX3QKK2lvbWFwX2RheF9hY3RvcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgcG9zLCBsb2ZmX3QgbGVuZ3RoLCB2b2lkICpkYXRhLAorCQlzdHJ1Y3QgaW9tYXAgKmlvbWFwKQoreworCXN0cnVjdCBpb3ZfaXRlciAqaXRlciA9IGRhdGE7CisJbG9mZl90IGVuZCA9IHBvcyArIGxlbmd0aCwgZG9uZSA9IDA7CisJc3NpemVfdCByZXQgPSAwOworCisJaWYgKGlvdl9pdGVyX3J3KGl0ZXIpID09IFJFQUQpIHsKKwkJZW5kID0gbWluKGVuZCwgaV9zaXplX3JlYWQoaW5vZGUpKTsKKwkJaWYgKHBvcyA+PSBlbmQpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoaW9tYXAtPnR5cGUgPT0gSU9NQVBfSE9MRSB8fCBpb21hcC0+dHlwZSA9PSBJT01BUF9VTldSSVRURU4pCisJCQlyZXR1cm4gaW92X2l0ZXJfemVybyhtaW4obGVuZ3RoLCBlbmQgLSBwb3MpLCBpdGVyKTsKKwl9CisKKwlpZiAoV0FSTl9PTl9PTkNFKGlvbWFwLT50eXBlICE9IElPTUFQX01BUFBFRCkpCisJCXJldHVybiAtRUlPOworCisJd2hpbGUgKHBvcyA8IGVuZCkgeworCQl1bnNpZ25lZCBvZmZzZXQgPSBwb3MgJiAoUEFHRV9TSVpFIC0gMSk7CisJCXN0cnVjdCBibGtfZGF4X2N0bCBkYXggPSB7IDAgfTsKKwkJc3NpemVfdCBtYXBfbGVuOworCisJCWRheC5zZWN0b3IgPSBpb21hcC0+Ymxrbm8gKworCQkJKCgocG9zICYgUEFHRV9NQVNLKSAtIGlvbWFwLT5vZmZzZXQpID4+IDkpOworCQlkYXguc2l6ZSA9IChsZW5ndGggKyBvZmZzZXQgKyBQQUdFX1NJWkUgLSAxKSAmIFBBR0VfTUFTSzsKKwkJbWFwX2xlbiA9IGRheF9tYXBfYXRvbWljKGlvbWFwLT5iZGV2LCAmZGF4KTsKKwkJaWYgKG1hcF9sZW4gPCAwKSB7CisJCQlyZXQgPSBtYXBfbGVuOworCQkJYnJlYWs7CisJCX0KKworCQlkYXguYWRkciArPSBvZmZzZXQ7CisJCW1hcF9sZW4gLT0gb2Zmc2V0OworCQlpZiAobWFwX2xlbiA+IGVuZCAtIHBvcykKKwkJCW1hcF9sZW4gPSBlbmQgLSBwb3M7CisKKwkJaWYgKGlvdl9pdGVyX3J3KGl0ZXIpID09IFdSSVRFKQorCQkJbWFwX2xlbiA9IGNvcHlfZnJvbV9pdGVyX3BtZW0oZGF4LmFkZHIsIG1hcF9sZW4sIGl0ZXIpOworCQllbHNlCisJCQltYXBfbGVuID0gY29weV90b19pdGVyKGRheC5hZGRyLCBtYXBfbGVuLCBpdGVyKTsKKwkJZGF4X3VubWFwX2F0b21pYyhpb21hcC0+YmRldiwgJmRheCk7CisJCWlmIChtYXBfbGVuIDw9IDApIHsKKwkJCXJldCA9IG1hcF9sZW4gPyBtYXBfbGVuIDogLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJcG9zICs9IG1hcF9sZW47CisJCWxlbmd0aCAtPSBtYXBfbGVuOworCQlkb25lICs9IG1hcF9sZW47CisJfQorCisJcmV0dXJuIGRvbmUgPyBkb25lIDogcmV0OworfQorCisvKioKKyAqIGlvbWFwX2RheF9ydyAtIFBlcmZvcm0gSS9PIHRvIGEgREFYIGZpbGUKKyAqIEBpb2NiOglUaGUgY29udHJvbCBibG9jayBmb3IgdGhpcyBJL08KKyAqIEBpdGVyOglUaGUgYWRkcmVzc2VzIHRvIGRvIEkvTyBmcm9tIG9yIHRvCisgKiBAb3BzOglpb21hcCBvcHMgcGFzc2VkIGZyb20gdGhlIGZpbGUgc3lzdGVtCisgKgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyByZWFkIGFuZCB3cml0ZSBvcGVyYXRpb25zIHRvIGRpcmVjdGx5IG1hcHBlZAorICogcGVyc2lzdGVudCBtZW1vcnkuICBUaGUgY2FsbGVycyBuZWVkcyB0byB0YWtlIGNhcmUgb2YgcmVhZC93cml0ZSBleGNsdXNpb24KKyAqIGFuZCBldmljdGluZyBhbnkgcGFnZSBjYWNoZSBwYWdlcyBpbiB0aGUgcmVnaW9uIHVuZGVyIEkvTy4KKyAqLworc3NpemVfdAoraW9tYXBfZGF4X3J3KHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICppdGVyLAorCQlzdHJ1Y3QgaW9tYXBfb3BzICpvcHMpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpb2NiLT5raV9maWxwLT5mX21hcHBpbmc7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJbG9mZl90IHBvcyA9IGlvY2ItPmtpX3BvcywgcmV0ID0gMCwgZG9uZSA9IDA7CisJdW5zaWduZWQgZmxhZ3MgPSAwOworCisJaWYgKGlvdl9pdGVyX3J3KGl0ZXIpID09IFdSSVRFKQorCQlmbGFncyB8PSBJT01BUF9XUklURTsKKworCS8qCisJICogWWVzLCBldmVuIERBWCBmaWxlcyBjYW4gaGF2ZSBwYWdlIGNhY2hlIGF0dGFjaGVkIHRvIHRoZW06ICBBIHplcm9lZAorCSAqIHBhZ2UgaXMgaW5zZXJ0ZWQgaW50byB0aGUgcGFnZWNhY2hlIHdoZW4gd2UgaGF2ZSB0byBzZXJ2ZSBhIHdyaXRlCisJICogZmF1bHQgb24gYSBob2xlLiAgSXQgc2hvdWxkIG5ldmVyIGJlIGRpcnRpZWQgYW5kIGNhbiBzaW1wbHkgYmUKKwkgKiBkcm9wcGVkIGZyb20gdGhlIHBhZ2VjYWNoZSBvbmNlIHdlIGdldCByZWFsIGRhdGEgZm9yIHRoZSBwYWdlLgorCSAqCisJICogWFhYOiBUaGlzIGlzIHJhY3kgYWdhaW5zdCBtbWFwLCBhbmQgdGhlcmUncyBub3RoaW5nIHdlIGNhbiBkbyBhYm91dAorCSAqIGl0LiBXZSdsbCBldmVudHVhbGx5IG5lZWQgdG8gc2hpZnQgdGhpcyBkb3duIGV2ZW4gZnVydGhlciBzbyB0aGF0CisJICogd2UgY2FuIGNoZWNrIGlmIHdlIGFsbG9jYXRlZCBibG9ja3Mgb3ZlciBhIGhvbGUgZmlyc3QuCisJICovCisJaWYgKG1hcHBpbmctPm5ycGFnZXMpIHsKKwkJcmV0ID0gaW52YWxpZGF0ZV9pbm9kZV9wYWdlczJfcmFuZ2UobWFwcGluZywKKwkJCQlwb3MgPj4gUEFHRV9TSElGVCwKKwkJCQkocG9zICsgaW92X2l0ZXJfY291bnQoaXRlcikgLSAxKSA+PiBQQUdFX1NISUZUKTsKKwkJV0FSTl9PTl9PTkNFKHJldCk7CisJfQorCisJd2hpbGUgKGlvdl9pdGVyX2NvdW50KGl0ZXIpKSB7CisJCXJldCA9IGlvbWFwX2FwcGx5KGlub2RlLCBwb3MsIGlvdl9pdGVyX2NvdW50KGl0ZXIpLCBmbGFncywgb3BzLAorCQkJCWl0ZXIsIGlvbWFwX2RheF9hY3Rvcik7CisJCWlmIChyZXQgPD0gMCkKKwkJCWJyZWFrOworCQlwb3MgKz0gcmV0OworCQlkb25lICs9IHJldDsKKwl9CisKKwlpb2NiLT5raV9wb3MgKz0gZG9uZTsKKwlyZXR1cm4gZG9uZSA/IGRvbmUgOiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpb21hcF9kYXhfcncpOworCisvKioKKyAqIGlvbWFwX2RheF9mYXVsdCAtIGhhbmRsZSBhIHBhZ2UgZmF1bHQgb24gYSBEQVggZmlsZQorICogQHZtYTogVGhlIHZpcnR1YWwgbWVtb3J5IGFyZWEgd2hlcmUgdGhlIGZhdWx0IG9jY3VycmVkCisgKiBAdm1mOiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGZhdWx0CisgKiBAb3BzOiBpb21hcCBvcHMgcGFzc2VkIGZyb20gdGhlIGZpbGUgc3lzdGVtCisgKgorICogV2hlbiBhIHBhZ2UgZmF1bHQgb2NjdXJzLCBmaWxlc3lzdGVtcyBtYXkgY2FsbCB0aGlzIGhlbHBlciBpbiB0aGVpciBmYXVsdAorICogb3IgbWt3cml0ZSBoYW5kbGVyIGZvciBEQVggZmlsZXMuIEFzc3VtZXMgdGhlIGNhbGxlciBoYXMgZG9uZSBhbGwgdGhlCisgKiBuZWNlc3NhcnkgbG9ja2luZyBmb3IgdGhlIHBhZ2UgZmF1bHQgdG8gcHJvY2VlZCBzdWNjZXNzZnVsbHkuCisgKi8KK2ludCBpb21hcF9kYXhfZmF1bHQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCB2bV9mYXVsdCAqdm1mLAorCQkJc3RydWN0IGlvbWFwX29wcyAqb3BzKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gdm1hLT52bV9maWxlLT5mX21hcHBpbmc7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJdW5zaWduZWQgbG9uZyB2YWRkciA9ICh1bnNpZ25lZCBsb25nKXZtZi0+dmlydHVhbF9hZGRyZXNzOworCWxvZmZfdCBwb3MgPSAobG9mZl90KXZtZi0+cGdvZmYgPDwgUEFHRV9TSElGVDsKKwlzZWN0b3JfdCBzZWN0b3I7CisJc3RydWN0IGlvbWFwIGlvbWFwID0geyAwIH07CisJdW5zaWduZWQgZmxhZ3MgPSAwOworCWludCBlcnJvciwgbWFqb3IgPSAwOworCXZvaWQgKmVudHJ5OworCisJLyoKKwkgKiBDaGVjayB3aGV0aGVyIG9mZnNldCBpc24ndCBiZXlvbmQgZW5kIG9mIGZpbGUgbm93LiBDYWxsZXIgaXMgc3VwcG9zZWQKKwkgKiB0byBob2xkIGxvY2tzIHNlcmlhbGl6aW5nIHVzIHdpdGggdHJ1bmNhdGUgLyBwdW5jaCBob2xlIHNvIHRoaXMgaXMKKwkgKiBhIHJlbGlhYmxlIHRlc3QuCisJICovCisJaWYgKHBvcyA+PSBpX3NpemVfcmVhZChpbm9kZSkpCisJCXJldHVybiBWTV9GQVVMVF9TSUdCVVM7CisKKwllbnRyeSA9IGdyYWJfbWFwcGluZ19lbnRyeShtYXBwaW5nLCB2bWYtPnBnb2ZmKTsKKwlpZiAoSVNfRVJSKGVudHJ5KSkgeworCQllcnJvciA9IFBUUl9FUlIoZW50cnkpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoKHZtZi0+ZmxhZ3MgJiBGQVVMVF9GTEFHX1dSSVRFKSAmJiAhdm1mLT5jb3dfcGFnZSkKKwkJZmxhZ3MgfD0gSU9NQVBfV1JJVEU7CisKKwkvKgorCSAqIE5vdGUgdGhhdCB3ZSBkb24ndCBib3RoZXIgdG8gdXNlIGlvbWFwX2FwcGx5IGhlcmU6IERBWCByZXF1aXJlZAorCSAqIHRoZSBmaWxlIHN5c3RlbSBibG9jayBzaXplIHRvIGJlIGVxdWFsIHRoZSBwYWdlIHNpemUsIHdoaWNoIG1lYW5zCisJICogdGhhdCB3ZSBuZXZlciBoYXZlIHRvIGRlYWwgd2l0aCBtb3JlIHRoYW4gYSBzaW5nbGUgZXh0ZW50IGhlcmUuCisJICovCisJZXJyb3IgPSBvcHMtPmlvbWFwX2JlZ2luKGlub2RlLCBwb3MsIFBBR0VfU0laRSwgZmxhZ3MsICZpb21hcCk7CisJaWYgKGVycm9yKQorCQlnb3RvIHVubG9ja19lbnRyeTsKKwlpZiAoV0FSTl9PTl9PTkNFKGlvbWFwLm9mZnNldCArIGlvbWFwLmxlbmd0aCA8IHBvcyArIFBBR0VfU0laRSkpIHsKKwkJZXJyb3IgPSAtRUlPOwkJLyogZnMgY29ycnVwdGlvbj8gKi8KKwkJZ290byB1bmxvY2tfZW50cnk7CisJfQorCisJc2VjdG9yID0gaW9tYXAuYmxrbm8gKyAoKChwb3MgJiBQQUdFX01BU0spIC0gaW9tYXAub2Zmc2V0KSA+PiA5KTsKKworCWlmICh2bWYtPmNvd19wYWdlKSB7CisJCXN3aXRjaCAoaW9tYXAudHlwZSkgeworCQljYXNlIElPTUFQX0hPTEU6CisJCWNhc2UgSU9NQVBfVU5XUklUVEVOOgorCQkJY2xlYXJfdXNlcl9oaWdocGFnZSh2bWYtPmNvd19wYWdlLCB2YWRkcik7CisJCQlicmVhazsKKwkJY2FzZSBJT01BUF9NQVBQRUQ6CisJCQllcnJvciA9IGNvcHlfdXNlcl9kYXgoaW9tYXAuYmRldiwgc2VjdG9yLCBQQUdFX1NJWkUsCisJCQkJCXZtZi0+Y293X3BhZ2UsIHZhZGRyKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJV0FSTl9PTl9PTkNFKDEpOworCQkJZXJyb3IgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZXJyb3IpCisJCQlnb3RvIHVubG9ja19lbnRyeTsKKwkJaWYgKCFyYWRpeF90cmVlX2V4Y2VwdGlvbmFsX2VudHJ5KGVudHJ5KSkgeworCQkJdm1mLT5wYWdlID0gZW50cnk7CisJCQlyZXR1cm4gVk1fRkFVTFRfTE9DS0VEOworCQl9CisJCXZtZi0+ZW50cnkgPSBlbnRyeTsKKwkJcmV0dXJuIFZNX0ZBVUxUX0RBWF9MT0NLRUQ7CisJfQorCisJc3dpdGNoIChpb21hcC50eXBlKSB7CisJY2FzZSBJT01BUF9NQVBQRUQ6CisJCWlmIChpb21hcC5mbGFncyAmIElPTUFQX0ZfTkVXKSB7CisJCQljb3VudF92bV9ldmVudChQR01BSkZBVUxUKTsKKwkJCW1lbV9jZ3JvdXBfY291bnRfdm1fZXZlbnQodm1hLT52bV9tbSwgUEdNQUpGQVVMVCk7CisJCQltYWpvciA9IFZNX0ZBVUxUX01BSk9SOworCQl9CisJCWVycm9yID0gZGF4X2luc2VydF9tYXBwaW5nKG1hcHBpbmcsIGlvbWFwLmJkZXYsIHNlY3RvciwKKwkJCQlQQUdFX1NJWkUsICZlbnRyeSwgdm1hLCB2bWYpOworCQlicmVhazsKKwljYXNlIElPTUFQX1VOV1JJVFRFTjoKKwljYXNlIElPTUFQX0hPTEU6CisJCWlmICghKHZtZi0+ZmxhZ3MgJiBGQVVMVF9GTEFHX1dSSVRFKSkKKwkJCXJldHVybiBkYXhfbG9hZF9ob2xlKG1hcHBpbmcsIGVudHJ5LCB2bWYpOworCQkvKkZBTExUSFJVKi8KKwlkZWZhdWx0OgorCQlXQVJOX09OX09OQ0UoMSk7CisJCWVycm9yID0gLUVJTzsKKwkJYnJlYWs7CisJfQorCisgdW5sb2NrX2VudHJ5OgorCXB1dF9sb2NrZWRfbWFwcGluZ19lbnRyeShtYXBwaW5nLCB2bWYtPnBnb2ZmLCBlbnRyeSk7Cisgb3V0OgorCWlmIChlcnJvciA9PSAtRU5PTUVNKQorCQlyZXR1cm4gVk1fRkFVTFRfT09NIHwgbWFqb3I7CisJLyogLUVCVVNZIGlzIGZpbmUsIHNvbWVib2R5IGVsc2UgZmF1bHRlZCBvbiB0aGUgc2FtZSBQVEUgKi8KKwlpZiAoZXJyb3IgPCAwICYmIGVycm9yICE9IC1FQlVTWSkKKwkJcmV0dXJuIFZNX0ZBVUxUX1NJR0JVUyB8IG1ham9yOworCXJldHVybiBWTV9GQVVMVF9OT1BBR0UgfCBtYWpvcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlvbWFwX2RheF9mYXVsdCk7CisjZW5kaWYgLyogQ09ORklHX0ZTX0lPTUFQICovCmRpZmYgLS1naXQgYS9mcy9kZWJ1Z2ZzL2ZpbGUuYyBiL2ZzL2RlYnVnZnMvZmlsZS5jCmluZGV4IDU5MjA1OWYuLjM1NGUyYWIgMTAwNjQ0Ci0tLSBhL2ZzL2RlYnVnZnMvZmlsZS5jCisrKyBiL2ZzL2RlYnVnZnMvZmlsZS5jCkBAIC05Nyw5ICs5Nyw2IEBACiAKICNkZWZpbmUgRl9ERU5UUlkoZmlscCkgKChmaWxwKS0+Zl9wYXRoLmRlbnRyeSkKIAotI2RlZmluZSBSRUFMX0ZPUFNfREVSRUYoZGVudHJ5KQkJCQkJXAotCSgoY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqKShkZW50cnkpLT5kX2ZzZGF0YSkKLQogc3RhdGljIGludCBvcGVuX3Byb3h5X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gRl9ERU5UUlkoZmlscCk7CkBAIC0xMTIsNyArMTA5LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcmVhbF9mb3BzID0gUkVBTF9GT1BTX0RFUkVGKGRlbnRyeSk7CisJcmVhbF9mb3BzID0gZGVidWdmc19yZWFsX2ZvcHMoZmlscCk7CiAJcmVhbF9mb3BzID0gZm9wc19nZXQocmVhbF9mb3BzKTsKIAlpZiAoIXJlYWxfZm9wcykgewogCQkvKiBIdWg/IE1vZHVsZSBkaWQgbm90IGNsZWFuIHVwIGFmdGVyIGl0c2VsZiBhdCBleGl0PyAqLwpAQCAtMTQzLDcgKzE0MCw3IEBACiB7CQkJCQkJCQkJXAogCWNvbnN0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IEZfREVOVFJZKGZpbHApOwkJCVwKIAljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpyZWFsX2ZvcHMgPQkJCVwKLQkJUkVBTF9GT1BTX0RFUkVGKGRlbnRyeSk7CQkJCVwKKwkJZGVidWdmc19yZWFsX2ZvcHMoZmlscCk7CQkJCVwKIAlpbnQgc3JjdV9pZHg7CQkJCQkJCVwKIAlyZXRfdHlwZSByOwkJCQkJCQlcCiAJCQkJCQkJCQlcCkBAIC0xNzYsNyArMTczLDcgQEAKIAkJCQlzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCiB7CiAJY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gRl9ERU5UUlkoZmlscCk7Ci0JY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqcmVhbF9mb3BzID0gUkVBTF9GT1BTX0RFUkVGKGRlbnRyeSk7CisJY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqcmVhbF9mb3BzID0gZGVidWdmc19yZWFsX2ZvcHMoZmlscCk7CiAJaW50IHNyY3VfaWR4OwogCXVuc2lnbmVkIGludCByID0gMDsKIApAQCAtMTkzLDcgKzE5MCw3IEBACiBzdGF0aWMgaW50IGZ1bGxfcHJveHlfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAljb25zdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBGX0RFTlRSWShmaWxwKTsKLQljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpyZWFsX2ZvcHMgPSBSRUFMX0ZPUFNfREVSRUYoZGVudHJ5KTsKKwljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpyZWFsX2ZvcHMgPSBkZWJ1Z2ZzX3JlYWxfZm9wcyhmaWxwKTsKIAljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpwcm94eV9mb3BzID0gZmlscC0+Zl9vcDsKIAlpbnQgciA9IDA7CiAKQEAgLTIwOSw3ICsyMDYsNyBAQAogCXJlcGxhY2VfZm9wcyhmaWxwLCBkX2lub2RlKGRlbnRyeSktPmlfZm9wKTsKIAlrZnJlZSgodm9pZCAqKXByb3h5X2ZvcHMpOwogCWZvcHNfcHV0KHJlYWxfZm9wcyk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZnVsbF9wcm94eV9mb3BzX2luaXQoc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqcHJveHlfZm9wcywKQEAgLTI0MSw3ICsyMzgsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlyZWFsX2ZvcHMgPSBSRUFMX0ZPUFNfREVSRUYoZGVudHJ5KTsKKwlyZWFsX2ZvcHMgPSBkZWJ1Z2ZzX3JlYWxfZm9wcyhmaWxwKTsKIAlyZWFsX2ZvcHMgPSBmb3BzX2dldChyZWFsX2ZvcHMpOwogCWlmICghcmVhbF9mb3BzKSB7CiAJCS8qIEh1aD8gTW9kdWxlIGRpZCBub3QgY2xlYW51cCBhZnRlciBpdHNlbGYgYXQgZXhpdD8gKi8KZGlmZiAtLWdpdCBhL2ZzL2RlYnVnZnMvaW50ZXJuYWwuaCBiL2ZzL2RlYnVnZnMvaW50ZXJuYWwuaAppbmRleCBiYmE1MjYzLi5iM2U4NDQzIDEwMDY0NAotLS0gYS9mcy9kZWJ1Z2ZzL2ludGVybmFsLmgKKysrIGIvZnMvZGVidWdmcy9pbnRlcm5hbC5oCkBAIC0xOSw4ICsxOSw0IEBACiBleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z2ZzX29wZW5fcHJveHlfZmlsZV9vcGVyYXRpb25zOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVidWdmc19mdWxsX3Byb3h5X2ZpbGVfb3BlcmF0aW9uczsKIAotc3RydWN0IGRlbnRyeSAqZGVidWdmc19jcmVhdGVfZmlsZV91bnNhZmUoY29uc3QgY2hhciAqbmFtZSwgdW1vZGVfdCBtb2RlLAotCQkJCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIHZvaWQgKmRhdGEsCi0JCQkJCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMpOwotCiAjZW5kaWYgLyogX0RFQlVHRlNfSU5URVJOQUxfSF8gKi8KZGlmZiAtLWdpdCBhL2ZzL2RldnB0cy9pbm9kZS5jIGIvZnMvZGV2cHRzL2lub2RlLmMKaW5kZXggZDExNjQ1My4uNDQyZDFhNyAxMDA2NDQKLS0tIGEvZnMvZGV2cHRzL2lub2RlLmMKKysrIGIvZnMvZGV2cHRzL2lub2RlLmMKQEAgLTI3MiwxMyArMjcyLDggQEAKIAlzdHJ1Y3QgZGVudHJ5ICpyb290ID0gc2ItPnNfcm9vdDsKIAlzdHJ1Y3QgcHRzX2ZzX2luZm8gKmZzaSA9IERFVlBUU19TQihzYik7CiAJc3RydWN0IHB0c19tb3VudF9vcHRzICpvcHRzID0gJmZzaS0+bW91bnRfb3B0czsKLQlrdWlkX3Qgcm9vdF91aWQ7Ci0Ja2dpZF90IHJvb3RfZ2lkOwotCi0Jcm9vdF91aWQgPSBtYWtlX2t1aWQoY3VycmVudF91c2VyX25zKCksIDApOwotCXJvb3RfZ2lkID0gbWFrZV9rZ2lkKGN1cnJlbnRfdXNlcl9ucygpLCAwKTsKLQlpZiAoIXVpZF92YWxpZChyb290X3VpZCkgfHwgIWdpZF92YWxpZChyb290X2dpZCkpCi0JCXJldHVybiAtRUlOVkFMOworCWt1aWRfdCBwdG14X3VpZCA9IGN1cnJlbnRfZnN1aWQoKTsKKwlrZ2lkX3QgcHRteF9naWQgPSBjdXJyZW50X2ZzZ2lkKCk7CiAKIAlpbm9kZV9sb2NrKGRfaW5vZGUocm9vdCkpOwogCkBAIC0zMDksOCArMzA0LDggQEAKIAogCW1vZGUgPSBTX0lGQ0hSfG9wdHMtPnB0bXhtb2RlOwogCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgbW9kZSwgTUtERVYoVFRZQVVYX01BSk9SLCAyKSk7Ci0JaW5vZGUtPmlfdWlkID0gcm9vdF91aWQ7Ci0JaW5vZGUtPmlfZ2lkID0gcm9vdF9naWQ7CisJaW5vZGUtPmlfdWlkID0gcHRteF91aWQ7CisJaW5vZGUtPmlfZ2lkID0gcHRteF9naWQ7CiAKIAlkX2FkZChkZW50cnksIGlub2RlKTsKIApAQCAtMzM2LDcgKzMzMSw2IEBACiAJc3RydWN0IHB0c19mc19pbmZvICpmc2kgPSBERVZQVFNfU0Ioc2IpOwogCXN0cnVjdCBwdHNfbW91bnRfb3B0cyAqb3B0cyA9ICZmc2ktPm1vdW50X29wdHM7CiAKLQlzeW5jX2ZpbGVzeXN0ZW0oc2IpOwogCWVyciA9IHBhcnNlX21vdW50X29wdGlvbnMoZGF0YSwgUEFSU0VfUkVNT1VOVCwgb3B0cyk7CiAKIAkvKgpAQCAtMzk1LDYgKzM4OSw3IEBACiBkZXZwdHNfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgZXJyb3I7CiAKIAlzLT5zX2lmbGFncyAmPSB+U0JfSV9OT0RFVjsKIAlzLT5zX2Jsb2Nrc2l6ZSA9IDEwMjQ7CkBAIC00MDMsMTAgKzM5OCwxNiBAQAogCXMtPnNfb3AgPSAmZGV2cHRzX3NvcHM7CiAJcy0+c190aW1lX2dyYW4gPSAxOwogCisJZXJyb3IgPSAtRU5PTUVNOwogCXMtPnNfZnNfaW5mbyA9IG5ld19wdHNfZnNfaW5mbyhzKTsKIAlpZiAoIXMtPnNfZnNfaW5mbykKIAkJZ290byBmYWlsOwogCisJZXJyb3IgPSBwYXJzZV9tb3VudF9vcHRpb25zKGRhdGEsIFBBUlNFX01PVU5ULCAmREVWUFRTX1NCKHMpLT5tb3VudF9vcHRzKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZmFpbDsKKworCWVycm9yID0gLUVOT01FTTsKIAlpbm9kZSA9IG5ld19pbm9kZShzKTsKIAlpZiAoIWlub2RlKQogCQlnb3RvIGZhaWw7CkBAIC00MTgsMTMgKzQxOSwyMSBAQAogCXNldF9ubGluayhpbm9kZSwgMik7CiAKIAlzLT5zX3Jvb3QgPSBkX21ha2Vfcm9vdChpbm9kZSk7Ci0JaWYgKHMtPnNfcm9vdCkKLQkJcmV0dXJuIDA7CisJaWYgKCFzLT5zX3Jvb3QpIHsKKwkJcHJfZXJyKCJnZXQgcm9vdCBkZW50cnkgZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsOworCX0KIAotCXByX2VycigiZ2V0IHJvb3QgZGVudHJ5IGZhaWxlZFxuIik7CisJZXJyb3IgPSBta25vZF9wdG14KHMpOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsX2RwdXQ7CiAKKwlyZXR1cm4gMDsKK2ZhaWxfZHB1dDoKKwlkcHV0KHMtPnNfcm9vdCk7CisJcy0+c19yb290ID0gTlVMTDsKIGZhaWw6Ci0JcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIGVycm9yOwogfQogCiAvKgpAQCAtNDM2LDQzICs0NDUsMTUgQEAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZXZwdHNfbW91bnQoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCiAJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKIHsKLQlpbnQgZXJyb3I7Ci0Jc3RydWN0IHB0c19tb3VudF9vcHRzIG9wdHM7Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzOwotCi0JZXJyb3IgPSBwYXJzZV9tb3VudF9vcHRpb25zKGRhdGEsIFBBUlNFX01PVU5ULCAmb3B0cyk7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gRVJSX1BUUihlcnJvcik7Ci0KLQlzID0gc2dldChmc190eXBlLCBOVUxMLCBzZXRfYW5vbl9zdXBlciwgZmxhZ3MsIE5VTEwpOwotCWlmIChJU19FUlIocykpCi0JCXJldHVybiBFUlJfQ0FTVChzKTsKLQotCWlmICghcy0+c19yb290KSB7Ci0JCWVycm9yID0gZGV2cHRzX2ZpbGxfc3VwZXIocywgZGF0YSwgZmxhZ3MgJiBNU19TSUxFTlQgPyAxIDogMCk7Ci0JCWlmIChlcnJvcikKLQkJCWdvdG8gb3V0X3VuZG9fc2dldDsKLQkJcy0+c19mbGFncyB8PSBNU19BQ1RJVkU7Ci0JfQotCi0JbWVtY3B5KCYoREVWUFRTX1NCKHMpKS0+bW91bnRfb3B0cywgJm9wdHMsIHNpemVvZihvcHRzKSk7Ci0KLQllcnJvciA9IG1rbm9kX3B0bXgocyk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIG91dF91bmRvX3NnZXQ7Ci0KLQlyZXR1cm4gZGdldChzLT5zX3Jvb3QpOwotCi1vdXRfdW5kb19zZ2V0OgotCWRlYWN0aXZhdGVfbG9ja2VkX3N1cGVyKHMpOwotCXJldHVybiBFUlJfUFRSKGVycm9yKTsKKwlyZXR1cm4gbW91bnRfbm9kZXYoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIGRldnB0c19maWxsX3N1cGVyKTsKIH0KIAogc3RhdGljIHZvaWQgZGV2cHRzX2tpbGxfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgcHRzX2ZzX2luZm8gKmZzaSA9IERFVlBUU19TQihzYik7CiAKLQlpZGFfZGVzdHJveSgmZnNpLT5hbGxvY2F0ZWRfcHR5cyk7CisJaWYgKGZzaSkKKwkJaWRhX2Rlc3Ryb3koJmZzaS0+YWxsb2NhdGVkX3B0eXMpOwogCWtmcmVlKGZzaSk7CiAJa2lsbF9saXR0ZXJfc3VwZXIoc2IpOwogfQpAQCAtNTg1LDcgKzU2Niw4IEBACiAgKi8KIHZvaWQgKmRldnB0c19nZXRfcHJpdihzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7Ci0JV0FSTl9PTl9PTkNFKGRlbnRyeS0+ZF9zYi0+c19tYWdpYyAhPSBERVZQVFNfU1VQRVJfTUFHSUMpOworCWlmIChkZW50cnktPmRfc2ItPnNfbWFnaWMgIT0gREVWUFRTX1NVUEVSX01BR0lDKQorCQlyZXR1cm4gTlVMTDsKIAlyZXR1cm4gZGVudHJ5LT5kX2ZzZGF0YTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZGxtL2RlYnVnX2ZzLmMgYi9mcy9kbG0vZGVidWdfZnMuYwppbmRleCBlZWE2NDkxLi40NjZmN2Q2IDEwMDY0NAotLS0gYS9mcy9kbG0vZGVidWdfZnMuYworKysgYi9mcy9kbG0vZGVidWdfZnMuYwpAQCAtNjA3LDIwICs2MDcsNTQgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcm1hdDNfZm9wczsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcm1hdDRfZm9wczsKIAotc3RhdGljIGludCB0YWJsZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQorc3RhdGljIGludCB0YWJsZV9vcGVuMShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKLQlpbnQgcmV0ID0gLTE7CisJaW50IHJldDsKIAotCWlmIChmaWxlLT5mX29wID09ICZmb3JtYXQxX2ZvcHMpCi0JCXJldCA9IHNlcV9vcGVuKGZpbGUsICZmb3JtYXQxX3NlcV9vcHMpOwotCWVsc2UgaWYgKGZpbGUtPmZfb3AgPT0gJmZvcm1hdDJfZm9wcykKLQkJcmV0ID0gc2VxX29wZW4oZmlsZSwgJmZvcm1hdDJfc2VxX29wcyk7Ci0JZWxzZSBpZiAoZmlsZS0+Zl9vcCA9PSAmZm9ybWF0M19mb3BzKQotCQlyZXQgPSBzZXFfb3BlbihmaWxlLCAmZm9ybWF0M19zZXFfb3BzKTsKLQllbHNlIGlmIChmaWxlLT5mX29wID09ICZmb3JtYXQ0X2ZvcHMpCi0JCXJldCA9IHNlcV9vcGVuKGZpbGUsICZmb3JtYXQ0X3NlcV9vcHMpOworCXJldCA9IHNlcV9vcGVuKGZpbGUsICZmb3JtYXQxX3NlcV9vcHMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKKwlzZXEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc2VxLT5wcml2YXRlID0gaW5vZGUtPmlfcHJpdmF0ZTsgLyogdGhlIGRsbV9scyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhYmxlX29wZW4yKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzZXFfZmlsZSAqc2VxOworCWludCByZXQ7CisKKwlyZXQgPSBzZXFfb3BlbihmaWxlLCAmZm9ybWF0Ml9zZXFfb3BzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc2VxID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNlcS0+cHJpdmF0ZSA9IGlub2RlLT5pX3ByaXZhdGU7IC8qIHRoZSBkbG1fbHMgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YWJsZV9vcGVuMyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcTsKKwlpbnQgcmV0OworCisJcmV0ID0gc2VxX29wZW4oZmlsZSwgJmZvcm1hdDNfc2VxX29wcyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXNlcSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzZXEtPnByaXZhdGUgPSBpbm9kZS0+aV9wcml2YXRlOyAvKiB0aGUgZGxtX2xzICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGFibGVfb3BlbjQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNlcV9maWxlICpzZXE7CisJaW50IHJldDsKKworCXJldCA9IHNlcV9vcGVuKGZpbGUsICZmb3JtYXQ0X3NlcV9vcHMpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTYzMSw3ICs2NjUsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3JtYXQxX2ZvcHMgPSB7CiAJLm93bmVyICAgPSBUSElTX01PRFVMRSwKLQkub3BlbiAgICA9IHRhYmxlX29wZW4sCisJLm9wZW4gICAgPSB0YWJsZV9vcGVuMSwKIAkucmVhZCAgICA9IHNlcV9yZWFkLAogCS5sbHNlZWsgID0gc2VxX2xzZWVrLAogCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UKQEAgLTYzOSw3ICs2NzMsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3JtYXQyX2ZvcHMgPSB7CiAJLm93bmVyICAgPSBUSElTX01PRFVMRSwKLQkub3BlbiAgICA9IHRhYmxlX29wZW4sCisJLm9wZW4gICAgPSB0YWJsZV9vcGVuMiwKIAkucmVhZCAgICA9IHNlcV9yZWFkLAogCS5sbHNlZWsgID0gc2VxX2xzZWVrLAogCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UKQEAgLTY0Nyw3ICs2ODEsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3JtYXQzX2ZvcHMgPSB7CiAJLm93bmVyICAgPSBUSElTX01PRFVMRSwKLQkub3BlbiAgICA9IHRhYmxlX29wZW4sCisJLm9wZW4gICAgPSB0YWJsZV9vcGVuMywKIAkucmVhZCAgICA9IHNlcV9yZWFkLAogCS5sbHNlZWsgID0gc2VxX2xzZWVrLAogCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UKQEAgLTY1NSw3ICs2ODksNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3JtYXQ0X2ZvcHMgPSB7CiAJLm93bmVyICAgPSBUSElTX01PRFVMRSwKLQkub3BlbiAgICA9IHRhYmxlX29wZW4sCisJLm9wZW4gICAgPSB0YWJsZV9vcGVuNCwKIAkucmVhZCAgICA9IHNlcV9yZWFkLAogCS5sbHNlZWsgID0gc2VxX2xzZWVrLAogCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UKZGlmZiAtLWdpdCBhL2ZzL2VmaXZhcmZzL2lub2RlLmMgYi9mcy9lZml2YXJmcy9pbm9kZS5jCmluZGV4IDFkNzNmYzYuLmNiYjUwY2EgMTAwNjQ0Ci0tLSBhL2ZzL2VmaXZhcmZzL2lub2RlLmMKKysrIGIvZnMvZWZpdmFyZnMvaW5vZGUuYwpAQCAtMTA1LDcgKzEwNSwxMCBAQAogCiAJaW5vZGUtPmlfcHJpdmF0ZSA9IHZhcjsKIAotCWVmaXZhcl9lbnRyeV9hZGQodmFyLCAmZWZpdmFyZnNfbGlzdCk7CisJZXJyID0gZWZpdmFyX2VudHJ5X2FkZCh2YXIsICZlZml2YXJmc19saXN0KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwogCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CiAJZGdldChkZW50cnkpOwogb3V0OgpkaWZmIC0tZ2l0IGEvZnMvZWZpdmFyZnMvc3VwZXIuYyBiL2ZzL2VmaXZhcmZzL3N1cGVyLmMKaW5kZXggNjg4Y2NjMS4uZDdhN2M1MyAxMDA2NDQKLS0tIGEvZnMvZWZpdmFyZnMvc3VwZXIuYworKysgYi9mcy9lZml2YXJmcy9zdXBlci5jCkBAIC0xNTcsMTIgKzE1NywxNCBAQAogCQlnb3RvIGZhaWxfaW5vZGU7CiAJfQogCisJZWZpdmFyX2VudHJ5X3NpemUoZW50cnksICZzaXplKTsKKwllcnIgPSBlZml2YXJfZW50cnlfYWRkKGVudHJ5LCAmZWZpdmFyZnNfbGlzdCk7CisJaWYgKGVycikKKwkJZ290byBmYWlsX2lub2RlOworCiAJLyogY29waWVkIGJ5IHRoZSBhYm92ZSB0byBsb2NhbCBzdG9yYWdlIGluIHRoZSBkZW50cnkuICovCiAJa2ZyZWUobmFtZSk7CiAKLQllZml2YXJfZW50cnlfc2l6ZShlbnRyeSwgJnNpemUpOwotCWVmaXZhcl9lbnRyeV9hZGQoZW50cnksICZlZml2YXJmc19saXN0KTsKLQogCWlub2RlX2xvY2soaW5vZGUpOwogCWlub2RlLT5pX3ByaXZhdGUgPSBlbnRyeTsKIAlpX3NpemVfd3JpdGUoaW5vZGUsIHNpemUgKyBzaXplb2YoZW50cnktPnZhci5BdHRyaWJ1dGVzKSk7CkBAIC0xODIsNyArMTg0LDEwIEBACiAKIHN0YXRpYyBpbnQgZWZpdmFyZnNfZGVzdHJveShzdHJ1Y3QgZWZpdmFyX2VudHJ5ICplbnRyeSwgdm9pZCAqZGF0YSkKIHsKLQllZml2YXJfZW50cnlfcmVtb3ZlKGVudHJ5KTsKKwlpbnQgZXJyID0gZWZpdmFyX2VudHJ5X3JlbW92ZShlbnRyeSk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCWtmcmVlKGVudHJ5KTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2ZzL2V4dDIvS2NvbmZpZyBiL2ZzL2V4dDIvS2NvbmZpZwppbmRleCBjNjM0ODc0ZS4uMzZiZWE1YSAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9LY29uZmlnCisrKyBiL2ZzL2V4dDIvS2NvbmZpZwpAQCAtMSw1ICsxLDYgQEAKIGNvbmZpZyBFWFQyX0ZTCiAJdHJpc3RhdGUgIlNlY29uZCBleHRlbmRlZCBmcyBzdXBwb3J0IgorCXNlbGVjdCBGU19JT01BUCBpZiBGU19EQVgKIAloZWxwCiAJICBFeHQyIGlzIGEgc3RhbmRhcmQgTGludXggZmlsZSBzeXN0ZW0gZm9yIGhhcmQgZGlza3MuCiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvZXh0Mi5oIGIvZnMvZXh0Mi9leHQyLmgKaW5kZXggMDZhZjJmOS4uMzdlMmJlNyAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9leHQyLmgKKysrIGIvZnMvZXh0Mi9leHQyLmgKQEAgLTgxNCw2ICs4MTQsNyBAQAogLyogaW5vZGUuYyAqLwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZXh0Ml9hb3BzOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZXh0Ml9ub2JoX2FvcHM7CitleHRlcm4gc3RydWN0IGlvbWFwX29wcyBleHQyX2lvbWFwX29wczsKIAogLyogbmFtZWkuYyAqLwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGV4dDJfZGlyX2lub2RlX29wZXJhdGlvbnM7CmRpZmYgLS1naXQgYS9mcy9leHQyL2ZpbGUuYyBiL2ZzL2V4dDIvZmlsZS5jCmluZGV4IDVlZmVlZmUuLjQyM2NjMDEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvZmlsZS5jCisrKyBiL2ZzL2V4dDIvZmlsZS5jCkBAIC0yMiwxMSArMjIsNTkgQEAKICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvZGF4Lmg+CiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgogI2luY2x1ZGUgImV4dDIuaCIKICNpbmNsdWRlICJ4YXR0ci5oIgogI2luY2x1ZGUgImFjbC5oIgogCiAjaWZkZWYgQ09ORklHX0ZTX0RBWAorc3RhdGljIHNzaXplX3QgZXh0Ml9kYXhfcmVhZF9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICp0bykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gaW9jYi0+a2lfZmlscC0+Zl9tYXBwaW5nLT5ob3N0OworCXNzaXplX3QgcmV0OworCisJaWYgKCFpb3ZfaXRlcl9jb3VudCh0bykpCisJCXJldHVybiAwOyAvKiBza2lwIGF0aW1lICovCisKKwlpbm9kZV9sb2NrX3NoYXJlZChpbm9kZSk7CisJcmV0ID0gaW9tYXBfZGF4X3J3KGlvY2IsIHRvLCAmZXh0Ml9pb21hcF9vcHMpOworCWlub2RlX3VubG9ja19zaGFyZWQoaW5vZGUpOworCisJZmlsZV9hY2Nlc3NlZChpb2NiLT5raV9maWxwKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBleHQyX2RheF93cml0ZV9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKQoreworCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OworCXNzaXplX3QgcmV0OworCisJaW5vZGVfbG9jayhpbm9kZSk7CisJcmV0ID0gZ2VuZXJpY193cml0ZV9jaGVja3MoaW9jYiwgZnJvbSk7CisJaWYgKHJldCA8PSAwKQorCQlnb3RvIG91dF91bmxvY2s7CisJcmV0ID0gZmlsZV9yZW1vdmVfcHJpdnMoZmlsZSk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfdW5sb2NrOworCXJldCA9IGZpbGVfdXBkYXRlX3RpbWUoZmlsZSk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfdW5sb2NrOworCisJcmV0ID0gaW9tYXBfZGF4X3J3KGlvY2IsIGZyb20sICZleHQyX2lvbWFwX29wcyk7CisJaWYgKHJldCA+IDAgJiYgaW9jYi0+a2lfcG9zID4gaV9zaXplX3JlYWQoaW5vZGUpKSB7CisJCWlfc2l6ZV93cml0ZShpbm9kZSwgaW9jYi0+a2lfcG9zKTsKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJfQorCitvdXRfdW5sb2NrOgorCWlub2RlX3VubG9jayhpbm9kZSk7CisJaWYgKHJldCA+IDApCisJCXJldCA9IGdlbmVyaWNfd3JpdGVfc3luYyhpb2NiLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKIC8qCiAgKiBUaGUgbG9jayBvcmRlcmluZyBmb3IgZXh0MiBEQVggZmF1bHQgcGF0aHMgaXM6CiAgKgpAQCAtNTEsNyArOTksNyBAQAogCX0KIAlkb3duX3JlYWQoJmVpLT5kYXhfc2VtKTsKIAotCXJldCA9IGRheF9mYXVsdCh2bWEsIHZtZiwgZXh0Ml9nZXRfYmxvY2spOworCXJldCA9IGlvbWFwX2RheF9mYXVsdCh2bWEsIHZtZiwgJmV4dDJfaW9tYXBfb3BzKTsKIAogCXVwX3JlYWQoJmVpLT5kYXhfc2VtKTsKIAlpZiAodm1mLT5mbGFncyAmIEZBVUxUX0ZMQUdfV1JJVEUpCkBAIC0xNTYsMTQgKzIwNCwyOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qCi0gKiBXZSBoYXZlIG1vc3RseSBOVUxMJ3MgaGVyZTogdGhlIGN1cnJlbnQgZGVmYXVsdHMgYXJlIG9rIGZvcgotICogdGhlIGV4dDIgZmlsZXN5c3RlbS4KLSAqLworc3RhdGljIHNzaXplX3QgZXh0Ml9maWxlX3JlYWRfaXRlcihzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqdG8pCit7CisjaWZkZWYgQ09ORklHX0ZTX0RBWAorCWlmIChJU19EQVgoaW9jYi0+a2lfZmlscC0+Zl9tYXBwaW5nLT5ob3N0KSkKKwkJcmV0dXJuIGV4dDJfZGF4X3JlYWRfaXRlcihpb2NiLCB0byk7CisjZW5kaWYKKwlyZXR1cm4gZ2VuZXJpY19maWxlX3JlYWRfaXRlcihpb2NiLCB0byk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGV4dDJfZmlsZV93cml0ZV9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKQoreworI2lmZGVmIENPTkZJR19GU19EQVgKKwlpZiAoSVNfREFYKGlvY2ItPmtpX2ZpbHAtPmZfbWFwcGluZy0+aG9zdCkpCisJCXJldHVybiBleHQyX2RheF93cml0ZV9pdGVyKGlvY2IsIGZyb20pOworI2VuZGlmCisJcmV0dXJuIGdlbmVyaWNfZmlsZV93cml0ZV9pdGVyKGlvY2IsIGZyb20pOworfQorCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGV4dDJfZmlsZV9vcGVyYXRpb25zID0gewogCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKLQkucmVhZF9pdGVyCT0gZ2VuZXJpY19maWxlX3JlYWRfaXRlciwKLQkud3JpdGVfaXRlcgk9IGdlbmVyaWNfZmlsZV93cml0ZV9pdGVyLAorCS5yZWFkX2l0ZXIJPSBleHQyX2ZpbGVfcmVhZF9pdGVyLAorCS53cml0ZV9pdGVyCT0gZXh0Ml9maWxlX3dyaXRlX2l0ZXIsCiAJLnVubG9ja2VkX2lvY3RsID0gZXh0Ml9pb2N0bCwKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAJLmNvbXBhdF9pb2N0bAk9IGV4dDJfY29tcGF0X2lvY3RsLApkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9pYWxsb2MuYyBiL2ZzL2V4dDIvaWFsbG9jLmMKaW5kZXggZWZlNWZiMi4uMDRlNzNhOSAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9pYWxsb2MuYworKysgYi9mcy9leHQyL2lhbGxvYy5jCkBAIC00NjUsNiArNDY1LDExIEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgc2JpLT5zX2dyb3Vwc19jb3VudDsgaSsrKSB7CiAJCWdkcCA9IGV4dDJfZ2V0X2dyb3VwX2Rlc2Moc2IsIGdyb3VwLCAmYmgyKTsKKwkJaWYgKCFnZHApIHsKKwkJCWlmICgrK2dyb3VwID09IHNiaS0+c19ncm91cHNfY291bnQpCisJCQkJZ3JvdXAgPSAwOworCQkJY29udGludWU7CisJCX0KIAkJYnJlbHNlKGJpdG1hcF9iaCk7CiAJCWJpdG1hcF9iaCA9IHJlYWRfaW5vZGVfYml0bWFwKHNiLCBncm91cCk7CiAJCWlmICghYml0bWFwX2JoKSB7CmRpZmYgLS1naXQgYS9mcy9leHQyL2lub2RlLmMgYi9mcy9leHQyL2lub2RlLmMKaW5kZXggZDVjN2QwOS4uMWU3MmQ0MiAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9pbm9kZS5jCisrKyBiL2ZzL2V4dDIvaW5vZGUuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvbXBhZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9maWVtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pb21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAjaW5jbHVkZSAiZXh0Mi5oIgpAQCAtNjE4LDcgKzYxOSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgZXh0Ml9nZXRfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICBzZWN0b3JfdCBpYmxvY2ssIHVuc2lnbmVkIGxvbmcgbWF4YmxvY2tzLAotCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsCisJCQkgICB1MzIgKmJubywgYm9vbCAqbmV3LCBib29sICpib3VuZGFyeSwKIAkJCSAgIGludCBjcmVhdGUpCiB7CiAJaW50IGVyciA9IC1FSU87CkBAIC02NDQsNyArNjQ1LDYgQEAKIAkvKiBTaW1wbGVzdCBjYXNlIC0gYmxvY2sgZm91bmQsIG5vIGFsbG9jYXRpb24gbmVlZGVkICovCiAJaWYgKCFwYXJ0aWFsKSB7CiAJCWZpcnN0X2Jsb2NrID0gbGUzMl90b19jcHUoY2hhaW5bZGVwdGggLSAxXS5rZXkpOwotCQljbGVhcl9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7IC8qIFdoYXQncyB0aGlzIGRvPyAqLwogCQljb3VudCsrOwogCQkvKm1hcCBtb3JlIGJsb2NrcyovCiAJCXdoaWxlIChjb3VudCA8IG1heGJsb2NrcyAmJiBjb3VudCA8PSBibG9ja3NfdG9fYm91bmRhcnkpIHsKQEAgLTY5OSw3ICs2OTksNiBAQAogCQkJbXV0ZXhfdW5sb2NrKCZlaS0+dHJ1bmNhdGVfbXV0ZXgpOwogCQkJaWYgKGVycikKIAkJCQlnb3RvIGNsZWFudXA7Ci0JCQljbGVhcl9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CiAJCQlnb3RvIGdvdF9pdDsKIAkJfQogCX0KQEAgLTczMyw2ICs3MzIsMTYgQEAKIAl9CiAKIAlpZiAoSVNfREFYKGlub2RlKSkgeworCQlpbnQgaTsKKworCQkvKgorCQkgKiBXZSBtdXN0IHVubWFwIGJsb2NrcyBiZWZvcmUgemVyb2luZyBzbyB0aGF0IHdyaXRlYmFjayBjYW5ub3QKKwkJICogb3ZlcndyaXRlIHplcm9zIHdpdGggc3RhbGUgZGF0YSBmcm9tIGJsb2NrIGRldmljZSBwYWdlIGNhY2hlLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCXVubWFwX3VuZGVybHlpbmdfbWV0YWRhdGEoaW5vZGUtPmlfc2ItPnNfYmRldiwKKwkJCQkJbGUzMl90b19jcHUoY2hhaW5bZGVwdGgtMV0ua2V5KSArIGkpOworCQl9CiAJCS8qCiAJCSAqIGJsb2NrIG11c3QgYmUgaW5pdGlhbGlzZWQgYmVmb3JlIHdlIHB1dCBpdCBpbiB0aGUgdHJlZQogCQkgKiBzbyB0aGF0IGl0J3Mgbm90IGZvdW5kIGJ5IGFub3RoZXIgdGhyZWFkIGJlZm9yZSBpdCdzCkBAIC03NDUsMTUgKzc1NCwxNiBAQAogCQkJbXV0ZXhfdW5sb2NrKCZlaS0+dHJ1bmNhdGVfbXV0ZXgpOwogCQkJZ290byBjbGVhbnVwOwogCQl9Ci0JfSBlbHNlCi0JCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CisJfSBlbHNlIHsKKwkJKm5ldyA9IHRydWU7CisJfQogCiAJZXh0Ml9zcGxpY2VfYnJhbmNoKGlub2RlLCBpYmxvY2ssIHBhcnRpYWwsIGluZGlyZWN0X2Jsa3MsIGNvdW50KTsKIAltdXRleF91bmxvY2soJmVpLT50cnVuY2F0ZV9tdXRleCk7CiBnb3RfaXQ6Ci0JbWFwX2JoKGJoX3Jlc3VsdCwgaW5vZGUtPmlfc2IsIGxlMzJfdG9fY3B1KGNoYWluW2RlcHRoLTFdLmtleSkpOworCSpibm8gPSBsZTMyX3RvX2NwdShjaGFpbltkZXB0aC0xXS5rZXkpOwogCWlmIChjb3VudCA+IGJsb2Nrc190b19ib3VuZGFyeSkKLQkJc2V0X2J1ZmZlcl9ib3VuZGFyeShiaF9yZXN1bHQpOworCQkqYm91bmRhcnkgPSB0cnVlOwogCWVyciA9IGNvdW50OwogCS8qIENsZWFuIHVwIGFuZCBleGl0ICovCiAJcGFydGlhbCA9IGNoYWluICsgZGVwdGggLSAxOwkvKiB0aGUgd2hvbGUgY2hhaW4gKi8KQEAgLTc2NSwxOSArNzc1LDgyIEBACiAJcmV0dXJuIGVycjsKIH0KIAotaW50IGV4dDJfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlibG9jaywgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCitpbnQgZXh0Ml9nZXRfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgaWJsb2NrLAorCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKIHsKIAl1bnNpZ25lZCBtYXhfYmxvY2tzID0gYmhfcmVzdWx0LT5iX3NpemUgPj4gaW5vZGUtPmlfYmxrYml0czsKLQlpbnQgcmV0ID0gZXh0Ml9nZXRfYmxvY2tzKGlub2RlLCBpYmxvY2ssIG1heF9ibG9ja3MsCi0JCQkgICAgICBiaF9yZXN1bHQsIGNyZWF0ZSk7Ci0JaWYgKHJldCA+IDApIHsKLQkJYmhfcmVzdWx0LT5iX3NpemUgPSAocmV0IDw8IGlub2RlLT5pX2Jsa2JpdHMpOwotCQlyZXQgPSAwOwotCX0KLQlyZXR1cm4gcmV0OworCWJvb2wgbmV3ID0gZmFsc2UsIGJvdW5kYXJ5ID0gZmFsc2U7CisJdTMyIGJubzsKKwlpbnQgcmV0OworCisJcmV0ID0gZXh0Ml9nZXRfYmxvY2tzKGlub2RlLCBpYmxvY2ssIG1heF9ibG9ja3MsICZibm8sICZuZXcsICZib3VuZGFyeSwKKwkJCWNyZWF0ZSk7CisJaWYgKHJldCA8PSAwKQorCQlyZXR1cm4gcmV0OworCisJbWFwX2JoKGJoX3Jlc3VsdCwgaW5vZGUtPmlfc2IsIGJubyk7CisJYmhfcmVzdWx0LT5iX3NpemUgPSAocmV0IDw8IGlub2RlLT5pX2Jsa2JpdHMpOworCWlmIChuZXcpCisJCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CisJaWYgKGJvdW5kYXJ5KQorCQlzZXRfYnVmZmVyX2JvdW5kYXJ5KGJoX3Jlc3VsdCk7CisJcmV0dXJuIDA7CiAKIH0KIAorI2lmZGVmIENPTkZJR19GU19EQVgKK3N0YXRpYyBpbnQgZXh0Ml9pb21hcF9iZWdpbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgbGVuZ3RoLAorCQl1bnNpZ25lZCBmbGFncywgc3RydWN0IGlvbWFwICppb21hcCkKK3sKKwl1bnNpZ25lZCBpbnQgYmxrYml0cyA9IGlub2RlLT5pX2Jsa2JpdHM7CisJdW5zaWduZWQgbG9uZyBmaXJzdF9ibG9jayA9IG9mZnNldCA+PiBibGtiaXRzOworCXVuc2lnbmVkIGxvbmcgbWF4X2Jsb2NrcyA9IChsZW5ndGggKyAoMSA8PCBibGtiaXRzKSAtIDEpID4+IGJsa2JpdHM7CisJYm9vbCBuZXcgPSBmYWxzZSwgYm91bmRhcnkgPSBmYWxzZTsKKwl1MzIgYm5vOworCWludCByZXQ7CisKKwlyZXQgPSBleHQyX2dldF9ibG9ja3MoaW5vZGUsIGZpcnN0X2Jsb2NrLCBtYXhfYmxvY2tzLAorCQkJJmJubywgJm5ldywgJmJvdW5kYXJ5LCBmbGFncyAmIElPTUFQX1dSSVRFKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlvbWFwLT5mbGFncyA9IDA7CisJaW9tYXAtPmJkZXYgPSBpbm9kZS0+aV9zYi0+c19iZGV2OworCWlvbWFwLT5vZmZzZXQgPSAodTY0KWZpcnN0X2Jsb2NrIDw8IGJsa2JpdHM7CisKKwlpZiAocmV0ID09IDApIHsKKwkJaW9tYXAtPnR5cGUgPSBJT01BUF9IT0xFOworCQlpb21hcC0+Ymxrbm8gPSBJT01BUF9OVUxMX0JMT0NLOworCQlpb21hcC0+bGVuZ3RoID0gMSA8PCBibGtiaXRzOworCX0gZWxzZSB7CisJCWlvbWFwLT50eXBlID0gSU9NQVBfTUFQUEVEOworCQlpb21hcC0+Ymxrbm8gPSAoc2VjdG9yX3QpYm5vIDw8IChibGtiaXRzIC0gOSk7CisJCWlvbWFwLT5sZW5ndGggPSAodTY0KXJldCA8PCBibGtiaXRzOworCQlpb21hcC0+ZmxhZ3MgfD0gSU9NQVBfRl9NRVJHRUQ7CisJfQorCisJaWYgKG5ldykKKwkJaW9tYXAtPmZsYWdzIHw9IElPTUFQX0ZfTkVXOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitleHQyX2lvbWFwX2VuZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgbGVuZ3RoLAorCQlzc2l6ZV90IHdyaXR0ZW4sIHVuc2lnbmVkIGZsYWdzLCBzdHJ1Y3QgaW9tYXAgKmlvbWFwKQoreworCWlmIChpb21hcC0+dHlwZSA9PSBJT01BUF9NQVBQRUQgJiYKKwkgICAgd3JpdHRlbiA8IGxlbmd0aCAmJgorCSAgICAoZmxhZ3MgJiBJT01BUF9XUklURSkpCisJCWV4dDJfd3JpdGVfZmFpbGVkKGlub2RlLT5pX21hcHBpbmcsIG9mZnNldCArIGxlbmd0aCk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBpb21hcF9vcHMgZXh0Ml9pb21hcF9vcHMgPSB7CisJLmlvbWFwX2JlZ2luCQk9IGV4dDJfaW9tYXBfYmVnaW4sCisJLmlvbWFwX2VuZAkJPSBleHQyX2lvbWFwX2VuZCwKK307CisjZW5kaWYgLyogQ09ORklHX0ZTX0RBWCAqLworCiBpbnQgZXh0Ml9maWVtYXAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbywKIAkJdTY0IHN0YXJ0LCB1NjQgbGVuKQogewpAQCAtODYzLDExICs5MzYsMTAgQEAKIAlsb2ZmX3Qgb2Zmc2V0ID0gaW9jYi0+a2lfcG9zOwogCXNzaXplX3QgcmV0OwogCi0JaWYgKElTX0RBWChpbm9kZSkpCi0JCXJldCA9IGRheF9kb19pbyhpb2NiLCBpbm9kZSwgaXRlciwgZXh0Ml9nZXRfYmxvY2ssIE5VTEwsCi0JCQkJRElPX0xPQ0tJTkcpOwotCWVsc2UKLQkJcmV0ID0gYmxvY2tkZXZfZGlyZWN0X0lPKGlvY2IsIGlub2RlLCBpdGVyLCBleHQyX2dldF9ibG9jayk7CisJaWYgKFdBUk5fT05fT05DRShJU19EQVgoaW5vZGUpKSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXQgPSBibG9ja2Rldl9kaXJlY3RfSU8oaW9jYiwgaW5vZGUsIGl0ZXIsIGV4dDJfZ2V0X2Jsb2NrKTsKIAlpZiAocmV0IDwgMCAmJiBpb3ZfaXRlcl9ydyhpdGVyKSA9PSBXUklURSkKIAkJZXh0Ml93cml0ZV9mYWlsZWQobWFwcGluZywgb2Zmc2V0ICsgY291bnQpOwogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2lub2RlLmMgYi9mcy9leHQ0L2lub2RlLmMKaW5kZXggMzEzMTc0Ny4uYzZlYTI1YSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9pbm9kZS5jCisrKyBiL2ZzL2V4dDQvaW5vZGUuYwpAQCAtNTQ2Niw4ICs1NDY2LDYgQEAKIAkJCQkJCSAgICAgIHNiaS0+c193YW50X2V4dHJhX2lzaXplLAogCQkJCQkJICAgICAgaWxvYywgaGFuZGxlKTsKIAkJCWlmIChyZXQpIHsKLQkJCQlleHQ0X3NldF9pbm9kZV9zdGF0ZShpbm9kZSwKLQkJCQkJCSAgICAgRVhUNF9TVEFURV9OT19FWFBBTkQpOwogCQkJCWlmIChtbnRfY291bnQgIT0KIAkJCQkJbGUxNl90b19jcHUoc2JpLT5zX2VzLT5zX21udF9jb3VudCkpIHsKIAkJCQkJZXh0NF93YXJuaW5nKGlub2RlLT5pX3NiLApkaWZmIC0tZ2l0IGEvZnMvZXh0NC9pb2N0bC5jIGIvZnMvZXh0NC9pb2N0bC5jCmluZGV4IDEwNjg2ZmQuLjFiYjdkZjUgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaW9jdGwuYworKysgYi9mcy9leHQ0L2lvY3RsLmMKQEAgLTc3Niw3ICs3NzYsNyBAQAogCQkJCSAgIChzdHJ1Y3QgZnNjcnlwdF9wb2xpY3kgX191c2VyICopYXJnLAogCQkJCSAgIHNpemVvZihwb2xpY3kpKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gZnNjcnlwdF9wcm9jZXNzX3BvbGljeShpbm9kZSwgJnBvbGljeSk7CisJCXJldHVybiBmc2NyeXB0X3Byb2Nlc3NfcG9saWN5KGZpbHAsICZwb2xpY3kpOwogI2Vsc2UKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9leHQ0L3N1cGVyLmMgYi9mcy9leHQ0L3N1cGVyLmMKaW5kZXggMWM1OTNhYS4uM2VjODcwOCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9zdXBlci5jCisrKyBiL2ZzL2V4dDQvc3VwZXIuYwpAQCAtMjIxMSw2ICsyMjExLDcgQEAKIAogLyogQ2FsbGVkIGF0IG1vdW50LXRpbWUsIHN1cGVyLWJsb2NrIGlzIGxvY2tlZCAqLwogc3RhdGljIGludCBleHQ0X2NoZWNrX2Rlc2NyaXB0b3JzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICBleHQ0X2ZzYmxrX3Qgc2JfYmxvY2ssCiAJCQkJICBleHQ0X2dyb3VwX3QgKmZpcnN0X25vdF96ZXJvZWQpCiB7CiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7CkBAIC0yMjQxLDYgKzIyNDIsMTEgQEAKIAkJCWdycCA9IGk7CiAKIAkJYmxvY2tfYml0bWFwID0gZXh0NF9ibG9ja19iaXRtYXAoc2IsIGdkcCk7CisJCWlmIChibG9ja19iaXRtYXAgPT0gc2JfYmxvY2spIHsKKwkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgImV4dDRfY2hlY2tfZGVzY3JpcHRvcnM6ICIKKwkJCQkgIkJsb2NrIGJpdG1hcCBmb3IgZ3JvdXAgJXUgb3ZlcmxhcHMgIgorCQkJCSAic3VwZXJibG9jayIsIGkpOworCQl9CiAJCWlmIChibG9ja19iaXRtYXAgPCBmaXJzdF9ibG9jayB8fCBibG9ja19iaXRtYXAgPiBsYXN0X2Jsb2NrKSB7CiAJCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJleHQ0X2NoZWNrX2Rlc2NyaXB0b3JzOiAiCiAJCQkgICAgICAgIkJsb2NrIGJpdG1hcCBmb3IgZ3JvdXAgJXUgbm90IGluIGdyb3VwICIKQEAgLTIyNDgsNiArMjI1NCwxMSBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAkJaW5vZGVfYml0bWFwID0gZXh0NF9pbm9kZV9iaXRtYXAoc2IsIGdkcCk7CisJCWlmIChpbm9kZV9iaXRtYXAgPT0gc2JfYmxvY2spIHsKKwkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgImV4dDRfY2hlY2tfZGVzY3JpcHRvcnM6ICIKKwkJCQkgIklub2RlIGJpdG1hcCBmb3IgZ3JvdXAgJXUgb3ZlcmxhcHMgIgorCQkJCSAic3VwZXJibG9jayIsIGkpOworCQl9CiAJCWlmIChpbm9kZV9iaXRtYXAgPCBmaXJzdF9ibG9jayB8fCBpbm9kZV9iaXRtYXAgPiBsYXN0X2Jsb2NrKSB7CiAJCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJleHQ0X2NoZWNrX2Rlc2NyaXB0b3JzOiAiCiAJCQkgICAgICAgIklub2RlIGJpdG1hcCBmb3IgZ3JvdXAgJXUgbm90IGluIGdyb3VwICIKQEAgLTIyNTUsNiArMjI2NiwxMSBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAkJaW5vZGVfdGFibGUgPSBleHQ0X2lub2RlX3RhYmxlKHNiLCBnZHApOworCQlpZiAoaW5vZGVfdGFibGUgPT0gc2JfYmxvY2spIHsKKwkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgImV4dDRfY2hlY2tfZGVzY3JpcHRvcnM6ICIKKwkJCQkgIklub2RlIHRhYmxlIGZvciBncm91cCAldSBvdmVybGFwcyAiCisJCQkJICJzdXBlcmJsb2NrIiwgaSk7CisJCX0KIAkJaWYgKGlub2RlX3RhYmxlIDwgZmlyc3RfYmxvY2sgfHwKIAkJICAgIGlub2RlX3RhYmxlICsgc2JpLT5zX2l0Yl9wZXJfZ3JvdXAgLSAxID4gbGFzdF9ibG9jaykgewogCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiZXh0NF9jaGVja19kZXNjcmlwdG9yczogIgpAQCAtMzc1Nyw3ICszNzczLDcgQEAKIAkJCWdvdG8gZmFpbGVkX21vdW50MjsKIAkJfQogCX0KLQlpZiAoIWV4dDRfY2hlY2tfZGVzY3JpcHRvcnMoc2IsICZmaXJzdF9ub3RfemVyb2VkKSkgeworCWlmICghZXh0NF9jaGVja19kZXNjcmlwdG9ycyhzYiwgbG9naWNhbF9zYl9ibG9jaywgJmZpcnN0X25vdF96ZXJvZWQpKSB7CiAJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgImdyb3VwIGRlc2NyaXB0b3JzIGNvcnJ1cHRlZCEiKTsKIAkJcmV0ID0gLUVGU0NPUlJVUFRFRDsKIAkJZ290byBmYWlsZWRfbW91bnQyOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC94YXR0ci5jIGIvZnMvZXh0NC94YXR0ci5jCmluZGV4IDM5ZTljZmIuLjJlYjkzNWMgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQveGF0dHIuYworKysgYi9mcy9leHQ0L3hhdHRyLmMKQEAgLTEzNTMsMTUgKzEzNTMsMTkgQEAKIAlzaXplX3QgbWluX29mZnMsIGZyZWU7CiAJaW50IHRvdGFsX2lubzsKIAl2b2lkICpiYXNlLCAqc3RhcnQsICplbmQ7Ci0JaW50IGV4dHJhX2lzaXplID0gMCwgZXJyb3IgPSAwLCB0cmllZF9taW5fZXh0cmFfaXNpemUgPSAwOworCWludCBlcnJvciA9IDAsIHRyaWVkX21pbl9leHRyYV9pc2l6ZSA9IDA7CiAJaW50IHNfbWluX2V4dHJhX2lzaXplID0gbGUxNl90b19jcHUoRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfZXMtPnNfbWluX2V4dHJhX2lzaXplKTsKKwlpbnQgaXNpemVfZGlmZjsJLyogSG93IG11Y2ggZG8gd2UgbmVlZCB0byBncm93IGlfZXh0cmFfaXNpemUgKi8KIAogCWRvd25fd3JpdGUoJkVYVDRfSShpbm9kZSktPnhhdHRyX3NlbSk7CisJLyoKKwkgKiBTZXQgRVhUNF9TVEFURV9OT19FWFBBTkQgdG8gYXZvaWQgcmVjdXJzaW9uIHdoZW4gbWFya2luZyBpbm9kZSBkaXJ0eQorCSAqLworCWV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX05PX0VYUEFORCk7CiByZXRyeToKLQlpZiAoRVhUNF9JKGlub2RlKS0+aV9leHRyYV9pc2l6ZSA+PSBuZXdfZXh0cmFfaXNpemUpIHsKLQkJdXBfd3JpdGUoJkVYVDRfSShpbm9kZSktPnhhdHRyX3NlbSk7Ci0JCXJldHVybiAwOwotCX0KKwlpc2l6ZV9kaWZmID0gbmV3X2V4dHJhX2lzaXplIC0gRVhUNF9JKGlub2RlKS0+aV9leHRyYV9pc2l6ZTsKKwlpZiAoRVhUNF9JKGlub2RlKS0+aV9leHRyYV9pc2l6ZSA+PSBuZXdfZXh0cmFfaXNpemUpCisJCWdvdG8gb3V0OwogCiAJaGVhZGVyID0gSUhEUihpbm9kZSwgcmF3X2lub2RlKTsKIAllbnRyeSA9IElGSVJTVChoZWFkZXIpOwpAQCAtMTM4Miw3ICsxMzg2LDcgQEAKIAkJZ290byBjbGVhbnVwOwogCiAJZnJlZSA9IGV4dDRfeGF0dHJfZnJlZV9zcGFjZShsYXN0LCAmbWluX29mZnMsIGJhc2UsICZ0b3RhbF9pbm8pOwotCWlmIChmcmVlID49IG5ld19leHRyYV9pc2l6ZSkgeworCWlmIChmcmVlID49IGlzaXplX2RpZmYpIHsKIAkJZW50cnkgPSBJRklSU1QoaGVhZGVyKTsKIAkJZXh0NF94YXR0cl9zaGlmdF9lbnRyaWVzKGVudHJ5LAlFWFQ0X0koaW5vZGUpLT5pX2V4dHJhX2lzaXplCiAJCQkJLSBuZXdfZXh0cmFfaXNpemUsICh2b2lkICopcmF3X2lub2RlICsKQEAgLTEzOTAsOCArMTM5NCw3IEBACiAJCQkJKHZvaWQgKiloZWFkZXIsIHRvdGFsX2lubywKIAkJCQlpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOwogCQlFWFQ0X0koaW5vZGUpLT5pX2V4dHJhX2lzaXplID0gbmV3X2V4dHJhX2lzaXplOwotCQllcnJvciA9IDA7Ci0JCWdvdG8gY2xlYW51cDsKKwkJZ290byBvdXQ7CiAJfQogCiAJLyoKQEAgLTE0MTQsNyArMTQxNyw3IEBACiAJCWVuZCA9IGJoLT5iX2RhdGEgKyBiaC0+Yl9zaXplOwogCQltaW5fb2ZmcyA9IGVuZCAtIGJhc2U7CiAJCWZyZWUgPSBleHQ0X3hhdHRyX2ZyZWVfc3BhY2UoZmlyc3QsICZtaW5fb2ZmcywgYmFzZSwgTlVMTCk7Ci0JCWlmIChmcmVlIDwgbmV3X2V4dHJhX2lzaXplKSB7CisJCWlmIChmcmVlIDwgaXNpemVfZGlmZikgewogCQkJaWYgKCF0cmllZF9taW5fZXh0cmFfaXNpemUgJiYgc19taW5fZXh0cmFfaXNpemUpIHsKIAkJCQl0cmllZF9taW5fZXh0cmFfaXNpemUrKzsKIAkJCQluZXdfZXh0cmFfaXNpemUgPSBzX21pbl9leHRyYV9pc2l6ZTsKQEAgLTE0MjgsNyArMTQzMSw3IEBACiAJCWZyZWUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CiAJfQogCi0Jd2hpbGUgKG5ld19leHRyYV9pc2l6ZSA+IDApIHsKKwl3aGlsZSAoaXNpemVfZGlmZiA+IDApIHsKIAkJc2l6ZV90IG9mZnMsIHNpemUsIGVudHJ5X3NpemU7CiAJCXN0cnVjdCBleHQ0X3hhdHRyX2VudHJ5ICpzbWFsbF9lbnRyeSA9IE5VTEw7CiAJCXN0cnVjdCBleHQ0X3hhdHRyX2luZm8gaSA9IHsKQEAgLTE0NTksNyArMTQ2Miw3IEBACiAJCQlFWFQ0X1hBVFRSX1NJWkUobGUzMl90b19jcHUobGFzdC0+ZV92YWx1ZV9zaXplKSkgKwogCQkJCQlFWFQ0X1hBVFRSX0xFTihsYXN0LT5lX25hbWVfbGVuKTsKIAkJCWlmICh0b3RhbF9zaXplIDw9IGZyZWUgJiYgdG90YWxfc2l6ZSA8IG1pbl90b3RhbF9zaXplKSB7Ci0JCQkJaWYgKHRvdGFsX3NpemUgPCBuZXdfZXh0cmFfaXNpemUpIHsKKwkJCQlpZiAodG90YWxfc2l6ZSA8IGlzaXplX2RpZmYpIHsKIAkJCQkJc21hbGxfZW50cnkgPSBsYXN0OwogCQkJCX0gZWxzZSB7CiAJCQkJCWVudHJ5ID0gbGFzdDsKQEAgLTE1MTQsMjIgKzE1MTcsMjIgQEAKIAkJZXJyb3IgPSBleHQ0X3hhdHRyX2lib2R5X3NldChoYW5kbGUsIGlub2RlLCAmaSwgaXMpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIGNsZWFudXA7CisJCXRvdGFsX2lubyAtPSBlbnRyeV9zaXplOwogCiAJCWVudHJ5ID0gSUZJUlNUKGhlYWRlcik7Ci0JCWlmIChlbnRyeV9zaXplICsgRVhUNF9YQVRUUl9TSVpFKHNpemUpID49IG5ld19leHRyYV9pc2l6ZSkKLQkJCXNoaWZ0X2J5dGVzID0gbmV3X2V4dHJhX2lzaXplOworCQlpZiAoZW50cnlfc2l6ZSArIEVYVDRfWEFUVFJfU0laRShzaXplKSA+PSBpc2l6ZV9kaWZmKQorCQkJc2hpZnRfYnl0ZXMgPSBpc2l6ZV9kaWZmOwogCQllbHNlCi0JCQlzaGlmdF9ieXRlcyA9IGVudHJ5X3NpemUgKyBzaXplOworCQkJc2hpZnRfYnl0ZXMgPSBlbnRyeV9zaXplICsgRVhUNF9YQVRUUl9TSVpFKHNpemUpOwogCQkvKiBBZGp1c3QgdGhlIG9mZnNldHMgYW5kIHNoaWZ0IHRoZSByZW1haW5pbmcgZW50cmllcyBhaGVhZCAqLwotCQlleHQ0X3hhdHRyX3NoaWZ0X2VudHJpZXMoZW50cnksIEVYVDRfSShpbm9kZSktPmlfZXh0cmFfaXNpemUgLQotCQkJc2hpZnRfYnl0ZXMsICh2b2lkICopcmF3X2lub2RlICsKLQkJCUVYVDRfR09PRF9PTERfSU5PREVfU0laRSArIGV4dHJhX2lzaXplICsgc2hpZnRfYnl0ZXMsCi0JCQkodm9pZCAqKWhlYWRlciwgdG90YWxfaW5vIC0gZW50cnlfc2l6ZSwKLQkJCWlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CisJCWV4dDRfeGF0dHJfc2hpZnRfZW50cmllcyhlbnRyeSwgLXNoaWZ0X2J5dGVzLAorCQkJKHZvaWQgKilyYXdfaW5vZGUgKyBFWFQ0X0dPT0RfT0xEX0lOT0RFX1NJWkUgKworCQkJRVhUNF9JKGlub2RlKS0+aV9leHRyYV9pc2l6ZSArIHNoaWZ0X2J5dGVzLAorCQkJKHZvaWQgKiloZWFkZXIsIHRvdGFsX2lubywgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKIAotCQlleHRyYV9pc2l6ZSArPSBzaGlmdF9ieXRlczsKLQkJbmV3X2V4dHJhX2lzaXplIC09IHNoaWZ0X2J5dGVzOwotCQlFWFQ0X0koaW5vZGUpLT5pX2V4dHJhX2lzaXplID0gZXh0cmFfaXNpemU7CisJCWlzaXplX2RpZmYgLT0gc2hpZnRfYnl0ZXM7CisJCUVYVDRfSShpbm9kZSktPmlfZXh0cmFfaXNpemUgKz0gc2hpZnRfYnl0ZXM7CisJCWhlYWRlciA9IElIRFIoaW5vZGUsIHJhd19pbm9kZSk7CiAKIAkJaS5uYW1lID0gYl9lbnRyeV9uYW1lOwogCQlpLnZhbHVlID0gYnVmZmVyOwpAQCAtMTU1MSw2ICsxNTU0LDggQEAKIAkJa2ZyZWUoYnMpOwogCX0KIAlicmVsc2UoYmgpOworb3V0OgorCWV4dDRfY2xlYXJfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTk9fRVhQQU5EKTsKIAl1cF93cml0ZSgmRVhUNF9JKGlub2RlKS0+eGF0dHJfc2VtKTsKIAlyZXR1cm4gMDsKIApAQCAtMTU2Miw2ICsxNTY3LDEwIEBACiAJa2ZyZWUoaXMpOwogCWtmcmVlKGJzKTsKIAlicmVsc2UoYmgpOworCS8qCisJICogV2UgZGVsaWJlcmF0ZWx5IGxlYXZlIEVYVDRfU1RBVEVfTk9fRVhQQU5EIHNldCBoZXJlIHNpbmNlIGlub2RlCisJICogc2l6ZSBleHBhbnNpb24gZmFpbGVkLgorCSAqLwogCXVwX3dyaXRlKCZFWFQ0X0koaW5vZGUpLT54YXR0cl9zZW0pOwogCXJldHVybiBlcnJvcjsKIH0KZGlmZiAtLWdpdCBhL2ZzL2V4dDQveGF0dHIuaCBiL2ZzL2V4dDQveGF0dHIuaAppbmRleCA2OWRkM2U2Li5hOTJlNzgzIDEwMDY0NAotLS0gYS9mcy9leHQ0L3hhdHRyLmgKKysrIGIvZnMvZXh0NC94YXR0ci5oCkBAIC0yNCw2ICsyNCw3IEBACiAjZGVmaW5lIEVYVDRfWEFUVFJfSU5ERVhfU1lTVEVNCQkJNwogI2RlZmluZSBFWFQ0X1hBVFRSX0lOREVYX1JJQ0hBQ0wJCTgKICNkZWZpbmUgRVhUNF9YQVRUUl9JTkRFWF9FTkNSWVBUSU9OCQk5CisjZGVmaW5lIEVYVDRfWEFUVFJfSU5ERVhfSFVSRAkJCTEwIC8qIFJlc2VydmVkIGZvciBIdXJkICovCiAKIHN0cnVjdCBleHQ0X3hhdHRyX2hlYWRlciB7CiAJX19sZTMyCWhfbWFnaWM7CS8qIG1hZ2ljIG51bWJlciBmb3IgaWRlbnRpZmljYXRpb24gKi8KZGlmZiAtLWdpdCBhL2ZzL2YyZnMvYWNsLmMgYi9mcy9mMmZzL2FjbC5jCmluZGV4IDRkY2M5ZTIuLjFlMjk2MzAgMTAwNjQ0Ci0tLSBhL2ZzL2YyZnMvYWNsLmMKKysrIGIvZnMvZjJmcy9hY2wuYwpAQCAtMTA5LDE0ICsxMDksMTYgQEAKIAlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIH0KIAotc3RhdGljIHZvaWQgKmYyZnNfYWNsX3RvX2Rpc2soY29uc3Qgc3RydWN0IHBvc2l4X2FjbCAqYWNsLCBzaXplX3QgKnNpemUpCitzdGF0aWMgdm9pZCAqZjJmc19hY2xfdG9fZGlzayhzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksCisJCQkJY29uc3Qgc3RydWN0IHBvc2l4X2FjbCAqYWNsLCBzaXplX3QgKnNpemUpCiB7CiAJc3RydWN0IGYyZnNfYWNsX2hlYWRlciAqZjJmc19hY2w7CiAJc3RydWN0IGYyZnNfYWNsX2VudHJ5ICplbnRyeTsKIAlpbnQgaTsKIAotCWYyZnNfYWNsID0gZjJmc19rbWFsbG9jKHNpemVvZihzdHJ1Y3QgZjJmc19hY2xfaGVhZGVyKSArIGFjbC0+YV9jb3VudCAqCi0JCQlzaXplb2Yoc3RydWN0IGYyZnNfYWNsX2VudHJ5KSwgR0ZQX05PRlMpOworCWYyZnNfYWNsID0gZjJmc19rbWFsbG9jKHNiaSwgc2l6ZW9mKHN0cnVjdCBmMmZzX2FjbF9oZWFkZXIpICsKKwkJCWFjbC0+YV9jb3VudCAqIHNpemVvZihzdHJ1Y3QgZjJmc19hY2xfZW50cnkpLAorCQkJR0ZQX05PRlMpOwogCWlmICghZjJmc19hY2wpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCkBAIC0xNzUsNyArMTc3LDcgQEAKIAogCXJldHZhbCA9IGYyZnNfZ2V0eGF0dHIoaW5vZGUsIG5hbWVfaW5kZXgsICIiLCBOVUxMLCAwLCBkcGFnZSk7CiAJaWYgKHJldHZhbCA+IDApIHsKLQkJdmFsdWUgPSBmMmZzX2ttYWxsb2MocmV0dmFsLCBHRlBfRjJGU19aRVJPKTsKKwkJdmFsdWUgPSBmMmZzX2ttYWxsb2MoRjJGU19JX1NCKGlub2RlKSwgcmV0dmFsLCBHRlBfRjJGU19aRVJPKTsKIAkJaWYgKCF2YWx1ZSkKIAkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCQlyZXR2YWwgPSBmMmZzX2dldHhhdHRyKGlub2RlLCBuYW1lX2luZGV4LCAiIiwgdmFsdWUsCkBAIC0yMzAsNyArMjMyLDcgQEAKIAl9CiAKIAlpZiAoYWNsKSB7Ci0JCXZhbHVlID0gZjJmc19hY2xfdG9fZGlzayhhY2wsICZzaXplKTsKKwkJdmFsdWUgPSBmMmZzX2FjbF90b19kaXNrKEYyRlNfSV9TQihpbm9kZSksIGFjbCwgJnNpemUpOwogCQlpZiAoSVNfRVJSKHZhbHVlKSkgewogCQkJY2xlYXJfaW5vZGVfZmxhZyhpbm9kZSwgRklfQUNMX01PREUpOwogCQkJcmV0dXJuIChpbnQpUFRSX0VSUih2YWx1ZSk7CmRpZmYgLS1naXQgYS9mcy9mMmZzL2FjbC5oIGIvZnMvZjJmcy9hY2wuaAppbmRleCBiMjMzNGQxLi4yYzY4NTE4IDEwMDY0NAotLS0gYS9mcy9mMmZzL2FjbC5oCisrKyBiL2ZzL2YyZnMvYWNsLmgKQEAgLTQxLDcgKzQxLDYgQEAKIGV4dGVybiBpbnQgZjJmc19pbml0X2FjbChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGlub2RlICosIHN0cnVjdCBwYWdlICosCiAJCQkJCQkJc3RydWN0IHBhZ2UgKik7CiAjZWxzZQotI2RlZmluZSBmMmZzX2NoZWNrX2FjbAlOVUxMCiAjZGVmaW5lIGYyZnNfZ2V0X2FjbAlOVUxMCiAjZGVmaW5lIGYyZnNfc2V0X2FjbAlOVUxMCiAKZGlmZiAtLWdpdCBhL2ZzL2YyZnMvY2hlY2twb2ludC5jIGIvZnMvZjJmcy9jaGVja3BvaW50LmMKaW5kZXggZjk0ZDAxZS4uN2U5YjUwNCAxMDA2NDQKLS0tIGEvZnMvZjJmcy9jaGVja3BvaW50LmMKKysrIGIvZnMvZjJmcy9jaGVja3BvaW50LmMKQEAgLTI4LDcgKzI4LDcgQEAKIAogdm9pZCBmMmZzX3N0b3BfY2hlY2twb2ludChzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksIGJvb2wgZW5kX2lvKQogewotCXNldF9ja3B0X2ZsYWdzKHNiaS0+Y2twdCwgQ1BfRVJST1JfRkxBRyk7CisJc2V0X2NrcHRfZmxhZ3Moc2JpLCBDUF9FUlJPUl9GTEFHKTsKIAlzYmktPnNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKIAlpZiAoIWVuZF9pbykKIAkJZjJmc19mbHVzaF9tZXJnZWRfYmlvcyhzYmkpOwpAQCAtMjY3LDcgKzI2Nyw2IEBACiAJCQkJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCiB7CiAJc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpID0gRjJGU19NX1NCKG1hcHBpbmcpOwotCXN0cnVjdCBibGtfcGx1ZyBwbHVnOwogCWxvbmcgZGlmZiwgd3JpdHRlbjsKIAogCS8qIGNvbGxlY3QgYSBudW1iZXIgb2YgZGlydHkgbWV0YSBwYWdlcyBhbmQgd3JpdGUgdG9nZXRoZXIgKi8KQEAgLTI4MCw5ICsyNzksNyBAQAogCS8qIGlmIG1vdW50aW5nIGlzIGZhaWxlZCwgc2tpcCB3cml0aW5nIG5vZGUgcGFnZXMgKi8KIAltdXRleF9sb2NrKCZzYmktPmNwX211dGV4KTsKIAlkaWZmID0gbnJfcGFnZXNfdG9fd3JpdGUoc2JpLCBNRVRBLCB3YmMpOwotCWJsa19zdGFydF9wbHVnKCZwbHVnKTsKIAl3cml0dGVuID0gc3luY19tZXRhX3BhZ2VzKHNiaSwgTUVUQSwgd2JjLT5ucl90b193cml0ZSk7Ci0JYmxrX2ZpbmlzaF9wbHVnKCZwbHVnKTsKIAltdXRleF91bmxvY2soJnNiaS0+Y3BfbXV0ZXgpOwogCXdiYy0+bnJfdG9fd3JpdGUgPSBtYXgoKGxvbmcpMCwgd2JjLT5ucl90b193cml0ZSAtIHdyaXR0ZW4gLSBkaWZmKTsKIAlyZXR1cm4gMDsKQEAgLTM4OCw2ICszODUsOSBAQAogCS5zZXRfcGFnZV9kaXJ0eQk9IGYyZnNfc2V0X21ldGFfcGFnZV9kaXJ0eSwKIAkuaW52YWxpZGF0ZXBhZ2UgPSBmMmZzX2ludmFsaWRhdGVfcGFnZSwKIAkucmVsZWFzZXBhZ2UJPSBmMmZzX3JlbGVhc2VfcGFnZSwKKyNpZmRlZiBDT05GSUdfTUlHUkFUSU9OCisJLm1pZ3JhdGVwYWdlICAgID0gZjJmc19taWdyYXRlX3BhZ2UsCisjZW5kaWYKIH07CiAKIHN0YXRpYyB2b2lkIF9fYWRkX2lub19lbnRyeShzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksIG5pZF90IGlubywgaW50IHR5cGUpCkBAIC00OTEsNyArNDkxLDcgQEAKIAlzcGluX2xvY2soJmltLT5pbm9fbG9jayk7CiAKICNpZmRlZiBDT05GSUdfRjJGU19GQVVMVF9JTkpFQ1RJT04KLQlpZiAodGltZV90b19pbmplY3QoRkFVTFRfT1JQSEFOKSkgeworCWlmICh0aW1lX3RvX2luamVjdChzYmksIEZBVUxUX09SUEhBTikpIHsKIAkJc3Bpbl91bmxvY2soJmltLT5pbm9fbG9jayk7CiAJCXJldHVybiAtRU5PU1BDOwogCX0KQEAgLTUzMSw4ICs1MzEsMjAgQEAKIHN0YXRpYyBpbnQgcmVjb3Zlcl9vcnBoYW5faW5vZGUoc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpLCBuaWRfdCBpbm8pCiB7CiAJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3Qgbm9kZV9pbmZvIG5pOworCWludCBlcnIgPSBhY3F1aXJlX29ycGhhbl9pbm9kZShzYmkpOwogCi0JaW5vZGUgPSBmMmZzX2lnZXQoc2JpLT5zYiwgaW5vKTsKKwlpZiAoZXJyKSB7CisJCXNldF9zYmlfZmxhZyhzYmksIFNCSV9ORUVEX0ZTQ0spOworCQlmMmZzX21zZyhzYmktPnNiLCBLRVJOX1dBUk5JTkcsCisJCQkJIiVzOiBvcnBoYW4gZmFpbGVkIChpbm89JXgpLCBydW4gZnNjayB0byBmaXguIiwKKwkJCQlfX2Z1bmNfXywgaW5vKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlfX2FkZF9pbm9fZW50cnkoc2JpLCBpbm8sIE9SUEhBTl9JTk8pOworCisJaW5vZGUgPSBmMmZzX2lnZXRfcmV0cnkoc2JpLT5zYiwgaW5vKTsKIAlpZiAoSVNfRVJSKGlub2RlKSkgewogCQkvKgogCQkgKiB0aGVyZSBzaG91bGQgYmUgYSBidWcgdGhhdCB3ZSBjYW4ndCBmaW5kIHRoZSBlbnRyeQpAQCAtNTQ2LDYgKzU1OCwxOCBAQAogCiAJLyogdHJ1bmNhdGUgYWxsIHRoZSBkYXRhIGR1cmluZyBpcHV0ICovCiAJaXB1dChpbm9kZSk7CisKKwlnZXRfbm9kZV9pbmZvKHNiaSwgaW5vLCAmbmkpOworCisJLyogRU5PTUVNIHdhcyBmdWxseSByZXRyaWVkIGluIGYyZnNfZXZpY3RfaW5vZGUuICovCisJaWYgKG5pLmJsa19hZGRyICE9IE5VTExfQUREUikgeworCQlzZXRfc2JpX2ZsYWcoc2JpLCBTQklfTkVFRF9GU0NLKTsKKwkJZjJmc19tc2coc2JpLT5zYiwgS0VSTl9XQVJOSU5HLAorCQkJIiVzOiBvcnBoYW4gZmFpbGVkIChpbm89JXgpLCBydW4gZnNjayB0byBmaXguIiwKKwkJCQlfX2Z1bmNfXywgaW5vKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCV9fcmVtb3ZlX2lub19lbnRyeShzYmksIGlubywgT1JQSEFOX0lOTyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU1NCw3ICs1NzgsNyBAQAogCWJsb2NrX3Qgc3RhcnRfYmxrLCBvcnBoYW5fYmxvY2tzLCBpLCBqOwogCWludCBlcnI7CiAKLQlpZiAoIWlzX3NldF9ja3B0X2ZsYWdzKEYyRlNfQ0tQVChzYmkpLCBDUF9PUlBIQU5fUFJFU0VOVF9GTEFHKSkKKwlpZiAoIWlzX3NldF9ja3B0X2ZsYWdzKHNiaSwgQ1BfT1JQSEFOX1BSRVNFTlRfRkxBRykpCiAJCXJldHVybiAwOwogCiAJc3RhcnRfYmxrID0gX19zdGFydF9jcF9hZGRyKHNiaSkgKyAxICsgX19jcF9wYXlsb2FkKHNiaSk7CkBAIC01NzgsNyArNjAyLDcgQEAKIAkJZjJmc19wdXRfcGFnZShwYWdlLCAxKTsKIAl9CiAJLyogY2xlYXIgT3JwaGFuIEZsYWcgKi8KLQljbGVhcl9ja3B0X2ZsYWdzKEYyRlNfQ0tQVChzYmkpLCBDUF9PUlBIQU5fUFJFU0VOVF9GTEFHKTsKKwljbGVhcl9ja3B0X2ZsYWdzKHNiaSwgQ1BfT1JQSEFOX1BSRVNFTlRfRkxBRyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTYzOSw0NSArNjYzLDU1IEBACiAJfQogfQogCitzdGF0aWMgaW50IGdldF9jaGVja3BvaW50X3ZlcnNpb24oc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpLCBibG9ja190IGNwX2FkZHIsCisJCXN0cnVjdCBmMmZzX2NoZWNrcG9pbnQgKipjcF9ibG9jaywgc3RydWN0IHBhZ2UgKipjcF9wYWdlLAorCQl1bnNpZ25lZCBsb25nIGxvbmcgKnZlcnNpb24pCit7CisJdW5zaWduZWQgbG9uZyBibGtfc2l6ZSA9IHNiaS0+YmxvY2tzaXplOworCXNpemVfdCBjcmNfb2Zmc2V0ID0gMDsKKwlfX3UzMiBjcmMgPSAwOworCisJKmNwX3BhZ2UgPSBnZXRfbWV0YV9wYWdlKHNiaSwgY3BfYWRkcik7CisJKmNwX2Jsb2NrID0gKHN0cnVjdCBmMmZzX2NoZWNrcG9pbnQgKilwYWdlX2FkZHJlc3MoKmNwX3BhZ2UpOworCisJY3JjX29mZnNldCA9IGxlMzJfdG9fY3B1KCgqY3BfYmxvY2spLT5jaGVja3N1bV9vZmZzZXQpOworCWlmIChjcmNfb2Zmc2V0ID49IGJsa19zaXplKSB7CisJCWYyZnNfbXNnKHNiaS0+c2IsIEtFUk5fV0FSTklORywKKwkJCSJpbnZhbGlkIGNyY19vZmZzZXQ6ICV6dSIsIGNyY19vZmZzZXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljcmMgPSBsZTMyX3RvX2NwdSgqKChfX2xlMzIgKikoKHVuc2lnbmVkIGNoYXIgKikqY3BfYmxvY2sKKwkJCQkJCQkrIGNyY19vZmZzZXQpKSk7CisJaWYgKCFmMmZzX2NyY192YWxpZChzYmksIGNyYywgKmNwX2Jsb2NrLCBjcmNfb2Zmc2V0KSkgeworCQlmMmZzX21zZyhzYmktPnNiLCBLRVJOX1dBUk5JTkcsICJpbnZhbGlkIGNyYyB2YWx1ZSIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkqdmVyc2lvbiA9IGN1cl9jcF92ZXJzaW9uKCpjcF9ibG9jayk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqdmFsaWRhdGVfY2hlY2twb2ludChzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksCiAJCQkJYmxvY2tfdCBjcF9hZGRyLCB1bnNpZ25lZCBsb25nIGxvbmcgKnZlcnNpb24pCiB7Ci0Jc3RydWN0IHBhZ2UgKmNwX3BhZ2VfMSwgKmNwX3BhZ2VfMiA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBibGtfc2l6ZSA9IHNiaS0+YmxvY2tzaXplOwotCXN0cnVjdCBmMmZzX2NoZWNrcG9pbnQgKmNwX2Jsb2NrOworCXN0cnVjdCBwYWdlICpjcF9wYWdlXzEgPSBOVUxMLCAqY3BfcGFnZV8yID0gTlVMTDsKKwlzdHJ1Y3QgZjJmc19jaGVja3BvaW50ICpjcF9ibG9jayA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBsb25nIGN1cl92ZXJzaW9uID0gMCwgcHJlX3ZlcnNpb24gPSAwOwotCXNpemVfdCBjcmNfb2Zmc2V0OwotCV9fdTMyIGNyYyA9IDA7CisJaW50IGVycjsKIAotCS8qIFJlYWQgdGhlIDFzdCBjcCBibG9jayBpbiB0aGlzIENQIHBhY2sgKi8KLQljcF9wYWdlXzEgPSBnZXRfbWV0YV9wYWdlKHNiaSwgY3BfYWRkcik7Ci0KLQkvKiBnZXQgdGhlIHZlcnNpb24gbnVtYmVyICovCi0JY3BfYmxvY2sgPSAoc3RydWN0IGYyZnNfY2hlY2twb2ludCAqKXBhZ2VfYWRkcmVzcyhjcF9wYWdlXzEpOwotCWNyY19vZmZzZXQgPSBsZTMyX3RvX2NwdShjcF9ibG9jay0+Y2hlY2tzdW1fb2Zmc2V0KTsKLQlpZiAoY3JjX29mZnNldCA+PSBibGtfc2l6ZSkKKwllcnIgPSBnZXRfY2hlY2twb2ludF92ZXJzaW9uKHNiaSwgY3BfYWRkciwgJmNwX2Jsb2NrLAorCQkJCQkmY3BfcGFnZV8xLCB2ZXJzaW9uKTsKKwlpZiAoZXJyKQogCQlnb3RvIGludmFsaWRfY3AxOworCXByZV92ZXJzaW9uID0gKnZlcnNpb247CiAKLQljcmMgPSBsZTMyX3RvX2NwdSgqKChfX2xlMzIgKikoKHVuc2lnbmVkIGNoYXIgKiljcF9ibG9jayArIGNyY19vZmZzZXQpKSk7Ci0JaWYgKCFmMmZzX2NyY192YWxpZChzYmksIGNyYywgY3BfYmxvY2ssIGNyY19vZmZzZXQpKQotCQlnb3RvIGludmFsaWRfY3AxOwotCi0JcHJlX3ZlcnNpb24gPSBjdXJfY3BfdmVyc2lvbihjcF9ibG9jayk7Ci0KLQkvKiBSZWFkIHRoZSAybmQgY3AgYmxvY2sgaW4gdGhpcyBDUCBwYWNrICovCiAJY3BfYWRkciArPSBsZTMyX3RvX2NwdShjcF9ibG9jay0+Y3BfcGFja190b3RhbF9ibG9ja19jb3VudCkgLSAxOwotCWNwX3BhZ2VfMiA9IGdldF9tZXRhX3BhZ2Uoc2JpLCBjcF9hZGRyKTsKLQotCWNwX2Jsb2NrID0gKHN0cnVjdCBmMmZzX2NoZWNrcG9pbnQgKilwYWdlX2FkZHJlc3MoY3BfcGFnZV8yKTsKLQljcmNfb2Zmc2V0ID0gbGUzMl90b19jcHUoY3BfYmxvY2stPmNoZWNrc3VtX29mZnNldCk7Ci0JaWYgKGNyY19vZmZzZXQgPj0gYmxrX3NpemUpCisJZXJyID0gZ2V0X2NoZWNrcG9pbnRfdmVyc2lvbihzYmksIGNwX2FkZHIsICZjcF9ibG9jaywKKwkJCQkJJmNwX3BhZ2VfMiwgdmVyc2lvbik7CisJaWYgKGVycikKIAkJZ290byBpbnZhbGlkX2NwMjsKLQotCWNyYyA9IGxlMzJfdG9fY3B1KCooKF9fbGUzMiAqKSgodW5zaWduZWQgY2hhciAqKWNwX2Jsb2NrICsgY3JjX29mZnNldCkpKTsKLQlpZiAoIWYyZnNfY3JjX3ZhbGlkKHNiaSwgY3JjLCBjcF9ibG9jaywgY3JjX29mZnNldCkpCi0JCWdvdG8gaW52YWxpZF9jcDI7Ci0KLQljdXJfdmVyc2lvbiA9IGN1cl9jcF92ZXJzaW9uKGNwX2Jsb2NrKTsKKwljdXJfdmVyc2lvbiA9ICp2ZXJzaW9uOwogCiAJaWYgKGN1cl92ZXJzaW9uID09IHByZV92ZXJzaW9uKSB7CiAJCSp2ZXJzaW9uID0gY3VyX3ZlcnNpb247CkBAIC05NzIsMTAgKzEwMDYsNDAgQEAKIAlmaW5pc2hfd2FpdCgmc2JpLT5jcF93YWl0LCAmd2FpdCk7CiB9CiAKK3N0YXRpYyB2b2lkIHVwZGF0ZV9ja3B0X2ZsYWdzKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwgc3RydWN0IGNwX2NvbnRyb2wgKmNwYykKK3sKKwl1bnNpZ25lZCBsb25nIG9ycGhhbl9udW0gPSBzYmktPmltW09SUEhBTl9JTk9dLmlub19udW07CisJc3RydWN0IGYyZnNfY2hlY2twb2ludCAqY2twdCA9IEYyRlNfQ0tQVChzYmkpOworCisJc3Bpbl9sb2NrKCZzYmktPmNwX2xvY2spOworCisJaWYgKGNwYy0+cmVhc29uID09IENQX1VNT1VOVCkKKwkJX19zZXRfY2twdF9mbGFncyhja3B0LCBDUF9VTU9VTlRfRkxBRyk7CisJZWxzZQorCQlfX2NsZWFyX2NrcHRfZmxhZ3MoY2twdCwgQ1BfVU1PVU5UX0ZMQUcpOworCisJaWYgKGNwYy0+cmVhc29uID09IENQX0ZBU1RCT09UKQorCQlfX3NldF9ja3B0X2ZsYWdzKGNrcHQsIENQX0ZBU1RCT09UX0ZMQUcpOworCWVsc2UKKwkJX19jbGVhcl9ja3B0X2ZsYWdzKGNrcHQsIENQX0ZBU1RCT09UX0ZMQUcpOworCisJaWYgKG9ycGhhbl9udW0pCisJCV9fc2V0X2NrcHRfZmxhZ3MoY2twdCwgQ1BfT1JQSEFOX1BSRVNFTlRfRkxBRyk7CisJZWxzZQorCQlfX2NsZWFyX2NrcHRfZmxhZ3MoY2twdCwgQ1BfT1JQSEFOX1BSRVNFTlRfRkxBRyk7CisKKwlpZiAoaXNfc2JpX2ZsYWdfc2V0KHNiaSwgU0JJX05FRURfRlNDSykpCisJCV9fc2V0X2NrcHRfZmxhZ3MoY2twdCwgQ1BfRlNDS19GTEFHKTsKKworCS8qIHNldCB0aGlzIGZsYWcgdG8gYWN0aXZhdGUgY3JjfGNwX3ZlciBmb3IgcmVjb3ZlcnkgKi8KKwlfX3NldF9ja3B0X2ZsYWdzKGNrcHQsIENQX0NSQ19SRUNPVkVSWV9GTEFHKTsKKworCXNwaW5fdW5sb2NrKCZzYmktPmNwX2xvY2spOworfQorCiBzdGF0aWMgaW50IGRvX2NoZWNrcG9pbnQoc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpLCBzdHJ1Y3QgY3BfY29udHJvbCAqY3BjKQogewogCXN0cnVjdCBmMmZzX2NoZWNrcG9pbnQgKmNrcHQgPSBGMkZTX0NLUFQoc2JpKTsKLQlzdHJ1Y3QgY3Vyc2VnX2luZm8gKmN1cnNlZyA9IENVUlNFR19JKHNiaSwgQ1VSU0VHX1dBUk1fTk9ERSk7CiAJc3RydWN0IGYyZnNfbm1faW5mbyAqbm1faSA9IE5NX0koc2JpKTsKIAl1bnNpZ25lZCBsb25nIG9ycGhhbl9udW0gPSBzYmktPmltW09SUEhBTl9JTk9dLmlub19udW07CiAJbmlkX3QgbGFzdF9uaWQgPSBubV9pLT5uZXh0X3NjYW5fbmlkOwpAQCAtOTg0LDE5ICsxMDQ4LDEwIEBACiAJX191MzIgY3JjMzIgPSAwOwogCWludCBpOwogCWludCBjcF9wYXlsb2FkX2Jsa3MgPSBfX2NwX3BheWxvYWQoc2JpKTsKLQlibG9ja190IGRpc2NhcmRfYmxrID0gTkVYVF9GUkVFX0JMS0FERFIoc2JpLCBjdXJzZWcpOwotCWJvb2wgaW52YWxpZGF0ZSA9IGZhbHNlOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBzYmktPnNiOwogCXN0cnVjdCBjdXJzZWdfaW5mbyAqc2VnX2kgPSBDVVJTRUdfSShzYmksIENVUlNFR19IT1RfTk9ERSk7CiAJdTY0IGtieXRlc193cml0dGVuOwogCi0JLyoKLQkgKiBUaGlzIGF2b2lkcyB0byBjb25kdWN0IHdyb25nIHJvbGwtZm9yd2FyZCBvcGVyYXRpb25zIGFuZCB1c2VzCi0JICogbWV0YXBhZ2VzLCBzbyBzaG91bGQgYmUgY2FsbGVkIHByaW9yIHRvIHN5bmNfbWV0YV9wYWdlcyBiZWxvdy4KLQkgKi8KLQlpZiAoIXRlc3Rfb3B0KHNiaSwgTEZTKSAmJiBkaXNjYXJkX25leHRfZG5vZGUoc2JpLCBkaXNjYXJkX2JsaykpCi0JCWludmFsaWRhdGUgPSB0cnVlOwotCiAJLyogRmx1c2ggYWxsIHRoZSBOQVQvU0lUIHBhZ2VzICovCiAJd2hpbGUgKGdldF9wYWdlcyhzYmksIEYyRlNfRElSVFlfTUVUQSkpIHsKIAkJc3luY19tZXRhX3BhZ2VzKHNiaSwgTUVUQSwgTE9OR19NQVgpOwpAQCAtMTAzNiwxMCArMTA5MSwxMiBAQAogCiAJLyogMiBjcCAgKyBuIGRhdGEgc2VnIHN1bW1hcnkgKyBvcnBoYW4gaW5vZGUgYmxvY2tzICovCiAJZGF0YV9zdW1fYmxvY2tzID0gbnBhZ2VzX2Zvcl9zdW1tYXJ5X2ZsdXNoKHNiaSwgZmFsc2UpOworCXNwaW5fbG9jaygmc2JpLT5jcF9sb2NrKTsKIAlpZiAoZGF0YV9zdW1fYmxvY2tzIDwgTlJfQ1VSU0VHX0RBVEFfVFlQRSkKLQkJc2V0X2NrcHRfZmxhZ3MoY2twdCwgQ1BfQ09NUEFDVF9TVU1fRkxBRyk7CisJCV9fc2V0X2NrcHRfZmxhZ3MoY2twdCwgQ1BfQ09NUEFDVF9TVU1fRkxBRyk7CiAJZWxzZQotCQljbGVhcl9ja3B0X2ZsYWdzKGNrcHQsIENQX0NPTVBBQ1RfU1VNX0ZMQUcpOworCQlfX2NsZWFyX2NrcHRfZmxhZ3MoY2twdCwgQ1BfQ09NUEFDVF9TVU1fRkxBRyk7CisJc3Bpbl91bmxvY2soJnNiaS0+Y3BfbG9jayk7CiAKIAlvcnBoYW5fYmxvY2tzID0gR0VUX09SUEhBTl9CTE9DS1Mob3JwaGFuX251bSk7CiAJY2twdC0+Y3BfcGFja19zdGFydF9zdW0gPSBjcHVfdG9fbGUzMigxICsgY3BfcGF5bG9hZF9ibGtzICsKQEAgLTEwNTQsMjMgKzExMTEsOCBAQAogCQkJCWNwX3BheWxvYWRfYmxrcyArIGRhdGFfc3VtX2Jsb2NrcyArCiAJCQkJb3JwaGFuX2Jsb2Nrcyk7CiAKLQlpZiAoY3BjLT5yZWFzb24gPT0gQ1BfVU1PVU5UKQotCQlzZXRfY2twdF9mbGFncyhja3B0LCBDUF9VTU9VTlRfRkxBRyk7Ci0JZWxzZQotCQljbGVhcl9ja3B0X2ZsYWdzKGNrcHQsIENQX1VNT1VOVF9GTEFHKTsKLQotCWlmIChjcGMtPnJlYXNvbiA9PSBDUF9GQVNUQk9PVCkKLQkJc2V0X2NrcHRfZmxhZ3MoY2twdCwgQ1BfRkFTVEJPT1RfRkxBRyk7Ci0JZWxzZQotCQljbGVhcl9ja3B0X2ZsYWdzKGNrcHQsIENQX0ZBU1RCT09UX0ZMQUcpOwotCi0JaWYgKG9ycGhhbl9udW0pCi0JCXNldF9ja3B0X2ZsYWdzKGNrcHQsIENQX09SUEhBTl9QUkVTRU5UX0ZMQUcpOwotCWVsc2UKLQkJY2xlYXJfY2twdF9mbGFncyhja3B0LCBDUF9PUlBIQU5fUFJFU0VOVF9GTEFHKTsKLQotCWlmIChpc19zYmlfZmxhZ19zZXQoc2JpLCBTQklfTkVFRF9GU0NLKSkKLQkJc2V0X2NrcHRfZmxhZ3MoY2twdCwgQ1BfRlNDS19GTEFHKTsKKwkvKiB1cGRhdGUgY2twdCBmbGFnIGZvciBjaGVja3BvaW50ICovCisJdXBkYXRlX2NrcHRfZmxhZ3Moc2JpLCBjcGMpOwogCiAJLyogdXBkYXRlIFNJVC9OQVQgYml0bWFwICovCiAJZ2V0X3NpdF9iaXRtYXAoc2JpLCBfX2JpdG1hcF9wdHIoc2JpLCBTSVRfQklUTUFQKSk7CkBAIC0xMTM3LDE0ICsxMTc5LDYgQEAKIAkvKiB3YWl0IGZvciBwcmV2aW91cyBzdWJtaXR0ZWQgbWV0YSBwYWdlcyB3cml0ZWJhY2sgKi8KIAl3YWl0X29uX2FsbF9wYWdlc193cml0ZWJhY2soc2JpKTsKIAotCS8qCi0JICogaW52YWxpZGF0ZSBtZXRhIHBhZ2Ugd2hpY2ggaXMgdXNlZCB0ZW1wb3JhcmlseSBmb3IgemVyb2luZyBvdXQKLQkgKiBibG9jayBhdCB0aGUgZW5kIG9mIHdhcm0gbm9kZSBjaGFpbi4KLQkgKi8KLQlpZiAoaW52YWxpZGF0ZSkKLQkJaW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKE1FVEFfTUFQUElORyhzYmkpLCBkaXNjYXJkX2JsaywKLQkJCQkJCQkJZGlzY2FyZF9ibGspOwotCiAJcmVsZWFzZV9pbm9fZW50cnkoc2JpLCBmYWxzZSk7CiAKIAlpZiAodW5saWtlbHkoZjJmc19jcF9lcnJvcihzYmkpKSkKQEAgLTExNTIsNiArMTE4NiwxNyBAQAogCiAJY2xlYXJfcHJlZnJlZV9zZWdtZW50cyhzYmksIGNwYyk7CiAJY2xlYXJfc2JpX2ZsYWcoc2JpLCBTQklfSVNfRElSVFkpOworCWNsZWFyX3NiaV9mbGFnKHNiaSwgU0JJX05FRURfQ1ApOworCisJLyoKKwkgKiByZWRpcnR5IHN1cGVyYmxvY2sgaWYgbWV0YWRhdGEgbGlrZSBub2RlIHBhZ2Ugb3IgaW5vZGUgY2FjaGUgaXMKKwkgKiB1cGRhdGVkIGR1cmluZyB3cml0aW5nIGNoZWNrcG9pbnQuCisJICovCisJaWYgKGdldF9wYWdlcyhzYmksIEYyRlNfRElSVFlfTk9ERVMpIHx8CisJCQlnZXRfcGFnZXMoc2JpLCBGMkZTX0RJUlRZX0lNRVRBKSkKKwkJc2V0X3NiaV9mbGFnKHNiaSwgU0JJX0lTX0RJUlRZKTsKKworCWYyZnNfYnVnX29uKHNiaSwgZ2V0X3BhZ2VzKHNiaSwgRjJGU19ESVJUWV9ERU5UUykpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMTkwLDYgKzEyMzUsMTggQEAKIAogCWYyZnNfZmx1c2hfbWVyZ2VkX2Jpb3Moc2JpKTsKIAorCS8qIHRoaXMgaXMgdGhlIGNhc2Ugb2YgbXVsdGlwbGUgZnN0cmltcyB3aXRob3V0IGFueSBjaGFuZ2VzICovCisJaWYgKGNwYy0+cmVhc29uID09IENQX0RJU0NBUkQgJiYgIWlzX3NiaV9mbGFnX3NldChzYmksIFNCSV9JU19ESVJUWSkpIHsKKwkJZjJmc19idWdfb24oc2JpLCBOTV9JKHNiaSktPmRpcnR5X25hdF9jbnQpOworCQlmMmZzX2J1Z19vbihzYmksIFNJVF9JKHNiaSktPmRpcnR5X3NlbnRyaWVzKTsKKwkJZjJmc19idWdfb24oc2JpLCBwcmVmcmVlX3NlZ21lbnRzKHNiaSkpOworCQlmbHVzaF9zaXRfZW50cmllcyhzYmksIGNwYyk7CisJCWNsZWFyX3ByZWZyZWVfc2VnbWVudHMoc2JpLCBjcGMpOworCQlmMmZzX3dhaXRfYWxsX2Rpc2NhcmRfYmlvKHNiaSk7CisJCXVuYmxvY2tfb3BlcmF0aW9ucyhzYmkpOworCQlnb3RvIG91dDsKKwl9CisKIAkvKgogCSAqIHVwZGF0ZSBjaGVja3BvaW50IHBhY2sgaW5kZXgKIAkgKiBJbmNyZWFzZSB0aGUgdmVyc2lvbiBudW1iZXIgc28gdGhhdApAQCAtMTIwNSw2ICsxMjYyLDggQEAKIAkvKiB1bmxvY2sgYWxsIHRoZSBmc19sb2NrW10gaW4gZG9fY2hlY2twb2ludCgpICovCiAJZXJyID0gZG9fY2hlY2twb2ludChzYmksIGNwYyk7CiAKKwlmMmZzX3dhaXRfYWxsX2Rpc2NhcmRfYmlvKHNiaSk7CisKIAl1bmJsb2NrX29wZXJhdGlvbnMoc2JpKTsKIAlzdGF0X2luY19jcF9jb3VudChzYmktPnN0YXRfaW5mbyk7CiAKZGlmZiAtLWdpdCBhL2ZzL2YyZnMvZGF0YS5jIGIvZnMvZjJmcy9kYXRhLmMKaW5kZXggZDY0ZDJhNS4uMGQwMTc3YyAxMDA2NDQKLS0tIGEvZnMvZjJmcy9kYXRhLmMKKysrIGIvZnMvZjJmcy9kYXRhLmMKQEAgLTM0LDYgKzM0LDExIEBACiAJc3RydWN0IGJpb192ZWMgKmJ2ZWM7CiAJaW50IGk7CiAKKyNpZmRlZiBDT05GSUdfRjJGU19GQVVMVF9JTkpFQ1RJT04KKwlpZiAodGltZV90b19pbmplY3QoRjJGU19QX1NCKGJpby0+YmlfaW9fdmVjLT5idl9wYWdlKSwgRkFVTFRfSU8pKQorCQliaW8tPmJpX2Vycm9yID0gLUVJTzsKKyNlbmRpZgorCiAJaWYgKGYyZnNfYmlvX2VuY3J5cHRlZChiaW8pKSB7CiAJCWlmIChiaW8tPmJpX2Vycm9yKSB7CiAJCQlmc2NyeXB0X3JlbGVhc2VfY3R4KGJpby0+YmlfcHJpdmF0ZSk7CkBAIC02MjYsMTEgKzYzMSwxMyBAQAogCXNzaXplX3QgcmV0ID0gMDsKIAogCW1hcC5tX2xibGsgPSBGMkZTX0JMS19BTElHTihpb2NiLT5raV9wb3MpOwotCW1hcC5tX2xlbiA9IEYyRlNfQllURVNfVE9fQkxLKGlvdl9pdGVyX2NvdW50KGZyb20pKTsKLQltYXAubV9uZXh0X3Bnb2ZzID0gTlVMTDsKKwltYXAubV9sZW4gPSBGMkZTX0JZVEVTX1RPX0JMSyhpb2NiLT5raV9wb3MgKyBpb3ZfaXRlcl9jb3VudChmcm9tKSk7CisJaWYgKG1hcC5tX2xlbiA+IG1hcC5tX2xibGspCisJCW1hcC5tX2xlbiAtPSBtYXAubV9sYmxrOworCWVsc2UKKwkJbWFwLm1fbGVuID0gMDsKIAotCWlmIChmMmZzX2VuY3J5cHRlZF9pbm9kZShpbm9kZSkpCi0JCXJldHVybiAwOworCW1hcC5tX25leHRfcGdvZnMgPSBOVUxMOwogCiAJaWYgKGlvY2ItPmtpX2ZsYWdzICYgSU9DQl9ESVJFQ1QpIHsKIAkJcmV0ID0gZjJmc19jb252ZXJ0X2lubGluZV9pbm9kZShpbm9kZSk7CkBAIC02NzIsNiArNjc5LDkgQEAKIAlib29sIGFsbG9jYXRlZCA9IGZhbHNlOwogCWJsb2NrX3QgYmxrYWRkcjsKIAorCWlmICghbWF4YmxvY2tzKQorCQlyZXR1cm4gMDsKKwogCW1hcC0+bV9sZW4gPSAwOwogCW1hcC0+bV9mbGFncyA9IDA7CiAKQEAgLTc4Myw2ICs3OTMsNyBAQAogCQllcnIgPSByZXNlcnZlX25ld19ibG9ja3MoJmRuLCBwcmVhbGxvYyk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIHN5bmNfb3V0OworCQlhbGxvY2F0ZWQgPSBkbi5ub2RlX2NoYW5nZWQ7CiAKIAkJbWFwLT5tX2xlbiArPSBkbi5vZnNfaW5fbm9kZSAtIG9mc19pbl9ub2RlOwogCQlpZiAocHJlYWxsb2MgJiYgZG4ub2ZzX2luX25vZGUgIT0gbGFzdF9vZnNfaW5fbm9kZSArIDEpIHsKQEAgLTk2Niw4ICs5NzcsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0cnVjdCBiaW8gKmYyZnNfZ3JhYl9iaW8oc3RydWN0IGlub2RlICppbm9kZSwgYmxvY2tfdCBibGthZGRyLAotCQkJCQkJCXVuc2lnbmVkIG5yX3BhZ2VzKQorc3RhdGljIHN0cnVjdCBiaW8gKmYyZnNfZ3JhYl9iaW8oc3RydWN0IGlub2RlICppbm9kZSwgYmxvY2tfdCBibGthZGRyLAorCQkJCSB1bnNpZ25lZCBucl9wYWdlcykKIHsKIAlzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmkgPSBGMkZTX0lfU0IoaW5vZGUpOwogCXN0cnVjdCBmc2NyeXB0X2N0eCAqY3R4ID0gTlVMTDsKQEAgLTEyODQsNyArMTI5NSw3IEBACiAKIAlpZiAoIXdiYy0+Zm9yX3JlY2xhaW0pCiAJCW5lZWRfYmFsYW5jZV9mcyA9IHRydWU7Ci0JZWxzZSBpZiAoaGFzX25vdF9lbm91Z2hfZnJlZV9zZWNzKHNiaSwgMCkpCisJZWxzZSBpZiAoaGFzX25vdF9lbm91Z2hfZnJlZV9zZWNzKHNiaSwgMCwgMCkpCiAJCWdvdG8gcmVkaXJ0eV9vdXQ7CiAKIAllcnIgPSAtRUFHQUlOOwpAQCAtMTM0NCw2ICsxMzU1LDcgQEAKIAlpbnQgY3ljbGVkOwogCWludCByYW5nZV93aG9sZSA9IDA7CiAJaW50IHRhZzsKKwlpbnQgbndyaXR0ZW4gPSAwOwogCiAJcGFnZXZlY19pbml0KCZwdmVjLCAwKTsKIApAQCAtMTQxOCw2ICsxNDMwLDggQEAKIAkJCQlkb25lX2luZGV4ID0gcGFnZS0+aW5kZXggKyAxOwogCQkJCWRvbmUgPSAxOwogCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlud3JpdHRlbisrOwogCQkJfQogCiAJCQlpZiAoLS13YmMtPm5yX3RvX3dyaXRlIDw9IDAgJiYKQEAgLTE0MzksNiArMTQ1MywxMCBAQAogCWlmICh3YmMtPnJhbmdlX2N5Y2xpYyB8fCAocmFuZ2Vfd2hvbGUgJiYgd2JjLT5ucl90b193cml0ZSA+IDApKQogCQltYXBwaW5nLT53cml0ZWJhY2tfaW5kZXggPSBkb25lX2luZGV4OwogCisJaWYgKG53cml0dGVuKQorCQlmMmZzX3N1Ym1pdF9tZXJnZWRfYmlvX2NvbmQoRjJGU19NX1NCKG1hcHBpbmcpLCBtYXBwaW5nLT5ob3N0LAorCQkJCQkJCU5VTEwsIDAsIERBVEEsIFdSSVRFKTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE0ODAsNyArMTQ5OCw2IEBACiAJICogaWYgc29tZSBwYWdlcyB3ZXJlIHRydW5jYXRlZCwgd2UgY2Fubm90IGd1YXJhbnRlZSBpdHMgbWFwcGluZy0+aG9zdAogCSAqIHRvIGRldGVjdCBwZW5kaW5nIGJpb3MuCiAJICovCi0JZjJmc19zdWJtaXRfbWVyZ2VkX2JpbyhzYmksIERBVEEsIFdSSVRFKTsKIAogCXJlbW92ZV9kaXJ0eV9pbm9kZShpbm9kZSk7CiAJcmV0dXJuIHJldDsKQEAgLTE1MTgsOCArMTUzNSw3IEBACiAJICogd2UgYWxyZWFkeSBhbGxvY2F0ZWQgYWxsIHRoZSBibG9ja3MsIHNvIHdlIGRvbid0IG5lZWQgdG8gZ2V0CiAJICogdGhlIGJsb2NrIGFkZHJlc3NlcyB3aGVuIHRoZXJlIGlzIG5vIG5lZWQgdG8gZmlsbCB0aGUgcGFnZS4KIAkgKi8KLQlpZiAoIWYyZnNfaGFzX2lubGluZV9kYXRhKGlub2RlKSAmJiAhZjJmc19lbmNyeXB0ZWRfaW5vZGUoaW5vZGUpICYmCi0JCQkJCWxlbiA9PSBQQUdFX1NJWkUpCisJaWYgKCFmMmZzX2hhc19pbmxpbmVfZGF0YShpbm9kZSkgJiYgbGVuID09IFBBR0VfU0laRSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoZjJmc19oYXNfaW5saW5lX2RhdGEoaW5vZGUpIHx8CkBAIC0xNjE2LDcgKzE2MzIsNyBAQAogCWlmIChlcnIpCiAJCWdvdG8gZmFpbDsKIAotCWlmIChuZWVkX2JhbGFuY2UgJiYgaGFzX25vdF9lbm91Z2hfZnJlZV9zZWNzKHNiaSwgMCkpIHsKKwlpZiAobmVlZF9iYWxhbmNlICYmIGhhc19ub3RfZW5vdWdoX2ZyZWVfc2VjcyhzYmksIDAsIDApKSB7CiAJCXVubG9ja19wYWdlKHBhZ2UpOwogCQlmMmZzX2JhbGFuY2VfZnMoc2JpLCB0cnVlKTsKIAkJbG9ja19wYWdlKHBhZ2UpOwpAQCAtMTYzMywyMiArMTY0OSwxMiBAQAogCWlmIChmMmZzX2VuY3J5cHRlZF9pbm9kZShpbm9kZSkgJiYgU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKIAkJZjJmc193YWl0X29uX2VuY3J5cHRlZF9wYWdlX3dyaXRlYmFjayhzYmksIGJsa2FkZHIpOwogCi0JaWYgKGxlbiA9PSBQQUdFX1NJWkUpCi0JCWdvdG8gb3V0X3VwZGF0ZTsKLQlpZiAoUGFnZVVwdG9kYXRlKHBhZ2UpKQotCQlnb3RvIG91dF9jbGVhcjsKLQotCWlmICgocG9zICYgUEFHRV9NQVNLKSA+PSBpX3NpemVfcmVhZChpbm9kZSkpIHsKLQkJdW5zaWduZWQgc3RhcnQgPSBwb3MgJiAoUEFHRV9TSVpFIC0gMSk7Ci0JCXVuc2lnbmVkIGVuZCA9IHN0YXJ0ICsgbGVuOwotCi0JCS8qIFJlYWRpbmcgYmV5b25kIGlfc2l6ZSBpcyBzaW1wbGU6IG1lbXNldCB0byB6ZXJvICovCi0JCXplcm9fdXNlcl9zZWdtZW50cyhwYWdlLCAwLCBzdGFydCwgZW5kLCBQQUdFX1NJWkUpOwotCQlnb3RvIG91dF91cGRhdGU7Ci0JfQorCWlmIChsZW4gPT0gUEFHRV9TSVpFIHx8IFBhZ2VVcHRvZGF0ZShwYWdlKSkKKwkJcmV0dXJuIDA7CiAKIAlpZiAoYmxrYWRkciA9PSBORVdfQUREUikgewogCQl6ZXJvX3VzZXJfc2VnbWVudChwYWdlLCAwLCBQQUdFX1NJWkUpOworCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CiAJfSBlbHNlIHsKIAkJc3RydWN0IGJpbyAqYmlvOwogCkBAIC0xNjc2LDExICsxNjgyLDYgQEAKIAkJCWdvdG8gZmFpbDsKIAkJfQogCX0KLW91dF91cGRhdGU6Ci0JaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpCi0JCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKLW91dF9jbGVhcjoKLQljbGVhcl9jb2xkX2RhdGEocGFnZSk7CiAJcmV0dXJuIDA7CiAKIGZhaWw6CkBAIC0xNjk4LDEyICsxNjk5LDI3IEBACiAKIAl0cmFjZV9mMmZzX3dyaXRlX2VuZChpbm9kZSwgcG9zLCBsZW4sIGNvcGllZCk7CiAKKwkvKgorCSAqIFRoaXMgc2hvdWxkIGJlIGNvbWUgZnJvbSBsZW4gPT0gUEFHRV9TSVpFLCBhbmQgd2UgZXhwZWN0IGNvcGllZAorCSAqIHNob3VsZCBiZSBQQUdFX1NJWkUuIE90aGVyd2lzZSwgd2UgdHJlYXQgaXQgd2l0aCB6ZXJvIGNvcGllZCBhbmQKKwkgKiBsZXQgZ2VuZXJpY19wZXJmb3JtX3dyaXRlKCkgdHJ5IHRvIGNvcHkgZGF0YSBhZ2FpbiB0aHJvdWdoIGNvcGllZD0wLgorCSAqLworCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCWlmICh1bmxpa2VseShjb3BpZWQgIT0gUEFHRV9TSVpFKSkKKwkJCWNvcGllZCA9IDA7CisJCWVsc2UKKwkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwl9CisJaWYgKCFjb3BpZWQpCisJCWdvdG8gdW5sb2NrX291dDsKKwogCXNldF9wYWdlX2RpcnR5KHBhZ2UpOwotCWYyZnNfcHV0X3BhZ2UocGFnZSwgMSk7CisJY2xlYXJfY29sZF9kYXRhKHBhZ2UpOwogCiAJaWYgKHBvcyArIGNvcGllZCA+IGlfc2l6ZV9yZWFkKGlub2RlKSkKIAkJZjJmc19pX3NpemVfd3JpdGUoaW5vZGUsIHBvcyArIGNvcGllZCk7Ci0KK3VubG9ja19vdXQ6CisJZjJmc19wdXRfcGFnZShwYWdlLCAxKTsKIAlmMmZzX3VwZGF0ZV90aW1lKEYyRlNfSV9TQihpbm9kZSksIFJFUV9USU1FKTsKIAlyZXR1cm4gY29waWVkOwogfQpAQCAtMTg3Myw2ICsxODg5LDU4IEBACiAJcmV0dXJuIGdlbmVyaWNfYmxvY2tfYm1hcChtYXBwaW5nLCBibG9jaywgZ2V0X2RhdGFfYmxvY2tfYm1hcCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfTUlHUkFUSU9OCisjaW5jbHVkZSA8bGludXgvbWlncmF0ZS5oPgorCitpbnQgZjJmc19taWdyYXRlX3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCXN0cnVjdCBwYWdlICpuZXdwYWdlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgZW51bSBtaWdyYXRlX21vZGUgbW9kZSkKK3sKKwlpbnQgcmMsIGV4dHJhX2NvdW50OworCXN0cnVjdCBmMmZzX2lub2RlX2luZm8gKmZpID0gRjJGU19JKG1hcHBpbmctPmhvc3QpOworCWJvb2wgYXRvbWljX3dyaXR0ZW4gPSBJU19BVE9NSUNfV1JJVFRFTl9QQUdFKHBhZ2UpOworCisJQlVHX09OKFBhZ2VXcml0ZWJhY2socGFnZSkpOworCisJLyogbWlncmF0aW5nIGFuIGF0b21pYyB3cml0dGVuIHBhZ2UgaXMgc2FmZSB3aXRoIHRoZSBpbm1lbV9sb2NrIGhvbGQgKi8KKwlpZiAoYXRvbWljX3dyaXR0ZW4gJiYgIW11dGV4X3RyeWxvY2soJmZpLT5pbm1lbV9sb2NrKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwkvKgorCSAqIEEgcmVmZXJlbmNlIGlzIGV4cGVjdGVkIGlmIFBhZ2VQcml2YXRlIHNldCB3aGVuIG1vdmUgbWFwcGluZywKKwkgKiBob3dldmVyIEYyRlMgYnJlYWtzIHRoaXMgZm9yIG1haW50YWluaW5nIGRpcnR5IHBhZ2UgY291bnRzIHdoZW4KKwkgKiB0cnVuY2F0aW5nIHBhZ2VzLiBTbyBoZXJlIGFkanVzdGluZyB0aGUgJ2V4dHJhX2NvdW50JyBtYWtlIGl0IHdvcmsuCisJICovCisJZXh0cmFfY291bnQgPSAoYXRvbWljX3dyaXR0ZW4gPyAxIDogMCkgLSBwYWdlX2hhc19wcml2YXRlKHBhZ2UpOworCXJjID0gbWlncmF0ZV9wYWdlX21vdmVfbWFwcGluZyhtYXBwaW5nLCBuZXdwYWdlLAorCQkJCXBhZ2UsIE5VTEwsIG1vZGUsIGV4dHJhX2NvdW50KTsKKwlpZiAocmMgIT0gTUlHUkFURVBBR0VfU1VDQ0VTUykgeworCQlpZiAoYXRvbWljX3dyaXR0ZW4pCisJCQltdXRleF91bmxvY2soJmZpLT5pbm1lbV9sb2NrKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWlmIChhdG9taWNfd3JpdHRlbikgeworCQlzdHJ1Y3QgaW5tZW1fcGFnZXMgKmN1cjsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjdXIsICZmaS0+aW5tZW1fcGFnZXMsIGxpc3QpCisJCQlpZiAoY3VyLT5wYWdlID09IHBhZ2UpIHsKKwkJCQljdXItPnBhZ2UgPSBuZXdwYWdlOworCQkJCWJyZWFrOworCQkJfQorCQltdXRleF91bmxvY2soJmZpLT5pbm1lbV9sb2NrKTsKKwkJcHV0X3BhZ2UocGFnZSk7CisJCWdldF9wYWdlKG5ld3BhZ2UpOworCX0KKworCWlmIChQYWdlUHJpdmF0ZShwYWdlKSkKKwkJU2V0UGFnZVByaXZhdGUobmV3cGFnZSk7CisJc2V0X3BhZ2VfcHJpdmF0ZShuZXdwYWdlLCBwYWdlX3ByaXZhdGUocGFnZSkpOworCisJbWlncmF0ZV9wYWdlX2NvcHkobmV3cGFnZSwgcGFnZSk7CisKKwlyZXR1cm4gTUlHUkFURVBBR0VfU1VDQ0VTUzsKK30KKyNlbmRpZgorCiBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGYyZnNfZGJsb2NrX2FvcHMgPSB7CiAJLnJlYWRwYWdlCT0gZjJmc19yZWFkX2RhdGFfcGFnZSwKIAkucmVhZHBhZ2VzCT0gZjJmc19yZWFkX2RhdGFfcGFnZXMsCkBAIC0xODg1LDQgKzE5NTMsNyBAQAogCS5yZWxlYXNlcGFnZQk9IGYyZnNfcmVsZWFzZV9wYWdlLAogCS5kaXJlY3RfSU8JPSBmMmZzX2RpcmVjdF9JTywKIAkuYm1hcAkJPSBmMmZzX2JtYXAsCisjaWZkZWYgQ09ORklHX01JR1JBVElPTgorCS5taWdyYXRlcGFnZSAgICA9IGYyZnNfbWlncmF0ZV9wYWdlLAorI2VuZGlmCiB9OwpkaWZmIC0tZ2l0IGEvZnMvZjJmcy9kZWJ1Zy5jIGIvZnMvZjJmcy9kZWJ1Zy5jCmluZGV4IGJhZGQ0MDcuLmZiMjQ1YmQgMTAwNjQ0Ci0tLSBhL2ZzL2YyZnMvZGVidWcuYworKysgYi9mcy9mMmZzL2RlYnVnLmMKQEAgLTQ1LDYgKzQ1LDcgQEAKIAlzaS0+bmRpcnR5X2RlbnQgPSBnZXRfcGFnZXMoc2JpLCBGMkZTX0RJUlRZX0RFTlRTKTsKIAlzaS0+bmRpcnR5X21ldGEgPSBnZXRfcGFnZXMoc2JpLCBGMkZTX0RJUlRZX01FVEEpOwogCXNpLT5uZGlydHlfZGF0YSA9IGdldF9wYWdlcyhzYmksIEYyRlNfRElSVFlfREFUQSk7CisJc2ktPm5kaXJ0eV9pbWV0YSA9IGdldF9wYWdlcyhzYmksIEYyRlNfRElSVFlfSU1FVEEpOwogCXNpLT5uZGlydHlfZGlycyA9IHNiaS0+bmRpcnR5X2lub2RlW0RJUl9JTk9ERV07CiAJc2ktPm5kaXJ0eV9maWxlcyA9IHNiaS0+bmRpcnR5X2lub2RlW0ZJTEVfSU5PREVdOwogCXNpLT5uZGlydHlfYWxsID0gc2JpLT5uZGlydHlfaW5vZGVbRElSVFlfTUVUQV07CkBAIC01NCw2ICs1NSw3IEBACiAJc2ktPnJzdmRfc2VncyA9IHJlc2VydmVkX3NlZ21lbnRzKHNiaSk7CiAJc2ktPm92ZXJwX3NlZ3MgPSBvdmVycHJvdmlzaW9uX3NlZ21lbnRzKHNiaSk7CiAJc2ktPnZhbGlkX2NvdW50ID0gdmFsaWRfdXNlcl9ibG9ja3Moc2JpKTsKKwlzaS0+ZGlzY2FyZF9ibGtzID0gZGlzY2FyZF9ibG9ja3Moc2JpKTsKIAlzaS0+dmFsaWRfbm9kZV9jb3VudCA9IHZhbGlkX25vZGVfY291bnQoc2JpKTsKIAlzaS0+dmFsaWRfaW5vZGVfY291bnQgPSB2YWxpZF9pbm9kZV9jb3VudChzYmkpOwogCXNpLT5pbmxpbmVfeGF0dHIgPSBhdG9taWNfcmVhZCgmc2JpLT5pbmxpbmVfeGF0dHIpOwpAQCAtMTU0LDcgKzE1Niw5IEBACiAJc2ktPmJhc2VfbWVtICs9IHNpemVvZihzdHJ1Y3Qgc2l0X2luZm8pOwogCXNpLT5iYXNlX21lbSArPSBNQUlOX1NFR1Moc2JpKSAqIHNpemVvZihzdHJ1Y3Qgc2VnX2VudHJ5KTsKIAlzaS0+YmFzZV9tZW0gKz0gZjJmc19iaXRtYXBfc2l6ZShNQUlOX1NFR1Moc2JpKSk7Ci0Jc2ktPmJhc2VfbWVtICs9IDMgKiBTSVRfVkJMT0NLX01BUF9TSVpFICogTUFJTl9TRUdTKHNiaSk7CisJc2ktPmJhc2VfbWVtICs9IDIgKiBTSVRfVkJMT0NLX01BUF9TSVpFICogTUFJTl9TRUdTKHNiaSk7CisJaWYgKGYyZnNfZGlzY2FyZF9lbihzYmkpKQorCQlzaS0+YmFzZV9tZW0gKz0gU0lUX1ZCTE9DS19NQVBfU0laRSAqIE1BSU5fU0VHUyhzYmkpOwogCXNpLT5iYXNlX21lbSArPSBTSVRfVkJMT0NLX01BUF9TSVpFOwogCWlmIChzYmktPnNlZ3NfcGVyX3NlYyA+IDEpCiAJCXNpLT5iYXNlX21lbSArPSBNQUlOX1NFQ1Moc2JpKSAqIHNpemVvZihzdHJ1Y3Qgc2VjX2VudHJ5KTsKQEAgLTIyOCw4ICsyMzIsMTMgQEAKIAkJCSAgIHNpLT5zc2FfYXJlYV9zZWdzLCBzaS0+bWFpbl9hcmVhX3NlZ3MpOwogCQlzZXFfcHJpbnRmKHMsICIoT3ZlclByb3Y6JWQgUmVzdjolZCldXG5cbiIsCiAJCQkgICBzaS0+b3ZlcnBfc2Vncywgc2ktPnJzdmRfc2Vncyk7Ci0JCXNlcV9wcmludGYocywgIlV0aWxpemF0aW9uOiAlZCUlICglZCB2YWxpZCBibG9ja3MpXG4iLAotCQkJICAgc2ktPnV0aWxpemF0aW9uLCBzaS0+dmFsaWRfY291bnQpOworCQlpZiAodGVzdF9vcHQoc2ktPnNiaSwgRElTQ0FSRCkpCisJCQlzZXFfcHJpbnRmKHMsICJVdGlsaXphdGlvbjogJXUlJSAoJXUgdmFsaWQgYmxvY2tzLCAldSBkaXNjYXJkIGJsb2NrcylcbiIsCisJCQkJc2ktPnV0aWxpemF0aW9uLCBzaS0+dmFsaWRfY291bnQsIHNpLT5kaXNjYXJkX2Jsa3MpOworCQllbHNlCisJCQlzZXFfcHJpbnRmKHMsICJVdGlsaXphdGlvbjogJXUlJSAoJXUgdmFsaWQgYmxvY2tzKVxuIiwKKwkJCQlzaS0+dXRpbGl6YXRpb24sIHNpLT52YWxpZF9jb3VudCk7CisKIAkJc2VxX3ByaW50ZihzLCAiICAtIE5vZGU6ICV1IChJbm9kZTogJXUsICIsCiAJCQkgICBzaS0+dmFsaWRfbm9kZV9jb3VudCwgc2ktPnZhbGlkX2lub2RlX2NvdW50KTsKIAkJc2VxX3ByaW50ZihzLCAiT3RoZXI6ICV1KVxuICAtIERhdGE6ICV1XG4iLApAQCAtMzExLDYgKzMyMCw4IEBACiAJCQkgICBzaS0+bmRpcnR5X2RhdGEsIHNpLT5uZGlydHlfZmlsZXMpOwogCQlzZXFfcHJpbnRmKHMsICIgIC0gbWV0YTogJTRsbGQgaW4gJTRkXG4iLAogCQkJICAgc2ktPm5kaXJ0eV9tZXRhLCBzaS0+bWV0YV9wYWdlcyk7CisJCXNlcV9wcmludGYocywgIiAgLSBpbWV0YTogJTRsbGRcbiIsCisJCQkgICBzaS0+bmRpcnR5X2ltZXRhKTsKIAkJc2VxX3ByaW50ZihzLCAiICAtIE5BVHM6ICU5ZC8lOWRcbiAgLSBTSVRzOiAlOWQvJTlkXG4iLAogCQkJICAgc2ktPmRpcnR5X25hdHMsIHNpLT5uYXRzLCBzaS0+ZGlydHlfc2l0cywgc2ktPnNpdHMpOwogCQlzZXFfcHJpbnRmKHMsICIgIC0gZnJlZV9uaWRzOiAlOWRcbiIsCmRpZmYgLS1naXQgYS9mcy9mMmZzL2Rpci5jIGIvZnMvZjJmcy9kaXIuYwppbmRleCA5MDU0YWVhLi5jYmY4NWY2NSAxMDA2NDQKLS0tIGEvZnMvZjJmcy9kaXIuYworKysgYi9mcy9mMmZzL2Rpci5jCkBAIC0zNyw3ICszNyw3IEBACiAJCXJldHVybiA0OwogfQogCi11bnNpZ25lZCBjaGFyIGYyZnNfZmlsZXR5cGVfdGFibGVbRjJGU19GVF9NQVhdID0geworc3RhdGljIHVuc2lnbmVkIGNoYXIgZjJmc19maWxldHlwZV90YWJsZVtGMkZTX0ZUX01BWF0gPSB7CiAJW0YyRlNfRlRfVU5LTk9XTl0JPSBEVF9VTktOT1dOLAogCVtGMkZTX0ZUX1JFR19GSUxFXQk9IERUX1JFRywKIAlbRjJGU19GVF9ESVJdCQk9IERUX0RJUiwKQEAgLTE3Miw3ICsxNzIsMTAgQEAKIAlpbnQgbWF4X3Nsb3RzOwogCWYyZnNfaGFzaF90IG5hbWVoYXNoOwogCi0JbmFtZWhhc2ggPSBmMmZzX2RlbnRyeV9oYXNoKCZuYW1lKTsKKwlpZihmbmFtZS0+aGFzaCkKKwkJbmFtZWhhc2ggPSBjcHVfdG9fbGUzMihmbmFtZS0+aGFzaCk7CisJZWxzZQorCQluYW1laGFzaCA9IGYyZnNfZGVudHJ5X2hhc2goJm5hbWUpOwogCiAJbmJ1Y2tldCA9IGRpcl9idWNrZXRzKGxldmVsLCBGMkZTX0koZGlyKS0+aV9kaXJfbGV2ZWwpOwogCW5ibG9jayA9IGJ1Y2tldF9ibG9ja3MobGV2ZWwpOwpAQCAtMjEyLDMxICsyMTUsMTcgQEAKIAlyZXR1cm4gZGU7CiB9CiAKLS8qCi0gKiBGaW5kIGFuIGVudHJ5IGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHdpdGggdGhlIHdhbnRlZCBuYW1lLgotICogSXQgcmV0dXJucyB0aGUgcGFnZSB3aGVyZSB0aGUgZW50cnkgd2FzIGZvdW5kIChhcyBhIHBhcmFtZXRlciAtIHJlc19wYWdlKSwKLSAqIGFuZCB0aGUgZW50cnkgaXRzZWxmLiBQYWdlIGlzIHJldHVybmVkIG1hcHBlZCBhbmQgdW5sb2NrZWQuCi0gKiBFbnRyeSBpcyBndWFyYW50ZWVkIHRvIGJlIHZhbGlkLgotICovCi1zdHJ1Y3QgZjJmc19kaXJfZW50cnkgKmYyZnNfZmluZF9lbnRyeShzdHJ1Y3QgaW5vZGUgKmRpciwKLQkJCWNvbnN0IHN0cnVjdCBxc3RyICpjaGlsZCwgc3RydWN0IHBhZ2UgKipyZXNfcGFnZSkKK3N0cnVjdCBmMmZzX2Rpcl9lbnRyeSAqX19mMmZzX2ZpbmRfZW50cnkoc3RydWN0IGlub2RlICpkaXIsCisJCQlzdHJ1Y3QgZnNjcnlwdF9uYW1lICpmbmFtZSwgc3RydWN0IHBhZ2UgKipyZXNfcGFnZSkKIHsKIAl1bnNpZ25lZCBsb25nIG5wYWdlcyA9IGRpcl9ibG9ja3MoZGlyKTsKIAlzdHJ1Y3QgZjJmc19kaXJfZW50cnkgKmRlID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgbWF4X2RlcHRoOwogCXVuc2lnbmVkIGludCBsZXZlbDsKLQlzdHJ1Y3QgZnNjcnlwdF9uYW1lIGZuYW1lOwotCWludCBlcnI7Ci0KLQllcnIgPSBmc2NyeXB0X3NldHVwX2ZpbGVuYW1lKGRpciwgY2hpbGQsIDEsICZmbmFtZSk7Ci0JaWYgKGVycikgewotCQkqcmVzX3BhZ2UgPSBFUlJfUFRSKGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KIAogCWlmIChmMmZzX2hhc19pbmxpbmVfZGVudHJ5KGRpcikpIHsKIAkJKnJlc19wYWdlID0gTlVMTDsKLQkJZGUgPSBmaW5kX2luX2lubGluZV9kaXIoZGlyLCAmZm5hbWUsIHJlc19wYWdlKTsKKwkJZGUgPSBmaW5kX2luX2lubGluZV9kaXIoZGlyLCBmbmFtZSwgcmVzX3BhZ2UpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTI1NiwxMSArMjQ1LDM1IEBACiAKIAlmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBtYXhfZGVwdGg7IGxldmVsKyspIHsKIAkJKnJlc19wYWdlID0gTlVMTDsKLQkJZGUgPSBmaW5kX2luX2xldmVsKGRpciwgbGV2ZWwsICZmbmFtZSwgcmVzX3BhZ2UpOworCQlkZSA9IGZpbmRfaW5fbGV2ZWwoZGlyLCBsZXZlbCwgZm5hbWUsIHJlc19wYWdlKTsKIAkJaWYgKGRlIHx8IElTX0VSUigqcmVzX3BhZ2UpKQogCQkJYnJlYWs7CiAJfQogb3V0OgorCXJldHVybiBkZTsKK30KKworLyoKKyAqIEZpbmQgYW4gZW50cnkgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3Rvcnkgd2l0aCB0aGUgd2FudGVkIG5hbWUuCisgKiBJdCByZXR1cm5zIHRoZSBwYWdlIHdoZXJlIHRoZSBlbnRyeSB3YXMgZm91bmQgKGFzIGEgcGFyYW1ldGVyIC0gcmVzX3BhZ2UpLAorICogYW5kIHRoZSBlbnRyeSBpdHNlbGYuIFBhZ2UgaXMgcmV0dXJuZWQgbWFwcGVkIGFuZCB1bmxvY2tlZC4KKyAqIEVudHJ5IGlzIGd1YXJhbnRlZWQgdG8gYmUgdmFsaWQuCisgKi8KK3N0cnVjdCBmMmZzX2Rpcl9lbnRyeSAqZjJmc19maW5kX2VudHJ5KHN0cnVjdCBpbm9kZSAqZGlyLAorCQkJY29uc3Qgc3RydWN0IHFzdHIgKmNoaWxkLCBzdHJ1Y3QgcGFnZSAqKnJlc19wYWdlKQoreworCXN0cnVjdCBmMmZzX2Rpcl9lbnRyeSAqZGUgPSBOVUxMOworCXN0cnVjdCBmc2NyeXB0X25hbWUgZm5hbWU7CisJaW50IGVycjsKKworCWVyciA9IGZzY3J5cHRfc2V0dXBfZmlsZW5hbWUoZGlyLCBjaGlsZCwgMSwgJmZuYW1lKTsKKwlpZiAoZXJyKSB7CisJCSpyZXNfcGFnZSA9IEVSUl9QVFIoZXJyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZGUgPSBfX2YyZnNfZmluZF9lbnRyeShkaXIsICZmbmFtZSwgcmVzX3BhZ2UpOworCiAJZnNjcnlwdF9mcmVlX2ZpbGVuYW1lKCZmbmFtZSk7CiAJcmV0dXJuIGRlOwogfQpAQCAtMzc1LDcgKzM4OCw4IEBACiB9CiAKIHN0cnVjdCBwYWdlICppbml0X2lub2RlX21ldGFkYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyLAotCQkJY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUsIHN0cnVjdCBwYWdlICpkcGFnZSkKKwkJCWNvbnN0IHN0cnVjdCBxc3RyICpuZXdfbmFtZSwgY29uc3Qgc3RydWN0IHFzdHIgKm9yaWdfbmFtZSwKKwkJCXN0cnVjdCBwYWdlICpkcGFnZSkKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlpbnQgZXJyOwpAQCAtNDAwLDcgKzQxNCw3IEBACiAJCWlmIChlcnIpCiAJCQlnb3RvIHB1dF9lcnJvcjsKIAotCQllcnIgPSBmMmZzX2luaXRfc2VjdXJpdHkoaW5vZGUsIGRpciwgbmFtZSwgcGFnZSk7CisJCWVyciA9IGYyZnNfaW5pdF9zZWN1cml0eShpbm9kZSwgZGlyLCBvcmlnX25hbWUsIHBhZ2UpOwogCQlpZiAoZXJyKQogCQkJZ290byBwdXRfZXJyb3I7CiAKQEAgLTQxNyw4ICs0MzEsOCBAQAogCQlzZXRfY29sZF9ub2RlKGlub2RlLCBwYWdlKTsKIAl9CiAKLQlpZiAobmFtZSkKLQkJaW5pdF9kZW50X2lub2RlKG5hbWUsIHBhZ2UpOworCWlmIChuZXdfbmFtZSkKKwkJaW5pdF9kZW50X2lub2RlKG5ld19uYW1lLCBwYWdlKTsKIAogCS8qCiAJICogVGhpcyBmaWxlIHNob3VsZCBiZSBjaGVja3BvaW50ZWQgZHVyaW5nIGZzeW5jLgpAQCAtNDk2LDcgKzUxMCw3IEBACiAJZGUtPmlubyA9IGNwdV90b19sZTMyKGlubyk7CiAJc2V0X2RlX3R5cGUoZGUsIG1vZGUpOwogCWZvciAoaSA9IDA7IGkgPCBzbG90czsgaSsrKSB7Ci0JCXRlc3RfYW5kX3NldF9iaXRfbGUoYml0X3BvcyArIGksICh2b2lkICopZC0+Yml0bWFwKTsKKwkJX19zZXRfYml0X2xlKGJpdF9wb3MgKyBpLCAodm9pZCAqKWQtPmJpdG1hcCk7CiAJCS8qIGF2b2lkIHdyb25nIGdhcmJhZ2UgZGF0YSBmb3IgcmVhZGRpciAqLwogCQlpZiAoaSkKIAkJCShkZSArIGkpLT5uYW1lX2xlbiA9IDA7CkBAIC01MDQsNiArNTE4LDcgQEAKIH0KIAogaW50IGYyZnNfYWRkX3JlZ3VsYXJfZW50cnkoc3RydWN0IGlub2RlICpkaXIsIGNvbnN0IHN0cnVjdCBxc3RyICpuZXdfbmFtZSwKKwkJCQljb25zdCBzdHJ1Y3QgcXN0ciAqb3JpZ19uYW1lLAogCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIG5pZF90IGlubywgdW1vZGVfdCBtb2RlKQogewogCXVuc2lnbmVkIGludCBiaXRfcG9zOwpAQCAtNTMwLDcgKzU0NSw3IEBACiAKIHN0YXJ0OgogI2lmZGVmIENPTkZJR19GMkZTX0ZBVUxUX0lOSkVDVElPTgotCWlmICh0aW1lX3RvX2luamVjdChGQVVMVF9ESVJfREVQVEgpKQorCWlmICh0aW1lX3RvX2luamVjdChGMkZTX0lfU0IoZGlyKSwgRkFVTFRfRElSX0RFUFRIKSkKIAkJcmV0dXJuIC1FTk9TUEM7CiAjZW5kaWYKIAlpZiAodW5saWtlbHkoY3VycmVudF9kZXB0aCA9PSBNQVhfRElSX0hBU0hfREVQVEgpKQpAQCAtNTY5LDcgKzU4NCw4IEBACiAKIAlpZiAoaW5vZGUpIHsKIAkJZG93bl93cml0ZSgmRjJGU19JKGlub2RlKS0+aV9zZW0pOwotCQlwYWdlID0gaW5pdF9pbm9kZV9tZXRhZGF0YShpbm9kZSwgZGlyLCBuZXdfbmFtZSwgTlVMTCk7CisJCXBhZ2UgPSBpbml0X2lub2RlX21ldGFkYXRhKGlub2RlLCBkaXIsIG5ld19uYW1lLAorCQkJCQkJb3JpZ19uYW1lLCBOVUxMKTsKIAkJaWYgKElTX0VSUihwYWdlKSkgewogCQkJZXJyID0gUFRSX0VSUihwYWdlKTsKIAkJCWdvdG8gZmFpbDsKQEAgLTU5OSw2ICs2MTUsMjYgQEAKIAlyZXR1cm4gZXJyOwogfQogCitpbnQgX19mMmZzX2RvX2FkZF9saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZnNjcnlwdF9uYW1lICpmbmFtZSwKKwkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBuaWRfdCBpbm8sIHVtb2RlX3QgbW9kZSkKK3sKKwlzdHJ1Y3QgcXN0ciBuZXdfbmFtZTsKKwlpbnQgZXJyID0gLUVBR0FJTjsKKworCW5ld19uYW1lLm5hbWUgPSBmbmFtZV9uYW1lKGZuYW1lKTsKKwluZXdfbmFtZS5sZW4gPSBmbmFtZV9sZW4oZm5hbWUpOworCisJaWYgKGYyZnNfaGFzX2lubGluZV9kZW50cnkoZGlyKSkKKwkJZXJyID0gZjJmc19hZGRfaW5saW5lX2VudHJ5KGRpciwgJm5ld19uYW1lLCBmbmFtZS0+dXNyX2ZuYW1lLAorCQkJCQkJCWlub2RlLCBpbm8sIG1vZGUpOworCWlmIChlcnIgPT0gLUVBR0FJTikKKwkJZXJyID0gZjJmc19hZGRfcmVndWxhcl9lbnRyeShkaXIsICZuZXdfbmFtZSwgZm5hbWUtPnVzcl9mbmFtZSwKKwkJCQkJCQlpbm9kZSwgaW5vLCBtb2RlKTsKKworCWYyZnNfdXBkYXRlX3RpbWUoRjJGU19JX1NCKGRpciksIFJFUV9USU1FKTsKKwlyZXR1cm4gZXJyOworfQorCiAvKgogICogQ2FsbGVyIHNob3VsZCBncmFiIGFuZCByZWxlYXNlIGEgcndzZW0gYnkgY2FsbGluZyBmMmZzX2xvY2tfb3AoKSBhbmQKICAqIGYyZnNfdW5sb2NrX29wKCkuCkBAIC02MDcsMjQgKzY0MywxNSBAQAogCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIG5pZF90IGlubywgdW1vZGVfdCBtb2RlKQogewogCXN0cnVjdCBmc2NyeXB0X25hbWUgZm5hbWU7Ci0Jc3RydWN0IHFzdHIgbmV3X25hbWU7CiAJaW50IGVycjsKIAogCWVyciA9IGZzY3J5cHRfc2V0dXBfZmlsZW5hbWUoZGlyLCBuYW1lLCAwLCAmZm5hbWUpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQluZXdfbmFtZS5uYW1lID0gZm5hbWVfbmFtZSgmZm5hbWUpOwotCW5ld19uYW1lLmxlbiA9IGZuYW1lX2xlbigmZm5hbWUpOwotCi0JZXJyID0gLUVBR0FJTjsKLQlpZiAoZjJmc19oYXNfaW5saW5lX2RlbnRyeShkaXIpKQotCQllcnIgPSBmMmZzX2FkZF9pbmxpbmVfZW50cnkoZGlyLCAmbmV3X25hbWUsIGlub2RlLCBpbm8sIG1vZGUpOwotCWlmIChlcnIgPT0gLUVBR0FJTikKLQkJZXJyID0gZjJmc19hZGRfcmVndWxhcl9lbnRyeShkaXIsICZuZXdfbmFtZSwgaW5vZGUsIGlubywgbW9kZSk7CisJZXJyID0gX19mMmZzX2RvX2FkZF9saW5rKGRpciwgJmZuYW1lLCBpbm9kZSwgaW5vLCBtb2RlKTsKIAogCWZzY3J5cHRfZnJlZV9maWxlbmFtZSgmZm5hbWUpOwotCWYyZnNfdXBkYXRlX3RpbWUoRjJGU19JX1NCKGRpciksIFJFUV9USU1FKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC02MzQsNyArNjYxLDcgQEAKIAlpbnQgZXJyID0gMDsKIAogCWRvd25fd3JpdGUoJkYyRlNfSShpbm9kZSktPmlfc2VtKTsKLQlwYWdlID0gaW5pdF9pbm9kZV9tZXRhZGF0YShpbm9kZSwgZGlyLCBOVUxMLCBOVUxMKTsKKwlwYWdlID0gaW5pdF9pbm9kZV9tZXRhZGF0YShpbm9kZSwgZGlyLCBOVUxMLCBOVUxMLCBOVUxMKTsKIAlpZiAoSVNfRVJSKHBhZ2UpKSB7CiAJCWVyciA9IFBUUl9FUlIocGFnZSk7CiAJCWdvdG8gZmFpbDsKQEAgLTc4OCwxNiArODE1LDkgQEAKIAkJCWludCBzYXZlX2xlbiA9IGZzdHItPmxlbjsKIAkJCWludCByZXQ7CiAKLQkJCWRlX25hbWUubmFtZSA9IGYyZnNfa21hbGxvYyhkZV9uYW1lLmxlbiwgR0ZQX05PRlMpOwotCQkJaWYgKCFkZV9uYW1lLm5hbWUpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQltZW1jcHkoZGVfbmFtZS5uYW1lLCBkLT5maWxlbmFtZVtiaXRfcG9zXSwgZGVfbmFtZS5sZW4pOwotCiAJCQlyZXQgPSBmc2NyeXB0X2ZuYW1lX2Rpc2tfdG9fdXNyKGQtPmlub2RlLAogCQkJCQkJKHUzMilkZS0+aGFzaF9jb2RlLCAwLAogCQkJCQkJJmRlX25hbWUsIGZzdHIpOwotCQkJa2ZyZWUoZGVfbmFtZS5uYW1lKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCXJldHVybiB0cnVlOwogCmRpZmYgLS1naXQgYS9mcy9mMmZzL2YyZnMuaCBiL2ZzL2YyZnMvZjJmcy5oCmluZGV4IDY3NWZhNzkuLjllOGRlMTggMTAwNjQ0Ci0tLSBhL2ZzL2YyZnMvZjJmcy5oCisrKyBiL2ZzL2YyZnMvZjJmcy5oCkBAIC00Niw2ICs0Niw4IEBACiAJRkFVTFRfQkxPQ0ssCiAJRkFVTFRfRElSX0RFUFRILAogCUZBVUxUX0VWSUNUX0lOT0RFLAorCUZBVUxUX0lPLAorCUZBVUxUX0NIRUNLUE9JTlQsCiAJRkFVTFRfTUFYLAogfTsKIApAQCAtNTUsNDAgKzU3LDggQEAKIAl1bnNpZ25lZCBpbnQgaW5qZWN0X3R5cGU7CiB9OwogCi1leHRlcm4gc3RydWN0IGYyZnNfZmF1bHRfaW5mbyBmMmZzX2ZhdWx0OwogZXh0ZXJuIGNoYXIgKmZhdWx0X25hbWVbRkFVTFRfTUFYXTsKLSNkZWZpbmUgSVNfRkFVTFRfU0VUKHR5cGUpIChmMmZzX2ZhdWx0LmluamVjdF90eXBlICYgKDEgPDwgKHR5cGUpKSkKLQotc3RhdGljIGlubGluZSBib29sIHRpbWVfdG9faW5qZWN0KGludCB0eXBlKQotewotCWlmICghZjJmc19mYXVsdC5pbmplY3RfcmF0ZSkKLQkJcmV0dXJuIGZhbHNlOwotCWlmICh0eXBlID09IEZBVUxUX0tNQUxMT0MgJiYgIUlTX0ZBVUxUX1NFVCh0eXBlKSkKLQkJcmV0dXJuIGZhbHNlOwotCWVsc2UgaWYgKHR5cGUgPT0gRkFVTFRfUEFHRV9BTExPQyAmJiAhSVNfRkFVTFRfU0VUKHR5cGUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JZWxzZSBpZiAodHlwZSA9PSBGQVVMVF9BTExPQ19OSUQgJiYgIUlTX0ZBVUxUX1NFVCh0eXBlKSkKLQkJcmV0dXJuIGZhbHNlOwotCWVsc2UgaWYgKHR5cGUgPT0gRkFVTFRfT1JQSEFOICYmICFJU19GQVVMVF9TRVQodHlwZSkpCi0JCXJldHVybiBmYWxzZTsKLQllbHNlIGlmICh0eXBlID09IEZBVUxUX0JMT0NLICYmICFJU19GQVVMVF9TRVQodHlwZSkpCi0JCXJldHVybiBmYWxzZTsKLQllbHNlIGlmICh0eXBlID09IEZBVUxUX0RJUl9ERVBUSCAmJiAhSVNfRkFVTFRfU0VUKHR5cGUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JZWxzZSBpZiAodHlwZSA9PSBGQVVMVF9FVklDVF9JTk9ERSAmJiAhSVNfRkFVTFRfU0VUKHR5cGUpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlhdG9taWNfaW5jKCZmMmZzX2ZhdWx0LmluamVjdF9vcHMpOwotCWlmIChhdG9taWNfcmVhZCgmZjJmc19mYXVsdC5pbmplY3Rfb3BzKSA+PSBmMmZzX2ZhdWx0LmluamVjdF9yYXRlKSB7Ci0JCWF0b21pY19zZXQoJmYyZnNfZmF1bHQuaW5qZWN0X29wcywgMCk7Ci0JCXByaW50aygiJXNGMkZTLWZzIDogaW5qZWN0ICVzIGluICVwRlxuIiwKLQkJCQlLRVJOX0lORk8sCi0JCQkJZmF1bHRfbmFtZVt0eXBlXSwKLQkJCQlfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQorI2RlZmluZSBJU19GQVVMVF9TRVQoZmksIHR5cGUpIChmaS0+aW5qZWN0X3R5cGUgJiAoMSA8PCAodHlwZSkpKQogI2VuZGlmCiAKIC8qCkBAIC0xNTgsNyArMTI4LDcgQEAKIAlDUF9ESVNDQVJELAogfTsKIAotI2RlZmluZSBERUZfQkFUQ0hFRF9UUklNX1NFQ1RJT05TCTMyCisjZGVmaW5lIERFRl9CQVRDSEVEX1RSSU1fU0VDVElPTlMJMgogI2RlZmluZSBCQVRDSEVEX1RSSU1fU0VHTUVOVFMoc2JpKQlcCiAJCShTTV9JKHNiaSktPnRyaW1fc2VjdGlvbnMgKiAoc2JpKS0+c2Vnc19wZXJfc2VjKQogI2RlZmluZSBCQVRDSEVEX1RSSU1fQkxPQ0tTKHNiaSkJXApAQCAtMjExLDYgKzE4MSwxMyBAQAogCWludCBsZW47CQkvKiAjIG9mIGNvbnNlY3V0aXZlIGJsb2NrcyBvZiB0aGUgZGlzY2FyZCAqLwogfTsKIAorc3RydWN0IGJpb19lbnRyeSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBiaW8gKmJpbzsKKwlzdHJ1Y3QgY29tcGxldGlvbiBldmVudDsKKwlpbnQgZXJyb3I7Cit9OworCiAvKiBmb3IgdGhlIGxpc3Qgb2YgZnN5bmMgaW5vZGVzLCB1c2VkIG9ubHkgZHVyaW5nIHJlY292ZXJ5ICovCiBzdHJ1Y3QgZnN5bmNfaW5vZGVfZW50cnkgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJLyogbGlzdCBoZWFkICovCkBAIC01MzgsNyArNTE1LDcgQEAKIAkvKiBOQVQgY2FjaGUgbWFuYWdlbWVudCAqLwogCXN0cnVjdCByYWRpeF90cmVlX3Jvb3QgbmF0X3Jvb3Q7Lyogcm9vdCBvZiB0aGUgbmF0IGVudHJ5IGNhY2hlICovCiAJc3RydWN0IHJhZGl4X3RyZWVfcm9vdCBuYXRfc2V0X3Jvb3Q7Lyogcm9vdCBvZiB0aGUgbmF0IHNldCBjYWNoZSAqLwotCXN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlIG5hdF90cmVlX2xvY2s7CS8qIHByb3RlY3QgbmF0X3RyZWVfbG9jayAqLworCXN0cnVjdCByd19zZW1hcGhvcmUgbmF0X3RyZWVfbG9jazsJLyogcHJvdGVjdCBuYXRfdHJlZV9sb2NrICovCiAJc3RydWN0IGxpc3RfaGVhZCBuYXRfZW50cmllczsJLyogY2FjaGVkIG5hdCBlbnRyeSBsaXN0IChjbGVhbikgKi8KIAl1bnNpZ25lZCBpbnQgbmF0X2NudDsJCS8qIHRoZSAjIG9mIGNhY2hlZCBuYXQgZW50cmllcyAqLwogCXVuc2lnbmVkIGludCBkaXJ0eV9uYXRfY250OwkvKiB0b3RhbCBudW0gb2YgbmF0IGVudHJpZXMgaW4gc2V0ICovCkBAIC02NDUsNiArNjIyLDcgQEAKIAogCS8qIGZvciBzbWFsbCBkaXNjYXJkIG1hbmFnZW1lbnQgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGRpc2NhcmRfbGlzdDsJCS8qIDRLQiBkaXNjYXJkIGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHdhaXRfbGlzdDsJCS8qIGxpbmtlZCB3aXRoIGlzc3VlZCBkaXNjYXJkIGJpbyAqLwogCWludCBucl9kaXNjYXJkczsJCQkvKiAjIG9mIGRpc2NhcmRzIGluIHRoZSBsaXN0ICovCiAJaW50IG1heF9kaXNjYXJkczsJCQkvKiBtYXguIGRpc2NhcmRzIHRvIGJlIGlzc3VlZCAqLwogCkBAIC03NDgsNiArNzI2LDcgQEAKIAlTQklfTkVFRF9GU0NLLAkJCQkvKiBuZWVkIGZzY2suZjJmcyB0byBmaXggKi8KIAlTQklfUE9SX0RPSU5HLAkJCQkvKiByZWNvdmVyeSBpcyBkb2luZyBvciBub3QgKi8KIAlTQklfTkVFRF9TQl9XUklURSwJCQkvKiBuZWVkIHRvIHJlY292ZXIgc3VwZXJibG9jayAqLworCVNCSV9ORUVEX0NQLAkJCQkvKiBuZWVkIHRvIGNoZWNrcG9pbnQgKi8KIH07CiAKIGVudW0gewpAQCAtNzY1LDcgKzc0NCw3IEBACiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpzX3Byb2M7CQkvKiBwcm9jIGVudHJ5ICovCiAJc3RydWN0IGYyZnNfc3VwZXJfYmxvY2sgKnJhd19zdXBlcjsJLyogcmF3IHN1cGVyIGJsb2NrIHBvaW50ZXIgKi8KIAlpbnQgdmFsaWRfc3VwZXJfYmxvY2s7CQkJLyogdmFsaWQgc3VwZXIgYmxvY2sgbm8gKi8KLQlpbnQgc19mbGFnOwkJCQkvKiBmbGFncyBmb3Igc2JpICovCisJdW5zaWduZWQgbG9uZyBzX2ZsYWc7CQkJCS8qIGZsYWdzIGZvciBzYmkgKi8KIAogI2lmZGVmIENPTkZJR19GMkZTX0ZTX0VOQ1JZUFRJT04KIAl1OCBrZXlfcHJlZml4W0YyRlNfS0VZX0RFU0NfUFJFRklYX1NJWkVdOwpAQCAtNzg1LDkgKzc2NCwxMCBAQAogCiAJLyogZm9yIGNoZWNrcG9pbnQgKi8KIAlzdHJ1Y3QgZjJmc19jaGVja3BvaW50ICpja3B0OwkJLyogcmF3IGNoZWNrcG9pbnQgcG9pbnRlciAqLworCXNwaW5sb2NrX3QgY3BfbG9jazsJCQkvKiBmb3IgZmxhZyBpbiBja3B0ICovCiAJc3RydWN0IGlub2RlICptZXRhX2lub2RlOwkJLyogY2FjaGUgbWV0YSBibG9ja3MgKi8KIAlzdHJ1Y3QgbXV0ZXggY3BfbXV0ZXg7CQkJLyogY2hlY2twb2ludCBwcm9jZWR1cmUgbG9jayAqLwotCXN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlIGNwX3J3c2VtOwkJLyogYmxvY2tpbmcgRlMgb3BlcmF0aW9ucyAqLworCXN0cnVjdCByd19zZW1hcGhvcmUgY3BfcndzZW07CQkvKiBibG9ja2luZyBGUyBvcGVyYXRpb25zICovCiAJc3RydWN0IHJ3X3NlbWFwaG9yZSBub2RlX3dyaXRlOwkJLyogbG9ja2luZyBub2RlIHdyaXRlcyAqLwogCXdhaXRfcXVldWVfaGVhZF90IGNwX3dhaXQ7CiAJdW5zaWduZWQgbG9uZyBsYXN0X3RpbWVbTUFYX1RJTUVdOwkvKiB0byBzdG9yZSB0aW1lIGluIGppZmZpZXMgKi8KQEAgLTg5Miw4ICs4NzIsMzcgQEAKIAogCS8qIFJlZmVyZW5jZSB0byBjaGVja3N1bSBhbGdvcml0aG0gZHJpdmVyIHZpYSBjcnlwdG9hcGkgKi8KIAlzdHJ1Y3QgY3J5cHRvX3NoYXNoICpzX2Noa3N1bV9kcml2ZXI7CisKKwkvKiBGb3IgZmF1bHQgaW5qZWN0aW9uICovCisjaWZkZWYgQ09ORklHX0YyRlNfRkFVTFRfSU5KRUNUSU9OCisJc3RydWN0IGYyZnNfZmF1bHRfaW5mbyBmYXVsdF9pbmZvOworI2VuZGlmCiB9OwogCisjaWZkZWYgQ09ORklHX0YyRlNfRkFVTFRfSU5KRUNUSU9OCitzdGF0aWMgaW5saW5lIGJvb2wgdGltZV90b19pbmplY3Qoc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgZjJmc19mYXVsdF9pbmZvICpmZmkgPSAmc2JpLT5mYXVsdF9pbmZvOworCisJaWYgKCFmZmktPmluamVjdF9yYXRlKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoIUlTX0ZBVUxUX1NFVChmZmksIHR5cGUpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlhdG9taWNfaW5jKCZmZmktPmluamVjdF9vcHMpOworCWlmIChhdG9taWNfcmVhZCgmZmZpLT5pbmplY3Rfb3BzKSA+PSBmZmktPmluamVjdF9yYXRlKSB7CisJCWF0b21pY19zZXQoJmZmaS0+aW5qZWN0X29wcywgMCk7CisJCXByaW50aygiJXNGMkZTLWZzIDogaW5qZWN0ICVzIGluICVwRlxuIiwKKwkJCQlLRVJOX0lORk8sCisJCQkJZmF1bHRfbmFtZVt0eXBlXSwKKwkJCQlfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorI2VuZGlmCisKIC8qIEZvciB3cml0ZSBzdGF0aXN0aWNzLiBTdXBwb3NlIHNlY3RvciBzaXplIGlzIDUxMiBieXRlcywKICAqIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIGluIGtieXRlcy4gcyBpcyBvZiBzdHJ1Y3QgZjJmc19zYl9pbmZvLgogICovCkBAIC0xMDM0LDE3ICsxMDQzLDE3IEBACiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBpc19zYmlfZmxhZ19zZXQoc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpLCB1bnNpZ25lZCBpbnQgdHlwZSkKIHsKLQlyZXR1cm4gc2JpLT5zX2ZsYWcgJiAoMHgwMSA8PCB0eXBlKTsKKwlyZXR1cm4gdGVzdF9iaXQodHlwZSwgJnNiaS0+c19mbGFnKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHNldF9zYmlfZmxhZyhzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksIHVuc2lnbmVkIGludCB0eXBlKQogewotCXNiaS0+c19mbGFnIHw9ICgweDAxIDw8IHR5cGUpOworCXNldF9iaXQodHlwZSwgJnNiaS0+c19mbGFnKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX3NiaV9mbGFnKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwgdW5zaWduZWQgaW50IHR5cGUpCiB7Ci0Jc2JpLT5zX2ZsYWcgJj0gfigweDAxIDw8IHR5cGUpOworCWNsZWFyX2JpdCh0eXBlLCAmc2JpLT5zX2ZsYWcpOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBjdXJfY3BfdmVyc2lvbihzdHJ1Y3QgZjJmc19jaGVja3BvaW50ICpjcCkKQEAgLTEwNTIsNDQgKzEwNjEsNzUgQEAKIAlyZXR1cm4gbGU2NF90b19jcHUoY3AtPmNoZWNrcG9pbnRfdmVyKTsKIH0KIAotc3RhdGljIGlubGluZSBib29sIGlzX3NldF9ja3B0X2ZsYWdzKHN0cnVjdCBmMmZzX2NoZWNrcG9pbnQgKmNwLCB1bnNpZ25lZCBpbnQgZikKK3N0YXRpYyBpbmxpbmUgYm9vbCBfX2lzX3NldF9ja3B0X2ZsYWdzKHN0cnVjdCBmMmZzX2NoZWNrcG9pbnQgKmNwLCB1bnNpZ25lZCBpbnQgZikKIHsKIAl1bnNpZ25lZCBpbnQgY2twdF9mbGFncyA9IGxlMzJfdG9fY3B1KGNwLT5ja3B0X2ZsYWdzKTsKKwogCXJldHVybiBja3B0X2ZsYWdzICYgZjsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNldF9ja3B0X2ZsYWdzKHN0cnVjdCBmMmZzX2NoZWNrcG9pbnQgKmNwLCB1bnNpZ25lZCBpbnQgZikKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19zZXRfY2twdF9mbGFncyhzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksIHVuc2lnbmVkIGludCBmKQogewotCXVuc2lnbmVkIGludCBja3B0X2ZsYWdzID0gbGUzMl90b19jcHUoY3AtPmNrcHRfZmxhZ3MpOworCXJldHVybiBfX2lzX3NldF9ja3B0X2ZsYWdzKEYyRlNfQ0tQVChzYmkpLCBmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fc2V0X2NrcHRfZmxhZ3Moc3RydWN0IGYyZnNfY2hlY2twb2ludCAqY3AsIHVuc2lnbmVkIGludCBmKQoreworCXVuc2lnbmVkIGludCBja3B0X2ZsYWdzOworCisJY2twdF9mbGFncyA9IGxlMzJfdG9fY3B1KGNwLT5ja3B0X2ZsYWdzKTsKIAlja3B0X2ZsYWdzIHw9IGY7CiAJY3AtPmNrcHRfZmxhZ3MgPSBjcHVfdG9fbGUzMihja3B0X2ZsYWdzKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX2NrcHRfZmxhZ3Moc3RydWN0IGYyZnNfY2hlY2twb2ludCAqY3AsIHVuc2lnbmVkIGludCBmKQorc3RhdGljIGlubGluZSB2b2lkIHNldF9ja3B0X2ZsYWdzKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwgdW5zaWduZWQgaW50IGYpCiB7Ci0JdW5zaWduZWQgaW50IGNrcHRfZmxhZ3MgPSBsZTMyX3RvX2NwdShjcC0+Y2twdF9mbGFncyk7CisJc3Bpbl9sb2NrKCZzYmktPmNwX2xvY2spOworCV9fc2V0X2NrcHRfZmxhZ3MoRjJGU19DS1BUKHNiaSksIGYpOworCXNwaW5fdW5sb2NrKCZzYmktPmNwX2xvY2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19jbGVhcl9ja3B0X2ZsYWdzKHN0cnVjdCBmMmZzX2NoZWNrcG9pbnQgKmNwLCB1bnNpZ25lZCBpbnQgZikKK3sKKwl1bnNpZ25lZCBpbnQgY2twdF9mbGFnczsKKworCWNrcHRfZmxhZ3MgPSBsZTMyX3RvX2NwdShjcC0+Y2twdF9mbGFncyk7CiAJY2twdF9mbGFncyAmPSAofmYpOwogCWNwLT5ja3B0X2ZsYWdzID0gY3B1X3RvX2xlMzIoY2twdF9mbGFncyk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9ja3B0X2ZsYWdzKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwgdW5zaWduZWQgaW50IGYpCit7CisJc3Bpbl9sb2NrKCZzYmktPmNwX2xvY2spOworCV9fY2xlYXJfY2twdF9mbGFncyhGMkZTX0NLUFQoc2JpKSwgZik7CisJc3Bpbl91bmxvY2soJnNiaS0+Y3BfbG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBmMmZzX2Rpc2NhcmRfZW4oc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpKQoreworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gYmRldl9nZXRfcXVldWUoc2JpLT5zYi0+c19iZGV2KTsKKworCXJldHVybiBibGtfcXVldWVfZGlzY2FyZChxKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGYyZnNfbG9ja19vcChzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmkpCiB7Ci0JcGVyY3B1X2Rvd25fcmVhZCgmc2JpLT5jcF9yd3NlbSk7CisJZG93bl9yZWFkKCZzYmktPmNwX3J3c2VtKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGYyZnNfdW5sb2NrX29wKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSkKIHsKLQlwZXJjcHVfdXBfcmVhZCgmc2JpLT5jcF9yd3NlbSk7CisJdXBfcmVhZCgmc2JpLT5jcF9yd3NlbSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmMmZzX2xvY2tfYWxsKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSkKIHsKLQlwZXJjcHVfZG93bl93cml0ZSgmc2JpLT5jcF9yd3NlbSk7CisJZG93bl93cml0ZSgmc2JpLT5jcF9yd3NlbSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmMmZzX3VubG9ja19hbGwoc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpKQogewotCXBlcmNwdV91cF93cml0ZSgmc2JpLT5jcF9yd3NlbSk7CisJdXBfd3JpdGUoJnNiaS0+Y3BfcndzZW0pOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBfX2dldF9jcF9yZWFzb24oc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpKQpAQCAtMTExMCw4ICsxMTUwLDggQEAKIAogc3RhdGljIGlubGluZSBib29sIF9fZXhpc3Rfbm9kZV9zdW1tYXJpZXMoc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpKQogewotCXJldHVybiAoaXNfc2V0X2NrcHRfZmxhZ3MoRjJGU19DS1BUKHNiaSksIENQX1VNT1VOVF9GTEFHKSB8fAotCQkJaXNfc2V0X2NrcHRfZmxhZ3MoRjJGU19DS1BUKHNiaSksIENQX0ZBU1RCT09UX0ZMQUcpKTsKKwlyZXR1cm4gKGlzX3NldF9ja3B0X2ZsYWdzKHNiaSwgQ1BfVU1PVU5UX0ZMQUcpIHx8CisJCQlpc19zZXRfY2twdF9mbGFncyhzYmksIENQX0ZBU1RCT09UX0ZMQUcpKTsKIH0KIAogLyoKQEAgLTExNTEsNyArMTE5MSw3IEBACiAJYmxrY250X3QgZGlmZjsKIAogI2lmZGVmIENPTkZJR19GMkZTX0ZBVUxUX0lOSkVDVElPTgotCWlmICh0aW1lX3RvX2luamVjdChGQVVMVF9CTE9DSykpCisJaWYgKHRpbWVfdG9faW5qZWN0KHNiaSwgRkFVTFRfQkxPQ0spKQogCQlyZXR1cm4gZmFsc2U7CiAjZW5kaWYKIAkvKgpAQCAtMTE5Myw2ICsxMjMzLDEwIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgaW5jX3BhZ2VfY291bnQoc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpLCBpbnQgY291bnRfdHlwZSkKIHsKIAlwZXJjcHVfY291bnRlcl9pbmMoJnNiaS0+bnJfcGFnZXNbY291bnRfdHlwZV0pOworCisJaWYgKGNvdW50X3R5cGUgPT0gRjJGU19ESVJUWV9EQVRBIHx8IGNvdW50X3R5cGUgPT0gRjJGU19JTk1FTV9QQUdFUykKKwkJcmV0dXJuOworCiAJc2V0X3NiaV9mbGFnKHNiaSwgU0JJX0lTX0RJUlRZKTsKIH0KIApAQCAtMTI0Myw2ICsxMjg3LDExIEBACiAJcmV0dXJuIHNiaS0+dG90YWxfdmFsaWRfYmxvY2tfY291bnQ7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYmxvY2tfdCBkaXNjYXJkX2Jsb2NrcyhzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmkpCit7CisJcmV0dXJuIHNiaS0+ZGlzY2FyZF9ibGtzOworfQorCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19iaXRtYXBfc2l6ZShzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksIGludCBmbGFnKQogewogCXN0cnVjdCBmMmZzX2NoZWNrcG9pbnQgKmNrcHQgPSBGMkZTX0NLUFQoc2JpKTsKQEAgLTEzNzYsNyArMTQyNSw3IEBACiAJaWYgKHBhZ2UpCiAJCXJldHVybiBwYWdlOwogCi0JaWYgKHRpbWVfdG9faW5qZWN0KEZBVUxUX1BBR0VfQUxMT0MpKQorCWlmICh0aW1lX3RvX2luamVjdChGMkZTX01fU0IobWFwcGluZyksIEZBVUxUX1BBR0VfQUxMT0MpKQogCQlyZXR1cm4gTlVMTDsKICNlbmRpZgogCWlmICghZm9yX3dyaXRlKQpAQCAtMTgwNCw3ICsxODUzLDcgQEAKIAogc3RhdGljIGlubGluZSBib29sIGYyZnNfY3BfZXJyb3Ioc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpKQogewotCXJldHVybiBpc19zZXRfY2twdF9mbGFncyhzYmktPmNrcHQsIENQX0VSUk9SX0ZMQUcpOworCXJldHVybiBpc19zZXRfY2twdF9mbGFncyhzYmksIENQX0VSUk9SX0ZMQUcpOwogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgaXNfZG90X2RvdGRvdChjb25zdCBzdHJ1Y3QgcXN0ciAqc3RyKQpAQCAtMTgyNywxMCArMTg3NiwxMSBAQAogCXJldHVybiBTX0lTUkVHKGlub2RlLT5pX21vZGUpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgKmYyZnNfa21hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCitzdGF0aWMgaW5saW5lIHZvaWQgKmYyZnNfa21hbGxvYyhzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksCisJCQkJCXNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKIHsKICNpZmRlZiBDT05GSUdfRjJGU19GQVVMVF9JTkpFQ1RJT04KLQlpZiAodGltZV90b19pbmplY3QoRkFVTFRfS01BTExPQykpCisJaWYgKHRpbWVfdG9faW5qZWN0KHNiaSwgRkFVTFRfS01BTExPQykpCiAJCXJldHVybiBOVUxMOwogI2VuZGlmCiAJcmV0dXJuIGttYWxsb2Moc2l6ZSwgZmxhZ3MpOwpAQCAtMTg4NSw2ICsxOTM1LDcgQEAKICAqLwogdm9pZCBmMmZzX3NldF9pbm9kZV9mbGFncyhzdHJ1Y3QgaW5vZGUgKik7CiBzdHJ1Y3QgaW5vZGUgKmYyZnNfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZyk7CitzdHJ1Y3QgaW5vZGUgKmYyZnNfaWdldF9yZXRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZyk7CiBpbnQgdHJ5X3RvX2ZyZWVfbmF0cyhzdHJ1Y3QgZjJmc19zYl9pbmZvICosIGludCk7CiBpbnQgdXBkYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgcGFnZSAqKTsKIGludCB1cGRhdGVfaW5vZGVfcGFnZShzdHJ1Y3QgaW5vZGUgKik7CkBAIC0xOTAwLDcgKzE5NTEsNiBAQAogLyoKICAqIGRpci5jCiAgKi8KLWV4dGVybiB1bnNpZ25lZCBjaGFyIGYyZnNfZmlsZXR5cGVfdGFibGVbRjJGU19GVF9NQVhdOwogdm9pZCBzZXRfZGVfdHlwZShzdHJ1Y3QgZjJmc19kaXJfZW50cnkgKiwgdW1vZGVfdCk7CiB1bnNpZ25lZCBjaGFyIGdldF9kZV90eXBlKHN0cnVjdCBmMmZzX2Rpcl9lbnRyeSAqKTsKIHN0cnVjdCBmMmZzX2Rpcl9lbnRyeSAqZmluZF90YXJnZXRfZGVudHJ5KHN0cnVjdCBmc2NyeXB0X25hbWUgKiwKQEAgLTE5MTAsMTAgKzE5NjAsMTIgQEAKIHZvaWQgZG9fbWFrZV9lbXB0eV9kaXIoc3RydWN0IGlub2RlICosIHN0cnVjdCBpbm9kZSAqLAogCQkJc3RydWN0IGYyZnNfZGVudHJ5X3B0ciAqKTsKIHN0cnVjdCBwYWdlICppbml0X2lub2RlX21ldGFkYXRhKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKiwKLQkJCWNvbnN0IHN0cnVjdCBxc3RyICosIHN0cnVjdCBwYWdlICopOworCQljb25zdCBzdHJ1Y3QgcXN0ciAqLCBjb25zdCBzdHJ1Y3QgcXN0ciAqLCBzdHJ1Y3QgcGFnZSAqKTsKIHZvaWQgdXBkYXRlX3BhcmVudF9tZXRhZGF0YShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGlub2RlICosIHVuc2lnbmVkIGludCk7CiBpbnQgcm9vbV9mb3JfZmlsZW5hbWUoY29uc3Qgdm9pZCAqLCBpbnQsIGludCk7CiB2b2lkIGYyZnNfZHJvcF9ubGluayhzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGlub2RlICopOworc3RydWN0IGYyZnNfZGlyX2VudHJ5ICpfX2YyZnNfZmluZF9lbnRyeShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZzY3J5cHRfbmFtZSAqLAorCQkJCQkJCXN0cnVjdCBwYWdlICoqKTsKIHN0cnVjdCBmMmZzX2Rpcl9lbnRyeSAqZjJmc19maW5kX2VudHJ5KHN0cnVjdCBpbm9kZSAqLCBjb25zdCBzdHJ1Y3QgcXN0ciAqLAogCQkJCQkJCXN0cnVjdCBwYWdlICoqKTsKIHN0cnVjdCBmMmZzX2Rpcl9lbnRyeSAqZjJmc19wYXJlbnRfZGlyKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgcGFnZSAqKik7CkBAIC0xOTI0LDcgKzE5NzYsOSBAQAogdm9pZCBmMmZzX3VwZGF0ZV9kZW50cnkobmlkX3QgaW5vLCB1bW9kZV90IG1vZGUsIHN0cnVjdCBmMmZzX2RlbnRyeV9wdHIgKiwKIAkJCWNvbnN0IHN0cnVjdCBxc3RyICosIGYyZnNfaGFzaF90ICwgdW5zaWduZWQgaW50KTsKIGludCBmMmZzX2FkZF9yZWd1bGFyX2VudHJ5KHN0cnVjdCBpbm9kZSAqLCBjb25zdCBzdHJ1Y3QgcXN0ciAqLAotCQkJCQkJc3RydWN0IGlub2RlICosIG5pZF90LCB1bW9kZV90KTsKKwkJCWNvbnN0IHN0cnVjdCBxc3RyICosIHN0cnVjdCBpbm9kZSAqLCBuaWRfdCwgdW1vZGVfdCk7CitpbnQgX19mMmZzX2RvX2FkZF9saW5rKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZnNjcnlwdF9uYW1lKiwgc3RydWN0IGlub2RlICosCisJCQluaWRfdCwgdW1vZGVfdCk7CiBpbnQgX19mMmZzX2FkZF9saW5rKHN0cnVjdCBpbm9kZSAqLCBjb25zdCBzdHJ1Y3QgcXN0ciAqLCBzdHJ1Y3QgaW5vZGUgKiwgbmlkX3QsCiAJCQl1bW9kZV90KTsKIHZvaWQgZjJmc19kZWxldGVfZW50cnkoc3RydWN0IGYyZnNfZGlyX2VudHJ5ICosIHN0cnVjdCBwYWdlICosIHN0cnVjdCBpbm9kZSAqLApAQCAtMjAxMCw5ICsyMDY0LDkgQEAKIHZvaWQgaW52YWxpZGF0ZV9ibG9ja3Moc3RydWN0IGYyZnNfc2JfaW5mbyAqLCBibG9ja190KTsKIGJvb2wgaXNfY2hlY2twb2ludGVkX2RhdGEoc3RydWN0IGYyZnNfc2JfaW5mbyAqLCBibG9ja190KTsKIHZvaWQgcmVmcmVzaF9zaXRfZW50cnkoc3RydWN0IGYyZnNfc2JfaW5mbyAqLCBibG9ja190LCBibG9ja190KTsKK3ZvaWQgZjJmc193YWl0X2FsbF9kaXNjYXJkX2JpbyhzdHJ1Y3QgZjJmc19zYl9pbmZvICopOwogdm9pZCBjbGVhcl9wcmVmcmVlX3NlZ21lbnRzKHN0cnVjdCBmMmZzX3NiX2luZm8gKiwgc3RydWN0IGNwX2NvbnRyb2wgKik7CiB2b2lkIHJlbGVhc2VfZGlzY2FyZF9hZGRycyhzdHJ1Y3QgZjJmc19zYl9pbmZvICopOwotYm9vbCBkaXNjYXJkX25leHRfZG5vZGUoc3RydWN0IGYyZnNfc2JfaW5mbyAqLCBibG9ja190KTsKIGludCBucGFnZXNfZm9yX3N1bW1hcnlfZmx1c2goc3RydWN0IGYyZnNfc2JfaW5mbyAqLCBib29sKTsKIHZvaWQgYWxsb2NhdGVfbmV3X3NlZ21lbnRzKHN0cnVjdCBmMmZzX3NiX2luZm8gKik7CiBpbnQgZjJmc190cmltX2ZzKHN0cnVjdCBmMmZzX3NiX2luZm8gKiwgc3RydWN0IGZzdHJpbV9yYW5nZSAqKTsKQEAgLTIwOTUsNiArMjE0OSwxMCBAQAogdm9pZCBmMmZzX3NldF9wYWdlX2RpcnR5X25vYnVmZmVycyhzdHJ1Y3QgcGFnZSAqKTsKIHZvaWQgZjJmc19pbnZhbGlkYXRlX3BhZ2Uoc3RydWN0IHBhZ2UgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwogaW50IGYyZnNfcmVsZWFzZV9wYWdlKHN0cnVjdCBwYWdlICosIGdmcF90KTsKKyNpZmRlZiBDT05GSUdfTUlHUkFUSU9OCitpbnQgZjJmc19taWdyYXRlX3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiwgc3RydWN0IHBhZ2UgKiwgc3RydWN0IHBhZ2UgKiwKKwkJCQllbnVtIG1pZ3JhdGVfbW9kZSk7CisjZW5kaWYKIAogLyoKICAqIGdjLmMKQEAgLTIxMjMsMTMgKzIxODEsMTQgQEAKIAl1bnNpZ25lZCBsb25nIGxvbmcgaGl0X2xhcmdlc3QsIGhpdF9jYWNoZWQsIGhpdF9yYnRyZWU7CiAJdW5zaWduZWQgbG9uZyBsb25nIGhpdF90b3RhbCwgdG90YWxfZXh0OwogCWludCBleHRfdHJlZSwgem9tYmllX3RyZWUsIGV4dF9ub2RlOwotCXM2NCBuZGlydHlfbm9kZSwgbmRpcnR5X2RlbnQsIG5kaXJ0eV9tZXRhLCBuZGlydHlfZGF0YSwgaW5tZW1fcGFnZXM7CisJczY0IG5kaXJ0eV9ub2RlLCBuZGlydHlfZGVudCwgbmRpcnR5X21ldGEsIG5kaXJ0eV9kYXRhLCBuZGlydHlfaW1ldGE7CisJczY0IGlubWVtX3BhZ2VzOwogCXVuc2lnbmVkIGludCBuZGlydHlfZGlycywgbmRpcnR5X2ZpbGVzLCBuZGlydHlfYWxsOwogCWludCBuYXRzLCBkaXJ0eV9uYXRzLCBzaXRzLCBkaXJ0eV9zaXRzLCBmbmlkczsKIAlpbnQgdG90YWxfY291bnQsIHV0aWxpemF0aW9uOwogCWludCBiZ19nYywgd2JfYmlvczsKIAlpbnQgaW5saW5lX3hhdHRyLCBpbmxpbmVfaW5vZGUsIGlubGluZV9kaXIsIG9ycGhhbnM7Ci0JdW5zaWduZWQgaW50IHZhbGlkX2NvdW50LCB2YWxpZF9ub2RlX2NvdW50LCB2YWxpZF9pbm9kZV9jb3VudDsKKwl1bnNpZ25lZCBpbnQgdmFsaWRfY291bnQsIHZhbGlkX25vZGVfY291bnQsIHZhbGlkX2lub2RlX2NvdW50LCBkaXNjYXJkX2Jsa3M7CiAJdW5zaWduZWQgaW50IGJpbW9kYWwsIGF2Z192YmxvY2tzOwogCWludCB1dGlsX2ZyZWUsIHV0aWxfdmFsaWQsIHV0aWxfaW52YWxpZDsKIAlpbnQgcnN2ZF9zZWdzLCBvdmVycF9zZWdzOwpAQCAtMjI5NCw4ICsyMzUzLDggQEAKIHN0cnVjdCBmMmZzX2Rpcl9lbnRyeSAqZmluZF9pbl9pbmxpbmVfZGlyKHN0cnVjdCBpbm9kZSAqLAogCQkJCXN0cnVjdCBmc2NyeXB0X25hbWUgKiwgc3RydWN0IHBhZ2UgKiopOwogaW50IG1ha2VfZW1wdHlfaW5saW5lX2RpcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IHBhZ2UgKik7Ci1pbnQgZjJmc19hZGRfaW5saW5lX2VudHJ5KHN0cnVjdCBpbm9kZSAqLCBjb25zdCBzdHJ1Y3QgcXN0ciAqLCBzdHJ1Y3QgaW5vZGUgKiwKLQkJCQkJCW5pZF90LCB1bW9kZV90KTsKK2ludCBmMmZzX2FkZF9pbmxpbmVfZW50cnkoc3RydWN0IGlub2RlICosIGNvbnN0IHN0cnVjdCBxc3RyICosCisJCWNvbnN0IHN0cnVjdCBxc3RyICosIHN0cnVjdCBpbm9kZSAqLCBuaWRfdCwgdW1vZGVfdCk7CiB2b2lkIGYyZnNfZGVsZXRlX2lubGluZV9lbnRyeShzdHJ1Y3QgZjJmc19kaXJfZW50cnkgKiwgc3RydWN0IHBhZ2UgKiwKIAkJCQkJCXN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKik7CiBib29sIGYyZnNfZW1wdHlfaW5saW5lX2RpcihzdHJ1Y3QgaW5vZGUgKik7CmRpZmYgLS1naXQgYS9mcy9mMmZzL2ZpbGUuYyBiL2ZzL2YyZnMvZmlsZS5jCmluZGV4IDBlNDkzZjYuLmY4YjRmZTAgMTAwNjQ0Ci0tLSBhL2ZzL2YyZnMvZmlsZS5jCisrKyBiL2ZzL2YyZnMvZmlsZS5jCkBAIC0xMzUsNyArMTM1LDcgQEAKIAogCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSB8fCBpbm9kZS0+aV9ubGluayAhPSAxKQogCQluZWVkX2NwID0gdHJ1ZTsKLQllbHNlIGlmIChmaWxlX2VuY19uYW1lKGlub2RlKSAmJiBuZWVkX2RlbnRyeV9tYXJrKHNiaSwgaW5vZGUtPmlfaW5vKSkKKwllbHNlIGlmIChpc19zYmlfZmxhZ19zZXQoc2JpLCBTQklfTkVFRF9DUCkpCiAJCW5lZWRfY3AgPSB0cnVlOwogCWVsc2UgaWYgKGZpbGVfd3JvbmdfcGlubyhpbm9kZSkpCiAJCW5lZWRfY3AgPSB0cnVlOwpAQCAtNTIzLDcgKzUyMyw3IEBACiAJCXJldHVybiAwOwogCiAJaWYgKGNhY2hlX29ubHkpIHsKLQkJcGFnZSA9IGYyZnNfZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIGluZGV4LCBmYWxzZSk7CisJCXBhZ2UgPSBmaW5kX2xvY2tfcGFnZShtYXBwaW5nLCBpbmRleCk7CiAJCWlmIChwYWdlICYmIFBhZ2VVcHRvZGF0ZShwYWdlKSkKIAkJCWdvdG8gdHJ1bmNhdGVfb3V0OwogCQlmMmZzX3B1dF9wYWdlKHBhZ2UsIDEpOwpAQCAtMTQ1NCw3ICsxNDU0LDcgQEAKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxwKTsKIAlzdHJ1Y3QgZjJmc19pbm9kZV9pbmZvICpmaSA9IEYyRlNfSShpbm9kZSk7Ci0JdW5zaWduZWQgaW50IGZsYWdzID0gZmktPmlfZmxhZ3MgJiBGU19GTF9VU0VSX1ZJU0lCTEU7CisJdW5zaWduZWQgaW50IGZsYWdzOwogCXVuc2lnbmVkIGludCBvbGRmbGFnczsKIAlpbnQgcmV0OwogCkBAIC0xNzU3LDIxICsxNzU3LDE0IEBACiB7CiAJc3RydWN0IGZzY3J5cHRfcG9saWN5IHBvbGljeTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxwKTsKLQlpbnQgcmV0OwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZwb2xpY3ksIChzdHJ1Y3QgZnNjcnlwdF9wb2xpY3kgX191c2VyICopYXJnLAogCQkJCQkJCXNpemVvZihwb2xpY3kpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlyZXQgPSBtbnRfd2FudF93cml0ZV9maWxlKGZpbHApOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KIAlmMmZzX3VwZGF0ZV90aW1lKEYyRlNfSV9TQihpbm9kZSksIFJFUV9USU1FKTsKLQlyZXQgPSBmc2NyeXB0X3Byb2Nlc3NfcG9saWN5KGlub2RlLCAmcG9saWN5KTsKIAotCW1udF9kcm9wX3dyaXRlX2ZpbGUoZmlscCk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gZnNjcnlwdF9wcm9jZXNzX3BvbGljeShmaWxwLCAmcG9saWN5KTsKIH0KIAogc3RhdGljIGludCBmMmZzX2lvY19nZXRfZW5jcnlwdGlvbl9wb2xpY3koc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGxvbmcgYXJnKQpAQCAtMTk2MSw3ICsxOTU0LDcgQEAKIAkgKiBhdm9pZCBkZWZyYWdtZW50IHJ1bm5pbmcgaW4gU1NSIG1vZGUgd2hlbiBmcmVlIHNlY3Rpb24gYXJlIGFsbG9jYXRlZAogCSAqIGludGVuc2l2ZWx5CiAJICovCi0JaWYgKGhhc19ub3RfZW5vdWdoX2ZyZWVfc2VjcyhzYmksIHNlY19udW0pKSB7CisJaWYgKGhhc19ub3RfZW5vdWdoX2ZyZWVfc2VjcyhzYmksIDAsIHNlY19udW0pKSB7CiAJCWVyciA9IC1FQUdBSU47CiAJCWdvdG8gb3V0OwogCX0KQEAgLTIwODYsMTUgKzIwNzksMjYgQEAKIAlpZiAodW5saWtlbHkoZjJmc19yZWFkb25seShzcmMtPmlfc2IpKSkKIAkJcmV0dXJuIC1FUk9GUzsKIAotCWlmIChTX0lTRElSKHNyYy0+aV9tb2RlKSB8fCBTX0lTRElSKGRzdC0+aV9tb2RlKSkKLQkJcmV0dXJuIC1FSVNESVI7CisJaWYgKCFTX0lTUkVHKHNyYy0+aV9tb2RlKSB8fCAhU19JU1JFRyhkc3QtPmlfbW9kZSkpCisJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGYyZnNfZW5jcnlwdGVkX2lub2RlKHNyYykgfHwgZjJmc19lbmNyeXB0ZWRfaW5vZGUoZHN0KSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCisJaWYgKHNyYyA9PSBkc3QpIHsKKwkJaWYgKHBvc19pbiA9PSBwb3Nfb3V0KQorCQkJcmV0dXJuIDA7CisJCWlmIChwb3Nfb3V0ID4gcG9zX2luICYmIHBvc19vdXQgPCBwb3NfaW4gKyBsZW4pCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlpbm9kZV9sb2NrKHNyYyk7Ci0JaWYgKHNyYyAhPSBkc3QpCi0JCWlub2RlX2xvY2soZHN0KTsKKwlpZiAoc3JjICE9IGRzdCkgeworCQlpZiAoIWlub2RlX3RyeWxvY2soZHN0KSkgeworCQkJcmV0ID0gLUVCVVNZOworCQkJZ290byBvdXQ7CisJCX0KKwl9CiAKIAlyZXQgPSAtRUlOVkFMOwogCWlmIChwb3NfaW4gKyBsZW4gPiBzcmMtPmlfc2l6ZSB8fCBwb3NfaW4gKyBsZW4gPCBwb3NfaW4pCkBAIC0yMTM5LDggKzIxNDMsOSBAQAogCiAJZjJmc19iYWxhbmNlX2ZzKHNiaSwgdHJ1ZSk7CiAJZjJmc19sb2NrX29wKHNiaSk7Ci0JcmV0ID0gX19leGNoYW5nZV9kYXRhX2Jsb2NrKHNyYywgZHN0LCBwb3NfaW4sCi0JCQkJcG9zX291dCwgbGVuID4+IEYyRlNfQkxLU0laRV9CSVRTLCBmYWxzZSk7CisJcmV0ID0gX19leGNoYW5nZV9kYXRhX2Jsb2NrKHNyYywgZHN0LCBwb3NfaW4gPj4gRjJGU19CTEtTSVpFX0JJVFMsCisJCQkJcG9zX291dCA+PiBGMkZTX0JMS1NJWkVfQklUUywKKwkJCQlsZW4gPj4gRjJGU19CTEtTSVpFX0JJVFMsIGZhbHNlKTsKIAogCWlmICghcmV0KSB7CiAJCWlmIChkc3RfbWF4X2lfc2l6ZSkKQEAgLTIxNTIsNiArMjE1Nyw3IEBACiBvdXRfdW5sb2NrOgogCWlmIChzcmMgIT0gZHN0KQogCQlpbm9kZV91bmxvY2soZHN0KTsKK291dDoKIAlpbm9kZV91bmxvY2soc3JjKTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZnMvZjJmcy9nYy5jIGIvZnMvZjJmcy9nYy5jCmluZGV4IDhmN2ZhMzIuLjkzOTg1YzYgMTAwNjQ0Ci0tLSBhL2ZzL2YyZnMvZ2MuYworKysgYi9mcy9mMmZzL2djLmMKQEAgLTQ3LDYgKzQ3LDExIEBACiAJCQljb250aW51ZTsKIAkJfQogCisjaWZkZWYgQ09ORklHX0YyRlNfRkFVTFRfSU5KRUNUSU9OCisJCWlmICh0aW1lX3RvX2luamVjdChzYmksIEZBVUxUX0NIRUNLUE9JTlQpKQorCQkJZjJmc19zdG9wX2NoZWNrcG9pbnQoc2JpLCBmYWxzZSk7CisjZW5kaWYKKwogCQkvKgogCQkgKiBbR0MgdHJpZ2dlcmluZyBjb25kaXRpb25dCiAJCSAqIDAuIEdDIGlzIG5vdCBjb25kdWN0ZWQgY3VycmVudGx5LgpAQCAtOTYsNyArMTAxLDcgQEAKIAlkZXZfdCBkZXYgPSBzYmktPnNiLT5zX2JkZXYtPmJkX2RldjsKIAlpbnQgZXJyID0gMDsKIAotCWdjX3RoID0gZjJmc19rbWFsbG9jKHNpemVvZihzdHJ1Y3QgZjJmc19nY19rdGhyZWFkKSwgR0ZQX0tFUk5FTCk7CisJZ2NfdGggPSBmMmZzX2ttYWxsb2Moc2JpLCBzaXplb2Yoc3RydWN0IGYyZnNfZ2Nfa3RocmVhZCksIEdGUF9LRVJORUwpOwogCWlmICghZ2NfdGgpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CkBAIC0yNzAsNyArMjc1LDcgQEAKIHsKIAlzdHJ1Y3QgZGlydHlfc2VnbGlzdF9pbmZvICpkaXJ0eV9pID0gRElSVFlfSShzYmkpOwogCXN0cnVjdCB2aWN0aW1fc2VsX3BvbGljeSBwOwotCXVuc2lnbmVkIGludCBzZWNubywgbWF4X2Nvc3QsIGxhc3RfdmljdGltOworCXVuc2lnbmVkIGludCBzZWNubywgbGFzdF92aWN0aW07CiAJdW5zaWduZWQgaW50IGxhc3Rfc2VnbWVudCA9IE1BSU5fU0VHUyhzYmkpOwogCXVuc2lnbmVkIGludCBuc2VhcmNoZWQgPSAwOwogCkBAIC0yODAsNyArMjg1LDcgQEAKIAlzZWxlY3RfcG9saWN5KHNiaSwgZ2NfdHlwZSwgdHlwZSwgJnApOwogCiAJcC5taW5fc2Vnbm8gPSBOVUxMX1NFR05POwotCXAubWluX2Nvc3QgPSBtYXhfY29zdCA9IGdldF9tYXhfY29zdChzYmksICZwKTsKKwlwLm1pbl9jb3N0ID0gZ2V0X21heF9jb3N0KHNiaSwgJnApOwogCiAJaWYgKHAubWF4X3NlYXJjaCA9PSAwKQogCQlnb3RvIG91dDsKQEAgLTQyMywxMCArNDI4LDEwIEBACiBzdGF0aWMgdm9pZCBnY19ub2RlX3NlZ21lbnQoc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpLAogCQlzdHJ1Y3QgZjJmc19zdW1tYXJ5ICpzdW0sIHVuc2lnbmVkIGludCBzZWdubywgaW50IGdjX3R5cGUpCiB7Ci0JYm9vbCBpbml0aWFsID0gdHJ1ZTsKIAlzdHJ1Y3QgZjJmc19zdW1tYXJ5ICplbnRyeTsKIAlibG9ja190IHN0YXJ0X2FkZHI7CiAJaW50IG9mZjsKKwlpbnQgcGhhc2UgPSAwOwogCiAJc3RhcnRfYWRkciA9IFNUQVJUX0JMT0NLKHNiaSwgc2Vnbm8pOwogCkBAIC00MzksMTYgKzQ0NCwyNCBAQAogCQlzdHJ1Y3Qgbm9kZV9pbmZvIG5pOwogCiAJCS8qIHN0b3AgQkdfR0MgaWYgdGhlcmUgaXMgbm90IGVub3VnaCBmcmVlIHNlY3Rpb25zLiAqLwotCQlpZiAoZ2NfdHlwZSA9PSBCR19HQyAmJiBoYXNfbm90X2Vub3VnaF9mcmVlX3NlY3Moc2JpLCAwKSkKKwkJaWYgKGdjX3R5cGUgPT0gQkdfR0MgJiYgaGFzX25vdF9lbm91Z2hfZnJlZV9zZWNzKHNiaSwgMCwgMCkpCiAJCQlyZXR1cm47CiAKIAkJaWYgKGNoZWNrX3ZhbGlkX21hcChzYmksIHNlZ25vLCBvZmYpID09IDApCiAJCQljb250aW51ZTsKIAotCQlpZiAoaW5pdGlhbCkgeworCQlpZiAocGhhc2UgPT0gMCkgeworCQkJcmFfbWV0YV9wYWdlcyhzYmksIE5BVF9CTE9DS19PRkZTRVQobmlkKSwgMSwKKwkJCQkJCQlNRVRBX05BVCwgdHJ1ZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChwaGFzZSA9PSAxKSB7CiAJCQlyYV9ub2RlX3BhZ2Uoc2JpLCBuaWQpOwogCQkJY29udGludWU7CiAJCX0KKworCQkvKiBwaGFzZSA9PSAyICovCiAJCW5vZGVfcGFnZSA9IGdldF9ub2RlX3BhZ2Uoc2JpLCBuaWQpOwogCQlpZiAoSVNfRVJSKG5vZGVfcGFnZSkpCiAJCQljb250aW51ZTsKQEAgLTQ2OSwxMCArNDgyLDggQEAKIAkJc3RhdF9pbmNfbm9kZV9ibGtfY291bnQoc2JpLCAxLCBnY190eXBlKTsKIAl9CiAKLQlpZiAoaW5pdGlhbCkgewotCQlpbml0aWFsID0gZmFsc2U7CisJaWYgKCsrcGhhc2UgPCAzKQogCQlnb3RvIG5leHRfc3RlcDsKLQl9CiB9CiAKIC8qCkBAIC03MDYsMTYgKzcxNywyMyBAQAogCQlzdHJ1Y3Qgbm9kZV9pbmZvIGRuaTsgLyogZG5vZGUgaW5mbyBmb3IgdGhlIGRhdGEgKi8KIAkJdW5zaWduZWQgaW50IG9mc19pbl9ub2RlLCBub2ZzOwogCQlibG9ja190IHN0YXJ0X2JpZHg7CisJCW5pZF90IG5pZCA9IGxlMzJfdG9fY3B1KGVudHJ5LT5uaWQpOwogCiAJCS8qIHN0b3AgQkdfR0MgaWYgdGhlcmUgaXMgbm90IGVub3VnaCBmcmVlIHNlY3Rpb25zLiAqLwotCQlpZiAoZ2NfdHlwZSA9PSBCR19HQyAmJiBoYXNfbm90X2Vub3VnaF9mcmVlX3NlY3Moc2JpLCAwKSkKKwkJaWYgKGdjX3R5cGUgPT0gQkdfR0MgJiYgaGFzX25vdF9lbm91Z2hfZnJlZV9zZWNzKHNiaSwgMCwgMCkpCiAJCQlyZXR1cm47CiAKIAkJaWYgKGNoZWNrX3ZhbGlkX21hcChzYmksIHNlZ25vLCBvZmYpID09IDApCiAJCQljb250aW51ZTsKIAogCQlpZiAocGhhc2UgPT0gMCkgewotCQkJcmFfbm9kZV9wYWdlKHNiaSwgbGUzMl90b19jcHUoZW50cnktPm5pZCkpOworCQkJcmFfbWV0YV9wYWdlcyhzYmksIE5BVF9CTE9DS19PRkZTRVQobmlkKSwgMSwKKwkJCQkJCQlNRVRBX05BVCwgdHJ1ZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChwaGFzZSA9PSAxKSB7CisJCQlyYV9ub2RlX3BhZ2Uoc2JpLCBuaWQpOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtNzIzLDE0ICs3NDEsMTQgQEAKIAkJaWYgKCFpc19hbGl2ZShzYmksIGVudHJ5LCAmZG5pLCBzdGFydF9hZGRyICsgb2ZmLCAmbm9mcykpCiAJCQljb250aW51ZTsKIAotCQlpZiAocGhhc2UgPT0gMSkgeworCQlpZiAocGhhc2UgPT0gMikgewogCQkJcmFfbm9kZV9wYWdlKHNiaSwgZG5pLmlubyk7CiAJCQljb250aW51ZTsKIAkJfQogCiAJCW9mc19pbl9ub2RlID0gbGUxNl90b19jcHUoZW50cnktPm9mc19pbl9ub2RlKTsKIAotCQlpZiAocGhhc2UgPT0gMikgeworCQlpZiAocGhhc2UgPT0gMykgewogCQkJaW5vZGUgPSBmMmZzX2lnZXQoc2IsIGRuaS5pbm8pOwogCQkJaWYgKElTX0VSUihpbm9kZSkgfHwgaXNfYmFkX2lub2RlKGlub2RlKSkKIAkJCQljb250aW51ZTsKQEAgLTc1Niw3ICs3NzQsNyBAQAogCQkJY29udGludWU7CiAJCX0KIAotCQkvKiBwaGFzZSAzICovCisJCS8qIHBoYXNlIDQgKi8KIAkJaW5vZGUgPSBmaW5kX2djX2lub2RlKGdjX2xpc3QsIGRuaS5pbm8pOwogCQlpZiAoaW5vZGUpIHsKIAkJCXN0cnVjdCBmMmZzX2lub2RlX2luZm8gKmZpID0gRjJGU19JKGlub2RlKTsKQEAgLTc4OSw3ICs4MDcsNyBAQAogCQl9CiAJfQogCi0JaWYgKCsrcGhhc2UgPCA0KQorCWlmICgrK3BoYXNlIDwgNSkKIAkJZ290byBuZXh0X3N0ZXA7CiB9CiAKQEAgLTgxNSw3ICs4MzMsNyBAQAogCXN0cnVjdCBibGtfcGx1ZyBwbHVnOwogCXVuc2lnbmVkIGludCBzZWdubyA9IHN0YXJ0X3NlZ25vOwogCXVuc2lnbmVkIGludCBlbmRfc2Vnbm8gPSBzdGFydF9zZWdubyArIHNiaS0+c2Vnc19wZXJfc2VjOwotCWludCBzZWdfZnJlZWQgPSAwOworCWludCBzZWNfZnJlZWQgPSAwOwogCXVuc2lnbmVkIGNoYXIgdHlwZSA9IElTX0RBVEFTRUcoZ2V0X3NlZ19lbnRyeShzYmksIHNlZ25vKS0+dHlwZSkgPwogCQkJCQkJU1VNX1RZUEVfREFUQSA6IFNVTV9UWVBFX05PREU7CiAKQEAgLTgzNCw4ICs4NTIsOSBAQAogCiAJZm9yIChzZWdubyA9IHN0YXJ0X3NlZ25vOyBzZWdubyA8IGVuZF9zZWdubzsgc2Vnbm8rKykgewogCi0JCWlmIChnZXRfdmFsaWRfYmxvY2tzKHNiaSwgc2Vnbm8sIDEpID09IDApCi0JCQljb250aW51ZTsKKwkJaWYgKGdldF92YWxpZF9ibG9ja3Moc2JpLCBzZWdubywgMSkgPT0gMCB8fAorCQkJCQl1bmxpa2VseShmMmZzX2NwX2Vycm9yKHNiaSkpKQorCQkJZ290byBuZXh0OwogCiAJCS8qIGZpbmQgc2VnbWVudCBzdW1tYXJ5IG9mIHZpY3RpbSAqLwogCQlzdW1fcGFnZSA9IGZpbmRfZ2V0X3BhZ2UoTUVUQV9NQVBQSU5HKHNiaSksCkBAIC04NjEsNyArODgwLDcgQEAKIAkJCQkJCQkJZ2NfdHlwZSk7CiAKIAkJc3RhdF9pbmNfc2VnX2NvdW50KHNiaSwgdHlwZSwgZ2NfdHlwZSk7Ci0KK25leHQ6CiAJCWYyZnNfcHV0X3BhZ2Uoc3VtX3BhZ2UsIDApOwogCX0KIApAQCAtODcxLDIyICs4OTAsMjAgQEAKIAogCWJsa19maW5pc2hfcGx1ZygmcGx1Zyk7CiAKLQlpZiAoZ2NfdHlwZSA9PSBGR19HQykgewotCQl3aGlsZSAoc3RhcnRfc2Vnbm8gPCBlbmRfc2Vnbm8pCi0JCQlpZiAoZ2V0X3ZhbGlkX2Jsb2NrcyhzYmksIHN0YXJ0X3NlZ25vKyssIDEpID09IDApCi0JCQkJc2VnX2ZyZWVkKys7Ci0JfQorCWlmIChnY190eXBlID09IEZHX0dDICYmCisJCWdldF92YWxpZF9ibG9ja3Moc2JpLCBzdGFydF9zZWdubywgc2JpLT5zZWdzX3Blcl9zZWMpID09IDApCisJCXNlY19mcmVlZCA9IDE7CiAKIAlzdGF0X2luY19jYWxsX2NvdW50KHNiaS0+c3RhdF9pbmZvKTsKIAotCXJldHVybiBzZWdfZnJlZWQ7CisJcmV0dXJuIHNlY19mcmVlZDsKIH0KIAogaW50IGYyZnNfZ2Moc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpLCBib29sIHN5bmMpCiB7CiAJdW5zaWduZWQgaW50IHNlZ25vOwogCWludCBnY190eXBlID0gc3luYyA/IEZHX0dDIDogQkdfR0M7Ci0JaW50IHNlY19mcmVlZCA9IDAsIHNlZ19mcmVlZDsKKwlpbnQgc2VjX2ZyZWVkID0gMDsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAlzdHJ1Y3QgY3BfY29udHJvbCBjcGM7CiAJc3RydWN0IGdjX2lub2RlX2xpc3QgZ2NfbGlzdCA9IHsKQEAgLTkwNSw3ICs5MjIsNyBAQAogCQlnb3RvIHN0b3A7CiAJfQogCi0JaWYgKGdjX3R5cGUgPT0gQkdfR0MgJiYgaGFzX25vdF9lbm91Z2hfZnJlZV9zZWNzKHNiaSwgc2VjX2ZyZWVkKSkgeworCWlmIChnY190eXBlID09IEJHX0dDICYmIGhhc19ub3RfZW5vdWdoX2ZyZWVfc2VjcyhzYmksIHNlY19mcmVlZCwgMCkpIHsKIAkJZ2NfdHlwZSA9IEZHX0dDOwogCQkvKgogCQkgKiBJZiB0aGVyZSBpcyBubyB2aWN0aW0gYW5kIG5vIHByZWZyZWUgc2VnbWVudCBidXQgc3RpbGwgbm90CkBAIC05MTQsMTAgKzkzMSwxNCBAQAogCQkgKi8KIAkJaWYgKF9fZ2V0X3ZpY3RpbShzYmksICZzZWdubywgZ2NfdHlwZSkgfHwKIAkJCQkJCXByZWZyZWVfc2VnbWVudHMoc2JpKSkgewotCQkJd3JpdGVfY2hlY2twb2ludChzYmksICZjcGMpOworCQkJcmV0ID0gd3JpdGVfY2hlY2twb2ludChzYmksICZjcGMpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIHN0b3A7CiAJCQlzZWdubyA9IE5VTExfU0VHTk87Ci0JCX0gZWxzZSBpZiAoaGFzX25vdF9lbm91Z2hfZnJlZV9zZWNzKHNiaSwgMCkpIHsKLQkJCXdyaXRlX2NoZWNrcG9pbnQoc2JpLCAmY3BjKTsKKwkJfSBlbHNlIGlmIChoYXNfbm90X2Vub3VnaF9mcmVlX3NlY3Moc2JpLCAwLCAwKSkgeworCQkJcmV0ID0gd3JpdGVfY2hlY2twb2ludChzYmksICZjcGMpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIHN0b3A7CiAJCX0KIAl9CiAKQEAgLTkyNSwyMCArOTQ2LDE5IEBACiAJCWdvdG8gc3RvcDsKIAlyZXQgPSAwOwogCi0Jc2VnX2ZyZWVkID0gZG9fZ2FyYmFnZV9jb2xsZWN0KHNiaSwgc2Vnbm8sICZnY19saXN0LCBnY190eXBlKTsKLQotCWlmIChnY190eXBlID09IEZHX0dDICYmIHNlZ19mcmVlZCA9PSBzYmktPnNlZ3NfcGVyX3NlYykKKwlpZiAoZG9fZ2FyYmFnZV9jb2xsZWN0KHNiaSwgc2Vnbm8sICZnY19saXN0LCBnY190eXBlKSAmJgorCQkJZ2NfdHlwZSA9PSBGR19HQykKIAkJc2VjX2ZyZWVkKys7CiAKIAlpZiAoZ2NfdHlwZSA9PSBGR19HQykKIAkJc2JpLT5jdXJfdmljdGltX3NlYyA9IE5VTExfU0VHTk87CiAKIAlpZiAoIXN5bmMpIHsKLQkJaWYgKGhhc19ub3RfZW5vdWdoX2ZyZWVfc2VjcyhzYmksIHNlY19mcmVlZCkpCisJCWlmIChoYXNfbm90X2Vub3VnaF9mcmVlX3NlY3Moc2JpLCBzZWNfZnJlZWQsIDApKQogCQkJZ290byBnY19tb3JlOwogCiAJCWlmIChnY190eXBlID09IEZHX0dDKQotCQkJd3JpdGVfY2hlY2twb2ludChzYmksICZjcGMpOworCQkJcmV0ID0gd3JpdGVfY2hlY2twb2ludChzYmksICZjcGMpOwogCX0KIHN0b3A6CiAJbXV0ZXhfdW5sb2NrKCZzYmktPmdjX211dGV4KTsKZGlmZiAtLWdpdCBhL2ZzL2YyZnMvaW5saW5lLmMgYi9mcy9mMmZzL2lubGluZS5jCmluZGV4IGNjZWE4NzMuLjM0MjM0ZDggMTAwNjQ0Ci0tLSBhL2ZzL2YyZnMvaW5saW5lLmMKKysrIGIvZnMvZjJmcy9pbmxpbmUuYwpAQCAtNDI0LDcgKzQyNCw3IEBACiAJCWlubyA9IGxlMzJfdG9fY3B1KGRlLT5pbm8pOwogCQlmYWtlX21vZGUgPSBnZXRfZGVfdHlwZShkZSkgPDwgU19TSElGVDsKIAotCQllcnIgPSBmMmZzX2FkZF9yZWd1bGFyX2VudHJ5KGRpciwgJm5ld19uYW1lLCBOVUxMLAorCQllcnIgPSBmMmZzX2FkZF9yZWd1bGFyX2VudHJ5KGRpciwgJm5ld19uYW1lLCBOVUxMLCBOVUxMLAogCQkJCQkJCWlubywgZmFrZV9tb2RlKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gcHVuY2hfZGVudHJ5X3BhZ2VzOwpAQCAtNDQ1LDggKzQ0NSw4IEBACiAJc3RydWN0IGYyZnNfaW5saW5lX2RlbnRyeSAqYmFja3VwX2RlbnRyeTsKIAlpbnQgZXJyOwogCi0JYmFja3VwX2RlbnRyeSA9IGYyZnNfa21hbGxvYyhzaXplb2Yoc3RydWN0IGYyZnNfaW5saW5lX2RlbnRyeSksCi0JCQkJCQkJR0ZQX0YyRlNfWkVSTyk7CisJYmFja3VwX2RlbnRyeSA9IGYyZnNfa21hbGxvYyhGMkZTX0lfU0IoZGlyKSwKKwkJCXNpemVvZihzdHJ1Y3QgZjJmc19pbmxpbmVfZGVudHJ5KSwgR0ZQX0YyRlNfWkVSTyk7CiAJaWYgKCFiYWNrdXBfZGVudHJ5KSB7CiAJCWYyZnNfcHV0X3BhZ2UoaXBhZ2UsIDEpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTQ4OCwxNyArNDg4LDE3IEBACiAJCXJldHVybiBmMmZzX21vdmVfcmVoYXNoZWRfZGlyZW50cyhkaXIsIGlwYWdlLCBpbmxpbmVfZGVudHJ5KTsKIH0KIAotaW50IGYyZnNfYWRkX2lubGluZV9lbnRyeShzdHJ1Y3QgaW5vZGUgKmRpciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUsCi0JCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBuaWRfdCBpbm8sIHVtb2RlX3QgbW9kZSkKK2ludCBmMmZzX2FkZF9pbmxpbmVfZW50cnkoc3RydWN0IGlub2RlICpkaXIsIGNvbnN0IHN0cnVjdCBxc3RyICpuZXdfbmFtZSwKKwkJCQljb25zdCBzdHJ1Y3QgcXN0ciAqb3JpZ19uYW1lLAorCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIG5pZF90IGlubywgdW1vZGVfdCBtb2RlKQogewogCXN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSA9IEYyRlNfSV9TQihkaXIpOwogCXN0cnVjdCBwYWdlICppcGFnZTsKIAl1bnNpZ25lZCBpbnQgYml0X3BvczsKIAlmMmZzX2hhc2hfdCBuYW1lX2hhc2g7Ci0Jc2l6ZV90IG5hbWVsZW4gPSBuYW1lLT5sZW47CiAJc3RydWN0IGYyZnNfaW5saW5lX2RlbnRyeSAqZGVudHJ5X2JsayA9IE5VTEw7CiAJc3RydWN0IGYyZnNfZGVudHJ5X3B0ciBkOwotCWludCBzbG90cyA9IEdFVF9ERU5UUllfU0xPVFMobmFtZWxlbik7CisJaW50IHNsb3RzID0gR0VUX0RFTlRSWV9TTE9UUyhuZXdfbmFtZS0+bGVuKTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CiAJaW50IGVyciA9IDA7CiAKQEAgLTUxOSwxOCArNTE5LDIxIEBACiAKIAlpZiAoaW5vZGUpIHsKIAkJZG93bl93cml0ZSgmRjJGU19JKGlub2RlKS0+aV9zZW0pOwotCQlwYWdlID0gaW5pdF9pbm9kZV9tZXRhZGF0YShpbm9kZSwgZGlyLCBuYW1lLCBpcGFnZSk7CisJCXBhZ2UgPSBpbml0X2lub2RlX21ldGFkYXRhKGlub2RlLCBkaXIsIG5ld19uYW1lLAorCQkJCQkJb3JpZ19uYW1lLCBpcGFnZSk7CiAJCWlmIChJU19FUlIocGFnZSkpIHsKIAkJCWVyciA9IFBUUl9FUlIocGFnZSk7CiAJCQlnb3RvIGZhaWw7CiAJCX0KKwkJaWYgKGYyZnNfZW5jcnlwdGVkX2lub2RlKGRpcikpCisJCQlmaWxlX3NldF9lbmNfbmFtZShpbm9kZSk7CiAJfQogCiAJZjJmc193YWl0X29uX3BhZ2Vfd3JpdGViYWNrKGlwYWdlLCBOT0RFLCB0cnVlKTsKIAotCW5hbWVfaGFzaCA9IGYyZnNfZGVudHJ5X2hhc2gobmFtZSk7CisJbmFtZV9oYXNoID0gZjJmc19kZW50cnlfaGFzaChuZXdfbmFtZSk7CiAJbWFrZV9kZW50cnlfcHRyKE5VTEwsICZkLCAodm9pZCAqKWRlbnRyeV9ibGssIDIpOwotCWYyZnNfdXBkYXRlX2RlbnRyeShpbm8sIG1vZGUsICZkLCBuYW1lLCBuYW1lX2hhc2gsIGJpdF9wb3MpOworCWYyZnNfdXBkYXRlX2RlbnRyeShpbm8sIG1vZGUsICZkLCBuZXdfbmFtZSwgbmFtZV9oYXNoLCBiaXRfcG9zKTsKIAogCXNldF9wYWdlX2RpcnR5KGlwYWdlKTsKIApAQCAtNTYzLDcgKzU2Niw3IEBACiAJaW5saW5lX2RlbnRyeSA9IGlubGluZV9kYXRhX2FkZHIocGFnZSk7CiAJYml0X3BvcyA9IGRlbnRyeSAtIGlubGluZV9kZW50cnktPmRlbnRyeTsKIAlmb3IgKGkgPSAwOyBpIDwgc2xvdHM7IGkrKykKLQkJdGVzdF9hbmRfY2xlYXJfYml0X2xlKGJpdF9wb3MgKyBpLAorCQlfX2NsZWFyX2JpdF9sZShiaXRfcG9zICsgaSwKIAkJCQkmaW5saW5lX2RlbnRyeS0+ZGVudHJ5X2JpdG1hcCk7CiAKIAlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKZGlmZiAtLWdpdCBhL2ZzL2YyZnMvaW5vZGUuYyBiL2ZzL2YyZnMvaW5vZGUuYwppbmRleCA5YWM1ZWZjLi5kNzM2OTg5IDEwMDY0NAotLS0gYS9mcy9mMmZzL2lub2RlLmMKKysrIGIvZnMvZjJmcy9pbm9kZS5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9mMmZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgogCiAjaW5jbHVkZSAiZjJmcy5oIgpAQCAtMjM0LDYgKzIzNSwyMCBAQAogCXJldHVybiBFUlJfUFRSKHJldCk7CiB9CiAKK3N0cnVjdCBpbm9kZSAqZjJmc19pZ2V0X3JldHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgaW5vKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CityZXRyeToKKwlpbm9kZSA9IGYyZnNfaWdldChzYiwgaW5vKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkgeworCQlpZiAoUFRSX0VSUihpbm9kZSkgPT0gLUVOT01FTSkgeworCQkJY29uZ2VzdGlvbl93YWl0KEJMS19SV19BU1lOQywgSFovNTApOworCQkJZ290byByZXRyeTsKKwkJfQorCX0KKwlyZXR1cm4gaW5vZGU7Cit9CisKIGludCB1cGRhdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKm5vZGVfcGFnZSkKIHsKIAlzdHJ1Y3QgZjJmc19pbm9kZSAqcmk7CkBAIC0zNTQsNyArMzY5LDcgQEAKIAkJZ290byBub19kZWxldGU7CiAKICNpZmRlZiBDT05GSUdfRjJGU19GQVVMVF9JTkpFQ1RJT04KLQlpZiAodGltZV90b19pbmplY3QoRkFVTFRfRVZJQ1RfSU5PREUpKQorCWlmICh0aW1lX3RvX2luamVjdChzYmksIEZBVUxUX0VWSUNUX0lOT0RFKSkKIAkJZ290byBub19kZWxldGU7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZnMvZjJmcy9uYW1laS5jIGIvZnMvZjJmcy9uYW1laS5jCmluZGV4IDczZmEzNTYuLjMwMGFlZjggMTAwNjQ0Ci0tLSBhL2ZzL2YyZnMvbmFtZWkuYworKysgYi9mcy9mMmZzL25hbWVpLmMKQEAgLTkxLDE4ICs5MSwyMyBAQAogewogCXNpemVfdCBzbGVuID0gc3RybGVuKHMpOwogCXNpemVfdCBzdWJsZW4gPSBzdHJsZW4oc3ViKTsKKwlpbnQgaTsKIAogCS8qCiAJICogZmlsZW5hbWUgZm9ybWF0IG9mIG11bHRpbWVkaWEgZmlsZSBzaG91bGQgYmUgZGVmaW5lZCBhczoKLQkgKiAiZmlsZW5hbWUgKyAnLicgKyBleHRlbnNpb24iLgorCSAqICJmaWxlbmFtZSArICcuJyArIGV4dGVuc2lvbiArIChvcHRpb25hbDogJy4nICsgdGVtcCBleHRlbnNpb24pIi4KIAkgKi8KIAlpZiAoc2xlbiA8IHN1YmxlbiArIDIpCiAJCXJldHVybiAwOwogCi0JaWYgKHNbc2xlbiAtIHN1YmxlbiAtIDFdICE9ICcuJykKLQkJcmV0dXJuIDA7CisJZm9yIChpID0gMTsgaSA8IHNsZW4gLSBzdWJsZW47IGkrKykgeworCQlpZiAoc1tpXSAhPSAnLicpCisJCQljb250aW51ZTsKKwkJaWYgKCFzdHJuY2FzZWNtcChzICsgaSArIDEsIHN1Yiwgc3VibGVuKSkKKwkJCXJldHVybiAxOworCX0KIAotCXJldHVybiAhc3RybmNhc2VjbXAocyArIHNsZW4gLSBzdWJsZW4sIHN1Yiwgc3VibGVuKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTEwMTAsNyArMTAxNSw2IEBACiAJc3RydWN0IGZzY3J5cHRfc3RyIGNzdHIgPSBGU1RSX0lOSVQoTlVMTCwgMCk7CiAJc3RydWN0IGZzY3J5cHRfc3RyIHBzdHIgPSBGU1RSX0lOSVQoTlVMTCwgMCk7CiAJc3RydWN0IGZzY3J5cHRfc3ltbGlua19kYXRhICpzZDsKLQlsb2ZmX3Qgc2l6ZSA9IG1pbl90KGxvZmZfdCwgaV9zaXplX3JlYWQoaW5vZGUpLCBQQUdFX1NJWkUgLSAxKTsKIAl1MzIgbWF4X3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CiAJaW50IHJlczsKIApAQCAtMTAyNSw3ICsxMDI5LDYgQEAKIAlpZiAoSVNfRVJSKGNwYWdlKSkKIAkJcmV0dXJuIEVSUl9DQVNUKGNwYWdlKTsKIAljYWRkciA9IHBhZ2VfYWRkcmVzcyhjcGFnZSk7Ci0JY2FkZHJbc2l6ZV0gPSAwOwogCiAJLyogU3ltbGluayBpcyBlbmNyeXB0ZWQgKi8KIAlzZCA9IChzdHJ1Y3QgZnNjcnlwdF9zeW1saW5rX2RhdGEgKiljYWRkcjsKZGlmZiAtLWdpdCBhL2ZzL2YyZnMvbm9kZS5jIGIvZnMvZjJmcy9ub2RlLmMKaW5kZXggYjJmYTRiNi4uODgzMTAzNSAxMDA2NDQKLS0tIGEvZnMvZjJmcy9ub2RlLmMKKysrIGIvZnMvZjJmcy9ub2RlLmMKQEAgLTU0LDggKzU0LDYgQEAKIAkJcmVzID0gbWVtX3NpemUgPCAoKGF2YWlsX3JhbSAqIG5tX2ktPnJhbV90aHJlc2ggLyAxMDApID4+IDIpOwogCQlpZiAoZXhjZXNzX2NhY2hlZF9uYXRzKHNiaSkpCiAJCQlyZXMgPSBmYWxzZTsKLQkJaWYgKG5tX2ktPm5hdF9jbnQgPiBERUZfTkFUX0NBQ0hFX1RIUkVTSE9MRCkKLQkJCXJlcyA9IGZhbHNlOwogCX0gZWxzZSBpZiAodHlwZSA9PSBESVJUWV9ERU5UUykgewogCQlpZiAoc2JpLT5zYi0+c19iZGktPndiLmRpcnR5X2V4Y2VlZGVkKQogCQkJcmV0dXJuIGZhbHNlOwpAQCAtMjA2LDE0ICsyMDQsMTQgQEAKIAlzdHJ1Y3QgbmF0X2VudHJ5ICplOwogCWJvb2wgbmVlZCA9IGZhbHNlOwogCi0JcGVyY3B1X2Rvd25fcmVhZCgmbm1faS0+bmF0X3RyZWVfbG9jayk7CisJZG93bl9yZWFkKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKIAllID0gX19sb29rdXBfbmF0X2NhY2hlKG5tX2ksIG5pZCk7CiAJaWYgKGUpIHsKIAkJaWYgKCFnZXRfbmF0X2ZsYWcoZSwgSVNfQ0hFQ0tQT0lOVEVEKSAmJgogCQkJCSFnZXRfbmF0X2ZsYWcoZSwgSEFTX0ZTWU5DRURfSU5PREUpKQogCQkJbmVlZCA9IHRydWU7CiAJfQotCXBlcmNwdV91cF9yZWFkKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKKwl1cF9yZWFkKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKIAlyZXR1cm4gbmVlZDsKIH0KIApAQCAtMjIzLDExICsyMjEsMTEgQEAKIAlzdHJ1Y3QgbmF0X2VudHJ5ICplOwogCWJvb2wgaXNfY3AgPSB0cnVlOwogCi0JcGVyY3B1X2Rvd25fcmVhZCgmbm1faS0+bmF0X3RyZWVfbG9jayk7CisJZG93bl9yZWFkKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKIAllID0gX19sb29rdXBfbmF0X2NhY2hlKG5tX2ksIG5pZCk7CiAJaWYgKGUgJiYgIWdldF9uYXRfZmxhZyhlLCBJU19DSEVDS1BPSU5URUQpKQogCQlpc19jcCA9IGZhbHNlOwotCXBlcmNwdV91cF9yZWFkKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKKwl1cF9yZWFkKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKIAlyZXR1cm4gaXNfY3A7CiB9CiAKQEAgLTIzNywxMyArMjM1LDEzIEBACiAJc3RydWN0IG5hdF9lbnRyeSAqZTsKIAlib29sIG5lZWRfdXBkYXRlID0gdHJ1ZTsKIAotCXBlcmNwdV9kb3duX3JlYWQoJm5tX2ktPm5hdF90cmVlX2xvY2spOworCWRvd25fcmVhZCgmbm1faS0+bmF0X3RyZWVfbG9jayk7CiAJZSA9IF9fbG9va3VwX25hdF9jYWNoZShubV9pLCBpbm8pOwogCWlmIChlICYmIGdldF9uYXRfZmxhZyhlLCBIQVNfTEFTVF9GU1lOQykgJiYKIAkJCShnZXRfbmF0X2ZsYWcoZSwgSVNfQ0hFQ0tQT0lOVEVEKSB8fAogCQkJIGdldF9uYXRfZmxhZyhlLCBIQVNfRlNZTkNFRF9JTk9ERSkpKQogCQluZWVkX3VwZGF0ZSA9IGZhbHNlOwotCXBlcmNwdV91cF9yZWFkKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKKwl1cF9yZWFkKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKIAlyZXR1cm4gbmVlZF91cGRhdGU7CiB9CiAKQEAgLTI4NCw3ICsyODIsNyBAQAogCXN0cnVjdCBmMmZzX25tX2luZm8gKm5tX2kgPSBOTV9JKHNiaSk7CiAJc3RydWN0IG5hdF9lbnRyeSAqZTsKIAotCXBlcmNwdV9kb3duX3dyaXRlKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKKwlkb3duX3dyaXRlKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKIAllID0gX19sb29rdXBfbmF0X2NhY2hlKG5tX2ksIG5pLT5uaWQpOwogCWlmICghZSkgewogCQllID0gZ3JhYl9uYXRfZW50cnkobm1faSwgbmktPm5pZCk7CkBAIC0zMzQsNyArMzMyLDcgQEAKIAkJCXNldF9uYXRfZmxhZyhlLCBIQVNfRlNZTkNFRF9JTk9ERSwgdHJ1ZSk7CiAJCXNldF9uYXRfZmxhZyhlLCBIQVNfTEFTVF9GU1lOQywgZnN5bmNfZG9uZSk7CiAJfQotCXBlcmNwdV91cF93cml0ZSgmbm1faS0+bmF0X3RyZWVfbG9jayk7CisJdXBfd3JpdGUoJm5tX2ktPm5hdF90cmVlX2xvY2spOwogfQogCiBpbnQgdHJ5X3RvX2ZyZWVfbmF0cyhzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksIGludCBucl9zaHJpbmspCkBAIC0zNDIsNyArMzQwLDggQEAKIAlzdHJ1Y3QgZjJmc19ubV9pbmZvICpubV9pID0gTk1fSShzYmkpOwogCWludCBuciA9IG5yX3NocmluazsKIAotCXBlcmNwdV9kb3duX3dyaXRlKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKKwlpZiAoIWRvd25fd3JpdGVfdHJ5bG9jaygmbm1faS0+bmF0X3RyZWVfbG9jaykpCisJCXJldHVybiAwOwogCiAJd2hpbGUgKG5yX3NocmluayAmJiAhbGlzdF9lbXB0eSgmbm1faS0+bmF0X2VudHJpZXMpKSB7CiAJCXN0cnVjdCBuYXRfZW50cnkgKm5lOwpAQCAtMzUxLDcgKzM1MCw3IEBACiAJCV9fZGVsX2Zyb21fbmF0X2NhY2hlKG5tX2ksIG5lKTsKIAkJbnJfc2hyaW5rLS07CiAJfQotCXBlcmNwdV91cF93cml0ZSgmbm1faS0+bmF0X3RyZWVfbG9jayk7CisJdXBfd3JpdGUoJm5tX2ktPm5hdF90cmVlX2xvY2spOwogCXJldHVybiBuciAtIG5yX3NocmluazsKIH0KIApAQCAtMzczLDEzICszNzIsMTMgQEAKIAluaS0+bmlkID0gbmlkOwogCiAJLyogQ2hlY2sgbmF0IGNhY2hlICovCi0JcGVyY3B1X2Rvd25fcmVhZCgmbm1faS0+bmF0X3RyZWVfbG9jayk7CisJZG93bl9yZWFkKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKIAllID0gX19sb29rdXBfbmF0X2NhY2hlKG5tX2ksIG5pZCk7CiAJaWYgKGUpIHsKIAkJbmktPmlubyA9IG5hdF9nZXRfaW5vKGUpOwogCQluaS0+YmxrX2FkZHIgPSBuYXRfZ2V0X2Jsa2FkZHIoZSk7CiAJCW5pLT52ZXJzaW9uID0gbmF0X2dldF92ZXJzaW9uKGUpOwotCQlwZXJjcHVfdXBfcmVhZCgmbm1faS0+bmF0X3RyZWVfbG9jayk7CisJCXVwX3JlYWQoJm5tX2ktPm5hdF90cmVlX2xvY2spOwogCQlyZXR1cm47CiAJfQogCkBAIC00MDMsMTEgKzQwMiwxMSBAQAogCW5vZGVfaW5mb19mcm9tX3Jhd19uYXQobmksICZuZSk7CiAJZjJmc19wdXRfcGFnZShwYWdlLCAxKTsKIGNhY2hlOgotCXBlcmNwdV91cF9yZWFkKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKKwl1cF9yZWFkKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKIAkvKiBjYWNoZSBuYXQgZW50cnkgKi8KLQlwZXJjcHVfZG93bl93cml0ZSgmbm1faS0+bmF0X3RyZWVfbG9jayk7CisJZG93bl93cml0ZSgmbm1faS0+bmF0X3RyZWVfbG9jayk7CiAJY2FjaGVfbmF0X2VudHJ5KHNiaSwgbmlkLCAmbmUpOwotCXBlcmNwdV91cF93cml0ZSgmbm1faS0+bmF0X3RyZWVfbG9jayk7CisJdXBfd3JpdGUoJm5tX2ktPm5hdF90cmVlX2xvY2spOwogfQogCiAvKgpAQCAtMTMxMyw2ICsxMzEyLDcgQEAKIAlzdHJ1Y3QgcGFnZSAqbGFzdF9wYWdlID0gTlVMTDsKIAlib29sIG1hcmtlZCA9IGZhbHNlOwogCW5pZF90IGlubyA9IGlub2RlLT5pX2lubzsKKwlpbnQgbndyaXR0ZW4gPSAwOwogCiAJaWYgKGF0b21pYykgewogCQlsYXN0X3BhZ2UgPSBsYXN0X2ZzeW5jX2Rub2RlKHNiaSwgaW5vKTsKQEAgLTEzODYsNyArMTM4NiwxMCBAQAogCQkJCXVubG9ja19wYWdlKHBhZ2UpOwogCQkJCWYyZnNfcHV0X3BhZ2UobGFzdF9wYWdlLCAwKTsKIAkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJbndyaXR0ZW4rKzsKIAkJCX0KKwogCQkJaWYgKHBhZ2UgPT0gbGFzdF9wYWdlKSB7CiAJCQkJZjJmc19wdXRfcGFnZShwYWdlLCAwKTsKIAkJCQltYXJrZWQgPSB0cnVlOwpAQCAtMTQwOCw2ICsxNDExLDkgQEAKIAkJdW5sb2NrX3BhZ2UobGFzdF9wYWdlKTsKIAkJZ290byByZXRyeTsKIAl9CisKKwlpZiAobndyaXR0ZW4pCisJCWYyZnNfc3VibWl0X21lcmdlZF9iaW9fY29uZChzYmksIE5VTEwsIE5VTEwsIGlubywgTk9ERSwgV1JJVEUpOwogCXJldHVybiByZXQgPyAtRUlPOiAwOwogfQogCkBAIC0xNDE3LDYgKzE0MjMsNyBAQAogCXN0cnVjdCBwYWdldmVjIHB2ZWM7CiAJaW50IHN0ZXAgPSAwOwogCWludCBud3JpdHRlbiA9IDA7CisJaW50IHJldCA9IDA7CiAKIAlwYWdldmVjX2luaXQoJnB2ZWMsIDApOwogCkBAIC0xNDM3LDcgKzE0NDQsOCBAQAogCiAJCQlpZiAodW5saWtlbHkoZjJmc19jcF9lcnJvcihzYmkpKSkgewogCQkJCXBhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7Ci0JCQkJcmV0dXJuIC1FSU87CisJCQkJcmV0ID0gLUVJTzsKKwkJCQlnb3RvIG91dDsKIAkJCX0KIAogCQkJLyoKQEAgLTE0ODgsNiArMTQ5Niw4IEBACiAKIAkJCWlmIChOT0RFX01BUFBJTkcoc2JpKS0+YV9vcHMtPndyaXRlcGFnZShwYWdlLCB3YmMpKQogCQkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJZWxzZQorCQkJCW53cml0dGVuKys7CiAKIAkJCWlmICgtLXdiYy0+bnJfdG9fd3JpdGUgPT0gMCkKIAkJCQlicmVhazsKQEAgLTE1MDUsNyArMTUxNSwxMCBAQAogCQlzdGVwKys7CiAJCWdvdG8gbmV4dF9zdGVwOwogCX0KLQlyZXR1cm4gbndyaXR0ZW47CitvdXQ6CisJaWYgKG53cml0dGVuKQorCQlmMmZzX3N1Ym1pdF9tZXJnZWRfYmlvKHNiaSwgTk9ERSwgV1JJVEUpOworCXJldHVybiByZXQ7CiB9CiAKIGludCB3YWl0X29uX25vZGVfcGFnZXNfd3JpdGViYWNrKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwgbmlkX3QgaW5vKQpAQCAtMTY3MSw2ICsxNjg0LDkgQEAKIAkuc2V0X3BhZ2VfZGlydHkJPSBmMmZzX3NldF9ub2RlX3BhZ2VfZGlydHksCiAJLmludmFsaWRhdGVwYWdlCT0gZjJmc19pbnZhbGlkYXRlX3BhZ2UsCiAJLnJlbGVhc2VwYWdlCT0gZjJmc19yZWxlYXNlX3BhZ2UsCisjaWZkZWYgQ09ORklHX01JR1JBVElPTgorCS5taWdyYXRlcGFnZSAgICA9IGYyZnNfbWlncmF0ZV9wYWdlLAorI2VuZGlmCiB9OwogCiBzdGF0aWMgc3RydWN0IGZyZWVfbmlkICpfX2xvb2t1cF9mcmVlX25pZF9saXN0KHN0cnVjdCBmMmZzX25tX2luZm8gKm5tX2ksCkBAIC0xNzg4LDcgKzE4MDQsNyBAQAogCXJhX21ldGFfcGFnZXMoc2JpLCBOQVRfQkxPQ0tfT0ZGU0VUKG5pZCksIEZSRUVfTklEX1BBR0VTLAogCQkJCQkJCU1FVEFfTkFULCB0cnVlKTsKIAotCXBlcmNwdV9kb3duX3JlYWQoJm5tX2ktPm5hdF90cmVlX2xvY2spOworCWRvd25fcmVhZCgmbm1faS0+bmF0X3RyZWVfbG9jayk7CiAKIAl3aGlsZSAoMSkgewogCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGdldF9jdXJyZW50X25hdF9wYWdlKHNiaSwgbmlkKTsKQEAgLTE4MjAsNyArMTgzNiw3IEBACiAJCQlyZW1vdmVfZnJlZV9uaWQobm1faSwgbmlkKTsKIAl9CiAJdXBfcmVhZCgmY3Vyc2VnLT5qb3VybmFsX3J3c2VtKTsKLQlwZXJjcHVfdXBfcmVhZCgmbm1faS0+bmF0X3RyZWVfbG9jayk7CisJdXBfcmVhZCgmbm1faS0+bmF0X3RyZWVfbG9jayk7CiAKIAlyYV9tZXRhX3BhZ2VzKHNiaSwgTkFUX0JMT0NLX09GRlNFVChubV9pLT5uZXh0X3NjYW5fbmlkKSwKIAkJCQkJbm1faS0+cmFfbmlkX3BhZ2VzLCBNRVRBX05BVCwgZmFsc2UpOwpAQCAtMTgzNyw3ICsxODUzLDcgQEAKIAlzdHJ1Y3QgZnJlZV9uaWQgKmkgPSBOVUxMOwogcmV0cnk6CiAjaWZkZWYgQ09ORklHX0YyRlNfRkFVTFRfSU5KRUNUSU9OCi0JaWYgKHRpbWVfdG9faW5qZWN0KEZBVUxUX0FMTE9DX05JRCkpCisJaWYgKHRpbWVfdG9faW5qZWN0KHNiaSwgRkFVTFRfQUxMT0NfTklEKSkKIAkJcmV0dXJuIGZhbHNlOwogI2VuZGlmCiAJaWYgKHVubGlrZWx5KHNiaS0+dG90YWxfdmFsaWRfbm9kZV9jb3VudCArIDEgPiBubV9pLT5hdmFpbGFibGVfbmlkcykpCkBAIC0yMDE0LDEwICsyMDMwLDEyIEBACiAKIAlpZiAodW5saWtlbHkob2xkX25pLmJsa19hZGRyICE9IE5VTExfQUREUikpCiAJCXJldHVybiAtRUlOVkFMOwotCityZXRyeToKIAlpcGFnZSA9IGYyZnNfZ3JhYl9jYWNoZV9wYWdlKE5PREVfTUFQUElORyhzYmkpLCBpbm8sIGZhbHNlKTsKLQlpZiAoIWlwYWdlKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoIWlwYWdlKSB7CisJCWNvbmdlc3Rpb25fd2FpdChCTEtfUldfQVNZTkMsIEhaLzUwKTsKKwkJZ290byByZXRyeTsKKwl9CiAKIAkvKiBTaG91bGQgbm90IHVzZSB0aGlzIGlub2RlIGZyb20gZnJlZSBuaWQgbGlzdCAqLwogCXJlbW92ZV9mcmVlX25pZChOTV9JKHNiaSksIGlubyk7CkBAIC0yMjA5LDcgKzIyMjcsNyBAQAogCWlmICghbm1faS0+ZGlydHlfbmF0X2NudCkKIAkJcmV0dXJuOwogCi0JcGVyY3B1X2Rvd25fd3JpdGUoJm5tX2ktPm5hdF90cmVlX2xvY2spOworCWRvd25fd3JpdGUoJm5tX2ktPm5hdF90cmVlX2xvY2spOwogCiAJLyoKIAkgKiBpZiB0aGVyZSBhcmUgbm8gZW5vdWdoIHNwYWNlIGluIGpvdXJuYWwgdG8gc3RvcmUgZGlydHkgbmF0CkBAIC0yMjMyLDcgKzIyNTAsNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzZXQsIHRtcCwgJnNldHMsIHNldF9saXN0KQogCQlfX2ZsdXNoX25hdF9lbnRyeV9zZXQoc2JpLCBzZXQpOwogCi0JcGVyY3B1X3VwX3dyaXRlKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKKwl1cF93cml0ZSgmbm1faS0+bmF0X3RyZWVfbG9jayk7CiAKIAlmMmZzX2J1Z19vbihzYmksIG5tX2ktPmRpcnR5X25hdF9jbnQpOwogfQpAQCAtMjI2OCw4ICsyMjg2LDcgQEAKIAogCW11dGV4X2luaXQoJm5tX2ktPmJ1aWxkX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZubV9pLT5mcmVlX25pZF9saXN0X2xvY2spOwotCWlmIChwZXJjcHVfaW5pdF9yd3NlbSgmbm1faS0+bmF0X3RyZWVfbG9jaykpCi0JCXJldHVybiAtRU5PTUVNOworCWluaXRfcndzZW0oJm5tX2ktPm5hdF90cmVlX2xvY2spOwogCiAJbm1faS0+bmV4dF9zY2FuX25pZCA9IGxlMzJfdG9fY3B1KHNiaS0+Y2twdC0+bmV4dF9mcmVlX25pZCk7CiAJbm1faS0+Yml0bWFwX3NpemUgPSBfX2JpdG1hcF9zaXplKHNiaSwgTkFUX0JJVE1BUCk7CkBAIC0yMzI2LDcgKzIzNDMsNyBAQAogCXNwaW5fdW5sb2NrKCZubV9pLT5mcmVlX25pZF9saXN0X2xvY2spOwogCiAJLyogZGVzdHJveSBuYXQgY2FjaGUgKi8KLQlwZXJjcHVfZG93bl93cml0ZSgmbm1faS0+bmF0X3RyZWVfbG9jayk7CisJZG93bl93cml0ZSgmbm1faS0+bmF0X3RyZWVfbG9jayk7CiAJd2hpbGUgKChmb3VuZCA9IF9fZ2FuZ19sb29rdXBfbmF0X2NhY2hlKG5tX2ksCiAJCQkJCW5pZCwgTkFUVkVDX1NJWkUsIG5hdHZlYykpKSB7CiAJCXVuc2lnbmVkIGlkeDsKQEAgLTIzNTEsOSArMjM2OCw4IEBACiAJCQlrbWVtX2NhY2hlX2ZyZWUobmF0X2VudHJ5X3NldF9zbGFiLCBzZXR2ZWNbaWR4XSk7CiAJCX0KIAl9Ci0JcGVyY3B1X3VwX3dyaXRlKCZubV9pLT5uYXRfdHJlZV9sb2NrKTsKKwl1cF93cml0ZSgmbm1faS0+bmF0X3RyZWVfbG9jayk7CiAKLQlwZXJjcHVfZnJlZV9yd3NlbSgmbm1faS0+bmF0X3RyZWVfbG9jayk7CiAJa2ZyZWUobm1faS0+bmF0X2JpdG1hcCk7CiAJc2JpLT5ubV9pbmZvID0gTlVMTDsKIAlrZnJlZShubV9pKTsKZGlmZiAtLWdpdCBhL2ZzL2YyZnMvbm9kZS5oIGIvZnMvZjJmcy9ub2RlLmgKaW5kZXggZmM3Njg0NS4uODY4YmVjNiAxMDA2NDQKLS0tIGEvZnMvZjJmcy9ub2RlLmgKKysrIGIvZnMvZjJmcy9ub2RlLmgKQEAgLTIyOSw2ICsyMjksMzcgQEAKIAlmMmZzX2NoYW5nZV9iaXQoYmxvY2tfb2ZmLCBubV9pLT5uYXRfYml0bWFwKTsKIH0KIAorc3RhdGljIGlubGluZSBuaWRfdCBpbm9fb2Zfbm9kZShzdHJ1Y3QgcGFnZSAqbm9kZV9wYWdlKQoreworCXN0cnVjdCBmMmZzX25vZGUgKnJuID0gRjJGU19OT0RFKG5vZGVfcGFnZSk7CisJcmV0dXJuIGxlMzJfdG9fY3B1KHJuLT5mb290ZXIuaW5vKTsKK30KKworc3RhdGljIGlubGluZSBuaWRfdCBuaWRfb2Zfbm9kZShzdHJ1Y3QgcGFnZSAqbm9kZV9wYWdlKQoreworCXN0cnVjdCBmMmZzX25vZGUgKnJuID0gRjJGU19OT0RFKG5vZGVfcGFnZSk7CisJcmV0dXJuIGxlMzJfdG9fY3B1KHJuLT5mb290ZXIubmlkKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgb2ZzX29mX25vZGUoc3RydWN0IHBhZ2UgKm5vZGVfcGFnZSkKK3sKKwlzdHJ1Y3QgZjJmc19ub2RlICpybiA9IEYyRlNfTk9ERShub2RlX3BhZ2UpOworCXVuc2lnbmVkIGZsYWcgPSBsZTMyX3RvX2NwdShybi0+Zm9vdGVyLmZsYWcpOworCXJldHVybiBmbGFnID4+IE9GRlNFVF9CSVRfU0hJRlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191NjQgY3B2ZXJfb2Zfbm9kZShzdHJ1Y3QgcGFnZSAqbm9kZV9wYWdlKQoreworCXN0cnVjdCBmMmZzX25vZGUgKnJuID0gRjJGU19OT0RFKG5vZGVfcGFnZSk7CisJcmV0dXJuIGxlNjRfdG9fY3B1KHJuLT5mb290ZXIuY3BfdmVyKTsKK30KKworc3RhdGljIGlubGluZSBibG9ja190IG5leHRfYmxrYWRkcl9vZl9ub2RlKHN0cnVjdCBwYWdlICpub2RlX3BhZ2UpCit7CisJc3RydWN0IGYyZnNfbm9kZSAqcm4gPSBGMkZTX05PREUobm9kZV9wYWdlKTsKKwlyZXR1cm4gbGUzMl90b19jcHUocm4tPmZvb3Rlci5uZXh0X2Jsa2FkZHIpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgZmlsbF9ub2RlX2Zvb3RlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgbmlkX3QgbmlkLAogCQkJCW5pZF90IGlubywgdW5zaWduZWQgaW50IG9mcywgYm9vbCByZXNldCkKIHsKQEAgLTI1OSw0MCArMjkwLDMwIEBACiB7CiAJc3RydWN0IGYyZnNfY2hlY2twb2ludCAqY2twdCA9IEYyRlNfQ0tQVChGMkZTX1BfU0IocGFnZSkpOwogCXN0cnVjdCBmMmZzX25vZGUgKnJuID0gRjJGU19OT0RFKHBhZ2UpOworCXNpemVfdCBjcmNfb2Zmc2V0ID0gbGUzMl90b19jcHUoY2twdC0+Y2hlY2tzdW1fb2Zmc2V0KTsKKwlfX3U2NCBjcF92ZXIgPSBsZTY0X3RvX2NwdShja3B0LT5jaGVja3BvaW50X3Zlcik7CiAKLQlybi0+Zm9vdGVyLmNwX3ZlciA9IGNrcHQtPmNoZWNrcG9pbnRfdmVyOworCWlmIChfX2lzX3NldF9ja3B0X2ZsYWdzKGNrcHQsIENQX0NSQ19SRUNPVkVSWV9GTEFHKSkgeworCQlfX3U2NCBjcmMgPSBsZTMyX3RvX2NwdSgqKChfX2xlMzIgKikKKwkJCQkoKHVuc2lnbmVkIGNoYXIgKilja3B0ICsgY3JjX29mZnNldCkpKTsKKwkJY3BfdmVyIHw9IChjcmMgPDwgMzIpOworCX0KKwlybi0+Zm9vdGVyLmNwX3ZlciA9IGNwdV90b19sZTY0KGNwX3Zlcik7CiAJcm4tPmZvb3Rlci5uZXh0X2Jsa2FkZHIgPSBjcHVfdG9fbGUzMihibGthZGRyKTsKIH0KIAotc3RhdGljIGlubGluZSBuaWRfdCBpbm9fb2Zfbm9kZShzdHJ1Y3QgcGFnZSAqbm9kZV9wYWdlKQorc3RhdGljIGlubGluZSBib29sIGlzX3JlY292ZXJhYmxlX2Rub2RlKHN0cnVjdCBwYWdlICpwYWdlKQogewotCXN0cnVjdCBmMmZzX25vZGUgKnJuID0gRjJGU19OT0RFKG5vZGVfcGFnZSk7Ci0JcmV0dXJuIGxlMzJfdG9fY3B1KHJuLT5mb290ZXIuaW5vKTsKLX0KKwlzdHJ1Y3QgZjJmc19jaGVja3BvaW50ICpja3B0ID0gRjJGU19DS1BUKEYyRlNfUF9TQihwYWdlKSk7CisJc2l6ZV90IGNyY19vZmZzZXQgPSBsZTMyX3RvX2NwdShja3B0LT5jaGVja3N1bV9vZmZzZXQpOworCV9fdTY0IGNwX3ZlciA9IGN1cl9jcF92ZXJzaW9uKGNrcHQpOwogCi1zdGF0aWMgaW5saW5lIG5pZF90IG5pZF9vZl9ub2RlKHN0cnVjdCBwYWdlICpub2RlX3BhZ2UpCi17Ci0Jc3RydWN0IGYyZnNfbm9kZSAqcm4gPSBGMkZTX05PREUobm9kZV9wYWdlKTsKLQlyZXR1cm4gbGUzMl90b19jcHUocm4tPmZvb3Rlci5uaWQpOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBvZnNfb2Zfbm9kZShzdHJ1Y3QgcGFnZSAqbm9kZV9wYWdlKQotewotCXN0cnVjdCBmMmZzX25vZGUgKnJuID0gRjJGU19OT0RFKG5vZGVfcGFnZSk7Ci0JdW5zaWduZWQgZmxhZyA9IGxlMzJfdG9fY3B1KHJuLT5mb290ZXIuZmxhZyk7Ci0JcmV0dXJuIGZsYWcgPj4gT0ZGU0VUX0JJVF9TSElGVDsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgY3B2ZXJfb2Zfbm9kZShzdHJ1Y3QgcGFnZSAqbm9kZV9wYWdlKQotewotCXN0cnVjdCBmMmZzX25vZGUgKnJuID0gRjJGU19OT0RFKG5vZGVfcGFnZSk7Ci0JcmV0dXJuIGxlNjRfdG9fY3B1KHJuLT5mb290ZXIuY3BfdmVyKTsKLX0KLQotc3RhdGljIGlubGluZSBibG9ja190IG5leHRfYmxrYWRkcl9vZl9ub2RlKHN0cnVjdCBwYWdlICpub2RlX3BhZ2UpCi17Ci0Jc3RydWN0IGYyZnNfbm9kZSAqcm4gPSBGMkZTX05PREUobm9kZV9wYWdlKTsKLQlyZXR1cm4gbGUzMl90b19jcHUocm4tPmZvb3Rlci5uZXh0X2Jsa2FkZHIpOworCWlmIChfX2lzX3NldF9ja3B0X2ZsYWdzKGNrcHQsIENQX0NSQ19SRUNPVkVSWV9GTEFHKSkgeworCQlfX3U2NCBjcmMgPSBsZTMyX3RvX2NwdSgqKChfX2xlMzIgKikKKwkJCQkoKHVuc2lnbmVkIGNoYXIgKilja3B0ICsgY3JjX29mZnNldCkpKTsKKwkJY3BfdmVyIHw9IChjcmMgPDwgMzIpOworCX0KKwlyZXR1cm4gY3B1X3RvX2xlNjQoY3BfdmVyKSA9PSBjcHZlcl9vZl9ub2RlKHBhZ2UpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvZjJmcy9yZWNvdmVyeS5jIGIvZnMvZjJmcy9yZWNvdmVyeS5jCmluZGV4IDllNjUyZDUuLjJmYzg0YTkgMTAwNjQ0Ci0tLSBhL2ZzL2YyZnMvcmVjb3ZlcnkuYworKysgYi9mcy9mMmZzL3JlY292ZXJ5LmMKQEAgLTY4LDE1ICs2OCwxNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgc3RydWN0IGZzeW5jX2lub2RlX2VudHJ5ICphZGRfZnN5bmNfaW5vZGUoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwKLQkJCQkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlKQorc3RhdGljIHN0cnVjdCBmc3luY19pbm9kZV9lbnRyeSAqYWRkX2ZzeW5jX2lub2RlKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwKKwkJCQkJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgbmlkX3QgaW5vKQogeworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RydWN0IGZzeW5jX2lub2RlX2VudHJ5ICplbnRyeTsKIAotCWVudHJ5ID0ga21lbV9jYWNoZV9hbGxvYyhmc3luY19lbnRyeV9zbGFiLCBHRlBfRjJGU19aRVJPKTsKLQlpZiAoIWVudHJ5KQotCQlyZXR1cm4gTlVMTDsKKwlpbm9kZSA9IGYyZnNfaWdldF9yZXRyeShzYmktPnNiLCBpbm8pOworCWlmIChJU19FUlIoaW5vZGUpKQorCQlyZXR1cm4gRVJSX0NBU1QoaW5vZGUpOwogCisJZW50cnkgPSBmMmZzX2ttZW1fY2FjaGVfYWxsb2MoZnN5bmNfZW50cnlfc2xhYiwgR0ZQX0YyRlNfWkVSTyk7CiAJZW50cnktPmlub2RlID0gaW5vZGU7CiAJbGlzdF9hZGRfdGFpbCgmZW50cnktPmxpc3QsIGhlYWQpOwogCkBAIC05Niw0OCArOTgsNDEgQEAKIAlzdHJ1Y3QgZjJmc19pbm9kZSAqcmF3X2lub2RlID0gRjJGU19JTk9ERShpcGFnZSk7CiAJbmlkX3QgcGlubyA9IGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9waW5vKTsKIAlzdHJ1Y3QgZjJmc19kaXJfZW50cnkgKmRlOwotCXN0cnVjdCBxc3RyIG5hbWU7CisJc3RydWN0IGZzY3J5cHRfbmFtZSBmbmFtZTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlzdHJ1Y3QgaW5vZGUgKmRpciwgKmVpbm9kZTsKIAlzdHJ1Y3QgZnN5bmNfaW5vZGVfZW50cnkgKmVudHJ5OwogCWludCBlcnIgPSAwOworCWNoYXIgKm5hbWU7CiAKIAllbnRyeSA9IGdldF9mc3luY19pbm9kZShkaXJfbGlzdCwgcGlubyk7CiAJaWYgKCFlbnRyeSkgewotCQlkaXIgPSBmMmZzX2lnZXQoaW5vZGUtPmlfc2IsIHBpbm8pOwotCQlpZiAoSVNfRVJSKGRpcikpIHsKLQkJCWVyciA9IFBUUl9FUlIoZGlyKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJZW50cnkgPSBhZGRfZnN5bmNfaW5vZGUoZGlyX2xpc3QsIGRpcik7Ci0JCWlmICghZW50cnkpIHsKLQkJCWVyciA9IC1FTk9NRU07Ci0JCQlpcHV0KGRpcik7CisJCWVudHJ5ID0gYWRkX2ZzeW5jX2lub2RlKEYyRlNfSV9TQihpbm9kZSksIGRpcl9saXN0LCBwaW5vKTsKKwkJaWYgKElTX0VSUihlbnRyeSkpIHsKKwkJCWRpciA9IEVSUl9DQVNUKGVudHJ5KTsKKwkJCWVyciA9IFBUUl9FUlIoZW50cnkpOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9CiAKIAlkaXIgPSBlbnRyeS0+aW5vZGU7CiAKLQlpZiAoZmlsZV9lbmNfbmFtZShpbm9kZSkpCi0JCXJldHVybiAwOworCW1lbXNldCgmZm5hbWUsIDAsIHNpemVvZihzdHJ1Y3QgZnNjcnlwdF9uYW1lKSk7CisJZm5hbWUuZGlza19uYW1lLmxlbiA9IGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9uYW1lbGVuKTsKKwlmbmFtZS5kaXNrX25hbWUubmFtZSA9IHJhd19pbm9kZS0+aV9uYW1lOwogCi0JbmFtZS5sZW4gPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfbmFtZWxlbik7Ci0JbmFtZS5uYW1lID0gcmF3X2lub2RlLT5pX25hbWU7Ci0KLQlpZiAodW5saWtlbHkobmFtZS5sZW4gPiBGMkZTX05BTUVfTEVOKSkgeworCWlmICh1bmxpa2VseShmbmFtZS5kaXNrX25hbWUubGVuID4gRjJGU19OQU1FX0xFTikpIHsKIAkJV0FSTl9PTigxKTsKIAkJZXJyID0gLUVOQU1FVE9PTE9ORzsKIAkJZ290byBvdXQ7CiAJfQogcmV0cnk6Ci0JZGUgPSBmMmZzX2ZpbmRfZW50cnkoZGlyLCAmbmFtZSwgJnBhZ2UpOworCWRlID0gX19mMmZzX2ZpbmRfZW50cnkoZGlyLCAmZm5hbWUsICZwYWdlKTsKIAlpZiAoZGUgJiYgaW5vZGUtPmlfaW5vID09IGxlMzJfdG9fY3B1KGRlLT5pbm8pKQogCQlnb3RvIG91dF91bm1hcF9wdXQ7CiAKIAlpZiAoZGUpIHsKLQkJZWlub2RlID0gZjJmc19pZ2V0KGlub2RlLT5pX3NiLCBsZTMyX3RvX2NwdShkZS0+aW5vKSk7CisJCWVpbm9kZSA9IGYyZnNfaWdldF9yZXRyeShpbm9kZS0+aV9zYiwgbGUzMl90b19jcHUoZGUtPmlubykpOwogCQlpZiAoSVNfRVJSKGVpbm9kZSkpIHsKIAkJCVdBUk5fT04oMSk7CiAJCQllcnIgPSBQVFJfRVJSKGVpbm9kZSk7CkBAIC0xNTYsMTggKzE1MSwyNCBAQAogCX0gZWxzZSBpZiAoSVNfRVJSKHBhZ2UpKSB7CiAJCWVyciA9IFBUUl9FUlIocGFnZSk7CiAJfSBlbHNlIHsKLQkJZXJyID0gX19mMmZzX2FkZF9saW5rKGRpciwgJm5hbWUsIGlub2RlLAorCQllcnIgPSBfX2YyZnNfZG9fYWRkX2xpbmsoZGlyLCAmZm5hbWUsIGlub2RlLAogCQkJCQlpbm9kZS0+aV9pbm8sIGlub2RlLT5pX21vZGUpOwogCX0KKwlpZiAoZXJyID09IC1FTk9NRU0pCisJCWdvdG8gcmV0cnk7CiAJZ290byBvdXQ7CiAKIG91dF91bm1hcF9wdXQ6CiAJZjJmc19kZW50cnlfa3VubWFwKGRpciwgcGFnZSk7CiAJZjJmc19wdXRfcGFnZShwYWdlLCAwKTsKIG91dDoKKwlpZiAoZmlsZV9lbmNfbmFtZShpbm9kZSkpCisJCW5hbWUgPSAiPGVuY3J5cHRlZD4iOworCWVsc2UKKwkJbmFtZSA9IHJhd19pbm9kZS0+aV9uYW1lOwogCWYyZnNfbXNnKGlub2RlLT5pX3NiLCBLRVJOX05PVElDRSwKIAkJCSIlczogaW5vID0gJXgsIG5hbWUgPSAlcywgZGlyID0gJWx4LCBlcnIgPSAlZCIsCi0JCQlfX2Z1bmNfXywgaW5vX29mX25vZGUoaXBhZ2UpLCByYXdfaW5vZGUtPmlfbmFtZSwKKwkJCV9fZnVuY19fLCBpbm9fb2Zfbm9kZShpcGFnZSksIG5hbWUsCiAJCQlJU19FUlIoZGlyKSA/IDAgOiBkaXItPmlfaW5vLCBlcnIpOwogCXJldHVybiBlcnI7CiB9CkBAIC0yMjMsOSArMjI0LDcgQEAKIAogc3RhdGljIGludCBmaW5kX2ZzeW5jX2Rub2RlcyhzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBsb25nIGNwX3ZlciA9IGN1cl9jcF92ZXJzaW9uKEYyRlNfQ0tQVChzYmkpKTsKIAlzdHJ1Y3QgY3Vyc2VnX2luZm8gKmN1cnNlZzsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKIAlibG9ja190IGJsa2FkZHI7CiAJaW50IGVyciA9IDA7CkBAIC0yNDIsNyArMjQxLDcgQEAKIAogCQlwYWdlID0gZ2V0X3RtcF9wYWdlKHNiaSwgYmxrYWRkcik7CiAKLQkJaWYgKGNwX3ZlciAhPSBjcHZlcl9vZl9ub2RlKHBhZ2UpKQorCQlpZiAoIWlzX3JlY292ZXJhYmxlX2Rub2RlKHBhZ2UpKQogCQkJYnJlYWs7CiAKIAkJaWYgKCFpc19mc3luY19kbm9kZShwYWdlKSkKQEAgLTI2MywyMyArMjYyLDE1IEBACiAJCQkgKiBDUCB8IGRub2RlKEYpIHwgaW5vZGUoREYpCiAJCQkgKiBGb3IgdGhpcyBjYXNlLCB3ZSBzaG91bGQgbm90IGdpdmUgdXAgbm93LgogCQkJICovCi0JCQlpbm9kZSA9IGYyZnNfaWdldChzYmktPnNiLCBpbm9fb2Zfbm9kZShwYWdlKSk7Ci0JCQlpZiAoSVNfRVJSKGlub2RlKSkgewotCQkJCWVyciA9IFBUUl9FUlIoaW5vZGUpOworCQkJZW50cnkgPSBhZGRfZnN5bmNfaW5vZGUoc2JpLCBoZWFkLCBpbm9fb2Zfbm9kZShwYWdlKSk7CisJCQlpZiAoSVNfRVJSKGVudHJ5KSkgeworCQkJCWVyciA9IFBUUl9FUlIoZW50cnkpOwogCQkJCWlmIChlcnIgPT0gLUVOT0VOVCkgewogCQkJCQllcnIgPSAwOwogCQkJCQlnb3RvIG5leHQ7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJfQotCi0JCQkvKiBhZGQgdGhpcyBmc3luYyBpbm9kZSB0byB0aGUgbGlzdCAqLwotCQkJZW50cnkgPSBhZGRfZnN5bmNfaW5vZGUoaGVhZCwgaW5vZGUpOwotCQkJaWYgKCFlbnRyeSkgewotCQkJCWVyciA9IC1FTk9NRU07Ci0JCQkJaXB1dChpbm9kZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9CiAJCX0KIAkJZW50cnktPmJsa2FkZHIgPSBibGthZGRyOwogCkBAIC0zNjMsNyArMzU0LDcgQEAKIAogCWlmIChpbm8gIT0gZG4tPmlub2RlLT5pX2lubykgewogCQkvKiBEZWFsbG9jYXRlIHByZXZpb3VzIGluZGV4IGluIHRoZSBub2RlIHBhZ2UgKi8KLQkJaW5vZGUgPSBmMmZzX2lnZXQoc2JpLT5zYiwgaW5vKTsKKwkJaW5vZGUgPSBmMmZzX2lnZXRfcmV0cnkoc2JpLT5zYiwgaW5vKTsKIAkJaWYgKElTX0VSUihpbm9kZSkpCiAJCQlyZXR1cm4gUFRSX0VSUihpbm9kZSk7CiAJfSBlbHNlIHsKQEAgLTQzMSwxMCArNDIyLDE1IEBACiAJZW5kID0gc3RhcnQgKyBBRERSU19QRVJfUEFHRShwYWdlLCBpbm9kZSk7CiAKIAlzZXRfbmV3X2Rub2RlKCZkbiwgaW5vZGUsIE5VTEwsIE5VTEwsIDApOwotCityZXRyeV9kbjoKIAllcnIgPSBnZXRfZG5vZGVfb2ZfZGF0YSgmZG4sIHN0YXJ0LCBBTExPQ19OT0RFKTsKLQlpZiAoZXJyKQorCWlmIChlcnIpIHsKKwkJaWYgKGVyciA9PSAtRU5PTUVNKSB7CisJCQljb25nZXN0aW9uX3dhaXQoQkxLX1JXX0FTWU5DLCBIWi81MCk7CisJCQlnb3RvIHJldHJ5X2RuOworCQl9CiAJCWdvdG8gb3V0OworCX0KIAogCWYyZnNfd2FpdF9vbl9wYWdlX3dyaXRlYmFjayhkbi5ub2RlX3BhZ2UsIE5PREUsIHRydWUpOwogCkBAIC00ODUsMTEgKzQ4MSwxNiBAQAogCQkJCWlmIChlcnIpCiAJCQkJCWdvdG8gZXJyOwogCQkJfQotCityZXRyeV9wcmV2OgogCQkJLyogQ2hlY2sgdGhlIHByZXZpb3VzIG5vZGUgcGFnZSBoYXZpbmcgdGhpcyBpbmRleCAqLwogCQkJZXJyID0gY2hlY2tfaW5kZXhfaW5fcHJldl9ub2RlcyhzYmksIGRlc3QsICZkbik7Ci0JCQlpZiAoZXJyKQorCQkJaWYgKGVycikgeworCQkJCWlmIChlcnIgPT0gLUVOT01FTSkgeworCQkJCQljb25nZXN0aW9uX3dhaXQoQkxLX1JXX0FTWU5DLCBIWi81MCk7CisJCQkJCWdvdG8gcmV0cnlfcHJldjsKKwkJCQl9CiAJCQkJZ290byBlcnI7CisJCQl9CiAKIAkJCS8qIHdyaXRlIGR1bW15IGRhdGEgcGFnZSAqLwogCQkJZjJmc19yZXBsYWNlX2Jsb2NrKHNiaSwgJmRuLCBzcmMsIGRlc3QsCkBAIC01MTQsNyArNTE1LDYgQEAKIHN0YXRpYyBpbnQgcmVjb3Zlcl9kYXRhKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwgc3RydWN0IGxpc3RfaGVhZCAqaW5vZGVfbGlzdCwKIAkJCQkJCXN0cnVjdCBsaXN0X2hlYWQgKmRpcl9saXN0KQogewotCXVuc2lnbmVkIGxvbmcgbG9uZyBjcF92ZXIgPSBjdXJfY3BfdmVyc2lvbihGMkZTX0NLUFQoc2JpKSk7CiAJc3RydWN0IGN1cnNlZ19pbmZvICpjdXJzZWc7CiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwogCWludCBlcnIgPSAwOwpAQCAtNTM0LDcgKzUzNCw3IEBACiAKIAkJcGFnZSA9IGdldF90bXBfcGFnZShzYmksIGJsa2FkZHIpOwogCi0JCWlmIChjcF92ZXIgIT0gY3B2ZXJfb2Zfbm9kZShwYWdlKSkgeworCQlpZiAoIWlzX3JlY292ZXJhYmxlX2Rub2RlKHBhZ2UpKSB7CiAJCQlmMmZzX3B1dF9wYWdlKHBhZ2UsIDEpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTYyNiwzOCArNjI2LDIwIEBACiAJfQogCiAJY2xlYXJfc2JpX2ZsYWcoc2JpLCBTQklfUE9SX0RPSU5HKTsKLQlpZiAoZXJyKSB7Ci0JCWJvb2wgaW52YWxpZGF0ZSA9IGZhbHNlOworCWlmIChlcnIpCisJCXNldF9ja3B0X2ZsYWdzKHNiaSwgQ1BfRVJST1JfRkxBRyk7CisJbXV0ZXhfdW5sb2NrKCZzYmktPmNwX211dGV4KTsKIAotCQlpZiAodGVzdF9vcHQoc2JpLCBMRlMpKSB7Ci0JCQl1cGRhdGVfbWV0YV9wYWdlKHNiaSwgTlVMTCwgYmxrYWRkcik7Ci0JCQlpbnZhbGlkYXRlID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChkaXNjYXJkX25leHRfZG5vZGUoc2JpLCBibGthZGRyKSkgewotCQkJaW52YWxpZGF0ZSA9IHRydWU7Ci0JCX0KKwkvKiBsZXQncyBkcm9wIGFsbCB0aGUgZGlyZWN0b3J5IGlub2RlcyBmb3IgY2xlYW4gY2hlY2twb2ludCAqLworCWRlc3Ryb3lfZnN5bmNfZG5vZGVzKCZkaXJfbGlzdCk7CiAKLQkJLyogRmx1c2ggYWxsIHRoZSBOQVQvU0lUIHBhZ2VzICovCi0JCXdoaWxlIChnZXRfcGFnZXMoc2JpLCBGMkZTX0RJUlRZX01FVEEpKQotCQkJc3luY19tZXRhX3BhZ2VzKHNiaSwgTUVUQSwgTE9OR19NQVgpOwotCi0JCS8qIGludmFsaWRhdGUgdGVtcG9yYXJ5IG1ldGEgcGFnZSAqLwotCQlpZiAoaW52YWxpZGF0ZSkKLQkJCWludmFsaWRhdGVfbWFwcGluZ19wYWdlcyhNRVRBX01BUFBJTkcoc2JpKSwKLQkJCQkJCQlibGthZGRyLCBibGthZGRyKTsKLQotCQlzZXRfY2twdF9mbGFncyhzYmktPmNrcHQsIENQX0VSUk9SX0ZMQUcpOwotCQltdXRleF91bmxvY2soJnNiaS0+Y3BfbXV0ZXgpOwotCX0gZWxzZSBpZiAobmVlZF93cml0ZWNwKSB7CisJaWYgKCFlcnIgJiYgbmVlZF93cml0ZWNwKSB7CiAJCXN0cnVjdCBjcF9jb250cm9sIGNwYyA9IHsKIAkJCS5yZWFzb24gPSBDUF9SRUNPVkVSWSwKIAkJfTsKLQkJbXV0ZXhfdW5sb2NrKCZzYmktPmNwX211dGV4KTsKIAkJZXJyID0gd3JpdGVfY2hlY2twb2ludChzYmksICZjcGMpOwotCX0gZWxzZSB7Ci0JCW11dGV4X3VubG9jaygmc2JpLT5jcF9tdXRleCk7CiAJfQogCi0JZGVzdHJveV9mc3luY19kbm9kZXMoJmRpcl9saXN0KTsKIAlrbWVtX2NhY2hlX2Rlc3Ryb3koZnN5bmNfZW50cnlfc2xhYik7CiAJcmV0dXJuIHJldCA/IHJldDogZXJyOwogfQpkaWZmIC0tZ2l0IGEvZnMvZjJmcy9zZWdtZW50LmMgYi9mcy9mMmZzL3NlZ21lbnQuYwppbmRleCBhNDYyOTZmLi5mYzg4NmYwIDEwMDY0NAotLS0gYS9mcy9mMmZzL3NlZ21lbnQuYworKysgYi9mcy9mMmZzL3NlZ21lbnQuYwpAQCAtMjYsNiArMjYsNyBAQAogI2RlZmluZSBfX3JldmVyc2VfZmZ6KHgpIF9fcmV2ZXJzZV9mZnMofih4KSkKIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpkaXNjYXJkX2VudHJ5X3NsYWI7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmJpb19lbnRyeV9zbGFiOwogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpzaXRfZW50cnlfc2V0X3NsYWI7CiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmlubWVtX2VudHJ5X3NsYWI7CiAKQEAgLTM0NCw2ICszNDUsMTEgQEAKICAqLwogdm9pZCBmMmZzX2JhbGFuY2VfZnMoc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpLCBib29sIG5lZWQpCiB7CisjaWZkZWYgQ09ORklHX0YyRlNfRkFVTFRfSU5KRUNUSU9OCisJaWYgKHRpbWVfdG9faW5qZWN0KHNiaSwgRkFVTFRfQ0hFQ0tQT0lOVCkpCisJCWYyZnNfc3RvcF9jaGVja3BvaW50KHNiaSwgZmFsc2UpOworI2VuZGlmCisKIAlpZiAoIW5lZWQpCiAJCXJldHVybjsKIApAQCAtMzU1LDcgKzM2MSw3IEBACiAJICogV2Ugc2hvdWxkIGRvIEdDIG9yIGVuZCB1cCB3aXRoIGNoZWNrcG9pbnQsIGlmIHRoZXJlIGFyZSBzbyBtYW55IGRpcnR5CiAJICogZGlyL25vZGUgcGFnZXMgd2l0aG91dCBlbm91Z2ggZnJlZSBzZWdtZW50cy4KIAkgKi8KLQlpZiAoaGFzX25vdF9lbm91Z2hfZnJlZV9zZWNzKHNiaSwgMCkpIHsKKwlpZiAoaGFzX25vdF9lbm91Z2hfZnJlZV9zZWNzKHNiaSwgMCwgMCkpIHsKIAkJbXV0ZXhfbG9jaygmc2JpLT5nY19tdXRleCk7CiAJCWYyZnNfZ2Moc2JpLCBmYWxzZSk7CiAJfQpAQCAtNTgwLDYgKzU4Niw3NCBAQAogCW11dGV4X3VubG9jaygmZGlydHlfaS0+c2VnbGlzdF9sb2NrKTsKIH0KIAorc3RhdGljIHN0cnVjdCBiaW9fZW50cnkgKl9fYWRkX2Jpb19lbnRyeShzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksCisJCQkJCQkJc3RydWN0IGJpbyAqYmlvKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKndhaXRfbGlzdCA9ICYoU01fSShzYmkpLT53YWl0X2xpc3QpOworCXN0cnVjdCBiaW9fZW50cnkgKmJlID0gZjJmc19rbWVtX2NhY2hlX2FsbG9jKGJpb19lbnRyeV9zbGFiLCBHRlBfTk9GUyk7CisKKwlJTklUX0xJU1RfSEVBRCgmYmUtPmxpc3QpOworCWJlLT5iaW8gPSBiaW87CisJaW5pdF9jb21wbGV0aW9uKCZiZS0+ZXZlbnQpOworCWxpc3RfYWRkX3RhaWwoJmJlLT5saXN0LCB3YWl0X2xpc3QpOworCisJcmV0dXJuIGJlOworfQorCit2b2lkIGYyZnNfd2FpdF9hbGxfZGlzY2FyZF9iaW8oc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKndhaXRfbGlzdCA9ICYoU01fSShzYmkpLT53YWl0X2xpc3QpOworCXN0cnVjdCBiaW9fZW50cnkgKmJlLCAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJlLCB0bXAsIHdhaXRfbGlzdCwgbGlzdCkgeworCQlzdHJ1Y3QgYmlvICpiaW8gPSBiZS0+YmlvOworCQlpbnQgZXJyOworCisJCXdhaXRfZm9yX2NvbXBsZXRpb25faW8oJmJlLT5ldmVudCk7CisJCWVyciA9IGJlLT5lcnJvcjsKKwkJaWYgKGVyciA9PSAtRU9QTk9UU1VQUCkKKwkJCWVyciA9IDA7CisKKwkJaWYgKGVycikKKwkJCWYyZnNfbXNnKHNiaS0+c2IsIEtFUk5fSU5GTywKKwkJCQkiSXNzdWUgZGlzY2FyZCBmYWlsZWQsIHJldDogJWQiLCBlcnIpOworCisJCWJpb19wdXQoYmlvKTsKKwkJbGlzdF9kZWwoJmJlLT5saXN0KTsKKwkJa21lbV9jYWNoZV9mcmVlKGJpb19lbnRyeV9zbGFiLCBiZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBmMmZzX3N1Ym1pdF9iaW9fd2FpdF9lbmRpbyhzdHJ1Y3QgYmlvICpiaW8pCit7CisJc3RydWN0IGJpb19lbnRyeSAqYmUgPSAoc3RydWN0IGJpb19lbnRyeSAqKWJpby0+YmlfcHJpdmF0ZTsKKworCWJlLT5lcnJvciA9IGJpby0+YmlfZXJyb3I7CisJY29tcGxldGUoJmJlLT5ldmVudCk7Cit9CisKKy8qIHRoaXMgZnVuY3Rpb24gaXMgY29waWVkIGZyb20gYmxrZGV2X2lzc3VlX2Rpc2NhcmQgZnJvbSBibG9jay9ibGstbGliLmMgKi8KK2ludCBfX2YyZnNfaXNzdWVfZGlzY2FyZF9hc3luYyhzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksIHNlY3Rvcl90IHNlY3RvciwKKwkJc2VjdG9yX3QgbnJfc2VjdHMsIGdmcF90IGdmcF9tYXNrLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBzYmktPnNiLT5zX2JkZXY7CisJc3RydWN0IGJpbyAqYmlvID0gTlVMTDsKKwlpbnQgZXJyOworCisJZXJyID0gX19ibGtkZXZfaXNzdWVfZGlzY2FyZChiZGV2LCBzZWN0b3IsIG5yX3NlY3RzLCBnZnBfbWFzaywgZmxhZ3MsCisJCQkmYmlvKTsKKwlpZiAoIWVyciAmJiBiaW8pIHsKKwkJc3RydWN0IGJpb19lbnRyeSAqYmUgPSBfX2FkZF9iaW9fZW50cnkoc2JpLCBiaW8pOworCisJCWJpby0+YmlfcHJpdmF0ZSA9IGJlOworCQliaW8tPmJpX2VuZF9pbyA9IGYyZnNfc3VibWl0X2Jpb193YWl0X2VuZGlvOworCQliaW8tPmJpX29wZiB8PSBSRVFfU1lOQzsKKwkJc3VibWl0X2JpbyhiaW8pOworCX0KKworCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyBpbnQgZjJmc19pc3N1ZV9kaXNjYXJkKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwKIAkJCQlibG9ja190IGJsa3N0YXJ0LCBibG9ja190IGJsa2xlbikKIHsKQEAgLTU5NywyOSArNjcxLDcgQEAKIAkJCXNiaS0+ZGlzY2FyZF9ibGtzLS07CiAJfQogCXRyYWNlX2YyZnNfaXNzdWVfZGlzY2FyZChzYmktPnNiLCBibGtzdGFydCwgYmxrbGVuKTsKLQlyZXR1cm4gYmxrZGV2X2lzc3VlX2Rpc2NhcmQoc2JpLT5zYi0+c19iZGV2LCBzdGFydCwgbGVuLCBHRlBfTk9GUywgMCk7Ci19Ci0KLWJvb2wgZGlzY2FyZF9uZXh0X2Rub2RlKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwgYmxvY2tfdCBibGthZGRyKQotewotCWludCBlcnIgPSAtRU9QTk9UU1VQUDsKLQotCWlmICh0ZXN0X29wdChzYmksIERJU0NBUkQpKSB7Ci0JCXN0cnVjdCBzZWdfZW50cnkgKnNlID0gZ2V0X3NlZ19lbnRyeShzYmksCi0JCQkJR0VUX1NFR05PKHNiaSwgYmxrYWRkcikpOwotCQl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gR0VUX0JMS09GRl9GUk9NX1NFRzAoc2JpLCBibGthZGRyKTsKLQotCQlpZiAoZjJmc190ZXN0X2JpdChvZmZzZXQsIHNlLT5kaXNjYXJkX21hcCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZXJyID0gZjJmc19pc3N1ZV9kaXNjYXJkKHNiaSwgYmxrYWRkciwgMSk7Ci0JfQotCi0JaWYgKGVycikgewotCQl1cGRhdGVfbWV0YV9wYWdlKHNiaSwgTlVMTCwgYmxrYWRkcik7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIF9fZjJmc19pc3N1ZV9kaXNjYXJkX2FzeW5jKHNiaSwgc3RhcnQsIGxlbiwgR0ZQX05PRlMsIDApOwogfQogCiBzdGF0aWMgdm9pZCBfX2FkZF9kaXNjYXJkX2VudHJ5KHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwKQEAgLTY2MCw3ICs3MTIsNyBAQAogCWJvb2wgZm9yY2UgPSAoY3BjLT5yZWFzb24gPT0gQ1BfRElTQ0FSRCk7CiAJaW50IGk7CiAKLQlpZiAoc2UtPnZhbGlkX2Jsb2NrcyA9PSBtYXhfYmxvY2tzKQorCWlmIChzZS0+dmFsaWRfYmxvY2tzID09IG1heF9ibG9ja3MgfHwgIWYyZnNfZGlzY2FyZF9lbihzYmkpKQogCQlyZXR1cm47CiAKIAlpZiAoIWZvcmNlKSB7CkBAIC03MTksMTEgKzc3MSwxNCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmKFNNX0koc2JpKS0+ZGlzY2FyZF9saXN0KTsKIAlzdHJ1Y3QgZGlzY2FyZF9lbnRyeSAqZW50cnksICp0aGlzOwogCXN0cnVjdCBkaXJ0eV9zZWdsaXN0X2luZm8gKmRpcnR5X2kgPSBESVJUWV9JKHNiaSk7CisJc3RydWN0IGJsa19wbHVnIHBsdWc7CiAJdW5zaWduZWQgbG9uZyAqcHJlZnJlZV9tYXAgPSBkaXJ0eV9pLT5kaXJ0eV9zZWdtYXBbUFJFXTsKIAl1bnNpZ25lZCBpbnQgc3RhcnQgPSAwLCBlbmQgPSAtMTsKIAl1bnNpZ25lZCBpbnQgc2Vjbm8sIHN0YXJ0X3NlZ25vOwogCWJvb2wgZm9yY2UgPSAoY3BjLT5yZWFzb24gPT0gQ1BfRElTQ0FSRCk7CiAKKwlibGtfc3RhcnRfcGx1ZygmcGx1Zyk7CisKIAltdXRleF9sb2NrKCZkaXJ0eV9pLT5zZWdsaXN0X2xvY2spOwogCiAJd2hpbGUgKDEpIHsKQEAgLTc3Miw2ICs4MjcsOCBAQAogCQlTTV9JKHNiaSktPm5yX2Rpc2NhcmRzIC09IGVudHJ5LT5sZW47CiAJCWttZW1fY2FjaGVfZnJlZShkaXNjYXJkX2VudHJ5X3NsYWIsIGVudHJ5KTsKIAl9CisKKwlibGtfZmluaXNoX3BsdWcoJnBsdWcpOwogfQogCiBzdGF0aWMgYm9vbCBfX21hcmtfc2l0X2VudHJ5X2RpcnR5KHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwgdW5zaWduZWQgaW50IHNlZ25vKQpAQCAtODE4LDEyICs4NzUsMTQgQEAKIAlpZiAoZGVsID4gMCkgewogCQlpZiAoZjJmc190ZXN0X2FuZF9zZXRfYml0KG9mZnNldCwgc2UtPmN1cl92YWxpZF9tYXApKQogCQkJZjJmc19idWdfb24oc2JpLCAxKTsKLQkJaWYgKCFmMmZzX3Rlc3RfYW5kX3NldF9iaXQob2Zmc2V0LCBzZS0+ZGlzY2FyZF9tYXApKQorCQlpZiAoZjJmc19kaXNjYXJkX2VuKHNiaSkgJiYKKwkJCSFmMmZzX3Rlc3RfYW5kX3NldF9iaXQob2Zmc2V0LCBzZS0+ZGlzY2FyZF9tYXApKQogCQkJc2JpLT5kaXNjYXJkX2Jsa3MtLTsKIAl9IGVsc2UgewogCQlpZiAoIWYyZnNfdGVzdF9hbmRfY2xlYXJfYml0KG9mZnNldCwgc2UtPmN1cl92YWxpZF9tYXApKQogCQkJZjJmc19idWdfb24oc2JpLCAxKTsKLQkJaWYgKGYyZnNfdGVzdF9hbmRfY2xlYXJfYml0KG9mZnNldCwgc2UtPmRpc2NhcmRfbWFwKSkKKwkJaWYgKGYyZnNfZGlzY2FyZF9lbihzYmkpICYmCisJCQlmMmZzX3Rlc3RfYW5kX2NsZWFyX2JpdChvZmZzZXQsIHNlLT5kaXNjYXJkX21hcCkpCiAJCQlzYmktPmRpc2NhcmRfYmxrcysrOwogCX0KIAlpZiAoIWYyZnNfdGVzdF9iaXQob2Zmc2V0LCBzZS0+Y2twdF92YWxpZF9tYXApKQpAQCAtMTIwMiw3ICsxMjYxLDcgQEAKIAlzdHJ1Y3QgY3Vyc2VnX2luZm8gKmN1cnNlZyA9IENVUlNFR19JKHNiaSwgdHlwZSk7CiAJY29uc3Qgc3RydWN0IHZpY3RpbV9zZWxlY3Rpb24gKnZfb3BzID0gRElSVFlfSShzYmkpLT52X29wczsKIAotCWlmIChJU19OT0RFU0VHKHR5cGUpIHx8ICFoYXNfbm90X2Vub3VnaF9mcmVlX3NlY3Moc2JpLCAwKSkKKwlpZiAoSVNfTk9ERVNFRyh0eXBlKSB8fCAhaGFzX25vdF9lbm91Z2hfZnJlZV9zZWNzKHNiaSwgMCwgMCkpCiAJCXJldHVybiB2X29wcy0+Z2V0X3ZpY3RpbShzYmksCiAJCQkJJihjdXJzZWcpLT5uZXh0X3NlZ25vLCBCR19HQywgdHlwZSwgU1NSKTsKIApAQCAtMTI3Nyw2ICsxMzM2LDEyIEBACiAJaWYgKGVuZCA8PSBNQUlOX0JMS0FERFIoc2JpKSkKIAkJZ290byBvdXQ7CiAKKwlpZiAoaXNfc2JpX2ZsYWdfc2V0KHNiaSwgU0JJX05FRURfRlNDSykpIHsKKwkJZjJmc19tc2coc2JpLT5zYiwgS0VSTl9XQVJOSU5HLAorCQkJIkZvdW5kIEZTIGNvcnJ1cHRpb24sIHJ1biBmc2NrIHRvIGZpeC4iKTsKKwkJZ290byBvdXQ7CisJfQorCiAJLyogc3RhcnQvZW5kIHNlZ21lbnQgbnVtYmVyIGluIG1haW5fYXJlYSAqLwogCXN0YXJ0X3NlZ25vID0gKHN0YXJ0IDw9IE1BSU5fQkxLQUREUihzYmkpKSA/IDAgOiBHRVRfU0VHTk8oc2JpLCBzdGFydCk7CiAJZW5kX3NlZ25vID0gKGVuZCA+PSBNQVhfQkxLQUREUihzYmkpKSA/IE1BSU5fU0VHUyhzYmkpIC0gMSA6CkBAIC0xMzAxLDYgKzEzNjYsMTAgQEAKIAkJbXV0ZXhfbG9jaygmc2JpLT5nY19tdXRleCk7CiAJCWVyciA9IHdyaXRlX2NoZWNrcG9pbnQoc2JpLCAmY3BjKTsKIAkJbXV0ZXhfdW5sb2NrKCZzYmktPmdjX211dGV4KTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCisJCXNjaGVkdWxlKCk7CiAJfQogb3V0OgogCXJhbmdlLT5sZW4gPSBGMkZTX0JMS19UT19CWVRFUyhjcGMudHJpbW1lZCk7CkBAIC0xMzkxLDcgKzE0NjAsNyBAQAogCiAJLyogZGlyZWN0X2lvJ2VkIGRhdGEgaXMgYWxpZ25lZCB0byB0aGUgc2VnbWVudCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlICovCiAJaWYgKGRpcmVjdF9pbyAmJiBjdXJzZWctPm5leHRfYmxrb2ZmICYmCi0JCQkJIWhhc19ub3RfZW5vdWdoX2ZyZWVfc2VjcyhzYmksIDApKQorCQkJCSFoYXNfbm90X2Vub3VnaF9mcmVlX3NlY3Moc2JpLCAwLCAwKSkKIAkJX19hbGxvY2F0ZV9uZXdfc2VnbWVudHMoc2JpLCB0eXBlKTsKIAogCSpuZXdfYmxrYWRkciA9IE5FWFRfRlJFRV9CTEtBRERSKHNiaSwgY3Vyc2VnKTsKQEAgLTE1ODksMTEgKzE2NTgsOSBAQAogewogCXN0cnVjdCBwYWdlICpjcGFnZTsKIAotCWlmIChibGthZGRyID09IE5FV19BRERSKQorCWlmIChibGthZGRyID09IE5FV19BRERSIHx8IGJsa2FkZHIgPT0gTlVMTF9BRERSKQogCQlyZXR1cm47CiAKLQlmMmZzX2J1Z19vbihzYmksIGJsa2FkZHIgPT0gTlVMTF9BRERSKTsKLQogCWNwYWdlID0gZmluZF9sb2NrX3BhZ2UoTUVUQV9NQVBQSU5HKHNiaSksIGJsa2FkZHIpOwogCWlmIChjcGFnZSkgewogCQlmMmZzX3dhaXRfb25fcGFnZV93cml0ZWJhY2soY3BhZ2UsIERBVEEsIHRydWUpOwpAQCAtMTczOSw3ICsxODA2LDcgQEAKIAlpbnQgdHlwZSA9IENVUlNFR19IT1RfREFUQTsKIAlpbnQgZXJyOwogCi0JaWYgKGlzX3NldF9ja3B0X2ZsYWdzKEYyRlNfQ0tQVChzYmkpLCBDUF9DT01QQUNUX1NVTV9GTEFHKSkgeworCWlmIChpc19zZXRfY2twdF9mbGFncyhzYmksIENQX0NPTVBBQ1RfU1VNX0ZMQUcpKSB7CiAJCWludCBucGFnZXMgPSBucGFnZXNfZm9yX3N1bW1hcnlfZmx1c2goc2JpLCB0cnVlKTsKIAogCQlpZiAobnBhZ2VzID49IDIpCkBAIC0xODM2LDcgKzE5MDMsNyBAQAogCiB2b2lkIHdyaXRlX2RhdGFfc3VtbWFyaWVzKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwgYmxvY2tfdCBzdGFydF9ibGspCiB7Ci0JaWYgKGlzX3NldF9ja3B0X2ZsYWdzKEYyRlNfQ0tQVChzYmkpLCBDUF9DT01QQUNUX1NVTV9GTEFHKSkKKwlpZiAoaXNfc2V0X2NrcHRfZmxhZ3Moc2JpLCBDUF9DT01QQUNUX1NVTV9GTEFHKSkKIAkJd3JpdGVfY29tcGFjdGVkX3N1bW1hcmllcyhzYmksIHN0YXJ0X2Jsayk7CiAJZWxzZQogCQl3cml0ZV9ub3JtYWxfc3VtbWFyaWVzKHNiaSwgc3RhcnRfYmxrLCBDVVJTRUdfSE9UX0RBVEEpOwpAQCAtMjEyNywxMiArMjE5NCwxNiBAQAogCQkJPSBremFsbG9jKFNJVF9WQkxPQ0tfTUFQX1NJWkUsIEdGUF9LRVJORUwpOwogCQlzaXRfaS0+c2VudHJpZXNbc3RhcnRdLmNrcHRfdmFsaWRfbWFwCiAJCQk9IGt6YWxsb2MoU0lUX1ZCTE9DS19NQVBfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JCXNpdF9pLT5zZW50cmllc1tzdGFydF0uZGlzY2FyZF9tYXAKLQkJCT0ga3phbGxvYyhTSVRfVkJMT0NLX01BUF9TSVpFLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFzaXRfaS0+c2VudHJpZXNbc3RhcnRdLmN1cl92YWxpZF9tYXAgfHwKLQkJCQkhc2l0X2ktPnNlbnRyaWVzW3N0YXJ0XS5ja3B0X3ZhbGlkX21hcCB8fAotCQkJCSFzaXRfaS0+c2VudHJpZXNbc3RhcnRdLmRpc2NhcmRfbWFwKQorCQkJCSFzaXRfaS0+c2VudHJpZXNbc3RhcnRdLmNrcHRfdmFsaWRfbWFwKQogCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJaWYgKGYyZnNfZGlzY2FyZF9lbihzYmkpKSB7CisJCQlzaXRfaS0+c2VudHJpZXNbc3RhcnRdLmRpc2NhcmRfbWFwCisJCQkJPSBremFsbG9jKFNJVF9WQkxPQ0tfTUFQX1NJWkUsIEdGUF9LRVJORUwpOworCQkJaWYgKCFzaXRfaS0+c2VudHJpZXNbc3RhcnRdLmRpc2NhcmRfbWFwKQorCQkJCXJldHVybiAtRU5PTUVNOworCQl9CiAJfQogCiAJc2l0X2ktPnRtcF9tYXAgPSBremFsbG9jKFNJVF9WQkxPQ0tfTUFQX1NJWkUsIEdGUF9LRVJORUwpOwpAQCAtMjIzOSw2ICsyMzEwLDggQEAKIAlzdHJ1Y3Qgc2l0X2luZm8gKnNpdF9pID0gU0lUX0koc2JpKTsKIAlzdHJ1Y3QgY3Vyc2VnX2luZm8gKmN1cnNlZyA9IENVUlNFR19JKHNiaSwgQ1VSU0VHX0NPTERfREFUQSk7CiAJc3RydWN0IGYyZnNfam91cm5hbCAqam91cm5hbCA9IGN1cnNlZy0+am91cm5hbDsKKwlzdHJ1Y3Qgc2VnX2VudHJ5ICpzZTsKKwlzdHJ1Y3QgZjJmc19zaXRfZW50cnkgc2l0OwogCWludCBzaXRfYmxrX2NudCA9IFNJVF9CTEtfQ05UKHNiaSk7CiAJdW5zaWduZWQgaW50IGksIHN0YXJ0LCBlbmQ7CiAJdW5zaWduZWQgaW50IHJlYWRlZCwgc3RhcnRfYmxrID0gMDsKQEAgLTIyNTEsNDEgKzIzMjQsNTggQEAKIAkJZW5kID0gKHN0YXJ0X2JsayArIHJlYWRlZCkgKiBzaXRfaS0+c2VudHNfcGVyX2Jsb2NrOwogCiAJCWZvciAoOyBzdGFydCA8IGVuZCAmJiBzdGFydCA8IE1BSU5fU0VHUyhzYmkpOyBzdGFydCsrKSB7Ci0JCQlzdHJ1Y3Qgc2VnX2VudHJ5ICpzZSA9ICZzaXRfaS0+c2VudHJpZXNbc3RhcnRdOwogCQkJc3RydWN0IGYyZnNfc2l0X2Jsb2NrICpzaXRfYmxrOwotCQkJc3RydWN0IGYyZnNfc2l0X2VudHJ5IHNpdDsKIAkJCXN0cnVjdCBwYWdlICpwYWdlOwogCi0JCQlkb3duX3JlYWQoJmN1cnNlZy0+am91cm5hbF9yd3NlbSk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgc2l0c19pbl9jdXJzdW0oam91cm5hbCk7IGkrKykgewotCQkJCWlmIChsZTMyX3RvX2NwdShzZWdub19pbl9qb3VybmFsKGpvdXJuYWwsIGkpKQotCQkJCQkJCQk9PSBzdGFydCkgewotCQkJCQlzaXQgPSBzaXRfaW5fam91cm5hbChqb3VybmFsLCBpKTsKLQkJCQkJdXBfcmVhZCgmY3Vyc2VnLT5qb3VybmFsX3J3c2VtKTsKLQkJCQkJZ290byBnb3RfaXQ7Ci0JCQkJfQotCQkJfQotCQkJdXBfcmVhZCgmY3Vyc2VnLT5qb3VybmFsX3J3c2VtKTsKLQorCQkJc2UgPSAmc2l0X2ktPnNlbnRyaWVzW3N0YXJ0XTsKIAkJCXBhZ2UgPSBnZXRfY3VycmVudF9zaXRfcGFnZShzYmksIHN0YXJ0KTsKIAkJCXNpdF9ibGsgPSAoc3RydWN0IGYyZnNfc2l0X2Jsb2NrICopcGFnZV9hZGRyZXNzKHBhZ2UpOwogCQkJc2l0ID0gc2l0X2Jsay0+ZW50cmllc1tTSVRfRU5UUllfT0ZGU0VUKHNpdF9pLCBzdGFydCldOwogCQkJZjJmc19wdXRfcGFnZShwYWdlLCAxKTsKLWdvdF9pdDoKKwogCQkJY2hlY2tfYmxvY2tfY291bnQoc2JpLCBzdGFydCwgJnNpdCk7CiAJCQlzZWdfaW5mb19mcm9tX3Jhd19zaXQoc2UsICZzaXQpOwogCiAJCQkvKiBidWlsZCBkaXNjYXJkIG1hcCBvbmx5IG9uZSB0aW1lICovCi0JCQltZW1jcHkoc2UtPmRpc2NhcmRfbWFwLCBzZS0+Y3VyX3ZhbGlkX21hcCwgU0lUX1ZCTE9DS19NQVBfU0laRSk7Ci0JCQlzYmktPmRpc2NhcmRfYmxrcyArPSBzYmktPmJsb2Nrc19wZXJfc2VnIC0gc2UtPnZhbGlkX2Jsb2NrczsKLQotCQkJaWYgKHNiaS0+c2Vnc19wZXJfc2VjID4gMSkgewotCQkJCXN0cnVjdCBzZWNfZW50cnkgKmUgPSBnZXRfc2VjX2VudHJ5KHNiaSwgc3RhcnQpOwotCQkJCWUtPnZhbGlkX2Jsb2NrcyArPSBzZS0+dmFsaWRfYmxvY2tzOworCQkJaWYgKGYyZnNfZGlzY2FyZF9lbihzYmkpKSB7CisJCQkJbWVtY3B5KHNlLT5kaXNjYXJkX21hcCwgc2UtPmN1cl92YWxpZF9tYXAsCisJCQkJCQkJU0lUX1ZCTE9DS19NQVBfU0laRSk7CisJCQkJc2JpLT5kaXNjYXJkX2Jsa3MgKz0gc2JpLT5ibG9ja3NfcGVyX3NlZyAtCisJCQkJCQkJc2UtPnZhbGlkX2Jsb2NrczsKIAkJCX0KKworCQkJaWYgKHNiaS0+c2Vnc19wZXJfc2VjID4gMSkKKwkJCQlnZXRfc2VjX2VudHJ5KHNiaSwgc3RhcnQpLT52YWxpZF9ibG9ja3MgKz0KKwkJCQkJCQlzZS0+dmFsaWRfYmxvY2tzOwogCQl9CiAJCXN0YXJ0X2JsayArPSByZWFkZWQ7CiAJfSB3aGlsZSAoc3RhcnRfYmxrIDwgc2l0X2Jsa19jbnQpOworCisJZG93bl9yZWFkKCZjdXJzZWctPmpvdXJuYWxfcndzZW0pOworCWZvciAoaSA9IDA7IGkgPCBzaXRzX2luX2N1cnN1bShqb3VybmFsKTsgaSsrKSB7CisJCXVuc2lnbmVkIGludCBvbGRfdmFsaWRfYmxvY2tzOworCisJCXN0YXJ0ID0gbGUzMl90b19jcHUoc2Vnbm9faW5fam91cm5hbChqb3VybmFsLCBpKSk7CisJCXNlID0gJnNpdF9pLT5zZW50cmllc1tzdGFydF07CisJCXNpdCA9IHNpdF9pbl9qb3VybmFsKGpvdXJuYWwsIGkpOworCisJCW9sZF92YWxpZF9ibG9ja3MgPSBzZS0+dmFsaWRfYmxvY2tzOworCisJCWNoZWNrX2Jsb2NrX2NvdW50KHNiaSwgc3RhcnQsICZzaXQpOworCQlzZWdfaW5mb19mcm9tX3Jhd19zaXQoc2UsICZzaXQpOworCisJCWlmIChmMmZzX2Rpc2NhcmRfZW4oc2JpKSkgeworCQkJbWVtY3B5KHNlLT5kaXNjYXJkX21hcCwgc2UtPmN1cl92YWxpZF9tYXAsCisJCQkJCQlTSVRfVkJMT0NLX01BUF9TSVpFKTsKKwkJCXNiaS0+ZGlzY2FyZF9ibGtzICs9IG9sZF92YWxpZF9ibG9ja3MgLQorCQkJCQkJc2UtPnZhbGlkX2Jsb2NrczsKKwkJfQorCisJCWlmIChzYmktPnNlZ3NfcGVyX3NlYyA+IDEpCisJCQlnZXRfc2VjX2VudHJ5KHNiaSwgc3RhcnQpLT52YWxpZF9ibG9ja3MgKz0KKwkJCQlzZS0+dmFsaWRfYmxvY2tzIC0gb2xkX3ZhbGlkX2Jsb2NrczsKKwl9CisJdXBfcmVhZCgmY3Vyc2VnLT5qb3VybmFsX3J3c2VtKTsKIH0KIAogc3RhdGljIHZvaWQgaW5pdF9mcmVlX3NlZ21hcChzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmkpCkBAIC0yNDI3LDYgKzI1MTcsNyBAQAogCXNtX2luZm8tPm1pbl9mc3luY19ibG9ja3MgPSBERUZfTUlOX0ZTWU5DX0JMT0NLUzsKIAogCUlOSVRfTElTVF9IRUFEKCZzbV9pbmZvLT5kaXNjYXJkX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZzbV9pbmZvLT53YWl0X2xpc3QpOwogCXNtX2luZm8tPm5yX2Rpc2NhcmRzID0gMDsKIAlzbV9pbmZvLT5tYXhfZGlzY2FyZHMgPSAwOwogCkBAIC0yNTcwLDEwICsyNjYxLDE1IEBACiAJaWYgKCFkaXNjYXJkX2VudHJ5X3NsYWIpCiAJCWdvdG8gZmFpbDsKIAorCWJpb19lbnRyeV9zbGFiID0gZjJmc19rbWVtX2NhY2hlX2NyZWF0ZSgiYmlvX2VudHJ5IiwKKwkJCXNpemVvZihzdHJ1Y3QgYmlvX2VudHJ5KSk7CisJaWYgKCFiaW9fZW50cnlfc2xhYikKKwkJZ290byBkZXN0cm95X2Rpc2NhcmRfZW50cnk7CisKIAlzaXRfZW50cnlfc2V0X3NsYWIgPSBmMmZzX2ttZW1fY2FjaGVfY3JlYXRlKCJzaXRfZW50cnlfc2V0IiwKIAkJCXNpemVvZihzdHJ1Y3Qgc2l0X2VudHJ5X3NldCkpOwogCWlmICghc2l0X2VudHJ5X3NldF9zbGFiKQotCQlnb3RvIGRlc3RvcnlfZGlzY2FyZF9lbnRyeTsKKwkJZ290byBkZXN0cm95X2Jpb19lbnRyeTsKIAogCWlubWVtX2VudHJ5X3NsYWIgPSBmMmZzX2ttZW1fY2FjaGVfY3JlYXRlKCJpbm1lbV9wYWdlX2VudHJ5IiwKIAkJCXNpemVvZihzdHJ1Y3QgaW5tZW1fcGFnZXMpKTsKQEAgLTI1ODMsNyArMjY3OSw5IEBACiAKIGRlc3Ryb3lfc2l0X2VudHJ5X3NldDoKIAlrbWVtX2NhY2hlX2Rlc3Ryb3koc2l0X2VudHJ5X3NldF9zbGFiKTsKLWRlc3RvcnlfZGlzY2FyZF9lbnRyeToKK2Rlc3Ryb3lfYmlvX2VudHJ5OgorCWttZW1fY2FjaGVfZGVzdHJveShiaW9fZW50cnlfc2xhYik7CitkZXN0cm95X2Rpc2NhcmRfZW50cnk6CiAJa21lbV9jYWNoZV9kZXN0cm95KGRpc2NhcmRfZW50cnlfc2xhYik7CiBmYWlsOgogCXJldHVybiAtRU5PTUVNOwpAQCAtMjU5Miw2ICsyNjkwLDcgQEAKIHZvaWQgZGVzdHJveV9zZWdtZW50X21hbmFnZXJfY2FjaGVzKHZvaWQpCiB7CiAJa21lbV9jYWNoZV9kZXN0cm95KHNpdF9lbnRyeV9zZXRfc2xhYik7CisJa21lbV9jYWNoZV9kZXN0cm95KGJpb19lbnRyeV9zbGFiKTsKIAlrbWVtX2NhY2hlX2Rlc3Ryb3koZGlzY2FyZF9lbnRyeV9zbGFiKTsKIAlrbWVtX2NhY2hlX2Rlc3Ryb3koaW5tZW1fZW50cnlfc2xhYik7CiB9CmRpZmYgLS1naXQgYS9mcy9mMmZzL3NlZ21lbnQuaCBiL2ZzL2YyZnMvc2VnbWVudC5oCmluZGV4IGIzM2Y3M2UuLmZlY2I4NTYgMTAwNjQ0Ci0tLSBhL2ZzL2YyZnMvc2VnbWVudC5oCisrKyBiL2ZzL2YyZnMvc2VnbWVudC5oCkBAIC00NzksNyArNDc5LDggQEAKIAkJCQkJCXJlc2VydmVkX3NlY3Rpb25zKHNiaSkgKyAxKTsKIH0KIAotc3RhdGljIGlubGluZSBib29sIGhhc19ub3RfZW5vdWdoX2ZyZWVfc2VjcyhzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksIGludCBmcmVlZCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBoYXNfbm90X2Vub3VnaF9mcmVlX3NlY3Moc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpLAorCQkJCQlpbnQgZnJlZWQsIGludCBuZWVkZWQpCiB7CiAJaW50IG5vZGVfc2VjcyA9IGdldF9ibG9ja3R5cGVfc2VjcyhzYmksIEYyRlNfRElSVFlfTk9ERVMpOwogCWludCBkZW50X3NlY3MgPSBnZXRfYmxvY2t0eXBlX3NlY3Moc2JpLCBGMkZTX0RJUlRZX0RFTlRTKTsKQEAgLTQ4OSw4ICs0OTAsOCBAQAogCWlmICh1bmxpa2VseShpc19zYmlfZmxhZ19zZXQoc2JpLCBTQklfUE9SX0RPSU5HKSkpCiAJCXJldHVybiBmYWxzZTsKIAotCXJldHVybiAoZnJlZV9zZWN0aW9ucyhzYmkpICsgZnJlZWQpIDw9IChub2RlX3NlY3MgKyAyICogZGVudF9zZWNzICsKLQkJCQkJCXJlc2VydmVkX3NlY3Rpb25zKHNiaSkpOworCXJldHVybiAoZnJlZV9zZWN0aW9ucyhzYmkpICsgZnJlZWQpIDw9CisJCShub2RlX3NlY3MgKyAyICogZGVudF9zZWNzICsgcmVzZXJ2ZWRfc2VjdGlvbnMoc2JpKSArIG5lZWRlZCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBleGNlc3NfcHJlZnJlZV9zZWdzKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSkKQEAgLTU4Nyw4ICs1ODgsOCBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgdmVyaWZ5X2Jsb2NrX2FkZHIoc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpLCBibG9ja190IGJsa19hZGRyKQogewotCWYyZnNfYnVnX29uKHNiaSwgYmxrX2FkZHIgPCBTRUcwX0JMS0FERFIoc2JpKQotCQkJCQl8fCBibGtfYWRkciA+PSBNQVhfQkxLQUREUihzYmkpKTsKKwlCVUdfT04oYmxrX2FkZHIgPCBTRUcwX0JMS0FERFIoc2JpKQorCQkJfHwgYmxrX2FkZHIgPj0gTUFYX0JMS0FERFIoc2JpKSk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy9mMmZzL3N1cGVyLmMgYi9mcy9mMmZzL3N1cGVyLmMKaW5kZXggMWI4NmQzZi4uNjEzMmI0YyAxMDA2NDQKLS0tIGEvZnMvZjJmcy9zdXBlci5jCisrKyBiL2ZzL2YyZnMvc3VwZXIuYwpAQCAtNDAsNyArNDAsNiBAQAogc3RhdGljIHN0cnVjdCBrc2V0ICpmMmZzX2tzZXQ7CiAKICNpZmRlZiBDT05GSUdfRjJGU19GQVVMVF9JTkpFQ1RJT04KLXN0cnVjdCBmMmZzX2ZhdWx0X2luZm8gZjJmc19mYXVsdDsKIAogY2hhciAqZmF1bHRfbmFtZVtGQVVMVF9NQVhdID0gewogCVtGQVVMVF9LTUFMTE9DXQkJPSAia21hbGxvYyIsCkBAIC01MCwxNiArNDksMjEgQEAKIAlbRkFVTFRfQkxPQ0tdCQk9ICJubyBtb3JlIGJsb2NrIiwKIAlbRkFVTFRfRElSX0RFUFRIXQk9ICJ0b28gYmlnIGRpciBkZXB0aCIsCiAJW0ZBVUxUX0VWSUNUX0lOT0RFXQk9ICJldmljdF9pbm9kZSBmYWlsIiwKKwlbRkFVTFRfSU9dCQk9ICJJTyBlcnJvciIsCisJW0ZBVUxUX0NIRUNLUE9JTlRdCT0gImNoZWNrcG9pbnQgZXJyb3IiLAogfTsKIAotc3RhdGljIHZvaWQgZjJmc19idWlsZF9mYXVsdF9hdHRyKHVuc2lnbmVkIGludCByYXRlKQorc3RhdGljIHZvaWQgZjJmc19idWlsZF9mYXVsdF9hdHRyKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwKKwkJCQkJCXVuc2lnbmVkIGludCByYXRlKQogeworCXN0cnVjdCBmMmZzX2ZhdWx0X2luZm8gKmZmaSA9ICZzYmktPmZhdWx0X2luZm87CisKIAlpZiAocmF0ZSkgewotCQlhdG9taWNfc2V0KCZmMmZzX2ZhdWx0LmluamVjdF9vcHMsIDApOwotCQlmMmZzX2ZhdWx0LmluamVjdF9yYXRlID0gcmF0ZTsKLQkJZjJmc19mYXVsdC5pbmplY3RfdHlwZSA9ICgxIDw8IEZBVUxUX01BWCkgLSAxOworCQlhdG9taWNfc2V0KCZmZmktPmluamVjdF9vcHMsIDApOworCQlmZmktPmluamVjdF9yYXRlID0gcmF0ZTsKKwkJZmZpLT5pbmplY3RfdHlwZSA9ICgxIDw8IEZBVUxUX01BWCkgLSAxOwogCX0gZWxzZSB7Ci0JCW1lbXNldCgmZjJmc19mYXVsdCwgMCwgc2l6ZW9mKHN0cnVjdCBmMmZzX2ZhdWx0X2luZm8pKTsKKwkJbWVtc2V0KGZmaSwgMCwgc2l6ZW9mKHN0cnVjdCBmMmZzX2ZhdWx0X2luZm8pKTsKIAl9CiB9CiAjZW5kaWYKQEAgLTg3LDYgKzkxLDcgQEAKIAlPcHRfaW5saW5lX3hhdHRyLAogCU9wdF9pbmxpbmVfZGF0YSwKIAlPcHRfaW5saW5lX2RlbnRyeSwKKwlPcHRfbm9pbmxpbmVfZGVudHJ5LAogCU9wdF9mbHVzaF9tZXJnZSwKIAlPcHRfbm9mbHVzaF9tZXJnZSwKIAlPcHRfbm9iYXJyaWVyLApAQCAtMTE4LDYgKzEyMyw3IEBACiAJe09wdF9pbmxpbmVfeGF0dHIsICJpbmxpbmVfeGF0dHIifSwKIAl7T3B0X2lubGluZV9kYXRhLCAiaW5saW5lX2RhdGEifSwKIAl7T3B0X2lubGluZV9kZW50cnksICJpbmxpbmVfZGVudHJ5In0sCisJe09wdF9ub2lubGluZV9kZW50cnksICJub2lubGluZV9kZW50cnkifSwKIAl7T3B0X2ZsdXNoX21lcmdlLCAiZmx1c2hfbWVyZ2UifSwKIAl7T3B0X25vZmx1c2hfbWVyZ2UsICJub2ZsdXNoX21lcmdlIn0sCiAJe09wdF9ub2JhcnJpZXIsICJub2JhcnJpZXIifSwKQEAgLTE2Nyw3ICsxNzMsNyBAQAogI2lmZGVmIENPTkZJR19GMkZTX0ZBVUxUX0lOSkVDVElPTgogCWVsc2UgaWYgKHN0cnVjdF90eXBlID09IEZBVUxUX0lORk9fUkFURSB8fAogCQkJCQlzdHJ1Y3RfdHlwZSA9PSBGQVVMVF9JTkZPX1RZUEUpCi0JCXJldHVybiAodW5zaWduZWQgY2hhciAqKSZmMmZzX2ZhdWx0OworCQlyZXR1cm4gKHVuc2lnbmVkIGNoYXIgKikmc2JpLT5mYXVsdF9pbmZvOwogI2VuZGlmCiAJcmV0dXJuIE5VTEw7CiB9CkBAIC0zMTIsNiArMzE4LDEwIEBACiAJQVRUUl9MSVNUKGRpcnR5X25hdHNfcmF0aW8pLAogCUFUVFJfTElTVChjcF9pbnRlcnZhbCksCiAJQVRUUl9MSVNUKGlkbGVfaW50ZXJ2YWwpLAorI2lmZGVmIENPTkZJR19GMkZTX0ZBVUxUX0lOSkVDVElPTgorCUFUVFJfTElTVChpbmplY3RfcmF0ZSksCisJQVRUUl9MSVNUKGluamVjdF90eXBlKSwKKyNlbmRpZgogCUFUVFJfTElTVChsaWZldGltZV93cml0ZV9rYnl0ZXMpLAogCU5VTEwsCiB9OwpAQCAtMzI3LDIyICszMzcsNiBAQAogCS5yZWxlYXNlCT0gZjJmc19zYl9yZWxlYXNlLAogfTsKIAotI2lmZGVmIENPTkZJR19GMkZTX0ZBVUxUX0lOSkVDVElPTgotLyogc3lzZnMgZm9yIGYyZnMgZmF1bHQgaW5qZWN0aW9uICovCi1zdGF0aWMgc3RydWN0IGtvYmplY3QgZjJmc19mYXVsdF9pbmplY3Q7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpmMmZzX2ZhdWx0X2F0dHJzW10gPSB7Ci0JQVRUUl9MSVNUKGluamVjdF9yYXRlKSwKLQlBVFRSX0xJU1QoaW5qZWN0X3R5cGUpLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGYyZnNfZmF1bHRfa3R5cGUgPSB7Ci0JLmRlZmF1bHRfYXR0cnMJPSBmMmZzX2ZhdWx0X2F0dHJzLAotCS5zeXNmc19vcHMJPSAmZjJmc19hdHRyX29wcywKLX07Ci0jZW5kaWYKLQogdm9pZCBmMmZzX21zZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpsZXZlbCwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAJc3RydWN0IHZhX2Zvcm1hdCB2YWY7CkBAIC0zNzAsMTAgKzM2NCw2IEBACiAJY2hhciAqcCwgKm5hbWU7CiAJaW50IGFyZyA9IDA7CiAKLSNpZmRlZiBDT05GSUdfRjJGU19GQVVMVF9JTkpFQ1RJT04KLQlmMmZzX2J1aWxkX2ZhdWx0X2F0dHIoMCk7Ci0jZW5kaWYKLQogCWlmICghb3B0aW9ucykKIAkJcmV0dXJuIDA7CiAKQEAgLTQ4OCw2ICs0NzgsOSBAQAogCQljYXNlIE9wdF9pbmxpbmVfZGVudHJ5OgogCQkJc2V0X29wdChzYmksIElOTElORV9ERU5UUlkpOwogCQkJYnJlYWs7CisJCWNhc2UgT3B0X25vaW5saW5lX2RlbnRyeToKKwkJCWNsZWFyX29wdChzYmksIElOTElORV9ERU5UUlkpOworCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2ZsdXNoX21lcmdlOgogCQkJc2V0X29wdChzYmksIEZMVVNIX01FUkdFKTsKIAkJCWJyZWFrOwpAQCAtNTMzLDcgKzUyNiw3IEBACiAJCQlpZiAoYXJncy0+ZnJvbSAmJiBtYXRjaF9pbnQoYXJncywgJmFyZykpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAjaWZkZWYgQ09ORklHX0YyRlNfRkFVTFRfSU5KRUNUSU9OCi0JCQlmMmZzX2J1aWxkX2ZhdWx0X2F0dHIoYXJnKTsKKwkJCWYyZnNfYnVpbGRfZmF1bHRfYXR0cihzYmksIGFyZyk7CiAjZWxzZQogCQkJZjJmc19tc2coc2IsIEtFUk5fSU5GTywKIAkJCQkiRkFVTFRfSU5KRUNUSU9OIHdhcyBub3Qgc2VsZWN0ZWQiKTsKQEAgLTcwNiw4ICs2OTksNiBAQAogCQlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPm5yX3BhZ2VzW2ldKTsKIAlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPmFsbG9jX3ZhbGlkX2Jsb2NrX2NvdW50KTsKIAlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnRvdGFsX3ZhbGlkX2lub2RlX2NvdW50KTsKLQotCXBlcmNwdV9mcmVlX3J3c2VtKCZzYmktPmNwX3J3c2VtKTsKIH0KIAogc3RhdGljIHZvaWQgZjJmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKQEAgLTczMiw3ICs3MjMsNyBAQAogCSAqIGNsZWFuIGNoZWNrcG9pbnQgYWdhaW4uCiAJICovCiAJaWYgKGlzX3NiaV9mbGFnX3NldChzYmksIFNCSV9JU19ESVJUWSkgfHwKLQkJCSFpc19zZXRfY2twdF9mbGFncyhGMkZTX0NLUFQoc2JpKSwgQ1BfVU1PVU5UX0ZMQUcpKSB7CisJCQkhaXNfc2V0X2NrcHRfZmxhZ3Moc2JpLCBDUF9VTU9VTlRfRkxBRykpIHsKIAkJc3RydWN0IGNwX2NvbnRyb2wgY3BjID0gewogCQkJLnJlYXNvbiA9IENQX1VNT1VOVCwKIAkJfTsKQEAgLTg4MCw2ICs4NzEsOCBAQAogCQlzZXFfcHV0cyhzZXEsICIsbm9pbmxpbmVfZGF0YSIpOwogCWlmICh0ZXN0X29wdChzYmksIElOTElORV9ERU5UUlkpKQogCQlzZXFfcHV0cyhzZXEsICIsaW5saW5lX2RlbnRyeSIpOworCWVsc2UKKwkJc2VxX3B1dHMoc2VxLCAiLG5vaW5saW5lX2RlbnRyeSIpOwogCWlmICghZjJmc19yZWFkb25seShzYmktPnNiKSAmJiB0ZXN0X29wdChzYmksIEZMVVNIX01FUkdFKSkKIAkJc2VxX3B1dHMoc2VxLCAiLGZsdXNoX21lcmdlIik7CiAJaWYgKHRlc3Rfb3B0KHNiaSwgTk9CQVJSSUVSKSkKQEAgLTk0OCw3ICs5NDEsNyBAQAogCQlzZXFfcHJpbnRmKHNlcSwgIiVkfCUtM3V8Iiwgc2UtPnR5cGUsCiAJCQkJCWdldF92YWxpZF9ibG9ja3Moc2JpLCBpLCAxKSk7CiAJCWZvciAoaiA9IDA7IGogPCBTSVRfVkJMT0NLX01BUF9TSVpFOyBqKyspCi0JCQlzZXFfcHJpbnRmKHNlcSwgIiV4ICIsIHNlLT5jdXJfdmFsaWRfbWFwW2pdKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiICUuMngiLCBzZS0+Y3VyX3ZhbGlkX21hcFtqXSk7CiAJCXNlcV9wdXRjKHNlcSwgJ1xuJyk7CiAJfQogCXJldHVybiAwOwpAQCAtOTc3LDYgKzk3MCw3IEBACiAKIAlzZXRfb3B0KHNiaSwgQkdfR0MpOwogCXNldF9vcHQoc2JpLCBJTkxJTkVfREFUQSk7CisJc2V0X29wdChzYmksIElOTElORV9ERU5UUlkpOwogCXNldF9vcHQoc2JpLCBFWFRFTlRfQ0FDSEUpOwogCXNiaS0+c2ItPnNfZmxhZ3MgfD0gTVNfTEFaWVRJTUU7CiAJc2V0X29wdChzYmksIEZMVVNIX01FUkdFKTsKQEAgLTk5Myw2ICs5ODcsMTAgQEAKICNpZmRlZiBDT05GSUdfRjJGU19GU19QT1NJWF9BQ0wKIAlzZXRfb3B0KHNiaSwgUE9TSVhfQUNMKTsKICNlbmRpZgorCisjaWZkZWYgQ09ORklHX0YyRlNfRkFVTFRfSU5KRUNUSU9OCisJZjJmc19idWlsZF9mYXVsdF9hdHRyKHNiaSwgMCk7CisjZW5kaWYKIH0KIAogc3RhdGljIGludCBmMmZzX3JlbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqZGF0YSkKQEAgLTEwMDMsNiArMTAwMSw5IEBACiAJYm9vbCBuZWVkX3Jlc3RhcnRfZ2MgPSBmYWxzZTsKIAlib29sIG5lZWRfc3RvcF9nYyA9IGZhbHNlOwogCWJvb2wgbm9fZXh0ZW50X2NhY2hlID0gIXRlc3Rfb3B0KHNiaSwgRVhURU5UX0NBQ0hFKTsKKyNpZmRlZiBDT05GSUdfRjJGU19GQVVMVF9JTkpFQ1RJT04KKwlzdHJ1Y3QgZjJmc19mYXVsdF9pbmZvIGZmaSA9IHNiaS0+ZmF1bHRfaW5mbzsKKyNlbmRpZgogCiAJLyoKIAkgKiBTYXZlIHRoZSBvbGQgbW91bnQgb3B0aW9ucyBpbiBjYXNlIHdlCkBAIC0xMDk4LDYgKzEwOTksOSBAQAogcmVzdG9yZV9vcHRzOgogCXNiaS0+bW91bnRfb3B0ID0gb3JnX21vdW50X29wdDsKIAlzYmktPmFjdGl2ZV9sb2dzID0gYWN0aXZlX2xvZ3M7CisjaWZkZWYgQ09ORklHX0YyRlNfRkFVTFRfSU5KRUNUSU9OCisJc2JpLT5mYXVsdF9pbmZvID0gZmZpOworI2VuZGlmCiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTQ3MSw2ICsxNDc1LDcgQEAKIAltdXRleF9pbml0KCZzYmktPnVtb3VudF9tdXRleCk7CiAJbXV0ZXhfaW5pdCgmc2JpLT53aW9fbXV0ZXhbTk9ERV0pOwogCW11dGV4X2luaXQoJnNiaS0+d2lvX211dGV4W0RBVEFdKTsKKwlzcGluX2xvY2tfaW5pdCgmc2JpLT5jcF9sb2NrKTsKIAogI2lmZGVmIENPTkZJR19GMkZTX0ZTX0VOQ1JZUFRJT04KIAltZW1jcHkoc2JpLT5rZXlfcHJlZml4LCBGMkZTX0tFWV9ERVNDX1BSRUZJWCwKQEAgLTE0ODMsOSArMTQ4OCw2IEBACiB7CiAJaW50IGksIGVycjsKIAotCWlmIChwZXJjcHVfaW5pdF9yd3NlbSgmc2JpLT5jcF9yd3NlbSkpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJZm9yIChpID0gMDsgaSA8IE5SX0NPVU5UX1RZUEU7IGkrKykgewogCQllcnIgPSBwZXJjcHVfY291bnRlcl9pbml0KCZzYmktPm5yX3BhZ2VzW2ldLCAwLCBHRlBfS0VSTkVMKTsKIAkJaWYgKGVycikKQEAgLTE2ODYsNiArMTY4OCw3IEBACiAJCXNiaS0+d3JpdGVfaW9baV0uYmlvID0gTlVMTDsKIAl9CiAKKwlpbml0X3J3c2VtKCZzYmktPmNwX3J3c2VtKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzYmktPmNwX3dhaXQpOwogCWluaXRfc2JfaW5mbyhzYmkpOwogCkBAIC0xODE0LDcgKzE4MTcsNyBAQAogCQkgKiBwcmV2aW91cyBjaGVja3BvaW50IHdhcyBub3QgZG9uZSBieSBjbGVhbiBzeXN0ZW0gc2h1dGRvd24uCiAJCSAqLwogCQlpZiAoYmRldl9yZWFkX29ubHkoc2ItPnNfYmRldikgJiYKLQkJCQkhaXNfc2V0X2NrcHRfZmxhZ3Moc2JpLT5ja3B0LCBDUF9VTU9VTlRfRkxBRykpIHsKKwkJCQkhaXNfc2V0X2NrcHRfZmxhZ3Moc2JpLCBDUF9VTU9VTlRfRkxBRykpIHsKIAkJCWVyciA9IC1FUk9GUzsKIAkJCWdvdG8gZnJlZV9rb2JqOwogCQl9CkBAIC0xODIyLDYgKzE4MjUsOSBAQAogCQlpZiAobmVlZF9mc2NrKQogCQkJc2V0X3NiaV9mbGFnKHNiaSwgU0JJX05FRURfRlNDSyk7CiAKKwkJaWYgKCFyZXRyeSkKKwkJCWdvdG8gc2tpcF9yZWNvdmVyeTsKKwogCQllcnIgPSByZWNvdmVyX2ZzeW5jX2RhdGEoc2JpLCBmYWxzZSk7CiAJCWlmIChlcnIgPCAwKSB7CiAJCQluZWVkX2ZzY2sgPSB0cnVlOwpAQCAtMTgzOSw3ICsxODQ1LDcgQEAKIAkJCWdvdG8gZnJlZV9rb2JqOwogCQl9CiAJfQotCitza2lwX3JlY292ZXJ5OgogCS8qIHJlY292ZXJfZnN5bmNfZGF0YSgpIGNsZWFyZWQgdGhpcyBhbHJlYWR5ICovCiAJY2xlYXJfc2JpX2ZsYWcoc2JpLCBTQklfUE9SX0RPSU5HKTsKIApAQCAtMTg4Myw3ICsxODg5LDkgQEAKIAlkcHV0KHNiLT5zX3Jvb3QpOwogCXNiLT5zX3Jvb3QgPSBOVUxMOwogZnJlZV9ub2RlX2lub2RlOgorCXRydW5jYXRlX2lub2RlX3BhZ2VzX2ZpbmFsKE5PREVfTUFQUElORyhzYmkpKTsKIAltdXRleF9sb2NrKCZzYmktPnVtb3VudF9tdXRleCk7CisJcmVsZWFzZV9pbm9fZW50cnkoc2JpLCB0cnVlKTsKIAlmMmZzX2xlYXZlX3Nocmlua2VyKHNiaSk7CiAJaXB1dChzYmktPm5vZGVfaW5vZGUpOwogCW11dGV4X3VubG9jaygmc2JpLT51bW91bnRfbXV0ZXgpOwpAQCAtMTk4MiwxNiArMTk5MCw2IEBACiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZnJlZV9leHRlbnRfY2FjaGU7CiAJfQotI2lmZGVmIENPTkZJR19GMkZTX0ZBVUxUX0lOSkVDVElPTgotCWYyZnNfZmF1bHRfaW5qZWN0LmtzZXQgPSBmMmZzX2tzZXQ7Ci0JZjJmc19idWlsZF9mYXVsdF9hdHRyKDApOwotCWVyciA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZmMmZzX2ZhdWx0X2luamVjdCwgJmYyZnNfZmF1bHRfa3R5cGUsCi0JCQkJTlVMTCwgImZhdWx0X2luamVjdGlvbiIpOwotCWlmIChlcnIpIHsKLQkJZjJmc19mYXVsdF9pbmplY3Qua3NldCA9IE5VTEw7Ci0JCWdvdG8gZnJlZV9rc2V0OwotCX0KLSNlbmRpZgogCWVyciA9IHJlZ2lzdGVyX3Nocmlua2VyKCZmMmZzX3Nocmlua2VyX2luZm8pOwogCWlmIChlcnIpCiAJCWdvdG8gZnJlZV9rc2V0OwpAQCAtMjAxMCwxMCArMjAwOCw2IEBACiBmcmVlX3Nocmlua2VyOgogCXVucmVnaXN0ZXJfc2hyaW5rZXIoJmYyZnNfc2hyaW5rZXJfaW5mbyk7CiBmcmVlX2tzZXQ6Ci0jaWZkZWYgQ09ORklHX0YyRlNfRkFVTFRfSU5KRUNUSU9OCi0JaWYgKGYyZnNfZmF1bHRfaW5qZWN0LmtzZXQpCi0JCWtvYmplY3RfcHV0KCZmMmZzX2ZhdWx0X2luamVjdCk7Ci0jZW5kaWYKIAlrc2V0X3VucmVnaXN0ZXIoZjJmc19rc2V0KTsKIGZyZWVfZXh0ZW50X2NhY2hlOgogCWRlc3Ryb3lfZXh0ZW50X2NhY2hlKCk7CkBAIC0yMDM1LDkgKzIwMjksNiBAQAogCWYyZnNfZGVzdHJveV9yb290X3N0YXRzKCk7CiAJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZmMmZzX2ZzX3R5cGUpOwogCXVucmVnaXN0ZXJfc2hyaW5rZXIoJmYyZnNfc2hyaW5rZXJfaW5mbyk7Ci0jaWZkZWYgQ09ORklHX0YyRlNfRkFVTFRfSU5KRUNUSU9OCi0Ja29iamVjdF9wdXQoJmYyZnNfZmF1bHRfaW5qZWN0KTsKLSNlbmRpZgogCWtzZXRfdW5yZWdpc3RlcihmMmZzX2tzZXQpOwogCWRlc3Ryb3lfZXh0ZW50X2NhY2hlKCk7CiAJZGVzdHJveV9jaGVja3BvaW50X2NhY2hlcygpOwpkaWZmIC0tZ2l0IGEvZnMvZjJmcy94YXR0ci5jIGIvZnMvZjJmcy94YXR0ci5jCmluZGV4IGM4ODk4YjUuLjFmNzQ4NzYgMTAwNjQ0Ci0tLSBhL2ZzL2YyZnMveGF0dHIuYworKysgYi9mcy9mMmZzL3hhdHRyLmMKQEAgLTIxNywxOCArMjE3LDIwIEBACiAJcmV0dXJuIGVudHJ5OwogfQogCi1zdGF0aWMgdm9pZCAqcmVhZF9hbGxfeGF0dHJzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICppcGFnZSkKK3N0YXRpYyBpbnQgcmVhZF9hbGxfeGF0dHJzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICppcGFnZSwKKwkJCQkJCQl2b2lkICoqYmFzZV9hZGRyKQogewogCXN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSA9IEYyRlNfSV9TQihpbm9kZSk7CiAJc3RydWN0IGYyZnNfeGF0dHJfaGVhZGVyICpoZWFkZXI7CiAJc2l6ZV90IHNpemUgPSBQQUdFX1NJWkUsIGlubGluZV9zaXplID0gMDsKIAl2b2lkICp0eGF0dHJfYWRkcjsKKwlpbnQgZXJyOwogCiAJaW5saW5lX3NpemUgPSBpbmxpbmVfeGF0dHJfc2l6ZShpbm9kZSk7CiAKIAl0eGF0dHJfYWRkciA9IGt6YWxsb2MoaW5saW5lX3NpemUgKyBzaXplLCBHRlBfRjJGU19aRVJPKTsKIAlpZiAoIXR4YXR0cl9hZGRyKQotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKiByZWFkIGZyb20gaW5saW5lIHhhdHRyICovCiAJaWYgKGlubGluZV9zaXplKSB7CkBAIC0yMzksOCArMjQxLDEwIEBACiAJCQlpbmxpbmVfYWRkciA9IGlubGluZV94YXR0cl9hZGRyKGlwYWdlKTsKIAkJfSBlbHNlIHsKIAkJCXBhZ2UgPSBnZXRfbm9kZV9wYWdlKHNiaSwgaW5vZGUtPmlfaW5vKTsKLQkJCWlmIChJU19FUlIocGFnZSkpCisJCQlpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCQkJZXJyID0gUFRSX0VSUihwYWdlKTsKIAkJCQlnb3RvIGZhaWw7CisJCQl9CiAJCQlpbmxpbmVfYWRkciA9IGlubGluZV94YXR0cl9hZGRyKHBhZ2UpOwogCQl9CiAJCW1lbWNweSh0eGF0dHJfYWRkciwgaW5saW5lX2FkZHIsIGlubGluZV9zaXplKTsKQEAgLTI1NCw4ICsyNTgsMTAgQEAKIAogCQkvKiBUaGUgaW5vZGUgYWxyZWFkeSBoYXMgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGJsb2NrLiAqLwogCQl4cGFnZSA9IGdldF9ub2RlX3BhZ2Uoc2JpLCBGMkZTX0koaW5vZGUpLT5pX3hhdHRyX25pZCk7Ci0JCWlmIChJU19FUlIoeHBhZ2UpKQorCQlpZiAoSVNfRVJSKHhwYWdlKSkgeworCQkJZXJyID0gUFRSX0VSUih4cGFnZSk7CiAJCQlnb3RvIGZhaWw7CisJCX0KIAogCQl4YXR0cl9hZGRyID0gcGFnZV9hZGRyZXNzKHhwYWdlKTsKIAkJbWVtY3B5KHR4YXR0cl9hZGRyICsgaW5saW5lX3NpemUsIHhhdHRyX2FkZHIsIFBBR0VfU0laRSk7CkBAIC0yNjksMTAgKzI3NSwxMSBAQAogCQloZWFkZXItPmhfbWFnaWMgPSBjcHVfdG9fbGUzMihGMkZTX1hBVFRSX01BR0lDKTsKIAkJaGVhZGVyLT5oX3JlZmNvdW50ID0gY3B1X3RvX2xlMzIoMSk7CiAJfQotCXJldHVybiB0eGF0dHJfYWRkcjsKKwkqYmFzZV9hZGRyID0gdHhhdHRyX2FkZHI7CisJcmV0dXJuIDA7CiBmYWlsOgogCWt6ZnJlZSh0eGF0dHJfYWRkcik7Ci0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgd3JpdGVfYWxsX3hhdHRycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBfX3UzMiBoc2l6ZSwKQEAgLTM2Niw5ICszNzMsOSBAQAogCWlmIChsZW4gPiBGMkZTX05BTUVfTEVOKQogCQlyZXR1cm4gLUVSQU5HRTsKIAotCWJhc2VfYWRkciA9IHJlYWRfYWxsX3hhdHRycyhpbm9kZSwgaXBhZ2UpOwotCWlmICghYmFzZV9hZGRyKQotCQlyZXR1cm4gLUVOT01FTTsKKwllcnJvciA9IHJlYWRfYWxsX3hhdHRycyhpbm9kZSwgaXBhZ2UsICZiYXNlX2FkZHIpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOwogCiAJZW50cnkgPSBfX2ZpbmRfeGF0dHIoYmFzZV9hZGRyLCBpbmRleCwgbGVuLCBuYW1lKTsKIAlpZiAoSVNfWEFUVFJfTEFTVF9FTlRSWShlbnRyeSkpIHsKQEAgLTQwMiw5ICs0MDksOSBAQAogCWludCBlcnJvciA9IDA7CiAJc2l6ZV90IHJlc3QgPSBidWZmZXJfc2l6ZTsKIAotCWJhc2VfYWRkciA9IHJlYWRfYWxsX3hhdHRycyhpbm9kZSwgTlVMTCk7Ci0JaWYgKCFiYXNlX2FkZHIpCi0JCXJldHVybiAtRU5PTUVNOworCWVycm9yID0gcmVhZF9hbGxfeGF0dHJzKGlub2RlLCBOVUxMLCAmYmFzZV9hZGRyKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKIAogCWxpc3RfZm9yX2VhY2hfeGF0dHIoZW50cnksIGJhc2VfYWRkcikgewogCQljb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqaGFuZGxlciA9CkBAIC00NjMsOSArNDcwLDkgQEAKIAlpZiAoc2l6ZSA+IE1BWF9WQUxVRV9MRU4oaW5vZGUpKQogCQlyZXR1cm4gLUUyQklHOwogCi0JYmFzZV9hZGRyID0gcmVhZF9hbGxfeGF0dHJzKGlub2RlLCBpcGFnZSk7Ci0JaWYgKCFiYXNlX2FkZHIpCi0JCXJldHVybiAtRU5PTUVNOworCWVycm9yID0gcmVhZF9hbGxfeGF0dHJzKGlub2RlLCBpcGFnZSwgJmJhc2VfYWRkcik7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CiAKIAkvKiBmaW5kIGVudHJ5IHdpdGggd2FudGVkIG5hbWUuICovCiAJaGVyZSA9IF9fZmluZF94YXR0cihiYXNlX2FkZHIsIGluZGV4LCBsZW4sIG5hbWUpOwpAQCAtNTQ4LDYgKzU1NSw4IEBACiAJCQkhc3RyY21wKG5hbWUsIEYyRlNfWEFUVFJfTkFNRV9FTkNSWVBUSU9OX0NPTlRFWFQpKQogCQlmMmZzX3NldF9lbmNyeXB0ZWRfaW5vZGUoaW5vZGUpOwogCWYyZnNfbWFya19pbm9kZV9kaXJ0eV9zeW5jKGlub2RlKTsKKwlpZiAoIWVycm9yICYmIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCXNldF9zYmlfZmxhZyhGMkZTX0lfU0IoaW5vZGUpLCBTQklfTkVFRF9DUCk7CiBleGl0OgogCWt6ZnJlZShiYXNlX2FkZHIpOwogCXJldHVybiBlcnJvcjsKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvS2NvbmZpZyBiL2ZzL2Z1c2UvS2NvbmZpZwppbmRleCAxYjJmNmMyLi43NmYwOWNlIDEwMDY0NAotLS0gYS9mcy9mdXNlL0tjb25maWcKKysrIGIvZnMvZnVzZS9LY29uZmlnCkBAIC0xLDUgKzEsNiBAQAogY29uZmlnIEZVU0VfRlMKIAl0cmlzdGF0ZSAiRlVTRSAoRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UpIHN1cHBvcnQiCisJc2VsZWN0IEZTX1BPU0lYX0FDTAogCWhlbHAKIAkgIFdpdGggRlVTRSBpdCBpcyBwb3NzaWJsZSB0byBpbXBsZW1lbnQgYSBmdWxseSBmdW5jdGlvbmFsIGZpbGVzeXN0ZW0KIAkgIGluIGEgdXNlcnNwYWNlIHByb2dyYW0uCmRpZmYgLS1naXQgYS9mcy9mdXNlL01ha2VmaWxlIGIvZnMvZnVzZS9NYWtlZmlsZQppbmRleCBlOTVlZWI0Li42MGRhODRhIDEwMDY0NAotLS0gYS9mcy9mdXNlL01ha2VmaWxlCisrKyBiL2ZzL2Z1c2UvTWFrZWZpbGUKQEAgLTUsNCArNSw0IEBACiBvYmotJChDT05GSUdfRlVTRV9GUykgKz0gZnVzZS5vCiBvYmotJChDT05GSUdfQ1VTRSkgKz0gY3VzZS5vCiAKLWZ1c2Utb2JqcyA6PSBkZXYubyBkaXIubyBmaWxlLm8gaW5vZGUubyBjb250cm9sLm8KK2Z1c2Utb2JqcyA6PSBkZXYubyBkaXIubyBmaWxlLm8gaW5vZGUubyBjb250cm9sLm8geGF0dHIubyBhY2wubwpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9hY2wuYyBiL2ZzL2Z1c2UvYWNsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM4NTc2NQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Z1c2UvYWNsLmMKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIEZVU0U6IEZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQ2Fub25pY2FsIEx0ZC4gPHNldGguZm9yc2hlZUBjYW5vbmljYWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBjYW4gYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLgorICogU2VlIHRoZSBmaWxlIENPUFlJTkcuCisgKi8KKworI2luY2x1ZGUgImZ1c2VfaS5oIgorCisjaW5jbHVkZSA8bGludXgvcG9zaXhfYWNsLmg+CisjaW5jbHVkZSA8bGludXgvcG9zaXhfYWNsX3hhdHRyLmg+CisKK3N0cnVjdCBwb3NpeF9hY2wgKmZ1c2VfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCWludCBzaXplOworCWNvbnN0IGNoYXIgKm5hbWU7CisJdm9pZCAqdmFsdWUgPSBOVUxMOworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKworCWlmICghZmMtPnBvc2l4X2FjbCB8fCBmYy0+bm9fZ2V0eGF0dHIpCisJCXJldHVybiBOVUxMOworCisJaWYgKHR5cGUgPT0gQUNMX1RZUEVfQUNDRVNTKQorCQluYW1lID0gWEFUVFJfTkFNRV9QT1NJWF9BQ0xfQUNDRVNTOworCWVsc2UgaWYgKHR5cGUgPT0gQUNMX1RZUEVfREVGQVVMVCkKKwkJbmFtZSA9IFhBVFRSX05BTUVfUE9TSVhfQUNMX0RFRkFVTFQ7CisJZWxzZQorCQlyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7CisKKwl2YWx1ZSA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZhbHVlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlzaXplID0gZnVzZV9nZXR4YXR0cihpbm9kZSwgbmFtZSwgdmFsdWUsIFBBR0VfU0laRSk7CisJaWYgKHNpemUgPiAwKQorCQlhY2wgPSBwb3NpeF9hY2xfZnJvbV94YXR0cigmaW5pdF91c2VyX25zLCB2YWx1ZSwgc2l6ZSk7CisJZWxzZSBpZiAoKHNpemUgPT0gMCkgfHwgKHNpemUgPT0gLUVOT0RBVEEpIHx8CisJCSAoc2l6ZSA9PSAtRU9QTk9UU1VQUCAmJiBmYy0+bm9fZ2V0eGF0dHIpKQorCQlhY2wgPSBOVUxMOworCWVsc2UgaWYgKHNpemUgPT0gLUVSQU5HRSkKKwkJYWNsID0gRVJSX1BUUigtRTJCSUcpOworCWVsc2UKKwkJYWNsID0gRVJSX1BUUihzaXplKTsKKworCWtmcmVlKHZhbHVlKTsKKwlyZXR1cm4gYWNsOworfQorCitpbnQgZnVzZV9zZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgaW50IHR5cGUpCit7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKKwljb25zdCBjaGFyICpuYW1lOworCWludCByZXQ7CisKKwlpZiAoIWZjLT5wb3NpeF9hY2wgfHwgZmMtPm5vX3NldHhhdHRyKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAodHlwZSA9PSBBQ0xfVFlQRV9BQ0NFU1MpCisJCW5hbWUgPSBYQVRUUl9OQU1FX1BPU0lYX0FDTF9BQ0NFU1M7CisJZWxzZSBpZiAodHlwZSA9PSBBQ0xfVFlQRV9ERUZBVUxUKQorCQluYW1lID0gWEFUVFJfTkFNRV9QT1NJWF9BQ0xfREVGQVVMVDsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGFjbCkgeworCQkvKgorCQkgKiBGdXNlIHVzZXJzcGFjZSBpcyByZXNwb25zaWJsZSBmb3IgdXBkYXRpbmcgYWNjZXNzCisJCSAqIHBlcm1pc3Npb25zIGluIHRoZSBpbm9kZSwgaWYgbmVlZGVkLiBmdXNlX3NldHhhdHRyCisJCSAqIGludmFsaWRhdGVzIHRoZSBpbm9kZSBhdHRyaWJ1dGVzLCB3aGljaCB3aWxsIGZvcmNlCisJCSAqIHRoZW0gdG8gYmUgcmVmcmVzaGVkIHRoZSBuZXh0IHRpbWUgdGhleSBhcmUgdXNlZCwKKwkJICogYW5kIGl0IGFsc28gdXBkYXRlcyBpX2N0aW1lLgorCQkgKi8KKwkJc2l6ZV90IHNpemUgPSBwb3NpeF9hY2xfeGF0dHJfc2l6ZShhY2wtPmFfY291bnQpOworCQl2b2lkICp2YWx1ZTsKKworCQlpZiAoc2l6ZSA+IFBBR0VfU0laRSkKKwkJCXJldHVybiAtRTJCSUc7CisKKwkJdmFsdWUgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIXZhbHVlKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJcmV0ID0gcG9zaXhfYWNsX3RvX3hhdHRyKCZpbml0X3VzZXJfbnMsIGFjbCwgdmFsdWUsIHNpemUpOworCQlpZiAocmV0IDwgMCkgeworCQkJa2ZyZWUodmFsdWUpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXJldCA9IGZ1c2Vfc2V0eGF0dHIoaW5vZGUsIG5hbWUsIHZhbHVlLCBzaXplLCAwKTsKKwkJa2ZyZWUodmFsdWUpOworCX0gZWxzZSB7CisJCXJldCA9IGZ1c2VfcmVtb3ZleGF0dHIoaW5vZGUsIG5hbWUpOworCX0KKwlmb3JnZXRfYWxsX2NhY2hlZF9hY2xzKGlub2RlKTsKKwlmdXNlX2ludmFsaWRhdGVfYXR0cihpbm9kZSk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9kZXYuYyBiL2ZzL2Z1c2UvZGV2LmMKaW5kZXggYTk0ZDJlZC4uYzQxYmRlMiAxMDA2NDQKLS0tIGEvZnMvZnVzZS9kZXYuYworKysgYi9mcy9mdXNlL2Rldi5jCkBAIC03NjcsNyArNzY3LDYgQEAKIAkJY3MtPmxlbiA9IGVycjsKIAkJY3MtPm9mZnNldCA9IG9mZjsKIAkJY3MtPnBnID0gcGFnZTsKLQkJY3MtPm9mZnNldCA9IG9mZjsKIAkJaW92X2l0ZXJfYWR2YW5jZShjcy0+aXRlciwgZXJyKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZGlyLmMgYi9mcy9mdXNlL2Rpci5jCmluZGV4IGM0N2I3NzguLmY3Yzg0YWIgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZGlyLmMKKysrIGIvZnMvZnVzZS9kaXIuYwpAQCAtMTMsNiArMTMsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2wuaD4KIAogc3RhdGljIGJvb2wgZnVzZV91c2VfcmVhZGRpcnBsdXMoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KQogewpAQCAtMzcsNDcgKzM5LDM5IEBACiAJc2V0X2JpdChGVVNFX0lfQURWSVNFX1JEUExVUywgJmZpLT5zdGF0ZSk7CiB9CiAKLSNpZiBCSVRTX1BFUl9MT05HID49IDY0Cit1bmlvbiBmdXNlX2RlbnRyeSB7CisJdTY0IHRpbWU7CisJc3RydWN0IHJjdV9oZWFkIHJjdTsKK307CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBmdXNlX2RlbnRyeV9zZXR0aW1lKHN0cnVjdCBkZW50cnkgKmVudHJ5LCB1NjQgdGltZSkKIHsKLQllbnRyeS0+ZF90aW1lID0gdGltZTsKKwkoKHVuaW9uIGZ1c2VfZGVudHJ5ICopIGVudHJ5LT5kX2ZzZGF0YSktPnRpbWUgPSB0aW1lOwogfQogCiBzdGF0aWMgaW5saW5lIHU2NCBmdXNlX2RlbnRyeV90aW1lKHN0cnVjdCBkZW50cnkgKmVudHJ5KQogewotCXJldHVybiBlbnRyeS0+ZF90aW1lOworCXJldHVybiAoKHVuaW9uIGZ1c2VfZGVudHJ5ICopIGVudHJ5LT5kX2ZzZGF0YSktPnRpbWU7CiB9Ci0jZWxzZQotLyoKLSAqIE9uIDMyIGJpdCBhcmNocyBzdG9yZSB0aGUgaGlnaCAzMiBiaXRzIG9mIHRpbWUgaW4gZF9mc2RhdGEKLSAqLwotc3RhdGljIHZvaWQgZnVzZV9kZW50cnlfc2V0dGltZShzdHJ1Y3QgZGVudHJ5ICplbnRyeSwgdTY0IHRpbWUpCi17Ci0JZW50cnktPmRfdGltZSA9IHRpbWU7Ci0JZW50cnktPmRfZnNkYXRhID0gKHZvaWQgKikgKHVuc2lnbmVkIGxvbmcpICh0aW1lID4+IDMyKTsKLX0KLQotc3RhdGljIHU2NCBmdXNlX2RlbnRyeV90aW1lKHN0cnVjdCBkZW50cnkgKmVudHJ5KQotewotCXJldHVybiAodTY0KSBlbnRyeS0+ZF90aW1lICsKLQkJKCh1NjQpICh1bnNpZ25lZCBsb25nKSBlbnRyeS0+ZF9mc2RhdGEgPDwgMzIpOwotfQotI2VuZGlmCiAKIC8qCiAgKiBGVVNFIGNhY2hlcyBkZW50cmllcyBhbmQgYXR0cmlidXRlcyB3aXRoIHNlcGFyYXRlIHRpbWVvdXQuICBUaGUKICAqIHRpbWUgaW4gamlmZmllcyB1bnRpbCB0aGUgZGVudHJ5L2F0dHJpYnV0ZXMgYXJlIHZhbGlkIGlzIHN0b3JlZCBpbgotICogZGVudHJ5LT5kX3RpbWUgYW5kIGZ1c2VfaW5vZGUtPmlfdGltZSByZXNwZWN0aXZlbHkuCisgKiBkZW50cnktPmRfZnNkYXRhIGFuZCBmdXNlX2lub2RlLT5pX3RpbWUgcmVzcGVjdGl2ZWx5LgogICovCiAKIC8qCiAgKiBDYWxjdWxhdGUgdGhlIHRpbWUgaW4gamlmZmllcyB1bnRpbCBhIGRlbnRyeS9hdHRyaWJ1dGVzIGFyZSB2YWxpZAogICovCi1zdGF0aWMgdTY0IHRpbWVfdG9famlmZmllcyh1bnNpZ25lZCBsb25nIHNlYywgdW5zaWduZWQgbG9uZyBuc2VjKQorc3RhdGljIHU2NCB0aW1lX3RvX2ppZmZpZXModTY0IHNlYywgdTMyIG5zZWMpCiB7CiAJaWYgKHNlYyB8fCBuc2VjKSB7Ci0JCXN0cnVjdCB0aW1lc3BlYyB0cyA9IHtzZWMsIG5zZWN9OwotCQlyZXR1cm4gZ2V0X2ppZmZpZXNfNjQoKSArIHRpbWVzcGVjX3RvX2ppZmZpZXMoJnRzKTsKKwkJc3RydWN0IHRpbWVzcGVjNjQgdHMgPSB7CisJCQlzZWMsCisJCQltYXhfdCh1MzIsIG5zZWMsIE5TRUNfUEVSX1NFQyAtIDEpCisJCX07CisKKwkJcmV0dXJuIGdldF9qaWZmaWVzXzY0KCkgKyB0aW1lc3BlYzY0X3RvX2ppZmZpZXMoJnRzKTsKIAl9IGVsc2UKIAkJcmV0dXJuIDA7CiB9CkBAIC0yNDMsNiArMjM3LDcgQEAKIAkJaWYgKHJldCB8fCAob3V0YXJnLmF0dHIubW9kZSBeIGlub2RlLT5pX21vZGUpICYgU19JRk1UKQogCQkJZ290byBpbnZhbGlkOwogCisJCWZvcmdldF9hbGxfY2FjaGVkX2FjbHMoaW5vZGUpOwogCQlmdXNlX2NoYW5nZV9hdHRyaWJ1dGVzKGlub2RlLCAmb3V0YXJnLmF0dHIsCiAJCQkJICAgICAgIGVudHJ5X2F0dHJfdGltZW91dCgmb3V0YXJnKSwKIAkJCQkgICAgICAgYXR0cl92ZXJzaW9uKTsKQEAgLTI3Miw4ICsyNjcsMjMgQEAKIAlyZXR1cm4gIW5vZGVpZCB8fCBub2RlaWQgPT0gRlVTRV9ST09UX0lEOwogfQogCitzdGF0aWMgaW50IGZ1c2VfZGVudHJ5X2luaXQoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWRlbnRyeS0+ZF9mc2RhdGEgPSBremFsbG9jKHNpemVvZih1bmlvbiBmdXNlX2RlbnRyeSksIEdGUF9LRVJORUwpOworCisJcmV0dXJuIGRlbnRyeS0+ZF9mc2RhdGEgPyAwIDogLUVOT01FTTsKK30KK3N0YXRpYyB2b2lkIGZ1c2VfZGVudHJ5X3JlbGVhc2Uoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXVuaW9uIGZ1c2VfZGVudHJ5ICpmZCA9IGRlbnRyeS0+ZF9mc2RhdGE7CisKKwlrZnJlZV9yY3UoZmQsIHJjdSk7Cit9CisKIGNvbnN0IHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBmdXNlX2RlbnRyeV9vcGVyYXRpb25zID0gewogCS5kX3JldmFsaWRhdGUJPSBmdXNlX2RlbnRyeV9yZXZhbGlkYXRlLAorCS5kX2luaXQJCT0gZnVzZV9kZW50cnlfaW5pdCwKKwkuZF9yZWxlYXNlCT0gZnVzZV9kZW50cnlfcmVsZWFzZSwKIH07CiAKIGludCBmdXNlX3ZhbGlkX3R5cGUoaW50IG0pCkBAIC02MzQsNyArNjQ0LDcgQEAKIAlyZXR1cm4gY3JlYXRlX25ld19lbnRyeShmYywgJmFyZ3MsIGRpciwgZW50cnksIFNfSUZMTkspOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZnVzZV91cGRhdGVfY3RpbWUoc3RydWN0IGlub2RlICppbm9kZSkKK3ZvaWQgZnVzZV91cGRhdGVfY3RpbWUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlpZiAoIUlTX05PQ01USU1FKGlub2RlKSkgewogCQlpbm9kZS0+aV9jdGltZSA9IGN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7CkBAIC05MTcsNiArOTI3LDcgQEAKIAogCWlmICh0aW1lX2JlZm9yZTY0KGZpLT5pX3RpbWUsIGdldF9qaWZmaWVzXzY0KCkpKSB7CiAJCXIgPSB0cnVlOworCQlmb3JnZXRfYWxsX2NhY2hlZF9hY2xzKGlub2RlKTsKIAkJZXJyID0gZnVzZV9kb19nZXRhdHRyKGlub2RlLCBzdGF0LCBmaWxlKTsKIAl9IGVsc2UgewogCQlyID0gZmFsc2U7CkBAIC0xMDE3LDcgKzEwMjgsNyBAQAogewogCWNvbnN0IHN0cnVjdCBjcmVkICpjcmVkOwogCi0JaWYgKGZjLT5mbGFncyAmIEZVU0VfQUxMT1dfT1RIRVIpCisJaWYgKGZjLT5hbGxvd19vdGhlcikKIAkJcmV0dXJuIDE7CiAKIAljcmVkID0gY3VycmVudF9jcmVkKCk7CkBAIC0xMDY0LDYgKzEwNzUsNyBAQAogCWlmIChtYXNrICYgTUFZX05PVF9CTE9DSykKIAkJcmV0dXJuIC1FQ0hJTEQ7CiAKKwlmb3JnZXRfYWxsX2NhY2hlZF9hY2xzKGlub2RlKTsKIAlyZXR1cm4gZnVzZV9kb19nZXRhdHRyKGlub2RlLCBOVUxMLCBOVUxMKTsKIH0KIApAQCAtMTA5Miw3ICsxMTA0LDcgQEAKIAkvKgogCSAqIElmIGF0dHJpYnV0ZXMgYXJlIG5lZWRlZCwgcmVmcmVzaCB0aGVtIGJlZm9yZSBwcm9jZWVkaW5nCiAJICovCi0JaWYgKChmYy0+ZmxhZ3MgJiBGVVNFX0RFRkFVTFRfUEVSTUlTU0lPTlMpIHx8CisJaWYgKGZjLT5kZWZhdWx0X3Blcm1pc3Npb25zIHx8CiAJICAgICgobWFzayAmIE1BWV9FWEVDKSAmJiBTX0lTUkVHKGlub2RlLT5pX21vZGUpKSkgewogCQlzdHJ1Y3QgZnVzZV9pbm9kZSAqZmkgPSBnZXRfZnVzZV9pbm9kZShpbm9kZSk7CiAKQEAgLTExMDUsNyArMTExNyw3IEBACiAJCX0KIAl9CiAKLQlpZiAoZmMtPmZsYWdzICYgRlVTRV9ERUZBVUxUX1BFUk1JU1NJT05TKSB7CisJaWYgKGZjLT5kZWZhdWx0X3Blcm1pc3Npb25zKSB7CiAJCWVyciA9IGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzayk7CiAKIAkJLyogSWYgcGVybWlzc2lvbiBpcyBkZW5pZWQsIHRyeSB0byByZWZyZXNoIGZpbGUKQEAgLTEyMzMsNiArMTI0NSw3IEBACiAJCWZpLT5ubG9va3VwKys7CiAJCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CiAKKwkJZm9yZ2V0X2FsbF9jYWNoZWRfYWNscyhpbm9kZSk7CiAJCWZ1c2VfY2hhbmdlX2F0dHJpYnV0ZXMoaW5vZGUsICZvLT5hdHRyLAogCQkJCSAgICAgICBlbnRyeV9hdHRyX3RpbWVvdXQobyksCiAJCQkJICAgICAgIGF0dHJfdmVyc2lvbik7CkBAIC0xNjA1LDcgKzE2MTgsNyBAQAogCWludCBlcnI7CiAJYm9vbCB0cnVzdF9sb2NhbF9jbXRpbWUgPSBpc193YiAmJiBTX0lTUkVHKGlub2RlLT5pX21vZGUpOwogCi0JaWYgKCEoZmMtPmZsYWdzICYgRlVTRV9ERUZBVUxUX1BFUk1JU1NJT05TKSkKKwlpZiAoIWZjLT5kZWZhdWx0X3Blcm1pc3Npb25zKQogCQlhdHRyLT5pYV92YWxpZCB8PSBBVFRSX0ZPUkNFOwogCiAJZXJyID0gaW5vZGVfY2hhbmdlX29rKGlub2RlLCBhdHRyKTsKQEAgLTE3MDIsMTQgKzE3MTUsNjMgQEAKIHN0YXRpYyBpbnQgZnVzZV9zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRfaW5vZGUoZW50cnkpOworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CisJc3RydWN0IGZpbGUgKmZpbGUgPSAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0ZJTEUpID8gYXR0ci0+aWFfZmlsZSA6IE5VTEw7CisJaW50IHJldDsKIAogCWlmICghZnVzZV9hbGxvd19jdXJyZW50X3Byb2Nlc3MoZ2V0X2Z1c2VfY29ubihpbm9kZSkpKQogCQlyZXR1cm4gLUVBQ0NFUzsKIAotCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfRklMRSkKLQkJcmV0dXJuIGZ1c2VfZG9fc2V0YXR0cihpbm9kZSwgYXR0ciwgYXR0ci0+aWFfZmlsZSk7Ci0JZWxzZQotCQlyZXR1cm4gZnVzZV9kb19zZXRhdHRyKGlub2RlLCBhdHRyLCBOVUxMKTsKKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiAoQVRUUl9LSUxMX1NVSUQgfCBBVFRSX0tJTExfU0dJRCkpIHsKKwkJYXR0ci0+aWFfdmFsaWQgJj0gfihBVFRSX0tJTExfU1VJRCB8IEFUVFJfS0lMTF9TR0lEIHwKKwkJCQkgICAgQVRUUl9NT0RFKTsKKworCQkvKgorCQkgKiBUaGUgb25seSBzYW5lIHdheSB0byByZWxpYWJseSBraWxsIHN1aWQvc2dpZCBpcyB0byBkbyBpdCBpbgorCQkgKiB0aGUgdXNlcnNwYWNlIGZpbGVzeXN0ZW0KKwkJICoKKwkJICogVGhpcyBzaG91bGQgYmUgZG9uZSBvbiB3cml0ZSgpLCB0cnVuY2F0ZSgpIGFuZCBjaG93bigpLgorCQkgKi8KKwkJaWYgKCFmYy0+aGFuZGxlX2tpbGxwcml2KSB7CisJCQlpbnQga2lsbDsKKworCQkJLyoKKwkJCSAqIGlhX21vZGUgY2FsY3VsYXRpb24gbWF5IGhhdmUgdXNlZCBzdGFsZSBpX21vZGUuCisJCQkgKiBSZWZyZXNoIGFuZCByZWNhbGN1bGF0ZS4KKwkJCSAqLworCQkJcmV0ID0gZnVzZV9kb19nZXRhdHRyKGlub2RlLCBOVUxMLCBmaWxlKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKworCQkJYXR0ci0+aWFfbW9kZSA9IGlub2RlLT5pX21vZGU7CisJCQlraWxsID0gc2hvdWxkX3JlbW92ZV9zdWlkKGVudHJ5KTsKKwkJCWlmIChraWxsICYgQVRUUl9LSUxMX1NVSUQpIHsKKwkJCQlhdHRyLT5pYV92YWxpZCB8PSBBVFRSX01PREU7CisJCQkJYXR0ci0+aWFfbW9kZSAmPSB+U19JU1VJRDsKKwkJCX0KKwkJCWlmIChraWxsICYgQVRUUl9LSUxMX1NHSUQpIHsKKwkJCQlhdHRyLT5pYV92YWxpZCB8PSBBVFRSX01PREU7CisJCQkJYXR0ci0+aWFfbW9kZSAmPSB+U19JU0dJRDsKKwkJCX0KKwkJfQorCX0KKwlpZiAoIWF0dHItPmlhX3ZhbGlkKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGZ1c2VfZG9fc2V0YXR0cihpbm9kZSwgYXR0ciwgZmlsZSk7CisJaWYgKCFyZXQpIHsKKwkJLyoKKwkJICogSWYgZmlsZXN5c3RlbSBzdXBwb3J0cyBhY2xzIGl0IG1heSBoYXZlIHVwZGF0ZWQgYWNsIHhhdHRycyBpbgorCQkgKiB0aGUgZmlsZXN5c3RlbSwgc28gZm9yZ2V0IGNhY2hlZCBhY2xzIGZvciB0aGUgaW5vZGUuCisJCSAqLworCQlpZiAoZmMtPnBvc2l4X2FjbCkKKwkJCWZvcmdldF9hbGxfY2FjaGVkX2FjbHMoaW5vZGUpOworCisJCS8qIERpcmVjdG9yeSBtb2RlIGNoYW5nZWQsIG1heSBuZWVkIHRvIHJldmFsaWRhdGUgYWNjZXNzICovCisJCWlmIChkX2lzX2RpcihlbnRyeSkgJiYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NT0RFKSkKKwkJCWZ1c2VfaW52YWxpZGF0ZV9lbnRyeV9jYWNoZShlbnRyeSk7CisJfQorCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZnVzZV9nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICplbnRyeSwKQEAgLTE3MjQsMTUyICsxNzg2LDYgQEAKIAlyZXR1cm4gZnVzZV91cGRhdGVfYXR0cmlidXRlcyhpbm9kZSwgc3RhdCwgTlVMTCwgTlVMTCk7CiB9CiAKLXN0YXRpYyBpbnQgZnVzZV9zZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICp1bnVzZWQsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsdWUsCi0JCQkgc2l6ZV90IHNpemUsIGludCBmbGFncykKLXsKLQlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOwotCUZVU0VfQVJHUyhhcmdzKTsKLQlzdHJ1Y3QgZnVzZV9zZXR4YXR0cl9pbiBpbmFyZzsKLQlpbnQgZXJyOwotCi0JaWYgKGZjLT5ub19zZXR4YXR0cikKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JbWVtc2V0KCZpbmFyZywgMCwgc2l6ZW9mKGluYXJnKSk7Ci0JaW5hcmcuc2l6ZSA9IHNpemU7Ci0JaW5hcmcuZmxhZ3MgPSBmbGFnczsKLQlhcmdzLmluLmgub3Bjb2RlID0gRlVTRV9TRVRYQVRUUjsKLQlhcmdzLmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoaW5vZGUpOwotCWFyZ3MuaW4ubnVtYXJncyA9IDM7Ci0JYXJncy5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2YoaW5hcmcpOwotCWFyZ3MuaW4uYXJnc1swXS52YWx1ZSA9ICZpbmFyZzsKLQlhcmdzLmluLmFyZ3NbMV0uc2l6ZSA9IHN0cmxlbihuYW1lKSArIDE7Ci0JYXJncy5pbi5hcmdzWzFdLnZhbHVlID0gbmFtZTsKLQlhcmdzLmluLmFyZ3NbMl0uc2l6ZSA9IHNpemU7Ci0JYXJncy5pbi5hcmdzWzJdLnZhbHVlID0gdmFsdWU7Ci0JZXJyID0gZnVzZV9zaW1wbGVfcmVxdWVzdChmYywgJmFyZ3MpOwotCWlmIChlcnIgPT0gLUVOT1NZUykgewotCQlmYy0+bm9fc2V0eGF0dHIgPSAxOwotCQllcnIgPSAtRU9QTk9UU1VQUDsKLQl9Ci0JaWYgKCFlcnIpIHsKLQkJZnVzZV9pbnZhbGlkYXRlX2F0dHIoaW5vZGUpOwotCQlmdXNlX3VwZGF0ZV9jdGltZShpbm9kZSk7Ci0JfQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGZ1c2VfZ2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSkKLXsKLQlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOwotCUZVU0VfQVJHUyhhcmdzKTsKLQlzdHJ1Y3QgZnVzZV9nZXR4YXR0cl9pbiBpbmFyZzsKLQlzdHJ1Y3QgZnVzZV9nZXR4YXR0cl9vdXQgb3V0YXJnOwotCXNzaXplX3QgcmV0OwotCi0JaWYgKGZjLT5ub19nZXR4YXR0cikKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JbWVtc2V0KCZpbmFyZywgMCwgc2l6ZW9mKGluYXJnKSk7Ci0JaW5hcmcuc2l6ZSA9IHNpemU7Ci0JYXJncy5pbi5oLm9wY29kZSA9IEZVU0VfR0VUWEFUVFI7Ci0JYXJncy5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKLQlhcmdzLmluLm51bWFyZ3MgPSAyOwotCWFyZ3MuaW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKGluYXJnKTsKLQlhcmdzLmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7Ci0JYXJncy5pbi5hcmdzWzFdLnNpemUgPSBzdHJsZW4obmFtZSkgKyAxOwotCWFyZ3MuaW4uYXJnc1sxXS52YWx1ZSA9IG5hbWU7Ci0JLyogVGhpcyBpcyByZWFsbHkgdHdvIGRpZmZlcmVudCBvcGVyYXRpb25zIHJvbGxlZCBpbnRvIG9uZSAqLwotCWFyZ3Mub3V0Lm51bWFyZ3MgPSAxOwotCWlmIChzaXplKSB7Ci0JCWFyZ3Mub3V0LmFyZ3ZhciA9IDE7Ci0JCWFyZ3Mub3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemU7Ci0JCWFyZ3Mub3V0LmFyZ3NbMF0udmFsdWUgPSB2YWx1ZTsKLQl9IGVsc2UgewotCQlhcmdzLm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2Yob3V0YXJnKTsKLQkJYXJncy5vdXQuYXJnc1swXS52YWx1ZSA9ICZvdXRhcmc7Ci0JfQotCXJldCA9IGZ1c2Vfc2ltcGxlX3JlcXVlc3QoZmMsICZhcmdzKTsKLQlpZiAoIXJldCAmJiAhc2l6ZSkKLQkJcmV0ID0gb3V0YXJnLnNpemU7Ci0JaWYgKHJldCA9PSAtRU5PU1lTKSB7Ci0JCWZjLT5ub19nZXR4YXR0ciA9IDE7Ci0JCXJldCA9IC1FT1BOT1RTVVBQOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCBmdXNlX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICplbnRyeSwgY2hhciAqbGlzdCwgc2l6ZV90IHNpemUpCi17Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGRfaW5vZGUoZW50cnkpOwotCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7Ci0JRlVTRV9BUkdTKGFyZ3MpOwotCXN0cnVjdCBmdXNlX2dldHhhdHRyX2luIGluYXJnOwotCXN0cnVjdCBmdXNlX2dldHhhdHRyX291dCBvdXRhcmc7Ci0Jc3NpemVfdCByZXQ7Ci0KLQlpZiAoIWZ1c2VfYWxsb3dfY3VycmVudF9wcm9jZXNzKGZjKSkKLQkJcmV0dXJuIC1FQUNDRVM7Ci0KLQlpZiAoZmMtPm5vX2xpc3R4YXR0cikKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JbWVtc2V0KCZpbmFyZywgMCwgc2l6ZW9mKGluYXJnKSk7Ci0JaW5hcmcuc2l6ZSA9IHNpemU7Ci0JYXJncy5pbi5oLm9wY29kZSA9IEZVU0VfTElTVFhBVFRSOwotCWFyZ3MuaW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7Ci0JYXJncy5pbi5udW1hcmdzID0gMTsKLQlhcmdzLmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7Ci0JYXJncy5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOwotCS8qIFRoaXMgaXMgcmVhbGx5IHR3byBkaWZmZXJlbnQgb3BlcmF0aW9ucyByb2xsZWQgaW50byBvbmUgKi8KLQlhcmdzLm91dC5udW1hcmdzID0gMTsKLQlpZiAoc2l6ZSkgewotCQlhcmdzLm91dC5hcmd2YXIgPSAxOwotCQlhcmdzLm91dC5hcmdzWzBdLnNpemUgPSBzaXplOwotCQlhcmdzLm91dC5hcmdzWzBdLnZhbHVlID0gbGlzdDsKLQl9IGVsc2UgewotCQlhcmdzLm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2Yob3V0YXJnKTsKLQkJYXJncy5vdXQuYXJnc1swXS52YWx1ZSA9ICZvdXRhcmc7Ci0JfQotCXJldCA9IGZ1c2Vfc2ltcGxlX3JlcXVlc3QoZmMsICZhcmdzKTsKLQlpZiAoIXJldCAmJiAhc2l6ZSkKLQkJcmV0ID0gb3V0YXJnLnNpemU7Ci0JaWYgKHJldCA9PSAtRU5PU1lTKSB7Ci0JCWZjLT5ub19saXN0eGF0dHIgPSAxOwotCQlyZXQgPSAtRU9QTk9UU1VQUDsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBmdXNlX3JlbW92ZXhhdHRyKHN0cnVjdCBkZW50cnkgKmVudHJ5LCBjb25zdCBjaGFyICpuYW1lKQotewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkX2lub2RlKGVudHJ5KTsKLQlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOwotCUZVU0VfQVJHUyhhcmdzKTsKLQlpbnQgZXJyOwotCi0JaWYgKGZjLT5ub19yZW1vdmV4YXR0cikKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JYXJncy5pbi5oLm9wY29kZSA9IEZVU0VfUkVNT1ZFWEFUVFI7Ci0JYXJncy5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKLQlhcmdzLmluLm51bWFyZ3MgPSAxOwotCWFyZ3MuaW4uYXJnc1swXS5zaXplID0gc3RybGVuKG5hbWUpICsgMTsKLQlhcmdzLmluLmFyZ3NbMF0udmFsdWUgPSBuYW1lOwotCWVyciA9IGZ1c2Vfc2ltcGxlX3JlcXVlc3QoZmMsICZhcmdzKTsKLQlpZiAoZXJyID09IC1FTk9TWVMpIHsKLQkJZmMtPm5vX3JlbW92ZXhhdHRyID0gMTsKLQkJZXJyID0gLUVPUE5PVFNVUFA7Ci0JfQotCWlmICghZXJyKSB7Ci0JCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKGlub2RlKTsKLQkJZnVzZV91cGRhdGVfY3RpbWUoaW5vZGUpOwotCX0KLQlyZXR1cm4gZXJyOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZnVzZV9kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKIAkubG9va3VwCQk9IGZ1c2VfbG9va3VwLAogCS5ta2RpcgkJPSBmdXNlX21rZGlyLApAQCAtMTg4NCwxMCArMTgwMCwxMiBAQAogCS5ta25vZAkJPSBmdXNlX21rbm9kLAogCS5wZXJtaXNzaW9uCT0gZnVzZV9wZXJtaXNzaW9uLAogCS5nZXRhdHRyCT0gZnVzZV9nZXRhdHRyLAotCS5zZXR4YXR0cgk9IGZ1c2Vfc2V0eGF0dHIsCi0JLmdldHhhdHRyCT0gZnVzZV9nZXR4YXR0ciwKKwkuc2V0eGF0dHIJPSBnZW5lcmljX3NldHhhdHRyLAorCS5nZXR4YXR0cgk9IGdlbmVyaWNfZ2V0eGF0dHIsCiAJLmxpc3R4YXR0cgk9IGZ1c2VfbGlzdHhhdHRyLAotCS5yZW1vdmV4YXR0cgk9IGZ1c2VfcmVtb3ZleGF0dHIsCisJLnJlbW92ZXhhdHRyCT0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKKwkuZ2V0X2FjbAk9IGZ1c2VfZ2V0X2FjbCwKKwkuc2V0X2FjbAk9IGZ1c2Vfc2V0X2FjbCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1c2VfZGlyX29wZXJhdGlvbnMgPSB7CkBAIC0xOTA1LDEwICsxODIzLDEyIEBACiAJLnNldGF0dHIJPSBmdXNlX3NldGF0dHIsCiAJLnBlcm1pc3Npb24JPSBmdXNlX3Blcm1pc3Npb24sCiAJLmdldGF0dHIJPSBmdXNlX2dldGF0dHIsCi0JLnNldHhhdHRyCT0gZnVzZV9zZXR4YXR0ciwKLQkuZ2V0eGF0dHIJPSBmdXNlX2dldHhhdHRyLAorCS5zZXR4YXR0cgk9IGdlbmVyaWNfc2V0eGF0dHIsCisJLmdldHhhdHRyCT0gZ2VuZXJpY19nZXR4YXR0ciwKIAkubGlzdHhhdHRyCT0gZnVzZV9saXN0eGF0dHIsCi0JLnJlbW92ZXhhdHRyCT0gZnVzZV9yZW1vdmV4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAorCS5nZXRfYWNsCT0gZnVzZV9nZXRfYWNsLAorCS5zZXRfYWNsCT0gZnVzZV9zZXRfYWNsLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGZ1c2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zID0gewpAQCAtMTkxNiwxMCArMTgzNiwxMCBAQAogCS5nZXRfbGluawk9IGZ1c2VfZ2V0X2xpbmssCiAJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKIAkuZ2V0YXR0cgk9IGZ1c2VfZ2V0YXR0ciwKLQkuc2V0eGF0dHIJPSBmdXNlX3NldHhhdHRyLAotCS5nZXR4YXR0cgk9IGZ1c2VfZ2V0eGF0dHIsCisJLnNldHhhdHRyCT0gZ2VuZXJpY19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIJPSBnZW5lcmljX2dldHhhdHRyLAogCS5saXN0eGF0dHIJPSBmdXNlX2xpc3R4YXR0ciwKLQkucmVtb3ZleGF0dHIJPSBmdXNlX3JlbW92ZXhhdHRyLAorCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCiB9OwogCiB2b2lkIGZ1c2VfaW5pdF9jb21tb24oc3RydWN0IGlub2RlICppbm9kZSkKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZmlsZS5jIGIvZnMvZnVzZS9maWxlLmMKaW5kZXggZjM5NGFmZi4uYjdiZWI2NyAxMDA2NDQKLS0tIGEvZnMvZnVzZS9maWxlLmMKKysrIGIvZnMvZnVzZS9maWxlLmMKQEAgLTUzMCwxMyArNTMwLDEzIEBACiAJcmVxLT5vdXQuYXJnc1swXS5zaXplID0gY291bnQ7CiB9CiAKLXN0YXRpYyB2b2lkIGZ1c2VfcmVsZWFzZV91c2VyX3BhZ2VzKHN0cnVjdCBmdXNlX3JlcSAqcmVxLCBpbnQgd3JpdGUpCitzdGF0aWMgdm9pZCBmdXNlX3JlbGVhc2VfdXNlcl9wYWdlcyhzdHJ1Y3QgZnVzZV9yZXEgKnJlcSwgYm9vbCBzaG91bGRfZGlydHkpCiB7CiAJdW5zaWduZWQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCByZXEtPm51bV9wYWdlczsgaSsrKSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlID0gcmVxLT5wYWdlc1tpXTsKLQkJaWYgKHdyaXRlKQorCQlpZiAoc2hvdWxkX2RpcnR5KQogCQkJc2V0X3BhZ2VfZGlydHlfbG9jayhwYWdlKTsKIAkJcHV0X3BhZ2UocGFnZSk7CiAJfQpAQCAtMTMyMCw2ICsxMzIwLDcgQEAKIAkJICAgICAgIGxvZmZfdCAqcHBvcywgaW50IGZsYWdzKQogewogCWludCB3cml0ZSA9IGZsYWdzICYgRlVTRV9ESU9fV1JJVEU7CisJYm9vbCBzaG91bGRfZGlydHkgPSAhd3JpdGUgJiYgaXRlcl9pc19pb3ZlYyhpdGVyKTsKIAlpbnQgY3VzZSA9IGZsYWdzICYgRlVTRV9ESU9fQ1VTRTsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvLT5maWxlOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CkBAIC0xMzYzLDcgKzEzNjQsNyBAQAogCQkJbnJlcyA9IGZ1c2Vfc2VuZF9yZWFkKHJlcSwgaW8sIHBvcywgbmJ5dGVzLCBvd25lcik7CiAKIAkJaWYgKCFpby0+YXN5bmMpCi0JCQlmdXNlX3JlbGVhc2VfdXNlcl9wYWdlcyhyZXEsICF3cml0ZSk7CisJCQlmdXNlX3JlbGVhc2VfdXNlcl9wYWdlcyhyZXEsIHNob3VsZF9kaXJ0eSk7CiAJCWlmIChyZXEtPm91dC5oLmVycm9yKSB7CiAJCQllcnIgPSByZXEtPm91dC5oLmVycm9yOwogCQkJYnJlYWs7CkBAIC0yMzI1LDQ5ICsyMzI2LDYgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgaW50IGZ1c2VfaW9jdGxfY29weV91c2VyKHN0cnVjdCBwYWdlICoqcGFnZXMsIHN0cnVjdCBpb3ZlYyAqaW92LAotCQkJdW5zaWduZWQgaW50IG5yX3NlZ3MsIHNpemVfdCBieXRlcywgYm9vbCB0b191c2VyKQotewotCXN0cnVjdCBpb3ZfaXRlciBpaTsKLQlpbnQgcGFnZV9pZHggPSAwOwotCi0JaWYgKCFieXRlcykKLQkJcmV0dXJuIDA7Ci0KLQlpb3ZfaXRlcl9pbml0KCZpaSwgdG9fdXNlciA/IFJFQUQgOiBXUklURSwgaW92LCBucl9zZWdzLCBieXRlcyk7Ci0KLQl3aGlsZSAoaW92X2l0ZXJfY291bnQoJmlpKSkgewotCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBhZ2VzW3BhZ2VfaWR4KytdOwotCQlzaXplX3QgdG9kbyA9IG1pbl90KHNpemVfdCwgUEFHRV9TSVpFLCBpb3ZfaXRlcl9jb3VudCgmaWkpKTsKLQkJdm9pZCAqa2FkZHI7Ci0KLQkJa2FkZHIgPSBrbWFwKHBhZ2UpOwotCi0JCXdoaWxlICh0b2RvKSB7Ci0JCQljaGFyIF9fdXNlciAqdWFkZHIgPSBpaS5pb3YtPmlvdl9iYXNlICsgaWkuaW92X29mZnNldDsKLQkJCXNpemVfdCBpb3ZfbGVuID0gaWkuaW92LT5pb3ZfbGVuIC0gaWkuaW92X29mZnNldDsKLQkJCXNpemVfdCBjb3B5ID0gbWluKHRvZG8sIGlvdl9sZW4pOwotCQkJc2l6ZV90IGxlZnQ7Ci0KLQkJCWlmICghdG9fdXNlcikKLQkJCQlsZWZ0ID0gY29weV9mcm9tX3VzZXIoa2FkZHIsIHVhZGRyLCBjb3B5KTsKLQkJCWVsc2UKLQkJCQlsZWZ0ID0gY29weV90b191c2VyKHVhZGRyLCBrYWRkciwgY29weSk7Ci0KLQkJCWlmICh1bmxpa2VseShsZWZ0KSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkJaW92X2l0ZXJfYWR2YW5jZSgmaWksIGNvcHkpOwotCQkJdG9kbyAtPSBjb3B5OwotCQkJa2FkZHIgKz0gY29weTsKLQkJfQotCi0JCWt1bm1hcChwYWdlKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogLyoKICAqIENVU0Ugc2VydmVycyBjb21waWxlZCBvbiAzMmJpdCBicm9rZSBvbiA2NGJpdCBrZXJuZWxzIGJlY2F1c2UgdGhlCiAgKiBBQkkgd2FzIGRlZmluZWQgdG8gYmUgJ3N0cnVjdCBpb3ZlYycgd2hpY2ggaXMgZGlmZmVyZW50IG9uIDMyYml0CkBAIC0yNTE5LDggKzI0NzcsOSBAQAogCXN0cnVjdCBpb3ZlYyAqaW92X3BhZ2UgPSBOVUxMOwogCXN0cnVjdCBpb3ZlYyAqaW5faW92ID0gTlVMTCwgKm91dF9pb3YgPSBOVUxMOwogCXVuc2lnbmVkIGludCBpbl9pb3ZzID0gMCwgb3V0X2lvdnMgPSAwLCBudW1fcGFnZXMgPSAwLCBtYXhfcGFnZXM7Ci0Jc2l6ZV90IGluX3NpemUsIG91dF9zaXplLCB0cmFuc2ZlcnJlZDsKLQlpbnQgZXJyOworCXNpemVfdCBpbl9zaXplLCBvdXRfc2l6ZSwgdHJhbnNmZXJyZWQsIGM7CisJaW50IGVyciwgaTsKKwlzdHJ1Y3QgaW92X2l0ZXIgaWk7CiAKICNpZiBCSVRTX1BFUl9MT05HID09IDMyCiAJaW5hcmcuZmxhZ3MgfD0gRlVTRV9JT0NUTF8zMkJJVDsKQEAgLTI2MDIsMTAgKzI1NjEsMTMgQEAKIAkJcmVxLT5pbi5hcmdzWzFdLnNpemUgPSBpbl9zaXplOwogCQlyZXEtPmluLmFyZ3BhZ2VzID0gMTsKIAotCQllcnIgPSBmdXNlX2lvY3RsX2NvcHlfdXNlcihwYWdlcywgaW5faW92LCBpbl9pb3ZzLCBpbl9zaXplLAotCQkJCQkgICBmYWxzZSk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIG91dDsKKwkJZXJyID0gLUVGQVVMVDsKKwkJaW92X2l0ZXJfaW5pdCgmaWksIFdSSVRFLCBpbl9pb3YsIGluX2lvdnMsIGluX3NpemUpOworCQlmb3IgKGkgPSAwOyBpb3ZfaXRlcl9jb3VudCgmaWkpICYmICFXQVJOX09OKGkgPj0gbnVtX3BhZ2VzKTsgaSsrKSB7CisJCQljID0gY29weV9wYWdlX2Zyb21faXRlcihwYWdlc1tpXSwgMCwgUEFHRV9TSVpFLCAmaWkpOworCQkJaWYgKGMgIT0gUEFHRV9TSVpFICYmIGlvdl9pdGVyX2NvdW50KCZpaSkpCisJCQkJZ290byBvdXQ7CisJCX0KIAl9CiAKIAlyZXEtPm91dC5udW1hcmdzID0gMjsKQEAgLTI2NzEsNyArMjYzMywxNCBAQAogCWlmICh0cmFuc2ZlcnJlZCA+IGluYXJnLm91dF9zaXplKQogCQlnb3RvIG91dDsKIAotCWVyciA9IGZ1c2VfaW9jdGxfY29weV91c2VyKHBhZ2VzLCBvdXRfaW92LCBvdXRfaW92cywgdHJhbnNmZXJyZWQsIHRydWUpOworCWVyciA9IC1FRkFVTFQ7CisJaW92X2l0ZXJfaW5pdCgmaWksIFJFQUQsIG91dF9pb3YsIG91dF9pb3ZzLCB0cmFuc2ZlcnJlZCk7CisJZm9yIChpID0gMDsgaW92X2l0ZXJfY291bnQoJmlpKSAmJiAhV0FSTl9PTihpID49IG51bV9wYWdlcyk7IGkrKykgeworCQljID0gY29weV9wYWdlX3RvX2l0ZXIocGFnZXNbaV0sIDAsIFBBR0VfU0laRSwgJmlpKTsKKwkJaWYgKGMgIT0gUEFHRV9TSVpFICYmIGlvdl9pdGVyX2NvdW50KCZpaSkpCisJCQlnb3RvIG91dDsKKwl9CisJZXJyID0gMDsKICBvdXQ6CiAJaWYgKHJlcSkKIAkJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZnVzZV9pLmggYi9mcy9mdXNlL2Z1c2VfaS5oCmluZGV4IGQ5OGQ4Y2MuLjI0YWRhNWQgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZnVzZV9pLmgKKysrIGIvZnMvZnVzZS9mdXNlX2kuaApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CisjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KIAogLyoqIE1heCBudW1iZXIgb2YgcGFnZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIHNpbmdsZSByZWFkIHJlcXVlc3QgKi8KICNkZWZpbmUgRlVTRV9NQVhfUEFHRVNfUEVSX1JFUSAzMgpAQCAtMzYsMTUgKzM3LDYgQEAKIC8qKiBOdW1iZXIgb2YgZGVudHJpZXMgZm9yIGVhY2ggY29ubmVjdGlvbiBpbiB0aGUgY29udHJvbCBmaWxlc3lzdGVtICovCiAjZGVmaW5lIEZVU0VfQ1RMX05VTV9ERU5UUklFUyA1CiAKLS8qKiBJZiB0aGUgRlVTRV9ERUZBVUxUX1BFUk1JU1NJT05TIGZsYWcgaXMgZ2l2ZW4sIHRoZSBmaWxlc3lzdGVtCi0gICAgbW9kdWxlIHdpbGwgY2hlY2sgcGVybWlzc2lvbnMgYmFzZWQgb24gdGhlIGZpbGUgbW9kZS4gIE90aGVyd2lzZSBubwotICAgIHBlcm1pc3Npb24gY2hlY2tpbmcgaXMgZG9uZSBpbiB0aGUga2VybmVsICovCi0jZGVmaW5lIEZVU0VfREVGQVVMVF9QRVJNSVNTSU9OUyAoMSA8PCAwKQotCi0vKiogSWYgdGhlIEZVU0VfQUxMT1dfT1RIRVIgZmxhZyBpcyBnaXZlbiwgdGhlbiBub3Qgb25seSB0aGUgdXNlcgotICAgIGRvaW5nIHRoZSBtb3VudCB3aWxsIGJlIGFsbG93ZWQgdG8gYWNjZXNzIHRoZSBmaWxlc3lzdGVtICovCi0jZGVmaW5lIEZVU0VfQUxMT1dfT1RIRVIgICAgICAgICAoMSA8PCAxKQotCiAvKiogTnVtYmVyIG9mIHBhZ2UgcG9pbnRlcnMgZW1iZWRkZWQgaW4gZnVzZV9yZXEgKi8KICNkZWZpbmUgRlVTRV9SRVFfSU5MSU5FX1BBR0VTIDEKIApAQCAtNDY5LDkgKzQ2MSw2IEBACiAJLyoqIFRoZSBncm91cCBpZCBmb3IgdGhpcyBtb3VudCAqLwogCWtnaWRfdCBncm91cF9pZDsKIAotCS8qKiBUaGUgZnVzZSBtb3VudCBmbGFncyBmb3IgdGhpcyBtb3VudCAqLwotCXVuc2lnbmVkIGZsYWdzOwotCiAJLyoqIE1heGltdW0gcmVhZCBzaXplICovCiAJdW5zaWduZWQgbWF4X3JlYWQ7CiAKQEAgLTU0Nyw2ICs1MzYsOSBAQAogCS8qKiBhbGxvdyBwYXJhbGxlbCBsb29rdXBzIGFuZCByZWFkZGlyIChkZWZhdWx0IGlzIHNlcmlhbGl6ZWQpICovCiAJdW5zaWduZWQgcGFyYWxsZWxfZGlyb3BzOjE7CiAKKwkvKiogaGFuZGxlIGZzIGhhbmRsZXMga2lsbGluZyBzdWlkL3NnaWQvY2FwIG9uIHdyaXRlL2Nob3duL3RydW5jICovCisJdW5zaWduZWQgaGFuZGxlX2tpbGxwcml2OjE7CisKIAkvKgogCSAqIFRoZSBmb2xsb3dpbmcgYml0ZmllbGRzIGFyZSBvbmx5IGZvciBvcHRpbWl6YXRpb24gcHVycG9zZXMKIAkgKiBhbmQgaGVuY2UgcmFjZXMgaW4gc2V0dGluZyB0aGVtIHdpbGwgbm90IGNhdXNlIG1hbGZ1bmN0aW9uCkBAIC02MjQsNiArNjE2LDE1IEBACiAJLyoqIElzIGxzZWVrIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KIAl1bnNpZ25lZCBub19sc2VlazoxOwogCisJLyoqIERvZXMgdGhlIGZpbGVzeXN0ZW0gc3VwcG9ydCBwb3NpeCBhY2xzPyAqLworCXVuc2lnbmVkIHBvc2l4X2FjbDoxOworCisJLyoqIENoZWNrIHBlcm1pc3Npb25zIGJhc2VkIG9uIHRoZSBmaWxlIG1vZGUgb3Igbm90PyAqLworCXVuc2lnbmVkIGRlZmF1bHRfcGVybWlzc2lvbnM6MTsKKworCS8qKiBBbGxvdyBvdGhlciB0aGFuIHRoZSBtb3VudGVyIHVzZXIgdG8gYWNjZXNzIHRoZSBmaWxlc3lzdGVtID8gKi8KKwl1bnNpZ25lZCBhbGxvd19vdGhlcjoxOworCiAJLyoqIFRoZSBudW1iZXIgb2YgcmVxdWVzdHMgd2FpdGluZyBmb3IgY29tcGxldGlvbiAqLwogCWF0b21pY190IG51bV93YWl0aW5nOwogCkBAIC05MDIsNiArOTAzLDggQEAKIAogdTY0IGZ1c2VfbG9ja19vd25lcl9pZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgZmxfb3duZXJfdCBpZCk7CiAKK3ZvaWQgZnVzZV91cGRhdGVfY3RpbWUoc3RydWN0IGlub2RlICppbm9kZSk7CisKIGludCBmdXNlX3VwZGF0ZV9hdHRyaWJ1dGVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBrc3RhdCAqc3RhdCwKIAkJCSAgIHN0cnVjdCBmaWxlICpmaWxlLCBib29sICpyZWZyZXNoZWQpOwogCkBAIC05NjYsNCArOTY5LDE3IEBACiB2b2lkIGZ1c2VfdW5sb2NrX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogdm9pZCBmdXNlX2xvY2tfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CiAKK2ludCBmdXNlX3NldHhhdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLAorCQkgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpOworc3NpemVfdCBmdXNlX2dldHhhdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnZhbHVlLAorCQkgICAgICBzaXplX3Qgc2l6ZSk7Citzc2l6ZV90IGZ1c2VfbGlzdHhhdHRyKHN0cnVjdCBkZW50cnkgKmVudHJ5LCBjaGFyICpsaXN0LCBzaXplX3Qgc2l6ZSk7CitpbnQgZnVzZV9yZW1vdmV4YXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqZnVzZV94YXR0cl9oYW5kbGVyc1tdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpmdXNlX2FjbF94YXR0cl9oYW5kbGVyc1tdOworCitzdHJ1Y3QgcG9zaXhfYWNsOworc3RydWN0IHBvc2l4X2FjbCAqZnVzZV9nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKTsKK2ludCBmdXNlX3NldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBvc2l4X2FjbCAqYWNsLCBpbnQgdHlwZSk7CisKICNlbmRpZiAvKiBfRlNfRlVTRV9JX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvaW5vZGUuYyBiL2ZzL2Z1c2UvaW5vZGUuYwppbmRleCA0ZTA1YjUxLi4xNzE0MTA5IDEwMDY0NAotLS0gYS9mcy9mdXNlL2lub2RlLmMKKysrIGIvZnMvZnVzZS9pbm9kZS5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X2FjbC5oPgogCiBNT0RVTEVfQVVUSE9SKCJNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlIik7CkBAIC02Niw3ICs2Nyw4IEBACiAJdW5zaWduZWQgcm9vdG1vZGVfcHJlc2VudDoxOwogCXVuc2lnbmVkIHVzZXJfaWRfcHJlc2VudDoxOwogCXVuc2lnbmVkIGdyb3VwX2lkX3ByZXNlbnQ6MTsKLQl1bnNpZ25lZCBmbGFnczsKKwl1bnNpZ25lZCBkZWZhdWx0X3Blcm1pc3Npb25zOjE7CisJdW5zaWduZWQgYWxsb3dfb3RoZXI6MTsKIAl1bnNpZ25lZCBtYXhfcmVhZDsKIAl1bnNpZ25lZCBibGtzaXplOwogfTsKQEAgLTE5Miw3ICsxOTQsNyBAQAogCSAqIGNoZWNrIGluIG1heV9kZWxldGUoKS4KIAkgKi8KIAlmaS0+b3JpZ19pX21vZGUgPSBpbm9kZS0+aV9tb2RlOwotCWlmICghKGZjLT5mbGFncyAmIEZVU0VfREVGQVVMVF9QRVJNSVNTSU9OUykpCisJaWYgKCFmYy0+ZGVmYXVsdF9wZXJtaXNzaW9ucykKIAkJaW5vZGUtPmlfbW9kZSAmPSB+U19JU1ZUWDsKIAogCWZpLT5vcmlnX2lubyA9IGF0dHItPmlubzsKQEAgLTM0MCw2ICszNDIsNyBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAogCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKGlub2RlKTsKKwlmb3JnZXRfYWxsX2NhY2hlZF9hY2xzKGlub2RlKTsKIAlpZiAob2Zmc2V0ID49IDApIHsKIAkJcGdfc3RhcnQgPSBvZmZzZXQgPj4gUEFHRV9TSElGVDsKIAkJaWYgKGxlbiA8PSAwKQpAQCAtNTMyLDExICs1MzUsMTEgQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgT1BUX0RFRkFVTFRfUEVSTUlTU0lPTlM6Ci0JCQlkLT5mbGFncyB8PSBGVVNFX0RFRkFVTFRfUEVSTUlTU0lPTlM7CisJCQlkLT5kZWZhdWx0X3Blcm1pc3Npb25zID0gMTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgT1BUX0FMTE9XX09USEVSOgotCQkJZC0+ZmxhZ3MgfD0gRlVTRV9BTExPV19PVEhFUjsKKwkJCWQtPmFsbG93X290aGVyID0gMTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgT1BUX01BWF9SRUFEOgpAQCAtNTcwLDkgKzU3Myw5IEBACiAKIAlzZXFfcHJpbnRmKG0sICIsdXNlcl9pZD0ldSIsIGZyb21fa3VpZF9tdW5nZWQoJmluaXRfdXNlcl9ucywgZmMtPnVzZXJfaWQpKTsKIAlzZXFfcHJpbnRmKG0sICIsZ3JvdXBfaWQ9JXUiLCBmcm9tX2tnaWRfbXVuZ2VkKCZpbml0X3VzZXJfbnMsIGZjLT5ncm91cF9pZCkpOwotCWlmIChmYy0+ZmxhZ3MgJiBGVVNFX0RFRkFVTFRfUEVSTUlTU0lPTlMpCisJaWYgKGZjLT5kZWZhdWx0X3Blcm1pc3Npb25zKQogCQlzZXFfcHV0cyhtLCAiLGRlZmF1bHRfcGVybWlzc2lvbnMiKTsKLQlpZiAoZmMtPmZsYWdzICYgRlVTRV9BTExPV19PVEhFUikKKwlpZiAoZmMtPmFsbG93X290aGVyKQogCQlzZXFfcHV0cyhtLCAiLGFsbG93X290aGVyIik7CiAJaWYgKGZjLT5tYXhfcmVhZCAhPSB+MCkKIAkJc2VxX3ByaW50ZihtLCAiLG1heF9yZWFkPSV1IiwgZmMtPm1heF9yZWFkKTsKQEAgLTkxMCw4ICs5MTMsMTUgQEAKIAkJCQlmYy0+d3JpdGViYWNrX2NhY2hlID0gMTsKIAkJCWlmIChhcmctPmZsYWdzICYgRlVTRV9QQVJBTExFTF9ESVJPUFMpCiAJCQkJZmMtPnBhcmFsbGVsX2Rpcm9wcyA9IDE7CisJCQlpZiAoYXJnLT5mbGFncyAmIEZVU0VfSEFORExFX0tJTExQUklWKQorCQkJCWZjLT5oYW5kbGVfa2lsbHByaXYgPSAxOwogCQkJaWYgKGFyZy0+dGltZV9ncmFuICYmIGFyZy0+dGltZV9ncmFuIDw9IDEwMDAwMDAwMDApCiAJCQkJZmMtPnNiLT5zX3RpbWVfZ3JhbiA9IGFyZy0+dGltZV9ncmFuOworCQkJaWYgKChhcmctPmZsYWdzICYgRlVTRV9QT1NJWF9BQ0wpKSB7CisJCQkJZmMtPmRlZmF1bHRfcGVybWlzc2lvbnMgPSAxOworCQkJCWZjLT5wb3NpeF9hY2wgPSAxOworCQkJCWZjLT5zYi0+c194YXR0ciA9IGZ1c2VfYWNsX3hhdHRyX2hhbmRsZXJzOworCQkJfQogCQl9IGVsc2UgewogCQkJcmFfcGFnZXMgPSBmYy0+bWF4X3JlYWQgLyBQQUdFX1NJWkU7CiAJCQlmYy0+bm9fbG9jayA9IDE7CkBAIC05NDEsNyArOTUxLDcgQEAKIAkJRlVTRV9GTE9DS19MT0NLUyB8IEZVU0VfSEFTX0lPQ1RMX0RJUiB8IEZVU0VfQVVUT19JTlZBTF9EQVRBIHwKIAkJRlVTRV9ET19SRUFERElSUExVUyB8IEZVU0VfUkVBRERJUlBMVVNfQVVUTyB8IEZVU0VfQVNZTkNfRElPIHwKIAkJRlVTRV9XUklURUJBQ0tfQ0FDSEUgfCBGVVNFX05PX09QRU5fU1VQUE9SVCB8Ci0JCUZVU0VfUEFSQUxMRUxfRElST1BTOworCQlGVVNFX1BBUkFMTEVMX0RJUk9QUyB8IEZVU0VfSEFORExFX0tJTExQUklWIHwgRlVTRV9QT1NJWF9BQ0w7CiAJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfSU5JVDsKIAlyZXEtPmluLm51bWFyZ3MgPSAxOwogCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKCphcmcpOwpAQCAtMTA3MSw2ICsxMDgxLDcgQEAKIAl9CiAJc2ItPnNfbWFnaWMgPSBGVVNFX1NVUEVSX01BR0lDOwogCXNiLT5zX29wID0gJmZ1c2Vfc3VwZXJfb3BlcmF0aW9uczsKKwlzYi0+c194YXR0ciA9IGZ1c2VfeGF0dHJfaGFuZGxlcnM7CiAJc2ItPnNfbWF4Ynl0ZXMgPSBNQVhfTEZTX0ZJTEVTSVpFOwogCXNiLT5zX3RpbWVfZ3JhbiA9IDE7CiAJc2ItPnNfZXhwb3J0X29wID0gJmZ1c2VfZXhwb3J0X29wZXJhdGlvbnM7CkBAIC0xMTA5LDcgKzExMjAsOCBAQAogCQlmYy0+ZG9udF9tYXNrID0gMTsKIAlzYi0+c19mbGFncyB8PSBNU19QT1NJWEFDTDsKIAotCWZjLT5mbGFncyA9IGQuZmxhZ3M7CisJZmMtPmRlZmF1bHRfcGVybWlzc2lvbnMgPSBkLmRlZmF1bHRfcGVybWlzc2lvbnM7CisJZmMtPmFsbG93X290aGVyID0gZC5hbGxvd19vdGhlcjsKIAlmYy0+dXNlcl9pZCA9IGQudXNlcl9pZDsKIAlmYy0+Z3JvdXBfaWQgPSBkLmdyb3VwX2lkOwogCWZjLT5tYXhfcmVhZCA9IG1heF90KHVuc2lnbmVkLCA0MDk2LCBkLm1heF9yZWFkKTsKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UveGF0dHIuYyBiL2ZzL2Z1c2UveGF0dHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2FhYzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZnVzZS94YXR0ci5jCkBAIC0wLDAgKzEsMjExIEBACisvKgorICogRlVTRTogRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDE2ICBNaWtsb3MgU3plcmVkaSA8bWlrbG9zQHN6ZXJlZGkuaHU+CisgKgorICogVGhpcyBwcm9ncmFtIGNhbiBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwuCisgKiBTZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqLworCisjaW5jbHVkZSAiZnVzZV9pLmgiCisKKyNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X2FjbF94YXR0ci5oPgorCitpbnQgZnVzZV9zZXR4YXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICp2YWx1ZSwKKwkJICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CisJRlVTRV9BUkdTKGFyZ3MpOworCXN0cnVjdCBmdXNlX3NldHhhdHRyX2luIGluYXJnOworCWludCBlcnI7CisKKwlpZiAoZmMtPm5vX3NldHhhdHRyKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwltZW1zZXQoJmluYXJnLCAwLCBzaXplb2YoaW5hcmcpKTsKKwlpbmFyZy5zaXplID0gc2l6ZTsKKwlpbmFyZy5mbGFncyA9IGZsYWdzOworCWFyZ3MuaW4uaC5vcGNvZGUgPSBGVVNFX1NFVFhBVFRSOworCWFyZ3MuaW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7CisJYXJncy5pbi5udW1hcmdzID0gMzsKKwlhcmdzLmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7CisJYXJncy5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOworCWFyZ3MuaW4uYXJnc1sxXS5zaXplID0gc3RybGVuKG5hbWUpICsgMTsKKwlhcmdzLmluLmFyZ3NbMV0udmFsdWUgPSBuYW1lOworCWFyZ3MuaW4uYXJnc1syXS5zaXplID0gc2l6ZTsKKwlhcmdzLmluLmFyZ3NbMl0udmFsdWUgPSB2YWx1ZTsKKwllcnIgPSBmdXNlX3NpbXBsZV9yZXF1ZXN0KGZjLCAmYXJncyk7CisJaWYgKGVyciA9PSAtRU5PU1lTKSB7CisJCWZjLT5ub19zZXR4YXR0ciA9IDE7CisJCWVyciA9IC1FT1BOT1RTVVBQOworCX0KKwlpZiAoIWVycikgeworCQlmdXNlX2ludmFsaWRhdGVfYXR0cihpbm9kZSk7CisJCWZ1c2VfdXBkYXRlX2N0aW1lKGlub2RlKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3NpemVfdCBmdXNlX2dldHhhdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnZhbHVlLAorCQkgICAgICBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCUZVU0VfQVJHUyhhcmdzKTsKKwlzdHJ1Y3QgZnVzZV9nZXR4YXR0cl9pbiBpbmFyZzsKKwlzdHJ1Y3QgZnVzZV9nZXR4YXR0cl9vdXQgb3V0YXJnOworCXNzaXplX3QgcmV0OworCisJaWYgKGZjLT5ub19nZXR4YXR0cikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJbWVtc2V0KCZpbmFyZywgMCwgc2l6ZW9mKGluYXJnKSk7CisJaW5hcmcuc2l6ZSA9IHNpemU7CisJYXJncy5pbi5oLm9wY29kZSA9IEZVU0VfR0VUWEFUVFI7CisJYXJncy5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKKwlhcmdzLmluLm51bWFyZ3MgPSAyOworCWFyZ3MuaW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKGluYXJnKTsKKwlhcmdzLmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7CisJYXJncy5pbi5hcmdzWzFdLnNpemUgPSBzdHJsZW4obmFtZSkgKyAxOworCWFyZ3MuaW4uYXJnc1sxXS52YWx1ZSA9IG5hbWU7CisJLyogVGhpcyBpcyByZWFsbHkgdHdvIGRpZmZlcmVudCBvcGVyYXRpb25zIHJvbGxlZCBpbnRvIG9uZSAqLworCWFyZ3Mub3V0Lm51bWFyZ3MgPSAxOworCWlmIChzaXplKSB7CisJCWFyZ3Mub3V0LmFyZ3ZhciA9IDE7CisJCWFyZ3Mub3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemU7CisJCWFyZ3Mub3V0LmFyZ3NbMF0udmFsdWUgPSB2YWx1ZTsKKwl9IGVsc2UgeworCQlhcmdzLm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2Yob3V0YXJnKTsKKwkJYXJncy5vdXQuYXJnc1swXS52YWx1ZSA9ICZvdXRhcmc7CisJfQorCXJldCA9IGZ1c2Vfc2ltcGxlX3JlcXVlc3QoZmMsICZhcmdzKTsKKwlpZiAoIXJldCAmJiAhc2l6ZSkKKwkJcmV0ID0gbWluX3Qoc3NpemVfdCwgb3V0YXJnLnNpemUsIFhBVFRSX1NJWkVfTUFYKTsKKwlpZiAocmV0ID09IC1FTk9TWVMpIHsKKwkJZmMtPm5vX2dldHhhdHRyID0gMTsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZnVzZV92ZXJpZnlfeGF0dHJfbGlzdChjaGFyICpsaXN0LCBzaXplX3Qgc2l6ZSkKK3sKKwlzaXplX3Qgb3JpZ3NpemUgPSBzaXplOworCisJd2hpbGUgKHNpemUpIHsKKwkJc2l6ZV90IHRoaXNsZW4gPSBzdHJubGVuKGxpc3QsIHNpemUpOworCisJCWlmICghdGhpc2xlbiB8fCB0aGlzbGVuID09IHNpemUpCisJCQlyZXR1cm4gLUVJTzsKKworCQlzaXplIC09IHRoaXNsZW4gKyAxOworCQlsaXN0ICs9IHRoaXNsZW4gKyAxOworCX0KKworCXJldHVybiBvcmlnc2l6ZTsKK30KKworc3NpemVfdCBmdXNlX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICplbnRyeSwgY2hhciAqbGlzdCwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRfaW5vZGUoZW50cnkpOworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CisJRlVTRV9BUkdTKGFyZ3MpOworCXN0cnVjdCBmdXNlX2dldHhhdHRyX2luIGluYXJnOworCXN0cnVjdCBmdXNlX2dldHhhdHRyX291dCBvdXRhcmc7CisJc3NpemVfdCByZXQ7CisKKwlpZiAoIWZ1c2VfYWxsb3dfY3VycmVudF9wcm9jZXNzKGZjKSkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwlpZiAoZmMtPm5vX2xpc3R4YXR0cikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJbWVtc2V0KCZpbmFyZywgMCwgc2l6ZW9mKGluYXJnKSk7CisJaW5hcmcuc2l6ZSA9IHNpemU7CisJYXJncy5pbi5oLm9wY29kZSA9IEZVU0VfTElTVFhBVFRSOworCWFyZ3MuaW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7CisJYXJncy5pbi5udW1hcmdzID0gMTsKKwlhcmdzLmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7CisJYXJncy5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOworCS8qIFRoaXMgaXMgcmVhbGx5IHR3byBkaWZmZXJlbnQgb3BlcmF0aW9ucyByb2xsZWQgaW50byBvbmUgKi8KKwlhcmdzLm91dC5udW1hcmdzID0gMTsKKwlpZiAoc2l6ZSkgeworCQlhcmdzLm91dC5hcmd2YXIgPSAxOworCQlhcmdzLm91dC5hcmdzWzBdLnNpemUgPSBzaXplOworCQlhcmdzLm91dC5hcmdzWzBdLnZhbHVlID0gbGlzdDsKKwl9IGVsc2UgeworCQlhcmdzLm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2Yob3V0YXJnKTsKKwkJYXJncy5vdXQuYXJnc1swXS52YWx1ZSA9ICZvdXRhcmc7CisJfQorCXJldCA9IGZ1c2Vfc2ltcGxlX3JlcXVlc3QoZmMsICZhcmdzKTsKKwlpZiAoIXJldCAmJiAhc2l6ZSkKKwkJcmV0ID0gbWluX3Qoc3NpemVfdCwgb3V0YXJnLnNpemUsIFhBVFRSX0xJU1RfTUFYKTsKKwlpZiAocmV0ID4gMCAmJiBzaXplKQorCQlyZXQgPSBmdXNlX3ZlcmlmeV94YXR0cl9saXN0KGxpc3QsIHJldCk7CisJaWYgKHJldCA9PSAtRU5PU1lTKSB7CisJCWZjLT5ub19saXN0eGF0dHIgPSAxOworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworaW50IGZ1c2VfcmVtb3ZleGF0dHIoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCUZVU0VfQVJHUyhhcmdzKTsKKwlpbnQgZXJyOworCisJaWYgKGZjLT5ub19yZW1vdmV4YXR0cikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJYXJncy5pbi5oLm9wY29kZSA9IEZVU0VfUkVNT1ZFWEFUVFI7CisJYXJncy5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKKwlhcmdzLmluLm51bWFyZ3MgPSAxOworCWFyZ3MuaW4uYXJnc1swXS5zaXplID0gc3RybGVuKG5hbWUpICsgMTsKKwlhcmdzLmluLmFyZ3NbMF0udmFsdWUgPSBuYW1lOworCWVyciA9IGZ1c2Vfc2ltcGxlX3JlcXVlc3QoZmMsICZhcmdzKTsKKwlpZiAoZXJyID09IC1FTk9TWVMpIHsKKwkJZmMtPm5vX3JlbW92ZXhhdHRyID0gMTsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJfQorCWlmICghZXJyKSB7CisJCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKGlub2RlKTsKKwkJZnVzZV91cGRhdGVfY3RpbWUoaW5vZGUpOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGZ1c2VfeGF0dHJfZ2V0KGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpoYW5kbGVyLAorCQkJIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSBjb25zdCBjaGFyICpuYW1lLCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUpCit7CisJcmV0dXJuIGZ1c2VfZ2V0eGF0dHIoaW5vZGUsIG5hbWUsIHZhbHVlLCBzaXplKTsKK30KKworc3RhdGljIGludCBmdXNlX3hhdHRyX3NldChjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqaGFuZGxlciwKKwkJCSAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsCisJCQkgIGludCBmbGFncykKK3sKKwlpZiAoIXZhbHVlKQorCQlyZXR1cm4gZnVzZV9yZW1vdmV4YXR0cihpbm9kZSwgbmFtZSk7CisKKwlyZXR1cm4gZnVzZV9zZXR4YXR0cihpbm9kZSwgbmFtZSwgdmFsdWUsIHNpemUsIGZsYWdzKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyIGZ1c2VfeGF0dHJfaGFuZGxlciA9IHsKKwkucHJlZml4ID0gIiIsCisJLmdldCAgICA9IGZ1c2VfeGF0dHJfZ2V0LAorCS5zZXQgICAgPSBmdXNlX3hhdHRyX3NldCwKK307CisKK2NvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpmdXNlX3hhdHRyX2hhbmRsZXJzW10gPSB7CisJJmZ1c2VfeGF0dHJfaGFuZGxlciwKKwlOVUxMCit9OworCitjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqZnVzZV9hY2xfeGF0dHJfaGFuZGxlcnNbXSA9IHsKKwkmcG9zaXhfYWNsX2FjY2Vzc194YXR0cl9oYW5kbGVyLAorCSZwb3NpeF9hY2xfZGVmYXVsdF94YXR0cl9oYW5kbGVyLAorCSZmdXNlX3hhdHRyX2hhbmRsZXIsCisJTlVMTAorfTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvYW9wcy5jIGIvZnMvZ2ZzMi9hb3BzLmMKaW5kZXggODJkZjM2OC4uNWE2ZjUyZSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9hb3BzLmMKKysrIGIvZnMvZ2ZzMi9hb3BzLmMKQEAgLTE4Nyw3ICsxODcsNyBAQAogCQlDbGVhclBhZ2VDaGVja2VkKHBhZ2UpOwogCQlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpIHsKIAkJCWNyZWF0ZV9lbXB0eV9idWZmZXJzKHBhZ2UsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSwKLQkJCQkJICAgICAoMSA8PCBCSF9EaXJ0eSl8KDEgPDwgQkhfVXB0b2RhdGUpKTsKKwkJCQkJICAgICBCSVQoQkhfRGlydHkpfEJJVChCSF9VcHRvZGF0ZSkpOwogCQl9CiAJCWdmczJfcGFnZV9hZGRfZGF0YWJ1ZnMoaXAsIHBhZ2UsIDAsIHNkcC0+c2RfdmZzLT5zX2Jsb2Nrc2l6ZS0xKTsKIAl9CkBAIC0xMTQ3LDYgKzExNDcsMTYgQEAKIAlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpCiAJCXJldHVybiAwOwogCisJLyoKKwkgKiBGcm9tIHhmc192bV9yZWxlYXNlcGFnZTogbW0gYWNjb21tb2RhdGVzIGFuIG9sZCBleHQzIGNhc2Ugd2hlcmUKKwkgKiBjbGVhbiBwYWdlcyBtaWdodCBub3QgaGF2ZSBoYWQgdGhlIGRpcnR5IGJpdCBjbGVhcmVkLiAgVGh1cywgaXQgY2FuCisJICogc2VuZCBhY3R1YWwgZGlydHkgcGFnZXMgdG8gLT5yZWxlYXNlcGFnZSgpIHZpYSBzaHJpbmtfYWN0aXZlX2xpc3QoKS4KKwkgKgorCSAqIEFzIGEgd29ya2Fyb3VuZCwgd2Ugc2tpcCBwYWdlcyB0aGF0IGNvbnRhaW4gZGlydHkgYnVmZmVycyBiZWxvdy4KKwkgKiBPbmNlIC0+cmVsZWFzZXBhZ2UgaXNuJ3QgY2FsbGVkIG9uIGRpcnR5IHBhZ2VzIGFueW1vcmUsIHdlIGNhbiB3YXJuCisJICogb24gZGlydHkgYnVmZmVycyBsaWtlIHdlIHVzZWQgdG8gaGVyZSBhZ2Fpbi4KKwkgKi8KKwogCWdmczJfbG9nX2xvY2soc2RwKTsKIAlzcGluX2xvY2soJnNkcC0+c2RfYWlsX2xvY2spOwogCWhlYWQgPSBiaCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKQEAgLTExNTYsOCArMTE2Niw4IEBACiAJCWJkID0gYmgtPmJfcHJpdmF0ZTsKIAkJaWYgKGJkICYmIGJkLT5iZF90cikKIAkJCWdvdG8gY2Fubm90X3JlbGVhc2U7Ci0JCWlmIChidWZmZXJfcGlubmVkKGJoKSB8fCBidWZmZXJfZGlydHkoYmgpKQotCQkJZ290byBub3RfcG9zc2libGU7CisJCWlmIChidWZmZXJfZGlydHkoYmgpIHx8IFdBUk5fT04oYnVmZmVyX3Bpbm5lZChiaCkpKQorCQkJZ290byBjYW5ub3RfcmVsZWFzZTsKIAkJYmggPSBiaC0+Yl90aGlzX3BhZ2U7CiAJfSB3aGlsZShiaCAhPSBoZWFkKTsKIAlzcGluX3VubG9jaygmc2RwLT5zZF9haWxfbG9jayk7CkBAIC0xMTgwLDkgKzExOTAsNiBAQAogCiAJcmV0dXJuIHRyeV90b19mcmVlX2J1ZmZlcnMocGFnZSk7CiAKLW5vdF9wb3NzaWJsZTogLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLwotCVdBUk5fT04oYnVmZmVyX2RpcnR5KGJoKSk7Ci0JV0FSTl9PTihidWZmZXJfcGlubmVkKGJoKSk7CiBjYW5ub3RfcmVsZWFzZToKIAlzcGluX3VubG9jaygmc2RwLT5zZF9haWxfbG9jayk7CiAJZ2ZzMl9sb2dfdW5sb2NrKHNkcCk7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2JtYXAuYyBiL2ZzL2dmczIvYm1hcC5jCmluZGV4IDZlMmJlYzEuLjY0NTcyMWYgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvYm1hcC5jCisrKyBiL2ZzL2dmczIvYm1hcC5jCkBAIC04Miw4ICs4Miw4IEBACiAJfQogCiAJaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKQotCQljcmVhdGVfZW1wdHlfYnVmZmVycyhwYWdlLCAxIDw8IGlub2RlLT5pX2Jsa2JpdHMsCi0JCQkJICAgICAoMSA8PCBCSF9VcHRvZGF0ZSkpOworCQljcmVhdGVfZW1wdHlfYnVmZmVycyhwYWdlLCBCSVQoaW5vZGUtPmlfYmxrYml0cyksCisJCQkJICAgICBCSVQoQkhfVXB0b2RhdGUpKTsKIAogCWJoID0gcGFnZV9idWZmZXJzKHBhZ2UpOwogCkBAIC02OTAsNyArNjkwLDcgQEAKIAlCVUdfT04oIWRibG9jayk7CiAJQlVHX09OKCFuZXcpOwogCi0JYmguYl9zaXplID0gMSA8PCAoaW5vZGUtPmlfYmxrYml0cyArIChjcmVhdGUgPyAwIDogNSkpOworCWJoLmJfc2l6ZSA9IEJJVChpbm9kZS0+aV9ibGtiaXRzICsgKGNyZWF0ZSA/IDAgOiA1KSk7CiAJcmV0ID0gZ2ZzMl9ibG9ja19tYXAoaW5vZGUsIGxibG9jaywgJmJoLCBjcmVhdGUpOwogCSpleHRsZW4gPSBiaC5iX3NpemUgPj4gaW5vZGUtPmlfYmxrYml0czsKIAkqZGJsb2NrID0gYmguYl9ibG9ja25yOwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9kaXIuYyBiL2ZzL2dmczIvZGlyLmMKaW5kZXggZmNiNTliMi4uZGI4ZmJlYiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9kaXIuYworKysgYi9mcy9nZnMyL2Rpci5jCkBAIC0zNTEsNyArMzUxLDcgQEAKIAlpZiAoaGMpCiAJCXJldHVybiBoYzsKIAotCWhzaXplID0gMSA8PCBpcC0+aV9kZXB0aDsKKwloc2l6ZSA9IEJJVChpcC0+aV9kZXB0aCk7CiAJaHNpemUgKj0gc2l6ZW9mKF9fYmU2NCk7CiAJaWYgKGhzaXplICE9IGlfc2l6ZV9yZWFkKCZpcC0+aV9pbm9kZSkpIHsKIAkJZ2ZzMl9jb25zaXN0X2lub2RlKGlwKTsKQEAgLTgxOSw4ICs4MTksOCBAQAogCiAJaWYgKGlwLT5pX2Rpc2tmbGFncyAmIEdGUzJfRElGX0VYSEFTSCkgewogCQlzdHJ1Y3QgZ2ZzMl9sZWFmICpsZWFmOwotCQl1bnNpZ25lZCBoc2l6ZSA9IDEgPDwgaXAtPmlfZGVwdGg7Ci0JCXVuc2lnbmVkIGluZGV4OworCQl1bnNpZ25lZCBpbnQgaHNpemUgPSBCSVQoaXAtPmlfZGVwdGgpOworCQl1bnNpZ25lZCBpbnQgaW5kZXg7CiAJCXU2NCBsbjsKIAkJaWYgKGhzaXplICogc2l6ZW9mKHU2NCkgIT0gaV9zaXplX3JlYWQoaW5vZGUpKSB7CiAJCQlnZnMyX2NvbnNpc3RfaW5vZGUoaXApOwpAQCAtOTMyLDcgKzkzMiw3IEBACiAJCXJldHVybiAtRU5PU1BDOwogCWJuID0gYmgtPmJfYmxvY2tucjsKIAotCWdmczJfYXNzZXJ0KHNkcCwgZGlwLT5pX2VudHJpZXMgPCAoMSA8PCAxNikpOworCWdmczJfYXNzZXJ0KHNkcCwgZGlwLT5pX2VudHJpZXMgPCBCSVQoMTYpKTsKIAlsZWFmLT5sZl9lbnRyaWVzID0gY3B1X3RvX2JlMTYoZGlwLT5pX2VudHJpZXMpOwogCiAJLyogIENvcHkgZGlyZW50cyAgKi8KQEAgLTEwNDEsNyArMTA0MSw3IEBACiAJYm4gPSBuYmgtPmJfYmxvY2tucjsKIAogCS8qICBDb21wdXRlIHRoZSBzdGFydCBhbmQgbGVuIG9mIGxlYWYgcG9pbnRlcnMgaW4gdGhlIGhhc2ggdGFibGUuICAqLwotCWxlbiA9IDEgPDwgKGRpcC0+aV9kZXB0aCAtIGJlMTZfdG9fY3B1KG9sZWFmLT5sZl9kZXB0aCkpOworCWxlbiA9IEJJVChkaXAtPmlfZGVwdGggLSBiZTE2X3RvX2NwdShvbGVhZi0+bGZfZGVwdGgpKTsKIAloYWxmX2xlbiA9IGxlbiA+PiAxOwogCWlmICghaGFsZl9sZW4pIHsKIAkJcHJfd2FybigiaV9kZXB0aCAldSBsZl9kZXB0aCAldSBpbmRleCAldVxuIiwKQEAgLTExNjMsNyArMTE2Myw3IEBACiAJaW50IHg7CiAJaW50IGVycm9yID0gMDsKIAotCWhzaXplID0gMSA8PCBkaXAtPmlfZGVwdGg7CisJaHNpemUgPSBCSVQoZGlwLT5pX2RlcHRoKTsKIAloc2l6ZV9ieXRlcyA9IGhzaXplICogc2l6ZW9mKF9fYmU2NCk7CiAKIAloYyA9IGdmczJfZGlyX2dldF9oYXNoX3RhYmxlKGRpcCk7CkBAIC0xNTM5LDcgKzE1MzksNyBAQAogCWludCBlcnJvciA9IDA7CiAJdW5zaWduZWQgZGVwdGggPSAwOwogCi0JaHNpemUgPSAxIDw8IGRpcC0+aV9kZXB0aDsKKwloc2l6ZSA9IEJJVChkaXAtPmlfZGVwdGgpOwogCWhhc2ggPSBnZnMyX2Rpcl9vZmZzZXQyaGFzaChjdHgtPnBvcyk7CiAJaW5kZXggPSBoYXNoID4+ICgzMiAtIGRpcC0+aV9kZXB0aCk7CiAKQEAgLTE1NTgsNyArMTU1OCw3IEBACiAJCWlmIChlcnJvcikKIAkJCWJyZWFrOwogCi0JCWxlbiA9IDEgPDwgKGRpcC0+aV9kZXB0aCAtIGRlcHRoKTsKKwkJbGVuID0gQklUKGRpcC0+aV9kZXB0aCAtIGRlcHRoKTsKIAkJaW5kZXggPSAoaW5kZXggJiB+KGxlbiAtIDEpKSArIGxlbjsKIAl9CiAKQEAgLTIxMTMsNyArMjExMyw3IEBACiAJdTY0IGxlYWZfbm87CiAJaW50IGVycm9yID0gMCwgbGFzdDsKIAotCWhzaXplID0gMSA8PCBkaXAtPmlfZGVwdGg7CisJaHNpemUgPSBCSVQoZGlwLT5pX2RlcHRoKTsKIAogCWxwID0gZ2ZzMl9kaXJfZ2V0X2hhc2hfdGFibGUoZGlwKTsKIAlpZiAoSVNfRVJSKGxwKSkKQEAgLTIxMjYsNyArMjEyNiw3IEBACiAJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBvdXQ7CiAJCQlsZWFmID0gKHN0cnVjdCBnZnMyX2xlYWYgKiliaC0+Yl9kYXRhOwotCQkJbGVuID0gMSA8PCAoZGlwLT5pX2RlcHRoIC0gYmUxNl90b19jcHUobGVhZi0+bGZfZGVwdGgpKTsKKwkJCWxlbiA9IEJJVChkaXAtPmlfZGVwdGggLSBiZTE2X3RvX2NwdShsZWFmLT5sZl9kZXB0aCkpOwogCiAJCQluZXh0X2luZGV4ID0gKGluZGV4ICYgfihsZW4gLSAxKSkgKyBsZW47CiAJCQlsYXN0ID0gKChuZXh0X2luZGV4ID49IGhzaXplKSA/IDEgOiAwKTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvZmlsZS5jIGIvZnMvZ2ZzMi9maWxlLmMKaW5kZXggMzIwZTY1ZS4uMzYwMTg4ZiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9maWxlLmMKKysrIGIvZnMvZ2ZzMi9maWxlLmMKQEAgLTM5NSw5ICszOTUsNiBAQAogCiAJc2Jfc3RhcnRfcGFnZWZhdWx0KGlub2RlLT5pX3NiKTsKIAotCS8qIFVwZGF0ZSBmaWxlIHRpbWVzIGJlZm9yZSB0YWtpbmcgcGFnZSBsb2NrICovCi0JZmlsZV91cGRhdGVfdGltZSh2bWEtPnZtX2ZpbGUpOwotCiAJcmV0ID0gZ2ZzMl9yc3FhX2FsbG9jKGlwKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKQEAgLTQwOSw2ICs0MDYsOSBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0X3VuaW5pdDsKIAorCS8qIFVwZGF0ZSBmaWxlIHRpbWVzIGJlZm9yZSB0YWtpbmcgcGFnZSBsb2NrICovCisJZmlsZV91cGRhdGVfdGltZSh2bWEtPnZtX2ZpbGUpOworCiAJc2V0X2JpdChHTEZfRElSVFksICZpcC0+aV9nbC0+Z2xfZmxhZ3MpOwogCXNldF9iaXQoR0lGX1NXX1BBR0VELCAmaXAtPmlfZmxhZ3MpOwogCmRpZmYgLS1naXQgYS9mcy9nZnMyL2dsb2NrLmMgYi9mcy9nZnMyL2dsb2NrLmMKaW5kZXggM2E5MGIyYi4uMTRjYmY2MCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9nbG9jay5jCisrKyBiL2ZzL2dmczIvZ2xvY2suYwpAQCAtNjksNyArNjksNyBAQAogc3RhdGljIERFRklORV9TUElOTE9DSyhscnVfbG9jayk7CiAKICNkZWZpbmUgR0ZTMl9HTF9IQVNIX1NISUZUICAgICAgMTUKLSNkZWZpbmUgR0ZTMl9HTF9IQVNIX1NJWkUgICAgICAgKDEgPDwgR0ZTMl9HTF9IQVNIX1NISUZUKQorI2RlZmluZSBHRlMyX0dMX0hBU0hfU0laRSAgICAgICBCSVQoR0ZTMl9HTF9IQVNIX1NISUZUKQogCiBzdGF0aWMgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIGh0X3Bhcm1zID0gewogCS5uZWxlbV9oaW50ID0gR0ZTMl9HTF9IQVNIX1NJWkUgKiAzIC8gNCwKQEAgLTE3ODEsNyArMTc4MSwxMyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlyZWdpc3Rlcl9zaHJpbmtlcigmZ2xvY2tfc2hyaW5rZXIpOworCXJldCA9IHJlZ2lzdGVyX3Nocmlua2VyKCZnbG9ja19zaHJpbmtlcik7CisJaWYgKHJldCkgeworCQlkZXN0cm95X3dvcmtxdWV1ZShnZnMyX2RlbGV0ZV93b3JrcXVldWUpOworCQlkZXN0cm95X3dvcmtxdWV1ZShnbG9ja193b3JrcXVldWUpOworCQlyaGFzaHRhYmxlX2Rlc3Ryb3koJmdsX2hhc2hfdGFibGUpOworCQlyZXR1cm4gcmV0OworCX0KIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9pbm9kZS5jIGIvZnMvZ2ZzMi9pbm9kZS5jCmluZGV4IGU0ZGEwZWMuLmZiM2E4MTAgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvaW5vZGUuYworKysgYi9mcy9nZnMyL2lub2RlLmMKQEAgLTE4Nyw2ICsxODcsMTAgQEAKIAkJfQogCiAJCWdmczJfc2V0X2lvcChpbm9kZSk7CisKKwkJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gMDsKKwkJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IDA7CisKIAkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CiAJfQogCmRpZmYgLS1naXQgYS9mcy9nZnMyL2lub2RlLmggYi9mcy9nZnMyL2lub2RlLmgKaW5kZXggNzcxMGRmZC4uYWFjZThjZSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9pbm9kZS5oCisrKyBiL2ZzL2dmczIvaW5vZGUuaApAQCAtODUsNyArODUsNyBAQAogCXU2NCBzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwogCWlmIChzaXplIDwgbWluc2l6ZSB8fCBzaXplID4gbWF4c2l6ZSkKIAkJZ290byBlcnI7Ci0JaWYgKHNpemUgJiAoKDEgPDwgaW5vZGUtPmlfYmxrYml0cykgLSAxKSkKKwlpZiAoc2l6ZSAmIChCSVQoaW5vZGUtPmlfYmxrYml0cykgLSAxKSkKIAkJZ290byBlcnI7CiAJcmV0dXJuIDA7CiBlcnI6CmRpZmYgLS1naXQgYS9mcy9nZnMyL21haW4uYyBiL2ZzL2dmczIvbWFpbi5jCmluZGV4IDc0ZmQwMTMuLjY3ZDFmYzQgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvbWFpbi5jCisrKyBiL2ZzL2dmczIvbWFpbi5jCkBAIC0xNDUsNyArMTQ1LDkgQEAKIAlpZiAoIWdmczJfcWFkYXRhX2NhY2hlcCkKIAkJZ290byBmYWlsOwogCi0JcmVnaXN0ZXJfc2hyaW5rZXIoJmdmczJfcWRfc2hyaW5rZXIpOworCWVycm9yID0gcmVnaXN0ZXJfc2hyaW5rZXIoJmdmczJfcWRfc2hyaW5rZXIpOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsOwogCiAJZXJyb3IgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZnZnMyX2ZzX3R5cGUpOwogCWlmIChlcnJvcikKZGlmZiAtLWdpdCBhL2ZzL2dmczIvbWV0YV9pby5jIGIvZnMvZ2ZzMi9tZXRhX2lvLmMKaW5kZXggOTUwYjhiZS4uMzczNjM5YTUgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvbWV0YV9pby5jCisrKyBiL2ZzL2dmczIvbWV0YV9pby5jCkBAIC0yMTYsMjMgKzIxNiwyNiBAQAogc3RhdGljIHZvaWQgZ2ZzMl9zdWJtaXRfYmhzKGludCBvcCwgaW50IG9wX2ZsYWdzLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tdLAogCQkJICAgIGludCBudW0pCiB7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGJoc1swXTsKLQlzdHJ1Y3QgYmlvICpiaW87Ci0JaW50IGk7CisJd2hpbGUgKG51bSA+IDApIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9ICpiaHM7CisJCXN0cnVjdCBiaW8gKmJpbzsKIAotCWlmICghbnVtKQotCQlyZXR1cm47Ci0KLQliaW8gPSBiaW9fYWxsb2MoR0ZQX05PSU8sIG51bSk7Ci0JYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IGJoLT5iX2Jsb2NrbnIgKiAoYmgtPmJfc2l6ZSA+PiA5KTsKLQliaW8tPmJpX2JkZXYgPSBiaC0+Yl9iZGV2OwotCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewotCQliaCA9IGJoc1tpXTsKLQkJYmlvX2FkZF9wYWdlKGJpbywgYmgtPmJfcGFnZSwgYmgtPmJfc2l6ZSwgYmhfb2Zmc2V0KGJoKSk7CisJCWJpbyA9IGJpb19hbGxvYyhHRlBfTk9JTywgbnVtKTsKKwkJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IGJoLT5iX2Jsb2NrbnIgKiAoYmgtPmJfc2l6ZSA+PiA5KTsKKwkJYmlvLT5iaV9iZGV2ID0gYmgtPmJfYmRldjsKKwkJd2hpbGUgKG51bSA+IDApIHsKKwkJCWJoID0gKmJoczsKKwkJCWlmICghYmlvX2FkZF9wYWdlKGJpbywgYmgtPmJfcGFnZSwgYmgtPmJfc2l6ZSwgYmhfb2Zmc2V0KGJoKSkpIHsKKwkJCQlCVUdfT04oYmlvLT5iaV9pdGVyLmJpX3NpemUgPT0gMCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQliaHMrKzsKKwkJCW51bS0tOworCQl9CisJCWJpby0+YmlfZW5kX2lvID0gZ2ZzMl9tZXRhX3JlYWRfZW5kaW87CisJCWJpb19zZXRfb3BfYXR0cnMoYmlvLCBvcCwgb3BfZmxhZ3MpOworCQlzdWJtaXRfYmlvKGJpbyk7CiAJfQotCWJpby0+YmlfZW5kX2lvID0gZ2ZzMl9tZXRhX3JlYWRfZW5kaW87Ci0JYmlvX3NldF9vcF9hdHRycyhiaW8sIG9wLCBvcF9mbGFncyk7Ci0Jc3VibWl0X2JpbyhiaW8pOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX2ZzdHlwZS5jIGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKaW5kZXggZWYxZTE4Mi4uZmY3MmFjNiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKKysrIGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKQEAgLTU4LDcgKzU4LDcgQEAKIAlndC0+Z3RfcXVvdGFfc2NhbGVfbnVtID0gMTsKIAlndC0+Z3RfcXVvdGFfc2NhbGVfZGVuID0gMTsKIAlndC0+Z3RfbmV3X2ZpbGVzX2pkYXRhID0gMDsKLQlndC0+Z3RfbWF4X3JlYWRhaGVhZCA9IDEgPDwgMTg7CisJZ3QtPmd0X21heF9yZWFkYWhlYWQgPSBCSVQoMTgpOwogCWd0LT5ndF9jb21wbGFpbl9zZWNzID0gMTA7CiB9CiAKQEAgLTI4NCw3ICsyODQsNyBAQAogCiAJc2RwLT5zZF9mc2IyYmJfc2hpZnQgPSBzZHAtPnNkX3NiLnNiX2JzaXplX3NoaWZ0IC0KIAkJCSAgICAgICBHRlMyX0JBU0lDX0JMT0NLX1NISUZUOwotCXNkcC0+c2RfZnNiMmJiID0gMSA8PCBzZHAtPnNkX2ZzYjJiYl9zaGlmdDsKKwlzZHAtPnNkX2ZzYjJiYiA9IEJJVChzZHAtPnNkX2ZzYjJiYl9zaGlmdCk7CiAJc2RwLT5zZF9kaXB0cnMgPSAoc2RwLT5zZF9zYi5zYl9ic2l6ZSAtCiAJCQkgIHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpKSAvIHNpemVvZih1NjQpOwogCXNkcC0+c2RfaW5wdHJzID0gKHNkcC0+c2Rfc2Iuc2JfYnNpemUgLQpAQCAtMzAyLDcgKzMwMiw3IEBACiAKIAkvKiBDb21wdXRlIG1heGltdW0gcmVzZXJ2YXRpb24gcmVxdWlyZWQgdG8gYWRkIGEgZW50cnkgdG8gYSBkaXJlY3RvcnkgKi8KIAotCWhhc2hfYmxvY2tzID0gRElWX1JPVU5EX1VQKHNpemVvZih1NjQpICogKDEgPDwgR0ZTMl9ESVJfTUFYX0RFUFRIKSwKKwloYXNoX2Jsb2NrcyA9IERJVl9ST1VORF9VUChzaXplb2YodTY0KSAqIEJJVChHRlMyX0RJUl9NQVhfREVQVEgpLAogCQkJICAgICBzZHAtPnNkX2pic2l6ZSk7CiAKIAlpbmRfYmxvY2tzID0gMDsKQEAgLTEwODksNyArMTA4OSw3IEBACiAJc2RwLT5zZF9zYi5zYl9ic2l6ZV9zaGlmdCA9IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwogCXNkcC0+c2RfZnNiMmJiX3NoaWZ0ID0gc2RwLT5zZF9zYi5zYl9ic2l6ZV9zaGlmdCAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZTMl9CQVNJQ19CTE9DS19TSElGVDsKLQlzZHAtPnNkX2ZzYjJiYiA9IDEgPDwgc2RwLT5zZF9mc2IyYmJfc2hpZnQ7CisJc2RwLT5zZF9mc2IyYmIgPSBCSVQoc2RwLT5zZF9mc2IyYmJfc2hpZnQpOwogCiAJc2RwLT5zZF90dW5lLmd0X2xvZ2Rfc2VjcyA9IHNkcC0+c2RfYXJncy5hcl9jb21taXQ7CiAJc2RwLT5zZF90dW5lLmd0X3F1b3RhX3F1YW50dW0gPSBzZHAtPnNkX2FyZ3MuYXJfcXVvdGFfcXVhbnR1bTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvcXVvdGEuYyBiL2ZzL2dmczIvcXVvdGEuYwppbmRleCA3NzkzMGNhLi44YWYyZGZhIDEwMDY0NAotLS0gYS9mcy9nZnMyL3F1b3RhLmMKKysrIGIvZnMvZ2ZzMi9xdW90YS5jCkBAIC03NSw3ICs3NSw3IEBACiAjaW5jbHVkZSAidXRpbC5oIgogCiAjZGVmaW5lIEdGUzJfUURfSEFTSF9TSElGVCAgICAgIDEyCi0jZGVmaW5lIEdGUzJfUURfSEFTSF9TSVpFICAgICAgICgxIDw8IEdGUzJfUURfSEFTSF9TSElGVCkKKyNkZWZpbmUgR0ZTMl9RRF9IQVNIX1NJWkUgICAgICAgQklUKEdGUzJfUURfSEFTSF9TSElGVCkKICNkZWZpbmUgR0ZTMl9RRF9IQVNIX01BU0sgICAgICAgKEdGUzJfUURfSEFTSF9TSVpFIC0gMSkKIAogLyogTG9jayBvcmRlcjogcWRfbG9jayAtPiBidWNrZXQgbG9jayAtPiBxZC0+bG9ja3JlZi5sb2NrIC0+IGxydSBsb2NrICovCkBAIC0zODQsNyArMzg0LDcgQEAKIAlibG9jayA9IHFkLT5xZF9zbG90IC8gc2RwLT5zZF9xY19wZXJfYmxvY2s7CiAJb2Zmc2V0ID0gcWQtPnFkX3Nsb3QgJSBzZHAtPnNkX3FjX3Blcl9ibG9jazsKIAotCWJoX21hcC5iX3NpemUgPSAxIDw8IGlwLT5pX2lub2RlLmlfYmxrYml0czsKKwliaF9tYXAuYl9zaXplID0gQklUKGlwLT5pX2lub2RlLmlfYmxrYml0cyk7CiAJZXJyb3IgPSBnZnMyX2Jsb2NrX21hcCgmaXAtPmlfaW5vZGUsIGJsb2NrLCAmYmhfbWFwLCAwKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZmFpbDsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvc3VwZXIuYyBiL2ZzL2dmczIvc3VwZXIuYwppbmRleCAzYTdlNjBiLi5lM2VlMzg3IDEwMDY0NAotLS0gYS9mcy9nZnMyL3N1cGVyLmMKKysrIGIvZnMvZ2ZzMi9zdXBlci5jCkBAIC0zNTksNyArMzU5LDcgQEAKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoamQtPmpkX2lub2RlKTsKIAl1NjQgc2l6ZSA9IGlfc2l6ZV9yZWFkKGpkLT5qZF9pbm9kZSk7CiAKLQlpZiAoZ2ZzMl9jaGVja19pbnRlcm5hbF9maWxlX3NpemUoamQtPmpkX2lub2RlLCA4IDw8IDIwLCAxIDw8IDMwKSkKKwlpZiAoZ2ZzMl9jaGVja19pbnRlcm5hbF9maWxlX3NpemUoamQtPmpkX2lub2RlLCA4IDw8IDIwLCBCSVQoMzApKSkKIAkJcmV0dXJuIC1FSU87CiAKIAlqZC0+amRfYmxvY2tzID0gc2l6ZSA+PiBzZHAtPnNkX3NiLnNiX2JzaXplX3NoaWZ0OwpkaWZmIC0tZ2l0IGEvZnMvaW50ZXJuYWwuaCBiL2ZzL2ludGVybmFsLmgKaW5kZXggYmEwNzM3Ni4uODU5MTc4NiAxMDA2NDQKLS0tIGEvZnMvaW50ZXJuYWwuaAorKysgYi9mcy9pbnRlcm5hbC5oCkBAIC0xMiw2ICsxMiw3IEBACiBzdHJ1Y3Qgc3VwZXJfYmxvY2s7CiBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZTsKIHN0cnVjdCBpb21hcDsKK3N0cnVjdCBpb21hcF9vcHM7CiBzdHJ1Y3QgbGludXhfYmlucHJtOwogc3RydWN0IHBhdGg7CiBzdHJ1Y3QgbW91bnQ7CkBAIC0xNjQsMyArMTY1LDEzIEBACiBleHRlcm4gaW50IGRvX3Zmc19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLAogCQkgICAgdW5zaWduZWQgbG9uZyBhcmcpOwogZXh0ZXJuIGxvbmcgdmZzX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisKKy8qCisgKiBpb21hcCBzdXBwb3J0OgorICovCit0eXBlZGVmIGxvZmZfdCAoKmlvbWFwX2FjdG9yX3QpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBwb3MsIGxvZmZfdCBsZW4sCisJCXZvaWQgKmRhdGEsIHN0cnVjdCBpb21hcCAqaW9tYXApOworCitsb2ZmX3QgaW9tYXBfYXBwbHkoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHBvcywgbG9mZl90IGxlbmd0aCwKKwkJdW5zaWduZWQgZmxhZ3MsIHN0cnVjdCBpb21hcF9vcHMgKm9wcywgdm9pZCAqZGF0YSwKKwkJaW9tYXBfYWN0b3JfdCBhY3Rvcik7CmRpZmYgLS1naXQgYS9mcy9pb2N0bC5jIGIvZnMvaW9jdGwuYwppbmRleCAwZjU2ZGViLi5jNDE1NjY4IDEwMDY0NAotLS0gYS9mcy9pb2N0bC5jCisrKyBiL2ZzL2lvY3RsLmMKQEAgLTU2OCw3ICs1NjgsNyBAQAogCXJldHVybiB0aGF3X3N1cGVyKHNiKTsKIH0KIAotc3RhdGljIGxvbmcgaW9jdGxfZmlsZV9kZWR1cGVfcmFuZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IGlvY3RsX2ZpbGVfZGVkdXBlX3JhbmdlKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkIF9fdXNlciAqYXJnKQogewogCXN0cnVjdCBmaWxlX2RlZHVwZV9yYW5nZSBfX3VzZXIgKmFyZ3AgPSBhcmc7CiAJc3RydWN0IGZpbGVfZGVkdXBlX3JhbmdlICpzYW1lID0gTlVMTDsKQEAgLTU4Miw2ICs1ODIsMTAgQEAKIAl9CiAKIAlzaXplID0gb2Zmc2V0b2Yoc3RydWN0IGZpbGVfZGVkdXBlX3JhbmdlIF9fdXNlciwgaW5mb1tjb3VudF0pOworCWlmIChzaXplID4gUEFHRV9TSVpFKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KIAogCXNhbWUgPSBtZW1kdXBfdXNlcihhcmdwLCBzaXplKTsKIAlpZiAoSVNfRVJSKHNhbWUpKSB7CmRpZmYgLS1naXQgYS9mcy9pb21hcC5jIGIvZnMvaW9tYXAuYwppbmRleCA0ODE0MWI4Li4wMTNkMWQzIDEwMDY0NAotLS0gYS9mcy9pb21hcC5jCisrKyBiL2ZzL2lvbWFwLmMKQEAgLTI3LDkgKzI3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kYXguaD4KICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCi10eXBlZGVmIGxvZmZfdCAoKmlvbWFwX2FjdG9yX3QpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBwb3MsIGxvZmZfdCBsZW4sCi0JCXZvaWQgKmRhdGEsIHN0cnVjdCBpb21hcCAqaW9tYXApOwotCiAvKgogICogRXhlY3V0ZSBhIGlvbWFwIHdyaXRlIG9uIGEgc2VnbWVudCBvZiB0aGUgbWFwcGluZyB0aGF0IHNwYW5zIGEKICAqIGNvbnRpZ3VvdXMgcmFuZ2Ugb2YgcGFnZXMgdGhhdCBoYXZlIGlkZW50aWNhbCBibG9jayBtYXBwaW5nIHN0YXRlLgpAQCAtNDEsNyArMzgsNyBAQAogICogcmVzb3VyY2VzIHRoZXkgcmVxdWlyZSBpbiB0aGUgaW9tYXBfYmVnaW4gY2FsbCwgYW5kIHJlbGVhc2UgdGhlbSBpbiB0aGUKICAqIGlvbWFwX2VuZCBjYWxsLgogICovCi1zdGF0aWMgbG9mZl90Citsb2ZmX3QKIGlvbWFwX2FwcGx5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBwb3MsIGxvZmZfdCBsZW5ndGgsIHVuc2lnbmVkIGZsYWdzLAogCQlzdHJ1Y3QgaW9tYXBfb3BzICpvcHMsIHZvaWQgKmRhdGEsIGlvbWFwX2FjdG9yX3QgYWN0b3IpCiB7CkBAIC04NCw4ICs4MSwxMSBAQAogCSAqIE5vdyB0aGUgZGF0YSBoYXMgYmVlbiBjb3BpZWQsIGNvbW1pdCB0aGUgcmFuZ2Ugd2UndmUgY29waWVkLiAgVGhpcwogCSAqIHNob3VsZCBub3QgZmFpbCB1bmxlc3MgdGhlIGZpbGVzeXN0ZW0gaGFzIGhhZCBhIGZhdGFsIGVycm9yLgogCSAqLwotCXJldCA9IG9wcy0+aW9tYXBfZW5kKGlub2RlLCBwb3MsIGxlbmd0aCwgd3JpdHRlbiA+IDAgPyB3cml0dGVuIDogMCwKLQkJCWZsYWdzLCAmaW9tYXApOworCWlmIChvcHMtPmlvbWFwX2VuZCkgeworCQlyZXQgPSBvcHMtPmlvbWFwX2VuZChpbm9kZSwgcG9zLCBsZW5ndGgsCisJCQkJICAgICB3cml0dGVuID4gMCA/IHdyaXR0ZW4gOiAwLAorCQkJCSAgICAgZmxhZ3MsICZpb21hcCk7CisJfQogCiAJcmV0dXJuIHdyaXR0ZW4gPyB3cml0dGVuIDogcmV0OwogfQpAQCAtMTk0LDEyICsxOTQsOSBAQAogCQlpZiAobWFwcGluZ193cml0YWJseV9tYXBwZWQoaW5vZGUtPmlfbWFwcGluZykpCiAJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKIAotCQlwYWdlZmF1bHRfZGlzYWJsZSgpOwogCQljb3BpZWQgPSBpb3ZfaXRlcl9jb3B5X2Zyb21fdXNlcl9hdG9taWMocGFnZSwgaSwgb2Zmc2V0LCBieXRlcyk7Ci0JCXBhZ2VmYXVsdF9lbmFibGUoKTsKIAogCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKLQkJbWFya19wYWdlX2FjY2Vzc2VkKHBhZ2UpOwogCiAJCXN0YXR1cyA9IGlvbWFwX3dyaXRlX2VuZChpbm9kZSwgcG9zLCBieXRlcywgY29waWVkLCBwYWdlKTsKIAkJaWYgKHVubGlrZWx5KHN0YXR1cyA8IDApKQpAQCAtMjUyLDYgKzI0OSw4OCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoaW9tYXBfZmlsZV9idWZmZXJlZF93cml0ZSk7CiAKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqCitfX2lvbWFwX3JlYWRfcGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgb2Zmc2V0KQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCXBhZ2UgPSByZWFkX21hcHBpbmdfcGFnZShtYXBwaW5nLCBvZmZzZXQgPj4gUEFHRV9TSElGVCwgTlVMTCk7CisJaWYgKElTX0VSUihwYWdlKSkKKwkJcmV0dXJuIHBhZ2U7CisJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJcHV0X3BhZ2UocGFnZSk7CisJCXJldHVybiBFUlJfUFRSKC1FSU8pOworCX0KKwlyZXR1cm4gcGFnZTsKK30KKworc3RhdGljIGxvZmZfdAoraW9tYXBfZGlydHlfYWN0b3Ioc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHBvcywgbG9mZl90IGxlbmd0aCwgdm9pZCAqZGF0YSwKKwkJc3RydWN0IGlvbWFwICppb21hcCkKK3sKKwlsb25nIHN0YXR1cyA9IDA7CisJc3NpemVfdCB3cml0dGVuID0gMDsKKworCWRvIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UsICpycGFnZTsKKwkJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CS8qIE9mZnNldCBpbnRvIHBhZ2VjYWNoZSBwYWdlICovCisJCXVuc2lnbmVkIGxvbmcgYnl0ZXM7CS8qIEJ5dGVzIHRvIHdyaXRlIHRvIHBhZ2UgKi8KKworCQlvZmZzZXQgPSAocG9zICYgKFBBR0VfU0laRSAtIDEpKTsKKwkJYnl0ZXMgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBQQUdFX1NJWkUgLSBvZmZzZXQsIGxlbmd0aCk7CisKKwkJcnBhZ2UgPSBfX2lvbWFwX3JlYWRfcGFnZShpbm9kZSwgcG9zKTsKKwkJaWYgKElTX0VSUihycGFnZSkpCisJCQlyZXR1cm4gUFRSX0VSUihycGFnZSk7CisKKwkJc3RhdHVzID0gaW9tYXBfd3JpdGVfYmVnaW4oaW5vZGUsIHBvcywgYnl0ZXMsCisJCQkJQU9QX0ZMQUdfTk9GUyB8IEFPUF9GTEFHX1VOSU5URVJSVVBUSUJMRSwKKwkJCQkmcGFnZSwgaW9tYXApOworCQlwdXRfcGFnZShycGFnZSk7CisJCWlmICh1bmxpa2VseShzdGF0dXMpKQorCQkJcmV0dXJuIHN0YXR1czsKKworCQlXQVJOX09OX09OQ0UoIVBhZ2VVcHRvZGF0ZShwYWdlKSk7CisKKwkJc3RhdHVzID0gaW9tYXBfd3JpdGVfZW5kKGlub2RlLCBwb3MsIGJ5dGVzLCBieXRlcywgcGFnZSk7CisJCWlmICh1bmxpa2VseShzdGF0dXMgPD0gMCkpIHsKKwkJCWlmIChXQVJOX09OX09OQ0Uoc3RhdHVzID09IDApKQorCQkJCXJldHVybiAtRUlPOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCisJCWNvbmRfcmVzY2hlZCgpOworCisJCXBvcyArPSBzdGF0dXM7CisJCXdyaXR0ZW4gKz0gc3RhdHVzOworCQlsZW5ndGggLT0gc3RhdHVzOworCisJCWJhbGFuY2VfZGlydHlfcGFnZXNfcmF0ZWxpbWl0ZWQoaW5vZGUtPmlfbWFwcGluZyk7CisJfSB3aGlsZSAobGVuZ3RoKTsKKworCXJldHVybiB3cml0dGVuOworfQorCitpbnQKK2lvbWFwX2ZpbGVfZGlydHkoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHBvcywgbG9mZl90IGxlbiwKKwkJc3RydWN0IGlvbWFwX29wcyAqb3BzKQoreworCWxvZmZfdCByZXQ7CisKKwl3aGlsZSAobGVuKSB7CisJCXJldCA9IGlvbWFwX2FwcGx5KGlub2RlLCBwb3MsIGxlbiwgSU9NQVBfV1JJVEUsIG9wcywgTlVMTCwKKwkJCQlpb21hcF9kaXJ0eV9hY3Rvcik7CisJCWlmIChyZXQgPD0gMCkKKwkJCXJldHVybiByZXQ7CisJCXBvcyArPSByZXQ7CisJCWxlbiAtPSByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpb21hcF9maWxlX2RpcnR5KTsKKwogc3RhdGljIGludCBpb21hcF96ZXJvKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBwb3MsIHVuc2lnbmVkIG9mZnNldCwKIAkJdW5zaWduZWQgYnl0ZXMsIHN0cnVjdCBpb21hcCAqaW9tYXApCiB7CkBAIC00MjgsOSArNTA3LDE0IEBACiAJCWJyZWFrOwogCX0KIAorCWlmIChpb21hcC0+ZmxhZ3MgJiBJT01BUF9GX01FUkdFRCkKKwkJZmxhZ3MgfD0gRklFTUFQX0VYVEVOVF9NRVJHRUQ7CisJaWYgKGlvbWFwLT5mbGFncyAmIElPTUFQX0ZfU0hBUkVEKQorCQlmbGFncyB8PSBGSUVNQVBfRVhURU5UX1NIQVJFRDsKKwogCXJldHVybiBmaWVtYXBfZmlsbF9uZXh0X2V4dGVudChmaSwgaW9tYXAtPm9mZnNldCwKIAkJCWlvbWFwLT5ibGtubyAhPSBJT01BUF9OVUxMX0JMT0NLID8gaW9tYXAtPmJsa25vIDw8IDk6IDAsCi0JCQlpb21hcC0+bGVuZ3RoLCBmbGFncyB8IEZJRU1BUF9FWFRFTlRfTUVSR0VEKTsKKwkJCWlvbWFwLT5sZW5ndGgsIGZsYWdzKTsKIAogfQogCkBAIC00NzAsMTMgKzU1NCwxOCBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0KGlub2RlLT5pX21hcHBpbmcpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJaWYgKGZpLT5maV9mbGFncyAmIEZJRU1BUF9GTEFHX1NZTkMpIHsKKwkJcmV0ID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdChpbm9kZS0+aV9tYXBwaW5nKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQogCiAJd2hpbGUgKGxlbiA+IDApIHsKIAkJcmV0ID0gaW9tYXBfYXBwbHkoaW5vZGUsIHN0YXJ0LCBsZW4sIDAsIG9wcywgJmN0eCwKIAkJCQlpb21hcF9maWVtYXBfYWN0b3IpOworCQkvKiBpbm9kZSB3aXRoIG5vIChhdHRyaWJ1dGUpIG1hcHBpbmcgd2lsbCBnaXZlIEVOT0VOVCAqLworCQlpZiAocmV0ID09IC1FTk9FTlQpCisJCQlicmVhazsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCQlpZiAocmV0ID09IDApCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX3R4bm1nci5jIGIvZnMvamZzL2pmc190eG5tZ3IuYwppbmRleCAyZTU4OTc4Li40ZDk3MzUyNCAxMDA2NDQKLS0tIGEvZnMvamZzL2pmc190eG5tZ3IuYworKysgYi9mcy9qZnMvamZzX3R4bm1nci5jCkBAIC0yODkzLDggKzI4OTMsNyBAQAogCSAqIG9uIGFub25fbGlzdDIuICBMZXQncyBjaGVjay4KIAkgKi8KIAlpZiAoIWxpc3RfZW1wdHkoJlR4QW5jaG9yLmFub25fbGlzdDIpKSB7Ci0JCWxpc3Rfc3BsaWNlKCZUeEFuY2hvci5hbm9uX2xpc3QyLCAmVHhBbmNob3IuYW5vbl9saXN0KTsKLQkJSU5JVF9MSVNUX0hFQUQoJlR4QW5jaG9yLmFub25fbGlzdDIpOworCQlsaXN0X3NwbGljZV9pbml0KCZUeEFuY2hvci5hbm9uX2xpc3QyLCAmVHhBbmNob3IuYW5vbl9saXN0KTsKIAkJZ290byByZXN0YXJ0OwogCX0KIAlUWE5fVU5MT0NLKCk7CmRpZmYgLS1naXQgYS9mcy9qZnMvcmVzaXplLmMgYi9mcy9qZnMvcmVzaXplLmMKaW5kZXggOTBiM2JjMi4uYmQ5YjY0MSAxMDA2NDQKLS0tIGEvZnMvamZzL3Jlc2l6ZS5jCisrKyBiL2ZzL2pmcy9yZXNpemUuYwpAQCAtMzc5LDggKzM3OSwxNCBAQAogCSAqIGNhY2hlZCBpbiBtZXRhLWRhdGEgY2FjaGUsIGFuZCBub3Qgd3JpdHRlbiBvdXQKIAkgKiBieSB0eENvbW1pdCgpOwogCSAqLwotCWZpbGVtYXBfZmRhdGF3YWl0KGlwYm1hcC0+aV9tYXBwaW5nKTsKLQlmaWxlbWFwX3dyaXRlX2FuZF93YWl0KGlwYm1hcC0+aV9tYXBwaW5nKTsKKwlyYyA9IGZpbGVtYXBfZmRhdGF3YWl0KGlwYm1hcC0+aV9tYXBwaW5nKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyb3Jfb3V0OworCisJcmMgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0KGlwYm1hcC0+aV9tYXBwaW5nKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyb3Jfb3V0OworCiAJZGlXcml0ZVNwZWNpYWwoaXBibWFwLCAwKTsKIAogCW5ld1BhZ2UgPSBuUGFnZXM7CS8qIGZpcnN0IG5ldyBwYWdlIG51bWJlciAqLwpkaWZmIC0tZ2l0IGEvZnMva2VybmZzL2ZpbGUuYyBiL2ZzL2tlcm5mcy9maWxlLmMKaW5kZXggZTE1NzQwMC4uMmJjYjg2ZSAxMDA2NDQKLS0tIGEvZnMva2VybmZzL2ZpbGUuYworKysgYi9mcy9rZXJuZnMvZmlsZS5jCkBAIC04NDAsMjEgKzg0MCwzNSBAQAogCW11dGV4X2xvY2soJmtlcm5mc19tdXRleCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGluZm8sICZrZXJuZnNfcm9vdChrbiktPnN1cGVycywgbm9kZSkgeworCQlzdHJ1Y3Qga2VybmZzX25vZGUgKnBhcmVudDsKIAkJc3RydWN0IGlub2RlICppbm9kZTsKLQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwogCisJCS8qCisJCSAqIFdlIHdhbnQgZnNub3RpZnlfbW9kaWZ5KCkgb24gQGtuIGJ1dCBhcyB0aGUKKwkJICogbW9kaWZpY2F0aW9ucyBhcmVuJ3Qgb3JpZ2luYXRpbmcgZnJvbSB1c2VybGFuZCBkb24ndAorCQkgKiBoYXZlIHRoZSBtYXRjaGluZyBAZmlsZSBhdmFpbGFibGUuICBMb29rIHVwIHRoZSBpbm9kZXMKKwkJICogYW5kIGdlbmVyYXRlIHRoZSBldmVudHMgbWFudWFsbHkuCisJCSAqLwogCQlpbm9kZSA9IGlsb29rdXAoaW5mby0+c2IsIGtuLT5pbm8pOwogCQlpZiAoIWlub2RlKQogCQkJY29udGludWU7CiAKLQkJZGVudHJ5ID0gZF9maW5kX2FueV9hbGlhcyhpbm9kZSk7Ci0JCWlmIChkZW50cnkpIHsKLQkJCWZzbm90aWZ5X3BhcmVudChOVUxMLCBkZW50cnksIEZTX01PRElGWSk7Ci0JCQlmc25vdGlmeShpbm9kZSwgRlNfTU9ESUZZLCBpbm9kZSwgRlNOT1RJRllfRVZFTlRfSU5PREUsCi0JCQkJIE5VTEwsIDApOwotCQkJZHB1dChkZW50cnkpOworCQlwYXJlbnQgPSBrZXJuZnNfZ2V0X3BhcmVudChrbik7CisJCWlmIChwYXJlbnQpIHsKKwkJCXN0cnVjdCBpbm9kZSAqcF9pbm9kZTsKKworCQkJcF9pbm9kZSA9IGlsb29rdXAoaW5mby0+c2IsIHBhcmVudC0+aW5vKTsKKwkJCWlmIChwX2lub2RlKSB7CisJCQkJZnNub3RpZnkocF9pbm9kZSwgRlNfTU9ESUZZIHwgRlNfRVZFTlRfT05fQ0hJTEQsCisJCQkJCSBpbm9kZSwgRlNOT1RJRllfRVZFTlRfSU5PREUsIGtuLT5uYW1lLCAwKTsKKwkJCQlpcHV0KHBfaW5vZGUpOworCQkJfQorCisJCQlrZXJuZnNfcHV0KHBhcmVudCk7CiAJCX0KIAorCQlmc25vdGlmeShpbm9kZSwgRlNfTU9ESUZZLCBpbm9kZSwgRlNOT1RJRllfRVZFTlRfSU5PREUsCisJCQkga24tPm5hbWUsIDApOwogCQlpcHV0KGlub2RlKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL2xvY2tzLmMgYi9mcy9sb2Nrcy5jCmluZGV4IGVlMWIxNWYuLjkwZWM2NzEgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tzLmMKKysrIGIvZnMvbG9ja3MuYwpAQCAtMTI3LDcgKzEyNyw2IEBACiAjaW5jbHVkZSA8bGludXgvcGlkX25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hhc2h0YWJsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgotI2luY2x1ZGUgPGxpbnV4L2xnbG9jay5oPgogCiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvZmlsZWxvY2suaD4KQEAgLTE1OCwxMiArMTU3LDE4IEBACiAKIC8qCiAgKiBUaGUgZ2xvYmFsIGZpbGVfbG9ja19saXN0IGlzIG9ubHkgdXNlZCBmb3IgZGlzcGxheWluZyAvcHJvYy9sb2Nrcywgc28gd2UKLSAqIGtlZXAgYSBsaXN0IG9uIGVhY2ggQ1BVLCB3aXRoIGVhY2ggbGlzdCBwcm90ZWN0ZWQgYnkgaXRzIG93biBzcGlubG9jayB2aWEKLSAqIHRoZSBmaWxlX2xvY2tfbGdsb2NrLiBOb3RlIHRoYXQgYWx0ZXJhdGlvbnMgdG8gdGhlIGxpc3QgYWxzbyByZXF1aXJlIHRoYXQKLSAqIHRoZSByZWxldmFudCBmbGNfbG9jayBpcyBoZWxkLgorICoga2VlcCBhIGxpc3Qgb24gZWFjaCBDUFUsIHdpdGggZWFjaCBsaXN0IHByb3RlY3RlZCBieSBpdHMgb3duIHNwaW5sb2NrLgorICogR2xvYmFsIHNlcmlhbGl6YXRpb24gaXMgZG9uZSB1c2luZyBmaWxlX3J3c2VtLgorICoKKyAqIE5vdGUgdGhhdCBhbHRlcmF0aW9ucyB0byB0aGUgbGlzdCBhbHNvIHJlcXVpcmUgdGhhdCB0aGUgcmVsZXZhbnQgZmxjX2xvY2sgaXMKKyAqIGhlbGQuCiAgKi8KLURFRklORV9TVEFUSUNfTEdMT0NLKGZpbGVfbG9ja19sZ2xvY2spOwotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBobGlzdF9oZWFkLCBmaWxlX2xvY2tfbGlzdCk7CitzdHJ1Y3QgZmlsZV9sb2NrX2xpc3Rfc3RydWN0IHsKKwlzcGlubG9ja190CQlsb2NrOworCXN0cnVjdCBobGlzdF9oZWFkCWhsaXN0OworfTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgZmlsZV9sb2NrX2xpc3Rfc3RydWN0LCBmaWxlX2xvY2tfbGlzdCk7CitERUZJTkVfU1RBVElDX1BFUkNQVV9SV1NFTShmaWxlX3J3c2VtKTsKIAogLyoKICAqIFRoZSBibG9ja2VkX2hhc2ggaXMgdXNlZCB0byBmaW5kIFBPU0lYIGxvY2sgbG9vcHMgZm9yIGRlYWRsb2NrIGRldGVjdGlvbi4KQEAgLTU4NywxNSArNTkyLDIzIEBACiAvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBmbGNfbG9jayBoZWxkISAqLwogc3RhdGljIHZvaWQgbG9ja3NfaW5zZXJ0X2dsb2JhbF9sb2NrcyhzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKIHsKLQlsZ19sb2NhbF9sb2NrKCZmaWxlX2xvY2tfbGdsb2NrKTsKKwlzdHJ1Y3QgZmlsZV9sb2NrX2xpc3Rfc3RydWN0ICpmbGwgPSB0aGlzX2NwdV9wdHIoJmZpbGVfbG9ja19saXN0KTsKKworCXBlcmNwdV9yd3NlbV9hc3NlcnRfaGVsZCgmZmlsZV9yd3NlbSk7CisKKwlzcGluX2xvY2soJmZsbC0+bG9jayk7CiAJZmwtPmZsX2xpbmtfY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCWhsaXN0X2FkZF9oZWFkKCZmbC0+ZmxfbGluaywgdGhpc19jcHVfcHRyKCZmaWxlX2xvY2tfbGlzdCkpOwotCWxnX2xvY2FsX3VubG9jaygmZmlsZV9sb2NrX2xnbG9jayk7CisJaGxpc3RfYWRkX2hlYWQoJmZsLT5mbF9saW5rLCAmZmxsLT5obGlzdCk7CisJc3Bpbl91bmxvY2soJmZsbC0+bG9jayk7CiB9CiAKIC8qIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGZsY19sb2NrIGhlbGQhICovCiBzdGF0aWMgdm9pZCBsb2Nrc19kZWxldGVfZ2xvYmFsX2xvY2tzKHN0cnVjdCBmaWxlX2xvY2sgKmZsKQogeworCXN0cnVjdCBmaWxlX2xvY2tfbGlzdF9zdHJ1Y3QgKmZsbDsKKworCXBlcmNwdV9yd3NlbV9hc3NlcnRfaGVsZCgmZmlsZV9yd3NlbSk7CisKIAkvKgogCSAqIEF2b2lkIHRha2luZyBsb2NrIGlmIGFscmVhZHkgdW5oYXNoZWQuIFRoaXMgaXMgc2FmZSBzaW5jZSB0aGlzIGNoZWNrCiAJICogaXMgZG9uZSB3aGlsZSBob2xkaW5nIHRoZSBmbGNfbG9jaywgYW5kIG5ldyBpbnNlcnRpb25zIGludG8gdGhlIGxpc3QKQEAgLTYwMyw5ICs2MTYsMTEgQEAKIAkgKi8KIAlpZiAoaGxpc3RfdW5oYXNoZWQoJmZsLT5mbF9saW5rKSkKIAkJcmV0dXJuOwotCWxnX2xvY2FsX2xvY2tfY3B1KCZmaWxlX2xvY2tfbGdsb2NrLCBmbC0+ZmxfbGlua19jcHUpOworCisJZmxsID0gcGVyX2NwdV9wdHIoJmZpbGVfbG9ja19saXN0LCBmbC0+ZmxfbGlua19jcHUpOworCXNwaW5fbG9jaygmZmxsLT5sb2NrKTsKIAlobGlzdF9kZWxfaW5pdCgmZmwtPmZsX2xpbmspOwotCWxnX2xvY2FsX3VubG9ja19jcHUoJmZpbGVfbG9ja19sZ2xvY2ssIGZsLT5mbF9saW5rX2NwdSk7CisJc3Bpbl91bmxvY2soJmZsbC0+bG9jayk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nCkBAIC05MTUsNiArOTMwLDcgQEAKIAkJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCXBlcmNwdV9kb3duX3JlYWRfcHJlZW1wdF9kaXNhYmxlKCZmaWxlX3J3c2VtKTsKIAlzcGluX2xvY2soJmN0eC0+ZmxjX2xvY2spOwogCWlmIChyZXF1ZXN0LT5mbF9mbGFncyAmIEZMX0FDQ0VTUykKIAkJZ290byBmaW5kX2NvbmZsaWN0OwpAQCAtOTU1LDYgKzk3MSw3IEBACiAKIG91dDoKIAlzcGluX3VubG9jaygmY3R4LT5mbGNfbG9jayk7CisJcGVyY3B1X3VwX3JlYWRfcHJlZW1wdF9lbmFibGUoJmZpbGVfcndzZW0pOwogCWlmIChuZXdfZmwpCiAJCWxvY2tzX2ZyZWVfbG9jayhuZXdfZmwpOwogCWxvY2tzX2Rpc3Bvc2VfbGlzdCgmZGlzcG9zZSk7CkBAIC05OTEsNiArMTAwOCw3IEBACiAJCW5ld19mbDIgPSBsb2Nrc19hbGxvY19sb2NrKCk7CiAJfQogCisJcGVyY3B1X2Rvd25fcmVhZF9wcmVlbXB0X2Rpc2FibGUoJmZpbGVfcndzZW0pOwogCXNwaW5fbG9jaygmY3R4LT5mbGNfbG9jayk7CiAJLyoKIAkgKiBOZXcgbG9jayByZXF1ZXN0LiBXYWxrIGFsbCBQT1NJWCBsb2NrcyBhbmQgbG9vayBmb3IgY29uZmxpY3RzLiBJZgpAQCAtMTE2Miw2ICsxMTgwLDcgQEAKIAl9CiAgb3V0OgogCXNwaW5fdW5sb2NrKCZjdHgtPmZsY19sb2NrKTsKKwlwZXJjcHVfdXBfcmVhZF9wcmVlbXB0X2VuYWJsZSgmZmlsZV9yd3NlbSk7CiAJLyoKIAkgKiBGcmVlIGFueSB1bnVzZWQgbG9ja3MuCiAJICovCkBAIC0xNDM2LDYgKzE0NTUsNyBAQAogCQlyZXR1cm4gZXJyb3I7CiAJfQogCisJcGVyY3B1X2Rvd25fcmVhZF9wcmVlbXB0X2Rpc2FibGUoJmZpbGVfcndzZW0pOwogCXNwaW5fbG9jaygmY3R4LT5mbGNfbG9jayk7CiAKIAl0aW1lX291dF9sZWFzZXMoaW5vZGUsICZkaXNwb3NlKTsKQEAgLTE0ODcsOSArMTUwNywxMyBAQAogCWxvY2tzX2luc2VydF9ibG9jayhmbCwgbmV3X2ZsKTsKIAl0cmFjZV9icmVha19sZWFzZV9ibG9jayhpbm9kZSwgbmV3X2ZsKTsKIAlzcGluX3VubG9jaygmY3R4LT5mbGNfbG9jayk7CisJcGVyY3B1X3VwX3JlYWRfcHJlZW1wdF9lbmFibGUoJmZpbGVfcndzZW0pOworCiAJbG9ja3NfZGlzcG9zZV9saXN0KCZkaXNwb3NlKTsKIAllcnJvciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KG5ld19mbC0+Zmxfd2FpdCwKIAkJCQkJCSFuZXdfZmwtPmZsX25leHQsIGJyZWFrX3RpbWUpOworCisJcGVyY3B1X2Rvd25fcmVhZF9wcmVlbXB0X2Rpc2FibGUoJmZpbGVfcndzZW0pOwogCXNwaW5fbG9jaygmY3R4LT5mbGNfbG9jayk7CiAJdHJhY2VfYnJlYWtfbGVhc2VfdW5ibG9jayhpbm9kZSwgbmV3X2ZsKTsKIAlsb2Nrc19kZWxldGVfYmxvY2sobmV3X2ZsKTsKQEAgLTE1MDYsNiArMTUzMCw3IEBACiAJfQogb3V0OgogCXNwaW5fdW5sb2NrKCZjdHgtPmZsY19sb2NrKTsKKwlwZXJjcHVfdXBfcmVhZF9wcmVlbXB0X2VuYWJsZSgmZmlsZV9yd3NlbSk7CiAJbG9ja3NfZGlzcG9zZV9saXN0KCZkaXNwb3NlKTsKIAlsb2Nrc19mcmVlX2xvY2sobmV3X2ZsKTsKIAlyZXR1cm4gZXJyb3I7CkBAIC0xNjYwLDYgKzE2ODUsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlwZXJjcHVfZG93bl9yZWFkX3ByZWVtcHRfZGlzYWJsZSgmZmlsZV9yd3NlbSk7CiAJc3Bpbl9sb2NrKCZjdHgtPmZsY19sb2NrKTsKIAl0aW1lX291dF9sZWFzZXMoaW5vZGUsICZkaXNwb3NlKTsKIAllcnJvciA9IGNoZWNrX2NvbmZsaWN0aW5nX29wZW4oZGVudHJ5LCBhcmcsIGxlYXNlLT5mbF9mbGFncyk7CkBAIC0xNzMwLDYgKzE3NTYsNyBAQAogCQlsZWFzZS0+ZmxfbG1vcHMtPmxtX3NldHVwKGxlYXNlLCBwcml2KTsKIG91dDoKIAlzcGluX3VubG9jaygmY3R4LT5mbGNfbG9jayk7CisJcGVyY3B1X3VwX3JlYWRfcHJlZW1wdF9lbmFibGUoJmZpbGVfcndzZW0pOwogCWxvY2tzX2Rpc3Bvc2VfbGlzdCgmZGlzcG9zZSk7CiAJaWYgKGlzX2RlbGVnKQogCQlpbm9kZV91bmxvY2soaW5vZGUpOwpAQCAtMTc1Miw2ICsxNzc5LDcgQEAKIAkJcmV0dXJuIGVycm9yOwogCX0KIAorCXBlcmNwdV9kb3duX3JlYWRfcHJlZW1wdF9kaXNhYmxlKCZmaWxlX3J3c2VtKTsKIAlzcGluX2xvY2soJmN0eC0+ZmxjX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZmwsICZjdHgtPmZsY19sZWFzZSwgZmxfbGlzdCkgewogCQlpZiAoZmwtPmZsX2ZpbGUgPT0gZmlscCAmJgpAQCAtMTc2NCw2ICsxNzkyLDcgQEAKIAlpZiAodmljdGltKQogCQllcnJvciA9IGZsLT5mbF9sbW9wcy0+bG1fY2hhbmdlKHZpY3RpbSwgRl9VTkxDSywgJmRpc3Bvc2UpOwogCXNwaW5fdW5sb2NrKCZjdHgtPmZsY19sb2NrKTsKKwlwZXJjcHVfdXBfcmVhZF9wcmVlbXB0X2VuYWJsZSgmZmlsZV9yd3NlbSk7CiAJbG9ja3NfZGlzcG9zZV9saXN0KCZkaXNwb3NlKTsKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC0yNTc0LDkgKzI2MDMsMjAgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgZmxfcGlkOwogCi0JaWYgKGZsLT5mbF9uc3BpZCkKLQkJZmxfcGlkID0gcGlkX3ZucihmbC0+ZmxfbnNwaWQpOwotCWVsc2UKKwlpZiAoZmwtPmZsX25zcGlkKSB7CisJCXN0cnVjdCBwaWRfbmFtZXNwYWNlICpwcm9jX3BpZG5zID0gZmlsZV9pbm9kZShmLT5maWxlKS0+aV9zYi0+c19mc19pbmZvOworCisJCS8qIERvbid0IGxldCBmbF9waWQgY2hhbmdlIGJhc2VkIG9uIHdobyBpcyByZWFkaW5nIHRoZSBmaWxlICovCisJCWZsX3BpZCA9IHBpZF9ucl9ucyhmbC0+ZmxfbnNwaWQsIHByb2NfcGlkbnMpOworCisJCS8qCisJCSAqIElmIHRoZXJlIGlzbid0IGEgZmxfcGlkIGRvbid0IGRpc3BsYXkgd2hvIGlzIHdhaXRpbmcgb24KKwkJICogdGhlIGxvY2sgaWYgd2UgYXJlIGNhbGxlZCBmcm9tIGxvY2tzX3Nob3csIG9yIGlmIHdlIGFyZQorCQkgKiBjYWxsZWQgZnJvbSBfX3Nob3dfZmRfaW5mbyAtIHNraXAgbG9jayBlbnRpcmVseQorCQkgKi8KKwkJaWYgKGZsX3BpZCA9PSAwKQorCQkJcmV0dXJuOworCX0gZWxzZQogCQlmbF9waWQgPSBmbC0+ZmxfcGlkOwogCiAJaWYgKGZsLT5mbF9maWxlICE9IE5VTEwpCkBAIC0yNjQ4LDkgKzI2ODgsMTMgQEAKIHsKIAlzdHJ1Y3QgbG9ja3NfaXRlcmF0b3IgKml0ZXIgPSBmLT5wcml2YXRlOwogCXN0cnVjdCBmaWxlX2xvY2sgKmZsLCAqYmZsOworCXN0cnVjdCBwaWRfbmFtZXNwYWNlICpwcm9jX3BpZG5zID0gZmlsZV9pbm9kZShmLT5maWxlKS0+aV9zYi0+c19mc19pbmZvOwogCiAJZmwgPSBobGlzdF9lbnRyeSh2LCBzdHJ1Y3QgZmlsZV9sb2NrLCBmbF9saW5rKTsKIAorCWlmIChmbC0+ZmxfbnNwaWQgJiYgIXBpZF9ucl9ucyhmbC0+ZmxfbnNwaWQsIHByb2NfcGlkbnMpKQorCQlyZXR1cm4gMDsKKwogCWxvY2tfZ2V0X3N0YXR1cyhmLCBmbCwgaXRlci0+bGlfcG9zLCAiIik7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJmbCwgJmZsLT5mbF9ibG9jaywgZmxfYmxvY2spCkBAIC0yNzAzLDkgKzI3NDcsOSBAQAogCXN0cnVjdCBsb2Nrc19pdGVyYXRvciAqaXRlciA9IGYtPnByaXZhdGU7CiAKIAlpdGVyLT5saV9wb3MgPSAqcG9zICsgMTsKLQlsZ19nbG9iYWxfbG9jaygmZmlsZV9sb2NrX2xnbG9jayk7CisJcGVyY3B1X2Rvd25fd3JpdGUoJmZpbGVfcndzZW0pOwogCXNwaW5fbG9jaygmYmxvY2tlZF9sb2NrX2xvY2spOwotCXJldHVybiBzZXFfaGxpc3Rfc3RhcnRfcGVyY3B1KCZmaWxlX2xvY2tfbGlzdCwgJml0ZXItPmxpX2NwdSwgKnBvcyk7CisJcmV0dXJuIHNlcV9obGlzdF9zdGFydF9wZXJjcHUoJmZpbGVfbG9ja19saXN0LmhsaXN0LCAmaXRlci0+bGlfY3B1LCAqcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgKmxvY2tzX25leHQoc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKQEAgLTI3MTMsMTQgKzI3NTcsMTQgQEAKIAlzdHJ1Y3QgbG9ja3NfaXRlcmF0b3IgKml0ZXIgPSBmLT5wcml2YXRlOwogCiAJKytpdGVyLT5saV9wb3M7Ci0JcmV0dXJuIHNlcV9obGlzdF9uZXh0X3BlcmNwdSh2LCAmZmlsZV9sb2NrX2xpc3QsICZpdGVyLT5saV9jcHUsIHBvcyk7CisJcmV0dXJuIHNlcV9obGlzdF9uZXh0X3BlcmNwdSh2LCAmZmlsZV9sb2NrX2xpc3QuaGxpc3QsICZpdGVyLT5saV9jcHUsIHBvcyk7CiB9CiAKIHN0YXRpYyB2b2lkIGxvY2tzX3N0b3Aoc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICp2KQogCV9fcmVsZWFzZXMoJmJsb2NrZWRfbG9ja19sb2NrKQogewogCXNwaW5fdW5sb2NrKCZibG9ja2VkX2xvY2tfbG9jayk7Ci0JbGdfZ2xvYmFsX3VubG9jaygmZmlsZV9sb2NrX2xnbG9jayk7CisJcGVyY3B1X3VwX3dyaXRlKCZmaWxlX3J3c2VtKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBsb2Nrc19zZXFfb3BlcmF0aW9ucyA9IHsKQEAgLTI3NjEsMTAgKzI4MDUsMTMgQEAKIAlmaWxlbG9ja19jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJmaWxlX2xvY2tfY2FjaGUiLAogCQkJc2l6ZW9mKHN0cnVjdCBmaWxlX2xvY2spLCAwLCBTTEFCX1BBTklDLCBOVUxMKTsKIAotCWxnX2xvY2tfaW5pdCgmZmlsZV9sb2NrX2xnbG9jaywgImZpbGVfbG9ja19sZ2xvY2siKTsKIAotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKQotCQlJTklUX0hMSVNUX0hFQUQocGVyX2NwdV9wdHIoJmZpbGVfbG9ja19saXN0LCBpKSk7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKKwkJc3RydWN0IGZpbGVfbG9ja19saXN0X3N0cnVjdCAqZmxsID0gcGVyX2NwdV9wdHIoJmZpbGVfbG9ja19saXN0LCBpKTsKKworCQlzcGluX2xvY2tfaW5pdCgmZmxsLT5sb2NrKTsKKwkJSU5JVF9ITElTVF9IRUFEKCZmbGwtPmhsaXN0KTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2ZzL21vdW50LmggYi9mcy9tb3VudC5oCmluZGV4IDE0ZGIwNWQuLmQyZTI1ZDcgMTAwNjQ0Ci0tLSBhL2ZzL21vdW50LmgKKysrIGIvZnMvbW91bnQuaApAQCAtMTAsOSArMTAsMTIgQEAKIAlzdHJ1Y3QgbW91bnQgKglyb290OwogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKIAlzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UJKnVzZXJfbnM7CisJc3RydWN0IHVjb3VudHMJCSp1Y291bnRzOwogCXU2NAkJCXNlcTsJLyogU2VxdWVuY2UgbnVtYmVyIHRvIHByZXZlbnQgbG9vcHMgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCBwb2xsOwogCXU2NCBldmVudDsKKwl1bnNpZ25lZCBpbnQJCW1vdW50czsgLyogIyBvZiBtb3VudHMgaW4gdGhlIG5hbWVzcGFjZSAqLworCXVuc2lnbmVkIGludAkJcGVuZGluZ19tb3VudHM7CiB9OwogCiBzdHJ1Y3QgbW50X3BjcCB7CmRpZmYgLS1naXQgYS9mcy9uYW1lc3BhY2UuYyBiL2ZzL25hbWVzcGFjZS5jCmluZGV4IDdiYjJjZGEuLmRiMWI1YTMgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVzcGFjZS5jCisrKyBiL2ZzL25hbWVzcGFjZS5jCkBAIC0yNyw2ICsyNyw5IEBACiAjaW5jbHVkZSAicG5vZGUuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCisvKiBNYXhpbXVtIG51bWJlciBvZiBtb3VudHMgaW4gYSBtb3VudCBuYW1lc3BhY2UgKi8KK3Vuc2lnbmVkIGludCBzeXNjdGxfbW91bnRfbWF4IF9fcmVhZF9tb3N0bHkgPSAxMDAwMDA7CisKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbV9oYXNoX21hc2sgX19yZWFkX21vc3RseTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbV9oYXNoX3NoaWZ0IF9fcmVhZF9tb3N0bHk7CiBzdGF0aWMgdW5zaWduZWQgaW50IG1wX2hhc2hfbWFzayBfX3JlYWRfbW9zdGx5OwpAQCAtODk5LDYgKzkwMiw5IEBACiAKIAlsaXN0X3NwbGljZSgmaGVhZCwgbi0+bGlzdC5wcmV2KTsKIAorCW4tPm1vdW50cyArPSBuLT5wZW5kaW5nX21vdW50czsKKwluLT5wZW5kaW5nX21vdW50cyA9IDA7CisKIAlhdHRhY2hfc2hhZG93ZWQobW50LCBwYXJlbnQsIHNoYWRvd3MpOwogCXRvdWNoX21udF9uYW1lc3BhY2Uobik7CiB9CkBAIC0xNDE5LDExICsxNDI1LDE2IEBACiAJCXByb3BhZ2F0ZV91bW91bnQoJnRtcF9saXN0KTsKIAogCXdoaWxlICghbGlzdF9lbXB0eSgmdG1wX2xpc3QpKSB7CisJCXN0cnVjdCBtbnRfbmFtZXNwYWNlICpuczsKIAkJYm9vbCBkaXNjb25uZWN0OwogCQlwID0gbGlzdF9maXJzdF9lbnRyeSgmdG1wX2xpc3QsIHN0cnVjdCBtb3VudCwgbW50X2xpc3QpOwogCQlsaXN0X2RlbF9pbml0KCZwLT5tbnRfZXhwaXJlKTsKIAkJbGlzdF9kZWxfaW5pdCgmcC0+bW50X2xpc3QpOwotCQlfX3RvdWNoX21udF9uYW1lc3BhY2UocC0+bW50X25zKTsKKwkJbnMgPSBwLT5tbnRfbnM7CisJCWlmIChucykgeworCQkJbnMtPm1vdW50cy0tOworCQkJX190b3VjaF9tbnRfbmFtZXNwYWNlKG5zKTsKKwkJfQogCQlwLT5tbnRfbnMgPSBOVUxMOwogCQlpZiAoaG93ICYgVU1PVU5UX1NZTkMpCiAJCQlwLT5tbnQubW50X2ZsYWdzIHw9IE1OVF9TWU5DX1VNT1VOVDsKQEAgLTE4NDAsNiArMTg1MSwyOCBAQAogCXJldHVybiAwOwogfQogCitpbnQgY291bnRfbW91bnRzKHN0cnVjdCBtbnRfbmFtZXNwYWNlICpucywgc3RydWN0IG1vdW50ICptbnQpCit7CisJdW5zaWduZWQgaW50IG1heCA9IFJFQURfT05DRShzeXNjdGxfbW91bnRfbWF4KTsKKwl1bnNpZ25lZCBpbnQgbW91bnRzID0gMCwgb2xkLCBwZW5kaW5nLCBzdW07CisJc3RydWN0IG1vdW50ICpwOworCisJZm9yIChwID0gbW50OyBwOyBwID0gbmV4dF9tbnQocCwgbW50KSkKKwkJbW91bnRzKys7CisKKwlvbGQgPSBucy0+bW91bnRzOworCXBlbmRpbmcgPSBucy0+cGVuZGluZ19tb3VudHM7CisJc3VtID0gb2xkICsgcGVuZGluZzsKKwlpZiAoKG9sZCA+IHN1bSkgfHwKKwkgICAgKHBlbmRpbmcgPiBzdW0pIHx8CisJICAgIChtYXggPCBzdW0pIHx8CisJICAgIChtb3VudHMgPiAobWF4IC0gc3VtKSkpCisJCXJldHVybiAtRU5PU1BDOworCisJbnMtPnBlbmRpbmdfbW91bnRzID0gcGVuZGluZyArIG1vdW50czsKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqICBAc291cmNlX21udCA6IG1vdW50IHRyZWUgdG8gYmUgYXR0YWNoZWQKICAqICBAbmQgICAgICAgICA6IHBsYWNlIHRoZSBtb3VudCB0cmVlIEBzb3VyY2VfbW50IGlzIGF0dGFjaGVkCkBAIC0xOTA5LDEwICsxOTQyLDE4IEBACiAJCQlzdHJ1Y3QgcGF0aCAqcGFyZW50X3BhdGgpCiB7CiAJSExJU1RfSEVBRCh0cmVlX2xpc3QpOworCXN0cnVjdCBtbnRfbmFtZXNwYWNlICpucyA9IGRlc3RfbW50LT5tbnRfbnM7CiAJc3RydWN0IG1vdW50ICpjaGlsZCwgKnA7CiAJc3RydWN0IGhsaXN0X25vZGUgKm47CiAJaW50IGVycjsKIAorCS8qIElzIHRoZXJlIHNwYWNlIHRvIGFkZCB0aGVzZSBtb3VudHMgdG8gdGhlIG1vdW50IG5hbWVzcGFjZT8gKi8KKwlpZiAoIXBhcmVudF9wYXRoKSB7CisJCWVyciA9IGNvdW50X21vdW50cyhucywgc291cmNlX21udCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwl9CisKIAlpZiAoSVNfTU5UX1NIQVJFRChkZXN0X21udCkpIHsKIAkJZXJyID0gaW52ZW50X2dyb3VwX2lkcyhzb3VyY2VfbW50LCB0cnVlKTsKIAkJaWYgKGVycikKQEAgLTE5NDksMTEgKzE5OTAsMTMgQEAKICBvdXRfY2xlYW51cF9pZHM6CiAJd2hpbGUgKCFobGlzdF9lbXB0eSgmdHJlZV9saXN0KSkgewogCQljaGlsZCA9IGhsaXN0X2VudHJ5KHRyZWVfbGlzdC5maXJzdCwgc3RydWN0IG1vdW50LCBtbnRfaGFzaCk7CisJCWNoaWxkLT5tbnRfcGFyZW50LT5tbnRfbnMtPnBlbmRpbmdfbW91bnRzID0gMDsKIAkJdW1vdW50X3RyZWUoY2hpbGQsIFVNT1VOVF9TWU5DKTsKIAl9CiAJdW5sb2NrX21vdW50X2hhc2goKTsKIAljbGVhbnVwX2dyb3VwX2lkcyhzb3VyY2VfbW50LCBOVUxMKTsKICBvdXQ6CisJbnMtPnBlbmRpbmdfbW91bnRzID0gMDsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yNzE5LDkgKzI3NjIsMjAgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCitzdGF0aWMgc3RydWN0IHVjb3VudHMgKmluY19tbnRfbmFtZXNwYWNlcyhzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zKQoreworCXJldHVybiBpbmNfdWNvdW50KG5zLCBjdXJyZW50X2V1aWQoKSwgVUNPVU5UX01OVF9OQU1FU1BBQ0VTKTsKK30KKworc3RhdGljIHZvaWQgZGVjX21udF9uYW1lc3BhY2VzKHN0cnVjdCB1Y291bnRzICp1Y291bnRzKQoreworCWRlY191Y291bnQodWNvdW50cywgVUNPVU5UX01OVF9OQU1FU1BBQ0VTKTsKK30KKwogc3RhdGljIHZvaWQgZnJlZV9tbnRfbnMoc3RydWN0IG1udF9uYW1lc3BhY2UgKm5zKQogewogCW5zX2ZyZWVfaW51bSgmbnMtPm5zKTsKKwlkZWNfbW50X25hbWVzcGFjZXMobnMtPnVjb3VudHMpOwogCXB1dF91c2VyX25zKG5zLT51c2VyX25zKTsKIAlrZnJlZShucyk7CiB9CkBAIC0yNzM4LDE0ICsyNzkyLDIyIEBACiBzdGF0aWMgc3RydWN0IG1udF9uYW1lc3BhY2UgKmFsbG9jX21udF9ucyhzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnVzZXJfbnMpCiB7CiAJc3RydWN0IG1udF9uYW1lc3BhY2UgKm5ld19uczsKKwlzdHJ1Y3QgdWNvdW50cyAqdWNvdW50czsKIAlpbnQgcmV0OwogCisJdWNvdW50cyA9IGluY19tbnRfbmFtZXNwYWNlcyh1c2VyX25zKTsKKwlpZiAoIXVjb3VudHMpCisJCXJldHVybiBFUlJfUFRSKC1FTk9TUEMpOworCiAJbmV3X25zID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG1udF9uYW1lc3BhY2UpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW5ld19ucykKKwlpZiAoIW5ld19ucykgeworCQlkZWNfbW50X25hbWVzcGFjZXModWNvdW50cyk7CiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KIAlyZXQgPSBuc19hbGxvY19pbnVtKCZuZXdfbnMtPm5zKTsKIAlpZiAocmV0KSB7CiAJCWtmcmVlKG5ld19ucyk7CisJCWRlY19tbnRfbmFtZXNwYWNlcyh1Y291bnRzKTsKIAkJcmV0dXJuIEVSUl9QVFIocmV0KTsKIAl9CiAJbmV3X25zLT5ucy5vcHMgPSAmbW50bnNfb3BlcmF0aW9uczsKQEAgLTI3NTYsNiArMjgxOCw5IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmbmV3X25zLT5wb2xsKTsKIAluZXdfbnMtPmV2ZW50ID0gMDsKIAluZXdfbnMtPnVzZXJfbnMgPSBnZXRfdXNlcl9ucyh1c2VyX25zKTsKKwluZXdfbnMtPnVjb3VudHMgPSB1Y291bnRzOworCW5ld19ucy0+bW91bnRzID0gMDsKKwluZXdfbnMtPnBlbmRpbmdfbW91bnRzID0gMDsKIAlyZXR1cm4gbmV3X25zOwogfQogCkBAIC0yODA1LDYgKzI4NzAsNyBAQAogCXEgPSBuZXc7CiAJd2hpbGUgKHApIHsKIAkJcS0+bW50X25zID0gbmV3X25zOworCQluZXdfbnMtPm1vdW50cysrOwogCQlpZiAobmV3X2ZzKSB7CiAJCQlpZiAoJnAtPm1udCA9PSBuZXdfZnMtPnJvb3QubW50KSB7CiAJCQkJbmV3X2ZzLT5yb290Lm1udCA9IG1udGdldCgmcS0+bW50KTsKQEAgLTI4NDMsNiArMjkwOSw3IEBACiAJCXN0cnVjdCBtb3VudCAqbW50ID0gcmVhbF9tb3VudChtKTsKIAkJbW50LT5tbnRfbnMgPSBuZXdfbnM7CiAJCW5ld19ucy0+cm9vdCA9IG1udDsKKwkJbmV3X25zLT5tb3VudHMrKzsKIAkJbGlzdF9hZGQoJm1udC0+bW50X2xpc3QsICZuZXdfbnMtPmxpc3QpOwogCX0gZWxzZSB7CiAJCW1udHB1dChtKTsKQEAgLTMzNDgsMTAgKzM0MTUsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbW50bnNfb3duZXIoc3RydWN0IG5zX2NvbW1vbiAqbnMpCit7CisJcmV0dXJuIHRvX21udF9ucyhucyktPnVzZXJfbnM7Cit9CisKIGNvbnN0IHN0cnVjdCBwcm9jX25zX29wZXJhdGlvbnMgbW50bnNfb3BlcmF0aW9ucyA9IHsKIAkubmFtZQkJPSAibW50IiwKIAkudHlwZQkJPSBDTE9ORV9ORVdOUywKIAkuZ2V0CQk9IG1udG5zX2dldCwKIAkucHV0CQk9IG1udG5zX3B1dCwKIAkuaW5zdGFsbAk9IG1udG5zX2luc3RhbGwsCisJLm93bmVyCQk9IG1udG5zX293bmVyLAogfTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9ibG9ja2xheW91dC9ibG9ja2xheW91dC5jIGIvZnMvbmZzL2Jsb2NrbGF5b3V0L2Jsb2NrbGF5b3V0LmMKaW5kZXggZjU1YTRlNy4uMjE3ODQ3NiAxMDA2NDQKLS0tIGEvZnMvbmZzL2Jsb2NrbGF5b3V0L2Jsb2NrbGF5b3V0LmMKKysrIGIvZnMvbmZzL2Jsb2NrbGF5b3V0L2Jsb2NrbGF5b3V0LmMKQEAgLTM0Niw3ICszNDYsNyBAQAogCQkJUEFHRV9TSVpFIC0gMSkgJiAobG9mZl90KVBBR0VfTUFTSzsKIAogCQlleHRfdHJlZV9tYXJrX3dyaXR0ZW4oYmwsIHN0YXJ0ID4+IFNFQ1RPUl9TSElGVCwKLQkJCQkJKGVuZCAtIHN0YXJ0KSA+PiBTRUNUT1JfU0hJRlQpOworCQkJCQkoZW5kIC0gc3RhcnQpID4+IFNFQ1RPUl9TSElGVCwgZW5kKTsKIAl9CiAKIAlwbmZzX2xkX3dyaXRlX2RvbmUoaGRyKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9ibG9ja2xheW91dC9ibG9ja2xheW91dC5oIGIvZnMvbmZzL2Jsb2NrbGF5b3V0L2Jsb2NrbGF5b3V0LmgKaW5kZXggMThlNmZkMC4uZWZjMDA3ZiAxMDA2NDQKLS0tIGEvZnMvbmZzL2Jsb2NrbGF5b3V0L2Jsb2NrbGF5b3V0LmgKKysrIGIvZnMvbmZzL2Jsb2NrbGF5b3V0L2Jsb2NrbGF5b3V0LmgKQEAgLTE0MSw2ICsxNDEsNyBAQAogCXN0cnVjdCByYl9yb290CQlibF9leHRfcm87CiAJc3BpbmxvY2tfdAkJYmxfZXh0X2xvY2s7ICAgLyogUHJvdGVjdHMgbGlzdCBtYW5pcHVsYXRpb24gKi8KIAlib29sCQkJYmxfc2NzaV9sYXlvdXQ7CisJdTY0CQkJYmxfbHdiOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgcG5mc19ibG9ja19sYXlvdXQgKgpAQCAtMTgyLDcgKzE4Myw3IEBACiBpbnQgZXh0X3RyZWVfcmVtb3ZlKHN0cnVjdCBwbmZzX2Jsb2NrX2xheW91dCAqYmwsIGJvb2wgcncsIHNlY3Rvcl90IHN0YXJ0LAogCQlzZWN0b3JfdCBlbmQpOwogaW50IGV4dF90cmVlX21hcmtfd3JpdHRlbihzdHJ1Y3QgcG5mc19ibG9ja19sYXlvdXQgKmJsLCBzZWN0b3JfdCBzdGFydCwKLQkJc2VjdG9yX3QgbGVuKTsKKwkJc2VjdG9yX3QgbGVuLCB1NjQgbHdiKTsKIGJvb2wgZXh0X3RyZWVfbG9va3VwKHN0cnVjdCBwbmZzX2Jsb2NrX2xheW91dCAqYmwsIHNlY3Rvcl90IGlzZWN0LAogCQlzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKnJldCwgYm9vbCBydyk7CiBpbnQgZXh0X3RyZWVfcHJlcGFyZV9jb21taXQoc3RydWN0IG5mczRfbGF5b3V0Y29tbWl0X2FyZ3MgKmFyZyk7CmRpZmYgLS1naXQgYS9mcy9uZnMvYmxvY2tsYXlvdXQvZXh0ZW50X3RyZWUuYyBiL2ZzL25mcy9ibG9ja2xheW91dC9leHRlbnRfdHJlZS5jCmluZGV4IDk5MmJjYjEuLmM4NWZiZmQgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9ibG9ja2xheW91dC9leHRlbnRfdHJlZS5jCisrKyBiL2ZzL25mcy9ibG9ja2xheW91dC9leHRlbnRfdHJlZS5jCkBAIC00MDIsNyArNDAyLDcgQEAKIAogaW50CiBleHRfdHJlZV9tYXJrX3dyaXR0ZW4oc3RydWN0IHBuZnNfYmxvY2tfbGF5b3V0ICpibCwgc2VjdG9yX3Qgc3RhcnQsCi0JCXNlY3Rvcl90IGxlbikKKwkJc2VjdG9yX3QgbGVuLCB1NjQgbHdiKQogewogCXN0cnVjdCByYl9yb290ICpyb290ID0gJmJsLT5ibF9leHRfcnc7CiAJc2VjdG9yX3QgZW5kID0gc3RhcnQgKyBsZW47CkBAIC00NzEsNiArNDcxLDggQEAKIAkJfQogCX0KIG91dDoKKwlpZiAoYmwtPmJsX2x3YiA8IGx3YikKKwkJYmwtPmJsX2x3YiA9IGx3YjsKIAlzcGluX3VubG9jaygmYmwtPmJsX2V4dF9sb2NrKTsKIAogCV9fZXh0X3B1dF9kZXZpY2VpZHMoJnRtcCk7CkBAIC01MTgsNyArNTIwLDcgQEAKIH0KIAogc3RhdGljIGludCBleHRfdHJlZV9lbmNvZGVfY29tbWl0KHN0cnVjdCBwbmZzX2Jsb2NrX2xheW91dCAqYmwsIF9fYmUzMiAqcCwKLQkJc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgKmNvdW50KQorCQlzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCAqY291bnQsIF9fdTY0ICpsYXN0Ynl0ZSkKIHsKIAlzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKmJlOwogCWludCByZXQgPSAwOwpAQCAtNTQyLDYgKzU0NCw4IEBACiAJCQlwID0gZW5jb2RlX2Jsb2NrX2V4dGVudChiZSwgcCk7CiAJCWJlLT5iZV90YWcgPSBFWFRFTlRfQ09NTUlUVElORzsKIAl9CisJKmxhc3RieXRlID0gYmwtPmJsX2x3YiAtIDE7CisJYmwtPmJsX2x3YiA9IDA7CiAJc3Bpbl91bmxvY2soJmJsLT5ibF9leHRfbG9jayk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtNTY0LDcgKzU2OCw3IEBACiAJYXJnLT5sYXlvdXR1cGRhdGVfcGFnZXMgPSAmYXJnLT5sYXlvdXR1cGRhdGVfcGFnZTsKIAogcmV0cnk6Ci0JcmV0ID0gZXh0X3RyZWVfZW5jb2RlX2NvbW1pdChibCwgc3RhcnRfcCArIDEsIGJ1ZmZlcl9zaXplLCAmY291bnQpOworCXJldCA9IGV4dF90cmVlX2VuY29kZV9jb21taXQoYmwsIHN0YXJ0X3AgKyAxLCBidWZmZXJfc2l6ZSwgJmNvdW50LCAmYXJnLT5sYXN0Ynl0ZXdyaXR0ZW4pOwogCWlmICh1bmxpa2VseShyZXQpKSB7CiAJCWV4dF90cmVlX2ZyZWVfY29tbWl0ZGF0YShhcmcsIGJ1ZmZlcl9zaXplKTsKIApkaWZmIC0tZ2l0IGEvZnMvbmZzL2NhbGxiYWNrLmMgYi9mcy9uZnMvY2FsbGJhY2suYwppbmRleCBhN2YyZTZlLi41MmEyODMxIDEwMDY0NAotLS0gYS9mcy9uZnMvY2FsbGJhY2suYworKysgYi9mcy9uZnMvY2FsbGJhY2suYwpAQCAtMjc1LDYgKzI3NSw3IEBACiBlcnJfc29ja3M6CiAJc3ZjX3JwY2JfY2xlYW51cChzZXJ2LCBuZXQpOwogZXJyX2JpbmQ6CisJbm4tPmNiX3VzZXJzW21pbm9ydmVyc2lvbl0tLTsKIAlkcHJpbnRrKCJORlM6IENvdWxkbid0IGNyZWF0ZSBjYWxsYmFjayBzb2NrZXQ6IGVyciA9ICVkOyAiCiAJCQkibmV0ID0gJXBcbiIsIHJldCwgbmV0KTsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2NhbGxiYWNrX3Byb2MuYyBiL2ZzL25mcy9jYWxsYmFja19wcm9jLmMKaW5kZXggYzkyYTc1ZS4uZjk1M2VmNiAxMDA2NDQKLS0tIGEvZnMvbmZzL2NhbGxiYWNrX3Byb2MuYworKysgYi9mcy9uZnMvY2FsbGJhY2tfcHJvYy5jCkBAIC00NTQsMTEgKzQ1NCw4IEBACiAJCQkJKCh1MzIgKikmcmNsaXN0LT5yY2xfc2Vzc2lvbmlkLmRhdGEpWzNdLAogCQkJCXJlZi0+cmNfc2VxdWVuY2VpZCwgcmVmLT5yY19zbG90aWQpOwogCi0JCQlzcGluX2xvY2soJnRibC0+c2xvdF90YmxfbG9jayk7Ci0JCQlzdGF0dXMgPSAodGVzdF9iaXQocmVmLT5yY19zbG90aWQsIHRibC0+dXNlZF9zbG90cykgJiYKLQkJCQkgIHRibC0+c2xvdHNbcmVmLT5yY19zbG90aWRdLnNlcV9uciA9PQotCQkJCQlyZWYtPnJjX3NlcXVlbmNlaWQpOwotCQkJc3Bpbl91bmxvY2soJnRibC0+c2xvdF90YmxfbG9jayk7CisJCQlzdGF0dXMgPSBuZnM0X3Nsb3Rfd2FpdF9vbl9zZXFpZCh0YmwsIHJlZi0+cmNfc2xvdGlkLAorCQkJCQlyZWYtPnJjX3NlcXVlbmNlaWQsIEhaID4+IDEpIDwgMDsKIAkJCWlmIChzdGF0dXMpCiAJCQkJZ290byBvdXQ7CiAJCX0KQEAgLTQ4Nyw3ICs0ODQsNiBAQAogCQlnb3RvIG91dDsKIAogCXRibCA9ICZjbHAtPmNsX3Nlc3Npb24tPmJjX3Nsb3RfdGFibGU7Ci0Jc2xvdCA9IHRibC0+c2xvdHMgKyBhcmdzLT5jc2Ffc2xvdGlkOwogCiAJLyogU2V0IHVwIHJlcyBiZWZvcmUgZ3JhYmJpbmcgdGhlIHNwaW5sb2NrICovCiAJbWVtY3B5KCZyZXMtPmNzcl9zZXNzaW9uaWQsICZhcmdzLT5jc2Ffc2Vzc2lvbmlkLApkaWZmIC0tZ2l0IGEvZnMvbmZzL2NsaWVudC5jIGIvZnMvbmZzL2NsaWVudC5jCmluZGV4IDAwM2ViY2UuLjFlMTA2NzggMTAwNjQ0Ci0tLSBhL2ZzL25mcy9jbGllbnQuYworKysgYi9mcy9uZnMvY2xpZW50LmMKQEAgLTQyNiw3ICs0MjYsNyBAQAogICogSW5pdGlhbGlzZSB0aGUgdGltZW91dCB2YWx1ZXMgZm9yIGEgY29ubmVjdGlvbgogICovCiB2b2lkIG5mc19pbml0X3RpbWVvdXRfdmFsdWVzKHN0cnVjdCBycGNfdGltZW91dCAqdG8sIGludCBwcm90bywKLQkJCQkgICAgdW5zaWduZWQgaW50IHRpbWVvLCB1bnNpZ25lZCBpbnQgcmV0cmFucykKKwkJCQkgICAgaW50IHRpbWVvLCBpbnQgcmV0cmFucykKIHsKIAl0by0+dG9faW5pdHZhbCA9IHRpbWVvICogSFogLyAxMDsKIAl0by0+dG9fcmV0cmllcyA9IHJldHJhbnM7CkBAIC00MzQsOSArNDM0LDkgQEAKIAlzd2l0Y2ggKHByb3RvKSB7CiAJY2FzZSBYUFJUX1RSQU5TUE9SVF9UQ1A6CiAJY2FzZSBYUFJUX1RSQU5TUE9SVF9SRE1BOgotCQlpZiAodG8tPnRvX3JldHJpZXMgPT0gMCkKKwkJaWYgKHJldHJhbnMgPT0gTkZTX1VOU1BFQ19SRVRSQU5TKQogCQkJdG8tPnRvX3JldHJpZXMgPSBORlNfREVGX1RDUF9SRVRSQU5TOwotCQlpZiAodG8tPnRvX2luaXR2YWwgPT0gMCkKKwkJaWYgKHRpbWVvID09IE5GU19VTlNQRUNfVElNRU8gfHwgdG8tPnRvX3JldHJpZXMgPT0gMCkKIAkJCXRvLT50b19pbml0dmFsID0gTkZTX0RFRl9UQ1BfVElNRU8gKiBIWiAvIDEwOwogCQlpZiAodG8tPnRvX2luaXR2YWwgPiBORlNfTUFYX1RDUF9USU1FT1VUKQogCQkJdG8tPnRvX2luaXR2YWwgPSBORlNfTUFYX1RDUF9USU1FT1VUOwpAQCAtNDQ5LDkgKzQ0OSw5IEBACiAJCXRvLT50b19leHBvbmVudGlhbCA9IDA7CiAJCWJyZWFrOwogCWNhc2UgWFBSVF9UUkFOU1BPUlRfVURQOgotCQlpZiAodG8tPnRvX3JldHJpZXMgPT0gMCkKKwkJaWYgKHJldHJhbnMgPT0gTkZTX1VOU1BFQ19SRVRSQU5TKQogCQkJdG8tPnRvX3JldHJpZXMgPSBORlNfREVGX1VEUF9SRVRSQU5TOwotCQlpZiAoIXRvLT50b19pbml0dmFsKQorCQlpZiAodGltZW8gPT0gTkZTX1VOU1BFQ19USU1FTyB8fCB0by0+dG9faW5pdHZhbCA9PSAwKQogCQkJdG8tPnRvX2luaXR2YWwgPSBORlNfREVGX1VEUF9USU1FTyAqIEhaIC8gMTA7CiAJCWlmICh0by0+dG9faW5pdHZhbCA+IE5GU19NQVhfVURQX1RJTUVPVVQpCiAJCQl0by0+dG9faW5pdHZhbCA9IE5GU19NQVhfVURQX1RJTUVPVVQ7CmRpZmYgLS1naXQgYS9mcy9uZnMvZmlsZS5jIGIvZnMvbmZzL2ZpbGUuYwppbmRleCA3ZDYyMDk3Li5jYTY5OWRkIDEwMDY0NAotLS0gYS9mcy9uZnMvZmlsZS5jCisrKyBiL2ZzL25mcy9maWxlLmMKQEAgLTY1Nyw3ICs2NTcsMTAgQEAKIAlpZiAocmVzdWx0IDw9IDApCiAJCWdvdG8gb3V0OwogCi0Jd3JpdHRlbiA9IGdlbmVyaWNfd3JpdGVfc3luYyhpb2NiLCByZXN1bHQpOworCXJlc3VsdCA9IGdlbmVyaWNfd3JpdGVfc3luYyhpb2NiLCByZXN1bHQpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIG91dDsKKwl3cml0dGVuID0gcmVzdWx0OwogCWlvY2ItPmtpX3BvcyArPSB3cml0dGVuOwogCiAJLyogUmV0dXJuIGVycm9yIHZhbHVlcyAqLwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2ZsZXhmaWxlbGF5b3V0L2ZsZXhmaWxlbGF5b3V0LmMgYi9mcy9uZnMvZmxleGZpbGVsYXlvdXQvZmxleGZpbGVsYXlvdXQuYwppbmRleCBlNjIwNmVhLi41MWI1MTM2IDEwMDY0NAotLS0gYS9mcy9uZnMvZmxleGZpbGVsYXlvdXQvZmxleGZpbGVsYXlvdXQuYworKysgYi9mcy9uZnMvZmxleGZpbGVsYXlvdXQvZmxleGZpbGVsYXlvdXQuYwpAQCAtMzcsNiArMzcsNyBAQAogCWlmIChmZmwpIHsKIAkJSU5JVF9MSVNUX0hFQUQoJmZmbC0+ZXJyb3JfbGlzdCk7CiAJCUlOSVRfTElTVF9IRUFEKCZmZmwtPm1pcnJvcnMpOworCQlmZmwtPmxhc3RfcmVwb3J0X3RpbWUgPSBrdGltZV9nZXQoKTsKIAkJcmV0dXJuICZmZmwtPmdlbmVyaWNfaGRyOwogCX0gZWxzZQogCQlyZXR1cm4gTlVMTDsKQEAgLTY0MCwxOSArNjQxLDE4IEBACiB7CiAJc3RhdGljIGNvbnN0IGt0aW1lX3Qgbm90aW1lID0gezB9OwogCXM2NCByZXBvcnRfaW50ZXJ2YWwgPSBGRl9MQVlPVVRTVEFUU19SRVBPUlRfSU5URVJWQUw7CisJc3RydWN0IG5mczRfZmxleGZpbGVfbGF5b3V0ICpmZmwgPSBGRl9MQVlPVVRfRlJPTV9IRFIobWlycm9yLT5sYXlvdXQpOwogCiAJbmZzNF9mZl9zdGFydF9idXN5X3RpbWVyKCZsYXlvdXRzdGF0LT5idXN5X3RpbWVyLCBub3cpOwogCWlmIChrdGltZV9lcXVhbChtaXJyb3ItPnN0YXJ0X3RpbWUsIG5vdGltZSkpCiAJCW1pcnJvci0+c3RhcnRfdGltZSA9IG5vdzsKLQlpZiAoa3RpbWVfZXF1YWwobWlycm9yLT5sYXN0X3JlcG9ydF90aW1lLCBub3RpbWUpKQotCQltaXJyb3ItPmxhc3RfcmVwb3J0X3RpbWUgPSBub3c7CiAJaWYgKG1pcnJvci0+cmVwb3J0X2ludGVydmFsICE9IDApCiAJCXJlcG9ydF9pbnRlcnZhbCA9IChzNjQpbWlycm9yLT5yZXBvcnRfaW50ZXJ2YWwgKiAxMDAwTEw7CiAJZWxzZSBpZiAobGF5b3V0c3RhdHNfdGltZXIgIT0gMCkKIAkJcmVwb3J0X2ludGVydmFsID0gKHM2NClsYXlvdXRzdGF0c190aW1lciAqIDEwMDBMTDsKLQlpZiAoa3RpbWVfdG9fbXMoa3RpbWVfc3ViKG5vdywgbWlycm9yLT5sYXN0X3JlcG9ydF90aW1lKSkgPj0KKwlpZiAoa3RpbWVfdG9fbXMoa3RpbWVfc3ViKG5vdywgZmZsLT5sYXN0X3JlcG9ydF90aW1lKSkgPj0KIAkJCXJlcG9ydF9pbnRlcnZhbCkgewotCQltaXJyb3ItPmxhc3RfcmVwb3J0X3RpbWUgPSBub3c7CisJCWZmbC0+bGFzdF9yZXBvcnRfdGltZSA9IG5vdzsKIAkJcmV0dXJuIHRydWU7CiAJfQogCkBAIC04MDYsMTEgKzgwNiwxNCBAQAogewogCXN0cnVjdCBuZnM0X2ZmX2xheW91dF9zZWdtZW50ICpmbHMgPSBGRl9MQVlPVVRfTFNFRyhsc2VnKTsKIAlzdHJ1Y3QgbmZzNF9wbmZzX2RzICpkczsKKwlib29sIGZhaWxfcmV0dXJuID0gZmFsc2U7CiAJaW50IGlkeDsKIAogCS8qIG1pcnJvcnMgYXJlIHNvcnRlZCBieSBlZmZpY2llbmN5ICovCiAJZm9yIChpZHggPSBzdGFydF9pZHg7IGlkeCA8IGZscy0+bWlycm9yX2FycmF5X2NudDsgaWR4KyspIHsKLQkJZHMgPSBuZnM0X2ZmX2xheW91dF9wcmVwYXJlX2RzKGxzZWcsIGlkeCwgZmFsc2UpOworCQlpZiAoaWR4KzEgPT0gZmxzLT5taXJyb3JfYXJyYXlfY250KQorCQkJZmFpbF9yZXR1cm4gPSB0cnVlOworCQlkcyA9IG5mczRfZmZfbGF5b3V0X3ByZXBhcmVfZHMobHNlZywgaWR4LCBmYWlsX3JldHVybik7CiAJCWlmIChkcykgewogCQkJKmJlc3RfaWR4ID0gaWR4OwogCQkJcmV0dXJuIGRzOwpAQCAtODU5LDYgKzg2Miw3IEBACiAJc3RydWN0IG5mczRfcG5mc19kcyAqZHM7CiAJaW50IGRzX2lkeDsKIAorcmV0cnk6CiAJLyogVXNlIGZ1bGwgbGF5b3V0IGZvciBub3cgKi8KIAlpZiAoIXBnaW8tPnBnX2xzZWcpCiAJCWZmX2xheW91dF9wZ19nZXRfcmVhZChwZ2lvLCByZXEsIGZhbHNlKTsKQEAgLTg3MSwxMCArODc1LDEzIEBACiAKIAlkcyA9IGZmX2xheW91dF9jaG9vc2VfYmVzdF9kc19mb3JfcmVhZChwZ2lvLT5wZ19sc2VnLCAwLCAmZHNfaWR4KTsKIAlpZiAoIWRzKSB7Ci0JCWlmIChmZl9sYXlvdXRfbm9fZmFsbGJhY2tfdG9fbWRzKHBnaW8tPnBnX2xzZWcpKQotCQkJZ290byBvdXRfcG5mczsKLQkJZWxzZQorCQlpZiAoIWZmX2xheW91dF9ub19mYWxsYmFja190b19tZHMocGdpby0+cGdfbHNlZykpCiAJCQlnb3RvIG91dF9tZHM7CisJCXBuZnNfcHV0X2xzZWcocGdpby0+cGdfbHNlZyk7CisJCXBnaW8tPnBnX2xzZWcgPSBOVUxMOworCQkvKiBTbGVlcCBmb3IgMSBzZWNvbmQgYmVmb3JlIHJldHJ5aW5nICovCisJCXNzbGVlcCgxKTsKKwkJZ290byByZXRyeTsKIAl9CiAKIAltaXJyb3IgPSBGRl9MQVlPVVRfQ09NUChwZ2lvLT5wZ19sc2VnLCBkc19pZHgpOwpAQCAtODkwLDEyICs4OTcsNiBAQAogCXBuZnNfcHV0X2xzZWcocGdpby0+cGdfbHNlZyk7CiAJcGdpby0+cGdfbHNlZyA9IE5VTEw7CiAJbmZzX3BhZ2Vpb19yZXNldF9yZWFkX21kcyhwZ2lvKTsKLQlyZXR1cm47Ci0KLW91dF9wbmZzOgotCXBuZnNfc2V0X2xvX2ZhaWwocGdpby0+cGdfbHNlZyk7Ci0JcG5mc19wdXRfbHNlZyhwZ2lvLT5wZ19sc2VnKTsKLQlwZ2lvLT5wZ19sc2VnID0gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTkwOSw2ICs5MTAsNyBAQAogCWludCBpOwogCWludCBzdGF0dXM7CiAKK3JldHJ5OgogCWlmICghcGdpby0+cGdfbHNlZykgewogCQlwZ2lvLT5wZ19sc2VnID0gcG5mc191cGRhdGVfbGF5b3V0KHBnaW8tPnBnX2lub2RlLAogCQkJCQkJICAgcmVxLT53Yl9jb250ZXh0LApAQCAtOTQwLDEwICs5NDIsMTMgQEAKIAlmb3IgKGkgPSAwOyBpIDwgcGdpby0+cGdfbWlycm9yX2NvdW50OyBpKyspIHsKIAkJZHMgPSBuZnM0X2ZmX2xheW91dF9wcmVwYXJlX2RzKHBnaW8tPnBnX2xzZWcsIGksIHRydWUpOwogCQlpZiAoIWRzKSB7Ci0JCQlpZiAoZmZfbGF5b3V0X25vX2ZhbGxiYWNrX3RvX21kcyhwZ2lvLT5wZ19sc2VnKSkKLQkJCQlnb3RvIG91dF9wbmZzOwotCQkJZWxzZQorCQkJaWYgKCFmZl9sYXlvdXRfbm9fZmFsbGJhY2tfdG9fbWRzKHBnaW8tPnBnX2xzZWcpKQogCQkJCWdvdG8gb3V0X21kczsKKwkJCXBuZnNfcHV0X2xzZWcocGdpby0+cGdfbHNlZyk7CisJCQlwZ2lvLT5wZ19sc2VnID0gTlVMTDsKKwkJCS8qIFNsZWVwIGZvciAxIHNlY29uZCBiZWZvcmUgcmV0cnlpbmcgKi8KKwkJCXNzbGVlcCgxKTsKKwkJCWdvdG8gcmV0cnk7CiAJCX0KIAkJcGdtID0gJnBnaW8tPnBnX21pcnJvcnNbaV07CiAJCW1pcnJvciA9IEZGX0xBWU9VVF9DT01QKHBnaW8tPnBnX2xzZWcsIGkpOwpAQCAtOTU2LDEyICs5NjEsNiBAQAogCXBuZnNfcHV0X2xzZWcocGdpby0+cGdfbHNlZyk7CiAJcGdpby0+cGdfbHNlZyA9IE5VTEw7CiAJbmZzX3BhZ2Vpb19yZXNldF93cml0ZV9tZHMocGdpbyk7Ci0JcmV0dXJuOwotCi1vdXRfcG5mczoKLQlwbmZzX3NldF9sb19mYWlsKHBnaW8tPnBnX2xzZWcpOwotCXBuZnNfcHV0X2xzZWcocGdpby0+cGdfbHNlZyk7Ci0JcGdpby0+cGdfbHNlZyA9IE5VTEw7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKZGlmZiAtLWdpdCBhL2ZzL25mcy9mbGV4ZmlsZWxheW91dC9mbGV4ZmlsZWxheW91dC5oIGIvZnMvbmZzL2ZsZXhmaWxlbGF5b3V0L2ZsZXhmaWxlbGF5b3V0LmgKaW5kZXggMWJjZGIxNS4uM2VlMGM5ZiAxMDA2NDQKLS0tIGEvZnMvbmZzL2ZsZXhmaWxlbGF5b3V0L2ZsZXhmaWxlbGF5b3V0LmgKKysrIGIvZnMvbmZzL2ZsZXhmaWxlbGF5b3V0L2ZsZXhmaWxlbGF5b3V0LmgKQEAgLTg0LDcgKzg0LDYgQEAKIAlzdHJ1Y3QgbmZzNF9mZl9sYXlvdXRzdGF0CXJlYWRfc3RhdDsKIAlzdHJ1Y3QgbmZzNF9mZl9sYXlvdXRzdGF0CXdyaXRlX3N0YXQ7CiAJa3RpbWVfdAkJCQlzdGFydF90aW1lOwotCWt0aW1lX3QJCQkJbGFzdF9yZXBvcnRfdGltZTsKIAl1MzIJCQkJcmVwb3J0X2ludGVydmFsOwogfTsKIApAQCAtMTAxLDYgKzEwMCw3IEBACiAJc3RydWN0IHBuZnNfZHNfY29tbWl0X2luZm8gY29tbWl0X2luZm87CiAJc3RydWN0IGxpc3RfaGVhZAltaXJyb3JzOwogCXN0cnVjdCBsaXN0X2hlYWQJZXJyb3JfbGlzdDsgLyogbmZzNF9mZl9sYXlvdXRfZHNfZXJyICovCisJa3RpbWVfdAkJCWxhc3RfcmVwb3J0X3RpbWU7IC8qIExheW91dHN0YXQgcmVwb3J0IHRpbWVzICovCiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuZnM0X2ZsZXhmaWxlX2xheW91dCAqCmRpZmYgLS1naXQgYS9mcy9uZnMvZmxleGZpbGVsYXlvdXQvZmxleGZpbGVsYXlvdXRkZXYuYyBiL2ZzL25mcy9mbGV4ZmlsZWxheW91dC9mbGV4ZmlsZWxheW91dGRldi5jCmluZGV4IDBhYTM2YmUuLmY3YTNmNmIgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9mbGV4ZmlsZWxheW91dC9mbGV4ZmlsZWxheW91dGRldi5jCisrKyBiL2ZzL25mcy9mbGV4ZmlsZWxheW91dC9mbGV4ZmlsZWxheW91dGRldi5jCkBAIC0xNyw4ICsxNyw4IEBACiAKICNkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZCQlORlNEQkdfUE5GU19MRAogCi1zdGF0aWMgdW5zaWduZWQgaW50IGRhdGFzZXJ2ZXJfdGltZW8gPSBORlM0X0RFRl9EU19USU1FTzsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZGF0YXNlcnZlcl9yZXRyYW5zID0gTkZTNF9ERUZfRFNfUkVUUkFOUzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGF0YXNlcnZlcl90aW1lbyA9IE5GU19ERUZfVENQX1JFVFJBTlM7CitzdGF0aWMgdW5zaWduZWQgaW50IGRhdGFzZXJ2ZXJfcmV0cmFuczsKIAogdm9pZCBuZnM0X2ZmX2xheW91dF9wdXRfZGV2aWNlaWQoc3RydWN0IG5mczRfZmZfbGF5b3V0X2RzICptaXJyb3JfZHMpCiB7CkBAIC0zNzksNyArMzc5LDcgQEAKIAogCWRldmlkID0gJm1pcnJvci0+bWlycm9yX2RzLT5pZF9ub2RlOwogCWlmIChmZl9sYXlvdXRfdGVzdF9kZXZpZF91bmF2YWlsYWJsZShkZXZpZCkpCi0JCWdvdG8gb3V0OworCQlnb3RvIG91dF9mYWlsOwogCiAJZHMgPSBtaXJyb3ItPm1pcnJvcl9kcy0+ZHM7CiAJLyogbWF0Y2hpbmcgc21wX3dtYigpIGluIF9uZnM0X3BuZnNfdjMvNF9kc19jb25uZWN0ICovCkBAIC00MDUsMTUgKzQwNSwxNiBAQAogCQkJbWlycm9yLT5taXJyb3JfZHMtPmRzX3ZlcnNpb25zWzBdLnJzaXplID0gbWF4X3BheWxvYWQ7CiAJCWlmIChtaXJyb3ItPm1pcnJvcl9kcy0+ZHNfdmVyc2lvbnNbMF0ud3NpemUgPiBtYXhfcGF5bG9hZCkKIAkJCW1pcnJvci0+bWlycm9yX2RzLT5kc192ZXJzaW9uc1swXS53c2l6ZSA9IG1heF9wYXlsb2FkOwotCX0gZWxzZSB7Ci0JCWZmX2xheW91dF90cmFja19kc19lcnJvcihGRl9MQVlPVVRfRlJPTV9IRFIobHNlZy0+cGxzX2xheW91dCksCi0JCQkJCSBtaXJyb3IsIGxzZWctPnBsc19yYW5nZS5vZmZzZXQsCi0JCQkJCSBsc2VnLT5wbHNfcmFuZ2UubGVuZ3RoLCBORlM0RVJSX05YSU8sCi0JCQkJCSBPUF9JTExFR0FMLCBHRlBfTk9JTyk7Ci0JCWlmIChmYWlsX3JldHVybiB8fCAhZmZfbGF5b3V0X2hhc19hdmFpbGFibGVfZHMobHNlZykpCi0JCQlwbmZzX2Vycm9yX21hcmtfbGF5b3V0X2Zvcl9yZXR1cm4oaW5vLCBsc2VnKTsKLQkJZHMgPSBOVUxMOworCQlnb3RvIG91dDsKIAl9CisJZmZfbGF5b3V0X3RyYWNrX2RzX2Vycm9yKEZGX0xBWU9VVF9GUk9NX0hEUihsc2VnLT5wbHNfbGF5b3V0KSwKKwkJCQkgbWlycm9yLCBsc2VnLT5wbHNfcmFuZ2Uub2Zmc2V0LAorCQkJCSBsc2VnLT5wbHNfcmFuZ2UubGVuZ3RoLCBORlM0RVJSX05YSU8sCisJCQkJIE9QX0lMTEVHQUwsIEdGUF9OT0lPKTsKK291dF9mYWlsOgorCWlmIChmYWlsX3JldHVybiB8fCAhZmZfbGF5b3V0X2hhc19hdmFpbGFibGVfZHMobHNlZykpCisJCXBuZnNfZXJyb3JfbWFya19sYXlvdXRfZm9yX3JldHVybihpbm8sIGxzZWcpOworCWRzID0gTlVMTDsKIG91dDoKIAlyZXR1cm4gZHM7CiB9CmRpZmYgLS1naXQgYS9mcy9uZnMvaW50ZXJuYWwuaCBiL2ZzL25mcy9pbnRlcm5hbC5oCmluZGV4IDdjZTVlMDIuLjc0OTM1YTEgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9pbnRlcm5hbC5oCisrKyBiL2ZzL25mcy9pbnRlcm5hbC5oCkBAIC01OCw2ICs1OCw5IEBACiAgKi8KICNkZWZpbmUgTkZTX1VOU1BFQ19QT1JUCQkoLTEpCiAKKyNkZWZpbmUgTkZTX1VOU1BFQ19SRVRSQU5TCShVSU5UX01BWCkKKyNkZWZpbmUgTkZTX1VOU1BFQ19USU1FTwkoVUlOVF9NQVgpCisKIC8qCiAgKiBNYXhpbXVtIG51bWJlciBvZiBwYWdlcyB0aGF0IHJlYWRkaXIgY2FuIHVzZSBmb3IgY3JlYXRpbmcKICAqIGEgdm1hcHBlZCBhcnJheSBvZiBwYWdlcy4KQEAgLTE1Niw3ICsxNTksNyBAQAogaW50IG5mc19wcm9iZV9mc2luZm8oc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IG5mc19maCAqLCBzdHJ1Y3QgbmZzX2ZhdHRyICopOwogdm9pZCBuZnNfc2VydmVyX2luc2VydF9saXN0cyhzdHJ1Y3QgbmZzX3NlcnZlciAqKTsKIHZvaWQgbmZzX3NlcnZlcl9yZW1vdmVfbGlzdHMoc3RydWN0IG5mc19zZXJ2ZXIgKik7Ci12b2lkIG5mc19pbml0X3RpbWVvdXRfdmFsdWVzKHN0cnVjdCBycGNfdGltZW91dCAqLCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKK3ZvaWQgbmZzX2luaXRfdGltZW91dF92YWx1ZXMoc3RydWN0IHJwY190aW1lb3V0ICp0bywgaW50IHByb3RvLCBpbnQgdGltZW8sIGludCByZXRyYW5zKTsKIGludCBuZnNfaW5pdF9zZXJ2ZXJfcnBjY2xpZW50KHN0cnVjdCBuZnNfc2VydmVyICosIGNvbnN0IHN0cnVjdCBycGNfdGltZW91dCAqdCwKIAkJcnBjX2F1dGhmbGF2b3JfdCk7CiBzdHJ1Y3QgbmZzX3NlcnZlciAqbmZzX2FsbG9jX3NlcnZlcih2b2lkKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0MnByb2MuYyBiL2ZzL25mcy9uZnM0MnByb2MuYwppbmRleCA2ZjQ3NTI3Li42NGI0M2I0IDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNDJwcm9jLmMKKysrIGIvZnMvbmZzL25mczQycHJvYy5jCkBAIC0zMTgsMTAgKzMxOCwyMiBAQAogbmZzNDJfbGF5b3V0c3RhdF9wcmVwYXJlKHN0cnVjdCBycGNfdGFzayAqdGFzaywgdm9pZCAqY2FsbGRhdGEpCiB7CiAJc3RydWN0IG5mczQyX2xheW91dHN0YXRfZGF0YSAqZGF0YSA9IGNhbGxkYXRhOwotCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGRhdGEtPmFyZ3MuaW5vZGUpOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkYXRhLT5pbm9kZTsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihpbm9kZSk7CisJc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG87CiAKKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCWxvID0gTkZTX0koaW5vZGUpLT5sYXlvdXQ7CisJaWYgKCFwbmZzX2xheW91dF9pc192YWxpZChsbykpIHsKKwkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQlycGNfZXhpdCh0YXNrLCAwKTsKKwkJcmV0dXJuOworCX0KKwluZnM0X3N0YXRlaWRfY29weSgmZGF0YS0+YXJncy5zdGF0ZWlkLCAmbG8tPnBsaF9zdGF0ZWlkKTsKKwlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiAJbmZzNDFfc2V0dXBfc2VxdWVuY2UobmZzNF9nZXRfc2Vzc2lvbihzZXJ2ZXIpLCAmZGF0YS0+YXJncy5zZXFfYXJncywKIAkJCSAgICAgJmRhdGEtPnJlcy5zZXFfcmVzLCB0YXNrKTsKKwogfQogCiBzdGF0aWMgdm9pZApAQCAtMzQxLDExICszNTMsMTEgQEAKIAljYXNlIC1ORlM0RVJSX0FETUlOX1JFVk9LRUQ6CiAJY2FzZSAtTkZTNEVSUl9ERUxFR19SRVZPS0VEOgogCWNhc2UgLU5GUzRFUlJfU1RBTEVfU1RBVEVJRDoKLQljYXNlIC1ORlM0RVJSX09MRF9TVEFURUlEOgogCWNhc2UgLU5GUzRFUlJfQkFEX1NUQVRFSUQ6CiAJCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CiAJCWxvID0gTkZTX0koaW5vZGUpLT5sYXlvdXQ7Ci0JCWlmIChsbyAmJiBuZnM0X3N0YXRlaWRfbWF0Y2goJmRhdGEtPmFyZ3Muc3RhdGVpZCwKKwkJaWYgKHBuZnNfbGF5b3V0X2lzX3ZhbGlkKGxvKSAmJgorCQkgICAgbmZzNF9zdGF0ZWlkX21hdGNoKCZkYXRhLT5hcmdzLnN0YXRlaWQsCiAJCQkJCSAgICAgJmxvLT5wbGhfc3RhdGVpZCkpIHsKIAkJCUxJU1RfSEVBRChoZWFkKTsKIApAQCAtMzU5LDExICszNzEsMjMgQEAKIAkJfSBlbHNlCiAJCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiAJCWJyZWFrOworCWNhc2UgLU5GUzRFUlJfT0xEX1NUQVRFSUQ6CisJCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJCWxvID0gTkZTX0koaW5vZGUpLT5sYXlvdXQ7CisJCWlmIChwbmZzX2xheW91dF9pc192YWxpZChsbykgJiYKKwkJICAgIG5mczRfc3RhdGVpZF9tYXRjaF9vdGhlcigmZGF0YS0+YXJncy5zdGF0ZWlkLAorCQkJCQkmbG8tPnBsaF9zdGF0ZWlkKSkgeworCQkJLyogRG8gd2UgbmVlZCB0byBkZWxheSBiZWZvcmUgcmVzZW5kaW5nPyAqLworCQkJaWYgKCFuZnM0X3N0YXRlaWRfaXNfbmV3ZXIoJmxvLT5wbGhfc3RhdGVpZCwKKwkJCQkJCSZkYXRhLT5hcmdzLnN0YXRlaWQpKQorCQkJCXJwY19kZWxheSh0YXNrLCBIWik7CisJCQlycGNfcmVzdGFydF9jYWxsX3ByZXBhcmUodGFzayk7CisJCX0KKwkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQlicmVhazsKIAljYXNlIC1FTk9UU1VQUDoKIAljYXNlIC1FT1BOT1RTVVBQOgogCQlORlNfU0VSVkVSKGlub2RlKS0+Y2FwcyAmPSB+TkZTX0NBUF9MQVlPVVRTVEFUUzsKLQlkZWZhdWx0OgotCQlicmVhazsKIAl9CiAKIAlkcHJpbnRrKCIlcyBzZXJ2ZXIgcmV0dXJucyAlZFxuIiwgX19mdW5jX18sIHRhc2stPnRrX3N0YXR1cyk7CmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNGNsaWVudC5jIGIvZnMvbmZzL25mczRjbGllbnQuYwppbmRleCA4ZDdkMDhkLi5jZDNiN2NmIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNGNsaWVudC5jCisrKyBiL2ZzL25mcy9uZnM0Y2xpZW50LmMKQEAgLTgxNyw2ICs4MTcsMTEgQEAKIAkJZ290byBlcnJvcjsKIAl9CiAKKwlpZiAoc2VydmVyLT5uZnNfY2xpZW50ID09IGNscCkgeworCQllcnJvciA9IC1FTE9PUDsKKwkJZ290byBlcnJvcjsKKwl9CisKIAkvKgogCSAqIFF1ZXJ5IGZvciB0aGUgbGVhc2UgdGltZSBvbiBjbGllbnRpZCBzZXR1cCBvciByZW5ld2FsCiAJICoKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0cHJvYy5jIGIvZnMvbmZzL25mczRwcm9jLmMKaW5kZXggMTk0OWJiZC4uYTlkZWMzMiAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRwcm9jLmMKKysrIGIvZnMvbmZzL25mczRwcm9jLmMKQEAgLTYzNCwxNSArNjM0LDExIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChuZnM0MF9zZXR1cF9zZXF1ZW5jZSk7CiAKLXN0YXRpYyBpbnQgbmZzNDBfc2VxdWVuY2VfZG9uZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssCi0JCQkgICAgICAgc3RydWN0IG5mczRfc2VxdWVuY2VfcmVzICpyZXMpCitzdGF0aWMgdm9pZCBuZnM0MF9zZXF1ZW5jZV9mcmVlX3Nsb3Qoc3RydWN0IG5mczRfc2VxdWVuY2VfcmVzICpyZXMpCiB7CiAJc3RydWN0IG5mczRfc2xvdCAqc2xvdCA9IHJlcy0+c3Jfc2xvdDsKIAlzdHJ1Y3QgbmZzNF9zbG90X3RhYmxlICp0Ymw7CiAKLQlpZiAoc2xvdCA9PSBOVUxMKQotCQlnb3RvIG91dDsKLQogCXRibCA9IHNsb3QtPnRhYmxlOwogCXNwaW5fbG9jaygmdGJsLT5zbG90X3RibF9sb2NrKTsKIAlpZiAoIW5mczQxX3dha2VfYW5kX2Fzc2lnbl9zbG90KHRibCwgc2xvdCkpCkBAIC02NTAsNyArNjQ2LDEzIEBACiAJc3Bpbl91bmxvY2soJnRibC0+c2xvdF90YmxfbG9jayk7CiAKIAlyZXMtPnNyX3Nsb3QgPSBOVUxMOwotb3V0OgorfQorCitzdGF0aWMgaW50IG5mczQwX3NlcXVlbmNlX2RvbmUoc3RydWN0IHJwY190YXNrICp0YXNrLAorCQkJICAgICAgIHN0cnVjdCBuZnM0X3NlcXVlbmNlX3JlcyAqcmVzKQoreworCWlmIChyZXMtPnNyX3Nsb3QgIT0gTlVMTCkKKwkJbmZzNDBfc2VxdWVuY2VfZnJlZV9zbG90KHJlcyk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTY2Niw2ICs2NjgsMTEgQEAKIAl0YmwgPSBzbG90LT50YWJsZTsKIAlzZXNzaW9uID0gdGJsLT5zZXNzaW9uOwogCisJLyogQnVtcCB0aGUgc2xvdCBzZXF1ZW5jZSBudW1iZXIgKi8KKwlpZiAoc2xvdC0+c2VxX2RvbmUpCisJCXNsb3QtPnNlcV9ucisrOworCXNsb3QtPnNlcV9kb25lID0gMDsKKwogCXNwaW5fbG9jaygmdGJsLT5zbG90X3RibF9sb2NrKTsKIAkvKiBCZSBuaWNlIHRvIHRoZSBzZXJ2ZXI6IHRyeSB0byBlbnN1cmUgdGhhdCB0aGUgbGFzdCB0cmFuc21pdHRlZAogCSAqIHZhbHVlIGZvciBoaWdoZXN0X3VzZXJfc2xvdGlkIDw9IHRhcmdldF9oaWdoZXN0X3Nsb3RpZApAQCAtNjg2LDkgKzY5MywxMiBAQAogCXJlcy0+c3Jfc2xvdCA9IE5VTEw7CiAJaWYgKHNlbmRfbmV3X2hpZ2hlc3RfdXNlZF9zbG90aWQpCiAJCW5mczQxX25vdGlmeV9zZXJ2ZXIoc2Vzc2lvbi0+Y2xwKTsKKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmdGJsLT5zbG90X3dhaXRxKSkKKwkJd2FrZV91cF9hbGwoJnRibC0+c2xvdF93YWl0cSk7CiB9CiAKLWludCBuZnM0MV9zZXF1ZW5jZV9kb25lKHN0cnVjdCBycGNfdGFzayAqdGFzaywgc3RydWN0IG5mczRfc2VxdWVuY2VfcmVzICpyZXMpCitzdGF0aWMgaW50IG5mczQxX3NlcXVlbmNlX3Byb2Nlc3Moc3RydWN0IHJwY190YXNrICp0YXNrLAorCQlzdHJ1Y3QgbmZzNF9zZXF1ZW5jZV9yZXMgKnJlcykKIHsKIAlzdHJ1Y3QgbmZzNF9zZXNzaW9uICpzZXNzaW9uOwogCXN0cnVjdCBuZnM0X3Nsb3QgKnNsb3QgPSByZXMtPnNyX3Nsb3Q7CkBAIC03MTQsNyArNzI0LDcgQEAKIAlzd2l0Y2ggKHJlcy0+c3Jfc3RhdHVzKSB7CiAJY2FzZSAwOgogCQkvKiBVcGRhdGUgdGhlIHNsb3QncyBzZXF1ZW5jZSBhbmQgY2xpZW50aWQgbGVhc2UgdGltZXIgKi8KLQkJKytzbG90LT5zZXFfbnI7CisJCXNsb3QtPnNlcV9kb25lID0gMTsKIAkJY2xwID0gc2Vzc2lvbi0+Y2xwOwogCQlkb19yZW5ld19sZWFzZShjbHAsIHJlcy0+c3JfdGltZXN0YW1wKTsKIAkJLyogQ2hlY2sgc2VxdWVuY2UgZmxhZ3MgKi8KQEAgLTc2OSwxNiArNzc5LDE2IEBACiAJCWdvdG8gcmV0cnlfbm93YWl0OwogCWRlZmF1bHQ6CiAJCS8qIEp1c3QgdXBkYXRlIHRoZSBzbG90IHNlcXVlbmNlIG5vLiAqLwotCQkrK3Nsb3QtPnNlcV9ucjsKKwkJc2xvdC0+c2VxX2RvbmUgPSAxOwogCX0KIG91dDoKIAkvKiBUaGUgc2Vzc2lvbiBtYXkgYmUgcmVzZXQgYnkgb25lIG9mIHRoZSBlcnJvciBoYW5kbGVycy4gKi8KIAlkcHJpbnRrKCIlczogRXJyb3IgJWQgZnJlZSB0aGUgc2xvdCBcbiIsIF9fZnVuY19fLCByZXMtPnNyX3N0YXR1cyk7Ci0JbmZzNDFfc2VxdWVuY2VfZnJlZV9zbG90KHJlcyk7CiBvdXRfbm9hY3Rpb246CiAJcmV0dXJuIHJldDsKIHJldHJ5X25vd2FpdDoKIAlpZiAocnBjX3Jlc3RhcnRfY2FsbF9wcmVwYXJlKHRhc2spKSB7CisJCW5mczQxX3NlcXVlbmNlX2ZyZWVfc2xvdChyZXMpOwogCQl0YXNrLT50a19zdGF0dXMgPSAwOwogCQlyZXQgPSAwOwogCX0KQEAgLTc4OSw4ICs3OTksMzcgQEAKIAlycGNfZGVsYXkodGFzaywgTkZTNF9QT0xMX1JFVFJZX01BWCk7CiAJcmV0dXJuIDA7CiB9CisKK2ludCBuZnM0MV9zZXF1ZW5jZV9kb25lKHN0cnVjdCBycGNfdGFzayAqdGFzaywgc3RydWN0IG5mczRfc2VxdWVuY2VfcmVzICpyZXMpCit7CisJaWYgKCFuZnM0MV9zZXF1ZW5jZV9wcm9jZXNzKHRhc2ssIHJlcykpCisJCXJldHVybiAwOworCWlmIChyZXMtPnNyX3Nsb3QgIT0gTlVMTCkKKwkJbmZzNDFfc2VxdWVuY2VfZnJlZV9zbG90KHJlcyk7CisJcmV0dXJuIDE7CisKK30KIEVYUE9SVF9TWU1CT0xfR1BMKG5mczQxX3NlcXVlbmNlX2RvbmUpOwogCitzdGF0aWMgaW50IG5mczRfc2VxdWVuY2VfcHJvY2VzcyhzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIHN0cnVjdCBuZnM0X3NlcXVlbmNlX3JlcyAqcmVzKQoreworCWlmIChyZXMtPnNyX3Nsb3QgPT0gTlVMTCkKKwkJcmV0dXJuIDE7CisJaWYgKHJlcy0+c3Jfc2xvdC0+dGFibGUtPnNlc3Npb24gIT0gTlVMTCkKKwkJcmV0dXJuIG5mczQxX3NlcXVlbmNlX3Byb2Nlc3ModGFzaywgcmVzKTsKKwlyZXR1cm4gbmZzNDBfc2VxdWVuY2VfZG9uZSh0YXNrLCByZXMpOworfQorCitzdGF0aWMgdm9pZCBuZnM0X3NlcXVlbmNlX2ZyZWVfc2xvdChzdHJ1Y3QgbmZzNF9zZXF1ZW5jZV9yZXMgKnJlcykKK3sKKwlpZiAocmVzLT5zcl9zbG90ICE9IE5VTEwpIHsKKwkJaWYgKHJlcy0+c3Jfc2xvdC0+dGFibGUtPnNlc3Npb24gIT0gTlVMTCkKKwkJCW5mczQxX3NlcXVlbmNlX2ZyZWVfc2xvdChyZXMpOworCQllbHNlCisJCQluZnM0MF9zZXF1ZW5jZV9mcmVlX3Nsb3QocmVzKTsKKwl9Cit9CisKIGludCBuZnM0X3NlcXVlbmNlX2RvbmUoc3RydWN0IHJwY190YXNrICp0YXNrLCBzdHJ1Y3QgbmZzNF9zZXF1ZW5jZV9yZXMgKnJlcykKIHsKIAlpZiAocmVzLT5zcl9zbG90ID09IE5VTEwpCkBAIC05MjAsNiArOTU5LDE3IEBACiAJCQkJICAgIGFyZ3MsIHJlcywgdGFzayk7CiB9CiAKK3N0YXRpYyBpbnQgbmZzNF9zZXF1ZW5jZV9wcm9jZXNzKHN0cnVjdCBycGNfdGFzayAqdGFzaywgc3RydWN0IG5mczRfc2VxdWVuY2VfcmVzICpyZXMpCit7CisJcmV0dXJuIG5mczQwX3NlcXVlbmNlX2RvbmUodGFzaywgcmVzKTsKK30KKworc3RhdGljIHZvaWQgbmZzNF9zZXF1ZW5jZV9mcmVlX3Nsb3Qoc3RydWN0IG5mczRfc2VxdWVuY2VfcmVzICpyZXMpCit7CisJaWYgKHJlcy0+c3Jfc2xvdCAhPSBOVUxMKQorCQluZnM0MF9zZXF1ZW5jZV9mcmVlX3Nsb3QocmVzKTsKK30KKwogaW50IG5mczRfc2VxdWVuY2VfZG9uZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssCiAJCSAgICAgICBzdHJ1Y3QgbmZzNF9zZXF1ZW5jZV9yZXMgKnJlcykKIHsKQEAgLTExOTcsNiArMTI0Nyw3IEBACiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHAtPmRlbnRyeS0+ZF9zYjsKIAogCW5mc19mcmVlX3NlcWlkKHAtPm9fYXJnLnNlcWlkKTsKKwluZnM0X3NlcXVlbmNlX2ZyZWVfc2xvdCgmcC0+b19yZXMuc2VxX3Jlcyk7CiAJaWYgKHAtPnN0YXRlICE9IE5VTEwpCiAJCW5mczRfcHV0X29wZW5fc3RhdGUocC0+c3RhdGUpOwogCW5mczRfcHV0X3N0YXRlX293bmVyKHAtPm93bmVyKTsKQEAgLTE2NTYsOSArMTcwNywxNCBAQAogc3RhdGljIHN0cnVjdCBuZnM0X3N0YXRlICoKIG5mczRfb3BlbmRhdGFfdG9fbmZzNF9zdGF0ZShzdHJ1Y3QgbmZzNF9vcGVuZGF0YSAqZGF0YSkKIHsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZSAqcmV0OworCiAJaWYgKGRhdGEtPm9fYXJnLmNsYWltID09IE5GUzRfT1BFTl9DTEFJTV9QUkVWSU9VUykKLQkJcmV0dXJuIF9uZnM0X29wZW5kYXRhX3JlY2xhaW1fdG9fbmZzNF9zdGF0ZShkYXRhKTsKLQlyZXR1cm4gX25mczRfb3BlbmRhdGFfdG9fbmZzNF9zdGF0ZShkYXRhKTsKKwkJcmV0ID1fbmZzNF9vcGVuZGF0YV9yZWNsYWltX3RvX25mczRfc3RhdGUoZGF0YSk7CisJZWxzZQorCQlyZXQgPSBfbmZzNF9vcGVuZGF0YV90b19uZnM0X3N0YXRlKGRhdGEpOworCW5mczRfc2VxdWVuY2VfZnJlZV9zbG90KCZkYXRhLT5vX3Jlcy5zZXFfcmVzKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKm5mczRfc3RhdGVfZmluZF9vcGVuX2NvbnRleHQoc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlKQpAQCAtMjA1Niw3ICsyMTEyLDcgQEAKIAogCWRhdGEtPnJwY19zdGF0dXMgPSB0YXNrLT50a19zdGF0dXM7CiAKLQlpZiAoIW5mczRfc2VxdWVuY2VfZG9uZSh0YXNrLCAmZGF0YS0+b19yZXMuc2VxX3JlcykpCisJaWYgKCFuZnM0X3NlcXVlbmNlX3Byb2Nlc3ModGFzaywgJmRhdGEtPm9fcmVzLnNlcV9yZXMpKQogCQlyZXR1cm47CiAKIAlpZiAodGFzay0+dGtfc3RhdHVzID09IDApIHsKQEAgLTc1MTQsMTIgKzc1NzAsMjAgQEAKIAlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKHNlc3Npb24tPmNscC0+Y2xfcnBjY2xpZW50LCAmbXNnLCBSUENfVEFTS19USU1FT1VUKTsKIAl0cmFjZV9uZnM0X2NyZWF0ZV9zZXNzaW9uKGNscCwgc3RhdHVzKTsKIAorCXN3aXRjaCAoc3RhdHVzKSB7CisJY2FzZSAtTkZTNEVSUl9TVEFMRV9DTElFTlRJRDoKKwljYXNlIC1ORlM0RVJSX0RFTEFZOgorCWNhc2UgLUVUSU1FRE9VVDoKKwljYXNlIC1FQUNDRVM6CisJY2FzZSAtRUFHQUlOOgorCQlnb3RvIG91dDsKKwl9OworCisJY2xwLT5jbF9zZXFpZCsrOwogCWlmICghc3RhdHVzKSB7CiAJCS8qIFZlcmlmeSB0aGUgc2Vzc2lvbidzIG5lZ290aWF0ZWQgY2hhbm5lbF9hdHRycyB2YWx1ZXMgKi8KIAkJc3RhdHVzID0gbmZzNF92ZXJpZnlfY2hhbm5lbF9hdHRycygmYXJncywgJnJlcyk7CiAJCS8qIEluY3JlbWVudCB0aGUgY2xpZW50aWQgc2xvdCBzZXF1ZW5jZSBpZCAqLwotCQlpZiAoY2xwLT5jbF9zZXFpZCA9PSByZXMuc2VxaWQpCi0JCQljbHAtPmNsX3NlcWlkKys7CiAJCWlmIChzdGF0dXMpCiAJCQlnb3RvIG91dDsKIAkJbmZzNF91cGRhdGVfc2Vzc2lvbihzZXNzaW9uLCAmcmVzKTsKQEAgLTc4NjQsNyArNzkyOCw3IEBACiAJc3RydWN0IG5mczRfbGF5b3V0Z2V0ICpsZ3AgPSBjYWxsZGF0YTsKIAogCWRwcmludGsoIi0tPiAlc1xuIiwgX19mdW5jX18pOwotCW5mczQxX3NlcXVlbmNlX2RvbmUodGFzaywgJmxncC0+cmVzLnNlcV9yZXMpOworCW5mczQxX3NlcXVlbmNlX3Byb2Nlc3ModGFzaywgJmxncC0+cmVzLnNlcV9yZXMpOwogCWRwcmludGsoIjwtLSAlc1xuIiwgX19mdW5jX18pOwogfQogCkBAIC04MDgwLDYgKzgxNDQsNyBAQAogCS8qIGlmIGxheW91dHAtPmxlbiBpcyAwLCBuZnM0X2xheW91dGdldF9wcmVwYXJlIGNhbGxlZCBycGNfZXhpdCAqLwogCWlmIChzdGF0dXMgPT0gMCAmJiBsZ3AtPnJlcy5sYXlvdXRwLT5sZW4pCiAJCWxzZWcgPSBwbmZzX2xheW91dF9wcm9jZXNzKGxncCk7CisJbmZzNF9zZXF1ZW5jZV9mcmVlX3Nsb3QoJmxncC0+cmVzLnNlcV9yZXMpOwogCXJwY19wdXRfdGFzayh0YXNrKTsKIAlkcHJpbnRrKCI8LS0gJXMgc3RhdHVzPSVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAlpZiAoc3RhdHVzKQpAQCAtODEwNiw3ICs4MTcxLDcgQEAKIAogCWRwcmludGsoIi0tPiAlc1xuIiwgX19mdW5jX18pOwogCi0JaWYgKCFuZnM0MV9zZXF1ZW5jZV9kb25lKHRhc2ssICZscnAtPnJlcy5zZXFfcmVzKSkKKwlpZiAoIW5mczQxX3NlcXVlbmNlX3Byb2Nlc3ModGFzaywgJmxycC0+cmVzLnNlcV9yZXMpKQogCQlyZXR1cm47CiAKIAlzZXJ2ZXIgPSBORlNfU0VSVkVSKGxycC0+YXJncy5pbm9kZSk7CkBAIC04MTE4LDYgKzgxODMsNyBAQAogCWNhc2UgLU5GUzRFUlJfREVMQVk6CiAJCWlmIChuZnM0X2FzeW5jX2hhbmRsZV9lcnJvcih0YXNrLCBzZXJ2ZXIsIE5VTEwsIE5VTEwpICE9IC1FQUdBSU4pCiAJCQlicmVhazsKKwkJbmZzNF9zZXF1ZW5jZV9mcmVlX3Nsb3QoJmxycC0+cmVzLnNlcV9yZXMpOwogCQlycGNfcmVzdGFydF9jYWxsX3ByZXBhcmUodGFzayk7CiAJCXJldHVybjsKIAl9CkBAIC04MTMyLDEyICs4MTk4LDE2IEBACiAKIAlkcHJpbnRrKCItLT4gJXNcbiIsIF9fZnVuY19fKTsKIAlzcGluX2xvY2soJmxvLT5wbGhfaW5vZGUtPmlfbG9jayk7Ci0JcG5mc19tYXJrX21hdGNoaW5nX2xzZWdzX2ludmFsaWQobG8sICZmcmVlbWUsICZscnAtPmFyZ3MucmFuZ2UsCi0JCQliZTMyX3RvX2NwdShscnAtPmFyZ3Muc3RhdGVpZC5zZXFpZCkpOwotCWlmIChscnAtPnJlcy5scnNfcHJlc2VudCAmJiBwbmZzX2xheW91dF9pc192YWxpZChsbykpCisJaWYgKGxycC0+cmVzLmxyc19wcmVzZW50KSB7CisJCXBuZnNfbWFya19tYXRjaGluZ19sc2Vnc19pbnZhbGlkKGxvLCAmZnJlZW1lLAorCQkJCSZscnAtPmFyZ3MucmFuZ2UsCisJCQkJYmUzMl90b19jcHUobHJwLT5hcmdzLnN0YXRlaWQuc2VxaWQpKTsKIAkJcG5mc19zZXRfbGF5b3V0X3N0YXRlaWQobG8sICZscnAtPnJlcy5zdGF0ZWlkLCB0cnVlKTsKKwl9IGVsc2UKKwkJcG5mc19tYXJrX2xheW91dF9zdGF0ZWlkX2ludmFsaWQobG8sICZmcmVlbWUpOwogCXBuZnNfY2xlYXJfbGF5b3V0cmV0dXJuX3dhaXRiaXQobG8pOwogCXNwaW5fdW5sb2NrKCZsby0+cGxoX2lub2RlLT5pX2xvY2spOworCW5mczRfc2VxdWVuY2VfZnJlZV9zbG90KCZscnAtPnJlcy5zZXFfcmVzKTsKIAlwbmZzX2ZyZWVfbHNlZ19saXN0KCZmcmVlbWUpOwogCXBuZnNfcHV0X2xheW91dF9oZHIobHJwLT5hcmdzLmxheW91dCk7CiAJbmZzX2lwdXRfYW5kX2RlYWN0aXZlKGxycC0+aW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczRzZXNzaW9uLmMgYi9mcy9uZnMvbmZzNHNlc3Npb24uYwppbmRleCAzMzJkMDZlLi5iNjI5NzMwIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNHNlc3Npb24uYworKysgYi9mcy9uZnMvbmZzNHNlc3Npb24uYwpAQCAtMjgsNiArMjgsNyBAQAogCXRibC0+aGlnaGVzdF91c2VkX3Nsb3RpZCA9IE5GUzRfTk9fU0xPVDsKIAlzcGluX2xvY2tfaW5pdCgmdGJsLT5zbG90X3RibF9sb2NrKTsKIAlycGNfaW5pdF9wcmlvcml0eV93YWl0X3F1ZXVlKCZ0YmwtPnNsb3RfdGJsX3dhaXRxLCBxdWV1ZSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmdGJsLT5zbG90X3dhaXRxKTsKIAlpbml0X2NvbXBsZXRpb24oJnRibC0+Y29tcGxldGUpOwogfQogCkBAIC0xNzIsNiArMTczLDU4IEBACiAJcmV0dXJuIEVSUl9QVFIoLUUyQklHKTsKIH0KIAorc3RhdGljIGludCBuZnM0X3Nsb3RfZ2V0X3NlcWlkKHN0cnVjdCBuZnM0X3Nsb3RfdGFibGUgICp0YmwsIHUzMiBzbG90aWQsCisJCXUzMiAqc2VxX25yKQorCV9fbXVzdF9ob2xkKCZ0YmwtPnNsb3RfdGJsX2xvY2spCit7CisJc3RydWN0IG5mczRfc2xvdCAqc2xvdDsKKworCXNsb3QgPSBuZnM0X2xvb2t1cF9zbG90KHRibCwgc2xvdGlkKTsKKwlpZiAoSVNfRVJSKHNsb3QpKQorCQlyZXR1cm4gUFRSX0VSUihzbG90KTsKKwkqc2VxX25yID0gc2xvdC0+c2VxX25yOworCXJldHVybiAwOworfQorCisvKgorICogbmZzNF9zbG90X3NlcWlkX2luX3VzZSAtIHRlc3QgaWYgYSBzbG90IHNlcXVlbmNlIGlkIGlzIHN0aWxsIGluIHVzZQorICoKKyAqIEdpdmVuIGEgc2xvdCB0YWJsZSwgc2xvdCBpZCBhbmQgc2VxdWVuY2UgbnVtYmVyLCBkZXRlcm1pbmUgaWYgdGhlCisgKiBSUEMgY2FsbCBpbiBxdWVzdGlvbiBpcyBzdGlsbCBpbiBmbGlnaHQuIFRoaXMgZnVuY3Rpb24gaXMgbWFpbmx5CisgKiBpbnRlbmRlZCBmb3IgdXNlIGJ5IHRoZSBjYWxsYmFjayBjaGFubmVsLgorICovCitzdGF0aWMgYm9vbCBuZnM0X3Nsb3Rfc2VxaWRfaW5fdXNlKHN0cnVjdCBuZnM0X3Nsb3RfdGFibGUgKnRibCwKKwkJdTMyIHNsb3RpZCwgdTMyIHNlcV9ucikKK3sKKwl1MzIgY3VyX3NlcTsKKwlib29sIHJldCA9IGZhbHNlOworCisJc3Bpbl9sb2NrKCZ0YmwtPnNsb3RfdGJsX2xvY2spOworCWlmIChuZnM0X3Nsb3RfZ2V0X3NlcWlkKHRibCwgc2xvdGlkLCAmY3VyX3NlcSkgPT0gMCAmJgorCSAgICBjdXJfc2VxID09IHNlcV9uciAmJiB0ZXN0X2JpdChzbG90aWQsIHRibC0+dXNlZF9zbG90cykpCisJCXJldCA9IHRydWU7CisJc3Bpbl91bmxvY2soJnRibC0+c2xvdF90YmxfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIG5mczRfc2xvdF93YWl0X29uX3NlcWlkIC0gd2FpdCB1bnRpbCBhIHNsb3Qgc2VxdWVuY2UgaWQgaXMgY29tcGxldGUKKyAqCisgKiBHaXZlbiBhIHNsb3QgdGFibGUsIHNsb3QgaWQgYW5kIHNlcXVlbmNlIG51bWJlciwgd2FpdCB1bnRpbCB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgUlBDIGNhbGwgY29tcGxldGVzLiBUaGlzIGZ1bmN0aW9uIGlzIG1haW5seQorICogaW50ZW5kZWQgZm9yIHVzZSBieSB0aGUgY2FsbGJhY2sgY2hhbm5lbC4KKyAqLworaW50IG5mczRfc2xvdF93YWl0X29uX3NlcWlkKHN0cnVjdCBuZnM0X3Nsb3RfdGFibGUgKnRibCwKKwkJdTMyIHNsb3RpZCwgdTMyIHNlcV9uciwKKwkJdW5zaWduZWQgbG9uZyB0aW1lb3V0KQoreworCWlmICh3YWl0X2V2ZW50X3RpbWVvdXQodGJsLT5zbG90X3dhaXRxLAorCQkJIW5mczRfc2xvdF9zZXFpZF9pbl91c2UodGJsLCBzbG90aWQsIHNlcV9uciksCisJCQl0aW1lb3V0KSA9PSAwKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIG5mczRfYWxsb2Nfc2xvdCAtIGVmZmljaWVudGx5IGxvb2sgZm9yIGEgZnJlZSBzbG90CiAgKgpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczRzZXNzaW9uLmggYi9mcy9uZnMvbmZzNHNlc3Npb24uaAppbmRleCA1YjUxMjk4Li5mNzAzYjc1IDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNHNlc3Npb24uaAorKysgYi9mcy9uZnMvbmZzNHNlc3Npb24uaApAQCAtMjEsNyArMjEsOCBAQAogCXVuc2lnbmVkIGxvbmcJCWdlbmVyYXRpb247CiAJdTMyCQkJc2xvdF9ucjsKIAl1MzIJCSAJc2VxX25yOwotCXVuc2lnbmVkIGludAkJaW50ZXJydXB0ZWQgOiAxOworCXVuc2lnbmVkIGludAkJaW50ZXJydXB0ZWQgOiAxLAorCQkJCXNlcV9kb25lIDogMTsKIH07CiAKIC8qIFNlc3Npb25zICovCkBAIC0zNiw2ICszNyw3IEBACiAJdW5zaWduZWQgbG9uZyAgIHVzZWRfc2xvdHNbU0xPVF9UQUJMRV9TWl07IC8qIHVzZWQvdW51c2VkIGJpdG1hcCAqLwogCXNwaW5sb2NrX3QJc2xvdF90YmxfbG9jazsKIAlzdHJ1Y3QgcnBjX3dhaXRfcXVldWUJc2xvdF90Ymxfd2FpdHE7CS8qIGFsbG9jYXRvcnMgbWF5IHdhaXQgaGVyZSAqLworCXdhaXRfcXVldWVfaGVhZF90CXNsb3Rfd2FpdHE7CS8qIENvbXBsZXRpb24gd2FpdCBvbiBzbG90ICovCiAJdTMyCQltYXhfc2xvdHM7CQkvKiAjIHNsb3RzIGluIHRhYmxlICovCiAJdTMyCQltYXhfc2xvdGlkOwkJLyogTWF4IGFsbG93ZWQgc2xvdGlkIHZhbHVlICovCiAJdTMyCQloaWdoZXN0X3VzZWRfc2xvdGlkOwkvKiBzZW50IHRvIHNlcnZlciBvbiBlYWNoIFNFUS4KQEAgLTc4LDYgKzgwLDkgQEAKIGV4dGVybiB2b2lkIG5mczRfc2h1dGRvd25fc2xvdF90YWJsZShzdHJ1Y3QgbmZzNF9zbG90X3RhYmxlICp0YmwpOwogZXh0ZXJuIHN0cnVjdCBuZnM0X3Nsb3QgKm5mczRfYWxsb2Nfc2xvdChzdHJ1Y3QgbmZzNF9zbG90X3RhYmxlICp0YmwpOwogZXh0ZXJuIHN0cnVjdCBuZnM0X3Nsb3QgKm5mczRfbG9va3VwX3Nsb3Qoc3RydWN0IG5mczRfc2xvdF90YWJsZSAqdGJsLCB1MzIgc2xvdGlkKTsKK2V4dGVybiBpbnQgbmZzNF9zbG90X3dhaXRfb25fc2VxaWQoc3RydWN0IG5mczRfc2xvdF90YWJsZSAqdGJsLAorCQl1MzIgc2xvdGlkLCB1MzIgc2VxX25yLAorCQl1bnNpZ25lZCBsb25nIHRpbWVvdXQpOwogZXh0ZXJuIGJvb2wgbmZzNF90cnlfdG9fbG9ja19zbG90KHN0cnVjdCBuZnM0X3Nsb3RfdGFibGUgKnRibCwgc3RydWN0IG5mczRfc2xvdCAqc2xvdCk7CiBleHRlcm4gdm9pZCBuZnM0X2ZyZWVfc2xvdChzdHJ1Y3QgbmZzNF9zbG90X3RhYmxlICp0YmwsIHN0cnVjdCBuZnM0X3Nsb3QgKnNsb3QpOwogZXh0ZXJuIHZvaWQgbmZzNF9zbG90X3RibF9kcmFpbl9jb21wbGV0ZShzdHJ1Y3QgbmZzNF9zbG90X3RhYmxlICp0YmwpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL3BuZnMuYyBiL2ZzL25mcy9wbmZzLmMKaW5kZXggNzA4MDZjYS4uMmM5M2E4NSAxMDA2NDQKLS0tIGEvZnMvbmZzL3BuZnMuYworKysgYi9mcy9uZnMvcG5mcy5jCkBAIC0zNjUsNyArMzY1LDggQEAKIAkvKiBNYXRjaGVkIGJ5IHBuZnNfZ2V0X2xheW91dF9oZHIgaW4gcG5mc19sYXlvdXRfaW5zZXJ0X2xzZWcgKi8KIAlhdG9taWNfZGVjKCZsby0+cGxoX3JlZmNvdW50KTsKIAlpZiAobGlzdF9lbXB0eSgmbG8tPnBsaF9zZWdzKSkgewotCQlzZXRfYml0KE5GU19MQVlPVVRfSU5WQUxJRF9TVElELCAmbG8tPnBsaF9mbGFncyk7CisJCWlmIChhdG9taWNfcmVhZCgmbG8tPnBsaF9vdXRzdGFuZGluZykgPT0gMCkKKwkJCXNldF9iaXQoTkZTX0xBWU9VVF9JTlZBTElEX1NUSUQsICZsby0+cGxoX2ZsYWdzKTsKIAkJY2xlYXJfYml0KE5GU19MQVlPVVRfQlVMS19SRUNBTEwsICZsby0+cGxoX2ZsYWdzKTsKIAl9CiAJcnBjX3dha2VfdXAoJk5GU19TRVJWRVIoaW5vZGUpLT5yb2NfcnBjd2FpdHEpOwpAQCAtNzY4LDE3ICs3NjksMzIgQEAKIAlwbmZzX2Rlc3Ryb3lfbGF5b3V0c19ieWNsaWQoY2xwLCBmYWxzZSk7CiB9CiAKK3N0YXRpYyB2b2lkCitwbmZzX2NsZWFyX2xheW91dHJldHVybl9pbmZvKHN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxvKQoreworCWxvLT5wbGhfcmV0dXJuX2lvbW9kZSA9IDA7CisJbG8tPnBsaF9yZXR1cm5fc2VxID0gMDsKKwljbGVhcl9iaXQoTkZTX0xBWU9VVF9SRVRVUk5fUkVRVUVTVEVELCAmbG8tPnBsaF9mbGFncyk7Cit9CisKIC8qIHVwZGF0ZSBsby0+cGxoX3N0YXRlaWQgd2l0aCBuZXcgaWYgaXMgbW9yZSByZWNlbnQgKi8KIHZvaWQKIHBuZnNfc2V0X2xheW91dF9zdGF0ZWlkKHN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxvLCBjb25zdCBuZnM0X3N0YXRlaWQgKm5ldywKIAkJCWJvb2wgdXBkYXRlX2JhcnJpZXIpCiB7CiAJdTMyIG9sZHNlcSwgbmV3c2VxLCBuZXdfYmFycmllciA9IDA7Ci0JYm9vbCBpbnZhbGlkID0gIXBuZnNfbGF5b3V0X2lzX3ZhbGlkKGxvKTsKIAogCW9sZHNlcSA9IGJlMzJfdG9fY3B1KGxvLT5wbGhfc3RhdGVpZC5zZXFpZCk7CiAJbmV3c2VxID0gYmUzMl90b19jcHUobmV3LT5zZXFpZCk7Ci0JaWYgKGludmFsaWQgfHwgcG5mc19zZXFpZF9pc19uZXdlcihuZXdzZXEsIG9sZHNlcSkpIHsKKworCWlmICghcG5mc19sYXlvdXRfaXNfdmFsaWQobG8pKSB7CisJCW5mczRfc3RhdGVpZF9jb3B5KCZsby0+cGxoX3N0YXRlaWQsIG5ldyk7CisJCWxvLT5wbGhfYmFycmllciA9IG5ld3NlcTsKKwkJcG5mc19jbGVhcl9sYXlvdXRyZXR1cm5faW5mbyhsbyk7CisJCWNsZWFyX2JpdChORlNfTEFZT1VUX0lOVkFMSURfU1RJRCwgJmxvLT5wbGhfZmxhZ3MpOworCQlyZXR1cm47CisJfQorCWlmIChwbmZzX3NlcWlkX2lzX25ld2VyKG5ld3NlcSwgb2xkc2VxKSkgewogCQluZnM0X3N0YXRlaWRfY29weSgmbG8tPnBsaF9zdGF0ZWlkLCBuZXcpOwogCQkvKgogCQkgKiBCZWNhdXNlIG9mIHdyYXBhcm91bmQsIHdlIHdhbnQgdG8ga2VlcCB0aGUgYmFycmllcgpAQCAtNzkwLDcgKzgwNiw3IEBACiAJCW5ld19iYXJyaWVyID0gYmUzMl90b19jcHUobmV3LT5zZXFpZCk7CiAJZWxzZSBpZiAobmV3X2JhcnJpZXIgPT0gMCkKIAkJcmV0dXJuOwotCWlmIChpbnZhbGlkIHx8IHBuZnNfc2VxaWRfaXNfbmV3ZXIobmV3X2JhcnJpZXIsIGxvLT5wbGhfYmFycmllcikpCisJaWYgKHBuZnNfc2VxaWRfaXNfbmV3ZXIobmV3X2JhcnJpZXIsIGxvLT5wbGhfYmFycmllcikpCiAJCWxvLT5wbGhfYmFycmllciA9IG5ld19iYXJyaWVyOwogfQogCkBAIC04ODYsMTkgKzkwMiwxNCBAQAogCXJwY193YWtlX3VwKCZORlNfU0VSVkVSKGxvLT5wbGhfaW5vZGUpLT5yb2NfcnBjd2FpdHEpOwogfQogCi1zdGF0aWMgdm9pZAotcG5mc19jbGVhcl9sYXlvdXRyZXR1cm5faW5mbyhzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbykKLXsKLQlsby0+cGxoX3JldHVybl9pb21vZGUgPSAwOwotCWxvLT5wbGhfcmV0dXJuX3NlcSA9IDA7Ci0JY2xlYXJfYml0KE5GU19MQVlPVVRfUkVUVVJOX1JFUVVFU1RFRCwgJmxvLT5wbGhfZmxhZ3MpOwotfQotCiBzdGF0aWMgYm9vbAogcG5mc19wcmVwYXJlX2xheW91dHJldHVybihzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbywKIAkJbmZzNF9zdGF0ZWlkICpzdGF0ZWlkLAogCQllbnVtIHBuZnNfaW9tb2RlICppb21vZGUpCiB7CisJLyogU2VyaWFsaXNlIExBWU9VVEdFVC9MQVlPVVRSRVRVUk4gKi8KKwlpZiAoYXRvbWljX3JlYWQoJmxvLT5wbGhfb3V0c3RhbmRpbmcpICE9IDApCisJCXJldHVybiBmYWxzZTsKIAlpZiAodGVzdF9hbmRfc2V0X2JpdChORlNfTEFZT1VUX1JFVFVSTiwgJmxvLT5wbGhfZmxhZ3MpKQogCQlyZXR1cm4gZmFsc2U7CiAJcG5mc19nZXRfbGF5b3V0X2hkcihsbyk7CkBAIC0xNTU1LDYgKzE1NjYsNyBAQAogCX0KIAogbG9va3VwX2FnYWluOgorCW5mczRfY2xpZW50X3JlY292ZXJfZXhwaXJlZF9sZWFzZShjbHApOwogCWZpcnN0ID0gZmFsc2U7CiAJc3Bpbl9sb2NrKCZpbm8tPmlfbG9jayk7CiAJbG8gPSBwbmZzX2ZpbmRfYWxsb2NfbGF5b3V0KGlubywgY3R4LCBnZnBfZmxhZ3MpOwpAQCAtMTc5NywxNiArMTgwOSwxMSBAQAogCQkgKi8KIAkJcG5mc19tYXJrX2xheW91dF9zdGF0ZWlkX2ludmFsaWQobG8sICZmcmVlX21lKTsKIAotCQluZnM0X3N0YXRlaWRfY29weSgmbG8tPnBsaF9zdGF0ZWlkLCAmcmVzLT5zdGF0ZWlkKTsKLQkJbG8tPnBsaF9iYXJyaWVyID0gYmUzMl90b19jcHUocmVzLT5zdGF0ZWlkLnNlcWlkKTsKKwkJcG5mc19zZXRfbGF5b3V0X3N0YXRlaWQobG8sICZyZXMtPnN0YXRlaWQsIHRydWUpOwogCX0KIAogCXBuZnNfZ2V0X2xzZWcobHNlZyk7CiAJcG5mc19sYXlvdXRfaW5zZXJ0X2xzZWcobG8sIGxzZWcsICZmcmVlX21lKTsKLQlpZiAoIXBuZnNfbGF5b3V0X2lzX3ZhbGlkKGxvKSkgewotCQlwbmZzX2NsZWFyX2xheW91dHJldHVybl9pbmZvKGxvKTsKLQkJY2xlYXJfYml0KE5GU19MQVlPVVRfSU5WQUxJRF9TVElELCAmbG8tPnBsaF9mbGFncyk7Ci0JfQogCiAKIAlpZiAocmVzLT5yZXR1cm5fb25fY2xvc2UpCkBAIC0yNTEwLDcgKzI1MTcsNiBAQAogCiAJZGF0YS0+YXJncy5maCA9IE5GU19GSChpbm9kZSk7CiAJZGF0YS0+YXJncy5pbm9kZSA9IGlub2RlOwotCW5mczRfc3RhdGVpZF9jb3B5KCZkYXRhLT5hcmdzLnN0YXRlaWQsICZoZHItPnBsaF9zdGF0ZWlkKTsKIAlzdGF0dXMgPSBsZC0+cHJlcGFyZV9sYXlvdXRzdGF0cygmZGF0YS0+YXJncyk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBvdXRfZnJlZTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9zdXBlci5jIGIvZnMvbmZzL3N1cGVyLmMKaW5kZXggMThkNDQ2ZS4uZDM5NjAxMyAxMDA2NDQKLS0tIGEvZnMvbmZzL3N1cGVyLmMKKysrIGIvZnMvbmZzL3N1cGVyLmMKQEAgLTkyMyw2ICs5MjMsOCBAQAogCiAJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGRhdGEpIHsKKwkJZGF0YS0+dGltZW8JCT0gTkZTX1VOU1BFQ19USU1FTzsKKwkJZGF0YS0+cmV0cmFucwkJPSBORlNfVU5TUEVDX1JFVFJBTlM7CiAJCWRhdGEtPmFjcmVnbWluCQk9IE5GU19ERUZfQUNSRUdNSU47CiAJCWRhdGEtPmFjcmVnbWF4CQk9IE5GU19ERUZfQUNSRUdNQVg7CiAJCWRhdGEtPmFjZGlybWluCQk9IE5GU19ERUZfQUNESVJNSU47CkBAIC0xMTg5LDYgKzExOTEsMTkgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK3N0YXRpYyBpbnQgbmZzX2dldF9vcHRpb25fdWxfYm91bmQoc3Vic3RyaW5nX3QgYXJnc1tdLCB1bnNpZ25lZCBsb25nICpvcHRpb24sCisJCXVuc2lnbmVkIGxvbmcgbF9ib3VuZCwgdW5zaWduZWQgbG9uZyB1X2JvdW5kKQoreworCWludCByZXQ7CisKKwlyZXQgPSBuZnNfZ2V0X29wdGlvbl91bChhcmdzLCBvcHRpb24pOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAoKm9wdGlvbiA8IGxfYm91bmQgfHwgKm9wdGlvbiA+IHVfYm91bmQpCisJCXJldHVybiAtRVJBTkdFOworCXJldHVybiAwOworfQorCiAvKgogICogRXJyb3ItY2hlY2sgYW5kIGNvbnZlcnQgYSBzdHJpbmcgb2YgbW91bnQgb3B0aW9ucyBmcm9tIHVzZXIgc3BhY2UgaW50bwogICogYSBkYXRhIHN0cnVjdHVyZS4gIFRoZSB3aG9sZSBtb3VudCBzdHJpbmcgaXMgcHJvY2Vzc2VkOyBiYWQgb3B0aW9ucyBhcmUKQEAgLTEzNTIsMTIgKzEzNjcsMTIgQEAKIAkJCW1udC0+YnNpemUgPSBvcHRpb247CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfdGltZW86Ci0JCQlpZiAobmZzX2dldF9vcHRpb25fdWwoYXJncywgJm9wdGlvbikgfHwgb3B0aW9uID09IDApCisJCQlpZiAobmZzX2dldF9vcHRpb25fdWxfYm91bmQoYXJncywgJm9wdGlvbiwgMSwgSU5UX01BWCkpCiAJCQkJZ290byBvdXRfaW52YWxpZF92YWx1ZTsKIAkJCW1udC0+dGltZW8gPSBvcHRpb247CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfcmV0cmFuczoKLQkJCWlmIChuZnNfZ2V0X29wdGlvbl91bChhcmdzLCAmb3B0aW9uKSB8fCBvcHRpb24gPT0gMCkKKwkJCWlmIChuZnNfZ2V0X29wdGlvbl91bF9ib3VuZChhcmdzLCAmb3B0aW9uLCAwLCBJTlRfTUFYKSkKIAkJCQlnb3RvIG91dF9pbnZhbGlkX3ZhbHVlOwogCQkJbW50LT5yZXRyYW5zID0gb3B0aW9uOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9mcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnkuYyBiL2ZzL25vdGlmeS9mYW5vdGlmeS9mYW5vdGlmeS5jCmluZGV4IGQyZjk3ZWMuLmUwZTVmN2MgMTAwNjQ0Ci0tLSBhL2ZzL25vdGlmeS9mYW5vdGlmeS9mYW5vdGlmeS5jCisrKyBiL2ZzL25vdGlmeS9mYW5vdGlmeS9mYW5vdGlmeS5jCkBAIC02NywxOCArNjcsNyBAQAogCiAJcHJfZGVidWcoIiVzOiBncm91cD0lcCBldmVudD0lcFxuIiwgX19mdW5jX18sIGdyb3VwLCBldmVudCk7CiAKLQl3YWl0X2V2ZW50KGdyb3VwLT5mYW5vdGlmeV9kYXRhLmFjY2Vzc193YWl0cSwgZXZlbnQtPnJlc3BvbnNlIHx8Ci0JCQkJYXRvbWljX3JlYWQoJmdyb3VwLT5mYW5vdGlmeV9kYXRhLmJ5cGFzc19wZXJtKSk7Ci0KLQlpZiAoIWV2ZW50LT5yZXNwb25zZSkgewkvKiBieXBhc3NfcGVybSBzZXQgKi8KLQkJLyoKLQkJICogRXZlbnQgd2FzIGNhbmNlbGVkIGJlY2F1c2UgZ3JvdXAgaXMgYmVpbmcgZGVzdHJveWVkLiBSZW1vdmUKLQkJICogaXQgZnJvbSBncm91cCdzIGV2ZW50IGxpc3QgYmVjYXVzZSB3ZSBhcmUgcmVzcG9uc2libGUgZm9yCi0JCSAqIGZyZWVpbmcgdGhlIHBlcm1pc3Npb24gZXZlbnQuCi0JCSAqLwotCQlmc25vdGlmeV9yZW1vdmVfZXZlbnQoZ3JvdXAsICZldmVudC0+ZmFlLmZzZSk7Ci0JCXJldHVybiAwOwotCX0KKwl3YWl0X2V2ZW50KGdyb3VwLT5mYW5vdGlmeV9kYXRhLmFjY2Vzc193YWl0cSwgZXZlbnQtPnJlc3BvbnNlKTsKIAogCS8qIHVzZXJzcGFjZSByZXNwb25kZWQsIGNvbnZlcnQgdG8gc29tZXRoaW5nIHVzYWJsZSAqLwogCXN3aXRjaCAoZXZlbnQtPnJlc3BvbnNlKSB7CmRpZmYgLS1naXQgYS9mcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnlfdXNlci5jIGIvZnMvbm90aWZ5L2Zhbm90aWZ5L2Zhbm90aWZ5X3VzZXIuYwppbmRleCA4ZThlNmJjLi5hNjQzMTM4IDEwMDY0NAotLS0gYS9mcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnlfdXNlci5jCisrKyBiL2ZzL25vdGlmeS9mYW5vdGlmeS9mYW5vdGlmeV91c2VyLmMKQEAgLTM1OCwxNiArMzU4LDIwIEBACiAKICNpZmRlZiBDT05GSUdfRkFOT1RJRllfQUNDRVNTX1BFUk1JU1NJT05TCiAJc3RydWN0IGZhbm90aWZ5X3Blcm1fZXZlbnRfaW5mbyAqZXZlbnQsICpuZXh0OworCXN0cnVjdCBmc25vdGlmeV9ldmVudCAqZnNuX2V2ZW50OwogCiAJLyoKLQkgKiBUaGVyZSBtYXkgYmUgc3RpbGwgbmV3IGV2ZW50cyBhcnJpdmluZyBpbiB0aGUgbm90aWZpY2F0aW9uIHF1ZXVlCi0JICogYnV0IHNpbmNlIHVzZXJzcGFjZSBjYW5ub3QgdXNlIGZhbm90aWZ5IGZkIGFueW1vcmUsIG5vIGV2ZW50IGNhbgotCSAqIGVudGVyIG9yIGxlYXZlIGFjY2Vzc19saXN0IGJ5IG5vdy4KKwkgKiBTdG9wIG5ldyBldmVudHMgZnJvbSBhcnJpdmluZyBpbiB0aGUgbm90aWZpY2F0aW9uIHF1ZXVlLiBzaW5jZQorCSAqIHVzZXJzcGFjZSBjYW5ub3QgdXNlIGZhbm90aWZ5IGZkIGFueW1vcmUsIG5vIGV2ZW50IGNhbiBlbnRlciBvcgorCSAqIGxlYXZlIGFjY2Vzc19saXN0IGJ5IG5vdyBlaXRoZXIuCisJICovCisJZnNub3RpZnlfZ3JvdXBfc3RvcF9xdWV1ZWluZyhncm91cCk7CisKKwkvKgorCSAqIFByb2Nlc3MgYWxsIHBlcm1pc3Npb24gZXZlbnRzIG9uIGFjY2Vzc19saXN0IGFuZCBub3RpZmljYXRpb24gcXVldWUKKwkgKiBhbmQgc2ltdWxhdGUgcmVwbHkgZnJvbSB1c2Vyc3BhY2UuCiAJICovCiAJc3Bpbl9sb2NrKCZncm91cC0+ZmFub3RpZnlfZGF0YS5hY2Nlc3NfbG9jayk7Ci0KLQlhdG9taWNfaW5jKCZncm91cC0+ZmFub3RpZnlfZGF0YS5ieXBhc3NfcGVybSk7Ci0KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZXZlbnQsIG5leHQsICZncm91cC0+ZmFub3RpZnlfZGF0YS5hY2Nlc3NfbGlzdCwKIAkJCQkgZmFlLmZzZS5saXN0KSB7CiAJCXByX2RlYnVnKCIlczogZm91bmQgZ3JvdXA9JXAgZXZlbnQ9JXBcbiIsIF9fZnVuY19fLCBncm91cCwKQEAgLTM3OSwxMiArMzgzLDIxIEBACiAJc3Bpbl91bmxvY2soJmdyb3VwLT5mYW5vdGlmeV9kYXRhLmFjY2Vzc19sb2NrKTsKIAogCS8qCi0JICogU2luY2UgYnlwYXNzX3Blcm0gaXMgc2V0LCBuZXdseSBxdWV1ZWQgZXZlbnRzIHdpbGwgbm90IHdhaXQgZm9yCi0JICogYWNjZXNzIHJlc3BvbnNlLiBXYWtlIHVwIHRoZSBhbHJlYWR5IHNsZWVwaW5nIG9uZXMgbm93LgotCSAqIHN5bmNocm9uaXplX3NyY3UoKSBpbiBmc25vdGlmeV9kZXN0cm95X2dyb3VwKCkgd2lsbCB3YWl0IGZvciBhbGwKLQkgKiBwcm9jZXNzZXMgc2xlZXBpbmcgaW4gZmFub3RpZnlfaGFuZGxlX2V2ZW50KCkgd2FpdGluZyBmb3IgYWNjZXNzCi0JICogcmVzcG9uc2UgYW5kIHRodXMgYWxzbyBmb3IgYWxsIHBlcm1pc3Npb24gZXZlbnRzIHRvIGJlIGZyZWVkLgorCSAqIERlc3Ryb3kgYWxsIG5vbi1wZXJtaXNzaW9uIGV2ZW50cy4gRm9yIHBlcm1pc3Npb24gZXZlbnRzIGp1c3QKKwkgKiBkZXF1ZXVlIHRoZW0gYW5kIHNldCB0aGUgcmVzcG9uc2UuIFRoZXkgd2lsbCBiZSBmcmVlZCBvbmNlIHRoZQorCSAqIHJlc3BvbnNlIGlzIGNvbnN1bWVkIGFuZCBmYW5vdGlmeV9nZXRfcmVzcG9uc2UoKSByZXR1cm5zLgogCSAqLworCW11dGV4X2xvY2soJmdyb3VwLT5ub3RpZmljYXRpb25fbXV0ZXgpOworCXdoaWxlICghZnNub3RpZnlfbm90aWZ5X3F1ZXVlX2lzX2VtcHR5KGdyb3VwKSkgeworCQlmc25fZXZlbnQgPSBmc25vdGlmeV9yZW1vdmVfZmlyc3RfZXZlbnQoZ3JvdXApOworCQlpZiAoIShmc25fZXZlbnQtPm1hc2sgJiBGQU5fQUxMX1BFUk1fRVZFTlRTKSkKKwkJCWZzbm90aWZ5X2Rlc3Ryb3lfZXZlbnQoZ3JvdXAsIGZzbl9ldmVudCk7CisJCWVsc2UKKwkJCUZBTk9USUZZX1BFKGZzbl9ldmVudCktPnJlc3BvbnNlID0gRkFOX0FMTE9XOworCX0KKwltdXRleF91bmxvY2soJmdyb3VwLT5ub3RpZmljYXRpb25fbXV0ZXgpOworCisJLyogUmVzcG9uc2UgZm9yIGFsbCBwZXJtaXNzaW9uIGV2ZW50cyBpdCBzZXQsIHdha2V1cCB3YWl0ZXJzICovCiAJd2FrZV91cCgmZ3JvdXAtPmZhbm90aWZ5X2RhdGEuYWNjZXNzX3dhaXRxKTsKICNlbmRpZgogCkBAIC03NTUsNyArNzY4LDYgQEAKIAlzcGluX2xvY2tfaW5pdCgmZ3JvdXAtPmZhbm90aWZ5X2RhdGEuYWNjZXNzX2xvY2spOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmdyb3VwLT5mYW5vdGlmeV9kYXRhLmFjY2Vzc193YWl0cSk7CiAJSU5JVF9MSVNUX0hFQUQoJmdyb3VwLT5mYW5vdGlmeV9kYXRhLmFjY2Vzc19saXN0KTsKLQlhdG9taWNfc2V0KCZncm91cC0+ZmFub3RpZnlfZGF0YS5ieXBhc3NfcGVybSwgMCk7CiAjZW5kaWYKIAlzd2l0Y2ggKGZsYWdzICYgRkFOX0FMTF9DTEFTU19CSVRTKSB7CiAJY2FzZSBGQU5fQ0xBU1NfTk9USUY6CmRpZmYgLS1naXQgYS9mcy9ub3RpZnkvZ3JvdXAuYyBiL2ZzL25vdGlmeS9ncm91cC5jCmluZGV4IDNlMmRkODUuLmI0N2Y3Y2YgMTAwNjQ0Ci0tLSBhL2ZzL25vdGlmeS9ncm91cC5jCisrKyBiL2ZzL25vdGlmeS9ncm91cC5jCkBAIC00MCw2ICs0MCwxNyBAQAogfQogCiAvKgorICogU3RvcCBxdWV1ZWluZyBuZXcgZXZlbnRzIGZvciB0aGlzIGdyb3VwLiBPbmNlIHRoaXMgZnVuY3Rpb24gcmV0dXJucworICogZnNub3RpZnlfYWRkX2V2ZW50KCkgd2lsbCBub3QgYWRkIGFueSBuZXcgZXZlbnRzIHRvIHRoZSBncm91cCdzIHF1ZXVlLgorICovCit2b2lkIGZzbm90aWZ5X2dyb3VwX3N0b3BfcXVldWVpbmcoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCkKK3sKKwltdXRleF9sb2NrKCZncm91cC0+bm90aWZpY2F0aW9uX211dGV4KTsKKwlncm91cC0+c2h1dGRvd24gPSB0cnVlOworCW11dGV4X3VubG9jaygmZ3JvdXAtPm5vdGlmaWNhdGlvbl9tdXRleCk7Cit9CisKKy8qCiAgKiBUcnlpbmcgdG8gZ2V0IHJpZCBvZiBhIGdyb3VwLiBSZW1vdmUgYWxsIG1hcmtzLCBmbHVzaCBhbGwgZXZlbnRzIGFuZCByZWxlYXNlCiAgKiB0aGUgZ3JvdXAgcmVmZXJlbmNlLgogICogTm90ZSB0aGF0IGFub3RoZXIgdGhyZWFkIGNhbGxpbmcgZnNub3RpZnlfY2xlYXJfbWFya3NfYnlfZ3JvdXAoKSBtYXkgc3RpbGwKQEAgLTQ3LDYgKzU4LDE0IEBACiAgKi8KIHZvaWQgZnNub3RpZnlfZGVzdHJveV9ncm91cChzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwKQogeworCS8qCisJICogU3RvcCBxdWV1ZWluZyBuZXcgZXZlbnRzLiBUaGUgY29kZSBiZWxvdyBpcyBjYXJlZnVsIGVub3VnaCB0byBub3QKKwkgKiByZXF1aXJlIHRoaXMgYnV0IGZhbm90aWZ5IG5lZWRzIHRvIHN0b3AgcXVldWluZyBldmVudHMgZXZlbiBiZWZvcmUKKwkgKiBmc25vdGlmeV9kZXN0cm95X2dyb3VwKCkgaXMgY2FsbGVkIGFuZCB0aGlzIG1ha2VzIHRoZSBvdGhlciBjYWxsZXJzCisJICogb2YgZnNub3RpZnlfZGVzdHJveV9ncm91cCgpIHRvIHNlZSB0aGUgc2FtZSBiZWhhdmlvci4KKwkgKi8KKwlmc25vdGlmeV9ncm91cF9zdG9wX3F1ZXVlaW5nKGdyb3VwKTsKKwogCS8qIGNsZWFyIGFsbCBpbm9kZSBtYXJrcyBmb3IgdGhpcyBncm91cCwgYXR0YWNoIHRoZW0gdG8gZGVzdHJveV9saXN0ICovCiAJZnNub3RpZnlfZGV0YWNoX2dyb3VwX21hcmtzKGdyb3VwKTsKIApkaWZmIC0tZ2l0IGEvZnMvbm90aWZ5L25vdGlmaWNhdGlvbi5jIGIvZnMvbm90aWZ5L25vdGlmaWNhdGlvbi5jCmluZGV4IGE5NWQ4ZTAuLmU0NTVlODMgMTAwNjQ0Ci0tLSBhL2ZzL25vdGlmeS9ub3RpZmljYXRpb24uYworKysgYi9mcy9ub3RpZnkvbm90aWZpY2F0aW9uLmMKQEAgLTgyLDcgKzgyLDggQEAKICAqIEFkZCBhbiBldmVudCB0byB0aGUgZ3JvdXAgbm90aWZpY2F0aW9uIHF1ZXVlLiAgVGhlIGdyb3VwIGNhbiBsYXRlciBwdWxsIHRoaXMKICAqIGV2ZW50IG9mZiB0aGUgcXVldWUgdG8gZGVhbCB3aXRoLiAgVGhlIGZ1bmN0aW9uIHJldHVybnMgMCBpZiB0aGUgZXZlbnQgd2FzCiAgKiBhZGRlZCB0byB0aGUgcXVldWUsIDEgaWYgdGhlIGV2ZW50IHdhcyBtZXJnZWQgd2l0aCBzb21lIG90aGVyIHF1ZXVlZCBldmVudCwKLSAqIDIgaWYgdGhlIHF1ZXVlIG9mIGV2ZW50cyBoYXMgb3ZlcmZsb3duLgorICogMiBpZiB0aGUgZXZlbnQgd2FzIG5vdCBxdWV1ZWQgLSBlaXRoZXIgdGhlIHF1ZXVlIG9mIGV2ZW50cyBoYXMgb3ZlcmZsb3duCisgKiBvciB0aGUgZ3JvdXAgaXMgc2h1dHRpbmcgZG93bi4KICAqLwogaW50IGZzbm90aWZ5X2FkZF9ldmVudChzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwLAogCQkgICAgICAgc3RydWN0IGZzbm90aWZ5X2V2ZW50ICpldmVudCwKQEAgLTk2LDYgKzk3LDExIEBACiAKIAltdXRleF9sb2NrKCZncm91cC0+bm90aWZpY2F0aW9uX211dGV4KTsKIAorCWlmIChncm91cC0+c2h1dGRvd24pIHsKKwkJbXV0ZXhfdW5sb2NrKCZncm91cC0+bm90aWZpY2F0aW9uX211dGV4KTsKKwkJcmV0dXJuIDI7CisJfQorCiAJaWYgKGdyb3VwLT5xX2xlbiA+PSBncm91cC0+bWF4X2V2ZW50cykgewogCQlyZXQgPSAyOwogCQkvKiBRdWV1ZSBvdmVyZmxvdyBldmVudCBvbmx5IGlmIGl0IGlzbid0IGFscmVhZHkgcXVldWVkICovCkBAIC0xMjYsMjEgKzEzMiw2IEBACiB9CiAKIC8qCi0gKiBSZW1vdmUgQGV2ZW50IGZyb20gZ3JvdXAncyBub3RpZmljYXRpb24gcXVldWUuIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZgotICogdGhlIGNhbGxlciB0byBkZXN0cm95IHRoZSBldmVudC4KLSAqLwotdm9pZCBmc25vdGlmeV9yZW1vdmVfZXZlbnQoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCwKLQkJCSAgIHN0cnVjdCBmc25vdGlmeV9ldmVudCAqZXZlbnQpCi17Ci0JbXV0ZXhfbG9jaygmZ3JvdXAtPm5vdGlmaWNhdGlvbl9tdXRleCk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZldmVudC0+bGlzdCkpIHsKLQkJbGlzdF9kZWxfaW5pdCgmZXZlbnQtPmxpc3QpOwotCQlncm91cC0+cV9sZW4tLTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZncm91cC0+bm90aWZpY2F0aW9uX211dGV4KTsKLX0KLQotLyoKICAqIFJlbW92ZSBhbmQgcmV0dXJuIHRoZSBmaXJzdCBldmVudCBmcm9tIHRoZSBub3RpZmljYXRpb24gbGlzdC4gIEl0IGlzIHRoZQogICogcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byBkZXN0cm95IHRoZSBvYnRhaW5lZCBldmVudAogICovCmRpZmYgLS1naXQgYS9mcy9uc2ZzLmMgYi9mcy9uc2ZzLmMKaW5kZXggOGYyMGQ2MC4uMzBiYjEwMCAxMDA2NDQKLS0tIGEvZnMvbnNmcy5jCisrKyBiL2ZzL25zZnMuYwpAQCAtNSwxMSArNSwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CiAjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzZXJfbmFtZXNwYWNlLmg+CisjaW5jbHVkZSA8bGludXgvbnNmcy5oPgogCiBzdGF0aWMgc3RydWN0IHZmc21vdW50ICpuc2ZzX21udDsKIAorc3RhdGljIGxvbmcgbnNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBpb2N0bCwKKwkJCXVuc2lnbmVkIGxvbmcgYXJnKTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG5zX2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkudW5sb2NrZWRfaW9jdGwgPSBuc19pb2N0bCwKIH07CiAKIHN0YXRpYyBjaGFyICpuc19kbmFtZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmxlbikKQEAgLTQ0LDIyICs0OSwxNCBAQAogCW5zLT5vcHMtPnB1dChucyk7CiB9CiAKLXZvaWQgKm5zX2dldF9wYXRoKHN0cnVjdCBwYXRoICpwYXRoLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCi0JCQljb25zdCBzdHJ1Y3QgcHJvY19uc19vcGVyYXRpb25zICpuc19vcHMpCitzdGF0aWMgdm9pZCAqX19uc19nZXRfcGF0aChzdHJ1Y3QgcGF0aCAqcGF0aCwgc3RydWN0IG5zX2NvbW1vbiAqbnMpCiB7Ci0Jc3RydWN0IHZmc21vdW50ICptbnQgPSBtbnRnZXQobnNmc19tbnQpOworCXN0cnVjdCB2ZnNtb3VudCAqbW50ID0gbnNmc19tbnQ7CiAJc3RydWN0IHFzdHIgcW5hbWUgPSB7IC5uYW1lID0gIiIsIH07CiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0Jc3RydWN0IG5zX2NvbW1vbiAqbnM7CiAJdW5zaWduZWQgbG9uZyBkOwogCi1hZ2FpbjoKLQlucyA9IG5zX29wcy0+Z2V0KHRhc2spOwotCWlmICghbnMpIHsKLQkJbW50cHV0KG1udCk7Ci0JCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOwotCX0KIAlyY3VfcmVhZF9sb2NrKCk7CiAJZCA9IGF0b21pY19sb25nX3JlYWQoJm5zLT5zdGFzaGVkKTsKIAlpZiAoIWQpCkBAIC02OCwxNyArNjUsMTYgQEAKIAlpZiAoIWxvY2tyZWZfZ2V0X25vdF9kZWFkKCZkZW50cnktPmRfbG9ja3JlZikpCiAJCWdvdG8gc2xvdzsKIAlyY3VfcmVhZF91bmxvY2soKTsKLQluc19vcHMtPnB1dChucyk7CisJbnMtPm9wcy0+cHV0KG5zKTsKIGdvdF9pdDoKLQlwYXRoLT5tbnQgPSBtbnQ7CisJcGF0aC0+bW50ID0gbW50Z2V0KG1udCk7CiAJcGF0aC0+ZGVudHJ5ID0gZGVudHJ5OwogCXJldHVybiBOVUxMOwogc2xvdzoKIAlyY3VfcmVhZF91bmxvY2soKTsKIAlpbm9kZSA9IG5ld19pbm9kZV9wc2V1ZG8obW50LT5tbnRfc2IpOwogCWlmICghaW5vZGUpIHsKLQkJbnNfb3BzLT5wdXQobnMpOwotCQltbnRwdXQobW50KTsKKwkJbnMtPm9wcy0+cHV0KG5zKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQogCWlub2RlLT5pX2lubyA9IG5zLT5pbnVtOwpAQCAtOTEsMjEgKzg3LDk2IEBACiAJZGVudHJ5ID0gZF9hbGxvY19wc2V1ZG8obW50LT5tbnRfc2IsICZxbmFtZSk7CiAJaWYgKCFkZW50cnkpIHsKIAkJaXB1dChpbm9kZSk7Ci0JCW1udHB1dChtbnQpOwogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKLQlkZW50cnktPmRfZnNkYXRhID0gKHZvaWQgKiluc19vcHM7CisJZGVudHJ5LT5kX2ZzZGF0YSA9ICh2b2lkICopbnMtPm9wczsKIAlkID0gYXRvbWljX2xvbmdfY21weGNoZygmbnMtPnN0YXNoZWQsIDAsICh1bnNpZ25lZCBsb25nKWRlbnRyeSk7CiAJaWYgKGQpIHsKIAkJZF9kZWxldGUoZGVudHJ5KTsJLyogbWFrZSBzdXJlIC0+ZF9wcnVuZSgpIGRvZXMgbm90aGluZyAqLwogCQlkcHV0KGRlbnRyeSk7CiAJCWNwdV9yZWxheCgpOwotCQlnb3RvIGFnYWluOworCQlyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTsKIAl9CiAJZ290byBnb3RfaXQ7CiB9CiAKK3ZvaWQgKm5zX2dldF9wYXRoKHN0cnVjdCBwYXRoICpwYXRoLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQljb25zdCBzdHJ1Y3QgcHJvY19uc19vcGVyYXRpb25zICpuc19vcHMpCit7CisJc3RydWN0IG5zX2NvbW1vbiAqbnM7CisJdm9pZCAqcmV0OworCithZ2FpbjoKKwlucyA9IG5zX29wcy0+Z2V0KHRhc2spOworCWlmICghbnMpCisJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCisJcmV0ID0gX19uc19nZXRfcGF0aChwYXRoLCBucyk7CisJaWYgKElTX0VSUihyZXQpICYmIFBUUl9FUlIocmV0KSA9PSAtRUFHQUlOKQorCQlnb3RvIGFnYWluOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb3Blbl9yZWxhdGVkX25zKHN0cnVjdCBuc19jb21tb24gKm5zLAorCQkgICBzdHJ1Y3QgbnNfY29tbW9uICooKmdldF9ucykoc3RydWN0IG5zX2NvbW1vbiAqbnMpKQoreworCXN0cnVjdCBwYXRoIHBhdGggPSB7fTsKKwlzdHJ1Y3QgZmlsZSAqZjsKKwl2b2lkICplcnI7CisJaW50IGZkOworCisJZmQgPSBnZXRfdW51c2VkX2ZkX2ZsYWdzKE9fQ0xPRVhFQyk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIGZkOworCisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IG5zX2NvbW1vbiAqcmVsYXRpdmU7CisKKwkJcmVsYXRpdmUgPSBnZXRfbnMobnMpOworCQlpZiAoSVNfRVJSKHJlbGF0aXZlKSkgeworCQkJcHV0X3VudXNlZF9mZChmZCk7CisJCQlyZXR1cm4gUFRSX0VSUihyZWxhdGl2ZSk7CisJCX0KKworCQllcnIgPSBfX25zX2dldF9wYXRoKCZwYXRoLCByZWxhdGl2ZSk7CisJCWlmIChJU19FUlIoZXJyKSAmJiBQVFJfRVJSKGVycikgPT0gLUVBR0FJTikKKwkJCWNvbnRpbnVlOworCQlicmVhazsKKwl9CisJaWYgKElTX0VSUihlcnIpKSB7CisJCXB1dF91bnVzZWRfZmQoZmQpOworCQlyZXR1cm4gUFRSX0VSUihlcnIpOworCX0KKworCWYgPSBkZW50cnlfb3BlbigmcGF0aCwgT19SRE9OTFksIGN1cnJlbnRfY3JlZCgpKTsKKwlwYXRoX3B1dCgmcGF0aCk7CisJaWYgKElTX0VSUihmKSkgeworCQlwdXRfdW51c2VkX2ZkKGZkKTsKKwkJZmQgPSBQVFJfRVJSKGYpOworCX0gZWxzZQorCQlmZF9pbnN0YWxsKGZkLCBmKTsKKworCXJldHVybiBmZDsKK30KKworc3RhdGljIGxvbmcgbnNfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBpb2N0bCwKKwkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBuc19jb21tb24gKm5zID0gZ2V0X3Byb2NfbnMoZmlsZV9pbm9kZShmaWxwKSk7CisKKwlzd2l0Y2ggKGlvY3RsKSB7CisJY2FzZSBOU19HRVRfVVNFUk5TOgorCQlyZXR1cm4gb3Blbl9yZWxhdGVkX25zKG5zLCBuc19nZXRfb3duZXIpOworCWNhc2UgTlNfR0VUX1BBUkVOVDoKKwkJaWYgKCFucy0+b3BzLT5nZXRfcGFyZW50KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBvcGVuX3JlbGF0ZWRfbnMobnMsIG5zLT5vcHMtPmdldF9wYXJlbnQpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFRZOworCX0KK30KKwogaW50IG5zX2dldF9uYW1lKGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKIAkJCWNvbnN0IHN0cnVjdCBwcm9jX25zX29wZXJhdGlvbnMgKm5zX29wcykKIHsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FsbG9jLmMgYi9mcy9vY2ZzMi9hbGxvYy5jCmluZGV4IDdkYWJiYzMuLmYxNjVmODYgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2FsbG9jLmMKKysrIGIvZnMvb2NmczIvYWxsb2MuYwpAQCAtNTkyMiw3ICs1OTIyLDYgQEAKIH0KIAogc3RhdGljIGludCBvY2ZzMl9yZXBsYXlfdHJ1bmNhdGVfcmVjb3JkcyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKLQkJCQkJIGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJCSBzdHJ1Y3QgaW5vZGUgKmRhdGFfYWxsb2NfaW5vZGUsCiAJCQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRhdGFfYWxsb2NfYmgpCiB7CkBAIC01OTM1LDExICs1OTM0LDE5IEBACiAJc3RydWN0IG9jZnMyX3RydW5jYXRlX2xvZyAqdGw7CiAJc3RydWN0IGlub2RlICp0bF9pbm9kZSA9IG9zYi0+b3NiX3RsX2lub2RlOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqdGxfYmggPSBvc2ItPm9zYl90bF9iaDsKKwloYW5kbGVfdCAqaGFuZGxlOwogCiAJZGkgPSAoc3RydWN0IG9jZnMyX2Rpbm9kZSAqKSB0bF9iaC0+Yl9kYXRhOwogCXRsID0gJmRpLT5pZDIuaV9kZWFsbG9jOwogCWkgPSBsZTE2X3RvX2NwdSh0bC0+dGxfdXNlZCkgLSAxOwogCXdoaWxlIChpID49IDApIHsKKwkJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9UUlVOQ0FURV9MT0dfRkxVU0hfT05FX1JFQyk7CisJCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQkJc3RhdHVzID0gUFRSX0VSUihoYW5kbGUpOworCQkJbWxvZ19lcnJubyhzdGF0dXMpOworCQkJZ290byBiYWlsOworCQl9CisKIAkJLyogQ2FsbGVyIGhhcyBnaXZlbiB1cyBhdCBsZWFzdCBlbm91Z2ggY3JlZGl0cyB0bwogCQkgKiB1cGRhdGUgdGhlIHRydW5jYXRlIGxvZyBkaW5vZGUgKi8KIAkJc3RhdHVzID0gb2NmczJfam91cm5hbF9hY2Nlc3NfZGkoaGFuZGxlLCBJTk9ERV9DQUNIRSh0bF9pbm9kZSksIHRsX2JoLApAQCAtNTk3NCwxMiArNTk4MSw3IEBACiAJCQl9CiAJCX0KIAotCQlzdGF0dXMgPSBvY2ZzMl9leHRlbmRfdHJhbnMoaGFuZGxlLAotCQkJCU9DRlMyX1RSVU5DQVRFX0xPR19GTFVTSF9PTkVfUkVDKTsKLQkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJCWdvdG8gYmFpbDsKLQkJfQorCQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogCQlpLS07CiAJfQogCkBAIC01OTk0LDcgKzU5OTYsNiBAQAogewogCWludCBzdGF0dXM7CiAJdW5zaWduZWQgaW50IG51bV90b19mbHVzaDsKLQloYW5kbGVfdCAqaGFuZGxlOwogCXN0cnVjdCBpbm9kZSAqdGxfaW5vZGUgPSBvc2ItPm9zYl90bF9pbm9kZTsKIAlzdHJ1Y3QgaW5vZGUgKmRhdGFfYWxsb2NfaW5vZGUgPSBOVUxMOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqdGxfYmggPSBvc2ItPm9zYl90bF9iaDsKQEAgLTYwMzgsMjEgKzYwMzksMTEgQEAKIAkJZ290byBvdXRfbXV0ZXg7CiAJfQogCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9UUlVOQ0FURV9MT0dfRkxVU0hfT05FX1JFQyk7Ci0JaWYgKElTX0VSUihoYW5kbGUpKSB7Ci0JCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKLQkJbWxvZ19lcnJubyhzdGF0dXMpOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCi0Jc3RhdHVzID0gb2NmczJfcmVwbGF5X3RydW5jYXRlX3JlY29yZHMob3NiLCBoYW5kbGUsIGRhdGFfYWxsb2NfaW5vZGUsCisJc3RhdHVzID0gb2NmczJfcmVwbGF5X3RydW5jYXRlX3JlY29yZHMob3NiLCBkYXRhX2FsbG9jX2lub2RlLAogCQkJCQkgICAgICAgZGF0YV9hbGxvY19iaCk7CiAJaWYgKHN0YXR1cyA8IDApCiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAotCW9jZnMyX2NvbW1pdF90cmFucyhvc2IsIGhhbmRsZSk7Ci0KLW91dF91bmxvY2s6CiAJYnJlbHNlKGRhdGFfYWxsb2NfYmgpOwogCW9jZnMyX2lub2RlX3VubG9jayhkYXRhX2FsbG9jX2lub2RlLCAxKTsKIApAQCAtNjQxMyw0MyArNjQwNCwzNCBAQAogCQlnb3RvIG91dF9tdXRleDsKIAl9CiAKLQloYW5kbGUgPSBvY2ZzMl9zdGFydF90cmFucyhvc2IsIE9DRlMyX1NVQkFMTE9DX0ZSRUUpOwotCWlmIChJU19FUlIoaGFuZGxlKSkgewotCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQogCXdoaWxlIChoZWFkKSB7CiAJCWlmIChoZWFkLT5mcmVlX2JnKQogCQkJYmdfYmxrbm8gPSBoZWFkLT5mcmVlX2JnOwogCQllbHNlCiAJCQliZ19ibGtubyA9IG9jZnMyX3doaWNoX3N1YmFsbG9jX2dyb3VwKGhlYWQtPmZyZWVfYmxrLAogCQkJCQkJCSAgICAgIGhlYWQtPmZyZWVfYml0KTsKKwkJaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9TVUJBTExPQ19GUkVFKTsKKwkJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKwogCQl0cmFjZV9vY2ZzMl9mcmVlX2NhY2hlZF9ibG9ja3MoCiAJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyloZWFkLT5mcmVlX2JsaywgaGVhZC0+ZnJlZV9iaXQpOwogCiAJCXJldCA9IG9jZnMyX2ZyZWVfc3ViYWxsb2NfYml0cyhoYW5kbGUsIGlub2RlLCBkaV9iaCwKIAkJCQkJICAgICAgIGhlYWQtPmZyZWVfYml0LCBiZ19ibGtubywgMSk7Ci0JCWlmIChyZXQpIHsKKwkJaWYgKHJldCkKIAkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCWdvdG8gb3V0X2pvdXJuYWw7Ci0JCX0KIAotCQlyZXQgPSBvY2ZzMl9leHRlbmRfdHJhbnMoaGFuZGxlLCBPQ0ZTMl9TVUJBTExPQ19GUkVFKTsKLQkJaWYgKHJldCkgewotCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJZ290byBvdXRfam91cm5hbDsKLQkJfQorCQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogCiAJCXRtcCA9IGhlYWQ7CiAJCWhlYWQgPSBoZWFkLT5mcmVlX25leHQ7CiAJCWtmcmVlKHRtcCk7CiAJfQogCi1vdXRfam91cm5hbDoKLQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwotCiBvdXRfdW5sb2NrOgogCW9jZnMyX2lub2RlX3VubG9jayhpbm9kZSwgMSk7CiAJYnJlbHNlKGRpX2JoKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FvcHMuYyBiL2ZzL29jZnMyL2FvcHMuYwppbmRleCA5OGQzNjU0Li5iYmI0YjNlIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9hb3BzLmMKKysrIGIvZnMvb2NmczIvYW9wcy5jCkBAIC0xODQyLDYgKzE4NDIsMTYgQEAKIAlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwogCiBvdXQ6CisJLyoKKwkgKiBUaGUgbW1hcHBlZCBwYWdlIHdvbid0IGJlIHVubG9ja2VkIGluIG9jZnMyX2ZyZWVfd3JpdGVfY3R4dCgpLAorCSAqIGV2ZW4gaW4gY2FzZSBvZiBlcnJvciBoZXJlIGxpa2UgRU5PU1BDIGFuZCBFTk9NRU0uIFNvLCB3ZSBuZWVkCisJICogdG8gdW5sb2NrIHRoZSB0YXJnZXQgcGFnZSBtYW51YWxseSB0byBwcmV2ZW50IGRlYWRsb2NrcyB3aGVuCisJICogcmV0cnlpbmcgYWdhaW4gb24gRU5PU1BDLCBvciB3aGVuIHJldHVybmluZyBub24tVk1fRkFVTFRfTE9DS0VECisJICogdG8gVk0gY29kZS4KKwkgKi8KKwlpZiAod2MtPndfdGFyZ2V0X2xvY2tlZCkKKwkJdW5sb2NrX3BhZ2UobW1hcF9wYWdlKTsKKwogCW9jZnMyX2ZyZWVfd3JpdGVfY3R4dChpbm9kZSwgd2MpOwogCiAJaWYgKGRhdGFfYWMpIHsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvdGNwX2ludGVybmFsLmggYi9mcy9vY2ZzMi9jbHVzdGVyL3RjcF9pbnRlcm5hbC5oCmluZGV4IDk0YjE4MzYuLmI5NWU3ZGYgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2NsdXN0ZXIvdGNwX2ludGVybmFsLmgKKysrIGIvZnMvb2NmczIvY2x1c3Rlci90Y3BfaW50ZXJuYWwuaApAQCAtNDQsOSArNDQsNiBAQAogICogdmVyc2lvbiBoZXJlIGluIHRjcF9pbnRlcm5hbC5oIHNob3VsZCBub3QgbmVlZCB0byBiZSBidW1wZWQgZm9yCiAgKiBmaWxlc3lzdGVtIGxvY2tpbmcgY2hhbmdlcy4KICAqCi0gKiBOZXcgaW4gdmVyc2lvbiAxMgotICoJLSBOZWdvdGlhdGUgaGIgdGltZW91dCB3aGVuIHN0b3JhZ2UgaXMgZG93bi4KLSAqCiAgKiBOZXcgaW4gdmVyc2lvbiAxMQogICogCS0gTmVnb3RpYXRpb24gb2YgZmlsZXN5c3RlbSBsb2NraW5nIGluIHRoZSBkbG0gam9pbi4KICAqCkBAIC03OCw3ICs3NSw3IEBACiAgKiAJLSBmdWxsIDY0IGJpdCBpX3NpemUgaW4gdGhlIG1ldGFkYXRhIGxvY2sgbHZicwogICogCS0gaW50cm9kdWN0aW9uIG9mICJydyIgbG9jayBhbmQgcHVzaGluZyBtZXRhL2RhdGEgbG9ja2luZyBkb3duCiAgKi8KLSNkZWZpbmUgTzJORVRfUFJPVE9DT0xfVkVSU0lPTiAxMlVMTAorI2RlZmluZSBPMk5FVF9QUk9UT0NPTF9WRVJTSU9OIDExVUxMCiBzdHJ1Y3QgbzJuZXRfaGFuZHNoYWtlIHsKIAlfX2JlNjQJcHJvdG9jb2xfdmVyc2lvbjsKIAlfX2JlNjQJY29ubmVjdG9yX2lkOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZGxtL2RsbWNvbnZlcnQuYyBiL2ZzL29jZnMyL2RsbS9kbG1jb252ZXJ0LmMKaW5kZXggY2RlYWZiNC4uMGJiMTI4NiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbWNvbnZlcnQuYworKysgYi9mcy9vY2ZzMi9kbG0vZGxtY29udmVydC5jCkBAIC0yNjgsNyArMjY4LDYgQEAKIAkJCQkgIHN0cnVjdCBkbG1fbG9jayAqbG9jaywgaW50IGZsYWdzLCBpbnQgdHlwZSkKIHsKIAllbnVtIGRsbV9zdGF0dXMgc3RhdHVzOwotCXU4IG9sZF9vd25lciA9IHJlcy0+b3duZXI7CiAKIAltbG9nKDAsICJ0eXBlPSVkLCBjb252ZXJ0X3R5cGU9JWQsIGJ1c3k9JWRcbiIsIGxvY2stPm1sLnR5cGUsCiAJICAgICBsb2NrLT5tbC5jb252ZXJ0X3R5cGUsIHJlcy0+c3RhdGUgJiBETE1fTE9DS19SRVNfSU5fUFJPR1JFU1MpOwpAQCAtMzM1LDcgKzMzNCw2IEBACiAKIAlzcGluX2xvY2soJnJlcy0+c3BpbmxvY2spOwogCXJlcy0+c3RhdGUgJj0gfkRMTV9MT0NLX1JFU19JTl9QUk9HUkVTUzsKLQlsb2NrLT5jb252ZXJ0X3BlbmRpbmcgPSAwOwogCS8qIGlmIGl0IGZhaWxlZCwgbW92ZSBpdCBiYWNrIHRvIGdyYW50ZWQgcXVldWUuCiAJICogaWYgbWFzdGVyIHJldHVybnMgRExNX05PUk1BTCBhbmQgdGhlbiBkb3duIGJlZm9yZSBzZW5kaW5nIGFzdCwKIAkgKiBpdCBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gbW92ZWQgdG8gZ3JhbnRlZCBxdWV1ZSwgcmVzZXQgdG8KQEAgLTM0NCwxMiArMzQyLDE0IEBACiAJCWlmIChzdGF0dXMgIT0gRExNX05PVFFVRVVFRCkKIAkJCWRsbV9lcnJvcihzdGF0dXMpOwogCQlkbG1fcmV2ZXJ0X3BlbmRpbmdfY29udmVydChyZXMsIGxvY2spOwotCX0gZWxzZSBpZiAoKHJlcy0+c3RhdGUgJiBETE1fTE9DS19SRVNfUkVDT1ZFUklORykgfHwKLQkJCShvbGRfb3duZXIgIT0gcmVzLT5vd25lcikpIHsKLQkJbWxvZygwLCAicmVzICUuKnMgaXMgaW4gcmVjb3ZlcmluZyBvciBoYXMgYmVlbiByZWNvdmVyZWQuXG4iLAotCQkJCXJlcy0+bG9ja25hbWUubGVuLCByZXMtPmxvY2tuYW1lLm5hbWUpOworCX0gZWxzZSBpZiAoIWxvY2stPmNvbnZlcnRfcGVuZGluZykgeworCQltbG9nKDAsICIlczogcmVzICUuKnMsIG93bmVyIGRpZWQgYW5kIGxvY2sgaGFzIGJlZW4gbW92ZWQgYmFjayAiCisJCQkJInRvIGdyYW50ZWQgbGlzdCwgcmV0cnkgY29udmVydC5cbiIsCisJCQkJZGxtLT5uYW1lLCByZXMtPmxvY2tuYW1lLmxlbiwgcmVzLT5sb2NrbmFtZS5uYW1lKTsKIAkJc3RhdHVzID0gRExNX1JFQ09WRVJJTkc7CiAJfQorCisJbG9jay0+Y29udmVydF9wZW5kaW5nID0gMDsKIGJhaWw6CiAJc3Bpbl91bmxvY2soJnJlcy0+c3BpbmxvY2spOwogCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9maWxlLmMgYi9mcy9vY2ZzMi9maWxlLmMKaW5kZXggNGU3YjBkYy4uMGIwNTViZiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZmlsZS5jCisrKyBiL2ZzL29jZnMyL2ZpbGUuYwpAQCAtMTUwNiw3ICsxNTA2LDggQEAKIAkJCQkgICAgICAgdTY0IHN0YXJ0LCB1NjQgbGVuKQogewogCWludCByZXQgPSAwOwotCXU2NCB0bXBlbmQsIGVuZCA9IHN0YXJ0ICsgbGVuOworCXU2NCB0bXBlbmQgPSAwOworCXU2NCBlbmQgPSBzdGFydCArIGxlbjsKIAlzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiA9IE9DRlMyX1NCKGlub2RlLT5pX3NiKTsKIAl1bnNpZ25lZCBpbnQgY3NpemUgPSBvc2ItPnNfY2x1c3RlcnNpemU7CiAJaGFuZGxlX3QgKmhhbmRsZTsKQEAgLTE1MzgsMTggKzE1MzksMzEgQEAKIAl9CiAKIAkvKgotCSAqIFdlIHdhbnQgdG8gZ2V0IHRoZSBieXRlIG9mZnNldCBvZiB0aGUgZW5kIG9mIHRoZSAxc3QgY2x1c3Rlci4KKwkgKiBJZiBzdGFydCBpcyBvbiBhIGNsdXN0ZXIgYm91bmRhcnkgYW5kIGVuZCBpcyBzb21ld2hlcmUgaW4gYW5vdGhlcgorCSAqIGNsdXN0ZXIsIHdlIGhhdmUgbm90IENPV2VkIHRoZSBjbHVzdGVyIHN0YXJ0aW5nIGF0IHN0YXJ0LCB1bmxlc3MKKwkgKiBlbmQgaXMgYWxzbyB3aXRoaW4gdGhlIHNhbWUgY2x1c3Rlci4gU28sIGluIHRoaXMgY2FzZSwgd2Ugc2tpcCB0aGlzCisJICogZmlyc3QgY2FsbCB0byBvY2ZzMl96ZXJvX3JhbmdlX2Zvcl90cnVuY2F0ZSgpIHRydW5jYXRlIGFuZCBtb3ZlIG9uCisJICogdG8gdGhlIG5leHQgb25lLgogCSAqLwotCXRtcGVuZCA9ICh1NjQpb3NiLT5zX2NsdXN0ZXJzaXplICsgKHN0YXJ0ICYgfihvc2ItPnNfY2x1c3RlcnNpemUgLSAxKSk7Ci0JaWYgKHRtcGVuZCA+IGVuZCkKLQkJdG1wZW5kID0gZW5kOworCWlmICgoc3RhcnQgJiAoY3NpemUgLSAxKSkgIT0gMCkgeworCQkvKgorCQkgKiBXZSB3YW50IHRvIGdldCB0aGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGVuZCBvZiB0aGUgMXN0CisJCSAqIGNsdXN0ZXIuCisJCSAqLworCQl0bXBlbmQgPSAodTY0KW9zYi0+c19jbHVzdGVyc2l6ZSArCisJCQkoc3RhcnQgJiB+KG9zYi0+c19jbHVzdGVyc2l6ZSAtIDEpKTsKKwkJaWYgKHRtcGVuZCA+IGVuZCkKKwkJCXRtcGVuZCA9IGVuZDsKIAotCXRyYWNlX29jZnMyX3plcm9fcGFydGlhbF9jbHVzdGVyc19yYW5nZTEoKHVuc2lnbmVkIGxvbmcgbG9uZylzdGFydCwKLQkJCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKXRtcGVuZCk7CisJCXRyYWNlX29jZnMyX3plcm9fcGFydGlhbF9jbHVzdGVyc19yYW5nZTEoCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXN0YXJ0LAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl0bXBlbmQpOwogCi0JcmV0ID0gb2NmczJfemVyb19yYW5nZV9mb3JfdHJ1bmNhdGUoaW5vZGUsIGhhbmRsZSwgc3RhcnQsIHRtcGVuZCk7Ci0JaWYgKHJldCkKLQkJbWxvZ19lcnJubyhyZXQpOworCQlyZXQgPSBvY2ZzMl96ZXJvX3JhbmdlX2Zvcl90cnVuY2F0ZShpbm9kZSwgaGFuZGxlLCBzdGFydCwKKwkJCQkJCSAgICB0bXBlbmQpOworCQlpZiAocmV0KQorCQkJbWxvZ19lcnJubyhyZXQpOworCX0KIAogCWlmICh0bXBlbmQgPCBlbmQpIHsKIAkJLyoKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3N1YmFsbG9jLmMgYi9mcy9vY2ZzMi9zdWJhbGxvYy5jCmluZGV4IGVhNDcxMjAuLjZhZDM1MzMgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3N1YmFsbG9jLmMKKysrIGIvZnMvb2NmczIvc3ViYWxsb2MuYwpAQCAtMTE5OSwxNCArMTE5OSwyNCBAQAogCQkJaW5vZGVfdW5sb2NrKCgqYWMpLT5hY19pbm9kZSk7CiAKIAkJCXJldCA9IG9jZnMyX3RyeV90b19mcmVlX3RydW5jYXRlX2xvZyhvc2IsIGJpdHNfd2FudGVkKTsKLQkJCWlmIChyZXQgPT0gMSkKKwkJCWlmIChyZXQgPT0gMSkgeworCQkJCWlwdXQoKCphYyktPmFjX2lub2RlKTsKKwkJCQkoKmFjKS0+YWNfaW5vZGUgPSBOVUxMOwogCQkJCWdvdG8gcmV0cnk7CisJCQl9CiAKIAkJCWlmIChyZXQgPCAwKQogCQkJCW1sb2dfZXJybm8ocmV0KTsKIAogCQkJaW5vZGVfbG9jaygoKmFjKS0+YWNfaW5vZGUpOwotCQkJb2NmczJfaW5vZGVfbG9jaygoKmFjKS0+YWNfaW5vZGUsIE5VTEwsIDEpOworCQkJcmV0ID0gb2NmczJfaW5vZGVfbG9jaygoKmFjKS0+YWNfaW5vZGUsIE5VTEwsIDEpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJaW5vZGVfdW5sb2NrKCgqYWMpLT5hY19pbm9kZSk7CisJCQkJaXB1dCgoKmFjKS0+YWNfaW5vZGUpOworCQkJCSgqYWMpLT5hY19pbm9kZSA9IE5VTEw7CisJCQkJZ290byBiYWlsOworCQkJfQogCQl9CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQlpZiAoc3RhdHVzICE9IC1FTk9TUEMpCmRpZmYgLS1naXQgYS9mcy9vcmFuZ2Vmcy9kY2FjaGUuYyBiL2ZzL29yYW5nZWZzL2RjYWNoZS5jCmluZGV4IDAwMjM1YmYuLjFlOGZlODQgMTAwNjQ0Ci0tLSBhL2ZzL29yYW5nZWZzL2RjYWNoZS5jCisrKyBiL2ZzL29yYW5nZWZzL2RjYWNoZS5jCkBAIC03Myw3ICs3Myw3IEBACiAJCX0KIAl9CiAKLQlkZW50cnktPmRfdGltZSA9IGppZmZpZXMgKyBkY2FjaGVfdGltZW91dF9tc2VjcypIWi8xMDAwOworCWRlbnRyeS0+ZF90aW1lID0gamlmZmllcyArIG9yYW5nZWZzX2RjYWNoZV90aW1lb3V0X21zZWNzKkhaLzEwMDA7CiAJcmV0ID0gMTsKIG91dF9yZWxlYXNlX29wOgogCW9wX3JlbGVhc2UobmV3X29wKTsKZGlmZiAtLWdpdCBhL2ZzL29yYW5nZWZzL2Rldm9yYW5nZWZzLXJlcS5jIGIvZnMvb3JhbmdlZnMvZGV2b3JhbmdlZnMtcmVxLmMKaW5kZXggYTI4N2E2Ni4uNTE2ZmZiNCAxMDA2NDQKLS0tIGEvZnMvb3JhbmdlZnMvZGV2b3JhbmdlZnMtcmVxLmMKKysrIGIvZnMvb3JhbmdlZnMvZGV2b3JhbmdlZnMtcmVxLmMKQEAgLTExLDE0ICsxMSwxOSBAQAogI2luY2x1ZGUgIm9yYW5nZWZzLWtlcm5lbC5oIgogI2luY2x1ZGUgIm9yYW5nZWZzLWRldi1wcm90by5oIgogI2luY2x1ZGUgIm9yYW5nZWZzLWJ1Zm1hcC5oIgorI2luY2x1ZGUgIm9yYW5nZWZzLWRlYnVnZnMuaCIKIAogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKIC8qIHRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSAvZGV2L3B2ZnMyLXJlcSBkZXZpY2Ugbm9kZSAqLwogCit1aW50MzJfdCBvcmFuZ2Vmc191c2Vyc3BhY2VfdmVyc2lvbjsKKwogc3RhdGljIGludCBvcGVuX2FjY2Vzc19jb3VudDsKIAorc3RhdGljIERFRklORV9NVVRFWChkZXZyZXFfbXV0ZXgpOworCiAjZGVmaW5lIERVTVBfREVWSUNFX0VSUk9SKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJZ29zc2lwX2VycigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpO1wKQEAgLTQzLDcgKzQ4LDcgQEAKIHsKIAlpbnQgaW5kZXggPSBoYXNoX2Z1bmMob3AtPnRhZywgaGFzaF90YWJsZV9zaXplKTsKIAotCWxpc3RfYWRkX3RhaWwoJm9wLT5saXN0LCAmaHRhYmxlX29wc19pbl9wcm9ncmVzc1tpbmRleF0pOworCWxpc3RfYWRkX3RhaWwoJm9wLT5saXN0LCAmb3JhbmdlZnNfaHRhYmxlX29wc19pbl9wcm9ncmVzc1tpbmRleF0pOwogfQogCiAvKgpAQCAtNTcsMjAgKzYyLDIwIEBACiAKIAlpbmRleCA9IGhhc2hfZnVuYyh0YWcsIGhhc2hfdGFibGVfc2l6ZSk7CiAKLQlzcGluX2xvY2soJmh0YWJsZV9vcHNfaW5fcHJvZ3Jlc3NfbG9jayk7CisJc3Bpbl9sb2NrKCZvcmFuZ2Vmc19odGFibGVfb3BzX2luX3Byb2dyZXNzX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShvcCwKIAkJCQkgbmV4dCwKLQkJCQkgJmh0YWJsZV9vcHNfaW5fcHJvZ3Jlc3NbaW5kZXhdLAorCQkJCSAmb3JhbmdlZnNfaHRhYmxlX29wc19pbl9wcm9ncmVzc1tpbmRleF0sCiAJCQkJIGxpc3QpIHsKIAkJaWYgKG9wLT50YWcgPT0gdGFnICYmICFvcF9zdGF0ZV9wdXJnZWQob3ApICYmCiAJCSAgICAhb3Bfc3RhdGVfZ2l2ZW5fdXAob3ApKSB7CiAJCQlsaXN0X2RlbF9pbml0KCZvcC0+bGlzdCk7Ci0JCQlzcGluX3VubG9jaygmaHRhYmxlX29wc19pbl9wcm9ncmVzc19sb2NrKTsKKwkJCXNwaW5fdW5sb2NrKCZvcmFuZ2Vmc19odGFibGVfb3BzX2luX3Byb2dyZXNzX2xvY2spOwogCQkJcmV0dXJuIG9wOwogCQl9CiAJfQogCi0Jc3Bpbl91bmxvY2soJmh0YWJsZV9vcHNfaW5fcHJvZ3Jlc3NfbG9jayk7CisJc3Bpbl91bmxvY2soJm9yYW5nZWZzX2h0YWJsZV9vcHNfaW5fcHJvZ3Jlc3NfbG9jayk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTI3NiwxMSArMjgxLDExIEBACiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIGVycm9yOwogCi0Jc3Bpbl9sb2NrKCZodGFibGVfb3BzX2luX3Byb2dyZXNzX2xvY2spOworCXNwaW5fbG9jaygmb3JhbmdlZnNfaHRhYmxlX29wc19pbl9wcm9ncmVzc19sb2NrKTsKIAlzcGluX2xvY2soJmN1cl9vcC0+bG9jayk7CiAJaWYgKHVubGlrZWx5KG9wX3N0YXRlX2dpdmVuX3VwKGN1cl9vcCkpKSB7CiAJCXNwaW5fdW5sb2NrKCZjdXJfb3AtPmxvY2spOwotCQlzcGluX3VubG9jaygmaHRhYmxlX29wc19pbl9wcm9ncmVzc19sb2NrKTsKKwkJc3Bpbl91bmxvY2soJm9yYW5nZWZzX2h0YWJsZV9vcHNfaW5fcHJvZ3Jlc3NfbG9jayk7CiAJCWNvbXBsZXRlKCZjdXJfb3AtPndhaXRxKTsKIAkJZ290byByZXN0YXJ0OwogCX0KQEAgLTI5OCw3ICszMDMsNyBAQAogCQkgICAgIGN1cnJlbnQtPmNvbW0pOwogCW9yYW5nZWZzX2RldnJlcV9hZGRfb3AoY3VyX29wKTsKIAlzcGluX3VubG9jaygmY3VyX29wLT5sb2NrKTsKLQlzcGluX3VubG9jaygmaHRhYmxlX29wc19pbl9wcm9ncmVzc19sb2NrKTsKKwlzcGluX3VubG9jaygmb3JhbmdlZnNfaHRhYmxlX29wc19pbl9wcm9ncmVzc19sb2NrKTsKIAogCS8qIFRoZSBjbGllbnQgb25seSBhc2tzIHRvIHJlYWQgb25lIHNpemUgYnVmZmVyLiAqLwogCXJldHVybiBNQVhfREVWX1JFUV9VUFNJWkU7CkBAIC0zODcsNiArMzkyLDEzIEBACiAJCXJldHVybiAtRVBST1RPOwogCX0KIAorCWlmICghb3JhbmdlZnNfdXNlcnNwYWNlX3ZlcnNpb24pIHsKKwkJb3JhbmdlZnNfdXNlcnNwYWNlX3ZlcnNpb24gPSBoZWFkLnZlcnNpb247CisJfSBlbHNlIGlmIChvcmFuZ2Vmc191c2Vyc3BhY2VfdmVyc2lvbiAhPSBoZWFkLnZlcnNpb24pIHsKKwkJZ29zc2lwX2VycigiRXJyb3I6IHVzZXJzcGFjZSB2ZXJzaW9uIGNoYW5nZXNcbiIpOworCQlyZXR1cm4gLUVQUk9UTzsKKwl9CisKIAkvKiByZW1vdmUgdGhlIG9wIGZyb20gdGhlIGluIHByb2dyZXNzIGhhc2ggdGFibGUgKi8KIAlvcCA9IG9yYW5nZWZzX2RldnJlcV9yZW1vdmVfb3AoaGVhZC50YWcpOwogCWlmICghb3ApIHsKQEAgLTUyNyw2ICs1MzksNyBAQAogCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfREVWX0RFQlVHLAogCQkgICAgICJwdmZzMi1jbGllbnQtY29yZTogZGV2aWNlIGNsb3NlIGNvbXBsZXRlXG4iKTsKIAlvcGVuX2FjY2Vzc19jb3VudCA9IDA7CisJb3JhbmdlZnNfdXNlcnNwYWNlX3ZlcnNpb24gPSAwOwogCW11dGV4X3VubG9jaygmZGV2cmVxX211dGV4KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTU3Niw4ICs1ODksNiBAQAogCXN0YXRpYyBfX3MzMiBtYXhfZG93bl9zaXplID0gTUFYX0RFVl9SRVFfRE9XTlNJWkU7CiAJc3RydWN0IE9SQU5HRUZTX2Rldl9tYXBfZGVzYyB1c2VyX2Rlc2M7CiAJaW50IHJldCA9IDA7Ci0Jc3RydWN0IGRldl9tYXNrX2luZm9fcyBtYXNrX2luZm8gPSB7IDAgfTsKLQlzdHJ1Y3QgZGV2X21hc2syX2luZm9fcyBtYXNrMl9pbmZvID0geyAwLCAwIH07CiAJaW50IHVwc3RyZWFtX2ttb2QgPSAxOwogCXN0cnVjdCBvcmFuZ2Vmc19zYl9pbmZvX3MgKm9yYW5nZWZzX3NiOwogCkBAIC02MTksNyArNjMwLDcgQEAKIAkJICogYWxsIG9mIHRoZSByZW1vdW50cyBhcmUgc2VydmljZWQgKHRvIGF2b2lkIG9wcyBiZXR3ZWVuCiAJCSAqIG1vdW50cyB0byBmYWlsKQogCQkgKi8KLQkJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZyZXF1ZXN0X211dGV4KTsKKwkJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZvcmFuZ2Vmc19yZXF1ZXN0X211dGV4KTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCQlnb3NzaXBfZGVidWcoR09TU0lQX0RFVl9ERUJVRywKQEAgLTY1NCw3ICs2NjUsNyBAQAogCQlnb3NzaXBfZGVidWcoR09TU0lQX0RFVl9ERUJVRywKIAkJCSAgICAgIiVzOiBwcmlvcml0eSByZW1vdW50IGNvbXBsZXRlXG4iLAogCQkJICAgICBfX2Z1bmNfXyk7Ci0JCW11dGV4X3VubG9jaygmcmVxdWVzdF9tdXRleCk7CisJCW11dGV4X3VubG9jaygmb3JhbmdlZnNfcmVxdWVzdF9tdXRleCk7CiAJCXJldHVybiByZXQ7CiAKIAljYXNlIE9SQU5HRUZTX0RFVl9VUFNUUkVBTToKQEAgLTY2OCwxMzQgKzY3OSwxMSBAQAogCQkJcmV0dXJuIHJldDsKIAogCWNhc2UgT1JBTkdFRlNfREVWX0NMSUVOVF9NQVNLOgotCQlyZXQgPSBjb3B5X2Zyb21fdXNlcigmbWFzazJfaW5mbywKLQkJCQkgICAgICh2b2lkIF9fdXNlciAqKWFyZywKLQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgZGV2X21hc2syX2luZm9fcykpOwotCi0JCWlmIChyZXQgIT0gMCkKLQkJCXJldHVybiAtRUlPOwotCi0JCWNsaWVudF9kZWJ1Z19tYXNrLm1hc2sxID0gbWFzazJfaW5mby5tYXNrMV92YWx1ZTsKLQkJY2xpZW50X2RlYnVnX21hc2subWFzazIgPSBtYXNrMl9pbmZvLm1hc2syX3ZhbHVlOwotCi0JCXByX2luZm8oIiVzOiBjbGllbnQgZGVidWcgbWFzayBoYXMgYmVlbiBiZWVuIHJlY2VpdmVkICIKLQkJCSI6JWxseDogOiVsbHg6XG4iLAotCQkJX19mdW5jX18sCi0JCQkodW5zaWduZWQgbG9uZyBsb25nKWNsaWVudF9kZWJ1Z19tYXNrLm1hc2sxLAotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyljbGllbnRfZGVidWdfbWFzay5tYXNrMik7Ci0KLQkJcmV0dXJuIHJldDsKLQorCQlyZXR1cm4gb3JhbmdlZnNfZGVidWdmc19uZXdfY2xpZW50X21hc2soKHZvaWQgX191c2VyICopYXJnKTsKIAljYXNlIE9SQU5HRUZTX0RFVl9DTElFTlRfU1RSSU5HOgotCQlyZXQgPSBjb3B5X2Zyb21fdXNlcigmY2xpZW50X2RlYnVnX2FycmF5X3N0cmluZywKLQkJCQkgICAgICh2b2lkIF9fdXNlciAqKWFyZywKLQkJCQkgICAgIE9SQU5HRUZTX01BWF9ERUJVR19TVFJJTkdfTEVOKTsKLQkJLyoKLQkJICogVGhlIHJlYWwgY2xpZW50LWNvcmUgbWFrZXMgYW4gZWZmb3J0IHRvIGVuc3VyZQotCQkgKiB0aGF0IGFjdHVhbCBzdHJpbmdzIHRoYXQgYXJlbid0IHRvbyBsb25nIHRvIGZpdCBpbgotCQkgKiB0aGlzIGJ1ZmZlciBpcyB3aGF0IHdlIGdldCBoZXJlLiBXZSdyZSBnb2luZyB0byB1c2UKLQkJICogc3RyaW5nIGZ1bmN0aW9ucyBvbiB0aGUgc3R1ZmYgd2UgZ290LCBzbyB3ZSdsbCBtYWtlCi0JCSAqIHRoaXMgZXh0cmEgZWZmb3J0IHRvIHRyeSBhbmQga2VlcCBmcm9tCi0JCSAqIGZsb3dpbmcgb3V0IG9mIHRoaXMgYnVmZmVyIHdoZW4gd2UgdXNlIHRoZSBzdHJpbmcKLQkJICogZnVuY3Rpb25zLCBldmVuIGlmIHNvbWVob3cgdGhlIHN0dWZmIHdlIGVuZCB1cAotCQkgKiB3aXRoIGhlcmUgaXMgZ2FyYmFnZS4KLQkJICovCi0JCWNsaWVudF9kZWJ1Z19hcnJheV9zdHJpbmdbT1JBTkdFRlNfTUFYX0RFQlVHX1NUUklOR19MRU4gLSAxXSA9Ci0JCQknXDAnOwotCQkKLQkJaWYgKHJldCAhPSAwKSB7Ci0JCQlwcl9pbmZvKCIlczogQ0xJRU5UX1NUUklORzogY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iLAotCQkJCV9fZnVuY19fKTsKLQkJCXJldHVybiAtRUlPOwotCQl9Ci0KLQkJcHJfaW5mbygiJXM6IGNsaWVudCBkZWJ1ZyBhcnJheSBzdHJpbmcgaGFzIGJlZW4gcmVjZWl2ZWQuXG4iLAotCQkJX19mdW5jX18pOwotCi0JCWlmICghaGVscF9zdHJpbmdfaW5pdGlhbGl6ZWQpIHsKLQotCQkJLyogRnJlZSB0aGUgIndlIGRvbid0IGtub3cgeWV0IiBkZWZhdWx0IHN0cmluZy4uLiAqLwotCQkJa2ZyZWUoZGVidWdfaGVscF9zdHJpbmcpOwotCi0JCQkvKiBidWlsZCBhIHByb3BlciBkZWJ1ZyBoZWxwIHN0cmluZyAqLwotCQkJaWYgKG9yYW5nZWZzX3ByZXBhcmVfZGVidWdmc19oZWxwX3N0cmluZygwKSkgewotCQkJCWdvc3NpcF9lcnIoIiVzOiBubyBkZWJ1ZyBoZWxwIHN0cmluZyBcbiIsCi0JCQkJCSAgIF9fZnVuY19fKTsKLQkJCQlyZXR1cm4gLUVJTzsKLQkJCX0KLQotCQkJLyogUmVwbGFjZSB0aGUgYm9pbGVycGxhdGUgYm9vdC10aW1lIGRlYnVnLWhlbHAgZmlsZS4gKi8KLQkJCWRlYnVnZnNfcmVtb3ZlKGhlbHBfZmlsZV9kZW50cnkpOwotCi0JCQloZWxwX2ZpbGVfZGVudHJ5ID0KLQkJCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKAotCQkJCQlPUkFOR0VGU19LTU9EX0RFQlVHX0hFTFBfRklMRSwKLQkJCQkJMDQ0NCwKLQkJCQkJZGVidWdfZGlyLAotCQkJCQlkZWJ1Z19oZWxwX3N0cmluZywKLQkJCQkJJmRlYnVnX2hlbHBfZm9wcyk7Ci0KLQkJCWlmICghaGVscF9maWxlX2RlbnRyeSkgewotCQkJCWdvc3NpcF9lcnIoIiVzOiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZCBmb3IiCi0JCQkJCSAgICIgOiVzOiFcbiIsCi0JCQkJCSAgIF9fZnVuY19fLAotCQkJCQkgICBPUkFOR0VGU19LTU9EX0RFQlVHX0hFTFBfRklMRSk7Ci0JCQkJcmV0dXJuIC1FSU87Ci0JCQl9Ci0JCX0KLQotCQlkZWJ1Z19tYXNrX3RvX3N0cmluZygmY2xpZW50X2RlYnVnX21hc2ssIDEpOwotCi0JCWRlYnVnZnNfcmVtb3ZlKGNsaWVudF9kZWJ1Z19kZW50cnkpOwotCi0JCW9yYW5nZWZzX2NsaWVudF9kZWJ1Z19pbml0KCk7Ci0KLQkJaGVscF9zdHJpbmdfaW5pdGlhbGl6ZWQrKzsKLQotCQlyZXR1cm4gcmV0OwotCisJCXJldHVybiBvcmFuZ2Vmc19kZWJ1Z2ZzX25ld19jbGllbnRfc3RyaW5nKCh2b2lkIF9fdXNlciAqKWFyZyk7CiAJY2FzZSBPUkFOR0VGU19ERVZfREVCVUc6Ci0JCXJldCA9IGNvcHlfZnJvbV91c2VyKCZtYXNrX2luZm8sCi0JCQkJICAgICAodm9pZCBfX3VzZXIgKilhcmcsCi0JCQkJICAgICBzaXplb2YobWFza19pbmZvKSk7Ci0KLQkJaWYgKHJldCAhPSAwKQotCQkJcmV0dXJuIC1FSU87Ci0KLQkJaWYgKG1hc2tfaW5mby5tYXNrX3R5cGUgPT0gS0VSTkVMX01BU0spIHsKLQkJCWlmICgobWFza19pbmZvLm1hc2tfdmFsdWUgPT0gMCkKLQkJCSAgICAmJiAoa2VybmVsX21hc2tfc2V0X21vZF9pbml0KSkgewotCQkJCS8qCi0JCQkJICogdGhlIGtlcm5lbCBkZWJ1ZyBtYXNrIHdhcyBzZXQgd2hlbiB0aGUKLQkJCQkgKiBrZXJuZWwgbW9kdWxlIHdhcyBsb2FkZWQ7IGRvbid0IG92ZXJyaWRlCi0JCQkJICogaXQgaWYgdGhlIGNsaWVudC1jb3JlIHdhcyBzdGFydGVkIHdpdGhvdXQKLQkJCQkgKiBhIHZhbHVlIGZvciBPUkFOR0VGU19LTU9ETUFTSy4KLQkJCQkgKi8KLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWRlYnVnX21hc2tfdG9fc3RyaW5nKCZtYXNrX2luZm8ubWFza192YWx1ZSwKLQkJCQkJICAgICBtYXNrX2luZm8ubWFza190eXBlKTsKLQkJCWdvc3NpcF9kZWJ1Z19tYXNrID0gbWFza19pbmZvLm1hc2tfdmFsdWU7Ci0JCQlwcl9pbmZvKCIlczoga2VybmVsIGRlYnVnIG1hc2sgaGFzIGJlZW4gbW9kaWZpZWQgdG8gIgotCQkJCSI6JXM6IDolbGx4OlxuIiwKLQkJCQlfX2Z1bmNfXywKLQkJCQlrZXJuZWxfZGVidWdfc3RyaW5nLAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpZ29zc2lwX2RlYnVnX21hc2spOwotCQl9IGVsc2UgaWYgKG1hc2tfaW5mby5tYXNrX3R5cGUgPT0gQ0xJRU5UX01BU0spIHsKLQkJCWRlYnVnX21hc2tfdG9fc3RyaW5nKCZtYXNrX2luZm8ubWFza192YWx1ZSwKLQkJCQkJICAgICBtYXNrX2luZm8ubWFza190eXBlKTsKLQkJCXByX2luZm8oIiVzOiBjbGllbnQgZGVidWcgbWFzayBoYXMgYmVlbiBtb2RpZmllZCB0byIKLQkJCQkiOiVzOiA6JWxseDpcbiIsCi0JCQkJX19mdW5jX18sCi0JCQkJY2xpZW50X2RlYnVnX3N0cmluZywKLQkJCQlsbHUobWFza19pbmZvLm1hc2tfdmFsdWUpKTsKLQkJfSBlbHNlIHsKLQkJCWdvc3NpcF9sZXJyKCJJbnZhbGlkIG1hc2sgdHlwZS4uLi5cbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlyZXR1cm4gcmV0OwotCisJCXJldHVybiBvcmFuZ2Vmc19kZWJ1Z2ZzX25ld19kZWJ1Zygodm9pZCBfX3VzZXIgKilhcmcpOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PSU9DVExDTUQ7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvb3JhbmdlZnMvZG93bmNhbGwuaCBiL2ZzL29yYW5nZWZzL2Rvd25jYWxsLmgKaW5kZXggNjZiOTkyMS4uM2I4OTIzZiAxMDA2NDQKLS0tIGEvZnMvb3JhbmdlZnMvZG93bmNhbGwuaAorKysgYi9mcy9vcmFuZ2Vmcy9kb3duY2FsbC5oCkBAIC04Myw3ICs4MywxMCBAQAogfTsKIAogc3RydWN0IG9yYW5nZWZzX3BhcmFtX3Jlc3BvbnNlIHsKLQlfX3M2NCB2YWx1ZTsKKwl1bmlvbiB7CisJCV9fczY0IHZhbHVlNjQ7CisJCV9fczMyIHZhbHVlMzJbMl07CisJfSB1OwogfTsKIAogI2RlZmluZSBQRVJGX0NPVU5UX0JVRl9TSVpFIDQwOTYKQEAgLTk4LDYgKzEwMSwxMSBAQAogCWNoYXIgZnNfa2V5W0ZTX0tFWV9CVUZfU0laRV07CiB9OwogCisvKiAyLjkuNiAqLworc3RydWN0IG9yYW5nZWZzX2ZlYXR1cmVzX3Jlc3BvbnNlIHsKKwlfX3U2NCBmZWF0dXJlczsKK307CisKIHN0cnVjdCBvcmFuZ2Vmc19kb3duY2FsbF9zIHsKIAlfX3MzMiB0eXBlOwogCV9fczMyIHN0YXR1czsKQEAgLTExOSw2ICsxMjcsNyBAQAogCQlzdHJ1Y3Qgb3JhbmdlZnNfcGFyYW1fcmVzcG9uc2UgcGFyYW07CiAJCXN0cnVjdCBvcmFuZ2Vmc19wZXJmX2NvdW50X3Jlc3BvbnNlIHBlcmZfY291bnQ7CiAJCXN0cnVjdCBvcmFuZ2Vmc19mc19rZXlfcmVzcG9uc2UgZnNfa2V5OworCQlzdHJ1Y3Qgb3JhbmdlZnNfZmVhdHVyZXNfcmVzcG9uc2UgZmVhdHVyZXM7CiAJfSByZXNwOwogfTsKIApkaWZmIC0tZ2l0IGEvZnMvb3JhbmdlZnMvZmlsZS5jIGIvZnMvb3JhbmdlZnMvZmlsZS5jCmluZGV4IDUyNjA0MGUuLjMzODY4ODYgMTAwNjQ0Ci0tLSBhL2ZzL29yYW5nZWZzL2ZpbGUuYworKysgYi9mcy9vcmFuZ2Vmcy9maWxlLmMKQEAgLTE0LDYgKzE0LDMyIEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAKK3N0YXRpYyBpbnQgZmx1c2hfcmFjYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBvcmFuZ2Vmc19pbm9kZV9zICpvcmFuZ2Vmc19pbm9kZSA9IE9SQU5HRUZTX0koaW5vZGUpOworCXN0cnVjdCBvcmFuZ2Vmc19rZXJuZWxfb3BfcyAqbmV3X29wOworCWludCByZXQ7CisKKwlnb3NzaXBfZGVidWcoR09TU0lQX1VUSUxTX0RFQlVHLAorCSAgICAiJXM6ICVwVTogSGFuZGxlIGlzICVwVSB8IGZzX2lkICVkXG4iLCBfX2Z1bmNfXywKKwkgICAgZ2V0X2toYW5kbGVfZnJvbV9pbm8oaW5vZGUpLCAmb3JhbmdlZnNfaW5vZGUtPnJlZm4ua2hhbmRsZSwKKwkgICAgb3JhbmdlZnNfaW5vZGUtPnJlZm4uZnNfaWQpOworCisJbmV3X29wID0gb3BfYWxsb2MoT1JBTkdFRlNfVkZTX09QX1JBX0ZMVVNIKTsKKwlpZiAoIW5ld19vcCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbmV3X29wLT51cGNhbGwucmVxLnJhX2NhY2hlX2ZsdXNoLnJlZm4gPSBvcmFuZ2Vmc19pbm9kZS0+cmVmbjsKKworCXJldCA9IHNlcnZpY2Vfb3BlcmF0aW9uKG5ld19vcCwgIm9yYW5nZWZzX2ZsdXNoX3JhY2FjaGUiLAorCSAgICBnZXRfaW50ZXJydXB0aWJsZV9mbGFnKGlub2RlKSk7CisKKwlnb3NzaXBfZGVidWcoR09TU0lQX1VUSUxTX0RFQlVHLCAiJXM6IGdvdCByZXR1cm4gdmFsdWUgb2YgJWRcbiIsCisJICAgIF9fZnVuY19fLCByZXQpOworCisJb3BfcmVsZWFzZShuZXdfb3ApOworCXJldHVybiByZXQ7Cit9CisKIC8qCiAgKiBDb3B5IHRvIGNsaWVudC1jb3JlJ3MgYWRkcmVzcyBzcGFjZSBmcm9tIHRoZSBidWZmZXJzIHNwZWNpZmllZAogICogYnkgdGhlIGlvdmVjIHVwdG8gdG90YWxfc2l6ZSBieXRlcy4KQEAgLTM4Niw3ICs0MTIsNyBAQAogCXNpemVfdCBidWZtYXBfc2l6ZTsKIAlzc2l6ZV90IHJldCA9IC1FSU5WQUw7CiAKLQlnX29yYW5nZWZzX3N0YXRzLnJlYWRzKys7CisJb3JhbmdlZnNfc3RhdHMucmVhZHMrKzsKIAogCWJ1Zm1hcF9zaXplID0gb3JhbmdlZnNfYnVmbWFwX3NpemVfcXVlcnkoKTsKIAlpZiAoY291bnQgPiBidWZtYXBfc2l6ZSkgewpAQCAtNDI3LDcgKzQ1Myw3IEBACiAKIAlnb3NzaXBfZGVidWcoR09TU0lQX0ZJTEVfREVCVUcsICJvcmFuZ2Vmc19maWxlX3JlYWRfaXRlclxuIik7CiAKLQlnX29yYW5nZWZzX3N0YXRzLnJlYWRzKys7CisJb3JhbmdlZnNfc3RhdHMucmVhZHMrKzsKIAogCXJjID0gZG9fcmVhZHZfd3JpdGV2KE9SQU5HRUZTX0lPX1JFQUQsIGZpbGUsICZwb3MsIGl0ZXIpOwogCWlvY2ItPmtpX3BvcyA9IHBvczsKQEAgLTQ4OCw3ICs1MTQsNyBAQAogCX0KIAogCWlvY2ItPmtpX3BvcyA9IHBvczsKLQlnX29yYW5nZWZzX3N0YXRzLndyaXRlcysrOworCW9yYW5nZWZzX3N0YXRzLndyaXRlcysrOwogCiBvdXQ6CiAKQEAgLTU5MSwxNSArNjE3LDI0IEBACiAJb3JhbmdlZnNfZmx1c2hfaW5vZGUoaW5vZGUpOwogCiAJLyoKLQkgKiByZW1vdmUgYWxsIGFzc29jaWF0ZWQgaW5vZGUgcGFnZXMgZnJvbSB0aGUgcGFnZSBjYWNoZSBhbmQgbW1hcAorCSAqIHJlbW92ZSBhbGwgYXNzb2NpYXRlZCBpbm9kZSBwYWdlcyBmcm9tIHRoZSBwYWdlIGNhY2hlIGFuZAogCSAqIHJlYWRhaGVhZCBjYWNoZSAoaWYgYW55KTsgdGhpcyBmb3JjZXMgYW4gZXhwZW5zaXZlIHJlZnJlc2ggb2YKIAkgKiBkYXRhIGZvciB0aGUgbmV4dCBjYWxsZXIgb2YgbW1hcCAob3IgJ2dldF9ibG9jaycgYWNjZXNzZXMpCiAJICovCiAJaWYgKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUgJiYKIAkgICAgZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nICYmCi0JICAgIG1hcHBpbmdfbnJwYWdlcygmZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9kYXRhKSkKKwkgICAgbWFwcGluZ19ucnBhZ2VzKCZmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX2RhdGEpKSB7CisJCWlmIChvcmFuZ2Vmc19mZWF0dXJlcyAmIE9SQU5HRUZTX0ZFQVRVUkVfUkVBREFIRUFEKSB7CisJCQlnb3NzaXBfZGVidWcoR09TU0lQX0lOT0RFX0RFQlVHLAorCQkJICAgICJjYWxsaW5nIGZsdXNoX3JhY2FjaGUgb24gJXBVXG4iLAorCQkJICAgIGdldF9raGFuZGxlX2Zyb21faW5vKGlub2RlKSk7CisJCQlmbHVzaF9yYWNhY2hlKGlub2RlKTsKKwkJCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfSU5PREVfREVCVUcsCisJCQkgICAgImZsdXNoX3JhY2FjaGUgZmluaXNoZWRcbiIpOworCQl9CiAJCXRydW5jYXRlX2lub2RlX3BhZ2VzKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZywKIAkJCQkgICAgIDApOworCX0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvb3JhbmdlZnMvbmFtZWkuYyBiL2ZzL29yYW5nZWZzL25hbWVpLmMKaW5kZXggNjJjNTI1OS4uMzUyNjllMyAxMDA2NDQKLS0tIGEvZnMvb3JhbmdlZnMvbmFtZWkuYworKysgYi9mcy9vcmFuZ2Vmcy9uYW1laS5jCkBAIC03Miw3ICs3Miw3IEBACiAKIAlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwogCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOwotCWRlbnRyeS0+ZF90aW1lID0gamlmZmllcyArIGRjYWNoZV90aW1lb3V0X21zZWNzKkhaLzEwMDA7CisJZGVudHJ5LT5kX3RpbWUgPSBqaWZmaWVzICsgb3JhbmdlZnNfZGNhY2hlX3RpbWVvdXRfbXNlY3MqSFovMTAwMDsKIAlPUkFOR0VGU19JKGlub2RlKS0+Z2V0YXR0cl90aW1lID0gamlmZmllcyAtIDE7CiAKIAlnb3NzaXBfZGVidWcoR09TU0lQX05BTUVfREVCVUcsCkBAIC0xODMsNyArMTgzLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JZGVudHJ5LT5kX3RpbWUgPSBqaWZmaWVzICsgZGNhY2hlX3RpbWVvdXRfbXNlY3MqSFovMTAwMDsKKwlkZW50cnktPmRfdGltZSA9IGppZmZpZXMgKyBvcmFuZ2Vmc19kY2FjaGVfdGltZW91dF9tc2VjcypIWi8xMDAwOwogCiAJaW5vZGUgPSBvcmFuZ2Vmc19pZ2V0KGRpci0+aV9zYiwgJm5ld19vcC0+ZG93bmNhbGwucmVzcC5sb29rdXAucmVmbik7CiAJaWYgKElTX0VSUihpbm9kZSkpIHsKQEAgLTMyMiw3ICszMjIsNyBAQAogCiAJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKIAl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKLQlkZW50cnktPmRfdGltZSA9IGppZmZpZXMgKyBkY2FjaGVfdGltZW91dF9tc2VjcypIWi8xMDAwOworCWRlbnRyeS0+ZF90aW1lID0gamlmZmllcyArIG9yYW5nZWZzX2RjYWNoZV90aW1lb3V0X21zZWNzKkhaLzEwMDA7CiAJT1JBTkdFRlNfSShpbm9kZSktPmdldGF0dHJfdGltZSA9IGppZmZpZXMgLSAxOwogCiAJZ29zc2lwX2RlYnVnKEdPU1NJUF9OQU1FX0RFQlVHLApAQCAtMzg2LDcgKzM4Niw3IEBACiAKIAlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwogCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOwotCWRlbnRyeS0+ZF90aW1lID0gamlmZmllcyArIGRjYWNoZV90aW1lb3V0X21zZWNzKkhaLzEwMDA7CisJZGVudHJ5LT5kX3RpbWUgPSBqaWZmaWVzICsgb3JhbmdlZnNfZGNhY2hlX3RpbWVvdXRfbXNlY3MqSFovMTAwMDsKIAlPUkFOR0VGU19JKGlub2RlKS0+Z2V0YXR0cl90aW1lID0gamlmZmllcyAtIDE7CiAKIAlnb3NzaXBfZGVidWcoR09TU0lQX05BTUVfREVCVUcsCmRpZmYgLS1naXQgYS9mcy9vcmFuZ2Vmcy9vcmFuZ2Vmcy1jYWNoZS5jIGIvZnMvb3JhbmdlZnMvb3JhbmdlZnMtY2FjaGUuYwppbmRleCBiNmVkYmU5Zi4uYWEzODMwYiAxMDA2NDQKLS0tIGEvZnMvb3JhbmdlZnMvb3JhbmdlZnMtY2FjaGUuYworKysgYi9mcy9vcmFuZ2Vmcy9vcmFuZ2Vmcy1jYWNoZS5jCkBAIC03Myw4ICs3Myw4IEBACiAJCQlyZXR1cm4gIk9QX1NUQVRGUyI7CiAJCWVsc2UgaWYgKHR5cGUgPT0gT1JBTkdFRlNfVkZTX09QX1RSVU5DQVRFKQogCQkJcmV0dXJuICJPUF9UUlVOQ0FURSI7Ci0JCWVsc2UgaWYgKHR5cGUgPT0gT1JBTkdFRlNfVkZTX09QX01NQVBfUkFfRkxVU0gpCi0JCQlyZXR1cm4gIk9QX01NQVBfUkFfRkxVU0giOworCQllbHNlIGlmICh0eXBlID09IE9SQU5HRUZTX1ZGU19PUF9SQV9GTFVTSCkKKwkJCXJldHVybiAiT1BfUkFfRkxVU0giOwogCQllbHNlIGlmICh0eXBlID09IE9SQU5HRUZTX1ZGU19PUF9GU19NT1VOVCkKIAkJCXJldHVybiAiT1BfRlNfTU9VTlQiOwogCQllbHNlIGlmICh0eXBlID09IE9SQU5HRUZTX1ZGU19PUF9GU19VTU9VTlQpCkBAIC05Nyw2ICs5Nyw4IEBACiAJCQlyZXR1cm4gIk9QX0ZTWU5DIjsKIAkJZWxzZSBpZiAodHlwZSA9PSBPUkFOR0VGU19WRlNfT1BfRlNLRVkpCiAJCQlyZXR1cm4gIk9QX0ZTS0VZIjsKKwkJZWxzZSBpZiAodHlwZSA9PSBPUkFOR0VGU19WRlNfT1BfRkVBVFVSRVMpCisJCQlyZXR1cm4gIk9QX0ZFQVRVUkVTIjsKIAl9CiAJcmV0dXJuICJPUF9VTktOT1dOPyI7CiB9CmRpZmYgLS1naXQgYS9mcy9vcmFuZ2Vmcy9vcmFuZ2Vmcy1kZWJ1Z2ZzLmMgYi9mcy9vcmFuZ2Vmcy9vcmFuZ2Vmcy1kZWJ1Z2ZzLmMKaW5kZXggMTcxNGE3My4uOWIyNDEwNyAxMDA2NDQKLS0tIGEvZnMvb3JhbmdlZnMvb3JhbmdlZnMtZGVidWdmcy5jCisrKyBiL2ZzL29yYW5nZWZzL29yYW5nZWZzLWRlYnVnZnMuYwpAQCAtNDMsMzYgKzQzLDM1IEBACiAjaW5jbHVkZSAicHJvdG9jb2wuaCIKICNpbmNsdWRlICJvcmFuZ2Vmcy1rZXJuZWwuaCIKIAotc3RhdGljIGludCBvcmFuZ2Vmc19kZWJ1Z19kaXNhYmxlZCA9IDE7CisjZGVmaW5lIERFQlVHX0hFTFBfU1RSSU5HX1NJWkUgNDA5NgorI2RlZmluZSBIRUxQX1NUUklOR19VTklOSVRJQUxJWkVEIFwKKwkiQ2xpZW50IERlYnVnIEtleXdvcmRzIGFyZSB1bmtub3duIHVudGlsIHRoZSBmaXJzdCB0aW1lXG4iIFwKKwkidGhlIGNsaWVudCBpcyBzdGFydGVkIGFmdGVyIGJvb3QuXG4iCisjZGVmaW5lIE9SQU5HRUZTX0tNT0RfREVCVUdfSEVMUF9GSUxFICJkZWJ1Zy1oZWxwIgorI2RlZmluZSBPUkFOR0VGU19LTU9EX0RFQlVHX0ZJTEUgImtlcm5lbC1kZWJ1ZyIKKyNkZWZpbmUgT1JBTkdFRlNfQ0xJRU5UX0RFQlVHX0ZJTEUgImNsaWVudC1kZWJ1ZyIKKyNkZWZpbmUgT1JBTkdFRlNfVkVSQk9TRSAidmVyYm9zZSIKKyNkZWZpbmUgT1JBTkdFRlNfQUxMICJhbGwiCiAKLXN0YXRpYyBpbnQgb3JhbmdlZnNfZGVidWdfaGVscF9vcGVuKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKLQotY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z19oZWxwX2ZvcHMgPSB7Ci0JLm9wZW4gICAgICAgICAgID0gb3JhbmdlZnNfZGVidWdfaGVscF9vcGVuLAotCS5yZWFkICAgICAgICAgICA9IHNlcV9yZWFkLAotCS5yZWxlYXNlICAgICAgICA9IHNlcV9yZWxlYXNlLAotCS5sbHNlZWsgICAgICAgICA9IHNlcV9sc2VlaywKKy8qCisgKiBBbiBhcnJheSBvZiBjbGllbnRfZGVidWdfbWFzayB3aWxsIGJlIGJ1aWx0IHRvIGhvbGQgZGVidWcga2V5d29yZC9tYXNrCisgKiB2YWx1ZXMgZmV0Y2hlZCBmcm9tIHVzZXJzcGFjZS4KKyAqLworc3RydWN0IGNsaWVudF9kZWJ1Z19tYXNrIHsKKwljaGFyICprZXl3b3JkOworCV9fdTY0IG1hc2sxOworCV9fdTY0IG1hc2syOwogfTsKIAorc3RhdGljIGludCBvcmFuZ2Vmc19rZXJuZWxfZGVidWdfaW5pdCh2b2lkKTsKKworc3RhdGljIGludCBvcmFuZ2Vmc19kZWJ1Z19oZWxwX29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwogc3RhdGljIHZvaWQgKmhlbHBfc3RhcnQoc3RydWN0IHNlcV9maWxlICosIGxvZmZfdCAqKTsKIHN0YXRpYyB2b2lkICpoZWxwX25leHQoc3RydWN0IHNlcV9maWxlICosIHZvaWQgKiwgbG9mZl90ICopOwogc3RhdGljIHZvaWQgaGVscF9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqLCB2b2lkICopOwogc3RhdGljIGludCBoZWxwX3Nob3coc3RydWN0IHNlcV9maWxlICosIHZvaWQgKik7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaGVscF9kZWJ1Z19vcHMgPSB7Ci0JLnN0YXJ0CT0gaGVscF9zdGFydCwKLQkubmV4dAk9IGhlbHBfbmV4dCwKLQkuc3RvcAk9IGhlbHBfc3RvcCwKLQkuc2hvdwk9IGhlbHBfc2hvdywKLX07Ci0KLS8qCi0gKiBVc2VkIHRvIHByb3RlY3QgZGF0YSBpbiBPUkFOR0VGU19LTU9EX0RFQlVHX0ZJTEUgYW5kCi0gKiBPUkFOR0VGU19LTU9EX0RFQlVHX0ZJTEUuCi0gKi8KLXN0YXRpYyBERUZJTkVfTVVURVgob3JhbmdlZnNfZGVidWdfbG9jayk7Ci0KLWludCBvcmFuZ2Vmc19kZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKK3N0YXRpYyBpbnQgb3JhbmdlZnNfZGVidWdfb3BlbihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CiAKIHN0YXRpYyBzc2l6ZV90IG9yYW5nZWZzX2RlYnVnX3JlYWQoc3RydWN0IGZpbGUgKiwKIAkJCQkgY2hhciBfX3VzZXIgKiwKQEAgLTg0LDYgKzgzLDQzIEBACiAJCQkJICBzaXplX3QsCiAJCQkJICBsb2ZmX3QgKik7CiAKK3N0YXRpYyBpbnQgb3JhbmdlZnNfcHJlcGFyZV9jZG1fYXJyYXkoY2hhciAqKTsKK3N0YXRpYyB2b2lkIGRlYnVnX21hc2tfdG9fc3RyaW5nKHZvaWQgKiwgaW50KTsKK3N0YXRpYyB2b2lkIGRvX2tfc3RyaW5nKHZvaWQgKiwgaW50KTsKK3N0YXRpYyB2b2lkIGRvX2Nfc3RyaW5nKHZvaWQgKiwgaW50KTsKK3N0YXRpYyBpbnQga2V5d29yZF9pc19hbWFsZ2FtKGNoYXIgKik7CitzdGF0aWMgaW50IGNoZWNrX2FtYWxnYW1fa2V5d29yZCh2b2lkICosIGludCk7CitzdGF0aWMgdm9pZCBkZWJ1Z19zdHJpbmdfdG9fbWFzayhjaGFyICosIHZvaWQgKiwgaW50KTsKK3N0YXRpYyB2b2lkIGRvX2NfbWFzayhpbnQsIGNoYXIgKiwgc3RydWN0IGNsaWVudF9kZWJ1Z19tYXNrICoqKTsKK3N0YXRpYyB2b2lkIGRvX2tfbWFzayhpbnQsIGNoYXIgKiwgX191NjQgKiopOworCitzdGF0aWMgY2hhciBrZXJuZWxfZGVidWdfc3RyaW5nW09SQU5HRUZTX01BWF9ERUJVR19TVFJJTkdfTEVOXSA9ICJub25lIjsKK3N0YXRpYyBjaGFyICpkZWJ1Z19oZWxwX3N0cmluZzsKK3N0YXRpYyBjaGFyIGNsaWVudF9kZWJ1Z19zdHJpbmdbT1JBTkdFRlNfTUFYX0RFQlVHX1NUUklOR19MRU5dOworc3RhdGljIGNoYXIgY2xpZW50X2RlYnVnX2FycmF5X3N0cmluZ1tPUkFOR0VGU19NQVhfREVCVUdfU1RSSU5HX0xFTl07CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpoZWxwX2ZpbGVfZGVudHJ5Oworc3RhdGljIHN0cnVjdCBkZW50cnkgKmNsaWVudF9kZWJ1Z19kZW50cnk7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZGVidWdfZGlyOworCitzdGF0aWMgdW5zaWduZWQgaW50IGtlcm5lbF9tYXNrX3NldF9tb2RfaW5pdDsKK3N0YXRpYyBpbnQgb3JhbmdlZnNfZGVidWdfZGlzYWJsZWQgPSAxOworc3RhdGljIGludCBoZWxwX3N0cmluZ19pbml0aWFsaXplZDsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBoZWxwX2RlYnVnX29wcyA9IHsKKwkuc3RhcnQJPSBoZWxwX3N0YXJ0LAorCS5uZXh0CT0gaGVscF9uZXh0LAorCS5zdG9wCT0gaGVscF9zdG9wLAorCS5zaG93CT0gaGVscF9zaG93LAorfTsKKworY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z19oZWxwX2ZvcHMgPSB7CisJLm9wZW4gICAgICAgICAgID0gb3JhbmdlZnNfZGVidWdfaGVscF9vcGVuLAorCS5yZWFkICAgICAgICAgICA9IHNlcV9yZWFkLAorCS5yZWxlYXNlICAgICAgICA9IHNlcV9yZWxlYXNlLAorCS5sbHNlZWsgICAgICAgICA9IHNlcV9sc2VlaywKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGtlcm5lbF9kZWJ1Z19mb3BzID0gewogCS5vcGVuICAgICAgICAgICA9IG9yYW5nZWZzX2RlYnVnX29wZW4sCiAJLnJlYWQgICAgICAgICAgID0gb3JhbmdlZnNfZGVidWdfcmVhZCwKQEAgLTkxLDE1ICsxMjcsNTUgQEAKIAkubGxzZWVrICAgICAgICAgPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAogfTsKIAorc3RhdGljIGludCBjbGllbnRfYWxsX2luZGV4Oworc3RhdGljIGludCBjbGllbnRfdmVyYm9zZV9pbmRleDsKKworc3RhdGljIHN0cnVjdCBjbGllbnRfZGVidWdfbWFzayAqY2RtX2FycmF5Oworc3RhdGljIGludCBjZG1fZWxlbWVudF9jb3VudDsKKworc3RhdGljIHN0cnVjdCBjbGllbnRfZGVidWdfbWFzayBjbGllbnRfZGVidWdfbWFzazsKKworLyoKKyAqIFVzZWQgdG8gcHJvdGVjdCBkYXRhIGluIE9SQU5HRUZTX0tNT0RfREVCVUdfRklMRSBhbmQKKyAqIE9SQU5HRUZTX0tNT0RfREVCVUdfRklMRS4KKyAqLworc3RhdGljIERFRklORV9NVVRFWChvcmFuZ2Vmc19kZWJ1Z19sb2NrKTsKKwogLyoKICAqIGluaXRpYWxpemUga21vZCBkZWJ1ZyBvcGVyYXRpb25zLCBjcmVhdGUgb3JhbmdlZnMgZGVidWdmcyBkaXIgYW5kCiAgKiBPUkFOR0VGU19LTU9EX0RFQlVHX0hFTFBfRklMRS4KICAqLwotaW50IG9yYW5nZWZzX2RlYnVnZnNfaW5pdCh2b2lkKQoraW50IG9yYW5nZWZzX2RlYnVnZnNfaW5pdChpbnQgZGVidWdfbWFzaykKIHsKLQogCWludCByYyA9IC1FTk9NRU07CiAKKwkvKiBjb252ZXJ0IGlucHV0IGRlYnVnIG1hc2sgdG8gYSA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciAqLworICAgICAgICBvcmFuZ2Vmc19nb3NzaXBfZGVidWdfbWFzayA9ICh1bnNpZ25lZCBsb25nIGxvbmcpZGVidWdfbWFzazsKKworCS8qCisJICogc2V0IHRoZSBrZXJuZWwncyBnb3NzaXAgZGVidWcgc3RyaW5nOyBpbnZhbGlkIG1hc2sgdmFsdWVzIHdpbGwKKwkgKiBiZSBpZ25vcmVkLgorCSAqLworCWRlYnVnX21hc2tfdG9fc3RyaW5nKCZvcmFuZ2Vmc19nb3NzaXBfZGVidWdfbWFzaywgMCk7CisKKwkvKiByZW1vdmUgYW55IGludmFsaWQgdmFsdWVzIGZyb20gdGhlIG1hc2sgKi8KKwlkZWJ1Z19zdHJpbmdfdG9fbWFzayhrZXJuZWxfZGVidWdfc3RyaW5nLCAmb3JhbmdlZnNfZ29zc2lwX2RlYnVnX21hc2ssCisJICAgIDApOworCisJLyoKKwkgKiBpZiB0aGUgbWFzayBoYXMgYSBub24temVybyB2YWx1ZSwgdGhlbiBpbmRpY2F0ZSB0aGF0IHRoZSBtYXNrCisJICogd2FzIHNldCB3aGVuIHRoZSBrZXJuZWwgbW9kdWxlIHdhcyBsb2FkZWQuICBUaGUgb3JhbmdlZnMgZGV2IGlvY3RsCisJICogY29tbWFuZCB3aWxsIGxvb2sgYXQgdGhpcyBib29sZWFuIHRvIGRldGVybWluZSBpZiB0aGUga2VybmVsJ3MKKwkgKiBkZWJ1ZyBtYXNrIHNob3VsZCBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBjbGllbnQtY29yZSBpcyBzdGFydGVkLgorCSAqLworCWlmIChvcmFuZ2Vmc19nb3NzaXBfZGVidWdfbWFzayAhPSAwKQorCQlrZXJuZWxfbWFza19zZXRfbW9kX2luaXQgPSB0cnVlOworCisJcHJfaW5mbygiJXM6IGNhbGxlZCB3aXRoIGRlYnVnIG1hc2s6IDolczogOiVsbHg6XG4iLAorCQlfX2Z1bmNfXywKKwkJa2VybmVsX2RlYnVnX3N0cmluZywKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylvcmFuZ2Vmc19nb3NzaXBfZGVidWdfbWFzayk7CisKIAlkZWJ1Z19kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoIm9yYW5nZWZzIiwgTlVMTCk7CiAJaWYgKCFkZWJ1Z19kaXIpIHsKIAkJcHJfaW5mbygiJXM6IGRlYnVnZnNfY3JlYXRlX2RpciBmYWlsZWQuXG4iLCBfX2Z1bmNfXyk7CkBAIC0xMTcsMTMgKzE5Myw1OCBAQAogCX0KIAogCW9yYW5nZWZzX2RlYnVnX2Rpc2FibGVkID0gMDsKLQlyYyA9IDA7CisKKwlyYyA9IG9yYW5nZWZzX2tlcm5lbF9kZWJ1Z19pbml0KCk7CiAKIG91dDoKIAogCXJldHVybiByYzsKIH0KIAorLyoKKyAqIGluaXRpYWxpemUgdGhlIGtlcm5lbC1kZWJ1ZyBmaWxlLgorICovCitzdGF0aWMgaW50IG9yYW5nZWZzX2tlcm5lbF9kZWJ1Z19pbml0KHZvaWQpCit7CisJaW50IHJjID0gLUVOT01FTTsKKwlzdHJ1Y3QgZGVudHJ5ICpyZXQ7CisJY2hhciAqa19idWZmZXIgPSBOVUxMOworCisJZ29zc2lwX2RlYnVnKEdPU1NJUF9ERUJVR0ZTX0RFQlVHLCAiJXM6IHN0YXJ0XG4iLCBfX2Z1bmNfXyk7CisKKwlrX2J1ZmZlciA9IGt6YWxsb2MoT1JBTkdFRlNfTUFYX0RFQlVHX1NUUklOR19MRU4sIEdGUF9LRVJORUwpOworCWlmICgha19idWZmZXIpCisJCWdvdG8gb3V0OworCisJaWYgKHN0cmxlbihrZXJuZWxfZGVidWdfc3RyaW5nKSArIDEgPCBPUkFOR0VGU19NQVhfREVCVUdfU1RSSU5HX0xFTikgeworCQlzdHJjcHkoa19idWZmZXIsIGtlcm5lbF9kZWJ1Z19zdHJpbmcpOworCQlzdHJjYXQoa19idWZmZXIsICJcbiIpOworCX0gZWxzZSB7CisJCXN0cmNweShrX2J1ZmZlciwgIm5vbmVcbiIpOworCQlwcl9pbmZvKCIlczogb3ZlcmZsb3cgMSFcbiIsIF9fZnVuY19fKTsKKwl9CisKKwlyZXQgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKE9SQU5HRUZTX0tNT0RfREVCVUdfRklMRSwKKwkJCQkgIDA0NDQsCisJCQkJICBkZWJ1Z19kaXIsCisJCQkJICBrX2J1ZmZlciwKKwkJCQkgICZrZXJuZWxfZGVidWdfZm9wcyk7CisJaWYgKCFyZXQpIHsKKwkJcHJfaW5mbygiJXM6IGZhaWxlZCB0byBjcmVhdGUgJXMuXG4iLAorCQkJX19mdW5jX18sCisJCQlPUkFOR0VGU19LTU9EX0RFQlVHX0ZJTEUpOworCQlnb3RvIG91dDsKKwl9CisKKwlyYyA9IDA7CisKK291dDoKKworCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfREVCVUdGU19ERUJVRywgIiVzOiByYzolZDpcbiIsIF9fZnVuY19fLCByYyk7CisJcmV0dXJuIHJjOworfQorCisKIHZvaWQgb3JhbmdlZnNfZGVidWdmc19jbGVhbnVwKHZvaWQpCiB7CiAJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGRlYnVnX2Rpcik7CkBAIC0xOTYsNDkgKzMxNyw2IEBACiB9CiAKIC8qCi0gKiBpbml0aWFsaXplIHRoZSBrZXJuZWwtZGVidWcgZmlsZS4KLSAqLwotaW50IG9yYW5nZWZzX2tlcm5lbF9kZWJ1Z19pbml0KHZvaWQpCi17Ci0JaW50IHJjID0gLUVOT01FTTsKLQlzdHJ1Y3QgZGVudHJ5ICpyZXQ7Ci0JY2hhciAqa19idWZmZXIgPSBOVUxMOwotCi0JZ29zc2lwX2RlYnVnKEdPU1NJUF9ERUJVR0ZTX0RFQlVHLCAiJXM6IHN0YXJ0XG4iLCBfX2Z1bmNfXyk7Ci0KLQlrX2J1ZmZlciA9IGt6YWxsb2MoT1JBTkdFRlNfTUFYX0RFQlVHX1NUUklOR19MRU4sIEdGUF9LRVJORUwpOwotCWlmICgha19idWZmZXIpCi0JCWdvdG8gb3V0OwotCi0JaWYgKHN0cmxlbihrZXJuZWxfZGVidWdfc3RyaW5nKSArIDEgPCBPUkFOR0VGU19NQVhfREVCVUdfU1RSSU5HX0xFTikgewotCQlzdHJjcHkoa19idWZmZXIsIGtlcm5lbF9kZWJ1Z19zdHJpbmcpOwotCQlzdHJjYXQoa19idWZmZXIsICJcbiIpOwotCX0gZWxzZSB7Ci0JCXN0cmNweShrX2J1ZmZlciwgIm5vbmVcbiIpOwotCQlwcl9pbmZvKCIlczogb3ZlcmZsb3cgMSFcbiIsIF9fZnVuY19fKTsKLQl9Ci0KLQlyZXQgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKE9SQU5HRUZTX0tNT0RfREVCVUdfRklMRSwKLQkJCQkgIDA0NDQsCi0JCQkJICBkZWJ1Z19kaXIsCi0JCQkJICBrX2J1ZmZlciwKLQkJCQkgICZrZXJuZWxfZGVidWdfZm9wcyk7Ci0JaWYgKCFyZXQpIHsKLQkJcHJfaW5mbygiJXM6IGZhaWxlZCB0byBjcmVhdGUgJXMuXG4iLAotCQkJX19mdW5jX18sCi0JCQlPUkFOR0VGU19LTU9EX0RFQlVHX0ZJTEUpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyYyA9IDA7Ci0KLW91dDoKLQotCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfREVCVUdGU19ERUJVRywgIiVzOiByYzolZDpcbiIsIF9fZnVuY19fLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotCi0vKgogICogaW5pdGlhbGl6ZSB0aGUgY2xpZW50LWRlYnVnIGZpbGUuCiAgKi8KIGludCBvcmFuZ2Vmc19jbGllbnRfZGVidWdfaW5pdCh2b2lkKQpAQCAtMjgyLDcgKzM2MCw3IEBACiB9CiAKIC8qIG9wZW4gT1JBTkdFRlNfS01PRF9ERUJVR19GSUxFIG9yIE9SQU5HRUZTX0NMSUVOVF9ERUJVR19GSUxFLiovCi1pbnQgb3JhbmdlZnNfZGVidWdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3N0YXRpYyBpbnQgb3JhbmdlZnNfZGVidWdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlpbnQgcmMgPSAtRU5PREVWOwogCkBAIC0zODQsOCArNDYyLDggQEAKIAkgKi8KIAlpZiAoIXN0cmNtcChmaWxlLT5mX3BhdGguZGVudHJ5LT5kX25hbWUubmFtZSwKIAkJICAgIE9SQU5HRUZTX0tNT0RfREVCVUdfRklMRSkpIHsKLQkJZGVidWdfc3RyaW5nX3RvX21hc2soYnVmLCAmZ29zc2lwX2RlYnVnX21hc2ssIDApOwotCQlkZWJ1Z19tYXNrX3RvX3N0cmluZygmZ29zc2lwX2RlYnVnX21hc2ssIDApOworCQlkZWJ1Z19zdHJpbmdfdG9fbWFzayhidWYsICZvcmFuZ2Vmc19nb3NzaXBfZGVidWdfbWFzaywgMCk7CisJCWRlYnVnX21hc2tfdG9fc3RyaW5nKCZvcmFuZ2Vmc19nb3NzaXBfZGVidWdfbWFzaywgMCk7CiAJCWRlYnVnX3N0cmluZyA9IGtlcm5lbF9kZWJ1Z19zdHJpbmc7CiAJCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfREVCVUdGU19ERUJVRywKIAkJCSAgICAgIk5ldyBrZXJuZWwgZGVidWcgc3RyaW5nIGlzICVzXG4iLApAQCAtNDUyLDMgKzUzMCw1NDYgQEAKIAlrZnJlZShidWYpOwogCXJldHVybiByYzsKIH0KKworLyoKKyAqIEFmdGVyIG9idGFpbmluZyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2xpZW50J3MgZGVidWcKKyAqIGtleXdvcmRzIGFuZCB0aGVpciBhc3NvY2lhdGVkIG1hc2tzLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBidWlsZCBhbgorICogYXJyYXkgb2YgdGhlc2UgdmFsdWVzLgorICovCitzdGF0aWMgaW50IG9yYW5nZWZzX3ByZXBhcmVfY2RtX2FycmF5KGNoYXIgKmRlYnVnX2FycmF5X3N0cmluZykKK3sKKwlpbnQgaTsKKwlpbnQgcmMgPSAtRUlOVkFMOworCWNoYXIgKmNkc19oZWFkID0gTlVMTDsKKwljaGFyICpjZHNfZGVsaW1pdGVyID0gTlVMTDsKKwlpbnQga2V5d29yZF9sZW4gPSAwOworCisJZ29zc2lwX2RlYnVnKEdPU1NJUF9VVElMU19ERUJVRywgIiVzOiBzdGFydFxuIiwgX19mdW5jX18pOworCisJLyoKKwkgKiBmaWd1cmUgb3V0IGhvdyBtYW55IGVsZW1lbnRzIHRoZSBjZG1fYXJyYXkgbmVlZHMuCisJICovCisJZm9yIChpID0gMDsgaSA8IHN0cmxlbihkZWJ1Z19hcnJheV9zdHJpbmcpOyBpKyspCisJCWlmIChkZWJ1Z19hcnJheV9zdHJpbmdbaV0gPT0gJ1xuJykKKwkJCWNkbV9lbGVtZW50X2NvdW50Kys7CisKKwlpZiAoIWNkbV9lbGVtZW50X2NvdW50KSB7CisJCXByX2luZm8oIk5vIGVsZW1lbnRzIGluIGNsaWVudCBkZWJ1ZyBhcnJheSBzdHJpbmchXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJY2RtX2FycmF5ID0KKwkJa3phbGxvYyhjZG1fZWxlbWVudF9jb3VudCAqIHNpemVvZihzdHJ1Y3QgY2xpZW50X2RlYnVnX21hc2spLAorCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFjZG1fYXJyYXkpIHsKKwkJcHJfaW5mbygibWFsbG9jIGZhaWxlZCBmb3IgY2RtX2FycmF5IVxuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJY2RzX2hlYWQgPSBkZWJ1Z19hcnJheV9zdHJpbmc7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2RtX2VsZW1lbnRfY291bnQ7IGkrKykgeworCQljZHNfZGVsaW1pdGVyID0gc3RyY2hyKGNkc19oZWFkLCAnXG4nKTsKKwkJKmNkc19kZWxpbWl0ZXIgPSAnXDAnOworCisJCWtleXdvcmRfbGVuID0gc3RyY3NwbihjZHNfaGVhZCwgIiAiKTsKKworCQljZG1fYXJyYXlbaV0ua2V5d29yZCA9IGt6YWxsb2Moa2V5d29yZF9sZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFjZG1fYXJyYXlbaV0ua2V5d29yZCkgeworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKworCQlzc2NhbmYoY2RzX2hlYWQsCisJCSAgICAgICAiJXMgJWxseCAlbGx4IiwKKwkJICAgICAgIGNkbV9hcnJheVtpXS5rZXl3b3JkLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyAqKSYoY2RtX2FycmF5W2ldLm1hc2sxKSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcgKikmKGNkbV9hcnJheVtpXS5tYXNrMikpOworCisJCWlmICghc3RyY21wKGNkbV9hcnJheVtpXS5rZXl3b3JkLCBPUkFOR0VGU19WRVJCT1NFKSkKKwkJCWNsaWVudF92ZXJib3NlX2luZGV4ID0gaTsKKworCQlpZiAoIXN0cmNtcChjZG1fYXJyYXlbaV0ua2V5d29yZCwgT1JBTkdFRlNfQUxMKSkKKwkJCWNsaWVudF9hbGxfaW5kZXggPSBpOworCisJCWNkc19oZWFkID0gY2RzX2RlbGltaXRlciArIDE7CisJfQorCisJcmMgPSBjZG1fZWxlbWVudF9jb3VudDsKKworCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfVVRJTFNfREVCVUcsICIlczogcmM6JWQ6XG4iLCBfX2Z1bmNfXywgcmMpOworCitvdXQ6CisKKwlyZXR1cm4gcmM7CisKK30KKworLyoKKyAqIC9zeXMva2VybmVsL2RlYnVnL29yYW5nZWZzL2RlYnVnLWhlbHAgY2FuIGJlIGNhdHRlZCB0bworICogc2VlIGFsbCB0aGUgYXZhaWxhYmxlIGtlcm5lbCBhbmQgY2xpZW50IGRlYnVnIGtleXdvcmRzLgorICoKKyAqIFdoZW4gdGhlIGtlcm5lbCBib290cywgd2UgaGF2ZSBubyBpZGVhIHdoYXQga2V5d29yZHMgdGhlCisgKiBjbGllbnQgc3VwcG9ydHMsIG5vciB0aGVpciBhc3NvY2lhdGVkIG1hc2tzLgorICoKKyAqIFdlIHBhc3MgdGhyb3VnaCB0aGlzIGZ1bmN0aW9uIG9uY2UgYXQgYm9vdCBhbmQgc3RhbXAgYQorICogYm9pbGVycGxhdGUgIndlIGRvbid0IGtub3ciIG1lc3NhZ2UgZm9yIHRoZSBjbGllbnQgaW4gdGhlCisgKiBkZWJ1Zy1oZWxwIGZpbGUuIFdlIHBhc3MgdGhyb3VnaCBoZXJlIGFnYWluIHdoZW4gdGhlIGNsaWVudAorICogc3RhcnRzIGFuZCB0aGVuIHdlIGNhbiBmaWxsIG91dCB0aGUgZGVidWctaGVscCBmaWxlIGZ1bGx5LgorICoKKyAqIFRoZSBjbGllbnQgbWlnaHQgYmUgcmVzdGFydGVkIGFueSBudW1iZXIgb2YgdGltZXMgYmV0d2VlbgorICogcmVib290cywgd2Ugb25seSBidWlsZCB0aGUgZGVidWctaGVscCBmaWxlIHRoZSBmaXJzdCB0aW1lLgorICovCitpbnQgb3JhbmdlZnNfcHJlcGFyZV9kZWJ1Z2ZzX2hlbHBfc3RyaW5nKGludCBhdF9ib290KQoreworCWludCByYyA9IC1FSU5WQUw7CisJaW50IGk7CisJaW50IGJ5dGVfY291bnQgPSAwOworCWNoYXIgKmNsaWVudF90aXRsZSA9ICJDbGllbnQgRGVidWcgS2V5d29yZHM6XG4iOworCWNoYXIgKmtlcm5lbF90aXRsZSA9ICJLZXJuZWwgRGVidWcgS2V5d29yZHM6XG4iOworCisJZ29zc2lwX2RlYnVnKEdPU1NJUF9VVElMU19ERUJVRywgIiVzOiBzdGFydFxuIiwgX19mdW5jX18pOworCisJaWYgKGF0X2Jvb3QpIHsKKwkJYnl0ZV9jb3VudCArPSBzdHJsZW4oSEVMUF9TVFJJTkdfVU5JTklUSUFMSVpFRCk7CisJCWNsaWVudF90aXRsZSA9IEhFTFBfU1RSSU5HX1VOSU5JVElBTElaRUQ7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogZmlsbCB0aGUgY2xpZW50IGtleXdvcmQvbWFzayBhcnJheSBhbmQgcmVtZW1iZXIKKwkJICogaG93IG1hbnkgZWxlbWVudHMgdGhlcmUgd2VyZS4KKwkJICovCisJCWNkbV9lbGVtZW50X2NvdW50ID0KKwkJCW9yYW5nZWZzX3ByZXBhcmVfY2RtX2FycmF5KGNsaWVudF9kZWJ1Z19hcnJheV9zdHJpbmcpOworCQlpZiAoY2RtX2VsZW1lbnRfY291bnQgPD0gMCkKKwkJCWdvdG8gb3V0OworCisJCS8qIENvdW50IHRoZSBieXRlcyBkZXN0aW5lZCBmb3IgZGVidWdfaGVscF9zdHJpbmcuICovCisJCWJ5dGVfY291bnQgKz0gc3RybGVuKGNsaWVudF90aXRsZSk7CisKKwkJZm9yIChpID0gMDsgaSA8IGNkbV9lbGVtZW50X2NvdW50OyBpKyspIHsKKwkJCWJ5dGVfY291bnQgKz0gc3RybGVuKGNkbV9hcnJheVtpXS5rZXl3b3JkICsgMik7CisJCQlpZiAoYnl0ZV9jb3VudCA+PSBERUJVR19IRUxQX1NUUklOR19TSVpFKSB7CisJCQkJcHJfaW5mbygiJXM6IG92ZXJmbG93IDEhXG4iLCBfX2Z1bmNfXyk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKworCQlnb3NzaXBfZGVidWcoR09TU0lQX1VUSUxTX0RFQlVHLAorCQkJICAgICAiJXM6IGNkbV9lbGVtZW50X2NvdW50OiVkOlxuIiwKKwkJCSAgICAgX19mdW5jX18sCisJCQkgICAgIGNkbV9lbGVtZW50X2NvdW50KTsKKwl9CisKKwlieXRlX2NvdW50ICs9IHN0cmxlbihrZXJuZWxfdGl0bGUpOworCWZvciAoaSA9IDA7IGkgPCBudW1fa21vZF9rZXl3b3JkX21hc2tfbWFwOyBpKyspIHsKKwkJYnl0ZV9jb3VudCArPQorCQkJc3RybGVuKHNfa21vZF9rZXl3b3JkX21hc2tfbWFwW2ldLmtleXdvcmQgKyAyKTsKKwkJaWYgKGJ5dGVfY291bnQgPj0gREVCVUdfSEVMUF9TVFJJTkdfU0laRSkgeworCQkJcHJfaW5mbygiJXM6IG92ZXJmbG93IDIhXG4iLCBfX2Z1bmNfXyk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qIGJ1aWxkIGRlYnVnX2hlbHBfc3RyaW5nLiAqLworCWRlYnVnX2hlbHBfc3RyaW5nID0ga3phbGxvYyhERUJVR19IRUxQX1NUUklOR19TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRlYnVnX2hlbHBfc3RyaW5nKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJc3RyY2F0KGRlYnVnX2hlbHBfc3RyaW5nLCBjbGllbnRfdGl0bGUpOworCisJaWYgKCFhdF9ib290KSB7CisJCWZvciAoaSA9IDA7IGkgPCBjZG1fZWxlbWVudF9jb3VudDsgaSsrKSB7CisJCQlzdHJjYXQoZGVidWdfaGVscF9zdHJpbmcsICJcdCIpOworCQkJc3RyY2F0KGRlYnVnX2hlbHBfc3RyaW5nLCBjZG1fYXJyYXlbaV0ua2V5d29yZCk7CisJCQlzdHJjYXQoZGVidWdfaGVscF9zdHJpbmcsICJcbiIpOworCQl9CisJfQorCisJc3RyY2F0KGRlYnVnX2hlbHBfc3RyaW5nLCAiXG4iKTsKKwlzdHJjYXQoZGVidWdfaGVscF9zdHJpbmcsIGtlcm5lbF90aXRsZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2ttb2Rfa2V5d29yZF9tYXNrX21hcDsgaSsrKSB7CisJCXN0cmNhdChkZWJ1Z19oZWxwX3N0cmluZywgIlx0Iik7CisJCXN0cmNhdChkZWJ1Z19oZWxwX3N0cmluZywgc19rbW9kX2tleXdvcmRfbWFza19tYXBbaV0ua2V5d29yZCk7CisJCXN0cmNhdChkZWJ1Z19oZWxwX3N0cmluZywgIlxuIik7CisJfQorCisJcmMgPSAwOworCitvdXQ6CisKKwlyZXR1cm4gcmM7CisKK30KKworLyoKKyAqIGtlcm5lbCA9IHR5cGUgMAorICogY2xpZW50ID0gdHlwZSAxCisgKi8KK3N0YXRpYyB2b2lkIGRlYnVnX21hc2tfdG9fc3RyaW5nKHZvaWQgKm1hc2ssIGludCB0eXBlKQoreworCWludCBpOworCWludCBsZW4gPSAwOworCWNoYXIgKmRlYnVnX3N0cmluZzsKKwlpbnQgZWxlbWVudF9jb3VudCA9IDA7CisKKwlnb3NzaXBfZGVidWcoR09TU0lQX1VUSUxTX0RFQlVHLCAiJXM6IHN0YXJ0XG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAodHlwZSkgeworCQlkZWJ1Z19zdHJpbmcgPSBjbGllbnRfZGVidWdfc3RyaW5nOworCQllbGVtZW50X2NvdW50ID0gY2RtX2VsZW1lbnRfY291bnQ7CisJfSBlbHNlIHsKKwkJZGVidWdfc3RyaW5nID0ga2VybmVsX2RlYnVnX3N0cmluZzsKKwkJZWxlbWVudF9jb3VudCA9IG51bV9rbW9kX2tleXdvcmRfbWFza19tYXA7CisJfQorCisJbWVtc2V0KGRlYnVnX3N0cmluZywgMCwgT1JBTkdFRlNfTUFYX0RFQlVHX1NUUklOR19MRU4pOworCisJLyoKKwkgKiBTb21lIGtleXdvcmRzLCBsaWtlICJhbGwiIG9yICJ2ZXJib3NlIiwgYXJlIGFtYWxnYW1zIG9mCisJICogbnVtZXJvdXMgb3RoZXIga2V5d29yZHMuIE1ha2UgYSBzcGVjaWFsIGNoZWNrIGZvciB0aG9zZQorCSAqIGJlZm9yZSBncmluZGluZyB0aHJvdWdoIHRoZSB3aG9sZSBtYXNrIG9ubHkgdG8gZmluZCBvdXQKKwkgKiBsYXRlci4uLgorCSAqLworCWlmIChjaGVja19hbWFsZ2FtX2tleXdvcmQobWFzaywgdHlwZSkpCisJCWdvdG8gb3V0OworCisJLyogQnVpbGQgdGhlIGRlYnVnIHN0cmluZy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgZWxlbWVudF9jb3VudDsgaSsrKQorCQlpZiAodHlwZSkKKwkJCWRvX2Nfc3RyaW5nKG1hc2ssIGkpOworCQllbHNlCisJCQlkb19rX3N0cmluZyhtYXNrLCBpKTsKKworCWxlbiA9IHN0cmxlbihkZWJ1Z19zdHJpbmcpOworCisJaWYgKChsZW4pICYmICh0eXBlKSkKKwkJY2xpZW50X2RlYnVnX3N0cmluZ1tsZW4gLSAxXSA9ICdcMCc7CisJZWxzZSBpZiAobGVuKQorCQlrZXJuZWxfZGVidWdfc3RyaW5nW2xlbiAtIDFdID0gJ1wwJzsKKwllbHNlIGlmICh0eXBlKQorCQlzdHJjcHkoY2xpZW50X2RlYnVnX3N0cmluZywgIm5vbmUiKTsKKwllbHNlCisJCXN0cmNweShrZXJuZWxfZGVidWdfc3RyaW5nLCAibm9uZSIpOworCitvdXQ6Citnb3NzaXBfZGVidWcoR09TU0lQX1VUSUxTX0RFQlVHLCAiJXM6IHN0cmluZzolczpcbiIsIF9fZnVuY19fLCBkZWJ1Z19zdHJpbmcpOworCisJcmV0dXJuOworCit9CisKK3N0YXRpYyB2b2lkIGRvX2tfc3RyaW5nKHZvaWQgKmtfbWFzaywgaW50IGluZGV4KQoreworCV9fdTY0ICptYXNrID0gKF9fdTY0ICopIGtfbWFzazsKKworCWlmIChrZXl3b3JkX2lzX2FtYWxnYW0oKGNoYXIgKikgc19rbW9kX2tleXdvcmRfbWFza19tYXBbaW5kZXhdLmtleXdvcmQpKQorCQlnb3RvIG91dDsKKworCWlmICgqbWFzayAmIHNfa21vZF9rZXl3b3JkX21hc2tfbWFwW2luZGV4XS5tYXNrX3ZhbCkgeworCQlpZiAoKHN0cmxlbihrZXJuZWxfZGVidWdfc3RyaW5nKSArCisJCSAgICAgc3RybGVuKHNfa21vZF9rZXl3b3JkX21hc2tfbWFwW2luZGV4XS5rZXl3b3JkKSkKKwkJCTwgT1JBTkdFRlNfTUFYX0RFQlVHX1NUUklOR19MRU4gLSAxKSB7CisJCQkJc3RyY2F0KGtlcm5lbF9kZWJ1Z19zdHJpbmcsCisJCQkJICAgICAgIHNfa21vZF9rZXl3b3JkX21hc2tfbWFwW2luZGV4XS5rZXl3b3JkKTsKKwkJCQlzdHJjYXQoa2VybmVsX2RlYnVnX3N0cmluZywgIiwiKTsKKwkJCX0gZWxzZSB7CisJCQkJZ29zc2lwX2VycigiJXM6IG92ZXJmbG93IVxuIiwgX19mdW5jX18pOworCQkJCXN0cmNweShrZXJuZWxfZGVidWdfc3RyaW5nLCBPUkFOR0VGU19BTEwpOworCQkJCWdvdG8gb3V0OworCQkJfQorCX0KKworb3V0OgorCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBkb19jX3N0cmluZyh2b2lkICpjX21hc2ssIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgY2xpZW50X2RlYnVnX21hc2sgKm1hc2sgPSAoc3RydWN0IGNsaWVudF9kZWJ1Z19tYXNrICopIGNfbWFzazsKKworCWlmIChrZXl3b3JkX2lzX2FtYWxnYW0oY2RtX2FycmF5W2luZGV4XS5rZXl3b3JkKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoKG1hc2stPm1hc2sxICYgY2RtX2FycmF5W2luZGV4XS5tYXNrMSkgfHwKKwkgICAgKG1hc2stPm1hc2syICYgY2RtX2FycmF5W2luZGV4XS5tYXNrMikpIHsKKwkJaWYgKChzdHJsZW4oY2xpZW50X2RlYnVnX3N0cmluZykgKworCQkgICAgIHN0cmxlbihjZG1fYXJyYXlbaW5kZXhdLmtleXdvcmQpICsgMSkKKwkJCTwgT1JBTkdFRlNfTUFYX0RFQlVHX1NUUklOR19MRU4gLSAyKSB7CisJCQkJc3RyY2F0KGNsaWVudF9kZWJ1Z19zdHJpbmcsCisJCQkJICAgICAgIGNkbV9hcnJheVtpbmRleF0ua2V5d29yZCk7CisJCQkJc3RyY2F0KGNsaWVudF9kZWJ1Z19zdHJpbmcsICIsIik7CisJCQl9IGVsc2UgeworCQkJCWdvc3NpcF9lcnIoIiVzOiBvdmVyZmxvdyFcbiIsIF9fZnVuY19fKTsKKwkJCQlzdHJjcHkoY2xpZW50X2RlYnVnX3N0cmluZywgT1JBTkdFRlNfQUxMKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwl9CitvdXQ6CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IGtleXdvcmRfaXNfYW1hbGdhbShjaGFyICprZXl3b3JkKQoreworCWludCByYyA9IDA7CisKKwlpZiAoKCFzdHJjbXAoa2V5d29yZCwgT1JBTkdFRlNfQUxMKSkgfHwgKCFzdHJjbXAoa2V5d29yZCwgT1JBTkdFRlNfVkVSQk9TRSkpKQorCQlyYyA9IDE7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBrZXJuZWwgPSB0eXBlIDAKKyAqIGNsaWVudCA9IHR5cGUgMQorICoKKyAqIHJldHVybiAxIGlmIHdlIGZvdW5kIGFuIGFtYWxnYW0uCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfYW1hbGdhbV9rZXl3b3JkKHZvaWQgKm1hc2ssIGludCB0eXBlKQoreworCV9fdTY0ICprX21hc2s7CisJc3RydWN0IGNsaWVudF9kZWJ1Z19tYXNrICpjX21hc2s7CisJaW50IGtfYWxsX2luZGV4ID0gbnVtX2ttb2Rfa2V5d29yZF9tYXNrX21hcCAtIDE7CisJaW50IHJjID0gMDsKKworCWlmICh0eXBlKSB7CisJCWNfbWFzayA9IChzdHJ1Y3QgY2xpZW50X2RlYnVnX21hc2sgKikgbWFzazsKKworCQlpZiAoKGNfbWFzay0+bWFzazEgPT0gY2RtX2FycmF5W2NsaWVudF9hbGxfaW5kZXhdLm1hc2sxKSAmJgorCQkgICAgKGNfbWFzay0+bWFzazIgPT0gY2RtX2FycmF5W2NsaWVudF9hbGxfaW5kZXhdLm1hc2syKSkgeworCQkJc3RyY3B5KGNsaWVudF9kZWJ1Z19zdHJpbmcsIE9SQU5HRUZTX0FMTCk7CisJCQlyYyA9IDE7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmICgoY19tYXNrLT5tYXNrMSA9PSBjZG1fYXJyYXlbY2xpZW50X3ZlcmJvc2VfaW5kZXhdLm1hc2sxKSAmJgorCQkgICAgKGNfbWFzay0+bWFzazIgPT0gY2RtX2FycmF5W2NsaWVudF92ZXJib3NlX2luZGV4XS5tYXNrMikpIHsKKwkJCXN0cmNweShjbGllbnRfZGVidWdfc3RyaW5nLCBPUkFOR0VGU19WRVJCT1NFKTsKKwkJCXJjID0gMTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwl9IGVsc2UgeworCQlrX21hc2sgPSAoX191NjQgKikgbWFzazsKKworCQlpZiAoKmtfbWFzayA+PSBzX2ttb2Rfa2V5d29yZF9tYXNrX21hcFtrX2FsbF9pbmRleF0ubWFza192YWwpIHsKKwkJCXN0cmNweShrZXJuZWxfZGVidWdfc3RyaW5nLCBPUkFOR0VGU19BTEwpOworCQkJcmMgPSAxOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKK291dDoKKworCXJldHVybiByYzsKK30KKworLyoKKyAqIGtlcm5lbCA9IHR5cGUgMAorICogY2xpZW50ID0gdHlwZSAxCisgKi8KK3N0YXRpYyB2b2lkIGRlYnVnX3N0cmluZ190b19tYXNrKGNoYXIgKmRlYnVnX3N0cmluZywgdm9pZCAqbWFzaywgaW50IHR5cGUpCit7CisJY2hhciAqdW5jaGVja2VkX2tleXdvcmQ7CisJaW50IGk7CisJY2hhciAqc3Ryc2VwX2ZvZGRlciA9IGtzdHJkdXAoZGVidWdfc3RyaW5nLCBHRlBfS0VSTkVMKTsKKwljaGFyICpvcmlnaW5hbF9wb2ludGVyOworCWludCBlbGVtZW50X2NvdW50ID0gMDsKKwlzdHJ1Y3QgY2xpZW50X2RlYnVnX21hc2sgKmNfbWFzayA9IE5VTEw7CisJX191NjQgKmtfbWFzayA9IE5VTEw7CisKKwlnb3NzaXBfZGVidWcoR09TU0lQX1VUSUxTX0RFQlVHLCAiJXM6IHN0YXJ0XG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAodHlwZSkgeworCQljX21hc2sgPSAoc3RydWN0IGNsaWVudF9kZWJ1Z19tYXNrICopbWFzazsKKwkJZWxlbWVudF9jb3VudCA9IGNkbV9lbGVtZW50X2NvdW50OworCX0gZWxzZSB7CisJCWtfbWFzayA9IChfX3U2NCAqKW1hc2s7CisJCSprX21hc2sgPSAwOworCQllbGVtZW50X2NvdW50ID0gbnVtX2ttb2Rfa2V5d29yZF9tYXNrX21hcDsKKwl9CisKKwlvcmlnaW5hbF9wb2ludGVyID0gc3Ryc2VwX2ZvZGRlcjsKKwl3aGlsZSAoKHVuY2hlY2tlZF9rZXl3b3JkID0gc3Ryc2VwKCZzdHJzZXBfZm9kZGVyLCAiLCIpKSkKKwkJaWYgKHN0cmxlbih1bmNoZWNrZWRfa2V5d29yZCkpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBlbGVtZW50X2NvdW50OyBpKyspCisJCQkJaWYgKHR5cGUpCisJCQkJCWRvX2NfbWFzayhpLAorCQkJCQkJICB1bmNoZWNrZWRfa2V5d29yZCwKKwkJCQkJCSAgJmNfbWFzayk7CisJCQkJZWxzZQorCQkJCQlkb19rX21hc2soaSwKKwkJCQkJCSAgdW5jaGVja2VkX2tleXdvcmQsCisJCQkJCQkgICZrX21hc2spOworCQl9CisKKwlrZnJlZShvcmlnaW5hbF9wb2ludGVyKTsKK30KKworc3RhdGljIHZvaWQgZG9fY19tYXNrKGludCBpLCBjaGFyICp1bmNoZWNrZWRfa2V5d29yZCwKKyAgICBzdHJ1Y3QgY2xpZW50X2RlYnVnX21hc2sgKipzYW5lX21hc2spCit7CisKKwlpZiAoIXN0cmNtcChjZG1fYXJyYXlbaV0ua2V5d29yZCwgdW5jaGVja2VkX2tleXdvcmQpKSB7CisJCSgqKnNhbmVfbWFzaykubWFzazEgPSAoKipzYW5lX21hc2spLm1hc2sxIHwgY2RtX2FycmF5W2ldLm1hc2sxOworCQkoKipzYW5lX21hc2spLm1hc2syID0gKCoqc2FuZV9tYXNrKS5tYXNrMiB8IGNkbV9hcnJheVtpXS5tYXNrMjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRvX2tfbWFzayhpbnQgaSwgY2hhciAqdW5jaGVja2VkX2tleXdvcmQsIF9fdTY0ICoqc2FuZV9tYXNrKQoreworCisJaWYgKCFzdHJjbXAoc19rbW9kX2tleXdvcmRfbWFza19tYXBbaV0ua2V5d29yZCwgdW5jaGVja2VkX2tleXdvcmQpKQorCQkqKnNhbmVfbWFzayA9ICgqKnNhbmVfbWFzaykgfAorCQkJCXNfa21vZF9rZXl3b3JkX21hc2tfbWFwW2ldLm1hc2tfdmFsOworfQorCitpbnQgb3JhbmdlZnNfZGVidWdmc19uZXdfY2xpZW50X21hc2sodm9pZCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgZGV2X21hc2syX2luZm9fcyBtYXNrMl9pbmZvID0gezB9OworCWludCByZXQ7CisKKwlyZXQgPSBjb3B5X2Zyb21fdXNlcigmbWFzazJfaW5mbywKKwkJCSAgICAgKHZvaWQgX191c2VyICopYXJnLAorCQkJICAgICBzaXplb2Yoc3RydWN0IGRldl9tYXNrMl9pbmZvX3MpKTsKKworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIC1FSU87CisKKwljbGllbnRfZGVidWdfbWFzay5tYXNrMSA9IG1hc2syX2luZm8ubWFzazFfdmFsdWU7CisJY2xpZW50X2RlYnVnX21hc2subWFzazIgPSBtYXNrMl9pbmZvLm1hc2syX3ZhbHVlOworCisJcHJfaW5mbygiJXM6IGNsaWVudCBkZWJ1ZyBtYXNrIGhhcyBiZWVuIGJlZW4gcmVjZWl2ZWQgIgorCQkiOiVsbHg6IDolbGx4OlxuIiwKKwkJX19mdW5jX18sCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpY2xpZW50X2RlYnVnX21hc2subWFzazEsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpY2xpZW50X2RlYnVnX21hc2subWFzazIpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IG9yYW5nZWZzX2RlYnVnZnNfbmV3X2NsaWVudF9zdHJpbmcodm9pZCBfX3VzZXIgKmFyZykgCit7CisJaW50IHJldDsKKworCXJldCA9IGNvcHlfZnJvbV91c2VyKCZjbGllbnRfZGVidWdfYXJyYXlfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkIF9fdXNlciAqKWFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUkFOR0VGU19NQVhfREVCVUdfU1RSSU5HX0xFTik7CisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gLUVJTzsKKworCS8qCisJICogVGhlIHJlYWwgY2xpZW50LWNvcmUgbWFrZXMgYW4gZWZmb3J0IHRvIGVuc3VyZQorCSAqIHRoYXQgYWN0dWFsIHN0cmluZ3MgdGhhdCBhcmVuJ3QgdG9vIGxvbmcgdG8gZml0IGluCisJICogdGhpcyBidWZmZXIgaXMgd2hhdCB3ZSBnZXQgaGVyZS4gV2UncmUgZ29pbmcgdG8gdXNlCisJICogc3RyaW5nIGZ1bmN0aW9ucyBvbiB0aGUgc3R1ZmYgd2UgZ290LCBzbyB3ZSdsbCBtYWtlCisJICogdGhpcyBleHRyYSBlZmZvcnQgdG8gdHJ5IGFuZCBrZWVwIGZyb20KKwkgKiBmbG93aW5nIG91dCBvZiB0aGlzIGJ1ZmZlciB3aGVuIHdlIHVzZSB0aGUgc3RyaW5nCisJICogZnVuY3Rpb25zLCBldmVuIGlmIHNvbWVob3cgdGhlIHN0dWZmIHdlIGVuZCB1cAorCSAqIHdpdGggaGVyZSBpcyBnYXJiYWdlLgorCSAqLworCWNsaWVudF9kZWJ1Z19hcnJheV9zdHJpbmdbT1JBTkdFRlNfTUFYX0RFQlVHX1NUUklOR19MRU4gLSAxXSA9CisJCSdcMCc7CisJCisJaWYgKHJldCAhPSAwKSB7CisJCXByX2luZm8oIiVzOiBDTElFTlRfU1RSSU5HOiBjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlPOworCX0KKworCXByX2luZm8oIiVzOiBjbGllbnQgZGVidWcgYXJyYXkgc3RyaW5nIGhhcyBiZWVuIHJlY2VpdmVkLlxuIiwKKwkJX19mdW5jX18pOworCisJaWYgKCFoZWxwX3N0cmluZ19pbml0aWFsaXplZCkgeworCisJCS8qIEZyZWUgdGhlICJ3ZSBkb24ndCBrbm93IHlldCIgZGVmYXVsdCBzdHJpbmcuLi4gKi8KKwkJa2ZyZWUoZGVidWdfaGVscF9zdHJpbmcpOworCisJCS8qIGJ1aWxkIGEgcHJvcGVyIGRlYnVnIGhlbHAgc3RyaW5nICovCisJCWlmIChvcmFuZ2Vmc19wcmVwYXJlX2RlYnVnZnNfaGVscF9zdHJpbmcoMCkpIHsKKwkJCWdvc3NpcF9lcnIoIiVzOiBubyBkZWJ1ZyBoZWxwIHN0cmluZyBcbiIsCisJCQkJICAgX19mdW5jX18pOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQkvKiBSZXBsYWNlIHRoZSBib2lsZXJwbGF0ZSBib290LXRpbWUgZGVidWctaGVscCBmaWxlLiAqLworCQlkZWJ1Z2ZzX3JlbW92ZShoZWxwX2ZpbGVfZGVudHJ5KTsKKworCQloZWxwX2ZpbGVfZGVudHJ5ID0KKwkJCWRlYnVnZnNfY3JlYXRlX2ZpbGUoCisJCQkJT1JBTkdFRlNfS01PRF9ERUJVR19IRUxQX0ZJTEUsCisJCQkJMDQ0NCwKKwkJCQlkZWJ1Z19kaXIsCisJCQkJZGVidWdfaGVscF9zdHJpbmcsCisJCQkJJmRlYnVnX2hlbHBfZm9wcyk7CisKKwkJaWYgKCFoZWxwX2ZpbGVfZGVudHJ5KSB7CisJCQlnb3NzaXBfZXJyKCIlczogZGVidWdmc19jcmVhdGVfZmlsZSBmYWlsZWQgZm9yIgorCQkJCSAgICIgOiVzOiFcbiIsCisJCQkJICAgX19mdW5jX18sCisJCQkJICAgT1JBTkdFRlNfS01PRF9ERUJVR19IRUxQX0ZJTEUpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwlkZWJ1Z19tYXNrX3RvX3N0cmluZygmY2xpZW50X2RlYnVnX21hc2ssIDEpOworCisJZGVidWdmc19yZW1vdmUoY2xpZW50X2RlYnVnX2RlbnRyeSk7CisKKwlvcmFuZ2Vmc19jbGllbnRfZGVidWdfaW5pdCgpOworCisJaGVscF9zdHJpbmdfaW5pdGlhbGl6ZWQrKzsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBvcmFuZ2Vmc19kZWJ1Z2ZzX25ld19kZWJ1Zyh2b2lkIF9fdXNlciAqYXJnKSAKK3sKKwlzdHJ1Y3QgZGV2X21hc2tfaW5mb19zIG1hc2tfaW5mbyA9IHswfTsKKwlpbnQgcmV0OworCisJcmV0ID0gY29weV9mcm9tX3VzZXIoJm1hc2tfaW5mbywKKwkJCSAgICAgKHZvaWQgX191c2VyICopYXJnLAorCQkJICAgICBzaXplb2YobWFza19pbmZvKSk7CisKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiAtRUlPOworCisJaWYgKG1hc2tfaW5mby5tYXNrX3R5cGUgPT0gS0VSTkVMX01BU0spIHsKKwkJaWYgKChtYXNrX2luZm8ubWFza192YWx1ZSA9PSAwKQorCQkgICAgJiYgKGtlcm5lbF9tYXNrX3NldF9tb2RfaW5pdCkpIHsKKwkJCS8qCisJCQkgKiB0aGUga2VybmVsIGRlYnVnIG1hc2sgd2FzIHNldCB3aGVuIHRoZQorCQkJICoga2VybmVsIG1vZHVsZSB3YXMgbG9hZGVkOyBkb24ndCBvdmVycmlkZQorCQkJICogaXQgaWYgdGhlIGNsaWVudC1jb3JlIHdhcyBzdGFydGVkIHdpdGhvdXQKKwkJCSAqIGEgdmFsdWUgZm9yIE9SQU5HRUZTX0tNT0RNQVNLLgorCQkJICovCisJCQlyZXR1cm4gMDsKKwkJfQorCQlkZWJ1Z19tYXNrX3RvX3N0cmluZygmbWFza19pbmZvLm1hc2tfdmFsdWUsCisJCQkJICAgICBtYXNrX2luZm8ubWFza190eXBlKTsKKwkJb3JhbmdlZnNfZ29zc2lwX2RlYnVnX21hc2sgPSBtYXNrX2luZm8ubWFza192YWx1ZTsKKwkJcHJfaW5mbygiJXM6IGtlcm5lbCBkZWJ1ZyBtYXNrIGhhcyBiZWVuIG1vZGlmaWVkIHRvICIKKwkJCSI6JXM6IDolbGx4OlxuIiwKKwkJCV9fZnVuY19fLAorCQkJa2VybmVsX2RlYnVnX3N0cmluZywKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpb3JhbmdlZnNfZ29zc2lwX2RlYnVnX21hc2spOworCX0gZWxzZSBpZiAobWFza19pbmZvLm1hc2tfdHlwZSA9PSBDTElFTlRfTUFTSykgeworCQlkZWJ1Z19tYXNrX3RvX3N0cmluZygmbWFza19pbmZvLm1hc2tfdmFsdWUsCisJCQkJICAgICBtYXNrX2luZm8ubWFza190eXBlKTsKKwkJcHJfaW5mbygiJXM6IGNsaWVudCBkZWJ1ZyBtYXNrIGhhcyBiZWVuIG1vZGlmaWVkIHRvIgorCQkJIjolczogOiVsbHg6XG4iLAorCQkJX19mdW5jX18sCisJCQljbGllbnRfZGVidWdfc3RyaW5nLAorCQkJbGx1KG1hc2tfaW5mby5tYXNrX3ZhbHVlKSk7CisJfSBlbHNlIHsKKwkJZ29zc2lwX2xlcnIoIkludmFsaWQgbWFzayB0eXBlLi4uLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9mcy9vcmFuZ2Vmcy9vcmFuZ2Vmcy1kZWJ1Z2ZzLmggYi9mcy9vcmFuZ2Vmcy9vcmFuZ2Vmcy1kZWJ1Z2ZzLmgKaW5kZXggZTQ4MjhjMC4uODAzNTE3MiAxMDA2NDQKLS0tIGEvZnMvb3JhbmdlZnMvb3JhbmdlZnMtZGVidWdmcy5oCisrKyBiL2ZzL29yYW5nZWZzL29yYW5nZWZzLWRlYnVnZnMuaApAQCAtMSwzICsxLDcgQEAKLWludCBvcmFuZ2Vmc19kZWJ1Z2ZzX2luaXQodm9pZCk7Ci1pbnQgb3JhbmdlZnNfa2VybmVsX2RlYnVnX2luaXQodm9pZCk7CitpbnQgb3JhbmdlZnNfZGVidWdmc19pbml0KGludCk7CiB2b2lkIG9yYW5nZWZzX2RlYnVnZnNfY2xlYW51cCh2b2lkKTsKK2ludCBvcmFuZ2Vmc19jbGllbnRfZGVidWdfaW5pdCh2b2lkKTsKK2ludCBvcmFuZ2Vmc19wcmVwYXJlX2RlYnVnZnNfaGVscF9zdHJpbmcoaW50KTsKK2ludCBvcmFuZ2Vmc19kZWJ1Z2ZzX25ld19jbGllbnRfbWFzayh2b2lkIF9fdXNlciAqKTsKK2ludCBvcmFuZ2Vmc19kZWJ1Z2ZzX25ld19jbGllbnRfc3RyaW5nKHZvaWQgX191c2VyICopOworaW50IG9yYW5nZWZzX2RlYnVnZnNfbmV3X2RlYnVnKHZvaWQgX191c2VyICopOwpkaWZmIC0tZ2l0IGEvZnMvb3JhbmdlZnMvb3JhbmdlZnMtZGV2LXByb3RvLmggYi9mcy9vcmFuZ2Vmcy9vcmFuZ2Vmcy1kZXYtcHJvdG8uaAppbmRleCA5ZWFjOWQ5Li5hM2Q4NGZmIDEwMDY0NAotLS0gYS9mcy9vcmFuZ2Vmcy9vcmFuZ2Vmcy1kZXYtcHJvdG8uaAorKysgYi9mcy9vcmFuZ2Vmcy9vcmFuZ2Vmcy1kZXYtcHJvdG8uaApAQCAtMjgsNyArMjgsNyBAQAogI2RlZmluZSBPUkFOR0VGU19WRlNfT1BfUkVOQU1FICAgICAgICAgMHhGRjAwMDAwQQogI2RlZmluZSBPUkFOR0VGU19WRlNfT1BfU1RBVEZTICAgICAgICAgMHhGRjAwMDAwQgogI2RlZmluZSBPUkFOR0VGU19WRlNfT1BfVFJVTkNBVEUgICAgICAgMHhGRjAwMDAwQwotI2RlZmluZSBPUkFOR0VGU19WRlNfT1BfTU1BUF9SQV9GTFVTSCAgMHhGRjAwMDAwRAorI2RlZmluZSBPUkFOR0VGU19WRlNfT1BfUkFfRkxVU0ggICAgICAgMHhGRjAwMDAwRAogI2RlZmluZSBPUkFOR0VGU19WRlNfT1BfRlNfTU9VTlQgICAgICAgMHhGRjAwMDAwRQogI2RlZmluZSBPUkFOR0VGU19WRlNfT1BfRlNfVU1PVU5UICAgICAgMHhGRjAwMDAwRgogI2RlZmluZSBPUkFOR0VGU19WRlNfT1BfR0VUWEFUVFIgICAgICAgMHhGRjAwMDAxMApAQCAtNDEsNiArNDEsMTAgQEAKICNkZWZpbmUgT1JBTkdFRlNfVkZTX09QX0ZTWU5DICAgICAgICAgIDB4RkYwMEVFMDEKICNkZWZpbmUgT1JBTkdFRlNfVkZTX09QX0ZTS0VZICAgICAgICAgICAgIDB4RkYwMEVFMDIKICNkZWZpbmUgT1JBTkdFRlNfVkZTX09QX1JFQURESVJQTFVTICAgICAgIDB4RkYwMEVFMDMKKyNkZWZpbmUgT1JBTkdFRlNfVkZTX09QX0ZFQVRVUkVTCTB4RkYwMEVFMDUgLyogMi45LjYgKi8KKworLyogZmVhdHVyZXMgaXMgYSA2NC1iaXQgdW5zaWduZWQgYml0bWFzayAqLworI2RlZmluZSBPUkFOR0VGU19GRUFUVVJFX1JFQURBSEVBRCAxCiAKIC8qCiAgKiBNaXNjIGNvbnN0YW50cy4gUGxlYXNlIHJldGFpbiB0aGVtIGFzIG11bHRpcGxlcyBvZiA4IQpkaWZmIC0tZ2l0IGEvZnMvb3JhbmdlZnMvb3JhbmdlZnMta2VybmVsLmggYi9mcy9vcmFuZ2Vmcy9vcmFuZ2Vmcy1rZXJuZWwuaAppbmRleCA2MzNjMDdhLi4wYTgyMDQ4IDEwMDY0NAotLS0gYS9mcy9vcmFuZ2Vmcy9vcmFuZ2Vmcy1rZXJuZWwuaAorKysgYi9mcy9vcmFuZ2Vmcy9vcmFuZ2Vmcy1rZXJuZWwuaApAQCAtMTAwLDE2ICsxMDAsNiBAQAogfTsKIAogLyoKLSAqIEFuIGFycmF5IG9mIGNsaWVudF9kZWJ1Z19tYXNrIHdpbGwgYmUgYnVpbHQgdG8gaG9sZCBkZWJ1ZyBrZXl3b3JkL21hc2sKLSAqIHZhbHVlcyBmZXRjaGVkIGZyb20gdXNlcnNwYWNlLgotICovCi1zdHJ1Y3QgY2xpZW50X2RlYnVnX21hc2sgewotCWNoYXIgKmtleXdvcmQ7Ci0JX191NjQgbWFzazE7Ci0JX191NjQgbWFzazI7Ci19OwotCi0vKgogICogb3JhbmdlZnMga2VybmVsIG1lbW9yeSByZWxhdGVkIGZsYWdzCiAgKi8KIApAQCAtMTE5LDI5ICsxMDksNiBAQAogI2RlZmluZSBPUkFOR0VGU19DQUNIRV9DUkVBVEVfRkxBR1MgMAogI2VuZGlmIC8qICgoZGVmaW5lZCBPUkFOR0VGU19LRVJORUxfREVCVUcpICYmIChkZWZpbmVkIENPTkZJR19ERUJVR19TTEFCKSkgKi8KIAotLyogdGhlc2UgZnVuY3Rpb25zIGFyZSBkZWZpbmVkIGluIG9yYW5nZWZzLXV0aWxzLmMgKi8KLWludCBvcmFuZ2Vmc19wcmVwYXJlX2NkbV9hcnJheShjaGFyICpkZWJ1Z19hcnJheV9zdHJpbmcpOwotaW50IG9yYW5nZWZzX3ByZXBhcmVfZGVidWdmc19oZWxwX3N0cmluZyhpbnQpOwotCi0vKiBkZWZpbmVkIGluIG9yYW5nZWZzLWRlYnVnZnMuYyAqLwotaW50IG9yYW5nZWZzX2NsaWVudF9kZWJ1Z19pbml0KHZvaWQpOwotCi12b2lkIGRlYnVnX3N0cmluZ190b19tYXNrKGNoYXIgKiwgdm9pZCAqLCBpbnQpOwotdm9pZCBkb19jX21hc2soaW50LCBjaGFyICosIHN0cnVjdCBjbGllbnRfZGVidWdfbWFzayAqKik7Ci12b2lkIGRvX2tfbWFzayhpbnQsIGNoYXIgKiwgX191NjQgKiopOwotCi12b2lkIGRlYnVnX21hc2tfdG9fc3RyaW5nKHZvaWQgKiwgaW50KTsKLXZvaWQgZG9fa19zdHJpbmcodm9pZCAqLCBpbnQpOwotdm9pZCBkb19jX3N0cmluZyh2b2lkICosIGludCk7Ci1pbnQgY2hlY2tfYW1hbGdhbV9rZXl3b3JkKHZvaWQgKiwgaW50KTsKLWludCBrZXl3b3JkX2lzX2FtYWxnYW0oY2hhciAqKTsKLQotLyp0aGVzZSB2YXJpYWJsZXMgYXJlIGRlZmluZWQgaW4gb3JhbmdlZnMtbW9kLmMgKi8KLWV4dGVybiBjaGFyIGtlcm5lbF9kZWJ1Z19zdHJpbmdbT1JBTkdFRlNfTUFYX0RFQlVHX1NUUklOR19MRU5dOwotZXh0ZXJuIGNoYXIgY2xpZW50X2RlYnVnX3N0cmluZ1tPUkFOR0VGU19NQVhfREVCVUdfU1RSSU5HX0xFTl07Ci1leHRlcm4gY2hhciBjbGllbnRfZGVidWdfYXJyYXlfc3RyaW5nW09SQU5HRUZTX01BWF9ERUJVR19TVFJJTkdfTEVOXTsKLWV4dGVybiB1bnNpZ25lZCBpbnQga2VybmVsX21hc2tfc2V0X21vZF9pbml0OwotCiBleHRlcm4gaW50IG9yYW5nZWZzX2luaXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyKTsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqb3JhbmdlZnNfeGF0dHJfaGFuZGxlcnNbXTsKIApAQCAtMzMxLDcgKzI5OCw3IEBACiAJdW5zaWduZWQgbG9uZyB3cml0ZXM7CiB9OwogCi1leHRlcm4gc3RydWN0IG9yYW5nZWZzX3N0YXRzIGdfb3JhbmdlZnNfc3RhdHM7CitleHRlcm4gc3RydWN0IG9yYW5nZWZzX3N0YXRzIG9yYW5nZWZzX3N0YXRzOwogCiAvKgogICogTk9URTogU2VlIERvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcG9ydGluZyBmb3IgaW5mb3JtYXRpb24KQEAgLTQ0Nyw2ICs0MTQsOCBAQAogLyoKICAqIGRlZmluZWQgaW4gc3VwZXIuYwogICovCitleHRlcm4gdWludDY0X3Qgb3JhbmdlZnNfZmVhdHVyZXM7CisKIHN0cnVjdCBkZW50cnkgKm9yYW5nZWZzX21vdW50KHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc3QsCiAJCQkgICBpbnQgZmxhZ3MsCiAJCQkgICBjb25zdCBjaGFyICpkZXZuYW1lLApAQCAtNTA2LDYgKzQ3NSw4IEBACiAvKgogICogZGVmaW5lZCBpbiBkZXZvcmFuZ2Vmcy1yZXEuYwogICovCitleHRlcm4gdWludDMyX3Qgb3JhbmdlZnNfdXNlcnNwYWNlX3ZlcnNpb247CisKIGludCBvcmFuZ2Vmc19kZXZfaW5pdCh2b2lkKTsKIHZvaWQgb3JhbmdlZnNfZGV2X2NsZWFudXAodm9pZCk7CiBpbnQgaXNfZGFlbW9uX2luX3NlcnZpY2Uodm9pZCk7CkBAIC01NDMsMjAgKzUxNCwxOCBAQAogCiBpbnQgb3JhbmdlZnNfbm9ybWFsaXplX3RvX2Vycm5vKF9fczMyIGVycm9yX2NvZGUpOwogCi1leHRlcm4gc3RydWN0IG11dGV4IGRldnJlcV9tdXRleDsKLWV4dGVybiBzdHJ1Y3QgbXV0ZXggcmVxdWVzdF9tdXRleDsKLWV4dGVybiBpbnQgZGVidWc7CitleHRlcm4gc3RydWN0IG11dGV4IG9yYW5nZWZzX3JlcXVlc3RfbXV0ZXg7CiBleHRlcm4gaW50IG9wX3RpbWVvdXRfc2VjczsKIGV4dGVybiBpbnQgc2xvdF90aW1lb3V0X3NlY3M7Ci1leHRlcm4gaW50IGRjYWNoZV90aW1lb3V0X21zZWNzOwotZXh0ZXJuIGludCBnZXRhdHRyX3RpbWVvdXRfbXNlY3M7CitleHRlcm4gaW50IG9yYW5nZWZzX2RjYWNoZV90aW1lb3V0X21zZWNzOworZXh0ZXJuIGludCBvcmFuZ2Vmc19nZXRhdHRyX3RpbWVvdXRfbXNlY3M7CiBleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBvcmFuZ2Vmc19zdXBlcmJsb2NrczsKIGV4dGVybiBzcGlubG9ja190IG9yYW5nZWZzX3N1cGVyYmxvY2tzX2xvY2s7CiBleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBvcmFuZ2Vmc19yZXF1ZXN0X2xpc3Q7CiBleHRlcm4gc3BpbmxvY2tfdCBvcmFuZ2Vmc19yZXF1ZXN0X2xpc3RfbG9jazsKIGV4dGVybiB3YWl0X3F1ZXVlX2hlYWRfdCBvcmFuZ2Vmc19yZXF1ZXN0X2xpc3Rfd2FpdHE7Ci1leHRlcm4gc3RydWN0IGxpc3RfaGVhZCAqaHRhYmxlX29wc19pbl9wcm9ncmVzczsKLWV4dGVybiBzcGlubG9ja190IGh0YWJsZV9vcHNfaW5fcHJvZ3Jlc3NfbG9jazsKK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkICpvcmFuZ2Vmc19odGFibGVfb3BzX2luX3Byb2dyZXNzOworZXh0ZXJuIHNwaW5sb2NrX3Qgb3JhbmdlZnNfaHRhYmxlX29wc19pbl9wcm9ncmVzc19sb2NrOwogZXh0ZXJuIGludCBoYXNoX3RhYmxlX3NpemU7CiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIG9yYW5nZWZzX2FkZHJlc3Nfb3BlcmF0aW9uczsKZGlmZiAtLWdpdCBhL2ZzL29yYW5nZWZzL29yYW5nZWZzLW1vZC5jIGIvZnMvb3JhbmdlZnMvb3JhbmdlZnMtbW9kLmMKaW5kZXggZTlmZDU3NS4uMmU1YjAzMCAxMDA2NDQKLS0tIGEvZnMvb3JhbmdlZnMvb3JhbmdlZnMtbW9kLmMKKysrIGIvZnMvb3JhbmdlZnMvb3JhbmdlZnMtbW9kLmMKQEAgLTIxLDM0ICsyMSwxNyBAQAogICogZ2xvYmFsIHZhcmlhYmxlcyBkZWNsYXJlZCBoZXJlCiAgKi8KIAotLyogYXJyYXkgb2YgY2xpZW50IGRlYnVnIGtleXdvcmQvbWFzayB2YWx1ZXMgKi8KLXN0cnVjdCBjbGllbnRfZGVidWdfbWFzayAqY2RtX2FycmF5OwotaW50IGNkbV9lbGVtZW50X2NvdW50OwotCi1jaGFyIGtlcm5lbF9kZWJ1Z19zdHJpbmdbT1JBTkdFRlNfTUFYX0RFQlVHX1NUUklOR19MRU5dID0gIm5vbmUiOwotY2hhciBjbGllbnRfZGVidWdfc3RyaW5nW09SQU5HRUZTX01BWF9ERUJVR19TVFJJTkdfTEVOXTsKLWNoYXIgY2xpZW50X2RlYnVnX2FycmF5X3N0cmluZ1tPUkFOR0VGU19NQVhfREVCVUdfU1RSSU5HX0xFTl07Ci0KLWNoYXIgKmRlYnVnX2hlbHBfc3RyaW5nOwotaW50IGhlbHBfc3RyaW5nX2luaXRpYWxpemVkOwotc3RydWN0IGRlbnRyeSAqaGVscF9maWxlX2RlbnRyeTsKLXN0cnVjdCBkZW50cnkgKmNsaWVudF9kZWJ1Z19kZW50cnk7Ci1zdHJ1Y3QgZGVudHJ5ICpkZWJ1Z19kaXI7Ci1pbnQgY2xpZW50X3ZlcmJvc2VfaW5kZXg7Ci1pbnQgY2xpZW50X2FsbF9pbmRleDsKLXN0cnVjdCBvcmFuZ2Vmc19zdGF0cyBnX29yYW5nZWZzX3N0YXRzOworc3RydWN0IG9yYW5nZWZzX3N0YXRzIG9yYW5nZWZzX3N0YXRzOwogCiAvKiB0aGUgc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZXMgZm9yIG9wcyBpbiBwcm9ncmVzcyAqLwogaW50IGhhc2hfdGFibGVfc2l6ZSA9IDUwOTsKIAogc3RhdGljIHVsb25nIG1vZHVsZV9wYXJtX2RlYnVnX21hc2s7Ci1fX3U2NCBnb3NzaXBfZGVidWdfbWFzazsKLXN0cnVjdCBjbGllbnRfZGVidWdfbWFzayBjbGllbnRfZGVidWdfbWFzayA9IHsgTlVMTCwgMCwgMCB9OwotdW5zaWduZWQgaW50IGtlcm5lbF9tYXNrX3NldF9tb2RfaW5pdDsgLyogaW1wbGljaXRseSBmYWxzZSAqLworX191NjQgb3JhbmdlZnNfZ29zc2lwX2RlYnVnX21hc2s7CiBpbnQgb3BfdGltZW91dF9zZWNzID0gT1JBTkdFRlNfREVGQVVMVF9PUF9USU1FT1VUX1NFQ1M7CiBpbnQgc2xvdF90aW1lb3V0X3NlY3MgPSBPUkFOR0VGU19ERUZBVUxUX1NMT1RfVElNRU9VVF9TRUNTOwotaW50IGRjYWNoZV90aW1lb3V0X21zZWNzID0gNTA7Ci1pbnQgZ2V0YXR0cl90aW1lb3V0X21zZWNzID0gNTA7CitpbnQgb3JhbmdlZnNfZGNhY2hlX3RpbWVvdXRfbXNlY3MgPSA1MDsKK2ludCBvcmFuZ2Vmc19nZXRhdHRyX3RpbWVvdXRfbXNlY3MgPSA1MDsKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiT1JBTkdFRlMgRGV2ZWxvcG1lbnQgVGVhbSIpOwpAQCAtNzEsMjAgKzU0LDE3IEBACiBtb2R1bGVfcGFyYW0ob3BfdGltZW91dF9zZWNzLCBpbnQsIDApOwogbW9kdWxlX3BhcmFtKHNsb3RfdGltZW91dF9zZWNzLCBpbnQsIDApOwogCi0vKiBzeW5jaHJvbml6ZXMgdGhlIHJlcXVlc3QgZGV2aWNlIGZpbGUgKi8KLURFRklORV9NVVRFWChkZXZyZXFfbXV0ZXgpOwotCiAvKgogICogQmxvY2tzIG5vbi1wcmlvcml0eSByZXF1ZXN0cyBmcm9tIGJlaW5nIHF1ZXVlZCBmb3Igc2VydmljaW5nLiAgVGhpcwogICogY291bGQgYmUgdXNlZCBmb3IgcHJvdGVjdGluZyB0aGUgcmVxdWVzdCBsaXN0IGRhdGEgc3RydWN0dXJlLCBidXQKICAqIGZvciBub3cgaXQncyBvbmx5IGJlaW5nIHVzZWQgdG8gc3RhbGwgdGhlIG9wIGFkZGl0aW9uIHRvIHRoZSByZXF1ZXN0CiAgKiBsaXN0CiAgKi8KLURFRklORV9NVVRFWChyZXF1ZXN0X211dGV4KTsKK0RFRklORV9NVVRFWChvcmFuZ2Vmc19yZXF1ZXN0X211dGV4KTsKIAogLyogaGFzaCB0YWJsZSBmb3Igc3RvcmluZyBvcGVyYXRpb25zIHdhaXRpbmcgZm9yIG1hdGNoaW5nIGRvd25jYWxsICovCi1zdHJ1Y3QgbGlzdF9oZWFkICpodGFibGVfb3BzX2luX3Byb2dyZXNzOwotREVGSU5FX1NQSU5MT0NLKGh0YWJsZV9vcHNfaW5fcHJvZ3Jlc3NfbG9jayk7CitzdHJ1Y3QgbGlzdF9oZWFkICpvcmFuZ2Vmc19odGFibGVfb3BzX2luX3Byb2dyZXNzOworREVGSU5FX1NQSU5MT0NLKG9yYW5nZWZzX2h0YWJsZV9vcHNfaW5fcHJvZ3Jlc3NfbG9jayk7CiAKIC8qIGxpc3QgZm9yIHF1ZXVlaW5nIHVwY2FsbCBvcGVyYXRpb25zICovCiBMSVNUX0hFQUQob3JhbmdlZnNfcmVxdWVzdF9saXN0KTsKQEAgLTEwMCwzMiArODAsNiBAQAogCWludCByZXQgPSAtMTsKIAlfX3UzMiBpID0gMDsKIAotCS8qIGNvbnZlcnQgaW5wdXQgZGVidWcgbWFzayB0byBhIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyICovCi0JZ29zc2lwX2RlYnVnX21hc2sgPSAodW5zaWduZWQgbG9uZyBsb25nKSBtb2R1bGVfcGFybV9kZWJ1Z19tYXNrOwotCi0JLyoKLQkgKiBzZXQgdGhlIGtlcm5lbCdzIGdvc3NpcCBkZWJ1ZyBzdHJpbmc7IGludmFsaWQgbWFzayB2YWx1ZXMgd2lsbAotCSAqIGJlIGlnbm9yZWQuCi0JICovCi0JZGVidWdfbWFza190b19zdHJpbmcoJmdvc3NpcF9kZWJ1Z19tYXNrLCAwKTsKLQotCS8qIHJlbW92ZSBhbnkgaW52YWxpZCB2YWx1ZXMgZnJvbSB0aGUgbWFzayAqLwotCWRlYnVnX3N0cmluZ190b19tYXNrKGtlcm5lbF9kZWJ1Z19zdHJpbmcsICZnb3NzaXBfZGVidWdfbWFzaywgMCk7Ci0KLQkvKgotCSAqIGlmIHRoZSBtYXNrIGhhcyBhIG5vbi16ZXJvIHZhbHVlLCB0aGVuIGluZGljYXRlIHRoYXQgdGhlIG1hc2sKLQkgKiB3YXMgc2V0IHdoZW4gdGhlIGtlcm5lbCBtb2R1bGUgd2FzIGxvYWRlZC4gIFRoZSBvcmFuZ2VmcyBkZXYgaW9jdGwKLQkgKiBjb21tYW5kIHdpbGwgbG9vayBhdCB0aGlzIGJvb2xlYW4gdG8gZGV0ZXJtaW5lIGlmIHRoZSBrZXJuZWwncwotCSAqIGRlYnVnIG1hc2sgc2hvdWxkIGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhlIGNsaWVudC1jb3JlIGlzIHN0YXJ0ZWQuCi0JICovCi0JaWYgKGdvc3NpcF9kZWJ1Z19tYXNrICE9IDApCi0JCWtlcm5lbF9tYXNrX3NldF9tb2RfaW5pdCA9IHRydWU7Ci0KLQlwcl9pbmZvKCIlczogY2FsbGVkIHdpdGggZGVidWcgbWFzazogOiVzOiA6JWxseDpcbiIsCi0JCV9fZnVuY19fLAotCQlrZXJuZWxfZGVidWdfc3RyaW5nLAotCQkodW5zaWduZWQgbG9uZyBsb25nKWdvc3NpcF9kZWJ1Z19tYXNrKTsKLQogCXJldCA9IGJkaV9pbml0KCZvcmFuZ2Vmc19iYWNraW5nX2Rldl9pbmZvKTsKIAogCWlmIChyZXQpCkBAIC0xNDYsOSArMTAwLDkgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBjbGVhbnVwX29wOwogCi0JaHRhYmxlX29wc19pbl9wcm9ncmVzcyA9CisJb3JhbmdlZnNfaHRhYmxlX29wc19pbl9wcm9ncmVzcyA9CiAJICAgIGtjYWxsb2MoaGFzaF90YWJsZV9zaXplLCBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCksIEdGUF9LRVJORUwpOwotCWlmICghaHRhYmxlX29wc19pbl9wcm9ncmVzcykgeworCWlmICghb3JhbmdlZnNfaHRhYmxlX29wc19pbl9wcm9ncmVzcykgewogCQlnb3NzaXBfZXJyKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBvcCBoYXNodGFibGUiKTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBjbGVhbnVwX2lub2RlOwpAQCAtMTU2LDcgKzExMCw3IEBACiAKIAkvKiBpbml0aWFsaXplIGEgZG91Ymx5IGxpbmtlZCBhdCBlYWNoIGhhc2ggdGFibGUgaW5kZXggKi8KIAlmb3IgKGkgPSAwOyBpIDwgaGFzaF90YWJsZV9zaXplOyBpKyspCi0JCUlOSVRfTElTVF9IRUFEKCZodGFibGVfb3BzX2luX3Byb2dyZXNzW2ldKTsKKwkJSU5JVF9MSVNUX0hFQUQoJm9yYW5nZWZzX2h0YWJsZV9vcHNfaW5fcHJvZ3Jlc3NbaV0pOwogCiAJcmV0ID0gZnNpZF9rZXlfdGFibGVfaW5pdGlhbGl6ZSgpOwogCWlmIChyZXQgPCAwKQpAQCAtMTc5LDE0ICsxMzMsMTAgQEAKIAlpZiAocmV0KQogCQlnb3RvIGNsZWFudXBfa2V5X3RhYmxlOwogCi0JcmV0ID0gb3JhbmdlZnNfZGVidWdmc19pbml0KCk7CisJcmV0ID0gb3JhbmdlZnNfZGVidWdmc19pbml0KG1vZHVsZV9wYXJtX2RlYnVnX21hc2spOwogCWlmIChyZXQpCiAJCWdvdG8gZGVidWdmc19pbml0X2ZhaWxlZDsKIAotCXJldCA9IG9yYW5nZWZzX2tlcm5lbF9kZWJ1Z19pbml0KCk7Ci0JaWYgKHJldCkKLQkJZ290byBrZXJuZWxfZGVidWdfaW5pdF9mYWlsZWQ7Ci0KIAlyZXQgPSBvcmFuZ2Vmc19zeXNmc19pbml0KCk7CiAJaWYgKHJldCkKIAkJZ290byBzeXNmc19pbml0X2ZhaWxlZDsKQEAgLTIxNCw4ICsxNjQsNiBAQAogCiBzeXNmc19pbml0X2ZhaWxlZDoKIAota2VybmVsX2RlYnVnX2luaXRfZmFpbGVkOgotCiBkZWJ1Z2ZzX2luaXRfZmFpbGVkOgogCW9yYW5nZWZzX2RlYnVnZnNfY2xlYW51cCgpOwogCkBAIC0yMjMsNyArMTcxLDcgQEAKIAlmc2lkX2tleV90YWJsZV9maW5hbGl6ZSgpOwogCiBjbGVhbnVwX3Byb2dyZXNzX3RhYmxlOgotCWtmcmVlKGh0YWJsZV9vcHNfaW5fcHJvZ3Jlc3MpOworCWtmcmVlKG9yYW5nZWZzX2h0YWJsZV9vcHNfaW5fcHJvZ3Jlc3MpOwogCiBjbGVhbnVwX2lub2RlOgogCW9yYW5nZWZzX2lub2RlX2NhY2hlX2ZpbmFsaXplKCk7CkBAIC0yNTAsMTIgKzE5OCwxMiBAQAogCW9yYW5nZWZzX2Rldl9jbGVhbnVwKCk7CiAJQlVHX09OKCFsaXN0X2VtcHR5KCZvcmFuZ2Vmc19yZXF1ZXN0X2xpc3QpKTsKIAlmb3IgKGkgPSAwOyBpIDwgaGFzaF90YWJsZV9zaXplOyBpKyspCi0JCUJVR19PTighbGlzdF9lbXB0eSgmaHRhYmxlX29wc19pbl9wcm9ncmVzc1tpXSkpOworCQlCVUdfT04oIWxpc3RfZW1wdHkoJm9yYW5nZWZzX2h0YWJsZV9vcHNfaW5fcHJvZ3Jlc3NbaV0pKTsKIAogCW9yYW5nZWZzX2lub2RlX2NhY2hlX2ZpbmFsaXplKCk7CiAJb3BfY2FjaGVfZmluYWxpemUoKTsKIAotCWtmcmVlKGh0YWJsZV9vcHNfaW5fcHJvZ3Jlc3MpOworCWtmcmVlKG9yYW5nZWZzX2h0YWJsZV9vcHNfaW5fcHJvZ3Jlc3MpOwogCiAJYmRpX2Rlc3Ryb3koJm9yYW5nZWZzX2JhY2tpbmdfZGV2X2luZm8pOwogCkBAIC0yNzQsMTAgKzIyMiwxMCBAQAogCQlzdHJ1Y3Qgb3JhbmdlZnNfa2VybmVsX29wX3MgKm9wOwogCQlzdHJ1Y3Qgb3JhbmdlZnNfa2VybmVsX29wX3MgKm5leHQ7CiAKLQkJc3Bpbl9sb2NrKCZodGFibGVfb3BzX2luX3Byb2dyZXNzX2xvY2spOworCQlzcGluX2xvY2soJm9yYW5nZWZzX2h0YWJsZV9vcHNfaW5fcHJvZ3Jlc3NfbG9jayk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShvcCwKIAkJCQkJIG5leHQsCi0JCQkJCSAmaHRhYmxlX29wc19pbl9wcm9ncmVzc1tpXSwKKwkJCQkJICZvcmFuZ2Vmc19odGFibGVfb3BzX2luX3Byb2dyZXNzW2ldLAogCQkJCQkgbGlzdCkgewogCQkJc2V0X29wX3N0YXRlX3B1cmdlZChvcCk7CiAJCQlnb3NzaXBfZGVidWcoR09TU0lQX0RFVl9ERUJVRywKQEAgLTI4Nyw3ICsyMzUsNyBAQAogCQkJCSAgICAgb3AtPm9wX3N0YXRlLAogCQkJCSAgICAgY3VycmVudC0+Y29tbSk7CiAJCX0KLQkJc3Bpbl91bmxvY2soJmh0YWJsZV9vcHNfaW5fcHJvZ3Jlc3NfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZvcmFuZ2Vmc19odGFibGVfb3BzX2luX3Byb2dyZXNzX2xvY2spOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZnMvb3JhbmdlZnMvb3JhbmdlZnMtc3lzZnMuYyBiL2ZzL29yYW5nZWZzL29yYW5nZWZzLXN5c2ZzLmMKaW5kZXggMzc1NzA4Yy4uYTc5OTU0NiAxMDA2NDQKLS0tIGEvZnMvb3JhbmdlZnMvb3JhbmdlZnMtc3lzZnMuYworKysgYi9mcy9vcmFuZ2Vmcy9vcmFuZ2Vmcy1zeXNmcy5jCkBAIC03Myw2ICs3MywyNCBAQAogICogRGVzY3JpcHRpb246CiAgKgkJCVRpbWUgZ2V0YXR0ciBpcyB2YWxpZCBpbiBtaWxsaXNlY29uZHMuCiAgKgorICogV2hhdDoJCS9zeXMvZnMvb3JhbmdlZnMvcmVhZGFoZWFkX2NvdW50CisgKiBEYXRlOgkJQXVnIDIwMTYKKyAqIENvbnRhY3Q6CQlNYXJ0aW4gQnJhbmRlbmJ1cmcgPG1hcnRpbkBvbW5pYm9uZC5jb20+CisgKiBEZXNjcmlwdGlvbjoKKyAqCQkJUmVhZGFoZWFkIGNhY2hlIGJ1ZmZlciBjb3VudC4KKyAqCisgKiBXaGF0OgkJL3N5cy9mcy9vcmFuZ2Vmcy9yZWFkYWhlYWRfc2l6ZQorICogRGF0ZToJCUF1ZyAyMDE2CisgKiBDb250YWN0OgkJTWFydGluIEJyYW5kZW5idXJnIDxtYXJ0aW5Ab21uaWJvbmQuY29tPgorICogRGVzY3JpcHRpb246CisgKgkJCVJlYWRhaGVhZCBjYWNoZSBidWZmZXIgc2l6ZS4KKyAqCisgKiBXaGF0OgkJL3N5cy9mcy9vcmFuZ2Vmcy9yZWFkYWhlYWRfY291bnRfc2l6ZQorICogRGF0ZToJCUF1ZyAyMDE2CisgKiBDb250YWN0OgkJTWFydGluIEJyYW5kZW5idXJnIDxtYXJ0aW5Ab21uaWJvbmQuY29tPgorICogRGVzY3JpcHRpb246CisgKgkJCVJlYWRhaGVhZCBjYWNoZSBidWZmZXIgY291bnQgYW5kIHNpemUuCisgKgogICogV2hhdDoJCS9zeXMvZnMvb3JhbmdlZnMvYWNhY2hlLy4uLgogICogRGF0ZToJCUp1biAyMDE1CiAgKiBDb250YWN0OgkJTWFydGluIEJyYW5kZW5idXJnIDxtYXJ0aW5Ab21uaWJvbmQuY29tPgpAQCAtMTIxLDE1OSArMTM5LDM0IEBACiAjZGVmaW5lIFBDX0tPQkpfSUQgInBjIgogI2RlZmluZSBTVEFUU19LT0JKX0lEICJzdGF0cyIKIAotc3RydWN0IG9yYW5nZWZzX29iaiB7Ci0Jc3RydWN0IGtvYmplY3Qga29iajsKLQlpbnQgb3BfdGltZW91dF9zZWNzOwotCWludCBwZXJmX2NvdW50ZXJfcmVzZXQ7Ci0JaW50IHBlcmZfaGlzdG9yeV9zaXplOwotCWludCBwZXJmX3RpbWVfaW50ZXJ2YWxfc2VjczsKLQlpbnQgc2xvdF90aW1lb3V0X3NlY3M7Ci0JaW50IGRjYWNoZV90aW1lb3V0X21zZWNzOwotCWludCBnZXRhdHRyX3RpbWVvdXRfbXNlY3M7Ci19OwotCi1zdHJ1Y3QgYWNhY2hlX29yYW5nZWZzX29iaiB7Ci0Jc3RydWN0IGtvYmplY3Qga29iajsKLQlpbnQgaGFyZF9saW1pdDsKLQlpbnQgcmVjbGFpbV9wZXJjZW50YWdlOwotCWludCBzb2Z0X2xpbWl0OwotCWludCB0aW1lb3V0X21zZWNzOwotfTsKLQotc3RydWN0IGNhcGNhY2hlX29yYW5nZWZzX29iaiB7Ci0Jc3RydWN0IGtvYmplY3Qga29iajsKLQlpbnQgaGFyZF9saW1pdDsKLQlpbnQgcmVjbGFpbV9wZXJjZW50YWdlOwotCWludCBzb2Z0X2xpbWl0OwotCWludCB0aW1lb3V0X3NlY3M7Ci19OwotCi1zdHJ1Y3QgY2NhY2hlX29yYW5nZWZzX29iaiB7Ci0Jc3RydWN0IGtvYmplY3Qga29iajsKLQlpbnQgaGFyZF9saW1pdDsKLQlpbnQgcmVjbGFpbV9wZXJjZW50YWdlOwotCWludCBzb2Z0X2xpbWl0OwotCWludCB0aW1lb3V0X3NlY3M7Ci19OwotCi1zdHJ1Y3QgbmNhY2hlX29yYW5nZWZzX29iaiB7Ci0Jc3RydWN0IGtvYmplY3Qga29iajsKLQlpbnQgaGFyZF9saW1pdDsKLQlpbnQgcmVjbGFpbV9wZXJjZW50YWdlOwotCWludCBzb2Z0X2xpbWl0OwotCWludCB0aW1lb3V0X21zZWNzOwotfTsKLQotc3RydWN0IHBjX29yYW5nZWZzX29iaiB7Ci0Jc3RydWN0IGtvYmplY3Qga29iajsKLQljaGFyICphY2FjaGU7Ci0JY2hhciAqY2FwY2FjaGU7Ci0JY2hhciAqbmNhY2hlOwotfTsKLQotc3RydWN0IHN0YXRzX29yYW5nZWZzX29iaiB7Ci0Jc3RydWN0IGtvYmplY3Qga29iajsKLQlpbnQgcmVhZHM7Ci0JaW50IHdyaXRlczsKLX07CisvKgorICogRXZlcnkgaXRlbSBjYWxscyBvcmFuZ2Vmc19hdHRyX3Nob3cgYW5kIG9yYW5nZWZzX2F0dHJfc3RvcmUgdGhyb3VnaAorICogb3JhbmdlZnNfc3lzZnNfb3BzLiBUaGV5IGxvb2sgYXQgdGhlIG9yYW5nZWZzX2F0dHJpYnV0ZXMgZnVydGhlciBiZWxvdyB0bworICogY2FsbCBvbmUgb2Ygc3lzZnNfaW50X3Nob3csIHN5c2ZzX2ludF9zdG9yZSwgc3lzZnNfc2VydmljZV9vcF9zaG93LCBvcgorICogc3lzZnNfc2VydmljZV9vcF9zdG9yZS4KKyAqLwogCiBzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlIHsKIAlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7Ci0Jc3NpemVfdCAoKnNob3cpKHN0cnVjdCBvcmFuZ2Vmc19vYmogKm9yYW5nZWZzX29iaiwKKwlzc2l6ZV90ICgqc2hvdykoc3RydWN0IGtvYmplY3QgKmtvYmosCiAJCQlzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlICphdHRyLAogCQkJY2hhciAqYnVmKTsKLQlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBvcmFuZ2Vmc19vYmogKm9yYW5nZWZzX29iaiwKKwlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBrb2JqZWN0ICprb2JqLAogCQkJIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHIsCiAJCQkgY29uc3QgY2hhciAqYnVmLAogCQkJIHNpemVfdCBjb3VudCk7CiB9OwogCi1zdHJ1Y3QgYWNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSB7Ci0Jc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwotCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgYWNhY2hlX29yYW5nZWZzX29iaiAqYWNhY2hlX29yYW5nZWZzX29iaiwKLQkJCXN0cnVjdCBhY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlICphdHRyLAotCQkJY2hhciAqYnVmKTsKLQlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBhY2FjaGVfb3JhbmdlZnNfb2JqICphY2FjaGVfb3JhbmdlZnNfb2JqLAotCQkJIHN0cnVjdCBhY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlICphdHRyLAotCQkJIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCSBzaXplX3QgY291bnQpOwotfTsKLQotc3RydWN0IGNhcGNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSB7Ci0Jc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwotCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgY2FwY2FjaGVfb3JhbmdlZnNfb2JqICpjYXBjYWNoZV9vcmFuZ2Vmc19vYmosCi0JCQlzdHJ1Y3QgY2FwY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlICphdHRyLAotCQkJY2hhciAqYnVmKTsKLQlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBjYXBjYWNoZV9vcmFuZ2Vmc19vYmogKmNhcGNhY2hlX29yYW5nZWZzX29iaiwKLQkJCSBzdHJ1Y3QgY2FwY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlICphdHRyLAotCQkJIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCSBzaXplX3QgY291bnQpOwotfTsKLQotc3RydWN0IGNjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgewotCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKLQlzc2l6ZV90ICgqc2hvdykoc3RydWN0IGNjYWNoZV9vcmFuZ2Vmc19vYmogKmNjYWNoZV9vcmFuZ2Vmc19vYmosCi0JCQlzdHJ1Y3QgY2NhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCWNoYXIgKmJ1Zik7Ci0Jc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3QgY2NhY2hlX29yYW5nZWZzX29iaiAqY2NhY2hlX29yYW5nZWZzX29iaiwKLQkJCSBzdHJ1Y3QgY2NhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSBjb25zdCBjaGFyICpidWYsCi0JCQkgc2l6ZV90IGNvdW50KTsKLX07Ci0KLXN0cnVjdCBuY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlIHsKLQlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7Ci0Jc3NpemVfdCAoKnNob3cpKHN0cnVjdCBuY2FjaGVfb3JhbmdlZnNfb2JqICpuY2FjaGVfb3JhbmdlZnNfb2JqLAotCQkJc3RydWN0IG5jYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHIsCi0JCQljaGFyICpidWYpOwotCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IG5jYWNoZV9vcmFuZ2Vmc19vYmogKm5jYWNoZV9vcmFuZ2Vmc19vYmosCi0JCQkgc3RydWN0IG5jYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgY29uc3QgY2hhciAqYnVmLAotCQkJIHNpemVfdCBjb3VudCk7Ci19OwotCi1zdHJ1Y3QgcGNfb3JhbmdlZnNfYXR0cmlidXRlIHsKLQlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7Ci0Jc3NpemVfdCAoKnNob3cpKHN0cnVjdCBwY19vcmFuZ2Vmc19vYmogKnBjX29yYW5nZWZzX29iaiwKLQkJCXN0cnVjdCBwY19vcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHIsCi0JCQljaGFyICpidWYpOwotCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IHBjX29yYW5nZWZzX29iaiAqcGNfb3JhbmdlZnNfb2JqLAotCQkJIHN0cnVjdCBwY19vcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgY29uc3QgY2hhciAqYnVmLAotCQkJIHNpemVfdCBjb3VudCk7Ci19OwotCi1zdHJ1Y3Qgc3RhdHNfb3JhbmdlZnNfYXR0cmlidXRlIHsKLQlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7Ci0Jc3NpemVfdCAoKnNob3cpKHN0cnVjdCBzdGF0c19vcmFuZ2Vmc19vYmogKnN0YXRzX29yYW5nZWZzX29iaiwKLQkJCXN0cnVjdCBzdGF0c19vcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHIsCi0JCQljaGFyICpidWYpOwotCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IHN0YXRzX29yYW5nZWZzX29iaiAqc3RhdHNfb3JhbmdlZnNfb2JqLAotCQkJIHN0cnVjdCBzdGF0c19vcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgY29uc3QgY2hhciAqYnVmLAotCQkJIHNpemVfdCBjb3VudCk7Ci19OwotCiBzdGF0aWMgc3NpemVfdCBvcmFuZ2Vmc19hdHRyX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCiAJCQkJICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAogCQkJCSAgY2hhciAqYnVmKQogewogCXN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHJpYnV0ZTsKLQlzdHJ1Y3Qgb3JhbmdlZnNfb2JqICpvcmFuZ2Vmc19vYmo7Ci0JaW50IHJjOwogCiAJYXR0cmlidXRlID0gY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUsIGF0dHIpOwotCW9yYW5nZWZzX29iaiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3Qgb3JhbmdlZnNfb2JqLCBrb2JqKTsKLQotCWlmICghYXR0cmlidXRlLT5zaG93KSB7Ci0JCXJjID0gLUVJTzsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmMgPSBhdHRyaWJ1dGUtPnNob3cob3JhbmdlZnNfb2JqLCBhdHRyaWJ1dGUsIGJ1Zik7Ci0KLW91dDoKLQlyZXR1cm4gcmM7CisJaWYgKCFhdHRyaWJ1dGUtPnNob3cpCisJCXJldHVybiAtRUlPOworCXJldHVybiBhdHRyaWJ1dGUtPnNob3coa29iaiwgYXR0cmlidXRlLCBidWYpOwogfQogCiBzdGF0aWMgc3NpemVfdCBvcmFuZ2Vmc19hdHRyX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLApAQCAtMjgyLDI0ICsxNzUsMTUgQEAKIAkJCQkgICBzaXplX3QgbGVuKQogewogCXN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHJpYnV0ZTsKLQlzdHJ1Y3Qgb3JhbmdlZnNfb2JqICpvcmFuZ2Vmc19vYmo7Ci0JaW50IHJjOwogCi0JZ29zc2lwX2RlYnVnKEdPU1NJUF9TWVNGU19ERUJVRywKLQkJICAgICAib3JhbmdlZnNfYXR0cl9zdG9yZTogc3RhcnRcbiIpOworCWlmICghc3RyY21wKGtvYmotPm5hbWUsIFBDX0tPQkpfSUQpIHx8CisJICAgICFzdHJjbXAoa29iai0+bmFtZSwgU1RBVFNfS09CSl9JRCkpCisJCXJldHVybiAtRVBFUk07CiAKIAlhdHRyaWJ1dGUgPSBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSwgYXR0cik7Ci0Jb3JhbmdlZnNfb2JqID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBvcmFuZ2Vmc19vYmosIGtvYmopOwotCi0JaWYgKCFhdHRyaWJ1dGUtPnN0b3JlKSB7Ci0JCXJjID0gLUVJTzsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmMgPSBhdHRyaWJ1dGUtPnN0b3JlKG9yYW5nZWZzX29iaiwgYXR0cmlidXRlLCBidWYsIGxlbik7Ci0KLW91dDoKLQlyZXR1cm4gcmM7CisJaWYgKCFhdHRyaWJ1dGUtPnN0b3JlKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gYXR0cmlidXRlLT5zdG9yZShrb2JqLCBhdHRyaWJ1dGUsIGJ1ZiwgbGVuKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzeXNmc19vcHMgb3JhbmdlZnNfc3lzZnNfb3BzID0gewpAQCAtMzA3LDQwMiArMTkxLDU4IEBACiAJLnN0b3JlID0gb3JhbmdlZnNfYXR0cl9zdG9yZSwKIH07CiAKLXN0YXRpYyBzc2l6ZV90IGFjYWNoZV9vcmFuZ2Vmc19hdHRyX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCQkJCSBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJCQkgY2hhciAqYnVmKQotewotCXN0cnVjdCBhY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlICphdHRyaWJ1dGU7Ci0Jc3RydWN0IGFjYWNoZV9vcmFuZ2Vmc19vYmogKmFjYWNoZV9vcmFuZ2Vmc19vYmo7Ci0JaW50IHJjOwotCi0JYXR0cmlidXRlID0gY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBhY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlLCBhdHRyKTsKLQlhY2FjaGVfb3JhbmdlZnNfb2JqID0KLQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBhY2FjaGVfb3JhbmdlZnNfb2JqLCBrb2JqKTsKLQotCWlmICghYXR0cmlidXRlLT5zaG93KSB7Ci0JCXJjID0gLUVJTzsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmMgPSBhdHRyaWJ1dGUtPnNob3coYWNhY2hlX29yYW5nZWZzX29iaiwgYXR0cmlidXRlLCBidWYpOwotCi1vdXQ6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBhY2FjaGVfb3JhbmdlZnNfYXR0cl9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkJICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJCQkgIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCQkJICBzaXplX3QgbGVuKQotewotCXN0cnVjdCBhY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlICphdHRyaWJ1dGU7Ci0Jc3RydWN0IGFjYWNoZV9vcmFuZ2Vmc19vYmogKmFjYWNoZV9vcmFuZ2Vmc19vYmo7Ci0JaW50IHJjOwotCi0JZ29zc2lwX2RlYnVnKEdPU1NJUF9TWVNGU19ERUJVRywKLQkJICAgICAiYWNhY2hlX29yYW5nZWZzX2F0dHJfc3RvcmU6IHN0YXJ0XG4iKTsKLQotCWF0dHJpYnV0ZSA9IGNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3QgYWNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSwgYXR0cik7Ci0JYWNhY2hlX29yYW5nZWZzX29iaiA9Ci0JCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgYWNhY2hlX29yYW5nZWZzX29iaiwga29iaik7Ci0KLQlpZiAoIWF0dHJpYnV0ZS0+c3RvcmUpIHsKLQkJcmMgPSAtRUlPOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyYyA9IGF0dHJpYnV0ZS0+c3RvcmUoYWNhY2hlX29yYW5nZWZzX29iaiwgYXR0cmlidXRlLCBidWYsIGxlbik7Ci0KLW91dDoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3lzZnNfb3BzIGFjYWNoZV9vcmFuZ2Vmc19zeXNmc19vcHMgPSB7Ci0JLnNob3cgPSBhY2FjaGVfb3JhbmdlZnNfYXR0cl9zaG93LAotCS5zdG9yZSA9IGFjYWNoZV9vcmFuZ2Vmc19hdHRyX3N0b3JlLAotfTsKLQotc3RhdGljIHNzaXplX3QgY2FwY2FjaGVfb3JhbmdlZnNfYXR0cl9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCQkgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJCQkgICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGNhcGNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0cmlidXRlOwotCXN0cnVjdCBjYXBjYWNoZV9vcmFuZ2Vmc19vYmogKmNhcGNhY2hlX29yYW5nZWZzX29iajsKLQlpbnQgcmM7Ci0KLQlhdHRyaWJ1dGUgPQotCQljb250YWluZXJfb2YoYXR0ciwgc3RydWN0IGNhcGNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSwgYXR0cik7Ci0JY2FwY2FjaGVfb3JhbmdlZnNfb2JqID0KLQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBjYXBjYWNoZV9vcmFuZ2Vmc19vYmosIGtvYmopOwotCi0JaWYgKCFhdHRyaWJ1dGUtPnNob3cpIHsKLQkJcmMgPSAtRUlPOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyYyA9IGF0dHJpYnV0ZS0+c2hvdyhjYXBjYWNoZV9vcmFuZ2Vmc19vYmosIGF0dHJpYnV0ZSwgYnVmKTsKLQotb3V0OgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3QgY2FwY2FjaGVfb3JhbmdlZnNfYXR0cl9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkJICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCSAgICBjb25zdCBjaGFyICpidWYsCi0JCQkJCSAgICBzaXplX3QgbGVuKQotewotCXN0cnVjdCBjYXBjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHJpYnV0ZTsKLQlzdHJ1Y3QgY2FwY2FjaGVfb3JhbmdlZnNfb2JqICpjYXBjYWNoZV9vcmFuZ2Vmc19vYmo7Ci0JaW50IHJjOwotCi0JZ29zc2lwX2RlYnVnKEdPU1NJUF9TWVNGU19ERUJVRywKLQkJICAgICAiY2FwY2FjaGVfb3JhbmdlZnNfYXR0cl9zdG9yZTogc3RhcnRcbiIpOwotCi0JYXR0cmlidXRlID0KLQkJY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBjYXBjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUsIGF0dHIpOwotCWNhcGNhY2hlX29yYW5nZWZzX29iaiA9Ci0JCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgY2FwY2FjaGVfb3JhbmdlZnNfb2JqLCBrb2JqKTsKLQotCWlmICghYXR0cmlidXRlLT5zdG9yZSkgewotCQlyYyA9IC1FSU87Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJjID0gYXR0cmlidXRlLT5zdG9yZShjYXBjYWNoZV9vcmFuZ2Vmc19vYmosIGF0dHJpYnV0ZSwgYnVmLCBsZW4pOwotCi1vdXQ6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN5c2ZzX29wcyBjYXBjYWNoZV9vcmFuZ2Vmc19zeXNmc19vcHMgPSB7Ci0JLnNob3cgPSBjYXBjYWNoZV9vcmFuZ2Vmc19hdHRyX3Nob3csCi0JLnN0b3JlID0gY2FwY2FjaGVfb3JhbmdlZnNfYXR0cl9zdG9yZSwKLX07Ci0KLXN0YXRpYyBzc2l6ZV90IGNjYWNoZV9vcmFuZ2Vmc19hdHRyX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCQkJCSBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJCQkgY2hhciAqYnVmKQotewotCXN0cnVjdCBjY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlICphdHRyaWJ1dGU7Ci0Jc3RydWN0IGNjYWNoZV9vcmFuZ2Vmc19vYmogKmNjYWNoZV9vcmFuZ2Vmc19vYmo7Ci0JaW50IHJjOwotCi0JYXR0cmlidXRlID0KLQkJY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBjY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlLCBhdHRyKTsKLQljY2FjaGVfb3JhbmdlZnNfb2JqID0KLQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBjY2FjaGVfb3JhbmdlZnNfb2JqLCBrb2JqKTsKLQotCWlmICghYXR0cmlidXRlLT5zaG93KSB7Ci0JCXJjID0gLUVJTzsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmMgPSBhdHRyaWJ1dGUtPnNob3coY2NhY2hlX29yYW5nZWZzX29iaiwgYXR0cmlidXRlLCBidWYpOwotCi1vdXQ6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBjY2FjaGVfb3JhbmdlZnNfYXR0cl9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkJICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJCQkgIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCQkJICBzaXplX3QgbGVuKQotewotCXN0cnVjdCBjY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlICphdHRyaWJ1dGU7Ci0Jc3RydWN0IGNjYWNoZV9vcmFuZ2Vmc19vYmogKmNjYWNoZV9vcmFuZ2Vmc19vYmo7Ci0JaW50IHJjOwotCi0JZ29zc2lwX2RlYnVnKEdPU1NJUF9TWVNGU19ERUJVRywKLQkJICAgICAiY2NhY2hlX29yYW5nZWZzX2F0dHJfc3RvcmU6IHN0YXJ0XG4iKTsKLQotCWF0dHJpYnV0ZSA9Ci0JCWNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3QgY2NhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSwgYXR0cik7Ci0JY2NhY2hlX29yYW5nZWZzX29iaiA9Ci0JCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgY2NhY2hlX29yYW5nZWZzX29iaiwga29iaik7Ci0KLQlpZiAoIWF0dHJpYnV0ZS0+c3RvcmUpIHsKLQkJcmMgPSAtRUlPOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyYyA9IGF0dHJpYnV0ZS0+c3RvcmUoY2NhY2hlX29yYW5nZWZzX29iaiwgYXR0cmlidXRlLCBidWYsIGxlbik7Ci0KLW91dDoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3lzZnNfb3BzIGNjYWNoZV9vcmFuZ2Vmc19zeXNmc19vcHMgPSB7Ci0JLnNob3cgPSBjY2FjaGVfb3JhbmdlZnNfYXR0cl9zaG93LAotCS5zdG9yZSA9IGNjYWNoZV9vcmFuZ2Vmc19hdHRyX3N0b3JlLAotfTsKLQotc3RhdGljIHNzaXplX3QgbmNhY2hlX29yYW5nZWZzX2F0dHJfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkJIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCSBjaGFyICpidWYpCi17Ci0Jc3RydWN0IG5jYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHJpYnV0ZTsKLQlzdHJ1Y3QgbmNhY2hlX29yYW5nZWZzX29iaiAqbmNhY2hlX29yYW5nZWZzX29iajsKLQlpbnQgcmM7Ci0KLQlhdHRyaWJ1dGUgPSBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IG5jYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUsIGF0dHIpOwotCW5jYWNoZV9vcmFuZ2Vmc19vYmogPQotCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IG5jYWNoZV9vcmFuZ2Vmc19vYmosIGtvYmopOwotCi0JaWYgKCFhdHRyaWJ1dGUtPnNob3cpIHsKLQkJcmMgPSAtRUlPOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyYyA9IGF0dHJpYnV0ZS0+c2hvdyhuY2FjaGVfb3JhbmdlZnNfb2JqLCBhdHRyaWJ1dGUsIGJ1Zik7Ci0KLW91dDoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IG5jYWNoZV9vcmFuZ2Vmc19hdHRyX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCQkgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCSAgY29uc3QgY2hhciAqYnVmLAotCQkJCQkgIHNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IG5jYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHJpYnV0ZTsKLQlzdHJ1Y3QgbmNhY2hlX29yYW5nZWZzX29iaiAqbmNhY2hlX29yYW5nZWZzX29iajsKLQlpbnQgcmM7Ci0KLQlnb3NzaXBfZGVidWcoR09TU0lQX1NZU0ZTX0RFQlVHLAotCQkgICAgICJuY2FjaGVfb3JhbmdlZnNfYXR0cl9zdG9yZTogc3RhcnRcbiIpOwotCi0JYXR0cmlidXRlID0gY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBuY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlLCBhdHRyKTsKLQluY2FjaGVfb3JhbmdlZnNfb2JqID0KLQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBuY2FjaGVfb3JhbmdlZnNfb2JqLCBrb2JqKTsKLQotCWlmICghYXR0cmlidXRlLT5zdG9yZSkgewotCQlyYyA9IC1FSU87Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJjID0gYXR0cmlidXRlLT5zdG9yZShuY2FjaGVfb3JhbmdlZnNfb2JqLCBhdHRyaWJ1dGUsIGJ1ZiwgbGVuKTsKLQotb3V0OgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzeXNmc19vcHMgbmNhY2hlX29yYW5nZWZzX3N5c2ZzX29wcyA9IHsKLQkuc2hvdyA9IG5jYWNoZV9vcmFuZ2Vmc19hdHRyX3Nob3csCi0JLnN0b3JlID0gbmNhY2hlX29yYW5nZWZzX2F0dHJfc3RvcmUsCi19OwotCi1zdGF0aWMgc3NpemVfdCBwY19vcmFuZ2Vmc19hdHRyX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCQkJICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJCSAgICAgY2hhciAqYnVmKQotewotCXN0cnVjdCBwY19vcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHJpYnV0ZTsKLQlzdHJ1Y3QgcGNfb3JhbmdlZnNfb2JqICpwY19vcmFuZ2Vmc19vYmo7Ci0JaW50IHJjOwotCi0JYXR0cmlidXRlID0gY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBwY19vcmFuZ2Vmc19hdHRyaWJ1dGUsIGF0dHIpOwotCXBjX29yYW5nZWZzX29iaiA9Ci0JCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgcGNfb3JhbmdlZnNfb2JqLCBrb2JqKTsKLQotCWlmICghYXR0cmlidXRlLT5zaG93KSB7Ci0JCXJjID0gLUVJTzsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmMgPSBhdHRyaWJ1dGUtPnNob3cocGNfb3JhbmdlZnNfb2JqLCBhdHRyaWJ1dGUsIGJ1Zik7Ci0KLW91dDoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3lzZnNfb3BzIHBjX29yYW5nZWZzX3N5c2ZzX29wcyA9IHsKLQkuc2hvdyA9IHBjX29yYW5nZWZzX2F0dHJfc2hvdywKLX07Ci0KLXN0YXRpYyBzc2l6ZV90IHN0YXRzX29yYW5nZWZzX2F0dHJfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkJc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKLQkJCQkJY2hhciAqYnVmKQotewotCXN0cnVjdCBzdGF0c19vcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHJpYnV0ZTsKLQlzdHJ1Y3Qgc3RhdHNfb3JhbmdlZnNfb2JqICpzdGF0c19vcmFuZ2Vmc19vYmo7Ci0JaW50IHJjOwotCi0JYXR0cmlidXRlID0gY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBzdGF0c19vcmFuZ2Vmc19hdHRyaWJ1dGUsIGF0dHIpOwotCXN0YXRzX29yYW5nZWZzX29iaiA9Ci0JCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3Qgc3RhdHNfb3JhbmdlZnNfb2JqLCBrb2JqKTsKLQotCWlmICghYXR0cmlidXRlLT5zaG93KSB7Ci0JCXJjID0gLUVJTzsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmMgPSBhdHRyaWJ1dGUtPnNob3coc3RhdHNfb3JhbmdlZnNfb2JqLCBhdHRyaWJ1dGUsIGJ1Zik7Ci0KLW91dDoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3lzZnNfb3BzIHN0YXRzX29yYW5nZWZzX3N5c2ZzX29wcyA9IHsKLQkuc2hvdyA9IHN0YXRzX29yYW5nZWZzX2F0dHJfc2hvdywKLX07Ci0KLXN0YXRpYyB2b2lkIG9yYW5nZWZzX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCi17Ci0Jc3RydWN0IG9yYW5nZWZzX29iaiAqb3JhbmdlZnNfb2JqOwotCi0Jb3JhbmdlZnNfb2JqID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBvcmFuZ2Vmc19vYmosIGtvYmopOwotCWtmcmVlKG9yYW5nZWZzX29iaik7Ci19Ci0KLXN0YXRpYyB2b2lkIGFjYWNoZV9vcmFuZ2Vmc19yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQotewotCXN0cnVjdCBhY2FjaGVfb3JhbmdlZnNfb2JqICphY2FjaGVfb3JhbmdlZnNfb2JqOwotCi0JYWNhY2hlX29yYW5nZWZzX29iaiA9Ci0JCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgYWNhY2hlX29yYW5nZWZzX29iaiwga29iaik7Ci0Ja2ZyZWUoYWNhY2hlX29yYW5nZWZzX29iaik7Ci19Ci0KLXN0YXRpYyB2b2lkIGNhcGNhY2hlX29yYW5nZWZzX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCi17Ci0Jc3RydWN0IGNhcGNhY2hlX29yYW5nZWZzX29iaiAqY2FwY2FjaGVfb3JhbmdlZnNfb2JqOwotCi0JY2FwY2FjaGVfb3JhbmdlZnNfb2JqID0KLQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBjYXBjYWNoZV9vcmFuZ2Vmc19vYmosIGtvYmopOwotCWtmcmVlKGNhcGNhY2hlX29yYW5nZWZzX29iaik7Ci19Ci0KLXN0YXRpYyB2b2lkIGNjYWNoZV9vcmFuZ2Vmc19yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQotewotCXN0cnVjdCBjY2FjaGVfb3JhbmdlZnNfb2JqICpjY2FjaGVfb3JhbmdlZnNfb2JqOwotCi0JY2NhY2hlX29yYW5nZWZzX29iaiA9Ci0JCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgY2NhY2hlX29yYW5nZWZzX29iaiwga29iaik7Ci0Ja2ZyZWUoY2NhY2hlX29yYW5nZWZzX29iaik7Ci19Ci0KLXN0YXRpYyB2b2lkIG5jYWNoZV9vcmFuZ2Vmc19yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQotewotCXN0cnVjdCBuY2FjaGVfb3JhbmdlZnNfb2JqICpuY2FjaGVfb3JhbmdlZnNfb2JqOwotCi0JbmNhY2hlX29yYW5nZWZzX29iaiA9Ci0JCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgbmNhY2hlX29yYW5nZWZzX29iaiwga29iaik7Ci0Ja2ZyZWUobmNhY2hlX29yYW5nZWZzX29iaik7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjX29yYW5nZWZzX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCi17Ci0Jc3RydWN0IHBjX29yYW5nZWZzX29iaiAqcGNfb3JhbmdlZnNfb2JqOwotCi0JcGNfb3JhbmdlZnNfb2JqID0KLQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBwY19vcmFuZ2Vmc19vYmosIGtvYmopOwotCWtmcmVlKHBjX29yYW5nZWZzX29iaik7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0YXRzX29yYW5nZWZzX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCi17Ci0Jc3RydWN0IHN0YXRzX29yYW5nZWZzX29iaiAqc3RhdHNfb3JhbmdlZnNfb2JqOwotCi0Jc3RhdHNfb3JhbmdlZnNfb2JqID0KLQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBzdGF0c19vcmFuZ2Vmc19vYmosIGtvYmopOwotCWtmcmVlKHN0YXRzX29yYW5nZWZzX29iaik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHN5c2ZzX2ludF9zaG93KGNoYXIgKmtvYmpfaWQsIGNoYXIgKmJ1Ziwgdm9pZCAqYXR0cikKK3N0YXRpYyBzc2l6ZV90IHN5c2ZzX2ludF9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorICAgIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlpbnQgcmMgPSAtRUlPOwotCXN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgKm9yYW5nZWZzX2F0dHI7Ci0Jc3RydWN0IHN0YXRzX29yYW5nZWZzX2F0dHJpYnV0ZSAqc3RhdHNfb3JhbmdlZnNfYXR0cjsKIAotCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfU1lTRlNfREVCVUcsICJzeXNmc19pbnRfc2hvdzogaWQ6JXM6XG4iLCBrb2JqX2lkKTsKKwlnb3NzaXBfZGVidWcoR09TU0lQX1NZU0ZTX0RFQlVHLCAic3lzZnNfaW50X3Nob3c6IGlkOiVzOlxuIiwKKwkgICAga29iai0+bmFtZSk7CiAKLQlpZiAoIXN0cmNtcChrb2JqX2lkLCBPUkFOR0VGU19LT0JKX0lEKSkgewotCQlvcmFuZ2Vmc19hdHRyID0gKHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgKilhdHRyOwotCi0JCWlmICghc3RyY21wKG9yYW5nZWZzX2F0dHItPmF0dHIubmFtZSwgIm9wX3RpbWVvdXRfc2VjcyIpKSB7CisJaWYgKCFzdHJjbXAoa29iai0+bmFtZSwgT1JBTkdFRlNfS09CSl9JRCkpIHsKKwkJaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAib3BfdGltZW91dF9zZWNzIikpIHsKIAkJCXJjID0gc2NucHJpbnRmKGJ1ZiwKIAkJCQkgICAgICAgUEFHRV9TSVpFLAogCQkJCSAgICAgICAiJWRcbiIsCiAJCQkJICAgICAgIG9wX3RpbWVvdXRfc2Vjcyk7CiAJCQlnb3RvIG91dDsKLQkJfSBlbHNlIGlmICghc3RyY21wKG9yYW5nZWZzX2F0dHItPmF0dHIubmFtZSwKKwkJfSBlbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwKIAkJCQkgICAic2xvdF90aW1lb3V0X3NlY3MiKSkgewogCQkJcmMgPSBzY25wcmludGYoYnVmLAogCQkJCSAgICAgICBQQUdFX1NJWkUsCiAJCQkJICAgICAgICIlZFxuIiwKIAkJCQkgICAgICAgc2xvdF90aW1lb3V0X3NlY3MpOwogCQkJZ290byBvdXQ7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChvcmFuZ2Vmc19hdHRyLT5hdHRyLm5hbWUsCisJCX0gZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsCiAJCQkJICAgImRjYWNoZV90aW1lb3V0X21zZWNzIikpIHsKIAkJCXJjID0gc2NucHJpbnRmKGJ1ZiwKIAkJCQkgICAgICAgUEFHRV9TSVpFLAogCQkJCSAgICAgICAiJWRcbiIsCi0JCQkJICAgICAgIGRjYWNoZV90aW1lb3V0X21zZWNzKTsKKwkJCQkgICAgICAgb3JhbmdlZnNfZGNhY2hlX3RpbWVvdXRfbXNlY3MpOwogCQkJZ290byBvdXQ7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChvcmFuZ2Vmc19hdHRyLT5hdHRyLm5hbWUsCisJCX0gZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsCiAJCQkJICAgImdldGF0dHJfdGltZW91dF9tc2VjcyIpKSB7CiAJCQlyYyA9IHNjbnByaW50ZihidWYsCiAJCQkJICAgICAgIFBBR0VfU0laRSwKIAkJCQkgICAgICAgIiVkXG4iLAotCQkJCSAgICAgICBnZXRhdHRyX3RpbWVvdXRfbXNlY3MpOworCQkJCSAgICAgICBvcmFuZ2Vmc19nZXRhdHRyX3RpbWVvdXRfbXNlY3MpOwogCQkJZ290byBvdXQ7CiAJCX0gZWxzZSB7CiAJCQlnb3RvIG91dDsKIAkJfQogCi0JfSBlbHNlIGlmICghc3RyY21wKGtvYmpfaWQsIFNUQVRTX0tPQkpfSUQpKSB7Ci0JCXN0YXRzX29yYW5nZWZzX2F0dHIgPSAoc3RydWN0IHN0YXRzX29yYW5nZWZzX2F0dHJpYnV0ZSAqKWF0dHI7Ci0KLQkJaWYgKCFzdHJjbXAoc3RhdHNfb3JhbmdlZnNfYXR0ci0+YXR0ci5uYW1lLCAicmVhZHMiKSkgeworCX0gZWxzZSBpZiAoIXN0cmNtcChrb2JqLT5uYW1lLCBTVEFUU19LT0JKX0lEKSkgeworCQlpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJyZWFkcyIpKSB7CiAJCQlyYyA9IHNjbnByaW50ZihidWYsCiAJCQkJICAgICAgIFBBR0VfU0laRSwKIAkJCQkgICAgICAgIiVsdVxuIiwKLQkJCQkgICAgICAgZ19vcmFuZ2Vmc19zdGF0cy5yZWFkcyk7CisJCQkJICAgICAgIG9yYW5nZWZzX3N0YXRzLnJlYWRzKTsKIAkJCWdvdG8gb3V0OwotCQl9IGVsc2UgaWYgKCFzdHJjbXAoc3RhdHNfb3JhbmdlZnNfYXR0ci0+YXR0ci5uYW1lLCAid3JpdGVzIikpIHsKKwkJfSBlbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgIndyaXRlcyIpKSB7CiAJCQlyYyA9IHNjbnByaW50ZihidWYsCiAJCQkJICAgICAgIFBBR0VfU0laRSwKIAkJCQkgICAgICAgIiVsdVxuIiwKLQkJCQkgICAgICAgZ19vcmFuZ2Vmc19zdGF0cy53cml0ZXMpOworCQkJCSAgICAgICBvcmFuZ2Vmc19zdGF0cy53cml0ZXMpOwogCQkJZ290byBvdXQ7CiAJCX0gZWxzZSB7CiAJCQlnb3RvIG91dDsKQEAgLTcxNCw0NSArMjU0LDEzIEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgc3NpemVfdCBpbnRfb3JhbmdlZnNfc2hvdyhzdHJ1Y3Qgb3JhbmdlZnNfb2JqICpvcmFuZ2Vmc19vYmosCi0JCQkJIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJIGNoYXIgKmJ1ZikKLXsKLQlpbnQgcmM7Ci0KLQlnb3NzaXBfZGVidWcoR09TU0lQX1NZU0ZTX0RFQlVHLAotCQkgICAgICJpbnRfb3JhbmdlZnNfc2hvdzpzdGFydCBhdHRyLT5hdHRyLm5hbWU6JXM6XG4iLAotCQkgICAgIGF0dHItPmF0dHIubmFtZSk7Ci0KLQlyYyA9IHN5c2ZzX2ludF9zaG93KE9SQU5HRUZTX0tPQkpfSUQsIGJ1ZiwgKHZvaWQgKikgYXR0cik7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGludF9zdGF0c19zaG93KHN0cnVjdCBzdGF0c19vcmFuZ2Vmc19vYmogKnN0YXRzX29yYW5nZWZzX29iaiwKLQkJCXN0cnVjdCBzdGF0c19vcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHIsCi0JCQljaGFyICpidWYpCi17Ci0JaW50IHJjOwotCi0JZ29zc2lwX2RlYnVnKEdPU1NJUF9TWVNGU19ERUJVRywKLQkJICAgICAiaW50X3N0YXRzX3Nob3c6c3RhcnQgYXR0ci0+YXR0ci5uYW1lOiVzOlxuIiwKLQkJICAgICBhdHRyLT5hdHRyLm5hbWUpOwotCi0JcmMgPSBzeXNmc19pbnRfc2hvdyhTVEFUU19LT0JKX0lELCBidWYsICh2b2lkICopIGF0dHIpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBpbnRfc3RvcmUoc3RydWN0IG9yYW5nZWZzX29iaiAqb3JhbmdlZnNfb2JqLAotCQkJIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgY29uc3QgY2hhciAqYnVmLAotCQkJIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHN5c2ZzX2ludF9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKyAgICBzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlpbnQgcmMgPSAwOwogCiAJZ29zc2lwX2RlYnVnKEdPU1NJUF9TWVNGU19ERUJVRywKLQkJICAgICAiaW50X3N0b3JlOiBzdGFydCBhdHRyLT5hdHRyLm5hbWU6JXM6IGJ1ZjolczpcbiIsCisJCSAgICAgInN5c2ZzX2ludF9zdG9yZTogc3RhcnQgYXR0ci0+YXR0ci5uYW1lOiVzOiBidWY6JXM6XG4iLAogCQkgICAgIGF0dHItPmF0dHIubmFtZSwgYnVmKTsKIAogCWlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgIm9wX3RpbWVvdXRfc2VjcyIpKSB7CkBAIC03NjIsMTAgKzI3MCwxMCBAQAogCQlyYyA9IGtzdHJ0b2ludChidWYsIDAsICZzbG90X3RpbWVvdXRfc2Vjcyk7CiAJCWdvdG8gb3V0OwogCX0gZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJkY2FjaGVfdGltZW91dF9tc2VjcyIpKSB7Ci0JCXJjID0ga3N0cnRvaW50KGJ1ZiwgMCwgJmRjYWNoZV90aW1lb3V0X21zZWNzKTsKKwkJcmMgPSBrc3RydG9pbnQoYnVmLCAwLCAmb3JhbmdlZnNfZGNhY2hlX3RpbWVvdXRfbXNlY3MpOwogCQlnb3RvIG91dDsKIAl9IGVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAiZ2V0YXR0cl90aW1lb3V0X21zZWNzIikpIHsKLQkJcmMgPSBrc3RydG9pbnQoYnVmLCAwLCAmZ2V0YXR0cl90aW1lb3V0X21zZWNzKTsKKwkJcmMgPSBrc3RydG9pbnQoYnVmLCAwLCAmb3JhbmdlZnNfZ2V0YXR0cl90aW1lb3V0X21zZWNzKTsKIAkJZ290byBvdXQ7CiAJfSBlbHNlIHsKIAkJZ290byBvdXQ7CkBAIC03ODMsMjQgKzI5MSwxOSBAQAogLyoKICAqIG9idGFpbiBhdHRyaWJ1dGUgdmFsdWVzIGZyb20gdXNlcnNwYWNlIHdpdGggYSBzZXJ2aWNlIG9wZXJhdGlvbi4KICAqLwotc3RhdGljIGludCBzeXNmc19zZXJ2aWNlX29wX3Nob3coY2hhciAqa29ial9pZCwgY2hhciAqYnVmLCB2b2lkICphdHRyKQorc3RhdGljIHNzaXplX3Qgc3lzZnNfc2VydmljZV9vcF9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorICAgIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3Qgb3JhbmdlZnNfa2VybmVsX29wX3MgKm5ld19vcCA9IE5VTEw7CiAJaW50IHJjID0gMDsKIAljaGFyICpzZXJfb3BfdHlwZSA9IE5VTEw7Ci0Jc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSAqb3JhbmdlZnNfYXR0cjsKLQlzdHJ1Y3QgYWNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSAqYWNhY2hlX2F0dHI7Ci0Jc3RydWN0IGNhcGNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSAqY2FwY2FjaGVfYXR0cjsKLQlzdHJ1Y3QgY2NhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSAqY2NhY2hlX2F0dHI7Ci0Jc3RydWN0IG5jYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgKm5jYWNoZV9hdHRyOwotCXN0cnVjdCBwY19vcmFuZ2Vmc19hdHRyaWJ1dGUgKnBjX2F0dHI7CiAJX191MzIgb3BfYWxsb2NfdHlwZTsKIAogCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfU1lTRlNfREVCVUcsCiAJCSAgICAgInN5c2ZzX3NlcnZpY2Vfb3Bfc2hvdzogaWQ6JXM6XG4iLAotCQkgICAgIGtvYmpfaWQpOworCQkgICAgIGtvYmotPm5hbWUpOwogCi0JaWYgKHN0cmNtcChrb2JqX2lkLCBQQ19LT0JKX0lEKSkKKwlpZiAoc3RyY21wKGtvYmotPm5hbWUsIFBDX0tPQkpfSUQpKQogCQlvcF9hbGxvY190eXBlID0gT1JBTkdFRlNfVkZTX09QX1BBUkFNOwogCWVsc2UKIAkJb3BfYWxsb2NfdHlwZSA9IE9SQU5HRUZTX1ZGU19PUF9QRVJGX0NPVU5UOwpAQCAtODE4LDEyNCArMzIxLDEzNSBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAoc3RyY21wKGtvYmpfaWQsIFBDX0tPQkpfSUQpKQorCWlmIChzdHJjbXAoa29iai0+bmFtZSwgUENfS09CSl9JRCkpCiAJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS50eXBlID0gT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9HRVQ7CiAKLQlpZiAoIXN0cmNtcChrb2JqX2lkLCBPUkFOR0VGU19LT0JKX0lEKSkgewotCQlvcmFuZ2Vmc19hdHRyID0gKHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgKilhdHRyOworCWlmICghc3RyY21wKGtvYmotPm5hbWUsIE9SQU5HRUZTX0tPQkpfSUQpKSB7CisJCS8qIERyb3AgdW5zdXBwb3J0ZWQgcmVxdWVzdHMgZmlyc3QuICovCisJCWlmICghKG9yYW5nZWZzX2ZlYXR1cmVzICYgT1JBTkdFRlNfRkVBVFVSRV9SRUFEQUhFQUQpICYmCisJCSAgICAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJyZWFkYWhlYWRfY291bnQiKSB8fAorCQkgICAgIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJyZWFkYWhlYWRfc2l6ZSIpIHx8CisJCSAgICAhc3RyY21wKGF0dHItPmF0dHIubmFtZSwgInJlYWRhaGVhZF9jb3VudF9zaXplIikpKSB7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQogCi0JCWlmICghc3RyY21wKG9yYW5nZWZzX2F0dHItPmF0dHIubmFtZSwgInBlcmZfaGlzdG9yeV9zaXplIikpCisJCWlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgInBlcmZfaGlzdG9yeV9zaXplIikpCiAJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQogCQkJCU9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfUEVSRl9ISVNUT1JZX1NJWkU7Ci0JCWVsc2UgaWYgKCFzdHJjbXAob3JhbmdlZnNfYXR0ci0+YXR0ci5uYW1lLAorCQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwKIAkJCQkgInBlcmZfdGltZV9pbnRlcnZhbF9zZWNzIikpCiAJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQogCQkJCU9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfUEVSRl9USU1FX0lOVEVSVkFMX1NFQ1M7Ci0JCWVsc2UgaWYgKCFzdHJjbXAob3JhbmdlZnNfYXR0ci0+YXR0ci5uYW1lLAorCQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwKIAkJCQkgInBlcmZfY291bnRlcl9yZXNldCIpKQogCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID0KIAkJCQlPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX1BFUkZfUkVTRVQ7CiAKLQl9IGVsc2UgaWYgKCFzdHJjbXAoa29ial9pZCwgQUNBQ0hFX0tPQkpfSUQpKSB7Ci0JCWFjYWNoZV9hdHRyID0gKHN0cnVjdCBhY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlICopYXR0cjsKKwkJZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsCisJCQkJICJyZWFkYWhlYWRfY291bnQiKSkKKwkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CisJCQkJT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9SRUFEQUhFQURfQ09VTlQ7CiAKLQkJaWYgKCFzdHJjbXAoYWNhY2hlX2F0dHItPmF0dHIubmFtZSwgInRpbWVvdXRfbXNlY3MiKSkKKwkJZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsCisJCQkJICJyZWFkYWhlYWRfc2l6ZSIpKQorCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID0KKwkJCQlPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX1JFQURBSEVBRF9TSVpFOworCisJCWVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLAorCQkJCSAicmVhZGFoZWFkX2NvdW50X3NpemUiKSkKKwkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CisJCQkJT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9SRUFEQUhFQURfQ09VTlRfU0laRTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoa29iai0+bmFtZSwgQUNBQ0hFX0tPQkpfSUQpKSB7CisJCWlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgInRpbWVvdXRfbXNlY3MiKSkKIAkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CiAJCQkJT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9BQ0FDSEVfVElNRU9VVF9NU0VDUzsKIAotCQlpZiAoIXN0cmNtcChhY2FjaGVfYXR0ci0+YXR0ci5uYW1lLCAiaGFyZF9saW1pdCIpKQorCQlpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJoYXJkX2xpbWl0IikpCiAJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQogCQkJCU9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfQUNBQ0hFX0hBUkRfTElNSVQ7CiAKLQkJaWYgKCFzdHJjbXAoYWNhY2hlX2F0dHItPmF0dHIubmFtZSwgInNvZnRfbGltaXQiKSkKKwkJaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAic29mdF9saW1pdCIpKQogCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID0KIAkJCQlPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX0FDQUNIRV9TT0ZUX0xJTUlUOwogCi0JCWlmICghc3RyY21wKGFjYWNoZV9hdHRyLT5hdHRyLm5hbWUsICJyZWNsYWltX3BlcmNlbnRhZ2UiKSkKKwkJaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAicmVjbGFpbV9wZXJjZW50YWdlIikpCiAJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQogCQkJICBPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX0FDQUNIRV9SRUNMQUlNX1BFUkNFTlRBR0U7CiAKLQl9IGVsc2UgaWYgKCFzdHJjbXAoa29ial9pZCwgQ0FQQ0FDSEVfS09CSl9JRCkpIHsKLQkJY2FwY2FjaGVfYXR0ciA9IChzdHJ1Y3QgY2FwY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlICopYXR0cjsKLQotCQlpZiAoIXN0cmNtcChjYXBjYWNoZV9hdHRyLT5hdHRyLm5hbWUsICJ0aW1lb3V0X3NlY3MiKSkKKwl9IGVsc2UgaWYgKCFzdHJjbXAoa29iai0+bmFtZSwgQ0FQQ0FDSEVfS09CSl9JRCkpIHsKKwkJaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAidGltZW91dF9zZWNzIikpCiAJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQogCQkJCU9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfQ0FQQ0FDSEVfVElNRU9VVF9TRUNTOwogCi0JCWlmICghc3RyY21wKGNhcGNhY2hlX2F0dHItPmF0dHIubmFtZSwgImhhcmRfbGltaXQiKSkKKwkJaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAiaGFyZF9saW1pdCIpKQogCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID0KIAkJCQlPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX0NBUENBQ0hFX0hBUkRfTElNSVQ7CiAKLQkJaWYgKCFzdHJjbXAoY2FwY2FjaGVfYXR0ci0+YXR0ci5uYW1lLCAic29mdF9saW1pdCIpKQorCQlpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJzb2Z0X2xpbWl0IikpCiAJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQogCQkJCU9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfQ0FQQ0FDSEVfU09GVF9MSU1JVDsKIAotCQlpZiAoIXN0cmNtcChjYXBjYWNoZV9hdHRyLT5hdHRyLm5hbWUsICJyZWNsYWltX3BlcmNlbnRhZ2UiKSkKKwkJaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAicmVjbGFpbV9wZXJjZW50YWdlIikpCiAJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQogCQkJICBPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX0NBUENBQ0hFX1JFQ0xBSU1fUEVSQ0VOVEFHRTsKIAotCX0gZWxzZSBpZiAoIXN0cmNtcChrb2JqX2lkLCBDQ0FDSEVfS09CSl9JRCkpIHsKLQkJY2NhY2hlX2F0dHIgPSAoc3RydWN0IGNjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgKilhdHRyOwotCi0JCWlmICghc3RyY21wKGNjYWNoZV9hdHRyLT5hdHRyLm5hbWUsICJ0aW1lb3V0X3NlY3MiKSkKKwl9IGVsc2UgaWYgKCFzdHJjbXAoa29iai0+bmFtZSwgQ0NBQ0hFX0tPQkpfSUQpKSB7CisJCWlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgInRpbWVvdXRfc2VjcyIpKQogCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID0KIAkJCQlPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX0NDQUNIRV9USU1FT1VUX1NFQ1M7CiAKLQkJaWYgKCFzdHJjbXAoY2NhY2hlX2F0dHItPmF0dHIubmFtZSwgImhhcmRfbGltaXQiKSkKKwkJaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAiaGFyZF9saW1pdCIpKQogCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID0KIAkJCQlPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX0NDQUNIRV9IQVJEX0xJTUlUOwogCi0JCWlmICghc3RyY21wKGNjYWNoZV9hdHRyLT5hdHRyLm5hbWUsICJzb2Z0X2xpbWl0IikpCisJCWlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgInNvZnRfbGltaXQiKSkKIAkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CiAJCQkJT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9DQ0FDSEVfU09GVF9MSU1JVDsKIAotCQlpZiAoIXN0cmNtcChjY2FjaGVfYXR0ci0+YXR0ci5uYW1lLCAicmVjbGFpbV9wZXJjZW50YWdlIikpCisJCWlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgInJlY2xhaW1fcGVyY2VudGFnZSIpKQogCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID0KIAkJCSAgT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9DQ0FDSEVfUkVDTEFJTV9QRVJDRU5UQUdFOwogCi0JfSBlbHNlIGlmICghc3RyY21wKGtvYmpfaWQsIE5DQUNIRV9LT0JKX0lEKSkgewotCQluY2FjaGVfYXR0ciA9IChzdHJ1Y3QgbmNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSAqKWF0dHI7Ci0KLQkJaWYgKCFzdHJjbXAobmNhY2hlX2F0dHItPmF0dHIubmFtZSwgInRpbWVvdXRfbXNlY3MiKSkKKwl9IGVsc2UgaWYgKCFzdHJjbXAoa29iai0+bmFtZSwgTkNBQ0hFX0tPQkpfSUQpKSB7CisJCWlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgInRpbWVvdXRfbXNlY3MiKSkKIAkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CiAJCQkJT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9OQ0FDSEVfVElNRU9VVF9NU0VDUzsKIAotCQlpZiAoIXN0cmNtcChuY2FjaGVfYXR0ci0+YXR0ci5uYW1lLCAiaGFyZF9saW1pdCIpKQorCQlpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJoYXJkX2xpbWl0IikpCiAJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQogCQkJCU9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfTkNBQ0hFX0hBUkRfTElNSVQ7CiAKLQkJaWYgKCFzdHJjbXAobmNhY2hlX2F0dHItPmF0dHIubmFtZSwgInNvZnRfbGltaXQiKSkKKwkJaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAic29mdF9saW1pdCIpKQogCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID0KIAkJCQlPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX05DQUNIRV9TT0ZUX0xJTUlUOwogCi0JCWlmICghc3RyY21wKG5jYWNoZV9hdHRyLT5hdHRyLm5hbWUsICJyZWNsYWltX3BlcmNlbnRhZ2UiKSkKKwkJaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAicmVjbGFpbV9wZXJjZW50YWdlIikpCiAJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQogCQkJICBPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX05DQUNIRV9SRUNMQUlNX1BFUkNFTlRBR0U7CiAKLQl9IGVsc2UgaWYgKCFzdHJjbXAoa29ial9pZCwgUENfS09CSl9JRCkpIHsKLQkJcGNfYXR0ciA9IChzdHJ1Y3QgcGNfb3JhbmdlZnNfYXR0cmlidXRlICopYXR0cjsKLQotCQlpZiAoIXN0cmNtcChwY19hdHRyLT5hdHRyLm5hbWUsIEFDQUNIRV9LT0JKX0lEKSkKKwl9IGVsc2UgaWYgKCFzdHJjbXAoa29iai0+bmFtZSwgUENfS09CSl9JRCkpIHsKKwkJaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCBBQ0FDSEVfS09CSl9JRCkpCiAJCQluZXdfb3AtPnVwY2FsbC5yZXEucGVyZl9jb3VudC50eXBlID0KIAkJCQlPUkFOR0VGU19QRVJGX0NPVU5UX1JFUVVFU1RfQUNBQ0hFOwogCi0JCWlmICghc3RyY21wKHBjX2F0dHItPmF0dHIubmFtZSwgQ0FQQ0FDSEVfS09CSl9JRCkpCisJCWlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgQ0FQQ0FDSEVfS09CSl9JRCkpCiAJCQluZXdfb3AtPnVwY2FsbC5yZXEucGVyZl9jb3VudC50eXBlID0KIAkJCQlPUkFOR0VGU19QRVJGX0NPVU5UX1JFUVVFU1RfQ0FQQ0FDSEU7CiAKLQkJaWYgKCFzdHJjbXAocGNfYXR0ci0+YXR0ci5uYW1lLCBOQ0FDSEVfS09CSl9JRCkpCisJCWlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgTkNBQ0hFX0tPQkpfSUQpKQogCQkJbmV3X29wLT51cGNhbGwucmVxLnBlcmZfY291bnQudHlwZSA9CiAJCQkJT1JBTkdFRlNfUEVSRl9DT1VOVF9SRVFVRVNUX05DQUNIRTsKIAogCX0gZWxzZSB7CiAJCWdvc3NpcF9lcnIoInN5c2ZzX3NlcnZpY2Vfb3Bfc2hvdzogdW5rbm93biBrb2JqX2lkOiVzOlxuIiwKLQkJCSAgIGtvYmpfaWQpOworCQkJICAga29iai0+bmFtZSk7CiAJCXJjID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQogCiAKLQlpZiAoc3RyY21wKGtvYmpfaWQsIFBDX0tPQkpfSUQpKQorCWlmIChzdHJjbXAoa29iai0+bmFtZSwgUENfS09CSl9JRCkpCiAJCXNlcl9vcF90eXBlID0gIm9yYW5nZWZzX3BhcmFtIjsKIAllbHNlCiAJCXNlcl9vcF90eXBlID0gIm9yYW5nZWZzX3BlcmZfY291bnQiOwpAQCAtOTQ4LDExICs0NjIsMTggQEAKIAogb3V0OgogCWlmICghcmMpIHsKLQkJaWYgKHN0cmNtcChrb2JqX2lkLCBQQ19LT0JKX0lEKSkgewotCQkJcmMgPSBzY25wcmludGYoYnVmLAotCQkJCSAgICAgICBQQUdFX1NJWkUsCi0JCQkJICAgICAgICIlZFxuIiwKLQkJCQkgICAgICAgKGludCluZXdfb3AtPmRvd25jYWxsLnJlc3AucGFyYW0udmFsdWUpOworCQlpZiAoc3RyY21wKGtvYmotPm5hbWUsIFBDX0tPQkpfSUQpKSB7CisJCQlpZiAobmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID09CisJCQkgICAgT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9SRUFEQUhFQURfQ09VTlRfU0laRSkgeworCQkJCXJjID0gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWQgJWRcbiIsCisJCQkJICAgIChpbnQpbmV3X29wLT5kb3duY2FsbC5yZXNwLnBhcmFtLnUuCisJCQkJICAgIHZhbHVlMzJbMF0sCisJCQkJICAgIChpbnQpbmV3X29wLT5kb3duY2FsbC5yZXNwLnBhcmFtLnUuCisJCQkJICAgIHZhbHVlMzJbMV0pOworCQkJfSBlbHNlIHsKKwkJCQlyYyA9IHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLAorCQkJCSAgICAoaW50KW5ld19vcC0+ZG93bmNhbGwucmVzcC5wYXJhbS51LnZhbHVlNjQpOworCQkJfQogCQl9IGVsc2UgewogCQkJcmMgPSBzY25wcmludGYoCiAJCQkJYnVmLApAQCAtOTY4LDc3ICs0ODksNiBAQAogCiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNlcnZpY2Vfb3JhbmdlZnNfc2hvdyhzdHJ1Y3Qgb3JhbmdlZnNfb2JqICpvcmFuZ2Vmc19vYmosCi0JCQkJICAgICBzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlICphdHRyLAotCQkJCSAgICAgY2hhciAqYnVmKQotewotCWludCByYyA9IDA7Ci0KLQlyYyA9IHN5c2ZzX3NlcnZpY2Vfb3Bfc2hvdyhPUkFOR0VGU19LT0JKX0lELCBidWYsICh2b2lkICopYXR0cik7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci0Jc2VydmljZV9hY2FjaGVfc2hvdyhzdHJ1Y3QgYWNhY2hlX29yYW5nZWZzX29iaiAqYWNhY2hlX29yYW5nZWZzX29iaiwKLQkJCSAgICBzdHJ1Y3QgYWNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICBjaGFyICpidWYpCi17Ci0JaW50IHJjID0gMDsKLQotCXJjID0gc3lzZnNfc2VydmljZV9vcF9zaG93KEFDQUNIRV9LT0JKX0lELCBidWYsICh2b2lkICopYXR0cik7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNlcnZpY2VfY2FwY2FjaGVfc2hvdyhzdHJ1Y3QgY2FwY2FjaGVfb3JhbmdlZnNfb2JqCi0JCQkJCSpjYXBjYWNoZV9vcmFuZ2Vmc19vYmosCi0JCQkJICAgICBzdHJ1Y3QgY2FwY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlICphdHRyLAotCQkJCSAgICAgY2hhciAqYnVmKQotewotCWludCByYyA9IDA7Ci0KLQlyYyA9IHN5c2ZzX3NlcnZpY2Vfb3Bfc2hvdyhDQVBDQUNIRV9LT0JKX0lELCBidWYsICh2b2lkICopYXR0cik7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNlcnZpY2VfY2NhY2hlX3Nob3coc3RydWN0IGNjYWNoZV9vcmFuZ2Vmc19vYmoKLQkJCQkJKmNjYWNoZV9vcmFuZ2Vmc19vYmosCi0JCQkJICAgc3RydWN0IGNjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICAgY2hhciAqYnVmKQotewotCWludCByYyA9IDA7Ci0KLQlyYyA9IHN5c2ZzX3NlcnZpY2Vfb3Bfc2hvdyhDQ0FDSEVfS09CSl9JRCwgYnVmLCAodm9pZCAqKWF0dHIpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdAotCXNlcnZpY2VfbmNhY2hlX3Nob3coc3RydWN0IG5jYWNoZV9vcmFuZ2Vmc19vYmogKm5jYWNoZV9vcmFuZ2Vmc19vYmosCi0JCQkgICAgc3RydWN0IG5jYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgY2hhciAqYnVmKQotewotCWludCByYyA9IDA7Ci0KLQlyYyA9IHN5c2ZzX3NlcnZpY2Vfb3Bfc2hvdyhOQ0FDSEVfS09CSl9JRCwgYnVmLCAodm9pZCAqKWF0dHIpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdAotCXNlcnZpY2VfcGNfc2hvdyhzdHJ1Y3QgcGNfb3JhbmdlZnNfb2JqICpwY19vcmFuZ2Vmc19vYmosCi0JCQkgICAgc3RydWN0IHBjX29yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICBjaGFyICpidWYpCi17Ci0JaW50IHJjID0gMDsKLQotCXJjID0gc3lzZnNfc2VydmljZV9vcF9zaG93KFBDX0tPQkpfSUQsIGJ1ZiwgKHZvaWQgKilhdHRyKTsKLQotCXJldHVybiByYzsKLX0KLQogLyoKICAqIHBhc3MgYXR0cmlidXRlIHZhbHVlcyBiYWNrIHRvIHVzZXJzcGFjZSB3aXRoIGEgc2VydmljZSBvcGVyYXRpb24uCiAgKgpAQCAtMTA1MCwyMCArNTAwLDE2IEBACiAgKiBXZSB3YW50IHRvIHJldHVybiAxIGlmIHdlIHRoaW5rIGV2ZXJ5dGhpbmcgd2VudCBPSywgYW5kCiAgKiBFSU5WQUwgaWYgbm90LgogICovCi1zdGF0aWMgaW50IHN5c2ZzX3NlcnZpY2Vfb3Bfc3RvcmUoY2hhciAqa29ial9pZCwgY29uc3QgY2hhciAqYnVmLCB2b2lkICphdHRyKQorc3RhdGljIHNzaXplX3Qgc3lzZnNfc2VydmljZV9vcF9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKyAgICBzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3Qgb3JhbmdlZnNfa2VybmVsX29wX3MgKm5ld19vcCA9IE5VTEw7CiAJaW50IHZhbCA9IDA7CiAJaW50IHJjID0gMDsKLQlzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlICpvcmFuZ2Vmc19hdHRyOwotCXN0cnVjdCBhY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlICphY2FjaGVfYXR0cjsKLQlzdHJ1Y3QgY2FwY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlICpjYXBjYWNoZV9hdHRyOwotCXN0cnVjdCBjY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlICpjY2FjaGVfYXR0cjsKLQlzdHJ1Y3QgbmNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSAqbmNhY2hlX2F0dHI7CiAKIAlnb3NzaXBfZGVidWcoR09TU0lQX1NZU0ZTX0RFQlVHLAogCQkgICAgICJzeXNmc19zZXJ2aWNlX29wX3N0b3JlOiBpZDolczpcbiIsCi0JCSAgICAga29ial9pZCk7CisJCSAgICAga29iai0+bmFtZSk7CiAKIAluZXdfb3AgPSBvcF9hbGxvYyhPUkFOR0VGU19WRlNfT1BfUEFSQU0pOwogCWlmICghbmV3X29wKQpAQCAtMTA3OSwxNiArNTI1LDI5IEBACiAJfQogCiAJLyoKLQkgKiBUaGUgdmFsdWUgd2Ugd2FudCB0byBzZW5kIGJhY2sgdG8gdXNlcnNwYWNlIGlzIGluIGJ1Zi4KKwkgKiBUaGUgdmFsdWUgd2Ugd2FudCB0byBzZW5kIGJhY2sgdG8gdXNlcnNwYWNlIGlzIGluIGJ1ZiwgdW5sZXNzIHRoaXMKKwkgKiB0aGVyZSBhcmUgdHdvIHBhcmFtZXRlcnMsIHdoaWNoIGlzIHNwZWNpYWxseSBoYW5kbGVkIGJlbG93LgogCSAqLwotCXJjID0ga3N0cnRvaW50KGJ1ZiwgMCwgJnZhbCk7Ci0JaWYgKHJjKQotCQlnb3RvIG91dDsKKwlpZiAoc3RyY21wKGtvYmotPm5hbWUsIE9SQU5HRUZTX0tPQkpfSUQpIHx8CisJICAgIHN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJyZWFkYWhlYWRfY291bnRfc2l6ZSIpKSB7CisJCXJjID0ga3N0cnRvaW50KGJ1ZiwgMCwgJnZhbCk7CisJCWlmIChyYykKKwkJCWdvdG8gb3V0OworCX0KIAotCWlmICghc3RyY21wKGtvYmpfaWQsIE9SQU5HRUZTX0tPQkpfSUQpKSB7Ci0JCW9yYW5nZWZzX2F0dHIgPSAoc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSAqKWF0dHI7CisJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLnR5cGUgPSBPUkFOR0VGU19QQVJBTV9SRVFVRVNUX1NFVDsKIAotCQlpZiAoIXN0cmNtcChvcmFuZ2Vmc19hdHRyLT5hdHRyLm5hbWUsICJwZXJmX2hpc3Rvcnlfc2l6ZSIpKSB7CisJaWYgKCFzdHJjbXAoa29iai0+bmFtZSwgT1JBTkdFRlNfS09CSl9JRCkpIHsKKwkJLyogRHJvcCB1bnN1cHBvcnRlZCByZXF1ZXN0cyBmaXJzdC4gKi8KKwkJaWYgKCEob3JhbmdlZnNfZmVhdHVyZXMgJiBPUkFOR0VGU19GRUFUVVJFX1JFQURBSEVBRCkgJiYKKwkJICAgICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgInJlYWRhaGVhZF9jb3VudCIpIHx8CisJCSAgICAhc3RyY21wKGF0dHItPmF0dHIubmFtZSwgInJlYWRhaGVhZF9zaXplIikgfHwKKwkJICAgICFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAicmVhZGFoZWFkX2NvdW50X3NpemUiKSkpIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAicGVyZl9oaXN0b3J5X3NpemUiKSkgewogCQkJaWYgKHZhbCA+IDApIHsKIAkJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQogCQkJCSAgT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9QRVJGX0hJU1RPUllfU0laRTsKQEAgLTEwOTYsNyArNTU1LDcgQEAKIAkJCQlyYyA9IDA7CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChvcmFuZ2Vmc19hdHRyLT5hdHRyLm5hbWUsCisJCX0gZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsCiAJCQkJICAgInBlcmZfdGltZV9pbnRlcnZhbF9zZWNzIikpIHsKIAkJCWlmICh2YWwgPiAwKSB7CiAJCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID0KQEAgLTExMDUsNyArNTY0LDcgQEAKIAkJCQlyYyA9IDA7CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChvcmFuZ2Vmc19hdHRyLT5hdHRyLm5hbWUsCisJCX0gZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsCiAJCQkJICAgInBlcmZfY291bnRlcl9yZXNldCIpKSB7CiAJCQlpZiAoKHZhbCA9PSAwKSB8fCAodmFsID09IDEpKSB7CiAJCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID0KQEAgLTExMTQsMTIgKzU3Myw1NSBAQAogCQkJCXJjID0gMDsKIAkJCQlnb3RvIG91dDsKIAkJCX0KKwkJfSBlbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwKKwkJCQkgICAicmVhZGFoZWFkX2NvdW50IikpIHsKKwkJCWlmICgodmFsID49IDApKSB7CisJCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID0KKwkJCQlPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX1JFQURBSEVBRF9DT1VOVDsKKwkJCX0gZWxzZSB7CisJCQkJcmMgPSAwOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLAorCQkJCSAgICJyZWFkYWhlYWRfc2l6ZSIpKSB7CisJCQlpZiAoKHZhbCA+PSAwKSkgeworCQkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CisJCQkJT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9SRUFEQUhFQURfU0laRTsKKwkJCX0gZWxzZSB7CisJCQkJcmMgPSAwOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLAorCQkJCSAgICJyZWFkYWhlYWRfY291bnRfc2l6ZSIpKSB7CisJCQlpbnQgdmFsMSwgdmFsMjsKKwkJCXJjID0gc3NjYW5mKGJ1ZiwgIiVkICVkIiwgJnZhbDEsICZ2YWwyKTsKKwkJCWlmIChyYyA8IDIpIHsKKwkJCQlyYyA9IDA7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlpZiAoKHZhbDEgPj0gMCkgJiYgKHZhbDIgPj0gMCkpIHsKKwkJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQorCQkJCU9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfUkVBREFIRUFEX0NPVU5UX1NJWkU7CisJCQl9IGVsc2UgeworCQkJCXJjID0gMDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS51LnZhbHVlMzJbMF0gPSB2YWwxOworCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLnUudmFsdWUzMlsxXSA9IHZhbDI7CisJCQlnb3RvIHZhbHVlX3NldDsKKwkJfSBlbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwKKwkJCQkgICAicGVyZl9jb3VudGVyX3Jlc2V0IikpIHsKKwkJCWlmICgodmFsID4gMCkpIHsKKwkJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQorCQkJCU9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfUkVBREFIRUFEX0NPVU5UX1NJWkU7CisJCQl9IGVsc2UgeworCQkJCXJjID0gMDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KIAkJfQogCi0JfSBlbHNlIGlmICghc3RyY21wKGtvYmpfaWQsIEFDQUNIRV9LT0JKX0lEKSkgewotCQlhY2FjaGVfYXR0ciA9IChzdHJ1Y3QgYWNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSAqKWF0dHI7Ci0KLQkJaWYgKCFzdHJjbXAoYWNhY2hlX2F0dHItPmF0dHIubmFtZSwgImhhcmRfbGltaXQiKSkgeworCX0gZWxzZSBpZiAoIXN0cmNtcChrb2JqLT5uYW1lLCBBQ0FDSEVfS09CSl9JRCkpIHsKKwkJaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAiaGFyZF9saW1pdCIpKSB7CiAJCQlpZiAodmFsID4gLTEpIHsKIAkJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQogCQkJCSAgT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9BQ0FDSEVfSEFSRF9MSU1JVDsKQEAgLTExMjcsNyArNjI5LDcgQEAKIAkJCQlyYyA9IDA7CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChhY2FjaGVfYXR0ci0+YXR0ci5uYW1lLCAic29mdF9saW1pdCIpKSB7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJzb2Z0X2xpbWl0IikpIHsKIAkJCWlmICh2YWwgPiAtMSkgewogCQkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CiAJCQkJICBPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX0FDQUNIRV9TT0ZUX0xJTUlUOwpAQCAtMTEzNSw3ICs2MzcsNyBAQAogCQkJCXJjID0gMDsKIAkJCQlnb3RvIG91dDsKIAkJCX0KLQkJfSBlbHNlIGlmICghc3RyY21wKGFjYWNoZV9hdHRyLT5hdHRyLm5hbWUsCisJCX0gZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsCiAJCQkJICAgInJlY2xhaW1fcGVyY2VudGFnZSIpKSB7CiAJCQlpZiAoKHZhbCA+IC0xKSAmJiAodmFsIDwgMTAxKSkgewogCQkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CkBAIC0xMTQ0LDcgKzY0Niw3IEBACiAJCQkJcmMgPSAwOwogCQkJCWdvdG8gb3V0OwogCQkJfQotCQl9IGVsc2UgaWYgKCFzdHJjbXAoYWNhY2hlX2F0dHItPmF0dHIubmFtZSwgInRpbWVvdXRfbXNlY3MiKSkgeworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAidGltZW91dF9tc2VjcyIpKSB7CiAJCQlpZiAodmFsID4gLTEpIHsKIAkJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQogCQkJCSAgT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9BQ0FDSEVfVElNRU9VVF9NU0VDUzsKQEAgLTExNTQsMTAgKzY1Niw4IEBACiAJCQl9CiAJCX0KIAotCX0gZWxzZSBpZiAoIXN0cmNtcChrb2JqX2lkLCBDQVBDQUNIRV9LT0JKX0lEKSkgewotCQljYXBjYWNoZV9hdHRyID0gKHN0cnVjdCBjYXBjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgKilhdHRyOwotCi0JCWlmICghc3RyY21wKGNhcGNhY2hlX2F0dHItPmF0dHIubmFtZSwgImhhcmRfbGltaXQiKSkgeworCX0gZWxzZSBpZiAoIXN0cmNtcChrb2JqLT5uYW1lLCBDQVBDQUNIRV9LT0JKX0lEKSkgeworCQlpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJoYXJkX2xpbWl0IikpIHsKIAkJCWlmICh2YWwgPiAtMSkgewogCQkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CiAJCQkJICBPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX0NBUENBQ0hFX0hBUkRfTElNSVQ7CkBAIC0xMTY1LDcgKzY2NSw3IEBACiAJCQkJcmMgPSAwOwogCQkJCWdvdG8gb3V0OwogCQkJfQotCQl9IGVsc2UgaWYgKCFzdHJjbXAoY2FwY2FjaGVfYXR0ci0+YXR0ci5uYW1lLCAic29mdF9saW1pdCIpKSB7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJzb2Z0X2xpbWl0IikpIHsKIAkJCWlmICh2YWwgPiAtMSkgewogCQkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CiAJCQkJICBPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX0NBUENBQ0hFX1NPRlRfTElNSVQ7CkBAIC0xMTczLDcgKzY3Myw3IEBACiAJCQkJcmMgPSAwOwogCQkJCWdvdG8gb3V0OwogCQkJfQotCQl9IGVsc2UgaWYgKCFzdHJjbXAoY2FwY2FjaGVfYXR0ci0+YXR0ci5uYW1lLAorCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLAogCQkJCSAgICJyZWNsYWltX3BlcmNlbnRhZ2UiKSkgewogCQkJaWYgKCh2YWwgPiAtMSkgJiYgKHZhbCA8IDEwMSkpIHsKIAkJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQpAQCAtMTE4Miw3ICs2ODIsNyBAQAogCQkJCXJjID0gMDsKIAkJCQlnb3RvIG91dDsKIAkJCX0KLQkJfSBlbHNlIGlmICghc3RyY21wKGNhcGNhY2hlX2F0dHItPmF0dHIubmFtZSwgInRpbWVvdXRfc2VjcyIpKSB7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJ0aW1lb3V0X3NlY3MiKSkgewogCQkJaWYgKHZhbCA+IC0xKSB7CiAJCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID0KIAkJCQkgIE9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfQ0FQQ0FDSEVfVElNRU9VVF9TRUNTOwpAQCAtMTE5MiwxMCArNjkyLDggQEAKIAkJCX0KIAkJfQogCi0JfSBlbHNlIGlmICghc3RyY21wKGtvYmpfaWQsIENDQUNIRV9LT0JKX0lEKSkgewotCQljY2FjaGVfYXR0ciA9IChzdHJ1Y3QgY2NhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSAqKWF0dHI7Ci0KLQkJaWYgKCFzdHJjbXAoY2NhY2hlX2F0dHItPmF0dHIubmFtZSwgImhhcmRfbGltaXQiKSkgeworCX0gZWxzZSBpZiAoIXN0cmNtcChrb2JqLT5uYW1lLCBDQ0FDSEVfS09CSl9JRCkpIHsKKwkJaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAiaGFyZF9saW1pdCIpKSB7CiAJCQlpZiAodmFsID4gLTEpIHsKIAkJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQogCQkJCSAgT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9DQ0FDSEVfSEFSRF9MSU1JVDsKQEAgLTEyMDMsNyArNzAxLDcgQEAKIAkJCQlyYyA9IDA7CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChjY2FjaGVfYXR0ci0+YXR0ci5uYW1lLCAic29mdF9saW1pdCIpKSB7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJzb2Z0X2xpbWl0IikpIHsKIAkJCWlmICh2YWwgPiAtMSkgewogCQkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CiAJCQkJICBPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX0NDQUNIRV9TT0ZUX0xJTUlUOwpAQCAtMTIxMSw3ICs3MDksNyBAQAogCQkJCXJjID0gMDsKIAkJCQlnb3RvIG91dDsKIAkJCX0KLQkJfSBlbHNlIGlmICghc3RyY21wKGNjYWNoZV9hdHRyLT5hdHRyLm5hbWUsCisJCX0gZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsCiAJCQkJICAgInJlY2xhaW1fcGVyY2VudGFnZSIpKSB7CiAJCQlpZiAoKHZhbCA+IC0xKSAmJiAodmFsIDwgMTAxKSkgewogCQkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CkBAIC0xMjIwLDcgKzcxOCw3IEBACiAJCQkJcmMgPSAwOwogCQkJCWdvdG8gb3V0OwogCQkJfQotCQl9IGVsc2UgaWYgKCFzdHJjbXAoY2NhY2hlX2F0dHItPmF0dHIubmFtZSwgInRpbWVvdXRfc2VjcyIpKSB7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJ0aW1lb3V0X3NlY3MiKSkgewogCQkJaWYgKHZhbCA+IC0xKSB7CiAJCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID0KIAkJCQkgIE9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfQ0NBQ0hFX1RJTUVPVVRfU0VDUzsKQEAgLTEyMzAsMTAgKzcyOCw4IEBACiAJCQl9CiAJCX0KIAotCX0gZWxzZSBpZiAoIXN0cmNtcChrb2JqX2lkLCBOQ0FDSEVfS09CSl9JRCkpIHsKLQkJbmNhY2hlX2F0dHIgPSAoc3RydWN0IG5jYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgKilhdHRyOwotCi0JCWlmICghc3RyY21wKG5jYWNoZV9hdHRyLT5hdHRyLm5hbWUsICJoYXJkX2xpbWl0IikpIHsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoa29iai0+bmFtZSwgTkNBQ0hFX0tPQkpfSUQpKSB7CisJCWlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgImhhcmRfbGltaXQiKSkgewogCQkJaWYgKHZhbCA+IC0xKSB7CiAJCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID0KIAkJCQkgIE9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfTkNBQ0hFX0hBUkRfTElNSVQ7CkBAIC0xMjQxLDcgKzczNyw3IEBACiAJCQkJcmMgPSAwOwogCQkJCWdvdG8gb3V0OwogCQkJfQotCQl9IGVsc2UgaWYgKCFzdHJjbXAobmNhY2hlX2F0dHItPmF0dHIubmFtZSwgInNvZnRfbGltaXQiKSkgeworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAic29mdF9saW1pdCIpKSB7CiAJCQlpZiAodmFsID4gLTEpIHsKIAkJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQogCQkJCSAgT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9OQ0FDSEVfU09GVF9MSU1JVDsKQEAgLTEyNDksNyArNzQ1LDcgQEAKIAkJCQlyYyA9IDA7CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChuY2FjaGVfYXR0ci0+YXR0ci5uYW1lLAorCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLAogCQkJCSAgICJyZWNsYWltX3BlcmNlbnRhZ2UiKSkgewogCQkJaWYgKCh2YWwgPiAtMSkgJiYgKHZhbCA8IDEwMSkpIHsKIAkJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQpAQCAtMTI1OCw3ICs3NTQsNyBAQAogCQkJCXJjID0gMDsKIAkJCQlnb3RvIG91dDsKIAkJCX0KLQkJfSBlbHNlIGlmICghc3RyY21wKG5jYWNoZV9hdHRyLT5hdHRyLm5hbWUsICJ0aW1lb3V0X21zZWNzIikpIHsKKwkJfSBlbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgInRpbWVvdXRfbXNlY3MiKSkgewogCQkJaWYgKHZhbCA+IC0xKSB7CiAJCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID0KIAkJCQkgIE9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfTkNBQ0hFX1RJTUVPVVRfTVNFQ1M7CkBAIC0xMjcwLDE0ICs3NjYsMTMgQEAKIAogCX0gZWxzZSB7CiAJCWdvc3NpcF9lcnIoInN5c2ZzX3NlcnZpY2Vfb3Bfc3RvcmU6IHVua25vd24ga29ial9pZDolczpcbiIsCi0JCQkgICBrb2JqX2lkKTsKKwkJCSAgIGtvYmotPm5hbWUpOwogCQlyYyA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KIAotCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS50eXBlID0gT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9TRVQ7Ci0KLQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0udmFsdWUgPSB2YWw7CisJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLnUudmFsdWU2NCA9IHZhbDsKK3ZhbHVlX3NldDoKIAogCS8qCiAJICogVGhlIHNlcnZpY2Vfb3BlcmF0aW9uIHdpbGwgcmV0dXJuIGEgZXJybm8gcmV0dXJuIGNvZGUgb24KQEAgLTEyOTAsNyArNzg1LDcgQEAKIAkJCXJjKTsKIAkJcmMgPSAwOwogCX0gZWxzZSB7Ci0JCXJjID0gMTsKKwkJcmMgPSBjb3VudDsKIAl9CiAKIG91dDoKQEAgLTEzMDIsMTI3ICs3OTcsNTYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBzc2l6ZV90Ci0Jc2VydmljZV9vcmFuZ2Vmc19zdG9yZShzdHJ1Y3Qgb3JhbmdlZnNfb2JqICpvcmFuZ2Vmc19vYmosCi0JCQkgICAgICAgc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgICBjb25zdCBjaGFyICpidWYsCi0JCQkgICAgICAgc2l6ZV90IGNvdW50KQotewotCWludCByYyA9IDA7Ci0KLQlyYyA9IHN5c2ZzX3NlcnZpY2Vfb3Bfc3RvcmUoT1JBTkdFRlNfS09CSl9JRCwgYnVmLCAodm9pZCAqKSBhdHRyKTsKLQotCS8qIHJjIHNob3VsZCBoYXZlIGFuIGVycm5vIHZhbHVlIGlmIHRoZSBzZXJ2aWNlX29wIHdlbnQgYmFkLiAqLwotCWlmIChyYyA9PSAxKQotCQlyYyA9IGNvdW50OwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdAotCXNlcnZpY2VfYWNhY2hlX3N0b3JlKHN0cnVjdCBhY2FjaGVfb3JhbmdlZnNfb2JqICphY2FjaGVfb3JhbmdlZnNfb2JqLAotCQkJICAgICBzdHJ1Y3QgYWNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgY29uc3QgY2hhciAqYnVmLAotCQkJICAgICBzaXplX3QgY291bnQpCi17Ci0JaW50IHJjID0gMDsKLQotCXJjID0gc3lzZnNfc2VydmljZV9vcF9zdG9yZShBQ0FDSEVfS09CSl9JRCwgYnVmLCAodm9pZCAqKSBhdHRyKTsKLQotCS8qIHJjIHNob3VsZCBoYXZlIGFuIGVycm5vIHZhbHVlIGlmIHRoZSBzZXJ2aWNlX29wIHdlbnQgYmFkLiAqLwotCWlmIChyYyA9PSAxKQotCQlyYyA9IGNvdW50OwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdAotCXNlcnZpY2VfY2FwY2FjaGVfc3RvcmUoc3RydWN0IGNhcGNhY2hlX29yYW5nZWZzX29iagotCQkJCSpjYXBjYWNoZV9vcmFuZ2Vmc19vYmosCi0JCQkgICAgICAgc3RydWN0IGNhcGNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgICBjb25zdCBjaGFyICpidWYsCi0JCQkgICAgICAgc2l6ZV90IGNvdW50KQotewotCWludCByYyA9IDA7Ci0KLQlyYyA9IHN5c2ZzX3NlcnZpY2Vfb3Bfc3RvcmUoQ0FQQ0FDSEVfS09CSl9JRCwgYnVmLCAodm9pZCAqKSBhdHRyKTsKLQotCS8qIHJjIHNob3VsZCBoYXZlIGFuIGVycm5vIHZhbHVlIGlmIHRoZSBzZXJ2aWNlX29wIHdlbnQgYmFkLiAqLwotCWlmIChyYyA9PSAxKQotCQlyYyA9IGNvdW50OwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBzZXJ2aWNlX2NjYWNoZV9zdG9yZShzdHJ1Y3QgY2NhY2hlX29yYW5nZWZzX29iagotCQkJCQkqY2NhY2hlX29yYW5nZWZzX29iaiwKLQkJCQkgICAgc3RydWN0IGNjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICAgIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCQkgICAgc2l6ZV90IGNvdW50KQotewotCWludCByYyA9IDA7Ci0KLQlyYyA9IHN5c2ZzX3NlcnZpY2Vfb3Bfc3RvcmUoQ0NBQ0hFX0tPQkpfSUQsIGJ1ZiwgKHZvaWQgKikgYXR0cik7Ci0KLQkvKiByYyBzaG91bGQgaGF2ZSBhbiBlcnJubyB2YWx1ZSBpZiB0aGUgc2VydmljZV9vcCB3ZW50IGJhZC4gKi8KLQlpZiAocmMgPT0gMSkKLQkJcmMgPSBjb3VudDsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3QKLQlzZXJ2aWNlX25jYWNoZV9zdG9yZShzdHJ1Y3QgbmNhY2hlX29yYW5nZWZzX29iaiAqbmNhY2hlX29yYW5nZWZzX29iaiwKLQkJCSAgICAgc3RydWN0IG5jYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCSAgICAgc2l6ZV90IGNvdW50KQotewotCWludCByYyA9IDA7Ci0KLQlyYyA9IHN5c2ZzX3NlcnZpY2Vfb3Bfc3RvcmUoTkNBQ0hFX0tPQkpfSUQsIGJ1ZiwgKHZvaWQgKikgYXR0cik7Ci0KLQkvKiByYyBzaG91bGQgaGF2ZSBhbiBlcnJubyB2YWx1ZSBpZiB0aGUgc2VydmljZV9vcCB3ZW50IGJhZC4gKi8KLQlpZiAocmMgPT0gMSkKLQkJcmMgPSBjb3VudDsKLQotCXJldHVybiByYzsKLX0KLQogc3RhdGljIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgb3BfdGltZW91dF9zZWNzX2F0dHJpYnV0ZSA9Ci0JX19BVFRSKG9wX3RpbWVvdXRfc2VjcywgMDY2NCwgaW50X29yYW5nZWZzX3Nob3csIGludF9zdG9yZSk7CisJX19BVFRSKG9wX3RpbWVvdXRfc2VjcywgMDY2NCwgc3lzZnNfaW50X3Nob3csIHN5c2ZzX2ludF9zdG9yZSk7CiAKIHN0YXRpYyBzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlIHNsb3RfdGltZW91dF9zZWNzX2F0dHJpYnV0ZSA9Ci0JX19BVFRSKHNsb3RfdGltZW91dF9zZWNzLCAwNjY0LCBpbnRfb3JhbmdlZnNfc2hvdywgaW50X3N0b3JlKTsKKwlfX0FUVFIoc2xvdF90aW1lb3V0X3NlY3MsIDA2NjQsIHN5c2ZzX2ludF9zaG93LCBzeXNmc19pbnRfc3RvcmUpOwogCiBzdGF0aWMgc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSBkY2FjaGVfdGltZW91dF9tc2Vjc19hdHRyaWJ1dGUgPQotCV9fQVRUUihkY2FjaGVfdGltZW91dF9tc2VjcywgMDY2NCwgaW50X29yYW5nZWZzX3Nob3csIGludF9zdG9yZSk7CisJX19BVFRSKGRjYWNoZV90aW1lb3V0X21zZWNzLCAwNjY0LCBzeXNmc19pbnRfc2hvdywgc3lzZnNfaW50X3N0b3JlKTsKIAogc3RhdGljIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgZ2V0YXR0cl90aW1lb3V0X21zZWNzX2F0dHJpYnV0ZSA9Ci0JX19BVFRSKGdldGF0dHJfdGltZW91dF9tc2VjcywgMDY2NCwgaW50X29yYW5nZWZzX3Nob3csIGludF9zdG9yZSk7CisJX19BVFRSKGdldGF0dHJfdGltZW91dF9tc2VjcywgMDY2NCwgc3lzZnNfaW50X3Nob3csIHN5c2ZzX2ludF9zdG9yZSk7CisKK3N0YXRpYyBzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlIHJlYWRhaGVhZF9jb3VudF9hdHRyaWJ1dGUgPQorCV9fQVRUUihyZWFkYWhlYWRfY291bnQsIDA2NjQsIHN5c2ZzX3NlcnZpY2Vfb3Bfc2hvdywKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zdG9yZSk7CisKK3N0YXRpYyBzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlIHJlYWRhaGVhZF9zaXplX2F0dHJpYnV0ZSA9CisJX19BVFRSKHJlYWRhaGVhZF9zaXplLCAwNjY0LCBzeXNmc19zZXJ2aWNlX29wX3Nob3csCisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc3RvcmUpOworCitzdGF0aWMgc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSByZWFkYWhlYWRfY291bnRfc2l6ZV9hdHRyaWJ1dGUgPQorCV9fQVRUUihyZWFkYWhlYWRfY291bnRfc2l6ZSwgMDY2NCwgc3lzZnNfc2VydmljZV9vcF9zaG93LAorCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3N0b3JlKTsKIAogc3RhdGljIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgcGVyZl9jb3VudGVyX3Jlc2V0X2F0dHJpYnV0ZSA9CiAJX19BVFRSKHBlcmZfY291bnRlcl9yZXNldCwKIAkgICAgICAgMDY2NCwKLQkgICAgICAgc2VydmljZV9vcmFuZ2Vmc19zaG93LAotCSAgICAgICBzZXJ2aWNlX29yYW5nZWZzX3N0b3JlKTsKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zaG93LAorCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3N0b3JlKTsKIAogc3RhdGljIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgcGVyZl9oaXN0b3J5X3NpemVfYXR0cmlidXRlID0KIAlfX0FUVFIocGVyZl9oaXN0b3J5X3NpemUsCiAJICAgICAgIDA2NjQsCi0JICAgICAgIHNlcnZpY2Vfb3JhbmdlZnNfc2hvdywKLQkgICAgICAgc2VydmljZV9vcmFuZ2Vmc19zdG9yZSk7CisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc2hvdywKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zdG9yZSk7CiAKIHN0YXRpYyBzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlIHBlcmZfdGltZV9pbnRlcnZhbF9zZWNzX2F0dHJpYnV0ZSA9CiAJX19BVFRSKHBlcmZfdGltZV9pbnRlcnZhbF9zZWNzLAogCSAgICAgICAwNjY0LAotCSAgICAgICBzZXJ2aWNlX29yYW5nZWZzX3Nob3csCi0JICAgICAgIHNlcnZpY2Vfb3JhbmdlZnNfc3RvcmUpOworCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3Nob3csCisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc3RvcmUpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqb3JhbmdlZnNfZGVmYXVsdF9hdHRyc1tdID0gewogCSZvcF90aW1lb3V0X3NlY3NfYXR0cmlidXRlLmF0dHIsCiAJJnNsb3RfdGltZW91dF9zZWNzX2F0dHJpYnV0ZS5hdHRyLAogCSZkY2FjaGVfdGltZW91dF9tc2Vjc19hdHRyaWJ1dGUuYXR0ciwKIAkmZ2V0YXR0cl90aW1lb3V0X21zZWNzX2F0dHJpYnV0ZS5hdHRyLAorCSZyZWFkYWhlYWRfY291bnRfYXR0cmlidXRlLmF0dHIsCisJJnJlYWRhaGVhZF9zaXplX2F0dHJpYnV0ZS5hdHRyLAorCSZyZWFkYWhlYWRfY291bnRfc2l6ZV9hdHRyaWJ1dGUuYXR0ciwKIAkmcGVyZl9jb3VudGVyX3Jlc2V0X2F0dHJpYnV0ZS5hdHRyLAogCSZwZXJmX2hpc3Rvcnlfc2l6ZV9hdHRyaWJ1dGUuYXR0ciwKIAkmcGVyZl90aW1lX2ludGVydmFsX3NlY3NfYXR0cmlidXRlLmF0dHIsCkBAIC0xNDMxLDMzICs4NTUsMzIgQEAKIAogc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgb3JhbmdlZnNfa3R5cGUgPSB7CiAJLnN5c2ZzX29wcyA9ICZvcmFuZ2Vmc19zeXNmc19vcHMsCi0JLnJlbGVhc2UgPSBvcmFuZ2Vmc19yZWxlYXNlLAogCS5kZWZhdWx0X2F0dHJzID0gb3JhbmdlZnNfZGVmYXVsdF9hdHRycywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYWNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSBhY2FjaGVfaGFyZF9saW1pdF9hdHRyaWJ1dGUgPQorc3RhdGljIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgYWNhY2hlX2hhcmRfbGltaXRfYXR0cmlidXRlID0KIAlfX0FUVFIoaGFyZF9saW1pdCwKIAkgICAgICAgMDY2NCwKLQkgICAgICAgc2VydmljZV9hY2FjaGVfc2hvdywKLQkgICAgICAgc2VydmljZV9hY2FjaGVfc3RvcmUpOworCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3Nob3csCisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc3RvcmUpOwogCi1zdGF0aWMgc3RydWN0IGFjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgYWNhY2hlX3JlY2xhaW1fcGVyY2VudF9hdHRyaWJ1dGUgPQorc3RhdGljIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgYWNhY2hlX3JlY2xhaW1fcGVyY2VudF9hdHRyaWJ1dGUgPQogCV9fQVRUUihyZWNsYWltX3BlcmNlbnRhZ2UsCiAJICAgICAgIDA2NjQsCi0JICAgICAgIHNlcnZpY2VfYWNhY2hlX3Nob3csCi0JICAgICAgIHNlcnZpY2VfYWNhY2hlX3N0b3JlKTsKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zaG93LAorCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3N0b3JlKTsKIAotc3RhdGljIHN0cnVjdCBhY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlIGFjYWNoZV9zb2Z0X2xpbWl0X2F0dHJpYnV0ZSA9CitzdGF0aWMgc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSBhY2FjaGVfc29mdF9saW1pdF9hdHRyaWJ1dGUgPQogCV9fQVRUUihzb2Z0X2xpbWl0LAogCSAgICAgICAwNjY0LAotCSAgICAgICBzZXJ2aWNlX2FjYWNoZV9zaG93LAotCSAgICAgICBzZXJ2aWNlX2FjYWNoZV9zdG9yZSk7CisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc2hvdywKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zdG9yZSk7CiAKLXN0YXRpYyBzdHJ1Y3QgYWNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSBhY2FjaGVfdGltZW91dF9tc2Vjc19hdHRyaWJ1dGUgPQorc3RhdGljIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgYWNhY2hlX3RpbWVvdXRfbXNlY3NfYXR0cmlidXRlID0KIAlfX0FUVFIodGltZW91dF9tc2VjcywKIAkgICAgICAgMDY2NCwKLQkgICAgICAgc2VydmljZV9hY2FjaGVfc2hvdywKLQkgICAgICAgc2VydmljZV9hY2FjaGVfc3RvcmUpOworCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3Nob3csCisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc3RvcmUpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWNhY2hlX29yYW5nZWZzX2RlZmF1bHRfYXR0cnNbXSA9IHsKIAkmYWNhY2hlX2hhcmRfbGltaXRfYXR0cmlidXRlLmF0dHIsCkBAIC0xNDY4LDM0ICs4OTEsMzMgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGFjYWNoZV9vcmFuZ2Vmc19rdHlwZSA9IHsKLQkuc3lzZnNfb3BzID0gJmFjYWNoZV9vcmFuZ2Vmc19zeXNmc19vcHMsCi0JLnJlbGVhc2UgPSBhY2FjaGVfb3JhbmdlZnNfcmVsZWFzZSwKKwkuc3lzZnNfb3BzID0gJm9yYW5nZWZzX3N5c2ZzX29wcywKIAkuZGVmYXVsdF9hdHRycyA9IGFjYWNoZV9vcmFuZ2Vmc19kZWZhdWx0X2F0dHJzLAogfTsKIAotc3RhdGljIHN0cnVjdCBjYXBjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgY2FwY2FjaGVfaGFyZF9saW1pdF9hdHRyaWJ1dGUgPQorc3RhdGljIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgY2FwY2FjaGVfaGFyZF9saW1pdF9hdHRyaWJ1dGUgPQogCV9fQVRUUihoYXJkX2xpbWl0LAogCSAgICAgICAwNjY0LAotCSAgICAgICBzZXJ2aWNlX2NhcGNhY2hlX3Nob3csCi0JICAgICAgIHNlcnZpY2VfY2FwY2FjaGVfc3RvcmUpOworCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3Nob3csCisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc3RvcmUpOwogCi1zdGF0aWMgc3RydWN0IGNhcGNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSBjYXBjYWNoZV9yZWNsYWltX3BlcmNlbnRfYXR0cmlidXRlID0KK3N0YXRpYyBzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlIGNhcGNhY2hlX3JlY2xhaW1fcGVyY2VudF9hdHRyaWJ1dGUgPQogCV9fQVRUUihyZWNsYWltX3BlcmNlbnRhZ2UsCiAJICAgICAgIDA2NjQsCi0JICAgICAgIHNlcnZpY2VfY2FwY2FjaGVfc2hvdywKLQkgICAgICAgc2VydmljZV9jYXBjYWNoZV9zdG9yZSk7CisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc2hvdywKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zdG9yZSk7CiAKLXN0YXRpYyBzdHJ1Y3QgY2FwY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlIGNhcGNhY2hlX3NvZnRfbGltaXRfYXR0cmlidXRlID0KK3N0YXRpYyBzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlIGNhcGNhY2hlX3NvZnRfbGltaXRfYXR0cmlidXRlID0KIAlfX0FUVFIoc29mdF9saW1pdCwKIAkgICAgICAgMDY2NCwKLQkgICAgICAgc2VydmljZV9jYXBjYWNoZV9zaG93LAotCSAgICAgICBzZXJ2aWNlX2NhcGNhY2hlX3N0b3JlKTsKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zaG93LAorCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3N0b3JlKTsKIAotc3RhdGljIHN0cnVjdCBjYXBjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgY2FwY2FjaGVfdGltZW91dF9zZWNzX2F0dHJpYnV0ZSA9CitzdGF0aWMgc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSBjYXBjYWNoZV90aW1lb3V0X3NlY3NfYXR0cmlidXRlID0KIAlfX0FUVFIodGltZW91dF9zZWNzLAogCSAgICAgICAwNjY0LAotCSAgICAgICBzZXJ2aWNlX2NhcGNhY2hlX3Nob3csCi0JICAgICAgIHNlcnZpY2VfY2FwY2FjaGVfc3RvcmUpOworCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3Nob3csCisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc3RvcmUpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY2FwY2FjaGVfb3JhbmdlZnNfZGVmYXVsdF9hdHRyc1tdID0gewogCSZjYXBjYWNoZV9oYXJkX2xpbWl0X2F0dHJpYnV0ZS5hdHRyLApAQCAtMTUwNiwzNCArOTI4LDMzIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBjYXBjYWNoZV9vcmFuZ2Vmc19rdHlwZSA9IHsKLQkuc3lzZnNfb3BzID0gJmNhcGNhY2hlX29yYW5nZWZzX3N5c2ZzX29wcywKLQkucmVsZWFzZSA9IGNhcGNhY2hlX29yYW5nZWZzX3JlbGVhc2UsCisJLnN5c2ZzX29wcyA9ICZvcmFuZ2Vmc19zeXNmc19vcHMsCiAJLmRlZmF1bHRfYXR0cnMgPSBjYXBjYWNoZV9vcmFuZ2Vmc19kZWZhdWx0X2F0dHJzLAogfTsKIAotc3RhdGljIHN0cnVjdCBjY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlIGNjYWNoZV9oYXJkX2xpbWl0X2F0dHJpYnV0ZSA9CitzdGF0aWMgc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSBjY2FjaGVfaGFyZF9saW1pdF9hdHRyaWJ1dGUgPQogCV9fQVRUUihoYXJkX2xpbWl0LAogCSAgICAgICAwNjY0LAotCSAgICAgICBzZXJ2aWNlX2NjYWNoZV9zaG93LAotCSAgICAgICBzZXJ2aWNlX2NjYWNoZV9zdG9yZSk7CisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc2hvdywKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zdG9yZSk7CiAKLXN0YXRpYyBzdHJ1Y3QgY2NhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSBjY2FjaGVfcmVjbGFpbV9wZXJjZW50X2F0dHJpYnV0ZSA9CitzdGF0aWMgc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSBjY2FjaGVfcmVjbGFpbV9wZXJjZW50X2F0dHJpYnV0ZSA9CiAJX19BVFRSKHJlY2xhaW1fcGVyY2VudGFnZSwKIAkgICAgICAgMDY2NCwKLQkgICAgICAgc2VydmljZV9jY2FjaGVfc2hvdywKLQkgICAgICAgc2VydmljZV9jY2FjaGVfc3RvcmUpOworCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3Nob3csCisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc3RvcmUpOwogCi1zdGF0aWMgc3RydWN0IGNjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgY2NhY2hlX3NvZnRfbGltaXRfYXR0cmlidXRlID0KK3N0YXRpYyBzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlIGNjYWNoZV9zb2Z0X2xpbWl0X2F0dHJpYnV0ZSA9CiAJX19BVFRSKHNvZnRfbGltaXQsCiAJICAgICAgIDA2NjQsCi0JICAgICAgIHNlcnZpY2VfY2NhY2hlX3Nob3csCi0JICAgICAgIHNlcnZpY2VfY2NhY2hlX3N0b3JlKTsKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zaG93LAorCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3N0b3JlKTsKIAotc3RhdGljIHN0cnVjdCBjY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlIGNjYWNoZV90aW1lb3V0X3NlY3NfYXR0cmlidXRlID0KK3N0YXRpYyBzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlIGNjYWNoZV90aW1lb3V0X3NlY3NfYXR0cmlidXRlID0KIAlfX0FUVFIodGltZW91dF9zZWNzLAogCSAgICAgICAwNjY0LAotCSAgICAgICBzZXJ2aWNlX2NjYWNoZV9zaG93LAotCSAgICAgICBzZXJ2aWNlX2NjYWNoZV9zdG9yZSk7CisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc2hvdywKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zdG9yZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpjY2FjaGVfb3JhbmdlZnNfZGVmYXVsdF9hdHRyc1tdID0gewogCSZjY2FjaGVfaGFyZF9saW1pdF9hdHRyaWJ1dGUuYXR0ciwKQEAgLTE1NDQsMzQgKzk2NSwzMyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgY2NhY2hlX29yYW5nZWZzX2t0eXBlID0gewotCS5zeXNmc19vcHMgPSAmY2NhY2hlX29yYW5nZWZzX3N5c2ZzX29wcywKLQkucmVsZWFzZSA9IGNjYWNoZV9vcmFuZ2Vmc19yZWxlYXNlLAorCS5zeXNmc19vcHMgPSAmb3JhbmdlZnNfc3lzZnNfb3BzLAogCS5kZWZhdWx0X2F0dHJzID0gY2NhY2hlX29yYW5nZWZzX2RlZmF1bHRfYXR0cnMsCiB9OwogCi1zdGF0aWMgc3RydWN0IG5jYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgbmNhY2hlX2hhcmRfbGltaXRfYXR0cmlidXRlID0KK3N0YXRpYyBzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlIG5jYWNoZV9oYXJkX2xpbWl0X2F0dHJpYnV0ZSA9CiAJX19BVFRSKGhhcmRfbGltaXQsCiAJICAgICAgIDA2NjQsCi0JICAgICAgIHNlcnZpY2VfbmNhY2hlX3Nob3csCi0JICAgICAgIHNlcnZpY2VfbmNhY2hlX3N0b3JlKTsKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zaG93LAorCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3N0b3JlKTsKIAotc3RhdGljIHN0cnVjdCBuY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlIG5jYWNoZV9yZWNsYWltX3BlcmNlbnRfYXR0cmlidXRlID0KK3N0YXRpYyBzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlIG5jYWNoZV9yZWNsYWltX3BlcmNlbnRfYXR0cmlidXRlID0KIAlfX0FUVFIocmVjbGFpbV9wZXJjZW50YWdlLAogCSAgICAgICAwNjY0LAotCSAgICAgICBzZXJ2aWNlX25jYWNoZV9zaG93LAotCSAgICAgICBzZXJ2aWNlX25jYWNoZV9zdG9yZSk7CisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc2hvdywKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zdG9yZSk7CiAKLXN0YXRpYyBzdHJ1Y3QgbmNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSBuY2FjaGVfc29mdF9saW1pdF9hdHRyaWJ1dGUgPQorc3RhdGljIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgbmNhY2hlX3NvZnRfbGltaXRfYXR0cmlidXRlID0KIAlfX0FUVFIoc29mdF9saW1pdCwKIAkgICAgICAgMDY2NCwKLQkgICAgICAgc2VydmljZV9uY2FjaGVfc2hvdywKLQkgICAgICAgc2VydmljZV9uY2FjaGVfc3RvcmUpOworCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3Nob3csCisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc3RvcmUpOwogCi1zdGF0aWMgc3RydWN0IG5jYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgbmNhY2hlX3RpbWVvdXRfbXNlY3NfYXR0cmlidXRlID0KK3N0YXRpYyBzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlIG5jYWNoZV90aW1lb3V0X21zZWNzX2F0dHJpYnV0ZSA9CiAJX19BVFRSKHRpbWVvdXRfbXNlY3MsCiAJICAgICAgIDA2NjQsCi0JICAgICAgIHNlcnZpY2VfbmNhY2hlX3Nob3csCi0JICAgICAgIHNlcnZpY2VfbmNhY2hlX3N0b3JlKTsKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zaG93LAorCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3N0b3JlKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm5jYWNoZV9vcmFuZ2Vmc19kZWZhdWx0X2F0dHJzW10gPSB7CiAJJm5jYWNoZV9oYXJkX2xpbWl0X2F0dHJpYnV0ZS5hdHRyLApAQCAtMTU4MiwyNyArMTAwMiwyNiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgbmNhY2hlX29yYW5nZWZzX2t0eXBlID0gewotCS5zeXNmc19vcHMgPSAmbmNhY2hlX29yYW5nZWZzX3N5c2ZzX29wcywKLQkucmVsZWFzZSA9IG5jYWNoZV9vcmFuZ2Vmc19yZWxlYXNlLAorCS5zeXNmc19vcHMgPSAmb3JhbmdlZnNfc3lzZnNfb3BzLAogCS5kZWZhdWx0X2F0dHJzID0gbmNhY2hlX29yYW5nZWZzX2RlZmF1bHRfYXR0cnMsCiB9OwogCi1zdGF0aWMgc3RydWN0IHBjX29yYW5nZWZzX2F0dHJpYnV0ZSBwY19hY2FjaGVfYXR0cmlidXRlID0KK3N0YXRpYyBzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlIHBjX2FjYWNoZV9hdHRyaWJ1dGUgPQogCV9fQVRUUihhY2FjaGUsCiAJICAgICAgIDA2NjQsCi0JICAgICAgIHNlcnZpY2VfcGNfc2hvdywKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zaG93LAogCSAgICAgICBOVUxMKTsKIAotc3RhdGljIHN0cnVjdCBwY19vcmFuZ2Vmc19hdHRyaWJ1dGUgcGNfY2FwY2FjaGVfYXR0cmlidXRlID0KK3N0YXRpYyBzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlIHBjX2NhcGNhY2hlX2F0dHJpYnV0ZSA9CiAJX19BVFRSKGNhcGNhY2hlLAogCSAgICAgICAwNjY0LAotCSAgICAgICBzZXJ2aWNlX3BjX3Nob3csCisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc2hvdywKIAkgICAgICAgTlVMTCk7CiAKLXN0YXRpYyBzdHJ1Y3QgcGNfb3JhbmdlZnNfYXR0cmlidXRlIHBjX25jYWNoZV9hdHRyaWJ1dGUgPQorc3RhdGljIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgcGNfbmNhY2hlX2F0dHJpYnV0ZSA9CiAJX19BVFRSKG5jYWNoZSwKIAkgICAgICAgMDY2NCwKLQkgICAgICAgc2VydmljZV9wY19zaG93LAorCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3Nob3csCiAJICAgICAgIE5VTEwpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcGNfb3JhbmdlZnNfZGVmYXVsdF9hdHRyc1tdID0gewpAQCAtMTYxMywyMSArMTAzMiwyMCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgcGNfb3JhbmdlZnNfa3R5cGUgPSB7Ci0JLnN5c2ZzX29wcyA9ICZwY19vcmFuZ2Vmc19zeXNmc19vcHMsCi0JLnJlbGVhc2UgPSBwY19vcmFuZ2Vmc19yZWxlYXNlLAorCS5zeXNmc19vcHMgPSAmb3JhbmdlZnNfc3lzZnNfb3BzLAogCS5kZWZhdWx0X2F0dHJzID0gcGNfb3JhbmdlZnNfZGVmYXVsdF9hdHRycywKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc3RhdHNfb3JhbmdlZnNfYXR0cmlidXRlIHN0YXRzX3JlYWRzX2F0dHJpYnV0ZSA9CitzdGF0aWMgc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSBzdGF0c19yZWFkc19hdHRyaWJ1dGUgPQogCV9fQVRUUihyZWFkcywKIAkgICAgICAgMDY2NCwKLQkgICAgICAgaW50X3N0YXRzX3Nob3csCisJICAgICAgIHN5c2ZzX2ludF9zaG93LAogCSAgICAgICBOVUxMKTsKIAotc3RhdGljIHN0cnVjdCBzdGF0c19vcmFuZ2Vmc19hdHRyaWJ1dGUgc3RhdHNfd3JpdGVzX2F0dHJpYnV0ZSA9CitzdGF0aWMgc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSBzdGF0c193cml0ZXNfYXR0cmlidXRlID0KIAlfX0FUVFIod3JpdGVzLAogCSAgICAgICAwNjY0LAotCSAgICAgICBpbnRfc3RhdHNfc2hvdywKKwkgICAgICAgc3lzZnNfaW50X3Nob3csCiAJICAgICAgIE5VTEwpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqc3RhdHNfb3JhbmdlZnNfZGVmYXVsdF9hdHRyc1tdID0gewpAQCAtMTYzNywxOCArMTA1NSwxNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgc3RhdHNfb3JhbmdlZnNfa3R5cGUgPSB7Ci0JLnN5c2ZzX29wcyA9ICZzdGF0c19vcmFuZ2Vmc19zeXNmc19vcHMsCi0JLnJlbGVhc2UgPSBzdGF0c19vcmFuZ2Vmc19yZWxlYXNlLAorCS5zeXNmc19vcHMgPSAmb3JhbmdlZnNfc3lzZnNfb3BzLAogCS5kZWZhdWx0X2F0dHJzID0gc3RhdHNfb3JhbmdlZnNfZGVmYXVsdF9hdHRycywKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb3JhbmdlZnNfb2JqICpvcmFuZ2Vmc19vYmo7Ci1zdGF0aWMgc3RydWN0IGFjYWNoZV9vcmFuZ2Vmc19vYmogKmFjYWNoZV9vcmFuZ2Vmc19vYmo7Ci1zdGF0aWMgc3RydWN0IGNhcGNhY2hlX29yYW5nZWZzX29iaiAqY2FwY2FjaGVfb3JhbmdlZnNfb2JqOwotc3RhdGljIHN0cnVjdCBjY2FjaGVfb3JhbmdlZnNfb2JqICpjY2FjaGVfb3JhbmdlZnNfb2JqOwotc3RhdGljIHN0cnVjdCBuY2FjaGVfb3JhbmdlZnNfb2JqICpuY2FjaGVfb3JhbmdlZnNfb2JqOwotc3RhdGljIHN0cnVjdCBwY19vcmFuZ2Vmc19vYmogKnBjX29yYW5nZWZzX29iajsKLXN0YXRpYyBzdHJ1Y3Qgc3RhdHNfb3JhbmdlZnNfb2JqICpzdGF0c19vcmFuZ2Vmc19vYmo7CitzdGF0aWMgc3RydWN0IGtvYmplY3QgKm9yYW5nZWZzX29iajsKK3N0YXRpYyBzdHJ1Y3Qga29iamVjdCAqYWNhY2hlX29yYW5nZWZzX29iajsKK3N0YXRpYyBzdHJ1Y3Qga29iamVjdCAqY2FwY2FjaGVfb3JhbmdlZnNfb2JqOworc3RhdGljIHN0cnVjdCBrb2JqZWN0ICpjY2FjaGVfb3JhbmdlZnNfb2JqOworc3RhdGljIHN0cnVjdCBrb2JqZWN0ICpuY2FjaGVfb3JhbmdlZnNfb2JqOworc3RhdGljIHN0cnVjdCBrb2JqZWN0ICpwY19vcmFuZ2Vmc19vYmo7CitzdGF0aWMgc3RydWN0IGtvYmplY3QgKnN0YXRzX29yYW5nZWZzX29iajsKIAogaW50IG9yYW5nZWZzX3N5c2ZzX2luaXQodm9pZCkKIHsKQEAgLTE2NjEsNyArMTA3OCw3IEBACiAJaWYgKCFvcmFuZ2Vmc19vYmopCiAJCWdvdG8gb3V0OwogCi0JcmMgPSBrb2JqZWN0X2luaXRfYW5kX2FkZCgmb3JhbmdlZnNfb2JqLT5rb2JqLAorCXJjID0ga29iamVjdF9pbml0X2FuZF9hZGQob3JhbmdlZnNfb2JqLAogCQkJCSAgJm9yYW5nZWZzX2t0eXBlLAogCQkJCSAgZnNfa29iaiwKIAkJCQkgIE9SQU5HRUZTX0tPQkpfSUQpOwpAQCAtMTY2OSw3ICsxMDg2LDcgQEAKIAlpZiAocmMpCiAJCWdvdG8gb2ZzX29ial9iYWlsOwogCi0Ja29iamVjdF91ZXZlbnQoJm9yYW5nZWZzX29iai0+a29iaiwgS09CSl9BREQpOworCWtvYmplY3RfdWV2ZW50KG9yYW5nZWZzX29iaiwgS09CSl9BREQpOwogCiAJLyogY3JlYXRlIC9zeXMvZnMvb3JhbmdlZnMvYWNhY2hlLiAqLwogCWFjYWNoZV9vcmFuZ2Vmc19vYmogPSBremFsbG9jKHNpemVvZigqYWNhY2hlX29yYW5nZWZzX29iaiksIEdGUF9LRVJORUwpOwpAQCAtMTY3OCwxNSArMTA5NSwxNSBAQAogCQlnb3RvIG9mc19vYmpfYmFpbDsKIAl9CiAKLQlyYyA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZhY2FjaGVfb3JhbmdlZnNfb2JqLT5rb2JqLAorCXJjID0ga29iamVjdF9pbml0X2FuZF9hZGQoYWNhY2hlX29yYW5nZWZzX29iaiwKIAkJCQkgICZhY2FjaGVfb3JhbmdlZnNfa3R5cGUsCi0JCQkJICAmb3JhbmdlZnNfb2JqLT5rb2JqLAorCQkJCSAgb3JhbmdlZnNfb2JqLAogCQkJCSAgQUNBQ0hFX0tPQkpfSUQpOwogCiAJaWYgKHJjKQogCQlnb3RvIGFjYWNoZV9vYmpfYmFpbDsKIAotCWtvYmplY3RfdWV2ZW50KCZhY2FjaGVfb3JhbmdlZnNfb2JqLT5rb2JqLCBLT0JKX0FERCk7CisJa29iamVjdF91ZXZlbnQoYWNhY2hlX29yYW5nZWZzX29iaiwgS09CSl9BREQpOwogCiAJLyogY3JlYXRlIC9zeXMvZnMvb3JhbmdlZnMvY2FwY2FjaGUuICovCiAJY2FwY2FjaGVfb3JhbmdlZnNfb2JqID0KQEAgLTE2OTYsMTQgKzExMTMsMTQgQEAKIAkJZ290byBhY2FjaGVfb2JqX2JhaWw7CiAJfQogCi0JcmMgPSBrb2JqZWN0X2luaXRfYW5kX2FkZCgmY2FwY2FjaGVfb3JhbmdlZnNfb2JqLT5rb2JqLAorCXJjID0ga29iamVjdF9pbml0X2FuZF9hZGQoY2FwY2FjaGVfb3JhbmdlZnNfb2JqLAogCQkJCSAgJmNhcGNhY2hlX29yYW5nZWZzX2t0eXBlLAotCQkJCSAgJm9yYW5nZWZzX29iai0+a29iaiwKKwkJCQkgIG9yYW5nZWZzX29iaiwKIAkJCQkgIENBUENBQ0hFX0tPQkpfSUQpOwogCWlmIChyYykKIAkJZ290byBjYXBjYWNoZV9vYmpfYmFpbDsKIAotCWtvYmplY3RfdWV2ZW50KCZjYXBjYWNoZV9vcmFuZ2Vmc19vYmotPmtvYmosIEtPQkpfQUREKTsKKwlrb2JqZWN0X3VldmVudChjYXBjYWNoZV9vcmFuZ2Vmc19vYmosIEtPQkpfQUREKTsKIAogCS8qIGNyZWF0ZSAvc3lzL2ZzL29yYW5nZWZzL2NjYWNoZS4gKi8KIAljY2FjaGVfb3JhbmdlZnNfb2JqID0KQEAgLTE3MTMsMTQgKzExMzAsMTQgQEAKIAkJZ290byBjYXBjYWNoZV9vYmpfYmFpbDsKIAl9CiAKLQlyYyA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZjY2FjaGVfb3JhbmdlZnNfb2JqLT5rb2JqLAorCXJjID0ga29iamVjdF9pbml0X2FuZF9hZGQoY2NhY2hlX29yYW5nZWZzX29iaiwKIAkJCQkgICZjY2FjaGVfb3JhbmdlZnNfa3R5cGUsCi0JCQkJICAmb3JhbmdlZnNfb2JqLT5rb2JqLAorCQkJCSAgb3JhbmdlZnNfb2JqLAogCQkJCSAgQ0NBQ0hFX0tPQkpfSUQpOwogCWlmIChyYykKIAkJZ290byBjY2FjaGVfb2JqX2JhaWw7CiAKLQlrb2JqZWN0X3VldmVudCgmY2NhY2hlX29yYW5nZWZzX29iai0+a29iaiwgS09CSl9BREQpOworCWtvYmplY3RfdWV2ZW50KGNjYWNoZV9vcmFuZ2Vmc19vYmosIEtPQkpfQUREKTsKIAogCS8qIGNyZWF0ZSAvc3lzL2ZzL29yYW5nZWZzL25jYWNoZS4gKi8KIAluY2FjaGVfb3JhbmdlZnNfb2JqID0ga3phbGxvYyhzaXplb2YoKm5jYWNoZV9vcmFuZ2Vmc19vYmopLCBHRlBfS0VSTkVMKTsKQEAgLTE3MjksMTUgKzExNDYsMTUgQEAKIAkJZ290byBjY2FjaGVfb2JqX2JhaWw7CiAJfQogCi0JcmMgPSBrb2JqZWN0X2luaXRfYW5kX2FkZCgmbmNhY2hlX29yYW5nZWZzX29iai0+a29iaiwKKwlyYyA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKG5jYWNoZV9vcmFuZ2Vmc19vYmosCiAJCQkJICAmbmNhY2hlX29yYW5nZWZzX2t0eXBlLAotCQkJCSAgJm9yYW5nZWZzX29iai0+a29iaiwKKwkJCQkgIG9yYW5nZWZzX29iaiwKIAkJCQkgIE5DQUNIRV9LT0JKX0lEKTsKIAogCWlmIChyYykKIAkJZ290byBuY2FjaGVfb2JqX2JhaWw7CiAKLQlrb2JqZWN0X3VldmVudCgmbmNhY2hlX29yYW5nZWZzX29iai0+a29iaiwgS09CSl9BREQpOworCWtvYmplY3RfdWV2ZW50KG5jYWNoZV9vcmFuZ2Vmc19vYmosIEtPQkpfQUREKTsKIAogCS8qIGNyZWF0ZSAvc3lzL2ZzL29yYW5nZWZzL3BlcmZfY291bnRlcnMuICovCiAJcGNfb3JhbmdlZnNfb2JqID0ga3phbGxvYyhzaXplb2YoKnBjX29yYW5nZWZzX29iaiksIEdGUF9LRVJORUwpOwpAQCAtMTc0NiwxNSArMTE2MywxNSBAQAogCQlnb3RvIG5jYWNoZV9vYmpfYmFpbDsKIAl9CiAKLQlyYyA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZwY19vcmFuZ2Vmc19vYmotPmtvYmosCisJcmMgPSBrb2JqZWN0X2luaXRfYW5kX2FkZChwY19vcmFuZ2Vmc19vYmosCiAJCQkJICAmcGNfb3JhbmdlZnNfa3R5cGUsCi0JCQkJICAmb3JhbmdlZnNfb2JqLT5rb2JqLAorCQkJCSAgb3JhbmdlZnNfb2JqLAogCQkJCSAgInBlcmZfY291bnRlcnMiKTsKIAogCWlmIChyYykKIAkJZ290byBwY19vYmpfYmFpbDsKIAotCWtvYmplY3RfdWV2ZW50KCZwY19vcmFuZ2Vmc19vYmotPmtvYmosIEtPQkpfQUREKTsKKwlrb2JqZWN0X3VldmVudChwY19vcmFuZ2Vmc19vYmosIEtPQkpfQUREKTsKIAogCS8qIGNyZWF0ZSAvc3lzL2ZzL29yYW5nZWZzL3N0YXRzLiAqLwogCXN0YXRzX29yYW5nZWZzX29iaiA9IGt6YWxsb2Moc2l6ZW9mKCpzdGF0c19vcmFuZ2Vmc19vYmopLCBHRlBfS0VSTkVMKTsKQEAgLTE3NjMsMzcgKzExODAsMzEgQEAKIAkJZ290byBwY19vYmpfYmFpbDsKIAl9CiAKLQlyYyA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZzdGF0c19vcmFuZ2Vmc19vYmotPmtvYmosCisJcmMgPSBrb2JqZWN0X2luaXRfYW5kX2FkZChzdGF0c19vcmFuZ2Vmc19vYmosCiAJCQkJICAmc3RhdHNfb3JhbmdlZnNfa3R5cGUsCi0JCQkJICAmb3JhbmdlZnNfb2JqLT5rb2JqLAorCQkJCSAgb3JhbmdlZnNfb2JqLAogCQkJCSAgU1RBVFNfS09CSl9JRCk7CiAKIAlpZiAocmMpCiAJCWdvdG8gc3RhdHNfb2JqX2JhaWw7CiAKLQlrb2JqZWN0X3VldmVudCgmc3RhdHNfb3JhbmdlZnNfb2JqLT5rb2JqLCBLT0JKX0FERCk7CisJa29iamVjdF91ZXZlbnQoc3RhdHNfb3JhbmdlZnNfb2JqLCBLT0JKX0FERCk7CiAJZ290byBvdXQ7CiAKIHN0YXRzX29ial9iYWlsOgotCQlrb2JqZWN0X3B1dCgmc3RhdHNfb3JhbmdlZnNfb2JqLT5rb2JqKTsKLQorCQlrb2JqZWN0X3B1dChzdGF0c19vcmFuZ2Vmc19vYmopOwogcGNfb2JqX2JhaWw6Ci0JCWtvYmplY3RfcHV0KCZwY19vcmFuZ2Vmc19vYmotPmtvYmopOwotCisJCWtvYmplY3RfcHV0KHBjX29yYW5nZWZzX29iaik7CiBuY2FjaGVfb2JqX2JhaWw6Ci0JCWtvYmplY3RfcHV0KCZuY2FjaGVfb3JhbmdlZnNfb2JqLT5rb2JqKTsKLQorCQlrb2JqZWN0X3B1dChuY2FjaGVfb3JhbmdlZnNfb2JqKTsKIGNjYWNoZV9vYmpfYmFpbDoKLQkJa29iamVjdF9wdXQoJmNjYWNoZV9vcmFuZ2Vmc19vYmotPmtvYmopOwotCisJCWtvYmplY3RfcHV0KGNjYWNoZV9vcmFuZ2Vmc19vYmopOwogY2FwY2FjaGVfb2JqX2JhaWw6Ci0JCWtvYmplY3RfcHV0KCZjYXBjYWNoZV9vcmFuZ2Vmc19vYmotPmtvYmopOwotCisJCWtvYmplY3RfcHV0KGNhcGNhY2hlX29yYW5nZWZzX29iaik7CiBhY2FjaGVfb2JqX2JhaWw6Ci0JCWtvYmplY3RfcHV0KCZhY2FjaGVfb3JhbmdlZnNfb2JqLT5rb2JqKTsKLQorCQlrb2JqZWN0X3B1dChhY2FjaGVfb3JhbmdlZnNfb2JqKTsKIG9mc19vYmpfYmFpbDoKLQkJa29iamVjdF9wdXQoJm9yYW5nZWZzX29iai0+a29iaik7CisJCWtvYmplY3RfcHV0KG9yYW5nZWZzX29iaik7CiBvdXQ6CiAJcmV0dXJuIHJjOwogfQpAQCAtMTgwMSwxMyArMTIxMiwxMSBAQAogdm9pZCBvcmFuZ2Vmc19zeXNmc19leGl0KHZvaWQpCiB7CiAJZ29zc2lwX2RlYnVnKEdPU1NJUF9TWVNGU19ERUJVRywgIm9yYW5nZWZzX3N5c2ZzX2V4aXQ6IHN0YXJ0XG4iKTsKLQotCWtvYmplY3RfcHV0KCZhY2FjaGVfb3JhbmdlZnNfb2JqLT5rb2JqKTsKLQlrb2JqZWN0X3B1dCgmY2FwY2FjaGVfb3JhbmdlZnNfb2JqLT5rb2JqKTsKLQlrb2JqZWN0X3B1dCgmY2NhY2hlX29yYW5nZWZzX29iai0+a29iaik7Ci0Ja29iamVjdF9wdXQoJm5jYWNoZV9vcmFuZ2Vmc19vYmotPmtvYmopOwotCWtvYmplY3RfcHV0KCZwY19vcmFuZ2Vmc19vYmotPmtvYmopOwotCWtvYmplY3RfcHV0KCZzdGF0c19vcmFuZ2Vmc19vYmotPmtvYmopOwotCi0Ja29iamVjdF9wdXQoJm9yYW5nZWZzX29iai0+a29iaik7CisJa29iamVjdF9wdXQoYWNhY2hlX29yYW5nZWZzX29iaik7CisJa29iamVjdF9wdXQoY2FwY2FjaGVfb3JhbmdlZnNfb2JqKTsKKwlrb2JqZWN0X3B1dChjY2FjaGVfb3JhbmdlZnNfb2JqKTsKKwlrb2JqZWN0X3B1dChuY2FjaGVfb3JhbmdlZnNfb2JqKTsKKwlrb2JqZWN0X3B1dChwY19vcmFuZ2Vmc19vYmopOworCWtvYmplY3RfcHV0KHN0YXRzX29yYW5nZWZzX29iaik7CisJa29iamVjdF9wdXQob3JhbmdlZnNfb2JqKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL29yYW5nZWZzL29yYW5nZWZzLXV0aWxzLmMgYi9mcy9vcmFuZ2Vmcy9vcmFuZ2Vmcy11dGlscy5jCmluZGV4IGQxM2M3MjkuLjA2YWY4MWYgMTAwNjQ0Ci0tLSBhL2ZzL29yYW5nZWZzL29yYW5nZWZzLXV0aWxzLmMKKysrIGIvZnMvb3JhbmdlZnMvb3JhbmdlZnMtdXRpbHMuYwpAQCAtNTAsNyArNTAsNyBAQAogCQljYXNlIE9SQU5HRUZTX1ZGU19PUF9UUlVOQ0FURToKIAkJCWZzaWQgPSBvcC0+dXBjYWxsLnJlcS50cnVuY2F0ZS5yZWZuLmZzX2lkOwogCQkJYnJlYWs7Ci0JCWNhc2UgT1JBTkdFRlNfVkZTX09QX01NQVBfUkFfRkxVU0g6CisJCWNhc2UgT1JBTkdFRlNfVkZTX09QX1JBX0ZMVVNIOgogCQkJZnNpZCA9IG9wLT51cGNhbGwucmVxLnJhX2NhY2hlX2ZsdXNoLnJlZm4uZnNfaWQ7CiAJCQlicmVhazsKIAkJY2FzZSBPUkFOR0VGU19WRlNfT1BfRlNfVU1PVU5UOgpAQCAtMzQ3LDcgKzM0Nyw4IEBACiAJaW5vZGUtPmlfbW9kZSA9IHR5cGUgfCAoaXNfcm9vdF9oYW5kbGUoaW5vZGUpID8gU19JU1ZUWCA6IDApIHwKIAkgICAgb3JhbmdlZnNfaW5vZGVfcGVybXMoJm5ld19vcC0+ZG93bmNhbGwucmVzcC5nZXRhdHRyLmF0dHJpYnV0ZXMpOwogCi0Jb3JhbmdlZnNfaW5vZGUtPmdldGF0dHJfdGltZSA9IGppZmZpZXMgKyBnZXRhdHRyX3RpbWVvdXRfbXNlY3MqSFovMTAwMDsKKwlvcmFuZ2Vmc19pbm9kZS0+Z2V0YXR0cl90aW1lID0gamlmZmllcyArCisJICAgIG9yYW5nZWZzX2dldGF0dHJfdGltZW91dF9tc2VjcypIWi8xMDAwOwogCXJldCA9IDA7CiBvdXQ6CiAJb3BfcmVsZWFzZShuZXdfb3ApOwpAQCAtNjU2LDQwMSArNjU3LDMgQEAKIAlyZXR1cm4gcmV0OwogfQogI3VuZGVmIE5VTV9NT0RFUwotCi0vKgotICogQWZ0ZXIgb2J0YWluaW5nIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjbGllbnQncyBkZWJ1ZwotICoga2V5d29yZHMgYW5kIHRoZWlyIGFzc29jaWF0ZWQgbWFza3MsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGJ1aWxkIGFuCi0gKiBhcnJheSBvZiB0aGVzZSB2YWx1ZXMuCi0gKi8KLWludCBvcmFuZ2Vmc19wcmVwYXJlX2NkbV9hcnJheShjaGFyICpkZWJ1Z19hcnJheV9zdHJpbmcpCi17Ci0JaW50IGk7Ci0JaW50IHJjID0gLUVJTlZBTDsKLQljaGFyICpjZHNfaGVhZCA9IE5VTEw7Ci0JY2hhciAqY2RzX2RlbGltaXRlciA9IE5VTEw7Ci0JaW50IGtleXdvcmRfbGVuID0gMDsKLQotCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfVVRJTFNfREVCVUcsICIlczogc3RhcnRcbiIsIF9fZnVuY19fKTsKLQotCS8qCi0JICogZmlndXJlIG91dCBob3cgbWFueSBlbGVtZW50cyB0aGUgY2RtX2FycmF5IG5lZWRzLgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBzdHJsZW4oZGVidWdfYXJyYXlfc3RyaW5nKTsgaSsrKQotCQlpZiAoZGVidWdfYXJyYXlfc3RyaW5nW2ldID09ICdcbicpCi0JCQljZG1fZWxlbWVudF9jb3VudCsrOwotCi0JaWYgKCFjZG1fZWxlbWVudF9jb3VudCkgewotCQlwcl9pbmZvKCJObyBlbGVtZW50cyBpbiBjbGllbnQgZGVidWcgYXJyYXkgc3RyaW5nIVxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWNkbV9hcnJheSA9Ci0JCWt6YWxsb2MoY2RtX2VsZW1lbnRfY291bnQgKiBzaXplb2Yoc3RydWN0IGNsaWVudF9kZWJ1Z19tYXNrKSwKLQkJCUdGUF9LRVJORUwpOwotCWlmICghY2RtX2FycmF5KSB7Ci0JCXByX2luZm8oIm1hbGxvYyBmYWlsZWQgZm9yIGNkbV9hcnJheSFcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQotCWNkc19oZWFkID0gZGVidWdfYXJyYXlfc3RyaW5nOwotCi0JZm9yIChpID0gMDsgaSA8IGNkbV9lbGVtZW50X2NvdW50OyBpKyspIHsKLQkJY2RzX2RlbGltaXRlciA9IHN0cmNocihjZHNfaGVhZCwgJ1xuJyk7Ci0JCSpjZHNfZGVsaW1pdGVyID0gJ1wwJzsKLQotCQlrZXl3b3JkX2xlbiA9IHN0cmNzcG4oY2RzX2hlYWQsICIgIik7Ci0KLQkJY2RtX2FycmF5W2ldLmtleXdvcmQgPSBremFsbG9jKGtleXdvcmRfbGVuICsgMSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghY2RtX2FycmF5W2ldLmtleXdvcmQpIHsKLQkJCXJjID0gLUVOT01FTTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJc3NjYW5mKGNkc19oZWFkLAotCQkgICAgICAgIiVzICVsbHggJWxseCIsCi0JCSAgICAgICBjZG1fYXJyYXlbaV0ua2V5d29yZCwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcgKikmKGNkbV9hcnJheVtpXS5tYXNrMSksCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nICopJihjZG1fYXJyYXlbaV0ubWFzazIpKTsKLQotCQlpZiAoIXN0cmNtcChjZG1fYXJyYXlbaV0ua2V5d29yZCwgT1JBTkdFRlNfVkVSQk9TRSkpCi0JCQljbGllbnRfdmVyYm9zZV9pbmRleCA9IGk7Ci0KLQkJaWYgKCFzdHJjbXAoY2RtX2FycmF5W2ldLmtleXdvcmQsIE9SQU5HRUZTX0FMTCkpCi0JCQljbGllbnRfYWxsX2luZGV4ID0gaTsKLQotCQljZHNfaGVhZCA9IGNkc19kZWxpbWl0ZXIgKyAxOwotCX0KLQotCXJjID0gY2RtX2VsZW1lbnRfY291bnQ7Ci0KLQlnb3NzaXBfZGVidWcoR09TU0lQX1VUSUxTX0RFQlVHLCAiJXM6IHJjOiVkOlxuIiwgX19mdW5jX18sIHJjKTsKLQotb3V0OgotCi0JcmV0dXJuIHJjOwotCi19Ci0KLS8qCi0gKiAvc3lzL2tlcm5lbC9kZWJ1Zy9vcmFuZ2Vmcy9kZWJ1Zy1oZWxwIGNhbiBiZSBjYXR0ZWQgdG8KLSAqIHNlZSBhbGwgdGhlIGF2YWlsYWJsZSBrZXJuZWwgYW5kIGNsaWVudCBkZWJ1ZyBrZXl3b3Jkcy4KLSAqCi0gKiBXaGVuIHRoZSBrZXJuZWwgYm9vdHMsIHdlIGhhdmUgbm8gaWRlYSB3aGF0IGtleXdvcmRzIHRoZQotICogY2xpZW50IHN1cHBvcnRzLCBub3IgdGhlaXIgYXNzb2NpYXRlZCBtYXNrcy4KLSAqCi0gKiBXZSBwYXNzIHRocm91Z2ggdGhpcyBmdW5jdGlvbiBvbmNlIGF0IGJvb3QgYW5kIHN0YW1wIGEKLSAqIGJvaWxlcnBsYXRlICJ3ZSBkb24ndCBrbm93IiBtZXNzYWdlIGZvciB0aGUgY2xpZW50IGluIHRoZQotICogZGVidWctaGVscCBmaWxlLiBXZSBwYXNzIHRocm91Z2ggaGVyZSBhZ2FpbiB3aGVuIHRoZSBjbGllbnQKLSAqIHN0YXJ0cyBhbmQgdGhlbiB3ZSBjYW4gZmlsbCBvdXQgdGhlIGRlYnVnLWhlbHAgZmlsZSBmdWxseS4KLSAqCi0gKiBUaGUgY2xpZW50IG1pZ2h0IGJlIHJlc3RhcnRlZCBhbnkgbnVtYmVyIG9mIHRpbWVzIGJldHdlZW4KLSAqIHJlYm9vdHMsIHdlIG9ubHkgYnVpbGQgdGhlIGRlYnVnLWhlbHAgZmlsZSB0aGUgZmlyc3QgdGltZS4KLSAqLwotaW50IG9yYW5nZWZzX3ByZXBhcmVfZGVidWdmc19oZWxwX3N0cmluZyhpbnQgYXRfYm9vdCkKLXsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCWludCBpOwotCWludCBieXRlX2NvdW50ID0gMDsKLQljaGFyICpjbGllbnRfdGl0bGUgPSAiQ2xpZW50IERlYnVnIEtleXdvcmRzOlxuIjsKLQljaGFyICprZXJuZWxfdGl0bGUgPSAiS2VybmVsIERlYnVnIEtleXdvcmRzOlxuIjsKLQotCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfVVRJTFNfREVCVUcsICIlczogc3RhcnRcbiIsIF9fZnVuY19fKTsKLQotCWlmIChhdF9ib290KSB7Ci0JCWJ5dGVfY291bnQgKz0gc3RybGVuKEhFTFBfU1RSSU5HX1VOSU5JVElBTElaRUQpOwotCQljbGllbnRfdGl0bGUgPSBIRUxQX1NUUklOR19VTklOSVRJQUxJWkVEOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIGZpbGwgdGhlIGNsaWVudCBrZXl3b3JkL21hc2sgYXJyYXkgYW5kIHJlbWVtYmVyCi0JCSAqIGhvdyBtYW55IGVsZW1lbnRzIHRoZXJlIHdlcmUuCi0JCSAqLwotCQljZG1fZWxlbWVudF9jb3VudCA9Ci0JCQlvcmFuZ2Vmc19wcmVwYXJlX2NkbV9hcnJheShjbGllbnRfZGVidWdfYXJyYXlfc3RyaW5nKTsKLQkJaWYgKGNkbV9lbGVtZW50X2NvdW50IDw9IDApCi0JCQlnb3RvIG91dDsKLQotCQkvKiBDb3VudCB0aGUgYnl0ZXMgZGVzdGluZWQgZm9yIGRlYnVnX2hlbHBfc3RyaW5nLiAqLwotCQlieXRlX2NvdW50ICs9IHN0cmxlbihjbGllbnRfdGl0bGUpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBjZG1fZWxlbWVudF9jb3VudDsgaSsrKSB7Ci0JCQlieXRlX2NvdW50ICs9IHN0cmxlbihjZG1fYXJyYXlbaV0ua2V5d29yZCArIDIpOwotCQkJaWYgKGJ5dGVfY291bnQgPj0gREVCVUdfSEVMUF9TVFJJTkdfU0laRSkgewotCQkJCXByX2luZm8oIiVzOiBvdmVyZmxvdyAxIVxuIiwgX19mdW5jX18pOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9Ci0KLQkJZ29zc2lwX2RlYnVnKEdPU1NJUF9VVElMU19ERUJVRywKLQkJCSAgICAgIiVzOiBjZG1fZWxlbWVudF9jb3VudDolZDpcbiIsCi0JCQkgICAgIF9fZnVuY19fLAotCQkJICAgICBjZG1fZWxlbWVudF9jb3VudCk7Ci0JfQotCi0JYnl0ZV9jb3VudCArPSBzdHJsZW4oa2VybmVsX3RpdGxlKTsKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2ttb2Rfa2V5d29yZF9tYXNrX21hcDsgaSsrKSB7Ci0JCWJ5dGVfY291bnQgKz0KLQkJCXN0cmxlbihzX2ttb2Rfa2V5d29yZF9tYXNrX21hcFtpXS5rZXl3b3JkICsgMik7Ci0JCWlmIChieXRlX2NvdW50ID49IERFQlVHX0hFTFBfU1RSSU5HX1NJWkUpIHsKLQkJCXByX2luZm8oIiVzOiBvdmVyZmxvdyAyIVxuIiwgX19mdW5jX18pOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KLQkvKiBidWlsZCBkZWJ1Z19oZWxwX3N0cmluZy4gKi8KLQlkZWJ1Z19oZWxwX3N0cmluZyA9IGt6YWxsb2MoREVCVUdfSEVMUF9TVFJJTkdfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZWJ1Z19oZWxwX3N0cmluZykgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQotCXN0cmNhdChkZWJ1Z19oZWxwX3N0cmluZywgY2xpZW50X3RpdGxlKTsKLQotCWlmICghYXRfYm9vdCkgewotCQlmb3IgKGkgPSAwOyBpIDwgY2RtX2VsZW1lbnRfY291bnQ7IGkrKykgewotCQkJc3RyY2F0KGRlYnVnX2hlbHBfc3RyaW5nLCAiXHQiKTsKLQkJCXN0cmNhdChkZWJ1Z19oZWxwX3N0cmluZywgY2RtX2FycmF5W2ldLmtleXdvcmQpOwotCQkJc3RyY2F0KGRlYnVnX2hlbHBfc3RyaW5nLCAiXG4iKTsKLQkJfQotCX0KLQotCXN0cmNhdChkZWJ1Z19oZWxwX3N0cmluZywgIlxuIik7Ci0Jc3RyY2F0KGRlYnVnX2hlbHBfc3RyaW5nLCBrZXJuZWxfdGl0bGUpOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9rbW9kX2tleXdvcmRfbWFza19tYXA7IGkrKykgewotCQlzdHJjYXQoZGVidWdfaGVscF9zdHJpbmcsICJcdCIpOwotCQlzdHJjYXQoZGVidWdfaGVscF9zdHJpbmcsIHNfa21vZF9rZXl3b3JkX21hc2tfbWFwW2ldLmtleXdvcmQpOwotCQlzdHJjYXQoZGVidWdfaGVscF9zdHJpbmcsICJcbiIpOwotCX0KLQotCXJjID0gMDsKLQotb3V0OgotCi0JcmV0dXJuIHJjOwotCi19Ci0KLS8qCi0gKiBrZXJuZWwgPSB0eXBlIDAKLSAqIGNsaWVudCA9IHR5cGUgMQotICovCi12b2lkIGRlYnVnX21hc2tfdG9fc3RyaW5nKHZvaWQgKm1hc2ssIGludCB0eXBlKQotewotCWludCBpOwotCWludCBsZW4gPSAwOwotCWNoYXIgKmRlYnVnX3N0cmluZzsKLQlpbnQgZWxlbWVudF9jb3VudCA9IDA7Ci0KLQlnb3NzaXBfZGVidWcoR09TU0lQX1VUSUxTX0RFQlVHLCAiJXM6IHN0YXJ0XG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAodHlwZSkgewotCQlkZWJ1Z19zdHJpbmcgPSBjbGllbnRfZGVidWdfc3RyaW5nOwotCQllbGVtZW50X2NvdW50ID0gY2RtX2VsZW1lbnRfY291bnQ7Ci0JfSBlbHNlIHsKLQkJZGVidWdfc3RyaW5nID0ga2VybmVsX2RlYnVnX3N0cmluZzsKLQkJZWxlbWVudF9jb3VudCA9IG51bV9rbW9kX2tleXdvcmRfbWFza19tYXA7Ci0JfQotCi0JbWVtc2V0KGRlYnVnX3N0cmluZywgMCwgT1JBTkdFRlNfTUFYX0RFQlVHX1NUUklOR19MRU4pOwotCi0JLyoKLQkgKiBTb21lIGtleXdvcmRzLCBsaWtlICJhbGwiIG9yICJ2ZXJib3NlIiwgYXJlIGFtYWxnYW1zIG9mCi0JICogbnVtZXJvdXMgb3RoZXIga2V5d29yZHMuIE1ha2UgYSBzcGVjaWFsIGNoZWNrIGZvciB0aG9zZQotCSAqIGJlZm9yZSBncmluZGluZyB0aHJvdWdoIHRoZSB3aG9sZSBtYXNrIG9ubHkgdG8gZmluZCBvdXQKLQkgKiBsYXRlci4uLgotCSAqLwotCWlmIChjaGVja19hbWFsZ2FtX2tleXdvcmQobWFzaywgdHlwZSkpCi0JCWdvdG8gb3V0OwotCi0JLyogQnVpbGQgdGhlIGRlYnVnIHN0cmluZy4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgZWxlbWVudF9jb3VudDsgaSsrKQotCQlpZiAodHlwZSkKLQkJCWRvX2Nfc3RyaW5nKG1hc2ssIGkpOwotCQllbHNlCi0JCQlkb19rX3N0cmluZyhtYXNrLCBpKTsKLQotCWxlbiA9IHN0cmxlbihkZWJ1Z19zdHJpbmcpOwotCi0JaWYgKChsZW4pICYmICh0eXBlKSkKLQkJY2xpZW50X2RlYnVnX3N0cmluZ1tsZW4gLSAxXSA9ICdcMCc7Ci0JZWxzZSBpZiAobGVuKQotCQlrZXJuZWxfZGVidWdfc3RyaW5nW2xlbiAtIDFdID0gJ1wwJzsKLQllbHNlIGlmICh0eXBlKQotCQlzdHJjcHkoY2xpZW50X2RlYnVnX3N0cmluZywgIm5vbmUiKTsKLQllbHNlCi0JCXN0cmNweShrZXJuZWxfZGVidWdfc3RyaW5nLCAibm9uZSIpOwotCi1vdXQ6Ci1nb3NzaXBfZGVidWcoR09TU0lQX1VUSUxTX0RFQlVHLCAiJXM6IHN0cmluZzolczpcbiIsIF9fZnVuY19fLCBkZWJ1Z19zdHJpbmcpOwotCi0JcmV0dXJuOwotCi19Ci0KLXZvaWQgZG9fa19zdHJpbmcodm9pZCAqa19tYXNrLCBpbnQgaW5kZXgpCi17Ci0JX191NjQgKm1hc2sgPSAoX191NjQgKikga19tYXNrOwotCi0JaWYgKGtleXdvcmRfaXNfYW1hbGdhbSgoY2hhciAqKSBzX2ttb2Rfa2V5d29yZF9tYXNrX21hcFtpbmRleF0ua2V5d29yZCkpCi0JCWdvdG8gb3V0OwotCi0JaWYgKCptYXNrICYgc19rbW9kX2tleXdvcmRfbWFza19tYXBbaW5kZXhdLm1hc2tfdmFsKSB7Ci0JCWlmICgoc3RybGVuKGtlcm5lbF9kZWJ1Z19zdHJpbmcpICsKLQkJICAgICBzdHJsZW4oc19rbW9kX2tleXdvcmRfbWFza19tYXBbaW5kZXhdLmtleXdvcmQpKQotCQkJPCBPUkFOR0VGU19NQVhfREVCVUdfU1RSSU5HX0xFTiAtIDEpIHsKLQkJCQlzdHJjYXQoa2VybmVsX2RlYnVnX3N0cmluZywKLQkJCQkgICAgICAgc19rbW9kX2tleXdvcmRfbWFza19tYXBbaW5kZXhdLmtleXdvcmQpOwotCQkJCXN0cmNhdChrZXJuZWxfZGVidWdfc3RyaW5nLCAiLCIpOwotCQkJfSBlbHNlIHsKLQkJCQlnb3NzaXBfZXJyKCIlczogb3ZlcmZsb3chXG4iLCBfX2Z1bmNfXyk7Ci0JCQkJc3RyY3B5KGtlcm5lbF9kZWJ1Z19zdHJpbmcsIE9SQU5HRUZTX0FMTCk7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JfQotCi1vdXQ6Ci0KLQlyZXR1cm47Ci19Ci0KLXZvaWQgZG9fY19zdHJpbmcodm9pZCAqY19tYXNrLCBpbnQgaW5kZXgpCi17Ci0Jc3RydWN0IGNsaWVudF9kZWJ1Z19tYXNrICptYXNrID0gKHN0cnVjdCBjbGllbnRfZGVidWdfbWFzayAqKSBjX21hc2s7Ci0KLQlpZiAoa2V5d29yZF9pc19hbWFsZ2FtKGNkbV9hcnJheVtpbmRleF0ua2V5d29yZCkpCi0JCWdvdG8gb3V0OwotCi0JaWYgKChtYXNrLT5tYXNrMSAmIGNkbV9hcnJheVtpbmRleF0ubWFzazEpIHx8Ci0JICAgIChtYXNrLT5tYXNrMiAmIGNkbV9hcnJheVtpbmRleF0ubWFzazIpKSB7Ci0JCWlmICgoc3RybGVuKGNsaWVudF9kZWJ1Z19zdHJpbmcpICsKLQkJICAgICBzdHJsZW4oY2RtX2FycmF5W2luZGV4XS5rZXl3b3JkKSArIDEpCi0JCQk8IE9SQU5HRUZTX01BWF9ERUJVR19TVFJJTkdfTEVOIC0gMikgewotCQkJCXN0cmNhdChjbGllbnRfZGVidWdfc3RyaW5nLAotCQkJCSAgICAgICBjZG1fYXJyYXlbaW5kZXhdLmtleXdvcmQpOwotCQkJCXN0cmNhdChjbGllbnRfZGVidWdfc3RyaW5nLCAiLCIpOwotCQkJfSBlbHNlIHsKLQkJCQlnb3NzaXBfZXJyKCIlczogb3ZlcmZsb3chXG4iLCBfX2Z1bmNfXyk7Ci0JCQkJc3RyY3B5KGNsaWVudF9kZWJ1Z19zdHJpbmcsIE9SQU5HRUZTX0FMTCk7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JfQotb3V0OgotCXJldHVybjsKLX0KLQotaW50IGtleXdvcmRfaXNfYW1hbGdhbShjaGFyICprZXl3b3JkKQotewotCWludCByYyA9IDA7Ci0KLQlpZiAoKCFzdHJjbXAoa2V5d29yZCwgT1JBTkdFRlNfQUxMKSkgfHwgKCFzdHJjbXAoa2V5d29yZCwgT1JBTkdFRlNfVkVSQk9TRSkpKQotCQlyYyA9IDE7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qCi0gKiBrZXJuZWwgPSB0eXBlIDAKLSAqIGNsaWVudCA9IHR5cGUgMQotICoKLSAqIHJldHVybiAxIGlmIHdlIGZvdW5kIGFuIGFtYWxnYW0uCi0gKi8KLWludCBjaGVja19hbWFsZ2FtX2tleXdvcmQodm9pZCAqbWFzaywgaW50IHR5cGUpCi17Ci0JX191NjQgKmtfbWFzazsKLQlzdHJ1Y3QgY2xpZW50X2RlYnVnX21hc2sgKmNfbWFzazsKLQlpbnQga19hbGxfaW5kZXggPSBudW1fa21vZF9rZXl3b3JkX21hc2tfbWFwIC0gMTsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKHR5cGUpIHsKLQkJY19tYXNrID0gKHN0cnVjdCBjbGllbnRfZGVidWdfbWFzayAqKSBtYXNrOwotCi0JCWlmICgoY19tYXNrLT5tYXNrMSA9PSBjZG1fYXJyYXlbY2xpZW50X2FsbF9pbmRleF0ubWFzazEpICYmCi0JCSAgICAoY19tYXNrLT5tYXNrMiA9PSBjZG1fYXJyYXlbY2xpZW50X2FsbF9pbmRleF0ubWFzazIpKSB7Ci0JCQlzdHJjcHkoY2xpZW50X2RlYnVnX3N0cmluZywgT1JBTkdFRlNfQUxMKTsKLQkJCXJjID0gMTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJaWYgKChjX21hc2stPm1hc2sxID09IGNkbV9hcnJheVtjbGllbnRfdmVyYm9zZV9pbmRleF0ubWFzazEpICYmCi0JCSAgICAoY19tYXNrLT5tYXNrMiA9PSBjZG1fYXJyYXlbY2xpZW50X3ZlcmJvc2VfaW5kZXhdLm1hc2syKSkgewotCQkJc3RyY3B5KGNsaWVudF9kZWJ1Z19zdHJpbmcsIE9SQU5HRUZTX1ZFUkJPU0UpOwotCQkJcmMgPSAxOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCX0gZWxzZSB7Ci0JCWtfbWFzayA9IChfX3U2NCAqKSBtYXNrOwotCi0JCWlmICgqa19tYXNrID49IHNfa21vZF9rZXl3b3JkX21hc2tfbWFwW2tfYWxsX2luZGV4XS5tYXNrX3ZhbCkgewotCQkJc3RyY3B5KGtlcm5lbF9kZWJ1Z19zdHJpbmcsIE9SQU5HRUZTX0FMTCk7Ci0JCQlyYyA9IDE7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQotb3V0OgotCi0JcmV0dXJuIHJjOwotfQotCi0vKgotICoga2VybmVsID0gdHlwZSAwCi0gKiBjbGllbnQgPSB0eXBlIDEKLSAqLwotdm9pZCBkZWJ1Z19zdHJpbmdfdG9fbWFzayhjaGFyICpkZWJ1Z19zdHJpbmcsIHZvaWQgKm1hc2ssIGludCB0eXBlKQotewotCWNoYXIgKnVuY2hlY2tlZF9rZXl3b3JkOwotCWludCBpOwotCWNoYXIgKnN0cnNlcF9mb2RkZXIgPSBrc3RyZHVwKGRlYnVnX3N0cmluZywgR0ZQX0tFUk5FTCk7Ci0JY2hhciAqb3JpZ2luYWxfcG9pbnRlcjsKLQlpbnQgZWxlbWVudF9jb3VudCA9IDA7Ci0Jc3RydWN0IGNsaWVudF9kZWJ1Z19tYXNrICpjX21hc2s7Ci0JX191NjQgKmtfbWFzazsKLQotCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfVVRJTFNfREVCVUcsICIlczogc3RhcnRcbiIsIF9fZnVuY19fKTsKLQotCWlmICh0eXBlKSB7Ci0JCWNfbWFzayA9IChzdHJ1Y3QgY2xpZW50X2RlYnVnX21hc2sgKiltYXNrOwotCQllbGVtZW50X2NvdW50ID0gY2RtX2VsZW1lbnRfY291bnQ7Ci0JfSBlbHNlIHsKLQkJa19tYXNrID0gKF9fdTY0ICopbWFzazsKLQkJKmtfbWFzayA9IDA7Ci0JCWVsZW1lbnRfY291bnQgPSBudW1fa21vZF9rZXl3b3JkX21hc2tfbWFwOwotCX0KLQotCW9yaWdpbmFsX3BvaW50ZXIgPSBzdHJzZXBfZm9kZGVyOwotCXdoaWxlICgodW5jaGVja2VkX2tleXdvcmQgPSBzdHJzZXAoJnN0cnNlcF9mb2RkZXIsICIsIikpKQotCQlpZiAoc3RybGVuKHVuY2hlY2tlZF9rZXl3b3JkKSkgewotCQkJZm9yIChpID0gMDsgaSA8IGVsZW1lbnRfY291bnQ7IGkrKykKLQkJCQlpZiAodHlwZSkKLQkJCQkJZG9fY19tYXNrKGksCi0JCQkJCQkgIHVuY2hlY2tlZF9rZXl3b3JkLAotCQkJCQkJICAmY19tYXNrKTsKLQkJCQllbHNlCi0JCQkJCWRvX2tfbWFzayhpLAotCQkJCQkJICB1bmNoZWNrZWRfa2V5d29yZCwKLQkJCQkJCSAgJmtfbWFzayk7Ci0JCX0KLQotCWtmcmVlKG9yaWdpbmFsX3BvaW50ZXIpOwotfQotCi12b2lkIGRvX2NfbWFzayhpbnQgaSwKLQkgICAgICAgY2hhciAqdW5jaGVja2VkX2tleXdvcmQsCi0JICAgICAgIHN0cnVjdCBjbGllbnRfZGVidWdfbWFzayAqKnNhbmVfbWFzaykKLXsKLQotCWlmICghc3RyY21wKGNkbV9hcnJheVtpXS5rZXl3b3JkLCB1bmNoZWNrZWRfa2V5d29yZCkpIHsKLQkJKCoqc2FuZV9tYXNrKS5tYXNrMSA9ICgqKnNhbmVfbWFzaykubWFzazEgfCBjZG1fYXJyYXlbaV0ubWFzazE7Ci0JCSgqKnNhbmVfbWFzaykubWFzazIgPSAoKipzYW5lX21hc2spLm1hc2syIHwgY2RtX2FycmF5W2ldLm1hc2syOwotCX0KLX0KLQotdm9pZCBkb19rX21hc2soaW50IGksIGNoYXIgKnVuY2hlY2tlZF9rZXl3b3JkLCBfX3U2NCAqKnNhbmVfbWFzaykKLXsKLQotCWlmICghc3RyY21wKHNfa21vZF9rZXl3b3JkX21hc2tfbWFwW2ldLmtleXdvcmQsIHVuY2hlY2tlZF9rZXl3b3JkKSkKLQkJKipzYW5lX21hc2sgPSAoKipzYW5lX21hc2spIHwKLQkJCQlzX2ttb2Rfa2V5d29yZF9tYXNrX21hcFtpXS5tYXNrX3ZhbDsKLX0KZGlmZiAtLWdpdCBhL2ZzL29yYW5nZWZzL3Byb3RvY29sLmggYi9mcy9vcmFuZ2Vmcy9wcm90b2NvbC5oCmluZGV4IDNkNzQxOGMuLjk3MTMwN2EgMTAwNjQ0Ci0tLSBhL2ZzL29yYW5nZWZzL3Byb3RvY29sLmgKKysrIGIvZnMvb3JhbmdlZnMvcHJvdG9jb2wuaApAQCAtNCwyNiArNCw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CiAKLWV4dGVybiBzdHJ1Y3QgY2xpZW50X2RlYnVnX21hc2sgKmNkbV9hcnJheTsKLWV4dGVybiBjaGFyICpkZWJ1Z19oZWxwX3N0cmluZzsKLWV4dGVybiBpbnQgaGVscF9zdHJpbmdfaW5pdGlhbGl6ZWQ7Ci1leHRlcm4gc3RydWN0IGRlbnRyeSAqZGVidWdfZGlyOwotZXh0ZXJuIHN0cnVjdCBkZW50cnkgKmhlbHBfZmlsZV9kZW50cnk7Ci1leHRlcm4gc3RydWN0IGRlbnRyeSAqY2xpZW50X2RlYnVnX2RlbnRyeTsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnX2hlbHBfZm9wczsKLWV4dGVybiBpbnQgY2xpZW50X2FsbF9pbmRleDsKLWV4dGVybiBpbnQgY2xpZW50X3ZlcmJvc2VfaW5kZXg7Ci1leHRlcm4gaW50IGNkbV9lbGVtZW50X2NvdW50OwotI2RlZmluZSBERUJVR19IRUxQX1NUUklOR19TSVpFIDQwOTYKLSNkZWZpbmUgSEVMUF9TVFJJTkdfVU5JTklUSUFMSVpFRCBcCi0JIkNsaWVudCBEZWJ1ZyBLZXl3b3JkcyBhcmUgdW5rbm93biB1bnRpbCB0aGUgZmlyc3QgdGltZVxuIiBcCi0JInRoZSBjbGllbnQgaXMgc3RhcnRlZCBhZnRlciBib290LlxuIgotI2RlZmluZSBPUkFOR0VGU19LTU9EX0RFQlVHX0hFTFBfRklMRSAiZGVidWctaGVscCIKLSNkZWZpbmUgT1JBTkdFRlNfS01PRF9ERUJVR19GSUxFICJrZXJuZWwtZGVidWciCi0jZGVmaW5lIE9SQU5HRUZTX0NMSUVOVF9ERUJVR19GSUxFICJjbGllbnQtZGVidWciCi0jZGVmaW5lIE9SQU5HRUZTX1ZFUkJPU0UgInZlcmJvc2UiCi0jZGVmaW5lIE9SQU5HRUZTX0FMTCAiYWxsIgotCiAvKiBwdmZzMi1jb25maWcuaCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgT1JBTkdFRlNfVkVSU0lPTl9NQUpPUiAyCiAjZGVmaW5lIE9SQU5HRUZTX1ZFUlNJT05fTUlOT1IgOQpAQCAtNDI2LDEzICs0MDYsMTIgQEAKIAkJcHJpbnRrKEtFUk5fREVCVUcgZm10LCAjI19fVkFfQVJHU19fKTsJCQlcCiB9IHdoaWxlICgwKQogI2Vsc2UKLWV4dGVybiBfX3U2NCBnb3NzaXBfZGVidWdfbWFzazsKLWV4dGVybiBzdHJ1Y3QgY2xpZW50X2RlYnVnX21hc2sgY2xpZW50X2RlYnVnX21hc2s7CitleHRlcm4gX191NjQgb3JhbmdlZnNfZ29zc2lwX2RlYnVnX21hc2s7CiAKIC8qIHRyeSB0byBhdm9pZCBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkIGJ5IGNoZWNraW5nIG1hc2tzIGluIG1hY3JvICovCiAjZGVmaW5lIGdvc3NpcF9kZWJ1ZyhtYXNrLCBmbXQsIC4uLikJCQkJCVwKIGRvIHsJCQkJCQkJCQlcCi0JaWYgKGdvc3NpcF9kZWJ1Z19tYXNrICYgKG1hc2spKQkJCQkJXAorCWlmIChvcmFuZ2Vmc19nb3NzaXBfZGVidWdfbWFzayAmIChtYXNrKSkJCQlcCiAJCXByaW50ayhLRVJOX0RFQlVHIGZtdCwgIyNfX1ZBX0FSR1NfXyk7CQkJXAogfSB3aGlsZSAoMCkKICNlbmRpZiAvKiBHT1NTSVBfRElTQUJMRV9ERUJVRyAqLwpkaWZmIC0tZ2l0IGEvZnMvb3JhbmdlZnMvc3VwZXIuYyBiL2ZzL29yYW5nZWZzL3N1cGVyLmMKaW5kZXggYjlkYTlhMC4uYzQ4ODU5ZiAxMDA2NDQKLS0tIGEvZnMvb3JhbmdlZnMvc3VwZXIuYworKysgYi9mcy9vcmFuZ2Vmcy9zdXBlci5jCkBAIC0zMyw2ICszMyw3IEBACiAJeyBPcHRfZXJyLAlOVUxMIH0KIH07CiAKK3VpbnQ2NF90IG9yYW5nZWZzX2ZlYXR1cmVzOwogCiBzdGF0aWMgaW50IHBhcnNlX21vdW50X29wdGlvbnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY2hhciAqb3B0aW9ucywKIAkJaW50IHNpbGVudCkKQEAgLTI0OSw2ICsyNTAsMTkgQEAKIAl9CiAKIAlvcF9yZWxlYXNlKG5ld19vcCk7CisKKwlpZiAob3JhbmdlZnNfdXNlcnNwYWNlX3ZlcnNpb24gPj0gMjA5MDYpIHsKKwkJbmV3X29wID0gb3BfYWxsb2MoT1JBTkdFRlNfVkZTX09QX0ZFQVRVUkVTKTsKKwkJaWYgKCFuZXdfb3ApCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJbmV3X29wLT51cGNhbGwucmVxLmZlYXR1cmVzLmZlYXR1cmVzID0gMDsKKwkJcmV0ID0gc2VydmljZV9vcGVyYXRpb24obmV3X29wLCAib3JhbmdlZnNfZmVhdHVyZXMiLCAwKTsKKwkJb3JhbmdlZnNfZmVhdHVyZXMgPSBuZXdfb3AtPmRvd25jYWxsLnJlc3AuZmVhdHVyZXMuZmVhdHVyZXM7CisJCW9wX3JlbGVhc2UobmV3X29wKTsKKwl9IGVsc2UgeworCQlvcmFuZ2Vmc19mZWF0dXJlcyA9IDA7CisJfQorCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDkyLDYgKzUwNiwxOSBAQAogCWxpc3RfYWRkX3RhaWwoJk9SQU5HRUZTX1NCKHNiKS0+bGlzdCwgJm9yYW5nZWZzX3N1cGVyYmxvY2tzKTsKIAlzcGluX3VubG9jaygmb3JhbmdlZnNfc3VwZXJibG9ja3NfbG9jayk7CiAJb3BfcmVsZWFzZShuZXdfb3ApOworCisJaWYgKG9yYW5nZWZzX3VzZXJzcGFjZV92ZXJzaW9uID49IDIwOTA2KSB7CisJCW5ld19vcCA9IG9wX2FsbG9jKE9SQU5HRUZTX1ZGU19PUF9GRUFUVVJFUyk7CisJCWlmICghbmV3X29wKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJCW5ld19vcC0+dXBjYWxsLnJlcS5mZWF0dXJlcy5mZWF0dXJlcyA9IDA7CisJCXJldCA9IHNlcnZpY2Vfb3BlcmF0aW9uKG5ld19vcCwgIm9yYW5nZWZzX2ZlYXR1cmVzIiwgMCk7CisJCW9yYW5nZWZzX2ZlYXR1cmVzID0gbmV3X29wLT5kb3duY2FsbC5yZXNwLmZlYXR1cmVzLmZlYXR1cmVzOworCQlvcF9yZWxlYXNlKG5ld19vcCk7CisJfSBlbHNlIHsKKwkJb3JhbmdlZnNfZmVhdHVyZXMgPSAwOworCX0KKwogCXJldHVybiBkZ2V0KHNiLT5zX3Jvb3QpOwogCiBmcmVlX29wOgpAQCAtNTMwLDggKzU1Nyw4IEBACiAJICogbWFrZSBzdXJlIHRoYXQgT1JBTkdFRlNfREVWX1JFTU9VTlRfQUxMIGxvb3AgdGhhdCBtaWdodCd2ZSBzZWVuIHVzCiAJICogZ2V0cyBjb21wbGV0ZWQgYmVmb3JlIHdlIGZyZWUgdGhlIGRhbmcgdGhpbmcuCiAJICovCi0JbXV0ZXhfbG9jaygmcmVxdWVzdF9tdXRleCk7Ci0JbXV0ZXhfdW5sb2NrKCZyZXF1ZXN0X211dGV4KTsKKwltdXRleF9sb2NrKCZvcmFuZ2Vmc19yZXF1ZXN0X211dGV4KTsKKwltdXRleF91bmxvY2soJm9yYW5nZWZzX3JlcXVlc3RfbXV0ZXgpOwogCiAJLyogZnJlZSB0aGUgb3JhbmdlZnMgc3VwZXJibG9jayBwcml2YXRlIGRhdGEgKi8KIAlrZnJlZShPUkFOR0VGU19TQihzYikpOwpkaWZmIC0tZ2l0IGEvZnMvb3JhbmdlZnMvdXBjYWxsLmggYi9mcy9vcmFuZ2Vmcy91cGNhbGwuaAppbmRleCAwMDFiMjAyLi5hZjBiMGUzIDEwMDY0NAotLS0gYS9mcy9vcmFuZ2Vmcy91cGNhbGwuaAorKysgYi9mcy9vcmFuZ2Vmcy91cGNhbGwuaApAQCAtOTgsNyArOTgsNyBAQAogCV9fczY0IHNpemU7CiB9OwogCi1zdHJ1Y3Qgb3JhbmdlZnNfbW1hcF9yYV9jYWNoZV9mbHVzaF9yZXF1ZXN0X3Mgeworc3RydWN0IG9yYW5nZWZzX3JhX2NhY2hlX2ZsdXNoX3JlcXVlc3RfcyB7CiAJc3RydWN0IG9yYW5nZWZzX29iamVjdF9rcmVmIHJlZm47CiB9OwogCkBAIC0xNzksMTIgKzE3OSwxOCBAQAogCU9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfQ0FQQ0FDSEVfU09GVF9MSU1JVCA9IDIzLAogCU9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfQ0FQQ0FDSEVfUkVDTEFJTV9QRVJDRU5UQUdFID0gMjQsCiAJT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9UV09fTUFTS19WQUxVRVMgPSAyNSwKKwlPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX1JFQURBSEVBRF9TSVpFID0gMjYsCisJT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9SRUFEQUhFQURfQ09VTlQgPSAyNywKKwlPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX1JFQURBSEVBRF9DT1VOVF9TSVpFID0gMjgsCiB9OwogCiBzdHJ1Y3Qgb3JhbmdlZnNfcGFyYW1fcmVxdWVzdF9zIHsKIAllbnVtIG9yYW5nZWZzX3BhcmFtX3JlcXVlc3RfdHlwZSB0eXBlOwogCWVudW0gb3JhbmdlZnNfcGFyYW1fcmVxdWVzdF9vcCBvcDsKLQlfX3M2NCB2YWx1ZTsKKwl1bmlvbiB7CisJCV9fczY0IHZhbHVlNjQ7CisJCV9fczMyIHZhbHVlMzJbMl07CisJfSB1OwogCWNoYXIgc192YWx1ZVtPUkFOR0VGU19NQVhfREVCVUdfU1RSSU5HX0xFTl07CiB9OwogCkBAIC0yMDQsNiArMjEwLDExIEBACiAJX19zMzIgX19wYWQxOwogfTsKIAorLyogMi45LjYgKi8KK3N0cnVjdCBvcmFuZ2Vmc19mZWF0dXJlc19yZXF1ZXN0X3MgeworCV9fdTY0IGZlYXR1cmVzOworfTsKKwogc3RydWN0IG9yYW5nZWZzX3VwY2FsbF9zIHsKIAlfX3MzMiB0eXBlOwogCV9fdTMyIHVpZDsKQEAgLTIyOCw3ICsyMzksNyBAQAogCQlzdHJ1Y3Qgb3JhbmdlZnNfcmVuYW1lX3JlcXVlc3RfcyByZW5hbWU7CiAJCXN0cnVjdCBvcmFuZ2Vmc19zdGF0ZnNfcmVxdWVzdF9zIHN0YXRmczsKIAkJc3RydWN0IG9yYW5nZWZzX3RydW5jYXRlX3JlcXVlc3RfcyB0cnVuY2F0ZTsKLQkJc3RydWN0IG9yYW5nZWZzX21tYXBfcmFfY2FjaGVfZmx1c2hfcmVxdWVzdF9zIHJhX2NhY2hlX2ZsdXNoOworCQlzdHJ1Y3Qgb3JhbmdlZnNfcmFfY2FjaGVfZmx1c2hfcmVxdWVzdF9zIHJhX2NhY2hlX2ZsdXNoOwogCQlzdHJ1Y3Qgb3JhbmdlZnNfZnNfbW91bnRfcmVxdWVzdF9zIGZzX21vdW50OwogCQlzdHJ1Y3Qgb3JhbmdlZnNfZnNfdW1vdW50X3JlcXVlc3RfcyBmc191bW91bnQ7CiAJCXN0cnVjdCBvcmFuZ2Vmc19nZXR4YXR0cl9yZXF1ZXN0X3MgZ2V0eGF0dHI7CkBAIC0yNDAsNiArMjUxLDcgQEAKIAkJc3RydWN0IG9yYW5nZWZzX3BhcmFtX3JlcXVlc3RfcyBwYXJhbTsKIAkJc3RydWN0IG9yYW5nZWZzX3BlcmZfY291bnRfcmVxdWVzdF9zIHBlcmZfY291bnQ7CiAJCXN0cnVjdCBvcmFuZ2Vmc19mc19rZXlfcmVxdWVzdF9zIGZzX2tleTsKKwkJc3RydWN0IG9yYW5nZWZzX2ZlYXR1cmVzX3JlcXVlc3RfcyBmZWF0dXJlczsKIAl9IHJlcTsKIH07CiAKZGlmZiAtLWdpdCBhL2ZzL29yYW5nZWZzL3dhaXRxdWV1ZS5jIGIvZnMvb3JhbmdlZnMvd2FpdHF1ZXVlLmMKaW5kZXggMzE2MzViYy4uYWJjZmEzZiAxMDA2NDQKLS0tIGEvZnMvb3JhbmdlZnMvd2FpdHF1ZXVlLmMKKysrIGIvZnMvb3JhbmdlZnMvd2FpdHF1ZXVlLmMKQEAgLTg3LDkgKzg3LDkgQEAKIAkgKi8KIAlpZiAoIShmbGFncyAmIE9SQU5HRUZTX09QX05PX01VVEVYKSkgewogCQlpZiAoZmxhZ3MgJiBPUkFOR0VGU19PUF9JTlRFUlJVUFRJQkxFKQotCQkJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZyZXF1ZXN0X211dGV4KTsKKwkJCXJldCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmb3JhbmdlZnNfcmVxdWVzdF9tdXRleCk7CiAJCWVsc2UKLQkJCXJldCA9IG11dGV4X2xvY2tfa2lsbGFibGUoJnJlcXVlc3RfbXV0ZXgpOworCQkJcmV0ID0gbXV0ZXhfbG9ja19raWxsYWJsZSgmb3JhbmdlZnNfcmVxdWVzdF9tdXRleCk7CiAJCS8qCiAJCSAqIGNoZWNrIHRvIHNlZSBpZiB3ZSB3ZXJlIGludGVycnVwdGVkIHdoaWxlIHdhaXRpbmcgZm9yCiAJCSAqIG11dGV4CkBAIC0xMjksNyArMTI5LDcgQEAKIAlzcGluX3VubG9jaygmb3JhbmdlZnNfcmVxdWVzdF9saXN0X2xvY2spOwogCiAJaWYgKCEoZmxhZ3MgJiBPUkFOR0VGU19PUF9OT19NVVRFWCkpCi0JCW11dGV4X3VubG9jaygmcmVxdWVzdF9tdXRleCk7CisJCW11dGV4X3VubG9jaygmb3JhbmdlZnNfcmVxdWVzdF9tdXRleCk7CiAKIAlyZXQgPSB3YWl0X2Zvcl9tYXRjaGluZ19kb3duY2FsbChvcCwgdGltZW91dCwKIAkJCQkJIGZsYWdzICYgT1JBTkdFRlNfT1BfSU5URVJSVVBUSUJMRSk7CkBAIC0yNzIsOSArMjcyLDkgQEAKIAl9IGVsc2UgaWYgKG9wX3N0YXRlX2luX3Byb2dyZXNzKG9wKSkgewogCQkvKiBvcCBtdXN0IGJlIHJlbW92ZWQgZnJvbSB0aGUgaW4gcHJvZ3Jlc3MgaHRhYmxlICovCiAJCXNwaW5fdW5sb2NrKCZvcC0+bG9jayk7Ci0JCXNwaW5fbG9jaygmaHRhYmxlX29wc19pbl9wcm9ncmVzc19sb2NrKTsKKwkJc3Bpbl9sb2NrKCZvcmFuZ2Vmc19odGFibGVfb3BzX2luX3Byb2dyZXNzX2xvY2spOwogCQlsaXN0X2RlbF9pbml0KCZvcC0+bGlzdCk7Ci0JCXNwaW5fdW5sb2NrKCZodGFibGVfb3BzX2luX3Byb2dyZXNzX2xvY2spOworCQlzcGluX3VubG9jaygmb3JhbmdlZnNfaHRhYmxlX29wc19pbl9wcm9ncmVzc19sb2NrKTsKIAkJZ29zc2lwX2RlYnVnKEdPU1NJUF9XQUlUX0RFQlVHLAogCQkJICAgICAiSW50ZXJydXB0ZWQ6IFJlbW92ZWQgb3AgJXAiCiAJCQkgICAgICIgZnJvbSBodGFibGVfb3BzX2luX3Byb2dyZXNzXG4iLApkaWZmIC0tZ2l0IGEvZnMvb3ZlcmxheWZzL2NvcHlfdXAuYyBiL2ZzL292ZXJsYXlmcy9jb3B5X3VwLmMKaW5kZXggNTRlNWQ2Ni4uZGIzN2EwZSAxMDA2NDQKLS0tIGEvZnMvb3ZlcmxheWZzL2NvcHlfdXAuYworKysgYi9mcy9vdmVybGF5ZnMvY29weV91cC5jCkBAIC04MCw2ICs4MCw4IEBACiAJfQogCiAJZm9yIChuYW1lID0gYnVmOyBuYW1lIDwgKGJ1ZiArIGxpc3Rfc2l6ZSk7IG5hbWUgKz0gc3RybGVuKG5hbWUpICsgMSkgeworCQlpZiAob3ZsX2lzX3ByaXZhdGVfeGF0dHIobmFtZSkpCisJCQljb250aW51ZTsKIHJldHJ5OgogCQlzaXplID0gdmZzX2dldHhhdHRyKG9sZCwgbmFtZSwgdmFsdWUsIHZhbHVlX3NpemUpOwogCQlpZiAoc2l6ZSA9PSAtRVJBTkdFKQpAQCAtMTAzLDYgKzEwNSwxMyBAQAogCQkJZ290byByZXRyeTsKIAkJfQogCisJCWVycm9yID0gc2VjdXJpdHlfaW5vZGVfY29weV91cF94YXR0cihuYW1lKTsKKwkJaWYgKGVycm9yIDwgMCAmJiBlcnJvciAhPSAtRU9QTk9UU1VQUCkKKwkJCWJyZWFrOworCQlpZiAoZXJyb3IgPT0gMSkgeworCQkJZXJyb3IgPSAwOworCQkJY29udGludWU7IC8qIERpc2NhcmQgKi8KKwkJfQogCQllcnJvciA9IHZmc19zZXR4YXR0cihuZXcsIG5hbWUsIHZhbHVlLCBzaXplLCAwKTsKIAkJaWYgKGVycm9yKQogCQkJYnJlYWs7CkBAIC0yNDYsNiArMjU1LDggQEAKIAlzdHJ1Y3QgZGVudHJ5ICp1cHBlciA9IE5VTEw7CiAJdW1vZGVfdCBtb2RlID0gc3RhdC0+bW9kZTsKIAlpbnQgZXJyOworCWNvbnN0IHN0cnVjdCBjcmVkICpvbGRfY3JlZHMgPSBOVUxMOworCXN0cnVjdCBjcmVkICpuZXdfY3JlZHMgPSBOVUxMOwogCiAJbmV3ZGVudHJ5ID0gb3ZsX2xvb2t1cF90ZW1wKHdvcmtkaXIsIGRlbnRyeSk7CiAJZXJyID0gUFRSX0VSUihuZXdkZW50cnkpOwpAQCAtMjU4LDEwICsyNjksMjMgQEAKIAlpZiAoSVNfRVJSKHVwcGVyKSkKIAkJZ290byBvdXQxOwogCisJZXJyID0gc2VjdXJpdHlfaW5vZGVfY29weV91cChkZW50cnksICZuZXdfY3JlZHMpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDI7CisKKwlpZiAobmV3X2NyZWRzKQorCQlvbGRfY3JlZHMgPSBvdmVycmlkZV9jcmVkcyhuZXdfY3JlZHMpOworCiAJLyogQ2FuJ3QgcHJvcGVybHkgc2V0IG1vZGUgb24gY3JlYXRpb24gYmVjYXVzZSBvZiB0aGUgdW1hc2sgKi8KIAlzdGF0LT5tb2RlICY9IFNfSUZNVDsKIAllcnIgPSBvdmxfY3JlYXRlX3JlYWwod2RpciwgbmV3ZGVudHJ5LCBzdGF0LCBsaW5rLCBOVUxMLCB0cnVlKTsKIAlzdGF0LT5tb2RlID0gbW9kZTsKKworCWlmIChuZXdfY3JlZHMpIHsKKwkJcmV2ZXJ0X2NyZWRzKG9sZF9jcmVkcyk7CisJCXB1dF9jcmVkKG5ld19jcmVkcyk7CisJfQorCiAJaWYgKGVycikKIAkJZ290byBvdXQyOwogCmRpZmYgLS1naXQgYS9mcy9vdmVybGF5ZnMvZGlyLmMgYi9mcy9vdmVybGF5ZnMvZGlyLmMKaW5kZXggMTJiY2QwNy4uYjBmZmExZCAxMDA2NDQKLS0tIGEvZnMvb3ZlcmxheWZzL2Rpci5jCisrKyBiL2ZzL292ZXJsYXlmcy9kaXIuYwpAQCAtMTIsNiArMTIsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9jcmVkLmg+CisjaW5jbHVkZSA8bGludXgvcG9zaXhfYWNsLmg+CisjaW5jbHVkZSA8bGludXgvcG9zaXhfYWNsX3hhdHRyLmg+CiAjaW5jbHVkZSAib3ZlcmxheWZzLmgiCiAKIHZvaWQgb3ZsX2NsZWFudXAoc3RydWN0IGlub2RlICp3ZGlyLCBzdHJ1Y3QgZGVudHJ5ICp3ZGVudHJ5KQpAQCAtMTg2LDYgKzE4OCw5IEBACiAJc3RydWN0IGRlbnRyeSAqbmV3ZGVudHJ5OwogCWludCBlcnI7CiAKKwlpZiAoIWhhcmRsaW5rICYmICFJU19QT1NJWEFDTCh1ZGlyKSkKKwkJc3RhdC0+bW9kZSAmPSB+Y3VycmVudF91bWFzaygpOworCiAJaW5vZGVfbG9ja19uZXN0ZWQodWRpciwgSV9NVVRFWF9QQVJFTlQpOwogCW5ld2RlbnRyeSA9IGxvb2t1cF9vbmVfbGVuKGRlbnRyeS0+ZF9uYW1lLm5hbWUsIHVwcGVyZGlyLAogCQkJCSAgIGRlbnRyeS0+ZF9uYW1lLmxlbik7CkBAIC0zMzUsNiArMzQwLDMyIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBvdmxfc2V0X3VwcGVyX2FjbChzdHJ1Y3QgZGVudHJ5ICp1cHBlcmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICAgY29uc3Qgc3RydWN0IHBvc2l4X2FjbCAqYWNsKQoreworCXZvaWQgKmJ1ZmZlcjsKKwlzaXplX3Qgc2l6ZTsKKwlpbnQgZXJyOworCisJaWYgKCFJU19FTkFCTEVEKENPTkZJR19GU19QT1NJWF9BQ0wpIHx8ICFhY2wpCisJCXJldHVybiAwOworCisJc2l6ZSA9IHBvc2l4X2FjbF90b194YXR0cihOVUxMLCBhY2wsIE5VTEwsIDApOworCWJ1ZmZlciA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWZmZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJc2l6ZSA9IHBvc2l4X2FjbF90b194YXR0cigmaW5pdF91c2VyX25zLCBhY2wsIGJ1ZmZlciwgc2l6ZSk7CisJZXJyID0gc2l6ZTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXRfZnJlZTsKKworCWVyciA9IHZmc19zZXR4YXR0cih1cHBlcmRlbnRyeSwgbmFtZSwgYnVmZmVyLCBzaXplLCBYQVRUUl9DUkVBVEUpOworb3V0X2ZyZWU6CisJa2ZyZWUoYnVmZmVyKTsKKwlyZXR1cm4gZXJyOworfQorCiBzdGF0aWMgaW50IG92bF9jcmVhdGVfb3Zlcl93aGl0ZW91dChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICAgIHN0cnVjdCBrc3RhdCAqc3RhdCwgY29uc3QgY2hhciAqbGluaywKIAkJCQkgICAgc3RydWN0IGRlbnRyeSAqaGFyZGxpbmspCkBAIC0zNDYsMTAgKzM3NywxOCBAQAogCXN0cnVjdCBkZW50cnkgKnVwcGVyOwogCXN0cnVjdCBkZW50cnkgKm5ld2RlbnRyeTsKIAlpbnQgZXJyOworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgKmRlZmF1bHRfYWNsOwogCiAJaWYgKFdBUk5fT04oIXdvcmtkaXIpKQogCQlyZXR1cm4gLUVST0ZTOwogCisJaWYgKCFoYXJkbGluaykgeworCQllcnIgPSBwb3NpeF9hY2xfY3JlYXRlKGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGUsCisJCQkJICAgICAgICZzdGF0LT5tb2RlLCAmZGVmYXVsdF9hY2wsICZhY2wpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKIAllcnIgPSBvdmxfbG9ja19yZW5hbWVfd29ya2Rpcih3b3JrZGlyLCB1cHBlcmRpcik7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CkBAIC0zODQsNiArNDIzLDE3IEBACiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dF9jbGVhbnVwOwogCX0KKwlpZiAoIWhhcmRsaW5rKSB7CisJCWVyciA9IG92bF9zZXRfdXBwZXJfYWNsKG5ld2RlbnRyeSwgWEFUVFJfTkFNRV9QT1NJWF9BQ0xfQUNDRVNTLAorCQkJCQlhY2wpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfY2xlYW51cDsKKworCQllcnIgPSBvdmxfc2V0X3VwcGVyX2FjbChuZXdkZW50cnksIFhBVFRSX05BTUVfUE9TSVhfQUNMX0RFRkFVTFQsCisJCQkJCWRlZmF1bHRfYWNsKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2NsZWFudXA7CisJfQogCiAJaWYgKCFoYXJkbGluayAmJiBTX0lTRElSKHN0YXQtPm1vZGUpKSB7CiAJCWVyciA9IG92bF9zZXRfb3BhcXVlKG5ld2RlbnRyeSk7CkBAIC00MTAsNiArNDYwLDEwIEBACiBvdXRfdW5sb2NrOgogCXVubG9ja19yZW5hbWUod29ya2RpciwgdXBwZXJkaXIpOwogb3V0OgorCWlmICghaGFyZGxpbmspIHsKKwkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKwkJcG9zaXhfYWNsX3JlbGVhc2UoZGVmYXVsdF9hY2wpOworCX0KIAlyZXR1cm4gZXJyOwogCiBvdXRfY2xlYW51cDoKQEAgLTQzNSw2ICs0ODksMTUgQEAKIAlpZiAob3ZlcnJpZGVfY3JlZCkgewogCQlvdmVycmlkZV9jcmVkLT5mc3VpZCA9IGlub2RlLT5pX3VpZDsKIAkJb3ZlcnJpZGVfY3JlZC0+ZnNnaWQgPSBpbm9kZS0+aV9naWQ7CisJCWlmICghaGFyZGxpbmspIHsKKwkJCWVyciA9IHNlY3VyaXR5X2RlbnRyeV9jcmVhdGVfZmlsZXNfYXMoZGVudHJ5LAorCQkJCQlzdGF0LT5tb2RlLCAmZGVudHJ5LT5kX25hbWUsIG9sZF9jcmVkLAorCQkJCQlvdmVycmlkZV9jcmVkKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlwdXRfY3JlZChvdmVycmlkZV9jcmVkKTsKKwkJCQlnb3RvIG91dF9yZXZlcnRfY3JlZHM7CisJCQl9CisJCX0KIAkJcHV0X2NyZWQob3ZlcnJpZGVfY3JlZHMob3ZlcnJpZGVfY3JlZCkpOwogCQlwdXRfY3JlZChvdmVycmlkZV9jcmVkKTsKIApAQCAtNDQ1LDYgKzUwOCw3IEBACiAJCQllcnIgPSBvdmxfY3JlYXRlX292ZXJfd2hpdGVvdXQoZGVudHJ5LCBpbm9kZSwgc3RhdCwKIAkJCQkJCQlsaW5rLCBoYXJkbGluayk7CiAJfQorb3V0X3JldmVydF9jcmVkczoKIAlyZXZlcnRfY3JlZHMob2xkX2NyZWQpOwogCWlmICghZXJyKSB7CiAJCXN0cnVjdCBpbm9kZSAqcmVhbGlub2RlID0gZF9pbm9kZShvdmxfZGVudHJ5X3VwcGVyKGRlbnRyeSkpOwpAQCAtOTUwLDkgKzEwMTQsOSBAQAogCS5wZXJtaXNzaW9uCT0gb3ZsX3Blcm1pc3Npb24sCiAJLmdldGF0dHIJPSBvdmxfZGlyX2dldGF0dHIsCiAJLnNldHhhdHRyCT0gZ2VuZXJpY19zZXR4YXR0ciwKLQkuZ2V0eGF0dHIJPSBvdmxfZ2V0eGF0dHIsCisJLmdldHhhdHRyCT0gZ2VuZXJpY19nZXR4YXR0ciwKIAkubGlzdHhhdHRyCT0gb3ZsX2xpc3R4YXR0ciwKLQkucmVtb3ZleGF0dHIJPSBvdmxfcmVtb3ZleGF0dHIsCisJLnJlbW92ZXhhdHRyCT0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKIAkuZ2V0X2FjbAk9IG92bF9nZXRfYWNsLAogCS51cGRhdGVfdGltZQk9IG92bF91cGRhdGVfdGltZSwKIH07CmRpZmYgLS1naXQgYS9mcy9vdmVybGF5ZnMvaW5vZGUuYyBiL2ZzL292ZXJsYXlmcy9pbm9kZS5jCmluZGV4IDFiODg1YzEuLmM3NTYyNWMgMTAwNjQ0Ci0tLSBhL2ZzL292ZXJsYXlmcy9pbm9kZS5jCisrKyBiL2ZzL292ZXJsYXlmcy9pbm9kZS5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2wuaD4KICNpbmNsdWRlICJvdmVybGF5ZnMuaCIKIAogc3RhdGljIGludCBvdmxfY29weV91cF90cnVuY2F0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCkBAIC0xOTEsMzIgKzE5Miw0NCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBib29sIG92bF9pc19wcml2YXRlX3hhdHRyKGNvbnN0IGNoYXIgKm5hbWUpCitib29sIG92bF9pc19wcml2YXRlX3hhdHRyKGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0jZGVmaW5lIE9WTF9YQVRUUl9QUkVfTkFNRSBPVkxfWEFUVFJfUFJFRklYICIuIgotCXJldHVybiBzdHJuY21wKG5hbWUsIE9WTF9YQVRUUl9QUkVfTkFNRSwKLQkJICAgICAgIHNpemVvZihPVkxfWEFUVFJfUFJFX05BTUUpIC0gMSkgPT0gMDsKKwlyZXR1cm4gc3RybmNtcChuYW1lLCBPVkxfWEFUVFJfUFJFRklYLAorCQkgICAgICAgc2l6ZW9mKE9WTF9YQVRUUl9QUkVGSVgpIC0gMSkgPT0gMDsKIH0KIAotaW50IG92bF9zZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCSBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICp2YWx1ZSwKLQkJIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCitpbnQgb3ZsX3hhdHRyX3NldChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLAorCQkgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCiB7CiAJaW50IGVycjsKLQlzdHJ1Y3QgZGVudHJ5ICp1cHBlcmRlbnRyeTsKKwlzdHJ1Y3QgcGF0aCByZWFscGF0aDsKKwllbnVtIG92bF9wYXRoX3R5cGUgdHlwZSA9IG92bF9wYXRoX3JlYWwoZGVudHJ5LCAmcmVhbHBhdGgpOwogCWNvbnN0IHN0cnVjdCBjcmVkICpvbGRfY3JlZDsKIAogCWVyciA9IG92bF93YW50X3dyaXRlKGRlbnRyeSk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKKwlpZiAoIXZhbHVlICYmICFPVkxfVFlQRV9VUFBFUih0eXBlKSkgeworCQllcnIgPSB2ZnNfZ2V0eGF0dHIocmVhbHBhdGguZGVudHJ5LCBuYW1lLCBOVUxMLCAwKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIG91dF9kcm9wX3dyaXRlOworCX0KKwogCWVyciA9IG92bF9jb3B5X3VwKGRlbnRyeSk7CiAJaWYgKGVycikKIAkJZ290byBvdXRfZHJvcF93cml0ZTsKIAotCXVwcGVyZGVudHJ5ID0gb3ZsX2RlbnRyeV91cHBlcihkZW50cnkpOworCWlmICghT1ZMX1RZUEVfVVBQRVIodHlwZSkpCisJCW92bF9wYXRoX3VwcGVyKGRlbnRyeSwgJnJlYWxwYXRoKTsKKwogCW9sZF9jcmVkID0gb3ZsX292ZXJyaWRlX2NyZWRzKGRlbnRyeS0+ZF9zYik7Ci0JZXJyID0gdmZzX3NldHhhdHRyKHVwcGVyZGVudHJ5LCBuYW1lLCB2YWx1ZSwgc2l6ZSwgZmxhZ3MpOworCWlmICh2YWx1ZSkKKwkJZXJyID0gdmZzX3NldHhhdHRyKHJlYWxwYXRoLmRlbnRyeSwgbmFtZSwgdmFsdWUsIHNpemUsIGZsYWdzKTsKKwllbHNlIHsKKwkJV0FSTl9PTihmbGFncyAhPSBYQVRUUl9SRVBMQUNFKTsKKwkJZXJyID0gdmZzX3JlbW92ZXhhdHRyKHJlYWxwYXRoLmRlbnRyeSwgbmFtZSk7CisJfQogCXJldmVydF9jcmVkcyhvbGRfY3JlZCk7CiAKIG91dF9kcm9wX3dyaXRlOgpAQCAtMjI1LDE2ICsyMzgsMTMgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zc2l6ZV90IG92bF9nZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCSAgICAgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplKQoraW50IG92bF94YXR0cl9nZXQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lLAorCQkgIHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpyZWFsZGVudHJ5ID0gb3ZsX2RlbnRyeV9yZWFsKGRlbnRyeSk7CiAJc3NpemVfdCByZXM7CiAJY29uc3Qgc3RydWN0IGNyZWQgKm9sZF9jcmVkOwogCi0JaWYgKG92bF9pc19wcml2YXRlX3hhdHRyKG5hbWUpKQotCQlyZXR1cm4gLUVOT0RBVEE7Ci0KIAlvbGRfY3JlZCA9IG92bF9vdmVycmlkZV9jcmVkcyhkZW50cnktPmRfc2IpOwogCXJlcyA9IHZmc19nZXR4YXR0cihyZWFsZGVudHJ5LCBuYW1lLCB2YWx1ZSwgc2l6ZSk7CiAJcmV2ZXJ0X2NyZWRzKG9sZF9jcmVkKTsKQEAgLTI0NSw3ICsyNTUsOCBAQAogewogCXN0cnVjdCBkZW50cnkgKnJlYWxkZW50cnkgPSBvdmxfZGVudHJ5X3JlYWwoZGVudHJ5KTsKIAlzc2l6ZV90IHJlczsKLQlpbnQgb2ZmOworCXNpemVfdCBsZW47CisJY2hhciAqczsKIAljb25zdCBzdHJ1Y3QgY3JlZCAqb2xkX2NyZWQ7CiAKIAlvbGRfY3JlZCA9IG92bF9vdmVycmlkZV9jcmVkcyhkZW50cnktPmRfc2IpOwpAQCAtMjU1LDczICsyNjYsMzkgQEAKIAkJcmV0dXJuIHJlczsKIAogCS8qIGZpbHRlciBvdXQgcHJpdmF0ZSB4YXR0cnMgKi8KLQlmb3IgKG9mZiA9IDA7IG9mZiA8IHJlczspIHsKLQkJY2hhciAqcyA9IGxpc3QgKyBvZmY7Ci0JCXNpemVfdCBzbGVuID0gc3RybGVuKHMpICsgMTsKKwlmb3IgKHMgPSBsaXN0LCBsZW4gPSByZXM7IGxlbjspIHsKKwkJc2l6ZV90IHNsZW4gPSBzdHJubGVuKHMsIGxlbikgKyAxOwogCi0JCUJVR19PTihvZmYgKyBzbGVuID4gcmVzKTsKKwkJLyogdW5kZXJseWluZyBmcyBwcm92aWRpbmcgdXMgd2l0aCBhbiBicm9rZW4geGF0dHIgbGlzdD8gKi8KKwkJaWYgKFdBUk5fT04oc2xlbiA+IGxlbikpCisJCQlyZXR1cm4gLUVJTzsKIAorCQlsZW4gLT0gc2xlbjsKIAkJaWYgKG92bF9pc19wcml2YXRlX3hhdHRyKHMpKSB7CiAJCQlyZXMgLT0gc2xlbjsKLQkJCW1lbW1vdmUocywgcyArIHNsZW4sIHJlcyAtIG9mZik7CisJCQltZW1tb3ZlKHMsIHMgKyBzbGVuLCBsZW4pOwogCQl9IGVsc2UgewotCQkJb2ZmICs9IHNsZW47CisJCQlzICs9IHNsZW47CiAJCX0KIAl9CiAKIAlyZXR1cm4gcmVzOwogfQogCi1pbnQgb3ZsX3JlbW92ZXhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSkKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCBwYXRoIHJlYWxwYXRoOwotCWVudW0gb3ZsX3BhdGhfdHlwZSB0eXBlID0gb3ZsX3BhdGhfcmVhbChkZW50cnksICZyZWFscGF0aCk7Ci0JY29uc3Qgc3RydWN0IGNyZWQgKm9sZF9jcmVkOwotCi0JZXJyID0gb3ZsX3dhbnRfd3JpdGUoZGVudHJ5KTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDsKLQotCWVyciA9IC1FTk9EQVRBOwotCWlmIChvdmxfaXNfcHJpdmF0ZV94YXR0cihuYW1lKSkKLQkJZ290byBvdXRfZHJvcF93cml0ZTsKLQotCWlmICghT1ZMX1RZUEVfVVBQRVIodHlwZSkpIHsKLQkJZXJyID0gdmZzX2dldHhhdHRyKHJlYWxwYXRoLmRlbnRyeSwgbmFtZSwgTlVMTCwgMCk7Ci0JCWlmIChlcnIgPCAwKQotCQkJZ290byBvdXRfZHJvcF93cml0ZTsKLQotCQllcnIgPSBvdmxfY29weV91cChkZW50cnkpOwotCQlpZiAoZXJyKQotCQkJZ290byBvdXRfZHJvcF93cml0ZTsKLQotCQlvdmxfcGF0aF91cHBlcihkZW50cnksICZyZWFscGF0aCk7Ci0JfQotCi0Jb2xkX2NyZWQgPSBvdmxfb3ZlcnJpZGVfY3JlZHMoZGVudHJ5LT5kX3NiKTsKLQllcnIgPSB2ZnNfcmVtb3ZleGF0dHIocmVhbHBhdGguZGVudHJ5LCBuYW1lKTsKLQlyZXZlcnRfY3JlZHMob2xkX2NyZWQpOwotb3V0X2Ryb3Bfd3JpdGU6Ci0Jb3ZsX2Ryb3Bfd3JpdGUoZGVudHJ5KTsKLW91dDoKLQlyZXR1cm4gZXJyOwotfQotCiBzdHJ1Y3QgcG9zaXhfYWNsICpvdmxfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKIHsKIAlzdHJ1Y3QgaW5vZGUgKnJlYWxpbm9kZSA9IG92bF9pbm9kZV9yZWFsKGlub2RlLCBOVUxMKTsKIAljb25zdCBzdHJ1Y3QgY3JlZCAqb2xkX2NyZWQ7CiAJc3RydWN0IHBvc2l4X2FjbCAqYWNsOwogCi0JaWYgKCFJU19QT1NJWEFDTChyZWFsaW5vZGUpKQorCWlmICghSVNfRU5BQkxFRChDT05GSUdfRlNfUE9TSVhfQUNMKSB8fCAhSVNfUE9TSVhBQ0wocmVhbGlub2RlKSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlpZiAoIXJlYWxpbm9kZS0+aV9vcC0+Z2V0X2FjbCkKIAkJcmV0dXJuIE5VTEw7CiAKIAlvbGRfY3JlZCA9IG92bF9vdmVycmlkZV9jcmVkcyhpbm9kZS0+aV9zYik7Ci0JYWNsID0gcmVhbGlub2RlLT5pX29wLT5nZXRfYWNsKHJlYWxpbm9kZSwgdHlwZSk7CisJYWNsID0gZ2V0X2FjbChyZWFsaW5vZGUsIHR5cGUpOwogCXJldmVydF9jcmVkcyhvbGRfY3JlZCk7CiAKIAlyZXR1cm4gYWNsOwpAQCAtMzkxLDkgKzM2OCw5IEBACiAJLnBlcm1pc3Npb24JPSBvdmxfcGVybWlzc2lvbiwKIAkuZ2V0YXR0cgk9IG92bF9nZXRhdHRyLAogCS5zZXR4YXR0cgk9IGdlbmVyaWNfc2V0eGF0dHIsCi0JLmdldHhhdHRyCT0gb3ZsX2dldHhhdHRyLAorCS5nZXR4YXR0cgk9IGdlbmVyaWNfZ2V0eGF0dHIsCiAJLmxpc3R4YXR0cgk9IG92bF9saXN0eGF0dHIsCi0JLnJlbW92ZXhhdHRyCT0gb3ZsX3JlbW92ZXhhdHRyLAorCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCiAJLmdldF9hY2wJPSBvdmxfZ2V0X2FjbCwKIAkudXBkYXRlX3RpbWUJPSBvdmxfdXBkYXRlX3RpbWUsCiB9OwpAQCAtNDA0LDkgKzM4MSw5IEBACiAJLnJlYWRsaW5rCT0gb3ZsX3JlYWRsaW5rLAogCS5nZXRhdHRyCT0gb3ZsX2dldGF0dHIsCiAJLnNldHhhdHRyCT0gZ2VuZXJpY19zZXR4YXR0ciwKLQkuZ2V0eGF0dHIJPSBvdmxfZ2V0eGF0dHIsCisJLmdldHhhdHRyCT0gZ2VuZXJpY19nZXR4YXR0ciwKIAkubGlzdHhhdHRyCT0gb3ZsX2xpc3R4YXR0ciwKLQkucmVtb3ZleGF0dHIJPSBvdmxfcmVtb3ZleGF0dHIsCisJLnJlbW92ZXhhdHRyCT0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKIAkudXBkYXRlX3RpbWUJPSBvdmxfdXBkYXRlX3RpbWUsCiB9OwogCkBAIC00MTUsNiArMzkyLDkgQEAKIAlpbm9kZS0+aV9pbm8gPSBnZXRfbmV4dF9pbm8oKTsKIAlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAlpbm9kZS0+aV9mbGFncyB8PSBTX05PQ01USU1FOworI2lmZGVmIENPTkZJR19GU19QT1NJWF9BQ0wKKwlpbm9kZS0+aV9hY2wgPSBpbm9kZS0+aV9kZWZhdWx0X2FjbCA9IEFDTF9ET05UX0NBQ0hFOworI2VuZGlmCiAKIAltb2RlICY9IFNfSUZNVDsKIAlzd2l0Y2ggKG1vZGUpIHsKZGlmZiAtLWdpdCBhL2ZzL292ZXJsYXlmcy9vdmVybGF5ZnMuaCBiL2ZzL292ZXJsYXlmcy9vdmVybGF5ZnMuaAppbmRleCBlNGY1Yzk1Li41ODEzY2NmIDEwMDY0NAotLS0gYS9mcy9vdmVybGF5ZnMvb3ZlcmxheWZzLmgKKysrIGIvZnMvb3ZlcmxheWZzL292ZXJsYXlmcy5oCkBAIC0yNCw4ICsyNCw4IEBACiAJKE9WTF9UWVBFX01FUkdFKHR5cGUpIHx8ICFPVkxfVFlQRV9VUFBFUih0eXBlKSkKIAogCi0jZGVmaW5lIE9WTF9YQVRUUl9QUkVGSVggWEFUVFJfVFJVU1RFRF9QUkVGSVggIm92ZXJsYXkiCi0jZGVmaW5lIE9WTF9YQVRUUl9PUEFRVUUgT1ZMX1hBVFRSX1BSRUZJWCAiLm9wYXF1ZSIKKyNkZWZpbmUgT1ZMX1hBVFRSX1BSRUZJWCBYQVRUUl9UUlVTVEVEX1BSRUZJWCAib3ZlcmxheS4iCisjZGVmaW5lIE9WTF9YQVRUUl9PUEFRVUUgT1ZMX1hBVFRSX1BSRUZJWCAib3BhcXVlIgogCiAjZGVmaW5lIE9WTF9JU1VQUEVSX01BU0sgMVVMCiAKQEAgLTE3OSwyMCArMTc5LDIxIEBACiB2b2lkIG92bF9jbGVhbnVwX3doaXRlb3V0cyhzdHJ1Y3QgZGVudHJ5ICp1cHBlciwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCk7CiB2b2lkIG92bF9jYWNoZV9mcmVlKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpOwogaW50IG92bF9jaGVja19kX3R5cGVfc3VwcG9ydGVkKHN0cnVjdCBwYXRoICpyZWFscGF0aCk7Cit2b2lkIG92bF93b3JrZGlyX2NsZWFudXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCB2ZnNtb3VudCAqbW50LAorCQkJIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGxldmVsKTsKIAogLyogaW5vZGUuYyAqLwogaW50IG92bF9zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICphdHRyKTsKIGludCBvdmxfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzayk7Ci1pbnQgb3ZsX3NldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLAotCQkgc2l6ZV90IHNpemUsIGludCBmbGFncyk7Ci1zc2l6ZV90IG92bF9nZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCSAgICAgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplKTsKK2ludCBvdmxfeGF0dHJfc2V0KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsdWUsCisJCSAgc2l6ZV90IHNpemUsIGludCBmbGFncyk7CitpbnQgb3ZsX3hhdHRyX2dldChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplKTsKIHNzaXplX3Qgb3ZsX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKmxpc3QsIHNpemVfdCBzaXplKTsKLWludCBvdmxfcmVtb3ZleGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lKTsKIHN0cnVjdCBwb3NpeF9hY2wgKm92bF9nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKTsKIGludCBvdmxfb3Blbl9tYXliZV9jb3B5X3VwKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgdW5zaWduZWQgaW50IGZpbGVfZmxhZ3MpOwogaW50IG92bF91cGRhdGVfdGltZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgdGltZXNwZWMgKnRzLCBpbnQgZmxhZ3MpOworYm9vbCBvdmxfaXNfcHJpdmF0ZV94YXR0cihjb25zdCBjaGFyICpuYW1lKTsKIAogc3RydWN0IGlub2RlICpvdmxfbmV3X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVtb2RlX3QgbW9kZSk7CiBzdHJ1Y3QgaW5vZGUgKm92bF9nZXRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGlub2RlICpyZWFsaW5vZGUpOwpkaWZmIC0tZ2l0IGEvZnMvb3ZlcmxheWZzL3JlYWRkaXIuYyBiL2ZzL292ZXJsYXlmcy9yZWFkZGlyLmMKaW5kZXggY2YzN2ZjNy4uZjI0MWI0ZSAxMDA2NDQKLS0tIGEvZnMvb3ZlcmxheWZzL3JlYWRkaXIuYworKysgYi9mcy9vdmVybGF5ZnMvcmVhZGRpci5jCkBAIC0yNDgsNyArMjQ4LDcgQEAKIAkJCWVyciA9IHJkZC0+ZXJyOwogCX0gd2hpbGUgKCFlcnIgJiYgcmRkLT5jb3VudCk7CiAKLQlpZiAoIWVyciAmJiByZGQtPmZpcnN0X21heWJlX3doaXRlb3V0KQorCWlmICghZXJyICYmIHJkZC0+Zmlyc3RfbWF5YmVfd2hpdGVvdXQgJiYgcmRkLT5kZW50cnkpCiAJCWVyciA9IG92bF9jaGVja193aGl0ZW91dHMocmVhbHBhdGgtPmRlbnRyeSwgcmRkKTsKIAogCWZwdXQocmVhbGZpbGUpOwpAQCAtNjA2LDMgKzYwNiw2NCBAQAogCiAJcmV0dXJuIHJkZC5kX3R5cGVfc3VwcG9ydGVkOwogfQorCitzdGF0aWMgdm9pZCBvdmxfd29ya2Rpcl9jbGVhbnVwX3JlY3Vyc2Uoc3RydWN0IHBhdGggKnBhdGgsIGludCBsZXZlbCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBpbm9kZSAqZGlyID0gcGF0aC0+ZGVudHJ5LT5kX2lub2RlOworCUxJU1RfSEVBRChsaXN0KTsKKwlzdHJ1Y3Qgb3ZsX2NhY2hlX2VudHJ5ICpwOworCXN0cnVjdCBvdmxfcmVhZGRpcl9kYXRhIHJkZCA9IHsKKwkJLmN0eC5hY3RvciA9IG92bF9maWxsX21lcmdlLAorCQkuZGVudHJ5ID0gTlVMTCwKKwkJLmxpc3QgPSAmbGlzdCwKKwkJLnJvb3QgPSBSQl9ST09ULAorCQkuaXNfbG93ZXN0ID0gZmFsc2UsCisJfTsKKworCWVyciA9IG92bF9kaXJfcmVhZChwYXRoLCAmcmRkKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWlub2RlX2xvY2tfbmVzdGVkKGRpciwgSV9NVVRFWF9QQVJFTlQpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmxpc3QsIGxfbm9kZSkgeworCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisKKwkJaWYgKHAtPm5hbWVbMF0gPT0gJy4nKSB7CisJCQlpZiAocC0+bGVuID09IDEpCisJCQkJY29udGludWU7CisJCQlpZiAocC0+bGVuID09IDIgJiYgcC0+bmFtZVsxXSA9PSAnLicpCisJCQkJY29udGludWU7CisJCX0KKwkJZGVudHJ5ID0gbG9va3VwX29uZV9sZW4ocC0+bmFtZSwgcGF0aC0+ZGVudHJ5LCBwLT5sZW4pOworCQlpZiAoSVNfRVJSKGRlbnRyeSkpCisJCQljb250aW51ZTsKKwkJaWYgKGRlbnRyeS0+ZF9pbm9kZSkKKwkJCW92bF93b3JrZGlyX2NsZWFudXAoZGlyLCBwYXRoLT5tbnQsIGRlbnRyeSwgbGV2ZWwpOworCQlkcHV0KGRlbnRyeSk7CisJfQorCWlub2RlX3VubG9jayhkaXIpOworb3V0OgorCW92bF9jYWNoZV9mcmVlKCZsaXN0KTsKK30KKwordm9pZCBvdmxfd29ya2Rpcl9jbGVhbnVwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCwKKwkJCSBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBsZXZlbCkKK3sKKwlpbnQgZXJyOworCisJaWYgKCFkX2lzX2RpcihkZW50cnkpIHx8IGxldmVsID4gMSkgeworCQlvdmxfY2xlYW51cChkaXIsIGRlbnRyeSk7CisJCXJldHVybjsKKwl9CisKKwllcnIgPSBvdmxfZG9fcm1kaXIoZGlyLCBkZW50cnkpOworCWlmIChlcnIpIHsKKwkJc3RydWN0IHBhdGggcGF0aCA9IHsgLm1udCA9IG1udCwgLmRlbnRyeSA9IGRlbnRyeSB9OworCisJCWlub2RlX3VubG9jayhkaXIpOworCQlvdmxfd29ya2Rpcl9jbGVhbnVwX3JlY3Vyc2UoJnBhdGgsIGxldmVsICsgMSk7CisJCWlub2RlX2xvY2tfbmVzdGVkKGRpciwgSV9NVVRFWF9QQVJFTlQpOworCQlvdmxfY2xlYW51cChkaXIsIGRlbnRyeSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZnMvb3ZlcmxheWZzL3N1cGVyLmMgYi9mcy9vdmVybGF5ZnMvc3VwZXIuYwppbmRleCA0MDM2MTMyLi5lMmE5NGEyIDEwMDY0NAotLS0gYS9mcy9vdmVybGF5ZnMvc3VwZXIuYworKysgYi9mcy9vdmVybGF5ZnMvc3VwZXIuYwpAQCAtODE0LDYgKzgxNCwxMCBAQAogCQlzdHJ1Y3Qga3N0YXQgc3RhdCA9IHsKIAkJCS5tb2RlID0gU19JRkRJUiB8IDAsCiAJCX07CisJCXN0cnVjdCBpYXR0ciBhdHRyID0geworCQkJLmlhX3ZhbGlkID0gQVRUUl9NT0RFLAorCQkJLmlhX21vZGUgPSBzdGF0Lm1vZGUsCisJCX07CiAKIAkJaWYgKHdvcmstPmRfaW5vZGUpIHsKIAkJCWVyciA9IC1FRVhJU1Q7CkBAIC04MjEsNyArODI1LDcgQEAKIAkJCQlnb3RvIG91dF9kcHV0OwogCiAJCQlyZXRyaWVkID0gdHJ1ZTsKLQkJCW92bF9jbGVhbnVwKGRpciwgd29yayk7CisJCQlvdmxfd29ya2Rpcl9jbGVhbnVwKGRpciwgbW50LCB3b3JrLCAwKTsKIAkJCWRwdXQod29yayk7CiAJCQlnb3RvIHJldHJ5OwogCQl9CkBAIC04MjksNiArODMzLDIxIEBACiAJCWVyciA9IG92bF9jcmVhdGVfcmVhbChkaXIsIHdvcmssICZzdGF0LCBOVUxMLCBOVUxMLCB0cnVlKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0X2RwdXQ7CisKKwkJZXJyID0gdmZzX3JlbW92ZXhhdHRyKHdvcmssIFhBVFRSX05BTUVfUE9TSVhfQUNMX0RFRkFVTFQpOworCQlpZiAoZXJyICYmIGVyciAhPSAtRU5PREFUQSAmJiBlcnIgIT0gLUVPUE5PVFNVUFApCisJCQlnb3RvIG91dF9kcHV0OworCisJCWVyciA9IHZmc19yZW1vdmV4YXR0cih3b3JrLCBYQVRUUl9OQU1FX1BPU0lYX0FDTF9BQ0NFU1MpOworCQlpZiAoZXJyICYmIGVyciAhPSAtRU5PREFUQSAmJiBlcnIgIT0gLUVPUE5PVFNVUFApCisJCQlnb3RvIG91dF9kcHV0OworCisJCS8qIENsZWFyIGFueSBpbmhlcml0ZWQgbW9kZSBiaXRzICovCisJCWlub2RlX2xvY2sod29yay0+ZF9pbm9kZSk7CisJCWVyciA9IG5vdGlmeV9jaGFuZ2Uod29yaywgJmF0dHIsIE5VTEwpOworCQlpbm9kZV91bmxvY2sod29yay0+ZF9pbm9kZSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9kcHV0OwogCX0KIG91dF91bmxvY2s6CiAJaW5vZGVfdW5sb2NrKGRpcik7CkBAIC05NjcsMTAgKzk4NiwxOSBAQAogCXJldHVybiBjdHI7CiB9CiAKLXN0YXRpYyBpbnQgb3ZsX3Bvc2l4X2FjbF94YXR0cl9zZXQoY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgKmhhbmRsZXIsCi0JCQkJICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLAotCQkJCSAgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkCitvdmxfcG9zaXhfYWNsX3hhdHRyX2dldChjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqaGFuZGxlciwKKwkJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCWNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisJcmV0dXJuIG92bF94YXR0cl9nZXQoZGVudHJ5LCBoYW5kbGVyLT5uYW1lLCBidWZmZXIsIHNpemUpOworfQorCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkCitvdmxfcG9zaXhfYWNsX3hhdHRyX3NldChjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqaGFuZGxlciwKKwkJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCWNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLAorCQkJc2l6ZV90IHNpemUsIGludCBmbGFncykKIHsKIAlzdHJ1Y3QgZGVudHJ5ICp3b3JrZGlyID0gb3ZsX3dvcmtkaXIoZGVudHJ5KTsKIAlzdHJ1Y3QgaW5vZGUgKnJlYWxpbm9kZSA9IG92bF9pbm9kZV9yZWFsKGlub2RlLCBOVUxMKTsKQEAgLTk5OCwxOSArMTAyNiwyMiBAQAogCiAJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKIAotCXJldHVybiBvdmxfc2V0eGF0dHIoZGVudHJ5LCBpbm9kZSwgaGFuZGxlci0+bmFtZSwgdmFsdWUsIHNpemUsIGZsYWdzKTsKKwllcnIgPSBvdmxfeGF0dHJfc2V0KGRlbnRyeSwgaGFuZGxlci0+bmFtZSwgdmFsdWUsIHNpemUsIGZsYWdzKTsKKwlpZiAoIWVycikKKwkJb3ZsX2NvcHlhdHRyKG92bF9pbm9kZV9yZWFsKGlub2RlLCBOVUxMKSwgaW5vZGUpOworCisJcmV0dXJuIGVycjsKIAogb3V0X2FjbF9yZWxlYXNlOgogCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBvdmxfb3RoZXJfeGF0dHJfc2V0KGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpoYW5kbGVyLAotCQkJICAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICp2YWx1ZSwKLQkJCSAgICAgICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQorc3RhdGljIGludCBvdmxfb3duX3hhdHRyX2dldChjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqaGFuZGxlciwKKwkJCSAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQogewotCXJldHVybiBvdmxfc2V0eGF0dHIoZGVudHJ5LCBpbm9kZSwgbmFtZSwgdmFsdWUsIHNpemUsIGZsYWdzKTsKKwlyZXR1cm4gLUVQRVJNOwogfQogCiBzdGF0aWMgaW50IG92bF9vd25feGF0dHJfc2V0KGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpoYW5kbGVyLApAQCAtMTAyMSw0MiArMTA1Miw1OSBAQAogCXJldHVybiAtRVBFUk07CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciBvdmxfcG9zaXhfYWNsX2FjY2Vzc194YXR0cl9oYW5kbGVyID0geworc3RhdGljIGludCBvdmxfb3RoZXJfeGF0dHJfZ2V0KGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpoYW5kbGVyLAorCQkJICAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCXJldHVybiBvdmxfeGF0dHJfZ2V0KGRlbnRyeSwgbmFtZSwgYnVmZmVyLCBzaXplKTsKK30KKworc3RhdGljIGludCBvdmxfb3RoZXJfeGF0dHJfc2V0KGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpoYW5kbGVyLAorCQkJICAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICp2YWx1ZSwKKwkJCSAgICAgICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXJldHVybiBvdmxfeGF0dHJfc2V0KGRlbnRyeSwgbmFtZSwgdmFsdWUsIHNpemUsIGZsYWdzKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyIF9fbWF5YmVfdW51c2VkCitvdmxfcG9zaXhfYWNsX2FjY2Vzc194YXR0cl9oYW5kbGVyID0gewogCS5uYW1lID0gWEFUVFJfTkFNRV9QT1NJWF9BQ0xfQUNDRVNTLAogCS5mbGFncyA9IEFDTF9UWVBFX0FDQ0VTUywKKwkuZ2V0ID0gb3ZsX3Bvc2l4X2FjbF94YXR0cl9nZXQsCiAJLnNldCA9IG92bF9wb3NpeF9hY2xfeGF0dHJfc2V0LAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyIG92bF9wb3NpeF9hY2xfZGVmYXVsdF94YXR0cl9oYW5kbGVyID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyIF9fbWF5YmVfdW51c2VkCitvdmxfcG9zaXhfYWNsX2RlZmF1bHRfeGF0dHJfaGFuZGxlciA9IHsKIAkubmFtZSA9IFhBVFRSX05BTUVfUE9TSVhfQUNMX0RFRkFVTFQsCiAJLmZsYWdzID0gQUNMX1RZUEVfREVGQVVMVCwKKwkuZ2V0ID0gb3ZsX3Bvc2l4X2FjbF94YXR0cl9nZXQsCiAJLnNldCA9IG92bF9wb3NpeF9hY2xfeGF0dHJfc2V0LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyIG92bF9vd25feGF0dHJfaGFuZGxlciA9IHsKIAkucHJlZml4CT0gT1ZMX1hBVFRSX1BSRUZJWCwKKwkuZ2V0ID0gb3ZsX293bl94YXR0cl9nZXQsCiAJLnNldCA9IG92bF9vd25feGF0dHJfc2V0LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyIG92bF9vdGhlcl94YXR0cl9oYW5kbGVyID0gewogCS5wcmVmaXgJPSAiIiwgLyogY2F0Y2ggYWxsICovCisJLmdldCA9IG92bF9vdGhlcl94YXR0cl9nZXQsCiAJLnNldCA9IG92bF9vdGhlcl94YXR0cl9zZXQsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgKm92bF94YXR0cl9oYW5kbGVyc1tdID0geworI2lmZGVmIENPTkZJR19GU19QT1NJWF9BQ0wKIAkmb3ZsX3Bvc2l4X2FjbF9hY2Nlc3NfeGF0dHJfaGFuZGxlciwKIAkmb3ZsX3Bvc2l4X2FjbF9kZWZhdWx0X3hhdHRyX2hhbmRsZXIsCisjZW5kaWYKIAkmb3ZsX293bl94YXR0cl9oYW5kbGVyLAogCSZvdmxfb3RoZXJfeGF0dHJfaGFuZGxlciwKIAlOVUxMCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgKm92bF94YXR0cl9ub2FjbF9oYW5kbGVyc1tdID0gewotCSZvdmxfb3duX3hhdHRyX2hhbmRsZXIsCi0JJm92bF9vdGhlcl94YXR0cl9oYW5kbGVyLAotCU5VTEwsCi19OwotCiBzdGF0aWMgaW50IG92bF9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCiB7CiAJc3RydWN0IHBhdGggdXBwZXJwYXRoID0geyBOVUxMLCBOVUxMIH07CkBAIC0xMTMyLDcgKzExODAsNyBAQAogCWVyciA9IC1FSU5WQUw7CiAJc3RhY2tsZW4gPSBvdmxfc3BsaXRfbG93ZXJkaXJzKGxvd2VydG1wKTsKIAlpZiAoc3RhY2tsZW4gPiBPVkxfTUFYX1NUQUNLKSB7Ci0JCXByX2Vycigib3ZlcmxheWZzOiB0b28gbWFueSBsb3dlciBkaXJlY3RyaWVzLCBsaW1pdCBpcyAlZFxuIiwKKwkJcHJfZXJyKCJvdmVybGF5ZnM6IHRvbyBtYW55IGxvd2VyIGRpcmVjdG9yaWVzLCBsaW1pdCBpcyAlZFxuIiwKIAkJICAgICAgIE9WTF9NQVhfU1RBQ0spOwogCQlnb3RvIG91dF9mcmVlX2xvd2VydG1wOwogCX0gZWxzZSBpZiAoIXVmcy0+Y29uZmlnLnVwcGVyZGlyICYmIHN0YWNrbGVuID09IDEpIHsKQEAgLTEyNjksMTAgKzEzMTcsNyBAQAogCiAJc2ItPnNfbWFnaWMgPSBPVkVSTEFZRlNfU1VQRVJfTUFHSUM7CiAJc2ItPnNfb3AgPSAmb3ZsX3N1cGVyX29wZXJhdGlvbnM7Ci0JaWYgKElTX0VOQUJMRUQoQ09ORklHX0ZTX1BPU0lYX0FDTCkpCi0JCXNiLT5zX3hhdHRyID0gb3ZsX3hhdHRyX2hhbmRsZXJzOwotCWVsc2UKLQkJc2ItPnNfeGF0dHIgPSBvdmxfeGF0dHJfbm9hY2xfaGFuZGxlcnM7CisJc2ItPnNfeGF0dHIgPSBvdmxfeGF0dHJfaGFuZGxlcnM7CiAJc2ItPnNfcm9vdCA9IHJvb3RfZGVudHJ5OwogCXNiLT5zX2ZzX2luZm8gPSB1ZnM7CiAJc2ItPnNfZmxhZ3MgfD0gTVNfUE9TSVhBQ0w7CmRpZmYgLS1naXQgYS9mcy9wbm9kZS5jIGIvZnMvcG5vZGUuYwppbmRleCA5OTg5OTcwLi4yMzRhOWFjIDEwMDY0NAotLS0gYS9mcy9wbm9kZS5jCisrKyBiL2ZzL3Bub2RlLmMKQEAgLTI1OSw3ICsyNTksNyBAQAogCQlyZWFkX3NlcXVubG9ja19leGNsKCZtb3VudF9sb2NrKTsKIAl9CiAJaGxpc3RfYWRkX2hlYWQoJmNoaWxkLT5tbnRfaGFzaCwgbGlzdCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGNvdW50X21vdW50cyhtLT5tbnRfbnMsIGNoaWxkKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL3Bub2RlLmggYi9mcy9wbm9kZS5oCmluZGV4IDBmY2RiZTcuLjU1MGY1YTggMTAwNjQ0Ci0tLSBhL2ZzL3Bub2RlLmgKKysrIGIvZnMvcG5vZGUuaApAQCAtNTIsNCArNTIsNSBAQAogc3RydWN0IG1vdW50ICpjb3B5X3RyZWUoc3RydWN0IG1vdW50ICosIHN0cnVjdCBkZW50cnkgKiwgaW50KTsKIGJvb2wgaXNfcGF0aF9yZWFjaGFibGUoc3RydWN0IG1vdW50ICosIHN0cnVjdCBkZW50cnkgKiwKIAkJCSBjb25zdCBzdHJ1Y3QgcGF0aCAqcm9vdCk7CitpbnQgY291bnRfbW91bnRzKHN0cnVjdCBtbnRfbmFtZXNwYWNlICpucywgc3RydWN0IG1vdW50ICptbnQpOwogI2VuZGlmIC8qIF9MSU5VWF9QTk9ERV9IICovCmRpZmYgLS1naXQgYS9mcy9wcm9jL2Jhc2UuYyBiL2ZzL3Byb2MvYmFzZS5jCmluZGV4IDU0ZTI3MDIuLjNiNzkyYWIgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvYmFzZS5jCisrKyBiL2ZzL3Byb2MvYmFzZS5jCkBAIC00ODMsNyArNDgzLDcgQEAKIAkJc2F2ZV9zdGFja190cmFjZV90c2sodGFzaywgJnRyYWNlKTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgdHJhY2UubnJfZW50cmllczsgaSsrKSB7Ci0JCQlzZXFfcHJpbnRmKG0sICJbPCVwSz5dICVwU1xuIiwKKwkJCXNlcV9wcmludGYobSwgIls8JXBLPl0gJXBCXG4iLAogCQkJCSAgICh2b2lkICopZW50cmllc1tpXSwgKHZvaWQgKillbnRyaWVzW2ldKTsKIAkJfQogCQl1bmxvY2tfdHJhY2UodGFzayk7CkBAIC0xNTU2LDE4ICsxNTU2LDEzIEBACiBzdGF0aWMgaW50IHByb2NfZXhlX2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcGF0aCAqZXhlX3BhdGgpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwotCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwogCXN0cnVjdCBmaWxlICpleGVfZmlsZTsKIAogCXRhc2sgPSBnZXRfcHJvY190YXNrKGRfaW5vZGUoZGVudHJ5KSk7CiAJaWYgKCF0YXNrKQogCQlyZXR1cm4gLUVOT0VOVDsKLQltbSA9IGdldF90YXNrX21tKHRhc2spOworCWV4ZV9maWxlID0gZ2V0X3Rhc2tfZXhlX2ZpbGUodGFzayk7CiAJcHV0X3Rhc2tfc3RydWN0KHRhc2spOwotCWlmICghbW0pCi0JCXJldHVybiAtRU5PRU5UOwotCWV4ZV9maWxlID0gZ2V0X21tX2V4ZV9maWxlKG1tKTsKLQltbXB1dChtbSk7CiAJaWYgKGV4ZV9maWxlKSB7CiAJCSpleGVfcGF0aCA9IGV4ZV9maWxlLT5mX3BhdGg7CiAJCXBhdGhfZ2V0KCZleGVfZmlsZS0+Zl9wYXRoKTsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvZ2VuZXJpYy5jIGIvZnMvcHJvYy9nZW5lcmljLmMKaW5kZXggYzYzMzQ3Ni4uYmNhNjZkOCAxMDA2NDQKLS0tIGEvZnMvcHJvYy9nZW5lcmljLmMKKysrIGIvZnMvcHJvYy9nZW5lcmljLmMKQEAgLTM5MCw2ICszOTAsOCBAQAogCWF0b21pY19zZXQoJmVudC0+Y291bnQsIDEpOwogCXNwaW5fbG9ja19pbml0KCZlbnQtPnBkZV91bmxvYWRfbG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJmVudC0+cGRlX29wZW5lcnMpOworCXByb2Nfc2V0X3VzZXIoZW50LCAoKnBhcmVudCktPnVpZCwgKCpwYXJlbnQpLT5naWQpOworCiBvdXQ6CiAJcmV0dXJuIGVudDsKIH0KZGlmZiAtLWdpdCBhL2ZzL3Byb2Mva2NvcmUuYyBiL2ZzL3Byb2Mva2NvcmUuYwppbmRleCBhOTM5ZjVlLi41Yzg5YTA3IDEwMDY0NAotLS0gYS9mcy9wcm9jL2tjb3JlLmMKKysrIGIvZnMvcHJvYy9rY29yZS5jCkBAIC00MzAsNiArNDMwLDcgQEAKIHN0YXRpYyBzc2l6ZV90CiByZWFkX2tjb3JlKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgYnVmbGVuLCBsb2ZmX3QgKmZwb3MpCiB7CisJY2hhciAqYnVmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXNzaXplX3QgYWNjID0gMDsKIAlzaXplX3Qgc2l6ZSwgdHN6OwogCXNpemVfdCBlbGZfYnVmbGVuOwpAQCAtNTAwLDIzICs1MDEsMjAgQEAKIAkJCWlmIChjbGVhcl91c2VyKGJ1ZmZlciwgdHN6KSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfSBlbHNlIGlmIChpc192bWFsbG9jX29yX21vZHVsZV9hZGRyKCh2b2lkICopc3RhcnQpKSB7Ci0JCQljaGFyICogZWxmX2J1ZjsKLQotCQkJZWxmX2J1ZiA9IGt6YWxsb2ModHN6LCBHRlBfS0VSTkVMKTsKLQkJCWlmICghZWxmX2J1ZikKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCXZyZWFkKGVsZl9idWYsIChjaGFyICopc3RhcnQsIHRzeik7CisJCQl2cmVhZChidWYsIChjaGFyICopc3RhcnQsIHRzeik7CiAJCQkvKiB3ZSBoYXZlIHRvIHplcm8tZmlsbCB1c2VyIGJ1ZmZlciBldmVuIGlmIG5vIHJlYWQgKi8KLQkJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBlbGZfYnVmLCB0c3opKSB7Ci0JCQkJa2ZyZWUoZWxmX2J1Zik7CisJCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgYnVmLCB0c3opKQogCQkJCXJldHVybiAtRUZBVUxUOwotCQkJfQotCQkJa2ZyZWUoZWxmX2J1Zik7CiAJCX0gZWxzZSB7CiAJCQlpZiAoa2Vybl9hZGRyX3ZhbGlkKHN0YXJ0KSkgewogCQkJCXVuc2lnbmVkIGxvbmcgbjsKIAotCQkJCW4gPSBjb3B5X3RvX3VzZXIoYnVmZmVyLCAoY2hhciAqKXN0YXJ0LCB0c3opOworCQkJCS8qCisJCQkJICogVXNpbmcgYm91bmNlIGJ1ZmZlciB0byBieXBhc3MgdGhlCisJCQkJICogaGFyZGVuZWQgdXNlciBjb3B5IGtlcm5lbCB0ZXh0IGNoZWNrcy4KKwkJCQkgKi8KKwkJCQltZW1jcHkoYnVmLCAoY2hhciAqKSBzdGFydCwgdHN6KTsKKwkJCQluID0gY29weV90b191c2VyKGJ1ZmZlciwgYnVmLCB0c3opOwogCQkJCS8qCiAJCQkJICogV2UgY2Fubm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gZmF1bHQgb24gc291cmNlCiAJCQkJICogYW5kIGZhdWx0IG9uIGRlc3RpbmF0aW9uLiBXaGVuIHRoaXMgaGFwcGVucwpAQCAtNTQ5LDYgKzU0NywxMSBAQAogewogCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKIAkJcmV0dXJuIC1FUEVSTTsKKworCWZpbHAtPnByaXZhdGVfZGF0YSA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZpbHAtPnByaXZhdGVfZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlpZiAoa2NvcmVfbmVlZF91cGRhdGUpCiAJCWtjb3JlX3VwZGF0ZV9yYW0oKTsKIAlpZiAoaV9zaXplX3JlYWQoaW5vZGUpICE9IHByb2Nfcm9vdF9rY29yZS0+c2l6ZSkgewpAQCAtNTU5LDEwICs1NjIsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCByZWxlYXNlX2tjb3JlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWtmcmVlKGZpbGUtPnByaXZhdGVfZGF0YSk7CisJcmV0dXJuIDA7Cit9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfa2NvcmVfb3BlcmF0aW9ucyA9IHsKIAkucmVhZAkJPSByZWFkX2tjb3JlLAogCS5vcGVuCQk9IG9wZW5fa2NvcmUsCisJLnJlbGVhc2UJPSByZWxlYXNlX2tjb3JlLAogCS5sbHNlZWsJCT0gZGVmYXVsdF9sbHNlZWssCiB9OwogCmRpZmYgLS1naXQgYS9mcy9wcm9jL3Byb2NfbmV0LmMgYi9mcy9wcm9jL3Byb2NfbmV0LmMKaW5kZXggYzhiYmM2OC4uN2FlNmIxZCAxMDA2NDQKLS0tIGEvZnMvcHJvYy9wcm9jX25ldC5jCisrKyBiL2ZzL3Byb2MvcHJvY19uZXQuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvbnNwcm94eS5oPgorI2luY2x1ZGUgPGxpbnV4L3VpZGdpZC5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KIApAQCAtMTg1LDYgKzE4Niw4IEBACiBzdGF0aWMgX19uZXRfaW5pdCBpbnQgcHJvY19uZXRfbnNfaW5pdChzdHJ1Y3QgbmV0ICpuZXQpCiB7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpuZXRkLCAqbmV0X3N0YXRkOworCWt1aWRfdCB1aWQ7CisJa2dpZF90IGdpZDsKIAlpbnQgZXJyOwogCiAJZXJyID0gLUVOT01FTTsKQEAgLTE5OSw2ICsyMDIsMTYgQEAKIAluZXRkLT5wYXJlbnQgPSAmcHJvY19yb290OwogCW1lbWNweShuZXRkLT5uYW1lLCAibmV0IiwgNCk7CiAKKwl1aWQgPSBtYWtlX2t1aWQobmV0LT51c2VyX25zLCAwKTsKKwlpZiAoIXVpZF92YWxpZCh1aWQpKQorCQl1aWQgPSBuZXRkLT51aWQ7CisKKwlnaWQgPSBtYWtlX2tnaWQobmV0LT51c2VyX25zLCAwKTsKKwlpZiAoIWdpZF92YWxpZChnaWQpKQorCQlnaWQgPSBuZXRkLT5naWQ7CisKKwlwcm9jX3NldF91c2VyKG5ldGQsIHVpZCwgZ2lkKTsKKwogCWVyciA9IC1FRVhJU1Q7CiAJbmV0X3N0YXRkID0gcHJvY19uZXRfbWtkaXIobmV0LCAic3RhdCIsIG5ldGQpOwogCWlmICghbmV0X3N0YXRkKQpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9wcm9jX3N5c2N0bC5jIGIvZnMvcHJvYy9wcm9jX3N5c2N0bC5jCmluZGV4IDFiOTM2NTAuLjcxMDI1YjkgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvcHJvY19zeXNjdGwuYworKysgYi9mcy9wcm9jL3Byb2Nfc3lzY3RsLmMKQEAgLTcyLDcgKzcyLDcgQEAKIAogc3RhdGljIHZvaWQgZHJvcF9zeXNjdGxfdGFibGUoc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmhlYWRlcik7CiBzdGF0aWMgaW50IHN5c2N0bF9mb2xsb3dfbGluayhzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqKnBoZWFkLAotCXN0cnVjdCBjdGxfdGFibGUgKipwZW50cnksIHN0cnVjdCBuc3Byb3h5ICpuYW1lc3BhY2VzKTsKKwlzdHJ1Y3QgY3RsX3RhYmxlICoqcGVudHJ5KTsKIHN0YXRpYyBpbnQgaW5zZXJ0X2xpbmtzKHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpoZWFkKTsKIHN0YXRpYyB2b2lkIHB1dF9saW5rcyhzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqaGVhZGVyKTsKIApAQCAtMzE5LDExICszMTksMTEgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfc2V0ICoKLWxvb2t1cF9oZWFkZXJfc2V0KHN0cnVjdCBjdGxfdGFibGVfcm9vdCAqcm9vdCwgc3RydWN0IG5zcHJveHkgKm5hbWVzcGFjZXMpCitsb29rdXBfaGVhZGVyX3NldChzdHJ1Y3QgY3RsX3RhYmxlX3Jvb3QgKnJvb3QpCiB7CiAJc3RydWN0IGN0bF90YWJsZV9zZXQgKnNldCA9ICZyb290LT5kZWZhdWx0X3NldDsKIAlpZiAocm9vdC0+bG9va3VwKQotCQlzZXQgPSByb290LT5sb29rdXAocm9vdCwgbmFtZXNwYWNlcyk7CisJCXNldCA9IHJvb3QtPmxvb2t1cChyb290KTsKIAlyZXR1cm4gc2V0OwogfQogCkBAIC00MzAsNiArNDMwLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgaW5vZGUgKnByb2Nfc3lzX21ha2VfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmhlYWQsIHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKQogeworCXN0cnVjdCBjdGxfdGFibGVfcm9vdCAqcm9vdCA9IGhlYWQtPnJvb3Q7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgcHJvY19pbm9kZSAqZWk7CiAKQEAgLTQ1Nyw2ICs0NTgsMTAgQEAKIAkJaWYgKGlzX2VtcHR5X2RpcihoZWFkKSkKIAkJCW1ha2VfZW1wdHlfZGlyX2lub2RlKGlub2RlKTsKIAl9CisKKwlpZiAocm9vdC0+c2V0X293bmVyc2hpcCkKKwkJcm9vdC0+c2V0X293bmVyc2hpcChoZWFkLCB0YWJsZSwgJmlub2RlLT5pX3VpZCwgJmlub2RlLT5pX2dpZCk7CisKIG91dDoKIAlyZXR1cm4gaW5vZGU7CiB9CkBAIC00OTEsNyArNDk2LDcgQEAKIAkJZ290byBvdXQ7CiAKIAlpZiAoU19JU0xOSyhwLT5tb2RlKSkgewotCQlyZXQgPSBzeXNjdGxfZm9sbG93X2xpbmsoJmgsICZwLCBjdXJyZW50LT5uc3Byb3h5KTsKKwkJcmV0ID0gc3lzY3RsX2ZvbGxvd19saW5rKCZoLCAmcCk7CiAJCWVyciA9IEVSUl9QVFIocmV0KTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gb3V0OwpAQCAtNjU5LDcgKzY2NCw3IEBACiAKIAlpZiAoU19JU0xOSyh0YWJsZS0+bW9kZSkpIHsKIAkJLyogSXQgaXMgbm90IGFuIGVycm9yIGlmIHdlIGNhbiBub3QgZm9sbG93IHRoZSBsaW5rIGlnbm9yZSBpdCAqLwotCQlpbnQgZXJyID0gc3lzY3RsX2ZvbGxvd19saW5rKCZoZWFkLCAmdGFibGUsIGN1cnJlbnQtPm5zcHJveHkpOworCQlpbnQgZXJyID0gc3lzY3RsX2ZvbGxvd19saW5rKCZoZWFkLCAmdGFibGUpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CiAJfQpAQCAtOTc2LDcgKzk4MSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgc3lzY3RsX2ZvbGxvd19saW5rKHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICoqcGhlYWQsCi0Jc3RydWN0IGN0bF90YWJsZSAqKnBlbnRyeSwgc3RydWN0IG5zcHJveHkgKm5hbWVzcGFjZXMpCisJc3RydWN0IGN0bF90YWJsZSAqKnBlbnRyeSkKIHsKIAlzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqaGVhZDsKIAlzdHJ1Y3QgY3RsX3RhYmxlX3Jvb3QgKnJvb3Q7CkBAIC05ODgsNyArOTkzLDcgQEAKIAlyZXQgPSAwOwogCXNwaW5fbG9jaygmc3lzY3RsX2xvY2spOwogCXJvb3QgPSAoKnBlbnRyeSktPmRhdGE7Ci0Jc2V0ID0gbG9va3VwX2hlYWRlcl9zZXQocm9vdCwgbmFtZXNwYWNlcyk7CisJc2V0ID0gbG9va3VwX2hlYWRlcl9zZXQocm9vdCk7CiAJZGlyID0geGxhdGVfZGlyKHNldCwgKCpwaGVhZCktPnBhcmVudCk7CiAJaWYgKElTX0VSUihkaXIpKQogCQlyZXQgPSBQVFJfRVJSKGRpcik7CmRpZmYgLS1naXQgYS9mcy9wcm9jL3Rhc2tfbW11LmMgYi9mcy9wcm9jL3Rhc2tfbW11LmMKaW5kZXggMTg3ZDg0ZS4uZjZmYTk5ZSAxMDA2NDQKLS0tIGEvZnMvcHJvYy90YXNrX21tdS5jCisrKyBiL2ZzL3Byb2MvdGFza19tbXUuYwpAQCAtNTgxLDYgKzU4MSw4IEBACiAJCW1zcy0+YW5vbnltb3VzX3RocCArPSBIUEFHRV9QTURfU0laRTsKIAllbHNlIGlmIChQYWdlU3dhcEJhY2tlZChwYWdlKSkKIAkJbXNzLT5zaG1lbV90aHAgKz0gSFBBR0VfUE1EX1NJWkU7CisJZWxzZSBpZiAoaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSkKKwkJLyogcGFzcyAqLzsKIAllbHNlCiAJCVZNX0JVR19PTl9QQUdFKDEsIHBhZ2UpOwogCXNtYXBzX2FjY291bnQobXNzLCBwYWdlLCB0cnVlLCBwbWRfeW91bmcoKnBtZCksIHBtZF9kaXJ0eSgqcG1kKSk7CmRpZmYgLS1naXQgYS9mcy9wc3RvcmUvcGxhdGZvcm0uYyBiL2ZzL3BzdG9yZS9wbGF0Zm9ybS5jCmluZGV4IDE2ZWNjYTUuLjE0OTg0ZDkgMTAwNjQ0Ci0tLSBhL2ZzL3BzdG9yZS9wbGF0Zm9ybS5jCisrKyBiL2ZzL3BzdG9yZS9wbGF0Zm9ybS5jCkBAIC02MjMsNiArNjIzLDQwIEBACiAJCQkgICAgIHNpemUsIHBzaSk7CiB9CiAKK3N0YXRpYyBpbnQgcHN0b3JlX3dyaXRlX2J1Zl91c2VyX2NvbXBhdChlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsCisJCQkgICAgICAgZW51bSBrbXNnX2R1bXBfcmVhc29uIHJlYXNvbiwKKwkJCSAgICAgICB1NjQgKmlkLCB1bnNpZ25lZCBpbnQgcGFydCwKKwkJCSAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgICAgIGJvb2wgY29tcHJlc3NlZCwgc2l6ZV90IHNpemUsCisJCQkgICAgICAgc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJc2l6ZV90IGksIGJ1ZnNpemUgPSBzaXplOworCWxvbmcgcmV0ID0gMDsKKworCWlmICh1bmxpa2VseSghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWYsIHNpemUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGJ1ZnNpemUgPiBwc2luZm8tPmJ1ZnNpemUpCisJCWJ1ZnNpemUgPSBwc2luZm8tPmJ1ZnNpemU7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBzaW5mby0+YnVmX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgKSB7CisJCXNpemVfdCBjID0gbWluKHNpemUgLSBpLCBidWZzaXplKTsKKworCQlyZXQgPSBfX2NvcHlfZnJvbV91c2VyKHBzaW5mby0+YnVmLCBidWYgKyBpLCBjKTsKKwkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXJldCA9IHBzaS0+d3JpdGVfYnVmKHR5cGUsIHJlYXNvbiwgaWQsIHBhcnQsIHBzaW5mby0+YnVmLAorCQkJCSAgICAgY29tcHJlc3NlZCwgYywgcHNpKTsKKwkJaWYgKHVubGlrZWx5KHJldCA8IDApKQorCQkJYnJlYWs7CisJCWkgKz0gYzsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHNpbmZvLT5idWZfbG9jaywgZmxhZ3MpOworCXJldHVybiB1bmxpa2VseShyZXQgPCAwKSA/IHJldCA6IHNpemU7Cit9CisKIC8qCiAgKiBwbGF0Zm9ybSBzcGVjaWZpYyBwZXJzaXN0ZW50IHN0b3JhZ2UgZHJpdmVyIHJlZ2lzdGVycyB3aXRoCiAgKiB1cyBoZXJlLiBJZiBwc3RvcmUgaXMgYWxyZWFkeSBtb3VudGVkLCBjYWxsIHRoZSBwbGF0Zm9ybQpAQCAtNjQ1LDYgKzY3OSw4IEBACiAKIAlpZiAoIXBzaS0+d3JpdGUpCiAJCXBzaS0+d3JpdGUgPSBwc3RvcmVfd3JpdGVfY29tcGF0OworCWlmICghcHNpLT53cml0ZV9idWZfdXNlcikKKwkJcHNpLT53cml0ZV9idWZfdXNlciA9IHBzdG9yZV93cml0ZV9idWZfdXNlcl9jb21wYXQ7CiAJcHNpbmZvID0gcHNpOwogCW11dGV4X2luaXQoJnBzaW5mby0+cmVhZF9tdXRleCk7CiAJc3Bpbl91bmxvY2soJnBzdG9yZV9sb2NrKTsKQEAgLTY1OSwxMyArNjk1LDE0IEBACiAJaWYgKHBzdG9yZV9pc19tb3VudGVkKCkpCiAJCXBzdG9yZV9nZXRfcmVjb3JkcygwKTsKIAotCXBzdG9yZV9yZWdpc3Rlcl9rbXNnKCk7Ci0KLQlpZiAoKHBzaS0+ZmxhZ3MgJiBQU1RPUkVfRkxBR1NfRlJBR0lMRSkgPT0gMCkgeworCWlmIChwc2ktPmZsYWdzICYgUFNUT1JFX0ZMQUdTX0RNRVNHKQorCQlwc3RvcmVfcmVnaXN0ZXJfa21zZygpOworCWlmIChwc2ktPmZsYWdzICYgUFNUT1JFX0ZMQUdTX0NPTlNPTEUpCiAJCXBzdG9yZV9yZWdpc3Rlcl9jb25zb2xlKCk7CisJaWYgKHBzaS0+ZmxhZ3MgJiBQU1RPUkVfRkxBR1NfRlRSQUNFKQogCQlwc3RvcmVfcmVnaXN0ZXJfZnRyYWNlKCk7CisJaWYgKHBzaS0+ZmxhZ3MgJiBQU1RPUkVfRkxBR1NfUE1TRykKIAkJcHN0b3JlX3JlZ2lzdGVyX3Btc2coKTsKLQl9CiAKIAlpZiAocHN0b3JlX3VwZGF0ZV9tcyA+PSAwKSB7CiAJCXBzdG9yZV90aW1lci5leHBpcmVzID0gamlmZmllcyArCkBAIC02ODksMTIgKzcyNiwxNCBAQAogCiB2b2lkIHBzdG9yZV91bnJlZ2lzdGVyKHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKQogewotCWlmICgocHNpLT5mbGFncyAmIFBTVE9SRV9GTEFHU19GUkFHSUxFKSA9PSAwKSB7CisJaWYgKHBzaS0+ZmxhZ3MgJiBQU1RPUkVfRkxBR1NfUE1TRykKIAkJcHN0b3JlX3VucmVnaXN0ZXJfcG1zZygpOworCWlmIChwc2ktPmZsYWdzICYgUFNUT1JFX0ZMQUdTX0ZUUkFDRSkKIAkJcHN0b3JlX3VucmVnaXN0ZXJfZnRyYWNlKCk7CisJaWYgKHBzaS0+ZmxhZ3MgJiBQU1RPUkVfRkxBR1NfQ09OU09MRSkKIAkJcHN0b3JlX3VucmVnaXN0ZXJfY29uc29sZSgpOwotCX0KLQlwc3RvcmVfdW5yZWdpc3Rlcl9rbXNnKCk7CisJaWYgKHBzaS0+ZmxhZ3MgJiBQU1RPUkVfRkxBR1NfRE1FU0cpCisJCXBzdG9yZV91bnJlZ2lzdGVyX2ttc2coKTsKIAogCWZyZWVfYnVmX2Zvcl9jb21wcmVzc2lvbigpOwogCmRpZmYgLS1naXQgYS9mcy9wc3RvcmUvcG1zZy5jIGIvZnMvcHN0b3JlL3Btc2cuYwppbmRleCA3ZGUyMGNkLi43OGY2MTc2IDEwMDY0NAotLS0gYS9mcy9wc3RvcmUvcG1zZy5jCisrKyBiL2ZzL3BzdG9yZS9wbXNnLmMKQEAgLTE5LDQ4ICsxOSwyNSBAQAogI2luY2x1ZGUgImludGVybmFsLmgiCiAKIHN0YXRpYyBERUZJTkVfTVVURVgocG1zZ19sb2NrKTsKLSNkZWZpbmUgUE1TR19NQVhfQk9VTkNFX0JVRkZFUl9TSVpFICgyKlBBR0VfU0laRSkKIAogc3RhdGljIHNzaXplX3Qgd3JpdGVfcG1zZyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc2l6ZV90IGksIGJ1ZmZlcl9zaXplOwotCWNoYXIgKmJ1ZmZlcjsKKwl1NjQgaWQ7CisJaW50IHJldDsKIAogCWlmICghY291bnQpCiAJCXJldHVybiAwOwogCisJLyogY2hlY2sgb3V0c2lkZSBsb2NrLCBwYWdlIGluIGFueSBkYXRhLiB3cml0ZV9idWZfdXNlciBhbHNvIGNoZWNrcyAqLwogCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWYsIGNvdW50KSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlidWZmZXJfc2l6ZSA9IGNvdW50OwotCWlmIChidWZmZXJfc2l6ZSA+IFBNU0dfTUFYX0JPVU5DRV9CVUZGRVJfU0laRSkKLQkJYnVmZmVyX3NpemUgPSBQTVNHX01BWF9CT1VOQ0VfQlVGRkVSX1NJWkU7Ci0JYnVmZmVyID0gdm1hbGxvYyhidWZmZXJfc2l6ZSk7Ci0JaWYgKCFidWZmZXIpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJbXV0ZXhfbG9jaygmcG1zZ19sb2NrKTsKLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICkgewotCQlzaXplX3QgYyA9IG1pbihjb3VudCAtIGksIGJ1ZmZlcl9zaXplKTsKLQkJdTY0IGlkOwotCQlsb25nIHJldDsKLQotCQlyZXQgPSBfX2NvcHlfZnJvbV91c2VyKGJ1ZmZlciwgYnVmICsgaSwgYyk7Ci0JCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKLQkJCW11dGV4X3VubG9jaygmcG1zZ19sb2NrKTsKLQkJCXZmcmVlKGJ1ZmZlcik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCQlwc2luZm8tPndyaXRlX2J1ZihQU1RPUkVfVFlQRV9QTVNHLCAwLCAmaWQsIDAsIGJ1ZmZlciwgMCwgYywKLQkJCQkgIHBzaW5mbyk7Ci0KLQkJaSArPSBjOwotCX0KLQorCXJldCA9IHBzaW5mby0+d3JpdGVfYnVmX3VzZXIoUFNUT1JFX1RZUEVfUE1TRywgMCwgJmlkLCAwLCBidWYsIDAsIGNvdW50LAorCQkJCSAgICAgcHNpbmZvKTsKIAltdXRleF91bmxvY2soJnBtc2dfbG9jayk7Ci0JdmZyZWUoYnVmZmVyKTsKLQlyZXR1cm4gY291bnQ7CisJcmV0dXJuIHJldCA/IHJldCA6IGNvdW50OwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwbXNnX2ZvcHMgPSB7CmRpZmYgLS1naXQgYS9mcy9wc3RvcmUvcmFtLmMgYi9mcy9wc3RvcmUvcmFtLmMKaW5kZXggN2EwMzRkNi4uNmFkODMxYiAxMDA2NDQKLS0tIGEvZnMvcHN0b3JlL3JhbS5jCisrKyBiL2ZzL3BzdG9yZS9yYW0uYwpAQCAtMzMxLDYgKzMzMSwyNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG5vdHJhY2UgcmFtb29wc19wc3RvcmVfd3JpdGVfYnVmX3VzZXIoZW51bSBwc3RvcmVfdHlwZV9pZCB0eXBlLAorCQkJCQkJIGVudW0ga21zZ19kdW1wX3JlYXNvbiByZWFzb24sCisJCQkJCQkgdTY0ICppZCwgdW5zaWduZWQgaW50IHBhcnQsCisJCQkJCQkgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkJCSBib29sIGNvbXByZXNzZWQsIHNpemVfdCBzaXplLAorCQkJCQkJIHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKQoreworCWlmICh0eXBlID09IFBTVE9SRV9UWVBFX1BNU0cpIHsKKwkJc3RydWN0IHJhbW9vcHNfY29udGV4dCAqY3h0ID0gcHNpLT5kYXRhOworCisJCWlmICghY3h0LT5tcHJ6KQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXJldHVybiBwZXJzaXN0ZW50X3JhbV93cml0ZV91c2VyKGN4dC0+bXByeiwgYnVmLCBzaXplKTsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKwogc3RhdGljIGludCByYW1vb3BzX3BzdG9yZV9lcmFzZShlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIHU2NCBpZCwgaW50IGNvdW50LAogCQkJCXN0cnVjdCB0aW1lc3BlYyB0aW1lLCBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSkKIHsKQEAgLTM2OSw2ICszODcsNyBAQAogCQkub3Blbgk9IHJhbW9vcHNfcHN0b3JlX29wZW4sCiAJCS5yZWFkCT0gcmFtb29wc19wc3RvcmVfcmVhZCwKIAkJLndyaXRlX2J1Zgk9IHJhbW9vcHNfcHN0b3JlX3dyaXRlX2J1ZiwKKwkJLndyaXRlX2J1Zl91c2VyCT0gcmFtb29wc19wc3RvcmVfd3JpdGVfYnVmX3VzZXIsCiAJCS5lcmFzZQk9IHJhbW9vcHNfcHN0b3JlX2VyYXNlLAogCX0sCiB9OwpAQCAtMzc3LDEzICszOTYsMTQgQEAKIHsKIAlpbnQgaTsKIAotCWN4dC0+bWF4X2R1bXBfY250ID0gMDsKIAlpZiAoIWN4dC0+cHJ6cykKIAkJcmV0dXJuOwogCi0JZm9yIChpID0gMDsgIUlTX0VSUl9PUl9OVUxMKGN4dC0+cHJ6c1tpXSk7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgY3h0LT5tYXhfZHVtcF9jbnQ7IGkrKykKIAkJcGVyc2lzdGVudF9yYW1fZnJlZShjeHQtPnByenNbaV0pOworCiAJa2ZyZWUoY3h0LT5wcnpzKTsKKwljeHQtPm1heF9kdW1wX2NudCA9IDA7CiB9CiAKIHN0YXRpYyBpbnQgcmFtb29wc19pbml0X3ByenMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmFtb29wc19jb250ZXh0ICpjeHQsCkBAIC00MDgsNyArNDI4LDcgQEAKIAkJCSAgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjeHQtPnByenMpIHsKIAkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBhIHByeiBhcnJheSBmb3IgZHVtcHNcbiIpOwotCQlnb3RvIGZhaWxfcHJ6OworCQlnb3RvIGZhaWxfbWVtOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBjeHQtPm1heF9kdW1wX2NudDsgaSsrKSB7CkBAIC00MTksNiArNDM5LDExIEBACiAJCQllcnIgPSBQVFJfRVJSKGN4dC0+cHJ6c1tpXSk7CiAJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZXF1ZXN0IG1lbSByZWdpb24gKDB4JXp4QDB4JWxseCk6ICVkXG4iLAogCQkJCWN4dC0+cmVjb3JkX3NpemUsICh1bnNpZ25lZCBsb25nIGxvbmcpKnBhZGRyLCBlcnIpOworCisJCQl3aGlsZSAoaSA+IDApIHsKKwkJCQlpLS07CisJCQkJcGVyc2lzdGVudF9yYW1fZnJlZShjeHQtPnByenNbaV0pOworCQkJfQogCQkJZ290byBmYWlsX3ByejsKIAkJfQogCQkqcGFkZHIgKz0gY3h0LT5yZWNvcmRfc2l6ZTsKQEAgLTQyNiw3ICs0NTEsOSBAQAogCiAJcmV0dXJuIDA7CiBmYWlsX3ByejoKLQlyYW1vb3BzX2ZyZWVfcHJ6cyhjeHQpOworCWtmcmVlKGN4dC0+cHJ6cyk7CitmYWlsX21lbToKKwljeHQtPm1heF9kdW1wX2NudCA9IDA7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNjA4LDEyICs2MzUsMjAgQEAKIAkJY3h0LT5wc3RvcmUuYnVmc2l6ZSA9IDEwMjQ7IC8qIExPR19MSU5FX01BWCAqLwogCWN4dC0+cHN0b3JlLmJ1ZnNpemUgPSBtYXgoY3h0LT5yZWNvcmRfc2l6ZSwgY3h0LT5wc3RvcmUuYnVmc2l6ZSk7CiAJY3h0LT5wc3RvcmUuYnVmID0ga21hbGxvYyhjeHQtPnBzdG9yZS5idWZzaXplLCBHRlBfS0VSTkVMKTsKLQlzcGluX2xvY2tfaW5pdCgmY3h0LT5wc3RvcmUuYnVmX2xvY2spOwogCWlmICghY3h0LT5wc3RvcmUuYnVmKSB7CiAJCXByX2VycigiY2Fubm90IGFsbG9jYXRlIHBzdG9yZSBidWZmZXJcbiIpOwogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWxfY2xlYXI7CiAJfQorCXNwaW5fbG9ja19pbml0KCZjeHQtPnBzdG9yZS5idWZfbG9jayk7CisKKwljeHQtPnBzdG9yZS5mbGFncyA9IFBTVE9SRV9GTEFHU19ETUVTRzsKKwlpZiAoY3h0LT5jb25zb2xlX3NpemUpCisJCWN4dC0+cHN0b3JlLmZsYWdzIHw9IFBTVE9SRV9GTEFHU19DT05TT0xFOworCWlmIChjeHQtPmZ0cmFjZV9zaXplKQorCQljeHQtPnBzdG9yZS5mbGFncyB8PSBQU1RPUkVfRkxBR1NfRlRSQUNFOworCWlmIChjeHQtPnBtc2dfc2l6ZSkKKwkJY3h0LT5wc3RvcmUuZmxhZ3MgfD0gUFNUT1JFX0ZMQUdTX1BNU0c7CiAKIAllcnIgPSBwc3RvcmVfcmVnaXN0ZXIoJmN4dC0+cHN0b3JlKTsKIAlpZiAoZXJyKSB7CkBAIC02NTksNyArNjk0LDYgQEAKIAlzdHJ1Y3QgcmFtb29wc19jb250ZXh0ICpjeHQgPSAmb29wc19jeHQ7CiAKIAlwc3RvcmVfdW5yZWdpc3RlcigmY3h0LT5wc3RvcmUpOwotCWN4dC0+bWF4X2R1bXBfY250ID0gMDsKIAogCWtmcmVlKGN4dC0+cHN0b3JlLmJ1Zik7CiAJY3h0LT5wc3RvcmUuYnVmc2l6ZSA9IDA7CmRpZmYgLS1naXQgYS9mcy9wc3RvcmUvcmFtX2NvcmUuYyBiL2ZzL3BzdG9yZS9yYW1fY29yZS5jCmluZGV4IDc2YzNmODAuLjM5NzVkZWUgMTAwNjQ0Ci0tLSBhL2ZzL3BzdG9yZS9yYW1fY29yZS5jCisrKyBiL2ZzL3BzdG9yZS9yYW1fY29yZS5jCkBAIC0xNywxNSArMTcsMTYgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BzdG9yZV9yYW0uaD4KICNpbmNsdWRlIDxsaW51eC9yc2xpYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L3BzdG9yZV9yYW0uaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogCiBzdHJ1Y3QgcGVyc2lzdGVudF9yYW1fYnVmZmVyIHsKQEAgLTQ3LDQzICs0OCwxMCBAQAogCXJldHVybiBhdG9taWNfcmVhZCgmcHJ6LT5idWZmZXItPnN0YXJ0KTsKIH0KIAotLyogaW5jcmVhc2UgYW5kIHdyYXAgdGhlIHN0YXJ0IHBvaW50ZXIsIHJldHVybmluZyB0aGUgb2xkIHZhbHVlICovCi1zdGF0aWMgc2l6ZV90IGJ1ZmZlcl9zdGFydF9hZGRfYXRvbWljKHN0cnVjdCBwZXJzaXN0ZW50X3JhbV96b25lICpwcnosIHNpemVfdCBhKQotewotCWludCBvbGQ7Ci0JaW50IG5ldzsKLQotCWRvIHsKLQkJb2xkID0gYXRvbWljX3JlYWQoJnByei0+YnVmZmVyLT5zdGFydCk7Ci0JCW5ldyA9IG9sZCArIGE7Ci0JCXdoaWxlICh1bmxpa2VseShuZXcgPj0gcHJ6LT5idWZmZXJfc2l6ZSkpCi0JCQluZXcgLT0gcHJ6LT5idWZmZXJfc2l6ZTsKLQl9IHdoaWxlIChhdG9taWNfY21weGNoZygmcHJ6LT5idWZmZXItPnN0YXJ0LCBvbGQsIG5ldykgIT0gb2xkKTsKLQotCXJldHVybiBvbGQ7Ci19Ci0KLS8qIGluY3JlYXNlIHRoZSBzaXplIGNvdW50ZXIgdW50aWwgaXQgaGl0cyB0aGUgbWF4IHNpemUgKi8KLXN0YXRpYyB2b2lkIGJ1ZmZlcl9zaXplX2FkZF9hdG9taWMoc3RydWN0IHBlcnNpc3RlbnRfcmFtX3pvbmUgKnByeiwgc2l6ZV90IGEpCi17Ci0Jc2l6ZV90IG9sZDsKLQlzaXplX3QgbmV3OwotCi0JaWYgKGF0b21pY19yZWFkKCZwcnotPmJ1ZmZlci0+c2l6ZSkgPT0gcHJ6LT5idWZmZXJfc2l6ZSkKLQkJcmV0dXJuOwotCi0JZG8gewotCQlvbGQgPSBhdG9taWNfcmVhZCgmcHJ6LT5idWZmZXItPnNpemUpOwotCQluZXcgPSBvbGQgKyBhOwotCQlpZiAobmV3ID4gcHJ6LT5idWZmZXJfc2l6ZSkKLQkJCW5ldyA9IHByei0+YnVmZmVyX3NpemU7Ci0JfSB3aGlsZSAoYXRvbWljX2NtcHhjaGcoJnByei0+YnVmZmVyLT5zaXplLCBvbGQsIG5ldykgIT0gb2xkKTsKLX0KLQogc3RhdGljIERFRklORV9SQVdfU1BJTkxPQ0soYnVmZmVyX2xvY2spOwogCiAvKiBpbmNyZWFzZSBhbmQgd3JhcCB0aGUgc3RhcnQgcG9pbnRlciwgcmV0dXJuaW5nIHRoZSBvbGQgdmFsdWUgKi8KLXN0YXRpYyBzaXplX3QgYnVmZmVyX3N0YXJ0X2FkZF9sb2NrZWQoc3RydWN0IHBlcnNpc3RlbnRfcmFtX3pvbmUgKnByeiwgc2l6ZV90IGEpCitzdGF0aWMgc2l6ZV90IGJ1ZmZlcl9zdGFydF9hZGQoc3RydWN0IHBlcnNpc3RlbnRfcmFtX3pvbmUgKnByeiwgc2l6ZV90IGEpCiB7CiAJaW50IG9sZDsKIAlpbnQgbmV3OwpAQCAtMTAzLDcgKzcxLDcgQEAKIH0KIAogLyogaW5jcmVhc2UgdGhlIHNpemUgY291bnRlciB1bnRpbCBpdCBoaXRzIHRoZSBtYXggc2l6ZSAqLwotc3RhdGljIHZvaWQgYnVmZmVyX3NpemVfYWRkX2xvY2tlZChzdHJ1Y3QgcGVyc2lzdGVudF9yYW1fem9uZSAqcHJ6LCBzaXplX3QgYSkKK3N0YXRpYyB2b2lkIGJ1ZmZlcl9zaXplX2FkZChzdHJ1Y3QgcGVyc2lzdGVudF9yYW1fem9uZSAqcHJ6LCBzaXplX3QgYSkKIHsKIAlzaXplX3Qgb2xkOwogCXNpemVfdCBuZXc7CkBAIC0xMjQsOSArOTIsNiBAQAogCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZidWZmZXJfbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgc2l6ZV90ICgqYnVmZmVyX3N0YXJ0X2FkZCkoc3RydWN0IHBlcnNpc3RlbnRfcmFtX3pvbmUgKiwgc2l6ZV90KSA9IGJ1ZmZlcl9zdGFydF9hZGRfYXRvbWljOwotc3RhdGljIHZvaWQgKCpidWZmZXJfc2l6ZV9hZGQpKHN0cnVjdCBwZXJzaXN0ZW50X3JhbV96b25lICosIHNpemVfdCkgPSBidWZmZXJfc2l6ZV9hZGRfYXRvbWljOwotCiBzdGF0aWMgdm9pZCBub3RyYWNlIHBlcnNpc3RlbnRfcmFtX2VuY29kZV9yczgoc3RydWN0IHBlcnNpc3RlbnRfcmFtX3pvbmUgKnByeiwKIAl1aW50OF90ICpkYXRhLCBzaXplX3QgbGVuLCB1aW50OF90ICplY2MpCiB7CkBAIC0yOTksMTAgKzI2NCwyMCBAQAogCWNvbnN0IHZvaWQgKnMsIHVuc2lnbmVkIGludCBzdGFydCwgdW5zaWduZWQgaW50IGNvdW50KQogewogCXN0cnVjdCBwZXJzaXN0ZW50X3JhbV9idWZmZXIgKmJ1ZmZlciA9IHByei0+YnVmZmVyOwotCW1lbWNweShidWZmZXItPmRhdGEgKyBzdGFydCwgcywgY291bnQpOworCW1lbWNweV90b2lvKGJ1ZmZlci0+ZGF0YSArIHN0YXJ0LCBzLCBjb3VudCk7CiAJcGVyc2lzdGVudF9yYW1fdXBkYXRlX2VjYyhwcnosIHN0YXJ0LCBjb3VudCk7CiB9CiAKK3N0YXRpYyBpbnQgbm90cmFjZSBwZXJzaXN0ZW50X3JhbV91cGRhdGVfdXNlcihzdHJ1Y3QgcGVyc2lzdGVudF9yYW1fem9uZSAqcHJ6LAorCWNvbnN0IHZvaWQgX191c2VyICpzLCB1bnNpZ25lZCBpbnQgc3RhcnQsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgcGVyc2lzdGVudF9yYW1fYnVmZmVyICpidWZmZXIgPSBwcnotPmJ1ZmZlcjsKKwlpbnQgcmV0ID0gdW5saWtlbHkoX19jb3B5X2Zyb21fdXNlcihidWZmZXItPmRhdGEgKyBzdGFydCwgcywgY291bnQpKSA/CisJCS1FRkFVTFQgOiAwOworCXBlcnNpc3RlbnRfcmFtX3VwZGF0ZV9lY2MocHJ6LCBzdGFydCwgY291bnQpOworCXJldHVybiByZXQ7Cit9CisKIHZvaWQgcGVyc2lzdGVudF9yYW1fc2F2ZV9vbGQoc3RydWN0IHBlcnNpc3RlbnRfcmFtX3pvbmUgKnByeikKIHsKIAlzdHJ1Y3QgcGVyc2lzdGVudF9yYW1fYnVmZmVyICpidWZmZXIgPSBwcnotPmJ1ZmZlcjsKQEAgLTMyMiw4ICsyOTcsOCBAQAogCX0KIAogCXByei0+b2xkX2xvZ19zaXplID0gc2l6ZTsKLQltZW1jcHkocHJ6LT5vbGRfbG9nLCAmYnVmZmVyLT5kYXRhW3N0YXJ0XSwgc2l6ZSAtIHN0YXJ0KTsKLQltZW1jcHkocHJ6LT5vbGRfbG9nICsgc2l6ZSAtIHN0YXJ0LCAmYnVmZmVyLT5kYXRhWzBdLCBzdGFydCk7CisJbWVtY3B5X2Zyb21pbyhwcnotPm9sZF9sb2csICZidWZmZXItPmRhdGFbc3RhcnRdLCBzaXplIC0gc3RhcnQpOworCW1lbWNweV9mcm9taW8ocHJ6LT5vbGRfbG9nICsgc2l6ZSAtIHN0YXJ0LCAmYnVmZmVyLT5kYXRhWzBdLCBzdGFydCk7CiB9CiAKIGludCBub3RyYWNlIHBlcnNpc3RlbnRfcmFtX3dyaXRlKHN0cnVjdCBwZXJzaXN0ZW50X3JhbV96b25lICpwcnosCkBAIC0zNTYsNiArMzMxLDM4IEBACiAJcmV0dXJuIGNvdW50OwogfQogCitpbnQgbm90cmFjZSBwZXJzaXN0ZW50X3JhbV93cml0ZV91c2VyKHN0cnVjdCBwZXJzaXN0ZW50X3JhbV96b25lICpwcnosCisJY29uc3Qgdm9pZCBfX3VzZXIgKnMsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlpbnQgcmVtLCByZXQgPSAwLCBjID0gY291bnQ7CisJc2l6ZV90IHN0YXJ0OworCisJaWYgKHVubGlrZWx5KCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHMsIGNvdW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmICh1bmxpa2VseShjID4gcHJ6LT5idWZmZXJfc2l6ZSkpIHsKKwkJcyArPSBjIC0gcHJ6LT5idWZmZXJfc2l6ZTsKKwkJYyA9IHByei0+YnVmZmVyX3NpemU7CisJfQorCisJYnVmZmVyX3NpemVfYWRkKHByeiwgYyk7CisKKwlzdGFydCA9IGJ1ZmZlcl9zdGFydF9hZGQocHJ6LCBjKTsKKworCXJlbSA9IHByei0+YnVmZmVyX3NpemUgLSBzdGFydDsKKwlpZiAodW5saWtlbHkocmVtIDwgYykpIHsKKwkJcmV0ID0gcGVyc2lzdGVudF9yYW1fdXBkYXRlX3VzZXIocHJ6LCBzLCBzdGFydCwgcmVtKTsKKwkJcyArPSByZW07CisJCWMgLT0gcmVtOworCQlzdGFydCA9IDA7CisJfQorCWlmIChsaWtlbHkoIXJldCkpCisJCXJldCA9IHBlcnNpc3RlbnRfcmFtX3VwZGF0ZV91c2VyKHByeiwgcywgc3RhcnQsIGMpOworCisJcGVyc2lzdGVudF9yYW1fdXBkYXRlX2hlYWRlcl9lY2MocHJ6KTsKKworCXJldHVybiB1bmxpa2VseShyZXQpID8gcmV0IDogY291bnQ7Cit9CisKIHNpemVfdCBwZXJzaXN0ZW50X3JhbV9vbGRfc2l6ZShzdHJ1Y3QgcGVyc2lzdGVudF9yYW1fem9uZSAqcHJ6KQogewogCXJldHVybiBwcnotPm9sZF9sb2dfc2l6ZTsKQEAgLTQyNiw5ICs0MzMsNiBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlidWZmZXJfc3RhcnRfYWRkID0gYnVmZmVyX3N0YXJ0X2FkZF9sb2NrZWQ7Ci0JYnVmZmVyX3NpemVfYWRkID0gYnVmZmVyX3NpemVfYWRkX2xvY2tlZDsKLQogCWlmIChtZW10eXBlKQogCQl2YSA9IGlvcmVtYXAoc3RhcnQsIHNpemUpOwogCWVsc2UKZGlmZiAtLWdpdCBhL2ZzL3F1b3RhL3F1b3RhLmMgYi9mcy9xdW90YS9xdW90YS5jCmluZGV4IDM1ZGYwOGUuLjJkNDQ1NDIgMTAwNjQ0Ci0tLSBhL2ZzL3F1b3RhL3F1b3RhLmMKKysrIGIvZnMvcXVvdGEvcXVvdGEuYwpAQCAtMzQxLDYgKzM0MSw3IEBACiAJc3RydWN0IHFjX3N0YXRlIHN0YXRlOwogCWludCByZXQ7CiAKKwltZW1zZXQoJnN0YXRlLCAwLCBzaXplb2YgKHN0cnVjdCBxY19zdGF0ZSkpOwogCXJldCA9IHNiLT5zX3Fjb3AtPmdldF9zdGF0ZShzYiwgJnN0YXRlKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKQEAgLTM2NSwxNyArMzY2LDE5IEBACiAJZnFzLT5xc19ydGJ0aW1lbGltaXQgPSBzdGF0ZS5zX3N0YXRlW3R5cGVdLnJ0X3NwY190aW1lbGltaXQ7CiAJZnFzLT5xc19id2FybmxpbWl0ID0gc3RhdGUuc19zdGF0ZVt0eXBlXS5zcGNfd2FybmxpbWl0OwogCWZxcy0+cXNfaXdhcm5saW1pdCA9IHN0YXRlLnNfc3RhdGVbdHlwZV0uaW5vX3dhcm5saW1pdDsKLQlpZiAoc3RhdGUuc19zdGF0ZVtVU1JRVU9UQV0uZmxhZ3MgJiBRQ0lfQUNDVF9FTkFCTEVEKSB7CisKKwkvKiBJbm9kZXMgbWF5IGJlIGFsbG9jYXRlZCBldmVuIGlmIGluYWN0aXZlOyBjb3B5IG91dCBpZiBwcmVzZW50ICovCisJaWYgKHN0YXRlLnNfc3RhdGVbVVNSUVVPVEFdLmlubykgewogCQlmcXMtPnFzX3VxdW90YS5xZnNfaW5vID0gc3RhdGUuc19zdGF0ZVtVU1JRVU9UQV0uaW5vOwogCQlmcXMtPnFzX3VxdW90YS5xZnNfbmJsa3MgPSBzdGF0ZS5zX3N0YXRlW1VTUlFVT1RBXS5ibG9ja3M7CiAJCWZxcy0+cXNfdXF1b3RhLnFmc19uZXh0ZW50cyA9IHN0YXRlLnNfc3RhdGVbVVNSUVVPVEFdLm5leHRlbnRzOwogCX0KLQlpZiAoc3RhdGUuc19zdGF0ZVtHUlBRVU9UQV0uZmxhZ3MgJiBRQ0lfQUNDVF9FTkFCTEVEKSB7CisJaWYgKHN0YXRlLnNfc3RhdGVbR1JQUVVPVEFdLmlubykgewogCQlmcXMtPnFzX2dxdW90YS5xZnNfaW5vID0gc3RhdGUuc19zdGF0ZVtHUlBRVU9UQV0uaW5vOwogCQlmcXMtPnFzX2dxdW90YS5xZnNfbmJsa3MgPSBzdGF0ZS5zX3N0YXRlW0dSUFFVT1RBXS5ibG9ja3M7CiAJCWZxcy0+cXNfZ3F1b3RhLnFmc19uZXh0ZW50cyA9IHN0YXRlLnNfc3RhdGVbR1JQUVVPVEFdLm5leHRlbnRzOwogCX0KLQlpZiAoc3RhdGUuc19zdGF0ZVtQUkpRVU9UQV0uZmxhZ3MgJiBRQ0lfQUNDVF9FTkFCTEVEKSB7CisJaWYgKHN0YXRlLnNfc3RhdGVbUFJKUVVPVEFdLmlubykgewogCQkvKgogCQkgKiBRX1hHRVRRU1RBVCBkb2Vzbid0IGhhdmUgcm9vbSBmb3IgYm90aCBncm91cCBhbmQgcHJvamVjdAogCQkgKiBxdW90YXMuICBTbywgYWxsb3cgdGhlIHByb2plY3QgcXVvdGEgdmFsdWVzIHRvIGJlIGNvcGllZCBvdXQKQEAgLTQxMSw2ICs0MTQsNyBAQAogCXN0cnVjdCBxY19zdGF0ZSBzdGF0ZTsKIAlpbnQgcmV0OwogCisJbWVtc2V0KCZzdGF0ZSwgMCwgc2l6ZW9mIChzdHJ1Y3QgcWNfc3RhdGUpKTsKIAlyZXQgPSBzYi0+c19xY29wLT5nZXRfc3RhdGUoc2IsICZzdGF0ZSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CkBAIC00MzUsMTcgKzQzOSwxOSBAQAogCWZxcy0+cXNfcnRidGltZWxpbWl0ID0gc3RhdGUuc19zdGF0ZVt0eXBlXS5ydF9zcGNfdGltZWxpbWl0OwogCWZxcy0+cXNfYndhcm5saW1pdCA9IHN0YXRlLnNfc3RhdGVbdHlwZV0uc3BjX3dhcm5saW1pdDsKIAlmcXMtPnFzX2l3YXJubGltaXQgPSBzdGF0ZS5zX3N0YXRlW3R5cGVdLmlub193YXJubGltaXQ7Ci0JaWYgKHN0YXRlLnNfc3RhdGVbVVNSUVVPVEFdLmZsYWdzICYgUUNJX0FDQ1RfRU5BQkxFRCkgeworCisJLyogSW5vZGVzIG1heSBiZSBhbGxvY2F0ZWQgZXZlbiBpZiBpbmFjdGl2ZTsgY29weSBvdXQgaWYgcHJlc2VudCAqLworCWlmIChzdGF0ZS5zX3N0YXRlW1VTUlFVT1RBXS5pbm8pIHsKIAkJZnFzLT5xc191cXVvdGEucWZzX2lubyA9IHN0YXRlLnNfc3RhdGVbVVNSUVVPVEFdLmlubzsKIAkJZnFzLT5xc191cXVvdGEucWZzX25ibGtzID0gc3RhdGUuc19zdGF0ZVtVU1JRVU9UQV0uYmxvY2tzOwogCQlmcXMtPnFzX3VxdW90YS5xZnNfbmV4dGVudHMgPSBzdGF0ZS5zX3N0YXRlW1VTUlFVT1RBXS5uZXh0ZW50czsKIAl9Ci0JaWYgKHN0YXRlLnNfc3RhdGVbR1JQUVVPVEFdLmZsYWdzICYgUUNJX0FDQ1RfRU5BQkxFRCkgeworCWlmIChzdGF0ZS5zX3N0YXRlW0dSUFFVT1RBXS5pbm8pIHsKIAkJZnFzLT5xc19ncXVvdGEucWZzX2lubyA9IHN0YXRlLnNfc3RhdGVbR1JQUVVPVEFdLmlubzsKIAkJZnFzLT5xc19ncXVvdGEucWZzX25ibGtzID0gc3RhdGUuc19zdGF0ZVtHUlBRVU9UQV0uYmxvY2tzOwogCQlmcXMtPnFzX2dxdW90YS5xZnNfbmV4dGVudHMgPSBzdGF0ZS5zX3N0YXRlW0dSUFFVT1RBXS5uZXh0ZW50czsKIAl9Ci0JaWYgKHN0YXRlLnNfc3RhdGVbUFJKUVVPVEFdLmZsYWdzICYgUUNJX0FDQ1RfRU5BQkxFRCkgeworCWlmIChzdGF0ZS5zX3N0YXRlW1BSSlFVT1RBXS5pbm8pIHsKIAkJZnFzLT5xc19wcXVvdGEucWZzX2lubyA9IHN0YXRlLnNfc3RhdGVbUFJKUVVPVEFdLmlubzsKIAkJZnFzLT5xc19wcXVvdGEucWZzX25ibGtzID0gc3RhdGUuc19zdGF0ZVtQUkpRVU9UQV0uYmxvY2tzOwogCQlmcXMtPnFzX3BxdW90YS5xZnNfbmV4dGVudHMgPSBzdGF0ZS5zX3N0YXRlW1BSSlFVT1RBXS5uZXh0ZW50czsKZGlmZiAtLWdpdCBhL2ZzL3JhbWZzL2ZpbGUtbW11LmMgYi9mcy9yYW1mcy9maWxlLW1tdS5jCmluZGV4IDE4M2EyMTIuLjEyYWYwNDkgMTAwNjQ0Ci0tLSBhL2ZzL3JhbWZzL2ZpbGUtbW11LmMKKysrIGIvZnMvcmFtZnMvZmlsZS1tbXUuYwpAQCAtMjcsOSArMjcsMTcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvcmFtZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgcmFtZnNfbW11X2dldF91bm1hcHBlZF9hcmVhKHN0cnVjdCBmaWxlICpmaWxlLAorCQl1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIHBnb2ZmLAorCQl1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXJldHVybiBjdXJyZW50LT5tbS0+Z2V0X3VubWFwcGVkX2FyZWEoZmlsZSwgYWRkciwgbGVuLCBwZ29mZiwgZmxhZ3MpOworfQorCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJhbWZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkucmVhZF9pdGVyCT0gZ2VuZXJpY19maWxlX3JlYWRfaXRlciwKIAkud3JpdGVfaXRlcgk9IGdlbmVyaWNfZmlsZV93cml0ZV9pdGVyLApAQCAtMzgsNiArNDYsNyBAQAogCS5zcGxpY2VfcmVhZAk9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZCwKIAkuc3BsaWNlX3dyaXRlCT0gaXRlcl9maWxlX3NwbGljZV93cml0ZSwKIAkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLmdldF91bm1hcHBlZF9hcmVhCT0gcmFtZnNfbW11X2dldF91bm1hcHBlZF9hcmVhLAogfTsKIAogY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcmFtZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0gewpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvc3VwZXIuYyBiL2ZzL3JlaXNlcmZzL3N1cGVyLmMKaW5kZXggN2E0YTg1YS4uNzRkNWRkZCAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvc3VwZXIuYworKysgYi9mcy9yZWlzZXJmcy9zdXBlci5jCkBAIC0xOTAsNyArMTkwLDE1IEBACiBzdGF0aWMgaW50IHJlaXNlcmZzX3F1b3RhX29uX21vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQpOwogI2VuZGlmCiAKLS8qIGxvb2sgZm9yIHVuY29tcGxldGVkIHVubGlua3MgYW5kIHRydW5jYXRlcyBhbmQgY29tcGxldGUgdGhlbSAqLworLyoKKyAqIExvb2sgZm9yIHVuY29tcGxldGVkIHVubGlua3MgYW5kIHRydW5jYXRlcyBhbmQgY29tcGxldGUgdGhlbQorICoKKyAqIENhbGxlZCB3aXRoIHN1cGVyYmxvY2sgd3JpdGUgbG9ja2VkLiAgSWYgcXVvdGFzIGFyZSBlbmFibGVkLCB3ZSBoYXZlIHRvCisgKiByZWxlYXNlL3JldGFrZSBsZXN0IHdlIGNhbGwgZHF1b3RfcXVvdGFfb25fbW91bnQoKSwgcHJvY2VlZCB0bworICogc2NoZWR1bGVfb25fZWFjaF9jcHUoKSBpbiBpbnZhbGlkYXRlX2JkZXYoKSBhbmQgZGVhZGxvY2sgd2FpdGluZyBmb3IgdGhlIHBlcgorICogY3B1IHdvcmtsZXRzIHRvIGNvbXBsZXRlIGZsdXNoX2FzeW5jX2NvbW1pdHMoKSB0aGF0IGluIHR1cm4gd2FpdCBmb3IgdGhlCisgKiBzdXBlcmJsb2NrIHdyaXRlIGxvY2suCisgKi8KIHN0YXRpYyBpbnQgZmluaXNoX3VuZmluaXNoZWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQogewogCUlOSVRJQUxJWkVfUEFUSChwYXRoKTsKQEAgLTIzNyw3ICsyNDUsOSBAQAogCQkJCXF1b3RhX2VuYWJsZWRbaV0gPSAwOwogCQkJCWNvbnRpbnVlOwogCQkJfQorCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHMpOwogCQkJcmV0ID0gcmVpc2VyZnNfcXVvdGFfb25fbW91bnQocywgaSk7CisJCQlyZWlzZXJmc193cml0ZV9sb2NrKHMpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJcmVpc2VyZnNfd2FybmluZyhzLCAicmVpc2VyZnMtMjUwMCIsCiAJCQkJCQkgImNhbm5vdCB0dXJuIG9uIGpvdXJuYWxlZCAiCmRpZmYgLS1naXQgYS9mcy9zZXFfZmlsZS5jIGIvZnMvc2VxX2ZpbGUuYwppbmRleCAxOWY1MzJlLi42ZGM0Mjk2IDEwMDY0NAotLS0gYS9mcy9zZXFfZmlsZS5jCisrKyBiL2ZzL3NlcV9maWxlLmMKQEAgLTIyMyw4ICsyMjMsMTAgQEAKIAkJc2l6ZSAtPSBuOwogCQlidWYgKz0gbjsKIAkJY29waWVkICs9IG47Ci0JCWlmICghbS0+Y291bnQpCisJCWlmICghbS0+Y291bnQpIHsKKwkJCW0tPmZyb20gPSAwOwogCQkJbS0+aW5kZXgrKzsKKwkJfQogCQlpZiAoIXNpemUpCiAJCQlnb3RvIERvbmU7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvZmlsZS5jIGIvZnMvc3lzZnMvZmlsZS5jCmluZGV4IGYzNTUyM2QuLmI4MDMyMTMgMTAwNjQ0Ci0tLSBhL2ZzL3N5c2ZzL2ZpbGUuYworKysgYi9mcy9zeXNmcy9maWxlLmMKQEAgLTExNCw5ICsxMTQsMTUgQEAKIAkgKiBJZiBidWYgIT0gb2YtPnByZWFsbG9jX2J1Ziwgd2UgZG9uJ3Qga25vdyBob3cKIAkgKiBsYXJnZSBpdCBpcywgc28gY2Fubm90IHNhZmVseSBwYXNzIGl0IHRvIC0+c2hvdwogCSAqLwotCWlmIChwb3MgfHwgV0FSTl9PTl9PTkNFKGJ1ZiAhPSBvZi0+cHJlYWxsb2NfYnVmKSkKKwlpZiAoV0FSTl9PTl9PTkNFKGJ1ZiAhPSBvZi0+cHJlYWxsb2NfYnVmKSkKIAkJcmV0dXJuIDA7CiAJbGVuID0gb3BzLT5zaG93KGtvYmosIG9mLT5rbi0+cHJpdiwgYnVmKTsKKwlpZiAocG9zKSB7CisJCWlmIChsZW4gPD0gcG9zKQorCQkJcmV0dXJuIDA7CisJCWxlbiAtPSBwb3M7CisJCW1lbW1vdmUoYnVmLCBidWYgKyBwb3MsIGxlbik7CisJfQogCXJldHVybiBtaW4oY291bnQsIGxlbik7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL2dyb3VwLmMgYi9mcy9zeXNmcy9ncm91cC5jCmluZGV4IGRjMTM1OGIuLmFjMmRlMGUgMTAwNjQ0Ci0tLSBhL2ZzL3N5c2ZzL2dyb3VwLmMKKysrIGIvZnMvc3lzZnMvZ3JvdXAuYwpAQCAtMjMzLDggKzIzMyw4IEBACiAJCWtuID0ga2VybmZzX2ZpbmRfYW5kX2dldChwYXJlbnQsIGdycC0+bmFtZSk7CiAJCWlmICgha24pIHsKIAkJCVdBUk4oIWtuLCBLRVJOX1dBUk5JTkcKLQkJCSAgICAgInN5c2ZzIGdyb3VwICVwIG5vdCBmb3VuZCBmb3Iga29iamVjdCAnJXMnXG4iLAotCQkJICAgICBncnAsIGtvYmplY3RfbmFtZShrb2JqKSk7CisJCQkgICAgICJzeXNmcyBncm91cCAnJXMnIG5vdCBmb3VuZCBmb3Iga29iamVjdCAnJXMnXG4iLAorCQkJICAgICBncnAtPm5hbWUsIGtvYmplY3RfbmFtZShrb2JqKSk7CiAJCQlyZXR1cm47CiAJCX0KIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvdG5jX2NvbW1pdC5jIGIvZnMvdWJpZnMvdG5jX2NvbW1pdC5jCmluZGV4IGI0NTM0NWQuLjUxMTU3ZGEgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL3RuY19jb21taXQuYworKysgYi9mcy91Ymlmcy90bmNfY29tbWl0LmMKQEAgLTM3MCw3ICszNzAsNyBAQAogCiAJcCA9IGMtPmdhcF9sZWJzOwogCWRvIHsKLQkJdWJpZnNfYXNzZXJ0KHAgPCBjLT5nYXBfbGVicyArIHNpemVvZihpbnQpICogYy0+bHN0LmlkeF9sZWJzKTsKKwkJdWJpZnNfYXNzZXJ0KHAgPCBjLT5nYXBfbGVicyArIGMtPmxzdC5pZHhfbGVicyk7CiAJCXdyaXR0ZW4gPSBsYXlvdXRfbGViX2luX2dhcHMoYywgcCk7CiAJCWlmICh3cml0dGVuIDwgMCkgewogCQkJZXJyID0gd3JpdHRlbjsKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3hhdHRyLmMgYi9mcy91Ymlmcy94YXR0ci5jCmluZGV4IGUyMzc4MTEuLjExYTAwNDEgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL3hhdHRyLmMKKysrIGIvZnMvdWJpZnMveGF0dHIuYwpAQCAtNTc1LDcgKzU3NSw4IEBACiAJZGJnX2dlbigieGF0dHIgJyVzJywgaW5vICVsdSAoJyVwZCcpLCBidWYgc2l6ZSAlemQiLCBuYW1lLAogCQlpbm9kZS0+aV9pbm8sIGRlbnRyeSwgc2l6ZSk7CiAKLQlyZXR1cm4gIF9fdWJpZnNfZ2V0eGF0dHIoaW5vZGUsIG5hbWUsIGJ1ZmZlciwgc2l6ZSk7CisJbmFtZSA9IHhhdHRyX2Z1bGxfbmFtZShoYW5kbGVyLCBuYW1lKTsKKwlyZXR1cm4gX191Ymlmc19nZXR4YXR0cihpbm9kZSwgbmFtZSwgYnVmZmVyLCBzaXplKTsKIH0KIAogc3RhdGljIGludCB1Ymlmc194YXR0cl9zZXQoY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgKmhhbmRsZXIsCkBAIC01ODYsNiArNTg3LDggQEAKIAlkYmdfZ2VuKCJ4YXR0ciAnJXMnLCBob3N0IGlubyAlbHUgKCclcGQnKSwgc2l6ZSAlemQiLAogCQluYW1lLCBpbm9kZS0+aV9pbm8sIGRlbnRyeSwgc2l6ZSk7CiAKKwluYW1lID0geGF0dHJfZnVsbF9uYW1lKGhhbmRsZXIsIG5hbWUpOworCiAJaWYgKHZhbHVlKQogCQlyZXR1cm4gX191Ymlmc19zZXR4YXR0cihpbm9kZSwgbmFtZSwgdmFsdWUsIHNpemUsIGZsYWdzKTsKIAllbHNlCmRpZmYgLS1naXQgYS9mcy91ZGYvZmlsZS5jIGIvZnMvdWRmL2ZpbGUuYwppbmRleCA2MzI1NzA2Li5lODU1YmY4IDEwMDY0NAotLS0gYS9mcy91ZGYvZmlsZS5jCisrKyBiL2ZzL3VkZi9maWxlLmMKQEAgLTk0LDcgKzk0LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJKnBhZ2VwID0gcGFnZTsKIAotCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpICYmIGxlbiAhPSBQQUdFX1NJWkUpCisJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpCiAJCV9fdWRmX2FkaW5pY2JfcmVhZHBhZ2UocGFnZSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMDUsMTEgKzEwNSwyNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHVkZl9hZGluaWNiX3dyaXRlX2VuZChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkJIGxvZmZfdCBwb3MsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgY29waWVkLAorCQkJCSBzdHJ1Y3QgcGFnZSAqcGFnZSwgdm9pZCAqZnNkYXRhKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCWxvZmZfdCBsYXN0X3BvcyA9IHBvcyArIGNvcGllZDsKKwlpZiAobGFzdF9wb3MgPiBpbm9kZS0+aV9zaXplKQorCQlpX3NpemVfd3JpdGUoaW5vZGUsIGxhc3RfcG9zKTsKKwlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlwdXRfcGFnZShwYWdlKTsKKwlyZXR1cm4gY29waWVkOworfQorCiBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHVkZl9hZGluaWNiX2FvcHMgPSB7CiAJLnJlYWRwYWdlCT0gdWRmX2FkaW5pY2JfcmVhZHBhZ2UsCiAJLndyaXRlcGFnZQk9IHVkZl9hZGluaWNiX3dyaXRlcGFnZSwKIAkud3JpdGVfYmVnaW4JPSB1ZGZfYWRpbmljYl93cml0ZV9iZWdpbiwKLQkud3JpdGVfZW5kCT0gc2ltcGxlX3dyaXRlX2VuZCwKKwkud3JpdGVfZW5kCT0gdWRmX2FkaW5pY2Jfd3JpdGVfZW5kLAogCS5kaXJlY3RfSU8JPSB1ZGZfYWRpbmljYl9kaXJlY3RfSU8sCiB9OwogCmRpZmYgLS1naXQgYS9mcy94ZnMvTWFrZWZpbGUgYi9mcy94ZnMvTWFrZWZpbGUKaW5kZXggZmM1OTNjOC4uNTg0ZTg3ZSAxMDA2NDQKLS0tIGEvZnMveGZzL01ha2VmaWxlCisrKyBiL2ZzL3hmcy9NYWtlZmlsZQpAQCAtNTIsNiArNTIsNyBAQAogCQkJCSAgIHhmc19pbm9kZV9mb3JrLm8gXAogCQkJCSAgIHhmc19pbm9kZV9idWYubyBcCiAJCQkJICAgeGZzX2xvZ19ybGltaXQubyBcCisJCQkJICAgeGZzX2FnX3Jlc3YubyBcCiAJCQkJICAgeGZzX3JtYXAubyBcCiAJCQkJICAgeGZzX3JtYXBfYnRyZWUubyBcCiAJCQkJICAgeGZzX3NiLm8gXApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpYnhmcy94ZnNfYWdfcmVzdi5jIGIvZnMveGZzL2xpYnhmcy94ZnNfYWdfcmVzdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYWUwZjIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvbGlieGZzL3hmc19hZ19yZXN2LmMKQEAgLTAsMCArMSwzMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgT3JhY2xlLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBBdXRob3I6IERhcnJpY2sgSi4gV29uZyA8ZGFycmljay53b25nQG9yYWNsZS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19mcy5oIgorI2luY2x1ZGUgInhmc19zaGFyZWQuaCIKKyNpbmNsdWRlICJ4ZnNfZm9ybWF0LmgiCisjaW5jbHVkZSAieGZzX2xvZ19mb3JtYXQuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnNfcmVzdi5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19kZWZlci5oIgorI2luY2x1ZGUgInhmc19hbGxvYy5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc190cmFjZS5oIgorI2luY2x1ZGUgInhmc19ja3N1bS5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcC5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2FnX3Jlc3YuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnNfc3BhY2UuaCIKKyNpbmNsdWRlICJ4ZnNfcm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorCisvKgorICogUGVyLUFHIEJsb2NrIFJlc2VydmF0aW9ucworICoKKyAqIEZvciBzb21lIGtpbmRzIG9mIGFsbG9jYXRpb24gZ3JvdXAgbWV0YWRhdGEgc3RydWN0dXJlcywgaXQgaXMgYWR2YW50YWdlb3VzCisgKiB0byByZXNlcnZlIGEgc21hbGwgbnVtYmVyIG9mIGJsb2NrcyBpbiBlYWNoIEFHIHNvIHRoYXQgZnV0dXJlIGV4cGFuc2lvbnMgb2YKKyAqIHRoYXQgZGF0YSBzdHJ1Y3R1cmUgZG8gbm90IGVuY291bnRlciBFTk9TUEMgYmVjYXVzZSBlcnJvcnMgZHVyaW5nIGEgYnRyZWUKKyAqIHNwbGl0IGNhdXNlIHRoZSBmaWxlc3lzdGVtIHRvIGdvIG9mZmxpbmUuCisgKgorICogUHJpb3IgdG8gdGhlIGludHJvZHVjdGlvbiBvZiByZWZsaW5rLCB0aGlzIHdhc24ndCBhbiBpc3N1ZSBiZWNhdXNlIHRoZSBmcmVlCisgKiBzcGFjZSBidHJlZXMgbWFpbnRhaW4gYSByZXNlcnZlIG9mIHNwYWNlICh0aGUgQUdGTCkgdG8gaGFuZGxlIGFueSBleHBhbnNpb24KKyAqIHRoYXQgbWF5IGJlIG5lY2Vzc2FyeTsgYW5kIGFsbG9jYXRpb25zIG9mIG90aGVyIG1ldGFkYXRhIChpbm9kZXMsIEJNQlQsCisgKiBkaXIvYXR0cikgYXJlbid0IHJlc3RyaWN0ZWQgdG8gYSBzaW5nbGUgQUcuICBIb3dldmVyLCB3aXRoIHJlZmxpbmsgaXQgaXMKKyAqIHBvc3NpYmxlIHRvIGFsbG9jYXRlIGFsbCB0aGUgc3BhY2UgaW4gYW4gQUcsIGhhdmUgc3Vic2VxdWVudCByZWZsaW5rL0NvVworICogYWN0aXZpdHkgZXhwYW5kIHRoZSByZWZjb3VudCBidHJlZSwgYW5kIGRpc2NvdmVyIHRoYXQgdGhlcmUncyBubyBzcGFjZSBsZWZ0CisgKiB0byBoYW5kbGUgdGhhdCBleHBhbnNpb24uICBTaW5jZSB3ZSBjYW4gY2FsY3VsYXRlIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlCisgKiByZWZjb3VudCBidHJlZSwgd2UgY2FuIHJlc2VydmUgc3BhY2UgZm9yIGl0IGFuZCBhdm9pZCBFTk9TUEMuCisgKgorICogSGFuZGxpbmcgcGVyLUFHIHJlc2VydmF0aW9ucyBjb25zaXN0cyBvZiB0aHJlZSBjaGFuZ2VzIHRvIHRoZSBhbGxvY2F0b3IncworICogYmVoYXZpb3I6ICBGaXJzdCwgYmVjYXVzZSB0aGVzZSByZXNlcnZhdGlvbnMgYXJlIGFsd2F5cyBuZWVkZWQsIHdlIGRlY3JlYXNlCisgKiB0aGUgYWdfbWF4X3VzYWJsZSBjb3VudGVyIHRvIHJlZmxlY3QgdGhlIHNpemUgb2YgdGhlIEFHIGFmdGVyIHRoZSByZXNlcnZlZAorICogYmxvY2tzIGFyZSB0YWtlbi4gIFNlY29uZCwgdGhlIHJlc2VydmF0aW9ucyBtdXN0IGJlIHJlZmxlY3RlZCBpbiB0aGUKKyAqIGZkYmxvY2tzIGNvdW50IHRvIG1haW50YWluIHByb3BlciBhY2NvdW50aW5nLiAgVGhpcmQsIGVhY2ggQUcgbXVzdCBtYWludGFpbgorICogaXRzIG93biByZXNlcnZlZCBibG9jayBjb3VudGVyIHNvIHRoYXQgd2UgY2FuIGNhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIHNwYWNlCisgKiB0aGF0IG11c3QgcmVtYWluIGZyZWUgdG8gbWFpbnRhaW4gdGhlIHJlc2VydmF0aW9ucy4gIEZvdXJ0aCwgdGhlICJyZW1haW5pbmcKKyAqIHJlc2VydmVkIGJsb2NrcyIgY291bnQgbXVzdCBiZSB1c2VkIHdoZW4gY2FsY3VsYXRpbmcgdGhlIGxlbmd0aCBvZiB0aGUKKyAqIGxvbmdlc3QgZnJlZSBleHRlbnQgaW4gYW4gQUcgYW5kIHRvIGNsYW1wIG1heGxlbiBpbiB0aGUgcGVyLUFHIGFsbG9jYXRpb24KKyAqIGZ1bmN0aW9ucy4gIEluIG90aGVyIHdvcmRzLCB3ZSBtYWludGFpbiBhIHZpcnR1YWwgYWxsb2NhdGlvbiB2aWEgaW4tY29yZQorICogYWNjb3VudGluZyB0cmlja3Mgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGNsZWFuIHVwIGFmdGVyIGEgY3Jhc2guIDopCisgKgorICogUmVzZXJ2ZWQgYmxvY2tzIGNhbiBiZSBtYW5hZ2VkIGJ5IHBhc3Npbmcgb25lIG9mIHRoZSBlbnVtIHhmc19hZ19yZXN2X3R5cGUKKyAqIHZhbHVlcyB2aWEgc3RydWN0IHhmc19hbGxvY19hcmcgb3IgZGlyZWN0bHkgdG8gdGhlIHhmc19mcmVlX2V4dGVudAorICogZnVuY3Rpb24uICBJdCBtaWdodCBzZWVtIGEgbGl0dGxlIGZ1bm55IHRvIG1haW50YWluIGEgcmVzZXJ2b2lyIG9mIGJsb2NrcworICogdG8gZmVlZCBhbm90aGVyIHJlc2Vydm9pciwgYnV0IHRoZSBBR0ZMIG9ubHkgaG9sZHMgZW5vdWdoIGJsb2NrcyB0byBnZXQKKyAqIHRocm91Z2ggdGhlIG5leHQgdHJhbnNhY3Rpb24uICBUaGUgcGVyLUFHIHJlc2VydmF0aW9uIGlzIHRvIGVuc3VyZSAod2UKKyAqIGhvcGUpIHRoYXQgZWFjaCBBRyBuZXZlciBydW5zIG91dCBvZiBibG9ja3MuICBFYWNoIGRhdGEgc3RydWN0dXJlIHdhbnRpbmcKKyAqIHRvIHVzZSB0aGUgcmVzZXJ2YXRpb24gc3lzdGVtIHNob3VsZCB1cGRhdGUgYXNrL3VzZWQgaW4geGZzX2FnX3Jlc3ZfaW5pdC4KKyAqLworCisvKgorICogQXJlIHdlIGNyaXRpY2FsbHkgbG93IG9uIGJsb2Nrcz8gIEZvciBub3cgd2UnbGwgZGVmaW5lIHRoYXQgYXMgdGhlIG51bWJlcgorICogb2YgYmxvY2tzIHdlIGNhbiBnZXQgb3VyIGhhbmRzIG9uIGJlaW5nIGxlc3MgdGhhbiAxMCUgb2Ygd2hhdCB3ZSByZXNlcnZlZAorICogb3IgbGVzcyB0aGFuIHNvbWUgYXJiaXRyYXJ5IG51bWJlciAobWF4aW11bSBidHJlZSBoZWlnaHQpLgorICovCitib29sCit4ZnNfYWdfcmVzdl9jcml0aWNhbCgKKwlzdHJ1Y3QgeGZzX3BlcmFnCQkqcGFnLAorCWVudW0geGZzX2FnX3Jlc3ZfdHlwZQkJdHlwZSkKK3sKKwl4ZnNfZXh0bGVuX3QJCQlhdmFpbDsKKwl4ZnNfZXh0bGVuX3QJCQlvcmlnOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBYRlNfQUdfUkVTVl9NRVRBREFUQToKKwkJYXZhaWwgPSBwYWctPnBhZ2ZfZnJlZWJsa3MgLSBwYWctPnBhZ19hZ2ZsX3Jlc3YuYXJfcmVzZXJ2ZWQ7CisJCW9yaWcgPSBwYWctPnBhZ19tZXRhX3Jlc3YuYXJfYXNrZWQ7CisJCWJyZWFrOworCWNhc2UgWEZTX0FHX1JFU1ZfQUdGTDoKKwkJYXZhaWwgPSBwYWctPnBhZ2ZfZnJlZWJsa3MgKyBwYWctPnBhZ2ZfZmxjb3VudCAtCisJCQlwYWctPnBhZ19tZXRhX3Jlc3YuYXJfcmVzZXJ2ZWQ7CisJCW9yaWcgPSBwYWctPnBhZ19hZ2ZsX3Jlc3YuYXJfYXNrZWQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUFTU0VSVCgwKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXRyYWNlX3hmc19hZ19yZXN2X2NyaXRpY2FsKHBhZywgdHlwZSwgYXZhaWwpOworCisJLyogQ3JpdGljYWxseSBsb3cgaWYgbGVzcyB0aGFuIDEwJSBvciBtYXggYnRyZWUgaGVpZ2h0IHJlbWFpbnMuICovCisJcmV0dXJuIGF2YWlsIDwgb3JpZyAvIDEwIHx8IGF2YWlsIDwgWEZTX0JUUkVFX01BWExFVkVMUzsKK30KKworLyoKKyAqIEhvdyBtYW55IGJsb2NrcyBhcmUgcmVzZXJ2ZWQgYnV0IG5vdCB1c2VkLCBhbmQgdGhlcmVmb3JlIG11c3Qgbm90IGJlCisgKiBhbGxvY2F0ZWQgYXdheT8KKyAqLworeGZzX2V4dGxlbl90Cit4ZnNfYWdfcmVzdl9uZWVkZWQoCisJc3RydWN0IHhmc19wZXJhZwkJKnBhZywKKwllbnVtIHhmc19hZ19yZXN2X3R5cGUJCXR5cGUpCit7CisJeGZzX2V4dGxlbl90CQkJbGVuOworCisJbGVuID0gcGFnLT5wYWdfbWV0YV9yZXN2LmFyX3Jlc2VydmVkICsgcGFnLT5wYWdfYWdmbF9yZXN2LmFyX3Jlc2VydmVkOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgWEZTX0FHX1JFU1ZfTUVUQURBVEE6CisJY2FzZSBYRlNfQUdfUkVTVl9BR0ZMOgorCQlsZW4gLT0geGZzX3BlcmFnX3Jlc3YocGFnLCB0eXBlKS0+YXJfcmVzZXJ2ZWQ7CisJCWJyZWFrOworCWNhc2UgWEZTX0FHX1JFU1ZfTk9ORToKKwkJLyogZW1wdHkgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCX0KKworCXRyYWNlX3hmc19hZ19yZXN2X25lZWRlZChwYWcsIHR5cGUsIGxlbik7CisKKwlyZXR1cm4gbGVuOworfQorCisvKiBDbGVhbiBvdXQgYSByZXNlcnZhdGlvbiAqLworc3RhdGljIGludAorX194ZnNfYWdfcmVzdl9mcmVlKAorCXN0cnVjdCB4ZnNfcGVyYWcJCSpwYWcsCisJZW51bSB4ZnNfYWdfcmVzdl90eXBlCQl0eXBlKQoreworCXN0cnVjdCB4ZnNfYWdfcmVzdgkJKnJlc3Y7CisJeGZzX2V4dGxlbl90CQkJb2xkcmVzdjsKKwlpbnQJCQkJZXJyb3I7CisKKwl0cmFjZV94ZnNfYWdfcmVzdl9mcmVlKHBhZywgdHlwZSwgMCk7CisKKwlyZXN2ID0geGZzX3BlcmFnX3Jlc3YocGFnLCB0eXBlKTsKKwlwYWctPnBhZ19tb3VudC0+bV9hZ19tYXhfdXNhYmxlICs9IHJlc3YtPmFyX2Fza2VkOworCS8qCisJICogQUdGTCBibG9ja3MgYXJlIGFsd2F5cyBjb25zaWRlcmVkICJmcmVlIiwgc28gd2hhdGV2ZXIKKwkgKiB3YXMgcmVzZXJ2ZWQgYXQgbW91bnQgdGltZSBtdXN0IGJlIGdpdmVuIGJhY2sgYXQgdW1vdW50LgorCSAqLworCWlmICh0eXBlID09IFhGU19BR19SRVNWX0FHRkwpCisJCW9sZHJlc3YgPSByZXN2LT5hcl9vcmlnX3Jlc2VydmVkOworCWVsc2UKKwkJb2xkcmVzdiA9IHJlc3YtPmFyX3Jlc2VydmVkOworCWVycm9yID0geGZzX21vZF9mZGJsb2NrcyhwYWctPnBhZ19tb3VudCwgb2xkcmVzdiwgdHJ1ZSk7CisJcmVzdi0+YXJfcmVzZXJ2ZWQgPSAwOworCXJlc3YtPmFyX2Fza2VkID0gMDsKKworCWlmIChlcnJvcikKKwkJdHJhY2VfeGZzX2FnX3Jlc3ZfZnJlZV9lcnJvcihwYWctPnBhZ19tb3VudCwgcGFnLT5wYWdfYWdubywKKwkJCQllcnJvciwgX1JFVF9JUF8pOworCXJldHVybiBlcnJvcjsKK30KKworLyogRnJlZSBhIHBlci1BRyByZXNlcnZhdGlvbi4gKi8KK2ludAoreGZzX2FnX3Jlc3ZfZnJlZSgKKwlzdHJ1Y3QgeGZzX3BlcmFnCQkqcGFnKQoreworCWludAkJCQllcnJvcjsKKwlpbnQJCQkJZXJyMjsKKworCWVycm9yID0gX194ZnNfYWdfcmVzdl9mcmVlKHBhZywgWEZTX0FHX1JFU1ZfQUdGTCk7CisJZXJyMiA9IF9feGZzX2FnX3Jlc3ZfZnJlZShwYWcsIFhGU19BR19SRVNWX01FVEFEQVRBKTsKKwlpZiAoZXJyMiAmJiAhZXJyb3IpCisJCWVycm9yID0gZXJyMjsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQKK19feGZzX2FnX3Jlc3ZfaW5pdCgKKwlzdHJ1Y3QgeGZzX3BlcmFnCQkqcGFnLAorCWVudW0geGZzX2FnX3Jlc3ZfdHlwZQkJdHlwZSwKKwl4ZnNfZXh0bGVuX3QJCQlhc2ssCisJeGZzX2V4dGxlbl90CQkJdXNlZCkKK3sKKwlzdHJ1Y3QgeGZzX21vdW50CQkqbXAgPSBwYWctPnBhZ19tb3VudDsKKwlzdHJ1Y3QgeGZzX2FnX3Jlc3YJCSpyZXN2OworCWludAkJCQllcnJvcjsKKworCXJlc3YgPSB4ZnNfcGVyYWdfcmVzdihwYWcsIHR5cGUpOworCWlmICh1c2VkID4gYXNrKQorCQlhc2sgPSB1c2VkOworCXJlc3YtPmFyX2Fza2VkID0gYXNrOworCXJlc3YtPmFyX3Jlc2VydmVkID0gcmVzdi0+YXJfb3JpZ19yZXNlcnZlZCA9IGFzayAtIHVzZWQ7CisJbXAtPm1fYWdfbWF4X3VzYWJsZSAtPSBhc2s7CisKKwl0cmFjZV94ZnNfYWdfcmVzdl9pbml0KHBhZywgdHlwZSwgYXNrKTsKKworCWVycm9yID0geGZzX21vZF9mZGJsb2NrcyhtcCwgLShpbnQ2NF90KXJlc3YtPmFyX3Jlc2VydmVkLCB0cnVlKTsKKwlpZiAoZXJyb3IpCisJCXRyYWNlX3hmc19hZ19yZXN2X2luaXRfZXJyb3IocGFnLT5wYWdfbW91bnQsIHBhZy0+cGFnX2Fnbm8sCisJCQkJZXJyb3IsIF9SRVRfSVBfKTsKKworCXJldHVybiBlcnJvcjsKK30KKworLyogQ3JlYXRlIGEgcGVyLUFHIGJsb2NrIHJlc2VydmF0aW9uLiAqLworaW50Cit4ZnNfYWdfcmVzdl9pbml0KAorCXN0cnVjdCB4ZnNfcGVyYWcJCSpwYWcpCit7CisJeGZzX2V4dGxlbl90CQkJYXNrOworCXhmc19leHRsZW5fdAkJCXVzZWQ7CisJaW50CQkJCWVycm9yID0gMDsKKworCS8qIENyZWF0ZSB0aGUgbWV0YWRhdGEgcmVzZXJ2YXRpb24uICovCisJaWYgKHBhZy0+cGFnX21ldGFfcmVzdi5hcl9hc2tlZCA9PSAwKSB7CisJCWFzayA9IHVzZWQgPSAwOworCisJCWVycm9yID0gX194ZnNfYWdfcmVzdl9pbml0KHBhZywgWEZTX0FHX1JFU1ZfTUVUQURBVEEsCisJCQkJYXNrLCB1c2VkKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CisJfQorCisJLyogQ3JlYXRlIHRoZSBBR0ZMIG1ldGFkYXRhIHJlc2VydmF0aW9uICovCisJaWYgKHBhZy0+cGFnX2FnZmxfcmVzdi5hcl9hc2tlZCA9PSAwKSB7CisJCWFzayA9IHVzZWQgPSAwOworCisJCWVycm9yID0gX194ZnNfYWdfcmVzdl9pbml0KHBhZywgWEZTX0FHX1JFU1ZfQUdGTCwgYXNrLCB1c2VkKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CisJfQorCitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCisvKiBBbGxvY2F0ZSBhIGJsb2NrIGZyb20gdGhlIHJlc2VydmF0aW9uLiAqLwordm9pZAoreGZzX2FnX3Jlc3ZfYWxsb2NfZXh0ZW50KAorCXN0cnVjdCB4ZnNfcGVyYWcJCSpwYWcsCisJZW51bSB4ZnNfYWdfcmVzdl90eXBlCQl0eXBlLAorCXN0cnVjdCB4ZnNfYWxsb2NfYXJnCQkqYXJncykKK3sKKwlzdHJ1Y3QgeGZzX2FnX3Jlc3YJCSpyZXN2OworCXhmc19leHRsZW5fdAkJCWxlbjsKKwl1aW50CQkJCWZpZWxkOworCisJdHJhY2VfeGZzX2FnX3Jlc3ZfYWxsb2NfZXh0ZW50KHBhZywgdHlwZSwgYXJncy0+bGVuKTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgWEZTX0FHX1JFU1ZfTUVUQURBVEE6CisJY2FzZSBYRlNfQUdfUkVTVl9BR0ZMOgorCQlyZXN2ID0geGZzX3BlcmFnX3Jlc3YocGFnLCB0eXBlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFhGU19BR19SRVNWX05PTkU6CisJCWZpZWxkID0gYXJncy0+d2FzZGVsID8gWEZTX1RSQU5TX1NCX1JFU19GREJMT0NLUyA6CisJCQkJICAgICAgIFhGU19UUkFOU19TQl9GREJMT0NLUzsKKwkJeGZzX3RyYW5zX21vZF9zYihhcmdzLT50cCwgZmllbGQsIC0oaW50NjRfdClhcmdzLT5sZW4pOworCQlyZXR1cm47CisJfQorCisJbGVuID0gbWluX3QoeGZzX2V4dGxlbl90LCBhcmdzLT5sZW4sIHJlc3YtPmFyX3Jlc2VydmVkKTsKKwlyZXN2LT5hcl9yZXNlcnZlZCAtPSBsZW47CisJaWYgKHR5cGUgPT0gWEZTX0FHX1JFU1ZfQUdGTCkKKwkJcmV0dXJuOworCS8qIEFsbG9jYXRpb25zIG9mIHJlc2VydmVkIGJsb2NrcyBvbmx5IG5lZWQgb24tZGlzayBzYiB1cGRhdGVzLi4uICovCisJeGZzX3RyYW5zX21vZF9zYihhcmdzLT50cCwgWEZTX1RSQU5TX1NCX1JFU19GREJMT0NLUywgLShpbnQ2NF90KWxlbik7CisJLyogLi4uYnV0IG5vbi1yZXNlcnZlZCBibG9ja3MgbmVlZCBpbi1jb3JlIGFuZCBvbi1kaXNrIHVwZGF0ZXMuICovCisJaWYgKGFyZ3MtPmxlbiA+IGxlbikKKwkJeGZzX3RyYW5zX21vZF9zYihhcmdzLT50cCwgWEZTX1RSQU5TX1NCX0ZEQkxPQ0tTLAorCQkJCS0oKGludDY0X3QpYXJncy0+bGVuIC0gbGVuKSk7Cit9CisKKy8qIEZyZWUgYSBibG9jayB0byB0aGUgcmVzZXJ2YXRpb24uICovCit2b2lkCit4ZnNfYWdfcmVzdl9mcmVlX2V4dGVudCgKKwlzdHJ1Y3QgeGZzX3BlcmFnCQkqcGFnLAorCWVudW0geGZzX2FnX3Jlc3ZfdHlwZQkJdHlwZSwKKwlzdHJ1Y3QgeGZzX3RyYW5zCQkqdHAsCisJeGZzX2V4dGxlbl90CQkJbGVuKQoreworCXhmc19leHRsZW5fdAkJCWxlZnRvdmVyOworCXN0cnVjdCB4ZnNfYWdfcmVzdgkJKnJlc3Y7CisKKwl0cmFjZV94ZnNfYWdfcmVzdl9mcmVlX2V4dGVudChwYWcsIHR5cGUsIGxlbik7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFhGU19BR19SRVNWX01FVEFEQVRBOgorCWNhc2UgWEZTX0FHX1JFU1ZfQUdGTDoKKwkJcmVzdiA9IHhmc19wZXJhZ19yZXN2KHBhZywgdHlwZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUFTU0VSVCgwKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBYRlNfQUdfUkVTVl9OT05FOgorCQl4ZnNfdHJhbnNfbW9kX3NiKHRwLCBYRlNfVFJBTlNfU0JfRkRCTE9DS1MsIChpbnQ2NF90KWxlbik7CisJCXJldHVybjsKKwl9CisKKwlsZWZ0b3ZlciA9IG1pbl90KHhmc19leHRsZW5fdCwgbGVuLCByZXN2LT5hcl9hc2tlZCAtIHJlc3YtPmFyX3Jlc2VydmVkKTsKKwlyZXN2LT5hcl9yZXNlcnZlZCArPSBsZWZ0b3ZlcjsKKwlpZiAodHlwZSA9PSBYRlNfQUdfUkVTVl9BR0ZMKQorCQlyZXR1cm47CisJLyogRnJlZWluZyBpbnRvIHRoZSByZXNlcnZlZCBwb29sIG9ubHkgcmVxdWlyZXMgb24tZGlzayB1cGRhdGUuLi4gKi8KKwl4ZnNfdHJhbnNfbW9kX3NiKHRwLCBYRlNfVFJBTlNfU0JfUkVTX0ZEQkxPQ0tTLCBsZW4pOworCS8qIC4uLmJ1dCBmcmVlaW5nIGJleW9uZCB0aGF0IHJlcXVpcmVzIGluLWNvcmUgYW5kIG9uLWRpc2sgdXBkYXRlLiAqLworCWlmIChsZW4gPiBsZWZ0b3ZlcikKKwkJeGZzX3RyYW5zX21vZF9zYih0cCwgWEZTX1RSQU5TX1NCX0ZEQkxPQ0tTLCBsZW4gLSBsZWZ0b3Zlcik7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMvbGlieGZzL3hmc19hZ19yZXN2LmggYi9mcy94ZnMvbGlieGZzL3hmc19hZ19yZXN2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ2YzY4NwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9saWJ4ZnMveGZzX2FnX3Jlc3YuaApAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IE9yYWNsZS4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogQXV0aG9yOiBEYXJyaWNrIEouIFdvbmcgPGRhcnJpY2sud29uZ0BvcmFjbGUuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCisgKi8KKyNpZm5kZWYgX19YRlNfQUdfUkVTVl9IX18KKyNkZWZpbmUJX19YRlNfQUdfUkVTVl9IX18KKworaW50IHhmc19hZ19yZXN2X2ZyZWUoc3RydWN0IHhmc19wZXJhZyAqcGFnKTsKK2ludCB4ZnNfYWdfcmVzdl9pbml0KHN0cnVjdCB4ZnNfcGVyYWcgKnBhZyk7CisKK2Jvb2wgeGZzX2FnX3Jlc3ZfY3JpdGljYWwoc3RydWN0IHhmc19wZXJhZyAqcGFnLCBlbnVtIHhmc19hZ19yZXN2X3R5cGUgdHlwZSk7Cit4ZnNfZXh0bGVuX3QgeGZzX2FnX3Jlc3ZfbmVlZGVkKHN0cnVjdCB4ZnNfcGVyYWcgKnBhZywKKwkJZW51bSB4ZnNfYWdfcmVzdl90eXBlIHR5cGUpOworCit2b2lkIHhmc19hZ19yZXN2X2FsbG9jX2V4dGVudChzdHJ1Y3QgeGZzX3BlcmFnICpwYWcsIGVudW0geGZzX2FnX3Jlc3ZfdHlwZSB0eXBlLAorCQlzdHJ1Y3QgeGZzX2FsbG9jX2FyZyAqYXJncyk7Cit2b2lkIHhmc19hZ19yZXN2X2ZyZWVfZXh0ZW50KHN0cnVjdCB4ZnNfcGVyYWcgKnBhZywgZW51bSB4ZnNfYWdfcmVzdl90eXBlIHR5cGUsCisJCXN0cnVjdCB4ZnNfdHJhbnMgKnRwLCB4ZnNfZXh0bGVuX3QgbGVuKTsKKworI2VuZGlmCS8qIF9fWEZTX0FHX1JFU1ZfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGlieGZzL3hmc19hbGxvYy5jIGIvZnMveGZzL2xpYnhmcy94ZnNfYWxsb2MuYwppbmRleCA3NzZhZTJmLi5jYTc1ZGM5IDEwMDY0NAotLS0gYS9mcy94ZnMvbGlieGZzL3hmc19hbGxvYy5jCisrKyBiL2ZzL3hmcy9saWJ4ZnMveGZzX2FsbG9jLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKICNpbmNsdWRlICJ4ZnNfYnVmX2l0ZW0uaCIKICNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX2FnX3Jlc3YuaCIKIAogc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnhmc19hbGxvY193cTsKIApAQCAtNzQsMTQgKzc1LDggQEAKICAqIGV4dGVudHMgbmVlZCB0byBiZSBhY3R1YWxseSBhbGxvY2F0ZWQuIFRvIGdldCBhcm91bmQgdGhpcywgd2UgZXhwbGljaXRseSBzZXQKICAqIGFzaWRlIGEgZmV3IGJsb2NrcyB3aGljaCB3aWxsIG5vdCBiZSByZXNlcnZlZCBpbiBkZWxheWVkIGFsbG9jYXRpb24uCiAgKgotICogV2hlbiBybWFwIGlzIGRpc2FibGVkLCB3ZSBuZWVkIHRvIHJlc2VydmUgNCBmc2JzIF9wZXIgQUdfIGZvciB0aGUgZnJlZWxpc3QKLSAqIGFuZCA0IG1vcmUgdG8gaGFuZGxlIGEgcG90ZW50aWFsIHNwbGl0IG9mIHRoZSBmaWxlJ3MgYm1hcCBidHJlZS4KLSAqCi0gKiBXaGVuIHJtYXAgaXMgZW5hYmxlZCwgd2UgbXVzdCBhbHNvIGJlIGFibGUgdG8gaGFuZGxlIHR3byBybWFwIGJ0cmVlIGluc2VydHMKLSAqIHRvIHJlY29yZCBib3RoIHRoZSBmaWxlIGRhdGEgZXh0ZW50IGFuZCBhIG5ldyBibWJ0IGJsb2NrLiAgVGhlIGJtYnQgYmxvY2sKLSAqIG1pZ2h0IG5vdCBiZSBpbiB0aGUgc2FtZSBBRyBhcyB0aGUgZmlsZSBkYXRhIGV4dGVudC4gIEluIHRoZSB3b3JzdCBjYXNlCi0gKiB0aGUgYm1hcCBidHJlZSBzcGxpdHMgbXVsdGlwbGUgbGV2ZWxzIGFuZCBhbGwgdGhlIG5ldyBibG9ja3MgY29tZSBmcm9tCi0gKiBkaWZmZXJlbnQgQUdzLCBzbyBzZXQgYXNpZGUgZW5vdWdoIHRvIGhhbmRsZSBybWFwIGJ0cmVlIHNwbGl0cyBpbiBhbGwgQUdzLgorICogV2UgbmVlZCB0byByZXNlcnZlIDQgZnNicyBfcGVyIEFHXyBmb3IgdGhlIGZyZWVsaXN0IGFuZCA0IG1vcmUgdG8gaGFuZGxlIGEKKyAqIHBvdGVudGlhbCBzcGxpdCBvZiB0aGUgZmlsZSdzIGJtYXAgYnRyZWUuCiAgKi8KIHVuc2lnbmVkIGludAogeGZzX2FsbG9jX3NldF9hc2lkZSgKQEAgLTkwLDggKzg1LDYgQEAKIAl1bnNpZ25lZCBpbnQJCWJsb2NrczsKIAogCWJsb2NrcyA9IDQgKyAobXAtPm1fc2Iuc2JfYWdjb3VudCAqIFhGU19BTExPQ19BR0ZMX1JFU0VSVkUpOwotCWlmICh4ZnNfc2JfdmVyc2lvbl9oYXNybWFwYnQoJm1wLT5tX3NiKSkKLQkJYmxvY2tzICs9IG1wLT5tX3NiLnNiX2FnY291bnQgKiBtcC0+bV9ybWFwX21heGxldmVsczsKIAlyZXR1cm4gYmxvY2tzOwogfQogCkBAIC0yNjUsNyArMjU4LDcgQEAKIAl4ZnNfYWdibG9ja190CXdhbnRibm8sCS8qIHRhcmdldCBzdGFydGluZyBibG9jayAqLwogCXhmc19leHRsZW5fdAl3YW50bGVuLAkvKiB0YXJnZXQgbGVuZ3RoICovCiAJeGZzX2V4dGxlbl90CWFsaWdubWVudCwJLyogdGFyZ2V0IGFsaWdubWVudCAqLwotCWNoYXIJCXVzZXJkYXRhLAkvKiBhcmUgd2UgYWxsb2NhdGluZyBkYXRhPyAqLworCWludAkJZGF0YXR5cGUsCS8qIGFyZSB3ZSBhbGxvY2F0aW5nIGRhdGE/ICovCiAJeGZzX2FnYmxvY2tfdAlmcmVlYm5vLAkvKiBmcmVlc3BhY2UncyBzdGFydGluZyBibG9jayAqLwogCXhmc19leHRsZW5fdAlmcmVlbGVuLAkvKiBmcmVlc3BhY2UncyBsZW5ndGggKi8KIAl4ZnNfYWdibG9ja190CSpuZXdibm9wKQkvKiByZXN1bHQ6IGJlc3Qgc3RhcnQgYmxvY2sgZnJvbSBmcmVlICovCkBAIC0yNzYsNiArMjY5LDcgQEAKIAl4ZnNfZXh0bGVuX3QJbmV3bGVuMT0wOwkvKiBsZW5ndGggd2l0aCBuZXdibm8xICovCiAJeGZzX2V4dGxlbl90CW5ld2xlbjI9MDsJLyogbGVuZ3RoIHdpdGggbmV3Ym5vMiAqLwogCXhmc19hZ2Jsb2NrX3QJd2FudGVuZDsJLyogZW5kIG9mIHRhcmdldCBleHRlbnQgKi8KKwlib29sCQl1c2VyZGF0YSA9IHhmc19hbGxvY19pc191c2VyZGF0YShkYXRhdHlwZSk7CiAKIAlBU1NFUlQoZnJlZWxlbiA+PSB3YW50bGVuKTsKIAlmcmVlZW5kID0gZnJlZWJubyArIGZyZWVsZW47CkBAIC02ODAsMTIgKzY3NCwyOSBAQAogCXhmc19hbGxvY19hcmdfdAkqYXJncykJLyogYXJndW1lbnQgc3RydWN0dXJlIGZvciBhbGxvY2F0aW9uICovCiB7CiAJaW50CQllcnJvcj0wOworCXhmc19leHRsZW5fdAlyZXNlcnZhdGlvbjsKKwl4ZnNfZXh0bGVuX3QJb2xkbWF4OwogCiAJQVNTRVJUKGFyZ3MtPm1pbmxlbiA+IDApOwogCUFTU0VSVChhcmdzLT5tYXhsZW4gPiAwKTsKIAlBU1NFUlQoYXJncy0+bWlubGVuIDw9IGFyZ3MtPm1heGxlbik7CiAJQVNTRVJUKGFyZ3MtPm1vZCA8IGFyZ3MtPnByb2QpOwogCUFTU0VSVChhcmdzLT5hbGlnbm1lbnQgPiAwKTsKKworCS8qCisJICogQ2xhbXAgbWF4bGVuIHRvIHRoZSBhbW91bnQgb2YgZnJlZSBzcGFjZSBtaW51cyBhbnkgcmVzZXJ2YXRpb25zCisJICogdGhhdCBoYXZlIGJlZW4gbWFkZS4KKwkgKi8KKwlvbGRtYXggPSBhcmdzLT5tYXhsZW47CisJcmVzZXJ2YXRpb24gPSB4ZnNfYWdfcmVzdl9uZWVkZWQoYXJncy0+cGFnLCBhcmdzLT5yZXN2KTsKKwlpZiAoYXJncy0+bWF4bGVuID4gYXJncy0+cGFnLT5wYWdmX2ZyZWVibGtzIC0gcmVzZXJ2YXRpb24pCisJCWFyZ3MtPm1heGxlbiA9IGFyZ3MtPnBhZy0+cGFnZl9mcmVlYmxrcyAtIHJlc2VydmF0aW9uOworCWlmIChhcmdzLT5tYXhsZW4gPT0gMCkgeworCQlhcmdzLT5hZ2JubyA9IE5VTExBR0JMT0NLOworCQlhcmdzLT5tYXhsZW4gPSBvbGRtYXg7CisJCXJldHVybiAwOworCX0KKwogCS8qCiAJICogQnJhbmNoIHRvIGNvcnJlY3Qgcm91dGluZSBiYXNlZCBvbiB0aGUgdHlwZS4KIAkgKi8KQEAgLTcwNSwxMiArNzE2LDE0IEBACiAJCS8qIE5PVFJFQUNIRUQgKi8KIAl9CiAKKwlhcmdzLT5tYXhsZW4gPSBvbGRtYXg7CisKIAlpZiAoZXJyb3IgfHwgYXJncy0+YWdibm8gPT0gTlVMTEFHQkxPQ0spCiAJCXJldHVybiBlcnJvcjsKIAogCUFTU0VSVChhcmdzLT5sZW4gPj0gYXJncy0+bWlubGVuKTsKIAlBU1NFUlQoYXJncy0+bGVuIDw9IGFyZ3MtPm1heGxlbik7Ci0JQVNTRVJUKCFhcmdzLT53YXNmcm9tZmwgfHwgIWFyZ3MtPmlzZmwpOworCUFTU0VSVCghYXJncy0+d2FzZnJvbWZsIHx8IGFyZ3MtPnJlc3YgIT0gWEZTX0FHX1JFU1ZfQUdGTCk7CiAJQVNTRVJUKGFyZ3MtPmFnYm5vICUgYXJncy0+YWxpZ25tZW50ID09IDApOwogCiAJLyogaWYgbm90IGZpbGUgZGF0YSwgaW5zZXJ0IG5ldyBibG9jayBpbnRvIHRoZSByZXZlcnNlIG1hcCBidHJlZSAqLwpAQCAtNzMyLDEyICs3NDUsNyBAQAogCQkJCQkgICAgICBhcmdzLT5hZ2JubywgYXJncy0+bGVuKSk7CiAJfQogCi0JaWYgKCFhcmdzLT5pc2ZsKSB7Ci0JCXhmc190cmFuc19tb2Rfc2IoYXJncy0+dHAsIGFyZ3MtPndhc2RlbCA/Ci0JCQkJIFhGU19UUkFOU19TQl9SRVNfRkRCTE9DS1MgOgotCQkJCSBYRlNfVFJBTlNfU0JfRkRCTE9DS1MsCi0JCQkJIC0oKGxvbmcpKGFyZ3MtPmxlbikpKTsKLQl9CisJeGZzX2FnX3Jlc3ZfYWxsb2NfZXh0ZW50KGFyZ3MtPnBhZywgYXJncy0+cmVzdiwgYXJncyk7CiAKIAlYRlNfU1RBVFNfSU5DKGFyZ3MtPm1wLCB4c19hbGxvY3gpOwogCVhGU19TVEFUU19BREQoYXJncy0+bXAsIHhzX2FsbG9jYiwgYXJncy0+bGVuKTsKQEAgLTkxNyw3ICs5MjUsNyBAQAogCiAJCQlzZGlmZiA9IHhmc19hbGxvY19jb21wdXRlX2RpZmYoYXJncy0+YWdibm8sIGFyZ3MtPmxlbiwKIAkJCQkJCSAgICAgICBhcmdzLT5hbGlnbm1lbnQsCi0JCQkJCQkgICAgICAgYXJncy0+dXNlcmRhdGEsICpzYm5vYSwKKwkJCQkJCSAgICAgICBhcmdzLT5kYXRhdHlwZSwgKnNibm9hLAogCQkJCQkJICAgICAgICpzbGVuYSwgJm5ldyk7CiAKIAkJCS8qCkBAIC0xMTAxLDcgKzExMDksNyBAQAogCQkJaWYgKGFyZ3MtPmxlbiA8IGJsZW4pCiAJCQkJY29udGludWU7CiAJCQlsdGRpZmYgPSB4ZnNfYWxsb2NfY29tcHV0ZV9kaWZmKGFyZ3MtPmFnYm5vLCBhcmdzLT5sZW4sCi0JCQkJYXJncy0+YWxpZ25tZW50LCBhcmdzLT51c2VyZGF0YSwgbHRibm9hLAorCQkJCWFyZ3MtPmFsaWdubWVudCwgYXJncy0+ZGF0YXR5cGUsIGx0Ym5vYSwKIAkJCQlsdGxlbmEsICZsdG5ldyk7CiAJCQlpZiAobHRuZXcgIT0gTlVMTEFHQkxPQ0sgJiYKIAkJCSAgICAoYXJncy0+bGVuID4gYmxlbiB8fCBsdGRpZmYgPCBiZGlmZikpIHsKQEAgLTEyNTQsNyArMTI2Miw3IEBACiAJCQlhcmdzLT5sZW4gPSBYRlNfRVhUTEVOX01JTihsdGxlbmEsIGFyZ3MtPm1heGxlbik7CiAJCQl4ZnNfYWxsb2NfZml4X2xlbihhcmdzKTsKIAkJCWx0ZGlmZiA9IHhmc19hbGxvY19jb21wdXRlX2RpZmYoYXJncy0+YWdibm8sIGFyZ3MtPmxlbiwKLQkJCQlhcmdzLT5hbGlnbm1lbnQsIGFyZ3MtPnVzZXJkYXRhLCBsdGJub2EsCisJCQkJYXJncy0+YWxpZ25tZW50LCBhcmdzLT5kYXRhdHlwZSwgbHRibm9hLAogCQkJCWx0bGVuYSwgJmx0bmV3KTsKIAogCQkJZXJyb3IgPSB4ZnNfYWxsb2NfZmluZF9iZXN0X2V4dGVudChhcmdzLApAQCAtMTI3MSw3ICsxMjc5LDcgQEAKIAkJCWFyZ3MtPmxlbiA9IFhGU19FWFRMRU5fTUlOKGd0bGVuYSwgYXJncy0+bWF4bGVuKTsKIAkJCXhmc19hbGxvY19maXhfbGVuKGFyZ3MpOwogCQkJZ3RkaWZmID0geGZzX2FsbG9jX2NvbXB1dGVfZGlmZihhcmdzLT5hZ2JubywgYXJncy0+bGVuLAotCQkJCWFyZ3MtPmFsaWdubWVudCwgYXJncy0+dXNlcmRhdGEsIGd0Ym5vYSwKKwkJCQlhcmdzLT5hbGlnbm1lbnQsIGFyZ3MtPmRhdGF0eXBlLCBndGJub2EsCiAJCQkJZ3RsZW5hLCAmZ3RuZXcpOwogCiAJCQllcnJvciA9IHhmc19hbGxvY19maW5kX2Jlc3RfZXh0ZW50KGFyZ3MsCkBAIC0xMzMxLDcgKzEzMzksNyBAQAogCX0KIAlybGVuID0gYXJncy0+bGVuOwogCSh2b2lkKXhmc19hbGxvY19jb21wdXRlX2RpZmYoYXJncy0+YWdibm8sIHJsZW4sIGFyZ3MtPmFsaWdubWVudCwKLQkJCQkgICAgIGFyZ3MtPnVzZXJkYXRhLCBsdGJub2EsIGx0bGVuYSwgJmx0bmV3KTsKKwkJCQkgICAgIGFyZ3MtPmRhdGF0eXBlLCBsdGJub2EsIGx0bGVuYSwgJmx0bmV3KTsKIAlBU1NFUlQobHRuZXcgPj0gbHRibm8pOwogCUFTU0VSVChsdG5ldyArIHJsZW4gPD0gbHRibm9hICsgbHRsZW5hKTsKIAlBU1NFUlQobHRuZXcgKyBybGVuIDw9IGJlMzJfdG9fY3B1KFhGU19CVUZfVE9fQUdGKGFyZ3MtPmFnYnApLT5hZ2ZfbGVuZ3RoKSk7CkBAIC0xNTgyLDYgKzE1OTAsOCBAQAogCXhmc19leHRsZW5fdAkqZmxlbnAsCS8qIHJlc3VsdCBsZW5ndGggKi8KIAlpbnQJCSpzdGF0KQkvKiBzdGF0dXM6IDAtZnJlZWxpc3QsIDEtbm9ybWFsL25vbmUgKi8KIHsKKwlzdHJ1Y3QgeGZzX293bmVyX2luZm8Jb2luZm87CisJc3RydWN0IHhmc19wZXJhZwkqcGFnOwogCWludAkJZXJyb3I7CiAJeGZzX2FnYmxvY2tfdAlmYm5vOwogCXhmc19leHRsZW5fdAlmbGVuOwpAQCAtMTU5OSw3ICsxNjA5LDggQEAKIAkgKiB0byByZXNwZWN0IG1pbmxlZnQgZXZlbiB3aGVuIHB1bGxpbmcgZnJvbSB0aGUKIAkgKiBmcmVlbGlzdC4KIAkgKi8KLQllbHNlIGlmIChhcmdzLT5taW5sZW4gPT0gMSAmJiBhcmdzLT5hbGlnbm1lbnQgPT0gMSAmJiAhYXJncy0+aXNmbCAmJgorCWVsc2UgaWYgKGFyZ3MtPm1pbmxlbiA9PSAxICYmIGFyZ3MtPmFsaWdubWVudCA9PSAxICYmCisJCSBhcmdzLT5yZXN2ICE9IFhGU19BR19SRVNWX0FHRkwgJiYKIAkJIChiZTMyX3RvX2NwdShYRlNfQlVGX1RPX0FHRihhcmdzLT5hZ2JwKS0+YWdmX2ZsY291bnQpCiAJCSAgPiBhcmdzLT5taW5sZWZ0KSkgewogCQllcnJvciA9IHhmc19hbGxvY19nZXRfZnJlZWxpc3QoYXJncy0+dHAsIGFyZ3MtPmFnYnAsICZmYm5vLCAwKTsKQEAgLTE2MDcsOSArMTYxOCw5IEBACiAJCQlnb3RvIGVycm9yMDsKIAkJaWYgKGZibm8gIT0gTlVMTEFHQkxPQ0spIHsKIAkJCXhmc19leHRlbnRfYnVzeV9yZXVzZShhcmdzLT5tcCwgYXJncy0+YWdubywgZmJubywgMSwKLQkJCQkJICAgICBhcmdzLT51c2VyZGF0YSk7CisJCQkgICAgICB4ZnNfYWxsb2NfYWxsb3dfYnVzeV9yZXVzZShhcmdzLT5kYXRhdHlwZSkpOwogCi0JCQlpZiAoYXJncy0+dXNlcmRhdGEpIHsKKwkJCWlmICh4ZnNfYWxsb2NfaXNfdXNlcmRhdGEoYXJncy0+ZGF0YXR5cGUpKSB7CiAJCQkJeGZzX2J1Zl90CSpicDsKIAogCQkJCWJwID0geGZzX2J0cmVlX2dldF9idWZzKGFyZ3MtPm1wLCBhcmdzLT50cCwKQEAgLTE2MjQsNiArMTYzNSwyMyBAQAogCQkJCWVycm9yMCk7CiAJCQlhcmdzLT53YXNmcm9tZmwgPSAxOwogCQkJdHJhY2VfeGZzX2FsbG9jX3NtYWxsX2ZyZWVsaXN0KGFyZ3MpOworCisJCQkvKgorCQkJICogSWYgd2UncmUgZmVlZGluZyBhbiBBR0ZMIGJsb2NrIHRvIHNvbWV0aGluZyB0aGF0CisJCQkgKiBkb2Vzbid0IGxpdmUgaW4gdGhlIGZyZWUgc3BhY2UsIHdlIG5lZWQgdG8gY2xlYXIKKwkJCSAqIG91dCB0aGUgT1dOX0FHIHJtYXAgYW5kIGFkZCB0aGUgYmxvY2sgYmFjayB0bworCQkJICogdGhlIEFHRkwgcGVyLUFHIHJlc2VydmF0aW9uLgorCQkJICovCisJCQl4ZnNfcm1hcF9hZ19vd25lcigmb2luZm8sIFhGU19STUFQX09XTl9BRyk7CisJCQllcnJvciA9IHhmc19ybWFwX2ZyZWUoYXJncy0+dHAsIGFyZ3MtPmFnYnAsIGFyZ3MtPmFnbm8sCisJCQkJCWZibm8sIDEsICZvaW5mbyk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBlcnJvcjA7CisJCQlwYWcgPSB4ZnNfcGVyYWdfZ2V0KGFyZ3MtPm1wLCBhcmdzLT5hZ25vKTsKKwkJCXhmc19hZ19yZXN2X2ZyZWVfZXh0ZW50KHBhZywgWEZTX0FHX1JFU1ZfQUdGTCwKKwkJCQkJYXJncy0+dHAsIDEpOworCQkJeGZzX3BlcmFnX3B1dChwYWcpOworCiAJCQkqc3RhdCA9IDA7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtMTY3MCw3ICsxNjk4LDcgQEAKIAl4ZnNfYWdibG9ja190CQlibm8sCiAJeGZzX2V4dGxlbl90CQlsZW4sCiAJc3RydWN0IHhmc19vd25lcl9pbmZvCSpvaW5mbywKLQlpbnQJCQlpc2ZsKQorCWVudW0geGZzX2FnX3Jlc3ZfdHlwZQl0eXBlKQogewogCXhmc19idHJlZV9jdXJfdAkqYm5vX2N1cjsJLyogY3Vyc29yIGZvciBieS1ibG9jayBidHJlZSAqLwogCXhmc19idHJlZV9jdXJfdAkqY250X2N1cjsJLyogY3Vyc29yIGZvciBieS1zaXplIGJ0cmVlICovCkBAIC0xODk4LDIxICsxOTI2LDIyIEBACiAJICovCiAJcGFnID0geGZzX3BlcmFnX2dldChtcCwgYWdubyk7CiAJZXJyb3IgPSB4ZnNfYWxsb2NfdXBkYXRlX2NvdW50ZXJzKHRwLCBwYWcsIGFnYnAsIGxlbik7CisJeGZzX2FnX3Jlc3ZfZnJlZV9leHRlbnQocGFnLCB0eXBlLCB0cCwgbGVuKTsKIAl4ZnNfcGVyYWdfcHV0KHBhZyk7CiAJaWYgKGVycm9yKQogCQlnb3RvIGVycm9yMDsKIAotCWlmICghaXNmbCkKLQkJeGZzX3RyYW5zX21vZF9zYih0cCwgWEZTX1RSQU5TX1NCX0ZEQkxPQ0tTLCAobG9uZylsZW4pOwogCVhGU19TVEFUU19JTkMobXAsIHhzX2ZyZWV4KTsKIAlYRlNfU1RBVFNfQUREKG1wLCB4c19mcmVlYiwgbGVuKTsKIAotCXRyYWNlX3hmc19mcmVlX2V4dGVudChtcCwgYWdubywgYm5vLCBsZW4sIGlzZmwsIGhhdmVsZWZ0LCBoYXZlcmlnaHQpOworCXRyYWNlX3hmc19mcmVlX2V4dGVudChtcCwgYWdubywgYm5vLCBsZW4sIHR5cGUgPT0gWEZTX0FHX1JFU1ZfQUdGTCwKKwkJCWhhdmVsZWZ0LCBoYXZlcmlnaHQpOwogCiAJcmV0dXJuIDA7CiAKICBlcnJvcjA6Ci0JdHJhY2VfeGZzX2ZyZWVfZXh0ZW50KG1wLCBhZ25vLCBibm8sIGxlbiwgaXNmbCwgLTEsIC0xKTsKKwl0cmFjZV94ZnNfZnJlZV9leHRlbnQobXAsIGFnbm8sIGJubywgbGVuLCB0eXBlID09IFhGU19BR19SRVNWX0FHRkwsCisJCQktMSwgLTEpOwogCWlmIChibm9fY3VyKQogCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihibm9fY3VyLCBYRlNfQlRSRUVfRVJST1IpOwogCWlmIChjbnRfY3VyKQpAQCAtMTkzNywyMSArMTk2Niw0MyBAQAogfQogCiAvKgotICogRmluZCB0aGUgbGVuZ3RoIG9mIHRoZSBsb25nZXN0IGV4dGVudCBpbiBhbiBBRy4KKyAqIEZpbmQgdGhlIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCBleHRlbnQgaW4gYW4gQUcuICBUaGUgJ25lZWQnIHBhcmFtZXRlcgorICogc3BlY2lmaWVzIGhvdyBtdWNoIHNwYWNlIHdlJ3JlIGdvaW5nIHRvIG5lZWQgZm9yIHRoZSBBR0ZMIGFuZCB0aGUKKyAqICdyZXNlcnZlZCcgcGFyYW1ldGVyIHRlbGxzIHVzIGhvdyBtYW55IGJsb2NrcyBpbiB0aGlzIEFHIGFyZSByZXNlcnZlZCBmb3IKKyAqIG90aGVyIGNhbGxlcnMuCiAgKi8KIHhmc19leHRsZW5fdAogeGZzX2FsbG9jX2xvbmdlc3RfZnJlZV9leHRlbnQoCiAJc3RydWN0IHhmc19tb3VudAkqbXAsCiAJc3RydWN0IHhmc19wZXJhZwkqcGFnLAotCXhmc19leHRsZW5fdAkJbmVlZCkKKwl4ZnNfZXh0bGVuX3QJCW5lZWQsCisJeGZzX2V4dGxlbl90CQlyZXNlcnZlZCkKIHsKIAl4ZnNfZXh0bGVuX3QJCWRlbHRhID0gMDsKIAorCS8qCisJICogSWYgdGhlIEFHRkwgbmVlZHMgYSByZWNoYXJnZSwgd2UnbGwgaGF2ZSB0byBzdWJ0cmFjdCB0aGF0IGZyb20gdGhlCisJICogbG9uZ2VzdCBleHRlbnQuCisJICovCiAJaWYgKG5lZWQgPiBwYWctPnBhZ2ZfZmxjb3VudCkKIAkJZGVsdGEgPSBuZWVkIC0gcGFnLT5wYWdmX2ZsY291bnQ7CiAKKwkvKgorCSAqIElmIHdlIGNhbm5vdCBtYWludGFpbiBvdGhlcnMnIHJlc2VydmF0aW9ucyB3aXRoIHNwYWNlIGZyb20gdGhlCisJICogbm90LWxvbmdlc3QgZnJlZXNwIGV4dGVudHMsIHdlJ2xsIGhhdmUgdG8gc3VidHJhY3QgL3RoYXQvIGZyb20KKwkgKiB0aGUgbG9uZ2VzdCBleHRlbnQgdG9vLgorCSAqLworCWlmIChwYWctPnBhZ2ZfZnJlZWJsa3MgLSBwYWctPnBhZ2ZfbG9uZ2VzdCA8IHJlc2VydmVkKQorCQlkZWx0YSArPSByZXNlcnZlZCAtIChwYWctPnBhZ2ZfZnJlZWJsa3MgLSBwYWctPnBhZ2ZfbG9uZ2VzdCk7CisKKwkvKgorCSAqIElmIHRoZSBsb25nZXN0IGV4dGVudCBpcyBsb25nIGVub3VnaCB0byBzYXRpc2Z5IGFsbCB0aGUKKwkgKiByZXNlcnZhdGlvbnMgYW5kIEFHRkwgcnVsZXMgaW4gcGxhY2UsIHdlIGNhbiByZXR1cm4gdGhpcyBleHRlbnQuCisJICovCiAJaWYgKHBhZy0+cGFnZl9sb25nZXN0ID4gZGVsdGEpCiAJCXJldHVybiBwYWctPnBhZ2ZfbG9uZ2VzdCAtIGRlbHRhOworCisJLyogT3RoZXJ3aXNlLCBsZXQgdGhlIGNhbGxlciB0cnkgZm9yIDEgYmxvY2sgaWYgdGhlcmUncyBzcGFjZS4gKi8KIAlyZXR1cm4gcGFnLT5wYWdmX2ZsY291bnQgPiAwIHx8IHBhZy0+cGFnZl9sb25nZXN0ID4gMDsKIH0KIApAQCAtMTk5MSwyMCArMjA0MiwyNCBAQAogewogCXN0cnVjdCB4ZnNfcGVyYWcJKnBhZyA9IGFyZ3MtPnBhZzsKIAl4ZnNfZXh0bGVuX3QJCWxvbmdlc3Q7CisJeGZzX2V4dGxlbl90CQlyZXNlcnZhdGlvbjsgLyogYmxvY2tzIHRoYXQgYXJlIHN0aWxsIHJlc2VydmVkICovCiAJaW50CQkJYXZhaWxhYmxlOwogCiAJaWYgKGZsYWdzICYgWEZTX0FMTE9DX0ZMQUdfRlJFRUlORykKIAkJcmV0dXJuIHRydWU7CiAKKwlyZXNlcnZhdGlvbiA9IHhmc19hZ19yZXN2X25lZWRlZChwYWcsIGFyZ3MtPnJlc3YpOworCiAJLyogZG8gd2UgaGF2ZSBlbm91Z2ggY29udGlndW91cyBmcmVlIHNwYWNlIGZvciB0aGUgYWxsb2NhdGlvbj8gKi8KLQlsb25nZXN0ID0geGZzX2FsbG9jX2xvbmdlc3RfZnJlZV9leHRlbnQoYXJncy0+bXAsIHBhZywgbWluX2ZyZWUpOworCWxvbmdlc3QgPSB4ZnNfYWxsb2NfbG9uZ2VzdF9mcmVlX2V4dGVudChhcmdzLT5tcCwgcGFnLCBtaW5fZnJlZSwKKwkJCXJlc2VydmF0aW9uKTsKIAlpZiAoKGFyZ3MtPm1pbmxlbiArIGFyZ3MtPmFsaWdubWVudCArIGFyZ3MtPm1pbmFsaWduc2xvcCAtIDEpID4gbG9uZ2VzdCkKIAkJcmV0dXJuIGZhbHNlOwogCi0JLyogZG8gaGF2ZSBlbm91Z2ggZnJlZSBzcGFjZSByZW1haW5pbmcgZm9yIHRoZSBhbGxvY2F0aW9uPyAqLworCS8qIGRvIHdlIGhhdmUgZW5vdWdoIGZyZWUgc3BhY2UgcmVtYWluaW5nIGZvciB0aGUgYWxsb2NhdGlvbj8gKi8KIAlhdmFpbGFibGUgPSAoaW50KShwYWctPnBhZ2ZfZnJlZWJsa3MgKyBwYWctPnBhZ2ZfZmxjb3VudCAtCi0JCQkgIG1pbl9mcmVlIC0gYXJncy0+dG90YWwpOwotCWlmIChhdmFpbGFibGUgPCAoaW50KWFyZ3MtPm1pbmxlZnQpCisJCQkgIHJlc2VydmF0aW9uIC0gbWluX2ZyZWUgLSBhcmdzLT50b3RhbCk7CisJaWYgKGF2YWlsYWJsZSA8IChpbnQpYXJncy0+bWlubGVmdCB8fCBhdmFpbGFibGUgPD0gMCkKIAkJcmV0dXJuIGZhbHNlOwogCiAJcmV0dXJuIHRydWU7CkBAIC0yMDQ1LDcgKzIxMDAsNyBAQAogCSAqIHNvbWV3aGVyZSBlbHNlIGlmIHdlIGFyZSBub3QgYmVpbmcgYXNrZWQgdG8gdHJ5IGhhcmRlciBhdCB0aGlzCiAJICogcG9pbnQKIAkgKi8KLQlpZiAocGFnLT5wYWdmX21ldGFkYXRhICYmIGFyZ3MtPnVzZXJkYXRhICYmCisJaWYgKHBhZy0+cGFnZl9tZXRhZGF0YSAmJiB4ZnNfYWxsb2NfaXNfdXNlcmRhdGEoYXJncy0+ZGF0YXR5cGUpICYmCiAJICAgIChmbGFncyAmIFhGU19BTExPQ19GTEFHX1RSWUxPQ0spKSB7CiAJCUFTU0VSVCghKGZsYWdzICYgWEZTX0FMTE9DX0ZMQUdfRlJFRUlORykpOwogCQlnb3RvIG91dF9hZ2JwX3JlbHNlOwpAQCAtMjExMSw3ICsyMTY2LDcgQEAKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXRfYWdicF9yZWxzZTsKIAkJZXJyb3IgPSB4ZnNfZnJlZV9hZ19leHRlbnQodHAsIGFnYnAsIGFyZ3MtPmFnbm8sIGJubywgMSwKLQkJCQkJICAgJnRhcmdzLm9pbmZvLCAxKTsKKwkJCQkJICAgJnRhcmdzLm9pbmZvLCBYRlNfQUdfUkVTVl9BR0ZMKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXRfYWdicF9yZWxzZTsKIAkJYnAgPSB4ZnNfYnRyZWVfZ2V0X2J1ZnMobXAsIHRwLCBhcmdzLT5hZ25vLCBibm8sIDApOwpAQCAtMjEyMiw3ICsyMTc3LDcgQEAKIAl0YXJncy5tcCA9IG1wOwogCXRhcmdzLmFnYnAgPSBhZ2JwOwogCXRhcmdzLmFnbm8gPSBhcmdzLT5hZ25vOwotCXRhcmdzLmFsaWdubWVudCA9IHRhcmdzLm1pbmxlbiA9IHRhcmdzLnByb2QgPSB0YXJncy5pc2ZsID0gMTsKKwl0YXJncy5hbGlnbm1lbnQgPSB0YXJncy5taW5sZW4gPSB0YXJncy5wcm9kID0gMTsKIAl0YXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9USElTX0FHOwogCXRhcmdzLnBhZyA9IHBhZzsKIAllcnJvciA9IHhmc19hbGxvY19yZWFkX2FnZmwobXAsIHRwLCB0YXJncy5hZ25vLCAmYWdmbGJwKTsKQEAgLTIxMzMsNiArMjE4OCw3IEBACiAJd2hpbGUgKHBhZy0+cGFnZl9mbGNvdW50IDwgbmVlZCkgewogCQl0YXJncy5hZ2JubyA9IDA7CiAJCXRhcmdzLm1heGxlbiA9IG5lZWQgLSBwYWctPnBhZ2ZfZmxjb3VudDsKKwkJdGFyZ3MucmVzdiA9IFhGU19BR19SRVNWX0FHRkw7CiAKIAkJLyogQWxsb2NhdGUgYXMgbWFueSBibG9ja3MgYXMgcG9zc2libGUgYXQgb25jZS4gKi8KIAkJZXJyb3IgPSB4ZnNfYWxsb2NfYWdfdmV4dGVudCgmdGFyZ3MpOwpAQCAtMjI2NCw2ICsyMzIwLDkgQEAKIAkJb2Zmc2V0b2YoeGZzX2FnZl90LCBhZ2ZfbG9uZ2VzdCksCiAJCW9mZnNldG9mKHhmc19hZ2ZfdCwgYWdmX2J0cmVlYmxrcyksCiAJCW9mZnNldG9mKHhmc19hZ2ZfdCwgYWdmX3V1aWQpLAorCQlvZmZzZXRvZih4ZnNfYWdmX3QsIGFnZl9ybWFwX2Jsb2NrcyksCisJCS8qIG5lZWRlZCBzbyB0aGF0IHdlIGRvbid0IGxvZyB0aGUgd2hvbGUgcmVzdCBvZiB0aGUgc3RydWN0dXJlOiAqLworCQlvZmZzZXRvZih4ZnNfYWdmX3QsIGFnZl9zcGFyZTY0KSwKIAkJc2l6ZW9mKHhmc19hZ2ZfdCkKIAl9OwogCkBAIC0yNjE3LDcgKzI2NzYsNyBAQAogCQkgKiBUcnkgbmVhciBhbGxvY2F0aW9uIGZpcnN0LCB0aGVuIGFueXdoZXJlLWluLWFnIGFmdGVyCiAJCSAqIHRoZSBmaXJzdCBhLmcuIGZhaWxzLgogCQkgKi8KLQkJaWYgKChhcmdzLT51c2VyZGF0YSAmIFhGU19BTExPQ19JTklUSUFMX1VTRVJfREFUQSkgJiYKKwkJaWYgKChhcmdzLT5kYXRhdHlwZSAmIFhGU19BTExPQ19JTklUSUFMX1VTRVJfREFUQSkgJiYKIAkJICAgIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF8zMkJJVElOT0RFUykpIHsKIAkJCWFyZ3MtPmZzYm5vID0gWEZTX0FHQl9UT19GU0IobXAsCiAJCQkJCSgobXAtPm1fYWdmcm90b3IgLyByb3RvcnN0ZXApICUKQEAgLTI3NTAsNyArMjgwOSw3IEBACiAjZW5kaWYKIAogCQkvKiBaZXJvIHRoZSBleHRlbnQgaWYgd2Ugd2VyZSBhc2tlZCB0byBkbyBzbyAqLwotCQlpZiAoYXJncy0+dXNlcmRhdGEgJiBYRlNfQUxMT0NfVVNFUkRBVEFfWkVSTykgeworCQlpZiAoYXJncy0+ZGF0YXR5cGUgJiBYRlNfQUxMT0NfVVNFUkRBVEFfWkVSTykgewogCQkJZXJyb3IgPSB4ZnNfemVyb19leHRlbnQoYXJncy0+aXAsIGFyZ3MtPmZzYm5vLCBhcmdzLT5sZW4pOwogCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gZXJyb3IwOwpAQCAtMjgwOSw3ICsyODY4LDggQEAKIAlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLwogCXhmc19mc2Jsb2NrX3QJCWJubywJLyogc3RhcnRpbmcgYmxvY2sgbnVtYmVyIG9mIGV4dGVudCAqLwogCXhmc19leHRsZW5fdAkJbGVuLAkvKiBsZW5ndGggb2YgZXh0ZW50ICovCi0Jc3RydWN0IHhmc19vd25lcl9pbmZvCSpvaW5mbykJLyogZXh0ZW50IG93bmVyICovCisJc3RydWN0IHhmc19vd25lcl9pbmZvCSpvaW5mbywJLyogZXh0ZW50IG93bmVyICovCisJZW51bSB4ZnNfYWdfcmVzdl90eXBlCXR5cGUpCS8qIGJsb2NrIHJlc2VydmF0aW9uIHR5cGUgKi8KIHsKIAlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IHRwLT50X21vdW50cDsKIAlzdHJ1Y3QgeGZzX2J1ZgkJKmFnYnA7CkBAIC0yODE4LDYgKzI4NzgsNyBAQAogCWludAkJCWVycm9yOwogCiAJQVNTRVJUKGxlbiAhPSAwKTsKKwlBU1NFUlQodHlwZSAhPSBYRlNfQUdfUkVTVl9BR0ZMKTsKIAogCWlmIChYRlNfVEVTVF9FUlJPUihmYWxzZSwgbXAsCiAJCQlYRlNfRVJSVEFHX0ZSRUVfRVhURU5ULApAQCAtMjgzNSw3ICsyODk2LDcgQEAKIAkJYWdibm8gKyBsZW4gPD0gYmUzMl90b19jcHUoWEZTX0JVRl9UT19BR0YoYWdicCktPmFnZl9sZW5ndGgpLAogCQkJCWVycik7CiAKLQllcnJvciA9IHhmc19mcmVlX2FnX2V4dGVudCh0cCwgYWdicCwgYWdubywgYWdibm8sIGxlbiwgb2luZm8sIDApOworCWVycm9yID0geGZzX2ZyZWVfYWdfZXh0ZW50KHRwLCBhZ2JwLCBhZ25vLCBhZ2JubywgbGVuLCBvaW5mbywgdHlwZSk7CiAJaWYgKGVycm9yKQogCQlnb3RvIGVycjsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpYnhmcy94ZnNfYWxsb2MuaCBiL2ZzL3hmcy9saWJ4ZnMveGZzX2FsbG9jLmgKaW5kZXggNmZlMmQ2Yi4uN2M0MDRhNiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpYnhmcy94ZnNfYWxsb2MuaAorKysgYi9mcy94ZnMvbGlieGZzL3hmc19hbGxvYy5oCkBAIC04NSwyMCArODUsMzMgQEAKIAl4ZnNfZXh0bGVuX3QJbGVuOwkJLyogb3V0cHV0OiBhY3R1YWwgc2l6ZSBvZiBleHRlbnQgKi8KIAl4ZnNfYWxsb2N0eXBlX3QJdHlwZTsJCS8qIGFsbG9jYXRpb24gdHlwZSBYRlNfQUxMT0NUWVBFXy4uLiAqLwogCXhmc19hbGxvY3R5cGVfdAlvdHlwZTsJCS8qIG9yaWdpbmFsIGFsbG9jYXRpb24gdHlwZSAqLworCWludAkJZGF0YXR5cGU7CS8qIG1hc2sgZGVmaW5pbmcgZGF0YSB0eXBlIHRyZWF0bWVudCAqLwogCWNoYXIJCXdhc2RlbDsJCS8qIHNldCBpZiBhbGxvY2F0aW9uIHdhcyBwcmV2IGRlbGF5ZWQgKi8KIAljaGFyCQl3YXNmcm9tZmw7CS8qIHNldCBpZiBhbGxvY2F0aW9uIGlzIGZyb20gZnJlZWxpc3QgKi8KLQljaGFyCQlpc2ZsOwkJLyogc2V0IGlmIGlzIGZyZWVsaXN0IGJsb2NrcyAtICFhY2N0ZyAqLwotCWNoYXIJCXVzZXJkYXRhOwkvKiBtYXNrIGRlZmluaW5nIHVzZXJkYXRhIHRyZWF0bWVudCAqLwogCXhmc19mc2Jsb2NrX3QJZmlyc3RibG9jazsJLyogaW8gZmlyc3QgYmxvY2sgYWxsb2NhdGVkICovCiAJc3RydWN0IHhmc19vd25lcl9pbmZvCW9pbmZvOwkvKiBvd25lciBvZiBibG9ja3MgYmVpbmcgYWxsb2NhdGVkICovCisJZW51bSB4ZnNfYWdfcmVzdl90eXBlCXJlc3Y7CS8qIGJsb2NrIHJlc2VydmF0aW9uIHRvIHVzZSAqLwogfSB4ZnNfYWxsb2NfYXJnX3Q7CiAKIC8qCi0gKiBEZWZpbmVzIGZvciB1c2VyZGF0YQorICogRGVmaW5lcyBmb3IgZGF0YXR5cGUKICAqLwogI2RlZmluZSBYRlNfQUxMT0NfVVNFUkRBVEEJCSgxIDw8IDApLyogYWxsb2NhdGlvbiBpcyBmb3IgdXNlciBkYXRhKi8KICNkZWZpbmUgWEZTX0FMTE9DX0lOSVRJQUxfVVNFUl9EQVRBCSgxIDw8IDEpLyogc3BlY2lhbCBjYXNlIHN0YXJ0IG9mIGZpbGUgKi8KICNkZWZpbmUgWEZTX0FMTE9DX1VTRVJEQVRBX1pFUk8JCSgxIDw8IDIpLyogemVybyBleHRlbnQgb24gYWxsb2NhdGlvbiAqLworI2RlZmluZSBYRlNfQUxMT0NfTk9CVVNZCQkoMSA8PCAzKS8qIEJ1c3kgZXh0ZW50cyBub3QgYWxsb3dlZCAqLworCitzdGF0aWMgaW5saW5lIGJvb2wKK3hmc19hbGxvY19pc191c2VyZGF0YShpbnQgZGF0YXR5cGUpCit7CisJcmV0dXJuIChkYXRhdHlwZSAmIH5YRlNfQUxMT0NfTk9CVVNZKSAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK3hmc19hbGxvY19hbGxvd19idXN5X3JldXNlKGludCBkYXRhdHlwZSkKK3sKKwlyZXR1cm4gKGRhdGF0eXBlICYgWEZTX0FMTE9DX05PQlVTWSkgPT0gMDsKK30KIAogLyogZnJlZXNwYWNlIGxpbWl0IGNhbGN1bGF0aW9ucyAqLwogI2RlZmluZSBYRlNfQUxMT0NfQUdGTF9SRVNFUlZFCTQKQEAgLTEwNiw3ICsxMTksOCBAQAogdW5zaWduZWQgaW50IHhmc19hbGxvY19hZ19tYXhfdXNhYmxlKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKIAogeGZzX2V4dGxlbl90IHhmc19hbGxvY19sb25nZXN0X2ZyZWVfZXh0ZW50KHN0cnVjdCB4ZnNfbW91bnQgKm1wLAotCQlzdHJ1Y3QgeGZzX3BlcmFnICpwYWcsIHhmc19leHRsZW5fdCBuZWVkKTsKKwkJc3RydWN0IHhmc19wZXJhZyAqcGFnLCB4ZnNfZXh0bGVuX3QgbmVlZCwKKwkJeGZzX2V4dGxlbl90IHJlc2VydmVkKTsKIHVuc2lnbmVkIGludCB4ZnNfYWxsb2NfbWluX2ZyZWVsaXN0KHN0cnVjdCB4ZnNfbW91bnQgKm1wLAogCQlzdHJ1Y3QgeGZzX3BlcmFnICpwYWcpOwogCkBAIC0xODQsNyArMTk4LDggQEAKIAlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLwogCXhmc19mc2Jsb2NrX3QJCWJubywJLyogc3RhcnRpbmcgYmxvY2sgbnVtYmVyIG9mIGV4dGVudCAqLwogCXhmc19leHRsZW5fdAkJbGVuLAkvKiBsZW5ndGggb2YgZXh0ZW50ICovCi0Jc3RydWN0IHhmc19vd25lcl9pbmZvCSpvaW5mbyk7LyogZXh0ZW50IG93bmVyICovCisJc3RydWN0IHhmc19vd25lcl9pbmZvCSpvaW5mbywJLyogZXh0ZW50IG93bmVyICovCisJZW51bSB4ZnNfYWdfcmVzdl90eXBlCXR5cGUpOwkvKiBibG9jayByZXNlcnZhdGlvbiB0eXBlICovCiAKIGludAkJCQkvKiBlcnJvciAqLwogeGZzX2FsbG9jX2xvb2t1cF9nZSgKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saWJ4ZnMveGZzX2JtYXAuYyBiL2ZzL3hmcy9saWJ4ZnMveGZzX2JtYXAuYwppbmRleCBiMDYwYmNhLi45ZDdmNjFkIDEwMDY0NAotLS0gYS9mcy94ZnMvbGlieGZzL3hmc19ibWFwLmMKKysrIGIvZnMveGZzL2xpYnhmcy94ZnNfYm1hcC5jCkBAIC00Nyw2ICs0Nyw3IEBACiAjaW5jbHVkZSAieGZzX2F0dHJfbGVhZi5oIgogI2luY2x1ZGUgInhmc19maWxlc3RyZWFtLmgiCiAjaW5jbHVkZSAieGZzX3JtYXAuaCIKKyNpbmNsdWRlICJ4ZnNfYWdfcmVzdi5oIgogCiAKIGttZW1fem9uZV90CQkqeGZzX2JtYXBfZnJlZV9pdGVtX3pvbmU7CkBAIC0xMzg4LDcgKzEzODksNyBAQAogICogRWxzZSwgKmxhc3R4cCB3aWxsIGJlIHNldCB0byB0aGUgaW5kZXggb2YgdGhlIGZvdW5kCiAgKiBlbnRyeTsgKmdvdHAgd2lsbCBjb250YWluIHRoZSBlbnRyeS4KICAqLwotU1RBVElDIHhmc19ibWJ0X3JlY19ob3N0X3QgKiAgICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBmb3VuZCBleHRlbnQgZW50cnkgKi8KK3hmc19ibWJ0X3JlY19ob3N0X3QgKiAgICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBmb3VuZCBleHRlbnQgZW50cnkgKi8KIHhmc19ibWFwX3NlYXJjaF9leHRlbnRzKAogCXhmc19pbm9kZV90ICAgICAqaXAsICAgICAgICAgICAgLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KIAl4ZnNfZmlsZW9mZl90ICAgYm5vLCAgICAgICAgICAgIC8qIGJsb2NrIG51bWJlciBzZWFyY2hlZCBmb3IgKi8KQEAgLTMzNDcsNyArMzM0OCw4IEBACiAKIAltcCA9IGFwLT5pcC0+aV9tb3VudDsKIAludWxsZmIgPSAqYXAtPmZpcnN0YmxvY2sgPT0gTlVMTEZTQkxPQ0s7Ci0JcnQgPSBYRlNfSVNfUkVBTFRJTUVfSU5PREUoYXAtPmlwKSAmJiBhcC0+dXNlcmRhdGE7CisJcnQgPSBYRlNfSVNfUkVBTFRJTUVfSU5PREUoYXAtPmlwKSAmJgorCQl4ZnNfYWxsb2NfaXNfdXNlcmRhdGEoYXAtPmRhdGF0eXBlKTsKIAlmYl9hZ25vID0gbnVsbGZiID8gTlVMTEFHTlVNQkVSIDogWEZTX0ZTQl9UT19BR05PKG1wLCAqYXAtPmZpcnN0YmxvY2spOwogCS8qCiAJICogSWYgYWxsb2NhdGluZyBhdCBlb2YsIGFuZCB0aGVyZSdzIGEgcHJldmlvdXMgcmVhbCBibG9jaywKQEAgLTM1MDEsNyArMzUwMyw4IEBACiAJfQogCiAJbG9uZ2VzdCA9IHhmc19hbGxvY19sb25nZXN0X2ZyZWVfZXh0ZW50KG1wLCBwYWcsCi0JCQkJCXhmc19hbGxvY19taW5fZnJlZWxpc3QobXAsIHBhZykpOworCQkJCXhmc19hbGxvY19taW5fZnJlZWxpc3QobXAsIHBhZyksCisJCQkJeGZzX2FnX3Jlc3ZfbmVlZGVkKHBhZywgWEZTX0FHX1JFU1ZfTk9ORSkpOwogCWlmICgqYmxlbiA8IGxvbmdlc3QpCiAJCSpibGVuID0gbG9uZ2VzdDsKIApAQCAtMzYyMiw3ICszNjI1LDcgQEAKIHsKIAl4ZnNfbW91bnRfdAkqbXA7CQkvKiBtb3VudCBwb2ludCBzdHJ1Y3R1cmUgKi8KIAl4ZnNfYWxsb2N0eXBlX3QJYXR5cGUgPSAwOwkvKiB0eXBlIGZvciBhbGxvY2F0aW9uIHJvdXRpbmVzICovCi0JeGZzX2V4dGxlbl90CWFsaWduOwkJLyogbWluaW11bSBhbGxvY2F0aW9uIGFsaWdubWVudCAqLworCXhmc19leHRsZW5fdAlhbGlnbiA9IDA7CS8qIG1pbmltdW0gYWxsb2NhdGlvbiBhbGlnbm1lbnQgKi8KIAl4ZnNfYWdudW1iZXJfdAlmYl9hZ25vOwkvKiBhZyBudW1iZXIgb2YgYXAtPmZpcnN0YmxvY2sgKi8KIAl4ZnNfYWdudW1iZXJfdAlhZzsKIAl4ZnNfYWxsb2NfYXJnX3QJYXJnczsKQEAgLTM2NDUsNyArMzY0OCw4IEBACiAJZWxzZSBpZiAobXAtPm1fZGFsaWduKQogCQlzdHJpcGVfYWxpZ24gPSBtcC0+bV9kYWxpZ247CiAKLQlhbGlnbiA9IGFwLT51c2VyZGF0YSA/IHhmc19nZXRfZXh0c3pfaGludChhcC0+aXApIDogMDsKKwlpZiAoeGZzX2FsbG9jX2lzX3VzZXJkYXRhKGFwLT5kYXRhdHlwZSkpCisJCWFsaWduID0geGZzX2dldF9leHRzel9oaW50KGFwLT5pcCk7CiAJaWYgKHVubGlrZWx5KGFsaWduKSkgewogCQllcnJvciA9IHhmc19ibWFwX2V4dHNpemVfYWxpZ24obXAsICZhcC0+Z290LCAmYXAtPnByZXYsCiAJCQkJCQlhbGlnbiwgMCwgYXAtPmVvZiwgMCwgYXAtPmNvbnYsCkBAIC0zNjU4LDcgKzM2NjIsOCBAQAogCW51bGxmYiA9ICphcC0+Zmlyc3RibG9jayA9PSBOVUxMRlNCTE9DSzsKIAlmYl9hZ25vID0gbnVsbGZiID8gTlVMTEFHTlVNQkVSIDogWEZTX0ZTQl9UT19BR05PKG1wLCAqYXAtPmZpcnN0YmxvY2spOwogCWlmIChudWxsZmIpIHsKLQkJaWYgKGFwLT51c2VyZGF0YSAmJiB4ZnNfaW5vZGVfaXNfZmlsZXN0cmVhbShhcC0+aXApKSB7CisJCWlmICh4ZnNfYWxsb2NfaXNfdXNlcmRhdGEoYXAtPmRhdGF0eXBlKSAmJgorCQkgICAgeGZzX2lub2RlX2lzX2ZpbGVzdHJlYW0oYXAtPmlwKSkgewogCQkJYWcgPSB4ZnNfZmlsZXN0cmVhbV9sb29rdXBfYWcoYXAtPmlwKTsKIAkJCWFnID0gKGFnICE9IE5VTExBR05VTUJFUikgPyBhZyA6IDA7CiAJCQlhcC0+Ymxrbm8gPSBYRlNfQUdCX1RPX0ZTQihtcCwgYWcsIDApOwpAQCAtMzY5OCw3ICszNzAzLDggQEAKIAkJICogZW5vdWdoIGZvciB0aGUgcmVxdWVzdC4gIElmIG9uZSBpc24ndCBmb3VuZCwgdGhlbiBhZGp1c3QKIAkJICogdGhlIG1pbmltdW0gYWxsb2NhdGlvbiBzaXplIHRvIHRoZSBsYXJnZXN0IHNwYWNlIGZvdW5kLgogCQkgKi8KLQkJaWYgKGFwLT51c2VyZGF0YSAmJiB4ZnNfaW5vZGVfaXNfZmlsZXN0cmVhbShhcC0+aXApKQorCQlpZiAoeGZzX2FsbG9jX2lzX3VzZXJkYXRhKGFwLT5kYXRhdHlwZSkgJiYKKwkJICAgIHhmc19pbm9kZV9pc19maWxlc3RyZWFtKGFwLT5pcCkpCiAJCQllcnJvciA9IHhmc19ibWFwX2J0YWxsb2NfZmlsZXN0cmVhbXMoYXAsICZhcmdzLCAmYmxlbik7CiAJCWVsc2UKIAkJCWVycm9yID0geGZzX2JtYXBfYnRhbGxvY19udWxsZmIoYXAsICZhcmdzLCAmYmxlbik7CkBAIC0zNzgxLDkgKzM3ODcsOSBAQAogCX0KIAlhcmdzLm1pbmxlZnQgPSBhcC0+bWlubGVmdDsKIAlhcmdzLndhc2RlbCA9IGFwLT53YXNkZWw7Ci0JYXJncy5pc2ZsID0gMDsKLQlhcmdzLnVzZXJkYXRhID0gYXAtPnVzZXJkYXRhOwotCWlmIChhcC0+dXNlcmRhdGEgJiBYRlNfQUxMT0NfVVNFUkRBVEFfWkVSTykKKwlhcmdzLnJlc3YgPSBYRlNfQUdfUkVTVl9OT05FOworCWFyZ3MuZGF0YXR5cGUgPSBhcC0+ZGF0YXR5cGU7CisJaWYgKGFwLT5kYXRhdHlwZSAmIFhGU19BTExPQ19VU0VSREFUQV9aRVJPKQogCQlhcmdzLmlwID0gYXAtPmlwOwogCiAJZXJyb3IgPSB4ZnNfYWxsb2NfdmV4dGVudCgmYXJncyk7CkBAIC0zODc3LDcgKzM4ODMsOCBAQAogeGZzX2JtYXBfYWxsb2MoCiAJc3RydWN0IHhmc19ibWFsbG9jYQkqYXApCS8qIGJtYXAgYWxsb2MgYXJndW1lbnQgc3RydWN0ICovCiB7Ci0JaWYgKFhGU19JU19SRUFMVElNRV9JTk9ERShhcC0+aXApICYmIGFwLT51c2VyZGF0YSkKKwlpZiAoWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGFwLT5pcCkgJiYKKwkgICAgeGZzX2FsbG9jX2lzX3VzZXJkYXRhKGFwLT5kYXRhdHlwZSkpCiAJCXJldHVybiB4ZnNfYm1hcF9ydGFsbG9jKGFwKTsKIAlyZXR1cm4geGZzX2JtYXBfYnRhbGxvYyhhcCk7CiB9CkBAIC00MDc0LDcgKzQwODEsNyBAQAogCXJldHVybiAwOwogfQogCi1TVEFUSUMgaW50CitpbnQKIHhmc19ibWFwaV9yZXNlcnZlX2RlbGFsbG9jKAogCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAogCXhmc19maWxlb2ZmX3QJCWFvZmYsCkBAIC00MTcwLDkxICs0MTc3LDYgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLS8qCi0gKiBNYXAgZmlsZSBibG9ja3MgdG8gZmlsZXN5c3RlbSBibG9ja3MsIGFkZGluZyBkZWxheWVkIGFsbG9jYXRpb25zIGFzIG5lZWRlZC4KLSAqLwotaW50Ci14ZnNfYm1hcGlfZGVsYXkoCi0Jc3RydWN0IHhmc19pbm9kZQkqaXAsCS8qIGluY29yZSBpbm9kZSAqLwotCXhmc19maWxlb2ZmX3QJCWJubywJLyogc3RhcnRpbmcgZmlsZSBvZmZzLiBtYXBwZWQgKi8KLQl4ZnNfZmlsYmxrc190CQlsZW4sCS8qIGxlbmd0aCB0byBtYXAgaW4gZmlsZSAqLwotCXN0cnVjdCB4ZnNfYm1idF9pcmVjCSptdmFsLAkvKiBvdXRwdXQ6IG1hcCB2YWx1ZXMgKi8KLQlpbnQJCQkqbm1hcCwJLyogaS9vOiBtdmFsIHNpemUvY291bnQgKi8KLQlpbnQJCQlmbGFncykJLyogWEZTX0JNQVBJXy4uLiAqLwotewotCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gaXAtPmlfbW91bnQ7Ci0Jc3RydWN0IHhmc19pZm9yawkqaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgWEZTX0RBVEFfRk9SSyk7Ci0Jc3RydWN0IHhmc19ibWJ0X2lyZWMJZ290OwkvKiBjdXJyZW50IGZpbGUgZXh0ZW50IHJlY29yZCAqLwotCXN0cnVjdCB4ZnNfYm1idF9pcmVjCXByZXY7CS8qIHByZXZpb3VzIGZpbGUgZXh0ZW50IHJlY29yZCAqLwotCXhmc19maWxlb2ZmX3QJCW9ibm87CS8qIG9sZCBibG9jayBudW1iZXIgKG9mZnNldCkgKi8KLQl4ZnNfZmlsZW9mZl90CQllbmQ7CS8qIGVuZCBvZiBtYXBwZWQgZmlsZSByZWdpb24gKi8KLQl4ZnNfZXh0bnVtX3QJCWxhc3R4OwkvKiBsYXN0IHVzZWZ1bCBleHRlbnQgbnVtYmVyICovCi0JaW50CQkJZW9mOwkvKiB3ZSd2ZSBoaXQgdGhlIGVuZCBvZiBleHRlbnRzICovCi0JaW50CQkJbiA9IDA7CS8qIGN1cnJlbnQgZXh0ZW50IGluZGV4ICovCi0JaW50CQkJZXJyb3IgPSAwOwotCi0JQVNTRVJUKCpubWFwID49IDEpOwotCUFTU0VSVCgqbm1hcCA8PSBYRlNfQk1BUF9NQVhfTk1BUCk7Ci0JQVNTRVJUKCEoZmxhZ3MgJiB+WEZTX0JNQVBJX0VOVElSRSkpOwotCUFTU0VSVCh4ZnNfaXNpbG9ja2VkKGlwLCBYRlNfSUxPQ0tfRVhDTCkpOwotCi0JaWYgKHVubGlrZWx5KFhGU19URVNUX0VSUk9SKAotCSAgICAoWEZTX0lGT1JLX0ZPUk1BVChpcCwgWEZTX0RBVEFfRk9SSykgIT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUyAmJgotCSAgICAgWEZTX0lGT1JLX0ZPUk1BVChpcCwgWEZTX0RBVEFfRk9SSykgIT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUpLAotCSAgICAgbXAsIFhGU19FUlJUQUdfQk1BUElGT1JNQVQsIFhGU19SQU5ET01fQk1BUElGT1JNQVQpKSkgewotCQlYRlNfRVJST1JfUkVQT1JUKCJ4ZnNfYm1hcGlfZGVsYXkiLCBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7Ci0JCXJldHVybiAtRUZTQ09SUlVQVEVEOwotCX0KLQotCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlYRlNfU1RBVFNfSU5DKG1wLCB4c19ibGtfbWFwdyk7Ci0KLQlpZiAoIShpZnAtPmlmX2ZsYWdzICYgWEZTX0lGRVhURU5UUykpIHsKLQkJZXJyb3IgPSB4ZnNfaXJlYWRfZXh0ZW50cyhOVUxMLCBpcCwgWEZTX0RBVEFfRk9SSyk7Ci0JCWlmIChlcnJvcikKLQkJCXJldHVybiBlcnJvcjsKLQl9Ci0KLQl4ZnNfYm1hcF9zZWFyY2hfZXh0ZW50cyhpcCwgYm5vLCBYRlNfREFUQV9GT1JLLCAmZW9mLCAmbGFzdHgsICZnb3QsICZwcmV2KTsKLQllbmQgPSBibm8gKyBsZW47Ci0Jb2JubyA9IGJubzsKLQotCXdoaWxlIChibm8gPCBlbmQgJiYgbiA8ICpubWFwKSB7Ci0JCWlmIChlb2YgfHwgZ290LmJyX3N0YXJ0b2ZmID4gYm5vKSB7Ci0JCQllcnJvciA9IHhmc19ibWFwaV9yZXNlcnZlX2RlbGFsbG9jKGlwLCBibm8sIGxlbiwgJmdvdCwKLQkJCQkJCQkgICAmcHJldiwgJmxhc3R4LCBlb2YpOwotCQkJaWYgKGVycm9yKSB7Ci0JCQkJaWYgKG4gPT0gMCkgewotCQkJCQkqbm1hcCA9IDA7Ci0JCQkJCXJldHVybiBlcnJvcjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvKiBzZXQgdXAgdGhlIGV4dGVudCBtYXAgdG8gcmV0dXJuLiAqLwotCQl4ZnNfYm1hcGlfdHJpbV9tYXAobXZhbCwgJmdvdCwgJmJubywgbGVuLCBvYm5vLCBlbmQsIG4sIGZsYWdzKTsKLQkJeGZzX2JtYXBpX3VwZGF0ZV9tYXAoJm12YWwsICZibm8sICZsZW4sIG9ibm8sIGVuZCwgJm4sIGZsYWdzKTsKLQotCQkvKiBJZiB3ZSdyZSBkb25lLCBzdG9wIG5vdy4gKi8KLQkJaWYgKGJubyA+PSBlbmQgfHwgbiA+PSAqbm1hcCkKLQkJCWJyZWFrOwotCi0JCS8qIEVsc2UgZ28gb24gdG8gdGhlIG5leHQgcmVjb3JkLiAqLwotCQlwcmV2ID0gZ290OwotCQlpZiAoKytsYXN0eCA8IGlmcC0+aWZfYnl0ZXMgLyBzaXplb2YoeGZzX2JtYnRfcmVjX3QpKQotCQkJeGZzX2JtYnRfZ2V0X2FsbCh4ZnNfaWV4dF9nZXRfZXh0KGlmcCwgbGFzdHgpLCAmZ290KTsKLQkJZWxzZQotCQkJZW9mID0gMTsKLQl9Ci0KLQkqbm1hcCA9IG47Ci0JcmV0dXJuIDA7Ci19Ci0KLQogc3RhdGljIGludAogeGZzX2JtYXBpX2FsbG9jYXRlKAogCXN0cnVjdCB4ZnNfYm1hbGxvY2EJKmJtYSkKQEAgLTQyODcsMTUgKzQyMDksMjEgQEAKIAl9CiAKIAkvKgotCSAqIEluZGljYXRlIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHVzZXIgZGF0YSBpbiB0aGUgZmlsZSwgb3IganVzdCBhbnkKLQkgKiB1c2VyIGRhdGEuIEFuZCBpZiBpdCBpcyB1c2VyZGF0YSwgaW5kaWNhdGUgd2hldGhlciBpdCBuZWVkcyB0bwotCSAqIGJlIGluaXRpYWxpc2VkIHRvIHplcm8gZHVyaW5nIGFsbG9jYXRpb24uCisJICogU2V0IHRoZSBkYXRhIHR5cGUgYmVpbmcgYWxsb2NhdGVkLiBGb3IgdGhlIGRhdGEgZm9yaywgdGhlIGZpcnN0IGRhdGEKKwkgKiBpbiB0aGUgZmlsZSBpcyB0cmVhdGVkIGRpZmZlcmVudGx5IHRvIGFsbCBvdGhlciBhbGxvY2F0aW9ucy4gRm9yIHRoZQorCSAqIGF0dHJpYnV0ZSBmb3JrLCB3ZSBvbmx5IG5lZWQgdG8gZW5zdXJlIHRoZSBhbGxvY2F0ZWQgcmFuZ2UgaXMgbm90IG9uCisJICogdGhlIGJ1c3kgbGlzdC4KIAkgKi8KIAlpZiAoIShibWEtPmZsYWdzICYgWEZTX0JNQVBJX01FVEFEQVRBKSkgewotCQlibWEtPnVzZXJkYXRhID0gKGJtYS0+b2Zmc2V0ID09IDApID8KLQkJCVhGU19BTExPQ19JTklUSUFMX1VTRVJfREFUQSA6IFhGU19BTExPQ19VU0VSREFUQTsKKwkJYm1hLT5kYXRhdHlwZSA9IFhGU19BTExPQ19OT0JVU1k7CisJCWlmICh3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSykgeworCQkJaWYgKGJtYS0+b2Zmc2V0ID09IDApCisJCQkJYm1hLT5kYXRhdHlwZSB8PSBYRlNfQUxMT0NfSU5JVElBTF9VU0VSX0RBVEE7CisJCQllbHNlCisJCQkJYm1hLT5kYXRhdHlwZSB8PSBYRlNfQUxMT0NfVVNFUkRBVEE7CisJCX0KIAkJaWYgKGJtYS0+ZmxhZ3MgJiBYRlNfQk1BUElfWkVSTykKLQkJCWJtYS0+dXNlcmRhdGEgfD0gWEZTX0FMTE9DX1VTRVJEQVRBX1pFUk87CisJCQlibWEtPmRhdGF0eXBlIHw9IFhGU19BTExPQ19VU0VSREFUQV9aRVJPOwogCX0KIAogCWJtYS0+bWlubGVuID0gKGJtYS0+ZmxhZ3MgJiBYRlNfQk1BUElfQ09OVElHKSA/IGJtYS0+bGVuZ3RoIDogMTsKQEAgLTQ1NjUsNyArNDQ5Myw3IEBACiAJYm1hLnRwID0gdHA7CiAJYm1hLmlwID0gaXA7CiAJYm1hLnRvdGFsID0gdG90YWw7Ci0JYm1hLnVzZXJkYXRhID0gMDsKKwlibWEuZGF0YXR5cGUgPSAwOwogCWJtYS5kZm9wcyA9IGRmb3BzOwogCWJtYS5maXJzdGJsb2NrID0gZmlyc3RibG9jazsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpYnhmcy94ZnNfYm1hcC5oIGIvZnMveGZzL2xpYnhmcy94ZnNfYm1hcC5oCmluZGV4IDI1NDAzNGYuLjgzOTVmNmUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saWJ4ZnMveGZzX2JtYXAuaAorKysgYi9mcy94ZnMvbGlieGZzL3hmc19ibWFwLmgKQEAgLTU0LDcgKzU0LDcgQEAKIAlib29sCQkJd2FzZGVsOwkvKiByZXBsYWNpbmcgYSBkZWxheWVkIGFsbG9jYXRpb24gKi8KIAlib29sCQkJYWVvZjsJLyogYWxsb2NhdGVkIHNwYWNlIGF0IGVvZiAqLwogCWJvb2wJCQljb252OwkvKiBvdmVyd3JpdGluZyB1bndyaXR0ZW4gZXh0ZW50cyAqLwotCWNoYXIJCQl1c2VyZGF0YTsvKiB1c2VyZGF0YSBtYXNrICovCisJaW50CQkJZGF0YXR5cGU7LyogZGF0YSB0eXBlIGJlaW5nIGFsbG9jYXRlZCAqLwogCWludAkJCWZsYWdzOwogfTsKIApAQCAtMTgxLDkgKzE4MSw2IEBACiBpbnQJeGZzX2JtYXBpX3JlYWQoc3RydWN0IHhmc19pbm9kZSAqaXAsIHhmc19maWxlb2ZmX3QgYm5vLAogCQl4ZnNfZmlsYmxrc190IGxlbiwgc3RydWN0IHhmc19ibWJ0X2lyZWMgKm12YWwsCiAJCWludCAqbm1hcCwgaW50IGZsYWdzKTsKLWludAl4ZnNfYm1hcGlfZGVsYXkoc3RydWN0IHhmc19pbm9kZSAqaXAsIHhmc19maWxlb2ZmX3QgYm5vLAotCQl4ZnNfZmlsYmxrc190IGxlbiwgc3RydWN0IHhmc19ibWJ0X2lyZWMgKm12YWwsCi0JCWludCAqbm1hcCwgaW50IGZsYWdzKTsKIGludAl4ZnNfYm1hcGlfd3JpdGUoc3RydWN0IHhmc190cmFucyAqdHAsIHN0cnVjdCB4ZnNfaW5vZGUgKmlwLAogCQl4ZnNfZmlsZW9mZl90IGJubywgeGZzX2ZpbGJsa3NfdCBsZW4sIGludCBmbGFncywKIAkJeGZzX2ZzYmxvY2tfdCAqZmlyc3RibG9jaywgeGZzX2V4dGxlbl90IHRvdGFsLApAQCAtMjAyLDUgKzE5OSwxMiBAQAogCQlzdHJ1Y3QgeGZzX2RlZmVyX29wcyAqZGZvcHMsIGVudW0gc2hpZnRfZGlyZWN0aW9uIGRpcmVjdGlvbiwKIAkJaW50IG51bV9leHRzKTsKIGludAl4ZnNfYm1hcF9zcGxpdF9leHRlbnQoc3RydWN0IHhmc19pbm9kZSAqaXAsIHhmc19maWxlb2ZmX3Qgc3BsaXRfb2Zmc2V0KTsKK3N0cnVjdCB4ZnNfYm1idF9yZWNfaG9zdCAqCisJeGZzX2JtYXBfc2VhcmNoX2V4dGVudHMoc3RydWN0IHhmc19pbm9kZSAqaXAsIHhmc19maWxlb2ZmX3QgYm5vLAorCQlpbnQgZm9yaywgaW50ICplb2ZwLCB4ZnNfZXh0bnVtX3QgKmxhc3R4cCwKKwkJc3RydWN0IHhmc19ibWJ0X2lyZWMgKmdvdHAsIHN0cnVjdCB4ZnNfYm1idF9pcmVjICpwcmV2cCk7CitpbnQJeGZzX2JtYXBpX3Jlc2VydmVfZGVsYWxsb2Moc3RydWN0IHhmc19pbm9kZSAqaXAsIHhmc19maWxlb2ZmX3QgYW9mZiwKKwkJeGZzX2ZpbGJsa3NfdCBsZW4sIHN0cnVjdCB4ZnNfYm1idF9pcmVjICpnb3QsCisJCXN0cnVjdCB4ZnNfYm1idF9pcmVjICpwcmV2LCB4ZnNfZXh0bnVtX3QgKmxhc3R4LCBpbnQgZW9mKTsKIAogI2VuZGlmCS8qIF9fWEZTX0JNQVBfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGlieGZzL3hmc19idHJlZS5jIGIvZnMveGZzL2xpYnhmcy94ZnNfYnRyZWUuYwppbmRleCBiNWMyMTNhLi5hYTE3NTJmIDEwMDY0NAotLS0gYS9mcy94ZnMvbGlieGZzL3hmc19idHJlZS5jCisrKyBiL2ZzL3hmcy9saWJ4ZnMveGZzX2J0cmVlLmMKQEAgLTE4MTQsNiArMTgxNCwxMCBAQAogCiAJWEZTX0JUUkVFX1NUQVRTX0lOQyhjdXIsIGxvb2t1cCk7CiAKKwkvKiBObyBzdWNoIHRoaW5nIGFzIGEgemVyby1sZXZlbCB0cmVlLiAqLworCWlmIChjdXItPmJjX25sZXZlbHMgPT0gMCkKKwkJcmV0dXJuIC1FRlNDT1JSVVBURUQ7CisKIAlibG9jayA9IE5VTEw7CiAJa2V5bm8gPSAwOwogCkBAIC0yMDY2LDcgKzIwNzAsNyBAQAogCXN0cnVjdCB4ZnNfYnVmCQkqYnAwLAogCWJvb2wJCQlmb3JjZV9hbGwpCiB7Ci0JdW5pb24geGZzX2J0cmVlX2JpZ2tleQlrZXk7CS8qIGtleXMgZnJvbSBjdXJyZW50IGxldmVsICovCisJdW5pb24geGZzX2J0cmVlX2tleQlrZXk7CS8qIGtleXMgZnJvbSBjdXJyZW50IGxldmVsICovCiAJdW5pb24geGZzX2J0cmVlX2tleQkqbGtleTsJLyoga2V5cyBmcm9tIHRoZSBuZXh0IGxldmVsIHVwICovCiAJdW5pb24geGZzX2J0cmVlX2tleQkqaGtleTsKIAl1bmlvbiB4ZnNfYnRyZWVfa2V5CSpubGtleTsJLyoga2V5cyBmcm9tIHRoZSBuZXh0IGxldmVsIHVwICovCkBAIC0yMDgyLDcgKzIwODYsNyBAQAogCiAJdHJhY2VfeGZzX2J0cmVlX3VwZGtleXMoY3VyLCBsZXZlbCwgYnAwKTsKIAotCWxrZXkgPSAodW5pb24geGZzX2J0cmVlX2tleSAqKSZrZXk7CisJbGtleSA9ICZrZXk7CiAJaGtleSA9IHhmc19idHJlZV9oaWdoX2tleV9mcm9tX2tleShjdXIsIGxrZXkpOwogCXhmc19idHJlZV9nZXRfa2V5cyhjdXIsIGJsb2NrLCBsa2V5KTsKIAlmb3IgKGxldmVsKys7IGxldmVsIDwgY3VyLT5iY19ubGV2ZWxzOyBsZXZlbCsrKSB7CkBAIC0zMjIyLDcgKzMyMjYsNyBAQAogCXN0cnVjdCB4ZnNfYnVmCQkqYnA7CS8qIGJ1ZmZlciBmb3IgYmxvY2sgKi8KIAl1bmlvbiB4ZnNfYnRyZWVfcHRyCW5wdHI7CS8qIG5ldyBibG9jayBwdHIgKi8KIAlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqbmN1cjsJLyogbmV3IGJ0cmVlIGN1cnNvciAqLwotCXVuaW9uIHhmc19idHJlZV9iaWdrZXkJbmtleTsJLyogbmV3IGJsb2NrIGtleSAqLworCXVuaW9uIHhmc19idHJlZV9rZXkJbmtleTsJLyogbmV3IGJsb2NrIGtleSAqLwogCXVuaW9uIHhmc19idHJlZV9rZXkJKmxrZXk7CiAJaW50CQkJb3B0cjsJLyogb2xkIGtleS9yZWNvcmQgaW5kZXggKi8KIAlpbnQJCQlwdHI7CS8qIGtleS9yZWNvcmQgaW5kZXggKi8KQEAgLTMyMzcsNyArMzI0MSw3IEBACiAJWEZTX0JUUkVFX1RSQUNFX0FSR0lQUihjdXIsIGxldmVsLCAqcHRycCwgJnJlYyk7CiAKIAluY3VyID0gTlVMTDsKLQlsa2V5ID0gKHVuaW9uIHhmc19idHJlZV9rZXkgKikmbmtleTsKKwlsa2V5ID0gJm5rZXk7CiAKIAkvKgogCSAqIElmIHdlIGhhdmUgYW4gZXh0ZXJuYWwgcm9vdCBwb2ludGVyLCBhbmQgd2UndmUgbWFkZSBpdCB0byB0aGUKQEAgLTM0NDAsMTQgKzM0NDQsMTQgQEAKIAl1bmlvbiB4ZnNfYnRyZWVfcHRyCW5wdHI7CS8qIG5ldyBibG9jayBudW1iZXIgKHNwbGl0IHJlc3VsdCkgKi8KIAlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqbmN1cjsJLyogbmV3IGN1cnNvciAoc3BsaXQgcmVzdWx0KSAqLwogCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpwY3VyOwkvKiBwcmV2aW91cyBsZXZlbCdzIGN1cnNvciAqLwotCXVuaW9uIHhmc19idHJlZV9iaWdrZXkJYmtleTsJLyoga2V5IG9mIGJsb2NrIHRvIGluc2VydCAqLworCXVuaW9uIHhmc19idHJlZV9rZXkJYmtleTsJLyoga2V5IG9mIGJsb2NrIHRvIGluc2VydCAqLwogCXVuaW9uIHhmc19idHJlZV9rZXkJKmtleTsKIAl1bmlvbiB4ZnNfYnRyZWVfcmVjCXJlYzsJLyogcmVjb3JkIHRvIGluc2VydCAqLwogCiAJbGV2ZWwgPSAwOwogCW5jdXIgPSBOVUxMOwogCXBjdXIgPSBjdXI7Ci0Ja2V5ID0gKHVuaW9uIHhmc19idHJlZV9rZXkgKikmYmtleTsKKwlrZXkgPSAmYmtleTsKIAogCXhmc19idHJlZV9zZXRfcHRyX251bGwoY3VyLCAmbnB0cik7CiAKQEAgLTQ1NTQsMTUgKzQ1NTgsMjIgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OwogCisJLyogTm90aGluZz8gIFNlZSBpZiB0aGVyZSdzIGFueXRoaW5nIHRvIHRoZSByaWdodC4gKi8KKwlpZiAoIXN0YXQpIHsKKwkJZXJyb3IgPSB4ZnNfYnRyZWVfaW5jcmVtZW50KGN1ciwgMCwgJnN0YXQpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dDsKKwl9CisKIAl3aGlsZSAoc3RhdCkgewogCQkvKiBGaW5kIHRoZSByZWNvcmQuICovCiAJCWVycm9yID0geGZzX2J0cmVlX2dldF9yZWMoY3VyLCAmcmVjcCwgJnN0YXQpOwogCQlpZiAoZXJyb3IgfHwgIXN0YXQpCiAJCQlicmVhazsKLQkJY3VyLT5iY19vcHMtPmluaXRfaGlnaF9rZXlfZnJvbV9yZWMoJnJlY19rZXksIHJlY3ApOwogCiAJCS8qIFNraXAgaWYgaGlnaF9rZXkocmVjKSA8IGxvd19rZXkuICovCiAJCWlmIChmaXJzdHJlYykgeworCQkJY3VyLT5iY19vcHMtPmluaXRfaGlnaF9rZXlfZnJvbV9yZWMoJnJlY19rZXksIHJlY3ApOwogCQkJZmlyc3RyZWMgPSBmYWxzZTsKIAkJCWRpZmYgPSBjdXItPmJjX29wcy0+ZGlmZl90d29fa2V5cyhjdXIsIGxvd19rZXksCiAJCQkJCSZyZWNfa2V5KTsKQEAgLTQ1NzEsNiArNDU4Miw3IEBACiAJCX0KIAogCQkvKiBTdG9wIGlmIGhpZ2hfa2V5IDwgbG93X2tleShyZWMpLiAqLworCQljdXItPmJjX29wcy0+aW5pdF9rZXlfZnJvbV9yZWMoJnJlY19rZXksIHJlY3ApOwogCQlkaWZmID0gY3VyLT5iY19vcHMtPmRpZmZfdHdvX2tleXMoY3VyLCAmcmVjX2tleSwgaGlnaF9rZXkpOwogCQlpZiAoZGlmZiA+IDApCiAJCQlicmVhazsKQEAgLTQ3ODUsMyArNDc5Nyw1MCBAQAogCXJldHVybiB4ZnNfYnRyZWVfb3ZlcmxhcHBlZF9xdWVyeV9yYW5nZShjdXIsICZsb3dfa2V5LCAmaGlnaF9rZXksCiAJCQlmbiwgcHJpdik7CiB9CisKKy8qCisgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBibG9ja3MgbmVlZGVkIHRvIHN0b3JlIGEgZ2l2ZW4gbnVtYmVyIG9mIHJlY29yZHMKKyAqIGluIGEgc2hvcnQtZm9ybWF0IChwZXItQUcgbWV0YWRhdGEpIGJ0cmVlLgorICovCit4ZnNfZXh0bGVuX3QKK3hmc19idHJlZV9jYWxjX3NpemUoCisJc3RydWN0IHhmc19tb3VudAkqbXAsCisJdWludAkJCSpsaW1pdHMsCisJdW5zaWduZWQgbG9uZyBsb25nCWxlbikKK3sKKwlpbnQJCQlsZXZlbDsKKwlpbnQJCQltYXhyZWNzOworCXhmc19leHRsZW5fdAkJcnZhbDsKKworCW1heHJlY3MgPSBsaW1pdHNbMF07CisJZm9yIChsZXZlbCA9IDAsIHJ2YWwgPSAwOyBsZW4gPiAxOyBsZXZlbCsrKSB7CisJCWxlbiArPSBtYXhyZWNzIC0gMTsKKwkJZG9fZGl2KGxlbiwgbWF4cmVjcyk7CisJCW1heHJlY3MgPSBsaW1pdHNbMV07CisJCXJ2YWwgKz0gbGVuOworCX0KKwlyZXR1cm4gcnZhbDsKK30KKworaW50Cit4ZnNfYnRyZWVfY291bnRfYmxvY2tzX2hlbHBlcigKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCWludAkJCWxldmVsLAorCXZvaWQJCQkqZGF0YSkKK3sKKwl4ZnNfZXh0bGVuX3QJCSpibG9ja3MgPSBkYXRhOworCSgqYmxvY2tzKSsrOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENvdW50IHRoZSBibG9ja3MgaW4gYSBidHJlZSBhbmQgcmV0dXJuIHRoZSByZXN1bHQgaW4gKmJsb2Nrcy4gKi8KK2ludAoreGZzX2J0cmVlX2NvdW50X2Jsb2NrcygKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAorCXhmc19leHRsZW5fdAkJKmJsb2NrcykKK3sKKwkqYmxvY2tzID0gMDsKKwlyZXR1cm4geGZzX2J0cmVlX3Zpc2l0X2Jsb2NrcyhjdXIsIHhmc19idHJlZV9jb3VudF9ibG9ja3NfaGVscGVyLAorCQkJYmxvY2tzKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saWJ4ZnMveGZzX2J0cmVlLmggYi9mcy94ZnMvbGlieGZzL3hmc19idHJlZS5oCmluZGV4IDA0ZDA4NjUuLjNmODU1NmEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saWJ4ZnMveGZzX2J0cmVlLmgKKysrIGIvZnMveGZzL2xpYnhmcy94ZnNfYnRyZWUuaApAQCAtMzcsMzAgKzM3LDE4IEBACiAJX19iZTY0CQkJbDsJLyogbG9uZyBmb3JtIHB0ciAqLwogfTsKIAorLyoKKyAqIFRoZSBpbi1jb3JlIGJ0cmVlIGtleS4gIE92ZXJsYXBwaW5nIGJ0cmVlcyBhY3R1YWxseSBzdG9yZSB0d28ga2V5cworICogcGVyIHBvaW50ZXIsIHNvIHdlIHJlc2VydmUgZW5vdWdoIG1lbW9yeSB0byBob2xkIGJvdGguICBUaGUgX18qYmlna2V5CisgKiBpdGVtcyBzaG91bGQgbmV2ZXIgYmUgYWNjZXNzZWQgZGlyZWN0bHkuCisgKi8KIHVuaW9uIHhmc19idHJlZV9rZXkgewogCXN0cnVjdCB4ZnNfYm1idF9rZXkJCWJtYnQ7CiAJeGZzX2JtZHJfa2V5X3QJCQlibWJyOwkvKiBibWJ0IHJvb3QgYmxvY2sgKi8KIAl4ZnNfYWxsb2Nfa2V5X3QJCQlhbGxvYzsKIAlzdHJ1Y3QgeGZzX2lub2J0X2tleQkJaW5vYnQ7CiAJc3RydWN0IHhmc19ybWFwX2tleQkJcm1hcDsKLX07Ci0KLS8qCi0gKiBJbi1jb3JlIGtleSB0aGF0IGhvbGRzIGJvdGggbG93IGFuZCBoaWdoIGtleXMgZm9yIG92ZXJsYXBwZWQgYnRyZWVzLgotICogVGhlIHR3byBrZXlzIGFyZSBwYWNrZWQgbmV4dCB0byBlYWNoIG90aGVyIG9uIGRpc2ssIHNvIGRvIHRoZSBzYW1lCi0gKiBpbiBtZW1vcnkuICBQcmVzZXJ2ZSB0aGUgZXhpc3RpbmcgeGZzX2J0cmVlX2tleSBhcyBhIHNpbmdsZSBrZXkgdG8KLSAqIGF2b2lkIHRoZSBtZW50YWwgbW9kZWwgYnJlYWthZ2UgdGhhdCB3b3VsZCBoYXBwZW4gaWYgd2UgcGFzc2VkIGEKLSAqIGJpZ2tleSBpbnRvIGEgZnVuY3Rpb24gdGhhdCBvcGVyYXRlcyBvbiBhIHNpbmdsZSBrZXkuCi0gKi8KLXVuaW9uIHhmc19idHJlZV9iaWdrZXkgewotCXN0cnVjdCB4ZnNfYm1idF9rZXkJCWJtYnQ7Ci0JeGZzX2JtZHJfa2V5X3QJCQlibWJyOwkvKiBibWJ0IHJvb3QgYmxvY2sgKi8KLQl4ZnNfYWxsb2Nfa2V5X3QJCQlhbGxvYzsKLQlzdHJ1Y3QgeGZzX2lub2J0X2tleQkJaW5vYnQ7Ci0Jc3RydWN0IHsKLQkJc3RydWN0IHhmc19ybWFwX2tleQlybWFwOwotCQlzdHJ1Y3QgeGZzX3JtYXBfa2V5CXJtYXBfaGk7Ci0JfTsKKwlzdHJ1Y3QgeGZzX3JtYXBfa2V5CQlfX3JtYXBfYmlna2V5WzJdOwogfTsKIAogdW5pb24geGZzX2J0cmVlX3JlYyB7CkBAIC01MTMsNiArNTAxLDggQEAKIGJvb2wgeGZzX2J0cmVlX3NibG9ja192ZXJpZnkoc3RydWN0IHhmc19idWYgKmJwLCB1bnNpZ25lZCBpbnQgbWF4X3JlY3MpOwogdWludCB4ZnNfYnRyZWVfY29tcHV0ZV9tYXhsZXZlbHMoc3RydWN0IHhmc19tb3VudCAqbXAsIHVpbnQgKmxpbWl0cywKIAkJCQkgdW5zaWduZWQgbG9uZyBsZW4pOworeGZzX2V4dGxlbl90IHhmc19idHJlZV9jYWxjX3NpemUoc3RydWN0IHhmc19tb3VudCAqbXAsIHVpbnQgKmxpbWl0cywKKwkJdW5zaWduZWQgbG9uZyBsb25nIGxlbik7CiAKIC8qIHJldHVybiBjb2RlcyAqLwogI2RlZmluZSBYRlNfQlRSRUVfUVVFUllfUkFOR0VfQ09OVElOVUUJMAkvKiBrZWVwIGl0ZXJhdGluZyAqLwpAQCAtNTI5LDQgKzUxOSw2IEBACiBpbnQgeGZzX2J0cmVlX3Zpc2l0X2Jsb2NrcyhzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyLAogCQl4ZnNfYnRyZWVfdmlzaXRfYmxvY2tzX2ZuIGZuLCB2b2lkICpkYXRhKTsKIAoraW50IHhmc19idHJlZV9jb3VudF9ibG9ja3Moc3RydWN0IHhmc19idHJlZV9jdXIgKmN1ciwgeGZzX2V4dGxlbl90ICpibG9ja3MpOworCiAjZW5kaWYJLyogX19YRlNfQlRSRUVfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGlieGZzL3hmc19kZWZlci5jIGIvZnMveGZzL2xpYnhmcy94ZnNfZGVmZXIuYwppbmRleCAwNTRhMjAzLi42MTNjNWNmIDEwMDY0NAotLS0gYS9mcy94ZnMvbGlieGZzL3hmc19kZWZlci5jCisrKyBiL2ZzL3hmcy9saWJ4ZnMveGZzX2RlZmVyLmMKQEAgLTgxLDYgKzgxLDEwIEBACiAgKiAgIC0gRm9yIGVhY2ggd29yayBpdGVtIGF0dGFjaGVkIHRvIHRoZSBsb2cgaW50ZW50IGl0ZW0sCiAgKiAgICAgKiBQZXJmb3JtIHRoZSBkZXNjcmliZWQgYWN0aW9uLgogICogICAgICogQXR0YWNoIHRoZSB3b3JrIGl0ZW0gdG8gdGhlIGxvZyBkb25lIGl0ZW0uCisgKiAgICAgKiBJZiB0aGUgcmVzdWx0IG9mIGRvaW5nIHRoZSB3b3JrIHdhcyAtRUFHQUlOLCAtPmZpbmlzaCB3b3JrCisgKiAgICAgICB3YW50cyBhIG5ldyB0cmFuc2FjdGlvbi4gIFNlZSB0aGUgIlJlcXVlc3RpbmcgYSBGcmVzaAorICogICAgICAgVHJhbnNhY3Rpb24gd2hpbGUgRmluaXNoaW5nIERlZmVycmVkIFdvcmsiIHNlY3Rpb24gYmVsb3cgZm9yCisgKiAgICAgICBkZXRhaWxzLgogICoKICAqIFRoZSBrZXkgaGVyZSBpcyB0aGF0IHdlIG11c3QgbG9nIGFuIGludGVudCBpdGVtIGZvciBhbGwgcGVuZGluZwogICogd29yayBpdGVtcyBldmVyeSB0aW1lIHdlIHJvbGwgdGhlIHRyYW5zYWN0aW9uLCBhbmQgdGhhdCB3ZSBtdXN0IGxvZwpAQCAtODgsNiArOTIsMzQgQEAKICAqIHdlIGNhbiBwZXJmb3JtIGNvbXBsZXggcmVtYXBwaW5nIG9wZXJhdGlvbnMsIGNoYWluaW5nIGludGVudCBpdGVtcwogICogYXMgbmVlZGVkLgogICoKKyAqIFJlcXVlc3RpbmcgYSBGcmVzaCBUcmFuc2FjdGlvbiB3aGlsZSBGaW5pc2hpbmcgRGVmZXJyZWQgV29yaworICoKKyAqIElmIC0+ZmluaXNoX2l0ZW0gZGVjaWRlcyB0aGF0IGl0IG5lZWRzIGEgZnJlc2ggdHJhbnNhY3Rpb24gdG8KKyAqIGZpbmlzaCB0aGUgd29yaywgaXQgbXVzdCBhc2sgaXRzIGNhbGxlciAoeGZzX2RlZmVyX2ZpbmlzaCkgZm9yIGEKKyAqIGNvbnRpbnVhdGlvbi4gIFRoZSBtb3N0IGxpa2VseSBjYXVzZSBvZiB0aGlzIGNpcmN1bXN0YW5jZSBhcmUgdGhlCisgKiByZWZjb3VudCBhZGp1c3QgZnVuY3Rpb25zIGRlY2lkaW5nIHRoYXQgdGhleSd2ZSBsb2dnZWQgZW5vdWdoIGl0ZW1zCisgKiB0byBiZSBhdCByaXNrIG9mIGV4Y2VlZGluZyB0aGUgdHJhbnNhY3Rpb24gcmVzZXJ2YXRpb24uCisgKgorICogVG8gZ2V0IGEgZnJlc2ggdHJhbnNhY3Rpb24sIHdlIHdhbnQgdG8gbG9nIHRoZSBleGlzdGluZyBsb2cgZG9uZQorICogaXRlbSB0byBwcmV2ZW50IHRoZSBsb2cgaW50ZW50IGl0ZW0gZnJvbSByZXBsYXlpbmcsIGltbWVkaWF0ZWx5IGxvZworICogYSBuZXcgbG9nIGludGVudCBpdGVtIHdpdGggdGhlIHVuZmluaXNoZWQgd29yayBpdGVtcywgcm9sbCB0aGUKKyAqIHRyYW5zYWN0aW9uLCBhbmQgcmUtY2FsbCAtPmZpbmlzaF9pdGVtIHdoZXJldmVyIGl0IGxlZnQgb2ZmLiAgVGhlCisgKiBsb2cgZG9uZSBpdGVtIGFuZCB0aGUgbmV3IGxvZyBpbnRlbnQgaXRlbSBtdXN0IGJlIGluIHRoZSBzYW1lCisgKiB0cmFuc2FjdGlvbiBvciBhdG9taWNpdHkgY2Fubm90IGJlIGd1YXJhbnRlZWQ7IGRlZmVyX2ZpbmlzaCBlbnN1cmVzCisgKiB0aGF0IHRoaXMgaGFwcGVucy4KKyAqCisgKiBUaGlzIHJlcXVpcmVzIHNvbWUgY29vcmRpbmF0aW9uIGJldHdlZW4gLT5maW5pc2hfaXRlbSBhbmQKKyAqIGRlZmVyX2ZpbmlzaC4gIFVwb24gZGVjaWRpbmcgdG8gcmVxdWVzdCBhIG5ldyB0cmFuc2FjdGlvbiwKKyAqIC0+ZmluaXNoX2l0ZW0gc2hvdWxkIHVwZGF0ZSB0aGUgY3VycmVudCB3b3JrIGl0ZW0gdG8gcmVmbGVjdCB0aGUKKyAqIHVuZmluaXNoZWQgd29yay4gIE5leHQsIGl0IHNob3VsZCByZXNldCB0aGUgbG9nIGRvbmUgaXRlbSdzIGxpc3QKKyAqIGNvdW50IHRvIHRoZSBudW1iZXIgb2YgaXRlbXMgZmluaXNoZWQsIGFuZCByZXR1cm4gLUVBR0FJTi4KKyAqIGRlZmVyX2ZpbmlzaCBzZWVzIHRoZSAtRUFHQUlOLCBsb2dzIHRoZSBuZXcgbG9nIGludGVudCBpdGVtCisgKiB3aXRoIHRoZSByZW1haW5pbmcgd29yayBpdGVtcywgYW5kIGxlYXZlcyB0aGUgeGZzX2RlZmVyX3BlbmRpbmcKKyAqIGl0ZW0gYXQgdGhlIGhlYWQgb2YgdGhlIGRvcF93b3JrIHF1ZXVlLiAgVGhlbiBpdCByb2xscyB0aGUKKyAqIHRyYW5zYWN0aW9uIGFuZCBwaWNrcyB1cCBwcm9jZXNzaW5nIHdoZXJlIGl0IGxlZnQgb2ZmLiAgSXQgaXMKKyAqIHJlcXVpcmVkIHRoYXQgLT5maW5pc2hfaXRlbSBtdXN0IGJlIGNhcmVmdWwgdG8gbGVhdmUgZW5vdWdoCisgKiB0cmFuc2FjdGlvbiByZXNlcnZhdGlvbiB0byBmaXQgdGhlIG5ldyBsb2cgaW50ZW50IGl0ZW0uCisgKgogICogVGhpcyBpcyBhbiBleGFtcGxlIG9mIHJlbWFwcGluZyB0aGUgZXh0ZW50IChFLCBFK0IpIGludG8gZmlsZSBYIGF0CiAgKiBvZmZzZXQgQSBhbmQgZGVhbGluZyB3aXRoIHRoZSBleHRlbnQgKEMsIEMrQikgYWxyZWFkeSBiZWluZyBtYXBwZWQKICAqIHRoZXJlOgpAQCAtMTA0LDIxICsxMzYsMjYgQEAKICAqIHwgSW50ZW50IHRvIGFkZCBybWFwIChYLCBFLCBBLCBCKSAgICAgICAgICAgICAgICAgfAogICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgKiB8IFJlZHVjZSByZWZjb3VudCBmb3IgZXh0ZW50IChDLCBCKSAgICAgICAgICAgICAgIHwgdDIKLSAqIHwgRG9uZSByZWR1Y2luZyByZWZjb3VudCBmb3IgZXh0ZW50IChDLCBCKSAgICAgICAgfAorICogfCBEb25lIHJlZHVjaW5nIHJlZmNvdW50IGZvciBleHRlbnQgKEMsIDkpICAgICAgICB8CisgKiB8IEludGVudCB0byByZWR1Y2UgcmVmY291bnQgZm9yIGV4dGVudCAoQys5LCBCLTkpIHwKKyAqIHwgKHJhbiBvdXQgb2Ygc3BhY2UgYWZ0ZXIgOSByZWZjb3VudCB1cGRhdGVzKSAgICAgfAorICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiB8IFJlZHVjZSByZWZjb3VudCBmb3IgZXh0ZW50IChDKzksIEIrOSkgICAgICAgICAgIHwgdDMKKyAqIHwgRG9uZSByZWR1Y2luZyByZWZjb3VudCBmb3IgZXh0ZW50IChDKzksIEItOSkgICAgfAogICogfCBJbmNyZWFzZSByZWZjb3VudCBmb3IgZXh0ZW50IChFLCBCKSAgICAgICAgICAgICB8CiAgKiB8IERvbmUgaW5jcmVhc2luZyByZWZjb3VudCBmb3IgZXh0ZW50IChFLCBCKSAgICAgIHwKICAqIHwgSW50ZW50IHRvIGZyZWUgZXh0ZW50IChDLCBCKSAgICAgICAgICAgICAgICAgICAgfAogICogfCBJbnRlbnQgdG8gZnJlZSBleHRlbnQgKEYsIDEpIChyZWZjb3VudGJ0IGJsb2NrKSB8CiAgKiB8IEludGVudCB0byByZW1vdmUgcm1hcCAoRiwgMSwgUkVGQykgICAgICAgICAgICAgIHwKICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICogfCBSZW1vdmUgcm1hcCAoWCwgQywgQSwgQikgICAgICAgICAgICAgICAgICAgICAgICB8IHQzCisgKiB8IFJlbW92ZSBybWFwIChYLCBDLCBBLCBCKSAgICAgICAgICAgICAgICAgICAgICAgIHwgdDQKICAqIHwgRG9uZSByZW1vdmluZyBybWFwIChYLCBDLCBBLCBCKSAgICAgICAgICAgICAgICAgfAogICogfCBBZGQgcm1hcCAoWCwgRSwgQSwgQikgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgKiB8IERvbmUgYWRkaW5nIHJtYXAgKFgsIEUsIEEsIEIpICAgICAgICAgICAgICAgICAgIHwKICAqIHwgUmVtb3ZlIHJtYXAgKEYsIDEsIFJFRkMpICAgICAgICAgICAgICAgICAgICAgICAgfAogICogfCBEb25lIHJlbW92aW5nIHJtYXAgKEYsIDEsIFJFRkMpICAgICAgICAgICAgICAgICB8CiAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAqIHwgRnJlZSBleHRlbnQgKEMsIEIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0NAorICogfCBGcmVlIGV4dGVudCAoQywgQikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHQ1CiAgKiB8IERvbmUgZnJlZWluZyBleHRlbnQgKEMsIEIpICAgICAgICAgICAgICAgICAgICAgIHwKICAqIHwgRnJlZSBleHRlbnQgKEQsIDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICogfCBEb25lIGZyZWVpbmcgZXh0ZW50IChELCAxKSAgICAgICAgICAgICAgICAgICAgICB8CkBAIC0xNDEsNiArMTc4LDkgQEAKICAqIC0gSW50ZW50IHRvIGZyZWUgZXh0ZW50IChDLCBCKQogICogLSBJbnRlbnQgdG8gZnJlZSBleHRlbnQgKEYsIDEpIChyZWZjb3VudGJ0IGJsb2NrKQogICogLSBJbnRlbnQgdG8gcmVtb3ZlIHJtYXAgKEYsIDEsIFJFRkMpCisgKgorICogTm90ZSB0aGF0IHRoZSBjb250aW51YXRpb24gcmVxdWVzdGVkIGJldHdlZW4gdDIgYW5kIHQzIGlzIGxpa2VseSB0bworICogcmVvY2N1ci4KICAqLwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHhmc19kZWZlcl9vcF90eXBlICpkZWZlcl9vcF90eXBlc1tYRlNfREVGRVJfT1BTX1RZUEVfTUFYXTsKQEAgLTE5NCw3ICsyMzQsNyBAQAogCS8qIEFib3J0IGludGVudCBpdGVtcy4gKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRmcCwgJmRvcC0+ZG9wX3BlbmRpbmcsIGRmcF9saXN0KSB7CiAJCXRyYWNlX3hmc19kZWZlcl9wZW5kaW5nX2Fib3J0KHRwLT50X21vdW50cCwgZGZwKTsKLQkJaWYgKGRmcC0+ZGZwX2NvbW1pdHRlZCkKKwkJaWYgKCFkZnAtPmRmcF9kb25lKQogCQkJZGZwLT5kZnBfdHlwZS0+YWJvcnRfaW50ZW50KGRmcC0+ZGZwX2ludGVudCk7CiAJfQogCkBAIC0yOTAsNyArMzMwLDYgQEAKIAlzdHJ1Y3QgeGZzX2RlZmVyX3BlbmRpbmcJKmRmcDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCQkqbGk7CiAJc3RydWN0IGxpc3RfaGVhZAkJKm47Ci0Jdm9pZAkJCQkqZG9uZV9pdGVtID0gTlVMTDsKIAl2b2lkCQkJCSpzdGF0ZTsKIAlpbnQJCQkJZXJyb3IgPSAwOwogCXZvaWQJCQkJKCpjbGVhbnVwX2ZuKShzdHJ1Y3QgeGZzX3RyYW5zICosIHZvaWQgKiwgaW50KTsKQEAgLTMwOSwxOSArMzQ4LDExIEBACiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0OwogCi0JCS8qIE1hcmsgYWxsIHBlbmRpbmcgaW50ZW50cyBhcyBjb21taXR0ZWQuICovCi0JCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShkZnAsICZkb3AtPmRvcF9wZW5kaW5nLCBkZnBfbGlzdCkgewotCQkJaWYgKGRmcC0+ZGZwX2NvbW1pdHRlZCkKLQkJCQlicmVhazsKLQkJCXRyYWNlX3hmc19kZWZlcl9wZW5kaW5nX2NvbW1pdCgoKnRwKS0+dF9tb3VudHAsIGRmcCk7Ci0JCQlkZnAtPmRmcF9jb21taXR0ZWQgPSB0cnVlOwotCQl9Ci0KIAkJLyogTG9nIGFuIGludGVudC1kb25lIGl0ZW0gZm9yIHRoZSBmaXJzdCBwZW5kaW5nIGl0ZW0uICovCiAJCWRmcCA9IGxpc3RfZmlyc3RfZW50cnkoJmRvcC0+ZG9wX3BlbmRpbmcsCiAJCQkJc3RydWN0IHhmc19kZWZlcl9wZW5kaW5nLCBkZnBfbGlzdCk7CiAJCXRyYWNlX3hmc19kZWZlcl9wZW5kaW5nX2ZpbmlzaCgoKnRwKS0+dF9tb3VudHAsIGRmcCk7Ci0JCWRvbmVfaXRlbSA9IGRmcC0+ZGZwX3R5cGUtPmNyZWF0ZV9kb25lKCp0cCwgZGZwLT5kZnBfaW50ZW50LAorCQlkZnAtPmRmcF9kb25lID0gZGZwLT5kZnBfdHlwZS0+Y3JlYXRlX2RvbmUoKnRwLCBkZnAtPmRmcF9pbnRlbnQsCiAJCQkJZGZwLT5kZnBfY291bnQpOwogCQljbGVhbnVwX2ZuID0gZGZwLT5kZnBfdHlwZS0+ZmluaXNoX2NsZWFudXA7CiAKQEAgLTMzMSw4ICszNjIsMTcgQEAKIAkJCWxpc3RfZGVsKGxpKTsKIAkJCWRmcC0+ZGZwX2NvdW50LS07CiAJCQllcnJvciA9IGRmcC0+ZGZwX3R5cGUtPmZpbmlzaF9pdGVtKCp0cCwgZG9wLCBsaSwKLQkJCQkJZG9uZV9pdGVtLCAmc3RhdGUpOwotCQkJaWYgKGVycm9yKSB7CisJCQkJCWRmcC0+ZGZwX2RvbmUsICZzdGF0ZSk7CisJCQlpZiAoZXJyb3IgPT0gLUVBR0FJTikgeworCQkJCS8qCisJCQkJICogQ2FsbGVyIHdhbnRzIGEgZnJlc2ggdHJhbnNhY3Rpb247CisJCQkJICogcHV0IHRoZSB3b3JrIGl0ZW0gYmFjayBvbiB0aGUgbGlzdAorCQkJCSAqIGFuZCBqdW1wIG91dC4KKwkJCQkgKi8KKwkJCQlsaXN0X2FkZChsaSwgJmRmcC0+ZGZwX3dvcmspOworCQkJCWRmcC0+ZGZwX2NvdW50Kys7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKGVycm9yKSB7CiAJCQkJLyoKIAkJCQkgKiBDbGVhbiB1cCBhZnRlciBvdXJzZWx2ZXMgYW5kIGp1bXAgb3V0LgogCQkJCSAqIHhmc19kZWZlcl9jYW5jZWwgd2lsbCB0YWtlIGNhcmUgb2YgZnJlZWluZwpAQCAtMzQ0LDkgKzM4NCwyNSBAQAogCQkJCWdvdG8gb3V0OwogCQkJfQogCQl9Ci0JCS8qIERvbmUgd2l0aCB0aGUgZGZwLCBmcmVlIGl0LiAqLwotCQlsaXN0X2RlbCgmZGZwLT5kZnBfbGlzdCk7Ci0JCWttZW1fZnJlZShkZnApOworCQlpZiAoZXJyb3IgPT0gLUVBR0FJTikgeworCQkJLyoKKwkJCSAqIENhbGxlciB3YW50cyBhIGZyZXNoIHRyYW5zYWN0aW9uLCBzbyBsb2cgYQorCQkJICogbmV3IGxvZyBpbnRlbnQgaXRlbSB0byByZXBsYWNlIHRoZSBvbGQgb25lCisJCQkgKiBhbmQgcm9sbCB0aGUgdHJhbnNhY3Rpb24uICBTZWUgIlJlcXVlc3RpbmcKKwkJCSAqIGEgRnJlc2ggVHJhbnNhY3Rpb24gd2hpbGUgRmluaXNoaW5nCisJCQkgKiBEZWZlcnJlZCBXb3JrIiBhYm92ZS4KKwkJCSAqLworCQkJZGZwLT5kZnBfaW50ZW50ID0gZGZwLT5kZnBfdHlwZS0+Y3JlYXRlX2ludGVudCgqdHAsCisJCQkJCWRmcC0+ZGZwX2NvdW50KTsKKwkJCWRmcC0+ZGZwX2RvbmUgPSBOVUxMOworCQkJbGlzdF9mb3JfZWFjaChsaSwgJmRmcC0+ZGZwX3dvcmspCisJCQkJZGZwLT5kZnBfdHlwZS0+bG9nX2l0ZW0oKnRwLCBkZnAtPmRmcF9pbnRlbnQsCisJCQkJCQlsaSk7CisJCX0gZWxzZSB7CisJCQkvKiBEb25lIHdpdGggdGhlIGRmcCwgZnJlZSBpdC4gKi8KKwkJCWxpc3RfZGVsKCZkZnAtPmRmcF9saXN0KTsKKwkJCWttZW1fZnJlZShkZnApOworCQl9CiAKIAkJaWYgKGNsZWFudXBfZm4pCiAJCQljbGVhbnVwX2ZuKCp0cCwgc3RhdGUsIGVycm9yKTsKQEAgLTQyOCw4ICs0ODQsOCBAQAogCQlkZnAgPSBrbWVtX2FsbG9jKHNpemVvZihzdHJ1Y3QgeGZzX2RlZmVyX3BlbmRpbmcpLAogCQkJCUtNX1NMRUVQIHwgS01fTk9GUyk7CiAJCWRmcC0+ZGZwX3R5cGUgPSBkZWZlcl9vcF90eXBlc1t0eXBlXTsKLQkJZGZwLT5kZnBfY29tbWl0dGVkID0gZmFsc2U7CiAJCWRmcC0+ZGZwX2ludGVudCA9IE5VTEw7CisJCWRmcC0+ZGZwX2RvbmUgPSBOVUxMOwogCQlkZnAtPmRmcF9jb3VudCA9IDA7CiAJCUlOSVRfTElTVF9IRUFEKCZkZnAtPmRmcF93b3JrKTsKIAkJbGlzdF9hZGRfdGFpbCgmZGZwLT5kZnBfbGlzdCwgJmRvcC0+ZG9wX2ludGFrZSk7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGlieGZzL3hmc19kZWZlci5oIGIvZnMveGZzL2xpYnhmcy94ZnNfZGVmZXIuaAppbmRleCBjYzM5ODFjLi5lOTY1MzNkIDEwMDY0NAotLS0gYS9mcy94ZnMvbGlieGZzL3hmc19kZWZlci5oCisrKyBiL2ZzL3hmcy9saWJ4ZnMveGZzX2RlZmVyLmgKQEAgLTMwLDggKzMwLDggQEAKIHN0cnVjdCB4ZnNfZGVmZXJfcGVuZGluZyB7CiAJY29uc3Qgc3RydWN0IHhmc19kZWZlcl9vcF90eXBlCSpkZnBfdHlwZTsJLyogZnVuY3Rpb24gcG9pbnRlcnMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCQlkZnBfbGlzdDsJLyogcGVuZGluZyBpdGVtcyAqLwotCWJvb2wJCQkJZGZwX2NvbW1pdHRlZDsJLyogY29tbWl0dGVkIHRyYW5zPyAqLwogCXZvaWQJCQkJKmRmcF9pbnRlbnQ7CS8qIGxvZyBpbnRlbnQgaXRlbSAqLworCXZvaWQJCQkJKmRmcF9kb25lOwkvKiBsb2cgZG9uZSBpdGVtICovCiAJc3RydWN0IGxpc3RfaGVhZAkJZGZwX3dvcms7CS8qIHdvcmsgaXRlbXMgKi8KIAl1bnNpZ25lZCBpbnQJCQlkZnBfY291bnQ7CS8qICMgZXh0ZW50IGl0ZW1zICovCiB9OwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpYnhmcy94ZnNfZm9ybWF0LmggYi9mcy94ZnMvbGlieGZzL3hmc19mb3JtYXQuaAppbmRleCBmODE0ZDQyLi4yNzBmYjVjIDEwMDY0NAotLS0gYS9mcy94ZnMvbGlieGZzL3hmc19mb3JtYXQuaAorKysgYi9mcy94ZnMvbGlieGZzL3hmc19mb3JtYXQuaApAQCAtNjQwLDEyICs2NDAsMTUgQEAKIAlfX2JlMzIJCWFnZl9idHJlZWJsa3M7CS8qICMgb2YgYmxvY2tzIGhlbGQgaW4gQUdGIGJ0cmVlcyAqLwogCXV1aWRfdAkJYWdmX3V1aWQ7CS8qIHV1aWQgb2YgZmlsZXN5c3RlbSAqLwogCisJX19iZTMyCQlhZ2Zfcm1hcF9ibG9ja3M7CS8qIHJtYXBidCBibG9ja3MgdXNlZCAqLworCV9fYmUzMgkJYWdmX3BhZGRpbmc7CQkvKiBwYWRkaW5nICovCisKIAkvKgogCSAqIHJlc2VydmUgc29tZSBjb250aWd1b3VzIHNwYWNlIGZvciBmdXR1cmUgbG9nZ2VkIGZpZWxkcyBiZWZvcmUgd2UgYWRkCiAJICogdGhlIHVubG9nZ2VkIGZpZWxkcy4gVGhpcyBtYWtlcyB0aGUgcmFuZ2UgbG9nZ2luZyB2aWEgZmxhZ3MgYW5kCiAJICogc3RydWN0dXJlIG9mZnNldHMgbXVjaCBzaW1wbGVyLgogCSAqLwotCV9fYmU2NAkJYWdmX3NwYXJlNjRbMTZdOworCV9fYmU2NAkJYWdmX3NwYXJlNjRbMTVdOwogCiAJLyogdW5sb2dnZWQgZmllbGRzLCB3cml0dGVuIGR1cmluZyBidWZmZXIgd3JpdGViYWNrLiAqLwogCV9fYmU2NAkJYWdmX2xzbjsJLyogbGFzdCB3cml0ZSBzZXF1ZW5jZSAqLwpAQCAtNjcwLDcgKzY3Myw5IEBACiAjZGVmaW5lCVhGU19BR0ZfTE9OR0VTVAkJMHgwMDAwMDQwMAogI2RlZmluZQlYRlNfQUdGX0JUUkVFQkxLUwkweDAwMDAwODAwCiAjZGVmaW5lCVhGU19BR0ZfVVVJRAkJMHgwMDAwMTAwMAotI2RlZmluZQlYRlNfQUdGX05VTV9CSVRTCTEzCisjZGVmaW5lCVhGU19BR0ZfUk1BUF9CTE9DS1MJMHgwMDAwMjAwMAorI2RlZmluZQlYRlNfQUdGX1NQQVJFNjQJCTB4MDAwMDQwMDAKKyNkZWZpbmUJWEZTX0FHRl9OVU1fQklUUwkxNQogI2RlZmluZQlYRlNfQUdGX0FMTF9CSVRTCSgoMSA8PCBYRlNfQUdGX05VTV9CSVRTKSAtIDEpCiAKICNkZWZpbmUgWEZTX0FHRl9GTEFHUyBcCkBAIC02ODYsNyArNjkxLDkgQEAKIAl7IFhGU19BR0ZfRlJFRUJMS1MsCSJGUkVFQkxLUyIgfSwgXAogCXsgWEZTX0FHRl9MT05HRVNULAkiTE9OR0VTVCIgfSwgXAogCXsgWEZTX0FHRl9CVFJFRUJMS1MsCSJCVFJFRUJMS1MiIH0sIFwKLQl7IFhGU19BR0ZfVVVJRCwJCSJVVUlEIiB9CisJeyBYRlNfQUdGX1VVSUQsCQkiVVVJRCIgfSwgXAorCXsgWEZTX0FHRl9STUFQX0JMT0NLUywJIlJNQVBfQkxPQ0tTIiB9LCBcCisJeyBYRlNfQUdGX1NQQVJFNjQsCSJTUEFSRTY0IiB9CiAKIC8qIGRpc2sgYmxvY2sgKHhmc19kYWRkcl90KSBpbiB0aGUgQUcgKi8KICNkZWZpbmUgWEZTX0FHRl9EQUREUihtcCkJKCh4ZnNfZGFkZHJfdCkoMSA8PCAobXApLT5tX3NlY3RiYl9sb2cpKQpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpYnhmcy94ZnNfaWFsbG9jX2J0cmVlLmMgYi9mcy94ZnMvbGlieGZzL3hmc19pYWxsb2NfYnRyZWUuYwppbmRleCAzMWNhMjIwLi5lYWI2OGFlIDEwMDY0NAotLS0gYS9mcy94ZnMvbGlieGZzL3hmc19pYWxsb2NfYnRyZWUuYworKysgYi9mcy94ZnMvbGlieGZzL3hmc19pYWxsb2NfYnRyZWUuYwpAQCAtMTMyLDcgKzEzMiw3IEBACiAJeGZzX3JtYXBfYWdfb3duZXIoJm9pbmZvLCBYRlNfUk1BUF9PV05fSU5PQlQpOwogCXJldHVybiB4ZnNfZnJlZV9leHRlbnQoY3VyLT5iY190cCwKIAkJCVhGU19EQUREUl9UT19GU0IoY3VyLT5iY19tcCwgWEZTX0JVRl9BRERSKGJwKSksIDEsCi0JCQkmb2luZm8pOworCQkJJm9pbmZvLCBYRlNfQUdfUkVTVl9OT05FKTsKIH0KIAogU1RBVElDIGludApkaWZmIC0tZ2l0IGEvZnMveGZzL2xpYnhmcy94ZnNfbG9nX2Zvcm1hdC5oIGIvZnMveGZzL2xpYnhmcy94ZnNfbG9nX2Zvcm1hdC5oCmluZGV4IGE2ZWVkNDMuLmZjNWVlZjggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saWJ4ZnMveGZzX2xvZ19mb3JtYXQuaAorKysgYi9mcy94ZnMvbGlieGZzL3hmc19sb2dfZm9ybWF0LmgKQEAgLTY0Nyw5ICs2NDcsMTcgQEAKIAlfX3VpbnQxNl90CQlydWlfc2l6ZTsJLyogc2l6ZSBvZiB0aGlzIGl0ZW0gKi8KIAlfX3VpbnQzMl90CQlydWlfbmV4dGVudHM7CS8qICMgZXh0ZW50cyB0byBmcmVlICovCiAJX191aW50NjRfdAkJcnVpX2lkOwkJLyogcnVpIGlkZW50aWZpZXIgKi8KLQlzdHJ1Y3QgeGZzX21hcF9leHRlbnQJcnVpX2V4dGVudHNbMV07CS8qIGFycmF5IG9mIGV4dGVudHMgdG8gcm1hcCAqLworCXN0cnVjdCB4ZnNfbWFwX2V4dGVudAlydWlfZXh0ZW50c1tdOwkvKiBhcnJheSBvZiBleHRlbnRzIHRvIHJtYXAgKi8KIH07CiAKK3N0YXRpYyBpbmxpbmUgc2l6ZV90Cit4ZnNfcnVpX2xvZ19mb3JtYXRfc2l6ZW9mKAorCXVuc2lnbmVkIGludAkJbnIpCit7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgeGZzX3J1aV9sb2dfZm9ybWF0KSArCisJCQluciAqIHNpemVvZihzdHJ1Y3QgeGZzX21hcF9leHRlbnQpOworfQorCiAvKgogICogVGhpcyBpcyB0aGUgc3RydWN0dXJlIHVzZWQgdG8gbGF5IG91dCBhbiBydWQgbG9nIGl0ZW0gaW4gdGhlCiAgKiBsb2cuICBUaGUgcnVkX2V4dGVudHMgYXJyYXkgaXMgYSB2YXJpYWJsZSBzaXplIGFycmF5IHdob3NlCmRpZmYgLS1naXQgYS9mcy94ZnMvbGlieGZzL3hmc19ybWFwX2J0cmVlLmMgYi9mcy94ZnMvbGlieGZzL3hmc19ybWFwX2J0cmVlLmMKaW5kZXggYmMxZmFlYi4uMTdiOGVlYiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpYnhmcy94ZnNfcm1hcF9idHJlZS5jCisrKyBiL2ZzL3hmcy9saWJ4ZnMveGZzX3JtYXBfYnRyZWUuYwpAQCAtOTgsNiArOTgsOCBAQAogCXVuaW9uIHhmc19idHJlZV9wdHIJKm5ldywKIAlpbnQJCQkqc3RhdCkKIHsKKwlzdHJ1Y3QgeGZzX2J1ZgkJKmFnYnAgPSBjdXItPmJjX3ByaXZhdGUuYS5hZ2JwOworCXN0cnVjdCB4ZnNfYWdmCQkqYWdmID0gWEZTX0JVRl9UT19BR0YoYWdicCk7CiAJaW50CQkJZXJyb3I7CiAJeGZzX2FnYmxvY2tfdAkJYm5vOwogCkBAIC0xMjQsNiArMTI2LDggQEAKIAogCXhmc190cmFuc19hZ2J0cmVlX2RlbHRhKGN1ci0+YmNfdHAsIDEpOwogCW5ldy0+cyA9IGNwdV90b19iZTMyKGJubyk7CisJYmUzMl9hZGRfY3B1KCZhZ2YtPmFnZl9ybWFwX2Jsb2NrcywgMSk7CisJeGZzX2FsbG9jX2xvZ19hZ2YoY3VyLT5iY190cCwgYWdicCwgWEZTX0FHRl9STUFQX0JMT0NLUyk7CiAKIAlYRlNfQlRSRUVfVFJBQ0VfQ1VSU09SKGN1ciwgWEJUX0VYSVQpOwogCSpzdGF0ID0gMTsKQEAgLTE0Myw2ICsxNDcsOCBAQAogCWJubyA9IHhmc19kYWRkcl90b19hZ2JubyhjdXItPmJjX21wLCBYRlNfQlVGX0FERFIoYnApKTsKIAl0cmFjZV94ZnNfcm1hcGJ0X2ZyZWVfYmxvY2soY3VyLT5iY19tcCwgY3VyLT5iY19wcml2YXRlLmEuYWdubywKIAkJCWJubywgMSk7CisJYmUzMl9hZGRfY3B1KCZhZ2YtPmFnZl9ybWFwX2Jsb2NrcywgLTEpOworCXhmc19hbGxvY19sb2dfYWdmKGN1ci0+YmNfdHAsIGFnYnAsIFhGU19BR0ZfUk1BUF9CTE9DS1MpOwogCWVycm9yID0geGZzX2FsbG9jX3B1dF9mcmVlbGlzdChjdXItPmJjX3RwLCBhZ2JwLCBOVUxMLCBibm8sIDEpOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpYnhmcy94ZnNfc2IuYyBiL2ZzL3hmcy9saWJ4ZnMveGZzX3NiLmMKaW5kZXggMGUzZDRmNS4uNGFlY2M1ZiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpYnhmcy94ZnNfc2IuYworKysgYi9mcy94ZnMvbGlieGZzL3hmc19zYi5jCkBAIC01ODMsNyArNTgzLDggQEAKIAkgKiBPbmx5IGNoZWNrIHRoZSBpbiBwcm9ncmVzcyBmaWVsZCBmb3IgdGhlIHByaW1hcnkgc3VwZXJibG9jayBhcwogCSAqIG1rZnMueGZzIGRvZXNuJ3QgY2xlYXIgaXQgZnJvbSBzZWNvbmRhcnkgc3VwZXJibG9ja3MuCiAJICovCi0JcmV0dXJuIHhmc19tb3VudF92YWxpZGF0ZV9zYihtcCwgJnNiLCBicC0+Yl9ibiA9PSBYRlNfU0JfREFERFIsCisJcmV0dXJuIHhmc19tb3VudF92YWxpZGF0ZV9zYihtcCwgJnNiLAorCQkJCSAgICAgYnAtPmJfbWFwc1swXS5ibV9ibiA9PSBYRlNfU0JfREFERFIsCiAJCQkJICAgICBjaGVja192ZXJzaW9uKTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hb3BzLmMgYi9mcy94ZnMveGZzX2FvcHMuYwppbmRleCA3NTc1Y2ZjLi40YTI4ZmE5IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2FvcHMuYworKysgYi9mcy94ZnMveGZzX2FvcHMuYwpAQCAtMjAwLDcgKzIwMCw3IEBACiAgKiBVcGRhdGUgb24tZGlzayBmaWxlIHNpemUgbm93IHRoYXQgZGF0YSBoYXMgYmVlbiB3cml0dGVuIHRvIGRpc2suCiAgKi8KIFNUQVRJQyBpbnQKLXhmc19zZXRmaWxlc2l6ZSgKK19feGZzX3NldGZpbGVzaXplKAogCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAogCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAogCXhmc19vZmZfdAkJb2Zmc2V0LApAQCAtMjI1LDYgKzIyNSwyMyBAQAogCXJldHVybiB4ZnNfdHJhbnNfY29tbWl0KHRwKTsKIH0KIAoraW50Cit4ZnNfc2V0ZmlsZXNpemUoCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCisJeGZzX29mZl90CQlvZmZzZXQsCisJc2l6ZV90CQkJc2l6ZSkKK3sKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGlwLT5pX21vdW50OworCXN0cnVjdCB4ZnNfdHJhbnMJKnRwOworCWludAkJCWVycm9yOworCisJZXJyb3IgPSB4ZnNfdHJhbnNfYWxsb2MobXAsICZNX1JFUyhtcCktPnRyX2ZzeW5jdHMsIDAsIDAsIDAsICZ0cCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlyZXR1cm4gX194ZnNfc2V0ZmlsZXNpemUoaXAsIHRwLCBvZmZzZXQsIHNpemUpOworfQorCiBTVEFUSUMgaW50CiB4ZnNfc2V0ZmlsZXNpemVfaW9lbmQoCiAJc3RydWN0IHhmc19pb2VuZAkqaW9lbmQsCkBAIC0yNDcsNyArMjY0LDcgQEAKIAkJcmV0dXJuIGVycm9yOwogCX0KIAotCXJldHVybiB4ZnNfc2V0ZmlsZXNpemUoaXAsIHRwLCBpb2VuZC0+aW9fb2Zmc2V0LCBpb2VuZC0+aW9fc2l6ZSk7CisJcmV0dXJuIF9feGZzX3NldGZpbGVzaXplKGlwLCB0cCwgaW9lbmQtPmlvX29mZnNldCwgaW9lbmQtPmlvX3NpemUpOwogfQogCiAvKgpAQCAtMTMzNiwxMyArMTM1MywxMiBAQAogewogCXN0cnVjdCBpbm9kZQkJKmlub2RlID0gZmlsZV9pbm9kZShpb2NiLT5raV9maWxwKTsKIAlzdHJ1Y3QgeGZzX2lub2RlCSppcCA9IFhGU19JKGlub2RlKTsKLQlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGlwLT5pX21vdW50OwogCXVpbnRwdHJfdAkJZmxhZ3MgPSAodWludHB0cl90KXByaXZhdGU7CiAJaW50CQkJZXJyb3IgPSAwOwogCiAJdHJhY2VfeGZzX2VuZF9pb19kaXJlY3Rfd3JpdGUoaXAsIG9mZnNldCwgc2l6ZSk7CiAKLQlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCisJaWYgKFhGU19GT1JDRURfU0hVVERPV04oaXAtPmlfbW91bnQpKQogCQlyZXR1cm4gLUVJTzsKIAogCWlmIChzaXplIDw9IDApCkBAIC0xMzgwLDE0ICsxMzk2LDkgQEAKIAogCQllcnJvciA9IHhmc19pb21hcF93cml0ZV91bndyaXR0ZW4oaXAsIG9mZnNldCwgc2l6ZSk7CiAJfSBlbHNlIGlmIChmbGFncyAmIFhGU19ESU9fRkxBR19BUFBFTkQpIHsKLQkJc3RydWN0IHhmc190cmFucyAqdHA7Ci0KIAkJdHJhY2VfeGZzX2VuZF9pb19kaXJlY3Rfd3JpdGVfYXBwZW5kKGlwLCBvZmZzZXQsIHNpemUpOwogCi0JCWVycm9yID0geGZzX3RyYW5zX2FsbG9jKG1wLCAmTV9SRVMobXApLT50cl9mc3luY3RzLCAwLCAwLCAwLAotCQkJCSZ0cCk7Ci0JCWlmICghZXJyb3IpCi0JCQllcnJvciA9IHhmc19zZXRmaWxlc2l6ZShpcCwgdHAsIG9mZnNldCwgc2l6ZSk7CisJCWVycm9yID0geGZzX3NldGZpbGVzaXplKGlwLCBvZmZzZXQsIHNpemUpOwogCX0KIAogCXJldHVybiBlcnJvcjsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYW9wcy5oIGIvZnMveGZzL3hmc19hb3BzLmgKaW5kZXggYmYyZDlhMS4uMTk1MGUzYiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hb3BzLmgKKysrIGIvZnMveGZzL3hmc19hb3BzLmgKQEAgLTYyLDYgKzYyLDcgQEAKIAogaW50CXhmc19lbmRfaW9fZGlyZWN0X3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgbG9mZl90IG9mZnNldCwKIAkJc3NpemVfdCBzaXplLCB2b2lkICpwcml2YXRlKTsKK2ludAl4ZnNfc2V0ZmlsZXNpemUoc3RydWN0IHhmc19pbm9kZSAqaXAsIHhmc19vZmZfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKIAogZXh0ZXJuIHZvaWQgeGZzX2NvdW50X3BhZ2Vfc3RhdGUoc3RydWN0IHBhZ2UgKiwgaW50ICosIGludCAqKTsKIGV4dGVybiBzdHJ1Y3QgYmxvY2tfZGV2aWNlICp4ZnNfZmluZF9iZGV2X2Zvcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2JtYXBfdXRpbC5jIGIvZnMveGZzL3hmc19ibWFwX3V0aWwuYwppbmRleCA0ZWNlNGYyLi5lODI3ZDY1IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2JtYXBfdXRpbC5jCisrKyBiL2ZzL3hmcy94ZnNfYm1hcF91dGlsLmMKQEAgLTE4Miw3ICsxODIsNyBAQAogCQkJCQlYRlNfVFJBTlNfRFFfUlRCQ09VTlQsIChsb25nKSByYWxlbik7CiAKIAkJLyogWmVybyB0aGUgZXh0ZW50IGlmIHdlIHdlcmUgYXNrZWQgdG8gZG8gc28gKi8KLQkJaWYgKGFwLT51c2VyZGF0YSAmIFhGU19BTExPQ19VU0VSREFUQV9aRVJPKSB7CisJCWlmIChhcC0+ZGF0YXR5cGUgJiBYRlNfQUxMT0NfVVNFUkRBVEFfWkVSTykgewogCQkJZXJyb3IgPSB4ZnNfemVyb19leHRlbnQoYXAtPmlwLCBhcC0+Ymxrbm8sIGFwLT5sZW5ndGgpOwogCQkJaWYgKGVycm9yKQogCQkJCXJldHVybiBlcnJvcjsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYnVmLmMgYi9mcy94ZnMveGZzX2J1Zi5jCmluZGV4IDQ3YTMxOGMuLmI1YjliZmYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYnVmLmMKKysrIGIvZnMveGZzL3hmc19idWYuYwpAQCAtMTE1LDcgKzExNSw2IEBACiAJaWYgKCEoYnAtPmJfZmxhZ3MgJiBfWEJGX0lOX0ZMSUdIVCkpCiAJCXJldHVybjsKIAotCUFTU0VSVChicC0+Yl9mbGFncyAmIFhCRl9BU1lOQyk7CiAJYnAtPmJfZmxhZ3MgJj0gfl9YQkZfSU5fRkxJR0hUOwogCXBlcmNwdV9jb3VudGVyX2RlYygmYnAtPmJfdGFyZ2V0LT5idF9pb19jb3VudCk7CiB9CkBAIC0xNjEyLDcgKzE2MTEsNyBAQAogCSAqLwogCXdoaWxlIChwZXJjcHVfY291bnRlcl9zdW0oJmJ0cC0+YnRfaW9fY291bnQpKQogCQlkZWxheSgxMDApOwotCWRyYWluX3dvcmtxdWV1ZShidHAtPmJ0X21vdW50LT5tX2J1Zl93b3JrcXVldWUpOworCWZsdXNoX3dvcmtxdWV1ZShidHAtPmJ0X21vdW50LT5tX2J1Zl93b3JrcXVldWUpOwogCiAJLyogbG9vcCB1bnRpbCB0aGVyZSBpcyBub3RoaW5nIGxlZnQgb24gdGhlIGxydSBsaXN0LiAqLwogCXdoaWxlIChsaXN0X2xydV9jb3VudCgmYnRwLT5idF9scnUpKSB7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2J1Zl9pdGVtLmMgYi9mcy94ZnMveGZzX2J1Zl9pdGVtLmMKaW5kZXggZTQ1NWY5MC4uMjk3NWNiMiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19idWZfaXRlbS5jCisrKyBiL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uYwpAQCAtODY1LDcgKzg2NSw3IEBACiAJICovCiAJaWYgKGJpdCkgewogCQllbmRfYml0ID0gTUlOKGJpdCArIGJpdHNfdG9fc2V0LCAodWludClOQldPUkQpOwotCQltYXNrID0gKCgxIDw8IChlbmRfYml0IC0gYml0KSkgLSAxKSA8PCBiaXQ7CisJCW1hc2sgPSAoKDFVIDw8IChlbmRfYml0IC0gYml0KSkgLSAxKSA8PCBiaXQ7CiAJCSp3b3JkcCB8PSBtYXNrOwogCQl3b3JkcCsrOwogCQliaXRzX3NldCA9IGVuZF9iaXQgLSBiaXQ7CkBAIC04ODgsNyArODg4LDcgQEAKIAkgKi8KIAllbmRfYml0ID0gYml0c190b19zZXQgLSBiaXRzX3NldDsKIAlpZiAoZW5kX2JpdCkgewotCQltYXNrID0gKDEgPDwgZW5kX2JpdCkgLSAxOworCQltYXNrID0gKDFVIDw8IGVuZF9iaXQpIC0gMTsKIAkJKndvcmRwIHw9IG1hc2s7CiAJfQogfQpAQCAtMTA5NSw3ICsxMDk1LDggQEAKIAkgICAgIGJwLT5iX2xhc3RfZXJyb3IgIT0gYnAtPmJfZXJyb3IpIHsKIAkJYnAtPmJfZmxhZ3MgfD0gKFhCRl9XUklURSB8IFhCRl9ET05FIHwgWEJGX1dSSVRFX0ZBSUwpOwogCQlicC0+Yl9sYXN0X2Vycm9yID0gYnAtPmJfZXJyb3I7Ci0JCWlmIChjZmctPnJldHJ5X3RpbWVvdXQgJiYgIWJwLT5iX2ZpcnN0X3JldHJ5X3RpbWUpCisJCWlmIChjZmctPnJldHJ5X3RpbWVvdXQgIT0gWEZTX0VSUl9SRVRSWV9GT1JFVkVSICYmCisJCSAgICAhYnAtPmJfZmlyc3RfcmV0cnlfdGltZSkKIAkJCWJwLT5iX2ZpcnN0X3JldHJ5X3RpbWUgPSBqaWZmaWVzOwogCiAJCXhmc19idWZfaW9lcnJvcihicCwgMCk7CkBAIC0xMTExLDcgKzExMTIsNyBAQAogCWlmIChjZmctPm1heF9yZXRyaWVzICE9IFhGU19FUlJfUkVUUllfRk9SRVZFUiAmJgogCSAgICArK2JwLT5iX3JldHJpZXMgPiBjZmctPm1heF9yZXRyaWVzKQogCQkJZ290byBwZXJtYW5lbnRfZXJyb3I7Ci0JaWYgKGNmZy0+cmV0cnlfdGltZW91dCAmJgorCWlmIChjZmctPnJldHJ5X3RpbWVvdXQgIT0gWEZTX0VSUl9SRVRSWV9GT1JFVkVSICYmCiAJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgY2ZnLT5yZXRyeV90aW1lb3V0ICsgYnAtPmJfZmlyc3RfcmV0cnlfdGltZSkpCiAJCQlnb3RvIHBlcm1hbmVudF9lcnJvcjsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19leHRlbnRfYnVzeS5jIGIvZnMveGZzL3hmc19leHRlbnRfYnVzeS5jCmluZGV4IGMyNjNlMDcuLjE2MmRjMTggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZXh0ZW50X2J1c3kuYworKysgYi9mcy94ZnMveGZzX2V4dGVudF9idXN5LmMKQEAgLTM4NCw3ICszODQsNyBAQAogCQkgKiBJZiB0aGlzIGlzIGEgbWV0YWRhdGEgYWxsb2NhdGlvbiwgdHJ5IHRvIHJldXNlIHRoZSBidXN5CiAJCSAqIGV4dGVudCBpbnN0ZWFkIG9mIHRyaW1taW5nIHRoZSBhbGxvY2F0aW9uLgogCQkgKi8KLQkJaWYgKCFhcmdzLT51c2VyZGF0YSAmJgorCQlpZiAoIXhmc19hbGxvY19pc191c2VyZGF0YShhcmdzLT5kYXRhdHlwZSkgJiYKIAkJICAgICEoYnVzeXAtPmZsYWdzICYgWEZTX0VYVEVOVF9CVVNZX0RJU0NBUkRFRCkpIHsKIAkJCWlmICgheGZzX2V4dGVudF9idXN5X3VwZGF0ZV9leHRlbnQoYXJncy0+bXAsIGFyZ3MtPnBhZywKIAkJCQkJCQkgIGJ1c3lwLCBmYm5vLCBmbGVuLApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19maWxlLmMgYi9mcy94ZnMveGZzX2ZpbGUuYwppbmRleCBlZDk1ZTViLi5jNjg1MTdiIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2ZpbGUuYworKysgYi9mcy94ZnMveGZzX2ZpbGUuYwpAQCAtMjY5LDYgKzI2OSw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWZpbGVfYWNjZXNzZWQoaW9jYi0+a2lfZmlscCk7CisKIAkvKgogCSAqIExvY2tpbmcgaXMgYSBiaXQgdHJpY2t5IGhlcmUuIElmIHdlIHRha2UgYW4gZXhjbHVzaXZlIGxvY2sgZm9yIGRpcmVjdAogCSAqIElPLCB3ZSBlZmZlY3RpdmVseSBzZXJpYWxpc2UgYWxsIG5ldyBjb25jdXJyZW50IHJlYWQgSU8gdG8gdGhpcyBmaWxlCkBAIC0zMjMsNyArMzI1LDYgQEAKIAl9CiAJeGZzX3J3X2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfU0hBUkVEKTsKIAotCWZpbGVfYWNjZXNzZWQoaW9jYi0+a2lfZmlscCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMzMyLDEwICszMzMsNyBAQAogCXN0cnVjdCBraW9jYgkJKmlvY2IsCiAJc3RydWN0IGlvdl9pdGVyCQkqdG8pCiB7Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UJKm1hcHBpbmcgPSBpb2NiLT5raV9maWxwLT5mX21hcHBpbmc7Ci0Jc3RydWN0IGlub2RlCQkqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OwotCXN0cnVjdCB4ZnNfaW5vZGUJKmlwID0gWEZTX0koaW5vZGUpOwotCXN0cnVjdCBpb3ZfaXRlcgkJZGF0YSA9ICp0bzsKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCA9IFhGU19JKGlvY2ItPmtpX2ZpbHAtPmZfbWFwcGluZy0+aG9zdCk7CiAJc2l6ZV90CQkJY291bnQgPSBpb3ZfaXRlcl9jb3VudCh0byk7CiAJc3NpemVfdAkJCXJldCA9IDA7CiAKQEAgLTM0NSwxMSArMzQzLDcgQEAKIAkJcmV0dXJuIDA7IC8qIHNraXAgYXRpbWUgKi8KIAogCXhmc19yd19pbG9jayhpcCwgWEZTX0lPTE9DS19TSEFSRUQpOwotCXJldCA9IGRheF9kb19pbyhpb2NiLCBpbm9kZSwgJmRhdGEsIHhmc19nZXRfYmxvY2tzX2RpcmVjdCwgTlVMTCwgMCk7Ci0JaWYgKHJldCA+IDApIHsKLQkJaW9jYi0+a2lfcG9zICs9IHJldDsKLQkJaW92X2l0ZXJfYWR2YW5jZSh0bywgcmV0KTsKLQl9CisJcmV0ID0gaW9tYXBfZGF4X3J3KGlvY2IsIHRvLCAmeGZzX2lvbWFwX29wcyk7CiAJeGZzX3J3X2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfU0hBUkVEKTsKIAogCWZpbGVfYWNjZXNzZWQoaW9jYi0+a2lfZmlscCk7CkBAIC03MTEsNTkgKzcwNSwzMiBAQAogCXN0cnVjdCBraW9jYgkJKmlvY2IsCiAJc3RydWN0IGlvdl9pdGVyCQkqZnJvbSkKIHsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZQkqbWFwcGluZyA9IGlvY2ItPmtpX2ZpbHAtPmZfbWFwcGluZzsKLQlzdHJ1Y3QgaW5vZGUJCSppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJc3RydWN0IGlub2RlCQkqaW5vZGUgPSBpb2NiLT5raV9maWxwLT5mX21hcHBpbmctPmhvc3Q7CiAJc3RydWN0IHhmc19pbm9kZQkqaXAgPSBYRlNfSShpbm9kZSk7Ci0Jc3RydWN0IHhmc19tb3VudAkqbXAgPSBpcC0+aV9tb3VudDsKLQlzc2l6ZV90CQkJcmV0ID0gMDsKLQlpbnQJCQl1bmFsaWduZWRfaW8gPSAwOwotCWludAkJCWlvbG9jazsKLQlzdHJ1Y3QgaW92X2l0ZXIJCWRhdGE7CisJaW50CQkJaW9sb2NrID0gWEZTX0lPTE9DS19FWENMOworCXNzaXplX3QJCQlyZXQsIGVycm9yID0gMDsKKwlzaXplX3QJCQljb3VudDsKKwlsb2ZmX3QJCQlwb3M7CiAKLQkvKiAidW5hbGlnbmVkIiBoZXJlIG1lYW5zIG5vdCBhbGlnbmVkIHRvIGEgZmlsZXN5c3RlbSBibG9jayAqLwotCWlmICgoaW9jYi0+a2lfcG9zICYgbXAtPm1fYmxvY2ttYXNrKSB8fAotCSAgICAoKGlvY2ItPmtpX3BvcyArIGlvdl9pdGVyX2NvdW50KGZyb20pKSAmIG1wLT5tX2Jsb2NrbWFzaykpIHsKLQkJdW5hbGlnbmVkX2lvID0gMTsKLQkJaW9sb2NrID0gWEZTX0lPTE9DS19FWENMOwotCX0gZWxzZSBpZiAobWFwcGluZy0+bnJwYWdlcykgewotCQlpb2xvY2sgPSBYRlNfSU9MT0NLX0VYQ0w7Ci0JfSBlbHNlIHsKLQkJaW9sb2NrID0gWEZTX0lPTE9DS19TSEFSRUQ7Ci0JfQogCXhmc19yd19pbG9jayhpcCwgaW9sb2NrKTsKLQogCXJldCA9IHhmc19maWxlX2Fpb193cml0ZV9jaGVja3MoaW9jYiwgZnJvbSwgJmlvbG9jayk7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKLQkvKgotCSAqIFllcywgZXZlbiBEQVggZmlsZXMgY2FuIGhhdmUgcGFnZSBjYWNoZSBhdHRhY2hlZCB0byB0aGVtOiAgQSB6ZXJvZWQKLQkgKiBwYWdlIGlzIGluc2VydGVkIGludG8gdGhlIHBhZ2VjYWNoZSB3aGVuIHdlIGhhdmUgdG8gc2VydmUgYSB3cml0ZQotCSAqIGZhdWx0IG9uIGEgaG9sZS4gIEl0IHNob3VsZCBuZXZlciBiZSBkaXJ0aWVkIGFuZCBjYW4gc2ltcGx5IGJlCi0JICogZHJvcHBlZCBmcm9tIHRoZSBwYWdlY2FjaGUgb25jZSB3ZSBnZXQgcmVhbCBkYXRhIGZvciB0aGUgcGFnZS4KLQkgKi8KLQlpZiAobWFwcGluZy0+bnJwYWdlcykgewotCQlyZXQgPSBpbnZhbGlkYXRlX2lub2RlX3BhZ2VzMihtYXBwaW5nKTsKLQkJV0FSTl9PTl9PTkNFKHJldCk7CisJcG9zID0gaW9jYi0+a2lfcG9zOworCWNvdW50ID0gaW92X2l0ZXJfY291bnQoZnJvbSk7CisKKwl0cmFjZV94ZnNfZmlsZV9kYXhfd3JpdGUoaXAsIGNvdW50LCBwb3MpOworCisJcmV0ID0gaW9tYXBfZGF4X3J3KGlvY2IsIGZyb20sICZ4ZnNfaW9tYXBfb3BzKTsKKwlpZiAocmV0ID4gMCAmJiBpb2NiLT5raV9wb3MgPiBpX3NpemVfcmVhZChpbm9kZSkpIHsKKwkJaV9zaXplX3dyaXRlKGlub2RlLCBpb2NiLT5raV9wb3MpOworCQllcnJvciA9IHhmc19zZXRmaWxlc2l6ZShpcCwgcG9zLCByZXQpOwogCX0KIAotCWlmIChpb2xvY2sgPT0gWEZTX0lPTE9DS19FWENMICYmICF1bmFsaWduZWRfaW8pIHsKLQkJeGZzX3J3X2lsb2NrX2RlbW90ZShpcCwgWEZTX0lPTE9DS19FWENMKTsKLQkJaW9sb2NrID0gWEZTX0lPTE9DS19TSEFSRUQ7Ci0JfQotCi0JdHJhY2VfeGZzX2ZpbGVfZGF4X3dyaXRlKGlwLCBpb3ZfaXRlcl9jb3VudChmcm9tKSwgaW9jYi0+a2lfcG9zKTsKLQotCWRhdGEgPSAqZnJvbTsKLQlyZXQgPSBkYXhfZG9faW8oaW9jYiwgaW5vZGUsICZkYXRhLCB4ZnNfZ2V0X2Jsb2Nrc19kaXJlY3QsCi0JCQl4ZnNfZW5kX2lvX2RpcmVjdF93cml0ZSwgMCk7Ci0JaWYgKHJldCA+IDApIHsKLQkJaW9jYi0+a2lfcG9zICs9IHJldDsKLQkJaW92X2l0ZXJfYWR2YW5jZShmcm9tLCByZXQpOwotCX0KIG91dDoKIAl4ZnNfcndfaXVubG9jayhpcCwgaW9sb2NrKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiBlcnJvciA/IGVycm9yIDogcmV0OwogfQogCiBTVEFUSUMgc3NpemVfdApAQCAtMTUwMiw3ICsxNDY5LDcgQEAKIAl4ZnNfaWxvY2soWEZTX0koaW5vZGUpLCBYRlNfTU1BUExPQ0tfU0hBUkVEKTsKIAogCWlmIChJU19EQVgoaW5vZGUpKSB7Ci0JCXJldCA9IGRheF9ta3dyaXRlKHZtYSwgdm1mLCB4ZnNfZ2V0X2Jsb2Nrc19kYXhfZmF1bHQpOworCQlyZXQgPSBpb21hcF9kYXhfZmF1bHQodm1hLCB2bWYsICZ4ZnNfaW9tYXBfb3BzKTsKIAl9IGVsc2UgewogCQlyZXQgPSBpb21hcF9wYWdlX21rd3JpdGUodm1hLCB2bWYsICZ4ZnNfaW9tYXBfb3BzKTsKIAkJcmV0ID0gYmxvY2tfcGFnZV9ta3dyaXRlX3JldHVybihyZXQpOwpAQCAtMTUzNiw3ICsxNTAzLDcgQEAKIAkJICogY2hhbmdlcyB0byB4ZnNfZ2V0X2Jsb2Nrc19kaXJlY3QoKSB0byBtYXAgdW53cml0dGVuIGV4dGVudAogCQkgKiBpb2VuZCBmb3IgY29udmVyc2lvbiBvbiByZWFkLW9ubHkgbWFwcGluZ3MuCiAJCSAqLwotCQlyZXQgPSBkYXhfZmF1bHQodm1hLCB2bWYsIHhmc19nZXRfYmxvY2tzX2RheF9mYXVsdCk7CisJCXJldCA9IGlvbWFwX2RheF9mYXVsdCh2bWEsIHZtZiwgJnhmc19pb21hcF9vcHMpOwogCX0gZWxzZQogCQlyZXQgPSBmaWxlbWFwX2ZhdWx0KHZtYSwgdm1mKTsKIAl4ZnNfaXVubG9jayhYRlNfSShpbm9kZSksIFhGU19NTUFQTE9DS19TSEFSRUQpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19maWxlc3RyZWFtLmMgYi9mcy94ZnMveGZzX2ZpbGVzdHJlYW0uYwppbmRleCA0YTMzYTMzLi4wNDNjYTM4MCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19maWxlc3RyZWFtLmMKKysrIGIvZnMveGZzL3hmc19maWxlc3RyZWFtLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlICJ4ZnNfbXJ1X2NhY2hlLmgiCiAjaW5jbHVkZSAieGZzX2ZpbGVzdHJlYW0uaCIKICNpbmNsdWRlICJ4ZnNfdHJhY2UuaCIKKyNpbmNsdWRlICJ4ZnNfYWdfcmVzdi5oIgogCiBzdHJ1Y3QgeGZzX2ZzdHJtX2l0ZW0gewogCXN0cnVjdCB4ZnNfbXJ1X2NhY2hlX2VsZW0JbXJ1OwpAQCAtMTk4LDcgKzE5OSw4IEBACiAJCX0KIAogCQlsb25nZXN0ID0geGZzX2FsbG9jX2xvbmdlc3RfZnJlZV9leHRlbnQobXAsIHBhZywKLQkJCQkJeGZzX2FsbG9jX21pbl9mcmVlbGlzdChtcCwgcGFnKSk7CisJCQkJeGZzX2FsbG9jX21pbl9mcmVlbGlzdChtcCwgcGFnKSwKKwkJCQl4ZnNfYWdfcmVzdl9uZWVkZWQocGFnLCBYRlNfQUdfUkVTVl9OT05FKSk7CiAJCWlmICgoKG1pbmxlbiAmJiBsb25nZXN0ID49IG1pbmxlbikgfHwKIAkJICAgICAoIW1pbmxlbiAmJiBwYWctPnBhZ2ZfZnJlZWJsa3MgPj0gbWluZnJlZSkpICYmCiAJCSAgICAoIXBhZy0+cGFnZl9tZXRhZGF0YSB8fCAhKGZsYWdzICYgWEZTX1BJQ0tfVVNFUkRBVEEpIHx8CkBAIC0zNjksNyArMzcxLDggQEAKIAlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGlwLT5pX21vdW50OwogCXhmc19leHRsZW5fdAkJbWlubGVuID0gYXAtPmxlbmd0aDsKIAl4ZnNfYWdudW1iZXJfdAkJc3RhcnRhZyA9IDA7Ci0JaW50CQkJZmxhZ3MsIGVyciA9IDA7CisJaW50CQkJZmxhZ3MgPSAwOworCWludAkJCWVyciA9IDA7CiAJc3RydWN0IHhmc19tcnVfY2FjaGVfZWxlbSAqbXJ1OwogCiAJKmFncCA9IE5VTExBR05VTUJFUjsKQEAgLTM4NSw4ICszODgsMTAgQEAKIAkJc3RhcnRhZyA9IChpdGVtLT5hZyArIDEpICUgbXAtPm1fc2Iuc2JfYWdjb3VudDsKIAl9CiAKLQlmbGFncyA9IChhcC0+dXNlcmRhdGEgPyBYRlNfUElDS19VU0VSREFUQSA6IDApIHwKLQkgICAgICAgIChhcC0+ZGZvcHMtPmRvcF9sb3cgPyBYRlNfUElDS19MT1dTUEFDRSA6IDApOworCWlmICh4ZnNfYWxsb2NfaXNfdXNlcmRhdGEoYXAtPmRhdGF0eXBlKSkKKwkJZmxhZ3MgfD0gWEZTX1BJQ0tfVVNFUkRBVEE7CisJaWYgKGFwLT5kZm9wcy0+ZG9wX2xvdykKKwkJZmxhZ3MgfD0gWEZTX1BJQ0tfTE9XU1BBQ0U7CiAKIAllcnIgPSB4ZnNfZmlsZXN0cmVhbV9waWNrX2FnKHBpcCwgc3RhcnRhZywgYWdwLCBmbGFncywgbWlubGVuKTsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19mc29wcy5jIGIvZnMveGZzL3hmc19mc29wcy5jCmluZGV4IDBmOTY4NDcuLjk0YWMwNmYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZnNvcHMuYworKysgYi9mcy94ZnMveGZzX2Zzb3BzLmMKQEAgLTI0OCw2ICsyNDgsNyBAQAogCQkJYWdmLT5hZ2Zfcm9vdHNbWEZTX0JUTlVNX1JNQVBpXSA9CiAJCQkJCQljcHVfdG9fYmUzMihYRlNfUk1BUF9CTE9DSyhtcCkpOwogCQkJYWdmLT5hZ2ZfbGV2ZWxzW1hGU19CVE5VTV9STUFQaV0gPSBjcHVfdG9fYmUzMigxKTsKKwkJCWFnZi0+YWdmX3JtYXBfYmxvY2tzID0gY3B1X3RvX2JlMzIoMSk7CiAJCX0KIAogCQlhZ2YtPmFnZl9mbGZpcnN0ID0gY3B1X3RvX2JlMzIoMSk7CkBAIC01NTIsNyArNTUzLDcgQEAKIAkJZXJyb3IgPSB4ZnNfZnJlZV9leHRlbnQodHAsCiAJCQkJWEZTX0FHQl9UT19GU0IobXAsIGFnbm8sCiAJCQkJCWJlMzJfdG9fY3B1KGFnZi0+YWdmX2xlbmd0aCkgLSBuZXcpLAotCQkJCW5ldywgJm9pbmZvKTsKKwkJCQluZXcsICZvaW5mbywgWEZTX0FHX1JFU1ZfTk9ORSk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gZXJyb3IwOwogCX0KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaWNhY2hlLmMgYi9mcy94ZnMveGZzX2ljYWNoZS5jCmluZGV4IGZiMzlhNjYuLjY1YjJlM2YgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaWNhY2hlLmMKKysrIGIvZnMveGZzL3hmc19pY2FjaGUuYwpAQCAtMTQxNCw2ICsxNDE0LDE2IEBACiAJc3RydWN0IHhmc19wZXJhZyAqcGFnOwogCWludCB0YWdnZWQ7CiAKKwkvKgorCSAqIERvbid0IGJvdGhlciBsb2NraW5nIHRoZSBBRyBhbmQgbG9va2luZyB1cCBpbiB0aGUgcmFkaXggdHJlZXMKKwkgKiBpZiB3ZSBhbHJlYWR5IGtub3cgdGhhdCB3ZSBoYXZlIHRoZSB0YWcgc2V0LgorCSAqLworCWlmIChpcC0+aV9mbGFncyAmIFhGU19JRU9GQkxPQ0tTKQorCQlyZXR1cm47CisJc3Bpbl9sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKKwlpcC0+aV9mbGFncyB8PSBYRlNfSUVPRkJMT0NLUzsKKwlzcGluX3VubG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7CisKIAlwYWcgPSB4ZnNfcGVyYWdfZ2V0KG1wLCBYRlNfSU5PX1RPX0FHTk8obXAsIGlwLT5pX2lubykpOwogCXNwaW5fbG9jaygmcGFnLT5wYWdfaWNpX2xvY2spOwogCXRyYWNlX3hmc19pbm9kZV9zZXRfZW9mYmxvY2tzX3RhZyhpcCk7CkBAIC0xNDQ5LDYgKzE0NTksMTAgQEAKIAlzdHJ1Y3QgeGZzX21vdW50ICptcCA9IGlwLT5pX21vdW50OwogCXN0cnVjdCB4ZnNfcGVyYWcgKnBhZzsKIAorCXNwaW5fbG9jaygmaXAtPmlfZmxhZ3NfbG9jayk7CisJaXAtPmlfZmxhZ3MgJj0gflhGU19JRU9GQkxPQ0tTOworCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKKwogCXBhZyA9IHhmc19wZXJhZ19nZXQobXAsIFhGU19JTk9fVE9fQUdOTyhtcCwgaXAtPmlfaW5vKSk7CiAJc3Bpbl9sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CiAJdHJhY2VfeGZzX2lub2RlX2NsZWFyX2VvZmJsb2Nrc190YWcoaXApOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pbm9kZS5oIGIvZnMveGZzL3hmc19pbm9kZS5oCmluZGV4IGUxYTQxMWUuLjhmMzBkMjUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW5vZGUuaAorKysgYi9mcy94ZnMveGZzX2lub2RlLmgKQEAgLTIxNiw2ICsyMTYsNyBAQAogI2RlZmluZSBfX1hGU19JUElOTkVEX0JJVAk4CSAvKiB3YWtldXAga2V5IGZvciB6ZXJvIHBpbiBjb3VudCAqLwogI2RlZmluZSBYRlNfSVBJTk5FRAkJKDEgPDwgX19YRlNfSVBJTk5FRF9CSVQpCiAjZGVmaW5lIFhGU19JRE9OVENBQ0hFCQkoMSA8PCA5KSAvKiBkb24ndCBjYWNoZSB0aGUgaW5vZGUgbG9uZyB0ZXJtICovCisjZGVmaW5lIFhGU19JRU9GQkxPQ0tTCQkoMSA8PCAxMCkvKiBoYXMgdGhlIHByZWFsbG9jYmxvY2tzIHRhZyBzZXQgKi8KIAogLyoKICAqIFBlci1saWZldGltZSBmbGFncyBuZWVkIHRvIGJlIHJlc2V0IHdoZW4gcmUtdXNpbmcgYSByZWNsYWltYWJsZSBpbm9kZSBkdXJpbmcKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW9tYXAuYyBiL2ZzL3hmcy94ZnNfaW9tYXAuYwppbmRleCAyMTE0ZDUzLi5jMDgyNTNlIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2lvbWFwLmMKKysrIGIvZnMveGZzL3hmc19pb21hcC5jCkBAIC0xLDUgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA2IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNiBDaHJpc3RvcGggSGVsbHdpZy4KICAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtNDIsMTcgKzQzLDQwIEBACiAKICNkZWZpbmUgWEZTX1dSSVRFSU9fQUxJR04obXAsb2ZmKQkoKChvZmYpID4+IG1wLT5tX3dyaXRlaW9fbG9nKSBcCiAJCQkJCQk8PCBtcC0+bV93cml0ZWlvX2xvZykKLSNkZWZpbmUgWEZTX1dSSVRFX0lNQVBTCQlYRlNfQk1BUF9NQVhfTk1BUAogCi1TVEFUSUMgaW50Ci14ZnNfaW9tYXBfZW9mX2FsaWduX2xhc3RfZnNiKAotCXhmc19tb3VudF90CSptcCwKLQl4ZnNfaW5vZGVfdAkqaXAsCi0JeGZzX2V4dGxlbl90CWV4dHNpemUsCi0JeGZzX2ZpbGVvZmZfdAkqbGFzdF9mc2IpCit2b2lkCit4ZnNfYm1idF90b19pb21hcCgKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCwKKwlzdHJ1Y3QgaW9tYXAJCSppb21hcCwKKwlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwkqaW1hcCkKIHsKLQl4ZnNfZXh0bGVuX3QJYWxpZ24gPSAwOwotCWludAkJZW9mLCBlcnJvcjsKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGlwLT5pX21vdW50OworCisJaWYgKGltYXAtPmJyX3N0YXJ0YmxvY2sgPT0gSE9MRVNUQVJUQkxPQ0spIHsKKwkJaW9tYXAtPmJsa25vID0gSU9NQVBfTlVMTF9CTE9DSzsKKwkJaW9tYXAtPnR5cGUgPSBJT01BUF9IT0xFOworCX0gZWxzZSBpZiAoaW1hcC0+YnJfc3RhcnRibG9jayA9PSBERUxBWVNUQVJUQkxPQ0spIHsKKwkJaW9tYXAtPmJsa25vID0gSU9NQVBfTlVMTF9CTE9DSzsKKwkJaW9tYXAtPnR5cGUgPSBJT01BUF9ERUxBTExPQzsKKwl9IGVsc2UgeworCQlpb21hcC0+Ymxrbm8gPSB4ZnNfZnNiX3RvX2RiKGlwLCBpbWFwLT5icl9zdGFydGJsb2NrKTsKKwkJaWYgKGltYXAtPmJyX3N0YXRlID09IFhGU19FWFRfVU5XUklUVEVOKQorCQkJaW9tYXAtPnR5cGUgPSBJT01BUF9VTldSSVRURU47CisJCWVsc2UKKwkJCWlvbWFwLT50eXBlID0gSU9NQVBfTUFQUEVEOworCX0KKwlpb21hcC0+b2Zmc2V0ID0gWEZTX0ZTQl9UT19CKG1wLCBpbWFwLT5icl9zdGFydG9mZik7CisJaW9tYXAtPmxlbmd0aCA9IFhGU19GU0JfVE9fQihtcCwgaW1hcC0+YnJfYmxvY2tjb3VudCk7CisJaW9tYXAtPmJkZXYgPSB4ZnNfZmluZF9iZGV2X2Zvcl9pbm9kZShWRlNfSShpcCkpOworfQorCitzdGF0aWMgeGZzX2V4dGxlbl90Cit4ZnNfZW9mX2FsaWdubWVudCgKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCwKKwl4ZnNfZXh0bGVuX3QJCWV4dHNpemUpCit7CisJc3RydWN0IHhmc19tb3VudAkqbXAgPSBpcC0+aV9tb3VudDsKKwl4ZnNfZXh0bGVuX3QJCWFsaWduID0gMDsKIAogCWlmICghWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGlwKSkgewogCQkvKgpAQCAtODMsOCArMTA3LDIxIEBACiAJCQlhbGlnbiA9IGV4dHNpemU7CiAJfQogCisJcmV0dXJuIGFsaWduOworfQorCitTVEFUSUMgaW50Cit4ZnNfaW9tYXBfZW9mX2FsaWduX2xhc3RfZnNiKAorCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAorCXhmc19leHRsZW5fdAkJZXh0c2l6ZSwKKwl4ZnNfZmlsZW9mZl90CQkqbGFzdF9mc2IpCit7CisJeGZzX2V4dGxlbl90CQlhbGlnbiA9IHhmc19lb2ZfYWxpZ25tZW50KGlwLCBleHRzaXplKTsKKwogCWlmIChhbGlnbikgewogCQl4ZnNfZmlsZW9mZl90CW5ld19sYXN0X2ZzYiA9IHJvdW5kdXBfNjQoKmxhc3RfZnNiLCBhbGlnbik7CisJCWludAkJZW9mLCBlcnJvcjsKKwogCQllcnJvciA9IHhmc19ibWFwX2VvZihpcCwgbmV3X2xhc3RfZnNiLCBYRlNfREFUQV9GT1JLLCAmZW9mKTsKIAkJaWYgKGVycm9yKQogCQkJcmV0dXJuIGVycm9yOwpAQCAtMTU0LDcgKzE5MSw3IEBACiAJCSAqLwogCQlBU1NFUlQoWEZTX0lGT1JLX1BUUihpcCwgWEZTX0RBVEFfRk9SSyktPmlmX2ZsYWdzICYKIAkJCQkJCQkJWEZTX0lGRVhURU5UUyk7Ci0JCWVycm9yID0geGZzX2lvbWFwX2VvZl9hbGlnbl9sYXN0X2ZzYihtcCwgaXAsIGV4dHN6LCAmbGFzdF9mc2IpOworCQllcnJvciA9IHhmc19pb21hcF9lb2ZfYWxpZ25fbGFzdF9mc2IoaXAsIGV4dHN6LCAmbGFzdF9mc2IpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dF91bmxvY2s7CiAJfSBlbHNlIHsKQEAgLTI3NCwxMzAgKzMxMSw2IEBACiAJZ290byBvdXRfdW5sb2NrOwogfQogCi0vKgotICogSWYgdGhlIGNhbGxlciBpcyBkb2luZyBhIHdyaXRlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsIHRoZW4gZXh0ZW5kIHRoZQotICogYWxsb2NhdGlvbiBvdXQgdG8gdGhlIGZpbGUgc3lzdGVtJ3Mgd3JpdGUgaW9zaXplLiAgV2UgY2xlYW4gdXAgYW55IGV4dHJhCi0gKiBzcGFjZSBsZWZ0IG92ZXIgd2hlbiB0aGUgZmlsZSBpcyBjbG9zZWQgaW4geGZzX2luYWN0aXZlKCkuCi0gKgotICogSWYgd2UgZmluZCB3ZSBhbHJlYWR5IGhhdmUgZGVsYWxsb2MgcHJlYWxsb2NhdGlvbiBiZXlvbmQgRU9GLCBkb24ndCBkbyBtb3JlCi0gKiBwcmVhbGxvY2F0aW9uIGFzIGl0IGl0IG5vdCBuZWVkZWQuCi0gKi8KLVNUQVRJQyBpbnQKLXhmc19pb21hcF9lb2Zfd2FudF9wcmVhbGxvY2F0ZSgKLQl4ZnNfbW91bnRfdAkqbXAsCi0JeGZzX2lub2RlX3QJKmlwLAotCXhmc19vZmZfdAlvZmZzZXQsCi0Jc2l6ZV90CQljb3VudCwKLQl4ZnNfYm1idF9pcmVjX3QgKmltYXAsCi0JaW50CQluaW1hcHMsCi0JaW50CQkqcHJlYWxsb2MpCi17Ci0JeGZzX2ZpbGVvZmZfdCAgIHN0YXJ0X2ZzYjsKLQl4ZnNfZmlsYmxrc190ICAgY291bnRfZnNiOwotCWludAkJbiwgZXJyb3IsIGltYXBzOwotCWludAkJZm91bmRfZGVsYWxsb2MgPSAwOwotCi0JKnByZWFsbG9jID0gMDsKLQlpZiAob2Zmc2V0ICsgY291bnQgPD0gWEZTX0lTSVpFKGlwKSkKLQkJcmV0dXJuIDA7Ci0KLQkvKgotCSAqIElmIHRoZSBmaWxlIGlzIHNtYWxsZXIgdGhhbiB0aGUgbWluaW11bSBwcmVhbGxvYyBhbmQgd2UgYXJlIHVzaW5nCi0JICogZHluYW1pYyBwcmVhbGxvY2F0aW9uLCBkb24ndCBkbyBhbnkgcHJlYWxsb2NhdGlvbiBhdCBhbGwgYXMgaXQgaXMKLQkgKiBsaWtlbHkgdGhpcyBpcyB0aGUgb25seSB3cml0ZSB0byB0aGUgZmlsZSB0aGF0IGlzIGdvaW5nIHRvIGJlIGRvbmUuCi0JICovCi0JaWYgKCEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfREZMVF9JT1NJWkUpICYmCi0JICAgIFhGU19JU0laRShpcCkgPCBYRlNfRlNCX1RPX0IobXAsIG1wLT5tX3dyaXRlaW9fYmxvY2tzKSkKLQkJcmV0dXJuIDA7Ci0KLQkvKgotCSAqIElmIHRoZXJlIGFyZSBhbnkgcmVhbCBibG9ja3MgcGFzdCBlb2YsIHRoZW4gZG9uJ3QKLQkgKiBkbyBhbnkgc3BlY3VsYXRpdmUgYWxsb2NhdGlvbi4KLQkgKi8KLQlzdGFydF9mc2IgPSBYRlNfQl9UT19GU0JUKG1wLCAoKHhmc191ZnNpemVfdCkob2Zmc2V0ICsgY291bnQgLSAxKSkpOwotCWNvdW50X2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgbXAtPm1fc3VwZXItPnNfbWF4Ynl0ZXMpOwotCXdoaWxlIChjb3VudF9mc2IgPiAwKSB7Ci0JCWltYXBzID0gbmltYXBzOwotCQllcnJvciA9IHhmc19ibWFwaV9yZWFkKGlwLCBzdGFydF9mc2IsIGNvdW50X2ZzYiwgaW1hcCwgJmltYXBzLAotCQkJCSAgICAgICAwKTsKLQkJaWYgKGVycm9yKQotCQkJcmV0dXJuIGVycm9yOwotCQlmb3IgKG4gPSAwOyBuIDwgaW1hcHM7IG4rKykgewotCQkJaWYgKChpbWFwW25dLmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0spICYmCi0JCQkgICAgKGltYXBbbl0uYnJfc3RhcnRibG9jayAhPSBERUxBWVNUQVJUQkxPQ0spKQotCQkJCXJldHVybiAwOwotCQkJc3RhcnRfZnNiICs9IGltYXBbbl0uYnJfYmxvY2tjb3VudDsKLQkJCWNvdW50X2ZzYiAtPSBpbWFwW25dLmJyX2Jsb2NrY291bnQ7Ci0KLQkJCWlmIChpbWFwW25dLmJyX3N0YXJ0YmxvY2sgPT0gREVMQVlTVEFSVEJMT0NLKQotCQkJCWZvdW5kX2RlbGFsbG9jID0gMTsKLQkJfQotCX0KLQlpZiAoIWZvdW5kX2RlbGFsbG9jKQotCQkqcHJlYWxsb2MgPSAxOwotCXJldHVybiAwOwotfQotCi0vKgotICogRGV0ZXJtaW5lIHRoZSBpbml0aWFsIHNpemUgb2YgdGhlIHByZWFsbG9jYXRpb24uIFdlIGFyZSBiZXlvbmQgdGhlIGN1cnJlbnQKLSAqIEVPRiBoZXJlLCBidXQgd2UgbmVlZCB0byB0YWtlIGludG8gYWNjb3VudCB3aGV0aGVyIHRoaXMgaXMgYSBzcGFyc2Ugd3JpdGUgb3IKLSAqIGFuIGV4dGVuZGluZyB3cml0ZSB3aGVuIGRldGVybWluaW5nIHRoZSBwcmVhbGxvY2F0aW9uIHNpemUuICBIZW5jZSB3ZSBuZWVkIHRvCi0gKiBsb29rIHVwIHRoZSBleHRlbnQgdGhhdCBlbmRzIGF0IHRoZSBjdXJyZW50IHdyaXRlIG9mZnNldCBhbmQgdXNlIHRoZSByZXN1bHQKLSAqIHRvIGRldGVybWluZSB0aGUgcHJlYWxsb2NhdGlvbiBzaXplLgotICoKLSAqIElmIHRoZSBleHRlbnQgaXMgYSBob2xlLCB0aGVuIHByZWFsbG9jYXRpb24gaXMgZXNzZW50aWFsbHkgZGlzYWJsZWQuCi0gKiBPdGhlcndpc2Ugd2UgdGFrZSB0aGUgc2l6ZSBvZiB0aGUgcHJlY2VlZGluZyBkYXRhIGV4dGVudCBhcyB0aGUgYmFzaXMgZm9yIHRoZQotICogcHJlYWxsb2NhdGlvbiBzaXplLiBJZiB0aGUgc2l6ZSBvZiB0aGUgZXh0ZW50IGlzIGdyZWF0ZXIgdGhhbiBoYWxmIHRoZQotICogbWF4aW11bSBleHRlbnQgbGVuZ3RoLCB0aGVuIHVzZSB0aGUgY3VycmVudCBvZmZzZXQgYXMgdGhlIGJhc2lzLiBUaGlzIGVuc3VyZXMKLSAqIHRoYXQgZm9yIGxhcmdlIGZpbGVzIHRoZSBwcmVhbGxvY2F0aW9uIHNpemUgYWx3YXlzIGV4dGVuZHMgdG8gTUFYRVhUTEVOCi0gKiByYXRoZXIgdGhhbiBmYWxsaW5nIHNob3J0IGR1ZSB0byB0aGluZ3MgbGlrZSBzdHJpcGUgdW5pdC93aWR0aCBhbGlnbm1lbnQgb2YKLSAqIHJlYWwgZXh0ZW50cy4KLSAqLwotU1RBVElDIHhmc19mc2Jsb2NrX3QKLXhmc19pb21hcF9lb2ZfcHJlYWxsb2NfaW5pdGlhbF9zaXplKAotCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAotCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAotCXhmc19vZmZfdAkJb2Zmc2V0LAotCXhmc19ibWJ0X2lyZWNfdAkJKmltYXAsCi0JaW50CQkJbmltYXBzKQotewotCXhmc19maWxlb2ZmX3QgICBzdGFydF9mc2I7Ci0JaW50CQlpbWFwcyA9IDE7Ci0JaW50CQllcnJvcjsKLQotCUFTU0VSVChuaW1hcHMgPj0gaW1hcHMpOwotCi0JLyogaWYgd2UgYXJlIHVzaW5nIGEgc3BlY2lmaWMgcHJlYWxsb2Mgc2l6ZSwgcmV0dXJuIG5vdyAqLwotCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9ERkxUX0lPU0laRSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBJZiB0aGUgZmlsZSBpcyBzbWFsbCwgdGhlbiB1c2UgdGhlIG1pbmltdW0gcHJlYWxsb2MgKi8KLQlpZiAoWEZTX0lTSVpFKGlwKSA8IFhGU19GU0JfVE9fQihtcCwgbXAtPm1fZGFsaWduKSkKLQkJcmV0dXJuIDA7Ci0KLQkvKgotCSAqIEFzIHdlIHdyaXRlIG11bHRpcGxlIHBhZ2VzLCB0aGUgb2Zmc2V0IHdpbGwgYWx3YXlzIGFsaWduIHRvIHRoZQotCSAqIHN0YXJ0IG9mIGEgcGFnZSBhbmQgaGVuY2UgcG9pbnQgdG8gYSBob2xlIGF0IEVPRi4gaS5lLiBpZiB0aGUgc2l6ZSBpcwotCSAqIDQwOTYgYnl0ZXMsIHdlIG9ubHkgaGF2ZSBvbmUgYmxvY2sgYXQgRlNCIDAsIGJ1dCBYRlNfQl9UT19GU0IoNDA5NikKLQkgKiB3aWxsIHJldHVybiBGU0IgMS4gSGVuY2UgaWYgdGhlcmUgYXJlIGJsb2NrcyBpbiB0aGUgZmlsZSwgd2Ugd2FudCB0bwotCSAqIHBvaW50IHRvIHRoZSBibG9jayBwcmlvciB0byB0aGUgRU9GIGJsb2NrIGFuZCBub3QgdGhlIGhvbGUgdGhhdCBtYXBzCi0JICogZGlyZWN0bHkgYXQgQG9mZnNldC4KLQkgKi8KLQlzdGFydF9mc2IgPSBYRlNfQl9UT19GU0IobXAsIG9mZnNldCk7Ci0JaWYgKHN0YXJ0X2ZzYikKLQkJc3RhcnRfZnNiLS07Ci0JZXJyb3IgPSB4ZnNfYm1hcGlfcmVhZChpcCwgc3RhcnRfZnNiLCAxLCBpbWFwLCAmaW1hcHMsIFhGU19CTUFQSV9FTlRJUkUpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIDA7Ci0KLQlBU1NFUlQoaW1hcHMgPT0gMSk7Ci0JaWYgKGltYXBbMF0uYnJfc3RhcnRibG9jayA9PSBIT0xFU1RBUlRCTE9DSykKLQkJcmV0dXJuIDA7Ci0JaWYgKGltYXBbMF0uYnJfYmxvY2tjb3VudCA8PSAoTUFYRVhUTEVOID4+IDEpKQotCQlyZXR1cm4gaW1hcFswXS5icl9ibG9ja2NvdW50IDw8IDE7Ci0JcmV0dXJuIFhGU19CX1RPX0ZTQihtcCwgb2Zmc2V0KTsKLX0KLQogU1RBVElDIGJvb2wKIHhmc19xdW90YV9uZWVkX3Rocm90dGxlKAogCXN0cnVjdCB4ZnNfaW5vZGUgKmlwLApAQCAtNDU5LDI3ICszNzIsNzYgQEAKIH0KIAogLyoKKyAqIElmIHdlIGFyZSBkb2luZyBhIHdyaXRlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIHRoZXJlIGFyZSBubyBhbGxvY2F0aW9ucworICogcGFzdCB0aGlzIG9uZSwgdGhlbiBleHRlbmQgdGhlIGFsbG9jYXRpb24gb3V0IHRvIHRoZSBmaWxlIHN5c3RlbSdzIHdyaXRlCisgKiBpb3NpemUuCisgKgogICogSWYgd2UgZG9uJ3QgaGF2ZSBhIHVzZXIgc3BlY2lmaWVkIHByZWFsbG9jYXRpb24gc2l6ZSwgZHluYW1pY2FsbHkgaW5jcmVhc2UKLSAqIHRoZSBwcmVhbGxvY2F0aW9uIHNpemUgYXMgdGhlIHNpemUgb2YgdGhlIGZpbGUgZ3Jvd3MuIENhcCB0aGUgbWF4aW11bSBzaXplCisgKiB0aGUgcHJlYWxsb2NhdGlvbiBzaXplIGFzIHRoZSBzaXplIG9mIHRoZSBmaWxlIGdyb3dzLiAgQ2FwIHRoZSBtYXhpbXVtIHNpemUKICAqIGF0IGEgc2luZ2xlIGV4dGVudCBvciBsZXNzIGlmIHRoZSBmaWxlc3lzdGVtIGlzIG5lYXIgZnVsbC4gVGhlIGNsb3NlciB0aGUKICAqIGZpbGVzeXN0ZW0gaXMgdG8gZnVsbCwgdGhlIHNtYWxsZXIgdGhlIG1heGltdW0gcHJlYWxvY2F0aW9uLgorICoKKyAqIEFzIGFuIGV4Y2VwdGlvbiB3ZSBkb24ndCBkbyBhbnkgcHJlYWxsb2NhdGlvbiBhdCBhbGwgaWYgdGhlIGZpbGUgaXMgc21hbGxlcgorICogdGhhbiB0aGUgbWluaW11bSBwcmVhbGxvY2F0aW9uIGFuZCB3ZSBhcmUgdXNpbmcgdGhlIGRlZmF1bHQgZHluYW1pYworICogcHJlYWxsb2NhdGlvbiBzY2hlbWUsIGFzIGl0IGlzIGxpa2VseSB0aGlzIGlzIHRoZSBvbmx5IHdyaXRlIHRvIHRoZSBmaWxlIHRoYXQKKyAqIGlzIGdvaW5nIHRvIGJlIGRvbmUuCisgKgorICogV2UgY2xlYW4gdXAgYW55IGV4dHJhIHNwYWNlIGxlZnQgb3ZlciB3aGVuIHRoZSBmaWxlIGlzIGNsb3NlZCBpbgorICogeGZzX2luYWN0aXZlKCkuCiAgKi8KIFNUQVRJQyB4ZnNfZnNibG9ja190CiB4ZnNfaW9tYXBfcHJlYWxsb2Nfc2l6ZSgKLQlzdHJ1Y3QgeGZzX21vdW50CSptcCwKIAlzdHJ1Y3QgeGZzX2lub2RlCSppcCwKLQl4ZnNfb2ZmX3QJCW9mZnNldCwKLQlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwkqaW1hcCwKLQlpbnQJCQluaW1hcHMpCisJbG9mZl90CQkJb2Zmc2V0LAorCWxvZmZfdAkJCWNvdW50LAorCXhmc19leHRudW1fdAkJaWR4LAorCXN0cnVjdCB4ZnNfYm1idF9pcmVjCSpwcmV2KQogewotCXhmc19mc2Jsb2NrX3QJCWFsbG9jX2Jsb2NrcyA9IDA7CisJc3RydWN0IHhmc19tb3VudAkqbXAgPSBpcC0+aV9tb3VudDsKKwl4ZnNfZmlsZW9mZl90CQlvZmZzZXRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgb2Zmc2V0KTsKIAlpbnQJCQlzaGlmdCA9IDA7CiAJaW50NjRfdAkJCWZyZWVzcDsKIAl4ZnNfZnNibG9ja190CQlxYmxvY2tzOwogCWludAkJCXFzaGlmdCA9IDA7CisJeGZzX2ZzYmxvY2tfdAkJYWxsb2NfYmxvY2tzID0gMDsKIAotCWFsbG9jX2Jsb2NrcyA9IHhmc19pb21hcF9lb2ZfcHJlYWxsb2NfaW5pdGlhbF9zaXplKG1wLCBpcCwgb2Zmc2V0LAotCQkJCQkJCSAgIGltYXAsIG5pbWFwcyk7CisJaWYgKG9mZnNldCArIGNvdW50IDw9IFhGU19JU0laRShpcCkpCisJCXJldHVybiAwOworCisJaWYgKCEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfREZMVF9JT1NJWkUpICYmCisJICAgIChYRlNfSVNJWkUoaXApIDwgWEZTX0ZTQl9UT19CKG1wLCBtcC0+bV93cml0ZWlvX2Jsb2NrcykpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogSWYgYW4gZXhwbGljaXQgYWxsb2NzaXplIGlzIHNldCwgdGhlIGZpbGUgaXMgc21hbGwsIG9yIHdlCisJICogYXJlIHdyaXRpbmcgYmVoaW5kIGEgaG9sZSwgdGhlbiB1c2UgdGhlIG1pbmltdW0gcHJlYWxsb2M6CisJICovCisJaWYgKChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9ERkxUX0lPU0laRSkgfHwKKwkgICAgWEZTX0lTSVpFKGlwKSA8IFhGU19GU0JfVE9fQihtcCwgbXAtPm1fZGFsaWduKSB8fAorCSAgICBpZHggPT0gMCB8fAorCSAgICBwcmV2LT5icl9zdGFydG9mZiArIHByZXYtPmJyX2Jsb2NrY291bnQgPCBvZmZzZXRfZnNiKQorCQlyZXR1cm4gbXAtPm1fd3JpdGVpb19ibG9ja3M7CisKKwkvKgorCSAqIERldGVybWluZSB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZSBwcmVhbGxvY2F0aW9uLiBXZSBhcmUgYmV5b25kIHRoZQorCSAqIGN1cnJlbnQgRU9GIGhlcmUsIGJ1dCB3ZSBuZWVkIHRvIHRha2UgaW50byBhY2NvdW50IHdoZXRoZXIgdGhpcyBpcworCSAqIGEgc3BhcnNlIHdyaXRlIG9yIGFuIGV4dGVuZGluZyB3cml0ZSB3aGVuIGRldGVybWluaW5nIHRoZQorCSAqIHByZWFsbG9jYXRpb24gc2l6ZS4gIEhlbmNlIHdlIG5lZWQgdG8gbG9vayB1cCB0aGUgZXh0ZW50IHRoYXQgZW5kcworCSAqIGF0IHRoZSBjdXJyZW50IHdyaXRlIG9mZnNldCBhbmQgdXNlIHRoZSByZXN1bHQgdG8gZGV0ZXJtaW5lIHRoZQorCSAqIHByZWFsbG9jYXRpb24gc2l6ZS4KKwkgKgorCSAqIElmIHRoZSBleHRlbnQgaXMgYSBob2xlLCB0aGVuIHByZWFsbG9jYXRpb24gaXMgZXNzZW50aWFsbHkgZGlzYWJsZWQuCisJICogT3RoZXJ3aXNlIHdlIHRha2UgdGhlIHNpemUgb2YgdGhlIHByZWNlZGluZyBkYXRhIGV4dGVudCBhcyB0aGUgYmFzaXMKKwkgKiBmb3IgdGhlIHByZWFsbG9jYXRpb24gc2l6ZS4gSWYgdGhlIHNpemUgb2YgdGhlIGV4dGVudCBpcyBncmVhdGVyIHRoYW4KKwkgKiBoYWxmIHRoZSBtYXhpbXVtIGV4dGVudCBsZW5ndGgsIHRoZW4gdXNlIHRoZSBjdXJyZW50IG9mZnNldCBhcyB0aGUKKwkgKiBiYXNpcy4gVGhpcyBlbnN1cmVzIHRoYXQgZm9yIGxhcmdlIGZpbGVzIHRoZSBwcmVhbGxvY2F0aW9uIHNpemUKKwkgKiBhbHdheXMgZXh0ZW5kcyB0byBNQVhFWFRMRU4gcmF0aGVyIHRoYW4gZmFsbGluZyBzaG9ydCBkdWUgdG8gdGhpbmdzCisJICogbGlrZSBzdHJpcGUgdW5pdC93aWR0aCBhbGlnbm1lbnQgb2YgcmVhbCBleHRlbnRzLgorCSAqLworCWlmIChwcmV2LT5icl9ibG9ja2NvdW50IDw9IChNQVhFWFRMRU4gPj4gMSkpCisJCWFsbG9jX2Jsb2NrcyA9IHByZXYtPmJyX2Jsb2NrY291bnQgPDwgMTsKKwllbHNlCisJCWFsbG9jX2Jsb2NrcyA9IFhGU19CX1RPX0ZTQihtcCwgb2Zmc2V0KTsKIAlpZiAoIWFsbG9jX2Jsb2NrcykKIAkJZ290byBjaGVja193cml0ZWlvOwogCXFibG9ja3MgPSBhbGxvY19ibG9ja3M7CkBAIC01NTAsMTIwICs1MTIsMTQ1IEBACiAJICovCiAJd2hpbGUgKGFsbG9jX2Jsb2NrcyAmJiBhbGxvY19ibG9ja3MgPj0gZnJlZXNwKQogCQlhbGxvY19ibG9ja3MgPj49IDQ7Ci0KIGNoZWNrX3dyaXRlaW86CiAJaWYgKGFsbG9jX2Jsb2NrcyA8IG1wLT5tX3dyaXRlaW9fYmxvY2tzKQogCQlhbGxvY19ibG9ja3MgPSBtcC0+bV93cml0ZWlvX2Jsb2NrczsKLQogCXRyYWNlX3hmc19pb21hcF9wcmVhbGxvY19zaXplKGlwLCBhbGxvY19ibG9ja3MsIHNoaWZ0LAogCQkJCSAgICAgIG1wLT5tX3dyaXRlaW9fYmxvY2tzKTsKLQogCXJldHVybiBhbGxvY19ibG9ja3M7CiB9CiAKLWludAoteGZzX2lvbWFwX3dyaXRlX2RlbGF5KAotCXhmc19pbm9kZV90CSppcCwKLQl4ZnNfb2ZmX3QJb2Zmc2V0LAotCXNpemVfdAkJY291bnQsCi0JeGZzX2JtYnRfaXJlY190ICpyZXRfaW1hcCkKK3N0YXRpYyBpbnQKK3hmc19maWxlX2lvbWFwX2JlZ2luX2RlbGF5KAorCXN0cnVjdCBpbm9kZQkJKmlub2RlLAorCWxvZmZfdAkJCW9mZnNldCwKKwlsb2ZmX3QJCQljb3VudCwKKwl1bnNpZ25lZAkJZmxhZ3MsCisJc3RydWN0IGlvbWFwCQkqaW9tYXApCiB7Ci0JeGZzX21vdW50X3QJKm1wID0gaXAtPmlfbW91bnQ7Ci0JeGZzX2ZpbGVvZmZfdAlvZmZzZXRfZnNiOwotCXhmc19maWxlb2ZmX3QJbGFzdF9mc2I7Ci0JeGZzX29mZl90CWFsaWduZWRfb2Zmc2V0OwotCXhmc19maWxlb2ZmX3QJaW9hbGlnbjsKLQl4ZnNfZXh0bGVuX3QJZXh0c3o7Ci0JaW50CQluaW1hcHM7Ci0JeGZzX2JtYnRfaXJlY190IGltYXBbWEZTX1dSSVRFX0lNQVBTXTsKLQlpbnQJCXByZWFsbG9jOwotCWludAkJZXJyb3I7CisJc3RydWN0IHhmc19pbm9kZQkqaXAgPSBYRlNfSShpbm9kZSk7CisJc3RydWN0IHhmc19tb3VudAkqbXAgPSBpcC0+aV9tb3VudDsKKwlzdHJ1Y3QgeGZzX2lmb3JrCSppZnAgPSBYRlNfSUZPUktfUFRSKGlwLCBYRlNfREFUQV9GT1JLKTsKKwl4ZnNfZmlsZW9mZl90CQlvZmZzZXRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgb2Zmc2V0KTsKKwl4ZnNfZmlsZW9mZl90CQltYXhieXRlc19mc2IgPQorCQlYRlNfQl9UT19GU0IobXAsIG1wLT5tX3N1cGVyLT5zX21heGJ5dGVzKTsKKwl4ZnNfZmlsZW9mZl90CQllbmRfZnNiLCBvcmlnX2VuZF9mc2I7CisJaW50CQkJZXJyb3IgPSAwLCBlb2YgPSAwOworCXN0cnVjdCB4ZnNfYm1idF9pcmVjCWdvdDsKKwlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwlwcmV2OworCXhmc19leHRudW1fdAkJaWR4OwogCi0JQVNTRVJUKHhmc19pc2lsb2NrZWQoaXAsIFhGU19JTE9DS19FWENMKSk7CisJQVNTRVJUKCFYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApKTsKKwlBU1NFUlQoIXhmc19nZXRfZXh0c3pfaGludChpcCkpOwogCi0JLyoKLQkgKiBNYWtlIHN1cmUgdGhhdCB0aGUgZHF1b3RzIGFyZSB0aGVyZS4gVGhpcyBkb2Vzbid0IGhvbGQKLQkgKiB0aGUgaWxvY2sgYWNyb3NzIGEgZGlzayByZWFkLgotCSAqLworCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCisJaWYgKHVubGlrZWx5KFhGU19URVNUX0VSUk9SKAorCSAgICAoWEZTX0lGT1JLX0ZPUk1BVChpcCwgWEZTX0RBVEFfRk9SSykgIT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUyAmJgorCSAgICAgWEZTX0lGT1JLX0ZPUk1BVChpcCwgWEZTX0RBVEFfRk9SSykgIT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUpLAorCSAgICAgbXAsIFhGU19FUlJUQUdfQk1BUElGT1JNQVQsIFhGU19SQU5ET01fQk1BUElGT1JNQVQpKSkgeworCQlYRlNfRVJST1JfUkVQT1JUKF9fZnVuY19fLCBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CisJCWVycm9yID0gLUVGU0NPUlJVUFRFRDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCVhGU19TVEFUU19JTkMobXAsIHhzX2Jsa19tYXB3KTsKKworCWlmICghKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKSkgeworCQllcnJvciA9IHhmc19pcmVhZF9leHRlbnRzKE5VTEwsIGlwLCBYRlNfREFUQV9GT1JLKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXRfdW5sb2NrOworCX0KKworCXhmc19ibWFwX3NlYXJjaF9leHRlbnRzKGlwLCBvZmZzZXRfZnNiLCBYRlNfREFUQV9GT1JLLCAmZW9mLCAmaWR4LAorCQkJJmdvdCwgJnByZXYpOworCWlmICghZW9mICYmIGdvdC5icl9zdGFydG9mZiA8PSBvZmZzZXRfZnNiKSB7CisJCXRyYWNlX3hmc19pb21hcF9mb3VuZChpcCwgb2Zmc2V0LCBjb3VudCwgMCwgJmdvdCk7CisJCWdvdG8gZG9uZTsKKwl9CisKIAllcnJvciA9IHhmc19xbV9kcWF0dGFjaF9sb2NrZWQoaXAsIDApOwogCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOworCQlnb3RvIG91dF91bmxvY2s7CiAKLQlleHRzeiA9IHhmc19nZXRfZXh0c3pfaGludChpcCk7Ci0Jb2Zmc2V0X2ZzYiA9IFhGU19CX1RPX0ZTQlQobXAsIG9mZnNldCk7CisJLyoKKwkgKiBXZSBjYXAgdGhlIG1heGltdW0gbGVuZ3RoIHdlIG1hcCBoZXJlIHRvIE1BWF9XUklURUJBQ0tfUEFHRVMgcGFnZXMKKwkgKiB0byBrZWVwIHRoZSBjaHVua3Mgb2Ygd29yayBkb25lIHdoZXJlIHNvbWV3aGF0IHN5bW1ldHJpYyB3aXRoIHRoZQorCSAqIHdvcmsgd3JpdGViYWNrIGRvZXMuIFRoaXMgaXMgYSBjb21wbGV0ZWx5IGFyYml0cmFyeSBudW1iZXIgcHVsbGVkCisJICogb3V0IG9mIHRoaW4gYWlyIGFzIGEgYmVzdCBndWVzcyBmb3IgaW5pdGlhbCB0ZXN0aW5nLgorCSAqCisJICogTm90ZSB0aGF0IHRoZSB2YWx1ZXMgbmVlZHMgdG8gYmUgbGVzcyB0aGFuIDMyLWJpdHMgd2lkZSB1bnRpbAorCSAqIHRoZSBsb3dlciBsZXZlbCBmdW5jdGlvbnMgYXJlIHVwZGF0ZWQuCisJICovCisJY291bnQgPSBtaW5fdChsb2ZmX3QsIGNvdW50LCAxMDI0ICogUEFHRV9TSVpFKTsKKwllbmRfZnNiID0gb3JpZ19lbmRfZnNiID0KKwkJbWluKFhGU19CX1RPX0ZTQihtcCwgb2Zmc2V0ICsgY291bnQpLCBtYXhieXRlc19mc2IpOwogCi0JZXJyb3IgPSB4ZnNfaW9tYXBfZW9mX3dhbnRfcHJlYWxsb2NhdGUobXAsIGlwLCBvZmZzZXQsIGNvdW50LAotCQkJCWltYXAsIFhGU19XUklURV9JTUFQUywgJnByZWFsbG9jKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKKwlpZiAoZW9mKSB7CisJCXhmc19mc2Jsb2NrX3QJcHJlYWxsb2NfYmxvY2tzOworCisJCXByZWFsbG9jX2Jsb2NrcyA9CisJCQl4ZnNfaW9tYXBfcHJlYWxsb2Nfc2l6ZShpcCwgb2Zmc2V0LCBjb3VudCwgaWR4LCAmcHJldik7CisJCWlmIChwcmVhbGxvY19ibG9ja3MpIHsKKwkJCXhmc19leHRsZW5fdAlhbGlnbjsKKwkJCXhmc19vZmZfdAllbmRfb2Zmc2V0OworCisJCQllbmRfb2Zmc2V0ID0gWEZTX1dSSVRFSU9fQUxJR04obXAsIG9mZnNldCArIGNvdW50IC0gMSk7CisJCQllbmRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgZW5kX29mZnNldCkgKworCQkJCXByZWFsbG9jX2Jsb2NrczsKKworCQkJYWxpZ24gPSB4ZnNfZW9mX2FsaWdubWVudChpcCwgMCk7CisJCQlpZiAoYWxpZ24pCisJCQkJZW5kX2ZzYiA9IHJvdW5kdXBfNjQoZW5kX2ZzYiwgYWxpZ24pOworCisJCQllbmRfZnNiID0gbWluKGVuZF9mc2IsIG1heGJ5dGVzX2ZzYik7CisJCQlBU1NFUlQoZW5kX2ZzYiA+IG9mZnNldF9mc2IpOworCQl9CisJfQogCiByZXRyeToKLQlpZiAocHJlYWxsb2MpIHsKLQkJeGZzX2ZzYmxvY2tfdAlhbGxvY19ibG9ja3M7Ci0KLQkJYWxsb2NfYmxvY2tzID0geGZzX2lvbWFwX3ByZWFsbG9jX3NpemUobXAsIGlwLCBvZmZzZXQsIGltYXAsCi0JCQkJCQkgICAgICAgWEZTX1dSSVRFX0lNQVBTKTsKLQotCQlhbGlnbmVkX29mZnNldCA9IFhGU19XUklURUlPX0FMSUdOKG1wLCAob2Zmc2V0ICsgY291bnQgLSAxKSk7Ci0JCWlvYWxpZ24gPSBYRlNfQl9UT19GU0JUKG1wLCBhbGlnbmVkX29mZnNldCk7Ci0JCWxhc3RfZnNiID0gaW9hbGlnbiArIGFsbG9jX2Jsb2NrczsKLQl9IGVsc2UgewotCQlsYXN0X2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgKCh4ZnNfdWZzaXplX3QpKG9mZnNldCArIGNvdW50KSkpOwotCX0KLQotCWlmIChwcmVhbGxvYyB8fCBleHRzeikgewotCQllcnJvciA9IHhmc19pb21hcF9lb2ZfYWxpZ25fbGFzdF9mc2IobXAsIGlwLCBleHRzeiwgJmxhc3RfZnNiKTsKLQkJaWYgKGVycm9yKQotCQkJcmV0dXJuIGVycm9yOwotCX0KLQotCS8qCi0JICogTWFrZSBzdXJlIHByZWFsbG9jYXRpb24gZG9lcyBub3QgY3JlYXRlIGV4dGVudHMgYmV5b25kIHRoZSByYW5nZSB3ZQotCSAqIGFjdHVhbGx5IHN1cHBvcnQgaW4gdGhpcyBmaWxlc3lzdGVtLgotCSAqLwotCWlmIChsYXN0X2ZzYiA+IFhGU19CX1RPX0ZTQihtcCwgbXAtPm1fc3VwZXItPnNfbWF4Ynl0ZXMpKQotCQlsYXN0X2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgbXAtPm1fc3VwZXItPnNfbWF4Ynl0ZXMpOwotCi0JQVNTRVJUKGxhc3RfZnNiID4gb2Zmc2V0X2ZzYik7Ci0KLQluaW1hcHMgPSBYRlNfV1JJVEVfSU1BUFM7Ci0JZXJyb3IgPSB4ZnNfYm1hcGlfZGVsYXkoaXAsIG9mZnNldF9mc2IsIGxhc3RfZnNiIC0gb2Zmc2V0X2ZzYiwKLQkJCQlpbWFwLCAmbmltYXBzLCBYRlNfQk1BUElfRU5USVJFKTsKKwllcnJvciA9IHhmc19ibWFwaV9yZXNlcnZlX2RlbGFsbG9jKGlwLCBvZmZzZXRfZnNiLAorCQkJZW5kX2ZzYiAtIG9mZnNldF9mc2IsICZnb3QsCisJCQkmcHJldiwgJmlkeCwgZW9mKTsKIAlzd2l0Y2ggKGVycm9yKSB7CiAJY2FzZSAwOgorCQlicmVhazsKIAljYXNlIC1FTk9TUEM6CiAJY2FzZSAtRURRVU9UOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JLyoKLQkgKiBJZiBibWFwaSByZXR1cm5lZCB1cyBub3RoaW5nLCB3ZSBnb3QgZWl0aGVyIEVOT1NQQyBvciBFRFFVT1QuIFJldHJ5Ci0JICogd2l0aG91dCBFT0YgcHJlYWxsb2NhdGlvbi4KLQkgKi8KLQlpZiAobmltYXBzID09IDApIHsKKwkJLyogcmV0cnkgd2l0aG91dCBhbnkgcHJlYWxsb2NhdGlvbiAqLwogCQl0cmFjZV94ZnNfZGVsYWxsb2NfZW5vc3BjKGlwLCBvZmZzZXQsIGNvdW50KTsKLQkJaWYgKHByZWFsbG9jKSB7Ci0JCQlwcmVhbGxvYyA9IDA7Ci0JCQllcnJvciA9IDA7CisJCWlmIChlbmRfZnNiICE9IG9yaWdfZW5kX2ZzYikgeworCQkJZW5kX2ZzYiA9IG9yaWdfZW5kX2ZzYjsKIAkJCWdvdG8gcmV0cnk7CiAJCX0KLQkJcmV0dXJuIGVycm9yID8gZXJyb3IgOiAtRU5PU1BDOworCQkvKkZBTExUSFJVKi8KKwlkZWZhdWx0OgorCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCi0JaWYgKCEoaW1hcFswXS5icl9zdGFydGJsb2NrIHx8IFhGU19JU19SRUFMVElNRV9JTk9ERShpcCkpKQotCQlyZXR1cm4geGZzX2FsZXJ0X2ZzYmxvY2tfemVybyhpcCwgJmltYXBbMF0pOwotCiAJLyoKIAkgKiBUYWcgdGhlIGlub2RlIGFzIHNwZWN1bGF0aXZlbHkgcHJlYWxsb2NhdGVkIHNvIHdlIGNhbiByZWNsYWltIHRoaXMKIAkgKiBzcGFjZSBvbiBkZW1hbmQsIGlmIG5lY2Vzc2FyeS4KIAkgKi8KLQlpZiAocHJlYWxsb2MpCisJaWYgKGVuZF9mc2IgIT0gb3JpZ19lbmRfZnNiKQogCQl4ZnNfaW5vZGVfc2V0X2VvZmJsb2Nrc190YWcoaXApOwogCi0JKnJldF9pbWFwID0gaW1hcFswXTsKLQlyZXR1cm4gMDsKKwl0cmFjZV94ZnNfaW9tYXBfYWxsb2MoaXAsIG9mZnNldCwgY291bnQsIDAsICZnb3QpOworZG9uZToKKwlpZiAoaXNudWxsc3RhcnRibG9jayhnb3QuYnJfc3RhcnRibG9jaykpCisJCWdvdC5icl9zdGFydGJsb2NrID0gREVMQVlTVEFSVEJMT0NLOworCisJaWYgKCFnb3QuYnJfc3RhcnRibG9jaykgeworCQllcnJvciA9IHhmc19hbGVydF9mc2Jsb2NrX3plcm8oaXAsICZnb3QpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJeGZzX2JtYnRfdG9faW9tYXAoaXAsIGlvbWFwLCAmZ290KTsKKworb3V0X3VubG9jazoKKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCXJldHVybiBlcnJvcjsKIH0KIAogLyoKQEAgLTcxNSwxMiArNzAyLDE2IEBACiAJCSAqIGlzIGluIHRoZSBkZWxheWVkIGFsbG9jYXRpb24gZXh0ZW50IG9uIHdoaWNoIHdlIHNpdAogCQkgKiBidXQgYmVmb3JlIG91ciBidWZmZXIgc3RhcnRzLgogCQkgKi8KLQogCQluaW1hcHMgPSAwOwogCQl3aGlsZSAobmltYXBzID09IDApIHsKIAkJCW5yZXMgPSBYRlNfRVhURU5UQUREX1NQQUNFX1JFUyhtcCwgWEZTX0RBVEFfRk9SSyk7Ci0KLQkJCWVycm9yID0geGZzX3RyYW5zX2FsbG9jKG1wLCAmTV9SRVMobXApLT50cl93cml0ZSwgbnJlcywKKwkJCS8qCisJCQkgKiBXZSBoYXZlIGFscmVhZHkgcmVzZXJ2ZWQgc3BhY2UgZm9yIHRoZSBleHRlbnQgYW5kIGFueQorCQkJICogaW5kaXJlY3QgYmxvY2tzIHdoZW4gY3JlYXRpbmcgdGhlIGRlbGFsbG9jIGV4dGVudCwKKwkJCSAqIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVzZXJ2ZSBzcGFjZSBpbiB0aGlzIHRyYW5zYWN0aW9uCisJCQkgKiBhZ2Fpbi4KKwkJCSAqLworCQkJZXJyb3IgPSB4ZnNfdHJhbnNfYWxsb2MobXAsICZNX1JFUyhtcCktPnRyX3dyaXRlLCAwLAogCQkJCQkwLCBYRlNfVFJBTlNfUkVTRVJWRSwgJnRwKTsKIAkJCWlmIChlcnJvcikKIAkJCQlyZXR1cm4gZXJyb3I7CkBAIC05NDMsMzcgKzkzNCwxMyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotdm9pZAoteGZzX2JtYnRfdG9faW9tYXAoCi0Jc3RydWN0IHhmc19pbm9kZQkqaXAsCi0Jc3RydWN0IGlvbWFwCQkqaW9tYXAsCi0Jc3RydWN0IHhmc19ibWJ0X2lyZWMJKmltYXApCi17Ci0Jc3RydWN0IHhmc19tb3VudAkqbXAgPSBpcC0+aV9tb3VudDsKLQotCWlmIChpbWFwLT5icl9zdGFydGJsb2NrID09IEhPTEVTVEFSVEJMT0NLKSB7Ci0JCWlvbWFwLT5ibGtubyA9IElPTUFQX05VTExfQkxPQ0s7Ci0JCWlvbWFwLT50eXBlID0gSU9NQVBfSE9MRTsKLQl9IGVsc2UgaWYgKGltYXAtPmJyX3N0YXJ0YmxvY2sgPT0gREVMQVlTVEFSVEJMT0NLKSB7Ci0JCWlvbWFwLT5ibGtubyA9IElPTUFQX05VTExfQkxPQ0s7Ci0JCWlvbWFwLT50eXBlID0gSU9NQVBfREVMQUxMT0M7Ci0JfSBlbHNlIHsKLQkJaW9tYXAtPmJsa25vID0geGZzX2ZzYl90b19kYihpcCwgaW1hcC0+YnJfc3RhcnRibG9jayk7Ci0JCWlmIChpbWFwLT5icl9zdGF0ZSA9PSBYRlNfRVhUX1VOV1JJVFRFTikKLQkJCWlvbWFwLT50eXBlID0gSU9NQVBfVU5XUklUVEVOOwotCQllbHNlCi0JCQlpb21hcC0+dHlwZSA9IElPTUFQX01BUFBFRDsKLQl9Ci0JaW9tYXAtPm9mZnNldCA9IFhGU19GU0JfVE9fQihtcCwgaW1hcC0+YnJfc3RhcnRvZmYpOwotCWlvbWFwLT5sZW5ndGggPSBYRlNfRlNCX1RPX0IobXAsIGltYXAtPmJyX2Jsb2NrY291bnQpOwotCWlvbWFwLT5iZGV2ID0geGZzX2ZpbmRfYmRldl9mb3JfaW5vZGUoVkZTX0koaXApKTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGltYXBfbmVlZHNfYWxsb2Moc3RydWN0IHhmc19ibWJ0X2lyZWMgKmltYXAsIGludCBuaW1hcHMpCitzdGF0aWMgaW5saW5lIGJvb2wgaW1hcF9uZWVkc19hbGxvYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQlzdHJ1Y3QgeGZzX2JtYnRfaXJlYyAqaW1hcCwgaW50IG5pbWFwcykKIHsKIAlyZXR1cm4gIW5pbWFwcyB8fAogCQlpbWFwLT5icl9zdGFydGJsb2NrID09IEhPTEVTVEFSVEJMT0NLIHx8Ci0JCWltYXAtPmJyX3N0YXJ0YmxvY2sgPT0gREVMQVlTVEFSVEJMT0NLOworCQlpbWFwLT5icl9zdGFydGJsb2NrID09IERFTEFZU1RBUlRCTE9DSyB8fAorCQkoSVNfREFYKGlub2RlKSAmJiBJU1VOV1JJVFRFTihpbWFwKSk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTk4OSwxMSArOTU2LDE4IEBACiAJc3RydWN0IHhmc19ibWJ0X2lyZWMJaW1hcDsKIAl4ZnNfZmlsZW9mZl90CQlvZmZzZXRfZnNiLCBlbmRfZnNiOwogCWludAkJCW5pbWFwcyA9IDEsIGVycm9yID0gMDsKKwl1bnNpZ25lZAkJbG9ja21vZGU7CiAKIAlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCiAJCXJldHVybiAtRUlPOwogCi0JeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJaWYgKChmbGFncyAmIElPTUFQX1dSSVRFKSAmJgorCSAgICAhSVNfREFYKGlub2RlKSAmJiAheGZzX2dldF9leHRzel9oaW50KGlwKSkgeworCQlyZXR1cm4geGZzX2ZpbGVfaW9tYXBfYmVnaW5fZGVsYXkoaW5vZGUsIG9mZnNldCwgbGVuZ3RoLCBmbGFncywKKwkJCQlpb21hcCk7CisJfQorCisJbG9ja21vZGUgPSB4ZnNfaWxvY2tfZGF0YV9tYXBfc2hhcmVkKGlwKTsKIAogCUFTU0VSVChvZmZzZXQgPD0gbXAtPm1fc3VwZXItPnNfbWF4Ynl0ZXMpOwogCWlmICgoeGZzX2ZzaXplX3Qpb2Zmc2V0ICsgbGVuZ3RoID4gbXAtPm1fc3VwZXItPnNfbWF4Ynl0ZXMpCkBAIC0xMDA0LDExICs5NzgsMTEgQEAKIAllcnJvciA9IHhmc19ibWFwaV9yZWFkKGlwLCBvZmZzZXRfZnNiLCBlbmRfZnNiIC0gb2Zmc2V0X2ZzYiwgJmltYXAsCiAJCQkgICAgICAgJm5pbWFwcywgWEZTX0JNQVBJX0VOVElSRSk7CiAJaWYgKGVycm9yKSB7Ci0JCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCXhmc19pdW5sb2NrKGlwLCBsb2NrbW9kZSk7CiAJCXJldHVybiBlcnJvcjsKIAl9CiAKLQlpZiAoKGZsYWdzICYgSU9NQVBfV1JJVEUpICYmIGltYXBfbmVlZHNfYWxsb2MoJmltYXAsIG5pbWFwcykpIHsKKwlpZiAoKGZsYWdzICYgSU9NQVBfV1JJVEUpICYmIGltYXBfbmVlZHNfYWxsb2MoaW5vZGUsICZpbWFwLCBuaW1hcHMpKSB7CiAJCS8qCiAJCSAqIFdlIGNhcCB0aGUgbWF4aW11bSBsZW5ndGggd2UgbWFwIGhlcmUgdG8gTUFYX1dSSVRFQkFDS19QQUdFUwogCQkgKiBwYWdlcyB0byBrZWVwIHRoZSBjaHVua3Mgb2Ygd29yayBkb25lIHdoZXJlIHNvbWV3aGF0IHN5bW1ldHJpYwpAQCAtMTAyMCwzNyArOTk0LDI3IEBACiAJCSAqIHRoZSBsb3dlciBsZXZlbCBmdW5jdGlvbnMgYXJlIHVwZGF0ZWQuCiAJCSAqLwogCQlsZW5ndGggPSBtaW5fdChsb2ZmX3QsIGxlbmd0aCwgMTAyNCAqIFBBR0VfU0laRSk7Ci0JCWlmICh4ZnNfZ2V0X2V4dHN6X2hpbnQoaXApKSB7Ci0JCQkvKgotCQkJICogeGZzX2lvbWFwX3dyaXRlX2RpcmVjdCgpIGV4cGVjdHMgdGhlIHNoYXJlZCBsb2NrLiBJdAotCQkJICogaXMgdW5sb2NrZWQgb24gcmV0dXJuLgotCQkJICovCi0JCQl4ZnNfaWxvY2tfZGVtb3RlKGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JCQllcnJvciA9IHhmc19pb21hcF93cml0ZV9kaXJlY3QoaXAsIG9mZnNldCwgbGVuZ3RoLCAmaW1hcCwKLQkJCQkJbmltYXBzKTsKLQkJfSBlbHNlIHsKLQkJCWVycm9yID0geGZzX2lvbWFwX3dyaXRlX2RlbGF5KGlwLCBvZmZzZXQsIGxlbmd0aCwgJmltYXApOwotCQkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKLQkJfQotCisJCS8qCisJCSAqIHhmc19pb21hcF93cml0ZV9kaXJlY3QoKSBleHBlY3RzIHRoZSBzaGFyZWQgbG9jay4gSXQKKwkJICogaXMgdW5sb2NrZWQgb24gcmV0dXJuLgorCQkgKi8KKwkJaWYgKGxvY2ttb2RlID09IFhGU19JTE9DS19FWENMKQorCQkJeGZzX2lsb2NrX2RlbW90ZShpcCwgbG9ja21vZGUpOworCQllcnJvciA9IHhmc19pb21hcF93cml0ZV9kaXJlY3QoaXAsIG9mZnNldCwgbGVuZ3RoLCAmaW1hcCwKKwkJCQluaW1hcHMpOwogCQlpZiAoZXJyb3IpCiAJCQlyZXR1cm4gZXJyb3I7CiAKKwkJaW9tYXAtPmZsYWdzID0gSU9NQVBfRl9ORVc7CiAJCXRyYWNlX3hmc19pb21hcF9hbGxvYyhpcCwgb2Zmc2V0LCBsZW5ndGgsIDAsICZpbWFwKTsKLQkJeGZzX2JtYnRfdG9faW9tYXAoaXAsIGlvbWFwLCAmaW1hcCk7Ci0JfSBlbHNlIGlmIChuaW1hcHMpIHsKLQkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKLQkJdHJhY2VfeGZzX2lvbWFwX2ZvdW5kKGlwLCBvZmZzZXQsIGxlbmd0aCwgMCwgJmltYXApOwotCQl4ZnNfYm1idF90b19pb21hcChpcCwgaW9tYXAsICZpbWFwKTsKIAl9IGVsc2UgewotCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQl0cmFjZV94ZnNfaW9tYXBfbm90X2ZvdW5kKGlwLCBvZmZzZXQsIGxlbmd0aCwgMCwgJmltYXApOwotCQlpb21hcC0+Ymxrbm8gPSBJT01BUF9OVUxMX0JMT0NLOwotCQlpb21hcC0+dHlwZSA9IElPTUFQX0hPTEU7Ci0JCWlvbWFwLT5vZmZzZXQgPSBvZmZzZXQ7Ci0JCWlvbWFwLT5sZW5ndGggPSBsZW5ndGg7CisJCUFTU0VSVChuaW1hcHMpOworCisJCXhmc19pdW5sb2NrKGlwLCBsb2NrbW9kZSk7CisJCXRyYWNlX3hmc19pb21hcF9mb3VuZChpcCwgb2Zmc2V0LCBsZW5ndGgsIDAsICZpbWFwKTsKIAl9CiAKKwl4ZnNfYm1idF90b19pb21hcChpcCwgaW9tYXAsICZpbWFwKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTExMiwzICsxMDc2LDQ4IEBACiAJLmlvbWFwX2JlZ2luCQk9IHhmc19maWxlX2lvbWFwX2JlZ2luLAogCS5pb21hcF9lbmQJCT0geGZzX2ZpbGVfaW9tYXBfZW5kLAogfTsKKworc3RhdGljIGludAoreGZzX3hhdHRyX2lvbWFwX2JlZ2luKAorCXN0cnVjdCBpbm9kZQkJKmlub2RlLAorCWxvZmZfdAkJCW9mZnNldCwKKwlsb2ZmX3QJCQlsZW5ndGgsCisJdW5zaWduZWQJCWZsYWdzLAorCXN0cnVjdCBpb21hcAkJKmlvbWFwKQoreworCXN0cnVjdCB4ZnNfaW5vZGUJKmlwID0gWEZTX0koaW5vZGUpOworCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gaXAtPmlfbW91bnQ7CisJeGZzX2ZpbGVvZmZfdAkJb2Zmc2V0X2ZzYiA9IFhGU19CX1RPX0ZTQlQobXAsIG9mZnNldCk7CisJeGZzX2ZpbGVvZmZfdAkJZW5kX2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgb2Zmc2V0ICsgbGVuZ3RoKTsKKwlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwlpbWFwOworCWludAkJCW5pbWFwcyA9IDEsIGVycm9yID0gMDsKKwl1bnNpZ25lZAkJbG9ja21vZGU7CisKKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCisJCXJldHVybiAtRUlPOworCisJbG9ja21vZGUgPSB4ZnNfaWxvY2tfZGF0YV9tYXBfc2hhcmVkKGlwKTsKKworCS8qIGlmIHRoZXJlIGFyZSBubyBhdHRyaWJ1dGUgZm9yayBvciBleHRlbnRzLCByZXR1cm4gRU5PRU5UICovCisJaWYgKFhGU19JRk9SS19RKGlwKSB8fCAhaXAtPmlfZC5kaV9hbmV4dGVudHMpIHsKKwkJZXJyb3IgPSAtRU5PRU5UOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJQVNTRVJUKGlwLT5pX2QuZGlfYWZvcm1hdCAhPSBYRlNfRElOT0RFX0ZNVF9MT0NBTCk7CisJZXJyb3IgPSB4ZnNfYm1hcGlfcmVhZChpcCwgb2Zmc2V0X2ZzYiwgZW5kX2ZzYiAtIG9mZnNldF9mc2IsICZpbWFwLAorCQkJICAgICAgICZuaW1hcHMsIFhGU19CTUFQSV9FTlRJUkUgfCBYRlNfQk1BUElfQVRUUkZPUkspOworb3V0X3VubG9jazoKKwl4ZnNfaXVubG9jayhpcCwgbG9ja21vZGUpOworCisJaWYgKCFlcnJvcikgeworCQlBU1NFUlQobmltYXBzKTsKKwkJeGZzX2JtYnRfdG9faW9tYXAoaXAsIGlvbWFwLCAmaW1hcCk7CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCitzdHJ1Y3QgaW9tYXBfb3BzIHhmc194YXR0cl9pb21hcF9vcHMgPSB7CisJLmlvbWFwX2JlZ2luCQk9IHhmc194YXR0cl9pb21hcF9iZWdpbiwKK307CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lvbWFwLmggYi9mcy94ZnMveGZzX2lvbWFwLmgKaW5kZXggZTA2NmQwNC4uNjQ5OGJlNCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pb21hcC5oCisrKyBiL2ZzL3hmcy94ZnNfaW9tYXAuaApAQCAtMjUsOCArMjUsNiBAQAogCiBpbnQgeGZzX2lvbWFwX3dyaXRlX2RpcmVjdChzdHJ1Y3QgeGZzX2lub2RlICosIHhmc19vZmZfdCwgc2l6ZV90LAogCQkJc3RydWN0IHhmc19ibWJ0X2lyZWMgKiwgaW50KTsKLWludCB4ZnNfaW9tYXBfd3JpdGVfZGVsYXkoc3RydWN0IHhmc19pbm9kZSAqLCB4ZnNfb2ZmX3QsIHNpemVfdCwKLQkJCXN0cnVjdCB4ZnNfYm1idF9pcmVjICopOwogaW50IHhmc19pb21hcF93cml0ZV9hbGxvY2F0ZShzdHJ1Y3QgeGZzX2lub2RlICosIHhmc19vZmZfdCwKIAkJCXN0cnVjdCB4ZnNfYm1idF9pcmVjICopOwogaW50IHhmc19pb21hcF93cml0ZV91bndyaXR0ZW4oc3RydWN0IHhmc19pbm9kZSAqLCB4ZnNfb2ZmX3QsIHhmc19vZmZfdCk7CkBAIC0zNSw1ICszMyw2IEBACiAJCXN0cnVjdCB4ZnNfYm1idF9pcmVjICopOwogCiBleHRlcm4gc3RydWN0IGlvbWFwX29wcyB4ZnNfaW9tYXBfb3BzOworZXh0ZXJuIHN0cnVjdCBpb21hcF9vcHMgeGZzX3hhdHRyX2lvbWFwX29wczsKIAogI2VuZGlmIC8qIF9fWEZTX0lPTUFQX0hfXyovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lvcHMuYyBiL2ZzL3hmcy94ZnNfaW9wcy5jCmluZGV4IGFiODIwZjguLmIyNGMzMTAgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW9wcy5jCisrKyBiL2ZzL3hmcy94ZnNfaW9wcy5jCkBAIC0xMDA5LDcgKzEwMDksMTQgQEAKIAlpbnQJCQllcnJvcjsKIAogCXhmc19pbG9jayhYRlNfSShpbm9kZSksIFhGU19JT0xPQ0tfU0hBUkVEKTsKLQllcnJvciA9IGlvbWFwX2ZpZW1hcChpbm9kZSwgZmllaW5mbywgc3RhcnQsIGxlbmd0aCwgJnhmc19pb21hcF9vcHMpOworCWlmIChmaWVpbmZvLT5maV9mbGFncyAmIEZJRU1BUF9GTEFHX1hBVFRSKSB7CisJCWZpZWluZm8tPmZpX2ZsYWdzICY9IH5GSUVNQVBfRkxBR19YQVRUUjsKKwkJZXJyb3IgPSBpb21hcF9maWVtYXAoaW5vZGUsIGZpZWluZm8sIHN0YXJ0LCBsZW5ndGgsCisJCQkJJnhmc194YXR0cl9pb21hcF9vcHMpOworCX0gZWxzZSB7CisJCWVycm9yID0gaW9tYXBfZmllbWFwKGlub2RlLCBmaWVpbmZvLCBzdGFydCwgbGVuZ3RoLAorCQkJCSZ4ZnNfaW9tYXBfb3BzKTsKKwl9CiAJeGZzX2l1bmxvY2soWEZTX0koaW5vZGUpLCBYRlNfSU9MT0NLX1NIQVJFRCk7CiAKIAlyZXR1cm4gZXJyb3I7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZ19wcml2LmggYi9mcy94ZnMveGZzX2xvZ19wcml2LmgKaW5kZXggNzY1ZjA4NC4uMmI2ZWVjNSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19sb2dfcHJpdi5oCisrKyBiL2ZzL3hmcy94ZnNfbG9nX3ByaXYuaApAQCAtNDEzLDcgKzQxMyw4IEBACiAJLyogbG9nIHJlY29yZCBjcmMgZXJyb3IgaW5qZWN0aW9uIGZhY3RvciAqLwogCXVpbnQzMl90CQlsX2JhZGNyY19mYWN0b3I7CiAjZW5kaWYKLQorCS8qIGxvZyByZWNvdmVyeSBsc24gdHJhY2tpbmcgKGZvciBidWZmZXIgc3VibWlzc2lvbiAqLworCXhmc19sc25fdAkJbF9yZWNvdmVyeV9sc247CiB9OwogCiAjZGVmaW5lIFhMT0dfQlVGX0NBTkNFTF9CVUNLRVQobG9nLCBibGtubykgXApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jIGIvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jCmluZGV4IGU4NjM4ZmQuLjg0NjQ4M2QgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuYworKysgYi9mcy94ZnMveGZzX2xvZ19yZWNvdmVyLmMKQEAgLTQ0LDYgKzQ0LDcgQEAKICNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKICNpbmNsdWRlICJ4ZnNfZGlyMi5oIgogI2luY2x1ZGUgInhmc19ybWFwX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfYnVmX2l0ZW0uaCIKIAogI2RlZmluZSBCTEtfQVZHKGJsazEsIGJsazIpCSgoYmxrMStibGsyKSA+PiAxKQogCkBAIC0zODEsNiArMzgyLDE1IEBACiAJCQkJCQlTSFVURE9XTl9NRVRBX0lPX0VSUk9SKTsKIAkJfQogCX0KKworCS8qCisJICogT24gdjUgc3VwZXJzLCBhIGJsaSBjb3VsZCBiZSBhdHRhY2hlZCB0byB1cGRhdGUgdGhlIG1ldGFkYXRhIExTTi4KKwkgKiBDbGVhbiBpdCB1cC4KKwkgKi8KKwlpZiAoYnAtPmJfZnNwcml2KQorCQl4ZnNfYnVmX2l0ZW1fcmVsc2UoYnApOworCUFTU0VSVChicC0+Yl9mc3ByaXYgPT0gTlVMTCk7CisKIAlicC0+Yl9pb2RvbmUgPSBOVUxMOwogCXhmc19idWZfaW9lbmQoYnApOwogfQpAQCAtMjM2MCwxMiArMjM3MCwxNCBAQAogeGxvZ19yZWNvdmVyX3ZhbGlkYXRlX2J1Zl90eXBlKAogCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAogCXN0cnVjdCB4ZnNfYnVmCQkqYnAsCi0JeGZzX2J1Zl9sb2dfZm9ybWF0X3QJKmJ1Zl9mKQorCXhmc19idWZfbG9nX2Zvcm1hdF90CSpidWZfZiwKKwl4ZnNfbHNuX3QJCWN1cnJlbnRfbHNuKQogewogCXN0cnVjdCB4ZnNfZGFfYmxraW5mbwkqaW5mbyA9IGJwLT5iX2FkZHI7CiAJX191aW50MzJfdAkJbWFnaWMzMjsKIAlfX3VpbnQxNl90CQltYWdpYzE2OwogCV9fdWludDE2X3QJCW1hZ2ljZGE7CisJY2hhcgkJCSp3YXJubXNnID0gTlVMTDsKIAogCS8qCiAJICogV2UgY2FuIG9ubHkgZG8gcG9zdCByZWNvdmVyeSB2YWxpZGF0aW9uIG9uIGl0ZW1zIG9uIENSQyBlbmFibGVkCkBAIC0yNDA0LDMxICsyNDE2LDI3IEBACiAJCQlicC0+Yl9vcHMgPSAmeGZzX3JtYXBidF9idWZfb3BzOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQl4ZnNfd2FybihtcCwgIkJhZCBidHJlZSBibG9jayBtYWdpYyEiKTsKLQkJCUFTU0VSVCgwKTsKKwkJCXdhcm5tc2cgPSAiQmFkIGJ0cmVlIGJsb2NrIG1hZ2ljISI7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKIAljYXNlIFhGU19CTEZUX0FHRl9CVUY6CiAJCWlmIChtYWdpYzMyICE9IFhGU19BR0ZfTUFHSUMpIHsKLQkJCXhmc193YXJuKG1wLCAiQmFkIEFHRiBibG9jayBtYWdpYyEiKTsKLQkJCUFTU0VSVCgwKTsKKwkJCXdhcm5tc2cgPSAiQmFkIEFHRiBibG9jayBtYWdpYyEiOwogCQkJYnJlYWs7CiAJCX0KIAkJYnAtPmJfb3BzID0gJnhmc19hZ2ZfYnVmX29wczsKIAkJYnJlYWs7CiAJY2FzZSBYRlNfQkxGVF9BR0ZMX0JVRjoKIAkJaWYgKG1hZ2ljMzIgIT0gWEZTX0FHRkxfTUFHSUMpIHsKLQkJCXhmc193YXJuKG1wLCAiQmFkIEFHRkwgYmxvY2sgbWFnaWMhIik7Ci0JCQlBU1NFUlQoMCk7CisJCQl3YXJubXNnID0gIkJhZCBBR0ZMIGJsb2NrIG1hZ2ljISI7CiAJCQlicmVhazsKIAkJfQogCQlicC0+Yl9vcHMgPSAmeGZzX2FnZmxfYnVmX29wczsKIAkJYnJlYWs7CiAJY2FzZSBYRlNfQkxGVF9BR0lfQlVGOgogCQlpZiAobWFnaWMzMiAhPSBYRlNfQUdJX01BR0lDKSB7Ci0JCQl4ZnNfd2FybihtcCwgIkJhZCBBR0kgYmxvY2sgbWFnaWMhIik7Ci0JCQlBU1NFUlQoMCk7CisJCQl3YXJubXNnID0gIkJhZCBBR0kgYmxvY2sgbWFnaWMhIjsKIAkJCWJyZWFrOwogCQl9CiAJCWJwLT5iX29wcyA9ICZ4ZnNfYWdpX2J1Zl9vcHM7CkBAIC0yNDM4LDggKzI0NDYsNyBAQAogCWNhc2UgWEZTX0JMRlRfR0RRVU9UX0JVRjoKICNpZmRlZiBDT05GSUdfWEZTX1FVT1RBCiAJCWlmIChtYWdpYzE2ICE9IFhGU19EUVVPVF9NQUdJQykgewotCQkJeGZzX3dhcm4obXAsICJCYWQgRFFVT1QgYmxvY2sgbWFnaWMhIik7Ci0JCQlBU1NFUlQoMCk7CisJCQl3YXJubXNnID0gIkJhZCBEUVVPVCBibG9jayBtYWdpYyEiOwogCQkJYnJlYWs7CiAJCX0KIAkJYnAtPmJfb3BzID0gJnhmc19kcXVvdF9idWZfb3BzOwpAQCAtMjQ1MSwxNiArMjQ1OCwxNCBAQAogCQlicmVhazsKIAljYXNlIFhGU19CTEZUX0RJTk9fQlVGOgogCQlpZiAobWFnaWMxNiAhPSBYRlNfRElOT0RFX01BR0lDKSB7Ci0JCQl4ZnNfd2FybihtcCwgIkJhZCBJTk9ERSBibG9jayBtYWdpYyEiKTsKLQkJCUFTU0VSVCgwKTsKKwkJCXdhcm5tc2cgPSAiQmFkIElOT0RFIGJsb2NrIG1hZ2ljISI7CiAJCQlicmVhazsKIAkJfQogCQlicC0+Yl9vcHMgPSAmeGZzX2lub2RlX2J1Zl9vcHM7CiAJCWJyZWFrOwogCWNhc2UgWEZTX0JMRlRfU1lNTElOS19CVUY6CiAJCWlmIChtYWdpYzMyICE9IFhGU19TWU1MSU5LX01BR0lDKSB7Ci0JCQl4ZnNfd2FybihtcCwgIkJhZCBzeW1saW5rIGJsb2NrIG1hZ2ljISIpOwotCQkJQVNTRVJUKDApOworCQkJd2Fybm1zZyA9ICJCYWQgc3ltbGluayBibG9jayBtYWdpYyEiOwogCQkJYnJlYWs7CiAJCX0KIAkJYnAtPmJfb3BzID0gJnhmc19zeW1saW5rX2J1Zl9vcHM7CkBAIC0yNDY4LDggKzI0NzMsNyBAQAogCWNhc2UgWEZTX0JMRlRfRElSX0JMT0NLX0JVRjoKIAkJaWYgKG1hZ2ljMzIgIT0gWEZTX0RJUjJfQkxPQ0tfTUFHSUMgJiYKIAkJICAgIG1hZ2ljMzIgIT0gWEZTX0RJUjNfQkxPQ0tfTUFHSUMpIHsKLQkJCXhmc193YXJuKG1wLCAiQmFkIGRpciBibG9jayBtYWdpYyEiKTsKLQkJCUFTU0VSVCgwKTsKKwkJCXdhcm5tc2cgPSAiQmFkIGRpciBibG9jayBtYWdpYyEiOwogCQkJYnJlYWs7CiAJCX0KIAkJYnAtPmJfb3BzID0gJnhmc19kaXIzX2Jsb2NrX2J1Zl9vcHM7CkBAIC0yNDc3LDggKzI0ODEsNyBAQAogCWNhc2UgWEZTX0JMRlRfRElSX0RBVEFfQlVGOgogCQlpZiAobWFnaWMzMiAhPSBYRlNfRElSMl9EQVRBX01BR0lDICYmCiAJCSAgICBtYWdpYzMyICE9IFhGU19ESVIzX0RBVEFfTUFHSUMpIHsKLQkJCXhmc193YXJuKG1wLCAiQmFkIGRpciBkYXRhIG1hZ2ljISIpOwotCQkJQVNTRVJUKDApOworCQkJd2Fybm1zZyA9ICJCYWQgZGlyIGRhdGEgbWFnaWMhIjsKIAkJCWJyZWFrOwogCQl9CiAJCWJwLT5iX29wcyA9ICZ4ZnNfZGlyM19kYXRhX2J1Zl9vcHM7CkBAIC0yNDg2LDggKzI0ODksNyBAQAogCWNhc2UgWEZTX0JMRlRfRElSX0ZSRUVfQlVGOgogCQlpZiAobWFnaWMzMiAhPSBYRlNfRElSMl9GUkVFX01BR0lDICYmCiAJCSAgICBtYWdpYzMyICE9IFhGU19ESVIzX0ZSRUVfTUFHSUMpIHsKLQkJCXhmc193YXJuKG1wLCAiQmFkIGRpcjMgZnJlZSBtYWdpYyEiKTsKLQkJCUFTU0VSVCgwKTsKKwkJCXdhcm5tc2cgPSAiQmFkIGRpcjMgZnJlZSBtYWdpYyEiOwogCQkJYnJlYWs7CiAJCX0KIAkJYnAtPmJfb3BzID0gJnhmc19kaXIzX2ZyZWVfYnVmX29wczsKQEAgLTI0OTUsOCArMjQ5Nyw3IEBACiAJY2FzZSBYRlNfQkxGVF9ESVJfTEVBRjFfQlVGOgogCQlpZiAobWFnaWNkYSAhPSBYRlNfRElSMl9MRUFGMV9NQUdJQyAmJgogCQkgICAgbWFnaWNkYSAhPSBYRlNfRElSM19MRUFGMV9NQUdJQykgewotCQkJeGZzX3dhcm4obXAsICJCYWQgZGlyIGxlYWYxIG1hZ2ljISIpOwotCQkJQVNTRVJUKDApOworCQkJd2Fybm1zZyA9ICJCYWQgZGlyIGxlYWYxIG1hZ2ljISI7CiAJCQlicmVhazsKIAkJfQogCQlicC0+Yl9vcHMgPSAmeGZzX2RpcjNfbGVhZjFfYnVmX29wczsKQEAgLTI1MDQsOCArMjUwNSw3IEBACiAJY2FzZSBYRlNfQkxGVF9ESVJfTEVBRk5fQlVGOgogCQlpZiAobWFnaWNkYSAhPSBYRlNfRElSMl9MRUFGTl9NQUdJQyAmJgogCQkgICAgbWFnaWNkYSAhPSBYRlNfRElSM19MRUFGTl9NQUdJQykgewotCQkJeGZzX3dhcm4obXAsICJCYWQgZGlyIGxlYWZuIG1hZ2ljISIpOwotCQkJQVNTRVJUKDApOworCQkJd2Fybm1zZyA9ICJCYWQgZGlyIGxlYWZuIG1hZ2ljISI7CiAJCQlicmVhazsKIAkJfQogCQlicC0+Yl9vcHMgPSAmeGZzX2RpcjNfbGVhZm5fYnVmX29wczsKQEAgLTI1MTMsOCArMjUxMyw3IEBACiAJY2FzZSBYRlNfQkxGVF9EQV9OT0RFX0JVRjoKIAkJaWYgKG1hZ2ljZGEgIT0gWEZTX0RBX05PREVfTUFHSUMgJiYKIAkJICAgIG1hZ2ljZGEgIT0gWEZTX0RBM19OT0RFX01BR0lDKSB7Ci0JCQl4ZnNfd2FybihtcCwgIkJhZCBkYSBub2RlIG1hZ2ljISIpOwotCQkJQVNTRVJUKDApOworCQkJd2Fybm1zZyA9ICJCYWQgZGEgbm9kZSBtYWdpYyEiOwogCQkJYnJlYWs7CiAJCX0KIAkJYnAtPmJfb3BzID0gJnhmc19kYTNfbm9kZV9idWZfb3BzOwpAQCAtMjUyMiwyNCArMjUyMSwyMSBAQAogCWNhc2UgWEZTX0JMRlRfQVRUUl9MRUFGX0JVRjoKIAkJaWYgKG1hZ2ljZGEgIT0gWEZTX0FUVFJfTEVBRl9NQUdJQyAmJgogCQkgICAgbWFnaWNkYSAhPSBYRlNfQVRUUjNfTEVBRl9NQUdJQykgewotCQkJeGZzX3dhcm4obXAsICJCYWQgYXR0ciBsZWFmIG1hZ2ljISIpOwotCQkJQVNTRVJUKDApOworCQkJd2Fybm1zZyA9ICJCYWQgYXR0ciBsZWFmIG1hZ2ljISI7CiAJCQlicmVhazsKIAkJfQogCQlicC0+Yl9vcHMgPSAmeGZzX2F0dHIzX2xlYWZfYnVmX29wczsKIAkJYnJlYWs7CiAJY2FzZSBYRlNfQkxGVF9BVFRSX1JNVF9CVUY6CiAJCWlmIChtYWdpYzMyICE9IFhGU19BVFRSM19STVRfTUFHSUMpIHsKLQkJCXhmc193YXJuKG1wLCAiQmFkIGF0dHIgcmVtb3RlIG1hZ2ljISIpOwotCQkJQVNTRVJUKDApOworCQkJd2Fybm1zZyA9ICJCYWQgYXR0ciByZW1vdGUgbWFnaWMhIjsKIAkJCWJyZWFrOwogCQl9CiAJCWJwLT5iX29wcyA9ICZ4ZnNfYXR0cjNfcm10X2J1Zl9vcHM7CiAJCWJyZWFrOwogCWNhc2UgWEZTX0JMRlRfU0JfQlVGOgogCQlpZiAobWFnaWMzMiAhPSBYRlNfU0JfTUFHSUMpIHsKLQkJCXhmc193YXJuKG1wLCAiQmFkIFNCIGJsb2NrIG1hZ2ljISIpOwotCQkJQVNTRVJUKDApOworCQkJd2Fybm1zZyA9ICJCYWQgU0IgYmxvY2sgbWFnaWMhIjsKIAkJCWJyZWFrOwogCQl9CiAJCWJwLT5iX29wcyA9ICZ4ZnNfc2JfYnVmX29wczsKQEAgLTI1NTYsNiArMjU1Miw0MCBAQAogCQkJIHhmc19ibGZ0X2Zyb21fZmxhZ3MoYnVmX2YpKTsKIAkJYnJlYWs7CiAJfQorCisJLyoKKwkgKiBOb3RoaW5nIGVsc2UgdG8gZG8gaW4gdGhlIGNhc2Ugb2YgYSBOVUxMIGN1cnJlbnQgTFNOIGFzIHRoaXMgbWVhbnMKKwkgKiB0aGUgYnVmZmVyIGlzIG1vcmUgcmVjZW50IHRoYW4gdGhlIGNoYW5nZSBpbiB0aGUgbG9nIGFuZCB3aWxsIGJlCisJICogc2tpcHBlZC4KKwkgKi8KKwlpZiAoY3VycmVudF9sc24gPT0gTlVMTENPTU1JVExTTikKKwkJcmV0dXJuOworCisJaWYgKHdhcm5tc2cpIHsKKwkJeGZzX3dhcm4obXAsIHdhcm5tc2cpOworCQlBU1NFUlQoMCk7CisJfQorCisJLyoKKwkgKiBXZSBtdXN0IHVwZGF0ZSB0aGUgbWV0YWRhdGEgTFNOIG9mIHRoZSBidWZmZXIgYXMgaXQgaXMgd3JpdHRlbiBvdXQgdG8KKwkgKiBlbnN1cmUgdGhhdCBvbGRlciB0cmFuc2FjdGlvbnMgbmV2ZXIgcmVwbGF5IG92ZXIgdGhpcyBvbmUgYW5kIGNvcnJ1cHQKKwkgKiB0aGUgYnVmZmVyLiBUaGlzIGNhbiBvY2N1ciBpZiBsb2cgcmVjb3ZlcnkgaXMgaW50ZXJydXB0ZWQgYXQgc29tZQorCSAqIHBvaW50IGFmdGVyIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGNvbXBsZXRlcywgYXQgd2hpY2ggcG9pbnQgYQorCSAqIHN1YnNlcXVlbnQgbW91bnQgc3RhcnRzIHJlY292ZXJ5IGZyb20gdGhlIGJlZ2lubmluZy4KKwkgKgorCSAqIFdyaXRlIHZlcmlmaWVycyB1cGRhdGUgdGhlIG1ldGFkYXRhIExTTiBmcm9tIGxvZyBpdGVtcyBhdHRhY2hlZCB0bworCSAqIHRoZSBidWZmZXIuIFRoZXJlZm9yZSwgaW5pdGlhbGl6ZSBhIGJsaSBwdXJlbHkgdG8gY2FycnkgdGhlIExTTiB0bworCSAqIHRoZSB2ZXJpZmllci4gV2UnbGwgY2xlYW4gaXQgdXAgaW4gb3VyIC0+aW9kb25lKCkgY2FsbGJhY2suCisJICovCisJaWYgKGJwLT5iX29wcykgeworCQlzdHJ1Y3QgeGZzX2J1Zl9sb2dfaXRlbQkqYmlwOworCisJCUFTU0VSVCghYnAtPmJfaW9kb25lIHx8IGJwLT5iX2lvZG9uZSA9PSB4bG9nX3JlY292ZXJfaW9kb25lKTsKKwkJYnAtPmJfaW9kb25lID0geGxvZ19yZWNvdmVyX2lvZG9uZTsKKwkJeGZzX2J1Zl9pdGVtX2luaXQoYnAsIG1wKTsKKwkJYmlwID0gYnAtPmJfZnNwcml2OworCQliaXAtPmJsaV9pdGVtLmxpX2xzbiA9IGN1cnJlbnRfbHNuOworCX0KIH0KIAogLyoKQEAgLTI1NjksNyArMjU5OSw4IEBACiAJc3RydWN0IHhmc19tb3VudAkqbXAsCiAJeGxvZ19yZWNvdmVyX2l0ZW1fdAkqaXRlbSwKIAlzdHJ1Y3QgeGZzX2J1ZgkJKmJwLAotCXhmc19idWZfbG9nX2Zvcm1hdF90CSpidWZfZikKKwl4ZnNfYnVmX2xvZ19mb3JtYXRfdAkqYnVmX2YsCisJeGZzX2xzbl90CQljdXJyZW50X2xzbikKIHsKIAlpbnQJCQlpOwogCWludAkJCWJpdDsKQEAgLTI2NDIsNyArMjY3Myw3IEBACiAJLyogU2hvdWxkbid0IGJlIGFueSBtb3JlIHJlZ2lvbnMgKi8KIAlBU1NFUlQoaSA9PSBpdGVtLT5yaV90b3RhbCk7CiAKLQl4bG9nX3JlY292ZXJfdmFsaWRhdGVfYnVmX3R5cGUobXAsIGJwLCBidWZfZik7CisJeGxvZ19yZWNvdmVyX3ZhbGlkYXRlX2J1Zl90eXBlKG1wLCBicCwgYnVmX2YsIGN1cnJlbnRfbHNuKTsKIH0KIAogLyoKQEAgLTI2ODUsNyArMjcxNiw3IEBACiAJaWYgKGxvZy0+bF9xdW90YW9mZnNfZmxhZyAmIHR5cGUpCiAJCXJldHVybiBmYWxzZTsKIAotCXhsb2dfcmVjb3Zlcl9kb19yZWdfYnVmZmVyKG1wLCBpdGVtLCBicCwgYnVmX2YpOworCXhsb2dfcmVjb3Zlcl9kb19yZWdfYnVmZmVyKG1wLCBpdGVtLCBicCwgYnVmX2YsIE5VTExDT01NSVRMU04pOwogCXJldHVybiB0cnVlOwogfQogCkBAIC0yNzczLDcgKzI4MDQsOCBAQAogCSAqLwogCWxzbiA9IHhsb2dfcmVjb3Zlcl9nZXRfYnVmX2xzbihtcCwgYnApOwogCWlmIChsc24gJiYgbHNuICE9IC0xICYmIFhGU19MU05fQ01QKGxzbiwgY3VycmVudF9sc24pID49IDApIHsKLQkJeGxvZ19yZWNvdmVyX3ZhbGlkYXRlX2J1Zl90eXBlKG1wLCBicCwgYnVmX2YpOworCQl0cmFjZV94ZnNfbG9nX3JlY292ZXJfYnVmX3NraXAobG9nLCBidWZfZik7CisJCXhsb2dfcmVjb3Zlcl92YWxpZGF0ZV9idWZfdHlwZShtcCwgYnAsIGJ1Zl9mLCBOVUxMQ09NTUlUTFNOKTsKIAkJZ290byBvdXRfcmVsZWFzZTsKIAl9CiAKQEAgLTI3ODksNyArMjgyMSw3IEBACiAJCWlmICghZGlydHkpCiAJCQlnb3RvIG91dF9yZWxlYXNlOwogCX0gZWxzZSB7Ci0JCXhsb2dfcmVjb3Zlcl9kb19yZWdfYnVmZmVyKG1wLCBpdGVtLCBicCwgYnVmX2YpOworCQl4bG9nX3JlY292ZXJfZG9fcmVnX2J1ZmZlcihtcCwgaXRlbSwgYnAsIGJ1Zl9mLCBjdXJyZW50X2xzbik7CiAJfQogCiAJLyoKQEAgLTM4NDYsMTQgKzM4NzgsMTMgQEAKIHhsb2dfcmVjb3Zlcl9jb21taXRfdHJhbnMoCiAJc3RydWN0IHhsb2cJCSpsb2csCiAJc3RydWN0IHhsb2dfcmVjb3ZlcgkqdHJhbnMsCi0JaW50CQkJcGFzcykKKwlpbnQJCQlwYXNzLAorCXN0cnVjdCBsaXN0X2hlYWQJKmJ1ZmZlcl9saXN0KQogewogCWludAkJCQllcnJvciA9IDA7Ci0JaW50CQkJCWVycm9yMjsKIAlpbnQJCQkJaXRlbXNfcXVldWVkID0gMDsKIAlzdHJ1Y3QgeGxvZ19yZWNvdmVyX2l0ZW0JKml0ZW07CiAJc3RydWN0IHhsb2dfcmVjb3Zlcl9pdGVtCSpuZXh0OwotCUxJU1RfSEVBRAkJCShidWZmZXJfbGlzdCk7CiAJTElTVF9IRUFECQkJKHJhX2xpc3QpOwogCUxJU1RfSEVBRAkJCShkb25lX2xpc3QpOwogCkBAIC0zODc2LDcgKzM5MDcsNyBAQAogCQkJaXRlbXNfcXVldWVkKys7CiAJCQlpZiAoaXRlbXNfcXVldWVkID49IFhMT0dfUkVDT1ZFUl9DT01NSVRfUVVFVUVfTUFYKSB7CiAJCQkJZXJyb3IgPSB4bG9nX3JlY292ZXJfaXRlbXNfcGFzczIobG9nLCB0cmFucywKLQkJCQkJCSZidWZmZXJfbGlzdCwgJnJhX2xpc3QpOworCQkJCQkJYnVmZmVyX2xpc3QsICZyYV9saXN0KTsKIAkJCQlsaXN0X3NwbGljZV90YWlsX2luaXQoJnJhX2xpc3QsICZkb25lX2xpc3QpOwogCQkJCWl0ZW1zX3F1ZXVlZCA9IDA7CiAJCQl9CkBAIC0zODk0LDE1ICszOTI1LDE0IEBACiAJaWYgKCFsaXN0X2VtcHR5KCZyYV9saXN0KSkgewogCQlpZiAoIWVycm9yKQogCQkJZXJyb3IgPSB4bG9nX3JlY292ZXJfaXRlbXNfcGFzczIobG9nLCB0cmFucywKLQkJCQkJJmJ1ZmZlcl9saXN0LCAmcmFfbGlzdCk7CisJCQkJCWJ1ZmZlcl9saXN0LCAmcmFfbGlzdCk7CiAJCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmcmFfbGlzdCwgJmRvbmVfbGlzdCk7CiAJfQogCiAJaWYgKCFsaXN0X2VtcHR5KCZkb25lX2xpc3QpKQogCQlsaXN0X3NwbGljZV9pbml0KCZkb25lX2xpc3QsICZ0cmFucy0+cl9pdGVtcSk7CiAKLQllcnJvcjIgPSB4ZnNfYnVmX2RlbHdyaV9zdWJtaXQoJmJ1ZmZlcl9saXN0KTsKLQlyZXR1cm4gZXJyb3IgPyBlcnJvciA6IGVycm9yMjsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIFNUQVRJQyB2b2lkCkBAIC00MDg1LDcgKzQxMTUsOCBAQAogCWNoYXIJCQkqZHAsCiAJdW5zaWduZWQgaW50CQlsZW4sCiAJdW5zaWduZWQgaW50CQlmbGFncywKLQlpbnQJCQlwYXNzKQorCWludAkJCXBhc3MsCisJc3RydWN0IGxpc3RfaGVhZAkqYnVmZmVyX2xpc3QpCiB7CiAJaW50CQkJZXJyb3IgPSAwOwogCWJvb2wJCQlmcmVlaXQgPSBmYWxzZTsKQEAgLTQxMDksNyArNDE0MCw4IEBACiAJCWVycm9yID0geGxvZ19yZWNvdmVyX2FkZF90b19jb250X3RyYW5zKGxvZywgdHJhbnMsIGRwLCBsZW4pOwogCQlicmVhazsKIAljYXNlIFhMT0dfQ09NTUlUX1RSQU5TOgotCQllcnJvciA9IHhsb2dfcmVjb3Zlcl9jb21taXRfdHJhbnMobG9nLCB0cmFucywgcGFzcyk7CisJCWVycm9yID0geGxvZ19yZWNvdmVyX2NvbW1pdF90cmFucyhsb2csIHRyYW5zLCBwYXNzLAorCQkJCQkJICBidWZmZXJfbGlzdCk7CiAJCS8qIHN1Y2Nlc3Mgb3IgZmFpbCwgd2UgYXJlIG5vdyBkb25lIHdpdGggdGhpcyB0cmFuc2FjdGlvbi4gKi8KIAkJZnJlZWl0ID0gdHJ1ZTsKIAkJYnJlYWs7CkBAIC00MTkxLDEwICs0MjIzLDEyIEBACiAJc3RydWN0IHhsb2dfb3BfaGVhZGVyCSpvaGVhZCwKIAljaGFyCQkJKmRwLAogCWNoYXIJCQkqZW5kLAotCWludAkJCXBhc3MpCisJaW50CQkJcGFzcywKKwlzdHJ1Y3QgbGlzdF9oZWFkCSpidWZmZXJfbGlzdCkKIHsKIAlzdHJ1Y3QgeGxvZ19yZWNvdmVyCSp0cmFuczsKIAl1bnNpZ25lZCBpbnQJCWxlbjsKKwlpbnQJCQllcnJvcjsKIAogCS8qIERvIHdlIHVuZGVyc3RhbmQgd2hvIHdyb3RlIHRoaXMgb3A/ICovCiAJaWYgKG9oZWFkLT5vaF9jbGllbnRpZCAhPSBYRlNfVFJBTlNBQ1RJT04gJiYKQEAgLTQyMjEsOCArNDI1NSwzOSBAQAogCQlyZXR1cm4gMDsKIAl9CiAKKwkvKgorCSAqIFRoZSByZWNvdmVyZWQgYnVmZmVyIHF1ZXVlIGlzIGRyYWluZWQgb25seSBvbmNlIHdlIGtub3cgdGhhdCBhbGwKKwkgKiByZWNvdmVyeSBpdGVtcyBmb3IgdGhlIGN1cnJlbnQgTFNOIGhhdmUgYmVlbiBwcm9jZXNzZWQuIFRoaXMgaXMKKwkgKiByZXF1aXJlZCBiZWNhdXNlOgorCSAqCisJICogLSBCdWZmZXIgd3JpdGUgc3VibWlzc2lvbiB1cGRhdGVzIHRoZSBtZXRhZGF0YSBMU04gb2YgdGhlIGJ1ZmZlci4KKwkgKiAtIExvZyByZWNvdmVyeSBza2lwcyBpdGVtcyB3aXRoIGEgbWV0YWRhdGEgTFNOID49IHRoZSBjdXJyZW50IExTTiBvZgorCSAqICAgdGhlIHJlY292ZXJ5IGl0ZW0uCisJICogLSBTZXBhcmF0ZSByZWNvdmVyeSBpdGVtcyBhZ2FpbnN0IHRoZSBzYW1lIG1ldGFkYXRhIGJ1ZmZlciBjYW4gc2hhcmUKKwkgKiAgIGEgY3VycmVudCBMU04uIEkuZS4sIGNvbnNpZGVyIHRoYXQgdGhlIExTTiBvZiBhIHJlY292ZXJ5IGl0ZW0gaXMKKwkgKiAgIGRlZmluZWQgYXMgdGhlIHN0YXJ0aW5nIExTTiBvZiB0aGUgZmlyc3QgcmVjb3JkIGluIHdoaWNoIGl0cworCSAqICAgdHJhbnNhY3Rpb24gYXBwZWFycywgdGhhdCBhIHJlY29yZCBjYW4gaG9sZCBtdWx0aXBsZSB0cmFuc2FjdGlvbnMsCisJICogICBhbmQvb3IgdGhhdCBhIHRyYW5zYWN0aW9uIGNhbiBzcGFuIG11bHRpcGxlIHJlY29yZHMuCisJICoKKwkgKiBJbiBvdGhlciB3b3Jkcywgd2UgYXJlIGFsbG93ZWQgdG8gc3VibWl0IGEgYnVmZmVyIGZyb20gbG9nIHJlY292ZXJ5CisJICogb25jZSBwZXIgY3VycmVudCBMU04uIE90aGVyd2lzZSwgd2UgbWF5IGluY29ycmVjdGx5IHNraXAgcmVjb3ZlcnkKKwkgKiBpdGVtcyBhbmQgY2F1c2UgY29ycnVwdGlvbi4KKwkgKgorCSAqIFdlIGRvbid0IGtub3cgdXAgZnJvbnQgd2hldGhlciBidWZmZXJzIGFyZSB1cGRhdGVkIG11bHRpcGxlIHRpbWVzIHBlcgorCSAqIExTTi4gVGhlcmVmb3JlLCB0cmFjayB0aGUgY3VycmVudCBMU04gb2YgZWFjaCBjb21taXQgbG9nIHJlY29yZCBhcyBpdAorCSAqIGlzIHByb2Nlc3NlZCBhbmQgZHJhaW4gdGhlIHF1ZXVlIHdoZW4gaXQgY2hhbmdlcy4gVXNlIGNvbW1pdCByZWNvcmRzCisJICogYmVjYXVzZSB0aGV5IGFyZSBvcmRlcmVkIGNvcnJlY3RseSBieSB0aGUgbG9nZ2luZyBjb2RlLgorCSAqLworCWlmIChsb2ctPmxfcmVjb3ZlcnlfbHNuICE9IHRyYW5zLT5yX2xzbiAmJgorCSAgICBvaGVhZC0+b2hfZmxhZ3MgJiBYTE9HX0NPTU1JVF9UUkFOUykgeworCQllcnJvciA9IHhmc19idWZfZGVsd3JpX3N1Ym1pdChidWZmZXJfbGlzdCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwkJbG9nLT5sX3JlY292ZXJ5X2xzbiA9IHRyYW5zLT5yX2xzbjsKKwl9CisKIAlyZXR1cm4geGxvZ19yZWNvdmVyeV9wcm9jZXNzX3RyYW5zKGxvZywgdHJhbnMsIGRwLCBsZW4sCi0JCQkJCSAgIG9oZWFkLT5vaF9mbGFncywgcGFzcyk7CisJCQkJCSAgIG9oZWFkLT5vaF9mbGFncywgcGFzcywgYnVmZmVyX2xpc3QpOwogfQogCiAvKgpAQCAtNDI0MCw3ICs0MzA1LDggQEAKIAlzdHJ1Y3QgaGxpc3RfaGVhZAlyaGFzaFtdLAogCXN0cnVjdCB4bG9nX3JlY19oZWFkZXIJKnJoZWFkLAogCWNoYXIJCQkqZHAsCi0JaW50CQkJcGFzcykKKwlpbnQJCQlwYXNzLAorCXN0cnVjdCBsaXN0X2hlYWQJKmJ1ZmZlcl9saXN0KQogewogCXN0cnVjdCB4bG9nX29wX2hlYWRlcgkqb2hlYWQ7CiAJY2hhcgkJCSplbmQ7CkBAIC00MjU0LDYgKzQzMjAsNyBAQAogCWlmICh4bG9nX2hlYWRlcl9jaGVja19yZWNvdmVyKGxvZy0+bF9tcCwgcmhlYWQpKQogCQlyZXR1cm4gLUVJTzsKIAorCXRyYWNlX3hmc19sb2dfcmVjb3Zlcl9yZWNvcmQobG9nLCByaGVhZCwgcGFzcyk7CiAJd2hpbGUgKChkcCA8IGVuZCkgJiYgbnVtX2xvZ29wcykgewogCiAJCW9oZWFkID0gKHN0cnVjdCB4bG9nX29wX2hlYWRlciAqKWRwOwpAQCAtNDI2Miw3ICs0MzI5LDcgQEAKIAogCQkvKiBlcnJvcnMgd2lsbCBhYm9ydCByZWNvdmVyeSAqLwogCQllcnJvciA9IHhsb2dfcmVjb3Zlcl9wcm9jZXNzX29waGRyKGxvZywgcmhhc2gsIHJoZWFkLCBvaGVhZCwKLQkJCQkJCSAgICBkcCwgZW5kLCBwYXNzKTsKKwkJCQkJCSAgIGRwLCBlbmQsIHBhc3MsIGJ1ZmZlcl9saXN0KTsKIAkJaWYgKGVycm9yKQogCQkJcmV0dXJuIGVycm9yOwogCkBAIC00Njg1LDcgKzQ3NTIsOCBAQAogCXN0cnVjdCBobGlzdF9oZWFkCXJoYXNoW10sCiAJc3RydWN0IHhsb2dfcmVjX2hlYWRlcgkqcmhlYWQsCiAJY2hhcgkJCSpkcCwKLQlpbnQJCQlwYXNzKQorCWludAkJCXBhc3MsCisJc3RydWN0IGxpc3RfaGVhZAkqYnVmZmVyX2xpc3QpCiB7CiAJaW50CQkJZXJyb3I7CiAJX19sZTMyCQkJY3JjOwpAQCAtNDczMiw3ICs0ODAwLDggQEAKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAotCXJldHVybiB4bG9nX3JlY292ZXJfcHJvY2Vzc19kYXRhKGxvZywgcmhhc2gsIHJoZWFkLCBkcCwgcGFzcyk7CisJcmV0dXJuIHhsb2dfcmVjb3Zlcl9wcm9jZXNzX2RhdGEobG9nLCByaGFzaCwgcmhlYWQsIGRwLCBwYXNzLAorCQkJCQkgYnVmZmVyX2xpc3QpOwogfQogCiBTVEFUSUMgaW50CkBAIC00NzkzLDkgKzQ4NjIsMTEgQEAKIAljaGFyCQkJKm9mZnNldDsKIAl4ZnNfYnVmX3QJCSpoYnAsICpkYnA7CiAJaW50CQkJZXJyb3IgPSAwLCBoX3NpemUsIGhfbGVuOworCWludAkJCWVycm9yMiA9IDA7CiAJaW50CQkJYmJsa3MsIHNwbGl0X2JibGtzOwogCWludAkJCWhibGtzLCBzcGxpdF9oYmxrcywgd3JhcHBlZF9oYmxrczsKIAlzdHJ1Y3QgaGxpc3RfaGVhZAlyaGFzaFtYTE9HX1JIQVNIX1NJWkVdOworCUxJU1RfSEVBRAkJKGJ1ZmZlcl9saXN0KTsKIAogCUFTU0VSVChoZWFkX2JsayAhPSB0YWlsX2Jsayk7CiAJcmhlYWRfYmxrID0gMDsKQEAgLTQ5ODEsNyArNTA1Miw3IEBACiAJCQl9CiAKIAkJCWVycm9yID0geGxvZ19yZWNvdmVyX3Byb2Nlc3MobG9nLCByaGFzaCwgcmhlYWQsIG9mZnNldCwKLQkJCQkJCSAgICAgcGFzcyk7CisJCQkJCQkgICAgIHBhc3MsICZidWZmZXJfbGlzdCk7CiAJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBicmVhZF9lcnIyOwogCkBAIC01MDEyLDcgKzUwODMsOCBAQAogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIGJyZWFkX2VycjI7CiAKLQkJZXJyb3IgPSB4bG9nX3JlY292ZXJfcHJvY2Vzcyhsb2csIHJoYXNoLCByaGVhZCwgb2Zmc2V0LCBwYXNzKTsKKwkJZXJyb3IgPSB4bG9nX3JlY292ZXJfcHJvY2Vzcyhsb2csIHJoYXNoLCByaGVhZCwgb2Zmc2V0LCBwYXNzLAorCQkJCQkgICAgICZidWZmZXJfbGlzdCk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gYnJlYWRfZXJyMjsKIApAQCAtNTAyNSwxMCArNTA5NywxNyBAQAogIGJyZWFkX2VycjE6CiAJeGxvZ19wdXRfYnAoaGJwKTsKIAorCS8qCisJICogU3VibWl0IGJ1ZmZlcnMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgZnJvbSB0aGUgbGFzdCByZWNvcmQgcHJvY2Vzc2VkLAorCSAqIHJlZ2FyZGxlc3Mgb2YgZXJyb3Igc3RhdHVzLgorCSAqLworCWlmICghbGlzdF9lbXB0eSgmYnVmZmVyX2xpc3QpKQorCQllcnJvcjIgPSB4ZnNfYnVmX2RlbHdyaV9zdWJtaXQoJmJ1ZmZlcl9saXN0KTsKKwogCWlmIChlcnJvciAmJiBmaXJzdF9iYWQpCiAJCSpmaXJzdF9iYWQgPSByaGVhZF9ibGs7CiAKLQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIGVycm9yID8gZXJyb3IgOiBlcnJvcjI7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX21vdW50LmMgYi9mcy94ZnMveGZzX21vdW50LmMKaW5kZXggZmFlZWFkNi4uNTZlODVhNiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19tb3VudC5jCisrKyBiL2ZzL3hmcy94ZnNfbW91bnQuYwpAQCAtOTM0LDYgKzkzNCwyMCBAQAogCX0KIAogCS8qCisJICogTm93IHRoZSBsb2cgaXMgZnVsbHkgcmVwbGF5ZWQsIHdlIGNhbiB0cmFuc2l0aW9uIHRvIGZ1bGwgcmVhZC1vbmx5CisJICogbW9kZSBmb3IgcmVhZC1vbmx5IG1vdW50cy4gVGhpcyB3aWxsIHN5bmMgYWxsIHRoZSBtZXRhZGF0YSBhbmQgY2xlYW4KKwkgKiB0aGUgbG9nIHNvIHRoYXQgdGhlIHJlY292ZXJ5IHdlIGp1c3QgcGVyZm9ybWVkIGRvZXMgbm90IGhhdmUgdG8gYmUKKwkgKiByZXBsYXllZCBhZ2FpbiBvbiB0aGUgbmV4dCBtb3VudC4KKwkgKgorCSAqIFdlIHVzZSB0aGUgc2FtZSBxdWllc2NlIG1lY2hhbmlzbSBhcyB0aGUgcnctPnJvIHJlbW91bnQsIGFzIHRoZXkgYXJlCisJICogc2VtYW50aWNhbGx5IGlkZW50aWNhbCBvcGVyYXRpb25zLgorCSAqLworCWlmICgobXAtPm1fZmxhZ3MgJiAoWEZTX01PVU5UX1JET05MWXxYRlNfTU9VTlRfTk9SRUNPVkVSWSkpID09CisJCQkJCQkJWEZTX01PVU5UX1JET05MWSkgeworCQl4ZnNfcXVpZXNjZV9hdHRyKG1wKTsKKwl9CisKKwkvKgogCSAqIENvbXBsZXRlIHRoZSBxdW90YSBpbml0aWFsaXNhdGlvbiwgcG9zdC1sb2ctcmVwbGF5IGNvbXBvbmVudC4KIAkgKi8KIAlpZiAocXVvdGFtb3VudCkgewpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19tb3VudC5oIGIvZnMveGZzL3hmc19tb3VudC5oCmluZGV4IGIzNjY3NmMuLjA0MWQ5NDkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbW91bnQuaAorKysgYi9mcy94ZnMveGZzX21vdW50LmgKQEAgLTU3LDEwICs1NywxNiBAQAogCiAjZGVmaW5lIFhGU19FUlJfUkVUUllfRk9SRVZFUgktMQogCisvKgorICogQWx0aG91Z2ggcmV0cnlfdGltZW91dCBpcyBpbiBqaWZmaWVzIHdoaWNoIGlzIG5vcm1hbGx5IGFuIHVuc2lnbmVkIGxvbmcsCisgKiB3ZSBsaW1pdCB0aGUgcmV0cnkgdGltZW91dCB0byA4NjQwMCBzZWNvbmRzLCBvciBvbmUgZGF5LiAgU28gZXZlbiBhCisgKiBzaWduZWQgMzItYml0IGxvbmcgaXMgc3VmZmljaWVudCBmb3IgYSBIWiB2YWx1ZSB1cCB0byAyNDg1NS4gIE1ha2luZyBpdAorICogc2lnbmVkIGxldHMgdXMgc3RvcmUgdGhlIHNwZWNpYWwgIi0xIiB2YWx1ZSwgbWVhbmluZyByZXRyeSBmb3JldmVyLgorICovCiBzdHJ1Y3QgeGZzX2Vycm9yX2NmZyB7CiAJc3RydWN0IHhmc19rb2JqCWtvYmo7CiAJaW50CQltYXhfcmV0cmllczsKLQl1bnNpZ25lZCBsb25nCXJldHJ5X3RpbWVvdXQ7CS8qIGluIGppZmZpZXMsIDAgPSBubyB0aW1lb3V0ICovCisJbG9uZwkJcmV0cnlfdGltZW91dDsJLyogaW4gamlmZmllcywgLTEgPSBpbmZpbml0ZSAqLwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgeGZzX21vdW50IHsKQEAgLTMyNSw2ICszMzEsMjIgQEAKIH0KICNlbmRpZgogCisvKiBwZXItQUcgYmxvY2sgcmVzZXJ2YXRpb24gZGF0YSBzdHJ1Y3R1cmVzKi8KK2VudW0geGZzX2FnX3Jlc3ZfdHlwZSB7CisJWEZTX0FHX1JFU1ZfTk9ORSA9IDAsCisJWEZTX0FHX1JFU1ZfTUVUQURBVEEsCisJWEZTX0FHX1JFU1ZfQUdGTCwKK307CisKK3N0cnVjdCB4ZnNfYWdfcmVzdiB7CisJLyogbnVtYmVyIG9mIGJsb2NrcyBvcmlnaW5hbGx5IHJlc2VydmVkIGhlcmUgKi8KKwl4ZnNfZXh0bGVuX3QJCQlhcl9vcmlnX3Jlc2VydmVkOworCS8qIG51bWJlciBvZiBibG9ja3MgcmVzZXJ2ZWQgaGVyZSAqLworCXhmc19leHRsZW5fdAkJCWFyX3Jlc2VydmVkOworCS8qIG51bWJlciBvZiBibG9ja3Mgb3JpZ2luYWxseSBhc2tlZCBmb3IgKi8KKwl4ZnNfZXh0bGVuX3QJCQlhcl9hc2tlZDsKK307CisKIC8qCiAgKiBQZXItYWcgaW5jb3JlIHN0cnVjdHVyZSwgY29waWVzIG9mIGluZm9ybWF0aW9uIGluIGFnZiBhbmQgYWdpLCB0byBpbXByb3ZlIHRoZQogICogcGVyZm9ybWFuY2Ugb2YgYWxsb2NhdGlvbiBncm91cCBzZWxlY3Rpb24uCkBAIC0zNzIsOCArMzk0LDI4IEBACiAJLyogZm9yIHJjdS1zYWZlIGZyZWVpbmcgKi8KIAlzdHJ1Y3QgcmN1X2hlYWQJcmN1X2hlYWQ7CiAJaW50CQlwYWdiX2NvdW50OwkvKiBwYWdiIHNsb3RzIGluIHVzZSAqLworCisJLyogQmxvY2tzIHJlc2VydmVkIGZvciBhbGwga2luZHMgb2YgbWV0YWRhdGEuICovCisJc3RydWN0IHhmc19hZ19yZXN2CXBhZ19tZXRhX3Jlc3Y7CisJLyogQmxvY2tzIHJlc2VydmVkIGZvciBqdXN0IEFHRkwtYmFzZWQgbWV0YWRhdGEuICovCisJc3RydWN0IHhmc19hZ19yZXN2CXBhZ19hZ2ZsX3Jlc3Y7CiB9IHhmc19wZXJhZ190OwogCitzdGF0aWMgaW5saW5lIHN0cnVjdCB4ZnNfYWdfcmVzdiAqCit4ZnNfcGVyYWdfcmVzdigKKwlzdHJ1Y3QgeGZzX3BlcmFnCSpwYWcsCisJZW51bSB4ZnNfYWdfcmVzdl90eXBlCXR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBYRlNfQUdfUkVTVl9NRVRBREFUQToKKwkJcmV0dXJuICZwYWctPnBhZ19tZXRhX3Jlc3Y7CisJY2FzZSBYRlNfQUdfUkVTVl9BR0ZMOgorCQlyZXR1cm4gJnBhZy0+cGFnX2FnZmxfcmVzdjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKIGV4dGVybiB2b2lkCXhmc191dWlkX3RhYmxlX2ZyZWUodm9pZCk7CiBleHRlcm4gaW50CXhmc19sb2dfc2Jjb3VudCh4ZnNfbW91bnRfdCAqKTsKIGV4dGVybiBfX3VpbnQ2NF90IHhmc19kZWZhdWx0X3Jlc2Jsa3MoeGZzX21vdW50X3QgKm1wKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfcm1hcF9pdGVtLmMgYi9mcy94ZnMveGZzX3JtYXBfaXRlbS5jCmluZGV4IDI1MDBmMjguLjA0MzJhNDUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfcm1hcF9pdGVtLmMKKysrIGIvZnMveGZzL3hmc19ybWFwX2l0ZW0uYwpAQCAtNTEsMjggKzUxLDE2IEBACiAJCWttZW1fem9uZV9mcmVlKHhmc19ydWlfem9uZSwgcnVpcCk7CiB9CiAKLS8qCi0gKiBUaGlzIHJldHVybnMgdGhlIG51bWJlciBvZiBpb3ZlY3MgbmVlZGVkIHRvIGxvZyB0aGUgZ2l2ZW4gcnVpIGl0ZW0uCi0gKiBXZSBvbmx5IG5lZWQgMSBpb3ZlYyBmb3IgYW4gcnVpIGl0ZW0uICBJdCBqdXN0IGxvZ3MgdGhlIHJ1aV9sb2dfZm9ybWF0Ci0gKiBzdHJ1Y3R1cmUuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci14ZnNfcnVpX2l0ZW1fc2l6ZW9mKAotCXN0cnVjdCB4ZnNfcnVpX2xvZ19pdGVtICpydWlwKQotewotCXJldHVybiBzaXplb2Yoc3RydWN0IHhmc19ydWlfbG9nX2Zvcm1hdCkgKwotCQkJKHJ1aXAtPnJ1aV9mb3JtYXQucnVpX25leHRlbnRzIC0gMSkgKgotCQkJc2l6ZW9mKHN0cnVjdCB4ZnNfbWFwX2V4dGVudCk7Ci19Ci0KIFNUQVRJQyB2b2lkCiB4ZnNfcnVpX2l0ZW1fc2l6ZSgKIAlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSpsaXAsCiAJaW50CQkJKm52ZWNzLAogCWludAkJCSpuYnl0ZXMpCiB7CisJc3RydWN0IHhmc19ydWlfbG9nX2l0ZW0JKnJ1aXAgPSBSVUlfSVRFTShsaXApOworCiAJKm52ZWNzICs9IDE7Ci0JKm5ieXRlcyArPSB4ZnNfcnVpX2l0ZW1fc2l6ZW9mKFJVSV9JVEVNKGxpcCkpOworCSpuYnl0ZXMgKz0geGZzX3J1aV9sb2dfZm9ybWF0X3NpemVvZihydWlwLT5ydWlfZm9ybWF0LnJ1aV9uZXh0ZW50cyk7CiB9CiAKIC8qCkBAIC05Nyw3ICs4NSw3IEBACiAJcnVpcC0+cnVpX2Zvcm1hdC5ydWlfc2l6ZSA9IDE7CiAKIAl4bG9nX2NvcHlfaW92ZWMobHYsICZ2ZWNwLCBYTE9HX1JFR19UWVBFX1JVSV9GT1JNQVQsICZydWlwLT5ydWlfZm9ybWF0LAotCQkJeGZzX3J1aV9pdGVtX3NpemVvZihydWlwKSk7CisJCQl4ZnNfcnVpX2xvZ19mb3JtYXRfc2l6ZW9mKHJ1aXAtPnJ1aV9mb3JtYXQucnVpX25leHRlbnRzKSk7CiB9CiAKIC8qCkBAIC0yMDUsMTYgKzE5MywxMiBAQAogCiB7CiAJc3RydWN0IHhmc19ydWlfbG9nX2l0ZW0JCSpydWlwOwotCXVpbnQJCQkJc2l6ZTsKIAogCUFTU0VSVChuZXh0ZW50cyA+IDApOwotCWlmIChuZXh0ZW50cyA+IFhGU19SVUlfTUFYX0ZBU1RfRVhURU5UUykgewotCQlzaXplID0gKHVpbnQpKHNpemVvZihzdHJ1Y3QgeGZzX3J1aV9sb2dfaXRlbSkgKwotCQkJKChuZXh0ZW50cyAtIDEpICogc2l6ZW9mKHN0cnVjdCB4ZnNfbWFwX2V4dGVudCkpKTsKLQkJcnVpcCA9IGttZW1femFsbG9jKHNpemUsIEtNX1NMRUVQKTsKLQl9IGVsc2UgeworCWlmIChuZXh0ZW50cyA+IFhGU19SVUlfTUFYX0ZBU1RfRVhURU5UUykKKwkJcnVpcCA9IGttZW1femFsbG9jKHhmc19ydWlfbG9nX2l0ZW1fc2l6ZW9mKG5leHRlbnRzKSwgS01fU0xFRVApOworCWVsc2UKIAkJcnVpcCA9IGttZW1fem9uZV96YWxsb2MoeGZzX3J1aV96b25lLCBLTV9TTEVFUCk7Ci0JfQogCiAJeGZzX2xvZ19pdGVtX2luaXQobXAsICZydWlwLT5ydWlfaXRlbSwgWEZTX0xJX1JVSSwgJnhmc19ydWlfaXRlbV9vcHMpOwogCXJ1aXAtPnJ1aV9mb3JtYXQucnVpX25leHRlbnRzID0gbmV4dGVudHM7CkBAIC0yMzksMTQgKzIyMywxMiBAQAogCXVpbnQJCQkJbGVuOwogCiAJc3JjX3J1aV9mbXQgPSBidWYtPmlfYWRkcjsKLQlsZW4gPSBzaXplb2Yoc3RydWN0IHhmc19ydWlfbG9nX2Zvcm1hdCkgKwotCQkJKHNyY19ydWlfZm10LT5ydWlfbmV4dGVudHMgLSAxKSAqCi0JCQlzaXplb2Yoc3RydWN0IHhmc19tYXBfZXh0ZW50KTsKKwlsZW4gPSB4ZnNfcnVpX2xvZ19mb3JtYXRfc2l6ZW9mKHNyY19ydWlfZm10LT5ydWlfbmV4dGVudHMpOwogCiAJaWYgKGJ1Zi0+aV9sZW4gIT0gbGVuKQogCQlyZXR1cm4gLUVGU0NPUlJVUFRFRDsKIAotCW1lbWNweSgoY2hhciAqKWRzdF9ydWlfZm10LCAoY2hhciAqKXNyY19ydWlfZm10LCBsZW4pOworCW1lbWNweShkc3RfcnVpX2ZtdCwgc3JjX3J1aV9mbXQsIGxlbik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfcm1hcF9pdGVtLmggYi9mcy94ZnMveGZzX3JtYXBfaXRlbS5oCmluZGV4IGFlZmNjM2EuLjM0MGM5NjggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfcm1hcF9pdGVtLmgKKysrIGIvZnMveGZzL3hmc19ybWFwX2l0ZW0uaApAQCAtNzAsNiArNzAsMTQgQEAKIAlzdHJ1Y3QgeGZzX3J1aV9sb2dfZm9ybWF0CXJ1aV9mb3JtYXQ7CiB9OwogCitzdGF0aWMgaW5saW5lIHNpemVfdAoreGZzX3J1aV9sb2dfaXRlbV9zaXplb2YoCisJdW5zaWduZWQgaW50CQlucikKK3sKKwlyZXR1cm4gb2Zmc2V0b2Yoc3RydWN0IHhmc19ydWlfbG9nX2l0ZW0sIHJ1aV9mb3JtYXQpICsKKwkJCXhmc19ydWlfbG9nX2Zvcm1hdF9zaXplb2YobnIpOworfQorCiAvKgogICogVGhpcyBpcyB0aGUgInJtYXAgdXBkYXRlIGRvbmUiIGxvZyBpdGVtLiAgSXQgaXMgdXNlZCB0byBsb2cgdGhlIGZhY3QgdGhhdAogICogc29tZSBybWFwYnQgdXBkYXRlcyBtZW50aW9uZWQgaW4gYW4gZWFybGllciBydWkgaXRlbSBoYXZlIGJlZW4gcGVyZm9ybWVkLgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19zdXBlci5jIGIvZnMveGZzL3hmc19zdXBlci5jCmluZGV4IDI0ZWY4M2UuLjJkMDkyZjkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfc3VwZXIuYworKysgYi9mcy94ZnMveGZzX3N1cGVyLmMKQEAgLTExMzcsNyArMTEzNyw3IEBACiAgKiBOb3RlOiB4ZnNfbG9nX3F1aWVzY2UoKSBzdG9wcyBiYWNrZ3JvdW5kIGxvZyB3b3JrIC0gdGhlIGNhbGxlcnMgbXVzdCBlbnN1cmUKICAqIGl0IGlzIHN0YXJ0ZWQgYWdhaW4gd2hlbiBhcHByb3ByaWF0ZS4KICAqLwotc3RhdGljIHZvaWQKK3ZvaWQKIHhmc19xdWllc2NlX2F0dHIoCiAJc3RydWN0IHhmc19tb3VudAkqbXApCiB7CkBAIC0xNTc0LDkgKzE1NzQsMTYgQEAKIAkJfQogCX0KIAotCWlmICh4ZnNfc2JfdmVyc2lvbl9oYXNybWFwYnQoJm1wLT5tX3NiKSkKKwlpZiAoeGZzX3NiX3ZlcnNpb25faGFzcm1hcGJ0KCZtcC0+bV9zYikpIHsKKwkJaWYgKG1wLT5tX3NiLnNiX3JibG9ja3MpIHsKKwkJCXhmc19hbGVydChtcCwKKwkiRVhQRVJJTUVOVEFMIHJldmVyc2UgbWFwcGluZyBidHJlZSBub3QgY29tcGF0aWJsZSB3aXRoIHJlYWx0aW1lIGRldmljZSEiKTsKKwkJCWVycm9yID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X2ZpbGVzdHJlYW1fdW5tb3VudDsKKwkJfQogCQl4ZnNfYWxlcnQobXAsCiAJIkVYUEVSSU1FTlRBTCByZXZlcnNlIG1hcHBpbmcgYnRyZWUgZmVhdHVyZSBlbmFibGVkLiBVc2UgYXQgeW91ciBvd24gcmlzayEiKTsKKwl9CiAKIAllcnJvciA9IHhmc19tb3VudGZzKG1wKTsKIAlpZiAoZXJyb3IpCkBAIC0xNzc1LDkgKzE3ODIsOCBAQAogCWlmICgheGZzX3J1ZF96b25lKQogCQlnb3RvIG91dF9kZXN0cm95X2ljcmVhdGVfem9uZTsKIAotCXhmc19ydWlfem9uZSA9IGttZW1fem9uZV9pbml0KChzaXplb2Yoc3RydWN0IHhmc19ydWlfbG9nX2l0ZW0pICsKLQkJCSgoWEZTX1JVSV9NQVhfRkFTVF9FWFRFTlRTIC0gMSkgKgotCQkJCXNpemVvZihzdHJ1Y3QgeGZzX21hcF9leHRlbnQpKSksCisJeGZzX3J1aV96b25lID0ga21lbV96b25lX2luaXQoCisJCQl4ZnNfcnVpX2xvZ19pdGVtX3NpemVvZihYRlNfUlVJX01BWF9GQVNUX0VYVEVOVFMpLAogCQkJInhmc19ydWlfaXRlbSIpOwogCWlmICgheGZzX3J1aV96b25lKQogCQlnb3RvIG91dF9kZXN0cm95X3J1ZF96b25lOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19zdXBlci5oIGIvZnMveGZzL3hmc19zdXBlci5oCmluZGV4IDUyOWJjZTkuLmI2NDE4YWIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfc3VwZXIuaAorKysgYi9mcy94ZnMveGZzX3N1cGVyLmgKQEAgLTYxLDYgKzYxLDcgQEAKIHN0cnVjdCB4ZnNfYnVmdGFyZzsKIHN0cnVjdCBibG9ja19kZXZpY2U7CiAKK2V4dGVybiB2b2lkIHhmc19xdWllc2NlX2F0dHIoc3RydWN0IHhmc19tb3VudCAqbXApOwogZXh0ZXJuIHZvaWQgeGZzX2ZsdXNoX2lub2RlcyhzdHJ1Y3QgeGZzX21vdW50ICptcCk7CiBleHRlcm4gdm9pZCB4ZnNfYmxrZGV2X2lzc3VlX2ZsdXNoKHN0cnVjdCB4ZnNfYnVmdGFyZyAqKTsKIGV4dGVybiB4ZnNfYWdudW1iZXJfdCB4ZnNfc2V0X2lub2RlX2FsbG9jKHN0cnVjdCB4ZnNfbW91bnQgKiwKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfc3lzZnMuYyBiL2ZzL3hmcy94ZnNfc3lzZnMuYwppbmRleCA3OWNmZDNmLi41ZjhkNTVkIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3N5c2ZzLmMKKysrIGIvZnMveGZzL3hmc19zeXNmcy5jCkBAIC0zOTMsOSArMzkzLDE1IEBACiAJc3RydWN0IGtvYmplY3QJKmtvYmplY3QsCiAJY2hhcgkJKmJ1ZikKIHsKKwlpbnQJCXJldHJpZXM7CiAJc3RydWN0IHhmc19lcnJvcl9jZmcgKmNmZyA9IHRvX2Vycm9yX2NmZyhrb2JqZWN0KTsKIAotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBjZmctPm1heF9yZXRyaWVzKTsKKwlpZiAoY2ZnLT5yZXRyeV90aW1lb3V0ID09IFhGU19FUlJfUkVUUllfRk9SRVZFUikKKwkJcmV0cmllcyA9IC0xOworCWVsc2UKKwkJcmV0cmllcyA9IGNmZy0+bWF4X3JldHJpZXM7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgcmV0cmllcyk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90CkBAIC00MTUsNyArNDIxLDEwIEBACiAJaWYgKHZhbCA8IC0xKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWNmZy0+bWF4X3JldHJpZXMgPSB2YWw7CisJaWYgKHZhbCA9PSAtMSkKKwkJY2ZnLT5yZXRyeV90aW1lb3V0ID0gWEZTX0VSUl9SRVRSWV9GT1JFVkVSOworCWVsc2UKKwkJY2ZnLT5tYXhfcmV0cmllcyA9IHZhbDsKIAlyZXR1cm4gY291bnQ7CiB9CiBYRlNfU1lTRlNfQVRUUl9SVyhtYXhfcmV0cmllcyk7CkBAIC00MjUsMTAgKzQzNCwxNSBAQAogCXN0cnVjdCBrb2JqZWN0CSprb2JqZWN0LAogCWNoYXIJCSpidWYpCiB7CisJaW50CQl0aW1lb3V0OwogCXN0cnVjdCB4ZnNfZXJyb3JfY2ZnICpjZmcgPSB0b19lcnJvcl9jZmcoa29iamVjdCk7CiAKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGRcbiIsCi0JCQlqaWZmaWVzX3RvX21zZWNzKGNmZy0+cmV0cnlfdGltZW91dCkgLyBNU0VDX1BFUl9TRUMpOworCWlmIChjZmctPnJldHJ5X3RpbWVvdXQgPT0gWEZTX0VSUl9SRVRSWV9GT1JFVkVSKQorCQl0aW1lb3V0ID0gLTE7CisJZWxzZQorCQl0aW1lb3V0ID0gamlmZmllc190b19tc2VjcyhjZmctPnJldHJ5X3RpbWVvdXQpIC8gTVNFQ19QRVJfU0VDOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHRpbWVvdXQpOwogfQogCiBzdGF0aWMgc3NpemVfdApAQCAtNDQ1LDExICs0NTksMTYgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JLyogMSBkYXkgdGltZW91dCBtYXhpbXVtICovCi0JaWYgKHZhbCA8IDAgfHwgdmFsID4gODY0MDApCisJLyogMSBkYXkgdGltZW91dCBtYXhpbXVtLCAtMSBtZWFucyBpbmZpbml0ZSAqLworCWlmICh2YWwgPCAtMSB8fCB2YWwgPiA4NjQwMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQljZmctPnJldHJ5X3RpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKHZhbCAqIE1TRUNfUEVSX1NFQyk7CisJaWYgKHZhbCA9PSAtMSkKKwkJY2ZnLT5yZXRyeV90aW1lb3V0ID0gWEZTX0VSUl9SRVRSWV9GT1JFVkVSOworCWVsc2UgeworCQljZmctPnJldHJ5X3RpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKHZhbCAqIE1TRUNfUEVSX1NFQyk7CisJCUFTU0VSVChtc2Vjc190b19qaWZmaWVzKHZhbCAqIE1TRUNfUEVSX1NFQykgPCBMT05HX01BWCk7CisJfQogCXJldHVybiBjb3VudDsKIH0KIFhGU19TWVNGU19BVFRSX1JXKHJldHJ5X3RpbWVvdXRfc2Vjb25kcyk7CkBAIC01MTksMTggKzUzOCwxOSBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCB4ZnNfZXJyb3JfaW5pdCB4ZnNfZXJyb3JfbWV0YV9pbml0W1hGU19FUlJfRVJSTk9fTUFYXSA9IHsKIAl7IC5uYW1lID0gImRlZmF1bHQiLAogCSAgLm1heF9yZXRyaWVzID0gWEZTX0VSUl9SRVRSWV9GT1JFVkVSLAotCSAgLnJldHJ5X3RpbWVvdXQgPSAwLAorCSAgLnJldHJ5X3RpbWVvdXQgPSBYRlNfRVJSX1JFVFJZX0ZPUkVWRVIsCiAJfSwKIAl7IC5uYW1lID0gIkVJTyIsCiAJICAubWF4X3JldHJpZXMgPSBYRlNfRVJSX1JFVFJZX0ZPUkVWRVIsCi0JICAucmV0cnlfdGltZW91dCA9IDAsCisJICAucmV0cnlfdGltZW91dCA9IFhGU19FUlJfUkVUUllfRk9SRVZFUiwKIAl9LAogCXsgLm5hbWUgPSAiRU5PU1BDIiwKIAkgIC5tYXhfcmV0cmllcyA9IFhGU19FUlJfUkVUUllfRk9SRVZFUiwKLQkgIC5yZXRyeV90aW1lb3V0ID0gMCwKKwkgIC5yZXRyeV90aW1lb3V0ID0gWEZTX0VSUl9SRVRSWV9GT1JFVkVSLAogCX0sCiAJeyAubmFtZSA9ICJFTk9ERVYiLAotCSAgLm1heF9yZXRyaWVzID0gMCwKKwkgIC5tYXhfcmV0cmllcyA9IDAsCS8qIFdlIGNhbid0IHJlY292ZXIgZnJvbSBkZXZpY2VzIGRpc2FwcGVhcmluZyAqLworCSAgLnJldHJ5X3RpbWVvdXQgPSAwLAogCX0sCiB9OwogCkBAIC01NjEsNyArNTgxLDEwIEBACiAJCQlnb3RvIG91dF9lcnJvcjsKIAogCQljZmctPm1heF9yZXRyaWVzID0gaW5pdFtpXS5tYXhfcmV0cmllczsKLQkJY2ZnLT5yZXRyeV90aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcygKKwkJaWYgKGluaXRbaV0ucmV0cnlfdGltZW91dCA9PSBYRlNfRVJSX1JFVFJZX0ZPUkVWRVIpCisJCQljZmctPnJldHJ5X3RpbWVvdXQgPSBYRlNfRVJSX1JFVFJZX0ZPUkVWRVI7CisJCWVsc2UKKwkJCWNmZy0+cmV0cnlfdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMoCiAJCQkJCWluaXRbaV0ucmV0cnlfdGltZW91dCAqIE1TRUNfUEVSX1NFQyk7CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFjZS5oIGIvZnMveGZzL3hmc190cmFjZS5oCmluZGV4IDU1MWI3ZTIuLmM2YjJiMWQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhY2UuaAorKysgYi9mcy94ZnMveGZzX3RyYWNlLmgKQEAgLTEyOTgsNyArMTI5OCw2IEBACiBERUZJTkVfSU9NQVBfRVZFTlQoeGZzX2dldF9ibG9ja3NfbWFwX2RpcmVjdCk7CiBERUZJTkVfSU9NQVBfRVZFTlQoeGZzX2lvbWFwX2FsbG9jKTsKIERFRklORV9JT01BUF9FVkVOVCh4ZnNfaW9tYXBfZm91bmQpOwotREVGSU5FX0lPTUFQX0VWRU5UKHhmc19pb21hcF9ub3RfZm91bmQpOwogCiBERUNMQVJFX0VWRU5UX0NMQVNTKHhmc19zaW1wbGVfaW9fY2xhc3MsCiAJVFBfUFJPVE8oc3RydWN0IHhmc19pbm9kZSAqaXAsIHhmc19vZmZfdCBvZmZzZXQsIHNzaXplX3QgY291bnQpLApAQCAtMTU3MSwxNCArMTU3MCwxNSBAQAogCiBUUkFDRV9FVkVOVCh4ZnNfZnJlZV9leHRlbnQsCiAJVFBfUFJPVE8oc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19hZ251bWJlcl90IGFnbm8sIHhmc19hZ2Jsb2NrX3QgYWdibm8sCi0JCSB4ZnNfZXh0bGVuX3QgbGVuLCBib29sIGlzZmwsIGludCBoYXZlbGVmdCwgaW50IGhhdmVyaWdodCksCi0JVFBfQVJHUyhtcCwgYWdubywgYWdibm8sIGxlbiwgaXNmbCwgaGF2ZWxlZnQsIGhhdmVyaWdodCksCisJCSB4ZnNfZXh0bGVuX3QgbGVuLCBlbnVtIHhmc19hZ19yZXN2X3R5cGUgcmVzdiwgaW50IGhhdmVsZWZ0LAorCQkgaW50IGhhdmVyaWdodCksCisJVFBfQVJHUyhtcCwgYWdubywgYWdibm8sIGxlbiwgcmVzdiwgaGF2ZWxlZnQsIGhhdmVyaWdodCksCiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJX19maWVsZChkZXZfdCwgZGV2KQogCQlfX2ZpZWxkKHhmc19hZ251bWJlcl90LCBhZ25vKQogCQlfX2ZpZWxkKHhmc19hZ2Jsb2NrX3QsIGFnYm5vKQogCQlfX2ZpZWxkKHhmc19leHRsZW5fdCwgbGVuKQotCQlfX2ZpZWxkKGludCwgaXNmbCkKKwkJX19maWVsZChpbnQsIHJlc3YpCiAJCV9fZmllbGQoaW50LCBoYXZlbGVmdCkKIAkJX19maWVsZChpbnQsIGhhdmVyaWdodCkKIAkpLApAQCAtMTU4NywxNiArMTU4NywxNiBAQAogCQlfX2VudHJ5LT5hZ25vID0gYWdubzsKIAkJX19lbnRyeS0+YWdibm8gPSBhZ2JubzsKIAkJX19lbnRyeS0+bGVuID0gbGVuOwotCQlfX2VudHJ5LT5pc2ZsID0gaXNmbDsKKwkJX19lbnRyeS0+cmVzdiA9IHJlc3Y7CiAJCV9fZW50cnktPmhhdmVsZWZ0ID0gaGF2ZWxlZnQ7CiAJCV9fZW50cnktPmhhdmVyaWdodCA9IGhhdmVyaWdodDsKIAkpLAotCVRQX3ByaW50aygiZGV2ICVkOiVkIGFnbm8gJXUgYWdibm8gJXUgbGVuICV1IGlzZmwgJWQgJXMiLAorCVRQX3ByaW50aygiZGV2ICVkOiVkIGFnbm8gJXUgYWdibm8gJXUgbGVuICV1IHJlc3YgJWQgJXMiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCiAJCSAgX19lbnRyeS0+YWdubywKIAkJICBfX2VudHJ5LT5hZ2JubywKIAkJICBfX2VudHJ5LT5sZW4sCi0JCSAgX19lbnRyeS0+aXNmbCwKKwkJICBfX2VudHJ5LT5yZXN2LAogCQkgIF9fZW50cnktPmhhdmVsZWZ0ID8KIAkJCShfX2VudHJ5LT5oYXZlcmlnaHQgPyAiYm90aCIgOiAibGVmdCIpIDoKIAkJCShfX2VudHJ5LT5oYXZlcmlnaHQgPyAicmlnaHQiIDogIm5vbmUiKSkKQEAgLTE2MjMsOCArMTYyMyw4IEBACiAJCV9fZmllbGQoc2hvcnQsIG90eXBlKQogCQlfX2ZpZWxkKGNoYXIsIHdhc2RlbCkKIAkJX19maWVsZChjaGFyLCB3YXNmcm9tZmwpCi0JCV9fZmllbGQoY2hhciwgaXNmbCkKLQkJX19maWVsZChjaGFyLCB1c2VyZGF0YSkKKwkJX19maWVsZChpbnQsIHJlc3YpCisJCV9fZmllbGQoaW50LCBkYXRhdHlwZSkKIAkJX19maWVsZCh4ZnNfZnNibG9ja190LCBmaXJzdGJsb2NrKQogCSksCiAJVFBfZmFzdF9hc3NpZ24oCkBAIC0xNjQ0LDE0ICsxNjQ0LDE0IEBACiAJCV9fZW50cnktPm90eXBlID0gYXJncy0+b3R5cGU7CiAJCV9fZW50cnktPndhc2RlbCA9IGFyZ3MtPndhc2RlbDsKIAkJX19lbnRyeS0+d2FzZnJvbWZsID0gYXJncy0+d2FzZnJvbWZsOwotCQlfX2VudHJ5LT5pc2ZsID0gYXJncy0+aXNmbDsKLQkJX19lbnRyeS0+dXNlcmRhdGEgPSBhcmdzLT51c2VyZGF0YTsKKwkJX19lbnRyeS0+cmVzdiA9IGFyZ3MtPnJlc3Y7CisJCV9fZW50cnktPmRhdGF0eXBlID0gYXJncy0+ZGF0YXR5cGU7CiAJCV9fZW50cnktPmZpcnN0YmxvY2sgPSBhcmdzLT5maXJzdGJsb2NrOwogCSksCiAJVFBfcHJpbnRrKCJkZXYgJWQ6JWQgYWdubyAldSBhZ2JubyAldSBtaW5sZW4gJXUgbWF4bGVuICV1IG1vZCAldSAiCiAJCSAgInByb2QgJXUgbWlubGVmdCAldSB0b3RhbCAldSBhbGlnbm1lbnQgJXUgbWluYWxpZ25zbG9wICV1ICIKLQkJICAibGVuICV1IHR5cGUgJXMgb3R5cGUgJXMgd2FzZGVsICVkIHdhc2Zyb21mbCAlZCBpc2ZsICVkICIKLQkJICAidXNlcmRhdGEgJWQgZmlyc3RibG9jayAweCVsbHgiLAorCQkgICJsZW4gJXUgdHlwZSAlcyBvdHlwZSAlcyB3YXNkZWwgJWQgd2FzZnJvbWZsICVkIHJlc3YgJWQgIgorCQkgICJkYXRhdHlwZSAweCV4IGZpcnN0YmxvY2sgMHglbGx4IiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAogCQkgIF9fZW50cnktPmFnbm8sCiAJCSAgX19lbnRyeS0+YWdibm8sCkBAIC0xNjY4LDggKzE2NjgsOCBAQAogCQkgIF9fcHJpbnRfc3ltYm9saWMoX19lbnRyeS0+b3R5cGUsIFhGU19BTExPQ19UWVBFUyksCiAJCSAgX19lbnRyeS0+d2FzZGVsLAogCQkgIF9fZW50cnktPndhc2Zyb21mbCwKLQkJICBfX2VudHJ5LT5pc2ZsLAotCQkgIF9fZW50cnktPnVzZXJkYXRhLAorCQkgIF9fZW50cnktPnJlc3YsCisJCSAgX19lbnRyeS0+ZGF0YXR5cGUsCiAJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylfX2VudHJ5LT5maXJzdGJsb2NrKQogKQogCkBAIC0xOTg1LDYgKzE5ODUsMjkgQEAKIERFRklORV9TV0FQRVhUX0VWRU5UKHhmc19zd2FwX2V4dGVudF9iZWZvcmUpOwogREVGSU5FX1NXQVBFWFRfRVZFTlQoeGZzX3N3YXBfZXh0ZW50X2FmdGVyKTsKIAorVFJBQ0VfRVZFTlQoeGZzX2xvZ19yZWNvdmVyX3JlY29yZCwKKwlUUF9QUk9UTyhzdHJ1Y3QgeGxvZyAqbG9nLCBzdHJ1Y3QgeGxvZ19yZWNfaGVhZGVyICpyaGVhZCwgaW50IHBhc3MpLAorCVRQX0FSR1MobG9nLCByaGVhZCwgcGFzcyksCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZChkZXZfdCwgZGV2KQorCQlfX2ZpZWxkKHhmc19sc25fdCwgbHNuKQorCQlfX2ZpZWxkKGludCwgbGVuKQorCQlfX2ZpZWxkKGludCwgbnVtX2xvZ29wcykKKwkJX19maWVsZChpbnQsIHBhc3MpCisJKSwKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+ZGV2ID0gbG9nLT5sX21wLT5tX3N1cGVyLT5zX2RldjsKKwkJX19lbnRyeS0+bHNuID0gYmU2NF90b19jcHUocmhlYWQtPmhfbHNuKTsKKwkJX19lbnRyeS0+bGVuID0gYmUzMl90b19jcHUocmhlYWQtPmhfbGVuKTsKKwkJX19lbnRyeS0+bnVtX2xvZ29wcyA9IGJlMzJfdG9fY3B1KHJoZWFkLT5oX251bV9sb2dvcHMpOworCQlfX2VudHJ5LT5wYXNzID0gcGFzczsKKwkpLAorCVRQX3ByaW50aygiZGV2ICVkOiVkIGxzbiAweCVsbHggbGVuIDB4JXggbnVtX2xvZ29wcyAweCV4IHBhc3MgJWQiLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCisJCSAgX19lbnRyeS0+bHNuLCBfX2VudHJ5LT5sZW4sIF9fZW50cnktPm51bV9sb2dvcHMsCisJCSAgIF9fZW50cnktPnBhc3MpCispCisKIERFQ0xBUkVfRVZFTlRfQ0xBU1MoeGZzX2xvZ19yZWNvdmVyX2l0ZW1fY2xhc3MsCiAJVFBfUFJPVE8oc3RydWN0IHhsb2cgKmxvZywgc3RydWN0IHhsb2dfcmVjb3ZlciAqdHJhbnMsCiAJCXN0cnVjdCB4bG9nX3JlY292ZXJfaXRlbSAqaXRlbSwgaW50IHBhc3MpLApAQCAtMTk5Myw2ICsyMDE2LDcgQEAKIAkJX19maWVsZChkZXZfdCwgZGV2KQogCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIGl0ZW0pCiAJCV9fZmllbGQoeGxvZ190aWRfdCwgdGlkKQorCQlfX2ZpZWxkKHhmc19sc25fdCwgbHNuKQogCQlfX2ZpZWxkKGludCwgdHlwZSkKIAkJX19maWVsZChpbnQsIHBhc3MpCiAJCV9fZmllbGQoaW50LCBjb3VudCkKQEAgLTIwMDIsMTUgKzIwMjYsMTcgQEAKIAkJX19lbnRyeS0+ZGV2ID0gbG9nLT5sX21wLT5tX3N1cGVyLT5zX2RldjsKIAkJX19lbnRyeS0+aXRlbSA9ICh1bnNpZ25lZCBsb25nKWl0ZW07CiAJCV9fZW50cnktPnRpZCA9IHRyYW5zLT5yX2xvZ190aWQ7CisJCV9fZW50cnktPmxzbiA9IHRyYW5zLT5yX2xzbjsKIAkJX19lbnRyeS0+dHlwZSA9IElURU1fVFlQRShpdGVtKTsKIAkJX19lbnRyeS0+cGFzcyA9IHBhc3M7CiAJCV9fZW50cnktPmNvdW50ID0gaXRlbS0+cmlfY250OwogCQlfX2VudHJ5LT50b3RhbCA9IGl0ZW0tPnJpX3RvdGFsOwogCSksCi0JVFBfcHJpbnRrKCJkZXYgJWQ6JWQgdHJhbnMgMHgleCwgcGFzcyAlZCwgaXRlbSAweCVwLCBpdGVtIHR5cGUgJXMgIgotCQkgICJpdGVtIHJlZ2lvbiBjb3VudC90b3RhbCAlZC8lZCIsCisJVFBfcHJpbnRrKCJkZXYgJWQ6JWQgdGlkIDB4JXggbHNuIDB4JWxseCwgcGFzcyAlZCwgaXRlbSAweCVwLCAiCisJCSAgIml0ZW0gdHlwZSAlcyBpdGVtIHJlZ2lvbiBjb3VudC90b3RhbCAlZC8lZCIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKIAkJICBfX2VudHJ5LT50aWQsCisJCSAgX19lbnRyeS0+bHNuLAogCQkgIF9fZW50cnktPnBhc3MsCiAJCSAgKHZvaWQgKilfX2VudHJ5LT5pdGVtLAogCQkgIF9fcHJpbnRfc3ltYm9saWMoX19lbnRyeS0+dHlwZSwgWEZTX0xJX1RZUEVfREVTQyksCkBAIC0yMDY5LDYgKzIwOTUsNyBAQAogREVGSU5FX0xPR19SRUNPVkVSX0JVRl9JVEVNKHhmc19sb2dfcmVjb3Zlcl9idWZfY2FuY2VsX2FkZCk7CiBERUZJTkVfTE9HX1JFQ09WRVJfQlVGX0lURU0oeGZzX2xvZ19yZWNvdmVyX2J1Zl9jYW5jZWxfcmVmX2luYyk7CiBERUZJTkVfTE9HX1JFQ09WRVJfQlVGX0lURU0oeGZzX2xvZ19yZWNvdmVyX2J1Zl9yZWNvdmVyKTsKK0RFRklORV9MT0dfUkVDT1ZFUl9CVUZfSVRFTSh4ZnNfbG9nX3JlY292ZXJfYnVmX3NraXApOwogREVGSU5FX0xPR19SRUNPVkVSX0JVRl9JVEVNKHhmc19sb2dfcmVjb3Zlcl9idWZfaW5vZGVfYnVmKTsKIERFRklORV9MT0dfUkVDT1ZFUl9CVUZfSVRFTSh4ZnNfbG9nX3JlY292ZXJfYnVmX3JlZ19idWYpOwogREVGSU5FX0xPR19SRUNPVkVSX0JVRl9JVEVNKHhmc19sb2dfcmVjb3Zlcl9idWZfZHF1b3RfYnVmKTsKQEAgLTIyOTYsNyArMjMyMyw3IEBACiAJCV9fZW50cnktPmRldiA9IG1wID8gbXAtPm1fc3VwZXItPnNfZGV2IDogMDsKIAkJX19lbnRyeS0+dHlwZSA9IGRmcC0+ZGZwX3R5cGUtPnR5cGU7CiAJCV9fZW50cnktPmludGVudCA9IGRmcC0+ZGZwX2ludGVudDsKLQkJX19lbnRyeS0+Y29tbWl0dGVkID0gZGZwLT5kZnBfY29tbWl0dGVkOworCQlfX2VudHJ5LT5jb21taXR0ZWQgPSBkZnAtPmRmcF9kb25lICE9IE5VTEw7CiAJCV9fZW50cnktPm5yID0gZGZwLT5kZnBfY291bnQ7CiAJKSwKIAlUUF9wcmludGsoImRldiAlZDolZCBvcHR5cGUgJWQgaW50ZW50ICVwIGNvbW1pdHRlZCAlZCBuciAlZFxuIiwKQEAgLTI1NTksNiArMjU4Niw2MCBAQAogREVGSU5FX1JNQVBCVF9FVkVOVCh4ZnNfcm1hcF9maW5kX3JpZ2h0X25laWdoYm9yX3Jlc3VsdCk7CiBERUZJTkVfUk1BUEJUX0VWRU5UKHhmc19ybWFwX2ZpbmRfbGVmdF9uZWlnaGJvcl9yZXN1bHQpOwogCisvKiBwZXItQUcgcmVzZXJ2YXRpb24gKi8KK0RFQ0xBUkVfRVZFTlRfQ0xBU1MoeGZzX2FnX3Jlc3ZfY2xhc3MsCisJVFBfUFJPVE8oc3RydWN0IHhmc19wZXJhZyAqcGFnLCBlbnVtIHhmc19hZ19yZXN2X3R5cGUgcmVzdiwKKwkJIHhmc19leHRsZW5fdCBsZW4pLAorCVRQX0FSR1MocGFnLCByZXN2LCBsZW4pLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoZGV2X3QsIGRldikKKwkJX19maWVsZCh4ZnNfYWdudW1iZXJfdCwgYWdubykKKwkJX19maWVsZChpbnQsIHJlc3YpCisJCV9fZmllbGQoeGZzX2V4dGxlbl90LCBmcmVlYmxrcykKKwkJX19maWVsZCh4ZnNfZXh0bGVuX3QsIGZsY291bnQpCisJCV9fZmllbGQoeGZzX2V4dGxlbl90LCByZXNlcnZlZCkKKwkJX19maWVsZCh4ZnNfZXh0bGVuX3QsIGFza2VkKQorCQlfX2ZpZWxkKHhmc19leHRsZW5fdCwgbGVuKQorCSksCisJVFBfZmFzdF9hc3NpZ24oCisJCXN0cnVjdCB4ZnNfYWdfcmVzdgkqciA9IHhmc19wZXJhZ19yZXN2KHBhZywgcmVzdik7CisKKwkJX19lbnRyeS0+ZGV2ID0gcGFnLT5wYWdfbW91bnQtPm1fc3VwZXItPnNfZGV2OworCQlfX2VudHJ5LT5hZ25vID0gcGFnLT5wYWdfYWdubzsKKwkJX19lbnRyeS0+cmVzdiA9IHJlc3Y7CisJCV9fZW50cnktPmZyZWVibGtzID0gcGFnLT5wYWdmX2ZyZWVibGtzOworCQlfX2VudHJ5LT5mbGNvdW50ID0gcGFnLT5wYWdmX2ZsY291bnQ7CisJCV9fZW50cnktPnJlc2VydmVkID0gciA/IHItPmFyX3Jlc2VydmVkIDogMDsKKwkJX19lbnRyeS0+YXNrZWQgPSByID8gci0+YXJfYXNrZWQgOiAwOworCQlfX2VudHJ5LT5sZW4gPSBsZW47CisJKSwKKwlUUF9wcmludGsoImRldiAlZDolZCBhZ25vICV1IHJlc3YgJWQgZnJlZWJsa3MgJXUgZmxjb3VudCAldSByZXN2ICV1IGFzayAldSBsZW4gJXVcbiIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKKwkJICBfX2VudHJ5LT5hZ25vLAorCQkgIF9fZW50cnktPnJlc3YsCisJCSAgX19lbnRyeS0+ZnJlZWJsa3MsCisJCSAgX19lbnRyeS0+Zmxjb3VudCwKKwkJICBfX2VudHJ5LT5yZXNlcnZlZCwKKwkJICBfX2VudHJ5LT5hc2tlZCwKKwkJICBfX2VudHJ5LT5sZW4pCispCisjZGVmaW5lIERFRklORV9BR19SRVNWX0VWRU5UKG5hbWUpIFwKK0RFRklORV9FVkVOVCh4ZnNfYWdfcmVzdl9jbGFzcywgbmFtZSwgXAorCVRQX1BST1RPKHN0cnVjdCB4ZnNfcGVyYWcgKnBhZywgZW51bSB4ZnNfYWdfcmVzdl90eXBlIHR5cGUsIFwKKwkJIHhmc19leHRsZW5fdCBsZW4pLCBcCisJVFBfQVJHUyhwYWcsIHR5cGUsIGxlbikpCisKKy8qIHBlci1BRyByZXNlcnZhdGlvbiB0cmFjZXBvaW50cyAqLworREVGSU5FX0FHX1JFU1ZfRVZFTlQoeGZzX2FnX3Jlc3ZfaW5pdCk7CitERUZJTkVfQUdfUkVTVl9FVkVOVCh4ZnNfYWdfcmVzdl9mcmVlKTsKK0RFRklORV9BR19SRVNWX0VWRU5UKHhmc19hZ19yZXN2X2FsbG9jX2V4dGVudCk7CitERUZJTkVfQUdfUkVTVl9FVkVOVCh4ZnNfYWdfcmVzdl9mcmVlX2V4dGVudCk7CitERUZJTkVfQUdfUkVTVl9FVkVOVCh4ZnNfYWdfcmVzdl9jcml0aWNhbCk7CitERUZJTkVfQUdfUkVTVl9FVkVOVCh4ZnNfYWdfcmVzdl9uZWVkZWQpOworCitERUZJTkVfQUdfRVJST1JfRVZFTlQoeGZzX2FnX3Jlc3ZfZnJlZV9lcnJvcik7CitERUZJTkVfQUdfRVJST1JfRVZFTlQoeGZzX2FnX3Jlc3ZfaW5pdF9lcnJvcik7CisKICNlbmRpZiAvKiBfVFJBQ0VfWEZTX0ggKi8KIAogI3VuZGVmIFRSQUNFX0lOQ0xVREVfUEFUSApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFucy5jIGIvZnMveGZzL3hmc190cmFucy5jCmluZGV4IDVmM2QzM2QuLjcwZjQyZWEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhbnMuYworKysgYi9mcy94ZnMveGZzX3RyYW5zLmMKQEAgLTIxNyw3ICsyMTcsNyBAQAogCiB1bmRvX2Jsb2NrczoKIAlpZiAoYmxvY2tzID4gMCkgewotCQl4ZnNfbW9kX2ZkYmxvY2tzKHRwLT50X21vdW50cCwgLSgoaW50NjRfdClibG9ja3MpLCByc3ZkKTsKKwkJeGZzX21vZF9mZGJsb2Nrcyh0cC0+dF9tb3VudHAsIChpbnQ2NF90KWJsb2NrcywgcnN2ZCk7CiAJCXRwLT50X2Jsa19yZXMgPSAwOwogCX0KIApAQCAtMzE4LDcgKzMxOCw2IEBACiAJCSAqIGluLWNvcmUgc3VwZXJibG9jaydzIGNvdW50ZXIuICBUaGlzIHNob3VsZCBvbmx5CiAJCSAqIGJlIGFwcGxpZWQgdG8gdGhlIG9uLWRpc2sgc3VwZXJibG9jay4KIAkJICovCi0JCUFTU0VSVChkZWx0YSA8IDApOwogCQl0cC0+dF9yZXNfZmRibG9ja3NfZGVsdGEgKz0gZGVsdGE7CiAJCWlmICh4ZnNfc2JfdmVyc2lvbl9oYXNsYXp5c2Jjb3VudCgmbXAtPm1fc2IpKQogCQkJZmxhZ3MgJj0gflhGU19UUkFOU19TQl9ESVJUWTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnNfZXh0ZnJlZS5jIGIvZnMveGZzL3hmc190cmFuc19leHRmcmVlLmMKaW5kZXggNDU5ZGRlYy4uYWI0Mzg2NCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc190cmFuc19leHRmcmVlLmMKKysrIGIvZnMveGZzL3hmc190cmFuc19leHRmcmVlLmMKQEAgLTc5LDcgKzc5LDggQEAKIAogCXRyYWNlX3hmc19ibWFwX2ZyZWVfZGVmZXJyZWQodHAtPnRfbW91bnRwLCBhZ25vLCAwLCBhZ2JubywgZXh0X2xlbik7CiAKLQllcnJvciA9IHhmc19mcmVlX2V4dGVudCh0cCwgc3RhcnRfYmxvY2ssIGV4dF9sZW4sIG9pbmZvKTsKKwllcnJvciA9IHhmc19mcmVlX2V4dGVudCh0cCwgc3RhcnRfYmxvY2ssIGV4dF9sZW4sIG9pbmZvLAorCQkJWEZTX0FHX1JFU1ZfTk9ORSk7CiAKIAkvKgogCSAqIE1hcmsgdGhlIHRyYW5zYWN0aW9uIGRpcnR5LCBldmVuIG9uIGVycm9yLiBUaGlzIGVuc3VyZXMgdGhlCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3hhdHRyLmMgYi9mcy94ZnMveGZzX3hhdHRyLmMKaW5kZXggZWE2MjI0NS4uNjI5MDA5MyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc194YXR0ci5jCisrKyBiL2ZzL3hmcy94ZnNfeGF0dHIuYwpAQCAtMTQ3LDYgKzE0Nyw3IEBACiAJYXJyYXl0b3AgPSBjb250ZXh0LT5jb3VudCArIHByZWZpeF9sZW4gKyBuYW1lbGVuICsgMTsKIAlpZiAoYXJyYXl0b3AgPiBjb250ZXh0LT5maXJzdHUpIHsKIAkJY29udGV4dC0+Y291bnQgPSAtMTsJLyogaW5zdWZmaWNpZW50IHNwYWNlICovCisJCWNvbnRleHQtPnNlZW5fZW5vdWdoID0gMTsKIAkJcmV0dXJuIDA7CiAJfQogCW9mZnNldCA9IChjaGFyICopY29udGV4dC0+YWxpc3QgKyBjb250ZXh0LT5jb3VudDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2NvbmZpZy5oIGIvaW5jbHVkZS9hY3BpL2FjY29uZmlnLmgKaW5kZXggZmUyZTNhYy4uMTJjMjg4MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjY29uZmlnLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjY29uZmlnLmgKQEAgLTE0NCw2ICsxNDQsMTAgQEAKIAogI2RlZmluZSBBQ1BJX0FERFJFU1NfUkFOR0VfTUFYICAgICAgICAgIDIKIAorLyogTWF4aW11bSBudW1iZXIgb2YgV2hpbGUoKSBsb29wcyBiZWZvcmUgYWJvcnQgKi8KKworI2RlZmluZSBBQ1BJX01BWF9MT09QX0NPVU5UICAgICAgICAgICAgIDB4RkZGRgorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogQUNQSSBTcGVjaWZpY2F0aW9uIGNvbnN0YW50cyAoRG8gbm90IGNoYW5nZSB1bmxlc3MgdGhlIHNwZWNpZmljYXRpb24gY2hhbmdlcykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY291dHB1dC5oIGIvaW5jbHVkZS9hY3BpL2Fjb3V0cHV0LmgKaW5kZXggMzRmNjAxZS4uNDhlYjRkZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2Fjb3V0cHV0LmgKKysrIGIvaW5jbHVkZS9hY3BpL2Fjb3V0cHV0LmgKQEAgLTM2Niw3ICszNjYsNyBAQAogCUFDUElfVFJBQ0VfRU5UUlkgKG5hbWUsIGFjcGlfdXRfdHJhY2VfdTMyLCB1MzIsIHZhbHVlKQogCiAjZGVmaW5lIEFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKG5hbWUsIHN0cmluZykgXAotCUFDUElfVFJBQ0VfRU5UUlkgKG5hbWUsIGFjcGlfdXRfdHJhY2Vfc3RyLCBjaGFyICosIHN0cmluZykKKwlBQ1BJX1RSQUNFX0VOVFJZIChuYW1lLCBhY3BpX3V0X3RyYWNlX3N0ciwgY29uc3QgY2hhciAqLCBzdHJpbmcpCiAKICNkZWZpbmUgQUNQSV9GVU5DVElPTl9FTlRSWSgpIFwKIAlhY3BpX3V0X3RyYWNrX3N0YWNrX3B0cigpCkBAIC00MjUsNiArNDI1LDkgQEAKICNkZWZpbmUgcmV0dXJuX1BUUihwb2ludGVyKSBcCiAJQUNQSV9UUkFDRV9FWElUIChhY3BpX3V0X3B0cl9leGl0LCB2b2lkICosIHBvaW50ZXIpCiAKKyNkZWZpbmUgcmV0dXJuX1NUUihzdHJpbmcpIFwKKwlBQ1BJX1RSQUNFX0VYSVQgKGFjcGlfdXRfc3RyX2V4aXQsIGNvbnN0IGNoYXIgKiwgc3RyaW5nKQorCiAjZGVmaW5lIHJldHVybl9WQUxVRSh2YWx1ZSkgXAogCUFDUElfVFJBQ0VfRVhJVCAoYWNwaV91dF92YWx1ZV9leGl0LCB1NjQsIHZhbHVlKQogCkBAIC00NzgsNiArNDgxLDcgQEAKICNkZWZpbmUgcmV0dXJuX1ZPSUQgICAgICAgICAgICAgICAgICAgICByZXR1cm4KICNkZWZpbmUgcmV0dXJuX0FDUElfU1RBVFVTKHMpICAgICAgICAgICByZXR1cm4ocykKICNkZWZpbmUgcmV0dXJuX1BUUihzKSAgICAgICAgICAgICAgICAgICByZXR1cm4ocykKKyNkZWZpbmUgcmV0dXJuX1NUUihzKSAgICAgICAgICAgICAgICAgICByZXR1cm4ocykKICNkZWZpbmUgcmV0dXJuX1ZBTFVFKHMpICAgICAgICAgICAgICAgICByZXR1cm4ocykKICNkZWZpbmUgcmV0dXJuX1VJTlQ4KHMpICAgICAgICAgICAgICAgICByZXR1cm4ocykKICNkZWZpbmUgcmV0dXJuX1VJTlQzMihzKSAgICAgICAgICAgICAgICByZXR1cm4ocykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oIGIvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmgKaW5kZXggNTYyNjAzZC4uZjM0MTRjOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmgKQEAgLTM3MSw2ICszNzEsMTIgQEAKIGFjcGlfc3RhdHVzIGFjcGlfb3Nfbm90aWZ5X2NvbW1hbmRfY29tcGxldGUodm9pZCk7CiAjZW5kaWYKIAorI2lmbmRlZiBBQ1BJX1VTRV9BTFRFUk5BVEVfUFJPVE9UWVBFX2FjcGlfb3NfdHJhY2VfcG9pbnQKK3ZvaWQKK2FjcGlfb3NfdHJhY2VfcG9pbnQoYWNwaV90cmFjZV9ldmVudF90eXBlIHR5cGUsCisJCSAgICB1OCBiZWdpbiwgdTggKmFtbCwgY2hhciAqcGF0aG5hbWUpOworI2VuZGlmCisKIC8qCiAgKiBPYnRhaW4gQUNQSSB0YWJsZShzKQogICovCkBAIC00MTYsNDEgKzQyMiw0IEBACiB2b2lkIGFjcGlfb3NfY2xvc2VfZGlyZWN0b3J5KHZvaWQgKmRpcl9oYW5kbGUpOwogI2VuZGlmCiAKLS8qCi0gKiBGaWxlIEkvTyBhbmQgcmVsYXRlZCBzdXBwb3J0Ci0gKi8KLSNpZm5kZWYgQUNQSV9VU0VfQUxURVJOQVRFX1BST1RPVFlQRV9hY3BpX29zX29wZW5fZmlsZQotQUNQSV9GSUxFIGFjcGlfb3Nfb3Blbl9maWxlKGNvbnN0IGNoYXIgKnBhdGgsIHU4IG1vZGVzKTsKLSNlbmRpZgotCi0jaWZuZGVmIEFDUElfVVNFX0FMVEVSTkFURV9QUk9UT1RZUEVfYWNwaV9vc19jbG9zZV9maWxlCi12b2lkIGFjcGlfb3NfY2xvc2VfZmlsZShBQ1BJX0ZJTEUgZmlsZSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBBQ1BJX1VTRV9BTFRFUk5BVEVfUFJPVE9UWVBFX2FjcGlfb3NfcmVhZF9maWxlCi1pbnQKLWFjcGlfb3NfcmVhZF9maWxlKEFDUElfRklMRSBmaWxlLAotCQkgIHZvaWQgKmJ1ZmZlciwgYWNwaV9zaXplIHNpemUsIGFjcGlfc2l6ZSBjb3VudCk7Ci0jZW5kaWYKLQotI2lmbmRlZiBBQ1BJX1VTRV9BTFRFUk5BVEVfUFJPVE9UWVBFX2FjcGlfb3Nfd3JpdGVfZmlsZQotaW50Ci1hY3BpX29zX3dyaXRlX2ZpbGUoQUNQSV9GSUxFIGZpbGUsCi0JCSAgIHZvaWQgKmJ1ZmZlciwgYWNwaV9zaXplIHNpemUsIGFjcGlfc2l6ZSBjb3VudCk7Ci0jZW5kaWYKLQotI2lmbmRlZiBBQ1BJX1VTRV9BTFRFUk5BVEVfUFJPVE9UWVBFX2FjcGlfb3NfZ2V0X2ZpbGVfb2Zmc2V0Ci1sb25nIGFjcGlfb3NfZ2V0X2ZpbGVfb2Zmc2V0KEFDUElfRklMRSBmaWxlKTsKLSNlbmRpZgotCi0jaWZuZGVmIEFDUElfVVNFX0FMVEVSTkFURV9QUk9UT1RZUEVfYWNwaV9vc19zZXRfZmlsZV9vZmZzZXQKLWFjcGlfc3RhdHVzIGFjcGlfb3Nfc2V0X2ZpbGVfb2Zmc2V0KEFDUElfRklMRSBmaWxlLCBsb25nIG9mZnNldCwgdTggZnJvbSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBBQ1BJX1VTRV9BTFRFUk5BVEVfUFJPVE9UWVBFX2FjcGlfb3NfdHJhY2VfcG9pbnQKLXZvaWQKLWFjcGlfb3NfdHJhY2VfcG9pbnQoYWNwaV90cmFjZV9ldmVudF90eXBlIHR5cGUsCi0JCSAgICB1OCBiZWdpbiwgdTggKmFtbCwgY2hhciAqcGF0aG5hbWUpOwotI2VuZGlmCi0KICNlbmRpZgkJCQkvKiBfX0FDUElPU1hGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGl4Zi5oIGIvaW5jbHVkZS9hY3BpL2FjcGl4Zi5oCmluZGV4IDFmZjNhNzYuLmM3YjNhMTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3BpeGYuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwaXhmLmgKQEAgLTQ2LDcgKzQ2LDcgQEAKIAogLyogQ3VycmVudCBBQ1BJQ0Egc3Vic3lzdGVtIHZlcnNpb24gaW4gWVlZWU1NREQgZm9ybWF0ICovCiAKLSNkZWZpbmUgQUNQSV9DQV9WRVJTSU9OICAgICAgICAgICAgICAgICAweDIwMTYwNDIyCisjZGVmaW5lIEFDUElfQ0FfVkVSU0lPTiAgICAgICAgICAgICAgICAgMHgyMDE2MDgzMQogCiAjaW5jbHVkZSA8YWNwaS9hY2NvbmZpZy5oPgogI2luY2x1ZGUgPGFjcGkvYWN0eXBlcy5oPgpAQCAtMTk1LDYgKzE5NSwxMyBAQAogQUNQSV9JTklUX0dMT0JBTCh1OCwgYWNwaV9nYmxfZ3JvdXBfbW9kdWxlX2xldmVsX2NvZGUsIFRSVUUpOwogCiAvKgorICogT3B0aW9uYWxseSBzdXBwb3J0IG1vZHVsZSBsZXZlbCBjb2RlIGJ5IHBhcnNpbmcgdGhlIGVudGlyZSB0YWJsZSBhcworICogYSB0ZXJtX2xpc3QuIERlZmF1bHQgaXMgRkFMU0UsIGRvIG5vdCBleGVjdXRlIGVudGlyZSB0YWJsZSB1bnRpbCBzb21lCisgKiBsb2NrIG9yZGVyIGlzc3VlcyBhcmUgZml4ZWQuCisgKi8KK0FDUElfSU5JVF9HTE9CQUwodTgsIGFjcGlfZ2JsX3BhcnNlX3RhYmxlX2FzX3Rlcm1fbGlzdCwgRkFMU0UpOworCisvKgogICogT3B0aW9uYWxseSB1c2UgMzItYml0IEZBRFQgYWRkcmVzc2VzIGlmIGFuZCB3aGVuIHRoZXJlIGlzIGEgY29uZmxpY3QKICAqIChhZGRyZXNzIG1pc21hdGNoKSBiZXR3ZWVuIHRoZSAzMi1iaXQgYW5kIDY0LWJpdCB2ZXJzaW9ucyBvZiB0aGUKICAqIGFkZHJlc3MuIEFsdGhvdWdoIEFDUElDQSBhZGhlcmVzIHRvIHRoZSBBQ1BJIHNwZWNpZmljYXRpb24gd2hpY2gKQEAgLTQxNiwxOCArNDIzLDE5IEBACiAvKgogICogSW5pdGlhbGl6YXRpb24KICAqLwotQUNQSV9FWFRFUk5BTF9SRVRVUk5fU1RBVFVTKGFjcGlfc3RhdHVzIF9faW5pdAorQUNQSV9FWFRFUk5BTF9SRVRVUk5fU1RBVFVTKGFjcGlfc3RhdHVzIEFDUElfSU5JVF9GVU5DVElPTgogCQkJICAgIGFjcGlfaW5pdGlhbGl6ZV90YWJsZXMoc3RydWN0IGFjcGlfdGFibGVfZGVzYwogCQkJCQkJICAgKmluaXRpYWxfc3RvcmFnZSwKIAkJCQkJCSAgIHUzMiBpbml0aWFsX3RhYmxlX2NvdW50LAogCQkJCQkJICAgdTggYWxsb3dfcmVzaXplKSkKLUFDUElfRVhURVJOQUxfUkVUVVJOX1NUQVRVUyhhY3BpX3N0YXR1cyBfX2luaXQgYWNwaV9pbml0aWFsaXplX3N1YnN5c3RlbSh2b2lkKSkKLQotQUNQSV9FWFRFUk5BTF9SRVRVUk5fU1RBVFVTKGFjcGlfc3RhdHVzIF9faW5pdCBhY3BpX2VuYWJsZV9zdWJzeXN0ZW0odTMyIGZsYWdzKSkKLQotQUNQSV9FWFRFUk5BTF9SRVRVUk5fU1RBVFVTKGFjcGlfc3RhdHVzIF9faW5pdAotCQkJICAgIGFjcGlfaW5pdGlhbGl6ZV9vYmplY3RzKHUzMiBmbGFncykpCi1BQ1BJX0VYVEVSTkFMX1JFVFVSTl9TVEFUVVMoYWNwaV9zdGF0dXMgX19pbml0IGFjcGlfdGVybWluYXRlKHZvaWQpKQorQUNQSV9FWFRFUk5BTF9SRVRVUk5fU1RBVFVTKGFjcGlfc3RhdHVzIEFDUElfSU5JVF9GVU5DVElPTgorCQkJICAgICBhY3BpX2luaXRpYWxpemVfc3Vic3lzdGVtKHZvaWQpKQorQUNQSV9FWFRFUk5BTF9SRVRVUk5fU1RBVFVTKGFjcGlfc3RhdHVzIEFDUElfSU5JVF9GVU5DVElPTgorCQkJICAgICBhY3BpX2VuYWJsZV9zdWJzeXN0ZW0odTMyIGZsYWdzKSkKK0FDUElfRVhURVJOQUxfUkVUVVJOX1NUQVRVUyhhY3BpX3N0YXR1cyBBQ1BJX0lOSVRfRlVOQ1RJT04KKwkJCSAgICAgYWNwaV9pbml0aWFsaXplX29iamVjdHModTMyIGZsYWdzKSkKK0FDUElfRVhURVJOQUxfUkVUVVJOX1NUQVRVUyhhY3BpX3N0YXR1cyBBQ1BJX0lOSVRfRlVOQ1RJT04KKwkJCSAgICAgYWNwaV90ZXJtaW5hdGUodm9pZCkpCiAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzIGdsb2JhbCBpbnRlcmZhY2VzCkBAIC00NjcsNyArNDc1LDcgQEAKIC8qCiAgKiBBQ1BJIHRhYmxlIGxvYWQvdW5sb2FkIGludGVyZmFjZXMKICAqLwotQUNQSV9FWFRFUk5BTF9SRVRVUk5fU1RBVFVTKGFjcGlfc3RhdHVzIF9faW5pdAorQUNQSV9FWFRFUk5BTF9SRVRVUk5fU1RBVFVTKGFjcGlfc3RhdHVzIEFDUElfSU5JVF9GVU5DVElPTgogCQkJICAgIGFjcGlfaW5zdGFsbF90YWJsZShhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKIAkJCQkJICAgICAgIHU4IHBoeXNpY2FsKSkKIApAQCAtNDc2LDE0ICs0ODQsMTcgQEAKIAogQUNQSV9FWFRFUk5BTF9SRVRVUk5fU1RBVFVTKGFjcGlfc3RhdHVzCiAJCQkgICAgYWNwaV91bmxvYWRfcGFyZW50X3RhYmxlKGFjcGlfaGFuZGxlIG9iamVjdCkpCi1BQ1BJX0VYVEVSTkFMX1JFVFVSTl9TVEFUVVMoYWNwaV9zdGF0dXMgX19pbml0IGFjcGlfbG9hZF90YWJsZXModm9pZCkpCisKK0FDUElfRVhURVJOQUxfUkVUVVJOX1NUQVRVUyhhY3BpX3N0YXR1cyBBQ1BJX0lOSVRfRlVOQ1RJT04KKwkJCSAgICBhY3BpX2xvYWRfdGFibGVzKHZvaWQpKQogCiAvKgogICogQUNQSSB0YWJsZSBtYW5pcHVsYXRpb24gaW50ZXJmYWNlcwogICovCi1BQ1BJX0VYVEVSTkFMX1JFVFVSTl9TVEFUVVMoYWNwaV9zdGF0dXMgX19pbml0IGFjcGlfcmVhbGxvY2F0ZV9yb290X3RhYmxlKHZvaWQpKQorQUNQSV9FWFRFUk5BTF9SRVRVUk5fU1RBVFVTKGFjcGlfc3RhdHVzIEFDUElfSU5JVF9GVU5DVElPTgorCQkJICAgIGFjcGlfcmVhbGxvY2F0ZV9yb290X3RhYmxlKHZvaWQpKQogCi1BQ1BJX0VYVEVSTkFMX1JFVFVSTl9TVEFUVVMoYWNwaV9zdGF0dXMgX19pbml0CitBQ1BJX0VYVEVSTkFMX1JFVFVSTl9TVEFUVVMoYWNwaV9zdGF0dXMgQUNQSV9JTklUX0ZVTkNUSU9OCiAJCQkgICAgYWNwaV9maW5kX3Jvb3RfcG9pbnRlcihhY3BpX3BoeXNpY2FsX2FkZHJlc3MKIAkJCQkJCSAgICpyc2RwX2FkZHJlc3MpKQogQUNQSV9FWFRFUk5BTF9SRVRVUk5fU1RBVFVTKGFjcGlfc3RhdHVzCkBAIC03MzIsNiArNzQzLDEwIEBACiAJCQkJCQl1MzIgZ3BlX251bWJlcikpCiAKIEFDUElfSFdfREVQRU5ERU5UX1JFVFVSTl9TVEFUVVMoYWNwaV9zdGF0dXMKKwkJCQlhY3BpX21hc2tfZ3BlKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsCisJCQkJCSAgICAgIHUzMiBncGVfbnVtYmVyLCB1OCBpc19tYXNrZWQpKQorCitBQ1BJX0hXX0RFUEVOREVOVF9SRVRVUk5fU1RBVFVTKGFjcGlfc3RhdHVzCiAJCQkJYWNwaV9tYXJrX2dwZV9mb3Jfd2FrZShhY3BpX2hhbmRsZSBncGVfZGV2aWNlLAogCQkJCQkJICAgICAgIHUzMiBncGVfbnVtYmVyKSkKIApAQCAtOTM1LDkgKzk1MCw2IEBACiAJCQkgICAgICAgYWNwaV90cmFjZV9wb2ludChhY3BpX3RyYWNlX2V2ZW50X3R5cGUgdHlwZSwKIAkJCQkJCXU4IGJlZ2luLAogCQkJCQkJdTggKmFtbCwgY2hhciAqcGF0aG5hbWUpKQotQUNQSV9BUFBfREVQRU5ERU5UX1JFVFVSTl9WT0lEKEFDUElfUFJJTlRGX0xJS0UoMSkKLQkJCQl2b2lkIEFDUElfSU5URVJOQUxfVkFSX1hGQUNFCi0JCQkJYWNwaV9sb2dfZXJyb3IoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pKQogCiBhY3BpX3N0YXR1cyBhY3BpX2luaXRpYWxpemVfZGVidWdnZXIodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3RibC5oIGIvaW5jbHVkZS9hY3BpL2FjdGJsLmgKaW5kZXggYzE5NzAwZS4uMWI5NDllMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjdGJsLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjdGJsLmgKQEAgLTIzMCw2MiArMjMwLDcyIEBACiAvKiBGaWVsZHMgY29tbW9uIHRvIGFsbCB2ZXJzaW9ucyBvZiB0aGUgRkFEVCAqLwogCiBzdHJ1Y3QgYWNwaV90YWJsZV9mYWR0IHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgaGVhZGVyOwkvKiBDb21tb24gQUNQSSB0YWJsZSBoZWFkZXIgKi8KLQl1MzIgZmFjczsJCS8qIDMyLWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIEZBQ1MgKi8KLQl1MzIgZHNkdDsJCS8qIDMyLWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIERTRFQgKi8KLQl1OCBtb2RlbDsJCS8qIFN5c3RlbSBJbnRlcnJ1cHQgTW9kZWwgKEFDUEkgMS4wKSAtIG5vdCB1c2VkIGluIEFDUEkgMi4wKyAqLwotCXU4IHByZWZlcnJlZF9wcm9maWxlOwkvKiBDb252ZXlzIHByZWZlcnJlZCBwb3dlciBtYW5hZ2VtZW50IHByb2ZpbGUgdG8gT1NQTS4gKi8KLQl1MTYgc2NpX2ludGVycnVwdDsJLyogU3lzdGVtIHZlY3RvciBvZiBTQ0kgaW50ZXJydXB0ICovCi0JdTMyIHNtaV9jb21tYW5kOwkvKiAzMi1iaXQgUG9ydCBhZGRyZXNzIG9mIFNNSSBjb21tYW5kIHBvcnQgKi8KLQl1OCBhY3BpX2VuYWJsZTsJCS8qIFZhbHVlIHRvIHdyaXRlIHRvIFNNSV9DTUQgdG8gZW5hYmxlIEFDUEkgKi8KLQl1OCBhY3BpX2Rpc2FibGU7CS8qIFZhbHVlIHRvIHdyaXRlIHRvIFNNSV9DTUQgdG8gZGlzYWJsZSBBQ1BJICovCi0JdTggczRfYmlvc19yZXF1ZXN0OwkvKiBWYWx1ZSB0byB3cml0ZSB0byBTTUlfQ01EIHRvIGVudGVyIFM0QklPUyBzdGF0ZSAqLwotCXU4IHBzdGF0ZV9jb250cm9sOwkvKiBQcm9jZXNzb3IgcGVyZm9ybWFuY2Ugc3RhdGUgY29udHJvbCAqLwotCXUzMiBwbTFhX2V2ZW50X2Jsb2NrOwkvKiAzMi1iaXQgcG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAxYSBFdmVudCBSZWcgQmxrICovCi0JdTMyIHBtMWJfZXZlbnRfYmxvY2s7CS8qIDMyLWJpdCBwb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDFiIEV2ZW50IFJlZyBCbGsgKi8KLQl1MzIgcG0xYV9jb250cm9sX2Jsb2NrOwkvKiAzMi1iaXQgcG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAxYSBDb250cm9sIFJlZyBCbGsgKi8KLQl1MzIgcG0xYl9jb250cm9sX2Jsb2NrOwkvKiAzMi1iaXQgcG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAxYiBDb250cm9sIFJlZyBCbGsgKi8KLQl1MzIgcG0yX2NvbnRyb2xfYmxvY2s7CS8qIDMyLWJpdCBwb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDIgQ29udHJvbCBSZWcgQmxrICovCi0JdTMyIHBtX3RpbWVyX2Jsb2NrOwkvKiAzMi1iaXQgcG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCBUaW1lciBDdHJsIFJlZyBCbGsgKi8KLQl1MzIgZ3BlMF9ibG9jazsJCS8qIDMyLWJpdCBwb3J0IGFkZHJlc3Mgb2YgR2VuZXJhbCBQdXJwb3NlIEV2ZW50IDAgUmVnIEJsayAqLwotCXUzMiBncGUxX2Jsb2NrOwkJLyogMzItYml0IHBvcnQgYWRkcmVzcyBvZiBHZW5lcmFsIFB1cnBvc2UgRXZlbnQgMSBSZWcgQmxrICovCi0JdTggcG0xX2V2ZW50X2xlbmd0aDsJLyogQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgcG0xeF9ldmVudF9ibG9jayAqLwotCXU4IHBtMV9jb250cm9sX2xlbmd0aDsJLyogQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgcG0xeF9jb250cm9sX2Jsb2NrICovCi0JdTggcG0yX2NvbnRyb2xfbGVuZ3RoOwkvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBwbTJfY29udHJvbF9ibG9jayAqLwotCXU4IHBtX3RpbWVyX2xlbmd0aDsJLyogQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgcG1fdGltZXJfYmxvY2sgKi8KLQl1OCBncGUwX2Jsb2NrX2xlbmd0aDsJLyogQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgZ3BlMF9ibG9jayAqLwotCXU4IGdwZTFfYmxvY2tfbGVuZ3RoOwkvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBncGUxX2Jsb2NrICovCi0JdTggZ3BlMV9iYXNlOwkJLyogT2Zmc2V0IGluIEdQRSBudW1iZXIgc3BhY2Ugd2hlcmUgR1BFMSBldmVudHMgc3RhcnQgKi8KLQl1OCBjc3RfY29udHJvbDsJCS8qIFN1cHBvcnQgZm9yIHRoZSBfQ1NUIG9iamVjdCBhbmQgQy1TdGF0ZXMgY2hhbmdlIG5vdGlmaWNhdGlvbiAqLwotCXUxNiBjMl9sYXRlbmN5OwkJLyogV29yc3QgY2FzZSBIVyBsYXRlbmN5IHRvIGVudGVyL2V4aXQgQzIgc3RhdGUgKi8KLQl1MTYgYzNfbGF0ZW5jeTsJCS8qIFdvcnN0IGNhc2UgSFcgbGF0ZW5jeSB0byBlbnRlci9leGl0IEMzIHN0YXRlICovCi0JdTE2IGZsdXNoX3NpemU7CQkvKiBQcm9jZXNzb3IgbWVtb3J5IGNhY2hlIGxpbmUgd2lkdGgsIGluIGJ5dGVzICovCi0JdTE2IGZsdXNoX3N0cmlkZTsJLyogTnVtYmVyIG9mIGZsdXNoIHN0cmlkZXMgdGhhdCBuZWVkIHRvIGJlIHJlYWQgKi8KLQl1OCBkdXR5X29mZnNldDsJCS8qIFByb2Nlc3NvciBkdXR5IGN5Y2xlIGluZGV4IGluIHByb2Nlc3NvciBQX0NOVCByZWcgKi8KLQl1OCBkdXR5X3dpZHRoOwkJLyogUHJvY2Vzc29yIGR1dHkgY3ljbGUgdmFsdWUgYml0IHdpZHRoIGluIFBfQ05UIHJlZ2lzdGVyICovCi0JdTggZGF5X2FsYXJtOwkJLyogSW5kZXggdG8gZGF5LW9mLW1vbnRoIGFsYXJtIGluIFJUQyBDTU9TIFJBTSAqLwotCXU4IG1vbnRoX2FsYXJtOwkJLyogSW5kZXggdG8gbW9udGgtb2YteWVhciBhbGFybSBpbiBSVEMgQ01PUyBSQU0gKi8KLQl1OCBjZW50dXJ5OwkJLyogSW5kZXggdG8gY2VudHVyeSBpbiBSVEMgQ01PUyBSQU0gKi8KLQl1MTYgYm9vdF9mbGFnczsJCS8qIElBLVBDIEJvb3QgQXJjaGl0ZWN0dXJlIEZsYWdzIChzZWUgYmVsb3cgZm9yIGluZGl2aWR1YWwgZmxhZ3MpICovCi0JdTggcmVzZXJ2ZWQ7CQkvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCi0JdTMyIGZsYWdzOwkJLyogTWlzY2VsbGFuZW91cyBmbGFnIGJpdHMgKHNlZSBiZWxvdyBmb3IgaW5kaXZpZHVhbCBmbGFncykgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgcmVzZXRfcmVnaXN0ZXI7CS8qIDY0LWJpdCBhZGRyZXNzIG9mIHRoZSBSZXNldCByZWdpc3RlciAqLwotCXU4IHJlc2V0X3ZhbHVlOwkJLyogVmFsdWUgdG8gd3JpdGUgdG8gdGhlIHJlc2V0X3JlZ2lzdGVyIHBvcnQgdG8gcmVzZXQgdGhlIHN5c3RlbSAqLwotCXUxNiBhcm1fYm9vdF9mbGFnczsJLyogQVJNLVNwZWNpZmljIEJvb3QgRmxhZ3MgKHNlZSBiZWxvdyBmb3IgaW5kaXZpZHVhbCBmbGFncykgKEFDUEkgNS4xKSAqLwotCXU4IG1pbm9yX3JldmlzaW9uOwkvKiBGQURUIE1pbm9yIFJldmlzaW9uIChBQ1BJIDUuMSkgKi8KLQl1NjQgWGZhY3M7CQkvKiA2NC1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBGQUNTICovCi0JdTY0IFhkc2R0OwkJLyogNjQtYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgRFNEVCAqLwotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4cG0xYV9ldmVudF9ibG9jazsJLyogNjQtYml0IEV4dGVuZGVkIFBvd2VyIE1ndCAxYSBFdmVudCBSZWcgQmxrIGFkZHJlc3MgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeHBtMWJfZXZlbnRfYmxvY2s7CS8qIDY0LWJpdCBFeHRlbmRlZCBQb3dlciBNZ3QgMWIgRXZlbnQgUmVnIEJsayBhZGRyZXNzICovCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhwbTFhX2NvbnRyb2xfYmxvY2s7CS8qIDY0LWJpdCBFeHRlbmRlZCBQb3dlciBNZ3QgMWEgQ29udHJvbCBSZWcgQmxrIGFkZHJlc3MgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeHBtMWJfY29udHJvbF9ibG9jazsJLyogNjQtYml0IEV4dGVuZGVkIFBvd2VyIE1ndCAxYiBDb250cm9sIFJlZyBCbGsgYWRkcmVzcyAqLwotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4cG0yX2NvbnRyb2xfYmxvY2s7CS8qIDY0LWJpdCBFeHRlbmRlZCBQb3dlciBNZ3QgMiBDb250cm9sIFJlZyBCbGsgYWRkcmVzcyAqLwotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4cG1fdGltZXJfYmxvY2s7CS8qIDY0LWJpdCBFeHRlbmRlZCBQb3dlciBNZ3QgVGltZXIgQ3RybCBSZWcgQmxrIGFkZHJlc3MgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeGdwZTBfYmxvY2s7CS8qIDY0LWJpdCBFeHRlbmRlZCBHZW5lcmFsIFB1cnBvc2UgRXZlbnQgMCBSZWcgQmxrIGFkZHJlc3MgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeGdwZTFfYmxvY2s7CS8qIDY0LWJpdCBFeHRlbmRlZCBHZW5lcmFsIFB1cnBvc2UgRXZlbnQgMSBSZWcgQmxrIGFkZHJlc3MgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3Mgc2xlZXBfY29udHJvbDsJLyogNjQtYml0IFNsZWVwIENvbnRyb2wgcmVnaXN0ZXIgKEFDUEkgNS4wKSAqLwotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBzbGVlcF9zdGF0dXM7CS8qIDY0LWJpdCBTbGVlcCBTdGF0dXMgcmVnaXN0ZXIgKEFDUEkgNS4wKSAqLwotCXU2NCBoeXBlcnZpc29yX2lkOwkvKiBIeXBlcnZpc29yIFZlbmRvciBJRCAoQUNQSSA2LjApICovCisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyIGhlYWRlcjsJLyogW1YxXSBDb21tb24gQUNQSSB0YWJsZSBoZWFkZXIgKi8KKwl1MzIgZmFjczsJCS8qIFtWMV0gMzItYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgRkFDUyAqLworCXUzMiBkc2R0OwkJLyogW1YxXSAzMi1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBEU0RUICovCisJdTggbW9kZWw7CQkvKiBbVjFdIFN5c3RlbSBJbnRlcnJ1cHQgTW9kZWwgKEFDUEkgMS4wKSAtIG5vdCB1c2VkIGluIEFDUEkgMi4wKyAqLworCXU4IHByZWZlcnJlZF9wcm9maWxlOwkvKiBbVjFdIENvbnZleXMgcHJlZmVycmVkIHBvd2VyIG1hbmFnZW1lbnQgcHJvZmlsZSB0byBPU1BNLiAqLworCXUxNiBzY2lfaW50ZXJydXB0OwkvKiBbVjFdIFN5c3RlbSB2ZWN0b3Igb2YgU0NJIGludGVycnVwdCAqLworCXUzMiBzbWlfY29tbWFuZDsJLyogW1YxXSAzMi1iaXQgUG9ydCBhZGRyZXNzIG9mIFNNSSBjb21tYW5kIHBvcnQgKi8KKwl1OCBhY3BpX2VuYWJsZTsJCS8qIFtWMV0gVmFsdWUgdG8gd3JpdGUgdG8gU01JX0NNRCB0byBlbmFibGUgQUNQSSAqLworCXU4IGFjcGlfZGlzYWJsZTsJLyogW1YxXSBWYWx1ZSB0byB3cml0ZSB0byBTTUlfQ01EIHRvIGRpc2FibGUgQUNQSSAqLworCXU4IHM0X2Jpb3NfcmVxdWVzdDsJLyogW1YxXSBWYWx1ZSB0byB3cml0ZSB0byBTTUlfQ01EIHRvIGVudGVyIFM0QklPUyBzdGF0ZSAqLworCXU4IHBzdGF0ZV9jb250cm9sOwkvKiBbVjFdIFByb2Nlc3NvciBwZXJmb3JtYW5jZSBzdGF0ZSBjb250cm9sICovCisJdTMyIHBtMWFfZXZlbnRfYmxvY2s7CS8qIFtWMV0gMzItYml0IHBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMWEgRXZlbnQgUmVnIEJsayAqLworCXUzMiBwbTFiX2V2ZW50X2Jsb2NrOwkvKiBbVjFdIDMyLWJpdCBwb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDFiIEV2ZW50IFJlZyBCbGsgKi8KKwl1MzIgcG0xYV9jb250cm9sX2Jsb2NrOwkvKiBbVjFdIDMyLWJpdCBwb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDFhIENvbnRyb2wgUmVnIEJsayAqLworCXUzMiBwbTFiX2NvbnRyb2xfYmxvY2s7CS8qIFtWMV0gMzItYml0IHBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMWIgQ29udHJvbCBSZWcgQmxrICovCisJdTMyIHBtMl9jb250cm9sX2Jsb2NrOwkvKiBbVjFdIDMyLWJpdCBwb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDIgQ29udHJvbCBSZWcgQmxrICovCisJdTMyIHBtX3RpbWVyX2Jsb2NrOwkvKiBbVjFdIDMyLWJpdCBwb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IFRpbWVyIEN0cmwgUmVnIEJsayAqLworCXUzMiBncGUwX2Jsb2NrOwkJLyogW1YxXSAzMi1iaXQgcG9ydCBhZGRyZXNzIG9mIEdlbmVyYWwgUHVycG9zZSBFdmVudCAwIFJlZyBCbGsgKi8KKwl1MzIgZ3BlMV9ibG9jazsJCS8qIFtWMV0gMzItYml0IHBvcnQgYWRkcmVzcyBvZiBHZW5lcmFsIFB1cnBvc2UgRXZlbnQgMSBSZWcgQmxrICovCisJdTggcG0xX2V2ZW50X2xlbmd0aDsJLyogW1YxXSBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBwbTF4X2V2ZW50X2Jsb2NrICovCisJdTggcG0xX2NvbnRyb2xfbGVuZ3RoOwkvKiBbVjFdIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IHBtMXhfY29udHJvbF9ibG9jayAqLworCXU4IHBtMl9jb250cm9sX2xlbmd0aDsJLyogW1YxXSBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBwbTJfY29udHJvbF9ibG9jayAqLworCXU4IHBtX3RpbWVyX2xlbmd0aDsJLyogW1YxXSBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBwbV90aW1lcl9ibG9jayAqLworCXU4IGdwZTBfYmxvY2tfbGVuZ3RoOwkvKiBbVjFdIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IGdwZTBfYmxvY2sgKi8KKwl1OCBncGUxX2Jsb2NrX2xlbmd0aDsJLyogW1YxXSBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBncGUxX2Jsb2NrICovCisJdTggZ3BlMV9iYXNlOwkJLyogW1YxXSBPZmZzZXQgaW4gR1BFIG51bWJlciBzcGFjZSB3aGVyZSBHUEUxIGV2ZW50cyBzdGFydCAqLworCXU4IGNzdF9jb250cm9sOwkJLyogW1YxXSBTdXBwb3J0IGZvciB0aGUgX0NTVCBvYmplY3QgYW5kIEMtU3RhdGVzIGNoYW5nZSBub3RpZmljYXRpb24gKi8KKwl1MTYgYzJfbGF0ZW5jeTsJCS8qIFtWMV0gV29yc3QgY2FzZSBIVyBsYXRlbmN5IHRvIGVudGVyL2V4aXQgQzIgc3RhdGUgKi8KKwl1MTYgYzNfbGF0ZW5jeTsJCS8qIFtWMV0gV29yc3QgY2FzZSBIVyBsYXRlbmN5IHRvIGVudGVyL2V4aXQgQzMgc3RhdGUgKi8KKwl1MTYgZmx1c2hfc2l6ZTsJCS8qIFtWMV0gUHJvY2Vzc29yIG1lbW9yeSBjYWNoZSBsaW5lIHdpZHRoLCBpbiBieXRlcyAqLworCXUxNiBmbHVzaF9zdHJpZGU7CS8qIFtWMV0gTnVtYmVyIG9mIGZsdXNoIHN0cmlkZXMgdGhhdCBuZWVkIHRvIGJlIHJlYWQgKi8KKwl1OCBkdXR5X29mZnNldDsJCS8qIFtWMV0gUHJvY2Vzc29yIGR1dHkgY3ljbGUgaW5kZXggaW4gcHJvY2Vzc29yIFBfQ05UIHJlZyAqLworCXU4IGR1dHlfd2lkdGg7CQkvKiBbVjFdIFByb2Nlc3NvciBkdXR5IGN5Y2xlIHZhbHVlIGJpdCB3aWR0aCBpbiBQX0NOVCByZWdpc3RlciAqLworCXU4IGRheV9hbGFybTsJCS8qIFtWMV0gSW5kZXggdG8gZGF5LW9mLW1vbnRoIGFsYXJtIGluIFJUQyBDTU9TIFJBTSAqLworCXU4IG1vbnRoX2FsYXJtOwkJLyogW1YxXSBJbmRleCB0byBtb250aC1vZi15ZWFyIGFsYXJtIGluIFJUQyBDTU9TIFJBTSAqLworCXU4IGNlbnR1cnk7CQkvKiBbVjFdIEluZGV4IHRvIGNlbnR1cnkgaW4gUlRDIENNT1MgUkFNICovCisJdTE2IGJvb3RfZmxhZ3M7CQkvKiBbVjNdIElBLVBDIEJvb3QgQXJjaGl0ZWN0dXJlIEZsYWdzIChzZWUgYmVsb3cgZm9yIGluZGl2aWR1YWwgZmxhZ3MpICovCisJdTggcmVzZXJ2ZWQ7CQkvKiBbVjFdIFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KKwl1MzIgZmxhZ3M7CQkvKiBbVjFdIE1pc2NlbGxhbmVvdXMgZmxhZyBiaXRzIChzZWUgYmVsb3cgZm9yIGluZGl2aWR1YWwgZmxhZ3MpICovCisJLyogRW5kIG9mIFZlcnNpb24gMSBGQURUIGZpZWxkcyAoQUNQSSAxLjApICovCisKKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgcmVzZXRfcmVnaXN0ZXI7CS8qIFtWM10gNjQtYml0IGFkZHJlc3Mgb2YgdGhlIFJlc2V0IHJlZ2lzdGVyICovCisJdTggcmVzZXRfdmFsdWU7CQkvKiBbVjNdIFZhbHVlIHRvIHdyaXRlIHRvIHRoZSByZXNldF9yZWdpc3RlciBwb3J0IHRvIHJlc2V0IHRoZSBzeXN0ZW0gKi8KKwl1MTYgYXJtX2Jvb3RfZmxhZ3M7CS8qIFtWNV0gQVJNLVNwZWNpZmljIEJvb3QgRmxhZ3MgKHNlZSBiZWxvdyBmb3IgaW5kaXZpZHVhbCBmbGFncykgKEFDUEkgNS4xKSAqLworCXU4IG1pbm9yX3JldmlzaW9uOwkvKiBbVjVdIEZBRFQgTWlub3IgUmV2aXNpb24gKEFDUEkgNS4xKSAqLworCXU2NCBYZmFjczsJCS8qIFtWM10gNjQtYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgRkFDUyAqLworCXU2NCBYZHNkdDsJCS8qIFtWM10gNjQtYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgRFNEVCAqLworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4cG0xYV9ldmVudF9ibG9jazsJLyogW1YzXSA2NC1iaXQgRXh0ZW5kZWQgUG93ZXIgTWd0IDFhIEV2ZW50IFJlZyBCbGsgYWRkcmVzcyAqLworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4cG0xYl9ldmVudF9ibG9jazsJLyogW1YzXSA2NC1iaXQgRXh0ZW5kZWQgUG93ZXIgTWd0IDFiIEV2ZW50IFJlZyBCbGsgYWRkcmVzcyAqLworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4cG0xYV9jb250cm9sX2Jsb2NrOwkvKiBbVjNdIDY0LWJpdCBFeHRlbmRlZCBQb3dlciBNZ3QgMWEgQ29udHJvbCBSZWcgQmxrIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeHBtMWJfY29udHJvbF9ibG9jazsJLyogW1YzXSA2NC1iaXQgRXh0ZW5kZWQgUG93ZXIgTWd0IDFiIENvbnRyb2wgUmVnIEJsayBhZGRyZXNzICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhwbTJfY29udHJvbF9ibG9jazsJLyogW1YzXSA2NC1iaXQgRXh0ZW5kZWQgUG93ZXIgTWd0IDIgQ29udHJvbCBSZWcgQmxrIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeHBtX3RpbWVyX2Jsb2NrOwkvKiBbVjNdIDY0LWJpdCBFeHRlbmRlZCBQb3dlciBNZ3QgVGltZXIgQ3RybCBSZWcgQmxrIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeGdwZTBfYmxvY2s7CS8qIFtWM10gNjQtYml0IEV4dGVuZGVkIEdlbmVyYWwgUHVycG9zZSBFdmVudCAwIFJlZyBCbGsgYWRkcmVzcyAqLworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4Z3BlMV9ibG9jazsJLyogW1YzXSA2NC1iaXQgRXh0ZW5kZWQgR2VuZXJhbCBQdXJwb3NlIEV2ZW50IDEgUmVnIEJsayBhZGRyZXNzICovCisJLyogRW5kIG9mIFZlcnNpb24gMyBGQURUIGZpZWxkcyAoQUNQSSAyLjApICovCisKKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3Mgc2xlZXBfY29udHJvbDsJLyogW1Y0XSA2NC1iaXQgU2xlZXAgQ29udHJvbCByZWdpc3RlciAoQUNQSSA1LjApICovCisJLyogRW5kIG9mIFZlcnNpb24gNCBGQURUIGZpZWxkcyAoQUNQSSAzLjAgYW5kIEFDUEkgNC4wKSAoRmllbGQgd2FzIG9yaWdpbmFsbHkgcmVzZXJ2ZWQgaW4gQUNQSSAzLjApICovCisKKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3Mgc2xlZXBfc3RhdHVzOwkvKiBbVjVdIDY0LWJpdCBTbGVlcCBTdGF0dXMgcmVnaXN0ZXIgKEFDUEkgNS4wKSAqLworCS8qIEVuZCBvZiBWZXJzaW9uIDUgRkFEVCBmaWVsZHMgKEFDUEkgNS4wKSAqLworCisJdTY0IGh5cGVydmlzb3JfaWQ7CS8qIFtWNl0gSHlwZXJ2aXNvciBWZW5kb3IgSUQgKEFDUEkgNi4wKSAqLworCS8qIEVuZCBvZiBWZXJzaW9uIDYgRkFEVCBmaWVsZHMgKEFDUEkgNi4wKSAqLworCiB9OwogCiAvKiBNYXNrcyBmb3IgRkFEVCBJQS1QQyBCb290IEFyY2hpdGVjdHVyZSBGbGFncyAoYm9vdF9mbGFncykgW1Z4XT1JbnRyb2R1Y2VkIGluIHRoaXMgRkFEVCByZXZpc2lvbiAqLwpAQCAtMzAxLDggKzMxMSw4IEBACiAKIC8qIE1hc2tzIGZvciBGQURUIEFSTSBCb290IEFyY2hpdGVjdHVyZSBGbGFncyAoYXJtX2Jvb3RfZmxhZ3MpIEFDUEkgNS4xICovCiAKLSNkZWZpbmUgQUNQSV9GQURUX1BTQ0lfQ09NUExJQU5UICAgICgxKQkvKiAwMDogW1Y1K10gUFNDSSAwLjIrIGlzIGltcGxlbWVudGVkICovCi0jZGVmaW5lIEFDUElfRkFEVF9QU0NJX1VTRV9IVkMgICAgICAoMTw8MSkJLyogMDE6IFtWNStdIEhWQyBtdXN0IGJlIHVzZWQgaW5zdGVhZCBvZiBTTUMgYXMgdGhlIFBTQ0kgY29uZHVpdCAqLworI2RlZmluZSBBQ1BJX0ZBRFRfUFNDSV9DT01QTElBTlQgICAgKDEpCS8qIDAwOiBbVjVdIFBTQ0kgMC4yKyBpcyBpbXBsZW1lbnRlZCAqLworI2RlZmluZSBBQ1BJX0ZBRFRfUFNDSV9VU0VfSFZDICAgICAgKDE8PDEpCS8qIDAxOiBbVjVdIEhWQyBtdXN0IGJlIHVzZWQgaW5zdGVhZCBvZiBTTUMgYXMgdGhlIFBTQ0kgY29uZHVpdCAqLwogCiAvKiBNYXNrcyBmb3IgRkFEVCBmbGFncyAqLwogCkBAIC0zOTksMjAgKzQwOSwzNCBAQAogICogbWF0Y2ggdGhlIGV4cGVjdGVkIGxlbmd0aC4gSW4gb3RoZXIgd29yZHMsIHRoZSBsZW5ndGggb2YgdGhlCiAgKiBGQURUIGlzIHRoZSBib3R0b20gbGluZSBhcyB0byB3aGF0IHRoZSB2ZXJzaW9uIHJlYWxseSBpcy4KICAqCi0gKiBGb3IgcmVmZXJlbmNlLCB0aGUgdmFsdWVzIGJlbG93IGFyZSBhcyBmb2xsb3dzOgotICogICAgIEZBRFQgVjEgc2l6ZTogMHgwNzQKLSAqICAgICBGQURUIFYyIHNpemU6IDB4MDg0Ci0gKiAgICAgRkFEVCBWMyBzaXplOiAweDBGNAotICogICAgIEZBRFQgVjQgc2l6ZTogMHgwRjQKLSAqICAgICBGQURUIFY1IHNpemU6IDB4MTBDCi0gKiAgICAgRkFEVCBWNiBzaXplOiAweDExNAorICogTk9URTogVGhlcmUgaXMgbm8gb2ZmaWNpYWx5IHJlbGVhc2VkIFYyIG9mIHRoZSBGQURULiBUaGlzCisgKiB2ZXJzaW9uIHdhcyB1c2VkIG9ubHkgZm9yIHByb3RvdHlwaW5nIGFuZCB0ZXN0aW5nIGR1cmluZyB0aGUKKyAqIDMyLWJpdCB0byA2NC1iaXQgdHJhbnNpdGlvbi4gVjMgd2FzIHRoZSBmaXJzdCBvZmZpY2lhbCA2NC1iaXQKKyAqIHZlcnNpb24gb2YgdGhlIEZBRFQuCisgKgorICogVXBkYXRlIHRoaXMgbGlzdCBvZiBkZWZpbmVzIHdoZW4gYSBuZXcgdmVyc2lvbiBvZiB0aGUgRkFEVCBpcworICogYWRkZWQgdG8gdGhlIEFDUEkgc3BlY2lmaWNhdGlvbi4gTm90ZSB0aGF0IHRoZSBGQURUIHZlcnNpb24gaXMKKyAqIG9ubHkgaW5jcmVtZW50ZWQgd2hlbiBuZXcgZmllbGRzIGFyZSBhcHBlbmRlZCB0byB0aGUgZXhpc3RpbmcKKyAqIHZlcnNpb24uIFRoZXJlZm9yZSwgdGhlIEZBRFQgdmVyc2lvbiBpcyBjb21wZXRlbHkgaW5kZXBlbmRlbnQKKyAqIGZyb20gdGhlIHZlcnNpb24gb2YgdGhlIEFDUEkgc3BlY2lmaWNhdGlvbiB3aGVyZSBpdCBpcworICogZGVmaW5lZC4KKyAqCisgKiBGb3IgcmVmZXJlbmNlLCB0aGUgdmFyaW91cyBGQURUIGxlbmd0aHMgYXJlIGFzIGZvbGxvd3M6CisgKiAgICAgRkFEVCBWMSBzaXplOiAweDA3NCAgICAgIEFDUEkgMS4wCisgKiAgICAgRkFEVCBWMyBzaXplOiAweDBGNCAgICAgIEFDUEkgMi4wCisgKiAgICAgRkFEVCBWNCBzaXplOiAweDEwMCAgICAgIEFDUEkgMy4wIGFuZCBBQ1BJIDQuMAorICogICAgIEZBRFQgVjUgc2l6ZTogMHgxMEMgICAgICBBQ1BJIDUuMAorICogICAgIEZBRFQgVjYgc2l6ZTogMHgxMTQgICAgICBBQ1BJIDYuMAogICovCi0jZGVmaW5lIEFDUElfRkFEVF9WMV9TSVpFICAgICAgICh1MzIpIChBQ1BJX0ZBRFRfT0ZGU0VUIChmbGFncykgKyA0KQotI2RlZmluZSBBQ1BJX0ZBRFRfVjJfU0laRSAgICAgICAodTMyKSAoQUNQSV9GQURUX09GRlNFVCAobWlub3JfcmV2aXNpb24pICsgMSkKLSNkZWZpbmUgQUNQSV9GQURUX1YzX1NJWkUgICAgICAgKHUzMikgKEFDUElfRkFEVF9PRkZTRVQgKHNsZWVwX2NvbnRyb2wpKQotI2RlZmluZSBBQ1BJX0ZBRFRfVjVfU0laRSAgICAgICAodTMyKSAoQUNQSV9GQURUX09GRlNFVCAoaHlwZXJ2aXNvcl9pZCkpCi0jZGVmaW5lIEFDUElfRkFEVF9WNl9TSVpFICAgICAgICh1MzIpIChzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2ZhZHQpKQorI2RlZmluZSBBQ1BJX0ZBRFRfVjFfU0laRSAgICAgICAodTMyKSAoQUNQSV9GQURUX09GRlNFVCAoZmxhZ3MpICsgNCkJLyogQUNQSSAxLjAgKi8KKyNkZWZpbmUgQUNQSV9GQURUX1YzX1NJWkUgICAgICAgKHUzMikgKEFDUElfRkFEVF9PRkZTRVQgKHNsZWVwX2NvbnRyb2wpKQkvKiBBQ1BJIDIuMCAqLworI2RlZmluZSBBQ1BJX0ZBRFRfVjRfU0laRSAgICAgICAodTMyKSAoQUNQSV9GQURUX09GRlNFVCAoc2xlZXBfc3RhdHVzKSkJLyogQUNQSSAzLjAgYW5kIEFDUEkgNC4wICovCisjZGVmaW5lIEFDUElfRkFEVF9WNV9TSVpFICAgICAgICh1MzIpIChBQ1BJX0ZBRFRfT0ZGU0VUIChoeXBlcnZpc29yX2lkKSkJLyogQUNQSSA1LjAgKi8KKyNkZWZpbmUgQUNQSV9GQURUX1Y2X1NJWkUgICAgICAgKHUzMikgKHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfZmFkdCkpCS8qIEFDUEkgNi4wICovCiAKKy8qIFVwZGF0ZSB0aGVzZSB3aGVuIG5ldyBGQURUIHZlcnNpb25zIGFyZSBhZGRlZCAqLworCisjZGVmaW5lIEFDUElfRkFEVF9NQVhfVkVSU0lPTiAgIDYKICNkZWZpbmUgQUNQSV9GQURUX0NPTkZPUk1BTkNFICAgIkFDUEkgNi4xIChGQURUIHZlcnNpb24gNikiCiAKICNlbmRpZgkJCQkvKiBfX0FDVEJMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjdHlwZXMuaCBiL2luY2x1ZGUvYWNwaS9hY3R5cGVzLmgKaW5kZXggY2IzODllZi4uMWQ3OThhYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjdHlwZXMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWN0eXBlcy5oCkBAIC03MzIsMTYgKzczMiwxNyBAQAogICogVGhlIGVuY29kaW5nIG9mIGFjcGlfZXZlbnRfc3RhdHVzIGlzIGlsbHVzdHJhdGVkIGJlbG93LgogICogTm90ZSB0aGF0IGEgc2V0IGJpdCAoMSkgaW5kaWNhdGVzIHRoZSBwcm9wZXJ0eSBpcyBUUlVFCiAgKiAoZS5nLiBpZiBiaXQgMCBpcyBzZXQgdGhlbiB0aGUgZXZlbnQgaXMgZW5hYmxlZCkuCi0gKiArLS0tLS0tLS0tLS0tLSstKy0rLSstKy0rCi0gKiB8ICAgQml0cyAzMTo1IHw0fDN8MnwxfDB8Ci0gKiArLS0tLS0tLS0tLS0tLSstKy0rLSstKy0rCi0gKiAgICAgICAgICB8ICAgICB8IHwgfCB8IHwKLSAqICAgICAgICAgIHwgICAgIHwgfCB8IHwgKy0gRW5hYmxlZD8KLSAqICAgICAgICAgIHwgICAgIHwgfCB8ICstLS0gRW5hYmxlZCBmb3Igd2FrZT8KLSAqICAgICAgICAgIHwgICAgIHwgfCArLS0tLS0gU3RhdHVzIGJpdCBzZXQ/Ci0gKiAgICAgICAgICB8ICAgICB8ICstLS0tLS0tIEVuYWJsZSBiaXQgc2V0PwotICogICAgICAgICAgfCAgICAgKy0tLS0tLS0tLSBIYXMgYSBoYW5kbGVyPwotICogICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSA8UmVzZXJ2ZWQ+CisgKiArLS0tLS0tLS0tLS0tLSstKy0rLSstKy0rLSsKKyAqIHwgICBCaXRzIDMxOjYgfDV8NHwzfDJ8MXwwfAorICogKy0tLS0tLS0tLS0tLS0rLSstKy0rLSstKy0rCisgKiAgICAgICAgICB8ICAgICB8IHwgfCB8IHwgfAorICogICAgICAgICAgfCAgICAgfCB8IHwgfCB8ICstIEVuYWJsZWQ/CisgKiAgICAgICAgICB8ICAgICB8IHwgfCB8ICstLS0gRW5hYmxlZCBmb3Igd2FrZT8KKyAqICAgICAgICAgIHwgICAgIHwgfCB8ICstLS0tLSBTdGF0dXMgYml0IHNldD8KKyAqICAgICAgICAgIHwgICAgIHwgfCArLS0tLS0tLSBFbmFibGUgYml0IHNldD8KKyAqICAgICAgICAgIHwgICAgIHwgKy0tLS0tLS0tLSBIYXMgYSBoYW5kbGVyPworICogICAgICAgICAgfCAgICAgKy0tLS0tLS0tLS0tIE1hc2tlZD8KKyAqICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLSA8UmVzZXJ2ZWQ+CiAgKi8KIHR5cGVkZWYgdTMyIGFjcGlfZXZlbnRfc3RhdHVzOwogCkBAIC03NTEsNiArNzUyLDcgQEAKICNkZWZpbmUgQUNQSV9FVkVOVF9GTEFHX1NUQVRVU19TRVQgICAgICAoYWNwaV9ldmVudF9zdGF0dXMpIDB4MDQKICNkZWZpbmUgQUNQSV9FVkVOVF9GTEFHX0VOQUJMRV9TRVQgICAgICAoYWNwaV9ldmVudF9zdGF0dXMpIDB4MDgKICNkZWZpbmUgQUNQSV9FVkVOVF9GTEFHX0hBU19IQU5ETEVSICAgICAoYWNwaV9ldmVudF9zdGF0dXMpIDB4MTAKKyNkZWZpbmUgQUNQSV9FVkVOVF9GTEFHX01BU0tFRCAgICAgICAgICAoYWNwaV9ldmVudF9zdGF0dXMpIDB4MjAKICNkZWZpbmUgQUNQSV9FVkVOVF9GTEFHX1NFVCAgICAgICAgICAgICBBQ1BJX0VWRU5UX0ZMQUdfU1RBVFVTX1NFVAogCiAvKiBBY3Rpb25zIGZvciBhY3BpX3NldF9ncGUsIGFjcGlfZ3BlX3dha2V1cCwgYWNwaV9od19sb3dfc2V0X2dwZSAqLwpAQCAtNzYxLDE0ICs3NjMsMTUgQEAKIAogLyoKICAqIEdQRSBpbmZvIGZsYWdzIC0gUGVyIEdQRQotICogKy0tLS0tLS0rLSstKy0tLSsKLSAqIHwgIDc6NSAgfDR8M3wyOjB8Ci0gKiArLS0tLS0tLSstKy0rLS0tKwotICogICAgIHwgICAgfCB8ICB8Ci0gKiAgICAgfCAgICB8IHwgICstLSBUeXBlIG9mIGRpc3BhdGNoOnRvIG1ldGhvZCwgaGFuZGxlciwgbm90aWZ5LCBvciBub25lCi0gKiAgICAgfCAgICB8ICstLS0tLSBJbnRlcnJ1cHQgdHlwZTogZWRnZSBvciBsZXZlbCB0cmlnZ2VyZWQKLSAqICAgICB8ICAgICstLS0tLS0tIElzIGEgV2FrZSBHUEUKLSAqICAgICArLS0tLS0tLS0tLS0tIDxSZXNlcnZlZD4KKyAqICstLS0rLSstKy0rLS0tKworICogfDc6Nnw1fDR8M3wyOjB8CisgKiArLS0tKy0rLSstKy0tLSsKKyAqICAgfCAgfCB8IHwgIHwKKyAqICAgfCAgfCB8IHwgICstLSBUeXBlIG9mIGRpc3BhdGNoOnRvIG1ldGhvZCwgaGFuZGxlciwgbm90aWZ5LCBvciBub25lCisgKiAgIHwgIHwgfCArLS0tLS0gSW50ZXJydXB0IHR5cGU6IGVkZ2Ugb3IgbGV2ZWwgdHJpZ2dlcmVkCisgKiAgIHwgIHwgKy0tLS0tLS0gSXMgYSBXYWtlIEdQRQorICogICB8ICArLS0tLS0tLS0tIElzIEdQRSBtYXNrZWQgYnkgdGhlIHNvZnR3YXJlIEdQRSBtYXNraW5nIG1hY2hhbmlzbQorICogICArLS0tLS0tLS0tLS0tIDxSZXNlcnZlZD4KICAqLwogI2RlZmluZSBBQ1BJX0dQRV9ESVNQQVRDSF9OT05FICAgICAgICAgICh1OCkgMHgwMAogI2RlZmluZSBBQ1BJX0dQRV9ESVNQQVRDSF9NRVRIT0QgICAgICAgICh1OCkgMHgwMQpAQCAtMTAzMSwxMiArMTAzNCw2IEBACiAJdTMyIG1ldGhvZF9jb3VudDsKIH07CiAKLS8qIFRhYmxlIEV2ZW50IFR5cGVzICovCi0KLSNkZWZpbmUgQUNQSV9UQUJMRV9FVkVOVF9MT0FEICAgICAgICAgICAweDAKLSNkZWZpbmUgQUNQSV9UQUJMRV9FVkVOVF9VTkxPQUQgICAgICAgICAweDEKLSNkZWZpbmUgQUNQSV9OVU1fVEFCTEVfRVZFTlRTICAgICAgICAgICAyCi0KIC8qCiAgKiBUeXBlcyBzcGVjaWZpYyB0byB0aGUgT1Mgc2VydmljZSBpbnRlcmZhY2VzCiAgKi8KQEAgLTEwODgsOSArMTA4NSwxMyBAQAogdHlwZWRlZgogYWNwaV9zdGF0dXMgKCphY3BpX3RhYmxlX2hhbmRsZXIpICh1MzIgZXZlbnQsIHZvaWQgKnRhYmxlLCB2b2lkICpjb250ZXh0KTsKIAotI2RlZmluZSBBQ1BJX1RBQkxFX0xPQUQgICAgICAgICAgICAgMHgwCi0jZGVmaW5lIEFDUElfVEFCTEVfVU5MT0FEICAgICAgICAgICAweDEKLSNkZWZpbmUgQUNQSV9OVU1fVEFCTEVfRVZFTlRTICAgICAgIDIKKy8qIFRhYmxlIEV2ZW50IFR5cGVzICovCisKKyNkZWZpbmUgQUNQSV9UQUJMRV9FVkVOVF9MT0FEICAgICAgICAgICAweDAKKyNkZWZpbmUgQUNQSV9UQUJMRV9FVkVOVF9VTkxPQUQgICAgICAgICAweDEKKyNkZWZpbmUgQUNQSV9UQUJMRV9FVkVOVF9JTlNUQUxMICAgICAgICAweDIKKyNkZWZpbmUgQUNQSV9UQUJMRV9FVkVOVF9VTklOU1RBTEwgICAgICAweDMKKyNkZWZpbmUgQUNQSV9OVU1fVEFCTEVfRVZFTlRTICAgICAgICAgICA0CiAKIC8qIEFkZHJlc3MgU3BhY2VzIChGb3IgT3BlcmF0aW9uIFJlZ2lvbnMpICovCiAKQEAgLTEyODUsMTUgKzEyODYsNiBAQAogI2RlZmluZSBBQ1BJX09TSV9XSU5fOCAgICAgICAgICAgICAgICAgIDB4MEMKICNkZWZpbmUgQUNQSV9PU0lfV0lOXzEwICAgICAgICAgICAgICAgICAweDBECiAKLS8qIERlZmluaXRpb25zIG9mIGZpbGUgSU8gKi8KLQotI2RlZmluZSBBQ1BJX0ZJTEVfUkVBRElORyAgICAgICAgICAgICAgIDB4MDEKLSNkZWZpbmUgQUNQSV9GSUxFX1dSSVRJTkcgICAgICAgICAgICAgICAweDAyCi0jZGVmaW5lIEFDUElfRklMRV9CSU5BUlkgICAgICAgICAgICAgICAgMHgwNAotCi0jZGVmaW5lIEFDUElfRklMRV9CRUdJTiAgICAgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBBQ1BJX0ZJTEVfRU5EICAgICAgICAgICAgICAgICAgIDB4MDIKLQogLyogRGVmaW5pdGlvbnMgb2YgZ2V0b3B0ICovCiAKICNkZWZpbmUgQUNQSV9PUFRfRU5EICAgICAgICAgICAgICAgICAgICAtMQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2NwcGNfYWNwaS5oIGIvaW5jbHVkZS9hY3BpL2NwcGNfYWNwaS5oCmluZGV4IDI4NDk2NWMuLjQyN2E3YzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9jcHBjX2FjcGkuaAorKysgYi9pbmNsdWRlL2FjcGkvY3BwY19hY3BpLmgKQEAgLTI0LDcgKzI0LDkgQEAKICNkZWZpbmUgQ1BQQ19OVU1fRU5UCTIxCiAjZGVmaW5lIENQUENfUkVWCTIKIAotI2RlZmluZSBQQ0NfQ01EX0NPTVBMRVRFIDEKKyNkZWZpbmUgUENDX0NNRF9DT01QTEVURV9NQVNLCSgxIDw8IDApCisjZGVmaW5lIFBDQ19FUlJPUl9NQVNLCQkoMSA8PCAyKQorCiAjZGVmaW5lIE1BWF9DUENfUkVHX0VOVCAxOQogCiAvKiBDUFBDIHNwZWNpZmljIFBDQyBjb21tYW5kcy4gKi8KQEAgLTQ5LDYgKzUxLDcgQEAKICAqLwogc3RydWN0IGNwY19yZWdpc3Rlcl9yZXNvdXJjZSB7CiAJYWNwaV9vYmplY3RfdHlwZSB0eXBlOworCXU2NCBfX2lvbWVtICpzeXNfbWVtX3ZhZGRyOwogCXVuaW9uIHsKIAkJc3RydWN0IGNwY19yZWcgcmVnOwogCQl1NjQgaW50X3ZhbHVlOwpAQCAtNjAsOCArNjMsMTEgQEAKIAlpbnQgbnVtX2VudHJpZXM7CiAJaW50IHZlcnNpb247CiAJaW50IGNwdV9pZDsKKwlpbnQgd3JpdGVfY21kX3N0YXR1czsKKwlpbnQgd3JpdGVfY21kX2lkOwogCXN0cnVjdCBjcGNfcmVnaXN0ZXJfcmVzb3VyY2UgY3BjX3JlZ3NbTUFYX0NQQ19SRUdfRU5UXTsKIAlzdHJ1Y3QgYWNwaV9wc2RfcGFja2FnZSBkb21haW5faW5mbzsKKwlzdHJ1Y3Qga29iamVjdCBrb2JqOwogfTsKIAogLyogVGhlc2UgYXJlIGluZGV4ZXMgaW50byB0aGUgcGVyLWNwdSBjcGNfcmVnc1tdLiBPcmRlciBpcyBpbXBvcnRhbnQuICovCkBAIC05Niw3ICsxMDIsNiBAQAogc3RydWN0IGNwcGNfcGVyZl9jYXBzIHsKIAl1MzIgaGlnaGVzdF9wZXJmOwogCXUzMiBub21pbmFsX3BlcmY7Ci0JdTMyIHJlZmVyZW5jZV9wZXJmOwogCXUzMiBsb3dlc3RfcGVyZjsKIH07CiAKQEAgLTEwOCwxMyArMTEzLDEzIEBACiAKIHN0cnVjdCBjcHBjX3BlcmZfZmJfY3RycyB7CiAJdTY0IHJlZmVyZW5jZTsKLQl1NjQgcHJldl9yZWZlcmVuY2U7CiAJdTY0IGRlbGl2ZXJlZDsKLQl1NjQgcHJldl9kZWxpdmVyZWQ7CisJdTY0IHJlZmVyZW5jZV9wZXJmOworCXU2NCBjdHJfd3JhcF90aW1lOwogfTsKIAogLyogUGVyIENQVSBjb250YWluZXIgZm9yIHJ1bnRpbWUgQ1BQQyBtYW5hZ2VtZW50LiAqLwotc3RydWN0IGNwdWRhdGEgeworc3RydWN0IGNwcGNfY3B1ZGF0YSB7CiAJaW50IGNwdTsKIAlzdHJ1Y3QgY3BwY19wZXJmX2NhcHMgcGVyZl9jYXBzOwogCXN0cnVjdCBjcHBjX3BlcmZfY3RybHMgcGVyZl9jdHJsczsKQEAgLTEyNyw2ICsxMzIsNyBAQAogZXh0ZXJuIGludCBjcHBjX2dldF9wZXJmX2N0cnMoaW50IGNwdSwgc3RydWN0IGNwcGNfcGVyZl9mYl9jdHJzICpwZXJmX2ZiX2N0cnMpOwogZXh0ZXJuIGludCBjcHBjX3NldF9wZXJmKGludCBjcHUsIHN0cnVjdCBjcHBjX3BlcmZfY3RybHMgKnBlcmZfY3RybHMpOwogZXh0ZXJuIGludCBjcHBjX2dldF9wZXJmX2NhcHMoaW50IGNwdSwgc3RydWN0IGNwcGNfcGVyZl9jYXBzICpjYXBzKTsKLWV4dGVybiBpbnQgYWNwaV9nZXRfcHNkX21hcChzdHJ1Y3QgY3B1ZGF0YSAqKik7CitleHRlcm4gaW50IGFjcGlfZ2V0X3BzZF9tYXAoc3RydWN0IGNwcGNfY3B1ZGF0YSAqKik7CitleHRlcm4gdW5zaWduZWQgaW50IGNwcGNfZ2V0X3RyYW5zaXRpb25fbGF0ZW5jeShpbnQgY3B1KTsKIAogI2VuZGlmIC8qIF9DUFBDX0FDUElfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNlbnYuaCBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2Vudi5oCmluZGV4IDg2YjVhODQuLjM0Y2NlNzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2Vudi5oCisrKyBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2Vudi5oCkBAIC03OCw2ICs3OCw3IEBACiAJKGRlZmluZWQgQUNQSV9FWEFNUExFX0FQUCkKICNkZWZpbmUgQUNQSV9BUFBMSUNBVElPTgogI2RlZmluZSBBQ1BJX1NJTkdMRV9USFJFQURFRAorI2RlZmluZSBVU0VfTkFUSVZFX0FMTE9DQVRFX1pFUk9FRAogI2VuZGlmCiAKIC8qIGlBU0wgY29uZmlndXJhdGlvbiAqLwpAQCAtMTI0LDcgKzEyNSw2IEBACiAKICNpZmRlZiBBQ1BJX0RVTVBfQVBQCiAjZGVmaW5lIEFDUElfVVNFX05BVElWRV9NRU1PUllfTUFQUElORwotI2RlZmluZSBVU0VfTkFUSVZFX0FMTE9DQVRFX1pFUk9FRAogI2VuZGlmCiAKIC8qIGFjcGlfbmFtZXMvRXhhbXBsZSBjb25maWd1cmF0aW9uLiBIYXJkd2FyZSBkaXNhYmxlZCAqLwpAQCAtMTQ5LDcgKzE0OSw2IEBACiAvKiBDb21tb24gZm9yIGFsbCBBQ1BJQ0EgYXBwbGljYXRpb25zICovCiAKICNpZmRlZiBBQ1BJX0FQUExJQ0FUSU9OCi0jZGVmaW5lIEFDUElfVVNFX1NZU1RFTV9DTElCUkFSWQogI2RlZmluZSBBQ1BJX1VTRV9MT0NBTF9DQUNIRQogI2VuZGlmCiAKQEAgLTE2NywxMCArMTY2LDIxIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogSG9zdCBjb25maWd1cmF0aW9uIGZpbGVzLiBUaGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiBmaWxlcyBhcmUgaW5jbHVkZWQKLSAqIGJ5IHRoZSBob3N0IGZpbGVzLgorICogZmlyc3QuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19JTlRFTF9DT01QSUxFUikKKyNpbmNsdWRlIDxhY3BpL3BsYXRmb3JtL2FjZ2NjLmg+CisKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisjaW5jbHVkZSAiYWNtc3ZjLmgiCisKKyNlbGlmIGRlZmluZWQoX19JTlRFTF9DT01QSUxFUikKKyNpbmNsdWRlICJhY2ludGVsLmgiCisKKyNlbmRpZgorCiAjaWYgZGVmaW5lZChfTElOVVgpIHx8IGRlZmluZWQoX19saW51eF9fKQogI2luY2x1ZGUgPGFjcGkvcGxhdGZvcm0vYWNsaW51eC5oPgogCkBAIC0yMTAsMTggKzIyMCwyMCBAQAogI2VsaWYgZGVmaW5lZChfX09TMl9fKQogI2luY2x1ZGUgImFjb3MyLmgiCiAKLSNlbGlmIGRlZmluZWQoX0FFRF9FRkkpCi0jaW5jbHVkZSAiYWNlZmkuaCIKLQotI2VsaWYgZGVmaW5lZChfR05VX0VGSSkKLSNpbmNsdWRlICJhY2VmaS5oIgotCiAjZWxpZiBkZWZpbmVkKF9fSEFJS1VfXykKICNpbmNsdWRlICJhY2hhaWt1LmgiCiAKICNlbGlmIGRlZmluZWQoX19RTlhfXykKICNpbmNsdWRlICJhY3FueC5oIgogCisvKgorICogRUZJIGFwcGxpY2F0aW9ucyBjYW4gYmUgYnVpbHQgd2l0aCAtbm9zdGRsaWIsIGluIHRoaXMgY2FzZSwgaXQgbXVzdCBiZQorICogaW5jbHVkZWQgYWZ0ZXIgaW5jbHVkaW5nIGFsbCBvdGhlciBob3N0IGVudmlyb25tZW50YWwgZGVmaW5pdGlvbnMsIGluCisgKiBvcmRlciB0byBvdmVycmlkZSB0aGUgZGVmaW5pdGlvbnMuCisgKi8KKyNlbGlmIGRlZmluZWQoX0FFRF9FRkkpIHx8IGRlZmluZWQoX0dOVV9FRkkpIHx8IGRlZmluZWQoX0VESzJfRUZJKQorI2luY2x1ZGUgImFjZWZpLmgiCisKICNlbHNlCiAKIC8qIFVua25vd24gZW52aXJvbm1lbnQgKi8KQEAgLTMyNiw3ICszMzgsOCBAQAogICogQUNQSV9VU0VfU1lTVEVNX0NMSUJSQVJZIC0gRGVmaW5lIHRoaXMgaWYgbGlua2luZyB0byBhbiBhY3R1YWwgQyBsaWJyYXJ5LgogICogICAgICBPdGhlcndpc2UsIGxvY2FsIHZlcnNpb25zIG9mIHN0cmluZy9tZW1vcnkgZnVuY3Rpb25zIHdpbGwgYmUgdXNlZC4KICAqIEFDUElfVVNFX1NUQU5EQVJEX0hFQURFUlMgLSBEZWZpbmUgdGhpcyBpZiBsaW5raW5nIHRvIGEgQyBsaWJyYXJ5IGFuZAotICogICAgICB0aGUgc3RhbmRhcmQgaGVhZGVyIGZpbGVzIG1heSBiZSB1c2VkLgorICogICAgICB0aGUgc3RhbmRhcmQgaGVhZGVyIGZpbGVzIG1heSBiZSB1c2VkLiBEZWZpbmluZyB0aGlzIGltcGxpZXMgdGhhdAorICogICAgICBBQ1BJX1VTRV9TWVNURU1fQ0xJQlJBUlkgaGFzIGJlZW4gZGVmaW5lZC4KICAqCiAgKiBUaGUgQUNQSUNBIHN1YnN5c3RlbSBvbmx5IHVzZXMgbG93IGxldmVsIEMgbGlicmFyeSBmdW5jdGlvbnMgdGhhdCBkbyBub3QKICAqIGNhbGwgb3BlcmF0aW5nIHN5c3RlbSBzZXJ2aWNlcyBhbmQgbWF5IHRoZXJlZm9yZSBiZSBpbmxpbmVkIGluIHRoZSBjb2RlLgpAQCAtMzM0LDcgKzM0Nyw2IEBACiAgKiBJdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHRhaWxvciB0aGVzZSBpbmNsdWRlIGZpbGVzIHRvIHRoZSB0YXJnZXQKICAqIGdlbmVyYXRpb24gZW52aXJvbm1lbnQuCiAgKi8KLSNpZmRlZiBBQ1BJX1VTRV9TWVNURU1fQ0xJQlJBUlkKIAogLyogVXNlIHRoZSBzdGFuZGFyZCBDIGxpYnJhcnkgaGVhZGVycy4gV2Ugd2FudCB0byBrZWVwIHRoZXNlIHRvIGEgbWluaW11bS4gKi8KIApAQCAtMzQyLDU3ICszNTQsMjAgQEAKIAogLyogVXNlIHRoZSBzdGFuZGFyZCBoZWFkZXJzIGZyb20gdGhlIHN0YW5kYXJkIGxvY2F0aW9ucyAqLwogCi0jaW5jbHVkZSA8c3RkYXJnLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpZmRlZiBBQ1BJX0FQUExJQ0FUSU9OCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2VuZGlmCiAKICNlbmRpZgkJCQkvKiBBQ1BJX1VTRV9TVEFOREFSRF9IRUFERVJTICovCiAKLS8qIFdlIHdpbGwgYmUgbGlua2luZyB0byB0aGUgc3RhbmRhcmQgQ2xpYiBmdW5jdGlvbnMgKi8KLQotI2Vsc2UKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE5vdCB1c2luZyBuYXRpdmUgQyBsaWJyYXJ5LCB1c2UgbG9jYWwgaW1wbGVtZW50YXRpb25zCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogVXNlIGxvY2FsIGRlZmluaXRpb25zIG9mIEMgbGlicmFyeSBtYWNyb3MgYW5kIGZ1bmN0aW9ucy4gVGhlc2UgZnVuY3Rpb24KLSAqIGltcGxlbWVudGF0aW9ucyBtYXkgbm90IGJlIGFzIGVmZmljaWVudCBhcyBhbiBpbmxpbmUgb3IgYXNzZW1ibHkgY29kZQotICogaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgYSBuYXRpdmUgQyBsaWJyYXJ5LCBidXQgdGhleSBhcmUgZnVuY3Rpb25hbGx5Ci0gKiBlcXVpdmFsZW50LgotICovCi0jaWZuZGVmIHZhX2FyZwotCi0jaWZuZGVmIF9WQUxJU1QKLSNkZWZpbmUgX1ZBTElTVAotdHlwZWRlZiBjaGFyICp2YV9saXN0OwotI2VuZGlmCQkJCS8qIF9WQUxJU1QgKi8KLQotLyogU3RvcmFnZSBhbGlnbm1lbnQgcHJvcGVydGllcyAqLwotCi0jZGVmaW5lICBfQVVQQk5EICAgICAgICAgICAgICAgIChzaXplb2YgKGFjcGlfbmF0aXZlX2ludCkgLSAxKQotI2RlZmluZSAgX0FETkJORCAgICAgICAgICAgICAgICAoc2l6ZW9mIChhY3BpX25hdGl2ZV9pbnQpIC0gMSkKLQotLyogVmFyaWFibGUgYXJndW1lbnQgbGlzdCBtYWNybyBkZWZpbml0aW9ucyAqLwotCi0jZGVmaW5lIF9ibmQoWCwgYm5kKSAgICAgICAgICAgICgoKHNpemVvZiAoWCkpICsgKGJuZCkpICYgKH4oYm5kKSkpCi0jZGVmaW5lIHZhX2FyZyhhcCwgVCkgICAgICAgICAgICgqKFQgKikoKChhcCkgKz0gKF9ibmQgKFQsIF9BVVBCTkQpKSkgLSAoX2JuZCAoVCxfQUROQk5EKSkpKQotI2RlZmluZSB2YV9lbmQoYXApICAgICAgICAgICAgICAoYXAgPSAodmFfbGlzdCkgTlVMTCkKLSNkZWZpbmUgdmFfc3RhcnQoYXAsIEEpICAgICAgICAgKHZvaWQpICgoYXApID0gKCgoY2hhciAqKSAmKEEpKSArIChfYm5kIChBLF9BVVBCTkQpKSkpCi0KLSNlbmRpZgkJCQkvKiB2YV9hcmcgKi8KLQotLyogVXNlIHRoZSBsb2NhbCAoQUNQSUNBKSBkZWZpbml0aW9ucyBvZiB0aGUgY2xpYiBmdW5jdGlvbnMgKi8KLQotI2VuZGlmCQkJCS8qIEFDUElfVVNFX1NZU1RFTV9DTElCUkFSWSAqLwotCi0jaWZuZGVmIEFDUElfRklMRQogI2lmZGVmIEFDUElfQVBQTElDQVRJT04KLSNpbmNsdWRlIDxzdGRpby5oPgogI2RlZmluZSBBQ1BJX0ZJTEUgICAgICAgICAgICAgIEZJTEUgKgogI2RlZmluZSBBQ1BJX0ZJTEVfT1VUICAgICAgICAgIHN0ZG91dAogI2RlZmluZSBBQ1BJX0ZJTEVfRVJSICAgICAgICAgIHN0ZGVycgpAQCAtNDAxLDYgKzM3Niw5IEBACiAjZGVmaW5lIEFDUElfRklMRV9PVVQgICAgICAgICAgTlVMTAogI2RlZmluZSBBQ1BJX0ZJTEVfRVJSICAgICAgICAgIE5VTEwKICNlbmRpZgkJCQkvKiBBQ1BJX0FQUExJQ0FUSU9OICovCi0jZW5kaWYJCQkJLyogQUNQSV9GSUxFICovCisKKyNpZm5kZWYgQUNQSV9JTklUX0ZVTkNUSU9OCisjZGVmaW5lIEFDUElfSU5JVF9GVU5DVElPTgorI2VuZGlmCiAKICNlbmRpZgkJCQkvKiBfX0FDRU5WX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZW52ZXguaCBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2VudmV4LmgKaW5kZXggNGYxNWMxZC4uYjMxNzFiOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZW52ZXguaAorKysgYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNlbnZleC5oCkBAIC01NiwxOCArNTYsMjUgQEAKICNpZiBkZWZpbmVkKF9MSU5VWCkgfHwgZGVmaW5lZChfX2xpbnV4X18pCiAjaW5jbHVkZSA8YWNwaS9wbGF0Zm9ybS9hY2xpbnV4ZXguaD4KIAotI2VsaWYgZGVmaW5lZChXSU4zMikKLSNpbmNsdWRlICJhY3dpbmV4LmgiCi0KLSNlbGlmIGRlZmluZWQoX0FFRF9FRkkpCi0jaW5jbHVkZSAiYWNlZmlleC5oIgotCi0jZWxpZiBkZWZpbmVkKF9HTlVfRUZJKQotI2luY2x1ZGUgImFjZWZpZXguaCIKLQogI2VsaWYgZGVmaW5lZChfX0RyYWdvbkZseV9fKQogI2luY2x1ZGUgImFjZHJhZ29uZmx5ZXguaCIKIAorLyoKKyAqIEVGSSBhcHBsaWNhdGlvbnMgY2FuIGJlIGJ1aWx0IHdpdGggLW5vc3RkbGliLCBpbiB0aGlzIGNhc2UsIGl0IG11c3QgYmUKKyAqIGluY2x1ZGVkIGFmdGVyIGluY2x1ZGluZyBhbGwgb3RoZXIgaG9zdCBlbnZpcm9ubWVudGFsIGRlZmluaXRpb25zLCBpbgorICogb3JkZXIgdG8gb3ZlcnJpZGUgdGhlIGRlZmluaXRpb25zLgorICovCisjZWxpZiBkZWZpbmVkKF9BRURfRUZJKSB8fCBkZWZpbmVkKF9HTlVfRUZJKSB8fCBkZWZpbmVkKF9FREsyX0VGSSkKKyNpbmNsdWRlICJhY2VmaWV4LmgiCisKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19JTlRFTF9DT01QSUxFUikKKyNpbmNsdWRlICJhY2djY2V4LmgiCisKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisjaW5jbHVkZSAiYWNtc3ZjZXguaCIKKwogI2VuZGlmCiAKIC8qISBbRW5kXSBubyBzb3VyY2UgY29kZSB0cmFuc2xhdGlvbiAhKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2djYy5oIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZ2NjLmgKaW5kZXggYzVhMjE2Yy4uOGY2NmFhYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZ2NjLmgKKysrIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZ2NjLmgKQEAgLTQ0LDYgKzQ0LDEyIEBACiAjaWZuZGVmIF9fQUNHQ0NfSF9fCiAjZGVmaW5lIF9fQUNHQ0NfSF9fCiAKKy8qCisgKiBVc2UgY29tcGlsZXIgc3BlY2lmaWMgPHN0ZGFyZy5oPiBpcyBhIGdvb2QgcHJhY3RpY2UgZm9yIGV2ZW4gd2hlbgorICogLW5vc3RkaW5jIGlzIHNwZWNpZmllZCAoaS5lLiwgQUNQSV9VU0VfU1RBTkRBUkRfSEVBREVSUyB1bmRlZmluZWQuCisgKi8KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKwogI2RlZmluZSBBQ1BJX0lOTElORSAgICAgICAgICAgICBfX2lubGluZV9fCiAKIC8qIEZ1bmN0aW9uIG5hbWUgaXMgdXNlZCBmb3IgZGVidWcgb3V0cHV0LiBOb24tQU5TSSwgY29tcGlsZXItZGVwZW5kZW50ICovCkBAIC02NCwxNyArNzAsNiBAQAogICovCiAjZGVmaW5lIEFDUElfVU5VU0VEX1ZBUiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkKIAotLyoKLSAqIFNvbWUgdmVyc2lvbnMgb2YgZ2NjIGltcGxlbWVudCBzdHJjaHIoKSB3aXRoIGEgYnVnZ3kgbWFjcm8uIFNvLAotICogdW5kZWYgaXQgaGVyZS4gUHJldmVudHMgZXJyb3IgbWVzc2FnZXMgb2YgdGhpcyBmb3JtICh1c3VhbGx5IGZyb20gdGhlCi0gKiBmaWxlIGdldG9wdC5jKToKLSAqCi0gKiBlcnJvcjogbG9naWNhbCAnJiYnIHdpdGggbm9uLXplcm8gY29uc3RhbnQgd2lsbCBhbHdheXMgZXZhbHVhdGUgYXMgdHJ1ZQotICovCi0jaWZkZWYgc3RyY2hyCi0jdW5kZWYgc3RyY2hyCi0jZW5kaWYKLQogLyogR0NDIHN1cHBvcnRzIF9fVkFfQVJHU19fIGluIG1hY3JvcyAqLwogCiAjZGVmaW5lIENPTVBJTEVSX1ZBX01BQ1JPICAgICAgICAgICAgICAgMQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZ2NjZXguaCBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2djY2V4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZlYWQyYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2djY2V4LmgKQEAgLTAsMCArMSw1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE5hbWU6IGFjZ2NjZXguaCAtIEV4dHJhIEdDQyBzcGVjaWZpYyBkZWZpbmVzLCBldGMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNiwgSW50ZWwgQ29ycC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaWZuZGVmIF9fQUNHQ0NFWF9IX18KKyNkZWZpbmUgX19BQ0dDQ0VYX0hfXworCisvKgorICogU29tZSB2ZXJzaW9ucyBvZiBnY2MgaW1wbGVtZW50IHN0cmNocigpIHdpdGggYSBidWdneSBtYWNyby4gU28sCisgKiB1bmRlZiBpdCBoZXJlLiBQcmV2ZW50cyBlcnJvciBtZXNzYWdlcyBvZiB0aGlzIGZvcm0gKHVzdWFsbHkgZnJvbSB0aGUKKyAqIGZpbGUgZ2V0b3B0LmMpOgorICoKKyAqIGVycm9yOiBsb2dpY2FsICcmJicgd2l0aCBub24temVybyBjb25zdGFudCB3aWxsIGFsd2F5cyBldmFsdWF0ZSBhcyB0cnVlCisgKi8KKyNpZmRlZiBzdHJjaHIKKyN1bmRlZiBzdHJjaHIKKyNlbmRpZgorCisjZW5kaWYJCQkJLyogX19BQ0dDQ0VYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXguaCBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2xpbnV4LmgKaW5kZXggOTNiNjFiMS4uYTVkOThkMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXguaAorKysgYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNsaW51eC5oCkBAIC05Miw2ICs5Miw4IEBACiAjaW5jbHVkZSA8YXNtL2FjZW52Lmg+CiAjZW5kaWYKIAorI2RlZmluZSBBQ1BJX0lOSVRfRlVOQ1RJT04gX19pbml0CisKICNpZm5kZWYgQ09ORklHX0FDUEkKIAogLyogRXh0ZXJuYWwgZ2xvYmFscyBmb3IgX19LRVJORUxfXywgc3R1YnMgaXMgbmVlZGVkICovCkBAIC0xNjgsMTMgKzE3MCwyMSBAQAogI2RlZmluZSBBQ1BJX1VTRV9BTFRFUk5BVEVfUFJPVE9UWVBFX2FjcGlfb3NfZ2V0X25leHRfZmlsZW5hbWUKICNkZWZpbmUgQUNQSV9VU0VfQUxURVJOQVRFX1BST1RPVFlQRV9hY3BpX29zX2Nsb3NlX2RpcmVjdG9yeQogCisjZGVmaW5lIEFDUElfTVNHX0VSUk9SICAgICAgICAgIEtFUk5fRVJSICJBQ1BJIEVycm9yOiAiCisjZGVmaW5lIEFDUElfTVNHX0VYQ0VQVElPTiAgICAgIEtFUk5fRVJSICJBQ1BJIEV4Y2VwdGlvbjogIgorI2RlZmluZSBBQ1BJX01TR19XQVJOSU5HICAgICAgICBLRVJOX1dBUk5JTkcgIkFDUEkgV2FybmluZzogIgorI2RlZmluZSBBQ1BJX01TR19JTkZPICAgICAgICAgICBLRVJOX0lORk8gIkFDUEk6ICIKKworI2RlZmluZSBBQ1BJX01TR19CSU9TX0VSUk9SICAgICBLRVJOX0VSUiAiQUNQSSBCSU9TIEVycm9yIChidWcpOiAiCisjZGVmaW5lIEFDUElfTVNHX0JJT1NfV0FSTklORyAgIEtFUk5fV0FSTklORyAiQUNQSSBCSU9TIFdhcm5pbmcgKGJ1Zyk6ICIKKwogI2Vsc2UJCQkJLyogIV9fS0VSTkVMX18gKi8KIAotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGN0eXBlLmg+CisjZGVmaW5lIEFDUElfVVNFX1NUQU5EQVJEX0hFQURFUlMKKworI2lmZGVmIEFDUElfVVNFX1NUQU5EQVJEX0hFQURFUlMKICNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgogCiAvKiBEZWZpbmUvZGlzYWJsZSBrZXJuZWwtc3BlY2lmaWMgZGVjbGFyYXRvcnMgKi8KIApAQCAtMjA1LDggKzIxNSw0IEBACiAKICNlbmRpZgkJCQkvKiBfX0tFUk5FTF9fICovCiAKLS8qIExpbnV4IHVzZXMgR0NDICovCi0KLSNpbmNsdWRlIDxhY3BpL3BsYXRmb3JtL2FjZ2NjLmg+Ci0KICNlbmRpZgkJCQkvKiBfX0FDTElOVVhfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNsaW51eGV4LmggYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNsaW51eGV4LmgKaW5kZXggZjhiYjBkOC4uYTU1MDlkOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXhleC5oCisrKyBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2xpbnV4ZXguaApAQCAtNzEsNyArNzEsNyBAQAogLyoKICAqIE92ZXJyaWRlcyBmb3IgaW4ta2VybmVsIEFDUElDQQogICovCi1hY3BpX3N0YXR1cyBfX2luaXQgYWNwaV9vc19pbml0aWFsaXplKHZvaWQpOworYWNwaV9zdGF0dXMgQUNQSV9JTklUX0ZVTkNUSU9OIGFjcGlfb3NfaW5pdGlhbGl6ZSh2b2lkKTsKIAogYWNwaV9zdGF0dXMgYWNwaV9vc190ZXJtaW5hdGUodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaAppbmRleCBiZmU2YjJlLi5mM2RiMTFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oCkBAIC0zNTksNyArMzU5LDcgQEAKICAqIG9ubGluZWQvb2ZmbGluZWQuIEluIHN1Y2ggY2FzZSB0aGUgZmxhZ3MudGhyb3R0bGluZyB3aWxsIGJlIHVwZGF0ZWQuCiAgKi8KIGV4dGVybiB2b2lkIGFjcGlfcHJvY2Vzc29yX3JlZXZhbHVhdGVfdHN0YXRlKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsCi0JCQl1bnNpZ25lZCBsb25nIGFjdGlvbik7CisJCQlib29sIGlzX2RlYWQpOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9wcm9jZXNzb3JfdGhyb3R0bGluZ19mb3BzOwogZXh0ZXJuIHZvaWQgYWNwaV9wcm9jZXNzb3JfdGhyb3R0bGluZ19pbml0KHZvaWQpOwogI2Vsc2UKQEAgLTM4MCw3ICszODAsNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9wcm9jZXNzb3JfcmVldmFsdWF0ZV90c3RhdGUoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwKLQkJCXVuc2lnbmVkIGxvbmcgYWN0aW9uKSB7fQorCQkJYm9vbCBpc19kZWFkKSB7fQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9wcm9jZXNzb3JfdGhyb3R0bGluZ19pbml0KHZvaWQpIHt9CiAjZW5kaWYJLyogQ09ORklHX0FDUElfQ1BVX0ZSRVFfUFNTICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvdWFjY2Vzcy5oCmluZGV4IDFiZmE2MDIuLjZkZjliMDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvdWFjY2Vzcy5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvdWFjY2Vzcy5oCkBAIC03Miw2ICs3Miw3IEBACiAvKiBSZXR1cm5zIDAgaWYgZXhjZXB0aW9uIG5vdCBmb3VuZCBhbmQgZml4dXAgb3RoZXJ3aXNlLiAgKi8KIGV4dGVybiB1bnNpZ25lZCBsb25nIHNlYXJjaF9leGNlcHRpb25fdGFibGUodW5zaWduZWQgbG9uZyk7CiAKKwogLyoKICAqIGFyY2hpdGVjdHVyZXMgd2l0aCBhbiBNTVUgc2hvdWxkIG92ZXJyaWRlIHRoZXNlIHR3bwogICovCkBAIC0yMzAsMTQgKzIzMSwxOCBAQAogCW1pZ2h0X2ZhdWx0KCk7CQkJCQkJXAogCWFjY2Vzc19vayhWRVJJRllfUkVBRCwgX19wLCBzaXplb2YoKnB0cikpID8JCVwKIAkJX19nZXRfdXNlcigoeCksIChfX3R5cGVvZl9fKCoocHRyKSkgKilfX3ApIDoJXAotCQktRUZBVUxUOwkJCQkJXAorCQkoKHgpID0gKF9fdHlwZW9mX18oKihwdHIpKSkwLC1FRkFVTFQpOwkJXAogfSkKIAogI2lmbmRlZiBfX2dldF91c2VyX2ZuCiBzdGF0aWMgaW5saW5lIGludCBfX2dldF91c2VyX2ZuKHNpemVfdCBzaXplLCBjb25zdCB2b2lkIF9fdXNlciAqcHRyLCB2b2lkICp4KQogewotCXNpemUgPSBfX2NvcHlfZnJvbV91c2VyKHgsIHB0ciwgc2l6ZSk7Ci0JcmV0dXJuIHNpemUgPyAtRUZBVUxUIDogc2l6ZTsKKwlzaXplX3QgbiA9IF9fY29weV9mcm9tX3VzZXIoeCwgcHRyLCBzaXplKTsKKwlpZiAodW5saWtlbHkobikpIHsKKwkJbWVtc2V0KHggKyAoc2l6ZSAtIG4pLCAwLCBuKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCXJldHVybiAwOwogfQogCiAjZGVmaW5lIF9fZ2V0X3VzZXJfZm4oc3osIHUsIGspCV9fZ2V0X3VzZXJfZm4oc3osIHUsIGspCkBAIC0yNTcsMTEgKzI2MiwxMyBAQAogc3RhdGljIGlubGluZSBsb25nIGNvcHlfZnJvbV91c2VyKHZvaWQgKnRvLAogCQljb25zdCB2b2lkIF9fdXNlciAqIGZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKKwl1bnNpZ25lZCBsb25nIHJlcyA9IG47CiAJbWlnaHRfZmF1bHQoKTsKLQlpZiAoYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcm9tLCBuKSkKLQkJcmV0dXJuIF9fY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pOwotCWVsc2UKLQkJcmV0dXJuIG47CisJaWYgKGxpa2VseShhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIG4pKSkKKwkJcmVzID0gX19jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbik7CisJaWYgKHVubGlrZWx5KHJlcykpCisJCW1lbXNldCh0byArIChuIC0gcmVzKSwgMCwgcmVzKTsKKwlyZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgaW5saW5lIGxvbmcgY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svZXh5bm9zNTQxMC5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9leHlub3M1NDEwLmgKaW5kZXggODViNDY3Yi4uNmNiNGU5MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9leHlub3M1NDEwLmgKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9leHlub3M1NDEwLmgKQEAgLTE5LDYgKzE5LDcgQEAKICNkZWZpbmUgQ0xLX0ZPVVRfTVBMTAkJNAogI2RlZmluZSBDTEtfRk9VVF9CUExMCQk1CiAjZGVmaW5lIENMS19GT1VUX0tQTEwJCTYKKyNkZWZpbmUgQ0xLX0ZPVVRfRVBMTAkJNwogCiAvKiBnYXRlIGZvciBzcGVjaWFsIGNsb2NrcyAoc2NsaykgKi8KICNkZWZpbmUgQ0xLX1NDTEtfVUFSVDAJCTEyOApAQCAtNTUsNiArNTYsOCBAQAogI2RlZmluZSBDTEtfTU1DMAkJMzUxCiAjZGVmaW5lIENMS19NTUMxCQkzNTIKICNkZWZpbmUgQ0xLX01NQzIJCTM1MworI2RlZmluZSBDTEtfUERNQTAJCTM2MgorI2RlZmluZSBDTEtfUERNQTEJCTM2MwogI2RlZmluZSBDTEtfVVNCSDIwCQkzNjUKICNkZWZpbmUgQ0xLX1VTQkQzMDAJCTM2NgogI2RlZmluZSBDTEtfVVNCRDMwMQkJMzY3CmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2V4eW5vczU0MjAuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svZXh5bm9zNTQyMC5oCmluZGV4IDE3YWI4MzkuLjZmZDIxYzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svZXh5bm9zNTQyMC5oCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svZXh5bm9zNTQyMC5oCkBAIC0yMTQsNiArMjE0LDkgQEAKICNkZWZpbmUgQ0xLX01PVVRfU1dfQUNMSzQwMCAgICAgNjUxCiAjZGVmaW5lIENMS19NT1VUX1VTRVJfQUNMSzMwMF9HU0NMCTY1MgogI2RlZmluZSBDTEtfTU9VVF9TV19BQ0xLMzAwX0dTQ0wJNjUzCisjZGVmaW5lIENMS19NT1VUX01DTEtfQ0RSRVgJNjU0CisjZGVmaW5lIENMS19NT1VUX0JQTEwJCTY1NQorI2RlZmluZSBDTEtfTU9VVF9NWF9NU1BMTF9DQ09SRQk2NTYKIAogLyogZGl2aWRlciBjbG9ja3MgKi8KICNkZWZpbmUgQ0xLX0RPVVRfUElYRUwJCTc2OApAQCAtMjM5LDggKzI0MiwxNCBAQAogI2RlZmluZSBDTEtfRE9VVF9BQ0xLMzAwX0RJU1AxCTc4OAogI2RlZmluZSBDTEtfRE9VVF9BQ0xLMzAwX0dTQ0wJNzg5CiAjZGVmaW5lIENMS19ET1VUX0FDTEs0MDBfRElTUDEJNzkwCisjZGVmaW5lIENMS19ET1VUX1BDTEtfQ0RSRVgJNzkxCisjZGVmaW5lIENMS19ET1VUX1NDTEtfQ0RSRVgJNzkyCisjZGVmaW5lIENMS19ET1VUX0FDTEtfQ0RSRVgxCTc5MworI2RlZmluZSBDTEtfRE9VVF9DQ0xLX0RSRVgwCTc5NAorI2RlZmluZSBDTEtfRE9VVF9DTEsyWF9QSFkwCTc5NQorI2RlZmluZSBDTEtfRE9VVF9QQ0xLX0NPUkVfTUVNCTc5NgogCiAvKiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBtYXhpbWFsIGNsb2NrIGlkICovCi0jZGVmaW5lIENMS19OUl9DTEtTCQk3OTEKKyNkZWZpbmUgQ0xLX05SX0NMS1MJCTc5NwogCiAjZW5kaWYgLyogX0RUX0JJTkRJTkdTX0NMT0NLX0VYWU5PU181NDIwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svZXh5bm9zNTQ0MC5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9leHlub3M1NDQwLmgKaW5kZXggYzY2ZmM0MC4uODQyY2RjMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9leHlub3M1NDQwLmgKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9leHlub3M1NDQwLmgKQEAgLTE0LDYgKzE0LDggQEAKIAogI2RlZmluZSBDTEtfWFRBTAkJMQogI2RlZmluZSBDTEtfQVJNX0NMSwkJMgorI2RlZmluZSBDTEtfQ1BMTEEJCTMKKyNkZWZpbmUgQ0xLX0NQTExCCQk0CiAjZGVmaW5lIENMS19TUElfQkFVRAkJMTYKICNkZWZpbmUgQ0xLX1BCMF8yNTAJCTE3CiAjZGVmaW5lIENMS19QUjBfMjUwCQkxOApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9neGJiLWFvY2xrYy5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9neGJiLWFvY2xrYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNzUxNDgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2d4YmItYW9jbGtjLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBCYXlMaWJyZSwgU0FTLgorICogQXV0aG9yOiBOZWlsIEFybXN0cm9uZyA8bmFybXN0cm9uZ0BiYXlsaWJyZS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IEJheUxpYnJlLCBTQVMuCisgKiBBdXRob3I6IE5laWwgQXJtc3Ryb25nIDxuYXJtc3Ryb25nQGJheWxpYnJlLmNvbT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIERUX0JJTkRJTkdTX0NMT0NLX0FNTE9HSUNfTUVTT05fR1hCQl9BT0NMSworI2RlZmluZSBEVF9CSU5ESU5HU19DTE9DS19BTUxPR0lDX01FU09OX0dYQkJfQU9DTEsKKworI2RlZmluZSBDTEtJRF9BT19SRU1PVEUJCTAKKyNkZWZpbmUgQ0xLSURfQU9fSTJDX01BU1RFUgkxCisjZGVmaW5lIENMS0lEX0FPX0kyQ19TTEFWRQkyCisjZGVmaW5lIENMS0lEX0FPX1VBUlQxCQkzCisjZGVmaW5lIENMS0lEX0FPX1VBUlQyCQk0CisjZGVmaW5lIENMS0lEX0FPX0lSX0JMQVNURVIJNQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svZ3hiYi1jbGtjLmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2d4YmItY2xrYy5oCmluZGV4IGY4ODlkODAuLmNlNGFkNjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svZ3hiYi1jbGtjLmgKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9neGJiLWNsa2MuaApAQCAtNiw3ICs2LDE0IEBACiAjZGVmaW5lIF9fR1hCQl9DTEtDX0gKIAogI2RlZmluZSBDTEtJRF9DUFVDTEsJCTEKKyNkZWZpbmUgQ0xLSURfSERNSV9QTEwJCTIKKyNkZWZpbmUgQ0xLSURfRkNMS19ESVYyCQk0CisjZGVmaW5lIENMS0lEX0ZDTEtfRElWMwkJNQorI2RlZmluZSBDTEtJRF9GQ0xLX0RJVjQJCTYKICNkZWZpbmUgQ0xLSURfQ0xLODEJCTEyCiAjZGVmaW5lIENMS0lEX0VUSAkJMzYKKyNkZWZpbmUgQ0xLSURfU0RfRU1NQ19BCQk5NAorI2RlZmluZSBDTEtJRF9TRF9FTU1DX0IJCTk1CisjZGVmaW5lIENMS0lEX1NEX0VNTUNfQwkJOTYKIAogI2VuZGlmIC8qIF9fR1hCQl9DTEtDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svaW14NS1jbG9jay5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9pbXg1LWNsb2NrLmgKaW5kZXggZjRiNzQ3OC4uZDM4MmZjNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9pbXg1LWNsb2NrLmgKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9pbXg1LWNsb2NrLmgKQEAgLTIwMSw2ICsyMDEsMTkgQEAKICNkZWZpbmUgSU1YNV9DTEtfU1RFUF9TRUwJCTE4OQogI2RlZmluZSBJTVg1X0NMS19DUFVfUE9ERl9TRUwJCTE5MAogI2RlZmluZSBJTVg1X0NMS19BUk0JCQkxOTEKLSNkZWZpbmUgSU1YNV9DTEtfRU5ECQkJMTkyCisjZGVmaW5lIElNWDVfQ0xLX0ZJUklfUFJFRAkJMTkyCisjZGVmaW5lIElNWDVfQ0xLX0ZJUklfU0VMCQkxOTMKKyNkZWZpbmUgSU1YNV9DTEtfRklSSV9QT0RGCQkxOTQKKyNkZWZpbmUgSU1YNV9DTEtfRklSSV9TRVJJQUxfR0FURQkxOTUKKyNkZWZpbmUgSU1YNV9DTEtfRklSSV9JUEdfR0FURQkJMTk2CisjZGVmaW5lIElNWDVfQ0xLX0NTSTBfTUNMSzFfUFJFRAkxOTcKKyNkZWZpbmUgSU1YNV9DTEtfQ1NJMF9NQ0xLMV9TRUwJCTE5OAorI2RlZmluZSBJTVg1X0NMS19DU0kwX01DTEsxX1BPREYJMTk5CisjZGVmaW5lIElNWDVfQ0xLX0NTSTBfTUNMSzFfR0FURQkyMDAKKyNkZWZpbmUgSU1YNV9DTEtfSUVFRTE1ODhfUFJFRAkJMjAxCisjZGVmaW5lIElNWDVfQ0xLX0lFRUUxNTg4X1NFTAkJMjAyCisjZGVmaW5lIElNWDVfQ0xLX0lFRUUxNTg4X1BPREYJCTIwMworI2RlZmluZSBJTVg1X0NMS19JRUVFMTU4OF9HQVRFCQkyMDQKKyNkZWZpbmUgSU1YNV9DTEtfRU5ECQkJMjA1CiAKICNlbmRpZiAvKiBfX0RUX0JJTkRJTkdTX0NMT0NLX0lNWDVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9pbXg2cWRsLWNsb2NrLmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2lteDZxZGwtY2xvY2suaAppbmRleCAyOTA1MDMzLi5kYTU5ZmQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2lteDZxZGwtY2xvY2suaAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2lteDZxZGwtY2xvY2suaApAQCAtMjY5LDYgKzI2OSw4IEBACiAjZGVmaW5lIElNWDZRRExfQ0xLX1BSRzBfQVBCCQkJMjU2CiAjZGVmaW5lIElNWDZRRExfQ0xLX1BSRzFfQVBCCQkJMjU3CiAjZGVmaW5lIElNWDZRRExfQ0xLX1BSRV9BWEkJCQkyNTgKLSNkZWZpbmUgSU1YNlFETF9DTEtfRU5ECQkJCTI1OQorI2RlZmluZSBJTVg2UURMX0NMS19NTEJfU0VMCQkJMjU5CisjZGVmaW5lIElNWDZRRExfQ0xLX01MQl9QT0RGCQkJMjYwCisjZGVmaW5lIElNWDZRRExfQ0xLX0VORAkJCQkyNjEKIAogI2VuZGlmIC8qIF9fRFRfQklORElOR1NfQ0xPQ0tfSU1YNlFETF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL21heGltLG1heDc3NjIwLmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL21heGltLG1heDc3NjIwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJhYmEyOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svbWF4aW0sbWF4Nzc2MjAuaApAQCAtMCwwICsxLDIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IE5WSURJQSBDT1JQT1JBVElPTi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIERldmljZSBUcmVlIGJpbmRpbmcgY29uc3RhbnRzIGNsb2NrcyBmb3IgdGhlIE1heGltIDc3NjIwIFBNSUMuCisgKi8KKworI2lmbmRlZiBfRFRfQklORElOR1NfQ0xPQ0tfTUFYSU1fTUFYNzc2MjBfQ0xPQ0tfSAorI2RlZmluZSBfRFRfQklORElOR1NfQ0xPQ0tfTUFYSU1fTUFYNzc2MjBfQ0xPQ0tfSAorCisvKiBGaXhlZCByYXRlIGNsb2Nrcy4gKi8KKworI2RlZmluZSBNQVg3NzYyMF9DTEtfMzJLX09VVDAJCTAKKworLyogVG90YWwgbnVtYmVyIG9mIGNsb2Nrcy4gKi8KKyNkZWZpbmUgTUFYNzc2MjBfQ0xLU19OVU0JCShNQVg3NzYyMF9DTEtfMzJLX09VVDAgKyAxKQorCisjZW5kaWYgLyogX0RUX0JJTkRJTkdTX0NMT0NLX01BWElNX01BWDc3NjIwX0NMT0NLX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svbWVzb244Yi1jbGtjLmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL21lc29uOGItY2xrYy5oCmluZGV4IDU5NWE1OGQuLmE1NWZmOGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svbWVzb244Yi1jbGtjLmgKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9tZXNvbjhiLWNsa2MuaApAQCAtMjIsNiArMjIsNCBAQAogI2RlZmluZSBDTEtJRF9NUEVHX1NFTAkJMTQKICNkZWZpbmUgQ0xLSURfTVBFR19ESVYJCTE1CiAKLSNkZWZpbmUgQ0xLX05SX0NMS1MJCShDTEtJRF9NUEVHX0RJViArIDEpCi0KICNlbmRpZiAvKiBfX01FU09OOEJfQ0xLQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL210MjcwMS1jbGsuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svbXQyNzAxLWNsay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNjJjNjcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL210MjcwMS1jbGsuaApAQCAtMCwwICsxLDQ4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBNZWRpYVRlayBJbmMuCisgKiBBdXRob3I6IFNodW5saSBXYW5nIDxzaHVubGkud2FuZ0BtZWRpYXRlay5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX0RUX0JJTkRJTkdTX0NMS19NVDI3MDFfSAorI2RlZmluZSBfRFRfQklORElOR1NfQ0xLX01UMjcwMV9ICisKKy8qIFRPUENLR0VOICovCisjZGVmaW5lIENMS19UT1BfU1lTUExMCQkJCTEKKyNkZWZpbmUgQ0xLX1RPUF9TWVNQTExfRDIJCQkyCisjZGVmaW5lIENMS19UT1BfU1lTUExMX0QzCQkJMworI2RlZmluZSBDTEtfVE9QX1NZU1BMTF9ENQkJCTQKKyNkZWZpbmUgQ0xLX1RPUF9TWVNQTExfRDcJCQk1CisjZGVmaW5lIENMS19UT1BfU1lTUExMMV9EMgkJCTYKKyNkZWZpbmUgQ0xLX1RPUF9TWVNQTEwxX0Q0CQkJNworI2RlZmluZSBDTEtfVE9QX1NZU1BMTDFfRDgJCQk4CisjZGVmaW5lIENMS19UT1BfU1lTUExMMV9EMTYJCQk5CisjZGVmaW5lIENMS19UT1BfU1lTUExMMl9EMgkJCTEwCisjZGVmaW5lIENMS19UT1BfU1lTUExMMl9ENAkJCTExCisjZGVmaW5lIENMS19UT1BfU1lTUExMMl9EOAkJCTEyCisjZGVmaW5lIENMS19UT1BfU1lTUExMM19EMgkJCTEzCisjZGVmaW5lIENMS19UT1BfU1lTUExMM19ENAkJCTE0CisjZGVmaW5lIENMS19UT1BfU1lTUExMNF9EMgkJCTE1CisjZGVmaW5lIENMS19UT1BfU1lTUExMNF9ENAkJCTE2CisjZGVmaW5lIENMS19UT1BfVU5JVlBMTAkJCQkxNworI2RlZmluZSBDTEtfVE9QX1VOSVZQTExfRDIJCQkxOAorI2RlZmluZSBDTEtfVE9QX1VOSVZQTExfRDMJCQkxOQorI2RlZmluZSBDTEtfVE9QX1VOSVZQTExfRDUJCQkyMAorI2RlZmluZSBDTEtfVE9QX1VOSVZQTExfRDcJCQkyMQorI2RlZmluZSBDTEtfVE9QX1VOSVZQTExfRDI2CQkJMjIKKyNkZWZpbmUgQ0xLX1RPUF9VTklWUExMX0Q1MgkJCTIzCisjZGVmaW5lIENMS19UT1BfVU5JVlBMTF9EMTA4CQkJMjQKKyNkZWZpbmUgQ0xLX1RPUF9VU0JfUEhZNDhNCQkJMjUKKyNkZWZpbmUgQ0xLX1RPUF9VTklWUExMMV9EMgkJCTI2CisjZGVmaW5lIENMS19UT1BfVU5JVlBMTDFfRDQJCQkyNworI2RlZmluZSBDTEtfVE9QX1VOSVZQTEwxX0Q4CQkJMjgKKyNkZWZpbmUgQ0xLX1RPUF9VTklWUExMMl9EMgkJCTI5CisjZGVmaW5lIENMS19UT1BfVU5JVlBMTDJfRDQJCQkzMAorI2RlZmluZSBDTEtfVE9QX1VOSVZQTEwyX0Q4CQkJMzEKKyNkZWZpbmUgQ0xLX1RPUF9VTklWUExMMl9EMTYJCQkzMgorI2RlZmluZSBDTEtfVE9QX1VOSVZQTEwyX0QzMgkJCTMzCisjZGVmaW5lIENMS19UT1BfVU5JVlBMTDNfRDIJCQkzNAorI2RlZmluZSBDTEtfVE9QX1VOSVZQTEwzX0Q0CQkJMzUKKyNkZWZpbmUgQ0xLX1RPUF9VTklWUExMM19EOAkJCTM2CisjZGVmaW5lIENMS19UT1BfTVNEQ1BMTAkJCQkzNworI2RlZmluZSBDTEtfVE9QX01TRENQTExfRDIJCQkzOAorI2RlZmluZSBDTEtfVE9QX01TRENQTExfRDQJCQkzOQorI2RlZmluZSBDTEtfVE9QX01TRENQTExfRDgJCQk0MAorI2RlZmluZSBDTEtfVE9QX01NUExMCQkJCTQxCisjZGVmaW5lIENMS19UT1BfTU1QTExfRDIJCQk0MgorI2RlZmluZSBDTEtfVE9QX0RNUExMCQkJCTQzCisjZGVmaW5lIENMS19UT1BfRE1QTExfRDIJCQk0NAorI2RlZmluZSBDTEtfVE9QX0RNUExMX0Q0CQkJNDUKKyNkZWZpbmUgQ0xLX1RPUF9ETVBMTF9YMgkJCTQ2CisjZGVmaW5lIENMS19UT1BfVFZEUExMCQkJCTQ3CisjZGVmaW5lIENMS19UT1BfVFZEUExMX0QyCQkJNDgKKyNkZWZpbmUgQ0xLX1RPUF9UVkRQTExfRDQJCQk0OQorI2RlZmluZSBDTEtfVE9QX1RWRDJQTEwJCQkJNTAKKyNkZWZpbmUgQ0xLX1RPUF9UVkQyUExMX0QyCQkJNTEKKyNkZWZpbmUgQ0xLX1RPUF9IQUREUzJQTExfOThNCQkJNTIKKyNkZWZpbmUgQ0xLX1RPUF9IQUREUzJQTExfMjk0TQkJCTUzCisjZGVmaW5lIENMS19UT1BfSEFERFMyX0ZCCQkJNTQKKyNkZWZpbmUgQ0xLX1RPUF9NSVBJUExMX0QyCQkJNTUKKyNkZWZpbmUgQ0xLX1RPUF9NSVBJUExMX0Q0CQkJNTYKKyNkZWZpbmUgQ0xLX1RPUF9IRE1JUExMCQkJCTU3CisjZGVmaW5lIENMS19UT1BfSERNSVBMTF9EMgkJCTU4CisjZGVmaW5lIENMS19UT1BfSERNSVBMTF9EMwkJCTU5CisjZGVmaW5lIENMS19UT1BfSERNSV9TQ0xfUlgJCQk2MAorI2RlZmluZSBDTEtfVE9QX0hETUlfMF9QSVgzNDBNCQkJNjEKKyNkZWZpbmUgQ0xLX1RPUF9IRE1JXzBfREVFUDM0ME0JCQk2MgorI2RlZmluZSBDTEtfVE9QX0hETUlfMF9QTEwzNDBNCQkJNjMKKyNkZWZpbmUgQ0xLX1RPUF9BVUQxUExMXzk4TQkJCTY0CisjZGVmaW5lIENMS19UT1BfQVVEMlBMTF85ME0JCQk2NQorI2RlZmluZSBDTEtfVE9QX0FVRFBMTAkJCQk2NgorI2RlZmluZSBDTEtfVE9QX0FVRFBMTF9ENAkJCTY3CisjZGVmaW5lIENMS19UT1BfQVVEUExMX0Q4CQkJNjgKKyNkZWZpbmUgQ0xLX1RPUF9BVURQTExfRDE2CQkJNjkKKyNkZWZpbmUgQ0xLX1RPUF9BVURQTExfRDI0CQkJNzAKKyNkZWZpbmUgQ0xLX1RPUF9FVEhQTExfNTAwTQkJCTcxCisjZGVmaW5lIENMS19UT1BfVkRFQ1BMTAkJCQk3MgorI2RlZmluZSBDTEtfVE9QX1ZFTkNQTEwJCQkJNzMKKyNkZWZpbmUgQ0xLX1RPUF9NSVBJUExMCQkJCTc0CisjZGVmaW5lIENMS19UT1BfQVJNUExMXzFQM0cJCQk3NQorCisjZGVmaW5lIENMS19UT1BfTU1fU0VMCQkJCTc2CisjZGVmaW5lIENMS19UT1BfRERSUEhZQ0ZHX1NFTAkJCTc3CisjZGVmaW5lIENMS19UT1BfTUVNX1NFTAkJCQk3OAorI2RlZmluZSBDTEtfVE9QX0FYSV9TRUwJCQkJNzkKKyNkZWZpbmUgQ0xLX1RPUF9DQU1UR19TRUwJCQk4MAorI2RlZmluZSBDTEtfVE9QX01GR19TRUwJCQkJODEKKyNkZWZpbmUgQ0xLX1RPUF9WREVDX1NFTAkJCTgyCisjZGVmaW5lIENMS19UT1BfUFdNX1NFTAkJCQk4MworI2RlZmluZSBDTEtfVE9QX01TREMzMF8wX1NFTAkJCTg0CisjZGVmaW5lIENMS19UT1BfVVNCMjBfU0VMCQkJODUKKyNkZWZpbmUgQ0xLX1RPUF9TUEkwX1NFTAkJCTg2CisjZGVmaW5lIENMS19UT1BfVUFSVF9TRUwJCQk4NworI2RlZmluZSBDTEtfVE9QX0FVRElOVEJVU19TRUwJCQk4OAorI2RlZmluZSBDTEtfVE9QX0FVRElPX1NFTAkJCTg5CisjZGVmaW5lIENMS19UT1BfTVNEQzMwXzJfU0VMCQkJOTAKKyNkZWZpbmUgQ0xLX1RPUF9NU0RDMzBfMV9TRUwJCQk5MQorI2RlZmluZSBDTEtfVE9QX0RQSTFfU0VMCQkJOTIKKyNkZWZpbmUgQ0xLX1RPUF9EUEkwX1NFTAkJCTkzCisjZGVmaW5lIENMS19UT1BfU0NQX1NFTAkJCQk5NAorI2RlZmluZSBDTEtfVE9QX1BNSUNTUElfU0VMCQkJOTUKKyNkZWZpbmUgQ0xLX1RPUF9BUExMX1NFTAkJCTk2CisjZGVmaW5lIENMS19UT1BfSERNSV9TRUwJCQk5NworI2RlZmluZSBDTEtfVE9QX1RWRV9TRUwJCQkJOTgKKyNkZWZpbmUgQ0xLX1RPUF9FTU1DX0hDTEtfU0VMCQkJOTkKKyNkZWZpbmUgQ0xLX1RPUF9ORkkyWF9TRUwJCQkxMDAKKyNkZWZpbmUgQ0xLX1RPUF9SVENfU0VMCQkJCTEwMQorI2RlZmluZSBDTEtfVE9QX09TRF9TRUwJCQkJMTAyCisjZGVmaW5lIENMS19UT1BfTlJfU0VMCQkJCTEwMworI2RlZmluZSBDTEtfVE9QX0RJX1NFTAkJCQkxMDQKKyNkZWZpbmUgQ0xLX1RPUF9GTEFTSF9TRUwJCQkxMDUKKyNkZWZpbmUgQ0xLX1RPUF9BU01fTV9TRUwJCQkxMDYKKyNkZWZpbmUgQ0xLX1RPUF9BU01fSV9TRUwJCQkxMDcKKyNkZWZpbmUgQ0xLX1RPUF9JTlRESVJfU0VMCQkJMTA4CisjZGVmaW5lIENMS19UT1BfSERNSVJYX0JJU1RfU0VMCQkJMTA5CisjZGVmaW5lIENMS19UT1BfRVRISUZfU0VMCQkJMTEwCisjZGVmaW5lIENMS19UT1BfTVNfQ0FSRF9TRUwJCQkxMTEKKyNkZWZpbmUgQ0xLX1RPUF9BU01fSF9TRUwJCQkxMTIKKyNkZWZpbmUgQ0xLX1RPUF9TUEkxX1NFTAkJCTExMworI2RlZmluZSBDTEtfVE9QX0NNU1lTX1NFTAkJCTExNAorI2RlZmluZSBDTEtfVE9QX01TREMzMF8zX1NFTAkJCTExNQorI2RlZmluZSBDTEtfVE9QX0hETUlSWDI2XzI0X1NFTAkJCTExNgorI2RlZmluZSBDTEtfVE9QX0FVRDJEVkRfU0VMCQkJMTE3CisjZGVmaW5lIENMS19UT1BfOEJEQUNfU0VMCQkJMTE4CisjZGVmaW5lIENMS19UT1BfU1BJMl9TRUwJCQkxMTkKKyNkZWZpbmUgQ0xLX1RPUF9BVURfTVVYMV9TRUwJCQkxMjAKKyNkZWZpbmUgQ0xLX1RPUF9BVURfTVVYMl9TRUwJCQkxMjEKKyNkZWZpbmUgQ0xLX1RPUF9BVURQTExfTVVYX1NFTAkJCTEyMgorI2RlZmluZSBDTEtfVE9QX0FVRF9LMV9TUkNfU0VMCQkJMTIzCisjZGVmaW5lIENMS19UT1BfQVVEX0syX1NSQ19TRUwJCQkxMjQKKyNkZWZpbmUgQ0xLX1RPUF9BVURfSzNfU1JDX1NFTAkJCTEyNQorI2RlZmluZSBDTEtfVE9QX0FVRF9LNF9TUkNfU0VMCQkJMTI2CisjZGVmaW5lIENMS19UT1BfQVVEX0s1X1NSQ19TRUwJCQkxMjcKKyNkZWZpbmUgQ0xLX1RPUF9BVURfSzZfU1JDX1NFTAkJCTEyOAorI2RlZmluZSBDTEtfVE9QX1BBRE1DTEtfU0VMCQkJMTI5CisjZGVmaW5lIENMS19UT1BfQVVEX0VYVENLMV9ESVYJCQkxMzAKKyNkZWZpbmUgQ0xLX1RPUF9BVURfRVhUQ0syX0RJVgkJCTEzMQorI2RlZmluZSBDTEtfVE9QX0FVRF9NVVgxX0RJVgkJCTEzMgorI2RlZmluZSBDTEtfVE9QX0FVRF9NVVgyX0RJVgkJCTEzMworI2RlZmluZSBDTEtfVE9QX0FVRF9LMV9TUkNfRElWCQkJMTM0CisjZGVmaW5lIENMS19UT1BfQVVEX0syX1NSQ19ESVYJCQkxMzUKKyNkZWZpbmUgQ0xLX1RPUF9BVURfSzNfU1JDX0RJVgkJCTEzNgorI2RlZmluZSBDTEtfVE9QX0FVRF9LNF9TUkNfRElWCQkJMTM3CisjZGVmaW5lIENMS19UT1BfQVVEX0s1X1NSQ19ESVYJCQkxMzgKKyNkZWZpbmUgQ0xLX1RPUF9BVURfSzZfU1JDX0RJVgkJCTEzOQorI2RlZmluZSBDTEtfVE9QX0FVRF9JMlMxX01DTEsJCQkxNDAKKyNkZWZpbmUgQ0xLX1RPUF9BVURfSTJTMl9NQ0xLCQkJMTQxCisjZGVmaW5lIENMS19UT1BfQVVEX0kyUzNfTUNMSwkJCTE0MgorI2RlZmluZSBDTEtfVE9QX0FVRF9JMlM0X01DTEsJCQkxNDMKKyNkZWZpbmUgQ0xLX1RPUF9BVURfSTJTNV9NQ0xLCQkJMTQ0CisjZGVmaW5lIENMS19UT1BfQVVEX0kyUzZfTUNMSwkJCTE0NQorI2RlZmluZSBDTEtfVE9QX0FVRF80OEtfVElNSU5HCQkJMTQ2CisjZGVmaW5lIENMS19UT1BfQVVEXzQ0S19USU1JTkcJCQkxNDcKKworI2RlZmluZSBDTEtfVE9QXzMyS19JTlRFUk5BTAkJCTE0OAorI2RlZmluZSBDTEtfVE9QXzMyS19FWFRFUk5BTAkJCTE0OQorI2RlZmluZSBDTEtfVE9QX0NMSzI2TV9EOAkJCTE1MAorI2RlZmluZSBDTEtfVE9QXzhCREFDCQkJCTE1MQorI2RlZmluZSBDTEtfVE9QX1dCR19ESUdfNDE2TQkJCTE1MgorI2RlZmluZSBDTEtfVE9QX0RQSQkJCQkxNTMKKyNkZWZpbmUgQ0xLX1RPUF9IRE1JVFhfQ0xLRElHX0NUUwkJMTU0CisjZGVmaW5lIENMS19UT1BfRFNJMF9MTlRDX0RTSQkJCTE1NQorI2RlZmluZSBDTEtfVE9QX0FVRF9FWFQxCQkJMTU2CisjZGVmaW5lIENMS19UT1BfQVVEX0VYVDIJCQkxNTcKKyNkZWZpbmUgQ0xLX1RPUF9ORkkxWF9QQUQJCQkxNTgKKyNkZWZpbmUgQ0xLX1RPUF9OUgkJCQkxNTkKKworLyogQVBNSVhFRFNZUyAqLworCisjZGVmaW5lIENMS19BUE1JWEVEX0FSTVBMTAkJCTEKKyNkZWZpbmUgQ0xLX0FQTUlYRURfTUFJTlBMTAkJCTIKKyNkZWZpbmUgQ0xLX0FQTUlYRURfVU5JVlBMTAkJCTMKKyNkZWZpbmUgQ0xLX0FQTUlYRURfTU1QTEwJCQk0CisjZGVmaW5lIENMS19BUE1JWEVEX01TRENQTEwJCQk1CisjZGVmaW5lIENMS19BUE1JWEVEX1RWRFBMTAkJCTYKKyNkZWZpbmUgQ0xLX0FQTUlYRURfQVVEMVBMTAkJCTcKKyNkZWZpbmUgQ0xLX0FQTUlYRURfVFJHUExMCQkJOAorI2RlZmluZSBDTEtfQVBNSVhFRF9FVEhQTEwJCQk5CisjZGVmaW5lIENMS19BUE1JWEVEX1ZERUNQTEwJCQkxMAorI2RlZmluZSBDTEtfQVBNSVhFRF9IQUREUzJQTEwJCQkxMQorI2RlZmluZSBDTEtfQVBNSVhFRF9BVUQyUExMCQkJMTIKKyNkZWZpbmUgQ0xLX0FQTUlYRURfVFZEMlBMTAkJCTEzCisjZGVmaW5lIENMS19BUE1JWEVEX05SCQkJCTE0CisKKy8qIEREUlBIWSAqLworCisjZGVmaW5lIENMS19ERFJQSFlfVkVOQ1BMTAkJCTEKKyNkZWZpbmUgQ0xLX0REUlBIWV9OUgkJCQkyCisKKy8qIElORlJBQ0ZHICovCisKKyNkZWZpbmUgQ0xLX0lORlJBX0RCRwkJCQkxCisjZGVmaW5lIENMS19JTkZSQV9TTUkJCQkJMgorI2RlZmluZSBDTEtfSU5GUkFfUUFYSV9DTTQJCQkzCisjZGVmaW5lIENMS19JTkZSQV9BVURfU1BMSU5fQgkJCTQKKyNkZWZpbmUgQ0xLX0lORlJBX0FVRElPCQkJCTUKKyNkZWZpbmUgQ0xLX0lORlJBX0VGVVNFCQkJCTYKKyNkZWZpbmUgQ0xLX0lORlJBX0wyQ19TUkFNCQkJNworI2RlZmluZSBDTEtfSU5GUkFfTTRVCQkJCTgKKyNkZWZpbmUgQ0xLX0lORlJBX0NPTk5NQ1UJCQk5CisjZGVmaW5lIENMS19JTkZSQV9UUk5HCQkJCTEwCisjZGVmaW5lIENMS19JTkZSQV9SQU1CVUZJRgkJCTExCisjZGVmaW5lIENMS19JTkZSQV9DUFVNCQkJCTEyCisjZGVmaW5lIENMS19JTkZSQV9LUAkJCQkxMworI2RlZmluZSBDTEtfSU5GUkFfQ0VDCQkJCTE0CisjZGVmaW5lIENMS19JTkZSQV9JUlJYCQkJCTE1CisjZGVmaW5lIENMS19JTkZSQV9QTUlDU1BJCQkJMTYKKyNkZWZpbmUgQ0xLX0lORlJBX1BNSUNXUkFQCQkJMTcKKyNkZWZpbmUgQ0xLX0lORlJBX0REQ0NJCQkJCTE4CisjZGVmaW5lIENMS19JTkZSQV9DTEtfMTNNCQkJMTkKKyNkZWZpbmUgQ0xLX0lORlJBX05SCQkJCTIwCisKKy8qIFBFUklDRkcgKi8KKworI2RlZmluZSBDTEtfUEVSSV9ORkkJCQkJMQorI2RlZmluZSBDTEtfUEVSSV9USEVSTQkJCQkyCisjZGVmaW5lIENMS19QRVJJX1BXTTEJCQkJMworI2RlZmluZSBDTEtfUEVSSV9QV00yCQkJCTQKKyNkZWZpbmUgQ0xLX1BFUklfUFdNMwkJCQk1CisjZGVmaW5lIENMS19QRVJJX1BXTTQJCQkJNgorI2RlZmluZSBDTEtfUEVSSV9QV001CQkJCTcKKyNkZWZpbmUgQ0xLX1BFUklfUFdNNgkJCQk4CisjZGVmaW5lIENMS19QRVJJX1BXTTcJCQkJOQorI2RlZmluZSBDTEtfUEVSSV9QV00JCQkJMTAKKyNkZWZpbmUgQ0xLX1BFUklfVVNCMAkJCQkxMQorI2RlZmluZSBDTEtfUEVSSV9VU0IxCQkJCTEyCisjZGVmaW5lIENMS19QRVJJX0FQX0RNQQkJCQkxMworI2RlZmluZSBDTEtfUEVSSV9NU0RDMzBfMAkJCTE0CisjZGVmaW5lIENMS19QRVJJX01TREMzMF8xCQkJMTUKKyNkZWZpbmUgQ0xLX1BFUklfTVNEQzMwXzIJCQkxNgorI2RlZmluZSBDTEtfUEVSSV9NU0RDMzBfMwkJCTE3CisjZGVmaW5lIENMS19QRVJJX01TREM1MF8zCQkJMTgKKyNkZWZpbmUgQ0xLX1BFUklfTkxJCQkJCTE5CisjZGVmaW5lIENMS19QRVJJX1VBUlQwCQkJCTIwCisjZGVmaW5lIENMS19QRVJJX1VBUlQxCQkJCTIxCisjZGVmaW5lIENMS19QRVJJX1VBUlQyCQkJCTIyCisjZGVmaW5lIENMS19QRVJJX1VBUlQzCQkJCTIzCisjZGVmaW5lIENMS19QRVJJX0JUSUYJCQkJMjQKKyNkZWZpbmUgQ0xLX1BFUklfSTJDMAkJCQkyNQorI2RlZmluZSBDTEtfUEVSSV9JMkMxCQkJCTI2CisjZGVmaW5lIENMS19QRVJJX0kyQzIJCQkJMjcKKyNkZWZpbmUgQ0xLX1BFUklfSTJDMwkJCQkyOAorI2RlZmluZSBDTEtfUEVSSV9BVVhBREMJCQkJMjkKKyNkZWZpbmUgQ0xLX1BFUklfU1BJMAkJCQkzMAorI2RlZmluZSBDTEtfUEVSSV9FVEgJCQkJMzEKKyNkZWZpbmUgQ0xLX1BFUklfVVNCMF9NQ1UJCQkzMgorCisjZGVmaW5lIENMS19QRVJJX1VTQjFfTUNVCQkJMzMKKyNkZWZpbmUgQ0xLX1BFUklfVVNCX1NMVgkJCTM0CisjZGVmaW5lIENMS19QRVJJX0dDUFUJCQkJMzUKKyNkZWZpbmUgQ0xLX1BFUklfTkZJX0VDQwkJCTM2CisjZGVmaW5lIENMS19QRVJJX05GSV9QQUQJCQkzNworI2RlZmluZSBDTEtfUEVSSV9GTEFTSAkJCQkzOAorI2RlZmluZSBDTEtfUEVSSV9IT1NUODlfSU5UCQkJMzkKKyNkZWZpbmUgQ0xLX1BFUklfSE9TVDg5X1NQSQkJCTQwCisjZGVmaW5lIENMS19QRVJJX0hPU1Q4OV9EVkQJCQk0MQorI2RlZmluZSBDTEtfUEVSSV9TUEkxCQkJCTQyCisjZGVmaW5lIENMS19QRVJJX1NQSTIJCQkJNDMKKyNkZWZpbmUgQ0xLX1BFUklfRkNJCQkJCTQ0CisKKyNkZWZpbmUgQ0xLX1BFUklfVUFSVDBfU0VMCQkJNDUKKyNkZWZpbmUgQ0xLX1BFUklfVUFSVDFfU0VMCQkJNDYKKyNkZWZpbmUgQ0xLX1BFUklfVUFSVDJfU0VMCQkJNDcKKyNkZWZpbmUgQ0xLX1BFUklfVUFSVDNfU0VMCQkJNDgKKyNkZWZpbmUgQ0xLX1BFUklfTlIJCQkJNDkKKworLyogQVVESU8gKi8KKworI2RlZmluZSBDTEtfQVVEX0FGRQkJCQkxCisjZGVmaW5lIENMS19BVURfTFJDS19ERVRFQ1QJCQkyCisjZGVmaW5lIENMS19BVURfSTJTCQkJCTMKKyNkZWZpbmUgQ0xLX0FVRF9BUExMX1RVTkVSCQkJNAorI2RlZmluZSBDTEtfQVVEX0hETUkJCQkJNQorI2RlZmluZSBDTEtfQVVEX1NQREYJCQkJNgorI2RlZmluZSBDTEtfQVVEX1NQREYyCQkJCTcKKyNkZWZpbmUgQ0xLX0FVRF9BUExMCQkJCTgKKyNkZWZpbmUgQ0xLX0FVRF9UTUwJCQkJOQorI2RlZmluZSBDTEtfQVVEX0FIQl9JRExFX0VYVAkJCTEwCisjZGVmaW5lIENMS19BVURfQUhCX0lETEVfSU5UCQkJMTEKKworI2RlZmluZSBDTEtfQVVEX0kyU0lOMQkJCQkxMgorI2RlZmluZSBDTEtfQVVEX0kyU0lOMgkJCQkxMworI2RlZmluZSBDTEtfQVVEX0kyU0lOMwkJCQkxNAorI2RlZmluZSBDTEtfQVVEX0kyU0lONAkJCQkxNQorI2RlZmluZSBDTEtfQVVEX0kyU0lONQkJCQkxNgorI2RlZmluZSBDTEtfQVVEX0kyU0lONgkJCQkxNworI2RlZmluZSBDTEtfQVVEX0kyU08xCQkJCTE4CisjZGVmaW5lIENMS19BVURfSTJTTzIJCQkJMTkKKyNkZWZpbmUgQ0xLX0FVRF9JMlNPMwkJCQkyMAorI2RlZmluZSBDTEtfQVVEX0kyU080CQkJCTIxCisjZGVmaW5lIENMS19BVURfSTJTTzUJCQkJMjIKKyNkZWZpbmUgQ0xLX0FVRF9JMlNPNgkJCQkyMworI2RlZmluZSBDTEtfQVVEX0FTUkNJMQkJCQkyNAorI2RlZmluZSBDTEtfQVVEX0FTUkNJMgkJCQkyNQorI2RlZmluZSBDTEtfQVVEX0FTUkNPMQkJCQkyNgorI2RlZmluZSBDTEtfQVVEX0FTUkNPMgkJCQkyNworI2RlZmluZSBDTEtfQVVEX0FTUkMxMQkJCQkyOAorI2RlZmluZSBDTEtfQVVEX0FTUkMxMgkJCQkyOQorI2RlZmluZSBDTEtfQVVEX0hETUlSWAkJCQkzMAorI2RlZmluZSBDTEtfQVVEX0lOVERJUgkJCQkzMQorI2RlZmluZSBDTEtfQVVEX0ExU1lTCQkJCTMyCisjZGVmaW5lIENMS19BVURfQTJTWVMJCQkJMzMKKyNkZWZpbmUgQ0xLX0FVRF9BRkVfQ09OTgkJCTM0CisjZGVmaW5lIENMS19BVURfQUZFX1BDTUlGCQkJMzUKKyNkZWZpbmUgQ0xLX0FVRF9BRkVfTVJHSUYJCQkzNgorCisjZGVmaW5lIENMS19BVURfTU1JRl9VTDEJCQkzNworI2RlZmluZSBDTEtfQVVEX01NSUZfVUwyCQkJMzgKKyNkZWZpbmUgQ0xLX0FVRF9NTUlGX1VMMwkJCTM5CisjZGVmaW5lIENMS19BVURfTU1JRl9VTDQJCQk0MAorI2RlZmluZSBDTEtfQVVEX01NSUZfVUw1CQkJNDEKKyNkZWZpbmUgQ0xLX0FVRF9NTUlGX1VMNgkJCTQyCisjZGVmaW5lIENMS19BVURfTU1JRl9ETDEJCQk0MworI2RlZmluZSBDTEtfQVVEX01NSUZfREwyCQkJNDQKKyNkZWZpbmUgQ0xLX0FVRF9NTUlGX0RMMwkJCTQ1CisjZGVmaW5lIENMS19BVURfTU1JRl9ETDQJCQk0NgorI2RlZmluZSBDTEtfQVVEX01NSUZfREw1CQkJNDcKKyNkZWZpbmUgQ0xLX0FVRF9NTUlGX0RMNgkJCTQ4CisjZGVmaW5lIENMS19BVURfTU1JRl9ETE1DSAkJCTQ5CisjZGVmaW5lIENMS19BVURfTU1JRl9BUkIxCQkJNTAKKyNkZWZpbmUgQ0xLX0FVRF9NTUlGX0FXQjEJCQk1MQorI2RlZmluZSBDTEtfQVVEX01NSUZfQVdCMgkJCTUyCisjZGVmaW5lIENMS19BVURfTU1JRl9EQUkJCQk1MworCisjZGVmaW5lIENMS19BVURfRE1JQzEJCQkJNTQKKyNkZWZpbmUgQ0xLX0FVRF9ETUlDMgkJCQk1NQorI2RlZmluZSBDTEtfQVVEX0FTUkNJMwkJCQk1NgorI2RlZmluZSBDTEtfQVVEX0FTUkNJNAkJCQk1NworI2RlZmluZSBDTEtfQVVEX0FTUkNJNQkJCQk1OAorI2RlZmluZSBDTEtfQVVEX0FTUkNJNgkJCQk1OQorI2RlZmluZSBDTEtfQVVEX0FTUkNPMwkJCQk2MAorI2RlZmluZSBDTEtfQVVEX0FTUkNPNAkJCQk2MQorI2RlZmluZSBDTEtfQVVEX0FTUkNPNQkJCQk2MgorI2RlZmluZSBDTEtfQVVEX0FTUkNPNgkJCQk2MworI2RlZmluZSBDTEtfQVVEX01FTV9BU1JDMQkJCTY0CisjZGVmaW5lIENMS19BVURfTUVNX0FTUkMyCQkJNjUKKyNkZWZpbmUgQ0xLX0FVRF9NRU1fQVNSQzMJCQk2NgorI2RlZmluZSBDTEtfQVVEX01FTV9BU1JDNAkJCTY3CisjZGVmaW5lIENMS19BVURfTUVNX0FTUkM1CQkJNjgKKyNkZWZpbmUgQ0xLX0FVRF9EU0RfRU5DCQkJCTY5CisjZGVmaW5lIENMS19BVURfQVNSQ19CUkcJCQk3MAorI2RlZmluZSBDTEtfQVVEX05SCQkJCTcxCisKKy8qIE1NU1lTICovCisKKyNkZWZpbmUgQ0xLX01NX1NNSV9DT01NT04JCQkxCisjZGVmaW5lIENMS19NTV9TTUlfTEFSQjAJCQkyCisjZGVmaW5lIENMS19NTV9DTURRCQkJCTMKKyNkZWZpbmUgQ0xLX01NX01VVEVYCQkJCTQKKyNkZWZpbmUgQ0xLX01NX0RJU1BfQ09MT1IJCQk1CisjZGVmaW5lIENMS19NTV9ESVNQX0JMUwkJCQk2CisjZGVmaW5lIENMS19NTV9ESVNQX1dETUEJCQk3CisjZGVmaW5lIENMS19NTV9ESVNQX1JETUEJCQk4CisjZGVmaW5lIENMS19NTV9ESVNQX09WTAkJCQk5CisjZGVmaW5lIENMS19NTV9NRFBfVERTSFAJCQkxMAorI2RlZmluZSBDTEtfTU1fTURQX1dST1QJCQkJMTEKKyNkZWZpbmUgQ0xLX01NX01EUF9XRE1BCQkJCTEyCisjZGVmaW5lIENMS19NTV9NRFBfUlNaMQkJCQkxMworI2RlZmluZSBDTEtfTU1fTURQX1JTWjAJCQkJMTQKKyNkZWZpbmUgQ0xLX01NX01EUF9SRE1BCQkJCTE1CisjZGVmaW5lIENMS19NTV9NRFBfQkxTXzI2TQkJCTE2CisjZGVmaW5lIENMS19NTV9DQU1fTURQCQkJCTE3CisjZGVmaW5lIENMS19NTV9GQUtFX0VORwkJCQkxOAorI2RlZmluZSBDTEtfTU1fTVVURVhfMzJLCQkJMTkKKyNkZWZpbmUgQ0xLX01NX0RJU1BfUkRNQTEJCQkyMAorI2RlZmluZSBDTEtfTU1fRElTUF9VRk9FCQkJMjEKKworI2RlZmluZSBDTEtfTU1fRFNJX0VOR0lORQkJCTIyCisjZGVmaW5lIENMS19NTV9EU0lfRElHCQkJCTIzCisjZGVmaW5lIENMS19NTV9EUElfRElHTAkJCQkyNAorI2RlZmluZSBDTEtfTU1fRFBJX0VOR0lORQkJCTI1CisjZGVmaW5lIENMS19NTV9EUEkxX0RJR0wJCQkyNgorI2RlZmluZSBDTEtfTU1fRFBJMV9FTkdJTkUJCQkyNworI2RlZmluZSBDTEtfTU1fVFZFX09VVFBVVAkJCTI4CisjZGVmaW5lIENMS19NTV9UVkVfSU5QVVQJCQkyOQorI2RlZmluZSBDTEtfTU1fSERNSV9QSVhFTAkJCTMwCisjZGVmaW5lIENMS19NTV9IRE1JX1BMTAkJCQkzMQorI2RlZmluZSBDTEtfTU1fSERNSV9BVURJTwkJCTMyCisjZGVmaW5lIENMS19NTV9IRE1JX1NQRElGCQkJMzMKKyNkZWZpbmUgQ0xLX01NX1RWRV9GTU0JCQkJMzQKKyNkZWZpbmUgQ0xLX01NX05SCQkJCTM1CisKKy8qIElNR1NZUyAqLworCisjZGVmaW5lIENMS19JTUdfU01JX0NPTU0JCQkxCisjZGVmaW5lIENMS19JTUdfUkVTWgkJCQkyCisjZGVmaW5lIENMS19JTUdfSlBHREVDX1NNSQkJCTMKKyNkZWZpbmUgQ0xLX0lNR19KUEdERUMJCQkJNAorI2RlZmluZSBDTEtfSU1HX1ZFTkNfTFQJCQkJNQorI2RlZmluZSBDTEtfSU1HX1ZFTkMJCQkJNgorI2RlZmluZSBDTEtfSU1HX05SCQkJCTcKKworLyogVkRFQyAqLworCisjZGVmaW5lIENMS19WREVDX0NLR0VOCQkJCTEKKyNkZWZpbmUgQ0xLX1ZERUNfTEFSQgkJCQkyCisjZGVmaW5lIENMS19WREVDX05SCQkJCTMKKworLyogSElGU1lTICovCisKKyNkZWZpbmUgQ0xLX0hJRlNZU19VU0IwUEhZCQkJMQorI2RlZmluZSBDTEtfSElGU1lTX1VTQjFQSFkJCQkyCisjZGVmaW5lIENMS19ISUZTWVNfUENJRTAJCQkzCisjZGVmaW5lIENMS19ISUZTWVNfUENJRTEJCQk0CisjZGVmaW5lIENMS19ISUZTWVNfUENJRTIJCQk1CisjZGVmaW5lIENMS19ISUZTWVNfTlIJCQkJNgorCisvKiBFVEhTWVMgKi8KKyNkZWZpbmUgQ0xLX0VUSFNZU19IU0RNQQkJCTEKKyNkZWZpbmUgQ0xLX0VUSFNZU19FU1cJCQkJMgorI2RlZmluZSBDTEtfRVRIU1lTX0dQMgkJCQkzCisjZGVmaW5lIENMS19FVEhTWVNfR1AxCQkJCTQKKyNkZWZpbmUgQ0xLX0VUSFNZU19QQ00JCQkJNQorI2RlZmluZSBDTEtfRVRIU1lTX0dETUEJCQkJNgorI2RlZmluZSBDTEtfRVRIU1lTX0kyUwkJCQk3CisjZGVmaW5lIENMS19FVEhTWVNfQ1JZUFRPCQkJOAorI2RlZmluZSBDTEtfRVRIU1lTX05SCQkJCTkKKworLyogQkRQICovCisKKyNkZWZpbmUgQ0xLX0JEUF9CUkdfQkEJCQkJMQorI2RlZmluZSBDTEtfQkRQX0JSR19EUkFNCQkJMgorI2RlZmluZSBDTEtfQkRQX0xBUkJfRFJBTQkJCTMKKyNkZWZpbmUgQ0xLX0JEUF9XUl9WRElfUFhMCQkJNAorI2RlZmluZSBDTEtfQkRQX1dSX1ZESV9EUkFNCQkJNQorI2RlZmluZSBDTEtfQkRQX1dSX0IJCQkJNgorI2RlZmluZSBDTEtfQkRQX0RHSV9JTgkJCQk3CisjZGVmaW5lIENMS19CRFBfREdJX09VVAkJCQk4CisjZGVmaW5lIENMS19CRFBfRk1UX01BU1RfMjcJCQk5CisjZGVmaW5lIENMS19CRFBfRk1UX0IJCQkJMTAKKyNkZWZpbmUgQ0xLX0JEUF9PU0RfQgkJCQkxMQorI2RlZmluZSBDTEtfQkRQX09TRF9EUkFNCQkJMTIKKyNkZWZpbmUgQ0xLX0JEUF9PU0RfQUdFTlQJCQkxMworI2RlZmluZSBDTEtfQkRQX09TRF9QWEwJCQkJMTQKKyNkZWZpbmUgQ0xLX0JEUF9STEVfQgkJCQkxNQorI2RlZmluZSBDTEtfQkRQX1JMRV9BR0VOVAkJCTE2CisjZGVmaW5lIENMS19CRFBfUkxFX0RSQU0JCQkxNworI2RlZmluZSBDTEtfQkRQX0YyN00JCQkJMTgKKyNkZWZpbmUgQ0xLX0JEUF9GMjdNX1ZET1VUCQkJMTkKKyNkZWZpbmUgQ0xLX0JEUF9GMjdfNzRfNzQJCQkyMAorI2RlZmluZSBDTEtfQkRQX0YyRlMJCQkJMjEKKyNkZWZpbmUgQ0xLX0JEUF9GMkZTNzRfMTQ4CQkJMjIKKyNkZWZpbmUgQ0xLX0JEUF9GQgkJCQkyMworI2RlZmluZSBDTEtfQkRQX1ZET19EUkFNCQkJMjQKKyNkZWZpbmUgQ0xLX0JEUF9WRE9fMkZTCQkJCTI1CisjZGVmaW5lIENMS19CRFBfVkRPX0IJCQkJMjYKKyNkZWZpbmUgQ0xLX0JEUF9XUl9ESV9QWEwJCQkyNworI2RlZmluZSBDTEtfQkRQX1dSX0RJX0RSQU0JCQkyOAorI2RlZmluZSBDTEtfQkRQX1dSX0RJX0IJCQkJMjkKKyNkZWZpbmUgQ0xLX0JEUF9OUl9QWEwJCQkJMzAKKyNkZWZpbmUgQ0xLX0JEUF9OUl9EUkFNCQkJCTMxCisjZGVmaW5lIENMS19CRFBfTlJfQgkJCQkzMgorCisjZGVmaW5lIENMS19CRFBfUlhfRgkJCQkzMworI2RlZmluZSBDTEtfQkRQX1JYX1gJCQkJMzQKKyNkZWZpbmUgQ0xLX0JEUF9SWFBEVAkJCQkzNQorI2RlZmluZSBDTEtfQkRQX1JYX0NTQ0xfTgkJCTM2CisjZGVmaW5lIENMS19CRFBfUlhfQ1NDTAkJCQkzNworI2RlZmluZSBDTEtfQkRQX1JYX0REQ1NDTF9OCQkJMzgKKyNkZWZpbmUgQ0xLX0JEUF9SWF9ERENTQ0wJCQkzOQorI2RlZmluZSBDTEtfQkRQX1JYX1ZDTwkJCQk0MAorI2RlZmluZSBDTEtfQkRQX1JYX0RQCQkJCTQxCisjZGVmaW5lIENMS19CRFBfUlhfUAkJCQk0MgorI2RlZmluZSBDTEtfQkRQX1JYX00JCQkJNDMKKyNkZWZpbmUgQ0xLX0JEUF9SWF9QTEwJCQkJNDQKKyNkZWZpbmUgQ0xLX0JEUF9CUkdfUlRfQgkJCTQ1CisjZGVmaW5lIENMS19CRFBfQlJHX1JUX0RSQU0JCQk0NgorI2RlZmluZSBDTEtfQkRQX0xBUkJSVF9EUkFNCQkJNDcKKyNkZWZpbmUgQ0xLX0JEUF9UTURTX1NZTgkJCTQ4CisjZGVmaW5lIENMS19CRFBfSERNSV9NT04JCQk0OQorI2RlZmluZSBDTEtfQkRQX05SCQkJCTUwCisKKyNlbmRpZiAvKiBfRFRfQklORElOR1NfQ0xLX01UMjcwMV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZ2NjLW1kbTk2MTUuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svcWNvbSxnY2MtbWRtOTYxNS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYjJjNDAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZ2NjLW1kbTk2MTUuaApAQCAtMCwwICsxLDMyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIEJheUxpYnJlLCBTQVMuCisgKiBBdXRob3IgOiBOZWlsIEFybXN0cm9uZyA8bmFybXN0cm9uZ0BiYXlsaWJyZS5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9EVF9CSU5ESU5HU19DTEtfTURNX0dDQ185NjE1X0gKKyNkZWZpbmUgX0RUX0JJTkRJTkdTX0NMS19NRE1fR0NDXzk2MTVfSAorCisjZGVmaW5lIEFGQUJfQ0xLX1NSQwkJCQkwCisjZGVmaW5lIEFGQUJfQ09SRV9DTEsJCQkJMQorI2RlZmluZSBTRkFCX01TU19RNl9TV19BX0NMSwkJCTIKKyNkZWZpbmUgU0ZBQl9NU1NfUTZfRldfQV9DTEsJCQkzCisjZGVmaW5lIFFEU1NfU1RNX0NMSwkJCQk0CisjZGVmaW5lIFNDU1NfQV9DTEsJCQkJNQorI2RlZmluZSBTQ1NTX0hfQ0xLCQkJCTYKKyNkZWZpbmUgU0NTU19YT19TUkNfQ0xLCQkJCTcKKyNkZWZpbmUgQUZBQl9FQkkxX0NIMF9BX0NMSwkJCTgKKyNkZWZpbmUgQUZBQl9FQkkxX0NIMV9BX0NMSwkJCTkKKyNkZWZpbmUgQUZBQl9BWElfUzBfRkNMSwkJCTEwCisjZGVmaW5lIEFGQUJfQVhJX1MxX0ZDTEsJCQkxMQorI2RlZmluZSBBRkFCX0FYSV9TMl9GQ0xLCQkJMTIKKyNkZWZpbmUgQUZBQl9BWElfUzNfRkNMSwkJCTEzCisjZGVmaW5lIEFGQUJfQVhJX1M0X0ZDTEsJCQkxNAorI2RlZmluZSBTRkFCX0NPUkVfQ0xLCQkJCTE1CisjZGVmaW5lIFNGQUJfQVhJX1MwX0ZDTEsJCQkxNgorI2RlZmluZSBTRkFCX0FYSV9TMV9GQ0xLCQkJMTcKKyNkZWZpbmUgU0ZBQl9BWElfUzJfRkNMSwkJCTE4CisjZGVmaW5lIFNGQUJfQVhJX1MzX0ZDTEsJCQkxOQorI2RlZmluZSBTRkFCX0FYSV9TNF9GQ0xLCQkJMjAKKyNkZWZpbmUgU0ZBQl9BSEJfUzBfRkNMSwkJCTIxCisjZGVmaW5lIFNGQUJfQUhCX1MxX0ZDTEsJCQkyMgorI2RlZmluZSBTRkFCX0FIQl9TMl9GQ0xLCQkJMjMKKyNkZWZpbmUgU0ZBQl9BSEJfUzNfRkNMSwkJCTI0CisjZGVmaW5lIFNGQUJfQUhCX1M0X0ZDTEsJCQkyNQorI2RlZmluZSBTRkFCX0FIQl9TNV9GQ0xLCQkJMjYKKyNkZWZpbmUgU0ZBQl9BSEJfUzZfRkNMSwkJCTI3CisjZGVmaW5lIFNGQUJfQUhCX1M3X0ZDTEsJCQkyOAorI2RlZmluZSBRRFNTX0FUX0NMS19TUkMJCQkJMjkKKyNkZWZpbmUgUURTU19BVF9DTEsJCQkJMzAKKyNkZWZpbmUgUURTU19UUkFDRUNMS0lOX0NMS19TUkMJCQkzMQorI2RlZmluZSBRRFNTX1RSQUNFQ0xLSU5fQ0xLCQkJMzIKKyNkZWZpbmUgUURTU19UU0NUUl9DTEtfU1JDCQkJMzMKKyNkZWZpbmUgUURTU19UU0NUUl9DTEsJCQkJMzQKKyNkZWZpbmUgU0ZBQl9BRE0wX00wX0FfQ0xLCQkJMzUKKyNkZWZpbmUgU0ZBQl9BRE0wX00xX0FfQ0xLCQkJMzYKKyNkZWZpbmUgU0ZBQl9BRE0wX00yX0hfQ0xLCQkJMzcKKyNkZWZpbmUgQURNMF9DTEsJCQkJMzgKKyNkZWZpbmUgQURNMF9QQlVTX0NMSwkJCQkzOQorI2RlZmluZSBNU1NfWFBVX0NMSwkJCQk0MAorI2RlZmluZSBJTUVNMF9BX0NMSwkJCQk0MQorI2RlZmluZSBRRFNTX0hfQ0xLCQkJCTQyCisjZGVmaW5lIFBDSUVfQV9DTEsJCQkJNDMKKyNkZWZpbmUgUENJRV9BVVhfQ0xLCQkJCTQ0CisjZGVmaW5lIFBDSUVfUEhZX1JFRl9DTEsJCQk0NQorI2RlZmluZSBQQ0lFX0hfQ0xLCQkJCTQ2CisjZGVmaW5lIFNGQUJfQ0xLX1NSQwkJCQk0NworI2RlZmluZSBNQUhCMF9DTEsJCQkJNDgKKyNkZWZpbmUgUTZTV19DTEtfU1JDCQkJCTQ5CisjZGVmaW5lIFE2U1dfQ0xLCQkJCTUwCisjZGVmaW5lIFE2RldfQ0xLX1NSQwkJCQk1MQorI2RlZmluZSBRNkZXX0NMSwkJCQk1MgorI2RlZmluZSBTRkFCX01TU19NX0FfQ0xLCQkJNTMKKyNkZWZpbmUgU0ZBQl9VU0IzX01fQV9DTEsJCQk1NAorI2RlZmluZSBTRkFCX0xQQVNTX1E2X0FfQ0xLCQkJNTUKKyNkZWZpbmUgU0ZBQl9BRkFCX01fQV9DTEsJCQk1NgorI2RlZmluZSBBRkFCX1NGQUJfTTBfQV9DTEsJCQk1NworI2RlZmluZSBBRkFCX1NGQUJfTTFfQV9DTEsJCQk1OAorI2RlZmluZSBTRkFCX1NBVEFfU19IX0NMSwkJCTU5CisjZGVmaW5lIERGQUJfQ0xLX1NSQwkJCQk2MAorI2RlZmluZSBERkFCX0NMSwkJCQk2MQorI2RlZmluZSBTRkFCX0RGQUJfTV9BX0NMSwkJCTYyCisjZGVmaW5lIERGQUJfU0ZBQl9NX0FfQ0xLCQkJNjMKKyNkZWZpbmUgREZBQl9TV0FZMF9IX0NMSwkJCTY0CisjZGVmaW5lIERGQUJfU1dBWTFfSF9DTEsJCQk2NQorI2RlZmluZSBERkFCX0FSQjBfSF9DTEsJCQkJNjYKKyNkZWZpbmUgREZBQl9BUkIxX0hfQ0xLCQkJCTY3CisjZGVmaW5lIFBQU1NfSF9DTEsJCQkJNjgKKyNkZWZpbmUgUFBTU19QUk9DX0NMSwkJCQk2OQorI2RlZmluZSBQUFNTX1RJTUVSMF9DTEsJCQkJNzAKKyNkZWZpbmUgUFBTU19USU1FUjFfQ0xLCQkJCTcxCisjZGVmaW5lIFBNRU1fQV9DTEsJCQkJNzIKKyNkZWZpbmUgRE1BX0JBTV9IX0NMSwkJCQk3MworI2RlZmluZSBTSUNfSF9DTEsJCQkJNzQKKyNkZWZpbmUgU1BTX1RJQ19IX0NMSwkJCQk3NQorI2RlZmluZSBTTElNQlVTX0hfQ0xLCQkJCTc2CisjZGVmaW5lIFNMSU1CVVNfWE9fU1JDX0NMSwkJCTc3CisjZGVmaW5lIENGUEJfMlhfQ0xLX1NSQwkJCQk3OAorI2RlZmluZSBDRlBCX0NMSwkJCQk3OQorI2RlZmluZSBDRlBCMF9IX0NMSwkJCQk4MAorI2RlZmluZSBDRlBCMV9IX0NMSwkJCQk4MQorI2RlZmluZSBDRlBCMl9IX0NMSwkJCQk4MgorI2RlZmluZSBTRkFCX0NGUEJfTV9IX0NMSwkJCTgzCisjZGVmaW5lIENGUEJfTUFTVEVSX0hfQ0xLCQkJODQKKyNkZWZpbmUgU0ZBQl9DRlBCX1NfSF9DTEsJCQk4NQorI2RlZmluZSBDRlBCX1NQTElUVEVSX0hfQ0xLCQkJODYKKyNkZWZpbmUgVFNJRl9IX0NMSwkJCQk4NworI2RlZmluZSBUU0lGX0lOQUNUSVZJVFlfVElNRVJTX0NMSwkJODgKKyNkZWZpbmUgVFNJRl9SRUZfU1JDCQkJCTg5CisjZGVmaW5lIFRTSUZfUkVGX0NMSwkJCQk5MAorI2RlZmluZSBDRTFfSF9DTEsJCQkJOTEKKyNkZWZpbmUgQ0UxX0NPUkVfQ0xLCQkJCTkyCisjZGVmaW5lIENFMV9TTEVFUF9DTEsJCQkJOTMKKyNkZWZpbmUgQ0UyX0hfQ0xLCQkJCTk0CisjZGVmaW5lIENFMl9DT1JFX0NMSwkJCQk5NQorI2RlZmluZSBTRlBCX0hfQ0xLX1NSQwkJCQk5NworI2RlZmluZSBTRlBCX0hfQ0xLCQkJCTk4CisjZGVmaW5lIFNGQUJfU0ZQQl9NX0hfQ0xLCQkJOTkKKyNkZWZpbmUgU0ZBQl9TRlBCX1NfSF9DTEsJCQkxMDAKKyNkZWZpbmUgUlBNX1BST0NfQ0xLCQkJCTEwMQorI2RlZmluZSBSUE1fQlVTX0hfQ0xLCQkJCTEwMgorI2RlZmluZSBSUE1fU0xFRVBfQ0xLCQkJCTEwMworI2RlZmluZSBSUE1fVElNRVJfQ0xLCQkJCTEwNAorI2RlZmluZSBSUE1fTVNHX1JBTV9IX0NMSwkJCTEwNQorI2RlZmluZSBQTUlDX0FSQjBfSF9DTEsJCQkJMTA2CisjZGVmaW5lIFBNSUNfQVJCMV9IX0NMSwkJCQkxMDcKKyNkZWZpbmUgUE1JQ19TU0JJMl9TUkMJCQkJMTA4CisjZGVmaW5lIFBNSUNfU1NCSTJfQ0xLCQkJCTEwOQorI2RlZmluZSBTREMxX0hfQ0xLCQkJCTExMAorI2RlZmluZSBTREMyX0hfQ0xLCQkJCTExMQorI2RlZmluZSBTREMzX0hfQ0xLCQkJCTExMgorI2RlZmluZSBTREM0X0hfQ0xLCQkJCTExMworI2RlZmluZSBTREM1X0hfQ0xLCQkJCTExNAorI2RlZmluZSBTREMxX1NSQwkJCQkxMTUKKyNkZWZpbmUgU0RDMl9TUkMJCQkJMTE2CisjZGVmaW5lIFNEQzNfU1JDCQkJCTExNworI2RlZmluZSBTREM0X1NSQwkJCQkxMTgKKyNkZWZpbmUgU0RDNV9TUkMJCQkJMTE5CisjZGVmaW5lIFNEQzFfQ0xLCQkJCTEyMAorI2RlZmluZSBTREMyX0NMSwkJCQkxMjEKKyNkZWZpbmUgU0RDM19DTEsJCQkJMTIyCisjZGVmaW5lIFNEQzRfQ0xLCQkJCTEyMworI2RlZmluZSBTREM1X0NMSwkJCQkxMjQKKyNkZWZpbmUgREZBQl9BMl9IX0NMSwkJCQkxMjUKKyNkZWZpbmUgVVNCX0hTMV9IX0NMSwkJCQkxMjYKKyNkZWZpbmUgVVNCX0hTMV9YQ1ZSX1NSQwkJCTEyNworI2RlZmluZSBVU0JfSFMxX1hDVlJfQ0xLCQkJMTI4CisjZGVmaW5lIFVTQl9IU0lDX0hfQ0xLCQkJCTEyOQorI2RlZmluZSBVU0JfSFNJQ19YQ1ZSX0ZTX1NSQwkJCTEzMAorI2RlZmluZSBVU0JfSFNJQ19YQ1ZSX0ZTX0NMSwkJCTEzMQorI2RlZmluZSBVU0JfSFNJQ19TWVNURU1fQ0xLX1NSQwkJCTEzMgorI2RlZmluZSBVU0JfSFNJQ19TWVNURU1fQ0xLCQkJMTMzCisjZGVmaW5lIENGUEIwX0MwX0hfQ0xLCQkJCTEzNAorI2RlZmluZSBDRlBCMF9DMV9IX0NMSwkJCQkxMzUKKyNkZWZpbmUgQ0ZQQjBfRDBfSF9DTEsJCQkJMTM2CisjZGVmaW5lIENGUEIwX0QxX0hfQ0xLCQkJCTEzNworI2RlZmluZSBVU0JfRlMxX0hfQ0xLCQkJCTEzOAorI2RlZmluZSBVU0JfRlMxX1hDVlJfRlNfU1JDCQkJMTM5CisjZGVmaW5lIFVTQl9GUzFfWENWUl9GU19DTEsJCQkxNDAKKyNkZWZpbmUgVVNCX0ZTMV9TWVNURU1fQ0xLCQkJMTQxCisjZGVmaW5lIFVTQl9GUzJfSF9DTEsJCQkJMTQyCisjZGVmaW5lIFVTQl9GUzJfWENWUl9GU19TUkMJCQkxNDMKKyNkZWZpbmUgVVNCX0ZTMl9YQ1ZSX0ZTX0NMSwkJCTE0NAorI2RlZmluZSBVU0JfRlMyX1NZU1RFTV9DTEsJCQkxNDUKKyNkZWZpbmUgR1NCSV9DT01NT05fU0lNX1NSQwkJCTE0NgorI2RlZmluZSBHU0JJMV9IX0NMSwkJCQkxNDcKKyNkZWZpbmUgR1NCSTJfSF9DTEsJCQkJMTQ4CisjZGVmaW5lIEdTQkkzX0hfQ0xLCQkJCTE0OQorI2RlZmluZSBHU0JJNF9IX0NMSwkJCQkxNTAKKyNkZWZpbmUgR1NCSTVfSF9DTEsJCQkJMTUxCisjZGVmaW5lIEdTQkk2X0hfQ0xLCQkJCTE1MgorI2RlZmluZSBHU0JJN19IX0NMSwkJCQkxNTMKKyNkZWZpbmUgR1NCSThfSF9DTEsJCQkJMTU0CisjZGVmaW5lIEdTQkk5X0hfQ0xLCQkJCTE1NQorI2RlZmluZSBHU0JJMTBfSF9DTEsJCQkJMTU2CisjZGVmaW5lIEdTQkkxMV9IX0NMSwkJCQkxNTcKKyNkZWZpbmUgR1NCSTEyX0hfQ0xLCQkJCTE1OAorI2RlZmluZSBHU0JJMV9VQVJUX1NSQwkJCQkxNTkKKyNkZWZpbmUgR1NCSTFfVUFSVF9DTEsJCQkJMTYwCisjZGVmaW5lIEdTQkkyX1VBUlRfU1JDCQkJCTE2MQorI2RlZmluZSBHU0JJMl9VQVJUX0NMSwkJCQkxNjIKKyNkZWZpbmUgR1NCSTNfVUFSVF9TUkMJCQkJMTYzCisjZGVmaW5lIEdTQkkzX1VBUlRfQ0xLCQkJCTE2NAorI2RlZmluZSBHU0JJNF9VQVJUX1NSQwkJCQkxNjUKKyNkZWZpbmUgR1NCSTRfVUFSVF9DTEsJCQkJMTY2CisjZGVmaW5lIEdTQkk1X1VBUlRfU1JDCQkJCTE2NworI2RlZmluZSBHU0JJNV9VQVJUX0NMSwkJCQkxNjgKKyNkZWZpbmUgR1NCSTZfVUFSVF9TUkMJCQkJMTY5CisjZGVmaW5lIEdTQkk2X1VBUlRfQ0xLCQkJCTE3MAorI2RlZmluZSBHU0JJN19VQVJUX1NSQwkJCQkxNzEKKyNkZWZpbmUgR1NCSTdfVUFSVF9DTEsJCQkJMTcyCisjZGVmaW5lIEdTQkk4X1VBUlRfU1JDCQkJCTE3MworI2RlZmluZSBHU0JJOF9VQVJUX0NMSwkJCQkxNzQKKyNkZWZpbmUgR1NCSTlfVUFSVF9TUkMJCQkJMTc1CisjZGVmaW5lIEdTQkk5X1VBUlRfQ0xLCQkJCTE3NgorI2RlZmluZSBHU0JJMTBfVUFSVF9TUkMJCQkJMTc3CisjZGVmaW5lIEdTQkkxMF9VQVJUX0NMSwkJCQkxNzgKKyNkZWZpbmUgR1NCSTExX1VBUlRfU1JDCQkJCTE3OQorI2RlZmluZSBHU0JJMTFfVUFSVF9DTEsJCQkJMTgwCisjZGVmaW5lIEdTQkkxMl9VQVJUX1NSQwkJCQkxODEKKyNkZWZpbmUgR1NCSTEyX1VBUlRfQ0xLCQkJCTE4MgorI2RlZmluZSBHU0JJMV9RVVBfU1JDCQkJCTE4MworI2RlZmluZSBHU0JJMV9RVVBfQ0xLCQkJCTE4NAorI2RlZmluZSBHU0JJMl9RVVBfU1JDCQkJCTE4NQorI2RlZmluZSBHU0JJMl9RVVBfQ0xLCQkJCTE4NgorI2RlZmluZSBHU0JJM19RVVBfU1JDCQkJCTE4NworI2RlZmluZSBHU0JJM19RVVBfQ0xLCQkJCTE4OAorI2RlZmluZSBHU0JJNF9RVVBfU1JDCQkJCTE4OQorI2RlZmluZSBHU0JJNF9RVVBfQ0xLCQkJCTE5MAorI2RlZmluZSBHU0JJNV9RVVBfU1JDCQkJCTE5MQorI2RlZmluZSBHU0JJNV9RVVBfQ0xLCQkJCTE5MgorI2RlZmluZSBHU0JJNl9RVVBfU1JDCQkJCTE5MworI2RlZmluZSBHU0JJNl9RVVBfQ0xLCQkJCTE5NAorI2RlZmluZSBHU0JJN19RVVBfU1JDCQkJCTE5NQorI2RlZmluZSBHU0JJN19RVVBfQ0xLCQkJCTE5NgorI2RlZmluZSBHU0JJOF9RVVBfU1JDCQkJCTE5NworI2RlZmluZSBHU0JJOF9RVVBfQ0xLCQkJCTE5OAorI2RlZmluZSBHU0JJOV9RVVBfU1JDCQkJCTE5OQorI2RlZmluZSBHU0JJOV9RVVBfQ0xLCQkJCTIwMAorI2RlZmluZSBHU0JJMTBfUVVQX1NSQwkJCQkyMDEKKyNkZWZpbmUgR1NCSTEwX1FVUF9DTEsJCQkJMjAyCisjZGVmaW5lIEdTQkkxMV9RVVBfU1JDCQkJCTIwMworI2RlZmluZSBHU0JJMTFfUVVQX0NMSwkJCQkyMDQKKyNkZWZpbmUgR1NCSTEyX1FVUF9TUkMJCQkJMjA1CisjZGVmaW5lIEdTQkkxMl9RVVBfQ0xLCQkJCTIwNgorI2RlZmluZSBHU0JJMV9TSU1fQ0xLCQkJCTIwNworI2RlZmluZSBHU0JJMl9TSU1fQ0xLCQkJCTIwOAorI2RlZmluZSBHU0JJM19TSU1fQ0xLCQkJCTIwOQorI2RlZmluZSBHU0JJNF9TSU1fQ0xLCQkJCTIxMAorI2RlZmluZSBHU0JJNV9TSU1fQ0xLCQkJCTIxMQorI2RlZmluZSBHU0JJNl9TSU1fQ0xLCQkJCTIxMgorI2RlZmluZSBHU0JJN19TSU1fQ0xLCQkJCTIxMworI2RlZmluZSBHU0JJOF9TSU1fQ0xLCQkJCTIxNAorI2RlZmluZSBHU0JJOV9TSU1fQ0xLCQkJCTIxNQorI2RlZmluZSBHU0JJMTBfU0lNX0NMSwkJCQkyMTYKKyNkZWZpbmUgR1NCSTExX1NJTV9DTEsJCQkJMjE3CisjZGVmaW5lIEdTQkkxMl9TSU1fQ0xLCQkJCTIxOAorI2RlZmluZSBVU0JfSFNJQ19IU0lDX0NMS19TUkMJCQkyMTkKKyNkZWZpbmUgVVNCX0hTSUNfSFNJQ19DTEsJCQkyMjAKKyNkZWZpbmUgVVNCX0hTSUNfSFNJT19DQUxfQ0xLCQkJMjIxCisjZGVmaW5lIFNQRE1fQ0ZHX0hfQ0xLCQkJCTIyMgorI2RlZmluZSBTUERNX01TVFJfSF9DTEsJCQkJMjIzCisjZGVmaW5lIFNQRE1fRkZfQ0xLX1NSQwkJCQkyMjQKKyNkZWZpbmUgU1BETV9GRl9DTEsJCQkJMjI1CisjZGVmaW5lIFNFQ19DVFJMX0NMSwkJCQkyMjYKKyNkZWZpbmUgU0VDX0NUUkxfQUNDX0NMS19TUkMJCQkyMjcKKyNkZWZpbmUgU0VDX0NUUkxfQUNDX0NMSwkJCTIyOAorI2RlZmluZSBUTE1NX0hfQ0xLCQkJCTIyOQorI2RlZmluZSBUTE1NX0NMSwkJCQkyMzAKKyNkZWZpbmUgU0ZBQl9NU1NfU19IX0NMSwkJCTIzMQorI2RlZmluZSBNU1NfU0xQX0NMSwkJCQkyMzIKKyNkZWZpbmUgTVNTX1E2U1dfSlRBR19DTEsJCQkyMzMKKyNkZWZpbmUgTVNTX1E2RldfSlRBR19DTEsJCQkyMzQKKyNkZWZpbmUgTVNTX1NfSF9DTEsJCQkJMjM1CisjZGVmaW5lIE1TU19DWE9fU1JDX0NMSwkJCQkyMzYKKyNkZWZpbmUgU0FUQV9IX0NMSwkJCQkyMzcKKyNkZWZpbmUgU0FUQV9DTEtfU1JDCQkJCTIzOAorI2RlZmluZSBTQVRBX1JYT09CX0NMSwkJCQkyMzkKKyNkZWZpbmUgU0FUQV9QTUFMSVZFX0NMSwkJCTI0MAorI2RlZmluZSBTQVRBX1BIWV9SRUZfQ0xLCQkJMjQxCisjZGVmaW5lIFRTU0NfQ0xLX1NSQwkJCQkyNDIKKyNkZWZpbmUgVFNTQ19DTEsJCQkJMjQzCisjZGVmaW5lIFBETV9TUkMJCQkJCTI0NAorI2RlZmluZSBQRE1fQ0xLCQkJCQkyNDUKKyNkZWZpbmUgR1AwX1NSQwkJCQkJMjQ2CisjZGVmaW5lIEdQMF9DTEsJCQkJCTI0NworI2RlZmluZSBHUDFfU1JDCQkJCQkyNDgKKyNkZWZpbmUgR1AxX0NMSwkJCQkJMjQ5CisjZGVmaW5lIEdQMl9TUkMJCQkJCTI1MAorI2RlZmluZSBHUDJfQ0xLCQkJCQkyNTEKKyNkZWZpbmUgTVBNX0NMSwkJCQkJMjUyCisjZGVmaW5lIEVCSTFfQ0xLX1NSQwkJCQkyNTMKKyNkZWZpbmUgRUJJMV9DSDBfQ0xLCQkJCTI1NAorI2RlZmluZSBFQkkxX0NIMV9DTEsJCQkJMjU1CisjZGVmaW5lIEVCSTFfMlhfQ0xLCQkJCTI1NgorI2RlZmluZSBFQkkxX0NIMF9EUV9DTEsJCQkJMjU3CisjZGVmaW5lIEVCSTFfQ0gxX0RRX0NMSwkJCQkyNTgKKyNkZWZpbmUgRUJJMV9DSDBfQ0FfQ0xLCQkJCTI1OQorI2RlZmluZSBFQkkxX0NIMV9DQV9DTEsJCQkJMjYwCisjZGVmaW5lIEVCSTFfWE9fQ0xLCQkJCTI2MQorI2RlZmluZSBTRkFCX1NNUFNTX1NfSF9DTEsJCQkyNjIKKyNkZWZpbmUgUFJOR19TUkMJCQkJMjYzCisjZGVmaW5lIFBSTkdfQ0xLCQkJCTI2NAorI2RlZmluZSBQWE9fU1JDCQkJCQkyNjUKKyNkZWZpbmUgTFBBU1NfQ1hPX0NMSwkJCQkyNjYKKyNkZWZpbmUgTFBBU1NfUFhPX0NMSwkJCQkyNjcKKyNkZWZpbmUgU1BETV9DWV9QT1JUMF9DTEsJCQkyNjgKKyNkZWZpbmUgU1BETV9DWV9QT1JUMV9DTEsJCQkyNjkKKyNkZWZpbmUgU1BETV9DWV9QT1JUMl9DTEsJCQkyNzAKKyNkZWZpbmUgU1BETV9DWV9QT1JUM19DTEsJCQkyNzEKKyNkZWZpbmUgU1BETV9DWV9QT1JUNF9DTEsJCQkyNzIKKyNkZWZpbmUgU1BETV9DWV9QT1JUNV9DTEsJCQkyNzMKKyNkZWZpbmUgU1BETV9DWV9QT1JUNl9DTEsJCQkyNzQKKyNkZWZpbmUgU1BETV9DWV9QT1JUN19DTEsJCQkyNzUKKyNkZWZpbmUgUExMMAkJCQkJMjc2CisjZGVmaW5lIFBMTDBfVk9URQkJCQkyNzcKKyNkZWZpbmUgUExMMwkJCQkJMjc4CisjZGVmaW5lIFBMTDNfVk9URQkJCQkyNzkKKyNkZWZpbmUgUExMNF9WT1RFCQkJCTI4MAorI2RlZmluZSBQTEw1CQkJCQkyODEKKyNkZWZpbmUgUExMNV9WT1RFCQkJCTI4MgorI2RlZmluZSBQTEw2CQkJCQkyODMKKyNkZWZpbmUgUExMNl9WT1RFCQkJCTI4NAorI2RlZmluZSBQTEw3X1ZPVEUJCQkJMjg1CisjZGVmaW5lIFBMTDgJCQkJCTI4NgorI2RlZmluZSBQTEw4X1ZPVEUJCQkJMjg3CisjZGVmaW5lIFBMTDkJCQkJCTI4OAorI2RlZmluZSBQTEwxMAkJCQkJMjg5CisjZGVmaW5lIFBMTDExCQkJCQkyOTAKKyNkZWZpbmUgUExMMTIJCQkJCTI5MQorI2RlZmluZSBQTEwxMwkJCQkJMjkyCisjZGVmaW5lIFBMTDE0CQkJCQkyOTMKKyNkZWZpbmUgUExMMTRfVk9URQkJCQkyOTQKKyNkZWZpbmUgVVNCX0hTM19IX0NMSwkJCQkyOTUKKyNkZWZpbmUgVVNCX0hTM19YQ1ZSX1NSQwkJCTI5NgorI2RlZmluZSBVU0JfSFMzX1hDVlJfQ0xLCQkJMjk3CisjZGVmaW5lIFVTQl9IUzRfSF9DTEsJCQkJMjk4CisjZGVmaW5lIFVTQl9IUzRfWENWUl9TUkMJCQkyOTkKKyNkZWZpbmUgVVNCX0hTNF9YQ1ZSX0NMSwkJCTMwMAorI2RlZmluZSBTQVRBX1BIWV9DRkdfQ0xLCQkJMzAxCisjZGVmaW5lIFNBVEFfQV9DTEsJCQkJMzAyCisjZGVmaW5lIENFM19TUkMJCQkJCTMwMworI2RlZmluZSBDRTNfQ09SRV9DTEsJCQkJMzA0CisjZGVmaW5lIENFM19IX0NMSwkJCQkzMDUKKyNkZWZpbmUgVVNCX0hTMV9TWVNURU1fQ0xLX1NSQwkJCTMwNgorI2RlZmluZSBVU0JfSFMxX1NZU1RFTV9DTEsJCQkzMDcKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZ2NjLW1zbTg5OTYuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svcWNvbSxnY2MtbXNtODk5Ni5oCmluZGV4IDZmODE0ZGIuLjE4Mjg3MjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svcWNvbSxnY2MtbXNtODk5Ni5oCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svcWNvbSxnY2MtbXNtODk5Ni5oCkBAIC0zMzUsNiArMzM1LDExIEBACiAjZGVmaW5lIEdDQ19NU01QVV9CQ1IJCQkJCQk5OAogI2RlZmluZSBHQ0NfTVNTX1E2X0JDUgkJCQkJCTk5CiAjZGVmaW5lIEdDQ19RUkVGU19WQkdfQ0FMX0JDUgkJCQkJMTAwCisjZGVmaW5lIEdDQ19QQ0lFX1BIWV9DT01fQkNSCQkJCQkxMDEKKyNkZWZpbmUgR0NDX1BDSUVfUEhZX0NPTV9OT0NTUl9CQ1IJCQkJMTAyCisjZGVmaW5lIEdDQ19VU0IzX1BIWV9CQ1IJCQkJCTEwMworI2RlZmluZSBHQ0NfVVNCM1BIWV9QSFlfQkNSCQkJCQkxMDQKKwogCiAvKiBJbmRleGVzIGZvciBHRFNDcyAqLwogI2RlZmluZSBBR0dSRTBfTk9DX0dEU0MJCQkwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sbGNjLW1kbTk2MTUuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svcWNvbSxsY2MtbWRtOTYxNS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYzk2M2EKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sbGNjLW1kbTk2MTUuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgQmF5TGlicmUsIFNBUy4KKyAqIEF1dGhvciA6IE5laWwgQXJtc3Ryb25nIDxuYXJtc3Ryb25nQGJheWxpYnJlLmNvbT4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX0RUX0JJTkRJTkdTX0NMS19MQ0NfTURNOTYxNV9ICisjZGVmaW5lIF9EVF9CSU5ESU5HU19DTEtfTENDX01ETTk2MTVfSAorCisjZGVmaW5lIFBMTDQJCQkJMAorI2RlZmluZSBNSTJTX09TUl9TUkMJCQkxCisjZGVmaW5lIE1JMlNfT1NSX0NMSwkJCTIKKyNkZWZpbmUgTUkyU19ESVZfQ0xLCQkJMworI2RlZmluZSBNSTJTX0JJVF9ESVZfQ0xLCQk0CisjZGVmaW5lIE1JMlNfQklUX0NMSwkJCTUKKyNkZWZpbmUgUENNX1NSQwkJCQk2CisjZGVmaW5lIFBDTV9DTEtfT1VUCQkJNworI2RlZmluZSBQQ01fQ0xLCQkJCTgKKyNkZWZpbmUgU0xJTUJVU19TUkMJCQk5CisjZGVmaW5lIEFVRElPX1NMSU1CVVNfQ0xLCQkxMAorI2RlZmluZSBTUFNfU0xJTUJVU19DTEsJCQkxMQorI2RlZmluZSBDT0RFQ19JMlNfTUlDX09TUl9TUkMJCTEyCisjZGVmaW5lIENPREVDX0kyU19NSUNfT1NSX0NMSwkJMTMKKyNkZWZpbmUgQ09ERUNfSTJTX01JQ19ESVZfQ0xLCQkxNAorI2RlZmluZSBDT0RFQ19JMlNfTUlDX0JJVF9ESVZfQ0xLCTE1CisjZGVmaW5lIENPREVDX0kyU19NSUNfQklUX0NMSwkJMTYKKyNkZWZpbmUgU1BBUkVfSTJTX01JQ19PU1JfU1JDCQkxNworI2RlZmluZSBTUEFSRV9JMlNfTUlDX09TUl9DTEsJCTE4CisjZGVmaW5lIFNQQVJFX0kyU19NSUNfRElWX0NMSwkJMTkKKyNkZWZpbmUgU1BBUkVfSTJTX01JQ19CSVRfRElWX0NMSwkyMAorI2RlZmluZSBTUEFSRV9JMlNfTUlDX0JJVF9DTEsJCTIxCisjZGVmaW5lIENPREVDX0kyU19TUEtSX09TUl9TUkMJCTIyCisjZGVmaW5lIENPREVDX0kyU19TUEtSX09TUl9DTEsJCTIzCisjZGVmaW5lIENPREVDX0kyU19TUEtSX0RJVl9DTEsJCTI0CisjZGVmaW5lIENPREVDX0kyU19TUEtSX0JJVF9ESVZfQ0xLCTI1CisjZGVmaW5lIENPREVDX0kyU19TUEtSX0JJVF9DTEsJCTI2CisjZGVmaW5lIFNQQVJFX0kyU19TUEtSX09TUl9TUkMJCTI3CisjZGVmaW5lIFNQQVJFX0kyU19TUEtSX09TUl9DTEsJCTI4CisjZGVmaW5lIFNQQVJFX0kyU19TUEtSX0RJVl9DTEsJCTI5CisjZGVmaW5lIFNQQVJFX0kyU19TUEtSX0JJVF9ESVZfQ0xLCTMwCisjZGVmaW5lIFNQQVJFX0kyU19TUEtSX0JJVF9DTEsJCTMxCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9xY29tLG1tY2MtbXNtODk5Ni5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9xY29tLG1tY2MtbXNtODk5Ni5oCmluZGV4IDdkM2E3ZmEuLjVhYmM0NDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svcWNvbSxtbWNjLW1zbTg5OTYuaAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sbW1jYy1tc204OTk2LmgKQEAgLTI5OCw1ICsyOTgsNiBAQAogI2RlZmluZSBGRF9HRFNDCQkJMTIKICNkZWZpbmUgTURTU19HRFNDCQkxMwogI2RlZmluZSBHUFVfR1hfR0RTQwkJMTQKKyNkZWZpbmUgTU1BR0lDX0JJTUNfR0RTQwkxNQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svcmszMzk5LWNydS5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9yazMzOTktY3J1LmgKaW5kZXggNTBhNDRjZi4uMjIwYTYwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9yazMzOTktY3J1LmgKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9yazMzOTktY3J1LmgKQEAgLTEzMSwxMiArMTMxLDE1IEBACiAjZGVmaW5lIFNDTEtfRFBIWV9SWDBfQ0ZHCQkxNjUKICNkZWZpbmUgU0NMS19STUlJX1NSQwkJCTE2NgogI2RlZmluZSBTQ0xLX1BDSUVQSFlfUkVGMTAwTQkJMTY3CisjZGVmaW5lIFNDTEtfRERSQwkJCTE2OAogCiAjZGVmaW5lIERDTEtfVk9QMAkJCTE4MAogI2RlZmluZSBEQ0xLX1ZPUDEJCQkxODEKICNkZWZpbmUgRENMS19WT1AwX0RJVgkJCTE4MgogI2RlZmluZSBEQ0xLX1ZPUDFfRElWCQkJMTgzCiAjZGVmaW5lIERDTEtfTTBfUEVSSUxQCQkJMTg0CisjZGVmaW5lIERDTEtfVk9QMF9GUkFDCQkJMTg1CisjZGVmaW5lIERDTEtfVk9QMV9GUkFDCQkJMTg2CiAKICNkZWZpbmUgRkNMS19DTTBTCQkJMTkwCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svc3VuNmktYTMxLWNjdS5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9zdW42aS1hMzEtY2N1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ4MjUzMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svc3VuNmktYTMxLWNjdS5oCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IENoZW4tWXUgVHNhaSA8d2Vuc0Bjc2llLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZHVhbC1saWNlbnNlZDogeW91IGNhbiB1c2UgaXQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdQTCBvciB0aGUgWDExIGxpY2Vuc2UsIGF0IHlvdXIgb3B0aW9uLiBOb3RlIHRoYXQgdGhpcyBkdWFsCisgKiBsaWNlbnNpbmcgb25seSBhcHBsaWVzIHRvIHRoaXMgZmlsZSwgYW5kIG5vdCB0aGlzIHByb2plY3QgYXMgYQorICogd2hvbGUuCisgKgorICogIGEpIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogICAgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogT3IsIGFsdGVybmF0aXZlbHksCisgKgorICogIGIpIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqICAgICBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnM6CisgKgorICogICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiAgICAgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX0RUX0JJTkRJTkdTX0NMS19TVU42SV9BMzFfSF8KKyNkZWZpbmUgX0RUX0JJTkRJTkdTX0NMS19TVU42SV9BMzFfSF8KKworI2RlZmluZSBDTEtfUExMX1BFUklQSAkJMTAKKworI2RlZmluZSBDTEtfQ1BVCQkJMTgKKworI2RlZmluZSBDTEtfQUhCMV9NSVBJRFNJCTIzCisjZGVmaW5lIENMS19BSEIxX1NTCQkyNAorI2RlZmluZSBDTEtfQUhCMV9ETUEJCTI1CisjZGVmaW5lIENMS19BSEIxX01NQzAJCTI2CisjZGVmaW5lIENMS19BSEIxX01NQzEJCTI3CisjZGVmaW5lIENMS19BSEIxX01NQzIJCTI4CisjZGVmaW5lIENMS19BSEIxX01NQzMJCTI5CisjZGVmaW5lIENMS19BSEIxX05BTkQxCQkzMAorI2RlZmluZSBDTEtfQUhCMV9OQU5EMAkJMzEKKyNkZWZpbmUgQ0xLX0FIQjFfU0RSQU0JCTMyCisjZGVmaW5lIENMS19BSEIxX0VNQUMJCTMzCisjZGVmaW5lIENMS19BSEIxX1RTCQkzNAorI2RlZmluZSBDTEtfQUhCMV9IU1RJTUVSCTM1CisjZGVmaW5lIENMS19BSEIxX1NQSTAJCTM2CisjZGVmaW5lIENMS19BSEIxX1NQSTEJCTM3CisjZGVmaW5lIENMS19BSEIxX1NQSTIJCTM4CisjZGVmaW5lIENMS19BSEIxX1NQSTMJCTM5CisjZGVmaW5lIENMS19BSEIxX09URwkJNDAKKyNkZWZpbmUgQ0xLX0FIQjFfRUhDSTAJCTQxCisjZGVmaW5lIENMS19BSEIxX0VIQ0kxCQk0MgorI2RlZmluZSBDTEtfQUhCMV9PSENJMAkJNDMKKyNkZWZpbmUgQ0xLX0FIQjFfT0hDSTEJCTQ0CisjZGVmaW5lIENMS19BSEIxX09IQ0kyCQk0NQorI2RlZmluZSBDTEtfQUhCMV9WRQkJNDYKKyNkZWZpbmUgQ0xLX0FIQjFfTENEMAkJNDcKKyNkZWZpbmUgQ0xLX0FIQjFfTENEMQkJNDgKKyNkZWZpbmUgQ0xLX0FIQjFfQ1NJCQk0OQorI2RlZmluZSBDTEtfQUhCMV9IRE1JCQk1MAorI2RlZmluZSBDTEtfQUhCMV9CRTAJCTUxCisjZGVmaW5lIENMS19BSEIxX0JFMQkJNTIKKyNkZWZpbmUgQ0xLX0FIQjFfRkUwCQk1MworI2RlZmluZSBDTEtfQUhCMV9GRTEJCTU0CisjZGVmaW5lIENMS19BSEIxX01QCQk1NQorI2RlZmluZSBDTEtfQUhCMV9HUFUJCTU2CisjZGVmaW5lIENMS19BSEIxX0RFVTAJCTU3CisjZGVmaW5lIENMS19BSEIxX0RFVTEJCTU4CisjZGVmaW5lIENMS19BSEIxX0RSQzAJCTU5CisjZGVmaW5lIENMS19BSEIxX0RSQzEJCTYwCisKKyNkZWZpbmUgQ0xLX0FQQjFfQ09ERUMJCTYxCisjZGVmaW5lIENMS19BUEIxX1NQRElGCQk2MgorI2RlZmluZSBDTEtfQVBCMV9ESUdJVEFMX01JQwk2MworI2RlZmluZSBDTEtfQVBCMV9QSU8JCTY0CisjZGVmaW5lIENMS19BUEIxX0RBVURJTzAJNjUKKyNkZWZpbmUgQ0xLX0FQQjFfREFVRElPMQk2NgorCisjZGVmaW5lIENMS19BUEIyX0kyQzAJCTY3CisjZGVmaW5lIENMS19BUEIyX0kyQzEJCTY4CisjZGVmaW5lIENMS19BUEIyX0kyQzIJCTY5CisjZGVmaW5lIENMS19BUEIyX0kyQzMJCTcwCisjZGVmaW5lIENMS19BUEIyX1VBUlQwCQk3MQorI2RlZmluZSBDTEtfQVBCMl9VQVJUMQkJNzIKKyNkZWZpbmUgQ0xLX0FQQjJfVUFSVDIJCTczCisjZGVmaW5lIENMS19BUEIyX1VBUlQzCQk3NAorI2RlZmluZSBDTEtfQVBCMl9VQVJUNAkJNzUKKyNkZWZpbmUgQ0xLX0FQQjJfVUFSVDUJCTc2CisKKyNkZWZpbmUgQ0xLX05BTkQwCQk3NworI2RlZmluZSBDTEtfTkFORDEJCTc4CisjZGVmaW5lIENMS19NTUMwCQk3OQorI2RlZmluZSBDTEtfTU1DMF9TQU1QTEUJCTgwCisjZGVmaW5lIENMS19NTUMwX09VVFBVVAkJODEKKyNkZWZpbmUgQ0xLX01NQzEJCTgyCisjZGVmaW5lIENMS19NTUMxX1NBTVBMRQkJODMKKyNkZWZpbmUgQ0xLX01NQzFfT1VUUFVUCQk4NAorI2RlZmluZSBDTEtfTU1DMgkJODUKKyNkZWZpbmUgQ0xLX01NQzJfU0FNUExFCQk4NgorI2RlZmluZSBDTEtfTU1DMl9PVVRQVVQJCTg3CisjZGVmaW5lIENMS19NTUMzCQk4OAorI2RlZmluZSBDTEtfTU1DM19TQU1QTEUJCTg5CisjZGVmaW5lIENMS19NTUMzX09VVFBVVAkJOTAKKyNkZWZpbmUgQ0xLX1RTCQkJOTEKKyNkZWZpbmUgQ0xLX1NTCQkJOTIKKyNkZWZpbmUgQ0xLX1NQSTAJCTkzCisjZGVmaW5lIENMS19TUEkxCQk5NAorI2RlZmluZSBDTEtfU1BJMgkJOTUKKyNkZWZpbmUgQ0xLX1NQSTMJCTk2CisjZGVmaW5lIENMS19EQVVESU8wCQk5NworI2RlZmluZSBDTEtfREFVRElPMQkJOTgKKyNkZWZpbmUgQ0xLX1NQRElGCQk5OQorI2RlZmluZSBDTEtfVVNCX1BIWTAJCTEwMAorI2RlZmluZSBDTEtfVVNCX1BIWTEJCTEwMQorI2RlZmluZSBDTEtfVVNCX1BIWTIJCTEwMgorI2RlZmluZSBDTEtfVVNCX09IQ0kwCQkxMDMKKyNkZWZpbmUgQ0xLX1VTQl9PSENJMQkJMTA0CisjZGVmaW5lIENMS19VU0JfT0hDSTIJCTEwNQorCisjZGVmaW5lIENMS19EUkFNX1ZFCQkxMTAKKyNkZWZpbmUgQ0xLX0RSQU1fQ1NJX0lTUAkxMTEKKyNkZWZpbmUgQ0xLX0RSQU1fVFMJCTExMgorI2RlZmluZSBDTEtfRFJBTV9EUkMwCQkxMTMKKyNkZWZpbmUgQ0xLX0RSQU1fRFJDMQkJMTE0CisjZGVmaW5lIENMS19EUkFNX0RFVTAJCTExNQorI2RlZmluZSBDTEtfRFJBTV9ERVUxCQkxMTYKKyNkZWZpbmUgQ0xLX0RSQU1fRkUwCQkxMTcKKyNkZWZpbmUgQ0xLX0RSQU1fRkUxCQkxMTgKKyNkZWZpbmUgQ0xLX0RSQU1fQkUwCQkxMTkKKyNkZWZpbmUgQ0xLX0RSQU1fQkUxCQkxMjAKKyNkZWZpbmUgQ0xLX0RSQU1fTVAJCTEyMQorCisjZGVmaW5lIENMS19CRTAJCQkxMjIKKyNkZWZpbmUgQ0xLX0JFMQkJCTEyMworI2RlZmluZSBDTEtfRkUwCQkJMTI0CisjZGVmaW5lIENMS19GRTEJCQkxMjUKKyNkZWZpbmUgQ0xLX01QCQkJMTI2CisjZGVmaW5lIENMS19MQ0QwX0NIMAkJMTI3CisjZGVmaW5lIENMS19MQ0QxX0NIMAkJMTI4CisjZGVmaW5lIENMS19MQ0QwX0NIMQkJMTI5CisjZGVmaW5lIENMS19MQ0QxX0NIMQkJMTMwCisjZGVmaW5lIENMS19DU0kwX1NDTEsJCTEzMQorI2RlZmluZSBDTEtfQ1NJMF9NQ0xLCQkxMzIKKyNkZWZpbmUgQ0xLX0NTSTFfTUNMSwkJMTMzCisjZGVmaW5lIENMS19WRQkJCTEzNAorI2RlZmluZSBDTEtfQ09ERUMJCTEzNQorI2RlZmluZSBDTEtfQVZTCQkJMTM2CisjZGVmaW5lIENMS19ESUdJVEFMX01JQwkJMTM3CisjZGVmaW5lIENMS19IRE1JCQkxMzgKKyNkZWZpbmUgQ0xLX0hETUlfRERDCQkxMzkKKyNkZWZpbmUgQ0xLX1BTCQkJMTQwCisKKyNkZWZpbmUgQ0xLX01JUElfRFNJCQkxNDMKKyNkZWZpbmUgQ0xLX01JUElfRFNJX0RQSFkJMTQ0CisjZGVmaW5lIENMS19NSVBJX0NTSV9EUEhZCTE0NQorI2RlZmluZSBDTEtfSUVQX0RSQzAJCTE0NgorI2RlZmluZSBDTEtfSUVQX0RSQzEJCTE0NworI2RlZmluZSBDTEtfSUVQX0RFVTAJCTE0OAorI2RlZmluZSBDTEtfSUVQX0RFVTEJCTE0OQorI2RlZmluZSBDTEtfR1BVX0NPUkUJCTE1MAorI2RlZmluZSBDTEtfR1BVX01FTU9SWQkJMTUxCisjZGVmaW5lIENMS19HUFVfSFlECQkxNTIKKyNkZWZpbmUgQ0xLX0FUUwkJCTE1MworI2RlZmluZSBDTEtfVFJBQ0UJCTE1NAorCisjZGVmaW5lIENMS19PVVRfQQkJMTU1CisjZGVmaW5lIENMS19PVVRfQgkJMTU2CisjZGVmaW5lIENMS19PVVRfQwkJMTU3CisKKyNlbmRpZiAvKiBfRFRfQklORElOR1NfQ0xLX1NVTjZJX0EzMV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9zdW44aS1hMjMtYTMzLWNjdS5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9zdW44aS1hMjMtYTMzLWNjdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjIyYjYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3N1bjhpLWEyMy1hMzMtY2N1LmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgTWF4aW1lIFJpcGFyZCA8bWF4aW1lLnJpcGFyZEBmcmVlLWVsZWN0cm9ucy5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIGR1YWwtbGljZW5zZWQ6IHlvdSBjYW4gdXNlIGl0IGVpdGhlciB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHUEwgb3IgdGhlIFgxMSBsaWNlbnNlLCBhdCB5b3VyIG9wdGlvbi4gTm90ZSB0aGF0IHRoaXMgZHVhbAorICogbGljZW5zaW5nIG9ubHkgYXBwbGllcyB0byB0aGlzIGZpbGUsIGFuZCBub3QgdGhpcyBwcm9qZWN0IGFzIGEKKyAqIHdob2xlLgorICoKKyAqICBhKSBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqICAgICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIE9yLCBhbHRlcm5hdGl2ZWx5LAorICoKKyAqICBiKSBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiAgICAgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zOgorICoKKyAqICAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogICAgIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9EVF9CSU5ESU5HU19DTEtfU1VOOElfQTIzX0EzM19IXworI2RlZmluZSBfRFRfQklORElOR1NfQ0xLX1NVTjhJX0EyM19BMzNfSF8KKworI2RlZmluZSBDTEtfQ1BVWAkJMTgKKworI2RlZmluZSBDTEtfQlVTX01JUElfRFNJCTIzCisjZGVmaW5lIENMS19CVVNfU1MJCTI0CisjZGVmaW5lIENMS19CVVNfRE1BCQkyNQorI2RlZmluZSBDTEtfQlVTX01NQzAJCTI2CisjZGVmaW5lIENMS19CVVNfTU1DMQkJMjcKKyNkZWZpbmUgQ0xLX0JVU19NTUMyCQkyOAorI2RlZmluZSBDTEtfQlVTX05BTkQJCTI5CisjZGVmaW5lIENMS19CVVNfRFJBTQkJMzAKKyNkZWZpbmUgQ0xLX0JVU19IU1RJTUVSCQkzMQorI2RlZmluZSBDTEtfQlVTX1NQSTAJCTMyCisjZGVmaW5lIENMS19CVVNfU1BJMQkJMzMKKyNkZWZpbmUgQ0xLX0JVU19PVEcJCTM0CisjZGVmaW5lIENMS19CVVNfRUhDSQkJMzUKKyNkZWZpbmUgQ0xLX0JVU19PSENJCQkzNgorI2RlZmluZSBDTEtfQlVTX1ZFCQkzNworI2RlZmluZSBDTEtfQlVTX0xDRAkJMzgKKyNkZWZpbmUgQ0xLX0JVU19DU0kJCTM5CisjZGVmaW5lIENMS19CVVNfREVfQkUJCTQwCisjZGVmaW5lIENMS19CVVNfREVfRkUJCTQxCisjZGVmaW5lIENMS19CVVNfR1BVCQk0MgorI2RlZmluZSBDTEtfQlVTX01TR0JPWAkJNDMKKyNkZWZpbmUgQ0xLX0JVU19TUElOTE9DSwk0NAorI2RlZmluZSBDTEtfQlVTX0RSQwkJNDUKKyNkZWZpbmUgQ0xLX0JVU19TQVQJCTQ2CisjZGVmaW5lIENMS19CVVNfQ09ERUMJCTQ3CisjZGVmaW5lIENMS19CVVNfUElPCQk0OAorI2RlZmluZSBDTEtfQlVTX0kyUzAJCTQ5CisjZGVmaW5lIENMS19CVVNfSTJTMQkJNTAKKyNkZWZpbmUgQ0xLX0JVU19JMkMwCQk1MQorI2RlZmluZSBDTEtfQlVTX0kyQzEJCTUyCisjZGVmaW5lIENMS19CVVNfSTJDMgkJNTMKKyNkZWZpbmUgQ0xLX0JVU19VQVJUMAkJNTQKKyNkZWZpbmUgQ0xLX0JVU19VQVJUMQkJNTUKKyNkZWZpbmUgQ0xLX0JVU19VQVJUMgkJNTYKKyNkZWZpbmUgQ0xLX0JVU19VQVJUMwkJNTcKKyNkZWZpbmUgQ0xLX0JVU19VQVJUNAkJNTgKKyNkZWZpbmUgQ0xLX05BTkQJCTU5CisjZGVmaW5lIENMS19NTUMwCQk2MAorI2RlZmluZSBDTEtfTU1DMF9TQU1QTEUJCTYxCisjZGVmaW5lIENMS19NTUMwX09VVFBVVAkJNjIKKyNkZWZpbmUgQ0xLX01NQzEJCTYzCisjZGVmaW5lIENMS19NTUMxX1NBTVBMRQkJNjQKKyNkZWZpbmUgQ0xLX01NQzFfT1VUUFVUCQk2NQorI2RlZmluZSBDTEtfTU1DMgkJNjYKKyNkZWZpbmUgQ0xLX01NQzJfU0FNUExFCQk2NworI2RlZmluZSBDTEtfTU1DMl9PVVRQVVQJCTY4CisjZGVmaW5lIENMS19TUwkJCTY5CisjZGVmaW5lIENMS19TUEkwCQk3MAorI2RlZmluZSBDTEtfU1BJMQkJNzEKKyNkZWZpbmUgQ0xLX0kyUzAJCTcyCisjZGVmaW5lIENMS19JMlMxCQk3MworI2RlZmluZSBDTEtfVVNCX1BIWTAJCTc0CisjZGVmaW5lIENMS19VU0JfUEhZMQkJNzUKKyNkZWZpbmUgQ0xLX1VTQl9IU0lDCQk3NgorI2RlZmluZSBDTEtfVVNCX0hTSUNfMTJNCTc3CisjZGVmaW5lIENMS19VU0JfT0hDSQkJNzgKKworI2RlZmluZSBDTEtfRFJBTV9WRQkJODAKKyNkZWZpbmUgQ0xLX0RSQU1fQ1NJCQk4MQorI2RlZmluZSBDTEtfRFJBTV9EUkMJCTgyCisjZGVmaW5lIENMS19EUkFNX0RFX0ZFCQk4MworI2RlZmluZSBDTEtfRFJBTV9ERV9CRQkJODQKKyNkZWZpbmUgQ0xLX0RFX0JFCQk4NQorI2RlZmluZSBDTEtfREVfRkUJCTg2CisjZGVmaW5lIENMS19MQ0RfQ0gwCQk4NworI2RlZmluZSBDTEtfTENEX0NIMQkJODgKKyNkZWZpbmUgQ0xLX0NTSV9TQ0xLCQk4OQorI2RlZmluZSBDTEtfQ1NJX01DTEsJCTkwCisjZGVmaW5lIENMS19WRQkJCTkxCisjZGVmaW5lIENMS19BQ19ESUcJCTkyCisjZGVmaW5lIENMS19BQ19ESUdfNFgJCTkzCisjZGVmaW5lIENMS19BVlMJCQk5NAorCisjZGVmaW5lIENMS19EU0lfU0NMSwkJOTYKKyNkZWZpbmUgQ0xLX0RTSV9EUEhZCQk5NworI2RlZmluZSBDTEtfRFJDCQkJOTgKKyNkZWZpbmUgQ0xLX0dQVQkJCTk5CisjZGVmaW5lIENMS19BVFMJCQkxMDAKKworI2VuZGlmIC8qIF9EVF9CSU5ESU5HU19DTEtfU1VOOElfQTIzX0EzM19IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay96eDI5NjcxOC1jbG9jay5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay96eDI5NjcxOC1jbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMmQ1MjMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3p4Mjk2NzE4LWNsb2NrLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgLSAyMDE2IFpURSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaWZuZGVmIF9fRFRfQklORElOR1NfQ0xPQ0tfWlgyOTY3MThfSAorI2RlZmluZSBfX0RUX0JJTkRJTkdTX0NMT0NLX1pYMjk2NzE4X0gKKworLyogUExMICovCisjZGVmaW5lIFpYMjk2NzE4X1BMTF9DUFUJMQorI2RlZmluZSBaWDI5NjcxOF9QTExfTUFDCTIKKyNkZWZpbmUgWlgyOTY3MThfUExMX01NMAkzCisjZGVmaW5lIFpYMjk2NzE4X1BMTF9NTTEJNAorI2RlZmluZSBaWDI5NjcxOF9QTExfVkdBCTUKKyNkZWZpbmUgWlgyOTY3MThfUExMX0REUgk2CisjZGVmaW5lIFpYMjk2NzE4X1BMTF9BVURJTwk3CisjZGVmaW5lIFpYMjk2NzE4X1BMTF9IU0lDCTgKKyNkZWZpbmUgQ1BVX0RCR19HQVRFCQk5CisjZGVmaW5lIEE3Ml9HQVRFCQkxMAorI2RlZmluZSBDUFVfUEVSSV9HQVRFCQkxMQorI2RlZmluZSBBNTNfR0FURQkJMTIKKyNkZWZpbmUgRERSMV9HQVRFCQkxMworI2RlZmluZSBERFIwX0dBVEUJCTE0CisjZGVmaW5lIFNEMV9XQ0xLCQkxNQorI2RlZmluZSBTRDFfQUhCCQkJMTYKKyNkZWZpbmUgU0QwX1dDTEsJCTE3CisjZGVmaW5lIFNEMF9BSEIJCQkxOAorI2RlZmluZSBFTU1DX1dDTEsJCTE5CisjZGVmaW5lIEVNTUNfTkFORF9BWEkJCTIwCisjZGVmaW5lIE5BTkRfV0NMSwkJMjEKKyNkZWZpbmUgRU1NQ19OQU5EX0FIQgkJMjIKKyNkZWZpbmUgTFNQMV8xNDhNNQkJMjMKKyNkZWZpbmUgTFNQMV85OU0JCTI0CisjZGVmaW5lIExTUDFfMjRNCQkyNQorI2RlZmluZSBMU1AwXzc0TTI1CQkyNgorI2RlZmluZSBMU1AwXzMySwkJMjcKKyNkZWZpbmUgTFNQMF8xNDhNNQkJMjgKKyNkZWZpbmUgTFNQMF85OU0JCTI5CisjZGVmaW5lIExTUDBfMjRNCQkzMAorI2RlZmluZSBERU1VWF9BWEkJCTMxCisjZGVmaW5lIERFTVVYX0FQQgkJMzIKKyNkZWZpbmUgREVNVVhfMTQ4TTUJCTMzCisjZGVmaW5lIERFTVVYXzEwOE0JCTM0CisjZGVmaW5lIEFVRElPX0FQQgkJMzUKKyNkZWZpbmUgQVVESU9fOTlNCQkzNgorI2RlZmluZSBBVURJT18yNE0JCTM3CisjZGVmaW5lIEFVRElPXzE2TTM4NAkJMzgKKyNkZWZpbmUgQVVESU9fMzJLCQkzOQorI2RlZmluZSBXRFRfV0NMSwkJNDAKKyNkZWZpbmUgVElNRVJfV0NMSwkJNDEKKyNkZWZpbmUgVkRFX0FDTEsJCTQyCisjZGVmaW5lIFZDRV9BQ0xLCQk0MworI2RlZmluZSBIREVfQUNMSwkJNDQKKyNkZWZpbmUgR1BVX0FDTEsJCTQ1CisjZGVmaW5lIFNBUFBVX0FDTEsJCTQ2CisjZGVmaW5lIFNBUFBVX1dDTEsJCTQ3CisjZGVmaW5lIFZPVV9BQ0xLCQk0OAorI2RlZmluZSBWT1VfTUFJTl9XQ0xLCQk0OQorI2RlZmluZSBWT1VfQVVYX1dDTEsJCTUwCisjZGVmaW5lIFZPVV9QUFVfV0NMSwkJNTEKKyNkZWZpbmUgTUlQSV9DRkdfQ0xLCQk1MgorI2RlZmluZSBWR0FfSTJDX1dDTEsJCTUzCisjZGVmaW5lIE1JUElfUkVGX0NMSwkJNTQKKyNkZWZpbmUgSERNSV9PU0NfQ0VDCQk1NQorI2RlZmluZSBIRE1JX09TQ19DTEsJCTU2CisjZGVmaW5lIEhETUlfWENMSwkJNTcKKyNkZWZpbmUgVklVX00wX0FDTEsJCTU4CisjZGVmaW5lIFZJVV9NMV9BQ0xLCQk1OQorI2RlZmluZSBWSVVfV0NMSwkJNjAKKyNkZWZpbmUgVklVX0pQRUdfV0NMSwkJNjEKKyNkZWZpbmUgVklVX0NGR19DTEsJCTYyCisjZGVmaW5lIFRTX1NZU19XQ0xLCQk2MworI2RlZmluZSBUU19TWVNfMTA4TQkJNjQKKyNkZWZpbmUgVVNCMjBfSENMSwkJNjUKKyNkZWZpbmUgVVNCMjBfUEhZX0NMSwkJNjYKKyNkZWZpbmUgVVNCMjFfSENMSwkJNjcKKyNkZWZpbmUgVVNCMjFfUEhZX0NMSwkJNjgKKyNkZWZpbmUgR01BQ19STUlJQ0xLCQk2OQorI2RlZmluZSBHTUFDX1BDTEsJCTcwCisjZGVmaW5lIEdNQUNfQUNMSwkJNzEKKyNkZWZpbmUgR01BQ19SRkNMSwkJNzIKKyNkZWZpbmUgVEVNUFNFTlNPUl9HQVRFCQk3MworCisjZGVmaW5lIFRPUF9OUl9DTEtTCQk3NAorCisKKyNkZWZpbmUgTFNQMF9USU1FUjNfUENMSwkxCisjZGVmaW5lIExTUDBfVElNRVIzX1dDTEsJMgorI2RlZmluZSBMU1AwX1RJTUVSNF9QQ0xLCTMKKyNkZWZpbmUgTFNQMF9USU1FUjRfV0NMSwk0CisjZGVmaW5lIExTUDBfVElNRVI1X1BDTEsJNQorI2RlZmluZSBMU1AwX1RJTUVSNV9XQ0xLCTYKKyNkZWZpbmUgTFNQMF9VQVJUM19QQ0xLCQk3CisjZGVmaW5lIExTUDBfVUFSVDNfV0NMSwkJOAorI2RlZmluZSBMU1AwX1VBUlQxX1BDTEsJCTkKKyNkZWZpbmUgTFNQMF9VQVJUMV9XQ0xLCQkxMAorI2RlZmluZSBMU1AwX1VBUlQyX1BDTEsJCTExCisjZGVmaW5lIExTUDBfVUFSVDJfV0NMSwkJMTIKKyNkZWZpbmUgTFNQMF9TUElGQzBfUENMSwkxMworI2RlZmluZSBMU1AwX1NQSUZDMF9XQ0xLCTE0CisjZGVmaW5lIExTUDBfSTJDNF9QQ0xLCQkxNQorI2RlZmluZSBMU1AwX0kyQzRfV0NMSwkJMTYKKyNkZWZpbmUgTFNQMF9JMkM1X1BDTEsJCTE3CisjZGVmaW5lIExTUDBfSTJDNV9XQ0xLCQkxOAorI2RlZmluZSBMU1AwX1NTUDBfUENMSwkJMTkKKyNkZWZpbmUgTFNQMF9TU1AwX1dDTEsJCTIwCisjZGVmaW5lIExTUDBfU1NQMV9QQ0xLCQkyMQorI2RlZmluZSBMU1AwX1NTUDFfV0NMSwkJMjIKKyNkZWZpbmUgTFNQMF9VU0lNX1BDTEsJCTIzCisjZGVmaW5lIExTUDBfVVNJTV9XQ0xLCQkyNAorI2RlZmluZSBMU1AwX0dQSU9fUENMSwkJMjUKKyNkZWZpbmUgTFNQMF9HUElPX1dDTEsJCTI2CisjZGVmaW5lIExTUDBfSTJDM19QQ0xLCQkyNworI2RlZmluZSBMU1AwX0kyQzNfV0NMSwkJMjgKKworI2RlZmluZSBMU1AwX05SX0NMS1MJCTI5CisKKworI2RlZmluZSBMU1AxX1VBUlQ0X1BDTEsJCTEKKyNkZWZpbmUgTFNQMV9VQVJUNF9XQ0xLCQkyCisjZGVmaW5lIExTUDFfVUFSVDVfUENMSwkJMworI2RlZmluZSBMU1AxX1VBUlQ1X1dDTEsJCTQKKyNkZWZpbmUgTFNQMV9QV01fUENMSwkJNQorI2RlZmluZSBMU1AxX1BXTV9XQ0xLCQk2CisjZGVmaW5lIExTUDFfSTJDMl9QQ0xLCQk3CisjZGVmaW5lIExTUDFfSTJDMl9XQ0xLCQk4CisjZGVmaW5lIExTUDFfU1NQMl9QQ0xLCQk5CisjZGVmaW5lIExTUDFfU1NQMl9XQ0xLCQkxMAorI2RlZmluZSBMU1AxX1NTUDNfUENMSwkJMTEKKyNkZWZpbmUgTFNQMV9TU1AzX1dDTEsJCTEyCisjZGVmaW5lIExTUDFfU1NQNF9QQ0xLCQkxMworI2RlZmluZSBMU1AxX1NTUDRfV0NMSwkJMTQKKyNkZWZpbmUgTFNQMV9VU0lNMV9QQ0xLCQkxNQorI2RlZmluZSBMU1AxX1VTSU0xX1dDTEsJCTE2CisKKyNkZWZpbmUgTFNQMV9OUl9DTEtTCQkxNworCisKKyNkZWZpbmUgQVVESU9fSTJTMF9XQ0xLCQkxCisjZGVmaW5lIEFVRElPX0kyUzBfUENMSwkJMgorI2RlZmluZSBBVURJT19JMlMxX1dDTEsJCTMKKyNkZWZpbmUgQVVESU9fSTJTMV9QQ0xLCQk0CisjZGVmaW5lIEFVRElPX0kyUzJfV0NMSwkJNQorI2RlZmluZSBBVURJT19JMlMyX1BDTEsJCTYKKyNkZWZpbmUgQVVESU9fSTJTM19XQ0xLCQk3CisjZGVmaW5lIEFVRElPX0kyUzNfUENMSwkJOAorI2RlZmluZSBBVURJT19JMkMwX1dDTEsJCTkKKyNkZWZpbmUgQVVESU9fSTJDMF9QQ0xLCQkxMAorI2RlZmluZSBBVURJT19TUERJRjBfV0NMSwkxMQorI2RlZmluZSBBVURJT19TUERJRjBfUENMSwkxMgorI2RlZmluZSBBVURJT19TUERJRjFfV0NMSwkxMworI2RlZmluZSBBVURJT19TUERJRjFfUENMSwkxNAorI2RlZmluZSBBVURJT19USU1FUl9XQ0xLCTE1CisjZGVmaW5lIEFVRElPX1RJTUVSX1BDTEsJMTYKKyNkZWZpbmUgQVVESU9fVERNX1dDTEsJCTE3CisjZGVmaW5lIEFVRElPX1RETV9QQ0xLCQkxOAorI2RlZmluZSBBVURJT19UU19QQ0xLCQkxOQorCisjZGVmaW5lIEFVRElPX05SX0NMS1MJCTIwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9uZXQvbXNjYy1waHktdnNjODUzMS5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9uZXQvbXNjYy1waHktdnNjODUzMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzODNkZDIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL25ldC9tc2NjLXBoeS12c2M4NTMxLmgKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIERldmljZSBUcmVlIGNvbnN0YW50cyBmb3IgTWljcm9zZW1pIFZTQzg1MzEgUEhZCisgKgorICogQXV0aG9yOiBOYWdhcmFqdSBMYWtrYXJhanUKKyAqCisgKiBMaWNlbnNlOiBEdWFsIE1JVC9HUEwKKyAqIENvcHlyaWdodCAoYykgMjAxNiBNaWNyb3NlbWkgQ29ycG9yYXRpb24KKyAqLworCisjaWZuZGVmIF9EVF9CSU5ESU5HU19NU0NDX1ZTQzg1MzFfSAorI2RlZmluZSBfRFRfQklORElOR1NfTVNDQ19WU0M4NTMxX0gKKworLyogTUFDIGludGVyZmFjZSBFZGdlIHJhdGUgY29udHJvbCBWRERNQUMgaW4gbWlsbGkgVm9sdHMgKi8KKyNkZWZpbmUgTVNDQ19WRERNQUNfMzMwMAkJIDMzMDAKKyNkZWZpbmUgTVNDQ19WRERNQUNfMjUwMAkJIDI1MDAKKyNkZWZpbmUgTVNDQ19WRERNQUNfMTgwMAkJIDE4MDAKKyNkZWZpbmUgTVNDQ19WRERNQUNfMTUwMAkJIDE1MDAKKyNkZWZpbmUgTVNDQ19WRERNQUNfTUFYCQkJIDQKKyNkZWZpbmUgTVNDQ19TTE9XRE9XTl9NQVgJCSA4CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9yZXNldC9neGJiLWFvY2xrYy5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9yZXNldC9neGJiLWFvY2xrYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllM2ZkNjAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL3Jlc2V0L2d4YmItYW9jbGtjLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBCYXlMaWJyZSwgU0FTLgorICogQXV0aG9yOiBOZWlsIEFybXN0cm9uZyA8bmFybXN0cm9uZ0BiYXlsaWJyZS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KKyAqIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgorICoKKyAqIEJTRCBMSUNFTlNFCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IEJheUxpYnJlLCBTQVMuCisgKiBBdXRob3I6IE5laWwgQXJtc3Ryb25nIDxuYXJtc3Ryb25nQGJheWxpYnJlLmNvbT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICogICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIERUX0JJTkRJTkdTX1JFU0VUX0FNTE9HSUNfTUVTT05fR1hCQl9BT0NMSworI2RlZmluZSBEVF9CSU5ESU5HU19SRVNFVF9BTUxPR0lDX01FU09OX0dYQkJfQU9DTEsKKworI2RlZmluZSBSRVNFVF9BT19SRU1PVEUJCTAKKyNkZWZpbmUgUkVTRVRfQU9fSTJDX01BU1RFUgkxCisjZGVmaW5lIFJFU0VUX0FPX0kyQ19TTEFWRQkyCisjZGVmaW5lIFJFU0VUX0FPX1VBUlQxCQkzCisjZGVmaW5lIFJFU0VUX0FPX1VBUlQyCQk0CisjZGVmaW5lIFJFU0VUX0FPX0lSX0JMQVNURVIJNQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3MvcmVzZXQvbXQyNzAxLXJlc2V0cy5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9yZXNldC9tdDI3MDEtcmVzZXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFmMDMwNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3MvcmVzZXQvbXQyNzAxLXJlc2V0cy5oCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgTWVkaWFUZWssIFNodW5saSBXYW5nIDxzaHVubGkud2FuZ0BtZWRpYXRlay5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX0RUX0JJTkRJTkdTX1JFU0VUX0NPTlRST0xMRVJfTVQyNzAxCisjZGVmaW5lIF9EVF9CSU5ESU5HU19SRVNFVF9DT05UUk9MTEVSX01UMjcwMQorCisvKiBJTkZSQUNGRyByZXNldHMgKi8KKyNkZWZpbmUgTVQyNzAxX0lORlJBX0VNSV9SRUdfUlNUCQkwCisjZGVmaW5lIE1UMjcwMV9JTkZSQV9EUkFNQzBfQTBfUlNUCQkxCisjZGVmaW5lIE1UMjcwMV9JTkZSQV9GSENUTF9SU1QJCQkyCisjZGVmaW5lIE1UMjcwMV9JTkZSQV9BUENJUlFfRUlOVF9SU1QJCTMKKyNkZWZpbmUgTVQyNzAxX0lORlJBX0FQWEdQVF9SU1QJCQk0CisjZGVmaW5lIE1UMjcwMV9JTkZSQV9TQ1BTWVNfUlNUCQkJNQorI2RlZmluZSBNVDI3MDFfSU5GUkFfS1BfUlNUCQkJNgorI2RlZmluZSBNVDI3MDFfSU5GUkFfUE1JQ19XUkFQX1JTVAkJNworI2RlZmluZSBNVDI3MDFfSU5GUkFfTUlQSV9SU1QJCQk4CisjZGVmaW5lIE1UMjcwMV9JTkZSQV9JUlJYX1JTVAkJCTkKKyNkZWZpbmUgTVQyNzAxX0lORlJBX0NFQ19SU1QJCQkxMAorI2RlZmluZSBNVDI3MDFfSU5GUkFfRU1JX1JTVAkJCTMyCisjZGVmaW5lIE1UMjcwMV9JTkZSQV9EUkFNQzBfUlNUCQkJMzQKKyNkZWZpbmUgTVQyNzAxX0lORlJBX1RSTkdfUlNUCQkJMzcKKyNkZWZpbmUgTVQyNzAxX0lORlJBX1NZU0lSUV9SU1QJCQkzOAorCisvKiAgUEVSSUNGRyByZXNldHMgKi8KKyNkZWZpbmUgTVQyNzAxX1BFUklfVUFSVDBfU1dfUlNUCQkwCisjZGVmaW5lIE1UMjcwMV9QRVJJX1VBUlQxX1NXX1JTVAkJMQorI2RlZmluZSBNVDI3MDFfUEVSSV9VQVJUMl9TV19SU1QJCTIKKyNkZWZpbmUgTVQyNzAxX1BFUklfVUFSVDNfU1dfUlNUCQkzCisjZGVmaW5lIE1UMjcwMV9QRVJJX0dDUFVfU1dfUlNUCQkJNQorI2RlZmluZSBNVDI3MDFfUEVSSV9CVElGX1NXX1JTVAkJCTYKKyNkZWZpbmUgTVQyNzAxX1BFUklfUFdNX1NXX1JTVAkJCTgKKyNkZWZpbmUgTVQyNzAxX1BFUklfQVVYQURDX1NXX1JTVAkJMTAKKyNkZWZpbmUgTVQyNzAxX1BFUklfRE1BX1NXX1JTVAkJCTExCisjZGVmaW5lIE1UMjcwMV9QRVJJX05GSV9TV19SU1QJCQkxNAorI2RlZmluZSBNVDI3MDFfUEVSSV9OTElfU1dfUlNUCQkJMTUKKyNkZWZpbmUgTVQyNzAxX1BFUklfVEhFUk1fU1dfUlNUCQkxNgorI2RlZmluZSBNVDI3MDFfUEVSSV9NU0RDMl9TV19SU1QJCTE3CisjZGVmaW5lIE1UMjcwMV9QRVJJX01TREMwX1NXX1JTVAkJMTkKKyNkZWZpbmUgTVQyNzAxX1BFUklfTVNEQzFfU1dfUlNUCQkyMAorI2RlZmluZSBNVDI3MDFfUEVSSV9JMkMwX1NXX1JTVAkJCTIyCisjZGVmaW5lIE1UMjcwMV9QRVJJX0kyQzFfU1dfUlNUCQkJMjMKKyNkZWZpbmUgTVQyNzAxX1BFUklfSTJDMl9TV19SU1QJCQkyNAorI2RlZmluZSBNVDI3MDFfUEVSSV9JMkMzX1NXX1JTVAkJCTI1CisjZGVmaW5lIE1UMjcwMV9QRVJJX1VTQl9TV19SU1QJCQkyOAorI2RlZmluZSBNVDI3MDFfUEVSSV9FVEhfU1dfUlNUCQkJMjkKKyNkZWZpbmUgTVQyNzAxX1BFUklfU1BJMF9TV19SU1QJCQkzMworCisvKiBUT1BSR1UgcmVzZXRzICovCisjZGVmaW5lIE1UMjcwMV9UT1BSR1VfSU5GUkFfUlNUCQkJMAorI2RlZmluZSBNVDI3MDFfVE9QUkdVX01NX1JTVAkJCTEKKyNkZWZpbmUgTVQyNzAxX1RPUFJHVV9NRkdfUlNUCQkJMgorI2RlZmluZSBNVDI3MDFfVE9QUkdVX0VUSERNQV9SU1QJCTMKKyNkZWZpbmUgTVQyNzAxX1RPUFJHVV9WREVDX1JTVAkJCTQKKyNkZWZpbmUgTVQyNzAxX1RPUFJHVV9WRU5DX0lNR19SU1QJCTUKKyNkZWZpbmUgTVQyNzAxX1RPUFJHVV9ERFJQSFlfUlNUCQk2CisjZGVmaW5lIE1UMjcwMV9UT1BSR1VfTURfUlNUCQkJNworI2RlZmluZSBNVDI3MDFfVE9QUkdVX0lORlJBX0FPX1JTVAkJOAorI2RlZmluZSBNVDI3MDFfVE9QUkdVX0NPTk5fUlNUCQkJOQorI2RlZmluZSBNVDI3MDFfVE9QUkdVX0FQTUlYRURfUlNUCQkxMAorI2RlZmluZSBNVDI3MDFfVE9QUkdVX0hJRlNZU19SU1QJCTExCisjZGVmaW5lIE1UMjcwMV9UT1BSR1VfQ09OTl9NQ1VfUlNUCQkxMgorI2RlZmluZSBNVDI3MDFfVE9QUkdVX0JEUF9ESVNQX1JTVAkJMTMKKworLyogSElGU1lTIHJlc2V0cyAqLworI2RlZmluZSBNVDI3MDFfSElGU1lTX1VIT1NUMF9SU1QJCTMKKyNkZWZpbmUgTVQyNzAxX0hJRlNZU19VSE9TVDFfUlNUCQk0CisjZGVmaW5lIE1UMjcwMV9ISUZTWVNfVVBIWTBfUlNUCQkJMjEKKyNkZWZpbmUgTVQyNzAxX0hJRlNZU19VUEhZMV9SU1QJCQkyMgorI2RlZmluZSBNVDI3MDFfSElGU1lTX1BDSUUwX1JTVAkJCTI0CisjZGVmaW5lIE1UMjcwMV9ISUZTWVNfUENJRTFfUlNUCQkJMjUKKyNkZWZpbmUgTVQyNzAxX0hJRlNZU19QQ0lFMl9SU1QJCQkyNgorCisjZW5kaWYgIC8qIF9EVF9CSU5ESU5HU19SRVNFVF9DT05UUk9MTEVSX01UMjcwMSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9yZXNldC9xY29tLGdjYy1tZG05NjE1LmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL3Jlc2V0L3Fjb20sZ2NjLW1kbTk2MTUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Zjg2ZTlhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9yZXNldC9xY29tLGdjYy1tZG05NjE1LmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSBCYXlMaWJyZSwgU0FTLgorICogQXV0aG9yIDogTmVpbCBBcm1zdHJvbmcgPG5hcm1zdHJvbmdAYmF5bGlicmUuY29tPgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfRFRfQklORElOR1NfUkVTRVRfR0NDX01ETTk2MTVfSAorI2RlZmluZSBfRFRfQklORElOR1NfUkVTRVRfR0NDX01ETTk2MTVfSAorCisjZGVmaW5lIFNGQUJfTVNTX1E2X1NXX1JFU0VUCQkJCTAKKyNkZWZpbmUgU0ZBQl9NU1NfUTZfRldfUkVTRVQJCQkJMQorI2RlZmluZSBRRFNTX1NUTV9SRVNFVAkJCQkJMgorI2RlZmluZSBBRkFCX1NNUFNTX1NfUkVTRVQJCQkJMworI2RlZmluZSBBRkFCX1NNUFNTX00xX1JFU0VUCQkJCTQKKyNkZWZpbmUgQUZBQl9TTVBTU19NMF9SRVNFVAkJCQk1CisjZGVmaW5lIEFGQUJfRUJJMV9DSDBfUkVTRVQJCQkJNgorI2RlZmluZSBBRkFCX0VCSTFfQ0gxX1JFU0VUCQkJCTcKKyNkZWZpbmUgU0ZBQl9BRE0wX00wX1JFU0VUCQkJCTgKKyNkZWZpbmUgU0ZBQl9BRE0wX00xX1JFU0VUCQkJCTkKKyNkZWZpbmUgU0ZBQl9BRE0wX00yX1JFU0VUCQkJCTEwCisjZGVmaW5lIEFETTBfQzJfUkVTRVQJCQkJCTExCisjZGVmaW5lIEFETTBfQzFfUkVTRVQJCQkJCTEyCisjZGVmaW5lIEFETTBfQzBfUkVTRVQJCQkJCTEzCisjZGVmaW5lIEFETTBfUEJVU19SRVNFVAkJCQkJMTQKKyNkZWZpbmUgQURNMF9SRVNFVAkJCQkJMTUKKyNkZWZpbmUgUURTU19DTEtTX1NXX1JFU0VUCQkJCTE2CisjZGVmaW5lIFFEU1NfUE9SX1JFU0VUCQkJCQkxNworI2RlZmluZSBRRFNTX1RTQ1RSX1JFU0VUCQkJCTE4CisjZGVmaW5lIFFEU1NfSFJFU0VUX1JFU0VUCQkJCTE5CisjZGVmaW5lIFFEU1NfQVhJX1JFU0VUCQkJCQkyMAorI2RlZmluZSBRRFNTX0RCR19SRVNFVAkJCQkJMjEKKyNkZWZpbmUgUENJRV9BX1JFU0VUCQkJCQkyMgorI2RlZmluZSBQQ0lFX0FVWF9SRVNFVAkJCQkJMjMKKyNkZWZpbmUgUENJRV9IX1JFU0VUCQkJCQkyNAorI2RlZmluZSBTRkFCX1BDSUVfTV9SRVNFVAkJCQkyNQorI2RlZmluZSBTRkFCX1BDSUVfU19SRVNFVAkJCQkyNgorI2RlZmluZSBTRkFCX01TU19NX1JFU0VUCQkJCTI3CisjZGVmaW5lIFNGQUJfVVNCM19NX1JFU0VUCQkJCTI4CisjZGVmaW5lIFNGQUJfUklWQV9NX1JFU0VUCQkJCTI5CisjZGVmaW5lIFNGQUJfTFBBU1NfUkVTRVQJCQkJMzAKKyNkZWZpbmUgU0ZBQl9BRkFCX01fUkVTRVQJCQkJMzEKKyNkZWZpbmUgQUZBQl9TRkFCX00wX1JFU0VUCQkJCTMyCisjZGVmaW5lIEFGQUJfU0ZBQl9NMV9SRVNFVAkJCQkzMworI2RlZmluZSBTRkFCX1NBVEFfU19SRVNFVAkJCQkzNAorI2RlZmluZSBTRkFCX0RGQUJfTV9SRVNFVAkJCQkzNQorI2RlZmluZSBERkFCX1NGQUJfTV9SRVNFVAkJCQkzNgorI2RlZmluZSBERkFCX1NXQVkwX1JFU0VUCQkJCTM3CisjZGVmaW5lIERGQUJfU1dBWTFfUkVTRVQJCQkJMzgKKyNkZWZpbmUgREZBQl9BUkIwX1JFU0VUCQkJCQkzOQorI2RlZmluZSBERkFCX0FSQjFfUkVTRVQJCQkJCTQwCisjZGVmaW5lIFBQU1NfUFJPQ19SRVNFVAkJCQkJNDEKKyNkZWZpbmUgUFBTU19SRVNFVAkJCQkJNDIKKyNkZWZpbmUgRE1BX0JBTV9SRVNFVAkJCQkJNDMKKyNkZWZpbmUgU1BTX1RJQ19IX1JFU0VUCQkJCQk0NAorI2RlZmluZSBTTElNQlVTX0hfUkVTRVQJCQkJCTQ1CisjZGVmaW5lIFNGQUJfQ0ZQQl9NX1JFU0VUCQkJCTQ2CisjZGVmaW5lIFNGQUJfQ0ZQQl9TX1JFU0VUCQkJCTQ3CisjZGVmaW5lIFRTSUZfSF9SRVNFVAkJCQkJNDgKKyNkZWZpbmUgQ0UxX0hfUkVTRVQJCQkJCTQ5CisjZGVmaW5lIENFMV9DT1JFX1JFU0VUCQkJCQk1MAorI2RlZmluZSBDRTFfU0xFRVBfUkVTRVQJCQkJCTUxCisjZGVmaW5lIENFMl9IX1JFU0VUCQkJCQk1MgorI2RlZmluZSBDRTJfQ09SRV9SRVNFVAkJCQkJNTMKKyNkZWZpbmUgU0ZBQl9TRlBCX01fUkVTRVQJCQkJNTQKKyNkZWZpbmUgU0ZBQl9TRlBCX1NfUkVTRVQJCQkJNTUKKyNkZWZpbmUgUlBNX1BST0NfUkVTRVQJCQkJCTU2CisjZGVmaW5lIFBNSUNfU1NCSTJfUkVTRVQJCQkJNTcKKyNkZWZpbmUgU0RDMV9SRVNFVAkJCQkJNTgKKyNkZWZpbmUgU0RDMl9SRVNFVAkJCQkJNTkKKyNkZWZpbmUgU0RDM19SRVNFVAkJCQkJNjAKKyNkZWZpbmUgU0RDNF9SRVNFVAkJCQkJNjEKKyNkZWZpbmUgU0RDNV9SRVNFVAkJCQkJNjIKKyNkZWZpbmUgREZBQl9BMl9SRVNFVAkJCQkJNjMKKyNkZWZpbmUgVVNCX0hTMV9SRVNFVAkJCQkJNjQKKyNkZWZpbmUgVVNCX0hTSUNfUkVTRVQJCQkJCTY1CisjZGVmaW5lIFVTQl9GUzFfWENWUl9SRVNFVAkJCQk2NgorI2RlZmluZSBVU0JfRlMxX1JFU0VUCQkJCQk2NworI2RlZmluZSBVU0JfRlMyX1hDVlJfUkVTRVQJCQkJNjgKKyNkZWZpbmUgVVNCX0ZTMl9SRVNFVAkJCQkJNjkKKyNkZWZpbmUgR1NCSTFfUkVTRVQJCQkJCTcwCisjZGVmaW5lIEdTQkkyX1JFU0VUCQkJCQk3MQorI2RlZmluZSBHU0JJM19SRVNFVAkJCQkJNzIKKyNkZWZpbmUgR1NCSTRfUkVTRVQJCQkJCTczCisjZGVmaW5lIEdTQkk1X1JFU0VUCQkJCQk3NAorI2RlZmluZSBHU0JJNl9SRVNFVAkJCQkJNzUKKyNkZWZpbmUgR1NCSTdfUkVTRVQJCQkJCTc2CisjZGVmaW5lIEdTQkk4X1JFU0VUCQkJCQk3NworI2RlZmluZSBHU0JJOV9SRVNFVAkJCQkJNzgKKyNkZWZpbmUgR1NCSTEwX1JFU0VUCQkJCQk3OQorI2RlZmluZSBHU0JJMTFfUkVTRVQJCQkJCTgwCisjZGVmaW5lIEdTQkkxMl9SRVNFVAkJCQkJODEKKyNkZWZpbmUgU1BETV9SRVNFVAkJCQkJODIKKyNkZWZpbmUgVExNTV9IX1JFU0VUCQkJCQk4MworI2RlZmluZSBTRkFCX01TU19TX1JFU0VUCQkJCTg0CisjZGVmaW5lIE1TU19TTFBfUkVTRVQJCQkJCTg1CisjZGVmaW5lIE1TU19RNlNXX0pUQUdfUkVTRVQJCQkJODYKKyNkZWZpbmUgTVNTX1E2RldfSlRBR19SRVNFVAkJCQk4NworI2RlZmluZSBNU1NfUkVTRVQJCQkJCTg4CisjZGVmaW5lIFNBVEFfSF9SRVNFVAkJCQkJODkKKyNkZWZpbmUgU0FUQV9SWE9PQl9SRVNFCQkJCQk5MAorI2RlZmluZSBTQVRBX1BNQUxJVkVfUkVTRVQJCQkJOTEKKyNkZWZpbmUgU0FUQV9TRkFCX01fUkVTRVQJCQkJOTIKKyNkZWZpbmUgVFNTQ19SRVNFVAkJCQkJOTMKKyNkZWZpbmUgUERNX1JFU0VUCQkJCQk5NAorI2RlZmluZSBNUE1fSF9SRVNFVAkJCQkJOTUKKyNkZWZpbmUgTVBNX1JFU0VUCQkJCQk5NgorI2RlZmluZSBTRkFCX1NNUFNTX1NfUkVTRVQJCQkJOTcKKyNkZWZpbmUgUFJOR19SRVNFVAkJCQkJOTgKKyNkZWZpbmUgUklWQV9SRVNFVAkJCQkJOTkKKyNkZWZpbmUgVVNCX0hTM19SRVNFVAkJCQkJMTAwCisjZGVmaW5lIFVTQl9IUzRfUkVTRVQJCQkJCTEwMQorI2RlZmluZSBDRTNfUkVTRVQJCQkJCTEwMgorI2RlZmluZSBQQ0lFX0VYVF9QQ0lfUkVTRVQJCQkJMTAzCisjZGVmaW5lIFBDSUVfUEhZX1JFU0VUCQkJCQkxMDQKKyNkZWZpbmUgUENJRV9QQ0lfUkVTRVQJCQkJCTEwNQorI2RlZmluZSBQQ0lFX1BPUl9SRVNFVAkJCQkJMTA2CisjZGVmaW5lIFBDSUVfSENMS19SRVNFVAkJCQkJMTA3CisjZGVmaW5lIFBDSUVfQUNMS19SRVNFVAkJCQkJMTA4CisjZGVmaW5lIENFM19IX1JFU0VUCQkJCQkxMDkKKyNkZWZpbmUgU0ZBQl9DRTNfTV9SRVNFVAkJCQkxMTAKKyNkZWZpbmUgU0ZBQl9DRTNfU19SRVNFVAkJCQkxMTEKKyNkZWZpbmUgU0FUQV9SRVNFVAkJCQkJMTEyCisjZGVmaW5lIENFM19TTEVFUF9SRVNFVAkJCQkJMTEzCisjZGVmaW5lIEdTU19TTFBfUkVTRVQJCQkJCTExNAorI2RlZmluZSBHU1NfUkVTRVQJCQkJCTExNQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3MvcmVzZXQvc3VuNmktYTMxLWNjdS5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9yZXNldC9zdW42aS1hMzEtY2N1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJmZjM2NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3MvcmVzZXQvc3VuNmktYTMxLWNjdS5oCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IENoZW4tWXUgVHNhaSA8d2Vuc0Bjc2llLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZHVhbC1saWNlbnNlZDogeW91IGNhbiB1c2UgaXQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdQTCBvciB0aGUgWDExIGxpY2Vuc2UsIGF0IHlvdXIgb3B0aW9uLiBOb3RlIHRoYXQgdGhpcyBkdWFsCisgKiBsaWNlbnNpbmcgb25seSBhcHBsaWVzIHRvIHRoaXMgZmlsZSwgYW5kIG5vdCB0aGlzIHByb2plY3QgYXMgYQorICogd2hvbGUuCisgKgorICogIGEpIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogICAgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogT3IsIGFsdGVybmF0aXZlbHksCisgKgorICogIGIpIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqICAgICBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnM6CisgKgorICogICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiAgICAgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX0RUX0JJTkRJTkdTX1JTVF9TVU42SV9BMzFfSF8KKyNkZWZpbmUgX0RUX0JJTkRJTkdTX1JTVF9TVU42SV9BMzFfSF8KKworI2RlZmluZSBSU1RfVVNCX1BIWTAJCTAKKyNkZWZpbmUgUlNUX1VTQl9QSFkxCQkxCisjZGVmaW5lIFJTVF9VU0JfUEhZMgkJMgorCisjZGVmaW5lIFJTVF9BSEIxX01JUElfRFNJCTMKKyNkZWZpbmUgUlNUX0FIQjFfU1MJCTQKKyNkZWZpbmUgUlNUX0FIQjFfRE1BCQk1CisjZGVmaW5lIFJTVF9BSEIxX01NQzAJCTYKKyNkZWZpbmUgUlNUX0FIQjFfTU1DMQkJNworI2RlZmluZSBSU1RfQUhCMV9NTUMyCQk4CisjZGVmaW5lIFJTVF9BSEIxX01NQzMJCTkKKyNkZWZpbmUgUlNUX0FIQjFfTkFORDEJCTEwCisjZGVmaW5lIFJTVF9BSEIxX05BTkQwCQkxMQorI2RlZmluZSBSU1RfQUhCMV9TRFJBTQkJMTIKKyNkZWZpbmUgUlNUX0FIQjFfRU1BQwkJMTMKKyNkZWZpbmUgUlNUX0FIQjFfVFMJCTE0CisjZGVmaW5lIFJTVF9BSEIxX0hTVElNRVIJMTUKKyNkZWZpbmUgUlNUX0FIQjFfU1BJMAkJMTYKKyNkZWZpbmUgUlNUX0FIQjFfU1BJMQkJMTcKKyNkZWZpbmUgUlNUX0FIQjFfU1BJMgkJMTgKKyNkZWZpbmUgUlNUX0FIQjFfU1BJMwkJMTkKKyNkZWZpbmUgUlNUX0FIQjFfT1RHCQkyMAorI2RlZmluZSBSU1RfQUhCMV9FSENJMAkJMjEKKyNkZWZpbmUgUlNUX0FIQjFfRUhDSTEJCTIyCisjZGVmaW5lIFJTVF9BSEIxX09IQ0kwCQkyMworI2RlZmluZSBSU1RfQUhCMV9PSENJMQkJMjQKKyNkZWZpbmUgUlNUX0FIQjFfT0hDSTIJCTI1CisjZGVmaW5lIFJTVF9BSEIxX1ZFCQkyNgorI2RlZmluZSBSU1RfQUhCMV9MQ0QwCQkyNworI2RlZmluZSBSU1RfQUhCMV9MQ0QxCQkyOAorI2RlZmluZSBSU1RfQUhCMV9DU0kJCTI5CisjZGVmaW5lIFJTVF9BSEIxX0hETUkJCTMwCisjZGVmaW5lIFJTVF9BSEIxX0JFMAkJMzEKKyNkZWZpbmUgUlNUX0FIQjFfQkUxCQkzMgorI2RlZmluZSBSU1RfQUhCMV9GRTAJCTMzCisjZGVmaW5lIFJTVF9BSEIxX0ZFMQkJMzQKKyNkZWZpbmUgUlNUX0FIQjFfTVAJCTM1CisjZGVmaW5lIFJTVF9BSEIxX0dQVQkJMzYKKyNkZWZpbmUgUlNUX0FIQjFfREVVMAkJMzcKKyNkZWZpbmUgUlNUX0FIQjFfREVVMQkJMzgKKyNkZWZpbmUgUlNUX0FIQjFfRFJDMAkJMzkKKyNkZWZpbmUgUlNUX0FIQjFfRFJDMQkJNDAKKyNkZWZpbmUgUlNUX0FIQjFfTFZEUwkJNDEKKworI2RlZmluZSBSU1RfQVBCMV9DT0RFQwkJNDIKKyNkZWZpbmUgUlNUX0FQQjFfU1BESUYJCTQzCisjZGVmaW5lIFJTVF9BUEIxX0RJR0lUQUxfTUlDCTQ0CisjZGVmaW5lIFJTVF9BUEIxX0RBVURJTzAJNDUKKyNkZWZpbmUgUlNUX0FQQjFfREFVRElPMQk0NgorI2RlZmluZSBSU1RfQVBCMl9JMkMwCQk0NworI2RlZmluZSBSU1RfQVBCMl9JMkMxCQk0OAorI2RlZmluZSBSU1RfQVBCMl9JMkMyCQk0OQorI2RlZmluZSBSU1RfQVBCMl9JMkMzCQk1MAorI2RlZmluZSBSU1RfQVBCMl9VQVJUMAkJNTEKKyNkZWZpbmUgUlNUX0FQQjJfVUFSVDEJCTUyCisjZGVmaW5lIFJTVF9BUEIyX1VBUlQyCQk1MworI2RlZmluZSBSU1RfQVBCMl9VQVJUMwkJNTQKKyNkZWZpbmUgUlNUX0FQQjJfVUFSVDQJCTU1CisjZGVmaW5lIFJTVF9BUEIyX1VBUlQ1CQk1NgorCisjZW5kaWYgLyogX0RUX0JJTkRJTkdTX1JTVF9TVU42SV9BMzFfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3MvcmVzZXQvc3VuOGktYTIzLWEzMy1jY3UuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvcmVzZXQvc3VuOGktYTIzLWEzMy1jY3UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTIxZjJiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9yZXNldC9zdW44aS1hMjMtYTMzLWNjdS5oCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgTWF4aW1lIFJpcGFyZCA8bWF4aW1lLnJpcGFyZEBmcmVlLWVsZWN0cm9ucy5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIGR1YWwtbGljZW5zZWQ6IHlvdSBjYW4gdXNlIGl0IGVpdGhlciB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHUEwgb3IgdGhlIFgxMSBsaWNlbnNlLCBhdCB5b3VyIG9wdGlvbi4gTm90ZSB0aGF0IHRoaXMgZHVhbAorICogbGljZW5zaW5nIG9ubHkgYXBwbGllcyB0byB0aGlzIGZpbGUsIGFuZCBub3QgdGhpcyBwcm9qZWN0IGFzIGEKKyAqIHdob2xlLgorICoKKyAqICBhKSBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqICAgICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIE9yLCBhbHRlcm5hdGl2ZWx5LAorICoKKyAqICBiKSBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiAgICAgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zOgorICoKKyAqICAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogICAgIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9EVF9CSU5ESU5HU19SU1RfU1VOOElfQTIzX0EzM19IXworI2RlZmluZSBfRFRfQklORElOR1NfUlNUX1NVTjhJX0EyM19BMzNfSF8KKworI2RlZmluZSBSU1RfVVNCX1BIWTAJCTAKKyNkZWZpbmUgUlNUX1VTQl9QSFkxCQkxCisjZGVmaW5lIFJTVF9VU0JfSFNJQwkJMgorI2RlZmluZSBSU1RfTUJVUwkJMworI2RlZmluZSBSU1RfQlVTX01JUElfRFNJCTQKKyNkZWZpbmUgUlNUX0JVU19TUwkJNQorI2RlZmluZSBSU1RfQlVTX0RNQQkJNgorI2RlZmluZSBSU1RfQlVTX01NQzAJCTcKKyNkZWZpbmUgUlNUX0JVU19NTUMxCQk4CisjZGVmaW5lIFJTVF9CVVNfTU1DMgkJOQorI2RlZmluZSBSU1RfQlVTX05BTkQJCTEwCisjZGVmaW5lIFJTVF9CVVNfRFJBTQkJMTEKKyNkZWZpbmUgUlNUX0JVU19IU1RJTUVSCQkxMgorI2RlZmluZSBSU1RfQlVTX1NQSTAJCTEzCisjZGVmaW5lIFJTVF9CVVNfU1BJMQkJMTQKKyNkZWZpbmUgUlNUX0JVU19PVEcJCTE1CisjZGVmaW5lIFJTVF9CVVNfRUhDSQkJMTYKKyNkZWZpbmUgUlNUX0JVU19PSENJCQkxNworI2RlZmluZSBSU1RfQlVTX1ZFCQkxOAorI2RlZmluZSBSU1RfQlVTX0xDRAkJMTkKKyNkZWZpbmUgUlNUX0JVU19DU0kJCTIwCisjZGVmaW5lIFJTVF9CVVNfREVfQkUJCTIxCisjZGVmaW5lIFJTVF9CVVNfREVfRkUJCTIyCisjZGVmaW5lIFJTVF9CVVNfR1BVCQkyMworI2RlZmluZSBSU1RfQlVTX01TR0JPWAkJMjQKKyNkZWZpbmUgUlNUX0JVU19TUElOTE9DSwkyNQorI2RlZmluZSBSU1RfQlVTX0RSQwkJMjYKKyNkZWZpbmUgUlNUX0JVU19TQVQJCTI3CisjZGVmaW5lIFJTVF9CVVNfTFZEUwkJMjgKKyNkZWZpbmUgUlNUX0JVU19DT0RFQwkJMjkKKyNkZWZpbmUgUlNUX0JVU19JMlMwCQkzMAorI2RlZmluZSBSU1RfQlVTX0kyUzEJCTMxCisjZGVmaW5lIFJTVF9CVVNfSTJDMAkJMzIKKyNkZWZpbmUgUlNUX0JVU19JMkMxCQkzMworI2RlZmluZSBSU1RfQlVTX0kyQzIJCTM0CisjZGVmaW5lIFJTVF9CVVNfVUFSVDAJCTM1CisjZGVmaW5lIFJTVF9CVVNfVUFSVDEJCTM2CisjZGVmaW5lIFJTVF9CVVNfVUFSVDIJCTM3CisjZGVmaW5lIFJTVF9CVVNfVUFSVDMJCTM4CisjZGVmaW5lIFJTVF9CVVNfVUFSVDQJCTM5CisKKyNlbmRpZiAvKiBfRFRfQklORElOR1NfUlNUX1NVTjhJX0EyM19BMzNfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUva3ZtL2FybV92Z2ljLmggYi9pbmNsdWRlL2t2bS9hcm1fdmdpYy5oCmluZGV4IDE5YjY5OGUuLjAwMmYwOTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUva3ZtL2FybV92Z2ljLmgKKysrIGIvaW5jbHVkZS9rdm0vYXJtX3ZnaWMuaApAQCAtMjAsOSArMjAsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9rdm0uaD4KICNpbmNsdWRlIDxsaW51eC9pcnFyZXR1cm4uaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXRpY19rZXkuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGt2bS9pb2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9qdW1wX2xhYmVsLmg+CiAKICNkZWZpbmUgVkdJQ19WM19NQVhfQ1BVUwkyNTUKICNkZWZpbmUgVkdJQ19WMl9NQVhfQ1BVUwk4CkBAIC00OSw2ICs1MSw5IEBACiAJLyogUGh5c2ljYWwgYWRkcmVzcyBvZiB2Z2ljIHZpcnR1YWwgY3B1IGludGVyZmFjZSAqLwogCXBoeXNfYWRkcl90CQl2Y3B1X2Jhc2U7CiAKKwkvKiBHSUNWIG1hcHBpbmcgKi8KKwl2b2lkIF9faW9tZW0JCSp2Y3B1X2Jhc2VfdmE7CisKIAkvKiB2aXJ0dWFsIGNvbnRyb2wgaW50ZXJmYWNlIG1hcHBpbmcgKi8KIAl2b2lkIF9faW9tZW0JCSp2Y3RybF9iYXNlOwogCkBAIC02Myw2ICs2OCw5IEBACiAKIAkvKiBPbmx5IG5lZWRlZCBmb3IgdGhlIGxlZ2FjeSBLVk1fQ1JFQVRFX0lSUUNISVAgKi8KIAlib29sCQkJY2FuX2VtdWxhdGVfZ2ljdjI7CisKKwkvKiBHSUMgc3lzdGVtIHJlZ2lzdGVyIENQVSBpbnRlcmZhY2UgKi8KKwlzdHJ1Y3Qgc3RhdGljX2tleV9mYWxzZSBnaWN2M19jcHVpZjsKIH07CiAKIGV4dGVybiBzdHJ1Y3QgdmdpY19nbG9iYWwga3ZtX3ZnaWNfZ2xvYmFsX3N0YXRlOwpAQCAtMjE3LDcgKzIyNSw2IEBACiB9OwogCiBzdHJ1Y3QgdmdpY192M19jcHVfaWYgewotI2lmZGVmIENPTkZJR19LVk1fQVJNX1ZHSUNfVjMKIAl1MzIJCXZnaWNfaGNyOwogCXUzMgkJdmdpY192bWNyOwogCXUzMgkJdmdpY19zcmU7CS8qIFJlc3RvcmVkIG9ubHksIGNoYW5nZSBpZ25vcmVkICovCkBAIC0yMjcsNyArMjM0LDYgQEAKIAl1MzIJCXZnaWNfYXAwcls0XTsKIAl1MzIJCXZnaWNfYXAxcls0XTsKIAl1NjQJCXZnaWNfbHJbVkdJQ19WM19NQVhfTFJTXTsKLSNlbmRpZgogfTsKIAogc3RydWN0IHZnaWNfY3B1IHsKQEAgLTI2NSw2ICsyNzEsOCBAQAogCWJvb2wgbHBpc19lbmFibGVkOwogfTsKIAorZXh0ZXJuIHN0cnVjdCBzdGF0aWNfa2V5X2ZhbHNlIHZnaWNfdjJfY3B1aWZfdHJhcDsKKwogaW50IGt2bV92Z2ljX2FkZHIoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nIHR5cGUsIHU2NCAqYWRkciwgYm9vbCB3cml0ZSk7CiB2b2lkIGt2bV92Z2ljX2Vhcmx5X2luaXQoc3RydWN0IGt2bSAqa3ZtKTsKIGludCBrdm1fdmdpY19jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCB1MzIgdHlwZSk7CkBAIC0yOTQsMTMgKzMwMiw3IEBACiB2b2lkIGt2bV92Z2ljX3N5bmNfaHdzdGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogdm9pZCBrdm1fdmdpY19mbHVzaF9od3N0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKLSNpZmRlZiBDT05GSUdfS1ZNX0FSTV9WR0lDX1YzCiB2b2lkIHZnaWNfdjNfZGlzcGF0Y2hfc2dpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IHJlZyk7Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIHZnaWNfdjNfZGlzcGF0Y2hfc2dpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IHJlZykKLXsKLX0KLSNlbmRpZgogCiAvKioKICAqIGt2bV92Z2ljX2dldF9tYXhfdmNwdXMgLSBHZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIFZDUFVzIGFsbG93ZWQgYnkgSFcKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYWNwaS5oIGIvaW5jbHVkZS9saW51eC9hY3BpLmgKaW5kZXggNGQ4NDUyYy4uOTRhZmNiMmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYWNwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvYWNwaS5oCkBAIC04NSw2ICs4NSw4IEBACiAJcmV0dXJuIGRldl9uYW1lKCZhZGV2LT5kZXYpOwogfQogCitzdHJ1Y3QgZGV2aWNlICphY3BpX2dldF9maXJzdF9waHlzaWNhbF9ub2RlKHN0cnVjdCBhY3BpX2RldmljZSAqYWRldik7CisKIGVudW0gYWNwaV9pcnFfbW9kZWxfaWQgewogCUFDUElfSVJRX01PREVMX1BJQyA9IDAsCiAJQUNQSV9JUlFfTU9ERUxfSU9BUElDLApAQCAtMjY3LDEyICsyNjksMTggQEAKIAlyZXR1cm4gcGh5c19pZCA9PSBQSFlTX0NQVUlEX0lOVkFMSUQ7CiB9CiAKKy8qIFZhbGlkYXRlIHRoZSBwcm9jZXNzb3Igb2JqZWN0J3MgcHJvY19pZCAqLworYm9vbCBhY3BpX3Byb2Nlc3Nvcl92YWxpZGF0ZV9wcm9jX2lkKGludCBwcm9jX2lkKTsKKwogI2lmZGVmIENPTkZJR19BQ1BJX0hPVFBMVUdfQ1BVCiAvKiBBcmNoIGRlcGVuZGVudCBmdW5jdGlvbnMgZm9yIGNwdSBob3RwbHVnIHN1cHBvcnQgKi8KIGludCBhY3BpX21hcF9jcHUoYWNwaV9oYW5kbGUgaGFuZGxlLCBwaHlzX2NwdWlkX3QgcGh5c2lkLCBpbnQgKnBjcHUpOwogaW50IGFjcGlfdW5tYXBfY3B1KGludCBjcHUpOworaW50IGFjcGlfbWFwX2NwdTJub2RlKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IGNwdSwgaW50IHBoeXNpZCk7CiAjZW5kaWYgLyogQ09ORklHX0FDUElfSE9UUExVR19DUFUgKi8KIAordm9pZCBhY3BpX3NldF9wcm9jZXNzb3JfbWFwcGluZyh2b2lkKTsKKwogI2lmZGVmIENPTkZJR19BQ1BJX0hPVFBMVUdfSU9BUElDCiBpbnQgYWNwaV9nZXRfaW9hcGljX2lkKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGdzaV9iYXNlLCB1NjQgKnBoeXNfYWRkcik7CiAjZW5kaWYKQEAgLTYzNCw2ICs2NDIsMTEgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlICphY3BpX2dldF9maXJzdF9waHlzaWNhbF9ub2RlKHN0cnVjdCBhY3BpX2RldmljZSAqYWRldikKK3sKKwlyZXR1cm4gTlVMTDsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGFjcGlfZWFybHlfaW5pdCh2b2lkKSB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX3N1YnN5c3RlbV9pbml0KHZvaWQpIHsgfQogCkBAIC03NTEsNiArNzY0LDEyIEBACiAKICNlbmRpZgkvKiAhQ09ORklHX0FDUEkgKi8KIAorI2lmZGVmIENPTkZJR19BQ1BJX0hPVFBMVUdfSU9BUElDCitpbnQgYWNwaV9pb2FwaWNfYWRkKGFjcGlfaGFuZGxlIHJvb3QpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGFjcGlfaW9hcGljX2FkZChhY3BpX2hhbmRsZSByb290KSB7IHJldHVybiAwOyB9CisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19BQ1BJCiB2b2lkIGFjcGlfb3Nfc2V0X3ByZXBhcmVfc2xlZXAoaW50ICgqZnVuYykodTggc2xlZXBfc3RhdGUsCiAJCQkgICAgICAgdTMyIHBtMWFfY3RybCwgIHUzMiBwbTFiX2N0cmwpKTsKQEAgLTEwNTYsNyArMTA3NSw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLSNkZWZpbmUgQUNQSV9ERUNMQVJFX1BST0JFX0VOVFJZKHRhYmxlLCBuYW1lLCB0YWJsZV9pZCwgc3VidGFibGUsIHZhbGlkYXRlLCBkYXRhLCBmbikgXAorI2RlZmluZSBBQ1BJX0RFQ0xBUkVfUFJPQkVfRU5UUlkodGFibGUsIG5hbWUsIHRhYmxlX2lkLCBzdWJ0YWJsZSwgdmFsaWQsIGRhdGEsIGZuKSBcCiAJc3RhdGljIGNvbnN0IHZvaWQgKiBfX2FjcGlfdGFibGVfIyNuYW1lW10JCQlcCiAJCV9fYXR0cmlidXRlX18oKHVudXNlZCkpCQkJCQlcCiAJCSA9IHsgKHZvaWQgKikgdGFibGVfaWQsCQkJCQlcCkBAIC0xMDc0LDQgKzEwOTMsMTYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX3RhYmxlX3VwZ3JhZGUodm9pZCkgeyB9CiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX0FDUEkpICYmIGRlZmluZWQoQ09ORklHX0FDUElfV0FUQ0hET0cpCitleHRlcm4gYm9vbCBhY3BpX2hhc193YXRjaGRvZyh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGJvb2wgYWNwaV9oYXNfd2F0Y2hkb2codm9pZCkgeyByZXR1cm4gZmFsc2U7IH0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FDUElfU1BDUl9UQUJMRQoraW50IHBhcnNlX3NwY3IoYm9vbCBlYXJseWNvbik7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgcGFyc2Vfc3Bjcihib29sIGVhcmx5Y29uKSB7IHJldHVybiAwOyB9CisjZW5kaWYKKwogI2VuZGlmCS8qX0xJTlVYX0FDUElfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FjcGlfaW9ydC5oIGIvaW5jbHVkZS9saW51eC9hY3BpX2lvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTMyZGFjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9hY3BpX2lvcnQuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2LCBTZW1paGFsZgorICoJQXV0aG9yOiBUb21hc3ogTm93aWNraSA8dG5Ac2VtaWhhbGYuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCisgKiBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KKyAqLworCisjaWZuZGVmIF9fQUNQSV9JT1JUX0hfXworI2RlZmluZSBfX0FDUElfSU9SVF9IX18KKworI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9md25vZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KKworaW50IGlvcnRfcmVnaXN0ZXJfZG9tYWluX3Rva2VuKGludCB0cmFuc19pZCwgc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3X25vZGUpOwordm9pZCBpb3J0X2RlcmVnaXN0ZXJfZG9tYWluX3Rva2VuKGludCB0cmFuc19pZCk7CitzdHJ1Y3QgZndub2RlX2hhbmRsZSAqaW9ydF9maW5kX2RvbWFpbl90b2tlbihpbnQgdHJhbnNfaWQpOworI2lmZGVmIENPTkZJR19BQ1BJX0lPUlQKK3ZvaWQgYWNwaV9pb3J0X2luaXQodm9pZCk7Cit1MzIgaW9ydF9tc2lfbWFwX3JpZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiByZXFfaWQpOworc3RydWN0IGlycV9kb21haW4gKmlvcnRfZ2V0X2RldmljZV9kb21haW4oc3RydWN0IGRldmljZSAqZGV2LCB1MzIgcmVxX2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9pb3J0X2luaXQodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHUzMiBpb3J0X21zaV9tYXBfcmlkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIHJlcV9pZCkKK3sgcmV0dXJuIHJlcV9pZDsgfQorc3RhdGljIGlubGluZSBzdHJ1Y3QgaXJxX2RvbWFpbiAqaW9ydF9nZXRfZGV2aWNlX2RvbWFpbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCQkJdTMyIHJlcV9pZCkKK3sgcmV0dXJuIE5VTEw7IH0KKyNlbmRpZgorCisjZW5kaWYgLyogX19BQ1BJX0lPUlRfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FtYmEvYnVzLmggYi9pbmNsdWRlL2xpbnV4L2FtYmEvYnVzLmgKaW5kZXggM2Q4ZGNkZC4uZDE0M2MxMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hbWJhL2J1cy5oCisrKyBiL2luY2x1ZGUvbGludXgvYW1iYS9idXMuaApAQCAtNTMsOCArNTMsMTQgQEAKIAlBTUJBX1ZFTkRPUl9TVCA9IDB4ODAsCiAJQU1CQV9WRU5ET1JfUUNPTSA9IDB4NTEsCiAJQU1CQV9WRU5ET1JfTFNJID0gMHhiNiwKKwlBTUJBX1ZFTkRPUl9MSU5VWCA9IDB4ZmUsCS8qIFRoaXMgdmFsdWUgaXMgbm90IG9mZmljaWFsICovCiB9OwogCisvKiBUaGlzIGlzIHVzZWQgdG8gZ2VuZXJhdGUgcHNldWRvLUlEIGZvciBBTUJBIGRldmljZSAqLworI2RlZmluZSBBTUJBX0xJTlVYX0lEKGNvbmYsIHJldiwgcGFydCkgXAorCSgoKGNvbmYpICYgMHhmZikgPDwgMjQgfCAoKHJldikgJiAweGYpIDw8IDIwIHwgXAorCUFNQkFfVkVORE9SX0xJTlVYIDw8IDEyIHwgKChwYXJ0KSAmIDB4ZmZmKSkKKwogZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBhbWJhX2J1c3R5cGU7CiAKICNkZWZpbmUgdG9fYW1iYV9kZXZpY2UoZCkJY29udGFpbmVyX29mKGQsIHN0cnVjdCBhbWJhX2RldmljZSwgZGV2KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hbWJhL3NlcmlhbC5oIGIvaW5jbHVkZS9saW51eC9hbWJhL3NlcmlhbC5oCmluZGV4IGQ3NmExOWIuLmFkMDk2NWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYW1iYS9zZXJpYWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2FtYmEvc2VyaWFsLmgKQEAgLTEwNCw2ICsxMDQsMTUgQEAKICNkZWZpbmUgVUFSVDAxeF9GUl9DVFMgCQkweDAwMQogI2RlZmluZSBVQVJUMDF4X0ZSX1RNU0sJCShVQVJUMDF4X0ZSX1RYRkYgKyBVQVJUMDF4X0ZSX0JVU1kpCiAKKy8qCisgKiBTb21lIGJpdHMgb2YgRmxhZyBSZWdpc3RlciBvbiBaVEUgZGV2aWNlIGhhdmUgZGlmZmVyZW50IHBvc2l0aW9uIGZyb20KKyAqIHN0YW5kYXJkIG9uZXMuCisgKi8KKyNkZWZpbmUgWlhfVUFSVDAxeF9GUl9CVVNZCTB4MTAwCisjZGVmaW5lIFpYX1VBUlQwMXhfRlJfRFNSCTB4MDA4CisjZGVmaW5lIFpYX1VBUlQwMXhfRlJfQ1RTCTB4MDAyCisjZGVmaW5lIFpYX1VBUlQwMTFfRlJfUkkJMHgwMDEKKwogI2RlZmluZSBVQVJUMDExX0NSX0NUU0VOCTB4ODAwMAkvKiBDVFMgaGFyZHdhcmUgZmxvdyBjb250cm9sICovCiAjZGVmaW5lIFVBUlQwMTFfQ1JfUlRTRU4JMHg0MDAwCS8qIFJUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgKi8KICNkZWZpbmUgVUFSVDAxMV9DUl9PVVQyCQkweDIwMDAJLyogT1VUMiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hbWQtaW9tbXUuaCBiL2luY2x1ZGUvbGludXgvYW1kLWlvbW11LmgKaW5kZXggMmIwOGU3OS4uMDk3NTFkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hbWQtaW9tbXUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2FtZC1pb21tdS5oCkBAIC0yMiw2ICsyMiwyMCBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAorLyoKKyAqIFRoaXMgaXMgbWFpbmx5IHVzZWQgdG8gY29tbXVuaWNhdGUgaW5mb3JtYXRpb24gYmFjay1hbmQtZm9ydGgKKyAqIGJldHdlZW4gU1ZNIGFuZCBJT01NVSBmb3Igc2V0dGluZyB1cCBhbmQgdGVhcmluZyBkb3duIHBvc3RlZAorICogaW50ZXJydXB0CisgKi8KK3N0cnVjdCBhbWRfaW9tbXVfcGlfZGF0YSB7CisJdTMyIGdhX3RhZzsKKwl1MzIgcHJldl9nYV90YWc7CisJdTY0IGJhc2U7CisJYm9vbCBpc19ndWVzdF9tb2RlOworCXN0cnVjdCB2Y3B1X2RhdGEgKnZjcHVfZGF0YTsKKwl2b2lkICppcl9kYXRhOworfTsKKwogI2lmZGVmIENPTkZJR19BTURfSU9NTVUKIAogc3RydWN0IHRhc2tfc3RydWN0OwpAQCAtMTY4LDExICsxODIsMzQgQEAKIAogZXh0ZXJuIGludCBhbWRfaW9tbXVfc2V0X2ludmFsaWRhdGVfY3R4X2NiKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCQkgICBhbWRfaW9tbXVfaW52YWxpZGF0ZV9jdHggY2IpOwotCi0jZWxzZQorI2Vsc2UgLyogQ09ORklHX0FNRF9JT01NVSAqLwogCiBzdGF0aWMgaW5saW5lIGludCBhbWRfaW9tbXVfZGV0ZWN0KHZvaWQpIHsgcmV0dXJuIC1FTk9ERVY7IH0KIAotI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX0FNRF9JT01NVSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfQU1EX0lPTU1VKSAmJiBkZWZpbmVkKENPTkZJR19JUlFfUkVNQVApCisKKy8qIElPTU1VIEFWSUMgRnVuY3Rpb24gKi8KK2V4dGVybiBpbnQgYW1kX2lvbW11X3JlZ2lzdGVyX2dhX2xvZ19ub3RpZmllcihpbnQgKCpub3RpZmllcikodTMyKSk7CisKK2V4dGVybiBpbnQKK2FtZF9pb21tdV91cGRhdGVfZ2EoaW50IGNwdSwgYm9vbCBpc19ydW4sIHZvaWQgKmRhdGEpOworCisjZWxzZSAvKiBkZWZpbmVkKENPTkZJR19BTURfSU9NTVUpICYmIGRlZmluZWQoQ09ORklHX0lSUV9SRU1BUCkgKi8KKworc3RhdGljIGlubGluZSBpbnQKK2FtZF9pb21tdV9yZWdpc3Rlcl9nYV9sb2dfbm90aWZpZXIoaW50ICgqbm90aWZpZXIpKHUzMikpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CithbWRfaW9tbXVfdXBkYXRlX2dhKGludCBjcHUsIGJvb2wgaXNfcnVuLCB2b2lkICpkYXRhKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfQU1EX0lPTU1VKSAmJiBkZWZpbmVkKENPTkZJR19JUlFfUkVNQVApICovCiAKICNlbmRpZiAvKiBfQVNNX1g4Nl9BTURfSU9NTVVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdG1lbF9zZXJpYWwuaCBiL2luY2x1ZGUvbGludXgvYXRtZWxfc2VyaWFsLmgKaW5kZXggNWE0ZDY2NC4uYmQyNTYwNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hdG1lbF9zZXJpYWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2F0bWVsX3NlcmlhbC5oCkBAIC0xMTgsNiArMTE4LDggQEAKIAogI2RlZmluZSBBVE1FTF9VU19CUkdSCQkweDIwCS8qIEJhdWQgUmF0ZSBHZW5lcmF0b3IgUmVnaXN0ZXIgKi8KICNkZWZpbmUJQVRNRUxfVVNfQ0QJCUdFTk1BU0soMTUsIDApCS8qIENsb2NrIERpdmlkZXIgKi8KKyNkZWZpbmUgQVRNRUxfVVNfRlBfT0ZGU0VUCTE2CS8qIEZyYWN0aW9uYWwgUGFydCAqLworI2RlZmluZSBBVE1FTF9VU19GUF9NQVNLCTB4NwogCiAjZGVmaW5lIEFUTUVMX1VTX1JUT1IJCTB4MjQJLyogUmVjZWl2ZXIgVGltZS1vdXQgUmVnaXN0ZXIgZm9yIFVTQVJUICovCiAjZGVmaW5lIEFUTUVMX1VBX1JUT1IJCTB4MjgJLyogUmVjZWl2ZXIgVGltZS1vdXQgUmVnaXN0ZXIgZm9yIFVBUlQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmNtYS9iY21hLmggYi9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYS5oCmluZGV4IDNkYjI1ZGYuLjhlZWVkYjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmNtYS9iY21hLmgKKysrIGIvaW5jbHVkZS9saW51eC9iY21hL2JjbWEuaApAQCAtMjA1LDYgKzIwNSw5IEBACiAjZGVmaW5lICBCQ01BX1BLR19JRF9CQ000NzA5CTAKICNkZWZpbmUgQkNNQV9DSElQX0lEX0JDTTQ3MDk0CTUzMDMwCiAjZGVmaW5lIEJDTUFfQ0hJUF9JRF9CQ001MzAxOAk1MzAxOAorI2RlZmluZSBCQ01BX0NISVBfSURfQkNNNTM1NzMJNTM1NzMKKyNkZWZpbmUgIEJDTUFfUEtHX0lEX0JDTTUzNTczCTAKKyNkZWZpbmUgIEJDTUFfUEtHX0lEX0JDTTQ3MTg5CTEKIAogLyogQm9hcmQgdHlwZXMgKG9uIFBDSSB1c3VhbGx5IGVxdWFscyB0byB0aGUgc3Vic3lzdGVtIGRldiBpZCkgKi8KIC8qIEJDTTQzMTMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmNtYS9iY21hX3JlZ3MuaCBiL2luY2x1ZGUvbGludXgvYmNtYS9iY21hX3JlZ3MuaAppbmRleCBlYmQ1YzFmLi45OTg2ZjgyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYV9yZWdzLmgKKysrIGIvaW5jbHVkZS9saW51eC9iY21hL2JjbWFfcmVncy5oCkBAIC0xMCw2ICsxMCw3IEBACiAjZGVmaW5lICBCQ01BX0NMS0NUTFNUX0hBVkVBTFBSRVEJMHgwMDAwMDAwOCAvKiBBTFAgYXZhaWxhYmxlIHJlcXVlc3QgKi8KICNkZWZpbmUgIEJDTUFfQ0xLQ1RMU1RfSEFWRUhUUkVRCTB4MDAwMDAwMTAgLyogSFQgYXZhaWxhYmxlIHJlcXVlc3QgKi8KICNkZWZpbmUgIEJDTUFfQ0xLQ1RMU1RfSFdDUk9GRgkJMHgwMDAwMDAyMCAvKiBGb3JjZSBIVyBjbG9jayByZXF1ZXN0IG9mZiAqLworI2RlZmluZSAgQkNNQV9DTEtDVExTVF9IUUNMS1JFUQkJMHgwMDAwMDA0MCAvKiBIUSBDbG9jayAqLwogI2RlZmluZSAgQkNNQV9DTEtDVExTVF9FWFRSRVNSRVEJMHgwMDAwMDcwMCAvKiBNYXNrIG9mIGV4dGVybmFsIHJlc291cmNlIHJlcXVlc3RzICovCiAjZGVmaW5lICBCQ01BX0NMS0NUTFNUX0VYVFJFU1JFUV9TSElGVAk4CiAjZGVmaW5lICBCQ01BX0NMS0NUTFNUX0hBVkVBTFAJCTB4MDAwMTAwMDAgLyogQUxQIGF2YWlsYWJsZSAqLwpAQCAtMjMsNiArMjQsNyBAQAogI2RlZmluZSAgQkNNQV9DTEtDVExTVF80MzI4QTBfSEFWRUFMUAkweDAwMDIwMDAwIC8qIDQzMjhhMCBoYXMgcmV2ZXJzZWQgYml0cyAqLwogCiAvKiBBZ2VudCByZWdpc3RlcnMgKGNvbW1vbiBmb3IgZXZlcnkgY29yZSkgKi8KKyNkZWZpbmUgQkNNQV9PT0JfU0VMX09VVF9BMzAJCTB4MDEwMAogI2RlZmluZSBCQ01BX0lPQ1RMCQkJMHgwNDA4IC8qIElPIGNvbnRyb2wgKi8KICNkZWZpbmUgIEJDTUFfSU9DVExfQ0xLCQkJMHgwMDAxCiAjZGVmaW5lICBCQ01BX0lPQ1RMX0ZHQwkJCTB4MDAwMgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iaW8uaCBiL2luY2x1ZGUvbGludXgvYmlvLmgKaW5kZXggNTlmZmFhNi4uMjNkZGY0YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jpby5oCkBAIC03MSw3ICs3MSw4IEBACiB7CiAJaWYgKGJpbyAmJgogCSAgICBiaW8tPmJpX2l0ZXIuYmlfc2l6ZSAmJgotCSAgICBiaW9fb3AoYmlvKSAhPSBSRVFfT1BfRElTQ0FSRCkKKwkgICAgYmlvX29wKGJpbykgIT0gUkVRX09QX0RJU0NBUkQgJiYKKwkgICAgYmlvX29wKGJpbykgIT0gUkVRX09QX1NFQ1VSRV9FUkFTRSkKIAkJcmV0dXJuIHRydWU7CiAKIAlyZXR1cm4gZmFsc2U7CkBAIC03OSw3ICs4MCw5IEBACiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBiaW9fbm9fYWR2YW5jZV9pdGVyKHN0cnVjdCBiaW8gKmJpbykKIHsKLQlyZXR1cm4gYmlvX29wKGJpbykgPT0gUkVRX09QX0RJU0NBUkQgfHwgYmlvX29wKGJpbykgPT0gUkVRX09QX1dSSVRFX1NBTUU7CisJcmV0dXJuIGJpb19vcChiaW8pID09IFJFUV9PUF9ESVNDQVJEIHx8CisJICAgICAgIGJpb19vcChiaW8pID09IFJFUV9PUF9TRUNVUkVfRVJBU0UgfHwKKwkgICAgICAgYmlvX29wKGJpbykgPT0gUkVRX09QX1dSSVRFX1NBTUU7CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBiaW9faXNfcncoc3RydWN0IGJpbyAqYmlvKQpAQCAtMTk5LDYgKzIwMiw5IEBACiAJaWYgKGJpb19vcChiaW8pID09IFJFUV9PUF9ESVNDQVJEKQogCQlyZXR1cm4gMTsKIAorCWlmIChiaW9fb3AoYmlvKSA9PSBSRVFfT1BfU0VDVVJFX0VSQVNFKQorCQlyZXR1cm4gMTsKKwogCWlmIChiaW9fb3AoYmlvKSA9PSBSRVFfT1BfV1JJVEVfU0FNRSkKIAkJcmV0dXJuIDE7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYml0ZmllbGQuaCBiL2luY2x1ZGUvbGludXgvYml0ZmllbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjUwNWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9iaXRmaWVsZC5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgRmVsaXggRmlldGthdSA8bmJkQG5iZC5uYW1lPgorICogQ29weXJpZ2h0IChDKSAyMDA0IC0gMjAwOSBJdm8gdmFuIERvb3JuIDxJdkRvb3JuQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9CSVRGSUVMRF9ICisjZGVmaW5lIF9MSU5VWF9CSVRGSUVMRF9ICisKKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KKworLyoKKyAqIEJpdGZpZWxkIGFjY2VzcyBtYWNyb3MKKyAqCisgKiBGSUVMRF97R0VULFBSRVB9IG1hY3JvcyB0YWtlIGFzIGZpcnN0IHBhcmFtZXRlciBzaGlmdGVkIG1hc2sKKyAqIGZyb20gd2hpY2ggdGhleSBleHRyYWN0IHRoZSBiYXNlIG1hc2sgYW5kIHNoaWZ0IGFtb3VudC4KKyAqIE1hc2sgbXVzdCBiZSBhIGNvbXBpbGF0aW9uIHRpbWUgY29uc3RhbnQuCisgKgorICogRXhhbXBsZToKKyAqCisgKiAgI2RlZmluZSBSRUdfRklFTERfQSAgR0VOTUFTSyg2LCAwKQorICogICNkZWZpbmUgUkVHX0ZJRUxEX0IgIEJJVCg3KQorICogICNkZWZpbmUgUkVHX0ZJRUxEX0MgIEdFTk1BU0soMTUsIDgpCisgKiAgI2RlZmluZSBSRUdfRklFTERfRCAgR0VOTUFTSygzMSwgMTYpCisgKgorICogR2V0OgorICogIGEgPSBGSUVMRF9HRVQoUkVHX0ZJRUxEX0EsIHJlZyk7CisgKiAgYiA9IEZJRUxEX0dFVChSRUdfRklFTERfQiwgcmVnKTsKKyAqCisgKiBTZXQ6CisgKiAgcmVnID0gRklFTERfUFJFUChSRUdfRklFTERfQSwgMSkgfAorICoJICBGSUVMRF9QUkVQKFJFR19GSUVMRF9CLCAwKSB8CisgKgkgIEZJRUxEX1BSRVAoUkVHX0ZJRUxEX0MsIGMpIHwKKyAqCSAgRklFTERfUFJFUChSRUdfRklFTERfRCwgMHg0MCk7CisgKgorICogTW9kaWZ5OgorICogIHJlZyAmPSB+UkVHX0ZJRUxEX0M7CisgKiAgcmVnIHw9IEZJRUxEX1BSRVAoUkVHX0ZJRUxEX0MsIGMpOworICovCisKKyNkZWZpbmUgX19iZl9zaGYoeCkgKF9fYnVpbHRpbl9mZnNsbCh4KSAtIDEpCisKKyNkZWZpbmUgX19CRl9GSUVMRF9DSEVDSyhfbWFzaywgX3JlZywgX3ZhbCwgX3BmeCkJCQlcCisJKHsJCQkJCQkJCVwKKwkJQlVJTERfQlVHX09OX01TRyghX19idWlsdGluX2NvbnN0YW50X3AoX21hc2spLAkJXAorCQkJCSBfcGZ4ICJtYXNrIGlzIG5vdCBjb25zdGFudCIpOwkJXAorCQlCVUlMRF9CVUdfT05fTVNHKCEoX21hc2spLCBfcGZ4ICJtYXNrIGlzIHplcm8iKTsJXAorCQlCVUlMRF9CVUdfT05fTVNHKF9fYnVpbHRpbl9jb25zdGFudF9wKF92YWwpID8JCVwKKwkJCQkgfigoX21hc2spID4+IF9fYmZfc2hmKF9tYXNrKSkgJiAoX3ZhbCkgOiAwLCBcCisJCQkJIF9wZnggInZhbHVlIHRvbyBsYXJnZSBmb3IgdGhlIGZpZWxkIik7IFwKKwkJQlVJTERfQlVHX09OX01TRygoX21hc2spID4gKHR5cGVvZihfcmVnKSl+MHVsbCwJCVwKKwkJCQkgX3BmeCAidHlwZSBvZiByZWcgdG9vIHNtYWxsIGZvciBtYXNrIik7IFwKKwkJX19CVUlMRF9CVUdfT05fTk9UX1BPV0VSX09GXzIoKF9tYXNrKSArCQkJXAorCQkJCQkgICAgICAoMVVMTCA8PCBfX2JmX3NoZihfbWFzaykpKTsgXAorCX0pCisKKy8qKgorICogRklFTERfUFJFUCgpIC0gcHJlcGFyZSBhIGJpdGZpZWxkIGVsZW1lbnQKKyAqIEBfbWFzazogc2hpZnRlZCBtYXNrIGRlZmluaW5nIHRoZSBmaWVsZCdzIGxlbmd0aCBhbmQgcG9zaXRpb24KKyAqIEBfdmFsOiAgdmFsdWUgdG8gcHV0IGluIHRoZSBmaWVsZAorICoKKyAqIEZJRUxEX1BSRVAoKSBtYXNrcyBhbmQgc2hpZnRzIHVwIHRoZSB2YWx1ZS4gIFRoZSByZXN1bHQgc2hvdWxkCisgKiBiZSBjb21iaW5lZCB3aXRoIG90aGVyIGZpZWxkcyBvZiB0aGUgYml0ZmllbGQgdXNpbmcgbG9naWNhbCBPUi4KKyAqLworI2RlZmluZSBGSUVMRF9QUkVQKF9tYXNrLCBfdmFsKQkJCQkJCVwKKwkoewkJCQkJCQkJXAorCQlfX0JGX0ZJRUxEX0NIRUNLKF9tYXNrLCAwVUxMLCBfdmFsLCAiRklFTERfUFJFUDogIik7CVwKKwkJKCh0eXBlb2YoX21hc2spKShfdmFsKSA8PCBfX2JmX3NoZihfbWFzaykpICYgKF9tYXNrKTsJXAorCX0pCisKKy8qKgorICogRklFTERfR0VUKCkgLSBleHRyYWN0IGEgYml0ZmllbGQgZWxlbWVudAorICogQF9tYXNrOiBzaGlmdGVkIG1hc2sgZGVmaW5pbmcgdGhlIGZpZWxkJ3MgbGVuZ3RoIGFuZCBwb3NpdGlvbgorICogQF9yZWc6ICAzMmJpdCB2YWx1ZSBvZiBlbnRpcmUgYml0ZmllbGQKKyAqCisgKiBGSUVMRF9HRVQoKSBleHRyYWN0cyB0aGUgZmllbGQgc3BlY2lmaWVkIGJ5IEBfbWFzayBmcm9tIHRoZQorICogYml0ZmllbGQgcGFzc2VkIGluIGFzIEBfcmVnIGJ5IG1hc2tpbmcgYW5kIHNoaWZ0aW5nIGl0IGRvd24uCisgKi8KKyNkZWZpbmUgRklFTERfR0VUKF9tYXNrLCBfcmVnKQkJCQkJCVwKKwkoewkJCQkJCQkJXAorCQlfX0JGX0ZJRUxEX0NIRUNLKF9tYXNrLCBfcmVnLCAwVSwgIkZJRUxEX0dFVDogIik7CVwKKwkJKHR5cGVvZihfbWFzaykpKCgoX3JlZykgJiAoX21hc2spKSA+PiBfX2JmX3NoZihfbWFzaykpOwlcCisJfSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JpdG1hcC5oIGIvaW5jbHVkZS9saW51eC9iaXRtYXAuaAppbmRleCA1OThiYzk5Li4zYjc3NTg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2JpdG1hcC5oCisrKyBiL2luY2x1ZGUvbGludXgvYml0bWFwLmgKQEAgLTMzOSw2ICszMzksMjQgQEAKIAlyZXR1cm4gX19iaXRtYXBfcGFyc2UoYnVmLCBidWZsZW4sIDAsIG1hc2twLCBubWFza2JpdHMpOwogfQogCisvKgorICogYml0bWFwX2Zyb21fdTY0IC0gQ2hlY2sgYW5kIHN3YXAgd29yZHMgd2l0aGluIHU2NC4KKyAqICBAbWFzazogc291cmNlIGJpdG1hcAorICogIEBkc3Q6ICBkZXN0aW5hdGlvbiBiaXRtYXAKKyAqCisgKiBJbiAzMi1iaXQgQmlnIEVuZGlhbiBrZXJuZWwsIHdoZW4gdXNpbmcgKHUzMiAqKSgmdmFsKVsqXQorICogdG8gcmVhZCB1NjQgbWFzaywgd2Ugd2lsbCBnZXQgdGhlIHdyb25nIHdvcmQuCisgKiBUaGF0IGlzICIodTMyICopKCZ2YWwpWzBdIiBnZXRzIHRoZSB1cHBlciAzMiBiaXRzLAorICogYnV0IHdlIGV4cGVjdCB0aGUgbG93ZXIgMzItYml0cyBvZiB1NjQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiaXRtYXBfZnJvbV91NjQodW5zaWduZWQgbG9uZyAqZHN0LCB1NjQgbWFzaykKK3sKKwlkc3RbMF0gPSBtYXNrICYgVUxPTkdfTUFYOworCisJaWYgKHNpemVvZihtYXNrKSA+IHNpemVvZih1bnNpZ25lZCBsb25nKSkKKwkJZHN0WzFdID0gbWFzayA+PiAzMjsKK30KKwogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAjZW5kaWYgLyogX19MSU5VWF9CSVRNQVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ibGtkZXYuaCBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKaW5kZXggMmMyMTBiNi4uZTc5MDU1YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ibGtkZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCkBAIC04ODIsNyArODgyLDcgQEAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGJsa19xdWV1ZV9nZXRfbWF4X3NlY3RvcnMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCiAJCQkJCQkgICAgIGludCBvcCkKIHsKLQlpZiAodW5saWtlbHkob3AgPT0gUkVRX09QX0RJU0NBUkQpKQorCWlmICh1bmxpa2VseShvcCA9PSBSRVFfT1BfRElTQ0FSRCB8fCBvcCA9PSBSRVFfT1BfU0VDVVJFX0VSQVNFKSkKIAkJcmV0dXJuIG1pbihxLT5saW1pdHMubWF4X2Rpc2NhcmRfc2VjdG9ycywgVUlOVF9NQVggPj4gOSk7CiAKIAlpZiAodW5saWtlbHkob3AgPT0gUkVRX09QX1dSSVRFX1NBTUUpKQpAQCAtOTEzLDcgKzkxMyw5IEBACiAJaWYgKHVubGlrZWx5KHJxLT5jbWRfdHlwZSAhPSBSRVFfVFlQRV9GUykpCiAJCXJldHVybiBxLT5saW1pdHMubWF4X2h3X3NlY3RvcnM7CiAKLQlpZiAoIXEtPmxpbWl0cy5jaHVua19zZWN0b3JzIHx8IChyZXFfb3AocnEpID09IFJFUV9PUF9ESVNDQVJEKSkKKwlpZiAoIXEtPmxpbWl0cy5jaHVua19zZWN0b3JzIHx8CisJICAgIHJlcV9vcChycSkgPT0gUkVRX09QX0RJU0NBUkQgfHwKKwkgICAgcmVxX29wKHJxKSA9PSBSRVFfT1BfU0VDVVJFX0VSQVNFKQogCQlyZXR1cm4gYmxrX3F1ZXVlX2dldF9tYXhfc2VjdG9ycyhxLCByZXFfb3AocnEpKTsKIAogCXJldHVybiBtaW4oYmxrX21heF9zaXplX29mZnNldChxLCBvZmZzZXQpLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9icGYuaCBiL2luY2x1ZGUvbGludXgvYnBmLmgKaW5kZXggMTExMzQyMy4uYzIwMTAxNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9icGYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2JwZi5oCkBAIC05Niw2ICs5Niw3IEBACiBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gewogCXU2NCAoKmZ1bmMpKHU2NCByMSwgdTY0IHIyLCB1NjQgcjMsIHU2NCByNCwgdTY0IHI1KTsKIAlib29sIGdwbF9vbmx5OworCWJvb2wgcGt0X2FjY2VzczsKIAllbnVtIGJwZl9yZXR1cm5fdHlwZSByZXRfdHlwZTsKIAllbnVtIGJwZl9hcmdfdHlwZSBhcmcxX3R5cGU7CiAJZW51bSBicGZfYXJnX3R5cGUgYXJnMl90eXBlOwpAQCAtMTM4LDYgKzEzOSwxMyBAQAogCSAqLwogCVBUUl9UT19QQUNLRVQsCiAJUFRSX1RPX1BBQ0tFVF9FTkQsCSAvKiBza2ItPmRhdGEgKyBoZWFkbGVuICovCisKKwkvKiBQVFJfVE9fTUFQX1ZBTFVFX0FESiBpcyB1c2VkIGZvciBkb2luZyBwb2ludGVyIG1hdGggaW5zaWRlIG9mIGEgbWFwCisJICogZWxlbSB2YWx1ZS4gIFdlIG9ubHkgYWxsb3cgdGhpcyBpZiB3ZSBjYW4gc3RhdGljYWxseSB2ZXJpZnkgdGhhdAorCSAqIGFjY2VzcyBmcm9tIHRoaXMgcmVnaXN0ZXIgYXJlIGdvaW5nIHRvIGZhbGwgd2l0aGluIHRoZSBzaXplIG9mIHRoZQorCSAqIG1hcCBlbGVtZW50LgorCSAqLworCVBUUl9UT19NQVBfVkFMVUVfQURKLAogfTsKIAogc3RydWN0IGJwZl9wcm9nOwpAQCAtMTUxLDcgKzE1OSw4IEBACiAJICovCiAJYm9vbCAoKmlzX3ZhbGlkX2FjY2VzcykoaW50IG9mZiwgaW50IHNpemUsIGVudW0gYnBmX2FjY2Vzc190eXBlIHR5cGUsCiAJCQkJZW51bSBicGZfcmVnX3R5cGUgKnJlZ190eXBlKTsKLQorCWludCAoKmdlbl9wcm9sb2d1ZSkoc3RydWN0IGJwZl9pbnNuICppbnNuLCBib29sIGRpcmVjdF93cml0ZSwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpOwogCXUzMiAoKmNvbnZlcnRfY3R4X2FjY2VzcykoZW51bSBicGZfYWNjZXNzX3R5cGUgdHlwZSwgaW50IGRzdF9yZWcsCiAJCQkJICBpbnQgc3JjX3JlZywgaW50IGN0eF9vZmYsCiAJCQkJICBzdHJ1Y3QgYnBmX2luc24gKmluc24sIHN0cnVjdCBicGZfcHJvZyAqcHJvZyk7CkBAIC0yOTcsNiArMzA2LDEwIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgYnBmX3Byb2dfcHV0KHN0cnVjdCBicGZfcHJvZyAqcHJvZykKIHsKIH0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJwZl9wcm9nICpicGZfcHJvZ19pbmMoc3RydWN0IGJwZl9wcm9nICpwcm9nKQoreworCXJldHVybiBFUlJfUFRSKC1FT1BOT1RTVVBQKTsKK30KICNlbmRpZiAvKiBDT05GSUdfQlBGX1NZU0NBTEwgKi8KIAogLyogdmVyaWZpZXIgcHJvdG90eXBlcyBmb3IgaGVscGVyIGZ1bmN0aW9ucyBjYWxsZWQgZnJvbSBlQlBGIHByb2dyYW1zICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JwZl92ZXJpZmllci5oIGIvaW5jbHVkZS9saW51eC9icGZfdmVyaWZpZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDM1Yjk5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9icGZfdmVyaWZpZXIuaApAQCAtMCwwICsxLDEwMiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTQgUExVTWdyaWQsIGh0dHA6Ly9wbHVtZ3JpZC5jb20KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaWZuZGVmIF9MSU5VWF9CUEZfVkVSSUZJRVJfSAorI2RlZmluZSBfTElOVVhfQlBGX1ZFUklGSUVSX0ggMQorCisjaW5jbHVkZSA8bGludXgvYnBmLmg+IC8qIGZvciBlbnVtIGJwZl9yZWdfdHlwZSAqLworI2luY2x1ZGUgPGxpbnV4L2ZpbHRlci5oPiAvKiBmb3IgTUFYX0JQRl9TVEFDSyAqLworCisgLyogSnVzdCBzb21lIGFyYml0cmFyeSB2YWx1ZXMgc28gd2UgY2FuIHNhZmVseSBkbyBtYXRoIHdpdGhvdXQgb3ZlcmZsb3dpbmcgYW5kCisgICogYXJlIG9idmlvdXNseSB3cm9uZyBmb3IgYW55IHNvcnQgb2YgbWVtb3J5IGFjY2Vzcy4KKyAgKi8KKyNkZWZpbmUgQlBGX1JFR0lTVEVSX01BWF9SQU5HRSAoMTAyNCAqIDEwMjQgKiAxMDI0KQorI2RlZmluZSBCUEZfUkVHSVNURVJfTUlOX1JBTkdFIC0oMTAyNCAqIDEwMjQgKiAxMDI0KQorCitzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSB7CisJZW51bSBicGZfcmVnX3R5cGUgdHlwZTsKKwkvKgorCSAqIFVzZWQgdG8gZGV0ZXJtaW5lIGlmIGFueSBtZW1vcnkgYWNjZXNzIHVzaW5nIHRoaXMgcmVnaXN0ZXIgd2lsbAorCSAqIHJlc3VsdCBpbiBhIGJhZCBhY2Nlc3MuCisJICovCisJdTY0IG1pbl92YWx1ZSwgbWF4X3ZhbHVlOworCXVuaW9uIHsKKwkJLyogdmFsaWQgd2hlbiB0eXBlID09IENPTlNUX0lNTSB8IFBUUl9UT19TVEFDSyB8IFVOS05PV05fVkFMVUUgKi8KKwkJczY0IGltbTsKKworCQkvKiB2YWxpZCB3aGVuIHR5cGUgPT0gUFRSX1RPX1BBQ0tFVCogKi8KKwkJc3RydWN0IHsKKwkJCXUzMiBpZDsKKwkJCXUxNiBvZmY7CisJCQl1MTYgcmFuZ2U7CisJCX07CisKKwkJLyogdmFsaWQgd2hlbiB0eXBlID09IENPTlNUX1BUUl9UT19NQVAgfCBQVFJfVE9fTUFQX1ZBTFVFIHwKKwkJICogICBQVFJfVE9fTUFQX1ZBTFVFX09SX05VTEwKKwkJICovCisJCXN0cnVjdCBicGZfbWFwICptYXBfcHRyOworCX07Cit9OworCitlbnVtIGJwZl9zdGFja19zbG90X3R5cGUgeworCVNUQUNLX0lOVkFMSUQsICAgIC8qIG5vdGhpbmcgd2FzIHN0b3JlZCBpbiB0aGlzIHN0YWNrIHNsb3QgKi8KKwlTVEFDS19TUElMTCwgICAgICAvKiByZWdpc3RlciBzcGlsbGVkIGludG8gc3RhY2sgKi8KKwlTVEFDS19NSVNDCSAgLyogQlBGIHByb2dyYW0gd3JvdGUgc29tZSBkYXRhIGludG8gdGhpcyBzbG90ICovCit9OworCisjZGVmaW5lIEJQRl9SRUdfU0laRSA4CS8qIHNpemUgb2YgZUJQRiByZWdpc3RlciBpbiBieXRlcyAqLworCisvKiBzdGF0ZSBvZiB0aGUgcHJvZ3JhbToKKyAqIHR5cGUgb2YgYWxsIHJlZ2lzdGVycyBhbmQgc3RhY2sgaW5mbworICovCitzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YXRlIHsKKwlzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSByZWdzW01BWF9CUEZfUkVHXTsKKwl1OCBzdGFja19zbG90X3R5cGVbTUFYX0JQRl9TVEFDS107CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgc3BpbGxlZF9yZWdzW01BWF9CUEZfU1RBQ0sgLyBCUEZfUkVHX1NJWkVdOworfTsKKworLyogbGlua2VkIGxpc3Qgb2YgdmVyaWZpZXIgc3RhdGVzIHVzZWQgdG8gcHJ1bmUgc2VhcmNoICovCitzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YXRlX2xpc3QgeworCXN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgc3RhdGU7CisJc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZV9saXN0ICpuZXh0OworfTsKKworc3RydWN0IGJwZl9pbnNuX2F1eF9kYXRhIHsKKwllbnVtIGJwZl9yZWdfdHlwZSBwdHJfdHlwZTsJLyogcG9pbnRlciB0eXBlIGZvciBsb2FkL3N0b3JlIGluc25zICovCit9OworCisjZGVmaW5lIE1BWF9VU0VEX01BUFMgNjQgLyogbWF4IG51bWJlciBvZiBtYXBzIGFjY2Vzc2VkIGJ5IG9uZSBlQlBGIHByb2dyYW0gKi8KKworc3RydWN0IGJwZl92ZXJpZmllcl9lbnY7CitzdHJ1Y3QgYnBmX2V4dF9hbmFseXplcl9vcHMgeworCWludCAoKmluc25faG9vaykoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwKKwkJCSBpbnQgaW5zbl9pZHgsIGludCBwcmV2X2luc25faWR4KTsKK307CisKKy8qIHNpbmdsZSBjb250YWluZXIgZm9yIGFsbCBzdHJ1Y3RzCisgKiBvbmUgdmVyaWZpZXJfZW52IHBlciBicGZfY2hlY2soKSBjYWxsCisgKi8KK3N0cnVjdCBicGZfdmVyaWZpZXJfZW52IHsKKwlzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7CQkvKiBlQlBGIHByb2dyYW0gYmVpbmcgdmVyaWZpZWQgKi8KKwlzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YWNrX2VsZW0gKmhlYWQ7IC8qIHN0YWNrIG9mIHZlcmlmaWVyIHN0YXRlcyB0byBiZSBwcm9jZXNzZWQgKi8KKwlpbnQgc3RhY2tfc2l6ZTsJCQkvKiBudW1iZXIgb2Ygc3RhdGVzIHRvIGJlIHByb2Nlc3NlZCAqLworCXN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgY3VyX3N0YXRlOyAvKiBjdXJyZW50IHZlcmlmaWVyIHN0YXRlICovCisJc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZV9saXN0ICoqZXhwbG9yZWRfc3RhdGVzOyAvKiBzZWFyY2ggcHJ1bmluZyBvcHRpbWl6YXRpb24gKi8KKwljb25zdCBzdHJ1Y3QgYnBmX2V4dF9hbmFseXplcl9vcHMgKmFuYWx5emVyX29wczsgLyogZXh0ZXJuYWwgYW5hbHl6ZXIgb3BzICovCisJdm9pZCAqYW5hbHl6ZXJfcHJpdjsgLyogcG9pbnRlciB0byBleHRlcm5hbCBhbmFseXplcidzIHByaXZhdGUgZGF0YSAqLworCXN0cnVjdCBicGZfbWFwICp1c2VkX21hcHNbTUFYX1VTRURfTUFQU107IC8qIGFycmF5IG9mIG1hcCdzIHVzZWQgYnkgZUJQRiBwcm9ncmFtICovCisJdTMyIHVzZWRfbWFwX2NudDsJCS8qIG51bWJlciBvZiB1c2VkIG1hcHMgKi8KKwl1MzIgaWRfZ2VuOwkJCS8qIHVzZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIHJlZyBJRHMgKi8KKwlib29sIGFsbG93X3B0cl9sZWFrczsKKwlib29sIHNlZW5fZGlyZWN0X3dyaXRlOworCWJvb2wgdmFybGVuX21hcF92YWx1ZV9hY2Nlc3M7CisJc3RydWN0IGJwZl9pbnNuX2F1eF9kYXRhICppbnNuX2F1eF9kYXRhOyAvKiBhcnJheSBvZiBwZXItaW5zbiBzdGF0ZSAqLworfTsKKworaW50IGJwZl9hbmFseXplcihzdHJ1Y3QgYnBmX3Byb2cgKnByb2csIGNvbnN0IHN0cnVjdCBicGZfZXh0X2FuYWx5emVyX29wcyAqb3BzLAorCQkgdm9pZCAqcHJpdik7CisKKyNlbmRpZiAvKiBfTElOVVhfQlBGX1ZFUklGSUVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnVnLmggYi9pbmNsdWRlL2xpbnV4L2J1Zy5oCmluZGV4IGU1MWIwNzAuLjI5MmQ2YTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYnVnLmgKKysrIGIvaW5jbHVkZS9saW51eC9idWcuaApAQCAtMTMsNiArMTMsNyBAQAogc3RydWN0IHB0X3JlZ3M7CiAKICNpZmRlZiBfX0NIRUNLRVJfXworI2RlZmluZSBfX0JVSUxEX0JVR19PTl9OT1RfUE9XRVJfT0ZfMihuKSAoMCkKICNkZWZpbmUgQlVJTERfQlVHX09OX05PVF9QT1dFUl9PRl8yKG4pICgwKQogI2RlZmluZSBCVUlMRF9CVUdfT05fWkVSTyhlKSAoMCkKICNkZWZpbmUgQlVJTERfQlVHX09OX05VTEwoZSkgKCh2b2lkKikwKQpAQCAtMjQsNiArMjUsOCBAQAogI2Vsc2UgLyogX19DSEVDS0VSX18gKi8KIAogLyogRm9yY2UgYSBjb21waWxhdGlvbiBlcnJvciBpZiBhIGNvbnN0YW50IGV4cHJlc3Npb24gaXMgbm90IGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBfX0JVSUxEX0JVR19PTl9OT1RfUE9XRVJfT0ZfMihuKQlcCisJQlVJTERfQlVHX09OKCgobikgJiAoKG4pIC0gMSkpICE9IDApCiAjZGVmaW5lIEJVSUxEX0JVR19PTl9OT1RfUE9XRVJfT0ZfMihuKQkJCVwKIAlCVUlMRF9CVUdfT04oKG4pID09IDAgfHwgKCgobikgJiAoKG4pIC0gMSkpICE9IDApKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nhbi9kZXYuaCBiL2luY2x1ZGUvbGludXgvY2FuL2Rldi5oCmluZGV4IDUyNjE3NTEuLjVmNTI3MDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2FuL2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvY2FuL2Rldi5oCkBAIC0zMiw2ICszMiw3IEBACiAgKiBDQU4gY29tbW9uIHByaXZhdGUgZGF0YQogICovCiBzdHJ1Y3QgY2FuX3ByaXYgeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IGNhbl9kZXZpY2Vfc3RhdHMgY2FuX3N0YXRzOwogCiAJc3RydWN0IGNhbl9iaXR0aW1pbmcgYml0dGltaW5nLCBkYXRhX2JpdHRpbWluZzsKQEAgLTQ3LDcgKzQ4LDcgQEAKIAl1MzIgY3RybG1vZGVfc3RhdGljOwkvKiBzdGF0aWMgZW5hYmxlZCBvcHRpb25zIGZvciBkcml2ZXIvaGFyZHdhcmUgKi8KIAogCWludCByZXN0YXJ0X21zOwotCXN0cnVjdCB0aW1lcl9saXN0IHJlc3RhcnRfdGltZXI7CisJc3RydWN0IGRlbGF5ZWRfd29yayByZXN0YXJ0X3dvcms7CiAKIAlpbnQgKCpkb19zZXRfYml0dGltaW5nKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAlpbnQgKCpkb19zZXRfZGF0YV9iaXR0aW1pbmcpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jZWMtZnVuY3MuaCBiL2luY2x1ZGUvbGludXgvY2VjLWZ1bmNzLmgKaW5kZXggODJjM2QzYi4uMTM4YmJmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jZWMtZnVuY3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NlYy1mdW5jcy5oCkBAIC0xNjIsMTAgKzE2MiwxMSBAQAogCiAKIC8qIE9uZSBUb3VjaCBSZWNvcmQgRmVhdHVyZSAqLwotc3RhdGljIGlubGluZSB2b2lkIGNlY19tc2dfcmVjb3JkX29mZihzdHJ1Y3QgY2VjX21zZyAqbXNnKQorc3RhdGljIGlubGluZSB2b2lkIGNlY19tc2dfcmVjb3JkX29mZihzdHJ1Y3QgY2VjX21zZyAqbXNnLCBib29sIHJlcGx5KQogewogCW1zZy0+bGVuID0gMjsKIAltc2ctPm1zZ1sxXSA9IENFQ19NU0dfUkVDT1JEX09GRjsKKwltc2ctPnJlcGx5ID0gcmVwbHkgPyBDRUNfTVNHX1JFQ09SRF9TVEFUVVMgOiAwOwogfQogCiBzdHJ1Y3QgY2VjX29wX2FyaWJfZGF0YSB7CkBAIC0yMjcsNyArMjI4LDcgQEAKIAlpZiAoZGlnaXRhbC0+c2VydmljZV9pZF9tZXRob2QgPT0gQ0VDX09QX1NFUlZJQ0VfSURfTUVUSE9EX0JZX0NIQU5ORUwpIHsKIAkJKm1zZysrID0gKGRpZ2l0YWwtPmNoYW5uZWwuY2hhbm5lbF9udW1iZXJfZm10IDw8IDIpIHwKIAkJCSAoZGlnaXRhbC0+Y2hhbm5lbC5tYWpvciA+PiA4KTsKLQkJKm1zZysrID0gZGlnaXRhbC0+Y2hhbm5lbC5tYWpvciAmJiAweGZmOworCQkqbXNnKysgPSBkaWdpdGFsLT5jaGFubmVsLm1ham9yICYgMHhmZjsKIAkJKm1zZysrID0gZGlnaXRhbC0+Y2hhbm5lbC5taW5vciA+PiA4OwogCQkqbXNnKysgPSBkaWdpdGFsLT5jaGFubmVsLm1pbm9yICYgMHhmZjsKIAkJKm1zZysrID0gMDsKQEAgLTMyMyw2ICszMjQsNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY2VjX21zZ19yZWNvcmRfb24oc3RydWN0IGNlY19tc2cgKm1zZywKKwkJCQkgICAgIGJvb2wgcmVwbHksCiAJCQkJICAgICBjb25zdCBzdHJ1Y3QgY2VjX29wX3JlY29yZF9zcmMgKnJlY19zcmMpCiB7CiAJc3dpdGNoIChyZWNfc3JjLT50eXBlKSB7CkBAIC0zNDYsNiArMzQ4LDcgQEAKIAkJCQkJICAgIHJlY19zcmMtPmV4dF9waHlzX2FkZHIucGh5c19hZGRyKTsKIAkJYnJlYWs7CiAJfQorCW1zZy0+cmVwbHkgPSByZXBseSA/IENFQ19NU0dfUkVDT1JEX1NUQVRVUyA6IDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjZWNfb3BzX3JlY29yZF9vbihjb25zdCBzdHJ1Y3QgY2VjX21zZyAqbXNnLApAQCAtMTE0MSw2ICsxMTQ0LDc1IEBACiAJbXNnLT5yZXBseSA9IHJlcGx5ID8gQ0VDX01TR19ERVZJQ0VfVkVORE9SX0lEIDogMDsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGNlY19tc2dfdmVuZG9yX2NvbW1hbmQoc3RydWN0IGNlY19tc2cgKm1zZywKKwkJCQkJICBfX3U4IHNpemUsIGNvbnN0IF9fdTggKnZlbmRvcl9jbWQpCit7CisJaWYgKHNpemUgPiAxNCkKKwkJc2l6ZSA9IDE0OworCW1zZy0+bGVuID0gMiArIHNpemU7CisJbXNnLT5tc2dbMV0gPSBDRUNfTVNHX1ZFTkRPUl9DT01NQU5EOworCW1lbWNweShtc2ctPm1zZyArIDIsIHZlbmRvcl9jbWQsIHNpemUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2VjX29wc192ZW5kb3JfY29tbWFuZChjb25zdCBzdHJ1Y3QgY2VjX21zZyAqbXNnLAorCQkJCQkgIF9fdTggKnNpemUsCisJCQkJCSAgY29uc3QgX191OCAqKnZlbmRvcl9jbWQpCit7CisJKnNpemUgPSBtc2ctPmxlbiAtIDI7CisKKwlpZiAoKnNpemUgPiAxNCkKKwkJKnNpemUgPSAxNDsKKwkqdmVuZG9yX2NtZCA9IG1zZy0+bXNnICsgMjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNlY19tc2dfdmVuZG9yX2NvbW1hbmRfd2l0aF9pZChzdHJ1Y3QgY2VjX21zZyAqbXNnLAorCQkJCQkJICBfX3UzMiB2ZW5kb3JfaWQsIF9fdTggc2l6ZSwKKwkJCQkJCSAgY29uc3QgX191OCAqdmVuZG9yX2NtZCkKK3sKKwlpZiAoc2l6ZSA+IDExKQorCQlzaXplID0gMTE7CisJbXNnLT5sZW4gPSA1ICsgc2l6ZTsKKwltc2ctPm1zZ1sxXSA9IENFQ19NU0dfVkVORE9SX0NPTU1BTkRfV0lUSF9JRDsKKwltc2ctPm1zZ1syXSA9IHZlbmRvcl9pZCA+PiAxNjsKKwltc2ctPm1zZ1szXSA9ICh2ZW5kb3JfaWQgPj4gOCkgJiAweGZmOworCW1zZy0+bXNnWzRdID0gdmVuZG9yX2lkICYgMHhmZjsKKwltZW1jcHkobXNnLT5tc2cgKyA1LCB2ZW5kb3JfY21kLCBzaXplKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNlY19vcHNfdmVuZG9yX2NvbW1hbmRfd2l0aF9pZChjb25zdCBzdHJ1Y3QgY2VjX21zZyAqbXNnLAorCQkJCQkJICBfX3UzMiAqdmVuZG9yX2lkLCAgX191OCAqc2l6ZSwKKwkJCQkJCSAgY29uc3QgX191OCAqKnZlbmRvcl9jbWQpCit7CisJKnNpemUgPSBtc2ctPmxlbiAtIDU7CisKKwlpZiAoKnNpemUgPiAxMSkKKwkJKnNpemUgPSAxMTsKKwkqdmVuZG9yX2lkID0gKG1zZy0+bXNnWzJdIDw8IDE2KSB8IChtc2ctPm1zZ1szXSA8PCA4KSB8IG1zZy0+bXNnWzRdOworCSp2ZW5kb3JfY21kID0gbXNnLT5tc2cgKyA1OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2VjX21zZ192ZW5kb3JfcmVtb3RlX2J1dHRvbl9kb3duKHN0cnVjdCBjZWNfbXNnICptc2csCisJCQkJCQkgICAgIF9fdTggc2l6ZSwKKwkJCQkJCSAgICAgY29uc3QgX191OCAqcmNfY29kZSkKK3sKKwlpZiAoc2l6ZSA+IDE0KQorCQlzaXplID0gMTQ7CisJbXNnLT5sZW4gPSAyICsgc2l6ZTsKKwltc2ctPm1zZ1sxXSA9IENFQ19NU0dfVkVORE9SX1JFTU9URV9CVVRUT05fRE9XTjsKKwltZW1jcHkobXNnLT5tc2cgKyAyLCByY19jb2RlLCBzaXplKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNlY19vcHNfdmVuZG9yX3JlbW90ZV9idXR0b25fZG93bihjb25zdCBzdHJ1Y3QgY2VjX21zZyAqbXNnLAorCQkJCQkJICAgICBfX3U4ICpzaXplLAorCQkJCQkJICAgICBjb25zdCBfX3U4ICoqcmNfY29kZSkKK3sKKwkqc2l6ZSA9IG1zZy0+bGVuIC0gMjsKKworCWlmICgqc2l6ZSA+IDE0KQorCQkqc2l6ZSA9IDE0OworCSpyY19jb2RlID0gbXNnLT5tc2cgKyAyOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgY2VjX21zZ192ZW5kb3JfcmVtb3RlX2J1dHRvbl91cChzdHJ1Y3QgY2VjX21zZyAqbXNnKQogewogCW1zZy0+bGVuID0gMjsKQEAgLTEyNzcsNyArMTM0OSw3IEBACiAJCW1zZy0+bGVuICs9IDQ7CiAJCW1zZy0+bXNnWzNdID0gKHVpX2NtZC0+Y2hhbm5lbF9pZGVudGlmaWVyLmNoYW5uZWxfbnVtYmVyX2ZtdCA8PCAyKSB8CiAJCQkgICAgICAodWlfY21kLT5jaGFubmVsX2lkZW50aWZpZXIubWFqb3IgPj4gOCk7Ci0JCW1zZy0+bXNnWzRdID0gdWlfY21kLT5jaGFubmVsX2lkZW50aWZpZXIubWFqb3IgJiYgMHhmZjsKKwkJbXNnLT5tc2dbNF0gPSB1aV9jbWQtPmNoYW5uZWxfaWRlbnRpZmllci5tYWpvciAmIDB4ZmY7CiAJCW1zZy0+bXNnWzVdID0gdWlfY21kLT5jaGFubmVsX2lkZW50aWZpZXIubWlub3IgPj4gODsKIAkJbXNnLT5tc2dbNl0gPSB1aV9jbWQtPmNoYW5uZWxfaWRlbnRpZmllci5taW5vciAmIDB4ZmY7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jZWMuaCBiL2luY2x1ZGUvbGludXgvY2VjLmgKaW5kZXggYjNlMjI4OS4uODUxOTY4ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jZWMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NlYy5oCkBAIC0zNjQsNyArMzY0LDcgQEAKICAqIEBudW1fbG9nX2FkZHJzOiBob3cgbWFueSBsb2dpY2FsIGFkZHJlc3NlcyBzaG91bGQgYmUgY2xhaW1lZC4gU2V0IGJ5IHRoZQogICoJY2FsbGVyLgogICogQHZlbmRvcl9pZDogdGhlIHZlbmRvciBJRCBvZiB0aGUgZGV2aWNlLiBTZXQgYnkgdGhlIGNhbGxlci4KLSAqIEBmbGFnczogc2V0IHRvIDAuCisgKiBAZmxhZ3M6IGZsYWdzLgogICogQG9zZF9uYW1lOiB0aGUgT1NEIG5hbWUgb2YgdGhlIGRldmljZS4gU2V0IGJ5IHRoZSBjYWxsZXIuCiAgKiBAcHJpbWFyeV9kZXZpY2VfdHlwZTogdGhlIHByaW1hcnkgZGV2aWNlIHR5cGUgZm9yIGVhY2ggbG9naWNhbCBhZGRyZXNzLgogICoJU2V0IGJ5IHRoZSBjYWxsZXIuCkBAIC0zODksNiArMzg5LDkgQEAKIAlfX3U4IGZlYXR1cmVzW0NFQ19NQVhfTE9HX0FERFJTXVsxMl07CiB9OwogCisvKiBBbGxvdyBhIGZhbGxiYWNrIHRvIHVucmVnaXN0ZXJlZCAqLworI2RlZmluZSBDRUNfTE9HX0FERFJTX0ZMX0FMTE9XX1VOUkVHX0ZBTExCQUNLCSgxIDw8IDApCisKIC8qIEV2ZW50cyAqLwogCiAvKiBFdmVudCB0aGF0IG9jY3VycyB3aGVuIHRoZSBhZGFwdGVyIHN0YXRlIGNoYW5nZXMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2dyb3VwLmggYi9pbmNsdWRlL2xpbnV4L2Nncm91cC5oCmluZGV4IDk4NGY3M2IuLjQ0MGE3MjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2dyb3VwLmgKKysrIGIvaW5jbHVkZS9saW51eC9jZ3JvdXAuaApAQCAtNDk3LDYgKzQ5NywyMyBAQAogCXJldHVybiBjZ3JwLT5hbmNlc3Rvcl9pZHNbYW5jZXN0b3ItPmxldmVsXSA9PSBhbmNlc3Rvci0+aWQ7CiB9CiAKKy8qKgorICogdGFza191bmRlcl9jZ3JvdXBfaGllcmFyY2h5IC0gdGVzdCB0YXNrJ3MgbWVtYmVyc2hpcCBvZiBjZ3JvdXAgYW5jZXN0cnkKKyAqIEB0YXNrOiB0aGUgdGFzayB0byBiZSB0ZXN0ZWQKKyAqIEBhbmNlc3RvcjogcG9zc2libGUgYW5jZXN0b3Igb2YgQHRhc2sncyBjZ3JvdXAKKyAqCisgKiBUZXN0cyB3aGV0aGVyIEB0YXNrJ3MgZGVmYXVsdCBjZ3JvdXAgaGllcmFyY2h5IGlzIGEgZGVzY2VuZGFudCBvZiBAYW5jZXN0b3IuCisgKiBJdCBmb2xsb3dzIGFsbCB0aGUgc2FtZSBydWxlcyBhcyBjZ3JvdXBfaXNfZGVzY2VuZGFudCwgYW5kIG9ubHkgYXBwbGllcworICogdG8gdGhlIGRlZmF1bHQgaGllcmFyY2h5LgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgdGFza191bmRlcl9jZ3JvdXBfaGllcmFyY2h5KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkJICAgICAgIHN0cnVjdCBjZ3JvdXAgKmFuY2VzdG9yKQoreworCXN0cnVjdCBjc3Nfc2V0ICpjc2V0ID0gdGFza19jc3Nfc2V0KHRhc2spOworCisJcmV0dXJuIGNncm91cF9pc19kZXNjZW5kYW50KGNzZXQtPmRmbF9jZ3JwLCBhbmNlc3Rvcik7Cit9CisKIC8qIG5vIHN5bmNocm9uaXphdGlvbiwgdGhlIHJlc3VsdCBjYW4gb25seSBiZSB1c2VkIGFzIGEgaGludCAqLwogc3RhdGljIGlubGluZSBib29sIGNncm91cF9pc19wb3B1bGF0ZWQoc3RydWN0IGNncm91cCAqY2dycCkKIHsKQEAgLTU1Nyw2ICs1NzQsNyBAQAogI2Vsc2UgLyogIUNPTkZJR19DR1JPVVBTICovCiAKIHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlOworc3RydWN0IGNncm91cDsKIAogc3RhdGljIGlubGluZSB2b2lkIGNzc19wdXQoc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcykge30KIHN0YXRpYyBpbmxpbmUgaW50IGNncm91cF9hdHRhY2hfdGFza19hbGwoc3RydWN0IHRhc2tfc3RydWN0ICpmcm9tLApAQCAtNTc0LDYgKzU5MiwxMSBAQAogc3RhdGljIGlubGluZSBpbnQgY2dyb3VwX2luaXRfZWFybHkodm9pZCkgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSBpbnQgY2dyb3VwX2luaXQodm9pZCkgeyByZXR1cm4gMDsgfQogCitzdGF0aWMgaW5saW5lIGJvb2wgdGFza191bmRlcl9jZ3JvdXBfaGllcmFyY2h5KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkJICAgICAgIHN0cnVjdCBjZ3JvdXAgKmFuY2VzdG9yKQoreworCXJldHVybiB0cnVlOworfQogI2VuZGlmIC8qICFDT05GSUdfQ0dST1VQUyAqLwogCiAvKgpAQCAtNjIxLDYgKzY0NCw3IEBACiAJYXRvbWljX3QJCWNvdW50OwogCXN0cnVjdCBuc19jb21tb24JbnM7CiAJc3RydWN0IHVzZXJfbmFtZXNwYWNlCSp1c2VyX25zOworCXN0cnVjdCB1Y291bnRzCQkqdWNvdW50czsKIAlzdHJ1Y3QgY3NzX3NldCAgICAgICAgICAqcm9vdF9jc2V0OwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jbGstcHJvdmlkZXIuaCBiL2luY2x1ZGUvbGludXgvY2xrLXByb3ZpZGVyLmgKaW5kZXggYTM5YzBjNS4uYWY1OTYzOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jbGstcHJvdmlkZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nsay1wcm92aWRlci5oCkBAIC03NzIsNyArNzcyLDcgQEAKIH07CiAKIHN0cnVjdCBjbGtfaHdfb25lY2VsbF9kYXRhIHsKLQlzaXplX3QgbnVtOworCXVuc2lnbmVkIGludCBudW07CiAJc3RydWN0IGNsa19odyAqaHdzW107CiB9OwogCkBAIC03ODAsNiArNzgwLDE4IEBACiAKICNkZWZpbmUgQ0xLX09GX0RFQ0xBUkUobmFtZSwgY29tcGF0LCBmbikgT0ZfREVDTEFSRV8xKGNsaywgbmFtZSwgY29tcGF0LCBmbikKIAorLyoKKyAqIFVzZSB0aGlzIG1hY3JvIHdoZW4geW91IGhhdmUgYSBkcml2ZXIgdGhhdCByZXF1aXJlcyB0d28gaW5pdGlhbGl6YXRpb24KKyAqIHJvdXRpbmVzLCBvbmUgYXQgb2ZfY2xrX2luaXQoKSwgYW5kIG9uZSBhdCBwbGF0Zm9ybSBkZXZpY2UgcHJvYmUKKyAqLworI2RlZmluZSBDTEtfT0ZfREVDTEFSRV9EUklWRVIobmFtZSwgY29tcGF0LCBmbikgXAorCXN0YXRpYyB2b2lkIG5hbWUjI19vZl9jbGtfaW5pdF9kcml2ZXIoc3RydWN0IGRldmljZV9ub2RlICpucCkJXAorCXsJCQkJCQkJCVwKKwkJb2Zfbm9kZV9jbGVhcl9mbGFnKG5wLCBPRl9QT1BVTEFURUQpOwkJCVwKKwkJZm4obnApOwkJCQkJCQlcCisJfQkJCQkJCQkJXAorCU9GX0RFQ0xBUkVfMShjbGssIG5hbWUsIGNvbXBhdCwgbmFtZSMjX29mX2Nsa19pbml0X2RyaXZlcikKKwogI2lmZGVmIENPTkZJR19PRgogaW50IG9mX2Nsa19hZGRfcHJvdmlkZXIoc3RydWN0IGRldmljZV9ub2RlICpucCwKIAkJCXN0cnVjdCBjbGsgKigqY2xrX3NyY19nZXQpKHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmFyZ3MsCkBAIC04NDIsNyArODU0LDcgQEAKIHsKIAlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKIH0KLXN0YXRpYyBpbmxpbmUgaW50IG9mX2Nsa19nZXRfcGFyZW50X2NvdW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBvZl9jbGtfZ2V0X3BhcmVudF9jb3VudChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb21waWxlci1nY2MuaCBiL2luY2x1ZGUvbGludXgvY29tcGlsZXItZ2NjLmgKaW5kZXggZTI5NDkzOS4uNTczYzVhMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb21waWxlci1nY2MuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLWdjYy5oCkBAIC0xNTgsNyArMTU4LDcgQEAKICNkZWZpbmUgX19jb21waWxlcl9vZmZzZXRvZihhLCBiKQkJCQkJXAogCV9fYnVpbHRpbl9vZmZzZXRvZihhLCBiKQogCi0jaWYgR0NDX1ZFUlNJT04gPj0gNDAxMDAgJiYgR0NDX1ZFUlNJT04gPCA0MDYwMAorI2lmIEdDQ19WRVJTSU9OID49IDQwMTAwCiAjIGRlZmluZSBfX2NvbXBpbGV0aW1lX29iamVjdF9zaXplKG9iaikgX19idWlsdGluX29iamVjdF9zaXplKG9iaiwgMCkKICNlbmRpZgogCkBAIC0yNDIsNyArMjQyLDExIEBACiAgKi8KICNkZWZpbmUgYXNtX3ZvbGF0aWxlX2dvdG8oeC4uLikJZG8geyBhc20gZ290byh4KTsgYXNtICgiIik7IH0gd2hpbGUgKDApCiAKLSNpZmRlZiBDT05GSUdfQVJDSF9VU0VfQlVJTFRJTl9CU1dBUAorLyoKKyAqIHNwYXJzZSAoX19DSEVDS0VSX18pIHByZXRlbmRzIHRvIGJlIGdjYywgYnV0IGNhbid0IGRvIGNvbnN0YW50CisgKiBmb2xkaW5nIGluIF9fYnVpbHRpbl9ic3dhcCooKSAoeWV0KSwgc28gZG9uJ3Qgc2V0IHRoZXNlIGZvciBpdC4KKyAqLworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfVVNFX0JVSUxUSU5fQlNXQVApICYmICFkZWZpbmVkKF9fQ0hFQ0tFUl9fKQogI2lmIEdDQ19WRVJTSU9OID49IDQwNDAwCiAjZGVmaW5lIF9fSEFWRV9CVUlMVElOX0JTV0FQMzJfXwogI2RlZmluZSBfX0hBVkVfQlVJTFRJTl9CU1dBUDY0X18KQEAgLTI1MCw3ICsyNTQsNyBAQAogI2lmIEdDQ19WRVJTSU9OID49IDQwODAwCiAjZGVmaW5lIF9fSEFWRV9CVUlMVElOX0JTV0FQMTZfXwogI2VuZGlmCi0jZW5kaWYgLyogQ09ORklHX0FSQ0hfVVNFX0JVSUxUSU5fQlNXQVAgKi8KKyNlbmRpZiAvKiBDT05GSUdfQVJDSF9VU0VfQlVJTFRJTl9CU1dBUCAmJiAhX19DSEVDS0VSX18gKi8KIAogI2lmIEdDQ19WRVJTSU9OID49IDUwMDAwCiAjZGVmaW5lIEtBU0FOX0FCSV9WRVJTSU9OIDQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29tcGlsZXIuaCBiL2luY2x1ZGUvbGludXgvY29tcGlsZXIuaAppbmRleCAxYmI5NTQ4Li42Njg1Njk4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9jb21waWxlci5oCkBAIC01MjcsMTMgKzUyNywxNCBAQAogICogb2JqZWN0J3MgbGlmZXRpbWUgaXMgbWFuYWdlZCBieSBzb21ldGhpbmcgb3RoZXIgdGhhbiBSQ1UuICBUaGF0CiAgKiAic29tZXRoaW5nIG90aGVyIiBtaWdodCBiZSByZWZlcmVuY2UgY291bnRpbmcgb3Igc2ltcGxlIGltbW9ydGFsaXR5LgogICoKLSAqIFRoZSBzZWVtaW5nbHkgdW51c2VkIHZvaWQgKiB2YXJpYWJsZSBpcyB0byB2YWxpZGF0ZSBAcCBpcyBpbmRlZWQgYSBwb2ludGVyCi0gKiB0eXBlLiBBbGwgcG9pbnRlciB0eXBlcyBzaWxlbnRseSBjYXN0IHRvIHZvaWQgKi4KKyAqIFRoZSBzZWVtaW5nbHkgdW51c2VkIHZhcmlhYmxlIF9fX3R5cGVjaGVja19wIHZhbGlkYXRlcyB0aGF0IEBwIGlzCisgKiBpbmRlZWQgYSBwb2ludGVyIHR5cGUgYnkgdXNpbmcgYSBwb2ludGVyIHRvIHR5cGVvZigqcCkgYXMgdGhlIHR5cGUuCisgKiBUYWtpbmcgYSBwb2ludGVyIHRvIHR5cGVvZigqcCkgYWdhaW4gaXMgbmVlZGVkIGluIGNhc2UgcCBpcyB2b2lkICouCiAgKi8KICNkZWZpbmUgbG9ja2xlc3NfZGVyZWZlcmVuY2UocCkgXAogKHsgXAogCXR5cGVvZihwKSBfX19fX19fX19wMSA9IFJFQURfT05DRShwKTsgXAotCV9fbWF5YmVfdW51c2VkIGNvbnN0IHZvaWQgKiBjb25zdCBfX19fX19fX19wMiA9IF9fX19fX19fX3AxOyBcCisJdHlwZW9mKCoocCkpICpfX190eXBlY2hlY2tfcCBfX21heWJlX3VudXNlZDsgXAogCXNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpOyAvKiBEZXBlbmRlbmN5IG9yZGVyIHZzLiBwIGFib3ZlLiAqLyBcCiAJKF9fX19fX19fX3AxKTsgXAogfSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29yZXNpZ2h0LmggYi9pbmNsdWRlL2xpbnV4L2NvcmVzaWdodC5oCmluZGV4IDM4NWQ2MmUuLjJhNTk4MmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29yZXNpZ2h0LmgKKysrIGIvaW5jbHVkZS9saW51eC9jb3Jlc2lnaHQuaApAQCAtMjMyLDggKzIzMiw5IEBACiAJaW50ICgqY3B1X2lkKShzdHJ1Y3QgY29yZXNpZ2h0X2RldmljZSAqY3NkZXYpOwogCWludCAoKnRyYWNlX2lkKShzdHJ1Y3QgY29yZXNpZ2h0X2RldmljZSAqY3NkZXYpOwogCWludCAoKmVuYWJsZSkoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2LAotCQkgICAgICBzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyLCAgdTMyIG1vZGUpOwotCXZvaWQgKCpkaXNhYmxlKShzdHJ1Y3QgY29yZXNpZ2h0X2RldmljZSAqY3NkZXYpOworCQkgICAgICBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsICB1MzIgbW9kZSk7CisJdm9pZCAoKmRpc2FibGUpKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2RldiwKKwkJCXN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7CiB9OwogCiBzdHJ1Y3QgY29yZXNpZ2h0X29wcyB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NwdS5oIGIvaW5jbHVkZS9saW51eC9jcHUuaAppbmRleCA3OTdkOWM4Li43NTcyZDllIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NwdS5oCisrKyBiL2luY2x1ZGUvbGludXgvY3B1LmgKQEAgLTYxLDE3ICs2MSw4IEBACiAjZGVmaW5lIENQVV9ET1dOX1BSRVBBUkUJMHgwMDA1IC8qIENQVSAodW5zaWduZWQpdiBnb2luZyBkb3duICovCiAjZGVmaW5lIENQVV9ET1dOX0ZBSUxFRAkJMHgwMDA2IC8qIENQVSAodW5zaWduZWQpdiBOT1QgZ29pbmcgZG93biAqLwogI2RlZmluZSBDUFVfREVBRAkJMHgwMDA3IC8qIENQVSAodW5zaWduZWQpdiBkZWFkICovCi0jZGVmaW5lIENQVV9EWUlORwkJMHgwMDA4IC8qIENQVSAodW5zaWduZWQpdiBub3QgcnVubmluZyBhbnkgdGFzaywKLQkJCQkJKiBub3QgaGFuZGxpbmcgaW50ZXJydXB0cywgc29vbiBkZWFkLgotCQkJCQkqIENhbGxlZCBvbiB0aGUgZHlpbmcgY3B1LCBpbnRlcnJ1cHRzCi0JCQkJCSogYXJlIGFscmVhZHkgZGlzYWJsZWQuIE11c3Qgbm90Ci0JCQkJCSogc2xlZXAsIG11c3Qgbm90IGZhaWwgKi8KICNkZWZpbmUgQ1BVX1BPU1RfREVBRAkJMHgwMDA5IC8qIENQVSAodW5zaWduZWQpdiBkZWFkLCBjcHVfaG90cGx1ZwogCQkJCQkqIGxvY2sgaXMgZHJvcHBlZCAqLwotI2RlZmluZSBDUFVfU1RBUlRJTkcJCTB4MDAwQSAvKiBDUFUgKHVuc2lnbmVkKXYgc29vbiBydW5uaW5nLgotCQkJCQkqIENhbGxlZCBvbiB0aGUgbmV3IGNwdSwganVzdCBiZWZvcmUKLQkJCQkJKiBlbmFibGluZyBpbnRlcnJ1cHRzLiBNdXN0IG5vdCBzbGVlcCwKLQkJCQkJKiBtdXN0IG5vdCBmYWlsICovCiAjZGVmaW5lIENQVV9CUk9LRU4JCTB4MDAwQiAvKiBDUFUgKHVuc2lnbmVkKXYgZGlkIG5vdCBkaWUgcHJvcGVybHksCiAJCQkJCSogcGVyaGFwcyBkdWUgdG8gcHJlZW1wdGlvbi4gKi8KIApAQCAtODYsOSArNzcsNiBAQAogI2RlZmluZSBDUFVfRE9XTl9QUkVQQVJFX0ZST1pFTgkoQ1BVX0RPV05fUFJFUEFSRSB8IENQVV9UQVNLU19GUk9aRU4pCiAjZGVmaW5lIENQVV9ET1dOX0ZBSUxFRF9GUk9aRU4JKENQVV9ET1dOX0ZBSUxFRCB8IENQVV9UQVNLU19GUk9aRU4pCiAjZGVmaW5lIENQVV9ERUFEX0ZST1pFTgkJKENQVV9ERUFEIHwgQ1BVX1RBU0tTX0ZST1pFTikKLSNkZWZpbmUgQ1BVX0RZSU5HX0ZST1pFTgkoQ1BVX0RZSU5HIHwgQ1BVX1RBU0tTX0ZST1pFTikKLSNkZWZpbmUgQ1BVX1NUQVJUSU5HX0ZST1pFTgkoQ1BVX1NUQVJUSU5HIHwgQ1BVX1RBU0tTX0ZST1pFTikKLQogCiAjaWZkZWYgQ09ORklHX1NNUAogZXh0ZXJuIGJvb2wgY3B1aHBfdGFza3NfZnJvemVuOwpAQCAtMjI4LDcgKzIxNiwxMSBAQAogI2VuZGlmCQkvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KIAogI2lmZGVmIENPTkZJR19QTV9TTEVFUF9TTVAKLWV4dGVybiBpbnQgZGlzYWJsZV9ub25ib290X2NwdXModm9pZCk7CitleHRlcm4gaW50IGZyZWV6ZV9zZWNvbmRhcnlfY3B1cyhpbnQgcHJpbWFyeSk7CitzdGF0aWMgaW5saW5lIGludCBkaXNhYmxlX25vbmJvb3RfY3B1cyh2b2lkKQoreworCXJldHVybiBmcmVlemVfc2Vjb25kYXJ5X2NwdXMoMCk7Cit9CiBleHRlcm4gdm9pZCBlbmFibGVfbm9uYm9vdF9jcHVzKHZvaWQpOwogI2Vsc2UgLyogIUNPTkZJR19QTV9TTEVFUF9TTVAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGRpc2FibGVfbm9uYm9vdF9jcHVzKHZvaWQpIHsgcmV0dXJuIDA7IH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1aG90cGx1Zy5oIGIvaW5jbHVkZS9saW51eC9jcHVob3RwbHVnLmgKaW5kZXggMjQyYmY1My4uOWIyMDdhOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcHVob3RwbHVnLmgKKysrIGIvaW5jbHVkZS9saW51eC9jcHVob3RwbHVnLmgKQEAgLTEsNiArMSw4IEBACiAjaWZuZGVmIF9fQ1BVSE9UUExVR19ICiAjZGVmaW5lIF9fQ1BVSE9UUExVR19ICiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCiBlbnVtIGNwdWhwX3N0YXRlIHsKIAlDUFVIUF9PRkZMSU5FLAogCUNQVUhQX0NSRUFURV9USFJFQURTLApAQCAtMTQsMTUgKzE2LDQyIEBACiAJQ1BVSFBfUEVSRl9TVVBFUkgsCiAJQ1BVSFBfWDg2X0hQRVRfREVBRCwKIAlDUFVIUF9YODZfQVBCX0RFQUQsCisJQ1BVSFBfVklSVF9ORVRfREVBRCwKKwlDUFVIUF9TTFVCX0RFQUQsCisJQ1BVSFBfTU1fV1JJVEVCQUNLX0RFQUQsCisJQ1BVSFBfU09GVElSUV9ERUFELAorCUNQVUhQX05FVF9NVk5FVEFfREVBRCwKKwlDUFVIUF9DUFVJRExFX0RFQUQsCisJQ1BVSFBfQVJNNjRfRlBTSU1EX0RFQUQsCisJQ1BVSFBfQVJNX09NQVBfV0FLRV9ERUFELAorCUNQVUhQX0lSUV9QT0xMX0RFQUQsCisJQ1BVSFBfQkxPQ0tfU09GVElSUV9ERUFELAorCUNQVUhQX1ZJUlRfU0NTSV9ERUFELAorCUNQVUhQX0FDUElfQ1BVRFJWX0RFQUQsCisJQ1BVSFBfUzM5MF9QRkFVTFRfREVBRCwKKwlDUFVIUF9CTEtfTVFfREVBRCwKIAlDUFVIUF9XT1JLUVVFVUVfUFJFUCwKIAlDUFVIUF9QT1dFUl9OVU1BX1BSRVBBUkUsCiAJQ1BVSFBfSFJUSU1FUlNfUFJFUEFSRSwKIAlDUFVIUF9QUk9GSUxFX1BSRVBBUkUsCiAJQ1BVSFBfWDJBUElDX1BSRVBBUkUsCiAJQ1BVSFBfU01QQ0ZEX1BSRVBBUkUsCisJQ1BVSFBfUkVMQVlfUFJFUEFSRSwKKwlDUFVIUF9TTEFCX1BSRVBBUkUsCisJQ1BVSFBfTURfUkFJRDVfUFJFUEFSRSwKIAlDUFVIUF9SQ1VUUkVFX1BSRVAsCisJQ1BVSFBfQ1BVSURMRV9DT1VQTEVEX1BSRVBBUkUsCisJQ1BVSFBfUE9XRVJQQ19QTUFDX1BSRVBBUkUsCisJQ1BVSFBfUE9XRVJQQ19NTVVfQ1RYX1BSRVBBUkUsCisJQ1BVSFBfWEVOX1BSRVBBUkUsCisJQ1BVSFBfWEVOX0VWVENITl9QUkVQQVJFLAogCUNQVUhQX05PVElGWV9QUkVQQVJFLAorCUNQVUhQX0FSTV9TSE1PQklMRV9TQ1VfUFJFUEFSRSwKKwlDUFVIUF9TSF9TSDNYX1BSRVBBUkUsCisJQ1BVSFBfQkxLX01RX1BSRVBBUkUsCiAJQ1BVSFBfVElNRVJTX0RFQUQsCisJQ1BVSFBfTk9URl9FUlJfSU5KX1BSRVBBUkUsCisJQ1BVSFBfTUlQU19TT0NfUFJFUEFSRSwKIAlDUFVIUF9CUklOR1VQX0NQVSwKIAlDUFVIUF9BUF9JRExFX0RFQUQsCiAJQ1BVSFBfQVBfT0ZGTElORSwKQEAgLTQ1LDYgKzc0LDggQEAKIAlDUFVIUF9BUF9QRVJGX01FVEFHX1NUQVJUSU5HLAogCUNQVUhQX0FQX01JUFNfT1BfTE9PTkdTT04zX1NUQVJUSU5HLAogCUNQVUhQX0FQX0FSTV9WRlBfU1RBUlRJTkcsCisJQ1BVSFBfQVBfQVJNNjRfREVCVUdfTU9OSVRPUlNfU1RBUlRJTkcsCisJQ1BVSFBfQVBfUEVSRl9BUk1fSFdfQlJFQUtQT0lOVF9TVEFSVElORywKIAlDUFVIUF9BUF9QRVJGX0FSTV9TVEFSVElORywKIAlDUFVIUF9BUF9BUk1fTDJYMF9TVEFSVElORywKIAlDUFVIUF9BUF9BUk1fQVJDSF9USU1FUl9TVEFSVElORywKQEAgLTY4LDcgKzk5LDYgQEAKIAlDUFVIUF9BUF9BUk02NF9JU05ERVBfU1RBUlRJTkcsCiAJQ1BVSFBfQVBfU01QQ0ZEX0RZSU5HLAogCUNQVUhQX0FQX1g4Nl9UQk9PVF9EWUlORywKLQlDUFVIUF9BUF9OT1RJRllfU1RBUlRJTkcsCiAJQ1BVSFBfQVBfT05MSU5FLAogCUNQVUhQX1RFQVJET1dOX0NQVSwKIAlDUFVIUF9BUF9PTkxJTkVfSURMRSwKQEAgLTg2LDYgKzExNiw3IEBACiAJQ1BVSFBfQVBfUEVSRl9TMzkwX1NGX09OTElORSwKIAlDUFVIUF9BUF9QRVJGX0FSTV9DQ0lfT05MSU5FLAogCUNQVUhQX0FQX1BFUkZfQVJNX0NDTl9PTkxJTkUsCisJQ1BVSFBfQVBfUEVSRl9BUk1fTDJYMF9PTkxJTkUsCiAJQ1BVSFBfQVBfV09SS1FVRVVFX09OTElORSwKIAlDUFVIUF9BUF9SQ1VUUkVFX09OTElORSwKIAlDUFVIUF9BUF9OT1RJRllfT05MSU5FLApAQCAtOTksNyArMTMwLDcgQEAKIAogaW50IF9fY3B1aHBfc2V0dXBfc3RhdGUoZW51bSBjcHVocF9zdGF0ZSBzdGF0ZSwJY29uc3QgY2hhciAqbmFtZSwgYm9vbCBpbnZva2UsCiAJCQlpbnQgKCpzdGFydHVwKSh1bnNpZ25lZCBpbnQgY3B1KSwKLQkJCWludCAoKnRlYXJkb3duKSh1bnNpZ25lZCBpbnQgY3B1KSk7CisJCQlpbnQgKCp0ZWFyZG93bikodW5zaWduZWQgaW50IGNwdSksIGJvb2wgbXVsdGlfaW5zdGFuY2UpOwogCiAvKioKICAqIGNwdWhwX3NldHVwX3N0YXRlIC0gU2V0dXAgaG90cGx1ZyBzdGF0ZSBjYWxsYmFja3Mgd2l0aCBjYWxsaW5nIHRoZSBjYWxsYmFja3MKQEAgLTExNiw3ICsxNDcsNyBAQAogCQkJCSAgICBpbnQgKCpzdGFydHVwKSh1bnNpZ25lZCBpbnQgY3B1KSwKIAkJCQkgICAgaW50ICgqdGVhcmRvd24pKHVuc2lnbmVkIGludCBjcHUpKQogewotCXJldHVybiBfX2NwdWhwX3NldHVwX3N0YXRlKHN0YXRlLCBuYW1lLCB0cnVlLCBzdGFydHVwLCB0ZWFyZG93bik7CisJcmV0dXJuIF9fY3B1aHBfc2V0dXBfc3RhdGUoc3RhdGUsIG5hbWUsIHRydWUsIHN0YXJ0dXAsIHRlYXJkb3duLCBmYWxzZSk7CiB9CiAKIC8qKgpAQCAtMTM1LDcgKzE2Niw2NiBAQAogCQkJCQkgICAgaW50ICgqc3RhcnR1cCkodW5zaWduZWQgaW50IGNwdSksCiAJCQkJCSAgICBpbnQgKCp0ZWFyZG93bikodW5zaWduZWQgaW50IGNwdSkpCiB7Ci0JcmV0dXJuIF9fY3B1aHBfc2V0dXBfc3RhdGUoc3RhdGUsIG5hbWUsIGZhbHNlLCBzdGFydHVwLCB0ZWFyZG93bik7CisJcmV0dXJuIF9fY3B1aHBfc2V0dXBfc3RhdGUoc3RhdGUsIG5hbWUsIGZhbHNlLCBzdGFydHVwLCB0ZWFyZG93biwKKwkJCQkgICBmYWxzZSk7Cit9CisKKy8qKgorICogY3B1aHBfc2V0dXBfc3RhdGVfbXVsdGkgLSBBZGQgY2FsbGJhY2tzIGZvciBtdWx0aSBzdGF0ZQorICogQHN0YXRlOglUaGUgc3RhdGUgZm9yIHdoaWNoIHRoZSBjYWxscyBhcmUgaW5zdGFsbGVkCisgKiBAbmFtZToJTmFtZSBvZiB0aGUgY2FsbGJhY2suCisgKiBAc3RhcnR1cDoJc3RhcnR1cCBjYWxsYmFjayBmdW5jdGlvbgorICogQHRlYXJkb3duOgl0ZWFyZG93biBjYWxsYmFjayBmdW5jdGlvbgorICoKKyAqIFNldHMgdGhlIGludGVybmFsIG11bHRpX2luc3RhbmNlIGZsYWcgYW5kIHByZXBhcmVzIGEgc3RhdGUgdG8gd29yayBhcyBhIG11bHRpCisgKiBpbnN0YW5jZSBjYWxsYmFjay4gTm8gY2FsbGJhY2tzIGFyZSBpbnZva2VkIGF0IHRoaXMgcG9pbnQuIFRoZSBjYWxsYmFja3MgYXJlCisgKiBpbnZva2VkIG9uY2UgYW4gaW5zdGFuY2UgZm9yIHRoaXMgc3RhdGUgYXJlIHJlZ2lzdGVyZWQgdmlhCisgKiBAY3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlIG9yIEBjcHVocF9zdGF0ZV9hZGRfaW5zdGFuY2Vfbm9jYWxscy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgY3B1aHBfc2V0dXBfc3RhdGVfbXVsdGkoZW51bSBjcHVocF9zdGF0ZSBzdGF0ZSwKKwkJCQkJICBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgIGludCAoKnN0YXJ0dXApKHVuc2lnbmVkIGludCBjcHUsCisJCQkJCQkJIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKSwKKwkJCQkJICBpbnQgKCp0ZWFyZG93bikodW5zaWduZWQgaW50IGNwdSwKKwkJCQkJCQkgIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKSkKK3sKKwlyZXR1cm4gX19jcHVocF9zZXR1cF9zdGF0ZShzdGF0ZSwgbmFtZSwgZmFsc2UsCisJCQkJICAgKHZvaWQgKikgc3RhcnR1cCwKKwkJCQkgICAodm9pZCAqKSB0ZWFyZG93biwgdHJ1ZSk7Cit9CisKK2ludCBfX2NwdWhwX3N0YXRlX2FkZF9pbnN0YW5jZShlbnVtIGNwdWhwX3N0YXRlIHN0YXRlLCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwKKwkJCSAgICAgICBib29sIGludm9rZSk7CisKKy8qKgorICogY3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlIC0gQWRkIGFuIGluc3RhbmNlIGZvciBhIHN0YXRlIGFuZCBpbnZva2Ugc3RhcnR1cAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suCisgKiBAc3RhdGU6CVRoZSBzdGF0ZSBmb3Igd2hpY2ggdGhlIGluc3RhbmNlIGlzIGluc3RhbGxlZAorICogQG5vZGU6CVRoZSBub2RlIGZvciB0aGlzIGluZGl2aWR1YWwgc3RhdGUuCisgKgorICogSW5zdGFsbHMgdGhlIGluc3RhbmNlIGZvciB0aGUgQHN0YXRlIGFuZCBpbnZva2VzIHRoZSBzdGFydHVwIGNhbGxiYWNrIG9uCisgKiB0aGUgcHJlc2VudCBjcHVzIHdoaWNoIGhhdmUgYWxyZWFkeSByZWFjaGVkIHRoZSBAc3RhdGUuIFRoZSBAc3RhdGUgbXVzdCBoYXZlCisgKiBiZWVuIGVhcmxpZXIgbWFya2VkIGFzIG11bHRpLWluc3RhbmNlIGJ5IEBjcHVocF9zZXR1cF9zdGF0ZV9tdWx0aS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgY3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlKGVudW0gY3B1aHBfc3RhdGUgc3RhdGUsCisJCQkJCSAgIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKQoreworCXJldHVybiBfX2NwdWhwX3N0YXRlX2FkZF9pbnN0YW5jZShzdGF0ZSwgbm9kZSwgdHJ1ZSk7Cit9CisKKy8qKgorICogY3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlX25vY2FsbHMgLSBBZGQgYW4gaW5zdGFuY2UgZm9yIGEgc3RhdGUgd2l0aG91dAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZva2luZyB0aGUgc3RhcnR1cCBjYWxsYmFjay4KKyAqIEBzdGF0ZToJVGhlIHN0YXRlIGZvciB3aGljaCB0aGUgaW5zdGFuY2UgaXMgaW5zdGFsbGVkCisgKiBAbm9kZToJVGhlIG5vZGUgZm9yIHRoaXMgaW5kaXZpZHVhbCBzdGF0ZS4KKyAqCisgKiBJbnN0YWxscyB0aGUgaW5zdGFuY2UgZm9yIHRoZSBAc3RhdGUgVGhlIEBzdGF0ZSBtdXN0IGhhdmUgYmVlbiBlYXJsaWVyCisgKiBtYXJrZWQgYXMgbXVsdGktaW5zdGFuY2UgYnkgQGNwdWhwX3NldHVwX3N0YXRlX211bHRpLgorICovCitzdGF0aWMgaW5saW5lIGludCBjcHVocF9zdGF0ZV9hZGRfaW5zdGFuY2Vfbm9jYWxscyhlbnVtIGNwdWhwX3N0YXRlIHN0YXRlLAorCQkJCQkJICAgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUpCit7CisJcmV0dXJuIF9fY3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlKHN0YXRlLCBub2RlLCBmYWxzZSk7CiB9CiAKIHZvaWQgX19jcHVocF9yZW1vdmVfc3RhdGUoZW51bSBjcHVocF9zdGF0ZSBzdGF0ZSwgYm9vbCBpbnZva2UpOwpAQCAtMTYyLDYgKzI1Miw1MSBAQAogCV9fY3B1aHBfcmVtb3ZlX3N0YXRlKHN0YXRlLCBmYWxzZSk7CiB9CiAKKy8qKgorICogY3B1aHBfcmVtb3ZlX211bHRpX3N0YXRlIC0gUmVtb3ZlIGhvdHBsdWcgbXVsdGkgc3RhdGUgY2FsbGJhY2sKKyAqIEBzdGF0ZToJVGhlIHN0YXRlIGZvciB3aGljaCB0aGUgY2FsbHMgYXJlIHJlbW92ZWQKKyAqCisgKiBSZW1vdmVzIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMgZnJvbSBhIG11bHRpIHN0YXRlLiBUaGlzIGlzIHRoZSByZXZlcnNlIG9mCisgKiBjcHVocF9zZXR1cF9zdGF0ZV9tdWx0aSgpLiBBbGwgaW5zdGFuY2VzIHNob3VsZCBoYXZlIGJlZW4gcmVtb3ZlZCBiZWZvcmUKKyAqIGludm9raW5nIHRoaXMgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUoZW51bSBjcHVocF9zdGF0ZSBzdGF0ZSkKK3sKKwlfX2NwdWhwX3JlbW92ZV9zdGF0ZShzdGF0ZSwgZmFsc2UpOworfQorCitpbnQgX19jcHVocF9zdGF0ZV9yZW1vdmVfaW5zdGFuY2UoZW51bSBjcHVocF9zdGF0ZSBzdGF0ZSwKKwkJCQkgIHN0cnVjdCBobGlzdF9ub2RlICpub2RlLCBib29sIGludm9rZSk7CisKKy8qKgorICogY3B1aHBfc3RhdGVfcmVtb3ZlX2luc3RhbmNlIC0gUmVtb3ZlIGhvdHBsdWcgaW5zdGFuY2UgZnJvbSBzdGF0ZSBhbmQgaW52b2tlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGVhcmRvd24gY2FsbGJhY2sKKyAqIEBzdGF0ZToJVGhlIHN0YXRlIGZyb20gd2hpY2ggdGhlIGluc3RhbmNlIGlzIHJlbW92ZWQKKyAqIEBub2RlOglUaGUgbm9kZSBmb3IgdGhpcyBpbmRpdmlkdWFsIHN0YXRlLgorICoKKyAqIFJlbW92ZXMgdGhlIGluc3RhbmNlIGFuZCBpbnZva2VzIHRoZSB0ZWFyZG93biBjYWxsYmFjayBvbiB0aGUgcHJlc2VudCBjcHVzCisgKiB3aGljaCBoYXZlIGFscmVhZHkgcmVhY2hlZCB0aGUgQHN0YXRlLgorICovCitzdGF0aWMgaW5saW5lIGludCBjcHVocF9zdGF0ZV9yZW1vdmVfaW5zdGFuY2UoZW51bSBjcHVocF9zdGF0ZSBzdGF0ZSwKKwkJCQkJICAgICAgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUpCit7CisJcmV0dXJuIF9fY3B1aHBfc3RhdGVfcmVtb3ZlX2luc3RhbmNlKHN0YXRlLCBub2RlLCB0cnVlKTsKK30KKworLyoqCisgKiBjcHVocF9zdGF0ZV9yZW1vdmVfaW5zdGFuY2Vfbm9jYWxscyAtIFJlbW92ZSBob3RwbHVnIGluc3RhbmNlIGZyb20gc3RhdGUKKyAqCQkJCQkgd2l0aG91dCBpbnZva2luZyB0aGUgcmVhdGRvd24gY2FsbGJhY2sKKyAqIEBzdGF0ZToJVGhlIHN0YXRlIGZyb20gd2hpY2ggdGhlIGluc3RhbmNlIGlzIHJlbW92ZWQKKyAqIEBub2RlOglUaGUgbm9kZSBmb3IgdGhpcyBpbmRpdmlkdWFsIHN0YXRlLgorICoKKyAqIFJlbW92ZXMgdGhlIGluc3RhbmNlIHdpdGhvdXQgaW52b2tpbmcgdGhlIHRlYXJkb3duIGNhbGxiYWNrLgorICovCitzdGF0aWMgaW5saW5lIGludCBjcHVocF9zdGF0ZV9yZW1vdmVfaW5zdGFuY2Vfbm9jYWxscyhlbnVtIGNwdWhwX3N0YXRlIHN0YXRlLAorCQkJCQkJICAgICAgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUpCit7CisJcmV0dXJuIF9fY3B1aHBfc3RhdGVfcmVtb3ZlX2luc3RhbmNlKHN0YXRlLCBub2RlLCBmYWxzZSk7Cit9CisKICNpZmRlZiBDT05GSUdfU01QCiB2b2lkIGNwdWhwX29ubGluZV9pZGxlKGVudW0gY3B1aHBfc3RhdGUgc3RhdGUpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGF4LmggYi9pbmNsdWRlL2xpbnV4L2RheC5oCmluZGV4IDljNmRjNzcuLmFkZDZjNGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGF4LmgKKysrIGIvaW5jbHVkZS9saW51eC9kYXguaApAQCAtNiwxMyArNiwxOSBAQAogI2luY2x1ZGUgPGxpbnV4L3JhZGl4LXRyZWUuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogCitzdHJ1Y3QgaW9tYXBfb3BzOworCiAvKiBXZSB1c2UgbG93ZXN0IGF2YWlsYWJsZSBleGNlcHRpb25hbCBlbnRyeSBiaXQgZm9yIGxvY2tpbmcgKi8KICNkZWZpbmUgUkFESVhfREFYX0VOVFJZX0xPQ0sgKDEgPDwgUkFESVhfVFJFRV9FWENFUFRJT05BTF9TSElGVCkKIAorc3NpemVfdCBpb21hcF9kYXhfcncoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIsCisJCXN0cnVjdCBpb21hcF9vcHMgKm9wcyk7CiBzc2l6ZV90IGRheF9kb19pbyhzdHJ1Y3Qga2lvY2IgKiwgc3RydWN0IGlub2RlICosIHN0cnVjdCBpb3ZfaXRlciAqLAogCQkgIGdldF9ibG9ja190LCBkaW9faW9kb25lX3QsIGludCBmbGFncyk7CiBpbnQgZGF4X3plcm9fcGFnZV9yYW5nZShzdHJ1Y3QgaW5vZGUgKiwgbG9mZl90IGZyb20sIHVuc2lnbmVkIGxlbiwgZ2V0X2Jsb2NrX3QpOwogaW50IGRheF90cnVuY2F0ZV9wYWdlKHN0cnVjdCBpbm9kZSAqLCBsb2ZmX3QgZnJvbSwgZ2V0X2Jsb2NrX3QpOworaW50IGlvbWFwX2RheF9mYXVsdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHZtX2ZhdWx0ICp2bWYsCisJCQlzdHJ1Y3QgaW9tYXBfb3BzICpvcHMpOwogaW50IGRheF9mYXVsdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiwgc3RydWN0IHZtX2ZhdWx0ICosIGdldF9ibG9ja190KTsKIGludCBkYXhfZGVsZXRlX21hcHBpbmdfZW50cnkoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHBnb2ZmX3QgaW5kZXgpOwogdm9pZCBkYXhfd2FrZV9tYXBwaW5nX2VudHJ5X3dhaXRlcihzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGVidWdmcy5oIGIvaW5jbHVkZS9saW51eC9kZWJ1Z2ZzLmgKaW5kZXggMTQzOGUyMy4uNGQzZjBkMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kZWJ1Z2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZWJ1Z2ZzLmgKQEAgLTQ1LDYgKzQ1LDIzIEBACiAKIGV4dGVybiBzdHJ1Y3Qgc3JjdV9zdHJ1Y3QgZGVidWdmc19zcmN1OwogCisvKioKKyAqIGRlYnVnZnNfcmVhbF9mb3BzIC0gZ2V0dGVyIGZvciB0aGUgcmVhbCBmaWxlIG9wZXJhdGlvbgorICogQGZpbHA6IGEgcG9pbnRlciB0byBhIHN0cnVjdCBmaWxlCisgKgorICogTXVzdCBvbmx5IGJlIGNhbGxlZCB1bmRlciB0aGUgcHJvdGVjdGlvbiBlc3RhYmxpc2hlZCBieQorICogZGVidWdmc191c2VfZmlsZV9zdGFydCgpLgorICovCitzdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmRlYnVnZnNfcmVhbF9mb3BzKHN0cnVjdCBmaWxlICpmaWxwKQorCV9fbXVzdF9ob2xkKCZkZWJ1Z2ZzX3NyY3UpCit7CisJLyoKKwkgKiBOZWl0aGVyIHRoZSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zLCBub3IgaXRzCisJICogY29udGVudHMgZXZlciBjaGFuZ2UgLS0gc3JjdV9kZXJlZmVyZW5jZSgpIGlzIG5vdCBuZWVkZWQgaGVyZS4KKwkgKi8KKwlyZXR1cm4gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9mc2RhdGE7Cit9CisKICNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19GUykKIAogc3RydWN0IGRlbnRyeSAqZGVidWdmc19jcmVhdGVfZmlsZShjb25zdCBjaGFyICpuYW1lLCB1bW9kZV90IG1vZGUsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RldmZyZXEtZXZlbnQuaCBiL2luY2x1ZGUvbGludXgvZGV2ZnJlcS1ldmVudC5oCmluZGV4IDBhODNhMWUuLjRkYjAwYjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2ZnJlcS1ldmVudC5oCisrKyBiL2luY2x1ZGUvbGludXgvZGV2ZnJlcS1ldmVudC5oCkBAIC0xNDgsMTEgKzE0OCw2IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqZGV2ZnJlcV9ldmVudF9nZXRfZHJ2ZGF0YShzdHJ1Y3QgZGV2ZnJlcV9ldmVudF9kZXYgKmVkZXYpCi17Ci0JcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IGRldmZyZXFfZXZlbnRfZGV2ICpkZXZmcmVxX2V2ZW50X2dldF9lZGV2X2J5X3BoYW5kbGUoCiAJCQkJCXN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGluZGV4KQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbWEtZGVidWcuaCBiL2luY2x1ZGUvbGludXgvZG1hLWRlYnVnLmgKaW5kZXggZmU4Y2I2MS4uYzdkODQ0ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbWEtZGVidWcuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtYS1kZWJ1Zy5oCkBAIC01Niw2ICs1NiwxMyBAQAogZXh0ZXJuIHZvaWQgZGVidWdfZG1hX2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKIAkJCQkgICAgdm9pZCAqdmlydCwgZG1hX2FkZHJfdCBhZGRyKTsKIAorZXh0ZXJuIHZvaWQgZGVidWdfZG1hX21hcF9yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBoeXNfYWRkcl90IGFkZHIsCisJCQkJICAgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24sCisJCQkJICAgZG1hX2FkZHJfdCBkbWFfYWRkcik7CisKK2V4dGVybiB2b2lkIGRlYnVnX2RtYV91bm1hcF9yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCisJCQkJICAgICBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbik7CisKIGV4dGVybiB2b2lkIGRlYnVnX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkJICBkbWFfYWRkcl90IGRtYV9oYW5kbGUsIHNpemVfdCBzaXplLAogCQkJCQkgIGludCBkaXJlY3Rpb24pOwpAQCAtMTQxLDYgKzE0OCwxOCBAQAogewogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgZGVidWdfZG1hX21hcF9yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBoeXNfYWRkcl90IGFkZHIsCisJCQkJCSAgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24sCisJCQkJCSAgZG1hX2FkZHJfdCBkbWFfYWRkcikKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRlYnVnX2RtYV91bm1hcF9yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwKKwkJCQkJICAgIGludCBkaXJlY3Rpb24pCit7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZWJ1Z19kbWFfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJCQkgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLAogCQkJCQkJIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbWEtbWFwcGluZy5oIGIvaW5jbHVkZS9saW51eC9kbWEtbWFwcGluZy5oCmluZGV4IDY2NTMzZTEuLjBmOTBlYjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZG1hLW1hcHBpbmcuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtYS1tYXBwaW5nLmgKQEAgLTk1LDYgKzk1LDEyIEBACiAJCQkgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLAogCQkJIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKIAkJCSB1bnNpZ25lZCBsb25nIGF0dHJzKTsKKwlkbWFfYWRkcl90ICgqbWFwX3Jlc291cmNlKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBoeXNfYWRkcl90IHBoeXNfYWRkciwKKwkJCSAgICAgICBzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXR0cnMpOworCXZvaWQgKCp1bm1hcF9yZXNvdXJjZSkoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCisJCQkgICBzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLAorCQkJICAgdW5zaWduZWQgbG9uZyBhdHRycyk7CiAJdm9pZCAoKnN5bmNfc2luZ2xlX2Zvcl9jcHUpKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICAgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLCBzaXplX3Qgc2l6ZSwKIAkJCQkgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKTsKQEAgLTI1OCw2ICsyNjQsNDEgQEAKIAlkZWJ1Z19kbWFfdW5tYXBfcGFnZShkZXYsIGFkZHIsIHNpemUsIGRpciwgZmFsc2UpOwogfQogCitzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgZG1hX21hcF9yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgcGh5c19hZGRyX3QgcGh5c19hZGRyLAorCQkJCQkgIHNpemVfdCBzaXplLAorCQkJCQkgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKKwkJCQkJICB1bnNpZ25lZCBsb25nIGF0dHJzKQoreworCXN0cnVjdCBkbWFfbWFwX29wcyAqb3BzID0gZ2V0X2RtYV9vcHMoZGV2KTsKKwlkbWFfYWRkcl90IGFkZHI7CisKKwlCVUdfT04oIXZhbGlkX2RtYV9kaXJlY3Rpb24oZGlyKSk7CisKKwkvKiBEb24ndCBhbGxvdyBSQU0gdG8gYmUgbWFwcGVkICovCisJQlVHX09OKHBmbl92YWxpZChQSFlTX1BGTihwaHlzX2FkZHIpKSk7CisKKwlhZGRyID0gcGh5c19hZGRyOworCWlmIChvcHMtPm1hcF9yZXNvdXJjZSkKKwkJYWRkciA9IG9wcy0+bWFwX3Jlc291cmNlKGRldiwgcGh5c19hZGRyLCBzaXplLCBkaXIsIGF0dHJzKTsKKworCWRlYnVnX2RtYV9tYXBfcmVzb3VyY2UoZGV2LCBwaHlzX2FkZHIsIHNpemUsIGRpciwgYWRkcik7CisKKwlyZXR1cm4gYWRkcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRtYV91bm1hcF9yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgYWRkciwKKwkJCQkgICAgICBzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYXR0cnMpCit7CisJc3RydWN0IGRtYV9tYXBfb3BzICpvcHMgPSBnZXRfZG1hX29wcyhkZXYpOworCisJQlVHX09OKCF2YWxpZF9kbWFfZGlyZWN0aW9uKGRpcikpOworCWlmIChvcHMtPnVubWFwX3Jlc291cmNlKQorCQlvcHMtPnVubWFwX3Jlc291cmNlKGRldiwgYWRkciwgc2l6ZSwgZGlyLCBhdHRycyk7CisJZGVidWdfZG1hX3VubWFwX3Jlc291cmNlKGRldiwgYWRkciwgc2l6ZSwgZGlyKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBhZGRyLAogCQkJCQkgICBzaXplX3Qgc2l6ZSwKIAkJCQkJICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQpAQCAtNzE4LDcgKzc1OSw3IEBACiAjZGVmaW5lIGRtYV9tbWFwX3dyaXRlY29tYmluZSBkbWFfbW1hcF93YwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfTkVFRF9ETUFfTUFQX1NUQVRFCisjaWYgZGVmaW5lZChDT05GSUdfTkVFRF9ETUFfTUFQX1NUQVRFKSB8fCBkZWZpbmVkKENPTkZJR19ETUFfQVBJX0RFQlVHKQogI2RlZmluZSBERUZJTkVfRE1BX1VOTUFQX0FERFIoQUREUl9OQU1FKSAgICAgICAgZG1hX2FkZHJfdCBBRERSX05BTUUKICNkZWZpbmUgREVGSU5FX0RNQV9VTk1BUF9MRU4oTEVOX05BTUUpICAgICAgICAgIF9fdTMyIExFTl9OQU1FCiAjZGVmaW5lIGRtYV91bm1hcF9hZGRyKFBUUiwgQUREUl9OQU1FKSAgICAgICAgICAgKChQVFIpLT5BRERSX05BTUUpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtYS9kdy5oIGIvaW5jbHVkZS9saW51eC9kbWEvZHcuaAppbmRleCBmMmU1MzhhLi5jY2ZkMGMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RtYS9kdy5oCisrKyBiL2luY2x1ZGUvbGludXgvZG1hL2R3LmgKQEAgLTQwLDggKzQwLDEzIEBACiB9OwogCiAvKiBFeHBvcnQgdG8gdGhlIHBsYXRmb3JtIGRyaXZlcnMgKi8KKyNpZiBJU19FTkFCTEVEKENPTkZJR19EV19ETUFDX0NPUkUpCiBpbnQgZHdfZG1hX3Byb2JlKHN0cnVjdCBkd19kbWFfY2hpcCAqY2hpcCk7CiBpbnQgZHdfZG1hX3JlbW92ZShzdHJ1Y3QgZHdfZG1hX2NoaXAgKmNoaXApOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGR3X2RtYV9wcm9iZShzdHJ1Y3QgZHdfZG1hX2NoaXAgKmNoaXApIHsgcmV0dXJuIC1FTk9ERVY7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGR3X2RtYV9yZW1vdmUoc3RydWN0IGR3X2RtYV9jaGlwICpjaGlwKSB7IHJldHVybiAwOyB9CisjZW5kaWYgLyogQ09ORklHX0RXX0RNQUNfQ09SRSAqLwogCiAvKiBETUEgQVBJIGV4dGVuc2lvbnMgKi8KIHN0cnVjdCBkd19kZXNjOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbWEvaHN1LmggYi9pbmNsdWRlL2xpbnV4L2RtYS9oc3UuaAppbmRleCBhYWZmNjhlLi4xOTdlZWM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RtYS9oc3UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtYS9oc3UuaApAQCAtNDEsOCArNDEsNyBAQAogLyogRXhwb3J0IHRvIHRoZSBpbnRlcm5hbCB1c2VycyAqLwogaW50IGhzdV9kbWFfZ2V0X3N0YXR1cyhzdHJ1Y3QgaHN1X2RtYV9jaGlwICpjaGlwLCB1bnNpZ25lZCBzaG9ydCBuciwKIAkJICAgICAgIHUzMiAqc3RhdHVzKTsKLWlycXJldHVybl90IGhzdV9kbWFfZG9faXJxKHN0cnVjdCBoc3VfZG1hX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHNob3J0IG5yLAotCQkJICAgdTMyIHN0YXR1cyk7CitpbnQgaHN1X2RtYV9kb19pcnEoc3RydWN0IGhzdV9kbWFfY2hpcCAqY2hpcCwgdW5zaWduZWQgc2hvcnQgbnIsIHUzMiBzdGF0dXMpOwogCiAvKiBFeHBvcnQgdG8gdGhlIHBsYXRmb3JtIGRyaXZlcnMgKi8KIGludCBoc3VfZG1hX3Byb2JlKHN0cnVjdCBoc3VfZG1hX2NoaXAgKmNoaXApOwpAQCAtNTMsMTAgKzUyLDEwIEBACiB7CiAJcmV0dXJuIDA7CiB9Ci1zdGF0aWMgaW5saW5lIGlycXJldHVybl90IGhzdV9kbWFfZG9faXJxKHN0cnVjdCBoc3VfZG1hX2NoaXAgKmNoaXAsCi0JCQkJCSB1bnNpZ25lZCBzaG9ydCBuciwgdTMyIHN0YXR1cykKK3N0YXRpYyBpbmxpbmUgaW50IGhzdV9kbWFfZG9faXJxKHN0cnVjdCBoc3VfZG1hX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHNob3J0IG5yLAorCQkJCSB1MzIgc3RhdHVzKQogewotCXJldHVybiBJUlFfTk9ORTsKKwlyZXR1cm4gMDsKIH0KIHN0YXRpYyBpbmxpbmUgaW50IGhzdV9kbWFfcHJvYmUoc3RydWN0IGhzdV9kbWFfY2hpcCAqY2hpcCkgeyByZXR1cm4gLUVOT0RFVjsgfQogc3RhdGljIGlubGluZSBpbnQgaHN1X2RtYV9yZW1vdmUoc3RydWN0IGhzdV9kbWFfY2hpcCAqY2hpcCkgeyByZXR1cm4gMDsgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbWFlbmdpbmUuaCBiL2luY2x1ZGUvbGludXgvZG1hZW5naW5lLmgKaW5kZXggMzBkZTAxOS4uY2M1MzVhNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbWFlbmdpbmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtYWVuZ2luZS5oCkBAIC00NDEsNiArNDQxLDIxIEBACiAKIHR5cGVkZWYgdm9pZCAoKmRtYV9hc3luY190eF9jYWxsYmFjaykodm9pZCAqZG1hX2FzeW5jX3BhcmFtKTsKIAorZW51bSBkbWFlbmdpbmVfdHhfcmVzdWx0IHsKKwlETUFfVFJBTlNfTk9FUlJPUiA9IDAsCQkvKiBTVUNDRVNTICovCisJRE1BX1RSQU5TX1JFQURfRkFJTEVELAkJLyogU291cmNlIERNQSByZWFkIGZhaWxlZCAqLworCURNQV9UUkFOU19XUklURV9GQUlMRUQsCQkvKiBEZXN0aW5hdGlvbiBETUEgd3JpdGUgZmFpbGVkICovCisJRE1BX1RSQU5TX0FCT1JURUQsCQkvKiBPcCBuZXZlciBzdWJtaXR0ZWQgLyBhYm9ydGVkICovCit9OworCitzdHJ1Y3QgZG1hZW5naW5lX3Jlc3VsdCB7CisJZW51bSBkbWFlbmdpbmVfdHhfcmVzdWx0IHJlc3VsdDsKKwl1MzIgcmVzaWR1ZTsKK307CisKK3R5cGVkZWYgdm9pZCAoKmRtYV9hc3luY190eF9jYWxsYmFja19yZXN1bHQpKHZvaWQgKmRtYV9hc3luY19wYXJhbSwKKwkJCQljb25zdCBzdHJ1Y3QgZG1hZW5naW5lX3Jlc3VsdCAqcmVzdWx0KTsKKwogc3RydWN0IGRtYWVuZ2luZV91bm1hcF9kYXRhIHsKIAl1OCBtYXBfY250OwogCXU4IHRvX2NudDsKQEAgLTQ3OCw2ICs0OTMsNyBAQAogCWRtYV9jb29raWVfdCAoKnR4X3N1Ym1pdCkoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCk7CiAJaW50ICgqZGVzY19mcmVlKShzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4KTsKIAlkbWFfYXN5bmNfdHhfY2FsbGJhY2sgY2FsbGJhY2s7CisJZG1hX2FzeW5jX3R4X2NhbGxiYWNrX3Jlc3VsdCBjYWxsYmFja19yZXN1bHQ7CiAJdm9pZCAqY2FsbGJhY2tfcGFyYW07CiAJc3RydWN0IGRtYWVuZ2luZV91bm1hcF9kYXRhICp1bm1hcDsKICNpZmRlZiBDT05GSUdfQVNZTkNfVFhfRU5BQkxFX0NIQU5ORUxfU1dJVENICmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2VmaS5oIGIvaW5jbHVkZS9saW51eC9lZmkuaAppbmRleCA3ZjVhNTgyLi4yZDA4OTQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2VmaS5oCisrKyBiL2luY2x1ZGUvbGludXgvZWZpLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wZm4uaD4KICNpbmNsdWRlIDxsaW51eC9wc3RvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5nZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L3V1aWQuaD4KICNpbmNsdWRlIDxsaW51eC9zY3JlZW5faW5mby5oPgpAQCAtMzcsNiArMzgsNyBAQAogI2RlZmluZSBFRklfV1JJVEVfUFJPVEVDVEVECSggOCB8ICgxVUwgPDwgKEJJVFNfUEVSX0xPTkctMSkpKQogI2RlZmluZSBFRklfT1VUX09GX1JFU09VUkNFUwkoIDkgfCAoMVVMIDw8IChCSVRTX1BFUl9MT05HLTEpKSkKICNkZWZpbmUgRUZJX05PVF9GT1VORAkJKDE0IHwgKDFVTCA8PCAoQklUU19QRVJfTE9ORy0xKSkpCisjZGVmaW5lIEVGSV9BQk9SVEVECQkoMjEgfCAoMVVMIDw8IChCSVRTX1BFUl9MT05HLTEpKSkKICNkZWZpbmUgRUZJX1NFQ1VSSVRZX1ZJT0xBVElPTgkoMjYgfCAoMVVMIDw8IChCSVRTX1BFUl9MT05HLTEpKSkKIAogdHlwZWRlZiB1bnNpZ25lZCBsb25nIGVmaV9zdGF0dXNfdDsKQEAgLTExOCw2ICsxMjAsMTUgQEAKIAl1MzIgaW1hZ2VzaXplOwogfSBlZmlfY2Fwc3VsZV9oZWFkZXJfdDsKIAorc3RydWN0IGVmaV9ib290X21lbW1hcCB7CisJZWZpX21lbW9yeV9kZXNjX3QJKiptYXA7CisJdW5zaWduZWQgbG9uZwkJKm1hcF9zaXplOworCXVuc2lnbmVkIGxvbmcJCSpkZXNjX3NpemU7CisJdTMyCQkJKmRlc2NfdmVyOworCXVuc2lnbmVkIGxvbmcJCSprZXlfcHRyOworCXVuc2lnbmVkIGxvbmcJCSpidWZmX3NpemU7Cit9OworCiAvKgogICogRUZJIGNhcHN1bGUgZmxhZ3MKICAqLwpAQCAtNjY5LDYgKzY4MCwxOCBAQAogCXVuc2lnbmVkIGxvbmcgdGFibGVzOwogfSBlZmlfc3lzdGVtX3RhYmxlX3Q7CiAKKy8qCisgKiBBcmNoaXRlY3R1cmUgaW5kZXBlbmRlbnQgc3RydWN0dXJlIGZvciBkZXNjcmliaW5nIGEgbWVtb3J5IG1hcCBmb3IgdGhlCisgKiBiZW5lZml0IG9mIGVmaV9tZW1tYXBfaW5pdF9lYXJseSgpLCBzYXZpbmcgdXMgdGhlIG5lZWQgdG8gcGFzcyBmb3VyCisgKiBwYXJhbWV0ZXJzLgorICovCitzdHJ1Y3QgZWZpX21lbW9yeV9tYXBfZGF0YSB7CisJcGh5c19hZGRyX3QgcGh5c19tYXA7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXVuc2lnbmVkIGxvbmcgZGVzY192ZXJzaW9uOworCXVuc2lnbmVkIGxvbmcgZGVzY19zaXplOworfTsKKwogc3RydWN0IGVmaV9tZW1vcnlfbWFwIHsKIAlwaHlzX2FkZHJfdCBwaHlzX21hcDsKIAl2b2lkICptYXA7CkBAIC02NzYsNiArNjk5LDEyIEBACiAJaW50IG5yX21hcDsKIAl1bnNpZ25lZCBsb25nIGRlc2NfdmVyc2lvbjsKIAl1bnNpZ25lZCBsb25nIGRlc2Nfc2l6ZTsKKwlib29sIGxhdGU7Cit9OworCitzdHJ1Y3QgZWZpX21lbV9yYW5nZSB7CisJc3RydWN0IHJhbmdlIHJhbmdlOworCXU2NCBhdHRyaWJ1dGU7CiB9OwogCiBzdHJ1Y3QgZWZpX2ZkdF9wYXJhbXMgewpAQCAtOTAwLDYgKzkyOSwxNiBAQAogfQogI2VuZGlmCiBleHRlcm4gdm9pZCBfX2lvbWVtICplZmlfbG9va3VwX21hcHBlZF9hZGRyKHU2NCBwaHlzX2FkZHIpOworCitleHRlcm4gaW50IF9faW5pdCBlZmlfbWVtbWFwX2luaXRfZWFybHkoc3RydWN0IGVmaV9tZW1vcnlfbWFwX2RhdGEgKmRhdGEpOworZXh0ZXJuIGludCBfX2luaXQgZWZpX21lbW1hcF9pbml0X2xhdGUocGh5c19hZGRyX3QgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKTsKK2V4dGVybiB2b2lkIF9faW5pdCBlZmlfbWVtbWFwX3VubWFwKHZvaWQpOworZXh0ZXJuIGludCBfX2luaXQgZWZpX21lbW1hcF9pbnN0YWxsKHBoeXNfYWRkcl90IGFkZHIsIHVuc2lnbmVkIGludCBucl9tYXApOworZXh0ZXJuIGludCBfX2luaXQgZWZpX21lbW1hcF9zcGxpdF9jb3VudChlZmlfbWVtb3J5X2Rlc2NfdCAqbWQsCisJCQkJCSBzdHJ1Y3QgcmFuZ2UgKnJhbmdlKTsKK2V4dGVybiB2b2lkIF9faW5pdCBlZmlfbWVtbWFwX2luc2VydChzdHJ1Y3QgZWZpX21lbW9yeV9tYXAgKm9sZF9tZW1tYXAsCisJCQkJICAgICB2b2lkICpidWYsIHN0cnVjdCBlZmlfbWVtX3JhbmdlICptZW0pOworCiBleHRlcm4gaW50IGVmaV9jb25maWdfaW5pdChlZmlfY29uZmlnX3RhYmxlX3R5cGVfdCAqYXJjaF90YWJsZXMpOwogI2lmZGVmIENPTkZJR19FRklfRVNSVAogZXh0ZXJuIHZvaWQgX19pbml0IGVmaV9lc3J0X2luaXQodm9pZCk7CkBAIC05MTUsNiArOTU0LDcgQEAKIGV4dGVybiBpbnQgX19pbml0IGVmaV91YXJ0X2NvbnNvbGVfb25seSAodm9pZCk7CiBleHRlcm4gdTY0IGVmaV9tZW1fZGVzY19lbmQoZWZpX21lbW9yeV9kZXNjX3QgKm1kKTsKIGV4dGVybiBpbnQgZWZpX21lbV9kZXNjX2xvb2t1cCh1NjQgcGh5c19hZGRyLCBlZmlfbWVtb3J5X2Rlc2NfdCAqb3V0X21kKTsKK2V4dGVybiB2b2lkIGVmaV9tZW1fcmVzZXJ2ZShwaHlzX2FkZHJfdCBhZGRyLCB1NjQgc2l6ZSk7CiBleHRlcm4gdm9pZCBlZmlfaW5pdGlhbGl6ZV9pb21lbV9yZXNvdXJjZXMoc3RydWN0IHJlc291cmNlICpjb2RlX3Jlc291cmNlLAogCQlzdHJ1Y3QgcmVzb3VyY2UgKmRhdGFfcmVzb3VyY2UsIHN0cnVjdCByZXNvdXJjZSAqYnNzX3Jlc291cmNlKTsKIGV4dGVybiB2b2lkIGVmaV9yZXNlcnZlX2Jvb3Rfc2VydmljZXModm9pZCk7CkBAIC05NDYsNyArOTg2LDcgQEAKIC8qIEl0ZXJhdGUgdGhyb3VnaCBhbiBlZmlfbWVtb3J5X21hcCAqLwogI2RlZmluZSBmb3JfZWFjaF9lZmlfbWVtb3J5X2Rlc2NfaW5fbWFwKG0sIG1kKQkJCQkgICBcCiAJZm9yICgobWQpID0gKG0pLT5tYXA7CQkJCQkJICAgXAotCSAgICAgKCh2b2lkICopKG1kKSArIChtKS0+ZGVzY19zaXplKSA8PSAobSktPm1hcF9lbmQ7CQkgICBcCisJICAgICAobWQpICYmICgodm9pZCAqKShtZCkgKyAobSktPmRlc2Nfc2l6ZSkgPD0gKG0pLT5tYXBfZW5kOwkgICBcCiAJICAgICAobWQpID0gKHZvaWQgKikobWQpICsgKG0pLT5kZXNjX3NpemUpCiAKIC8qKgpAQCAtMTEyNywxMiArMTE2Nyw2IEBACiB9OwogCiBzdHJ1Y3QgZWZpdmFycyB7Ci0JLyoKLQkgKiAtPmxvY2sgcHJvdGVjdHMgdHdvIHRoaW5nczoKLQkgKiAxKSBlZml2YXJmc19saXN0IGFuZCBlZml2YXJzX3N5c2ZzX2xpc3QKLQkgKiAyKSAtPm9wcyBjYWxscwotCSAqLwotCXNwaW5sb2NrX3QgbG9jazsKIAlzdHJ1Y3Qga3NldCAqa3NldDsKIAlzdHJ1Y3Qga29iamVjdCAqa29iamVjdDsKIAljb25zdCBzdHJ1Y3QgZWZpdmFyX29wZXJhdGlvbnMgKm9wczsKQEAgLTEyNzMsOCArMTMwNyw4IEBACiBpbnQgZWZpdmFyX2luaXQoaW50ICgqZnVuYykoZWZpX2NoYXIxNl90ICosIGVmaV9ndWlkX3QsIHVuc2lnbmVkIGxvbmcsIHZvaWQgKiksCiAJCXZvaWQgKmRhdGEsIGJvb2wgZHVwbGljYXRlcywgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCk7CiAKLXZvaWQgZWZpdmFyX2VudHJ5X2FkZChzdHJ1Y3QgZWZpdmFyX2VudHJ5ICplbnRyeSwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCk7Ci12b2lkIGVmaXZhcl9lbnRyeV9yZW1vdmUoc3RydWN0IGVmaXZhcl9lbnRyeSAqZW50cnkpOworaW50IGVmaXZhcl9lbnRyeV9hZGQoc3RydWN0IGVmaXZhcl9lbnRyeSAqZW50cnksIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpOworaW50IGVmaXZhcl9lbnRyeV9yZW1vdmUoc3RydWN0IGVmaXZhcl9lbnRyeSAqZW50cnkpOwogCiBpbnQgX19lZml2YXJfZW50cnlfZGVsZXRlKHN0cnVjdCBlZml2YXJfZW50cnkgKmVudHJ5KTsKIGludCBlZml2YXJfZW50cnlfZGVsZXRlKHN0cnVjdCBlZml2YXJfZW50cnkgKmVudHJ5KTsKQEAgLTEyOTEsNyArMTMyNSw3IEBACiBpbnQgZWZpdmFyX2VudHJ5X3NldF9zYWZlKGVmaV9jaGFyMTZfdCAqbmFtZSwgZWZpX2d1aWRfdCB2ZW5kb3IsIHUzMiBhdHRyaWJ1dGVzLAogCQkJICBib29sIGJsb2NrLCB1bnNpZ25lZCBsb25nIHNpemUsIHZvaWQgKmRhdGEpOwogCi12b2lkIGVmaXZhcl9lbnRyeV9pdGVyX2JlZ2luKHZvaWQpOworaW50IGVmaXZhcl9lbnRyeV9pdGVyX2JlZ2luKHZvaWQpOwogdm9pZCBlZml2YXJfZW50cnlfaXRlcl9lbmQodm9pZCk7CiAKIGludCBfX2VmaXZhcl9lbnRyeV9pdGVyKGludCAoKmZ1bmMpKHN0cnVjdCBlZml2YXJfZW50cnkgKiwgdm9pZCAqKSwKQEAgLTEzMjcsNyArMTM2MSw2IEBACiAKICNpZmRlZiBDT05GSUdfRUZJX1JVTlRJTUVfTUFQCiBpbnQgZWZpX3J1bnRpbWVfbWFwX2luaXQoc3RydWN0IGtvYmplY3QgKik7Ci12b2lkIGVmaV9ydW50aW1lX21hcF9zZXR1cCh2b2lkICosIGludCwgdTMyKTsKIGludCBlZmlfZ2V0X3J1bnRpbWVfbWFwX3NpemUodm9pZCk7CiBpbnQgZWZpX2dldF9ydW50aW1lX21hcF9kZXNjX3NpemUodm9pZCk7CiBpbnQgZWZpX3J1bnRpbWVfbWFwX2NvcHkodm9pZCAqYnVmLCBzaXplX3QgYnVmc3opOwpAQCAtMTMzNyw5ICsxMzcwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkCi1lZmlfcnVudGltZV9tYXBfc2V0dXAodm9pZCAqbWFwLCBpbnQgbnJfZW50cmllcywgdTMyIGRlc2Nfc2l6ZSkge30KLQogc3RhdGljIGlubGluZSBpbnQgZWZpX2dldF9ydW50aW1lX21hcF9zaXplKHZvaWQpCiB7CiAJcmV0dXJuIDA7CkBAIC0xMzcxLDExICsxNDAxLDcgQEAKIAkJCSAgZWZpX2xvYWRlZF9pbWFnZV90ICppbWFnZSwgaW50ICpjbWRfbGluZV9sZW4pOwogCiBlZmlfc3RhdHVzX3QgZWZpX2dldF9tZW1vcnlfbWFwKGVmaV9zeXN0ZW1fdGFibGVfdCAqc3lzX3RhYmxlX2FyZywKLQkJCQllZmlfbWVtb3J5X2Rlc2NfdCAqKm1hcCwKLQkJCQl1bnNpZ25lZCBsb25nICptYXBfc2l6ZSwKLQkJCQl1bnNpZ25lZCBsb25nICpkZXNjX3NpemUsCi0JCQkJdTMyICpkZXNjX3ZlciwKLQkJCQl1bnNpZ25lZCBsb25nICprZXlfcHRyKTsKKwkJCQlzdHJ1Y3QgZWZpX2Jvb3RfbWVtbWFwICptYXApOwogCiBlZmlfc3RhdHVzX3QgZWZpX2xvd19hbGxvYyhlZmlfc3lzdGVtX3RhYmxlX3QgKnN5c190YWJsZV9hcmcsCiAJCQkgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgYWxpZ24sCkBAIC0xNDU3LDQgKzE0ODMsMTQgQEAKIAlhcmNoX2VmaV9jYWxsX3ZpcnRfdGVhcmRvd24oKTsJCQkJCVwKIH0pCiAKK3R5cGVkZWYgZWZpX3N0YXR1c190ICgqZWZpX2V4aXRfYm9vdF9tYXBfcHJvY2Vzc2luZykoCisJZWZpX3N5c3RlbV90YWJsZV90ICpzeXNfdGFibGVfYXJnLAorCXN0cnVjdCBlZmlfYm9vdF9tZW1tYXAgKm1hcCwKKwl2b2lkICpwcml2KTsKKworZWZpX3N0YXR1c190IGVmaV9leGl0X2Jvb3Rfc2VydmljZXMoZWZpX3N5c3RlbV90YWJsZV90ICpzeXNfdGFibGUsCisJCQkJICAgIHZvaWQgKmhhbmRsZSwKKwkJCQkgICAgc3RydWN0IGVmaV9ib290X21lbW1hcCAqbWFwLAorCQkJCSAgICB2b2lkICpwcml2LAorCQkJCSAgICBlZmlfZXhpdF9ib290X21hcF9wcm9jZXNzaW5nIHByaXZfZnVuYyk7CiAjZW5kaWYgLyogX0xJTlVYX0VGSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dGNvbi5oIGIvaW5jbHVkZS9saW51eC9leHRjb24uaAppbmRleCA2MTAwNDQxLi5iODcxYzBjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V4dGNvbi5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0Y29uLmgKQEAgLTI5LDYgKzI5LDE1IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAKIC8qCisgKiBEZWZpbmUgdGhlIHR5cGUgb2Ygc3VwcG9ydGVkIGV4dGVybmFsIGNvbm5lY3RvcnMKKyAqLworI2RlZmluZSBFWFRDT05fVFlQRV9VU0IJCUJJVCgwKQkvKiBVU0IgY29ubmVjdG9yICovCisjZGVmaW5lIEVYVENPTl9UWVBFX0NIRwkJQklUKDEpCS8qIENoYXJnZXIgY29ubmVjdG9yICovCisjZGVmaW5lIEVYVENPTl9UWVBFX0pBQ0sJQklUKDIpCS8qIEphY2sgY29ubmVjdG9yICovCisjZGVmaW5lIEVYVENPTl9UWVBFX0RJU1AJQklUKDMpCS8qIERpc3BsYXkgY29ubmVjdG9yICovCisjZGVmaW5lIEVYVENPTl9UWVBFX01JU0MJQklUKDQpCS8qIE1pc2NlbGxhbmVvdXMgY29ubmVjdG9yICovCisKKy8qCiAgKiBEZWZpbmUgdGhlIHVuaXF1ZSBpZCBvZiBzdXBwb3J0ZWQgZXh0ZXJuYWwgY29ubmVjdG9ycwogICovCiAjZGVmaW5lIEVYVENPTl9OT05FCQkwCkBAIC00NCw2ICs1Myw3IEBACiAjZGVmaW5lIEVYVENPTl9DSEdfVVNCX0FDQQk4CS8qIEFjY2Vzc29yeSBDaGFyZ2VyIEFkYXB0ZXIgKi8KICNkZWZpbmUgRVhUQ09OX0NIR19VU0JfRkFTVAk5CiAjZGVmaW5lIEVYVENPTl9DSEdfVVNCX1NMT1cJMTAKKyNkZWZpbmUgRVhUQ09OX0NIR19XUFQJCTExCS8qIFdpcmVsZXNzIFBvd2VyIFRyYW5zZmVyICovCiAKIC8qIEphY2sgZXh0ZXJuYWwgY29ubmVjdG9yICovCiAjZGVmaW5lIEVYVENPTl9KQUNLX01JQ1JPUEhPTkUJMjAKQEAgLTYwLDYgKzcwLDggQEAKICNkZWZpbmUgRVhUQ09OX0RJU1BfTUhMCQk0MQkvKiBNb2JpbGUgSGlnaC1EZWZpbml0aW9uIExpbmsgKi8KICNkZWZpbmUgRVhUQ09OX0RJU1BfRFZJCQk0MgkvKiBEaWdpdGFsIFZpc3VhbCBJbnRlcmZhY2UgKi8KICNkZWZpbmUgRVhUQ09OX0RJU1BfVkdBCQk0MwkvKiBWaWRlbyBHcmFwaGljcyBBcnJheSAqLworI2RlZmluZSBFWFRDT05fRElTUF9EUAkJNDQJLyogRGlzcGxheSBQb3J0ICovCisjZGVmaW5lIEVYVENPTl9ESVNQX0hNRAkJNDUJLyogSGVhZC1Nb3VudGVkIERpc3BsYXkgKi8KIAogLyogTWlzY2VsbGFuZW91cyBleHRlcm5hbCBjb25uZWN0b3IgKi8KICNkZWZpbmUgRVhUQ09OX0RPQ0sJCTYwCkBAIC02OCw2ICs4MCw4NSBAQAogCiAjZGVmaW5lIEVYVENPTl9OVU0JCTYzCiAKKy8qCisgKiBEZWZpbmUgdGhlIHByb3BlcnR5IG9mIHN1cHBvcnRlZCBleHRlcm5hbCBjb25uZWN0b3JzLgorICoKKyAqIFdoZW4gYWRkaW5nIHRoZSBuZXcgZXh0Y29uIHByb3BlcnR5LCB0aGV5ICptdXN0KiBoYXZlCisgKiB0aGUgdHlwZS92YWx1ZS9kZWZhdWx0IGluZm9ybWF0aW9uLiBBbHNvLCB5b3UgKmhhdmUgdG8qCisgKiBtb2RpZnkgdGhlIEVYVENPTl9QUk9QX1t0eXBlXV9TVEFSVC9FTkQgZGVmaW5pdGlvbnMKKyAqIHdoaWNoIG1lYW4gdGhlIHJhbmdlIG9mIHRoZSBzdXBwb3J0ZWQgcHJvcGVydGllcworICogZm9yIGVhY2ggZXh0Y29uIHR5cGUuCisgKgorICogVGhlIG5hbWluZyBzdHlsZSBvZiBwcm9wZXJ0eQorICogOiBFWFRDT05fUFJPUF9bdHlwZV1fW3Byb3BlcnR5IG5hbWVdCisgKgorICogRVhUQ09OX1BST1BfVVNCX1twcm9wZXJ0eSBuYW1lXQk6IFVTQiBwcm9wZXJ0eQorICogRVhUQ09OX1BST1BfQ0hHX1twcm9wZXJ0eSBuYW1lXQk6IENoYXJnZXIgcHJvcGVydHkKKyAqIEVYVENPTl9QUk9QX0pBQ0tfW3Byb3BlcnR5IG5hbWVdCTogSmFjayBwcm9wZXJ0eQorICogRVhUQ09OX1BST1BfRElTUF9bcHJvcGVydHkgbmFtZV0JOiBEaXNwbGF5IHByb3BlcnR5CisgKi8KKworLyoKKyAqIFByb3BlcnRpZXMgb2YgRVhUQ09OX1RZUEVfVVNCLgorICoKKyAqIC0gRVhUQ09OX1BST1BfVVNCX1ZCVVMKKyAqIEB0eXBlOglpbnRlZ2VyIChpbnR2YWwpCisgKiBAdmFsdWU6CTAgKGxvdykgb3IgMSAoaGlnaCkKKyAqIEBkZWZhdWx0OgkwIChsb3cpCisgKiAtIEVYVENPTl9QUk9QX1VTQl9UWVBFQ19QT0xBUklUWQorICogQHR5cGU6CWludGVnZXIgKGludHZhbCkKKyAqIEB2YWx1ZToJMCAobm9ybWFsKSBvciAxIChmbGlwKQorICogQGRlZmF1bHQ6CTAgKG5vcm1hbCkKKyAqIC0gRVhUQ09OX1BST1BfVVNCX1NTIChTdXBlclNwZWVkKQorICogQHR5cGU6ICAgICAgIGludGVnZXIgKGludHZhbCkKKyAqIEB2YWx1ZTogICAgICAwIChVU0IvVVNCMikgb3IgMSAoVVNCMykKKyAqIEBkZWZhdWx0OiAgICAwIChVU0IvVVNCMikKKyAqCisgKi8KKyNkZWZpbmUgRVhUQ09OX1BST1BfVVNCX1ZCVVMJCTAKKyNkZWZpbmUgRVhUQ09OX1BST1BfVVNCX1RZUEVDX1BPTEFSSVRZCTEKKyNkZWZpbmUgRVhUQ09OX1BST1BfVVNCX1NTCQkyCisKKyNkZWZpbmUgRVhUQ09OX1BST1BfVVNCX01JTgkJMAorI2RlZmluZSBFWFRDT05fUFJPUF9VU0JfTUFYCQkyCisjZGVmaW5lIEVYVENPTl9QUk9QX1VTQl9DTlQJKEVYVENPTl9QUk9QX1VTQl9NQVggLSBFWFRDT05fUFJPUF9VU0JfTUlOICsgMSkKKworLyogUHJvcGVydGllcyBvZiBFWFRDT05fVFlQRV9DSEcuICovCisjZGVmaW5lIEVYVENPTl9QUk9QX0NIR19NSU4JCTUwCisjZGVmaW5lIEVYVENPTl9QUk9QX0NIR19NQVgJCTUwCisjZGVmaW5lIEVYVENPTl9QUk9QX0NIR19DTlQJKEVYVENPTl9QUk9QX0NIR19NQVggLSBFWFRDT05fUFJPUF9DSEdfTUlOICsgMSkKKworLyogUHJvcGVydGllcyBvZiBFWFRDT05fVFlQRV9KQUNLLiAqLworI2RlZmluZSBFWFRDT05fUFJPUF9KQUNLX01JTgkJMTAwCisjZGVmaW5lIEVYVENPTl9QUk9QX0pBQ0tfTUFYCQkxMDAKKyNkZWZpbmUgRVhUQ09OX1BST1BfSkFDS19DTlQgKEVYVENPTl9QUk9QX0pBQ0tfTUFYIC0gRVhUQ09OX1BST1BfSkFDS19NSU4gKyAxKQorCisvKgorICogUHJvcGVydGllcyBvZiBFWFRDT05fVFlQRV9ESVNQLgorICoKKyAqIC0gRVhUQ09OX1BST1BfRElTUF9IUEQgKEhvdCBQbHVnIERldGVjdCkKKyAqIEB0eXBlOiAgICAgICBpbnRlZ2VyIChpbnR2YWwpCisgKiBAdmFsdWU6ICAgICAgMCAobm8gaHBkKSBvciAxIChocGQpCisgKiBAZGVmYXVsdDogICAgMCAobm8gaHBkKQorICoKKyAqLworI2RlZmluZSBFWFRDT05fUFJPUF9ESVNQX0hQRAkJMTUwCisKKy8qIFByb3BlcnRpZXMgb2YgRVhUQ09OX1RZUEVfRElTUC4gKi8KKyNkZWZpbmUgRVhUQ09OX1BST1BfRElTUF9NSU4JCTE1MAorI2RlZmluZSBFWFRDT05fUFJPUF9ESVNQX01BWAkJMTUxCisjZGVmaW5lIEVYVENPTl9QUk9QX0RJU1BfQ05UIChFWFRDT05fUFJPUF9ESVNQX01BWCAtIEVYVENPTl9QUk9QX0RJU1BfTUlOICsgMSkKKworLyoKKyAqIERlZmluZSB0aGUgdHlwZSBvZiBwcm9wZXJ0eSdzIHZhbHVlLgorICoKKyAqIERlZmluZSB0aGUgcHJvcGVydHkncyB2YWx1ZSBhcyB1bmlvbiB0eXBlLiBCZWNhdXNlIGVhY2ggcHJvcGVydHkKKyAqIHdvdWxkIG5lZWQgdGhlIGRpZmZlcmVudCBkYXRhIHR5cGUgdG8gc3RvcmUgaXQuCisgKi8KK3VuaW9uIGV4dGNvbl9wcm9wZXJ0eV92YWx1ZSB7CisJaW50IGludHZhbDsJLyogdHlwZSA6IGludGVnZXIgKGludHZhbCkgKi8KK307CisKIHN0cnVjdCBleHRjb25fY2FibGU7CiAKIC8qKgpAQCAtMTUwLDI2ICsyNDEsNDIgQEAKIGV4dGVybiB2b2lkIGRldm1fZXh0Y29uX2Rldl9mcmVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYpOwogCiAvKgotICogZ2V0L3NldC91cGRhdGVfc3RhdGUgYWNjZXNzIHRoZSAzMmIgZW5jb2RlZCBzdGF0ZSB2YWx1ZSwgd2hpY2ggcmVwcmVzZW50cwotICogc3RhdGVzIG9mIGFsbCBwb3NzaWJsZSBjYWJsZXMgb2YgdGhlIG11bHRpc3RhdGUgcG9ydC4gRm9yIGV4YW1wbGUsIGlmIG9uZQotICogY2FsbHMgZXh0Y29uX3NldF9zdGF0ZShlZGV2LCAweDcpLCBpdCBtYXkgbWVhbiB0aGF0IGFsbCB0aGUgdGhyZWUgY2FibGVzCi0gKiBhcmUgYXR0YWNoZWQgdG8gdGhlIHBvcnQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdTMyIGV4dGNvbl9nZXRfc3RhdGUoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYpCi17Ci0JcmV0dXJuIGVkZXYtPnN0YXRlOwotfQotCi1leHRlcm4gaW50IGV4dGNvbl9zZXRfc3RhdGUoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsIHUzMiBzdGF0ZSk7Ci1leHRlcm4gaW50IGV4dGNvbl91cGRhdGVfc3RhdGUoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsIHUzMiBtYXNrLCB1MzIgc3RhdGUpOwotCi0vKgotICogZ2V0L3NldF9jYWJsZV9zdGF0ZSBhY2Nlc3MgZWFjaCBiaXQgb2YgdGhlIDMyYiBlbmNvZGVkIHN0YXRlIHZhbHVlLgorICogZ2V0L3NldF9zdGF0ZSBhY2Nlc3MgZWFjaCBiaXQgb2YgdGhlIDMyYiBlbmNvZGVkIHN0YXRlIHZhbHVlLgogICogVGhleSBhcmUgdXNlZCB0byBhY2Nlc3MgdGhlIHN0YXR1cyBvZiBlYWNoIGNhYmxlIGJhc2VkIG9uIHRoZSBjYWJsZSBpZC4KICAqLwotZXh0ZXJuIGludCBleHRjb25fZ2V0X2NhYmxlX3N0YXRlXyhzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkKTsKLWV4dGVybiBpbnQgZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsIHVuc2lnbmVkIGludCBpZCwKK2V4dGVybiBpbnQgZXh0Y29uX2dldF9zdGF0ZShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkKTsKK2V4dGVybiBpbnQgZXh0Y29uX3NldF9zdGF0ZShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkLAogCQkJCSAgIGJvb2wgY2FibGVfc3RhdGUpOworZXh0ZXJuIGludCBleHRjb25fc2V0X3N0YXRlX3N5bmMoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsIHVuc2lnbmVkIGludCBpZCwKKwkJCQlib29sIGNhYmxlX3N0YXRlKTsKKy8qCisgKiBTeW5jaHJvbml6ZSB0aGUgc3RhdGUgYW5kIHByb3BlcnR5IGRhdGEgZm9yIGEgc3BlY2lmaWMgZXh0ZXJuYWwgY29ubmVjdG9yLgorICovCitleHRlcm4gaW50IGV4dGNvbl9zeW5jKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQpOworCisvKgorICogZ2V0L3NldF9wcm9wZXJ0eSBhY2Nlc3MgdGhlIHByb3BlcnR5IHZhbHVlIG9mIGVhY2ggZXh0ZXJuYWwgY29ubmVjdG9yLgorICogVGhleSBhcmUgdXNlZCB0byBhY2Nlc3MgdGhlIHByb3BlcnR5IG9mIGVhY2ggY2FibGUgYmFzZWQgb24gdGhlIHByb3BlcnR5IGlkLgorICovCitleHRlcm4gaW50IGV4dGNvbl9nZXRfcHJvcGVydHkoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsIHVuc2lnbmVkIGludCBpZCwKKwkJCQl1bnNpZ25lZCBpbnQgcHJvcCwKKwkJCQl1bmlvbiBleHRjb25fcHJvcGVydHlfdmFsdWUgKnByb3BfdmFsKTsKK2V4dGVybiBpbnQgZXh0Y29uX3NldF9wcm9wZXJ0eShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkLAorCQkJCXVuc2lnbmVkIGludCBwcm9wLAorCQkJCXVuaW9uIGV4dGNvbl9wcm9wZXJ0eV92YWx1ZSBwcm9wX3ZhbCk7CitleHRlcm4gaW50IGV4dGNvbl9zZXRfcHJvcGVydHlfc3luYyhzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkLAorCQkJCXVuc2lnbmVkIGludCBwcm9wLAorCQkJCXVuaW9uIGV4dGNvbl9wcm9wZXJ0eV92YWx1ZSBwcm9wX3ZhbCk7CisKKy8qCisgKiBnZXQvc2V0X3Byb3BlcnR5X2NhcGFiaWxpdHkgc2V0IHRoZSBjYXBhYmlsaXR5IG9mIHRoZSBwcm9wZXJ0eSBmb3IgZWFjaAorICogZXh0ZXJuYWwgY29ubmVjdG9yLiBUaGV5IGFyZSB1c2VkIHRvIHNldCB0aGUgY2FwYWJpbGl0eSBvZiB0aGUgcHJvcGVydHkKKyAqIG9mIGVhY2ggZXh0ZXJuYWwgY29ubmVjdG9yIGJhc2VkIG9uIHRoZSBpZCBhbmQgcHJvcGVydHkuCisgKi8KK2V4dGVybiBpbnQgZXh0Y29uX2dldF9wcm9wZXJ0eV9jYXBhYmlsaXR5KHN0cnVjdCBleHRjb25fZGV2ICplZGV2LAorCQkJCXVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IHByb3ApOworZXh0ZXJuIGludCBleHRjb25fc2V0X3Byb3BlcnR5X2NhcGFiaWxpdHkoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsCisJCQkJdW5zaWduZWQgaW50IGlkLCB1bnNpZ25lZCBpbnQgcHJvcCk7CiAKIC8qCiAgKiBGb2xsb3dpbmcgQVBJcyBhcmUgdG8gbW9uaXRvciBldmVyeSBhY3Rpb24gb2YgYSBub3RpZmllci4KQEAgLTIzMiwzMCArMzM5LDU3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZXZtX2V4dGNvbl9kZXZfZnJlZShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldikgeyB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyIGV4dGNvbl9nZXRfc3RhdGUoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYpCisKK3N0YXRpYyBpbmxpbmUgaW50IGV4dGNvbl9nZXRfc3RhdGUoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsIHVuc2lnbmVkIGludCBpZCkKIHsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZXh0Y29uX3NldF9zdGF0ZShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdTMyIHN0YXRlKQorc3RhdGljIGlubGluZSBpbnQgZXh0Y29uX3NldF9zdGF0ZShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkLAorCQkJCWJvb2wgY2FibGVfc3RhdGUpCiB7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGV4dGNvbl91cGRhdGVfc3RhdGUoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsIHUzMiBtYXNrLAotCQkJCSAgICAgICB1MzIgc3RhdGUpCitzdGF0aWMgaW5saW5lIGludCBleHRjb25fc2V0X3N0YXRlX3N5bmMoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsIHVuc2lnbmVkIGludCBpZCwKKwkJCQlib29sIGNhYmxlX3N0YXRlKQogewogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBleHRjb25fZ2V0X2NhYmxlX3N0YXRlXyhzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwKLQkJCQkJICB1bnNpZ25lZCBpbnQgaWQpCitzdGF0aWMgaW5saW5lIGludCBleHRjb25fc3luYyhzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkKQogewogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwKLQkJCQkJICB1bnNpZ25lZCBpbnQgaWQsIGJvb2wgY2FibGVfc3RhdGUpCitzdGF0aWMgaW5saW5lIGludCBleHRjb25fZ2V0X3Byb3BlcnR5KHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQsCisJCQkJCXVuc2lnbmVkIGludCBwcm9wLAorCQkJCQl1bmlvbiBleHRjb25fcHJvcGVydHlfdmFsdWUgKnByb3BfdmFsKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSBpbnQgZXh0Y29uX3NldF9wcm9wZXJ0eShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkLAorCQkJCQl1bnNpZ25lZCBpbnQgcHJvcCwKKwkJCQkJdW5pb24gZXh0Y29uX3Byb3BlcnR5X3ZhbHVlIHByb3BfdmFsKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBleHRjb25fc2V0X3Byb3BlcnR5X3N5bmMoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsCisJCQkJCXVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IHByb3AsCisJCQkJCXVuaW9uIGV4dGNvbl9wcm9wZXJ0eV92YWx1ZSBwcm9wX3ZhbCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZXh0Y29uX2dldF9wcm9wZXJ0eV9jYXBhYmlsaXR5KHN0cnVjdCBleHRjb25fZGV2ICplZGV2LAorCQkJCQl1bnNpZ25lZCBpbnQgaWQsIHVuc2lnbmVkIGludCBwcm9wKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBleHRjb25fc2V0X3Byb3BlcnR5X2NhcGFiaWxpdHkoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsCisJCQkJCXVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IHByb3ApCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC0zMjAsNCArNDU0LDE1IEBACiB7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CisKK3N0YXRpYyBpbmxpbmUgaW50IGV4dGNvbl9nZXRfY2FibGVfc3RhdGVfKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQpCit7CisJcmV0dXJuIGV4dGNvbl9nZXRfc3RhdGUoZWRldiwgaWQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkLAorCQkJCSAgIGJvb2wgY2FibGVfc3RhdGUpCit7CisJcmV0dXJuIGV4dGNvbl9zZXRfc3RhdGVfc3luYyhlZGV2LCBpZCwgY2FibGVfc3RhdGUpOworfQogI2VuZGlmIC8qIF9fTElOVVhfRVhUQ09OX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9leHRjb24vZXh0Y29uLWFkYy1qYWNrLmggYi9pbmNsdWRlL2xpbnV4L2V4dGNvbi9leHRjb24tYWRjLWphY2suaAppbmRleCBhYzg1ZjIwLi5hMGUwM2IxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V4dGNvbi9leHRjb24tYWRjLWphY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L2V4dGNvbi9leHRjb24tYWRjLWphY2suaApAQCAtMjAsOCArMjAsOCBAQAogCiAvKioKICAqIHN0cnVjdCBhZGNfamFja19jb25kIC0gY29uZGl0aW9uIHRvIHVzZSBhbiBleHRjb24gc3RhdGUKLSAqIEBzdGF0ZToJCXRoZSBjb3JyZXNwb25kaW5nIGV4dGNvbiBzdGF0ZSAoaWYgMCwgdGhpcyBzdHJ1Y3QKICAqCQkJZGVub3RlcyB0aGUgbGFzdCBhZGNfamFja19jb25kIGVsZW1lbnQgYW1vbmcgdGhlIGFycmF5KQorICogQGlkOgkJCXRoZSB1bmlxdWUgaWQgb2YgZWFjaCBleHRlcm5hbCBjb25uZWN0b3IKICAqIEBtaW5fYWRjOgkJbWluIGFkYyB2YWx1ZSBmb3IgdGhpcyBjb25kaXRpb24KICAqIEBtYXhfYWRjOgkJbWF4IGFkYyB2YWx1ZSBmb3IgdGhpcyBjb25kaXRpb24KICAqCkBAIC0zMyw3ICszMyw3IEBACiAgKiBiZWNhdXNlIHdoZW4gbm8gYWRjX2phY2tfY29uZCBpcyBtZXQsIHN0YXRlID0gMCBpcyBhdXRvbWF0aWNhbGx5IGNob3Nlbi4KICAqLwogc3RydWN0IGFkY19qYWNrX2NvbmQgewotCXUzMiBzdGF0ZTsJLyogZXh0Y29uIHN0YXRlIHZhbHVlLiAwIGlmIGludmFsaWQgKi8KKwl1bnNpZ25lZCBpbnQgaWQ7CiAJdTMyIG1pbl9hZGM7CiAJdTMyIG1heF9hZGM7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mMmZzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L2YyZnNfZnMuaAppbmRleCA0YzAyYzY1Li40MjI2MzBiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2YyZnNfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2YyZnNfZnMuaApAQCAtMTAwLDYgKzEwMCw3IEBACiAvKgogICogRm9yIGNoZWNrcG9pbnQKICAqLworI2RlZmluZSBDUF9DUkNfUkVDT1ZFUllfRkxBRwkweDAwMDAwMDQwCiAjZGVmaW5lIENQX0ZBU1RCT09UX0ZMQUcJMHgwMDAwMDAyMAogI2RlZmluZSBDUF9GU0NLX0ZMQUcJCTB4MDAwMDAwMTAKICNkZWZpbmUgQ1BfRVJST1JfRkxBRwkJMHgwMDAwMDAwOApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mZW5jZS5oIGIvaW5jbHVkZS9saW51eC9mZW5jZS5oCmluZGV4IDhjYzcxOWEuLjJhYzZmYTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmVuY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZlbmNlLmgKQEAgLTQ5LDggKzQ5LDYgQEAKICAqIEB0aW1lc3RhbXA6IFRpbWVzdGFtcCB3aGVuIHRoZSBmZW5jZSB3YXMgc2lnbmFsZWQuCiAgKiBAc3RhdHVzOiBPcHRpb25hbCwgb25seSB2YWxpZCBpZiA8IDAsIG11c3QgYmUgc2V0IGJlZm9yZSBjYWxsaW5nCiAgKiBmZW5jZV9zaWduYWwsIGluZGljYXRlcyB0aGF0IHRoZSBmZW5jZSBoYXMgY29tcGxldGVkIHdpdGggYW4gZXJyb3IuCi0gKiBAY2hpbGRfbGlzdDogbGlzdCBvZiBjaGlsZHJlbiBmZW5jZXMKLSAqIEBhY3RpdmVfbGlzdDogbGlzdCBvZiBhY3RpdmUgZmVuY2VzCiAgKgogICogdGhlIGZsYWdzIG1lbWJlciBtdXN0IGJlIG1hbmlwdWxhdGVkIGFuZCByZWFkIHVzaW5nIHRoZSBhcHByb3ByaWF0ZQogICogYXRvbWljIG9wcyAoYml0XyopLCBzbyB0YWtpbmcgdGhlIHNwaW5sb2NrIHdpbGwgbm90IGJlIG5lZWRlZCBtb3N0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZpbHRlci5oIGIvaW5jbHVkZS9saW51eC9maWx0ZXIuaAppbmRleCBhMTY0MzliLi4xZjA5YzUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZpbHRlci5oCisrKyBiL2luY2x1ZGUvbGludXgvZmlsdGVyLmgKQEAgLTMxNCw2ICszMTQsNzAgQEAKIAlicGZfc2l6ZTsJCQkJCQlcCiB9KQogCisjZGVmaW5lIEJQRl9TSVpFT0YodHlwZSkJCQkJCVwKKwkoewkJCQkJCQlcCisJCWNvbnN0IGludCBfX3NpemUgPSBieXRlc190b19icGZfc2l6ZShzaXplb2YodHlwZSkpOyBcCisJCUJVSUxEX0JVR19PTihfX3NpemUgPCAwKTsJCQlcCisJCV9fc2l6ZTsJCQkJCQlcCisJfSkKKworI2RlZmluZSBCUEZfRklFTERfU0laRU9GKHR5cGUsIGZpZWxkKQkJCQlcCisJKHsJCQkJCQkJXAorCQljb25zdCBpbnQgX19zaXplID0gYnl0ZXNfdG9fYnBmX3NpemUoRklFTERfU0laRU9GKHR5cGUsIGZpZWxkKSk7IFwKKwkJQlVJTERfQlVHX09OKF9fc2l6ZSA8IDApOwkJCVwKKwkJX19zaXplOwkJCQkJCVwKKwl9KQorCisjZGVmaW5lIF9fQlBGX01BUF8wKG0sIHYsIC4uLikgdgorI2RlZmluZSBfX0JQRl9NQVBfMShtLCB2LCB0LCBhLCAuLi4pIG0odCwgYSkKKyNkZWZpbmUgX19CUEZfTUFQXzIobSwgdiwgdCwgYSwgLi4uKSBtKHQsIGEpLCBfX0JQRl9NQVBfMShtLCB2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX19CUEZfTUFQXzMobSwgdiwgdCwgYSwgLi4uKSBtKHQsIGEpLCBfX0JQRl9NQVBfMihtLCB2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX19CUEZfTUFQXzQobSwgdiwgdCwgYSwgLi4uKSBtKHQsIGEpLCBfX0JQRl9NQVBfMyhtLCB2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX19CUEZfTUFQXzUobSwgdiwgdCwgYSwgLi4uKSBtKHQsIGEpLCBfX0JQRl9NQVBfNChtLCB2LCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBfX0JQRl9SRUdfMCguLi4pIF9fQlBGX1BBRCg1KQorI2RlZmluZSBfX0JQRl9SRUdfMSguLi4pIF9fQlBGX01BUCgxLCBfX1ZBX0FSR1NfXyksIF9fQlBGX1BBRCg0KQorI2RlZmluZSBfX0JQRl9SRUdfMiguLi4pIF9fQlBGX01BUCgyLCBfX1ZBX0FSR1NfXyksIF9fQlBGX1BBRCgzKQorI2RlZmluZSBfX0JQRl9SRUdfMyguLi4pIF9fQlBGX01BUCgzLCBfX1ZBX0FSR1NfXyksIF9fQlBGX1BBRCgyKQorI2RlZmluZSBfX0JQRl9SRUdfNCguLi4pIF9fQlBGX01BUCg0LCBfX1ZBX0FSR1NfXyksIF9fQlBGX1BBRCgxKQorI2RlZmluZSBfX0JQRl9SRUdfNSguLi4pIF9fQlBGX01BUCg1LCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBfX0JQRl9NQVAobiwgLi4uKSBfX0JQRl9NQVBfIyNuKF9fVkFfQVJHU19fKQorI2RlZmluZSBfX0JQRl9SRUcobiwgLi4uKSBfX0JQRl9SRUdfIyNuKF9fVkFfQVJHU19fKQorCisjZGVmaW5lIF9fQlBGX0NBU1QodCwgYSkJCQkJCQkgICAgICAgXAorCShfX2ZvcmNlIHQpCQkJCQkJCSAgICAgICBcCisJKF9fZm9yY2UJCQkJCQkJICAgICAgIFwKKwkgdHlwZW9mKF9fYnVpbHRpbl9jaG9vc2VfZXhwcihzaXplb2YodCkgPT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCAgICAgIFwKKwkJCQkgICAgICAodW5zaWduZWQgbG9uZykwLCAodCkwKSkpIGEKKyNkZWZpbmUgX19CUEZfViB2b2lkCisjZGVmaW5lIF9fQlBGX04KKworI2RlZmluZSBfX0JQRl9ERUNMX0FSR1ModCwgYSkgdCAgIGEKKyNkZWZpbmUgX19CUEZfREVDTF9SRUdTKHQsIGEpIHU2NCBhCisKKyNkZWZpbmUgX19CUEZfUEFEKG4pCQkJCQkJCSAgICAgICBcCisJX19CUEZfTUFQKG4sIF9fQlBGX0RFQ0xfQVJHUywgX19CUEZfTiwgdTY0LCBfX3VyXzEsIHU2NCwgX191cl8yLCAgICAgICBcCisJCSAgdTY0LCBfX3VyXzMsIHU2NCwgX191cl80LCB1NjQsIF9fdXJfNSkKKworI2RlZmluZSBCUEZfQ0FMTF94KHgsIG5hbWUsIC4uLikJCQkJCSAgICAgICBcCisJc3RhdGljIF9fYWx3YXlzX2lubGluZQkJCQkJCSAgICAgICBcCisJdTY0IF9fX18jI25hbWUoX19CUEZfTUFQKHgsIF9fQlBGX0RFQ0xfQVJHUywgX19CUEZfViwgX19WQV9BUkdTX18pKTsgICBcCisJdTY0IG5hbWUoX19CUEZfUkVHKHgsIF9fQlBGX0RFQ0xfUkVHUywgX19CUEZfTiwgX19WQV9BUkdTX18pKTsJICAgICAgIFwKKwl1NjQgbmFtZShfX0JQRl9SRUcoeCwgX19CUEZfREVDTF9SRUdTLCBfX0JQRl9OLCBfX1ZBX0FSR1NfXykpCSAgICAgICBcCisJewkJCQkJCQkJICAgICAgIFwKKwkJcmV0dXJuIF9fX18jI25hbWUoX19CUEZfTUFQKHgsX19CUEZfQ0FTVCxfX0JQRl9OLF9fVkFfQVJHU19fKSk7XAorCX0JCQkJCQkJCSAgICAgICBcCisJc3RhdGljIF9fYWx3YXlzX2lubGluZQkJCQkJCSAgICAgICBcCisJdTY0IF9fX18jI25hbWUoX19CUEZfTUFQKHgsIF9fQlBGX0RFQ0xfQVJHUywgX19CUEZfViwgX19WQV9BUkdTX18pKQorCisjZGVmaW5lIEJQRl9DQUxMXzAobmFtZSwgLi4uKQlCUEZfQ0FMTF94KDAsIG5hbWUsIF9fVkFfQVJHU19fKQorI2RlZmluZSBCUEZfQ0FMTF8xKG5hbWUsIC4uLikJQlBGX0NBTExfeCgxLCBuYW1lLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQlBGX0NBTExfMihuYW1lLCAuLi4pCUJQRl9DQUxMX3goMiwgbmFtZSwgX19WQV9BUkdTX18pCisjZGVmaW5lIEJQRl9DQUxMXzMobmFtZSwgLi4uKQlCUEZfQ0FMTF94KDMsIG5hbWUsIF9fVkFfQVJHU19fKQorI2RlZmluZSBCUEZfQ0FMTF80KG5hbWUsIC4uLikJQlBGX0NBTExfeCg0LCBuYW1lLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQlBGX0NBTExfNShuYW1lLCAuLi4pCUJQRl9DQUxMX3goNSwgbmFtZSwgX19WQV9BUkdTX18pCisKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAvKiBBIHN0cnVjdCBzb2NrX2ZpbHRlciBpcyBhcmNoaXRlY3R1cmUgaW5kZXBlbmRlbnQuICovCiBzdHJ1Y3QgY29tcGF0X3NvY2tfZnByb2cgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oCmluZGV4IDM1MjNiZjYuLjkwMWUyNWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmgKQEAgLTU3NCw2ICs1NzQsNyBAQAogCiBzdHJ1Y3QgcG9zaXhfYWNsOwogI2RlZmluZSBBQ0xfTk9UX0NBQ0hFRCAoKHZvaWQgKikoLTEpKQorI2RlZmluZSBBQ0xfRE9OVF9DQUNIRSAoKHZvaWQgKikoLTMpKQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwb3NpeF9hY2wgKgogdW5jYWNoZWRfYWNsX3NlbnRpbmVsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnNjcnlwdG8uaCBiL2luY2x1ZGUvbGludXgvZnNjcnlwdG8uaAppbmRleCBjZmE2Y2RlLi43NmNmZjE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzY3J5cHRvLmgKKysrIGIvaW5jbHVkZS9saW51eC9mc2NyeXB0by5oCkBAIC0yNzQsOCArMjc0LDcgQEAKIGV4dGVybiBpbnQgZnNjcnlwdF96ZXJvb3V0X3JhbmdlKHN0cnVjdCBpbm9kZSAqLCBwZ29mZl90LCBzZWN0b3JfdCwKIAkJCQkJCXVuc2lnbmVkIGludCk7CiAvKiBwb2xpY3kuYyAqLwotZXh0ZXJuIGludCBmc2NyeXB0X3Byb2Nlc3NfcG9saWN5KHN0cnVjdCBpbm9kZSAqLAotCQkJCQljb25zdCBzdHJ1Y3QgZnNjcnlwdF9wb2xpY3kgKik7CitleHRlcm4gaW50IGZzY3J5cHRfcHJvY2Vzc19wb2xpY3koc3RydWN0IGZpbGUgKiwgY29uc3Qgc3RydWN0IGZzY3J5cHRfcG9saWN5ICopOwogZXh0ZXJuIGludCBmc2NyeXB0X2dldF9wb2xpY3koc3RydWN0IGlub2RlICosIHN0cnVjdCBmc2NyeXB0X3BvbGljeSAqKTsKIGV4dGVybiBpbnQgZnNjcnlwdF9oYXNfcGVybWl0dGVkX2NvbnRleHQoc3RydWN0IGlub2RlICosIHN0cnVjdCBpbm9kZSAqKTsKIGV4dGVybiBpbnQgZnNjcnlwdF9pbmhlcml0X2NvbnRleHQoc3RydWN0IGlub2RlICosIHN0cnVjdCBpbm9kZSAqLApAQCAtMzQ1LDcgKzM0NCw3IEBACiB9CiAKIC8qIHBvbGljeS5jICovCi1zdGF0aWMgaW5saW5lIGludCBmc2NyeXB0X25vdHN1cHBfcHJvY2Vzc19wb2xpY3koc3RydWN0IGlub2RlICppLAorc3RhdGljIGlubGluZSBpbnQgZnNjcnlwdF9ub3RzdXBwX3Byb2Nlc3NfcG9saWN5KHN0cnVjdCBmaWxlICpmLAogCQkJCWNvbnN0IHN0cnVjdCBmc2NyeXB0X3BvbGljeSAqcCkKIHsKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Zzbm90aWZ5X2JhY2tlbmQuaCBiL2luY2x1ZGUvbGludXgvZnNub3RpZnlfYmFja2VuZC5oCmluZGV4IDU4MjA1ZjMzLi43MjY4ZWQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Zzbm90aWZ5X2JhY2tlbmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Zzbm90aWZ5X2JhY2tlbmQuaApAQCAtMTQ4LDYgKzE0OCw3IEBACiAJI2RlZmluZSBGU19QUklPXzEJMSAvKiBmYW5vdGlmeSBjb250ZW50IGJhc2VkIGFjY2VzcyBjb250cm9sICovCiAJI2RlZmluZSBGU19QUklPXzIJMiAvKiBmYW5vdGlmeSBwcmUtY29udGVudCBhY2Nlc3MgKi8KIAl1bnNpZ25lZCBpbnQgcHJpb3JpdHk7CisJYm9vbCBzaHV0ZG93bjsJCS8qIGdyb3VwIGlzIGJlaW5nIHNodXQgZG93biwgZG9uJ3QgcXVldWUgbW9yZSBldmVudHMgKi8KIAogCS8qIHN0b3JlcyBhbGwgZmFzdHBhdGggbWFya3MgYXNzb2Mgd2l0aCB0aGlzIGdyb3VwIHNvIHRoZXkgY2FuIGJlIGNsZWFuZWQgb24gdW5yZWdpc3RlciAqLwogCXN0cnVjdCBtdXRleCBtYXJrX211dGV4OwkvKiBwcm90ZWN0IG1hcmtzX2xpc3QgKi8KQEAgLTE3OSw3ICsxODAsNiBAQAogCQkJc3BpbmxvY2tfdCBhY2Nlc3NfbG9jazsKIAkJCXN0cnVjdCBsaXN0X2hlYWQgYWNjZXNzX2xpc3Q7CiAJCQl3YWl0X3F1ZXVlX2hlYWRfdCBhY2Nlc3Nfd2FpdHE7Ci0JCQlhdG9taWNfdCBieXBhc3NfcGVybTsKICNlbmRpZiAvKiBDT05GSUdfRkFOT1RJRllfQUNDRVNTX1BFUk1JU1NJT05TICovCiAJCQlpbnQgZl9mbGFnczsKIAkJCXVuc2lnbmVkIGludCBtYXhfbWFya3M7CkBAIC0yOTIsNiArMjkyLDggQEAKIGV4dGVybiB2b2lkIGZzbm90aWZ5X2dldF9ncm91cChzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwKTsKIC8qIGRyb3AgcmVmZXJlbmNlIG9uIGEgZ3JvdXAgZnJvbSBmc25vdGlmeV9hbGxvY19ncm91cCAqLwogZXh0ZXJuIHZvaWQgZnNub3RpZnlfcHV0X2dyb3VwKHN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXApOworLyogZ3JvdXAgZGVzdHJ1Y3Rpb24gYmVnaW5zLCBzdG9wIHF1ZXVpbmcgbmV3IGV2ZW50cyAqLworZXh0ZXJuIHZvaWQgZnNub3RpZnlfZ3JvdXBfc3RvcF9xdWV1ZWluZyhzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwKTsKIC8qIGRlc3Ryb3kgZ3JvdXAgKi8KIGV4dGVybiB2b2lkIGZzbm90aWZ5X2Rlc3Ryb3lfZ3JvdXAoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCk7CiAvKiBmYXN5bmMgaGFuZGxlciBmdW5jdGlvbiAqLwpAQCAtMzA0LDggKzMwNiw2IEBACiAJCQkgICAgICBzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgKmV2ZW50LAogCQkJICAgICAgaW50ICgqbWVyZ2UpKHN0cnVjdCBsaXN0X2hlYWQgKiwKIAkJCQkJICAgc3RydWN0IGZzbm90aWZ5X2V2ZW50ICopKTsKLS8qIFJlbW92ZSBwYXNzZWQgZXZlbnQgZnJvbSBncm91cHMgbm90aWZpY2F0aW9uIHF1ZXVlICovCi1leHRlcm4gdm9pZCBmc25vdGlmeV9yZW1vdmVfZXZlbnQoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCwgc3RydWN0IGZzbm90aWZ5X2V2ZW50ICpldmVudCk7CiAvKiB0cnVlIGlmIHRoZSBncm91cCBub3RpZmljYXRpb24gcXVldWUgaXMgZW1wdHkgKi8KIGV4dGVybiBib29sIGZzbm90aWZ5X25vdGlmeV9xdWV1ZV9pc19lbXB0eShzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwKTsKIC8qIHJldHVybiwgYnV0IGRvIG5vdCBkZXF1ZXVlIHRoZSBmaXJzdCBldmVudCBvbiB0aGUgbm90aWZpY2F0aW9uIHF1ZXVlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oIGIvaW5jbHVkZS9saW51eC9mdHJhY2UuaAppbmRleCA3ZDU2NWFmLi5iM2QzNGQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZnRyYWNlLmgKQEAgLTc5NCw4ICs3OTQsMTUgQEAKIAl1bnNpZ25lZCBsb25nIHJldDsKIAl1bnNpZ25lZCBsb25nIGZ1bmM7CiAJdW5zaWduZWQgbG9uZyBsb25nIGNhbGx0aW1lOworI2lmZGVmIENPTkZJR19GVU5DVElPTl9QUk9GSUxFUgogCXVuc2lnbmVkIGxvbmcgbG9uZyBzdWJ0aW1lOworI2VuZGlmCisjaWZkZWYgSEFWRV9GVU5DVElPTl9HUkFQSF9GUF9URVNUCiAJdW5zaWduZWQgbG9uZyBmcDsKKyNlbmRpZgorI2lmZGVmIEhBVkVfRlVOQ1RJT05fR1JBUEhfUkVUX0FERFJfUFRSCisJdW5zaWduZWQgbG9uZyAqcmV0cDsKKyNlbmRpZgogfTsKIAogLyoKQEAgLTgwNyw3ICs4MTQsMTAgQEAKIAogZXh0ZXJuIGludAogZnRyYWNlX3B1c2hfcmV0dXJuX3RyYWNlKHVuc2lnbmVkIGxvbmcgcmV0LCB1bnNpZ25lZCBsb25nIGZ1bmMsIGludCAqZGVwdGgsCi0JCQkgdW5zaWduZWQgbG9uZyBmcmFtZV9wb2ludGVyKTsKKwkJCSB1bnNpZ25lZCBsb25nIGZyYW1lX3BvaW50ZXIsIHVuc2lnbmVkIGxvbmcgKnJldHApOworCit1bnNpZ25lZCBsb25nIGZ0cmFjZV9ncmFwaF9yZXRfYWRkcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCAqaWR4LAorCQkJCSAgICB1bnNpZ25lZCBsb25nIHJldCwgdW5zaWduZWQgbG9uZyAqcmV0cCk7CiAKIC8qCiAgKiBTb21ldGltZXMgd2UgZG9uJ3Qgd2FudCB0byB0cmFjZSBhIGZ1bmN0aW9uIHdpdGggdGhlIGZ1bmN0aW9uCkBAIC04NzAsNiArODgwLDEzIEBACiAJcmV0dXJuIC0xOwogfQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK2Z0cmFjZV9ncmFwaF9yZXRfYWRkcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCAqaWR4LCB1bnNpZ25lZCBsb25nIHJldCwKKwkJICAgICAgdW5zaWduZWQgbG9uZyAqcmV0cCkKK3sKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgcGF1c2VfZ3JhcGhfdHJhY2luZyh2b2lkKSB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCB1bnBhdXNlX2dyYXBoX3RyYWNpbmcodm9pZCkgeyB9CiAjZW5kaWYgLyogQ09ORklHX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mdHJhY2VfaXJxLmggYi9pbmNsdWRlL2xpbnV4L2Z0cmFjZV9pcnEuaAppbmRleCBkY2E3YmY4Li40ZWMyYzliIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Z0cmFjZV9pcnEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Z0cmFjZV9pcnEuaApAQCAtMywxMSArMywzNCBAQAogCiAKICNpZmRlZiBDT05GSUdfRlRSQUNFX05NSV9FTlRFUgotZXh0ZXJuIHZvaWQgZnRyYWNlX25taV9lbnRlcih2b2lkKTsKLWV4dGVybiB2b2lkIGZ0cmFjZV9ubWlfZXhpdCh2b2lkKTsKK2V4dGVybiB2b2lkIGFyY2hfZnRyYWNlX25taV9lbnRlcih2b2lkKTsKK2V4dGVybiB2b2lkIGFyY2hfZnRyYWNlX25taV9leGl0KHZvaWQpOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBmdHJhY2Vfbm1pX2VudGVyKHZvaWQpIHsgfQotc3RhdGljIGlubGluZSB2b2lkIGZ0cmFjZV9ubWlfZXhpdCh2b2lkKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2Z0cmFjZV9ubWlfZW50ZXIodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9mdHJhY2Vfbm1pX2V4aXQodm9pZCkgeyB9CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19IV0xBVF9UUkFDRVIKK2V4dGVybiBib29sIHRyYWNlX2h3bGF0X2NhbGxiYWNrX2VuYWJsZWQ7CitleHRlcm4gdm9pZCB0cmFjZV9od2xhdF9jYWxsYmFjayhib29sIGVudGVyKTsKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgZnRyYWNlX25taV9lbnRlcih2b2lkKQoreworI2lmZGVmIENPTkZJR19IV0xBVF9UUkFDRVIKKwlpZiAodHJhY2VfaHdsYXRfY2FsbGJhY2tfZW5hYmxlZCkKKwkJdHJhY2VfaHdsYXRfY2FsbGJhY2sodHJ1ZSk7CisjZW5kaWYKKwlhcmNoX2Z0cmFjZV9ubWlfZW50ZXIoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZ0cmFjZV9ubWlfZXhpdCh2b2lkKQoreworCWFyY2hfZnRyYWNlX25taV9leGl0KCk7CisjaWZkZWYgQ09ORklHX0hXTEFUX1RSQUNFUgorCWlmICh0cmFjZV9od2xhdF9jYWxsYmFja19lbmFibGVkKQorCQl0cmFjZV9od2xhdF9jYWxsYmFjayhmYWxzZSk7CisjZW5kaWYKK30KKwogI2VuZGlmIC8qIF9MSU5VWF9GVFJBQ0VfSVJRX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZ3Bpby9kcml2ZXIuaCBiL2luY2x1ZGUvbGludXgvZ3Bpby9kcml2ZXIuaAppbmRleCA1MDg4MmUwLi4xZjBiZTcyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2dwaW8vZHJpdmVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9ncGlvL2RyaXZlci5oCkBAIC0zLDcgKzMsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pcnFjaGlwL2NoYWluZWRfaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+CkBAIC0xNiw2ICsxNSw3IEBACiBzdHJ1Y3QgZGV2aWNlX25vZGU7CiBzdHJ1Y3Qgc2VxX2ZpbGU7CiBzdHJ1Y3QgZ3Bpb19kZXZpY2U7CitzdHJ1Y3QgbW9kdWxlOwogCiAjaWZkZWYgQ09ORklHX0dQSU9MSUIKIApAQCAtMTEyLDYgKzExMiwxMCBAQAogICoJaW5pdGlhbGl6YXRpb24sIHByb3ZpZGVkIGJ5IEdQSU8gZHJpdmVyCiAgKiBAaXJxX3BhcmVudDogR1BJTyBJUlEgY2hpcCBwYXJlbnQvYmFuayBsaW51eCBpcnEgbnVtYmVyLAogICoJcHJvdmlkZWQgYnkgR1BJTyBkcml2ZXIKKyAqIEBpcnFfbmVlZF92YWxpZF9tYXNrOiBJZiBzZXQgY29yZSBhbGxvY2F0ZXMgQGlycV92YWxpZF9tYXNrIHdpdGggYWxsCisgKgliaXRzIHNldCB0byBvbmUKKyAqIEBpcnFfdmFsaWRfbWFzazogSWYgbm90ICVOVUxMIGhvbGRzIGJpdG1hc2sgb2YgR1BJT3Mgd2hpY2ggYXJlIHZhbGlkIHRvCisgKgliZSBpbmNsdWRlZCBpbiBJUlEgZG9tYWluIG9mIHRoZSBjaGlwCiAgKiBAbG9ja19rZXk6IHBlciBHUElPIElSUSBjaGlwIGxvY2tkZXAgY2xhc3MKICAqCiAgKiBBIGdwaW9fY2hpcCBjYW4gaGVscCBwbGF0Zm9ybXMgYWJzdHJhY3QgdmFyaW91cyBzb3VyY2VzIG9mIEdQSU9zIHNvCkBAIC0xOTAsNiArMTk0LDggQEAKIAlpcnFfZmxvd19oYW5kbGVyX3QJaXJxX2hhbmRsZXI7CiAJdW5zaWduZWQgaW50CQlpcnFfZGVmYXVsdF90eXBlOwogCWludAkJCWlycV9wYXJlbnQ7CisJYm9vbAkJCWlycV9uZWVkX3ZhbGlkX21hc2s7CisJdW5zaWduZWQgbG9uZwkJKmlycV92YWxpZF9tYXNrOwogCXN0cnVjdCBsb2NrX2NsYXNzX2tleQkqbG9ja19rZXk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oaWQtc2Vuc29yLWh1Yi5oIGIvaW5jbHVkZS9saW51eC9oaWQtc2Vuc29yLWh1Yi5oCmluZGV4IGMwMmI1Y2UuLmRkODVmMzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaGlkLXNlbnNvci1odWIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2hpZC1zZW5zb3ItaHViLmgKQEAgLTIzNiw2ICsyMzYsNyBAQAogCXN0cnVjdCBoaWRfc2Vuc29yX2h1Yl9hdHRyaWJ1dGVfaW5mbyByZXBvcnRfc3RhdGU7CiAJc3RydWN0IGhpZF9zZW5zb3JfaHViX2F0dHJpYnV0ZV9pbmZvIHBvd2VyX3N0YXRlOwogCXN0cnVjdCBoaWRfc2Vuc29yX2h1Yl9hdHRyaWJ1dGVfaW5mbyBzZW5zaXRpdml0eTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKIH07CiAKIC8qIENvbnZlcnQgZnJvbSBoaWQgdW5pdCBleHBvIHRvIHJlZ3VsYXIgZXhwb25lbnQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaG9zdDF4LmggYi9pbmNsdWRlL2xpbnV4L2hvc3QxeC5oCmluZGV4IGQyYmE3ZDMuLjFmZmJmMmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaG9zdDF4LmgKKysrIGIvaW5jbHVkZS9saW51eC9ob3N0MXguaApAQCAtMzA0LDYgKzMwNCw4IEBACiAKIHN0cnVjdCB0ZWdyYV9taXBpX2RldmljZSAqdGVncmFfbWlwaV9yZXF1ZXN0KHN0cnVjdCBkZXZpY2UgKmRldmljZSk7CiB2b2lkIHRlZ3JhX21pcGlfZnJlZShzdHJ1Y3QgdGVncmFfbWlwaV9kZXZpY2UgKmRldmljZSk7CitpbnQgdGVncmFfbWlwaV9lbmFibGUoc3RydWN0IHRlZ3JhX21pcGlfZGV2aWNlICpkZXZpY2UpOworaW50IHRlZ3JhX21pcGlfZGlzYWJsZShzdHJ1Y3QgdGVncmFfbWlwaV9kZXZpY2UgKmRldmljZSk7CiBpbnQgdGVncmFfbWlwaV9jYWxpYnJhdGUoc3RydWN0IHRlZ3JhX21pcGlfZGV2aWNlICpkZXZpY2UpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHdtb24uaCBiL2luY2x1ZGUvbGludXgvaHdtb24uaAppbmRleCAwOTM1NGY2Li45ZDJmOGJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2h3bW9uLmgKKysrIGIvaW5jbHVkZS9saW51eC9od21vbi5oCkBAIC0xNCw5ICsxNCwzNDEgQEAKICNpZm5kZWYgX0hXTU9OX0hfCiAjZGVmaW5lIF9IV01PTl9IXwogCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKIHN0cnVjdCBkZXZpY2U7CiBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwOwogCitlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB7CisJaHdtb25fY2hpcCwKKwlod21vbl90ZW1wLAorCWh3bW9uX2luLAorCWh3bW9uX2N1cnIsCisJaHdtb25fcG93ZXIsCisJaHdtb25fZW5lcmd5LAorCWh3bW9uX2h1bWlkaXR5LAorCWh3bW9uX2ZhbiwKKwlod21vbl9wd20sCit9OworCitlbnVtIGh3bW9uX2NoaXBfYXR0cmlidXRlcyB7CisJaHdtb25fY2hpcF90ZW1wX3Jlc2V0X2hpc3RvcnksCisJaHdtb25fY2hpcF9pbl9yZXNldF9oaXN0b3J5LAorCWh3bW9uX2NoaXBfY3Vycl9yZXNldF9oaXN0b3J5LAorCWh3bW9uX2NoaXBfcG93ZXJfcmVzZXRfaGlzdG9yeSwKKwlod21vbl9jaGlwX3JlZ2lzdGVyX3R6LAorCWh3bW9uX2NoaXBfdXBkYXRlX2ludGVydmFsLAorCWh3bW9uX2NoaXBfYWxhcm1zLAorfTsKKworI2RlZmluZSBIV01PTl9DX1RFTVBfUkVTRVRfSElTVE9SWQlCSVQoaHdtb25fY2hpcF90ZW1wX3Jlc2V0X2hpc3RvcnkpCisjZGVmaW5lIEhXTU9OX0NfSU5fUkVTRVRfSElTVE9SWQlCSVQoaHdtb25fY2hpcF9pbl9yZXNldF9oaXN0b3J5KQorI2RlZmluZSBIV01PTl9DX0NVUlJfUkVTRVRfSElTVE9SWQlCSVQoaHdtb25fY2hpcF9jdXJyX3Jlc2V0X2hpc3RvcnkpCisjZGVmaW5lIEhXTU9OX0NfUE9XRVJfUkVTRVRfSElTVE9SWQlCSVQoaHdtb25fY2hpcF9wb3dlcl9yZXNldF9oaXN0b3J5KQorI2RlZmluZSBIV01PTl9DX1JFR0lTVEVSX1RaCQlCSVQoaHdtb25fY2hpcF9yZWdpc3Rlcl90eikKKyNkZWZpbmUgSFdNT05fQ19VUERBVEVfSU5URVJWQUwJCUJJVChod21vbl9jaGlwX3VwZGF0ZV9pbnRlcnZhbCkKKyNkZWZpbmUgSFdNT05fQ19BTEFSTVMJCQlCSVQoaHdtb25fY2hpcF9hbGFybXMpCisKK2VudW0gaHdtb25fdGVtcF9hdHRyaWJ1dGVzIHsKKwlod21vbl90ZW1wX2lucHV0ID0gMCwKKwlod21vbl90ZW1wX3R5cGUsCisJaHdtb25fdGVtcF9sY3JpdCwKKwlod21vbl90ZW1wX2xjcml0X2h5c3QsCisJaHdtb25fdGVtcF9taW4sCisJaHdtb25fdGVtcF9taW5faHlzdCwKKwlod21vbl90ZW1wX21heCwKKwlod21vbl90ZW1wX21heF9oeXN0LAorCWh3bW9uX3RlbXBfY3JpdCwKKwlod21vbl90ZW1wX2NyaXRfaHlzdCwKKwlod21vbl90ZW1wX2VtZXJnZW5jeSwKKwlod21vbl90ZW1wX2VtZXJnZW5jeV9oeXN0LAorCWh3bW9uX3RlbXBfYWxhcm0sCisJaHdtb25fdGVtcF9sY3JpdF9hbGFybSwKKwlod21vbl90ZW1wX21pbl9hbGFybSwKKwlod21vbl90ZW1wX21heF9hbGFybSwKKwlod21vbl90ZW1wX2NyaXRfYWxhcm0sCisJaHdtb25fdGVtcF9lbWVyZ2VuY3lfYWxhcm0sCisJaHdtb25fdGVtcF9mYXVsdCwKKwlod21vbl90ZW1wX29mZnNldCwKKwlod21vbl90ZW1wX2xhYmVsLAorCWh3bW9uX3RlbXBfbG93ZXN0LAorCWh3bW9uX3RlbXBfaGlnaGVzdCwKKwlod21vbl90ZW1wX3Jlc2V0X2hpc3RvcnksCit9OworCisjZGVmaW5lIEhXTU9OX1RfSU5QVVQJCUJJVChod21vbl90ZW1wX2lucHV0KQorI2RlZmluZSBIV01PTl9UX1RZUEUJCUJJVChod21vbl90ZW1wX3R5cGUpCisjZGVmaW5lIEhXTU9OX1RfTENSSVQJCUJJVChod21vbl90ZW1wX2xjcml0KQorI2RlZmluZSBIV01PTl9UX0xDUklUX0hZU1QJQklUKGh3bW9uX3RlbXBfbGNyaXRfaHlzdCkKKyNkZWZpbmUgSFdNT05fVF9NSU4JCUJJVChod21vbl90ZW1wX21pbikKKyNkZWZpbmUgSFdNT05fVF9NSU5fSFlTVAlCSVQoaHdtb25fdGVtcF9taW5faHlzdCkKKyNkZWZpbmUgSFdNT05fVF9NQVgJCUJJVChod21vbl90ZW1wX21heCkKKyNkZWZpbmUgSFdNT05fVF9NQVhfSFlTVAlCSVQoaHdtb25fdGVtcF9tYXhfaHlzdCkKKyNkZWZpbmUgSFdNT05fVF9DUklUCQlCSVQoaHdtb25fdGVtcF9jcml0KQorI2RlZmluZSBIV01PTl9UX0NSSVRfSFlTVAlCSVQoaHdtb25fdGVtcF9jcml0X2h5c3QpCisjZGVmaW5lIEhXTU9OX1RfRU1FUkdFTkNZCUJJVChod21vbl90ZW1wX2VtZXJnZW5jeSkKKyNkZWZpbmUgSFdNT05fVF9FTUVSR0VOQ1lfSFlTVAlCSVQoaHdtb25fdGVtcF9lbWVyZ2VuY3lfaHlzdCkKKyNkZWZpbmUgSFdNT05fVF9NSU5fQUxBUk0JQklUKGh3bW9uX3RlbXBfbWluX2FsYXJtKQorI2RlZmluZSBIV01PTl9UX01BWF9BTEFSTQlCSVQoaHdtb25fdGVtcF9tYXhfYWxhcm0pCisjZGVmaW5lIEhXTU9OX1RfQ1JJVF9BTEFSTQlCSVQoaHdtb25fdGVtcF9jcml0X2FsYXJtKQorI2RlZmluZSBIV01PTl9UX0VNRVJHRU5DWV9BTEFSTQlCSVQoaHdtb25fdGVtcF9lbWVyZ2VuY3lfYWxhcm0pCisjZGVmaW5lIEhXTU9OX1RfRkFVTFQJCUJJVChod21vbl90ZW1wX2ZhdWx0KQorI2RlZmluZSBIV01PTl9UX09GRlNFVAkJQklUKGh3bW9uX3RlbXBfb2Zmc2V0KQorI2RlZmluZSBIV01PTl9UX0xBQkVMCQlCSVQoaHdtb25fdGVtcF9sYWJlbCkKKyNkZWZpbmUgSFdNT05fVF9MT1dFU1QJCUJJVChod21vbl90ZW1wX2xvd2VzdCkKKyNkZWZpbmUgSFdNT05fVF9ISUdIRVNUCQlCSVQoaHdtb25fdGVtcF9oaWdoZXN0KQorI2RlZmluZSBIV01PTl9UX1JFU0VUX0hJU1RPUlkJQklUKGh3bW9uX3RlbXBfcmVzZXRfaGlzdG9yeSkKKworZW51bSBod21vbl9pbl9hdHRyaWJ1dGVzIHsKKwlod21vbl9pbl9pbnB1dCwKKwlod21vbl9pbl9taW4sCisJaHdtb25faW5fbWF4LAorCWh3bW9uX2luX2xjcml0LAorCWh3bW9uX2luX2NyaXQsCisJaHdtb25faW5fYXZlcmFnZSwKKwlod21vbl9pbl9sb3dlc3QsCisJaHdtb25faW5faGlnaGVzdCwKKwlod21vbl9pbl9yZXNldF9oaXN0b3J5LAorCWh3bW9uX2luX2xhYmVsLAorCWh3bW9uX2luX2FsYXJtLAorCWh3bW9uX2luX21pbl9hbGFybSwKKwlod21vbl9pbl9tYXhfYWxhcm0sCisJaHdtb25faW5fbGNyaXRfYWxhcm0sCisJaHdtb25faW5fY3JpdF9hbGFybSwKK307CisKKyNkZWZpbmUgSFdNT05fSV9JTlBVVAkJQklUKGh3bW9uX2luX2lucHV0KQorI2RlZmluZSBIV01PTl9JX01JTgkJQklUKGh3bW9uX2luX21pbikKKyNkZWZpbmUgSFdNT05fSV9NQVgJCUJJVChod21vbl9pbl9tYXgpCisjZGVmaW5lIEhXTU9OX0lfTENSSVQJCUJJVChod21vbl9pbl9sY3JpdCkKKyNkZWZpbmUgSFdNT05fSV9DUklUCQlCSVQoaHdtb25faW5fY3JpdCkKKyNkZWZpbmUgSFdNT05fSV9BVkVSQUdFCQlCSVQoaHdtb25faW5fYXZlcmFnZSkKKyNkZWZpbmUgSFdNT05fSV9MT1dFU1QJCUJJVChod21vbl9pbl9sb3dlc3QpCisjZGVmaW5lIEhXTU9OX0lfSElHSEVTVAkJQklUKGh3bW9uX2luX2hpZ2hlc3QpCisjZGVmaW5lIEhXTU9OX0lfUkVTRVRfSElTVE9SWQlCSVQoaHdtb25faW5fcmVzZXRfaGlzdG9yeSkKKyNkZWZpbmUgSFdNT05fSV9MQUJFTAkJQklUKGh3bW9uX2luX2xhYmVsKQorI2RlZmluZSBIV01PTl9JX0FMQVJNCQlCSVQoaHdtb25faW5fYWxhcm0pCisjZGVmaW5lIEhXTU9OX0lfTUlOX0FMQVJNCUJJVChod21vbl9pbl9taW5fYWxhcm0pCisjZGVmaW5lIEhXTU9OX0lfTUFYX0FMQVJNCUJJVChod21vbl9pbl9tYXhfYWxhcm0pCisjZGVmaW5lIEhXTU9OX0lfTENSSVRfQUxBUk0JQklUKGh3bW9uX2luX2xjcml0X2FsYXJtKQorI2RlZmluZSBIV01PTl9JX0NSSVRfQUxBUk0JQklUKGh3bW9uX2luX2NyaXRfYWxhcm0pCisKK2VudW0gaHdtb25fY3Vycl9hdHRyaWJ1dGVzIHsKKwlod21vbl9jdXJyX2lucHV0LAorCWh3bW9uX2N1cnJfbWluLAorCWh3bW9uX2N1cnJfbWF4LAorCWh3bW9uX2N1cnJfbGNyaXQsCisJaHdtb25fY3Vycl9jcml0LAorCWh3bW9uX2N1cnJfYXZlcmFnZSwKKwlod21vbl9jdXJyX2xvd2VzdCwKKwlod21vbl9jdXJyX2hpZ2hlc3QsCisJaHdtb25fY3Vycl9yZXNldF9oaXN0b3J5LAorCWh3bW9uX2N1cnJfbGFiZWwsCisJaHdtb25fY3Vycl9hbGFybSwKKwlod21vbl9jdXJyX21pbl9hbGFybSwKKwlod21vbl9jdXJyX21heF9hbGFybSwKKwlod21vbl9jdXJyX2xjcml0X2FsYXJtLAorCWh3bW9uX2N1cnJfY3JpdF9hbGFybSwKK307CisKKyNkZWZpbmUgSFdNT05fQ19JTlBVVAkJQklUKGh3bW9uX2N1cnJfaW5wdXQpCisjZGVmaW5lIEhXTU9OX0NfTUlOCQlCSVQoaHdtb25fY3Vycl9taW4pCisjZGVmaW5lIEhXTU9OX0NfTUFYCQlCSVQoaHdtb25fY3Vycl9tYXgpCisjZGVmaW5lIEhXTU9OX0NfTENSSVQJCUJJVChod21vbl9jdXJyX2xjcml0KQorI2RlZmluZSBIV01PTl9DX0NSSVQJCUJJVChod21vbl9jdXJyX2NyaXQpCisjZGVmaW5lIEhXTU9OX0NfQVZFUkFHRQkJQklUKGh3bW9uX2N1cnJfYXZlcmFnZSkKKyNkZWZpbmUgSFdNT05fQ19MT1dFU1QJCUJJVChod21vbl9jdXJyX2xvd2VzdCkKKyNkZWZpbmUgSFdNT05fQ19ISUdIRVNUCQlCSVQoaHdtb25fY3Vycl9oaWdoZXN0KQorI2RlZmluZSBIV01PTl9DX1JFU0VUX0hJU1RPUlkJQklUKGh3bW9uX2N1cnJfcmVzZXRfaGlzdG9yeSkKKyNkZWZpbmUgSFdNT05fQ19MQUJFTAkJQklUKGh3bW9uX2N1cnJfbGFiZWwpCisjZGVmaW5lIEhXTU9OX0NfQUxBUk0JCUJJVChod21vbl9jdXJyX2FsYXJtKQorI2RlZmluZSBIV01PTl9DX01JTl9BTEFSTQlCSVQoaHdtb25fY3Vycl9taW5fYWxhcm0pCisjZGVmaW5lIEhXTU9OX0NfTUFYX0FMQVJNCUJJVChod21vbl9jdXJyX21heF9hbGFybSkKKyNkZWZpbmUgSFdNT05fQ19MQ1JJVF9BTEFSTQlCSVQoaHdtb25fY3Vycl9sY3JpdF9hbGFybSkKKyNkZWZpbmUgSFdNT05fQ19DUklUX0FMQVJNCUJJVChod21vbl9jdXJyX2NyaXRfYWxhcm0pCisKK2VudW0gaHdtb25fcG93ZXJfYXR0cmlidXRlcyB7CisJaHdtb25fcG93ZXJfYXZlcmFnZSwKKwlod21vbl9wb3dlcl9hdmVyYWdlX2ludGVydmFsLAorCWh3bW9uX3Bvd2VyX2F2ZXJhZ2VfaW50ZXJ2YWxfbWF4LAorCWh3bW9uX3Bvd2VyX2F2ZXJhZ2VfaW50ZXJ2YWxfbWluLAorCWh3bW9uX3Bvd2VyX2F2ZXJhZ2VfaGlnaGVzdCwKKwlod21vbl9wb3dlcl9hdmVyYWdlX2xvd2VzdCwKKwlod21vbl9wb3dlcl9hdmVyYWdlX21heCwKKwlod21vbl9wb3dlcl9hdmVyYWdlX21pbiwKKwlod21vbl9wb3dlcl9pbnB1dCwKKwlod21vbl9wb3dlcl9pbnB1dF9oaWdoZXN0LAorCWh3bW9uX3Bvd2VyX2lucHV0X2xvd2VzdCwKKwlod21vbl9wb3dlcl9yZXNldF9oaXN0b3J5LAorCWh3bW9uX3Bvd2VyX2FjY3VyYWN5LAorCWh3bW9uX3Bvd2VyX2NhcCwKKwlod21vbl9wb3dlcl9jYXBfaHlzdCwKKwlod21vbl9wb3dlcl9jYXBfbWF4LAorCWh3bW9uX3Bvd2VyX2NhcF9taW4sCisJaHdtb25fcG93ZXJfbWF4LAorCWh3bW9uX3Bvd2VyX2NyaXQsCisJaHdtb25fcG93ZXJfbGFiZWwsCisJaHdtb25fcG93ZXJfYWxhcm0sCisJaHdtb25fcG93ZXJfY2FwX2FsYXJtLAorCWh3bW9uX3Bvd2VyX21heF9hbGFybSwKKwlod21vbl9wb3dlcl9jcml0X2FsYXJtLAorfTsKKworI2RlZmluZSBIV01PTl9QX0FWRVJBR0UJCQlCSVQoaHdtb25fcG93ZXJfYXZlcmFnZSkKKyNkZWZpbmUgSFdNT05fUF9BVkVSQUdFX0lOVEVSVkFMCUJJVChod21vbl9wb3dlcl9hdmVyYWdlX2ludGVydmFsKQorI2RlZmluZSBIV01PTl9QX0FWRVJBR0VfSU5URVJWQUxfTUFYCUJJVChod21vbl9wb3dlcl9hdmVyYWdlX2ludGVydmFsX21heCkKKyNkZWZpbmUgSFdNT05fUF9BVkVSQUdFX0lOVEVSVkFMX01JTglCSVQoaHdtb25fcG93ZXJfYXZlcmFnZV9pbnRlcnZhbF9taW4pCisjZGVmaW5lIEhXTU9OX1BfQVZFUkFHRV9ISUdIRVNUCQlCSVQoaHdtb25fcG93ZXJfYXZlcmFnZV9oaWdoZXN0KQorI2RlZmluZSBIV01PTl9QX0FWRVJBR0VfTE9XRVNUCQlCSVQoaHdtb25fcG93ZXJfYXZlcmFnZV9sb3dlc3QpCisjZGVmaW5lIEhXTU9OX1BfQVZFUkFHRV9NQVgJCUJJVChod21vbl9wb3dlcl9hdmVyYWdlX21heCkKKyNkZWZpbmUgSFdNT05fUF9BVkVSQUdFX01JTgkJQklUKGh3bW9uX3Bvd2VyX2F2ZXJhZ2VfbWluKQorI2RlZmluZSBIV01PTl9QX0lOUFVUCQkJQklUKGh3bW9uX3Bvd2VyX2lucHV0KQorI2RlZmluZSBIV01PTl9QX0lOUFVUX0hJR0hFU1QJCUJJVChod21vbl9wb3dlcl9pbnB1dF9oaWdoZXN0KQorI2RlZmluZSBIV01PTl9QX0lOUFVUX0xPV0VTVAkJQklUKGh3bW9uX3Bvd2VyX2lucHV0X2xvd2VzdCkKKyNkZWZpbmUgSFdNT05fUF9SRVNFVF9ISVNUT1JZCQlCSVQoaHdtb25fcG93ZXJfcmVzZXRfaGlzdG9yeSkKKyNkZWZpbmUgSFdNT05fUF9BQ0NVUkFDWQkJQklUKGh3bW9uX3Bvd2VyX2FjY3VyYWN5KQorI2RlZmluZSBIV01PTl9QX0NBUAkJCUJJVChod21vbl9wb3dlcl9jYXApCisjZGVmaW5lIEhXTU9OX1BfQ0FQX0hZU1QJCUJJVChod21vbl9wb3dlcl9jYXBfaHlzdCkKKyNkZWZpbmUgSFdNT05fUF9DQVBfTUFYCQkJQklUKGh3bW9uX3Bvd2VyX2NhcF9tYXgpCisjZGVmaW5lIEhXTU9OX1BfQ0FQX01JTgkJCUJJVChod21vbl9wb3dlcl9jYXBfbWluKQorI2RlZmluZSBIV01PTl9QX01BWAkJCUJJVChod21vbl9wb3dlcl9tYXgpCisjZGVmaW5lIEhXTU9OX1BfQ1JJVAkJCUJJVChod21vbl9wb3dlcl9jcml0KQorI2RlZmluZSBIV01PTl9QX0xBQkVMCQkJQklUKGh3bW9uX3Bvd2VyX2xhYmVsKQorI2RlZmluZSBIV01PTl9QX0FMQVJNCQkJQklUKGh3bW9uX3Bvd2VyX2FsYXJtKQorI2RlZmluZSBIV01PTl9QX0NBUF9BTEFSTQkJQklUKGh3bW9uX3Bvd2VyX2NhcF9hbGFybSkKKyNkZWZpbmUgSFdNT05fUF9NQVhfQUxBUk0JCUJJVChod21vbl9wb3dlcl9tYXhfYWxhcm0pCisjZGVmaW5lIEhXTU9OX1BfQ1JJVF9BTEFSTQkJQklUKGh3bW9uX3Bvd2VyX2NyaXRfYWxhcm0pCisKK2VudW0gaHdtb25fZW5lcmd5X2F0dHJpYnV0ZXMgeworCWh3bW9uX2VuZXJneV9pbnB1dCwKKwlod21vbl9lbmVyZ3lfbGFiZWwsCit9OworCisjZGVmaW5lIEhXTU9OX0VfSU5QVVQJCQlCSVQoaHdtb25fZW5lcmd5X2lucHV0KQorI2RlZmluZSBIV01PTl9FX0xBQkVMCQkJQklUKGh3bW9uX2VuZXJneV9sYWJlbCkKKworZW51bSBod21vbl9odW1pZGl0eV9hdHRyaWJ1dGVzIHsKKwlod21vbl9odW1pZGl0eV9pbnB1dCwKKwlod21vbl9odW1pZGl0eV9sYWJlbCwKKwlod21vbl9odW1pZGl0eV9taW4sCisJaHdtb25faHVtaWRpdHlfbWluX2h5c3QsCisJaHdtb25faHVtaWRpdHlfbWF4LAorCWh3bW9uX2h1bWlkaXR5X21heF9oeXN0LAorCWh3bW9uX2h1bWlkaXR5X2FsYXJtLAorCWh3bW9uX2h1bWlkaXR5X2ZhdWx0LAorfTsKKworI2RlZmluZSBIV01PTl9IX0lOUFVUCQkJQklUKGh3bW9uX2h1bWlkaXR5X2lucHV0KQorI2RlZmluZSBIV01PTl9IX0xBQkVMCQkJQklUKGh3bW9uX2h1bWlkaXR5X2xhYmVsKQorI2RlZmluZSBIV01PTl9IX01JTgkJCUJJVChod21vbl9odW1pZGl0eV9taW4pCisjZGVmaW5lIEhXTU9OX0hfTUlOX0hZU1QJCUJJVChod21vbl9odW1pZGl0eV9taW5faHlzdCkKKyNkZWZpbmUgSFdNT05fSF9NQVgJCQlCSVQoaHdtb25faHVtaWRpdHlfbWF4KQorI2RlZmluZSBIV01PTl9IX01BWF9IWVNUCQlCSVQoaHdtb25faHVtaWRpdHlfbWF4X2h5c3QpCisjZGVmaW5lIEhXTU9OX0hfQUxBUk0JCQlCSVQoaHdtb25faHVtaWRpdHlfYWxhcm0pCisjZGVmaW5lIEhXTU9OX0hfRkFVTFQJCQlCSVQoaHdtb25faHVtaWRpdHlfZmF1bHQpCisKK2VudW0gaHdtb25fZmFuX2F0dHJpYnV0ZXMgeworCWh3bW9uX2Zhbl9pbnB1dCwKKwlod21vbl9mYW5fbGFiZWwsCisJaHdtb25fZmFuX21pbiwKKwlod21vbl9mYW5fbWF4LAorCWh3bW9uX2Zhbl9kaXYsCisJaHdtb25fZmFuX3B1bHNlcywKKwlod21vbl9mYW5fdGFyZ2V0LAorCWh3bW9uX2Zhbl9hbGFybSwKKwlod21vbl9mYW5fbWluX2FsYXJtLAorCWh3bW9uX2Zhbl9tYXhfYWxhcm0sCisJaHdtb25fZmFuX2ZhdWx0LAorfTsKKworI2RlZmluZSBIV01PTl9GX0lOUFVUCQkJQklUKGh3bW9uX2Zhbl9pbnB1dCkKKyNkZWZpbmUgSFdNT05fRl9MQUJFTAkJCUJJVChod21vbl9mYW5fbGFiZWwpCisjZGVmaW5lIEhXTU9OX0ZfTUlOCQkJQklUKGh3bW9uX2Zhbl9taW4pCisjZGVmaW5lIEhXTU9OX0ZfTUFYCQkJQklUKGh3bW9uX2Zhbl9tYXgpCisjZGVmaW5lIEhXTU9OX0ZfRElWCQkJQklUKGh3bW9uX2Zhbl9kaXYpCisjZGVmaW5lIEhXTU9OX0ZfUFVMU0VTCQkJQklUKGh3bW9uX2Zhbl9wdWxzZXMpCisjZGVmaW5lIEhXTU9OX0ZfVEFSR0VUCQkJQklUKGh3bW9uX2Zhbl90YXJnZXQpCisjZGVmaW5lIEhXTU9OX0ZfQUxBUk0JCQlCSVQoaHdtb25fZmFuX2FsYXJtKQorI2RlZmluZSBIV01PTl9GX01JTl9BTEFSTQkJQklUKGh3bW9uX2Zhbl9taW5fYWxhcm0pCisjZGVmaW5lIEhXTU9OX0ZfTUFYX0FMQVJNCQlCSVQoaHdtb25fZmFuX21heF9hbGFybSkKKyNkZWZpbmUgSFdNT05fRl9GQVVMVAkJCUJJVChod21vbl9mYW5fZmF1bHQpCisKK2VudW0gaHdtb25fcHdtX2F0dHJpYnV0ZXMgeworCWh3bW9uX3B3bV9pbnB1dCwKKwlod21vbl9wd21fZW5hYmxlLAorCWh3bW9uX3B3bV9tb2RlLAorCWh3bW9uX3B3bV9mcmVxLAorfTsKKworI2RlZmluZSBIV01PTl9QV01fSU5QVVQJCQlCSVQoaHdtb25fcHdtX2lucHV0KQorI2RlZmluZSBIV01PTl9QV01fRU5BQkxFCQlCSVQoaHdtb25fcHdtX2VuYWJsZSkKKyNkZWZpbmUgSFdNT05fUFdNX01PREUJCQlCSVQoaHdtb25fcHdtX21vZGUpCisjZGVmaW5lIEhXTU9OX1BXTV9GUkVRCQkJQklUKGh3bW9uX3B3bV9mcmVxKQorCisvKioKKyAqIHN0cnVjdCBod21vbl9vcHMgLSBod21vbiBkZXZpY2Ugb3BlcmF0aW9ucworICogQGlzX3Zpc2libGU6IENhbGxiYWNrIHRvIHJldHVybiBhdHRyaWJ1dGUgdmlzaWJpbGl0eS4gTWFuZGF0b3J5LgorICoJCVBhcmFtZXRlcnMgYXJlOgorICoJCUBjb25zdCB2b2lkICpkcnZkYXRhOgorICoJCQlQb2ludGVyIHRvIGRyaXZlci1wcml2YXRlIGRhdGEgc3RydWN0dXJlIHBhc3NlZAorICoJCQlhcyBhcmd1bWVudCB0byBod21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvKCkuCisgKgkJQHR5cGU6CVNlbnNvciB0eXBlCisgKgkJQGF0dHI6CVNlbnNvciBhdHRyaWJ1dGUKKyAqCQlAY2hhbm5lbDoKKyAqCQkJQ2hhbm5lbCBudW1iZXIKKyAqCQlUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgZmlsZSBwZXJtaXNzaW9ucy4KKyAqCQlJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIDAsIG5vIGF0dHJpYnV0ZSB3aWxsIGJlIGNyZWF0ZWQuCisgKiBAcmVhZDogICAgICAgUmVhZCBjYWxsYmFjay4gT3B0aW9uYWwuIElmIG5vdCBwcm92aWRlZCwgYXR0cmlidXRlcworICoJCXdpbGwgbm90IGJlIHJlYWRhYmxlLgorICoJCVBhcmFtZXRlcnMgYXJlOgorICoJCUBkZXY6CVBvaW50ZXIgdG8gaGFyZHdhcmUgbW9uaXRvcmluZyBkZXZpY2UKKyAqCQlAdHlwZToJU2Vuc29yIHR5cGUKKyAqCQlAYXR0cjoJU2Vuc29yIGF0dHJpYnV0ZQorICoJCUBjaGFubmVsOgorICoJCQlDaGFubmVsIG51bWJlcgorICoJCUB2YWw6CVBvaW50ZXIgdG8gcmV0dXJuZWQgdmFsdWUKKyAqCQlUaGUgZnVuY3Rpb24gcmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIuCisgKiBAd3JpdGU6CVdyaXRlIGNhbGxiYWNrLiBPcHRpb25hbC4gSWYgbm90IHByb3ZpZGVkLCBhdHRyaWJ1dGVzCisgKgkJd2lsbCBub3QgYmUgd3JpdGFibGUuCisgKgkJUGFyYW1ldGVycyBhcmU6CisgKgkJQGRldjoJUG9pbnRlciB0byBoYXJkd2FyZSBtb25pdG9yaW5nIGRldmljZQorICoJCUB0eXBlOglTZW5zb3IgdHlwZQorICoJCUBhdHRyOglTZW5zb3IgYXR0cmlidXRlCisgKgkJQGNoYW5uZWw6CisgKgkJCUNoYW5uZWwgbnVtYmVyCisgKgkJQHZhbDoJVmFsdWUgdG8gd3JpdGUKKyAqCQlUaGUgZnVuY3Rpb24gcmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIuCisgKi8KK3N0cnVjdCBod21vbl9vcHMgeworCXVtb2RlX3QgKCppc192aXNpYmxlKShjb25zdCB2b2lkICpkcnZkYXRhLCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkJICAgICAgdTMyIGF0dHIsIGludCBjaGFubmVsKTsKKwlpbnQgKCpyZWFkKShzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCSAgICB1MzIgYXR0ciwgaW50IGNoYW5uZWwsIGxvbmcgKnZhbCk7CisJaW50ICgqd3JpdGUpKHN0cnVjdCBkZXZpY2UgKmRldiwgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJICAgICB1MzIgYXR0ciwgaW50IGNoYW5uZWwsIGxvbmcgdmFsKTsKK307CisKKy8qKgorICogQ2hhbm5lbCBpbmZvcm1hdGlvbgorICogQHR5cGU6CUNoYW5uZWwgdHlwZS4KKyAqIEBjb25maWc6CVBvaW50ZXIgdG8gTlVMTC10ZXJtaW5hdGVkIGxpc3Qgb2YgY2hhbm5lbCBwYXJhbWV0ZXJzLgorICoJCVVzZSBmb3IgcGVyLWNoYW5uZWwgYXR0cmlidXRlcy4KKyAqLworc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyB7CisJZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZTsKKwljb25zdCB1MzIgKmNvbmZpZzsKK307CisKKy8qKgorICogQ2hpcCBjb25maWd1cmF0aW9uCisgKiBAb3BzOglQb2ludGVyIHRvIGh3bW9uIG9wZXJhdGlvbnMuCisgKiBAaW5mbzoJTnVsbC10ZXJtaW5hdGVkIGxpc3Qgb2YgY2hhbm5lbCBpbmZvcm1hdGlvbi4KKyAqLworc3RydWN0IGh3bW9uX2NoaXBfaW5mbyB7CisJY29uc3Qgc3RydWN0IGh3bW9uX29wcyAqb3BzOworCWNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gKippbmZvOworfTsKKwogc3RydWN0IGRldmljZSAqaHdtb25fZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldik7CiBzdHJ1Y3QgZGV2aWNlICoKIGh3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsCkBAIC0yNiw2ICszNTgsMTYgQEAKIGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqbmFtZSwKIAkJCQkgICAgICAgdm9pZCAqZHJ2ZGF0YSwKIAkJCQkgICAgICAgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqKmdyb3Vwcyk7CitzdHJ1Y3QgZGV2aWNlICoKK2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCWNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRydmRhdGEsCisJCQkJY29uc3Qgc3RydWN0IGh3bW9uX2NoaXBfaW5mbyAqaW5mbywKKwkJCQljb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICoqZ3JvdXBzKTsKK3N0cnVjdCBkZXZpY2UgKgorZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRydmRhdGEsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgaHdtb25fY2hpcF9pbmZvICppbmZvLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqKmdyb3Vwcyk7CiAKIHZvaWQgaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2KTsKIHZvaWQgZGV2bV9od21vbl9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oeXBlcnYuaCBiL2luY2x1ZGUvbGludXgvaHlwZXJ2LmgKaW5kZXggYjEwOTU0YS4uNjgyNDU1NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9oeXBlcnYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2h5cGVydi5oCkBAIC02NzQsNiArNjc0LDExIEBACiAJSFZfU0lHTkFMX1BPTElDWV9FWFBMSUNJVCwKIH07CiAKK2VudW0gaHZfbnVtYV9wb2xpY3kgeworCUhWX0JBTEFOQ0VEID0gMCwKKwlIVl9MT0NBTElaRUQsCit9OworCiBlbnVtIHZtYnVzX2RldmljZV90eXBlIHsKIAlIVl9JREUgPSAwLAogCUhWX1NDU0ksCkBAIC03MDEsOSArNzA2LDYgQEAKIH07CiAKIHN0cnVjdCB2bWJ1c19jaGFubmVsIHsKLQkvKiBVbmlxdWUgY2hhbm5lbCBpZCAqLwotCWludCBpZDsKLQogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdGVudHJ5OwogCiAJc3RydWN0IGh2X2RldmljZSAqZGV2aWNlX29iajsKQEAgLTg1MCw2ICs4NTIsNDMgQEAKIAkgKiByaW5nIGxvY2sgdG8gcHJlc2VydmUgdGhlIGN1cnJlbnQgYmVoYXZpb3IuCiAJICovCiAJYm9vbCBhY3F1aXJlX3JpbmdfbG9jazsKKwkvKgorCSAqIEZvciBwZXJmb3JtYW5jZSBjcml0aWNhbCBjaGFubmVscyAoc3RvcmFnZSwgbmV0d29ya2luZworCSAqIGV0YywpLCBIeXBlci1WIGhhcyBhIG1lY2hhbmlzbSB0byBlbmhhbmNlIHRoZSB0aHJvdWdocHV0CisJICogYXQgdGhlIGV4cGVuc2Ugb2YgbGF0ZW5jeToKKwkgKiBXaGVuIHRoZSBob3N0IGlzIHRvIGJlIHNpZ25hbGVkLCB3ZSBqdXN0IHNldCBhIGJpdCBpbiBhIHNoYXJlZCBwYWdlCisJICogYW5kIHRoaXMgYml0IHdpbGwgYmUgaW5zcGVjdGVkIGJ5IHRoZSBoeXBlcnZpc29yIHdpdGhpbiBhIGNlcnRhaW4KKwkgKiB3aW5kb3cgYW5kIGlmIHRoZSBiaXQgaXMgc2V0LCB0aGUgaG9zdCB3aWxsIGJlIHNpZ25hbGVkLiBUaGUgd2luZG93CisJICogb2YgdGltZSBpcyB0aGUgbW9uaXRvciBsYXRlbmN5IC0gY3VycmVudGx5IGFyb3VuZCAxMDAgdXNlY3MuIFRoaXMKKwkgKiBtZWNoYW5pc20gaW1wcm92ZXMgdGhyb3VnaHB1dCBieToKKwkgKgorCSAqIEEpIE1ha2luZyB0aGUgaG9zdCBtb3JlIGVmZmljaWVudCAtIGVhY2ggdGltZSBpdCB3YWtlcyB1cCwKKwkgKiAgICBwb3RlbnRpYWxseSBpdCB3aWxsIHByb2Nlc3MgbW9yZXYgbnVtYmVyIG9mIHBhY2tldHMuIFRoZQorCSAqICAgIG1vbml0b3IgbGF0ZW5jeSBhbGxvd3MgYSBiYXRjaCB0byBidWlsZCB1cC4KKwkgKiBCKSBCeSBkZWZlcnJpbmcgdGhlIGh5cGVyY2FsbCB0byBzaWduYWwsIHdlIHdpbGwgYWxzbyBtaW5pbWl6ZQorCSAqICAgIHRoZSBpbnRlcnJ1cHRzLgorCSAqCisJICogQ2xlYXJseSwgdGhlc2Ugb3B0aW1pemF0aW9ucyBpbXByb3ZlIHRocm91Z2hwdXQgYXQgdGhlIGV4cGVuc2Ugb2YKKwkgKiBsYXRlbmN5LiBGdXJ0aGVybW9yZSwgc2luY2UgdGhlIGNoYW5uZWwgaXMgc2hhcmVkIGZvciBib3RoCisJICogY29udHJvbCBhbmQgZGF0YSBtZXNzYWdlcywgY29udHJvbCBtZXNzYWdlcyBjdXJyZW50bHkgc3VmZmVyCisJICogdW5uZWNlc3NhcnkgbGF0ZW5jeSBhZHZlcnNsZXkgaW1wYWN0aW5nIHBlcmZvcm1hbmNlIGFuZCBib290CisJICogdGltZS4gVG8gZml4IHRoaXMgaXNzdWUsIHBlcm1pdCB0YWdnaW5nIHRoZSBjaGFubmVsIGFzIGJlaW5nCisJICogaW4gImxvdyBsYXRlbmN5IiBtb2RlLiBJbiB0aGlzIG1vZGUsIHdlIHdpbGwgYnlwYXNzIHRoZSBtb25pdG9yCisJICogbWVjaGFuaXNtLgorCSAqLworCWJvb2wgbG93X2xhdGVuY3k7CisKKwkvKgorCSAqIE5VTUEgZGlzdHJpYnV0aW9uIHBvbGljeToKKwkgKiBXZSBzdXBwb3J0IHRlbyBwb2xpY2llczoKKwkgKiAxKSBCYWxhbmNlZDogSGVyZSBhbGwgcGVyZm9ybWFuY2UgY3JpdGljYWwgY2hhbm5lbHMgYXJlCisJICogICAgZGlzdHJpYnV0ZWQgZXZlbmx5IGFtb25nc3QgYWxsIHRoZSBOVU1BIG5vZGVzLgorCSAqICAgIFRoaXMgcG9saWN5IHdpbGwgYmUgdGhlIGRlZmF1bHQgcG9saWN5LgorCSAqIDIpIExvY2FsaXplZDogQWxsIGNoYW5uZWxzIG9mIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgYQorCSAqICAgIHBlcmZvcm1hbmNlIGNyaXRpY2FsIHNlcnZpY2Ugd2lsbCBiZSBhc3NpZ25lZCBDUFVzCisJICogICAgd2l0aGluIGEgc2VsZWN0ZWQgTlVNQSBub2RlLgorCSAqLworCWVudW0gaHZfbnVtYV9wb2xpY3kgYWZmaW5pdHlfcG9saWN5OwogCiB9OwogCkBAIC04NzAsNiArOTA5LDEyIEBACiAJYy0+c2lnbmFsX3BvbGljeSA9IHBvbGljeTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHNldF9jaGFubmVsX2FmZmluaXR5X3N0YXRlKHN0cnVjdCB2bWJ1c19jaGFubmVsICpjLAorCQkJCQkgICAgICBlbnVtIGh2X251bWFfcG9saWN5IHBvbGljeSkKK3sKKwljLT5hZmZpbml0eV9wb2xpY3kgPSBwb2xpY3k7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY2hhbm5lbF9yZWFkX3N0YXRlKHN0cnVjdCB2bWJ1c19jaGFubmVsICpjLCBib29sIHN0YXRlKQogewogCWMtPmJhdGNoZWRfcmVhZGluZyA9IHN0YXRlOwpAQCAtODkxLDYgKzkzNiwxNiBAQAogCWMtPm91dGJvdW5kLnJpbmdfYnVmZmVyLT5wZW5kaW5nX3NlbmRfc3ogPSBzaXplOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2xvd19sYXRlbmN5X21vZGUoc3RydWN0IHZtYnVzX2NoYW5uZWwgKmMpCit7CisJYy0+bG93X2xhdGVuY3kgPSB0cnVlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfbG93X2xhdGVuY3lfbW9kZShzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqYykKK3sKKwljLT5sb3dfbGF0ZW5jeSA9IGZhbHNlOworfQorCiB2b2lkIHZtYnVzX29ubWVzc2FnZSh2b2lkICpjb250ZXh0KTsKIAogaW50IHZtYnVzX3JlcXVlc3Rfb2ZmZXJzKHZvaWQpOwpAQCAtMTExNCw2ICsxMTY5LDEzIEBACiAJCQkJCSBjb25zdCBjaGFyICptb2RfbmFtZSk7CiB2b2lkIHZtYnVzX2RyaXZlcl91bnJlZ2lzdGVyKHN0cnVjdCBodl9kcml2ZXIgKmh2X2RyaXZlcik7CiAKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqdm1idXNfZGV2X25hbWUoY29uc3Qgc3RydWN0IGh2X2RldmljZSAqZGV2aWNlX29iaikKK3sKKwljb25zdCBzdHJ1Y3Qga29iamVjdCAqa29iaiA9ICZkZXZpY2Vfb2JqLT5kZXZpY2Uua29iajsKKworCXJldHVybiBrb2JqLT5uYW1lOworfQorCiB2b2lkIHZtYnVzX2h2c29ja19kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCk7CiAKIGludCB2bWJ1c19hbGxvY2F0ZV9tbWlvKHN0cnVjdCByZXNvdXJjZSAqKm5ldywgc3RydWN0IGh2X2RldmljZSAqZGV2aWNlX29iaiwKQEAgLTEyNTcsNiArMTMxOSwyNyBAQAogCQkJMHg4MCwgMHgyZSwgMHgyNywgMHhlZCwgMHhlMSwgMHg5ZikKIAogLyoKKyAqIExpbnV4IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgMyBkZXZpY2VzOiB0aGUgZmlyc3QgdHdvIGFyZSBmb3IKKyAqIEF1dG9tYXRpYyBWaXJ0dWFsIE1hY2hpbmUgQWN0aXZhdGlvbiwgYW5kIHRoZSB0aGlyZCBpcyBmb3IKKyAqIFJlbW90ZSBEZXNrdG9wIFZpcnR1YWxpemF0aW9uLgorICoge2Y4ZTY1NzE2LTNjYjMtNGEwNi05YTYwLTE4ODljNWNjY2FiNX0KKyAqIHszMzc1YmFmNC05ZTE1LTRiMzAtYjc2NS02N2FjYjEwZDYwN2J9CisgKiB7Mjc2YWFjZjQtYWMxNS00MjZjLTk4ZGQtNzUyMWFkM2YwMWZlfQorICovCisKKyNkZWZpbmUgSFZfQVZNQTFfR1VJRCBcCisJLmd1aWQgPSBVVUlEX0xFKDB4ZjhlNjU3MTYsIDB4M2NiMywgMHg0YTA2LCAweDlhLCAweDYwLCBcCisJCQkweDE4LCAweDg5LCAweGM1LCAweGNjLCAweGNhLCAweGI1KQorCisjZGVmaW5lIEhWX0FWTUEyX0dVSUQgXAorCS5ndWlkID0gVVVJRF9MRSgweDMzNzViYWY0LCAweDllMTUsIDB4NGIzMCwgMHhiNywgMHg2NSwgXAorCQkJMHg2NywgMHhhYywgMHhiMSwgMHgwZCwgMHg2MCwgMHg3YikKKworI2RlZmluZSBIVl9SRFZfR1VJRCBcCisJLmd1aWQgPSBVVUlEX0xFKDB4Mjc2YWFjZjQsIDB4YWMxNSwgMHg0MjZjLCAweDk4LCAweGRkLCBcCisJCQkweDc1LCAweDIxLCAweGFkLCAweDNmLCAweDAxLCAweGZlKQorCisvKgogICogQ29tbW9uIGhlYWRlciBmb3IgSHlwZXItViBJQ3MKICAqLwogCkBAIC0xMzQ0LDYgKzE0MjcsMTUgQEAKIAl1OCBmbGFnczsKIH0gX19wYWNrZWQ7CiAKK3N0cnVjdCBpY3RpbWVzeW5jX3JlZl9kYXRhIHsKKwl1NjQgcGFyZW50dGltZTsKKwl1NjQgdm1yZWZlcmVuY2V0aW1lOworCXU4IGZsYWdzOworCWNoYXIgbGVhcGZsYWdzOworCWNoYXIgc3RyYXR1bTsKKwl1OCByZXNlcnZlZFszXTsKK30gX19wYWNrZWQ7CisKIHN0cnVjdCBoeXBlcnZfc2VydmljZV9jYWxsYmFjayB7CiAJdTggbXNnX3R5cGU7CiAJY2hhciAqbG9nX21zZzsKQEAgLTEzNTcsNiArMTQ0OSw5IEBACiAJCQkJCXN0cnVjdCBpY21zZ19uZWdvdGlhdGUgKiwgdTggKiwgaW50LAogCQkJCQlpbnQpOwogCit2b2lkIGh2X2V2ZW50X3Rhc2tsZXRfZGlzYWJsZShzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCk7Cit2b2lkIGh2X2V2ZW50X3Rhc2tsZXRfZW5hYmxlKHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsKTsKKwogdm9pZCBodl9wcm9jZXNzX2NoYW5uZWxfcmVtb3ZhbChzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHJlbGlkKTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHlwZXJ2aXNvci5oIGIvaW5jbHVkZS9saW51eC9oeXBlcnZpc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhNWVmMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvaHlwZXJ2aXNvci5oCkBAIC0wLDAgKzEsMTcgQEAKKyNpZm5kZWYgX19MSU5VWF9IWVBFVklTT1JfSAorI2RlZmluZSBfX0xJTlVYX0hZUEVWSVNPUl9ICisKKy8qCisgKglHZW5lcmljIEh5cGVydmlzb3Igc3VwcG9ydAorICoJCUp1ZXJnZW4gR3Jvc3MgPGpncm9zc0BzdXNlLmNvbT4KKyAqLworCisjaWZkZWYgQ09ORklHX0hZUEVSVklTT1JfR1VFU1QKKyNpbmNsdWRlIDxhc20vaHlwZXJ2aXNvci5oPgorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBoeXBlcnZpc29yX3Bpbl92Y3B1KGludCBjcHUpCit7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fTElOVVhfSFlQRVZJU09SX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfYnJpZGdlLmggYi9pbmNsdWRlL2xpbnV4L2lmX2JyaWRnZS5oCmluZGV4IGRjYjg5ZTMuLmM2NTg3YzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfYnJpZGdlLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl9icmlkZ2UuaApAQCAtNDUsNiArNDUsNyBAQAogI2RlZmluZSBCUl9QUk9YWUFSUAkJQklUKDgpCiAjZGVmaW5lIEJSX0xFQVJOSU5HX1NZTkMJQklUKDkpCiAjZGVmaW5lIEJSX1BST1hZQVJQX1dJRkkJQklUKDEwKQorI2RlZmluZSBCUl9NQ0FTVF9GTE9PRAkJQklUKDExKQogCiAjZGVmaW5lIEJSX0RFRkFVTFRfQUdFSU5HX1RJTUUJKDMwMCAqIEhaKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX2xpbmsuaCBiL2luY2x1ZGUvbGludXgvaWZfbGluay5oCmluZGV4IGY5MjNkMTUuLjBiMTdjNTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfbGluay5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfbGluay5oCkBAIC0yNSw1ICsyNSw2IEBACiAJX191MzIgbWF4X3R4X3JhdGU7CiAJX191MzIgcnNzX3F1ZXJ5X2VuOwogCV9fdTMyIHRydXN0ZWQ7CisJX19iZTE2IHZsYW5fcHJvdG87CiB9OwogI2VuZGlmIC8qIF9MSU5VWF9JRl9MSU5LX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfdmxhbi5oIGIvaW5jbHVkZS9saW51eC9pZl92bGFuLmgKaW5kZXggYTVmNmNlNi4uMzMxOWQ5NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl92bGFuLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl92bGFuLmgKQEAgLTgxLDYgKzgxLDcgQEAKICNkZWZpbmUgc2tiX3ZsYW5fdGFnX3ByZXNlbnQoX19za2IpCSgoX19za2IpLT52bGFuX3RjaSAmIFZMQU5fVEFHX1BSRVNFTlQpCiAjZGVmaW5lIHNrYl92bGFuX3RhZ19nZXQoX19za2IpCQkoKF9fc2tiKS0+dmxhbl90Y2kgJiB+VkxBTl9UQUdfUFJFU0VOVCkKICNkZWZpbmUgc2tiX3ZsYW5fdGFnX2dldF9pZChfX3NrYikJKChfX3NrYiktPnZsYW5fdGNpICYgVkxBTl9WSURfTUFTSykKKyNkZWZpbmUgc2tiX3ZsYW5fdGFnX2dldF9wcmlvKF9fc2tiKQkoKF9fc2tiKS0+dmxhbl90Y2kgJiBWTEFOX1BSSU9fTUFTSykKIAogLyoqCiAgKglzdHJ1Y3Qgdmxhbl9wY3B1X3N0YXRzIC0gVkxBTiBwZXJjcHUgcngvdHggc3RhdHMKQEAgLTI3MSw2ICsyNzIsMjMgQEAKIH0KICNlbmRpZgogCisvKioKKyAqIGV0aF90eXBlX3ZsYW4gLSBjaGVjayBmb3IgdmFsaWQgdmxhbiBldGhlciB0eXBlLgorICogQGV0aGVydHlwZTogZXRoZXIgdHlwZSB0byBjaGVjaworICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZXRoZXIgdHlwZSBpcyBhIHZsYW4gZXRoZXIgdHlwZS4KKyAqLworc3RhdGljIGlubGluZSBib29sIGV0aF90eXBlX3ZsYW4oX19iZTE2IGV0aGVydHlwZSkKK3sKKwlzd2l0Y2ggKGV0aGVydHlwZSkgeworCWNhc2UgaHRvbnMoRVRIX1BfODAyMVEpOgorCWNhc2UgaHRvbnMoRVRIX1BfODAyMUFEKToKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKwogc3RhdGljIGlubGluZSBib29sIHZsYW5faHdfb2ZmbG9hZF9jYXBhYmxlKG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzLAogCQkJCQkgICBfX2JlMTYgcHJvdG8pCiB7CkBAIC00MjQsOCArNDQyLDcgQEAKIHsKIAlzdHJ1Y3Qgdmxhbl9ldGhoZHIgKnZldGggPSAoc3RydWN0IHZsYW5fZXRoaGRyICopc2tiLT5kYXRhOwogCi0JaWYgKHZldGgtPmhfdmxhbl9wcm90byAhPSBodG9ucyhFVEhfUF84MDIxUSkgJiYKLQkgICAgdmV0aC0+aF92bGFuX3Byb3RvICE9IGh0b25zKEVUSF9QXzgwMjFBRCkpCisJaWYgKCFldGhfdHlwZV92bGFuKHZldGgtPmhfdmxhbl9wcm90bykpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJKnZsYW5fdGNpID0gbnRvaHModmV0aC0+aF92bGFuX1RDSSk7CkBAIC00ODcsNyArNTA0LDcgQEAKIAkgKiBwcmVzZW50IGF0IG1hY19sZW4gLSBWTEFOX0hMRU4gKGlmIG1hY19sZW4gPiAwKSwgb3IgYXQKIAkgKiBFVEhfSExFTiBvdGhlcndpc2UKIAkgKi8KLQlpZiAodHlwZSA9PSBodG9ucyhFVEhfUF84MDIxUSkgfHwgdHlwZSA9PSBodG9ucyhFVEhfUF84MDIxQUQpKSB7CisJaWYgKGV0aF90eXBlX3ZsYW4odHlwZSkpIHsKIAkJaWYgKHZsYW5fZGVwdGgpIHsKIAkJCWlmIChXQVJOX09OKHZsYW5fZGVwdGggPCBWTEFOX0hMRU4pKQogCQkJCXJldHVybiAwOwpAQCAtNTA1LDggKzUyMiw3IEBACiAJCQl2aCA9IChzdHJ1Y3Qgdmxhbl9oZHIgKikoc2tiLT5kYXRhICsgdmxhbl9kZXB0aCk7CiAJCQl0eXBlID0gdmgtPmhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG87CiAJCQl2bGFuX2RlcHRoICs9IFZMQU5fSExFTjsKLQkJfSB3aGlsZSAodHlwZSA9PSBodG9ucyhFVEhfUF84MDIxUSkgfHwKLQkJCSB0eXBlID09IGh0b25zKEVUSF9QXzgwMjFBRCkpOworCQl9IHdoaWxlIChldGhfdHlwZV92bGFuKHR5cGUpKTsKIAl9CiAKIAlpZiAoZGVwdGgpCkBAIC01NzEsOCArNTg3LDcgQEAKIHN0YXRpYyBpbmxpbmUgYm9vbCBza2Jfdmxhbl90YWdnZWQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpZiAoIXNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikgJiYKLQkgICAgbGlrZWx5KHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfODAyMVEpICYmCi0JCSAgIHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfODAyMUFEKSkpCisJICAgIGxpa2VseSghZXRoX3R5cGVfdmxhbihza2ItPnByb3RvY29sKSkpCiAJCXJldHVybiBmYWxzZTsKIAogCXJldHVybiB0cnVlOwpAQCAtNTkyLDE1ICs2MDcsMTQgQEAKIAlpZiAoIXNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikpIHsKIAkJc3RydWN0IHZsYW5fZXRoaGRyICp2ZWg7CiAKLQkJaWYgKGxpa2VseShwcm90b2NvbCAhPSBodG9ucyhFVEhfUF84MDIxUSkgJiYKLQkJCSAgIHByb3RvY29sICE9IGh0b25zKEVUSF9QXzgwMjFBRCkpKQorCQlpZiAobGlrZWx5KCFldGhfdHlwZV92bGFuKHByb3RvY29sKSkpCiAJCQlyZXR1cm4gZmFsc2U7CiAKIAkJdmVoID0gKHN0cnVjdCB2bGFuX2V0aGhkciAqKXNrYi0+ZGF0YTsKIAkJcHJvdG9jb2wgPSB2ZWgtPmhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG87CiAJfQogCi0JaWYgKHByb3RvY29sICE9IGh0b25zKEVUSF9QXzgwMjFRKSAmJiBwcm90b2NvbCAhPSBodG9ucyhFVEhfUF84MDIxQUQpKQorCWlmICghZXRoX3R5cGVfdmxhbihwcm90b2NvbCkpCiAJCXJldHVybiBmYWxzZTsKIAogCXJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9paW8vY29uc3VtZXIuaCBiL2luY2x1ZGUvbGludXgvaWlvL2NvbnN1bWVyLmgKaW5kZXggM2Q2NzJmNy4uOWVkY2NmYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9paW8vY29uc3VtZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lpby9jb25zdW1lci5oCkBAIC0xNjUsNiArMTY1LDE4IEBACiAqaWlvX2NoYW5uZWxfY2JfZ2V0X2NoYW5uZWxzKGNvbnN0IHN0cnVjdCBpaW9fY2JfYnVmZmVyICpjYl9idWZmZXIpOwogCiAvKioKKyAqIGlpb19jaGFubmVsX2NiX2dldF9paW9fZGV2KCkgLSBnZXQgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIGRldmljZS4KKyAqIEBjYl9idWZmZXI6CQlUaGUgY2FsbGJhY2sgYnVmZmVyIGZyb20gd2hvbSB3ZSB3YW50IHRoZSBkZXZpY2UKKyAqCQkJaW5mb3JtYXRpb24uCisgKgorICogVGhpcyBmdW5jdGlvbiBhbGxvd3Mgb25lIHRvIG9idGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGV2aWNlLgorICogVGhlIHByaW1hcnkgYWltIGlzIHRvIGFsbG93IGRyaXZlcnMgdGhhdCBhcmUgY29uc3VtaW5nIGEgZGV2aWNlIHRvIHF1ZXJ5CisgKiB0aGluZ3MgbGlrZSBjdXJyZW50IHRyaWdnZXIuCisgKi8KK3N0cnVjdCBpaW9fZGV2CisqaWlvX2NoYW5uZWxfY2JfZ2V0X2lpb19kZXYoY29uc3Qgc3RydWN0IGlpb19jYl9idWZmZXIgKmNiX2J1ZmZlcik7CisKKy8qKgogICogaWlvX3JlYWRfY2hhbm5lbF9yYXcoKSAtIHJlYWQgZnJvbSBhIGdpdmVuIGNoYW5uZWwKICAqIEBjaGFuOgkJVGhlIGNoYW5uZWwgYmVpbmcgcXVlcmllZC4KICAqIEB2YWw6CQlWYWx1ZSByZWFkIGJhY2suCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lpby9paW8uaCBiL2luY2x1ZGUvbGludXgvaWlvL2lpby5oCmluZGV4IDg1NGUyZGEuLmI0YTA2NzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWlvL2lpby5oCisrKyBiL2luY2x1ZGUvbGludXgvaWlvL2lpby5oCkBAIC00ODMsNiArNDgzLDcgQEAKICAqIEBzY2FuX3RpbWVzdGFtcDoJW0lOVEVSTl0gc2V0IGlmIGFueSBidWZmZXJzIGhhdmUgcmVxdWVzdGVkIHRpbWVzdGFtcAogICogQHNjYW5faW5kZXhfdGltZXN0YW1wOltJTlRFUk5dIGNhY2hlIG9mIHRoZSBpbmRleCB0byB0aGUgdGltZXN0YW1wCiAgKiBAdHJpZzoJCVtJTlRFUk5dIGN1cnJlbnQgZGV2aWNlIHRyaWdnZXIgKGJ1ZmZlciBtb2RlcykKKyAqIEB0cmlnX3JlYWRvbmx5CVtJTlRFUk5dIG1hcmsgdGhlIGN1cnJlbnQgdHJpZ2dlciBpbW11dGFibGUKICAqIEBwb2xsZnVuYzoJCVtEUklWRVJdIGZ1bmN0aW9uIHJ1biBvbiB0cmlnZ2VyIGJlaW5nIHJlY2VpdmVkCiAgKiBAcG9sbGZ1bmNfZXZlbnQ6CVtEUklWRVJdIGZ1bmN0aW9uIHJ1biBvbiBldmVudHMgdHJpZ2dlciBiZWluZyByZWNlaXZlZAogICogQGNoYW5uZWxzOgkJW0RSSVZFUl0gY2hhbm5lbCBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSB0YWJsZQpAQCAtNTIzLDYgKzUyNCw3IEBACiAJYm9vbAkJCQlzY2FuX3RpbWVzdGFtcDsKIAl1bnNpZ25lZAkJCXNjYW5faW5kZXhfdGltZXN0YW1wOwogCXN0cnVjdCBpaW9fdHJpZ2dlcgkJKnRyaWc7CisJYm9vbAkJCQl0cmlnX3JlYWRvbmx5OwogCXN0cnVjdCBpaW9fcG9sbF9mdW5jCQkqcG9sbGZ1bmM7CiAJc3RydWN0IGlpb19wb2xsX2Z1bmMJCSpwb2xsZnVuY19ldmVudDsKIApAQCAtNjQyLDYgKzY0NCw3IEBACiB9CiAKIHZvaWQgaWlvX2RldmljZV9mcmVlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworaW50IGRldm1faWlvX2RldmljZV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnJlcywgdm9pZCAqZGF0YSk7CiBzdHJ1Y3QgaWlvX2RldiAqZGV2bV9paW9fZGV2aWNlX2FsbG9jKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHNpemVvZl9wcml2KTsKIHZvaWQgZGV2bV9paW9fZGV2aWNlX2ZyZWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIHN0cnVjdCBpaW9fdHJpZ2dlciAqZGV2bV9paW9fdHJpZ2dlcl9hbGxvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lpby9zd190cmlnZ2VyLmggYi9pbmNsdWRlL2xpbnV4L2lpby9zd190cmlnZ2VyLmgKaW5kZXggNTE5OGY4ZS4uYzk3ZWFiNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9paW8vc3dfdHJpZ2dlci5oCisrKyBiL2luY2x1ZGUvbGludXgvaWlvL3N3X3RyaWdnZXIuaApAQCAtNjIsNyArNjIsNyBAQAogCQkJCSAgY29uc3QgY2hhciAqbmFtZSwKIAkJCQkgIHN0cnVjdCBjb25maWdfaXRlbV90eXBlICp0eXBlKQogewotI2lmZGVmIENPTkZJR19DT05GSUdGU19GUworI2lmIElTX0VOQUJMRUQoQ09ORklHX0NPTkZJR0ZTX0ZTKQogCWNvbmZpZ19ncm91cF9pbml0X3R5cGVfbmFtZSgmdC0+Z3JvdXAsIG5hbWUsIHR5cGUpOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lpby90cmlnZ2VyLmggYi9pbmNsdWRlL2xpbnV4L2lpby90cmlnZ2VyLmgKaW5kZXggMWM5ZTAyOC4uNGYxMTU0ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9paW8vdHJpZ2dlci5oCisrKyBiL2luY2x1ZGUvbGludXgvaWlvL3RyaWdnZXIuaApAQCAtNTYsNiArNTYsOSBAQAogICogQHN1YmlycXM6CQlbSU5URVJOXSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgJ2NoaWxkJyBpcnFzLgogICogQHBvb2w6CQlbSU5URVJOXSBiaXRtYXAgb2YgaXJxcyBjdXJyZW50bHkgaW4gdXNlLgogICogQHBvb2xfbG9jazoJCVtJTlRFUk5dIHByb3RlY3Rpb24gb2YgdGhlIGlycSBwb29sLgorICogQGF0dGFjaGVkX293bl9kZXZpY2U6W0lOVEVSTl0gaWYgd2UgYXJlIHVzaW5nIG91ciBvd24gZGV2aWNlIGFzIHRyaWdnZXIsCisgKgkJCWkuZS4gaWYgd2UgcmVnaXN0ZXJlZCBhIHBvbGwgZnVuY3Rpb24gdG8gdGhlIHNhbWUKKyAqCQkJZGV2aWNlIGFzIHRoZSBvbmUgcHJvdmlkaW5nIHRoZSB0cmlnZ2VyLgogICoqLwogc3RydWN0IGlpb190cmlnZ2VyIHsKIAljb25zdCBzdHJ1Y3QgaWlvX3RyaWdnZXJfb3BzCSpvcHM7CkBAIC03Myw2ICs3Niw3IEBACiAJc3RydWN0IGlpb19zdWJpcnEgc3ViaXJxc1tDT05GSUdfSUlPX0NPTlNVTUVSU19QRVJfVFJJR0dFUl07CiAJdW5zaWduZWQgbG9uZyBwb29sW0JJVFNfVE9fTE9OR1MoQ09ORklHX0lJT19DT05TVU1FUlNfUEVSX1RSSUdHRVIpXTsKIAlzdHJ1Y3QgbXV0ZXgJCQlwb29sX2xvY2s7CisJYm9vbAkJCQlhdHRhY2hlZF9vd25fZGV2aWNlOwogfTsKIAogCkBAIC0xMjUsMTIgKzEyOSwyNyBAQAogICoqLwogaW50IGlpb190cmlnZ2VyX3JlZ2lzdGVyKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZ19pbmZvKTsKIAoraW50IGRldm1faWlvX3RyaWdnZXJfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGlpb190cmlnZ2VyICp0cmlnX2luZm8pOworCiAvKioKICAqIGlpb190cmlnZ2VyX3VucmVnaXN0ZXIoKSAtIHVucmVnaXN0ZXIgYSB0cmlnZ2VyIGZyb20gdGhlIGNvcmUKICAqIEB0cmlnX2luZm86CXRyaWdnZXIgdG8gYmUgdW5yZWdpc3RlcmVkCiAgKiovCiB2b2lkIGlpb190cmlnZ2VyX3VucmVnaXN0ZXIoc3RydWN0IGlpb190cmlnZ2VyICp0cmlnX2luZm8pOwogCit2b2lkIGRldm1faWlvX3RyaWdnZXJfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZ19pbmZvKTsKKworLyoqCisgKiBpaW9fdHJpZ2dlcl9zZXRfaW1tdXRhYmxlKCkgLSBzZXQgYW4gaW1tdXRhYmxlIHRyaWdnZXIgb24gZGVzdGluYXRpb24KKyAqCisgKiBAaW5kaW9fZGV2IC0gSUlPIGRldmljZSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgZGV2aWNlCisgKiBAdHJpZyAtIHRyaWdnZXIgdG8gYXNzaWduIHRvIGRldmljZQorICoKKyAqKi8KK2ludCBpaW9fdHJpZ2dlcl9zZXRfaW1tdXRhYmxlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZyk7CisKIC8qKgogICogaWlvX3RyaWdnZXJfcG9sbCgpIC0gY2FsbGVkIG9uIGEgdHJpZ2dlciBvY2N1cnJpbmcKICAqIEB0cmlnOgl0cmlnZ2VyIHdoaWNoIG9jY3VycmVkCkBAIC0xNDUsNiArMTY0LDEzIEBACiBfX3ByaW50ZigxLCAyKSBzdHJ1Y3QgaWlvX3RyaWdnZXIgKmlpb190cmlnZ2VyX2FsbG9jKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIHZvaWQgaWlvX3RyaWdnZXJfZnJlZShzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcpOwogCisvKioKKyAqIGlpb190cmlnZ2VyX3VzaW5nX293bigpIC0gdGVsbHMgdXMgaWYgd2UgdXNlIG91ciBvd24gSFcgdHJpZ2dlciBvdXJzZWx2ZXMKKyAqIEBpbmRpb19kZXY6ICBkZXZpY2UgdG8gY2hlY2sKKyAqLworYm9vbCBpaW9fdHJpZ2dlcl91c2luZ19vd24oc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKKwogI2Vsc2UKIHN0cnVjdCBpaW9fdHJpZ2dlcjsKIHN0cnVjdCBpaW9fdHJpZ2dlcl9vcHM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lpby90cmlnZ2VyZWRfYnVmZmVyLmggYi9pbmNsdWRlL2xpbnV4L2lpby90cmlnZ2VyZWRfYnVmZmVyLmgKaW5kZXggZjcyZjcwZC4uMzAxNDU2MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9paW8vdHJpZ2dlcmVkX2J1ZmZlci5oCisrKyBiL2luY2x1ZGUvbGludXgvaWlvL3RyaWdnZXJlZF9idWZmZXIuaApAQCAtMTIsNCArMTIsMTIgQEAKIAljb25zdCBzdHJ1Y3QgaWlvX2J1ZmZlcl9zZXR1cF9vcHMgKnNldHVwX29wcyk7CiB2b2lkIGlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiAKK2ludCBkZXZtX2lpb190cmlnZ2VyZWRfYnVmZmVyX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCQkgICAgaXJxcmV0dXJuX3QgKCpoKShpbnQgaXJxLCB2b2lkICpwKSwKKwkJCQkgICAgaXJxcmV0dXJuX3QgKCp0aHJlYWQpKGludCBpcnEsIHZvaWQgKnApLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgaWlvX2J1ZmZlcl9zZXR1cF9vcHMgKm9wcyk7Cit2b2lkIGRldm1faWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5ldF9kaWFnLmggYi9pbmNsdWRlL2xpbnV4L2luZXRfZGlhZy5oCmluZGV4IGZlYjA0ZWEuLjY1ZGE0MzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5ldF9kaWFnLmgKKysrIGIvaW5jbHVkZS9saW51eC9pbmV0X2RpYWcuaApAQCAtMzcsNyArMzcsNyBAQAogCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiAqcmVxLAogCQkgICAgICBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnVzZXJfbnMsCiAJCSAgICAgIHUzMiBwaWQsIHUzMiBzZXEsIHUxNiBubG1zZ19mbGFncywKLQkJICAgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICp1bmxoKTsKKwkJICAgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICp1bmxoLCBib29sIG5ldF9hZG1pbik7CiB2b2lkIGluZXRfZGlhZ19kdW1wX2ljc2soc3RydWN0IGluZXRfaGFzaGluZm8gKmgsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAogCQkJIGNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyLApAQCAtNTYsNyArNTYsNyBAQAogCiBpbnQgaW5ldF9kaWFnX21zZ19hdHRyc19maWxsKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgc3RydWN0IGluZXRfZGlhZ19tc2cgKnIsIGludCBleHQsCi0JCQkgICAgIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdXNlcl9ucyk7CisJCQkgICAgIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdXNlcl9ucywgYm9vbCBuZXRfYWRtaW4pOwogCiBleHRlcm4gaW50ICBpbmV0X2RpYWdfcmVnaXN0ZXIoY29uc3Qgc3RydWN0IGluZXRfZGlhZ19oYW5kbGVyICpoYW5kbGVyKTsKIGV4dGVybiB2b2lkIGluZXRfZGlhZ191bnJlZ2lzdGVyKGNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfaGFuZGxlciAqaGFuZGxlcik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oIGIvaW5jbHVkZS9saW51eC9pbml0X3Rhc2suaAppbmRleCBmODgzNGY4Li4zMjVmNjQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oCisrKyBiL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmgKQEAgLTE1LDYgKzE1LDggQEAKICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkL3J0Lmg+CiAKKyNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KKwogI2lmZGVmIENPTkZJR19TTVAKICMgZGVmaW5lIElOSVRfUFVTSEFCTEVfVEFTS1ModHNrKQkJCQkJXAogCS5wdXNoYWJsZV90YXNrcyA9IFBMSVNUX05PREVfSU5JVCh0c2sucHVzaGFibGVfdGFza3MsIE1BWF9QUklPKSwKQEAgLTE4MywxMiArMTg1LDIxIEBACiAjIGRlZmluZSBJTklUX0tBU0FOKHRzaykKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1RIUkVBRF9JTkZPX0lOX1RBU0sKKyMgZGVmaW5lIElOSVRfVEFTS19USSh0c2spCQkJXAorCS50aHJlYWRfaW5mbyA9IElOSVRfVEhSRUFEX0lORk8odHNrKSwJXAorCS5zdGFja19yZWZjb3VudCA9IEFUT01JQ19JTklUKDEpLAorI2Vsc2UKKyMgZGVmaW5lIElOSVRfVEFTS19USSh0c2spCisjZW5kaWYKKwogLyoKICAqICBJTklUX1RBU0sgaXMgdXNlZCB0byBzZXQgdXAgdGhlIGZpcnN0IHRhc2sgdGFibGUsIHRvdWNoIGF0CiAgKiB5b3VyIG93biByaXNrIS4gQmFzZT0wLCBsaW1pdD0weDFmZmZmZiAoPTJNQikKICAqLwogI2RlZmluZSBJTklUX1RBU0sodHNrKQlcCiB7CQkJCQkJCQkJXAorCUlOSVRfVEFTS19USSh0c2spCQkJCQkJXAogCS5zdGF0ZQkJPSAwLAkJCQkJCVwKIAkuc3RhY2sJCT0gaW5pdF9zdGFjaywJCQkJCVwKIAkudXNhZ2UJCT0gQVRPTUlDX0lOSVQoMiksCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmggYi9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCmluZGV4IGI2NjgzZjAuLjcyZjA3MjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaApAQCAtMjc4LDcgKzI3OCw4IEBACiBleHRlcm4gaW50CiBpcnFfc2V0X2FmZmluaXR5X25vdGlmaWVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfYWZmaW5pdHlfbm90aWZ5ICpub3RpZnkpOwogCi1zdHJ1Y3QgY3B1bWFzayAqaXJxX2NyZWF0ZV9hZmZpbml0eV9tYXNrKHVuc2lnbmVkIGludCAqbnJfdmVjcyk7CitzdHJ1Y3QgY3B1bWFzayAqaXJxX2NyZWF0ZV9hZmZpbml0eV9tYXNrcyhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqYWZmaW5pdHksIGludCBudmVjKTsKK2ludCBpcnFfY2FsY19hZmZpbml0eV92ZWN0b3JzKGNvbnN0IHN0cnVjdCBjcHVtYXNrICphZmZpbml0eSwgaW50IG1heHZlYyk7CiAKICNlbHNlIC8qIENPTkZJR19TTVAgKi8KIApAQCAtMzExLDExICszMTIsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgY3B1bWFzayAqaXJxX2NyZWF0ZV9hZmZpbml0eV9tYXNrKHVuc2lnbmVkIGludCAqbnJfdmVjcykKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNwdW1hc2sgKgoraXJxX2NyZWF0ZV9hZmZpbml0eV9tYXNrcyhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqYWZmaW5pdHksIGludCBudmVjKQogewotCSpucl92ZWNzID0gMTsKIAlyZXR1cm4gTlVMTDsKIH0KKworc3RhdGljIGlubGluZSBpbnQKK2lycV9jYWxjX2FmZmluaXR5X3ZlY3RvcnMoY29uc3Qgc3RydWN0IGNwdW1hc2sgKmFmZmluaXR5LCBpbnQgbWF4dmVjKQoreworCXJldHVybiBtYXh2ZWM7Cit9CisKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lvbWFwLmggYi9pbmNsdWRlL2xpbnV4L2lvbWFwLmgKaW5kZXggMzI2N2RmNC4uZTYzZTI4OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pb21hcC5oCisrKyBiL2luY2x1ZGUvbGludXgvaW9tYXAuaApAQCAtMTksNiArMTksMTMgQEAKICNkZWZpbmUgSU9NQVBfVU5XUklUVEVOCTB4MDQJLyogYmxvY2tzIGFsbG9jYXRlZCBAYmxrbm8gaW4gdW53cml0dGVuIHN0YXRlICovCiAKIC8qCisgKiBGbGFncyBmb3IgaW9tYXAgbWFwcGluZ3M6CisgKi8KKyNkZWZpbmUgSU9NQVBfRl9NRVJHRUQJMHgwMQkvKiBjb250YWlucyBtdWx0aXBsZSBibG9ja3MvZXh0ZW50cyAqLworI2RlZmluZSBJT01BUF9GX1NIQVJFRAkweDAyCS8qIGJsb2NrIHNoYXJlZCB3aXRoIGFub3RoZXIgZmlsZSAqLworI2RlZmluZSBJT01BUF9GX05FVwkweDA0CS8qIGJsb2NrcyBoYXZlIGJlZW4gbmV3bHkgYWxsb2NhdGVkICovCisKKy8qCiAgKiBNYWdpYyB2YWx1ZSBmb3IgYmxrbm86CiAgKi8KICNkZWZpbmUgSU9NQVBfTlVMTF9CTE9DSyAtMUxMCS8qIGJsa25vIGlzIG5vdCB2YWxpZCAqLwpAQCAtMjcsNyArMzQsOCBAQAogCXNlY3Rvcl90CQlibGtubzsJLyogMXN0IHNlY3RvciBvZiBtYXBwaW5nLCA1MTJiIHVuaXRzICovCiAJbG9mZl90CQkJb2Zmc2V0OwkvKiBmaWxlIG9mZnNldCBvZiBtYXBwaW5nLCBieXRlcyAqLwogCXU2NAkJCWxlbmd0aDsJLyogbGVuZ3RoIG9mIG1hcHBpbmcsIGJ5dGVzICovCi0JaW50CQkJdHlwZTsJLyogdHlwZSBvZiBtYXBwaW5nICovCisJdTE2CQkJdHlwZTsJLyogdHlwZSBvZiBtYXBwaW5nICovCisJdTE2CQkJZmxhZ3M7CS8qIGZsYWdzIGZvciBtYXBwaW5nICovCiAJc3RydWN0IGJsb2NrX2RldmljZQkqYmRldjsJLyogYmxvY2sgZGV2aWNlIGZvciBJL08gKi8KIH07CiAKQEAgLTU4LDYgKzY2LDggQEAKIAogc3NpemVfdCBpb21hcF9maWxlX2J1ZmZlcmVkX3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tLAogCQlzdHJ1Y3QgaW9tYXBfb3BzICpvcHMpOworaW50IGlvbWFwX2ZpbGVfZGlydHkoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHBvcywgbG9mZl90IGxlbiwKKwkJc3RydWN0IGlvbWFwX29wcyAqb3BzKTsKIGludCBpb21hcF96ZXJvX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBwb3MsIGxvZmZfdCBsZW4sCiAJCWJvb2wgKmRpZF96ZXJvLCBzdHJ1Y3QgaW9tYXBfb3BzICpvcHMpOwogaW50IGlvbWFwX3RydW5jYXRlX3BhZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHBvcywgYm9vbCAqZGlkX3plcm8sCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lwY19uYW1lc3BhY2UuaCBiL2luY2x1ZGUvbGludXgvaXBjX25hbWVzcGFjZS5oCmluZGV4IGQxMGU1NGYuLjg0OGU1NzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXBjX25hbWVzcGFjZS5oCisrKyBiL2luY2x1ZGUvbGludXgvaXBjX25hbWVzcGFjZS5oCkBAIC01OCw2ICs1OCw3IEBACiAKIAkvKiB1c2VyX25zIHdoaWNoIG93bnMgdGhlIGlwYyBucyAqLwogCXN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdXNlcl9uczsKKwlzdHJ1Y3QgdWNvdW50cyAqdWNvdW50czsKIAogCXN0cnVjdCBuc19jb21tb24gbnM7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcHY2LmggYi9pbmNsdWRlL2xpbnV4L2lwdjYuaAppbmRleCBjNmRiY2Q4Li43ZTlhNzg5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lwdjYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lwdjYuaApAQCAtMTgsNiArMTgsNyBAQAogCV9fczMyCQlkYWRfdHJhbnNtaXRzOwogCV9fczMyCQlydHJfc29saWNpdHM7CiAJX19zMzIJCXJ0cl9zb2xpY2l0X2ludGVydmFsOworCV9fczMyCQlydHJfc29saWNpdF9tYXhfaW50ZXJ2YWw7CiAJX19zMzIJCXJ0cl9zb2xpY2l0X2RlbGF5OwogCV9fczMyCQlmb3JjZV9tbGRfdmVyc2lvbjsKIAlfX3MzMgkJbWxkdjFfdW5zb2xpY2l0ZWRfcmVwb3J0X2ludGVydmFsOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcnEuaCBiL2luY2x1ZGUvbGludXgvaXJxLmgKaW5kZXggYjUyNDI0ZS4uZTc5ODc1NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcnEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lycS5oCkBAIC05MTYsMTIgKzkxNiwyMCBAQAogCQkJICAgICB1bnNpZ25lZCBpbnQgY2xyLCB1bnNpZ25lZCBpbnQgc2V0KTsKIAogc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmlycV9nZXRfZG9tYWluX2dlbmVyaWNfY2hpcChzdHJ1Y3QgaXJxX2RvbWFpbiAqZCwgdW5zaWduZWQgaW50IGh3X2lycSk7Ci1pbnQgaXJxX2FsbG9jX2RvbWFpbl9nZW5lcmljX2NoaXBzKHN0cnVjdCBpcnFfZG9tYWluICpkLCBpbnQgaXJxc19wZXJfY2hpcCwKLQkJCQkgICBpbnQgbnVtX2N0LCBjb25zdCBjaGFyICpuYW1lLAotCQkJCSAgIGlycV9mbG93X2hhbmRsZXJfdCBoYW5kbGVyLAotCQkJCSAgIHVuc2lnbmVkIGludCBjbHIsIHVuc2lnbmVkIGludCBzZXQsCi0JCQkJICAgZW51bSBpcnFfZ2NfZmxhZ3MgZmxhZ3MpOwogCitpbnQgX19pcnFfYWxsb2NfZG9tYWluX2dlbmVyaWNfY2hpcHMoc3RydWN0IGlycV9kb21haW4gKmQsIGludCBpcnFzX3Blcl9jaGlwLAorCQkJCSAgICAgaW50IG51bV9jdCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICAgIGlycV9mbG93X2hhbmRsZXJfdCBoYW5kbGVyLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGNsciwgdW5zaWduZWQgaW50IHNldCwKKwkJCQkgICAgIGVudW0gaXJxX2djX2ZsYWdzIGZsYWdzKTsKKworI2RlZmluZSBpcnFfYWxsb2NfZG9tYWluX2dlbmVyaWNfY2hpcHMoZCwgaXJxc19wZXJfY2hpcCwgbnVtX2N0LCBuYW1lLAlcCisJCQkJICAgICAgIGhhbmRsZXIsCWNsciwgc2V0LCBmbGFncykJXAorKHsJCQkJCQkJCQlcCisJTUFZQkVfQlVJTERfQlVHX09OKGlycXNfcGVyX2NoaXAgPiAzMik7CQkJCVwKKwlfX2lycV9hbGxvY19kb21haW5fZ2VuZXJpY19jaGlwcyhkLCBpcnFzX3Blcl9jaGlwLCBudW1fY3QsIG5hbWUsXAorCQkJCQkgaGFuZGxlciwgY2xyLCBzZXQsIGZsYWdzKTsJXAorfSkKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgaXJxX2NoaXBfdHlwZSAqaXJxX2RhdGFfZ2V0X2NoaXBfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7CkBAIC05NDUsNiArOTUzLDE2IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgaXJxX2djX3VubG9jayhzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2MpIHsgfQogI2VuZGlmCiAKKy8qCisgKiBUaGUgaXJxc2F2ZSB2YXJpYW50cyBhcmUgZm9yIHVzYWdlIGluIG5vbiBpbnRlcnJ1cHQgY29kZS4gRG8gbm90IHVzZQorICogdGhlbSBpbiBpcnFfY2hpcCBjYWxsYmFja3MuIFVzZSBpcnFfZ2NfbG9jaygpIGluc3RlYWQuCisgKi8KKyNkZWZpbmUgaXJxX2djX2xvY2tfaXJxc2F2ZShnYywgZmxhZ3MpCVwKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJihnYyktPmxvY2ssIGZsYWdzKQorCisjZGVmaW5lIGlycV9nY191bmxvY2tfaXJxcmVzdG9yZShnYywgZmxhZ3MpCVwKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKGdjKS0+bG9jaywgZmxhZ3MpCisKIHN0YXRpYyBpbmxpbmUgdm9pZCBpcnFfcmVnX3dyaXRlbChzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2MsCiAJCQkJICB1MzIgdmFsLCBpbnQgcmVnX29mZnNldCkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXJxY2hpcC9hcm0tZ2ljLXYzLmggYi9pbmNsdWRlL2xpbnV4L2lycWNoaXAvYXJtLWdpYy12My5oCmluZGV4IDU2YjBiN2UuLjgzNjFjOGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXJxY2hpcC9hcm0tZ2ljLXYzLmgKKysrIGIvaW5jbHVkZS9saW51eC9pcnFjaGlwL2FybS1naWMtdjMuaApAQCAtMzM3LDYgKzMzNyw3IEBACiAgKi8KICNkZWZpbmUgRV9JVFNfTU9WSV9VTk1BUFBFRF9JTlRFUlJVUFQJCTB4MDEwMTA3CiAjZGVmaW5lIEVfSVRTX01PVklfVU5NQVBQRURfQ09MTEVDVElPTgkJMHgwMTAxMDkKKyNkZWZpbmUgRV9JVFNfSU5UX1VOTUFQUEVEX0lOVEVSUlVQVAkJMHgwMTAzMDcKICNkZWZpbmUgRV9JVFNfQ0xFQVJfVU5NQVBQRURfSU5URVJSVVBUCQkweDAxMDUwNwogI2RlZmluZSBFX0lUU19NQVBEX0RFVklDRV9PT1IJCQkweDAxMDgwMQogI2RlZmluZSBFX0lUU19NQVBDX1BST0NOVU1fT09SCQkJMHgwMTA5MDIKQEAgLTQyOSw5ICs0MzAsOSBAQAogfTsKIAogc3RydWN0IGlycV9kb21haW47Ci1zdHJ1Y3QgZGV2aWNlX25vZGU7CitzdHJ1Y3QgZndub2RlX2hhbmRsZTsKIGludCBpdHNfY3B1X2luaXQodm9pZCk7Ci1pbnQgaXRzX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlLCBzdHJ1Y3QgcmRpc3RzICpyZGlzdHMsCitpbnQgaXRzX2luaXQoc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmhhbmRsZSwgc3RydWN0IHJkaXN0cyAqcmRpc3RzLAogCSAgICAgc3RydWN0IGlycV9kb21haW4gKmRvbWFpbik7CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBnaWNfZW5hYmxlX3NyZSh2b2lkKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcnFkZXNjLmggYi9pbmNsdWRlL2xpbnV4L2lycWRlc2MuaAppbmRleCBiNTFiZWViLi5jOWJlNTc5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lycWRlc2MuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lycWRlc2MuaApAQCAtMiw2ICsyLDcgQEAKICNkZWZpbmUgX0xJTlVYX0lSUURFU0NfSAogCiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAKIC8qCiAgKiBDb3JlIGludGVybmFsIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggaXJxIGRlc2NyaXB0b3JzCkBAIC00Myw2ICs0NCw3IEBACiAgKiBAZm9yY2VfcmVzdW1lX2RlcHRoOgludW1iZXIgb2YgaXJxYWN0aW9ucyBvbiBhIGlycSBkZXNjcmlwdG9yIHdpdGgKICAqCQkJSVJRRl9GT1JDRV9SRVNVTUUgc2V0CiAgKiBAcmN1OgkJcmN1IGhlYWQgZm9yIGRlbGF5ZWQgZnJlZQorICogQGtvYmo6CQlrb2JqZWN0IHVzZWQgdG8gcmVwcmVzZW50IHRoaXMgc3RydWN0IGluIHN5c2ZzCiAgKiBAZGlyOgkJL3Byb2MvaXJxLyBwcm9jZnMgZW50cnkKICAqIEBuYW1lOgkJZmxvdyBoYW5kbGVyIG5hbWUgZm9yIC9wcm9jL2ludGVycnVwdHMgb3V0cHV0CiAgKi8KQEAgLTg4LDYgKzkwLDcgQEAKICNlbmRpZgogI2lmZGVmIENPTkZJR19TUEFSU0VfSVJRCiAJc3RydWN0IHJjdV9oZWFkCQlyY3U7CisJc3RydWN0IGtvYmplY3QJCWtvYmo7CiAjZW5kaWYKIAlpbnQJCQlwYXJlbnRfaXJxOwogCXN0cnVjdCBtb2R1bGUJCSpvd25lcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvanVtcF9sYWJlbC5oIGIvaW5jbHVkZS9saW51eC9qdW1wX2xhYmVsLmgKaW5kZXggNjYxYWY1Ni4uYTA1NDdjNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9qdW1wX2xhYmVsLmgKKysrIGIvaW5jbHVkZS9saW51eC9qdW1wX2xhYmVsLmgKQEAgLTIxLDYgKzIxLDggQEAKICAqCiAgKiBERUZJTkVfU1RBVElDX0tFWV9UUlVFKGtleSk7CiAgKiBERUZJTkVfU1RBVElDX0tFWV9GQUxTRShrZXkpOworICogREVGSU5FX1NUQVRJQ19LRVlfQVJSQVlfVFJVRShrZXlzLCBjb3VudCk7CisgKiBERUZJTkVfU1RBVElDX0tFWV9BUlJBWV9GQUxTRShrZXlzLCBjb3VudCk7CiAgKiBzdGF0aWNfYnJhbmNoX2xpa2VseSgpCiAgKiBzdGF0aWNfYnJhbmNoX3VubGlrZWx5KCkKICAqCkBAIC0yNjcsOSArMjY5LDI1IEBACiAjZGVmaW5lIERFRklORV9TVEFUSUNfS0VZX1RSVUUobmFtZSkJXAogCXN0cnVjdCBzdGF0aWNfa2V5X3RydWUgbmFtZSA9IFNUQVRJQ19LRVlfVFJVRV9JTklUCiAKKyNkZWZpbmUgREVDTEFSRV9TVEFUSUNfS0VZX1RSVUUobmFtZSkJXAorCWV4dGVybiBzdHJ1Y3Qgc3RhdGljX2tleV90cnVlIG5hbWUKKwogI2RlZmluZSBERUZJTkVfU1RBVElDX0tFWV9GQUxTRShuYW1lKQlcCiAJc3RydWN0IHN0YXRpY19rZXlfZmFsc2UgbmFtZSA9IFNUQVRJQ19LRVlfRkFMU0VfSU5JVAogCisjZGVmaW5lIERFQ0xBUkVfU1RBVElDX0tFWV9GQUxTRShuYW1lKQlcCisJZXh0ZXJuIHN0cnVjdCBzdGF0aWNfa2V5X2ZhbHNlIG5hbWUKKworI2RlZmluZSBERUZJTkVfU1RBVElDX0tFWV9BUlJBWV9UUlVFKG5hbWUsIGNvdW50KQkJXAorCXN0cnVjdCBzdGF0aWNfa2V5X3RydWUgbmFtZVtjb3VudF0gPSB7CQkJXAorCQlbMCAuLi4gKGNvdW50KSAtIDFdID0gU1RBVElDX0tFWV9UUlVFX0lOSVQsCVwKKwl9CisKKyNkZWZpbmUgREVGSU5FX1NUQVRJQ19LRVlfQVJSQVlfRkFMU0UobmFtZSwgY291bnQpCQlcCisJc3RydWN0IHN0YXRpY19rZXlfZmFsc2UgbmFtZVtjb3VudF0gPSB7CQkJXAorCQlbMCAuLi4gKGNvdW50KSAtIDFdID0gU1RBVElDX0tFWV9GQUxTRV9JTklULAlcCisJfQorCiBleHRlcm4gYm9vbCBfX19fd3JvbmdfYnJhbmNoX2Vycm9yKHZvaWQpOwogCiAjZGVmaW5lIHN0YXRpY19rZXlfZW5hYmxlZCh4KQkJCQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaAppbmRleCBkOTZhNjExLi43NGZkNmYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCisrKyBiL2luY2x1ZGUvbGludXgva2VybmVsLmgKQEAgLTI1OSwxNyArMjU5LDE0IEBACiBleHRlcm4gc3RydWN0IGF0b21pY19ub3RpZmllcl9oZWFkIHBhbmljX25vdGlmaWVyX2xpc3Q7CiBleHRlcm4gbG9uZyAoKnBhbmljX2JsaW5rKShpbnQgc3RhdGUpOwogX19wcmludGYoMSwgMikKLXZvaWQgcGFuaWMoY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19ub3JldHVybiBfX2NvbGQ7Cit2b2lkIHBhbmljKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX25vcmV0dXJuIF9fY29sZDsKIHZvaWQgbm1pX3BhbmljKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBjb25zdCBjaGFyICptc2cpOwogZXh0ZXJuIHZvaWQgb29wc19lbnRlcih2b2lkKTsKIGV4dGVybiB2b2lkIG9vcHNfZXhpdCh2b2lkKTsKIHZvaWQgcHJpbnRfb29wc19lbmRfbWFya2VyKHZvaWQpOwogZXh0ZXJuIGludCBvb3BzX21heV9wcmludCh2b2lkKTsKLXZvaWQgZG9fZXhpdChsb25nIGVycm9yX2NvZGUpCi0JX19ub3JldHVybjsKLXZvaWQgY29tcGxldGVfYW5kX2V4aXQoc3RydWN0IGNvbXBsZXRpb24gKiwgbG9uZykKLQlfX25vcmV0dXJuOwordm9pZCBkb19leGl0KGxvbmcgZXJyb3JfY29kZSkgX19ub3JldHVybjsKK3ZvaWQgY29tcGxldGVfYW5kX2V4aXQoc3RydWN0IGNvbXBsZXRpb24gKiwgbG9uZykgX19ub3JldHVybjsKIAogLyogSW50ZXJuYWwsIGRvIG5vdCB1c2UuICovCiBpbnQgX19tdXN0X2NoZWNrIF9rc3RydG91bChjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBpbnQgYmFzZSwgdW5zaWduZWQgbG9uZyAqcmVzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3RpbWUuaCBiL2luY2x1ZGUvbGludXgva3RpbWUuaAppbmRleCAyYjZhMjA0Li4wZmI3ZmZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2t0aW1lLmgKKysrIGIvaW5jbHVkZS9saW51eC9rdGltZS5oCkBAIC02NCw2ICs2NCwxMyBAQAogCQkoeyAoa3RpbWVfdCl7IC50djY0ID0gKGxocykudHY2NCArIChyaHMpLnR2NjQgfTsgfSkKIAogLyoKKyAqIFNhbWUgYXMga3RpbWVfYWRkKCksIGJ1dCBhdm9pZHMgdW5kZWZpbmVkIGJlaGF2aW91ciBvbiBvdmVyZmxvdzsgaG93ZXZlciwKKyAqIHRoaXMgbWVhbnMgdGhhdCB5b3UgbXVzdCBjaGVjayB0aGUgcmVzdWx0IGZvciBvdmVyZmxvdyB5b3Vyc2VsZi4KKyAqLworI2RlZmluZSBrdGltZV9hZGRfdW5zYWZlKGxocywgcmhzKSBcCisJCSh7IChrdGltZV90KXsgLnR2NjQgPSAodTY0KSAobGhzKS50djY0ICsgKHJocykudHY2NCB9OyB9KQorCisvKgogICogQWRkIGEga3RpbWVfdCB2YXJpYWJsZSBhbmQgYSBzY2FsYXIgbmFub3NlY29uZCB2YWx1ZS4KICAqIHJlcyA9IGt0ICsgbnN2YWw6CiAgKi8KQEAgLTIzMSw2ICsyMzgsMTEgQEAKIAlyZXR1cm4ga3RpbWVfc3ViX25zKGt0LCB1c2VjICogTlNFQ19QRVJfVVNFQyk7CiB9CiAKK3N0YXRpYyBpbmxpbmUga3RpbWVfdCBrdGltZV9zdWJfbXMoY29uc3Qga3RpbWVfdCBrdCwgY29uc3QgdTY0IG1zZWMpCit7CisJcmV0dXJuIGt0aW1lX3N1Yl9ucyhrdCwgbXNlYyAqIE5TRUNfUEVSX01TRUMpOworfQorCiBleHRlcm4ga3RpbWVfdCBrdGltZV9hZGRfc2FmZShjb25zdCBrdGltZV90IGxocywgY29uc3Qga3RpbWVfdCByaHMpOwogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaCBiL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaAppbmRleCA5YzI4YjRkLi4wMWMwYjljIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmgKKysrIGIvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oCkBAIC0yNjUsNiArMjY1LDcgQEAKICNlbmRpZgogCWJvb2wgcHJlZW1wdGVkOwogCXN0cnVjdCBrdm1fdmNwdV9hcmNoIGFyY2g7CisJc3RydWN0IGRlbnRyeSAqZGVidWdmc19kZW50cnk7CiB9OwogCiBzdGF0aWMgaW5saW5lIGludCBrdm1fdmNwdV9leGl0aW5nX2d1ZXN0X21vZGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpAQCAtNzQ5LDYgKzc1MCw5IEBACiB2b2lkIGt2bV9hcmNoX3ZjcHVfcG9zdGNyZWF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogdm9pZCBrdm1fYXJjaF92Y3B1X2Rlc3Ryb3koc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIAorYm9vbCBrdm1fYXJjaF9oYXNfdmNwdV9kZWJ1Z2ZzKHZvaWQpOworaW50IGt2bV9hcmNoX2NyZWF0ZV92Y3B1X2RlYnVnZnMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKKwogaW50IGt2bV9hcmNoX2hhcmR3YXJlX2VuYWJsZSh2b2lkKTsKIHZvaWQga3ZtX2FyY2hfaGFyZHdhcmVfZGlzYWJsZSh2b2lkKTsKIGludCBrdm1fYXJjaF9oYXJkd2FyZV9zZXR1cCh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGVkcy5oIGIvaW5jbHVkZS9saW51eC9sZWRzLmgKaW5kZXggOGEzYjVkMi4uZGRmY2IyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sZWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9sZWRzLmgKQEAgLTM1OSw2ICszNTksMTEgQEAKIAlzdHJ1Y3QgbGVkX2luZm8JKmxlZHM7CiB9OwogCitzdHJ1Y3QgZ3Bpb19kZXNjOwordHlwZWRlZiBpbnQgKCpncGlvX2JsaW5rX3NldF90KShzdHJ1Y3QgZ3Bpb19kZXNjICpkZXNjLCBpbnQgc3RhdGUsCisJCQkJdW5zaWduZWQgbG9uZyAqZGVsYXlfb24sCisJCQkJdW5zaWduZWQgbG9uZyAqZGVsYXlfb2ZmKTsKKwogLyogRm9yIHRoZSBsZWRzLWdwaW8gZHJpdmVyICovCiBzdHJ1Y3QgZ3Bpb19sZWQgewogCWNvbnN0IGNoYXIgKm5hbWU7CkBAIC0zODIsOSArMzg3LDcgQEAKICNkZWZpbmUgR1BJT19MRURfTk9fQkxJTktfTE9XCTAJLyogTm8gYmxpbmsgR1BJTyBzdGF0ZSBsb3cgKi8KICNkZWZpbmUgR1BJT19MRURfTk9fQkxJTktfSElHSAkxCS8qIE5vIGJsaW5rIEdQSU8gc3RhdGUgaGlnaCAqLwogI2RlZmluZSBHUElPX0xFRF9CTElOSwkJMgkvKiBQbGVhc2UsIGJsaW5rICovCi0JaW50CQkoKmdwaW9fYmxpbmtfc2V0KShzdHJ1Y3QgZ3Bpb19kZXNjICpkZXNjLCBpbnQgc3RhdGUsCi0JCQkJCXVuc2lnbmVkIGxvbmcgKmRlbGF5X29uLAotCQkJCQl1bnNpZ25lZCBsb25nICpkZWxheV9vZmYpOworCWdwaW9fYmxpbmtfc2V0X3QJZ3Bpb19ibGlua19zZXQ7CiB9OwogCiAjaWZkZWYgQ09ORklHX05FV19MRURTCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xnbG9jay5oIGIvaW5jbHVkZS9saW51eC9sZ2xvY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkyZWJkMS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L2xnbG9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIFNwZWNpYWxpc2VkIGxvY2FsLWdsb2JhbCBzcGlubG9jay4gQ2FuIG9ubHkgYmUgZGVjbGFyZWQgYXMgZ2xvYmFsIHZhcmlhYmxlcwotICogdG8gYXZvaWQgb3ZlcmhlYWQgYW5kIGtlZXAgdGhpbmdzIHNpbXBsZSAoYW5kIHdlIGRvbid0IHdhbnQgdG8gc3RhcnQgdXNpbmcKLSAqIHRoZXNlIGluc2lkZSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgc3RydWN0dXJlcykuCi0gKgotICogImxvY2FsL2dsb2JhbCBsb2NrcyIgKGxnbG9ja3MpIGNhbiBiZSB1c2VkIHRvOgotICoKLSAqIC0gUHJvdmlkZSBmYXN0IGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gcGVyLUNQVSBkYXRhLCB3aXRoIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8KLSAqICAgYW5vdGhlciBDUFUncyBkYXRhIGFsbG93ZWQgYnV0IHBvc3NpYmx5IHN1YmplY3QgdG8gY29udGVudGlvbiwgYW5kIHRvCi0gKiAgIHByb3ZpZGUgdmVyeSBzbG93IGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gYWxsIHBlci1DUFUgZGF0YS4KLSAqIC0gT3IgdG8gcHJvdmlkZSB2ZXJ5IGZhc3QgYW5kIHNjYWxhYmxlIHJlYWQgc2VyaWFsaXNhdGlvbiwgYW5kIHRvIHByb3ZpZGUKLSAqICAgdmVyeSBzbG93IGV4Y2x1c2l2ZSBzZXJpYWxpc2F0aW9uIG9mIGRhdGEgKG5vdCBuZWNlc3NhcmlseSBwZXItQ1BVIGRhdGEpLgotICoKLSAqIEJybG9ja3MgYXJlIGFsc28gaW1wbGVtZW50ZWQgYXMgYSBzaG9ydC1oYW5kIG5vdGF0aW9uIGZvciB0aGUgbGF0dGVyIHVzZQotICogY2FzZS4KLSAqCi0gKiBDb3B5cmlnaHQgMjAwOSwgMjAxMCwgTmljayBQaWdnaW4sIE5vdmVsbCBJbmMuCi0gKi8KLSNpZm5kZWYgX19MSU5VWF9MR0xPQ0tfSAotI2RlZmluZSBfX0xJTlVYX0xHTE9DS19ICi0KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2xvY2tkZXAuaD4KLSNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KLSNpbmNsdWRlIDxsaW51eC9jcHUuaD4KLSNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgotCi0jaWZkZWYgQ09ORklHX1NNUAotCi0jaWZkZWYgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MKLSNkZWZpbmUgTE9DS0RFUF9JTklUX01BUCBsb2NrZGVwX2luaXRfbWFwCi0jZWxzZQotI2RlZmluZSBMT0NLREVQX0lOSVRfTUFQKGEsIGIsIGMsIGQpCi0jZW5kaWYKLQotc3RydWN0IGxnbG9jayB7Ci0JYXJjaF9zcGlubG9ja190IF9fcGVyY3B1ICpsb2NrOwotI2lmZGVmIENPTkZJR19ERUJVR19MT0NLX0FMTE9DCi0Jc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGxvY2tfa2V5OwotCXN0cnVjdCBsb2NrZGVwX21hcCAgICBsb2NrX2RlcF9tYXA7Ci0jZW5kaWYKLX07Ci0KLSNkZWZpbmUgREVGSU5FX0xHTE9DSyhuYW1lKQkJCQkJCVwKLQlzdGF0aWMgREVGSU5FX1BFUl9DUFUoYXJjaF9zcGlubG9ja190LCBuYW1lICMjIF9sb2NrKQkJXAotCT0gX19BUkNIX1NQSU5fTE9DS19VTkxPQ0tFRDsJCQkJCVwKLQlzdHJ1Y3QgbGdsb2NrIG5hbWUgPSB7IC5sb2NrID0gJm5hbWUgIyMgX2xvY2sgfQotCi0jZGVmaW5lIERFRklORV9TVEFUSUNfTEdMT0NLKG5hbWUpCQkJCQlcCi0Jc3RhdGljIERFRklORV9QRVJfQ1BVKGFyY2hfc3BpbmxvY2tfdCwgbmFtZSAjIyBfbG9jaykJCVwKLQk9IF9fQVJDSF9TUElOX0xPQ0tfVU5MT0NLRUQ7CQkJCQlcCi0Jc3RhdGljIHN0cnVjdCBsZ2xvY2sgbmFtZSA9IHsgLmxvY2sgPSAmbmFtZSAjIyBfbG9jayB9Ci0KLXZvaWQgbGdfbG9ja19pbml0KHN0cnVjdCBsZ2xvY2sgKmxnLCBjaGFyICpuYW1lKTsKLQotdm9pZCBsZ19sb2NhbF9sb2NrKHN0cnVjdCBsZ2xvY2sgKmxnKTsKLXZvaWQgbGdfbG9jYWxfdW5sb2NrKHN0cnVjdCBsZ2xvY2sgKmxnKTsKLXZvaWQgbGdfbG9jYWxfbG9ja19jcHUoc3RydWN0IGxnbG9jayAqbGcsIGludCBjcHUpOwotdm9pZCBsZ19sb2NhbF91bmxvY2tfY3B1KHN0cnVjdCBsZ2xvY2sgKmxnLCBpbnQgY3B1KTsKLQotdm9pZCBsZ19kb3VibGVfbG9jayhzdHJ1Y3QgbGdsb2NrICpsZywgaW50IGNwdTEsIGludCBjcHUyKTsKLXZvaWQgbGdfZG91YmxlX3VubG9jayhzdHJ1Y3QgbGdsb2NrICpsZywgaW50IGNwdTEsIGludCBjcHUyKTsKLQotdm9pZCBsZ19nbG9iYWxfbG9jayhzdHJ1Y3QgbGdsb2NrICpsZyk7Ci12b2lkIGxnX2dsb2JhbF91bmxvY2soc3RydWN0IGxnbG9jayAqbGcpOwotCi0jZWxzZQotLyogV2hlbiAhQ09ORklHX1NNUCwgbWFwIGxnbG9jayB0byBzcGlubG9jayAqLwotI2RlZmluZSBsZ2xvY2sgc3BpbmxvY2sKLSNkZWZpbmUgREVGSU5FX0xHTE9DSyhuYW1lKSBERUZJTkVfU1BJTkxPQ0sobmFtZSkKLSNkZWZpbmUgREVGSU5FX1NUQVRJQ19MR0xPQ0sobmFtZSkgc3RhdGljIERFRklORV9TUElOTE9DSyhuYW1lKQotI2RlZmluZSBsZ19sb2NrX2luaXQobGcsIG5hbWUpIHNwaW5fbG9ja19pbml0KGxnKQotI2RlZmluZSBsZ19sb2NhbF9sb2NrIHNwaW5fbG9jawotI2RlZmluZSBsZ19sb2NhbF91bmxvY2sgc3Bpbl91bmxvY2sKLSNkZWZpbmUgbGdfbG9jYWxfbG9ja19jcHUobGcsIGNwdSkgc3Bpbl9sb2NrKGxnKQotI2RlZmluZSBsZ19sb2NhbF91bmxvY2tfY3B1KGxnLCBjcHUpIHNwaW5fdW5sb2NrKGxnKQotI2RlZmluZSBsZ19nbG9iYWxfbG9jayBzcGluX2xvY2sKLSNkZWZpbmUgbGdfZ2xvYmFsX3VubG9jayBzcGluX3VubG9jawotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9saXN0LmggYi9pbmNsdWRlL2xpbnV4L2xpc3QuaAppbmRleCA1MTgzMTM4Li41ODA5ZTlhMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9saXN0LmgKKysrIGIvaW5jbHVkZS9saW51eC9saXN0LmgKQEAgLTM4MSw4ICszODEsMTEgQEAKICAqCiAgKiBOb3RlIHRoYXQgaWYgdGhlIGxpc3QgaXMgZW1wdHksIGl0IHJldHVybnMgTlVMTC4KICAqLwotI2RlZmluZSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwocHRyLCB0eXBlLCBtZW1iZXIpIFwKLQkoIWxpc3RfZW1wdHkocHRyKSA/IGxpc3RfZmlyc3RfZW50cnkocHRyLCB0eXBlLCBtZW1iZXIpIDogTlVMTCkKKyNkZWZpbmUgbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKHB0ciwgdHlwZSwgbWVtYmVyKSAoeyBcCisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZF9fID0gKHB0cik7IFwKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3NfXyA9IFJFQURfT05DRShoZWFkX18tPm5leHQpOyBcCisJcG9zX18gIT0gaGVhZF9fID8gbGlzdF9lbnRyeShwb3NfXywgdHlwZSwgbWVtYmVyKSA6IE5VTEw7IFwKK30pCiAKIC8qKgogICogbGlzdF9uZXh0X2VudHJ5IC0gZ2V0IHRoZSBuZXh0IGVsZW1lbnQgaW4gbGlzdApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sc21fYXVkaXQuaCBiL2luY2x1ZGUvbGludXgvbHNtX2F1ZGl0LmgKaW5kZXggZmZiOWM5ZC4uZTU4ZTU3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sc21fYXVkaXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xzbV9hdWRpdC5oCkBAIC01OSw2ICs1OSw3IEBACiAjZGVmaW5lIExTTV9BVURJVF9EQVRBX0lOT0RFCTkKICNkZWZpbmUgTFNNX0FVRElUX0RBVEFfREVOVFJZCTEwCiAjZGVmaW5lIExTTV9BVURJVF9EQVRBX0lPQ1RMX09QCTExCisjZGVmaW5lIExTTV9BVURJVF9EQVRBX0ZJTEUJMTIKIAl1bmlvbiAJewogCQlzdHJ1Y3QgcGF0aCBwYXRoOwogCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CkBAIC03NSw2ICs3Niw3IEBACiAjZW5kaWYKIAkJY2hhciAqa21vZF9uYW1lOwogCQlzdHJ1Y3QgbHNtX2lvY3Rsb3BfYXVkaXQgKm9wOworCQlzdHJ1Y3QgZmlsZSAqZmlsZTsKIAl9IHU7CiAJLyogdGhpcyB1bmlvbiBjb250YWlucyBMU00gc3BlY2lmaWMgZGF0YSAqLwogCXVuaW9uIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbHNtX2hvb2tzLmggYi9pbmNsdWRlL2xpbnV4L2xzbV9ob29rcy5oCmluZGV4IDEwMWJmMTkuLjU1OGFkZmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbHNtX2hvb2tzLmgKKysrIGIvaW5jbHVkZS9saW51eC9sc21faG9va3MuaApAQCAtMTUxLDYgKzE1MSwxNiBAQAogICoJQG5hbWUgbmFtZSBvZiB0aGUgbGFzdCBwYXRoIGNvbXBvbmVudCB1c2VkIHRvIGNyZWF0ZSBmaWxlCiAgKglAY3R4IHBvaW50ZXIgdG8gcGxhY2UgdGhlIHBvaW50ZXIgdG8gdGhlIHJlc3VsdGluZyBjb250ZXh0IGluLgogICoJQGN0eGxlbiBwb2ludCB0byBwbGFjZSB0aGUgbGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgY29udGV4dC4KKyAqIEBkZW50cnlfY3JlYXRlX2ZpbGVzX2FzOgorICoJQ29tcHV0ZSBhIGNvbnRleHQgZm9yIGEgZGVudHJ5IGFzIHRoZSBpbm9kZSBpcyBub3QgeWV0IGF2YWlsYWJsZQorICoJYW5kIHNldCB0aGF0IGNvbnRleHQgaW4gcGFzc2VkIGluIGNyZWRzIHNvIHRoYXQgbmV3IGZpbGVzIGFyZQorICoJY3JlYXRlZCB1c2luZyB0aGF0IGNvbnRleHQuIENvbnRleHQgaXMgY2FsY3VsYXRlZCB1c2luZyB0aGUKKyAqCXBhc3NlZCBpbiBjcmVkcyBhbmQgbm90IHRoZSBjcmVkcyBvZiB0aGUgY2FsbGVyLgorICoJQGRlbnRyeSBkZW50cnkgdG8gdXNlIGluIGNhbGN1bGF0aW5nIHRoZSBjb250ZXh0LgorICoJQG1vZGUgbW9kZSB1c2VkIHRvIGRldGVybWluZSByZXNvdXJjZSB0eXBlLgorICoJQG5hbWUgbmFtZSBvZiB0aGUgbGFzdCBwYXRoIGNvbXBvbmVudCB1c2VkIHRvIGNyZWF0ZSBmaWxlCisgKglAb2xkIGNyZWRzIHdoaWNoIHNob3VsZCBiZSB1c2VkIGZvciBjb250ZXh0IGNhbGN1bGF0aW9uCisgKglAbmV3IGNyZWRzIHRvIG1vZGlmeQogICoKICAqCiAgKiBTZWN1cml0eSBob29rcyBmb3IgaW5vZGUgb3BlcmF0aW9ucy4KQEAgLTQwMSw2ICs0MTEsMjMgQEAKICAqCUBpbm9kZSBjb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIGlub2RlLgogICoJQHNlY2lkIGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgbG9jYXRpb24gd2hlcmUgcmVzdWx0IHdpbGwgYmUgc2F2ZWQuCiAgKglJbiBjYXNlIG9mIGZhaWx1cmUsIEBzZWNpZCB3aWxsIGJlIHNldCB0byB6ZXJvLgorICogQGlub2RlX2NvcHlfdXA6CisgKglBIGZpbGUgaXMgYWJvdXQgdG8gYmUgY29waWVkIHVwIGZyb20gbG93ZXIgbGF5ZXIgdG8gdXBwZXIgbGF5ZXIgb2YKKyAqCW92ZXJsYXkgZmlsZXN5c3RlbS4gU2VjdXJpdHkgbW9kdWxlIGNhbiBwcmVwYXJlIGEgc2V0IG9mIG5ldyBjcmVkcworICoJYW5kIG1vZGlmeSBhcyBuZWVkIGJlIGFuZCByZXR1cm4gbmV3IGNyZWRzLiBDYWxsZXIgd2lsbCBzd2l0Y2ggdG8KKyAqCW5ldyBjcmVkcyB0ZW1wb3JhcmlseSB0byBjcmVhdGUgbmV3IGZpbGUgYW5kIHJlbGVhc2UgbmV3bHkgYWxsb2NhdGVkCisgKgljcmVkcy4KKyAqCUBzcmMgaW5kaWNhdGVzIHRoZSB1bmlvbiBkZW50cnkgb2YgZmlsZSB0aGF0IGlzIGJlaW5nIGNvcGllZCB1cC4KKyAqCUBuZXcgcG9pbnRlciB0byBwb2ludGVyIHRvIHJldHVybiBuZXdseSBhbGxvY2F0ZWQgY3JlZHMuCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZXJyb3IuCisgKiBAaW5vZGVfY29weV91cF94YXR0cjoKKyAqCUZpbHRlciB0aGUgeGF0dHJzIGJlaW5nIGNvcGllZCB1cCB3aGVuIGEgdW5pb25lZCBmaWxlIGlzIGNvcGllZAorICoJdXAgZnJvbSBhIGxvd2VyIGxheWVyIHRvIHRoZSB1bmlvbi9vdmVybGF5IGxheWVyLgorICoJQG5hbWUgaW5kaWNhdGVzIHRoZSBuYW1lIG9mIHRoZSB4YXR0ci4KKyAqCVJldHVybnMgMCB0byBhY2NlcHQgdGhlIHhhdHRyLCAxIHRvIGRpc2NhcmQgdGhlIHhhdHRyLCAtRU9QTk9UU1VQUCBpZgorICoJc2VjdXJpdHkgbW9kdWxlIGRvZXMgbm90IGtub3cgYWJvdXQgYXR0cmlidXRlIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZQorICoJdG8gYWJvcnQgdGhlIGNvcHkgdXAuIE5vdGUgdGhhdCB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciByZWFkaW5nCisgKglhbmQgd3JpdGluZyB0aGUgeGF0dHJzIGFzIHRoaXMgaG9vayBpcyBtZXJlbHkgYSBmaWx0ZXIuCiAgKgogICogU2VjdXJpdHkgaG9va3MgZm9yIGZpbGUgb3BlcmF0aW9ucwogICoKQEAgLTEzNTgsNiArMTM4NSwxMCBAQAogCWludCAoKmRlbnRyeV9pbml0X3NlY3VyaXR5KShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAogCQkJCQljb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSwgdm9pZCAqKmN0eCwKIAkJCQkJdTMyICpjdHhsZW4pOworCWludCAoKmRlbnRyeV9jcmVhdGVfZmlsZXNfYXMpKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisJCQkJCXN0cnVjdCBxc3RyICpuYW1lLAorCQkJCQljb25zdCBzdHJ1Y3QgY3JlZCAqb2xkLAorCQkJCQlzdHJ1Y3QgY3JlZCAqbmV3KTsKIAogCiAjaWZkZWYgQ09ORklHX1NFQ1VSSVRZX1BBVEgKQEAgLTE0MjUsNiArMTQ1Niw4IEBACiAJaW50ICgqaW5vZGVfbGlzdHNlY3VyaXR5KShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjaGFyICpidWZmZXIsCiAJCQkJCXNpemVfdCBidWZmZXJfc2l6ZSk7CiAJdm9pZCAoKmlub2RlX2dldHNlY2lkKShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgKnNlY2lkKTsKKwlpbnQgKCppbm9kZV9jb3B5X3VwKShzdHJ1Y3QgZGVudHJ5ICpzcmMsIHN0cnVjdCBjcmVkICoqbmV3KTsKKwlpbnQgKCppbm9kZV9jb3B5X3VwX3hhdHRyKShjb25zdCBjaGFyICpuYW1lKTsKIAogCWludCAoKmZpbGVfcGVybWlzc2lvbikoc3RydWN0IGZpbGUgKmZpbGUsIGludCBtYXNrKTsKIAlpbnQgKCpmaWxlX2FsbG9jX3NlY3VyaXR5KShzdHJ1Y3QgZmlsZSAqZmlsZSk7CkBAIC0xNDU1LDcgKzE0ODgsNiBAQAogCWludCAoKmtlcm5lbF9hY3RfYXMpKHN0cnVjdCBjcmVkICpuZXcsIHUzMiBzZWNpZCk7CiAJaW50ICgqa2VybmVsX2NyZWF0ZV9maWxlc19hcykoc3RydWN0IGNyZWQgKm5ldywgc3RydWN0IGlub2RlICppbm9kZSk7CiAJaW50ICgqa2VybmVsX21vZHVsZV9yZXF1ZXN0KShjaGFyICprbW9kX25hbWUpOwotCWludCAoKmtlcm5lbF9tb2R1bGVfZnJvbV9maWxlKShzdHJ1Y3QgZmlsZSAqZmlsZSk7CiAJaW50ICgqa2VybmVsX3JlYWRfZmlsZSkoc3RydWN0IGZpbGUgKmZpbGUsIGVudW0ga2VybmVsX3JlYWRfZmlsZV9pZCBpZCk7CiAJaW50ICgqa2VybmVsX3Bvc3RfcmVhZF9maWxlKShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBsb2ZmX3Qgc2l6ZSwKIAkJCQkgICAgIGVudW0ga2VybmVsX3JlYWRfZmlsZV9pZCBpZCk7CkBAIC0xNjU2LDYgKzE2ODgsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgc2JfY2xvbmVfbW50X29wdHM7CiAJc3RydWN0IGxpc3RfaGVhZCBzYl9wYXJzZV9vcHRzX3N0cjsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGRlbnRyeV9pbml0X3NlY3VyaXR5OworCXN0cnVjdCBsaXN0X2hlYWQgZGVudHJ5X2NyZWF0ZV9maWxlc19hczsKICNpZmRlZiBDT05GSUdfU0VDVVJJVFlfUEFUSAogCXN0cnVjdCBsaXN0X2hlYWQgcGF0aF91bmxpbms7CiAJc3RydWN0IGxpc3RfaGVhZCBwYXRoX21rZGlyOwpAQCAtMTY5Niw2ICsxNzI5LDggQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGlub2RlX3NldHNlY3VyaXR5OwogCXN0cnVjdCBsaXN0X2hlYWQgaW5vZGVfbGlzdHNlY3VyaXR5OwogCXN0cnVjdCBsaXN0X2hlYWQgaW5vZGVfZ2V0c2VjaWQ7CisJc3RydWN0IGxpc3RfaGVhZCBpbm9kZV9jb3B5X3VwOworCXN0cnVjdCBsaXN0X2hlYWQgaW5vZGVfY29weV91cF94YXR0cjsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGZpbGVfcGVybWlzc2lvbjsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGZpbGVfYWxsb2Nfc2VjdXJpdHk7CiAJc3RydWN0IGxpc3RfaGVhZCBmaWxlX2ZyZWVfc2VjdXJpdHk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21idXMuaCBiL2luY2x1ZGUvbGludXgvbWJ1cy5oCmluZGV4IGQ2MTAyMzIuLjI5MzFhYTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWJ1cy5oCisrKyBiL2luY2x1ZGUvbGludXgvbWJ1cy5oCkBAIC0xMSw2ICsxMSw4IEBACiAjaWZuZGVmIF9fTElOVVhfTUJVU19ICiAjZGVmaW5lIF9fTElOVVhfTUJVU19ICiAKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCiBzdHJ1Y3QgcmVzb3VyY2U7CiAKIHN0cnVjdCBtYnVzX2RyYW1fdGFyZ2V0X2luZm8KQEAgLTU1LDYgKzU3LDggQEAKICNpZmRlZiBDT05GSUdfUExBVF9PUklPTgogZXh0ZXJuIGNvbnN0IHN0cnVjdCBtYnVzX2RyYW1fdGFyZ2V0X2luZm8gKm12X21idXNfZHJhbV9pbmZvKHZvaWQpOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBtYnVzX2RyYW1fdGFyZ2V0X2luZm8gKm12X21idXNfZHJhbV9pbmZvX25vb3ZlcmxhcCh2b2lkKTsKK2ludCBtdmVidV9tYnVzX2dldF9pb193aW5faW5mbyhwaHlzX2FkZHJfdCBwaHlhZGRyLCB1MzIgKnNpemUsIHU4ICp0YXJnZXQsCisJCQkgICAgICAgdTggKmF0dHIpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IG1idXNfZHJhbV90YXJnZXRfaW5mbyAqbXZfbWJ1c19kcmFtX2luZm8odm9pZCkKIHsKQEAgLTY0LDE0ICs2OCwyNCBAQAogewogCXJldHVybiBOVUxMOwogfQorc3RhdGljIGlubGluZSBpbnQgbXZlYnVfbWJ1c19nZXRfaW9fd2luX2luZm8ocGh5c19hZGRyX3QgcGh5YWRkciwgdTMyICpzaXplLAorCQkJCQkgICAgIHU4ICp0YXJnZXQsIHU4ICphdHRyKQoreworCS8qCisJICogT24gYWxsIEFSTTMyIE1WRUJVIHBsYXRmb3JtcyB3aXRoIE1CdXMgc3VwcG9ydCwgdGhpcyBzdHViCisJICogZnVuY3Rpb24gd2lsbCBub3QgZ2V0IGNhbGxlZC4gVGhlIHJlYWwgZnVuY3Rpb24gZnJvbSB0aGUKKwkgKiBNQnVzIGRyaXZlciBpcyBjYWxsZWQgaW5zdGVhZC4gQVJNNjQgTVZFQlUgcGxhdGZvcm1zIGxpa2UKKwkgKiB0aGUgQXJtYWRhIDM3MDAgY291bGQgdXNlIHRoZSBtdl94b3IgZGV2aWNlIGRyaXZlciB3aGljaCBjYWxscworCSAqIGludG8gdGhpcyBmdW5jdGlvbgorCSAqLworCXJldHVybiAtRUlOVkFMOworfQogI2VuZGlmCiAKIGludCBtdmVidV9tYnVzX3NhdmVfY3B1X3RhcmdldCh1MzIgX19pb21lbSAqc3RvcmVfYWRkcik7CiB2b2lkIG12ZWJ1X21idXNfZ2V0X3BjaWVfbWVtX2FwZXJ0dXJlKHN0cnVjdCByZXNvdXJjZSAqcmVzKTsKIHZvaWQgbXZlYnVfbWJ1c19nZXRfcGNpZV9pb19hcGVydHVyZShzdHJ1Y3QgcmVzb3VyY2UgKnJlcyk7CiBpbnQgbXZlYnVfbWJ1c19nZXRfZHJhbV93aW5faW5mbyhwaHlzX2FkZHJfdCBwaHlhZGRyLCB1OCAqdGFyZ2V0LCB1OCAqYXR0cik7Ci1pbnQgbXZlYnVfbWJ1c19nZXRfaW9fd2luX2luZm8ocGh5c19hZGRyX3QgcGh5YWRkciwgdTMyICpzaXplLCB1OCAqdGFyZ2V0LAotCQkJICAgICAgIHU4ICphdHRyKTsKIGludCBtdmVidV9tYnVzX2FkZF93aW5kb3dfcmVtYXBfYnlfaWQodW5zaWduZWQgaW50IHRhcmdldCwKIAkJCQkgICAgICB1bnNpZ25lZCBpbnQgYXR0cmlidXRlLAogCQkJCSAgICAgIHBoeXNfYWRkcl90IGJhc2UsIHNpemVfdCBzaXplLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tY2IuaCBiL2luY2x1ZGUvbGludXgvbWNiLmgKaW5kZXggZWFkMTNkMi4uNDA5N2FjOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tY2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L21jYi5oCkBAIC00MSwxNSArNDEsMTcgQEAKIAljaGFyIG5hbWVbQ0hBTUVMRU9OX0ZJTEVOQU1FX0xFTiArIDFdOwogCWludCAoKmdldF9pcnEpKHN0cnVjdCBtY2JfZGV2aWNlICpkZXYpOwogfTsKLSNkZWZpbmUgdG9fbWNiX2J1cyhiKSBjb250YWluZXJfb2YoKGIpLCBzdHJ1Y3QgbWNiX2J1cywgZGV2KQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtY2JfYnVzICp0b19tY2JfYnVzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGRldiwgc3RydWN0IG1jYl9idXMsIGRldik7Cit9CiAKIC8qKgogICogc3RydWN0IG1jYl9kZXZpY2UgLSBNRU4gQ2hhbWVsZW9uIEJ1cyBkZXZpY2UKICAqCi0gKiBAYnVzX2xpc3Q6IGludGVybmFsIGxpc3QgaGFuZGxpbmcgZm9yIGJ1cyBjb2RlCiAgKiBAZGV2OiBkZXZpY2UgaW4ga2VybmVsIHJlcHJlc2VudGF0aW9uCiAgKiBAYnVzOiBtY2IgYnVzIHRoZSBkZXZpY2UgaXMgcGx1Z2dlZCB0bwotICogQHN1Ym9yZGluYXRlOiBzdWJvcmRpbmF0ZSBNQ0J1cyBpbiBjYXNlIG9mIGJyaWRnZQogICogQGlzX2FkZGVkOiBmbGFnIHRvIGNoZWNrIGlmIGRldmljZSBpcyBhZGRlZCB0byBidXMKICAqIEBkcml2ZXI6IGFzc29jaWF0ZWQgbWNiX2RyaXZlcgogICogQGlkOiBtY2IgZGV2aWNlIGlkCkBAIC02MiwxMCArNjQsOCBAQAogICogQG1lbW9yeTogbWVtb3J5IHJlc291cmNlCiAgKi8KIHN0cnVjdCBtY2JfZGV2aWNlIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGJ1c19saXN0OwogCXN0cnVjdCBkZXZpY2UgZGV2OwogCXN0cnVjdCBtY2JfYnVzICpidXM7Ci0Jc3RydWN0IG1jYl9idXMgKnN1Ym9yZGluYXRlOwogCWJvb2wgaXNfYWRkZWQ7CiAJc3RydWN0IG1jYl9kcml2ZXIgKmRyaXZlcjsKIAl1MTYgaWQ7CkBAIC03Niw4ICs3NiwxMyBAQAogCWludCByZXY7CiAJc3RydWN0IHJlc291cmNlIGlycTsKIAlzdHJ1Y3QgcmVzb3VyY2UgbWVtOworCXN0cnVjdCBkZXZpY2UgKmRtYV9kZXY7CiB9OwotI2RlZmluZSB0b19tY2JfZGV2aWNlKHgpIGNvbnRhaW5lcl9vZigoeCksIHN0cnVjdCBtY2JfZGV2aWNlLCBkZXYpCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1jYl9kZXZpY2UgKnRvX21jYl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgbWNiX2RldmljZSwgZGV2KTsKK30KIAogLyoqCiAgKiBzdHJ1Y3QgbWNiX2RyaXZlciAtIE1FTiBDaGFtZWxlb24gQnVzIGRldmljZSBkcml2ZXIKQEAgLTk1LDcgKzEwMCwxMSBAQAogCXZvaWQgKCpyZW1vdmUpKHN0cnVjdCBtY2JfZGV2aWNlICptZGV2KTsKIAl2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBtY2JfZGV2aWNlICptZGV2KTsKIH07Ci0jZGVmaW5lIHRvX21jYl9kcml2ZXIoeCkgY29udGFpbmVyX29mKCh4KSwgc3RydWN0IG1jYl9kcml2ZXIsIGRyaXZlcikKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbWNiX2RyaXZlciAqdG9fbWNiX2RyaXZlcihzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCXJldHVybiBjb250YWluZXJfb2YoZHJ2LCBzdHJ1Y3QgbWNiX2RyaXZlciwgZHJpdmVyKTsKK30KIAogc3RhdGljIGlubGluZSB2b2lkICptY2JfZ2V0X2RydmRhdGEoc3RydWN0IG1jYl9kZXZpY2UgKmRldikKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmggYi9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oCmluZGV4IDQ0MjlkMjUuLjVlNWIyOTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmgKKysrIGIvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaApAQCAtMTk1LDYgKzE5NSw3IEBACiB9CiAKIGV4dGVybiBpbnQgbXBvbF9taXNwbGFjZWQoc3RydWN0IHBhZ2UgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICosIHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIHZvaWQgbXBvbF9wdXRfdGFza19wb2xpY3koc3RydWN0IHRhc2tfc3RydWN0ICopOwogCiAjZWxzZQogCkBAIC0yOTcsNSArMjk4LDggQEAKIAlyZXR1cm4gLTE7IC8qIG5vIG5vZGUgcHJlZmVyZW5jZSAqLwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgbXBvbF9wdXRfdGFza19wb2xpY3koc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworfQogI2VuZGlmIC8qIENPTkZJR19OVU1BICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2RhOHh4LWNmZ2NoaXAuaCBiL2luY2x1ZGUvbGludXgvbWZkL2RhOHh4LWNmZ2NoaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDQ5ODVlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvZGE4eHgtY2ZnY2hpcC5oCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogVEkgRGFWaW5jaSBEQTh4eCBDSElQQ0ZHeCByZWdpc3RlcnMgZm9yIHN5c2NvbiBjb25zdW1lcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IERhdmlkIExlY2huZXIgPGRhdmlkQGxlY2hub2xvZ3kuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9NRkRfREE4WFhfQ0ZHQ0hJUF9ICisjZGVmaW5lIF9fTElOVVhfTUZEX0RBOFhYX0NGR0NISVBfSAorCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKy8qIHJlZ2lzdGVyIG9mZnNldCAoMzItYml0IHJlZ2lzdGVycykgKi8KKyNkZWZpbmUgQ0ZHQ0hJUChuKQkJCQkoKG4pICogNCkKKworLyogQ0ZHQ0hJUDAgKFBMTDAvRURNQTNfMCkgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBDRkdDSElQMF9QTExfTUFTVEVSX0xPQ0sJCUJJVCg0KQorI2RlZmluZSBDRkdDSElQMF9FRE1BMzBUQzFEQlMobikJCSgobikgPDwgMikKKyNkZWZpbmUgQ0ZHQ0hJUDBfRURNQTMwVEMxREJTX01BU0sJCUNGR0NISVAwX0VETUEzMFRDMURCUygweDMpCisjZGVmaW5lIENGR0NISVAwX0VETUEzMFRDMURCU18xNgkJQ0ZHQ0hJUDBfRURNQTMwVEMxREJTKDB4MCkKKyNkZWZpbmUgQ0ZHQ0hJUDBfRURNQTMwVEMxREJTXzMyCQlDRkdDSElQMF9FRE1BMzBUQzFEQlMoMHgxKQorI2RlZmluZSBDRkdDSElQMF9FRE1BMzBUQzFEQlNfNjQJCUNGR0NISVAwX0VETUEzMFRDMURCUygweDIpCisjZGVmaW5lIENGR0NISVAwX0VETUEzMFRDMERCUyhuKQkJKChuKSA8PCAwKQorI2RlZmluZSBDRkdDSElQMF9FRE1BMzBUQzBEQlNfTUFTSwkJQ0ZHQ0hJUDBfRURNQTMwVEMwREJTKDB4MykKKyNkZWZpbmUgQ0ZHQ0hJUDBfRURNQTMwVEMwREJTXzE2CQlDRkdDSElQMF9FRE1BMzBUQzBEQlMoMHgwKQorI2RlZmluZSBDRkdDSElQMF9FRE1BMzBUQzBEQlNfMzIJCUNGR0NISVAwX0VETUEzMFRDMERCUygweDEpCisjZGVmaW5lIENGR0NISVAwX0VETUEzMFRDMERCU182NAkJQ0ZHQ0hJUDBfRURNQTMwVEMwREJTKDB4MikKKworLyogQ0ZHQ0hJUDEgKGVDQVAvSFBJL0VETUEzXzEvZUhSUFdNIFRCQ0xLL01jQVNQMCBBTVVURUlOKSByZWdpc3RlciBiaXRzICovCisjZGVmaW5lIENGR0NISVAxX0NBUDJTUkMobikJCQkoKG4pIDw8IDI3KQorI2RlZmluZSBDRkdDSElQMV9DQVAyU1JDX01BU0sJCQlDRkdDSElQMV9DQVAyU1JDKDB4MWYpCisjZGVmaW5lIENGR0NISVAxX0NBUDJTUkNfRUNBUF9QSU4JCUNGR0NISVAxX0NBUDJTUkMoMHgwKQorI2RlZmluZSBDRkdDSElQMV9DQVAyU1JDX01DQVNQMF9UWAkJQ0ZHQ0hJUDFfQ0FQMlNSQygweDEpCisjZGVmaW5lIENGR0NISVAxX0NBUDJTUkNfTUNBU1AwX1JYCQlDRkdDSElQMV9DQVAyU1JDKDB4MikKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMlNSQ19FTUFDX0MwX1JYX1RIUkVTSE9MRAlDRkdDSElQMV9DQVAyU1JDKDB4NykKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMlNSQ19FTUFDX0MwX1JYCQlDRkdDSElQMV9DQVAyU1JDKDB4OCkKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMlNSQ19FTUFDX0MwX1RYCQlDRkdDSElQMV9DQVAyU1JDKDB4OSkKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMlNSQ19FTUFDX0MwX01JU0MJCUNGR0NISVAxX0NBUDJTUkMoMHhhKQorI2RlZmluZSBDRkdDSElQMV9DQVAyU1JDX0VNQUNfQzFfUlhfVEhSRVNIT0xECUNGR0NISVAxX0NBUDJTUkMoMHhiKQorI2RlZmluZSBDRkdDSElQMV9DQVAyU1JDX0VNQUNfQzFfUlgJCUNGR0NISVAxX0NBUDJTUkMoMHhjKQorI2RlZmluZSBDRkdDSElQMV9DQVAyU1JDX0VNQUNfQzFfVFgJCUNGR0NISVAxX0NBUDJTUkMoMHhkKQorI2RlZmluZSBDRkdDSElQMV9DQVAyU1JDX0VNQUNfQzFfTUlTQwkJQ0ZHQ0hJUDFfQ0FQMlNSQygweGUpCisjZGVmaW5lIENGR0NISVAxX0NBUDJTUkNfRU1BQ19DMl9SWF9USFJFU0hPTEQJQ0ZHQ0hJUDFfQ0FQMlNSQygweGYpCisjZGVmaW5lIENGR0NISVAxX0NBUDJTUkNfRU1BQ19DMl9SWAkJQ0ZHQ0hJUDFfQ0FQMlNSQygweDEwKQorI2RlZmluZSBDRkdDSElQMV9DQVAyU1JDX0VNQUNfQzJfVFgJCUNGR0NISVAxX0NBUDJTUkMoMHgxMSkKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMlNSQ19FTUFDX0MyX01JU0MJCUNGR0NISVAxX0NBUDJTUkMoMHgxMikKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMVNSQyhuKQkJCSgobikgPDwgMjIpCisjZGVmaW5lIENGR0NISVAxX0NBUDFTUkNfTUFTSwkJCUNGR0NISVAxX0NBUDFTUkMoMHgxZikKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMVNSQ19FQ0FQX1BJTgkJQ0ZHQ0hJUDFfQ0FQMVNSQygweDApCisjZGVmaW5lIENGR0NISVAxX0NBUDFTUkNfTUNBU1AwX1RYCQlDRkdDSElQMV9DQVAxU1JDKDB4MSkKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMVNSQ19NQ0FTUDBfUlgJCUNGR0NISVAxX0NBUDFTUkMoMHgyKQorI2RlZmluZSBDRkdDSElQMV9DQVAxU1JDX0VNQUNfQzBfUlhfVEhSRVNIT0xECUNGR0NISVAxX0NBUDFTUkMoMHg3KQorI2RlZmluZSBDRkdDSElQMV9DQVAxU1JDX0VNQUNfQzBfUlgJCUNGR0NISVAxX0NBUDFTUkMoMHg4KQorI2RlZmluZSBDRkdDSElQMV9DQVAxU1JDX0VNQUNfQzBfVFgJCUNGR0NISVAxX0NBUDFTUkMoMHg5KQorI2RlZmluZSBDRkdDSElQMV9DQVAxU1JDX0VNQUNfQzBfTUlTQwkJQ0ZHQ0hJUDFfQ0FQMVNSQygweGEpCisjZGVmaW5lIENGR0NISVAxX0NBUDFTUkNfRU1BQ19DMV9SWF9USFJFU0hPTEQJQ0ZHQ0hJUDFfQ0FQMVNSQygweGIpCisjZGVmaW5lIENGR0NISVAxX0NBUDFTUkNfRU1BQ19DMV9SWAkJQ0ZHQ0hJUDFfQ0FQMVNSQygweGMpCisjZGVmaW5lIENGR0NISVAxX0NBUDFTUkNfRU1BQ19DMV9UWAkJQ0ZHQ0hJUDFfQ0FQMVNSQygweGQpCisjZGVmaW5lIENGR0NISVAxX0NBUDFTUkNfRU1BQ19DMV9NSVNDCQlDRkdDSElQMV9DQVAxU1JDKDB4ZSkKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMVNSQ19FTUFDX0MyX1JYX1RIUkVTSE9MRAlDRkdDSElQMV9DQVAxU1JDKDB4ZikKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMVNSQ19FTUFDX0MyX1JYCQlDRkdDSElQMV9DQVAxU1JDKDB4MTApCisjZGVmaW5lIENGR0NISVAxX0NBUDFTUkNfRU1BQ19DMl9UWAkJQ0ZHQ0hJUDFfQ0FQMVNSQygweDExKQorI2RlZmluZSBDRkdDSElQMV9DQVAxU1JDX0VNQUNfQzJfTUlTQwkJQ0ZHQ0hJUDFfQ0FQMVNSQygweDEyKQorI2RlZmluZSBDRkdDSElQMV9DQVAwU1JDKG4pCQkJKChuKSA8PCAxNykKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMFNSQ19NQVNLCQkJQ0ZHQ0hJUDFfQ0FQMFNSQygweDFmKQorI2RlZmluZSBDRkdDSElQMV9DQVAwU1JDX0VDQVBfUElOCQlDRkdDSElQMV9DQVAwU1JDKDB4MCkKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMFNSQ19NQ0FTUDBfVFgJCUNGR0NISVAxX0NBUDBTUkMoMHgxKQorI2RlZmluZSBDRkdDSElQMV9DQVAwU1JDX01DQVNQMF9SWAkJQ0ZHQ0hJUDFfQ0FQMFNSQygweDIpCisjZGVmaW5lIENGR0NISVAxX0NBUDBTUkNfRU1BQ19DMF9SWF9USFJFU0hPTEQJQ0ZHQ0hJUDFfQ0FQMFNSQygweDcpCisjZGVmaW5lIENGR0NISVAxX0NBUDBTUkNfRU1BQ19DMF9SWAkJQ0ZHQ0hJUDFfQ0FQMFNSQygweDgpCisjZGVmaW5lIENGR0NISVAxX0NBUDBTUkNfRU1BQ19DMF9UWAkJQ0ZHQ0hJUDFfQ0FQMFNSQygweDkpCisjZGVmaW5lIENGR0NISVAxX0NBUDBTUkNfRU1BQ19DMF9NSVNDCQlDRkdDSElQMV9DQVAwU1JDKDB4YSkKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMFNSQ19FTUFDX0MxX1JYX1RIUkVTSE9MRAlDRkdDSElQMV9DQVAwU1JDKDB4YikKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMFNSQ19FTUFDX0MxX1JYCQlDRkdDSElQMV9DQVAwU1JDKDB4YykKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMFNSQ19FTUFDX0MxX1RYCQlDRkdDSElQMV9DQVAwU1JDKDB4ZCkKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMFNSQ19FTUFDX0MxX01JU0MJCUNGR0NISVAxX0NBUDBTUkMoMHhlKQorI2RlZmluZSBDRkdDSElQMV9DQVAwU1JDX0VNQUNfQzJfUlhfVEhSRVNIT0xECUNGR0NISVAxX0NBUDBTUkMoMHhmKQorI2RlZmluZSBDRkdDSElQMV9DQVAwU1JDX0VNQUNfQzJfUlgJCUNGR0NISVAxX0NBUDBTUkMoMHgxMCkKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMFNSQ19FTUFDX0MyX1RYCQlDRkdDSElQMV9DQVAwU1JDKDB4MTEpCisjZGVmaW5lIENGR0NISVAxX0NBUDBTUkNfRU1BQ19DMl9NSVNDCQlDRkdDSElQMV9DQVAwU1JDKDB4MTIpCisjZGVmaW5lIENGR0NISVAxX0hQSUJZVEVBRAkJCUJJVCgxNikKKyNkZWZpbmUgQ0ZHQ0hJUDFfSFBJRU5BCQkJCUJJVCgxNSkKKyNkZWZpbmUgQ0ZHQ0hJUDBfRURNQTMxVEMwREJTKG4pCQkoKG4pIDw8IDEzKQorI2RlZmluZSBDRkdDSElQMF9FRE1BMzFUQzBEQlNfTUFTSwkJQ0ZHQ0hJUDBfRURNQTMxVEMwREJTKDB4MykKKyNkZWZpbmUgQ0ZHQ0hJUDBfRURNQTMxVEMwREJTXzE2CQlDRkdDSElQMF9FRE1BMzFUQzBEQlMoMHgwKQorI2RlZmluZSBDRkdDSElQMF9FRE1BMzFUQzBEQlNfMzIJCUNGR0NISVAwX0VETUEzMVRDMERCUygweDEpCisjZGVmaW5lIENGR0NISVAwX0VETUEzMVRDMERCU182NAkJQ0ZHQ0hJUDBfRURNQTMxVEMwREJTKDB4MikKKyNkZWZpbmUgQ0ZHQ0hJUDFfVEJDTEtTWU5DCQkJQklUKDEyKQorI2RlZmluZSBDRkdDSElQMV9BTVVURVNFTDAobikJCQkoKG4pIDw8IDApCisjZGVmaW5lIENGR0NISVAxX0FNVVRFU0VMMF9NQVNLCQkJQ0ZHQ0hJUDFfQU1VVEVTRUwwKDB4ZikKKyNkZWZpbmUgQ0ZHQ0hJUDFfQU1VVEVTRUwwX0xPVwkJCUNGR0NISVAxX0FNVVRFU0VMMCgweDApCisjZGVmaW5lIENGR0NISVAxX0FNVVRFU0VMMF9CQU5LXzAJCUNGR0NISVAxX0FNVVRFU0VMMCgweDEpCisjZGVmaW5lIENGR0NISVAxX0FNVVRFU0VMMF9CQU5LXzEJCUNGR0NISVAxX0FNVVRFU0VMMCgweDIpCisjZGVmaW5lIENGR0NISVAxX0FNVVRFU0VMMF9CQU5LXzIJCUNGR0NISVAxX0FNVVRFU0VMMCgweDMpCisjZGVmaW5lIENGR0NISVAxX0FNVVRFU0VMMF9CQU5LXzMJCUNGR0NISVAxX0FNVVRFU0VMMCgweDQpCisjZGVmaW5lIENGR0NISVAxX0FNVVRFU0VMMF9CQU5LXzQJCUNGR0NISVAxX0FNVVRFU0VMMCgweDUpCisjZGVmaW5lIENGR0NISVAxX0FNVVRFU0VMMF9CQU5LXzUJCUNGR0NISVAxX0FNVVRFU0VMMCgweDYpCisjZGVmaW5lIENGR0NISVAxX0FNVVRFU0VMMF9CQU5LXzYJCUNGR0NISVAxX0FNVVRFU0VMMCgweDcpCisjZGVmaW5lIENGR0NISVAxX0FNVVRFU0VMMF9CQU5LXzcJCUNGR0NISVAxX0FNVVRFU0VMMCgweDgpCisKKy8qIENGR0NISVAyIChVU0IgUEhZKSByZWdpc3RlciBiaXRzICovCisjZGVmaW5lIENGR0NISVAyX1BIWUNMS0dECQkJQklUKDE3KQorI2RlZmluZSBDRkdDSElQMl9WQlVTU0VOU0UJCQlCSVQoMTYpCisjZGVmaW5lIENGR0NISVAyX1JFU0VUCQkJCUJJVCgxNSkKKyNkZWZpbmUgQ0ZHQ0hJUDJfT1RHTU9ERShuKQkJCSgobikgPDwgMTMpCisjZGVmaW5lIENGR0NISVAyX09UR01PREVfTUFTSwkJCUNGR0NISVAyX09UR01PREUoMHgzKQorI2RlZmluZSBDRkdDSElQMl9PVEdNT0RFX05PX09WRVJSSURFCQlDRkdDSElQMl9PVEdNT0RFKDB4MCkKKyNkZWZpbmUgQ0ZHQ0hJUDJfT1RHTU9ERV9GT1JDRV9IT1NUCQlDRkdDSElQMl9PVEdNT0RFKDB4MSkKKyNkZWZpbmUgQ0ZHQ0hJUDJfT1RHTU9ERV9GT1JDRV9ERVZJQ0UJCUNGR0NISVAyX09UR01PREUoMHgyKQorI2RlZmluZSBDRkdDSElQMl9PVEdNT0RFX0ZPUkNFX0hPU1RfVkJVU19MT1cJQ0ZHQ0hJUDJfT1RHTU9ERSgweDMpCisjZGVmaW5lIENGR0NISVAyX1VTQjFQSFlDTEtNVVgJCQlCSVQoMTIpCisjZGVmaW5lIENGR0NISVAyX1VTQjJQSFlDTEtNVVgJCQlCSVQoMTEpCisjZGVmaW5lIENGR0NISVAyX1BIWVBXUkROCQkJQklUKDEwKQorI2RlZmluZSBDRkdDSElQMl9PVEdQV1JETgkJCUJJVCg5KQorI2RlZmluZSBDRkdDSElQMl9EQVRQT0wJCQkJQklUKDgpCisjZGVmaW5lIENGR0NISVAyX1VTQjFTVVNQRU5ETQkJCUJJVCg3KQorI2RlZmluZSBDRkdDSElQMl9QSFlfUExMT04JCQlCSVQoNikKKyNkZWZpbmUgQ0ZHQ0hJUDJfU0VTRU5ERU4JCQlCSVQoNSkKKyNkZWZpbmUgQ0ZHQ0hJUDJfVkJEVENURU4JCQlCSVQoNCkKKyNkZWZpbmUgQ0ZHQ0hJUDJfUkVGRlJFUShuKQkJCSgobikgPDwgMCkKKyNkZWZpbmUgQ0ZHQ0hJUDJfUkVGRlJFUV9NQVNLCQkJQ0ZHQ0hJUDJfUkVGRlJFUSgweGYpCisjZGVmaW5lIENGR0NISVAyX1JFRkZSRVFfMTJNSFoJCQlDRkdDSElQMl9SRUZGUkVRKDB4MSkKKyNkZWZpbmUgQ0ZHQ0hJUDJfUkVGRlJFUV8yNE1IWgkJCUNGR0NISVAyX1JFRkZSRVEoMHgyKQorI2RlZmluZSBDRkdDSElQMl9SRUZGUkVRXzQ4TUhaCQkJQ0ZHQ0hJUDJfUkVGRlJFUSgweDMpCisjZGVmaW5lIENGR0NISVAyX1JFRkZSRVFfMTlfMk1IWgkJQ0ZHQ0hJUDJfUkVGRlJFUSgweDQpCisjZGVmaW5lIENGR0NISVAyX1JFRkZSRVFfMzhfNE1IWgkJQ0ZHQ0hJUDJfUkVGRlJFUSgweDUpCisjZGVmaW5lIENGR0NISVAyX1JFRkZSRVFfMTNNSFoJCQlDRkdDSElQMl9SRUZGUkVRKDB4NikKKyNkZWZpbmUgQ0ZHQ0hJUDJfUkVGRlJFUV8yNk1IWgkJCUNGR0NISVAyX1JFRkZSRVEoMHg3KQorI2RlZmluZSBDRkdDSElQMl9SRUZGUkVRXzIwTUhaCQkJQ0ZHQ0hJUDJfUkVGRlJFUSgweDgpCisjZGVmaW5lIENGR0NISVAyX1JFRkZSRVFfNDBNSFoJCQlDRkdDSElQMl9SRUZGUkVRKDB4OSkKKworLyogQ0ZHQ0hJUDMgKEVNQUMvdVBQL1BMTDEvQVNZTkMzL1BSVS9ESVY0LjUvRU1JRkEpIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgQ0ZHQ0hJUDNfUk1JSV9TRUwJCQlCSVQoOCkKKyNkZWZpbmUgQ0ZHQ0hJUDNfVVBQX1RYX0NMS1NSQwkJCUJJVCg2KQorI2RlZmluZSBDRkdDSElQM19QTEwxX01BU1RFUl9MT0NLCQlCSVQoNSkKKyNkZWZpbmUgQ0ZHQ0hJUDNfQVNZTkMzX0NMS1NSQwkJCUJJVCg0KQorI2RlZmluZSBDRkdDSElQM19QUlVFVlRTRUwJCQlCSVQoMykKKyNkZWZpbmUgQ0ZHQ0hJUDNfRElWNDVQRU5BCQkJQklUKDIpCisjZGVmaW5lIENGR0NISVAzX0VNQV9DTEtTUkMJCQlCSVQoMSkKKworLyogQ0ZHQ0hJUDQgKE1jQVNQMCBBTVVOVEVJTikgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBDRkdDSElQNF9BTVVURUNMUjAJCQlCSVQoMCkKKworI2VuZGlmIC8qIF9fTElOVVhfTUZEX0RBOFhYX0NGR0NISVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvdGlfYW0zMzV4X3RzY2FkYy5oIGIvaW5jbHVkZS9saW51eC9tZmQvdGlfYW0zMzV4X3RzY2FkYy5oCmluZGV4IDI1NjdhODcuLjdmNTViOGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3RpX2FtMzM1eF90c2NhZGMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC90aV9hbTMzNXhfdHNjYWRjLmgKQEAgLTEzOCwxNiArMTM4LDE2IEBACiAvKgogICogdGltZSBpbiB1cyBmb3IgcHJvY2Vzc2luZyBhIHNpbmdsZSBjaGFubmVsLCBjYWxjdWxhdGVkIGFzIGZvbGxvd3M6CiAgKgotICogbnVtIGN5Y2xlcyA9IG9wZW4gZGVsYXkgKyAoc2FtcGxlIGRlbGF5ICsgY29udiB0aW1lKSAqIGF2ZXJhZ2luZworICogbWF4IG51bSBjeWNsZXMgPSBvcGVuIGRlbGF5ICsgKHNhbXBsZSBkZWxheSArIGNvbnYgdGltZSkgKiBhdmVyYWdpbmcKICAqCi0gKiBudW0gY3ljbGVzOiAxNTIgKyAoMSArIDEzKSAqIDE2ID0gMzc2CisgKiBtYXggbnVtIGN5Y2xlczogMjYyMTQzICsgKDI1NSArIDEzKSAqIDE2ID0gMjY2NDMxCiAgKgogICogY2xvY2sgZnJlcXVlbmN5OiAyNk1IeiAvIDggPSAzLjI1TUh6CiAgKiBjbG9jayBwZXJpb2Q6IDEgLyAzLjI1TUh6ID0gMzA4bnMKICAqCi0gKiBwcm9jZXNzaW5nIHRpbWU6IDM3NiAqIDMwOG5zID0gMTE2dXMKKyAqIG1heCBwcm9jZXNzaW5nIHRpbWU6IDI2NjQzMSAqIDMwOG5zID0gODNtcyhhcHByb3gpCiAgKi8KLSNkZWZpbmUgSURMRV9USU1FT1VUIDExNiAvKiBtaWNyb3NlYyAqLworI2RlZmluZSBJRExFX1RJTUVPVVQgODMgLyogbWlsbGlzZWNvbmRzICovCiAKICNkZWZpbmUgVFNDQURDX0NFTExTCQkyCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3RwczY1MjE4LmggYi9pbmNsdWRlL2xpbnV4L21mZC90cHM2NTIxOC5oCmluZGV4IDdmZGY1MzIuLmQxZGI5NTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3RwczY1MjE4LmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvdHBzNjUyMTguaApAQCAtNjMsNiArNjMsMTEgQEAKICNkZWZpbmUgVFBTNjUyMThfQ0hJUElEX0NISVBfTUFTSwkweEY4CiAjZGVmaW5lIFRQUzY1MjE4X0NISVBJRF9SRVZfTUFTSwkweDA3CiAKKyNkZWZpbmUgVFBTNjUyMThfUkVWXzFfMAkJMHgwCisjZGVmaW5lIFRQUzY1MjE4X1JFVl8xXzEJCTB4MQorI2RlZmluZSBUUFM2NTIxOF9SRVZfMl8wCQkweDIKKyNkZWZpbmUgVFBTNjUyMThfUkVWXzJfMQkJMHgzCisKICNkZWZpbmUgVFBTNjUyMThfSU5UMV9WUFJHCQlCSVQoNSkKICNkZWZpbmUgVFBTNjUyMThfSU5UMV9BQwkJQklUKDQpCiAjZGVmaW5lIFRQUzY1MjE4X0lOVDFfUEIJCUJJVCgzKQpAQCAtMjY3LDYgKzI3Miw3IEBACiBzdHJ1Y3QgdHBzNjUyMTggewogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAl1bnNpZ25lZCBpbnQgaWQ7CisJdTggcmV2OwogCiAJc3RydWN0IG11dGV4IHRwc19sb2NrOwkJLyogbG9jayBndWFyZGluZyB0aGUgZGF0YSBzdHJ1Y3R1cmUgKi8KIAkvKiBJUlEgRGF0YSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9taXNjZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L21pc2NkZXZpY2UuaAppbmRleCA1NDMwMzc0Li43MjI2OThhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21pc2NkZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L21pc2NkZXZpY2UuaApAQCAtMyw2ICszLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogCiAvKgogICoJVGhlc2UgYWxsb2NhdGlvbnMgYXJlIG1hbmFnZWQgYnkgZGV2aWNlQGxhbmFuYS5vcmcuIElmIHlvdSB1c2UgYW4KQEAgLTcwLDYgKzcxLDEzIEBACiBleHRlcm4gaW50IG1pc2NfcmVnaXN0ZXIoc3RydWN0IG1pc2NkZXZpY2UgKm1pc2MpOwogZXh0ZXJuIHZvaWQgbWlzY19kZXJlZ2lzdGVyKHN0cnVjdCBtaXNjZGV2aWNlICptaXNjKTsKIAorLyoKKyAqIEhlbHBlciBtYWNybyBmb3IgZHJpdmVycyB0aGF0IGRvbid0IGRvIGFueXRoaW5nIHNwZWNpYWwgaW4gbW9kdWxlIGluaXQgLyBleGl0CisgKiBjYWxsLiBUaGlzIGhlbHBzIGluIGVsZW1pbmF0aW5nIG9mIGJvaWxlcnBsYXRlIGNvZGUuCisgKi8KKyNkZWZpbmUgbW9kdWxlX21pc2NfZGV2aWNlKF9fbWlzY19kZXZpY2UpIFwKKwltb2R1bGVfZHJpdmVyKF9fbWlzY19kZXZpY2UsIG1pc2NfcmVnaXN0ZXIsIG1pc2NfZGVyZWdpc3RlcikKKwogI2RlZmluZSBNT0RVTEVfQUxJQVNfTUlTQ0RFVihtaW5vcikJCQkJXAogCU1PRFVMRV9BTElBUygiY2hhci1tYWpvci0iIF9fc3RyaW5naWZ5KE1JU0NfTUFKT1IpCVwKIAkiLSIgX19zdHJpbmdpZnkobWlub3IpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbHg0L2NtZC5oIGIvaW5jbHVkZS9saW51eC9tbHg0L2NtZC5oCmluZGV4IDExNmIyODQuLjFmMzU2ODYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWx4NC9jbWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L21seDQvY21kLmgKQEAgLTMwOSw3ICszMDksOCBAQAogCQkgICAgICBzdHJ1Y3QgaWZsYV92Zl9zdGF0cyAqdmZfc3RhdHMpOwogdTMyIG1seDRfY29tbV9nZXRfdmVyc2lvbih2b2lkKTsKIGludCBtbHg0X3NldF92Zl9tYWMoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBwb3J0LCBpbnQgdmYsIHU2NCBtYWMpOwotaW50IG1seDRfc2V0X3ZmX3ZsYW4oc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBwb3J0LCBpbnQgdmYsIHUxNiB2bGFuLCB1OCBxb3MpOworaW50IG1seDRfc2V0X3ZmX3ZsYW4oc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBwb3J0LCBpbnQgdmYsIHUxNiB2bGFuLAorCQkgICAgIHU4IHFvcywgX19iZTE2IHByb3RvKTsKIGludCBtbHg0X3NldF92Zl9yYXRlKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgcG9ydCwgaW50IHZmLCBpbnQgbWluX3R4X3JhdGUsCiAJCSAgICAgaW50IG1heF90eF9yYXRlKTsKIGludCBtbHg0X3NldF92Zl9zcG9vZmNoayhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHBvcnQsIGludCB2ZiwgYm9vbCBzZXR0aW5nKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWx4NC9kZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvbWx4NC9kZXZpY2UuaAppbmRleCA0MmRhMzU1Li41OWI1MGQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21seDQvZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbHg0L2RldmljZS5oCkBAIC0yMjEsNiArMjIxLDcgQEAKIAlNTFg0X0RFVl9DQVBfRkxBRzJfUk9DRV9WMV9WMgkJPSAxVUxMIDw8ICAzMywKIAlNTFg0X0RFVl9DQVBfRkxBRzJfRE1GU19VQ19NQ19TTklGRkVSICAgPSAxVUxMIDw8ICAzNCwKIAlNTFg0X0RFVl9DQVBfRkxBRzJfRElBR19QRVJfUE9SVAk9IDFVTEwgPDwgIDM1LAorCU1MWDRfREVWX0NBUF9GTEFHMl9TVkxBTl9CWV9RUCAgICAgICAgICA9IDFVTEwgPDwgIDM2LAogfTsKIAogZW51bSB7CkBAIC0xMzcxLDYgKzEzNzIsOCBAQAogaW50IG1seDRfU0VUX1BPUlRfVlhMQU4oc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIHU4IHN0ZWVyaW5nLCBpbnQgZW5hYmxlKTsKIGludCBzZXRfcGh2X2JpdChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgaW50IG5ld192YWwpOwogaW50IGdldF9waHZfYml0KHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LCBpbnQgKnBodik7CitpbnQgbWx4NF9nZXRfaXNfdmxhbl9vZmZsb2FkX2Rpc2FibGVkKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LAorCQkJCSAgICAgIGJvb2wgKnZsYW5fb2ZmbG9hZF9kaXNhYmxlZCk7CiBpbnQgbWx4NF9maW5kX2NhY2hlZF9tYWMoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIHU2NCBtYWMsIGludCAqaWR4KTsKIGludCBtbHg0X2ZpbmRfY2FjaGVkX3ZsYW4oc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIHUxNiB2aWQsIGludCAqaWR4KTsKIGludCBtbHg0X3JlZ2lzdGVyX3ZsYW4oc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIHUxNiB2bGFuLCBpbnQgKmluZGV4KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWx4NC9xcC5oIGIvaW5jbHVkZS9saW51eC9tbHg0L3FwLmgKaW5kZXggZGVhYTIyMS4uYjRlZThmNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbHg0L3FwLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbHg0L3FwLmgKQEAgLTE2MCw2ICsxNjAsNyBAQAogCiBlbnVtIHsgLyogZmwgKi8KIAlNTFg0X0ZMX0NWCT0gMSA8PCA2LAorCU1MWDRfRkxfU1YJPSAxIDw8IDUsCiAJTUxYNF9GTF9FVEhfSElERV9DUUVfVkxBTgk9IDEgPDwgMiwKIAlNTFg0X0ZMX0VUSF9TUkNfQ0hFQ0tfTUNfTEIJPSAxIDw8IDEsCiAJTUxYNF9GTF9FVEhfU1JDX0NIRUNLX1VDX0xCCT0gMSA8PCAwLApAQCAtMjY3LDYgKzI2OCw3IEBACiAJTUxYNF9VUERfUVBfUEFUSF9NQVNLX0ZWTF9SWAkJCT0gMTYgKyAzMiwKIAlNTFg0X1VQRF9RUF9QQVRIX01BU0tfRVRIX1NSQ19DSEVDS19VQ19MQgk9IDE4ICsgMzIsCiAJTUxYNF9VUERfUVBfUEFUSF9NQVNLX0VUSF9TUkNfQ0hFQ0tfTUNfTEIJPSAxOSArIDMyLAorCU1MWDRfVVBEX1FQX1BBVEhfTUFTS19TVgkJCT0gMjIgKyAzMiwKIH07CiAKIGVudW0geyAvKiBwYXJhbTMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWx4NS9jcS5oIGIvaW5jbHVkZS9saW51eC9tbHg1L2NxLmgKaW5kZXggMjU2NmY2ZC4uN2MzYzBkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbHg1L2NxLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbHg1L2NxLmgKQEAgLTE3MCwxMiArMTcwLDEyIEBACiBpbnQgbWx4NV9pbml0X2NxX3RhYmxlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOwogdm9pZCBtbHg1X2NsZWFudXBfY3FfdGFibGUoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7CiBpbnQgbWx4NV9jb3JlX2NyZWF0ZV9jcShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9jb3JlX2NxICpjcSwKLQkJCXN0cnVjdCBtbHg1X2NyZWF0ZV9jcV9tYm94X2luICppbiwgaW50IGlubGVuKTsKKwkJCXUzMiAqaW4sIGludCBpbmxlbik7CiBpbnQgbWx4NV9jb3JlX2Rlc3Ryb3lfY3Eoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG1seDVfY29yZV9jcSAqY3EpOwogaW50IG1seDVfY29yZV9xdWVyeV9jcShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9jb3JlX2NxICpjcSwKLQkJICAgICAgIHN0cnVjdCBtbHg1X3F1ZXJ5X2NxX21ib3hfb3V0ICpvdXQpOworCQkgICAgICAgdTMyICpvdXQsIGludCBvdXRsZW4pOwogaW50IG1seDVfY29yZV9tb2RpZnlfY3Eoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG1seDVfY29yZV9jcSAqY3EsCi0JCQlzdHJ1Y3QgbWx4NV9tb2RpZnlfY3FfbWJveF9pbiAqaW4sIGludCBpbl9zeik7CisJCQl1MzIgKmluLCBpbnQgaW5sZW4pOwogaW50IG1seDVfY29yZV9tb2RpZnlfY3FfbW9kZXJhdGlvbihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAogCQkJCSAgIHN0cnVjdCBtbHg1X2NvcmVfY3EgKmNxLCB1MTYgY3FfcGVyaW9kLAogCQkJCSAgIHUxNiBjcV9tYXhfY291bnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbHg1L2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9tbHg1L2RldmljZS5oCmluZGV4IDBiNmQxNWMuLjc3YzE0MTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWx4NS9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L21seDUvZGV2aWNlLmgKQEAgLTE5OCwxOSArMTk4LDYgQEAKIH07CiAKIGVudW0gewotCU1MWDVfQUNDRVNTX01PREVfUEEJPSAwLAotCU1MWDVfQUNDRVNTX01PREVfTVRUCT0gMSwKLQlNTFg1X0FDQ0VTU19NT0RFX0tMTQk9IDIKLX07Ci0KLWVudW0gewotCU1MWDVfTUtFWV9SRU1PVEVfSU5WQUwJPSAxIDw8IDI0LAotCU1MWDVfTUtFWV9GTEFHX1NZTkNfVU1SID0gMSA8PCAyOSwKLQlNTFg1X01LRVlfQlNGX0VOCT0gMSA8PCAzMCwKLQlNTFg1X01LRVlfTEVONjQJCT0gMSA8PCAzMSwKLX07Ci0KLWVudW0gewogCU1MWDVfRU5fUkQJPSAodTY0KTEsCiAJTUxYNV9FTl9XUgk9ICh1NjQpMgogfTsKQEAgLTQxMSwzMyArMzk4LDYgQEAKIAlNTFg1X01BWF9TR0VfUkQJPSAoNTEyIC0gMTYgLSAxNikgLyAxNgogfTsKIAotc3RydWN0IG1seDVfaW5ib3hfaGRyIHsKLQlfX2JlMTYJCW9wY29kZTsKLQl1OAkJcnN2ZFs0XTsKLQlfX2JlMTYJCW9wbW9kOwotfTsKLQotc3RydWN0IG1seDVfb3V0Ym94X2hkciB7Ci0JdTgJCXN0YXR1czsKLQl1OAkJcnN2ZFszXTsKLQlfX2JlMzIJCXN5bmRyb21lOwotfTsKLQotc3RydWN0IG1seDVfY21kX3F1ZXJ5X2FkYXB0ZXJfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmRbOF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9jbWRfcXVlcnlfYWRhcHRlcl9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkMFsyNF07Ci0JdTgJCQlpbnRhcGluOwotCXU4CQkJcnN2ZDFbMTNdOwotCV9fYmUxNgkJCXZzZF92ZW5kb3JfaWQ7Ci0JdTgJCQl2c2RbMjA4XTsKLQl1OAkJCXZzZF9wc2lkWzE2XTsKLX07Ci0KIGVudW0gbWx4NV9vZHBfdHJhbnNwb3J0X2NhcF9iaXRzIHsKIAlNTFg1X09EUF9TVVBQT1JUX1NFTkQJID0gMSA8PCAzMSwKIAlNTFg1X09EUF9TVVBQT1JUX1JFQ1YJID0gMSA8PCAzMCwKQEAgLTQ1NSwzMCArNDE1LDYgQEAKIAljaGFyIHJlc2VydmVkMlsweGU0XTsKIH07CiAKLXN0cnVjdCBtbHg1X2NtZF9pbml0X2hjYV9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZDBbMl07Ci0JX19iZTE2CQkJcHJvZmlsZTsKLQl1OAkJCXJzdmQxWzRdOwotfTsKLQotc3RydWN0IG1seDVfY21kX2luaXRfaGNhX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmRbOF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9jbWRfdGVhcmRvd25faGNhX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkMFsyXTsKLQlfX2JlMTYJCQlwcm9maWxlOwotCXU4CQkJcnN2ZDFbNF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9jbWRfdGVhcmRvd25faGNhX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmRbOF07Ci19OwotCiBzdHJ1Y3QgbWx4NV9jbWRfbGF5b3V0IHsKIAl1OAkJdHlwZTsKIAl1OAkJcnN2ZDBbM107CkBAIC00OTQsNyArNDMwLDYgQEAKIAl1OAkJc3RhdHVzX293bjsKIH07CiAKLQogc3RydWN0IGhlYWx0aF9idWZmZXIgewogCV9fYmUzMgkJYXNzZXJ0X3Zhcls1XTsKIAlfX2JlMzIJCXJzdmQwWzNdOwpAQCAtODU2LDI0NSArNzkxLDE1IEBACiAJc3RydWN0IG1seDVfY3FlNjQJY3FlNjQ7CiB9OwogCi1zdHJ1Y3QgbWx4NV9zcnFfY3R4IHsKLQl1OAkJCXN0YXRlX2xvZ19zejsKLQl1OAkJCXJzdmQwWzNdOwotCV9fYmUzMgkJCWZsYWdzX3hyY2Q7Ci0JX19iZTMyCQkJcGdvZmZfY3FuOwotCXU4CQkJcnN2ZDFbNF07Ci0JdTgJCQlsb2dfcGdfc3o7Ci0JdTgJCQlyc3ZkMls3XTsKLQlfX2JlMzIJCQlwZDsKLQlfX2JlMTYJCQlsd207Ci0JX19iZTE2CQkJd3FlX2NudDsKLQl1OAkJCXJzdmQzWzhdOwotCV9fYmU2NAkJCWRiX3JlY29yZDsKLX07Ci0KLXN0cnVjdCBtbHg1X2NyZWF0ZV9zcnFfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQlpbnB1dF9zcnFuOwotCXU4CQkJcnN2ZDBbNF07Ci0Jc3RydWN0IG1seDVfc3JxX2N0eAljdHg7Ci0JdTgJCQlyc3ZkMVsyMDhdOwotCV9fYmU2NAkJCXBhc1swXTsKLX07Ci0KLXN0cnVjdCBtbHg1X2NyZWF0ZV9zcnFfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCV9fYmUzMgkJCXNycW47Ci0JdTgJCQlyc3ZkWzRdOwotfTsKLQotc3RydWN0IG1seDVfZGVzdHJveV9zcnFfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQlzcnFuOwotCXU4CQkJcnN2ZFs0XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2Rlc3Ryb3lfc3JxX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmRbOF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9xdWVyeV9zcnFfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQlzcnFuOwotCXU4CQkJcnN2ZDBbNF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9xdWVyeV9zcnFfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZDBbOF07Ci0Jc3RydWN0IG1seDVfc3JxX2N0eAljdHg7Ci0JdTgJCQlyc3ZkMVszMl07Ci0JX19iZTY0CQkJcGFzWzBdOwotfTsKLQotc3RydWN0IG1seDVfYXJtX3NycV9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCV9fYmUzMgkJCXNycW47Ci0JX19iZTE2CQkJcnN2ZDsKLQlfX2JlMTYJCQlsd207Ci19OwotCi1zdHJ1Y3QgbWx4NV9hcm1fc3JxX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmRbOF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9jcV9jb250ZXh0IHsKLQl1OAkJCXN0YXR1czsKLQl1OAkJCWNxZV9zel9mbGFnczsKLQl1OAkJCXN0OwotCXU4CQkJcnN2ZDM7Ci0JdTgJCQlyc3ZkNFs2XTsKLQlfX2JlMTYJCQlwYWdlX29mZnNldDsKLQlfX2JlMzIJCQlsb2dfc3pfdXNyX3BhZ2U7Ci0JX19iZTE2CQkJY3FfcGVyaW9kOwotCV9fYmUxNgkJCWNxX21heF9jb3VudDsKLQlfX2JlMTYJCQlyc3ZkMjA7Ci0JX19iZTE2CQkJY19lcW47Ci0JdTgJCQlsb2dfcGdfc3o7Ci0JdTgJCQlyc3ZkMjVbN107Ci0JX19iZTMyCQkJbGFzdF9ub3RpZmllZF9pbmRleDsKLQlfX2JlMzIJCQlzb2xpY2l0X3Byb2R1Y2VyX2luZGV4OwotCV9fYmUzMgkJCWNvbnN1bWVyX2NvdW50ZXI7Ci0JX19iZTMyCQkJcHJvZHVjZXJfY291bnRlcjsKLQl1OAkJCXJzdmQ0OFs4XTsKLQlfX2JlNjQJCQlkYl9yZWNvcmRfYWRkcjsKLX07Ci0KLXN0cnVjdCBtbHg1X2NyZWF0ZV9jcV9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCV9fYmUzMgkJCWlucHV0X2NxbjsKLQl1OAkJCXJzdmR4WzRdOwotCXN0cnVjdCBtbHg1X2NxX2NvbnRleHQJY3R4OwotCXU4CQkJcnN2ZDZbMTkyXTsKLQlfX2JlNjQJCQlwYXNbMF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9jcmVhdGVfY3FfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCV9fYmUzMgkJCWNxbjsKLQl1OAkJCXJzdmQwWzRdOwotfTsKLQotc3RydWN0IG1seDVfZGVzdHJveV9jcV9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCV9fYmUzMgkJCWNxbjsKLQl1OAkJCXJzdmQwWzRdOwotfTsKLQotc3RydWN0IG1seDVfZGVzdHJveV9jcV9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkMFs4XTsKLX07Ci0KLXN0cnVjdCBtbHg1X3F1ZXJ5X2NxX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JX19iZTMyCQkJY3FuOwotCXU4CQkJcnN2ZDBbNF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9xdWVyeV9jcV9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkMFs4XTsKLQlzdHJ1Y3QgbWx4NV9jcV9jb250ZXh0CWN0eDsKLQl1OAkJCXJzdmQ2WzE2XTsKLQlfX2JlNjQJCQlwYXNbMF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9tb2RpZnlfY3FfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQljcW47Ci0JX19iZTMyCQkJZmllbGRfc2VsZWN0OwotCXN0cnVjdCBtbHg1X2NxX2NvbnRleHQJY3R4OwotCXU4CQkJcnN2ZFsxOTJdOwotCV9fYmU2NAkJCXBhc1swXTsKLX07Ci0KLXN0cnVjdCBtbHg1X21vZGlmeV9jcV9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkWzhdOwotfTsKLQotc3RydWN0IG1seDVfZW5hYmxlX2hjYV9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZFs4XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2VuYWJsZV9oY2FfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZFs4XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2Rpc2FibGVfaGNhX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkWzhdOwotfTsKLQotc3RydWN0IG1seDVfZGlzYWJsZV9oY2FfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZFs4XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2VxX2NvbnRleHQgewotCXU4CQkJc3RhdHVzOwotCXU4CQkJZWNfb2k7Ci0JdTgJCQlzdDsKLQl1OAkJCXJzdmQyWzddOwotCV9fYmUxNgkJCXBhZ2VfcGZmc2V0OwotCV9fYmUzMgkJCWxvZ19zel91c3JfcGFnZTsKLQl1OAkJCXJzdmQzWzddOwotCXU4CQkJaW50cjsKLQl1OAkJCWxvZ19wYWdlX3NpemU7Ci0JdTgJCQlyc3ZkNFsxNV07Ci0JX19iZTMyCQkJY29uc3VtZXJfY291bnRlcjsKLQlfX2JlMzIJCQlwcm9kdXNlcl9jb3VudGVyOwotCXU4CQkJcnN2ZDVbMTZdOwotfTsKLQotc3RydWN0IG1seDVfY3JlYXRlX2VxX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkMFszXTsKLQl1OAkJCWlucHV0X2VxbjsKLQl1OAkJCXJzdmQxWzRdOwotCXN0cnVjdCBtbHg1X2VxX2NvbnRleHQJY3R4OwotCXU4CQkJcnN2ZDJbOF07Ci0JX19iZTY0CQkJZXZlbnRzX21hc2s7Ci0JdTgJCQlyc3ZkM1sxNzZdOwotCV9fYmU2NAkJCXBhc1swXTsKLX07Ci0KLXN0cnVjdCBtbHg1X2NyZWF0ZV9lcV9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkMFszXTsKLQl1OAkJCWVxX251bWJlcjsKLQl1OAkJCXJzdmQxWzRdOwotfTsKLQotc3RydWN0IG1seDVfZGVzdHJveV9lcV9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZDBbM107Ci0JdTgJCQllcW47Ci0JdTgJCQlyc3ZkMVs0XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2Rlc3Ryb3lfZXFfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZFs4XTsKLX07Ci0KLXN0cnVjdCBtbHg1X21hcF9lcV9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCV9fYmU2NAkJCW1hc2s7Ci0JdTgJCQltdTsKLQl1OAkJCXJzdmQwWzJdOwotCXU4CQkJZXFuOwotCXU4CQkJcnN2ZDFbMjRdOwotfTsKLQotc3RydWN0IG1seDVfbWFwX2VxX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmRbOF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9xdWVyeV9lcV9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZDBbM107Ci0JdTgJCQllcW47Ci0JdTgJCQlyc3ZkMVs0XTsKLX07Ci0KLXN0cnVjdCBtbHg1X3F1ZXJ5X2VxX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmRbOF07Ci0Jc3RydWN0IG1seDVfZXFfY29udGV4dAljdHg7CitlbnVtIHsKKwlNTFg1X01LRVlfU1RBVFVTX0ZSRUUgPSAxIDw8IDYsCiB9OwogCiBlbnVtIHsKLQlNTFg1X01LRVlfU1RBVFVTX0ZSRUUgPSAxIDw8IDYsCisJTUxYNV9NS0VZX1JFTU9URV9JTlZBTAk9IDEgPDwgMjQsCisJTUxYNV9NS0VZX0ZMQUdfU1lOQ19VTVIgPSAxIDw8IDI5LAorCU1MWDVfTUtFWV9CU0ZfRU4JPSAxIDw8IDMwLAorCU1MWDVfTUtFWV9MRU42NAkJPSAxIDw8IDMxLAogfTsKIAogc3RydWN0IG1seDVfbWtleV9zZWcgewpAQCAtMTExOSwxMzQgKzgyNCwxMiBAQAogCXU4CQlyc3ZkNFs0XTsKIH07CiAKLXN0cnVjdCBtbHg1X3F1ZXJ5X3NwZWNpYWxfY3R4c19tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZFs4XTsKLX07Ci0KLXN0cnVjdCBtbHg1X3F1ZXJ5X3NwZWNpYWxfY3R4c19tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JX19iZTMyCQkJZHVtcF9maWxsX21rZXk7Ci0JX19iZTMyCQkJcmVzZXJ2ZWRfbGtleTsKLX07Ci0KLXN0cnVjdCBtbHg1X2NyZWF0ZV9ta2V5X21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JX19iZTMyCQkJaW5wdXRfbWtleV9pbmRleDsKLQlfX2JlMzIJCQlmbGFnczsKLQlzdHJ1Y3QgbWx4NV9ta2V5X3NlZwlzZWc7Ci0JdTgJCQlyc3ZkMVsxNl07Ci0JX19iZTMyCQkJeGxhdF9vY3RfYWN0X3NpemU7Ci0JX19iZTMyCQkJcnN2ZDI7Ci0JdTgJCQlyc3ZkM1sxNjhdOwotCV9fYmU2NAkJCXBhc1swXTsKLX07Ci0KLXN0cnVjdCBtbHg1X2NyZWF0ZV9ta2V5X21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQlta2V5OwotCXU4CQkJcnN2ZFs0XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2Rlc3Ryb3lfbWtleV9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCV9fYmUzMgkJCW1rZXk7Ci0JdTgJCQlyc3ZkWzRdOwotfTsKLQotc3RydWN0IG1seDVfZGVzdHJveV9ta2V5X21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmRbOF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9xdWVyeV9ta2V5X21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JX19iZTMyCQkJbWtleTsKLX07Ci0KLXN0cnVjdCBtbHg1X3F1ZXJ5X21rZXlfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCV9fYmU2NAkJCXBhc1swXTsKLX07Ci0KLXN0cnVjdCBtbHg1X21vZGlmeV9ta2V5X21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JX19iZTMyCQkJbWtleTsKLQlfX2JlNjQJCQlwYXNbMF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9tb2RpZnlfbWtleV9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkWzhdOwotfTsKLQotc3RydWN0IG1seDVfZHVtcF9ta2V5X21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci19OwotCi1zdHJ1Y3QgbWx4NV9kdW1wX21rZXlfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCV9fYmUzMgkJCW1rZXk7Ci19OwotCi1zdHJ1Y3QgbWx4NV9tYWRfaWZjX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JX19iZTE2CQkJcmVtb3RlX2xpZDsKLQl1OAkJCXJzdmQwOwotCXU4CQkJcG9ydDsKLQl1OAkJCXJzdmQxWzRdOwotCXU4CQkJZGF0YVsyNTZdOwotfTsKLQotc3RydWN0IG1seDVfbWFkX2lmY19tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkWzhdOwotCXU4CQkJZGF0YVsyNTZdOwotfTsKLQotc3RydWN0IG1seDVfYWNjZXNzX3JlZ19tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJCWhkcjsKLQl1OAkJCQlyc3ZkMFsyXTsKLQlfX2JlMTYJCQkJcmVnaXN0ZXJfaWQ7Ci0JX19iZTMyCQkJCWFyZzsKLQlfX2JlMzIJCQkJZGF0YVswXTsKLX07Ci0KLXN0cnVjdCBtbHg1X2FjY2Vzc19yZWdfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJCWhkcjsKLQl1OAkJCQlyc3ZkWzhdOwotCV9fYmUzMgkJCQlkYXRhWzBdOwotfTsKLQogI2RlZmluZSBNTFg1X0FUVFJfRVhURU5ERURfUE9SVF9JTkZPCWNwdV90b19iZTE2KDB4ZmY5MCkKIAogZW51bSB7CiAJTUxYX0VYVF9QT1JUX0NBUF9GTEFHX0VYVEVOREVEX1BPUlRfSU5GTwk9IDEgPDwgIDAKIH07CiAKLXN0cnVjdCBtbHg1X2FsbG9jYXRlX3Bzdl9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyICAgaGRyOwotCV9fYmUzMgkJCW5wc3ZfcGQ7Ci0JX19iZTMyCQkJcnN2ZF9wc3YwOwotfTsKLQotc3RydWN0IG1seDVfYWxsb2NhdGVfcHN2X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkciAgaGRyOwotCXU4CQkJcnN2ZFs4XTsKLQlfX2JlMzIJCQlwc3ZfaWR4WzRdOwotfTsKLQotc3RydWN0IG1seDVfZGVzdHJveV9wc3ZfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JX19iZTMyICAgICAgICAgICAgICAgICAgcHN2X251bWJlcjsKLQl1OCAgICAgICAgICAgICAgICAgICAgICByc3ZkWzRdOwotfTsKLQotc3RydWN0IG1seDVfZGVzdHJveV9wc3Zfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyICBoZHI7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgcnN2ZFs4XTsKLX07Ci0KIGVudW0gewogCVZQT1JUX1NUQVRFX0RPV04JCT0gMHgwLAogCVZQT1JUX1NUQVRFX1VQCQkJPSAweDEsCkBAIC0xMzgxLDYgKzk2NCwxOCBAQAogI2RlZmluZSBNTFg1X0NBUF9GTE9XVEFCTEVfTklDX1JYX01BWChtZGV2LCBjYXApIFwKIAlNTFg1X0NBUF9GTE9XVEFCTEVfTUFYKG1kZXYsIGZsb3dfdGFibGVfcHJvcGVydGllc19uaWNfcmVjZWl2ZS5jYXApCiAKKyNkZWZpbmUgTUxYNV9DQVBfRkxPV1RBQkxFX1NOSUZGRVJfUlgobWRldiwgY2FwKSBcCisJTUxYNV9DQVBfRkxPV1RBQkxFKG1kZXYsIGZsb3dfdGFibGVfcHJvcGVydGllc19uaWNfcmVjZWl2ZV9zbmlmZmVyLmNhcCkKKworI2RlZmluZSBNTFg1X0NBUF9GTE9XVEFCTEVfU05JRkZFUl9SWF9NQVgobWRldiwgY2FwKSBcCisJTUxYNV9DQVBfRkxPV1RBQkxFX01BWChtZGV2LCBmbG93X3RhYmxlX3Byb3BlcnRpZXNfbmljX3JlY2VpdmVfc25pZmZlci5jYXApCisKKyNkZWZpbmUgTUxYNV9DQVBfRkxPV1RBQkxFX1NOSUZGRVJfVFgobWRldiwgY2FwKSBcCisJTUxYNV9DQVBfRkxPV1RBQkxFKG1kZXYsIGZsb3dfdGFibGVfcHJvcGVydGllc19uaWNfdHJhbnNtaXRfc25pZmZlci5jYXApCisKKyNkZWZpbmUgTUxYNV9DQVBfRkxPV1RBQkxFX1NOSUZGRVJfVFhfTUFYKG1kZXYsIGNhcCkgXAorCU1MWDVfQ0FQX0ZMT1dUQUJMRV9NQVgobWRldiwgZmxvd190YWJsZV9wcm9wZXJ0aWVzX25pY190cmFuc21pdF9zbmlmZmVyLmNhcCkKKwogI2RlZmluZSBNTFg1X0NBUF9FU1dfRkxPV1RBQkxFKG1kZXYsIGNhcCkgXAogCU1MWDVfR0VUKGZsb3dfdGFibGVfZXN3aXRjaF9jYXAsIFwKIAkJIG1kZXYtPmhjYV9jYXBzX2N1cltNTFg1X0NBUF9FU1dJVENIX0ZMT1dfVEFCTEVdLCBjYXApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21seDUvZHJpdmVyLmggYi9pbmNsdWRlL2xpbnV4L21seDUvZHJpdmVyLmgKaW5kZXggY2NlYTZmYi4uODVjNDc4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbHg1L2RyaXZlci5oCisrKyBiL2luY2x1ZGUvbGludXgvbWx4NS9kcml2ZXIuaApAQCAtNDksMTAgKzQ5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tbHg1L3NycS5oPgogCiBlbnVtIHsKLQlNTFg1X1JRX0JJVE1BU0tfVlNEID0gMSA8PCAxLAotfTsKLQotZW51bSB7CiAJTUxYNV9CT0FSRF9JRF9MRU4gPSA2NCwKIAlNTFg1X01BWF9OQU1FX0xFTiA9IDE2LAogfTsKQEAgLTQ4MSw2ICs0NzcsNyBAQAogfTsKIAogc3RydWN0IG1seDVfZXN3aXRjaDsKK3N0cnVjdCBtbHg1X2xhZzsKIAogc3RydWN0IG1seDVfcmxfZW50cnkgewogCXUzMiAgICAgICAgICAgICAgICAgICAgIHJhdGU7CkBAIC01NTQsNiArNTUxLDcgQEAKIAlzdHJ1Y3QgbWx4NV9mbG93X3N0ZWVyaW5nICpzdGVlcmluZzsKIAlzdHJ1Y3QgbWx4NV9lc3dpdGNoICAgICAqZXN3aXRjaDsKIAlzdHJ1Y3QgbWx4NV9jb3JlX3NyaW92CXNyaW92OworCXN0cnVjdCBtbHg1X2xhZwkJKmxhZzsKIAl1bnNpZ25lZCBsb25nCQlwY2lfZGV2X2RhdGE7CiAJc3RydWN0IG1seDVfZmNfc3RhdHMJCWZjX3N0YXRzOwogCXN0cnVjdCBtbHg1X3JsX3RhYmxlICAgICAgICAgICAgcmxfdGFibGU7CkBAIC03NzEsMTQgKzc2OSwxNSBAQAogdm9pZCBtbHg1X2NtZF9jbGVhbnVwKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOwogdm9pZCBtbHg1X2NtZF91c2VfZXZlbnRzKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOwogdm9pZCBtbHg1X2NtZF91c2VfcG9sbGluZyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKLWludCBtbHg1X2NtZF9zdGF0dXNfdG9fZXJyKHN0cnVjdCBtbHg1X291dGJveF9oZHIgKmhkcik7Ci1pbnQgbWx4NV9jbWRfc3RhdHVzX3RvX2Vycl92Mih2b2lkICpwdHIpOwotaW50IG1seDVfY29yZV9nZXRfY2FwcyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBlbnVtIG1seDVfY2FwX3R5cGUgY2FwX3R5cGUpOworCiBpbnQgbWx4NV9jbWRfZXhlYyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB2b2lkICppbiwgaW50IGluX3NpemUsIHZvaWQgKm91dCwKIAkJICBpbnQgb3V0X3NpemUpOwogaW50IG1seDVfY21kX2V4ZWNfY2Ioc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdm9pZCAqaW4sIGludCBpbl9zaXplLAogCQkgICAgIHZvaWQgKm91dCwgaW50IG91dF9zaXplLCBtbHg1X2NtZF9jYmtfdCBjYWxsYmFjaywKIAkJICAgICB2b2lkICpjb250ZXh0KTsKK3ZvaWQgbWx4NV9jbWRfbWJveF9zdGF0dXModm9pZCAqb3V0LCB1OCAqc3RhdHVzLCB1MzIgKnN5bmRyb21lKTsKKworaW50IG1seDVfY29yZV9nZXRfY2FwcyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBlbnVtIG1seDVfY2FwX3R5cGUgY2FwX3R5cGUpOwogaW50IG1seDVfY21kX2FsbG9jX3VhcihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgKnVhcm4pOwogaW50IG1seDVfY21kX2ZyZWVfdWFyKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiB1YXJuKTsKIGludCBtbHg1X2FsbG9jX3V1YXJzKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X3V1YXJfaW5mbyAqdXVhcmkpOwpAQCAtODA3LDE1ICs4MDYsMTggQEAKIAkJICAgICAgdTE2IGx3bSwgaW50IGlzX3NycSk7CiB2b2lkIG1seDVfaW5pdF9ta2V5X3RhYmxlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOwogdm9pZCBtbHg1X2NsZWFudXBfbWtleV90YWJsZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKK2ludCBtbHg1X2NvcmVfY3JlYXRlX21rZXlfY2Ioc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKKwkJCSAgICAgc3RydWN0IG1seDVfY29yZV9ta2V5ICpta2V5LAorCQkJICAgICB1MzIgKmluLCBpbnQgaW5sZW4sCisJCQkgICAgIHUzMiAqb3V0LCBpbnQgb3V0bGVuLAorCQkJICAgICBtbHg1X2NtZF9jYmtfdCBjYWxsYmFjaywgdm9pZCAqY29udGV4dCk7CiBpbnQgbWx4NV9jb3JlX2NyZWF0ZV9ta2V5KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCiAJCQkgIHN0cnVjdCBtbHg1X2NvcmVfbWtleSAqbWtleSwKLQkJCSAgc3RydWN0IG1seDVfY3JlYXRlX21rZXlfbWJveF9pbiAqaW4sIGludCBpbmxlbiwKLQkJCSAgbWx4NV9jbWRfY2JrX3QgY2FsbGJhY2ssIHZvaWQgKmNvbnRleHQsCi0JCQkgIHN0cnVjdCBtbHg1X2NyZWF0ZV9ta2V5X21ib3hfb3V0ICpvdXQpOworCQkJICB1MzIgKmluLCBpbnQgaW5sZW4pOwogaW50IG1seDVfY29yZV9kZXN0cm95X21rZXkoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKIAkJCSAgIHN0cnVjdCBtbHg1X2NvcmVfbWtleSAqbWtleSk7CiBpbnQgbWx4NV9jb3JlX3F1ZXJ5X21rZXkoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG1seDVfY29yZV9ta2V5ICpta2V5LAotCQkJIHN0cnVjdCBtbHg1X3F1ZXJ5X21rZXlfbWJveF9vdXQgKm91dCwgaW50IG91dGxlbik7CisJCQkgdTMyICpvdXQsIGludCBvdXRsZW4pOwogaW50IG1seDVfY29yZV9kdW1wX2ZpbGxfbWtleShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9jb3JlX21rZXkgKl9ta2V5LAogCQkJICAgICB1MzIgKm1rZXkpOwogaW50IG1seDVfY29yZV9hbGxvY19wZChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgKnBkbik7CkBAIC04MjYsOCArODI4LDYgQEAKIHZvaWQgbWx4NV9wYWdlYWxsb2NfY2xlYW51cChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKIGludCBtbHg1X3BhZ2VhbGxvY19zdGFydChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKIHZvaWQgbWx4NV9wYWdlYWxsb2Nfc3RvcChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKLWludCBtbHg1X3NyaW92X2luaXQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7Ci1pbnQgbWx4NV9zcmlvdl9jbGVhbnVwKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOwogdm9pZCBtbHg1X2NvcmVfcmVxX3BhZ2VzX2hhbmRsZXIoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTE2IGZ1bmNfaWQsCiAJCQkJIHMzMiBucGFnZXMpOwogaW50IG1seDVfc2F0aXNmeV9zdGFydHVwX3BhZ2VzKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIGludCBib290KTsKQEAgLTg2NSw3ICs4NjUsNyBAQAogaW50IG1seDVfZGVidWdfZXFfYWRkKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X2VxICplcSk7CiB2b2lkIG1seDVfZGVidWdfZXFfcmVtb3ZlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X2VxICplcSk7CiBpbnQgbWx4NV9jb3JlX2VxX3F1ZXJ5KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X2VxICplcSwKLQkJICAgICAgIHN0cnVjdCBtbHg1X3F1ZXJ5X2VxX21ib3hfb3V0ICpvdXQsIGludCBvdXRsZW4pOworCQkgICAgICAgdTMyICpvdXQsIGludCBvdXRsZW4pOwogaW50IG1seDVfZXFfZGVidWdmc19pbml0KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOwogdm9pZCBtbHg1X2VxX2RlYnVnZnNfY2xlYW51cChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKIGludCBtbHg1X2NxX2RlYnVnZnNfaW5pdChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKQEAgLTkzMCw2ICs5MzAsOCBAQAogc3RydWN0IG1seDVfaW50ZXJmYWNlIHsKIAl2b2lkICoJCQkoKmFkZCkoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7CiAJdm9pZAkJCSgqcmVtb3ZlKShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB2b2lkICpjb250ZXh0KTsKKwlpbnQJCQkoKmF0dGFjaCkoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdm9pZCAqY29udGV4dCk7CisJdm9pZAkJCSgqZGV0YWNoKShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB2b2lkICpjb250ZXh0KTsKIAl2b2lkCQkJKCpldmVudCkoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdm9pZCAqY29udGV4dCwKIAkJCQkJIGVudW0gbWx4NV9kZXZfZXZlbnQgZXZlbnQsIHVuc2lnbmVkIGxvbmcgcGFyYW0pOwogCXZvaWQgKiAgICAgICAgICAgICAgICAgICgqZ2V0X2Rldikodm9pZCAqY29udGV4dCk7CkBAIC05NDIsNiArOTQ0LDExIEBACiB2b2lkIG1seDVfdW5yZWdpc3Rlcl9pbnRlcmZhY2Uoc3RydWN0IG1seDVfaW50ZXJmYWNlICppbnRmKTsKIGludCBtbHg1X2NvcmVfcXVlcnlfdmVuZG9yX2lkKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LCB1MzIgKnZlbmRvcl9pZCk7CiAKK2ludCBtbHg1X2NtZF9jcmVhdGVfdnBvcnRfbGFnKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOworaW50IG1seDVfY21kX2Rlc3Ryb3lfdnBvcnRfbGFnKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOworYm9vbCBtbHg1X2xhZ19pc19hY3RpdmUoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7CitzdHJ1Y3QgbmV0X2RldmljZSAqbWx4NV9sYWdfZ2V0X3JvY2VfbmV0ZGV2KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOworCiBzdHJ1Y3QgbWx4NV9wcm9maWxlIHsKIAl1NjQJbWFzazsKIAl1OAlsb2dfbWF4X3FwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbHg1L2ZzLmggYi9pbmNsdWRlL2xpbnV4L21seDUvZnMuaAppbmRleCBlMDM2ZDYwLi45M2ViYzVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21seDUvZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21seDUvZnMuaApAQCAtNTQsNiArNTQsNyBAQAogCiBlbnVtIG1seDVfZmxvd19uYW1lc3BhY2VfdHlwZSB7CiAJTUxYNV9GTE9XX05BTUVTUEFDRV9CWVBBU1MsCisJTUxYNV9GTE9XX05BTUVTUEFDRV9MQUcsCiAJTUxYNV9GTE9XX05BTUVTUEFDRV9PRkZMT0FEUywKIAlNTFg1X0ZMT1dfTkFNRVNQQUNFX0VUSFRPT0wsCiAJTUxYNV9GTE9XX05BTUVTUEFDRV9LRVJORUwsCkBAIC02Miw2ICs2Myw4IEBACiAJTUxYNV9GTE9XX05BTUVTUEFDRV9GREIsCiAJTUxYNV9GTE9XX05BTUVTUEFDRV9FU1dfRUdSRVNTLAogCU1MWDVfRkxPV19OQU1FU1BBQ0VfRVNXX0lOR1JFU1MsCisJTUxYNV9GTE9XX05BTUVTUEFDRV9TTklGRkVSX1JYLAorCU1MWDVfRkxPV19OQU1FU1BBQ0VfU05JRkZFUl9UWCwKIH07CiAKIHN0cnVjdCBtbHg1X2Zsb3dfdGFibGU7CkBAIC0xMDYsNiArMTA5LDkgQEAKIAkJCSAgICAgaW50IHByaW8sCiAJCQkgICAgIGludCBudW1fZmxvd190YWJsZV9lbnRyaWVzLAogCQkJICAgICB1MzIgbGV2ZWwsIHUxNiB2cG9ydCk7CitzdHJ1Y3QgbWx4NV9mbG93X3RhYmxlICptbHg1X2NyZWF0ZV9sYWdfZGVtdXhfZmxvd190YWJsZSgKKwkJCQkJICAgICAgIHN0cnVjdCBtbHg1X2Zsb3dfbmFtZXNwYWNlICpucywKKwkJCQkJICAgICAgIGludCBwcmlvLCB1MzIgbGV2ZWwpOwogaW50IG1seDVfZGVzdHJveV9mbG93X3RhYmxlKHN0cnVjdCBtbHg1X2Zsb3dfdGFibGUgKmZ0KTsKIAogLyogaW5ib3ggc2hvdWxkIGJlIHNldCB3aXRoIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbHg1L21seDVfaWZjLmggYi9pbmNsdWRlL2xpbnV4L21seDUvbWx4NV9pZmMuaAppbmRleCAyMWJjNDU1Li42MDQ1ZDRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21seDUvbWx4NV9pZmMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21seDUvbWx4NV9pZmMuaApAQCAtMTUyLDcgKzE1Miw3IEBACiAJTUxYNV9DTURfT1BfQ09ORklHX0lOVF9NT0RFUkFUSU9OICAgICAgICAgPSAweDgwNCwKIAlNTFg1X0NNRF9PUF9BQ0NFU1NfUkVHICAgICAgICAgICAgICAgICAgICA9IDB4ODA1LAogCU1MWDVfQ01EX09QX0FUVEFDSF9UT19NQ0cgICAgICAgICAgICAgICAgID0gMHg4MDYsCi0JTUxYNV9DTURfT1BfREVUVEFDSF9GUk9NX01DRyAgICAgICAgICAgICAgPSAweDgwNywKKwlNTFg1X0NNRF9PUF9ERVRBQ0hfRlJPTV9NQ0cgICAgICAgICAgICAgICA9IDB4ODA3LAogCU1MWDVfQ01EX09QX0dFVF9EUk9QUEVEX1BBQ0tFVF9MT0cgICAgICAgID0gMHg4MGEsCiAJTUxYNV9DTURfT1BfTUFEX0lGQyAgICAgICAgICAgICAgICAgICAgICAgPSAweDUwZCwKIAlNTFg1X0NNRF9PUF9RVUVSWV9NQURfREVNVVggICAgICAgICAgICAgICA9IDB4ODBiLApAQCAtMTc0LDYgKzE3NCwxMiBAQAogCU1MWDVfQ01EX09QX0RFTEVURV9MMl9UQUJMRV9FTlRSWSAgICAgICAgID0gMHg4MmIsCiAJTUxYNV9DTURfT1BfU0VUX1dPTF9ST0wgICAgICAgICAgICAgICAgICAgPSAweDgzMCwKIAlNTFg1X0NNRF9PUF9RVUVSWV9XT0xfUk9MICAgICAgICAgICAgICAgICA9IDB4ODMxLAorCU1MWDVfQ01EX09QX0NSRUFURV9MQUcgICAgICAgICAgICAgICAgICAgID0gMHg4NDAsCisJTUxYNV9DTURfT1BfTU9ESUZZX0xBRyAgICAgICAgICAgICAgICAgICAgPSAweDg0MSwKKwlNTFg1X0NNRF9PUF9RVUVSWV9MQUcgICAgICAgICAgICAgICAgICAgICA9IDB4ODQyLAorCU1MWDVfQ01EX09QX0RFU1RST1lfTEFHICAgICAgICAgICAgICAgICAgID0gMHg4NDMsCisJTUxYNV9DTURfT1BfQ1JFQVRFX1ZQT1JUX0xBRyAgICAgICAgICAgICAgPSAweDg0NCwKKwlNTFg1X0NNRF9PUF9ERVNUUk9ZX1ZQT1JUX0xBRyAgICAgICAgICAgICA9IDB4ODQ1LAogCU1MWDVfQ01EX09QX0NSRUFURV9USVIgICAgICAgICAgICAgICAgICAgID0gMHg5MDAsCiAJTUxYNV9DTURfT1BfTU9ESUZZX1RJUiAgICAgICAgICAgICAgICAgICAgPSAweDkwMSwKIAlNTFg1X0NNRF9PUF9ERVNUUk9ZX1RJUiAgICAgICAgICAgICAgICAgICA9IDB4OTAyLApAQCAtMjEyLDYgKzIxOCw4IEBACiAJTUxYNV9DTURfT1BfREVBTExPQ19GTE9XX0NPVU5URVIgICAgICAgICAgPSAweDkzYSwKIAlNTFg1X0NNRF9PUF9RVUVSWV9GTE9XX0NPVU5URVIgICAgICAgICAgICA9IDB4OTNiLAogCU1MWDVfQ01EX09QX01PRElGWV9GTE9XX1RBQkxFICAgICAgICAgICAgID0gMHg5M2MsCisJTUxYNV9DTURfT1BfQUxMT0NfRU5DQVBfSEVBREVSICAgICAgICAgICAgPSAweDkzZCwKKwlNTFg1X0NNRF9PUF9ERUFMTE9DX0VOQ0FQX0hFQURFUiAgICAgICAgICA9IDB4OTNlLAogCU1MWDVfQ01EX09QX01BWAogfTsKIApAQCAtMjgxLDcgKzI4OSw5IEBACiAJdTggICAgICAgICBtb2RpZnlfcm9vdFsweDFdOwogCXU4ICAgICAgICAgaWRlbnRpZmllZF9taXNzX3RhYmxlX21vZGVbMHgxXTsKIAl1OCAgICAgICAgIGZsb3dfdGFibGVfbW9kaWZ5WzB4MV07Ci0JdTggICAgICAgICByZXNlcnZlZF9hdF83WzB4MTldOworCXU4ICAgICAgICAgZW5jYXBbMHgxXTsKKwl1OCAgICAgICAgIGRlY2FwWzB4MV07CisJdTggICAgICAgICByZXNlcnZlZF9hdF85WzB4MTddOwogCiAJdTggICAgICAgICByZXNlcnZlZF9hdF8yMFsweDJdOwogCXU4ICAgICAgICAgbG9nX21heF9mdF9zaXplWzB4Nl07CkBAIC00NzMsNyArNDgzLDkgQEAKIAogc3RydWN0IG1seDVfaWZjX2Zsb3dfdGFibGVfbmljX2NhcF9iaXRzIHsKIAl1OCAgICAgICAgIG5pY19yeF9tdWx0aV9wYXRoX3RpcnNbMHgxXTsKLQl1OCAgICAgICAgIHJlc2VydmVkX2F0XzFbMHgxZmZdOworCXU4ICAgICAgICAgbmljX3J4X211bHRpX3BhdGhfdGlyc19mdHNbMHgxXTsKKwl1OCAgICAgICAgIGFsbG93X3NuaWZmZXJfYW5kX25pY19yeF9zaGFyZWRfdGlyWzB4MV07CisJdTggICAgICAgICByZXNlcnZlZF9hdF8zWzB4MWZkXTsKIAogCXN0cnVjdCBtbHg1X2lmY19mbG93X3RhYmxlX3Byb3BfbGF5b3V0X2JpdHMgZmxvd190YWJsZV9wcm9wZXJ0aWVzX25pY19yZWNlaXZlOwogCkBAIC01MTIsNyArNTI0LDE1IEBACiAJdTggICAgICAgICBuaWNfdnBvcnRfbm9kZV9ndWlkX21vZGlmeVsweDFdOwogCXU4ICAgICAgICAgbmljX3Zwb3J0X3BvcnRfZ3VpZF9tb2RpZnlbMHgxXTsKIAotCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMjBbMHg3ZTBdOworCXU4ICAgICAgICAgdnhsYW5fZW5jYXBfZGVjYXBbMHgxXTsKKwl1OCAgICAgICAgIG52Z3JlX2VuY2FwX2RlY2FwWzB4MV07CisJdTggICAgICAgICByZXNlcnZlZF9hdF8yMlsweDldOworCXU4ICAgICAgICAgbG9nX21heF9lbmNhcF9oZWFkZXJzWzB4NV07CisJdTggICAgICAgICByZXNlcnZlZF8yYlsweDZdOworCXU4ICAgICAgICAgbWF4X2VuY2FwX2hlYWRlcl9zaXplWzB4YV07CisKKwl1OCAgICAgICAgIHJlc2VydmVkXzQwWzB4N2MwXTsKKwogfTsKIAogc3RydWN0IG1seDVfaWZjX3Fvc19jYXBfYml0cyB7CkBAIC03NjcsNyArNzg3LDkgQEAKIAl1OCAgICAgICAgIG91dF9vZl9zZXFfY250WzB4MV07CiAJdTggICAgICAgICB2cG9ydF9jb3VudGVyc1sweDFdOwogCXU4ICAgICAgICAgcmV0cmFuc21pc3Npb25fcV9jb3VudGVyc1sweDFdOwotCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMTgzWzB4M107CisJdTggICAgICAgICByZXNlcnZlZF9hdF8xODNbMHgxXTsKKwl1OCAgICAgICAgIG1vZGlmeV9ycV9jb3VudGVyX3NldF9pZFsweDFdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMTg1WzB4MV07CiAJdTggICAgICAgICBtYXhfcXBfY250WzB4YV07CiAJdTggICAgICAgICBwa2V5X3RhYmxlX3NpemVbMHgxMF07CiAKQEAgLTg3MCw3ICs4OTIsMTAgQEAKIAl1OCAgICAgICAgIHBhZF90eF9ldGhfcGFja2V0WzB4MV07CiAJdTggICAgICAgICByZXNlcnZlZF9hdF8yNjNbMHg4XTsKIAl1OCAgICAgICAgIGxvZ19iZl9yZWdfc2l6ZVsweDVdOwotCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMjcwWzB4MTBdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF8yNzBbMHhiXTsKKwl1OCAgICAgICAgIGxhZ19tYXN0ZXJbMHgxXTsKKwl1OCAgICAgICAgIG51bV9sYWdfcG9ydHNbMHg0XTsKIAogCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMjgwWzB4MTBdOwogCXU4ICAgICAgICAgbWF4X3dxZV9zel9zcVsweDEwXTsKQEAgLTE5MDQsNyArMTkyOSw3IEBACiAKIHN0cnVjdCBtbHg1X2lmY19xcGNfYml0cyB7CiAJdTggICAgICAgICBzdGF0ZVsweDRdOwotCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfNFsweDRdOworCXU4ICAgICAgICAgbGFnX3R4X3BvcnRfYWZmaW5pdHlbMHg0XTsKIAl1OCAgICAgICAgIHN0WzB4OF07CiAJdTggICAgICAgICByZXNlcnZlZF9hdF8xMFsweDNdOwogCXU4ICAgICAgICAgcG1fc3RhdGVbMHgyXTsKQEAgLTE5NjYsNyArMTk5MSwxMCBAQAogCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfM2UwWzB4OF07CiAJdTggICAgICAgICBjcW5fc25kWzB4MThdOwogCi0JdTggICAgICAgICByZXNlcnZlZF9hdF80MDBbMHg0MF07CisJdTggICAgICAgICByZXNlcnZlZF9hdF80MDBbMHg4XTsKKwl1OCAgICAgICAgIGRldGhfc3FwblsweDE4XTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfNDIwWzB4MjBdOwogCiAJdTggICAgICAgICByZXNlcnZlZF9hdF80NDBbMHg4XTsKIAl1OCAgICAgICAgIGxhc3RfYWNrZWRfcHNuWzB4MThdOwpAQCAtMjA2NCw2ICsyMDkyLDggQEAKIAlNTFg1X0ZMT1dfQ09OVEVYVF9BQ1RJT05fRFJPUCAgICAgID0gMHgyLAogCU1MWDVfRkxPV19DT05URVhUX0FDVElPTl9GV0RfREVTVCAgPSAweDQsCiAJTUxYNV9GTE9XX0NPTlRFWFRfQUNUSU9OX0NPVU5UICAgICA9IDB4OCwKKwlNTFg1X0ZMT1dfQ09OVEVYVF9BQ1RJT05fRU5DQVAgICAgID0gMHgxMCwKKwlNTFg1X0ZMT1dfQ09OVEVYVF9BQ1RJT05fREVDQVAgICAgID0gMHgyMCwKIH07CiAKIHN0cnVjdCBtbHg1X2lmY19mbG93X2NvbnRleHRfYml0cyB7CkBAIC0yMDgzLDcgKzIxMTMsOSBAQAogCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfYTBbMHg4XTsKIAl1OCAgICAgICAgIGZsb3dfY291bnRlcl9saXN0X3NpemVbMHgxOF07CiAKLQl1OCAgICAgICAgIHJlc2VydmVkX2F0X2MwWzB4MTQwXTsKKwl1OCAgICAgICAgIGVuY2FwX2lkWzB4MjBdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF9lMFsweDEyMF07CiAKIAlzdHJ1Y3QgbWx4NV9pZmNfZnRlX21hdGNoX3BhcmFtX2JpdHMgbWF0Y2hfdmFsdWU7CiAKQEAgLTIxNDYsNyArMjE3OCwxMSBAQAogfTsKIAogc3RydWN0IG1seDVfaWZjX3Rpc2NfYml0cyB7Ci0JdTggICAgICAgICByZXNlcnZlZF9hdF8wWzB4Y107CisJdTggICAgICAgICBzdHJpY3RfbGFnX3R4X3BvcnRfYWZmaW5pdHlbMHgxXTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzFbMHgzXTsKKwl1OCAgICAgICAgIGxhZ190eF9wb3J0X2FmZmluaXR5WzB4MDRdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF84WzB4NF07CiAJdTggICAgICAgICBwcmlvWzB4NF07CiAJdTggICAgICAgICByZXNlcnZlZF9hdF8xMFsweDEwXTsKIApAQCAtMjgwOCw3ICsyODQ0LDcgQEAKIAogCXN0cnVjdCBtbHg1X2lmY190YWdfbWF0Y2hpbmdfdG9wb2xvZ3lfY29udGV4dF9iaXRzIHRhZ19tYXRjaGluZ190b3BvbG9neV9jb250ZXh0OwogCi0JdTggICAgICAgICByZXNlcnZlZF9hdF8xODBbMHgxODBdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMTgwWzB4MjAwXTsKIAogCXN0cnVjdCBtbHg1X2lmY193cV9iaXRzIHdxOwogfTsKQEAgLTM0ODksNyArMzUyNSw3IEBACiAKIAl1OCAgICAgICAgIHN5bmRyb21lWzB4MjBdOwogCi0JdTggICAgICAgICByZXNlcnZlZF9hdF80MFsweDIwXTsKKwl1OCAgICAgICAgIGR1bXBfZmlsbF9ta2V5WzB4MjBdOwogCiAJdTggICAgICAgICByZXNkX2xrZXlbMHgyMF07CiB9OwpAQCAtNDIxMyw2ICs0MjQ5LDg1IEBACiAJdTggICAgICAgICByZXNlcnZlZF9hdF82MFsweDIwXTsKIH07CiAKK3N0cnVjdCBtbHg1X2lmY19lbmNhcF9oZWFkZXJfaW5fYml0cyB7CisJdTggICAgICAgICByZXNlcnZlZF9hdF8wWzB4NV07CisJdTggICAgICAgICBoZWFkZXJfdHlwZVsweDNdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfOFsweGVdOworCXU4ICAgICAgICAgZW5jYXBfaGVhZGVyX3NpemVbMHhhXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMjBbMHgxMF07CisJdTggICAgICAgICBlbmNhcF9oZWFkZXJbMl1bMHg4XTsKKworCXU4ICAgICAgICAgbW9yZV9lbmNhcF9oZWFkZXJbMF1bMHg4XTsKK307CisKK3N0cnVjdCBtbHg1X2lmY19xdWVyeV9lbmNhcF9oZWFkZXJfb3V0X2JpdHMgeworCXU4ICAgICAgICAgc3RhdHVzWzB4OF07CisJdTggICAgICAgICByZXNlcnZlZF9hdF84WzB4MThdOworCisJdTggICAgICAgICBzeW5kcm9tZVsweDIwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfNDBbMHhhMF07CisKKwlzdHJ1Y3QgbWx4NV9pZmNfZW5jYXBfaGVhZGVyX2luX2JpdHMgZW5jYXBfaGVhZGVyWzBdOworfTsKKworc3RydWN0IG1seDVfaWZjX3F1ZXJ5X2VuY2FwX2hlYWRlcl9pbl9iaXRzIHsKKwl1OCAgICAgICAgIG9wY29kZVsweDEwXTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzEwWzB4MTBdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF8yMFsweDEwXTsKKwl1OCAgICAgICAgIG9wX21vZFsweDEwXTsKKworCXU4ICAgICAgICAgZW5jYXBfaWRbMHgyMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzYwWzB4YTBdOworfTsKKworc3RydWN0IG1seDVfaWZjX2FsbG9jX2VuY2FwX2hlYWRlcl9vdXRfYml0cyB7CisJdTggICAgICAgICBzdGF0dXNbMHg4XTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzhbMHgxOF07CisKKwl1OCAgICAgICAgIHN5bmRyb21lWzB4MjBdOworCisJdTggICAgICAgICBlbmNhcF9pZFsweDIwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfNjBbMHgyMF07Cit9OworCitzdHJ1Y3QgbWx4NV9pZmNfYWxsb2NfZW5jYXBfaGVhZGVyX2luX2JpdHMgeworCXU4ICAgICAgICAgb3Bjb2RlWzB4MTBdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMTBbMHgxMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzIwWzB4MTBdOworCXU4ICAgICAgICAgb3BfbW9kWzB4MTBdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF80MFsweGEwXTsKKworCXN0cnVjdCBtbHg1X2lmY19lbmNhcF9oZWFkZXJfaW5fYml0cyBlbmNhcF9oZWFkZXI7Cit9OworCitzdHJ1Y3QgbWx4NV9pZmNfZGVhbGxvY19lbmNhcF9oZWFkZXJfb3V0X2JpdHMgeworCXU4ICAgICAgICAgc3RhdHVzWzB4OF07CisJdTggICAgICAgICByZXNlcnZlZF9hdF84WzB4MThdOworCisJdTggICAgICAgICBzeW5kcm9tZVsweDIwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfNDBbMHg0MF07Cit9OworCitzdHJ1Y3QgbWx4NV9pZmNfZGVhbGxvY19lbmNhcF9oZWFkZXJfaW5fYml0cyB7CisJdTggICAgICAgICBvcGNvZGVbMHgxMF07CisJdTggICAgICAgICByZXNlcnZlZF9hdF8xMFsweDEwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfMjBbMHgxMF07CisJdTggICAgICAgICBvcF9tb2RbMHgxMF07CisKKwl1OCAgICAgICAgIGVuY2FwX2lkWzB4MjBdOworCisJdTggICAgICAgICByZXNlcnZlZF82MFsweDIwXTsKK307CisKIHN0cnVjdCBtbHg1X2lmY19xdWVyeV9kY3Rfb3V0X2JpdHMgewogCXU4ICAgICAgICAgc3RhdHVzWzB4OF07CiAJdTggICAgICAgICByZXNlcnZlZF9hdF84WzB4MThdOwpAQCAtNDUxNyw3ICs0NjMyLDkgQEAKIHN0cnVjdCBtbHg1X2lmY19tb2RpZnlfdGlzX2JpdG1hc2tfYml0cyB7CiAJdTggICAgICAgICByZXNlcnZlZF9hdF8wWzB4MjBdOwogCi0JdTggICAgICAgICByZXNlcnZlZF9hdF8yMFsweDFmXTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzIwWzB4MWRdOworCXU4ICAgICAgICAgbGFnX3R4X3BvcnRfYWZmaW5pdHlbMHgxXTsKKwl1OCAgICAgICAgIHN0cmljdF9sYWdfdHhfcG9ydF9hZmZpbml0eVsweDFdOwogCXU4ICAgICAgICAgcHJpb1sweDFdOwogfTsKIApAQCAtNDY1Miw2ICs0NzY5LDExIEBACiAJdTggICAgICAgICByZXNlcnZlZF9hdF80MFsweDQwXTsKIH07CiAKK2VudW0geworCU1MWDVfTU9ESUZZX1JRX0lOX01PRElGWV9CSVRNQVNLX1ZTRCA9IDFVTEwgPDwgMSwKKwlNTFg1X01PRElGWV9SUV9JTl9NT0RJRllfQklUTUFTS19NT0RJRllfUlFfQ09VTlRFUl9TRVRfSUQgPSAxVUxMIDw8IDMsCit9OworCiBzdHJ1Y3QgbWx4NV9pZmNfbW9kaWZ5X3JxX2luX2JpdHMgewogCXU4ICAgICAgICAgb3Bjb2RlWzB4MTBdOwogCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMTBbMHgxMF07CkBAIC00NzIxLDcgKzQ4NDMsNyBAQAogCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMFsweDE2XTsKIAl1OCAgICAgICAgIG5vZGVfZ3VpZFsweDFdOwogCXU4ICAgICAgICAgcG9ydF9ndWlkWzB4MV07Ci0JdTggICAgICAgICByZXNlcnZlZF9hdF8xOFsweDFdOworCXU4ICAgICAgICAgbWluX2lubGluZVsweDFdOwogCXU4ICAgICAgICAgbXR1WzB4MV07CiAJdTggICAgICAgICBjaGFuZ2VfZXZlbnRbMHgxXTsKIAl1OCAgICAgICAgIHByb21pc2NbMHgxXTsKQEAgLTYwOTksNyArNjIyMSw5IEBACiAKIAl1OCAgICAgICAgIHJlc2VydmVkX2F0X2EwWzB4MjBdOwogCi0JdTggICAgICAgICByZXNlcnZlZF9hdF9jMFsweDRdOworCXU4ICAgICAgICAgZW5jYXBfZW5bMHgxXTsKKwl1OCAgICAgICAgIGRlY2FwX2VuWzB4MV07CisJdTggICAgICAgICByZXNlcnZlZF9hdF9jMlsweDJdOwogCXU4ICAgICAgICAgdGFibGVfbWlzc19tb2RlWzB4NF07CiAJdTggICAgICAgICBsZXZlbFsweDhdOwogCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfZDBbMHg4XTsKQEAgLTYxMDgsNyArNjIzMiwxMCBAQAogCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfZTBbMHg4XTsKIAl1OCAgICAgICAgIHRhYmxlX21pc3NfaWRbMHgxOF07CiAKLQl1OCAgICAgICAgIHJlc2VydmVkX2F0XzEwMFsweDEwMF07CisJdTggICAgICAgICByZXNlcnZlZF9hdF8xMDBbMHg4XTsKKwl1OCAgICAgICAgIGxhZ19tYXN0ZXJfbmV4dF90YWJsZV9pZFsweDE4XTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMTIwWzB4ODBdOwogfTsKIAogc3RydWN0IG1seDVfaWZjX2NyZWF0ZV9mbG93X2dyb3VwX291dF9iaXRzIHsKQEAgLTY3MTAsOSArNjgzNywxMCBAQAogfTsKIAogc3RydWN0IG1seDVfaWZjX3B0eXNfcmVnX2JpdHMgewotCXU4ICAgICAgICAgYW5fZGlzYWJsZV9jYXBbMHgxXTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzBbMHgxXTsKIAl1OCAgICAgICAgIGFuX2Rpc2FibGVfYWRtaW5bMHgxXTsKLQl1OCAgICAgICAgIHJlc2VydmVkX2F0XzJbMHg2XTsKKwl1OCAgICAgICAgIGFuX2Rpc2FibGVfY2FwWzB4MV07CisJdTggICAgICAgICByZXNlcnZlZF9hdF8zWzB4NV07CiAJdTggICAgICAgICBsb2NhbF9wb3J0WzB4OF07CiAJdTggICAgICAgICByZXNlcnZlZF9hdF8xMFsweGRdOwogCXU4ICAgICAgICAgcHJvdG9fbWFza1sweDNdOwpAQCAtNzU2Miw3ICs3NjkwLDggQEAKIH07CiAKIGVudW0gewotCU1MWDVfTU9ESUZZX0ZMT1dfVEFCTEVfTUlTU19UQUJMRV9JRCA9IDB4MSwKKwlNTFg1X01PRElGWV9GTE9XX1RBQkxFX01JU1NfVEFCTEVfSUQgICAgID0gKDFVTCA8PCAwKSwKKwlNTFg1X01PRElGWV9GTE9XX1RBQkxFX0xBR19ORVhUX1RBQkxFX0lEID0gKDFVTCA8PCAxNSksCiB9OwogCiBzdHJ1Y3QgbWx4NV9pZmNfbW9kaWZ5X2Zsb3dfdGFibGVfb3V0X2JpdHMgewpAQCAtNzYwMSw3ICs3NzMwLDEwIEBACiAJdTggICAgICAgICByZXNlcnZlZF9hdF9lMFsweDhdOwogCXU4ICAgICAgICAgdGFibGVfbWlzc19pZFsweDE4XTsKIAotCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMTAwWzB4MTAwXTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzEwMFsweDhdOworCXU4ICAgICAgICAgbGFnX21hc3Rlcl9uZXh0X3RhYmxlX2lkWzB4MThdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF8xMjBbMHg4MF07CiB9OwogCiBzdHJ1Y3QgbWx4NV9pZmNfZXRzX3Rjbl9jb25maWdfcmVnX2JpdHMgewpAQCAtNzcwOSw0ICs3ODQxLDEzNCBAQAogCXU4ICAgICAgICAgZXJyb3JbMHg4XTsKIAl1OCAgICAgICAgIHJlc2VydmVkX2F0X2EwWzB4MTYwXTsKIH07CisKK3N0cnVjdCBtbHg1X2lmY19sYWdjX2JpdHMgeworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMFsweDFkXTsKKwl1OCAgICAgICAgIGxhZ19zdGF0ZVsweDNdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF8yMFsweDE0XTsKKwl1OCAgICAgICAgIHR4X3JlbWFwX2FmZmluaXR5XzJbMHg0XTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzM4WzB4NF07CisJdTggICAgICAgICB0eF9yZW1hcF9hZmZpbml0eV8xWzB4NF07Cit9OworCitzdHJ1Y3QgbWx4NV9pZmNfY3JlYXRlX2xhZ19vdXRfYml0cyB7CisJdTggICAgICAgICBzdGF0dXNbMHg4XTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzhbMHgxOF07CisKKwl1OCAgICAgICAgIHN5bmRyb21lWzB4MjBdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF80MFsweDQwXTsKK307CisKK3N0cnVjdCBtbHg1X2lmY19jcmVhdGVfbGFnX2luX2JpdHMgeworCXU4ICAgICAgICAgb3Bjb2RlWzB4MTBdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMTBbMHgxMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzIwWzB4MTBdOworCXU4ICAgICAgICAgb3BfbW9kWzB4MTBdOworCisJc3RydWN0IG1seDVfaWZjX2xhZ2NfYml0cyBjdHg7Cit9OworCitzdHJ1Y3QgbWx4NV9pZmNfbW9kaWZ5X2xhZ19vdXRfYml0cyB7CisJdTggICAgICAgICBzdGF0dXNbMHg4XTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzhbMHgxOF07CisKKwl1OCAgICAgICAgIHN5bmRyb21lWzB4MjBdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF80MFsweDQwXTsKK307CisKK3N0cnVjdCBtbHg1X2lmY19tb2RpZnlfbGFnX2luX2JpdHMgeworCXU4ICAgICAgICAgb3Bjb2RlWzB4MTBdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMTBbMHgxMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzIwWzB4MTBdOworCXU4ICAgICAgICAgb3BfbW9kWzB4MTBdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF80MFsweDIwXTsKKwl1OCAgICAgICAgIGZpZWxkX3NlbGVjdFsweDIwXTsKKworCXN0cnVjdCBtbHg1X2lmY19sYWdjX2JpdHMgY3R4OworfTsKKworc3RydWN0IG1seDVfaWZjX3F1ZXJ5X2xhZ19vdXRfYml0cyB7CisJdTggICAgICAgICBzdGF0dXNbMHg4XTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzhbMHgxOF07CisKKwl1OCAgICAgICAgIHN5bmRyb21lWzB4MjBdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF80MFsweDQwXTsKKworCXN0cnVjdCBtbHg1X2lmY19sYWdjX2JpdHMgY3R4OworfTsKKworc3RydWN0IG1seDVfaWZjX3F1ZXJ5X2xhZ19pbl9iaXRzIHsKKwl1OCAgICAgICAgIG9wY29kZVsweDEwXTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzEwWzB4MTBdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF8yMFsweDEwXTsKKwl1OCAgICAgICAgIG9wX21vZFsweDEwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfNDBbMHg0MF07Cit9OworCitzdHJ1Y3QgbWx4NV9pZmNfZGVzdHJveV9sYWdfb3V0X2JpdHMgeworCXU4ICAgICAgICAgc3RhdHVzWzB4OF07CisJdTggICAgICAgICByZXNlcnZlZF9hdF84WzB4MThdOworCisJdTggICAgICAgICBzeW5kcm9tZVsweDIwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfNDBbMHg0MF07Cit9OworCitzdHJ1Y3QgbWx4NV9pZmNfZGVzdHJveV9sYWdfaW5fYml0cyB7CisJdTggICAgICAgICBvcGNvZGVbMHgxMF07CisJdTggICAgICAgICByZXNlcnZlZF9hdF8xMFsweDEwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMjBbMHgxMF07CisJdTggICAgICAgICBvcF9tb2RbMHgxMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzQwWzB4NDBdOworfTsKKworc3RydWN0IG1seDVfaWZjX2NyZWF0ZV92cG9ydF9sYWdfb3V0X2JpdHMgeworCXU4ICAgICAgICAgc3RhdHVzWzB4OF07CisJdTggICAgICAgICByZXNlcnZlZF9hdF84WzB4MThdOworCisJdTggICAgICAgICBzeW5kcm9tZVsweDIwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfNDBbMHg0MF07Cit9OworCitzdHJ1Y3QgbWx4NV9pZmNfY3JlYXRlX3Zwb3J0X2xhZ19pbl9iaXRzIHsKKwl1OCAgICAgICAgIG9wY29kZVsweDEwXTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzEwWzB4MTBdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF8yMFsweDEwXTsKKwl1OCAgICAgICAgIG9wX21vZFsweDEwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfNDBbMHg0MF07Cit9OworCitzdHJ1Y3QgbWx4NV9pZmNfZGVzdHJveV92cG9ydF9sYWdfb3V0X2JpdHMgeworCXU4ICAgICAgICAgc3RhdHVzWzB4OF07CisJdTggICAgICAgICByZXNlcnZlZF9hdF84WzB4MThdOworCisJdTggICAgICAgICBzeW5kcm9tZVsweDIwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfNDBbMHg0MF07Cit9OworCitzdHJ1Y3QgbWx4NV9pZmNfZGVzdHJveV92cG9ydF9sYWdfaW5fYml0cyB7CisJdTggICAgICAgICBvcGNvZGVbMHgxMF07CisJdTggICAgICAgICByZXNlcnZlZF9hdF8xMFsweDEwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMjBbMHgxMF07CisJdTggICAgICAgICBvcF9tb2RbMHgxMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzQwWzB4NDBdOworfTsKKwogI2VuZGlmIC8qIE1MWDVfSUZDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWx4NS9wb3J0LmggYi9pbmNsdWRlL2xpbnV4L21seDUvcG9ydC5oCmluZGV4IGUzMDEyY2MuLmIzMDY1YWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWx4NS9wb3J0LmgKKysrIGIvaW5jbHVkZS9saW51eC9tbHg1L3BvcnQuaApAQCAtNjEsNiArNjEsMzkgQEAKICNkZWZpbmUgTUxYNV9JMkNfQUREUl9ISUdICQkweDUxCiAjZGVmaW5lIE1MWDVfRUVQUk9NX1BBR0VfTEVOR1RICQkyNTYKIAorZW51bSBtbHg1ZV9saW5rX21vZGUgeworCU1MWDVFXzEwMDBCQVNFX0NYX1NHTUlJCSA9IDAsCisJTUxYNUVfMTAwMEJBU0VfS1gJID0gMSwKKwlNTFg1RV8xMEdCQVNFX0NYNAkgPSAyLAorCU1MWDVFXzEwR0JBU0VfS1g0CSA9IDMsCisJTUxYNUVfMTBHQkFTRV9LUgkgPSA0LAorCU1MWDVFXzIwR0JBU0VfS1IyCSA9IDUsCisJTUxYNUVfNDBHQkFTRV9DUjQJID0gNiwKKwlNTFg1RV80MEdCQVNFX0tSNAkgPSA3LAorCU1MWDVFXzU2R0JBU0VfUjQJID0gOCwKKwlNTFg1RV8xMEdCQVNFX0NSCSA9IDEyLAorCU1MWDVFXzEwR0JBU0VfU1IJID0gMTMsCisJTUxYNUVfMTBHQkFTRV9FUgkgPSAxNCwKKwlNTFg1RV80MEdCQVNFX1NSNAkgPSAxNSwKKwlNTFg1RV80MEdCQVNFX0xSNAkgPSAxNiwKKwlNTFg1RV81MEdCQVNFX1NSMgkgPSAxOCwKKwlNTFg1RV8xMDBHQkFTRV9DUjQJID0gMjAsCisJTUxYNUVfMTAwR0JBU0VfU1I0CSA9IDIxLAorCU1MWDVFXzEwMEdCQVNFX0tSNAkgPSAyMiwKKwlNTFg1RV8xMDBHQkFTRV9MUjQJID0gMjMsCisJTUxYNUVfMTAwQkFTRV9UWAkgPSAyNCwKKwlNTFg1RV8xMDAwQkFTRV9UCSA9IDI1LAorCU1MWDVFXzEwR0JBU0VfVAkJID0gMjYsCisJTUxYNUVfMjVHQkFTRV9DUgkgPSAyNywKKwlNTFg1RV8yNUdCQVNFX0tSCSA9IDI4LAorCU1MWDVFXzI1R0JBU0VfU1IJID0gMjksCisJTUxYNUVfNTBHQkFTRV9DUjIJID0gMzAsCisJTUxYNUVfNTBHQkFTRV9LUjIJID0gMzEsCisJTUxYNUVfTElOS19NT0RFU19OVU1CRVIsCit9OworCisjZGVmaW5lIE1MWDVFX1BST1RfTUFTSyhsaW5rX21vZGUpICgxIDw8IGxpbmtfbW9kZSkKKwogaW50IG1seDVfc2V0X3BvcnRfY2FwcyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1OCBwb3J0X251bSwgdTMyIGNhcHMpOwogaW50IG1seDVfcXVlcnlfcG9ydF9wdHlzKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiAqcHR5cywKIAkJCSBpbnQgcHR5c19zaXplLCBpbnQgcHJvdG9fbWFzaywgdTggbG9jYWxfcG9ydCk7CkBAIC03MCw5ICsxMDMsMTAgQEAKIAkJCQl1MzIgKnByb3RvX2FkbWluLCBpbnQgcHJvdG9fbWFzayk7CiBpbnQgbWx4NV9xdWVyeV9wb3J0X2xpbmtfd2lkdGhfb3BlcihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAogCQkJCSAgICB1OCAqbGlua193aWR0aF9vcGVyLCB1OCBsb2NhbF9wb3J0KTsKLWludCBtbHg1X3F1ZXJ5X3BvcnRfcHJvdG9fb3BlcihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAotCQkJICAgICAgIHU4ICpwcm90b19vcGVyLCBpbnQgcHJvdG9fbWFzaywKLQkJCSAgICAgICB1OCBsb2NhbF9wb3J0KTsKK2ludCBtbHg1X3F1ZXJ5X3BvcnRfaWJfcHJvdG9fb3BlcihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAorCQkJCSAgdTggKnByb3RvX29wZXIsIHU4IGxvY2FsX3BvcnQpOworaW50IG1seDVfcXVlcnlfcG9ydF9ldGhfcHJvdG9fb3BlcihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAorCQkJCSAgIHUzMiAqcHJvdG9fb3BlciwgdTggbG9jYWxfcG9ydCk7CiBpbnQgbWx4NV9zZXRfcG9ydF9wdHlzKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIGJvb2wgYW5fZGlzYWJsZSwKIAkJICAgICAgIHUzMiBwcm90b19hZG1pbiwgaW50IHByb3RvX21hc2spOwogdm9pZCBtbHg1X3RvZ2dsZV9wb3J0X2xpbmsoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21seDUvcXAuaCBiL2luY2x1ZGUvbGludXgvbWx4NS9xcC5oCmluZGV4IDc4NzliZjQuLjBhYWNiMmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWx4NS9xcC5oCisrKyBiL2luY2x1ZGUvbGludXgvbWx4NS9xcC5oCkBAIC0xMjMsMTIgKzEyMywxMyBAQAogfTsKIAogZW51bSB7Ci0JTUxYNV9OT05fWkVST19SUQk9IDAgPDwgMjQsCi0JTUxYNV9TUlFfUlEJCT0gMSA8PCAyNCwKLQlNTFg1X0NSUV9SUQkJPSAyIDw8IDI0LAotCU1MWDVfWkVST19MRU5fUlEJPSAzIDw8IDI0CisJTUxYNV9OT05fWkVST19SUQk9IDB4MCwKKwlNTFg1X1NSUV9SUQkJPSAweDEsCisJTUxYNV9DUlFfUlEJCT0gMHgyLAorCU1MWDVfWkVST19MRU5fUlEJPSAweDMKIH07CiAKKy8qIFRPRE8gUkVNICovCiBlbnVtIHsKIAkvKiBwYXJhbXMxICovCiAJTUxYNV9RUF9CSVRfU1JFCQkJCT0gMSA8PCAxNSwKQEAgLTE3OCwxMiArMTc5LDYgQEAKIH07CiAKIGVudW0gewotCU1MWDVfUVBfTEFUX1NFTlNJVElWRQk9IDEgPDwgMjgsCi0JTUxYNV9RUF9CTE9DS19NQ0FTVAk9IDEgPDwgMzAsCi0JTUxYNV9RUF9FTkFCTEVfU0lHCT0gMSA8PCAzMSwKLX07Ci0KLWVudW0gewogCU1MWDVfUkNWX0RCUgk9IDAsCiAJTUxYNV9TTkRfREJSCT0gMSwKIH07CkBAIC00ODQsNiArNDc5LDcgQEAKIAl1OAkJCXJtYWNbNl07CiB9OwogCisvKiBGSVhNRTogdXNlIG1seDVfaWZjLmggcXBjICovCiBzdHJ1Y3QgbWx4NV9xcF9jb250ZXh0IHsKIAlfX2JlMzIJCQlmbGFnczsKIAlfX2JlMzIJCQlmbGFnc19wZDsKQEAgLTUyNSw5OSArNTIxLDYgQEAKIAl1OAkJCXJzdmQxWzI0XTsKIH07CiAKLXN0cnVjdCBtbHg1X2NyZWF0ZV9xcF9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCV9fYmUzMgkJCWlucHV0X3FwbjsKLQl1OAkJCXJzdmQwWzRdOwotCV9fYmUzMgkJCW9wdF9wYXJhbV9tYXNrOwotCXU4CQkJcnN2ZDFbNF07Ci0Jc3RydWN0IG1seDVfcXBfY29udGV4dAljdHg7Ci0JdTgJCQlyc3ZkM1sxNl07Ci0JX19iZTY0CQkJcGFzWzBdOwotfTsKLQotc3RydWN0IG1seDVfY3JlYXRlX3FwX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQlxcG47Ci0JdTgJCQlyc3ZkMFs0XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2Rlc3Ryb3lfcXBfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQlxcG47Ci0JdTgJCQlyc3ZkMFs0XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2Rlc3Ryb3lfcXBfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZDBbOF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9tb2RpZnlfcXBfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQlxcG47Ci0JdTgJCQlyc3ZkMFs0XTsKLQlfX2JlMzIJCQlvcHRwYXJhbTsKLQl1OAkJCXJzdmQxWzRdOwotCXN0cnVjdCBtbHg1X3FwX2NvbnRleHQJY3R4OwotCXU4CQkJcnN2ZDJbMTZdOwotfTsKLQotc3RydWN0IG1seDVfbW9kaWZ5X3FwX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmQwWzhdOwotfTsKLQotc3RydWN0IG1seDVfcXVlcnlfcXBfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQlxcG47Ci0JdTgJCQlyc3ZkWzRdOwotfTsKLQotc3RydWN0IG1seDVfcXVlcnlfcXBfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZDFbOF07Ci0JX19iZTMyCQkJb3B0cGFyYW07Ci0JdTgJCQlyc3ZkMFs0XTsKLQlzdHJ1Y3QgbWx4NV9xcF9jb250ZXh0CWN0eDsKLQl1OAkJCXJzdmQyWzE2XTsKLQlfX2JlNjQJCQlwYXNbMF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9jb25mX3NxcF9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCV9fYmUzMgkJCXFwbjsKLQl1OAkJCXJzdmRbM107Ci0JdTgJCQl0eXBlOwotfTsKLQotc3RydWN0IG1seDVfY29uZl9zcXBfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZFs4XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2FsbG9jX3hyY2RfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmRbOF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9hbGxvY194cmNkX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQl4cmNkbjsKLQl1OAkJCXJzdmRbNF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9kZWFsbG9jX3hyY2RfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQl4cmNkbjsKLQl1OAkJCXJzdmRbNF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9kZWFsbG9jX3hyY2RfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZFs4XTsKLX07Ci0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IG1seDVfY29yZV9xcCAqX19tbHg1X3FwX2xvb2t1cChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgcXBuKQogewogCXJldHVybiByYWRpeF90cmVlX2xvb2t1cCgmZGV2LT5wcml2LnFwX3RhYmxlLnRyZWUsIHFwbik7CkBAIC02MjgsMjggKzUzMSwxNyBAQAogCXJldHVybiByYWRpeF90cmVlX2xvb2t1cCgmZGV2LT5wcml2Lm1rZXlfdGFibGUudHJlZSwga2V5KTsKIH0KIAotc3RydWN0IG1seDVfcGFnZV9mYXVsdF9yZXN1bWVfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQlmbGFnc19xcG47Ci0JdTgJCQlyZXNlcnZlZFs0XTsKLX07Ci0KLXN0cnVjdCBtbHg1X3BhZ2VfZmF1bHRfcmVzdW1lX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmRbOF07Ci19OwotCiBpbnQgbWx4NV9jb3JlX2NyZWF0ZV9xcChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAogCQkJc3RydWN0IG1seDVfY29yZV9xcCAqcXAsCi0JCQlzdHJ1Y3QgbWx4NV9jcmVhdGVfcXBfbWJveF9pbiAqaW4sCisJCQl1MzIgKmluLAogCQkJaW50IGlubGVuKTsKLWludCBtbHg1X2NvcmVfcXBfbW9kaWZ5KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUxNiBvcGVyYXRpb24sCi0JCQlzdHJ1Y3QgbWx4NV9tb2RpZnlfcXBfbWJveF9pbiAqaW4sIGludCBzcWRfZXZlbnQsCitpbnQgbWx4NV9jb3JlX3FwX21vZGlmeShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MTYgb3Bjb2RlLAorCQkJdTMyIG9wdF9wYXJhbV9tYXNrLCB2b2lkICpxcGMsCiAJCQlzdHJ1Y3QgbWx4NV9jb3JlX3FwICpxcCk7CiBpbnQgbWx4NV9jb3JlX2Rlc3Ryb3lfcXAoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKIAkJCSBzdHJ1Y3QgbWx4NV9jb3JlX3FwICpxcCk7CiBpbnQgbWx4NV9jb3JlX3FwX3F1ZXJ5KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X2NvcmVfcXAgKnFwLAotCQkgICAgICAgc3RydWN0IG1seDVfcXVlcnlfcXBfbWJveF9vdXQgKm91dCwgaW50IG91dGxlbik7CisJCSAgICAgICB1MzIgKm91dCwgaW50IG91dGxlbik7CiAKIGludCBtbHg1X2NvcmVfeHJjZF9hbGxvYyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgKnhyY2RuKTsKIGludCBtbHg1X2NvcmVfeHJjZF9kZWFsbG9jKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUzMiB4cmNkbik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21seDUvdnBvcnQuaCBiL2luY2x1ZGUvbGludXgvbWx4NS92cG9ydC5oCmluZGV4IGUwODdiN2QuLjQ1MWIwYmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWx4NS92cG9ydC5oCisrKyBiL2luY2x1ZGUvbGludXgvbWx4NS92cG9ydC5oCkBAIC00NSw2ICs0NSw4IEBACiAJCQkJICAgICB1MTYgdnBvcnQsIHU4ICphZGRyKTsKIHZvaWQgbWx4NV9xdWVyeV9uaWNfdnBvcnRfbWluX2lubGluZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwKIAkJCQkgICAgIHU4ICptaW5faW5saW5lKTsKK2ludCBtbHg1X21vZGlmeV9uaWNfdnBvcnRfbWluX2lubGluZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwKKwkJCQkgICAgIHUxNiB2cG9ydCwgdTggbWluX2lubGluZSk7CiBpbnQgbWx4NV9tb2RpZnlfbmljX3Zwb3J0X21hY19hZGRyZXNzKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCiAJCQkJICAgICAgdTE2IHZwb3J0LCB1OCAqYWRkcik7CiBpbnQgbWx4NV9xdWVyeV9uaWNfdnBvcnRfbXR1KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICptZGV2LCB1MTYgKm10dSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tLmggYi9pbmNsdWRlL2xpbnV4L21tLmgKaW5kZXggMDhlZDUzZS4uNWYxNDUzNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW0uaApAQCAtMjAxNCwxMCArMjAxNCwxMyBAQAogCiBleHRlcm4gdm9pZCBzZXRfbW1fZXhlX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBmaWxlICpuZXdfZXhlX2ZpbGUpOwogZXh0ZXJuIHN0cnVjdCBmaWxlICpnZXRfbW1fZXhlX2ZpbGUoc3RydWN0IG1tX3N0cnVjdCAqbW0pOworZXh0ZXJuIHN0cnVjdCBmaWxlICpnZXRfdGFza19leGVfZmlsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOwogCiBleHRlcm4gYm9vbCBtYXlfZXhwYW5kX3ZtKHN0cnVjdCBtbV9zdHJ1Y3QgKiwgdm1fZmxhZ3NfdCwgdW5zaWduZWQgbG9uZyBucGFnZXMpOwogZXh0ZXJuIHZvaWQgdm1fc3RhdF9hY2NvdW50KHN0cnVjdCBtbV9zdHJ1Y3QgKiwgdm1fZmxhZ3NfdCwgbG9uZyBucGFnZXMpOwogCitleHRlcm4gYm9vbCB2bWFfaXNfc3BlY2lhbF9tYXBwaW5nKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCSAgIGNvbnN0IHN0cnVjdCB2bV9zcGVjaWFsX21hcHBpbmcgKnNtKTsKIGV4dGVybiBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKl9pbnN0YWxsX3NwZWNpYWxfbWFwcGluZyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQkgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAogCQkJCSAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9jYXJkLmggYi9pbmNsdWRlL2xpbnV4L21tYy9jYXJkLmgKaW5kZXggZDg2NzNjYS4uNzNmYWQ4MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbWMvY2FyZC5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL2NhcmQuaApAQCAtMjkyLDYgKzI5Miw3IEBACiAJdTMyCQkJcmF3X2NpZFs0XTsJLyogcmF3IGNhcmQgQ0lEICovCiAJdTMyCQkJcmF3X2NzZFs0XTsJLyogcmF3IGNhcmQgQ1NEICovCiAJdTMyCQkJcmF3X3NjclsyXTsJLyogcmF3IGNhcmQgU0NSICovCisJdTMyCQkJcmF3X3NzclsxNl07CS8qIHJhdyBjYXJkIFNTUiAqLwogCXN0cnVjdCBtbWNfY2lkCQljaWQ7CQkvKiBjYXJkIGlkZW50aWZpY2F0aW9uICovCiAJc3RydWN0IG1tY19jc2QJCWNzZDsJCS8qIGNhcmQgc3BlY2lmaWMgKi8KIAlzdHJ1Y3QgbW1jX2V4dF9jc2QJZXh0X2NzZDsJLyogbW1jIHY0IGV4dGVuZGVkIGNhcmQgc3BlY2lmaWMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL2NvcmUuaCBiL2luY2x1ZGUvbGludXgvbW1jL2NvcmUuaAppbmRleCBiMDFlNzdkLi4yYjk1M2ViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9jb3JlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvY29yZS5oCkBAIC01NSw2ICs1NSw5IEBACiAjZGVmaW5lIE1NQ19SU1BfUjYJKE1NQ19SU1BfUFJFU0VOVHxNTUNfUlNQX0NSQ3xNTUNfUlNQX09QQ09ERSkKICNkZWZpbmUgTU1DX1JTUF9SNwkoTU1DX1JTUF9QUkVTRU5UfE1NQ19SU1BfQ1JDfE1NQ19SU1BfT1BDT0RFKQogCisvKiBDYW4gYmUgdXNlZCBieSBjb3JlIHRvIHBvbGwgYWZ0ZXIgc3dpdGNoIHRvIE1NQyBIUyBtb2RlICovCisjZGVmaW5lIE1NQ19SU1BfUjFfTk9fQ1JDCShNTUNfUlNQX1BSRVNFTlR8TU1DX1JTUF9PUENPREUpCisKICNkZWZpbmUgbW1jX3Jlc3BfdHlwZShjbWQpCSgoY21kKS0+ZmxhZ3MgJiAoTU1DX1JTUF9QUkVTRU5UfE1NQ19SU1BfMTM2fE1NQ19SU1BfQ1JDfE1NQ19SU1BfQlVTWXxNTUNfUlNQX09QQ09ERSkpCiAKIC8qCkBAIC0xMzMsOCArMTM2LDEyIEBACiAJc3RydWN0IG1tY19jb21tYW5kCSpzdG9wOwogCiAJc3RydWN0IGNvbXBsZXRpb24JY29tcGxldGlvbjsKKwlzdHJ1Y3QgY29tcGxldGlvbgljbWRfY29tcGxldGlvbjsKIAl2b2lkCQkJKCpkb25lKShzdHJ1Y3QgbW1jX3JlcXVlc3QgKik7LyogY29tcGxldGlvbiBmdW5jdGlvbiAqLwogCXN0cnVjdCBtbWNfaG9zdAkJKmhvc3Q7CisKKwkvKiBBbGxvdyBvdGhlciBjb21tYW5kcyBkdXJpbmcgdGhpcyBvbmdvaW5nIGRhdGEgdHJhbnNmZXIgb3IgYnVzeSB3YWl0ICovCisJYm9vbAkJCWNhcF9jbWRfZHVyaW5nX3RmcjsKIH07CiAKIHN0cnVjdCBtbWNfY2FyZDsKQEAgLTE0Niw2ICsxNTMsOSBAQAogCQkJCQkgICBzdHJ1Y3QgbW1jX2FzeW5jX3JlcSAqLCBpbnQgKik7CiBleHRlcm4gaW50IG1tY19pbnRlcnJ1cHRfaHBpKHN0cnVjdCBtbWNfY2FyZCAqKTsKIGV4dGVybiB2b2lkIG1tY193YWl0X2Zvcl9yZXEoc3RydWN0IG1tY19ob3N0ICosIHN0cnVjdCBtbWNfcmVxdWVzdCAqKTsKK2V4dGVybiB2b2lkIG1tY193YWl0X2Zvcl9yZXFfZG9uZShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsCisJCQkJICBzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSk7CitleHRlcm4gYm9vbCBtbWNfaXNfcmVxX2RvbmUoc3RydWN0IG1tY19ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSk7CiBleHRlcm4gaW50IG1tY193YWl0X2Zvcl9jbWQoc3RydWN0IG1tY19ob3N0ICosIHN0cnVjdCBtbWNfY29tbWFuZCAqLCBpbnQpOwogZXh0ZXJuIGludCBtbWNfYXBwX2NtZChzdHJ1Y3QgbW1jX2hvc3QgKiwgc3RydWN0IG1tY19jYXJkICopOwogZXh0ZXJuIGludCBtbWNfd2FpdF9mb3JfYXBwX2NtZChzdHJ1Y3QgbW1jX2hvc3QgKiwgc3RydWN0IG1tY19jYXJkICosCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9kd19tbWMuaCBiL2luY2x1ZGUvbGludXgvbW1jL2R3X21tYy5oCmluZGV4IDgzYjBlZGZjLi5mNWFmMmJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9kd19tbWMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9kd19tbWMuaApAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZXNldC5oPgogCiAjZGVmaW5lIE1BWF9NQ0lfU0xPVFMJMgogCkBAIC0yNTksNiArMjYwLDcgQEAKIAkvKiBkZWxheSBpbiBtUyBiZWZvcmUgZGV0ZWN0aW5nIGNhcmRzIGFmdGVyIGludGVycnVwdCAqLwogCXUzMiBkZXRlY3RfZGVsYXlfbXM7CiAKKwlzdHJ1Y3QgcmVzZXRfY29udHJvbCAqcnN0YzsKIAlzdHJ1Y3QgZHdfbWNpX2RtYV9vcHMgKmRtYV9vcHM7CiAJc3RydWN0IGRtYV9wZGF0YSAqZGF0YTsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9ob3N0LmggYi9pbmNsdWRlL2xpbnV4L21tYy9ob3N0LmgKaW5kZXggYWE0YmZiZi4uMGIyNDM5NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbWMvaG9zdC5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL2hvc3QuaApAQCAtMjgxLDYgKzI4MSw3IEBACiAjZGVmaW5lIE1NQ19DQVBfRFJJVkVSX1RZUEVfQQkoMSA8PCAyMykJLyogSG9zdCBzdXBwb3J0cyBEcml2ZXIgVHlwZSBBICovCiAjZGVmaW5lIE1NQ19DQVBfRFJJVkVSX1RZUEVfQwkoMSA8PCAyNCkJLyogSG9zdCBzdXBwb3J0cyBEcml2ZXIgVHlwZSBDICovCiAjZGVmaW5lIE1NQ19DQVBfRFJJVkVSX1RZUEVfRAkoMSA8PCAyNSkJLyogSG9zdCBzdXBwb3J0cyBEcml2ZXIgVHlwZSBEICovCisjZGVmaW5lIE1NQ19DQVBfQ01EX0RVUklOR19URlIJKDEgPDwgMjkpCS8qIENvbW1hbmRzIGR1cmluZyBkYXRhIHRyYW5zZmVyICovCiAjZGVmaW5lIE1NQ19DQVBfQ01EMjMJCSgxIDw8IDMwKQkvKiBDTUQyMyBzdXBwb3J0ZWQuICovCiAjZGVmaW5lIE1NQ19DQVBfSFdfUkVTRVQJKDEgPDwgMzEpCS8qIEhhcmR3YXJlIHJlc2V0ICovCiAKQEAgLTM4Miw2ICszODMsOSBAQAogCXN0cnVjdCBtbWNfYXN5bmNfcmVxCSphcmVxOwkJLyogYWN0aXZlIGFzeW5jIHJlcSAqLwogCXN0cnVjdCBtbWNfY29udGV4dF9pbmZvCWNvbnRleHRfaW5mbzsJLyogYXN5bmMgc3luY2hyb25pemF0aW9uIGluZm8gKi8KIAorCS8qIE9uZ29pbmcgZGF0YSB0cmFuc2ZlciB0aGF0IGFsbG93cyBjb21tYW5kcyBkdXJpbmcgdHJhbnNmZXIgKi8KKwlzdHJ1Y3QgbW1jX3JlcXVlc3QJKm9uZ29pbmdfbXJxOworCiAjaWZkZWYgQ09ORklHX0ZBSUxfTU1DX1JFUVVFU1QKIAlzdHJ1Y3QgZmF1bHRfYXR0cglmYWlsX21tY19yZXF1ZXN0OwogI2VuZGlmCkBAIC00MTgsNiArNDIyLDcgQEAKIAogdm9pZCBtbWNfZGV0ZWN0X2NoYW5nZShzdHJ1Y3QgbW1jX2hvc3QgKiwgdW5zaWduZWQgbG9uZyBkZWxheSk7CiB2b2lkIG1tY19yZXF1ZXN0X2RvbmUoc3RydWN0IG1tY19ob3N0ICosIHN0cnVjdCBtbWNfcmVxdWVzdCAqKTsKK3ZvaWQgbW1jX2NvbW1hbmRfZG9uZShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKTsKIAogc3RhdGljIGlubGluZSB2b2lkIG1tY19zaWduYWxfc2Rpb19pcnEoc3RydWN0IG1tY19ob3N0ICpob3N0KQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvc2Rpb19pZHMuaCBiL2luY2x1ZGUvbGludXgvbW1jL3NkaW9faWRzLmgKaW5kZXggMGQxMjZhZS4uZDQzZWY5NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbWMvc2Rpb19pZHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9zZGlvX2lkcy5oCkBAIC0zMiw2ICszMiw3IEBACiAjZGVmaW5lIFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzMzQwCQkweGE5NGMKICNkZWZpbmUgU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDMzNDEJCTB4YTk0ZAogI2RlZmluZSBTRElPX0RFVklDRV9JRF9CUk9BRENPTV80MzM1XzQzMzkJMHg0MzM1CisjZGVmaW5lIFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzMzkJCTB4NDMzOQogI2RlZmluZSBTRElPX0RFVklDRV9JRF9CUk9BRENPTV80MzM2MgkJMHhhOTYyCiAjZGVmaW5lIFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzNDMwCQkweGE5YTYKICNkZWZpbmUgU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDM0NQkJMHg0MzQ1CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oIGIvaW5jbHVkZS9saW51eC9tbXpvbmUuaAppbmRleCBkNTcyYjc4Li43ZjJhZTk5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW16b25lLmgKQEAgLTgyOCw5ICs4MjgsMjEgQEAKICAqLwogI2RlZmluZSB6b25lX2lkeCh6b25lKQkJKCh6b25lKSAtICh6b25lKS0+em9uZV9wZ2RhdC0+bm9kZV96b25lcykKIAotc3RhdGljIGlubGluZSBpbnQgcG9wdWxhdGVkX3pvbmUoc3RydWN0IHpvbmUgKnpvbmUpCisvKgorICogUmV0dXJucyB0cnVlIGlmIGEgem9uZSBoYXMgcGFnZXMgbWFuYWdlZCBieSB0aGUgYnVkZHkgYWxsb2NhdG9yLgorICogQWxsIHRoZSByZWNsYWltIGRlY2lzaW9ucyBoYXZlIHRvIHVzZSB0aGlzIGZ1bmN0aW9uIHJhdGhlciB0aGFuCisgKiBwb3B1bGF0ZWRfem9uZSgpLiBJZiB0aGUgd2hvbGUgem9uZSBpcyByZXNlcnZlZCB0aGVuIHdlIGNhbiBlYXNpbHkKKyAqIGVuZCB1cCB3aXRoIHBvcHVsYXRlZF96b25lKCkgJiYgIW1hbmFnZWRfem9uZSgpLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgbWFuYWdlZF96b25lKHN0cnVjdCB6b25lICp6b25lKQogewotCXJldHVybiAoISF6b25lLT5wcmVzZW50X3BhZ2VzKTsKKwlyZXR1cm4gem9uZS0+bWFuYWdlZF9wYWdlczsKK30KKworLyogUmV0dXJucyB0cnVlIGlmIGEgem9uZSBoYXMgbWVtb3J5ICovCitzdGF0aWMgaW5saW5lIGJvb2wgcG9wdWxhdGVkX3pvbmUoc3RydWN0IHpvbmUgKnpvbmUpCit7CisJcmV0dXJuIHpvbmUtPnByZXNlbnRfcGFnZXM7CiB9CiAKIGV4dGVybiBpbnQgbW92YWJsZV96b25lOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tb3VudC5oIGIvaW5jbHVkZS9saW51eC9tb3VudC5oCmluZGV4IDU0YTU5NGQuLjExNzJjY2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW91bnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L21vdW50LmgKQEAgLTk2LDQgKzk2LDYgQEAKIAogZXh0ZXJuIGRldl90IG5hbWVfdG9fZGV2X3QoY29uc3QgY2hhciAqbmFtZSk7CiAKK2V4dGVybiB1bnNpZ25lZCBpbnQgc3lzY3RsX21vdW50X21heDsKKwogI2VuZGlmIC8qIF9MSU5VWF9NT1VOVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21yb3V0ZS5oIGIvaW5jbHVkZS9saW51eC9tcm91dGUuaAppbmRleCBkMzUxZmQzLi5lNWZiODEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21yb3V0ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbXJvdXRlLmgKQEAgLTEyMCw1ICsxMjAsNSBAQAogc3RydWN0IHJ0bXNnOwogaW50IGlwbXJfZ2V0X3JvdXRlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCi0JCSAgIHN0cnVjdCBydG1zZyAqcnRtLCBpbnQgbm93YWl0KTsKKwkJICAgc3RydWN0IHJ0bXNnICpydG0sIGludCBub3dhaXQsIHUzMiBwb3J0aWQpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21yb3V0ZTYuaCBiL2luY2x1ZGUvbGludXgvbXJvdXRlNi5oCmluZGV4IDM5ODdiNjQuLjE5YTFjMGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXJvdXRlNi5oCisrKyBiL2luY2x1ZGUvbGludXgvbXJvdXRlNi5oCkBAIC0xMTYsNyArMTE2LDcgQEAKIAogc3RydWN0IHJ0bXNnOwogZXh0ZXJuIGludCBpcDZtcl9nZXRfcm91dGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgc3RydWN0IHJ0bXNnICpydG0sIGludCBub3dhaXQpOworCQkJICAgc3RydWN0IHJ0bXNnICpydG0sIGludCBub3dhaXQsIHUzMiBwb3J0aWQpOwogCiAjaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFCiBleHRlcm4gc3RydWN0IHNvY2sgKm1yb3V0ZTZfc29ja2V0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21zaS5oIGIvaW5jbHVkZS9saW51eC9tc2kuaAppbmRleCBlOGM4MWZiLi4wZGIzMjBiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21zaS5oCisrKyBiL2luY2x1ZGUvbGludXgvbXNpLmgKQEAgLTY4LDcgKzY4LDcgQEAKIAl1bnNpZ25lZCBpbnQJCQludmVjX3VzZWQ7CiAJc3RydWN0IGRldmljZQkJCSpkZXY7CiAJc3RydWN0IG1zaV9tc2cJCQltc2c7Ci0JY29uc3Qgc3RydWN0IGNwdW1hc2sJCSphZmZpbml0eTsKKwlzdHJ1Y3QgY3B1bWFzawkJCSphZmZpbml0eTsKIAogCXVuaW9uIHsKIAkJLyogUENJIE1TSS9YIHNwZWNpZmljIGRhdGEgKi8KQEAgLTEyMyw3ICsxMjMsOCBAQAogfQogI2VuZGlmIC8qIENPTkZJR19QQ0lfTVNJICovCiAKLXN0cnVjdCBtc2lfZGVzYyAqYWxsb2NfbXNpX2VudHJ5KHN0cnVjdCBkZXZpY2UgKmRldik7CitzdHJ1Y3QgbXNpX2Rlc2MgKmFsbG9jX21zaV9lbnRyeShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBudmVjLAorCQkJCSBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqYWZmaW5pdHkpOwogdm9pZCBmcmVlX21zaV9lbnRyeShzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5KTsKIHZvaWQgX19wY2lfcmVhZF9tc2lfbXNnKHN0cnVjdCBtc2lfZGVzYyAqZW50cnksIHN0cnVjdCBtc2lfbXNnICptc2cpOwogdm9pZCBfX3BjaV93cml0ZV9tc2lfbXNnKHN0cnVjdCBtc2lfZGVzYyAqZW50cnksIHN0cnVjdCBtc2lfbXNnICptc2cpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXQuaCBiL2luY2x1ZGUvbGludXgvbmV0LmgKaW5kZXggYjlmMGZmNC4uY2QwYzhiZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldC5oCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgva21lbWNoZWNrLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9vbmNlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KIAogI2luY2x1ZGUgPHVhcGkvbGludXgvbmV0Lmg+CiAKQEAgLTEyOCw2ICsxMjksOSBAQAogc3RydWN0IHNvY2thZGRyOwogc3RydWN0IG1zZ2hkcjsKIHN0cnVjdCBtb2R1bGU7CitzdHJ1Y3Qgc2tfYnVmZjsKK3R5cGVkZWYgaW50ICgqc2tfcmVhZF9hY3Rvcl90KShyZWFkX2Rlc2NyaXB0b3JfdCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLAorCQkJICAgICAgIHVuc2lnbmVkIGludCwgc2l6ZV90KTsKIAogc3RydWN0IHByb3RvX29wcyB7CiAJaW50CQlmYW1pbHk7CkBAIC0xODYsNiArMTkwLDggQEAKIAkJCQkgICAgICAgc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc2l6ZV90IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzKTsKIAlpbnQJCSgqc2V0X3BlZWtfb2ZmKShzdHJ1Y3Qgc29jayAqc2ssIGludCB2YWwpOwogCWludAkJKCpwZWVrX2xlbikoc3RydWN0IHNvY2tldCAqc29jayk7CisJaW50CQkoKnJlYWRfc29jaykoc3RydWN0IHNvY2sgKnNrLCByZWFkX2Rlc2NyaXB0b3JfdCAqZGVzYywKKwkJCQkgICAgIHNrX3JlYWRfYWN0b3JfdCByZWN2X2FjdG9yKTsKIH07CiAKICNkZWZpbmUgREVDTEFSRV9TT0NLQUREUih0eXBlLCBkc3QsIHNyYykJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKaW5kZXggMDc2ZGY1My4uMTM2YWU2YmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaApAQCAtNTIsNiArNTIsNyBAQAogI2luY2x1ZGUgPHVhcGkvbGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8dWFwaS9saW51eC9pZl9ib25kaW5nLmg+CiAjaW5jbHVkZSA8dWFwaS9saW51eC9wa3RfY2xzLmg+CisjaW5jbHVkZSA8bGludXgvaGFzaHRhYmxlLmg+CiAKIHN0cnVjdCBuZXRwb2xsX2luZm87CiBzdHJ1Y3QgZGV2aWNlOwpAQCAtNzg4LDYgKzc4OSw3IEBACiAJVENfU0VUVVBfQ0xTVTMyLAogCVRDX1NFVFVQX0NMU0ZMT1dFUiwKIAlUQ19TRVRVUF9NQVRDSEFMTCwKKwlUQ19TRVRVUF9DTFNCUEYsCiB9OwogCiBzdHJ1Y3QgdGNfY2xzX3UzMl9vZmZsb2FkOwpAQCAtNzk5LDYgKzgwMSw3IEBACiAJCXN0cnVjdCB0Y19jbHNfdTMyX29mZmxvYWQgKmNsc191MzI7CiAJCXN0cnVjdCB0Y19jbHNfZmxvd2VyX29mZmxvYWQgKmNsc19mbG93ZXI7CiAJCXN0cnVjdCB0Y19jbHNfbWF0Y2hhbGxfb2ZmbG9hZCAqY2xzX21hbGw7CisJCXN0cnVjdCB0Y19jbHNfYnBmX29mZmxvYWQgKmNsc19icGY7CiAJfTsKIH07CiAKQEAgLTkyMyw2ICs5MjYsMTQgQEAKICAqCTMuIFVwZGF0ZSBkZXYtPnN0YXRzIGFzeW5jaHJvbm91c2x5IGFuZCBhdG9taWNhbGx5LCBhbmQgZGVmaW5lCiAgKgkgICBuZWl0aGVyIG9wZXJhdGlvbi4KICAqCisgKiBib29sICgqbmRvX2hhc19vZmZsb2FkX3N0YXRzKShpbnQgYXR0cl9pZCkKKyAqCVJldHVybiB0cnVlIGlmIHRoaXMgZGV2aWNlIHN1cHBvcnRzIG9mZmxvYWQgc3RhdHMgb2YgdGhpcyBhdHRyX2lkLgorICoKKyAqIGludCAoKm5kb19nZXRfb2ZmbG9hZF9zdGF0cykoaW50IGF0dHJfaWQsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgKgl2b2lkICphdHRyX2RhdGEpCisgKglHZXQgc3RhdGlzdGljcyBmb3Igb2ZmbG9hZCBvcGVyYXRpb25zIGJ5IGF0dHJfaWQuIFdyaXRlIGl0IGludG8gdGhlCisgKglhdHRyX2RhdGEgcG9pbnRlci4KKyAqCiAgKiBpbnQgKCpuZG9fdmxhbl9yeF9hZGRfdmlkKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX2JlMTYgcHJvdG8sIHUxNiB2aWQpOwogICoJSWYgZGV2aWNlIHN1cHBvcnRzIFZMQU4gZmlsdGVyaW5nIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYQogICoJVkxBTiBpZCBpcyByZWdpc3RlcmVkLgpAQCAtOTM1LDcgKzk0Niw4IEBACiAgKgogICoJU1ItSU9WIG1hbmFnZW1lbnQgZnVuY3Rpb25zLgogICogaW50ICgqbmRvX3NldF92Zl9tYWMpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB2ZiwgdTgqIG1hYyk7Ci0gKiBpbnQgKCpuZG9fc2V0X3ZmX3ZsYW4pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB2ZiwgdTE2IHZsYW4sIHU4IHFvcyk7CisgKiBpbnQgKCpuZG9fc2V0X3ZmX3ZsYW4pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB2ZiwgdTE2IHZsYW4sCisgKgkJCSAgdTggcW9zLCBfX2JlMTYgcHJvdG8pOwogICogaW50ICgqbmRvX3NldF92Zl9yYXRlKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdmYsIGludCBtaW5fdHhfcmF0ZSwKICAqCQkJICBpbnQgbWF4X3R4X3JhdGUpOwogICogaW50ICgqbmRvX3NldF92Zl9zcG9vZmNoaykoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHZmLCBib29sIHNldHRpbmcpOwpAQCAtMTAzMCw3ICsxMDQyLDcgQEAKICAqCURlbGV0ZXMgdGhlIEZEQiBlbnRyeSBmcm9tIGRldiBjb3Jlc3BvbmRpbmcgdG8gYWRkci4KICAqIGludCAoKm5kb19mZGJfZHVtcCkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAogICoJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZmlsdGVyX2RldiwKLSAqCQkgICAgICAgaW50IGlkeCkKKyAqCQkgICAgICAgaW50ICppZHgpCiAgKglVc2VkIHRvIGFkZCBGREIgZW50cmllcyB0byBkdW1wIHJlcXVlc3RzLiBJbXBsZW1lbnRlcnMgc2hvdWxkIGFkZAogICoJZW50cmllcyB0byBza2IgYW5kIHVwZGF0ZSBpZHggd2l0aCB0aGUgbnVtYmVyIG9mIGVudHJpZXMuCiAgKgpAQCAtMTE1NCw2ICsxMTY2LDEwIEBACiAKIAlzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQqICgqbmRvX2dldF9zdGF0czY0KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQkJICAgICBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0b3JhZ2UpOworCWJvb2wJCQkoKm5kb19oYXNfb2ZmbG9hZF9zdGF0cykoaW50IGF0dHJfaWQpOworCWludAkJCSgqbmRvX2dldF9vZmZsb2FkX3N0YXRzKShpbnQgYXR0cl9pZCwKKwkJCQkJCQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCQkgdm9pZCAqYXR0cl9kYXRhKTsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyogKCpuZG9fZ2V0X3N0YXRzKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAogCWludAkJCSgqbmRvX3ZsYW5fcnhfYWRkX3ZpZCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKQEAgLTExNzIsNyArMTE4OCw4IEBACiAJaW50CQkJKCpuZG9fc2V0X3ZmX21hYykoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkJCSAgaW50IHF1ZXVlLCB1OCAqbWFjKTsKIAlpbnQJCQkoKm5kb19zZXRfdmZfdmxhbikoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJCSAgIGludCBxdWV1ZSwgdTE2IHZsYW4sIHU4IHFvcyk7CisJCQkJCQkgICBpbnQgcXVldWUsIHUxNiB2bGFuLAorCQkJCQkJICAgdTggcW9zLCBfX2JlMTYgcHJvdG8pOwogCWludAkJCSgqbmRvX3NldF92Zl9yYXRlKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQkJICAgaW50IHZmLCBpbnQgbWluX3R4X3JhdGUsCiAJCQkJCQkgICBpbnQgbWF4X3R4X3JhdGUpOwpAQCAtMTI2Miw3ICsxMjc5LDcgQEAKIAkJCQkJCXN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKIAkJCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZmlsdGVyX2RldiwKLQkJCQkJCWludCBpZHgpOworCQkJCQkJaW50ICppZHgpOwogCiAJaW50CQkJKCpuZG9fYnJpZGdlX3NldGxpbmspKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCQkgICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwKQEAgLTE1NjEsOCArMTU3OCw2IEBACiAgKgogICoJQHhwc19tYXBzOglYWFg6IG5lZWQgY29tbWVudHMgb24gdGhpcyBvbmUKICAqCi0gKglAb2ZmbG9hZF9md2RfbWFyazoJT2ZmbG9hZCBkZXZpY2UgZndkaW5nIG1hcmsKLSAqCiAgKglAd2F0Y2hkb2dfdGltZW86CVJlcHJlc2VudHMgdGhlIHRpbWVvdXQgdGhhdCBpcyB1c2VkIGJ5CiAgKgkJCQl0aGUgd2F0Y2hkb2cgKHNlZSBkZXZfd2F0Y2hkb2coKSkKICAqCUB3YXRjaGRvZ190aW1lcjoJTGlzdCBvZiB0aW1lcnMKQEAgLTE3ODQsNyArMTc5OSw3IEBACiAjZW5kaWYKIAlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlIF9fcmN1ICppbmdyZXNzX3F1ZXVlOwogI2lmZGVmIENPTkZJR19ORVRGSUxURVJfSU5HUkVTUwotCXN0cnVjdCBsaXN0X2hlYWQJbmZfaG9va3NfaW5ncmVzczsKKwlzdHJ1Y3QgbmZfaG9va19lbnRyeSBfX3JjdSAqbmZfaG9va3NfaW5ncmVzczsKICNlbmRpZgogCiAJdW5zaWduZWQgY2hhcgkJYnJvYWRjYXN0W01BWF9BRERSX0xFTl07CkBAIC0xODAwLDYgKzE4MTUsOSBAQAogCXVuc2lnbmVkIGludAkJbnVtX3R4X3F1ZXVlczsKIAl1bnNpZ25lZCBpbnQJCXJlYWxfbnVtX3R4X3F1ZXVlczsKIAlzdHJ1Y3QgUWRpc2MJCSpxZGlzYzsKKyNpZmRlZiBDT05GSUdfTkVUX1NDSEVECisJREVDTEFSRV9IQVNIVEFCTEUJKHFkaXNjX2hhc2gsIDQpOworI2VuZGlmCiAJdW5zaWduZWQgbG9uZwkJdHhfcXVldWVfbGVuOwogCXNwaW5sb2NrX3QJCXR4X2dsb2JhbF9sb2NrOwogCWludAkJCXdhdGNoZG9nX3RpbWVvOwpAQCAtMTgxMCw5ICsxODI4LDYgQEAKICNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKIAlzdHJ1Y3QgdGNmX3Byb3RvIF9fcmN1ICAqZWdyZXNzX2NsX2xpc3Q7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfTkVUX1NXSVRDSERFVgotCXUzMgkJCW9mZmxvYWRfZndkX21hcms7Ci0jZW5kaWYKIAogCS8qIFRoZXNlIG1heSBiZSBuZWVkZWQgZm9yIGZ1dHVyZSBuZXR3b3JrLXBvd2VyLWRvd24gY29kZS4gKi8KIAlzdHJ1Y3QgdGltZXJfbGlzdAl3YXRjaGRvZ190aW1lcjsKQEAgLTMyNjcsNiArMzI4Miw3IEBACiAJbmFwaS0+c2tiID0gTlVMTDsKIH0KIAorYm9vbCBuZXRkZXZfaXNfcnhfaGFuZGxlcl9idXN5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogaW50IG5ldGRldl9yeF9oYW5kbGVyX3JlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgICAgICAgcnhfaGFuZGxlcl9mdW5jX3QgKnJ4X2hhbmRsZXIsCiAJCQkgICAgICAgdm9pZCAqcnhfaGFuZGxlcl9kYXRhKTsKQEAgLTM4OTEsOCArMzkwNyw3IEBACiBleHRlcm4gdTggbmV0ZGV2X3Jzc19rZXlbTkVUREVWX1JTU19LRVlfTEVOXSBfX3JlYWRfbW9zdGx5Owogdm9pZCBuZXRkZXZfcnNzX2tleV9maWxsKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbik7CiAKLWludCBkZXZfZ2V0X25lc3RfbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgICAgIGJvb2wgKCp0eXBlX2NoZWNrKShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSk7CitpbnQgZGV2X2dldF9uZXN0X2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogaW50IHNrYl9jaGVja3N1bV9oZWxwKHN0cnVjdCBza19idWZmICpza2IpOwogc3RydWN0IHNrX2J1ZmYgKl9fc2tiX2dzb19zZWdtZW50KHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcywgYm9vbCB0eF9wYXRoKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci5oCmluZGV4IDkyMzBmOWEuLmFiYzdmZGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIuaApAQCAtNTUsMTIgKzU1LDM0IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm91dDsKIAlzdHJ1Y3Qgc29jayAqc2s7CiAJc3RydWN0IG5ldCAqbmV0OwotCXN0cnVjdCBsaXN0X2hlYWQgKmhvb2tfbGlzdDsKKwlzdHJ1Y3QgbmZfaG9va19lbnRyeSBfX3JjdSAqaG9va19lbnRyaWVzOwogCWludCAoKm9rZm4pKHN0cnVjdCBuZXQgKiwgc3RydWN0IHNvY2sgKiwgc3RydWN0IHNrX2J1ZmYgKik7CiB9OwogCit0eXBlZGVmIHVuc2lnbmVkIGludCBuZl9ob29rZm4odm9pZCAqcHJpdiwKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSk7CitzdHJ1Y3QgbmZfaG9va19vcHMgeworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKworCS8qIFVzZXIgZmlsbHMgaW4gZnJvbSBoZXJlIGRvd24uICovCisJbmZfaG9va2ZuCQkqaG9vazsKKwlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OworCXZvaWQJCQkqcHJpdjsKKwl1X2ludDhfdAkJcGY7CisJdW5zaWduZWQgaW50CQlob29rbnVtOworCS8qIEhvb2tzIGFyZSBvcmRlcmVkIGluIGFzY2VuZGluZyBwcmlvcml0eS4gKi8KKwlpbnQJCQlwcmlvcml0eTsKK307CisKK3N0cnVjdCBuZl9ob29rX2VudHJ5IHsKKwlzdHJ1Y3QgbmZfaG9va19lbnRyeSBfX3JjdQkqbmV4dDsKKwlzdHJ1Y3QgbmZfaG9va19vcHMJCW9wczsKKwljb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMJKm9yaWdfb3BzOworfTsKKwogc3RhdGljIGlubGluZSB2b2lkIG5mX2hvb2tfc3RhdGVfaW5pdChzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqcCwKLQkJCQkgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpob29rX2xpc3QsCisJCQkJICAgICAgc3RydWN0IG5mX2hvb2tfZW50cnkgKmhvb2tfZW50cnksCiAJCQkJICAgICAgdW5zaWduZWQgaW50IGhvb2ssCiAJCQkJICAgICAgaW50IHRocmVzaCwgdV9pbnQ4X3QgcGYsCiAJCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmluZGV2LApAQCAtNzYsMjYgKzk4LDExIEBACiAJcC0+b3V0ID0gb3V0ZGV2OwogCXAtPnNrID0gc2s7CiAJcC0+bmV0ID0gbmV0OwotCXAtPmhvb2tfbGlzdCA9IGhvb2tfbGlzdDsKKwlSQ1VfSU5JVF9QT0lOVEVSKHAtPmhvb2tfZW50cmllcywgaG9va19lbnRyeSk7CiAJcC0+b2tmbiA9IG9rZm47CiB9CiAKLXR5cGVkZWYgdW5zaWduZWQgaW50IG5mX2hvb2tmbih2b2lkICpwcml2LAotCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKTsKIAotc3RydWN0IG5mX2hvb2tfb3BzIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIAlsaXN0OwotCi0JLyogVXNlciBmaWxscyBpbiBmcm9tIGhlcmUgZG93bi4gKi8KLQluZl9ob29rZm4JCSpob29rOwotCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7Ci0Jdm9pZAkJCSpwcml2OwotCXVfaW50OF90CQlwZjsKLQl1bnNpZ25lZCBpbnQJCWhvb2tudW07Ci0JLyogSG9va3MgYXJlIG9yZGVyZWQgaW4gYXNjZW5kaW5nIHByaW9yaXR5LiAqLwotCWludAkJCXByaW9yaXR5OwotfTsKIAogc3RydWN0IG5mX3NvY2tvcHRfb3BzIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CkBAIC0xMzMsNiArMTQwLDggQEAKIHZvaWQgbmZfdW5yZWdpc3Rlcl9ob29rKHN0cnVjdCBuZl9ob29rX29wcyAqcmVnKTsKIGludCBuZl9yZWdpc3Rlcl9ob29rcyhzdHJ1Y3QgbmZfaG9va19vcHMgKnJlZywgdW5zaWduZWQgaW50IG4pOwogdm9pZCBuZl91bnJlZ2lzdGVyX2hvb2tzKHN0cnVjdCBuZl9ob29rX29wcyAqcmVnLCB1bnNpZ25lZCBpbnQgbik7CitpbnQgX25mX3JlZ2lzdGVyX2hvb2tzKHN0cnVjdCBuZl9ob29rX29wcyAqcmVnLCB1bnNpZ25lZCBpbnQgbik7Cit2b2lkIF9uZl91bnJlZ2lzdGVyX2hvb2tzKHN0cnVjdCBuZl9ob29rX29wcyAqcmVnLCB1bnNpZ25lZCBpbnQgbik7CiAKIC8qIEZ1bmN0aW9ucyB0byByZWdpc3RlciBnZXQvc2V0c29ja29wdCByYW5nZXMgKG5vbi1pbmNsdXNpdmUpLiAgWW91CiAgICBuZWVkIHRvIGNoZWNrIHBlcm1pc3Npb25zIHlvdXJzZWxmISAqLwpAQCAtMTYxLDcgKzE3MCw4IEBACiAJCQkJIGludCAoKm9rZm4pKHN0cnVjdCBuZXQgKiwgc3RydWN0IHNvY2sgKiwgc3RydWN0IHNrX2J1ZmYgKiksCiAJCQkJIGludCB0aHJlc2gpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaG9va19saXN0OworCXN0cnVjdCBuZl9ob29rX2VudHJ5ICpob29rX2hlYWQ7CisJaW50IHJldCA9IDE7CiAKICNpZmRlZiBIQVZFX0pVTVBfTEFCRUwKIAlpZiAoX19idWlsdGluX2NvbnN0YW50X3AocGYpICYmCkBAIC0xNzAsMTYgKzE4MCwxOSBAQAogCQlyZXR1cm4gMTsKICNlbmRpZgogCi0JaG9va19saXN0ID0gJm5ldC0+bmYuaG9va3NbcGZdW2hvb2tdOwotCi0JaWYgKCFsaXN0X2VtcHR5KGhvb2tfbGlzdCkpIHsKKwlyY3VfcmVhZF9sb2NrKCk7CisJaG9va19oZWFkID0gcmN1X2RlcmVmZXJlbmNlKG5ldC0+bmYuaG9va3NbcGZdW2hvb2tdKTsKKwlpZiAoaG9va19oZWFkKSB7CiAJCXN0cnVjdCBuZl9ob29rX3N0YXRlIHN0YXRlOwogCi0JCW5mX2hvb2tfc3RhdGVfaW5pdCgmc3RhdGUsIGhvb2tfbGlzdCwgaG9vaywgdGhyZXNoLAorCQluZl9ob29rX3N0YXRlX2luaXQoJnN0YXRlLCBob29rX2hlYWQsIGhvb2ssIHRocmVzaCwKIAkJCQkgICBwZiwgaW5kZXYsIG91dGRldiwgc2ssIG5ldCwgb2tmbik7Ci0JCXJldHVybiBuZl9ob29rX3Nsb3coc2tiLCAmc3RhdGUpOworCisJCXJldCA9IG5mX2hvb2tfc2xvdyhza2IsICZzdGF0ZSk7CiAJfQotCXJldHVybiAxOworCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgbmZfaG9vayh1X2ludDhfdCBwZiwgdW5zaWduZWQgaW50IGhvb2ssIHN0cnVjdCBuZXQgKm5ldCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21tb24uaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21tb24uaAppbmRleCAyNzU1MDU3Li4xZDFlZjRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tbW9uLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbW1vbi5oCkBAIC00LDEzICs0LDkgQEAKICNpbmNsdWRlIDx1YXBpL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tbW9uLmg+CiAKIHN0cnVjdCBpcF9jb25udHJhY2tfc3RhdCB7Ci0JdW5zaWduZWQgaW50IHNlYXJjaGVkOwogCXVuc2lnbmVkIGludCBmb3VuZDsKLQl1bnNpZ25lZCBpbnQgbmV3OwogCXVuc2lnbmVkIGludCBpbnZhbGlkOwogCXVuc2lnbmVkIGludCBpZ25vcmU7Ci0JdW5zaWduZWQgaW50IGRlbGV0ZTsKLQl1bnNpZ25lZCBpbnQgZGVsZXRlX2xpc3Q7CiAJdW5zaWduZWQgaW50IGluc2VydDsKIAl1bnNpZ25lZCBpbnQgaW5zZXJ0X2ZhaWxlZDsKIAl1bnNpZ25lZCBpbnQgZHJvcDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19ncmUuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19ncmUuaAppbmRleCBkZjc4ZGMyLi5kZWUwYWNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ3JlLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2dyZS5oCkBAIC0xLDY4ICsxLDggQEAKICNpZm5kZWYgX0NPTk5UUkFDS19QUk9UT19HUkVfSAogI2RlZmluZSBfQ09OTlRSQUNLX1BST1RPX0dSRV9ICiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotCi0vKiBHUkUgUFJPVE9DT0wgSEVBREVSICovCi0KLS8qIEdSRSBWZXJzaW9uIGZpZWxkICovCi0jZGVmaW5lIEdSRV9WRVJTSU9OXzE3MDEJMHgwCi0jZGVmaW5lIEdSRV9WRVJTSU9OX1BQVFAJMHgxCi0KLS8qIEdSRSBQcm90b2NvbCBmaWVsZCAqLwotI2RlZmluZSBHUkVfUFJPVE9DT0xfUFBUUAkweDg4MEIKLQotLyogR1JFIEZsYWdzICovCi0jZGVmaW5lIEdSRV9GTEFHX0MJCTB4ODAKLSNkZWZpbmUgR1JFX0ZMQUdfUgkJMHg0MAotI2RlZmluZSBHUkVfRkxBR19LCQkweDIwCi0jZGVmaW5lIEdSRV9GTEFHX1MJCTB4MTAKLSNkZWZpbmUgR1JFX0ZMQUdfQQkJMHg4MAotCi0jZGVmaW5lIEdSRV9JU19DKGYpCSgoZikmR1JFX0ZMQUdfQykKLSNkZWZpbmUgR1JFX0lTX1IoZikJKChmKSZHUkVfRkxBR19SKQotI2RlZmluZSBHUkVfSVNfSyhmKQkoKGYpJkdSRV9GTEFHX0spCi0jZGVmaW5lIEdSRV9JU19TKGYpCSgoZikmR1JFX0ZMQUdfUykKLSNkZWZpbmUgR1JFX0lTX0EoZikJKChmKSZHUkVfRkxBR19BKQotCi0vKiBHUkUgaXMgYSBtZXNzOiBGb3VyIGRpZmZlcmVudCBzdGFuZGFyZHMgKi8KLXN0cnVjdCBncmVfaGRyIHsKLSNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKLQlfX3UxNglyZWM6MywKLQkJc3JyOjEsCi0JCXNlcToxLAotCQlrZXk6MSwKLQkJcm91dGluZzoxLAotCQljc3VtOjEsCi0JCXZlcnNpb246MywKLQkJcmVzZXJ2ZWQ6NCwKLQkJYWNrOjE7Ci0jZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKLQlfX3UxNgljc3VtOjEsCi0JCXJvdXRpbmc6MSwKLQkJa2V5OjEsCi0JCXNlcToxLAotCQlzcnI6MSwKLQkJcmVjOjMsCi0JCWFjazoxLAotCQlyZXNlcnZlZDo0LAotCQl2ZXJzaW9uOjM7Ci0jZWxzZQotI2Vycm9yICJBZGp1c3QgeW91ciA8YXNtL2J5dGVvcmRlci5oPiBkZWZpbmVzIgotI2VuZGlmCi0JX19iZTE2CXByb3RvY29sOwotfTsKLQotLyogbW9kaWZpZWQgR1JFIGhlYWRlciBmb3IgUFBUUCAqLwotc3RydWN0IGdyZV9oZHJfcHB0cCB7Ci0JX191OCAgIGZsYWdzOwkJLyogYml0ZmllbGQgKi8KLQlfX3U4ICAgdmVyc2lvbjsJCS8qIHNob3VsZCBiZSBHUkVfVkVSU0lPTl9QUFRQICovCi0JX19iZTE2IHByb3RvY29sOwkvKiBzaG91bGQgYmUgR1JFX1BST1RPQ09MX1BQVFAgKi8KLQlfX2JlMTYgcGF5bG9hZF9sZW47CS8qIHNpemUgb2YgcHBwIHBheWxvYWQsIG5vdCBpbmMuIGdyZSBoZWFkZXIgKi8KLQlfX2JlMTYgY2FsbF9pZDsJCS8qIHBlZXIncyBjYWxsX2lkIGZvciB0aGlzIHNlc3Npb24gKi8KLQlfX2JlMzIgc2VxOwkJLyogc2VxdWVuY2UgbnVtYmVyLiAgUHJlc2VudCBpZiBTPT0xICovCi0JX19iZTMyIGFjazsJCS8qIHNlcSBudW1iZXIgb2YgaGlnaGVzdCBwYWNrZXQgcmVjZWl2ZWQgYnkgKi8KLQkJCQkvKiAgc2VuZGVyIGluIHRoaXMgc2Vzc2lvbiAqLwotfTsKKyNpbmNsdWRlIDxuZXQvZ3JlLmg+CisjaW5jbHVkZSA8bmV0L3BwdHAuaD4KIAogc3RydWN0IG5mX2N0X2dyZSB7CiAJdW5zaWduZWQgaW50IHN0cmVhbV90aW1lb3V0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2FjY3QuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19hY2N0LmgKaW5kZXggODBjYTg4OS4uNjY0ZGEwMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2FjY3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfYWNjdC5oCkBAIC0xNSw2ICsxNSw2IEBACiBzdHJ1Y3QgbmZfYWNjdCAqbmZubF9hY2N0X2ZpbmRfZ2V0KHN0cnVjdCBuZXQgKm5ldCwgY29uc3QgY2hhciAqZmlsdGVyX25hbWUpOwogdm9pZCBuZm5sX2FjY3RfcHV0KHN0cnVjdCBuZl9hY2N0ICphY2N0KTsKIHZvaWQgbmZubF9hY2N0X3VwZGF0ZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmZfYWNjdCAqbmZhY2N0KTsKLWV4dGVybiBpbnQgbmZubF9hY2N0X292ZXJxdW90YShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICAgc3RydWN0IG5mX2FjY3QgKm5mYWNjdCk7CitpbnQgbmZubF9hY2N0X292ZXJxdW90YShzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQlzdHJ1Y3QgbmZfYWNjdCAqbmZhY2N0KTsKICNlbmRpZiAvKiBfTkZOTF9BQ0NUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2luZ3Jlc3MuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2luZ3Jlc3MuaAppbmRleCA1ZmNkMzc1Li4zM2UzN2ZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pbmdyZXNzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaW5ncmVzcy5oCkBAIC0xMSwyMiArMTEsMzAgQEAKIAlpZiAoIXN0YXRpY19rZXlfZmFsc2UoJm5mX2hvb2tzX25lZWRlZFtORlBST1RPX05FVERFVl1bTkZfTkVUREVWX0lOR1JFU1NdKSkKIAkJcmV0dXJuIGZhbHNlOwogI2VuZGlmCi0JcmV0dXJuICFsaXN0X2VtcHR5KCZza2ItPmRldi0+bmZfaG9va3NfaW5ncmVzcyk7CisJcmV0dXJuIHJjdV9hY2Nlc3NfcG9pbnRlcihza2ItPmRldi0+bmZfaG9va3NfaW5ncmVzcyk7CiB9CiAKKy8qIGNhbGxlciBtdXN0IGhvbGQgcmN1X3JlYWRfbG9jayAqLwogc3RhdGljIGlubGluZSBpbnQgbmZfaG9va19pbmdyZXNzKHN0cnVjdCBza19idWZmICpza2IpCiB7CisJc3RydWN0IG5mX2hvb2tfZW50cnkgKmUgPSByY3VfZGVyZWZlcmVuY2Uoc2tiLT5kZXYtPm5mX2hvb2tzX2luZ3Jlc3MpOwogCXN0cnVjdCBuZl9ob29rX3N0YXRlIHN0YXRlOwogCi0JbmZfaG9va19zdGF0ZV9pbml0KCZzdGF0ZSwgJnNrYi0+ZGV2LT5uZl9ob29rc19pbmdyZXNzLAotCQkJICAgTkZfTkVUREVWX0lOR1JFU1MsIElOVF9NSU4sIE5GUFJPVE9fTkVUREVWLAotCQkJICAgc2tiLT5kZXYsIE5VTEwsIE5VTEwsIGRldl9uZXQoc2tiLT5kZXYpLCBOVUxMKTsKKwkvKiBNdXN0IHJlY2hlY2sgdGhlIGluZ3Jlc3MgaG9vayBoZWFkLCBpbiB0aGUgZXZlbnQgaXQgYmVjYW1lIE5VTEwKKwkgKiBhZnRlciB0aGUgY2hlY2sgaW4gbmZfaG9va19pbmdyZXNzX2FjdGl2ZSBldmFsdWF0ZWQgdG8gdHJ1ZS4KKwkgKi8KKwlpZiAodW5saWtlbHkoIWUpKQorCQlyZXR1cm4gMDsKKworCW5mX2hvb2tfc3RhdGVfaW5pdCgmc3RhdGUsIGUsIE5GX05FVERFVl9JTkdSRVNTLCBJTlRfTUlOLAorCQkJICAgTkZQUk9UT19ORVRERVYsIHNrYi0+ZGV2LCBOVUxMLCBOVUxMLAorCQkJICAgZGV2X25ldChza2ItPmRldiksIE5VTEwpOwogCXJldHVybiBuZl9ob29rX3Nsb3coc2tiLCAmc3RhdGUpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbmZfaG9va19pbmdyZXNzX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlJTklUX0xJU1RfSEVBRCgmZGV2LT5uZl9ob29rc19pbmdyZXNzKTsKKwlSQ1VfSU5JVF9QT0lOVEVSKGRldi0+bmZfaG9va3NfaW5ncmVzcywgTlVMTCk7CiB9CiAjZWxzZSAvKiBDT05GSUdfTkVURklMVEVSX0lOR1JFU1MgKi8KIHN0YXRpYyBpbmxpbmUgaW50IG5mX2hvb2tfaW5ncmVzc19hY3RpdmUoc3RydWN0IHNrX2J1ZmYgKnNrYikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbnZtZS5oIGIvaW5jbHVkZS9saW51eC9udm1lLmgKaW5kZXggZDhiMzdiYS4uNzY3NjU1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9udm1lLmgKKysrIGIvaW5jbHVkZS9saW51eC9udm1lLmgKQEAgLTc5NCw3ICs3OTQsNyBAQAogfTsKIAogc3RydWN0IG52bWZfY29ubmVjdF9kYXRhIHsKLQl1dWlkX2xlCQlob3N0aWQ7CisJdXVpZF9iZQkJaG9zdGlkOwogCV9fbGUxNgkJY250bGlkOwogCWNoYXIJCXJlc3Y0WzIzOF07CiAJY2hhcgkJc3Vic3lzbnFuW05WTUZfTlFOX0ZJRUxEX0xFTl07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29mLmggYi9pbmNsdWRlL2xpbnV4L29mLmgKaW5kZXggM2Q5ZmY4ZS4uMjk5YWViMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vZi5oCisrKyBiL2luY2x1ZGUvbGludXgvb2YuaApAQCAtMjkxLDIwICsyOTEsMjQgQEAKIGV4dGVybiBpbnQgb2ZfcHJvcGVydHlfcmVhZF91MzJfaW5kZXgoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKIAkJCQkgICAgICAgY29uc3QgY2hhciAqcHJvcG5hbWUsCiAJCQkJICAgICAgIHUzMiBpbmRleCwgdTMyICpvdXRfdmFsdWUpOwotZXh0ZXJuIGludCBvZl9wcm9wZXJ0eV9yZWFkX3U4X2FycmF5KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQljb25zdCBjaGFyICpwcm9wbmFtZSwgdTggKm91dF92YWx1ZXMsIHNpemVfdCBzeik7Ci1leHRlcm4gaW50IG9mX3Byb3BlcnR5X3JlYWRfdTE2X2FycmF5KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQljb25zdCBjaGFyICpwcm9wbmFtZSwgdTE2ICpvdXRfdmFsdWVzLCBzaXplX3Qgc3opOwotZXh0ZXJuIGludCBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLAotCQkJCSAgICAgIHUzMiAqb3V0X3ZhbHVlcywKLQkJCQkgICAgICBzaXplX3Qgc3opOworZXh0ZXJuIGludCBvZl9wcm9wZXJ0eV9yZWFkX3ZhcmlhYmxlX3U4X2FycmF5KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJCWNvbnN0IGNoYXIgKnByb3BuYW1lLCB1OCAqb3V0X3ZhbHVlcywKKwkJCQkJc2l6ZV90IHN6X21pbiwgc2l6ZV90IHN6X21heCk7CitleHRlcm4gaW50IG9mX3Byb3BlcnR5X3JlYWRfdmFyaWFibGVfdTE2X2FycmF5KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJCWNvbnN0IGNoYXIgKnByb3BuYW1lLCB1MTYgKm91dF92YWx1ZXMsCisJCQkJCXNpemVfdCBzel9taW4sIHNpemVfdCBzel9tYXgpOworZXh0ZXJuIGludCBvZl9wcm9wZXJ0eV9yZWFkX3ZhcmlhYmxlX3UzMl9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQljb25zdCBjaGFyICpwcm9wbmFtZSwKKwkJCQkJdTMyICpvdXRfdmFsdWVzLAorCQkJCQlzaXplX3Qgc3pfbWluLAorCQkJCQlzaXplX3Qgc3pfbWF4KTsKIGV4dGVybiBpbnQgb2ZfcHJvcGVydHlfcmVhZF91NjQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKIAkJCQljb25zdCBjaGFyICpwcm9wbmFtZSwgdTY0ICpvdXRfdmFsdWUpOwotZXh0ZXJuIGludCBvZl9wcm9wZXJ0eV9yZWFkX3U2NF9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLAotCQkJCSAgICAgIHU2NCAqb3V0X3ZhbHVlcywKLQkJCQkgICAgICBzaXplX3Qgc3opOworZXh0ZXJuIGludCBvZl9wcm9wZXJ0eV9yZWFkX3ZhcmlhYmxlX3U2NF9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQljb25zdCBjaGFyICpwcm9wbmFtZSwKKwkJCQkJdTY0ICpvdXRfdmFsdWVzLAorCQkJCQlzaXplX3Qgc3pfbWluLAorCQkJCQlzaXplX3Qgc3pfbWF4KTsKIAogZXh0ZXJuIGludCBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAogCQkJCSAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLApAQCAtMzgwLDYgKzM4NCwxMjIgQEAKIAogI2RlZmluZSBvZl9tYXRjaF9wdHIoX3B0cikJKF9wdHIpCiAKKy8qKgorICogb2ZfcHJvcGVydHlfcmVhZF91OF9hcnJheSAtIEZpbmQgYW5kIHJlYWQgYW4gYXJyYXkgb2YgdTggZnJvbSBhIHByb3BlcnR5LgorICoKKyAqIEBucDoJCWRldmljZSBub2RlIGZyb20gd2hpY2ggdGhlIHByb3BlcnR5IHZhbHVlIGlzIHRvIGJlIHJlYWQuCisgKiBAcHJvcG5hbWU6CW5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNlYXJjaGVkLgorICogQG91dF92YWx1ZXM6CXBvaW50ZXIgdG8gcmV0dXJuIHZhbHVlLCBtb2RpZmllZCBvbmx5IGlmIHJldHVybiB2YWx1ZSBpcyAwLgorICogQHN6OgkJbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIHRvIHJlYWQKKyAqCisgKiBTZWFyY2ggZm9yIGEgcHJvcGVydHkgaW4gYSBkZXZpY2Ugbm9kZSBhbmQgcmVhZCA4LWJpdCB2YWx1ZShzKSBmcm9tCisgKiBpdC4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgaWYgdGhlIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0LAorICogLUVOT0RBVEEgaWYgcHJvcGVydHkgZG9lcyBub3QgaGF2ZSBhIHZhbHVlLCBhbmQgLUVPVkVSRkxPVyBpZiB0aGUKKyAqIHByb3BlcnR5IGRhdGEgaXNuJ3QgbGFyZ2UgZW5vdWdoLgorICoKKyAqIGR0cyBlbnRyeSBvZiBhcnJheSBzaG91bGQgYmUgbGlrZToKKyAqCXByb3BlcnR5ID0gL2JpdHMvIDggPDB4NTAgMHg2MCAweDcwPjsKKyAqCisgKiBUaGUgb3V0X3ZhbHVlcyBpcyBtb2RpZmllZCBvbmx5IGlmIGEgdmFsaWQgdTggdmFsdWUgY2FuIGJlIGRlY29kZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG9mX3Byb3BlcnR5X3JlYWRfdThfYXJyYXkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkJICAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLAorCQkJCQkgICAgdTggKm91dF92YWx1ZXMsIHNpemVfdCBzeikKK3sKKwlpbnQgcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF92YXJpYWJsZV91OF9hcnJheShucCwgcHJvcG5hbWUsIG91dF92YWx1ZXMsCisJCQkJCQkgICAgIHN6LCAwKTsKKwlpZiAocmV0ID49IDApCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBvZl9wcm9wZXJ0eV9yZWFkX3UxNl9hcnJheSAtIEZpbmQgYW5kIHJlYWQgYW4gYXJyYXkgb2YgdTE2IGZyb20gYSBwcm9wZXJ0eS4KKyAqCisgKiBAbnA6CQlkZXZpY2Ugbm9kZSBmcm9tIHdoaWNoIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB0byBiZSByZWFkLgorICogQHByb3BuYW1lOgluYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBzZWFyY2hlZC4KKyAqIEBvdXRfdmFsdWVzOglwb2ludGVyIHRvIHJldHVybiB2YWx1ZSwgbW9kaWZpZWQgb25seSBpZiByZXR1cm4gdmFsdWUgaXMgMC4KKyAqIEBzejoJCW51bWJlciBvZiBhcnJheSBlbGVtZW50cyB0byByZWFkCisgKgorICogU2VhcmNoIGZvciBhIHByb3BlcnR5IGluIGEgZGV2aWNlIG5vZGUgYW5kIHJlYWQgMTYtYml0IHZhbHVlKHMpIGZyb20KKyAqIGl0LiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVJTlZBTCBpZiB0aGUgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QsCisgKiAtRU5PREFUQSBpZiBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUsIGFuZCAtRU9WRVJGTE9XIGlmIHRoZQorICogcHJvcGVydHkgZGF0YSBpc24ndCBsYXJnZSBlbm91Z2guCisgKgorICogZHRzIGVudHJ5IG9mIGFycmF5IHNob3VsZCBiZSBsaWtlOgorICoJcHJvcGVydHkgPSAvYml0cy8gMTYgPDB4NTAwMCAweDYwMDAgMHg3MDAwPjsKKyAqCisgKiBUaGUgb3V0X3ZhbHVlcyBpcyBtb2RpZmllZCBvbmx5IGlmIGEgdmFsaWQgdTE2IHZhbHVlIGNhbiBiZSBkZWNvZGVkLgorICovCitzdGF0aWMgaW5saW5lIGludCBvZl9wcm9wZXJ0eV9yZWFkX3UxNl9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQkgICAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLAorCQkJCQkgICAgIHUxNiAqb3V0X3ZhbHVlcywgc2l6ZV90IHN6KQoreworCWludCByZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3ZhcmlhYmxlX3UxNl9hcnJheShucCwgcHJvcG5hbWUsIG91dF92YWx1ZXMsCisJCQkJCQkgICAgICBzeiwgMCk7CisJaWYgKHJldCA+PSAwKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkgLSBGaW5kIGFuZCByZWFkIGFuIGFycmF5IG9mIDMyIGJpdCBpbnRlZ2VycworICogZnJvbSBhIHByb3BlcnR5LgorICoKKyAqIEBucDoJCWRldmljZSBub2RlIGZyb20gd2hpY2ggdGhlIHByb3BlcnR5IHZhbHVlIGlzIHRvIGJlIHJlYWQuCisgKiBAcHJvcG5hbWU6CW5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNlYXJjaGVkLgorICogQG91dF92YWx1ZXM6CXBvaW50ZXIgdG8gcmV0dXJuIHZhbHVlLCBtb2RpZmllZCBvbmx5IGlmIHJldHVybiB2YWx1ZSBpcyAwLgorICogQHN6OgkJbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIHRvIHJlYWQKKyAqCisgKiBTZWFyY2ggZm9yIGEgcHJvcGVydHkgaW4gYSBkZXZpY2Ugbm9kZSBhbmQgcmVhZCAzMi1iaXQgdmFsdWUocykgZnJvbQorICogaXQuIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCwKKyAqIC1FTk9EQVRBIGlmIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYSB2YWx1ZSwgYW5kIC1FT1ZFUkZMT1cgaWYgdGhlCisgKiBwcm9wZXJ0eSBkYXRhIGlzbid0IGxhcmdlIGVub3VnaC4KKyAqCisgKiBUaGUgb3V0X3ZhbHVlcyBpcyBtb2RpZmllZCBvbmx5IGlmIGEgdmFsaWQgdTMyIHZhbHVlIGNhbiBiZSBkZWNvZGVkLgorICovCitzdGF0aWMgaW5saW5lIGludCBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQkgICAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLAorCQkJCQkgICAgIHUzMiAqb3V0X3ZhbHVlcywgc2l6ZV90IHN6KQoreworCWludCByZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3ZhcmlhYmxlX3UzMl9hcnJheShucCwgcHJvcG5hbWUsIG91dF92YWx1ZXMsCisJCQkJCQkgICAgICBzeiwgMCk7CisJaWYgKHJldCA+PSAwKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogb2ZfcHJvcGVydHlfcmVhZF91NjRfYXJyYXkgLSBGaW5kIGFuZCByZWFkIGFuIGFycmF5IG9mIDY0IGJpdCBpbnRlZ2VycworICogZnJvbSBhIHByb3BlcnR5LgorICoKKyAqIEBucDoJCWRldmljZSBub2RlIGZyb20gd2hpY2ggdGhlIHByb3BlcnR5IHZhbHVlIGlzIHRvIGJlIHJlYWQuCisgKiBAcHJvcG5hbWU6CW5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNlYXJjaGVkLgorICogQG91dF92YWx1ZXM6CXBvaW50ZXIgdG8gcmV0dXJuIHZhbHVlLCBtb2RpZmllZCBvbmx5IGlmIHJldHVybiB2YWx1ZSBpcyAwLgorICogQHN6OgkJbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIHRvIHJlYWQKKyAqCisgKiBTZWFyY2ggZm9yIGEgcHJvcGVydHkgaW4gYSBkZXZpY2Ugbm9kZSBhbmQgcmVhZCA2NC1iaXQgdmFsdWUocykgZnJvbQorICogaXQuIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCwKKyAqIC1FTk9EQVRBIGlmIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYSB2YWx1ZSwgYW5kIC1FT1ZFUkZMT1cgaWYgdGhlCisgKiBwcm9wZXJ0eSBkYXRhIGlzbid0IGxhcmdlIGVub3VnaC4KKyAqCisgKiBUaGUgb3V0X3ZhbHVlcyBpcyBtb2RpZmllZCBvbmx5IGlmIGEgdmFsaWQgdTY0IHZhbHVlIGNhbiBiZSBkZWNvZGVkLgorICovCitzdGF0aWMgaW5saW5lIGludCBvZl9wcm9wZXJ0eV9yZWFkX3U2NF9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQkgICAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLAorCQkJCQkgICAgIHU2NCAqb3V0X3ZhbHVlcywgc2l6ZV90IHN6KQoreworCWludCByZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3ZhcmlhYmxlX3U2NF9hcnJheShucCwgcHJvcG5hbWUsIG91dF92YWx1ZXMsCisJCQkJCQkgICAgICBzeiwgMCk7CisJaWYgKHJldCA+PSAwKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiByZXQ7Cit9CisKIC8qCiAgKiBzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CiAgKiBjb25zdCBfX2JlMzIgKnA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29mX2ZkdC5oIGIvaW5jbHVkZS9saW51eC9vZl9mZHQuaAppbmRleCAyNmMzMzAyLi40MzQxZjMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L29mX2ZkdC5oCisrKyBiL2luY2x1ZGUvbGludXgvb2ZfZmR0LmgKQEAgLTE0LDYgKzE0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAKIC8qIERlZmluaXRpb25zIHVzZWQgYnkgdGhlIGZsYXR0ZW5lZCBkZXZpY2UgdHJlZSAqLwogI2RlZmluZSBPRl9EVF9IRUFERVIJCTB4ZDAwZGZlZWQJLyogbWFya2VyICovCkBAIC02Niw2ICs2Nyw3IEBACiAJCQkJICAgICBpbnQgZGVwdGgsIHZvaWQgKmRhdGEpOwogZXh0ZXJuIGludCBlYXJseV9pbml0X2R0X3NjYW5fbWVtb3J5KHVuc2lnbmVkIGxvbmcgbm9kZSwgY29uc3QgY2hhciAqdW5hbWUsCiAJCQkJICAgICBpbnQgZGVwdGgsIHZvaWQgKmRhdGEpOworZXh0ZXJuIGludCBlYXJseV9pbml0X2R0X3NjYW5fY2hvc2VuX3N0ZG91dCh2b2lkKTsKIGV4dGVybiB2b2lkIGVhcmx5X2luaXRfZmR0X3NjYW5fcmVzZXJ2ZWRfbWVtKHZvaWQpOwogZXh0ZXJuIHZvaWQgZWFybHlfaW5pdF9mZHRfcmVzZXJ2ZV9zZWxmKHZvaWQpOwogZXh0ZXJuIHZvaWQgZWFybHlfaW5pdF9kdF9hZGRfbWVtb3J5X2FyY2godTY0IGJhc2UsIHU2NCBzaXplKTsKQEAgLTk0LDYgKzk2LDcgQEAKIGV4dGVybiB1NjQgb2ZfZmxhdF9kdF90cmFuc2xhdGVfYWRkcmVzcyh1bnNpZ25lZCBsb25nIG5vZGUpOwogZXh0ZXJuIHZvaWQgb2ZfZmR0X2xpbWl0X21lbW9yeShpbnQgbGltaXQpOwogI2Vsc2UgLyogQ09ORklHX09GX0ZMQVRUUkVFICovCitzdGF0aWMgaW5saW5lIGludCBlYXJseV9pbml0X2R0X3NjYW5fY2hvc2VuX3N0ZG91dCh2b2lkKSB7IHJldHVybiAtRU5PREVWOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgZWFybHlfaW5pdF9mZHRfc2Nhbl9yZXNlcnZlZF9tZW0odm9pZCkge30KIHN0YXRpYyBpbmxpbmUgdm9pZCBlYXJseV9pbml0X2ZkdF9yZXNlcnZlX3NlbGYodm9pZCkge30KIHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqb2ZfZmxhdF9kdF9nZXRfbWFjaGluZV9uYW1lKHZvaWQpIHsgcmV0dXJuIE5VTEw7IH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb2ZfZ3Bpby5oIGIvaW5jbHVkZS9saW51eC9vZl9ncGlvLmgKaW5kZXggMDkyMTg2Yy4uM2Y4N2VhNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vZl9ncGlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9vZl9ncGlvLmgKQEAgLTYxLDggKzYxLDYgQEAKIH0KIGV4dGVybiB2b2lkIG9mX21tX2dwaW9jaGlwX3JlbW92ZShzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbV9nYyk7CiAKLWV4dGVybiBpbnQgb2ZfZ3Bpb2NoaXBfYWRkKHN0cnVjdCBncGlvX2NoaXAgKmdjKTsKLWV4dGVybiB2b2lkIG9mX2dwaW9jaGlwX3JlbW92ZShzdHJ1Y3QgZ3Bpb19jaGlwICpnYyk7CiBleHRlcm4gaW50IG9mX2dwaW9fc2ltcGxlX3hsYXRlKHN0cnVjdCBncGlvX2NoaXAgKmdjLAogCQkJCWNvbnN0IHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmdwaW9zcGVjLAogCQkJCXUzMiAqZmxhZ3MpOwpAQCAtODYsOSArODQsNiBAQAogCXJldHVybiAtRU5PU1lTOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBvZl9ncGlvY2hpcF9hZGQoc3RydWN0IGdwaW9fY2hpcCAqZ2MpIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBvZl9ncGlvY2hpcF9yZW1vdmUoc3RydWN0IGdwaW9fY2hpcCAqZ2MpIHsgfQotCiAjZW5kaWYgLyogQ09ORklHX09GX0dQSU8gKi8KIAogLyoqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29tYXAtZG1hLmggYi9pbmNsdWRlL2xpbnV4L29tYXAtZG1hLmgKaW5kZXggMWQ5OWI2MS4uMjkwMDgxNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vbWFwLWRtYS5oCisrKyBiL2luY2x1ZGUvbGludXgvb21hcC1kbWEuaApAQCAtMjk3LDYgKzI5Nyw3IEBACiAjZGVmaW5lIGRtYV9vbWFwMTV4eCgpCV9fZG1hX29tYXAxNXh4KGQpCiAjZGVmaW5lIGRtYV9vbWFwMTZ4eCgpCV9fZG1hX29tYXAxNnh4KGQpCiAKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVApCiBleHRlcm4gc3RydWN0IG9tYXBfc3lzdGVtX2RtYV9wbGF0X2luZm8gKm9tYXBfZ2V0X3BsYXRfaW5mbyh2b2lkKTsKIAogZXh0ZXJuIHZvaWQgb21hcF9zZXRfZG1hX3ByaW9yaXR5KGludCBsY2gsIGludCBkc3RfcG9ydCwgaW50IHByaW9yaXR5KTsKQEAgLTM1NSw0ICszNTYsMjIgQEAKIH0KICNlbmRpZgogCisjZWxzZSAvKiBDT05GSUdfQVJDSF9PTUFQICovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG9tYXBfc3lzdGVtX2RtYV9wbGF0X2luZm8gKm9tYXBfZ2V0X3BsYXRfaW5mbyh2b2lkKQoreworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIGludCBvbWFwX3JlcXVlc3RfZG1hKGludCBkZXZfaWQsIGNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJdm9pZCAoKmNhbGxiYWNrKShpbnQgbGNoLCB1MTYgY2hfc3RhdHVzLCB2b2lkICpkYXRhKSwKKwkJCXZvaWQgKmRhdGEsIGludCAqZG1hX2NoKQoreworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcF9mcmVlX2RtYShpbnQgY2gpIHsgfQorCisjZW5kaWYgLyogQ09ORklHX0FSQ0hfT01BUCAqLworCiAjZW5kaWYgLyogX19MSU5VWF9PTUFQX0RNQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BhZGF0YS5oIGIvaW5jbHVkZS9saW51eC9wYWRhdGEuaAppbmRleCAxMTNlZTYyLi4wZjllNTY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BhZGF0YS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGFkYXRhLmgKQEAgLTE1MSw3ICsxNTEsNyBAQAogICogQGZsYWdzOiBwYWRhdGEgZmxhZ3MuCiAgKi8KIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgewotCXN0cnVjdCBub3RpZmllcl9ibG9jawkJIGNwdV9ub3RpZmllcjsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZQkJIG5vZGU7CiAJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJCSp3cTsKIAlzdHJ1Y3QgcGFyYWxsZWxfZGF0YQkJKnBkOwogCXN0cnVjdCBwYWRhdGFfY3B1bWFzawkJY3B1bWFzazsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGFnZW1hcC5oIGIvaW5jbHVkZS9saW51eC9wYWdlbWFwLmgKaW5kZXggNjZhMTI2MC4uMDFlODQ0MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wYWdlbWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9wYWdlbWFwLmgKQEAgLTU3MSw1NiArNTcxLDU3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGZhdWx0X2luX211bHRpcGFnZXNfd3JpdGVhYmxlKGNoYXIgX191c2VyICp1YWRkciwgaW50IHNpemUpCiB7Ci0JaW50IHJldCA9IDA7CiAJY2hhciBfX3VzZXIgKmVuZCA9IHVhZGRyICsgc2l6ZSAtIDE7CiAKIAlpZiAodW5saWtlbHkoc2l6ZSA9PSAwKSkKLQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIDA7CiAKKwlpZiAodW5saWtlbHkodWFkZHIgPiBlbmQpKQorCQlyZXR1cm4gLUVGQVVMVDsKIAkvKgogCSAqIFdyaXRpbmcgemVyb2VzIGludG8gdXNlcnNwYWNlIGhlcmUgaXMgT0ssIGJlY2F1c2Ugd2Uga25vdyB0aGF0IGlmCiAJICogdGhlIHplcm8gZ2V0cyB0aGVyZSwgd2UnbGwgYmUgb3ZlcndyaXRpbmcgaXQuCiAJICovCi0Jd2hpbGUgKHVhZGRyIDw9IGVuZCkgewotCQlyZXQgPSBfX3B1dF91c2VyKDAsIHVhZGRyKTsKLQkJaWYgKHJldCAhPSAwKQotCQkJcmV0dXJuIHJldDsKKwlkbyB7CisJCWlmICh1bmxpa2VseShfX3B1dF91c2VyKDAsIHVhZGRyKSAhPSAwKSkKKwkJCXJldHVybiAtRUZBVUxUOwogCQl1YWRkciArPSBQQUdFX1NJWkU7Ci0JfQorCX0gd2hpbGUgKHVhZGRyIDw9IGVuZCk7CiAKIAkvKiBDaGVjayB3aGV0aGVyIHRoZSByYW5nZSBzcGlsbGVkIGludG8gdGhlIG5leHQgcGFnZS4gKi8KIAlpZiAoKCh1bnNpZ25lZCBsb25nKXVhZGRyICYgUEFHRV9NQVNLKSA9PQogCQkJKCh1bnNpZ25lZCBsb25nKWVuZCAmIFBBR0VfTUFTSykpCi0JCXJldCA9IF9fcHV0X3VzZXIoMCwgZW5kKTsKKwkJcmV0dXJuIF9fcHV0X3VzZXIoMCwgZW5kKTsKIAotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGZhdWx0X2luX211bHRpcGFnZXNfcmVhZGFibGUoY29uc3QgY2hhciBfX3VzZXIgKnVhZGRyLAogCQkJCQkgICAgICAgaW50IHNpemUpCiB7CiAJdm9sYXRpbGUgY2hhciBjOwotCWludCByZXQgPSAwOwogCWNvbnN0IGNoYXIgX191c2VyICplbmQgPSB1YWRkciArIHNpemUgLSAxOwogCiAJaWYgKHVubGlrZWx5KHNpemUgPT0gMCkpCi0JCXJldHVybiByZXQ7CisJCXJldHVybiAwOwogCi0Jd2hpbGUgKHVhZGRyIDw9IGVuZCkgewotCQlyZXQgPSBfX2dldF91c2VyKGMsIHVhZGRyKTsKLQkJaWYgKHJldCAhPSAwKQotCQkJcmV0dXJuIHJldDsKKwlpZiAodW5saWtlbHkodWFkZHIgPiBlbmQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvIHsKKwkJaWYgKHVubGlrZWx5KF9fZ2V0X3VzZXIoYywgdWFkZHIpICE9IDApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXVhZGRyICs9IFBBR0VfU0laRTsKLQl9CisJfSB3aGlsZSAodWFkZHIgPD0gZW5kKTsKIAogCS8qIENoZWNrIHdoZXRoZXIgdGhlIHJhbmdlIHNwaWxsZWQgaW50byB0aGUgbmV4dCBwYWdlLiAqLwogCWlmICgoKHVuc2lnbmVkIGxvbmcpdWFkZHIgJiBQQUdFX01BU0spID09CiAJCQkoKHVuc2lnbmVkIGxvbmcpZW5kICYgUEFHRV9NQVNLKSkgewotCQlyZXQgPSBfX2dldF91c2VyKGMsIGVuZCk7Ci0JCSh2b2lkKWM7CisJCXJldHVybiBfX2dldF91c2VyKGMsIGVuZCk7CiAJfQogCi0JcmV0dXJuIHJldDsKKwkodm9pZCljOworCXJldHVybiAwOwogfQogCiBpbnQgYWRkX3RvX3BhZ2VfY2FjaGVfbG9ja2VkKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpLmggYi9pbmNsdWRlL2xpbnV4L3BjaS5oCmluZGV4IDI1OTlhOTguLjdjYzBhY2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2kuaApAQCAtNjgzLDE1ICs2ODMsNiBAQAogI2RlZmluZQl0b19wY2lfZHJpdmVyKGRydikgY29udGFpbmVyX29mKGRydiwgc3RydWN0IHBjaV9kcml2ZXIsIGRyaXZlcikKIAogLyoqCi0gKiBERUZJTkVfUENJX0RFVklDRV9UQUJMRSAtIG1hY3JvIHVzZWQgdG8gZGVzY3JpYmUgYSBwY2kgZGV2aWNlIHRhYmxlCi0gKiBAX3RhYmxlOiBkZXZpY2UgdGFibGUgbmFtZQotICoKLSAqIFRoaXMgbWFjcm8gaXMgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIG5ldyBjb2RlLgotICovCi0jZGVmaW5lIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKF90YWJsZSkgXAotCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIF90YWJsZVtdCi0KLS8qKgogICogUENJX0RFVklDRSAtIG1hY3JvIHVzZWQgdG8gZGVzY3JpYmUgYSBzcGVjaWZpYyBwY2kgZGV2aWNlCiAgKiBAdmVuZDogdGhlIDE2IGJpdCBQQ0kgVmVuZG9yIElECiAgKiBAZGV2OiB0aGUgMTYgYml0IFBDSSBEZXZpY2UgSUQKQEAgLTExMzUsNiArMTEyNiw3IEBACiBpbnQgcGNpX2VuYWJsZV9yZXNvdXJjZXMoc3RydWN0IHBjaV9kZXYgKiwgaW50IG1hc2spOwogdm9pZCBwY2lfZml4dXBfaXJxcyh1OCAoKikoc3RydWN0IHBjaV9kZXYgKiwgdTggKiksCiAJCSAgICBpbnQgKCopKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICosIHU4LCB1OCkpOworc3RydWN0IHJlc291cmNlICpwY2lfZmluZF9yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcyk7CiAjZGVmaW5lIEhBVkVfUENJX1JFUV9SRUdJT05TCTIKIGludCBfX211c3RfY2hlY2sgcGNpX3JlcXVlc3RfcmVnaW9ucyhzdHJ1Y3QgcGNpX2RldiAqLCBjb25zdCBjaGFyICopOwogaW50IF9fbXVzdF9jaGVjayBwY2lfcmVxdWVzdF9yZWdpb25zX2V4Y2x1c2l2ZShzdHJ1Y3QgcGNpX2RldiAqLCBjb25zdCBjaGFyICopOwpAQCAtMTI1MSwxMCArMTI0MywxMiBAQAogaW50IHBjaV9zZXRfdmdhX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBib29sIGRlY29kZSwKIAkJICAgICAgdW5zaWduZWQgaW50IGNvbW1hbmRfYml0cywgdTMyIGZsYWdzKTsKIAotI2RlZmluZSBQQ0lfSVJRX05PTEVHQUNZCSgxIDw8IDApIC8qIGRvbid0IHVzZSBsZWdhY3kgaW50ZXJydXB0cyAqLwotI2RlZmluZSBQQ0lfSVJRX05PTVNJCQkoMSA8PCAxKSAvKiBkb24ndCB1c2UgTVNJIGludGVycnVwdHMgKi8KLSNkZWZpbmUgUENJX0lSUV9OT01TSVgJCSgxIDw8IDIpIC8qIGRvbid0IHVzZSBNU0ktWCBpbnRlcnJ1cHRzICovCi0jZGVmaW5lIFBDSV9JUlFfTk9BRkZJTklUWQkoMSA8PCAzKSAvKiBkb24ndCBhdXRvLWFzc2lnbiBhZmZpbml0eSAqLworI2RlZmluZSBQQ0lfSVJRX0xFR0FDWQkJKDEgPDwgMCkgLyogYWxsb3cgbGVnYWN5IGludGVycnVwdHMgKi8KKyNkZWZpbmUgUENJX0lSUV9NU0kJCSgxIDw8IDEpIC8qIGFsbG93IE1TSSBpbnRlcnJ1cHRzICovCisjZGVmaW5lIFBDSV9JUlFfTVNJWAkJKDEgPDwgMikgLyogYWxsb3cgTVNJLVggaW50ZXJydXB0cyAqLworI2RlZmluZSBQQ0lfSVJRX0FGRklOSVRZCSgxIDw8IDMpIC8qIGF1dG8tYXNzaWduIGFmZmluaXR5ICovCisjZGVmaW5lIFBDSV9JUlFfQUxMX1RZUEVTIFwKKwkoUENJX0lSUV9MRUdBQ1kgfCBQQ0lfSVJRX01TSSB8IFBDSV9JUlFfTVNJWCkKIAogLyoga21lbV9jYWNoZSBzdHlsZSB3cmFwcGVyIGFyb3VuZCBwY2lfYWxsb2NfY29uc2lzdGVudCgpICovCiAKQEAgLTEzMDcsNiArMTMwMSw3IEBACiAJCXVuc2lnbmVkIGludCBtYXhfdmVjcywgdW5zaWduZWQgaW50IGZsYWdzKTsKIHZvaWQgcGNpX2ZyZWVfaXJxX3ZlY3RvcnMoc3RydWN0IHBjaV9kZXYgKmRldik7CiBpbnQgcGNpX2lycV92ZWN0b3Ioc3RydWN0IHBjaV9kZXYgKmRldiwgdW5zaWduZWQgaW50IG5yKTsKK2NvbnN0IHN0cnVjdCBjcHVtYXNrICpwY2lfaXJxX2dldF9hZmZpbml0eShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IHZlYyk7CiAKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBwY2lfbXNpX3ZlY19jb3VudChzdHJ1Y3QgcGNpX2RldiAqZGV2KSB7IHJldHVybiAtRU5PU1lTOyB9CkBAIC0xMzQ5LDYgKzEzNDQsMTEgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIGRldi0+aXJxOwogfQorc3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqcGNpX2lycV9nZXRfYWZmaW5pdHkoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCWludCB2ZWMpCit7CisJcmV0dXJuIGNwdV9wb3NzaWJsZV9tYXNrOworfQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfUENJRVBPUlRCVVMKQEAgLTE1NDksNiArMTU0OSw5IEBACiAJCQkJICBpbnQgZW5hYmxlKQogeyByZXR1cm4gMDsgfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCByZXNvdXJjZSAqcGNpX2ZpbmRfcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkJCSBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKK3sgcmV0dXJuIE5VTEw7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHBjaV9yZXF1ZXN0X3JlZ2lvbnMoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3QgY2hhciAqcmVzX25hbWUpCiB7IHJldHVybiAtRUlPOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgcGNpX3JlbGVhc2VfcmVnaW9ucyhzdHJ1Y3QgcGNpX2RldiAqZGV2KSB7IH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGVyY3B1LXJ3c2VtLmggYi9pbmNsdWRlL2xpbnV4L3BlcmNwdS1yd3NlbS5oCmluZGV4IGMyZmEzZWMuLjViMmU2MTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGVyY3B1LXJ3c2VtLmgKKysrIGIvaW5jbHVkZS9saW51eC9wZXJjcHUtcndzZW0uaApAQCAtMTAsMzIgKzEwLDEyMiBAQAogCiBzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSB7CiAJc3RydWN0IHJjdV9zeW5jCQlyc3M7Ci0JdW5zaWduZWQgaW50IF9fcGVyY3B1CSpmYXN0X3JlYWRfY3RyOworCXVuc2lnbmVkIGludCBfX3BlcmNwdQkqcmVhZF9jb3VudDsKIAlzdHJ1Y3Qgcndfc2VtYXBob3JlCXJ3X3NlbTsKLQlhdG9taWNfdAkJc2xvd19yZWFkX2N0cjsKLQl3YWl0X3F1ZXVlX2hlYWRfdAl3cml0ZV93YWl0cTsKKwl3YWl0X3F1ZXVlX2hlYWRfdAl3cml0ZXI7CisJaW50CQkJcmVhZGVyc19ibG9jazsKIH07CiAKLWV4dGVybiB2b2lkIHBlcmNwdV9kb3duX3JlYWQoc3RydWN0IHBlcmNwdV9yd19zZW1hcGhvcmUgKik7Ci1leHRlcm4gaW50ICBwZXJjcHVfZG93bl9yZWFkX3RyeWxvY2soc3RydWN0IHBlcmNwdV9yd19zZW1hcGhvcmUgKik7Ci1leHRlcm4gdm9pZCBwZXJjcHVfdXBfcmVhZChzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqKTsKKyNkZWZpbmUgREVGSU5FX1NUQVRJQ19QRVJDUFVfUldTRU0obmFtZSkJCQkJXAorc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGludCwgX19wZXJjcHVfcndzZW1fcmNfIyNuYW1lKTsJCVwKK3N0YXRpYyBzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSBuYW1lID0gewkJCQlcCisJLnJzcyA9IF9fUkNVX1NZTkNfSU5JVElBTElaRVIobmFtZS5yc3MsIFJDVV9TQ0hFRF9TWU5DKSwJXAorCS5yZWFkX2NvdW50ID0gJl9fcGVyY3B1X3J3c2VtX3JjXyMjbmFtZSwJCQlcCisJLnJ3X3NlbSA9IF9fUldTRU1fSU5JVElBTElaRVIobmFtZS5yd19zZW0pLAkJCVwKKwkud3JpdGVyID0gX19XQUlUX1FVRVVFX0hFQURfSU5JVElBTElaRVIobmFtZS53cml0ZXIpLAkJXAorfQorCitleHRlcm4gaW50IF9fcGVyY3B1X2Rvd25fcmVhZChzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqLCBpbnQpOworZXh0ZXJuIHZvaWQgX19wZXJjcHVfdXBfcmVhZChzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqKTsKKworc3RhdGljIGlubGluZSB2b2lkIHBlcmNwdV9kb3duX3JlYWRfcHJlZW1wdF9kaXNhYmxlKHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlICpzZW0pCit7CisJbWlnaHRfc2xlZXAoKTsKKworCXJ3c2VtX2FjcXVpcmVfcmVhZCgmc2VtLT5yd19zZW0uZGVwX21hcCwgMCwgMCwgX1JFVF9JUF8pOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJLyoKKwkgKiBXZSBhcmUgaW4gYW4gUkNVLXNjaGVkIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uLCBzbyB0aGUgd3JpdGVyCisJICogY2Fubm90IGJvdGggY2hhbmdlIHNlbS0+c3RhdGUgZnJvbSByZWFkZXJzX2Zhc3QgYW5kIHN0YXJ0IGNoZWNraW5nCisJICogY291bnRlcnMgd2hpbGUgd2UgYXJlIGhlcmUuIFNvIGlmIHdlIHNlZSAhc2VtLT5zdGF0ZSwgd2Uga25vdyB0aGF0CisJICogdGhlIHdyaXRlciB3b24ndCBiZSBjaGVja2luZyB1bnRpbCB3ZSdyZSBwYXN0IHRoZSBwcmVlbXB0X2VuYWJsZSgpCisJICogYW5kIHRoYXQgb25lIHRoZSBzeW5jaHJvbml6ZV9zY2hlZCgpIGlzIGRvbmUsIHRoZSB3cml0ZXIgd2lsbCBzZWUKKwkgKiBhbnl0aGluZyB3ZSBkaWQgd2l0aGluIHRoaXMgUkNVLXNjaGVkIHJlYWQtc2l6ZSBjcml0aWNhbCBzZWN0aW9uLgorCSAqLworCV9fdGhpc19jcHVfaW5jKCpzZW0tPnJlYWRfY291bnQpOworCWlmICh1bmxpa2VseSghcmN1X3N5bmNfaXNfaWRsZSgmc2VtLT5yc3MpKSkKKwkJX19wZXJjcHVfZG93bl9yZWFkKHNlbSwgZmFsc2UpOyAvKiBVbmNvbmRpdGlvbmFsIG1lbW9yeSBiYXJyaWVyICovCisJYmFycmllcigpOworCS8qCisJICogVGhlIGJhcnJpZXIoKSBwcmV2ZW50cyB0aGUgY29tcGlsZXIgZnJvbQorCSAqIGJsZWVkaW5nIHRoZSBjcml0aWNhbCBzZWN0aW9uIG91dC4KKwkgKi8KK30KKworc3RhdGljIGlubGluZSB2b2lkIHBlcmNwdV9kb3duX3JlYWQoc3RydWN0IHBlcmNwdV9yd19zZW1hcGhvcmUgKnNlbSkKK3sKKwlwZXJjcHVfZG93bl9yZWFkX3ByZWVtcHRfZGlzYWJsZShzZW0pOworCXByZWVtcHRfZW5hYmxlKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBlcmNwdV9kb3duX3JlYWRfdHJ5bG9jayhzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqc2VtKQoreworCWludCByZXQgPSAxOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJLyoKKwkgKiBTYW1lIGFzIGluIHBlcmNwdV9kb3duX3JlYWQoKS4KKwkgKi8KKwlfX3RoaXNfY3B1X2luYygqc2VtLT5yZWFkX2NvdW50KTsKKwlpZiAodW5saWtlbHkoIXJjdV9zeW5jX2lzX2lkbGUoJnNlbS0+cnNzKSkpCisJCXJldCA9IF9fcGVyY3B1X2Rvd25fcmVhZChzZW0sIHRydWUpOyAvKiBVbmNvbmRpdGlvbmFsIG1lbW9yeSBiYXJyaWVyICovCisJcHJlZW1wdF9lbmFibGUoKTsKKwkvKgorCSAqIFRoZSBiYXJyaWVyKCkgZnJvbSBwcmVlbXB0X2VuYWJsZSgpIHByZXZlbnRzIHRoZSBjb21waWxlciBmcm9tCisJICogYmxlZWRpbmcgdGhlIGNyaXRpY2FsIHNlY3Rpb24gb3V0LgorCSAqLworCisJaWYgKHJldCkKKwkJcndzZW1fYWNxdWlyZV9yZWFkKCZzZW0tPnJ3X3NlbS5kZXBfbWFwLCAwLCAxLCBfUkVUX0lQXyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGVyY3B1X3VwX3JlYWRfcHJlZW1wdF9lbmFibGUoc3RydWN0IHBlcmNwdV9yd19zZW1hcGhvcmUgKnNlbSkKK3sKKwkvKgorCSAqIFRoZSBiYXJyaWVyKCkgcHJldmVudHMgdGhlIGNvbXBpbGVyIGZyb20KKwkgKiBibGVlZGluZyB0aGUgY3JpdGljYWwgc2VjdGlvbiBvdXQuCisJICovCisJYmFycmllcigpOworCS8qCisJICogU2FtZSBhcyBpbiBwZXJjcHVfZG93bl9yZWFkKCkuCisJICovCisJaWYgKGxpa2VseShyY3Vfc3luY19pc19pZGxlKCZzZW0tPnJzcykpKQorCQlfX3RoaXNfY3B1X2RlYygqc2VtLT5yZWFkX2NvdW50KTsKKwllbHNlCisJCV9fcGVyY3B1X3VwX3JlYWQoc2VtKTsgLyogVW5jb25kaXRpb25hbCBtZW1vcnkgYmFycmllciAqLworCXByZWVtcHRfZW5hYmxlKCk7CisKKwlyd3NlbV9yZWxlYXNlKCZzZW0tPnJ3X3NlbS5kZXBfbWFwLCAxLCBfUkVUX0lQXyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwZXJjcHVfdXBfcmVhZChzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqc2VtKQoreworCXByZWVtcHRfZGlzYWJsZSgpOworCXBlcmNwdV91cF9yZWFkX3ByZWVtcHRfZW5hYmxlKHNlbSk7Cit9CiAKIGV4dGVybiB2b2lkIHBlcmNwdV9kb3duX3dyaXRlKHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlICopOwogZXh0ZXJuIHZvaWQgcGVyY3B1X3VwX3dyaXRlKHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlICopOwogCiBleHRlcm4gaW50IF9fcGVyY3B1X2luaXRfcndzZW0oc3RydWN0IHBlcmNwdV9yd19zZW1hcGhvcmUgKiwKIAkJCQljb25zdCBjaGFyICosIHN0cnVjdCBsb2NrX2NsYXNzX2tleSAqKTsKKwogZXh0ZXJuIHZvaWQgcGVyY3B1X2ZyZWVfcndzZW0oc3RydWN0IHBlcmNwdV9yd19zZW1hcGhvcmUgKik7CiAKLSNkZWZpbmUgcGVyY3B1X2luaXRfcndzZW0oYnJ3KQlcCisjZGVmaW5lIHBlcmNwdV9pbml0X3J3c2VtKHNlbSkJCQkJCVwKICh7CQkJCQkJCQlcCiAJc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSByd3NlbV9rZXk7CQkJXAotCV9fcGVyY3B1X2luaXRfcndzZW0oYnJ3LCAjYnJ3LCAmcndzZW1fa2V5KTsJCVwKKwlfX3BlcmNwdV9pbml0X3J3c2VtKHNlbSwgI3NlbSwgJnJ3c2VtX2tleSk7CQlcCiB9KQogCi0KICNkZWZpbmUgcGVyY3B1X3J3c2VtX2lzX2hlbGQoc2VtKSBsb2NrZGVwX2lzX2hlbGQoJihzZW0pLT5yd19zZW0pCiAKKyNkZWZpbmUgcGVyY3B1X3J3c2VtX2Fzc2VydF9oZWxkKHNlbSkJCQkJXAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJihzZW0pLT5yd19zZW0pCisKIHN0YXRpYyBpbmxpbmUgdm9pZCBwZXJjcHVfcndzZW1fcmVsZWFzZShzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqc2VtLAogCQkJCQlib29sIHJlYWQsIHVuc2lnbmVkIGxvbmcgaXApCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BlcmYvYXJtX3BtdS5oIGIvaW5jbHVkZS9saW51eC9wZXJmL2FybV9wbXUuaAppbmRleCBlMTg4NDM4Li44NDYyZGEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BlcmYvYXJtX3BtdS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGVyZi9hcm1fcG11LmgKQEAgLTE0LDcgKzE0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KLQorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8YXNtL2NwdXR5cGUuaD4KIAogLyoKQEAgLTc3LDYgKzc3LDEzIEBACiAJc3RydWN0IGFybV9wbXUJCSpwZXJjcHVfcG11OwogfTsKIAorZW51bSBhcm1wbXVfYXR0cl9ncm91cHMgeworCUFSTVBNVV9BVFRSX0dST1VQX0NPTU1PTiwKKwlBUk1QTVVfQVRUUl9HUk9VUF9FVkVOVFMsCisJQVJNUE1VX0FUVFJfR1JPVVBfRk9STUFUUywKKwlBUk1QTVVfTlJfQVRUUl9HUk9VUFMKK307CisKIHN0cnVjdCBhcm1fcG11IHsKIAlzdHJ1Y3QgcG11CXBtdTsKIAljcHVtYXNrX3QJYWN0aXZlX2lycXM7CkBAIC0xMDksOCArMTE2LDEwIEBACiAJREVDTEFSRV9CSVRNQVAocG1jZWlkX2JpdG1hcCwgQVJNVjhfUE1VVjNfTUFYX0NPTU1PTl9FVkVOVFMpOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBsYXRfZGV2aWNlOwogCXN0cnVjdCBwbXVfaHdfZXZlbnRzCV9fcGVyY3B1ICpod19ldmVudHM7Ci0Jc3RydWN0IGxpc3RfaGVhZAllbnRyeTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZQlub2RlOwogCXN0cnVjdCBub3RpZmllcl9ibG9jawljcHVfcG1fbmI7CisJLyogdGhlIGF0dHJfZ3JvdXBzIGFycmF5IG11c3QgYmUgTlVMTC10ZXJtaW5hdGVkICovCisJY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqYXR0cl9ncm91cHNbQVJNUE1VX05SX0FUVFJfR1JPVVBTICsgMV07CiB9OwogCiAjZGVmaW5lIHRvX2FybV9wbXUocCkgKGNvbnRhaW5lcl9vZihwLCBzdHJ1Y3QgYXJtX3BtdSwgcG11KSkKQEAgLTE1MSw2ICsxNjAsOCBAQAogCQkJIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX3RhYmxlLAogCQkJIGNvbnN0IHN0cnVjdCBwbXVfcHJvYmVfaW5mbyAqcHJvYmVfdGFibGUpOwogCisjZGVmaW5lIEFSTVY4X1BNVV9QREVWX05BTUUgImFybXY4LXBtdSIKKwogI2VuZGlmIC8qIENPTkZJR19BUk1fUE1VICovCiAKICNlbmRpZiAvKiBfX0FSTV9QTVVfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaCBiL2luY2x1ZGUvbGludXgvcGVyZl9ldmVudC5oCmluZGV4IDJiNmI0M2MuLjA2MGQwZWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGVyZl9ldmVudC5oCisrKyBiL2luY2x1ZGUvbGludXgvcGVyZl9ldmVudC5oCkBAIC01MTAsOSArNTEwLDE1IEBACiAJCQkJCXN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhICosCiAJCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIAotZW51bSBwZXJmX2dyb3VwX2ZsYWcgewotCVBFUkZfR1JPVVBfU09GVFdBUkUJCT0gMHgxLAotfTsKKy8qCisgKiBFdmVudCBjYXBhYmlsaXRpZXMuIEZvciBldmVudF9jYXBzIGFuZCBncm91cHMgY2Fwcy4KKyAqCisgKiBQRVJGX0VWX0NBUF9TT0ZUV0FSRTogSXMgYSBzb2Z0d2FyZSBldmVudC4KKyAqIFBFUkZfRVZfQ0FQX1JFQURfQUNUSVZFX1BLRzogQSBDUFUgZXZlbnQgKG9yIGNncm91cCBldmVudCkgdGhhdCBjYW4gYmUgcmVhZAorICogZnJvbSBhbnkgQ1BVIGluIHRoZSBwYWNrYWdlIHdoZXJlIGl0IGlzIGFjdGl2ZS4KKyAqLworI2RlZmluZSBQRVJGX0VWX0NBUF9TT0ZUV0FSRQkJQklUKDApCisjZGVmaW5lIFBFUkZfRVZfQ0FQX1JFQURfQUNUSVZFX1BLRwlCSVQoMSkKIAogI2RlZmluZSBTV0VWRU5UX0hMSVNUX0JJVFMJCTgKICNkZWZpbmUgU1dFVkVOVF9ITElTVF9TSVpFCQkoMSA8PCBTV0VWRU5UX0hMSVNUX0JJVFMpCkBAIC01NjgsNyArNTc0LDEyIEBACiAJc3RydWN0IGhsaXN0X25vZGUJCWhsaXN0X2VudHJ5OwogCXN0cnVjdCBsaXN0X2hlYWQJCWFjdGl2ZV9lbnRyeTsKIAlpbnQJCQkJbnJfc2libGluZ3M7Ci0JaW50CQkJCWdyb3VwX2ZsYWdzOworCisJLyogTm90IHNlcmlhbGl6ZWQuIE9ubHkgd3JpdHRlbiBkdXJpbmcgZXZlbnQgaW5pdGlhbGl6YXRpb24uICovCisJaW50CQkJCWV2ZW50X2NhcHM7CisJLyogVGhlIGN1bXVsYXRpdmUgQU5EIG9mIGFsbCBldmVudF9jYXBzIGZvciBldmVudHMgaW4gdGhpcyBncm91cC4gKi8KKwlpbnQJCQkJZ3JvdXBfY2FwczsKKwogCXN0cnVjdCBwZXJmX2V2ZW50CQkqZ3JvdXBfbGVhZGVyOwogCXN0cnVjdCBwbXUJCQkqcG11OwogCXZvaWQJCQkJKnBtdV9wcml2YXRlOwpAQCAtNjc5LDYgKzY5MCwxMCBAQAogCXU2NAkJCQkoKmNsb2NrKSh2b2lkKTsKIAlwZXJmX292ZXJmbG93X2hhbmRsZXJfdAkJb3ZlcmZsb3dfaGFuZGxlcjsKIAl2b2lkCQkJCSpvdmVyZmxvd19oYW5kbGVyX2NvbnRleHQ7CisjaWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMCisJcGVyZl9vdmVyZmxvd19oYW5kbGVyX3QJCW9yaWdfb3ZlcmZsb3dfaGFuZGxlcjsKKwlzdHJ1Y3QgYnBmX3Byb2cJCQkqcHJvZzsKKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0VWRU5UX1RSQUNJTkcKIAlzdHJ1Y3QgdHJhY2VfZXZlbnRfY2FsbAkJKnRwX2V2ZW50OwpAQCAtNzc0LDYgKzc4OSw5IEBACiAjaWZkZWYgQ09ORklHX0NHUk9VUF9QRVJGCiAJc3RydWN0IHBlcmZfY2dyb3VwCQkqY2dycDsKICNlbmRpZgorCisJc3RydWN0IGxpc3RfaGVhZAkJc2NoZWRfY2JfZW50cnk7CisJaW50CQkJCXNjaGVkX2NiX3VzYWdlOwogfTsKIAogc3RydWN0IHBlcmZfb3V0cHV0X2hhbmRsZSB7CkBAIC03ODgsNiArODA2LDExIEBACiAJaW50CQkJCXBhZ2U7CiB9OwogCitzdHJ1Y3QgYnBmX3BlcmZfZXZlbnRfZGF0YV9rZXJuIHsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKKwlzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSAqZGF0YTsKK307CisKICNpZmRlZiBDT05GSUdfQ0dST1VQX1BFUkYKIAogLyoKQEAgLTk4NSw3ICsxMDA4LDcgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgaXNfc29mdHdhcmVfZXZlbnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewotCXJldHVybiBldmVudC0+cG11LT50YXNrX2N0eF9uciA9PSBwZXJmX3N3X2NvbnRleHQ7CisJcmV0dXJuIGV2ZW50LT5ldmVudF9jYXBzICYgUEVSRl9FVl9DQVBfU09GVFdBUkU7CiB9CiAKIGV4dGVybiBzdHJ1Y3Qgc3RhdGljX2tleSBwZXJmX3N3ZXZlbnRfZW5hYmxlZFtQRVJGX0NPVU5UX1NXX01BWF07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BoeS5oIGIvaW5jbHVkZS9saW51eC9waHkuaAppbmRleCAyZDI0YjI4Li5lMjVmMTgzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BoeS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGh5LmgKQEAgLTgwLDYgKzgwLDcgQEAKIAlQSFlfSU5URVJGQUNFX01PREVfWEdNSUksCiAJUEhZX0lOVEVSRkFDRV9NT0RFX01PQ0EsCiAJUEhZX0lOVEVSRkFDRV9NT0RFX1FTR01JSSwKKwlQSFlfSU5URVJGQUNFX01PREVfVFJHTUlJLAogCVBIWV9JTlRFUkZBQ0VfTU9ERV9NQVgsCiB9IHBoeV9pbnRlcmZhY2VfdDsKIApAQCAtMTIzLDYgKzEyNCw4IEBACiAJCXJldHVybiAibW9jYSI7CiAJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfUVNHTUlJOgogCQlyZXR1cm4gInFzZ21paSI7CisJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfVFJHTUlJOgorCQlyZXR1cm4gInRyZ21paSI7CiAJZGVmYXVsdDoKIAkJcmV0dXJuICJ1bmtub3duIjsKIAl9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BoeS9waHkuaCBiL2luY2x1ZGUvbGludXgvcGh5L3BoeS5oCmluZGV4IGYwOGI2NzIuLmVlMWJlZDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGh5L3BoeS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGh5L3BoeS5oCkBAIC0zNiw2ICszNiw3IEBACiAgKiBAcG93ZXJfb246IHBvd2VyaW5nIG9uIHRoZSBwaHkKICAqIEBwb3dlcl9vZmY6IHBvd2VyaW5nIG9mZiB0aGUgcGh5CiAgKiBAc2V0X21vZGU6IHNldCB0aGUgbW9kZSBvZiB0aGUgcGh5CisgKiBAcmVzZXQ6IHJlc2V0dGluZyB0aGUgcGh5CiAgKiBAb3duZXI6IHRoZSBtb2R1bGUgb3duZXIgY29udGFpbmluZyB0aGUgb3BzCiAgKi8KIHN0cnVjdCBwaHlfb3BzIHsKQEAgLTQ0LDYgKzQ1LDcgQEAKIAlpbnQJKCpwb3dlcl9vbikoc3RydWN0IHBoeSAqcGh5KTsKIAlpbnQJKCpwb3dlcl9vZmYpKHN0cnVjdCBwaHkgKnBoeSk7CiAJaW50CSgqc2V0X21vZGUpKHN0cnVjdCBwaHkgKnBoeSwgZW51bSBwaHlfbW9kZSBtb2RlKTsKKwlpbnQJKCpyZXNldCkoc3RydWN0IHBoeSAqcGh5KTsKIAlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKIH07CiAKQEAgLTEzNiw2ICsxMzgsNyBAQAogaW50IHBoeV9wb3dlcl9vbihzdHJ1Y3QgcGh5ICpwaHkpOwogaW50IHBoeV9wb3dlcl9vZmYoc3RydWN0IHBoeSAqcGh5KTsKIGludCBwaHlfc2V0X21vZGUoc3RydWN0IHBoeSAqcGh5LCBlbnVtIHBoeV9tb2RlIG1vZGUpOworaW50IHBoeV9yZXNldChzdHJ1Y3QgcGh5ICpwaHkpOwogc3RhdGljIGlubGluZSBpbnQgcGh5X2dldF9idXNfd2lkdGgoc3RydWN0IHBoeSAqcGh5KQogewogCXJldHVybiBwaHktPmF0dHJzLmJ1c193aWR0aDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGlkX25hbWVzcGFjZS5oIGIvaW5jbHVkZS9saW51eC9waWRfbmFtZXNwYWNlLmgKaW5kZXggOTE4YjExNy4uMzRjY2U5NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9waWRfbmFtZXNwYWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9waWRfbmFtZXNwYWNlLmgKQEAgLTQwLDYgKzQwLDcgQEAKIAlzdHJ1Y3QgZnNfcGluICpiYWNjdDsKICNlbmRpZgogCXN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdXNlcl9uczsKKwlzdHJ1Y3QgdWNvdW50cyAqdWNvdW50czsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcHJvY193b3JrOwogCWtnaWRfdCBwaWRfZ2lkOwogCWludCBoaWRlX3BpZDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9kbWEtZHcuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9kbWEtZHcuaAppbmRleCBkMTVkOGJhLi41ZjBlMTFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvZG1hLWR3LmgKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2RtYS1kdy5oCkBAIC0yMyw2ICsyMyw3IEBACiAgKiBAZHN0X2lkOglkc3QgcmVxdWVzdCBsaW5lCiAgKiBAbV9tYXN0ZXI6CW1lbW9yeSBtYXN0ZXIgZm9yIHRyYW5zZmVycyBvbiBhbGxvY2F0ZWQgY2hhbm5lbAogICogQHBfbWFzdGVyOglwZXJpcGhlcmFsIG1hc3RlciBmb3IgdHJhbnNmZXJzIG9uIGFsbG9jYXRlZCBjaGFubmVsCisgKiBAaHNfcG9sYXJpdHk6c2V0IGFjdGl2ZSBsb3cgcG9sYXJpdHkgb2YgaGFuZHNoYWtlIGludGVyZmFjZQogICovCiBzdHJ1Y3QgZHdfZG1hX3NsYXZlIHsKIAlzdHJ1Y3QgZGV2aWNlCQkqZG1hX2RldjsKQEAgLTMwLDYgKzMxLDcgQEAKIAl1OAkJCWRzdF9pZDsKIAl1OAkJCW1fbWFzdGVyOwogCXU4CQkJcF9tYXN0ZXI7CisJYm9vbAkJCWhzX3BvbGFyaXR5OwogfTsKIAogLyoqCkBAIC0zOCw2ICs0MCw3IEBACiAgKiBAaXNfcHJpdmF0ZTogVGhlIGRldmljZSBjaGFubmVscyBzaG91bGQgYmUgbWFya2VkIGFzIHByaXZhdGUgYW5kIG5vdCBmb3IKICAqCWJ5IHRoZSBnZW5lcmFsIHB1cnBvc2UgRE1BIGNoYW5uZWwgYWxsb2NhdG9yLgogICogQGlzX21lbWNweTogVGhlIGRldmljZSBjaGFubmVscyBkbyBzdXBwb3J0IG1lbW9yeS10by1tZW1vcnkgdHJhbnNmZXJzLgorICogQGlzX25vbGxwOiBUaGUgZGV2aWNlIGNoYW5uZWxzIGRvZXMgbm90IHN1cHBvcnQgbXVsdGkgYmxvY2sgdHJhbnNmZXJzLgogICogQGNoYW5fYWxsb2NhdGlvbl9vcmRlcjogQWxsb2NhdGUgY2hhbm5lbHMgc3RhcnRpbmcgZnJvbSAwIG9yIDcKICAqIEBjaGFuX3ByaW9yaXR5OiBTZXQgY2hhbm5lbCBwcmlvcml0eSBpbmNyZWFzaW5nIGZyb20gMCB0byA3IG9yIDcgdG8gMC4KICAqIEBibG9ja19zaXplOiBNYXhpbXVtIGJsb2NrIHNpemUgc3VwcG9ydGVkIGJ5IHRoZSBjb250cm9sbGVyCkBAIC00OSw2ICs1Miw3IEBACiAJdW5zaWduZWQgaW50CW5yX2NoYW5uZWxzOwogCWJvb2wJCWlzX3ByaXZhdGU7CiAJYm9vbAkJaXNfbWVtY3B5OworCWJvb2wJCWlzX25vbGxwOwogI2RlZmluZSBDSEFOX0FMTE9DQVRJT05fQVNDRU5ESU5HCTAJLyogemVybyB0byBzZXZlbiAqLwogI2RlZmluZSBDSEFOX0FMTE9DQVRJT05fREVTQ0VORElORwkxCS8qIHNldmVuIHRvIHplcm8gKi8KIAl1bnNpZ25lZCBjaGFyCWNoYW5fYWxsb2NhdGlvbl9vcmRlcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9kbWEtbW1wX3RkbWEuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9kbWEtbW1wX3RkbWEuaAppbmRleCAwYzcyODg2Li40MjJkNDUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvZG1hLW1tcF90ZG1hLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2RtYS1tbXBfdGRtYS5oCkBAIC0yOCw3ICsyOCw3IEBACiAJaW50IGdyYW51bGFyaXR5OwogfTsKIAotI2lmZGVmIENPTkZJR19BUk0KKyNpZmRlZiBDT05GSUdfTU1QX1NSQU0KIGV4dGVybiBzdHJ1Y3QgZ2VuX3Bvb2wgKnNyYW1fZ2V0X2dwb29sKGNoYXIgKnBvb2xfbmFtZSk7CiAjZWxzZQogc3RhdGljIGlubGluZSBzdHJ1Y3QgZ2VuX3Bvb2wgKnNyYW1fZ2V0X2dwb29sKGNoYXIgKnBvb2xfbmFtZSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9kbWEtczNjMjR4eC5oIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2RtYS1zM2MyNHh4LmgKaW5kZXggODliYTFiMC4uNGY5YWJhNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2RtYS1zM2MyNHh4LmgKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2RtYS1zM2MyNHh4LmgKQEAgLTMwLDE2ICszMCwyMiBAQAogCXUxNiBjaGFuc2VsOwogfTsKIAorc3RydWN0IGRtYV9zbGF2ZV9tYXA7CisKIC8qKgogICogc3RydWN0IHMzYzI0eHhfZG1hX3BsYXRkYXRhIC0gcGxhdGZvcm0gc3BlY2lmaWMgc2V0dGluZ3MKICAqIEBudW1fcGh5X2NoYW5uZWxzOiBudW1iZXIgb2YgcGh5c2ljYWwgY2hhbm5lbHMKICAqIEBjaGFubmVsczogYXJyYXkgb2YgdmlydHVhbCBjaGFubmVsIGRlc2NyaXB0aW9ucwogICogQG51bV9jaGFubmVsczogbnVtYmVyIG9mIHZpcnR1YWwgY2hhbm5lbHMKKyAqIEBzbGF2ZV9tYXA6IGRtYSBzbGF2ZSBtYXAgbWF0Y2hpbmcgdGFibGUKKyAqIEBzbGF2ZWNudDogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHNsYXZlX21hcAogICovCiBzdHJ1Y3QgczNjMjR4eF9kbWFfcGxhdGRhdGEgewogCWludCBudW1fcGh5X2NoYW5uZWxzOwogCXN0cnVjdCBzM2MyNHh4X2RtYV9jaGFubmVsICpjaGFubmVsczsKIAlpbnQgbnVtX2NoYW5uZWxzOworCWNvbnN0IHN0cnVjdCBkbWFfc2xhdmVfbWFwICpzbGF2ZV9tYXA7CisJaW50IHNsYXZlY250OwogfTsKIAogc3RydWN0IGRtYV9jaGFuOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvaHRjLWVncGlvLmggYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvZ3Bpby1odGMtZWdwaW8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9saW51eC9tZmQvaHRjLWVncGlvLmgKcmVuYW1lIHRvIGluY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9ncGlvLWh0Yy1lZ3Bpby5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvZ3Bpby1scGMzMnh4LmggYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvZ3Bpby1scGMzMnh4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NDRlOTYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2dwaW8tbHBjMzJ4eC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIEF1dGhvcjogS2V2aW4gV2VsbHMgPGtldmluLndlbGxzQG54cC5jb20+Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDEwIE5YUCBTZW1pY29uZHVjdG9ycwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF9fTUFDSF9HUElPX0xQQzMyWFhfSAotI2RlZmluZSBfX01BQ0hfR1BJT19MUEMzMlhYX0gKLQotLyoKLSAqIE5vdGUhCi0gKiBNdXhlZCBHUCBwaW5zIG5lZWQgdG8gYmUgc2V0dXAgdG8gdGhlIEdQIHN0YXRlIGluIHRoZSBib2FyZCBsZXZlbAotICogY29kZSBwcmlvciB0byB1c2luZyB0aGlzIGRyaXZlci4KLSAqIEdQSSBwaW5zIDogMjh4UDMgZ3JvdXAKLSAqIEdQTyBwaW5zIDogMjR4UDMgZ3JvdXAKLSAqIEdQSU8gcGluczogOHhQMCBncm91cCwgMjR4UDEgZ3JvdXAsIDEzeFAyIGdyb3VwLCA2eFAzIGdyb3VwCi0gKi8KLQotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDBfTUFYIDgKLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AxX01BWCAyNAotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDJfTUFYIDEzCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QM19NQVggNgotI2RlZmluZSBMUEMzMlhYX0dQSV9QM19NQVggMjkKLSNkZWZpbmUgTFBDMzJYWF9HUE9fUDNfTUFYIDI0Ci0KLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AwX0dSUCAwCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QMV9HUlAgKExQQzMyWFhfR1BJT19QMF9HUlAgKyBMUEMzMlhYX0dQSU9fUDBfTUFYKQotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDJfR1JQIChMUEMzMlhYX0dQSU9fUDFfR1JQICsgTFBDMzJYWF9HUElPX1AxX01BWCkKLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AzX0dSUCAoTFBDMzJYWF9HUElPX1AyX0dSUCArIExQQzMyWFhfR1BJT19QMl9NQVgpCi0jZGVmaW5lIExQQzMyWFhfR1BJX1AzX0dSUCAoTFBDMzJYWF9HUElPX1AzX0dSUCArIExQQzMyWFhfR1BJT19QM19NQVgpCi0jZGVmaW5lIExQQzMyWFhfR1BPX1AzX0dSUCAoTFBDMzJYWF9HUElfUDNfR1JQICsgTFBDMzJYWF9HUElfUDNfTUFYKQotCi0vKgotICogQSBzcGVjaWZpYyBHUElPIGNhbiBiZSBzZWxlY3RlZCB3aXRoIHRoaXMgbWFjcm8KLSAqIGllLCBHUElPXzA1IGNhbiBiZSBzZWxlY3RlZCB3aXRoIExQQzMyWFhfR1BJTyhMUEMzMlhYX0dQSU9fUDNfR1JQLCA1KQotICogU2VlIHRoZSBMUEMzMngwIFVzZXIncyBndWlkZSBmb3IgR1BJTyBncm91cCBudW1iZXJzCi0gKi8KLSNkZWZpbmUgTFBDMzJYWF9HUElPKHgsIHkpICgoeCkgKyAoeSkpCi0KLSNlbmRpZiAvKiBfX01BQ0hfR1BJT19MUEMzMlhYX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9yZW1vdGVwcm9jLW9tYXAuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9yZW1vdGVwcm9jLW9tYXAuaAppbmRleCBiZmJkMTJiLi43MWExYjIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvcmVtb3RlcHJvYy1vbWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL3JlbW90ZXByb2Mtb21hcC5oCkBAIC0zOSw5ICszOSw5IEBACiAJY29uc3QgY2hhciAqZmlybXdhcmU7CiAJY29uc3QgY2hhciAqbWJveF9uYW1lOwogCWNvbnN0IHN0cnVjdCBycHJvY19vcHMgKm9wczsKLQlpbnQgKCpkZXZpY2VfZW5hYmxlKSAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7Ci0JaW50ICgqZGV2aWNlX3NodXRkb3duKSAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7Ci0Jdm9pZCgqc2V0X2Jvb3RhZGRyKSh1MzIpOworCWludCAoKmRldmljZV9lbmFibGUpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworCWludCAoKmRldmljZV9zaHV0ZG93bikoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CisJdm9pZCAoKnNldF9ib290YWRkcikodTMyKTsKIH07CiAKICNpZiBkZWZpbmVkKENPTkZJR19PTUFQX1JFTU9URVBST0MpIHx8IGRlZmluZWQoQ09ORklHX09NQVBfUkVNT1RFUFJPQ19NT0RVTEUpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BtX2RvbWFpbi5oIGIvaW5jbHVkZS9saW51eC9wbV9kb21haW4uaAppbmRleCAzMWZlYzg1Li5hMDlmZTVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BtX2RvbWFpbi5oCisrKyBiL2luY2x1ZGUvbGludXgvcG1fZG9tYWluLmgKQEAgLTUxLDYgKzUxLDggQEAKIAlzdHJ1Y3QgbXV0ZXggbG9jazsKIAlzdHJ1Y3QgZGV2X3Bvd2VyX2dvdmVybm9yICpnb3Y7CiAJc3RydWN0IHdvcmtfc3RydWN0IHBvd2VyX29mZl93b3JrOworCXN0cnVjdCBmd25vZGVfaGFuZGxlICpwcm92aWRlcjsJLyogSWRlbnRpdHkgb2YgdGhlIGRvbWFpbiBwcm92aWRlciAqLworCWJvb2wgaGFzX3Byb3ZpZGVyOwogCWNvbnN0IGNoYXIgKm5hbWU7CiAJYXRvbWljX3Qgc2RfY291bnQ7CS8qIE51bWJlciBvZiBzdWJkb21haW5zIHdpdGggcG93ZXIgIm9uIiAqLwogCWVudW0gZ3BkX3N0YXR1cyBzdGF0dXM7CS8qIEN1cnJlbnQgc3RhdGUgb2YgdGhlIGRvbWFpbiAqLwpAQCAtMTE2LDcgKzExOCw2IEBACiAJcmV0dXJuIHRvX2dwZF9kYXRhKGRldi0+cG93ZXIuc3Vic3lzX2RhdGEtPmRvbWFpbl9kYXRhKTsKIH0KIAotZXh0ZXJuIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqcG1fZ2VucGRfbG9va3VwX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCBfX3BtX2dlbnBkX2FkZF9kZXZpY2Uoc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCwKIAkJCQkgc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSBzdHJ1Y3QgZ3BkX3RpbWluZ19kYXRhICp0ZCk7CkBAIC0xMjksNiArMTMwLDcgQEAKIAkJCQkgICAgIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqdGFyZ2V0KTsKIGV4dGVybiBpbnQgcG1fZ2VucGRfaW5pdChzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLAogCQkJIHN0cnVjdCBkZXZfcG93ZXJfZ292ZXJub3IgKmdvdiwgYm9vbCBpc19vZmYpOworZXh0ZXJuIGludCBwbV9nZW5wZF9yZW1vdmUoc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCk7CiAKIGV4dGVybiBzdHJ1Y3QgZGV2X3Bvd2VyX2dvdmVybm9yIHNpbXBsZV9xb3NfZ292ZXJub3I7CiBleHRlcm4gc3RydWN0IGRldl9wb3dlcl9nb3Zlcm5vciBwbV9kb21haW5fYWx3YXlzX29uX2dvdjsKQEAgLTEzOCwxMCArMTQwLDYgQEAKIHsKIAlyZXR1cm4gRVJSX1BUUigtRU5PU1lTKTsKIH0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpwbV9nZW5wZF9sb29rdXBfZGV2KHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gTlVMTDsKLX0KIHN0YXRpYyBpbmxpbmUgaW50IF9fcG1fZ2VucGRfYWRkX2RldmljZShzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLAogCQkJCQlzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJCXN0cnVjdCBncGRfdGltaW5nX2RhdGEgKnRkKQpAQCAtMTY4LDYgKzE2NiwxMCBAQAogewogCXJldHVybiAtRU5PU1lTOwogfQorc3RhdGljIGlubGluZSBpbnQgcG1fZ2VucGRfcmVtb3ZlKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQpCit7CisJcmV0dXJuIC1FTk9UU1VQUDsKK30KICNlbmRpZgogCiBzdGF0aWMgaW5saW5lIGludCBwbV9nZW5wZF9hZGRfZGV2aWNlKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQsCkBAIC0xOTIsNTcgKzE5NCw1NyBAQAogCXVuc2lnbmVkIGludCBudW1fZG9tYWluczsKIH07CiAKLXR5cGVkZWYgc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICooKmdlbnBkX3hsYXRlX3QpKHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmFyZ3MsCi0JCQkJCQl2b2lkICpkYXRhKTsKLQogI2lmZGVmIENPTkZJR19QTV9HRU5FUklDX0RPTUFJTlNfT0YKLWludCBfX29mX2dlbnBkX2FkZF9wcm92aWRlcihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBnZW5wZF94bGF0ZV90IHhsYXRlLAotCQkJdm9pZCAqZGF0YSk7CitpbnQgb2ZfZ2VucGRfYWRkX3Byb3ZpZGVyX3NpbXBsZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCSBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkKTsKK2ludCBvZl9nZW5wZF9hZGRfcHJvdmlkZXJfb25lY2VsbChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCSAgc3RydWN0IGdlbnBkX29uZWNlbGxfZGF0YSAqZGF0YSk7CiB2b2lkIG9mX2dlbnBkX2RlbF9wcm92aWRlcihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKLXN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqb2ZfZ2VucGRfZ2V0X2Zyb21fcHJvdmlkZXIoCi0JCQlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpnZW5wZHNwZWMpOwotCi1zdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKl9fb2ZfZ2VucGRfeGxhdGVfc2ltcGxlKAotCQkJCQlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpnZW5wZHNwZWMsCi0JCQkJCXZvaWQgKmRhdGEpOwotc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpfX29mX2dlbnBkX3hsYXRlX29uZWNlbGwoCi0JCQkJCXN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmdlbnBkc3BlYywKLQkJCQkJdm9pZCAqZGF0YSk7CitleHRlcm4gaW50IG9mX2dlbnBkX2FkZF9kZXZpY2Uoc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqYXJncywKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBvZl9nZW5wZF9hZGRfc3ViZG9tYWluKHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKnBhcmVudCwKKwkJCQkgIHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKm5ld19zdWJkb21haW4pOworZXh0ZXJuIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqb2ZfZ2VucGRfcmVtb3ZlX2xhc3Qoc3RydWN0IGRldmljZV9ub2RlICpucCk7CiAKIGludCBnZW5wZF9kZXZfcG1fYXR0YWNoKHN0cnVjdCBkZXZpY2UgKmRldik7CiAjZWxzZSAvKiAhQ09ORklHX1BNX0dFTkVSSUNfRE9NQUlOU19PRiAqLwotc3RhdGljIGlubGluZSBpbnQgX19vZl9nZW5wZF9hZGRfcHJvdmlkZXIoc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQkJZ2VucGRfeGxhdGVfdCB4bGF0ZSwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbmxpbmUgaW50IG9mX2dlbnBkX2FkZF9wcm92aWRlcl9zaW1wbGUoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCkKIHsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVOT1RTVVBQOwogfQorCitzdGF0aWMgaW5saW5lIGludCBvZl9nZW5wZF9hZGRfcHJvdmlkZXJfb25lY2VsbChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQlzdHJ1Y3QgZ2VucGRfb25lY2VsbF9kYXRhICpkYXRhKQoreworCXJldHVybiAtRU5PVFNVUFA7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBvZl9nZW5wZF9kZWxfcHJvdmlkZXIoc3RydWN0IGRldmljZV9ub2RlICpucCkge30KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKm9mX2dlbnBkX2dldF9mcm9tX3Byb3ZpZGVyKAotCQkJc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqZ2VucGRzcGVjKQorc3RhdGljIGlubGluZSBpbnQgb2ZfZ2VucGRfYWRkX2RldmljZShzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICphcmdzLAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gLUVOT0RFVjsKIH0KIAotI2RlZmluZSBfX29mX2dlbnBkX3hsYXRlX3NpbXBsZQkJTlVMTAotI2RlZmluZSBfX29mX2dlbnBkX3hsYXRlX29uZWNlbGwJTlVMTAorc3RhdGljIGlubGluZSBpbnQgb2ZfZ2VucGRfYWRkX3N1YmRvbWFpbihzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpwYXJlbnQsCisJCQkJCSBzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpuZXdfc3ViZG9tYWluKQoreworCXJldHVybiAtRU5PREVWOworfQogCiBzdGF0aWMgaW5saW5lIGludCBnZW5wZF9kZXZfcG1fYXR0YWNoKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gLUVOT0RFVjsKIH0KLSNlbmRpZiAvKiBDT05GSUdfUE1fR0VORVJJQ19ET01BSU5TX09GICovCiAKLXN0YXRpYyBpbmxpbmUgaW50IG9mX2dlbnBkX2FkZF9wcm92aWRlcl9zaW1wbGUoc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQkJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCkKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqb2ZfZ2VucGRfcmVtb3ZlX2xhc3Qoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQlyZXR1cm4gX19vZl9nZW5wZF9hZGRfcHJvdmlkZXIobnAsIF9fb2ZfZ2VucGRfeGxhdGVfc2ltcGxlLCBnZW5wZCk7CisJcmV0dXJuIEVSUl9QVFIoLUVOT1RTVVBQKTsKIH0KLXN0YXRpYyBpbmxpbmUgaW50IG9mX2dlbnBkX2FkZF9wcm92aWRlcl9vbmVjZWxsKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQkJCXN0cnVjdCBnZW5wZF9vbmVjZWxsX2RhdGEgKmRhdGEpCi17Ci0JcmV0dXJuIF9fb2ZfZ2VucGRfYWRkX3Byb3ZpZGVyKG5wLCBfX29mX2dlbnBkX3hsYXRlX29uZWNlbGwsIGRhdGEpOwotfQorI2VuZGlmIC8qIENPTkZJR19QTV9HRU5FUklDX0RPTUFJTlNfT0YgKi8KIAogI2lmZGVmIENPTkZJR19QTQogZXh0ZXJuIGludCBkZXZfcG1fZG9tYWluX2F0dGFjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgcG93ZXJfb24pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wb3dlci9icTI0NzM1LWNoYXJnZXIuaCBiL2luY2x1ZGUvbGludXgvcG93ZXIvYnEyNDczNS1jaGFyZ2VyLmgKaW5kZXggNmI3NTBjMWEuLmIwNGJlNTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcG93ZXIvYnEyNDczNS1jaGFyZ2VyLmgKKysrIGIvaW5jbHVkZS9saW51eC9wb3dlci9icTI0NzM1LWNoYXJnZXIuaApAQCAtMjgsMTAgKzI4LDYgQEAKIAogCWNvbnN0IGNoYXIgKm5hbWU7CiAKLQlpbnQgc3RhdHVzX2dwaW87Ci0JaW50IHN0YXR1c19ncGlvX2FjdGl2ZV9sb3c7Ci0JYm9vbCBzdGF0dXNfZ3Bpb192YWxpZDsKLQogCWJvb2wgZXh0X2NvbnRyb2w7CiAKIAljaGFyICoqc3VwcGxpZWRfdG87CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Bvd2VyL2JxMjd4eHhfYmF0dGVyeS5oIGIvaW5jbHVkZS9saW51eC9wb3dlci9icTI3eHh4X2JhdHRlcnkuaAppbmRleCBiNTBjMDQ5Li5lMzBkZWIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Bvd2VyL2JxMjd4eHhfYmF0dGVyeS5oCisrKyBiL2luY2x1ZGUvbGludXgvcG93ZXIvYnEyN3h4eF9iYXR0ZXJ5LmgKQEAgLTU4LDYgKzU4LDcgQEAKIAl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlOwogCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXQ7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCBtdXRleCBsb2NrOwogCXU4ICpyZWdzOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG93ZXIvc2JzLWJhdHRlcnkuaCBiL2luY2x1ZGUvbGludXgvcG93ZXIvc2JzLWJhdHRlcnkuaAppbmRleCAyYjBhOWQ5Li41MTliOGI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Bvd2VyL3Nicy1iYXR0ZXJ5LmgKKysrIGIvaW5jbHVkZS9saW51eC9wb3dlci9zYnMtYmF0dGVyeS5oCkBAIC0yNiwxNyArMjYsMTMgQEAKIAogLyoqCiAgKiBzdHJ1Y3Qgc2JzX3BsYXRmb3JtX2RhdGEgLSBwbGF0Zm9ybSBkYXRhIGZvciBzYnMgZGV2aWNlcwotICogQGJhdHRlcnlfZGV0ZWN0OgkJR1BJTyB3aGljaCBpcyB1c2VkIHRvIGRldGVjdCBiYXR0ZXJ5IHByZXNlbmNlCi0gKiBAYmF0dGVyeV9kZXRlY3RfcHJlc2VudDoJZ3BpbyBzdGF0ZSB3aGVuIGJhdHRlcnkgaXMgcHJlc2VudCAoMCAvIDEpCiAgKiBAaTJjX3JldHJ5X2NvdW50OgkJIyBvZiB0aW1lcyB0byByZXRyeSBvbiBpMmMgSU8gZmFpbHVyZQogICogQHBvbGxfcmV0cnlfY291bnQ6CQkjIG9mIHRpbWVzIHRvIHJldHJ5IGxvb2tpbmcgZm9yIG5ldyBzdGF0dXMgYWZ0ZXIKICAqCQkJCWV4dGVybmFsIGNoYW5nZSBub3RpZmljYXRpb24KICAqLwogc3RydWN0IHNic19wbGF0Zm9ybV9kYXRhIHsKLQlpbnQgYmF0dGVyeV9kZXRlY3Q7Ci0JaW50IGJhdHRlcnlfZGV0ZWN0X3ByZXNlbnQ7Ci0JaW50IGkyY19yZXRyeV9jb3VudDsKLQlpbnQgcG9sbF9yZXRyeV9jb3VudDsKKwl1MzIgaTJjX3JldHJ5X2NvdW50OworCXUzMiBwb2xsX3JldHJ5X2NvdW50OwogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Byb2NfbnMuaCBiL2luY2x1ZGUvbGludXgvcHJvY19ucy5oCmluZGV4IGRlMGU3NzEuLjEyY2I4YmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHJvY19ucy5oCisrKyBiL2luY2x1ZGUvbGludXgvcHJvY19ucy5oCkBAIC0xOCw2ICsxOCw4IEBACiAJc3RydWN0IG5zX2NvbW1vbiAqKCpnZXQpKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CiAJdm9pZCAoKnB1dCkoc3RydWN0IG5zX2NvbW1vbiAqbnMpOwogCWludCAoKmluc3RhbGwpKHN0cnVjdCBuc3Byb3h5ICpuc3Byb3h5LCBzdHJ1Y3QgbnNfY29tbW9uICpucyk7CisJc3RydWN0IHVzZXJfbmFtZXNwYWNlICooKm93bmVyKShzdHJ1Y3QgbnNfY29tbW9uICpucyk7CisJc3RydWN0IG5zX2NvbW1vbiAqKCpnZXRfcGFyZW50KShzdHJ1Y3QgbnNfY29tbW9uICpucyk7CiB9OwogCiBleHRlcm4gY29uc3Qgc3RydWN0IHByb2NfbnNfb3BlcmF0aW9ucyBuZXRuc19vcGVyYXRpb25zOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wcm9wZXJ0eS5oIGIvaW5jbHVkZS9saW51eC9wcm9wZXJ0eS5oCmluZGV4IDNhMmY5YWUuLjg1NmU1MGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHJvcGVydHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Byb3BlcnR5LmgKQEAgLTE5MCw3ICsxOTAsNyBAQAogCS5sZW5ndGggPSBBUlJBWV9TSVpFKF92YWxfKSAqIHNpemVvZihfdHlwZV8pLAkJXAogCS5pc19hcnJheSA9IHRydWUsCQkJCQlcCiAJLmlzX3N0cmluZyA9IGZhbHNlLAkJCQkJXAotCXsgLnBvaW50ZXIgPSB7IF90eXBlXyMjX2RhdGEgPSBfdmFsXyB9IH0sCQlcCisJeyAucG9pbnRlciA9IHsgLl90eXBlXyMjX2RhdGEgPSBfdmFsXyB9IH0sCQlcCiB9CiAKICNkZWZpbmUgUFJPUEVSVFlfRU5UUllfVThfQVJSQVkoX25hbWVfLCBfdmFsXykJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BzdG9yZS5oIGIvaW5jbHVkZS9saW51eC9wc3RvcmUuaAppbmRleCA4OTllOTVlLi45MjAxM2NjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BzdG9yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcHN0b3JlLmgKQEAgLTIyLDEyICsyMiwxMyBAQAogI2lmbmRlZiBfTElOVVhfUFNUT1JFX0gKICNkZWZpbmUgX0xJTlVYX1BTVE9SRV9ICiAKLSNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2ttc2dfZHVtcC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKIC8qIHR5cGVzICovCiBlbnVtIHBzdG9yZV90eXBlX2lkIHsKQEAgLTY4LDEzICs2OSwyMSBAQAogCQkJZW51bSBrbXNnX2R1bXBfcmVhc29uIHJlYXNvbiwgdTY0ICppZCwKIAkJCXVuc2lnbmVkIGludCBwYXJ0LCBjb25zdCBjaGFyICpidWYsIGJvb2wgY29tcHJlc3NlZCwKIAkJCXNpemVfdCBzaXplLCBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CisJaW50CQkoKndyaXRlX2J1Zl91c2VyKShlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsCisJCQllbnVtIGttc2dfZHVtcF9yZWFzb24gcmVhc29uLCB1NjQgKmlkLAorCQkJdW5zaWduZWQgaW50IHBhcnQsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQlib29sIGNvbXByZXNzZWQsIHNpemVfdCBzaXplLCBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CiAJaW50CQkoKmVyYXNlKShlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIHU2NCBpZCwKIAkJCWludCBjb3VudCwgc3RydWN0IHRpbWVzcGVjIHRpbWUsCiAJCQlzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CiAJdm9pZAkJKmRhdGE7CiB9OwogCi0jZGVmaW5lCVBTVE9SRV9GTEFHU19GUkFHSUxFCTEKKyNkZWZpbmUgUFNUT1JFX0ZMQUdTX0RNRVNHCSgxIDw8IDApCisjZGVmaW5lIFBTVE9SRV9GTEFHU19GUkFHSUxFCVBTVE9SRV9GTEFHU19ETUVTRworI2RlZmluZSBQU1RPUkVfRkxBR1NfQ09OU09MRQkoMSA8PCAxKQorI2RlZmluZSBQU1RPUkVfRkxBR1NfRlRSQUNFCSgxIDw8IDIpCisjZGVmaW5lIFBTVE9SRV9GTEFHU19QTVNHCSgxIDw8IDMpCiAKIGV4dGVybiBpbnQgcHN0b3JlX3JlZ2lzdGVyKHN0cnVjdCBwc3RvcmVfaW5mbyAqKTsKIGV4dGVybiB2b2lkIHBzdG9yZV91bnJlZ2lzdGVyKHN0cnVjdCBwc3RvcmVfaW5mbyAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHN0b3JlX3JhbS5oIGIvaW5jbHVkZS9saW51eC9wc3RvcmVfcmFtLmgKaW5kZXggNDY2MGFhYS4uYzY2OGM4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wc3RvcmVfcmFtLmgKKysrIGIvaW5jbHVkZS9saW51eC9wc3RvcmVfcmFtLmgKQEAgLTE3LDExICsxNywxMiBAQAogI2lmbmRlZiBfX0xJTlVYX1BTVE9SRV9SQU1fSF9fCiAjZGVmaW5lIF9fTElOVVhfUFNUT1JFX1JBTV9IX18KIAorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAogc3RydWN0IHBlcnNpc3RlbnRfcmFtX2J1ZmZlcjsKIHN0cnVjdCByc19jb250cm9sOwpAQCAtNTksNyArNjAsOSBAQAogdm9pZCBwZXJzaXN0ZW50X3JhbV96YXAoc3RydWN0IHBlcnNpc3RlbnRfcmFtX3pvbmUgKnByeik7CiAKIGludCBwZXJzaXN0ZW50X3JhbV93cml0ZShzdHJ1Y3QgcGVyc2lzdGVudF9yYW1fem9uZSAqcHJ6LCBjb25zdCB2b2lkICpzLAotCXVuc2lnbmVkIGludCBjb3VudCk7CisJCQkgdW5zaWduZWQgaW50IGNvdW50KTsKK2ludCBwZXJzaXN0ZW50X3JhbV93cml0ZV91c2VyKHN0cnVjdCBwZXJzaXN0ZW50X3JhbV96b25lICpwcnosCisJCQkgICAgICBjb25zdCB2b2lkIF9fdXNlciAqcywgdW5zaWduZWQgaW50IGNvdW50KTsKIAogdm9pZCBwZXJzaXN0ZW50X3JhbV9zYXZlX29sZChzdHJ1Y3QgcGVyc2lzdGVudF9yYW1fem9uZSAqcHJ6KTsKIHNpemVfdCBwZXJzaXN0ZW50X3JhbV9vbGRfc2l6ZShzdHJ1Y3QgcGVyc2lzdGVudF9yYW1fem9uZSAqcHJ6KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHRwX2Nsb2NrX2tlcm5lbC5oIGIvaW5jbHVkZS9saW51eC9wdHBfY2xvY2tfa2VybmVsLmgKaW5kZXggNmIxNWUxNi4uNWFkNTRmYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wdHBfY2xvY2tfa2VybmVsLmgKKysrIGIvaW5jbHVkZS9saW51eC9wdHBfY2xvY2tfa2VybmVsLmgKQEAgLTEyNyw2ICsxMjcsMTEgQEAKICAqCiAgKiBAaW5mbzogICBTdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgbmV3IGNsb2NrLgogICogQHBhcmVudDogUG9pbnRlciB0byB0aGUgcGFyZW50IGRldmljZSBvZiB0aGUgbmV3IGNsb2NrLgorICoKKyAqIFJldHVybnMgYSB2YWxpZCBwb2ludGVyIG9uIHN1Y2Nlc3Mgb3IgUFRSX0VSUiBvbiBmYWlsdXJlLiAgSWYgUEhDCisgKiBzdXBwb3J0IGlzIG1pc3NpbmcgYXQgdGhlIGNvbmZpZ3VyYXRpb24gbGV2ZWwsIHRoaXMgZnVuY3Rpb24KKyAqIHJldHVybnMgTlVMTCwgYW5kIGRyaXZlcnMgYXJlIGV4cGVjdGVkIHRvIGdyYWNlZnVsbHkgaGFuZGxlIHRoYXQKKyAqIGNhc2Ugc2VwYXJhdGVseS4KICAqLwogCiBleHRlcm4gc3RydWN0IHB0cF9jbG9jayAqcHRwX2Nsb2NrX3JlZ2lzdGVyKHN0cnVjdCBwdHBfY2xvY2tfaW5mbyAqaW5mbywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHhhMnh4X3NzcC5oIGIvaW5jbHVkZS9saW51eC9weGEyeHhfc3NwLmgKaW5kZXggMmEwOTdkMS4uMmQ2ZjBjMzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHhhMnh4X3NzcC5oCisrKyBiL2luY2x1ZGUvbGludXgvcHhhMnh4X3NzcC5oCkBAIC04Myw3ICs4Myw2IEBACiAjZGVmaW5lIFNTU1JfUkZTCSgxIDw8IDYpCS8qIFJlY2VpdmUgRklGTyBTZXJ2aWNlIFJlcXVlc3QgKi8KICNkZWZpbmUgU1NTUl9ST1IJKDEgPDwgNykJLyogUmVjZWl2ZSBGSUZPIE92ZXJydW4gKi8KIAotI2lmZGVmIENPTkZJR19BUkNIX1BYQQogI2RlZmluZSBSWF9USFJFU0hfREZMVAk4CiAjZGVmaW5lIFRYX1RIUkVTSF9ERkxUCTgKIApAQCAtOTUsMTkgKzk0LDE2IEBACiAjZGVmaW5lIFNTQ1IxX1JGVAkoMHgwMDAwM2MwMCkJLyogUmVjZWl2ZSBGSUZPIFRocmVzaG9sZCAobWFzaykgKi8KICNkZWZpbmUgU1NDUjFfUnhUcmVzaCh4KSAoKCh4KSAtIDEpIDw8IDEwKSAvKiBsZXZlbCBbMS4uMTZdICovCiAKLSNlbHNlCisjZGVmaW5lIFJYX1RIUkVTSF9DRTQxMDBfREZMVAkyCisjZGVmaW5lIFRYX1RIUkVTSF9DRTQxMDBfREZMVAkyCiAKLSNkZWZpbmUgUlhfVEhSRVNIX0RGTFQJMgotI2RlZmluZSBUWF9USFJFU0hfREZMVAkyCisjZGVmaW5lIENFNDEwMF9TU1NSX1RGTF9NQVNLCSgweDMgPDwgOCkJLyogVHJhbnNtaXQgRklGTyBMZXZlbCBtYXNrICovCisjZGVmaW5lIENFNDEwMF9TU1NSX1JGTF9NQVNLCSgweDMgPDwgMTIpCS8qIFJlY2VpdmUgRklGTyBMZXZlbCBtYXNrICovCiAKLSNkZWZpbmUgU1NTUl9URkxfTUFTSwkoMHgzIDw8IDgpCS8qIFRyYW5zbWl0IEZJRk8gTGV2ZWwgbWFzayAqLwotI2RlZmluZSBTU1NSX1JGTF9NQVNLCSgweDMgPDwgMTIpCS8qIFJlY2VpdmUgRklGTyBMZXZlbCBtYXNrICovCi0KLSNkZWZpbmUgU1NDUjFfVEZUCSgweDAwMDAwMGMwKQkvKiBUcmFuc21pdCBGSUZPIFRocmVzaG9sZCAobWFzaykgKi8KLSNkZWZpbmUgU1NDUjFfVHhUcmVzaCh4KSAoKCh4KSAtIDEpIDw8IDYpIC8qIGxldmVsIFsxLi40XSAqLwotI2RlZmluZSBTU0NSMV9SRlQJKDB4MDAwMDBjMDApCS8qIFJlY2VpdmUgRklGTyBUaHJlc2hvbGQgKG1hc2spICovCi0jZGVmaW5lIFNTQ1IxX1J4VHJlc2goeCkgKCgoeCkgLSAxKSA8PCAxMCkgLyogbGV2ZWwgWzEuLjRdICovCi0jZW5kaWYKKyNkZWZpbmUgQ0U0MTAwX1NTQ1IxX1RGVAkoMHgwMDAwMDBjMCkJLyogVHJhbnNtaXQgRklGTyBUaHJlc2hvbGQgKG1hc2spICovCisjZGVmaW5lIENFNDEwMF9TU0NSMV9UeFRyZXNoKHgpICgoKHgpIC0gMSkgPDwgNikJLyogbGV2ZWwgWzEuLjRdICovCisjZGVmaW5lIENFNDEwMF9TU0NSMV9SRlQJKDB4MDAwMDBjMDApCS8qIFJlY2VpdmUgRklGTyBUaHJlc2hvbGQgKG1hc2spICovCisjZGVmaW5lIENFNDEwMF9TU0NSMV9SeFRyZXNoKHgpICgoKHgpIC0gMSkgPDwgMTApCS8qIGxldmVsIFsxLi40XSAqLwogCiAvKiBRVUFSS19YMTAwMCBTU0NSMCBiaXQgZGVmaW5pdGlvbiAqLwogI2RlZmluZSBRVUFSS19YMTAwMF9TU0NSMF9EU1MJKDB4MUYpCQkvKiBEYXRhIFNpemUgU2VsZWN0IChtYXNrKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xZWQvY29tbW9uX2hzaS5oIGIvaW5jbHVkZS9saW51eC9xZWQvY29tbW9uX2hzaS5oCmluZGV4IDQwYzBhZGEuLjczNGRlYjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcWVkL2NvbW1vbl9oc2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3FlZC9jb21tb25faHNpLmgKQEAgLTUsMjggKzUsNzcgQEAKICAqIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YKICAqIHRoaXMgc291cmNlIHRyZWUuCiAgKi8KKyNpZm5kZWYgX0NPTU1PTl9IU0lfSAorI2RlZmluZSBfQ09NTU9OX0hTSV9ICisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisvKiBkbWFfYWRkcl90IG1hbmlwICovCisjZGVmaW5lIERNQV9MT19MRSh4KQkJY3B1X3RvX2xlMzIobG93ZXJfMzJfYml0cyh4KSkKKyNkZWZpbmUgRE1BX0hJX0xFKHgpCQljcHVfdG9fbGUzMih1cHBlcl8zMl9iaXRzKHgpKQorI2RlZmluZSBETUFfUkVHUEFJUl9MRSh4LCB2YWwpCWRvIHsgXAorCQkJCQkoeCkuaGkgPSBETUFfSElfTEUoKHZhbCkpOyBcCisJCQkJCSh4KS5sbyA9IERNQV9MT19MRSgodmFsKSk7IFwKKwkJCQl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhJTE9fR0VOKGhpLCBsbywgdHlwZSkgICgoKCh0eXBlKShoaSkpIDw8IDMyKSArIChsbykpCisjZGVmaW5lIEhJTE9fNjQoaGksIGxvKSBISUxPX0dFTigobGUzMl90b19jcHUoaGkpKSwgKGxlMzJfdG9fY3B1KGxvKSksIHU2NCkKKyNkZWZpbmUgSElMT182NF9SRUdQQUlSKHJlZ3BhaXIpICAgICAgICAoSElMT182NChyZWdwYWlyLmhpLCByZWdwYWlyLmxvKSkKKyNkZWZpbmUgSElMT19ETUFfUkVHUEFJUihyZWdwYWlyKQkoKGRtYV9hZGRyX3QpSElMT182NF9SRUdQQUlSKHJlZ3BhaXIpKQogCiAjaWZuZGVmIF9fQ09NTU9OX0hTSV9fCiAjZGVmaW5lIF9fQ09NTU9OX0hTSV9fCiAKLSNkZWZpbmUgQ09SRV9TUFFFX1BBR0VfU0laRV9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgNDA5NgogCiAjZGVmaW5lIFhfRklOQUxfQ0xFQU5VUF9BR0dfSU5UIDEKKworI2RlZmluZSBFVkVOVF9SSU5HX1BBR0VfU0laRV9CWVRFUyAgICAgICAgICA0MDk2CisKICNkZWZpbmUgTlVNX09GX0dMT0JBTF9RVUVVRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI4CisjZGVmaW5lIENPTU1PTl9RVUVVRV9FTlRSWV9NQVhfQllURV9TSVpFICAgICAgICA2NAorCisjZGVmaW5lIElTQ1NJX0NEVV9UQVNLX1NFR19UWVBFICAgICAgIDAKKyNkZWZpbmUgUkRNQV9DRFVfVEFTS19TRUdfVFlQRSAgICAgICAgMQorCisjZGVmaW5lIEZXX0FTU0VSVF9HRU5FUkFMX0FUVE5fSURYICAgIDMyCisKKyNkZWZpbmUgTUFYX1BJTk5FRF9DQ0ZDICAgICAgICAgICAgICAgICAzMgogCiAvKiBRdWV1ZSBab25lIHNpemVzIGluIGJ5dGVzICovCiAjZGVmaW5lIFRTVE9STV9RWk9ORV9TSVpFIDgKLSNkZWZpbmUgTVNUT1JNX1FaT05FX1NJWkUgMAorI2RlZmluZSBNU1RPUk1fUVpPTkVfU0laRSAxNgogI2RlZmluZSBVU1RPUk1fUVpPTkVfU0laRSA4CiAjZGVmaW5lIFhTVE9STV9RWk9ORV9TSVpFIDgKICNkZWZpbmUgWVNUT1JNX1FaT05FX1NJWkUgMAogI2RlZmluZSBQU1RPUk1fUVpPTkVfU0laRSAwCiAKLSNkZWZpbmUgRVRIX01BWF9OVU1fUlhfUVVFVUVTX1BFUl9WRiAxNgorI2RlZmluZSBNU1RPUk1fVkZfWk9ORV9ERUZBVUxUX1NJWkVfTE9HCTcKKyNkZWZpbmUgRVRIX01BWF9OVU1fUlhfUVVFVUVTX1BFUl9WRl9ERUZBVUxUCTE2CisjZGVmaW5lIEVUSF9NQVhfTlVNX1JYX1FVRVVFU19QRVJfVkZfRE9VQkxFCTQ4CisjZGVmaW5lIEVUSF9NQVhfTlVNX1JYX1FVRVVFU19QRVJfVkZfUVVBRAkxMTIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQ09SRSAoTElHSFQgTDIpIEZXIENPTlNUQU5UUyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIENPUkVfTEwyX01BWF9SQU1ST0RfUEVSX0NPTgk4CisjZGVmaW5lIENPUkVfTEwyX1RYX0JEX1BBR0VfU0laRV9CWVRFUwk0MDk2CisjZGVmaW5lIENPUkVfTEwyX1JYX0JEX1BBR0VfU0laRV9CWVRFUwk0MDk2CisjZGVmaW5lIENPUkVfTEwyX1JYX0NRRV9QQUdFX1NJWkVfQllURVMJNDA5NgorI2RlZmluZSBDT1JFX0xMMl9SWF9OVU1fTkVYVF9QQUdFX0JEUwkxCisKKyNkZWZpbmUgQ09SRV9MTDJfVFhfTUFYX0JEU19QRVJfUEFDS0VUCTEyCisKKyNkZWZpbmUgQ09SRV9TUFFFX1BBR0VfU0laRV9CWVRFUwk0MDk2CisKKyNkZWZpbmUgTUFYX05VTV9MTDJfUlhfUVVFVUVTCQkzMgorI2RlZmluZSBNQVhfTlVNX0xMMl9UWF9TVEFUU19DT1VOVEVSUwkzMgogCiAjZGVmaW5lIEZXX01BSk9SX1ZFUlNJT04JOAogI2RlZmluZSBGV19NSU5PUl9WRVJTSU9OCTEwCi0jZGVmaW5lIEZXX1JFVklTSU9OX1ZFUlNJT04JNQorI2RlZmluZSBGV19SRVZJU0lPTl9WRVJTSU9OCTEwCiAjZGVmaW5lIEZXX0VOR0lORUVSSU5HX1ZFUlNJT04JMAogCiAvKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC04Myw2ICsxMzIsMjAgQEAKICNkZWZpbmUgTlVNX09GX0xDSURTCQkoMzIwKQogI2RlZmluZSBOVU1fT0ZfTFRJRFMJCSgzMjApCiAKKy8qIENsb2NrIHZhbHVlcyAqLworI2RlZmluZSBNQVNURVJfQ0xLX0ZSRVFfRTQJKDM3NWU2KQorI2RlZmluZSBTVE9STV9DTEtfRlJFUV9FNAkoMTAwMGU2KQorI2RlZmluZSBDTEsyNU1fQ0xLX0ZSRVFfRTQJKDI1ZTYpCisKKy8qIEdsb2JhbCBQWFAgd2luZG93cyAoR1RUKSAqLworI2RlZmluZSBOVU1fT0ZfR1RUCQkxOQorI2RlZmluZSBHVFRfRFdPUkRfU0laRV9CSVRTCTEwCisjZGVmaW5lIEdUVF9CWVRFX1NJWkVfQklUUwkoR1RUX0RXT1JEX1NJWkVfQklUUyArIDIpCisjZGVmaW5lIEdUVF9EV09SRF9TSVpFCQlCSVQoR1RUX0RXT1JEX1NJWkVfQklUUykKKworLyogVG9vbHMgVmVyc2lvbiAqLworI2RlZmluZSBUT09MU19WRVJTSU9OIDEwCisKIC8qKioqKioqKioqKioqKioqKi8KIC8qIENEVSBDT05TVEFOVFMgKi8KIC8qKioqKioqKioqKioqKioqKi8KQEAgLTkwLDYgKzE1Myw4IEBACiAjZGVmaW5lIENEVV9TRUdfVFlQRV9PRkZTRVRfUkVHX1RZUEVfU0hJRlQgICAgICAgICAgICAgICgxNykKICNkZWZpbmUgQ0RVX1NFR19UWVBFX09GRlNFVF9SRUdfT0ZGU0VUX01BU0sgICAgICAgICAgICAgKDB4MWZmZmYpCiAKKyNkZWZpbmUgQ0RVX1ZGX0ZMX1NFR19UWVBFX09GRlNFVF9SRUdfVFlQRV9TSElGVAkoMTIpCisjZGVmaW5lIENEVV9WRl9GTF9TRUdfVFlQRV9PRkZTRVRfUkVHX09GRlNFVF9NQVNLCSgweGZmZikKIC8qKioqKioqKioqKioqKioqKi8KIC8qIERRIENPTlNUQU5UUyAgKi8KIC8qKioqKioqKioqKioqKioqKi8KQEAgLTExNSw2ICsxODAsMTEgQEAKICNkZWZpbmUJRFFfWENNX0VUSF9UWF9CRF9DT05TX0NNRAlEUV9YQ01fQUdHX1ZBTF9TRUxfV09SRDMKICNkZWZpbmUJRFFfWENNX0VUSF9UWF9CRF9QUk9EX0NNRAlEUV9YQ01fQUdHX1ZBTF9TRUxfV09SRDQKICNkZWZpbmUJRFFfWENNX0VUSF9HT19UT19CRF9DT05TX0NNRAlEUV9YQ01fQUdHX1ZBTF9TRUxfV09SRDUKKyNkZWZpbmUgRFFfWENNX0lTQ1NJX1NRX0NPTlNfQ01ECURRX1hDTV9BR0dfVkFMX1NFTF9XT1JEMworI2RlZmluZSBEUV9YQ01fSVNDU0lfU1FfUFJPRF9DTUQJRFFfWENNX0FHR19WQUxfU0VMX1dPUkQ0CisjZGVmaW5lIERRX1hDTV9JU0NTSV9NT1JFX1RPX1NFTkRfU0VRX0NNRCBEUV9YQ01fQUdHX1ZBTF9TRUxfUkVHMworI2RlZmluZSBEUV9YQ01fSVNDU0lfRVhQX1NUQVRfU05fQ01ECURRX1hDTV9BR0dfVkFMX1NFTF9SRUc2CisjZGVmaW5lIERRX1hDTV9ST0NFX1NRX1BST0RfQ01ECURRX1hDTV9BR0dfVkFMX1NFTF9XT1JENAogCiAvKiBVQ00gYWdnIHZhbCBzZWxlY3Rpb24gKEhXKSAqLwogI2RlZmluZQlEUV9VQ01fQUdHX1ZBTF9TRUxfV09SRDAJMApAQCAtMTU5LDEzICsyMjksMTYgQEAKICNkZWZpbmUJRFFfWENNX0FHR19GTEdfU0hJRlRfQ0YyMwk3CiAKIC8qIFhDTSBhZ2cgY291bnRlciBmbGFnIHNlbGVjdGlvbiAqLwotI2RlZmluZSBEUV9YQ01fQ09SRV9EUV9DRl9DTUQJCSgxIDw8IERRX1hDTV9BR0dfRkxHX1NISUZUX0NGMTgpCi0jZGVmaW5lIERRX1hDTV9DT1JFX1RFUk1JTkFURV9DTUQJKDEgPDwgRFFfWENNX0FHR19GTEdfU0hJRlRfQ0YxOSkKLSNkZWZpbmUgRFFfWENNX0NPUkVfU0xPV19QQVRIX0NNRAkoMSA8PCBEUV9YQ01fQUdHX0ZMR19TSElGVF9DRjIyKQotI2RlZmluZSBEUV9YQ01fRVRIX0RRX0NGX0NNRAkJKDEgPDwgRFFfWENNX0FHR19GTEdfU0hJRlRfQ0YxOCkKLSNkZWZpbmUgRFFfWENNX0VUSF9URVJNSU5BVEVfQ01ECSgxIDw8IERRX1hDTV9BR0dfRkxHX1NISUZUX0NGMTkpCi0jZGVmaW5lIERRX1hDTV9FVEhfU0xPV19QQVRIX0NNRAkoMSA8PCBEUV9YQ01fQUdHX0ZMR19TSElGVF9DRjIyKQotI2RlZmluZSBEUV9YQ01fRVRIX1RQSF9FTl9DTUQJCSgxIDw8IERRX1hDTV9BR0dfRkxHX1NISUZUX0NGMjMpCisjZGVmaW5lIERRX1hDTV9DT1JFX0RRX0NGX0NNRAkJQklUKERRX1hDTV9BR0dfRkxHX1NISUZUX0NGMTgpCisjZGVmaW5lIERRX1hDTV9DT1JFX1RFUk1JTkFURV9DTUQJQklUKERRX1hDTV9BR0dfRkxHX1NISUZUX0NGMTkpCisjZGVmaW5lIERRX1hDTV9DT1JFX1NMT1dfUEFUSF9DTUQJQklUKERRX1hDTV9BR0dfRkxHX1NISUZUX0NGMjIpCisjZGVmaW5lIERRX1hDTV9FVEhfRFFfQ0ZfQ01ECQlCSVQoRFFfWENNX0FHR19GTEdfU0hJRlRfQ0YxOCkKKyNkZWZpbmUgRFFfWENNX0VUSF9URVJNSU5BVEVfQ01ECUJJVChEUV9YQ01fQUdHX0ZMR19TSElGVF9DRjE5KQorI2RlZmluZSBEUV9YQ01fRVRIX1NMT1dfUEFUSF9DTUQJQklUKERRX1hDTV9BR0dfRkxHX1NISUZUX0NGMjIpCisjZGVmaW5lIERRX1hDTV9FVEhfVFBIX0VOX0NNRAkJQklUKERRX1hDTV9BR0dfRkxHX1NISUZUX0NGMjMpCisjZGVmaW5lIERRX1hDTV9JU0NTSV9EUV9GTFVTSF9DTUQJQklUKERRX1hDTV9BR0dfRkxHX1NISUZUX0NGMTkpCisjZGVmaW5lIERRX1hDTV9JU0NTSV9TTE9XX1BBVEhfQ01ECUJJVChEUV9YQ01fQUdHX0ZMR19TSElGVF9DRjIyKQorI2RlZmluZSBEUV9YQ01fSVNDU0lfUFJPQ19PTkxZX0NMRUFOVVBfQ01EIEJJVChEUV9YQ01fQUdHX0ZMR19TSElGVF9DRjIzKQogCiAvKiBVQ00gYWdnIGNvdW50ZXIgZmxhZyBzZWxlY3Rpb24gKEhXKSAqLwogI2RlZmluZQlEUV9VQ01fQUdHX0ZMR19TSElGVF9DRjAJMApAQCAtMTc4LDkgKzI1MSw0NSBAQAogI2RlZmluZQlEUV9VQ01fQUdHX0ZMR19TSElGVF9SVUxFMUVOCTcKIAogLyogVUNNIGFnZyBjb3VudGVyIGZsYWcgc2VsZWN0aW9uIChGVykgKi8KLSNkZWZpbmUgRFFfVUNNX0VUSF9QTURfVFhfQVJNX0NNRAkoMSA8PCBEUV9VQ01fQUdHX0ZMR19TSElGVF9DRjQpCi0jZGVmaW5lIERRX1VDTV9FVEhfUE1EX1JYX0FSTV9DTUQJKDEgPDwgRFFfVUNNX0FHR19GTEdfU0hJRlRfQ0Y1KQorI2RlZmluZSBEUV9VQ01fRVRIX1BNRF9UWF9BUk1fQ01ECUJJVChEUV9VQ01fQUdHX0ZMR19TSElGVF9DRjQpCisjZGVmaW5lIERRX1VDTV9FVEhfUE1EX1JYX0FSTV9DTUQJQklUKERRX1VDTV9BR0dfRkxHX1NISUZUX0NGNSkKKyNkZWZpbmUgRFFfVUNNX1JPQ0VfQ1FfQVJNX1NFX0NGX0NNRAlCSVQoRFFfVUNNX0FHR19GTEdfU0hJRlRfQ0Y0KQorI2RlZmluZSBEUV9VQ01fUk9DRV9DUV9BUk1fQ0ZfQ01ECUJJVChEUV9VQ01fQUdHX0ZMR19TSElGVF9DRjUpCiAKKy8qIFRDTSBhZ2cgY291bnRlciBmbGFnIHNlbGVjdGlvbiAoSFcpICovCisjZGVmaW5lIERRX1RDTV9BR0dfRkxHX1NISUZUX0NGMAkwCisjZGVmaW5lIERRX1RDTV9BR0dfRkxHX1NISUZUX0NGMQkxCisjZGVmaW5lIERRX1RDTV9BR0dfRkxHX1NISUZUX0NGMgkyCisjZGVmaW5lIERRX1RDTV9BR0dfRkxHX1NISUZUX0NGMwkzCisjZGVmaW5lIERRX1RDTV9BR0dfRkxHX1NISUZUX0NGNAk0CisjZGVmaW5lIERRX1RDTV9BR0dfRkxHX1NISUZUX0NGNQk1CisjZGVmaW5lIERRX1RDTV9BR0dfRkxHX1NISUZUX0NGNgk2CisjZGVmaW5lIERRX1RDTV9BR0dfRkxHX1NISUZUX0NGNwk3CisvKiBUQ00gYWdnIGNvdW50ZXIgZmxhZyBzZWxlY3Rpb24gKEZXKSAqLworI2RlZmluZSBEUV9UQ01fSVNDU0lfRkxVU0hfUTBfQ01ECUJJVChEUV9UQ01fQUdHX0ZMR19TSElGVF9DRjEpCisjZGVmaW5lIERRX1RDTV9JU0NTSV9USU1FUl9TVE9QX0FMTF9DTUQJQklUKERRX1RDTV9BR0dfRkxHX1NISUZUX0NGMykKKworLyogUFdNIGFkZHJlc3MgbWFwcGluZyAqLworI2RlZmluZSBEUV9QV01fT0ZGU0VUX0RQTV9CQVNFCTB4MAorI2RlZmluZSBEUV9QV01fT0ZGU0VUX0RQTV9FTkQJMHgyNworI2RlZmluZSBEUV9QV01fT0ZGU0VUX1hDTTE2X0JBU0UJMHg0MAorI2RlZmluZSBEUV9QV01fT0ZGU0VUX1hDTTMyX0JBU0UJMHg0NAorI2RlZmluZSBEUV9QV01fT0ZGU0VUX1VDTTE2X0JBU0UJMHg0OAorI2RlZmluZSBEUV9QV01fT0ZGU0VUX1VDTTMyX0JBU0UJMHg0QworI2RlZmluZSBEUV9QV01fT0ZGU0VUX1VDTTE2XzQJMHg1MAorI2RlZmluZSBEUV9QV01fT0ZGU0VUX1RDTTE2X0JBU0UJMHg1OAorI2RlZmluZSBEUV9QV01fT0ZGU0VUX1RDTTMyX0JBU0UJMHg1QworI2RlZmluZSBEUV9QV01fT0ZGU0VUX1hDTV9GTEFHUwkweDY4CisjZGVmaW5lIERRX1BXTV9PRkZTRVRfVUNNX0ZMQUdTCTB4NjkKKyNkZWZpbmUgRFFfUFdNX09GRlNFVF9UQ01fRkxBR1MJMHg2QgorCisjZGVmaW5lIERRX1BXTV9PRkZTRVRfWENNX1JETUFfU1FfUFJPRAkJKERRX1BXTV9PRkZTRVRfWENNMTZfQkFTRSArIDIpCisjZGVmaW5lIERRX1BXTV9PRkZTRVRfVUNNX1JETUFfQ1FfQ09OU18zMkJJVAkoRFFfUFdNX09GRlNFVF9VQ00zMl9CQVNFKQorI2RlZmluZSBEUV9QV01fT0ZGU0VUX1VDTV9SRE1BX0NRX0NPTlNfMTZCSVQJKERRX1BXTV9PRkZTRVRfVUNNMTZfNCkKKyNkZWZpbmUgRFFfUFdNX09GRlNFVF9VQ01fUkRNQV9JTlRfVElNRU9VVAkoRFFfUFdNX09GRlNFVF9VQ00xNl9CQVNFICsgMikKKyNkZWZpbmUgRFFfUFdNX09GRlNFVF9VQ01fUkRNQV9BUk1fRkxBR1MJKERRX1BXTV9PRkZTRVRfVUNNX0ZMQUdTKQorI2RlZmluZSBEUV9QV01fT0ZGU0VUX1RDTV9ST0NFX1JRX1BST0QJCShEUV9QV01fT0ZGU0VUX1RDTTE2X0JBU0UgKyAxKQorI2RlZmluZSBEUV9QV01fT0ZGU0VUX1RDTV9JV0FSUF9SUV9QUk9ECQkoRFFfUFdNX09GRlNFVF9UQ00xNl9CQVNFICsgMykKICNkZWZpbmUJRFFfUkVHSU9OX1NISUZUCSgxMikKIAogLyogRFBNICovCkBAIC0yMTQsMTUgKzMyMywxNyBAQAogICovCiAjZGVmaW5lIENNX1RYX1BRX0JBU0UJMHgyMDAKIAorLyogbnVtYmVyIG9mIGdsb2JhbCBWcG9ydC9RQ04gcmF0ZSBsaW1pdGVycyAqLworI2RlZmluZSBNQVhfUU1fR0xPQkFMX1JMUwkyNTYKIC8qIFFNIHJlZ2lzdGVycyBkYXRhICovCiAjZGVmaW5lIFFNX0xJTkVfQ1JEX1JFR19XSURUSAkJMTYKLSNkZWZpbmUgUU1fTElORV9DUkRfUkVHX1NJR05fQklUCSgxIDw8IChRTV9MSU5FX0NSRF9SRUdfV0lEVEggLSAxKSkKKyNkZWZpbmUgUU1fTElORV9DUkRfUkVHX1NJR05fQklUCUJJVCgoUU1fTElORV9DUkRfUkVHX1dJRFRIIC0gMSkpCiAjZGVmaW5lIFFNX0JZVEVfQ1JEX1JFR19XSURUSAkJMjQKLSNkZWZpbmUgUU1fQllURV9DUkRfUkVHX1NJR05fQklUCSgxIDw8IChRTV9CWVRFX0NSRF9SRUdfV0lEVEggLSAxKSkKKyNkZWZpbmUgUU1fQllURV9DUkRfUkVHX1NJR05fQklUCUJJVCgoUU1fQllURV9DUkRfUkVHX1dJRFRIIC0gMSkpCiAjZGVmaW5lIFFNX1dGUV9DUkRfUkVHX1dJRFRICQkzMgotI2RlZmluZSBRTV9XRlFfQ1JEX1JFR19TSUdOX0JJVAkJKDEgPDwgKFFNX1dGUV9DUkRfUkVHX1dJRFRIIC0gMSkpCisjZGVmaW5lIFFNX1dGUV9DUkRfUkVHX1NJR05fQklUCQlCSVQoKFFNX1dGUV9DUkRfUkVHX1dJRFRIIC0gMSkpCiAjZGVmaW5lIFFNX1JMX0NSRF9SRUdfV0lEVEgJCTMyCi0jZGVmaW5lIFFNX1JMX0NSRF9SRUdfU0lHTl9CSVQJCSgxIDw8IChRTV9STF9DUkRfUkVHX1dJRFRIIC0gMSkpCisjZGVmaW5lIFFNX1JMX0NSRF9SRUdfU0lHTl9CSVQJCUJJVCgoUU1fUkxfQ1JEX1JFR19XSURUSCAtIDEpKQogCiAvKioqKioqKioqKioqKioqKiovCiAvKiBDQVUgQ09OU1RBTlRTICovCkBAIC0yODcsNiArMzk4LDE3IEBACiAvKiBQWFAgQ09OU1RBTlRTICovCiAvKioqKioqKioqKioqKioqKiovCiAKKy8qIEJhcnMgZm9yIEJsb2NrcyAqLworI2RlZmluZSBQWFBfQkFSX0dSQwkwCisjZGVmaW5lIFBYUF9CQVJfVFNETQkwCisjZGVmaW5lIFBYUF9CQVJfVVNETQkwCisjZGVmaW5lIFBYUF9CQVJfWFNETQkwCisjZGVmaW5lIFBYUF9CQVJfTVNETQkwCisjZGVmaW5lIFBYUF9CQVJfWVNETQkwCisjZGVmaW5lIFBYUF9CQVJfUFNETQkwCisjZGVmaW5lIFBYUF9CQVJfSUdVCTAKKyNkZWZpbmUgUFhQX0JBUl9EUQkxCisKIC8qIFBUVCBhbmQgR1RUICovCiAjZGVmaW5lIFBYUF9OVU1fUEZfV0lORE9XUwkJMTIKICNkZWZpbmUgUFhQX1BFUl9QRl9FTlRSWV9TSVpFCQk4CkBAIC0zMzQsNiArNDU2LDUyIEBACiAJKFBYUF9FWFRFUk5BTF9CQVJfR0xPQkFMX1dJTkRPV19TVEFSVCArIFwKIAkgUFhQX0VYVEVSTkFMX0JBUl9HTE9CQUxfV0lORE9XX0xFTkdUSCAtIDEpCiAKKy8qIFBGIEJBUiAqLworI2RlZmluZSBQWFBfQkFSMF9TVEFSVF9HUkMJMHgwMDAwCisjZGVmaW5lIFBYUF9CQVIwX0dSQ19MRU5HVEgJMHgxQzAwMDAwCisjZGVmaW5lIFBYUF9CQVIwX0VORF9HUkMJKFBYUF9CQVIwX1NUQVJUX0dSQyArIFwKKwkJCQkgUFhQX0JBUjBfR1JDX0xFTkdUSCAtIDEpCisKKyNkZWZpbmUgUFhQX0JBUjBfU1RBUlRfSUdVCTB4MUMwMDAwMAorI2RlZmluZSBQWFBfQkFSMF9JR1VfTEVOR1RICTB4MTAwMDAKKyNkZWZpbmUgUFhQX0JBUjBfRU5EX0lHVQkoUFhQX0JBUjBfU1RBUlRfSUdVICsgXAorCQkJCSBQWFBfQkFSMF9JR1VfTEVOR1RIIC0gMSkKKworI2RlZmluZSBQWFBfQkFSMF9TVEFSVF9UU0RNCTB4MUM4MDAwMAorI2RlZmluZSBQWFBfQkFSMF9TRE1fTEVOR1RICTB4NDAwMDAKKyNkZWZpbmUgUFhQX0JBUjBfU0RNX1JFU0VSVkVEX0xFTkdUSAkweDQwMDAwCisjZGVmaW5lIFBYUF9CQVIwX0VORF9UU0RNCShQWFBfQkFSMF9TVEFSVF9UU0RNICsgXAorCQkJCSBQWFBfQkFSMF9TRE1fTEVOR1RIIC0gMSkKKworI2RlZmluZSBQWFBfQkFSMF9TVEFSVF9NU0RNCTB4MUQwMDAwMAorI2RlZmluZSBQWFBfQkFSMF9FTkRfTVNETQkoUFhQX0JBUjBfU1RBUlRfTVNETSArIFwKKwkJCQkgUFhQX0JBUjBfU0RNX0xFTkdUSCAtIDEpCisKKyNkZWZpbmUgUFhQX0JBUjBfU1RBUlRfVVNETQkweDFEODAwMDAKKyNkZWZpbmUgUFhQX0JBUjBfRU5EX1VTRE0JKFBYUF9CQVIwX1NUQVJUX1VTRE0gKyBcCisJCQkJIFBYUF9CQVIwX1NETV9MRU5HVEggLSAxKQorCisjZGVmaW5lIFBYUF9CQVIwX1NUQVJUX1hTRE0JMHgxRTAwMDAwCisjZGVmaW5lIFBYUF9CQVIwX0VORF9YU0RNCShQWFBfQkFSMF9TVEFSVF9YU0RNICsgXAorCQkJCSBQWFBfQkFSMF9TRE1fTEVOR1RIIC0gMSkKKworI2RlZmluZSBQWFBfQkFSMF9TVEFSVF9ZU0RNCTB4MUU4MDAwMAorI2RlZmluZSBQWFBfQkFSMF9FTkRfWVNETQkoUFhQX0JBUjBfU1RBUlRfWVNETSArIFwKKwkJCQkgUFhQX0JBUjBfU0RNX0xFTkdUSCAtIDEpCisKKyNkZWZpbmUgUFhQX0JBUjBfU1RBUlRfUFNETQkweDFGMDAwMDAKKyNkZWZpbmUgUFhQX0JBUjBfRU5EX1BTRE0JKFBYUF9CQVIwX1NUQVJUX1BTRE0gKyBcCisJCQkJIFBYUF9CQVIwX1NETV9MRU5HVEggLSAxKQorCisjZGVmaW5lIFBYUF9CQVIwX0ZJUlNUX0lOVkFMSURfQUREUkVTUwkoUFhQX0JBUjBfRU5EX1BTRE0gKyAxKQorCisvKiBWRiBCQVIgKi8KKyNkZWZpbmUgUFhQX1ZGX0JBUjAJMAorCisjZGVmaW5lIFBYUF9WRl9CQVIwX1NUQVJUX0dSQwkweDNFMDAKKyNkZWZpbmUgUFhQX1ZGX0JBUjBfR1JDX0xFTkdUSAkweDIwMAorI2RlZmluZSBQWFBfVkZfQkFSMF9FTkRfR1JDCShQWFBfVkZfQkFSMF9TVEFSVF9HUkMgKyBcCisJCQkJIFBYUF9WRl9CQVIwX0dSQ19MRU5HVEggLSAxKQogCiAjZGVmaW5lIFBYUF9WRl9CQVIwX1NUQVJUX0lHVSAgICAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIFBYUF9WRl9CQVIwX0lHVV9MRU5HVEggICAgICAgICAgICAgICAgICAweDMwMDAKQEAgLTM5OSw2ICs1NjcsMjAgQEAKICNkZWZpbmUgUFhQX05VTV9JTFRfUkVDT1JEU19CQiA3NjAwCiAjZGVmaW5lIFBYUF9OVU1fSUxUX1JFQ09SRFNfSzIgMTEwMDAKICNkZWZpbmUgTUFYX05VTV9JTFRfUkVDT1JEUyBNQVgoUFhQX05VTV9JTFRfUkVDT1JEU19CQiwgUFhQX05VTV9JTFRfUkVDT1JEU19LMikKKyNkZWZpbmUgUFhQX1FVRVVFU19aT05FX01BWF9OVU0gMzIwCisvKioqKioqKioqKioqKioqKiovCisvKiBQUk0gQ09OU1RBTlRTICovCisvKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFBSTV9ETUFfUEFEX0JZVEVTX05VTQkyCisvKioqKioqKioqKioqKioqKioqLworLyogU0RNcyBDT05TVEFOVFMgKi8KKy8qKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFNETV9PUF9HRU5fVFJJR19OT05FCTAKKyNkZWZpbmUgU0RNX09QX0dFTl9UUklHX1dBS0VfVEhSRUFECTEKKyNkZWZpbmUgU0RNX09QX0dFTl9UUklHX0FHR19JTlQJMgorI2RlZmluZSBTRE1fT1BfR0VOX1RSSUdfTE9BREVSCTQKKyNkZWZpbmUgU0RNX09QX0dFTl9UUklHX0lORElDQVRFX0VSUk9SCTYKKyNkZWZpbmUgU0RNX09QX0dFTl9UUklHX1JFTEVBU0VfVEhSRUFECTcKIAogI2RlZmluZSBTRE1fQ09NUF9UWVBFX05PTkUgICAgICAgICAgICAgIDAKICNkZWZpbmUgU0RNX0NPTVBfVFlQRV9XQUtFX1RIUkVBRCAgICAgICAxCkBAIC00MjQsNiArNjA2LDggQEAKIC8qIFBSUyBDT05TVEFOVFMgKi8KIC8qKioqKioqKioqKioqKioqKi8KIAorI2RlZmluZSBQUlNfR0ZUX0NBTV9MSU5FU19OT19NQVRDSAkzMQorCiAvKiBBc3luYyBkYXRhIEtDUSBDUUUgKi8KIHN0cnVjdCBhc3luY19kYXRhIHsKIAlfX2xlMzIJY2lkOwpAQCAtNDQwLDIwICs2MjQsNiBAQAogI2RlZmluZQlDT0FMRVNDSU5HX1RJTUVTRVRfVkFMSURfU0hJRlQJCTcKIH07CiAKLXN0cnVjdCBjb21tb25fcHJzX3BmX21zZ19pbmZvIHsKLQlfX2xlMzIgdmFsdWU7Ci0jZGVmaW5lCUNPTU1PTl9QUlNfUEZfTVNHX0lORk9fTlBBUl9ERUZBVUxUX1BGX01BU0sJMHgxCi0jZGVmaW5lCUNPTU1PTl9QUlNfUEZfTVNHX0lORk9fTlBBUl9ERUZBVUxUX1BGX1NISUZUCTAKLSNkZWZpbmUJQ09NTU9OX1BSU19QRl9NU0dfSU5GT19GV19ERUJVR18xX01BU0sJCTB4MQotI2RlZmluZQlDT01NT05fUFJTX1BGX01TR19JTkZPX0ZXX0RFQlVHXzFfU0hJRlQJCTEKLSNkZWZpbmUJQ09NTU9OX1BSU19QRl9NU0dfSU5GT19GV19ERUJVR18yX01BU0sJCTB4MQotI2RlZmluZQlDT01NT05fUFJTX1BGX01TR19JTkZPX0ZXX0RFQlVHXzJfU0hJRlQJCTIKLSNkZWZpbmUJQ09NTU9OX1BSU19QRl9NU0dfSU5GT19GV19ERUJVR18zX01BU0sJCTB4MQotI2RlZmluZQlDT01NT05fUFJTX1BGX01TR19JTkZPX0ZXX0RFQlVHXzNfU0hJRlQJCTMKLSNkZWZpbmUJQ09NTU9OX1BSU19QRl9NU0dfSU5GT19SRVNFUlZFRF9NQVNLCQkweEZGRkZGRkYKLSNkZWZpbmUJQ09NTU9OX1BSU19QRl9NU0dfSU5GT19SRVNFUlZFRF9TSElGVAkJNAotfTsKLQogc3RydWN0IGNvbW1vbl9xdWV1ZV96b25lIHsKIAlfX2xlMTYgcmluZ19kcnZfZGF0YV9jb25zdW1lcjsKIAlfX2xlMTYgcmVzZXJ2ZWQ7CkBAIC00NzMsNiArNjQzLDE5IEBACiAJc3RydWN0IHJlZ3BhaXIgbXNnX2FkZHI7CiB9OwogCitzdHJ1Y3QgaXNjc2lfZXFlX2RhdGEgeworCV9fbGUzMiBjaWQ7CisJX19sZTE2IGNvbm5faWQ7CisJdTggZXJyb3JfY29kZTsKKwl1OCBlcnJvcl9wZHVfb3Bjb2RlX3Jlc2VydmVkOworI2RlZmluZSBJU0NTSV9FUUVfREFUQV9FUlJPUl9QRFVfT1BDT0RFX01BU0sJCTB4M0YKKyNkZWZpbmUgSVNDU0lfRVFFX0RBVEFfRVJST1JfUERVX09QQ09ERV9TSElGVAkJMAorI2RlZmluZSBJU0NTSV9FUUVfREFUQV9FUlJPUl9QRFVfT1BDT0RFX1ZBTElEX01BU0sJMHgxCisjZGVmaW5lIElTQ1NJX0VRRV9EQVRBX0VSUk9SX1BEVV9PUENPREVfVkFMSURfU0hJRlQJIDYKKyNkZWZpbmUgSVNDU0lfRVFFX0RBVEFfUkVTRVJWRUQwX01BU0sJCQkweDEKKyNkZWZpbmUgSVNDU0lfRVFFX0RBVEFfUkVTRVJWRUQwX1NISUZUCQkJNworfTsKKwogc3RydWN0IG1hbGljaW91c192Zl9lcWVfZGF0YSB7CiAJdTggdmZfaWQ7CiAJdTggZXJyX2lkOwpAQCAtNDg4LDggKzY3MSwxMCBAQAogdW5pb24gZXZlbnRfcmluZ19kYXRhIHsKIAl1OCBieXRlc1s4XTsKIAlzdHJ1Y3QgdmZfcGZfY2hhbm5lbF9lcWVfZGF0YSB2Zl9wZl9jaGFubmVsOworCXN0cnVjdCBpc2NzaV9lcWVfZGF0YSBpc2NzaV9pbmZvOwogCXN0cnVjdCBtYWxpY2lvdXNfdmZfZXFlX2RhdGEgbWFsaWNpb3VzX3ZmOwogCXN0cnVjdCBpbml0aWFsX2NsZWFudXBfZXFlX2RhdGEgdmZfaW5pdF9jbGVhbnVwOworCXN0cnVjdCByZWdwYWlyIHJvY2VfaGFuZGxlOwogfTsKIAogLyogRXZlbnQgUmluZyBFbnRyeSAqLwpAQCAtNjE2LDYgKzgwMSw1MiBAQAogCU1BWF9EQl9ERVNUCiB9OwogCisvKiBFbnVtIG9mIGRvb3JiZWxsIERQTSB0eXBlcyAqLworZW51bSBkYl9kcG1fdHlwZSB7CisJRFBNX0xFR0FDWSwKKwlEUE1fUk9DRSwKKwlEUE1fTDJfSU5MSU5FLAorCURQTV9MMl9CRCwKKwlNQVhfREJfRFBNX1RZUEUKK307CisKKy8qIFN0cnVjdHVyZSBmb3IgZG9vcmJlbGwgZGF0YSwgaW4gTDIgRFBNIG1vZGUsIGZvciAxc3QgZGIgaW4gYSBEUE0gYnVyc3QgKi8KK3N0cnVjdCBkYl9sMl9kcG1fZGF0YSB7CisJX19sZTE2IGljaWQ7CisJX19sZTE2IGJkX3Byb2Q7CisJX19sZTMyIHBhcmFtczsKKyNkZWZpbmUgREJfTDJfRFBNX0RBVEFfU0laRV9NQVNLCTB4M0YKKyNkZWZpbmUgREJfTDJfRFBNX0RBVEFfU0laRV9TSElGVAkwCisjZGVmaW5lIERCX0wyX0RQTV9EQVRBX0RQTV9UWVBFX01BU0sJMHgzCisjZGVmaW5lIERCX0wyX0RQTV9EQVRBX0RQTV9UWVBFX1NISUZUCTYKKyNkZWZpbmUgREJfTDJfRFBNX0RBVEFfTlVNX0JEU19NQVNLCTB4RkYKKyNkZWZpbmUgREJfTDJfRFBNX0RBVEFfTlVNX0JEU19TSElGVAk4CisjZGVmaW5lIERCX0wyX0RQTV9EQVRBX1BLVF9TSVpFX01BU0sJMHg3RkYKKyNkZWZpbmUgREJfTDJfRFBNX0RBVEFfUEtUX1NJWkVfU0hJRlQJMTYKKyNkZWZpbmUgREJfTDJfRFBNX0RBVEFfUkVTRVJWRUQwX01BU0sJMHgxCisjZGVmaW5lIERCX0wyX0RQTV9EQVRBX1JFU0VSVkVEMF9TSElGVCAyNworI2RlZmluZSBEQl9MMl9EUE1fREFUQV9TR0VfTlVNX01BU0sJMHg3CisjZGVmaW5lIERCX0wyX0RQTV9EQVRBX1NHRV9OVU1fU0hJRlQJMjgKKyNkZWZpbmUgREJfTDJfRFBNX0RBVEFfUkVTRVJWRUQxX01BU0sJMHgxCisjZGVmaW5lIERCX0wyX0RQTV9EQVRBX1JFU0VSVkVEMV9TSElGVCAzMQorfTsKKworLyogU3RydWN0dXJlIGZvciBTR0UgaW4gYSBEUE0gZG9vcmJlbGwgb2YgdHlwZSBEUE1fTDJfQkQgKi8KK3N0cnVjdCBkYl9sMl9kcG1fc2dlIHsKKwlzdHJ1Y3QgcmVncGFpciBhZGRyOworCV9fbGUxNiBuYnl0ZXM7CisJX19sZTE2IGJpdGZpZWxkczsKKyNkZWZpbmUgREJfTDJfRFBNX1NHRV9UUEhfU1RfSU5ERVhfTUFTSwkweDFGRgorI2RlZmluZSBEQl9MMl9EUE1fU0dFX1RQSF9TVF9JTkRFWF9TSElGVCAwCisjZGVmaW5lIERCX0wyX0RQTV9TR0VfUkVTRVJWRUQwX01BU0sJMHgzCisjZGVmaW5lIERCX0wyX0RQTV9TR0VfUkVTRVJWRUQwX1NISUZUCTkKKyNkZWZpbmUgREJfTDJfRFBNX1NHRV9TVF9WQUxJRF9NQVNLCTB4MQorI2RlZmluZSBEQl9MMl9EUE1fU0dFX1NUX1ZBTElEX1NISUZUCTExCisjZGVmaW5lIERCX0wyX0RQTV9TR0VfUkVTRVJWRUQxX01BU0sJMHhGCisjZGVmaW5lIERCX0wyX0RQTV9TR0VfUkVTRVJWRUQxX1NISUZUCTEyCisJX19sZTMyIHJlc2VydmVkMjsKK307CisKIC8qIFN0cnVjdHVyZSBmb3IgZG9vcmJlbGwgYWRkcmVzcywgaW4gbGVnYWN5IG1vZGUgKi8KIHN0cnVjdCBkYl9sZWdhY3lfYWRkciB7CiAJX19sZTMyIGFkZHI7CkBAIC02MjcsNiArODU4LDQ5IEBACiAjZGVmaW5lIERCX0xFR0FDWV9BRERSX0lDSURfU0hJRlQgICAgICA1CiB9OwogCisvKiBTdHJ1Y3R1cmUgZm9yIGRvb3JiZWxsIGFkZHJlc3MsIGluIFBXTSBtb2RlICovCitzdHJ1Y3QgZGJfcHdtX2FkZHIgeworCV9fbGUzMiBhZGRyOworI2RlZmluZSBEQl9QV01fQUREUl9SRVNFUlZFRDBfTUFTSwkweDcKKyNkZWZpbmUgREJfUFdNX0FERFJfUkVTRVJWRUQwX1NISUZUIDAKKyNkZWZpbmUgREJfUFdNX0FERFJfT0ZGU0VUX01BU0sJMHg3RgorI2RlZmluZSBEQl9QV01fQUREUl9PRkZTRVRfU0hJRlQJMworI2RlZmluZSBEQl9QV01fQUREUl9XSURfTUFTSwkweDMKKyNkZWZpbmUgREJfUFdNX0FERFJfV0lEX1NISUZUCTEwCisjZGVmaW5lIERCX1BXTV9BRERSX0RQSV9NQVNLCTB4RkZGRgorI2RlZmluZSBEQl9QV01fQUREUl9EUElfU0hJRlQJMTIKKyNkZWZpbmUgREJfUFdNX0FERFJfUkVTRVJWRUQxX01BU0sJMHhGCisjZGVmaW5lIERCX1BXTV9BRERSX1JFU0VSVkVEMV9TSElGVCAyOAorfTsKKworLyogUGFyYW1ldGVycyB0byBSb0NFIGZpcm13YXJlLCBwYXNzZWQgaW4gRURQTSBkb29yYmVsbCAqLworc3RydWN0IGRiX3JvY2VfZHBtX3BhcmFtcyB7CisJX19sZTMyIHBhcmFtczsKKyNkZWZpbmUgREJfUk9DRV9EUE1fUEFSQU1TX1NJWkVfTUFTSwkJMHgzRgorI2RlZmluZSBEQl9ST0NFX0RQTV9QQVJBTVNfU0laRV9TSElGVAkJMAorI2RlZmluZSBEQl9ST0NFX0RQTV9QQVJBTVNfRFBNX1RZUEVfTUFTSwkweDMKKyNkZWZpbmUgREJfUk9DRV9EUE1fUEFSQU1TX0RQTV9UWVBFX1NISUZUCTYKKyNkZWZpbmUgREJfUk9DRV9EUE1fUEFSQU1TX09QQ09ERV9NQVNLCQkweEZGCisjZGVmaW5lIERCX1JPQ0VfRFBNX1BBUkFNU19PUENPREVfU0hJRlQJCTgKKyNkZWZpbmUgREJfUk9DRV9EUE1fUEFSQU1TX1dRRV9TSVpFX01BU0sJMHg3RkYKKyNkZWZpbmUgREJfUk9DRV9EUE1fUEFSQU1TX1dRRV9TSVpFX1NISUZUCTE2CisjZGVmaW5lIERCX1JPQ0VfRFBNX1BBUkFNU19SRVNFUlZFRDBfTUFTSwkweDEKKyNkZWZpbmUgREJfUk9DRV9EUE1fUEFSQU1TX1JFU0VSVkVEMF9TSElGVAkyNworI2RlZmluZSBEQl9ST0NFX0RQTV9QQVJBTVNfQ09NUExFVElPTl9GTEdfTUFTSwkweDEKKyNkZWZpbmUgREJfUk9DRV9EUE1fUEFSQU1TX0NPTVBMRVRJT05fRkxHX1NISUZUIDI4CisjZGVmaW5lIERCX1JPQ0VfRFBNX1BBUkFNU19TX0ZMR19NQVNLCQkweDEKKyNkZWZpbmUgREJfUk9DRV9EUE1fUEFSQU1TX1NfRkxHX1NISUZUCQkyOQorI2RlZmluZSBEQl9ST0NFX0RQTV9QQVJBTVNfUkVTRVJWRUQxX01BU0sJMHgzCisjZGVmaW5lIERCX1JPQ0VfRFBNX1BBUkFNU19SRVNFUlZFRDFfU0hJRlQJMzAKK307CisKKy8qIFN0cnVjdHVyZSBmb3IgZG9vcmJlbGwgZGF0YSwgaW4gUk9DRSBEUE0gbW9kZSwgZm9yIDFzdCBkYiBpbiBhIERQTSBidXJzdCAqLworc3RydWN0IGRiX3JvY2VfZHBtX2RhdGEgeworCV9fbGUxNiBpY2lkOworCV9fbGUxNiBwcm9kX3ZhbDsKKwlzdHJ1Y3QgZGJfcm9jZV9kcG1fcGFyYW1zIHBhcmFtczsKK307CisKIC8qIElndSBpbnRlcnJ1cHQgY29tbWFuZCAqLwogZW51bSBpZ3VfaW50X2NtZCB7CiAJSUdVX0lOVF9FTkFCTEUJPSAwLApAQCAtNzY0LDYgKzEwMzgsMTkgQEAKIAlzdHJ1Y3QgcHhwX3ByZXRlbmRfY21kCXByZXRlbmQ7CiB9OwogCisvKiBWRiBab25lIEEgUGVybWlzc2lvbiBSZWdpc3Rlci4gKi8KK3N0cnVjdCBweHBfdmZfem9uZV9hX3Blcm1pc3Npb24geworCV9fbGUzMiBjb250cm9sOworI2RlZmluZSBQWFBfVkZfWk9ORV9BX1BFUk1JU1NJT05fVkZJRF9NQVNLCTB4RkYKKyNkZWZpbmUgUFhQX1ZGX1pPTkVfQV9QRVJNSVNTSU9OX1ZGSURfU0hJRlQJMAorI2RlZmluZSBQWFBfVkZfWk9ORV9BX1BFUk1JU1NJT05fVkFMSURfTUFTSwkweDEKKyNkZWZpbmUgUFhQX1ZGX1pPTkVfQV9QRVJNSVNTSU9OX1ZBTElEX1NISUZUCTgKKyNkZWZpbmUgUFhQX1ZGX1pPTkVfQV9QRVJNSVNTSU9OX1JFU0VSVkVEMF9NQVNLCTB4N0YKKyNkZWZpbmUgUFhQX1ZGX1pPTkVfQV9QRVJNSVNTSU9OX1JFU0VSVkVEMF9TSElGVCA5CisjZGVmaW5lIFBYUF9WRl9aT05FX0FfUEVSTUlTU0lPTl9SRVNFUlZFRDFfTUFTSwkweEZGRkYKKyNkZWZpbmUgUFhQX1ZGX1pPTkVfQV9QRVJNSVNTSU9OX1JFU0VSVkVEMV9TSElGVCAxNgorfTsKKwogLyogUlNTIGhhc2ggdHlwZSAqLwogc3RydWN0IHJkaWZfdGFza19jb250ZXh0IHsKIAlfX2xlMzIgaW5pdGlhbF9yZWZfdGFnOwpAQCAtODMxLDYgKzExMTgsNyBAQAogCV9fbGUzMiByZXNlcnZlZDI7CiB9OwogCisvKiBSU1MgaGFzaCB0eXBlICovCiBlbnVtIHJzc19oYXNoX3R5cGUgewogCVJTU19IQVNIX1RZUEVfREVGQVVMVAk9IDAsCiAJUlNTX0hBU0hfVFlQRV9JUFY0CT0gMSwKQEAgLTk0Miw3ICsxMjMwLDcgQEAKIH07CiAKIHN0cnVjdCB0aW1lcnNfY29udGV4dCB7Ci0JX19sZTMyIGxvZ2ljYWxfY2xpZW50MDsKKwlfX2xlMzIgbG9naWNhbF9jbGllbnRfMDsKICNkZWZpbmUgVElNRVJTX0NPTlRFWFRfRVhQSVJBVElPTlRJTUVMQzBfTUFTSyAgICAgMHhGRkZGRkZGCiAjZGVmaW5lIFRJTUVSU19DT05URVhUX0VYUElSQVRJT05USU1FTEMwX1NISUZUICAgIDAKICNkZWZpbmUgVElNRVJTX0NPTlRFWFRfVkFMSURMQzBfTUFTSyAgICAgICAgICAgICAgMHgxCkBAIC05NTEsNyArMTIzOSw3IEBACiAjZGVmaW5lIFRJTUVSU19DT05URVhUX0FDVElWRUxDMF9TSElGVCAgICAgICAgICAgIDI5CiAjZGVmaW5lIFRJTUVSU19DT05URVhUX1JFU0VSVkVEMF9NQVNLICAgICAgICAgICAgIDB4MwogI2RlZmluZSBUSU1FUlNfQ09OVEVYVF9SRVNFUlZFRDBfU0hJRlQgICAgICAgICAgICAzMAotCV9fbGUzMiBsb2dpY2FsX2NsaWVudDE7CisJX19sZTMyIGxvZ2ljYWxfY2xpZW50XzE7CiAjZGVmaW5lIFRJTUVSU19DT05URVhUX0VYUElSQVRJT05USU1FTEMxX01BU0sgICAgIDB4RkZGRkZGRgogI2RlZmluZSBUSU1FUlNfQ09OVEVYVF9FWFBJUkFUSU9OVElNRUxDMV9TSElGVCAgICAwCiAjZGVmaW5lIFRJTUVSU19DT05URVhUX1ZBTElETEMxX01BU0sgICAgICAgICAgICAgIDB4MQpAQCAtOTYwLDcgKzEyNDgsNyBAQAogI2RlZmluZSBUSU1FUlNfQ09OVEVYVF9BQ1RJVkVMQzFfU0hJRlQgICAgICAgICAgICAyOQogI2RlZmluZSBUSU1FUlNfQ09OVEVYVF9SRVNFUlZFRDFfTUFTSyAgICAgICAgICAgICAweDMKICNkZWZpbmUgVElNRVJTX0NPTlRFWFRfUkVTRVJWRUQxX1NISUZUICAgICAgICAgICAgMzAKLQlfX2xlMzIgbG9naWNhbF9jbGllbnQyOworCV9fbGUzMiBsb2dpY2FsX2NsaWVudF8yOwogI2RlZmluZSBUSU1FUlNfQ09OVEVYVF9FWFBJUkFUSU9OVElNRUxDMl9NQVNLICAgICAweEZGRkZGRkYKICNkZWZpbmUgVElNRVJTX0NPTlRFWFRfRVhQSVJBVElPTlRJTUVMQzJfU0hJRlQgICAgMAogI2RlZmluZSBUSU1FUlNfQ09OVEVYVF9WQUxJRExDMl9NQVNLICAgICAgICAgICAgICAweDEKQEAgLTk3OCwzICsxMjY2LDQgQEAKICNkZWZpbmUgVElNRVJTX0NPTlRFWFRfUkVTRVJWRUQzX1NISUZUICAgICAgICAgICAgMjkKIH07CiAjZW5kaWYgLyogX19DT01NT05fSFNJX18gKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xZWQvZXRoX2NvbW1vbi5oIGIvaW5jbHVkZS9saW51eC9xZWQvZXRoX2NvbW1vbi5oCmluZGV4IGI1ZWJjNjkuLjFhYTA3MjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcWVkL2V0aF9jb21tb24uaAorKysgYi9pbmNsdWRlL2xpbnV4L3FlZC9ldGhfY29tbW9uLmgKQEAgLTEzLDkgKzEzLDEyIEBACiAvKiBFVEggRlcgQ09OU1RBTlRTICovCiAvKioqKioqKioqKioqKioqKioqKiovCiAjZGVmaW5lIEVUSF9IU0lfVkVSX01BSk9SICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgRVRIX0hTSV9WRVJfTUlOT1IgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBFVEhfQ0FDSEVfTElORV9TSVpFICAgICAgICAgICAgICAgICA2NAorI2RlZmluZSBFVEhfSFNJX1ZFUl9NSU5PUgkxMAogCisjZGVmaW5lIEVUSF9IU0lfVkVSX05PX1BLVF9MRU5fVFVOTgk1CisKKyNkZWZpbmUgRVRIX0NBQ0hFX0xJTkVfU0laRSAgICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgRVRIX1JYX0NRRV9HQVAJMzIKICNkZWZpbmUgRVRIX01BWF9SQU1ST0RfUEVSX0NPTiAgICAgICAgICAgICAgICAgICAgICAgICAgOAogI2RlZmluZSBFVEhfVFhfQkRfUEFHRV9TSVpFX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICA0MDk2CiAjZGVmaW5lIEVUSF9SWF9CRF9QQUdFX1NJWkVfQllURVMgICAgICAgICAgICAgICAgICAgICAgIDQwOTYKQEAgLTI0LDE1ICsyNywyNSBAQAogCiAjZGVmaW5lIEVUSF9UWF9NSU5fQkRTX1BFUl9OT05fTFNPX1BLVCAgICAgICAgICAgICAgICAgICAgICAgICAgMQogI2RlZmluZSBFVEhfVFhfTUFYX0JEU19QRVJfTk9OX0xTT19QQUNLRVQgICAgICAgICAgICAgICAgICAgICAgIDE4CisjZGVmaW5lIEVUSF9UWF9NQVhfQkRTX1BFUl9MU09fUEFDS0VUCTI1NQogI2RlZmluZSBFVEhfVFhfTUFYX0xTT19IRFJfTkJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAogI2RlZmluZSBFVEhfVFhfTUlOX0JEU19QRVJfTFNPX1BLVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMwogI2RlZmluZSBFVEhfVFhfTUlOX0JEU19QRVJfVFVOTl9JUFY2X1dJVEhfRVhUX1BLVCAgICAgICAzCiAjZGVmaW5lIEVUSF9UWF9NSU5fQkRTX1BFUl9JUFY2X1dJVEhfRVhUX1BLVCAgICAgICAgICAgIDIKICNkZWZpbmUgRVRIX1RYX01JTl9CRFNfUEVSX1BLVF9XX0xPT1BCQUNLX01PREUgICAgICAgICAgMgotI2RlZmluZSBFVEhfVFhfTUFYX05PTl9MU09fUEtUX0xFTiAgICAgICAgICAgICAgICAgICg5NzAwIC0gKDQgKyAxMiArIDgpKQorI2RlZmluZSBFVEhfVFhfTUFYX05PTl9MU09fUEtUX0xFTgkoOTcwMCAtICg0ICsgNCArIDEyICsgOCkpCiAjZGVmaW5lIEVUSF9UWF9NQVhfTFNPX0hEUl9CWVRFUyAgICAgICAgICAgICAgICAgICAgNTEwCisjZGVmaW5lIEVUSF9UWF9MU09fV0lORE9XX0JEU19OVU0JKDE4IC0gMSkKKyNkZWZpbmUgRVRIX1RYX0xTT19XSU5ET1dfTUlOX0xFTgk5NzAwCisjZGVmaW5lIEVUSF9UWF9NQVhfTFNPX1BBWUxPQURfTEVOCTB4RkUwMDAKKyNkZWZpbmUgRVRIX1RYX05VTV9TQU1FX0FTX0xBU1RfRU5UUklFUwkzMjAKKyNkZWZpbmUgRVRIX1RYX0lOQUNUSVZFX1NBTUVfQVNfTEFTVAkweEZGRkYKIAogI2RlZmluZSBFVEhfTlVNX1NUQVRJU1RJQ19DT1VOVEVSUyAgICAgICAgICAgICAgICAgICAgICBNQVhfTlVNX1ZQT1JUUworI2RlZmluZSBFVEhfTlVNX1NUQVRJU1RJQ19DT1VOVEVSU19ET1VCTEVfVkZfWk9ORSBcCisJKEVUSF9OVU1fU1RBVElTVElDX0NPVU5URVJTIC0gTUFYX05VTV9WRlMgLyAyKQorI2RlZmluZSBFVEhfTlVNX1NUQVRJU1RJQ19DT1VOVEVSU19RVUFEX1ZGX1pPTkUgXAorCShFVEhfTlVNX1NUQVRJU1RJQ19DT1VOVEVSUyAtIDMgKiBNQVhfTlVNX1ZGUyAvIDQpCiAKIC8qIE1heGltdW0gbnVtYmVyIG9mIGJ1ZmZlcnMsIHVzZWQgZm9yIFJYIHBhY2tldCBwbGFjZW1lbnQgKi8KICNkZWZpbmUgRVRIX1JYX01BWF9CVUZGX1BFUl9QS1QgICAgICAgICAgICAgNQpAQCAtNTksNiArNzIsOCBAQAogI2RlZmluZSBFVEhfVFBBX0NRRV9DT05UX0xFTl9MSVNUX1NJWkUgICAgNgogI2RlZmluZSBFVEhfVFBBX0NRRV9FTkRfTEVOX0xJU1RfU0laRSAgICAgNAogCisvKiBDb250cm9sIGZyYW1lIGNoZWNrIGNvbnN0YW50cyAqLworI2RlZmluZSBFVEhfQ1RMX0ZSQU1FX0VUSF9UWVBFX05VTQk0CiAKIHN0cnVjdCBldGhfdHhfMXN0X2JkX2ZsYWdzIHsKIAl1OCBiaXRmaWVsZHM7CkBAIC04MiwxMCArOTcsMTAgQEAKIAogLyogVGhlIHBhcnNpbmcgaW5mb3JtYXRpb24gZGF0YSBmbyBydGhlIGZpcnN0IHR4IGJkIG9mIGEgZ2l2ZW4gcGFja2V0LiAqLwogc3RydWN0IGV0aF90eF9kYXRhXzFzdF9iZCB7Ci0JX19sZTE2CQkJCXZsYW47Ci0JdTgJCQkJbmJkczsKLQlzdHJ1Y3QgZXRoX3R4XzFzdF9iZF9mbGFncwliZF9mbGFnczsKLQlfX2xlMTYJCQkJYml0ZmllbGRzOworCV9fbGUxNiB2bGFuOworCXU4IG5iZHM7CisJc3RydWN0IGV0aF90eF8xc3RfYmRfZmxhZ3MgYmRfZmxhZ3M7CisJX19sZTE2IGJpdGZpZWxkczsKICNkZWZpbmUgRVRIX1RYX0RBVEFfMVNUX0JEX1RVTk5fRkxBR19NQVNLICAweDEKICNkZWZpbmUgRVRIX1RYX0RBVEFfMVNUX0JEX1RVTk5fRkxBR19TSElGVCAwCiAjZGVmaW5lIEVUSF9UWF9EQVRBXzFTVF9CRF9SRVNFUlZFRDBfTUFTSyAgICAgICAgICAweDEKQEAgLTk2LDcgKzExMSw3IEBACiAKIC8qIFRoZSBwYXJzaW5nIGluZm9ybWF0aW9uIGRhdGEgZm9yIHRoZSBzZWNvbmQgdHggYmQgb2YgYSBnaXZlbiBwYWNrZXQuICovCiBzdHJ1Y3QgZXRoX3R4X2RhdGFfMm5kX2JkIHsKLQlfX2xlMTYJdHVubl9pcF9zaXplOworCV9fbGUxNiB0dW5uX2lwX3NpemU7CiAJX19sZTE2CWJpdGZpZWxkczE7CiAjZGVmaW5lIEVUSF9UWF9EQVRBXzJORF9CRF9UVU5OX0lOTkVSX0wyX0hEUl9TSVpFX1dfTUFTSyAgMHhGCiAjZGVmaW5lIEVUSF9UWF9EQVRBXzJORF9CRF9UVU5OX0lOTkVSX0wyX0hEUl9TSVpFX1dfU0hJRlQgMApAQCAtMTI1LDkgKzE0MCwxNCBAQAogI2RlZmluZSBFVEhfVFhfREFUQV8yTkRfQkRfUkVTRVJWRUQwX1NISUZUICAgICAgICAgICAgICAgIDEzCiB9OwogCisvKiBGaXJtd2FyZSBkYXRhIGZvciBMMi1FRFBNIHBhY2tldC4gKi8KK3N0cnVjdCBldGhfZWRwbV9md19kYXRhIHsKKwlzdHJ1Y3QgZXRoX3R4X2RhdGFfMXN0X2JkIGRhdGFfMXN0X2JkOworCXN0cnVjdCBldGhfdHhfZGF0YV8ybmRfYmQgZGF0YV8ybmRfYmQ7CisJX19sZTMyIHJlc2VydmVkOworfTsKKwogc3RydWN0IGV0aF9mYXN0X3BhdGhfY3FlX2Z3X2RlYnVnIHsKLQl1OCByZXNlcnZlZDA7Ci0JdTggcmVzZXJ2ZWQxOwogCV9fbGUxNiByZXNlcnZlZDI7CiB9OwogCkBAIC0xNDgsNiArMTY4LDE3IEBACiAjZGVmaW5lCUVUSF9UVU5ORUxfUEFSU0lOR19GTEFHU19JUFY0X09QVElPTlNfU0hJRlQJNwogfTsKIAorLyogUE1EIGZsb3cgY29udHJvbCBiaXRzICovCitzdHJ1Y3QgZXRoX3BtZF9mbG93X2ZsYWdzIHsKKwl1OCBmbGFnczsKKyNkZWZpbmUgRVRIX1BNRF9GTE9XX0ZMQUdTX1ZBTElEX01BU0sJMHgxCisjZGVmaW5lIEVUSF9QTURfRkxPV19GTEFHU19WQUxJRF9TSElGVAkwCisjZGVmaW5lIEVUSF9QTURfRkxPV19GTEFHU19UT0dHTEVfTUFTSwkweDEKKyNkZWZpbmUgRVRIX1BNRF9GTE9XX0ZMQUdTX1RPR0dMRV9TSElGVAkxCisjZGVmaW5lIEVUSF9QTURfRkxPV19GTEFHU19SRVNFUlZFRF9NQVNLIDB4M0YKKyNkZWZpbmUgRVRIX1BNRF9GTE9XX0ZMQUdTX1JFU0VSVkVEX1NISUZUIDIKK307CisKIC8qIFJlZ3VsYXIgRVRIIFJ4IEZQIENRRS4gKi8KIHN0cnVjdCBldGhfZmFzdF9wYXRoX3J4X3JlZ19jcWUgewogCXU4IHR5cGU7CkBAIC0xNjYsNjQgKzE5Nyw2MyBAQAogCXU4IHBsYWNlbWVudF9vZmZzZXQ7CiAJc3RydWN0IGV0aF90dW5uZWxfcGFyc2luZ19mbGFncyB0dW5uZWxfcGFyc19mbGFnczsKIAl1OCBiZF9udW07Ci0JdTggcmVzZXJ2ZWRbN107CisJdTggcmVzZXJ2ZWRbOV07CiAJc3RydWN0IGV0aF9mYXN0X3BhdGhfY3FlX2Z3X2RlYnVnIGZ3X2RlYnVnOwogCXU4IHJlc2VydmVkMVszXTsKLQl1OCBmbGFnczsKLSNkZWZpbmUgRVRIX0ZBU1RfUEFUSF9SWF9SRUdfQ1FFX1ZBTElEX01BU0sgICAgICAgICAgMHgxCi0jZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfUkVHX0NRRV9WQUxJRF9TSElGVCAgICAgICAgIDAKLSNkZWZpbmUgRVRIX0ZBU1RfUEFUSF9SWF9SRUdfQ1FFX1ZBTElEX1RPR0dMRV9NQVNLICAgMHgxCi0jZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfUkVHX0NRRV9WQUxJRF9UT0dHTEVfU0hJRlQgIDEKLSNkZWZpbmUgRVRIX0ZBU1RfUEFUSF9SWF9SRUdfQ1FFX1JFU0VSVkVEMl9NQVNLICAgICAgMHgzRgotI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX1JFR19DUUVfUkVTRVJWRUQyX1NISUZUICAgICAyCisJc3RydWN0IGV0aF9wbWRfZmxvd19mbGFncyBwbWRfZmxhZ3M7CiB9OwogCiAvKiBUUEEtY29udGludWUgRVRIIFJ4IEZQIENRRS4gKi8KIHN0cnVjdCBldGhfZmFzdF9wYXRoX3J4X3RwYV9jb250X2NxZSB7Ci0JdTgJdHlwZTsKLQl1OAl0cGFfYWdnX2luZGV4OwotCV9fbGUxNglsZW5fbGlzdFtFVEhfVFBBX0NRRV9DT05UX0xFTl9MSVNUX1NJWkVdOwotCXU4CXJlc2VydmVkWzVdOwotCXU4CXJlc2VydmVkMTsKLQlfX2xlMTYJcmVzZXJ2ZWQyW0VUSF9UUEFfQ1FFX0NPTlRfTEVOX0xJU1RfU0laRV07CisJdTggdHlwZTsKKwl1OCB0cGFfYWdnX2luZGV4OworCV9fbGUxNiBsZW5fbGlzdFtFVEhfVFBBX0NRRV9DT05UX0xFTl9MSVNUX1NJWkVdOworCXU4IHJlc2VydmVkOworCXU4IHJlc2VydmVkMTsKKwlfX2xlMTYgcmVzZXJ2ZWQyW0VUSF9UUEFfQ1FFX0NPTlRfTEVOX0xJU1RfU0laRV07CisJdTggcmVzZXJ2ZWQzWzNdOworCXN0cnVjdCBldGhfcG1kX2Zsb3dfZmxhZ3MgcG1kX2ZsYWdzOwogfTsKIAogLyogVFBBLWVuZCBFVEggUnggRlAgQ1FFLiAqLwogc3RydWN0IGV0aF9mYXN0X3BhdGhfcnhfdHBhX2VuZF9jcWUgewotCXU4CXR5cGU7Ci0JdTgJdHBhX2FnZ19pbmRleDsKLQlfX2xlMTYJdG90YWxfcGFja2V0X2xlbjsKLQl1OAludW1fb2ZfYmRzOwotCXU4CWVuZF9yZWFzb247Ci0JX19sZTE2CW51bV9vZl9jb2FsZXNjZWRfc2VnczsKLQlfX2xlMzIJdHNfZGVsdGE7Ci0JX19sZTE2CWxlbl9saXN0W0VUSF9UUEFfQ1FFX0VORF9MRU5fTElTVF9TSVpFXTsKLQl1OAlyZXNlcnZlZDFbM107Ci0JdTgJcmVzZXJ2ZWQyOwotCV9fbGUxNglyZXNlcnZlZDNbRVRIX1RQQV9DUUVfRU5EX0xFTl9MSVNUX1NJWkVdOworCXU4IHR5cGU7CisJdTggdHBhX2FnZ19pbmRleDsKKwlfX2xlMTYgdG90YWxfcGFja2V0X2xlbjsKKwl1OCBudW1fb2ZfYmRzOworCXU4IGVuZF9yZWFzb247CisJX19sZTE2IG51bV9vZl9jb2FsZXNjZWRfc2VnczsKKwlfX2xlMzIgdHNfZGVsdGE7CisJX19sZTE2IGxlbl9saXN0W0VUSF9UUEFfQ1FFX0VORF9MRU5fTElTVF9TSVpFXTsKKwlfX2xlMTYgcmVzZXJ2ZWQzW0VUSF9UUEFfQ1FFX0VORF9MRU5fTElTVF9TSVpFXTsKKwlfX2xlMTYgcmVzZXJ2ZWQxOworCXU4IHJlc2VydmVkMjsKKwlzdHJ1Y3QgZXRoX3BtZF9mbG93X2ZsYWdzIHBtZF9mbGFnczsKIH07CiAKIC8qIFRQQS1zdGFydCBFVEggUnggRlAgQ1FFLiAqLwogc3RydWN0IGV0aF9mYXN0X3BhdGhfcnhfdHBhX3N0YXJ0X2NxZSB7Ci0JdTgJdHlwZTsKLQl1OAliaXRmaWVsZHM7CisJdTggdHlwZTsKKwl1OCBiaXRmaWVsZHM7CiAjZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfVFBBX1NUQVJUX0NRRV9SU1NfSEFTSF9UWVBFX01BU0sgIDB4NwogI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX1RQQV9TVEFSVF9DUUVfUlNTX0hBU0hfVFlQRV9TSElGVCAwCiAjZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfVFBBX1NUQVJUX0NRRV9UQ19NQVNLICAgICAgICAgICAgIDB4RgogI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX1RQQV9TVEFSVF9DUUVfVENfU0hJRlQgICAgICAgICAgICAzCiAjZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfVFBBX1NUQVJUX0NRRV9SRVNFUlZFRDBfTUFTSyAgICAgIDB4MQogI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX1RQQV9TVEFSVF9DUUVfUkVTRVJWRUQwX1NISUZUICAgICA3Ci0JX19sZTE2CXNlZ19sZW47CisJX19sZTE2IHNlZ19sZW47CiAJc3RydWN0IHBhcnNpbmdfYW5kX2Vycl9mbGFncyBwYXJzX2ZsYWdzOwotCV9fbGUxNgl2bGFuX3RhZzsKLQlfX2xlMzIJcnNzX2hhc2g7Ci0JX19sZTE2CWxlbl9vbl9maXJzdF9iZDsKLQl1OAlwbGFjZW1lbnRfb2Zmc2V0OworCV9fbGUxNiB2bGFuX3RhZzsKKwlfX2xlMzIgcnNzX2hhc2g7CisJX19sZTE2IGxlbl9vbl9maXJzdF9iZDsKKwl1OCBwbGFjZW1lbnRfb2Zmc2V0OwogCXN0cnVjdCBldGhfdHVubmVsX3BhcnNpbmdfZmxhZ3MgdHVubmVsX3BhcnNfZmxhZ3M7Ci0JdTgJdHBhX2FnZ19pbmRleDsKLQl1OAloZWFkZXJfbGVuOwotCV9fbGUxNglleHRfYmRfbGVuX2xpc3RbRVRIX1RQQV9DUUVfU1RBUlRfTEVOX0xJU1RfU0laRV07CisJdTggdHBhX2FnZ19pbmRleDsKKwl1OCBoZWFkZXJfbGVuOworCV9fbGUxNiBleHRfYmRfbGVuX2xpc3RbRVRIX1RQQV9DUUVfU1RBUlRfTEVOX0xJU1RfU0laRV07CiAJc3RydWN0IGV0aF9mYXN0X3BhdGhfY3FlX2Z3X2RlYnVnIGZ3X2RlYnVnOworCXU4IHJlc2VydmVkOworCXN0cnVjdCBldGhfcG1kX2Zsb3dfZmxhZ3MgcG1kX2ZsYWdzOwogfTsKIAogLyogVGhlIEw0IHBzZXVkbyBjaGVja3N1bSBtb2RlIGZvciBFdGhlcm5ldCAqLwpAQCAtMjQ1LDE1ICsyNzUsNyBAQAogCXU4CXJlc2VydmVkWzI1XTsKIAlfX2xlMTYJZWNobzsKIAl1OAlyZXNlcnZlZDE7Ci0JdTgJZmxhZ3M7Ci0vKiBmb3IgUE1EIG1vZGUgLSB2YWxpZCBpbmRpY2F0aW9uICovCi0jZGVmaW5lIEVUSF9TTE9XX1BBVEhfUlhfQ1FFX1ZBTElEX01BU0sgICAgICAgICAweDEKLSNkZWZpbmUgRVRIX1NMT1dfUEFUSF9SWF9DUUVfVkFMSURfU0hJRlQgICAgICAgIDAKLS8qIGZvciBQTUQgbW9kZSAtIHZhbGlkIHRvZ2dsZSBpbmRpY2F0aW9uICovCi0jZGVmaW5lIEVUSF9TTE9XX1BBVEhfUlhfQ1FFX1ZBTElEX1RPR0dMRV9NQVNLICAweDEKLSNkZWZpbmUgRVRIX1NMT1dfUEFUSF9SWF9DUUVfVkFMSURfVE9HR0xFX1NISUZUIDEKLSNkZWZpbmUgRVRIX1NMT1dfUEFUSF9SWF9DUUVfUkVTRVJWRUQyX01BU0sgICAgIDB4M0YKLSNkZWZpbmUgRVRIX1NMT1dfUEFUSF9SWF9DUUVfUkVTRVJWRUQyX1NISUZUICAgIDIKKwlzdHJ1Y3QgZXRoX3BtZF9mbG93X2ZsYWdzIHBtZF9mbGFnczsKIH07CiAKIC8qIHVuaW9uIGZvciBhbGwgRVRIIFJ4IENRRSB0eXBlcyAqLwpAQCAtMjc2LDYgKzI5OCwxMSBAQAogCU1BWF9FVEhfUlhfQ1FFX1RZUEUKIH07CiAKK3N0cnVjdCBldGhfcnhfcG1kX2NxZSB7CisJdW5pb24gZXRoX3J4X2NxZSBjcWU7CisJdTggcmVzZXJ2ZWRbRVRIX1JYX0NRRV9HQVBdOworfTsKKwogZW51bSBldGhfcnhfdHVubl90eXBlIHsKIAlFVEhfUlhfTk9fVFVOTiwKIAlFVEhfUlhfVFVOTl9HRU5FVkUsCkBAIC0zMTMsOCArMzQwLDggQEAKIAogLyogVGhlIHBhcnNpbmcgaW5mb3JtYXRpb24gZGF0YSBmb3IgdGhlIHRoaXJkIHR4IGJkIG9mIGEgZ2l2ZW4gcGFja2V0LiAqLwogc3RydWN0IGV0aF90eF9kYXRhXzNyZF9iZCB7Ci0JX19sZTE2CWxzb19tc3M7Ci0JX19sZTE2CWJpdGZpZWxkczsKKwlfX2xlMTYgbHNvX21zczsKKwlfX2xlMTYgYml0ZmllbGRzOwogI2RlZmluZSBFVEhfVFhfREFUQV8zUkRfQkRfVENQX0hEUl9MRU5fRFdfTUFTSyAgMHhGCiAjZGVmaW5lIEVUSF9UWF9EQVRBXzNSRF9CRF9UQ1BfSERSX0xFTl9EV19TSElGVCAwCiAjZGVmaW5lIEVUSF9UWF9EQVRBXzNSRF9CRF9IRFJfTkJEX01BU0sgICAgICAgICAweEYKQEAgLTMyMyw4ICszNTAsOCBAQAogI2RlZmluZSBFVEhfVFhfREFUQV8zUkRfQkRfU1RBUlRfQkRfU0hJRlQgICAgICAgOAogI2RlZmluZSBFVEhfVFhfREFUQV8zUkRfQkRfUkVTRVJWRUQwX01BU0sgICAgICAgMHg3RgogI2RlZmluZSBFVEhfVFhfREFUQV8zUkRfQkRfUkVTRVJWRUQwX1NISUZUICAgICAgOQotCXU4CXR1bm5fbDRfaGRyX3N0YXJ0X29mZnNldF93OwotCXU4CXR1bm5faGRyX3NpemVfdzsKKwl1OCB0dW5uX2w0X2hkcl9zdGFydF9vZmZzZXRfdzsKKwl1OCB0dW5uX2hkcl9zaXplX3c7CiB9OwogCiAvKiBUaGUgdGhpcmQgdHggYmQgb2YgYSBnaXZlbiBwYWNrZXQgKi8KQEAgLTM1NSwxMCArMzgyLDEwIEBACiB9OwogCiB1bmlvbiBldGhfdHhfYmRfdHlwZXMgewotCXN0cnVjdCBldGhfdHhfMXN0X2JkCWZpcnN0X2JkOwotCXN0cnVjdCBldGhfdHhfMm5kX2JkCXNlY29uZF9iZDsKLQlzdHJ1Y3QgZXRoX3R4XzNyZF9iZAl0aGlyZF9iZDsKLQlzdHJ1Y3QgZXRoX3R4X2JkCXJlZ19iZDsKKwlzdHJ1Y3QgZXRoX3R4XzFzdF9iZCBmaXJzdF9iZDsKKwlzdHJ1Y3QgZXRoX3R4XzJuZF9iZCBzZWNvbmRfYmQ7CisJc3RydWN0IGV0aF90eF8zcmRfYmQgdGhpcmRfYmQ7CisJc3RydWN0IGV0aF90eF9iZCByZWdfYmQ7CiB9OwogCiAvKiBNc3Rvcm0gUXVldWUgWm9uZSAqLwpAQCAtMzg5LDggKzQxNiw4IEBACiAjZGVmaW5lIEVUSF9EQl9EQVRBX1JFU0VSVkVEX1NISUZUICAgIDUKICNkZWZpbmUgRVRIX0RCX0RBVEFfQUdHX1ZBTF9TRUxfTUFTSyAgMHgzCiAjZGVmaW5lIEVUSF9EQl9EQVRBX0FHR19WQUxfU0VMX1NISUZUIDYKLQl1OAlhZ2dfZmxhZ3M7Ci0JX19sZTE2CWJkX3Byb2Q7CisJdTggYWdnX2ZsYWdzOworCV9fbGUxNiBiZF9wcm9kOwogfTsKIAogI2VuZGlmIC8qIF9fRVRIX0NPTU1PTl9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3FlZC9pc2NzaV9jb21tb24uaCBiL2luY2x1ZGUvbGludXgvcWVkL2lzY3NpX2NvbW1vbi5oCmluZGV4IGIzYzBmZWIuLjhmNjRiMTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcWVkL2lzY3NpX2NvbW1vbi5oCisrKyBiL2luY2x1ZGUvbGludXgvcWVkL2lzY3NpX2NvbW1vbi5oCkBAIC0zMTEsNyArMzExLDcgQEAKICNkZWZpbmUgSVNDU0lfTE9HSU5fUkVRX0hEUl9EQVRBX1NFR19MRU5fU0hJRlQgIDAKICNkZWZpbmUgSVNDU0lfTE9HSU5fUkVRX0hEUl9UT1RBTF9BSFNfTEVOX01BU0sgIDB4RkYKICNkZWZpbmUgSVNDU0lfTE9HSU5fUkVRX0hEUl9UT1RBTF9BSFNfTEVOX1NISUZUIDI0Ci0JX19sZTMyIGlzaWRfVEFCQzsKKwlfX2xlMzIgaXNpZF90YWJjOwogCV9fbGUxNiB0c2loOwogCV9fbGUxNiBpc2lkX2Q7CiAJX19sZTMyIGl0dDsKQEAgLTQ2NCw3ICs0NjQsNyBAQAogI2RlZmluZSBJU0NTSV9MT0dJTl9SRVNQT05TRV9IRFJfREFUQV9TRUdfTEVOX1NISUZUICAwCiAjZGVmaW5lIElTQ1NJX0xPR0lOX1JFU1BPTlNFX0hEUl9UT1RBTF9BSFNfTEVOX01BU0sgIDB4RkYKICNkZWZpbmUgSVNDU0lfTE9HSU5fUkVTUE9OU0VfSERSX1RPVEFMX0FIU19MRU5fU0hJRlQgMjQKLQlfX2xlMzIgaXNpZF9UQUJDOworCV9fbGUzMiBpc2lkX3RhYmM7CiAJX19sZTE2IHRzaWg7CiAJX19sZTE2IGlzaWRfZDsKIAlfX2xlMzIgaXR0OwpAQCAtNjg4LDggKzY4OCw3IEBACiBlbnVtIGlzY3NpX2NxZXNfdHlwZSB7CiAJSVNDU0lfQ1FFX1RZUEVfU09MSUNJVEVEID0gMSwKIAlJU0NTSV9DUUVfVFlQRV9VTlNPTElDSVRFRCwKLQlJU0NTSV9DUUVfVFlQRV9TT0xJQ0lURURfV0lUSF9TRU5TRQotCSAgICwKKwlJU0NTSV9DUUVfVFlQRV9TT0xJQ0lURURfV0lUSF9TRU5TRSwKIAlJU0NTSV9DUUVfVFlQRV9UQVNLX0NMRUFOVVAsCiAJSVNDU0lfQ1FFX1RZUEVfRFVNTVksCiAJTUFYX0lTQ1NJX0NRRVNfVFlQRQpAQCAtNzY5LDkgKzc2OCw5IEBACiAJSVNDU0lfRVZFTlRfVFlQRV9VUERBVEVfQ09OTiwKIAlJU0NTSV9FVkVOVF9UWVBFX0NMRUFSX1NRLAogCUlTQ1NJX0VWRU5UX1RZUEVfVEVSTUlOQVRFX0NPTk4sCisJSVNDU0lfRVZFTlRfVFlQRV9NQUNfVVBEQVRFX0NPTk4sCiAJSVNDU0lfRVZFTlRfVFlQRV9BU1lOX0NPTk5FQ1RfQ09NUExFVEUsCiAJSVNDU0lfRVZFTlRfVFlQRV9BU1lOX1RFUk1JTkFURV9ET05FLAotCVJFU0VSVkVEOCwKIAlSRVNFUlZFRDksCiAJSVNDU0lfRVZFTlRfVFlQRV9TVEFSVF9PRl9FUlJPUl9UWVBFUyA9IDEwLAogCUlTQ1NJX0VWRU5UX1RZUEVfQVNZTl9BQk9SVF9SQ1ZELApAQCAtODY3LDYgKzg2Niw3IEBACiAJSVNDU0lfUkFNUk9EX0NNRF9JRF9VUERBVEVfQ09OTiA9IDQsCiAJSVNDU0lfUkFNUk9EX0NNRF9JRF9URVJNSU5BVElPTl9DT05OID0gNSwKIAlJU0NTSV9SQU1ST0RfQ01EX0lEX0NMRUFSX1NRID0gNiwKKwlJU0NTSV9SQU1ST0RfQ01EX0lEX01BQ19VUERBVEUgPSA3LAogCU1BWF9JU0NTSV9SQU1ST0RfQ01EX0lECiB9OwogCkBAIC04ODMsNiArODgzLDE2IEBACiAJX19sZTE2IHIydF9zbjsKIH07CiAKK3N0cnVjdCBpc2NzaV9zcGVfY29ubl9tYWNfdXBkYXRlIHsKKwlzdHJ1Y3QgaXNjc2lfc2xvd19wYXRoX2hkciBoZHI7CisJX19sZTE2IGNvbm5faWQ7CisJX19sZTMyIGZ3X2NpZDsKKwlfX2xlMTYgcmVtb3RlX21hY19hZGRyX2xvOworCV9fbGUxNiByZW1vdGVfbWFjX2FkZHJfbWlkOworCV9fbGUxNiByZW1vdGVfbWFjX2FkZHJfaGk7CisJdTggcmVzZXJ2ZWQwWzJdOworfTsKKwogc3RydWN0IGlzY3NpX3NwZV9jb25uX29mZmxvYWQgewogCXN0cnVjdCBpc2NzaV9zbG93X3BhdGhfaGRyIGhkcjsKIAlfX2xlMTYgY29ubl9pZDsKQEAgLTEzMDIsMTQgKzEzMTIsNiBAQAogCXN0cnVjdCByZWdwYWlyIGlzY3NpX3J4X2Ryb3BwZWRfcGR1c190YXNrX25vdF92YWxpZDsKIH07CiAKLXN0cnVjdCBvb29fb3BhcXVlIHsKLQlfX2xlMzIgY2lkOwotCXU4IGRyb3BfaXNsZTsKLQl1OCBkcm9wX3NpemU7Ci0JdTggb29vX29wY29kZTsKLQl1OCBvb29faXNsZTsKLX07Ci0KIHN0cnVjdCBwc3Rvcm1faXNjc2lfc3RhdHNfZHJ2IHsKIAlzdHJ1Y3QgcmVncGFpciBpc2NzaV90eF9ieXRlc19jbnQ7CiAJc3RydWN0IHJlZ3BhaXIgaXNjc2lfdHhfcGFja2V0X2NudDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcWVkL3FlZF9jaGFpbi5oIGIvaW5jbHVkZS9saW51eC9xZWQvcWVkX2NoYWluLmgKaW5kZXggN2U0NDFiZC4uNzJkODhjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9xZWQvcWVkX2NoYWluLmgKKysrIGIvaW5jbHVkZS9saW51eC9xZWQvcWVkX2NoYWluLmgKQEAgLTE2LDE5ICsxNiw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3FlZC9jb21tb25faHNpLmg+CiAKLS8qIGRtYV9hZGRyX3QgbWFuaXAgKi8KLSNkZWZpbmUgRE1BX0xPX0xFKHgpICAgICAgICAgICAgY3B1X3RvX2xlMzIobG93ZXJfMzJfYml0cyh4KSkKLSNkZWZpbmUgRE1BX0hJX0xFKHgpICAgICAgICAgICAgY3B1X3RvX2xlMzIodXBwZXJfMzJfYml0cyh4KSkKLSNkZWZpbmUgRE1BX1JFR1BBSVJfTEUoeCwgdmFsKSAgZG8geyBcCi0JCQkJCSh4KS5oaSA9IERNQV9ISV9MRSgodmFsKSk7IFwKLQkJCQkJKHgpLmxvID0gRE1BX0xPX0xFKCh2YWwpKTsgXAotCQkJCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgSElMT19HRU4oaGksIGxvLCB0eXBlKSAgKCgoKHR5cGUpKGhpKSkgPDwgMzIpICsgKGxvKSkKLSNkZWZpbmUgSElMT182NChoaSwgbG8pIEhJTE9fR0VOKChsZTMyX3RvX2NwdShoaSkpLCAobGUzMl90b19jcHUobG8pKSwgdTY0KQotI2RlZmluZSBISUxPXzY0X1JFR1BBSVIocmVncGFpcikgICAgICAgIChISUxPXzY0KHJlZ3BhaXIuaGksIHJlZ3BhaXIubG8pKQotI2RlZmluZSBISUxPX0RNQV9SRUdQQUlSKHJlZ3BhaXIpCSgoZG1hX2FkZHJfdClISUxPXzY0X1JFR1BBSVIocmVncGFpcikpCi0KIGVudW0gcWVkX2NoYWluX21vZGUgewogCS8qIEVhY2ggUGFnZSBjb250YWlucyBhIG5leHQgcG9pbnRlciBhdCBpdHMgZW5kICovCiAJUUVEX0NIQUlOX01PREVfTkVYVF9QVFIsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3FlZC9xZWRfZXRoX2lmLmggYi9pbmNsdWRlL2xpbnV4L3FlZC9xZWRfZXRoX2lmLmgKaW5kZXggNDQ3NWE5ZC4uMzNjMjRlYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9xZWQvcWVkX2V0aF9pZi5oCisrKyBiL2luY2x1ZGUvbGludXgvcWVkL3FlZF9ldGhfaWYuaApAQCAtMjMsNiArMjMsOSBAQAogCiAJdTgJcG9ydF9tYWNbRVRIX0FMRU5dOwogCXU4CW51bV92bGFuX2ZpbHRlcnM7CisKKwkvKiBMZWdhY3kgVkYgLSB0aGlzIGFmZmVjdHMgdGhlIGRhdGFwYXRoLCBzbyBxZWRlIGhhcyB0byBrbm93ICovCisJYm9vbCBpc19sZWdhY3k7CiB9OwogCiBzdHJ1Y3QgcWVkX3VwZGF0ZV92cG9ydF9yc3NfcGFyYW1zIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcWVkL3FlZF9pZi5oIGIvaW5jbHVkZS9saW51eC9xZWQvcWVkX2lmLmgKaW5kZXggYjFlM2M1Ny4uZjlhZTkwMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9xZWQvcWVkX2lmLmgKKysrIGIvaW5jbHVkZS9saW51eC9xZWQvcWVkX2lmLmgKQEAgLTM0LDYgKzM0LDggQEAKIAlEQ0JYX01BWF9QUk9UT0NPTF9UWVBFCiB9OwogCisjZGVmaW5lIFFFRF9ST0NFX1BST1RPQ09MX0lOREVYICgzKQorCiAjaWZkZWYgQ09ORklHX0RDQgogI2RlZmluZSBRRURfTExEUF9DSEFTU0lTX0lEX1NUQVRfTEVOIDQKICNkZWZpbmUgUUVEX0xMRFBfUE9SVF9JRF9TVEFUX0xFTiA0CkBAIC03MCw4ICs3MiwxNiBAQAogCXU4IG1heF90YzsKIH07CiAKK2VudW0gcWVkX2RjYnhfc2ZfaWVlZV90eXBlIHsKKwlRRURfRENCWF9TRl9JRUVFX0VUSFRZUEUsCisJUUVEX0RDQlhfU0ZfSUVFRV9UQ1BfUE9SVCwKKwlRRURfRENCWF9TRl9JRUVFX1VEUF9QT1JULAorCVFFRF9EQ0JYX1NGX0lFRUVfVENQX1VEUF9QT1JUCit9OworCiBzdHJ1Y3QgcWVkX2FwcF9lbnRyeSB7CiAJYm9vbCBldGh0eXBlOworCWVudW0gcWVkX2RjYnhfc2ZfaWVlZV90eXBlIHNmX2llZWU7CiAJYm9vbCBlbmFibGVkOwogCXU4IHByaW87CiAJdTE2IHByb3RvX2lkOwpAQCAtMjUyLDE1ICsyNjIsMTUgQEAKIAkvKiBNRlcgdmVyc2lvbiAqLwogCXUzMgkJbWZ3X3JldjsKIAotCWJvb2wgcmRtYV9zdXBwb3J0ZWQ7Ci0KIAl1MzIJCWZsYXNoX3NpemU7CiAJdTgJCW1mX21vZGU7CiAJYm9vbAkJdHhfc3dpdGNoaW5nOworCWJvb2wJCXJkbWFfc3VwcG9ydGVkOwogfTsKIAogZW51bSBxZWRfc2JfdHlwZSB7CiAJUUVEX1NCX1RZUEVfTDJfUVVFVUUsCisJUUVEX1NCX1RZUEVfQ05RLAogfTsKIAogZW51bSBxZWRfcHJvdG9jb2wgewpAQCAtMjY4LDYgKzI3OCwyMSBAQAogCVFFRF9QUk9UT0NPTF9JU0NTSSwKIH07CiAKK2VudW0gcWVkX2xpbmtfbW9kZV9iaXRzIHsKKwlRRURfTE1fRklCUkVfQklUID0gQklUKDApLAorCVFFRF9MTV9BdXRvbmVnX0JJVCA9IEJJVCgxKSwKKwlRRURfTE1fQXN5bV9QYXVzZV9CSVQgPSBCSVQoMiksCisJUUVEX0xNX1BhdXNlX0JJVCA9IEJJVCgzKSwKKwlRRURfTE1fMTAwMGJhc2VUX0hhbGZfQklUID0gQklUKDQpLAorCVFFRF9MTV8xMDAwYmFzZVRfRnVsbF9CSVQgPSBCSVQoNSksCisJUUVEX0xNXzEwMDAwYmFzZUtSX0Z1bGxfQklUID0gQklUKDYpLAorCVFFRF9MTV8yNTAwMGJhc2VLUl9GdWxsX0JJVCA9IEJJVCg3KSwKKwlRRURfTE1fNDAwMDBiYXNlTFI0X0Z1bGxfQklUID0gQklUKDgpLAorCVFFRF9MTV81MDAwMGJhc2VLUjJfRnVsbF9CSVQgPSBCSVQoOSksCisJUUVEX0xNXzEwMDAwMGJhc2VLUjRfRnVsbF9CSVQgPSBCSVQoMTApLAorCVFFRF9MTV9DT1VOVCA9IDExCit9OworCiBzdHJ1Y3QgcWVkX2xpbmtfcGFyYW1zIHsKIAlib29sCWxpbmtfdXA7CiAKQEAgLTI5NSw5ICszMjAsMTEgQEAKIHN0cnVjdCBxZWRfbGlua19vdXRwdXQgewogCWJvb2wJbGlua191cDsKIAotCXUzMglzdXBwb3J0ZWRfY2FwczsgICAgICAgICAvKiBJbiBTVVBQT1JURUQgZGVmcyAqLwotCXUzMglhZHZlcnRpc2VkX2NhcHM7ICAgICAgICAvKiBJbiBBRFZFUlRJU0VEIGRlZnMgKi8KLQl1MzIJbHBfY2FwczsgICAgICAgICAgICAgICAgLyogSW4gQURWRVJUSVNFRCBkZWZzICovCisJLyogSW4gUUVEX0xNXyogZGVmcyAqLworCXUzMglzdXBwb3J0ZWRfY2FwczsKKwl1MzIJYWR2ZXJ0aXNlZF9jYXBzOworCXUzMglscF9jYXBzOworCiAJdTMyCXNwZWVkOyAgICAgICAgICAgICAgICAgIC8qIEluIE1iL3MgKi8KIAl1OAlkdXBsZXg7ICAgICAgICAgICAgICAgICAvKiBJbiBEVVBMRVggZGVmcyAqLwogCXU4CXBvcnQ7ICAgICAgICAgICAgICAgICAgIC8qIEluIFBPUlQgZGVmcyAqLwpAQCAtNDMwLDYgKzQ1NywxMCBAQAogCXZvaWQJCSgqc2ltZF9oYW5kbGVyX2NsZWFuKShzdHJ1Y3QgcWVkX2RldiAqY2RldiwKIAkJCQkJICAgICAgaW50IGluZGV4KTsKIAorCWludCAoKmRiZ19hbGxfZGF0YSkgKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCB2b2lkICpidWZmZXIpOworCisJaW50ICgqZGJnX2FsbF9kYXRhX3NpemUpIChzdHJ1Y3QgcWVkX2RldiAqY2Rldik7CisKIC8qKgogICogQGJyaWVmIGNhbl9saW5rX2NoYW5nZSAtIGNhbiB0aGUgaW5zdGFuY2UgY2hhbmdlIHRoZSBsaW5rIG9yIG5vdAogICoKQEAgLTU5OCw4ICs2MjksOSBAQAogCVFFRF9NU0dfU1AJPSAweDEwMDAwMCwKIAlRRURfTVNHX1NUT1JBR0UgPSAweDIwMDAwMCwKIAlRRURfTVNHX0NYVAk9IDB4ODAwMDAwLAorCVFFRF9NU0dfTEwyCT0gMHgxMDAwMDAwLAogCVFFRF9NU0dfSUxUCT0gMHgyMDAwMDAwLAotCVFFRF9NU0dfUk9DRQk9IDB4NDAwMDAwMCwKKwlRRURfTVNHX1JETUEJPSAweDQwMDAwMDAsCiAJUUVEX01TR19ERUJVRwk9IDB4ODAwMDAwMCwKIAkvKiB0byBiZSBhZGRlZC4uLnVwIHRvIDB4ODAwMDAwMCAqLwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcWVkL3FlZF9sbDJfaWYuaCBiL2luY2x1ZGUvbGludXgvcWVkL3FlZF9sbDJfaWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDc1YzI2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9xZWQvcWVkX2xsMl9pZi5oCkBAIC0wLDAgKzEsMTM5IEBACisvKiBRTG9naWMgcWVkIE5JQyBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgUUxvZ2ljIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZgorICogdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaWZuZGVmIF9RRURfTEwyX0lGX0gKKyNkZWZpbmUgX1FFRF9MTDJfSUZfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3FlZC9xZWRfaWYuaD4KKworc3RydWN0IHFlZF9sbDJfc3RhdHMgeworCXU2NCBnc2lfaW52YWxpZF9oZHI7CisJdTY0IGdzaV9pbnZhbGlkX3BrdF9sZW5ndGg7CisJdTY0IGdzaV91bnN1cHBvcnRlZF9wa3RfdHlwOworCXU2NCBnc2lfY3JjY2hrc21fZXJyb3I7CisKKwl1NjQgcGFja2V0X3Rvb19iaWdfZGlzY2FyZDsKKwl1NjQgbm9fYnVmZl9kaXNjYXJkOworCisJdTY0IHJjdl91Y2FzdF9ieXRlczsKKwl1NjQgcmN2X21jYXN0X2J5dGVzOworCXU2NCByY3ZfYmNhc3RfYnl0ZXM7CisJdTY0IHJjdl91Y2FzdF9wa3RzOworCXU2NCByY3ZfbWNhc3RfcGt0czsKKwl1NjQgcmN2X2JjYXN0X3BrdHM7CisKKwl1NjQgc2VudF91Y2FzdF9ieXRlczsKKwl1NjQgc2VudF9tY2FzdF9ieXRlczsKKwl1NjQgc2VudF9iY2FzdF9ieXRlczsKKwl1NjQgc2VudF91Y2FzdF9wa3RzOworCXU2NCBzZW50X21jYXN0X3BrdHM7CisJdTY0IHNlbnRfYmNhc3RfcGt0czsKK307CisKKyNkZWZpbmUgUUVEX0xMMl9VTlVTRURfSEFORExFICAgKDB4ZmYpCisKK3N0cnVjdCBxZWRfbGwyX2NiX29wcyB7CisJaW50ICgqcnhfY2IpKHZvaWQgKiwgc3RydWN0IHNrX2J1ZmYgKiwgdTMyLCB1MzIpOworCWludCAoKnR4X2NiKSh2b2lkICosIHN0cnVjdCBza19idWZmICosIGJvb2wpOworfTsKKworc3RydWN0IHFlZF9sbDJfcGFyYW1zIHsKKwl1MTYgbXR1OworCWJvb2wgZHJvcF90dGwwX3BhY2tldHM7CisJYm9vbCByeF92bGFuX3N0cmlwcGluZzsKKwl1OCB0eF90YzsKKwlib29sIGZyYWdzX21hcHBlZDsKKwl1OCBsbDJfbWFjX2FkZHJlc3NbRVRIX0FMRU5dOworfTsKKworc3RydWN0IHFlZF9sbDJfb3BzIHsKKy8qKgorICogQGJyaWVmIHN0YXJ0IC0gaW5pdGlhbGl6ZXMgbGwyCisgKgorICogQHBhcmFtIGNkZXYKKyAqIEBwYXJhbSBwYXJhbXMgLSBwcm90b2NvbCBkcml2ZXIgY29uZmlndXJhdGlvbiBmb3IgdGhlIGxsMi4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIHZhbHVlLgorICovCisJaW50ICgqc3RhcnQpKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCBzdHJ1Y3QgcWVkX2xsMl9wYXJhbXMgKnBhcmFtcyk7CisKKy8qKgorICogQGJyaWVmIHN0b3AgLSBzdG9wcyB0aGUgbGwyCisgKgorICogQHBhcmFtIGNkZXYKKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIHZhbHVlLgorICovCisJaW50ICgqc3RvcCkoc3RydWN0IHFlZF9kZXYgKmNkZXYpOworCisvKioKKyAqIEBicmllZiBzdGFydF94bWl0IC0gdHJhbnNtaXRzIGFuIHNrYiBvdmVyIHRoZSBsbDIgaW50ZXJmYWNlCisgKgorICogQHBhcmFtIGNkZXYKKyAqIEBwYXJhbSBza2IKKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIHZhbHVlLgorICovCisJaW50ICgqc3RhcnRfeG1pdCkoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHN0cnVjdCBza19idWZmICpza2IpOworCisvKioKKyAqIEBicmllZiByZWdpc3Rlcl9jYl9vcHMgLSBwcm90b2NvbCBkcml2ZXIgcmVnaXN0ZXIgdGhlIGNhbGxiYWNrIGZvciBSeC9UeAorICogcGFja2V0cy4gU2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgYHN0YXJ0Jy4KKyAqCisgKiBAcGFyYW0gY2RldgorICogQHBhcmFtIGNvb2tpZSAtIHRvIGJlIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zLgorICogQHBhcmFtIG9wcyAtIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMgdG8gcmVnaXN0ZXIgZm9yIFJ4IC8gVHguCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBlcnJvciB2YWx1ZS4KKyAqLworCXZvaWQgKCpyZWdpc3Rlcl9jYl9vcHMpKHN0cnVjdCBxZWRfZGV2ICpjZGV2LAorCQkJCWNvbnN0IHN0cnVjdCBxZWRfbGwyX2NiX29wcyAqb3BzLAorCQkJCXZvaWQgKmNvb2tpZSk7CisKKy8qKgorICogQGJyaWVmIGdldCBMTDIgcmVsYXRlZCBzdGF0aXN0aWNzCisgKgorICogQHBhcmFtIGNkZXYKKyAqIEBwYXJhbSBzdGF0cyAtIHBvaW50ZXIgdG8gc3RydWN0IHRoYXQgd291bGQgYmUgZmlsbGVkIHdpdGggc3RhdHMKKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgZXJyb3Igb3RoZXJ3aXNlLgorICovCisJaW50ICgqZ2V0X3N0YXRzKShzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgc3RydWN0IHFlZF9sbDJfc3RhdHMgKnN0YXRzKTsKK307CisKKyNpZmRlZiBDT05GSUdfUUVEX0xMMgoraW50IHFlZF9sbDJfYWxsb2NfaWYoc3RydWN0IHFlZF9kZXYgKik7Cit2b2lkIHFlZF9sbDJfZGVhbGxvY19pZihzdHJ1Y3QgcWVkX2RldiAqKTsKKyNlbHNlCitzdGF0aWMgY29uc3Qgc3RydWN0IHFlZF9sbDJfb3BzIHFlZF9sbDJfb3BzX3Bhc3MgPSB7CisJLnN0YXJ0ID0gTlVMTCwKKwkuc3RvcCA9IE5VTEwsCisJLnN0YXJ0X3htaXQgPSBOVUxMLAorCS5yZWdpc3Rlcl9jYl9vcHMgPSBOVUxMLAorCS5nZXRfc3RhdHMgPSBOVUxMLAorfTsKKworc3RhdGljIGlubGluZSBpbnQgcWVkX2xsMl9hbGxvY19pZihzdHJ1Y3QgcWVkX2RldiAqY2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHFlZF9sbDJfZGVhbGxvY19pZihzdHJ1Y3QgcWVkX2RldiAqY2RldikKK3sKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3FlZC9xZWRfcm9jZV9pZi5oIGIvaW5jbHVkZS9saW51eC9xZWQvcWVkX3JvY2VfaWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzA0N2QzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9xZWQvcWVkX3JvY2VfaWYuaApAQCAtMCwwICsxLDYwNCBAQAorLyogUUxvZ2ljIHFlZCBOSUMgRHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiAgUUxvZ2ljIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZCAvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKyNpZm5kZWYgX1FFRF9ST0NFX0lGX0gKKyNkZWZpbmUgX1FFRF9ST0NFX0lGX0gKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3FlZC9xZWRfaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9xZWQvcWVkX2xsMl9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L3FlZC9yZG1hX2NvbW1vbi5oPgorCitlbnVtIHFlZF9yb2NlX2xsMl90eF9kZXN0IHsKKwkvKiBMaWdodCBMMiBUWCBEZXN0aW5hdGlvbiB0byB0aGUgTmV0d29yayAqLworCVFFRF9ST0NFX0xMMl9UWF9ERVNUX05XLAorCisJLyogTGlnaHQgTDIgVFggRGVzdGluYXRpb24gdG8gdGhlIExvb3BiYWNrICovCisJUUVEX1JPQ0VfTEwyX1RYX0RFU1RfTEIsCisJUUVEX1JPQ0VfTEwyX1RYX0RFU1RfTUFYCit9OworCisjZGVmaW5lIFFFRF9SRE1BX01BWF9DTlFfU0laRSAgICAgICAgICAgICAgICgweEZGRkYpCisKKy8qIHJkbWEgaW50ZXJmYWNlICovCisKK2VudW0gcWVkX3JvY2VfcXBfc3RhdGUgeworCVFFRF9ST0NFX1FQX1NUQVRFX1JFU0VULAorCVFFRF9ST0NFX1FQX1NUQVRFX0lOSVQsCisJUUVEX1JPQ0VfUVBfU1RBVEVfUlRSLAorCVFFRF9ST0NFX1FQX1NUQVRFX1JUUywKKwlRRURfUk9DRV9RUF9TVEFURV9TUUQsCisJUUVEX1JPQ0VfUVBfU1RBVEVfRVJSLAorCVFFRF9ST0NFX1FQX1NUQVRFX1NRRQorfTsKKworZW51bSBxZWRfcmRtYV90aWRfdHlwZSB7CisJUUVEX1JETUFfVElEX1JFR0lTVEVSRURfTVIsCisJUUVEX1JETUFfVElEX0ZNUiwKKwlRRURfUkRNQV9USURfTVdfVFlQRTEsCisJUUVEX1JETUFfVElEX01XX1RZUEUyQQorfTsKKworc3RydWN0IHFlZF9yZG1hX2V2ZW50cyB7CisJdm9pZCAqY29udGV4dDsKKwl2b2lkICgqYWZmaWxpYXRlZF9ldmVudCkodm9pZCAqY29udGV4dCwgdTggZndfZXZlbnRfY29kZSwKKwkJCQkgdm9pZCAqZndfaGFuZGxlKTsKKwl2b2lkICgqdW5hZmZpbGlhdGVkX2V2ZW50KSh2b2lkICpjb250ZXh0LCB1OCBldmVudF9jb2RlKTsKK307CisKK3N0cnVjdCBxZWRfcmRtYV9kZXZpY2UgeworCXUzMiB2ZW5kb3JfaWQ7CisJdTMyIHZlbmRvcl9wYXJ0X2lkOworCXUzMiBod192ZXI7CisJdTY0IGZ3X3ZlcjsKKworCXU2NCBub2RlX2d1aWQ7CisJdTY0IHN5c19pbWFnZV9ndWlkOworCisJdTggbWF4X2NucTsKKwl1OCBtYXhfc2dlOworCXU4IG1heF9zcnFfc2dlOworCXUxNiBtYXhfaW5saW5lOworCXUzMiBtYXhfd3FlOworCXUzMiBtYXhfc3JxX3dxZTsKKwl1OCBtYXhfcXBfcmVzcF9yZF9hdG9taWNfcmVzYzsKKwl1OCBtYXhfcXBfcmVxX3JkX2F0b21pY19yZXNjOworCXU2NCBtYXhfZGV2X3Jlc3BfcmRfYXRvbWljX3Jlc2M7CisJdTMyIG1heF9jcTsKKwl1MzIgbWF4X3FwOworCXUzMiBtYXhfc3JxOworCXUzMiBtYXhfbXI7CisJdTY0IG1heF9tcl9zaXplOworCXUzMiBtYXhfY3FlOworCXUzMiBtYXhfbXc7CisJdTMyIG1heF9mbXI7CisJdTMyIG1heF9tcl9td19mbXJfcGJsOworCXU2NCBtYXhfbXJfbXdfZm1yX3NpemU7CisJdTMyIG1heF9wZDsKKwl1MzIgbWF4X2FoOworCXU4IG1heF9wa2V5OworCXUxNiBtYXhfc3JxX3dyOworCXU4IG1heF9zdGF0c19xdWV1ZXM7CisJdTMyIGRldl9jYXBzOworCisJLyogQWJpbHR5IHRvIHN1cHBvcnQgUk5SLU5BSyBnZW5lcmF0aW9uICovCisKKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9STlJfTkFLX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9STlJfTkFLX1NISUZUICAgICAgICAgICAgICAgICAgMAorCS8qIEFiaWx0eSB0byBzdXBwb3J0IHNodXRkb3duIHBvcnQgKi8KKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9TSFVURE9XTl9QT1JUX01BU0sgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9TSFVURE9XTl9QT1JUX1NISUZUICAgICAgICAgICAgICAgICAgICAxCisJLyogQWJpbHR5IHRvIHN1cHBvcnQgcG9ydCBhY3RpdmUgZXZlbnQgKi8KKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9QT1JUX0FDVElWRV9FVkVOVF9NQVNLICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfUE9SVF9BQ1RJVkVfRVZFTlRfU0hJRlQgICAgICAgICAgICAgICAgMgorCS8qIEFiaWx0eSB0byBzdXBwb3J0IHBvcnQgY2hhbmdlIGV2ZW50ICovCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfUE9SVF9DSEFOR0VfRVZFTlRfTUFTSyAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX1BPUlRfQ0hBTkdFX0VWRU5UX1NISUZUICAgICAgICAgICAgICAgIDMKKwkvKiBBYmlsdHkgdG8gc3VwcG9ydCBzeXN0ZW0gaW1hZ2UgR1VJRCAqLworI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX1NZU19JTUFHRV9NQVNLICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9TWVNfSU1BR0VfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA0CisJLyogQWJpbHR5IHRvIHN1cHBvcnQgYmFkIFBfS2V5IGNvdW50ZXIgc3VwcG9ydCAqLworI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX0JBRF9QS0VZX0NOVF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX0JBRF9QS0VZX0NOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDUKKwkvKiBBYmlsdHkgdG8gc3VwcG9ydCBhdG9taWMgb3BlcmF0aW9ucyAqLworI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX0FUT01JQ19PUF9NQVNLICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9BVE9NSUNfT1BfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfUkVTSVpFX0NRX01BU0sgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX1JFU0laRV9DUV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDcKKwkvKiBBYmlsdHkgdG8gc3VwcG9ydCBtb2RpZnlpbmcgdGhlIG1heGltdW0gbnVtYmVyIG9mCisJICogb3V0c3RhbmRpbmcgd29yayByZXF1ZXN0cyBwZXIgUVAKKwkgKi8KKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9SRVNJWkVfTUFYX1dSX01BU0sgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9SRVNJWkVfTUFYX1dSX1NISUZUICAgICAgICAgICAgICAgICAgICA4CisJLyogQWJpbHR5IHRvIHN1cHBvcnQgYXV0b21hdGljIHBhdGggbWlncmF0aW9uICovCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfQVVUT19QQVRIX01JR19NQVNLICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfQVVUT19QQVRIX01JR19TSElGVCAgICAgICAgICAgICAgICAgICAgOQorCS8qIEFiaWx0eSB0byBzdXBwb3J0IHRoZSBiYXNlIG1lbW9yeSBtYW5hZ2VtZW50IGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9CQVNFX01FTU9SWV9FWFRfTUFTSyAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9CQVNFX01FTU9SWV9FWFRfU0hJRlQgICAgICAgICAgMTAKKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9CQVNFX1FVRVVFX0VYVF9NQVNLICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9CQVNFX1FVRVVFX0VYVF9TSElGVCAgICAgICAgICAgICAgICAgICAxMQorCS8qIEFiaWx0eSB0byBzdXBwb3J0IG11bHRpcGlsZSBwYWdlIHNpemVzIHBlciBtZW1vcnkgcmVnaW9uICovCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfTVVMVElfUEFHRV9QRVJfTVJfRVhUX01BU0sgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfTVVMVElfUEFHRV9QRVJfTVJfRVhUX1NISUZUICAgICAgICAgICAgMTIKKwkvKiBBYmlsdHkgdG8gc3VwcG9ydCBibG9jayBsaXN0IHBoeXNpY2FsIGJ1ZmZlciBsaXN0ICovCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfQkxPQ0tfTU9ERV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfQkxPQ0tfTU9ERV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTMKKwkvKiBBYmlsdHkgdG8gc3VwcG9ydCB6ZXJvIGJhc2VkIHZpcnR1YWwgYWRkcmVzc2VzICovCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfWkJWQV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfWkJWQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKKwkvKiBBYmlsdHkgdG8gc3VwcG9ydCBsb2NhbCBpbnZhbGlkYXRlIGZlbmNpbmcgKi8KKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9MT0NBTF9JTlZfRkVOQ0VfTUFTSyAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9MT0NBTF9JTlZfRkVOQ0VfU0hJRlQgICAgICAgICAgMTUKKwkvKiBBYmlsdHkgdG8gc3VwcG9ydCBMb29wYmFjayBvbiBRUCAqLworI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX0xCX0lORElDQVRPUl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX0xCX0lORElDQVRPUl9TSElGVCAgICAgICAgICAgICAgICAgICAgIDE2CisJdTY0IHBhZ2Vfc2l6ZV9jYXBzOworCXU4IGRldl9hY2tfZGVsYXk7CisJdTMyIHJlc2VydmVkX2xrZXk7CisJdTMyIGJhZF9wa2V5X2NvdW50ZXI7CisJc3RydWN0IHFlZF9yZG1hX2V2ZW50cyBldmVudHM7Cit9OworCitlbnVtIHFlZF9wb3J0X3N0YXRlIHsKKwlRRURfUkRNQV9QT1JUX1VQLAorCVFFRF9SRE1BX1BPUlRfRE9XTiwKK307CisKK2VudW0gcWVkX3JvY2VfY2FwYWJpbGl0eSB7CisJUUVEX1JPQ0VfVjEgPSAxIDw8IDAsCisJUUVEX1JPQ0VfVjIgPSAxIDw8IDEsCit9OworCitzdHJ1Y3QgcWVkX3JkbWFfcG9ydCB7CisJZW51bSBxZWRfcG9ydF9zdGF0ZSBwb3J0X3N0YXRlOworCWludCBsaW5rX3NwZWVkOworCXU2NCBtYXhfbXNnX3NpemU7CisJdTggc291cmNlX2dpZF90YWJsZV9sZW47CisJdm9pZCAqc291cmNlX2dpZF90YWJsZV9wdHI7CisJdTggcGtleV90YWJsZV9sZW47CisJdm9pZCAqcGtleV90YWJsZV9wdHI7CisJdTMyIHBrZXlfYmFkX2NvdW50ZXI7CisJZW51bSBxZWRfcm9jZV9jYXBhYmlsaXR5IGNhcGFiaWxpdHk7Cit9OworCitzdHJ1Y3QgcWVkX3JkbWFfY25xX3BhcmFtcyB7CisJdTggbnVtX3BibF9wYWdlczsKKwl1NjQgcGJsX3B0cjsKK307CisKKy8qIFRoZSBDUSBNb2RlIGFmZmVjdHMgdGhlIENRIGRvb3JiZWxsIHRyYW5zYWN0aW9uIHNpemUuCisgKiA2NC8zMiBiaXQgbWFjaGluZXMgc2hvdWxkIGNvbmZpZ3VyZSB0byAzMi8xNiBiaXRzIHJlc3BlY3RpdmVseS4KKyAqLworZW51bSBxZWRfcmRtYV9jcV9tb2RlIHsKKwlRRURfUkRNQV9DUV9NT0RFXzE2X0JJVFMsCisJUUVEX1JETUFfQ1FfTU9ERV8zMl9CSVRTLAorfTsKKworc3RydWN0IHFlZF9yb2NlX2RjcWNuX3BhcmFtcyB7CisJdTggbm90aWZpY2F0aW9uX3BvaW50OworCXU4IHJlYWN0aW9uX3BvaW50OworCisJLyogZmllbGRzIGZvciBub3RpZmljYXRpb24gcG9pbnQgKi8KKwl1MzIgY25wX3NlbmRfdGltZW91dDsKKworCS8qIGZpZWxkcyBmb3IgcmVhY3Rpb24gcG9pbnQgKi8KKwl1MzIgcmxfYmNfcmF0ZTsKKwl1MTYgcmxfbWF4X3JhdGU7CisJdTE2IHJsX3JfYWk7CisJdTE2IHJsX3JfaGFpOworCXUxNiBkY3Fjbl9nOworCXUzMiBkY3Fjbl9rX3VzOworCXUzMiBkY3Fjbl90aW1lb3V0X3VzOworfTsKKworc3RydWN0IHFlZF9yZG1hX3N0YXJ0X2luX3BhcmFtcyB7CisJc3RydWN0IHFlZF9yZG1hX2V2ZW50cyAqZXZlbnRzOworCXN0cnVjdCBxZWRfcmRtYV9jbnFfcGFyYW1zIGNucV9wYmxfbGlzdFsxMjhdOworCXU4IGRlc2lyZWRfY25xOworCWVudW0gcWVkX3JkbWFfY3FfbW9kZSBjcV9tb2RlOworCXN0cnVjdCBxZWRfcm9jZV9kY3Fjbl9wYXJhbXMgZGNxY25fcGFyYW1zOworCXUxNiBtYXhfbXR1OworCXU4IG1hY19hZGRyW0VUSF9BTEVOXTsKKwl1OCBpd2FycF9mbGFnczsKK307CisKK3N0cnVjdCBxZWRfcmRtYV9hZGRfdXNlcl9vdXRfcGFyYW1zIHsKKwl1MTYgZHBpOworCXU2NCBkcGlfYWRkcjsKKwl1NjQgZHBpX3BoeXNfYWRkcjsKKwl1MzIgZHBpX3NpemU7Cit9OworCitlbnVtIHJvY2VfbW9kZSB7CisJUk9DRV9WMSwKKwlST0NFX1YyX0lQVjQsCisJUk9DRV9WMl9JUFY2LAorCU1BWF9ST0NFX01PREUKK307CisKK3VuaW9uIHFlZF9naWQgeworCXU4IGJ5dGVzWzE2XTsKKwl1MTYgd29yZHNbOF07CisJdTMyIGR3b3Jkc1s0XTsKKwl1NjQgcXdvcmRzWzJdOworCXUzMiBpcHY0X2FkZHI7Cit9OworCitzdHJ1Y3QgcWVkX3JkbWFfcmVnaXN0ZXJfdGlkX2luX3BhcmFtcyB7CisJdTMyIGl0aWQ7CisJZW51bSBxZWRfcmRtYV90aWRfdHlwZSB0aWRfdHlwZTsKKwl1OCBrZXk7CisJdTE2IHBkOworCWJvb2wgbG9jYWxfcmVhZDsKKwlib29sIGxvY2FsX3dyaXRlOworCWJvb2wgcmVtb3RlX3JlYWQ7CisJYm9vbCByZW1vdGVfd3JpdGU7CisJYm9vbCByZW1vdGVfYXRvbWljOworCWJvb2wgbXdfYmluZDsKKwl1NjQgcGJsX3B0cjsKKwlib29sIHBibF90d29fbGV2ZWw7CisJdTggcGJsX3BhZ2Vfc2l6ZV9sb2c7CisJdTggcGFnZV9zaXplX2xvZzsKKwl1MzIgZmJvOworCXU2NCBsZW5ndGg7CisJdTY0IHZhZGRyOworCWJvb2wgemJ2YTsKKwlib29sIHBoeV9tcjsKKwlib29sIGRtYV9tcjsKKworCWJvb2wgZGlmX2VuYWJsZWQ7CisJdTY0IGRpZl9lcnJvcl9hZGRyOworCXU2NCBkaWZfcnVudF9hZGRyOworfTsKKworc3RydWN0IHFlZF9yZG1hX2NyZWF0ZV9jcV9pbl9wYXJhbXMgeworCXUzMiBjcV9oYW5kbGVfbG87CisJdTMyIGNxX2hhbmRsZV9oaTsKKwl1MzIgY3Ffc2l6ZTsKKwl1MTYgZHBpOworCWJvb2wgcGJsX3R3b19sZXZlbDsKKwl1NjQgcGJsX3B0cjsKKwl1MTYgcGJsX251bV9wYWdlczsKKwl1OCBwYmxfcGFnZV9zaXplX2xvZzsKKwl1OCBjbnFfaWQ7CisJdTE2IGludF90aW1lb3V0OworfTsKKworc3RydWN0IHFlZF9yZG1hX2NyZWF0ZV9zcnFfaW5fcGFyYW1zIHsKKwl1NjQgcGJsX2Jhc2VfYWRkcjsKKwl1NjQgcHJvZF9wYWlyX2FkZHI7CisJdTE2IG51bV9wYWdlczsKKwl1MTYgcGRfaWQ7CisJdTE2IHBhZ2Vfc2l6ZTsKK307CisKK3N0cnVjdCBxZWRfcmRtYV9kZXN0cm95X2NxX2luX3BhcmFtcyB7CisJdTE2IGljaWQ7Cit9OworCitzdHJ1Y3QgcWVkX3JkbWFfZGVzdHJveV9jcV9vdXRfcGFyYW1zIHsKKwl1MTYgbnVtX2NxX25vdGlmOworfTsKKworc3RydWN0IHFlZF9yZG1hX2NyZWF0ZV9xcF9pbl9wYXJhbXMgeworCXUzMiBxcF9oYW5kbGVfbG87CisJdTMyIHFwX2hhbmRsZV9oaTsKKwl1MzIgcXBfaGFuZGxlX2FzeW5jX2xvOworCXUzMiBxcF9oYW5kbGVfYXN5bmNfaGk7CisJYm9vbCB1c2Vfc3JxOworCWJvb2wgc2lnbmFsX2FsbDsKKwlib29sIGZtcl9hbmRfcmVzZXJ2ZWRfbGtleTsKKwl1MTYgcGQ7CisJdTE2IGRwaTsKKwl1MTYgc3FfY3FfaWQ7CisJdTE2IHNxX251bV9wYWdlczsKKwl1NjQgc3FfcGJsX3B0cjsKKwl1OCBtYXhfc3Ffc2dlczsKKwl1MTYgcnFfY3FfaWQ7CisJdTE2IHJxX251bV9wYWdlczsKKwl1NjQgcnFfcGJsX3B0cjsKKwl1MTYgc3JxX2lkOworCXU4IHN0YXRzX3F1ZXVlOworfTsKKworc3RydWN0IHFlZF9yZG1hX2NyZWF0ZV9xcF9vdXRfcGFyYW1zIHsKKwl1MzIgcXBfaWQ7CisJdTE2IGljaWQ7CisJdm9pZCAqcnFfcGJsX3ZpcnQ7CisJZG1hX2FkZHJfdCBycV9wYmxfcGh5czsKKwl2b2lkICpzcV9wYmxfdmlydDsKKwlkbWFfYWRkcl90IHNxX3BibF9waHlzOworfTsKKworc3RydWN0IHFlZF9yZG1hX21vZGlmeV9xcF9pbl9wYXJhbXMgeworCXUzMiBtb2RpZnlfZmxhZ3M7CisjZGVmaW5lIFFFRF9SRE1BX01PRElGWV9RUF9WQUxJRF9ORVdfU1RBVEVfTUFTSyAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUkRNQV9NT0RJRllfUVBfVkFMSURfTkVXX1NUQVRFX1NISUZUICAgICAgICAgICAgICAwCisjZGVmaW5lIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9QS0VZX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfUEtFWV9TSElGVCAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFFFRF9SRE1BX01PRElGWV9RUF9WQUxJRF9SRE1BX09QU19FTl9NQVNLICAgICAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUkRNQV9NT0RJRllfUVBfVkFMSURfUkRNQV9PUFNfRU5fU0hJRlQgICAgICAgICAgICAyCisjZGVmaW5lIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9ERVNUX1FQX01BU0sgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfREVTVF9RUF9TSElGVCAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9BRERSRVNTX1ZFQ1RPUl9NQVNLICAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfQUREUkVTU19WRUNUT1JfU0hJRlQgICAgICAgICA0CisjZGVmaW5lIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9SUV9QU05fTUFTSyAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfUlFfUFNOX1NISUZUICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9TUV9QU05fTUFTSyAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfU1FfUFNOX1NISUZUICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFFFRF9SRE1BX01PRElGWV9RUF9WQUxJRF9NQVhfUkRfQVRPTUlDX1JFUV9NQVNLICAgICAgIDB4MQorI2RlZmluZSBRRURfUkRNQV9NT0RJRllfUVBfVkFMSURfTUFYX1JEX0FUT01JQ19SRVFfU0hJRlQgICAgICA3CisjZGVmaW5lIFFFRF9SRE1BX01PRElGWV9RUF9WQUxJRF9NQVhfUkRfQVRPTUlDX1JFU1BfTUFTSyAgICAgIDB4MQorI2RlZmluZSBRRURfUkRNQV9NT0RJRllfUVBfVkFMSURfTUFYX1JEX0FUT01JQ19SRVNQX1NISUZUICAgICA4CisjZGVmaW5lIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9BQ0tfVElNRU9VVF9NQVNLICAgICAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfQUNLX1RJTUVPVVRfU0hJRlQgICAgICAgICAgICA5CisjZGVmaW5lIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9SRVRSWV9DTlRfTUFTSyAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfUkVUUllfQ05UX1NISUZUICAgICAgICAgICAgICAxMAorI2RlZmluZSBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfUk5SX1JFVFJZX0NOVF9NQVNLICAgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX1JOUl9SRVRSWV9DTlRfU0hJRlQgICAgICAgICAgMTEKKyNkZWZpbmUgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX01JTl9STlJfTkFLX1RJTUVSX01BU0sgICAgICAgMHgxCisjZGVmaW5lIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9NSU5fUk5SX05BS19USU1FUl9TSElGVCAgICAgIDEyCisjZGVmaW5lIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9FMkVfRkxPV19DT05UUk9MX0VOX01BU0sgICAgIDB4MQorI2RlZmluZSBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfRTJFX0ZMT1dfQ09OVFJPTF9FTl9TSElGVCAgICAxMworI2RlZmluZSBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfUk9DRV9NT0RFX01BU0sgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX1JPQ0VfTU9ERV9TSElGVCAgICAgICAgICAgICAgMTQKKworCWVudW0gcWVkX3JvY2VfcXBfc3RhdGUgbmV3X3N0YXRlOworCXUxNiBwa2V5OworCWJvb2wgaW5jb21pbmdfcmRtYV9yZWFkX2VuOworCWJvb2wgaW5jb21pbmdfcmRtYV93cml0ZV9lbjsKKwlib29sIGluY29taW5nX2F0b21pY19lbjsKKwlib29sIGUyZV9mbG93X2NvbnRyb2xfZW47CisJdTMyIGRlc3RfcXA7CisJYm9vbCBsYl9pbmRpY2F0aW9uOworCXUxNiBtdHU7CisJdTggdHJhZmZpY19jbGFzc190b3M7CisJdTggaG9wX2xpbWl0X3R0bDsKKwl1MzIgZmxvd19sYWJlbDsKKwl1bmlvbiBxZWRfZ2lkIHNnaWQ7CisJdW5pb24gcWVkX2dpZCBkZ2lkOworCXUxNiB1ZHBfc3JjX3BvcnQ7CisKKwl1MTYgdmxhbl9pZDsKKworCXUzMiBycV9wc247CisJdTMyIHNxX3BzbjsKKwl1OCBtYXhfcmRfYXRvbWljX3Jlc3A7CisJdTggbWF4X3JkX2F0b21pY19yZXE7CisJdTMyIGFja190aW1lb3V0OworCXU4IHJldHJ5X2NudDsKKwl1OCBybnJfcmV0cnlfY250OworCXU4IG1pbl9ybnJfbmFrX3RpbWVyOworCWJvb2wgc3FkX2FzeW5jOworCXU4IHJlbW90ZV9tYWNfYWRkcls2XTsKKwl1OCBsb2NhbF9tYWNfYWRkcls2XTsKKwlib29sIHVzZV9sb2NhbF9tYWM7CisJZW51bSByb2NlX21vZGUgcm9jZV9tb2RlOworfTsKKworc3RydWN0IHFlZF9yZG1hX3F1ZXJ5X3FwX291dF9wYXJhbXMgeworCWVudW0gcWVkX3JvY2VfcXBfc3RhdGUgc3RhdGU7CisJdTMyIHJxX3BzbjsKKwl1MzIgc3FfcHNuOworCWJvb2wgZHJhaW5pbmc7CisJdTE2IG10dTsKKwl1MzIgZGVzdF9xcDsKKwlib29sIGluY29taW5nX3JkbWFfcmVhZF9lbjsKKwlib29sIGluY29taW5nX3JkbWFfd3JpdGVfZW47CisJYm9vbCBpbmNvbWluZ19hdG9taWNfZW47CisJYm9vbCBlMmVfZmxvd19jb250cm9sX2VuOworCXVuaW9uIHFlZF9naWQgc2dpZDsKKwl1bmlvbiBxZWRfZ2lkIGRnaWQ7CisJdTMyIGZsb3dfbGFiZWw7CisJdTggaG9wX2xpbWl0X3R0bDsKKwl1OCB0cmFmZmljX2NsYXNzX3RvczsKKwl1MzIgdGltZW91dDsKKwl1OCBybnJfcmV0cnk7CisJdTggcmV0cnlfY250OworCXU4IG1pbl9ybnJfbmFrX3RpbWVyOworCXUxNiBwa2V5X2luZGV4OworCXU4IG1heF9yZF9hdG9taWM7CisJdTggbWF4X2Rlc3RfcmRfYXRvbWljOworCWJvb2wgc3FkX2FzeW5jOworfTsKKworc3RydWN0IHFlZF9yZG1hX2NyZWF0ZV9zcnFfb3V0X3BhcmFtcyB7CisJdTE2IHNycV9pZDsKK307CisKK3N0cnVjdCBxZWRfcmRtYV9kZXN0cm95X3NycV9pbl9wYXJhbXMgeworCXUxNiBzcnFfaWQ7Cit9OworCitzdHJ1Y3QgcWVkX3JkbWFfbW9kaWZ5X3NycV9pbl9wYXJhbXMgeworCXUzMiB3cWVfbGltaXQ7CisJdTE2IHNycV9pZDsKK307CisKK3N0cnVjdCBxZWRfcmRtYV9zdGF0c19vdXRfcGFyYW1zIHsKKwl1NjQgc2VudF9ieXRlczsKKwl1NjQgc2VudF9wa3RzOworCXU2NCByY3ZfYnl0ZXM7CisJdTY0IHJjdl9wa3RzOworfTsKKworc3RydWN0IHFlZF9yZG1hX2NvdW50ZXJzX291dF9wYXJhbXMgeworCXU2NCBwZF9jb3VudDsKKwl1NjQgbWF4X3BkOworCXU2NCBkcGlfY291bnQ7CisJdTY0IG1heF9kcGk7CisJdTY0IGNxX2NvdW50OworCXU2NCBtYXhfY3E7CisJdTY0IHFwX2NvdW50OworCXU2NCBtYXhfcXA7CisJdTY0IHRpZF9jb3VudDsKKwl1NjQgbWF4X3RpZDsKK307CisKKyNkZWZpbmUgUUVEX1JPQ0VfVFhfSEVBRF9GQUlMVVJFICAgICAgICAoMSkKKyNkZWZpbmUgUUVEX1JPQ0VfVFhfRlJBR19GQUlMVVJFICAgICAgICAoMikKKworc3RydWN0IHFlZF9yb2NlX2xsMl9oZWFkZXIgeworCXZvaWQgKnZhZGRyOworCWRtYV9hZGRyX3QgYmFkZHI7CisJc2l6ZV90IGxlbjsKK307CisKK3N0cnVjdCBxZWRfcm9jZV9sbDJfYnVmZmVyIHsKKwlkbWFfYWRkcl90IGJhZGRyOworCXNpemVfdCBsZW47Cit9OworCitzdHJ1Y3QgcWVkX3JvY2VfbGwyX3BhY2tldCB7CisJc3RydWN0IHFlZF9yb2NlX2xsMl9oZWFkZXIgaGVhZGVyOworCWludCBuX3NlZzsKKwlzdHJ1Y3QgcWVkX3JvY2VfbGwyX2J1ZmZlciBwYXlsb2FkW1JETUFfTUFYX1NHRV9QRVJfU1FfV1FFXTsKKwlpbnQgcm9jZV9tb2RlOworCWVudW0gcWVkX3JvY2VfbGwyX3R4X2Rlc3QgdHhfZGVzdDsKK307CisKK3N0cnVjdCBxZWRfcm9jZV9sbDJfdHhfcGFyYW1zIHsKKwlpbnQgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgcWVkX3JvY2VfbGwyX3J4X3BhcmFtcyB7CisJdTE2IHZsYW5faWQ7CisJdTggc21hY1tFVEhfQUxFTl07CisJaW50IHJjOworfTsKKworc3RydWN0IHFlZF9yb2NlX2xsMl9jYnMgeworCXZvaWQgKCp0eF9jYikodm9pZCAqcGRldiwgc3RydWN0IHFlZF9yb2NlX2xsMl9wYWNrZXQgKnBrdCk7CisKKwl2b2lkICgqcnhfY2IpKHZvaWQgKnBkZXYsIHN0cnVjdCBxZWRfcm9jZV9sbDJfcGFja2V0ICpwa3QsCisJCSAgICAgIHN0cnVjdCBxZWRfcm9jZV9sbDJfcnhfcGFyYW1zICpwYXJhbXMpOworfTsKKworc3RydWN0IHFlZF9yb2NlX2xsMl9wYXJhbXMgeworCXUxNiBtYXhfcnhfYnVmZmVyczsKKwl1MTYgbWF4X3R4X2J1ZmZlcnM7CisJdTE2IG10dTsKKwl1OCBtYWNfYWRkcmVzc1tFVEhfQUxFTl07CisJc3RydWN0IHFlZF9yb2NlX2xsMl9jYnMgY2JzOworCXZvaWQgKmNiX2Nvb2tpZTsKK307CisKK3N0cnVjdCBxZWRfcm9jZV9sbDJfaW5mbyB7CisJdTggaGFuZGxlOworCXN0cnVjdCBxZWRfcm9jZV9sbDJfY2JzIGNiczsKKwl1OCBtYWNfYWRkcmVzc1tFVEhfQUxFTl07CisJdm9pZCAqY2JfY29va2llOworCisJLyogTG9jayB0byBwcm90ZWN0IGxsMiAqLworCXN0cnVjdCBtdXRleCBsb2NrOworfTsKKworZW51bSBxZWRfcmRtYV90eXBlIHsKKwlRRURfUkRNQV9UWVBFX1JPQ0UsCit9OworCitzdHJ1Y3QgcWVkX2Rldl9yZG1hX2luZm8geworCXN0cnVjdCBxZWRfZGV2X2luZm8gY29tbW9uOworCWVudW0gcWVkX3JkbWFfdHlwZSByZG1hX3R5cGU7Cit9OworCitzdHJ1Y3QgcWVkX3JkbWFfb3BzIHsKKwljb25zdCBzdHJ1Y3QgcWVkX2NvbW1vbl9vcHMgKmNvbW1vbjsKKworCWludCAoKmZpbGxfZGV2X2luZm8pKHN0cnVjdCBxZWRfZGV2ICpjZGV2LAorCQkJICAgICBzdHJ1Y3QgcWVkX2Rldl9yZG1hX2luZm8gKmluZm8pOworCXZvaWQgKigqcmRtYV9nZXRfcmRtYV9jdHgpKHN0cnVjdCBxZWRfZGV2ICpjZGV2KTsKKworCWludCAoKnJkbWFfaW5pdCkoc3RydWN0IHFlZF9kZXYgKmRldiwKKwkJCSBzdHJ1Y3QgcWVkX3JkbWFfc3RhcnRfaW5fcGFyYW1zICppcGFyYW1zKTsKKworCWludCAoKnJkbWFfYWRkX3VzZXIpKHZvaWQgKnJkbWFfY3h0LAorCQkJICAgICBzdHJ1Y3QgcWVkX3JkbWFfYWRkX3VzZXJfb3V0X3BhcmFtcyAqb3BhcmFtcyk7CisKKwl2b2lkICgqcmRtYV9yZW1vdmVfdXNlcikodm9pZCAqcmRtYV9jeHQsIHUxNiBkcGkpOworCWludCAoKnJkbWFfc3RvcCkodm9pZCAqcmRtYV9jeHQpOworCXN0cnVjdCBxZWRfcmRtYV9kZXZpY2UqICgqcmRtYV9xdWVyeV9kZXZpY2UpKHZvaWQgKnJkbWFfY3h0KTsKKwlzdHJ1Y3QgcWVkX3JkbWFfcG9ydCogKCpyZG1hX3F1ZXJ5X3BvcnQpKHZvaWQgKnJkbWFfY3h0KTsKKwlpbnQgKCpyZG1hX2dldF9zdGFydF9zYikoc3RydWN0IHFlZF9kZXYgKmNkZXYpOworCWludCAoKnJkbWFfZ2V0X21pbl9jbnFfbXNpeCkoc3RydWN0IHFlZF9kZXYgKmNkZXYpOworCXZvaWQgKCpyZG1hX2NucV9wcm9kX3VwZGF0ZSkodm9pZCAqcmRtYV9jeHQsIHU4IGNucV9pbmRleCwgdTE2IHByb2QpOworCWludCAoKnJkbWFfZ2V0X3JkbWFfaW50KShzdHJ1Y3QgcWVkX2RldiAqY2RldiwKKwkJCQkgc3RydWN0IHFlZF9pbnRfaW5mbyAqaW5mbyk7CisJaW50ICgqcmRtYV9zZXRfcmRtYV9pbnQpKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCB1MTYgY250KTsKKwlpbnQgKCpyZG1hX2FsbG9jX3BkKSh2b2lkICpyZG1hX2N4dCwgdTE2ICpwZCk7CisJdm9pZCAoKnJkbWFfZGVhbGxvY19wZCkodm9pZCAqcmRtYV9jeHQsIHUxNiBwZCk7CisJaW50ICgqcmRtYV9jcmVhdGVfY3EpKHZvaWQgKnJkbWFfY3h0LAorCQkJICAgICAgc3RydWN0IHFlZF9yZG1hX2NyZWF0ZV9jcV9pbl9wYXJhbXMgKnBhcmFtcywKKwkJCSAgICAgIHUxNiAqaWNpZCk7CisJaW50ICgqcmRtYV9kZXN0cm95X2NxKSh2b2lkICpyZG1hX2N4dCwKKwkJCSAgICAgICBzdHJ1Y3QgcWVkX3JkbWFfZGVzdHJveV9jcV9pbl9wYXJhbXMgKmlwYXJhbXMsCisJCQkgICAgICAgc3RydWN0IHFlZF9yZG1hX2Rlc3Ryb3lfY3Ffb3V0X3BhcmFtcyAqb3BhcmFtcyk7CisJc3RydWN0IHFlZF9yZG1hX3FwICoKKwkoKnJkbWFfY3JlYXRlX3FwKSh2b2lkICpyZG1hX2N4dCwKKwkJCSAgc3RydWN0IHFlZF9yZG1hX2NyZWF0ZV9xcF9pbl9wYXJhbXMgKmlwYXJhbXMsCisJCQkgIHN0cnVjdCBxZWRfcmRtYV9jcmVhdGVfcXBfb3V0X3BhcmFtcyAqb3BhcmFtcyk7CisKKwlpbnQgKCpyZG1hX21vZGlmeV9xcCkodm9pZCAqcm9jZV9jeHQsIHN0cnVjdCBxZWRfcmRtYV9xcCAqcXAsCisJCQkgICAgICBzdHJ1Y3QgcWVkX3JkbWFfbW9kaWZ5X3FwX2luX3BhcmFtcyAqaXBhcmFtcyk7CisKKwlpbnQgKCpyZG1hX3F1ZXJ5X3FwKSh2b2lkICpyZG1hX2N4dCwgc3RydWN0IHFlZF9yZG1hX3FwICpxcCwKKwkJCSAgICAgc3RydWN0IHFlZF9yZG1hX3F1ZXJ5X3FwX291dF9wYXJhbXMgKm9wYXJhbXMpOworCWludCAoKnJkbWFfZGVzdHJveV9xcCkodm9pZCAqcmRtYV9jeHQsIHN0cnVjdCBxZWRfcmRtYV9xcCAqcXApOworCWludAorCSgqcmRtYV9yZWdpc3Rlcl90aWQpKHZvaWQgKnJkbWFfY3h0LAorCQkJICAgICBzdHJ1Y3QgcWVkX3JkbWFfcmVnaXN0ZXJfdGlkX2luX3BhcmFtcyAqaXBhcmFtcyk7CisJaW50ICgqcmRtYV9kZXJlZ2lzdGVyX3RpZCkodm9pZCAqcmRtYV9jeHQsIHUzMiBpdGlkKTsKKwlpbnQgKCpyZG1hX2FsbG9jX3RpZCkodm9pZCAqcmRtYV9jeHQsIHUzMiAqaXRpZCk7CisJdm9pZCAoKnJkbWFfZnJlZV90aWQpKHZvaWQgKnJkbWFfY3h0LCB1MzIgaXRpZCk7CisJaW50ICgqcm9jZV9sbDJfc3RhcnQpKHN0cnVjdCBxZWRfZGV2ICpjZGV2LAorCQkJICAgICAgc3RydWN0IHFlZF9yb2NlX2xsMl9wYXJhbXMgKnBhcmFtcyk7CisJaW50ICgqcm9jZV9sbDJfc3RvcCkoc3RydWN0IHFlZF9kZXYgKmNkZXYpOworCWludCAoKnJvY2VfbGwyX3R4KShzdHJ1Y3QgcWVkX2RldiAqY2RldiwKKwkJCSAgIHN0cnVjdCBxZWRfcm9jZV9sbDJfcGFja2V0ICpwYWNrZXQsCisJCQkgICBzdHJ1Y3QgcWVkX3JvY2VfbGwyX3R4X3BhcmFtcyAqcGFyYW1zKTsKKwlpbnQgKCpyb2NlX2xsMl9wb3N0X3J4X2J1ZmZlcikoc3RydWN0IHFlZF9kZXYgKmNkZXYsCisJCQkJICAgICAgIHN0cnVjdCBxZWRfcm9jZV9sbDJfYnVmZmVyICpidWYsCisJCQkJICAgICAgIHU2NCBjb29raWUsIHU4IG5vdGlmeV9mdyk7CisJaW50ICgqcm9jZV9sbDJfc2V0X21hY19maWx0ZXIpKHN0cnVjdCBxZWRfZGV2ICpjZGV2LAorCQkJCSAgICAgICB1OCAqb2xkX21hY19hZGRyZXNzLAorCQkJCSAgICAgICB1OCAqbmV3X21hY19hZGRyZXNzKTsKKwlpbnQgKCpyb2NlX2xsMl9zdGF0cykoc3RydWN0IHFlZF9kZXYgKmNkZXYsCisJCQkgICAgICBzdHJ1Y3QgcWVkX2xsMl9zdGF0cyAqc3RhdHMpOworfTsKKworY29uc3Qgc3RydWN0IHFlZF9yZG1hX29wcyAqcWVkX2dldF9yZG1hX29wcyh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3FlZC9xZWRlX3JvY2UuaCBiL2luY2x1ZGUvbGludXgvcWVkL3FlZGVfcm9jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZmJlNmQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3FlZC9xZWRlX3JvY2UuaApAQCAtMCwwICsxLDg4IEBACisvKiBRTG9naWMgcWVkciBOSUMgRHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiAgUUxvZ2ljIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZCAvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKyNpZm5kZWYgUUVERV9ST0NFX0gKKyNkZWZpbmUgUUVERV9ST0NFX0gKKworc3RydWN0IHFlZHJfZGV2Oworc3RydWN0IHFlZF9kZXY7CitzdHJ1Y3QgcWVkZV9kZXY7CisKK2VudW0gcWVkZV9yb2NlX2V2ZW50IHsKKwlRRURFX1VQLAorCVFFREVfRE9XTiwKKwlRRURFX0NIQU5HRV9BRERSLAorCVFFREVfQ0xPU0UKK307CisKK3N0cnVjdCBxZWRlX3JvY2VfZXZlbnRfd29yayB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXZvaWQgKnB0cjsKKwllbnVtIHFlZGVfcm9jZV9ldmVudCBldmVudDsKK307CisKK3N0cnVjdCBxZWRyX2RyaXZlciB7CisJdW5zaWduZWQgY2hhciBuYW1lWzMyXTsKKworCXN0cnVjdCBxZWRyX2RldiogKCphZGQpKHN0cnVjdCBxZWRfZGV2ICosIHN0cnVjdCBwY2lfZGV2ICosCisJCQkJc3RydWN0IG5ldF9kZXZpY2UgKik7CisKKwl2b2lkICgqcmVtb3ZlKShzdHJ1Y3QgcWVkcl9kZXYgKik7CisJdm9pZCAoKm5vdGlmeSkoc3RydWN0IHFlZHJfZGV2ICosIGVudW0gcWVkZV9yb2NlX2V2ZW50KTsKK307CisKKy8qIEFQSXMgZm9yIFJvQ0UgZHJpdmVyIHRvIHJlZ2lzdGVyIGNhbGxiYWNrIGhhbmRsZXJzLAorICogd2hpY2ggd2lsbCBiZSBpbnZva2VkIHdoZW4gZGV2aWNlIGlzIGFkZGVkLCByZW1vdmVkLCBpZnVwLCBpZmRvd24KKyAqLworaW50IHFlZGVfcm9jZV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHFlZHJfZHJpdmVyICpkcnYpOwordm9pZCBxZWRlX3JvY2VfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHFlZHJfZHJpdmVyICpkcnYpOworCitib29sIHFlZGVfcm9jZV9zdXBwb3J0ZWQoc3RydWN0IHFlZGVfZGV2ICpkZXYpOworCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSU5GSU5JQkFORF9RRURSKQoraW50IHFlZGVfcm9jZV9kZXZfYWRkKHN0cnVjdCBxZWRlX2RldiAqZGV2KTsKK3ZvaWQgcWVkZV9yb2NlX2Rldl9ldmVudF9vcGVuKHN0cnVjdCBxZWRlX2RldiAqZGV2KTsKK3ZvaWQgcWVkZV9yb2NlX2Rldl9ldmVudF9jbG9zZShzdHJ1Y3QgcWVkZV9kZXYgKmRldik7Cit2b2lkIHFlZGVfcm9jZV9kZXZfcmVtb3ZlKHN0cnVjdCBxZWRlX2RldiAqZGV2KTsKK3ZvaWQgcWVkZV9yb2NlX2V2ZW50X2NoYW5nZWFkZHIoc3RydWN0IHFlZGVfZGV2ICpxZWRyKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBxZWRlX3JvY2VfZGV2X2FkZChzdHJ1Y3QgcWVkZV9kZXYgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHFlZGVfcm9jZV9kZXZfZXZlbnRfb3BlbihzdHJ1Y3QgcWVkZV9kZXYgKmRldikge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBxZWRlX3JvY2VfZGV2X2V2ZW50X2Nsb3NlKHN0cnVjdCBxZWRlX2RldiAqZGV2KSB7fQorc3RhdGljIGlubGluZSB2b2lkIHFlZGVfcm9jZV9kZXZfcmVtb3ZlKHN0cnVjdCBxZWRlX2RldiAqZGV2KSB7fQorc3RhdGljIGlubGluZSB2b2lkIHFlZGVfcm9jZV9ldmVudF9jaGFuZ2VhZGRyKHN0cnVjdCBxZWRlX2RldiAqcWVkcikge30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3FlZC9yZG1hX2NvbW1vbi5oIGIvaW5jbHVkZS9saW51eC9xZWQvcmRtYV9jb21tb24uaAppbmRleCAxODc5OTFjLi43NjYzNzI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3FlZC9yZG1hX2NvbW1vbi5oCisrKyBiL2luY2x1ZGUvbGludXgvcWVkL3JkbWFfY29tbW9uLmgKQEAgLTI4LDYgKzI4LDcgQEAKICNkZWZpbmUgUkRNQV9NQVhfUERTICAgICAgICAgICAgICAgICAgICAgICAgICAgICg2NCAqIDEwMjQpCiAKICNkZWZpbmUgUkRNQV9OVU1fU1RBVElTVElDX0NPVU5URVJTICAgICAgICAgICAgICAgICAgICAgTUFYX05VTV9WUE9SVFMKKyNkZWZpbmUgUkRNQV9OVU1fU1RBVElTVElDX0NPVU5URVJTX0JCCQkJTUFYX05VTV9WUE9SVFNfQkIKIAogI2RlZmluZSBSRE1BX1RBU0tfVFlQRSAoUFJPVE9DT0xJRF9ST0NFKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3FlZC90Y3BfY29tbW9uLmggYi9pbmNsdWRlL2xpbnV4L3FlZC90Y3BfY29tbW9uLmgKaW5kZXggYWNjYmEwZS4uZGMzODg5ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9xZWQvdGNwX2NvbW1vbi5oCisrKyBiL2luY2x1ZGUvbGludXgvcWVkL3RjcF9jb21tb24uaApAQCAtMTEsNiArMTEsMTQgQEAKIAogI2RlZmluZSBUQ1BfSU5WQUxJRF9USU1FT1VUX1ZBTCAtMQogCitzdHJ1Y3Qgb29vX29wYXF1ZSB7CisJX19sZTMyIGNpZDsKKwl1OCBkcm9wX2lzbGU7CisJdTggZHJvcF9zaXplOworCXU4IG9vb19vcGNvZGU7CisJdTggb29vX2lzbGU7Cit9OworCiBlbnVtIHRjcF9jb25uZWN0X21vZGUgewogCVRDUF9DT05ORUNUX0FDVElWRSwKIAlUQ1BfQ09OTkVDVF9QQVNTSVZFLApAQCAtMTgsMTQgKzI2LDEwIEBACiB9OwogCiBzdHJ1Y3QgdGNwX2luaXRfcGFyYW1zIHsKLQlfX2xlMzIgbWF4X2N3bmQ7Ci0JX19sZTE2IGR1cF9hY2tfdGhyZXNob2xkOworCV9fbGUzMiB0d29fbXNsX3RpbWVyOwogCV9fbGUxNiB0eF9zd3NfdGltZXI7Ci0JX19sZTE2IG1pbl9ydG87Ci0JX19sZTE2IG1pbl9ydG9fcnQ7Ci0JX19sZTE2IG1heF9ydG87CiAJdTggbWF4ZmlucnQ7Ci0JdTggcmVzZXJ2ZWRbMV07CisJdTggcmVzZXJ2ZWRbOV07CiB9OwogCiBlbnVtIHRjcF9pcF92ZXJzaW9uIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oIGIvaW5jbHVkZS9saW51eC9yYWRpeC10cmVlLmgKaW5kZXggNGM0NTEwNS4uNTJiOTdkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYWRpeC10cmVlLmgKKysrIGIvaW5jbHVkZS9saW51eC9yYWRpeC10cmVlLmgKQEAgLTI4MCw5ICsyODAsOSBAQAogCQkJICAgICAgc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZSk7CiB2b2lkICpyYWRpeF90cmVlX2RlbGV0ZV9pdGVtKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKiwgdW5zaWduZWQgbG9uZywgdm9pZCAqKTsKIHZvaWQgKnJhZGl4X3RyZWVfZGVsZXRlKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKiwgdW5zaWduZWQgbG9uZyk7Ci1zdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpyYWRpeF90cmVlX3JlcGxhY2VfY2xlYXJfdGFncygKLQkJCQlzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LAotCQkJCXVuc2lnbmVkIGxvbmcgaW5kZXgsIHZvaWQgKmVudHJ5KTsKK3ZvaWQgcmFkaXhfdHJlZV9jbGVhcl90YWdzKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsCisJCQkgICBzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlLAorCQkJICAgdm9pZCAqKnNsb3QpOwogdW5zaWduZWQgaW50IHJhZGl4X3RyZWVfZ2FuZ19sb29rdXAoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwKIAkJCXZvaWQgKipyZXN1bHRzLCB1bnNpZ25lZCBsb25nIGZpcnN0X2luZGV4LAogCQkJdW5zaWduZWQgaW50IG1heF9pdGVtcyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhaWQvcHEuaCBiL2luY2x1ZGUvbGludXgvcmFpZC9wcS5oCmluZGV4IGEwMTE4ZDUuLjM5NWE0YzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFpZC9wcS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFpZC9wcS5oCkBAIC0xMDMsNiArMTAzLDcgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgcmFpZDZfY2FsbHMgcmFpZDZfYXZ4MngyOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCByYWlkNl9jYWxscyByYWlkNl9hdngyeDQ7CiBleHRlcm4gY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X3RpbGVneDg7CitleHRlcm4gY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X3MzOTB2eDg7CiAKIHN0cnVjdCByYWlkNl9yZWNvdl9jYWxscyB7CiAJdm9pZCAoKmRhdGEyKShpbnQsIHNpemVfdCwgaW50LCBpbnQsIHZvaWQgKiopOwpAQCAtMTE1LDYgKzExNiw3IEBACiBleHRlcm4gY29uc3Qgc3RydWN0IHJhaWQ2X3JlY292X2NhbGxzIHJhaWQ2X3JlY292X2ludHgxOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCByYWlkNl9yZWNvdl9jYWxscyByYWlkNl9yZWNvdl9zc3NlMzsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgcmFpZDZfcmVjb3ZfY2FsbHMgcmFpZDZfcmVjb3ZfYXZ4MjsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcmFpZDZfcmVjb3ZfY2FsbHMgcmFpZDZfcmVjb3ZfczM5MHhjOwogCiBleHRlcm4gY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X25lb254MTsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgcmFpZDZfY2FsbHMgcmFpZDZfbmVvbngyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yY3Vfc3luYy5oIGIvaW5jbHVkZS9saW51eC9yY3Vfc3luYy5oCmluZGV4IGE2M2EzM2UuLmVjZTdlZDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmN1X3N5bmMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JjdV9zeW5jLmgKQEAgLTU5LDYgKzU5LDcgQEAKIH0KIAogZXh0ZXJuIHZvaWQgcmN1X3N5bmNfaW5pdChzdHJ1Y3QgcmN1X3N5bmMgKiwgZW51bSByY3Vfc3luY190eXBlKTsKK2V4dGVybiB2b2lkIHJjdV9zeW5jX2VudGVyX3N0YXJ0KHN0cnVjdCByY3Vfc3luYyAqKTsKIGV4dGVybiB2b2lkIHJjdV9zeW5jX2VudGVyKHN0cnVjdCByY3Vfc3luYyAqKTsKIGV4dGVybiB2b2lkIHJjdV9zeW5jX2V4aXQoc3RydWN0IHJjdV9zeW5jICopOwogZXh0ZXJuIHZvaWQgcmN1X3N5bmNfZHRvcihzdHJ1Y3QgcmN1X3N5bmMgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmggYi9pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgKaW5kZXggMWFhNjJlMS4uMzIxZjllZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaApAQCAtMzM0LDYgKzMzNCw3IEBACiB2b2lkIHJjdV9iaF9xcyh2b2lkKTsKIHZvaWQgcmN1X2NoZWNrX2NhbGxiYWNrcyhpbnQgdXNlcik7CiB2b2lkIHJjdV9yZXBvcnRfZGVhZCh1bnNpZ25lZCBpbnQgY3B1KTsKK3ZvaWQgcmN1X2NwdV9zdGFydGluZyh1bnNpZ25lZCBpbnQgY3B1KTsKIAogI2lmbmRlZiBDT05GSUdfVElOWV9SQ1UKIHZvaWQgcmN1X2VuZF9pbmtlcm5lbF9ib290KHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWdtYXAuaCBiL2luY2x1ZGUvbGludXgvcmVnbWFwLmgKaW5kZXggMmMxMmNjNS4uOWFkYzdiMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZWdtYXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlZ21hcC5oCkBAIC0yNDEsOSArMjQxLDkgQEAKICAqICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNhY2hlIHN1cHBvcnQpLgogICogQG51bV9yZWdfZGVmYXVsdHM6IE51bWJlciBvZiBlbGVtZW50cyBpbiByZWdfZGVmYXVsdHMuCiAgKgotICogQHJlYWRfZmxhZ19tYXNrOiBNYXNrIHRvIGJlIHNldCBpbiB0aGUgdG9wIGJ5dGUgb2YgdGhlIHJlZ2lzdGVyIHdoZW4gZG9pbmcKKyAqIEByZWFkX2ZsYWdfbWFzazogTWFzayB0byBiZSBzZXQgaW4gdGhlIHRvcCBieXRlcyBvZiB0aGUgcmVnaXN0ZXIgd2hlbiBkb2luZwogICogICAgICAgICAgICAgICAgICBhIHJlYWQuCi0gKiBAd3JpdGVfZmxhZ19tYXNrOiBNYXNrIHRvIGJlIHNldCBpbiB0aGUgdG9wIGJ5dGUgb2YgdGhlIHJlZ2lzdGVyIHdoZW4gZG9pbmcKKyAqIEB3cml0ZV9mbGFnX21hc2s6IE1hc2sgdG8gYmUgc2V0IGluIHRoZSB0b3AgYnl0ZXMgb2YgdGhlIHJlZ2lzdGVyIHdoZW4gZG9pbmcKICAqICAgICAgICAgICAgICAgICAgIGEgd3JpdGUuIElmIGJvdGggcmVhZF9mbGFnX21hc2sgYW5kIHdyaXRlX2ZsYWdfbWFzayBhcmUKICAqICAgICAgICAgICAgICAgICAgIGVtcHR5IHRoZSByZWdtYXBfYnVzIGRlZmF1bHQgbWFza3MgYXJlIHVzZWQuCiAgKiBAdXNlX3NpbmdsZV9ydzogSWYgc2V0LCBjb252ZXJ0cyB0aGUgYnVsayByZWFkIGFuZCB3cml0ZSBvcGVyYXRpb25zIGludG8KQEAgLTI5OSw4ICsyOTksOCBAQAogCWNvbnN0IHZvaWQgKnJlZ19kZWZhdWx0c19yYXc7CiAJdW5zaWduZWQgaW50IG51bV9yZWdfZGVmYXVsdHNfcmF3OwogCi0JdTggcmVhZF9mbGFnX21hc2s7Ci0JdTggd3JpdGVfZmxhZ19tYXNrOworCXVuc2lnbmVkIGxvbmcgcmVhZF9mbGFnX21hc2s7CisJdW5zaWduZWQgbG9uZyB3cml0ZV9mbGFnX21hc2s7CiAKIAlib29sIHVzZV9zaW5nbGVfcnc7CiAJYm9vbCBjYW5fbXVsdGlfd3JpdGU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaAppbmRleCBjYWU1MDBiLi42OTIxMDgyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmgKQEAgLTE0MCw4ICsxNDAsNiBAQAogICoKICAqIEBzdXBwbHk6ICAgVGhlIG5hbWUgb2YgdGhlIHN1cHBseS4gIEluaXRpYWxpc2VkIGJ5IHRoZSB1c2VyIGJlZm9yZQogICogICAgICAgICAgICB1c2luZyB0aGUgYnVsayByZWd1bGF0b3IgQVBJcy4KLSAqIEBvcHRpb25hbDogVGhlIHN1cHBseSBzaG91bGQgYmUgY29uc2lkZXJlZCBvcHRpb25hbC4gSW5pdGlhbGlzZWQgYnkgdGhlIHVzZXIKLSAqICAgICAgICAgICAgYmVmb3JlIHVzaW5nIHRoZSBidWxrIHJlZ3VsYXRvciBBUElzLgogICogQGNvbnN1bWVyOiBUaGUgcmVndWxhdG9yIGNvbnN1bWVyIGZvciB0aGUgc3VwcGx5LiAgVGhpcyB3aWxsIGJlIG1hbmFnZWQKICAqICAgICAgICAgICAgYnkgdGhlIGJ1bGsgQVBJLgogICoKQEAgLTE1MSw3ICsxNDksNiBAQAogICovCiBzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSB7CiAJY29uc3QgY2hhciAqc3VwcGx5OwotCWJvb2wgb3B0aW9uYWw7CiAJc3RydWN0IHJlZ3VsYXRvciAqY29uc3VtZXI7CiAKIAkvKiBwcml2YXRlOiBJbnRlcm5hbCB1c2UgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvZHJpdmVyLmgKaW5kZXggZmNmYTQwYS4uMzdiNTMyNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvZHJpdmVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvZHJpdmVyLmgKQEAgLTExMywxMCArMTEzLDE0IEBACiAgKiAgICAgICAgICAgICAgIHN0YWJpbGlzZSBhZnRlciBiZWluZyBlbmFibGVkLCBpbiBtaWNyb3NlY29uZHMuCiAgKiBAc2V0X3JhbXBfZGVsYXk6IFNldCB0aGUgcmFtcCBkZWxheSBmb3IgdGhlIHJlZ3VsYXRvci4gVGhlIGRyaXZlciBzaG91bGQKICAqCQlzZWxlY3QgcmFtcCBkZWxheSBlcXVhbCB0byBvciBsZXNzIHRoYW4oY2xvc2VzdCkgcmFtcF9kZWxheS4KKyAqIEBzZXRfdm9sdGFnZV90aW1lOiBUaW1lIHRha2VuIGZvciB0aGUgcmVndWxhdG9yIHZvbHRhZ2Ugb3V0cHV0IHZvbHRhZ2UKKyAqICAgICAgICAgICAgICAgdG8gc3RhYmlsaXNlIGFmdGVyIGJlaW5nIHNldCB0byBhIG5ldyB2YWx1ZSwgaW4gbWljcm9zZWNvbmRzLgorICogICAgICAgICAgICAgICBUaGUgZnVuY3Rpb24gcmVjZWl2ZXMgdGhlIGZyb20gYW5kIHRvIHZvbHRhZ2UgYXMgaW5wdXQsIGl0CisgKiAgICAgICAgICAgICAgIHNob3VsZCByZXR1cm4gdGhlIHdvcnN0IGNhc2UuCiAgKiBAc2V0X3ZvbHRhZ2VfdGltZV9zZWw6IFRpbWUgdGFrZW4gZm9yIHRoZSByZWd1bGF0b3Igdm9sdGFnZSBvdXRwdXQgdm9sdGFnZQogICogICAgICAgICAgICAgICB0byBzdGFiaWxpc2UgYWZ0ZXIgYmVpbmcgc2V0IHRvIGEgbmV3IHZhbHVlLCBpbiBtaWNyb3NlY29uZHMuCi0gKiAgICAgICAgICAgICAgIFRoZSBmdW5jdGlvbiBwcm92aWRlcyB0aGUgZnJvbSBhbmQgdG8gdm9sdGFnZSBzZWxlY3RvciwgdGhlCi0gKiAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIHdvcnN0IGNhc2UuCisgKiAgICAgICAgICAgICAgIFRoZSBmdW5jdGlvbiByZWNlaXZlcyB0aGUgZnJvbSBhbmQgdG8gdm9sdGFnZSBzZWxlY3RvciBhcworICogICAgICAgICAgICAgICBpbnB1dCwgaXQgc2hvdWxkIHJldHVybiB0aGUgd29yc3QgY2FzZS4KICAqIEBzZXRfc29mdF9zdGFydDogRW5hYmxlIHNvZnQgc3RhcnQgZm9yIHRoZSByZWd1bGF0b3IuCiAgKgogICogQHNldF9zdXNwZW5kX3ZvbHRhZ2U6IFNldCB0aGUgdm9sdGFnZSBmb3IgdGhlIHJlZ3VsYXRvciB3aGVuIHRoZSBzeXN0ZW0KQEAgLTE2OCw2ICsxNzIsOCBAQAogCS8qIFRpbWUgdGFrZW4gdG8gZW5hYmxlIG9yIHNldCB2b2x0YWdlIG9uIHRoZSByZWd1bGF0b3IgKi8KIAlpbnQgKCplbmFibGVfdGltZSkgKHN0cnVjdCByZWd1bGF0b3JfZGV2ICopOwogCWludCAoKnNldF9yYW1wX2RlbGF5KSAoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKiwgaW50IHJhbXBfZGVsYXkpOworCWludCAoKnNldF92b2x0YWdlX3RpbWUpIChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqLCBpbnQgb2xkX3VWLAorCQkJCSBpbnQgbmV3X3VWKTsKIAlpbnQgKCpzZXRfdm9sdGFnZV90aW1lX3NlbCkgKHN0cnVjdCByZWd1bGF0b3JfZGV2ICosCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgb2xkX3NlbGVjdG9yLAogCQkJCSAgICAgdW5zaWduZWQgaW50IG5ld19zZWxlY3Rvcik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlbGF5LmggYi9pbmNsdWRlL2xpbnV4L3JlbGF5LmgKaW5kZXggZDdjODM1OS4uZWNiYjM0YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZWxheS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVsYXkuaApAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KIAogLyoKICAqIFRyYWNrcyBjaGFuZ2VzIHRvIHJjaGFuL3JjaGFuX2J1ZiBzdHJ1Y3RzCkBAIC02Myw3ICs2NCw3IEBACiAJc3RydWN0IGtyZWYga3JlZjsJCS8qIGNoYW5uZWwgcmVmY291bnQgKi8KIAl2b2lkICpwcml2YXRlX2RhdGE7CQkvKiBmb3IgdXNlci1kZWZpbmVkIGRhdGEgKi8KIAlzaXplX3QgbGFzdF90b29iaWc7CQkvKiB0cmllZCB0byBsb2cgZXZlbnQgPiBzdWJidWYgc2l6ZSAqLwotCXN0cnVjdCByY2hhbl9idWYgKmJ1ZltOUl9DUFVTXTsgLyogcGVyLWNwdSBjaGFubmVsIGJ1ZmZlcnMgKi8KKwlzdHJ1Y3QgcmNoYW5fYnVmICoqIF9fcGVyY3B1IGJ1ZjsgLyogcGVyLWNwdSBjaGFubmVsIGJ1ZmZlcnMgKi8KIAlpbnQgaXNfZ2xvYmFsOwkJCS8qIE9uZSBnbG9iYWwgYnVmZmVyID8gKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkvKiBmb3IgY2hhbm5lbCBsaXN0ICovCiAJc3RydWN0IGRlbnRyeSAqcGFyZW50OwkJLyogcGFyZW50IGRlbnRyeSBwYXNzZWQgdG8gb3BlbiAqLwpAQCAtMjA0LDcgKzIwNSw3IEBACiAJc3RydWN0IHJjaGFuX2J1ZiAqYnVmOwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWJ1ZiA9IGNoYW4tPmJ1ZltzbXBfcHJvY2Vzc29yX2lkKCldOworCWJ1ZiA9ICp0aGlzX2NwdV9wdHIoY2hhbi0+YnVmKTsKIAlpZiAodW5saWtlbHkoYnVmLT5vZmZzZXQgKyBsZW5ndGggPiBjaGFuLT5zdWJidWZfc2l6ZSkpCiAJCWxlbmd0aCA9IHJlbGF5X3N3aXRjaF9zdWJidWYoYnVmLCBsZW5ndGgpOwogCW1lbWNweShidWYtPmRhdGEgKyBidWYtPm9mZnNldCwgZGF0YSwgbGVuZ3RoKTsKQEAgLTIzMCwxMiArMjMxLDEyIEBACiB7CiAJc3RydWN0IHJjaGFuX2J1ZiAqYnVmOwogCi0JYnVmID0gY2hhbi0+YnVmW2dldF9jcHUoKV07CisJYnVmID0gKmdldF9jcHVfcHRyKGNoYW4tPmJ1Zik7CiAJaWYgKHVubGlrZWx5KGJ1Zi0+b2Zmc2V0ICsgbGVuZ3RoID4gYnVmLT5jaGFuLT5zdWJidWZfc2l6ZSkpCiAJCWxlbmd0aCA9IHJlbGF5X3N3aXRjaF9zdWJidWYoYnVmLCBsZW5ndGgpOwogCW1lbWNweShidWYtPmRhdGEgKyBidWYtPm9mZnNldCwgZGF0YSwgbGVuZ3RoKTsKIAlidWYtPm9mZnNldCArPSBsZW5ndGg7Ci0JcHV0X2NwdSgpOworCXB1dF9jcHVfcHRyKGNoYW4tPmJ1Zik7CiB9CiAKIC8qKgpAQCAtMjUxLDE3ICsyNTIsMTkgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkICpyZWxheV9yZXNlcnZlKHN0cnVjdCByY2hhbiAqY2hhbiwgc2l6ZV90IGxlbmd0aCkKIHsKLQl2b2lkICpyZXNlcnZlZDsKLQlzdHJ1Y3QgcmNoYW5fYnVmICpidWYgPSBjaGFuLT5idWZbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKwl2b2lkICpyZXNlcnZlZCA9IE5VTEw7CisJc3RydWN0IHJjaGFuX2J1ZiAqYnVmID0gKmdldF9jcHVfcHRyKGNoYW4tPmJ1Zik7CiAKIAlpZiAodW5saWtlbHkoYnVmLT5vZmZzZXQgKyBsZW5ndGggPiBidWYtPmNoYW4tPnN1YmJ1Zl9zaXplKSkgewogCQlsZW5ndGggPSByZWxheV9zd2l0Y2hfc3ViYnVmKGJ1ZiwgbGVuZ3RoKTsKIAkJaWYgKCFsZW5ndGgpCi0JCQlyZXR1cm4gTlVMTDsKKwkJCWdvdG8gZW5kOwogCX0KIAlyZXNlcnZlZCA9IGJ1Zi0+ZGF0YSArIGJ1Zi0+b2Zmc2V0OwogCWJ1Zi0+b2Zmc2V0ICs9IGxlbmd0aDsKIAorZW5kOgorCXB1dF9jcHVfcHRyKGNoYW4tPmJ1Zik7CiAJcmV0dXJuIHJlc2VydmVkOwogfQogCkBAIC0yODUsNSArMjg4LDExIEBACiAgKi8KIGV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJlbGF5X2ZpbGVfb3BlcmF0aW9uczsKIAorI2lmZGVmIENPTkZJR19SRUxBWQoraW50IHJlbGF5X3ByZXBhcmVfY3B1KHVuc2lnbmVkIGludCBjcHUpOworI2Vsc2UKKyNkZWZpbmUgcmVsYXlfcHJlcGFyZV9jcHUgICAgIE5VTEwKKyNlbmRpZgorCiAjZW5kaWYgLyogX0xJTlVYX1JFTEFZX0ggKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZW1vdGVwcm9jLmggYi9pbmNsdWRlL2xpbnV4L3JlbW90ZXByb2MuaAppbmRleCAxYzQ1N2E4Li45MzAwMjNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlbW90ZXByb2MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlbW90ZXByb2MuaApAQCAtMTE4LDcgKzExOCw3IEBACiAJUlNDX0xBU1QJPSA0LAogfTsKIAotI2RlZmluZSBGV19SU0NfQUREUl9BTlkgKDB4RkZGRkZGRkZGRkZGRkZGRikKKyNkZWZpbmUgRldfUlNDX0FERFJfQU5ZICgtMSkKIAogLyoqCiAgKiBzdHJ1Y3QgZndfcnNjX2NhcnZlb3V0IC0gcGh5c2ljYWxseSBjb250aWd1b3VzIG1lbW9yeSByZXF1ZXN0CkBAIC0yNDEsNyArMjQxLDcgQEAKICAqIEBub3RpZnlpZCBpcyBhIHVuaXF1ZSBycHJvYy13aWRlIG5vdGlmeSBpbmRleCBmb3IgdGhpcyB2cmluZy4gVGhpcyBub3RpZnkKICAqIGluZGV4IGlzIHVzZWQgd2hlbiBraWNraW5nIGEgcmVtb3RlIHByb2Nlc3NvciwgdG8gbGV0IGl0IGtub3cgdGhhdCB0aGlzCiAgKiB2cmluZyBpcyB0cmlnZ2VyZWQuCi0gKiBAcmVzZXJ2ZWQ6IHJlc2VydmVkIChtdXN0IGJlIHplcm8pCisgKiBAcGE6IHBoeXNpY2FsIGFkZHJlc3MKICAqCiAgKiBUaGlzIGRlc2NyaXB0b3IgaXMgbm90IGEgcmVzb3VyY2UgZW50cnkgYnkgaXRzZWxmOyBpdCBpcyBwYXJ0IG9mIHRoZQogICogdmRldiByZXNvdXJjZSB0eXBlIChzZWUgYmVsb3cpLgpAQCAtMjU1LDcgKzI1NSw3IEBACiAJdTMyIGFsaWduOwogCXUzMiBudW07CiAJdTMyIG5vdGlmeWlkOwotCXUzMiByZXNlcnZlZDsKKwl1MzIgcGE7CiB9IF9fcGFja2VkOwogCiAvKioKQEAgLTQwOSw3ICs0MDksNiBAQAogICogQG1heF9ub3RpZnlpZDogbGFyZ2VzdCBhbGxvY2F0ZWQgbm90aWZ5IGlkLgogICogQHRhYmxlX3B0cjogcG9pbnRlciB0byB0aGUgcmVzb3VyY2UgdGFibGUgaW4gZWZmZWN0CiAgKiBAY2FjaGVkX3RhYmxlOiBjb3B5IG9mIHRoZSByZXNvdXJjZSB0YWJsZQotICogQHRhYmxlX2NzdW06IGNoZWNrc3VtIG9mIHRoZSByZXNvdXJjZSB0YWJsZQogICogQGhhc19pb21tdTogZmxhZyB0byBpbmRpY2F0ZSBpZiByZW1vdGUgcHJvY2Vzc29yIGlzIGJlaGluZCBhbiBNTVUKICAqLwogc3RydWN0IHJwcm9jIHsKQEAgLTQzNSwxNCArNDM0LDE0IEBACiAJc3RydWN0IGlkciBub3RpZnlpZHM7CiAJaW50IGluZGV4OwogCXN0cnVjdCB3b3JrX3N0cnVjdCBjcmFzaF9oYW5kbGVyOwotCXVuc2lnbmVkIGNyYXNoX2NudDsKKwl1bnNpZ25lZCBpbnQgY3Jhc2hfY250OwogCXN0cnVjdCBjb21wbGV0aW9uIGNyYXNoX2NvbXA7CiAJYm9vbCByZWNvdmVyeV9kaXNhYmxlZDsKIAlpbnQgbWF4X25vdGlmeWlkOwogCXN0cnVjdCByZXNvdXJjZV90YWJsZSAqdGFibGVfcHRyOwogCXN0cnVjdCByZXNvdXJjZV90YWJsZSAqY2FjaGVkX3RhYmxlOwotCXUzMiB0YWJsZV9jc3VtOwogCWJvb2wgaGFzX2lvbW11OworCWJvb2wgYXV0b19ib290OwogfTsKIAogLyogd2UgY3VycmVudGx5IHN1cHBvcnQgb25seSB0d28gdnJpbmdzIHBlciBydmRldiAqLwpAQCAtNDg5LDExICs0ODgsMTIgQEAKIAogc3RydWN0IHJwcm9jICpycHJvY19nZXRfYnlfcGhhbmRsZShwaGFuZGxlIHBoYW5kbGUpOwogc3RydWN0IHJwcm9jICpycHJvY19hbGxvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJY29uc3Qgc3RydWN0IHJwcm9jX29wcyAqb3BzLAotCQkJCWNvbnN0IGNoYXIgKmZpcm13YXJlLCBpbnQgbGVuKTsKKwkJCSAgY29uc3Qgc3RydWN0IHJwcm9jX29wcyAqb3BzLAorCQkJICBjb25zdCBjaGFyICpmaXJtd2FyZSwgaW50IGxlbik7CiB2b2lkIHJwcm9jX3B1dChzdHJ1Y3QgcnByb2MgKnJwcm9jKTsKIGludCBycHJvY19hZGQoc3RydWN0IHJwcm9jICpycHJvYyk7CiBpbnQgcnByb2NfZGVsKHN0cnVjdCBycHJvYyAqcnByb2MpOwordm9pZCBycHJvY19mcmVlKHN0cnVjdCBycHJvYyAqcnByb2MpOwogCiBpbnQgcnByb2NfYm9vdChzdHJ1Y3QgcnByb2MgKnJwcm9jKTsKIHZvaWQgcnByb2Nfc2h1dGRvd24oc3RydWN0IHJwcm9jICpycHJvYyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JoYXNodGFibGUuaCBiL2luY2x1ZGUvbGludXgvcmhhc2h0YWJsZS5oCmluZGV4IDNlZWYwODAuLjVjMTMyZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmhhc2h0YWJsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmhhc2h0YWJsZS5oCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIFJlc2l6YWJsZSwgU2NhbGFibGUsIENvbmN1cnJlbnQgSGFzaCBUYWJsZQogICoKLSAqIENvcHlyaWdodCAoYykgMjAxNSBIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+CiAgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBUaG9tYXMgR3JhZiA8dGdyYWZAc3V1Zy5jaD4KICAqIENvcHlyaWdodCAoYykgMjAwOC0yMDE0IFBhdHJpY2sgTWNIYXJkeSA8a2FiZXJAdHJhc2gubmV0PgogICoKQEAgLTUzLDYgKzUzLDExIEBACiAJc3RydWN0IHJoYXNoX2hlYWQgX19yY3UJCSpuZXh0OwogfTsKIAorc3RydWN0IHJobGlzdF9oZWFkIHsKKwlzdHJ1Y3Qgcmhhc2hfaGVhZAkJcmhlYWQ7CisJc3RydWN0IHJobGlzdF9oZWFkIF9fcmN1CSpuZXh0OworfTsKKwogLyoqCiAgKiBzdHJ1Y3QgYnVja2V0X3RhYmxlIC0gVGFibGUgb2YgaGFzaCBidWNrZXRzCiAgKiBAc2l6ZTogTnVtYmVyIG9mIGhhc2ggYnVja2V0cwpAQCAtMTM3LDYgKzE0Miw3IEBACiAgKiBAa2V5X2xlbjogS2V5IGxlbmd0aCBmb3IgaGFzaGZuCiAgKiBAZWxhc3RpY2l0eTogTWF4aW11bSBjaGFpbiBsZW5ndGggYmVmb3JlIHJlaGFzaAogICogQHA6IENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworICogQHJobGlzdDogVHJ1ZSBpZiB0aGlzIGlzIGFuIHJobHRhYmxlCiAgKiBAcnVuX3dvcms6IERlZmVycmVkIHdvcmtlciB0byBleHBhbmQvc2hyaW5rIGFzeW5jaHJvbm91c2x5CiAgKiBAbXV0ZXg6IE11dGV4IHRvIHByb3RlY3QgY3VycmVudC9mdXR1cmUgdGFibGUgc3dhcHBpbmcKICAqIEBsb2NrOiBTcGluIGxvY2sgdG8gcHJvdGVjdCB3YWxrZXIgbGlzdApAQCAtMTQ3LDEyICsxNTMsMjEgQEAKIAl1bnNpZ25lZCBpbnQJCQlrZXlfbGVuOwogCXVuc2lnbmVkIGludAkJCWVsYXN0aWNpdHk7CiAJc3RydWN0IHJoYXNodGFibGVfcGFyYW1zCXA7CisJYm9vbAkJCQlyaGxpc3Q7CiAJc3RydWN0IHdvcmtfc3RydWN0CQlydW5fd29yazsKIAlzdHJ1Y3QgbXV0ZXggICAgICAgICAgICAgICAgICAgIG11dGV4OwogCXNwaW5sb2NrX3QJCQlsb2NrOwogfTsKIAogLyoqCisgKiBzdHJ1Y3QgcmhsdGFibGUgLSBIYXNoIHRhYmxlIHdpdGggZHVwbGljYXRlIG9iamVjdHMgaW4gYSBsaXN0CisgKiBAaHQ6IFVuZGVybHlpbmcgcmh0YWJsZQorICovCitzdHJ1Y3QgcmhsdGFibGUgeworCXN0cnVjdCByaGFzaHRhYmxlIGh0OworfTsKKworLyoqCiAgKiBzdHJ1Y3Qgcmhhc2h0YWJsZV93YWxrZXIgLSBIYXNoIHRhYmxlIHdhbGtlcgogICogQGxpc3Q6IExpc3QgZW50cnkgb24gbGlzdCBvZiB3YWxrZXJzCiAgKiBAdGJsOiBUaGUgdGFibGUgdGhhdCB3ZSB3ZXJlIHdhbGtpbmcgb3ZlcgpAQCAtMTYzLDkgKzE3OCwxMCBAQAogfTsKIAogLyoqCi0gKiBzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyIC0gSGFzaCB0YWJsZSBpdGVyYXRvciwgZml0cyBpbnRvIG5ldGxpbmsgY2IKKyAqIHN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgLSBIYXNoIHRhYmxlIGl0ZXJhdG9yCiAgKiBAaHQ6IFRhYmxlIHRvIGl0ZXJhdGUgdGhyb3VnaAogICogQHA6IEN1cnJlbnQgcG9pbnRlcgorICogQGxpc3Q6IEN1cnJlbnQgaGFzaCBsaXN0IHBvaW50ZXIKICAqIEB3YWxrZXI6IEFzc29jaWF0ZWQgcmhhc2h0YWJsZSB3YWxrZXIKICAqIEBzbG90OiBDdXJyZW50IHNsb3QKICAqIEBza2lwOiBOdW1iZXIgb2YgZW50cmllcyB0byBza2lwIGluIHNsb3QKQEAgLTE3Myw3ICsxODksOCBAQAogc3RydWN0IHJoYXNodGFibGVfaXRlciB7CiAJc3RydWN0IHJoYXNodGFibGUgKmh0OwogCXN0cnVjdCByaGFzaF9oZWFkICpwOwotCXN0cnVjdCByaGFzaHRhYmxlX3dhbGtlciAqd2Fsa2VyOworCXN0cnVjdCByaGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3Qgcmhhc2h0YWJsZV93YWxrZXIgd2Fsa2VyOwogCXVuc2lnbmVkIGludCBzbG90OwogCXVuc2lnbmVkIGludCBza2lwOwogfTsKQEAgLTMzOSwxNSArMzU2LDE0IEBACiAKIGludCByaGFzaHRhYmxlX2luaXQoc3RydWN0IHJoYXNodGFibGUgKmh0LAogCQkgICAgY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zICpwYXJhbXMpOworaW50IHJobHRhYmxlX2luaXQoc3RydWN0IHJobHRhYmxlICpobHQsCisJCSAgY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zICpwYXJhbXMpOwogCi1zdHJ1Y3QgYnVja2V0X3RhYmxlICpyaGFzaHRhYmxlX2luc2VydF9zbG93KHN0cnVjdCByaGFzaHRhYmxlICpodCwKLQkJCQkJICAgIGNvbnN0IHZvaWQgKmtleSwKLQkJCQkJICAgIHN0cnVjdCByaGFzaF9oZWFkICpvYmosCi0JCQkJCSAgICBzdHJ1Y3QgYnVja2V0X3RhYmxlICpvbGRfdGJsKTsKLWludCByaGFzaHRhYmxlX2luc2VydF9yZWhhc2goc3RydWN0IHJoYXNodGFibGUgKmh0LCBzdHJ1Y3QgYnVja2V0X3RhYmxlICp0YmwpOwordm9pZCAqcmhhc2h0YWJsZV9pbnNlcnRfc2xvdyhzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIGNvbnN0IHZvaWQgKmtleSwKKwkJCSAgICAgc3RydWN0IHJoYXNoX2hlYWQgKm9iaik7CiAKLWludCByaGFzaHRhYmxlX3dhbGtfaW5pdChzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIHN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgKml0ZXIsCi0JCQkgZ2ZwX3QgZ2ZwKTsKK3ZvaWQgcmhhc2h0YWJsZV93YWxrX2VudGVyKHN0cnVjdCByaGFzaHRhYmxlICpodCwKKwkJCSAgIHN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgKml0ZXIpOwogdm9pZCByaGFzaHRhYmxlX3dhbGtfZXhpdChzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyICppdGVyKTsKIGludCByaGFzaHRhYmxlX3dhbGtfc3RhcnQoc3RydWN0IHJoYXNodGFibGVfaXRlciAqaXRlcikgX19hY3F1aXJlcyhSQ1UpOwogdm9pZCAqcmhhc2h0YWJsZV93YWxrX25leHQoc3RydWN0IHJoYXNodGFibGVfaXRlciAqaXRlcik7CkBAIC01MDYsNiArNTIyLDMxIEBACiAJcmh0X2Zvcl9lYWNoX2VudHJ5X3JjdV9jb250aW51ZSh0cG9zLCBwb3MsICh0YmwpLT5idWNrZXRzW2hhc2hdLFwKIAkJCQkJdGJsLCBoYXNoLCBtZW1iZXIpCiAKKy8qKgorICogcmhsX2Zvcl9lYWNoX3JjdSAtIGl0ZXJhdGUgb3ZlciByY3UgaGFzaCB0YWJsZSBsaXN0CisgKiBAcG9zOgl0aGUgJnN0cnVjdCBybGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQGxpc3Q6CXRoZSBoZWFkIG9mIHRoZSBsaXN0CisgKgorICogVGhpcyBoYXNoIGNoYWluIGxpc3QtdHJhdmVyc2FsIHByaW1pdGl2ZSBzaG91bGQgYmUgdXNlZCBvbiB0aGUKKyAqIGxpc3QgcmV0dXJuZWQgYnkgcmhsdGFibGVfbG9va3VwLgorICovCisjZGVmaW5lIHJobF9mb3JfZWFjaF9yY3UocG9zLCBsaXN0KQkJCQkJXAorCWZvciAocG9zID0gbGlzdDsgcG9zOyBwb3MgPSByY3VfZGVyZWZlcmVuY2VfcmF3KHBvcy0+bmV4dCkpCisKKy8qKgorICogcmhsX2Zvcl9lYWNoX2VudHJ5X3JjdSAtIGl0ZXJhdGUgb3ZlciByY3UgaGFzaCB0YWJsZSBsaXN0IG9mIGdpdmVuIHR5cGUKKyAqIEB0cG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQHBvczoJdGhlICZzdHJ1Y3Qgcmxpc3RfaGVhZCB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KKyAqIEBsaXN0Ogl0aGUgaGVhZCBvZiB0aGUgbGlzdAorICogQG1lbWJlcjoJbmFtZSBvZiB0aGUgJnN0cnVjdCBybGlzdF9oZWFkIHdpdGhpbiB0aGUgaGFzaGFibGUgc3RydWN0LgorICoKKyAqIFRoaXMgaGFzaCBjaGFpbiBsaXN0LXRyYXZlcnNhbCBwcmltaXRpdmUgc2hvdWxkIGJlIHVzZWQgb24gdGhlCisgKiBsaXN0IHJldHVybmVkIGJ5IHJobHRhYmxlX2xvb2t1cC4KKyAqLworI2RlZmluZSByaGxfZm9yX2VhY2hfZW50cnlfcmN1KHRwb3MsIHBvcywgbGlzdCwgbWVtYmVyKQkJCVwKKwlmb3IgKHBvcyA9IGxpc3Q7IHBvcyAmJiByaHRfZW50cnkodHBvcywgcG9zLCBtZW1iZXIpOwkJXAorCSAgICAgcG9zID0gcmN1X2RlcmVmZXJlbmNlX3Jhdyhwb3MtPm5leHQpKQorCiBzdGF0aWMgaW5saW5lIGludCByaGFzaHRhYmxlX2NvbXBhcmUoc3RydWN0IHJoYXNodGFibGVfY29tcGFyZV9hcmcgKmFyZywKIAkJCQkgICAgIGNvbnN0IHZvaWQgKm9iaikKIHsKQEAgLTUxNSwxOCArNTU2LDggQEAKIAlyZXR1cm4gbWVtY21wKHB0ciArIGh0LT5wLmtleV9vZmZzZXQsIGFyZy0+a2V5LCBodC0+cC5rZXlfbGVuKTsKIH0KIAotLyoqCi0gKiByaGFzaHRhYmxlX2xvb2t1cF9mYXN0IC0gc2VhcmNoIGhhc2ggdGFibGUsIGlubGluZWQgdmVyc2lvbgotICogQGh0OgkJaGFzaCB0YWJsZQotICogQGtleToJdGhlIHBvaW50ZXIgdG8gdGhlIGtleQotICogQHBhcmFtczoJaGFzaCB0YWJsZSBwYXJhbWV0ZXJzCi0gKgotICogQ29tcHV0ZXMgdGhlIGhhc2ggdmFsdWUgZm9yIHRoZSBrZXkgYW5kIHRyYXZlcnNlcyB0aGUgYnVja2V0IGNoYWluIGxvb2tpbmcKLSAqIGZvciBhIGVudHJ5IHdpdGggYW4gaWRlbnRpY2FsIGtleS4gVGhlIGZpcnN0IG1hdGNoaW5nIGVudHJ5IGlzIHJldHVybmVkLgotICoKLSAqIFJldHVybnMgdGhlIGZpcnN0IGVudHJ5IG9uIHdoaWNoIHRoZSBjb21wYXJlIGZ1bmN0aW9uIHJldHVybmVkIHRydWUuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCAqcmhhc2h0YWJsZV9sb29rdXBfZmFzdCgKKy8qIEludGVybmFsIGZ1bmN0aW9uLCBkbyBub3QgdXNlLiAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgcmhhc2hfaGVhZCAqX19yaGFzaHRhYmxlX2xvb2t1cCgKIAlzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIGNvbnN0IHZvaWQgKmtleSwKIAljb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGFyYW1zKQogewpAQCAtNTM4LDggKzU2OSw2IEBACiAJc3RydWN0IHJoYXNoX2hlYWQgKmhlOwogCXVuc2lnbmVkIGludCBoYXNoOwogCi0JcmN1X3JlYWRfbG9jaygpOwotCiAJdGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdShodC0+dGJsLCBodCk7CiByZXN0YXJ0OgogCWhhc2ggPSByaHRfa2V5X2hhc2hmbihodCwgdGJsLCBrZXksIHBhcmFtcyk7CkBAIC01NDgsOCArNTc3LDcgQEAKIAkJICAgIHBhcmFtcy5vYmpfY21wZm4oJmFyZywgcmh0X29iaihodCwgaGUpKSA6CiAJCSAgICByaGFzaHRhYmxlX2NvbXBhcmUoJmFyZywgcmh0X29iaihodCwgaGUpKSkKIAkJCWNvbnRpbnVlOwotCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJcmV0dXJuIHJodF9vYmooaHQsIGhlKTsKKwkJcmV0dXJuIGhlOwogCX0KIAogCS8qIEVuc3VyZSB3ZSBzZWUgYW55IG5ldyB0YWJsZXMuICovCkBAIC01NTgsODkgKzU4NiwxNjUgQEAKIAl0YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KHRibC0+ZnV0dXJlX3RibCwgaHQpOwogCWlmICh1bmxpa2VseSh0YmwpKQogCQlnb3RvIHJlc3RhcnQ7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlyZXR1cm4gTlVMTDsKIH0KIAotLyogSW50ZXJuYWwgZnVuY3Rpb24sIHBsZWFzZSB1c2Ugcmhhc2h0YWJsZV9pbnNlcnRfZmFzdCgpIGluc3RlYWQgKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9fcmhhc2h0YWJsZV9pbnNlcnRfZmFzdCgKLQlzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIGNvbnN0IHZvaWQgKmtleSwgc3RydWN0IHJoYXNoX2hlYWQgKm9iaiwKKy8qKgorICogcmhhc2h0YWJsZV9sb29rdXAgLSBzZWFyY2ggaGFzaCB0YWJsZQorICogQGh0OgkJaGFzaCB0YWJsZQorICogQGtleToJdGhlIHBvaW50ZXIgdG8gdGhlIGtleQorICogQHBhcmFtczoJaGFzaCB0YWJsZSBwYXJhbWV0ZXJzCisgKgorICogQ29tcHV0ZXMgdGhlIGhhc2ggdmFsdWUgZm9yIHRoZSBrZXkgYW5kIHRyYXZlcnNlcyB0aGUgYnVja2V0IGNoYWluIGxvb2tpbmcKKyAqIGZvciBhIGVudHJ5IHdpdGggYW4gaWRlbnRpY2FsIGtleS4gVGhlIGZpcnN0IG1hdGNoaW5nIGVudHJ5IGlzIHJldHVybmVkLgorICoKKyAqIFRoaXMgbXVzdCBvbmx5IGJlIGNhbGxlZCB1bmRlciB0aGUgUkNVIHJlYWQgbG9jay4KKyAqCisgKiBSZXR1cm5zIHRoZSBmaXJzdCBlbnRyeSBvbiB3aGljaCB0aGUgY29tcGFyZSBmdW5jdGlvbiByZXR1cm5lZCB0cnVlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKnJoYXNodGFibGVfbG9va3VwKAorCXN0cnVjdCByaGFzaHRhYmxlICpodCwgY29uc3Qgdm9pZCAqa2V5LAogCWNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBwYXJhbXMpCiB7CisJc3RydWN0IHJoYXNoX2hlYWQgKmhlID0gX19yaGFzaHRhYmxlX2xvb2t1cChodCwga2V5LCBwYXJhbXMpOworCisJcmV0dXJuIGhlID8gcmh0X29iaihodCwgaGUpIDogTlVMTDsKK30KKworLyoqCisgKiByaGFzaHRhYmxlX2xvb2t1cF9mYXN0IC0gc2VhcmNoIGhhc2ggdGFibGUsIHdpdGhvdXQgUkNVIHJlYWQgbG9jaworICogQGh0OgkJaGFzaCB0YWJsZQorICogQGtleToJdGhlIHBvaW50ZXIgdG8gdGhlIGtleQorICogQHBhcmFtczoJaGFzaCB0YWJsZSBwYXJhbWV0ZXJzCisgKgorICogQ29tcHV0ZXMgdGhlIGhhc2ggdmFsdWUgZm9yIHRoZSBrZXkgYW5kIHRyYXZlcnNlcyB0aGUgYnVja2V0IGNoYWluIGxvb2tpbmcKKyAqIGZvciBhIGVudHJ5IHdpdGggYW4gaWRlbnRpY2FsIGtleS4gVGhlIGZpcnN0IG1hdGNoaW5nIGVudHJ5IGlzIHJldHVybmVkLgorICoKKyAqIE9ubHkgdXNlIHRoaXMgZnVuY3Rpb24gd2hlbiB5b3UgaGF2ZSBvdGhlciBtZWNoYW5pc21zIGd1YXJhbnRlZWluZworICogdGhhdCB0aGUgb2JqZWN0IHdvbid0IGdvIGF3YXkgYWZ0ZXIgdGhlIFJDVSByZWFkIGxvY2sgaXMgcmVsZWFzZWQuCisgKgorICogUmV0dXJucyB0aGUgZmlyc3QgZW50cnkgb24gd2hpY2ggdGhlIGNvbXBhcmUgZnVuY3Rpb24gcmV0dXJuZWQgdHJ1ZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICpyaGFzaHRhYmxlX2xvb2t1cF9mYXN0KAorCXN0cnVjdCByaGFzaHRhYmxlICpodCwgY29uc3Qgdm9pZCAqa2V5LAorCWNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBwYXJhbXMpCit7CisJdm9pZCAqb2JqOworCisJcmN1X3JlYWRfbG9jaygpOworCW9iaiA9IHJoYXNodGFibGVfbG9va3VwKGh0LCBrZXksIHBhcmFtcyk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlyZXR1cm4gb2JqOworfQorCisvKioKKyAqIHJobHRhYmxlX2xvb2t1cCAtIHNlYXJjaCBoYXNoIGxpc3QgdGFibGUKKyAqIEBobHQ6CWhhc2ggdGFibGUKKyAqIEBrZXk6CXRoZSBwb2ludGVyIHRvIHRoZSBrZXkKKyAqIEBwYXJhbXM6CWhhc2ggdGFibGUgcGFyYW1ldGVycworICoKKyAqIENvbXB1dGVzIHRoZSBoYXNoIHZhbHVlIGZvciB0aGUga2V5IGFuZCB0cmF2ZXJzZXMgdGhlIGJ1Y2tldCBjaGFpbiBsb29raW5nCisgKiBmb3IgYSBlbnRyeSB3aXRoIGFuIGlkZW50aWNhbCBrZXkuICBBbGwgbWF0Y2hpbmcgZW50cmllcyBhcmUgcmV0dXJuZWQKKyAqIGluIGEgbGlzdC4KKyAqCisgKiBUaGlzIG11c3Qgb25seSBiZSBjYWxsZWQgdW5kZXIgdGhlIFJDVSByZWFkIGxvY2suCisgKgorICogUmV0dXJucyB0aGUgbGlzdCBvZiBlbnRyaWVzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIGtleS4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmhsaXN0X2hlYWQgKnJobHRhYmxlX2xvb2t1cCgKKwlzdHJ1Y3QgcmhsdGFibGUgKmhsdCwgY29uc3Qgdm9pZCAqa2V5LAorCWNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBwYXJhbXMpCit7CisJc3RydWN0IHJoYXNoX2hlYWQgKmhlID0gX19yaGFzaHRhYmxlX2xvb2t1cCgmaGx0LT5odCwga2V5LCBwYXJhbXMpOworCisJcmV0dXJuIGhlID8gY29udGFpbmVyX29mKGhlLCBzdHJ1Y3QgcmhsaXN0X2hlYWQsIHJoZWFkKSA6IE5VTEw7Cit9CisKKy8qIEludGVybmFsIGZ1bmN0aW9uLCBwbGVhc2UgdXNlIHJoYXNodGFibGVfaW5zZXJ0X2Zhc3QoKSBpbnN0ZWFkLiBUaGlzCisgKiBmdW5jdGlvbiByZXR1cm5zIHRoZSBleGlzdGluZyBlbGVtZW50IGFscmVhZHkgaW4gaGFzaGVzIGluIHRoZXJlIGlzIGEgY2xhc2gsCisgKiBvdGhlcndpc2UgaXQgcmV0dXJucyBhbiBlcnJvciB2aWEgRVJSX1BUUigpLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKl9fcmhhc2h0YWJsZV9pbnNlcnRfZmFzdCgKKwlzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIGNvbnN0IHZvaWQgKmtleSwgc3RydWN0IHJoYXNoX2hlYWQgKm9iaiwKKwljb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGFyYW1zLCBib29sIHJobGlzdCkKK3sKIAlzdHJ1Y3Qgcmhhc2h0YWJsZV9jb21wYXJlX2FyZyBhcmcgPSB7CiAJCS5odCA9IGh0LAogCQkua2V5ID0ga2V5LAogCX07Ci0Jc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsLCAqbmV3X3RibDsKKwlzdHJ1Y3Qgcmhhc2hfaGVhZCBfX3JjdSAqKnBwcmV2OworCXN0cnVjdCBidWNrZXRfdGFibGUgKnRibDsKIAlzdHJ1Y3Qgcmhhc2hfaGVhZCAqaGVhZDsKIAlzcGlubG9ja190ICpsb2NrOwotCXVuc2lnbmVkIGludCBlbGFzdGljaXR5OwogCXVuc2lnbmVkIGludCBoYXNoOwotCWludCBlcnI7CisJaW50IGVsYXN0aWNpdHk7CisJdm9pZCAqZGF0YTsKIAotcmVzdGFydDoKIAlyY3VfcmVhZF9sb2NrKCk7CiAKIAl0YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KGh0LT50YmwsIGh0KTsKKwloYXNoID0gcmh0X2hlYWRfaGFzaGZuKGh0LCB0YmwsIG9iaiwgcGFyYW1zKTsKKwlsb2NrID0gcmh0X2J1Y2tldF9sb2NrKHRibCwgaGFzaCk7CisJc3Bpbl9sb2NrX2JoKGxvY2spOwogCi0JLyogQWxsIGluc2VydGlvbnMgbXVzdCBncmFiIHRoZSBvbGRlc3QgdGFibGUgY29udGFpbmluZwotCSAqIHRoZSBoYXNoZWQgYnVja2V0IHRoYXQgaXMgeWV0IHRvIGJlIHJlaGFzaGVkLgotCSAqLwotCWZvciAoOzspIHsKLQkJaGFzaCA9IHJodF9oZWFkX2hhc2hmbihodCwgdGJsLCBvYmosIHBhcmFtcyk7Ci0JCWxvY2sgPSByaHRfYnVja2V0X2xvY2sodGJsLCBoYXNoKTsKLQkJc3Bpbl9sb2NrX2JoKGxvY2spOwotCi0JCWlmICh0YmwtPnJlaGFzaCA8PSBoYXNoKQotCQkJYnJlYWs7Ci0KKwlpZiAodW5saWtlbHkocmh0X2RlcmVmZXJlbmNlX2J1Y2tldCh0YmwtPmZ1dHVyZV90YmwsIHRibCwgaGFzaCkpKSB7CitzbG93X3BhdGg6CiAJCXNwaW5fdW5sb2NrX2JoKGxvY2spOwotCQl0YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KHRibC0+ZnV0dXJlX3RibCwgaHQpOworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJcmV0dXJuIHJoYXNodGFibGVfaW5zZXJ0X3Nsb3coaHQsIGtleSwgb2JqKTsKIAl9CiAKLQluZXdfdGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdSh0YmwtPmZ1dHVyZV90YmwsIGh0KTsKLQlpZiAodW5saWtlbHkobmV3X3RibCkpIHsKLQkJdGJsID0gcmhhc2h0YWJsZV9pbnNlcnRfc2xvdyhodCwga2V5LCBvYmosIG5ld190YmwpOwotCQlpZiAoIUlTX0VSUl9PUl9OVUxMKHRibCkpCi0JCQlnb3RvIHNsb3dfcGF0aDsKKwllbGFzdGljaXR5ID0gaHQtPmVsYXN0aWNpdHk7CisJcHByZXYgPSAmdGJsLT5idWNrZXRzW2hhc2hdOworCXJodF9mb3JfZWFjaChoZWFkLCB0YmwsIGhhc2gpIHsKKwkJc3RydWN0IHJobGlzdF9oZWFkICpwbGlzdDsKKwkJc3RydWN0IHJobGlzdF9oZWFkICpsaXN0OwogCi0JCWVyciA9IFBUUl9FUlIodGJsKTsKLQkJZ290byBvdXQ7CisJCWVsYXN0aWNpdHktLTsKKwkJaWYgKCFrZXkgfHwKKwkJICAgIChwYXJhbXMub2JqX2NtcGZuID8KKwkJICAgICBwYXJhbXMub2JqX2NtcGZuKCZhcmcsIHJodF9vYmooaHQsIGhlYWQpKSA6CisJCSAgICAgcmhhc2h0YWJsZV9jb21wYXJlKCZhcmcsIHJodF9vYmooaHQsIGhlYWQpKSkpCisJCQljb250aW51ZTsKKworCQlkYXRhID0gcmh0X29iaihodCwgaGVhZCk7CisKKwkJaWYgKCFyaGxpc3QpCisJCQlnb3RvIG91dDsKKworCisJCWxpc3QgPSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgcmhsaXN0X2hlYWQsIHJoZWFkKTsKKwkJcGxpc3QgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IHJobGlzdF9oZWFkLCByaGVhZCk7CisKKwkJUkNVX0lOSVRfUE9JTlRFUihsaXN0LT5uZXh0LCBwbGlzdCk7CisJCWhlYWQgPSByaHRfZGVyZWZlcmVuY2VfYnVja2V0KGhlYWQtPm5leHQsIHRibCwgaGFzaCk7CisJCVJDVV9JTklUX1BPSU5URVIobGlzdC0+cmhlYWQubmV4dCwgaGVhZCk7CisJCXJjdV9hc3NpZ25fcG9pbnRlcigqcHByZXYsIG9iaik7CisKKwkJZ290byBnb29kOwogCX0KIAotCWVyciA9IC1FMkJJRzsKKwlpZiAoZWxhc3RpY2l0eSA8PSAwKQorCQlnb3RvIHNsb3dfcGF0aDsKKworCWRhdGEgPSBFUlJfUFRSKC1FMkJJRyk7CiAJaWYgKHVubGlrZWx5KHJodF9ncm93X2Fib3ZlX21heChodCwgdGJsKSkpCiAJCWdvdG8gb3V0OwogCi0JaWYgKHVubGlrZWx5KHJodF9ncm93X2Fib3ZlXzEwMChodCwgdGJsKSkpIHsKLXNsb3dfcGF0aDoKLQkJc3Bpbl91bmxvY2tfYmgobG9jayk7Ci0JCWVyciA9IHJoYXNodGFibGVfaW5zZXJ0X3JlaGFzaChodCwgdGJsKTsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCi0JCWdvdG8gcmVzdGFydDsKLQl9Ci0KLQllcnIgPSAtRUVYSVNUOwotCWVsYXN0aWNpdHkgPSBodC0+ZWxhc3RpY2l0eTsKLQlyaHRfZm9yX2VhY2goaGVhZCwgdGJsLCBoYXNoKSB7Ci0JCWlmIChrZXkgJiYKLQkJICAgIHVubGlrZWx5KCEocGFyYW1zLm9ial9jbXBmbiA/Ci0JCQkgICAgICAgcGFyYW1zLm9ial9jbXBmbigmYXJnLCByaHRfb2JqKGh0LCBoZWFkKSkgOgotCQkJICAgICAgIHJoYXNodGFibGVfY29tcGFyZSgmYXJnLCByaHRfb2JqKGh0LCBoZWFkKSkpKSkKLQkJCWdvdG8gb3V0OwotCQlpZiAoIS0tZWxhc3RpY2l0eSkKLQkJCWdvdG8gc2xvd19wYXRoOwotCX0KLQotCWVyciA9IDA7CisJaWYgKHVubGlrZWx5KHJodF9ncm93X2Fib3ZlXzEwMChodCwgdGJsKSkpCisJCWdvdG8gc2xvd19wYXRoOwogCiAJaGVhZCA9IHJodF9kZXJlZmVyZW5jZV9idWNrZXQodGJsLT5idWNrZXRzW2hhc2hdLCB0YmwsIGhhc2gpOwogCiAJUkNVX0lOSVRfUE9JTlRFUihvYmotPm5leHQsIGhlYWQpOworCWlmIChyaGxpc3QpIHsKKwkJc3RydWN0IHJobGlzdF9oZWFkICpsaXN0OworCisJCWxpc3QgPSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgcmhsaXN0X2hlYWQsIHJoZWFkKTsKKwkJUkNVX0lOSVRfUE9JTlRFUihsaXN0LT5uZXh0LCBOVUxMKTsKKwl9CiAKIAlyY3VfYXNzaWduX3BvaW50ZXIodGJsLT5idWNrZXRzW2hhc2hdLCBvYmopOwogCkBAIC02NDgsMTEgKzc1MiwxNCBAQAogCWlmIChyaHRfZ3Jvd19hYm92ZV83NShodCwgdGJsKSkKIAkJc2NoZWR1bGVfd29yaygmaHQtPnJ1bl93b3JrKTsKIAorZ29vZDoKKwlkYXRhID0gTlVMTDsKKwogb3V0OgogCXNwaW5fdW5sb2NrX2JoKGxvY2spOwogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gZGF0YTsKIH0KIAogLyoqCkBAIC02NzUsNyArNzgyLDY1IEBACiAJc3RydWN0IHJoYXNodGFibGUgKmh0LCBzdHJ1Y3Qgcmhhc2hfaGVhZCAqb2JqLAogCWNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBwYXJhbXMpCiB7Ci0JcmV0dXJuIF9fcmhhc2h0YWJsZV9pbnNlcnRfZmFzdChodCwgTlVMTCwgb2JqLCBwYXJhbXMpOworCXZvaWQgKnJldDsKKworCXJldCA9IF9fcmhhc2h0YWJsZV9pbnNlcnRfZmFzdChodCwgTlVMTCwgb2JqLCBwYXJhbXMsIGZhbHNlKTsKKwlpZiAoSVNfRVJSKHJldCkpCisJCXJldHVybiBQVFJfRVJSKHJldCk7CisKKwlyZXR1cm4gcmV0ID09IE5VTEwgPyAwIDogLUVFWElTVDsKK30KKworLyoqCisgKiByaGx0YWJsZV9pbnNlcnRfa2V5IC0gaW5zZXJ0IG9iamVjdCBpbnRvIGhhc2ggbGlzdCB0YWJsZQorICogQGhsdDoJaGFzaCBsaXN0IHRhYmxlCisgKiBAa2V5Ogl0aGUgcG9pbnRlciB0byB0aGUga2V5CisgKiBAbGlzdDoJcG9pbnRlciB0byBoYXNoIGxpc3QgaGVhZCBpbnNpZGUgb2JqZWN0CisgKiBAcGFyYW1zOgloYXNoIHRhYmxlIHBhcmFtZXRlcnMKKyAqCisgKiBXaWxsIHRha2UgYSBwZXIgYnVja2V0IHNwaW5sb2NrIHRvIHByb3RlY3QgYWdhaW5zdCBtdXR1YWwgbXV0YXRpb25zCisgKiBvbiB0aGUgc2FtZSBidWNrZXQuIE11bHRpcGxlIGluc2VydGlvbnMgbWF5IG9jY3VyIGluIHBhcmFsbGVsIHVubGVzcworICogdGhleSBtYXAgdG8gdGhlIHNhbWUgYnVja2V0IGxvY2suCisgKgorICogSXQgaXMgc2FmZSB0byBjYWxsIHRoaXMgZnVuY3Rpb24gZnJvbSBhdG9taWMgY29udGV4dC4KKyAqCisgKiBXaWxsIHRyaWdnZXIgYW4gYXV0b21hdGljIGRlZmVycmVkIHRhYmxlIHJlc2l6aW5nIGlmIHRoZSBzaXplIGdyb3dzCisgKiBiZXlvbmQgdGhlIHdhdGVybWFyayBpbmRpY2F0ZWQgYnkgZ3Jvd19kZWNpc2lvbigpIHdoaWNoIGNhbiBiZSBwYXNzZWQKKyAqIHRvIHJoYXNodGFibGVfaW5pdCgpLgorICovCitzdGF0aWMgaW5saW5lIGludCByaGx0YWJsZV9pbnNlcnRfa2V5KAorCXN0cnVjdCByaGx0YWJsZSAqaGx0LCBjb25zdCB2b2lkICprZXksIHN0cnVjdCByaGxpc3RfaGVhZCAqbGlzdCwKKwljb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGFyYW1zKQoreworCXJldHVybiBQVFJfRVJSKF9fcmhhc2h0YWJsZV9pbnNlcnRfZmFzdCgmaGx0LT5odCwga2V5LCAmbGlzdC0+cmhlYWQsCisJCQkJCQlwYXJhbXMsIHRydWUpKTsKK30KKworLyoqCisgKiByaGx0YWJsZV9pbnNlcnQgLSBpbnNlcnQgb2JqZWN0IGludG8gaGFzaCBsaXN0IHRhYmxlCisgKiBAaGx0OgloYXNoIGxpc3QgdGFibGUKKyAqIEBsaXN0Oglwb2ludGVyIHRvIGhhc2ggbGlzdCBoZWFkIGluc2lkZSBvYmplY3QKKyAqIEBwYXJhbXM6CWhhc2ggdGFibGUgcGFyYW1ldGVycworICoKKyAqIFdpbGwgdGFrZSBhIHBlciBidWNrZXQgc3BpbmxvY2sgdG8gcHJvdGVjdCBhZ2FpbnN0IG11dHVhbCBtdXRhdGlvbnMKKyAqIG9uIHRoZSBzYW1lIGJ1Y2tldC4gTXVsdGlwbGUgaW5zZXJ0aW9ucyBtYXkgb2NjdXIgaW4gcGFyYWxsZWwgdW5sZXNzCisgKiB0aGV5IG1hcCB0byB0aGUgc2FtZSBidWNrZXQgbG9jay4KKyAqCisgKiBJdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBmcm9tIGF0b21pYyBjb250ZXh0LgorICoKKyAqIFdpbGwgdHJpZ2dlciBhbiBhdXRvbWF0aWMgZGVmZXJyZWQgdGFibGUgcmVzaXppbmcgaWYgdGhlIHNpemUgZ3Jvd3MKKyAqIGJleW9uZCB0aGUgd2F0ZXJtYXJrIGluZGljYXRlZCBieSBncm93X2RlY2lzaW9uKCkgd2hpY2ggY2FuIGJlIHBhc3NlZAorICogdG8gcmhhc2h0YWJsZV9pbml0KCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJobHRhYmxlX2luc2VydCgKKwlzdHJ1Y3QgcmhsdGFibGUgKmhsdCwgc3RydWN0IHJobGlzdF9oZWFkICpsaXN0LAorCWNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBwYXJhbXMpCit7CisJY29uc3QgY2hhciAqa2V5ID0gcmh0X29iaigmaGx0LT5odCwgJmxpc3QtPnJoZWFkKTsKKworCWtleSArPSBwYXJhbXMua2V5X29mZnNldDsKKworCXJldHVybiByaGx0YWJsZV9pbnNlcnRfa2V5KGhsdCwga2V5LCBsaXN0LCBwYXJhbXMpOwogfQogCiAvKioKQEAgLTcwNCwxMSArODY5LDE2IEBACiAJY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHBhcmFtcykKIHsKIAljb25zdCBjaGFyICprZXkgPSByaHRfb2JqKGh0LCBvYmopOworCXZvaWQgKnJldDsKIAogCUJVR19PTihodC0+cC5vYmpfaGFzaGZuKTsKIAotCXJldHVybiBfX3JoYXNodGFibGVfaW5zZXJ0X2Zhc3QoaHQsIGtleSArIGh0LT5wLmtleV9vZmZzZXQsIG9iaiwKLQkJCQkJcGFyYW1zKTsKKwlyZXQgPSBfX3JoYXNodGFibGVfaW5zZXJ0X2Zhc3QoaHQsIGtleSArIGh0LT5wLmtleV9vZmZzZXQsIG9iaiwgcGFyYW1zLAorCQkJCSAgICAgICBmYWxzZSk7CisJaWYgKElTX0VSUihyZXQpKQorCQlyZXR1cm4gUFRSX0VSUihyZXQpOworCisJcmV0dXJuIHJldCA9PSBOVUxMID8gMCA6IC1FRVhJU1Q7CiB9CiAKIC8qKgpAQCAtNzM3LDE1ICs5MDcsNDIgQEAKIAlzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIGNvbnN0IHZvaWQgKmtleSwgc3RydWN0IHJoYXNoX2hlYWQgKm9iaiwKIAljb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGFyYW1zKQogeworCXZvaWQgKnJldDsKKwogCUJVR19PTighaHQtPnAub2JqX2hhc2hmbiB8fCAha2V5KTsKIAotCXJldHVybiBfX3JoYXNodGFibGVfaW5zZXJ0X2Zhc3QoaHQsIGtleSwgb2JqLCBwYXJhbXMpOworCXJldCA9IF9fcmhhc2h0YWJsZV9pbnNlcnRfZmFzdChodCwga2V5LCBvYmosIHBhcmFtcywgZmFsc2UpOworCWlmIChJU19FUlIocmV0KSkKKwkJcmV0dXJuIFBUUl9FUlIocmV0KTsKKworCXJldHVybiByZXQgPT0gTlVMTCA/IDAgOiAtRUVYSVNUOworfQorCisvKioKKyAqIHJoYXNodGFibGVfbG9va3VwX2dldF9pbnNlcnRfa2V5IC0gbG9va3VwIGFuZCBpbnNlcnQgb2JqZWN0IGludG8gaGFzaCB0YWJsZQorICogQGh0OgkJaGFzaCB0YWJsZQorICogQG9iajoJcG9pbnRlciB0byBoYXNoIGhlYWQgaW5zaWRlIG9iamVjdAorICogQHBhcmFtczoJaGFzaCB0YWJsZSBwYXJhbWV0ZXJzCisgKiBAZGF0YToJcG9pbnRlciB0byBlbGVtZW50IGRhdGEgYWxyZWFkeSBpbiBoYXNoZXMKKyAqCisgKiBKdXN0IGxpa2Ugcmhhc2h0YWJsZV9sb29rdXBfaW5zZXJ0X2tleSgpLCBidXQgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZQorICogb2JqZWN0IGlmIGl0IGV4aXN0cywgTlVMTCBpZiBpdCBkb2VzIG5vdCBhbmQgdGhlIGluc2VydGlvbiB3YXMgc3VjY2Vzc2Z1bCwKKyAqIGFuZCBhbiBFUlJfUFRSIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICpyaGFzaHRhYmxlX2xvb2t1cF9nZXRfaW5zZXJ0X2tleSgKKwlzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIGNvbnN0IHZvaWQgKmtleSwgc3RydWN0IHJoYXNoX2hlYWQgKm9iaiwKKwljb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGFyYW1zKQoreworCUJVR19PTighaHQtPnAub2JqX2hhc2hmbiB8fCAha2V5KTsKKworCXJldHVybiBfX3JoYXNodGFibGVfaW5zZXJ0X2Zhc3QoaHQsIGtleSwgb2JqLCBwYXJhbXMsIGZhbHNlKTsKIH0KIAogLyogSW50ZXJuYWwgZnVuY3Rpb24sIHBsZWFzZSB1c2Ugcmhhc2h0YWJsZV9yZW1vdmVfZmFzdCgpIGluc3RlYWQgKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9fcmhhc2h0YWJsZV9yZW1vdmVfZmFzdCgKK3N0YXRpYyBpbmxpbmUgaW50IF9fcmhhc2h0YWJsZV9yZW1vdmVfZmFzdF9vbmUoCiAJc3RydWN0IHJoYXNodGFibGUgKmh0LCBzdHJ1Y3QgYnVja2V0X3RhYmxlICp0YmwsCi0Jc3RydWN0IHJoYXNoX2hlYWQgKm9iaiwgY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHBhcmFtcykKKwlzdHJ1Y3Qgcmhhc2hfaGVhZCAqb2JqLCBjb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGFyYW1zLAorCWJvb2wgcmhsaXN0KQogewogCXN0cnVjdCByaGFzaF9oZWFkIF9fcmN1ICoqcHByZXY7CiAJc3RydWN0IHJoYXNoX2hlYWQgKmhlOwpAQCAtNzYwLDE4ICs5NTcsODYgQEAKIAogCXBwcmV2ID0gJnRibC0+YnVja2V0c1toYXNoXTsKIAlyaHRfZm9yX2VhY2goaGUsIHRibCwgaGFzaCkgeworCQlzdHJ1Y3QgcmhsaXN0X2hlYWQgKmxpc3Q7CisKKwkJbGlzdCA9IGNvbnRhaW5lcl9vZihoZSwgc3RydWN0IHJobGlzdF9oZWFkLCByaGVhZCk7CisKIAkJaWYgKGhlICE9IG9iaikgeworCQkJc3RydWN0IHJobGlzdF9oZWFkIF9fcmN1ICoqbHBwcmV2OworCiAJCQlwcHJldiA9ICZoZS0+bmV4dDsKLQkJCWNvbnRpbnVlOworCisJCQlpZiAoIXJobGlzdCkKKwkJCQljb250aW51ZTsKKworCQkJZG8geworCQkJCWxwcHJldiA9ICZsaXN0LT5uZXh0OworCQkJCWxpc3QgPSByaHRfZGVyZWZlcmVuY2VfYnVja2V0KGxpc3QtPm5leHQsCisJCQkJCQkJICAgICAgdGJsLCBoYXNoKTsKKwkJCX0gd2hpbGUgKGxpc3QgJiYgb2JqICE9ICZsaXN0LT5yaGVhZCk7CisKKwkJCWlmICghbGlzdCkKKwkJCQljb250aW51ZTsKKworCQkJbGlzdCA9IHJodF9kZXJlZmVyZW5jZV9idWNrZXQobGlzdC0+bmV4dCwgdGJsLCBoYXNoKTsKKwkJCVJDVV9JTklUX1BPSU5URVIoKmxwcHJldiwgbGlzdCk7CisJCQllcnIgPSAwOworCQkJYnJlYWs7CiAJCX0KIAotCQlyY3VfYXNzaWduX3BvaW50ZXIoKnBwcmV2LCBvYmotPm5leHQpOwotCQllcnIgPSAwOworCQlvYmogPSByaHRfZGVyZWZlcmVuY2VfYnVja2V0KG9iai0+bmV4dCwgdGJsLCBoYXNoKTsKKwkJZXJyID0gMTsKKworCQlpZiAocmhsaXN0KSB7CisJCQlsaXN0ID0gcmh0X2RlcmVmZXJlbmNlX2J1Y2tldChsaXN0LT5uZXh0LCB0YmwsIGhhc2gpOworCQkJaWYgKGxpc3QpIHsKKwkJCQlSQ1VfSU5JVF9QT0lOVEVSKGxpc3QtPnJoZWFkLm5leHQsIG9iaik7CisJCQkJb2JqID0gJmxpc3QtPnJoZWFkOworCQkJCWVyciA9IDA7CisJCQl9CisJCX0KKworCQlyY3VfYXNzaWduX3BvaW50ZXIoKnBwcmV2LCBvYmopOwogCQlicmVhazsKIAl9CiAKIAlzcGluX3VubG9ja19iaChsb2NrKTsKIAorCWlmIChlcnIgPiAwKSB7CisJCWF0b21pY19kZWMoJmh0LT5uZWxlbXMpOworCQlpZiAodW5saWtlbHkoaHQtPnAuYXV0b21hdGljX3Nocmlua2luZyAmJgorCQkJICAgICByaHRfc2hyaW5rX2JlbG93XzMwKGh0LCB0YmwpKSkKKwkJCXNjaGVkdWxlX3dvcmsoJmh0LT5ydW5fd29yayk7CisJCWVyciA9IDA7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyogSW50ZXJuYWwgZnVuY3Rpb24sIHBsZWFzZSB1c2Ugcmhhc2h0YWJsZV9yZW1vdmVfZmFzdCgpIGluc3RlYWQgKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9fcmhhc2h0YWJsZV9yZW1vdmVfZmFzdCgKKwlzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIHN0cnVjdCByaGFzaF9oZWFkICpvYmosCisJY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHBhcmFtcywgYm9vbCByaGxpc3QpCit7CisJc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsOworCWludCBlcnI7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwl0YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KGh0LT50YmwsIGh0KTsKKworCS8qIEJlY2F1c2Ugd2UgaGF2ZSBhbHJlYWR5IHRha2VuIChhbmQgcmVsZWFzZWQpIHRoZSBidWNrZXQKKwkgKiBsb2NrIGluIG9sZF90YmwsIGlmIHdlIGZpbmQgdGhhdCBmdXR1cmVfdGJsIGlzIG5vdCB5ZXQKKwkgKiB2aXNpYmxlIHRoZW4gdGhhdCBndWFyYW50ZWVzIHRoZSBlbnRyeSB0byBzdGlsbCBiZSBpbgorCSAqIHRoZSBvbGQgdGJsIGlmIGl0IGV4aXN0cy4KKwkgKi8KKwl3aGlsZSAoKGVyciA9IF9fcmhhc2h0YWJsZV9yZW1vdmVfZmFzdF9vbmUoaHQsIHRibCwgb2JqLCBwYXJhbXMsCisJCQkJCQkgICByaGxpc3QpKSAmJgorCSAgICAgICAodGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdSh0YmwtPmZ1dHVyZV90YmwsIGh0KSkpCisJCTsKKworCXJjdV9yZWFkX3VubG9jaygpOworCiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNzk0LDM0ICsxMDU5LDI5IEBACiAJc3RydWN0IHJoYXNodGFibGUgKmh0LCBzdHJ1Y3Qgcmhhc2hfaGVhZCAqb2JqLAogCWNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBwYXJhbXMpCiB7Ci0Jc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsOwotCWludCBlcnI7CisJcmV0dXJuIF9fcmhhc2h0YWJsZV9yZW1vdmVfZmFzdChodCwgb2JqLCBwYXJhbXMsIGZhbHNlKTsKK30KIAotCXJjdV9yZWFkX2xvY2soKTsKLQotCXRibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UoaHQtPnRibCwgaHQpOwotCi0JLyogQmVjYXVzZSB3ZSBoYXZlIGFscmVhZHkgdGFrZW4gKGFuZCByZWxlYXNlZCkgdGhlIGJ1Y2tldAotCSAqIGxvY2sgaW4gb2xkX3RibCwgaWYgd2UgZmluZCB0aGF0IGZ1dHVyZV90YmwgaXMgbm90IHlldAotCSAqIHZpc2libGUgdGhlbiB0aGF0IGd1YXJhbnRlZXMgdGhlIGVudHJ5IHRvIHN0aWxsIGJlIGluCi0JICogdGhlIG9sZCB0YmwgaWYgaXQgZXhpc3RzLgotCSAqLwotCXdoaWxlICgoZXJyID0gX19yaGFzaHRhYmxlX3JlbW92ZV9mYXN0KGh0LCB0YmwsIG9iaiwgcGFyYW1zKSkgJiYKLQkgICAgICAgKHRibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UodGJsLT5mdXR1cmVfdGJsLCBodCkpKQotCQk7Ci0KLQlpZiAoZXJyKQotCQlnb3RvIG91dDsKLQotCWF0b21pY19kZWMoJmh0LT5uZWxlbXMpOwotCWlmICh1bmxpa2VseShodC0+cC5hdXRvbWF0aWNfc2hyaW5raW5nICYmCi0JCSAgICAgcmh0X3Nocmlua19iZWxvd18zMChodCwgdGJsKSkpCi0JCXNjaGVkdWxlX3dvcmsoJmh0LT5ydW5fd29yayk7Ci0KLW91dDoKLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCXJldHVybiBlcnI7CisvKioKKyAqIHJobHRhYmxlX3JlbW92ZSAtIHJlbW92ZSBvYmplY3QgZnJvbSBoYXNoIGxpc3QgdGFibGUKKyAqIEBobHQ6CWhhc2ggbGlzdCB0YWJsZQorICogQGxpc3Q6CXBvaW50ZXIgdG8gaGFzaCBsaXN0IGhlYWQgaW5zaWRlIG9iamVjdAorICogQHBhcmFtczoJaGFzaCB0YWJsZSBwYXJhbWV0ZXJzCisgKgorICogU2luY2UgdGhlIGhhc2ggY2hhaW4gaXMgc2luZ2xlIGxpbmtlZCwgdGhlIHJlbW92YWwgb3BlcmF0aW9uIG5lZWRzIHRvCisgKiB3YWxrIHRoZSBidWNrZXQgY2hhaW4gdXBvbiByZW1vdmFsLiBUaGUgcmVtb3ZhbCBvcGVyYXRpb24gaXMgdGh1cworICogY29uc2lkZXJhYmxlIHNsb3cgaWYgdGhlIGhhc2ggdGFibGUgaXMgbm90IGNvcnJlY3RseSBzaXplZC4KKyAqCisgKiBXaWxsIGF1dG9tYXRpY2FsbHkgc2hyaW5rIHRoZSB0YWJsZSB2aWEgcmhhc2h0YWJsZV9leHBhbmQoKSBpZiB0aGUKKyAqIHNocmlua19kZWNpc2lvbiBmdW5jdGlvbiBzcGVjaWZpZWQgYXQgcmhhc2h0YWJsZV9pbml0KCkgcmV0dXJucyB0cnVlLgorICoKKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCAtRU5PRU5UIGlmIHRoZSBlbnRyeSBjb3VsZCBub3QgYmUgZm91bmQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJobHRhYmxlX3JlbW92ZSgKKwlzdHJ1Y3QgcmhsdGFibGUgKmhsdCwgc3RydWN0IHJobGlzdF9oZWFkICpsaXN0LAorCWNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBwYXJhbXMpCit7CisJcmV0dXJuIF9fcmhhc2h0YWJsZV9yZW1vdmVfZmFzdCgmaGx0LT5odCwgJmxpc3QtPnJoZWFkLCBwYXJhbXMsIHRydWUpOwogfQogCiAvKiBJbnRlcm5hbCBmdW5jdGlvbiwgcGxlYXNlIHVzZSByaGFzaHRhYmxlX3JlcGxhY2VfZmFzdCgpIGluc3RlYWQgKi8KQEAgLTkwNiw0ICsxMTY2LDU5IEBACiAJcmV0dXJuIGVycjsKIH0KIAorLyogT2Jzb2xldGUgZnVuY3Rpb24sIGRvIG5vdCB1c2UgaW4gbmV3IGNvZGUuICovCitzdGF0aWMgaW5saW5lIGludCByaGFzaHRhYmxlX3dhbGtfaW5pdChzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCisJCQkJICAgICAgIHN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgKml0ZXIsIGdmcF90IGdmcCkKK3sKKwlyaGFzaHRhYmxlX3dhbGtfZW50ZXIoaHQsIGl0ZXIpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHJobHRhYmxlX3dhbGtfZW50ZXIgLSBJbml0aWFsaXNlIGFuIGl0ZXJhdG9yCisgKiBAaGx0OglUYWJsZSB0byB3YWxrIG92ZXIKKyAqIEBpdGVyOglIYXNoIHRhYmxlIEl0ZXJhdG9yCisgKgorICogVGhpcyBmdW5jdGlvbiBwcmVwYXJlcyBhIGhhc2ggdGFibGUgd2Fsay4KKyAqCisgKiBOb3RlIHRoYXQgaWYgeW91IHJlc3RhcnQgYSB3YWxrIGFmdGVyIHJoYXNodGFibGVfd2Fsa19zdG9wIHlvdQorICogbWF5IHNlZSB0aGUgc2FtZSBvYmplY3QgdHdpY2UuICBBbHNvLCB5b3UgbWF5IG1pc3Mgb2JqZWN0cyBpZgorICogdGhlcmUgYXJlIHJlbW92YWxzIGluIGJldHdlZW4gcmhhc2h0YWJsZV93YWxrX3N0b3AgYW5kIHRoZSBuZXh0CisgKiBjYWxsIHRvIHJoYXNodGFibGVfd2Fsa19zdGFydC4KKyAqCisgKiBGb3IgYSBjb21wbGV0ZWx5IHN0YWJsZSB3YWxrIHlvdSBzaG91bGQgY29uc3RydWN0IHlvdXIgb3duIGRhdGEKKyAqIHN0cnVjdHVyZSBvdXRzaWRlIHRoZSBoYXNoIHRhYmxlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwIHNvIHlvdSBtdXN0IG5vdCBjYWxsIGl0IGZyb20gaW50ZXJydXB0CisgKiBjb250ZXh0IG9yIHdpdGggc3BpbiBsb2NrcyBoZWxkLgorICoKKyAqIFlvdSBtdXN0IGNhbGwgcmhhc2h0YWJsZV93YWxrX2V4aXQgYWZ0ZXIgdGhpcyBmdW5jdGlvbiByZXR1cm5zLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmhsdGFibGVfd2Fsa19lbnRlcihzdHJ1Y3QgcmhsdGFibGUgKmhsdCwKKwkJCQkgICAgICAgc3RydWN0IHJoYXNodGFibGVfaXRlciAqaXRlcikKK3sKKwlyZXR1cm4gcmhhc2h0YWJsZV93YWxrX2VudGVyKCZobHQtPmh0LCBpdGVyKTsKK30KKworLyoqCisgKiByaGx0YWJsZV9mcmVlX2FuZF9kZXN0cm95IC0gZnJlZSBlbGVtZW50cyBhbmQgZGVzdHJveSBoYXNoIGxpc3QgdGFibGUKKyAqIEBobHQ6CXRoZSBoYXNoIGxpc3QgdGFibGUgdG8gZGVzdHJveQorICogQGZyZWVfZm46CWNhbGxiYWNrIHRvIHJlbGVhc2UgcmVzb3VyY2VzIG9mIGVsZW1lbnQKKyAqIEBhcmc6CXBvaW50ZXIgcGFzc2VkIHRvIGZyZWVfZm4KKyAqCisgKiBTZWUgZG9jdW1lbnRhdGlvbiBmb3Igcmhhc2h0YWJsZV9mcmVlX2FuZF9kZXN0cm95LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmhsdGFibGVfZnJlZV9hbmRfZGVzdHJveShzdHJ1Y3QgcmhsdGFibGUgKmhsdCwKKwkJCQkJICAgICB2b2lkICgqZnJlZV9mbikodm9pZCAqcHRyLAorCQkJCQkJCSAgICAgdm9pZCAqYXJnKSwKKwkJCQkJICAgICB2b2lkICphcmcpCit7CisJcmV0dXJuIHJoYXNodGFibGVfZnJlZV9hbmRfZGVzdHJveSgmaGx0LT5odCwgZnJlZV9mbiwgYXJnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJobHRhYmxlX2Rlc3Ryb3koc3RydWN0IHJobHRhYmxlICpobHQpCit7CisJcmV0dXJuIHJobHRhYmxlX2ZyZWVfYW5kX2Rlc3Ryb3koaGx0LCBOVUxMLCBOVUxMKTsKK30KKwogI2VuZGlmIC8qIF9MSU5VWF9SSEFTSFRBQkxFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcnBtc2cuaCBiL2luY2x1ZGUvbGludXgvcnBtc2cuaAppbmRleCBhZGE1MGZmLi40NTJkMzkzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JwbXNnLmgKKysrIGIvaW5jbHVkZS9saW51eC9ycG1zZy5oCkBAIC00MSw2NSArNDEsMjcgQEAKICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAotLyogVGhlIGZlYXR1cmUgYml0bWFwIGZvciB2aXJ0aW8gcnBtc2cgKi8KLSNkZWZpbmUgVklSVElPX1JQTVNHX0ZfTlMJMCAvKiBSUCBzdXBwb3J0cyBuYW1lIHNlcnZpY2Ugbm90aWZpY2F0aW9ucyAqLwotCi0vKioKLSAqIHN0cnVjdCBycG1zZ19oZHIgLSBjb21tb24gaGVhZGVyIGZvciBhbGwgcnBtc2cgbWVzc2FnZXMKLSAqIEBzcmM6IHNvdXJjZSBhZGRyZXNzCi0gKiBAZHN0OiBkZXN0aW5hdGlvbiBhZGRyZXNzCi0gKiBAcmVzZXJ2ZWQ6IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlCi0gKiBAbGVuOiBsZW5ndGggb2YgcGF5bG9hZCAoaW4gYnl0ZXMpCi0gKiBAZmxhZ3M6IG1lc3NhZ2UgZmxhZ3MKLSAqIEBkYXRhOiBAbGVuIGJ5dGVzIG9mIG1lc3NhZ2UgcGF5bG9hZCBkYXRhCi0gKgotICogRXZlcnkgbWVzc2FnZSBzZW50KC9yZWNlaXZlZCkgb24gdGhlIHJwbXNnIGJ1cyBiZWdpbnMgd2l0aCB0aGlzIGhlYWRlci4KLSAqLwotc3RydWN0IHJwbXNnX2hkciB7Ci0JdTMyIHNyYzsKLQl1MzIgZHN0OwotCXUzMiByZXNlcnZlZDsKLQl1MTYgbGVuOwotCXUxNiBmbGFnczsKLQl1OCBkYXRhWzBdOwotfSBfX3BhY2tlZDsKLQotLyoqCi0gKiBzdHJ1Y3QgcnBtc2dfbnNfbXNnIC0gZHluYW1pYyBuYW1lIHNlcnZpY2UgYW5ub3VuY2VtZW50IG1lc3NhZ2UKLSAqIEBuYW1lOiBuYW1lIG9mIHJlbW90ZSBzZXJ2aWNlIHRoYXQgaXMgcHVibGlzaGVkCi0gKiBAYWRkcjogYWRkcmVzcyBvZiByZW1vdGUgc2VydmljZSB0aGF0IGlzIHB1Ymxpc2hlZAotICogQGZsYWdzOiBpbmRpY2F0ZXMgd2hldGhlciBzZXJ2aWNlIGlzIGNyZWF0ZWQgb3IgZGVzdHJveWVkCi0gKgotICogVGhpcyBtZXNzYWdlIGlzIHNlbnQgYWNyb3NzIHRvIHB1Ymxpc2ggYSBuZXcgc2VydmljZSwgb3IgYW5ub3VuY2UKLSAqIGFib3V0IGl0cyByZW1vdmFsLiBXaGVuIHdlIHJlY2VpdmUgdGhlc2UgbWVzc2FnZXMsIGFuIGFwcHJvcHJpYXRlCi0gKiBycG1zZyBjaGFubmVsIChpLmUgZGV2aWNlKSBpcyBjcmVhdGVkL2Rlc3Ryb3llZC4gSW4gdHVybiwgdGhlIC0+cHJvYmUoKQotICogb3IgLT5yZW1vdmUoKSBoYW5kbGVyIG9mIHRoZSBhcHByb3ByaWF0ZSBycG1zZyBkcml2ZXIgd2lsbCBiZSBpbnZva2VkCi0gKiAoaWYvYXMtc29vbi1hcyBvbmUgaXMgcmVnaXN0ZXJlZCkuCi0gKi8KLXN0cnVjdCBycG1zZ19uc19tc2cgewotCWNoYXIgbmFtZVtSUE1TR19OQU1FX1NJWkVdOwotCXUzMiBhZGRyOwotCXUzMiBmbGFnczsKLX0gX19wYWNrZWQ7Ci0KLS8qKgotICogZW51bSBycG1zZ19uc19mbGFncyAtIGR5bmFtaWMgbmFtZSBzZXJ2aWNlIGFubm91bmNlbWVudCBmbGFncwotICoKLSAqIEBSUE1TR19OU19DUkVBVEU6IGEgbmV3IHJlbW90ZSBzZXJ2aWNlIHdhcyBqdXN0IGNyZWF0ZWQKLSAqIEBSUE1TR19OU19ERVNUUk9ZOiBhIGtub3duIHJlbW90ZSBzZXJ2aWNlIHdhcyBqdXN0IGRlc3Ryb3llZAotICovCi1lbnVtIHJwbXNnX25zX2ZsYWdzIHsKLQlSUE1TR19OU19DUkVBVEUJCT0gMCwKLQlSUE1TR19OU19ERVNUUk9ZCT0gMSwKLX07Ci0KICNkZWZpbmUgUlBNU0dfQUREUl9BTlkJCTB4RkZGRkZGRkYKIAotc3RydWN0IHZpcnRwcm9jX2luZm87CitzdHJ1Y3QgcnBtc2dfZGV2aWNlOworc3RydWN0IHJwbXNnX2VuZHBvaW50Oworc3RydWN0IHJwbXNnX2RldmljZV9vcHM7CitzdHJ1Y3QgcnBtc2dfZW5kcG9pbnRfb3BzOwogCiAvKioKLSAqIHJwbXNnX2NoYW5uZWwgLSBkZXZpY2VzIHRoYXQgYmVsb25nIHRvIHRoZSBycG1zZyBidXMgYXJlIGNhbGxlZCBjaGFubmVscwotICogQHZycDogdGhlIHJlbW90ZSBwcm9jZXNzb3IgdGhpcyBjaGFubmVsIGJlbG9uZ3MgdG8KKyAqIHN0cnVjdCBycG1zZ19jaGFubmVsX2luZm8gLSBjaGFubmVsIGluZm8gcmVwcmVzZW50YXRpb24KKyAqIEBuYW1lOiBuYW1lIG9mIHNlcnZpY2UKKyAqIEBzcmM6IGxvY2FsIGFkZHJlc3MKKyAqIEBkc3Q6IGRlc3RpbmF0aW9uIGFkZHJlc3MKKyAqLworc3RydWN0IHJwbXNnX2NoYW5uZWxfaW5mbyB7CisJY2hhciBuYW1lW1JQTVNHX05BTUVfU0laRV07CisJdTMyIHNyYzsKKwl1MzIgZHN0OworfTsKKworLyoqCisgKiBycG1zZ19kZXZpY2UgLSBkZXZpY2UgdGhhdCBiZWxvbmcgdG8gdGhlIHJwbXNnIGJ1cwogICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3QKICAqIEBpZDogZGV2aWNlIGlkICh1c2VkIHRvIG1hdGNoIGJldHdlZW4gcnBtc2cgZHJpdmVycyBhbmQgZGV2aWNlcykKICAqIEBzcmM6IGxvY2FsIGFkZHJlc3MKQEAgLTEwNywxNyArNjksMTggQEAKICAqIEBlcHQ6IHRoZSBycG1zZyBlbmRwb2ludCBvZiB0aGlzIGNoYW5uZWwKICAqIEBhbm5vdW5jZTogaWYgc2V0LCBycG1zZyB3aWxsIGFubm91bmNlIHRoZSBjcmVhdGlvbi9yZW1vdmFsIG9mIHRoaXMgY2hhbm5lbAogICovCi1zdHJ1Y3QgcnBtc2dfY2hhbm5lbCB7Ci0Jc3RydWN0IHZpcnRwcm9jX2luZm8gKnZycDsKK3N0cnVjdCBycG1zZ19kZXZpY2UgewogCXN0cnVjdCBkZXZpY2UgZGV2OwogCXN0cnVjdCBycG1zZ19kZXZpY2VfaWQgaWQ7CiAJdTMyIHNyYzsKIAl1MzIgZHN0OwogCXN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0OwogCWJvb2wgYW5ub3VuY2U7CisKKwljb25zdCBzdHJ1Y3QgcnBtc2dfZGV2aWNlX29wcyAqb3BzOwogfTsKIAotdHlwZWRlZiB2b2lkICgqcnBtc2dfcnhfY2JfdCkoc3RydWN0IHJwbXNnX2NoYW5uZWwgKiwgdm9pZCAqLCBpbnQsIHZvaWQgKiwgdTMyKTsKK3R5cGVkZWYgaW50ICgqcnBtc2dfcnhfY2JfdCkoc3RydWN0IHJwbXNnX2RldmljZSAqLCB2b2lkICosIGludCwgdm9pZCAqLCB1MzIpOwogCiAvKioKICAqIHN0cnVjdCBycG1zZ19lbmRwb2ludCAtIGJpbmRzIGEgbG9jYWwgcnBtc2cgYWRkcmVzcyB0byBpdHMgdXNlcgpAQCAtMTQzLDEyICsxMDYsMTQgQEAKICAqIGNyZWF0ZSBhZGRpdGlvbmFsIGVuZHBvaW50cyBieSB0aGVtc2VsdmVzIChzZWUgcnBtc2dfY3JlYXRlX2VwdCgpKS4KICAqLwogc3RydWN0IHJwbXNnX2VuZHBvaW50IHsKLQlzdHJ1Y3QgcnBtc2dfY2hhbm5lbCAqcnBkZXY7CisJc3RydWN0IHJwbXNnX2RldmljZSAqcnBkZXY7CiAJc3RydWN0IGtyZWYgcmVmY291bnQ7CiAJcnBtc2dfcnhfY2JfdCBjYjsKIAlzdHJ1Y3QgbXV0ZXggY2JfbG9jazsKIAl1MzIgYWRkcjsKIAl2b2lkICpwcml2OworCisJY29uc3Qgc3RydWN0IHJwbXNnX2VuZHBvaW50X29wcyAqb3BzOwogfTsKIAogLyoqCkBAIC0xNjIsMjAgKzEyNywxOSBAQAogc3RydWN0IHJwbXNnX2RyaXZlciB7CiAJc3RydWN0IGRldmljZV9kcml2ZXIgZHJ2OwogCWNvbnN0IHN0cnVjdCBycG1zZ19kZXZpY2VfaWQgKmlkX3RhYmxlOwotCWludCAoKnByb2JlKShzdHJ1Y3QgcnBtc2dfY2hhbm5lbCAqZGV2KTsKLQl2b2lkICgqcmVtb3ZlKShzdHJ1Y3QgcnBtc2dfY2hhbm5lbCAqZGV2KTsKLQl2b2lkICgqY2FsbGJhY2spKHN0cnVjdCBycG1zZ19jaGFubmVsICosIHZvaWQgKiwgaW50LCB2b2lkICosIHUzMik7CisJaW50ICgqcHJvYmUpKHN0cnVjdCBycG1zZ19kZXZpY2UgKmRldik7CisJdm9pZCAoKnJlbW92ZSkoc3RydWN0IHJwbXNnX2RldmljZSAqZGV2KTsKKwlpbnQgKCpjYWxsYmFjaykoc3RydWN0IHJwbXNnX2RldmljZSAqLCB2b2lkICosIGludCwgdm9pZCAqLCB1MzIpOwogfTsKIAotaW50IHJlZ2lzdGVyX3JwbXNnX2RldmljZShzdHJ1Y3QgcnBtc2dfY2hhbm5lbCAqZGV2KTsKLXZvaWQgdW5yZWdpc3Rlcl9ycG1zZ19kZXZpY2Uoc3RydWN0IHJwbXNnX2NoYW5uZWwgKmRldik7CitpbnQgcmVnaXN0ZXJfcnBtc2dfZGV2aWNlKHN0cnVjdCBycG1zZ19kZXZpY2UgKmRldik7Cit2b2lkIHVucmVnaXN0ZXJfcnBtc2dfZGV2aWNlKHN0cnVjdCBycG1zZ19kZXZpY2UgKmRldik7CiBpbnQgX19yZWdpc3Rlcl9ycG1zZ19kcml2ZXIoc3RydWN0IHJwbXNnX2RyaXZlciAqZHJ2LCBzdHJ1Y3QgbW9kdWxlICpvd25lcik7CiB2b2lkIHVucmVnaXN0ZXJfcnBtc2dfZHJpdmVyKHN0cnVjdCBycG1zZ19kcml2ZXIgKmRydik7CiB2b2lkIHJwbXNnX2Rlc3Ryb3lfZXB0KHN0cnVjdCBycG1zZ19lbmRwb2ludCAqKTsKLXN0cnVjdCBycG1zZ19lbmRwb2ludCAqcnBtc2dfY3JlYXRlX2VwdChzdHJ1Y3QgcnBtc2dfY2hhbm5lbCAqLAotCQkJCXJwbXNnX3J4X2NiX3QgY2IsIHZvaWQgKnByaXYsIHUzMiBhZGRyKTsKLWludAotcnBtc2dfc2VuZF9vZmZjaGFubmVsX3JhdyhzdHJ1Y3QgcnBtc2dfY2hhbm5lbCAqLCB1MzIsIHUzMiwgdm9pZCAqLCBpbnQsIGJvb2wpOworc3RydWN0IHJwbXNnX2VuZHBvaW50ICpycG1zZ19jcmVhdGVfZXB0KHN0cnVjdCBycG1zZ19kZXZpY2UgKiwKKwkJCQkJcnBtc2dfcnhfY2JfdCBjYiwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHJwbXNnX2NoYW5uZWxfaW5mbyBjaGluZm8pOwogCiAvKiB1c2UgYSBtYWNybyB0byBhdm9pZCBpbmNsdWRlIGNoYWluaW5nIHRvIGdldCBUSElTX01PRFVMRSAqLwogI2RlZmluZSByZWdpc3Rlcl9ycG1zZ19kcml2ZXIoZHJ2KSBcCkBAIC0xOTMsMTU2ICsxNTcsMTQgQEAKIAltb2R1bGVfZHJpdmVyKF9fcnBtc2dfZHJpdmVyLCByZWdpc3Rlcl9ycG1zZ19kcml2ZXIsIFwKIAkJCXVucmVnaXN0ZXJfcnBtc2dfZHJpdmVyKQogCi0vKioKLSAqIHJwbXNnX3NlbmQoKSAtIHNlbmQgYSBtZXNzYWdlIGFjcm9zcyB0byB0aGUgcmVtb3RlIHByb2Nlc3NvcgotICogQHJwZGV2OiB0aGUgcnBtc2cgY2hhbm5lbAotICogQGRhdGE6IHBheWxvYWQgb2YgbWVzc2FnZQotICogQGxlbjogbGVuZ3RoIG9mIHBheWxvYWQKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIEBkYXRhIG9mIGxlbmd0aCBAbGVuIG9uIHRoZSBAcnBkZXYgY2hhbm5lbC4KLSAqIFRoZSBtZXNzYWdlIHdpbGwgYmUgc2VudCB0byB0aGUgcmVtb3RlIHByb2Nlc3NvciB3aGljaCB0aGUgQHJwZGV2Ci0gKiBjaGFubmVsIGJlbG9uZ3MgdG8sIHVzaW5nIEBycGRldidzIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYWRkcmVzc2VzLgotICogSW4gY2FzZSB0aGVyZSBhcmUgbm8gVFggYnVmZmVycyBhdmFpbGFibGUsIHRoZSBmdW5jdGlvbiB3aWxsIGJsb2NrIHVudGlsCi0gKiBvbmUgYmVjb21lcyBhdmFpbGFibGUsIG9yIGEgdGltZW91dCBvZiAxNSBzZWNvbmRzIGVsYXBzZXMuIFdoZW4gdGhlIGxhdHRlcgotICogaGFwcGVucywgLUVSRVNUQVJUU1lTIGlzIHJldHVybmVkLgotICoKLSAqIENhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIHByb2Nlc3MgY29udGV4dCAoZm9yIG5vdykuCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIHZhbHVlIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHJwbXNnX3NlbmQoc3RydWN0IHJwbXNnX2NoYW5uZWwgKnJwZGV2LCB2b2lkICpkYXRhLCBpbnQgbGVuKQotewotCXUzMiBzcmMgPSBycGRldi0+c3JjLCBkc3QgPSBycGRldi0+ZHN0OworaW50IHJwbXNnX3NlbmQoc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQsIHZvaWQgKmRhdGEsIGludCBsZW4pOworaW50IHJwbXNnX3NlbmR0byhzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdCwgdm9pZCAqZGF0YSwgaW50IGxlbiwgdTMyIGRzdCk7CitpbnQgcnBtc2dfc2VuZF9vZmZjaGFubmVsKHN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0LCB1MzIgc3JjLCB1MzIgZHN0LAorCQkJICB2b2lkICpkYXRhLCBpbnQgbGVuKTsKIAotCXJldHVybiBycG1zZ19zZW5kX29mZmNoYW5uZWxfcmF3KHJwZGV2LCBzcmMsIGRzdCwgZGF0YSwgbGVuLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBycG1zZ19zZW5kdG8oKSAtIHNlbmQgYSBtZXNzYWdlIGFjcm9zcyB0byB0aGUgcmVtb3RlIHByb2Nlc3Nvciwgc3BlY2lmeSBkc3QKLSAqIEBycGRldjogdGhlIHJwbXNnIGNoYW5uZWwKLSAqIEBkYXRhOiBwYXlsb2FkIG9mIG1lc3NhZ2UKLSAqIEBsZW46IGxlbmd0aCBvZiBwYXlsb2FkCi0gKiBAZHN0OiBkZXN0aW5hdGlvbiBhZGRyZXNzCi0gKgotICogVGhpcyBmdW5jdGlvbiBzZW5kcyBAZGF0YSBvZiBsZW5ndGggQGxlbiB0byB0aGUgcmVtb3RlIEBkc3QgYWRkcmVzcy4KLSAqIFRoZSBtZXNzYWdlIHdpbGwgYmUgc2VudCB0byB0aGUgcmVtb3RlIHByb2Nlc3NvciB3aGljaCB0aGUgQHJwZGV2Ci0gKiBjaGFubmVsIGJlbG9uZ3MgdG8sIHVzaW5nIEBycGRldidzIHNvdXJjZSBhZGRyZXNzLgotICogSW4gY2FzZSB0aGVyZSBhcmUgbm8gVFggYnVmZmVycyBhdmFpbGFibGUsIHRoZSBmdW5jdGlvbiB3aWxsIGJsb2NrIHVudGlsCi0gKiBvbmUgYmVjb21lcyBhdmFpbGFibGUsIG9yIGEgdGltZW91dCBvZiAxNSBzZWNvbmRzIGVsYXBzZXMuIFdoZW4gdGhlIGxhdHRlcgotICogaGFwcGVucywgLUVSRVNUQVJUU1lTIGlzIHJldHVybmVkLgotICoKLSAqIENhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIHByb2Nlc3MgY29udGV4dCAoZm9yIG5vdykuCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIHZhbHVlIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXRpYyBpbmxpbmUKLWludCBycG1zZ19zZW5kdG8oc3RydWN0IHJwbXNnX2NoYW5uZWwgKnJwZGV2LCB2b2lkICpkYXRhLCBpbnQgbGVuLCB1MzIgZHN0KQotewotCXUzMiBzcmMgPSBycGRldi0+c3JjOwotCi0JcmV0dXJuIHJwbXNnX3NlbmRfb2ZmY2hhbm5lbF9yYXcocnBkZXYsIHNyYywgZHN0LCBkYXRhLCBsZW4sIHRydWUpOwotfQotCi0vKioKLSAqIHJwbXNnX3NlbmRfb2ZmY2hhbm5lbCgpIC0gc2VuZCBhIG1lc3NhZ2UgdXNpbmcgZXhwbGljaXQgc3JjL2RzdCBhZGRyZXNzZXMKLSAqIEBycGRldjogdGhlIHJwbXNnIGNoYW5uZWwKLSAqIEBzcmM6IHNvdXJjZSBhZGRyZXNzCi0gKiBAZHN0OiBkZXN0aW5hdGlvbiBhZGRyZXNzCi0gKiBAZGF0YTogcGF5bG9hZCBvZiBtZXNzYWdlCi0gKiBAbGVuOiBsZW5ndGggb2YgcGF5bG9hZAotICoKLSAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgQGRhdGEgb2YgbGVuZ3RoIEBsZW4gdG8gdGhlIHJlbW90ZSBAZHN0IGFkZHJlc3MsCi0gKiBhbmQgdXNlcyBAc3JjIGFzIHRoZSBzb3VyY2UgYWRkcmVzcy4KLSAqIFRoZSBtZXNzYWdlIHdpbGwgYmUgc2VudCB0byB0aGUgcmVtb3RlIHByb2Nlc3NvciB3aGljaCB0aGUgQHJwZGV2Ci0gKiBjaGFubmVsIGJlbG9uZ3MgdG8uCi0gKiBJbiBjYXNlIHRoZXJlIGFyZSBubyBUWCBidWZmZXJzIGF2YWlsYWJsZSwgdGhlIGZ1bmN0aW9uIHdpbGwgYmxvY2sgdW50aWwKLSAqIG9uZSBiZWNvbWVzIGF2YWlsYWJsZSwgb3IgYSB0aW1lb3V0IG9mIDE1IHNlY29uZHMgZWxhcHNlcy4gV2hlbiB0aGUgbGF0dGVyCi0gKiBoYXBwZW5zLCAtRVJFU1RBUlRTWVMgaXMgcmV0dXJuZWQuCi0gKgotICogQ2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gcHJvY2VzcyBjb250ZXh0IChmb3Igbm93KS4KLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3IgdmFsdWUgb24gZmFpbHVyZS4KLSAqLwotc3RhdGljIGlubGluZQotaW50IHJwbXNnX3NlbmRfb2ZmY2hhbm5lbChzdHJ1Y3QgcnBtc2dfY2hhbm5lbCAqcnBkZXYsIHUzMiBzcmMsIHUzMiBkc3QsCi0JCQkJCQkJdm9pZCAqZGF0YSwgaW50IGxlbikKLXsKLQlyZXR1cm4gcnBtc2dfc2VuZF9vZmZjaGFubmVsX3JhdyhycGRldiwgc3JjLCBkc3QsIGRhdGEsIGxlbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogcnBtc2dfc2VuZCgpIC0gc2VuZCBhIG1lc3NhZ2UgYWNyb3NzIHRvIHRoZSByZW1vdGUgcHJvY2Vzc29yCi0gKiBAcnBkZXY6IHRoZSBycG1zZyBjaGFubmVsCi0gKiBAZGF0YTogcGF5bG9hZCBvZiBtZXNzYWdlCi0gKiBAbGVuOiBsZW5ndGggb2YgcGF5bG9hZAotICoKLSAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgQGRhdGEgb2YgbGVuZ3RoIEBsZW4gb24gdGhlIEBycGRldiBjaGFubmVsLgotICogVGhlIG1lc3NhZ2Ugd2lsbCBiZSBzZW50IHRvIHRoZSByZW1vdGUgcHJvY2Vzc29yIHdoaWNoIHRoZSBAcnBkZXYKLSAqIGNoYW5uZWwgYmVsb25ncyB0bywgdXNpbmcgQHJwZGV2J3Mgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMuCi0gKiBJbiBjYXNlIHRoZXJlIGFyZSBubyBUWCBidWZmZXJzIGF2YWlsYWJsZSwgdGhlIGZ1bmN0aW9uIHdpbGwgaW1tZWRpYXRlbHkKLSAqIHJldHVybiAtRU5PTUVNIHdpdGhvdXQgd2FpdGluZyB1bnRpbCBvbmUgYmVjb21lcyBhdmFpbGFibGUuCi0gKgotICogQ2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gcHJvY2VzcyBjb250ZXh0IChmb3Igbm93KS4KLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3IgdmFsdWUgb24gZmFpbHVyZS4KLSAqLwotc3RhdGljIGlubGluZQotaW50IHJwbXNnX3RyeXNlbmQoc3RydWN0IHJwbXNnX2NoYW5uZWwgKnJwZGV2LCB2b2lkICpkYXRhLCBpbnQgbGVuKQotewotCXUzMiBzcmMgPSBycGRldi0+c3JjLCBkc3QgPSBycGRldi0+ZHN0OwotCi0JcmV0dXJuIHJwbXNnX3NlbmRfb2ZmY2hhbm5lbF9yYXcocnBkZXYsIHNyYywgZHN0LCBkYXRhLCBsZW4sIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBycG1zZ19zZW5kdG8oKSAtIHNlbmQgYSBtZXNzYWdlIGFjcm9zcyB0byB0aGUgcmVtb3RlIHByb2Nlc3Nvciwgc3BlY2lmeSBkc3QKLSAqIEBycGRldjogdGhlIHJwbXNnIGNoYW5uZWwKLSAqIEBkYXRhOiBwYXlsb2FkIG9mIG1lc3NhZ2UKLSAqIEBsZW46IGxlbmd0aCBvZiBwYXlsb2FkCi0gKiBAZHN0OiBkZXN0aW5hdGlvbiBhZGRyZXNzCi0gKgotICogVGhpcyBmdW5jdGlvbiBzZW5kcyBAZGF0YSBvZiBsZW5ndGggQGxlbiB0byB0aGUgcmVtb3RlIEBkc3QgYWRkcmVzcy4KLSAqIFRoZSBtZXNzYWdlIHdpbGwgYmUgc2VudCB0byB0aGUgcmVtb3RlIHByb2Nlc3NvciB3aGljaCB0aGUgQHJwZGV2Ci0gKiBjaGFubmVsIGJlbG9uZ3MgdG8sIHVzaW5nIEBycGRldidzIHNvdXJjZSBhZGRyZXNzLgotICogSW4gY2FzZSB0aGVyZSBhcmUgbm8gVFggYnVmZmVycyBhdmFpbGFibGUsIHRoZSBmdW5jdGlvbiB3aWxsIGltbWVkaWF0ZWx5Ci0gKiByZXR1cm4gLUVOT01FTSB3aXRob3V0IHdhaXRpbmcgdW50aWwgb25lIGJlY29tZXMgYXZhaWxhYmxlLgotICoKLSAqIENhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIHByb2Nlc3MgY29udGV4dCAoZm9yIG5vdykuCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIHZhbHVlIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXRpYyBpbmxpbmUKLWludCBycG1zZ190cnlzZW5kdG8oc3RydWN0IHJwbXNnX2NoYW5uZWwgKnJwZGV2LCB2b2lkICpkYXRhLCBpbnQgbGVuLCB1MzIgZHN0KQotewotCXUzMiBzcmMgPSBycGRldi0+c3JjOwotCi0JcmV0dXJuIHJwbXNnX3NlbmRfb2ZmY2hhbm5lbF9yYXcocnBkZXYsIHNyYywgZHN0LCBkYXRhLCBsZW4sIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBycG1zZ19zZW5kX29mZmNoYW5uZWwoKSAtIHNlbmQgYSBtZXNzYWdlIHVzaW5nIGV4cGxpY2l0IHNyYy9kc3QgYWRkcmVzc2VzCi0gKiBAcnBkZXY6IHRoZSBycG1zZyBjaGFubmVsCi0gKiBAc3JjOiBzb3VyY2UgYWRkcmVzcwotICogQGRzdDogZGVzdGluYXRpb24gYWRkcmVzcwotICogQGRhdGE6IHBheWxvYWQgb2YgbWVzc2FnZQotICogQGxlbjogbGVuZ3RoIG9mIHBheWxvYWQKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIEBkYXRhIG9mIGxlbmd0aCBAbGVuIHRvIHRoZSByZW1vdGUgQGRzdCBhZGRyZXNzLAotICogYW5kIHVzZXMgQHNyYyBhcyB0aGUgc291cmNlIGFkZHJlc3MuCi0gKiBUaGUgbWVzc2FnZSB3aWxsIGJlIHNlbnQgdG8gdGhlIHJlbW90ZSBwcm9jZXNzb3Igd2hpY2ggdGhlIEBycGRldgotICogY2hhbm5lbCBiZWxvbmdzIHRvLgotICogSW4gY2FzZSB0aGVyZSBhcmUgbm8gVFggYnVmZmVycyBhdmFpbGFibGUsIHRoZSBmdW5jdGlvbiB3aWxsIGltbWVkaWF0ZWx5Ci0gKiByZXR1cm4gLUVOT01FTSB3aXRob3V0IHdhaXRpbmcgdW50aWwgb25lIGJlY29tZXMgYXZhaWxhYmxlLgotICoKLSAqIENhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIHByb2Nlc3MgY29udGV4dCAoZm9yIG5vdykuCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIHZhbHVlIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXRpYyBpbmxpbmUKLWludCBycG1zZ190cnlzZW5kX29mZmNoYW5uZWwoc3RydWN0IHJwbXNnX2NoYW5uZWwgKnJwZGV2LCB1MzIgc3JjLCB1MzIgZHN0LAotCQkJCQkJCXZvaWQgKmRhdGEsIGludCBsZW4pCi17Ci0JcmV0dXJuIHJwbXNnX3NlbmRfb2ZmY2hhbm5lbF9yYXcocnBkZXYsIHNyYywgZHN0LCBkYXRhLCBsZW4sIGZhbHNlKTsKLX0KK2ludCBycG1zZ190cnlzZW5kKHN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0LCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKK2ludCBycG1zZ190cnlzZW5kdG8oc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQsIHZvaWQgKmRhdGEsIGludCBsZW4sIHUzMiBkc3QpOworaW50IHJwbXNnX3RyeXNlbmRfb2ZmY2hhbm5lbChzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdCwgdTMyIHNyYywgdTMyIGRzdCwKKwkJCSAgICAgdm9pZCAqZGF0YSwgaW50IGxlbik7CiAKICNlbmRpZiAvKiBfTElOVVhfUlBNU0dfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ydG5ldGxpbmsuaCBiL2luY2x1ZGUvbGludXgvcnRuZXRsaW5rLmgKaW5kZXggMmRhZWNlOC4uNTdlNTQ4NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ydG5ldGxpbmsuaAorKysgYi9pbmNsdWRlL2xpbnV4L3J0bmV0bGluay5oCkBAIC0xMDUsNyArMTA1LDcgQEAKIAkJCSAgICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAogCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZmlsdGVyX2RldiwKLQkJCSAgICAgaW50IGlkeCk7CisJCQkgICAgIGludCAqaWR4KTsKIGV4dGVybiBpbnQgbmRvX2RmbHRfZmRiX2FkZChzdHJ1Y3QgbmRtc2cgKm5kbSwKIAkJCSAgICBzdHJ1Y3QgbmxhdHRyICp0YltdLAogCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKaW5kZXggNjJjNjhlNS4uNzU0M2E0NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2NoZWQuaApAQCAtNDQ4LDYgKzQ0OCw4IEBACiAJaW9fc2NoZWR1bGVfdGltZW91dChNQVhfU0NIRURVTEVfVElNRU9VVCk7CiB9CiAKK3ZvaWQgX19ub3JldHVybiBkb190YXNrX2RlYWQodm9pZCk7CisKIHN0cnVjdCBuc3Byb3h5Owogc3RydWN0IHVzZXJfbmFtZXNwYWNlOwogCkBAIC0xMDIyLDcgKzEwMjQsOCBAQAogI2RlZmluZSBTRF9CQUxBTkNFX0ZPUksJCTB4MDAwOAkvKiBCYWxhbmNlIG9uIGZvcmssIGNsb25lICovCiAjZGVmaW5lIFNEX0JBTEFOQ0VfV0FLRQkJMHgwMDEwICAvKiBCYWxhbmNlIG9uIHdha2V1cCAqLwogI2RlZmluZSBTRF9XQUtFX0FGRklORQkJMHgwMDIwCS8qIFdha2UgdGFzayB0byB3YWtpbmcgQ1BVICovCi0jZGVmaW5lIFNEX1NIQVJFX0NQVUNBUEFDSVRZCTB4MDA4MAkvKiBEb21haW4gbWVtYmVycyBzaGFyZSBjcHUgcG93ZXIgKi8KKyNkZWZpbmUgU0RfQVNZTV9DUFVDQVBBQ0lUWQkweDAwNDAgIC8qIEdyb3VwcyBoYXZlIGRpZmZlcmVudCBtYXggY3B1IGNhcGFjaXRpZXMgKi8KKyNkZWZpbmUgU0RfU0hBUkVfQ1BVQ0FQQUNJVFkJMHgwMDgwCS8qIERvbWFpbiBtZW1iZXJzIHNoYXJlIGNwdSBjYXBhY2l0eSAqLwogI2RlZmluZSBTRF9TSEFSRV9QT1dFUkRPTUFJTgkweDAxMDAJLyogRG9tYWluIG1lbWJlcnMgc2hhcmUgcG93ZXIgZG9tYWluICovCiAjZGVmaW5lIFNEX1NIQVJFX1BLR19SRVNPVVJDRVMJMHgwMjAwCS8qIERvbWFpbiBtZW1iZXJzIHNoYXJlIGNwdSBwa2cgcmVzb3VyY2VzICovCiAjZGVmaW5lIFNEX1NFUklBTElaRQkJMHgwNDAwCS8qIE9ubHkgYSBzaW5nbGUgbG9hZCBiYWxhbmNpbmcgaW5zdGFuY2UgKi8KQEAgLTEwNjQsNiArMTA2NywxMiBAQAogCiBzdHJ1Y3Qgc2NoZWRfZ3JvdXA7CiAKK3N0cnVjdCBzY2hlZF9kb21haW5fc2hhcmVkIHsKKwlhdG9taWNfdAlyZWY7CisJYXRvbWljX3QJbnJfYnVzeV9jcHVzOworCWludAkJaGFzX2lkbGVfY29yZXM7Cit9OworCiBzdHJ1Y3Qgc2NoZWRfZG9tYWluIHsKIAkvKiBUaGVzZSBmaWVsZHMgbXVzdCBiZSBzZXR1cCAqLwogCXN0cnVjdCBzY2hlZF9kb21haW4gKnBhcmVudDsJLyogdG9wIGRvbWFpbiBtdXN0IGJlIG51bGwgdGVybWluYXRlZCAqLwpAQCAtMTA5NCw2ICsxMTAzLDggQEAKIAl1NjQgbWF4X25ld2lkbGVfbGJfY29zdDsKIAl1bnNpZ25lZCBsb25nIG5leHRfZGVjYXlfbWF4X2xiX2Nvc3Q7CiAKKwl1NjQgYXZnX3NjYW5fY29zdDsJCS8qIHNlbGVjdF9pZGxlX3NpYmxpbmcgKi8KKwogI2lmZGVmIENPTkZJR19TQ0hFRFNUQVRTCiAJLyogbG9hZF9iYWxhbmNlKCkgc3RhdHMgKi8KIAl1bnNpZ25lZCBpbnQgbGJfY291bnRbQ1BVX01BWF9JRExFX1RZUEVTXTsKQEAgLTExMzIsNiArMTE0Myw3IEBACiAJCXZvaWQgKnByaXZhdGU7CQkvKiB1c2VkIGR1cmluZyBjb25zdHJ1Y3Rpb24gKi8KIAkJc3RydWN0IHJjdV9oZWFkIHJjdTsJLyogdXNlZCBkdXJpbmcgZGVzdHJ1Y3Rpb24gKi8KIAl9OworCXN0cnVjdCBzY2hlZF9kb21haW5fc2hhcmVkICpzaGFyZWQ7CiAKIAl1bnNpZ25lZCBpbnQgc3Bhbl93ZWlnaHQ7CiAJLyoKQEAgLTExNjUsNiArMTE3Nyw3IEBACiAKIHN0cnVjdCBzZF9kYXRhIHsKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICoqX19wZXJjcHUgc2Q7CisJc3RydWN0IHNjaGVkX2RvbWFpbl9zaGFyZWQgKipfX3BlcmNwdSBzZHM7CiAJc3RydWN0IHNjaGVkX2dyb3VwICoqX19wZXJjcHUgc2c7CiAJc3RydWN0IHNjaGVkX2dyb3VwX2NhcGFjaXR5ICoqX19wZXJjcHUgc2djOwogfTsKQEAgLTE0NTgsNiArMTQ3MSwxMyBAQAogfTsKIAogc3RydWN0IHRhc2tfc3RydWN0IHsKKyNpZmRlZiBDT05GSUdfVEhSRUFEX0lORk9fSU5fVEFTSworCS8qCisJICogRm9yIHJlYXNvbnMgb2YgaGVhZGVyIHNvdXAgKHNlZSBjdXJyZW50X3RocmVhZF9pbmZvKCkpLCB0aGlzCisJICogbXVzdCBiZSB0aGUgZmlyc3QgZWxlbWVudCBvZiB0YXNrX3N0cnVjdC4KKwkgKi8KKwlzdHJ1Y3QgdGhyZWFkX2luZm8gdGhyZWFkX2luZm87CisjZW5kaWYKIAl2b2xhdGlsZSBsb25nIHN0YXRlOwkvKiAtMSB1bnJ1bm5hYmxlLCAwIHJ1bm5hYmxlLCA+MCBzdG9wcGVkICovCiAJdm9pZCAqc3RhY2s7CiAJYXRvbWljX3QgdXNhZ2U7CkBAIC0xNDY3LDYgKzE0ODcsOSBAQAogI2lmZGVmIENPTkZJR19TTVAKIAlzdHJ1Y3QgbGxpc3Rfbm9kZSB3YWtlX2VudHJ5OwogCWludCBvbl9jcHU7CisjaWZkZWYgQ09ORklHX1RIUkVBRF9JTkZPX0lOX1RBU0sKKwl1bnNpZ25lZCBpbnQgY3B1OwkvKiBjdXJyZW50IENQVSAqLworI2VuZGlmCiAJdW5zaWduZWQgaW50IHdha2VlX2ZsaXBzOwogCXVuc2lnbmVkIGxvbmcgd2FrZWVfZmxpcF9kZWNheV90czsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmxhc3Rfd2FrZWU7CkBAIC0xOTIzLDYgKzE5NDYsMTMgQEAKICNpZmRlZiBDT05GSUdfTU1VCiAJc3RydWN0IHRhc2tfc3RydWN0ICpvb21fcmVhcGVyX2xpc3Q7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfVk1BUF9TVEFDSworCXN0cnVjdCB2bV9zdHJ1Y3QgKnN0YWNrX3ZtX2FyZWE7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVEhSRUFEX0lORk9fSU5fVEFTSworCS8qIEEgbGl2ZSB0YXNrIGhvbGRzIG9uZSByZWZlcmVuY2UuICovCisJYXRvbWljX3Qgc3RhY2tfcmVmY291bnQ7CisjZW5kaWYKIC8qIENQVS1zcGVjaWZpYyBzdGF0ZSBvZiB0aGlzIHRhc2sgKi8KIAlzdHJ1Y3QgdGhyZWFkX3N0cnVjdCB0aHJlYWQ7CiAvKgpAQCAtMTkzOSw2ICsxOTY5LDE4IEBACiAjIGRlZmluZSBhcmNoX3Rhc2tfc3RydWN0X3NpemUgKHNpemVvZihzdHJ1Y3QgdGFza19zdHJ1Y3QpKQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfVk1BUF9TVEFDSworc3RhdGljIGlubGluZSBzdHJ1Y3Qgdm1fc3RydWN0ICp0YXNrX3N0YWNrX3ZtX2FyZWEoY29uc3Qgc3RydWN0IHRhc2tfc3RydWN0ICp0KQoreworCXJldHVybiB0LT5zdGFja192bV9hcmVhOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHZtX3N0cnVjdCAqdGFza19zdGFja192bV9hcmVhKGNvbnN0IHN0cnVjdCB0YXNrX3N0cnVjdCAqdCkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCiAvKiBGdXR1cmUtc2FmZSBhY2Nlc3NvciBmb3Igc3RydWN0IHRhc2tfc3RydWN0J3MgY3B1c19hbGxvd2VkLiAqLwogI2RlZmluZSB0c2tfY3B1c19hbGxvd2VkKHRzaykgKCYodHNrKS0+Y3B1c19hbGxvd2VkKQogCkBAIC0yNTY4LDEyICsyNjEwLDE0IEBACiAJcmV0dXJuIHAtPnBpZCA9PSAwOwogfQogZXh0ZXJuIHN0cnVjdCB0YXNrX3N0cnVjdCAqY3Vycl90YXNrKGludCBjcHUpOwotZXh0ZXJuIHZvaWQgc2V0X2N1cnJfdGFzayhpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOworZXh0ZXJuIHZvaWQgaWE2NF9zZXRfY3Vycl90YXNrKGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CiAKIHZvaWQgeWllbGQodm9pZCk7CiAKIHVuaW9uIHRocmVhZF91bmlvbiB7CisjaWZuZGVmIENPTkZJR19USFJFQURfSU5GT19JTl9UQVNLCiAJc3RydWN0IHRocmVhZF9pbmZvIHRocmVhZF9pbmZvOworI2VuZGlmCiAJdW5zaWduZWQgbG9uZyBzdGFja1tUSFJFQURfU0laRS9zaXplb2YobG9uZyldOwogfTsKIApAQCAtMzA2MSwxMCArMzEwNSwzNCBAQAogCWNncm91cF90aHJlYWRncm91cF9jaGFuZ2VfZW5kKHRzayk7CiB9CiAKLSNpZm5kZWYgX19IQVZFX1RIUkVBRF9GVU5DVElPTlMKKyNpZmRlZiBDT05GSUdfVEhSRUFEX0lORk9fSU5fVEFTSworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0aHJlYWRfaW5mbyAqdGFza190aHJlYWRfaW5mbyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJcmV0dXJuICZ0YXNrLT50aHJlYWRfaW5mbzsKK30KKworLyoKKyAqIFdoZW4gYWNjZXNzaW5nIHRoZSBzdGFjayBvZiBhIG5vbi1jdXJyZW50IHRhc2sgdGhhdCBtaWdodCBleGl0LCB1c2UKKyAqIHRyeV9nZXRfdGFza19zdGFjaygpIGluc3RlYWQuICB0YXNrX3N0YWNrX3BhZ2Ugd2lsbCByZXR1cm4gYSBwb2ludGVyCisgKiB0aGF0IGNvdWxkIGdldCBmcmVlZCBvdXQgZnJvbSB1bmRlciB5b3UuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqdGFza19zdGFja19wYWdlKGNvbnN0IHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlyZXR1cm4gdGFzay0+c3RhY2s7Cit9CisKKyNkZWZpbmUgc2V0dXBfdGhyZWFkX3N0YWNrKG5ldyxvbGQpCWRvIHsgfSB3aGlsZSgwKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgKmVuZF9vZl9zdGFjayhjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJcmV0dXJuIHRhc2stPnN0YWNrOworfQorCisjZWxpZiAhZGVmaW5lZChfX0hBVkVfVEhSRUFEX0ZVTkNUSU9OUykKIAogI2RlZmluZSB0YXNrX3RocmVhZF9pbmZvKHRhc2spCSgoc3RydWN0IHRocmVhZF9pbmZvICopKHRhc2spLT5zdGFjaykKLSNkZWZpbmUgdGFza19zdGFja19wYWdlKHRhc2spCSgodGFzayktPnN0YWNrKQorI2RlZmluZSB0YXNrX3N0YWNrX3BhZ2UodGFzaykJKCh2b2lkICopKHRhc2spLT5zdGFjaykKIAogc3RhdGljIGlubGluZSB2b2lkIHNldHVwX3RocmVhZF9zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCB0YXNrX3N0cnVjdCAqb3JnKQogewpAQCAtMzA5MSw2ICszMTU5LDI0IEBACiB9CiAKICNlbmRpZgorCisjaWZkZWYgQ09ORklHX1RIUkVBRF9JTkZPX0lOX1RBU0sKK3N0YXRpYyBpbmxpbmUgdm9pZCAqdHJ5X2dldF90YXNrX3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCXJldHVybiBhdG9taWNfaW5jX25vdF96ZXJvKCZ0c2stPnN0YWNrX3JlZmNvdW50KSA/CisJCXRhc2tfc3RhY2tfcGFnZSh0c2spIDogTlVMTDsKK30KKworZXh0ZXJuIHZvaWQgcHV0X3Rhc2tfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCAqdHJ5X2dldF90YXNrX3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCXJldHVybiB0YXNrX3N0YWNrX3BhZ2UodHNrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF90YXNrX3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKSB7fQorI2VuZGlmCisKICNkZWZpbmUgdGFza19zdGFja19lbmRfY29ycnVwdGVkKHRhc2spIFwKIAkJKCooZW5kX29mX3N0YWNrKHRhc2spKSAhPSBTVEFDS19FTkRfTUFHSUMpCiAKQEAgLTMyMDYsNyArMzI5MiwxMSBAQAogICogY29uZF9yZXNjaGVkX2xvY2soKSB3aWxsIGRyb3AgdGhlIHNwaW5sb2NrIGJlZm9yZSBzY2hlZHVsaW5nLAogICogY29uZF9yZXNjaGVkX3NvZnRpcnEoKSB3aWxsIGVuYWJsZSBiaHMgYmVmb3JlIHNjaGVkdWxpbmcuCiAgKi8KKyNpZm5kZWYgQ09ORklHX1BSRUVNUFQKIGV4dGVybiBpbnQgX2NvbmRfcmVzY2hlZCh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBfY29uZF9yZXNjaGVkKHZvaWQpIHsgcmV0dXJuIDA7IH0KKyNlbmRpZgogCiAjZGVmaW5lIGNvbmRfcmVzY2hlZCgpICh7CQkJXAogCV9fX21pZ2h0X3NsZWVwKF9fRklMRV9fLCBfX0xJTkVfXywgMCk7CVwKQEAgLTMyMzYsNiArMzMyNiwxNSBAQAogI2VuZGlmCiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfcHJlZW1wdF9kaXNhYmxlX2lwKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKyNpZmRlZiBDT05GSUdfREVCVUdfUFJFRU1QVAorCXJldHVybiBwLT5wcmVlbXB0X2Rpc2FibGVfaXA7CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCit9CisKIC8qCiAgKiBEb2VzIGEgY3JpdGljYWwgc2VjdGlvbiBuZWVkIHRvIGJlIGJyb2tlbiBkdWUgdG8gYW5vdGhlcgogICogdGFzayB3YWl0aW5nPzogKHRlY2huaWNhbGx5IGRvZXMgbm90IGRlcGVuZCBvbiBDT05GSUdfUFJFRU1QVCwKQEAgLTMzNjQsNyArMzQ2MywxMSBAQAogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB0YXNrX2NwdShjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CisjaWZkZWYgQ09ORklHX1RIUkVBRF9JTkZPX0lOX1RBU0sKKwlyZXR1cm4gcC0+Y3B1OworI2Vsc2UKIAlyZXR1cm4gdGFza190aHJlYWRfaW5mbyhwKS0+Y3B1OworI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHRhc2tfbm9kZShjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCkBAIC0zNDY5LDE1ICszNTcyLDIwIEBACiAJcmV0dXJuIHRhc2tfcmxpbWl0X21heChjdXJyZW50LCBsaW1pdCk7CiB9CiAKKyNkZWZpbmUgU0NIRURfQ1BVRlJFUV9SVAkoMVUgPDwgMCkKKyNkZWZpbmUgU0NIRURfQ1BVRlJFUV9ETAkoMVUgPDwgMSkKKyNkZWZpbmUgU0NIRURfQ1BVRlJFUV9JT1dBSVQJKDFVIDw8IDIpCisKKyNkZWZpbmUgU0NIRURfQ1BVRlJFUV9SVF9ETAkoU0NIRURfQ1BVRlJFUV9SVCB8IFNDSEVEX0NQVUZSRVFfREwpCisKICNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKIHN0cnVjdCB1cGRhdGVfdXRpbF9kYXRhIHsKLQl2b2lkICgqZnVuYykoc3RydWN0IHVwZGF0ZV91dGlsX2RhdGEgKmRhdGEsCi0JCSAgICAgdTY0IHRpbWUsIHVuc2lnbmVkIGxvbmcgdXRpbCwgdW5zaWduZWQgbG9uZyBtYXgpOworICAgICAgIHZvaWQgKCpmdW5jKShzdHJ1Y3QgdXBkYXRlX3V0aWxfZGF0YSAqZGF0YSwgdTY0IHRpbWUsIHVuc2lnbmVkIGludCBmbGFncyk7CiB9OwogCiB2b2lkIGNwdWZyZXFfYWRkX3VwZGF0ZV91dGlsX2hvb2soaW50IGNwdSwgc3RydWN0IHVwZGF0ZV91dGlsX2RhdGEgKmRhdGEsCi0JCQl2b2lkICgqZnVuYykoc3RydWN0IHVwZGF0ZV91dGlsX2RhdGEgKmRhdGEsIHU2NCB0aW1lLAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyB1dGlsLCB1bnNpZ25lZCBsb25nIG1heCkpOworICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZnVuYykoc3RydWN0IHVwZGF0ZV91dGlsX2RhdGEgKmRhdGEsIHU2NCB0aW1lLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpKTsKIHZvaWQgY3B1ZnJlcV9yZW1vdmVfdXBkYXRlX3V0aWxfaG9vayhpbnQgY3B1KTsKICNlbmRpZiAvKiBDT05GSUdfQ1BVX0ZSRVEgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY3RwLmggYi9pbmNsdWRlL2xpbnV4L3NjdHAuaAppbmRleCBkZTFmNjQzLi5mY2I0YzM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjdHAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjdHAuaApAQCAtNzA1LDcwICs3MDUsNiBAQAogCXNjdHBfYXV0aGhkcl90IGF1dGhfaGRyOwogfSBfX3BhY2tlZCBzY3RwX2F1dGhfY2h1bmtfdDsKIAotc3RydWN0IHNjdHBfaW5mbyB7Ci0JX191MzIJc2N0cGlfdGFnOwotCV9fdTMyCXNjdHBpX3N0YXRlOwotCV9fdTMyCXNjdHBpX3J3bmQ7Ci0JX191MTYJc2N0cGlfdW5hY2tkYXRhOwotCV9fdTE2CXNjdHBpX3BlbmRkYXRhOwotCV9fdTE2CXNjdHBpX2luc3RybXM7Ci0JX191MTYJc2N0cGlfb3V0c3RybXM7Ci0JX191MzIJc2N0cGlfZnJhZ21lbnRhdGlvbl9wb2ludDsKLQlfX3UzMglzY3RwaV9pbnF1ZXVlOwotCV9fdTMyCXNjdHBpX291dHF1ZXVlOwotCV9fdTMyCXNjdHBpX292ZXJhbGxfZXJyb3I7Ci0JX191MzIJc2N0cGlfbWF4X2J1cnN0OwotCV9fdTMyCXNjdHBpX21heHNlZzsKLQlfX3UzMglzY3RwaV9wZWVyX3J3bmQ7Ci0JX191MzIJc2N0cGlfcGVlcl90YWc7Ci0JX191OAlzY3RwaV9wZWVyX2NhcGFibGU7Ci0JX191OAlzY3RwaV9wZWVyX3NhY2s7Ci0JX191MTYJX19yZXNlcnZlZDE7Ci0KLQkvKiBhc3NvYyBzdGF0dXMgaW5mbyAqLwotCV9fdTY0CXNjdHBpX2lzYWNrczsKLQlfX3U2NAlzY3RwaV9vc2Fja3M7Ci0JX191NjQJc2N0cGlfb3BhY2tldHM7Ci0JX191NjQJc2N0cGlfaXBhY2tldHM7Ci0JX191NjQJc2N0cGlfcnR4Y2h1bmtzOwotCV9fdTY0CXNjdHBpX291dG9mc2VxdHNuczsKLQlfX3U2NAlzY3RwaV9pZHVwY2h1bmtzOwotCV9fdTY0CXNjdHBpX2dhcGNudDsKLQlfX3U2NAlzY3RwaV9vdW9kY2h1bmtzOwotCV9fdTY0CXNjdHBpX2l1b2RjaHVua3M7Ci0JX191NjQJc2N0cGlfb29kY2h1bmtzOwotCV9fdTY0CXNjdHBpX2lvZGNodW5rczsKLQlfX3U2NAlzY3RwaV9vY3RybGNodW5rczsKLQlfX3U2NAlzY3RwaV9pY3RybGNodW5rczsKLQotCS8qIHByaW1hcnkgdHJhbnNwb3J0IGluZm8gKi8KLQlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZQlzY3RwaV9wX2FkZHJlc3M7Ci0JX19zMzIJc2N0cGlfcF9zdGF0ZTsKLQlfX3UzMglzY3RwaV9wX2N3bmQ7Ci0JX191MzIJc2N0cGlfcF9zcnR0OwotCV9fdTMyCXNjdHBpX3BfcnRvOwotCV9fdTMyCXNjdHBpX3BfaGJpbnRlcnZhbDsKLQlfX3UzMglzY3RwaV9wX3BhdGhtYXhyeHQ7Ci0JX191MzIJc2N0cGlfcF9zYWNrZGVsYXk7Ci0JX191MzIJc2N0cGlfcF9zYWNrZnJlcTsKLQlfX3UzMglzY3RwaV9wX3NzdGhyZXNoOwotCV9fdTMyCXNjdHBpX3BfcGFydGlhbF9ieXRlc19hY2tlZDsKLQlfX3UzMglzY3RwaV9wX2ZsaWdodF9zaXplOwotCV9fdTE2CXNjdHBpX3BfZXJyb3I7Ci0JX191MTYJX19yZXNlcnZlZDI7Ci0KLQkvKiBzY3RwIHNvY2sgaW5mbyAqLwotCV9fdTMyCXNjdHBpX3NfYXV0b2Nsb3NlOwotCV9fdTMyCXNjdHBpX3NfYWRhcHRhdGlvbl9pbmQ7Ci0JX191MzIJc2N0cGlfc19wZF9wb2ludDsKLQlfX3U4CXNjdHBpX3Nfbm9kZWxheTsKLQlfX3U4CXNjdHBpX3NfZGlzYWJsZV9mcmFnbWVudHM7Ci0JX191OAlzY3RwaV9zX3Y0bWFwcGVkOwotCV9fdTgJc2N0cGlfc19mcmFnX2ludGVybGVhdmU7Ci0JX191MzIJc2N0cGlfc190eXBlOwotCV9fdTMyCV9fcmVzZXJ2ZWQzOwotfTsKLQogc3RydWN0IHNjdHBfaW5mb3ggewogCXN0cnVjdCBzY3RwX2luZm8gKnNjdHBpbmZvOwogCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oIGIvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oCmluZGV4IDc4MzFjZDUuLmMyMTI1ZTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmgKQEAgLTI0Miw2ICsyNDIsMTAgQEAKIGludCBzZWN1cml0eV9kZW50cnlfaW5pdF9zZWN1cml0eShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAogCQkJCQljb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSwgdm9pZCAqKmN0eCwKIAkJCQkJdTMyICpjdHhsZW4pOworaW50IHNlY3VyaXR5X2RlbnRyeV9jcmVhdGVfZmlsZXNfYXMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJCQkJc3RydWN0IHFzdHIgKm5hbWUsCisJCQkJCWNvbnN0IHN0cnVjdCBjcmVkICpvbGQsCisJCQkJCXN0cnVjdCBjcmVkICpuZXcpOwogCiBpbnQgc2VjdXJpdHlfaW5vZGVfYWxsb2Moc3RydWN0IGlub2RlICppbm9kZSk7CiB2b2lkIHNlY3VyaXR5X2lub2RlX2ZyZWUoc3RydWN0IGlub2RlICppbm9kZSk7CkBAIC0yODIsNiArMjg2LDggQEAKIGludCBzZWN1cml0eV9pbm9kZV9zZXRzZWN1cml0eShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncyk7CiBpbnQgc2VjdXJpdHlfaW5vZGVfbGlzdHNlY3VyaXR5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplKTsKIHZvaWQgc2VjdXJpdHlfaW5vZGVfZ2V0c2VjaWQoc3RydWN0IGlub2RlICppbm9kZSwgdTMyICpzZWNpZCk7CitpbnQgc2VjdXJpdHlfaW5vZGVfY29weV91cChzdHJ1Y3QgZGVudHJ5ICpzcmMsIHN0cnVjdCBjcmVkICoqbmV3KTsKK2ludCBzZWN1cml0eV9pbm9kZV9jb3B5X3VwX3hhdHRyKGNvbnN0IGNoYXIgKm5hbWUpOwogaW50IHNlY3VyaXR5X2ZpbGVfcGVybWlzc2lvbihzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG1hc2spOwogaW50IHNlY3VyaXR5X2ZpbGVfYWxsb2Moc3RydWN0IGZpbGUgKmZpbGUpOwogdm9pZCBzZWN1cml0eV9maWxlX2ZyZWUoc3RydWN0IGZpbGUgKmZpbGUpOwpAQCAtMzA3LDcgKzMxMyw2IEBACiBpbnQgc2VjdXJpdHlfa2VybmVsX2FjdF9hcyhzdHJ1Y3QgY3JlZCAqbmV3LCB1MzIgc2VjaWQpOwogaW50IHNlY3VyaXR5X2tlcm5lbF9jcmVhdGVfZmlsZXNfYXMoc3RydWN0IGNyZWQgKm5ldywgc3RydWN0IGlub2RlICppbm9kZSk7CiBpbnQgc2VjdXJpdHlfa2VybmVsX21vZHVsZV9yZXF1ZXN0KGNoYXIgKmttb2RfbmFtZSk7Ci1pbnQgc2VjdXJpdHlfa2VybmVsX21vZHVsZV9mcm9tX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUpOwogaW50IHNlY3VyaXR5X2tlcm5lbF9yZWFkX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsIGVudW0ga2VybmVsX3JlYWRfZmlsZV9pZCBpZCk7CiBpbnQgc2VjdXJpdHlfa2VybmVsX3Bvc3RfcmVhZF9maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIGxvZmZfdCBzaXplLAogCQkJCSAgIGVudW0ga2VybmVsX3JlYWRfZmlsZV9pZCBpZCk7CkBAIC01OTgsNiArNjAzLDE0IEBACiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQogCitzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV9kZW50cnlfY3JlYXRlX2ZpbGVzX2FzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQkJCSAgaW50IG1vZGUsIHN0cnVjdCBxc3RyICpuYW1lLAorCQkJCQkJICBjb25zdCBzdHJ1Y3QgY3JlZCAqb2xkLAorCQkJCQkJICBzdHJ1Y3QgY3JlZCAqbmV3KQoreworCXJldHVybiAwOworfQorCiAKIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2lub2RlX2luaXRfc2VjdXJpdHkoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJCXN0cnVjdCBpbm9kZSAqZGlyLApAQCAtNzU4LDYgKzc3MSwxNiBAQAogCSpzZWNpZCA9IDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2lub2RlX2NvcHlfdXAoc3RydWN0IGRlbnRyeSAqc3JjLCBzdHJ1Y3QgY3JlZCAqKm5ldykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfaW5vZGVfY29weV91cF94YXR0cihjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKwogc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfZmlsZV9wZXJtaXNzaW9uKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgbWFzaykKIHsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsXzgyNTAuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsXzgyNTAuaAppbmRleCA5MjMyNjZjLi40OGVjNzY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF84MjUwLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfODI1MC5oCkBAIC0xMTEsNyArMTExLDYgQEAKIAkJCQkJCSAqICAgaWYgbm9fY29uc29sZV9zdXNwZW5kCiAJCQkJCQkgKi8KIAl1bnNpZ25lZCBjaGFyCQlwcm9iZTsKLQlzdHJ1Y3QgbWN0cmxfZ3Bpb3MJKmdwaW9zOwogI2RlZmluZSBVQVJUX1BST0JFX1JTQQkoMSA8PCAwKQogCiAJLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaAppbmRleCAyZjQ0ZTIwLi4zNDQyMDE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCkBAIC0zNjcsMTQgKzM2NywyMSBAQAogCiAjZGVmaW5lIEVBUkxZQ09OX0RFQ0xBUkUoX25hbWUsIGZuKQlPRl9FQVJMWUNPTl9ERUNMQVJFKF9uYW1lLCAiIiwgZm4pCiAKLWV4dGVybiBpbnQgc2V0dXBfZWFybHljb24oY2hhciAqYnVmKTsKIGV4dGVybiBpbnQgb2Zfc2V0dXBfZWFybHljb24oY29uc3Qgc3RydWN0IGVhcmx5Y29uX2lkICptYXRjaCwKIAkJCSAgICAgdW5zaWduZWQgbG9uZyBub2RlLAogCQkJICAgICBjb25zdCBjaGFyICpvcHRpb25zKTsKIAorI2lmZGVmIENPTkZJR19TRVJJQUxfRUFSTFlDT04KK2V4dGVybiBib29sIGVhcmx5Y29uX2luaXRfaXNfZGVmZXJyZWQgX19pbml0ZGF0YTsKK2ludCBzZXR1cF9lYXJseWNvbihjaGFyICpidWYpOworI2Vsc2UKK3N0YXRpYyBjb25zdCBib29sIGVhcmx5Y29uX2luaXRfaXNfZGVmZXJyZWQ7CitzdGF0aWMgaW5saW5lIGludCBzZXR1cF9lYXJseWNvbihjaGFyICpidWYpIHsgcmV0dXJuIDA7IH0KKyNlbmRpZgorCiBzdHJ1Y3QgdWFydF9wb3J0ICp1YXJ0X2dldF9jb25zb2xlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnRzLCBpbnQgbnIsCiAJCQkJICAgc3RydWN0IGNvbnNvbGUgKmMpOwotaW50IHVhcnRfcGFyc2VfZWFybHljb24oY2hhciAqcCwgdW5zaWduZWQgY2hhciAqaW90eXBlLCB1bnNpZ25lZCBsb25nICphZGRyLAoraW50IHVhcnRfcGFyc2VfZWFybHljb24oY2hhciAqcCwgdW5zaWduZWQgY2hhciAqaW90eXBlLCByZXNvdXJjZV9zaXplX3QgKmFkZHIsCiAJCQljaGFyICoqb3B0aW9ucyk7CiB2b2lkIHVhcnRfcGFyc2Vfb3B0aW9ucyhjaGFyICpvcHRpb25zLCBpbnQgKmJhdWQsIGludCAqcGFyaXR5LCBpbnQgKmJpdHMsCiAJCQlpbnQgKmZsb3cpOwpAQCAtNDEyLDcgKzQxOSw3IEBACiBzdGF0aWMgaW5saW5lIGludCB1YXJ0X3R4X3N0b3BwZWQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gcG9ydC0+c3RhdGUtPnBvcnQudHR5OwotCWlmICh0dHktPnN0b3BwZWQgfHwgcG9ydC0+aHdfc3RvcHBlZCkKKwlpZiAoKHR0eSAmJiB0dHktPnN0b3BwZWQpIHx8IHBvcnQtPmh3X3N0b3BwZWQpCiAJCXJldHVybiAxOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaCBiL2luY2x1ZGUvbGludXgvc2tidWZmLmgKaW5kZXggNmYwYjNlMC4uOWJmNjBiNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCkBAIC02MTIsNyArNjEyLDYgQEAKICAqCUBub19mY3M6ICBSZXF1ZXN0IE5JQyB0byB0cmVhdCBsYXN0IDQgYnl0ZXMgYXMgRXRoZXJuZXQgRkNTCiAgICoJQG5hcGlfaWQ6IGlkIG9mIHRoZSBOQVBJIHN0cnVjdCB0aGlzIHNrYiBjYW1lIGZyb20KICAqCUBzZWNtYXJrOiBzZWN1cml0eSBtYXJraW5nCi0gKglAb2ZmbG9hZF9md2RfbWFyazogZndkaW5nIG9mZmxvYWQgbWFyawogICoJQG1hcms6IEdlbmVyaWMgcGFja2V0IG1hcmsKICAqCUB2bGFuX3Byb3RvOiB2bGFuIGVuY2Fwc3VsYXRpb24gcHJvdG9jb2wKICAqCUB2bGFuX3RjaTogdmxhbiB0YWcgY29udHJvbCBpbmZvcm1hdGlvbgpAQCAtNjc3LDEzICs2NzYsMjMgQEAKIAkgKi8KIAlrbWVtY2hlY2tfYml0ZmllbGRfYmVnaW4oZmxhZ3MxKTsKIAlfX3UxNgkJCXF1ZXVlX21hcHBpbmc7CisKKy8qIGlmIHlvdSBtb3ZlIGNsb25lZCBhcm91bmQgeW91IGFsc28gbXVzdCBhZGFwdCB0aG9zZSBjb25zdGFudHMgKi8KKyNpZmRlZiBfX0JJR19FTkRJQU5fQklURklFTEQKKyNkZWZpbmUgQ0xPTkVEX01BU0sJKDEgPDwgNykKKyNlbHNlCisjZGVmaW5lIENMT05FRF9NQVNLCTEKKyNlbmRpZgorI2RlZmluZSBDTE9ORURfT0ZGU0VUKCkJCW9mZnNldG9mKHN0cnVjdCBza19idWZmLCBfX2Nsb25lZF9vZmZzZXQpCisKKwlfX3U4CQkJX19jbG9uZWRfb2Zmc2V0WzBdOwogCV9fdTgJCQljbG9uZWQ6MSwKIAkJCQlub2hkcjoxLAogCQkJCWZjbG9uZToyLAogCQkJCXBlZWtlZDoxLAogCQkJCWhlYWRfZnJhZzoxLAotCQkJCXhtaXRfbW9yZToxOwotCS8qIG9uZSBiaXQgaG9sZSAqLworCQkJCXhtaXRfbW9yZToxLAorCQkJCV9fdW51c2VkOjE7IC8qIG9uZSBiaXQgaG9sZSAqLwogCWttZW1jaGVja19iaXRmaWVsZF9lbmQoZmxhZ3MxKTsKIAogCS8qIGZpZWxkcyBlbmNsb3NlZCBpbiBoZWFkZXJzX3N0YXJ0L2hlYWRlcnNfZW5kIGFyZSBjb3BpZWQKQEAgLTczMCw3ICs3MzksMTAgQEAKIAlfX3U4CQkJaXB2c19wcm9wZXJ0eToxOwogCV9fdTgJCQlpbm5lcl9wcm90b2NvbF90eXBlOjE7CiAJX191OAkJCXJlbWNzdW1fb2ZmbG9hZDoxOwotCS8qIDMgb3IgNSBiaXQgaG9sZSAqLworI2lmZGVmIENPTkZJR19ORVRfU1dJVENIREVWCisJX191OAkJCW9mZmxvYWRfZndkX21hcms6MTsKKyNlbmRpZgorCS8qIDIsIDQgb3IgNSBiaXQgaG9sZSAqLwogCiAjaWZkZWYgQ09ORklHX05FVF9TQ0hFRAogCV9fdTE2CQkJdGNfaW5kZXg7CS8qIHRyYWZmaWMgY29udHJvbCBpbmRleCAqLwpAQCAtNzU3LDE0ICs3NjksOSBAQAogCQl1bnNpZ25lZCBpbnQJc2VuZGVyX2NwdTsKIAl9OwogI2VuZGlmCi0JdW5pb24gewogI2lmZGVmIENPTkZJR19ORVRXT1JLX1NFQ01BUksKLQkJX191MzIJCXNlY21hcms7CisJX191MzIJCXNlY21hcms7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfTkVUX1NXSVRDSERFVgotCQlfX3UzMgkJb2ZmbG9hZF9md2RfbWFyazsKLSNlbmRpZgotCX07CiAKIAl1bmlvbiB7CiAJCV9fdTMyCQltYXJrOwpAQCAtMjI5NSw3ICsyMzAyLDcgQEAKIAogaW50IF9fX3Bza2JfdHJpbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbGVuKTsKIAotc3RhdGljIGlubGluZSB2b2lkIF9fc2tiX3RyaW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbikKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3NrYl9zZXRfbGVuZ3RoKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJaWYgKHVubGlrZWx5KHNrYl9pc19ub25saW5lYXIoc2tiKSkpIHsKIAkJV0FSTl9PTigxKTsKQEAgLTIzMDUsNiArMjMxMiwxMSBAQAogCXNrYl9zZXRfdGFpbF9wb2ludGVyKHNrYiwgbGVuKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIF9fc2tiX3RyaW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlfX3NrYl9zZXRfbGVuZ3RoKHNrYiwgbGVuKTsKK30KKwogdm9pZCBza2JfdHJpbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbGVuKTsKIAogc3RhdGljIGlubGluZSBpbnQgX19wc2tiX3RyaW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbikKQEAgLTIzMzUsNiArMjM0NywyMCBAQAogCUJVR19PTihlcnIpOwogfQogCitzdGF0aWMgaW5saW5lIGludCBfX3NrYl9ncm93KHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pCit7CisJdW5zaWduZWQgaW50IGRpZmYgPSBsZW4gLSBza2ItPmxlbjsKKworCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IGRpZmYpIHsKKwkJaW50IHJldCA9IHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCBkaWZmIC0gc2tiX3RhaWxyb29tKHNrYiksCisJCQkJCSAgIEdGUF9BVE9NSUMpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisJX19za2Jfc2V0X2xlbmd0aChza2IsIGxlbik7CisJcmV0dXJuIDA7Cit9CisKIC8qKgogICoJc2tiX29ycGhhbiAtIG9ycGhhbiBhIGJ1ZmZlcgogICoJQHNrYjogYnVmZmVyIHRvIG9ycGhhbgpAQCAtMjM4Niw2ICsyNDEyLDggQEAKIAkJa2ZyZWVfc2tiKHNrYik7CiB9CiAKK3ZvaWQgc2tiX3JidHJlZV9wdXJnZShzdHJ1Y3QgcmJfcm9vdCAqcm9vdCk7CisKIHZvaWQgKm5ldGRldl9hbGxvY19mcmFnKHVuc2lnbmVkIGludCBmcmFnc3opOwogCiBzdHJ1Y3Qgc2tfYnVmZiAqX19uZXRkZXZfYWxsb2Nfc2tiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBsZW5ndGgsCkBAIC0yODQ3LDYgKzI4NzUsMTggQEAKIAkgICAgICAgX19za2JfbGluZWFyaXplKHNrYikgOiAwOwogfQogCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQKK19fc2tiX3Bvc3RwdWxsX3Jjc3VtKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHZvaWQgKnN0YXJ0LCB1bnNpZ25lZCBpbnQgbGVuLAorCQkgICAgIHVuc2lnbmVkIGludCBvZmYpCit7CisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQorCQlza2ItPmNzdW0gPSBjc3VtX2Jsb2NrX3N1Yihza2ItPmNzdW0sCisJCQkJCSAgIGNzdW1fcGFydGlhbChzdGFydCwgbGVuLCAwKSwgb2ZmKTsKKwllbHNlIGlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMICYmCisJCSBza2JfY2hlY2tzdW1fc3RhcnRfb2Zmc2V0KHNrYikgPCAwKQorCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7Cit9CisKIC8qKgogICoJc2tiX3Bvc3RwdWxsX3Jjc3VtIC0gdXBkYXRlIGNoZWNrc3VtIGZvciByZWNlaXZlZCBza2IgYWZ0ZXIgcHVsbAogICoJQHNrYjogYnVmZmVyIHRvIHVwZGF0ZQpAQCAtMjg1NywzNiArMjg5NywzOCBAQAogICoJdXBkYXRlIHRoZSBDSEVDS1NVTV9DT01QTEVURSBjaGVja3N1bSwgb3Igc2V0IGlwX3N1bW1lZCB0bwogICoJQ0hFQ0tTVU1fTk9ORSBzbyB0aGF0IGl0IGNhbiBiZSByZWNvbXB1dGVkIGZyb20gc2NyYXRjaC4KICAqLwotCiBzdGF0aWMgaW5saW5lIHZvaWQgc2tiX3Bvc3RwdWxsX3Jjc3VtKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICAgICAgY29uc3Qgdm9pZCAqc3RhcnQsIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0JaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQotCQlza2ItPmNzdW0gPSBjc3VtX3N1Yihza2ItPmNzdW0sIGNzdW1fcGFydGlhbChzdGFydCwgbGVuLCAwKSk7Ci0JZWxzZSBpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCAmJgotCQkgc2tiX2NoZWNrc3VtX3N0YXJ0X29mZnNldChza2IpIDwgMCkKLQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCV9fc2tiX3Bvc3RwdWxsX3Jjc3VtKHNrYiwgc3RhcnQsIGxlbiwgMCk7CiB9CiAKLXVuc2lnbmVkIGNoYXIgKnNrYl9wdWxsX3Jjc3VtKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pOworc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkCitfX3NrYl9wb3N0cHVzaF9yY3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCB2b2lkICpzdGFydCwgdW5zaWduZWQgaW50IGxlbiwKKwkJICAgICB1bnNpZ25lZCBpbnQgb2ZmKQoreworCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkKKwkJc2tiLT5jc3VtID0gY3N1bV9ibG9ja19hZGQoc2tiLT5jc3VtLAorCQkJCQkgICBjc3VtX3BhcnRpYWwoc3RhcnQsIGxlbiwgMCksIG9mZik7Cit9CiAKKy8qKgorICoJc2tiX3Bvc3RwdXNoX3Jjc3VtIC0gdXBkYXRlIGNoZWNrc3VtIGZvciByZWNlaXZlZCBza2IgYWZ0ZXIgcHVzaAorICoJQHNrYjogYnVmZmVyIHRvIHVwZGF0ZQorICoJQHN0YXJ0OiBzdGFydCBvZiBkYXRhIGFmdGVyIHB1c2gKKyAqCUBsZW46IGxlbmd0aCBvZiBkYXRhIHB1c2hlZAorICoKKyAqCUFmdGVyIGRvaW5nIGEgcHVzaCBvbiBhIHJlY2VpdmVkIHBhY2tldCwgeW91IG5lZWQgdG8gY2FsbCB0aGlzIHRvCisgKgl1cGRhdGUgdGhlIENIRUNLU1VNX0NPTVBMRVRFIGNoZWNrc3VtLgorICovCiBzdGF0aWMgaW5saW5lIHZvaWQgc2tiX3Bvc3RwdXNoX3Jjc3VtKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICAgICAgY29uc3Qgdm9pZCAqc3RhcnQsIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0JLyogRm9yIHBlcmZvcm1pbmcgdGhlIHJldmVyc2Ugb3BlcmF0aW9uIHRvIHNrYl9wb3N0cHVsbF9yY3N1bSgpLAotCSAqIHdlIGNhbiBpbnN0ZWFkIG9mIC4uLgotCSAqCi0JICogICBza2ItPmNzdW0gPSBjc3VtX2FkZChza2ItPmNzdW0sIGNzdW1fcGFydGlhbChzdGFydCwgbGVuLCAwKSk7Ci0JICoKLQkgKiAuLi4ganVzdCB1c2UgdGhpcyBlcXVpdmFsZW50IHZlcnNpb24gaGVyZSB0byBzYXZlIGEgZmV3Ci0JICogaW5zdHJ1Y3Rpb25zLiBGZWVkaW5nIGNzdW0gb2YgMCBpbiBjc3VtX3BhcnRpYWwoKSBhbmQgbGF0ZXIKLQkgKiBvbiBhZGRpbmcgc2tiLT5jc3VtIGlzIGVxdWl2YWxlbnQgdG8gZmVlZCBza2ItPmNzdW0gaW4gdGhlCi0JICogZmlyc3QgcGxhY2UuCi0JICovCi0JaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQotCQlza2ItPmNzdW0gPSBjc3VtX3BhcnRpYWwoc3RhcnQsIGxlbiwgc2tiLT5jc3VtKTsKKwlfX3NrYl9wb3N0cHVzaF9yY3N1bShza2IsIHN0YXJ0LCBsZW4sIDApOwogfQogCit1bnNpZ25lZCBjaGFyICpza2JfcHVsbF9yY3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbGVuKTsKKwogLyoqCiAgKglza2JfcHVzaF9yY3N1bSAtIHB1c2ggc2tiIGFuZCB1cGRhdGUgcmVjZWl2ZSBjaGVja3N1bQogICoJQHNrYjogYnVmZmVyIHRvIHVwZGF0ZQpAQCAtMjkyNCw2ICsyOTY2LDIxIEBACiAJcmV0dXJuIF9fcHNrYl90cmltKHNrYiwgbGVuKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgX19za2JfdHJpbV9yY3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCV9fc2tiX3RyaW0oc2tiLCBsZW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX3NrYl9ncm93X3Jjc3VtKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pCit7CisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQorCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJcmV0dXJuIF9fc2tiX2dyb3coc2tiLCBsZW4pOworfQorCiAjZGVmaW5lIHNrYl9xdWV1ZV93YWxrKHF1ZXVlLCBza2IpIFwKIAkJZm9yIChza2IgPSAocXVldWUpLT5uZXh0OwkJCQkJXAogCQkgICAgIHNrYiAhPSAoc3RydWN0IHNrX2J1ZmYgKikocXVldWUpOwkJCQlcCkBAIC0zMDI4LDYgKzMwODUsNyBAQAogc3RydWN0IHNrX2J1ZmYgKnNrYl9zZWdtZW50KHN0cnVjdCBza19idWZmICpza2IsIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKTsKIHN0cnVjdCBza19idWZmICpza2Jfdmxhbl91bnRhZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGludCBza2JfZW5zdXJlX3dyaXRhYmxlKHN0cnVjdCBza19idWZmICpza2IsIGludCB3cml0ZV9sZW4pOworaW50IF9fc2tiX3ZsYW5fcG9wKHN0cnVjdCBza19idWZmICpza2IsIHUxNiAqdmxhbl90Y2kpOwogaW50IHNrYl92bGFuX3BvcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGludCBza2Jfdmxhbl9wdXNoKHN0cnVjdCBza19idWZmICpza2IsIF9fYmUxNiB2bGFuX3Byb3RvLCB1MTYgdmxhbl90Y2kpOwogc3RydWN0IHNrX2J1ZmYgKnBza2JfZXh0cmFjdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2ZmLCBpbnQgdG9fY29weSwKQEAgLTM3MTIsNiArMzc3MCwxMyBAQAogCXJldHVybiBza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlICYgU0tCX0dTT19UQ1BWNjsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHNrYl9nc29fcmVzZXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplID0gMDsKKwlza2Jfc2hpbmZvKHNrYiktPmdzb19zZWdzID0gMDsKKwlza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlID0gMDsKK30KKwogdm9pZCBfX3NrYl93YXJuX2xyb19mb3J3YXJkaW5nKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpOwogCiBzdGF0aWMgaW5saW5lIGJvb2wgc2tiX3dhcm5faWZfbHJvKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NsYWIuaCBiL2luY2x1ZGUvbGludXgvc2xhYi5oCmluZGV4IDQyOTM4MDguLjA4NGIxMmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2xhYi5oCisrKyBiL2luY2x1ZGUvbGludXgvc2xhYi5oCkBAIC02NTAsNCArNjUwLDEyIEBACiB1bnNpZ25lZCBpbnQga21lbV9jYWNoZV9zaXplKHN0cnVjdCBrbWVtX2NhY2hlICpzKTsKIHZvaWQgX19pbml0IGttZW1fY2FjaGVfaW5pdF9sYXRlKHZvaWQpOwogCisjaWYgZGVmaW5lZChDT05GSUdfU01QKSAmJiBkZWZpbmVkKENPTkZJR19TTEFCKQoraW50IHNsYWJfcHJlcGFyZV9jcHUodW5zaWduZWQgaW50IGNwdSk7CitpbnQgc2xhYl9kZWFkX2NwdSh1bnNpZ25lZCBpbnQgY3B1KTsKKyNlbHNlCisjZGVmaW5lIHNsYWJfcHJlcGFyZV9jcHUJTlVMTAorI2RlZmluZSBzbGFiX2RlYWRfY3B1CQlOVUxMCisjZW5kaWYKKwogI2VuZGlmCS8qIF9MSU5VWF9TTEFCX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc21jOTF4LmggYi9pbmNsdWRlL2xpbnV4L3NtYzkxeC5oCmluZGV4IDc2MTk5YjcuLmUzMDJjNDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc21jOTF4LmgKKysrIGIvaW5jbHVkZS9saW51eC9zbWM5MXguaApAQCAtMSw2ICsxLDE2IEBACiAjaWZuZGVmIF9fU01DOTFYX0hfXwogI2RlZmluZSBfX1NNQzkxWF9IX18KIAorLyoKKyAqIFRoZXNlIGJpdHMgZGVmaW5lIHdoaWNoIGFjY2VzcyBzaXplcyBhIHBsYXRmb3JtIGNhbiBzdXBwb3J0LCByYXRoZXIKKyAqIHRoYW4gdGhlIG1heGltYWwgYWNjZXNzIHNpemUuICBTbywgaWYgeW91ciBwbGF0Zm9ybSBjYW4gZG8gMTYtYml0CisgKiBhbmQgMzItYml0IGFjY2Vzc2VzIHRvIHRoZSBTTUM5MXggZGV2aWNlLCBidXQgbm90IDgtYml0LCBzZXQgYm90aAorICogU01DOTFYX1VTRV8xNkJJVCBhbmQgU01DOTFYX1VTRV8zMkJJVC4KKyAqCisgKiBUaGUgU01DOTF4IGRyaXZlciByZXF1aXJlcyBhdCBsZWFzdCBvbmUgb2YgU01DOTFYX1VTRV84QklUIG9yCisgKiBTTUM5MVhfVVNFXzE2QklUIHRvIGJlIHN1cHBvcnRlZCAtIGp1c3Qgc2V0dGluZyBTTUM5MVhfVVNFXzMyQklUIGlzCisgKiBhbiBpbnZhbGlkIGNvbmZpZ3VyYXRpb24uCisgKi8KICNkZWZpbmUgU01DOTFYX1VTRV84QklUICgxIDw8IDApCiAjZGVmaW5lIFNNQzkxWF9VU0VfMTZCSVQgKDEgPDwgMSkKICNkZWZpbmUgU01DOTFYX1VTRV8zMkJJVCAoMSA8PCAyKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbXAuaCBiL2luY2x1ZGUvbGludXgvc21wLmgKaW5kZXggZWNjYWU0NjkuLjhlMGNiN2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc21wLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbXAuaApAQCAtMTk2LDYgKzE5Niw5IEBACiAKIHZvaWQgc21wX3NldHVwX3Byb2Nlc3Nvcl9pZCh2b2lkKTsKIAoraW50IHNtcF9jYWxsX29uX2NwdSh1bnNpZ25lZCBpbnQgY3B1LCBpbnQgKCpmdW5jKSh2b2lkICopLCB2b2lkICpwYXIsCisJCSAgICBib29sIHBoeXMpOworCiAvKiBTTVAgY29yZSBmdW5jdGlvbnMgKi8KIGludCBzbXBjZmRfcHJlcGFyZV9jcHUodW5zaWduZWQgaW50IGNwdSk7CiBpbnQgc21wY2ZkX2RlYWRfY3B1KHVuc2lnbmVkIGludCBjcHUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcGkvc3BpLmggYi9pbmNsdWRlL2xpbnV4L3NwaS9zcGkuaAppbmRleCAwNzJjYjJhLi40Yjc0M2FjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NwaS9zcGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaS9zcGkuaApAQCAtMzEyLDYgKzMxMiw4IEBACiAgKiBAZmxhZ3M6IG90aGVyIGNvbnN0cmFpbnRzIHJlbGV2YW50IHRvIHRoaXMgZHJpdmVyCiAgKiBAbWF4X3RyYW5zZmVyX3NpemU6IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbWF4IHRyYW5zZmVyIHNpemUgZm9yCiAgKglhICZzcGlfZGV2aWNlOyBtYXkgYmUgJU5VTEwsIHNvIHRoZSBkZWZhdWx0ICVTSVpFX01BWCB3aWxsIGJlIHVzZWQuCisgKiBAbWF4X21lc3NhZ2Vfc2l6ZTogZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBtYXggbWVzc2FnZSBzaXplIGZvcgorICoJYSAmc3BpX2RldmljZTsgbWF5IGJlICVOVUxMLCBzbyB0aGUgZGVmYXVsdCAlU0laRV9NQVggd2lsbCBiZSB1c2VkLgogICogQGlvX211dGV4OiBtdXRleCBmb3IgcGh5c2ljYWwgYnVzIGFjY2VzcwogICogQGJ1c19sb2NrX3NwaW5sb2NrOiBzcGlubG9jayBmb3IgU1BJIGJ1cyBsb2NraW5nCiAgKiBAYnVzX2xvY2tfbXV0ZXg6IG11dGV4IGZvciBleGNsdXNpb24gb2YgbXVsdGlwbGUgY2FsbGVycwpAQCAtNDQyLDEwICs0NDQsMTEgQEAKICNkZWZpbmUgU1BJX01BU1RFUl9NVVNUX1RYICAgICAgQklUKDQpCQkvKiByZXF1aXJlcyB0eCAqLwogCiAJLyoKLQkgKiBvbiBzb21lIGhhcmR3YXJlIHRyYW5zZmVyIHNpemUgbWF5IGJlIGNvbnN0cmFpbmVkCisJICogb24gc29tZSBoYXJkd2FyZSB0cmFuc2ZlciAvIG1lc3NhZ2Ugc2l6ZSBtYXkgYmUgY29uc3RyYWluZWQKIAkgKiB0aGUgbGltaXQgbWF5IGRlcGVuZCBvbiBkZXZpY2UgdHJhbnNmZXIgc2V0dGluZ3MKIAkgKi8KIAlzaXplX3QgKCptYXhfdHJhbnNmZXJfc2l6ZSkoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSk7CisJc2l6ZV90ICgqbWF4X21lc3NhZ2Vfc2l6ZSkoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSk7CiAKIAkvKiBJL08gbXV0ZXggKi8KIAlzdHJ1Y3QgbXV0ZXgJCWlvX211dGV4OwpAQCAtOTA1LDEyICs5MDgsMjYgQEAKIAkJCSAgICBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1lc3NhZ2UpOwogCiBzdGF0aWMgaW5saW5lIHNpemVfdAorc3BpX21heF9tZXNzYWdlX3NpemUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gc3BpLT5tYXN0ZXI7CisJaWYgKCFtYXN0ZXItPm1heF9tZXNzYWdlX3NpemUpCisJCXJldHVybiBTSVpFX01BWDsKKwlyZXR1cm4gbWFzdGVyLT5tYXhfbWVzc2FnZV9zaXplKHNwaSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2l6ZV90CiBzcGlfbWF4X3RyYW5zZmVyX3NpemUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gc3BpLT5tYXN0ZXI7Ci0JaWYgKCFtYXN0ZXItPm1heF90cmFuc2Zlcl9zaXplKQotCQlyZXR1cm4gU0laRV9NQVg7Ci0JcmV0dXJuIG1hc3Rlci0+bWF4X3RyYW5zZmVyX3NpemUoc3BpKTsKKwlzaXplX3QgdHJfbWF4ID0gU0laRV9NQVg7CisJc2l6ZV90IG1zZ19tYXggPSBzcGlfbWF4X21lc3NhZ2Vfc2l6ZShzcGkpOworCisJaWYgKG1hc3Rlci0+bWF4X3RyYW5zZmVyX3NpemUpCisJCXRyX21heCA9IG1hc3Rlci0+bWF4X3RyYW5zZmVyX3NpemUoc3BpKTsKKworCS8qIHRyYW5zZmVyIHNpemUgbGltaXQgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIG1lc3NzYWdlIHNpemUgbGltaXQgKi8KKwlyZXR1cm4gbWluKHRyX21heCwgbXNnX21heCk7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTk4MCw1OCArOTk3LDYgQEAKIGV4dGVybiBpbnQgc3BpX2J1c191bmxvY2soc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3Rlcik7CiAKIC8qKgotICogc3BpX3dyaXRlIC0gU1BJIHN5bmNocm9ub3VzIHdyaXRlCi0gKiBAc3BpOiBkZXZpY2UgdG8gd2hpY2ggZGF0YSB3aWxsIGJlIHdyaXR0ZW4KLSAqIEBidWY6IGRhdGEgYnVmZmVyCi0gKiBAbGVuOiBkYXRhIGJ1ZmZlciBzaXplCi0gKiBDb250ZXh0OiBjYW4gc2xlZXAKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgYnVmZmVyIEBidWYuCi0gKiBDYWxsYWJsZSBvbmx5IGZyb20gY29udGV4dHMgdGhhdCBjYW4gc2xlZXAuCi0gKgotICogUmV0dXJuOiB6ZXJvIG9uIHN1Y2Nlc3MsIGVsc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgotICovCi1zdGF0aWMgaW5saW5lIGludAotc3BpX3dyaXRlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCXQgPSB7Ci0JCQkudHhfYnVmCQk9IGJ1ZiwKLQkJCS5sZW4JCT0gbGVuLAotCQl9OwotCXN0cnVjdCBzcGlfbWVzc2FnZQltOwotCi0Jc3BpX21lc3NhZ2VfaW5pdCgmbSk7Ci0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnQsICZtKTsKLQlyZXR1cm4gc3BpX3N5bmMoc3BpLCAmbSk7Ci19Ci0KLS8qKgotICogc3BpX3JlYWQgLSBTUEkgc3luY2hyb25vdXMgcmVhZAotICogQHNwaTogZGV2aWNlIGZyb20gd2hpY2ggZGF0YSB3aWxsIGJlIHJlYWQKLSAqIEBidWY6IGRhdGEgYnVmZmVyCi0gKiBAbGVuOiBkYXRhIGJ1ZmZlciBzaXplCi0gKiBDb250ZXh0OiBjYW4gc2xlZXAKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBidWZmZXIgQGJ1Zi4KLSAqIENhbGxhYmxlIG9ubHkgZnJvbSBjb250ZXh0cyB0aGF0IGNhbiBzbGVlcC4KLSAqCi0gKiBSZXR1cm46IHplcm8gb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1zcGlfcmVhZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB2b2lkICpidWYsIHNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IHNwaV90cmFuc2Zlcgl0ID0gewotCQkJLnJ4X2J1ZgkJPSBidWYsCi0JCQkubGVuCQk9IGxlbiwKLQkJfTsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UJbTsKLQotCXNwaV9tZXNzYWdlX2luaXQoJm0pOwotCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0LCAmbSk7Ci0JcmV0dXJuIHNwaV9zeW5jKHNwaSwgJm0pOwotfQotCi0vKioKICAqIHNwaV9zeW5jX3RyYW5zZmVyIC0gc3luY2hyb25vdXMgU1BJIGRhdGEgdHJhbnNmZXIKICAqIEBzcGk6IGRldmljZSB3aXRoIHdoaWNoIGRhdGEgd2lsbCBiZSBleGNoYW5nZWQKICAqIEB4ZmVyczogQW4gYXJyYXkgb2Ygc3BpX3RyYW5zZmVycwpAQCAtMTA1NSw2ICsxMDIwLDUyIEBACiAJcmV0dXJuIHNwaV9zeW5jKHNwaSwgJm1zZyk7CiB9CiAKKy8qKgorICogc3BpX3dyaXRlIC0gU1BJIHN5bmNocm9ub3VzIHdyaXRlCisgKiBAc3BpOiBkZXZpY2UgdG8gd2hpY2ggZGF0YSB3aWxsIGJlIHdyaXR0ZW4KKyAqIEBidWY6IGRhdGEgYnVmZmVyCisgKiBAbGVuOiBkYXRhIGJ1ZmZlciBzaXplCisgKiBDb250ZXh0OiBjYW4gc2xlZXAKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgYnVmZmVyIEBidWYuCisgKiBDYWxsYWJsZSBvbmx5IGZyb20gY29udGV4dHMgdGhhdCBjYW4gc2xlZXAuCisgKgorICogUmV0dXJuOiB6ZXJvIG9uIHN1Y2Nlc3MsIGVsc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW5saW5lIGludAorc3BpX3dyaXRlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCXQgPSB7CisJCQkudHhfYnVmCQk9IGJ1ZiwKKwkJCS5sZW4JCT0gbGVuLAorCQl9OworCisJcmV0dXJuIHNwaV9zeW5jX3RyYW5zZmVyKHNwaSwgJnQsIDEpOworfQorCisvKioKKyAqIHNwaV9yZWFkIC0gU1BJIHN5bmNocm9ub3VzIHJlYWQKKyAqIEBzcGk6IGRldmljZSBmcm9tIHdoaWNoIGRhdGEgd2lsbCBiZSByZWFkCisgKiBAYnVmOiBkYXRhIGJ1ZmZlcgorICogQGxlbjogZGF0YSBidWZmZXIgc2l6ZQorICogQ29udGV4dDogY2FuIHNsZWVwCisgKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgYnVmZmVyIEBidWYuCisgKiBDYWxsYWJsZSBvbmx5IGZyb20gY29udGV4dHMgdGhhdCBjYW4gc2xlZXAuCisgKgorICogUmV0dXJuOiB6ZXJvIG9uIHN1Y2Nlc3MsIGVsc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW5saW5lIGludAorc3BpX3JlYWQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdm9pZCAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBzcGlfdHJhbnNmZXIJdCA9IHsKKwkJCS5yeF9idWYJCT0gYnVmLAorCQkJLmxlbgkJPSBsZW4sCisJCX07CisKKwlyZXR1cm4gc3BpX3N5bmNfdHJhbnNmZXIoc3BpLCAmdCwgMSk7Cit9CisKIC8qIHRoaXMgY29waWVzIHR4YnVmIGFuZCByeGJ1ZiBkYXRhOyBmb3Igc21hbGwgdHJhbnNmZXJzIG9ubHkhICovCiBleHRlcm4gaW50IHNwaV93cml0ZV90aGVuX3JlYWQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKIAkJY29uc3Qgdm9pZCAqdHhidWYsIHVuc2lnbmVkIG5fdHgsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaCBiL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oCmluZGV4IDc2OTNlMzkuLmQ5NzE4MzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oCkBAIC0yNDUsNiArMjQ1LDcgQEAKIAlyZXR1cm4gdW5saWtlbHkoc3VzcGVuZF9mcmVlemVfc3RhdGUgPT0gRlJFRVpFX1NUQVRFX0VOVEVSKTsKIH0KIAorZXh0ZXJuIHZvaWQgX19pbml0IHBtX3N0YXRlc19pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgZnJlZXplX3NldF9vcHMoY29uc3Qgc3RydWN0IHBsYXRmb3JtX2ZyZWV6ZV9vcHMgKm9wcyk7CiBleHRlcm4gdm9pZCBmcmVlemVfd2FrZSh2b2lkKTsKIApAQCAtMjc5LDYgKzI4MCw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgc3VzcGVuZF9zZXRfb3BzKGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9zdXNwZW5kX29wcyAqb3BzKSB7fQogc3RhdGljIGlubGluZSBpbnQgcG1fc3VzcGVuZChzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpIHsgcmV0dXJuIC1FTk9TWVM7IH0KIHN0YXRpYyBpbmxpbmUgYm9vbCBpZGxlX3Nob3VsZF9mcmVlemUodm9pZCkgeyByZXR1cm4gZmFsc2U7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgcG1fc3RhdGVzX2luaXQodm9pZCkge30KIHN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlemVfc2V0X29wcyhjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZnJlZXplX29wcyAqb3BzKSB7fQogc3RhdGljIGlubGluZSB2b2lkIGZyZWV6ZV93YWtlKHZvaWQpIHt9CiAjZW5kaWYgLyogIUNPTkZJR19TVVNQRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N3YXAuaCBiL2luY2x1ZGUvbGludXgvc3dhcC5oCmluZGV4IGIxN2NjNDguLmUxZDc2MTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3dhcC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3dhcC5oCkBAIC0yNTcsNiArMjU3LDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHdvcmtpbmdzZXRfbm9kZV9wYWdlc19kZWMoc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZSkKIHsKKwlWTV9XQVJOX09OX09OQ0UoIXdvcmtpbmdzZXRfbm9kZV9wYWdlcyhub2RlKSk7CiAJbm9kZS0+Y291bnQtLTsKIH0KIApAQCAtMjcyLDYgKzI3Myw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB3b3JraW5nc2V0X25vZGVfc2hhZG93c19kZWMoc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZSkKIHsKKwlWTV9XQVJOX09OX09OQ0UoIXdvcmtpbmdzZXRfbm9kZV9zaGFkb3dzKG5vZGUpKTsKIAlub2RlLT5jb3VudCAtPSAxVSA8PCBSQURJWF9UUkVFX0NPVU5UX1NISUZUOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oIGIvaW5jbHVkZS9saW51eC9zeXNjdGwuaAppbmRleCA2OTdlMTYwLi5hZGY0ZTUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KKyNpbmNsdWRlIDxsaW51eC91aWRnaWQuaD4KICNpbmNsdWRlIDx1YXBpL2xpbnV4L3N5c2N0bC5oPgogCiAvKiBGb3IgdGhlIC9wcm9jL3N5cyBzdXBwb3J0ICovCkBAIC00Miw2ICs0Myw4IEBACiAJCQkgdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKIGV4dGVybiBpbnQgcHJvY19kb2ludHZlYyhzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwKIAkJCSB2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOworZXh0ZXJuIGludCBwcm9jX2RvdWludHZlYyhzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwKKwkJCSB2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOwogZXh0ZXJuIGludCBwcm9jX2RvaW50dmVjX21pbm1heChzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwKIAkJCQl2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOwogZXh0ZXJuIGludCBwcm9jX2RvaW50dmVjX2ppZmZpZXMoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQsCkBAIC0xNTUsOCArMTU4LDEwIEBACiAKIHN0cnVjdCBjdGxfdGFibGVfcm9vdCB7CiAJc3RydWN0IGN0bF90YWJsZV9zZXQgZGVmYXVsdF9zZXQ7Ci0Jc3RydWN0IGN0bF90YWJsZV9zZXQgKigqbG9va3VwKShzdHJ1Y3QgY3RsX3RhYmxlX3Jvb3QgKnJvb3QsCi0JCQkJCSAgIHN0cnVjdCBuc3Byb3h5ICpuYW1lc3BhY2VzKTsKKwlzdHJ1Y3QgY3RsX3RhYmxlX3NldCAqKCpsb29rdXApKHN0cnVjdCBjdGxfdGFibGVfcm9vdCAqcm9vdCk7CisJdm9pZCAoKnNldF9vd25lcnNoaXApKHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpoZWFkLAorCQkJICAgICAgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsCisJCQkgICAgICBrdWlkX3QgKnVpZCwga2dpZF90ICpnaWQpOwogCWludCAoKnBlcm1pc3Npb25zKShzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqaGVhZCwgc3RydWN0IGN0bF90YWJsZSAqdGFibGUpOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90Y3AuaCBiL2luY2x1ZGUvbGludXgvdGNwLmgKaW5kZXggN2JlOWIxMi4uYTE3YWU3YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90Y3AuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RjcC5oCkBAIC0xOSw2ICsxOSw3IEBACiAKIAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3dpbl9taW5tYXguaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC9pbmV0X2Nvbm5lY3Rpb25fc29jay5oPgogI2luY2x1ZGUgPG5ldC9pbmV0X3RpbWV3YWl0X3NvY2suaD4KQEAgLTIxMiw3ICsyMTMsOCBAQAogCQl1OCByZW9yZDsgICAgLyogcmVvcmRlcmluZyBkZXRlY3RlZCAqLwogCX0gcmFjazsKIAl1MTYJYWR2bXNzOwkJLyogQWR2ZXJ0aXNlZCBNU1MJCQkqLwotCXU4CXVudXNlZDsKKwl1OAlyYXRlX2FwcF9saW1pdGVkOjEsICAvKiByYXRlX3tkZWxpdmVyZWQsaW50ZXJ2YWxfdXN9IGxpbWl0ZWQ/ICovCisJCXVudXNlZDo3OwogCXU4CW5vbmFnbGUgICAgIDogNCwvKiBEaXNhYmxlIE5hZ2xlIGFsZ29yaXRobT8gICAgICAgICAgICAgKi8KIAkJdGhpbl9sdG8gICAgOiAxLC8qIFVzZSBsaW5lYXIgdGltZW91dHMgZm9yIHRoaW4gc3RyZWFtcyAqLwogCQl0aGluX2R1cGFjayA6IDEsLyogRmFzdCByZXRyYW5zbWl0IG9uIGZpcnN0IGR1cGFjayAgICAgICovCkBAIC0yMzQsOSArMjM2LDcgQEAKIAl1MzIJbWRldl9tYXhfdXM7CS8qIG1heGltYWwgbWRldiBmb3IgdGhlIGxhc3QgcnR0IHBlcmlvZAkqLwogCXUzMglydHR2YXJfdXM7CS8qIHNtb290aGVkIG1kZXZfbWF4CQkJKi8KIAl1MzIJcnR0X3NlcTsJLyogc2VxdWVuY2UgbnVtYmVyIHRvIHVwZGF0ZSBydHR2YXIJKi8KLQlzdHJ1Y3QgcnR0X21lYXMgewotCQl1MzIgcnR0LCB0czsJLyogUlRUIGluIHVzZWMgYW5kIHNhbXBsaW5nIHRpbWUgaW4gamlmZmllcy4gKi8KLQl9IHJ0dF9taW5bM107CisJc3RydWN0ICBtaW5tYXggcnR0X21pbjsKIAogCXUzMglwYWNrZXRzX291dDsJLyogUGFja2V0cyB3aGljaCBhcmUgImluIGZsaWdodCIJKi8KIAl1MzIJcmV0cmFuc19vdXQ7CS8qIFJldHJhbnNtaXR0ZWQgcGFja2V0cyBvdXQJCSovCkBAIC0yNjgsNiArMjY4LDEyIEBACiAJCQkJICogcmVjZWl2ZXIgaW4gUmVjb3ZlcnkuICovCiAJdTMyCXBycl9vdXQ7CS8qIFRvdGFsIG51bWJlciBvZiBwa3RzIHNlbnQgZHVyaW5nIFJlY292ZXJ5LiAqLwogCXUzMglkZWxpdmVyZWQ7CS8qIFRvdGFsIGRhdGEgcGFja2V0cyBkZWxpdmVyZWQgaW5jbC4gcmV4bWl0cyAqLworCXUzMglsb3N0OwkJLyogVG90YWwgZGF0YSBwYWNrZXRzIGxvc3QgaW5jbC4gcmV4bWl0cyAqLworCXUzMglhcHBfbGltaXRlZDsJLyogbGltaXRlZCB1bnRpbCAiZGVsaXZlcmVkIiByZWFjaGVzIHRoaXMgdmFsICovCisJc3RydWN0IHNrYl9tc3RhbXAgZmlyc3RfdHhfbXN0YW1wOyAgLyogc3RhcnQgb2Ygd2luZG93IHNlbmQgcGhhc2UgKi8KKwlzdHJ1Y3Qgc2tiX21zdGFtcCBkZWxpdmVyZWRfbXN0YW1wOyAvKiB0aW1lIHdlIHJlYWNoZWQgImRlbGl2ZXJlZCIgKi8KKwl1MzIJcmF0ZV9kZWxpdmVyZWQ7ICAgIC8qIHNhdmVkIHJhdGUgc2FtcGxlOiBwYWNrZXRzIGRlbGl2ZXJlZCAqLworCXUzMglyYXRlX2ludGVydmFsX3VzOyAgLyogc2F2ZWQgcmF0ZSBzYW1wbGU6IHRpbWUgZWxhcHNlZCAqLwogCiAgCXUzMglyY3Zfd25kOwkvKiBDdXJyZW50IHJlY2VpdmVyIHdpbmRvdwkJKi8KIAl1MzIJd3JpdGVfc2VxOwkvKiBUYWlsKCsxKSBvZiBkYXRhIGhlbGQgaW4gdGNwIHNlbmQgYnVmZmVyICovCkBAIC0yODEsMTAgKzI4Nyw5IEBACiAJc3RydWN0IHNrX2J1ZmYqIGxvc3Rfc2tiX2hpbnQ7CiAJc3RydWN0IHNrX2J1ZmYgKnJldHJhbnNtaXRfc2tiX2hpbnQ7CiAKLQkvKiBPT08gc2VnbWVudHMgZ28gaW4gdGhpcyBsaXN0LiBOb3RlIHRoYXQgc29ja2V0IGxvY2sgbXVzdCBiZSBoZWxkLAotCSAqIGFzIHdlIGRvIG5vdCB1c2Ugc2tfYnVmZl9oZWFkIGxvY2suCi0JICovCi0Jc3RydWN0IHNrX2J1ZmZfaGVhZAlvdXRfb2Zfb3JkZXJfcXVldWU7CisJLyogT09PIHNlZ21lbnRzIGdvIGluIHRoaXMgcmJ0cmVlLiBTb2NrZXQgbG9jayBtdXN0IGJlIGhlbGQuICovCisJc3RydWN0IHJiX3Jvb3QJb3V0X29mX29yZGVyX3F1ZXVlOworCXN0cnVjdCBza19idWZmCSpvb29fbGFzdF9za2I7IC8qIGNhY2hlIHJiX2xhc3Qob3V0X29mX29yZGVyX3F1ZXVlKSAqLwogCiAJLyogU0FDS3MgZGF0YSwgdGhlc2UgMiBuZWVkIHRvIGJlIHRvZ2V0aGVyIChzZWUgdGNwX29wdGlvbnNfd3JpdGUpICovCiAJc3RydWN0IHRjcF9zYWNrX2Jsb2NrIGR1cGxpY2F0ZV9zYWNrWzFdOyAvKiBELVNBQ0sgYmxvY2sgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvbGludXgvdGhyZWFkX2luZm8uaAppbmRleCBjYmQ4OTkwLi40NWYwMDRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9saW51eC90aHJlYWRfaW5mby5oCkBAIC0xMyw2ICsxMywyMSBAQAogc3RydWN0IHRpbWVzcGVjOwogc3RydWN0IGNvbXBhdF90aW1lc3BlYzsKIAorI2lmZGVmIENPTkZJR19USFJFQURfSU5GT19JTl9UQVNLCitzdHJ1Y3QgdGhyZWFkX2luZm8geworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwkJLyogbG93IGxldmVsIGZsYWdzICovCit9OworCisjZGVmaW5lIElOSVRfVEhSRUFEX0lORk8odHNrKQkJCVwKK3sJCQkJCQlcCisJLmZsYWdzCQk9IDAsCQkJXAorfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfVEhSRUFEX0lORk9fSU5fVEFTSworI2RlZmluZSBjdXJyZW50X3RocmVhZF9pbmZvKCkgKChzdHJ1Y3QgdGhyZWFkX2luZm8gKiljdXJyZW50KQorI2VuZGlmCisKIC8qCiAgKiBTeXN0ZW0gY2FsbCByZXN0YXJ0IGJsb2NrLgogICovCkBAIC0xMTgsMTAgKzEzMywxMSBAQAogZXh0ZXJuIHZvaWQgX19jaGVja19vYmplY3Rfc2l6ZShjb25zdCB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgbiwKIAkJCQkJYm9vbCB0b191c2VyKTsKIAotc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX29iamVjdF9zaXplKGNvbnN0IHZvaWQgKnB0ciwgdW5zaWduZWQgbG9uZyBuLAotCQkJCSAgICAgYm9vbCB0b191c2VyKQorc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIGNoZWNrX29iamVjdF9zaXplKGNvbnN0IHZvaWQgKnB0ciwgdW5zaWduZWQgbG9uZyBuLAorCQkJCQkgICAgICBib29sIHRvX3VzZXIpCiB7Ci0JX19jaGVja19vYmplY3Rfc2l6ZShwdHIsIG4sIHRvX3VzZXIpOworCWlmICghX19idWlsdGluX2NvbnN0YW50X3AobikpCisJCV9fY2hlY2tfb2JqZWN0X3NpemUocHRyLCBuLCB0b191c2VyKTsKIH0KICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfb2JqZWN0X3NpemUoY29uc3Qgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIG4sCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpbWU2NC5oIGIvaW5jbHVkZS9saW51eC90aW1lNjQuaAppbmRleCA3ZTVkMmZhLi45ODBjNzFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RpbWU2NC5oCisrKyBiL2luY2x1ZGUvbGludXgvdGltZTY0LmgKQEAgLTUsNiArNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbWF0aDY0Lmg+CiAKIHR5cGVkZWYgX19zNjQgdGltZTY0X3Q7Cit0eXBlZGVmIF9fdTY0IHRpbWV1NjRfdDsKIAogLyoKICAqIFRoaXMgd2FudHMgdG8gZ28gaW50byB1YXBpL2xpbnV4L3RpbWUuaCBvbmNlIHdlIGFncmVlZCBhYm91dCB0aGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGltZWtlZXBpbmcuaCBiL2luY2x1ZGUvbGludXgvdGltZWtlZXBpbmcuaAppbmRleCA4MTZiNzU0Li4wOTE2OGM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RpbWVrZWVwaW5nLmgKKysrIGIvaW5jbHVkZS9saW51eC90aW1la2VlcGluZy5oCkBAIC0xLDcgKzEsNyBAQAogI2lmbmRlZiBfTElOVVhfVElNRUtFRVBJTkdfSAogI2RlZmluZSBfTElOVVhfVElNRUtFRVBJTkdfSAogCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZXJybm8tYmFzZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAKIC8qIEluY2x1ZGVkIGZyb20gbGludXgva3RpbWUuaCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RvcnR1cmUuaCBiL2luY2x1ZGUvbGludXgvdG9ydHVyZS5oCmluZGV4IDY2ODVhNzMuLmE0NTcwMmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdG9ydHVyZS5oCisrKyBiL2luY2x1ZGUvbGludXgvdG9ydHVyZS5oCkBAIC00Myw3ICs0Myw3IEBACiAKICNkZWZpbmUgVE9SVFVSRV9GTEFHICItdG9ydHVyZToiCiAjZGVmaW5lIFRPUk9VVF9TVFJJTkcocykgXAotCXByX2FsZXJ0KCIlcyIgVE9SVFVSRV9GTEFHIHMgIlxuIiwgdG9ydHVyZV90eXBlKQorCXByX2FsZXJ0KCIlcyIgVE9SVFVSRV9GTEFHICIgJXNcbiIsIHRvcnR1cmVfdHlwZSwgcykKICNkZWZpbmUgVkVSQk9TRV9UT1JPVVRfU1RSSU5HKHMpIFwKIAlkbyB7IGlmICh2ZXJib3NlKSBwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRyAiICVzXG4iLCB0b3J0dXJlX3R5cGUsIHMpOyB9IHdoaWxlICgwKQogI2RlZmluZSBWRVJCT1NFX1RPUk9VVF9FUlJTVFJJTkcocykgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91NjRfc3RhdHNfc3luYy5oIGIvaW5jbHVkZS9saW51eC91NjRfc3RhdHNfc3luYy5oCmluZGV4IGQzYTJiYjcuLjY1MGYzZGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdTY0X3N0YXRzX3N5bmMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3U2NF9zdGF0c19zeW5jLmgKQEAgLTEwMywyOSArMTAzLDQwIEBACiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdTY0X3N0YXRzX2ZldGNoX2JlZ2luKGNvbnN0IHN0cnVjdCB1NjRfc3RhdHNfc3luYyAqc3luY3ApCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX3U2NF9zdGF0c19mZXRjaF9iZWdpbihjb25zdCBzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMgKnN5bmNwKQogewogI2lmIEJJVFNfUEVSX0xPTkc9PTMyICYmIGRlZmluZWQoQ09ORklHX1NNUCkKIAlyZXR1cm4gcmVhZF9zZXFjb3VudF9iZWdpbigmc3luY3AtPnNlcSk7CiAjZWxzZQotI2lmIEJJVFNfUEVSX0xPTkc9PTMyCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdTY0X3N0YXRzX2ZldGNoX2JlZ2luKGNvbnN0IHN0cnVjdCB1NjRfc3RhdHNfc3luYyAqc3luY3ApCit7CisjaWYgQklUU19QRVJfTE9ORz09MzIgJiYgIWRlZmluZWQoQ09ORklHX1NNUCkKIAlwcmVlbXB0X2Rpc2FibGUoKTsKICNlbmRpZgotCXJldHVybiAwOworCXJldHVybiBfX3U2NF9zdGF0c19mZXRjaF9iZWdpbihzeW5jcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBfX3U2NF9zdGF0c19mZXRjaF9yZXRyeShjb25zdCBzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMgKnN5bmNwLAorCQkJCQkgdW5zaWduZWQgaW50IHN0YXJ0KQoreworI2lmIEJJVFNfUEVSX0xPTkc9PTMyICYmIGRlZmluZWQoQ09ORklHX1NNUCkKKwlyZXR1cm4gcmVhZF9zZXFjb3VudF9yZXRyeSgmc3luY3AtPnNlcSwgc3RhcnQpOworI2Vsc2UKKwlyZXR1cm4gZmFsc2U7CiAjZW5kaWYKIH0KIAogc3RhdGljIGlubGluZSBib29sIHU2NF9zdGF0c19mZXRjaF9yZXRyeShjb25zdCBzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMgKnN5bmNwLAogCQkJCQkgdW5zaWduZWQgaW50IHN0YXJ0KQogewotI2lmIEJJVFNfUEVSX0xPTkc9PTMyICYmIGRlZmluZWQoQ09ORklHX1NNUCkKLQlyZXR1cm4gcmVhZF9zZXFjb3VudF9yZXRyeSgmc3luY3AtPnNlcSwgc3RhcnQpOwotI2Vsc2UKLSNpZiBCSVRTX1BFUl9MT05HPT0zMgorI2lmIEJJVFNfUEVSX0xPTkc9PTMyICYmICFkZWZpbmVkKENPTkZJR19TTVApCiAJcHJlZW1wdF9lbmFibGUoKTsKICNlbmRpZgotCXJldHVybiBmYWxzZTsKLSNlbmRpZgorCXJldHVybiBfX3U2NF9zdGF0c19mZXRjaF9yZXRyeShzeW5jcCwgc3RhcnQpOwogfQogCiAvKgpAQCAtMTM2LDI3ICsxNDcsMTkgQEAKICAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdTY0X3N0YXRzX2ZldGNoX2JlZ2luX2lycShjb25zdCBzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMgKnN5bmNwKQogewotI2lmIEJJVFNfUEVSX0xPTkc9PTMyICYmIGRlZmluZWQoQ09ORklHX1NNUCkKLQlyZXR1cm4gcmVhZF9zZXFjb3VudF9iZWdpbigmc3luY3AtPnNlcSk7Ci0jZWxzZQotI2lmIEJJVFNfUEVSX0xPTkc9PTMyCisjaWYgQklUU19QRVJfTE9ORz09MzIgJiYgIWRlZmluZWQoQ09ORklHX1NNUCkKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogI2VuZGlmCi0JcmV0dXJuIDA7Ci0jZW5kaWYKKwlyZXR1cm4gX191NjRfc3RhdHNfZmV0Y2hfYmVnaW4oc3luY3ApOwogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgdTY0X3N0YXRzX2ZldGNoX3JldHJ5X2lycShjb25zdCBzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMgKnN5bmNwLAotCQkJCQkgdW5zaWduZWQgaW50IHN0YXJ0KQorCQkJCQkgICAgIHVuc2lnbmVkIGludCBzdGFydCkKIHsKLSNpZiBCSVRTX1BFUl9MT05HPT0zMiAmJiBkZWZpbmVkKENPTkZJR19TTVApCi0JcmV0dXJuIHJlYWRfc2VxY291bnRfcmV0cnkoJnN5bmNwLT5zZXEsIHN0YXJ0KTsKLSNlbHNlCi0jaWYgQklUU19QRVJfTE9ORz09MzIKKyNpZiBCSVRTX1BFUl9MT05HPT0zMiAmJiAhZGVmaW5lZChDT05GSUdfU01QKQogCWxvY2FsX2lycV9lbmFibGUoKTsKICNlbmRpZgotCXJldHVybiBmYWxzZTsKLSNlbmRpZgorCXJldHVybiBfX3U2NF9zdGF0c19mZXRjaF9yZXRyeShzeW5jcCwgc3RhcnQpOwogfQogCiAjZW5kaWYgLyogX0xJTlVYX1U2NF9TVEFUU19TWU5DX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdWlvLmggYi9pbmNsdWRlL2xpbnV4L3Vpby5oCmluZGV4IDFiNWQxY2QuLjc1YjRhYWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdWlvLmgKKysrIGIvaW5jbHVkZS9saW51eC91aW8uaApAQCAtNzYsNyArNzYsNyBAQAogCQlzdHJ1Y3QgaW92X2l0ZXIgKmksIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3QgYnl0ZXMpOwogdm9pZCBpb3ZfaXRlcl9hZHZhbmNlKHN0cnVjdCBpb3ZfaXRlciAqaSwgc2l6ZV90IGJ5dGVzKTsKIGludCBpb3ZfaXRlcl9mYXVsdF9pbl9yZWFkYWJsZShzdHJ1Y3QgaW92X2l0ZXIgKmksIHNpemVfdCBieXRlcyk7Ci1pbnQgaW92X2l0ZXJfZmF1bHRfaW5fbXVsdGlwYWdlc19yZWFkYWJsZShzdHJ1Y3QgaW92X2l0ZXIgKmksIHNpemVfdCBieXRlcyk7CisjZGVmaW5lIGlvdl9pdGVyX2ZhdWx0X2luX211bHRpcGFnZXNfcmVhZGFibGUgaW92X2l0ZXJfZmF1bHRfaW5fcmVhZGFibGUKIHNpemVfdCBpb3ZfaXRlcl9zaW5nbGVfc2VnX2NvdW50KGNvbnN0IHN0cnVjdCBpb3ZfaXRlciAqaSk7CiBzaXplX3QgY29weV9wYWdlX3RvX2l0ZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBieXRlcywKIAkJCSBzdHJ1Y3QgaW92X2l0ZXIgKmkpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91bHBpL2RyaXZlci5oIGIvaW5jbHVkZS9saW51eC91bHBpL2RyaXZlci5oCmluZGV4IDM4OGY2ZTAuLmE3YWYyMWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdWxwaS9kcml2ZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VscGkvZHJpdmVyLmgKQEAgLTE1LDcgKzE1LDcgQEAKICAqLwogc3RydWN0IHVscGkgewogCXN0cnVjdCB1bHBpX2RldmljZV9pZCBpZDsKLQlzdHJ1Y3QgdWxwaV9vcHMgKm9wczsKKwljb25zdCBzdHJ1Y3QgdWxwaV9vcHMgKm9wczsKIAlzdHJ1Y3QgZGV2aWNlIGRldjsKIH07CiAKQEAgLTQ3LDcgKzQ3LDExIEBACiAKICNkZWZpbmUgdG9fdWxwaV9kcml2ZXIoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCB1bHBpX2RyaXZlciwgZHJpdmVyKQogCi1pbnQgdWxwaV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHVscGlfZHJpdmVyICpkcnYpOworLyoKKyAqIHVzZSBhIG1hY3JvIHRvIGF2b2lkIGluY2x1ZGUgY2hhaW5pbmcgdG8gZ2V0IFRISVNfTU9EVUxFCisgKi8KKyNkZWZpbmUgdWxwaV9yZWdpc3Rlcl9kcml2ZXIoZHJ2KSBfX3VscGlfcmVnaXN0ZXJfZHJpdmVyKGRydiwgVEhJU19NT0RVTEUpCitpbnQgX191bHBpX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdWxwaV9kcml2ZXIgKmRydiwgc3RydWN0IG1vZHVsZSAqbW9kdWxlKTsKIHZvaWQgdWxwaV91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdWxwaV9kcml2ZXIgKmRydik7CiAKICNkZWZpbmUgbW9kdWxlX3VscGlfZHJpdmVyKF9fdWxwaV9kcml2ZXIpIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdWxwaS9pbnRlcmZhY2UuaCBiL2luY2x1ZGUvbGludXgvdWxwaS9pbnRlcmZhY2UuaAppbmRleCA0ZGU4YWI0Li5hMjAxMWE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VscGkvaW50ZXJmYWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC91bHBpL2ludGVyZmFjZS5oCkBAIC00LDIwICs0LDE5IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogc3RydWN0IHVscGk7CitzdHJ1Y3QgZGV2aWNlOwogCiAvKioKICAqIHN0cnVjdCB1bHBpX29wcyAtIFVMUEkgcmVnaXN0ZXIgYWNjZXNzCi0gKiBAZGV2OiB0aGUgaW50ZXJmYWNlIHByb3ZpZGVyCiAgKiBAcmVhZDogcmVhZCBvcGVyYXRpb24gZm9yIFVMUEkgcmVnaXN0ZXIgYWNjZXNzCiAgKiBAd3JpdGU6IHdyaXRlIG9wZXJhdGlvbiBmb3IgVUxQSSByZWdpc3RlciBhY2Nlc3MKICAqLwogc3RydWN0IHVscGlfb3BzIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0JaW50ICgqcmVhZCkoc3RydWN0IHVscGlfb3BzICpvcHMsIHU4IGFkZHIpOwotCWludCAoKndyaXRlKShzdHJ1Y3QgdWxwaV9vcHMgKm9wcywgdTggYWRkciwgdTggdmFsKTsKKwlpbnQgKCpyZWFkKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4IGFkZHIpOworCWludCAoKndyaXRlKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4IGFkZHIsIHU4IHZhbCk7CiB9OwogCi1zdHJ1Y3QgdWxwaSAqdWxwaV9yZWdpc3Rlcl9pbnRlcmZhY2Uoc3RydWN0IGRldmljZSAqLCBzdHJ1Y3QgdWxwaV9vcHMgKik7CitzdHJ1Y3QgdWxwaSAqdWxwaV9yZWdpc3Rlcl9pbnRlcmZhY2Uoc3RydWN0IGRldmljZSAqLCBjb25zdCBzdHJ1Y3QgdWxwaV9vcHMgKik7CiB2b2lkIHVscGlfdW5yZWdpc3Rlcl9pbnRlcmZhY2Uoc3RydWN0IHVscGkgKik7CiAKICNlbmRpZiAvKiBfX0xJTlVYX1VMUElfSU5URVJGQUNFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL2NvbXBvc2l0ZS5oIGIvaW5jbHVkZS9saW51eC91c2IvY29tcG9zaXRlLmgKaW5kZXggMmI4MWIyNC4uNDYxNmE0OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IvY29tcG9zaXRlLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IvY29tcG9zaXRlLmgKQEAgLTIyMCw3ICsyMjAsOCBAQAogCWludAkJCSgqc2V0dXApKHN0cnVjdCB1c2JfZnVuY3Rpb24gKiwKIAkJCQkJY29uc3Qgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKTsKIAlib29sCQkJKCpyZXFfbWF0Y2gpKHN0cnVjdCB1c2JfZnVuY3Rpb24gKiwKLQkJCQkJY29uc3Qgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKTsKKwkJCQkJY29uc3Qgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqLAorCQkJCQlib29sIGNvbmZpZzApOwogCXZvaWQJCQkoKnN1c3BlbmQpKHN0cnVjdCB1c2JfZnVuY3Rpb24gKik7CiAJdm9pZAkJCSgqcmVzdW1lKShzdHJ1Y3QgdXNiX2Z1bmN0aW9uICopOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9nYWRnZXQuaCBiL2luY2x1ZGUvbGludXgvdXNiL2dhZGdldC5oCmluZGV4IDYxMmRiZGYuLjhlODFmOWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL2dhZGdldC5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL2dhZGdldC5oCkBAIC0zNDYsNiArMzQ2LDggQEAKICAqCW9yIEItUGVyaXBoZXJhbCB3YW50cyB0byB0YWtlIGhvc3Qgcm9sZS4KICAqIEBxdWlya19lcF9vdXRfYWxpZ25lZF9zaXplOiBlcG91dCByZXF1aXJlcyBidWZmZXIgc2l6ZSB0byBiZSBhbGlnbmVkIHRvCiAgKglNYXhQYWNrZXRTaXplLgorICogQHF1aXJrX2F2b2lkc19za2JfcmVzZXJ2ZTogdWRjL3BsYXRmb3JtIHdhbnRzIHRvIGF2b2lkIHNrYl9yZXNlcnZlKCkgaW4KKyAqCXVfZXRoZXIuYyB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLgogICogQGlzX3NlbGZwb3dlcmVkOiBpZiB0aGUgZ2FkZ2V0IGlzIHNlbGYtcG93ZXJlZC4KICAqIEBkZWFjdGl2YXRlZDogVHJ1ZSBpZiBnYWRnZXQgaXMgZGVhY3RpdmF0ZWQgLSBpbiBkZWFjdGl2YXRlZCBzdGF0ZSBpdCBjYW5ub3QKICAqCWJlIGNvbm5lY3RlZC4KQEAgLTM5OCw2ICs0MDAsNyBAQAogCXVuc2lnbmVkCQkJcXVpcmtfYWx0c2V0X25vdF9zdXBwOjE7CiAJdW5zaWduZWQJCQlxdWlya19zdGFsbF9ub3Rfc3VwcDoxOwogCXVuc2lnbmVkCQkJcXVpcmtfemxwX25vdF9zdXBwOjE7CisJdW5zaWduZWQJCQlxdWlya19hdm9pZHNfc2tiX3Jlc2VydmU6MTsKIAl1bnNpZ25lZAkJCWlzX3NlbGZwb3dlcmVkOjE7CiAJdW5zaWduZWQJCQlkZWFjdGl2YXRlZDoxOwogCXVuc2lnbmVkCQkJY29ubmVjdGVkOjE7CkBAIC00MTgsOCArNDIxLDIwIEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICYoZ2FkZ2V0KS0+ZXBfbGlzdCwgZXBfbGlzdCkKIAogLyoqCisgKiB1c2JfZXBfYWxpZ24gLSByZXR1cm5zIEBsZW4gYWxpZ25lZCB0byBlcCdzIG1heHBhY2tldHNpemUuCisgKiBAZXA6IHRoZSBlbmRwb2ludCB3aG9zZSBtYXhwYWNrZXRzaXplIGlzIHVzZWQgdG8gYWxpZ24gQGxlbgorICogQGxlbjogYnVmZmVyIHNpemUncyBsZW5ndGggdG8gYWxpZ24gdG8gQGVwJ3MgbWF4cGFja2V0c2l6ZQorICoKKyAqIFRoaXMgaGVscGVyIGlzIHVzZWQgdG8gYWxpZ24gYnVmZmVyJ3Mgc2l6ZSB0byBhbiBlcCdzIG1heHBhY2tldHNpemUuCisgKi8KK3N0YXRpYyBpbmxpbmUgc2l6ZV90IHVzYl9lcF9hbGlnbihzdHJ1Y3QgdXNiX2VwICplcCwgc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gcm91bmRfdXAobGVuLCAoc2l6ZV90KWxlMTZfdG9fY3B1KGVwLT5kZXNjLT53TWF4UGFja2V0U2l6ZSkpOworfQorCisvKioKICAqIHVzYl9lcF9hbGlnbl9tYXliZSAtIHJldHVybnMgQGxlbiBhbGlnbmVkIHRvIGVwJ3MgbWF4cGFja2V0c2l6ZSBpZiBnYWRnZXQKLSAqCXJlcXVpcmVzIHF1aXJrX2VwX291dF9hbGlnbmVkX3NpemUsIG90aGVyd2lzZSByZWd1ZW5zIGxlbi4KKyAqCXJlcXVpcmVzIHF1aXJrX2VwX291dF9hbGlnbmVkX3NpemUsIG90aGVyd2lzZSByZXR1cm5zIGxlbi4KICAqIEBnOiBjb250cm9sbGVyIHRvIGNoZWNrIGZvciBxdWlyawogICogQGVwOiB0aGUgZW5kcG9pbnQgd2hvc2UgbWF4cGFja2V0c2l6ZSBpcyB1c2VkIHRvIGFsaWduIEBsZW4KICAqIEBsZW46IGJ1ZmZlciBzaXplJ3MgbGVuZ3RoIHRvIGFsaWduIHRvIEBlcCdzIG1heHBhY2tldHNpemUKQEAgLTQzMCw4ICs0NDUsNyBAQAogc3RhdGljIGlubGluZSBzaXplX3QKIHVzYl9lcF9hbGlnbl9tYXliZShzdHJ1Y3QgdXNiX2dhZGdldCAqZywgc3RydWN0IHVzYl9lcCAqZXAsIHNpemVfdCBsZW4pCiB7Ci0JcmV0dXJuICFnLT5xdWlya19lcF9vdXRfYWxpZ25lZF9zaXplID8gbGVuIDoKLQkJCXJvdW5kX3VwKGxlbiwgKHNpemVfdCllcC0+ZGVzYy0+d01heFBhY2tldFNpemUpOworCXJldHVybiBnLT5xdWlya19lcF9vdXRfYWxpZ25lZF9zaXplID8gdXNiX2VwX2FsaWduKGVwLCBsZW4pIDogbGVuOwogfQogCiAvKioKQEAgLTQ2Myw2ICs0NzcsMTYgQEAKIH0KIAogLyoqCisgKiBnYWRnZXRfYXZvaWRzX3NrYl9yZXNlcnZlIC0gcmV0dXJuIHRydWUgaWZmIHRoZSBoYXJkd2FyZSB3b3VsZCBsaWtlIHRvIGF2b2lkCisgKglza2JfcmVzZXJ2ZSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLgorICogQGc6IGNvbnRyb2xsZXIgdG8gY2hlY2sgZm9yIHF1aXJrCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdhZGdldF9hdm9pZHNfc2tiX3Jlc2VydmUoc3RydWN0IHVzYl9nYWRnZXQgKmcpCit7CisJcmV0dXJuIGctPnF1aXJrX2F2b2lkc19za2JfcmVzZXJ2ZTsKK30KKworLyoqCiAgKiBnYWRnZXRfaXNfZHVhbHNwZWVkIC0gcmV0dXJuIHRydWUgaWZmIHRoZSBoYXJkd2FyZSBoYW5kbGVzIGhpZ2ggc3BlZWQKICAqIEBnOiBjb250cm9sbGVyIHRoYXQgbWlnaHQgc3VwcG9ydCBib3RoIGhpZ2ggYW5kIGZ1bGwgc3BlZWRzCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiX3VzdWFsLmggYi9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oCmluZGV4IDI0NWY1N2QuLjBhYWUxYjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiX3VzdWFsLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2JfdXN1YWwuaApAQCAtODEsNiArODEsOCBAQAogCQkvKiBTZXRzIG1heF9zZWN0b3JzIHRvIDI0MCAqLwkJCVwKIAlVU19GTEFHKE5PX1JFUE9SVF9MVU5TLAkweDEwMDAwMDAwKQkJCVwKIAkJLyogQ2Fubm90IGhhbmRsZSBSRVBPUlRfTFVOUyAqLwkJCVwKKwlVU19GTEFHKEFMV0FZU19TWU5DLCAweDIwMDAwMDAwKQkJCVwKKwkJLyogbGllcyBhYm91dCBjYWNoaW5nLCBzbyBhbHdheXMgc3luYyAqLwlcCiAKICNkZWZpbmUgVVNfRkxBRyhuYW1lLCB2YWx1ZSkJVVNfRkxfIyNuYW1lID0gdmFsdWUgLAogZW51bSB7IFVTX0RPX0FMTF9GTEFHUyB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2VyX25hbWVzcGFjZS5oIGIvaW5jbHVkZS9saW51eC91c2VyX25hbWVzcGFjZS5oCmluZGV4IDkyMTcxNjkuLmViMjA5ZDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNlcl9uYW1lc3BhY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzZXJfbmFtZXNwYWNlLmgKQEAgLTIyLDYgKzIyLDE5IEBACiAKICNkZWZpbmUgVVNFUk5TX0lOSVRfRkxBR1MgVVNFUk5TX1NFVEdST1VQU19BTExPV0VECiAKK3N0cnVjdCB1Y291bnRzOworCitlbnVtIHVjb3VudF90eXBlIHsKKwlVQ09VTlRfVVNFUl9OQU1FU1BBQ0VTLAorCVVDT1VOVF9QSURfTkFNRVNQQUNFUywKKwlVQ09VTlRfVVRTX05BTUVTUEFDRVMsCisJVUNPVU5UX0lQQ19OQU1FU1BBQ0VTLAorCVVDT1VOVF9ORVRfTkFNRVNQQUNFUywKKwlVQ09VTlRfTU5UX05BTUVTUEFDRVMsCisJVUNPVU5UX0NHUk9VUF9OQU1FU1BBQ0VTLAorCVVDT1VOVF9DT1VOVFMsCit9OworCiBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgewogCXN0cnVjdCB1aWRfZ2lkX21hcAl1aWRfbWFwOwogCXN0cnVjdCB1aWRfZ2lkX21hcAlnaWRfbWFwOwpAQCAtMzksMTAgKzUyLDMwIEBACiAJc3RydWN0IGtleQkJKnBlcnNpc3RlbnRfa2V5cmluZ19yZWdpc3RlcjsKIAlzdHJ1Y3Qgcndfc2VtYXBob3JlCXBlcnNpc3RlbnRfa2V5cmluZ19yZWdpc3Rlcl9zZW07CiAjZW5kaWYKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29yazsKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJc3RydWN0IGN0bF90YWJsZV9zZXQJc2V0OworCXN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpzeXNjdGxzOworI2VuZGlmCisJc3RydWN0IHVjb3VudHMJCSp1Y291bnRzOworCWludCB1Y291bnRfbWF4W1VDT1VOVF9DT1VOVFNdOworfTsKKworc3RydWN0IHVjb3VudHMgeworCXN0cnVjdCBobGlzdF9ub2RlIG5vZGU7CisJc3RydWN0IHVzZXJfbmFtZXNwYWNlICpuczsKKwlrdWlkX3QgdWlkOworCWF0b21pY190IGNvdW50OworCWF0b21pY190IHVjb3VudFtVQ09VTlRfQ09VTlRTXTsKIH07CiAKIGV4dGVybiBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgaW5pdF91c2VyX25zOwogCitib29sIHNldHVwX3VzZXJuc19zeXNjdGxzKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnMpOwordm9pZCByZXRpcmVfdXNlcm5zX3N5c2N0bHMoc3RydWN0IHVzZXJfbmFtZXNwYWNlICpucyk7CitzdHJ1Y3QgdWNvdW50cyAqaW5jX3Vjb3VudChzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zLCBrdWlkX3QgdWlkLCBlbnVtIHVjb3VudF90eXBlIHR5cGUpOwordm9pZCBkZWNfdWNvdW50KHN0cnVjdCB1Y291bnRzICp1Y291bnRzLCBlbnVtIHVjb3VudF90eXBlIHR5cGUpOworCiAjaWZkZWYgQ09ORklHX1VTRVJfTlMKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKmdldF91c2VyX25zKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnMpCkBAIC01NCwxMiArODcsMTIgQEAKIAogZXh0ZXJuIGludCBjcmVhdGVfdXNlcl9ucyhzdHJ1Y3QgY3JlZCAqbmV3KTsKIGV4dGVybiBpbnQgdW5zaGFyZV91c2VybnModW5zaWduZWQgbG9uZyB1bnNoYXJlX2ZsYWdzLCBzdHJ1Y3QgY3JlZCAqKm5ld19jcmVkKTsKLWV4dGVybiB2b2lkIGZyZWVfdXNlcl9ucyhzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zKTsKK2V4dGVybiB2b2lkIF9fcHV0X3VzZXJfbnMoc3RydWN0IHVzZXJfbmFtZXNwYWNlICpucyk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfdXNlcl9ucyhzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zKQogewogCWlmIChucyAmJiBhdG9taWNfZGVjX2FuZF90ZXN0KCZucy0+Y291bnQpKQotCQlmcmVlX3VzZXJfbnMobnMpOworCQlfX3B1dF91c2VyX25zKG5zKTsKIH0KIAogc3RydWN0IHNlcV9vcGVyYXRpb25zOwpAQCAtNzMsNiArMTA2LDggQEAKIGV4dGVybiBpbnQgcHJvY19zZXRncm91cHNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpOwogZXh0ZXJuIGJvb2wgdXNlcm5zX21heV9zZXRncm91cHMoY29uc3Qgc3RydWN0IHVzZXJfbmFtZXNwYWNlICpucyk7CiBleHRlcm4gYm9vbCBjdXJyZW50X2luX3VzZXJucyhjb25zdCBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnRhcmdldF9ucyk7CisKK3N0cnVjdCBuc19jb21tb24gKm5zX2dldF9vd25lcihzdHJ1Y3QgbnNfY29tbW9uICpucyk7CiAjZWxzZQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqZ2V0X3VzZXJfbnMoc3RydWN0IHVzZXJfbmFtZXNwYWNlICpucykKQEAgLTEwNiw2ICsxNDEsMTEgQEAKIHsKIAlyZXR1cm4gdHJ1ZTsKIH0KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbnNfY29tbW9uICpuc19nZXRfb3duZXIoc3RydWN0IG5zX2NvbW1vbiAqbnMpCit7CisJcmV0dXJuIEVSUl9QVFIoLUVQRVJNKTsKK30KICNlbmRpZgogCiAjZW5kaWYgLyogX0xJTlVYX1VTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91dHNuYW1lLmggYi9pbmNsdWRlL2xpbnV4L3V0c25hbWUuaAppbmRleCA1MDkzZjU4Li42MGYwYmI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3V0c25hbWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3V0c25hbWUuaApAQCAtMjQsNiArMjQsNyBAQAogCXN0cnVjdCBrcmVmIGtyZWY7CiAJc3RydWN0IG5ld191dHNuYW1lIG5hbWU7CiAJc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zOworCXN0cnVjdCB1Y291bnRzICp1Y291bnRzOwogCXN0cnVjdCBuc19jb21tb24gbnM7CiB9OwogZXh0ZXJuIHN0cnVjdCB1dHNfbmFtZXNwYWNlIGluaXRfdXRzX25zOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92bWUuaCBiL2luY2x1ZGUvbGludXgvdm1lLmgKaW5kZXggNzFlNGE2ZC4uZWE2MDk1ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92bWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZtZS5oCkBAIC0xNjYsNyArMTY2LDcgQEAKIGludCB2bWVfbG1fY291bnQoc3RydWN0IHZtZV9yZXNvdXJjZSAqKTsKIGludCB2bWVfbG1fc2V0KHN0cnVjdCB2bWVfcmVzb3VyY2UgKiwgdW5zaWduZWQgbG9uZyBsb25nLCB1MzIsIHUzMik7CiBpbnQgdm1lX2xtX2dldChzdHJ1Y3Qgdm1lX3Jlc291cmNlICosIHVuc2lnbmVkIGxvbmcgbG9uZyAqLCB1MzIgKiwgdTMyICopOwotaW50IHZtZV9sbV9hdHRhY2goc3RydWN0IHZtZV9yZXNvdXJjZSAqLCBpbnQsIHZvaWQgKCpjYWxsYmFjaykoaW50KSk7CitpbnQgdm1lX2xtX2F0dGFjaChzdHJ1Y3Qgdm1lX3Jlc291cmNlICosIGludCwgdm9pZCAoKmNhbGxiYWNrKSh2b2lkICopLCB2b2lkICopOwogaW50IHZtZV9sbV9kZXRhY2goc3RydWN0IHZtZV9yZXNvdXJjZSAqLCBpbnQpOwogdm9pZCB2bWVfbG1fZnJlZShzdHJ1Y3Qgdm1lX3Jlc291cmNlICopOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dhaXQuaCBiL2luY2x1ZGUvbGludXgvd2FpdC5oCmluZGV4IGMzZmY3NGQuLjI0MDhlOGQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dhaXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3dhaXQuaApAQCAtMjQ4LDYgKzI0OCw4IEBACiAJKCFfX2J1aWx0aW5fY29uc3RhbnRfcChzdGF0ZSkgfHwJCQkJXAogCQlzdGF0ZSA9PSBUQVNLX0lOVEVSUlVQVElCTEUgfHwgc3RhdGUgPT0gVEFTS19LSUxMQUJMRSkJXAogCitleHRlcm4gdm9pZCBpbml0X3dhaXRfZW50cnkod2FpdF9xdWV1ZV90ICpfX3dhaXQsIGludCBmbGFncyk7CisKIC8qCiAgKiBUaGUgYmVsb3cgbWFjcm8gX19fd2FpdF9ldmVudCgpIGhhcyBhbiBleHBsaWNpdCBzaGFkb3cgb2YgdGhlIF9fcmV0CiAgKiB2YXJpYWJsZSB3aGVuIHVzZWQgZnJvbSB0aGUgd2FpdF9ldmVudF8qKCkgbWFjcm9zLgpAQCAtMjY2LDEyICsyNjgsNyBAQAogCXdhaXRfcXVldWVfdCBfX3dhaXQ7CQkJCQkJXAogCWxvbmcgX19yZXQgPSByZXQ7CS8qIGV4cGxpY2l0IHNoYWRvdyAqLwkJCVwKIAkJCQkJCQkJCVwKLQlJTklUX0xJU1RfSEVBRCgmX193YWl0LnRhc2tfbGlzdCk7CQkJCVwKLQlpZiAoZXhjbHVzaXZlKQkJCQkJCQlcCi0JCV9fd2FpdC5mbGFncyA9IFdRX0ZMQUdfRVhDTFVTSVZFOwkJCVwKLQllbHNlCQkJCQkJCQlcCi0JCV9fd2FpdC5mbGFncyA9IDA7CQkJCQlcCi0JCQkJCQkJCQlcCisJaW5pdF93YWl0X2VudHJ5KCZfX3dhaXQsIGV4Y2x1c2l2ZSA/IFdRX0ZMQUdfRVhDTFVTSVZFIDogMCk7CVwKIAlmb3IgKDs7KSB7CQkJCQkJCVwKIAkJbG9uZyBfX2ludCA9IHByZXBhcmVfdG9fd2FpdF9ldmVudCgmd3EsICZfX3dhaXQsIHN0YXRlKTtcCiAJCQkJCQkJCQlcCkBAIC0yODAsMTIgKzI3Nyw3IEBACiAJCQkJCQkJCQlcCiAJCWlmIChfX193YWl0X2lzX2ludGVycnVwdGlibGUoc3RhdGUpICYmIF9faW50KSB7CQlcCiAJCQlfX3JldCA9IF9faW50OwkJCQkJXAotCQkJaWYgKGV4Y2x1c2l2ZSkgewkJCQlcCi0JCQkJYWJvcnRfZXhjbHVzaXZlX3dhaXQoJndxLCAmX193YWl0LAlcCi0JCQkJCQkgICAgIHN0YXRlLCBOVUxMKTsJXAotCQkJCWdvdG8gX19vdXQ7CQkJCVwKLQkJCX0JCQkJCQlcCi0JCQlicmVhazsJCQkJCQlcCisJCQlnb3RvIF9fb3V0OwkJCQkJXAogCQl9CQkJCQkJCVwKIAkJCQkJCQkJCVwKIAkJY21kOwkJCQkJCQlcCkBAIC05ODksNyArOTgxLDYgQEAKIHZvaWQgcHJlcGFyZV90b193YWl0X2V4Y2x1c2l2ZSh3YWl0X3F1ZXVlX2hlYWRfdCAqcSwgd2FpdF9xdWV1ZV90ICp3YWl0LCBpbnQgc3RhdGUpOwogbG9uZyBwcmVwYXJlX3RvX3dhaXRfZXZlbnQod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIHdhaXRfcXVldWVfdCAqd2FpdCwgaW50IHN0YXRlKTsKIHZvaWQgZmluaXNoX3dhaXQod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIHdhaXRfcXVldWVfdCAqd2FpdCk7Ci12b2lkIGFib3J0X2V4Y2x1c2l2ZV93YWl0KHdhaXRfcXVldWVfaGVhZF90ICpxLCB3YWl0X3F1ZXVlX3QgKndhaXQsIHVuc2lnbmVkIGludCBtb2RlLCB2b2lkICprZXkpOwogbG9uZyB3YWl0X3dva2VuKHdhaXRfcXVldWVfdCAqd2FpdCwgdW5zaWduZWQgbW9kZSwgbG9uZyB0aW1lb3V0KTsKIGludCB3b2tlbl93YWtlX2Z1bmN0aW9uKHdhaXRfcXVldWVfdCAqd2FpdCwgdW5zaWduZWQgbW9kZSwgaW50IHN5bmMsIHZvaWQgKmtleSk7CiBpbnQgYXV0b3JlbW92ZV93YWtlX2Z1bmN0aW9uKHdhaXRfcXVldWVfdCAqd2FpdCwgdW5zaWduZWQgbW9kZSwgaW50IHN5bmMsIHZvaWQgKmtleSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dpbl9taW5tYXguaCBiL2luY2x1ZGUvbGludXgvd2luX21pbm1heC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NTY5NjAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3dpbl9taW5tYXguaApAQCAtMCwwICsxLDM3IEBACisvKioKKyAqIGxpYi9taW5tYXguYzogd2luZG93ZWQgbWluL21heCB0cmFja2VyIGJ5IEthdGhsZWVuIE5pY2hvbHMuCisgKgorICovCisjaWZuZGVmIE1JTk1BWF9ICisjZGVmaW5lIE1JTk1BWF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBBIHNpbmdsZSBkYXRhIHBvaW50IGZvciBvdXIgcGFyYW1ldGVyaXplZCBtaW4tbWF4IHRyYWNrZXIgKi8KK3N0cnVjdCBtaW5tYXhfc2FtcGxlIHsKKwl1MzIJdDsJLyogdGltZSBtZWFzdXJlbWVudCB3YXMgdGFrZW4gKi8KKwl1MzIJdjsJLyogdmFsdWUgbWVhc3VyZWQgKi8KK307CisKKy8qIFN0YXRlIGZvciB0aGUgcGFyYW1ldGVyaXplZCBtaW4tbWF4IHRyYWNrZXIgKi8KK3N0cnVjdCBtaW5tYXggeworCXN0cnVjdCBtaW5tYXhfc2FtcGxlIHNbM107Cit9OworCitzdGF0aWMgaW5saW5lIHUzMiBtaW5tYXhfZ2V0KGNvbnN0IHN0cnVjdCBtaW5tYXggKm0pCit7CisJcmV0dXJuIG0tPnNbMF0udjsKK30KKworc3RhdGljIGlubGluZSB1MzIgbWlubWF4X3Jlc2V0KHN0cnVjdCBtaW5tYXggKm0sIHUzMiB0LCB1MzIgbWVhcykKK3sKKwlzdHJ1Y3QgbWlubWF4X3NhbXBsZSB2YWwgPSB7IC50ID0gdCwgLnYgPSBtZWFzIH07CisKKwltLT5zWzJdID0gbS0+c1sxXSA9IG0tPnNbMF0gPSB2YWw7CisJcmV0dXJuIG0tPnNbMF0udjsKK30KKwordTMyIG1pbm1heF9ydW5uaW5nX21heChzdHJ1Y3QgbWlubWF4ICptLCB1MzIgd2luLCB1MzIgdCwgdTMyIG1lYXMpOwordTMyIG1pbm1heF9ydW5uaW5nX21pbihzdHJ1Y3QgbWlubWF4ICptLCB1MzIgd2luLCB1MzIgdCwgdTMyIG1lYXMpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvY2VjLmggYi9pbmNsdWRlL21lZGlhL2NlYy5oCmluZGV4IGRjNzg1NGIuLmZkYjVkNjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvY2VjLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9jZWMuaApAQCAtNTcsOCArNTcsOCBAQAogCWludCBtaW5vcjsKIAlib29sIHJlZ2lzdGVyZWQ7CiAJYm9vbCB1bnJlZ2lzdGVyZWQ7Ci0Jc3RydWN0IG11dGV4IGZoc19sb2NrOwogCXN0cnVjdCBsaXN0X2hlYWQgZmhzOworCXN0cnVjdCBtdXRleCBsb2NrOwogfTsKIAogc3RydWN0IGNlY19hZGFwdGVyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYWN0X2FwaS5oIGIvaW5jbHVkZS9uZXQvYWN0X2FwaS5oCmluZGV4IDQxZTZhMjQuLjgyZjNjOTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2FjdF9hcGkuaAorKysgYi9pbmNsdWRlL25ldC9hY3RfYXBpLmgKQEAgLTE3Niw4ICsxNzYsOCBAQAogaW50IHRjZl91bnJlZ2lzdGVyX2FjdGlvbihzdHJ1Y3QgdGNfYWN0aW9uX29wcyAqYSwKIAkJCSAgc3RydWN0IHBlcm5ldF9vcGVyYXRpb25zICpvcHMpOwogaW50IHRjZl9hY3Rpb25fZGVzdHJveShzdHJ1Y3QgbGlzdF9oZWFkICphY3Rpb25zLCBpbnQgYmluZCk7Ci1pbnQgdGNmX2FjdGlvbl9leGVjKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmFjdGlvbnMsCi0JCSAgICBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKTsKK2ludCB0Y2ZfYWN0aW9uX2V4ZWMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjX2FjdGlvbiAqKmFjdGlvbnMsCisJCSAgICBpbnQgbnJfYWN0aW9ucywgc3RydWN0IHRjZl9yZXN1bHQgKnJlcyk7CiBpbnQgdGNmX2FjdGlvbl9pbml0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IG5sYXR0ciAqbmxhLAogCQkJCSAgc3RydWN0IG5sYXR0ciAqZXN0LCBjaGFyICpuLCBpbnQgb3ZyLAogCQkJCSAgaW50IGJpbmQsIHN0cnVjdCBsaXN0X2hlYWQgKik7CkBAIC0xODksMzAgKzE4OSwxNyBAQAogaW50IHRjZl9hY3Rpb25fZHVtcF8xKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCwgaW50KTsKIGludCB0Y2ZfYWN0aW9uX2NvcHlfc3RhdHMoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IHRjX2FjdGlvbiAqLCBpbnQpOwogCi0jZGVmaW5lIHRjX25vX2FjdGlvbnMoX2V4dHMpIFwKLQkobGlzdF9lbXB0eSgmKF9leHRzKS0+YWN0aW9ucykpCi0KLSNkZWZpbmUgdGNfZm9yX2VhY2hfYWN0aW9uKF9hLCBfZXh0cykgXAotCWxpc3RfZm9yX2VhY2hfZW50cnkoYSwgJihfZXh0cyktPmFjdGlvbnMsIGxpc3QpCi0KLSNkZWZpbmUgdGNfc2luZ2xlX2FjdGlvbihfZXh0cykgXAotCShsaXN0X2lzX3Npbmd1bGFyKCYoX2V4dHMpLT5hY3Rpb25zKSkKKyNlbmRpZiAvKiBDT05GSUdfTkVUX0NMU19BQ1QgKi8KIAogc3RhdGljIGlubGluZSB2b2lkIHRjZl9hY3Rpb25fc3RhdHNfdXBkYXRlKHN0cnVjdCB0Y19hY3Rpb24gKmEsIHU2NCBieXRlcywKIAkJCQkJICAgdTY0IHBhY2tldHMsIHU2NCBsYXN0dXNlKQogeworI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAogCWlmICghYS0+b3BzLT5zdGF0c191cGRhdGUpCiAJCXJldHVybjsKIAogCWEtPm9wcy0+c3RhdHNfdXBkYXRlKGEsIGJ5dGVzLCBwYWNrZXRzLCBsYXN0dXNlKTsKKyNlbmRpZgogfQogCi0jZWxzZSAvKiBDT05GSUdfTkVUX0NMU19BQ1QgKi8KLQotI2RlZmluZSB0Y19ub19hY3Rpb25zKF9leHRzKSB0cnVlCi0jZGVmaW5lIHRjX2Zvcl9lYWNoX2FjdGlvbihfYSwgX2V4dHMpIHdoaWxlICgodm9pZCkoX2EpLCAwKQotI2RlZmluZSB0Y19zaW5nbGVfYWN0aW9uKF9leHRzKSBmYWxzZQotI2RlZmluZSB0Y2ZfYWN0aW9uX3N0YXRzX3VwZGF0ZShhLCBieXRlcywgcGFja2V0cywgbGFzdHVzZSkKLQotI2VuZGlmIC8qIENPTkZJR19ORVRfQ0xTX0FDVCAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9hZGRyY29uZi5oIGIvaW5jbHVkZS9uZXQvYWRkcmNvbmYuaAppbmRleCA5ODI2ZDNhLi5mMmQwNzI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9hZGRyY29uZi5oCisrKyBiL2luY2x1ZGUvbmV0L2FkZHJjb25mLmgKQEAgLTEsOCArMSw5IEBACiAjaWZuZGVmIF9BRERSQ09ORl9ICiAjZGVmaW5lIF9BRERSQ09ORl9ICiAKLSNkZWZpbmUgTUFYX1JUUl9TT0xJQ0lUQVRJT05TCQkzCisjZGVmaW5lIE1BWF9SVFJfU09MSUNJVEFUSU9OUwkJLTEJCS8qIHVubGltaXRlZCAqLwogI2RlZmluZSBSVFJfU09MSUNJVEFUSU9OX0lOVEVSVkFMCSg0KkhaKQorI2RlZmluZSBSVFJfU09MSUNJVEFUSU9OX01BWF9JTlRFUlZBTAkoMzYwMCpIWikJLyogMSBob3VyICovCiAKICNkZWZpbmUgTUlOX1ZBTElEX0xJRkVUSU1FCQkoMiozNjAwKQkvKiAyIGhvdXJzICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2FmX3J4cnBjLmggYi9pbmNsdWRlL25ldC9hZl9yeHJwYy5oCmluZGV4IGFjMWJjM2MuLjEwNjFhNDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2FmX3J4cnBjLmgKKysrIGIvaW5jbHVkZS9uZXQvYWZfcnhycGMuaApAQCAtMTIsNDIgKzEyLDM5IEBACiAjaWZuZGVmIF9ORVRfUlhSUENfSAogI2RlZmluZSBfTkVUX1JYUlBDX0gKIAotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3J4cnBjLmg+CiAKK3N0cnVjdCBrZXk7CitzdHJ1Y3Qgc29jazsKK3N0cnVjdCBzb2NrZXQ7CiBzdHJ1Y3QgcnhycGNfY2FsbDsKIAotLyoKLSAqIHRoZSBtYXJrIGFwcGxpZWQgdG8gc29ja2V0IGJ1ZmZlcnMgdGhhdCBtYXkgYmUgaW50ZXJjZXB0ZWQKLSAqLwotZW51bSByeHJwY19za2JfbWFyayB7Ci0JUlhSUENfU0tCX01BUktfREFUQSwJCS8qIGRhdGEgbWVzc2FnZSAqLwotCVJYUlBDX1NLQl9NQVJLX0ZJTkFMX0FDSywJLyogZmluYWwgQUNLIHJlY2VpdmVkIG1lc3NhZ2UgKi8KLQlSWFJQQ19TS0JfTUFSS19CVVNZLAkJLyogc2VydmVyIGJ1c3kgbWVzc2FnZSAqLwotCVJYUlBDX1NLQl9NQVJLX1JFTU9URV9BQk9SVCwJLyogcmVtb3RlIGFib3J0IG1lc3NhZ2UgKi8KLQlSWFJQQ19TS0JfTUFSS19MT0NBTF9BQk9SVCwJLyogbG9jYWwgYWJvcnQgbWVzc2FnZSAqLwotCVJYUlBDX1NLQl9NQVJLX05FVF9FUlJPUiwJLyogbmV0d29yayBlcnJvciBtZXNzYWdlICovCi0JUlhSUENfU0tCX01BUktfTE9DQUxfRVJST1IsCS8qIGxvY2FsIGVycm9yIG1lc3NhZ2UgKi8KLQlSWFJQQ19TS0JfTUFSS19ORVdfQ0FMTCwJLyogbG9jYWwgZXJyb3IgbWVzc2FnZSAqLwotfTsKK3R5cGVkZWYgdm9pZCAoKnJ4cnBjX25vdGlmeV9yeF90KShzdHJ1Y3Qgc29jayAqLCBzdHJ1Y3QgcnhycGNfY2FsbCAqLAorCQkJCSAgdW5zaWduZWQgbG9uZyk7Cit0eXBlZGVmIHZvaWQgKCpyeHJwY19ub3RpZnlfbmV3X2NhbGxfdCkoc3RydWN0IHNvY2sgKiwgc3RydWN0IHJ4cnBjX2NhbGwgKiwKKwkJCQkJdW5zaWduZWQgbG9uZyk7Cit0eXBlZGVmIHZvaWQgKCpyeHJwY19kaXNjYXJkX25ld19jYWxsX3QpKHN0cnVjdCByeHJwY19jYWxsICosIHVuc2lnbmVkIGxvbmcpOwordHlwZWRlZiB2b2lkICgqcnhycGNfdXNlcl9hdHRhY2hfY2FsbF90KShzdHJ1Y3QgcnhycGNfY2FsbCAqLCB1bnNpZ25lZCBsb25nKTsKIAotdHlwZWRlZiB2b2lkICgqcnhycGNfaW50ZXJjZXB0b3JfdCkoc3RydWN0IHNvY2sgKiwgdW5zaWduZWQgbG9uZywKLQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKik7Ci12b2lkIHJ4cnBjX2tlcm5lbF9pbnRlcmNlcHRfcnhfbWVzc2FnZXMoc3RydWN0IHNvY2tldCAqLCByeHJwY19pbnRlcmNlcHRvcl90KTsKK3ZvaWQgcnhycGNfa2VybmVsX25ld19jYWxsX25vdGlmaWNhdGlvbihzdHJ1Y3Qgc29ja2V0ICosCisJCQkJCXJ4cnBjX25vdGlmeV9uZXdfY2FsbF90LAorCQkJCQlyeHJwY19kaXNjYXJkX25ld19jYWxsX3QpOwogc3RydWN0IHJ4cnBjX2NhbGwgKnJ4cnBjX2tlcm5lbF9iZWdpbl9jYWxsKHN0cnVjdCBzb2NrZXQgKiwKIAkJCQkJICAgc3RydWN0IHNvY2thZGRyX3J4cnBjICosCiAJCQkJCSAgIHN0cnVjdCBrZXkgKiwKIAkJCQkJICAgdW5zaWduZWQgbG9uZywKLQkJCQkJICAgZ2ZwX3QpOwotaW50IHJ4cnBjX2tlcm5lbF9zZW5kX2RhdGEoc3RydWN0IHJ4cnBjX2NhbGwgKiwgc3RydWN0IG1zZ2hkciAqLCBzaXplX3QpOwotdm9pZCByeHJwY19rZXJuZWxfYWJvcnRfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqLCB1MzIpOwotdm9pZCByeHJwY19rZXJuZWxfZW5kX2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKik7Ci1ib29sIHJ4cnBjX2tlcm5lbF9pc19kYXRhX2xhc3Qoc3RydWN0IHNrX2J1ZmYgKik7Ci11MzIgcnhycGNfa2VybmVsX2dldF9hYm9ydF9jb2RlKHN0cnVjdCBza19idWZmICopOwotaW50IHJ4cnBjX2tlcm5lbF9nZXRfZXJyb3JfbnVtYmVyKHN0cnVjdCBza19idWZmICopOwotdm9pZCByeHJwY19rZXJuZWxfZGF0YV9kZWxpdmVyZWQoc3RydWN0IHNrX2J1ZmYgKik7Ci12b2lkIHJ4cnBjX2tlcm5lbF9mcmVlX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqKTsKLXN0cnVjdCByeHJwY19jYWxsICpyeHJwY19rZXJuZWxfYWNjZXB0X2NhbGwoc3RydWN0IHNvY2tldCAqLCB1bnNpZ25lZCBsb25nKTsKLWludCByeHJwY19rZXJuZWxfcmVqZWN0X2NhbGwoc3RydWN0IHNvY2tldCAqKTsKKwkJCQkJICAgZ2ZwX3QsCisJCQkJCSAgIHJ4cnBjX25vdGlmeV9yeF90KTsKK2ludCByeHJwY19rZXJuZWxfc2VuZF9kYXRhKHN0cnVjdCBzb2NrZXQgKiwgc3RydWN0IHJ4cnBjX2NhbGwgKiwKKwkJCSAgIHN0cnVjdCBtc2doZHIgKiwgc2l6ZV90KTsKK2ludCByeHJwY19rZXJuZWxfcmVjdl9kYXRhKHN0cnVjdCBzb2NrZXQgKiwgc3RydWN0IHJ4cnBjX2NhbGwgKiwKKwkJCSAgIHZvaWQgKiwgc2l6ZV90LCBzaXplX3QgKiwgYm9vbCwgdTMyICopOwordm9pZCByeHJwY19rZXJuZWxfYWJvcnRfY2FsbChzdHJ1Y3Qgc29ja2V0ICosIHN0cnVjdCByeHJwY19jYWxsICosCisJCQkgICAgIHUzMiwgaW50LCBjb25zdCBjaGFyICopOwordm9pZCByeHJwY19rZXJuZWxfZW5kX2NhbGwoc3RydWN0IHNvY2tldCAqLCBzdHJ1Y3QgcnhycGNfY2FsbCAqKTsKK3ZvaWQgcnhycGNfa2VybmVsX2dldF9wZWVyKHN0cnVjdCBzb2NrZXQgKiwgc3RydWN0IHJ4cnBjX2NhbGwgKiwKKwkJCSAgIHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqKTsKK2ludCByeHJwY19rZXJuZWxfY2hhcmdlX2FjY2VwdChzdHJ1Y3Qgc29ja2V0ICosIHJ4cnBjX25vdGlmeV9yeF90LAorCQkJICAgICAgIHJ4cnBjX3VzZXJfYXR0YWNoX2NhbGxfdCwgdW5zaWduZWQgbG9uZywgZ2ZwX3QpOwogCiAjZW5kaWYgLyogX05FVF9SWFJQQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9hZl91bml4LmggYi9pbmNsdWRlL25ldC9hZl91bml4LmgKaW5kZXggOWI0YzQxOC4uZmQ2MGVjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvYWZfdW5peC5oCisrKyBiL2luY2x1ZGUvbmV0L2FmX3VuaXguaApAQCAtNTIsNyArNTIsNyBAQAogCXN0cnVjdCBzb2NrCQlzazsKIAlzdHJ1Y3QgdW5peF9hZGRyZXNzICAgICAqYWRkcjsKIAlzdHJ1Y3QgcGF0aAkJcGF0aDsKLQlzdHJ1Y3QgbXV0ZXgJCXJlYWRsb2NrOworCXN0cnVjdCBtdXRleAkJaW9sb2NrLCBiaW5kbG9jazsKIAlzdHJ1Y3Qgc29jawkJKnBlZXI7CiAJc3RydWN0IGxpc3RfaGVhZAlsaW5rOwogCWF0b21pY19sb25nX3QJCWluZmxpZ2h0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oCmluZGV4IGJmZDE1OTAuLjBhMWUyMWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9ibHVldG9vdGguaAorKysgYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmgKQEAgLTI5LDcgKzI5LDggQEAKICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKLSNkZWZpbmUgQlRfU1VCU1lTX1ZFUlNJT04gIjIuMjEiCisjZGVmaW5lIEJUX1NVQlNZU19WRVJTSU9OCTIKKyNkZWZpbmUgQlRfU1VCU1lTX1JFVklTSU9OCTIyCiAKICNpZm5kZWYgQUZfQkxVRVRPT1RICiAjZGVmaW5lIEFGX0JMVUVUT09USAkzMQpAQCAtMzcxLDYgKzM3Miw3IEBACiB2b2lkIGhjaV9zb2NrX2NsZWFyX2ZsYWcoc3RydWN0IHNvY2sgKnNrLCBpbnQgbnIpOwogaW50IGhjaV9zb2NrX3Rlc3RfZmxhZyhzdHJ1Y3Qgc29jayAqc2ssIGludCBucik7CiB1bnNpZ25lZCBzaG9ydCBoY2lfc29ja19nZXRfY2hhbm5lbChzdHJ1Y3Qgc29jayAqc2spOwordTMyIGhjaV9zb2NrX2dldF9jb29raWUoc3RydWN0IHNvY2sgKnNrKTsKIAogaW50IGhjaV9zb2NrX2luaXQodm9pZCk7CiB2b2lkIGhjaV9zb2NrX2NsZWFudXAodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpLmggYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpLmgKaW5kZXggMDAzYjI1Mi4uOTlhYTVlNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaS5oCisrKyBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2kuaApAQCAtNjMsNiArNjMsNyBAQAogI2RlZmluZSBIQ0lfU0RJTwk2CiAjZGVmaW5lIEhDSV9TUEkJCTcKICNkZWZpbmUgSENJX0kyQwkJOAorI2RlZmluZSBIQ0lfU01ECQk5CiAKIC8qIEhDSSBjb250cm9sbGVyIHR5cGVzICovCiAjZGVmaW5lIEhDSV9QUklNQVJZCTB4MDAKQEAgLTIwNyw3ICsyMDgsMTEgQEAKIAlIQ0lfTUdNVF9JTkRFWF9FVkVOVFMsCiAJSENJX01HTVRfVU5DT05GX0lOREVYX0VWRU5UUywKIAlIQ0lfTUdNVF9FWFRfSU5ERVhfRVZFTlRTLAotCUhDSV9NR01UX0dFTkVSSUNfRVZFTlRTLAorCUhDSV9NR01UX0VYVF9JTkZPX0VWRU5UUywKKwlIQ0lfTUdNVF9PUFRJT05fRVZFTlRTLAorCUhDSV9NR01UX1NFVFRJTkdfRVZFTlRTLAorCUhDSV9NR01UX0RFVl9DTEFTU19FVkVOVFMsCisJSENJX01HTVRfTE9DQUxfTkFNRV9FVkVOVFMsCiAJSENJX01HTVRfT09CX0RBVEFfRVZFTlRTLAogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmggYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuaAppbmRleCBlZTdmYzQ3Li5mMDBiZjY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuaAorKysgYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuaApAQCAtMjExLDYgKzIxMSw3IEBACiAJX191OAkJZGV2X25hbWVbSENJX01BWF9OQU1FX0xFTkdUSF07CiAJX191OAkJc2hvcnRfbmFtZVtIQ0lfTUFYX1NIT1JUX05BTUVfTEVOR1RIXTsKIAlfX3U4CQllaXJbSENJX01BWF9FSVJfTEVOR1RIXTsKKwlfX3UxNgkJYXBwZWFyYW5jZTsKIAlfX3U4CQlkZXZfY2xhc3NbM107CiAJX191OAkJbWFqb3JfY2xhc3M7CiAJX191OAkJbWlub3JfY2xhc3M7CkBAIC0zOTksNyArNDAwLDkgQEAKIAlzdHJ1Y3QgZGVsYXllZF93b3JrCXJwYV9leHBpcmVkOwogCWJkYWRkcl90CQlycGE7CiAKKyNpZiBJU19FTkFCTEVEKENPTkZJR19CVF9MRURTKQogCXN0cnVjdCBsZWRfdHJpZ2dlcgkqcG93ZXJfbGVkOworI2VuZGlmCiAKIAlpbnQgKCpvcGVuKShzdHJ1Y3QgaGNpX2RldiAqaGRldik7CiAJaW50ICgqY2xvc2UpKHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKQEAgLTEwMjYsOCArMTAyOSw4IEBACiBpbnQgaGNpX3Jlc2V0X2RldihzdHJ1Y3QgaGNpX2RldiAqaGRldik7CiBpbnQgaGNpX3JlY3ZfZnJhbWUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpOwogaW50IGhjaV9yZWN2X2RpYWcoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpOwotdm9pZCBoY2lfc2V0X2h3X2luZm8oc3RydWN0IGhjaV9kZXYgKmhkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKLXZvaWQgaGNpX3NldF9md19pbmZvKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitfX3ByaW50ZigyLCAzKSB2b2lkIGhjaV9zZXRfaHdfaW5mbyhzdHJ1Y3QgaGNpX2RldiAqaGRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pOworX19wcmludGYoMiwgMykgdm9pZCBoY2lfc2V0X2Z3X2luZm8oc3RydWN0IGhjaV9kZXYgKmhkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIGludCBoY2lfZGV2X29wZW4oX191MTYgZGV2KTsKIGludCBoY2lfZGV2X2Nsb3NlKF9fdTE2IGRldik7CiBpbnQgaGNpX2Rldl9kb19jbG9zZShzdHJ1Y3QgaGNpX2RldiAqaGRldik7CkBAIC0xNDA0LDYgKzE0MDcsOSBAQAogdm9pZCBoY2lfc2VuZF90b19jaGFubmVsKHVuc2lnbmVkIHNob3J0IGNoYW5uZWwsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgaW50IGZsYWcsIHN0cnVjdCBzb2NrICpza2lwX3NrKTsKIHZvaWQgaGNpX3NlbmRfdG9fbW9uaXRvcihzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Cit2b2lkIGhjaV9zZW5kX21vbml0b3JfY3RybF9ldmVudChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTE2IGV2ZW50LAorCQkJCSB2b2lkICpkYXRhLCB1MTYgZGF0YV9sZW4sIGt0aW1lX3QgdHN0YW1wLAorCQkJCSBpbnQgZmxhZywgc3RydWN0IHNvY2sgKnNraXBfc2spOwogCiB2b2lkIGhjaV9zb2NrX2Rldl9ldmVudChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgaW50IGV2ZW50KTsKIApAQCAtMTQ0OSw2ICsxNDU1LDcgQEAKICNkZWZpbmUgRElTQ09WX0JSRURSX0lOUVVJUllfTEVOCTB4MDgKICNkZWZpbmUgRElTQ09WX0xFX1JFU1RBUlRfREVMQVkJCW1zZWNzX3RvX2ppZmZpZXMoMjAwKQkvKiBtc2VjICovCiAKK3ZvaWQgbWdtdF9maWxsX3ZlcnNpb25faW5mbyh2b2lkICp2ZXIpOwogaW50IG1nbXRfbmV3X3NldHRpbmdzKHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKIHZvaWQgbWdtdF9pbmRleF9hZGRlZChzdHJ1Y3QgaGNpX2RldiAqaGRldik7CiB2b2lkIG1nbXRfaW5kZXhfcmVtb3ZlZChzdHJ1Y3QgaGNpX2RldiAqaGRldik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX21vbi5oIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaV9tb24uaAppbmRleCA1ODdkMDEzLi4yNDA3ODZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX21vbi5oCisrKyBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2lfbW9uLmgKQEAgLTQ1LDYgKzQ1LDEwIEBACiAjZGVmaW5lIEhDSV9NT05fVkVORE9SX0RJQUcJMTEKICNkZWZpbmUgSENJX01PTl9TWVNURU1fTk9URQkxMgogI2RlZmluZSBIQ0lfTU9OX1VTRVJfTE9HR0lORwkxMworI2RlZmluZSBIQ0lfTU9OX0NUUkxfT1BFTgkxNAorI2RlZmluZSBIQ0lfTU9OX0NUUkxfQ0xPU0UJMTUKKyNkZWZpbmUgSENJX01PTl9DVFJMX0NPTU1BTkQJMTYKKyNkZWZpbmUgSENJX01PTl9DVFJMX0VWRU5UCTE3CiAKIHN0cnVjdCBoY2lfbW9uX25ld19pbmRleCB7CiAJX191OAkJdHlwZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9tZ210LmggYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvbWdtdC5oCmluZGV4IDc2NDc5NjQuLjcyYTQ1NmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9tZ210LmgKKysrIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL21nbXQuaApAQCAtNTg2LDYgKzU4NiwyNCBAQAogCiAjZGVmaW5lIE1HTVRfT1BfU1RBUlRfTElNSVRFRF9ESVNDT1ZFUlkJMHgwMDQxCiAKKyNkZWZpbmUgTUdNVF9PUF9SRUFEX0VYVF9JTkZPCQkweDAwNDIKKyNkZWZpbmUgTUdNVF9SRUFEX0VYVF9JTkZPX1NJWkUJCTAKK3N0cnVjdCBtZ210X3JwX3JlYWRfZXh0X2luZm8geworCWJkYWRkcl90IGJkYWRkcjsKKwlfX3U4ICAgICB2ZXJzaW9uOworCV9fbGUxNiAgIG1hbnVmYWN0dXJlcjsKKwlfX2xlMzIgICBzdXBwb3J0ZWRfc2V0dGluZ3M7CisJX19sZTMyICAgY3VycmVudF9zZXR0aW5nczsKKwlfX2xlMTYgICBlaXJfbGVuOworCV9fdTggICAgIGVpclswXTsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgTUdNVF9PUF9TRVRfQVBQRUFSQU5DRQkJMHgwMDQzCitzdHJ1Y3QgbWdtdF9jcF9zZXRfYXBwZWFyYW5jZSB7CisJX191MTYJYXBwZWFyYW5jZTsKK30gX19wYWNrZWQ7CisjZGVmaW5lIE1HTVRfU0VUX0FQUEVBUkFOQ0VfU0laRQkyCisKICNkZWZpbmUgTUdNVF9FVl9DTURfQ09NUExFVEUJCTB4MDAwMQogc3RydWN0IG1nbXRfZXZfY21kX2NvbXBsZXRlIHsKIAlfX2xlMTYJb3Bjb2RlOwpAQCAtODAwLDMgKzgxOCw5IEBACiBzdHJ1Y3QgbWdtdF9ldl9hZHZlcnRpc2luZ19yZW1vdmVkIHsKIAlfX3U4ICAgIGluc3RhbmNlOwogfSBfX3BhY2tlZDsKKworI2RlZmluZSBNR01UX0VWX0VYVF9JTkZPX0NIQU5HRUQJMHgwMDI1CitzdHJ1Y3QgbWdtdF9ldl9leHRfaW5mb19jaGFuZ2VkIHsKKwlfX2xlMTYJZWlyX2xlbjsKKwlfX3U4CWVpclswXTsKK30gX19wYWNrZWQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9jZmc4MDIxMS5oIGIvaW5jbHVkZS9uZXQvY2ZnODAyMTEuaAppbmRleCA5YzIzZjRkMy4uZmU3OGYwMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvY2ZnODAyMTEuaAorKysgYi9pbmNsdWRlL25ldC9jZmc4MDIxMS5oCkBAIC01LDcgKzUsNyBAQAogICoKICAqIENvcHlyaWdodCAyMDA2LTIwMTAJSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KICAqIENvcHlyaWdodCAyMDEzLTIwMTQgSW50ZWwgTW9iaWxlIENvbW11bmljYXRpb25zIEdtYkgKLSAqIENvcHlyaWdodCAyMDE1CUludGVsIERldXRzY2hsYW5kIEdtYkgKKyAqIENvcHlyaWdodCAyMDE1LTIwMTYJSW50ZWwgRGV1dHNjaGxhbmQgR21iSAogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtNTkzLDYgKzU5Myw4IEBACiAJczggbm9pc2U7CiB9OwogCisjZGVmaW5lIENGRzgwMjExX01BWF9XRVBfS0VZUwk0CisKIC8qKgogICogc3RydWN0IGNmZzgwMjExX2NyeXB0b19zZXR0aW5ncyAtIENyeXB0byBzZXR0aW5ncwogICogQHdwYV92ZXJzaW9uczogaW5kaWNhdGVzIHdoaWNoLCBpZiBhbnksIFdQQSB2ZXJzaW9ucyBhcmUgZW5hYmxlZApAQCAtNjEwLDYgKzYxMiw5IEBACiAgKglhbGxvd2VkIHRocm91Z2ggZXZlbiBvbiB1bmF1dGhvcml6ZWQgcG9ydHMKICAqIEBjb250cm9sX3BvcnRfbm9fZW5jcnlwdDogVFJVRSB0byBwcmV2ZW50IGVuY3J5cHRpb24gb2YgY29udHJvbCBwb3J0CiAgKglwcm90b2NvbCBmcmFtZXMuCisgKiBAd2VwX2tleXM6IHN0YXRpYyBXRVAga2V5cywgaWYgbm90IE5VTEwgcG9pbnRzIHRvIGFuIGFycmF5IG9mCisgKglDRkc4MDIxMV9NQVhfV0VQX0tFWVMgV0VQIGtleXMKKyAqIEB3ZXBfdHhfa2V5OiBrZXkgaW5kZXggKDAuLjMpIG9mIHRoZSBkZWZhdWx0IFRYIHN0YXRpYyBXRVAga2V5CiAgKi8KIHN0cnVjdCBjZmc4MDIxMV9jcnlwdG9fc2V0dGluZ3MgewogCXUzMiB3cGFfdmVyc2lvbnM7CkBAIC02MjEsNiArNjI2LDggQEAKIAlib29sIGNvbnRyb2xfcG9ydDsKIAlfX2JlMTYgY29udHJvbF9wb3J0X2V0aGVydHlwZTsKIAlib29sIGNvbnRyb2xfcG9ydF9ub19lbmNyeXB0OworCXN0cnVjdCBrZXlfcGFyYW1zICp3ZXBfa2V5czsKKwlpbnQgd2VwX3R4X2tleTsKIH07CiAKIC8qKgpAQCAtNjc2LDYgKzY4MywxOCBAQAogCXN0cnVjdCBtYWNfYWRkcmVzcyBtYWNfYWRkcnNbXTsKIH07CiAKKy8qCisgKiBjZmc4MDIxMV9iaXRyYXRlX21hc2sgLSBtYXNrcyBmb3IgYml0cmF0ZSBjb250cm9sCisgKi8KK3N0cnVjdCBjZmc4MDIxMV9iaXRyYXRlX21hc2sgeworCXN0cnVjdCB7CisJCXUzMiBsZWdhY3k7CisJCXU4IGh0X21jc1tJRUVFODAyMTFfSFRfTUNTX01BU0tfTEVOXTsKKwkJdTE2IHZodF9tY3NbTkw4MDIxMV9WSFRfTlNTX01BWF07CisJCWVudW0gbmw4MDIxMV90eHJhdGVfZ2kgZ2k7CisJfSBjb250cm9sW05VTV9OTDgwMjExX0JBTkRTXTsKK307CisKIC8qKgogICogc3RydWN0IGNmZzgwMjExX2FwX3NldHRpbmdzIC0gQVAgY29uZmlndXJhdGlvbgogICoKQEAgLTcwMCw2ICs3MTksNyBAQAogICoJTUFDIGFkZHJlc3MgYmFzZWQgYWNjZXNzIGNvbnRyb2wKICAqIEBwYnNzOiBJZiBzZXQsIHN0YXJ0IGFzIGEgUENQIGluc3RlYWQgb2YgQVAuIFJlbGV2YW50IGZvciBETUcKICAqCW5ldHdvcmtzLgorICogQGJlYWNvbl9yYXRlOiBiaXRyYXRlIHRvIGJlIHVzZWQgZm9yIGJlYWNvbnMKICAqLwogc3RydWN0IGNmZzgwMjExX2FwX3NldHRpbmdzIHsKIAlzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgY2hhbmRlZjsKQEAgLTcxOSw2ICs3MzksNyBAQAogCWJvb2wgcDJwX29wcF9wczsKIAljb25zdCBzdHJ1Y3QgY2ZnODAyMTFfYWNsX2RhdGEgKmFjbDsKIAlib29sIHBic3M7CisJc3RydWN0IGNmZzgwMjExX2JpdHJhdGVfbWFzayBiZWFjb25fcmF0ZTsKIH07CiAKIC8qKgpAQCAtMTEwMiw2ICsxMTIzLDcgQEAKIAlzdHJ1Y3QgY2ZnODAyMTFfdGlkX3N0YXRzIHBlcnRpZFtJRUVFODAyMTFfTlVNX1RJRFMgKyAxXTsKIH07CiAKKyNpZiBJU19FTkFCTEVEKENPTkZJR19DRkc4MDIxMSkKIC8qKgogICogY2ZnODAyMTFfZ2V0X3N0YXRpb24gLSByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIGdpdmVuIHN0YXRpb24KICAqIEBkZXY6IHRoZSBkZXZpY2Ugd2hlcmUgdGhlIHN0YXRpb24gaXMgc3VwcG9zZWQgdG8gYmUgY29ubmVjdGVkIHRvCkBAIC0xMTE0LDYgKzExMzYsMTQgQEAKICAqLwogaW50IGNmZzgwMjExX2dldF9zdGF0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IHU4ICptYWNfYWRkciwKIAkJCSBzdHJ1Y3Qgc3RhdGlvbl9pbmZvICpzaW5mbyk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgY2ZnODAyMTFfZ2V0X3N0YXRpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgY29uc3QgdTggKm1hY19hZGRyLAorCQkJCSAgICAgICBzdHJ1Y3Qgc3RhdGlvbl9pbmZvICpzaW5mbykKK3sKKwlyZXR1cm4gLUVOT0VOVDsKK30KKyNlbmRpZgogCiAvKioKICAqIGVudW0gbW9uaXRvcl9mbGFncyAtIG1vbml0b3IgZmxhZ3MKQEAgLTEzNDIsNiArMTM3Miw3IEBACiAgKiBAYmVhY29uX2ludGVydmFsOiBiZWFjb24gaW50ZXJ2YWwgdG8gdXNlCiAgKiBAbWNhc3RfcmF0ZTogbXVsdGljYXQgcmF0ZSBmb3IgTWVzaCBOb2RlIFs2TWJwcyBpcyB0aGUgZGVmYXVsdCBmb3IgODAyLjExYV0KICAqIEBiYXNpY19yYXRlczogYmFzaWMgcmF0ZXMgdG8gdXNlIHdoZW4gY3JlYXRpbmcgdGhlIG1lc2gKKyAqIEBiZWFjb25fcmF0ZTogYml0cmF0ZSB0byBiZSB1c2VkIGZvciBiZWFjb25zCiAgKgogICogVGhlc2UgcGFyYW1ldGVycyBhcmUgZml4ZWQgd2hlbiB0aGUgbWVzaCBpcyBjcmVhdGVkLgogICovCkBAIC0xMzYyLDYgKzEzOTMsNyBAQAogCXUxNiBiZWFjb25faW50ZXJ2YWw7CiAJaW50IG1jYXN0X3JhdGVbTlVNX05MODAyMTFfQkFORFNdOwogCXUzMiBiYXNpY19yYXRlczsKKwlzdHJ1Y3QgY2ZnODAyMTFfYml0cmF0ZV9tYXNrIGJlYWNvbl9yYXRlOwogfTsKIAogLyoqCkBAIC0yMDAxLDE3ICsyMDMzLDYgQEAKIAlXSVBIWV9QQVJBTV9EWU5fQUNLCQk9IDEgPDwgNSwKIH07CiAKLS8qCi0gKiBjZmc4MDIxMV9iaXRyYXRlX21hc2sgLSBtYXNrcyBmb3IgYml0cmF0ZSBjb250cm9sCi0gKi8KLXN0cnVjdCBjZmc4MDIxMV9iaXRyYXRlX21hc2sgewotCXN0cnVjdCB7Ci0JCXUzMiBsZWdhY3k7Ci0JCXU4IGh0X21jc1tJRUVFODAyMTFfSFRfTUNTX01BU0tfTEVOXTsKLQkJdTE2IHZodF9tY3NbTkw4MDIxMV9WSFRfTlNTX01BWF07Ci0JCWVudW0gbmw4MDIxMV90eHJhdGVfZ2kgZ2k7Ci0JfSBjb250cm9sW05VTV9OTDgwMjExX0JBTkRTXTsKLX07CiAvKioKICAqIHN0cnVjdCBjZmc4MDIxMV9wbWtzYSAtIFBNSyBTZWN1cml0eSBBc3NvY2lhdGlvbgogICoKQEAgLTIyOTMsNiArMjMxNCw5OCBAQAogfTsKIAogLyoqCisgKiBzdHJ1Y3QgY2ZnODAyMTFfbmFuX2NvbmYgLSBOQU4gY29uZmlndXJhdGlvbgorICoKKyAqIFRoaXMgc3RydWN0IGRlZmluZXMgTkFOIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworICoKKyAqIEBtYXN0ZXJfcHJlZjogbWFzdGVyIHByZWZlcmVuY2UgKDEgLSAyNTUpCisgKiBAZHVhbDogZHVhbCBiYW5kIG9wZXJhdGlvbiBtb2RlLCBzZWUgJmVudW0gbmw4MDIxMV9uYW5fZHVhbF9iYW5kX2NvbmYKKyAqLworc3RydWN0IGNmZzgwMjExX25hbl9jb25mIHsKKwl1OCBtYXN0ZXJfcHJlZjsKKwl1OCBkdWFsOworfTsKKworLyoqCisgKiBlbnVtIGNmZzgwMjExX25hbl9jb25mX2NoYW5nZXMgLSBpbmRpY2F0ZXMgY2hhbmdlZCBmaWVsZHMgaW4gTkFOCisgKiBjb25maWd1cmF0aW9uCisgKgorICogQENGRzgwMjExX05BTl9DT05GX0NIQU5HRURfUFJFRjogbWFzdGVyIHByZWZlcmVuY2UKKyAqIEBDRkc4MDIxMV9OQU5fQ09ORl9DSEFOR0VEX0RVQUw6IGR1YWwgYmFuZCBvcGVyYXRpb24KKyAqLworZW51bSBjZmc4MDIxMV9uYW5fY29uZl9jaGFuZ2VzIHsKKwlDRkc4MDIxMV9OQU5fQ09ORl9DSEFOR0VEX1BSRUYgPSBCSVQoMCksCisJQ0ZHODAyMTFfTkFOX0NPTkZfQ0hBTkdFRF9EVUFMID0gQklUKDEpLAorfTsKKworLyoqCisgKiBzdHJ1Y3QgY2ZnODAyMTFfbmFuX2Z1bmNfZmlsdGVyIC0gYSBOQU4gZnVuY3Rpb24gUnggLyBUeCBmaWx0ZXIKKyAqCisgKiBAZmlsdGVyOiB0aGUgY29udGVudCBvZiB0aGUgZmlsdGVyCisgKiBAbGVuOiB0aGUgbGVuZ3RoIG9mIHRoZSBmaWx0ZXIKKyAqLworc3RydWN0IGNmZzgwMjExX25hbl9mdW5jX2ZpbHRlciB7CisJY29uc3QgdTggKmZpbHRlcjsKKwl1OCBsZW47Cit9OworCisvKioKKyAqIHN0cnVjdCBjZmc4MDIxMV9uYW5fZnVuYyAtIGEgTkFOIGZ1bmN0aW9uCisgKgorICogQHR5cGU6ICZlbnVtIG5sODAyMTFfbmFuX2Z1bmN0aW9uX3R5cGUKKyAqIEBzZXJ2aWNlX2lkOiB0aGUgc2VydmljZSBJRCBvZiB0aGUgZnVuY3Rpb24KKyAqIEBwdWJsaXNoX3R5cGU6ICZubDgwMjExX25hbl9wdWJsaXNoX3R5cGUKKyAqIEBjbG9zZV9yYW5nZTogaWYgdHJ1ZSwgdGhlIHJhbmdlIHNob3VsZCBiZSBsaW1pdGVkLiBUaHJlc2hvbGQgaXMKKyAqCWltcGxlbWVudGF0aW9uIHNwZWNpZmljLgorICogQHB1Ymxpc2hfYmNhc3Q6IGlmIHRydWUsIHRoZSBzb2xpY2l0ZWQgcHVibGlzaCBzaG91bGQgYmUgYnJvYWRjYXN0ZWQKKyAqIEBzdWJzY3JpYmVfYWN0aXZlOiBpZiB0cnVlLCB0aGUgc3Vic2NyaWJlIGlzIGFjdGl2ZQorICogQGZvbGxvd3VwX2lkOiB0aGUgaW5zdGFuY2UgSUQgZm9yIGZvbGxvdyB1cAorICogQGZvbGxvd3VwX3JlcWlkOiB0aGUgcmVxdWVzdG9yIGluc3RhbmNlIElEIGZvciBmb2xsb3cgdXAKKyAqIEBmb2xsb3d1cF9kZXN0OiBNQUMgYWRkcmVzcyBvZiB0aGUgcmVjaXBpZW50IG9mIHRoZSBmb2xsb3cgdXAKKyAqIEB0dGw6IHRpbWUgdG8gbGl2ZSBjb3VudGVyIGluIERXLgorICogQHNlcnZfc3BlY19pbmZvOiBTZXJ2aWNlIFNwZWNpZmljIEluZm8KKyAqIEBzZXJ2X3NwZWNfaW5mb19sZW46IFNlcnZpY2UgU3BlY2lmaWMgSW5mbyBsZW5ndGgKKyAqIEBzcmZfaW5jbHVkZTogaWYgdHJ1ZSwgU1JGIGlzIGluY2x1c2l2ZQorICogQHNyZl9iZjogQmxvb20gRmlsdGVyCisgKiBAc3JmX2JmX2xlbjogQmxvb20gRmlsdGVyIGxlbmd0aAorICogQHNyZl9iZl9pZHg6IEJsb29tIEZpbHRlciBpbmRleAorICogQHNyZl9tYWNzOiBTUkYgTUFDIGFkZHJlc3NlcworICogQHNyZl9udW1fbWFjczogbnVtYmVyIG9mIE1BQyBhZGRyZXNzZXMgaW4gU1JGCisgKiBAcnhfZmlsdGVyczogcnggZmlsdGVycyB0aGF0IGFyZSBtYXRjaGVkIHdpdGggY29ycmVzcG9uZGluZyBwZWVyJ3MgdHhfZmlsdGVyCisgKiBAdHhfZmlsdGVyczogZmlsdGVycyB0aGF0IHNob3VsZCBiZSB0cmFuc21pdHRlZCBpbiB0aGUgU0RGLgorICogQG51bV9yeF9maWx0ZXJzOiBsZW5ndGggb2YgJnJ4X2ZpbHRlcnMuCisgKiBAbnVtX3R4X2ZpbHRlcnM6IGxlbmd0aCBvZiAmdHhfZmlsdGVycy4KKyAqIEBpbnN0YW5jZV9pZDogZHJpdmVyIGFsbG9jYXRlZCBpZCBvZiB0aGUgZnVuY3Rpb24uCisgKiBAY29va2llOiB1bmlxdWUgTkFOIGZ1bmN0aW9uIGlkZW50aWZpZXIuCisgKi8KK3N0cnVjdCBjZmc4MDIxMV9uYW5fZnVuYyB7CisJZW51bSBubDgwMjExX25hbl9mdW5jdGlvbl90eXBlIHR5cGU7CisJdTggc2VydmljZV9pZFtOTDgwMjExX05BTl9GVU5DX1NFUlZJQ0VfSURfTEVOXTsKKwl1OCBwdWJsaXNoX3R5cGU7CisJYm9vbCBjbG9zZV9yYW5nZTsKKwlib29sIHB1Ymxpc2hfYmNhc3Q7CisJYm9vbCBzdWJzY3JpYmVfYWN0aXZlOworCXU4IGZvbGxvd3VwX2lkOworCXU4IGZvbGxvd3VwX3JlcWlkOworCXN0cnVjdCBtYWNfYWRkcmVzcyBmb2xsb3d1cF9kZXN0OworCXUzMiB0dGw7CisJY29uc3QgdTggKnNlcnZfc3BlY19pbmZvOworCXU4IHNlcnZfc3BlY19pbmZvX2xlbjsKKwlib29sIHNyZl9pbmNsdWRlOworCWNvbnN0IHU4ICpzcmZfYmY7CisJdTggc3JmX2JmX2xlbjsKKwl1OCBzcmZfYmZfaWR4OworCXN0cnVjdCBtYWNfYWRkcmVzcyAqc3JmX21hY3M7CisJaW50IHNyZl9udW1fbWFjczsKKwlzdHJ1Y3QgY2ZnODAyMTFfbmFuX2Z1bmNfZmlsdGVyICpyeF9maWx0ZXJzOworCXN0cnVjdCBjZmc4MDIxMV9uYW5fZnVuY19maWx0ZXIgKnR4X2ZpbHRlcnM7CisJdTggbnVtX3R4X2ZpbHRlcnM7CisJdTggbnVtX3J4X2ZpbHRlcnM7CisJdTggaW5zdGFuY2VfaWQ7CisJdTY0IGNvb2tpZTsKK307CisKKy8qKgogICogc3RydWN0IGNmZzgwMjExX29wcyAtIGJhY2tlbmQgZGVzY3JpcHRpb24gZm9yIHdpcmVsZXNzIGNvbmZpZ3VyYXRpb24KICAqCiAgKiBUaGlzIHN0cnVjdCBpcyByZWdpc3RlcmVkIGJ5IGZ1bGxtYWMgY2FyZCBkcml2ZXJzIGFuZC9vciB3aXJlbGVzcyBzdGFja3MKQEAgLTI0MjMsNyArMjUzNiw4IEBACiAgKgljYXNlcywgdGhlIHJlc3VsdCBvZiByb2FtaW5nIGlzIGluZGljYXRlZCB3aXRoIGEgY2FsbCB0bwogICoJY2ZnODAyMTFfcm9hbWVkKCkgb3IgY2ZnODAyMTFfcm9hbWVkX2JzcygpLgogICoJKGludm9rZWQgd2l0aCB0aGUgd2lyZWxlc3NfZGV2IG11dGV4IGhlbGQpCi0gKiBAZGlzY29ubmVjdDogRGlzY29ubmVjdCBmcm9tIHRoZSBCU1MvRVNTLgorICogQGRpc2Nvbm5lY3Q6IERpc2Nvbm5lY3QgZnJvbSB0aGUgQlNTL0VTUy4gT25jZSBkb25lLCBjYWxsCisgKgljZmc4MDIxMV9kaXNjb25uZWN0ZWQoKS4KICAqCShpbnZva2VkIHdpdGggdGhlIHdpcmVsZXNzX2RldiBtdXRleCBoZWxkKQogICoKICAqIEBqb2luX2lic3M6IEpvaW4gdGhlIHNwZWNpZmllZCBJQlNTIChvciBjcmVhdGUgaWYgbmVjZXNzYXJ5KS4gT25jZSBkb25lLCBjYWxsCkBAIC0yNTc5LDYgKzI2OTMsMTkgQEAKICAqCWFuZCByZXR1cm5pbmcgdG8gdGhlIGJhc2UgY2hhbm5lbCBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBBUC4KICAqIEB0ZGxzX2NhbmNlbF9jaGFubmVsX3N3aXRjaDogU3RvcCBjaGFubmVsLXN3aXRjaGluZyB3aXRoIGEgVERMUyBwZWVyLiBCb3RoCiAgKglwZWVycyBtdXN0IGJlIG9uIHRoZSBiYXNlIGNoYW5uZWwgd2hlbiB0aGUgY2FsbCBjb21wbGV0ZXMuCisgKiBAc3RhcnRfbmFuOiBTdGFydCB0aGUgTkFOIGludGVyZmFjZS4KKyAqIEBzdG9wX25hbjogU3RvcCB0aGUgTkFOIGludGVyZmFjZS4KKyAqIEBhZGRfbmFuX2Z1bmM6IEFkZCBhIE5BTiBmdW5jdGlvbi4gUmV0dXJucyBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICoJT24gc3VjY2VzcyBAbmFuX2Z1bmMgb3duZXJzaGlwIGlzIHRyYW5zZmVycmVkIHRvIHRoZSBkcml2ZXIgYW5kCisgKglpdCBtYXkgYWNjZXNzIGl0IG91dHNpZGUgb2YgdGhlIHNjb3BlIG9mIHRoaXMgZnVuY3Rpb24uIFRoZSBkcml2ZXIKKyAqCXNob3VsZCBmcmVlIHRoZSBAbmFuX2Z1bmMgd2hlbiBubyBsb25nZXIgbmVlZGVkIGJ5IGNhbGxpbmcKKyAqCWNmZzgwMjExX2ZyZWVfbmFuX2Z1bmMoKS4KKyAqCU9uIHN1Y2Nlc3MgdGhlIGRyaXZlciBzaG91bGQgYXNzaWduIGFuIGluc3RhbmNlX2lkIGluIHRoZQorICoJcHJvdmlkZWQgQG5hbl9mdW5jLgorICogQGRlbF9uYW5fZnVuYzogRGVsZXRlIGEgTkFOIGZ1bmN0aW9uLgorICogQG5hbl9jaGFuZ2VfY29uZjogY2hhbmdlcyBOQU4gY29uZmlndXJhdGlvbi4gVGhlIGNoYW5nZWQgcGFyYW1ldGVycyBtdXN0CisgKgliZSBzcGVjaWZpZWQgaW4gQGNoYW5nZXMgKHVzaW5nICZlbnVtIGNmZzgwMjExX25hbl9jb25mX2NoYW5nZXMpOworICoJQWxsIG90aGVyIHBhcmFtZXRlcnMgbXVzdCBiZSBpZ25vcmVkLgogICovCiBzdHJ1Y3QgY2ZnODAyMTFfb3BzIHsKIAlpbnQJKCpzdXNwZW5kKShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgY2ZnODAyMTFfd293bGFuICp3b3cpOwpAQCAtMjg0NCw2ICsyOTcxLDE3IEBACiAJdm9pZAkoKnRkbHNfY2FuY2VsX2NoYW5uZWxfc3dpdGNoKShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAogCQkJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQkgICAgICBjb25zdCB1OCAqYWRkcik7CisJaW50CSgqc3RhcnRfbmFuKShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJICAgICBzdHJ1Y3QgY2ZnODAyMTFfbmFuX2NvbmYgKmNvbmYpOworCXZvaWQJKCpzdG9wX25hbikoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IHdpcmVsZXNzX2RldiAqd2Rldik7CisJaW50CSgqYWRkX25hbl9mdW5jKShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCXN0cnVjdCBjZmc4MDIxMV9uYW5fZnVuYyAqbmFuX2Z1bmMpOworCXZvaWQJKCpkZWxfbmFuX2Z1bmMpKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkgICAgICAgdTY0IGNvb2tpZSk7CisJaW50CSgqbmFuX2NoYW5nZV9jb25mKShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJICAgc3RydWN0IGNmZzgwMjExX25hbl9jb25mICpjb25mLAorCQkJCSAgIHUzMiBjaGFuZ2VzKTsKIH07CiAKIC8qCkBAIC0yODkwLDYgKzMwMjgsOCBAQAogICogQFdJUEhZX0ZMQUdfU1VQUE9SVFNfNV8xMF9NSFo6IERldmljZSBzdXBwb3J0cyA1IE1IeiBhbmQgMTAgTUh6IGNoYW5uZWxzLgogICogQFdJUEhZX0ZMQUdfSEFTX0NIQU5ORUxfU1dJVENIOiBEZXZpY2Ugc3VwcG9ydHMgY2hhbm5lbCBzd2l0Y2ggaW4KICAqCWJlYWNvbmluZyBtb2RlIChBUCwgSUJTUywgTWVzaCwgLi4uKS4KKyAqIEBXSVBIWV9GTEFHX0hBU19TVEFUSUNfV0VQOiBUaGUgZGV2aWNlIHN1cHBvcnRzIHN0YXRpYyBXRVAga2V5IGluc3RhbGxhdGlvbgorICoJYmVmb3JlIGNvbm5lY3Rpb24uCiAgKi8KIGVudW0gd2lwaHlfZmxhZ3MgewogCS8qIHVzZSBob2xlIGF0IDAgKi8KQEAgLTI5MTUsNiArMzA1NSw3IEBACiAJV0lQSFlfRkxBR19IQVNfUkVNQUlOX09OX0NIQU5ORUwJPSBCSVQoMjEpLAogCVdJUEhZX0ZMQUdfU1VQUE9SVFNfNV8xMF9NSFoJCT0gQklUKDIyKSwKIAlXSVBIWV9GTEFHX0hBU19DSEFOTkVMX1NXSVRDSAkJPSBCSVQoMjMpLAorCVdJUEhZX0ZMQUdfSEFTX1NUQVRJQ19XRVAJCT0gQklUKDI0KSwKIH07CiAKIC8qKgpAQCAtMzI5Miw2ICszNDMzLDggQEAKICAqIEBic3Nfc2VsZWN0X3N1cHBvcnQ6IGJpdG1hc2sgaW5kaWNhdGluZyB0aGUgQlNTIHNlbGVjdGlvbiBjcml0ZXJpYSBzdXBwb3J0ZWQKICAqCWJ5IHRoZSBkcml2ZXIgaW4gdGhlIC5jb25uZWN0KCkgY2FsbGJhY2suIFRoZSBiaXQgcG9zaXRpb24gbWFwcyB0byB0aGUKICAqCWF0dHJpYnV0ZSBpbmRpY2VzIGRlZmluZWQgaW4gJmVudW0gbmw4MDIxMV9ic3Nfc2VsZWN0X2F0dHIuCisgKgorICogQGNvb2tpZV9jb3VudGVyOiB1bmlxdWUgZ2VuZXJpYyBjb29raWUgY291bnRlciwgdXNlZCB0byBpZGVudGlmeSBvYmplY3RzLgogICovCiBzdHJ1Y3Qgd2lwaHkgewogCS8qIGFzc2lnbiB0aGVzZSBmaWVsZHMgYmVmb3JlIHlvdSByZWdpc3RlciB0aGUgd2lwaHkgKi8KQEAgLTM0MjEsNiArMzU2NCw4IEBACiAKIAl1MzIgYnNzX3NlbGVjdF9zdXBwb3J0OwogCisJdTY0IGNvb2tpZV9jb3VudGVyOworCiAJY2hhciBwcml2WzBdIF9fYWxpZ25lZChORVRERVZfQUxJR04pOwogfTsKIApAQCAtMzYwMSw2ICszNzQ2LDcgQEAKICAqCWJlYWNvbnMsIDAgd2hlbiBub3QgdmFsaWQKICAqIEBhZGRyZXNzOiBUaGUgYWRkcmVzcyBmb3IgdGhpcyBkZXZpY2UsIHZhbGlkIG9ubHkgaWYgQG5ldGRldiBpcyAlTlVMTAogICogQHAycF9zdGFydGVkOiB0cnVlIGlmIHRoaXMgaXMgYSBQMlAgRGV2aWNlIHRoYXQgaGFzIGJlZW4gc3RhcnRlZAorICogQG5hbl9zdGFydGVkOiB0cnVlIGlmIHRoaXMgaXMgYSBOQU4gaW50ZXJmYWNlIHRoYXQgaGFzIGJlZW4gc3RhcnRlZAogICogQGNhY19zdGFydGVkOiB0cnVlIGlmIERGUyBjaGFubmVsIGF2YWlsYWJpbGl0eSBjaGVjayBoYXMgYmVlbiBzdGFydGVkCiAgKiBAY2FjX3N0YXJ0X3RpbWU6IHRpbWVzdGFtcCAoamlmZmllcykgd2hlbiB0aGUgZGZzIHN0YXRlIHdhcyBlbnRlcmVkLgogICogQGNhY190aW1lX21zOiBDQUMgdGltZSBpbiBtcwpAQCAtMzYzMiw3ICszNzc4LDcgQEAKIAogCXN0cnVjdCBtdXRleCBtdHg7CiAKLQlib29sIHVzZV80YWRkciwgcDJwX3N0YXJ0ZWQ7CisJYm9vbCB1c2VfNGFkZHIsIHAycF9zdGFydGVkLCBuYW5fc3RhcnRlZDsKIAogCXU4IGFkZHJlc3NbRVRIX0FMRU5dIF9fYWxpZ25lZChzaXplb2YodTE2KSk7CiAKQEAgLTM5NDYsNiArNDA5MiwzNCBAQAogCQkJCSAgICBzdHJ1Y3QgY2ZnODAyMTFfcW9zX21hcCAqcW9zX21hcCk7CiAKIC8qKgorICogY2ZnODAyMTFfZmluZF9pZV9tYXRjaCAtIG1hdGNoIGluZm9ybWF0aW9uIGVsZW1lbnQgYW5kIGJ5dGUgYXJyYXkgaW4gZGF0YQorICoKKyAqIEBlaWQ6IGVsZW1lbnQgSUQKKyAqIEBpZXM6IGRhdGEgY29uc2lzdGluZyBvZiBJRXMKKyAqIEBsZW46IGxlbmd0aCBvZiBkYXRhCisgKiBAbWF0Y2g6IGJ5dGUgYXJyYXkgdG8gbWF0Y2gKKyAqIEBtYXRjaF9sZW46IG51bWJlciBvZiBieXRlcyBpbiB0aGUgbWF0Y2ggYXJyYXkKKyAqIEBtYXRjaF9vZmZzZXQ6IG9mZnNldCBpbiB0aGUgSUUgd2hlcmUgdGhlIGJ5dGUgYXJyYXkgc2hvdWxkIG1hdGNoLgorICoJSWYgbWF0Y2hfbGVuIGlzIHplcm8sIHRoaXMgbXVzdCBhbHNvIGJlIHNldCB0byB6ZXJvLgorICoJT3RoZXJ3aXNlIHRoaXMgbXVzdCBiZSBzZXQgdG8gMiBvciBtb3JlLCBiZWNhdXNlIHRoZSBmaXJzdAorICoJYnl0ZSBpcyB0aGUgZWxlbWVudCBpZCwgd2hpY2ggaXMgYWxyZWFkeSBjb21wYXJlZCB0byBlaWQsIGFuZAorICoJdGhlIHNlY29uZCBieXRlIGlzIHRoZSBJRSBsZW5ndGguCisgKgorICogUmV0dXJuOiAlTlVMTCBpZiB0aGUgZWxlbWVudCBJRCBjb3VsZCBub3QgYmUgZm91bmQgb3IgaWYKKyAqIHRoZSBlbGVtZW50IGlzIGludmFsaWQgKGNsYWltcyB0byBiZSBsb25nZXIgdGhhbiB0aGUgZ2l2ZW4KKyAqIGRhdGEpIG9yIGlmIHRoZSBieXRlIGFycmF5IGRvZXNuJ3QgbWF0Y2gsIG9yIGEgcG9pbnRlciB0byB0aGUgZmlyc3QKKyAqIGJ5dGUgb2YgdGhlIHJlcXVlc3RlZCBlbGVtZW50LCB0aGF0IGlzIHRoZSBieXRlIGNvbnRhaW5pbmcgdGhlCisgKiBlbGVtZW50IElELgorICoKKyAqIE5vdGU6IFRoZXJlIGFyZSBubyBjaGVja3Mgb24gdGhlIGVsZW1lbnQgbGVuZ3RoIG90aGVyIHRoYW4KKyAqIGhhdmluZyB0byBmaXQgaW50byB0aGUgZ2l2ZW4gZGF0YSBhbmQgYmVpbmcgbGFyZ2UgZW5vdWdoIGZvciB0aGUKKyAqIGJ5dGUgYXJyYXkgdG8gbWF0Y2guCisgKi8KK2NvbnN0IHU4ICpjZmc4MDIxMV9maW5kX2llX21hdGNoKHU4IGVpZCwgY29uc3QgdTggKmllcywgaW50IGxlbiwKKwkJCQkgY29uc3QgdTggKm1hdGNoLCBpbnQgbWF0Y2hfbGVuLAorCQkJCSBpbnQgbWF0Y2hfb2Zmc2V0KTsKKworLyoqCiAgKiBjZmc4MDIxMV9maW5kX2llIC0gZmluZCBpbmZvcm1hdGlvbiBlbGVtZW50IGluIGRhdGEKICAqCiAgKiBAZWlkOiBlbGVtZW50IElECkBAIC0zOTYwLDcgKzQxMzQsMTAgQEAKICAqIE5vdGU6IFRoZXJlIGFyZSBubyBjaGVja3Mgb24gdGhlIGVsZW1lbnQgbGVuZ3RoIG90aGVyIHRoYW4KICAqIGhhdmluZyB0byBmaXQgaW50byB0aGUgZ2l2ZW4gZGF0YS4KICAqLwotY29uc3QgdTggKmNmZzgwMjExX2ZpbmRfaWUodTggZWlkLCBjb25zdCB1OCAqaWVzLCBpbnQgbGVuKTsKK3N0YXRpYyBpbmxpbmUgY29uc3QgdTggKmNmZzgwMjExX2ZpbmRfaWUodTggZWlkLCBjb25zdCB1OCAqaWVzLCBpbnQgbGVuKQoreworCXJldHVybiBjZmc4MDIxMV9maW5kX2llX21hdGNoKGVpZCwgaWVzLCBsZW4sIE5VTEwsIDAsIDApOworfQogCiAvKioKICAqIGNmZzgwMjExX2ZpbmRfdmVuZG9yX2llIC0gZmluZCB2ZW5kb3Igc3BlY2lmaWMgaW5mb3JtYXRpb24gZWxlbWVudCBpbiBkYXRhCkBAIC01NTA5LDYgKzU2ODYsNjcgQEAKIAlyZXR1cm4gKGZ0X2J5dGUgJiBCSVQoZnRpZHggJSA4KSkgIT0gMDsKIH0KIAorLyoqCisgKiBjZmc4MDIxMV9mcmVlX25hbl9mdW5jIC0gZnJlZSBOQU4gZnVuY3Rpb24KKyAqIEBmOiBOQU4gZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgZnJlZWQKKyAqCisgKiBGcmVlcyBhbGwgdGhlIE5BTiBmdW5jdGlvbiBhbmQgYWxsIGl0J3MgYWxsb2NhdGVkIG1lbWJlcnMuCisgKi8KK3ZvaWQgY2ZnODAyMTFfZnJlZV9uYW5fZnVuYyhzdHJ1Y3QgY2ZnODAyMTFfbmFuX2Z1bmMgKmYpOworCisvKioKKyAqIHN0cnVjdCBjZmc4MDIxMV9uYW5fbWF0Y2hfcGFyYW1zIC0gTkFOIG1hdGNoIHBhcmFtZXRlcnMKKyAqIEB0eXBlOiB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24gdGhhdCB0cmlnZ2VyZWQgYSBtYXRjaC4gSWYgaXQgaXMKKyAqCSAlTkw4MDIxMV9OQU5fRlVOQ19TVUJTQ1JJQkUgaXQgbWVhbnMgdGhhdCB3ZSByZXBsaWVkIHRvIGEgc3Vic2NyaWJlci4KKyAqCSBJZiBpdCBpcyAlTkw4MDIxMV9OQU5fRlVOQ19QVUJMSVNILCBpdCBtZWFucyB0aGF0IHdlIGdvdCBhIGRpc2NvdmVyeQorICoJIHJlc3VsdC4KKyAqCSBJZiBpdCBpcyAlTkw4MDIxMV9OQU5fRlVOQ19GT0xMT1dfVVAsIHdlIHJlY2VpdmVkIGEgZm9sbG93IHVwLgorICogQGluc3RfaWQ6IHRoZSBsb2NhbCBpbnN0YW5jZSBpZAorICogQHBlZXJfaW5zdF9pZDogdGhlIGluc3RhbmNlIGlkIG9mIHRoZSBwZWVyJ3MgZnVuY3Rpb24KKyAqIEBhZGRyOiB0aGUgTUFDIGFkZHJlc3Mgb2YgdGhlIHBlZXIKKyAqIEBpbmZvX2xlbjogdGhlIGxlbmd0aCBvZiB0aGUgJmluZm8KKyAqIEBpbmZvOiB0aGUgU2VydmljZSBTcGVjaWZpYyBJbmZvIGZyb20gdGhlIHBlZXIgKGlmIGFueSkKKyAqIEBjb29raWU6IHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCisgKi8KK3N0cnVjdCBjZmc4MDIxMV9uYW5fbWF0Y2hfcGFyYW1zIHsKKwllbnVtIG5sODAyMTFfbmFuX2Z1bmN0aW9uX3R5cGUgdHlwZTsKKwl1OCBpbnN0X2lkOworCXU4IHBlZXJfaW5zdF9pZDsKKwljb25zdCB1OCAqYWRkcjsKKwl1OCBpbmZvX2xlbjsKKwljb25zdCB1OCAqaW5mbzsKKwl1NjQgY29va2llOworfTsKKworLyoqCisgKiBjZmc4MDIxMV9uYW5fbWF0Y2ggLSByZXBvcnQgYSBtYXRjaCBmb3IgYSBOQU4gZnVuY3Rpb24uCisgKiBAd2RldjogdGhlIHdpcmVsZXNzIGRldmljZSByZXBvcnRpbmcgdGhlIG1hdGNoCisgKiBAbWF0Y2g6IG1hdGNoIG5vdGlmaWNhdGlvbiBwYXJhbWV0ZXJzCisgKiBAZ2ZwOiBhbGxvY2F0aW9uIGZsYWdzCisgKgorICogVGhpcyBmdW5jdGlvbiByZXBvcnRzIHRoYXQgdGhlIGEgTkFOIGZ1bmN0aW9uIGhhZCBhIG1hdGNoLiBUaGlzCisgKiBjYW4gYmUgYSBzdWJzY3JpYmUgdGhhdCBoYWQgYSBtYXRjaCBvciBhIHNvbGljaXRlZCBwdWJsaXNoIHRoYXQKKyAqIHdhcyBzZW50LiBJdCBjYW4gYWxzbyBiZSBhIGZvbGxvdyB1cCB0aGF0IHdhcyByZWNlaXZlZC4KKyAqLwordm9pZCBjZmc4MDIxMV9uYW5fbWF0Y2goc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCXN0cnVjdCBjZmc4MDIxMV9uYW5fbWF0Y2hfcGFyYW1zICptYXRjaCwgZ2ZwX3QgZ2ZwKTsKKworLyoqCisgKiBjZmc4MDIxMV9uYW5fZnVuY190ZXJtaW5hdGVkIC0gbm90aWZ5IGFib3V0IE5BTiBmdW5jdGlvbiB0ZXJtaW5hdGlvbi4KKyAqCisgKiBAd2RldjogdGhlIHdpcmVsZXNzIGRldmljZSByZXBvcnRpbmcgdGhlIG1hdGNoCisgKiBAaW5zdF9pZDogdGhlIGxvY2FsIGluc3RhbmNlIGlkCisgKiBAcmVhc29uOiB0ZXJtaW5hdGlvbiByZWFzb24gKG9uZSBvZiB0aGUgTkw4MDIxMV9OQU5fRlVOQ19URVJNX1JFQVNPTl8qKQorICogQGNvb2tpZTogdW5pcXVlIE5BTiBmdW5jdGlvbiBpZGVudGlmaWVyCisgKiBAZ2ZwOiBhbGxvY2F0aW9uIGZsYWdzCisgKgorICogVGhpcyBmdW5jdGlvbiByZXBvcnRzIHRoYXQgdGhlIGEgTkFOIGZ1bmN0aW9uIGlzIHRlcm1pbmF0ZWQuCisgKi8KK3ZvaWQgY2ZnODAyMTFfbmFuX2Z1bmNfdGVybWluYXRlZChzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCSAgdTggaW5zdF9pZCwKKwkJCQkgIGVudW0gbmw4MDIxMV9uYW5fZnVuY190ZXJtX3JlYXNvbiByZWFzb24sCisJCQkJICB1NjQgY29va2llLCBnZnBfdCBnZnApOworCiAvKiBldGh0b29sIGhlbHBlciAqLwogdm9pZCBjZmc4MDIxMV9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvZGV2bGluay5oIGIvaW5jbHVkZS9uZXQvZGV2bGluay5oCmluZGV4IGM5OWZmZTguLjIxMWJkM2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2RldmxpbmsuaAorKysgYi9pbmNsdWRlL25ldC9kZXZsaW5rLmgKQEAgLTUwLDcgKzUwLDYgQEAKIH07CiAKIHN0cnVjdCBkZXZsaW5rX29wcyB7Ci0Jc2l6ZV90IHByaXZfc2l6ZTsKIAlpbnQgKCpwb3J0X3R5cGVfc2V0KShzdHJ1Y3QgZGV2bGlua19wb3J0ICpkZXZsaW5rX3BvcnQsCiAJCQkgICAgIGVudW0gZGV2bGlua19wb3J0X3R5cGUgcG9ydF90eXBlKTsKIAlpbnQgKCpwb3J0X3NwbGl0KShzdHJ1Y3QgZGV2bGluayAqZGV2bGluaywgdW5zaWduZWQgaW50IHBvcnRfaW5kZXgsCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9kc2EuaCBiL2luY2x1ZGUvbmV0L2RzYS5oCmluZGV4IDIyMTdhM2YuLmIxMjIxOTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2RzYS5oCisrKyBiL2luY2x1ZGUvbmV0L2RzYS5oCkBAIC0yNiw2ICsyNiw3IEBACiAJRFNBX1RBR19QUk9UT19UUkFJTEVSLAogCURTQV9UQUdfUFJPVE9fRURTQSwKIAlEU0FfVEFHX1BST1RPX0JSQ00sCisJRFNBX1RBR19QUk9UT19RQ0EsCiAJRFNBX1RBR19MQVNULAkJLyogTVVTVCBCRSBMQVNUICovCiB9OwogCkBAIC0xNDIsNiArMTQzLDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZQkqbmV0ZGV2OwogCXN0cnVjdCBkZXZpY2Vfbm9kZQkqZG47CiAJdW5zaWduZWQgaW50CQlhZ2VpbmdfdGltZTsKKwl1OAkJCXN0cF9zdGF0ZTsKIH07CiAKIHN0cnVjdCBkc2Ffc3dpdGNoIHsKQEAgLTE2NSw5ICsxNjcsOSBAQAogCXN0cnVjdCBkc2FfY2hpcF9kYXRhCSpjZDsKIAogCS8qCi0JICogVGhlIHVzZWQgc3dpdGNoIGRyaXZlci4KKwkgKiBUaGUgc3dpdGNoIG9wZXJhdGlvbnMuCiAJICovCi0Jc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyCSpkcnY7CisJc3RydWN0IGRzYV9zd2l0Y2hfb3BzCSpvcHM7CiAKIAkvKgogCSAqIEFuIGFycmF5IG9mIHdoaWNoIGVsZW1lbnQgW2FdIGluZGljYXRlcyB3aGljaCBwb3J0IG9uIHRoaXMKQEAgLTIzNCwxOSArMjM2LDIxIEBACiBzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zOwogc3RydWN0IHN3aXRjaGRldl9vYmo7CiBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X2ZkYjsKK3N0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfbWRiOwogc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF92bGFuOwogCi1zdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgeworc3RydWN0IGRzYV9zd2l0Y2hfb3BzIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CiAKLQllbnVtIGRzYV90YWdfcHJvdG9jb2wJdGFnX3Byb3RvY29sOwotCiAJLyoKIAkgKiBQcm9iaW5nIGFuZCBzZXR1cC4KIAkgKi8KIAljb25zdCBjaGFyCSooKnByb2JlKShzdHJ1Y3QgZGV2aWNlICpkc2FfZGV2LAogCQkJCSAgc3RydWN0IGRldmljZSAqaG9zdF9kZXYsIGludCBzd19hZGRyLAogCQkJCSAgdm9pZCAqKnByaXYpOworCisJZW51bSBkc2FfdGFnX3Byb3RvY29sICgqZ2V0X3RhZ19wcm90b2NvbCkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKTsKKwogCWludAkoKnNldHVwKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpOwogCWludAkoKnNldF9hZGRyKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIHU4ICphZGRyKTsKIAl1MzIJKCpnZXRfcGh5X2ZsYWdzKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0KTsKQEAgLTMzNiw2ICszNDAsNyBAQAogCXZvaWQJKCpwb3J0X2JyaWRnZV9sZWF2ZSkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCk7CiAJdm9pZAkoKnBvcnRfc3RwX3N0YXRlX3NldCkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAkJCQkgICAgICB1OCBzdGF0ZSk7CisJdm9pZAkoKnBvcnRfZmFzdF9hZ2UpKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQpOwogCiAJLyoKIAkgKiBWTEFOIHN1cHBvcnQKQEAgLTM2OCwxNyArMzczLDI3IEBACiAJaW50CSgqcG9ydF9mZGJfZHVtcCkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAkJCQkgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9mZGIgKmZkYiwKIAkJCQkgaW50ICgqY2IpKHN0cnVjdCBzd2l0Y2hkZXZfb2JqICpvYmopKTsKKworCS8qCisJICogTXVsdGljYXN0IGRhdGFiYXNlCisJICovCisJaW50CSgqcG9ydF9tZGJfcHJlcGFyZSkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9tZGIgKm1kYiwKKwkJCQkgICAgc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpOworCXZvaWQJKCpwb3J0X21kYl9hZGQpKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJCQkJY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9tZGIgKm1kYiwKKwkJCQlzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zICp0cmFucyk7CisJaW50CSgqcG9ydF9tZGJfZGVsKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAorCQkJCWNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfbWRiICptZGIpOworCWludAkoKnBvcnRfbWRiX2R1bXApKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJCQkJIHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfbWRiICptZGIsCisJCQkJIGludCAoKmNiKShzdHJ1Y3Qgc3dpdGNoZGV2X29iaiAqb2JqKSk7CiB9OwogCi12b2lkIHJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyICp0eXBlKTsKLXZvaWQgdW5yZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKHN0cnVjdCBkc2Ffc3dpdGNoX2RyaXZlciAqdHlwZSk7Cit2b2lkIHJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoc3RydWN0IGRzYV9zd2l0Y2hfb3BzICp0eXBlKTsKK3ZvaWQgdW5yZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKHN0cnVjdCBkc2Ffc3dpdGNoX29wcyAqdHlwZSk7CiBzdHJ1Y3QgbWlpX2J1cyAqZHNhX2hvc3RfZGV2X3RvX21paV9idXMoc3RydWN0IGRldmljZSAqZGV2KTsKIAotc3RhdGljIGlubGluZSB2b2lkICpkc190b19wcml2KHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKLXsKLQlyZXR1cm4gZHMtPnByaXY7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgYm9vbCBkc2FfdXNlc190YWdnZWRfcHJvdG9jb2woc3RydWN0IGRzYV9zd2l0Y2hfdHJlZSAqZHN0KQogewogCXJldHVybiBkc3QtPnJjdiAhPSBOVUxMOwpAQCAtMzg2LDQgKzQwMSwxOCBAQAogCiB2b2lkIGRzYV91bnJlZ2lzdGVyX3N3aXRjaChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpOwogaW50IGRzYV9yZWdpc3Rlcl9zd2l0Y2goc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK2ludCBkc2Ffc3dpdGNoX3N1c3BlbmQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKTsKK2ludCBkc2Ffc3dpdGNoX3Jlc3VtZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGRzYV9zd2l0Y2hfc3VzcGVuZChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCBkc2Ffc3dpdGNoX3Jlc3VtZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvZHN0X21ldGFkYXRhLmggYi9pbmNsdWRlL25ldC9kc3RfbWV0YWRhdGEuaAppbmRleCA1ZGI5ZjU5Li42OTY1YzhmIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9kc3RfbWV0YWRhdGEuaAorKysgYi9pbmNsdWRlL25ldC9kc3RfbWV0YWRhdGEuaApAQCAtMTEyLDEyICsxMTIsMTMgQEAKIAlyZXR1cm4gJmRzdC0+dS50dW5faW5mbzsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgbWV0YWRhdGFfZHN0ICppcF90dW5fcnhfZHN0KHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCQkgX19iZTE2IGZsYWdzLAotCQkJCQkJIF9fYmU2NCB0dW5uZWxfaWQsCi0JCQkJCQkgaW50IG1kX3NpemUpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtZXRhZGF0YV9kc3QgKl9faXBfdHVuX3NldF9kc3QoX19iZTMyIHNhZGRyLAorCQkJCQkJICAgIF9fYmUzMiBkYWRkciwKKwkJCQkJCSAgICBfX3U4IHRvcywgX191OCB0dGwsCisJCQkJCQkgICAgX19iZTE2IGZsYWdzLAorCQkJCQkJICAgIF9fYmU2NCB0dW5uZWxfaWQsCisJCQkJCQkgICAgaW50IG1kX3NpemUpCiB7Ci0JY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAlzdHJ1Y3QgbWV0YWRhdGFfZHN0ICp0dW5fZHN0OwogCiAJdHVuX2RzdCA9IHR1bl9yeF9kc3QobWRfc2l6ZSk7CkBAIC0xMjUsMTcgKzEyNiwzMCBAQAogCQlyZXR1cm4gTlVMTDsKIAogCWlwX3R1bm5lbF9rZXlfaW5pdCgmdHVuX2RzdC0+dS50dW5faW5mby5rZXksCi0JCQkgICBpcGgtPnNhZGRyLCBpcGgtPmRhZGRyLCBpcGgtPnRvcywgaXBoLT50dGwsCisJCQkgICBzYWRkciwgZGFkZHIsIHRvcywgdHRsLAogCQkJICAgMCwgMCwgMCwgdHVubmVsX2lkLCBmbGFncyk7CiAJcmV0dXJuIHR1bl9kc3Q7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IG1ldGFkYXRhX2RzdCAqaXB2Nl90dW5fcnhfZHN0KHN0cnVjdCBza19idWZmICpza2IsCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtZXRhZGF0YV9kc3QgKmlwX3R1bl9yeF9kc3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJCSBfX2JlMTYgZmxhZ3MsCiAJCQkJCQkgX19iZTY0IHR1bm5lbF9pZCwKIAkJCQkJCSBpbnQgbWRfc2l6ZSkKIHsKLQljb25zdCBzdHJ1Y3QgaXB2NmhkciAqaXA2aCA9IGlwdjZfaGRyKHNrYik7CisJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKKworCXJldHVybiBfX2lwX3R1bl9zZXRfZHN0KGlwaC0+c2FkZHIsIGlwaC0+ZGFkZHIsIGlwaC0+dG9zLCBpcGgtPnR0bCwKKwkJCQlmbGFncywgdHVubmVsX2lkLCBtZF9zaXplKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbWV0YWRhdGFfZHN0ICpfX2lwdjZfdHVuX3NldF9kc3QoY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwKKwkJCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCisJCQkJCQkgICAgICBfX3U4IHRvcywgX191OCB0dGwsCisJCQkJCQkgICAgICBfX2JlMzIgbGFiZWwsCisJCQkJCQkgICAgICBfX2JlMTYgZmxhZ3MsCisJCQkJCQkgICAgICBfX2JlNjQgdHVubmVsX2lkLAorCQkJCQkJICAgICAgaW50IG1kX3NpemUpCit7CiAJc3RydWN0IG1ldGFkYXRhX2RzdCAqdHVuX2RzdDsKIAlzdHJ1Y3QgaXBfdHVubmVsX2luZm8gKmluZm87CiAKQEAgLTE1MCwxNCArMTY0LDI2IEBACiAJaW5mby0+a2V5LnRwX3NyYyA9IDA7CiAJaW5mby0+a2V5LnRwX2RzdCA9IDA7CiAKLQlpbmZvLT5rZXkudS5pcHY2LnNyYyA9IGlwNmgtPnNhZGRyOwotCWluZm8tPmtleS51LmlwdjYuZHN0ID0gaXA2aC0+ZGFkZHI7CisJaW5mby0+a2V5LnUuaXB2Ni5zcmMgPSAqc2FkZHI7CisJaW5mby0+a2V5LnUuaXB2Ni5kc3QgPSAqZGFkZHI7CiAKLQlpbmZvLT5rZXkudG9zID0gaXB2Nl9nZXRfZHNmaWVsZChpcDZoKTsKLQlpbmZvLT5rZXkudHRsID0gaXA2aC0+aG9wX2xpbWl0OwotCWluZm8tPmtleS5sYWJlbCA9IGlwNl9mbG93bGFiZWwoaXA2aCk7CisJaW5mby0+a2V5LnRvcyA9IHRvczsKKwlpbmZvLT5rZXkudHRsID0gdHRsOworCWluZm8tPmtleS5sYWJlbCA9IGxhYmVsOwogCiAJcmV0dXJuIHR1bl9kc3Q7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1ldGFkYXRhX2RzdCAqaXB2Nl90dW5fcnhfZHN0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCQkgICBfX2JlMTYgZmxhZ3MsCisJCQkJCQkgICBfX2JlNjQgdHVubmVsX2lkLAorCQkJCQkJICAgaW50IG1kX3NpemUpCit7CisJY29uc3Qgc3RydWN0IGlwdjZoZHIgKmlwNmggPSBpcHY2X2hkcihza2IpOworCisJcmV0dXJuIF9faXB2Nl90dW5fc2V0X2RzdCgmaXA2aC0+c2FkZHIsICZpcDZoLT5kYWRkciwKKwkJCQkgIGlwdjZfZ2V0X2RzZmllbGQoaXA2aCksIGlwNmgtPmhvcF9saW1pdCwKKwkJCQkgIGlwNl9mbG93bGFiZWwoaXA2aCksIGZsYWdzLCB0dW5uZWxfaWQsCisJCQkJICBtZF9zaXplKTsKK30KICNlbmRpZiAvKiBfX05FVF9EU1RfTUVUQURBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvZmxvdy5oIGIvaW5jbHVkZS9uZXQvZmxvdy5oCmluZGV4IGQ0N2VmNGIuLjAzNWFhNzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2Zsb3cuaAorKysgYi9pbmNsdWRlL25ldC9mbG93LmgKQEAgLTM0LDggKzM0LDcgQEAKIAlfX3U4CWZsb3dpY19mbGFnczsKICNkZWZpbmUgRkxPV0lfRkxBR19BTllTUkMJCTB4MDEKICNkZWZpbmUgRkxPV0lfRkxBR19LTk9XTl9OSAkJMHgwMgotI2RlZmluZSBGTE9XSV9GTEFHX0wzTURFVl9TUkMJCTB4MDQKLSNkZWZpbmUgRkxPV0lfRkxBR19TS0lQX05IX09JRgkJMHgwOAorI2RlZmluZSBGTE9XSV9GTEFHX1NLSVBfTkhfT0lGCQkweDA0CiAJX191MzIJZmxvd2ljX3NlY2lkOwogCXN0cnVjdCBmbG93aV90dW5uZWwgZmxvd2ljX3R1bl9rZXk7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvZmxvd19kaXNzZWN0b3IuaCBiL2luY2x1ZGUvbmV0L2Zsb3dfZGlzc2VjdG9yLmgKaW5kZXggZDNkNjBkYy4uZDk1MzQ5MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZmxvd19kaXNzZWN0b3IuaAorKysgYi9pbmNsdWRlL25ldC9mbG93X2Rpc3NlY3Rvci5oCkBAIC0zMiw4ICszMiwxMyBAQAogfTsKIAogc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV90YWdzIHsKLQl1MzIJdmxhbl9pZDoxMiwKLQkJZmxvd19sYWJlbDoyMDsKKwl1MzIJZmxvd19sYWJlbDsKK307CisKK3N0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfdmxhbiB7CisJdTE2CXZsYW5faWQ6MTIsCisJCXZsYW5fcHJpb3JpdHk6MzsKKwl1MTYJcGFkZGluZzsKIH07CiAKIHN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfa2V5aWQgewpAQCAtMTE5LDcgKzEyNCw3IEBACiAJRkxPV19ESVNTRUNUT1JfS0VZX1BPUlRTLCAvKiBzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X3BvcnRzICovCiAJRkxPV19ESVNTRUNUT1JfS0VZX0VUSF9BRERSUywgLyogc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9ldGhfYWRkcnMgKi8KIAlGTE9XX0RJU1NFQ1RPUl9LRVlfVElQQ19BRERSUywgLyogc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV90aXBjX2FkZHJzICovCi0JRkxPV19ESVNTRUNUT1JfS0VZX1ZMQU5JRCwgLyogc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9mbG93X3RhZ3MgKi8KKwlGTE9XX0RJU1NFQ1RPUl9LRVlfVkxBTiwgLyogc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9mbG93X3ZsYW4gKi8KIAlGTE9XX0RJU1NFQ1RPUl9LRVlfRkxPV19MQUJFTCwgLyogc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9mbG93X3RhZ3MgKi8KIAlGTE9XX0RJU1NFQ1RPUl9LRVlfR1JFX0tFWUlELCAvKiBzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X2tleWlkICovCiAJRkxPV19ESVNTRUNUT1JfS0VZX01QTFNfRU5UUk9QWSwgLyogc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9rZXlpZCAqLwpAQCAtMTQ4LDYgKzE1Myw3IEBACiAjZGVmaW5lIEZMT1dfS0VZU19IQVNIX1NUQVJUX0ZJRUxEIGJhc2ljCiAJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9iYXNpYyBiYXNpYzsKIAlzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X3RhZ3MgdGFnczsKKwlzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X3ZsYW4gdmxhbjsKIAlzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X2tleWlkIGtleWlkOwogCXN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfcG9ydHMgcG9ydHM7CiAJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9hZGRycyBhZGRyczsKQEAgLTE3Nyw3ICsxODMsNyBAQAogdm9pZCBtYWtlX2Zsb3dfa2V5c19kaWdlc3Qoc3RydWN0IGZsb3dfa2V5c19kaWdlc3QgKmRpZ2VzdCwKIAkJCSAgIGNvbnN0IHN0cnVjdCBmbG93X2tleXMgKmZsb3cpOwogCi1zdGF0aWMgaW5saW5lIGJvb2wgZmxvd19rZXlzX2hhdmVfbDQoc3RydWN0IGZsb3dfa2V5cyAqa2V5cykKK3N0YXRpYyBpbmxpbmUgYm9vbCBmbG93X2tleXNfaGF2ZV9sNChjb25zdCBzdHJ1Y3QgZmxvd19rZXlzICprZXlzKQogewogCXJldHVybiAoa2V5cy0+cG9ydHMucG9ydHMgfHwga2V5cy0+dGFncy5mbG93X2xhYmVsKTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2ZxLmggYi9pbmNsdWRlL25ldC9mcS5oCmluZGV4IDI2OGI0OTAuLjZkODUyMWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2ZxLmgKKysrIGIvaW5jbHVkZS9uZXQvZnEuaApAQCAtNzIsOSArNzIsMTIgQEAKIAl1MzIgZmxvd3NfY250OwogCXUzMiBwZXJ0dXJiYXRpb247CiAJdTMyIGxpbWl0OworCXUzMiBtZW1vcnlfbGltaXQ7CisJdTMyIG1lbW9yeV91c2FnZTsKIAl1MzIgcXVhbnR1bTsKIAl1MzIgYmFja2xvZzsKIAl1MzIgb3ZlcmxpbWl0OworCXUzMiBvdmVybWVtb3J5OwogCXUzMiBjb2xsaXNpb25zOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvZnFfaW1wbC5oIGIvaW5jbHVkZS9uZXQvZnFfaW1wbC5oCmluZGV4IDE2M2YzZWQuLjRlNjEzMWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2ZxX2ltcGwuaAorKysgYi9pbmNsdWRlL25ldC9mcV9pbXBsLmgKQEAgLTI5LDYgKzI5LDcgQEAKIAl0aW4tPmJhY2tsb2dfcGFja2V0cy0tOwogCWZsb3ctPmJhY2tsb2cgLT0gc2tiLT5sZW47CiAJZnEtPmJhY2tsb2ctLTsKKwlmcS0+bWVtb3J5X3VzYWdlIC09IHNrYi0+dHJ1ZXNpemU7CiAKIAlpZiAoZmxvdy0+YmFja2xvZyA9PSAwKSB7CiAJCWxpc3RfZGVsX2luaXQoJmZsb3ctPmJhY2tsb2djaGFpbik7CkBAIC0xNTQsNiArMTU1LDcgQEAKIAlmbG93LT5iYWNrbG9nICs9IHNrYi0+bGVuOwogCXRpbi0+YmFja2xvZ19ieXRlcyArPSBza2ItPmxlbjsKIAl0aW4tPmJhY2tsb2dfcGFja2V0cysrOworCWZxLT5tZW1vcnlfdXNhZ2UgKz0gc2tiLT50cnVlc2l6ZTsKIAlmcS0+YmFja2xvZysrOwogCiAJZnFfcmVjYWxjX2JhY2tsb2coZnEsIHRpbiwgZmxvdyk7CkBAIC0xNjYsNyArMTY4LDcgQEAKIAogCV9fc2tiX3F1ZXVlX3RhaWwoJmZsb3ctPnF1ZXVlLCBza2IpOwogCi0JaWYgKGZxLT5iYWNrbG9nID4gZnEtPmxpbWl0KSB7CisJaWYgKGZxLT5iYWNrbG9nID4gZnEtPmxpbWl0IHx8IGZxLT5tZW1vcnlfdXNhZ2UgPiBmcS0+bWVtb3J5X2xpbWl0KSB7CiAJCWZsb3cgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmZxLT5iYWNrbG9ncywKIAkJCQkJCXN0cnVjdCBmcV9mbG93LAogCQkJCQkJYmFja2xvZ2NoYWluKTsKQEAgLTE4MSw2ICsxODMsOCBAQAogCiAJCWZsb3ctPnRpbi0+b3ZlcmxpbWl0Kys7CiAJCWZxLT5vdmVybGltaXQrKzsKKwkJaWYgKGZxLT5tZW1vcnlfdXNhZ2UgPiBmcS0+bWVtb3J5X2xpbWl0KQorCQkJZnEtPm92ZXJtZW1vcnkrKzsKIAl9CiB9CiAKQEAgLTI1MSw2ICsyNTUsNyBAQAogCWZxLT5wZXJ0dXJiYXRpb24gPSBwcmFuZG9tX3UzMigpOwogCWZxLT5xdWFudHVtID0gMzAwOwogCWZxLT5saW1pdCA9IDgxOTI7CisJZnEtPm1lbW9yeV9saW1pdCA9IDE2IDw8IDIwOyAvKiAxNiBNQnl0ZXMgKi8KIAogCWZxLT5mbG93cyA9IGtjYWxsb2MoZnEtPmZsb3dzX2NudCwgc2l6ZW9mKGZxLT5mbG93c1swXSksIEdGUF9LRVJORUwpOwogCWlmICghZnEtPmZsb3dzKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvZ3JlLmggYi9pbmNsdWRlL25ldC9ncmUuaAppbmRleCA3YTU0YTMxLi5kMjVkODM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9ncmUuaAorKysgYi9pbmNsdWRlL25ldC9ncmUuaApAQCAtNyw3ICs3LDE1IEBACiBzdHJ1Y3QgZ3JlX2Jhc2VfaGRyIHsKIAlfX2JlMTYgZmxhZ3M7CiAJX19iZTE2IHByb3RvY29sOwotfTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBncmVfZnVsbF9oZHIgeworCXN0cnVjdCBncmVfYmFzZV9oZHIgZml4ZWRfaGVhZGVyOworCV9fYmUxNiBjc3VtOworCV9fYmUxNiByZXNlcnZlZDE7CisJX19iZTMyIGtleTsKKwlfX2JlMzIgc2VxOworfSBfX3BhY2tlZDsKICNkZWZpbmUgR1JFX0hFQURFUl9TRUNUSU9OIDQKIAogI2RlZmluZSBHUkVQUk9UT19DSVNDTwkJMApAQCAtMTA0LDYgKzExMiw3IEBACiAKIAlza2JfcHVzaChza2IsIGhkcl9sZW4pOwogCisJc2tiX3NldF9pbm5lcl9wcm90b2NvbChza2IsIHByb3RvKTsKIAlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwogCWdyZWggPSAoc3RydWN0IGdyZV9iYXNlX2hkciAqKXNrYi0+ZGF0YTsKIAlncmVoLT5mbGFncyA9IGdyZV90bmxfZmxhZ3NfdG9fZ3JlX2ZsYWdzKGZsYWdzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2llZWU4MDIxMV9yYWRpb3RhcC5oIGIvaW5jbHVkZS9uZXQvaWVlZTgwMjExX3JhZGlvdGFwLmgKaW5kZXggYjBmZDk0Ny4uYmEwN2I5ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaWVlZTgwMjExX3JhZGlvdGFwLmgKKysrIGIvaW5jbHVkZS9uZXQvaWVlZTgwMjExX3JhZGlvdGFwLmgKQEAgLTE5MCw2ICsxOTAsMTAgQEAKICAqIElFRUU4MDIxMV9SQURJT1RBUF9WSFQJdTE2LCB1OCwgdTgsIHU4WzRdLCB1OCwgdTgsIHUxNgogICoKICAqCUNvbnRhaW5zIFZIVCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGZyYW1lLgorICoKKyAqIElFRUU4MDIxMV9SQURJT1RBUF9USU1FU1RBTVAJCXU2NCwgdTE2LCB1OCwgdTgJdmFyaWFibGUKKyAqCisgKglDb250YWlucyB0aW1lc3RhbXAgaW5mb3JtYXRpb24gZm9yIHRoaXMgZnJhbWUuCiAgKi8KIGVudW0gaWVlZTgwMjExX3JhZGlvdGFwX3R5cGUgewogCUlFRUU4MDIxMV9SQURJT1RBUF9UU0ZUID0gMCwKQEAgLTIxNCw2ICsyMTgsNyBAQAogCUlFRUU4MDIxMV9SQURJT1RBUF9NQ1MgPSAxOSwKIAlJRUVFODAyMTFfUkFESU9UQVBfQU1QRFVfU1RBVFVTID0gMjAsCiAJSUVFRTgwMjExX1JBRElPVEFQX1ZIVCA9IDIxLAorCUlFRUU4MDIxMV9SQURJT1RBUF9USU1FU1RBTVAgPSAyMiwKIAogCS8qIHZhbGlkIGluIGV2ZXJ5IGl0X3ByZXNlbnQgYml0bWFwLCBldmVuIHZlbmRvciBuYW1lc3BhY2VzICovCiAJSUVFRTgwMjExX1JBRElPVEFQX1JBRElPVEFQX05BTUVTUEFDRSA9IDI5LApAQCAtMzIxLDYgKzMyNiwyMiBAQAogI2RlZmluZSBJRUVFODAyMTFfUkFESU9UQVBfQ09ESU5HX0xEUENfVVNFUjIJCQkweDA0CiAjZGVmaW5lIElFRUU4MDIxMV9SQURJT1RBUF9DT0RJTkdfTERQQ19VU0VSMwkJCTB4MDgKIAorLyogRm9yIElFRUU4MDIxMV9SQURJT1RBUF9USU1FU1RBTVAgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1JBRElPVEFQX1RJTUVTVEFNUF9VTklUX01BU0sJCQkweDAwMEYKKyNkZWZpbmUgSUVFRTgwMjExX1JBRElPVEFQX1RJTUVTVEFNUF9VTklUX01TCQkJMHgwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9SQURJT1RBUF9USU1FU1RBTVBfVU5JVF9VUwkJCTB4MDAwMQorI2RlZmluZSBJRUVFODAyMTFfUkFESU9UQVBfVElNRVNUQU1QX1VOSVRfTlMJCQkweDAwMDMKKyNkZWZpbmUgSUVFRTgwMjExX1JBRElPVEFQX1RJTUVTVEFNUF9TUE9TX01BU0sJCQkweDAwRjAKKyNkZWZpbmUgSUVFRTgwMjExX1JBRElPVEFQX1RJTUVTVEFNUF9TUE9TX0JFR0lOX01EUFUJCTB4MDAwMAorI2RlZmluZSBJRUVFODAyMTFfUkFESU9UQVBfVElNRVNUQU1QX1NQT1NfRU9fTVBEVQkJMHgwMDEwCisjZGVmaW5lIElFRUU4MDIxMV9SQURJT1RBUF9USU1FU1RBTVBfU1BPU19FT19QUERVCQkweDAwMjAKKyNkZWZpbmUgSUVFRTgwMjExX1JBRElPVEFQX1RJTUVTVEFNUF9TUE9TX1BMQ1BfU0lHX0FDUQkJMHgwMDMwCisjZGVmaW5lIElFRUU4MDIxMV9SQURJT1RBUF9USU1FU1RBTVBfU1BPU19VTktOT1dOCQkweDAwRjAKKworI2RlZmluZSBJRUVFODAyMTFfUkFESU9UQVBfVElNRVNUQU1QX0ZMQUdfNjRCSVQJCQkweDAwCisjZGVmaW5lIElFRUU4MDIxMV9SQURJT1RBUF9USU1FU1RBTVBfRkxBR18zMkJJVAkJCTB4MDEKKyNkZWZpbmUgSUVFRTgwMjExX1JBRElPVEFQX1RJTUVTVEFNUF9GTEFHX0FDQ1VSQUNZCQkweDAyCisKIC8qIGhlbHBlcnMgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGllZWU4MDIxMV9nZXRfcmFkaW90YXBfbGVuKHVuc2lnbmVkIGNoYXIgKmRhdGEpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pZl9pbmV0Ni5oIGIvaW5jbHVkZS9uZXQvaWZfaW5ldDYuaAppbmRleCAxYzhiNjgyLi41MTUzNTJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pZl9pbmV0Ni5oCisrKyBiL2luY2x1ZGUvbmV0L2lmX2luZXQ2LmgKQEAgLTIwMSw2ICsyMDEsNyBAQAogCXN0cnVjdCBpcHY2X2RldnN0YXQJc3RhdHM7CiAKIAlzdHJ1Y3QgdGltZXJfbGlzdAlyc190aW1lcjsKKwlfX3MzMgkJCXJzX2ludGVydmFsOwkvKiBpbiBqaWZmaWVzICovCiAJX191OAkJCXJzX3Byb2JlczsKIAogCV9fdTgJCQlhZGRyX2dlbl9tb2RlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaW5ldF9jb25uZWN0aW9uX3NvY2suaCBiL2luY2x1ZGUvbmV0L2luZXRfY29ubmVjdGlvbl9zb2NrLmgKaW5kZXggNDlkY2FkNC4uMTk3YTMwZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaW5ldF9jb25uZWN0aW9uX3NvY2suaAorKysgYi9pbmNsdWRlL25ldC9pbmV0X2Nvbm5lY3Rpb25fc29jay5oCkBAIC0xMzQsOCArMTM0LDggQEAKIAl9IGljc2tfbXR1cDsKIAl1MzIJCQkgIGljc2tfdXNlcl90aW1lb3V0OwogCi0JdTY0CQkJICBpY3NrX2NhX3ByaXZbNjQgLyBzaXplb2YodTY0KV07Ci0jZGVmaW5lIElDU0tfQ0FfUFJJVl9TSVpFICAgICAgKDggKiBzaXplb2YodTY0KSkKKwl1NjQJCQkgIGljc2tfY2FfcHJpdls4OCAvIHNpemVvZih1NjQpXTsKKyNkZWZpbmUgSUNTS19DQV9QUklWX1NJWkUgICAgICAoMTEgKiBzaXplb2YodTY0KSkKIH07CiAKICNkZWZpbmUgSUNTS19USU1FX1JFVFJBTlMJMQkvKiBSZXRyYW5zbWl0IHRpbWVyICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0X2Vjbi5oIGIvaW5jbHVkZS9uZXQvaW5ldF9lY24uaAppbmRleCAwZGMwYTUxLi5kY2UyZDU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pbmV0X2Vjbi5oCisrKyBiL2luY2x1ZGUvbmV0L2luZXRfZWNuLmgKQEAgLTEyOCw3ICsxMjgsOCBAQAogCXRvID0gZnJvbSB8IGh0b25sKElORVRfRUNOX0NFIDw8IDIwKTsKIAkqKF9fYmUzMiAqKWlwaCA9IHRvOwogCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkKLQkJc2tiLT5jc3VtID0gY3N1bV9hZGQoY3N1bV9zdWIoc2tiLT5jc3VtLCBmcm9tKSwgdG8pOworCQlza2ItPmNzdW0gPSBjc3VtX2FkZChjc3VtX3N1Yihza2ItPmNzdW0sIChfX2ZvcmNlIF9fd3N1bSlmcm9tKSwKKwkJCQkgICAgIChfX2ZvcmNlIF9fd3N1bSl0byk7CiAJcmV0dXJuIDE7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwLmggYi9pbmNsdWRlL25ldC9pcC5oCmluZGV4IDk3NDJiOTIuLmJjNDNjMGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwLmgKKysrIGIvaW5jbHVkZS9uZXQvaXAuaApAQCAtMjE5LDYgKzIxOSwyOSBAQAogfQogI2VuZGlmCiAKKyNkZWZpbmUgc25tcF9nZXRfY3B1X2ZpZWxkNjRfYmF0Y2goYnVmZjY0LCBzdGF0c19saXN0LCBtaWJfc3RhdGlzdGljLCBvZmZzZXQpIFwKK3sgXAorCWludCBpLCBjOyBcCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGMpIHsgXAorCQlmb3IgKGkgPSAwOyBzdGF0c19saXN0W2ldLm5hbWU7IGkrKykgXAorCQkJYnVmZjY0W2ldICs9IHNubXBfZ2V0X2NwdV9maWVsZDY0KCBcCisJCQkJCW1pYl9zdGF0aXN0aWMsIFwKKwkJCQkJYywgc3RhdHNfbGlzdFtpXS5lbnRyeSwgXAorCQkJCQlvZmZzZXQpOyBcCisJfSBcCit9CisKKyNkZWZpbmUgc25tcF9nZXRfY3B1X2ZpZWxkX2JhdGNoKGJ1ZmYsIHN0YXRzX2xpc3QsIG1pYl9zdGF0aXN0aWMpIFwKK3sgXAorCWludCBpLCBjOyBcCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGMpIHsgXAorCQlmb3IgKGkgPSAwOyBzdGF0c19saXN0W2ldLm5hbWU7IGkrKykgXAorCQkJYnVmZltpXSArPSBzbm1wX2dldF9jcHVfZmllbGQoIFwKKwkJCQkJCW1pYl9zdGF0aXN0aWMsIFwKKwkJCQkJCWMsIHN0YXRzX2xpc3RbaV0uZW50cnkpOyBcCisJfSBcCit9CisKIHZvaWQgaW5ldF9nZXRfbG9jYWxfcG9ydF9yYW5nZShzdHJ1Y3QgbmV0ICpuZXQsIGludCAqbG93LCBpbnQgKmhpZ2gpOwogCiAjaWZkZWYgQ09ORklHX1NZU0NUTApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXA2X3JvdXRlLmggYi9pbmNsdWRlL25ldC9pcDZfcm91dGUuaAppbmRleCBkOTczMDVkLi5lMGNkMzE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcDZfcm91dGUuaAorKysgYi9pbmNsdWRlL25ldC9pcDZfcm91dGUuaApAQCAtNjQsNiArNjQsOSBAQAogfQogCiB2b2lkIGlwNl9yb3V0ZV9pbnB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0cnVjdCBkc3RfZW50cnkgKmlwNl9yb3V0ZV9pbnB1dF9sb29rdXAoc3RydWN0IG5ldCAqbmV0LAorCQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJIHN0cnVjdCBmbG93aTYgKmZsNiwgaW50IGZsYWdzKTsKIAogc3RydWN0IGRzdF9lbnRyeSAqaXA2X3JvdXRlX291dHB1dF9mbGFncyhzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBzb2NrICpzaywKIAkJCQkJIHN0cnVjdCBmbG93aTYgKmZsNiwgaW50IGZsYWdzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwNl90dW5uZWwuaCBiL2luY2x1ZGUvbmV0L2lwNl90dW5uZWwuaAppbmRleCA0M2E1YTBlLi4yMGVkOTY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcDZfdHVubmVsLmgKKysrIGIvaW5jbHVkZS9uZXQvaXA2X3R1bm5lbC5oCkBAIC0yMyw2ICsyMyw3IEBACiAJX191OCBwcm90bzsJCS8qIHR1bm5lbCBwcm90b2NvbCAqLwogCV9fdTggZW5jYXBfbGltaXQ7CS8qIGVuY2Fwc3VsYXRpb24gbGltaXQgZm9yIHR1bm5lbCAqLwogCV9fdTggaG9wX2xpbWl0OwkJLyogaG9wIGxpbWl0IGZvciB0dW5uZWwgKi8KKwlib29sIGNvbGxlY3RfbWQ7CiAJX19iZTMyIGZsb3dpbmZvOwkvKiB0cmFmZmljIGNsYXNzIGFuZCBmbG93bGFiZWwgZm9yIHR1bm5lbCAqLwogCV9fdTMyIGZsYWdzOwkJLyogdHVubmVsIGZsYWdzICovCiAJc3RydWN0IGluNl9hZGRyIGxhZGRyOwkvKiBsb2NhbCB0dW5uZWwgZW5kLXBvaW50IGFkZHJlc3MgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwX2ZpYi5oIGIvaW5jbHVkZS9uZXQvaXBfZmliLmgKaW5kZXggNDA3OWZjMS4uYjkzMTRiNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXBfZmliLmgKKysrIGIvaW5jbHVkZS9uZXQvaXBfZmliLmgKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxuZXQvZmliX3J1bGVzLmg+CiAjaW5jbHVkZSA8bmV0L2luZXRwZWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KIAogc3RydWN0IGZpYl9jb25maWcgewogCXU4CQkJZmNfZHN0X2xlbjsKQEAgLTExMSw2ICsxMTIsNyBAQAogCXVuc2lnbmVkIGNoYXIJCWZpYl9zY29wZTsKIAl1bnNpZ25lZCBjaGFyCQlmaWJfdHlwZTsKIAlfX2JlMzIJCQlmaWJfcHJlZnNyYzsKKwl1MzIJCQlmaWJfdGJfaWQ7CiAJdTMyCQkJZmliX3ByaW9yaXR5OwogCXUzMgkJCSpmaWJfbWV0cmljczsKICNkZWZpbmUgZmliX210dSBmaWJfbWV0cmljc1tSVEFYX01UVS0xXQpAQCAtMTIxLDYgKzEyMyw3IEBACiAjaWZkZWYgQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSAogCWludAkJCWZpYl93ZWlnaHQ7CiAjZW5kaWYKKwl1bnNpZ25lZCBpbnQJCWZpYl9vZmZsb2FkX2NudDsKIAlzdHJ1Y3QgcmN1X2hlYWQJCXJjdTsKIAlzdHJ1Y3QgZmliX25oCQlmaWJfbmhbMF07CiAjZGVmaW5lIGZpYl9kZXYJCWZpYl9uaFswXS5uaF9kZXYKQEAgLTE3Miw2ICsxNzUsMTggQEAKIAogX19iZTMyIGZpYl9pbmZvX3VwZGF0ZV9uaF9zYWRkcihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBmaWJfbmggKm5oKTsKIAorc3RhdGljIGlubGluZSB2b2lkIGZpYl9pbmZvX29mZmxvYWRfaW5jKHN0cnVjdCBmaWJfaW5mbyAqZmkpCit7CisJZmktPmZpYl9vZmZsb2FkX2NudCsrOworCWZpLT5maWJfZmxhZ3MgfD0gUlROSF9GX09GRkxPQUQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmaWJfaW5mb19vZmZsb2FkX2RlYyhzdHJ1Y3QgZmliX2luZm8gKmZpKQoreworCWlmICgtLWZpLT5maWJfb2ZmbG9hZF9jbnQgPT0gMCkKKwkJZmktPmZpYl9mbGFncyAmPSB+UlROSF9GX09GRkxPQUQ7Cit9CisKICNkZWZpbmUgRklCX1JFU19TQUREUihuZXQsIHJlcykJCQkJXAogCSgoRklCX1JFU19OSChyZXMpLm5oX3NhZGRyX2dlbmlkID09CQlcCiAJICBhdG9taWNfcmVhZCgmKG5ldCktPmlwdjQuZGV2X2FkZHJfZ2VuaWQpKSA/CVwKQEAgLTE4NCw2ICsxOTksMzMgQEAKICNkZWZpbmUgRklCX1JFU19QUkVGU1JDKG5ldCwgcmVzKQkoKHJlcykuZmktPmZpYl9wcmVmc3JjID8gOiBcCiAJCQkJCSBGSUJfUkVTX1NBRERSKG5ldCwgcmVzKSkKIAorc3RydWN0IGZpYl9ub3RpZmllcl9pbmZvIHsKKwlzdHJ1Y3QgbmV0ICpuZXQ7Cit9OworCitzdHJ1Y3QgZmliX2VudHJ5X25vdGlmaWVyX2luZm8geworCXN0cnVjdCBmaWJfbm90aWZpZXJfaW5mbyBpbmZvOyAvKiBtdXN0IGJlIGZpcnN0ICovCisJdTMyIGRzdDsKKwlpbnQgZHN0X2xlbjsKKwlzdHJ1Y3QgZmliX2luZm8gKmZpOworCXU4IHRvczsKKwl1OCB0eXBlOworCXUzMiB0Yl9pZDsKKwl1MzIgbmxmbGFnczsKK307CisKK2VudW0gZmliX2V2ZW50X3R5cGUgeworCUZJQl9FVkVOVF9FTlRSWV9BREQsCisJRklCX0VWRU5UX0VOVFJZX0RFTCwKKwlGSUJfRVZFTlRfUlVMRV9BREQsCisJRklCX0VWRU5UX1JVTEVfREVMLAorfTsKKworaW50IHJlZ2lzdGVyX2ZpYl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKK2ludCB1bnJlZ2lzdGVyX2ZpYl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKK2ludCBjYWxsX2ZpYl9ub3RpZmllcnMoc3RydWN0IG5ldCAqbmV0LCBlbnVtIGZpYl9ldmVudF90eXBlIGV2ZW50X3R5cGUsCisJCSAgICAgICBzdHJ1Y3QgZmliX25vdGlmaWVyX2luZm8gKmluZm8pOworCiBzdHJ1Y3QgZmliX3RhYmxlIHsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZQl0Yl9obGlzdDsKIAl1MzIJCQl0Yl9pZDsKQEAgLTE5NSwxMyArMjM3LDEyIEBACiAKIGludCBmaWJfdGFibGVfbG9va3VwKHN0cnVjdCBmaWJfdGFibGUgKnRiLCBjb25zdCBzdHJ1Y3QgZmxvd2k0ICpmbHAsCiAJCSAgICAgc3RydWN0IGZpYl9yZXN1bHQgKnJlcywgaW50IGZpYl9mbGFncyk7Ci1pbnQgZmliX3RhYmxlX2luc2VydChzdHJ1Y3QgZmliX3RhYmxlICosIHN0cnVjdCBmaWJfY29uZmlnICopOwotaW50IGZpYl90YWJsZV9kZWxldGUoc3RydWN0IGZpYl90YWJsZSAqLCBzdHJ1Y3QgZmliX2NvbmZpZyAqKTsKK2ludCBmaWJfdGFibGVfaW5zZXJ0KHN0cnVjdCBuZXQgKiwgc3RydWN0IGZpYl90YWJsZSAqLCBzdHJ1Y3QgZmliX2NvbmZpZyAqKTsKK2ludCBmaWJfdGFibGVfZGVsZXRlKHN0cnVjdCBuZXQgKiwgc3RydWN0IGZpYl90YWJsZSAqLCBzdHJ1Y3QgZmliX2NvbmZpZyAqKTsKIGludCBmaWJfdGFibGVfZHVtcChzdHJ1Y3QgZmliX3RhYmxlICp0YWJsZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKTsKLWludCBmaWJfdGFibGVfZmx1c2goc3RydWN0IGZpYl90YWJsZSAqdGFibGUpOworaW50IGZpYl90YWJsZV9mbHVzaChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBmaWJfdGFibGUgKnRhYmxlKTsKIHN0cnVjdCBmaWJfdGFibGUgKmZpYl90cmllX3VubWVyZ2Uoc3RydWN0IGZpYl90YWJsZSAqbWFpbl90Yik7Ci12b2lkIGZpYl90YWJsZV9mbHVzaF9leHRlcm5hbChzdHJ1Y3QgZmliX3RhYmxlICp0YWJsZSk7CiB2b2lkIGZpYl9mcmVlX3RhYmxlKHN0cnVjdCBmaWJfdGFibGUgKnRiKTsKIAogI2lmbmRlZiBDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTCkBAIC0zMTQsMTIgKzM1NSwxMSBAQAogfQogI2VuZGlmCiBpbnQgZmliX3VubWVyZ2Uoc3RydWN0IG5ldCAqbmV0KTsKLXZvaWQgZmliX2ZsdXNoX2V4dGVybmFsKHN0cnVjdCBuZXQgKm5ldCk7CiAKIC8qIEV4cG9ydGVkIGJ5IGZpYl9zZW1hbnRpY3MuYyAqLwogaW50IGlwX2ZpYl9jaGVja19kZWZhdWx0KF9fYmUzMiBndywgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBpbnQgZmliX3N5bmNfZG93bl9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBldmVudCwgYm9vbCBmb3JjZSk7Ci1pbnQgZmliX3N5bmNfZG93bl9hZGRyKHN0cnVjdCBuZXQgKm5ldCwgX19iZTMyIGxvY2FsKTsKK2ludCBmaWJfc3luY19kb3duX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX19iZTMyIGxvY2FsKTsKIGludCBmaWJfc3luY191cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgbmhfZmxhZ3MpOwogCiBleHRlcm4gdTMyIGZpYl9tdWx0aXBhdGhfc2VjcmV0IF9fcmVhZF9tb3N0bHk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcF90dW5uZWxzLmggYi9pbmNsdWRlL25ldC9pcF90dW5uZWxzLmgKaW5kZXggYTVlNzAzNS4uNTk1NTdjMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXBfdHVubmVscy5oCisrKyBiL2luY2x1ZGUvbmV0L2lwX3R1bm5lbHMuaApAQCAtMjIyLDYgKzIyMiwyNSBAQAogCXJldHVybiB0dW5faW5mby0+bW9kZSAmIElQX1RVTk5FTF9JTkZPX0lQVjYgPyBBRl9JTkVUNiA6IEFGX0lORVQ7CiB9CiAKK3N0YXRpYyBpbmxpbmUgX19iZTY0IGtleTMyX3RvX3R1bm5lbF9pZChfX2JlMzIga2V5KQoreworI2lmZGVmIF9fQklHX0VORElBTgorCXJldHVybiAoX19mb3JjZSBfX2JlNjQpa2V5OworI2Vsc2UKKwlyZXR1cm4gKF9fZm9yY2UgX19iZTY0KSgoX19mb3JjZSB1NjQpa2V5IDw8IDMyKTsKKyNlbmRpZgorfQorCisvKiBSZXR1cm5zIHRoZSBsZWFzdC1zaWduaWZpY2FudCAzMiBiaXRzIG9mIGEgX19iZTY0LiAqLworc3RhdGljIGlubGluZSBfX2JlMzIgdHVubmVsX2lkX3RvX2tleTMyKF9fYmU2NCB0dW5faWQpCit7CisjaWZkZWYgX19CSUdfRU5ESUFOCisJcmV0dXJuIChfX2ZvcmNlIF9fYmUzMil0dW5faWQ7CisjZWxzZQorCXJldHVybiAoX19mb3JjZSBfX2JlMzIpKChfX2ZvcmNlIHU2NCl0dW5faWQgPj4gMzIpOworI2VuZGlmCit9CisKICNpZmRlZiBDT05GSUdfSU5FVAogCiBpbnQgaXBfdHVubmVsX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CkBAIC0yMzYsNiArMjU1LDggQEAKIAogdm9pZCBpcF90dW5uZWxfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkgICAgY29uc3Qgc3RydWN0IGlwaGRyICp0bmxfcGFyYW1zLCBjb25zdCB1OCBwcm90b2NvbCk7Cit2b2lkIGlwX21kX3R1bm5lbF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBjb25zdCB1OCBwcm90byk7CiBpbnQgaXBfdHVubmVsX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpcF90dW5uZWxfcGFybSAqcCwgaW50IGNtZCk7CiBpbnQgX19pcF90dW5uZWxfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSwgYm9vbCBzdHJpY3QpOwogaW50IGlwX3R1bm5lbF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2tjbS5oIGIvaW5jbHVkZS9uZXQva2NtLmgKaW5kZXggMjg0MGI1OC4uMmE4OTY1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQva2NtLmgKKysrIGIvaW5jbHVkZS9uZXQva2NtLmgKQEAgLTEzLDYgKzEzLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3N0cnBhcnNlci5oPgogI2luY2x1ZGUgPHVhcGkvbGludXgva2NtLmg+CiAKIGV4dGVybiB1bnNpZ25lZCBpbnQga2NtX25ldF9pZDsKQEAgLTIxLDE2ICsyMiw4IEBACiAjZGVmaW5lIEtDTV9TVEFUU19JTkNSKHN0YXQpICgoc3RhdCkrKykKIAogc3RydWN0IGtjbV9wc29ja19zdGF0cyB7Ci0JdW5zaWduZWQgbG9uZyBsb25nIHJ4X21zZ3M7Ci0JdW5zaWduZWQgbG9uZyBsb25nIHJ4X2J5dGVzOwogCXVuc2lnbmVkIGxvbmcgbG9uZyB0eF9tc2dzOwogCXVuc2lnbmVkIGxvbmcgbG9uZyB0eF9ieXRlczsKLQl1bnNpZ25lZCBpbnQgcnhfYWJvcnRzOwotCXVuc2lnbmVkIGludCByeF9tZW1fZmFpbDsKLQl1bnNpZ25lZCBpbnQgcnhfbmVlZF9tb3JlX2hkcjsKLQl1bnNpZ25lZCBpbnQgcnhfbXNnX3Rvb19iaWc7Ci0JdW5zaWduZWQgaW50IHJ4X21zZ190aW1lb3V0czsKLQl1bnNpZ25lZCBpbnQgcnhfYmFkX2hkcl9sZW47CiAJdW5zaWduZWQgbG9uZyBsb25nIHJlc2VydmVkOwogCXVuc2lnbmVkIGxvbmcgbG9uZyB1bnJlc2VydmVkOwogCXVuc2lnbmVkIGludCB0eF9hYm9ydHM7CkBAIC02NCwxMyArNTcsNiBAQAogCXN0cnVjdCBza19idWZmICpsYXN0X3NrYjsKIH07CiAKLXN0cnVjdCBrY21fcnhfbXNnIHsKLQlpbnQgZnVsbF9sZW47Ci0JaW50IGFjY3VtX2xlbjsKLQlpbnQgb2Zmc2V0OwotCWludCBlYXJseV9lYXRlbjsKLX07Ci0KIC8qIFNvY2tldCBzdHJ1Y3R1cmUgZm9yIEtDTSBjbGllbnQgc29ja2V0cyAqLwogc3RydWN0IGtjbV9zb2NrIHsKIAlzdHJ1Y3Qgc29jayBzazsKQEAgLTg3LDYgKzczLDcgQEAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHhfd29yazsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHdhaXRfcHNvY2tfbGlzdDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2VxX3NrYjsKKwl1MzIgdHhfc3RvcHBlZCA6IDE7CiAKIAkvKiBEb24ndCB1c2UgYml0IGZpZWxkcyBoZXJlLCB0aGVzZSBhcmUgc2V0IHVuZGVyIGRpZmZlcmVudCBsb2NrcyAqLwogCWJvb2wgdHhfd2FpdDsKQEAgLTEwNCwxMSArOTEsMTEgQEAKIC8qIFN0cnVjdHVyZSBmb3IgYW4gYXR0YWNoZWQgbG93ZXIgc29ja2V0ICovCiBzdHJ1Y3Qga2NtX3Bzb2NrIHsKIAlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IHN0cnBhcnNlciBzdHJwOwogCXN0cnVjdCBrY21fbXV4ICptdXg7CiAJaW50IGluZGV4OwogCiAJdTMyIHR4X3N0b3BwZWQgOiAxOwotCXUzMiByeF9zdG9wcGVkIDogMTsKIAl1MzIgZG9uZSA6IDE7CiAJdTMyIHVuYXR0YWNoaW5nIDogMTsKIApAQCAtMTIxLDE4ICsxMDgsMTIgQEAKIAlzdHJ1Y3Qga2NtX3Bzb2NrX3N0YXRzIHN0YXRzOwogCiAJLyogUmVjZWl2ZSAqLwotCXN0cnVjdCBza19idWZmICpyeF9za2JfaGVhZDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqKnJ4X3NrYl9uZXh0cDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcmVhZHlfcnhfbXNnOwogCXN0cnVjdCBsaXN0X2hlYWQgcHNvY2tfcmVhZHlfbGlzdDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgcnhfd29yazsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIHJ4X2RlbGF5ZWRfd29yazsKIAlzdHJ1Y3QgYnBmX3Byb2cgKmJwZl9wcm9nOwogCXN0cnVjdCBrY21fc29jayAqcnhfa2NtOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBzYXZlZF9yeF9ieXRlczsKIAl1bnNpZ25lZCBsb25nIGxvbmcgc2F2ZWRfcnhfbXNnczsKLQlzdHJ1Y3QgdGltZXJfbGlzdCByeF9tc2dfdGltZXI7Ci0JdW5zaWduZWQgaW50IHJ4X25lZWRfYnl0ZXM7CisJc3RydWN0IHNrX2J1ZmYgKnJlYWR5X3J4X21zZzsKIAogCS8qIFRyYW5zbWl0ICovCiAJc3RydWN0IGtjbV9zb2NrICp0eF9rY207CkBAIC0xNDYsNiArMTI3LDcgQEAKIAlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CiAJc3RydWN0IGtjbV9wc29ja19zdGF0cyBhZ2dyZWdhdGVfcHNvY2tfc3RhdHM7CiAJc3RydWN0IGtjbV9tdXhfc3RhdHMgYWdncmVnYXRlX211eF9zdGF0czsKKwlzdHJ1Y3Qgc3RycF9hZ2dyX3N0YXRzIGFnZ3JlZ2F0ZV9zdHJwX3N0YXRzOwogCXN0cnVjdCBsaXN0X2hlYWQgbXV4X2xpc3Q7CiAJaW50IGNvdW50OwogfTsKQEAgLTE2Myw2ICsxNDUsNyBAQAogCiAJc3RydWN0IGtjbV9tdXhfc3RhdHMgc3RhdHM7CiAJc3RydWN0IGtjbV9wc29ja19zdGF0cyBhZ2dyZWdhdGVfcHNvY2tfc3RhdHM7CisJc3RydWN0IHN0cnBfYWdncl9zdGF0cyBhZ2dyZWdhdGVfc3RycF9zdGF0czsKIAogCS8qIFJlY2VpdmUgKi8KIAlzcGlubG9ja190IHJ4X2xvY2sgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKQEAgLTE5MCwxNCArMTczLDYgQEAKIAkvKiBTYXZlIHBzb2NrIHN0YXRpc3RpY3MgaW4gdGhlIG11eCB3aGVuIHBzb2NrIGlzIGJlaW5nIHVuYXR0YWNoZWQuICovCiAKICNkZWZpbmUgU0FWRV9QU09DS19TVEFUUyhfc3RhdCkgKGFnZ19zdGF0cy0+X3N0YXQgKz0gc3RhdHMtPl9zdGF0KQotCVNBVkVfUFNPQ0tfU1RBVFMocnhfbXNncyk7Ci0JU0FWRV9QU09DS19TVEFUUyhyeF9ieXRlcyk7Ci0JU0FWRV9QU09DS19TVEFUUyhyeF9hYm9ydHMpOwotCVNBVkVfUFNPQ0tfU1RBVFMocnhfbWVtX2ZhaWwpOwotCVNBVkVfUFNPQ0tfU1RBVFMocnhfbmVlZF9tb3JlX2hkcik7Ci0JU0FWRV9QU09DS19TVEFUUyhyeF9tc2dfdG9vX2JpZyk7Ci0JU0FWRV9QU09DS19TVEFUUyhyeF9tc2dfdGltZW91dHMpOwotCVNBVkVfUFNPQ0tfU1RBVFMocnhfYmFkX2hkcl9sZW4pOwogCVNBVkVfUFNPQ0tfU1RBVFModHhfbXNncyk7CiAJU0FWRV9QU09DS19TVEFUUyh0eF9ieXRlcyk7CiAJU0FWRV9QU09DS19TVEFUUyhyZXNlcnZlZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9sM21kZXYuaCBiL2luY2x1ZGUvbmV0L2wzbWRldi5oCmluZGV4IGU5MDA5NTAuLmIyMjBkYWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2wzbWRldi5oCisrKyBiL2luY2x1ZGUvbmV0L2wzbWRldi5oCkBAIC0xMSw2ICsxMSw3IEBACiAjaWZuZGVmIF9ORVRfTDNNREVWX0hfCiAjZGVmaW5lIF9ORVRfTDNNREVWX0hfCiAKKyNpbmNsdWRlIDxuZXQvZHN0Lmg+CiAjaW5jbHVkZSA8bmV0L2ZpYl9ydWxlcy5oPgogCiAvKioKQEAgLTE4LDMwICsxOSwyNCBAQAogICoKICAqIEBsM21kZXZfZmliX3RhYmxlOiBHZXQgRklCIHRhYmxlIGlkIHRvIHVzZSBmb3IgbG9va3VwcwogICoKLSAqIEBsM21kZXZfZ2V0X3J0YWJsZTogR2V0IGNhY2hlZCBJUHY0IHJ0YWJsZSAoZHN0X2VudHJ5KSBmb3IgZGV2aWNlCisgKiBAbDNtZGV2X2wzX3JjdjogICAgSG9vayBpbiBMMyByZWNlaXZlIHBhdGgKICAqCi0gKiBAbDNtZGV2X2dldF9zYWRkcjogR2V0IHNvdXJjZSBhZGRyZXNzIGZvciBhIGZsb3cKKyAqIEBsM21kZXZfbDNfb3V0OiAgICBIb29rIGluIEwzIG91dHB1dCBwYXRoCiAgKgotICogQGwzbWRldl9nZXRfcnQ2X2RzdDogR2V0IGNhY2hlZCBJUHY2IHJ0Nl9pbmZvIChkc3RfZW50cnkpIGZvciBkZXZpY2UKKyAqIEBsM21kZXZfbGlua19zY29wZV9sb29rdXA6IElQdjYgbG9va3VwIGZvciBsaW5rbG9jYWwgYW5kIG1jYXN0IGRlc3RpbmF0aW9ucwogICovCiAKIHN0cnVjdCBsM21kZXZfb3BzIHsKIAl1MzIJCSgqbDNtZGV2X2ZpYl90YWJsZSkoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAJc3RydWN0IHNrX2J1ZmYgKiAoKmwzbWRldl9sM19yY3YpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IHByb3RvKTsKLQotCS8qIElQdjQgb3BzICovCi0Jc3RydWN0IHJ0YWJsZSAqCSgqbDNtZGV2X2dldF9ydGFibGUpKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCSAgICAgY29uc3Qgc3RydWN0IGZsb3dpNCAqZmw0KTsKLQlpbnQJCSgqbDNtZGV2X2dldF9zYWRkcikoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJICAgIHN0cnVjdCBmbG93aTQgKmZsNCk7CisJc3RydWN0IHNrX2J1ZmYgKiAoKmwzbWRldl9sM19vdXQpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgIHUxNiBwcm90byk7CiAKIAkvKiBJUHY2IG9wcyAqLwotCXN0cnVjdCBkc3RfZW50cnkgKiAoKmwzbWRldl9nZXRfcnQ2X2RzdCkoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZHN0X2VudHJ5ICogKCpsM21kZXZfbGlua19zY29wZV9sb29rdXApKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCQkgc3RydWN0IGZsb3dpNiAqZmw2KTsKLQlpbnQJCSAgICgqbDNtZGV2X2dldF9zYWRkcjYpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCQljb25zdCBzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJCQlzdHJ1Y3QgZmxvd2k2ICpmbDYpOwogfTsKIAogI2lmZGVmIENPTkZJR19ORVRfTDNfTUFTVEVSX0RFVgpAQCAtNDksNiArNDQsOCBAQAogaW50IGwzbWRldl9maWJfcnVsZV9tYXRjaChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBmbG93aSAqZmwsCiAJCQkgIHN0cnVjdCBmaWJfbG9va3VwX2FyZyAqYXJnKTsKIAordm9pZCBsM21kZXZfdXBkYXRlX2Zsb3coc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgZmxvd2kgKmZsKTsKKwogaW50IGwzbWRldl9tYXN0ZXJfaWZpbmRleF9yY3UoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW5saW5lIGludCBsM21kZXZfbWFzdGVyX2lmaW5kZXgoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKQEAgLTgwLDcgKzc3LDcgQEAKIH0KIAogc3RhdGljIGlubGluZQotY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmwzbWRldl9tYXN0ZXJfZGV2X3JjdShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqX2RldikKK3N0cnVjdCBuZXRfZGV2aWNlICpsM21kZXZfbWFzdGVyX2Rldl9yY3UoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKl9kZXYpCiB7CiAJLyogbmV0ZGV2X21hc3Rlcl91cHBlcl9kZXZfZ2V0X3JjdSBjYWxscwogCSAqIGxpc3RfZmlyc3Rfb3JfbnVsbF9yY3UgdG8gd2FsayB0aGUgdXBwZXIgZGV2IGxpc3QuCkBAIC04OSw3ICs4Niw3IEBACiAJICogdHlwZWNhc3QgdG8gcmVtb3ZlIHRoZSBjb25zdAogCSAqLwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilfZGV2OwotCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICptYXN0ZXI7CisJc3RydWN0IG5ldF9kZXZpY2UgKm1hc3RlcjsKIAogCWlmICghZGV2KQogCQlyZXR1cm4gTlVMTDsKQEAgLTEwNCwyNiArMTAxLDYgQEAKIAlyZXR1cm4gbWFzdGVyOwogfQogCi0vKiBnZXQgaW5kZXggb2YgYW4gaW50ZXJmYWNlIHRvIHVzZSBmb3IgRklCIGxvb2t1cHMuIEZvciBkZXZpY2VzCi0gKiBlbnNsYXZlZCB0byBhbiBMMyBtYXN0ZXIgZGV2aWNlIEZJQiBsb29rdXBzIGFyZSBiYXNlZCBvbiB0aGUKLSAqIG1hc3RlciBpbmRleAotICovCi1zdGF0aWMgaW5saW5lIGludCBsM21kZXZfZmliX29pZl9yY3Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gbDNtZGV2X21hc3Rlcl9pZmluZGV4X3JjdShkZXYpID8gOiBkZXYtPmlmaW5kZXg7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGwzbWRldl9maWJfb2lmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JaW50IG9pZjsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQlvaWYgPSBsM21kZXZfZmliX29pZl9yY3UoZGV2KTsKLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCXJldHVybiBvaWY7Ci19Ci0KIHUzMiBsM21kZXZfZmliX3RhYmxlX3JjdShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHUzMiBsM21kZXZfZmliX3RhYmxlX2J5X2luZGV4KHN0cnVjdCBuZXQgKm5ldCwgaW50IGlmaW5kZXgpOwogc3RhdGljIGlubGluZSB1MzIgbDNtZGV2X2ZpYl90YWJsZShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMTM3LDM5ICsxMTQsNyBAQAogCXJldHVybiB0Yl9pZDsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgcnRhYmxlICpsM21kZXZfZ2V0X3J0YWJsZShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkgICAgICAgY29uc3Qgc3RydWN0IGZsb3dpNCAqZmw0KQotewotCWlmIChuZXRpZl9pc19sM19tYXN0ZXIoZGV2KSAmJiBkZXYtPmwzbWRldl9vcHMtPmwzbWRldl9nZXRfcnRhYmxlKQotCQlyZXR1cm4gZGV2LT5sM21kZXZfb3BzLT5sM21kZXZfZ2V0X3J0YWJsZShkZXYsIGZsNCk7Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGlubGluZSBib29sIG5ldGlmX2luZGV4X2lzX2wzX21hc3RlcihzdHJ1Y3QgbmV0ICpuZXQsIGludCBpZmluZGV4KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0JYm9vbCByYyA9IGZhbHNlOwotCi0JaWYgKGlmaW5kZXggPT0gMCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCi0JZGV2ID0gZGV2X2dldF9ieV9pbmRleF9yY3UobmV0LCBpZmluZGV4KTsKLQlpZiAoZGV2KQotCQlyYyA9IG5ldGlmX2lzX2wzX21hc3RlcihkZXYpOwotCi0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLWludCBsM21kZXZfZ2V0X3NhZGRyKHN0cnVjdCBuZXQgKm5ldCwgaW50IGlmaW5kZXgsIHN0cnVjdCBmbG93aTQgKmZsNCk7Ci0KLXN0cnVjdCBkc3RfZW50cnkgKmwzbWRldl9nZXRfcnQ2X2RzdChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBmbG93aTYgKmZsNik7Ci1pbnQgbDNtZGV2X2dldF9zYWRkcjYoc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3Qgc29jayAqc2ssCi0JCSAgICAgIHN0cnVjdCBmbG93aTYgKmZsNik7CitzdHJ1Y3QgZHN0X2VudHJ5ICpsM21kZXZfbGlua19zY29wZV9sb29rdXAoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgZmxvd2k2ICpmbDYpOwogCiBzdGF0aWMgaW5saW5lCiBzdHJ1Y3Qgc2tfYnVmZiAqbDNtZGV2X2wzX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MTYgcHJvdG8pCkBAIC0xOTksNiArMTQ0LDM0IEBACiAJcmV0dXJuIGwzbWRldl9sM19yY3Yoc2tiLCBBRl9JTkVUNik7CiB9CiAKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBza19idWZmICpsM21kZXZfbDNfb3V0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IHByb3RvKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2JfZHN0KHNrYiktPmRldjsKKworCWlmIChuZXRpZl9pc19sM19zbGF2ZShkZXYpKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICptYXN0ZXI7CisKKwkJbWFzdGVyID0gbmV0ZGV2X21hc3Rlcl91cHBlcl9kZXZfZ2V0X3JjdShkZXYpOworCQlpZiAobWFzdGVyICYmIG1hc3Rlci0+bDNtZGV2X29wcy0+bDNtZGV2X2wzX291dCkKKwkJCXNrYiA9IG1hc3Rlci0+bDNtZGV2X29wcy0+bDNtZGV2X2wzX291dChtYXN0ZXIsIHNrLAorCQkJCQkJCQlza2IsIHByb3RvKTsKKwl9CisKKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgaW5saW5lCitzdHJ1Y3Qgc2tfYnVmZiAqbDNtZGV2X2lwX291dChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIGwzbWRldl9sM19vdXQoc2ssIHNrYiwgQUZfSU5FVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBza19idWZmICpsM21kZXZfaXA2X291dChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIGwzbWRldl9sM19vdXQoc2ssIHNrYiwgQUZfSU5FVDYpOworfQogI2Vsc2UKIAogc3RhdGljIGlubGluZSBpbnQgbDNtZGV2X21hc3Rlcl9pZmluZGV4X3JjdShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMjE2LDIwICsxODksMTEgQEAKIH0KIAogc3RhdGljIGlubGluZQotY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmwzbWRldl9tYXN0ZXJfZGV2X3JjdShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RydWN0IG5ldF9kZXZpY2UgKmwzbWRldl9tYXN0ZXJfZGV2X3JjdShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBsM21kZXZfZmliX29pZl9yY3Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gZGV2ID8gZGV2LT5pZmluZGV4IDogMDsKLX0KLXN0YXRpYyBpbmxpbmUgaW50IGwzbWRldl9maWJfb2lmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIGRldiA/IGRldi0+aWZpbmRleCA6IDA7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdTMyIGwzbWRldl9maWJfdGFibGVfcmN1KGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJcmV0dXJuIDA7CkBAIC0yNDMsMzUgKzIwNywxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBydGFibGUgKmwzbWRldl9nZXRfcnRhYmxlKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZmxvd2k0ICpmbDQpCi17Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBuZXRpZl9pbmRleF9pc19sM19tYXN0ZXIoc3RydWN0IG5ldCAqbmV0LCBpbnQgaWZpbmRleCkKLXsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGwzbWRldl9nZXRfc2FkZHIoc3RydWN0IG5ldCAqbmV0LCBpbnQgaWZpbmRleCwKLQkJCQkgICBzdHJ1Y3QgZmxvd2k0ICpmbDQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbmxpbmUKLXN0cnVjdCBkc3RfZW50cnkgKmwzbWRldl9nZXRfcnQ2X2RzdChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBmbG93aTYgKmZsNikKK3N0cnVjdCBkc3RfZW50cnkgKmwzbWRldl9saW5rX3Njb3BlX2xvb2t1cChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBmbG93aTYgKmZsNikKIHsKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgbDNtZGV2X2dldF9zYWRkcjYoc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJICAgIHN0cnVjdCBmbG93aTYgKmZsNikKLXsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGlubGluZQogc3RydWN0IHNrX2J1ZmYgKmwzbWRldl9pcF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKQEAgLTI4NSwxMSArMjI2LDI3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUKK3N0cnVjdCBza19idWZmICpsM21kZXZfaXBfb3V0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgaW5saW5lCitzdHJ1Y3Qgc2tfYnVmZiAqbDNtZGV2X2lwNl9vdXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyBpbmxpbmUKIGludCBsM21kZXZfZmliX3J1bGVfbWF0Y2goc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgZmxvd2kgKmZsLAogCQkJICBzdHJ1Y3QgZmliX2xvb2t1cF9hcmcgKmFyZykKIHsKIAlyZXR1cm4gMTsKIH0KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgbDNtZGV2X3VwZGF0ZV9mbG93KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IGZsb3dpICpmbCkKK3sKK30KICNlbmRpZgogCiAjZW5kaWYgLyogX05FVF9MM01ERVZfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2x3dHVubmVsLmggYi9pbmNsdWRlL25ldC9sd3R1bm5lbC5oCmluZGV4IGU5ZjExNmUuLmVhM2Y4MGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2x3dHVubmVsLmgKKysrIGIvaW5jbHVkZS9uZXQvbHd0dW5uZWwuaApAQCAtMTMsNiArMTMsMTMgQEAKIC8qIGx3IHR1bm5lbCBzdGF0ZSBmbGFncyAqLwogI2RlZmluZSBMV1RVTk5FTF9TVEFURV9PVVRQVVRfUkVESVJFQ1QJQklUKDApCiAjZGVmaW5lIExXVFVOTkVMX1NUQVRFX0lOUFVUX1JFRElSRUNUCUJJVCgxKQorI2RlZmluZSBMV1RVTk5FTF9TVEFURV9YTUlUX1JFRElSRUNUCUJJVCgyKQorCitlbnVtIHsKKwlMV1RVTk5FTF9YTUlUX0RPTkUsCisJTFdUVU5ORUxfWE1JVF9DT05USU5VRSwKK307CisKIAogc3RydWN0IGx3dHVubmVsX3N0YXRlIHsKIAlfX3UxNgkJdHlwZTsKQEAgLTIxLDYgKzI4LDcgQEAKIAlpbnQJCSgqb3JpZ19vdXRwdXQpKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAlpbnQJCSgqb3JpZ19pbnB1dCkoc3RydWN0IHNrX2J1ZmYgKik7CiAJaW50ICAgICAgICAgICAgIGxlbjsKKwlfX3UxNgkJaGVhZHJvb207CiAJX191OCAgICAgICAgICAgIGRhdGFbMF07CiB9OwogCkBAIC0zNCw2ICs0Miw3IEBACiAJCQkgIHN0cnVjdCBsd3R1bm5lbF9zdGF0ZSAqbHd0c3RhdGUpOwogCWludCAoKmdldF9lbmNhcF9zaXplKShzdHJ1Y3QgbHd0dW5uZWxfc3RhdGUgKmx3dHN0YXRlKTsKIAlpbnQgKCpjbXBfZW5jYXApKHN0cnVjdCBsd3R1bm5lbF9zdGF0ZSAqYSwgc3RydWN0IGx3dHVubmVsX3N0YXRlICpiKTsKKwlpbnQgKCp4bWl0KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIH07CiAKICNpZmRlZiBDT05GSUdfTFdUVU5ORUwKQEAgLTc1LDYgKzg0LDI0IEBACiAKIAlyZXR1cm4gZmFsc2U7CiB9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBsd3R1bm5lbF94bWl0X3JlZGlyZWN0KHN0cnVjdCBsd3R1bm5lbF9zdGF0ZSAqbHd0c3RhdGUpCit7CisJaWYgKGx3dHN0YXRlICYmIChsd3RzdGF0ZS0+ZmxhZ3MgJiBMV1RVTk5FTF9TVEFURV9YTUlUX1JFRElSRUNUKSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGx3dHVubmVsX2hlYWRyb29tKHN0cnVjdCBsd3R1bm5lbF9zdGF0ZSAqbHd0c3RhdGUsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IG10dSkKK3sKKwlpZiAobHd0dW5uZWxfeG1pdF9yZWRpcmVjdChsd3RzdGF0ZSkgJiYgbHd0c3RhdGUtPmhlYWRyb29tIDwgbXR1KQorCQlyZXR1cm4gbHd0c3RhdGUtPmhlYWRyb29tOworCisJcmV0dXJuIDA7Cit9CisKIGludCBsd3R1bm5lbF9lbmNhcF9hZGRfb3BzKGNvbnN0IHN0cnVjdCBsd3R1bm5lbF9lbmNhcF9vcHMgKm9wLAogCQkJICAgdW5zaWduZWQgaW50IG51bSk7CiBpbnQgbHd0dW5uZWxfZW5jYXBfZGVsX29wcyhjb25zdCBzdHJ1Y3QgbHd0dW5uZWxfZW5jYXBfb3BzICpvcCwKQEAgLTkwLDYgKzExNyw3IEBACiBpbnQgbHd0dW5uZWxfY21wX2VuY2FwKHN0cnVjdCBsd3R1bm5lbF9zdGF0ZSAqYSwgc3RydWN0IGx3dHVubmVsX3N0YXRlICpiKTsKIGludCBsd3R1bm5lbF9vdXRwdXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpOwogaW50IGx3dHVubmVsX2lucHV0KHN0cnVjdCBza19idWZmICpza2IpOworaW50IGx3dHVubmVsX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKICNlbHNlCiAKQEAgLTExNyw2ICsxNDUsMTcgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBsd3R1bm5lbF94bWl0X3JlZGlyZWN0KHN0cnVjdCBsd3R1bm5lbF9zdGF0ZSAqbHd0c3RhdGUpCit7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBsd3R1bm5lbF9oZWFkcm9vbShzdHJ1Y3QgbHd0dW5uZWxfc3RhdGUgKmx3dHN0YXRlLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBtdHUpCit7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGx3dHVubmVsX2VuY2FwX2FkZF9vcHMoY29uc3Qgc3RydWN0IGx3dHVubmVsX2VuY2FwX29wcyAqb3AsCiAJCQkJCSB1bnNpZ25lZCBpbnQgbnVtKQogewpAQCAtMTcwLDYgKzIwOSwxMSBAQAogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgbHd0dW5uZWxfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKwogI2VuZGlmIC8qIENPTkZJR19MV1RVTk5FTCAqLwogCiAjZGVmaW5lIE1PRFVMRV9BTElBU19SVE5MX0xXVChlbmNhcF90eXBlKSBNT0RVTEVfQUxJQVMoInJ0bmwtbHd0LSIgX19zdHJpbmdpZnkoZW5jYXBfdHlwZSkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9tYWM4MDIxMS5oIGIvaW5jbHVkZS9uZXQvbWFjODAyMTEuaAppbmRleCBiNGZhYWRiLi5hODEwZGZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9tYWM4MDIxMS5oCisrKyBiL2luY2x1ZGUvbmV0L21hYzgwMjExLmgKQEAgLTcxNSw2ICs3MTUsNyBAQAogICoJZnJhbWUgKFBTLVBvbGwgb3IgdUFQU0QpLgogICogQElFRUU4MDIxMV9UWF9DVFJMX1JBVEVfSU5KRUNUOiBUaGlzIGZyYW1lIGlzIGluamVjdGVkIHdpdGggcmF0ZSBpbmZvcm1hdGlvbgogICogQElFRUU4MDIxMV9UWF9DVFJMX0FNU0RVOiBUaGlzIGZyYW1lIGlzIGFuIEEtTVNEVSBmcmFtZQorICogQElFRUU4MDIxMV9UWF9DVFJMX0ZBU1RfWE1JVDogVGhpcyBmcmFtZSBpcyBnb2luZyB0aHJvdWdoIHRoZSBmYXN0X3htaXQgcGF0aAogICoKICAqIFRoZXNlIGZsYWdzIGFyZSB1c2VkIGluIHR4X2luZm8tPmNvbnRyb2wuZmxhZ3MuCiAgKi8KQEAgLTcyMyw2ICs3MjQsNyBAQAogCUlFRUU4MDIxMV9UWF9DVFJMX1BTX1JFU1BPTlNFCQk9IEJJVCgxKSwKIAlJRUVFODAyMTFfVFhfQ1RSTF9SQVRFX0lOSkVDVAkJPSBCSVQoMiksCiAJSUVFRTgwMjExX1RYX0NUUkxfQU1TRFUJCQk9IEJJVCgzKSwKKwlJRUVFODAyMTFfVFhfQ1RSTF9GQVNUX1hNSVQJCT0gQklUKDQpLAogfTsKIAogLyoKQEAgLTE3MzUsNiArMTczNyw5IEBACiAgKiBAc3VwcF9yYXRlczogQml0bWFwIG9mIHN1cHBvcnRlZCByYXRlcyAocGVyIGJhbmQpCiAgKiBAaHRfY2FwOiBIVCBjYXBhYmlsaXRpZXMgb2YgdGhpcyBTVEE7IHJlc3RyaWN0ZWQgdG8gb3VyIG93biBjYXBhYmlsaXRpZXMKICAqIEB2aHRfY2FwOiBWSFQgY2FwYWJpbGl0aWVzIG9mIHRoaXMgU1RBOyByZXN0cmljdGVkIHRvIG91ciBvd24gY2FwYWJpbGl0aWVzCisgKiBAbWF4X3J4X2FnZ3JlZ2F0aW9uX3N1YmZyYW1lczogbWF4aW1hbCBhbW91bnQgb2YgZnJhbWVzIGluIGEgc2luZ2xlIEFNUERVCisgKgl0aGF0IHRoaXMgc3RhdGlvbiBpcyBhbGxvd2VkIHRvIHRyYW5zbWl0IHRvIHVzLgorICoJQ2FuIGJlIG1vZGlmaWVkIGJ5IGRyaXZlci4KICAqIEB3bWU6IGluZGljYXRlcyB3aGV0aGVyIHRoZSBTVEEgc3VwcG9ydHMgUW9TL1dNRSAoaWYgbG9jYWwgZGV2aWNlcyBkb2VzLAogICoJb3RoZXJ3aXNlIGFsd2F5cyBmYWxzZSkKICAqIEBkcnZfcHJpdjogZGF0YSBhcmVhIGZvciBkcml2ZXIgdXNlLCB3aWxsIGFsd2F5cyBiZSBhbGlnbmVkIHRvCkBAIC0xNzc1LDYgKzE3ODAsNyBAQAogCXUxNiBhaWQ7CiAJc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwIGh0X2NhcDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N0YV92aHRfY2FwIHZodF9jYXA7CisJdTggbWF4X3J4X2FnZ3JlZ2F0aW9uX3N1YmZyYW1lczsKIAlib29sIHdtZTsKIAl1OCB1YXBzZF9xdWV1ZXM7CiAJdTggbWF4X3NwOwpAQCAtMjAxNCw2ICsyMDIwLDExIEBACiAgKiBASUVFRTgwMjExX0hXX1RYX0ZSQUdfTElTVDogSGFyZHdhcmUgKG9yIGRyaXZlcikgc3VwcG9ydHMgc2VuZGluZyBmcmFnX2xpc3QKICAqCXNrYnMsIG5lZWRlZCBmb3IgemVyby1jb3B5IHNvZnR3YXJlIEEtTVNEVS4KICAqCisgKiBASUVFRTgwMjExX0hXX1JFUE9SVFNfTE9XX0FDSzogVGhlIGRyaXZlciAob3IgZmlybXdhcmUpIHJlcG9ydHMgbG93IGFjayBldmVudAorICoJYnkgaWVlZTgwMjExX3JlcG9ydF9sb3dfYWNrKCkgYmFzZWQgb24gaXRzIG93biBhbGdvcml0aG0uIEZvciBzdWNoCisgKglkcml2ZXJzLCBtYWM4MDIxMSBwYWNrZXQgbG9zcyBtZWNoYW5pc20gd2lsbCBub3QgYmUgdHJpZ2dlcmVkIGFuZCBkcml2ZXIKKyAqCWlzIGNvbXBsZXRlbHkgZGVwZW5kaW5nIG9uIGZpcm13YXJlIGV2ZW50IGZvciBzdGF0aW9uIGtpY2tvdXQuCisgKgogICogQE5VTV9JRUVFODAyMTFfSFdfRkxBR1M6IG51bWJlciBvZiBoYXJkd2FyZSBmbGFncywgdXNlZCBmb3Igc2l6aW5nIGFycmF5cwogICovCiBlbnVtIGllZWU4MDIxMV9od19mbGFncyB7CkBAIC0yMDU0LDYgKzIwNjUsNyBAQAogCUlFRUU4MDIxMV9IV19VU0VTX1JTUywKIAlJRUVFODAyMTFfSFdfVFhfQU1TRFUsCiAJSUVFRTgwMjExX0hXX1RYX0ZSQUdfTElTVCwKKwlJRUVFODAyMTFfSFdfUkVQT1JUU19MT1dfQUNLLAogCiAJLyoga2VlcCBsYXN0LCBvYnZpb3VzbHkgKi8KIAlOVU1fSUVFRTgwMjExX0hXX0ZMQUdTCkBAIC0yMTQxLDYgKzIxNTMsMTQgQEAKICAqCXRoZSBkZWZhdWx0IGlzIF9HSSB8IF9CQU5EV0lEVEguCiAgKglVc2UgdGhlICVJRUVFODAyMTFfUkFESU9UQVBfVkhUX0tOT1dOXyogdmFsdWVzLgogICoKKyAqIEByYWRpb3RhcF90aW1lc3RhbXA6IEluZm9ybWF0aW9uIGZvciB0aGUgcmFkaW90YXAgdGltZXN0YW1wIGZpZWxkOyBpZiB0aGUKKyAqCSd1bml0c19wb3MnIG1lbWJlciBpcyBzZXQgdG8gYSBub24tbmVnYXRpdmUgdmFsdWUgaXQgbXVzdCBiZSBzZXQgdG8KKyAqCWEgY29tYmluYXRpb24gb2YgYSBJRUVFODAyMTFfUkFESU9UQVBfVElNRVNUQU1QX1VOSVRfKiBhbmQgYQorICoJSUVFRTgwMjExX1JBRElPVEFQX1RJTUVTVEFNUF9TUE9TXyogdmFsdWUsIGFuZCB0aGVuIHRoZSB0aW1lc3RhbXAKKyAqCWZpZWxkIHdpbGwgYmUgYWRkZWQgYW5kIHBvcHVsYXRlZCBmcm9tIHRoZSAmc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMKKyAqCWRldmljZV90aW1lc3RhbXAuIElmIHRoZSAnYWNjdXJhY3knIG1lbWJlciBpcyBub24tbmVnYXRpdmUsIGl0J3MgcHV0CisgKglpbnRvIHRoZSBhY2N1cmFjeSByYWRpb3RhcCBmaWVsZCBhbmQgdGhlIGFjY3VyYWN5IGtub3duIGZsYWcgaXMgc2V0LgorICoKICAqIEBuZXRkZXZfZmVhdHVyZXM6IG5ldGRldiBmZWF0dXJlcyB0byBiZSBzZXQgaW4gZWFjaCBuZXRkZXYgY3JlYXRlZAogICoJZnJvbSB0aGlzIEhXLiBOb3RlIHRoYXQgbm90IGFsbCBmZWF0dXJlcyBhcmUgdXNhYmxlIHdpdGggbWFjODAyMTEsCiAgKglvdGhlciBmZWF0dXJlcyB3aWxsIGJlIHJlamVjdGVkIGR1cmluZyBIVyByZWdpc3RyYXRpb24uCkBAIC0yMTU5LDYgKzIxNzksOCBAQAogICogQG5fY2lwaGVyX3NjaGVtZXM6IGEgc2l6ZSBvZiBhbiBhcnJheSBvZiBjaXBoZXIgc2NoZW1lcyBkZWZpbml0aW9ucy4KICAqIEBjaXBoZXJfc2NoZW1lczogYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGNpcGhlciBzY2hlbWUgZGVmaW5pdGlvbnMKICAqCXN1cHBvcnRlZCBieSBIVy4KKyAqIEBtYXhfbmFuX2RlX2VudHJpZXM6IG1heGltdW0gbnVtYmVyIG9mIE5BTiBERSBmdW5jdGlvbnMgc3VwcG9ydGVkIGJ5IHRoZQorICoJZGV2aWNlLgogICovCiBzdHJ1Y3QgaWVlZTgwMjExX2h3IHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgY29uZjsKQEAgLTIxODQsMTEgKzIyMDYsMTYgQEAKIAl1OCBvZmZjaGFubmVsX3R4X2h3X3F1ZXVlOwogCXU4IHJhZGlvdGFwX21jc19kZXRhaWxzOwogCXUxNiByYWRpb3RhcF92aHRfZGV0YWlsczsKKwlzdHJ1Y3QgeworCQlpbnQgdW5pdHNfcG9zOworCQlzMTYgYWNjdXJhY3k7CisJfSByYWRpb3RhcF90aW1lc3RhbXA7CiAJbmV0ZGV2X2ZlYXR1cmVzX3QgbmV0ZGV2X2ZlYXR1cmVzOwogCXU4IHVhcHNkX3F1ZXVlczsKIAl1OCB1YXBzZF9tYXhfc3BfbGVuOwogCXU4IG5fY2lwaGVyX3NjaGVtZXM7CiAJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9jaXBoZXJfc2NoZW1lICpjaXBoZXJfc2NoZW1lczsKKwl1OCBtYXhfbmFuX2RlX2VudHJpZXM7CiB9OwogCiBzdGF0aWMgaW5saW5lIGJvb2wgX2llZWU4MDIxMV9od19jaGVjayhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKQEAgLTMwODUsMTEgKzMxMTIsOCBAQAogICoKICAqIEBzdGFfYWRkX2RlYnVnZnM6IERyaXZlcnMgY2FuIHVzZSB0aGlzIGNhbGxiYWNrIHRvIGFkZCBkZWJ1Z2ZzIGZpbGVzCiAgKgl3aGVuIGEgc3RhdGlvbiBpcyBhZGRlZCB0byBtYWM4MDIxMSdzIHN0YXRpb24gbGlzdC4gVGhpcyBjYWxsYmFjawotICoJYW5kIEBzdGFfcmVtb3ZlX2RlYnVnZnMgc2hvdWxkIGJlIHdpdGhpbiBhIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCi0gKgljb25kaXRpb25hbC4gVGhpcyBjYWxsYmFjayBjYW4gc2xlZXAuCi0gKgotICogQHN0YV9yZW1vdmVfZGVidWdmczogUmVtb3ZlIHRoZSBkZWJ1Z2ZzIGZpbGVzIHdoaWNoIHdlcmUgYWRkZWQgdXNpbmcKLSAqCUBzdGFfYWRkX2RlYnVnZnMuIFRoaXMgY2FsbGJhY2sgY2FuIHNsZWVwLgorICoJc2hvdWxkIGJlIHdpdGhpbiBhIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTIGNvbmRpdGlvbmFsLiBUaGlzCisgKgljYWxsYmFjayBjYW4gc2xlZXAuCiAgKgogICogQHN0YV9ub3RpZnk6IE5vdGlmaWVzIGxvdyBsZXZlbCBkcml2ZXIgYWJvdXQgcG93ZXIgc3RhdGUgdHJhbnNpdGlvbiBvZiBhbgogICoJYXNzb2NpYXRlZCBzdGF0aW9uLCBBUCwgIElCU1MvV0RTL21lc2ggcGVlciBldGMuIEZvciBhIFZJRiBvcGVyYXRpbmcKQEAgLTMxNDcsNiArMzE3MSwxMiBAQAogICoJcmVxdWlyZWQgZnVuY3Rpb24uCiAgKglUaGUgY2FsbGJhY2sgY2FuIHNsZWVwLgogICoKKyAqIEBvZmZzZXRfdHNmOiBPZmZzZXQgdGhlIFRTRiB0aW1lciBieSB0aGUgc3BlY2lmaWVkIHZhbHVlIGluIHRoZQorICoJZmlybXdhcmUvaGFyZHdhcmUuICBQcmVmZXJyZWQgdG8gc2V0X3RzZiBhcyBpdCBhdm9pZHMgZGVsYXkgYmV0d2VlbgorICoJY2FsbGluZyBzZXRfdHNmKCkgYW5kIGhhcmR3YXJlIGdldHRpbmcgcHJvZ3JhbW1lZCwgd2hpY2ggd2lsbCBzaG93IHVwCisgKglhcyBUU0YgZGVsYXkuIElzIG5vdCBhIHJlcXVpcmVkIGZ1bmN0aW9uLgorICoJVGhlIGNhbGxiYWNrIGNhbiBzbGVlcC4KKyAqCiAgKiBAcmVzZXRfdHNmOiBSZXNldCB0aGUgVFNGIHRpbWVyIGFuZCBhbGxvdyBmaXJtd2FyZS9oYXJkd2FyZSB0byBzeW5jaHJvbml6ZQogICoJd2l0aCBvdGhlciBTVEFzIGluIHRoZSBJQlNTLiBUaGlzIGlzIG9ubHkgdXNlZCBpbiBJQlNTIG1vZGUuIFRoaXMKICAqCWZ1bmN0aW9uIGlzIG9wdGlvbmFsIGlmIHRoZSBmaXJtd2FyZS9oYXJkd2FyZSB0YWtlcyBmdWxsIGNhcmUgb2YKQEAgLTM0MDEsNiArMzQzMSwyMSBAQAogICoJc3luY2hyb25pemF0aW9uIHdoaWNoIGlzIG5lZWRlZCBpbiBjYXNlIGRyaXZlciBoYXMgaW4gaXRzIFJTUyBxdWV1ZXMKICAqCXBlbmRpbmcgZnJhbWVzIHRoYXQgd2VyZSByZWNlaXZlZCBwcmlvciB0byB0aGUgY29udHJvbCBwYXRoIGFjdGlvbgogICoJY3VycmVudGx5IHRha2VuIChlLmcuIGRpc2Fzc29jaWF0aW9uKSBidXQgYXJlIG5vdCBwcm9jZXNzZWQgeWV0LgorICoKKyAqIEBzdGFydF9uYW46IGpvaW4gYW4gZXhpc3RpbmcgTkFOIGNsdXN0ZXIsIG9yIGNyZWF0ZSBhIG5ldyBvbmUuCisgKiBAc3RvcF9uYW46IGxlYXZlIHRoZSBOQU4gY2x1c3Rlci4KKyAqIEBuYW5fY2hhbmdlX2NvbmY6IGNoYW5nZSBOQU4gY29uZmlndXJhdGlvbi4gVGhlIGRhdGEgaW4gY2ZnODAyMTFfbmFuX2NvbmYKKyAqCWNvbnRhaW5zIGZ1bGwgbmV3IGNvbmZpZ3VyYXRpb24gYW5kIGNoYW5nZXMgc3BlY2lmeSB3aGljaCBwYXJhbWV0ZXJzCisgKglhcmUgY2hhbmdlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGxhc3QgTkFOIGNvbmZpZy4KKyAqCVRoZSBkcml2ZXIgZ2V0cyBib3RoIGZ1bGwgY29uZmlndXJhdGlvbiBhbmQgdGhlIGNoYW5nZWQgcGFyYW1ldGVycyBzaW5jZQorICoJc29tZSBkZXZpY2VzIG1heSBuZWVkIHRoZSBmdWxsIGNvbmZpZ3VyYXRpb24gd2hpbGUgb3RoZXJzIG5lZWQgb25seSB0aGUKKyAqCWNoYW5nZWQgcGFyYW1ldGVycy4KKyAqIEBhZGRfbmFuX2Z1bmM6IEFkZCBhIE5BTiBmdW5jdGlvbi4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MuIFRoZSBkYXRhIGluCisgKgljZmc4MDIxMV9uYW5fZnVuYyBtdXN0IG5vdCBiZSByZWZlcmVuY2VkIG91dHNpZGUgdGhlIHNjb3BlIG9mCisgKgl0aGlzIGNhbGwuCisgKiBAZGVsX25hbl9mdW5jOiBSZW1vdmUgYSBOQU4gZnVuY3Rpb24uIFRoZSBkcml2ZXIgbXVzdCBjYWxsCisgKglpZWVlODAyMTFfbmFuX2Z1bmNfdGVybWluYXRlZCgpIHdpdGgKKyAqCU5MODAyMTFfTkFOX0ZVTkNfVEVSTV9SRUFTT05fVVNFUl9SRVFVRVNUIHJlYXNvbiBjb2RlIHVwb24gcmVtb3ZhbC4KICAqLwogc3RydWN0IGllZWU4MDIxMV9vcHMgewogCXZvaWQgKCp0eCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCkBAIC0zNDg1LDEwICszNTMwLDYgQEAKIAkJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCiAJCQkJc3RydWN0IGRlbnRyeSAqZGlyKTsKLQl2b2lkICgqc3RhX3JlbW92ZV9kZWJ1Z2ZzKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCi0JCQkJICAgc3RydWN0IGRlbnRyeSAqZGlyKTsKICNlbmRpZgogCXZvaWQgKCpzdGFfbm90aWZ5KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJCWVudW0gc3RhX25vdGlmeV9jbWQsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpOwpAQCAtMzUxNiw2ICszNTU3LDggQEAKIAl1NjQgKCpnZXRfdHNmKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7CiAJdm9pZCAoKnNldF90c2YpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkJdTY0IHRzZik7CisJdm9pZCAoKm9mZnNldF90c2YpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJICAgczY0IG9mZnNldCk7CiAJdm9pZCAoKnJlc2V0X3RzZikoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwogCWludCAoKnR4X2xhc3RfYmVhY29uKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CiAJaW50ICgqYW1wZHVfYWN0aW9uKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKQEAgLTM2MjAsNyArMzY2Myw4IEBACiAKIAlpbnQgKCpqb2luX2lic3MpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKIAl2b2lkICgqbGVhdmVfaWJzcykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwotCXUzMiAoKmdldF9leHBlY3RlZF90aHJvdWdocHV0KShzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKTsKKwl1MzIgKCpnZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dCkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpOwogCWludCAoKmdldF90eHBvd2VyKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJCSAgIGludCAqZGJtKTsKIApAQCAtMzYzOSw2ICszNjgzLDIxIEBACiAJdm9pZCAoKndha2VfdHhfcXVldWUpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV90eHEgKnR4cSk7CiAJdm9pZCAoKnN5bmNfcnhfcXVldWVzKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisKKwlpbnQgKCpzdGFydF9uYW4pKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgc3RydWN0IGNmZzgwMjExX25hbl9jb25mICpjb25mKTsKKwlpbnQgKCpzdG9wX25hbikoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKKwlpbnQgKCpuYW5fY2hhbmdlX2NvbmYpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgICAgc3RydWN0IGNmZzgwMjExX25hbl9jb25mICpjb25mLCB1MzIgY2hhbmdlcyk7CisJaW50ICgqYWRkX25hbl9mdW5jKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJICAgIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9uYW5fZnVuYyAqbmFuX2Z1bmMpOworCXZvaWQgKCpkZWxfbmFuX2Z1bmMpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgdTggaW5zdGFuY2VfaWQpOwogfTsKIAogLyoqCkBAIC01NzEyLDQgKzU3NzEsMzYgQEAKIHZvaWQgaWVlZTgwMjExX3R4cV9nZXRfZGVwdGgoc3RydWN0IGllZWU4MDIxMV90eHEgKnR4cSwKIAkJCSAgICAgdW5zaWduZWQgbG9uZyAqZnJhbWVfY250LAogCQkJICAgICB1bnNpZ25lZCBsb25nICpieXRlX2NudCk7CisKKy8qKgorICogaWVlZTgwMjExX25hbl9mdW5jX3Rlcm1pbmF0ZWQgLSBub3RpZnkgYWJvdXQgTkFOIGZ1bmN0aW9uIHRlcm1pbmF0aW9uLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBub3RpZnkgbWFjODAyMTEgYWJvdXQgTkFOIGZ1bmN0aW9uIHRlcm1pbmF0aW9uLgorICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gY2FuJ3QgYmUgY2FsbGVkIGZyb20gaGFyZCBpcnEuCisgKgorICogQHZpZjogJnN0cnVjdCBpZWVlODAyMTFfdmlmIHBvaW50ZXIgZnJvbSB0aGUgYWRkX2ludGVyZmFjZSBjYWxsYmFjay4KKyAqIEBpbnN0X2lkOiB0aGUgbG9jYWwgaW5zdGFuY2UgaWQKKyAqIEByZWFzb246IHRlcm1pbmF0aW9uIHJlYXNvbiAob25lIG9mIHRoZSBOTDgwMjExX05BTl9GVU5DX1RFUk1fUkVBU09OXyopCisgKiBAZ2ZwOiBhbGxvY2F0aW9uIGZsYWdzCisgKi8KK3ZvaWQgaWVlZTgwMjExX25hbl9mdW5jX3Rlcm1pbmF0ZWQoc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCQkgICB1OCBpbnN0X2lkLAorCQkJCSAgIGVudW0gbmw4MDIxMV9uYW5fZnVuY190ZXJtX3JlYXNvbiByZWFzb24sCisJCQkJICAgZ2ZwX3QgZ2ZwKTsKKworLyoqCisgKiBpZWVlODAyMTFfbmFuX2Z1bmNfbWF0Y2ggLSBub3RpZnkgYWJvdXQgTkFOIGZ1bmN0aW9uIG1hdGNoIGV2ZW50LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBub3RpZnkgbWFjODAyMTEgYWJvdXQgTkFOIGZ1bmN0aW9uIG1hdGNoLiBUaGUKKyAqIGNvb2tpZSBpbnNpZGUgdGhlIG1hdGNoIHN0cnVjdCB3aWxsIGJlIGFzc2lnbmVkIGJ5IG1hYzgwMjExLgorICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gY2FuJ3QgYmUgY2FsbGVkIGZyb20gaGFyZCBpcnEuCisgKgorICogQHZpZjogJnN0cnVjdCBpZWVlODAyMTFfdmlmIHBvaW50ZXIgZnJvbSB0aGUgYWRkX2ludGVyZmFjZSBjYWxsYmFjay4KKyAqIEBtYXRjaDogbWF0Y2ggZXZlbnQgaW5mb3JtYXRpb24KKyAqIEBnZnA6IGFsbG9jYXRpb24gZmxhZ3MKKyAqLwordm9pZCBpZWVlODAyMTFfbmFuX2Z1bmNfbWF0Y2goc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCSAgICAgIHN0cnVjdCBjZmc4MDIxMV9uYW5fbWF0Y2hfcGFyYW1zICptYXRjaCwKKwkJCSAgICAgIGdmcF90IGdmcCk7CisKICNlbmRpZiAvKiBNQUM4MDIxMV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9tcGxzLmggYi9pbmNsdWRlL25ldC9tcGxzLmgKaW5kZXggNWIzYjVhZC4uMWRiYzY2OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbXBscy5oCisrKyBiL2luY2x1ZGUvbmV0L21wbHMuaApAQCAtMTksMjEgKzE5LDE4IEBACiAKICNkZWZpbmUgTVBMU19ITEVOIDQKIAorc3RydWN0IG1wbHNfc2hpbV9oZHIgeworCV9fYmUzMiBsYWJlbF9zdGFja19lbnRyeTsKK307CisKIHN0YXRpYyBpbmxpbmUgYm9vbCBldGhfcF9tcGxzKF9fYmUxNiBldGhfdHlwZSkKIHsKIAlyZXR1cm4gZXRoX3R5cGUgPT0gaHRvbnMoRVRIX1BfTVBMU19VQykgfHwKIAkJZXRoX3R5cGUgPT0gaHRvbnMoRVRIX1BfTVBMU19NQyk7CiB9CiAKLS8qCi0gKiBGb3Igbm9uLU1QTFMgc2ticyB0aGlzIHdpbGwgY29ycmVzcG9uZCB0byB0aGUgbmV0d29yayBoZWFkZXIuCi0gKiBGb3IgTVBMUyBza2JzIGl0IHdpbGwgYmUgYmVmb3JlIHRoZSBuZXR3b3JrX2hlYWRlciBhcyB0aGUgTVBMUwotICogbGFiZWwgc3RhY2sgbGllcyBiZXR3ZWVuIHRoZSBlbmQgb2YgdGhlIG1hYyBoZWFkZXIgYW5kIHRoZSBuZXR3b3JrCi0gKiBoZWFkZXIuIFRoYXQgaXMsIGZvciBNUExTIHNrYnMgdGhlIGVuZCBvZiB0aGUgbWFjIGhlYWRlcgotICogaXMgdGhlIHRvcCBvZiB0aGUgTVBMUyBsYWJlbCBzdGFjay4KLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyICpza2JfbXBsc19oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1wbHNfc2hpbV9oZHIgKm1wbHNfaGRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIHNrYl9tYWNfaGVhZGVyKHNrYikgKyBza2ItPm1hY19sZW47CisJcmV0dXJuIChzdHJ1Y3QgbXBsc19zaGltX2hkciAqKXNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uY3NpLmggYi9pbmNsdWRlL25ldC9uY3NpLmgKaW5kZXggMWRiZjQyZi4uNjg2ODBiYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmNzaS5oCisrKyBiL2luY2x1ZGUvbmV0L25jc2kuaApAQCAtMzEsNiArMzEsNyBAQAogc3RydWN0IG5jc2lfZGV2ICpuY3NpX3JlZ2lzdGVyX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgIHZvaWQgKCpub3RpZmllcikoc3RydWN0IG5jc2lfZGV2ICpuZCkpOwogaW50IG5jc2lfc3RhcnRfZGV2KHN0cnVjdCBuY3NpX2RldiAqbmQpOwordm9pZCBuY3NpX3N0b3BfZGV2KHN0cnVjdCBuY3NpX2RldiAqbmQpOwogdm9pZCBuY3NpX3VucmVnaXN0ZXJfZGV2KHN0cnVjdCBuY3NpX2RldiAqbmQpOwogI2Vsc2UgLyogIUNPTkZJR19ORVRfTkNTSSAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3QgbmNzaV9kZXYgKm5jc2lfcmVnaXN0ZXJfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC00NCw2ICs0NSwxMCBAQAogCXJldHVybiAtRU5PVFRZOwogfQogCitzdGF0aWMgdm9pZCBuY3NpX3N0b3BfZGV2KHN0cnVjdCBuY3NpX2RldiAqbmQpCit7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBuY3NpX3VucmVnaXN0ZXJfZGV2KHN0cnVjdCBuY3NpX2RldiAqbmQpCiB7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRfbmFtZXNwYWNlLmggYi9pbmNsdWRlL25ldC9uZXRfbmFtZXNwYWNlLmgKaW5kZXggMDkzM2M3NC4uZmM0Zjc1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0X25hbWVzcGFjZS5oCisrKyBiL2luY2x1ZGUvbmV0L25ldF9uYW1lc3BhY2UuaApAQCAtNjAsNiArNjAsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQJZXhpdF9saXN0OwkvKiBVc2Ugb25seSBuZXRfbXV0ZXggKi8KIAogCXN0cnVjdCB1c2VyX25hbWVzcGFjZSAgICp1c2VyX25zOwkvKiBPd25pbmcgdXNlciBuYW1lc3BhY2UgKi8KKwlzdHJ1Y3QgdWNvdW50cwkJKnVjb3VudHM7CiAJc3BpbmxvY2tfdAkJbnNpZF9sb2NrOwogCXN0cnVjdCBpZHIJCW5ldG5zX2lkczsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL2JyX25ldGZpbHRlci5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL2JyX25ldGZpbHRlci5oCmluZGV4IGU4ZDE0NDguLjBiMGMzNWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9icl9uZXRmaWx0ZXIuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvYnJfbmV0ZmlsdGVyLmgKQEAgLTE1LDYgKzE1LDEyIEBACiAKIHZvaWQgbmZfYnJpZGdlX3VwZGF0ZV9wcm90b2NvbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAoraW50IGJyX25mX2hvb2tfdGhyZXNoKHVuc2lnbmVkIGludCBob29rLCBzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrICpzaywKKwkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmluZGV2LAorCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0ZGV2LAorCQkgICAgICBpbnQgKCpva2ZuKShzdHJ1Y3QgbmV0ICosIHN0cnVjdCBzb2NrICosCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqKSk7CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5mX2JyaWRnZV9pbmZvICoKIG5mX2JyaWRnZV9pbmZvX2dldChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oCmluZGV4IDQ0NWIwMTkuLjUwNDE4MDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmgKQEAgLTQyLDcgKzQyLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KIAogI2lmZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKICNkZWZpbmUgTkZfQ1RfQVNTRVJUKHgpCQlXQVJOX09OKCEoeCkpCkBAIC03Myw3ICs3Miw3IEBACiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9pcHY2L25mX2Nvbm50cmFja19pcHY2Lmg+CiAKIHN0cnVjdCBuZl9jb25uIHsKLQkvKiBVc2FnZSBjb3VudCBpbiBoZXJlIGlzIDEgZm9yIGhhc2ggdGFibGUvZGVzdHJ1Y3QgdGltZXIsIDEgcGVyIHNrYiwKKwkvKiBVc2FnZSBjb3VudCBpbiBoZXJlIGlzIDEgZm9yIGhhc2ggdGFibGUsIDEgcGVyIHNrYiwKIAkgKiBwbHVzIDEgZm9yIGFueSBjb25uZWN0aW9uKHMpIHdlIGFyZSBgbWFzdGVyJyBmb3IKIAkgKgogCSAqIEhpbnQsIFNLQiBhZGRyZXNzIHRoaXMgc3RydWN0IGFuZCByZWZjbnQgdmlhIHNrYi0+bmZjdCBhbmQKQEAgLTk2LDggKzk1LDggQEAKIAkvKiBIYXZlIHdlIHNlZW4gdHJhZmZpYyBib3RoIHdheXMgeWV0PyAoYml0c2V0KSAqLwogCXVuc2lnbmVkIGxvbmcgc3RhdHVzOwogCi0JLyogVGltZXIgZnVuY3Rpb247IGRyb3BzIHJlZmNudCB3aGVuIGl0IGdvZXMgb2ZmLiAqLwotCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVvdXQ7CisJLyogamlmZmllczMyIHdoZW4gdGhpcyBjdCBpcyBjb25zaWRlcmVkIGRlYWQgKi8KKwl1MzIgdGltZW91dDsKIAogCXBvc3NpYmxlX25ldF90IGN0X25ldDsKIApAQCAtMjIwLDIxICsyMTksMTQgQEAKIAlfX25mX2N0X3JlZnJlc2hfYWNjdChjdCwgMCwgc2tiLCBleHRyYV9qaWZmaWVzLCAwKTsKIH0KIAotYm9vbCBfX25mX2N0X2tpbGxfYWNjdChzdHJ1Y3QgbmZfY29ubiAqY3QsIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkgICAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGRvX2FjY3QpOwotCiAvKiBraWxsIGNvbm50cmFjayBhbmQgZG8gYWNjb3VudGluZyAqLwotc3RhdGljIGlubGluZSBib29sIG5mX2N0X2tpbGxfYWNjdChzdHJ1Y3QgbmZfY29ubiAqY3QsCi0JCQkJICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkJICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlyZXR1cm4gX19uZl9jdF9raWxsX2FjY3QoY3QsIGN0aW5mbywgc2tiLCAxKTsKLX0KK2Jvb2wgbmZfY3Rfa2lsbF9hY2N0KHN0cnVjdCBuZl9jb25uICpjdCwgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCSAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKIC8qIGtpbGwgY29ubnRyYWNrIHdpdGhvdXQgYWNjb3VudGluZyAqLwogc3RhdGljIGlubGluZSBib29sIG5mX2N0X2tpbGwoc3RydWN0IG5mX2Nvbm4gKmN0KQogewotCXJldHVybiBfX25mX2N0X2tpbGxfYWNjdChjdCwgMCwgTlVMTCwgMCk7CisJcmV0dXJuIG5mX2N0X2RlbGV0ZShjdCwgMCwgMCk7CiB9CiAKIC8qIFRoZXNlIGFyZSBmb3IgTkFULiAgSWNreS4gKi8KQEAgLTI5MSwyMSArMjgzLDU1IEBACiAJcmV0dXJuIHNrYi0+ZGV2ICYmIHNrYi0+c2tiX2lpZiAmJiBza2ItPmRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0s7CiB9CiAKKyNkZWZpbmUgbmZjdF90aW1lX3N0YW1wICgodTMyKShqaWZmaWVzKSkKKwogLyogamlmZmllcyB1bnRpbCBjdCBleHBpcmVzLCAwIGlmIGFscmVhZHkgZXhwaXJlZCAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG5mX2N0X2V4cGlyZXMoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQogewotCWxvbmcgdGltZW91dCA9IChsb25nKWN0LT50aW1lb3V0LmV4cGlyZXMgLSAobG9uZylqaWZmaWVzOworCXMzMiB0aW1lb3V0ID0gY3QtPnRpbWVvdXQgLSBuZmN0X3RpbWVfc3RhbXA7CiAKIAlyZXR1cm4gdGltZW91dCA+IDAgPyB0aW1lb3V0IDogMDsKIH0KIAorc3RhdGljIGlubGluZSBib29sIG5mX2N0X2lzX2V4cGlyZWQoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQoreworCXJldHVybiAoX19zMzIpKGN0LT50aW1lb3V0IC0gbmZjdF90aW1lX3N0YW1wKSA8PSAwOworfQorCisvKiB1c2UgYWZ0ZXIgb2J0YWluaW5nIGEgcmVmZXJlbmNlIGNvdW50ICovCitzdGF0aWMgaW5saW5lIGJvb2wgbmZfY3Rfc2hvdWxkX2djKGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKK3sKKwlyZXR1cm4gbmZfY3RfaXNfZXhwaXJlZChjdCkgJiYgbmZfY3RfaXNfY29uZmlybWVkKGN0KSAmJgorCSAgICAgICAhbmZfY3RfaXNfZHlpbmcoY3QpOworfQorCiBzdHJ1Y3Qga2VybmVsX3BhcmFtOwogCiBpbnQgbmZfY29ubnRyYWNrX3NldF9oYXNoc2l6ZShjb25zdCBjaGFyICp2YWwsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKTsKIGludCBuZl9jb25udHJhY2tfaGFzaF9yZXNpemUodW5zaWduZWQgaW50IGhhc2hzaXplKTsKKworZXh0ZXJuIHN0cnVjdCBobGlzdF9udWxsc19oZWFkICpuZl9jb25udHJhY2tfaGFzaDsKIGV4dGVybiB1bnNpZ25lZCBpbnQgbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplOworZXh0ZXJuIHNlcWNvdW50X3QgbmZfY29ubnRyYWNrX2dlbmVyYXRpb247CiBleHRlcm4gdW5zaWduZWQgaW50IG5mX2Nvbm50cmFja19tYXg7CiAKKy8qIG11c3QgYmUgY2FsbGVkIHdpdGggcmN1IHJlYWQgbG9jayBoZWxkICovCitzdGF0aWMgaW5saW5lIHZvaWQKK25mX2Nvbm50cmFja19nZXRfaHQoc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKipoYXNoLCB1bnNpZ25lZCBpbnQgKmhzaXplKQoreworCXN0cnVjdCBobGlzdF9udWxsc19oZWFkICpocHRyOworCXVuc2lnbmVkIGludCBzZXF1ZW5jZSwgaHN6OworCisJZG8geworCQlzZXF1ZW5jZSA9IHJlYWRfc2VxY291bnRfYmVnaW4oJm5mX2Nvbm50cmFja19nZW5lcmF0aW9uKTsKKwkJaHN6ID0gbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplOworCQlocHRyID0gbmZfY29ubnRyYWNrX2hhc2g7CisJfSB3aGlsZSAocmVhZF9zZXFjb3VudF9yZXRyeSgmbmZfY29ubnRyYWNrX2dlbmVyYXRpb24sIHNlcXVlbmNlKSk7CisKKwkqaGFzaCA9IGhwdHI7CisJKmhzaXplID0gaHN6OworfQorCiBzdHJ1Y3QgbmZfY29ubiAqbmZfY3RfdG1wbF9hbGxvYyhzdHJ1Y3QgbmV0ICpuZXQsCiAJCQkJIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfem9uZSAqem9uZSwKIAkJCQkgZ2ZwX3QgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaAppbmRleCA3OWQ3YWM1Li42MmUxN2QxIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaApAQCAtNTEsOCArNTEsNiBAQAogCQkJY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpsM3Byb3RvLAogCQkJY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvKTsKIAotdm9pZCBuZl9jb25udHJhY2tfZ2V0X2h0KHN0cnVjdCBobGlzdF9udWxsc19oZWFkICoqaGFzaCwgdW5zaWduZWQgaW50ICpoc2l6ZSk7Ci0KIC8qIEZpbmQgYSBjb25uZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gYSB0dXBsZS4gKi8KIHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqCiBuZl9jb25udHJhY2tfZmluZF9nZXQoc3RydWN0IG5ldCAqbmV0LApAQCAtODMsNyArODEsNiBAQAogCiAjZGVmaW5lIENPTk5UUkFDS19MT0NLUyAxMDI0CiAKLWV4dGVybiBzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqbmZfY29ubnRyYWNrX2hhc2g7CiBleHRlcm4gc3BpbmxvY2tfdCBuZl9jb25udHJhY2tfbG9ja3NbQ09OTlRSQUNLX0xPQ0tTXTsKIHZvaWQgbmZfY29ubnRyYWNrX2xvY2soc3BpbmxvY2tfdCAqbG9jayk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5oCmluZGV4IGZhMzY0NDcuLjEyZDk2N2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuaApAQCAtMTIsMTIgKzEyLDE5IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZV9jb21tb24uaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuaD4KIAorZW51bSBuZl9jdF9lY2FjaGVfc3RhdGUgeworCU5GQ1RfRUNBQ0hFX1VOS05PV04sCQkvKiBkZXN0cm95IGV2ZW50IG5vdCBzZW50ICovCisJTkZDVF9FQ0FDSEVfREVTVFJPWV9GQUlMLAkvKiB0cmllZCBidXQgZmFpbGVkIHRvIHNlbmQgZGVzdHJveSBldmVudCAqLworCU5GQ1RfRUNBQ0hFX0RFU1RST1lfU0VOVCwJLyogc2VudCBkZXN0cm95IGV2ZW50IGFmdGVyIGZhaWx1cmUgKi8KK307CisKIHN0cnVjdCBuZl9jb25udHJhY2tfZWNhY2hlIHsKLQl1bnNpZ25lZCBsb25nIGNhY2hlOwkvKiBiaXRvcHMgd2FudCBsb25nICovCi0JdW5zaWduZWQgbG9uZyBtaXNzZWQ7CS8qIG1pc3NlZCBldmVudHMgKi8KLQl1MTYgY3RtYXNrOwkJLyogYml0bWFzayBvZiBjdCBldmVudHMgdG8gYmUgZGVsaXZlcmVkICovCi0JdTE2IGV4cG1hc2s7CQkvKiBiaXRtYXNrIG9mIGV4cGVjdCBldmVudHMgdG8gYmUgZGVsaXZlcmVkICovCi0JdTMyIHBvcnRpZDsJCS8qIG5ldGxpbmsgcG9ydGlkIG9mIGRlc3Ryb3llciAqLworCXVuc2lnbmVkIGxvbmcgY2FjaGU7CQkvKiBiaXRvcHMgd2FudCBsb25nICovCisJdW5zaWduZWQgbG9uZyBtaXNzZWQ7CQkvKiBtaXNzZWQgZXZlbnRzICovCisJdTE2IGN0bWFzazsJCQkvKiBiaXRtYXNrIG9mIGN0IGV2ZW50cyB0byBiZSBkZWxpdmVyZWQgKi8KKwl1MTYgZXhwbWFzazsJCQkvKiBiaXRtYXNrIG9mIGV4cGVjdCBldmVudHMgdG8gYmUgZGVsaXZlcmVkICovCisJdTMyIHBvcnRpZDsJCQkvKiBuZXRsaW5rIHBvcnRpZCBvZiBkZXN0cm95ZXIgKi8KKwllbnVtIG5mX2N0X2VjYWNoZV9zdGF0ZSBzdGF0ZTsJLyogZWNhY2hlIHN0YXRlICovCiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuZl9jb25udHJhY2tfZWNhY2hlICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90by5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvLmgKaW5kZXggY2RjOTIwYi4uODk5MmU0MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvLmgKQEAgLTYzLDEwICs2Myw2IEBACiAKIAlzaXplX3QgbmxhX3NpemU7CiAKLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0JY29uc3QgY2hhcgkJKmN0bF90YWJsZV9wYXRoOwotI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KLQogCS8qIEluaXQgbDNwcm90byBwZXJuZXQgZGF0YSAqLwogCWludCAoKmluaXRfbmV0KShzdHJ1Y3QgbmV0ICpuZXQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2w0cHJvdG8uaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oCmluZGV4IDFhNWZiMzYuLmRlNjI5ZjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oCkBAIC0xMzQsMTQgKzEzNCw2IEBACiBpbnQgbmZfY3RfbDRwcm90b19yZWdpc3RlcihzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKnByb3RvKTsKIHZvaWQgbmZfY3RfbDRwcm90b191bnJlZ2lzdGVyKHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqcHJvdG8pOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgbmZfY3Rfa2ZyZWVfY29tcGF0X3N5c2N0bF90YWJsZShzdHJ1Y3QgbmZfcHJvdG9fbmV0ICpwbikKLXsKLSNpZiBkZWZpbmVkKENPTkZJR19TWVNDVEwpICYmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCkKLQlrZnJlZShwbi0+Y3RsX2NvbXBhdF90YWJsZSk7Ci0JcG4tPmN0bF9jb21wYXRfdGFibGUgPSBOVUxMOwotI2VuZGlmCi19Ci0KIC8qIEdlbmVyaWMgbmV0bGluayBoZWxwZXJzICovCiBpbnQgbmZfY3RfcG9ydF90dXBsZV90b19ubGF0dHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3N5bnByb3h5LmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3N5bnByb3h5LmgKaW5kZXggNjc5MzYxNC4uZTY5MzczMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zeW5wcm94eS5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc3lucHJveHkuaApAQCAtMjcsNiArMjcsMjAgQEAKICNlbmRpZgogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgbmZfY3RfYWRkX3N5bnByb3h5KHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqdG1wbCkKK3sKKwlpZiAodG1wbCAmJiBuZmN0X3N5bnByb3h5KHRtcGwpKSB7CisJCWlmICghbmZjdF9zZXFhZGpfZXh0X2FkZChjdCkpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJaWYgKCFuZmN0X3N5bnByb3h5X2V4dF9hZGQoY3QpKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCiBzdHJ1Y3Qgc3lucHJveHlfc3RhdHMgewogCXVuc2lnbmVkIGludAkJCXN5bl9yZWNlaXZlZDsKIAl1bnNpZ25lZCBpbnQJCQljb29raWVfaW52YWxpZDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9sb2cuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9sb2cuaAppbmRleCA4M2Q4NTViLi4zMDljZDI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbG9nLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2xvZy5oCkBAIC0yLDE1ICsyLDEwIEBACiAjZGVmaW5lIF9ORl9MT0dfSAogCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2xvZy5oPgogCi0vKiB0aG9zZSBORl9MT0dfKiBkZWZpbmVzIGFuZCBzdHJ1Y3QgbmZfbG9naW5mbyBhcmUgbGVnYWN5IGRlZmluaXRpb3MgdGhhdCB3aWxsCi0gKiBkaXNhcHBlYXIgb25jZSBpcHRhYmxlcyBpcyByZXBsYWNlZCB3aXRoIHBrdHRhYmxlcy4gIFBsZWFzZSBETyBOT1QgdXNlIHRoZW0KLSAqIGZvciBhbnkgbmV3IGNvZGUhICovCi0jZGVmaW5lIE5GX0xPR19UQ1BTRVEJCTB4MDEJLyogTG9nIFRDUCBzZXF1ZW5jZSBudW1iZXJzICovCi0jZGVmaW5lIE5GX0xPR19UQ1BPUFQJCTB4MDIJLyogTG9nIFRDUCBvcHRpb25zICovCi0jZGVmaW5lIE5GX0xPR19JUE9QVAkJMHgwNAkvKiBMb2cgSVAgb3B0aW9ucyAqLwotI2RlZmluZSBORl9MT0dfVUlECQkweDA4CS8qIExvZyBVSUQgb3duaW5nIGxvY2FsIHNvY2tldCAqLwotI2RlZmluZSBORl9MT0dfTUFTSwkJMHgwZgorLyogTG9nIHRjcCBzZXF1ZW5jZSwgdGNwIG9wdGlvbnMsIGlwIG9wdGlvbnMgYW5kIHVpZCBvd25pbmcgbG9jYWwgc29ja2V0ICovCisjZGVmaW5lIE5GX0xPR19ERUZBVUxUX01BU0sJMHgwZgogCiAvKiBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgY29weV9sZW4gZmllbGQgaW4gbmZfbG9naW5mbyBpcyBzZXQgKi8KICNkZWZpbmUgTkZfTE9HX0ZfQ09QWV9MRU4JMHgxCkBAIC02MCw4ICs1NSw3IEBACiBpbnQgbmZfbG9nX3JlZ2lzdGVyKHVfaW50OF90IHBmLCBzdHJ1Y3QgbmZfbG9nZ2VyICpsb2dnZXIpOwogdm9pZCBuZl9sb2dfdW5yZWdpc3RlcihzdHJ1Y3QgbmZfbG9nZ2VyICpsb2dnZXIpOwogCi12b2lkIG5mX2xvZ19zZXQoc3RydWN0IG5ldCAqbmV0LCB1X2ludDhfdCBwZiwKLQkJY29uc3Qgc3RydWN0IG5mX2xvZ2dlciAqbG9nZ2VyKTsKK2ludCBuZl9sb2dfc2V0KHN0cnVjdCBuZXQgKm5ldCwgdV9pbnQ4X3QgcGYsIGNvbnN0IHN0cnVjdCBuZl9sb2dnZXIgKmxvZ2dlcik7CiB2b2lkIG5mX2xvZ191bnNldChzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBuZl9sb2dnZXIgKmxvZ2dlcik7CiAKIGludCBuZl9sb2dfYmluZF9wZihzdHJ1Y3QgbmV0ICpuZXQsIHVfaW50OF90IHBmLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3F1ZXVlLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfcXVldWUuaAppbmRleCAwZGJjZTU1Li4yMjgwY2ZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfcXVldWUuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfcXVldWUuaApAQCAtMTEsNyArMTEsNiBAQAogCXN0cnVjdCBza19idWZmCQkqc2tiOwogCXVuc2lnbmVkIGludAkJaWQ7CiAKLQlzdHJ1Y3QgbmZfaG9va19vcHMJKmVsZW07CiAJc3RydWN0IG5mX2hvb2tfc3RhdGUJc3RhdGU7CiAJdTE2CQkJc2l6ZTsgLyogc2l6ZW9mKGVudHJ5KSArIHNhdmVkIHJvdXRlIGtleXMgKi8KIApAQCAtMjIsMTAgKzIxLDEwIEBACiAKIC8qIFBhY2tldCBxdWV1aW5nICovCiBzdHJ1Y3QgbmZfcXVldWVfaGFuZGxlciB7Ci0JaW50CQkJKCpvdXRmbikoc3RydWN0IG5mX3F1ZXVlX2VudHJ5ICplbnRyeSwKLQkJCQkJIHVuc2lnbmVkIGludCBxdWV1ZW51bSk7Ci0Jdm9pZAkJCSgqbmZfaG9va19kcm9wKShzdHJ1Y3QgbmV0ICpuZXQsCi0JCQkJCQlzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcyk7CisJaW50CQkoKm91dGZuKShzdHJ1Y3QgbmZfcXVldWVfZW50cnkgKmVudHJ5LAorCQkJCSB1bnNpZ25lZCBpbnQgcXVldWVudW0pOworCXZvaWQJCSgqbmZfaG9va19kcm9wKShzdHJ1Y3QgbmV0ICpuZXQsCisJCQkJCWNvbnN0IHN0cnVjdCBuZl9ob29rX2VudHJ5ICpob29rcyk7CiB9OwogCiB2b2lkIG5mX3JlZ2lzdGVyX3F1ZXVlX2hhbmRsZXIoc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgbmZfcXVldWVfaGFuZGxlciAqcWgpOwpAQCAtNDEsMjMgKzQwLDE5IEBACiAJCSpqaGFzaF9pbml0dmFsID0gcHJhbmRvbV91MzIoKTsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgaGFzaF92NChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgamhhc2hfaW5pdHZhbCkKK3N0YXRpYyBpbmxpbmUgdTMyIGhhc2hfdjQoY29uc3Qgc3RydWN0IGlwaGRyICppcGgsIHUzMiBpbml0dmFsKQogewotCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7Ci0KIAkvKiBwYWNrZXRzIGluIGVpdGhlciBkaXJlY3Rpb24gZ28gaW50byBzYW1lIHF1ZXVlICovCiAJaWYgKChfX2ZvcmNlIHUzMilpcGgtPnNhZGRyIDwgKF9fZm9yY2UgdTMyKWlwaC0+ZGFkZHIpCiAJCXJldHVybiBqaGFzaF8zd29yZHMoKF9fZm9yY2UgdTMyKWlwaC0+c2FkZHIsCi0JCQkoX19mb3JjZSB1MzIpaXBoLT5kYWRkciwgaXBoLT5wcm90b2NvbCwgamhhc2hfaW5pdHZhbCk7CisJCQkoX19mb3JjZSB1MzIpaXBoLT5kYWRkciwgaXBoLT5wcm90b2NvbCwgaW5pdHZhbCk7CiAKIAlyZXR1cm4gamhhc2hfM3dvcmRzKChfX2ZvcmNlIHUzMilpcGgtPmRhZGRyLAotCQkJKF9fZm9yY2UgdTMyKWlwaC0+c2FkZHIsIGlwaC0+cHJvdG9jb2wsIGpoYXNoX2luaXR2YWwpOworCQkJKF9fZm9yY2UgdTMyKWlwaC0+c2FkZHIsIGlwaC0+cHJvdG9jb2wsIGluaXR2YWwpOwogfQogCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfSVA2X05GX0lQVEFCTEVTKQotc3RhdGljIGlubGluZSB1MzIgaGFzaF92Nihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgamhhc2hfaW5pdHZhbCkKK3N0YXRpYyBpbmxpbmUgdTMyIGhhc2hfdjYoY29uc3Qgc3RydWN0IGlwdjZoZHIgKmlwNmgsIHUzMiBpbml0dmFsKQogewotCWNvbnN0IHN0cnVjdCBpcHY2aGRyICppcDZoID0gaXB2Nl9oZHIoc2tiKTsKIAl1MzIgYSwgYiwgYzsKIAogCWlmICgoX19mb3JjZSB1MzIpaXA2aC0+c2FkZHIuczZfYWRkcjMyWzNdIDwKQEAgLTc1LDIwICs3MCw1MCBAQAogCWVsc2UKIAkJYyA9IChfX2ZvcmNlIHUzMikgaXA2aC0+ZGFkZHIuczZfYWRkcjMyWzFdOwogCi0JcmV0dXJuIGpoYXNoXzN3b3JkcyhhLCBiLCBjLCBqaGFzaF9pbml0dmFsKTsKKwlyZXR1cm4gamhhc2hfM3dvcmRzKGEsIGIsIGMsIGluaXR2YWwpOwogfQotI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdTMyIGhhc2hfYnJpZGdlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHUzMiBpbml0dmFsKQoreworCXN0cnVjdCBpcHY2aGRyICppcDZoLCBfaXA2aDsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCwgX2lwaDsKKworCXN3aXRjaCAoZXRoX2hkcihza2IpLT5oX3Byb3RvKSB7CisJY2FzZSBodG9ucyhFVEhfUF9JUCk6CisJCWlwaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNrYl9uZXR3b3JrX29mZnNldChza2IpLAorCQkJCQkgc2l6ZW9mKCppcGgpLCAmX2lwaCk7CisJCWlmIChpcGgpCisJCQlyZXR1cm4gaGFzaF92NChpcGgsIGluaXR2YWwpOworCQlicmVhazsKKwljYXNlIGh0b25zKEVUSF9QX0lQVjYpOgorCQlpcDZoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2tiX25ldHdvcmtfb2Zmc2V0KHNrYiksCisJCQkJCSAgc2l6ZW9mKCppcDZoKSwgJl9pcDZoKTsKKwkJaWYgKGlwNmgpCisJCQlyZXR1cm4gaGFzaF92NihpcDZoLCBpbml0dmFsKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CiAKIHN0YXRpYyBpbmxpbmUgdTMyCiBuZnF1ZXVlX2hhc2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IHF1ZXVlLCB1MTYgcXVldWVzX3RvdGFsLCB1OCBmYW1pbHksCi0JICAgICB1MzIgamhhc2hfaW5pdHZhbCkKKwkgICAgIHUzMiBpbml0dmFsKQogewotCWlmIChmYW1pbHkgPT0gTkZQUk9UT19JUFY0KQotCQlxdWV1ZSArPSAoKHU2NCkgaGFzaF92NChza2IsIGpoYXNoX2luaXR2YWwpICogcXVldWVzX3RvdGFsKSA+PiAzMjsKLSNpZiBJU19FTkFCTEVEKENPTkZJR19JUDZfTkZfSVBUQUJMRVMpCi0JZWxzZSBpZiAoZmFtaWx5ID09IE5GUFJPVE9fSVBWNikKLQkJcXVldWUgKz0gKCh1NjQpIGhhc2hfdjYoc2tiLCBqaGFzaF9pbml0dmFsKSAqIHF1ZXVlc190b3RhbCkgPj4gMzI7Ci0jZW5kaWYKKwlzd2l0Y2ggKGZhbWlseSkgeworCWNhc2UgTkZQUk9UT19JUFY0OgorCQlxdWV1ZSArPSByZWNpcHJvY2FsX3NjYWxlKGhhc2hfdjQoaXBfaGRyKHNrYiksIGluaXR2YWwpLAorCQkJCQkgIHF1ZXVlc190b3RhbCk7CisJCWJyZWFrOworCWNhc2UgTkZQUk9UT19JUFY2OgorCQlxdWV1ZSArPSByZWNpcHJvY2FsX3NjYWxlKGhhc2hfdjYoaXB2Nl9oZHIoc2tiKSwgaW5pdHZhbCksCisJCQkJCSAgcXVldWVzX3RvdGFsKTsKKwkJYnJlYWs7CisJY2FzZSBORlBST1RPX0JSSURHRToKKwkJcXVldWUgKz0gcmVjaXByb2NhbF9zY2FsZShoYXNoX2JyaWRnZShza2IsIGluaXR2YWwpLAorCQkJCQkgIHF1ZXVlc190b3RhbCk7CisJCWJyZWFrOworCX0KIAogCXJldHVybiBxdWV1ZTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl90YWJsZXMuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl90YWJsZXMuaAppbmRleCBmMmYxMzM5Li41MDMxZTA3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlcy5oCkBAIC0xOSw2ICsxOSw3IEBACiAJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UJCSpvdXQ7CiAJdTgJCQkJcGY7CiAJdTgJCQkJaG9vazsKKwlib29sCQkJCXRwcm90X3NldDsKIAl1OAkJCQl0cHJvdDsKIAkvKiBmb3IgeF90YWJsZXMgY29tcGF0aWJpbGl0eSAqLwogCXN0cnVjdCB4dF9hY3Rpb25fcGFyYW0JCXh0OwpAQCAtMzYsNiArMzcsMjMgQEAKIAlwa3QtPnBmID0gcGt0LT54dC5mYW1pbHkgPSBzdGF0ZS0+cGY7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZnRfc2V0X3BrdGluZm9fcHJvdG9fdW5zcGVjKHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0LAorCQkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlwa3QtPnRwcm90X3NldCA9IGZhbHNlOworCXBrdC0+dHByb3QgPSAwOworCXBrdC0+eHQudGhvZmYgPSAwOworCXBrdC0+eHQuZnJhZ29mZiA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZnRfc2V0X3BrdGluZm9fdW5zcGVjKHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0LAorCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQoreworCW5mdF9zZXRfcGt0aW5mbyhwa3QsIHNrYiwgc3RhdGUpOworCW5mdF9zZXRfcGt0aW5mb19wcm90b191bnNwZWMocGt0LCBza2IpOworfQorCiAvKioKICAqIAlzdHJ1Y3QgbmZ0X3ZlcmRpY3QgLSBuZl90YWJsZXMgdmVyZGljdAogICoKQEAgLTEyNyw2ICsxNDUsNyBAQAogCXJldHVybiB0eXBlID09IE5GVF9EQVRBX1ZFUkRJQ1QgPyBORlRfUkVHX1ZFUkRJQ1QgOiBORlRfUkVHXzEgKiBORlRfUkVHX1NJWkUgLyBORlRfUkVHMzJfU0laRTsKIH0KIAordW5zaWduZWQgaW50IG5mdF9wYXJzZV91MzJfY2hlY2soY29uc3Qgc3RydWN0IG5sYXR0ciAqYXR0ciwgaW50IG1heCwgdTMyICpkZXN0KTsKIHVuc2lnbmVkIGludCBuZnRfcGFyc2VfcmVnaXN0ZXIoY29uc3Qgc3RydWN0IG5sYXR0ciAqYXR0cik7CiBpbnQgbmZ0X2R1bXBfcmVnaXN0ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGF0dHIsIHVuc2lnbmVkIGludCByZWcpOwogCkBAIC0yNTEsNyArMjcwLDggQEAKIAogCWludAkJCQkoKmluc2VydCkoY29uc3Qgc3RydWN0IG5ldCAqbmV0LAogCQkJCQkJICBjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAotCQkJCQkJICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtKTsKKwkJCQkJCSAgY29uc3Qgc3RydWN0IG5mdF9zZXRfZWxlbSAqZWxlbSwKKwkJCQkJCSAgc3RydWN0IG5mdF9zZXRfZXh0ICoqZXh0KTsKIAl2b2lkCQkJCSgqYWN0aXZhdGUpKGNvbnN0IHN0cnVjdCBuZXQgKm5ldCwKIAkJCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAogCQkJCQkJICAgIGNvbnN0IHN0cnVjdCBuZnRfc2V0X2VsZW0gKmVsZW0pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19icmlkZ2UuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfYnJpZGdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMWZiNzkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19icmlkZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI2lmbmRlZiBfTkVUX05GX1RBQkxFU19CUklER0VfSAotI2RlZmluZSBfTkVUX05GX1RBQkxFU19CUklER0VfSAotCi1pbnQgbmZ0X2JyaWRnZV9pcGhkcl92YWxpZGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWludCBuZnRfYnJpZGdlX2lwNmhkcl92YWxpZGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLQotI2VuZGlmIC8qIF9ORVRfTkZfVEFCTEVTX0JSSURHRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2NvcmUuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfY29yZS5oCmluZGV4IGE5MDYwZGQuLjAwZjRmNmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfY29yZS5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfY29yZS5oCkBAIC0yOCw2ICsyOCw5IEBACiBpbnQgbmZ0X2NtcF9tb2R1bGVfaW5pdCh2b2lkKTsKIHZvaWQgbmZ0X2NtcF9tb2R1bGVfZXhpdCh2b2lkKTsKIAoraW50IG5mdF9yYW5nZV9tb2R1bGVfaW5pdCh2b2lkKTsKK3ZvaWQgbmZ0X3JhbmdlX21vZHVsZV9leGl0KHZvaWQpOworCiBpbnQgbmZ0X2xvb2t1cF9tb2R1bGVfaW5pdCh2b2lkKTsKIHZvaWQgbmZ0X2xvb2t1cF9tb2R1bGVfZXhpdCh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19pcHY0LmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2lwdjQuaAppbmRleCBjYTZlZjZiLi4yNWUzM2FlIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2lwdjQuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2lwdjQuaApAQCAtMTQsMTEgKzE0LDUzIEBACiAJbmZ0X3NldF9wa3RpbmZvKHBrdCwgc2tiLCBzdGF0ZSk7CiAKIAlpcCA9IGlwX2hkcihwa3QtPnNrYik7CisJcGt0LT50cHJvdF9zZXQgPSB0cnVlOwogCXBrdC0+dHByb3QgPSBpcC0+cHJvdG9jb2w7CiAJcGt0LT54dC50aG9mZiA9IGlwX2hkcmxlbihwa3QtPnNrYik7CiAJcGt0LT54dC5mcmFnb2ZmID0gbnRvaHMoaXAtPmZyYWdfb2ZmKSAmIElQX09GRlNFVDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQKK19fbmZ0X3NldF9wa3RpbmZvX2lwdjRfdmFsaWRhdGUoc3RydWN0IG5mdF9wa3RpbmZvICpwa3QsCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQljb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGlwaGRyICppcGgsIF9pcGg7CisJdTMyIGxlbiwgdGhvZmY7CisKKwlpcGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2JfbmV0d29ya19vZmZzZXQoc2tiKSwgc2l6ZW9mKCppcGgpLAorCQkJCSAmX2lwaCk7CisJaWYgKCFpcGgpCisJCXJldHVybiAtMTsKKworCWlmIChpcGgtPmlobCA8IDUgfHwgaXBoLT52ZXJzaW9uICE9IDQpCisJCXJldHVybiAtMTsKKworCWxlbiA9IG50b2hzKGlwaC0+dG90X2xlbik7CisJdGhvZmYgPSBpcGgtPmlobCAqIDQ7CisJaWYgKHNrYi0+bGVuIDwgbGVuKQorCQlyZXR1cm4gLTE7CisJZWxzZSBpZiAobGVuIDwgdGhvZmYpCisJCXJldHVybiAtMTsKKworCXBrdC0+dHByb3Rfc2V0ID0gdHJ1ZTsKKwlwa3QtPnRwcm90ID0gaXBoLT5wcm90b2NvbDsKKwlwa3QtPnh0LnRob2ZmID0gdGhvZmY7CisJcGt0LT54dC5mcmFnb2ZmID0gbnRvaHMoaXBoLT5mcmFnX29mZikgJiBJUF9PRkZTRVQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCituZnRfc2V0X3BrdGluZm9faXB2NF92YWxpZGF0ZShzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCwKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCit7CisJbmZ0X3NldF9wa3RpbmZvKHBrdCwgc2tiLCBzdGF0ZSk7CisJaWYgKF9fbmZ0X3NldF9wa3RpbmZvX2lwdjRfdmFsaWRhdGUocGt0LCBza2IsIHN0YXRlKSA8IDApCisJCW5mdF9zZXRfcGt0aW5mb19wcm90b191bnNwZWMocGt0LCBza2IpOworfQorCiBleHRlcm4gc3RydWN0IG5mdF9hZl9pbmZvIG5mdF9hZl9pcHY0OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfaXB2Ni5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19pcHY2LmgKaW5kZXggOGFkMzlhNi4uZDE1MGI1MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19pcHY2LmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19pcHY2LmgKQEAgLTQsNyArNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oPgogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAKLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW5saW5lIHZvaWQKIG5mdF9zZXRfcGt0aW5mb19pcHY2KHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0LAogCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQpAQCAtMTUsMTUgKzE1LDY0IEBACiAJbmZ0X3NldF9wa3RpbmZvKHBrdCwgc2tiLCBzdGF0ZSk7CiAKIAlwcm90b2hkciA9IGlwdjZfZmluZF9oZHIocGt0LT5za2IsICZ0aG9mZiwgLTEsICZmcmFnX29mZiwgTlVMTCk7Ci0JLyogSWYgbWFsZm9ybWVkLCBkcm9wIGl0ICovCisJaWYgKHByb3RvaGRyIDwgMCkgeworCQluZnRfc2V0X3BrdGluZm9fcHJvdG9fdW5zcGVjKHBrdCwgc2tiKTsKKwkJcmV0dXJuOworCX0KKworCXBrdC0+dHByb3Rfc2V0ID0gdHJ1ZTsKKwlwa3QtPnRwcm90ID0gcHJvdG9oZHI7CisJcGt0LT54dC50aG9mZiA9IHRob2ZmOworCXBrdC0+eHQuZnJhZ29mZiA9IGZyYWdfb2ZmOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19uZnRfc2V0X3BrdGluZm9faXB2Nl92YWxpZGF0ZShzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCwKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCWNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKK3sKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQorCXN0cnVjdCBpcHY2aGRyICppcDZoLCBfaXA2aDsKKwl1bnNpZ25lZCBpbnQgdGhvZmYgPSAwOworCXVuc2lnbmVkIHNob3J0IGZyYWdfb2ZmOworCWludCBwcm90b2hkcjsKKwl1MzIgcGt0X2xlbjsKKworCWlwNmggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2JfbmV0d29ya19vZmZzZXQoc2tiKSwgc2l6ZW9mKCppcDZoKSwKKwkJCQkgICZfaXA2aCk7CisJaWYgKCFpcDZoKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoaXA2aC0+dmVyc2lvbiAhPSA2KQorCQlyZXR1cm4gLTE7CisKKwlwa3RfbGVuID0gbnRvaHMoaXA2aC0+cGF5bG9hZF9sZW4pOworCWlmIChwa3RfbGVuICsgc2l6ZW9mKCppcDZoKSA+IHNrYi0+bGVuKQorCQlyZXR1cm4gLTE7CisKKwlwcm90b2hkciA9IGlwdjZfZmluZF9oZHIocGt0LT5za2IsICZ0aG9mZiwgLTEsICZmcmFnX29mZiwgTlVMTCk7CiAJaWYgKHByb3RvaGRyIDwgMCkKIAkJcmV0dXJuIC0xOwogCisJcGt0LT50cHJvdF9zZXQgPSB0cnVlOwogCXBrdC0+dHByb3QgPSBwcm90b2hkcjsKIAlwa3QtPnh0LnRob2ZmID0gdGhvZmY7CiAJcGt0LT54dC5mcmFnb2ZmID0gZnJhZ19vZmY7CiAKIAlyZXR1cm4gMDsKKyNlbHNlCisJcmV0dXJuIC0xOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorbmZ0X3NldF9wa3RpbmZvX2lwdjZfdmFsaWRhdGUoc3RydWN0IG5mdF9wa3RpbmZvICpwa3QsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQoreworCW5mdF9zZXRfcGt0aW5mbyhwa3QsIHNrYiwgc3RhdGUpOworCWlmIChfX25mdF9zZXRfcGt0aW5mb19pcHY2X3ZhbGlkYXRlKHBrdCwgc2tiLCBzdGF0ZSkgPCAwKQorCQluZnRfc2V0X3BrdGluZm9fcHJvdG9fdW5zcGVjKHBrdCwgc2tiKTsKIH0KIAogZXh0ZXJuIHN0cnVjdCBuZnRfYWZfaW5mbyBuZnRfYWZfaXB2NjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZnRfbWV0YS5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mdF9tZXRhLmgKaW5kZXggZDI3NTg4Yy4uMTEzOWNkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mdF9tZXRhLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mdF9tZXRhLmgKQEAgLTM2LDQgKzM2LDggQEAKIHZvaWQgbmZ0X21ldGFfc2V0X2Rlc3Ryb3koY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKIAkJCSAgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByKTsKIAoraW50IG5mdF9tZXRhX3NldF92YWxpZGF0ZShjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LAorCQkJICBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCisJCQkgIGNvbnN0IHN0cnVjdCBuZnRfZGF0YSAqKmRhdGEpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZnRfcmVqZWN0LmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZ0X3JlamVjdC5oCmluZGV4IDYwZmExNTMuLjAyZTI4YzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZnRfcmVqZWN0LmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mdF9yZWplY3QuaApAQCAtOCw2ICs4LDEwIEBACiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBuZnRfcmVqZWN0X3BvbGljeVtdOwogCitpbnQgbmZ0X3JlamVjdF92YWxpZGF0ZShjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LAorCQkJY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkJY29uc3Qgc3RydWN0IG5mdF9kYXRhICoqZGF0YSk7CisKIGludCBuZnRfcmVqZWN0X2luaXQoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKIAkJICAgIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKIAkJICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCB0YltdKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldG5zL2Nvbm50cmFjay5oIGIvaW5jbHVkZS9uZXQvbmV0bnMvY29ubnRyYWNrLmgKaW5kZXggMzhiMWE4MC4uZTQ2OWU4NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0bnMvY29ubnRyYWNrLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0bnMvY29ubnRyYWNrLmgKQEAgLTE1LDEwICsxNSw2IEBACiAjaWZkZWYgQ09ORklHX1NZU0NUTAogCXN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpjdGxfdGFibGVfaGVhZGVyOwogCXN0cnVjdCBjdGxfdGFibGUgICAgICAgICpjdGxfdGFibGU7Ci0jaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVAotCXN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpjdGxfY29tcGF0X2hlYWRlcjsKLQlzdHJ1Y3QgY3RsX3RhYmxlICAgICAgICAqY3RsX2NvbXBhdF90YWJsZTsKLSNlbmRpZgogI2VuZGlmCiAJdW5zaWduZWQgaW50CQl1c2VyczsKIH07CkBAIC01OCwxMCArNTQsNiBAQAogCXN0cnVjdCBuZl91ZHBfbmV0CXVkcDsKIAlzdHJ1Y3QgbmZfaWNtcF9uZXQJaWNtcDsKIAlzdHJ1Y3QgbmZfaWNtcF9uZXQJaWNtcHY2OwotI2lmIGRlZmluZWQoQ09ORklHX1NZU0NUTCkgJiYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUKQotCXN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpjdGxfdGFibGVfaGVhZGVyOwotCXN0cnVjdCBjdGxfdGFibGUJKmN0bF90YWJsZTsKLSNlbmRpZgogfTsKIAogc3RydWN0IGN0X3BjcHUgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0bnMvaXB2NC5oIGIvaW5jbHVkZS9uZXQvbmV0bnMvaXB2NC5oCmluZGV4IGQwNjFmZmUuLjdhZGY0MzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldG5zL2lwdjQuaAorKysgYi9pbmNsdWRlL25ldC9uZXRucy9pcHY0LmgKQEAgLTQwLDcgKzQwLDYgQEAKICNpZmRlZiBDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTCiAJc3RydWN0IGZpYl9ydWxlc19vcHMJKnJ1bGVzX29wczsKIAlib29sCQkJZmliX2hhc19jdXN0b21fcnVsZXM7Ci0Jc3RydWN0IGZpYl90YWJsZSBfX3JjdQkqZmliX2xvY2FsOwogCXN0cnVjdCBmaWJfdGFibGUgX19yY3UJKmZpYl9tYWluOwogCXN0cnVjdCBmaWJfdGFibGUgX19yY3UJKmZpYl9kZWZhdWx0OwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRucy9uZXRmaWx0ZXIuaCBiL2luY2x1ZGUvbmV0L25ldG5zL25ldGZpbHRlci5oCmluZGV4IDM2ZDcyMzUuLjU4NDg3YjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldG5zL25ldGZpbHRlci5oCisrKyBiL2luY2x1ZGUvbmV0L25ldG5zL25ldGZpbHRlci5oCkBAIC0xNiw2ICsxNiw2IEBACiAjaWZkZWYgQ09ORklHX1NZU0NUTAogCXN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpuZl9sb2dfZGlyX2hlYWRlcjsKICNlbmRpZgotCXN0cnVjdCBsaXN0X2hlYWQgaG9va3NbTkZQUk9UT19OVU1QUk9UT11bTkZfTUFYX0hPT0tTXTsKKwlzdHJ1Y3QgbmZfaG9va19lbnRyeSBfX3JjdSAqaG9va3NbTkZQUk9UT19OVU1QUk9UT11bTkZfTUFYX0hPT0tTXTsKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldG5zL3hmcm0uaCBiL2luY2x1ZGUvbmV0L25ldG5zL3hmcm0uaAppbmRleCAyNGNkMzk0Li4yN2JiOTYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRucy94ZnJtLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0bnMveGZybS5oCkBAIC0xMSw3ICsxMSw3IEBACiBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlcjsKIAogc3RydWN0IHhmcm1fcG9saWN5X2hhc2ggewotCXN0cnVjdCBobGlzdF9oZWFkCSp0YWJsZTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZAlfX3JjdSAqdGFibGU7CiAJdW5zaWduZWQgaW50CQlobWFzazsKIAl1OAkJCWRiaXRzNDsKIAl1OAkJCXNiaXRzNDsKQEAgLTM4LDE0ICszOCwxMiBAQAogCSAqIG1vZGUuIEFsc28sIGl0IGNhbiBiZSB1c2VkIGJ5IGFoL2VzcCBpY21wIGVycm9yIGhhbmRsZXIgdG8gZmluZAogCSAqIG9mZmVuZGluZyBTQS4KIAkgKi8KLQlzdHJ1Y3QgaGxpc3RfaGVhZAkqc3RhdGVfYnlkc3Q7Ci0Jc3RydWN0IGhsaXN0X2hlYWQJKnN0YXRlX2J5c3JjOwotCXN0cnVjdCBobGlzdF9oZWFkCSpzdGF0ZV9ieXNwaTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZAlfX3JjdSAqc3RhdGVfYnlkc3Q7CisJc3RydWN0IGhsaXN0X2hlYWQJX19yY3UgKnN0YXRlX2J5c3JjOworCXN0cnVjdCBobGlzdF9oZWFkCV9fcmN1ICpzdGF0ZV9ieXNwaTsKIAl1bnNpZ25lZCBpbnQJCXN0YXRlX2htYXNrOwogCXVuc2lnbmVkIGludAkJc3RhdGVfbnVtOwogCXN0cnVjdCB3b3JrX3N0cnVjdAlzdGF0ZV9oYXNoX3dvcms7Ci0Jc3RydWN0IGhsaXN0X2hlYWQJc3RhdGVfZ2NfbGlzdDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJc3RhdGVfZ2Nfd29yazsKIAogCXN0cnVjdCBsaXN0X2hlYWQJcG9saWN5X2FsbDsKIAlzdHJ1Y3QgaGxpc3RfaGVhZAkqcG9saWN5X2J5aWR4OwpAQCAtNzMsNyArNzEsNyBAQAogCXN0cnVjdCBkc3Rfb3BzCQl4ZnJtNl9kc3Rfb3BzOwogI2VuZGlmCiAJc3BpbmxvY2tfdCB4ZnJtX3N0YXRlX2xvY2s7Ci0Jcndsb2NrX3QgeGZybV9wb2xpY3lfbG9jazsKKwlzcGlubG9ja190IHhmcm1fcG9saWN5X2xvY2s7CiAJc3RydWN0IG11dGV4IHhmcm1fY2ZnX211dGV4OwogCiAJLyogZmxvdyBjYWNoZSBwYXJ0ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9wa3RfY2xzLmggYi9pbmNsdWRlL25ldC9wa3RfY2xzLmgKaW5kZXggNmY4ZDY1My4uNzY3YjAzYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvcGt0X2Nscy5oCisrKyBiL2luY2x1ZGUvbmV0L3BrdF9jbHMuaApAQCAtNTksNyArNTksOCBAQAogc3RydWN0IHRjZl9leHRzIHsKICNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKIAlfX3UzMgl0eXBlOyAvKiBmb3IgYmFja3dhcmQgY29tcGF0KFRDQV9PTERfQ09NUEFUKSAqLwotCXN0cnVjdCBsaXN0X2hlYWQgYWN0aW9uczsKKwlpbnQgbnJfYWN0aW9uczsKKwlzdHJ1Y3QgdGNfYWN0aW9uICoqYWN0aW9uczsKICNlbmRpZgogCS8qIE1hcCB0byBleHBvcnQgY2xhc3NpZmllciBzcGVjaWZpYyBleHRlbnNpb24gVExWIHR5cGVzIHRvIHRoZQogCSAqIGdlbmVyaWMgZXh0ZW5zaW9ucyBBUEkuIFVuc3VwcG9ydGVkIGV4dGVuc2lvbnMgbXVzdCBiZSBzZXQgdG8gMC4KQEAgLTY4LDE0ICs2OSwxOSBAQAogCWludCBwb2xpY2U7CiB9OwogCi1zdGF0aWMgaW5saW5lIHZvaWQgdGNmX2V4dHNfaW5pdChzdHJ1Y3QgdGNmX2V4dHMgKmV4dHMsIGludCBhY3Rpb24sIGludCBwb2xpY2UpCitzdGF0aWMgaW5saW5lIGludCB0Y2ZfZXh0c19pbml0KHN0cnVjdCB0Y2ZfZXh0cyAqZXh0cywgaW50IGFjdGlvbiwgaW50IHBvbGljZSkKIHsKICNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKIAlleHRzLT50eXBlID0gMDsKLQlJTklUX0xJU1RfSEVBRCgmZXh0cy0+YWN0aW9ucyk7CisJZXh0cy0+bnJfYWN0aW9ucyA9IDA7CisJZXh0cy0+YWN0aW9ucyA9IGtjYWxsb2MoVENBX0FDVF9NQVhfUFJJTywgc2l6ZW9mKHN0cnVjdCB0Y19hY3Rpb24gKiksCisJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFleHRzLT5hY3Rpb25zKQorCQlyZXR1cm4gLUVOT01FTTsKICNlbmRpZgogCWV4dHMtPmFjdGlvbiA9IGFjdGlvbjsKIAlleHRzLT5wb2xpY2UgPSBwb2xpY2U7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtODksNyArOTUsNyBAQAogdGNmX2V4dHNfaXNfcHJlZGljYXRpdmUoc3RydWN0IHRjZl9leHRzICpleHRzKQogewogI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAotCXJldHVybiAhbGlzdF9lbXB0eSgmZXh0cy0+YWN0aW9ucyk7CisJcmV0dXJuIGV4dHMtPm5yX2FjdGlvbnM7CiAjZWxzZQogCXJldHVybiAwOwogI2VuZGlmCkBAIC0xMDgsNiArMTE0LDIwIEBACiAJcmV0dXJuIHRjZl9leHRzX2lzX3ByZWRpY2F0aXZlKGV4dHMpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgdGNmX2V4dHNfdG9fbGlzdChjb25zdCBzdHJ1Y3QgdGNmX2V4dHMgKmV4dHMsCisJCQkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKmFjdGlvbnMpCit7CisjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZXh0cy0+bnJfYWN0aW9uczsgaSsrKSB7CisJCXN0cnVjdCB0Y19hY3Rpb24gKmEgPSBleHRzLT5hY3Rpb25zW2ldOworCisJCWxpc3RfYWRkX3RhaWwoJmEtPmxpc3QsIGFjdGlvbnMpOworCX0KKyNlbmRpZgorfQorCiAvKioKICAqIHRjZl9leHRzX2V4ZWMgLSBleGVjdXRlIHRjIGZpbHRlciBleHRlbnNpb25zCiAgKiBAc2tiOiBzb2NrZXQgYnVmZmVyCkBAIC0xMjQsMTIgKzE0NCwyNSBAQAogCSAgICAgICBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQogewogI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAotCWlmICghbGlzdF9lbXB0eSgmZXh0cy0+YWN0aW9ucykpCi0JCXJldHVybiB0Y2ZfYWN0aW9uX2V4ZWMoc2tiLCAmZXh0cy0+YWN0aW9ucywgcmVzKTsKKwlpZiAoZXh0cy0+bnJfYWN0aW9ucykKKwkJcmV0dXJuIHRjZl9hY3Rpb25fZXhlYyhza2IsIGV4dHMtPmFjdGlvbnMsIGV4dHMtPm5yX2FjdGlvbnMsCisJCQkJICAgICAgIHJlcyk7CiAjZW5kaWYKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAorCisjZGVmaW5lIHRjX25vX2FjdGlvbnMoX2V4dHMpICAoKF9leHRzKS0+bnJfYWN0aW9ucyA9PSAwKQorI2RlZmluZSB0Y19zaW5nbGVfYWN0aW9uKF9leHRzKSAoKF9leHRzKS0+bnJfYWN0aW9ucyA9PSAxKQorCisjZWxzZSAvKiBDT05GSUdfTkVUX0NMU19BQ1QgKi8KKworI2RlZmluZSB0Y19ub19hY3Rpb25zKF9leHRzKSB0cnVlCisjZGVmaW5lIHRjX3NpbmdsZV9hY3Rpb24oX2V4dHMpIGZhbHNlCisKKyNlbmRpZiAvKiBDT05GSUdfTkVUX0NMU19BQ1QgKi8KKwogaW50IHRjZl9leHRzX3ZhbGlkYXRlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHRjZl9wcm90byAqdHAsCiAJCSAgICAgIHN0cnVjdCBubGF0dHIgKip0Yiwgc3RydWN0IG5sYXR0ciAqcmF0ZV90bHYsCiAJCSAgICAgIHN0cnVjdCB0Y2ZfZXh0cyAqZXh0cywgYm9vbCBvdnIpOwpAQCAtNDUzLDQgKzQ4NiwyMCBAQAogCXVuc2lnbmVkIGxvbmcgY29va2llOwogfTsKIAorZW51bSB0Y19jbHNicGZfY29tbWFuZCB7CisJVENfQ0xTQlBGX0FERCwKKwlUQ19DTFNCUEZfUkVQTEFDRSwKKwlUQ19DTFNCUEZfREVTVFJPWSwKKwlUQ19DTFNCUEZfU1RBVFMsCit9OworCitzdHJ1Y3QgdGNfY2xzX2JwZl9vZmZsb2FkIHsKKwllbnVtIHRjX2Nsc2JwZl9jb21tYW5kIGNvbW1hbmQ7CisJc3RydWN0IHRjZl9leHRzICpleHRzOworCXN0cnVjdCBicGZfcHJvZyAqcHJvZzsKKwljb25zdCBjaGFyICpuYW1lOworCWJvb2wgZXh0c19pbnRlZ3JhdGVkOworCXUzMiBnZW5fZmxhZ3M7Cit9OworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3BrdF9zY2hlZC5oIGIvaW5jbHVkZS9uZXQvcGt0X3NjaGVkLmgKaW5kZXggN2NhYTk5Yi4uY2QzMzRjOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvcGt0X3NjaGVkLmgKKysrIGIvaW5jbHVkZS9uZXQvcGt0X3NjaGVkLmgKQEAgLTkwLDggKzkwLDggQEAKIHZvaWQgcWRpc2NfZ2V0X2RlZmF1bHQoY2hhciAqaWQsIHNpemVfdCBsZW4pOwogaW50IHFkaXNjX3NldF9kZWZhdWx0KGNvbnN0IGNoYXIgKmlkKTsKIAotdm9pZCBxZGlzY19saXN0X2FkZChzdHJ1Y3QgUWRpc2MgKnEpOwotdm9pZCBxZGlzY19saXN0X2RlbChzdHJ1Y3QgUWRpc2MgKnEpOwordm9pZCBxZGlzY19oYXNoX2FkZChzdHJ1Y3QgUWRpc2MgKnEpOwordm9pZCBxZGlzY19oYXNoX2RlbChzdHJ1Y3QgUWRpc2MgKnEpOwogc3RydWN0IFFkaXNjICpxZGlzY19sb29rdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGhhbmRsZSk7CiBzdHJ1Y3QgUWRpc2MgKnFkaXNjX2xvb2t1cF9jbGFzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgaGFuZGxlKTsKIHN0cnVjdCBxZGlzY19yYXRlX3RhYmxlICpxZGlzY19nZXRfcnRhYihzdHJ1Y3QgdGNfcmF0ZXNwZWMgKnIsCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9wcHRwLmggYi9pbmNsdWRlL25ldC9wcHRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJlOWYxZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L3BwdHAuaApAQCAtMCwwICsxLDIzIEBACisjaWZuZGVmIF9ORVRfUFBUUF9ICisjZGVmaW5lIF9ORVRfUFBUUF9ICisKKyNkZWZpbmUgUFBQX0xDUF9FQ0hPUkVRIDB4MDkKKyNkZWZpbmUgUFBQX0xDUF9FQ0hPUkVQIDB4MEEKKyNkZWZpbmUgU0NfUkNWX0JJVFMgICAgIChTQ19SQ1ZfQjdfMXxTQ19SQ1ZfQjdfMHxTQ19SQ1ZfT0REUHxTQ19SQ1ZfRVZOUCkKKworI2RlZmluZSBNSVNTSU5HX1dJTkRPVyAyMAorI2RlZmluZSBXUkFQUEVEKGN1cnNlcSwgbGFzdHNlcSlcCisJKCgoKGN1cnNlcSkgJiAweGZmZmZmZjAwKSA9PSAwKSAmJlwKKwkoKChsYXN0c2VxKSAmIDB4ZmZmZmZmMDApID09IDB4ZmZmZmZmMDApKQorCisjZGVmaW5lIFBQVFBfSEVBREVSX09WRVJIRUFEICgyK3NpemVvZihzdHJ1Y3QgcHB0cF9ncmVfaGVhZGVyKSkKK3N0cnVjdCBwcHRwX2dyZV9oZWFkZXIgeworCXN0cnVjdCBncmVfYmFzZV9oZHIgZ3JlX2hkOworCV9fYmUxNiBwYXlsb2FkX2xlbjsKKwlfX2JlMTYgY2FsbF9pZDsKKwlfX2JlMzIgc2VxOworCV9fYmUzMiBhY2s7Cit9IF9fcGFja2VkOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcm91dGUuaCBiL2luY2x1ZGUvbmV0L3JvdXRlLmgKaW5kZXggYWQ3NzdkNy4uMDQyOWQ0NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvcm91dGUuaAorKysgYi9pbmNsdWRlL25ldC9yb3V0ZS5oCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8bmV0L2Zsb3cuaD4KICNpbmNsdWRlIDxuZXQvaW5ldF9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L2lwX2ZpYi5oPgotI2luY2x1ZGUgPG5ldC9sM21kZXYuaD4KICNpbmNsdWRlIDxsaW51eC9pbl9yb3V0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CkBAIC0yODUsMTUgKzI4NCw2IEBACiAJaXBfcm91dGVfY29ubmVjdF9pbml0KGZsNCwgZHN0LCBzcmMsIHRvcywgb2lmLCBwcm90b2NvbCwKIAkJCSAgICAgIHNwb3J0LCBkcG9ydCwgc2spOwogCi0JaWYgKCFzcmMgJiYgb2lmKSB7Ci0JCWludCByYzsKLQotCQlyYyA9IGwzbWRldl9nZXRfc2FkZHIobmV0LCBvaWYsIGZsNCk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gRVJSX1BUUihyYyk7Ci0KLQkJc3JjID0gZmw0LT5zYWRkcjsKLQl9CiAJaWYgKCFkc3QgfHwgIXNyYykgewogCQlydCA9IF9faXBfcm91dGVfb3V0cHV0X2tleShuZXQsIGZsNCk7CiAJCWlmIChJU19FUlIocnQpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2NoX2dlbmVyaWMuaCBiL2luY2x1ZGUvbmV0L3NjaF9nZW5lcmljLmgKaW5kZXggOTA5YWZmMi4uZTZhYTBhMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2NoX2dlbmVyaWMuaAorKysgYi9pbmNsdWRlL25ldC9zY2hfZ2VuZXJpYy5oCkBAIC0zNiw2ICszNiwxNCBAQAogCXUxNgkJCWRhdGFbXTsKIH07CiAKKy8qIHNpbWlsYXIgdG8gc2tfYnVmZl9oZWFkLCBidXQgc2tiLT5wcmV2IHBvaW50ZXIgaXMgdW5kZWZpbmVkLiAqLworc3RydWN0IHFkaXNjX3NrYl9oZWFkIHsKKwlzdHJ1Y3Qgc2tfYnVmZgkqaGVhZDsKKwlzdHJ1Y3Qgc2tfYnVmZgkqdGFpbDsKKwlfX3UzMgkJcWxlbjsKKwlzcGlubG9ja190CWxvY2s7Cit9OworCiBzdHJ1Y3QgUWRpc2MgewogCWludCAJCQkoKmVucXVldWUpKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJCSAgIHN0cnVjdCBRZGlzYyAqc2NoLApAQCAtNjEsNyArNjksNyBAQAogCXUzMgkJCWxpbWl0OwogCWNvbnN0IHN0cnVjdCBRZGlzY19vcHMJKm9wczsKIAlzdHJ1Y3QgcWRpc2Nfc2l6ZV90YWJsZQlfX3JjdSAqc3RhYjsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJc3RydWN0IGhsaXN0X25vZGUgICAgICAgaGFzaDsKIAl1MzIJCQloYW5kbGU7CiAJdTMyCQkJcGFyZW50OwogCXZvaWQJCQkqdTMyX25vZGU7CkBAIC03Niw3ICs4NCw3IEBACiAJICogRm9yIHBlcmZvcm1hbmNlIHNha2Ugb24gU01QLCB3ZSBwdXQgaGlnaGx5IG1vZGlmaWVkIGZpZWxkcyBhdCB0aGUgZW5kCiAJICovCiAJc3RydWN0IHNrX2J1ZmYJCSpnc29fc2tiIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7Ci0Jc3RydWN0IHNrX2J1ZmZfaGVhZAlxOworCXN0cnVjdCBxZGlzY19za2JfaGVhZAlxOwogCXN0cnVjdCBnbmV0X3N0YXRzX2Jhc2ljX3BhY2tlZCBic3RhdHM7CiAJc2VxY291bnRfdAkJcnVubmluZzsKIAlzdHJ1Y3QgZ25ldF9zdGF0c19xdWV1ZQlxc3RhdHM7CkBAIC01OTIsNyArNjAwLDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHFkaXNjX3FzdGF0c19jcHVfZHJvcChzdHJ1Y3QgUWRpc2MgKnNjaCkKIHsKLQlxc3RhdHNfZHJvcF9pbmModGhpc19jcHVfcHRyKHNjaC0+Y3B1X3FzdGF0cykpOworCXRoaXNfY3B1X2luYyhzY2gtPmNwdV9xc3RhdHMtPmRyb3BzKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHFkaXNjX3FzdGF0c19vdmVybGltaXQoc3RydWN0IFFkaXNjICpzY2gpCkBAIC02MDAsMTAgKzYwOCwyNyBAQAogCXNjaC0+cXN0YXRzLm92ZXJsaW1pdHMrKzsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgX19xZGlzY19lbnF1ZXVlX3RhaWwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFFkaXNjICpzY2gsCi0JCQkJICAgICAgIHN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QpCitzdGF0aWMgaW5saW5lIHZvaWQgcWRpc2Nfc2tiX2hlYWRfaW5pdChzdHJ1Y3QgcWRpc2Nfc2tiX2hlYWQgKnFoKQogewotCV9fc2tiX3F1ZXVlX3RhaWwobGlzdCwgc2tiKTsKKwlxaC0+aGVhZCA9IE5VTEw7CisJcWgtPnRhaWwgPSBOVUxMOworCXFoLT5xbGVuID0gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19xZGlzY19lbnF1ZXVlX3RhaWwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFFkaXNjICpzY2gsCisJCQkJICAgICAgIHN0cnVjdCBxZGlzY19za2JfaGVhZCAqcWgpCit7CisJc3RydWN0IHNrX2J1ZmYgKmxhc3QgPSBxaC0+dGFpbDsKKworCWlmIChsYXN0KSB7CisJCXNrYi0+bmV4dCA9IE5VTEw7CisJCWxhc3QtPm5leHQgPSBza2I7CisJCXFoLT50YWlsID0gc2tiOworCX0gZWxzZSB7CisJCXFoLT50YWlsID0gc2tiOworCQlxaC0+aGVhZCA9IHNrYjsKKwl9CisJcWgtPnFsZW4rKzsKIAlxZGlzY19xc3RhdHNfYmFja2xvZ19pbmMoc2NoLCBza2IpOwogCiAJcmV0dXJuIE5FVF9YTUlUX1NVQ0NFU1M7CkBAIC02MTQsMTQgKzYzOSwxNiBAQAogCXJldHVybiBfX3FkaXNjX2VucXVldWVfdGFpbChza2IsIHNjaCwgJnNjaC0+cSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKl9fcWRpc2NfZGVxdWV1ZV9oZWFkKHN0cnVjdCBRZGlzYyAqc2NoLAotCQkJCQkJICAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKl9fcWRpc2NfZGVxdWV1ZV9oZWFkKHN0cnVjdCBxZGlzY19za2JfaGVhZCAqcWgpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IF9fc2tiX2RlcXVldWUobGlzdCk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHFoLT5oZWFkOwogCiAJaWYgKGxpa2VseShza2IgIT0gTlVMTCkpIHsKLQkJcWRpc2NfcXN0YXRzX2JhY2tsb2dfZGVjKHNjaCwgc2tiKTsKLQkJcWRpc2NfYnN0YXRzX3VwZGF0ZShzY2gsIHNrYik7CisJCXFoLT5oZWFkID0gc2tiLT5uZXh0OworCQlxaC0+cWxlbi0tOworCQlpZiAocWgtPmhlYWQgPT0gTlVMTCkKKwkJCXFoLT50YWlsID0gTlVMTDsKKwkJc2tiLT5uZXh0ID0gTlVMTDsKIAl9CiAKIAlyZXR1cm4gc2tiOwpAQCAtNjI5LDcgKzY1NiwxNCBAQAogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpxZGlzY19kZXF1ZXVlX2hlYWQoc3RydWN0IFFkaXNjICpzY2gpCiB7Ci0JcmV0dXJuIF9fcWRpc2NfZGVxdWV1ZV9oZWFkKHNjaCwgJnNjaC0+cSk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IF9fcWRpc2NfZGVxdWV1ZV9oZWFkKCZzY2gtPnEpOworCisJaWYgKGxpa2VseShza2IgIT0gTlVMTCkpIHsKKwkJcWRpc2NfcXN0YXRzX2JhY2tsb2dfZGVjKHNjaCwgc2tiKTsKKwkJcWRpc2NfYnN0YXRzX3VwZGF0ZShzY2gsIHNrYik7CisJfQorCisJcmV0dXJuIHNrYjsKIH0KIAogLyogSW5zdGVhZCBvZiBjYWxsaW5nIGtmcmVlX3NrYigpIHdoaWxlIHJvb3QgcWRpc2MgbG9jayBpcyBoZWxkLApAQCAtNjQyLDEwICs2NzYsMTAgQEAKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgX19xZGlzY19xdWV1ZV9kcm9wX2hlYWQoc3RydWN0IFFkaXNjICpzY2gsCi0JCQkJCQkgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0LAorCQkJCQkJICAgc3RydWN0IHFkaXNjX3NrYl9oZWFkICpxaCwKIAkJCQkJCSAgIHN0cnVjdCBza19idWZmICoqdG9fZnJlZSkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gX19za2JfZGVxdWV1ZShsaXN0KTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gX19xZGlzY19kZXF1ZXVlX2hlYWQocWgpOwogCiAJaWYgKGxpa2VseShza2IgIT0gTlVMTCkpIHsKIAkJdW5zaWduZWQgaW50IGxlbiA9IHFkaXNjX3BrdF9sZW4oc2tiKTsKQEAgLTY2Niw3ICs3MDAsOSBAQAogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpxZGlzY19wZWVrX2hlYWQoc3RydWN0IFFkaXNjICpzY2gpCiB7Ci0JcmV0dXJuIHNrYl9wZWVrKCZzY2gtPnEpOworCWNvbnN0IHN0cnVjdCBxZGlzY19za2JfaGVhZCAqcWggPSAmc2NoLT5xOworCisJcmV0dXJuIHFoLT5oZWFkOwogfQogCiAvKiBnZW5lcmljIHBzZXVkbyBwZWVrIG1ldGhvZCBmb3Igbm9uLXdvcmstY29uc2VydmluZyBxZGlzYyAqLwpAQCAtNzAxLDE1ICs3MzcsMTkgQEAKIAlyZXR1cm4gc2tiOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19xZGlzY19yZXNldF9xdWV1ZShzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0KQorc3RhdGljIGlubGluZSB2b2lkIF9fcWRpc2NfcmVzZXRfcXVldWUoc3RydWN0IHFkaXNjX3NrYl9oZWFkICpxaCkKIHsKIAkvKgogCSAqIFdlIGRvIG5vdCBrbm93IHRoZSBiYWNrbG9nIGluIGJ5dGVzIG9mIHRoaXMgbGlzdCwgaXQKIAkgKiBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGNvcnJlY3QgaXQKIAkgKi8KLQlpZiAoIXNrYl9xdWV1ZV9lbXB0eShsaXN0KSkgewotCQlydG5sX2tmcmVlX3NrYnMobGlzdC0+bmV4dCwgbGlzdC0+cHJldik7Ci0JCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdChsaXN0KTsKKwlBU1NFUlRfUlROTCgpOworCWlmIChxaC0+cWxlbikgeworCQlydG5sX2tmcmVlX3NrYnMocWgtPmhlYWQsIHFoLT50YWlsKTsKKworCQlxaC0+aGVhZCA9IE5VTEw7CisJCXFoLT50YWlsID0gTlVMTDsKKwkJcWgtPnFsZW4gPSAwOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC9zY3RwLmggYi9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaAppbmRleCA2MzJlMjA1Li44N2E3ZjQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaApAQCAtODMsOSArODMsOSBAQAogI2VuZGlmCiAKIC8qIFJvdW5kIGFuIGludCB1cCB0byB0aGUgbmV4dCBtdWx0aXBsZSBvZiA0LiAgKi8KLSNkZWZpbmUgV09SRF9ST1VORChzKSAoKChzKSszKSZ+MykKKyNkZWZpbmUgU0NUUF9QQUQ0KHMpICgoKHMpKzMpJn4zKQogLyogVHJ1bmNhdGUgdG8gdGhlIHByZXZpb3VzIG11bHRpcGxlIG9mIDQuICAqLwotI2RlZmluZSBXT1JEX1RSVU5DKHMpICgocykmfjMpCisjZGVmaW5lIFNDVFBfVFJVTkM0KHMpICgocykmfjMpCiAKIC8qCiAgKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMuCkBAIC00MzMsNyArNDMzLDcgQEAKIAlpZiAoYXNvYy0+dXNlcl9mcmFnKQogCQlmcmFnID0gbWluX3QoaW50LCBmcmFnLCBhc29jLT51c2VyX2ZyYWcpOwogCi0JZnJhZyA9IFdPUkRfVFJVTkMobWluX3QoaW50LCBmcmFnLCBTQ1RQX01BWF9DSFVOS19MRU4pKTsKKwlmcmFnID0gU0NUUF9UUlVOQzQobWluX3QoaW50LCBmcmFnLCBTQ1RQX01BWF9DSFVOS19MRU4pKTsKIAogCXJldHVybiBmcmFnOwogfQpAQCAtNDYyLDcgKzQ2Miw3IEBACiBmb3IgKHBvcy52ID0gY2h1bmstPm1lbWJlcjtcCiAgICAgIHBvcy52IDw9ICh2b2lkICopY2h1bmsgKyBlbmQgLSBudG9ocyhwb3MucC0+bGVuZ3RoKSAmJlwKICAgICAgbnRvaHMocG9zLnAtPmxlbmd0aCkgPj0gc2l6ZW9mKHNjdHBfcGFyYW1oZHJfdCk7XAotICAgICBwb3MudiArPSBXT1JEX1JPVU5EKG50b2hzKHBvcy5wLT5sZW5ndGgpKSkKKyAgICAgcG9zLnYgKz0gU0NUUF9QQUQ0KG50b2hzKHBvcy5wLT5sZW5ndGgpKSkKIAogI2RlZmluZSBzY3RwX3dhbGtfZXJyb3JzKGVyciwgY2h1bmtfaGRyKVwKIF9zY3RwX3dhbGtfZXJyb3JzKChlcnIpLCAoY2h1bmtfaGRyKSwgbnRvaHMoKGNodW5rX2hkciktPmxlbmd0aCkpCkBAIC00NzIsNyArNDcyLDcgQEAKIAkgICAgc2l6ZW9mKHNjdHBfY2h1bmtoZHJfdCkpO1wKICAgICAgKHZvaWQgKillcnIgPD0gKHZvaWQgKiljaHVua19oZHIgKyBlbmQgLSBudG9ocyhlcnItPmxlbmd0aCkgJiZcCiAgICAgIG50b2hzKGVyci0+bGVuZ3RoKSA+PSBzaXplb2Yoc2N0cF9lcnJoZHJfdCk7IFwKLSAgICAgZXJyID0gKHNjdHBfZXJyaGRyX3QgKikoKHZvaWQgKillcnIgKyBXT1JEX1JPVU5EKG50b2hzKGVyci0+bGVuZ3RoKSkpKQorICAgICBlcnIgPSAoc2N0cF9lcnJoZHJfdCAqKSgodm9pZCAqKWVyciArIFNDVFBfUEFENChudG9ocyhlcnItPmxlbmd0aCkpKSkKIAogI2RlZmluZSBzY3RwX3dhbGtfZndkdHNuKHBvcywgY2h1bmspXAogX3NjdHBfd2Fsa19md2R0c24oKHBvcyksIChjaHVuayksIG50b2hzKChjaHVuayktPmNodW5rX2hkci0+bGVuZ3RoKSAtIHNpemVvZihzdHJ1Y3Qgc2N0cF9md2R0c25fY2h1bmspKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC9zbS5oIGIvaW5jbHVkZS9uZXQvc2N0cC9zbS5oCmluZGV4IGVmYzAxNzQuLmNhNmM5NzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvc20uaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3NtLmgKQEAgLTMwNyw4NSArMzA3LDI3IEBACiB9CiAKIC8qIENvbXBhcmUgdHdvIFRTTnMgKi8KKyNkZWZpbmUgVFNOX2x0KGEsYikJXAorCSh0eXBlY2hlY2soX191MzIsIGEpICYmIFwKKwkgdHlwZWNoZWNrKF9fdTMyLCBiKSAmJiBcCisJICgoX19zMzIpKChhKSAtIChiKSkgPCAwKSkKIAotLyogUkZDIDE5ODIgLSBTZXJpYWwgTnVtYmVyIEFyaXRobWV0aWMKLSAqCi0gKiAyLiBDb21wYXJpc29uCi0gKiAgVGhlbiwgczEgaXMgc2FpZCB0byBiZSBlcXVhbCB0byBzMiBpZiBhbmQgb25seSBpZiBpMSBpcyBlcXVhbCB0byBpMiwKLSAqICBpbiBhbGwgb3RoZXIgY2FzZXMsIHMxIGlzIG5vdCBlcXVhbCB0byBzMi4KLSAqCi0gKiBzMSBpcyBzYWlkIHRvIGJlIGxlc3MgdGhhbiBzMiBpZiwgYW5kIG9ubHkgaWYsIHMxIGlzIG5vdCBlcXVhbCB0byBzMiwKLSAqIGFuZAotICoKLSAqICAgICAgKGkxIDwgaTIgYW5kIGkyIC0gaTEgPCAyXihTRVJJQUxfQklUUyAtIDEpKSBvcgotICogICAgICAoaTEgPiBpMiBhbmQgaTEgLSBpMiA+IDJeKFNFUklBTF9CSVRTIC0gMSkpCi0gKgotICogczEgaXMgc2FpZCB0byBiZSBncmVhdGVyIHRoYW4gczIgaWYsIGFuZCBvbmx5IGlmLCBzMSBpcyBub3QgZXF1YWwgdG8KLSAqIHMyLCBhbmQKLSAqCi0gKiAgICAgIChpMSA8IGkyIGFuZCBpMiAtIGkxID4gMl4oU0VSSUFMX0JJVFMgLSAxKSkgb3IKLSAqICAgICAgKGkxID4gaTIgYW5kIGkxIC0gaTIgPCAyXihTRVJJQUxfQklUUyAtIDEpKQotICovCi0KLS8qCi0gKiBSRkMgMjk2MAotICogIDEuNiBTZXJpYWwgTnVtYmVyIEFyaXRobWV0aWMKLSAqCi0gKiBDb21wYXJpc29ucyBhbmQgYXJpdGhtZXRpYyBvbiBUU05zIGluIHRoaXMgZG9jdW1lbnQgU0hPVUxEIHVzZSBTZXJpYWwKLSAqIE51bWJlciBBcml0aG1ldGljIGFzIGRlZmluZWQgaW4gW1JGQzE5ODJdIHdoZXJlIFNFUklBTF9CSVRTID0gMzIuCi0gKi8KLQotZW51bSB7Ci0JVFNOX1NJR05fQklUID0gKDE8PDMxKQotfTsKLQotc3RhdGljIGlubGluZSBpbnQgVFNOX2x0KF9fdTMyIHMsIF9fdTMyIHQpCi17Ci0JcmV0dXJuICgocykgLSAodCkpICYgVFNOX1NJR05fQklUOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBUU05fbHRlKF9fdTMyIHMsIF9fdTMyIHQpCi17Ci0JcmV0dXJuICgocykgPT0gKHQpKSB8fCAoKChzKSAtICh0KSkgJiBUU05fU0lHTl9CSVQpOwotfQorI2RlZmluZSBUU05fbHRlKGEsYikJXAorCSh0eXBlY2hlY2soX191MzIsIGEpICYmIFwKKwkgdHlwZWNoZWNrKF9fdTMyLCBiKSAmJiBcCisJICgoX19zMzIpKChhKSAtIChiKSkgPD0gMCkpCiAKIC8qIENvbXBhcmUgdHdvIFNTTnMgKi8KKyNkZWZpbmUgU1NOX2x0KGEsYikJCVwKKwkodHlwZWNoZWNrKF9fdTE2LCBhKSAmJiBcCisJIHR5cGVjaGVjayhfX3UxNiwgYikgJiYgXAorCSAoKF9fczE2KSgoYSkgLSAoYikpIDwgMCkpCiAKLS8qCi0gKiBSRkMgMjk2MAotICogIDEuNiBTZXJpYWwgTnVtYmVyIEFyaXRobWV0aWMKLSAqCi0gKiBDb21wYXJpc29ucyBhbmQgYXJpdGhtZXRpYyBvbiBTdHJlYW0gU2VxdWVuY2UgTnVtYmVycyBpbiB0aGlzIGRvY3VtZW50Ci0gKiBTSE9VTEQgdXNlIFNlcmlhbCBOdW1iZXIgQXJpdGhtZXRpYyBhcyBkZWZpbmVkIGluIFtSRkMxOTgyXSB3aGVyZQotICogU0VSSUFMX0JJVFMgPSAxNi4KLSAqLwotZW51bSB7Ci0JU1NOX1NJR05fQklUID0gKDE8PDE1KQotfTsKLQotc3RhdGljIGlubGluZSBpbnQgU1NOX2x0KF9fdTE2IHMsIF9fdTE2IHQpCi17Ci0JcmV0dXJuICgocykgLSAodCkpICYgU1NOX1NJR05fQklUOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBTU05fbHRlKF9fdTE2IHMsIF9fdTE2IHQpCi17Ci0JcmV0dXJuICgocykgPT0gKHQpKSB8fCAoKChzKSAtICh0KSkgJiBTU05fU0lHTl9CSVQpOwotfQotCi0vKgotICogQURESVAgMy4xLjEKLSAqIFRoZSB2YWxpZCByYW5nZSBvZiBTZXJpYWwgTnVtYmVyIGlzIGZyb20gMCB0byA0Mjk0OTY3Mjk1ICgyKiozMiAtIDEpLiBTZXJpYWwKLSAqIE51bWJlcnMgd3JhcCBiYWNrIHRvIDAgYWZ0ZXIgcmVhY2hpbmcgNDI5NDk2NzI5NS4KLSAqLwotZW51bSB7Ci0JQURESVBfU0VSSUFMX1NJR05fQklUID0gKDE8PDMxKQotfTsKLQotc3RhdGljIGlubGluZSBpbnQgQURESVBfU0VSSUFMX2d0ZShfX3UxNiBzLCBfX3UxNiB0KQotewotCXJldHVybiAoKHMpID09ICh0KSkgfHwgKCgodCkgLSAocykpICYgQURESVBfU0VSSUFMX1NJR05fQklUKTsKLX0KKy8qIEFERElQIDMuMS4xICovCisjZGVmaW5lIEFERElQX1NFUklBTF9ndGUoYSxiKQlcCisJKHR5cGVjaGVjayhfX3UzMiwgYSkgJiYgXAorCSB0eXBlY2hlY2soX191MzIsIGIpICYmIFwKKwkgKChfX3MzMikoKGIpIC0gKGEpKSA8PSAwKSkKIAogLyogQ2hlY2sgVlRBRyBvZiB0aGUgcGFja2V0IG1hdGNoZXMgdGhlIHNlbmRlcidzIG93biB0YWcuICovCiBzdGF0aWMgaW5saW5lIGludApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmggYi9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaAppbmRleCBjZTkzYzRiLi4xMWMzYmYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaApAQCAtNTM3LDYgKzUzNyw3IEBACiBzdHJ1Y3Qgc2N0cF9kYXRhbXNnICpzY3RwX2RhdGFtc2dfZnJvbV91c2VyKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICosCiAJCQkJCSAgICBzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICosCiAJCQkJCSAgICBzdHJ1Y3QgaW92X2l0ZXIgKik7Cit2b2lkIHNjdHBfZGF0YW1zZ19mcmVlKHN0cnVjdCBzY3RwX2RhdGFtc2cgKik7CiB2b2lkIHNjdHBfZGF0YW1zZ19wdXQoc3RydWN0IHNjdHBfZGF0YW1zZyAqKTsKIHZvaWQgc2N0cF9jaHVua19mYWlsKHN0cnVjdCBzY3RwX2NodW5rICosIGludCBlcnJvcik7CiBpbnQgc2N0cF9jaHVua19hYmFuZG9uZWQoc3RydWN0IHNjdHBfY2h1bmsgKik7CkBAIC01NTQsNiArNTU1LDkgQEAKIAogCWF0b21pY190IHJlZmNudDsKIAorCS8qIEhvdyBtYW55IHRpbWVzIHRoaXMgY2h1bmsgaGF2ZSBiZWVuIHNlbnQsIGZvciBwcnNjdHAgUlRYIHBvbGljeSAqLworCWludCBzZW50X2NvdW50OworCiAJLyogVGhpcyBpcyBvdXIgbGluayB0byB0aGUgcGVyLXRyYW5zcG9ydCB0cmFuc21pdHRlZCBsaXN0LiAgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIHRyYW5zbWl0dGVkX2xpc3Q7CiAKQEAgLTYwMywxNiArNjA3LDYgQEAKIAkvKiBUaGlzIG5lZWRzIHRvIGJlIHJlY292ZXJhYmxlIGZvciBTQ1RQX1NFTkRfRkFJTEVEIGV2ZW50cy4gKi8KIAlzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvIHNpbmZvOwogCi0JLyogV2UgdXNlIHRoaXMgZmllbGQgdG8gcmVjb3JkIHBhcmFtIGZvciBwcnNjdHAgcG9saWNpZXMsCi0JICogZm9yIFRUTCBwb2xpY3ksIGl0IGlzIHRoZSB0aW1lX3RvX2Ryb3Agb2YgdGhpcyBjaHVuaywKLQkgKiBmb3IgUlRYIHBvbGljeSwgaXQgaXMgdGhlIG1heF9zZW50X2NvdW50IG9mIHRoaXMgY2h1bmssCi0JICogZm9yIFBSSU8gcG9saWN5LCBpdCBpcyB0aGUgcHJpb3JpdHkgb2YgdGhpcyBjaHVuay4KLQkgKi8KLQl1bnNpZ25lZCBsb25nIHByc2N0cF9wYXJhbTsKLQotCS8qIEhvdyBtYW55IHRpbWVzIHRoaXMgY2h1bmsgaGF2ZSBiZWVuIHNlbnQsIGZvciBwcnNjdHAgUlRYIHBvbGljeSAqLwotCWludCBzZW50X2NvdW50OwotCiAJLyogV2hpY2ggYXNzb2NpYXRpb24gZG9lcyB0aGlzIGJlbG9uZyB0bz8gICovCiAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CiAKQEAgLTEwNzYsNyArMTA3MCw3IEBACiB2b2lkIHNjdHBfb3V0cV9pbml0KHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICosIHN0cnVjdCBzY3RwX291dHEgKik7CiB2b2lkIHNjdHBfb3V0cV90ZWFyZG93bihzdHJ1Y3Qgc2N0cF9vdXRxICopOwogdm9pZCBzY3RwX291dHFfZnJlZShzdHJ1Y3Qgc2N0cF9vdXRxKik7Ci1pbnQgc2N0cF9vdXRxX3RhaWwoc3RydWN0IHNjdHBfb3V0cSAqLCBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssIGdmcF90KTsKK3ZvaWQgc2N0cF9vdXRxX3RhaWwoc3RydWN0IHNjdHBfb3V0cSAqLCBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssIGdmcF90KTsKIGludCBzY3RwX291dHFfc2FjayhzdHJ1Y3Qgc2N0cF9vdXRxICosIHN0cnVjdCBzY3RwX2NodW5rICopOwogaW50IHNjdHBfb3V0cV9pc19lbXB0eShjb25zdCBzdHJ1Y3Qgc2N0cF9vdXRxICopOwogdm9pZCBzY3RwX291dHFfcmVzdGFydChzdHJ1Y3Qgc2N0cF9vdXRxICopOwpAQCAtMTA4NCw3ICsxMDc4LDcgQEAKIHZvaWQgc2N0cF9yZXRyYW5zbWl0KHN0cnVjdCBzY3RwX291dHEgKiwgc3RydWN0IHNjdHBfdHJhbnNwb3J0ICosCiAJCSAgICAgc2N0cF9yZXRyYW5zbWl0X3JlYXNvbl90KTsKIHZvaWQgc2N0cF9yZXRyYW5zbWl0X21hcmsoc3RydWN0IHNjdHBfb3V0cSAqLCBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKiwgX191OCk7Ci1pbnQgc2N0cF9vdXRxX3VuY29yayhzdHJ1Y3Qgc2N0cF9vdXRxICosIGdmcF90IGdmcCk7Cit2b2lkIHNjdHBfb3V0cV91bmNvcmsoc3RydWN0IHNjdHBfb3V0cSAqLCBnZnBfdCBnZnApOwogdm9pZCBzY3RwX3Byc2N0cF9wcnVuZShzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKIAkJICAgICAgIHN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKnNpbmZvLCBpbnQgbXNnX2xlbik7CiAvKiBVbmNvcmsgYW5kIGZsdXNoIGFuIG91dHF1ZXVlLiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NvY2suaCBiL2luY2x1ZGUvbmV0L3NvY2suaAppbmRleCBmZjViZTdlLi5lYmY3NWRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zb2NrLmgKKysrIGIvaW5jbHVkZS9uZXQvc29jay5oCkBAIC0xMDIwLDcgKzEwMjAsNiBAQAogCXZvaWQJCQkoKnVuaGFzaCkoc3RydWN0IHNvY2sgKnNrKTsKIAl2b2lkCQkJKCpyZWhhc2gpKHN0cnVjdCBzb2NrICpzayk7CiAJaW50CQkJKCpnZXRfcG9ydCkoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBzaG9ydCBzbnVtKTsKLQl2b2lkCQkJKCpjbGVhcl9zaykoc3RydWN0IHNvY2sgKnNrLCBpbnQgc2l6ZSk7CiAKIAkvKiBLZWVwaW5nIHRyYWNrIG9mIHNvY2tldHMgaW4gdXNlICovCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKQEAgLTExMTQsNiArMTExMywxNiBAQAogCSAgICAgICBza19zdHJlYW1fbWVtb3J5X2ZyZWUoc2spOwogfQogCitzdGF0aWMgaW5saW5lIGludCBza191bmRlcl9jZ3JvdXBfaGllcmFyY2h5KHN0cnVjdCBzb2NrICpzaywKKwkJCQkJICAgIHN0cnVjdCBjZ3JvdXAgKmFuY2VzdG9yKQoreworI2lmZGVmIENPTkZJR19TT0NLX0NHUk9VUF9EQVRBCisJcmV0dXJuIGNncm91cF9pc19kZXNjZW5kYW50KHNvY2tfY2dyb3VwX3B0cigmc2stPnNrX2NncnBfZGF0YSksCisJCQkJICAgIGFuY2VzdG9yKTsKKyNlbHNlCisJcmV0dXJuIC1FTk9UU1VQUDsKKyNlbmRpZgorfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgc2tfaGFzX21lbW9yeV9wcmVzc3VyZShjb25zdCBzdHJ1Y3Qgc29jayAqc2spCiB7CkBAIC0xMjMyLDggKzEyNDEsNiBAQAogCXJldHVybiBzay0+c2tfcHJvdC0+aGFzaChzayk7CiB9CiAKLXZvaWQgc2tfcHJvdF9jbGVhcl9wb3J0YWRkcl9udWxscyhzdHJ1Y3Qgc29jayAqc2ssIGludCBzaXplKTsKLQogLyogQWJvdXQgMTAgc2Vjb25kcyAqLwogI2RlZmluZSBTT0NLX0RFU1RST1lfVElNRSAoMTAqSFopCiAKQEAgLTEzMzIsNiArMTMzOSwxNiBAQAogCWlmICghc2tfaGFzX2FjY291bnQoc2spKQogCQlyZXR1cm47CiAJc2stPnNrX2ZvcndhcmRfYWxsb2MgKz0gc2l6ZTsKKworCS8qIEF2b2lkIGEgcG9zc2libGUgb3ZlcmZsb3cuCisJICogVENQIHNlbmQgcXVldWVzIGNhbiBtYWtlIHRoaXMgaGFwcGVuLCBpZiBza19tZW1fcmVjbGFpbSgpCisJICogaXMgbm90IGNhbGxlZCBhbmQgbW9yZSB0aGFuIDIgR0J5dGVzIGFyZSByZWxlYXNlZCBhdCBvbmNlLgorCSAqCisJICogSWYgd2UgcmVhY2ggMiBNQnl0ZXMsIHJlY2xhaW0gMSBNQnl0ZXMgcmlnaHQgbm93LCB0aGVyZSBpcworCSAqIG5vIG5lZWQgdG8gaG9sZCB0aGF0IG11Y2ggZm9yd2FyZCBhbGxvY2F0aW9uIGFueXdheS4KKwkgKi8KKwlpZiAodW5saWtlbHkoc2stPnNrX2ZvcndhcmRfYWxsb2MgPj0gMSA8PCAyMSkpCisJCV9fc2tfbWVtX3JlY2xhaW0oc2ssIDEgPDwgMjApOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2tfd21lbV9mcmVlX3NrYihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zdHJwYXJzZXIuaCBiL2luY2x1ZGUvbmV0L3N0cnBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMjhhZDkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25ldC9zdHJwYXJzZXIuaApAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIFN0cmVhbSBQYXJzZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgVG9tIEhlcmJlcnQgPHRvbUBoZXJiZXJ0bGFuZC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fTkVUX1NUUlBBUlNFUl9IXworI2RlZmluZSBfX05FVF9TVFJQQVJTRVJfSF8KKworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKKyNkZWZpbmUgU1RSUF9TVEFUU19BREQoc3RhdCwgY291bnQpICgoc3RhdCkgKz0gKGNvdW50KSkKKyNkZWZpbmUgU1RSUF9TVEFUU19JTkNSKHN0YXQpICgoc3RhdCkrKykKKworc3RydWN0IHN0cnBfc3RhdHMgeworCXVuc2lnbmVkIGxvbmcgbG9uZyByeF9tc2dzOworCXVuc2lnbmVkIGxvbmcgbG9uZyByeF9ieXRlczsKKwl1bnNpZ25lZCBpbnQgcnhfbWVtX2ZhaWw7CisJdW5zaWduZWQgaW50IHJ4X25lZWRfbW9yZV9oZHI7CisJdW5zaWduZWQgaW50IHJ4X21zZ190b29fYmlnOworCXVuc2lnbmVkIGludCByeF9tc2dfdGltZW91dHM7CisJdW5zaWduZWQgaW50IHJ4X2JhZF9oZHJfbGVuOworfTsKKworc3RydWN0IHN0cnBfYWdncl9zdGF0cyB7CisJdW5zaWduZWQgbG9uZyBsb25nIHJ4X21zZ3M7CisJdW5zaWduZWQgbG9uZyBsb25nIHJ4X2J5dGVzOworCXVuc2lnbmVkIGludCByeF9tZW1fZmFpbDsKKwl1bnNpZ25lZCBpbnQgcnhfbmVlZF9tb3JlX2hkcjsKKwl1bnNpZ25lZCBpbnQgcnhfbXNnX3Rvb19iaWc7CisJdW5zaWduZWQgaW50IHJ4X21zZ190aW1lb3V0czsKKwl1bnNpZ25lZCBpbnQgcnhfYmFkX2hkcl9sZW47CisJdW5zaWduZWQgaW50IHJ4X2Fib3J0czsKKwl1bnNpZ25lZCBpbnQgcnhfaW50ZXJydXB0ZWQ7CisJdW5zaWduZWQgaW50IHJ4X3VucmVjb3ZfaW50cjsKK307CisKK3N0cnVjdCBzdHJwYXJzZXI7CisKKy8qIENhbGxiYWNrcyBhcmUgY2FsbGVkIHdpdGggbG9jayBoZWxkIGZvciB0aGUgYXR0YWNoZWQgc29ja2V0ICovCitzdHJ1Y3Qgc3RycF9jYWxsYmFja3MgeworCWludCAoKnBhcnNlX21zZykoc3RydWN0IHN0cnBhcnNlciAqc3RycCwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisJdm9pZCAoKnJjdl9tc2cpKHN0cnVjdCBzdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBza19idWZmICpza2IpOworCWludCAoKnJlYWRfc29ja19kb25lKShzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwLCBpbnQgZXJyKTsKKwl2b2lkICgqYWJvcnRfcGFyc2VyKShzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwLCBpbnQgZXJyKTsKK307CisKK3N0cnVjdCBzdHJwX3J4X21zZyB7CisJaW50IGZ1bGxfbGVuOworCWludCBvZmZzZXQ7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzdHJwX3J4X21zZyAqc3RycF9yeF9tc2coc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gKHN0cnVjdCBzdHJwX3J4X21zZyAqKSgodm9pZCAqKXNrYi0+Y2IgKworCQlvZmZzZXRvZihzdHJ1Y3QgcWRpc2Nfc2tiX2NiLCBkYXRhKSk7Cit9CisKKy8qIFN0cnVjdHVyZSBmb3IgYW4gYXR0YWNoZWQgbG93ZXIgc29ja2V0ICovCitzdHJ1Y3Qgc3RycGFyc2VyIHsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwl1MzIgcnhfc3RvcHBlZCA6IDE7CisJdTMyIHJ4X3BhdXNlZCA6IDE7CisJdTMyIHJ4X2Fib3J0ZWQgOiAxOworCXUzMiByeF9pbnRlcnJ1cHRlZCA6IDE7CisJdTMyIHJ4X3VucmVjb3ZfaW50ciA6IDE7CisKKwlzdHJ1Y3Qgc2tfYnVmZiAqKnJ4X3NrYl9uZXh0cDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCByeF9tc2dfdGltZXI7CisJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYl9oZWFkOworCXVuc2lnbmVkIGludCByeF9uZWVkX2J5dGVzOworCXN0cnVjdCBkZWxheWVkX3dvcmsgcnhfZGVsYXllZF93b3JrOworCXN0cnVjdCB3b3JrX3N0cnVjdCByeF93b3JrOworCXN0cnVjdCBzdHJwX3N0YXRzIHN0YXRzOworCXN0cnVjdCBzdHJwX2NhbGxiYWNrcyBjYjsKK307CisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggbG9jayBoZWxkIGZvciBhdHRhY2hlZCBzb2NrZXQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzdHJwX3BhdXNlKHN0cnVjdCBzdHJwYXJzZXIgKnN0cnApCit7CisJc3RycC0+cnhfcGF1c2VkID0gMTsKK30KKworLyogTWF5IGJlIGNhbGxlZCB3aXRob3V0IGhvbGRpbmcgbG9jayBmb3IgYXR0YWNoZWQgc29ja2V0ICovCit2b2lkIHN0cnBfdW5wYXVzZShzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwKTsKKworc3RhdGljIGlubGluZSB2b2lkIHNhdmVfc3RycF9zdGF0cyhzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwLAorCQkJCSAgIHN0cnVjdCBzdHJwX2FnZ3Jfc3RhdHMgKmFnZ19zdGF0cykKK3sKKwkvKiBTYXZlIHBzb2NrIHN0YXRpc3RpY3MgaW4gdGhlIG11eCB3aGVuIHBzb2NrIGlzIGJlaW5nIHVuYXR0YWNoZWQuICovCisKKyNkZWZpbmUgU0FWRV9QU09DS19TVEFUUyhfc3RhdCkgKGFnZ19zdGF0cy0+X3N0YXQgKz0JCVwKKwkJCQkgc3RycC0+c3RhdHMuX3N0YXQpCisJU0FWRV9QU09DS19TVEFUUyhyeF9tc2dzKTsKKwlTQVZFX1BTT0NLX1NUQVRTKHJ4X2J5dGVzKTsKKwlTQVZFX1BTT0NLX1NUQVRTKHJ4X21lbV9mYWlsKTsKKwlTQVZFX1BTT0NLX1NUQVRTKHJ4X25lZWRfbW9yZV9oZHIpOworCVNBVkVfUFNPQ0tfU1RBVFMocnhfbXNnX3Rvb19iaWcpOworCVNBVkVfUFNPQ0tfU1RBVFMocnhfbXNnX3RpbWVvdXRzKTsKKwlTQVZFX1BTT0NLX1NUQVRTKHJ4X2JhZF9oZHJfbGVuKTsKKyN1bmRlZiBTQVZFX1BTT0NLX1NUQVRTCisKKwlpZiAoc3RycC0+cnhfYWJvcnRlZCkKKwkJYWdnX3N0YXRzLT5yeF9hYm9ydHMrKzsKKwlpZiAoc3RycC0+cnhfaW50ZXJydXB0ZWQpCisJCWFnZ19zdGF0cy0+cnhfaW50ZXJydXB0ZWQrKzsKKwlpZiAoc3RycC0+cnhfdW5yZWNvdl9pbnRyKQorCQlhZ2dfc3RhdHMtPnJ4X3VucmVjb3ZfaW50cisrOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWdncmVnYXRlX3N0cnBfc3RhdHMoc3RydWN0IHN0cnBfYWdncl9zdGF0cyAqc3RhdHMsCisJCQkJCXN0cnVjdCBzdHJwX2FnZ3Jfc3RhdHMgKmFnZ19zdGF0cykKK3sKKyNkZWZpbmUgU0FWRV9QU09DS19TVEFUUyhfc3RhdCkgKGFnZ19zdGF0cy0+X3N0YXQgKz0gc3RhdHMtPl9zdGF0KQorCVNBVkVfUFNPQ0tfU1RBVFMocnhfbXNncyk7CisJU0FWRV9QU09DS19TVEFUUyhyeF9ieXRlcyk7CisJU0FWRV9QU09DS19TVEFUUyhyeF9tZW1fZmFpbCk7CisJU0FWRV9QU09DS19TVEFUUyhyeF9uZWVkX21vcmVfaGRyKTsKKwlTQVZFX1BTT0NLX1NUQVRTKHJ4X21zZ190b29fYmlnKTsKKwlTQVZFX1BTT0NLX1NUQVRTKHJ4X21zZ190aW1lb3V0cyk7CisJU0FWRV9QU09DS19TVEFUUyhyeF9iYWRfaGRyX2xlbik7CisJU0FWRV9QU09DS19TVEFUUyhyeF9hYm9ydHMpOworCVNBVkVfUFNPQ0tfU1RBVFMocnhfaW50ZXJydXB0ZWQpOworCVNBVkVfUFNPQ0tfU1RBVFMocnhfdW5yZWNvdl9pbnRyKTsKKyN1bmRlZiBTQVZFX1BTT0NLX1NUQVRTCisKK30KKwordm9pZCBzdHJwX2RvbmUoc3RydWN0IHN0cnBhcnNlciAqc3RycCk7Cit2b2lkIHN0cnBfc3RvcChzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwKTsKK3ZvaWQgc3RycF9jaGVja19yY3Yoc3RydWN0IHN0cnBhcnNlciAqc3RycCk7CitpbnQgc3RycF9pbml0KHN0cnVjdCBzdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBzb2NrICpjc2ssCisJICAgICAgc3RydWN0IHN0cnBfY2FsbGJhY2tzICpjYik7Cit2b2lkIHN0cnBfZGF0YV9yZWFkeShzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwKTsKKworI2VuZGlmIC8qIF9fTkVUX1NUUlBBUlNFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc3dpdGNoZGV2LmggYi9pbmNsdWRlL25ldC9zd2l0Y2hkZXYuaAppbmRleCA2MmY2YTk2Li5lYmE4MGM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zd2l0Y2hkZXYuaAorKysgYi9pbmNsdWRlL25ldC9zd2l0Y2hkZXYuaApAQCAtNjgsNyArNjgsNiBAQAogZW51bSBzd2l0Y2hkZXZfb2JqX2lkIHsKIAlTV0lUQ0hERVZfT0JKX0lEX1VOREVGSU5FRCwKIAlTV0lUQ0hERVZfT0JKX0lEX1BPUlRfVkxBTiwKLQlTV0lUQ0hERVZfT0JKX0lEX0lQVjRfRklCLAogCVNXSVRDSERFVl9PQkpfSURfUE9SVF9GREIsCiAJU1dJVENIREVWX09CSl9JRF9QT1JUX01EQiwKIH07CkBAIC05MiwyMSArOTEsNiBAQAogI2RlZmluZSBTV0lUQ0hERVZfT0JKX1BPUlRfVkxBTihvYmopIFwKIAljb250YWluZXJfb2Yob2JqLCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X3ZsYW4sIG9iaikKIAotLyogU1dJVENIREVWX09CSl9JRF9JUFY0X0ZJQiAqLwotc3RydWN0IHN3aXRjaGRldl9vYmpfaXB2NF9maWIgewotCXN0cnVjdCBzd2l0Y2hkZXZfb2JqIG9iajsKLQl1MzIgZHN0OwotCWludCBkc3RfbGVuOwotCXN0cnVjdCBmaWJfaW5mbyAqZmk7Ci0JdTggdG9zOwotCXU4IHR5cGU7Ci0JdTMyIG5sZmxhZ3M7Ci0JdTMyIHRiX2lkOwotfTsKLQotI2RlZmluZSBTV0lUQ0hERVZfT0JKX0lQVjRfRklCKG9iaikgXAotCWNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBzd2l0Y2hkZXZfb2JqX2lwdjRfZmliLCBvYmopCi0KIC8qIFNXSVRDSERFVl9PQkpfSURfUE9SVF9GREIgKi8KIHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfZmRiIHsKIAlzdHJ1Y3Qgc3dpdGNoZGV2X29iaiBvYmo7CkBAIC0yMDksMTEgKzE5Myw2IEBACiAJCQkJICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdTE2IGZsYWdzKTsKIGludCBzd2l0Y2hkZXZfcG9ydF9icmlkZ2VfZGVsbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgc3RydWN0IG5sbXNnaGRyICpubGgsIHUxNiBmbGFncyk7Ci1pbnQgc3dpdGNoZGV2X2ZpYl9pcHY0X2FkZCh1MzIgZHN0LCBpbnQgZHN0X2xlbiwgc3RydWN0IGZpYl9pbmZvICpmaSwKLQkJCSAgIHU4IHRvcywgdTggdHlwZSwgdTMyIG5sZmxhZ3MsIHUzMiB0Yl9pZCk7Ci1pbnQgc3dpdGNoZGV2X2ZpYl9pcHY0X2RlbCh1MzIgZHN0LCBpbnQgZHN0X2xlbiwgc3RydWN0IGZpYl9pbmZvICpmaSwKLQkJCSAgIHU4IHRvcywgdTggdHlwZSwgdTMyIHRiX2lkKTsKLXZvaWQgc3dpdGNoZGV2X2ZpYl9pcHY0X2Fib3J0KHN0cnVjdCBmaWJfaW5mbyAqZmkpOwogaW50IHN3aXRjaGRldl9wb3J0X2ZkYl9hZGQoc3RydWN0IG5kbXNnICpuZG0sIHN0cnVjdCBubGF0dHIgKnRiW10sCiAJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyLAogCQkJICAgdTE2IHZpZCwgdTE2IG5sbV9mbGFncyk7CkBAIC0yMjIsNyArMjAxLDcgQEAKIAkJCSAgIHUxNiB2aWQpOwogaW50IHN3aXRjaGRldl9wb3J0X2ZkYl9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKIAkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpmaWx0ZXJfZGV2LCBpbnQgaWR4KTsKKwkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZmlsdGVyX2RldiwgaW50ICppZHgpOwogdm9pZCBzd2l0Y2hkZXZfcG9ydF9md2RfbWFya19zZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmdyb3VwX2RldiwKIAkJCQkgYm9vbCBqb2luaW5nKTsKQEAgLTMwNCwyNSArMjgzLDYgQEAKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHN3aXRjaGRldl9maWJfaXB2NF9hZGQodTMyIGRzdCwgaW50IGRzdF9sZW4sCi0JCQkJCSBzdHJ1Y3QgZmliX2luZm8gKmZpLAotCQkJCQkgdTggdG9zLCB1OCB0eXBlLAotCQkJCQkgdTMyIG5sZmxhZ3MsIHUzMiB0Yl9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgc3dpdGNoZGV2X2ZpYl9pcHY0X2RlbCh1MzIgZHN0LCBpbnQgZHN0X2xlbiwKLQkJCQkJIHN0cnVjdCBmaWJfaW5mbyAqZmksCi0JCQkJCSB1OCB0b3MsIHU4IHR5cGUsIHUzMiB0Yl9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHN3aXRjaGRldl9maWJfaXB2NF9hYm9ydChzdHJ1Y3QgZmliX2luZm8gKmZpKQotewotfQotCiBzdGF0aWMgaW5saW5lIGludCBzd2l0Y2hkZXZfcG9ydF9mZGJfYWRkKHN0cnVjdCBuZG1zZyAqbmRtLCBzdHJ1Y3QgbmxhdHRyICp0YltdLAogCQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsCkBAIC0zNDIsMTUgKzMwMiw5IEBACiAJCQkJCSAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAogCQkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmZpbHRlcl9kZXYsCi0JCQkJCSAgaW50IGlkeCkKKwkJCQkJICBpbnQgKmlkeCkKIHsKLSAgICAgICByZXR1cm4gaWR4OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3dpdGNoZGV2X3BvcnRfZndkX21hcmtfc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZ3JvdXBfZGV2LAotCQkJCQkgICAgICAgYm9vbCBqb2luaW5nKQoteworICAgICAgIHJldHVybiAqaWR4OwogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgc3dpdGNoZGV2X3BvcnRfc2FtZV9wYXJlbnRfaWQoc3RydWN0IG5ldF9kZXZpY2UgKmEsCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC90Y19hY3QvdGNfaWZlLmggYi9pbmNsdWRlL25ldC90Y19hY3QvdGNfaWZlLmgKaW5kZXggNTE2NGJkNy4uOWZkMmJlYTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3RjX2FjdC90Y19pZmUuaAorKysgYi9pbmNsdWRlL25ldC90Y19hY3QvdGNfaWZlLmgKQEAgLTUwLDkgKzUwLDExIEBACiBpbnQgaWZlX2FsbG9jX21ldGFfdTMyKHN0cnVjdCB0Y2ZfbWV0YV9pbmZvICptaSwgdm9pZCAqbWV0YXZhbCwgZ2ZwX3QgZ2ZwKTsKIGludCBpZmVfYWxsb2NfbWV0YV91MTYoc3RydWN0IHRjZl9tZXRhX2luZm8gKm1pLCB2b2lkICptZXRhdmFsLCBnZnBfdCBnZnApOwogaW50IGlmZV9jaGVja19tZXRhX3UzMih1MzIgbWV0YXZhbCwgc3RydWN0IHRjZl9tZXRhX2luZm8gKm1pKTsKK2ludCBpZmVfY2hlY2tfbWV0YV91MTYodTE2IG1ldGF2YWwsIHN0cnVjdCB0Y2ZfbWV0YV9pbmZvICptaSk7CiBpbnQgaWZlX2VuY29kZV9tZXRhX3UzMih1MzIgbWV0YXZhbCwgdm9pZCAqc2tiZGF0YSwgc3RydWN0IHRjZl9tZXRhX2luZm8gKm1pKTsKIGludCBpZmVfdmFsaWRhdGVfbWV0YV91MzIodm9pZCAqdmFsLCBpbnQgbGVuKTsKIGludCBpZmVfdmFsaWRhdGVfbWV0YV91MTYodm9pZCAqdmFsLCBpbnQgbGVuKTsKK2ludCBpZmVfZW5jb2RlX21ldGFfdTE2KHUxNiBtZXRhdmFsLCB2b2lkICpza2JkYXRhLCBzdHJ1Y3QgdGNmX21ldGFfaW5mbyAqbWkpOwogdm9pZCBpZmVfcmVsZWFzZV9tZXRhX2dlbihzdHJ1Y3QgdGNmX21ldGFfaW5mbyAqbWkpOwogaW50IHJlZ2lzdGVyX2lmZV9vcChzdHJ1Y3QgdGNmX21ldGFfb3BzICptb3BzKTsKIGludCB1bnJlZ2lzdGVyX2lmZV9vcChzdHJ1Y3QgdGNmX21ldGFfb3BzICptb3BzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3RjX2FjdC90Y19za2Jtb2QuaCBiL2luY2x1ZGUvbmV0L3RjX2FjdC90Y19za2Jtb2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDRhMjExCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvdGNfYWN0L3RjX3NrYm1vZC5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIEphbWFsIEhhZGkgU2FsaW0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKi8KKworI2lmbmRlZiBfX05FVF9UQ19TS0JNT0RfSAorI2RlZmluZSBfX05FVF9UQ19TS0JNT0RfSAorCisjaW5jbHVkZSA8bmV0L2FjdF9hcGkuaD4KKyNpbmNsdWRlIDxsaW51eC90Y19hY3QvdGNfc2tibW9kLmg+CisKK3N0cnVjdCB0Y2Zfc2tibW9kX3BhcmFtcyB7CisJc3RydWN0IHJjdV9oZWFkCXJjdTsKKwl1NjQJZmxhZ3M7IC8qdXAgdG8gNjQgdHlwZXMgb2Ygb3BlcmF0aW9uczsgZXh0ZW5kIGlmIG5lZWRlZCAqLworCXU4CWV0aF9kc3RbRVRIX0FMRU5dOworCXUxNglldGhfdHlwZTsKKwl1OAlldGhfc3JjW0VUSF9BTEVOXTsKK307CisKK3N0cnVjdCB0Y2Zfc2tibW9kIHsKKwlzdHJ1Y3QgdGNfYWN0aW9uCWNvbW1vbjsKKwlzdHJ1Y3QgdGNmX3NrYm1vZF9wYXJhbXMgX19yY3UgKnNrYm1vZF9wOworfTsKKyNkZWZpbmUgdG9fc2tibW9kKGEpICgoc3RydWN0IHRjZl9za2Jtb2QgKilhKQorCisjZW5kaWYgLyogX19ORVRfVENfU0tCTU9EX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3RjX2FjdC90Y190dW5uZWxfa2V5LmggYi9pbmNsdWRlL25ldC90Y19hY3QvdGNfdHVubmVsX2tleS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1M2Y4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25ldC90Y19hY3QvdGNfdHVubmVsX2tleS5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIEFtaXIgVmFkYWkgPGFtaXJAdmFkYWkubWU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIE1lbGxhbm94IFRlY2hub2xvZ2llcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19ORVRfVENfVFVOTkVMX0tFWV9ICisjZGVmaW5lIF9fTkVUX1RDX1RVTk5FTF9LRVlfSAorCisjaW5jbHVkZSA8bmV0L2FjdF9hcGkuaD4KKworc3RydWN0IHRjZl90dW5uZWxfa2V5X3BhcmFtcyB7CisJc3RydWN0IHJjdV9oZWFkCQlyY3U7CisJaW50CQkJdGNmdF9hY3Rpb247CisJaW50CQkJYWN0aW9uOworCXN0cnVjdCBtZXRhZGF0YV9kc3QgICAgICp0Y2Z0X2VuY19tZXRhZGF0YTsKK307CisKK3N0cnVjdCB0Y2ZfdHVubmVsX2tleSB7CisJc3RydWN0IHRjX2FjdGlvbgkgICAgICBjb21tb247CisJc3RydWN0IHRjZl90dW5uZWxfa2V5X3BhcmFtcyBfX3JjdSAqcGFyYW1zOworfTsKKworI2RlZmluZSB0b190dW5uZWxfa2V5KGEpICgoc3RydWN0IHRjZl90dW5uZWxfa2V5ICopYSkKKworI2VuZGlmIC8qIF9fTkVUX1RDX1RVTk5FTF9LRVlfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdGNfYWN0L3RjX3ZsYW4uaCBiL2luY2x1ZGUvbmV0L3RjX2FjdC90Y192bGFuLmgKaW5kZXggZTI5ZjUyZS4uNDhjY2EzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdGNfYWN0L3RjX3ZsYW4uaAorKysgYi9pbmNsdWRlL25ldC90Y19hY3QvdGNfdmxhbi5oCkBAIC0xMSw2ICsxMSw3IEBACiAjZGVmaW5lIF9fTkVUX1RDX1ZMQU5fSAogCiAjaW5jbHVkZSA8bmV0L2FjdF9hcGkuaD4KKyNpbmNsdWRlIDxsaW51eC90Y19hY3QvdGNfdmxhbi5oPgogCiAjZGVmaW5lIFZMQU5fRl9QT1AJCTB4MQogI2RlZmluZSBWTEFOX0ZfUFVTSAkJMHgyCkBAIC0yMCw3ICsyMSwzMiBAQAogCWludAkJCXRjZnZfYWN0aW9uOwogCXUxNgkJCXRjZnZfcHVzaF92aWQ7CiAJX19iZTE2CQkJdGNmdl9wdXNoX3Byb3RvOworCXU4CQkJdGNmdl9wdXNoX3ByaW87CiB9OwogI2RlZmluZSB0b192bGFuKGEpICgoc3RydWN0IHRjZl92bGFuICopYSkKIAorc3RhdGljIGlubGluZSBib29sIGlzX3RjZl92bGFuKGNvbnN0IHN0cnVjdCB0Y19hY3Rpb24gKmEpCit7CisjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCisJaWYgKGEtPm9wcyAmJiBhLT5vcHMtPnR5cGUgPT0gVENBX0FDVF9WTEFOKQorCQlyZXR1cm4gdHJ1ZTsKKyNlbmRpZgorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSB1MzIgdGNmX3ZsYW5fYWN0aW9uKGNvbnN0IHN0cnVjdCB0Y19hY3Rpb24gKmEpCit7CisJcmV0dXJuIHRvX3ZsYW4oYSktPnRjZnZfYWN0aW9uOworfQorCitzdGF0aWMgaW5saW5lIHUxNiB0Y2Zfdmxhbl9wdXNoX3ZpZChjb25zdCBzdHJ1Y3QgdGNfYWN0aW9uICphKQoreworCXJldHVybiB0b192bGFuKGEpLT50Y2Z2X3B1c2hfdmlkOworfQorCitzdGF0aWMgaW5saW5lIF9fYmUxNiB0Y2Zfdmxhbl9wdXNoX3Byb3RvKGNvbnN0IHN0cnVjdCB0Y19hY3Rpb24gKmEpCit7CisJcmV0dXJuIHRvX3ZsYW4oYSktPnRjZnZfcHVzaF9wcm90bzsKK30KKwogI2VuZGlmIC8qIF9fTkVUX1RDX1ZMQU5fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdGNwLmggYi9pbmNsdWRlL25ldC90Y3AuaAppbmRleCBjMDBlN2Q1Li5mODNiN2YyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC90Y3AuaAorKysgYi9pbmNsdWRlL25ldC90Y3AuaApAQCAtMjI3LDEwICsyMjcsOSBAQAogI2RlZmluZQlURk9fU0VSVkVSX0NPT0tJRV9OT1RfUkVRRAkweDIwMAogCiAvKiBGb3JjZSBlbmFibGUgVEZPIG9uIGFsbCBsaXN0ZW5lcnMsIGkuZS4sIG5vdCByZXF1aXJpbmcgdGhlCi0gKiBUQ1BfRkFTVE9QRU4gc29ja2V0IG9wdGlvbi4gU09DS09QVDEvMiBkZXRlcm1pbmUgaG93IHRvIHNldCBtYXhfcWxlbi4KKyAqIFRDUF9GQVNUT1BFTiBzb2NrZXQgb3B0aW9uLgogICovCiAjZGVmaW5lCVRGT19TRVJWRVJfV09fU09DS09QVDEJMHg0MDAKLSNkZWZpbmUJVEZPX1NFUlZFUl9XT19TT0NLT1BUMgkweDgwMAogCiBleHRlcm4gc3RydWN0IGluZXRfdGltZXdhaXRfZGVhdGhfcm93IHRjcF9kZWF0aF9yb3c7CiAKQEAgLTUzNCw2ICs1MzMsOCBAQAogI2VuZGlmCiAvKiB0Y3Bfb3V0cHV0LmMgKi8KIAordTMyIHRjcF90c29fYXV0b3NpemUoY29uc3Qgc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgbXNzX25vdywKKwkJICAgICBpbnQgbWluX3Rzb19zZWdzKTsKIHZvaWQgX190Y3BfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBjdXJfbXNzLAogCQkJICAgICAgIGludCBub25hZ2xlKTsKIGJvb2wgdGNwX21heV9zZW5kX25vdyhzdHJ1Y3Qgc29jayAqc2spOwpAQCAtNjA0LDggKzYwNSw2IEBACiB2b2lkIHRjcF9nZXRfaW5mbyhzdHJ1Y3Qgc29jayAqLCBzdHJ1Y3QgdGNwX2luZm8gKik7CiAKIC8qIFJlYWQgJ3NlbmRmaWxlKCknLXN0eWxlIGZyb20gYSBUQ1Agc29ja2V0ICovCi10eXBlZGVmIGludCAoKnNrX3JlYWRfYWN0b3JfdCkocmVhZF9kZXNjcmlwdG9yX3QgKiwgc3RydWN0IHNrX2J1ZmYgKiwKLQkJCQl1bnNpZ25lZCBpbnQsIHNpemVfdCk7CiBpbnQgdGNwX3JlYWRfc29jayhzdHJ1Y3Qgc29jayAqc2ssIHJlYWRfZGVzY3JpcHRvcl90ICpkZXNjLAogCQkgIHNrX3JlYWRfYWN0b3JfdCByZWN2X2FjdG9yKTsKIApAQCAtNjQzLDcgKzY0Miw3IEBACiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAKLQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSAmJgorCWlmIChSQl9FTVBUWV9ST09UKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSAmJgogCSAgICB0cC0+cmN2X3duZCAmJgogCSAgICBhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpIDwgc2stPnNrX3JjdmJ1ZiAmJgogCSAgICAhdHAtPnVyZ19kYXRhKQpAQCAtNjc0LDcgKzY3Myw3IEBACiAvKiBNaW5pbXVtIFJUVCBpbiB1c2VjLiB+MCBtZWFucyBub3QgYXZhaWxhYmxlLiAqLwogc3RhdGljIGlubGluZSB1MzIgdGNwX21pbl9ydHQoY29uc3Qgc3RydWN0IHRjcF9zb2NrICp0cCkKIHsKLQlyZXR1cm4gdHAtPnJ0dF9taW5bMF0ucnR0OworCXJldHVybiBtaW5tYXhfZ2V0KCZ0cC0+cnR0X21pbik7CiB9CiAKIC8qIENvbXB1dGUgdGhlIGFjdHVhbCByZWNlaXZlIHdpbmRvdyB3ZSBhcmUgY3VycmVudGx5IGFkdmVydGlzaW5nLgpAQCAtNzY2LDggKzc2NSwxNiBAQAogCV9fdTMyCQlhY2tfc2VxOwkvKiBTZXF1ZW5jZSBudW1iZXIgQUNLJ2QJKi8KIAl1bmlvbiB7CiAJCXN0cnVjdCB7Ci0JCQkvKiBUaGVyZSBpcyBzcGFjZSBmb3IgdXAgdG8gMjAgYnl0ZXMgKi8KLQkJCV9fdTMyIGluX2ZsaWdodDsvKiBCeXRlcyBpbiBmbGlnaHQgd2hlbiBwYWNrZXQgc2VudCAqLworCQkJLyogVGhlcmUgaXMgc3BhY2UgZm9yIHVwIHRvIDI0IGJ5dGVzICovCisJCQlfX3UzMiBpbl9mbGlnaHQ6MzAsLyogQnl0ZXMgaW4gZmxpZ2h0IGF0IHRyYW5zbWl0ICovCisJCQkgICAgICBpc19hcHBfbGltaXRlZDoxLCAvKiBjd25kIG5vdCBmdWxseSB1c2VkPyAqLworCQkJICAgICAgdW51c2VkOjE7CisJCQkvKiBwa3RzIFMvQUNLZWQgc28gZmFyIHVwb24gdHggb2Ygc2tiLCBpbmNsIHJldHJhbnM6ICovCisJCQlfX3UzMiBkZWxpdmVyZWQ7CisJCQkvKiBzdGFydCBvZiBzZW5kIHBpcGVsaW5lIHBoYXNlICovCisJCQlzdHJ1Y3Qgc2tiX21zdGFtcCBmaXJzdF90eF9tc3RhbXA7CisJCQkvKiB3aGVuIHdlIHJlYWNoZWQgdGhlICJkZWxpdmVyZWQiIGNvdW50ICovCisJCQlzdHJ1Y3Qgc2tiX21zdGFtcCBkZWxpdmVyZWRfbXN0YW1wOwogCQl9IHR4OyAgIC8qIG9ubHkgdXNlZCBmb3Igb3V0Z29pbmcgc2ticyAqLwogCQl1bmlvbiB7CiAJCQlzdHJ1Y3QgaW5ldF9za2JfcGFybQloNDsKQEAgLTg2Myw2ICs4NzAsMjcgQEAKIAl1MzIgaW5fZmxpZ2h0OwogfTsKIAorLyogQSByYXRlIHNhbXBsZSBtZWFzdXJlcyB0aGUgbnVtYmVyIG9mIChvcmlnaW5hbC9yZXRyYW5zbWl0dGVkKSBkYXRhCisgKiBwYWNrZXRzIGRlbGl2ZXJlZCAiZGVsaXZlcmVkIiBvdmVyIGFuIGludGVydmFsIG9mIHRpbWUgImludGVydmFsX3VzIi4KKyAqIFRoZSB0Y3BfcmF0ZS5jIGNvZGUgZmlsbHMgaW4gdGhlIHJhdGUgc2FtcGxlLCBhbmQgY29uZ2VzdGlvbgorICogY29udHJvbCBtb2R1bGVzIHRoYXQgZGVmaW5lIGEgY29uZ19jb250cm9sIGZ1bmN0aW9uIHRvIHJ1biBhdCB0aGUgZW5kCisgKiBvZiBBQ0sgcHJvY2Vzc2luZyBjYW4gb3B0aW9uYWxseSBjaG9zZSB0byBjb25zdWx0IHRoaXMgc2FtcGxlIHdoZW4KKyAqIHNldHRpbmcgY3duZCBhbmQgcGFjaW5nIHJhdGUuCisgKiBBIHNhbXBsZSBpcyBpbnZhbGlkIGlmICJkZWxpdmVyZWQiIG9yICJpbnRlcnZhbF91cyIgaXMgbmVnYXRpdmUuCisgKi8KK3N0cnVjdCByYXRlX3NhbXBsZSB7CisJc3RydWN0CXNrYl9tc3RhbXAgcHJpb3JfbXN0YW1wOyAvKiBzdGFydGluZyB0aW1lc3RhbXAgZm9yIGludGVydmFsICovCisJdTMyICBwcmlvcl9kZWxpdmVyZWQ7CS8qIHRwLT5kZWxpdmVyZWQgYXQgInByaW9yX21zdGFtcCIgKi8KKwlzMzIgIGRlbGl2ZXJlZDsJCS8qIG51bWJlciBvZiBwYWNrZXRzIGRlbGl2ZXJlZCBvdmVyIGludGVydmFsICovCisJbG9uZyBpbnRlcnZhbF91czsJLyogdGltZSBmb3IgdHAtPmRlbGl2ZXJlZCB0byBpbmNyICJkZWxpdmVyZWQiICovCisJbG9uZyBydHRfdXM7CQkvKiBSVFQgb2YgbGFzdCAoUylBQ0tlZCBwYWNrZXQgKG9yIC0xKSAqLworCWludCAgbG9zc2VzOwkJLyogbnVtYmVyIG9mIHBhY2tldHMgbWFya2VkIGxvc3QgdXBvbiBBQ0sgKi8KKwl1MzIgIGFja2VkX3NhY2tlZDsJLyogbnVtYmVyIG9mIHBhY2tldHMgbmV3bHkgKFMpQUNLZWQgdXBvbiBBQ0sgKi8KKwl1MzIgIHByaW9yX2luX2ZsaWdodDsJLyogaW4gZmxpZ2h0IGJlZm9yZSB0aGlzIEFDSyAqLworCWJvb2wgaXNfYXBwX2xpbWl0ZWQ7CS8qIGlzIHNhbXBsZSBmcm9tIHBhY2tldCB3aXRoIGJ1YmJsZSBpbiBwaXBlPyAqLworCWJvb2wgaXNfcmV0cmFuczsJLyogaXMgc2FtcGxlIGZyb20gcmV0cmFuc21pc3Npb24/ICovCit9OworCiBzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CiAJdTMyIGtleTsKQEAgLTg4Nyw2ICs5MTUsMTQgQEAKIAl1MzIgICgqdW5kb19jd25kKShzdHJ1Y3Qgc29jayAqc2spOwogCS8qIGhvb2sgZm9yIHBhY2tldCBhY2sgYWNjb3VudGluZyAob3B0aW9uYWwpICovCiAJdm9pZCAoKnBrdHNfYWNrZWQpKHN0cnVjdCBzb2NrICpzaywgY29uc3Qgc3RydWN0IGFja19zYW1wbGUgKnNhbXBsZSk7CisJLyogc3VnZ2VzdCBudW1iZXIgb2Ygc2VnbWVudHMgZm9yIGVhY2ggc2tiIHRvIHRyYW5zbWl0IChvcHRpb25hbCkgKi8KKwl1MzIgKCp0c29fc2Vnc19nb2FsKShzdHJ1Y3Qgc29jayAqc2spOworCS8qIHJldHVybnMgdGhlIG11bHRpcGxpZXIgdXNlZCBpbiB0Y3Bfc25kYnVmX2V4cGFuZCAob3B0aW9uYWwpICovCisJdTMyICgqc25kYnVmX2V4cGFuZCkoc3RydWN0IHNvY2sgKnNrKTsKKwkvKiBjYWxsIHdoZW4gcGFja2V0cyBhcmUgZGVsaXZlcmVkIHRvIHVwZGF0ZSBjd25kIGFuZCBwYWNpbmcgcmF0ZSwKKwkgKiBhZnRlciBhbGwgdGhlIGNhX3N0YXRlIHByb2Nlc3NpbmcuIChvcHRpb25hbCkKKwkgKi8KKwl2b2lkICgqY29uZ19jb250cm9sKShzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IHN0cnVjdCByYXRlX3NhbXBsZSAqcnMpOwogCS8qIGdldCBpbmZvIGZvciBpbmV0X2RpYWcgKG9wdGlvbmFsKSAqLwogCXNpemVfdCAoKmdldF9pbmZvKShzdHJ1Y3Qgc29jayAqc2ssIHUzMiBleHQsIGludCAqYXR0ciwKIAkJCSAgIHVuaW9uIHRjcF9jY19pbmZvICppbmZvKTsKQEAgLTk0OSw2ICs5ODUsMTQgQEAKIAkJaWNzay0+aWNza19jYV9vcHMtPmN3bmRfZXZlbnQoc2ssIGV2ZW50KTsKIH0KIAorLyogRnJvbSB0Y3BfcmF0ZS5jICovCit2b2lkIHRjcF9yYXRlX3NrYl9zZW50KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7Cit2b2lkIHRjcF9yYXRlX3NrYl9kZWxpdmVyZWQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgIHN0cnVjdCByYXRlX3NhbXBsZSAqcnMpOwordm9pZCB0Y3BfcmF0ZV9nZW4oc3RydWN0IHNvY2sgKnNrLCB1MzIgZGVsaXZlcmVkLCB1MzIgbG9zdCwKKwkJICBzdHJ1Y3Qgc2tiX21zdGFtcCAqbm93LCBzdHJ1Y3QgcmF0ZV9zYW1wbGUgKnJzKTsKK3ZvaWQgdGNwX3JhdGVfY2hlY2tfYXBwX2xpbWl0ZWQoc3RydWN0IHNvY2sgKnNrKTsKKwogLyogVGhlc2UgZnVuY3Rpb25zIGRldGVybWluZSBob3cgdGhlIGN1cnJlbnQgZmxvdyBiZWhhdmVzIGluIHJlc3BlY3Qgb2YgU0FDSwogICogaGFuZGxpbmcuIFNBQ0sgaXMgbmVnb3RpYXRlZCB3aXRoIHRoZSBwZWVyLCBhbmQgdGhlcmVmb3JlIGl0IGNhbiB2YXJ5CiAgKiBiZXR3ZWVuIGRpZmZlcmVudCBmbG93cy4KQEAgLTExNjQsNiArMTIwOCw3IEBACiB9CiAKIGJvb2wgdGNwX3ByZXF1ZXVlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7Citib29sIHRjcF9hZGRfYmFja2xvZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpOwogCiAjdW5kZWYgU1RBVEVfVFJBQ0UKIApAQCAtMTUyMyw2ICsxNTY4LDggQEAKIHsKIAlpZiAoc2stPnNrX3NlbmRfaGVhZCA9PSBza2JfdW5saW5rZWQpCiAJCXNrLT5za19zZW5kX2hlYWQgPSBOVUxMOworCWlmICh0Y3Bfc2soc2spLT5oaWdoZXN0X3NhY2sgPT0gc2tiX3VubGlua2VkKQorCQl0Y3Bfc2soc2spLT5oaWdoZXN0X3NhY2sgPSBOVUxMOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdGNwX2luaXRfc2VuZF9oZWFkKHN0cnVjdCBzb2NrICpzaykKQEAgLTE4NTEsNiArMTg5OCw4IEBACiAJcmV0dXJuIGFuc3c7CiB9CiAKK2ludCB0Y3BfcGVla19sZW4oc3RydWN0IHNvY2tldCAqc29jayk7CisKIHN0YXRpYyBpbmxpbmUgdm9pZCB0Y3Bfc2Vnc19pbihzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXUxNiBzZWdzX2luOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdWRwLmggYi9pbmNsdWRlL25ldC91ZHAuaAppbmRleCA4ODk0ZDcxLi5lYTUzYTg3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC91ZHAuaAorKysgYi9pbmNsdWRlL25ldC91ZHAuaApAQCAtMjUxLDYgKzI1MSw3IEBACiAJCSBpbnQgKCpzYWRkcl9jbXApKGNvbnN0IHN0cnVjdCBzb2NrICosCiAJCQkJICBjb25zdCBzdHJ1Y3Qgc29jayAqKSk7CiB2b2lkIHVkcF9lcnIoc3RydWN0IHNrX2J1ZmYgKiwgdTMyKTsKK2ludCB1ZHBfYWJvcnQoc3RydWN0IHNvY2sgKnNrLCBpbnQgZXJyKTsKIGludCB1ZHBfc2VuZG1zZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbik7CiBpbnQgdWRwX3B1c2hfcGVuZGluZ19mcmFtZXMoc3RydWN0IHNvY2sgKnNrKTsKIHZvaWQgdWRwX2ZsdXNoX3BlbmRpbmdfZnJhbWVzKHN0cnVjdCBzb2NrICpzayk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC92eGxhbi5oIGIvaW5jbHVkZS9uZXQvdnhsYW4uaAppbmRleCBiOTZkMDM2Li4wMjU1NjEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC92eGxhbi5oCisrKyBiL2luY2x1ZGUvbmV0L3Z4bGFuLmgKQEAgLTM1MCwyNCArMzUwLDYgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgaW5saW5lIF9fYmUzMiB2eGxhbl90dW5faWRfdG9fdm5pKF9fYmU2NCB0dW5faWQpCi17Ci0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0JcmV0dXJuIChfX2ZvcmNlIF9fYmUzMil0dW5faWQ7Ci0jZWxzZQotCXJldHVybiAoX19mb3JjZSBfX2JlMzIpKChfX2ZvcmNlIHU2NCl0dW5faWQgPj4gMzIpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgX19iZTY0IHZ4bGFuX3ZuaV90b190dW5faWQoX19iZTMyIHZuaSkKLXsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQlyZXR1cm4gKF9fZm9yY2UgX19iZTY0KXZuaTsKLSNlbHNlCi0JcmV0dXJuIChfX2ZvcmNlIF9fYmU2NCkoKHU2NCkoX19mb3JjZSB1MzIpdm5pIDw8IDMyKTsKLSNlbmRpZgotfQotCiBzdGF0aWMgaW5saW5lIHNpemVfdCB2eGxhbl9yY29fc3RhcnQoX19iZTMyIHZuaV9maWVsZCkKIHsKIAlyZXR1cm4gYmUzMl90b19jcHUodm5pX2ZpZWxkICYgVlhMQU5fUkNPX01BU0spIDw8IFZYTEFOX1JDT19TSElGVDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3hmcm0uaCBiL2luY2x1ZGUvbmV0L3hmcm0uaAppbmRleCBhZGZlYmQ2Li4zMTk0N2I5IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC94ZnJtLmgKKysrIGIvaW5jbHVkZS9uZXQveGZybS5oCkBAIC0xODcsNyArMTg3LDcgQEAKIAlzdHJ1Y3QgeGZybV9yZXBsYXlfc3RhdGVfZXNuICpwcmVwbGF5X2VzbjsKIAogCS8qIFRoZSBmdW5jdGlvbnMgZm9yIHJlcGxheSBkZXRlY3Rpb24uICovCi0Jc3RydWN0IHhmcm1fcmVwbGF5CSpyZXBsOworCWNvbnN0IHN0cnVjdCB4ZnJtX3JlcGxheSAqcmVwbDsKIAogCS8qIGludGVybmFsIGZsYWcgdGhhdCBvbmx5IGhvbGRzIHN0YXRlIGZvciBkZWxheWVkIGFldmVudCBhdCB0aGUKIAkgKiBtb21lbnQKQEAgLTE1NDAsOCArMTU0MCwxMCBAQAogdm9pZCB4ZnJtNF9sb2NhbF9lcnJvcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgbXR1KTsKIGludCB4ZnJtNl9leHRyYWN0X2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGludCB4ZnJtNl9leHRyYWN0X2lucHV0KHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWludCB4ZnJtNl9yY3Zfc3BpKHN0cnVjdCBza19idWZmICpza2IsIGludCBuZXh0aGRyLCBfX2JlMzIgc3BpKTsKK2ludCB4ZnJtNl9yY3Zfc3BpKHN0cnVjdCBza19idWZmICpza2IsIGludCBuZXh0aGRyLCBfX2JlMzIgc3BpLAorCQkgIHN0cnVjdCBpcDZfdG5sICp0KTsKIGludCB4ZnJtNl90cmFuc3BvcnRfZmluaXNoKHN0cnVjdCBza19idWZmICpza2IsIGludCBhc3luYyk7CitpbnQgeGZybTZfcmN2X3RubChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXA2X3RubCAqdCk7CiBpbnQgeGZybTZfcmN2KHN0cnVjdCBza19idWZmICpza2IpOwogaW50IHhmcm02X2lucHV0X2FkZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgeGZybV9hZGRyZXNzX3QgKmRhZGRyLAogCQkgICAgIHhmcm1fYWRkcmVzc190ICpzYWRkciwgdTggcHJvdG8pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZG1hL2liX2hkcnMuaCBiL2luY2x1ZGUvcmRtYS9pYl9oZHJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA4NDM5ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcmRtYS9pYl9oZHJzLmgKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiBDb3B5cmlnaHQoYykgMjAxNiBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICogIC0gTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBJQl9IRFJTX0gKKyNkZWZpbmUgSUJfSERSU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKyNpbmNsdWRlIDxyZG1hL2liX3ZlcmJzLmg+CisKKyNkZWZpbmUgSUJfU0VRX05BSwkoMyA8PCAyOSkKKworLyogQUVUSCBOQUsgb3Bjb2RlIHZhbHVlcyAqLworI2RlZmluZSBJQl9STlJfTkFLICAgICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgSUJfTkFLX1BTTl9FUlJPUiAgICAgICAgICAgICAgICAweDYwCisjZGVmaW5lIElCX05BS19JTlZBTElEX1JFUVVFU1QgICAgICAgICAgMHg2MQorI2RlZmluZSBJQl9OQUtfUkVNT1RFX0FDQ0VTU19FUlJPUiAgICAgIDB4NjIKKyNkZWZpbmUgSUJfTkFLX1JFTU9URV9PUEVSQVRJT05BTF9FUlJPUiAweDYzCisjZGVmaW5lIElCX05BS19JTlZBTElEX1JEX1JFUVVFU1QgICAgICAgMHg2NAorCisjZGVmaW5lIElCX0JUSF9SRVFfQUNLCQlCSVQoMzEpCisjZGVmaW5lIElCX0JUSF9TT0xJQ0lURUQJQklUKDIzKQorI2RlZmluZSBJQl9CVEhfTUlHX1JFUQkJQklUKDIyKQorCisjZGVmaW5lIElCX0dSSF9WRVJTSU9OCQk2CisjZGVmaW5lIElCX0dSSF9WRVJTSU9OX01BU0sJMHhGCisjZGVmaW5lIElCX0dSSF9WRVJTSU9OX1NISUZUCTI4CisjZGVmaW5lIElCX0dSSF9UQ0xBU1NfTUFTSwkweEZGCisjZGVmaW5lIElCX0dSSF9UQ0xBU1NfU0hJRlQJMjAKKyNkZWZpbmUgSUJfR1JIX0ZMT1dfTUFTSwkweEZGRkZGCisjZGVmaW5lIElCX0dSSF9GTE9XX1NISUZUCTAKKyNkZWZpbmUgSUJfR1JIX05FWFRfSERSCQkweDFCCisKK3N0cnVjdCBpYl9yZXRoIHsKKwlfX2JlNjQgdmFkZHI7ICAgICAgICAvKiBwb3RlbnRpYWxseSB1bmFsaWduZWQgKi8KKwlfX2JlMzIgcmtleTsKKwlfX2JlMzIgbGVuZ3RoOworfSBfX3BhY2tlZDsKKworc3RydWN0IGliX2F0b21pY19ldGggeworCV9fYmU2NCB2YWRkcjsgICAgICAgIC8qIHBvdGVudGlhbGx5IHVuYWxpZ25lZCAqLworCV9fYmUzMiBya2V5OworCV9fYmU2NCBzd2FwX2RhdGE7ICAgIC8qIHBvdGVudGlhbGx5IHVuYWxpZ25lZCAqLworCV9fYmU2NCBjb21wYXJlX2RhdGE7IC8qIHBvdGVudGlhbGx5IHVuYWxpZ25lZCAqLworfSBfX3BhY2tlZDsKKwordW5pb24gaWJfZWhkcnMgeworCXN0cnVjdCB7CisJCV9fYmUzMiBkZXRoWzJdOworCQlfX2JlMzIgaW1tX2RhdGE7CisJfSB1ZDsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgaWJfcmV0aCByZXRoOworCQlfX2JlMzIgaW1tX2RhdGE7CisJfSByYzsKKwlzdHJ1Y3QgeworCQlfX2JlMzIgYWV0aDsKKwkJX19iZTY0IGF0b21pY19hY2tfZXRoOyAvKiBwb3RlbnRpYWxseSB1bmFsaWduZWQgKi8KKwl9IF9fcGFja2VkIGF0OworCV9fYmUzMiBpbW1fZGF0YTsKKwlfX2JlMzIgYWV0aDsKKwlfX2JlMzIgaWV0aDsKKwlzdHJ1Y3QgaWJfYXRvbWljX2V0aCBhdG9taWNfZXRoOworfSAgX19wYWNrZWQ7CisKK3N0cnVjdCBpYl9vdGhlcl9oZWFkZXJzIHsKKwlfX2JlMzIgYnRoWzNdOworCXVuaW9uIGliX2VoZHJzIHU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWJfaGVhZGVyIHsKKwlfX2JlMTYgbHJoWzRdOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBpYl9ncmggZ3JoOworCQkJc3RydWN0IGliX290aGVyX2hlYWRlcnMgb3RoOworCQl9IGw7CisJCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzIG90aDsKKwl9IHU7Cit9IF9fcGFja2VkOworCisvKiBhY2Nlc3NvcnMgZm9yIHVuYWxpZ25lZCBfX2JlNjQgaXRlbXMgKi8KKworc3RhdGljIGlubGluZSB1NjQgaWJfdTY0X2dldChfX2JlNjQgKnApCit7CisJcmV0dXJuIGdldF91bmFsaWduZWRfYmU2NChwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGliX3U2NF9wdXQodTY0IHZhbCwgX19iZTY0ICpwKQoreworCXB1dF91bmFsaWduZWRfYmU2NCh2YWwsIHApOworfQorCitzdGF0aWMgaW5saW5lIHU2NCBnZXRfaWJfcmV0aF92YWRkcihzdHJ1Y3QgaWJfcmV0aCAqcmV0aCkKK3sKKwlyZXR1cm4gaWJfdTY0X2dldCgmcmV0aC0+dmFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X2liX3JldGhfdmFkZHIodTY0IHZhbCwgc3RydWN0IGliX3JldGggKnJldGgpCit7CisJaWJfdTY0X3B1dCh2YWwsICZyZXRoLT52YWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0IGdldF9pYl9hdGV0aF92YWRkcihzdHJ1Y3QgaWJfYXRvbWljX2V0aCAqYXRldGgpCit7CisJcmV0dXJuIGliX3U2NF9nZXQoJmF0ZXRoLT52YWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfaWJfYXRldGhfdmFkZHIodTY0IHZhbCwgc3RydWN0IGliX2F0b21pY19ldGggKmF0ZXRoKQoreworCWliX3U2NF9wdXQodmFsLCAmYXRldGgtPnZhZGRyKTsKK30KKworc3RhdGljIGlubGluZSB1NjQgZ2V0X2liX2F0ZXRoX3N3YXAoc3RydWN0IGliX2F0b21pY19ldGggKmF0ZXRoKQoreworCXJldHVybiBpYl91NjRfZ2V0KCZhdGV0aC0+c3dhcF9kYXRhKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF9pYl9hdGV0aF9zd2FwKHU2NCB2YWwsIHN0cnVjdCBpYl9hdG9taWNfZXRoICphdGV0aCkKK3sKKwlpYl91NjRfcHV0KHZhbCwgJmF0ZXRoLT5zd2FwX2RhdGEpOworfQorCitzdGF0aWMgaW5saW5lIHU2NCBnZXRfaWJfYXRldGhfY29tcGFyZShzdHJ1Y3QgaWJfYXRvbWljX2V0aCAqYXRldGgpCit7CisJcmV0dXJuIGliX3U2NF9nZXQoJmF0ZXRoLT5jb21wYXJlX2RhdGEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X2liX2F0ZXRoX2NvbXBhcmUodTY0IHZhbCwgc3RydWN0IGliX2F0b21pY19ldGggKmF0ZXRoKQoreworCWliX3U2NF9wdXQodmFsLCAmYXRldGgtPmNvbXBhcmVfZGF0YSk7Cit9CisKKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSUJfSERSU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3JkbWEvaWJfdmVyYnMuaCBiL2luY2x1ZGUvcmRtYS9pYl92ZXJicy5oCmluZGV4IDhlOTBkZDIuLmUxZjk2NzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcmRtYS9pYl92ZXJicy5oCisrKyBiL2luY2x1ZGUvcmRtYS9pYl92ZXJicy5oCkBAIC0yMTE1LDIyICsyMTE1LDE3IEBACiAJCQkJICAgICAgIHNpemVfdCBsZW4pCiB7CiAJY29uc3Qgdm9pZCBfX3VzZXIgKnAgPSB1ZGF0YS0+aW5idWYgKyBvZmZzZXQ7Ci0JYm9vbCByZXQgPSBmYWxzZTsKKwlib29sIHJldDsKIAl1OCAqYnVmOwogCiAJaWYgKGxlbiA+IFVTSFJUX01BWCkKIAkJcmV0dXJuIGZhbHNlOwogCi0JYnVmID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOwotCWlmICghYnVmKQorCWJ1ZiA9IG1lbWR1cF91c2VyKHAsIGxlbik7CisJaWYgKElTX0VSUihidWYpKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBwLCBsZW4pKQotCQlnb3RvIGZyZWU7Ci0KIAlyZXQgPSAhbWVtY2hyX2ludihidWYsIDAsIGxlbik7Ci0KLWZyZWU6CiAJa2ZyZWUoYnVmKTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZG1hL3JkbWF2dF9xcC5oIGIvaW5jbHVkZS9yZG1hL3JkbWF2dF9xcC5oCmluZGV4IGJkMzRkMGIuLjJjNTE4M2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcmRtYS9yZG1hdnRfcXAuaAorKysgYi9pbmNsdWRlL3JkbWEvcmRtYXZ0X3FwLmgKQEAgLTQ2Niw2ICs0NjYsMjUgQEAKIH0KIAogLyoqCisgKiBydnRfZ2V0X3FwIC0gZ2V0IGEgUVAgcmVmZXJlbmNlCisgKiBAcXAgLSB0aGUgUVAgdG8gaG9sZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcnZ0X2dldF9xcChzdHJ1Y3QgcnZ0X3FwICpxcCkKK3sKKwlhdG9taWNfaW5jKCZxcC0+cmVmY291bnQpOworfQorCisvKioKKyAqIHJ2dF9wdXRfcXAgLSByZWxlYXNlIGEgUVAgcmVmZXJlbmNlCisgKiBAcXAgLSB0aGUgUVAgdG8gcmVsZWFzZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcnZ0X3B1dF9xcChzdHJ1Y3QgcnZ0X3FwICpxcCkKK3sKKwlpZiAocXAgJiYgYXRvbWljX2RlY19hbmRfdGVzdCgmcXAtPnJlZmNvdW50KSkKKwkJd2FrZV91cCgmcXAtPndhaXQpOworfQorCisvKioKICAqIHJ2dF9xcF93cWVfcmVzZXJ2ZSAtIHJlc2VydmUgb3BlcmF0aW9uCiAgKiBAcXAgLSB0aGUgcnZ0IHFwCiAgKiBAd3FlIC0gdGhlIHNlbmQgd3FlCmRpZmYgLS1naXQgYS9pbmNsdWRlL3J4cnBjL3BhY2tldC5oIGIvaW5jbHVkZS9yeHJwYy9wYWNrZXQuaAppbmRleCBiMjAxNzQ0Li43MDNhNjRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL3J4cnBjL3BhY2tldC5oCisrKyBiL2luY2x1ZGUvcnhycGMvcGFja2V0LmgKQEAgLTI0LDYgKzI0LDcgQEAKICAqLwogc3RydWN0IHJ4cnBjX3dpcmVfaGVhZGVyIHsKIAlfX2JlMzIJCWVwb2NoOwkJLyogY2xpZW50IGJvb3QgdGltZXN0YW1wICovCisjZGVmaW5lIFJYUlBDX1JBTkRPTV9FUE9DSAkweDgwMDAwMDAwCS8qIFJhbmRvbSBpZiBzZXQsIGRhdGUtYmFzZWQgaWYgbm90ICovCiAKIAlfX2JlMzIJCWNpZDsJCS8qIGNvbm5lY3Rpb24gYW5kIGNoYW5uZWwgSUQgKi8KICNkZWZpbmUgUlhSUENfTUFYQ0FMTFMJCTQJCQkvKiBtYXggYWN0aXZlIGNhbGxzIHBlciBjb25uICovCkBAIC0zMyw4ICszNCw2IEBACiAjZGVmaW5lIFJYUlBDX0NJRF9JTkMJCSgxIDw8IFJYUlBDX0NJRFNISUZUKQkvKiBjb25uZWN0aW9uIElEIGluY3JlbWVudCAqLwogCiAJX19iZTMyCQljYWxsTnVtYmVyOwkvKiBjYWxsIElEICgwIGZvciBjb25uZWN0aW9uLWxldmVsIHBhY2tldHMpICovCi0jZGVmaW5lIFJYUlBDX1BST0NFU1NfTUFYQ0FMTFMJKDE8PDIpCS8qIG1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBjYWxscyBwZXIgY29ubiAocG93ZXIgb2YgMikgKi8KLQogCV9fYmUzMgkJc2VxOwkJLyogc2VxdWVuY2UgbnVtYmVyIG9mIHBrdCBpbiBjYWxsIHN0cmVhbSAqLwogCV9fYmUzMgkJc2VyaWFsOwkJLyogc2VyaWFsIG51bWJlciBvZiBwa3Qgc2VudCB0byBuZXR3b3JrICovCiAKQEAgLTkyLDEwICs5MSwxNCBAQAogc3RydWN0IHJ4cnBjX2p1bWJvX2hlYWRlciB7CiAJdWludDhfdAkJZmxhZ3M7CQkvKiBwYWNrZXQgZmxhZ3MgKGFzIHBlciByeHJwY19oZWFkZXIpICovCiAJdWludDhfdAkJcGFkOwotCV9fYmUxNgkJX3JzdmQ7CQkvKiByZXNlcnZlZCAodXNlZCBieSBrZXJiZXJvcyBzZWN1cml0eSBhcyBja3N1bSkgKi8KKwl1bmlvbiB7CisJCV9fYmUxNglfcnN2ZDsJCS8qIHJlc2VydmVkICovCisJCV9fYmUxNglja3N1bTsJCS8qIGtlcmJlcm9zIHNlY3VyaXR5IGNoZWNrc3VtICovCisJfTsKIH07CiAKICNkZWZpbmUgUlhSUENfSlVNQk9fREFUQUxFTgkxNDEyCS8qIG5vbi10ZXJtaW5hbCBqdW1ibyBwYWNrZXQgZGF0YSBsZW5ndGggKi8KKyNkZWZpbmUgUlhSUENfSlVNQk9fU1VCUEtUTEVOCShSWFJQQ19KVU1CT19EQVRBTEVOICsgc2l6ZW9mKHN0cnVjdCByeHJwY19qdW1ib19oZWFkZXIpKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgpAQCAtMTIwLDYgKzEyMyw3IEBACiAjZGVmaW5lIFJYUlBDX0FDS19QSU5HX1JFU1BPTlNFCQk3CS8qIHJlc3BvbnNlIHRvIFJYUlBDX0FDS19QSU5HICovCiAjZGVmaW5lIFJYUlBDX0FDS19ERUxBWQkJCTgJLyogbm90aGluZyBoYXBwZW5lZCBzaW5jZSByZWNlaXZlZCBwYWNrZXQgKi8KICNkZWZpbmUgUlhSUENfQUNLX0lETEUJCQk5CS8qIEFDSyBkdWUgdG8gZnVsbHkgcmVjZWl2ZWQgQUNLIHdpbmRvdyAqLworI2RlZmluZSBSWFJQQ19BQ0tfX0lOVkFMSUQJCTEwCS8qIFJlcHJlc2VudGF0aW9uIG9mIGludmFsaWQgQUNLIHJlYXNvbiAqLwogCiAJdWludDhfdAkJbkFja3M7CQkvKiBudW1iZXIgb2YgQUNLcyAqLwogI2RlZmluZSBSWFJQQ19NQVhBQ0tTCTI1NQpAQCAtMTMwLDYgKzEzNCwxMyBAQAogCiB9IF9fcGFja2VkOwogCisvKiBTb21lIEFDS3MgcmVmZXIgdG8gc3BlY2lmaWMgcGFja2V0cyBhbmQgc29tZSBhcmUgZ2VuZXJhbCBhbmQgY2FuIGJlIHVwZGF0ZWQuICovCisjZGVmaW5lIFJYUlBDX0FDS19VUERBVEVBQkxFICgoMSA8PCBSWFJQQ19BQ0tfUkVRVUVTVEVEKQl8CVwKKwkJCSAgICAgICgxIDw8IFJYUlBDX0FDS19QSU5HX1JFU1BPTlNFKQl8CVwKKwkJCSAgICAgICgxIDw8IFJYUlBDX0FDS19ERUxBWSkJCXwJXAorCQkJICAgICAgKDEgPDwgUlhSUENfQUNLX0lETEUpKQorCisKIC8qCiAgKiBBQ0sgcGFja2V0cyBjYW4gaGF2ZSBhIGZ1cnRoZXIgcGllY2Ugb2YgaW5mb3JtYXRpb24gdGFnZ2VkIG9uIHRoZSBlbmQKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfaG9zdC5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfaG9zdC5oCmluZGV4IDBkZWU3YWYuLjdlNGNkNTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX2hvc3QuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV9ob3N0LmgKQEAgLTc3MSwxMiArNzcxLDkgQEAKIAkJc2hvc3QtPnRtZl9pbl9wcm9ncmVzczsKIH0KIAotZXh0ZXJuIGJvb2wgc2NzaV91c2VfYmxrX21xOwotCiBzdGF0aWMgaW5saW5lIGJvb2wgc2hvc3RfdXNlX2Jsa19tcShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKIHsKLQlyZXR1cm4gc2NzaV91c2VfYmxrX21xOwotCisJcmV0dXJuIHNob3N0LT51c2VfYmxrX21xOwogfQogCiBleHRlcm4gaW50IHNjc2lfcXVldWVfd29yayhzdHJ1Y3QgU2NzaV9Ib3N0ICosIHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuaCBiL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuaAppbmRleCAxM2MwYjJiLi43M2Q4NzA5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfc2FzLmgKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X3Nhcy5oCkBAIC0xMSwxMiArMTEsMTIgQEAKIHN0cnVjdCByZXF1ZXN0OwogCiAjaWYgIUlTX0VOQUJMRUQoQ09ORklHX1NDU0lfU0FTX0FUVFJTKQotc3RhdGljIGlubGluZSBpbnQgaXNfc2FzX2F0dGFjaGVkKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3N0YXRpYyBpbmxpbmUgaW50IHNjc2lfaXNfc2FzX3JwaHkoY29uc3Qgc3RydWN0IGRldmljZSAqc2RldikKIHsKIAlyZXR1cm4gMDsKIH0KICNlbHNlCi1leHRlcm4gaW50IGlzX3Nhc19hdHRhY2hlZChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOworZXh0ZXJuIGludCBzY3NpX2lzX3Nhc19ycGh5KGNvbnN0IHN0cnVjdCBkZXZpY2UgKik7CiAjZW5kaWYKIAogc3RhdGljIGlubGluZSBpbnQgc2FzX3Byb3RvY29sX2F0YShlbnVtIHNhc19wcm90b2NvbCBwcm90bykKQEAgLTIwMiw3ICsyMDIsNiBAQAogZXh0ZXJuIHZvaWQgc2FzX3JwaHlfcmVtb3ZlKHN0cnVjdCBzYXNfcnBoeSAqKTsKIGV4dGVybiB2b2lkIHNhc19ycGh5X2RlbGV0ZShzdHJ1Y3Qgc2FzX3JwaHkgKik7CiBleHRlcm4gdm9pZCBzYXNfcnBoeV91bmxpbmsoc3RydWN0IHNhc19ycGh5ICopOwotZXh0ZXJuIGludCBzY3NpX2lzX3Nhc19ycGh5KGNvbnN0IHN0cnVjdCBkZXZpY2UgKik7CiAKIHN0cnVjdCBzYXNfcG9ydCAqc2FzX3BvcnRfYWxsb2Moc3RydWN0IGRldmljZSAqLCBpbnQpOwogc3RydWN0IHNhc19wb3J0ICpzYXNfcG9ydF9hbGxvY19udW0oc3RydWN0IGRldmljZSAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc29jL2F0OTEvYXRtZWwtc2ZyLmggYi9pbmNsdWRlL3NvYy9hdDkxL2F0bWVsLXNmci5oCmluZGV4IDJmOWJiOTguLjUwNmVhOGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc29jL2F0OTEvYXRtZWwtc2ZyLmgKKysrIGIvaW5jbHVkZS9zb2MvYXQ5MS9hdG1lbC1zZnIuaApAQCAtMTMsNiArMTMsMjAgQEAKICNpZm5kZWYgX0xJTlVYX01GRF9TWVNDT05fQVRNRUxfU0ZSX0gKICNkZWZpbmUgX0xJTlVYX01GRF9TWVNDT05fQVRNRUxfU0ZSX0gKIAorI2RlZmluZSBBVDkxX1NGUl9ERFJDRkcJCTB4MDQJLyogRERSIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKy8qIDB4MDggfiAweDBjOiBSZXNlcnZlZCAqLworI2RlZmluZSBBVDkxX1NGUl9PSENJSUNSCTB4MTAJLyogT0hDSSBJTlQgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX1NGUl9PSENJSVNSCTB4MTQJLyogT0hDSSBJTlQgU3RhdHVzIFJlZ2lzdGVyICovCiAjZGVmaW5lIEFUOTFfU0ZSX0kyU0NMS1NFTAkweDkwCS8qIEkyU0MgUmVnaXN0ZXIgKi8KIAorLyogRmllbGQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgQVQ5MV9PSENJSUNSX1NVU1BFTkRfQQlCSVQoOCkKKyNkZWZpbmUgQVQ5MV9PSENJSUNSX1NVU1BFTkRfQglCSVQoOSkKKyNkZWZpbmUgQVQ5MV9PSENJSUNSX1NVU1BFTkRfQwlCSVQoMTApCisKKyNkZWZpbmUgQVQ5MV9PSENJSUNSX1VTQl9TVVNQRU5ECShBVDkxX09IQ0lJQ1JfU1VTUEVORF9BIHwgXAorCQkJCQkgQVQ5MV9PSENJSUNSX1NVU1BFTkRfQiB8IFwKKwkJCQkJIEFUOTFfT0hDSUlDUl9TVVNQRU5EX0MpCisKKwogI2VuZGlmIC8qIF9MSU5VWF9NRkRfU1lTQ09OX0FUTUVMX1NGUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvYy9yb2NrY2hpcC9yb2NrY2hpcF9zaXAuaCBiL2luY2x1ZGUvc29jL3JvY2tjaGlwL3JvY2tjaGlwX3NpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMjgwOTIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3NvYy9yb2NrY2hpcC9yb2NrY2hpcF9zaXAuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2LCBGdXpob3UgUm9ja2NoaXAgRWxlY3Ryb25pY3MgQ28uLCBMdGQKKyAqIEF1dGhvcjogTGluIEh1YW5nIDxobEByb2NrLWNoaXBzLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX19TT0NfUk9DS0NISVBfU0lQX0gKKyNkZWZpbmUgX19TT0NfUk9DS0NISVBfU0lQX0gKKworI2RlZmluZSBST0NLQ0hJUF9TSVBfRFJBTV9GUkVRCQkJMHg4MjAwMDAwOAorI2RlZmluZSBST0NLQ0hJUF9TSVBfQ09ORklHX0RSQU1fSU5JVAkJMHgwMAorI2RlZmluZSBST0NLQ0hJUF9TSVBfQ09ORklHX0RSQU1fU0VUX1JBVEUJMHgwMQorI2RlZmluZSBST0NLQ0hJUF9TSVBfQ09ORklHX0RSQU1fUk9VTkRfUkFURQkweDAyCisjZGVmaW5lIFJPQ0tDSElQX1NJUF9DT05GSUdfRFJBTV9TRVRfQVRfU1IJMHgwMworI2RlZmluZSBST0NLQ0hJUF9TSVBfQ09ORklHX0RSQU1fR0VUX0JXCQkweDA0CisjZGVmaW5lIFJPQ0tDSElQX1NJUF9DT05GSUdfRFJBTV9HRVRfUkFURQkweDA1CisjZGVmaW5lIFJPQ0tDSElQX1NJUF9DT05GSUdfRFJBTV9DTFJfSVJRCTB4MDYKKyNkZWZpbmUgUk9DS0NISVBfU0lQX0NPTkZJR19EUkFNX1NFVF9QQVJBTQkweDA3CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9kYTcyMTkuaCBiL2luY2x1ZGUvc291bmQvZGE3MjE5LmgKaW5kZXggMDI4NzZhYy4uNDA5ZWYxMzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvZGE3MjE5LmgKKysrIGIvaW5jbHVkZS9zb3VuZC9kYTcyMTkuaApAQCAtMzQsNiArMzQsOCBAQAogc3RydWN0IGRhNzIxOV9hYWRfcGRhdGE7CiAKIHN0cnVjdCBkYTcyMTlfcGRhdGEgeworCWJvb2wgd2FrZXVwX3NvdXJjZTsKKwogCS8qIE1pYyAqLwogCWVudW0gZGE3MjE5X21pY2JpYXNfdm9sdGFnZSBtaWNiaWFzX2x2bDsKIAllbnVtIGRhNzIxOV9taWNfYW1wX2luX3NlbCBtaWNfYW1wX2luX3NlbDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvaGRhX3JlZ2lzdGVyLmggYi9pbmNsdWRlL3NvdW5kL2hkYV9yZWdpc3Rlci5oCmluZGV4IGZmMWFlY2YuLjAwMTMwNjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvaGRhX3JlZ2lzdGVyLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9oZGFfcmVnaXN0ZXIuaApAQCAtODksNiArODksMTkgQEAKICNkZWZpbmUgQVpYX1JFR19TRF9CRExQTAkJMHgxOAogI2RlZmluZSBBWlhfUkVHX1NEX0JETFBVCQkweDFjCiAKKy8qIEdUUyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQVpYX1JFR19MTENICQkJMHgxNAorCisjZGVmaW5lIEFaWF9SRUdfR1RTX0JBU0UJCTB4NTIwCisKKyNkZWZpbmUgQVpYX1JFR19HVFNDQwkoQVpYX1JFR19HVFNfQkFTRSArIDB4MDApCisjZGVmaW5lIEFaWF9SRUdfV0FMRkNDCShBWlhfUkVHX0dUU19CQVNFICsgMHgwNCkKKyNkZWZpbmUgQVpYX1JFR19UU0NDTAkoQVpYX1JFR19HVFNfQkFTRSArIDB4MDgpCisjZGVmaW5lIEFaWF9SRUdfVFNDQ1UJKEFaWF9SRUdfR1RTX0JBU0UgKyAweDBDKQorI2RlZmluZSBBWlhfUkVHX0xMUEZPQwkoQVpYX1JFR19HVFNfQkFTRSArIDB4MTQpCisjZGVmaW5lIEFaWF9SRUdfTExQQ0wJKEFaWF9SRUdfR1RTX0JBU0UgKyAweDE4KQorI2RlZmluZSBBWlhfUkVHX0xMUENVCShBWlhfUkVHX0dUU19CQVNFICsgMHgxQykKKwogLyogSGFzd2VsbC9Ccm9hZHdlbGwgZGlzcGxheSBIRC1BIGNvbnRyb2xsZXIgRXh0ZW5kZWQgTW9kZSByZWdpc3RlcnMgKi8KICNkZWZpbmUgQVpYX1JFR19IU1dfRU00CQkJMHgxMDBjCiAjZGVmaW5lIEFaWF9SRUdfSFNXX0VNNQkJCTB4MTAxMApAQCAtMjQyLDYgKzI1NSwyOSBAQAogLyogSW50ZXJ2YWwgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGl0ZXJhdGluZyByZWdpc3RlciBvZmZzZXQgKi8KICNkZWZpbmUgQVpYX0RSU01fSU5URVJWQUwJCTB4MDgKIAorLyogR2xvYmFsIHRpbWUgc3luY2hyb25pemF0aW9uIHJlZ2lzdGVycyAqLworI2RlZmluZSBHVFNDQ19UU0NDRF9NQVNLCQkweDgwMDAwMDAwCisjZGVmaW5lIEdUU0NDX1RTQ0NEX1NISUZUCQlCSVQoMzEpCisjZGVmaW5lIEdUU0NDX1RTQ0NJX01BU0sJCTB4MjAKKyNkZWZpbmUgR1RTQ0NfQ0RNQVNfRE1BX0RJUl9TSElGVAk0CisKKyNkZWZpbmUgV0FMRkNDX0NJRl9NQVNLCQkJMHgxRkYKKyNkZWZpbmUgV0FMRkNDX0ZOX1NISUZUCQkJOQorI2RlZmluZSBIREFfQ0xLX0NZQ0xFU19QRVJfRlJBTUUJNTEyCisKKy8qCisgKiBBbiBlcnJvciBvY2N1cnMgbmVhciBmcmFtZSAicm9sbG92ZXIiLiBUaGUgY2xvY2tzIGluIGZyYW1lIHZhbHVlIGluZGljYXRlcworICogd2hldGhlciB0aGlzIGVycm9yIG1heSBoYXZlIG9jY3VycmVkLiBIZXJlIHdlIHVzZSB0aGUgdmFsdWUgb2YgMTAuIFBsZWFzZQorICogc2VlIHRoZSBlcnJhdGEgZm9yIHRoZSByaWdodCBudW1iZXIgWzwxMF0KKyAqLworI2RlZmluZSBIREFfTUFYX0NZQ0xFX1ZBTFVFCQk0OTkKKyNkZWZpbmUgSERBX01BWF9DWUNMRV9PRkZTRVQJCTEwCisjZGVmaW5lIEhEQV9NQVhfQ1lDTEVfUkVBRF9SRVRSWQkxMAorCisjZGVmaW5lIFRTQ0NVX0NDVV9TSElGVAkJCTMyCisjZGVmaW5lIExMUENfQ0NVX1NISUZUCQkJMzIKKworCiAvKgogICogaGVscGVycyB0byByZWFkIHRoZSBzdHJlYW0gcG9zaXRpb24KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9oZGF1ZGlvLmggYi9pbmNsdWRlL3NvdW5kL2hkYXVkaW8uaAppbmRleCA5M2U2M2M1Li41NjAwNGVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2hkYXVkaW8uaAorKysgYi9pbmNsdWRlL3NvdW5kL2hkYXVkaW8uaApAQCAtMjQ1LDYgKzI0NSwxMiBAQAogCiAvKgogICogSEQtYXVkaW8gYnVzIGJhc2UgZHJpdmVyCisgKgorICogQHBwY2FwOiBwcCBjYXBhYmlsaXRpZXMgcG9pbnRlcgorICogQHNwYmNhcDogU1BJQiBjYXBhYmlsaXRpZXMgcG9pbnRlcgorICogQG1sY2FwOiBNdWx0aUxpbmsgY2FwYWJpbGl0aWVzIHBvaW50ZXIKKyAqIEBndHNjYXA6IGd0cyBjYXBhYmlsaXRpZXMgcG9pbnRlcgorICogQGRyc21jYXA6IGRtYSByZXN1bWUgY2FwYWJpbGl0aWVzIHBvaW50ZXIKICAqLwogc3RydWN0IGhkYWNfYnVzIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CkBAIC0yNTYsNiArMjYyLDEyIEBACiAJdm9pZCBfX2lvbWVtICpyZW1hcF9hZGRyOwogCWludCBpcnE7CiAKKwl2b2lkIF9faW9tZW0gKnBwY2FwOworCXZvaWQgX19pb21lbSAqc3BiY2FwOworCXZvaWQgX19pb21lbSAqbWxjYXA7CisJdm9pZCBfX2lvbWVtICpndHNjYXA7CisJdm9pZCBfX2lvbWVtICpkcnNtY2FwOworCiAJLyogY29kZWMgbGlua2VkIGxpc3QgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGNvZGVjX2xpc3Q7CiAJdW5zaWduZWQgaW50IG51bV9jb2RlY3M7CkBAIC0zMzUsNiArMzQ3LDcgQEAKIGludCBzbmRfaGRhY19idXNfc2VuZF9jbWQoc3RydWN0IGhkYWNfYnVzICpidXMsIHVuc2lnbmVkIGludCB2YWwpOwogaW50IHNuZF9oZGFjX2J1c19nZXRfcmVzcG9uc2Uoc3RydWN0IGhkYWNfYnVzICpidXMsIHVuc2lnbmVkIGludCBhZGRyLAogCQkJICAgICAgdW5zaWduZWQgaW50ICpyZXMpOworaW50IHNuZF9oZGFjX2J1c19wYXJzZV9jYXBhYmlsaXRpZXMoc3RydWN0IGhkYWNfYnVzICpidXMpOwogaW50IHNuZF9oZGFjX2xpbmtfcG93ZXIoc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYywgYm9vbCBlbmFibGUpOwogCiBib29sIHNuZF9oZGFjX2J1c19pbml0X2NoaXAoc3RydWN0IGhkYWNfYnVzICpidXMsIGJvb2wgZnVsbF9yZXNldCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2hkYXVkaW9fZXh0LmggYi9pbmNsdWRlL3NvdW5kL2hkYXVkaW9fZXh0LmgKaW5kZXggYjk1OTNiMi4uODY2MGE3ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9oZGF1ZGlvX2V4dC5oCisrKyBiL2luY2x1ZGUvc291bmQvaGRhdWRpb19leHQuaApAQCAtOCwxMSArOCw2IEBACiAgKgogICogQGJ1czogaGRhYyBidXMKICAqIEBudW1fc3RyZWFtczogc3RyZWFtcyBzdXBwb3J0ZWQKLSAqIEBwcGNhcDogcHAgY2FwYWJpbGl0aWVzIHBvaW50ZXIKLSAqIEBzcGJjYXA6IFNQSUIgY2FwYWJpbGl0aWVzIHBvaW50ZXIKLSAqIEBtbGNhcDogTXVsdGlMaW5rIGNhcGFiaWxpdGllcyBwb2ludGVyCi0gKiBAZ3RzY2FwOiBndHMgY2FwYWJpbGl0aWVzIHBvaW50ZXIKLSAqIEBkcnNtY2FwOiBkbWEgcmVzdW1lIGNhcGFiaWxpdGllcyBwb2ludGVyCiAgKiBAaGxpbmtfbGlzdDogbGluayBsaXN0IG9mIEhEQSBsaW5rcwogICogQGxvY2s6IGxvY2sgZm9yIGxpbmsgbWdtdAogICogQGNtZF9kbWFfc3RhdGU6IHN0YXRlIG9mIGNtZCBETUFzOiBDT1JCIGFuZCBSSVJCCkBAIC0yMiwxMiArMTcsNiBAQAogCWludCBudW1fc3RyZWFtczsKIAlpbnQgaWR4OwogCi0Jdm9pZCBfX2lvbWVtICpwcGNhcDsKLQl2b2lkIF9faW9tZW0gKnNwYmNhcDsKLQl2b2lkIF9faW9tZW0gKm1sY2FwOwotCXZvaWQgX19pb21lbSAqZ3RzY2FwOwotCXZvaWQgX19pb21lbSAqZHJzbWNhcDsKLQogCXN0cnVjdCBsaXN0X2hlYWQgaGxpbmtfbGlzdDsKIAogCXN0cnVjdCBtdXRleCBsb2NrOwpAQCAtNTQsNyArNDMsNiBAQAogI2RlZmluZSBIREFfQ09ERUNfRVhUX0VOVFJZKF92aWQsIF9yZXZpZCwgX25hbWUsIF9kcnZfZGF0YSkgXAogCUhEQV9DT0RFQ19SRVZfRVhUX0VOVFJZKF92aWQsIF9yZXZpZCwgX25hbWUsIF9kcnZfZGF0YSkKIAotaW50IHNuZF9oZGFjX2V4dF9idXNfcGFyc2VfY2FwYWJpbGl0aWVzKHN0cnVjdCBoZGFjX2V4dF9idXMgKnNidXMpOwogdm9pZCBzbmRfaGRhY19leHRfYnVzX3BwY2FwX2VuYWJsZShzdHJ1Y3QgaGRhY19leHRfYnVzICpjaGlwLCBib29sIGVuYWJsZSk7CiB2b2lkIHNuZF9oZGFjX2V4dF9idXNfcHBjYXBfaW50X2VuYWJsZShzdHJ1Y3QgaGRhY19leHRfYnVzICpjaGlwLCBib29sIGVuYWJsZSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvbDMuaCBiL2luY2x1ZGUvc291bmQvbDMuaAppbmRleCA0MjNhMDhmLi4xNDcxZGEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2wzLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9sMy5oCkBAIC0yLDkgKzIsMTUgQEAKICNkZWZpbmUgX0wzX0hfIDEKIAogc3RydWN0IGwzX3BpbnMgewotCXZvaWQgKCpzZXRkYXQpKGludCk7Ci0Jdm9pZCAoKnNldGNsaykoaW50KTsKLQl2b2lkICgqc2V0bW9kZSkoaW50KTsKKwl2b2lkICgqc2V0ZGF0KShzdHJ1Y3QgbDNfcGlucyAqLCBpbnQpOworCXZvaWQgKCpzZXRjbGspKHN0cnVjdCBsM19waW5zICosIGludCk7CisJdm9pZCAoKnNldG1vZGUpKHN0cnVjdCBsM19waW5zICosIGludCk7CisKKwlpbnQgZ3Bpb19kYXRhOworCWludCBncGlvX2NsazsKKwlpbnQgZ3Bpb19tb2RlOworCWludCB1c2VfZ3Bpb3M7CisKIAlpbnQgZGF0YV9ob2xkOwogCWludCBkYXRhX3NldHVwOwogCWludCBjbG9ja19oaWdoOwpAQCAtMTMsNiArMTksOSBAQAogCWludCBtb2RlX3NldHVwOwogfTsKIAorc3RydWN0IGRldmljZTsKKwogaW50IGwzX3dyaXRlKHN0cnVjdCBsM19waW5zICphZGFwLCB1OCBhZGRyLCB1OCAqZGF0YSwgaW50IGxlbik7CitpbnQgbDNfc2V0X2dwaW9fb3BzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGwzX3BpbnMgKmFkYXApOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvcnQ1NjYwLmggYi9pbmNsdWRlL3NvdW5kL3J0NTY2MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NWY4M2EKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3NvdW5kL3J0NTY2MC5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBsaW51eC9zb3VuZC9ydDU2NjAuaCAtLSBQbGF0Zm9ybSBkYXRhIGZvciBSVDU2NjAKKyAqCisgKiBDb3B5cmlnaHQgMjAxNiBSZWFsdGVrIFNlbWljb25kdWN0b3IgQ29ycC4KKyAqIEF1dGhvcjogT2RlciBDaGlvdSA8b2Rlcl9jaGlvdUByZWFsdGVrLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9TTkRfUlQ1NjYwX0gKKyNkZWZpbmUgX19MSU5VWF9TTkRfUlQ1NjYwX0gKKworZW51bSBydDU2NjBfZG1pYzFfZGF0YV9waW4geworCVJUNTY2MF9ETUlDMV9OVUxMLAorCVJUNTY2MF9ETUlDMV9EQVRBX0dQSU8yLAorCVJUNTY2MF9ETUlDMV9EQVRBX0lOMVAsCit9OworCitzdHJ1Y3QgcnQ1NjYwX3BsYXRmb3JtX2RhdGEgeworCS8qIElOMSAmIElOMyBjYW4gb3B0aW9uYWxseSBiZSBkaWZmZXJlbnRpYWwgKi8KKwlib29sIGluMV9kaWZmOworCWJvb2wgaW4zX2RpZmY7CisJYm9vbCB1c2VfbGRvMjsKKwlib29sIHBvd2Vyb2ZmX2NvZGVjX2luX3N1c3BlbmQ7CisKKwllbnVtIHJ0NTY2MF9kbWljMV9kYXRhX3BpbiBkbWljMV9kYXRhX3BpbjsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zM2MyNHh4X3VkYTEzNHguaCBiL2luY2x1ZGUvc291bmQvczNjMjR4eF91ZGExMzR4LmgKaW5kZXggMzNkZjRjYi4uZmZhZjFmMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9zM2MyNHh4X3VkYTEzNHguaAorKysgYi9pbmNsdWRlL3NvdW5kL3MzYzI0eHhfdWRhMTM0eC5oCkBAIC03LDcgKzcsNiBAQAogCWludCBsM19jbGs7CiAJaW50IGwzX21vZGU7CiAJaW50IGwzX2RhdGE7Ci0Jdm9pZCAoKnBvd2VyKSAoaW50KTsKIAlpbnQgbW9kZWw7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3NpbXBsZV9jYXJkX3V0aWxzLmggYi9pbmNsdWRlL3NvdW5kL3NpbXBsZV9jYXJkX3V0aWxzLmgKaW5kZXggODYwODhhZS4uZmQ2NDEyNTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvc2ltcGxlX2NhcmRfdXRpbHMuaAorKysgYi9pbmNsdWRlL3NvdW5kL3NpbXBsZV9jYXJkX3V0aWxzLmgKQEAgLTI3LDEwICsyNyw0NSBAQAogCQkJCSAgc3RydWN0IGRldmljZV9ub2RlICpjb2RlYywKIAkJCQkgIGNoYXIgKnByZWZpeCwKIAkJCQkgIHVuc2lnbmVkIGludCAqcmV0Zm10KTsKK19fcHJpbnRmKDMsIDQpCiBpbnQgYXNvY19zaW1wbGVfY2FyZF9zZXRfZGFpbGlua19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICAgICBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmssCiAJCQkJICAgICAgY29uc3QgY2hhciAqZm10LCAuLi4pOwogaW50IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfY2FyZF9uYW1lKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQsCiAJCQkJICAgICBjaGFyICpwcmVmaXgpOwogCisjZGVmaW5lIGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfY2xrX2NwdShub2RlLCBkYWlfbGluaywgc2ltcGxlX2RhaSkJCVwKKwlhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2Nsayhub2RlLCBkYWlfbGluay0+Y3B1X29mX25vZGUsIHNpbXBsZV9kYWkpCisjZGVmaW5lIGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfY2xrX2NvZGVjKG5vZGUsIGRhaV9saW5rLCBzaW1wbGVfZGFpKQkJXAorCWFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfY2xrKG5vZGUsIGRhaV9saW5rLT5jb2RlY19vZl9ub2RlLCBzaW1wbGVfZGFpKQoraW50IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfY2xrKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRhaV9vZl9ub2RlLAorCQkJICAgICAgIHN0cnVjdCBhc29jX3NpbXBsZV9kYWkgKnNpbXBsZV9kYWkpOworCisjZGVmaW5lIGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfY3B1KG5vZGUsIGRhaV9saW5rLAkJCQlcCisJCQkJICAgbGlzdF9uYW1lLCBjZWxsc19uYW1lLCBpc19zaW5nbGVfbGluaykJXAorCWFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfZGFpKG5vZGUsICZkYWlfbGluay0+Y3B1X29mX25vZGUsCQlcCisJCSZkYWlfbGluay0+Y3B1X2RhaV9uYW1lLCBsaXN0X25hbWUsIGNlbGxzX25hbWUsIGlzX3NpbmdsZV9saW5rKQorI2RlZmluZSBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2NvZGVjKG5vZGUsIGRhaV9saW5rLCBsaXN0X25hbWUsIGNlbGxzX25hbWUpCVwKKwlhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2RhaShub2RlLCAmZGFpX2xpbmstPmNvZGVjX29mX25vZGUsCQlcCisJCSZkYWlfbGluay0+Y29kZWNfZGFpX25hbWUsIGxpc3RfbmFtZSwgY2VsbHNfbmFtZSwgTlVMTCkKKyNkZWZpbmUgYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9wbGF0Zm9ybShub2RlLCBkYWlfbGluaywgbGlzdF9uYW1lLCBjZWxsc19uYW1lKQlcCisJYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9kYWkobm9kZSwgJmRhaV9saW5rLT5wbGF0Zm9ybV9vZl9ub2RlLAkJXAorCQlOVUxMLCBsaXN0X25hbWUsIGNlbGxzX25hbWUsIE5VTEwpCitpbnQgYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9kYWkoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJCSAgc3RydWN0IGRldmljZV9ub2RlICoqZW5kcG9pbnRfbnAsCisJCQkJICBjb25zdCBjaGFyICoqZGFpX25hbWUsCisJCQkJICBjb25zdCBjaGFyICpsaXN0X25hbWUsCisJCQkJICBjb25zdCBjaGFyICpjZWxsc19uYW1lLAorCQkJCSAgaW50ICppc19zaW5nbGVfbGlua3MpOworCitpbnQgYXNvY19zaW1wbGVfY2FyZF9pbml0X2RhaShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKKwkJCSAgICAgIHN0cnVjdCBhc29jX3NpbXBsZV9kYWkgKnNpbXBsZV9kYWkpOworCitpbnQgYXNvY19zaW1wbGVfY2FyZF9jYW5vbmljYWxpemVfZGFpbGluayhzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmspOwordm9pZCBhc29jX3NpbXBsZV9jYXJkX2Nhbm9uaWNhbGl6ZV9jcHUoc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rLAorCQkJCSAgICAgIGludCBpc19zaW5nbGVfbGlua3MpOworCitpbnQgYXNvY19zaW1wbGVfY2FyZF9jbGVhbl9yZWZlcmVuY2Uoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCk7CisKICNlbmRpZiAvKiBfX1NJTVBMRV9DQVJEX0NPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zb2MuaCBiL2luY2x1ZGUvc291bmQvc29jLmgKaW5kZXggNjE0NDg4Mi4uNGYxYzc4NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9zb2MuaAorKysgYi9pbmNsdWRlL3NvdW5kL3NvYy5oCkBAIC04OTgsMTQgKzg5OCw2IEBACiAJaW50ICgqcmVzdW1lKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqKTsKIAlzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnRfZHJpdmVyIGNvbXBvbmVudF9kcml2ZXI7CiAKLQkvKiBEZWZhdWx0IGNvbnRyb2wgYW5kIHNldHVwLCBhZGRlZCBhZnRlciBwcm9iZSgpIGlzIHJ1biAqLwotCWNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICpjb250cm9sczsKLQlpbnQgbnVtX2NvbnRyb2xzOwotCWNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpkYXBtX3dpZGdldHM7Ci0JaW50IG51bV9kYXBtX3dpZGdldHM7Ci0JY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSAqZGFwbV9yb3V0ZXM7Ci0JaW50IG51bV9kYXBtX3JvdXRlczsKLQogCS8qIGNvZGVjIHdpZGUgb3BlcmF0aW9ucyAqLwogCWludCAoKnNldF9zeXNjbGspKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKIAkJCSAgaW50IGNsa19pZCwgaW50IHNvdXJjZSwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpOwpAQCAtMTU0NywxNyArMTUzOSw2IEBACiAJcmV0dXJuIHNuZF9zb2NfY29tcG9uZW50X2dldF9kcnZkYXRhKCZwbGF0Zm9ybS0+Y29tcG9uZW50KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNuZF9zb2NfcGNtX3NldF9kcnZkYXRhKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCi0JCXZvaWQgKmRhdGEpCi17Ci0JZGV2X3NldF9kcnZkYXRhKHJ0ZC0+ZGV2LCBkYXRhKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkICpzbmRfc29jX3BjbV9nZXRfZHJ2ZGF0YShzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCXJldHVybiBkZXZfZ2V0X2RydmRhdGEocnRkLT5kZXYpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgc25kX3NvY19pbml0aWFsaXplX2NhcmRfbGlzdHMoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKIHsKIAlJTklUX0xJU1RfSEVBRCgmY2FyZC0+Y29kZWNfZGV2X2xpc3QpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC90bHYuaCBiL2luY2x1ZGUvc291bmQvdGx2LmgKaW5kZXggZGY5N2QxOS4uMzY3N2ViYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC90bHYuaAorKysgYi9pbmNsdWRlL3NvdW5kL3Rsdi5oCkBAIC0yMiw2NyArMjIsMzkgQEAKICAqCiAgKi8KIAotLyoKLSAqIFRMViBzdHJ1Y3R1cmUgaXMgcmlnaHQgYmVoaW5kIHRoZSBzdHJ1Y3Qgc25kX2N0bF90bHY6Ci0gKiAgIHVuc2lnbmVkIGludCB0eXBlICAJLSBzZWUgU05EUlZfQ1RMX1RMVlRfKgotICogICB1bnNpZ25lZCBpbnQgbGVuZ3RoCi0gKiAgIC4uLi4gZGF0YSBhbGlnbmVkIHRvIHNpemVvZih1bnNpZ25lZCBpbnQpLCB1c2UKLSAqICAgICAgICBibG9ja19sZW5ndGggPSAobGVuZ3RoICsgKHNpemVvZih1bnNpZ25lZCBpbnQpIC0gMSkpICYKLSAqICAgICAgICAgICAgICAgICAgICAgICB+KHNpemVvZih1bnNpZ25lZCBpbnQpIC0gMSkpIC4uLi4KLSAqLwotCiAjaW5jbHVkZSA8dWFwaS9zb3VuZC90bHYuaD4KIAotI2RlZmluZSBUTFZfSVRFTSh0eXBlLCAuLi4pIFwKLQkodHlwZSksIFRMVl9MRU5HVEgoX19WQV9BUkdTX18pLCBfX1ZBX0FSR1NfXwotI2RlZmluZSBUTFZfTEVOR1RIKC4uLikgXAotCSgodW5zaWduZWQgaW50KXNpemVvZigoY29uc3QgdW5zaWduZWQgaW50W10pIHsgX19WQV9BUkdTX18gfSkpCisvKiBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCB0aGVzZSBtYWNyb3MgYXJlIGFsaWFzZXMgdG8gdGhlIG9uZXMgaW4gVUFQSS4gKi8KKyNkZWZpbmUgVExWX0lURU0JCQlTTkRSVl9DVExfVExWRF9JVEVNCisjZGVmaW5lIFRMVl9MRU5HVEgJCQlTTkRSVl9DVExfVExWRF9MRU5HVEgKIAotI2RlZmluZSBUTFZfQ09OVEFJTkVSX0lURU0oLi4uKSBcCi0JVExWX0lURU0oU05EUlZfQ1RMX1RMVlRfQ09OVEFJTkVSLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgREVDTEFSRV9UTFZfQ09OVEFJTkVSKG5hbWUsIC4uLikgXAotCXVuc2lnbmVkIGludCBuYW1lW10gPSB7IFRMVl9DT05UQUlORVJfSVRFTShfX1ZBX0FSR1NfXykgfQorI2RlZmluZSBUTFZfQ09OVEFJTkVSX0lURU0JCVNORFJWX0NUTF9UTFZEX0NPTlRBSU5FUl9JVEVNCisjZGVmaW5lIERFQ0xBUkVfVExWX0NPTlRBSU5FUgkJU05EUlZfQ1RMX1RMVkRfREVDTEFSRV9DT05UQUlORVIKIAotI2RlZmluZSBUTFZfREJfU0NBTEVfTUFTSwkweGZmZmYKLSNkZWZpbmUgVExWX0RCX1NDQUxFX01VVEUJMHgxMDAwMAotI2RlZmluZSBUTFZfREJfU0NBTEVfSVRFTShtaW4sIHN0ZXAsIG11dGUpCQkJXAotCVRMVl9JVEVNKFNORFJWX0NUTF9UTFZUX0RCX1NDQUxFLAkJCVwKLQkJIChtaW4pLAkJCQkJXAotCQkgKChzdGVwKSAmIFRMVl9EQl9TQ0FMRV9NQVNLKSB8CQlcCi0JCQkoKG11dGUpID8gVExWX0RCX1NDQUxFX01VVEUgOiAwKSkKLSNkZWZpbmUgREVDTEFSRV9UTFZfREJfU0NBTEUobmFtZSwgbWluLCBzdGVwLCBtdXRlKSBcCi0JdW5zaWduZWQgaW50IG5hbWVbXSA9IHsgVExWX0RCX1NDQUxFX0lURU0obWluLCBzdGVwLCBtdXRlKSB9CisjZGVmaW5lIFRMVl9EQl9TQ0FMRV9NQVNLCQlTTkRSVl9DVExfVExWRF9EQl9TQ0FMRV9NQVNLCisjZGVmaW5lIFRMVl9EQl9TQ0FMRV9NVVRFCQlTTkRSVl9DVExfVExWRF9EQl9TQ0FMRV9NVVRFCisjZGVmaW5lIFRMVl9EQl9TQ0FMRV9JVEVNCQlTTkRSVl9DVExfVExWRF9EQl9TQ0FMRV9JVEVNCisjZGVmaW5lIERFQ0xBUkVfVExWX0RCX1NDQUxFCQlTTkRSVl9DVExfVExWRF9ERUNMQVJFX0RCX1NDQUxFCiAKLS8qIGRCIHNjYWxlIHNwZWNpZmllZCB3aXRoIG1pbi9tYXggdmFsdWVzIGluc3RlYWQgb2Ygc3RlcCAqLwotI2RlZmluZSBUTFZfREJfTUlOTUFYX0lURU0obWluX2RCLCBtYXhfZEIpCQkJXAotCVRMVl9JVEVNKFNORFJWX0NUTF9UTFZUX0RCX01JTk1BWCwgKG1pbl9kQiksIChtYXhfZEIpKQotI2RlZmluZSBUTFZfREJfTUlOTUFYX01VVEVfSVRFTShtaW5fZEIsIG1heF9kQikJCQlcCi0JVExWX0lURU0oU05EUlZfQ1RMX1RMVlRfREJfTUlOTUFYX01VVEUsIChtaW5fZEIpLCAobWF4X2RCKSkKLSNkZWZpbmUgREVDTEFSRV9UTFZfREJfTUlOTUFYKG5hbWUsIG1pbl9kQiwgbWF4X2RCKSBcCi0JdW5zaWduZWQgaW50IG5hbWVbXSA9IHsgVExWX0RCX01JTk1BWF9JVEVNKG1pbl9kQiwgbWF4X2RCKSB9Ci0jZGVmaW5lIERFQ0xBUkVfVExWX0RCX01JTk1BWF9NVVRFKG5hbWUsIG1pbl9kQiwgbWF4X2RCKSBcCi0JdW5zaWduZWQgaW50IG5hbWVbXSA9IHsgVExWX0RCX01JTk1BWF9NVVRFX0lURU0obWluX2RCLCBtYXhfZEIpIH0KKyNkZWZpbmUgVExWX0RCX01JTk1BWF9JVEVNCQlTTkRSVl9DVExfVExWRF9EQl9NSU5NQVhfSVRFTQorI2RlZmluZSBUTFZfREJfTUlOTUFYX01VVEVfSVRFTQkJU05EUlZfQ1RMX1RMVkRfREJfTUlOTUFYX01VVEVfSVRFTQorI2RlZmluZSBERUNMQVJFX1RMVl9EQl9NSU5NQVgJCVNORFJWX0NUTF9UTFZEX0RFQ0xBUkVfREJfTUlOTUFYCisjZGVmaW5lIERFQ0xBUkVfVExWX0RCX01JTk1BWF9NVVRFCVNORFJWX0NUTF9UTFZEX0RFQ0xBUkVfREJfTUlOTUFYX01VVEUKIAotLyogbGluZWFyIHZvbHVtZSBiZXR3ZWVuIG1pbl9kQiBhbmQgbWF4X2RCICguMDFkQiB1bml0KSAqLwotI2RlZmluZSBUTFZfREJfTElORUFSX0lURU0obWluX2RCLCBtYXhfZEIpCQkgICAgXAotCVRMVl9JVEVNKFNORFJWX0NUTF9UTFZUX0RCX0xJTkVBUiwgKG1pbl9kQiksIChtYXhfZEIpKQotI2RlZmluZSBERUNMQVJFX1RMVl9EQl9MSU5FQVIobmFtZSwgbWluX2RCLCBtYXhfZEIpCVwKLQl1bnNpZ25lZCBpbnQgbmFtZVtdID0geyBUTFZfREJfTElORUFSX0lURU0obWluX2RCLCBtYXhfZEIpIH0KKyNkZWZpbmUgVExWX0RCX0xJTkVBUl9JVEVNCQlTTkRSVl9DVExfVExWRF9EQl9MSU5FQVJfSVRFTQorI2RlZmluZSBERUNMQVJFX1RMVl9EQl9MSU5FQVIJCVNORFJWX0NUTF9UTFZEX0RFQ0xBUkVfREJfTElORUFSCiAKLS8qIGRCIHJhbmdlIGNvbnRhaW5lcjoKLSAqIEl0ZW1zIGluIGRCIHJhbmdlIGNvbnRhaW5lciBtdXN0IGJlIG9yZGVyZWQgYnkgdGhlaXIgdmFsdWVzIGFuZCBieSB0aGVpcgotICogZEIgdmFsdWVzLiBUaGlzIGltcGxpZXMgdGhhdCBsYXJnZXIgdmFsdWVzIG11c3QgY29ycmVzcG9uZCB3aXRoIGxhcmdlcgotICogZEIgdmFsdWVzICh3aGljaCBpcyBhbHNvIHJlcXVpcmVkIGZvciBhbGwgb3RoZXIgbWl4ZXIgY29udHJvbHMpLgorI2RlZmluZSBUTFZfREJfUkFOR0VfSVRFTQkJU05EUlZfQ1RMX1RMVkRfREJfUkFOR0VfSVRFTQorI2RlZmluZSBERUNMQVJFX1RMVl9EQl9SQU5HRQkJU05EUlZfQ1RMX1RMVkRfREVDTEFSRV9EQl9SQU5HRQorCisjZGVmaW5lIFRMVl9EQl9HQUlOX01VVEUJCVNORFJWX0NUTF9UTFZEX0RCX0dBSU5fTVVURQorCisvKgorICogVGhlIGJlbG93IGFzc3VtZXMgdGhhdCBlYWNoIGl0ZW0gVExWIGlzIDQgd29yZHMgbGlrZSBEQl9TQ0FMRSBvciBMSU5FQVIuCisgKiBUaGlzIGlzIGFuIG9sZCBmYXNpb24gYW5kIG9ic29sZXRlZCBieSBjb21taXQgYmYxZDFjOWI2MTc5KCJBTFNBOiB0bHY6IGFkZAorICogREVDTEFSRV9UTFZfREJfUkFOR0UoKSIpLgogICovCi0vKiBFYWNoIGl0ZW0gaXM6IDxtaW4+IDxtYXg+IDxUTFY+ICovCi0jZGVmaW5lIFRMVl9EQl9SQU5HRV9JVEVNKC4uLikgXAotCVRMVl9JVEVNKFNORFJWX0NUTF9UTFZUX0RCX1JBTkdFLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgREVDTEFSRV9UTFZfREJfUkFOR0UobmFtZSwgLi4uKSBcCi0JdW5zaWduZWQgaW50IG5hbWVbXSA9IHsgVExWX0RCX1JBTkdFX0lURU0oX19WQV9BUkdTX18pIH0KLS8qIFRoZSBiZWxvdyBhc3N1bWVzIHRoYXQgZWFjaCBpdGVtIFRMViBpcyA0IHdvcmRzIGxpa2UgREJfU0NBTEUgb3IgTElORUFSICovCi0jZGVmaW5lIFRMVl9EQl9SQU5HRV9IRUFEKG51bSkJCQlcCisjZGVmaW5lIFRMVl9EQl9SQU5HRV9IRUFEKG51bSkgXAogCVNORFJWX0NUTF9UTFZUX0RCX1JBTkdFLCA2ICogKG51bSkgKiBzaXplb2YodW5zaWduZWQgaW50KQogCi0jZGVmaW5lIFRMVl9EQl9HQUlOX01VVEUJLTk5OTk5OTkKLQogI2VuZGlmIC8qIF9fU09VTkRfVExWX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2NwdWhwLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9jcHVocC5oCmluZGV4IGE3MmJkOTMuLjk5Njk1M2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2NwdWhwLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvY3B1aHAuaApAQCAtMzMsNiArMzMsMzQgQEAKIAkJICBfX2VudHJ5LT5jcHUsIF9fZW50cnktPnRhcmdldCwgX19lbnRyeS0+aWR4LCBfX2VudHJ5LT5mdW4pCiApOwogCitUUkFDRV9FVkVOVChjcHVocF9tdWx0aV9lbnRlciwKKworCVRQX1BST1RPKHVuc2lnbmVkIGludCBjcHUsCisJCSBpbnQgdGFyZ2V0LAorCQkgaW50IGlkeCwKKwkJIGludCAoKmZ1bikodW5zaWduZWQgaW50LCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqKSwKKwkJIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKSwKKworCVRQX0FSR1MoY3B1LCB0YXJnZXQsIGlkeCwgZnVuLCBub2RlKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoIHVuc2lnbmVkIGludCwJY3B1CQkpCisJCV9fZmllbGQoIGludCwJCXRhcmdldAkJKQorCQlfX2ZpZWxkKCBpbnQsCQlpZHgJCSkKKwkJX19maWVsZCggdm9pZCAqLAlmdW4JCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmNwdQk9IGNwdTsKKwkJX19lbnRyeS0+dGFyZ2V0CT0gdGFyZ2V0OworCQlfX2VudHJ5LT5pZHgJPSBpZHg7CisJCV9fZW50cnktPmZ1bgk9IGZ1bjsKKwkpLAorCisJVFBfcHJpbnRrKCJjcHU6ICUwNHUgdGFyZ2V0OiAlM2Qgc3RlcDogJTNkICglcGYpIiwKKwkJICBfX2VudHJ5LT5jcHUsIF9fZW50cnktPnRhcmdldCwgX19lbnRyeS0+aWR4LCBfX2VudHJ5LT5mdW4pCispOworCiBUUkFDRV9FVkVOVChjcHVocF9leGl0LAogCiAJVFBfUFJPVE8odW5zaWduZWQgaW50IGNwdSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2YyZnMuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2YyZnMuaAppbmRleCBmZjk1ZmQwMi4uOTAzYTA5MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvZjJmcy5oCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2YyZnMuaApAQCAtNTgsMTYgKzU4LDEyIEBACiAjZGVmaW5lIEYyRlNfQklPX0ZMQUdfTUFTSyh0KQkodCAmIChSRVFfUkFIRUFEIHwgV1JJVEVfRkxVU0hfRlVBKSkKICNkZWZpbmUgRjJGU19CSU9fRVhUUkFfTUFTSyh0KQkodCAmIChSRVFfTUVUQSB8IFJFUV9QUklPKSkKIAotI2RlZmluZSBzaG93X2Jpb190eXBlKG9wLCBvcF9mbGFncykgc2hvd19iaW9fb3Aob3ApLAkJCVwKLQkJCXNob3dfYmlvX29wX2ZsYWdzKG9wX2ZsYWdzKSwgc2hvd19iaW9fZXh0cmEob3BfZmxhZ3MpCi0KLSNkZWZpbmUgc2hvd19iaW9fb3Aob3ApCQkJCQkJCVwKLQlfX3ByaW50X3N5bWJvbGljKG9wLAkJCQkJCVwKLQkJeyBSRUFELCAJCSJSRUFEIiB9LAkJCVwKLQkJeyBXUklURSwJCSJXUklURSIgfSkKKyNkZWZpbmUgc2hvd19iaW9fdHlwZShvcF9mbGFncykJc2hvd19iaW9fb3BfZmxhZ3Mob3BfZmxhZ3MpLCAJCVwKKwkJCQkJCXNob3dfYmlvX2V4dHJhKG9wX2ZsYWdzKQogCiAjZGVmaW5lIHNob3dfYmlvX29wX2ZsYWdzKGZsYWdzKQkJCQkJXAogCV9fcHJpbnRfc3ltYm9saWMoRjJGU19CSU9fRkxBR19NQVNLKGZsYWdzKSwJCQlcCisJCXsgMCwJCQkiV1JJVEUiIH0sCQkJXAogCQl7IFJFUV9SQUhFQUQsIAkJIlJFQURBSEVBRCIgfSwJCQlcCiAJCXsgUkVBRF9TWU5DLCAJCSJSRUFEX1NZTkMiIH0sCQkJXAogCQl7IFdSSVRFX1NZTkMsIAkJIldSSVRFX1NZTkMiIH0sCQkJXApAQCAtNzU0LDEyICs3NTAsMTIgQEAKIAkpLAogCiAJVFBfcHJpbnRrKCJkZXYgPSAoJWQsJWQpLCBpbm8gPSAlbHUsIHBhZ2VfaW5kZXggPSAweCVseCwgIgotCQkib2xkYWRkciA9IDB4JWxseCwgbmV3YWRkciA9IDB4JWxseCBydyA9ICVzJXNpJXMsIHR5cGUgPSAlcyIsCisJCSJvbGRhZGRyID0gMHglbGx4LCBuZXdhZGRyID0gMHglbGx4LCBydyA9ICVzJXMsIHR5cGUgPSAlcyIsCiAJCXNob3dfZGV2X2lubyhfX2VudHJ5KSwKIAkJKHVuc2lnbmVkIGxvbmcpX19lbnRyeS0+aW5kZXgsCiAJCSh1bnNpZ25lZCBsb25nIGxvbmcpX19lbnRyeS0+b2xkX2Jsa2FkZHIsCiAJCSh1bnNpZ25lZCBsb25nIGxvbmcpX19lbnRyeS0+bmV3X2Jsa2FkZHIsCi0JCXNob3dfYmlvX3R5cGUoX19lbnRyeS0+b3AsIF9fZW50cnktPm9wX2ZsYWdzKSwKKwkJc2hvd19iaW9fdHlwZShfX2VudHJ5LT5vcF9mbGFncyksCiAJCXNob3dfYmxvY2tfdHlwZShfX2VudHJ5LT50eXBlKSkKICk7CiAKQEAgLTgwNiw5ICs4MDIsOSBAQAogCQlfX2VudHJ5LT5zaXplCQk9IGJpby0+YmlfaXRlci5iaV9zaXplOwogCSksCiAKLQlUUF9wcmludGsoImRldiA9ICglZCwlZCksICVzJXMlcywgJXMsIHNlY3RvciA9ICVsbGQsIHNpemUgPSAldSIsCisJVFBfcHJpbnRrKCJkZXYgPSAoJWQsJWQpLCBydyA9ICVzJXMsICVzLCBzZWN0b3IgPSAlbGxkLCBzaXplID0gJXUiLAogCQlzaG93X2RldihfX2VudHJ5KSwKLQkJc2hvd19iaW9fdHlwZShfX2VudHJ5LT5vcCwgX19lbnRyeS0+b3BfZmxhZ3MpLAorCQlzaG93X2Jpb190eXBlKF9fZW50cnktPm9wX2ZsYWdzKSwKIAkJc2hvd19ibG9ja190eXBlKF9fZW50cnktPnR5cGUpLAogCQkodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPnNlY3RvciwKIAkJX19lbnRyeS0+c2l6ZSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL21jZS5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvbWNlLmgKaW5kZXggNGNiYmNlZi4uNzBmMDIxNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvbWNlLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvbWNlLmgKQEAgLTIwLDYgKzIwLDggQEAKIAkJX19maWVsZCgJdTY0LAkJc3RhdHVzCQkpCiAJCV9fZmllbGQoCXU2NCwJCWFkZHIJCSkKIAkJX19maWVsZCgJdTY0LAkJbWlzYwkJKQorCQlfX2ZpZWxkKAl1NjQsCQlzeW5kCQkpCisJCV9fZmllbGQoCXU2NCwJCWlwaWQJCSkKIAkJX19maWVsZCgJdTY0LAkJaXAJCSkKIAkJX19maWVsZCgJdTY0LAkJdHNjCQkpCiAJCV9fZmllbGQoCXU2NCwJCXdhbGx0aW1lCSkKQEAgLTM4LDYgKzQwLDggQEAKIAkJX19lbnRyeS0+c3RhdHVzCQk9IG0tPnN0YXR1czsKIAkJX19lbnRyeS0+YWRkcgkJPSBtLT5hZGRyOwogCQlfX2VudHJ5LT5taXNjCQk9IG0tPm1pc2M7CisJCV9fZW50cnktPnN5bmQJCT0gbS0+c3luZDsKKwkJX19lbnRyeS0+aXBpZAkJPSBtLT5pcGlkOwogCQlfX2VudHJ5LT5pcAkJPSBtLT5pcDsKIAkJX19lbnRyeS0+dHNjCQk9IG0tPnRzYzsKIAkJX19lbnRyeS0+d2FsbHRpbWUJPSBtLT50aW1lOwpAQCAtNTAsMTEgKzU0LDEyIEBACiAJCV9fZW50cnktPmNwdXZlbmRvcgk9IG0tPmNwdXZlbmRvcjsKIAkpLAogCi0JVFBfcHJpbnRrKCJDUFU6ICVkLCBNQ0djL3M6ICVsbHgvJWxseCwgTUMlZDogJTAxNkx4LCBBRERSL01JU0M6ICUwMTZMeC8lMDE2THgsIFJJUDogJTAyeDo8JTAxNkx4PiwgVFNDOiAlbGx4LCBQUk9DRVNTT1I6ICV1OiV4LCBUSU1FOiAlbGx1LCBTT0NLRVQ6ICV1LCBBUElDOiAleCIsCisJVFBfcHJpbnRrKCJDUFU6ICVkLCBNQ0djL3M6ICVsbHgvJWxseCwgTUMlZDogJTAxNkx4LCBJUElEOiAlMDE2THgsIEFERFIvTUlTQy9TWU5EOiAlMDE2THgvJTAxNkx4LyUwMTZMeCwgUklQOiAlMDJ4OjwlMDE2THg+LCBUU0M6ICVsbHgsIFBST0NFU1NPUjogJXU6JXgsIFRJTUU6ICVsbHUsIFNPQ0tFVDogJXUsIEFQSUM6ICV4IiwKIAkJX19lbnRyeS0+Y3B1LAogCQlfX2VudHJ5LT5tY2djYXAsIF9fZW50cnktPm1jZ3N0YXR1cywKIAkJX19lbnRyeS0+YmFuaywgX19lbnRyeS0+c3RhdHVzLAotCQlfX2VudHJ5LT5hZGRyLCBfX2VudHJ5LT5taXNjLAorCQlfX2VudHJ5LT5pcGlkLAorCQlfX2VudHJ5LT5hZGRyLCBfX2VudHJ5LT5taXNjLCBfX2VudHJ5LT5zeW5kLAogCQlfX2VudHJ5LT5jcywgX19lbnRyeS0+aXAsCiAJCV9fZW50cnktPnRzYywKIAkJX19lbnRyeS0+Y3B1dmVuZG9yLCBfX2VudHJ5LT5jcHVpZCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3Bvd2VyLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9wb3dlci5oCmluZGV4IDE5ZTUwMzAuLjU0ZTNhYWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3Bvd2VyLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvcG93ZXIuaApAQCAtNjksNyArNjksOCBAQAogCQl1NjQgbXBlcmYsCiAJCXU2NCBhcGVyZiwKIAkJdTY0IHRzYywKLQkJdTMyIGZyZXEKKwkJdTMyIGZyZXEsCisJCXUzMiBpb19ib29zdAogCQkpLAogCiAJVFBfQVJHUyhjb3JlX2J1c3ksCkBAIC03OSw3ICs4MCw4IEBACiAJCW1wZXJmLAogCQlhcGVyZiwKIAkJdHNjLAotCQlmcmVxCisJCWZyZXEsCisJCWlvX2Jvb3N0CiAJCSksCiAKIAlUUF9TVFJVQ1RfX2VudHJ5KApAQCAtOTEsNiArOTMsNyBAQAogCQlfX2ZpZWxkKHU2NCwgYXBlcmYpCiAJCV9fZmllbGQodTY0LCB0c2MpCiAJCV9fZmllbGQodTMyLCBmcmVxKQorCQlfX2ZpZWxkKHUzMiwgaW9fYm9vc3QpCiAJCSksCiAKIAlUUF9mYXN0X2Fzc2lnbigKQEAgLTEwMiw5ICsxMDUsMTAgQEAKIAkJX19lbnRyeS0+YXBlcmYgPSBhcGVyZjsKIAkJX19lbnRyeS0+dHNjID0gdHNjOwogCQlfX2VudHJ5LT5mcmVxID0gZnJlcTsKKwkJX19lbnRyeS0+aW9fYm9vc3QgPSBpb19ib29zdDsKIAkJKSwKIAotCVRQX3ByaW50aygiY29yZV9idXN5PSVsdSBzY2FsZWQ9JWx1IGZyb209JWx1IHRvPSVsdSBtcGVyZj0lbGx1IGFwZXJmPSVsbHUgdHNjPSVsbHUgZnJlcT0lbHUgIiwKKwlUUF9wcmludGsoImNvcmVfYnVzeT0lbHUgc2NhbGVkPSVsdSBmcm9tPSVsdSB0bz0lbHUgbXBlcmY9JWxsdSBhcGVyZj0lbGx1IHRzYz0lbGx1IGZyZXE9JWx1IGlvX2Jvb3N0PSVsdSIsCiAJCSh1bnNpZ25lZCBsb25nKV9fZW50cnktPmNvcmVfYnVzeSwKIAkJKHVuc2lnbmVkIGxvbmcpX19lbnRyeS0+c2NhbGVkX2J1c3ksCiAJCSh1bnNpZ25lZCBsb25nKV9fZW50cnktPmZyb20sCkBAIC0xMTIsNyArMTE2LDggQEAKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZylfX2VudHJ5LT5tcGVyZiwKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZylfX2VudHJ5LT5hcGVyZiwKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZylfX2VudHJ5LT50c2MsCi0JCSh1bnNpZ25lZCBsb25nKV9fZW50cnktPmZyZXEKKwkJKHVuc2lnbmVkIGxvbmcpX19lbnRyeS0+ZnJlcSwKKwkJKHVuc2lnbmVkIGxvbmcpX19lbnRyeS0+aW9fYm9vc3QKIAkJKQogCiApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvcnhycGMuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3J4cnBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4M2U1ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3J4cnBjLmgKQEAgLTAsMCArMSw2MjUgQEAKKy8qIEFGX1JYUlBDIHRyYWNlcG9pbnRzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjdW5kZWYgVFJBQ0VfU1lTVEVNCisjZGVmaW5lIFRSQUNFX1NZU1RFTSByeHJwYworCisjaWYgIWRlZmluZWQoX1RSQUNFX1JYUlBDX0gpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpCisjZGVmaW5lIF9UUkFDRV9SWFJQQ19ICisKKyNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CisKK1RSQUNFX0VWRU5UKHJ4cnBjX2Nvbm4sCisJICAgIFRQX1BST1RPKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLCBlbnVtIHJ4cnBjX2Nvbm5fdHJhY2Ugb3AsCisJCSAgICAgaW50IHVzYWdlLCBjb25zdCB2b2lkICp3aGVyZSksCisKKwkgICAgVFBfQVJHUyhjb25uLCBvcCwgdXNhZ2UsIHdoZXJlKSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqLAljb25uCQkpCisJCSAgICBfX2ZpZWxkKGludCwJCQlvcAkJKQorCQkgICAgX19maWVsZChpbnQsCQkJdXNhZ2UJCSkKKwkJICAgIF9fZmllbGQoY29uc3Qgdm9pZCAqLAkJd2hlcmUJCSkKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJICAgIF9fZW50cnktPmNvbm4gPSBjb25uOworCQkgICAgX19lbnRyeS0+b3AgPSBvcDsKKwkJICAgIF9fZW50cnktPnVzYWdlID0gdXNhZ2U7CisJCSAgICBfX2VudHJ5LT53aGVyZSA9IHdoZXJlOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoIkM9JXAgJXMgdT0lZCBzcD0lcFNSIiwKKwkJICAgICAgX19lbnRyeS0+Y29ubiwKKwkJICAgICAgcnhycGNfY29ubl90cmFjZXNbX19lbnRyeS0+b3BdLAorCQkgICAgICBfX2VudHJ5LT51c2FnZSwKKwkJICAgICAgX19lbnRyeS0+d2hlcmUpCisJICAgICk7CisKK1RSQUNFX0VWRU5UKHJ4cnBjX2NsaWVudCwKKwkgICAgVFBfUFJPVE8oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sIGludCBjaGFubmVsLAorCQkgICAgIGVudW0gcnhycGNfY2xpZW50X3RyYWNlIG9wKSwKKworCSAgICBUUF9BUkdTKGNvbm4sIGNoYW5uZWwsIG9wKSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqLAljb25uCQkpCisJCSAgICBfX2ZpZWxkKHUzMiwJCQljaWQJCSkKKwkJICAgIF9fZmllbGQoaW50LAkJCWNoYW5uZWwJCSkKKwkJICAgIF9fZmllbGQoaW50LAkJCXVzYWdlCQkpCisJCSAgICBfX2ZpZWxkKGVudW0gcnhycGNfY2xpZW50X3RyYWNlLAlvcAkJKQorCQkgICAgX19maWVsZChlbnVtIHJ4cnBjX2Nvbm5fY2FjaGVfc3RhdGUsIGNzCQkpCisJCQkgICAgICksCisKKwkgICAgVFBfZmFzdF9hc3NpZ24oCisJCSAgICBfX2VudHJ5LT5jb25uID0gY29ubjsKKwkJICAgIF9fZW50cnktPmNoYW5uZWwgPSBjaGFubmVsOworCQkgICAgX19lbnRyeS0+dXNhZ2UgPSBhdG9taWNfcmVhZCgmY29ubi0+dXNhZ2UpOworCQkgICAgX19lbnRyeS0+b3AgPSBvcDsKKwkJICAgIF9fZW50cnktPmNpZCA9IGNvbm4tPnByb3RvLmNpZDsKKwkJICAgIF9fZW50cnktPmNzID0gY29ubi0+Y2FjaGVfc3RhdGU7CisJCQkgICApLAorCisJICAgIFRQX3ByaW50aygiQz0lcCBoPSUyZCAlcyAlcyBpPSUwOHggdT0lZCIsCisJCSAgICAgIF9fZW50cnktPmNvbm4sCisJCSAgICAgIF9fZW50cnktPmNoYW5uZWwsCisJCSAgICAgIHJ4cnBjX2NsaWVudF90cmFjZXNbX19lbnRyeS0+b3BdLAorCQkgICAgICByeHJwY19jb25uX2NhY2hlX3N0YXRlc1tfX2VudHJ5LT5jc10sCisJCSAgICAgIF9fZW50cnktPmNpZCwKKwkJICAgICAgX19lbnRyeS0+dXNhZ2UpCisJICAgICk7CisKK1RSQUNFX0VWRU5UKHJ4cnBjX2NhbGwsCisJICAgIFRQX1BST1RPKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBlbnVtIHJ4cnBjX2NhbGxfdHJhY2Ugb3AsCisJCSAgICAgaW50IHVzYWdlLCBjb25zdCB2b2lkICp3aGVyZSwgY29uc3Qgdm9pZCAqYXV4KSwKKworCSAgICBUUF9BUkdTKGNhbGwsIG9wLCB1c2FnZSwgd2hlcmUsIGF1eCksCisKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQoc3RydWN0IHJ4cnBjX2NhbGwgKiwJY2FsbAkJKQorCQkgICAgX19maWVsZChpbnQsCQkJb3AJCSkKKwkJICAgIF9fZmllbGQoaW50LAkJCXVzYWdlCQkpCisJCSAgICBfX2ZpZWxkKGNvbnN0IHZvaWQgKiwJCXdoZXJlCQkpCisJCSAgICBfX2ZpZWxkKGNvbnN0IHZvaWQgKiwJCWF1eAkJKQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkgICAgX19lbnRyeS0+Y2FsbCA9IGNhbGw7CisJCSAgICBfX2VudHJ5LT5vcCA9IG9wOworCQkgICAgX19lbnRyeS0+dXNhZ2UgPSB1c2FnZTsKKwkJICAgIF9fZW50cnktPndoZXJlID0gd2hlcmU7CisJCSAgICBfX2VudHJ5LT5hdXggPSBhdXg7CisJCQkgICApLAorCisJICAgIFRQX3ByaW50aygiYz0lcCAlcyB1PSVkIHNwPSVwU1IgYT0lcCIsCisJCSAgICAgIF9fZW50cnktPmNhbGwsCisJCSAgICAgIHJ4cnBjX2NhbGxfdHJhY2VzW19fZW50cnktPm9wXSwKKwkJICAgICAgX19lbnRyeS0+dXNhZ2UsCisJCSAgICAgIF9fZW50cnktPndoZXJlLAorCQkgICAgICBfX2VudHJ5LT5hdXgpCisJICAgICk7CisKK1RSQUNFX0VWRU5UKHJ4cnBjX3NrYiwKKwkgICAgVFBfUFJPVE8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgZW51bSByeHJwY19za2JfdHJhY2Ugb3AsCisJCSAgICAgaW50IHVzYWdlLCBpbnQgbW9kX2NvdW50LCBjb25zdCB2b2lkICp3aGVyZSksCisKKwkgICAgVFBfQVJHUyhza2IsIG9wLCB1c2FnZSwgbW9kX2NvdW50LCB3aGVyZSksCisKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQoc3RydWN0IHNrX2J1ZmYgKiwJCXNrYgkJKQorCQkgICAgX19maWVsZChlbnVtIHJ4cnBjX3NrYl90cmFjZSwJb3AJCSkKKwkJICAgIF9fZmllbGQoaW50LAkJCXVzYWdlCQkpCisJCSAgICBfX2ZpZWxkKGludCwJCQltb2RfY291bnQJKQorCQkgICAgX19maWVsZChjb25zdCB2b2lkICosCQl3aGVyZQkJKQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkgICAgX19lbnRyeS0+c2tiID0gc2tiOworCQkgICAgX19lbnRyeS0+b3AgPSBvcDsKKwkJICAgIF9fZW50cnktPnVzYWdlID0gdXNhZ2U7CisJCSAgICBfX2VudHJ5LT5tb2RfY291bnQgPSBtb2RfY291bnQ7CisJCSAgICBfX2VudHJ5LT53aGVyZSA9IHdoZXJlOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoInM9JXAgJXMgdT0lZCBtPSVkIHA9JXBTUiIsCisJCSAgICAgIF9fZW50cnktPnNrYiwKKwkJICAgICAgcnhycGNfc2tiX3RyYWNlc1tfX2VudHJ5LT5vcF0sCisJCSAgICAgIF9fZW50cnktPnVzYWdlLAorCQkgICAgICBfX2VudHJ5LT5tb2RfY291bnQsCisJCSAgICAgIF9fZW50cnktPndoZXJlKQorCSAgICApOworCitUUkFDRV9FVkVOVChyeHJwY19yeF9wYWNrZXQsCisJICAgIFRQX1BST1RPKHN0cnVjdCByeHJwY19za2JfcHJpdiAqc3ApLAorCisJICAgIFRQX0FSR1Moc3ApLAorCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCSAgICBfX2ZpZWxkX3N0cnVjdChzdHJ1Y3QgcnhycGNfaG9zdF9oZWFkZXIsCWhkcgkJKQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkgICAgbWVtY3B5KCZfX2VudHJ5LT5oZHIsICZzcC0+aGRyLCBzaXplb2YoX19lbnRyeS0+aGRyKSk7CisJCQkgICApLAorCisJICAgIFRQX3ByaW50aygiJTA4eDolMDh4OiUwOHg6JTA0eCAlMDh4ICUwOHggJTAyeCAlMDJ4ICVzIiwKKwkJICAgICAgX19lbnRyeS0+aGRyLmVwb2NoLCBfX2VudHJ5LT5oZHIuY2lkLAorCQkgICAgICBfX2VudHJ5LT5oZHIuY2FsbE51bWJlciwgX19lbnRyeS0+aGRyLnNlcnZpY2VJZCwKKwkJICAgICAgX19lbnRyeS0+aGRyLnNlcmlhbCwgX19lbnRyeS0+aGRyLnNlcSwKKwkJICAgICAgX19lbnRyeS0+aGRyLnR5cGUsIF9fZW50cnktPmhkci5mbGFncywKKwkJICAgICAgX19lbnRyeS0+aGRyLnR5cGUgPD0gMTUgPyByeHJwY19wa3RzW19fZW50cnktPmhkci50eXBlXSA6ICI/VU5LIikKKwkgICAgKTsKKworVFJBQ0VfRVZFTlQocnhycGNfcnhfZG9uZSwKKwkgICAgVFBfUFJPVE8oaW50IHJlc3VsdCwgaW50IGFib3J0X2NvZGUpLAorCisJICAgIFRQX0FSR1MocmVzdWx0LCBhYm9ydF9jb2RlKSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChpbnQsCQkJcmVzdWx0CQkpCisJCSAgICBfX2ZpZWxkKGludCwJCQlhYm9ydF9jb2RlCSkKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJICAgIF9fZW50cnktPnJlc3VsdCA9IHJlc3VsdDsKKwkJICAgIF9fZW50cnktPmFib3J0X2NvZGUgPSBhYm9ydF9jb2RlOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoInI9JWQgYT0lZCIsIF9fZW50cnktPnJlc3VsdCwgX19lbnRyeS0+YWJvcnRfY29kZSkKKwkgICAgKTsKKworVFJBQ0VfRVZFTlQocnhycGNfYWJvcnQsCisJICAgIFRQX1BST1RPKGNvbnN0IGNoYXIgKndoeSwgdTMyIGNpZCwgdTMyIGNhbGxfaWQsIHJ4cnBjX3NlcV90IHNlcSwKKwkJICAgICBpbnQgYWJvcnRfY29kZSwgaW50IGVycm9yKSwKKworCSAgICBUUF9BUkdTKHdoeSwgY2lkLCBjYWxsX2lkLCBzZXEsIGFib3J0X2NvZGUsIGVycm9yKSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19hcnJheShjaGFyLAkJCXdoeSwgNAkJKQorCQkgICAgX19maWVsZCh1MzIsCQkJY2lkCQkpCisJCSAgICBfX2ZpZWxkKHUzMiwJCQljYWxsX2lkCQkpCisJCSAgICBfX2ZpZWxkKHJ4cnBjX3NlcV90LAkJc2VxCQkpCisJCSAgICBfX2ZpZWxkKGludCwJCQlhYm9ydF9jb2RlCSkKKwkJICAgIF9fZmllbGQoaW50LAkJCWVycm9yCQkpCisJCQkgICAgICksCisKKwkgICAgVFBfZmFzdF9hc3NpZ24oCisJCSAgICBtZW1jcHkoX19lbnRyeS0+d2h5LCB3aHksIDQpOworCQkgICAgX19lbnRyeS0+Y2lkID0gY2lkOworCQkgICAgX19lbnRyeS0+Y2FsbF9pZCA9IGNhbGxfaWQ7CisJCSAgICBfX2VudHJ5LT5hYm9ydF9jb2RlID0gYWJvcnRfY29kZTsKKwkJICAgIF9fZW50cnktPmVycm9yID0gZXJyb3I7CisJCSAgICBfX2VudHJ5LT5zZXEgPSBzZXE7CisJCQkgICApLAorCisJICAgIFRQX3ByaW50aygiJTA4eDolMDh4IHM9JXUgYT0lZCBlPSVkICVzIiwKKwkJICAgICAgX19lbnRyeS0+Y2lkLCBfX2VudHJ5LT5jYWxsX2lkLCBfX2VudHJ5LT5zZXEsCisJCSAgICAgIF9fZW50cnktPmFib3J0X2NvZGUsIF9fZW50cnktPmVycm9yLCBfX2VudHJ5LT53aHkpCisJICAgICk7CisKK1RSQUNFX0VWRU5UKHJ4cnBjX3RyYW5zbWl0LAorCSAgICBUUF9QUk9UTyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgZW51bSByeHJwY190cmFuc21pdF90cmFjZSB3aHkpLAorCisJICAgIFRQX0FSR1MoY2FsbCwgd2h5KSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChzdHJ1Y3QgcnhycGNfY2FsbCAqLAljYWxsCQkpCisJCSAgICBfX2ZpZWxkKGVudW0gcnhycGNfdHJhbnNtaXRfdHJhY2UsCXdoeQkJKQorCQkgICAgX19maWVsZChyeHJwY19zZXFfdCwJCXR4X2hhcmRfYWNrCSkKKwkJICAgIF9fZmllbGQocnhycGNfc2VxX3QsCQl0eF90b3AJCSkKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJICAgIF9fZW50cnktPmNhbGwgPSBjYWxsOworCQkgICAgX19lbnRyeS0+d2h5ID0gd2h5OworCQkgICAgX19lbnRyeS0+dHhfaGFyZF9hY2sgPSBjYWxsLT50eF9oYXJkX2FjazsKKwkJICAgIF9fZW50cnktPnR4X3RvcCA9IGNhbGwtPnR4X3RvcDsKKwkJCSAgICksCisKKwkgICAgVFBfcHJpbnRrKCJjPSVwICVzIGY9JTA4eCBuPSV1IiwKKwkJICAgICAgX19lbnRyeS0+Y2FsbCwKKwkJICAgICAgcnhycGNfdHJhbnNtaXRfdHJhY2VzW19fZW50cnktPndoeV0sCisJCSAgICAgIF9fZW50cnktPnR4X2hhcmRfYWNrICsgMSwKKwkJICAgICAgX19lbnRyeS0+dHhfdG9wIC0gX19lbnRyeS0+dHhfaGFyZF9hY2spCisJICAgICk7CisKK1RSQUNFX0VWRU5UKHJ4cnBjX3J4X2FjaywKKwkgICAgVFBfUFJPVE8oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHJ4cnBjX3NlcV90IGZpcnN0LCB1OCByZWFzb24sIHU4IG5fYWNrcyksCisKKwkgICAgVFBfQVJHUyhjYWxsLCBmaXJzdCwgcmVhc29uLCBuX2Fja3MpLAorCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCSAgICBfX2ZpZWxkKHN0cnVjdCByeHJwY19jYWxsICosCWNhbGwJCSkKKwkJICAgIF9fZmllbGQocnhycGNfc2VxX3QsCQlmaXJzdAkJKQorCQkgICAgX19maWVsZCh1OCwJCQkJcmVhc29uCQkpCisJCSAgICBfX2ZpZWxkKHU4LAkJCQluX2Fja3MJCSkKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJICAgIF9fZW50cnktPmNhbGwgPSBjYWxsOworCQkgICAgX19lbnRyeS0+Zmlyc3QgPSBmaXJzdDsKKwkJICAgIF9fZW50cnktPnJlYXNvbiA9IHJlYXNvbjsKKwkJICAgIF9fZW50cnktPm5fYWNrcyA9IG5fYWNrczsKKwkJCSAgICksCisKKwkgICAgVFBfcHJpbnRrKCJjPSVwICVzIGY9JTA4eCBuPSV1IiwKKwkJICAgICAgX19lbnRyeS0+Y2FsbCwKKwkJICAgICAgcnhycGNfYWNrX25hbWVzW19fZW50cnktPnJlYXNvbl0sCisJCSAgICAgIF9fZW50cnktPmZpcnN0LAorCQkgICAgICBfX2VudHJ5LT5uX2Fja3MpCisJICAgICk7CisKK1RSQUNFX0VWRU5UKHJ4cnBjX3R4X2RhdGEsCisJICAgIFRQX1BST1RPKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCByeHJwY19zZXFfdCBzZXEsCisJCSAgICAgcnhycGNfc2VyaWFsX3Qgc2VyaWFsLCB1OCBmbGFncywgYm9vbCByZXRyYW5zLCBib29sIGxvc2UpLAorCisJICAgIFRQX0FSR1MoY2FsbCwgc2VxLCBzZXJpYWwsIGZsYWdzLCByZXRyYW5zLCBsb3NlKSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChzdHJ1Y3QgcnhycGNfY2FsbCAqLAljYWxsCQkpCisJCSAgICBfX2ZpZWxkKHJ4cnBjX3NlcV90LAkJc2VxCQkpCisJCSAgICBfX2ZpZWxkKHJ4cnBjX3NlcmlhbF90LAkJc2VyaWFsCQkpCisJCSAgICBfX2ZpZWxkKHU4LAkJCQlmbGFncwkJKQorCQkgICAgX19maWVsZChib29sLAkJCXJldHJhbnMJCSkKKwkJICAgIF9fZmllbGQoYm9vbCwJCQlsb3NlCQkpCisJCQkgICAgICksCisKKwkgICAgVFBfZmFzdF9hc3NpZ24oCisJCSAgICBfX2VudHJ5LT5jYWxsID0gY2FsbDsKKwkJICAgIF9fZW50cnktPnNlcSA9IHNlcTsKKwkJICAgIF9fZW50cnktPnNlcmlhbCA9IHNlcmlhbDsKKwkJICAgIF9fZW50cnktPmZsYWdzID0gZmxhZ3M7CisJCSAgICBfX2VudHJ5LT5yZXRyYW5zID0gcmV0cmFuczsKKwkJICAgIF9fZW50cnktPmxvc2UgPSBsb3NlOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoImM9JXAgREFUQSAlMDh4IHE9JTA4eCBmbD0lMDJ4JXMlcyIsCisJCSAgICAgIF9fZW50cnktPmNhbGwsCisJCSAgICAgIF9fZW50cnktPnNlcmlhbCwKKwkJICAgICAgX19lbnRyeS0+c2VxLAorCQkgICAgICBfX2VudHJ5LT5mbGFncywKKwkJICAgICAgX19lbnRyeS0+cmV0cmFucyA/ICIgKlJFVFJBTlMqIiA6ICIiLAorCQkgICAgICBfX2VudHJ5LT5sb3NlID8gIiAqTE9TRSoiIDogIiIpCisJICAgICk7CisKK1RSQUNFX0VWRU5UKHJ4cnBjX3R4X2FjaywKKwkgICAgVFBfUFJPVE8oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHJ4cnBjX3NlcmlhbF90IHNlcmlhbCwKKwkJICAgICByeHJwY19zZXFfdCBhY2tfZmlyc3QsIHJ4cnBjX3NlcmlhbF90IGFja19zZXJpYWwsCisJCSAgICAgdTggcmVhc29uLCB1OCBuX2Fja3MpLAorCisJICAgIFRQX0FSR1MoY2FsbCwgc2VyaWFsLCBhY2tfZmlyc3QsIGFja19zZXJpYWwsIHJlYXNvbiwgbl9hY2tzKSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChzdHJ1Y3QgcnhycGNfY2FsbCAqLAljYWxsCQkpCisJCSAgICBfX2ZpZWxkKHJ4cnBjX3NlcmlhbF90LAkJc2VyaWFsCQkpCisJCSAgICBfX2ZpZWxkKHJ4cnBjX3NlcV90LAkJYWNrX2ZpcnN0CSkKKwkJICAgIF9fZmllbGQocnhycGNfc2VyaWFsX3QsCQlhY2tfc2VyaWFsCSkKKwkJICAgIF9fZmllbGQodTgsCQkJCXJlYXNvbgkJKQorCQkgICAgX19maWVsZCh1OCwJCQkJbl9hY2tzCQkpCisJCQkgICAgICksCisKKwkgICAgVFBfZmFzdF9hc3NpZ24oCisJCSAgICBfX2VudHJ5LT5jYWxsID0gY2FsbDsKKwkJICAgIF9fZW50cnktPnNlcmlhbCA9IHNlcmlhbDsKKwkJICAgIF9fZW50cnktPmFja19maXJzdCA9IGFja19maXJzdDsKKwkJICAgIF9fZW50cnktPmFja19zZXJpYWwgPSBhY2tfc2VyaWFsOworCQkgICAgX19lbnRyeS0+cmVhc29uID0gcmVhc29uOworCQkgICAgX19lbnRyeS0+bl9hY2tzID0gbl9hY2tzOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoIiBjPSVwIEFDSyAgJTA4eCAlcyBmPSUwOHggcj0lMDh4IG49JXUiLAorCQkgICAgICBfX2VudHJ5LT5jYWxsLAorCQkgICAgICBfX2VudHJ5LT5zZXJpYWwsCisJCSAgICAgIHJ4cnBjX2Fja19uYW1lc1tfX2VudHJ5LT5yZWFzb25dLAorCQkgICAgICBfX2VudHJ5LT5hY2tfZmlyc3QsCisJCSAgICAgIF9fZW50cnktPmFja19zZXJpYWwsCisJCSAgICAgIF9fZW50cnktPm5fYWNrcykKKwkgICAgKTsKKworVFJBQ0VfRVZFTlQocnhycGNfcmVjZWl2ZSwKKwkgICAgVFBfUFJPVE8oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIGVudW0gcnhycGNfcmVjZWl2ZV90cmFjZSB3aHksCisJCSAgICAgcnhycGNfc2VyaWFsX3Qgc2VyaWFsLCByeHJwY19zZXFfdCBzZXEpLAorCisJICAgIFRQX0FSR1MoY2FsbCwgd2h5LCBzZXJpYWwsIHNlcSksCisKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQoc3RydWN0IHJ4cnBjX2NhbGwgKiwJY2FsbAkJKQorCQkgICAgX19maWVsZChlbnVtIHJ4cnBjX3JlY2VpdmVfdHJhY2UsCXdoeQkJKQorCQkgICAgX19maWVsZChyeHJwY19zZXJpYWxfdCwJCXNlcmlhbAkJKQorCQkgICAgX19maWVsZChyeHJwY19zZXFfdCwJCXNlcQkJKQorCQkgICAgX19maWVsZChyeHJwY19zZXFfdCwJCWhhcmRfYWNrCSkKKwkJICAgIF9fZmllbGQocnhycGNfc2VxX3QsCQl0b3AJCSkKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJICAgIF9fZW50cnktPmNhbGwgPSBjYWxsOworCQkgICAgX19lbnRyeS0+d2h5ID0gd2h5OworCQkgICAgX19lbnRyeS0+c2VyaWFsID0gc2VyaWFsOworCQkgICAgX19lbnRyeS0+c2VxID0gc2VxOworCQkgICAgX19lbnRyeS0+aGFyZF9hY2sgPSBjYWxsLT5yeF9oYXJkX2FjazsKKwkJICAgIF9fZW50cnktPnRvcCA9IGNhbGwtPnJ4X3RvcDsKKwkJCSAgICksCisKKwkgICAgVFBfcHJpbnRrKCJjPSVwICVzIHI9JTA4eCBxPSUwOHggdz0lMDh4LSUwOHgiLAorCQkgICAgICBfX2VudHJ5LT5jYWxsLAorCQkgICAgICByeHJwY19yZWNlaXZlX3RyYWNlc1tfX2VudHJ5LT53aHldLAorCQkgICAgICBfX2VudHJ5LT5zZXJpYWwsCisJCSAgICAgIF9fZW50cnktPnNlcSwKKwkJICAgICAgX19lbnRyeS0+aGFyZF9hY2ssCisJCSAgICAgIF9fZW50cnktPnRvcCkKKwkgICAgKTsKKworVFJBQ0VfRVZFTlQocnhycGNfcmVjdm1zZywKKwkgICAgVFBfUFJPVE8oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIGVudW0gcnhycGNfcmVjdm1zZ190cmFjZSB3aHksCisJCSAgICAgcnhycGNfc2VxX3Qgc2VxLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuLAorCQkgICAgIGludCByZXQpLAorCisJICAgIFRQX0FSR1MoY2FsbCwgd2h5LCBzZXEsIG9mZnNldCwgbGVuLCByZXQpLAorCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCSAgICBfX2ZpZWxkKHN0cnVjdCByeHJwY19jYWxsICosCWNhbGwJCSkKKwkJICAgIF9fZmllbGQoZW51bSByeHJwY19yZWN2bXNnX3RyYWNlLAl3aHkJCSkKKwkJICAgIF9fZmllbGQocnhycGNfc2VxX3QsCQlzZXEJCSkKKwkJICAgIF9fZmllbGQodW5zaWduZWQgaW50LAkJb2Zmc2V0CQkpCisJCSAgICBfX2ZpZWxkKHVuc2lnbmVkIGludCwJCWxlbgkJKQorCQkgICAgX19maWVsZChpbnQsCQkJcmV0CQkpCisJCQkgICAgICksCisKKwkgICAgVFBfZmFzdF9hc3NpZ24oCisJCSAgICBfX2VudHJ5LT5jYWxsID0gY2FsbDsKKwkJICAgIF9fZW50cnktPndoeSA9IHdoeTsKKwkJICAgIF9fZW50cnktPnNlcSA9IHNlcTsKKwkJICAgIF9fZW50cnktPm9mZnNldCA9IG9mZnNldDsKKwkJICAgIF9fZW50cnktPmxlbiA9IGxlbjsKKwkJICAgIF9fZW50cnktPnJldCA9IHJldDsKKwkJCSAgICksCisKKwkgICAgVFBfcHJpbnRrKCJjPSVwICVzIHE9JTA4eCBvPSV1IGw9JXUgcmV0PSVkIiwKKwkJICAgICAgX19lbnRyeS0+Y2FsbCwKKwkJICAgICAgcnhycGNfcmVjdm1zZ190cmFjZXNbX19lbnRyeS0+d2h5XSwKKwkJICAgICAgX19lbnRyeS0+c2VxLAorCQkgICAgICBfX2VudHJ5LT5vZmZzZXQsCisJCSAgICAgIF9fZW50cnktPmxlbiwKKwkJICAgICAgX19lbnRyeS0+cmV0KQorCSAgICApOworCitUUkFDRV9FVkVOVChyeHJwY19ydHRfdHgsCisJICAgIFRQX1BST1RPKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBlbnVtIHJ4cnBjX3J0dF90eF90cmFjZSB3aHksCisJCSAgICAgcnhycGNfc2VyaWFsX3Qgc2VuZF9zZXJpYWwpLAorCisJICAgIFRQX0FSR1MoY2FsbCwgd2h5LCBzZW5kX3NlcmlhbCksCisKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQoc3RydWN0IHJ4cnBjX2NhbGwgKiwJY2FsbAkJKQorCQkgICAgX19maWVsZChlbnVtIHJ4cnBjX3J0dF90eF90cmFjZSwJd2h5CQkpCisJCSAgICBfX2ZpZWxkKHJ4cnBjX3NlcmlhbF90LAkJc2VuZF9zZXJpYWwJKQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkgICAgX19lbnRyeS0+Y2FsbCA9IGNhbGw7CisJCSAgICBfX2VudHJ5LT53aHkgPSB3aHk7CisJCSAgICBfX2VudHJ5LT5zZW5kX3NlcmlhbCA9IHNlbmRfc2VyaWFsOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoImM9JXAgJXMgc3I9JTA4eCIsCisJCSAgICAgIF9fZW50cnktPmNhbGwsCisJCSAgICAgIHJ4cnBjX3J0dF90eF90cmFjZXNbX19lbnRyeS0+d2h5XSwKKwkJICAgICAgX19lbnRyeS0+c2VuZF9zZXJpYWwpCisJICAgICk7CisKK1RSQUNFX0VWRU5UKHJ4cnBjX3J0dF9yeCwKKwkgICAgVFBfUFJPVE8oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIGVudW0gcnhycGNfcnR0X3J4X3RyYWNlIHdoeSwKKwkJICAgICByeHJwY19zZXJpYWxfdCBzZW5kX3NlcmlhbCwgcnhycGNfc2VyaWFsX3QgcmVzcF9zZXJpYWwsCisJCSAgICAgczY0IHJ0dCwgdTggbnIsIHM2NCBhdmcpLAorCisJICAgIFRQX0FSR1MoY2FsbCwgd2h5LCBzZW5kX3NlcmlhbCwgcmVzcF9zZXJpYWwsIHJ0dCwgbnIsIGF2ZyksCisKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQoc3RydWN0IHJ4cnBjX2NhbGwgKiwJY2FsbAkJKQorCQkgICAgX19maWVsZChlbnVtIHJ4cnBjX3J0dF9yeF90cmFjZSwJd2h5CQkpCisJCSAgICBfX2ZpZWxkKHU4LAkJCQlucgkJKQorCQkgICAgX19maWVsZChyeHJwY19zZXJpYWxfdCwJCXNlbmRfc2VyaWFsCSkKKwkJICAgIF9fZmllbGQocnhycGNfc2VyaWFsX3QsCQlyZXNwX3NlcmlhbAkpCisJCSAgICBfX2ZpZWxkKHM2NCwJCQlydHQJCSkKKwkJICAgIF9fZmllbGQodTY0LAkJCWF2ZwkJKQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkgICAgX19lbnRyeS0+Y2FsbCA9IGNhbGw7CisJCSAgICBfX2VudHJ5LT53aHkgPSB3aHk7CisJCSAgICBfX2VudHJ5LT5zZW5kX3NlcmlhbCA9IHNlbmRfc2VyaWFsOworCQkgICAgX19lbnRyeS0+cmVzcF9zZXJpYWwgPSByZXNwX3NlcmlhbDsKKwkJICAgIF9fZW50cnktPnJ0dCA9IHJ0dDsKKwkJICAgIF9fZW50cnktPm5yID0gbnI7CisJCSAgICBfX2VudHJ5LT5hdmcgPSBhdmc7CisJCQkgICApLAorCisJICAgIFRQX3ByaW50aygiYz0lcCAlcyBzcj0lMDh4IHJyPSUwOHggcnR0PSVsbGQgbnI9JXUgYXZnPSVsbGQiLAorCQkgICAgICBfX2VudHJ5LT5jYWxsLAorCQkgICAgICByeHJwY19ydHRfcnhfdHJhY2VzW19fZW50cnktPndoeV0sCisJCSAgICAgIF9fZW50cnktPnNlbmRfc2VyaWFsLAorCQkgICAgICBfX2VudHJ5LT5yZXNwX3NlcmlhbCwKKwkJICAgICAgX19lbnRyeS0+cnR0LAorCQkgICAgICBfX2VudHJ5LT5uciwKKwkJICAgICAgX19lbnRyeS0+YXZnKQorCSAgICApOworCitUUkFDRV9FVkVOVChyeHJwY190aW1lciwKKwkgICAgVFBfUFJPVE8oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIGVudW0gcnhycGNfdGltZXJfdHJhY2Ugd2h5LAorCQkgICAgIGt0aW1lX3Qgbm93LCB1bnNpZ25lZCBsb25nIG5vd19qKSwKKworCSAgICBUUF9BUkdTKGNhbGwsIHdoeSwgbm93LCBub3dfaiksCisKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQoc3RydWN0IHJ4cnBjX2NhbGwgKiwJCWNhbGwJCSkKKwkJICAgIF9fZmllbGQoZW51bSByeHJwY190aW1lcl90cmFjZSwJCXdoeQkJKQorCQkgICAgX19maWVsZF9zdHJ1Y3Qoa3RpbWVfdCwJCQlub3cJCSkKKwkJICAgIF9fZmllbGRfc3RydWN0KGt0aW1lX3QsCQkJZXhwaXJlX2F0CSkKKwkJICAgIF9fZmllbGRfc3RydWN0KGt0aW1lX3QsCQkJYWNrX2F0CQkpCisJCSAgICBfX2ZpZWxkX3N0cnVjdChrdGltZV90LAkJCXJlc2VuZF9hdAkpCisJCSAgICBfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsCQkJbm93X2oJCSkKKwkJICAgIF9fZmllbGQodW5zaWduZWQgbG9uZywJCQl0aW1lcgkJKQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkgICAgX19lbnRyeS0+Y2FsbAk9IGNhbGw7CisJCSAgICBfX2VudHJ5LT53aHkJPSB3aHk7CisJCSAgICBfX2VudHJ5LT5ub3cJPSBub3c7CisJCSAgICBfX2VudHJ5LT5leHBpcmVfYXQJPSBjYWxsLT5leHBpcmVfYXQ7CisJCSAgICBfX2VudHJ5LT5hY2tfYXQJPSBjYWxsLT5hY2tfYXQ7CisJCSAgICBfX2VudHJ5LT5yZXNlbmRfYXQJPSBjYWxsLT5yZXNlbmRfYXQ7CisJCSAgICBfX2VudHJ5LT5ub3dfagk9IG5vd19qOworCQkgICAgX19lbnRyeS0+dGltZXIJPSBjYWxsLT50aW1lci5leHBpcmVzOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoImM9JXAgJXMgeD0lbGxkIGE9JWxsZCByPSVsbGQgdD0lbGQiLAorCQkgICAgICBfX2VudHJ5LT5jYWxsLAorCQkgICAgICByeHJwY190aW1lcl90cmFjZXNbX19lbnRyeS0+d2h5XSwKKwkJICAgICAga3RpbWVfdG9fbnMoa3RpbWVfc3ViKF9fZW50cnktPmV4cGlyZV9hdCwgX19lbnRyeS0+bm93KSksCisJCSAgICAgIGt0aW1lX3RvX25zKGt0aW1lX3N1YihfX2VudHJ5LT5hY2tfYXQsIF9fZW50cnktPm5vdykpLAorCQkgICAgICBrdGltZV90b19ucyhrdGltZV9zdWIoX19lbnRyeS0+cmVzZW5kX2F0LCBfX2VudHJ5LT5ub3cpKSwKKwkJICAgICAgX19lbnRyeS0+dGltZXIgLSBfX2VudHJ5LT5ub3dfaikKKwkgICAgKTsKKworVFJBQ0VfRVZFTlQocnhycGNfcnhfbG9zZSwKKwkgICAgVFBfUFJPVE8oc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCksCisKKwkgICAgVFBfQVJHUyhzcCksCisKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGRfc3RydWN0KHN0cnVjdCByeHJwY19ob3N0X2hlYWRlciwJaGRyCQkpCisJCQkgICAgICksCisKKwkgICAgVFBfZmFzdF9hc3NpZ24oCisJCSAgICBtZW1jcHkoJl9fZW50cnktPmhkciwgJnNwLT5oZHIsIHNpemVvZihfX2VudHJ5LT5oZHIpKTsKKwkJCSAgICksCisKKwkgICAgVFBfcHJpbnRrKCIlMDh4OiUwOHg6JTA4eDolMDR4ICUwOHggJTA4eCAlMDJ4ICUwMnggJXMgKkxPU0UqIiwKKwkJICAgICAgX19lbnRyeS0+aGRyLmVwb2NoLCBfX2VudHJ5LT5oZHIuY2lkLAorCQkgICAgICBfX2VudHJ5LT5oZHIuY2FsbE51bWJlciwgX19lbnRyeS0+aGRyLnNlcnZpY2VJZCwKKwkJICAgICAgX19lbnRyeS0+aGRyLnNlcmlhbCwgX19lbnRyeS0+aGRyLnNlcSwKKwkJICAgICAgX19lbnRyeS0+aGRyLnR5cGUsIF9fZW50cnktPmhkci5mbGFncywKKwkJICAgICAgX19lbnRyeS0+aGRyLnR5cGUgPD0gMTUgPyByeHJwY19wa3RzW19fZW50cnktPmhkci50eXBlXSA6ICI/VU5LIikKKwkgICAgKTsKKworVFJBQ0VfRVZFTlQocnhycGNfcHJvcG9zZV9hY2ssCisJICAgIFRQX1BST1RPKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBlbnVtIHJ4cnBjX3Byb3Bvc2VfYWNrX3RyYWNlIHdoeSwKKwkJICAgICB1OCBhY2tfcmVhc29uLCByeHJwY19zZXJpYWxfdCBzZXJpYWwsIGJvb2wgaW1tZWRpYXRlLAorCQkgICAgIGJvb2wgYmFja2dyb3VuZCwgZW51bSByeHJwY19wcm9wb3NlX2Fja19vdXRjb21lIG91dGNvbWUpLAorCisJICAgIFRQX0FSR1MoY2FsbCwgd2h5LCBhY2tfcmVhc29uLCBzZXJpYWwsIGltbWVkaWF0ZSwgYmFja2dyb3VuZCwKKwkJICAgIG91dGNvbWUpLAorCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCSAgICBfX2ZpZWxkKHN0cnVjdCByeHJwY19jYWxsICosCQljYWxsCQkpCisJCSAgICBfX2ZpZWxkKGVudW0gcnhycGNfcHJvcG9zZV9hY2tfdHJhY2UsCXdoeQkJKQorCQkgICAgX19maWVsZChyeHJwY19zZXJpYWxfdCwJCQlzZXJpYWwJCSkKKwkJICAgIF9fZmllbGQodTgsCQkJCQlhY2tfcmVhc29uCSkKKwkJICAgIF9fZmllbGQoYm9vbCwJCQkJaW1tZWRpYXRlCSkKKwkJICAgIF9fZmllbGQoYm9vbCwJCQkJYmFja2dyb3VuZAkpCisJCSAgICBfX2ZpZWxkKGVudW0gcnhycGNfcHJvcG9zZV9hY2tfb3V0Y29tZSwJb3V0Y29tZQkJKQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkgICAgX19lbnRyeS0+Y2FsbAk9IGNhbGw7CisJCSAgICBfX2VudHJ5LT53aHkJPSB3aHk7CisJCSAgICBfX2VudHJ5LT5zZXJpYWwJPSBzZXJpYWw7CisJCSAgICBfX2VudHJ5LT5hY2tfcmVhc29uCT0gYWNrX3JlYXNvbjsKKwkJICAgIF9fZW50cnktPmltbWVkaWF0ZQk9IGltbWVkaWF0ZTsKKwkJICAgIF9fZW50cnktPmJhY2tncm91bmQJPSBiYWNrZ3JvdW5kOworCQkgICAgX19lbnRyeS0+b3V0Y29tZQk9IG91dGNvbWU7CisJCQkgICApLAorCisJICAgIFRQX3ByaW50aygiYz0lcCAlcyAlcyByPSUwOHggaT0ldSBiPSV1JXMiLAorCQkgICAgICBfX2VudHJ5LT5jYWxsLAorCQkgICAgICByeHJwY19wcm9wb3NlX2Fja190cmFjZXNbX19lbnRyeS0+d2h5XSwKKwkJICAgICAgcnhycGNfYWNrX25hbWVzW19fZW50cnktPmFja19yZWFzb25dLAorCQkgICAgICBfX2VudHJ5LT5zZXJpYWwsCisJCSAgICAgIF9fZW50cnktPmltbWVkaWF0ZSwKKwkJICAgICAgX19lbnRyeS0+YmFja2dyb3VuZCwKKwkJICAgICAgcnhycGNfcHJvcG9zZV9hY2tfb3V0Y29tZXNbX19lbnRyeS0+b3V0Y29tZV0pCisJICAgICk7CisKK1RSQUNFX0VWRU5UKHJ4cnBjX3JldHJhbnNtaXQsCisJICAgIFRQX1BST1RPKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCByeHJwY19zZXFfdCBzZXEsIHU4IGFubm90YXRpb24sCisJCSAgICAgczY0IGV4cGlyeSksCisKKwkgICAgVFBfQVJHUyhjYWxsLCBzZXEsIGFubm90YXRpb24sIGV4cGlyeSksCisKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQoc3RydWN0IHJ4cnBjX2NhbGwgKiwJY2FsbAkJKQorCQkgICAgX19maWVsZChyeHJwY19zZXFfdCwJCXNlcQkJKQorCQkgICAgX19maWVsZCh1OCwJCQkJYW5ub3RhdGlvbgkpCisJCSAgICBfX2ZpZWxkKHM2NCwJCQlleHBpcnkJCSkKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJICAgIF9fZW50cnktPmNhbGwgPSBjYWxsOworCQkgICAgX19lbnRyeS0+c2VxID0gc2VxOworCQkgICAgX19lbnRyeS0+YW5ub3RhdGlvbiA9IGFubm90YXRpb247CisJCSAgICBfX2VudHJ5LT5leHBpcnkgPSBleHBpcnk7CisJCQkgICApLAorCisJICAgIFRQX3ByaW50aygiYz0lcCBxPSV4IGE9JTAyeCB4cD0lbGxkIiwKKwkJICAgICAgX19lbnRyeS0+Y2FsbCwKKwkJICAgICAgX19lbnRyeS0+c2VxLAorCQkgICAgICBfX2VudHJ5LT5hbm5vdGF0aW9uLAorCQkgICAgICBfX2VudHJ5LT5leHBpcnkpCisJICAgICk7CisKK1RSQUNFX0VWRU5UKHJ4cnBjX2Nvbmdlc3QsCisJICAgIFRQX1BST1RPKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBzdHJ1Y3QgcnhycGNfYWNrX3N1bW1hcnkgKnN1bW1hcnksCisJCSAgICAgcnhycGNfc2VyaWFsX3QgYWNrX3NlcmlhbCwgZW51bSByeHJwY19jb25nZXN0X2NoYW5nZSBjaGFuZ2UpLAorCisJICAgIFRQX0FSR1MoY2FsbCwgc3VtbWFyeSwgYWNrX3NlcmlhbCwgY2hhbmdlKSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChzdHJ1Y3QgcnhycGNfY2FsbCAqLAkJY2FsbAkJKQorCQkgICAgX19maWVsZChlbnVtIHJ4cnBjX2Nvbmdlc3RfY2hhbmdlLAkJY2hhbmdlCQkpCisJCSAgICBfX2ZpZWxkKHJ4cnBjX3NlcV90LAkJCWhhcmRfYWNrCSkKKwkJICAgIF9fZmllbGQocnhycGNfc2VxX3QsCQkJdG9wCQkpCisJCSAgICBfX2ZpZWxkKHJ4cnBjX3NlcV90LAkJCWxvd2VzdF9uYWsJKQorCQkgICAgX19maWVsZChyeHJwY19zZXJpYWxfdCwJCQlhY2tfc2VyaWFsCSkKKwkJICAgIF9fZmllbGRfc3RydWN0KHN0cnVjdCByeHJwY19hY2tfc3VtbWFyeSwJc3VtCQkpCisJCQkgICAgICksCisKKwkgICAgVFBfZmFzdF9hc3NpZ24oCisJCSAgICBfX2VudHJ5LT5jYWxsCT0gY2FsbDsKKwkJICAgIF9fZW50cnktPmNoYW5nZQk9IGNoYW5nZTsKKwkJICAgIF9fZW50cnktPmhhcmRfYWNrCT0gY2FsbC0+dHhfaGFyZF9hY2s7CisJCSAgICBfX2VudHJ5LT50b3AJPSBjYWxsLT50eF90b3A7CisJCSAgICBfX2VudHJ5LT5sb3dlc3RfbmFrCT0gY2FsbC0+YWNrc19sb3dlc3RfbmFrOworCQkgICAgX19lbnRyeS0+YWNrX3NlcmlhbAk9IGFja19zZXJpYWw7CisJCSAgICBtZW1jcHkoJl9fZW50cnktPnN1bSwgc3VtbWFyeSwgc2l6ZW9mKF9fZW50cnktPnN1bSkpOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoImM9JXAgJTA4eCAlcyAlMDh4ICVzIGN3PSV1IHNzPSV1IG5yPSV1LCV1IG53PSV1LCV1IHI9JXUgYj0ldSB1PSV1IGQ9JXUgbD0leCVzJXMlcyIsCisJCSAgICAgIF9fZW50cnktPmNhbGwsCisJCSAgICAgIF9fZW50cnktPmFja19zZXJpYWwsCisJCSAgICAgIHJ4cnBjX2Fja19uYW1lc1tfX2VudHJ5LT5zdW0uYWNrX3JlYXNvbl0sCisJCSAgICAgIF9fZW50cnktPmhhcmRfYWNrLAorCQkgICAgICByeHJwY19jb25nZXN0X21vZGVzW19fZW50cnktPnN1bS5tb2RlXSwKKwkJICAgICAgX19lbnRyeS0+c3VtLmN3bmQsCisJCSAgICAgIF9fZW50cnktPnN1bS5zc3RocmVzaCwKKwkJICAgICAgX19lbnRyeS0+c3VtLm5yX2Fja3MsIF9fZW50cnktPnN1bS5ucl9uYWNrcywKKwkJICAgICAgX19lbnRyeS0+c3VtLm5yX25ld19hY2tzLCBfX2VudHJ5LT5zdW0ubnJfbmV3X25hY2tzLAorCQkgICAgICBfX2VudHJ5LT5zdW0ubnJfcm90X25ld19hY2tzLAorCQkgICAgICBfX2VudHJ5LT50b3AgLSBfX2VudHJ5LT5oYXJkX2FjaywKKwkJICAgICAgX19lbnRyeS0+c3VtLmN1bXVsYXRpdmVfYWNrcywKKwkJICAgICAgX19lbnRyeS0+c3VtLmR1cF9hY2tzLAorCQkgICAgICBfX2VudHJ5LT5sb3dlc3RfbmFrLCBfX2VudHJ5LT5zdW0ubmV3X2xvd19uYWNrID8gIiEiIDogIiIsCisJCSAgICAgIHJ4cnBjX2Nvbmdlc3RfY2hhbmdlc1tfX2VudHJ5LT5jaGFuZ2VdLAorCQkgICAgICBfX2VudHJ5LT5zdW0ucmV0cmFuc190aW1lbyA/ICIgclR4VG8iIDogIiIpCisJICAgICk7CisKKyNlbmRpZiAvKiBfVFJBQ0VfUlhSUENfSCAqLworCisvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9LYnVpbGQgYi9pbmNsdWRlL3VhcGkvbGludXgvS2J1aWxkCmluZGV4IDE4NWY4ZWEuLmQwMzUyYTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9LYnVpbGQKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L0tidWlsZApAQCAtNzEsNiArNzEsNyBAQAogaGVhZGVyLXkgKz0gYmxrcGcuaAogaGVhZGVyLXkgKz0gYmxrdHJhY2VfYXBpLmgKIGhlYWRlci15ICs9IGJwZl9jb21tb24uaAoraGVhZGVyLXkgKz0gYnBmX3BlcmZfZXZlbnQuaAogaGVhZGVyLXkgKz0gYnBmLmgKIGhlYWRlci15ICs9IGJwcWV0aGVyLmgKIGhlYWRlci15ICs9IGJzZy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvYXRtX3phdG0uaCBiL2luY2x1ZGUvdWFwaS9saW51eC9hdG1femF0bS5oCmluZGV4IDljOWM2YWQuLjVjZDRkNGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9hdG1femF0bS5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9hdG1femF0bS5oCkBAIC0xNCw2ICsxNCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9hdG1hcGkuaD4KICNpbmNsdWRlIDxsaW51eC9hdG1pb2MuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAKICNkZWZpbmUgWkFUTV9HRVRQT09MCV9JT1coJ2EnLEFUTUlPQ19TQVJQUlYrMSxzdHJ1Y3QgYXRtaWZfc2lvYykKIAkJCQkJCS8qIGdldCBwb29sIHN0YXRpc3RpY3MgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9hdWRpdC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2F1ZGl0LmgKaW5kZXggODJlOGFhNS4uMjA4ZGY3YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2F1ZGl0LmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2F1ZGl0LmgKQEAgLTMyOSw5ICszMjksMTEgQEAKICNkZWZpbmUgQVVESVRfRkVBVFVSRV9CSVRNQVBfQkFDS0xPR19MSU1JVAkweDAwMDAwMDAxCiAjZGVmaW5lIEFVRElUX0ZFQVRVUkVfQklUTUFQX0JBQ0tMT0dfV0FJVF9USU1FCTB4MDAwMDAwMDIKICNkZWZpbmUgQVVESVRfRkVBVFVSRV9CSVRNQVBfRVhFQ1VUQUJMRV9QQVRICTB4MDAwMDAwMDQKKyNkZWZpbmUgQVVESVRfRkVBVFVSRV9CSVRNQVBfRVhDTFVERV9FWFRFTkQJMHgwMDAwMDAwOAogI2RlZmluZSBBVURJVF9GRUFUVVJFX0JJVE1BUF9BTEwgKEFVRElUX0ZFQVRVUkVfQklUTUFQX0JBQ0tMT0dfTElNSVQgfCBcCiAJCQkJICBBVURJVF9GRUFUVVJFX0JJVE1BUF9CQUNLTE9HX1dBSVRfVElNRSB8IFwKLQkJCQkgIEFVRElUX0ZFQVRVUkVfQklUTUFQX0VYRUNVVEFCTEVfUEFUSCkKKwkJCQkgIEFVRElUX0ZFQVRVUkVfQklUTUFQX0VYRUNVVEFCTEVfUEFUSCB8IFwKKwkJCQkgIEFVRElUX0ZFQVRVUkVfQklUTUFQX0VYQ0xVREVfRVhURU5EKQogCiAvKiBkZXByZWNhdGVkOiBBVURJVF9WRVJTSU9OXyogKi8KICNkZWZpbmUgQVVESVRfVkVSU0lPTl9MQVRFU1QgCQlBVURJVF9GRUFUVVJFX0JJVE1BUF9BTEwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9iYXRtYW5fYWR2LmggYi9pbmNsdWRlL3VhcGkvbGludXgvYmF0bWFuX2Fkdi5oCmluZGV4IDBmYmY2ZmQuLjczNGZlODMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9iYXRtYW5fYWR2LmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2JhdG1hbl9hZHYuaApAQCAtMjMsNiArMjMsNDIgQEAKICNkZWZpbmUgQkFUQURWX05MX01DQVNUX0dST1VQX1RQTUVURVIJInRwbWV0ZXIiCiAKIC8qKgorICogZW51bSBiYXRhZHZfdHRfY2xpZW50X2ZsYWdzIC0gVFQgY2xpZW50IHNwZWNpZmljIGZsYWdzCisgKiBAQkFUQURWX1RUX0NMSUVOVF9ERUw6IHRoZSBjbGllbnQgaGFzIHRvIGJlIGRlbGV0ZWQgZnJvbSB0aGUgdGFibGUKKyAqIEBCQVRBRFZfVFRfQ0xJRU5UX1JPQU06IHRoZSBjbGllbnQgcm9hbWVkIHRvL2Zyb20gYW5vdGhlciBub2RlIGFuZCB0aGUgbmV3CisgKiAgdXBkYXRlIHRlbGxpbmcgaXRzIG5ldyByZWFsIGxvY2F0aW9uIGhhcyBub3QgYmVlbiByZWNlaXZlZC9zZW50IHlldAorICogQEJBVEFEVl9UVF9DTElFTlRfV0lGSTogdGhpcyBjbGllbnQgaXMgY29ubmVjdGVkIHRocm91Z2ggYSB3aWZpIGludGVyZmFjZS4KKyAqICBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgYnkgdGhlICJBUCBJc29sYXRpb24iIGZlYXR1cmUKKyAqIEBCQVRBRFZfVFRfQ0xJRU5UX0lTT0xBOiB0aGlzIGNsaWVudCBpcyBjb25zaWRlcmVkICJpc29sYXRlZCIuIFRoaXMKKyAqICBpbmZvcm1hdGlvbiBpcyB1c2VkIGJ5IHRoZSBFeHRlbmRlZCBJc29sYXRpb24gZmVhdHVyZQorICogQEJBVEFEVl9UVF9DTElFTlRfTk9QVVJHRTogdGhpcyBjbGllbnQgc2hvdWxkIG5ldmVyIGJlIHJlbW92ZWQgZnJvbSB0aGUgdGFibGUKKyAqIEBCQVRBRFZfVFRfQ0xJRU5UX05FVzogdGhpcyBjbGllbnQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGxvY2FsIHRhYmxlIGJ1dCBoYXMKKyAqICBub3QgYmVlbiBhbm5vdW5jZWQgeWV0CisgKiBAQkFUQURWX1RUX0NMSUVOVF9QRU5ESU5HOiB0aGlzIGNsaWVudCBpcyBtYXJrZWQgZm9yIHJlbW92YWwgYnV0IGl0IGlzIGtlcHQKKyAqICBpbiB0aGUgdGFibGUgZm9yIG9uZSBtb3JlIG9yaWdpbmF0b3IgaW50ZXJ2YWwgZm9yIGNvbnNpc3RlbmN5IHB1cnBvc2VzCisgKiBAQkFUQURWX1RUX0NMSUVOVF9URU1QOiB0aGlzIGdsb2JhbCBjbGllbnQgaGFzIGJlZW4gZGV0ZWN0ZWQgdG8gYmUgcGFydCBvZgorICogIHRoZSBuZXR3b3JrIGJ1dCBubyBubm9kZSBoYXMgYWxyZWFkeSBhbm5vdW5jZWQgaXQKKyAqCisgKiBCaXRzIGZyb20gMCB0byA3IGFyZSBjYWxsZWQgX3JlbW90ZSBmbGFnc18gYmVjYXVzZSB0aGV5IGFyZSBzZW50IG9uIHRoZSB3aXJlLgorICogQml0cyBmcm9tIDggdG8gMTUgYXJlIGNhbGxlZCBfbG9jYWwgZmxhZ3NfIGJlY2F1c2UgdGhleSBhcmUgdXNlZCBmb3IgbG9jYWwKKyAqIGNvbXB1dGF0aW9ucyBvbmx5LgorICoKKyAqIEJpdHMgZnJvbSA0IHRvIDcgLSBhIHN1YnNldCBvZiByZW1vdGUgZmxhZ3MgLSBhcmUgZW5zdXJlZCB0byBiZSBpbiBzeW5jIHdpdGgKKyAqIHRoZSBvdGhlciBub2RlcyBpbiB0aGUgbmV0d29yay4gVG8gYWNoaWV2ZSB0aGlzIGdvYWwgdGhlc2UgZmxhZ3MgYXJlIGluY2x1ZGVkCisgKiBpbiB0aGUgVFQgQ1JDIGNvbXB1dGF0aW9uLgorICovCitlbnVtIGJhdGFkdl90dF9jbGllbnRfZmxhZ3MgeworCUJBVEFEVl9UVF9DTElFTlRfREVMICAgICA9ICgxIDw8IDApLAorCUJBVEFEVl9UVF9DTElFTlRfUk9BTSAgICA9ICgxIDw8IDEpLAorCUJBVEFEVl9UVF9DTElFTlRfV0lGSSAgICA9ICgxIDw8IDQpLAorCUJBVEFEVl9UVF9DTElFTlRfSVNPTEEJID0gKDEgPDwgNSksCisJQkFUQURWX1RUX0NMSUVOVF9OT1BVUkdFID0gKDEgPDwgOCksCisJQkFUQURWX1RUX0NMSUVOVF9ORVcgICAgID0gKDEgPDwgOSksCisJQkFUQURWX1RUX0NMSUVOVF9QRU5ESU5HID0gKDEgPDwgMTApLAorCUJBVEFEVl9UVF9DTElFTlRfVEVNUAkgPSAoMSA8PCAxMSksCit9OworCisvKioKICAqIGVudW0gYmF0YWR2X25sX2F0dHJzIC0gYmF0bWFuLWFkdiBuZXRsaW5rIGF0dHJpYnV0ZXMKICAqCiAgKiBAQkFUQURWX0FUVFJfVU5TUEVDOiB1bnNwZWNpZmllZCBhdHRyaWJ1dGUgdG8gY2F0Y2ggZXJyb3JzCkBAIC00MCw2ICs3NiwyNiBAQAogICogQEJBVEFEVl9BVFRSX1RQTUVURVJfQllURVM6IGFtb3VudCBvZiBhY2tlZCBieXRlcyBkdXJpbmcgcnVuCiAgKiBAQkFUQURWX0FUVFJfVFBNRVRFUl9DT09LSUU6IHNlc3Npb24gY29va2llIHRvIG1hdGNoIHRwX21ldGVyIHNlc3Npb24KICAqIEBCQVRBRFZfQVRUUl9QQUQ6IGF0dHJpYnV0ZSB1c2VkIGZvciBwYWRkaW5nIGZvciA2NC1iaXQgYWxpZ25tZW50CisgKiBAQkFUQURWX0FUVFJfQUNUSVZFOiBGbGFnIGluZGljYXRpbmcgaWYgdGhlIGhhcmQgaW50ZXJmYWNlIGlzIGFjdGl2ZQorICogQEJBVEFEVl9BVFRSX1RUX0FERFJFU1M6IENsaWVudCBNQUMgYWRkcmVzcworICogQEJBVEFEVl9BVFRSX1RUX1RUVk46IFRyYW5zbGF0aW9uIHRhYmxlIHZlcnNpb24KKyAqIEBCQVRBRFZfQVRUUl9UVF9MQVNUX1RUVk46IFByZXZpb3VzIHRyYW5zbGF0aW9uIHRhYmxlIHZlcnNpb24KKyAqIEBCQVRBRFZfQVRUUl9UVF9DUkMzMjogQ1JDMzIgb3ZlciB0cmFuc2xhdGlvbiB0YWJsZQorICogQEJBVEFEVl9BVFRSX1RUX1ZJRDogVkxBTiBJRAorICogQEJBVEFEVl9BVFRSX1RUX0ZMQUdTOiBUcmFuc2xhdGlvbiB0YWJsZSBjbGllbnQgZmxhZ3MKKyAqIEBCQVRBRFZfQVRUUl9GTEFHX0JFU1Q6IEZsYWdzIGluZGljYXRpbmcgZW50cnkgaXMgdGhlIGJlc3QKKyAqIEBCQVRBRFZfQVRUUl9MQVNUX1NFRU5fTVNFQ1M6IFRpbWUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIGxhc3Qgc2VlbgorICogQEJBVEFEVl9BVFRSX05FSUdIX0FERFJFU1M6IE5laWdoYm91ciBNQUMgYWRkcmVzcworICogQEJBVEFEVl9BVFRSX1RROiBUUSB0byBuZWlnaGJvdXIKKyAqIEBCQVRBRFZfQVRUUl9USFJPVUdIUFVUOiBFc3RpbWF0ZWQgdGhyb3VnaHB1dCB0byBOZWlnaGJvdXIKKyAqIEBCQVRBRFZfQVRUUl9CQU5EV0lEVEhfVVA6IFJlcG9ydGVkIHVwbGluayBiYW5kd2lkdGgKKyAqIEBCQVRBRFZfQVRUUl9CQU5EV0lEVEhfRE9XTjogUmVwb3J0ZWQgZG93bmxpbmsgYmFuZHdpZHRoCisgKiBAQkFUQURWX0FUVFJfUk9VVEVSOiBHYXRld2F5IHJvdXRlciBNQUMgYWRkcmVzcworICogQEJBVEFEVl9BVFRSX0JMQV9PV046IEZsYWcgaW5kaWNhdGluZyBvd24gb3JpZ2luYXRvcgorICogQEJBVEFEVl9BVFRSX0JMQV9BRERSRVNTOiBCcmlkZ2UgbG9vcCBhdm9pZGFuY2UgY2xhaW0gTUFDIGFkZHJlc3MKKyAqIEBCQVRBRFZfQVRUUl9CTEFfVklEOiBCTEEgVkxBTiBJRAorICogQEJBVEFEVl9BVFRSX0JMQV9CQUNLQk9ORTogQkxBIGdhdGV3YXkgb3JpZ2luYXRvciBNQUMgYWRkcmVzcworICogQEJBVEFEVl9BVFRSX0JMQV9DUkM6IEJMQSBDUkMKICAqIEBfX0JBVEFEVl9BVFRSX0FGVEVSX0xBU1Q6IGludGVybmFsIHVzZQogICogQE5VTV9CQVRBRFZfQVRUUjogdG90YWwgbnVtYmVyIG9mIGJhdGFkdl9ubF9hdHRycyBhdmFpbGFibGUKICAqIEBCQVRBRFZfQVRUUl9NQVg6IGhpZ2hlc3QgYXR0cmlidXRlIG51bWJlciBjdXJyZW50bHkgZGVmaW5lZApAQCAtNjAsNiArMTE2LDI2IEBACiAJQkFUQURWX0FUVFJfVFBNRVRFUl9CWVRFUywKIAlCQVRBRFZfQVRUUl9UUE1FVEVSX0NPT0tJRSwKIAlCQVRBRFZfQVRUUl9QQUQsCisJQkFUQURWX0FUVFJfQUNUSVZFLAorCUJBVEFEVl9BVFRSX1RUX0FERFJFU1MsCisJQkFUQURWX0FUVFJfVFRfVFRWTiwKKwlCQVRBRFZfQVRUUl9UVF9MQVNUX1RUVk4sCisJQkFUQURWX0FUVFJfVFRfQ1JDMzIsCisJQkFUQURWX0FUVFJfVFRfVklELAorCUJBVEFEVl9BVFRSX1RUX0ZMQUdTLAorCUJBVEFEVl9BVFRSX0ZMQUdfQkVTVCwKKwlCQVRBRFZfQVRUUl9MQVNUX1NFRU5fTVNFQ1MsCisJQkFUQURWX0FUVFJfTkVJR0hfQUREUkVTUywKKwlCQVRBRFZfQVRUUl9UUSwKKwlCQVRBRFZfQVRUUl9USFJPVUdIUFVULAorCUJBVEFEVl9BVFRSX0JBTkRXSURUSF9VUCwKKwlCQVRBRFZfQVRUUl9CQU5EV0lEVEhfRE9XTiwKKwlCQVRBRFZfQVRUUl9ST1VURVIsCisJQkFUQURWX0FUVFJfQkxBX09XTiwKKwlCQVRBRFZfQVRUUl9CTEFfQUREUkVTUywKKwlCQVRBRFZfQVRUUl9CTEFfVklELAorCUJBVEFEVl9BVFRSX0JMQV9CQUNLQk9ORSwKKwlCQVRBRFZfQVRUUl9CTEFfQ1JDLAogCS8qIGFkZCBhdHRyaWJ1dGVzIGFib3ZlIGhlcmUsIHVwZGF0ZSB0aGUgcG9saWN5IGluIG5ldGxpbmsuYyAqLwogCV9fQkFUQURWX0FUVFJfQUZURVJfTEFTVCwKIAlOVU1fQkFUQURWX0FUVFIgPSBfX0JBVEFEVl9BVFRSX0FGVEVSX0xBU1QsCkBAIC03Myw2ICsxNDksMTUgQEAKICAqIEBCQVRBRFZfQ01EX0dFVF9NRVNIX0lORk86IFF1ZXJ5IGJhc2ljIGluZm9ybWF0aW9uIGFib3V0IGJhdG1hbi1hZHYgZGV2aWNlCiAgKiBAQkFUQURWX0NNRF9UUF9NRVRFUjogU3RhcnQgYSB0cCBtZXRlciBzZXNzaW9uCiAgKiBAQkFUQURWX0NNRF9UUF9NRVRFUl9DQU5DRUw6IENhbmNlbCBhIHRwIG1ldGVyIHNlc3Npb24KKyAqIEBCQVRBRFZfQ01EX0dFVF9ST1VUSU5HX0FMR09TOiBRdWVyeSB0aGUgbGlzdCBvZiByb3V0aW5nIGFsZ29yaXRobXMuCisgKiBAQkFUQURWX0NNRF9HRVRfSEFSRElGUzogUXVlcnkgbGlzdCBvZiBoYXJkIGludGVyZmFjZXMKKyAqIEBCQVRBRFZfQ01EX0dFVF9UUkFOU1RBQkxFX0xPQ0FMOiBRdWVyeSBsaXN0IG9mIGxvY2FsIHRyYW5zbGF0aW9ucworICogQEJBVEFEVl9DTURfR0VUX1RSQU5TVEFCTEVfR0xPQkFMIFF1ZXJ5IGxpc3Qgb2YgZ2xvYmFsIHRyYW5zbGF0aW9ucworICogQEJBVEFEVl9DTURfR0VUX09SSUdJTkFUT1JTOiBRdWVyeSBsaXN0IG9mIG9yaWdpbmF0b3JzCisgKiBAQkFUQURWX0NNRF9HRVRfTkVJR0hCT1JTOiBRdWVyeSBsaXN0IG9mIG5laWdoYm91cnMKKyAqIEBCQVRBRFZfQ01EX0dFVF9HQVRFV0FZUzogUXVlcnkgbGlzdCBvZiBnYXRld2F5cworICogQEJBVEFEVl9DTURfR0VUX0JMQV9DTEFJTTogUXVlcnkgbGlzdCBvZiBicmlkZ2UgbG9vcCBhdm9pZGFuY2UgY2xhaW1zCisgKiBAQkFUQURWX0NNRF9HRVRfQkxBX0JBQ0tCT05FOiBRdWVyeSBsaXN0IG9mIGJyaWRnZSBsb29wIGF2b2lkYW5jZSBiYWNrYm9uZXMKICAqIEBfX0JBVEFEVl9DTURfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCiAgKiBAQkFUQURWX0NNRF9NQVg6IGhpZ2hlc3QgdXNlZCBjb21tYW5kIG51bWJlcgogICovCkBAIC04MSw2ICsxNjYsMTUgQEAKIAlCQVRBRFZfQ01EX0dFVF9NRVNIX0lORk8sCiAJQkFUQURWX0NNRF9UUF9NRVRFUiwKIAlCQVRBRFZfQ01EX1RQX01FVEVSX0NBTkNFTCwKKwlCQVRBRFZfQ01EX0dFVF9ST1VUSU5HX0FMR09TLAorCUJBVEFEVl9DTURfR0VUX0hBUkRJRlMsCisJQkFUQURWX0NNRF9HRVRfVFJBTlNUQUJMRV9MT0NBTCwKKwlCQVRBRFZfQ01EX0dFVF9UUkFOU1RBQkxFX0dMT0JBTCwKKwlCQVRBRFZfQ01EX0dFVF9PUklHSU5BVE9SUywKKwlCQVRBRFZfQ01EX0dFVF9ORUlHSEJPUlMsCisJQkFUQURWX0NNRF9HRVRfR0FURVdBWVMsCisJQkFUQURWX0NNRF9HRVRfQkxBX0NMQUlNLAorCUJBVEFEVl9DTURfR0VUX0JMQV9CQUNLQk9ORSwKIAkvKiBhZGQgbmV3IGNvbW1hbmRzIGFib3ZlIGhlcmUgKi8KIAlfX0JBVEFEVl9DTURfQUZURVJfTEFTVCwKIAlCQVRBRFZfQ01EX01BWCA9IF9fQkFUQURWX0NNRF9BRlRFUl9MQVNUIC0gMQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oCmluZGV4IGRhMjE4ZmUuLmYwOWM3MGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9icGYuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmgKQEAgLTk1LDYgKzk1LDcgQEAKIAlCUEZfUFJPR19UWVBFX1NDSEVEX0FDVCwKIAlCUEZfUFJPR19UWVBFX1RSQUNFUE9JTlQsCiAJQlBGX1BST0dfVFlQRV9YRFAsCisJQlBGX1BST0dfVFlQRV9QRVJGX0VWRU5ULAogfTsKIAogI2RlZmluZSBCUEZfUFNFVURPX01BUF9GRAkxCkBAIC0zMzksNyArMzQwLDcgQEAKIAlCUEZfRlVOQ19za2JfY2hhbmdlX3R5cGUsCiAKIAkvKioKLQkgKiBicGZfc2tiX2luX2Nncm91cChza2IsIG1hcCwgaW5kZXgpIC0gQ2hlY2sgY2dyb3VwMiBtZW1iZXJzaGlwIG9mIHNrYgorCSAqIGJwZl9za2JfdW5kZXJfY2dyb3VwKHNrYiwgbWFwLCBpbmRleCkgLSBDaGVjayBjZ3JvdXAyIG1lbWJlcnNoaXAgb2Ygc2tiCiAJICogQHNrYjogcG9pbnRlciB0byBza2IKIAkgKiBAbWFwOiBwb2ludGVyIHRvIGJwZl9tYXAgaW4gQlBGX01BUF9UWVBFX0NHUk9VUF9BUlJBWSB0eXBlCiAJICogQGluZGV4OiBpbmRleCBvZiB0aGUgY2dyb3VwIGluIHRoZSBicGZfbWFwCkBAIC0zNDgsNyArMzQ5LDcgQEAKIAkgKiAgID09IDEgc2tiIHN1Y2NlZWRlZCB0aGUgY2dyb3VwMiBkZXNjZW5kYW50IHRlc3QKIAkgKiAgICA8IDAgZXJyb3IKIAkgKi8KLQlCUEZfRlVOQ19za2JfaW5fY2dyb3VwLAorCUJQRl9GVU5DX3NrYl91bmRlcl9jZ3JvdXAsCiAKIAkvKioKIAkgKiBicGZfZ2V0X2hhc2hfcmVjYWxjKHNrYikKQEAgLTM3NSw2ICszNzYsNTYgQEAKIAkgKi8KIAlCUEZfRlVOQ19wcm9iZV93cml0ZV91c2VyLAogCisJLyoqCisJICogYnBmX2N1cnJlbnRfdGFza191bmRlcl9jZ3JvdXAobWFwLCBpbmRleCkgLSBDaGVjayBjZ3JvdXAyIG1lbWJlcnNoaXAgb2YgY3VycmVudCB0YXNrCisJICogQG1hcDogcG9pbnRlciB0byBicGZfbWFwIGluIEJQRl9NQVBfVFlQRV9DR1JPVVBfQVJSQVkgdHlwZQorCSAqIEBpbmRleDogaW5kZXggb2YgdGhlIGNncm91cCBpbiB0aGUgYnBmX21hcAorCSAqIFJldHVybjoKKwkgKiAgID09IDAgY3VycmVudCBmYWlsZWQgdGhlIGNncm91cDIgZGVzY2VuZGFudCB0ZXN0CisJICogICA9PSAxIGN1cnJlbnQgc3VjY2VlZGVkIHRoZSBjZ3JvdXAyIGRlc2NlbmRhbnQgdGVzdAorCSAqICAgIDwgMCBlcnJvcgorCSAqLworCUJQRl9GVU5DX2N1cnJlbnRfdGFza191bmRlcl9jZ3JvdXAsCisKKwkvKioKKwkgKiBicGZfc2tiX2NoYW5nZV90YWlsKHNrYiwgbGVuLCBmbGFncykKKwkgKiBUaGUgaGVscGVyIHdpbGwgcmVzaXplIHRoZSBza2IgdG8gdGhlIGdpdmVuIG5ldyBzaXplLAorCSAqIHRvIGJlIHVzZWQgZi5lLiB3aXRoIGNvbnRyb2wgbWVzc2FnZXMuCisJICogQHNrYjogcG9pbnRlciB0byBza2IKKwkgKiBAbGVuOiBuZXcgc2tiIGxlbmd0aAorCSAqIEBmbGFnczogcmVzZXJ2ZWQKKwkgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvcgorCSAqLworCUJQRl9GVU5DX3NrYl9jaGFuZ2VfdGFpbCwKKworCS8qKgorCSAqIGJwZl9za2JfcHVsbF9kYXRhKHNrYiwgbGVuKQorCSAqIFRoZSBoZWxwZXIgd2lsbCBwdWxsIGluIG5vbi1saW5lYXIgZGF0YSBpbiBjYXNlIHRoZQorCSAqIHNrYiBpcyBub24tbGluZWFyIGFuZCBub3QgYWxsIG9mIGxlbiBhcmUgcGFydCBvZiB0aGUKKwkgKiBsaW5lYXIgc2VjdGlvbi4gT25seSBuZWVkZWQgZm9yIHJlYWQvd3JpdGUgd2l0aCBkaXJlY3QKKwkgKiBwYWNrZXQgYWNjZXNzLgorCSAqIEBza2I6IHBvaW50ZXIgdG8gc2tiCisJICogQGxlbjogbGVuIHRvIG1ha2UgcmVhZC93cml0ZWFibGUKKwkgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvcgorCSAqLworCUJQRl9GVU5DX3NrYl9wdWxsX2RhdGEsCisKKwkvKioKKwkgKiBicGZfY3N1bV91cGRhdGUoc2tiLCBjc3VtKQorCSAqIEFkZHMgY3N1bSBpbnRvIHNrYi0+Y3N1bSBpbiBjYXNlIG9mIENIRUNLU1VNX0NPTVBMRVRFLgorCSAqIEBza2I6IHBvaW50ZXIgdG8gc2tiCisJICogQGNzdW06IGNzdW0gdG8gYWRkCisJICogUmV0dXJuOiBjc3VtIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IKKwkgKi8KKwlCUEZfRlVOQ19jc3VtX3VwZGF0ZSwKKworCS8qKgorCSAqIGJwZl9zZXRfaGFzaF9pbnZhbGlkKHNrYikKKwkgKiBJbnZhbGlkYXRlIGN1cnJlbnQgc2tiPmhhc2guCisJICogQHNrYjogcG9pbnRlciB0byBza2IKKwkgKi8KKwlCUEZfRlVOQ19zZXRfaGFzaF9pbnZhbGlkLAorCiAJX19CUEZfRlVOQ19NQVhfSUQsCiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvYnBmX3BlcmZfZXZlbnQuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9icGZfcGVyZl9ldmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NzQyNzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvYnBmX3BlcmZfZXZlbnQuaApAQCAtMCwwICsxLDE4IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTYgRmFjZWJvb2sKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaWZuZGVmIF9VQVBJX19MSU5VWF9CUEZfUEVSRl9FVkVOVF9IX18KKyNkZWZpbmUgX1VBUElfX0xJTlVYX0JQRl9QRVJGX0VWRU5UX0hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKworc3RydWN0IGJwZl9wZXJmX2V2ZW50X2RhdGEgeworCXN0cnVjdCBwdF9yZWdzIHJlZ3M7CisJX191NjQgc2FtcGxlX3BlcmlvZDsKK307CisKKyNlbmRpZiAvKiBfVUFQSV9fTElOVVhfQlBGX1BFUkZfRVZFTlRfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvZXRodG9vbC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2V0aHRvb2wuaAppbmRleCBiOGYzOGU4Li4wOTlhNDIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvZXRodG9vbC5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9ldGh0b29sLmgKQEAgLTEzNjIsNyArMTM2MiwxNCBAQAogCUVUSFRPT0xfTElOS19NT0RFXzEwMDAwMGJhc2VTUjRfRnVsbF9CSVQJPSAzNywKIAlFVEhUT09MX0xJTktfTU9ERV8xMDAwMDBiYXNlQ1I0X0Z1bGxfQklUCT0gMzgsCiAJRVRIVE9PTF9MSU5LX01PREVfMTAwMDAwYmFzZUxSNF9FUjRfRnVsbF9CSVQJPSAzOSwKLQlFVEhUT09MX0xJTktfTU9ERV81MDAwMGJhc2VTUjJfRnVsbF9CSVQgICAgICAgICA9IDQwLAorCUVUSFRPT0xfTElOS19NT0RFXzUwMDAwYmFzZVNSMl9GdWxsX0JJVAkJPSA0MCwKKwlFVEhUT09MX0xJTktfTU9ERV8xMDAwYmFzZVhfRnVsbF9CSVQJPSA0MSwKKwlFVEhUT09MX0xJTktfTU9ERV8xMDAwMGJhc2VDUl9GdWxsX0JJVAk9IDQyLAorCUVUSFRPT0xfTElOS19NT0RFXzEwMDAwYmFzZVNSX0Z1bGxfQklUCT0gNDMsCisJRVRIVE9PTF9MSU5LX01PREVfMTAwMDBiYXNlTFJfRnVsbF9CSVQJPSA0NCwKKwlFVEhUT09MX0xJTktfTU9ERV8xMDAwMGJhc2VMUk1fRnVsbF9CSVQJPSA0NSwKKwlFVEhUT09MX0xJTktfTU9ERV8xMDAwMGJhc2VFUl9GdWxsX0JJVAk9IDQ2LAorCiAKIAkvKiBMYXN0IGFsbG93ZWQgYml0IGZvciBfX0VUSFRPT0xfTElOS19NT0RFX0xFR0FDWV9NQVNLIGlzIGJpdAogCSAqIDMxLiBQbGVhc2UgZG8gTk9UIGRlZmluZSBhbnkgU1VQUE9SVEVEXyogb3IgQURWRVJUSVNFRF8qCkBAIC0xMzcxLDcgKzEzNzgsNyBAQAogCSAqLwogCiAJX19FVEhUT09MX0xJTktfTU9ERV9MQVNUCi0JICA9IEVUSFRPT0xfTElOS19NT0RFXzUwMDAwYmFzZVNSMl9GdWxsX0JJVCwKKwkgID0gRVRIVE9PTF9MSU5LX01PREVfMTAwMDBiYXNlRVJfRnVsbF9CSVQsCiB9OwogCiAjZGVmaW5lIF9fRVRIVE9PTF9MSU5LX01PREVfTEVHQUNZX01BU0soYmFzZV9uYW1lKQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvZnVzZS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2Z1c2UuaAppbmRleCAyN2UxNzM2Li40MmZhOTc3IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvZnVzZS5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9mdXNlLmgKQEAgLTEwOCw2ICsxMDgsMTAgQEAKICAqCiAgKiAgNy4yNQogICogIC0gYWRkIEZVU0VfUEFSQUxMRUxfRElST1BTCisgKgorICogIDcuMjYKKyAqICAtIGFkZCBGVVNFX0hBTkRMRV9LSUxMUFJJVgorICogIC0gYWRkIEZVU0VfUE9TSVhfQUNMCiAgKi8KIAogI2lmbmRlZiBfTElOVVhfRlVTRV9ICkBAIC0xNDMsNyArMTQ3LDcgQEAKICNkZWZpbmUgRlVTRV9LRVJORUxfVkVSU0lPTiA3CiAKIC8qKiBNaW5vciB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIGludGVyZmFjZSAqLwotI2RlZmluZSBGVVNFX0tFUk5FTF9NSU5PUl9WRVJTSU9OIDI1CisjZGVmaW5lIEZVU0VfS0VSTkVMX01JTk9SX1ZFUlNJT04gMjYKIAogLyoqIFRoZSBub2RlIElEIG9mIHRoZSByb290IGlub2RlICovCiAjZGVmaW5lIEZVU0VfUk9PVF9JRCAxCkBAIC0yMzgsNiArMjQyLDggQEAKICAqIEZVU0VfV1JJVEVCQUNLX0NBQ0hFOiB1c2Ugd3JpdGViYWNrIGNhY2hlIGZvciBidWZmZXJlZCB3cml0ZXMKICAqIEZVU0VfTk9fT1BFTl9TVVBQT1JUOiBrZXJuZWwgc3VwcG9ydHMgemVyby1tZXNzYWdlIG9wZW5zCiAgKiBGVVNFX1BBUkFMTEVMX0RJUk9QUzogYWxsb3cgcGFyYWxsZWwgbG9va3VwcyBhbmQgcmVhZGRpcgorICogRlVTRV9IQU5ETEVfS0lMTFBSSVY6IGZzIGhhbmRsZXMga2lsbGluZyBzdWlkL3NnaWQvY2FwIG9uIHdyaXRlL2Nob3duL3RydW5jCisgKiBGVVNFX1BPU0lYX0FDTDogZmlsZXN5c3RlbSBzdXBwb3J0cyBwb3NpeCBhY2xzCiAgKi8KICNkZWZpbmUgRlVTRV9BU1lOQ19SRUFECQkoMSA8PCAwKQogI2RlZmluZSBGVVNFX1BPU0lYX0xPQ0tTCSgxIDw8IDEpCkBAIC0yNTgsNiArMjY0LDggQEAKICNkZWZpbmUgRlVTRV9XUklURUJBQ0tfQ0FDSEUJKDEgPDwgMTYpCiAjZGVmaW5lIEZVU0VfTk9fT1BFTl9TVVBQT1JUCSgxIDw8IDE3KQogI2RlZmluZSBGVVNFX1BBUkFMTEVMX0RJUk9QUyAgICAoMSA8PCAxOCkKKyNkZWZpbmUgRlVTRV9IQU5ETEVfS0lMTFBSSVYJKDEgPDwgMTkpCisjZGVmaW5lIEZVU0VfUE9TSVhfQUNMCQkoMSA8PCAyMCkKIAogLyoqCiAgKiBDVVNFIElOSVQgcmVxdWVzdC9yZXBseSBmbGFncwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2hzaS9oc2lfY2hhci5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2hzaS9oc2lfY2hhci5oCmluZGV4IDc2MTYwYjQuLmMwMGE0NjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9oc2kvaHNpX2NoYXIuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvaHNpL2hzaV9jaGFyLmgKQEAgLTIwLDEwICsyMCwxMSBAQAogICogMDIxMTAtMTMwMSBVU0EKICAqLwogCi0KICNpZm5kZWYgX19IU0lfQ0hBUl9ICiAjZGVmaW5lIF9fSFNJX0NIQVJfSAogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwogI2RlZmluZSBIU0lfQ0hBUl9NQUdJQwkJJ2snCiAjZGVmaW5lIEhTQ19JT1cobnVtLCBkdHlwZSkJX0lPVyhIU0lfQ0hBUl9NQUdJQywgbnVtLCBkdHlwZSkKICNkZWZpbmUgSFNDX0lPUihudW0sIGR0eXBlKQlfSU9SKEhTSV9DSEFSX01BR0lDLCBudW0sIGR0eXBlKQpAQCAtNDgsMTYgKzQ5LDE2IEBACiAjZGVmaW5lIEhTQ19BUkJfUFJJTwkJMQogCiBzdHJ1Y3QgaHNjX3J4X2NvbmZpZyB7Ci0JdWludDMyX3QgbW9kZTsKLQl1aW50MzJfdCBmbG93OwotCXVpbnQzMl90IGNoYW5uZWxzOworCV9fdTMyIG1vZGU7CisJX191MzIgZmxvdzsKKwlfX3UzMiBjaGFubmVsczsKIH07CiAKIHN0cnVjdCBoc2NfdHhfY29uZmlnIHsKLQl1aW50MzJfdCBtb2RlOwotCXVpbnQzMl90IGNoYW5uZWxzOwotCXVpbnQzMl90IHNwZWVkOwotCXVpbnQzMl90IGFyYl9tb2RlOworCV9fdTMyIG1vZGU7CisJX191MzIgY2hhbm5lbHM7CisJX191MzIgc3BlZWQ7CisJX191MzIgYXJiX21vZGU7CiB9OwogCiAjZW5kaWYgLyogX19IU0lfQ0hBUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvaWZfYnJpZGdlLmggYi9pbmNsdWRlL3VhcGkvbGludXgvaWZfYnJpZGdlLmgKaW5kZXggYzE4NmY2NC4uYWI5MmJjYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2lmX2JyaWRnZS5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9pZl9icmlkZ2UuaApAQCAtMTQwLDcgKzE0MCw3IEBACiAJX191NjQgdHhfYnl0ZXM7CiAJX191NjQgdHhfcGFja2V0czsKIAlfX3UxNiB2aWQ7Ci0JX191MTYgcGFkMTsKKwlfX3UxNiBmbGFnczsKIAlfX3UzMiBwYWQyOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2lmX2xpbmsuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9pZl9saW5rLmgKaW5kZXggYTFiNTIwMi4uYjRmYmE2NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2lmX2xpbmsuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvaWZfbGluay5oCkBAIC0zMTgsNiArMzE4LDcgQEAKIAlJRkxBX0JSUE9SVF9GTFVTSCwKIAlJRkxBX0JSUE9SVF9NVUxUSUNBU1RfUk9VVEVSLAogCUlGTEFfQlJQT1JUX1BBRCwKKwlJRkxBX0JSUE9SVF9NQ0FTVF9GTE9PRCwKIAlfX0lGTEFfQlJQT1JUX01BWAogfTsKICNkZWZpbmUgSUZMQV9CUlBPUlRfTUFYIChfX0lGTEFfQlJQT1JUX01BWCAtIDEpCkBAIC00NjMsNiArNDY0LDcgQEAKIGVudW0gaXB2bGFuX21vZGUgewogCUlQVkxBTl9NT0RFX0wyID0gMCwKIAlJUFZMQU5fTU9ERV9MMywKKwlJUFZMQU5fTU9ERV9MM1MsCiAJSVBWTEFOX01PREVfTUFYCiB9OwogCkBAIC02MTcsNyArNjE5LDcgQEAKIGVudW0gewogCUlGTEFfVkZfVU5TUEVDLAogCUlGTEFfVkZfTUFDLAkJLyogSGFyZHdhcmUgcXVldWUgc3BlY2lmaWMgYXR0cmlidXRlcyAqLwotCUlGTEFfVkZfVkxBTiwKKwlJRkxBX1ZGX1ZMQU4sCQkvKiBWTEFOIElEIGFuZCBRb1MgKi8KIAlJRkxBX1ZGX1RYX1JBVEUsCS8qIE1heCBUWCBCYW5kd2lkdGggQWxsb2NhdGlvbiAqLwogCUlGTEFfVkZfU1BPT0ZDSEssCS8qIFNwb29mIENoZWNraW5nIG9uL29mZiBzd2l0Y2ggKi8KIAlJRkxBX1ZGX0xJTktfU1RBVEUsCS8qIGxpbmsgc3RhdGUgZW5hYmxlL2Rpc2FibGUvYXV0byBzd2l0Y2ggKi8KQEAgLTYyOSw2ICs2MzEsNyBAQAogCUlGTEFfVkZfVFJVU1QsCQkvKiBUcnVzdCBWRiAqLwogCUlGTEFfVkZfSUJfTk9ERV9HVUlELAkvKiBWRiBJbmZpbmliYW5kIG5vZGUgR1VJRCAqLwogCUlGTEFfVkZfSUJfUE9SVF9HVUlELAkvKiBWRiBJbmZpbmliYW5kIHBvcnQgR1VJRCAqLworCUlGTEFfVkZfVkxBTl9MSVNULAkvKiBuZXN0ZWQgbGlzdCBvZiB2bGFucywgb3B0aW9uIGZvciBRaW5RICovCiAJX19JRkxBX1ZGX01BWCwKIH07CiAKQEAgLTY0NSw2ICs2NDgsMjIgQEAKIAlfX3UzMiBxb3M7CiB9OwogCitlbnVtIHsKKwlJRkxBX1ZGX1ZMQU5fSU5GT19VTlNQRUMsCisJSUZMQV9WRl9WTEFOX0lORk8sCS8qIFZMQU4gSUQsIFFvUyBhbmQgVkxBTiBwcm90b2NvbCAqLworCV9fSUZMQV9WRl9WTEFOX0lORk9fTUFYLAorfTsKKworI2RlZmluZSBJRkxBX1ZGX1ZMQU5fSU5GT19NQVggKF9fSUZMQV9WRl9WTEFOX0lORk9fTUFYIC0gMSkKKyNkZWZpbmUgTUFYX1ZMQU5fTElTVF9MRU4gMQorCitzdHJ1Y3QgaWZsYV92Zl92bGFuX2luZm8geworCV9fdTMyIHZmOworCV9fdTMyIHZsYW47IC8qIDAgLSA0MDk1LCAwIGRpc2FibGVzIFZMQU4gZmlsdGVyICovCisJX191MzIgcW9zOworCV9fYmUxNiB2bGFuX3Byb3RvOyAvKiBWTEFOIHByb3RvY29sIGVpdGhlciA4MDIuMVEgb3IgODAyLjFhZCAqLworfTsKKwogc3RydWN0IGlmbGFfdmZfdHhfcmF0ZSB7CiAJX191MzIgdmY7CiAJX191MzIgcmF0ZTsgLyogTWF4IFRYIGJhbmR3aWR0aCBpbiBNYnBzLCAwIGRpc2FibGVzIHRocm90dGxpbmcgKi8KQEAgLTgyNSw2ICs4NDQsNyBAQAogCUlGTEFfU1RBVFNfTElOS182NCwKIAlJRkxBX1NUQVRTX0xJTktfWFNUQVRTLAogCUlGTEFfU1RBVFNfTElOS19YU1RBVFNfU0xBVkUsCisJSUZMQV9TVEFUU19MSU5LX09GRkxPQURfWFNUQVRTLAogCV9fSUZMQV9TVEFUU19NQVgsCiB9OwogCkBAIC04NDQsNiArODY0LDE0IEBACiB9OwogI2RlZmluZSBMSU5LX1hTVEFUU19UWVBFX01BWCAoX19MSU5LX1hTVEFUU19UWVBFX01BWCAtIDEpCiAKKy8qIFRoZXNlIGFyZSBzdGF0cyBlbWJlZGRlZCBpbnRvIElGTEFfU1RBVFNfTElOS19PRkZMT0FEX1hTVEFUUyAqLworZW51bSB7CisJSUZMQV9PRkZMT0FEX1hTVEFUU19VTlNQRUMsCisJSUZMQV9PRkZMT0FEX1hTVEFUU19DUFVfSElULCAvKiBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKi8KKwlfX0lGTEFfT0ZGTE9BRF9YU1RBVFNfTUFYCit9OworI2RlZmluZSBJRkxBX09GRkxPQURfWFNUQVRTX01BWCAoX19JRkxBX09GRkxPQURfWFNUQVRTX01BWCAtIDEpCisKIC8qIFhEUCBzZWN0aW9uICovCiAKIGVudW0gewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2lmX3BwcG9sMnRwLmggYi9pbmNsdWRlL3VhcGkvbGludXgvaWZfcHBwb2wydHAuaAppbmRleCAxNjNlOGFkLi40YmQxZjU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvaWZfcHBwb2wydHAuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvaWZfcHBwb2wydHAuaApAQCAtMTYsNyArMTYsOCBAQAogI2RlZmluZSBfVUFQSV9fTElOVVhfSUZfUFBQT0wyVFBfSAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CiAKIC8qIFN0cnVjdHVyZSB1c2VkIHRvIGNvbm5lY3QoKSB0aGUgc29ja2V0IHRvIGEgcGFydGljdWxhciB0dW5uZWwgVURQCiAgKiBzb2NrZXQgb3ZlciBJUHY0LgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2lmX3BwcG94LmggYi9pbmNsdWRlL3VhcGkvbGludXgvaWZfcHBwb3guaAppbmRleCBlMTI4NzY5Li5kMzdiYmIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvaWZfcHBwb3guaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvaWZfcHBwb3guaApAQCAtMjEsOCArMjEsMTEgQEAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfcHBwb2wydHAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgogCiAvKiBGb3IgdXNlci1zcGFjZSBwcm9ncmFtcyB0byBwaWNrIHVwIHRoZXNlIGRlZmluaXRpb25zCiAgKiB3aGljaCB0aGV5IHdvdWxkbid0IGdldCBvdGhlcndpc2Ugd2l0aG91dCBkZWZpbmluZyBfX0tFUk5FTF9fCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvaWZfdHVubmVsLmggYi9pbmNsdWRlL3VhcGkvbGludXgvaWZfdHVubmVsLmgKaW5kZXggMTA0NmY1NS4uOTJmM2M4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2lmX3R1bm5lbC5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9pZl90dW5uZWwuaApAQCAtMiw2ICsyLDkgQEAKICNkZWZpbmUgX1VBUElfSUZfVFVOTkVMX0hfCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKIApAQCAtMjQsOSArMjcsMjMgQEAKICNkZWZpbmUgR1JFX1NFUQkJX19jcHVfdG9fYmUxNigweDEwMDApCiAjZGVmaW5lIEdSRV9TVFJJQ1QJX19jcHVfdG9fYmUxNigweDA4MDApCiAjZGVmaW5lIEdSRV9SRUMJCV9fY3B1X3RvX2JlMTYoMHgwNzAwKQotI2RlZmluZSBHUkVfRkxBR1MJX19jcHVfdG9fYmUxNigweDAwRjgpCisjZGVmaW5lIEdSRV9BQ0sJCV9fY3B1X3RvX2JlMTYoMHgwMDgwKQorI2RlZmluZSBHUkVfRkxBR1MJX19jcHVfdG9fYmUxNigweDAwNzgpCiAjZGVmaW5lIEdSRV9WRVJTSU9OCV9fY3B1X3RvX2JlMTYoMHgwMDA3KQogCisjZGVmaW5lIEdSRV9JU19DU1VNKGYpCQkoKGYpICYgR1JFX0NTVU0pCisjZGVmaW5lIEdSRV9JU19ST1VUSU5HKGYpCSgoZikgJiBHUkVfUk9VVElORykKKyNkZWZpbmUgR1JFX0lTX0tFWShmKQkJKChmKSAmIEdSRV9LRVkpCisjZGVmaW5lIEdSRV9JU19TRVEoZikJCSgoZikgJiBHUkVfU0VRKQorI2RlZmluZSBHUkVfSVNfU1RSSUNUKGYpCSgoZikgJiBHUkVfU1RSSUNUKQorI2RlZmluZSBHUkVfSVNfUkVDKGYpCQkoKGYpICYgR1JFX1JFQykKKyNkZWZpbmUgR1JFX0lTX0FDSyhmKQkJKChmKSAmIEdSRV9BQ0spCisKKyNkZWZpbmUgR1JFX1ZFUlNJT05fMAkJX19jcHVfdG9fYmUxNigweDAwMDApCisjZGVmaW5lIEdSRV9WRVJTSU9OXzEJCV9fY3B1X3RvX2JlMTYoMHgwMDAxKQorI2RlZmluZSBHUkVfUFJPVE9fUFBQCQlfX2NwdV90b19iZTE2KDB4ODgwYikKKyNkZWZpbmUgR1JFX1BQVFBfS0VZX01BU0sJX19jcHVfdG9fYmUzMigweGZmZmYpCisKIHN0cnVjdCBpcF90dW5uZWxfcGFybSB7CiAJY2hhcgkJCW5hbWVbSUZOQU1TSVpdOwogCWludAkJCWxpbms7CkBAIC01Nyw2ICs3NCw3IEBACiAJSUZMQV9JUFRVTl9FTkNBUF9GTEFHUywKIAlJRkxBX0lQVFVOX0VOQ0FQX1NQT1JULAogCUlGTEFfSVBUVU5fRU5DQVBfRFBPUlQsCisJSUZMQV9JUFRVTl9DT0xMRUNUX01FVEFEQVRBLAogCV9fSUZMQV9JUFRVTl9NQVgsCiB9OwogI2RlZmluZSBJRkxBX0lQVFVOX01BWAkoX19JRkxBX0lQVFVOX01BWCAtIDEpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvaW5ldF9kaWFnLmggYi9pbmNsdWRlL3VhcGkvbGludXgvaW5ldF9kaWFnLmgKaW5kZXggYWJiZDFkYy4uNTA5Y2Q5NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2luZXRfZGlhZy5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9pbmV0X2RpYWcuaApAQCAtNzMsNiArNzMsNyBAQAogCUlORVRfRElBR19CQ19TX0NPTkQsCiAJSU5FVF9ESUFHX0JDX0RfQ09ORCwKIAlJTkVUX0RJQUdfQkNfREVWX0NPTkQsICAgLyogdTMyIGlmaW5kZXggKi8KKwlJTkVUX0RJQUdfQkNfTUFSS19DT05ELAogfTsKIAogc3RydWN0IGluZXRfZGlhZ19ob3N0Y29uZCB7CkBAIC04Miw2ICs4MywxMSBAQAogCV9fYmUzMglhZGRyWzBdOwogfTsKIAorc3RydWN0IGluZXRfZGlhZ19tYXJrY29uZCB7CisJX191MzIgbWFyazsKKwlfX3UzMiBtYXNrOworfTsKKwogLyogQmFzZSBpbmZvIHN0cnVjdHVyZS4gSXQgY29udGFpbnMgc29ja2V0IGlkZW50aXR5IChhZGRycy9wb3J0cy9jb29raWUpCiAgKiBhbmQsIGFsYXMsIHRoZSBpbmZvcm1hdGlvbiBzaG93biBieSBuZXRzdGF0LiAqLwogc3RydWN0IGluZXRfZGlhZ19tc2cgewpAQCAtMTE3LDYgKzEyMyw4IEBACiAJSU5FVF9ESUFHX0xPQ0FMUywKIAlJTkVUX0RJQUdfUEVFUlMsCiAJSU5FVF9ESUFHX1BBRCwKKwlJTkVUX0RJQUdfTUFSSywKKwlJTkVUX0RJQUdfQkJSSU5GTywKIAlfX0lORVRfRElBR19NQVgsCiB9OwogCkBAIC0xNTAsOCArMTU4LDIwIEBACiAJX191MzIJZGN0Y3BfYWJfdG90OwogfTsKIAorLyogSU5FVF9ESUFHX0JCUklORk8gKi8KKworc3RydWN0IHRjcF9iYnJfaW5mbyB7CisJLyogdTY0IGJ3OiBtYXgtZmlsdGVyZWQgQlcgKGFwcCB0aHJvdWdocHV0KSBlc3RpbWF0ZSBpbiBCeXRlIHBlciBzZWM6ICovCisJX191MzIJYmJyX2J3X2xvOwkJLyogbG93ZXIgMzIgYml0cyBvZiBidyAqLworCV9fdTMyCWJicl9id19oaTsJCS8qIHVwcGVyIDMyIGJpdHMgb2YgYncgKi8KKwlfX3UzMgliYnJfbWluX3J0dDsJCS8qIG1pbi1maWx0ZXJlZCBSVFQgaW4gdVNlYyAqLworCV9fdTMyCWJicl9wYWNpbmdfZ2FpbjsJLyogcGFjaW5nIGdhaW4gc2hpZnRlZCBsZWZ0IDggYml0cyAqLworCV9fdTMyCWJicl9jd25kX2dhaW47CQkvKiBjd25kIGdhaW4gc2hpZnRlZCBsZWZ0IDggYml0cyAqLworfTsKKwogdW5pb24gdGNwX2NjX2luZm8gewogCXN0cnVjdCB0Y3B2ZWdhc19pbmZvCXZlZ2FzOwogCXN0cnVjdCB0Y3BfZGN0Y3BfaW5mbwlkY3RjcDsKKwlzdHJ1Y3QgdGNwX2Jicl9pbmZvCWJicjsKIH07CiAjZW5kaWYgLyogX1VBUElfSU5FVF9ESUFHX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvaXB2Ni5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2lwdjYuaAppbmRleCAzOTU4NzYwLi44YzI3NzIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvaXB2Ni5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9pcHY2LmgKQEAgLTE3Nyw2ICsxNzcsNyBAQAogCURFVkNPTkZfRFJPUF9VTklDQVNUX0lOX0wyX01VTFRJQ0FTVCwKIAlERVZDT05GX0RST1BfVU5TT0xJQ0lURURfTkEsCiAJREVWQ09ORl9LRUVQX0FERFJfT05fRE9XTiwKKwlERVZDT05GX1JUUl9TT0xJQ0lUX01BWF9JTlRFUlZBTCwKIAlERVZDT05GX01BWAogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2lweC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2lweC5oCmluZGV4IDNkNDgwMTQuLjMwZjAzMWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9pcHguaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvaXB4LmgKQEAgLTEsMTEgKzEsMTMgQEAKICNpZm5kZWYgX0lQWF9IXwogI2RlZmluZSBfSVBYX0hfCisjaW5jbHVkZSA8bGludXgvbGliYy1jb21wYXQuaD4JLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBnbGliYyBuZXRpcHgvaXB4LmggKi8KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KICNkZWZpbmUgSVBYX05PREVfTEVOCTYKICNkZWZpbmUgSVBYX01UVQkJNTc2CiAKKyNpZiBfX1VBUElfREVGX1NPQ0tBRERSX0lQWAogc3RydWN0IHNvY2thZGRyX2lweCB7CiAJX19rZXJuZWxfc2FfZmFtaWx5X3Qgc2lweF9mYW1pbHk7CiAJX19iZTE2CQlzaXB4X3BvcnQ7CkBAIC0xNCw2ICsxNiw3IEBACiAJX191OAkJc2lweF90eXBlOwogCXVuc2lnbmVkIGNoYXIJc2lweF96ZXJvOwkvKiAxNiBieXRlIGZpbGwgKi8KIH07CisjZW5kaWYgLyogX19VQVBJX0RFRl9TT0NLQUREUl9JUFggKi8KIAogLyoKICAqIFNvIHdlIGNhbiBmaXQgdGhlIGV4dHJhIGluZm8gZm9yIFNJT0NTSUZBRERSIGludG8gdGhlIGFkZHJlc3MgbmljZWx5CkBAIC0yMywxMiArMjYsMTUgQEAKICNkZWZpbmUgSVBYX0RMVElURgkwCiAjZGVmaW5lIElQWF9DUlRJVEYJMQogCisjaWYgX19VQVBJX0RFRl9JUFhfUk9VVEVfREVGSU5JVElPTgogc3RydWN0IGlweF9yb3V0ZV9kZWZpbml0aW9uIHsKIAlfX2JlMzIgICAgICAgIGlweF9uZXR3b3JrOwogCV9fYmUzMiAgICAgICAgaXB4X3JvdXRlcl9uZXR3b3JrOwogCXVuc2lnbmVkIGNoYXIgaXB4X3JvdXRlcl9ub2RlW0lQWF9OT0RFX0xFTl07CiB9OworI2VuZGlmIC8qIF9fVUFQSV9ERUZfSVBYX1JPVVRFX0RFRklOSVRJT04gKi8KIAorI2lmIF9fVUFQSV9ERUZfSVBYX0lOVEVSRkFDRV9ERUZJTklUSU9OCiBzdHJ1Y3QgaXB4X2ludGVyZmFjZV9kZWZpbml0aW9uIHsKIAlfX2JlMzIgICAgICAgIGlweF9uZXR3b3JrOwogCXVuc2lnbmVkIGNoYXIgaXB4X2RldmljZVsxNl07CkBAIC00NSwxNiArNTEsMjAgQEAKICNkZWZpbmUgSVBYX0lOVEVSTkFMCQkyCiAJdW5zaWduZWQgY2hhciBpcHhfbm9kZVtJUFhfTk9ERV9MRU5dOwogfTsKLQkKKyNlbmRpZiAvKiBfX1VBUElfREVGX0lQWF9JTlRFUkZBQ0VfREVGSU5JVElPTiAqLworCisjaWYgX19VQVBJX0RFRl9JUFhfQ09ORklHX0RBVEEKIHN0cnVjdCBpcHhfY29uZmlnX2RhdGEgewogCXVuc2lnbmVkIGNoYXIJaXB4Y2ZnX2F1dG9fc2VsZWN0X3ByaW1hcnk7CiAJdW5zaWduZWQgY2hhcglpcHhjZmdfYXV0b19jcmVhdGVfaW50ZXJmYWNlczsKIH07CisjZW5kaWYgLyogX19VQVBJX0RFRl9JUFhfQ09ORklHX0RBVEEgKi8KIAogLyoKICAqIE9MRCBSb3V0ZSBEZWZpbml0aW9uIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgogICovCiAKKyNpZiBfX1VBUElfREVGX0lQWF9ST1VURV9ERUYKIHN0cnVjdCBpcHhfcm91dGVfZGVmIHsKIAlfX2JlMzIJCWlweF9uZXR3b3JrOwogCV9fYmUzMgkJaXB4X3JvdXRlcl9uZXR3b3JrOwpAQCAtNjcsNiArNzcsNyBAQAogI2RlZmluZSBJUFhfUlRfQkxVRUJPT0sJCTIKICNkZWZpbmUgSVBYX1JUX1JPVVRFRAkJMQogfTsKKyNlbmRpZiAvKiBfX1VBUElfREVGX0lQWF9ST1VURV9ERUYgKi8KIAogI2RlZmluZSBTSU9DQUlQWElURkNSVAkJKFNJT0NQUk9UT1BSSVZBVEUpCiAjZGVmaW5lIFNJT0NBSVBYUFJJU0xUCQkoU0lPQ1BST1RPUFJJVkFURSArIDEpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbGliYy1jb21wYXQuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9saWJjLWNvbXBhdC5oCmluZGV4IGU0ZjA0OGUuLjQ0YjhhNmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9saWJjLWNvbXBhdC5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9saWJjLWNvbXBhdC5oCkBAIC0xMzksNiArMTM5LDI1IEBACiAKICNlbmRpZiAvKiBfTkVUSU5FVF9JTl9IICovCiAKKy8qIENvb3JkaW5hdGUgd2l0aCBnbGliYyBuZXRpcHgvaXB4LmggaGVhZGVyLiAqLworI2lmIGRlZmluZWQoX19ORVRJUFhfSVBYX0gpCisKKyNkZWZpbmUgX19VQVBJX0RFRl9TT0NLQUREUl9JUFgJCQkwCisjZGVmaW5lIF9fVUFQSV9ERUZfSVBYX1JPVVRFX0RFRklOSVRJT04JCTAKKyNkZWZpbmUgX19VQVBJX0RFRl9JUFhfSU5URVJGQUNFX0RFRklOSVRJT04JMAorI2RlZmluZSBfX1VBUElfREVGX0lQWF9DT05GSUdfREFUQQkJMAorI2RlZmluZSBfX1VBUElfREVGX0lQWF9ST1VURV9ERUYJCTAKKworI2Vsc2UgLyogZGVmaW5lZChfX05FVElQWF9JUFhfSCkgKi8KKworI2RlZmluZSBfX1VBUElfREVGX1NPQ0tBRERSX0lQWAkJCTEKKyNkZWZpbmUgX19VQVBJX0RFRl9JUFhfUk9VVEVfREVGSU5JVElPTgkJMQorI2RlZmluZSBfX1VBUElfREVGX0lQWF9JTlRFUkZBQ0VfREVGSU5JVElPTgkxCisjZGVmaW5lIF9fVUFQSV9ERUZfSVBYX0NPTkZJR19EQVRBCQkxCisjZGVmaW5lIF9fVUFQSV9ERUZfSVBYX1JPVVRFX0RFRgkJMQorCisjZW5kaWYgLyogZGVmaW5lZChfX05FVElQWF9JUFhfSCkgKi8KKwogLyogRGVmaW5pdGlvbnMgZm9yIHhhdHRyLmggKi8KICNpZiBkZWZpbmVkKF9TWVNfWEFUVFJfSCkKICNkZWZpbmUgX19VQVBJX0RFRl9YQVRUUgkJMApAQCAtMTc5LDYgKzE5OCwxMyBAQAogI2RlZmluZSBfX1VBUElfREVGX0lONl9QS1RJTkZPCQkxCiAjZGVmaW5lIF9fVUFQSV9ERUZfSVA2X01UVUlORk8JCTEKIAorLyogRGVmaW5pdGlvbnMgZm9yIGlweC5oICovCisjZGVmaW5lIF9fVUFQSV9ERUZfU09DS0FERFJfSVBYCQkJMQorI2RlZmluZSBfX1VBUElfREVGX0lQWF9ST1VURV9ERUZJTklUSU9OCQkxCisjZGVmaW5lIF9fVUFQSV9ERUZfSVBYX0lOVEVSRkFDRV9ERUZJTklUSU9OCTEKKyNkZWZpbmUgX19VQVBJX0RFRl9JUFhfQ09ORklHX0RBVEEJCTEKKyNkZWZpbmUgX19VQVBJX0RFRl9JUFhfUk9VVEVfREVGCQkxCisKIC8qIERlZmluaXRpb25zIGZvciB4YXR0ci5oICovCiAjZGVmaW5lIF9fVUFQSV9ERUZfWEFUVFIJCTEKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L21paS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L21paS5oCmluZGV4IDIzN2ZhYzQuLjE1ZDg1MTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9taWkuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvbWlpLmgKQEAgLTQ4LDYgKzQ4LDcgQEAKICNkZWZpbmUgQk1DUl9TUEVFRDEwMAkJMHgyMDAwCS8qIFNlbGVjdCAxMDBNYnBzICAgICAgICAgICAgICAqLwogI2RlZmluZSBCTUNSX0xPT1BCQUNLCQkweDQwMDAJLyogVFhEIGxvb3BiYWNrIGJpdHMgICAgICAgICAgICovCiAjZGVmaW5lIEJNQ1JfUkVTRVQJCTB4ODAwMAkvKiBSZXNldCB0byBkZWZhdWx0IHN0YXRlICAgICAgKi8KKyNkZWZpbmUgQk1DUl9TUEVFRDEwCQkweDAwMDAJLyogU2VsZWN0IDEwTWJwcyAgICAgICAgICAgICAgICovCiAKIC8qIEJhc2ljIG1vZGUgc3RhdHVzIHJlZ2lzdGVyLiAqLwogI2RlZmluZSBCTVNSX0VSQ0FQCQkweDAwMDEJLyogRXh0LXJlZyBjYXBhYmlsaXR5ICAgICAgICAgICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbmV0ZmlsdGVyL25mX2xvZy5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L25ldGZpbHRlci9uZl9sb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmUyMWUwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L25ldGZpbHRlci9uZl9sb2cuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9ORVRGSUxURVJfTkZfTE9HX0gKKyNkZWZpbmUgX05FVEZJTFRFUl9ORl9MT0dfSAorCisjZGVmaW5lIE5GX0xPR19UQ1BTRVEJCTB4MDEJLyogTG9nIFRDUCBzZXF1ZW5jZSBudW1iZXJzICovCisjZGVmaW5lIE5GX0xPR19UQ1BPUFQJCTB4MDIJLyogTG9nIFRDUCBvcHRpb25zICovCisjZGVmaW5lIE5GX0xPR19JUE9QVAkJMHgwNAkvKiBMb2cgSVAgb3B0aW9ucyAqLworI2RlZmluZSBORl9MT0dfVUlECQkweDA4CS8qIExvZyBVSUQgb3duaW5nIGxvY2FsIHNvY2tldCAqLworI2RlZmluZSBORl9MT0dfTkZMT0cJCTB4MTAJLyogVW5zdXBwb3J0ZWQsIGRvbid0IHJldXNlICovCisjZGVmaW5lIE5GX0xPR19NQUNERUNPREUJMHgyMAkvKiBEZWNvZGUgTUFDIGhlYWRlciAqLworI2RlZmluZSBORl9MT0dfTUFTSwkJMHgyZgorCisjZW5kaWYgLyogX05FVEZJTFRFUl9ORl9MT0dfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L25ldGZpbHRlci9uZl90YWJsZXMuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9uZXRmaWx0ZXIvbmZfdGFibGVzLmgKaW5kZXggMDE3NTFmYS4uYzZjNDQ3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L25ldGZpbHRlci9uZl90YWJsZXMuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvbmV0ZmlsdGVyL25mX3RhYmxlcy5oCkBAIC0yNCw3ICsyNCw3IEBACiAJX19ORlRfUkVHX01BWCwKIAogCU5GVF9SRUczMl8wMAk9IDgsCi0JTUZUX1JFRzMyXzAxLAorCU5GVF9SRUczMl8wMSwKIAlORlRfUkVHMzJfMDIsCiAJTkZUX1JFRzMyXzAzLAogCU5GVF9SRUczMl8wNCwKQEAgLTU0Niw2ICs1NDYsMzUgQEAKIH07CiAjZGVmaW5lIE5GVEFfQ01QX01BWAkJKF9fTkZUQV9DTVBfTUFYIC0gMSkKIAorLyoqCisgKiBlbnVtIG5mdF9yYW5nZV9vcHMgLSBuZl90YWJsZXMgcmFuZ2Ugb3BlcmF0b3IKKyAqCisgKiBATkZUX1JBTkdFX0VROiBlcXVhbAorICogQE5GVF9SQU5HRV9ORVE6IG5vdCBlcXVhbAorICovCitlbnVtIG5mdF9yYW5nZV9vcHMgeworCU5GVF9SQU5HRV9FUSwKKwlORlRfUkFOR0VfTkVRLAorfTsKKworLyoqCisgKiBlbnVtIG5mdF9yYW5nZV9hdHRyaWJ1dGVzIC0gbmZfdGFibGVzIHJhbmdlIGV4cHJlc3Npb24gbmV0bGluayBhdHRyaWJ1dGVzCisgKgorICogQE5GVEFfUkFOR0VfU1JFRzogc291cmNlIHJlZ2lzdGVyIG9mIGRhdGEgdG8gY29tcGFyZSAoTkxBX1UzMjogbmZ0X3JlZ2lzdGVycykKKyAqIEBORlRBX1JBTkdFX09QOiBjbXAgb3BlcmF0aW9uIChOTEFfVTMyOiBuZnRfY21wX29wcykKKyAqIEBORlRBX1JBTkdFX0ZST01fREFUQTogZGF0YSByYW5nZSBmcm9tIChOTEFfTkVTVEVEOiBuZnRfZGF0YV9hdHRyaWJ1dGVzKQorICogQE5GVEFfUkFOR0VfVE9fREFUQTogZGF0YSByYW5nZSB0byAoTkxBX05FU1RFRDogbmZ0X2RhdGFfYXR0cmlidXRlcykKKyAqLworZW51bSBuZnRfcmFuZ2VfYXR0cmlidXRlcyB7CisJTkZUQV9SQU5HRV9VTlNQRUMsCisJTkZUQV9SQU5HRV9TUkVHLAorCU5GVEFfUkFOR0VfT1AsCisJTkZUQV9SQU5HRV9GUk9NX0RBVEEsCisJTkZUQV9SQU5HRV9UT19EQVRBLAorCV9fTkZUQV9SQU5HRV9NQVgKK307CisjZGVmaW5lIE5GVEFfUkFOR0VfTUFYCQkoX19ORlRBX1JBTkdFX01BWCAtIDEpCisKIGVudW0gbmZ0X2xvb2t1cF9mbGFncyB7CiAJTkZUX0xPT0tVUF9GX0lOViA9ICgxIDw8IDApLAogfTsKQEAgLTU3NSw2ICs2MDQsMTAgQEAKIAlORlRfRFlOU0VUX09QX1VQREFURSwKIH07CiAKK2VudW0gbmZ0X2R5bnNldF9mbGFncyB7CisJTkZUX0RZTlNFVF9GX0lOVgk9ICgxIDw8IDApLAorfTsKKwogLyoqCiAgKiBlbnVtIG5mdF9keW5zZXRfYXR0cmlidXRlcyAtIGR5bnNldCBleHByZXNzaW9uIGF0dHJpYnV0ZXMKICAqCkBAIC01ODUsNiArNjE4LDcgQEAKICAqIEBORlRBX0RZTlNFVF9TUkVHX0RBVEE6IHNvdXJjZSByZWdpc3RlciBvZiB0aGUgZGF0YSAoTkxBX1UzMikKICAqIEBORlRBX0RZTlNFVF9USU1FT1VUOiB0aW1lb3V0IHZhbHVlIGZvciB0aGUgbmV3IGVsZW1lbnQgKE5MQV9VNjQpCiAgKiBATkZUQV9EWU5TRVRfRVhQUjogZXhwcmVzc2lvbiAoTkxBX05FU1RFRDogbmZ0X2V4cHJfYXR0cmlidXRlcykKKyAqIEBORlRBX0RZTlNFVF9GTEFHUzogZmxhZ3MgKE5MQV9VMzIpCiAgKi8KIGVudW0gbmZ0X2R5bnNldF9hdHRyaWJ1dGVzIHsKIAlORlRBX0RZTlNFVF9VTlNQRUMsCkBAIC01OTYsNiArNjMwLDcgQEAKIAlORlRBX0RZTlNFVF9USU1FT1VULAogCU5GVEFfRFlOU0VUX0VYUFIsCiAJTkZUQV9EWU5TRVRfUEFELAorCU5GVEFfRFlOU0VUX0ZMQUdTLAogCV9fTkZUQV9EWU5TRVRfTUFYLAogfTsKICNkZWZpbmUgTkZUQV9EWU5TRVRfTUFYCQkoX19ORlRBX0RZTlNFVF9NQVggLSAxKQpAQCAtNzI0LDYgKzc1OSwyOCBAQAogfTsKIAogLyoqCisgKiBlbnVtIG5mdF9oYXNoX2F0dHJpYnV0ZXMgLSBuZl90YWJsZXMgaGFzaCBleHByZXNzaW9uIG5ldGxpbmsgYXR0cmlidXRlcworICoKKyAqIEBORlRBX0hBU0hfU1JFRzogc291cmNlIHJlZ2lzdGVyIChOTEFfVTMyKQorICogQE5GVEFfSEFTSF9EUkVHOiBkZXN0aW5hdGlvbiByZWdpc3RlciAoTkxBX1UzMikKKyAqIEBORlRBX0hBU0hfTEVOOiBzb3VyY2UgZGF0YSBsZW5ndGggKE5MQV9VMzIpCisgKiBATkZUQV9IQVNIX01PRFVMVVM6IG1vZHVsdXMgdmFsdWUgKE5MQV9VMzIpCisgKiBATkZUQV9IQVNIX1NFRUQ6IHNlZWQgdmFsdWUgKE5MQV9VMzIpCisgKiBATkZUQV9IQVNIX09GRlNFVDogYWRkIHRoaXMgb2Zmc2V0IHZhbHVlIHRvIGhhc2ggcmVzdWx0IChOTEFfVTMyKQorICovCitlbnVtIG5mdF9oYXNoX2F0dHJpYnV0ZXMgeworCU5GVEFfSEFTSF9VTlNQRUMsCisJTkZUQV9IQVNIX1NSRUcsCisJTkZUQV9IQVNIX0RSRUcsCisJTkZUQV9IQVNIX0xFTiwKKwlORlRBX0hBU0hfTU9EVUxVUywKKwlORlRBX0hBU0hfU0VFRCwKKwlORlRBX0hBU0hfT0ZGU0VULAorCV9fTkZUQV9IQVNIX01BWCwKK307CisjZGVmaW5lIE5GVEFfSEFTSF9NQVgJKF9fTkZUQV9IQVNIX01BWCAtIDEpCisKKy8qKgogICogZW51bSBuZnRfbWV0YV9hdHRyaWJ1dGVzIC0gbmZfdGFibGVzIG1ldGEgZXhwcmVzc2lvbiBuZXRsaW5rIGF0dHJpYnV0ZXMKICAqCiAgKiBATkZUQV9NRVRBX0RSRUc6IGRlc3RpbmF0aW9uIHJlZ2lzdGVyIChOTEFfVTMyKQpAQCAtODY2LDEyICs5MjMsMTQgQEAKICAqIEBORlRBX1FVRVVFX05VTTogbmV0bGluayBxdWV1ZSB0byBzZW5kIG1lc3NhZ2VzIHRvIChOTEFfVTE2KQogICogQE5GVEFfUVVFVUVfVE9UQUw6IG51bWJlciBvZiBxdWV1ZXMgdG8gbG9hZCBiYWxhbmNlIHBhY2tldHMgb24gKE5MQV9VMTYpCiAgKiBATkZUQV9RVUVVRV9GTEFHUzogdmFyaW91cyBmbGFncyAoTkxBX1UxNikKKyAqIEBORlRBX1FVRVVFX1NSRUdfUU5VTTogc291cmNlIHJlZ2lzdGVyIG9mIHF1ZXVlIG51bWJlciAoTkxBX1UzMjogbmZ0X3JlZ2lzdGVycykKICAqLwogZW51bSBuZnRfcXVldWVfYXR0cmlidXRlcyB7CiAJTkZUQV9RVUVVRV9VTlNQRUMsCiAJTkZUQV9RVUVVRV9OVU0sCiAJTkZUQV9RVUVVRV9UT1RBTCwKIAlORlRBX1FVRVVFX0ZMQUdTLAorCU5GVEFfUVVFVUVfU1JFR19RTlVNLAogCV9fTkZUQV9RVUVVRV9NQVgKIH07CiAjZGVmaW5lIE5GVEFfUVVFVUVfTUFYCQkoX19ORlRBX1FVRVVFX01BWCAtIDEpCkBAIC04ODAsNiArOTM5LDI1IEBACiAjZGVmaW5lIE5GVF9RVUVVRV9GTEFHX0NQVV9GQU5PVVQJMHgwMiAvKiB1c2UgY3VycmVudCBDUFUgKG5vIGhhc2hpbmcpICovCiAjZGVmaW5lIE5GVF9RVUVVRV9GTEFHX01BU0sJCTB4MDMKIAorZW51bSBuZnRfcXVvdGFfZmxhZ3MgeworCU5GVF9RVU9UQV9GX0lOVgkJPSAoMSA8PCAwKSwKK307CisKKy8qKgorICogZW51bSBuZnRfcXVvdGFfYXR0cmlidXRlcyAtIG5mX3RhYmxlcyBxdW90YSBleHByZXNzaW9uIG5ldGxpbmsgYXR0cmlidXRlcworICoKKyAqIEBORlRBX1FVT1RBX0JZVEVTOiBxdW90YSBpbiBieXRlcyAoTkxBX1UxNikKKyAqIEBORlRBX1FVT1RBX0ZMQUdTOiBmbGFncyAoTkxBX1UzMikKKyAqLworZW51bSBuZnRfcXVvdGFfYXR0cmlidXRlcyB7CisJTkZUQV9RVU9UQV9VTlNQRUMsCisJTkZUQV9RVU9UQV9CWVRFUywKKwlORlRBX1FVT1RBX0ZMQUdTLAorCU5GVEFfUVVPVEFfUEFELAorCV9fTkZUQV9RVU9UQV9NQVgKK307CisjZGVmaW5lIE5GVEFfUVVPVEFfTUFYCQkoX19ORlRBX1FVT1RBX01BWCAtIDEpCisKIC8qKgogICogZW51bSBuZnRfcmVqZWN0X3R5cGVzIC0gbmZfdGFibGVzIHJlamVjdCBleHByZXNzaW9uIHJlamVjdCB0eXBlcwogICoKQEAgLTEwNTEsNyArMTEyOSw3IEBACiAgKiBATkZUQV9UUkFDRV9ORlBST1RPOiBuZiBwcm90b2NvbCBwcm9jZXNzZWQgKE5MQV9VMzIpCiAgKiBATkZUQV9UUkFDRV9QT0xJQ1k6IHBvbGljeSB0aGF0IGRlY2lkZWQgZmF0ZSBvZiBwYWNrZXQgKE5MQV9VMzIpCiAgKi8KLWVudW0gbmZ0X3RyYWNlX2F0dGlidXRlcyB7CitlbnVtIG5mdF90cmFjZV9hdHRyaWJ1dGVzIHsKIAlORlRBX1RSQUNFX1VOU1BFQywKIAlORlRBX1RSQUNFX1RBQkxFLAogCU5GVEFfVFJBQ0VfQ0hBSU4sCkBAIC0xMDgyLDQgKzExNjAsMzAgQEAKIAlfX05GVF9UUkFDRVRZUEVfTUFYCiB9OwogI2RlZmluZSBORlRfVFJBQ0VUWVBFX01BWCAoX19ORlRfVFJBQ0VUWVBFX01BWCAtIDEpCisKKy8qKgorICogZW51bSBuZnRfbmdfYXR0cmlidXRlcyAtIG5mX3RhYmxlcyBudW1iZXIgZ2VuZXJhdG9yIGV4cHJlc3Npb24gbmV0bGluayBhdHRyaWJ1dGVzCisgKgorICogQE5GVEFfTkdfRFJFRzogZGVzdGluYXRpb24gcmVnaXN0ZXIgKE5MQV9VMzIpCisgKiBATkZUQV9OR19NT0RVTFVTOiBtYXhpbXVtIGNvdW50ZXIgdmFsdWUgKE5MQV9VMzIpCisgKiBATkZUQV9OR19UWVBFOiBvcGVyYXRpb24gdHlwZSAoTkxBX1UzMikKKyAqIEBORlRBX05HX09GRlNFVDogb2Zmc2V0IHRvIGJlIGFkZGVkIHRvIHRoZSBjb3VudGVyIChOTEFfVTMyKQorICovCitlbnVtIG5mdF9uZ19hdHRyaWJ1dGVzIHsKKwlORlRBX05HX1VOU1BFQywKKwlORlRBX05HX0RSRUcsCisJTkZUQV9OR19NT0RVTFVTLAorCU5GVEFfTkdfVFlQRSwKKwlORlRBX05HX09GRlNFVCwKKwlfX05GVEFfTkdfTUFYCit9OworI2RlZmluZSBORlRBX05HX01BWAkoX19ORlRBX05HX01BWCAtIDEpCisKK2VudW0gbmZ0X25nX3R5cGVzIHsKKwlORlRfTkdfSU5DUkVNRU5UQUwsCisJTkZUX05HX1JBTkRPTSwKKwlfX05GVF9OR19NQVgKK307CisjZGVmaW5lIE5GVF9OR19NQVgJKF9fTkZUX05HX01BWCAtIDEpCisKICNlbmRpZiAvKiBfTElOVVhfTkZfVEFCTEVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2Nvbm50cmFjay5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfY29ubnRyYWNrLmgKaW5kZXggOWRmNzg5NzAuLjZkZWI4ODYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2Nvbm50cmFjay5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2Nvbm50cmFjay5oCkBAIC0yMzEsMTMgKzIzMSwxMyBAQAogCiBlbnVtIGN0YXR0cl9zdGF0c19jcHUgewogCUNUQV9TVEFUU19VTlNQRUMsCi0JQ1RBX1NUQVRTX1NFQVJDSEVELAorCUNUQV9TVEFUU19TRUFSQ0hFRCwJLyogbm8gbG9uZ2VyIHVzZWQgKi8KIAlDVEFfU1RBVFNfRk9VTkQsCi0JQ1RBX1NUQVRTX05FVywKKwlDVEFfU1RBVFNfTkVXLAkJLyogbm8gbG9uZ2VyIHVzZWQgKi8KIAlDVEFfU1RBVFNfSU5WQUxJRCwKIAlDVEFfU1RBVFNfSUdOT1JFLAotCUNUQV9TVEFUU19ERUxFVEUsCi0JQ1RBX1NUQVRTX0RFTEVURV9MSVNULAorCUNUQV9TVEFUU19ERUxFVEUsCS8qIG5vIGxvbmdlciB1c2VkICovCisJQ1RBX1NUQVRTX0RFTEVURV9MSVNULAkvKiBubyBsb25nZXIgdXNlZCAqLwogCUNUQV9TVEFUU19JTlNFUlQsCiAJQ1RBX1NUQVRTX0lOU0VSVF9GQUlMRUQsCiAJQ1RBX1NUQVRTX0RST1AsCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbmV0ZmlsdGVyL3h0X2hhc2hsaW1pdC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L25ldGZpbHRlci94dF9oYXNobGltaXQuaAppbmRleCA2ZGI5MDM3Li4zZWZjMGNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvbmV0ZmlsdGVyL3h0X2hhc2hsaW1pdC5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0LmgKQEAgLTYsNiArNiw3IEBACiAKIC8qIHRpbWluZ3MgYXJlIGluIG1pbGxpc2Vjb25kcy4gKi8KICNkZWZpbmUgWFRfSEFTSExJTUlUX1NDQUxFIDEwMDAwCisjZGVmaW5lIFhUX0hBU0hMSU1JVF9TQ0FMRV92MiAxMDAwMDAwbGx1CiAvKiAxLzEwLDAwMCBzZWMgcGVyaW9kID0+IG1heCBvZiAxMCwwMDAvc2VjLiAgTWluIHJhdGUgaXMgdGhlbiA0Mjk0OTAKICAqIHNlY29uZHMsIG9yIG9uZSBwYWNrZXQgZXZlcnkgNTkgaG91cnMuCiAgKi8KQEAgLTYzLDYgKzY0LDIwIEBACiAJX191OCBzcmNtYXNrLCBkc3RtYXNrOwogfTsKIAorc3RydWN0IGhhc2hsaW1pdF9jZmcyIHsKKwlfX3U2NCBhdmc7CQkvKiBBdmVyYWdlIHNlY3MgYmV0d2VlbiBwYWNrZXRzICogc2NhbGUgKi8KKwlfX3U2NCBidXJzdDsJCS8qIFBlcmlvZCBtdWx0aXBsaWVyIGZvciB1cHBlciBsaW1pdC4gKi8KKwlfX3UzMiBtb2RlOwkJLyogYml0bWFzayBvZiBYVF9IQVNITElNSVRfSEFTSF8qICovCisKKwkvKiB1c2VyIHNwZWNpZmllZCAqLworCV9fdTMyIHNpemU7CQkvKiBob3cgbWFueSBidWNrZXRzICovCisJX191MzIgbWF4OwkJLyogbWF4IG51bWJlciBvZiBlbnRyaWVzICovCisJX191MzIgZ2NfaW50ZXJ2YWw7CS8qIGdjIGludGVydmFsICovCisJX191MzIgZXhwaXJlOwkJLyogd2hlbiBkbyBlbnRyaWVzIGV4cGlyZT8gKi8KKworCV9fdTggc3JjbWFzaywgZHN0bWFzazsKK307CisKIHN0cnVjdCB4dF9oYXNobGltaXRfbXRpbmZvMSB7CiAJY2hhciBuYW1lW0lGTkFNU0laXTsKIAlzdHJ1Y3QgaGFzaGxpbWl0X2NmZzEgY2ZnOwpAQCAtNzEsNCArODYsMTIgQEAKIAlzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaGluZm8gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOwogfTsKIAorc3RydWN0IHh0X2hhc2hsaW1pdF9tdGluZm8yIHsKKwljaGFyIG5hbWVbTkFNRV9NQVhdOworCXN0cnVjdCBoYXNobGltaXRfY2ZnMiBjZmc7CisKKwkvKiBVc2VkIGludGVybmFsbHkgYnkgdGhlIGtlcm5lbCAqLworCXN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlICpoaW5mbyBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7Cit9OworCiAjZW5kaWYgLyogX1VBUElfWFRfSEFTSExJTUlUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9ubDgwMjExLmggYi9pbmNsdWRlL3VhcGkvbGludXgvbmw4MDIxMS5oCmluZGV4IDIyMDY5NDEuLjU2MzY4ZTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9ubDgwMjExLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L25sODAyMTEuaApAQCAtNDgsNiArNDgsNyBAQAogI2RlZmluZSBOTDgwMjExX01VTFRJQ0FTVF9HUk9VUF9SRUcJCSJyZWd1bGF0b3J5IgogI2RlZmluZSBOTDgwMjExX01VTFRJQ0FTVF9HUk9VUF9NTE1FCQkibWxtZSIKICNkZWZpbmUgTkw4MDIxMV9NVUxUSUNBU1RfR1JPVVBfVkVORE9SCQkidmVuZG9yIgorI2RlZmluZSBOTDgwMjExX01VTFRJQ0FTVF9HUk9VUF9OQU4JCSJuYW4iCiAjZGVmaW5lIE5MODAyMTFfTVVMVElDQVNUX0dST1VQX1RFU1RNT0RFCSJ0ZXN0bW9kZSIKIAogLyoqCkBAIC04MzgsNiArODM5LDQxIEBACiAgKglub3QgcnVubmluZy4gVGhlIGRyaXZlciBpbmRpY2F0ZXMgdGhlIHN0YXR1cyBvZiB0aGUgc2NhbiB0aHJvdWdoCiAgKgljZmc4MDIxMV9zY2FuX2RvbmUoKS4KICAqCisgKiBATkw4MDIxMV9DTURfU1RBUlRfTkFOOiBTdGFydCBOQU4gb3BlcmF0aW9uLCBpZGVudGlmaWVkIGJ5IGl0cworICoJJU5MODAyMTFfQVRUUl9XREVWIGludGVyZmFjZS4gVGhpcyBpbnRlcmZhY2UgbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseQorICoJY3JlYXRlZCB3aXRoICVOTDgwMjExX0NNRF9ORVdfSU5URVJGQUNFLiBBZnRlciBpdCBoYXMgYmVlbiBzdGFydGVkLCB0aGUKKyAqCU5BTiBpbnRlcmZhY2Ugd2lsbCBjcmVhdGUgb3Igam9pbiBhIGNsdXN0ZXIuIFRoaXMgY29tbWFuZCBtdXN0IGhhdmUgYQorICoJdmFsaWQgJU5MODAyMTFfQVRUUl9OQU5fTUFTVEVSX1BSRUYgYXR0cmlidXRlIGFuZCBvcHRpb25hbAorICoJJU5MODAyMTFfQVRUUl9OQU5fRFVBTCBhdHRyaWJ1dGVzLgorICoJQWZ0ZXIgdGhpcyBjb21tYW5kIE5BTiBmdW5jdGlvbnMgY2FuIGJlIGFkZGVkLgorICogQE5MODAyMTFfQ01EX1NUT1BfTkFOOiBTdG9wIHRoZSBOQU4gb3BlcmF0aW9uLCBpZGVudGlmaWVkIGJ5CisgKglpdHMgJU5MODAyMTFfQVRUUl9XREVWIGludGVyZmFjZS4KKyAqIEBOTDgwMjExX0NNRF9BRERfTkFOX0ZVTkNUSU9OOiBBZGQgYSBOQU4gZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkCisgKgl3aXRoICVOTDgwMjExX0FUVFJfTkFOX0ZVTkMgbmVzdGVkIGF0dHJpYnV0ZS4gV2hlbiBjYWxsZWQsIHRoaXMKKyAqCW9wZXJhdGlvbiByZXR1cm5zIHRoZSBzdHJpY3RseSBwb3NpdGl2ZSBhbmQgdW5pcXVlIGluc3RhbmNlIGlkCisgKgkoJU5MODAyMTFfQVRUUl9OQU5fRlVOQ19JTlNUX0lEKSBhbmQgYSBjb29raWUgKCVOTDgwMjExX0FUVFJfQ09PS0lFKQorICoJb2YgdGhlIGZ1bmN0aW9uIHVwb24gc3VjY2Vzcy4KKyAqCVNpbmNlIGluc3RhbmNlIElEJ3MgY2FuIGJlIHJlLXVzZWQsIHRoaXMgY29va2llIGlzIHRoZSByaWdodAorICoJd2F5IHRvIGlkZW50aWZ5IHRoZSBmdW5jdGlvbi4gVGhpcyB3aWxsIGF2b2lkIHJhY2VzIHdoZW4gYSB0ZXJtaW5hdGlvbgorICoJZXZlbnQgaXMgaGFuZGxlZCBieSB0aGUgdXNlciBzcGFjZSBhZnRlciBpdCBoYXMgYWxyZWFkeSBhZGRlZCBhIG5ldworICoJZnVuY3Rpb24gdGhhdCBnb3QgdGhlIHNhbWUgaW5zdGFuY2UgaWQgZnJvbSB0aGUga2VybmVsIGFzIHRoZSBvbmUKKyAqCXdoaWNoIGp1c3QgdGVybWluYXRlZC4KKyAqCVRoaXMgY29va2llIG1heSBiZSB1c2VkIGluIE5BTiBldmVudHMgZXZlbiBiZWZvcmUgdGhlIGNvbW1hbmQKKyAqCXJldHVybnMsIHNvIHVzZXJzcGFjZSBzaG91bGRuJ3QgcHJvY2VzcyBOQU4gZXZlbnRzIHVudGlsIGl0IHByb2Nlc3NlcworICoJdGhlIHJlc3BvbnNlIHRvIHRoaXMgY29tbWFuZC4KKyAqCUxvb2sgYXQgJU5MODAyMTFfQVRUUl9TT0NLRVRfT1dORVIgYXMgd2VsbC4KKyAqIEBOTDgwMjExX0NNRF9ERUxfTkFOX0ZVTkNUSU9OOiBEZWxldGUgYSBOQU4gZnVuY3Rpb24gYnkgY29va2llLgorICoJVGhpcyBjb21tYW5kIGlzIGFsc28gdXNlZCBhcyBhIG5vdGlmaWNhdGlvbiBzZW50IHdoZW4gYSBOQU4gZnVuY3Rpb24gaXMKKyAqCXRlcm1pbmF0ZWQuIFRoaXMgd2lsbCBjb250YWluIGEgJU5MODAyMTFfQVRUUl9OQU5fRlVOQ19JTlNUX0lECisgKglhbmQgJU5MODAyMTFfQVRUUl9DT09LSUUgYXR0cmlidXRlcy4KKyAqIEBOTDgwMjExX0NNRF9DSEFOR0VfTkFOX0NPTkZJRzogQ2hhbmdlIGN1cnJlbnQgTkFOIGNvbmZpZ3VyYXRpb24uIE5BTgorICoJbXVzdCBiZSBvcGVyYXRpb25hbCAoJU5MODAyMTFfQ01EX1NUQVJUX05BTiB3YXMgZXhlY3V0ZWQpLgorICoJSXQgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CisgKgklTkw4MDIxMV9BVFRSX05BTl9NQVNURVJfUFJFRiwgJU5MODAyMTFfQVRUUl9OQU5fRFVBTC4KKyAqIEBOTDgwMjExX0NNRF9OQU5fRlVOQ19NQVRDSDogTm90aWZpY2F0aW9uIHNlbnQgd2hlbiBhIG1hdGNoIGlzIHJlcG9ydGVkLgorICoJVGhpcyB3aWxsIGNvbnRhaW4gYSAlTkw4MDIxMV9BVFRSX05BTl9NQVRDSCBuZXN0ZWQgYXR0cmlidXRlIGFuZAorICoJJU5MODAyMTFfQVRUUl9DT09LSUUuCisgKgogICogQE5MODAyMTFfQ01EX01BWDogaGlnaGVzdCB1c2VkIGNvbW1hbmQgbnVtYmVyCiAgKiBAX19OTDgwMjExX0NNRF9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKICAqLwpAQCAtMTAyNiw2ICsxMDYyLDEzIEBACiAKIAlOTDgwMjExX0NNRF9BQk9SVF9TQ0FOLAogCisJTkw4MDIxMV9DTURfU1RBUlRfTkFOLAorCU5MODAyMTFfQ01EX1NUT1BfTkFOLAorCU5MODAyMTFfQ01EX0FERF9OQU5fRlVOQ1RJT04sCisJTkw4MDIxMV9DTURfREVMX05BTl9GVU5DVElPTiwKKwlOTDgwMjExX0NNRF9DSEFOR0VfTkFOX0NPTkZJRywKKwlOTDgwMjExX0NNRF9OQU5fTUFUQ0gsCisKIAkvKiBhZGQgbmV3IGNvbW1hbmRzIGFib3ZlIGhlcmUgKi8KIAogCS8qIHVzZWQgdG8gZGVmaW5lIE5MODAyMTFfQ01EX01BWCBiZWxvdyAqLwpAQCAtMTM0Myw3ICsxMzg2LDEzIEBACiAgKgllbnVtIG5sODAyMTFfYmFuZCB2YWx1ZSBpcyB1c2VkIGFzIHRoZSBpbmRleCAobmxhX3R5cGUoKSBvZiB0aGUgbmVzdGVkCiAgKglkYXRhLiBJZiBhIGJhbmQgaXMgbm90IGluY2x1ZGVkLCBpdCB3aWxsIGJlIGNvbmZpZ3VyZWQgdG8gYWxsb3cgYWxsCiAgKglyYXRlcyBiYXNlZCBvbiBuZWdvdGlhdGVkIHN1cHBvcnRlZCByYXRlcyBpbmZvcm1hdGlvbi4gVGhpcyBhdHRyaWJ1dGUKLSAqCWlzIHVzZWQgd2l0aCAlTkw4MDIxMV9DTURfU0VUX1RYX0JJVFJBVEVfTUFTSy4KKyAqCWlzIHVzZWQgd2l0aCAlTkw4MDIxMV9DTURfU0VUX1RYX0JJVFJBVEVfTUFTSyBhbmQgd2l0aCBzdGFydGluZyBBUCwKKyAqCWFuZCBqb2luaW5nIG1lc2ggbmV0d29ya3MgKG5vdCBJQlNTIHlldCkuIEluIHRoZSBsYXRlciBjYXNlLCBpdCBtdXN0CisgKglzcGVjaWZ5IGp1c3QgYSBzaW5nbGUgYml0cmF0ZSwgd2hpY2ggaXMgdG8gYmUgdXNlZCBmb3IgdGhlIGJlYWNvbi4KKyAqCVRoZSBkcml2ZXIgbXVzdCBhbHNvIHNwZWNpZnkgc3VwcG9ydCBmb3IgdGhpcyB3aXRoIHRoZSBleHRlbmRlZAorICoJZmVhdHVyZXMgTkw4MDIxMV9FWFRfRkVBVFVSRV9CRUFDT05fUkFURV9MRUdBQ1ksCisgKglOTDgwMjExX0VYVF9GRUFUVVJFX0JFQUNPTl9SQVRFX0hUIGFuZAorICoJTkw4MDIxMV9FWFRfRkVBVFVSRV9CRUFDT05fUkFURV9WSFQuCiAgKgogICogQE5MODAyMTFfQVRUUl9GUkFNRV9NQVRDSDogQSBiaW5hcnkgYXR0cmlidXRlIHdoaWNoIHR5cGljYWxseSBtdXN0IGNvbnRhaW4KICAqCWF0IGxlYXN0IG9uZSBieXRlLCBjdXJyZW50bHkgdXNlZCB3aXRoIEBOTDgwMjExX0NNRF9SRUdJU1RFUl9GUkFNRS4KQEAgLTE3MzMsNiArMTc4MiwxMiBAQAogICoJcmVndWxhdG9yeSBpbmRvb3IgY29uZmlndXJhdGlvbiB3b3VsZCBiZSBvd25lZCBieSB0aGUgbmV0bGluayBzb2NrZXQKICAqCXRoYXQgY29uZmlndXJlZCB0aGUgaW5kb29yIHNldHRpbmcsIGFuZCB0aGUgaW5kb29yIG9wZXJhdGlvbiB3b3VsZCBiZQogICoJY2xlYXJlZCB3aGVuIHRoZSBzb2NrZXQgaXMgY2xvc2VkLgorICoJSWYgc2V0IGR1cmluZyBOQU4gaW50ZXJmYWNlIGNyZWF0aW9uLCB0aGUgaW50ZXJmYWNlIHdpbGwgYmUgZGVzdHJveWVkCisgKglpZiB0aGUgc29ja2V0IGlzIGNsb3NlZCBqdXN0IGxpa2UgYW55IG90aGVyIGludGVyZmFjZS4gTW9yZW92ZXIsIG9ubHkKKyAqCXRoZSBuZXRsaW5rIHNvY2tldCB0aGF0IGNyZWF0ZWQgdGhlIGludGVyZmFjZSB3aWxsIGJlIGFsbG93ZWQgdG8gYWRkCisgKglhbmQgcmVtb3ZlIGZ1bmN0aW9ucy4gTkFOIG5vdGlmaWNhdGlvbnMgd2lsbCBiZSBzZW50IGluIHVuaWNhc3QgdG8gdGhhdAorICoJc29ja2V0LiBXaXRob3V0IHRoaXMgYXR0cmlidXRlLCBhbnkgc29ja2V0IGNhbiBhZGQgZnVuY3Rpb25zIGFuZCB0aGUKKyAqCW5vdGlmaWNhdGlvbnMgd2lsbCBiZSBzZW50IHRvIHRoZSAlTkw4MDIxMV9NQ0dSUF9OQU4gbXVsdGljYXN0IGdyb3VwLgogICoKICAqIEBOTDgwMjExX0FUVFJfVERMU19JTklUSUFUT1I6IGZsYWcgYXR0cmlidXRlIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgZW5kIGlzCiAgKgl0aGUgVERMUyBsaW5rIGluaXRpYXRvci4KQEAgLTE4NjcsNiArMTkyMiwyMSBAQAogICogQE5MODAyMTFfQVRUUl9NRVNIX1BFRVJfQUlEOiBBc3NvY2lhdGlvbiBJRCBmb3IgdGhlIG1lc2ggcGVlciAodTE2KS4gVGhpcyBpcwogICoJdXNlZCB0byBwdWxsIHRoZSBzdG9yZWQgZGF0YSBmb3IgbWVzaCBwZWVyIGluIHBvd2VyIHNhdmUgc3RhdGUuCiAgKgorICogQE5MODAyMTFfQVRUUl9OQU5fTUFTVEVSX1BSRUY6IHRoZSBtYXN0ZXIgcHJlZmVyZW5jZSB0byBiZSB1c2VkIGJ5CisgKgklTkw4MDIxMV9DTURfU1RBUlRfTkFOIGFuZCBvcHRpb25hbGx5IHdpdGgKKyAqCSVOTDgwMjExX0NNRF9DSEFOR0VfTkFOX0NPTkZJRy4gSXRzIHR5cGUgaXMgdTggYW5kIGl0IGNhbid0IGJlIDAuCisgKglBbHNvLCB2YWx1ZXMgMSBhbmQgMjU1IGFyZSByZXNlcnZlZCBmb3IgY2VydGlmaWNhdGlvbiBwdXJwb3NlcyBhbmQKKyAqCXNob3VsZCBub3QgYmUgdXNlZCBkdXJpbmcgYSBub3JtYWwgZGV2aWNlIG9wZXJhdGlvbi4KKyAqIEBOTDgwMjExX0FUVFJfTkFOX0RVQUw6IE5BTiBkdWFsIGJhbmQgb3BlcmF0aW9uIGNvbmZpZyAoc2VlCisgKgkmZW51bSBubDgwMjExX25hbl9kdWFsX2JhbmRfY29uZikuIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgd2l0aAorICoJJU5MODAyMTFfQ01EX1NUQVJUX05BTiBhbmQgb3B0aW9uYWxseSB3aXRoCisgKgklTkw4MDIxMV9DTURfQ0hBTkdFX05BTl9DT05GSUcuCisgKiBATkw4MDIxMV9BVFRSX05BTl9GVU5DOiBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFkZGVkIHRvIE5BTi4gU2VlCisgKgkmZW51bSBubDgwMjExX25hbl9mdW5jX2F0dHJpYnV0ZXMgZm9yIGRlc2NyaXB0aW9uIG9mIHRoaXMgbmVzdGVkCisgKglhdHRyaWJ1dGUuCisgKiBATkw4MDIxMV9BVFRSX05BTl9NQVRDSDogdXNlZCB0byByZXBvcnQgYSBtYXRjaC4gVGhpcyBpcyBhIG5lc3RlZCBhdHRyaWJ1dGUuCisgKglTZWUgJmVudW0gbmw4MDIxMV9uYW5fbWF0Y2hfYXR0cmlidXRlcy4KKyAqCiAgKiBATlVNX05MODAyMTFfQVRUUjogdG90YWwgbnVtYmVyIG9mIG5sODAyMTFfYXR0cnMgYXZhaWxhYmxlCiAgKiBATkw4MDIxMV9BVFRSX01BWDogaGlnaGVzdCBhdHRyaWJ1dGUgbnVtYmVyIGN1cnJlbnRseSBkZWZpbmVkCiAgKiBAX19OTDgwMjExX0FUVFJfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCkBAIC0yMjYxLDYgKzIzMzEsMTEgQEAKIAogCU5MODAyMTFfQVRUUl9NRVNIX1BFRVJfQUlELAogCisJTkw4MDIxMV9BVFRSX05BTl9NQVNURVJfUFJFRiwKKwlOTDgwMjExX0FUVFJfTkFOX0RVQUwsCisJTkw4MDIxMV9BVFRSX05BTl9GVU5DLAorCU5MODAyMTFfQVRUUl9OQU5fTUFUQ0gsCisKIAkvKiBhZGQgYXR0cmlidXRlcyBoZXJlLCB1cGRhdGUgdGhlIHBvbGljeSBpbiBubDgwMjExLmMgKi8KIAogCV9fTkw4MDIxMV9BVFRSX0FGVEVSX0xBU1QsCkBAIC0yMzM5LDYgKzI0MTQsNyBAQAogICoJY29tbWFuZHMgdG8gY3JlYXRlIGFuZCBkZXN0cm95IG9uZQogICogQE5MODAyMTFfSUZfVFlQRV9PQ0I6IE91dHNpZGUgQ29udGV4dCBvZiBhIEJTUwogICoJVGhpcyBtb2RlIGNvcnJlc3BvbmRzIHRvIHRoZSBNSUIgdmFyaWFibGUgZG90MTFPQ0JBY3RpdmF0ZWQ9dHJ1ZQorICogQE5MODAyMTFfSUZUWVBFX05BTjogTkFOIGRldmljZSBpbnRlcmZhY2UgdHlwZSAobm90IGEgbmV0ZGV2KQogICogQE5MODAyMTFfSUZUWVBFX01BWDogaGlnaGVzdCBpbnRlcmZhY2UgdHlwZSBudW1iZXIgY3VycmVudGx5IGRlZmluZWQKICAqIEBOVU1fTkw4MDIxMV9JRlRZUEVTOiBudW1iZXIgb2YgZGVmaW5lZCBpbnRlcmZhY2UgdHlwZXMKICAqCkBAIC0yMzU5LDYgKzI0MzUsNyBAQAogCU5MODAyMTFfSUZUWVBFX1AyUF9HTywKIAlOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFLAogCU5MODAyMTFfSUZUWVBFX09DQiwKKwlOTDgwMjExX0lGVFlQRV9OQU4sCiAKIAkvKiBrZWVwIGxhc3QgKi8KIAlOVU1fTkw4MDIxMV9JRlRZUEVTLApAQCAtNDU1MSw2ICs0NjI4LDEyIEBACiAgKgkoaWYgYXZhaWxhYmxlKS4KICAqIEBOTDgwMjExX0VYVF9GRUFUVVJFX1NFVF9TQ0FOX0RXRUxMOiBUaGlzIGRyaXZlciBzdXBwb3J0cyBjb25maWd1cmF0aW9uIG9mCiAgKgljaGFubmVsIGR3ZWxsIHRpbWUuCisgKiBATkw4MDIxMV9FWFRfRkVBVFVSRV9CRUFDT05fUkFURV9MRUdBQ1k6IERyaXZlciBzdXBwb3J0cyBiZWFjb24gcmF0ZQorICoJY29uZmlndXJhdGlvbiAoQVAvbWVzaCksIHN1cHBvcnRpbmcgYSBsZWdhY3kgKG5vbiBIVC9WSFQpIHJhdGUuCisgKiBATkw4MDIxMV9FWFRfRkVBVFVSRV9CRUFDT05fUkFURV9IVDogRHJpdmVyIHN1cHBvcnRzIGJlYWNvbiByYXRlCisgKgljb25maWd1cmF0aW9uIChBUC9tZXNoKSB3aXRoIEhUIHJhdGVzLgorICogQE5MODAyMTFfRVhUX0ZFQVRVUkVfQkVBQ09OX1JBVEVfVkhUOiBEcml2ZXIgc3VwcG9ydHMgYmVhY29uIHJhdGUKKyAqCWNvbmZpZ3VyYXRpb24gKEFQL21lc2gpIHdpdGggVkhUIHJhdGVzLgogICoKICAqIEBOVU1fTkw4MDIxMV9FWFRfRkVBVFVSRVM6IG51bWJlciBvZiBleHRlbmRlZCBmZWF0dXJlcy4KICAqIEBNQVhfTkw4MDIxMV9FWFRfRkVBVFVSRVM6IGhpZ2hlc3QgZXh0ZW5kZWQgZmVhdHVyZSBpbmRleC4KQEAgLTQ1NjIsNiArNDY0NSw5IEBACiAJTkw4MDIxMV9FWFRfRkVBVFVSRV9TQ0FOX1NUQVJUX1RJTUUsCiAJTkw4MDIxMV9FWFRfRkVBVFVSRV9CU1NfUEFSRU5UX1RTRiwKIAlOTDgwMjExX0VYVF9GRUFUVVJFX1NFVF9TQ0FOX0RXRUxMLAorCU5MODAyMTFfRVhUX0ZFQVRVUkVfQkVBQ09OX1JBVEVfTEVHQUNZLAorCU5MODAyMTFfRVhUX0ZFQVRVUkVfQkVBQ09OX1JBVEVfSFQsCisJTkw4MDIxMV9FWFRfRkVBVFVSRV9CRUFDT05fUkFURV9WSFQsCiAKIAkvKiBhZGQgbmV3IGZlYXR1cmVzIGJlZm9yZSB0aGUgZGVmaW5pdGlvbiBiZWxvdyAqLwogCU5VTV9OTDgwMjExX0VYVF9GRUFUVVJFUywKQEAgLTQ4NTUsNCArNDk0MSwxODYgQEAKIAlOTDgwMjExX0JTU19TRUxFQ1RfQVRUUl9NQVggPSBfX05MODAyMTFfQlNTX1NFTEVDVF9BVFRSX0FGVEVSX0xBU1QgLSAxCiB9OwogCisvKioKKyAqIGVudW0gbmw4MDIxMV9uYW5fZHVhbF9iYW5kX2NvbmYgLSBOQU4gZHVhbCBiYW5kIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBEZWZpbmVzIHRoZSBOQU4gZHVhbCBiYW5kIG1vZGUgb2Ygb3BlcmF0aW9uCisgKgorICogQE5MODAyMTFfTkFOX0JBTkRfREVGQVVMVDogZGV2aWNlIGRlZmF1bHQgbW9kZQorICogQE5MODAyMTFfTkFOX0JBTkRfMkdIWjogMi40R0h6IG1vZGUKKyAqIEBOTDgwMjExX05BTl9CQU5EXzVHSFo6IDVHSHogbW9kZQorICAqLworZW51bSBubDgwMjExX25hbl9kdWFsX2JhbmRfY29uZiB7CisJTkw4MDIxMV9OQU5fQkFORF9ERUZBVUxUCT0gMSA8PCAwLAorCU5MODAyMTFfTkFOX0JBTkRfMkdIWgkJPSAxIDw8IDEsCisJTkw4MDIxMV9OQU5fQkFORF81R0haCQk9IDEgPDwgMiwKK307CisKKy8qKgorICogZW51bSBubDgwMjExX25hbl9mdW5jdGlvbl90eXBlIC0gTkFOIGZ1bmN0aW9uIHR5cGUKKyAqCisgKiBEZWZpbmVzIHRoZSBmdW5jdGlvbiB0eXBlIG9mIGEgTkFOIGZ1bmN0aW9uCisgKgorICogQE5MODAyMTFfTkFOX0ZVTkNfUFVCTElTSDogZnVuY3Rpb24gaXMgcHVibGlzaAorICogQE5MODAyMTFfTkFOX0ZVTkNfU1VCU0NSSUJFOiBmdW5jdGlvbiBpcyBzdWJzY3JpYmUKKyAqIEBOTDgwMjExX05BTl9GVU5DX0ZPTExPV19VUDogZnVuY3Rpb24gaXMgZm9sbG93LXVwCisgKi8KK2VudW0gbmw4MDIxMV9uYW5fZnVuY3Rpb25fdHlwZSB7CisJTkw4MDIxMV9OQU5fRlVOQ19QVUJMSVNILAorCU5MODAyMTFfTkFOX0ZVTkNfU1VCU0NSSUJFLAorCU5MODAyMTFfTkFOX0ZVTkNfRk9MTE9XX1VQLAorCisJLyoga2VlcCBsYXN0ICovCisJX19OTDgwMjExX05BTl9GVU5DX1RZUEVfQUZURVJfTEFTVCwKKwlOTDgwMjExX05BTl9GVU5DX01BWF9UWVBFID0gX19OTDgwMjExX05BTl9GVU5DX1RZUEVfQUZURVJfTEFTVCAtIDEsCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9uYW5fcHVibGlzaF90eXBlIC0gTkFOIHB1Ymxpc2ggdHggdHlwZQorICoKKyAqIERlZmluZXMgaG93IHRvIHNlbmQgcHVibGlzaCBTZXJ2aWNlIERpc2NvdmVyeSBGcmFtZXMKKyAqCisgKiBATkw4MDIxMV9OQU5fU09MSUNJVEVEX1BVQkxJU0g6IHB1Ymxpc2ggZnVuY3Rpb24gaXMgc29saWNpdGVkCisgKiBATkw4MDIxMV9OQU5fVU5TT0xJQ0lURURfUFVCTElTSDogcHVibGlzaCBmdW5jdGlvbiBpcyB1bnNvbGljaXRlZAorICovCitlbnVtIG5sODAyMTFfbmFuX3B1Ymxpc2hfdHlwZSB7CisJTkw4MDIxMV9OQU5fU09MSUNJVEVEX1BVQkxJU0ggPSAxIDw8IDAsCisJTkw4MDIxMV9OQU5fVU5TT0xJQ0lURURfUFVCTElTSCA9IDEgPDwgMSwKK307CisKKy8qKgorICogZW51bSBubDgwMjExX25hbl9mdW5jX3Rlcm1fcmVhc29uIC0gTkFOIGZ1bmN0aW9ucyB0ZXJtaW5hdGlvbiByZWFzb24KKyAqCisgKiBEZWZpbmVzIHRlcm1pbmF0aW9uIHJlYXNvbnMgb2YgYSBOQU4gZnVuY3Rpb24KKyAqCisgKiBATkw4MDIxMV9OQU5fRlVOQ19URVJNX1JFQVNPTl9VU0VSX1JFUVVFU1Q6IHJlcXVlc3RlZCBieSB1c2VyCisgKiBATkw4MDIxMV9OQU5fRlVOQ19URVJNX1JFQVNPTl9UVExfRVhQSVJFRDogdGltZW91dAorICogQE5MODAyMTFfTkFOX0ZVTkNfVEVSTV9SRUFTT05fRVJST1I6IGVycm9yZWQKKyAqLworZW51bSBubDgwMjExX25hbl9mdW5jX3Rlcm1fcmVhc29uIHsKKwlOTDgwMjExX05BTl9GVU5DX1RFUk1fUkVBU09OX1VTRVJfUkVRVUVTVCwKKwlOTDgwMjExX05BTl9GVU5DX1RFUk1fUkVBU09OX1RUTF9FWFBJUkVELAorCU5MODAyMTFfTkFOX0ZVTkNfVEVSTV9SRUFTT05fRVJST1IsCit9OworCisjZGVmaW5lIE5MODAyMTFfTkFOX0ZVTkNfU0VSVklDRV9JRF9MRU4gNgorI2RlZmluZSBOTDgwMjExX05BTl9GVU5DX1NFUlZJQ0VfU1BFQ19JTkZPX01BWF9MRU4gMHhmZgorI2RlZmluZSBOTDgwMjExX05BTl9GVU5DX1NSRl9NQVhfTEVOIDB4ZmYKKworLyoqCisgKiBlbnVtIG5sODAyMTFfbmFuX2Z1bmNfYXR0cmlidXRlcyAtIE5BTiBmdW5jdGlvbiBhdHRyaWJ1dGVzCisgKiBAX19OTDgwMjExX05BTl9GVU5DX0lOVkFMSUQ6IGludmFsaWQKKyAqIEBOTDgwMjExX05BTl9GVU5DX1RZUEU6ICZlbnVtIG5sODAyMTFfbmFuX2Z1bmN0aW9uX3R5cGUgKHU4KS4KKyAqIEBOTDgwMjExX05BTl9GVU5DX1NFUlZJQ0VfSUQ6IDYgYnl0ZXMgb2YgdGhlIHNlcnZpY2UgSUQgaGFzaCBhcworICoJc3BlY2lmaWVkIGluIE5BTiBzcGVjLiBUaGlzIGlzIGEgYmluYXJ5IGF0dHJpYnV0ZS4KKyAqIEBOTDgwMjExX05BTl9GVU5DX1BVQkxJU0hfVFlQRTogcmVsZXZhbnQgaWYgdGhlIGZ1bmN0aW9uJ3MgdHlwZSBpcworICoJcHVibGlzaC4gRGVmaW5lcyB0aGUgdHJhbnNtaXNzaW9uIHR5cGUgZm9yIHRoZSBwdWJsaXNoIFNlcnZpY2UgRGlzY292ZXJ5CisgKglGcmFtZSwgc2VlICZlbnVtIG5sODAyMTFfbmFuX3B1Ymxpc2hfdHlwZS4gSXRzIHR5cGUgaXMgdTguCisgKiBATkw4MDIxMV9OQU5fRlVOQ19QVUJMSVNIX0JDQVNUOiByZWxldmFudCBpZiB0aGUgZnVuY3Rpb24gaXMgYSBzb2xpY2l0ZWQKKyAqCXB1Ymxpc2guIFNob3VsZCB0aGUgc29saWNpdGVkIHB1Ymxpc2ggU2VydmljZSBEaXNjb3ZlcnkgRnJhbWUgYmUgc2VudCB0bworICoJdGhlIE5BTiBCcm9hZGNhc3QgYWRkcmVzcy4gVGhpcyBpcyBhIGZsYWcuCisgKiBATkw4MDIxMV9OQU5fRlVOQ19TVUJTQ1JJQkVfQUNUSVZFOiByZWxldmFudCBpZiB0aGUgZnVuY3Rpb24ncyB0eXBlIGlzCisgKglzdWJzY3JpYmUuIElzIHRoZSBzdWJzY3JpYmUgYWN0aXZlLiBUaGlzIGlzIGEgZmxhZy4KKyAqIEBOTDgwMjExX05BTl9GVU5DX0ZPTExPV19VUF9JRDogcmVsZXZhbnQgaWYgdGhlIGZ1bmN0aW9uJ3MgdHlwZSBpcyBmb2xsb3cgdXAuCisgKglUaGUgaW5zdGFuY2UgSUQgZm9yIHRoZSBmb2xsb3cgdXAgU2VydmljZSBEaXNjb3ZlcnkgRnJhbWUuIFRoaXMgaXMgdTguCisgKiBATkw4MDIxMV9OQU5fRlVOQ19GT0xMT1dfVVBfUkVRX0lEOiByZWxldmFudCBpZiB0aGUgZnVuY3Rpb24ncyB0eXBlCisgKglpcyBmb2xsb3cgdXAuIFRoaXMgaXMgYSB1OC4KKyAqCVRoZSByZXF1ZXN0b3IgaW5zdGFuY2UgSUQgZm9yIHRoZSBmb2xsb3cgdXAgU2VydmljZSBEaXNjb3ZlcnkgRnJhbWUuCisgKiBATkw4MDIxMV9OQU5fRlVOQ19GT0xMT1dfVVBfREVTVDogdGhlIE1BQyBhZGRyZXNzIG9mIHRoZSByZWNpcGllbnQgb2YgdGhlCisgKglmb2xsb3cgdXAgU2VydmljZSBEaXNjb3ZlcnkgRnJhbWUuIFRoaXMgaXMgYSBiaW5hcnkgYXR0cmlidXRlLgorICogQE5MODAyMTFfTkFOX0ZVTkNfQ0xPU0VfUkFOR0U6IGlzIHRoaXMgZnVuY3Rpb24gbGltaXRlZCBmb3IgZGV2aWNlcyBpbiBhCisgKgljbG9zZSByYW5nZS4gVGhlIHJhbmdlIGl0c2VsZiAoUlNTSSkgaXMgZGVmaW5lZCBieSB0aGUgZGV2aWNlLgorICoJVGhpcyBpcyBhIGZsYWcuCisgKiBATkw4MDIxMV9OQU5fRlVOQ19UVEw6IHN0cmljdGx5IHBvc2l0aXZlIG51bWJlciBvZiBEV3MgdGhpcyBmdW5jdGlvbiBzaG91bGQKKyAqCXN0YXkgYWN0aXZlLiBJZiBub3QgcHJlc2VudCBpbmZpbml0ZSBUVEwgaXMgYXNzdW1lZC4gVGhpcyBpcyBhIHUzMi4KKyAqIEBOTDgwMjExX05BTl9GVU5DX1NFUlZJQ0VfSU5GTzogYXJyYXkgb2YgYnl0ZXMgZGVzY3JpYmluZyB0aGUgc2VydmljZQorICoJc3BlY2lmaWMgaW5mby4gVGhpcyBpcyBhIGJpbmFyeSBhdHRyaWJ1dGUuCisgKiBATkw4MDIxMV9OQU5fRlVOQ19TUkY6IFNlcnZpY2UgUmVjZWl2ZSBGaWx0ZXIuIFRoaXMgaXMgYSBuZXN0ZWQgYXR0cmlidXRlLgorICoJU2VlICZlbnVtIG5sODAyMTFfbmFuX3NyZl9hdHRyaWJ1dGVzLgorICogQE5MODAyMTFfTkFOX0ZVTkNfUlhfTUFUQ0hfRklMVEVSOiBSZWNlaXZlIE1hdGNoaW5nIGZpbHRlci4gVGhpcyBpcyBhIG5lc3RlZAorICoJYXR0cmlidXRlLiBJdCBpcyBhIGxpc3Qgb2YgYmluYXJ5IHZhbHVlcy4KKyAqIEBOTDgwMjExX05BTl9GVU5DX1RYX01BVENIX0ZJTFRFUjogVHJhbnNtaXQgTWF0Y2hpbmcgZmlsdGVyLiBUaGlzIGlzIGEKKyAqCW5lc3RlZCBhdHRyaWJ1dGUuIEl0IGlzIGEgbGlzdCBvZiBiaW5hcnkgdmFsdWVzLgorICogQE5MODAyMTFfTkFOX0ZVTkNfSU5TVEFOQ0VfSUQ6IFRoZSBpbnN0YW5jZSBJRCBvZiB0aGUgZnVuY3Rpb24uCisgKglJdHMgdHlwZSBpcyB1OCBhbmQgaXQgY2Fubm90IGJlIDAuCisgKiBATkw4MDIxMV9OQU5fRlVOQ19URVJNX1JFQVNPTjogTkFOIGZ1bmN0aW9uIHRlcm1pbmF0aW9uIHJlYXNvbi4KKyAqCVNlZSAmZW51bSBubDgwMjExX25hbl9mdW5jX3Rlcm1fcmVhc29uLgorICoKKyAqIEBOVU1fTkw4MDIxMV9OQU5fRlVOQ19BVFRSOiBpbnRlcm5hbAorICogQE5MODAyMTFfTkFOX0ZVTkNfQVRUUl9NQVg6IGhpZ2hlc3QgTkFOIGZ1bmN0aW9uIGF0dHJpYnV0ZQorICovCitlbnVtIG5sODAyMTFfbmFuX2Z1bmNfYXR0cmlidXRlcyB7CisJX19OTDgwMjExX05BTl9GVU5DX0lOVkFMSUQsCisJTkw4MDIxMV9OQU5fRlVOQ19UWVBFLAorCU5MODAyMTFfTkFOX0ZVTkNfU0VSVklDRV9JRCwKKwlOTDgwMjExX05BTl9GVU5DX1BVQkxJU0hfVFlQRSwKKwlOTDgwMjExX05BTl9GVU5DX1BVQkxJU0hfQkNBU1QsCisJTkw4MDIxMV9OQU5fRlVOQ19TVUJTQ1JJQkVfQUNUSVZFLAorCU5MODAyMTFfTkFOX0ZVTkNfRk9MTE9XX1VQX0lELAorCU5MODAyMTFfTkFOX0ZVTkNfRk9MTE9XX1VQX1JFUV9JRCwKKwlOTDgwMjExX05BTl9GVU5DX0ZPTExPV19VUF9ERVNULAorCU5MODAyMTFfTkFOX0ZVTkNfQ0xPU0VfUkFOR0UsCisJTkw4MDIxMV9OQU5fRlVOQ19UVEwsCisJTkw4MDIxMV9OQU5fRlVOQ19TRVJWSUNFX0lORk8sCisJTkw4MDIxMV9OQU5fRlVOQ19TUkYsCisJTkw4MDIxMV9OQU5fRlVOQ19SWF9NQVRDSF9GSUxURVIsCisJTkw4MDIxMV9OQU5fRlVOQ19UWF9NQVRDSF9GSUxURVIsCisJTkw4MDIxMV9OQU5fRlVOQ19JTlNUQU5DRV9JRCwKKwlOTDgwMjExX05BTl9GVU5DX1RFUk1fUkVBU09OLAorCisJLyoga2VlcCBsYXN0ICovCisJTlVNX05MODAyMTFfTkFOX0ZVTkNfQVRUUiwKKwlOTDgwMjExX05BTl9GVU5DX0FUVFJfTUFYID0gTlVNX05MODAyMTFfTkFOX0ZVTkNfQVRUUiAtIDEKK307CisKKy8qKgorICogZW51bSBubDgwMjExX25hbl9zcmZfYXR0cmlidXRlcyAtIE5BTiBTZXJ2aWNlIFJlc3BvbnNlIGZpbHRlciBhdHRyaWJ1dGVzCisgKiBAX19OTDgwMjExX05BTl9TUkZfSU5WQUxJRDogaW52YWxpZAorICogQE5MODAyMTFfTkFOX1NSRl9JTkNMVURFOiBwcmVzZW50IGlmIHRoZSBpbmNsdWRlIGJpdCBvZiB0aGUgU1JGIHNldC4KKyAqCVRoaXMgaXMgYSBmbGFnLgorICogQE5MODAyMTFfTkFOX1NSRl9CRjogQmxvb20gRmlsdGVyLiBQcmVzZW50IGlmIGFuZCBvbmx5IGlmCisgKgkmTkw4MDIxMV9OQU5fU1JGX01BQ19BRERSUyBpc24ndCBwcmVzZW50LiBUaGlzIGF0dHJpYnV0ZSBpcyBiaW5hcnkuCisgKiBATkw4MDIxMV9OQU5fU1JGX0JGX0lEWDogaW5kZXggb2YgdGhlIEJsb29tIEZpbHRlci4gTWFuZGF0b3J5IGlmCisgKgkmTkw4MDIxMV9OQU5fU1JGX0JGIGlzIHByZXNlbnQuIFRoaXMgaXMgYSB1OC4KKyAqIEBOTDgwMjExX05BTl9TUkZfTUFDX0FERFJTOiBsaXN0IG9mIE1BQyBhZGRyZXNzZXMgZm9yIHRoZSBTUkYuIFByZXNlbnQgaWYKKyAqCWFuZCBvbmx5IGlmICZOTDgwMjExX05BTl9TUkZfQkYgaXNuJ3QgcHJlc2VudC4gVGhpcyBpcyBhIG5lc3RlZAorICoJYXR0cmlidXRlLiBFYWNoIG5lc3RlZCBhdHRyaWJ1dGUgaXMgYSBNQUMgYWRkcmVzcy4KKyAqIEBOVU1fTkw4MDIxMV9OQU5fU1JGX0FUVFI6IGludGVybmFsCisgKiBATkw4MDIxMV9OQU5fU1JGX0FUVFJfTUFYOiBoaWdoZXN0IE5BTiBTUkYgYXR0cmlidXRlCisgKi8KK2VudW0gbmw4MDIxMV9uYW5fc3JmX2F0dHJpYnV0ZXMgeworCV9fTkw4MDIxMV9OQU5fU1JGX0lOVkFMSUQsCisJTkw4MDIxMV9OQU5fU1JGX0lOQ0xVREUsCisJTkw4MDIxMV9OQU5fU1JGX0JGLAorCU5MODAyMTFfTkFOX1NSRl9CRl9JRFgsCisJTkw4MDIxMV9OQU5fU1JGX01BQ19BRERSUywKKworCS8qIGtlZXAgbGFzdCAqLworCU5VTV9OTDgwMjExX05BTl9TUkZfQVRUUiwKKwlOTDgwMjExX05BTl9TUkZfQVRUUl9NQVggPSBOVU1fTkw4MDIxMV9OQU5fU1JGX0FUVFIgLSAxLAorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfbmFuX21hdGNoX2F0dHJpYnV0ZXMgLSBOQU4gbWF0Y2ggYXR0cmlidXRlcworICogQF9fTkw4MDIxMV9OQU5fTUFUQ0hfSU5WQUxJRDogaW52YWxpZAorICogQE5MODAyMTFfTkFOX01BVENIX0ZVTkNfTE9DQUw6IHRoZSBsb2NhbCBmdW5jdGlvbiB0aGF0IGhhZCB0aGUKKyAqCW1hdGNoLiBUaGlzIGlzIGEgbmVzdGVkIGF0dHJpYnV0ZS4KKyAqCVNlZSAmZW51bSBubDgwMjExX25hbl9mdW5jX2F0dHJpYnV0ZXMuCisgKiBATkw4MDIxMV9OQU5fTUFUQ0hfRlVOQ19QRUVSOiB0aGUgcGVlciBmdW5jdGlvbgorICoJdGhhdCBjYXVzZWQgdGhlIG1hdGNoLiBUaGlzIGlzIGEgbmVzdGVkIGF0dHJpYnV0ZS4KKyAqCVNlZSAmZW51bSBubDgwMjExX25hbl9mdW5jX2F0dHJpYnV0ZXMuCisgKgorICogQE5VTV9OTDgwMjExX05BTl9NQVRDSF9BVFRSOiBpbnRlcm5hbAorICogQE5MODAyMTFfTkFOX01BVENIX0FUVFJfTUFYOiBoaWdoZXN0IE5BTiBtYXRjaCBhdHRyaWJ1dGUKKyAqLworZW51bSBubDgwMjExX25hbl9tYXRjaF9hdHRyaWJ1dGVzIHsKKwlfX05MODAyMTFfTkFOX01BVENIX0lOVkFMSUQsCisJTkw4MDIxMV9OQU5fTUFUQ0hfRlVOQ19MT0NBTCwKKwlOTDgwMjExX05BTl9NQVRDSF9GVU5DX1BFRVIsCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlOVU1fTkw4MDIxMV9OQU5fTUFUQ0hfQVRUUiwKKwlOTDgwMjExX05BTl9NQVRDSF9BVFRSX01BWCA9IE5VTV9OTDgwMjExX05BTl9NQVRDSF9BVFRSIC0gMQorfTsKKwogI2VuZGlmIC8qIF9fTElOVVhfTkw4MDIxMV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbnNmcy5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L25zZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWY2MTcyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L25zZnMuaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIF9fTElOVVhfTlNGU19ICisjZGVmaW5lIF9fTElOVVhfTlNGU19ICisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisjZGVmaW5lIE5TSU8JMHhiNworCisvKiBSZXR1cm5zIGEgZmlsZSBkZXNjcmlwdG9yIHRoYXQgcmVmZXJzIHRvIGFuIG93bmluZyB1c2VyIG5hbWVzcGFjZSAqLworI2RlZmluZSBOU19HRVRfVVNFUk5TCV9JTyhOU0lPLCAweDEpCisvKiBSZXR1cm5zIGEgZmlsZSBkZXNjcmlwdG9yIHRoYXQgcmVmZXJzIHRvIGEgcGFyZW50IG5hbWVzcGFjZSAqLworI2RlZmluZSBOU19HRVRfUEFSRU5UCV9JTyhOU0lPLCAweDIpCisKKyNlbmRpZiAvKiBfX0xJTlVYX05TRlNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L29wZW52c3dpdGNoLmggYi9pbmNsdWRlL3VhcGkvbGludXgvb3BlbnZzd2l0Y2guaAppbmRleCBkOTVhMzAxLi41OWVkMzk5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvb3BlbnZzd2l0Y2guaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvb3BlbnZzd2l0Y2guaApAQCAtNTgzLDcgKzU4Myw3IEBACiAjZGVmaW5lIE9WU19VU0VSU1BBQ0VfQVRUUl9NQVggKF9fT1ZTX1VTRVJTUEFDRV9BVFRSX01BWCAtIDEpCiAKIHN0cnVjdCBvdnNfYWN0aW9uX3RydW5jIHsKLQl1aW50MzJfdCBtYXhfbGVuOyAvKiBNYXggcGFja2V0IHNpemUgaW4gYnl0ZXMuICovCisJX191MzIgbWF4X2xlbjsgLyogTWF4IHBhY2tldCBzaXplIGluIGJ5dGVzLiAqLwogfTsKIAogLyoqCkBAIC02MDUsMTMgKzYwNSwxMyBAQAogICogQHZsYW5fdGNpOiBUYWcgY29udHJvbCBpZGVudGlmaWVyIChUQ0kpIHRvIHB1c2guICBUaGUgQ0ZJIGJpdCBtdXN0IGJlIHNldAogICogKGJ1dCBpdCB3aWxsIG5vdCBiZSBzZXQgaW4gdGhlIDgwMi4xUSBoZWFkZXIgdGhhdCBpcyBwdXNoZWQpLgogICoKLSAqIFRoZSBAdmxhbl90cGlkIHZhbHVlIGlzIHR5cGljYWxseSAlRVRIX1BfODAyMVEuICBUaGUgb25seSBhY2NlcHRhYmxlIFRQSUQKLSAqIHZhbHVlcyBhcmUgdGhvc2UgdGhhdCB0aGUga2VybmVsIG1vZHVsZSBhbHNvIHBhcnNlcyBhcyA4MDIuMVEgaGVhZGVycywgdG8KLSAqIHByZXZlbnQgJU9WU19BQ1RJT05fQVRUUl9QVVNIX1ZMQU4gZm9sbG93ZWQgYnkgJU9WU19BQ1RJT05fQVRUUl9QT1BfVkxBTgotICogZnJvbSBoYXZpbmcgc3VycHJpc2luZyByZXN1bHRzLgorICogVGhlIEB2bGFuX3RwaWQgdmFsdWUgaXMgdHlwaWNhbGx5ICVFVEhfUF84MDIxUSBvciAlRVRIX1BfODAyMUFELgorICogVGhlIG9ubHkgYWNjZXB0YWJsZSBUUElEIHZhbHVlcyBhcmUgdGhvc2UgdGhhdCB0aGUga2VybmVsIG1vZHVsZSBhbHNvIHBhcnNlcworICogYXMgODAyLjFRIG9yIDgwMi4xQUQgaGVhZGVycywgdG8gcHJldmVudCAlT1ZTX0FDVElPTl9BVFRSX1BVU0hfVkxBTiBmb2xsb3dlZAorICogYnkgJU9WU19BQ1RJT05fQVRUUl9QT1BfVkxBTiBmcm9tIGhhdmluZyBzdXJwcmlzaW5nIHJlc3VsdHMuCiAgKi8KIHN0cnVjdCBvdnNfYWN0aW9uX3B1c2hfdmxhbiB7Ci0JX19iZTE2IHZsYW5fdHBpZDsJLyogODAyLjFRIFRQSUQuICovCisJX19iZTE2IHZsYW5fdHBpZDsJLyogODAyLjFRIG9yIDgwMi4xYWQgVFBJRC4gKi8KIAlfX2JlMTYgdmxhbl90Y2k7CS8qIDgwMi4xUSBUQ0kgKFZMQU4gSUQgYW5kIHByaW9yaXR5KS4gKi8KIH07CiAKQEAgLTYzMiw4ICs2MzIsOCBAQAogICogQGhhc2hfYmFzaXM6IGJhc2lzIHVzZWQgZm9yIGNvbXB1dGluZyBoYXNoLgogICovCiBzdHJ1Y3Qgb3ZzX2FjdGlvbl9oYXNoIHsKLQl1aW50MzJfdCAgaGFzaF9hbGc7ICAgICAvKiBPbmUgb2Ygb3ZzX2hhc2hfYWxnLiAqLwotCXVpbnQzMl90ICBoYXNoX2Jhc2lzOworCV9fdTMyICBoYXNoX2FsZzsgICAgIC8qIE9uZSBvZiBvdnNfaGFzaF9hbGcuICovCisJX191MzIgIGhhc2hfYmFzaXM7CiB9OwogCiAvKioKQEAgLTcyMSw5ICs3MjEsMTAgQEAKICAqIGlzIGNvcGllZCBmcm9tIHRoZSB2YWx1ZSB0byB0aGUgcGFja2V0IGhlYWRlciBmaWVsZCwgcmVzdCBvZiB0aGUgYml0cyBhcmUKICAqIGxlZnQgdW5jaGFuZ2VkLiAgVGhlIG5vbi1tYXNrZWQgdmFsdWUgYml0cyBtdXN0IGJlIHBhc3NlZCBpbiBhcyB6ZXJvZXMuCiAgKiBNYXNraW5nIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoZSAlT1ZTX0tFWV9BVFRSX1RVTk5FTCBhdHRyaWJ1dGUuCi0gKiBAT1ZTX0FDVElPTl9BVFRSX1BVU0hfVkxBTjogUHVzaCBhIG5ldyBvdXRlcm1vc3QgODAyLjFRIGhlYWRlciBvbnRvIHRoZQotICogcGFja2V0LgotICogQE9WU19BQ1RJT05fQVRUUl9QT1BfVkxBTjogUG9wIHRoZSBvdXRlcm1vc3QgODAyLjFRIGhlYWRlciBvZmYgdGhlIHBhY2tldC4KKyAqIEBPVlNfQUNUSU9OX0FUVFJfUFVTSF9WTEFOOiBQdXNoIGEgbmV3IG91dGVybW9zdCA4MDIuMVEgb3IgODAyLjFhZCBoZWFkZXIKKyAqIG9udG8gdGhlIHBhY2tldC4KKyAqIEBPVlNfQUNUSU9OX0FUVFJfUE9QX1ZMQU46IFBvcCB0aGUgb3V0ZXJtb3N0IDgwMi4xUSBvciA4MDIuMWFkIGhlYWRlcgorICogZnJvbSB0aGUgcGFja2V0LgogICogQE9WU19BQ1RJT05fQVRUUl9TQU1QTEU6IFByb2JhYmlsaXRpY2FsbHkgZXhlY3V0ZXMgYWN0aW9ucywgYXMgc3BlY2lmaWVkIGluCiAgKiB0aGUgbmVzdGVkICVPVlNfU0FNUExFX0FUVFJfKiBhdHRyaWJ1dGVzLgogICogQE9WU19BQ1RJT05fQVRUUl9QVVNIX01QTFM6IFB1c2ggYSBuZXcgTVBMUyBsYWJlbCBzdGFjayBlbnRyeSBvbnRvIHRoZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3BrdF9jbHMuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9wa3RfY2xzLmgKaW5kZXggZDFjMWNjYS4uOGZkNzE1ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3BrdF9jbHMuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvcGt0X2Nscy5oCkBAIC0zOTYsNiArMzk2LDcgQEAKIAlUQ0FfQlBGX0ZELAogCVRDQV9CUEZfTkFNRSwKIAlUQ0FfQlBGX0ZMQUdTLAorCVRDQV9CUEZfRkxBR1NfR0VOLAogCV9fVENBX0JQRl9NQVgsCiB9OwogCkBAIC00MjgsNiArNDI5LDI0IEBACiAJVENBX0ZMT1dFUl9LRVlfVURQX0RTVCwJCS8qIGJlMTYgKi8KIAogCVRDQV9GTE9XRVJfRkxBR1MsCisJVENBX0ZMT1dFUl9LRVlfVkxBTl9JRCwJCS8qIGJlMTYgKi8KKwlUQ0FfRkxPV0VSX0tFWV9WTEFOX1BSSU8sCS8qIHU4ICAgKi8KKwlUQ0FfRkxPV0VSX0tFWV9WTEFOX0VUSF9UWVBFLAkvKiBiZTE2ICovCisKKwlUQ0FfRkxPV0VSX0tFWV9FTkNfS0VZX0lELAkvKiBiZTMyICovCisJVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjRfU1JDLAkvKiBiZTMyICovCisJVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjRfU1JDX01BU0ssLyogYmUzMiAqLworCVRDQV9GTE9XRVJfS0VZX0VOQ19JUFY0X0RTVCwJLyogYmUzMiAqLworCVRDQV9GTE9XRVJfS0VZX0VOQ19JUFY0X0RTVF9NQVNLLC8qIGJlMzIgKi8KKwlUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNl9TUkMsCS8qIHN0cnVjdCBpbjZfYWRkciAqLworCVRDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X1NSQ19NQVNLLC8qIHN0cnVjdCBpbjZfYWRkciAqLworCVRDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X0RTVCwJLyogc3RydWN0IGluNl9hZGRyICovCisJVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjZfRFNUX01BU0ssLyogc3RydWN0IGluNl9hZGRyICovCisKKwlUQ0FfRkxPV0VSX0tFWV9UQ1BfU1JDX01BU0ssCS8qIGJlMTYgKi8KKwlUQ0FfRkxPV0VSX0tFWV9UQ1BfRFNUX01BU0ssCS8qIGJlMTYgKi8KKwlUQ0FfRkxPV0VSX0tFWV9VRFBfU1JDX01BU0ssCS8qIGJlMTYgKi8KKwlUQ0FfRkxPV0VSX0tFWV9VRFBfRFNUX01BU0ssCS8qIGJlMTYgKi8KIAlfX1RDQV9GTE9XRVJfTUFYLAogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3BrdF9zY2hlZC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3BrdF9zY2hlZC5oCmluZGV4IDIzODJlZWQuLmRmNzQ1MWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9wa3Rfc2NoZWQuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvcGt0X3NjaGVkLmgKQEAgLTc5Miw2ICs3OTIsOCBAQAogCiAJVENBX0ZRX09SUEhBTl9NQVNLLAkvKiBtYXNrIGFwcGxpZWQgdG8gb3JwaGFuZWQgc2tiIGhhc2hlcyAqLwogCisJVENBX0ZRX0xPV19SQVRFX1RIUkVTSE9MRCwgLyogcGVyIHBhY2tldCBkZWxheSB1bmRlciB0aGlzIHJhdGUgKi8KKwogCV9fVENBX0ZRX01BWAogfTsKIApAQCAtODA5LDcgKzgxMSw3IEBACiAJX191MzIJZmxvd3M7CiAJX191MzIJaW5hY3RpdmVfZmxvd3M7CiAJX191MzIJdGhyb3R0bGVkX2Zsb3dzOwotCV9fdTMyCXBhZDsKKwlfX3UzMgl1bnRocm90dGxlX2xhdGVuY3lfbnM7CiB9OwogCiAvKiBIZWF2eS1IaXR0ZXIgRmlsdGVyICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvc2N0cC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3NjdHAuaAppbmRleCBkMzA0ZjRjLi5hNDA2YWRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvc2N0cC5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9zY3RwLmgKQEAgLTk0NCw0ICs5NDQsNjggQEAKIAlfX3UxNiBwcl9wb2xpY3k7CiB9OwogCitzdHJ1Y3Qgc2N0cF9pbmZvIHsKKwlfX3UzMglzY3RwaV90YWc7CisJX191MzIJc2N0cGlfc3RhdGU7CisJX191MzIJc2N0cGlfcnduZDsKKwlfX3UxNglzY3RwaV91bmFja2RhdGE7CisJX191MTYJc2N0cGlfcGVuZGRhdGE7CisJX191MTYJc2N0cGlfaW5zdHJtczsKKwlfX3UxNglzY3RwaV9vdXRzdHJtczsKKwlfX3UzMglzY3RwaV9mcmFnbWVudGF0aW9uX3BvaW50OworCV9fdTMyCXNjdHBpX2lucXVldWU7CisJX191MzIJc2N0cGlfb3V0cXVldWU7CisJX191MzIJc2N0cGlfb3ZlcmFsbF9lcnJvcjsKKwlfX3UzMglzY3RwaV9tYXhfYnVyc3Q7CisJX191MzIJc2N0cGlfbWF4c2VnOworCV9fdTMyCXNjdHBpX3BlZXJfcnduZDsKKwlfX3UzMglzY3RwaV9wZWVyX3RhZzsKKwlfX3U4CXNjdHBpX3BlZXJfY2FwYWJsZTsKKwlfX3U4CXNjdHBpX3BlZXJfc2FjazsKKwlfX3UxNglfX3Jlc2VydmVkMTsKKworCS8qIGFzc29jIHN0YXR1cyBpbmZvICovCisJX191NjQJc2N0cGlfaXNhY2tzOworCV9fdTY0CXNjdHBpX29zYWNrczsKKwlfX3U2NAlzY3RwaV9vcGFja2V0czsKKwlfX3U2NAlzY3RwaV9pcGFja2V0czsKKwlfX3U2NAlzY3RwaV9ydHhjaHVua3M7CisJX191NjQJc2N0cGlfb3V0b2ZzZXF0c25zOworCV9fdTY0CXNjdHBpX2lkdXBjaHVua3M7CisJX191NjQJc2N0cGlfZ2FwY250OworCV9fdTY0CXNjdHBpX291b2RjaHVua3M7CisJX191NjQJc2N0cGlfaXVvZGNodW5rczsKKwlfX3U2NAlzY3RwaV9vb2RjaHVua3M7CisJX191NjQJc2N0cGlfaW9kY2h1bmtzOworCV9fdTY0CXNjdHBpX29jdHJsY2h1bmtzOworCV9fdTY0CXNjdHBpX2ljdHJsY2h1bmtzOworCisJLyogcHJpbWFyeSB0cmFuc3BvcnQgaW5mbyAqLworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlCXNjdHBpX3BfYWRkcmVzczsKKwlfX3MzMglzY3RwaV9wX3N0YXRlOworCV9fdTMyCXNjdHBpX3BfY3duZDsKKwlfX3UzMglzY3RwaV9wX3NydHQ7CisJX191MzIJc2N0cGlfcF9ydG87CisJX191MzIJc2N0cGlfcF9oYmludGVydmFsOworCV9fdTMyCXNjdHBpX3BfcGF0aG1heHJ4dDsKKwlfX3UzMglzY3RwaV9wX3NhY2tkZWxheTsKKwlfX3UzMglzY3RwaV9wX3NhY2tmcmVxOworCV9fdTMyCXNjdHBpX3Bfc3N0aHJlc2g7CisJX191MzIJc2N0cGlfcF9wYXJ0aWFsX2J5dGVzX2Fja2VkOworCV9fdTMyCXNjdHBpX3BfZmxpZ2h0X3NpemU7CisJX191MTYJc2N0cGlfcF9lcnJvcjsKKwlfX3UxNglfX3Jlc2VydmVkMjsKKworCS8qIHNjdHAgc29jayBpbmZvICovCisJX191MzIJc2N0cGlfc19hdXRvY2xvc2U7CisJX191MzIJc2N0cGlfc19hZGFwdGF0aW9uX2luZDsKKwlfX3UzMglzY3RwaV9zX3BkX3BvaW50OworCV9fdTgJc2N0cGlfc19ub2RlbGF5OworCV9fdTgJc2N0cGlfc19kaXNhYmxlX2ZyYWdtZW50czsKKwlfX3U4CXNjdHBpX3NfdjRtYXBwZWQ7CisJX191OAlzY3RwaV9zX2ZyYWdfaW50ZXJsZWF2ZTsKKwlfX3UzMglzY3RwaV9zX3R5cGU7CisJX191MzIJX19yZXNlcnZlZDM7Cit9OworCiAjZW5kaWYgLyogX1VBUElfU0NUUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvc2VyaWFsX3JlZy5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3NlcmlhbF9yZWcuaAppbmRleCAxZTVhYzRlNy4uYjRjMDQ4NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3NlcmlhbF9yZWcuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvc2VyaWFsX3JlZy5oCkBAIC0zNzYsNSArMzc2LDEzIEBACiAjZGVmaW5lIFVBUlRfRVhBUl9UWFRSRwkJMHgwYQkvKiBUeCBGSUZPIHRyaWdnZXIgbGV2ZWwgd3JpdGUtb25seSAqLwogI2RlZmluZSBVQVJUX0VYQVJfUlhUUkcJCTB4MGIJLyogUnggRklGTyB0cmlnZ2VyIGxldmVsIHdyaXRlLW9ubHkgKi8KIAorLyoKKyAqIFRoZXNlIGFyZSBkZWZpbml0aW9ucyBmb3IgdGhlIEFsdGVyYSBBTFRSXzE2NTUwX0YzMi9GNjQvRjEyOAorICogTm9ybWFsaXplZCBmcm9tIDB4MTAwIHRvIDB4NDAgYmVjYXVzZSBvZiBzaGlmdCBieSAyICgzMiBiaXQgcmVncykuCisgKi8KKyNkZWZpbmUgVUFSVF9BTFRSX0FGUgkJMHg0MAkvKiBBZGRpdGlvbmFsIEZlYXR1cmVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFVBUlRfQUxUUl9FTl9UWEZJRk9fTFcJMHgwMQkvKiBFbmFibGUgdGhlIFRYIEZJRk8gTG93IFdhdGVybWFyayAqLworI2RlZmluZSBVQVJUX0FMVFJfVFhfTE9XCTB4NDEJLyogVHggRklGTyBMb3cgV2F0ZXJtYXJrICovCisKICNlbmRpZiAvKiBfTElOVVhfU0VSSUFMX1JFR19IICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9zbm1wLmggYi9pbmNsdWRlL3VhcGkvbGludXgvc25tcC5oCmluZGV4IDI1YTlhZDguLmU3YTMxZjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9zbm1wLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3NubXAuaApAQCAtMjM1LDYgKzIzNSw3IEBACiAJTElOVVhfTUlCX1RDUFNQVVJJT1VTUlRPUywJCS8qIFRDUFNwdXJpb3VzUlRPcyAqLwogCUxJTlVYX01JQl9UQ1BNRDVOT1RGT1VORCwJCS8qIFRDUE1ENU5vdEZvdW5kICovCiAJTElOVVhfTUlCX1RDUE1ENVVORVhQRUNURUQsCQkvKiBUQ1BNRDVVbmV4cGVjdGVkICovCisJTElOVVhfTUlCX1RDUE1ENUZBSUxVUkUsCQkvKiBUQ1BNRDVGYWlsdXJlICovCiAJTElOVVhfTUlCX1NBQ0tTSElGVEVELAogCUxJTlVYX01JQl9TQUNLTUVSR0VELAogCUxJTlVYX01JQl9TQUNLU0hJRlRGQUxMQkFDSywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC90Y19hY3QvdGNfaWZlLmggYi9pbmNsdWRlL3VhcGkvbGludXgvdGNfYWN0L3RjX2lmZS5oCmluZGV4IDRlY2UwMmEuLmNkMTgzNjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC90Y19hY3QvdGNfaWZlLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3RjX2FjdC90Y19pZmUuaApAQCAtMzIsOCArMzIsOSBAQAogI2RlZmluZSBJRkVfTUVUQV9IQVNISUQgMgogI2RlZmluZQlJRkVfTUVUQV9QUklPIDMKICNkZWZpbmUJSUZFX01FVEFfUU1BUCA0CisjZGVmaW5lCUlGRV9NRVRBX1RDSU5ERVggNQogLypDYW4gYmUgb3ZlcnJpZGRlbiBhdCBydW50aW1lIGJ5IG1vZHVsZSBvcHRpb24qLwotI2RlZmluZQlfX0lGRV9NRVRBX01BWCA1CisjZGVmaW5lCV9fSUZFX01FVEFfTUFYIDYKICNkZWZpbmUgSUZFX01FVEFfTUFYIChfX0lGRV9NRVRBX01BWCAtIDEpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3RjX2FjdC90Y19za2Jtb2QuaCBiL2luY2x1ZGUvdWFwaS9saW51eC90Y19hY3QvdGNfc2tibW9kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBmYzA3ZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC90Y19hY3QvdGNfc2tibW9kLmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgSmFtYWwgSGFkaSBTYWxpbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqLworCisjaWZuZGVmIF9fTElOVVhfVENfU0tCTU9EX0gKKyNkZWZpbmUgX19MSU5VWF9UQ19TS0JNT0RfSAorCisjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgorCisjZGVmaW5lIFRDQV9BQ1RfU0tCTU9EIDE1CisKKyNkZWZpbmUgU0tCTU9EX0ZfRE1BQwkweDEKKyNkZWZpbmUgU0tCTU9EX0ZfU01BQwkweDIKKyNkZWZpbmUgU0tCTU9EX0ZfRVRZUEUJMHg0CisjZGVmaW5lIFNLQk1PRF9GX1NXQVBNQUMgMHg4CisKK3N0cnVjdCB0Y19za2Jtb2QgeworCXRjX2dlbjsKKwlfX3U2NCBmbGFnczsKK307CisKK2VudW0geworCVRDQV9TS0JNT0RfVU5TUEVDLAorCVRDQV9TS0JNT0RfVE0sCisJVENBX1NLQk1PRF9QQVJNUywKKwlUQ0FfU0tCTU9EX0RNQUMsCisJVENBX1NLQk1PRF9TTUFDLAorCVRDQV9TS0JNT0RfRVRZUEUsCisJVENBX1NLQk1PRF9QQUQsCisJX19UQ0FfU0tCTU9EX01BWAorfTsKKyNkZWZpbmUgVENBX1NLQk1PRF9NQVggKF9fVENBX1NLQk1PRF9NQVggLSAxKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC90Y19hY3QvdGNfdHVubmVsX2tleS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3RjX2FjdC90Y190dW5uZWxfa2V5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkwMTA2ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC90Y19hY3QvdGNfdHVubmVsX2tleS5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIEFtaXIgVmFkYWkgPGFtaXJAdmFkYWkubWU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIE1lbGxhbm94IFRlY2hub2xvZ2llcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9UQ19UVU5ORUxfS0VZX0gKKyNkZWZpbmUgX19MSU5VWF9UQ19UVU5ORUxfS0VZX0gKKworI2luY2x1ZGUgPGxpbnV4L3BrdF9jbHMuaD4KKworI2RlZmluZSBUQ0FfQUNUX1RVTk5FTF9LRVkgMTcKKworI2RlZmluZSBUQ0FfVFVOTkVMX0tFWV9BQ1RfU0VUCSAgICAxCisjZGVmaW5lIFRDQV9UVU5ORUxfS0VZX0FDVF9SRUxFQVNFICAyCisKK3N0cnVjdCB0Y190dW5uZWxfa2V5IHsKKwl0Y19nZW47CisJaW50IHRfYWN0aW9uOworfTsKKworZW51bSB7CisJVENBX1RVTk5FTF9LRVlfVU5TUEVDLAorCVRDQV9UVU5ORUxfS0VZX1RNLAorCVRDQV9UVU5ORUxfS0VZX1BBUk1TLAorCVRDQV9UVU5ORUxfS0VZX0VOQ19JUFY0X1NSQywJLyogYmUzMiAqLworCVRDQV9UVU5ORUxfS0VZX0VOQ19JUFY0X0RTVCwJLyogYmUzMiAqLworCVRDQV9UVU5ORUxfS0VZX0VOQ19JUFY2X1NSQywJLyogc3RydWN0IGluNl9hZGRyICovCisJVENBX1RVTk5FTF9LRVlfRU5DX0lQVjZfRFNULAkvKiBzdHJ1Y3QgaW42X2FkZHIgKi8KKwlUQ0FfVFVOTkVMX0tFWV9FTkNfS0VZX0lELAkvKiBiZTY0ICovCisJVENBX1RVTk5FTF9LRVlfUEFELAorCV9fVENBX1RVTk5FTF9LRVlfTUFYLAorfTsKKworI2RlZmluZSBUQ0FfVFVOTkVMX0tFWV9NQVggKF9fVENBX1RVTk5FTF9LRVlfTUFYIC0gMSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvdGNfYWN0L3RjX3ZsYW4uaCBiL2luY2x1ZGUvdWFwaS9saW51eC90Y19hY3QvdGNfdmxhbi5oCmluZGV4IDMxMTUxZmYuLmJkZGIyNzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC90Y19hY3QvdGNfdmxhbi5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC90Y19hY3QvdGNfdmxhbi5oCkBAIC0xNiw2ICsxNiw3IEBACiAKICNkZWZpbmUgVENBX1ZMQU5fQUNUX1BPUAkxCiAjZGVmaW5lIFRDQV9WTEFOX0FDVF9QVVNICTIKKyNkZWZpbmUgVENBX1ZMQU5fQUNUX01PRElGWQkzCiAKIHN0cnVjdCB0Y192bGFuIHsKIAl0Y19nZW47CkBAIC0yOSw2ICszMCw3IEBACiAJVENBX1ZMQU5fUFVTSF9WTEFOX0lELAogCVRDQV9WTEFOX1BVU0hfVkxBTl9QUk9UT0NPTCwKIAlUQ0FfVkxBTl9QQUQsCisJVENBX1ZMQU5fUFVTSF9WTEFOX1BSSU9SSVRZLAogCV9fVENBX1ZMQU5fTUFYLAogfTsKICNkZWZpbmUgVENBX1ZMQU5fTUFYIChfX1RDQV9WTEFOX01BWCAtIDEpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvdGNwLmggYi9pbmNsdWRlL3VhcGkvbGludXgvdGNwLmgKaW5kZXggNDgyODk4Zi4uNzNhYzBkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3RjcC5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC90Y3AuaApAQCAtMTY3LDYgKzE2Nyw3IEBACiAJX191OAl0Y3BpX2JhY2tvZmY7CiAJX191OAl0Y3BpX29wdGlvbnM7CiAJX191OAl0Y3BpX3NuZF93c2NhbGUgOiA0LCB0Y3BpX3Jjdl93c2NhbGUgOiA0OworCV9fdTgJdGNwaV9kZWxpdmVyeV9yYXRlX2FwcF9saW1pdGVkOjE7CiAKIAlfX3UzMgl0Y3BpX3J0bzsKIAlfX3UzMgl0Y3BpX2F0bzsKQEAgLTIxMSw2ICsyMTIsOCBAQAogCV9fdTMyCXRjcGlfbWluX3J0dDsKIAlfX3UzMgl0Y3BpX2RhdGFfc2Vnc19pbjsJLyogUkZDNDg5OCB0Y3BFU3RhdHNEYXRhU2Vnc0luICovCiAJX191MzIJdGNwaV9kYXRhX3NlZ3Nfb3V0OwkvKiBSRkM0ODk4IHRjcEVTdGF0c0RhdGFTZWdzT3V0ICovCisKKwlfX3U2NCAgIHRjcGlfZGVsaXZlcnlfcmF0ZTsKIH07CiAKIC8qIGZvciBUQ1BfTUQ1U0lHIHNvY2tldCBvcHRpb24gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC90aXBjX25ldGxpbmsuaCBiL2luY2x1ZGUvdWFwaS9saW51eC90aXBjX25ldGxpbmsuaAppbmRleCA1ZjNmNmQwLi5mOWVkZDIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvdGlwY19uZXRsaW5rLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3RpcGNfbmV0bGluay5oCkBAIC01OSw2ICs1OSw5IEBACiAJVElQQ19OTF9NT05fU0VULAogCVRJUENfTkxfTU9OX0dFVCwKIAlUSVBDX05MX01PTl9QRUVSX0dFVCwKKwlUSVBDX05MX1BFRVJfUkVNT1ZFLAorCVRJUENfTkxfQkVBUkVSX0FERCwKKwlUSVBDX05MX1VEUF9HRVRfUkVNT1RFSVAsCiAKIAlfX1RJUENfTkxfQ01EX01BWCwKIAlUSVBDX05MX0NNRF9NQVggPSBfX1RJUENfTkxfQ01EX01BWCAtIDEKQEAgLTk4LDYgKzEwMSw3IEBACiAJVElQQ19OTEFfVURQX1VOU1BFQywKIAlUSVBDX05MQV9VRFBfTE9DQUwsCQkvKiBzb2NrYWRkcl9zdG9yYWdlICovCiAJVElQQ19OTEFfVURQX1JFTU9URSwJCS8qIHNvY2thZGRyX3N0b3JhZ2UgKi8KKwlUSVBDX05MQV9VRFBfTVVMVElfUkVNT1RFSVAsCS8qIGZsYWcgKi8KIAogCV9fVElQQ19OTEFfVURQX01BWCwKIAlUSVBDX05MQV9VRFBfTUFYID0gX19USVBDX05MQV9VRFBfTUFYIC0gMQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3VzYi9mdW5jdGlvbmZzLmggYi9pbmNsdWRlL3VhcGkvbGludXgvdXNiL2Z1bmN0aW9uZnMuaAppbmRleCAxMDhkZDc5Li5hY2M2MzY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvdXNiL2Z1bmN0aW9uZnMuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvdXNiL2Z1bmN0aW9uZnMuaApAQCAtMjEsNiArMjEsOCBAQAogCUZVTkNUSU9ORlNfSEFTX01TX09TX0RFU0MgPSA4LAogCUZVTkNUSU9ORlNfVklSVFVBTF9BRERSID0gMTYsCiAJRlVOQ1RJT05GU19FVkVOVEZEID0gMzIsCisJRlVOQ1RJT05GU19BTExfQ1RSTF9SRUNJUCA9IDY0LAorCUZVTkNUSU9ORlNfQ09ORklHMF9TRVRVUCA9IDEyOCwKIH07CiAKIC8qIERlc2NyaXB0b3Igb2YgYW4gbm9uLWF1ZGlvIGVuZHBvaW50ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgveGZybS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3hmcm0uaAppbmRleCAxNDMzMzg5Li4xZmM2MmIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgveGZybS5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC94ZnJtLmgKQEAgLTI5OCw3ICsyOTgsNyBAQAogCVhGUk1BX0FMR19BVVRIX1RSVU5DLAkvKiBzdHJ1Y3QgeGZybV9hbGdvX2F1dGggKi8KIAlYRlJNQV9NQVJLLAkJLyogc3RydWN0IHhmcm1fbWFyayAqLwogCVhGUk1BX1RGQ1BBRCwJCS8qIF9fdTMyICovCi0JWEZSTUFfUkVQTEFZX0VTTl9WQUwsCS8qIHN0cnVjdCB4ZnJtX3JlcGxheV9lc24gKi8KKwlYRlJNQV9SRVBMQVlfRVNOX1ZBTCwJLyogc3RydWN0IHhmcm1fcmVwbGF5X3N0YXRlX2VzbiAqLwogCVhGUk1BX1NBX0VYVFJBX0ZMQUdTLAkvKiBfX3UzMiAqLwogCVhGUk1BX1BST1RPLAkJLyogX191OCAqLwogCVhGUk1BX0FERFJFU1NfRklMVEVSLAkvKiBzdHJ1Y3QgeGZybV9hZGRyZXNzX2ZpbHRlciAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL3NvdW5kL0tidWlsZCBiL2luY2x1ZGUvdWFwaS9zb3VuZC9LYnVpbGQKaW5kZXggNjkxOTg0Yy4uOTU3OGQ4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL3NvdW5kL0tidWlsZAorKysgYi9pbmNsdWRlL3VhcGkvc291bmQvS2J1aWxkCkBAIC0xMywzICsxMyw0IEBACiBoZWFkZXIteSArPSBzZm50X2luZm8uaAogaGVhZGVyLXkgKz0gdGx2LmgKIGhlYWRlci15ICs9IHVzYl9zdHJlYW0uaAoraGVhZGVyLXkgKz0gc25kX3NzdF90b2tlbnMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL3NvdW5kL2Fzb2MuaCBiL2luY2x1ZGUvdWFwaS9zb3VuZC9hc29jLmgKaW5kZXggZTQ3MDFhMy4uMzNkMDBhNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL3NvdW5kL2Fzb2MuaAorKysgYi9pbmNsdWRlL3VhcGkvc291bmQvYXNvYy5oCkBAIC04Myw3ICs4Myw3IEBACiAjZGVmaW5lIFNORF9TT0NfVFBMR19OVU1fVEVYVFMJCTE2CiAKIC8qIEFCSSB2ZXJzaW9uICovCi0jZGVmaW5lIFNORF9TT0NfVFBMR19BQklfVkVSU0lPTgkweDQKKyNkZWZpbmUgU05EX1NPQ19UUExHX0FCSV9WRVJTSU9OCTB4NQogCiAvKiBNYXggc2l6ZSBvZiBUTFYgZGF0YSAqLwogI2RlZmluZSBTTkRfU09DX1RQTEdfVExWX1NJWkUJCTMyCkBAIC0xMDUsNyArMTA1LDggQEAKICNkZWZpbmUgU05EX1NPQ19UUExHX1RZUEVfQ09ERUNfTElOSwk5CiAjZGVmaW5lIFNORF9TT0NfVFBMR19UWVBFX0JBQ0tFTkRfTElOSwkxMAogI2RlZmluZSBTTkRfU09DX1RQTEdfVFlQRV9QREFUQQkJMTEKLSNkZWZpbmUgU05EX1NPQ19UUExHX1RZUEVfTUFYCVNORF9TT0NfVFBMR19UWVBFX1BEQVRBCisjZGVmaW5lIFNORF9TT0NfVFBMR19UWVBFX0JFX0RBSQkxMgorI2RlZmluZSBTTkRfU09DX1RQTEdfVFlQRV9NQVgJCVNORF9TT0NfVFBMR19UWVBFX0JFX0RBSQogCiAvKiB2ZW5kb3IgYmxvY2sgSURzIC0gcGxlYXNlIGFkZCBuZXcgdmVuZG9yIHR5cGVzIHRvIGVuZCAqLwogI2RlZmluZSBTTkRfU09DX1RQTEdfVFlQRV9WRU5ET1JfRlcJMTAwMApAQCAtMTI0LDYgKzEyNSwxMSBAQAogI2RlZmluZSBTTkRfU09DX1RQTEdfVFVQTEVfVFlQRV9XT1JECTQKICNkZWZpbmUgU05EX1NPQ19UUExHX1RVUExFX1RZUEVfU0hPUlQJNQogCisvKiBCRSBEQUkgZmxhZ3MgKi8KKyNkZWZpbmUgU05EX1NPQ19UUExHX0RBSV9GTEdCSVRfU1lNTUVUUklDX1JBVEVTICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgU05EX1NPQ19UUExHX0RBSV9GTEdCSVRfU1lNTUVUUklDX0NIQU5ORUxTICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgU05EX1NPQ19UUExHX0RBSV9GTEdCSVRfU1lNTUVUUklDX1NBTVBMRUJJVFMgICAgKDEgPDwgMikKKwogLyoKICAqIEJsb2NrIEhlYWRlci4KICAqIFRoaXMgaGVhZGVyIHByZWNlZGVzIGFsbCBvYmplY3QgYW5kIG9iamVjdCBhcnJheXMgYmVsb3cuCkBAIC0yNTEsNiArMjU3LDcgQEAKIAlfX2xlMzIgcGVyaW9kX3NpemVfbWF4OwkvKiBtYXggcGVyaW9kIHNpemUgYnl0ZXMgKi8KIAlfX2xlMzIgYnVmZmVyX3NpemVfbWluOwkvKiBtaW4gYnVmZmVyIHNpemUgYnl0ZXMgKi8KIAlfX2xlMzIgYnVmZmVyX3NpemVfbWF4OwkvKiBtYXggYnVmZmVyIHNpemUgYnl0ZXMgKi8KKwlfX2xlMzIgc2lnX2JpdHM7ICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBvZiBjb250ZW50ICovCiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKgpAQCAtMjg1LDYgKzI5Miw4IEBACiAJX19sZTMyIGdyYXBoX2VsZW1zOwkvKiBudW1iZXIgb2YgZ3JhcGggZWxlbWVudHMgKi8KIAlfX2xlMzIgcGNtX2VsZW1zOwkvKiBudW1iZXIgb2YgUENNIGVsZW1lbnRzICovCiAJX19sZTMyIGRhaV9saW5rX2VsZW1zOwkvKiBudW1iZXIgb2YgREFJIGxpbmsgZWxlbWVudHMgKi8KKwlfX2xlMzIgYmVfZGFpX2VsZW1zOwkvKiBudW1iZXIgb2YgQkUgREFJIGVsZW1lbnRzICovCisJX19sZTMyIHJlc2VydmVkWzIwXTsJLyogcmVzZXJ2ZWQgZm9yIG5ldyBBQkkgZWxlbWVudCB0eXBlcyAqLwogCXN0cnVjdCBzbmRfc29jX3RwbGdfcHJpdmF0ZSBwcml2OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIApAQCAtNDUwLDQgKzQ1OSwyNiBAQAogCXN0cnVjdCBzbmRfc29jX3RwbGdfc3RyZWFtIHN0cmVhbVtTTkRfU09DX1RQTEdfU1RSRUFNX0NPTkZJR19NQVhdOyAvKiBzdXBwb3J0ZWQgY29uZmlncyBwbGF5YmFjayBhbmQgY2FwdHJ1cmUgKi8KIAlfX2xlMzIgbnVtX3N0cmVhbXM7ICAgICAvKiBudW1iZXIgb2Ygc3RyZWFtcyAqLwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoKKyAqIERlc2NyaWJlcyBTVy9GVyBzcGVjaWZpYyBmZWF0dXJlcyBvZiBCRSBEQUkuCisgKgorICogRmlsZSBibG9jayByZXByZXNlbnRhdGlvbiBmb3IgQkUgREFJIDotCisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0rCisgKiB8IHN0cnVjdCBzbmRfc29jX3RwbGdfaGRyICAgICAgICAgICB8ICAxICB8CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0rCisgKiB8IHN0cnVjdCBzbmRfc29jX3RwbGdfYmVfZGFpICAgICAgICB8ICBOICB8CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0rCisgKi8KK3N0cnVjdCBzbmRfc29jX3RwbGdfYmVfZGFpIHsKKwlfX2xlMzIgc2l6ZTsgICAgICAgICAgICAvKiBpbiBieXRlcyBvZiB0aGlzIHN0cnVjdHVyZSAqLworCWNoYXIgZGFpX25hbWVbU05EUlZfQ1RMX0VMRU1fSURfTkFNRV9NQVhMRU5dOyAvKiBuYW1lIC0gdXNlZCB0byBtYXRjaCAqLworCV9fbGUzMiBkYWlfaWQ7ICAgICAgICAgIC8qIHVuaXF1ZSBJRCAtIHVzZWQgdG8gbWF0Y2ggKi8KKwlfX2xlMzIgcGxheWJhY2s7ICAgICAgICAvKiBzdXBwb3J0cyBwbGF5YmFjayBtb2RlICovCisJX19sZTMyIGNhcHR1cmU7ICAgICAgICAgLyogc3VwcG9ydHMgY2FwdHVyZSBtb2RlICovCisJc3RydWN0IHNuZF9zb2NfdHBsZ19zdHJlYW1fY2FwcyBjYXBzWzJdOyAvKiBwbGF5YmFjayBhbmQgY2FwdHVyZSBmb3IgREFJICovCisJX19sZTMyIGZsYWdfbWFzazsgICAgICAgLyogYml0bWFzayBvZiBmbGFncyB0byBjb25maWd1cmUgKi8KKwlfX2xlMzIgZmxhZ3M7ICAgICAgICAgICAvKiBTTkRfU09DX1RQTEdfREFJX0ZMR0JJVF8qICovCisJc3RydWN0IHNuZF9zb2NfdHBsZ19wcml2YXRlIHByaXY7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvc291bmQvYXNvdW5kLmggYi9pbmNsdWRlL3VhcGkvc291bmQvYXNvdW5kLmgKaW5kZXggNjA5Y2FkYi4uYmUzNTNhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL3NvdW5kL2Fzb3VuZC5oCisrKyBiL2luY2x1ZGUvdWFwaS9zb3VuZC9hc291bmQuaApAQCAtMTA2LDkgKzEwNiwxMCBAQAogCVNORFJWX0hXREVQX0lGQUNFX0ZXX09YRlcsCS8qIE94Zm9yZCBPWEZXOTcwLzk3MSBiYXNlZCBkZXZpY2UgKi8KIAlTTkRSVl9IV0RFUF9JRkFDRV9GV19ESUdJMDBYLAkvKiBEaWdpZGVzaWduIERpZ2kgMDAyLzAwMyBmYW1pbHkgKi8KIAlTTkRSVl9IV0RFUF9JRkFDRV9GV19UQVNDQU0sCS8qIFRBU0NBTSBGaXJlV2lyZSBzZXJpZXMgKi8KKwlTTkRSVl9IV0RFUF9JRkFDRV9MSU5FNiwJLyogTGluZTYgVVNCIHByb2Nlc3NvcnMgKi8KIAogCS8qIERvbid0IGZvcmdldCB0byBjaGFuZ2UgdGhlIGZvbGxvd2luZzogKi8KLQlTTkRSVl9IV0RFUF9JRkFDRV9MQVNUID0gU05EUlZfSFdERVBfSUZBQ0VfRldfVEFTQ0FNCisJU05EUlZfSFdERVBfSUZBQ0VfTEFTVCA9IFNORFJWX0hXREVQX0lGQUNFX0xJTkU2CiB9OwogCiBzdHJ1Y3Qgc25kX2h3ZGVwX2luZm8gewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL3NvdW5kL3NuZF9zc3RfdG9rZW5zLmggYi9pbmNsdWRlL3VhcGkvc291bmQvc25kX3NzdF90b2tlbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWUyZTk0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91YXBpL3NvdW5kL3NuZF9zc3RfdG9rZW5zLmgKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBzbmRfc3N0X3Rva2Vucy5oIC0gSW50ZWwgU1NUIHRva2VucyBkZWZpbml0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEludGVsIENvcnAKKyAqIEF1dGhvcjogU2hyZXlhcyBOQyA8c2hyZXlhcy5uY0BpbnRlbC5jb20+CisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgX19TTkRfU1NUX1RPS0VOU19IX18KKyNkZWZpbmUgX19TTkRfU1NUX1RPS0VOU19IX18KKworLyoqCisgKiAlU0tMX1RLTl9VVUlEOiAgICAgICAgICAgICAgIE1vZHVsZSBVVUlECisgKgorICogJVNLTF9US05fVThfQkxPQ0tfVFlQRTogICAgICBUeXBlIG9mIHRoZSBwcml2YXRlIGRhdGEgYmxvY2suQ2FuIGJlOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXBsZXMsIGJ5dGVzLCBzaG9ydCBhbmQgd29yZHMKKyAqCisgKiAlU0tMX1RLTl9VOF9JTl9QSU5fVFlQRTogICAgIElucHV0IHBpbiB0eXBlLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob21vZ2Vub3VzPTAsIGhldGVyb2dlbm91cz0xCisgKgorICogJVNLTF9US05fVThfT1VUX1BJTl9UWVBFOiAgICBPdXRwdXQgcGluIHR5cGUsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbW9nZW5vdXM9MCwgaGV0ZXJvZ2Vub3VzPTEKKyAqICVTS0xfVEtOX1U4X0RZTl9JTl9QSU46ICAgICAgQ29uZmlndXJlIElucHV0IHBpbiBkeW5hbWljYWxseQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0cnVlCisgKgorICogJVNLTF9US05fVThfRFlOX09VVF9QSU46ICAgICBDb25maWd1cmUgT3V0cHV0IHBpbiBkeW5hbWljYWxseQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0cnVlCisgKgorICogJVNLTF9US05fVThfSU5fUVVFVUVfQ09VTlQ6ICBTdG9yZSB0aGUgbnVtYmVyIG9mIElucHV0IHBpbnMKKyAqCisgKiAlU0tMX1RLTl9VOF9PVVRfUVVFVUVfQ09VTlQ6IFN0b3JlIHRoZSBudW1iZXIgb2YgT3V0cHV0IHBpbnMKKyAqCisgKiAlU0tMX1RLTl9VOF9USU1FX1NMT1Q6ICAgICAgIFRETSBzbG90IG51bWJlcgorICoKKyAqICVTS0xfVEtOX1U4X0NPUkVfSUQ6ICAgICAgICAgU3RvcmVzIG1vZHVsZSBhZmZpbml0eSB2YWx1ZS5DYW4gdGFrZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTS0xfQUZGSU5JVFlfQ09SRV8wID0gMCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tMX0FGRklOSVRZX0NPUkVfMSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tMX0FGRklOSVRZX0NPUkVfTUFYCisgKgorICogJVNLTF9US05fVThfTU9EX1RZUEU6ICAgICAgICBNb2R1bGUgdHlwZSB2YWx1ZS4KKyAqCisgKiAlU0tMX1RLTl9VOF9DT05OX1RZUEU6ICAgICAgIE1vZHVsZSBjb25uZWN0aW9uIHR5cGUgY2FuIGJlIGEgRkUsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFIG9yIE5PTkUgYXMgZGVmaW5lZCA6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNLTF9QSVBFX0NPTk5fVFlQRV9OT05FID0gMCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tMX1BJUEVfQ09OTl9UWVBFX0ZFID0gMSAoSE9TVF9ETUEpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNLTF9QSVBFX0NPTk5fVFlQRV9CRSA9IDIgKExJTktfRE1BKQorICoKKyAqICVTS0xfVEtOX1U4X0RFVl9UWVBFOiAgICAgICAgVHlwZSBvZiBkZXZpY2UgdG8gd2hpY2ggdGhlIG1vZHVsZSBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIHRha2UgdGhlIHZhbHVlczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tMX0RFVklDRV9CVCA9IDB4MCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tMX0RFVklDRV9ETUlDID0gMHgxLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTS0xfREVWSUNFX0kyUyA9IDB4MiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tMX0RFVklDRV9TTElNQlVTID0gMHgzLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTS0xfREVWSUNFX0hEQUxJTksgPSAweDQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNLTF9ERVZJQ0VfSERBSE9TVCA9IDB4NSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tMX0RFVklDRV9OT05FCisgKgorICogJVNLTF9US05fVThfSFdfQ09OTl9UWVBFOiAgICBDb25uZWN0aW9uIHR5cGUgb2YgdGhlIEhXIHRvIHdoaWNoIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgaXMgY29ubmVjdGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNLTF9DT05OX05PTkUgPSAwLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTS0xfQ09OTl9TT1VSQ0UgPSAxLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTS0xfQ09OTl9TSU5LID0gMgorICoKKyAqICVTS0xfVEtOX1UxNl9QSU5fSU5TVF9JRDogICAgU3RvcmVzIHRoZSBwaW4gaW5zdGFuY2UgaWQKKyAqCisgKiAlU0tMX1RLTl9VMTZfTU9EX0lOU1RfSUQ6ICAgIFN0b3JlcyB0aGUgbWR1bGUgaW5zdGFuY2UgaWQKKyAqCisgKiAlU0tMX1RLTl9VMzJfTUFYX01DUFM6ICAgICAgIE1vZHVsZSBtYXggbWNwcyB2YWx1ZQorICoKKyAqICVTS0xfVEtOX1UzMl9NRU1fUEFHRVM6ICAgICAgTW9kdWxlIHJlc291cmNlIHBhZ2VzCisgKgorICogJVNLTF9US05fVTMyX09CUzogICAgICAgICAgICBTdG9yZXMgT3V0cHV0IEJ1ZmZlciBzaXplCisgKgorICogJVNLTF9US05fVTMyX0lCUzogICAgICAgICAgICBTdG9yZXMgaW5wdXQgYnVmZmVyIHNpemUKKyAqCisgKiAlU0tMX1RLTl9VMzJfVkJVU19JRDogICAgICAgIE1vZHVsZSBWQlVTX0lELiBQRE09MCwgU1NQMD0wLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1AxPTEsU1NQMj0yLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1AzPTMsIFNTUDQ9NCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NQNT01LCBTU1A2PTYsSU5WQUxJRAorICoKKyAqICVTS0xfVEtOX1UzMl9QQVJBTVNfRklYVVA6ICAgTW9kdWxlIFBhcmFtcyBmaXh1cCBtYXNrCisgKiAlU0tMX1RLTl9VMzJfQ09OVkVSVEVSOiAgICAgIE1vZHVsZSBwYXJhbXMgY29udmVydGVyIG1hc2sKKyAqICVTS0xfVEtOX1UzMl9QSVBFX0lEOiAgICAgICAgU3RvcmVzIHRoZSBwaXBlIGlkCisgKgorICogJVNLTF9US05fVTMyX1BJUEVfQ09OTl9UWVBFOiBUeXBlIG9mIHRoZSB0b2tlbiB0byB3aGljaCB0aGUgcGlwZSBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQgdG8uIEl0IGNhbiBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTS0xfUElQRV9DT05OX1RZUEVfTk9ORSA9IDAsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNLTF9QSVBFX0NPTk5fVFlQRV9GRSA9IDEgKEhPU1RfRE1BKSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tMX1BJUEVfQ09OTl9UWVBFX0JFID0gMiAoTElOS19ETUEpLAorICoKKyAqICVTS0xfVEtOX1UzMl9QSVBFX1BSSU9SSVRZOiAgUGlwZSBwcmlvcml0eSB2YWx1ZQorICogJVNLTF9US05fVTMyX1BJUEVfTUVNX1BHUzogICBQaXBlIHJlc291cmNlIHBhZ2VzCisgKgorICogJVNLTF9US05fVTMyX0RJUl9QSU5fQ09VTlQ6ICBWYWx1ZSBmb3IgdGhlIGRpcmVjdGlvbiB0byBzZXQgaW5wdXQvb3V0cHV0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMgYW5kIHRoZSBwaW4gY291bnQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBmaXJzdCA0IGJpdHMgaGF2ZSB0aGUgZGlyZWN0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGFuZCB0aGUgbmV4dCA0IGhhdmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBpbiBjb3VudCB2YWx1ZS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tMX0RJUl9JTiA9IDAsIFNLTF9ESVJfT1VUID0gMS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGlucHV0IGFuZCBvdXRwdXQgZm9ybWF0cworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZSB0aGUgc2FtZSBzZXQgb2YgdG9rZW5zCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gaW5wdXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG91dHB1dCBtYWRlIGJ5IHJlYWRpbmcgZGlyZWN0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLgorICoKKyAqICVTS0xfVEtOX1UzMl9GTVRfQ0g6ICAgICAgICAgU3VwcG9ydGVkIGNoYW5uZWwgY291bnQKKyAqCisgKiAlU0tMX1RLTl9VMzJfRk1UX0ZSRVE6ICAgICAgIFN1cHBvcnRlZCBmcmVxdWVuY3kvc2FtcGxlIHJhdGUKKyAqCisgKiAlU0tMX1RLTl9VMzJfRk1UX0JJVF9ERVBUSDogIFN1cHBvcnRlZCBjb250YWluZXIgc2l6ZQorICoKKyAqICVTS0xfVEtOX1UzMl9GTVRfU0FNUExFX1NJWkU6TnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGNvbnRhaW5lcgorICoKKyAqICVTS0xfVEtOX1UzMl9GTVRfQ0hfQ09ORklHOiAgU3VwcG9ydGVkIGNoYW5uZWwgY29uZmlndXJhdGlvbnMgZm9yIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC9vdXRwdXQuCisgKgorICogJVNLTF9US05fVTMyX0ZNVF9JTlRFUkxFQVZFOiBJbnRlcmxlYXZpbmcgc3R5bGUgd2hpY2ggY2FuIGJlIHBlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIG9yIHBlciBzYW1wbGUuIFRoZSB2YWx1ZXMgY2FuIGJlIDoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tMX0lOVEVSTEVBVklOR19QRVJfQ0hBTk5FTCA9IDAsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNLTF9JTlRFUkxFQVZJTkdfUEVSX1NBTVBMRSA9IDEsCisgKgorICogJVNLTF9US05fVTMyX0ZNVF9TQU1QTEVfVFlQRToKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBzYW1wbGUgdHlwZS4gQ2FuIHRha2UgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogU0tMX1NBTVBMRV9UWVBFX0lOVF9NU0IgPSAwLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTS0xfU0FNUExFX1RZUEVfSU5UX0xTQiA9IDEsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNLTF9TQU1QTEVfVFlQRV9JTlRfU0lHTkVEID0gMiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tMX1NBTVBMRV9UWVBFX0lOVF9VTlNJR05FRCA9IDMsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNLTF9TQU1QTEVfVFlQRV9GTE9BVCA9IDQKKyAqCisgKiAlU0tMX1RLTl9VMzJfQ0hfTUFQOiAgICAgICAgIENoYW5uZWwgbWFwIHZhbHVlcworICogJVNLTF9US05fVTMyX01PRF9TRVRfUEFSQU1TOiBJdCBjYW4gdGFrZSB0aGVzZSB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNLTF9QQVJBTV9ERUZBVUxULCBTS0xfUEFSQU1fSU5JVCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tMX1BBUkFNX1NFVCwgU0tMX1BBUkFNX0JJTkQKKyAqCisgKiAlU0tMX1RLTl9VMzJfTU9EX1BBUkFNX0lEOiAgIElEIG9mIHRoZSBtb2R1bGUgcGFyYW1zCisgKgorICogJVNLTF9US05fVTMyX0NBUFNfU0VUX1BBUkFNUzoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHBhcmFtcyB2YWx1ZQorICoKKyAqICVTS0xfVEtOX1UzMl9DQVBTX1BBUkFNU19JRDogUGFyYW1zIElECisgKgorICogJVNLTF9US05fVTMyX0NBUFNfU0laRTogICAgICBDYXBzIHNpemUKKyAqCisgKiAlU0tMX1RLTl9VMzJfUFJPQ19ET01BSU46ICAgIFNwZWNpZnkgcHJvY2Vzc2luZyBkb21haW4KKyAqCisgKiAlU0tMX1RLTl9VMzJfTElCX0NPVU5UOiAgICAgIFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGxpYnJhcmllcworICoKKyAqICVTS0xfVEtOX1NUUl9MSUJfTkFNRTogICAgICAgU3BlY2lmaWVzIHRoZSBsaWJyYXJ5IG5hbWUKKyAqCisgKiBtb2R1bGVfaWQgYW5kIGxvYWRhYmxlIGZsYWdzIGRvbnQgaGF2ZSB0b2tlbnMgYXMgdGhlc2UgdmFsdWVzIHdpbGwgYmUKKyAqIHJlYWQgZnJvbSB0aGUgRFNQIEZXIG1hbmlmZXN0CisgKi8KK2VudW0gU0tMX1RLTlMgeworCVNLTF9US05fVVVJRCA9IDEsCisJU0tMX1RLTl9VOF9OVU1fQkxPQ0tTLAorCVNLTF9US05fVThfQkxPQ0tfVFlQRSwKKwlTS0xfVEtOX1U4X0lOX1BJTl9UWVBFLAorCVNLTF9US05fVThfT1VUX1BJTl9UWVBFLAorCVNLTF9US05fVThfRFlOX0lOX1BJTiwKKwlTS0xfVEtOX1U4X0RZTl9PVVRfUElOLAorCVNLTF9US05fVThfSU5fUVVFVUVfQ09VTlQsCisJU0tMX1RLTl9VOF9PVVRfUVVFVUVfQ09VTlQsCisJU0tMX1RLTl9VOF9USU1FX1NMT1QsCisJU0tMX1RLTl9VOF9DT1JFX0lELAorCVNLTF9US05fVThfTU9EX1RZUEUsCisJU0tMX1RLTl9VOF9DT05OX1RZUEUsCisJU0tMX1RLTl9VOF9ERVZfVFlQRSwKKwlTS0xfVEtOX1U4X0hXX0NPTk5fVFlQRSwKKwlTS0xfVEtOX1UxNl9NT0RfSU5TVF9JRCwKKwlTS0xfVEtOX1UxNl9CTE9DS19TSVpFLAorCVNLTF9US05fVTMyX01BWF9NQ1BTLAorCVNLTF9US05fVTMyX01FTV9QQUdFUywKKwlTS0xfVEtOX1UzMl9PQlMsCisJU0tMX1RLTl9VMzJfSUJTLAorCVNLTF9US05fVTMyX1ZCVVNfSUQsCisJU0tMX1RLTl9VMzJfUEFSQU1TX0ZJWFVQLAorCVNLTF9US05fVTMyX0NPTlZFUlRFUiwKKwlTS0xfVEtOX1UzMl9QSVBFX0lELAorCVNLTF9US05fVTMyX1BJUEVfQ09OTl9UWVBFLAorCVNLTF9US05fVTMyX1BJUEVfUFJJT1JJVFksCisJU0tMX1RLTl9VMzJfUElQRV9NRU1fUEdTLAorCVNLTF9US05fVTMyX0RJUl9QSU5fQ09VTlQsCisJU0tMX1RLTl9VMzJfRk1UX0NILAorCVNLTF9US05fVTMyX0ZNVF9GUkVRLAorCVNLTF9US05fVTMyX0ZNVF9CSVRfREVQVEgsCisJU0tMX1RLTl9VMzJfRk1UX1NBTVBMRV9TSVpFLAorCVNLTF9US05fVTMyX0ZNVF9DSF9DT05GSUcsCisJU0tMX1RLTl9VMzJfRk1UX0lOVEVSTEVBVkUsCisJU0tMX1RLTl9VMzJfRk1UX1NBTVBMRV9UWVBFLAorCVNLTF9US05fVTMyX0ZNVF9DSF9NQVAsCisJU0tMX1RLTl9VMzJfUElOX01PRF9JRCwKKwlTS0xfVEtOX1UzMl9QSU5fSU5TVF9JRCwKKwlTS0xfVEtOX1UzMl9NT0RfU0VUX1BBUkFNUywKKwlTS0xfVEtOX1UzMl9NT0RfUEFSQU1fSUQsCisJU0tMX1RLTl9VMzJfQ0FQU19TRVRfUEFSQU1TLAorCVNLTF9US05fVTMyX0NBUFNfUEFSQU1TX0lELAorCVNLTF9US05fVTMyX0NBUFNfU0laRSwKKwlTS0xfVEtOX1UzMl9QUk9DX0RPTUFJTiwKKwlTS0xfVEtOX1UzMl9MSUJfQ09VTlQsCisJU0tMX1RLTl9TVFJfTElCX05BTUUsCisJU0tMX1RLTl9NQVggPSBTS0xfVEtOX1NUUl9MSUJfTkFNRSwKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL3NvdW5kL3Rsdi5oIGIvaW5jbHVkZS91YXBpL3NvdW5kL3Rsdi5oCmluZGV4IGZmYzRmMjAuLmI0ZGY0NDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9zb3VuZC90bHYuaAorKysgYi9pbmNsdWRlL3VhcGkvc291bmQvdGx2LmgKQEAgLTI4LDQgKzI4LDczIEBACiAjZGVmaW5lIFNORFJWX0NUTF9UTFZUX0NITUFQX1ZBUgkweDEwMgkvKiBjaGFubmVscyBmcmVlbHkgc3dhcHBhYmxlICovCiAjZGVmaW5lIFNORFJWX0NUTF9UTFZUX0NITUFQX1BBSVJFRAkweDEwMwkvKiBwYWlyLXdpc2Ugc3dhcHBhYmxlICovCiAKKy8qCisgKiBUTFYgc3RydWN0dXJlIGlzIHJpZ2h0IGJlaGluZCB0aGUgc3RydWN0IHNuZF9jdGxfdGx2OgorICogICB1bnNpZ25lZCBpbnQgdHlwZSAgCS0gc2VlIFNORFJWX0NUTF9UTFZUXyoKKyAqICAgdW5zaWduZWQgaW50IGxlbmd0aAorICogICAuLi4uIGRhdGEgYWxpZ25lZCB0byBzaXplb2YodW5zaWduZWQgaW50KSwgdXNlCisgKiAgICAgICAgYmxvY2tfbGVuZ3RoID0gKGxlbmd0aCArIChzaXplb2YodW5zaWduZWQgaW50KSAtIDEpKSAmCisgKiAgICAgICAgICAgICAgICAgICAgICAgfihzaXplb2YodW5zaWduZWQgaW50KSAtIDEpKSAuLi4uCisgKi8KKyNkZWZpbmUgU05EUlZfQ1RMX1RMVkRfSVRFTSh0eXBlLCAuLi4pIFwKKwkodHlwZSksIFNORFJWX0NUTF9UTFZEX0xFTkdUSChfX1ZBX0FSR1NfXyksIF9fVkFfQVJHU19fCisjZGVmaW5lIFNORFJWX0NUTF9UTFZEX0xFTkdUSCguLi4pIFwKKwkoKHVuc2lnbmVkIGludClzaXplb2YoKGNvbnN0IHVuc2lnbmVkIGludFtdKSB7IF9fVkFfQVJHU19fIH0pKQorCisjZGVmaW5lIFNORFJWX0NUTF9UTFZEX0NPTlRBSU5FUl9JVEVNKC4uLikgXAorCVNORFJWX0NUTF9UTFZEX0lURU0oU05EUlZfQ1RMX1RMVlRfQ09OVEFJTkVSLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU05EUlZfQ1RMX1RMVkRfREVDTEFSRV9DT05UQUlORVIobmFtZSwgLi4uKSBcCisJdW5zaWduZWQgaW50IG5hbWVbXSA9IHsgXAorCQlTTkRSVl9DVExfVExWRF9DT05UQUlORVJfSVRFTShfX1ZBX0FSR1NfXykgXAorCX0KKworI2RlZmluZSBTTkRSVl9DVExfVExWRF9EQl9TQ0FMRV9NQVNLCTB4ZmZmZgorI2RlZmluZSBTTkRSVl9DVExfVExWRF9EQl9TQ0FMRV9NVVRFCTB4MTAwMDAKKyNkZWZpbmUgU05EUlZfQ1RMX1RMVkRfREJfU0NBTEVfSVRFTShtaW4sIHN0ZXAsIG11dGUpIFwKKwlTTkRSVl9DVExfVExWRF9JVEVNKFNORFJWX0NUTF9UTFZUX0RCX1NDQUxFLCBcCisJCQkgICAgKG1pbiksIFwKKwkJCSAgICAoKHN0ZXApICYgU05EUlZfQ1RMX1RMVkRfREJfU0NBTEVfTUFTSykgfCBcCisJCQkgICAgICgobXV0ZSkgPyBTTkRSVl9DVExfVExWRF9EQl9TQ0FMRV9NVVRFIDogMCkpCisjZGVmaW5lIFNORFJWX0NUTF9UTFZEX0RFQ0xBUkVfREJfU0NBTEUobmFtZSwgbWluLCBzdGVwLCBtdXRlKSBcCisJdW5zaWduZWQgaW50IG5hbWVbXSA9IHsgXAorCQlTTkRSVl9DVExfVExWRF9EQl9TQ0FMRV9JVEVNKG1pbiwgc3RlcCwgbXV0ZSkgXAorCX0KKworLyogZEIgc2NhbGUgc3BlY2lmaWVkIHdpdGggbWluL21heCB2YWx1ZXMgaW5zdGVhZCBvZiBzdGVwICovCisjZGVmaW5lIFNORFJWX0NUTF9UTFZEX0RCX01JTk1BWF9JVEVNKG1pbl9kQiwgbWF4X2RCKSBcCisJU05EUlZfQ1RMX1RMVkRfSVRFTShTTkRSVl9DVExfVExWVF9EQl9NSU5NQVgsIChtaW5fZEIpLCAobWF4X2RCKSkKKyNkZWZpbmUgU05EUlZfQ1RMX1RMVkRfREJfTUlOTUFYX01VVEVfSVRFTShtaW5fZEIsIG1heF9kQikgXAorCVNORFJWX0NUTF9UTFZEX0lURU0oU05EUlZfQ1RMX1RMVlRfREJfTUlOTUFYX01VVEUsIChtaW5fZEIpLCAobWF4X2RCKSkKKyNkZWZpbmUgU05EUlZfQ1RMX1RMVkRfREVDTEFSRV9EQl9NSU5NQVgobmFtZSwgbWluX2RCLCBtYXhfZEIpIFwKKwl1bnNpZ25lZCBpbnQgbmFtZVtdID0geyBcCisJCVNORFJWX0NUTF9UTFZEX0RCX01JTk1BWF9JVEVNKG1pbl9kQiwgbWF4X2RCKSBcCisJfQorI2RlZmluZSBTTkRSVl9DVExfVExWRF9ERUNMQVJFX0RCX01JTk1BWF9NVVRFKG5hbWUsIG1pbl9kQiwgbWF4X2RCKSBcCisJdW5zaWduZWQgaW50IG5hbWVbXSA9IHsgXAorCQlTTkRSVl9DVExfVExWRF9EQl9NSU5NQVhfTVVURV9JVEVNKG1pbl9kQiwgbWF4X2RCKSBcCisJfQorCisvKiBsaW5lYXIgdm9sdW1lIGJldHdlZW4gbWluX2RCIGFuZCBtYXhfZEIgKC4wMWRCIHVuaXQpICovCisjZGVmaW5lIFNORFJWX0NUTF9UTFZEX0RCX0xJTkVBUl9JVEVNKG1pbl9kQiwgbWF4X2RCKSBcCisJU05EUlZfQ1RMX1RMVkRfSVRFTShTTkRSVl9DVExfVExWVF9EQl9MSU5FQVIsIChtaW5fZEIpLCAobWF4X2RCKSkKKyNkZWZpbmUgU05EUlZfQ1RMX1RMVkRfREVDTEFSRV9EQl9MSU5FQVIobmFtZSwgbWluX2RCLCBtYXhfZEIpIFwKKwl1bnNpZ25lZCBpbnQgbmFtZVtdID0geyBcCisJCVNORFJWX0NUTF9UTFZEX0RCX0xJTkVBUl9JVEVNKG1pbl9kQiwgbWF4X2RCKSBcCisJfQorCisvKiBkQiByYW5nZSBjb250YWluZXI6CisgKiBJdGVtcyBpbiBkQiByYW5nZSBjb250YWluZXIgbXVzdCBiZSBvcmRlcmVkIGJ5IHRoZWlyIHZhbHVlcyBhbmQgYnkgdGhlaXIKKyAqIGRCIHZhbHVlcy4gVGhpcyBpbXBsaWVzIHRoYXQgbGFyZ2VyIHZhbHVlcyBtdXN0IGNvcnJlc3BvbmQgd2l0aCBsYXJnZXIKKyAqIGRCIHZhbHVlcyAod2hpY2ggaXMgYWxzbyByZXF1aXJlZCBmb3IgYWxsIG90aGVyIG1peGVyIGNvbnRyb2xzKS4KKyAqLworLyogRWFjaCBpdGVtIGlzOiA8bWluPiA8bWF4PiA8VExWPiAqLworI2RlZmluZSBTTkRSVl9DVExfVExWRF9EQl9SQU5HRV9JVEVNKC4uLikgXAorCVNORFJWX0NUTF9UTFZEX0lURU0oU05EUlZfQ1RMX1RMVlRfREJfUkFOR0UsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTTkRSVl9DVExfVExWRF9ERUNMQVJFX0RCX1JBTkdFKG5hbWUsIC4uLikgXAorCXVuc2lnbmVkIGludCBuYW1lW10gPSB7IFwKKwkJU05EUlZfQ1RMX1RMVkRfREJfUkFOR0VfSVRFTShfX1ZBX0FSR1NfXykgXAorCX0KKworI2RlZmluZSBTTkRSVl9DVExfVExWRF9EQl9HQUlOX01VVEUJLTk5OTk5OTkKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi9pbnRlcmZhY2Uvc2NoZWQuaCBiL2luY2x1ZGUveGVuL2ludGVyZmFjZS9zY2hlZC5oCmluZGV4IGYxODQ5MDkuLmE0YzRkNzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveGVuL2ludGVyZmFjZS9zY2hlZC5oCisrKyBiL2luY2x1ZGUveGVuL2ludGVyZmFjZS9zY2hlZC5oCkBAIC0zLDYgKzMsMjQgQEAKICAqCiAgKiBTY2hlZHVsZXIgc3RhdGUgaW50ZXJhY3Rpb25zCiAgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvCisgKiBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZQorICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKICAqIENvcHlyaWdodCAoYykgMjAwNSwgS2VpciBGcmFzZXIgPGtlaXJAeGVuc291cmNlLmNvbT4KICAqLwogCkBAIC0xMiwxOCArMzAsMzAgQEAKICNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL2V2ZW50X2NoYW5uZWwuaD4KIAogLyoKKyAqIEd1ZXN0IFNjaGVkdWxlciBPcGVyYXRpb25zCisgKgorICogVGhlIFNDSEVET1AgaW50ZXJmYWNlIHByb3ZpZGVzIG1lY2hhbmlzbXMgZm9yIGEgZ3Vlc3QgdG8gaW50ZXJhY3QKKyAqIHdpdGggdGhlIHNjaGVkdWxlciwgaW5jbHVkaW5nIHlpZWxkLCBibG9ja2luZyBhbmQgc2h1dHRpbmcgaXRzZWxmCisgKiBkb3duLgorICovCisKKy8qCiAgKiBUaGUgcHJvdG90eXBlIGZvciB0aGlzIGh5cGVyY2FsbCBpczoKLSAqICBsb25nIHNjaGVkX29wX25ldyhpbnQgY21kLCB2b2lkICphcmcpCisgKiBsb25nIEhZUEVSVklTT1Jfc2NoZWRfb3AoZW51bSBzY2hlZF9vcCBjbWQsIHZvaWQgKmFyZywgLi4uKQorICoKICAqIEBjbWQgPT0gU0NIRURPUF8/Pz8gKHNjaGVkdWxlciBvcGVyYXRpb24pLgogICogQGFyZyA9PSBPcGVyYXRpb24tc3BlY2lmaWMgZXh0cmEgYXJndW1lbnQocyksIGFzIGRlc2NyaWJlZCBiZWxvdy4KKyAqIC4uLiAgPT0gQWRkaXRpb25hbCBPcGVyYXRpb24tc3BlY2lmaWMgZXh0cmEgYXJndW1lbnRzLCBkZXNjcmliZWQgYmVsb3cuCiAgKgotICogKipOT1RFKio6Ci0gKiBWZXJzaW9ucyBvZiBYZW4gcHJpb3IgdG8gMy4wLjIgcHJvdmlkZSBvbmx5IHRoZSBmb2xsb3dpbmcgbGVnYWN5IHZlcnNpb24KKyAqIFZlcnNpb25zIG9mIFhlbiBwcmlvciB0byAzLjAuMiBwcm92aWRlZCBvbmx5IHRoZSBmb2xsb3dpbmcgbGVnYWN5IHZlcnNpb24KICAqIG9mIHRoaXMgaHlwZXJjYWxsLCBzdXBwb3J0aW5nIG9ubHkgdGhlIGNvbW1hbmRzIHlpZWxkLCBibG9jayBhbmQgc2h1dGRvd246CiAgKiAgbG9uZyBzY2hlZF9vcChpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKICAqIEBjbWQgPT0gU0NIRURPUF8/Pz8gKHNjaGVkdWxlciBvcGVyYXRpb24pLgogICogQGFyZyA9PSAwICAgICAgICAgICAgICAgKFNDSEVET1BfeWllbGQgYW5kIFNDSEVET1BfYmxvY2spCiAgKiAgICAgID09IFNIVVRET1dOXyogY29kZSAoU0NIRURPUF9zaHV0ZG93bikKKyAqCisgKiBUaGlzIGxlZ2FjeSB2ZXJzaW9uIGlzIGF2YWlsYWJsZSB0byBuZXcgZ3Vlc3RzIGFzOgorICogbG9uZyBIWVBFUlZJU09SX3NjaGVkX29wX2NvbXBhdChlbnVtIHNjaGVkX29wIGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiAgKi8KIAogLyoKQEAgLTQ0LDEyICs3NCwxNyBAQAogLyoKICAqIEhhbHQgZXhlY3V0aW9uIG9mIHRoaXMgZG9tYWluIChhbGwgVkNQVXMpIGFuZCBub3RpZnkgdGhlIHN5c3RlbSBjb250cm9sbGVyLgogICogQGFyZyA9PSBwb2ludGVyIHRvIHNjaGVkX3NodXRkb3duIHN0cnVjdHVyZS4KKyAqCisgKiBJZiB0aGUgc2NoZWRfc2h1dGRvd25fdCByZWFzb24gaXMgU0hVVERPV05fc3VzcGVuZCB0aGVuCisgKiB4ODYgUFYgZ3Vlc3RzIG11c3QgYWxzbyBzZXQgUkRYIChFRFggZm9yIDMyLWJpdCBndWVzdHMpIHRvIHRoZSBNRk4KKyAqIG9mIHRoZSBndWVzdCdzIHN0YXJ0IGluZm8gcGFnZS4gIFJEWC9FRFggaXMgdGhlIHRoaXJkIGh5cGVyY2FsbAorICogYXJndW1lbnQuCisgKgorICogSW4gYWRkaXRpb24sIHdoaWNoIHJlYXNvbiBpcyBTSFVURE9XTl9zdXNwZW5kIHRoaXMgaHlwZXJjYWxsCisgKiByZXR1cm5zIDEgaWYgc3VzcGVuZCB3YXMgY2FuY2VsbGVkIG9yIHRoZSBkb21haW4gd2FzIG1lcmVseQorICogY2hlY2twb2ludGVkLCBhbmQgMCBpZiBpdCBpcyByZXN1bWluZyBpbiBhIG5ldyBkb21haW4uCiAgKi8KICNkZWZpbmUgU0NIRURPUF9zaHV0ZG93biAgICAyCi1zdHJ1Y3Qgc2NoZWRfc2h1dGRvd24gewotICAgIHVuc2lnbmVkIGludCByZWFzb247IC8qIFNIVVRET1dOXyogKi8KLX07Ci1ERUZJTkVfR1VFU1RfSEFORExFX1NUUlVDVChzY2hlZF9zaHV0ZG93bik7CiAKIC8qCiAgKiBQb2xsIGEgc2V0IG9mIGV2ZW50LWNoYW5uZWwgcG9ydHMuIFJldHVybiB3aGVuIG9uZSBvciBtb3JlIGFyZSBwZW5kaW5nLiBBbgpAQCAtNTcsMTIgKzkyLDYgQEAKICAqIEBhcmcgPT0gcG9pbnRlciB0byBzY2hlZF9wb2xsIHN0cnVjdHVyZS4KICAqLwogI2RlZmluZSBTQ0hFRE9QX3BvbGwgICAgICAgIDMKLXN0cnVjdCBzY2hlZF9wb2xsIHsKLSAgICBHVUVTVF9IQU5ETEUoZXZ0Y2huX3BvcnRfdCkgcG9ydHM7Ci0gICAgdW5zaWduZWQgaW50IG5yX3BvcnRzOwotICAgIHVpbnQ2NF90IHRpbWVvdXQ7Ci19OwotREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1Qoc2NoZWRfcG9sbCk7CiAKIC8qCiAgKiBEZWNsYXJlIGEgc2h1dGRvd24gZm9yIGFub3RoZXIgZG9tYWluLiBUaGUgbWFpbiB1c2Ugb2YgdGhpcyBmdW5jdGlvbiBpcwpAQCAtNzEsMTUgKzEwMCwxMSBAQAogICogQGFyZyA9PSBwb2ludGVyIHRvIHNjaGVkX3JlbW90ZV9zaHV0ZG93biBzdHJ1Y3R1cmUuCiAgKi8KICNkZWZpbmUgU0NIRURPUF9yZW1vdGVfc2h1dGRvd24gICAgICAgIDQKLXN0cnVjdCBzY2hlZF9yZW1vdGVfc2h1dGRvd24gewotICAgIGRvbWlkX3QgZG9tYWluX2lkOyAgICAgICAgIC8qIFJlbW90ZSBkb21haW4gSUQgKi8KLSAgICB1bnNpZ25lZCBpbnQgcmVhc29uOyAgICAgICAvKiBTSFVURE9XTl94eHggcmVhc29uICovCi19OwogCiAvKgogICogTGF0Y2ggYSBzaHV0ZG93biBjb2RlLCBzbyB0aGF0IHdoZW4gdGhlIGRvbWFpbiBsYXRlciBzaHV0cyBkb3duIGl0CiAgKiByZXBvcnRzIHRoaXMgY29kZSB0byB0aGUgY29udHJvbCB0b29scy4KLSAqIEBhcmcgPT0gYXMgZm9yIFNDSEVET1Bfc2h1dGRvd24uCisgKiBAYXJnID09IHNjaGVkX3NodXRkb3duLCBhcyBmb3IgU0NIRURPUF9zaHV0ZG93bi4KICAqLwogI2RlZmluZSBTQ0hFRE9QX3NodXRkb3duX2NvZGUgNQogCkBAIC05MiwxMCArMTE3LDQ3IEBACiAgKiBXaXRoIGlkICE9IDAgYW5kIHRpbWVvdXQgIT0gMCwgcG9rZSB3YXRjaGRvZyB0aW1lciBhbmQgc2V0IG5ldyB0aW1lb3V0LgogICovCiAjZGVmaW5lIFNDSEVET1Bfd2F0Y2hkb2cgICAgNgorCisvKgorICogT3ZlcnJpZGUgdGhlIGN1cnJlbnQgdmNwdSBhZmZpbml0eSBieSBwaW5uaW5nIGl0IHRvIG9uZSBwaHlzaWNhbCBjcHUgb3IKKyAqIHVuZG8gdGhpcyBvdmVycmlkZSByZXN0b3JpbmcgdGhlIHByZXZpb3VzIGFmZmluaXR5LgorICogQGFyZyA9PSBwb2ludGVyIHRvIHNjaGVkX3Bpbl9vdmVycmlkZSBzdHJ1Y3R1cmUuCisgKgorICogQSBuZWdhdGl2ZSBwY3B1IHZhbHVlIHdpbGwgdW5kbyBhIHByZXZpb3VzIHBpbiBvdmVycmlkZSBhbmQgcmVzdG9yZSB0aGUKKyAqIHByZXZpb3VzIGNwdSBhZmZpbml0eS4KKyAqIFRoaXMgY2FsbCBpcyBhbGxvd2VkIGZvciB0aGUgaGFyZHdhcmUgZG9tYWluIG9ubHkgYW5kIHJlcXVpcmVzIHRoZSBjcHUKKyAqIHRvIGJlIHBhcnQgb2YgdGhlIGRvbWFpbidzIGNwdXBvb2wuCisgKi8KKyNkZWZpbmUgU0NIRURPUF9waW5fb3ZlcnJpZGUgNworCitzdHJ1Y3Qgc2NoZWRfc2h1dGRvd24geworICAgIHVuc2lnbmVkIGludCByZWFzb247IC8qIFNIVVRET1dOXyogPT4gc2h1dGRvd24gcmVhc29uICovCit9OworREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1Qoc2NoZWRfc2h1dGRvd24pOworCitzdHJ1Y3Qgc2NoZWRfcG9sbCB7CisgICAgR1VFU1RfSEFORExFKGV2dGNobl9wb3J0X3QpIHBvcnRzOworICAgIHVuc2lnbmVkIGludCBucl9wb3J0czsKKyAgICB1aW50NjRfdCB0aW1lb3V0OworfTsKK0RFRklORV9HVUVTVF9IQU5ETEVfU1RSVUNUKHNjaGVkX3BvbGwpOworCitzdHJ1Y3Qgc2NoZWRfcmVtb3RlX3NodXRkb3duIHsKKyAgICBkb21pZF90IGRvbWFpbl9pZDsgICAgICAgICAvKiBSZW1vdGUgZG9tYWluIElEICovCisgICAgdW5zaWduZWQgaW50IHJlYXNvbjsgICAgICAgLyogU0hVVERPV05fKiA9PiBzaHV0ZG93biByZWFzb24gKi8KK307CitERUZJTkVfR1VFU1RfSEFORExFX1NUUlVDVChzY2hlZF9yZW1vdGVfc2h1dGRvd24pOworCiBzdHJ1Y3Qgc2NoZWRfd2F0Y2hkb2cgewogICAgIHVpbnQzMl90IGlkOyAgICAgICAgICAgICAgICAvKiB3YXRjaGRvZyBJRCAqLwogICAgIHVpbnQzMl90IHRpbWVvdXQ7ICAgICAgICAgICAvKiB0aW1lb3V0ICovCiB9OworREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1Qoc2NoZWRfd2F0Y2hkb2cpOworCitzdHJ1Y3Qgc2NoZWRfcGluX292ZXJyaWRlIHsKKyAgICBpbnQzMl90IHBjcHU7Cit9OworREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1Qoc2NoZWRfcGluX292ZXJyaWRlKTsKIAogLyoKICAqIFJlYXNvbiBjb2RlcyBmb3IgU0NIRURPUF9zaHV0ZG93bi4gVGhlc2UgbWF5IGJlIGludGVycHJldGVkIGJ5IGNvbnRyb2wKQEAgLTEwNyw2ICsxNjksNyBAQAogI2RlZmluZSBTSFVURE9XTl9zdXNwZW5kICAgIDIgIC8qIENsZWFuIHVwLCBzYXZlIHN1c3BlbmQgaW5mbywga2lsbC4gICAgICAgICAqLwogI2RlZmluZSBTSFVURE9XTl9jcmFzaCAgICAgIDMgIC8qIFRlbGwgY29udHJvbGxlciB3ZSd2ZSBjcmFzaGVkLiAgICAgICAgICAgICAqLwogI2RlZmluZSBTSFVURE9XTl93YXRjaGRvZyAgIDQgIC8qIFJlc3RhcnQgYmVjYXVzZSB3YXRjaGRvZyB0aW1lIGV4cGlyZWQuICAgICAqLworCiAvKgogICogRG9tYWluIGFza2VkIHRvIHBlcmZvcm0gJ3NvZnQgcmVzZXQnIGZvciBpdC4gVGhlIGV4cGVjdGVkIGJlaGF2aW9yIGlzIHRvCiAgKiByZXNldCBpbnRlcm5hbCBYZW4gc3RhdGUgZm9yIHRoZSBkb21haW4gcmV0dXJuaW5nIGl0IHRvIHRoZSBwb2ludCB3aGVyZSBpdApAQCAtMTE1LDUgKzE3OCw2IEBACiAgKiBpbnRlcmZhY2VzIGFnYWluLgogICovCiAjZGVmaW5lIFNIVVRET1dOX3NvZnRfcmVzZXQgNQorI2RlZmluZSBTSFVURE9XTl9NQVggICAgICAgIDUgIC8qIE1heGltdW0gdmFsaWQgc2h1dGRvd24gcmVhc29uLiAgICAgICAgICAgICAqLwogCiAjZW5kaWYgLyogX19YRU5fUFVCTElDX1NDSEVEX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS94ZW4veGVuLW9wcy5oIGIvaW5jbHVkZS94ZW4veGVuLW9wcy5oCmluZGV4IDlhMzdjNTQxLi5iNTQ4NmU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3hlbi94ZW4tb3BzLmgKKysrIGIvaW5jbHVkZS94ZW4veGVuLW9wcy5oCkBAIC05LDggKzksOCBAQAogCiBERUNMQVJFX1BFUl9DUFUoc3RydWN0IHZjcHVfaW5mbyAqLCB4ZW5fdmNwdSk7CiAKLURFQ0xBUkVfUEVSX0NQVShpbnQsIHhlbl92Y3B1X2lkKTsKLXN0YXRpYyBpbmxpbmUgaW50IHhlbl92Y3B1X25yKGludCBjcHUpCitERUNMQVJFX1BFUl9DUFUodWludDMyX3QsIHhlbl92Y3B1X2lkKTsKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgeGVuX3ZjcHVfbnIoaW50IGNwdSkKIHsKIAlyZXR1cm4gcGVyX2NwdSh4ZW5fdmNwdV9pZCwgY3B1KTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL3hlbi5oIGIvaW5jbHVkZS94ZW4veGVuLmgKaW5kZXggMGMwZTNlZi4uZjBmMDI1MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS94ZW4veGVuLmgKKysrIGIvaW5jbHVkZS94ZW4veGVuLmgKQEAgLTM4LDggKzM4LDcgQEAKICAqLwogI2luY2x1ZGUgPHhlbi9mZWF0dXJlcy5oPgogI2RlZmluZSB4ZW5fcHZoX2RvbWFpbigpICh4ZW5fcHZfZG9tYWluKCkgJiYgXAotCQkJICB4ZW5fZmVhdHVyZShYRU5GRUFUX2F1dG9fdHJhbnNsYXRlZF9waHlzbWFwKSAmJiBcCi0JCQkgIHhlbl9oYXZlX3ZlY3Rvcl9jYWxsYmFjaykKKwkJCSAgeGVuX2ZlYXR1cmUoWEVORkVBVF9hdXRvX3RyYW5zbGF0ZWRfcGh5c21hcCkpCiAjZWxzZQogI2RlZmluZSB4ZW5fcHZoX2RvbWFpbigpCSgwKQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbml0L0tjb25maWcgYi9pbml0L0tjb25maWcKaW5kZXggY2FjM2YwOS4uM2I5YTQ3ZiAxMDA2NDQKLS0tIGEvaW5pdC9LY29uZmlnCisrKyBiL2luaXQvS2NvbmZpZwpAQCAtMjYsNiArMjYsMTYgQEAKIGNvbmZpZyBCVUlMRFRJTUVfRVhUQUJMRV9TT1JUCiAJYm9vbAogCitjb25maWcgVEhSRUFEX0lORk9fSU5fVEFTSworCWJvb2wKKwloZWxwCisJICBTZWxlY3QgdGhpcyB0byBtb3ZlIHRocmVhZF9pbmZvIG9mZiB0aGUgc3RhY2sgaW50byB0YXNrX3N0cnVjdC4gIFRvCisJICBtYWtlIHRoaXMgd29yaywgYW4gYXJjaCB3aWxsIG5lZWQgdG8gcmVtb3ZlIGFsbCB0aHJlYWRfaW5mbyBmaWVsZHMKKwkgIGV4Y2VwdCBmbGFncyBhbmQgZml4IGFueSBydW50aW1lIGJ1Z3MuCisKKwkgIE9uZSBzdWJ0bGUgY2hhbmdlIHRoYXQgd2lsbCBiZSBuZWVkZWQgaXMgdG8gdXNlIHRyeV9nZXRfdGFza19zdGFjaygpCisJICBhbmQgcHV0X3Rhc2tfc3RhY2soKSBpbiBzYXZlX3RocmVhZF9zdGFja190c2soKSBhbmQgZ2V0X3djaGFuKCkuCisKIG1lbnUgIkdlbmVyYWwgc2V0dXAiCiAKIGNvbmZpZyBCUk9LRU4KZGlmZiAtLWdpdCBhL2luaXQvaW5pdF90YXNrLmMgYi9pbml0L2luaXRfdGFzay5jCmluZGV4IGJhMGE3ZjM2Li4xMWY4M2JlMSAxMDA2NDQKLS0tIGEvaW5pdC9pbml0X3Rhc2suYworKysgYi9pbml0L2luaXRfdGFzay5jCkBAIC0yMiw1ICsyMiw4IEBACiAgKiBJbml0aWFsIHRocmVhZCBzdHJ1Y3R1cmUuIEFsaWdubWVudCBvZiB0aGlzIGlzIGhhbmRsZWQgYnkgYSBzcGVjaWFsCiAgKiBsaW5rZXIgbWFwIGVudHJ5LgogICovCi11bmlvbiB0aHJlYWRfdW5pb24gaW5pdF90aHJlYWRfdW5pb24gX19pbml0X3Rhc2tfZGF0YSA9Ci0JeyBJTklUX1RIUkVBRF9JTkZPKGluaXRfdGFzaykgfTsKK3VuaW9uIHRocmVhZF91bmlvbiBpbml0X3RocmVhZF91bmlvbiBfX2luaXRfdGFza19kYXRhID0geworI2lmbmRlZiBDT05GSUdfVEhSRUFEX0lORk9fSU5fVEFTSworCUlOSVRfVEhSRUFEX0lORk8oaW5pdF90YXNrKQorI2VuZGlmCit9OwpkaWZmIC0tZ2l0IGEvaXBjL25hbWVzcGFjZS5jIGIvaXBjL25hbWVzcGFjZS5jCmluZGV4IGQ4N2U2YmEuLjBhYmRlYTQgMTAwNjQ0Ci0tLSBhL2lwYy9uYW1lc3BhY2UuYworKysgYi9pcGMvbmFtZXNwYWNlLmMKQEAgLTE2LDM5ICsxNiw2MSBAQAogCiAjaW5jbHVkZSAidXRpbC5oIgogCitzdGF0aWMgc3RydWN0IHVjb3VudHMgKmluY19pcGNfbmFtZXNwYWNlcyhzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zKQoreworCXJldHVybiBpbmNfdWNvdW50KG5zLCBjdXJyZW50X2V1aWQoKSwgVUNPVU5UX0lQQ19OQU1FU1BBQ0VTKTsKK30KKworc3RhdGljIHZvaWQgZGVjX2lwY19uYW1lc3BhY2VzKHN0cnVjdCB1Y291bnRzICp1Y291bnRzKQoreworCWRlY191Y291bnQodWNvdW50cywgVUNPVU5UX0lQQ19OQU1FU1BBQ0VTKTsKK30KKwogc3RhdGljIHN0cnVjdCBpcGNfbmFtZXNwYWNlICpjcmVhdGVfaXBjX25zKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdXNlcl9ucywKIAkJCQkJICAgc3RydWN0IGlwY19uYW1lc3BhY2UgKm9sZF9ucykKIHsKIAlzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnM7CisJc3RydWN0IHVjb3VudHMgKnVjb3VudHM7CiAJaW50IGVycjsKIAorCWVyciA9IC1FTk9TUEM7CisJdWNvdW50cyA9IGluY19pcGNfbmFtZXNwYWNlcyh1c2VyX25zKTsKKwlpZiAoIXVjb3VudHMpCisJCWdvdG8gZmFpbDsKKworCWVyciA9IC1FTk9NRU07CiAJbnMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXBjX25hbWVzcGFjZSksIEdGUF9LRVJORUwpOwogCWlmIChucyA9PSBOVUxMKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwkJZ290byBmYWlsX2RlYzsKIAogCWVyciA9IG5zX2FsbG9jX2ludW0oJm5zLT5ucyk7Ci0JaWYgKGVycikgewotCQlrZnJlZShucyk7Ci0JCXJldHVybiBFUlJfUFRSKGVycik7Ci0JfQorCWlmIChlcnIpCisJCWdvdG8gZmFpbF9mcmVlOwogCW5zLT5ucy5vcHMgPSAmaXBjbnNfb3BlcmF0aW9uczsKIAogCWF0b21pY19zZXQoJm5zLT5jb3VudCwgMSk7CiAJbnMtPnVzZXJfbnMgPSBnZXRfdXNlcl9ucyh1c2VyX25zKTsKKwlucy0+dWNvdW50cyA9IHVjb3VudHM7CiAKIAllcnIgPSBtcV9pbml0X25zKG5zKTsKLQlpZiAoZXJyKSB7Ci0JCXB1dF91c2VyX25zKG5zLT51c2VyX25zKTsKLQkJbnNfZnJlZV9pbnVtKCZucy0+bnMpOwotCQlrZnJlZShucyk7Ci0JCXJldHVybiBFUlJfUFRSKGVycik7Ci0JfQorCWlmIChlcnIpCisJCWdvdG8gZmFpbF9wdXQ7CiAKIAlzZW1faW5pdF9ucyhucyk7CiAJbXNnX2luaXRfbnMobnMpOwogCXNobV9pbml0X25zKG5zKTsKIAogCXJldHVybiBuczsKKworZmFpbF9wdXQ6CisJcHV0X3VzZXJfbnMobnMtPnVzZXJfbnMpOworCW5zX2ZyZWVfaW51bSgmbnMtPm5zKTsKK2ZhaWxfZnJlZToKKwlrZnJlZShucyk7CitmYWlsX2RlYzoKKwlkZWNfaXBjX25hbWVzcGFjZXModWNvdW50cyk7CitmYWlsOgorCXJldHVybiBFUlJfUFRSKGVycik7CiB9CiAKIHN0cnVjdCBpcGNfbmFtZXNwYWNlICpjb3B5X2lwY3ModW5zaWduZWQgbG9uZyBmbGFncywKQEAgLTk2LDYgKzExOCw3IEBACiAJbXNnX2V4aXRfbnMobnMpOwogCXNobV9leGl0X25zKG5zKTsKIAorCWRlY19pcGNfbmFtZXNwYWNlcyhucy0+dWNvdW50cyk7CiAJcHV0X3VzZXJfbnMobnMtPnVzZXJfbnMpOwogCW5zX2ZyZWVfaW51bSgmbnMtPm5zKTsKIAlrZnJlZShucyk7CkBAIC0xNjUsMTAgKzE4OCwxNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IHVzZXJfbmFtZXNwYWNlICppcGNuc19vd25lcihzdHJ1Y3QgbnNfY29tbW9uICpucykKK3sKKwlyZXR1cm4gdG9faXBjX25zKG5zKS0+dXNlcl9uczsKK30KKwogY29uc3Qgc3RydWN0IHByb2NfbnNfb3BlcmF0aW9ucyBpcGNuc19vcGVyYXRpb25zID0gewogCS5uYW1lCQk9ICJpcGMiLAogCS50eXBlCQk9IENMT05FX05FV0lQQywKIAkuZ2V0CQk9IGlwY25zX2dldCwKIAkucHV0CQk9IGlwY25zX3B1dCwKIAkuaW5zdGFsbAk9IGlwY25zX2luc3RhbGwsCisJLm93bmVyCQk9IGlwY25zX293bmVyLAogfTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9NYWtlZmlsZSBiL2tlcm5lbC9NYWtlZmlsZQppbmRleCBlMmVjNTRlLi5lYjI2ZTEyYyAxMDA2NDQKLS0tIGEva2VybmVsL01ha2VmaWxlCisrKyBiL2tlcm5lbC9NYWtlZmlsZQpAQCAtOSw3ICs5LDcgQEAKIAkgICAgZXh0YWJsZS5vIHBhcmFtcy5vIFwKIAkgICAga3RocmVhZC5vIHN5c19uaS5vIG5zcHJveHkubyBcCiAJICAgIG5vdGlmaWVyLm8ga3N5c2ZzLm8gY3JlZC5vIHJlYm9vdC5vIFwKLQkgICAgYXN5bmMubyByYW5nZS5vIHNtcGJvb3QubworCSAgICBhc3luYy5vIHJhbmdlLm8gc21wYm9vdC5vIHVjb3VudC5vCiAKIG9iai0kKENPTkZJR19NVUxUSVVTRVIpICs9IGdyb3Vwcy5vCiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9hdWRpdC5jIGIva2VybmVsL2F1ZGl0LmMKaW5kZXggYThhOTFiZC4uZjFjYTExNiAxMDA2NDQKLS0tIGEva2VybmVsL2F1ZGl0LmMKKysrIGIva2VybmVsL2F1ZGl0LmMKQEAgLTg3Nyw2ICs4NzcsMTIgQEAKIAkJCQlyZXR1cm4gZXJyOwogCQl9CiAJCWlmIChzLm1hc2sgJiBBVURJVF9TVEFUVVNfUElEKSB7CisJCQkvKiBOT1RFOiB3ZSBhcmUgdXNpbmcgdGFza190Z2lkX3ZucigpIGJlbG93IGJlY2F1c2UKKwkJCSAqICAgICAgIHRoZSBzLnBpZCB2YWx1ZSBpcyByZWxhdGl2ZSB0byB0aGUgbmFtZXNwYWNlCisJCQkgKiAgICAgICBvZiB0aGUgY2FsbGVyOyBhdCBwcmVzZW50IHRoaXMgZG9lc24ndCBtYXR0ZXIKKwkJCSAqICAgICAgIG11Y2ggc2luY2UgeW91IGNhbiByZWFsbHkgb25seSBydW4gYXVkaXRkCisJCQkgKiAgICAgICBmcm9tIHRoZSBpbml0aWFsIHBpZCBuYW1lc3BhY2UsIGJ1dCBzb21ldGhpbmcKKwkJCSAqICAgICAgIHRvIGtlZXAgaW4gbWluZCBpZiB0aGlzIGNoYW5nZXMgKi8KIAkJCWludCBuZXdfcGlkID0gcy5waWQ7CiAJCQlwaWRfdCByZXF1ZXN0aW5nX3BpZCA9IHRhc2tfdGdpZF92bnIoY3VycmVudCk7CiAKQEAgLTE5MTcsNyArMTkyMyw3IEBACiAJCQkgIiBldWlkPSV1IHN1aWQ9JXUgZnN1aWQ9JXUiCiAJCQkgIiBlZ2lkPSV1IHNnaWQ9JXUgZnNnaWQ9JXUgdHR5PSVzIHNlcz0ldSIsCiAJCQkgdGFza19wcGlkX25yKHRzayksCi0JCQkgdGFza19waWRfbnIodHNrKSwKKwkJCSB0YXNrX3RnaWRfbnIodHNrKSwKIAkJCSBmcm9tX2t1aWQoJmluaXRfdXNlcl9ucywgYXVkaXRfZ2V0X2xvZ2ludWlkKHRzaykpLAogCQkJIGZyb21fa3VpZCgmaW5pdF91c2VyX25zLCBjcmVkLT51aWQpLAogCQkJIGZyb21fa2dpZCgmaW5pdF91c2VyX25zLCBjcmVkLT5naWQpLApkaWZmIC0tZ2l0IGEva2VybmVsL2F1ZGl0X3dhdGNoLmMgYi9rZXJuZWwvYXVkaXRfd2F0Y2guYwppbmRleCBkNjcwOWViLi4wZDMwMmE4IDEwMDY0NAotLS0gYS9rZXJuZWwvYXVkaXRfd2F0Y2guYworKysgYi9rZXJuZWwvYXVkaXRfd2F0Y2guYwpAQCAtMTksNiArMTksNyBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CkBAIC01NDQsMTAgKzU0NSwxMSBAQAogCXVuc2lnbmVkIGxvbmcgaW5vOwogCWRldl90IGRldjsKIAotCXJjdV9yZWFkX2xvY2soKTsKLQlleGVfZmlsZSA9IHJjdV9kZXJlZmVyZW5jZSh0c2stPm1tLT5leGVfZmlsZSk7CisJZXhlX2ZpbGUgPSBnZXRfdGFza19leGVfZmlsZSh0c2spOworCWlmICghZXhlX2ZpbGUpCisJCXJldHVybiAwOwogCWlubyA9IGV4ZV9maWxlLT5mX2lub2RlLT5pX2lubzsKIAlkZXYgPSBleGVfZmlsZS0+Zl9pbm9kZS0+aV9zYi0+c19kZXY7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CisJZnB1dChleGVfZmlsZSk7CiAJcmV0dXJuIGF1ZGl0X21hcmtfY29tcGFyZShtYXJrLCBpbm8sIGRldik7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvYXVkaXRzYy5jIGIva2VybmVsL2F1ZGl0c2MuYwppbmRleCA1YWJmMWRjLi4yY2Q1MjU2IDEwMDY0NAotLS0gYS9rZXJuZWwvYXVkaXRzYy5jCisrKyBiL2tlcm5lbC9hdWRpdHNjLmMKQEAgLTQ1Nyw3ICs0NTcsNyBAQAogCiAJCXN3aXRjaCAoZi0+dHlwZSkgewogCQljYXNlIEFVRElUX1BJRDoKLQkJCXBpZCA9IHRhc2tfcGlkX25yKHRzayk7CisJCQlwaWQgPSB0YXNrX3RnaWRfbnIodHNrKTsKIAkJCXJlc3VsdCA9IGF1ZGl0X2NvbXBhcmF0b3IocGlkLCBmLT5vcCwgZi0+dmFsKTsKIAkJCWJyZWFrOwogCQljYXNlIEFVRElUX1BQSUQ6CkBAIC0xOTkzLDcgKzE5OTMsNyBAQAogCWxvZ2ludWlkID0gZnJvbV9rdWlkKCZpbml0X3VzZXJfbnMsIGtsb2dpbnVpZCksCiAJdHR5ID0gYXVkaXRfZ2V0X3R0eShjdXJyZW50KTsKIAotCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICJwaWQ9JWQgdWlkPSV1IiwgdGFza19waWRfbnIoY3VycmVudCksIHVpZCk7CisJYXVkaXRfbG9nX2Zvcm1hdChhYiwgInBpZD0lZCB1aWQ9JXUiLCB0YXNrX3RnaWRfbnIoY3VycmVudCksIHVpZCk7CiAJYXVkaXRfbG9nX3Rhc2tfY29udGV4dChhYik7CiAJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiBvbGQtYXVpZD0ldSBhdWlkPSV1IHR0eT0lcyBvbGQtc2VzPSV1IHNlcz0ldSByZXM9JWQiLAogCQkJIG9sZGxvZ2ludWlkLCBsb2dpbnVpZCwgdHR5ID8gdHR5X25hbWUodHR5KSA6ICIobm9uZSkiLApAQCAtMjIyMCw3ICsyMjIwLDcgQEAKIHsKIAlzdHJ1Y3QgYXVkaXRfY29udGV4dCAqY29udGV4dCA9IGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQ7CiAKLQljb250ZXh0LT50YXJnZXRfcGlkID0gdGFza19waWRfbnIodCk7CisJY29udGV4dC0+dGFyZ2V0X3BpZCA9IHRhc2tfdGdpZF9ucih0KTsKIAljb250ZXh0LT50YXJnZXRfYXVpZCA9IGF1ZGl0X2dldF9sb2dpbnVpZCh0KTsKIAljb250ZXh0LT50YXJnZXRfdWlkID0gdGFza191aWQodCk7CiAJY29udGV4dC0+dGFyZ2V0X3Nlc3Npb25pZCA9IGF1ZGl0X2dldF9zZXNzaW9uaWQodCk7CkBAIC0yMjQ1LDcgKzIyNDUsNyBAQAogCiAJaWYgKGF1ZGl0X3BpZCAmJiB0LT50Z2lkID09IGF1ZGl0X3BpZCkgewogCQlpZiAoc2lnID09IFNJR1RFUk0gfHwgc2lnID09IFNJR0hVUCB8fCBzaWcgPT0gU0lHVVNSMSB8fCBzaWcgPT0gU0lHVVNSMikgewotCQkJYXVkaXRfc2lnX3BpZCA9IHRhc2tfcGlkX25yKHRzayk7CisJCQlhdWRpdF9zaWdfcGlkID0gdGFza190Z2lkX25yKHRzayk7CiAJCQlpZiAodWlkX3ZhbGlkKHRzay0+bG9naW51aWQpKQogCQkJCWF1ZGl0X3NpZ191aWQgPSB0c2stPmxvZ2ludWlkOwogCQkJZWxzZQpAQCAtMjM0NSw3ICsyMzQ1LDcgQEAKIHZvaWQgX19hdWRpdF9sb2dfY2Fwc2V0KGNvbnN0IHN0cnVjdCBjcmVkICpuZXcsIGNvbnN0IHN0cnVjdCBjcmVkICpvbGQpCiB7CiAJc3RydWN0IGF1ZGl0X2NvbnRleHQgKmNvbnRleHQgPSBjdXJyZW50LT5hdWRpdF9jb250ZXh0OwotCWNvbnRleHQtPmNhcHNldC5waWQgPSB0YXNrX3BpZF9ucihjdXJyZW50KTsKKwljb250ZXh0LT5jYXBzZXQucGlkID0gdGFza190Z2lkX25yKGN1cnJlbnQpOwogCWNvbnRleHQtPmNhcHNldC5jYXAuZWZmZWN0aXZlICAgPSBuZXctPmNhcF9lZmZlY3RpdmU7CiAJY29udGV4dC0+Y2Fwc2V0LmNhcC5pbmhlcml0YWJsZSA9IG5ldy0+Y2FwX2VmZmVjdGl2ZTsKIAljb250ZXh0LT5jYXBzZXQuY2FwLnBlcm1pdHRlZCAgID0gbmV3LT5jYXBfcGVybWl0dGVkOwpAQCAtMjM3Nyw3ICsyMzc3LDcgQEAKIAkJCSBmcm9tX2tnaWQoJmluaXRfdXNlcl9ucywgZ2lkKSwKIAkJCSBzZXNzaW9uaWQpOwogCWF1ZGl0X2xvZ190YXNrX2NvbnRleHQoYWIpOwotCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgcGlkPSVkIGNvbW09IiwgdGFza19waWRfbnIoY3VycmVudCkpOworCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgcGlkPSVkIGNvbW09IiwgdGFza190Z2lkX25yKGN1cnJlbnQpKTsKIAlhdWRpdF9sb2dfdW50cnVzdGVkc3RyaW5nKGFiLCBnZXRfdGFza19jb21tKGNvbW0sIGN1cnJlbnQpKTsKIAlhdWRpdF9sb2dfZF9wYXRoX2V4ZShhYiwgY3VycmVudC0+bW0pOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9hcnJheW1hcC5jIGIva2VybmVsL2JwZi9hcnJheW1hcC5jCmluZGV4IDYzM2E2NTAuLmEyYWMwNTEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9icGYvYXJyYXltYXAuYworKysgYi9rZXJuZWwvYnBmL2FycmF5bWFwLmMKQEAgLTUzOCw3ICs1MzgsNyBAQAogfQogbGF0ZV9pbml0Y2FsbChyZWdpc3Rlcl9wZXJmX2V2ZW50X2FycmF5X21hcCk7CiAKLSNpZmRlZiBDT05GSUdfU09DS19DR1JPVVBfREFUQQorI2lmZGVmIENPTkZJR19DR1JPVVBTCiBzdGF0aWMgdm9pZCAqY2dyb3VwX2ZkX2FycmF5X2dldF9wdHIoc3RydWN0IGJwZl9tYXAgKm1hcCwKIAkJCQkgICAgIHN0cnVjdCBmaWxlICptYXBfZmlsZSAvKiBub3QgdXNlZCAqLywKIAkJCQkgICAgIGludCBmZCkKZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvY29yZS5jIGIva2VybmVsL2JwZi9jb3JlLmMKaW5kZXggMDNmZDIzZC4uYWE2ZDk4MSAxMDA2NDQKLS0tIGEva2VybmVsL2JwZi9jb3JlLmMKKysrIGIva2VybmVsL2JwZi9jb3JlLmMKQEAgLTEwMTgsNyArMTAxOCw3IEBACiAJcHJhbmRvbV9pbml0X29uY2UoJmJwZl91c2VyX3JuZF9zdGF0ZSk7CiB9CiAKLXU2NCBicGZfdXNlcl9ybmRfdTMyKHU2NCByMSwgdTY0IHIyLCB1NjQgcjMsIHU2NCByNCwgdTY0IHI1KQorQlBGX0NBTExfMChicGZfdXNlcl9ybmRfdTMyKQogewogCS8qIFNob3VsZCBzb21lb25lIGV2ZXIgaGF2ZSB0aGUgcmF0aGVyIHVud2lzZSBpZGVhIHRvIHVzZSBzb21lCiAJICogb2YgdGhlIHJlZ2lzdGVycyBwYXNzZWQgaW50byB0aGlzIGZ1bmN0aW9uLCB0aGVuIG5vdGUgdGhhdApAQCAtMTAzMSw3ICsxMDMxLDcgQEAKIAogCXN0YXRlID0gJmdldF9jcHVfdmFyKGJwZl91c2VyX3JuZF9zdGF0ZSk7CiAJcmVzID0gcHJhbmRvbV91MzJfc3RhdGUoc3RhdGUpOwotCXB1dF9jcHVfdmFyKHN0YXRlKTsKKwlwdXRfY3B1X3ZhcihicGZfdXNlcl9ybmRfc3RhdGUpOwogCiAJcmV0dXJuIHJlczsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvaGFzaHRhYi5jIGIva2VybmVsL2JwZi9oYXNodGFiLmMKaW5kZXggZmZmMzY1MC4uNTcwZWVjYSAxMDA2NDQKLS0tIGEva2VybmVsL2JwZi9oYXNodGFiLmMKKysrIGIva2VybmVsL2JwZi9oYXNodGFiLmMKQEAgLTI2LDExICsyNiwxOCBAQAogCXN0cnVjdCBidWNrZXQgKmJ1Y2tldHM7CiAJdm9pZCAqZWxlbXM7CiAJc3RydWN0IHBjcHVfZnJlZWxpc3QgZnJlZWxpc3Q7CisJdm9pZCBfX3BlcmNwdSAqZXh0cmFfZWxlbXM7CiAJYXRvbWljX3QgY291bnQ7CS8qIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIGhhc2h0YWJsZSAqLwogCXUzMiBuX2J1Y2tldHM7CS8qIG51bWJlciBvZiBoYXNoIGJ1Y2tldHMgKi8KIAl1MzIgZWxlbV9zaXplOwkvKiBzaXplIG9mIGVhY2ggZWxlbWVudCBpbiBieXRlcyAqLwogfTsKIAorZW51bSBleHRyYV9lbGVtX3N0YXRlIHsKKwlIVEFCX05PVF9BTl9FWFRSQV9FTEVNID0gMCwKKwlIVEFCX0VYVFJBX0VMRU1fRlJFRSwKKwlIVEFCX0VYVFJBX0VMRU1fVVNFRAorfTsKKwogLyogZWFjaCBodGFiIGVsZW1lbnQgaXMgc3RydWN0IGh0YWJfZWxlbSArIGtleSArIHZhbHVlICovCiBzdHJ1Y3QgaHRhYl9lbGVtIHsKIAl1bmlvbiB7CkBAIC0zOCw3ICs0NSwxMCBAQAogCQlzdHJ1Y3QgYnBmX2h0YWIgKmh0YWI7CiAJCXN0cnVjdCBwY3B1X2ZyZWVsaXN0X25vZGUgZm5vZGU7CiAJfTsKLQlzdHJ1Y3QgcmN1X2hlYWQgcmN1OworCXVuaW9uIHsKKwkJc3RydWN0IHJjdV9oZWFkIHJjdTsKKwkJZW51bSBleHRyYV9lbGVtX3N0YXRlIHN0YXRlOworCX07CiAJdTMyIGhhc2g7CiAJY2hhciBrZXlbMF0gX19hbGlnbmVkKDgpOwogfTsKQEAgLTExMyw2ICsxMjMsMjMgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IGFsbG9jX2V4dHJhX2VsZW1zKHN0cnVjdCBicGZfaHRhYiAqaHRhYikKK3sKKwl2b2lkIF9fcGVyY3B1ICpwcHRyOworCWludCBjcHU7CisKKwlwcHRyID0gX19hbGxvY19wZXJjcHVfZ2ZwKGh0YWItPmVsZW1fc2l6ZSwgOCwgR0ZQX1VTRVIgfCBfX0dGUF9OT1dBUk4pOworCWlmICghcHB0cikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCSgoc3RydWN0IGh0YWJfZWxlbSAqKXBlcl9jcHVfcHRyKHBwdHIsIGNwdSkpLT5zdGF0ZSA9CisJCQlIVEFCX0VYVFJBX0VMRU1fRlJFRTsKKwl9CisJaHRhYi0+ZXh0cmFfZWxlbXMgPSBwcHRyOworCXJldHVybiAwOworfQorCiAvKiBDYWxsZWQgZnJvbSBzeXNjYWxsICovCiBzdGF0aWMgc3RydWN0IGJwZl9tYXAgKmh0YWJfbWFwX2FsbG9jKHVuaW9uIGJwZl9hdHRyICphdHRyKQogewpAQCAtMTg1LDYgKzIxMiw4IEBACiAJaWYgKHBlcmNwdSkKIAkJY29zdCArPSAodTY0KSByb3VuZF91cChodGFiLT5tYXAudmFsdWVfc2l6ZSwgOCkgKgogCQkJbnVtX3Bvc3NpYmxlX2NwdXMoKSAqIGh0YWItPm1hcC5tYXhfZW50cmllczsKKwllbHNlCisJICAgICAgIGNvc3QgKz0gKHU2NCkgaHRhYi0+ZWxlbV9zaXplICogbnVtX3Bvc3NpYmxlX2NwdXMoKTsKIAogCWlmIChjb3N0ID49IFUzMl9NQVggLSBQQUdFX1NJWkUpCiAJCS8qIG1ha2Ugc3VyZSBwYWdlIGNvdW50IGRvZXNuJ3Qgb3ZlcmZsb3cgKi8KQEAgLTIxMiwxNCArMjQxLDIyIEBACiAJCXJhd19zcGluX2xvY2tfaW5pdCgmaHRhYi0+YnVja2V0c1tpXS5sb2NrKTsKIAl9CiAKLQlpZiAoIShhdHRyLT5tYXBfZmxhZ3MgJiBCUEZfRl9OT19QUkVBTExPQykpIHsKLQkJZXJyID0gcHJlYWxsb2NfZWxlbXNfYW5kX2ZyZWVsaXN0KGh0YWIpOworCWlmICghcGVyY3B1KSB7CisJCWVyciA9IGFsbG9jX2V4dHJhX2VsZW1zKGh0YWIpOwogCQlpZiAoZXJyKQogCQkJZ290byBmcmVlX2J1Y2tldHM7CiAJfQogCisJaWYgKCEoYXR0ci0+bWFwX2ZsYWdzICYgQlBGX0ZfTk9fUFJFQUxMT0MpKSB7CisJCWVyciA9IHByZWFsbG9jX2VsZW1zX2FuZF9mcmVlbGlzdChodGFiKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZnJlZV9leHRyYV9lbGVtczsKKwl9CisKIAlyZXR1cm4gJmh0YWItPm1hcDsKIAorZnJlZV9leHRyYV9lbGVtczoKKwlmcmVlX3BlcmNwdShodGFiLT5leHRyYV9lbGVtcyk7CiBmcmVlX2J1Y2tldHM6CiAJa3ZmcmVlKGh0YWItPmJ1Y2tldHMpOwogZnJlZV9odGFiOgpAQCAtMzQ5LDcgKzM4Niw2IEBACiAJaWYgKGh0YWItPm1hcC5tYXBfdHlwZSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0hBU0gpCiAJCWZyZWVfcGVyY3B1KGh0YWJfZWxlbV9nZXRfcHRyKGwsIGh0YWItPm1hcC5rZXlfc2l6ZSkpOwogCWtmcmVlKGwpOwotCiB9CiAKIHN0YXRpYyB2b2lkIGh0YWJfZWxlbV9mcmVlX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCkBAIC0zNzAsNiArNDA2LDExIEBACiAKIHN0YXRpYyB2b2lkIGZyZWVfaHRhYl9lbGVtKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgc3RydWN0IGh0YWJfZWxlbSAqbCkKIHsKKwlpZiAobC0+c3RhdGUgPT0gSFRBQl9FWFRSQV9FTEVNX1VTRUQpIHsKKwkJbC0+c3RhdGUgPSBIVEFCX0VYVFJBX0VMRU1fRlJFRTsKKwkJcmV0dXJuOworCX0KKwogCWlmICghKGh0YWItPm1hcC5tYXBfZmxhZ3MgJiBCUEZfRl9OT19QUkVBTExPQykpIHsKIAkJcGNwdV9mcmVlbGlzdF9wdXNoKCZodGFiLT5mcmVlbGlzdCwgJmwtPmZub2RlKTsKIAl9IGVsc2UgewpAQCAtMzgxLDI1ICs0MjIsNDQgQEAKIAogc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmFsbG9jX2h0YWJfZWxlbShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHZvaWQgKmtleSwKIAkJCQkJIHZvaWQgKnZhbHVlLCB1MzIga2V5X3NpemUsIHUzMiBoYXNoLAotCQkJCQkgYm9vbCBwZXJjcHUsIGJvb2wgb25hbGxjcHVzKQorCQkJCQkgYm9vbCBwZXJjcHUsIGJvb2wgb25hbGxjcHVzLAorCQkJCQkgYm9vbCBvbGRfZWxlbV9leGlzdHMpCiB7CiAJdTMyIHNpemUgPSBodGFiLT5tYXAudmFsdWVfc2l6ZTsKIAlib29sIHByZWFsbG9jID0gIShodGFiLT5tYXAubWFwX2ZsYWdzICYgQlBGX0ZfTk9fUFJFQUxMT0MpOwogCXN0cnVjdCBodGFiX2VsZW0gKmxfbmV3OwogCXZvaWQgX19wZXJjcHUgKnBwdHI7CisJaW50IGVyciA9IDA7CiAKIAlpZiAocHJlYWxsb2MpIHsKIAkJbF9uZXcgPSAoc3RydWN0IGh0YWJfZWxlbSAqKXBjcHVfZnJlZWxpc3RfcG9wKCZodGFiLT5mcmVlbGlzdCk7CiAJCWlmICghbF9uZXcpCi0JCQlyZXR1cm4gRVJSX1BUUigtRTJCSUcpOworCQkJZXJyID0gLUUyQklHOwogCX0gZWxzZSB7CiAJCWlmIChhdG9taWNfaW5jX3JldHVybigmaHRhYi0+Y291bnQpID4gaHRhYi0+bWFwLm1heF9lbnRyaWVzKSB7CiAJCQlhdG9taWNfZGVjKCZodGFiLT5jb3VudCk7Ci0JCQlyZXR1cm4gRVJSX1BUUigtRTJCSUcpOworCQkJZXJyID0gLUUyQklHOworCQl9IGVsc2UgeworCQkJbF9uZXcgPSBrbWFsbG9jKGh0YWItPmVsZW1fc2l6ZSwKKwkJCQkJR0ZQX0FUT01JQyB8IF9fR0ZQX05PV0FSTik7CisJCQlpZiAoIWxfbmV3KQorCQkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCQl9Ci0JCWxfbmV3ID0ga21hbGxvYyhodGFiLT5lbGVtX3NpemUsIEdGUF9BVE9NSUMgfCBfX0dGUF9OT1dBUk4pOwotCQlpZiAoIWxfbmV3KQotCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJaWYgKGVycikgeworCQlpZiAoIW9sZF9lbGVtX2V4aXN0cykKKwkJCXJldHVybiBFUlJfUFRSKGVycik7CisKKwkJLyogaWYgd2UncmUgdXBkYXRpbmcgdGhlIGV4aXN0aW5nIGVsZW1lbnQgYW5kIHRoZSBoYXNoIHRhYmxlCisJCSAqIGlzIGZ1bGwsIHVzZSBwZXItY3B1IGV4dHJhIGVsZW1zCisJCSAqLworCQlsX25ldyA9IHRoaXNfY3B1X3B0cihodGFiLT5leHRyYV9lbGVtcyk7CisJCWlmIChsX25ldy0+c3RhdGUgIT0gSFRBQl9FWFRSQV9FTEVNX0ZSRUUpCisJCQlyZXR1cm4gRVJSX1BUUigtRTJCSUcpOworCQlsX25ldy0+c3RhdGUgPSBIVEFCX0VYVFJBX0VMRU1fVVNFRDsKKwl9IGVsc2UgeworCQlsX25ldy0+c3RhdGUgPSBIVEFCX05PVF9BTl9FWFRSQV9FTEVNOwogCX0KIAogCW1lbWNweShsX25ldy0+a2V5LCBrZXksIGtleV9zaXplKTsKQEAgLTQ4OSw3ICs1NDksOCBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyOwogCi0JbF9uZXcgPSBhbGxvY19odGFiX2VsZW0oaHRhYiwga2V5LCB2YWx1ZSwga2V5X3NpemUsIGhhc2gsIGZhbHNlLCBmYWxzZSk7CisJbF9uZXcgPSBhbGxvY19odGFiX2VsZW0oaHRhYiwga2V5LCB2YWx1ZSwga2V5X3NpemUsIGhhc2gsIGZhbHNlLCBmYWxzZSwKKwkJCQkhIWxfb2xkKTsKIAlpZiAoSVNfRVJSKGxfbmV3KSkgewogCQkvKiBhbGwgcHJlLWFsbG9jYXRlZCBlbGVtZW50cyBhcmUgaW4gdXNlIG9yIG1lbW9yeSBleGhhdXN0ZWQgKi8KIAkJcmV0ID0gUFRSX0VSUihsX25ldyk7CkBAIC01NjMsNyArNjI0LDcgQEAKIAkJfQogCX0gZWxzZSB7CiAJCWxfbmV3ID0gYWxsb2NfaHRhYl9lbGVtKGh0YWIsIGtleSwgdmFsdWUsIGtleV9zaXplLAotCQkJCQloYXNoLCB0cnVlLCBvbmFsbGNwdXMpOworCQkJCQloYXNoLCB0cnVlLCBvbmFsbGNwdXMsIGZhbHNlKTsKIAkJaWYgKElTX0VSUihsX25ldykpIHsKIAkJCXJldCA9IFBUUl9FUlIobF9uZXcpOwogCQkJZ290byBlcnI7CkBAIC02NTIsNiArNzEzLDcgQEAKIAkJaHRhYl9mcmVlX2VsZW1zKGh0YWIpOwogCQlwY3B1X2ZyZWVsaXN0X2Rlc3Ryb3koJmh0YWItPmZyZWVsaXN0KTsKIAl9CisJZnJlZV9wZXJjcHUoaHRhYi0+ZXh0cmFfZWxlbXMpOwogCWt2ZnJlZShodGFiLT5idWNrZXRzKTsKIAlrZnJlZShodGFiKTsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvaGVscGVycy5jIGIva2VybmVsL2JwZi9oZWxwZXJzLmMKaW5kZXggMWVhM2FmYi4uMzk5MTg0MCAxMDA2NDQKLS0tIGEva2VybmVsL2JwZi9oZWxwZXJzLmMKKysrIGIva2VybmVsL2JwZi9oZWxwZXJzLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdWlkZ2lkLmg+CisjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+CiAKIC8qIElmIGtlcm5lbCBzdWJzeXN0ZW0gaXMgYWxsb3dpbmcgZUJQRiBwcm9ncmFtcyB0byBjYWxsIHRoaXMgZnVuY3Rpb24sCiAgKiBpbnNpZGUgaXRzIG93biB2ZXJpZmllcl9vcHMtPmdldF9mdW5jX3Byb3RvKCkgY2FsbGJhY2sgaXQgc2hvdWxkIHJldHVybgpAQCAtMjYsNDggKzI3LDMyIEBACiAgKiBpZiBwcm9ncmFtIGlzIGFsbG93ZWQgdG8gYWNjZXNzIG1hcHMsIHNvIGNoZWNrIHJjdV9yZWFkX2xvY2tfaGVsZCBpbgogICogYWxsIHRocmVlIGZ1bmN0aW9ucy4KICAqLwotc3RhdGljIHU2NCBicGZfbWFwX2xvb2t1cF9lbGVtKHU2NCByMSwgdTY0IHIyLCB1NjQgcjMsIHU2NCByNCwgdTY0IHI1KQorQlBGX0NBTExfMihicGZfbWFwX2xvb2t1cF9lbGVtLCBzdHJ1Y3QgYnBmX21hcCAqLCBtYXAsIHZvaWQgKiwga2V5KQogewotCS8qIHZlcmlmaWVyIGNoZWNrZWQgdGhhdCBSMSBjb250YWlucyBhIHZhbGlkIHBvaW50ZXIgdG8gYnBmX21hcAotCSAqIGFuZCBSMiBwb2ludHMgdG8gYSBwcm9ncmFtIHN0YWNrIGFuZCBtYXAtPmtleV9zaXplIGJ5dGVzIHdlcmUKLQkgKiBpbml0aWFsaXplZAotCSAqLwotCXN0cnVjdCBicGZfbWFwICptYXAgPSAoc3RydWN0IGJwZl9tYXAgKikgKHVuc2lnbmVkIGxvbmcpIHIxOwotCXZvaWQgKmtleSA9ICh2b2lkICopICh1bnNpZ25lZCBsb25nKSByMjsKLQl2b2lkICp2YWx1ZTsKLQogCVdBUk5fT05fT05DRSghcmN1X3JlYWRfbG9ja19oZWxkKCkpOwotCi0JdmFsdWUgPSBtYXAtPm9wcy0+bWFwX2xvb2t1cF9lbGVtKG1hcCwga2V5KTsKLQotCS8qIGxvb2t1cCgpIHJldHVybnMgZWl0aGVyIHBvaW50ZXIgdG8gZWxlbWVudCB2YWx1ZSBvciBOVUxMCi0JICogd2hpY2ggaXMgdGhlIG1lYW5pbmcgb2YgUFRSX1RPX01BUF9WQUxVRV9PUl9OVUxMIHR5cGUKLQkgKi8KLQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpIHZhbHVlOworCXJldHVybiAodW5zaWduZWQgbG9uZykgbWFwLT5vcHMtPm1hcF9sb29rdXBfZWxlbShtYXAsIGtleSk7CiB9CiAKIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfbWFwX2xvb2t1cF9lbGVtX3Byb3RvID0gewogCS5mdW5jCQk9IGJwZl9tYXBfbG9va3VwX2VsZW0sCiAJLmdwbF9vbmx5CT0gZmFsc2UsCisJLnBrdF9hY2Nlc3MJPSB0cnVlLAogCS5yZXRfdHlwZQk9IFJFVF9QVFJfVE9fTUFQX1ZBTFVFX09SX05VTEwsCiAJLmFyZzFfdHlwZQk9IEFSR19DT05TVF9NQVBfUFRSLAogCS5hcmcyX3R5cGUJPSBBUkdfUFRSX1RPX01BUF9LRVksCiB9OwogCi1zdGF0aWMgdTY0IGJwZl9tYXBfdXBkYXRlX2VsZW0odTY0IHIxLCB1NjQgcjIsIHU2NCByMywgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF80KGJwZl9tYXBfdXBkYXRlX2VsZW0sIHN0cnVjdCBicGZfbWFwICosIG1hcCwgdm9pZCAqLCBrZXksCisJICAgdm9pZCAqLCB2YWx1ZSwgdTY0LCBmbGFncykKIHsKLQlzdHJ1Y3QgYnBmX21hcCAqbWFwID0gKHN0cnVjdCBicGZfbWFwICopICh1bnNpZ25lZCBsb25nKSByMTsKLQl2b2lkICprZXkgPSAodm9pZCAqKSAodW5zaWduZWQgbG9uZykgcjI7Ci0Jdm9pZCAqdmFsdWUgPSAodm9pZCAqKSAodW5zaWduZWQgbG9uZykgcjM7Ci0KIAlXQVJOX09OX09OQ0UoIXJjdV9yZWFkX2xvY2tfaGVsZCgpKTsKLQotCXJldHVybiBtYXAtPm9wcy0+bWFwX3VwZGF0ZV9lbGVtKG1hcCwga2V5LCB2YWx1ZSwgcjQpOworCXJldHVybiBtYXAtPm9wcy0+bWFwX3VwZGF0ZV9lbGVtKG1hcCwga2V5LCB2YWx1ZSwgZmxhZ3MpOwogfQogCiBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX21hcF91cGRhdGVfZWxlbV9wcm90byA9IHsKIAkuZnVuYwkJPSBicGZfbWFwX3VwZGF0ZV9lbGVtLAogCS5ncGxfb25seQk9IGZhbHNlLAorCS5wa3RfYWNjZXNzCT0gdHJ1ZSwKIAkucmV0X3R5cGUJPSBSRVRfSU5URUdFUiwKIAkuYXJnMV90eXBlCT0gQVJHX0NPTlNUX01BUF9QVFIsCiAJLmFyZzJfdHlwZQk9IEFSR19QVFJfVE9fTUFQX0tFWSwKQEAgLTc1LDE5ICs2MCwxNiBAQAogCS5hcmc0X3R5cGUJPSBBUkdfQU5ZVEhJTkcsCiB9OwogCi1zdGF0aWMgdTY0IGJwZl9tYXBfZGVsZXRlX2VsZW0odTY0IHIxLCB1NjQgcjIsIHU2NCByMywgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8yKGJwZl9tYXBfZGVsZXRlX2VsZW0sIHN0cnVjdCBicGZfbWFwICosIG1hcCwgdm9pZCAqLCBrZXkpCiB7Ci0Jc3RydWN0IGJwZl9tYXAgKm1hcCA9IChzdHJ1Y3QgYnBmX21hcCAqKSAodW5zaWduZWQgbG9uZykgcjE7Ci0Jdm9pZCAqa2V5ID0gKHZvaWQgKikgKHVuc2lnbmVkIGxvbmcpIHIyOwotCiAJV0FSTl9PTl9PTkNFKCFyY3VfcmVhZF9sb2NrX2hlbGQoKSk7Ci0KIAlyZXR1cm4gbWFwLT5vcHMtPm1hcF9kZWxldGVfZWxlbShtYXAsIGtleSk7CiB9CiAKIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfbWFwX2RlbGV0ZV9lbGVtX3Byb3RvID0gewogCS5mdW5jCQk9IGJwZl9tYXBfZGVsZXRlX2VsZW0sCiAJLmdwbF9vbmx5CT0gZmFsc2UsCisJLnBrdF9hY2Nlc3MJPSB0cnVlLAogCS5yZXRfdHlwZQk9IFJFVF9JTlRFR0VSLAogCS5hcmcxX3R5cGUJPSBBUkdfQ09OU1RfTUFQX1BUUiwKIAkuYXJnMl90eXBlCT0gQVJHX1BUUl9UT19NQVBfS0VZLApAQCAtOTksNyArODEsNyBAQAogCS5yZXRfdHlwZQk9IFJFVF9JTlRFR0VSLAogfTsKIAotc3RhdGljIHU2NCBicGZfZ2V0X3NtcF9wcm9jZXNzb3JfaWQodTY0IHIxLCB1NjQgcjIsIHU2NCByMywgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8wKGJwZl9nZXRfc21wX3Byb2Nlc3Nvcl9pZCkKIHsKIAlyZXR1cm4gc21wX3Byb2Nlc3Nvcl9pZCgpOwogfQpAQCAtMTEwLDcgKzkyLDcgQEAKIAkucmV0X3R5cGUJPSBSRVRfSU5URUdFUiwKIH07CiAKLXN0YXRpYyB1NjQgYnBmX2t0aW1lX2dldF9ucyh1NjQgcjEsIHU2NCByMiwgdTY0IHIzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzAoYnBmX2t0aW1lX2dldF9ucykKIHsKIAkvKiBOTUkgc2FmZSBhY2Nlc3MgdG8gY2xvY2sgbW9ub3RvbmljICovCiAJcmV0dXJuIGt0aW1lX2dldF9tb25vX2Zhc3RfbnMoKTsKQEAgLTEyMiwxMSArMTA0LDExIEBACiAJLnJldF90eXBlCT0gUkVUX0lOVEVHRVIsCiB9OwogCi1zdGF0aWMgdTY0IGJwZl9nZXRfY3VycmVudF9waWRfdGdpZCh1NjQgcjEsIHU2NCByMiwgdTY0IHIzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzAoYnBmX2dldF9jdXJyZW50X3BpZF90Z2lkKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IGN1cnJlbnQ7CiAKLQlpZiAoIXRhc2spCisJaWYgKHVubGlrZWx5KCF0YXNrKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR1cm4gKHU2NCkgdGFzay0+dGdpZCA8PCAzMiB8IHRhc2stPnBpZDsKQEAgLTEzOCwxOCArMTIwLDE4IEBACiAJLnJldF90eXBlCT0gUkVUX0lOVEVHRVIsCiB9OwogCi1zdGF0aWMgdTY0IGJwZl9nZXRfY3VycmVudF91aWRfZ2lkKHU2NCByMSwgdTY0IHIyLCB1NjQgcjMsIHU2NCByNCwgdTY0IHI1KQorQlBGX0NBTExfMChicGZfZ2V0X2N1cnJlbnRfdWlkX2dpZCkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBjdXJyZW50OwogCWt1aWRfdCB1aWQ7CiAJa2dpZF90IGdpZDsKIAotCWlmICghdGFzaykKKwlpZiAodW5saWtlbHkoIXRhc2spKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWN1cnJlbnRfdWlkX2dpZCgmdWlkLCAmZ2lkKTsKIAlyZXR1cm4gKHU2NCkgZnJvbV9rZ2lkKCZpbml0X3VzZXJfbnMsIGdpZCkgPDwgMzIgfAotCQlmcm9tX2t1aWQoJmluaXRfdXNlcl9ucywgdWlkKTsKKwkJICAgICBmcm9tX2t1aWQoJmluaXRfdXNlcl9ucywgdWlkKTsKIH0KIAogY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9nZXRfY3VycmVudF91aWRfZ2lkX3Byb3RvID0gewpAQCAtMTU4LDEwICsxNDAsOSBAQAogCS5yZXRfdHlwZQk9IFJFVF9JTlRFR0VSLAogfTsKIAotc3RhdGljIHU2NCBicGZfZ2V0X2N1cnJlbnRfY29tbSh1NjQgcjEsIHU2NCBzaXplLCB1NjQgcjMsIHU2NCByNCwgdTY0IHI1KQorQlBGX0NBTExfMihicGZfZ2V0X2N1cnJlbnRfY29tbSwgY2hhciAqLCBidWYsIHUzMiwgc2l6ZSkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBjdXJyZW50OwotCWNoYXIgKmJ1ZiA9IChjaGFyICopIChsb25nKSByMTsKIAogCWlmICh1bmxpa2VseSghdGFzaykpCiAJCWdvdG8gZXJyX2NsZWFyOwpkaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9zdGFja21hcC5jIGIva2VybmVsL2JwZi9zdGFja21hcC5jCmluZGV4IGJmNDQ5NWYuLjczMmFlMTYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9icGYvc3RhY2ttYXAuYworKysgYi9rZXJuZWwvYnBmL3N0YWNrbWFwLmMKQEAgLTExNiwxMCArMTE2LDkgQEAKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQogCi11NjQgYnBmX2dldF9zdGFja2lkKHU2NCByMSwgdTY0IHIyLCB1NjQgZmxhZ3MsIHU2NCByNCwgdTY0IHI1KQorQlBGX0NBTExfMyhicGZfZ2V0X3N0YWNraWQsIHN0cnVjdCBwdF9yZWdzICosIHJlZ3MsIHN0cnVjdCBicGZfbWFwICosIG1hcCwKKwkgICB1NjQsIGZsYWdzKQogewotCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopIChsb25nKSByMTsKLQlzdHJ1Y3QgYnBmX21hcCAqbWFwID0gKHN0cnVjdCBicGZfbWFwICopIChsb25nKSByMjsKIAlzdHJ1Y3QgYnBmX3N0YWNrX21hcCAqc21hcCA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfc3RhY2tfbWFwLCBtYXApOwogCXN0cnVjdCBwZXJmX2NhbGxjaGFpbl9lbnRyeSAqdHJhY2U7CiAJc3RydWN0IHN0YWNrX21hcF9idWNrZXQgKmJ1Y2tldCwgKm5ld19idWNrZXQsICpvbGRfYnVja2V0OwpkaWZmIC0tZ2l0IGEva2VybmVsL2JwZi92ZXJpZmllci5jIGIva2VybmVsL2JwZi92ZXJpZmllci5jCmluZGV4IGY3MmYyM2IuLjk5YTdlNWIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9icGYvdmVyaWZpZXIuYworKysgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9icGYuaD4KKyNpbmNsdWRlIDxsaW51eC9icGZfdmVyaWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KICNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KQEAgLTEyNiw3NSArMTI3LDE2IEBACiAgKiBhcmUgc2V0IHRvIE5PVF9JTklUIHRvIGluZGljYXRlIHRoYXQgdGhleSBhcmUgbm8gbG9uZ2VyIHJlYWRhYmxlLgogICovCiAKLXN0cnVjdCByZWdfc3RhdGUgewotCWVudW0gYnBmX3JlZ190eXBlIHR5cGU7Ci0JdW5pb24gewotCQkvKiB2YWxpZCB3aGVuIHR5cGUgPT0gQ09OU1RfSU1NIHwgUFRSX1RPX1NUQUNLIHwgVU5LTk9XTl9WQUxVRSAqLwotCQlzNjQgaW1tOwotCi0JCS8qIHZhbGlkIHdoZW4gdHlwZSA9PSBQVFJfVE9fUEFDS0VUKiAqLwotCQlzdHJ1Y3QgewotCQkJdTMyIGlkOwotCQkJdTE2IG9mZjsKLQkJCXUxNiByYW5nZTsKLQkJfTsKLQotCQkvKiB2YWxpZCB3aGVuIHR5cGUgPT0gQ09OU1RfUFRSX1RPX01BUCB8IFBUUl9UT19NQVBfVkFMVUUgfAotCQkgKiAgIFBUUl9UT19NQVBfVkFMVUVfT1JfTlVMTAotCQkgKi8KLQkJc3RydWN0IGJwZl9tYXAgKm1hcF9wdHI7Ci0JfTsKLX07Ci0KLWVudW0gYnBmX3N0YWNrX3Nsb3RfdHlwZSB7Ci0JU1RBQ0tfSU5WQUxJRCwgICAgLyogbm90aGluZyB3YXMgc3RvcmVkIGluIHRoaXMgc3RhY2sgc2xvdCAqLwotCVNUQUNLX1NQSUxMLCAgICAgIC8qIHJlZ2lzdGVyIHNwaWxsZWQgaW50byBzdGFjayAqLwotCVNUQUNLX01JU0MJICAvKiBCUEYgcHJvZ3JhbSB3cm90ZSBzb21lIGRhdGEgaW50byB0aGlzIHNsb3QgKi8KLX07Ci0KLSNkZWZpbmUgQlBGX1JFR19TSVpFIDgJLyogc2l6ZSBvZiBlQlBGIHJlZ2lzdGVyIGluIGJ5dGVzICovCi0KLS8qIHN0YXRlIG9mIHRoZSBwcm9ncmFtOgotICogdHlwZSBvZiBhbGwgcmVnaXN0ZXJzIGFuZCBzdGFjayBpbmZvCi0gKi8KLXN0cnVjdCB2ZXJpZmllcl9zdGF0ZSB7Ci0Jc3RydWN0IHJlZ19zdGF0ZSByZWdzW01BWF9CUEZfUkVHXTsKLQl1OCBzdGFja19zbG90X3R5cGVbTUFYX0JQRl9TVEFDS107Ci0Jc3RydWN0IHJlZ19zdGF0ZSBzcGlsbGVkX3JlZ3NbTUFYX0JQRl9TVEFDSyAvIEJQRl9SRUdfU0laRV07Ci19OwotCi0vKiBsaW5rZWQgbGlzdCBvZiB2ZXJpZmllciBzdGF0ZXMgdXNlZCB0byBwcnVuZSBzZWFyY2ggKi8KLXN0cnVjdCB2ZXJpZmllcl9zdGF0ZV9saXN0IHsKLQlzdHJ1Y3QgdmVyaWZpZXJfc3RhdGUgc3RhdGU7Ci0Jc3RydWN0IHZlcmlmaWVyX3N0YXRlX2xpc3QgKm5leHQ7Ci19OwotCiAvKiB2ZXJpZmllcl9zdGF0ZSArIGluc25faWR4IGFyZSBwdXNoZWQgdG8gc3RhY2sgd2hlbiBicmFuY2ggaXMgZW5jb3VudGVyZWQgKi8KLXN0cnVjdCB2ZXJpZmllcl9zdGFja19lbGVtIHsKK3N0cnVjdCBicGZfdmVyaWZpZXJfc3RhY2tfZWxlbSB7CiAJLyogdmVyaWZlciBzdGF0ZSBpcyAnc3QnCiAJICogYmVmb3JlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gJ2luc25faWR4JwogCSAqIGFuZCBhZnRlciBwcm9jZXNzaW5nIGluc3RydWN0aW9uICdwcmV2X2luc25faWR4JwogCSAqLwotCXN0cnVjdCB2ZXJpZmllcl9zdGF0ZSBzdDsKKwlzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YXRlIHN0OwogCWludCBpbnNuX2lkeDsKIAlpbnQgcHJldl9pbnNuX2lkeDsKLQlzdHJ1Y3QgdmVyaWZpZXJfc3RhY2tfZWxlbSAqbmV4dDsKLX07Ci0KLSNkZWZpbmUgTUFYX1VTRURfTUFQUyA2NCAvKiBtYXggbnVtYmVyIG9mIG1hcHMgYWNjZXNzZWQgYnkgb25lIGVCUEYgcHJvZ3JhbSAqLwotCi0vKiBzaW5nbGUgY29udGFpbmVyIGZvciBhbGwgc3RydWN0cwotICogb25lIHZlcmlmaWVyX2VudiBwZXIgYnBmX2NoZWNrKCkgY2FsbAotICovCi1zdHJ1Y3QgdmVyaWZpZXJfZW52IHsKLQlzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7CQkvKiBlQlBGIHByb2dyYW0gYmVpbmcgdmVyaWZpZWQgKi8KLQlzdHJ1Y3QgdmVyaWZpZXJfc3RhY2tfZWxlbSAqaGVhZDsgLyogc3RhY2sgb2YgdmVyaWZpZXIgc3RhdGVzIHRvIGJlIHByb2Nlc3NlZCAqLwotCWludCBzdGFja19zaXplOwkJCS8qIG51bWJlciBvZiBzdGF0ZXMgdG8gYmUgcHJvY2Vzc2VkICovCi0Jc3RydWN0IHZlcmlmaWVyX3N0YXRlIGN1cl9zdGF0ZTsgLyogY3VycmVudCB2ZXJpZmllciBzdGF0ZSAqLwotCXN0cnVjdCB2ZXJpZmllcl9zdGF0ZV9saXN0ICoqZXhwbG9yZWRfc3RhdGVzOyAvKiBzZWFyY2ggcHJ1bmluZyBvcHRpbWl6YXRpb24gKi8KLQlzdHJ1Y3QgYnBmX21hcCAqdXNlZF9tYXBzW01BWF9VU0VEX01BUFNdOyAvKiBhcnJheSBvZiBtYXAncyB1c2VkIGJ5IGVCUEYgcHJvZ3JhbSAqLwotCXUzMiB1c2VkX21hcF9jbnQ7CQkvKiBudW1iZXIgb2YgdXNlZCBtYXBzICovCi0JYm9vbCBhbGxvd19wdHJfbGVha3M7CisJc3RydWN0IGJwZl92ZXJpZmllcl9zdGFja19lbGVtICpuZXh0OwogfTsKIAogI2RlZmluZSBCUEZfQ09NUExFWElUWV9MSU1JVF9JTlNOUwk2NTUzNgpAQCAtMjAzLDYgKzE0NSw3IEBACiBzdHJ1Y3QgYnBmX2NhbGxfYXJnX21ldGEgewogCXN0cnVjdCBicGZfbWFwICptYXBfcHRyOwogCWJvb2wgcmF3X21vZGU7CisJYm9vbCBwa3RfYWNjZXNzOwogCWludCByZWdubzsKIAlpbnQgYWNjZXNzX3NpemU7CiB9OwpAQCAtMjM5LDYgKzE4Miw3IEBACiAJW0NPTlNUX1BUUl9UT19NQVBdCT0gIm1hcF9wdHIiLAogCVtQVFJfVE9fTUFQX1ZBTFVFXQk9ICJtYXBfdmFsdWUiLAogCVtQVFJfVE9fTUFQX1ZBTFVFX09SX05VTExdID0gIm1hcF92YWx1ZV9vcl9udWxsIiwKKwlbUFRSX1RPX01BUF9WQUxVRV9BREpdCT0gIm1hcF92YWx1ZV9hZGoiLAogCVtGUkFNRV9QVFJdCQk9ICJmcCIsCiAJW1BUUl9UT19TVEFDS10JCT0gImZwIiwKIAlbQ09OU1RfSU1NXQkJPSAiaW1tIiwKQEAgLTI0Niw5ICsxOTAsOSBAQAogCVtQVFJfVE9fUEFDS0VUX0VORF0JPSAicGt0X2VuZCIsCiB9OwogCi1zdGF0aWMgdm9pZCBwcmludF92ZXJpZmllcl9zdGF0ZShzdHJ1Y3QgdmVyaWZpZXJfc3RhdGUgKnN0YXRlKQorc3RhdGljIHZvaWQgcHJpbnRfdmVyaWZpZXJfc3RhdGUoc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZSAqc3RhdGUpCiB7Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqcmVnOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWc7CiAJZW51bSBicGZfcmVnX3R5cGUgdDsKIAlpbnQgaTsKIApAQCAtMjY2LDEwICsyMTAsMTcgQEAKIAkJZWxzZSBpZiAodCA9PSBVTktOT1dOX1ZBTFVFICYmIHJlZy0+aW1tKQogCQkJdmVyYm9zZSgiJWxsZCIsIHJlZy0+aW1tKTsKIAkJZWxzZSBpZiAodCA9PSBDT05TVF9QVFJfVE9fTUFQIHx8IHQgPT0gUFRSX1RPX01BUF9WQUxVRSB8fAotCQkJIHQgPT0gUFRSX1RPX01BUF9WQUxVRV9PUl9OVUxMKQorCQkJIHQgPT0gUFRSX1RPX01BUF9WQUxVRV9PUl9OVUxMIHx8CisJCQkgdCA9PSBQVFJfVE9fTUFQX1ZBTFVFX0FESikKIAkJCXZlcmJvc2UoIihrcz0lZCx2cz0lZCkiLAogCQkJCXJlZy0+bWFwX3B0ci0+a2V5X3NpemUsCiAJCQkJcmVnLT5tYXBfcHRyLT52YWx1ZV9zaXplKTsKKwkJaWYgKHJlZy0+bWluX3ZhbHVlICE9IEJQRl9SRUdJU1RFUl9NSU5fUkFOR0UpCisJCQl2ZXJib3NlKCIsbWluX3ZhbHVlPSVsbHUiLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcmVnLT5taW5fdmFsdWUpOworCQlpZiAocmVnLT5tYXhfdmFsdWUgIT0gQlBGX1JFR0lTVEVSX01BWF9SQU5HRSkKKwkJCXZlcmJvc2UoIixtYXhfdmFsdWU9JWxsdSIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylyZWctPm1heF92YWx1ZSk7CiAJfQogCWZvciAoaSA9IDA7IGkgPCBNQVhfQlBGX1NUQUNLOyBpICs9IEJQRl9SRUdfU0laRSkgewogCQlpZiAoc3RhdGUtPnN0YWNrX3Nsb3RfdHlwZVtpXSA9PSBTVEFDS19TUElMTCkKQEAgLTQyNCw5ICszNzUsOSBAQAogCX0KIH0KIAotc3RhdGljIGludCBwb3Bfc3RhY2soc3RydWN0IHZlcmlmaWVyX2VudiAqZW52LCBpbnQgKnByZXZfaW5zbl9pZHgpCitzdGF0aWMgaW50IHBvcF9zdGFjayhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBpbnQgKnByZXZfaW5zbl9pZHgpCiB7Ci0Jc3RydWN0IHZlcmlmaWVyX3N0YWNrX2VsZW0gKmVsZW07CisJc3RydWN0IGJwZl92ZXJpZmllcl9zdGFja19lbGVtICplbGVtOwogCWludCBpbnNuX2lkeDsKIAogCWlmIChlbnYtPmhlYWQgPT0gTlVMTCkKQEAgLTQ0MywxMiArMzk0LDEyIEBACiAJcmV0dXJuIGluc25faWR4OwogfQogCi1zdGF0aWMgc3RydWN0IHZlcmlmaWVyX3N0YXRlICpwdXNoX3N0YWNrKHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudiwgaW50IGluc25faWR4LAotCQkJCQkgaW50IHByZXZfaW5zbl9pZHgpCitzdGF0aWMgc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZSAqcHVzaF9zdGFjayhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LAorCQkJCQkgICAgIGludCBpbnNuX2lkeCwgaW50IHByZXZfaW5zbl9pZHgpCiB7Ci0Jc3RydWN0IHZlcmlmaWVyX3N0YWNrX2VsZW0gKmVsZW07CisJc3RydWN0IGJwZl92ZXJpZmllcl9zdGFja19lbGVtICplbGVtOwogCi0JZWxlbSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZXJpZmllcl9zdGFja19lbGVtKSwgR0ZQX0tFUk5FTCk7CisJZWxlbSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhY2tfZWxlbSksIEdGUF9LRVJORUwpOwogCWlmICghZWxlbSkKIAkJZ290byBlcnI7CiAKQEAgLTQ3NCwxMyArNDI1LDE1IEBACiAJQlBGX1JFR18wLCBCUEZfUkVHXzEsIEJQRl9SRUdfMiwgQlBGX1JFR18zLCBCUEZfUkVHXzQsIEJQRl9SRUdfNQogfTsKIAotc3RhdGljIHZvaWQgaW5pdF9yZWdfc3RhdGUoc3RydWN0IHJlZ19zdGF0ZSAqcmVncykKK3N0YXRpYyB2b2lkIGluaXRfcmVnX3N0YXRlKHN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWdzKQogewogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9CUEZfUkVHOyBpKyspIHsKIAkJcmVnc1tpXS50eXBlID0gTk9UX0lOSVQ7CiAJCXJlZ3NbaV0uaW1tID0gMDsKKwkJcmVnc1tpXS5taW5fdmFsdWUgPSBCUEZfUkVHSVNURVJfTUlOX1JBTkdFOworCQlyZWdzW2ldLm1heF92YWx1ZSA9IEJQRl9SRUdJU1RFUl9NQVhfUkFOR0U7CiAJfQogCiAJLyogZnJhbWUgcG9pbnRlciAqLwpAQCAtNDkwLDIwICs0NDMsMjYgQEAKIAlyZWdzW0JQRl9SRUdfMV0udHlwZSA9IFBUUl9UT19DVFg7CiB9CiAKLXN0YXRpYyB2b2lkIG1hcmtfcmVnX3Vua25vd25fdmFsdWUoc3RydWN0IHJlZ19zdGF0ZSAqcmVncywgdTMyIHJlZ25vKQorc3RhdGljIHZvaWQgbWFya19yZWdfdW5rbm93bl92YWx1ZShzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVncywgdTMyIHJlZ25vKQogewogCUJVR19PTihyZWdubyA+PSBNQVhfQlBGX1JFRyk7CiAJcmVnc1tyZWdub10udHlwZSA9IFVOS05PV05fVkFMVUU7CiAJcmVnc1tyZWdub10uaW1tID0gMDsKIH0KIAorc3RhdGljIHZvaWQgcmVzZXRfcmVnX3JhbmdlX3ZhbHVlcyhzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVncywgdTMyIHJlZ25vKQoreworCXJlZ3NbcmVnbm9dLm1pbl92YWx1ZSA9IEJQRl9SRUdJU1RFUl9NSU5fUkFOR0U7CisJcmVnc1tyZWdub10ubWF4X3ZhbHVlID0gQlBGX1JFR0lTVEVSX01BWF9SQU5HRTsKK30KKwogZW51bSByZWdfYXJnX3R5cGUgewogCVNSQ19PUCwJCS8qIHJlZ2lzdGVyIGlzIHVzZWQgYXMgc291cmNlIG9wZXJhbmQgKi8KIAlEU1RfT1AsCQkvKiByZWdpc3RlciBpcyB1c2VkIGFzIGRlc3RpbmF0aW9uIG9wZXJhbmQgKi8KIAlEU1RfT1BfTk9fTUFSSwkvKiBzYW1lIGFzIGFib3ZlLCBjaGVjayBvbmx5LCBkb24ndCBtYXJrICovCiB9OwogCi1zdGF0aWMgaW50IGNoZWNrX3JlZ19hcmcoc3RydWN0IHJlZ19zdGF0ZSAqcmVncywgdTMyIHJlZ25vLAorc3RhdGljIGludCBjaGVja19yZWdfYXJnKHN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWdzLCB1MzIgcmVnbm8sCiAJCQkgZW51bSByZWdfYXJnX3R5cGUgdCkKIHsKIAlpZiAocmVnbm8gPj0gTUFYX0JQRl9SRUcpIHsKQEAgLTU2Myw4ICs1MjIsOCBAQAogLyogY2hlY2tfc3RhY2tfcmVhZC93cml0ZSBmdW5jdGlvbnMgdHJhY2sgc3BpbGwvZmlsbCBvZiByZWdpc3RlcnMsCiAgKiBzdGFjayBib3VuZGFyeSBhbmQgYWxpZ25tZW50IGFyZSBjaGVja2VkIGluIGNoZWNrX21lbV9hY2Nlc3MoKQogICovCi1zdGF0aWMgaW50IGNoZWNrX3N0YWNrX3dyaXRlKHN0cnVjdCB2ZXJpZmllcl9zdGF0ZSAqc3RhdGUsIGludCBvZmYsIGludCBzaXplLAotCQkJICAgICBpbnQgdmFsdWVfcmVnbm8pCitzdGF0aWMgaW50IGNoZWNrX3N0YWNrX3dyaXRlKHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgKnN0YXRlLCBpbnQgb2ZmLAorCQkJICAgICBpbnQgc2l6ZSwgaW50IHZhbHVlX3JlZ25vKQogewogCWludCBpOwogCS8qIGNhbGxlciBjaGVja2VkIHRoYXQgb2ZmICUgc2l6ZSA9PSAwIGFuZCAtTUFYX0JQRl9TVEFDSyA8PSBvZmYgPCAwLApAQCAtNTg5LDcgKzU0OCw3IEBACiAJfSBlbHNlIHsKIAkJLyogcmVndWxhciB3cml0ZSBvZiBkYXRhIGludG8gc3RhY2sgKi8KIAkJc3RhdGUtPnNwaWxsZWRfcmVnc1soTUFYX0JQRl9TVEFDSyArIG9mZikgLyBCUEZfUkVHX1NJWkVdID0KLQkJCShzdHJ1Y3QgcmVnX3N0YXRlKSB7fTsKKwkJCShzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSkge307CiAKIAkJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKIAkJCXN0YXRlLT5zdGFja19zbG90X3R5cGVbTUFYX0JQRl9TVEFDSyArIG9mZiArIGldID0gU1RBQ0tfTUlTQzsKQEAgLTU5Nyw3ICs1NTYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGNoZWNrX3N0YWNrX3JlYWQoc3RydWN0IHZlcmlmaWVyX3N0YXRlICpzdGF0ZSwgaW50IG9mZiwgaW50IHNpemUsCitzdGF0aWMgaW50IGNoZWNrX3N0YWNrX3JlYWQoc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZSAqc3RhdGUsIGludCBvZmYsIGludCBzaXplLAogCQkJICAgIGludCB2YWx1ZV9yZWdubykKIHsKIAl1OCAqc2xvdF90eXBlOwpAQCAtNjM4LDcgKzU5Nyw3IEBACiB9CiAKIC8qIGNoZWNrIHJlYWQvd3JpdGUgaW50byBtYXAgZWxlbWVudCByZXR1cm5lZCBieSBicGZfbWFwX2xvb2t1cF9lbGVtKCkgKi8KLXN0YXRpYyBpbnQgY2hlY2tfbWFwX2FjY2VzcyhzdHJ1Y3QgdmVyaWZpZXJfZW52ICplbnYsIHUzMiByZWdubywgaW50IG9mZiwKK3N0YXRpYyBpbnQgY2hlY2tfbWFwX2FjY2VzcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgcmVnbm8sIGludCBvZmYsCiAJCQkgICAgaW50IHNpemUpCiB7CiAJc3RydWN0IGJwZl9tYXAgKm1hcCA9IGVudi0+Y3VyX3N0YXRlLnJlZ3NbcmVnbm9dLm1hcF9wdHI7CkBAIC02NTMsMjQgKzYxMiwzMSBAQAogCiAjZGVmaW5lIE1BWF9QQUNLRVRfT0ZGIDB4ZmZmZgogCi1zdGF0aWMgYm9vbCBtYXlfd3JpdGVfcGt0X2RhdGEoZW51bSBicGZfcHJvZ190eXBlIHR5cGUpCitzdGF0aWMgYm9vbCBtYXlfYWNjZXNzX2RpcmVjdF9wa3RfZGF0YShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgYnBmX2NhbGxfYXJnX21ldGEgKm1ldGEpCiB7Ci0Jc3dpdGNoICh0eXBlKSB7CisJc3dpdGNoIChlbnYtPnByb2ctPnR5cGUpIHsKKwljYXNlIEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTOgorCWNhc2UgQlBGX1BST0dfVFlQRV9TQ0hFRF9BQ1Q6CiAJY2FzZSBCUEZfUFJPR19UWVBFX1hEUDoKKwkJaWYgKG1ldGEpCisJCQlyZXR1cm4gbWV0YS0+cGt0X2FjY2VzczsKKworCQllbnYtPnNlZW5fZGlyZWN0X3dyaXRlID0gdHJ1ZTsKIAkJcmV0dXJuIHRydWU7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIGZhbHNlOwogCX0KIH0KIAotc3RhdGljIGludCBjaGVja19wYWNrZXRfYWNjZXNzKHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudiwgdTMyIHJlZ25vLCBpbnQgb2ZmLAorc3RhdGljIGludCBjaGVja19wYWNrZXRfYWNjZXNzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiByZWdubywgaW50IG9mZiwKIAkJCSAgICAgICBpbnQgc2l6ZSkKIHsKLQlzdHJ1Y3QgcmVnX3N0YXRlICpyZWdzID0gZW52LT5jdXJfc3RhdGUucmVnczsKLQlzdHJ1Y3QgcmVnX3N0YXRlICpyZWcgPSAmcmVnc1tyZWdub107CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZ3MgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWcgPSAmcmVnc1tyZWdub107CiAKIAlvZmYgKz0gcmVnLT5vZmY7Ci0JaWYgKG9mZiA8IDAgfHwgb2ZmICsgc2l6ZSA+IHJlZy0+cmFuZ2UpIHsKKwlpZiAob2ZmIDwgMCB8fCBzaXplIDw9IDAgfHwgb2ZmICsgc2l6ZSA+IHJlZy0+cmFuZ2UpIHsKIAkJdmVyYm9zZSgiaW52YWxpZCBhY2Nlc3MgdG8gcGFja2V0LCBvZmY9JWQgc2l6ZT0lZCwgUiVkKGlkPSVkLG9mZj0lZCxyPSVkKVxuIiwKIAkJCW9mZiwgc2l6ZSwgcmVnbm8sIHJlZy0+aWQsIHJlZy0+b2ZmLCByZWctPnJhbmdlKTsKIAkJcmV0dXJuIC1FQUNDRVM7CkBAIC02NzksOSArNjQ1LDEzIEBACiB9CiAKIC8qIGNoZWNrIGFjY2VzcyB0byAnc3RydWN0IGJwZl9jb250ZXh0JyBmaWVsZHMgKi8KLXN0YXRpYyBpbnQgY2hlY2tfY3R4X2FjY2VzcyhzdHJ1Y3QgdmVyaWZpZXJfZW52ICplbnYsIGludCBvZmYsIGludCBzaXplLAorc3RhdGljIGludCBjaGVja19jdHhfYWNjZXNzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIGludCBvZmYsIGludCBzaXplLAogCQkJICAgIGVudW0gYnBmX2FjY2Vzc190eXBlIHQsIGVudW0gYnBmX3JlZ190eXBlICpyZWdfdHlwZSkKIHsKKwkvKiBmb3IgYW5hbHl6ZXIgY3R4IGFjY2Vzc2VzIGFyZSBhbHJlYWR5IHZhbGlkYXRlZCBhbmQgY29udmVydGVkICovCisJaWYgKGVudi0+YW5hbHl6ZXJfb3BzKQorCQlyZXR1cm4gMDsKKwogCWlmIChlbnYtPnByb2ctPmF1eC0+b3BzLT5pc192YWxpZF9hY2Nlc3MgJiYKIAkgICAgZW52LT5wcm9nLT5hdXgtPm9wcy0+aXNfdmFsaWRfYWNjZXNzKG9mZiwgc2l6ZSwgdCwgcmVnX3R5cGUpKSB7CiAJCS8qIHJlbWVtYmVyIHRoZSBvZmZzZXQgb2YgbGFzdCBieXRlIGFjY2Vzc2VkIGluIGN0eCAqLwpAQCAtNjk0LDcgKzY2NCw3IEBACiAJcmV0dXJuIC1FQUNDRVM7CiB9CiAKLXN0YXRpYyBib29sIGlzX3BvaW50ZXJfdmFsdWUoc3RydWN0IHZlcmlmaWVyX2VudiAqZW52LCBpbnQgcmVnbm8pCitzdGF0aWMgYm9vbCBpc19wb2ludGVyX3ZhbHVlKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIGludCByZWdubykKIHsKIAlpZiAoZW52LT5hbGxvd19wdHJfbGVha3MpCiAJCXJldHVybiBmYWxzZTsKQEAgLTcwOCwyOCArNjc4LDE5IEBACiAJfQogfQogCi1zdGF0aWMgaW50IGNoZWNrX3B0cl9hbGlnbm1lbnQoc3RydWN0IHZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgcmVnX3N0YXRlICpyZWcsCi0JCQkgICAgICAgaW50IG9mZiwgaW50IHNpemUpCitzdGF0aWMgaW50IGNoZWNrX3B0cl9hbGlnbm1lbnQoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwKKwkJCSAgICAgICBzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVnLCBpbnQgb2ZmLCBpbnQgc2l6ZSkKIHsKLQlpZiAocmVnLT50eXBlICE9IFBUUl9UT19QQUNLRVQpIHsKKwlpZiAocmVnLT50eXBlICE9IFBUUl9UT19QQUNLRVQgJiYgcmVnLT50eXBlICE9IFBUUl9UT19NQVBfVkFMVUVfQURKKSB7CiAJCWlmIChvZmYgJSBzaXplICE9IDApIHsKLQkJCXZlcmJvc2UoIm1pc2FsaWduZWQgYWNjZXNzIG9mZiAlZCBzaXplICVkXG4iLCBvZmYsIHNpemUpOworCQkJdmVyYm9zZSgibWlzYWxpZ25lZCBhY2Nlc3Mgb2ZmICVkIHNpemUgJWRcbiIsCisJCQkJb2ZmLCBzaXplKTsKIAkJCXJldHVybiAtRUFDQ0VTOwogCQl9IGVsc2UgewogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CiAKLQlzd2l0Y2ggKGVudi0+cHJvZy0+dHlwZSkgewotCWNhc2UgQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFM6Ci0JY2FzZSBCUEZfUFJPR19UWVBFX1NDSEVEX0FDVDoKLQljYXNlIEJQRl9QUk9HX1RZUEVfWERQOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQl2ZXJib3NlKCJ2ZXJpZmllciBpcyBtaXNjb25maWd1cmVkXG4iKTsKLQkJcmV0dXJuIC1FQUNDRVM7Ci0JfQotCiAJaWYgKElTX0VOQUJMRUQoQ09ORklHX0hBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1MpKQogCQkvKiBtaXNhbGlnbmVkIGFjY2VzcyB0byBwYWNrZXQgaXMgb2sgb24geDg2LGFybSxhcm02NCAqLwogCQlyZXR1cm4gMDsKQEAgLTc0MCw3ICs3MDEsOCBAQAogCX0KIAogCS8qIHNrYi0+ZGF0YSBpcyBORVRfSVBfQUxJR04tZWQgKi8KLQlpZiAoKE5FVF9JUF9BTElHTiArIHJlZy0+b2ZmICsgb2ZmKSAlIHNpemUgIT0gMCkgeworCWlmIChyZWctPnR5cGUgPT0gUFRSX1RPX1BBQ0tFVCAmJgorCSAgICAoTkVUX0lQX0FMSUdOICsgcmVnLT5vZmYgKyBvZmYpICUgc2l6ZSAhPSAwKSB7CiAJCXZlcmJvc2UoIm1pc2FsaWduZWQgcGFja2V0IGFjY2VzcyBvZmYgJWQrJWQrJWQgc2l6ZSAlZFxuIiwKIAkJCU5FVF9JUF9BTElHTiwgcmVnLT5vZmYsIG9mZiwgc2l6ZSk7CiAJCXJldHVybiAtRUFDQ0VTOwpAQCAtNzU0LDEyICs3MTYsMTIgQEAKICAqIGlmIHQ9PXdyaXRlICYmIHZhbHVlX3JlZ25vPT0tMSwgc29tZSB1bmtub3duIHZhbHVlIGlzIHN0b3JlZCBpbnRvIG1lbW9yeQogICogaWYgdD09cmVhZCAmJiB2YWx1ZV9yZWdubz09LTEsIGRvbid0IGNhcmUgd2hhdCB3ZSByZWFkIGZyb20gbWVtb3J5CiAgKi8KLXN0YXRpYyBpbnQgY2hlY2tfbWVtX2FjY2VzcyhzdHJ1Y3QgdmVyaWZpZXJfZW52ICplbnYsIHUzMiByZWdubywgaW50IG9mZiwKK3N0YXRpYyBpbnQgY2hlY2tfbWVtX2FjY2VzcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgcmVnbm8sIGludCBvZmYsCiAJCQkgICAgaW50IGJwZl9zaXplLCBlbnVtIGJwZl9hY2Nlc3NfdHlwZSB0LAogCQkJICAgIGludCB2YWx1ZV9yZWdubykKIHsKLQlzdHJ1Y3QgdmVyaWZpZXJfc3RhdGUgKnN0YXRlID0gJmVudi0+Y3VyX3N0YXRlOwotCXN0cnVjdCByZWdfc3RhdGUgKnJlZyA9ICZzdGF0ZS0+cmVnc1tyZWdub107CisJc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZSAqc3RhdGUgPSAmZW52LT5jdXJfc3RhdGU7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZyA9ICZzdGF0ZS0+cmVnc1tyZWdub107CiAJaW50IHNpemUsIGVyciA9IDA7CiAKIAlpZiAocmVnLT50eXBlID09IFBUUl9UT19TVEFDSykKQEAgLTc3MywxMiArNzM1LDUyIEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWlmIChyZWctPnR5cGUgPT0gUFRSX1RPX01BUF9WQUxVRSkgeworCWlmIChyZWctPnR5cGUgPT0gUFRSX1RPX01BUF9WQUxVRSB8fAorCSAgICByZWctPnR5cGUgPT0gUFRSX1RPX01BUF9WQUxVRV9BREopIHsKIAkJaWYgKHQgPT0gQlBGX1dSSVRFICYmIHZhbHVlX3JlZ25vID49IDAgJiYKIAkJICAgIGlzX3BvaW50ZXJfdmFsdWUoZW52LCB2YWx1ZV9yZWdubykpIHsKIAkJCXZlcmJvc2UoIlIlZCBsZWFrcyBhZGRyIGludG8gbWFwXG4iLCB2YWx1ZV9yZWdubyk7CiAJCQlyZXR1cm4gLUVBQ0NFUzsKIAkJfQorCisJCS8qIElmIHdlIGFkanVzdGVkIHRoZSByZWdpc3RlciB0byB0aGlzIG1hcCB2YWx1ZSBhdCBhbGwgdGhlbiB3ZQorCQkgKiBuZWVkIHRvIGNoYW5nZSBvZmYgYW5kIHNpemUgdG8gbWluX3ZhbHVlIGFuZCBtYXhfdmFsdWUKKwkJICogcmVzcGVjdGl2ZWx5IHRvIG1ha2Ugc3VyZSBvdXIgdGhlb3JldGljYWwgYWNjZXNzIHdpbGwgYmUKKwkJICogc2FmZS4KKwkJICovCisJCWlmIChyZWctPnR5cGUgPT0gUFRSX1RPX01BUF9WQUxVRV9BREopIHsKKwkJCWlmIChsb2dfbGV2ZWwpCisJCQkJcHJpbnRfdmVyaWZpZXJfc3RhdGUoc3RhdGUpOworCQkJZW52LT52YXJsZW5fbWFwX3ZhbHVlX2FjY2VzcyA9IHRydWU7CisJCQkvKiBUaGUgbWluaW11bSB2YWx1ZSBpcyBvbmx5IGltcG9ydGFudCB3aXRoIHNpZ25lZAorCQkJICogY29tcGFyaXNvbnMgd2hlcmUgd2UgY2FuJ3QgYXNzdW1lIHRoZSBmbG9vciBvZiBhCisJCQkgKiB2YWx1ZSBpcyAwLiAgSWYgd2UgYXJlIHVzaW5nIHNpZ25lZCB2YXJpYWJsZXMgZm9yIG91cgorCQkJICogaW5kZXgnZXMgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB3aGF0ZXZlciB3ZSB1c2UKKwkJCSAqIHdpbGwgaGF2ZSBhIHNldCBmbG9vciB3aXRoaW4gb3VyIHJhbmdlLgorCQkJICovCisJCQlpZiAoKHM2NClyZWctPm1pbl92YWx1ZSA8IDApIHsKKwkJCQl2ZXJib3NlKCJSJWQgbWluIHZhbHVlIGlzIG5lZ2F0aXZlLCBlaXRoZXIgdXNlIHVuc2lnbmVkIGluZGV4IG9yIGRvIGEgaWYgKGluZGV4ID49MCkgY2hlY2suXG4iLAorCQkJCQlyZWdubyk7CisJCQkJcmV0dXJuIC1FQUNDRVM7CisJCQl9CisJCQllcnIgPSBjaGVja19tYXBfYWNjZXNzKGVudiwgcmVnbm8sIHJlZy0+bWluX3ZhbHVlICsgb2ZmLAorCQkJCQkgICAgICAgc2l6ZSk7CisJCQlpZiAoZXJyKSB7CisJCQkJdmVyYm9zZSgiUiVkIG1pbiB2YWx1ZSBpcyBvdXRzaWRlIG9mIHRoZSBhcnJheSByYW5nZVxuIiwKKwkJCQkJcmVnbm8pOworCQkJCXJldHVybiBlcnI7CisJCQl9CisKKwkJCS8qIElmIHdlIGhhdmVuJ3Qgc2V0IGEgbWF4IHZhbHVlIHRoZW4gd2UgbmVlZCB0byBiYWlsCisJCQkgKiBzaW5jZSB3ZSBjYW4ndCBiZSBzdXJlIHdlIHdvbid0IGRvIGJhZCB0aGluZ3MuCisJCQkgKi8KKwkJCWlmIChyZWctPm1heF92YWx1ZSA9PSBCUEZfUkVHSVNURVJfTUFYX1JBTkdFKSB7CisJCQkJdmVyYm9zZSgiUiVkIHVuYm91bmRlZCBtZW1vcnkgYWNjZXNzLCBtYWtlIHN1cmUgdG8gYm91bmRzIGNoZWNrIGFueSBhcnJheSBhY2Nlc3MgaW50byBhIG1hcFxuIiwKKwkJCQkJcmVnbm8pOworCQkJCXJldHVybiAtRUFDQ0VTOworCQkJfQorCQkJb2ZmICs9IHJlZy0+bWF4X3ZhbHVlOworCQl9CiAJCWVyciA9IGNoZWNrX21hcF9hY2Nlc3MoZW52LCByZWdubywgb2ZmLCBzaXplKTsKIAkJaWYgKCFlcnIgJiYgdCA9PSBCUEZfUkVBRCAmJiB2YWx1ZV9yZWdubyA+PSAwKQogCQkJbWFya19yZWdfdW5rbm93bl92YWx1ZShzdGF0ZS0+cmVncywgdmFsdWVfcmVnbm8pOwpAQCAtNzk0LDkgKzc5Niw4IEBACiAJCWVyciA9IGNoZWNrX2N0eF9hY2Nlc3MoZW52LCBvZmYsIHNpemUsIHQsICZyZWdfdHlwZSk7CiAJCWlmICghZXJyICYmIHQgPT0gQlBGX1JFQUQgJiYgdmFsdWVfcmVnbm8gPj0gMCkgewogCQkJbWFya19yZWdfdW5rbm93bl92YWx1ZShzdGF0ZS0+cmVncywgdmFsdWVfcmVnbm8pOwotCQkJaWYgKGVudi0+YWxsb3dfcHRyX2xlYWtzKQotCQkJCS8qIG5vdGUgdGhhdCByZWcuW2lkfG9mZnxyYW5nZV0gPT0gMCAqLwotCQkJCXN0YXRlLT5yZWdzW3ZhbHVlX3JlZ25vXS50eXBlID0gcmVnX3R5cGU7CisJCQkvKiBub3RlIHRoYXQgcmVnLltpZHxvZmZ8cmFuZ2VdID09IDAgKi8KKwkJCXN0YXRlLT5yZWdzW3ZhbHVlX3JlZ25vXS50eXBlID0gcmVnX3R5cGU7CiAJCX0KIAogCX0gZWxzZSBpZiAocmVnLT50eXBlID09IEZSQU1FX1BUUiB8fCByZWctPnR5cGUgPT0gUFRSX1RPX1NUQUNLKSB7CkBAIC04MTYsNyArODE3LDcgQEAKIAkJCWVyciA9IGNoZWNrX3N0YWNrX3JlYWQoc3RhdGUsIG9mZiwgc2l6ZSwgdmFsdWVfcmVnbm8pOwogCQl9CiAJfSBlbHNlIGlmIChzdGF0ZS0+cmVnc1tyZWdub10udHlwZSA9PSBQVFJfVE9fUEFDS0VUKSB7Ci0JCWlmICh0ID09IEJQRl9XUklURSAmJiAhbWF5X3dyaXRlX3BrdF9kYXRhKGVudi0+cHJvZy0+dHlwZSkpIHsKKwkJaWYgKHQgPT0gQlBGX1dSSVRFICYmICFtYXlfYWNjZXNzX2RpcmVjdF9wa3RfZGF0YShlbnYsIE5VTEwpKSB7CiAJCQl2ZXJib3NlKCJjYW5ub3Qgd3JpdGUgaW50byBwYWNrZXRcbiIpOwogCQkJcmV0dXJuIC1FQUNDRVM7CiAJCX0KQEAgLTg0NSw5ICs4NDYsOSBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tfeGFkZChzdHJ1Y3QgdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbikKK3N0YXRpYyBpbnQgY2hlY2tfeGFkZChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24pCiB7Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqcmVncyA9IGVudi0+Y3VyX3N0YXRlLnJlZ3M7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZ3MgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzOwogCWludCBlcnI7CiAKIAlpZiAoKEJQRl9TSVpFKGluc24tPmNvZGUpICE9IEJQRl9XICYmIEJQRl9TSVpFKGluc24tPmNvZGUpICE9IEJQRl9EVykgfHwKQEAgLTg4MSwxMiArODgyLDEyIEBACiAgKiBieXRlcyBmcm9tIHRoYXQgcG9pbnRlciwgbWFrZSBzdXJlIHRoYXQgaXQncyB3aXRoaW4gc3RhY2sgYm91bmRhcnkKICAqIGFuZCBhbGwgZWxlbWVudHMgb2Ygc3RhY2sgYXJlIGluaXRpYWxpemVkCiAgKi8KLXN0YXRpYyBpbnQgY2hlY2tfc3RhY2tfYm91bmRhcnkoc3RydWN0IHZlcmlmaWVyX2VudiAqZW52LCBpbnQgcmVnbm8sCitzdGF0aWMgaW50IGNoZWNrX3N0YWNrX2JvdW5kYXJ5KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIGludCByZWdubywKIAkJCQlpbnQgYWNjZXNzX3NpemUsIGJvb2wgemVyb19zaXplX2FsbG93ZWQsCiAJCQkJc3RydWN0IGJwZl9jYWxsX2FyZ19tZXRhICptZXRhKQogewotCXN0cnVjdCB2ZXJpZmllcl9zdGF0ZSAqc3RhdGUgPSAmZW52LT5jdXJfc3RhdGU7Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqcmVncyA9IHN0YXRlLT5yZWdzOworCXN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgKnN0YXRlID0gJmVudi0+Y3VyX3N0YXRlOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWdzID0gc3RhdGUtPnJlZ3M7CiAJaW50IG9mZiwgaTsKIAogCWlmIChyZWdzW3JlZ25vXS50eXBlICE9IFBUUl9UT19TVEFDSykgewpAQCAtOTI1LDE4ICs5MjYsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjaGVja19mdW5jX2FyZyhzdHJ1Y3QgdmVyaWZpZXJfZW52ICplbnYsIHUzMiByZWdubywKK3N0YXRpYyBpbnQgY2hlY2tfZnVuY19hcmcoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIHJlZ25vLAogCQkJICBlbnVtIGJwZl9hcmdfdHlwZSBhcmdfdHlwZSwKIAkJCSAgc3RydWN0IGJwZl9jYWxsX2FyZ19tZXRhICptZXRhKQogewotCXN0cnVjdCByZWdfc3RhdGUgKnJlZyA9IGVudi0+Y3VyX3N0YXRlLnJlZ3MgKyByZWdubzsKLQllbnVtIGJwZl9yZWdfdHlwZSBleHBlY3RlZF90eXBlOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWdzID0gZW52LT5jdXJfc3RhdGUucmVncywgKnJlZyA9ICZyZWdzW3JlZ25vXTsKKwllbnVtIGJwZl9yZWdfdHlwZSBleHBlY3RlZF90eXBlLCB0eXBlID0gcmVnLT50eXBlOwogCWludCBlcnIgPSAwOwogCiAJaWYgKGFyZ190eXBlID09IEFSR19ET05UQ0FSRSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAocmVnLT50eXBlID09IE5PVF9JTklUKSB7CisJaWYgKHR5cGUgPT0gTk9UX0lOSVQpIHsKIAkJdmVyYm9zZSgiUiVkICFyZWFkX29rXG4iLCByZWdubyk7CiAJCXJldHVybiAtRUFDQ0VTOwogCX0KQEAgLTk0OSwxNiArOTUwLDI5IEBACiAJCXJldHVybiAwOwogCX0KIAorCWlmICh0eXBlID09IFBUUl9UT19QQUNLRVQgJiYgIW1heV9hY2Nlc3NfZGlyZWN0X3BrdF9kYXRhKGVudiwgbWV0YSkpIHsKKwkJdmVyYm9zZSgiaGVscGVyIGFjY2VzcyB0byB0aGUgcGFja2V0IGlzIG5vdCBhbGxvd2VkXG4iKTsKKwkJcmV0dXJuIC1FQUNDRVM7CisJfQorCiAJaWYgKGFyZ190eXBlID09IEFSR19QVFJfVE9fTUFQX0tFWSB8fAogCSAgICBhcmdfdHlwZSA9PSBBUkdfUFRSX1RPX01BUF9WQUxVRSkgewogCQlleHBlY3RlZF90eXBlID0gUFRSX1RPX1NUQUNLOworCQlpZiAodHlwZSAhPSBQVFJfVE9fUEFDS0VUICYmIHR5cGUgIT0gZXhwZWN0ZWRfdHlwZSkKKwkJCWdvdG8gZXJyX3R5cGU7CiAJfSBlbHNlIGlmIChhcmdfdHlwZSA9PSBBUkdfQ09OU1RfU1RBQ0tfU0laRSB8fAogCQkgICBhcmdfdHlwZSA9PSBBUkdfQ09OU1RfU1RBQ0tfU0laRV9PUl9aRVJPKSB7CiAJCWV4cGVjdGVkX3R5cGUgPSBDT05TVF9JTU07CisJCWlmICh0eXBlICE9IGV4cGVjdGVkX3R5cGUpCisJCQlnb3RvIGVycl90eXBlOwogCX0gZWxzZSBpZiAoYXJnX3R5cGUgPT0gQVJHX0NPTlNUX01BUF9QVFIpIHsKIAkJZXhwZWN0ZWRfdHlwZSA9IENPTlNUX1BUUl9UT19NQVA7CisJCWlmICh0eXBlICE9IGV4cGVjdGVkX3R5cGUpCisJCQlnb3RvIGVycl90eXBlOwogCX0gZWxzZSBpZiAoYXJnX3R5cGUgPT0gQVJHX1BUUl9UT19DVFgpIHsKIAkJZXhwZWN0ZWRfdHlwZSA9IFBUUl9UT19DVFg7CisJCWlmICh0eXBlICE9IGV4cGVjdGVkX3R5cGUpCisJCQlnb3RvIGVycl90eXBlOwogCX0gZWxzZSBpZiAoYXJnX3R5cGUgPT0gQVJHX1BUUl9UT19TVEFDSyB8fAogCQkgICBhcmdfdHlwZSA9PSBBUkdfUFRSX1RPX1JBV19TVEFDSykgewogCQlleHBlY3RlZF90eXBlID0gUFRSX1RPX1NUQUNLOwpAQCAtOTY2LDIwICs5ODAsMTYgQEAKIAkJICogcGFzc2VkIGluIGFzIGFyZ3VtZW50LCBpdCdzIGEgQ09OU1RfSU1NIHR5cGUuIEZpbmFsIHRlc3QKIAkJICogaGFwcGVucyBkdXJpbmcgc3RhY2sgYm91bmRhcnkgY2hlY2tpbmcuCiAJCSAqLwotCQlpZiAocmVnLT50eXBlID09IENPTlNUX0lNTSAmJiByZWctPmltbSA9PSAwKQotCQkJZXhwZWN0ZWRfdHlwZSA9IENPTlNUX0lNTTsKKwkJaWYgKHR5cGUgPT0gQ09OU1RfSU1NICYmIHJlZy0+aW1tID09IDApCisJCQkvKiBmaW5hbCB0ZXN0IGluIGNoZWNrX3N0YWNrX2JvdW5kYXJ5KCkgKi87CisJCWVsc2UgaWYgKHR5cGUgIT0gUFRSX1RPX1BBQ0tFVCAmJiB0eXBlICE9IGV4cGVjdGVkX3R5cGUpCisJCQlnb3RvIGVycl90eXBlOwogCQltZXRhLT5yYXdfbW9kZSA9IGFyZ190eXBlID09IEFSR19QVFJfVE9fUkFXX1NUQUNLOwogCX0gZWxzZSB7CiAJCXZlcmJvc2UoInVuc3VwcG9ydGVkIGFyZ190eXBlICVkXG4iLCBhcmdfdHlwZSk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCWlmIChyZWctPnR5cGUgIT0gZXhwZWN0ZWRfdHlwZSkgewotCQl2ZXJib3NlKCJSJWQgdHlwZT0lcyBleHBlY3RlZD0lc1xuIiwgcmVnbm8sCi0JCQlyZWdfdHlwZV9zdHJbcmVnLT50eXBlXSwgcmVnX3R5cGVfc3RyW2V4cGVjdGVkX3R5cGVdKTsKLQkJcmV0dXJuIC1FQUNDRVM7Ci0JfQotCiAJaWYgKGFyZ190eXBlID09IEFSR19DT05TVF9NQVBfUFRSKSB7CiAJCS8qIGJwZl9tYXBfeHh4KG1hcF9wdHIpIGNhbGw6IHJlbWVtYmVyIHRoYXQgbWFwX3B0ciAqLwogCQltZXRhLT5tYXBfcHRyID0gcmVnLT5tYXBfcHRyOwpAQCAtOTk3LDggKzEwMDcsMTMgQEAKIAkJCXZlcmJvc2UoImludmFsaWQgbWFwX3B0ciB0byBhY2Nlc3MgbWFwLT5rZXlcbiIpOwogCQkJcmV0dXJuIC1FQUNDRVM7CiAJCX0KLQkJZXJyID0gY2hlY2tfc3RhY2tfYm91bmRhcnkoZW52LCByZWdubywgbWV0YS0+bWFwX3B0ci0+a2V5X3NpemUsCi0JCQkJCSAgIGZhbHNlLCBOVUxMKTsKKwkJaWYgKHR5cGUgPT0gUFRSX1RPX1BBQ0tFVCkKKwkJCWVyciA9IGNoZWNrX3BhY2tldF9hY2Nlc3MoZW52LCByZWdubywgMCwKKwkJCQkJCSAgbWV0YS0+bWFwX3B0ci0+a2V5X3NpemUpOworCQllbHNlCisJCQllcnIgPSBjaGVja19zdGFja19ib3VuZGFyeShlbnYsIHJlZ25vLAorCQkJCQkJICAgbWV0YS0+bWFwX3B0ci0+a2V5X3NpemUsCisJCQkJCQkgICBmYWxzZSwgTlVMTCk7CiAJfSBlbHNlIGlmIChhcmdfdHlwZSA9PSBBUkdfUFRSX1RPX01BUF9WQUxVRSkgewogCQkvKiBicGZfbWFwX3h4eCguLi4sIG1hcF9wdHIsIC4uLiwgdmFsdWUpIGNhbGw6CiAJCSAqIGNoZWNrIFt2YWx1ZSwgdmFsdWUgKyBtYXAtPnZhbHVlX3NpemUpIHZhbGlkaXR5CkBAIC0xMDA4LDkgKzEwMjMsMTMgQEAKIAkJCXZlcmJvc2UoImludmFsaWQgbWFwX3B0ciB0byBhY2Nlc3MgbWFwLT52YWx1ZVxuIik7CiAJCQlyZXR1cm4gLUVBQ0NFUzsKIAkJfQotCQllcnIgPSBjaGVja19zdGFja19ib3VuZGFyeShlbnYsIHJlZ25vLAotCQkJCQkgICBtZXRhLT5tYXBfcHRyLT52YWx1ZV9zaXplLAotCQkJCQkgICBmYWxzZSwgTlVMTCk7CisJCWlmICh0eXBlID09IFBUUl9UT19QQUNLRVQpCisJCQllcnIgPSBjaGVja19wYWNrZXRfYWNjZXNzKGVudiwgcmVnbm8sIDAsCisJCQkJCQkgIG1ldGEtPm1hcF9wdHItPnZhbHVlX3NpemUpOworCQllbHNlCisJCQllcnIgPSBjaGVja19zdGFja19ib3VuZGFyeShlbnYsIHJlZ25vLAorCQkJCQkJICAgbWV0YS0+bWFwX3B0ci0+dmFsdWVfc2l6ZSwKKwkJCQkJCSAgIGZhbHNlLCBOVUxMKTsKIAl9IGVsc2UgaWYgKGFyZ190eXBlID09IEFSR19DT05TVF9TVEFDS19TSVpFIHx8CiAJCSAgIGFyZ190eXBlID09IEFSR19DT05TVF9TVEFDS19TSVpFX09SX1pFUk8pIHsKIAkJYm9vbCB6ZXJvX3NpemVfYWxsb3dlZCA9IChhcmdfdHlwZSA9PSBBUkdfQ09OU1RfU1RBQ0tfU0laRV9PUl9aRVJPKTsKQEAgLTEwMjQsMTEgKzEwNDMsMTggQEAKIAkJCXZlcmJvc2UoIkFSR19DT05TVF9TVEFDS19TSVpFIGNhbm5vdCBiZSBmaXJzdCBhcmd1bWVudFxuIik7CiAJCQlyZXR1cm4gLUVBQ0NFUzsKIAkJfQotCQllcnIgPSBjaGVja19zdGFja19ib3VuZGFyeShlbnYsIHJlZ25vIC0gMSwgcmVnLT5pbW0sCi0JCQkJCSAgIHplcm9fc2l6ZV9hbGxvd2VkLCBtZXRhKTsKKwkJaWYgKHJlZ3NbcmVnbm8gLSAxXS50eXBlID09IFBUUl9UT19QQUNLRVQpCisJCQllcnIgPSBjaGVja19wYWNrZXRfYWNjZXNzKGVudiwgcmVnbm8gLSAxLCAwLCByZWctPmltbSk7CisJCWVsc2UKKwkJCWVyciA9IGNoZWNrX3N0YWNrX2JvdW5kYXJ5KGVudiwgcmVnbm8gLSAxLCByZWctPmltbSwKKwkJCQkJCSAgIHplcm9fc2l6ZV9hbGxvd2VkLCBtZXRhKTsKIAl9CiAKIAlyZXR1cm4gZXJyOworZXJyX3R5cGU6CisJdmVyYm9zZSgiUiVkIHR5cGU9JXMgZXhwZWN0ZWQ9JXNcbiIsIHJlZ25vLAorCQlyZWdfdHlwZV9zdHJbdHlwZV0sIHJlZ190eXBlX3N0cltleHBlY3RlZF90eXBlXSk7CisJcmV0dXJuIC1FQUNDRVM7CiB9CiAKIHN0YXRpYyBpbnQgY2hlY2tfbWFwX2Z1bmNfY29tcGF0aWJpbGl0eShzdHJ1Y3QgYnBmX21hcCAqbWFwLCBpbnQgZnVuY19pZCkKQEAgLTEwNTIsNyArMTA3OCw4IEBACiAJCQlnb3RvIGVycm9yOwogCQlicmVhazsKIAljYXNlIEJQRl9NQVBfVFlQRV9DR1JPVVBfQVJSQVk6Ci0JCWlmIChmdW5jX2lkICE9IEJQRl9GVU5DX3NrYl9pbl9jZ3JvdXApCisJCWlmIChmdW5jX2lkICE9IEJQRl9GVU5DX3NrYl91bmRlcl9jZ3JvdXAgJiYKKwkJICAgIGZ1bmNfaWQgIT0gQlBGX0ZVTkNfY3VycmVudF90YXNrX3VuZGVyX2Nncm91cCkKIAkJCWdvdG8gZXJyb3I7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0xMDc0LDcgKzExMDEsOCBAQAogCQlpZiAobWFwLT5tYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfU1RBQ0tfVFJBQ0UpCiAJCQlnb3RvIGVycm9yOwogCQlicmVhazsKLQljYXNlIEJQRl9GVU5DX3NrYl9pbl9jZ3JvdXA6CisJY2FzZSBCUEZfRlVOQ19jdXJyZW50X3Rhc2tfdW5kZXJfY2dyb3VwOgorCWNhc2UgQlBGX0ZVTkNfc2tiX3VuZGVyX2Nncm91cDoKIAkJaWYgKG1hcC0+bWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX0NHUk9VUF9BUlJBWSkKIAkJCWdvdG8gZXJyb3I7CiAJCWJyZWFrOwpAQCAtMTEwNywxMCArMTEzNSwxMCBAQAogCXJldHVybiBjb3VudCA+IDEgPyAtRUlOVkFMIDogMDsKIH0KIAotc3RhdGljIHZvaWQgY2xlYXJfYWxsX3BrdF9wb2ludGVycyhzdHJ1Y3QgdmVyaWZpZXJfZW52ICplbnYpCitzdGF0aWMgdm9pZCBjbGVhcl9hbGxfcGt0X3BvaW50ZXJzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpCiB7Ci0Jc3RydWN0IHZlcmlmaWVyX3N0YXRlICpzdGF0ZSA9ICZlbnYtPmN1cl9zdGF0ZTsKLQlzdHJ1Y3QgcmVnX3N0YXRlICpyZWdzID0gc3RhdGUtPnJlZ3MsICpyZWc7CisJc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZSAqc3RhdGUgPSAmZW52LT5jdXJfc3RhdGU7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZ3MgPSBzdGF0ZS0+cmVncywgKnJlZzsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBNQVhfQlBGX1JFRzsgaSsrKQpAQCAtMTEzMCwxMiArMTE1OCwxMiBAQAogCX0KIH0KIAotc3RhdGljIGludCBjaGVja19jYWxsKHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudiwgaW50IGZ1bmNfaWQpCitzdGF0aWMgaW50IGNoZWNrX2NhbGwoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgaW50IGZ1bmNfaWQpCiB7Ci0Jc3RydWN0IHZlcmlmaWVyX3N0YXRlICpzdGF0ZSA9ICZlbnYtPmN1cl9zdGF0ZTsKKwlzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YXRlICpzdGF0ZSA9ICZlbnYtPmN1cl9zdGF0ZTsKIAljb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gKmZuID0gTlVMTDsKLQlzdHJ1Y3QgcmVnX3N0YXRlICpyZWdzID0gc3RhdGUtPnJlZ3M7Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqcmVnOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWdzID0gc3RhdGUtPnJlZ3M7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZzsKIAlzdHJ1Y3QgYnBmX2NhbGxfYXJnX21ldGEgbWV0YTsKIAlib29sIGNoYW5nZXNfZGF0YTsKIAlpbnQgaSwgZXJyOwpAQCAtMTE2Myw2ICsxMTkxLDcgQEAKIAljaGFuZ2VzX2RhdGEgPSBicGZfaGVscGVyX2NoYW5nZXNfc2tiX2RhdGEoZm4tPmZ1bmMpOwogCiAJbWVtc2V0KCZtZXRhLCAwLCBzaXplb2YobWV0YSkpOworCW1ldGEucGt0X2FjY2VzcyA9IGZuLT5wa3RfYWNjZXNzOwogCiAJLyogV2Ugb25seSBzdXBwb3J0IG9uZSBhcmcgYmVpbmcgaW4gcmF3IG1vZGUgYXQgdGhlIG1vbWVudCwgd2hpY2gKIAkgKiBpcyBzdWZmaWNpZW50IGZvciB0aGUgaGVscGVyIGZ1bmN0aW9ucyB3ZSBoYXZlIHJpZ2h0IG5vdy4KQEAgLTEyMTMsNiArMTI0Miw3IEBACiAJCXJlZ3NbQlBGX1JFR18wXS50eXBlID0gTk9UX0lOSVQ7CiAJfSBlbHNlIGlmIChmbi0+cmV0X3R5cGUgPT0gUkVUX1BUUl9UT19NQVBfVkFMVUVfT1JfTlVMTCkgewogCQlyZWdzW0JQRl9SRUdfMF0udHlwZSA9IFBUUl9UT19NQVBfVkFMVUVfT1JfTlVMTDsKKwkJcmVnc1tCUEZfUkVHXzBdLm1heF92YWx1ZSA9IHJlZ3NbQlBGX1JFR18wXS5taW5fdmFsdWUgPSAwOwogCQkvKiByZW1lbWJlciBtYXBfcHRyLCBzbyB0aGF0IGNoZWNrX21hcF9hY2Nlc3MoKQogCQkgKiBjYW4gY2hlY2sgJ3ZhbHVlX3NpemUnIGJvdW5kYXJ5IG9mIG1lbW9yeSBhY2Nlc3MKIAkJICogdG8gbWFwIGVsZW1lbnQgcmV0dXJuZWQgZnJvbSBicGZfbWFwX2xvb2t1cF9lbGVtKCkKQEAgLTEyMzcsMTIgKzEyNjcsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjaGVja19wYWNrZXRfcHRyX2FkZChzdHJ1Y3QgdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbikKK3N0YXRpYyBpbnQgY2hlY2tfcGFja2V0X3B0cl9hZGQoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwKKwkJCQlzdHJ1Y3QgYnBmX2luc24gKmluc24pCiB7Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqcmVncyA9IGVudi0+Y3VyX3N0YXRlLnJlZ3M7Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqZHN0X3JlZyA9ICZyZWdzW2luc24tPmRzdF9yZWddOwotCXN0cnVjdCByZWdfc3RhdGUgKnNyY19yZWcgPSAmcmVnc1tpbnNuLT5zcmNfcmVnXTsKLQlzdHJ1Y3QgcmVnX3N0YXRlIHRtcF9yZWc7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZ3MgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpkc3RfcmVnID0gJnJlZ3NbaW5zbi0+ZHN0X3JlZ107CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnNyY19yZWcgPSAmcmVnc1tpbnNuLT5zcmNfcmVnXTsKKwlzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSB0bXBfcmVnOwogCXMzMiBpbW07CiAKIAlpZiAoQlBGX1NSQyhpbnNuLT5jb2RlKSA9PSBCUEZfSykgewpAQCAtMTMwMSw3ICsxMzMyLDcgQEAKIAkJLyogZHN0X3JlZyBzdGF5cyBhcyBwa3RfcHRyIHR5cGUgYW5kIHNpbmNlIHNvbWUgcG9zaXRpdmUKIAkJICogaW50ZWdlciB2YWx1ZSB3YXMgYWRkZWQgdG8gdGhlIHBvaW50ZXIsIGluY3JlbWVudCBpdHMgJ2lkJwogCQkgKi8KLQkJZHN0X3JlZy0+aWQrKzsKKwkJZHN0X3JlZy0+aWQgPSArK2Vudi0+aWRfZ2VuOwogCiAJCS8qIHNvbWV0aGluZyB3YXMgYWRkZWQgdG8gcGt0X3B0ciwgc2V0IHJhbmdlIGFuZCBvZmYgdG8gemVybyAqLwogCQlkc3RfcmVnLT5vZmYgPSAwOwpAQCAtMTMxMCwxMCArMTM0MSwxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGV2YWx1YXRlX3JlZ19hbHUoc3RydWN0IHZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24pCitzdGF0aWMgaW50IGV2YWx1YXRlX3JlZ19hbHUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuKQogewotCXN0cnVjdCByZWdfc3RhdGUgKnJlZ3MgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzOwotCXN0cnVjdCByZWdfc3RhdGUgKmRzdF9yZWcgPSAmcmVnc1tpbnNuLT5kc3RfcmVnXTsKKwlzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVncyA9IGVudi0+Y3VyX3N0YXRlLnJlZ3M7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKmRzdF9yZWcgPSAmcmVnc1tpbnNuLT5kc3RfcmVnXTsKIAl1OCBvcGNvZGUgPSBCUEZfT1AoaW5zbi0+Y29kZSk7CiAJczY0IGltbV9sb2cyOwogCkBAIC0xMzIzLDcgKzEzNTQsNyBAQAogCSAqLwogCiAJaWYgKEJQRl9TUkMoaW5zbi0+Y29kZSkgPT0gQlBGX1gpIHsKLQkJc3RydWN0IHJlZ19zdGF0ZSAqc3JjX3JlZyA9ICZyZWdzW2luc24tPnNyY19yZWddOworCQlzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqc3JjX3JlZyA9ICZyZWdzW2luc24tPnNyY19yZWddOwogCiAJCWlmIChzcmNfcmVnLT50eXBlID09IFVOS05PV05fVkFMVUUgJiYgc3JjX3JlZy0+aW1tID4gMCAmJgogCQkgICAgZHN0X3JlZy0+aW1tICYmIG9wY29kZSA9PSBCUEZfQUREKSB7CkBAIC0xNDEyLDExICsxNDQzLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZXZhbHVhdGVfcmVnX2ltbV9hbHUoc3RydWN0IHZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24pCitzdGF0aWMgaW50IGV2YWx1YXRlX3JlZ19pbW1fYWx1KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsCisJCQkJc3RydWN0IGJwZl9pbnNuICppbnNuKQogewotCXN0cnVjdCByZWdfc3RhdGUgKnJlZ3MgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzOwotCXN0cnVjdCByZWdfc3RhdGUgKmRzdF9yZWcgPSAmcmVnc1tpbnNuLT5kc3RfcmVnXTsKLQlzdHJ1Y3QgcmVnX3N0YXRlICpzcmNfcmVnID0gJnJlZ3NbaW5zbi0+c3JjX3JlZ107CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZ3MgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpkc3RfcmVnID0gJnJlZ3NbaW5zbi0+ZHN0X3JlZ107CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnNyY19yZWcgPSAmcmVnc1tpbnNuLT5zcmNfcmVnXTsKIAl1OCBvcGNvZGUgPSBCUEZfT1AoaW5zbi0+Y29kZSk7CiAKIAkvKiBkc3RfcmVnLT50eXBlID09IENPTlNUX0lNTSBoZXJlLCBzaW11bGF0ZSBleGVjdXRpb24gb2YgJ2FkZCcgaW5zbi4KQEAgLTE0MzIsMTAgKzE0NjQsMTEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIGNoZWNrIHZhbGlkaXR5IG9mIDMyLWJpdCBhbmQgNjQtYml0IGFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLwotc3RhdGljIGludCBjaGVja19hbHVfb3Aoc3RydWN0IHZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24pCitzdGF0aWMgdm9pZCBjaGVja19yZWdfb3ZlcmZsb3coc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZykKIHsKLQlzdHJ1Y3QgcmVnX3N0YXRlICpyZWdzID0gZW52LT5jdXJfc3RhdGUucmVncywgKmRzdF9yZWc7CisJaWYgKHJlZy0+bWF4X3ZhbHVlID4gQlBGX1JFR0lTVEVSX01BWF9SQU5HRSkKKwkJcmVnLT5tYXhfdmFsdWUgPSBCUEZfUkVHSVNURVJfTUFYX1JBTkdFOworCWlmICgoczY0KXJlZy0+bWluX3ZhbHVlIDwgQlBGX1JFR0lTVEVSX01JTl9SQU5HRSkKKwkJcmVnLT5taW5fdmFsdWUgPSBCUEZfUkVHSVNURVJfTUlOX1JBTkdFOworfQorCitzdGF0aWMgdm9pZCBhZGp1c3RfcmVnX21pbl9tYXhfdmFscyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LAorCQkJCSAgICBzdHJ1Y3QgYnBmX2luc24gKmluc24pCit7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZ3MgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzLCAqZHN0X3JlZzsKKwl1NjQgbWluX3ZhbCA9IEJQRl9SRUdJU1RFUl9NSU5fUkFOR0UsIG1heF92YWwgPSBCUEZfUkVHSVNURVJfTUFYX1JBTkdFOworCWJvb2wgbWluX3NldCA9IGZhbHNlLCBtYXhfc2V0ID0gZmFsc2U7CisJdTggb3Bjb2RlID0gQlBGX09QKGluc24tPmNvZGUpOworCisJZHN0X3JlZyA9ICZyZWdzW2luc24tPmRzdF9yZWddOworCWlmIChCUEZfU1JDKGluc24tPmNvZGUpID09IEJQRl9YKSB7CisJCWNoZWNrX3JlZ19vdmVyZmxvdygmcmVnc1tpbnNuLT5zcmNfcmVnXSk7CisJCW1pbl92YWwgPSByZWdzW2luc24tPnNyY19yZWddLm1pbl92YWx1ZTsKKwkJbWF4X3ZhbCA9IHJlZ3NbaW5zbi0+c3JjX3JlZ10ubWF4X3ZhbHVlOworCisJCS8qIElmIHRoZSBzb3VyY2UgcmVnaXN0ZXIgaXMgYSByYW5kb20gcG9pbnRlciB0aGVuIHRoZQorCQkgKiBtaW5fdmFsdWUvbWF4X3ZhbHVlIHZhbHVlcyByZXByZXNlbnQgdGhlIHJhbmdlIG9mIHRoZSBrbm93bgorCQkgKiBhY2Nlc3NlcyBpbnRvIHRoYXQgdmFsdWUsIG5vdCB0aGUgYWN0dWFsIG1pbi9tYXggdmFsdWUgb2YgdGhlCisJCSAqIHJlZ2lzdGVyIGl0c2VsZi4gIEluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIHJlc2V0IHRoZSByZWcgcmFuZ2UKKwkJICogdmFsdWVzIHNvIHdlIGtub3cgaXQgaXMgbm90IHNhZmUgdG8gbG9vayBhdC4KKwkJICovCisJCWlmIChyZWdzW2luc24tPnNyY19yZWddLnR5cGUgIT0gQ09OU1RfSU1NICYmCisJCSAgICByZWdzW2luc24tPnNyY19yZWddLnR5cGUgIT0gVU5LTk9XTl9WQUxVRSkgeworCQkJbWluX3ZhbCA9IEJQRl9SRUdJU1RFUl9NSU5fUkFOR0U7CisJCQltYXhfdmFsID0gQlBGX1JFR0lTVEVSX01BWF9SQU5HRTsKKwkJfQorCX0gZWxzZSBpZiAoaW5zbi0+aW1tIDwgQlBGX1JFR0lTVEVSX01BWF9SQU5HRSAmJgorCQkgICAoczY0KWluc24tPmltbSA+IEJQRl9SRUdJU1RFUl9NSU5fUkFOR0UpIHsKKwkJbWluX3ZhbCA9IG1heF92YWwgPSBpbnNuLT5pbW07CisJCW1pbl9zZXQgPSBtYXhfc2V0ID0gdHJ1ZTsKKwl9CisKKwkvKiBXZSBkb24ndCBrbm93IGFueXRoaW5nIGFib3V0IHdoYXQgd2FzIGRvbmUgdG8gdGhpcyByZWdpc3RlciwgbWFyayBpdAorCSAqIGFzIHVua25vd24uCisJICovCisJaWYgKG1pbl92YWwgPT0gQlBGX1JFR0lTVEVSX01JTl9SQU5HRSAmJgorCSAgICBtYXhfdmFsID09IEJQRl9SRUdJU1RFUl9NQVhfUkFOR0UpIHsKKwkJcmVzZXRfcmVnX3JhbmdlX3ZhbHVlcyhyZWdzLCBpbnNuLT5kc3RfcmVnKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSBCUEZfQUREOgorCQlkc3RfcmVnLT5taW5fdmFsdWUgKz0gbWluX3ZhbDsKKwkJZHN0X3JlZy0+bWF4X3ZhbHVlICs9IG1heF92YWw7CisJCWJyZWFrOworCWNhc2UgQlBGX1NVQjoKKwkJZHN0X3JlZy0+bWluX3ZhbHVlIC09IG1pbl92YWw7CisJCWRzdF9yZWctPm1heF92YWx1ZSAtPSBtYXhfdmFsOworCQlicmVhazsKKwljYXNlIEJQRl9NVUw6CisJCWRzdF9yZWctPm1pbl92YWx1ZSAqPSBtaW5fdmFsOworCQlkc3RfcmVnLT5tYXhfdmFsdWUgKj0gbWF4X3ZhbDsKKwkJYnJlYWs7CisJY2FzZSBCUEZfQU5EOgorCQkvKiAmIGlzIHNwZWNpYWwgc2luY2UgaXQgY291bGQgZW5kIHVwIHdpdGggMCBiaXRzIHNldC4gKi8KKwkJZHN0X3JlZy0+bWluX3ZhbHVlICY9IG1pbl92YWw7CisJCWRzdF9yZWctPm1heF92YWx1ZSA9IG1heF92YWw7CisJCWJyZWFrOworCWNhc2UgQlBGX0xTSDoKKwkJLyogR290dGEgaGF2ZSBzcGVjaWFsIG92ZXJmbG93IGxvZ2ljIGhlcmUsIGlmIHdlJ3JlIHNoaWZ0aW5nCisJCSAqIG1vcmUgdGhhbiBNQVhfUkFOR0UgdGhlbiBqdXN0IGFzc3VtZSB3ZSBoYXZlIGFuIGludmFsaWQKKwkJICogcmFuZ2UuCisJCSAqLworCQlpZiAobWluX3ZhbCA+IGlsb2cyKEJQRl9SRUdJU1RFUl9NQVhfUkFOR0UpKQorCQkJZHN0X3JlZy0+bWluX3ZhbHVlID0gQlBGX1JFR0lTVEVSX01JTl9SQU5HRTsKKwkJZWxzZQorCQkJZHN0X3JlZy0+bWluX3ZhbHVlIDw8PSBtaW5fdmFsOworCisJCWlmIChtYXhfdmFsID4gaWxvZzIoQlBGX1JFR0lTVEVSX01BWF9SQU5HRSkpCisJCQlkc3RfcmVnLT5tYXhfdmFsdWUgPSBCUEZfUkVHSVNURVJfTUFYX1JBTkdFOworCQllbHNlCisJCQlkc3RfcmVnLT5tYXhfdmFsdWUgPDw9IG1heF92YWw7CisJCWJyZWFrOworCWNhc2UgQlBGX1JTSDoKKwkJZHN0X3JlZy0+bWluX3ZhbHVlID4+PSBtaW5fdmFsOworCQlkc3RfcmVnLT5tYXhfdmFsdWUgPj49IG1heF92YWw7CisJCWJyZWFrOworCWNhc2UgQlBGX01PRDoKKwkJLyogJSBpcyBzcGVjaWFsIHNpbmNlIGl0IGlzIGFuIHVuc2lnbmVkIG1vZHVsdXMsIHNvIHRoZSBmbG9vcgorCQkgKiB3aWxsIGFsd2F5cyBiZSAwLgorCQkgKi8KKwkJZHN0X3JlZy0+bWluX3ZhbHVlID0gMDsKKwkJZHN0X3JlZy0+bWF4X3ZhbHVlID0gbWF4X3ZhbCAtIDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJlc2V0X3JlZ19yYW5nZV92YWx1ZXMocmVncywgaW5zbi0+ZHN0X3JlZyk7CisJCWJyZWFrOworCX0KKworCWNoZWNrX3JlZ19vdmVyZmxvdyhkc3RfcmVnKTsKK30KKworLyogY2hlY2sgdmFsaWRpdHkgb2YgMzItYml0IGFuZCA2NC1iaXQgYXJpdGhtZXRpYyBvcGVyYXRpb25zICovCitzdGF0aWMgaW50IGNoZWNrX2FsdV9vcChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24pCit7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZ3MgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzLCAqZHN0X3JlZzsKIAl1OCBvcGNvZGUgPSBCUEZfT1AoaW5zbi0+Y29kZSk7CiAJaW50IGVycjsKIApAQCAtMTQ5NSw2ICsxNjI3LDExIEBACiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwogCisJCS8qIHdlIGFyZSBzZXR0aW5nIG91ciByZWdpc3RlciB0byBzb21ldGhpbmcgbmV3LCB3ZSBuZWVkIHRvCisJCSAqIHJlc2V0IGl0cyByYW5nZSB2YWx1ZXMuCisJCSAqLworCQlyZXNldF9yZWdfcmFuZ2VfdmFsdWVzKHJlZ3MsIGluc24tPmRzdF9yZWcpOworCiAJCWlmIChCUEZfU1JDKGluc24tPmNvZGUpID09IEJQRl9YKSB7CiAJCQlpZiAoQlBGX0NMQVNTKGluc24tPmNvZGUpID09IEJQRl9BTFU2NCkgewogCQkJCS8qIGNhc2U6IFIxID0gUjIKQEAgLTE1MTYsNiArMTY1Myw4IEBACiAJCQkgKi8KIAkJCXJlZ3NbaW5zbi0+ZHN0X3JlZ10udHlwZSA9IENPTlNUX0lNTTsKIAkJCXJlZ3NbaW5zbi0+ZHN0X3JlZ10uaW1tID0gaW5zbi0+aW1tOworCQkJcmVnc1tpbnNuLT5kc3RfcmVnXS5tYXhfdmFsdWUgPSBpbnNuLT5pbW07CisJCQlyZWdzW2luc24tPmRzdF9yZWddLm1pbl92YWx1ZSA9IGluc24tPmltbTsKIAkJfQogCiAJfSBlbHNlIGlmIChvcGNvZGUgPiBCUEZfRU5EKSB7CkBAIC0xNTY4LDYgKzE3MDcsOSBAQAogCiAJCWRzdF9yZWcgPSAmcmVnc1tpbnNuLT5kc3RfcmVnXTsKIAorCQkvKiBmaXJzdCB3ZSB3YW50IHRvIGFkanVzdCBvdXIgcmFuZ2VzLiAqLworCQlhZGp1c3RfcmVnX21pbl9tYXhfdmFscyhlbnYsIGluc24pOworCiAJCS8qIHBhdHRlcm4gbWF0Y2ggJ2JwZl9hZGQgUngsIGltbScgaW5zdHJ1Y3Rpb24gKi8KIAkJaWYgKG9wY29kZSA9PSBCUEZfQUREICYmIEJQRl9DTEFTUyhpbnNuLT5jb2RlKSA9PSBCUEZfQUxVNjQgJiYKIAkJICAgIGRzdF9yZWctPnR5cGUgPT0gRlJBTUVfUFRSICYmIEJQRl9TUkMoaW5zbi0+Y29kZSkgPT0gQlBGX0spIHsKQEAgLTE2MDIsMjggKzE3NDQsNTggQEAKIAkJCXJldHVybiAtRUFDQ0VTOwogCQl9CiAKLQkJLyogbWFyayBkZXN0IG9wZXJhbmQgKi8KLQkJbWFya19yZWdfdW5rbm93bl92YWx1ZShyZWdzLCBpbnNuLT5kc3RfcmVnKTsKKwkJLyogSWYgd2UgZGlkIHBvaW50ZXIgbWF0aCBvbiBhIG1hcCB2YWx1ZSB0aGVuIGp1c3Qgc2V0IGl0IHRvIG91cgorCQkgKiBQVFJfVE9fTUFQX1ZBTFVFX0FESiB0eXBlIHNvIHdlIGNhbiBkZWFsIHdpdGggYW55IHN0b3JlcyBvcgorCQkgKiBsb2FkcyB0byB0aGlzIHJlZ2lzdGVyIGFwcHJvcHJpYXRlbHksIG90aGVyd2lzZSBqdXN0IG1hcmsgdGhlCisJCSAqIHJlZ2lzdGVyIGFzIHVua25vd24uCisJCSAqLworCQlpZiAoZW52LT5hbGxvd19wdHJfbGVha3MgJiYKKwkJICAgIChkc3RfcmVnLT50eXBlID09IFBUUl9UT19NQVBfVkFMVUUgfHwKKwkJICAgICBkc3RfcmVnLT50eXBlID09IFBUUl9UT19NQVBfVkFMVUVfQURKKSkKKwkJCWRzdF9yZWctPnR5cGUgPSBQVFJfVE9fTUFQX1ZBTFVFX0FESjsKKwkJZWxzZQorCQkJbWFya19yZWdfdW5rbm93bl92YWx1ZShyZWdzLCBpbnNuLT5kc3RfcmVnKTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZmluZF9nb29kX3BrdF9wb2ludGVycyhzdHJ1Y3QgdmVyaWZpZXJfZW52ICplbnYsCi0JCQkJICAgc3RydWN0IHJlZ19zdGF0ZSAqZHN0X3JlZykKK3N0YXRpYyB2b2lkIGZpbmRfZ29vZF9wa3RfcG9pbnRlcnMoc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZSAqc3RhdGUsCisJCQkJICAgc3RydWN0IGJwZl9yZWdfc3RhdGUgKmRzdF9yZWcpCiB7Ci0Jc3RydWN0IHZlcmlmaWVyX3N0YXRlICpzdGF0ZSA9ICZlbnYtPmN1cl9zdGF0ZTsKLQlzdHJ1Y3QgcmVnX3N0YXRlICpyZWdzID0gc3RhdGUtPnJlZ3MsICpyZWc7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZ3MgPSBzdGF0ZS0+cmVncywgKnJlZzsKIAlpbnQgaTsKLQkvKiByMiA9IHIzOwotCSAqIHIyICs9IDgKLQkgKiBpZiAocjIgPiBwa3RfZW5kKSBnb3RvIHNvbWV3aGVyZQotCSAqIHIyID09IGRzdF9yZWcsIHBrdF9lbmQgPT0gc3JjX3JlZywKLQkgKiByMj1wa3QoaWQ9bixvZmY9OCxyPTApCi0JICogcjM9cGt0KGlkPW4sb2ZmPTAscj0wKQotCSAqIGZpbmQgcmVnaXN0ZXIgcjMgYW5kIG1hcmsgaXRzIHJhbmdlIGFzIHIzPXBrdChpZD1uLG9mZj0wLHI9OCkKLQkgKiBzbyB0aGF0IHJhbmdlIG9mIGJ5dGVzIFtyMywgcjMgKyA4KSBpcyBzYWZlIHRvIGFjY2VzcworCisJLyogTExWTSBjYW4gZ2VuZXJhdGUgdHdvIGtpbmQgb2YgY2hlY2tzOgorCSAqCisJICogVHlwZSAxOgorCSAqCisJICogICByMiA9IHIzOworCSAqICAgcjIgKz0gODsKKwkgKiAgIGlmIChyMiA+IHBrdF9lbmQpIGdvdG8gPGhhbmRsZSBleGNlcHRpb24+CisJICogICA8YWNjZXNzIG9rYXk+CisJICoKKwkgKiAgIFdoZXJlOgorCSAqICAgICByMiA9PSBkc3RfcmVnLCBwa3RfZW5kID09IHNyY19yZWcKKwkgKiAgICAgcjI9cGt0KGlkPW4sb2ZmPTgscj0wKQorCSAqICAgICByMz1wa3QoaWQ9bixvZmY9MCxyPTApCisJICoKKwkgKiBUeXBlIDI6CisJICoKKwkgKiAgIHIyID0gcjM7CisJICogICByMiArPSA4OworCSAqICAgaWYgKHBrdF9lbmQgPj0gcjIpIGdvdG8gPGFjY2VzcyBva2F5PgorCSAqICAgPGhhbmRsZSBleGNlcHRpb24+CisJICoKKwkgKiAgIFdoZXJlOgorCSAqICAgICBwa3RfZW5kID09IGRzdF9yZWcsIHIyID09IHNyY19yZWcKKwkgKiAgICAgcjI9cGt0KGlkPW4sb2ZmPTgscj0wKQorCSAqICAgICByMz1wa3QoaWQ9bixvZmY9MCxyPTApCisJICoKKwkgKiBGaW5kIHJlZ2lzdGVyIHIzIGFuZCBtYXJrIGl0cyByYW5nZSBhcyByMz1wa3QoaWQ9bixvZmY9MCxyPTgpCisJICogc28gdGhhdCByYW5nZSBvZiBieXRlcyBbcjMsIHIzICsgOCkgaXMgc2FmZSB0byBhY2Nlc3MuCiAJICovCisKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0JQRl9SRUc7IGkrKykKIAkJaWYgKHJlZ3NbaV0udHlwZSA9PSBQVFJfVE9fUEFDS0VUICYmIHJlZ3NbaV0uaWQgPT0gZHN0X3JlZy0+aWQpCiAJCQlyZWdzW2ldLnJhbmdlID0gZHN0X3JlZy0+b2ZmOwpAQCAtMTYzNywxMSArMTgwOSwxMDkgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tfY29uZF9qbXBfb3Aoc3RydWN0IHZlcmlmaWVyX2VudiAqZW52LAorLyogQWRqdXN0cyB0aGUgcmVnaXN0ZXIgbWluL21heCB2YWx1ZXMgaW4gdGhlIGNhc2UgdGhhdCB0aGUgZHN0X3JlZyBpcyB0aGUKKyAqIHZhcmlhYmxlIHJlZ2lzdGVyIHRoYXQgd2UgYXJlIHdvcmtpbmcgb24sIGFuZCBzcmNfcmVnIGlzIGEgY29uc3RhbnQgb3Igd2UncmUKKyAqIHNpbXBseSBkb2luZyBhIEJQRl9LIGNoZWNrLgorICovCitzdGF0aWMgdm9pZCByZWdfc2V0X21pbl9tYXgoc3RydWN0IGJwZl9yZWdfc3RhdGUgKnRydWVfcmVnLAorCQkJICAgIHN0cnVjdCBicGZfcmVnX3N0YXRlICpmYWxzZV9yZWcsIHU2NCB2YWwsCisJCQkgICAgdTggb3Bjb2RlKQoreworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSBCUEZfSkVROgorCQkvKiBJZiB0aGlzIGlzIGZhbHNlIHRoZW4gd2Uga25vdyBub3RoaW5nIEpvbiBTbm93LCBidXQgaWYgaXQgaXMKKwkJICogdHJ1ZSB0aGVuIHdlIGtub3cgZm9yIHN1cmUuCisJCSAqLworCQl0cnVlX3JlZy0+bWF4X3ZhbHVlID0gdHJ1ZV9yZWctPm1pbl92YWx1ZSA9IHZhbDsKKwkJYnJlYWs7CisJY2FzZSBCUEZfSk5FOgorCQkvKiBJZiB0aGlzIGlzIHRydWUgd2Uga25vdyBub3RoaW5nIEpvbiBTbm93LCBidXQgaWYgaXQgaXMgZmFsc2UKKwkJICogd2Uga25vdyB0aGUgdmFsdWUgZm9yIHN1cmU7CisJCSAqLworCQlmYWxzZV9yZWctPm1heF92YWx1ZSA9IGZhbHNlX3JlZy0+bWluX3ZhbHVlID0gdmFsOworCQlicmVhazsKKwljYXNlIEJQRl9KR1Q6CisJCS8qIFVuc2lnbmVkIGNvbXBhcmlzb24sIHRoZSBtaW5pbXVtIHZhbHVlIGlzIDAuICovCisJCWZhbHNlX3JlZy0+bWluX3ZhbHVlID0gMDsKKwljYXNlIEJQRl9KU0dUOgorCQkvKiBJZiB0aGlzIGlzIGZhbHNlIHRoZW4gd2Uga25vdyB0aGUgbWF4aW11bSB2YWwgaXMgdmFsLAorCQkgKiBvdGhlcndpc2Ugd2Uga25vdyB0aGUgbWluIHZhbCBpcyB2YWwrMS4KKwkJICovCisJCWZhbHNlX3JlZy0+bWF4X3ZhbHVlID0gdmFsOworCQl0cnVlX3JlZy0+bWluX3ZhbHVlID0gdmFsICsgMTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfSkdFOgorCQkvKiBVbnNpZ25lZCBjb21wYXJpc29uLCB0aGUgbWluaW11bSB2YWx1ZSBpcyAwLiAqLworCQlmYWxzZV9yZWctPm1pbl92YWx1ZSA9IDA7CisJY2FzZSBCUEZfSlNHRToKKwkJLyogSWYgdGhpcyBpcyBmYWxzZSB0aGVuIHdlIGtub3cgdGhlIG1heGltdW0gdmFsdWUgaXMgdmFsIC0gMSwKKwkJICogb3RoZXJ3aXNlIHdlIGtub3cgdGhlIG1pbWltdW0gdmFsdWUgaXMgdmFsLgorCQkgKi8KKwkJZmFsc2VfcmVnLT5tYXhfdmFsdWUgPSB2YWwgLSAxOworCQl0cnVlX3JlZy0+bWluX3ZhbHVlID0gdmFsOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwljaGVja19yZWdfb3ZlcmZsb3coZmFsc2VfcmVnKTsKKwljaGVja19yZWdfb3ZlcmZsb3codHJ1ZV9yZWcpOworfQorCisvKiBTYW1lIGFzIGFib3ZlLCBidXQgZm9yIHRoZSBjYXNlIHRoYXQgZHN0X3JlZyBpcyBhIENPTlNUX0lNTSByZWcgYW5kIHNyY19yZWcKKyAqIGlzIHRoZSB2YXJpYWJsZSByZWcuCisgKi8KK3N0YXRpYyB2b2lkIHJlZ19zZXRfbWluX21heF9pbnYoc3RydWN0IGJwZl9yZWdfc3RhdGUgKnRydWVfcmVnLAorCQkJCXN0cnVjdCBicGZfcmVnX3N0YXRlICpmYWxzZV9yZWcsIHU2NCB2YWwsCisJCQkJdTggb3Bjb2RlKQoreworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSBCUEZfSkVROgorCQkvKiBJZiB0aGlzIGlzIGZhbHNlIHRoZW4gd2Uga25vdyBub3RoaW5nIEpvbiBTbm93LCBidXQgaWYgaXQgaXMKKwkJICogdHJ1ZSB0aGVuIHdlIGtub3cgZm9yIHN1cmUuCisJCSAqLworCQl0cnVlX3JlZy0+bWF4X3ZhbHVlID0gdHJ1ZV9yZWctPm1pbl92YWx1ZSA9IHZhbDsKKwkJYnJlYWs7CisJY2FzZSBCUEZfSk5FOgorCQkvKiBJZiB0aGlzIGlzIHRydWUgd2Uga25vdyBub3RoaW5nIEpvbiBTbm93LCBidXQgaWYgaXQgaXMgZmFsc2UKKwkJICogd2Uga25vdyB0aGUgdmFsdWUgZm9yIHN1cmU7CisJCSAqLworCQlmYWxzZV9yZWctPm1heF92YWx1ZSA9IGZhbHNlX3JlZy0+bWluX3ZhbHVlID0gdmFsOworCQlicmVhazsKKwljYXNlIEJQRl9KR1Q6CisJCS8qIFVuc2lnbmVkIGNvbXBhcmlzb24sIHRoZSBtaW5pbXVtIHZhbHVlIGlzIDAuICovCisJCXRydWVfcmVnLT5taW5fdmFsdWUgPSAwOworCWNhc2UgQlBGX0pTR1Q6CisJCS8qCisJCSAqIElmIHRoaXMgaXMgZmFsc2UsIHRoZW4gdGhlIHZhbCBpcyA8PSB0aGUgcmVnaXN0ZXIsIGlmIGl0IGlzCisJCSAqIHRydWUgdGhlIHJlZ2lzdGVyIDw9IHRvIHRoZSB2YWwuCisJCSAqLworCQlmYWxzZV9yZWctPm1pbl92YWx1ZSA9IHZhbDsKKwkJdHJ1ZV9yZWctPm1heF92YWx1ZSA9IHZhbCAtIDE7CisJCWJyZWFrOworCWNhc2UgQlBGX0pHRToKKwkJLyogVW5zaWduZWQgY29tcGFyaXNvbiwgdGhlIG1pbmltdW0gdmFsdWUgaXMgMC4gKi8KKwkJdHJ1ZV9yZWctPm1pbl92YWx1ZSA9IDA7CisJY2FzZSBCUEZfSlNHRToKKwkJLyogSWYgdGhpcyBpcyBmYWxzZSB0aGVuIGNvbnN0YW50IDwgcmVnaXN0ZXIsIGlmIGl0IGlzIHRydWUgdGhlbgorCQkgKiB0aGUgcmVnaXN0ZXIgPCBjb25zdGFudC4KKwkJICovCisJCWZhbHNlX3JlZy0+bWluX3ZhbHVlID0gdmFsICsgMTsKKwkJdHJ1ZV9yZWctPm1heF92YWx1ZSA9IHZhbDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJY2hlY2tfcmVnX292ZXJmbG93KGZhbHNlX3JlZyk7CisJY2hlY2tfcmVnX292ZXJmbG93KHRydWVfcmVnKTsKK30KKworc3RhdGljIGludCBjaGVja19jb25kX2ptcF9vcChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LAogCQkJICAgICBzdHJ1Y3QgYnBmX2luc24gKmluc24sIGludCAqaW5zbl9pZHgpCiB7Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqcmVncyA9IGVudi0+Y3VyX3N0YXRlLnJlZ3MsICpkc3RfcmVnOwotCXN0cnVjdCB2ZXJpZmllcl9zdGF0ZSAqb3RoZXJfYnJhbmNoOworCXN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgKm90aGVyX2JyYW5jaCwgKnRoaXNfYnJhbmNoID0gJmVudi0+Y3VyX3N0YXRlOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWdzID0gdGhpc19icmFuY2gtPnJlZ3MsICpkc3RfcmVnOwogCXU4IG9wY29kZSA9IEJQRl9PUChpbnNuLT5jb2RlKTsKIAlpbnQgZXJyOwogCkBAIC0xNzAzLDcgKzE5NzMsMjQgQEAKIAlpZiAoIW90aGVyX2JyYW5jaCkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQkvKiBkZXRlY3QgaWYgUiA9PSAwIHdoZXJlIFIgaXMgcmV0dXJuZWQgdmFsdWUgZnJvbSBicGZfbWFwX2xvb2t1cF9lbGVtKCkgKi8KKwkvKiBkZXRlY3QgaWYgd2UgYXJlIGNvbXBhcmluZyBhZ2FpbnN0IGEgY29uc3RhbnQgdmFsdWUgc28gd2UgY2FuIGFkanVzdAorCSAqIG91ciBtaW4vbWF4IHZhbHVlcyBmb3Igb3VyIGRzdCByZWdpc3Rlci4KKwkgKi8KKwlpZiAoQlBGX1NSQyhpbnNuLT5jb2RlKSA9PSBCUEZfWCkgeworCQlpZiAocmVnc1tpbnNuLT5zcmNfcmVnXS50eXBlID09IENPTlNUX0lNTSkKKwkJCXJlZ19zZXRfbWluX21heCgmb3RoZXJfYnJhbmNoLT5yZWdzW2luc24tPmRzdF9yZWddLAorCQkJCQlkc3RfcmVnLCByZWdzW2luc24tPnNyY19yZWddLmltbSwKKwkJCQkJb3Bjb2RlKTsKKwkJZWxzZSBpZiAoZHN0X3JlZy0+dHlwZSA9PSBDT05TVF9JTU0pCisJCQlyZWdfc2V0X21pbl9tYXhfaW52KCZvdGhlcl9icmFuY2gtPnJlZ3NbaW5zbi0+c3JjX3JlZ10sCisJCQkJCSAgICAmcmVnc1tpbnNuLT5zcmNfcmVnXSwgZHN0X3JlZy0+aW1tLAorCQkJCQkgICAgb3Bjb2RlKTsKKwl9IGVsc2UgeworCQlyZWdfc2V0X21pbl9tYXgoJm90aGVyX2JyYW5jaC0+cmVnc1tpbnNuLT5kc3RfcmVnXSwKKwkJCQkJZHN0X3JlZywgaW5zbi0+aW1tLCBvcGNvZGUpOworCX0KKworCS8qIGRldGVjdCBpZiBSID09IDAgd2hlcmUgUiBpcyByZXR1cm5lZCBmcm9tIGJwZl9tYXBfbG9va3VwX2VsZW0oKSAqLwogCWlmIChCUEZfU1JDKGluc24tPmNvZGUpID09IEJQRl9LICYmCiAJICAgIGluc24tPmltbSA9PSAwICYmIChvcGNvZGUgPT0gQlBGX0pFUSB8fCBvcGNvZGUgPT0gQlBGX0pORSkgJiYKIAkgICAgZHN0X3JlZy0+dHlwZSA9PSBQVFJfVE9fTUFQX1ZBTFVFX09SX05VTEwpIHsKQEAgLTE3MjIsMTMgKzIwMDksMTcgQEAKIAl9IGVsc2UgaWYgKEJQRl9TUkMoaW5zbi0+Y29kZSkgPT0gQlBGX1ggJiYgb3Bjb2RlID09IEJQRl9KR1QgJiYKIAkJICAgZHN0X3JlZy0+dHlwZSA9PSBQVFJfVE9fUEFDS0VUICYmCiAJCSAgIHJlZ3NbaW5zbi0+c3JjX3JlZ10udHlwZSA9PSBQVFJfVE9fUEFDS0VUX0VORCkgewotCQlmaW5kX2dvb2RfcGt0X3BvaW50ZXJzKGVudiwgZHN0X3JlZyk7CisJCWZpbmRfZ29vZF9wa3RfcG9pbnRlcnModGhpc19icmFuY2gsIGRzdF9yZWcpOworCX0gZWxzZSBpZiAoQlBGX1NSQyhpbnNuLT5jb2RlKSA9PSBCUEZfWCAmJiBvcGNvZGUgPT0gQlBGX0pHRSAmJgorCQkgICBkc3RfcmVnLT50eXBlID09IFBUUl9UT19QQUNLRVRfRU5EICYmCisJCSAgIHJlZ3NbaW5zbi0+c3JjX3JlZ10udHlwZSA9PSBQVFJfVE9fUEFDS0VUKSB7CisJCWZpbmRfZ29vZF9wa3RfcG9pbnRlcnMob3RoZXJfYnJhbmNoLCAmcmVnc1tpbnNuLT5zcmNfcmVnXSk7CiAJfSBlbHNlIGlmIChpc19wb2ludGVyX3ZhbHVlKGVudiwgaW5zbi0+ZHN0X3JlZykpIHsKIAkJdmVyYm9zZSgiUiVkIHBvaW50ZXIgY29tcGFyaXNvbiBwcm9oaWJpdGVkXG4iLCBpbnNuLT5kc3RfcmVnKTsKIAkJcmV0dXJuIC1FQUNDRVM7CiAJfQogCWlmIChsb2dfbGV2ZWwpCi0JCXByaW50X3ZlcmlmaWVyX3N0YXRlKCZlbnYtPmN1cl9zdGF0ZSk7CisJCXByaW50X3ZlcmlmaWVyX3N0YXRlKHRoaXNfYnJhbmNoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTc0MSw5ICsyMDMyLDkgQEAKIH0KIAogLyogdmVyaWZ5IEJQRl9MRF9JTU02NCBpbnN0cnVjdGlvbiAqLwotc3RhdGljIGludCBjaGVja19sZF9pbW0oc3RydWN0IHZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24pCitzdGF0aWMgaW50IGNoZWNrX2xkX2ltbShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24pCiB7Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqcmVncyA9IGVudi0+Y3VyX3N0YXRlLnJlZ3M7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZ3MgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzOwogCWludCBlcnI7CiAKIAlpZiAoQlBGX1NJWkUoaW5zbi0+Y29kZSkgIT0gQlBGX0RXKSB7CkBAIC0xNzU5LDkgKzIwNTAsMTkgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JaWYgKGluc24tPnNyY19yZWcgPT0gMCkKLQkJLyogZ2VuZXJpYyBtb3ZlIDY0LWJpdCBpbW1lZGlhdGUgaW50byBhIHJlZ2lzdGVyICovCisJaWYgKGluc24tPnNyY19yZWcgPT0gMCkgeworCQkvKiBnZW5lcmljIG1vdmUgNjQtYml0IGltbWVkaWF0ZSBpbnRvIGEgcmVnaXN0ZXIsCisJCSAqIG9ubHkgYW5hbHl6ZXIgbmVlZHMgdG8gY29sbGVjdCB0aGUgbGRfaW1tIHZhbHVlLgorCQkgKi8KKwkJdTY0IGltbSA9ICgodTY0KShpbnNuICsgMSktPmltbSA8PCAzMikgfCAodTMyKWluc24tPmltbTsKKworCQlpZiAoIWVudi0+YW5hbHl6ZXJfb3BzKQorCQkJcmV0dXJuIDA7CisKKwkJcmVnc1tpbnNuLT5kc3RfcmVnXS50eXBlID0gQ09OU1RfSU1NOworCQlyZWdzW2luc24tPmRzdF9yZWddLmltbSA9IGltbTsKIAkJcmV0dXJuIDA7CisJfQogCiAJLyogcmVwbGFjZV9tYXBfZmRfd2l0aF9tYXBfcHRyKCkgc2hvdWxkIGhhdmUgY2F1Z2h0IGJhZCBsZF9pbW02NCAqLwogCUJVR19PTihpbnNuLT5zcmNfcmVnICE9IEJQRl9QU0VVRE9fTUFQX0ZEKTsKQEAgLTE3OTgsMTEgKzIwOTksMTEgQEAKICAqIE91dHB1dDoKICAqICAgUjAgLSA4LzE2LzMyLWJpdCBza2IgZGF0YSBjb252ZXJ0ZWQgdG8gY3B1IGVuZGlhbm5lc3MKICAqLwotc3RhdGljIGludCBjaGVja19sZF9hYnMoc3RydWN0IHZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24pCitzdGF0aWMgaW50IGNoZWNrX2xkX2FicyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24pCiB7Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqcmVncyA9IGVudi0+Y3VyX3N0YXRlLnJlZ3M7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZ3MgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzOwogCXU4IG1vZGUgPSBCUEZfTU9ERShpbnNuLT5jb2RlKTsKLQlzdHJ1Y3QgcmVnX3N0YXRlICpyZWc7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZzsKIAlpbnQgaSwgZXJyOwogCiAJaWYgKCFtYXlfYWNjZXNzX3NrYihlbnYtPnByb2ctPnR5cGUpKSB7CkBAIC0xODg4LDcgKzIxODksNyBAQAogCUJSQU5DSCA9IDIsCiB9OwogCi0jZGVmaW5lIFNUQVRFX0xJU1RfTUFSSyAoKHN0cnVjdCB2ZXJpZmllcl9zdGF0ZV9saXN0ICopIC0xTCkKKyNkZWZpbmUgU1RBVEVfTElTVF9NQVJLICgoc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZV9saXN0ICopIC0xTCkKIAogc3RhdGljIGludCAqaW5zbl9zdGFjazsJLyogc3RhY2sgb2YgaW5zbnMgdG8gcHJvY2VzcyAqLwogc3RhdGljIGludCBjdXJfc3RhY2s7CS8qIGN1cnJlbnQgc3RhY2sgaW5kZXggKi8KQEAgLTE4OTksNyArMjIwMCw3IEBACiAgKiB3IC0gbmV4dCBpbnN0cnVjdGlvbgogICogZSAtIGVkZ2UKICAqLwotc3RhdGljIGludCBwdXNoX2luc24oaW50IHQsIGludCB3LCBpbnQgZSwgc3RydWN0IHZlcmlmaWVyX2VudiAqZW52KQorc3RhdGljIGludCBwdXNoX2luc24oaW50IHQsIGludCB3LCBpbnQgZSwgc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudikKIHsKIAlpZiAoZSA9PSBGQUxMVEhST1VHSCAmJiBpbnNuX3N0YXRlW3RdID49IChESVNDT1ZFUkVEIHwgRkFMTFRIUk9VR0gpKQogCQlyZXR1cm4gMDsKQEAgLTE5NDAsNyArMjI0MSw3IEBACiAvKiBub24tcmVjdXJzaXZlIGRlcHRoLWZpcnN0LXNlYXJjaCB0byBkZXRlY3QgbG9vcHMgaW4gQlBGIHByb2dyYW0KICAqIGxvb3AgPT0gYmFjay1lZGdlIGluIGRpcmVjdGVkIGdyYXBoCiAgKi8KLXN0YXRpYyBpbnQgY2hlY2tfY2ZnKHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudikKK3N0YXRpYyBpbnQgY2hlY2tfY2ZnKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpCiB7CiAJc3RydWN0IGJwZl9pbnNuICppbnNucyA9IGVudi0+cHJvZy0+aW5zbnNpOwogCWludCBpbnNuX2NudCA9IGVudi0+cHJvZy0+bGVuOwpAQCAtMjA0OSw3ICsyMzUwLDggQEAKIC8qIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyByZWR1Y2UgdGhlIG51bWJlciBvZiBleHBsb3JlZCBpbnNucwogICogZnJvbSB+MTQwayB0byB+ODBrIGZvciB1bHRyYSBsYXJnZSBwcm9ncmFtcyB0aGF0IHVzZSBhIGxvdCBvZiBwdHJfdG9fcGFja2V0CiAgKi8KLXN0YXRpYyBib29sIGNvbXBhcmVfcHRyc190b19wYWNrZXQoc3RydWN0IHJlZ19zdGF0ZSAqb2xkLCBzdHJ1Y3QgcmVnX3N0YXRlICpjdXIpCitzdGF0aWMgYm9vbCBjb21wYXJlX3B0cnNfdG9fcGFja2V0KHN0cnVjdCBicGZfcmVnX3N0YXRlICpvbGQsCisJCQkJICAgc3RydWN0IGJwZl9yZWdfc3RhdGUgKmN1cikKIHsKIAlpZiAob2xkLT5pZCAhPSBjdXItPmlkKQogCQlyZXR1cm4gZmFsc2U7CkBAIC0yMTI0LDkgKzI0MjYsMTEgQEAKICAqIHdoZXJlYXMgcmVnaXN0ZXIgdHlwZSBpbiBjdXJyZW50IHN0YXRlIGlzIG1lYW5pbmdmdWwsIGl0IG1lYW5zIHRoYXQKICAqIHRoZSBjdXJyZW50IHN0YXRlIHdpbGwgcmVhY2ggJ2JwZl9leGl0JyBpbnN0cnVjdGlvbiBzYWZlbHkKICAqLwotc3RhdGljIGJvb2wgc3RhdGVzX2VxdWFsKHN0cnVjdCB2ZXJpZmllcl9zdGF0ZSAqb2xkLCBzdHJ1Y3QgdmVyaWZpZXJfc3RhdGUgKmN1cikKK3N0YXRpYyBib29sIHN0YXRlc19lcXVhbChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LAorCQkJIHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgKm9sZCwKKwkJCSBzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YXRlICpjdXIpCiB7Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqcm9sZCwgKnJjdXI7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJvbGQsICpyY3VyOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9CUEZfUkVHOyBpKyspIHsKQEAgLTIxMzYsNiArMjQ0MCwxMyBAQAogCQlpZiAobWVtY21wKHJvbGQsIHJjdXIsIHNpemVvZigqcm9sZCkpID09IDApCiAJCQljb250aW51ZTsKIAorCQkvKiBJZiB0aGUgcmFuZ2VzIHdlcmUgbm90IHRoZSBzYW1lLCBidXQgZXZlcnl0aGluZyBlbHNlIHdhcyBhbmQKKwkJICogd2UgZGlkbid0IGRvIGEgdmFyaWFibGUgYWNjZXNzIGludG8gYSBtYXAgdGhlbiB3ZSBhcmUgYS1vay4KKwkJICovCisJCWlmICghZW52LT52YXJsZW5fbWFwX3ZhbHVlX2FjY2VzcyAmJgorCQkgICAgcm9sZC0+dHlwZSA9PSByY3VyLT50eXBlICYmIHJvbGQtPmltbSA9PSByY3VyLT5pbW0pCisJCQljb250aW51ZTsKKwogCQlpZiAocm9sZC0+dHlwZSA9PSBOT1RfSU5JVCB8fAogCQkgICAgKHJvbGQtPnR5cGUgPT0gVU5LTk9XTl9WQUxVRSAmJiByY3VyLT50eXBlICE9IE5PVF9JTklUKSkKIAkJCWNvbnRpbnVlOwpAQCAtMjE2Niw5ICsyNDc3LDkgQEAKIAkJCSAqIHRoZSBzYW1lLCBjaGVjayB0aGF0IHN0b3JlZCBwb2ludGVycyB0eXBlcwogCQkJICogYXJlIHRoZSBzYW1lIGFzIHdlbGwuCiAJCQkgKiBFeDogZXhwbG9yZWQgc2FmZSBwYXRoIGNvdWxkIGhhdmUgc3RvcmVkCi0JCQkgKiAoc3RydWN0IHJlZ19zdGF0ZSkgey50eXBlID0gUFRSX1RPX1NUQUNLLCAuaW1tID0gLTh9CisJCQkgKiAoYnBmX3JlZ19zdGF0ZSkgey50eXBlID0gUFRSX1RPX1NUQUNLLCAuaW1tID0gLTh9CiAJCQkgKiBidXQgY3VycmVudCBwYXRoIGhhcyBzdG9yZWQ6Ci0JCQkgKiAoc3RydWN0IHJlZ19zdGF0ZSkgey50eXBlID0gUFRSX1RPX1NUQUNLLCAuaW1tID0gLTE2fQorCQkJICogKGJwZl9yZWdfc3RhdGUpIHsudHlwZSA9IFBUUl9UT19TVEFDSywgLmltbSA9IC0xNn0KIAkJCSAqIHN1Y2ggdmVyaWZpZXIgc3RhdGVzIGFyZSBub3QgZXF1aXZhbGVudC4KIAkJCSAqIHJldHVybiBmYWxzZSB0byBjb250aW51ZSB2ZXJpZmljYXRpb24gb2YgdGhpcyBwYXRoCiAJCQkgKi8KQEAgLTIxNzksMTAgKzI0OTAsMTAgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIGludCBpc19zdGF0ZV92aXNpdGVkKHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudiwgaW50IGluc25faWR4KQorc3RhdGljIGludCBpc19zdGF0ZV92aXNpdGVkKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIGludCBpbnNuX2lkeCkKIHsKLQlzdHJ1Y3QgdmVyaWZpZXJfc3RhdGVfbGlzdCAqbmV3X3NsOwotCXN0cnVjdCB2ZXJpZmllcl9zdGF0ZV9saXN0ICpzbDsKKwlzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YXRlX2xpc3QgKm5ld19zbDsKKwlzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YXRlX2xpc3QgKnNsOwogCiAJc2wgPSBlbnYtPmV4cGxvcmVkX3N0YXRlc1tpbnNuX2lkeF07CiAJaWYgKCFzbCkKQEAgLTIxOTIsNyArMjUwMyw3IEBACiAJCXJldHVybiAwOwogCiAJd2hpbGUgKHNsICE9IFNUQVRFX0xJU1RfTUFSSykgewotCQlpZiAoc3RhdGVzX2VxdWFsKCZzbC0+c3RhdGUsICZlbnYtPmN1cl9zdGF0ZSkpCisJCWlmIChzdGF0ZXNfZXF1YWwoZW52LCAmc2wtPnN0YXRlLCAmZW52LT5jdXJfc3RhdGUpKQogCQkJLyogcmVhY2hlZCBlcXVpdmFsZW50IHJlZ2lzdGVyL3N0YWNrIHN0YXRlLAogCQkJICogcHJ1bmUgdGhlIHNlYXJjaAogCQkJICovCkBAIC0yMjA2LDcgKzI1MTcsNyBAQAogCSAqIGl0IHdpbGwgYmUgcmVqZWN0ZWQuIFNpbmNlIHRoZXJlIGFyZSBubyBsb29wcywgd2Ugd29uJ3QgYmUKIAkgKiBzZWVpbmcgdGhpcyAnaW5zbl9pZHgnIGluc3RydWN0aW9uIGFnYWluIG9uIHRoZSB3YXkgdG8gYnBmX2V4aXQKIAkgKi8KLQluZXdfc2wgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmVyaWZpZXJfc3RhdGVfbGlzdCksIEdGUF9VU0VSKTsKKwluZXdfc2wgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YXRlX2xpc3QpLCBHRlBfVVNFUik7CiAJaWYgKCFuZXdfc2wpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0yMjE3LDExICsyNTI4LDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZG9fY2hlY2soc3RydWN0IHZlcmlmaWVyX2VudiAqZW52KQorc3RhdGljIGludCBleHRfYW5hbHl6ZXJfaW5zbl9ob29rKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsCisJCQkJICBpbnQgaW5zbl9pZHgsIGludCBwcmV2X2luc25faWR4KQogewotCXN0cnVjdCB2ZXJpZmllcl9zdGF0ZSAqc3RhdGUgPSAmZW52LT5jdXJfc3RhdGU7CisJaWYgKCFlbnYtPmFuYWx5emVyX29wcyB8fCAhZW52LT5hbmFseXplcl9vcHMtPmluc25faG9vaykKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZW52LT5hbmFseXplcl9vcHMtPmluc25faG9vayhlbnYsIGluc25faWR4LCBwcmV2X2luc25faWR4KTsKK30KKworc3RhdGljIGludCBkb19jaGVjayhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KQoreworCXN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgKnN0YXRlID0gJmVudi0+Y3VyX3N0YXRlOwogCXN0cnVjdCBicGZfaW5zbiAqaW5zbnMgPSBlbnYtPnByb2ctPmluc25zaTsKLQlzdHJ1Y3QgcmVnX3N0YXRlICpyZWdzID0gc3RhdGUtPnJlZ3M7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZ3MgPSBzdGF0ZS0+cmVnczsKIAlpbnQgaW5zbl9jbnQgPSBlbnYtPnByb2ctPmxlbjsKIAlpbnQgaW5zbl9pZHgsIHByZXZfaW5zbl9pZHggPSAwOwogCWludCBpbnNuX3Byb2Nlc3NlZCA9IDA7CkBAIC0yMjI5LDYgKzI1NDksNyBAQAogCiAJaW5pdF9yZWdfc3RhdGUocmVncyk7CiAJaW5zbl9pZHggPSAwOworCWVudi0+dmFybGVuX21hcF92YWx1ZV9hY2Nlc3MgPSBmYWxzZTsKIAlmb3IgKDs7KSB7CiAJCXN0cnVjdCBicGZfaW5zbiAqaW5zbjsKIAkJdTggY2xhc3M7CkBAIC0yMjc1LDEzICsyNTk2LDE3IEBACiAJCQlwcmludF9icGZfaW5zbihpbnNuKTsKIAkJfQogCisJCWVyciA9IGV4dF9hbmFseXplcl9pbnNuX2hvb2soZW52LCBpbnNuX2lkeCwgcHJldl9pbnNuX2lkeCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCiAJCWlmIChjbGFzcyA9PSBCUEZfQUxVIHx8IGNsYXNzID09IEJQRl9BTFU2NCkgewogCQkJZXJyID0gY2hlY2tfYWx1X29wKGVudiwgaW5zbik7CiAJCQlpZiAoZXJyKQogCQkJCXJldHVybiBlcnI7CiAKIAkJfSBlbHNlIGlmIChjbGFzcyA9PSBCUEZfTERYKSB7Ci0JCQllbnVtIGJwZl9yZWdfdHlwZSBzcmNfcmVnX3R5cGU7CisJCQllbnVtIGJwZl9yZWdfdHlwZSAqcHJldl9zcmNfdHlwZSwgc3JjX3JlZ190eXBlOwogCiAJCQkvKiBjaGVjayBmb3IgcmVzZXJ2ZWQgZmllbGRzIGlzIGFscmVhZHkgZG9uZSAqLwogCkBAIC0yMzA1LDIxICsyNjMwLDI1IEBACiAJCQlpZiAoZXJyKQogCQkJCXJldHVybiBlcnI7CiAKLQkJCWlmIChCUEZfU0laRShpbnNuLT5jb2RlKSAhPSBCUEZfVykgeworCQkJcmVzZXRfcmVnX3JhbmdlX3ZhbHVlcyhyZWdzLCBpbnNuLT5kc3RfcmVnKTsKKwkJCWlmIChCUEZfU0laRShpbnNuLT5jb2RlKSAhPSBCUEZfVyAmJgorCQkJICAgIEJQRl9TSVpFKGluc24tPmNvZGUpICE9IEJQRl9EVykgewogCQkJCWluc25faWR4Kys7CiAJCQkJY29udGludWU7CiAJCQl9CiAKLQkJCWlmIChpbnNuLT5pbW0gPT0gMCkgeworCQkJcHJldl9zcmNfdHlwZSA9ICZlbnYtPmluc25fYXV4X2RhdGFbaW5zbl9pZHhdLnB0cl90eXBlOworCisJCQlpZiAoKnByZXZfc3JjX3R5cGUgPT0gTk9UX0lOSVQpIHsKIAkJCQkvKiBzYXcgYSB2YWxpZCBpbnNuCiAJCQkJICogZHN0X3JlZyA9ICoodTMyICopKHNyY19yZWcgKyBvZmYpCi0JCQkJICogdXNlIHJlc2VydmVkICdpbW0nIGZpZWxkIHRvIG1hcmsgdGhpcyBpbnNuCisJCQkJICogc2F2ZSB0eXBlIHRvIHZhbGlkYXRlIGludGVyc2VjdGluZyBwYXRocwogCQkJCSAqLwotCQkJCWluc24tPmltbSA9IHNyY19yZWdfdHlwZTsKKwkJCQkqcHJldl9zcmNfdHlwZSA9IHNyY19yZWdfdHlwZTsKIAotCQkJfSBlbHNlIGlmIChzcmNfcmVnX3R5cGUgIT0gaW5zbi0+aW1tICYmCisJCQl9IGVsc2UgaWYgKHNyY19yZWdfdHlwZSAhPSAqcHJldl9zcmNfdHlwZSAmJgogCQkJCSAgIChzcmNfcmVnX3R5cGUgPT0gUFRSX1RPX0NUWCB8fAotCQkJCSAgICBpbnNuLT5pbW0gPT0gUFRSX1RPX0NUWCkpIHsKKwkJCQkgICAgKnByZXZfc3JjX3R5cGUgPT0gUFRSX1RPX0NUWCkpIHsKIAkJCQkvKiBBQnVzZXIgcHJvZ3JhbSBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lIGluc24KIAkJCQkgKiBkc3RfcmVnID0gKih1MzIqKSAoc3JjX3JlZyArIG9mZikKIAkJCQkgKiB3aXRoIGRpZmZlcmVudCBwb2ludGVyIHR5cGVzOgpAQCAtMjMzMiw3ICsyNjYxLDcgQEAKIAkJCX0KIAogCQl9IGVsc2UgaWYgKGNsYXNzID09IEJQRl9TVFgpIHsKLQkJCWVudW0gYnBmX3JlZ190eXBlIGRzdF9yZWdfdHlwZTsKKwkJCWVudW0gYnBmX3JlZ190eXBlICpwcmV2X2RzdF90eXBlLCBkc3RfcmVnX3R5cGU7CiAKIAkJCWlmIChCUEZfTU9ERShpbnNuLT5jb2RlKSA9PSBCUEZfWEFERCkgewogCQkJCWVyciA9IGNoZWNrX3hhZGQoZW52LCBpbnNuKTsKQEAgLTIzNjAsMTEgKzI2ODksMTMgQEAKIAkJCWlmIChlcnIpCiAJCQkJcmV0dXJuIGVycjsKIAotCQkJaWYgKGluc24tPmltbSA9PSAwKSB7Ci0JCQkJaW5zbi0+aW1tID0gZHN0X3JlZ190eXBlOwotCQkJfSBlbHNlIGlmIChkc3RfcmVnX3R5cGUgIT0gaW5zbi0+aW1tICYmCisJCQlwcmV2X2RzdF90eXBlID0gJmVudi0+aW5zbl9hdXhfZGF0YVtpbnNuX2lkeF0ucHRyX3R5cGU7CisKKwkJCWlmICgqcHJldl9kc3RfdHlwZSA9PSBOT1RfSU5JVCkgeworCQkJCSpwcmV2X2RzdF90eXBlID0gZHN0X3JlZ190eXBlOworCQkJfSBlbHNlIGlmIChkc3RfcmVnX3R5cGUgIT0gKnByZXZfZHN0X3R5cGUgJiYKIAkJCQkgICAoZHN0X3JlZ190eXBlID09IFBUUl9UT19DVFggfHwKLQkJCQkgICAgaW5zbi0+aW1tID09IFBUUl9UT19DVFgpKSB7CisJCQkJICAgICpwcmV2X2RzdF90eXBlID09IFBUUl9UT19DVFgpKSB7CiAJCQkJdmVyYm9zZSgic2FtZSBpbnNuIGNhbm5vdCBiZSB1c2VkIHdpdGggZGlmZmVyZW50IHBvaW50ZXJzXG4iKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KQEAgLTI0NzAsNiArMjgwMSw3IEBACiAJCQkJdmVyYm9zZSgiaW52YWxpZCBCUEZfTEQgbW9kZVxuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CisJCQlyZXNldF9yZWdfcmFuZ2VfdmFsdWVzKHJlZ3MsIGluc24tPmRzdF9yZWcpOwogCQl9IGVsc2UgewogCQkJdmVyYm9zZSgidW5rbm93biBpbnNuIGNsYXNzICVkXG4iLCBjbGFzcyk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI0ODIsMTQgKzI4MTQsMjggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBjaGVja19tYXBfcHJvZ19jb21wYXRpYmlsaXR5KHN0cnVjdCBicGZfbWFwICptYXAsCisJCQkJCXN0cnVjdCBicGZfcHJvZyAqcHJvZykKKworeworCWlmIChwcm9nLT50eXBlID09IEJQRl9QUk9HX1RZUEVfUEVSRl9FVkVOVCAmJgorCSAgICAobWFwLT5tYXBfdHlwZSA9PSBCUEZfTUFQX1RZUEVfSEFTSCB8fAorCSAgICAgbWFwLT5tYXBfdHlwZSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0hBU0gpICYmCisJICAgIChtYXAtPm1hcF9mbGFncyAmIEJQRl9GX05PX1BSRUFMTE9DKSkgeworCQl2ZXJib3NlKCJwZXJmX2V2ZW50IHByb2dyYW1zIGNhbiBvbmx5IHVzZSBwcmVhbGxvY2F0ZWQgaGFzaCBtYXBcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKIC8qIGxvb2sgZm9yIHBzZXVkbyBlQlBGIGluc3RydWN0aW9ucyB0aGF0IGFjY2VzcyBtYXAgRkRzIGFuZAogICogcmVwbGFjZSB0aGVtIHdpdGggYWN0dWFsIG1hcCBwb2ludGVycwogICovCi1zdGF0aWMgaW50IHJlcGxhY2VfbWFwX2ZkX3dpdGhfbWFwX3B0cihzdHJ1Y3QgdmVyaWZpZXJfZW52ICplbnYpCitzdGF0aWMgaW50IHJlcGxhY2VfbWFwX2ZkX3dpdGhfbWFwX3B0cihzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KQogewogCXN0cnVjdCBicGZfaW5zbiAqaW5zbiA9IGVudi0+cHJvZy0+aW5zbnNpOwogCWludCBpbnNuX2NudCA9IGVudi0+cHJvZy0+bGVuOwotCWludCBpLCBqOworCWludCBpLCBqLCBlcnI7CiAKIAlmb3IgKGkgPSAwOyBpIDwgaW5zbl9jbnQ7IGkrKywgaW5zbisrKSB7CiAJCWlmIChCUEZfQ0xBU1MoaW5zbi0+Y29kZSkgPT0gQlBGX0xEWCAmJgpAQCAtMjUzMyw2ICsyODc5LDEyIEBACiAJCQkJcmV0dXJuIFBUUl9FUlIobWFwKTsKIAkJCX0KIAorCQkJZXJyID0gY2hlY2tfbWFwX3Byb2dfY29tcGF0aWJpbGl0eShtYXAsIGVudi0+cHJvZyk7CisJCQlpZiAoZXJyKSB7CisJCQkJZmRwdXQoZik7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwogCQkJLyogc3RvcmUgbWFwIHBvaW50ZXIgaW5zaWRlIEJQRl9MRF9JTU02NCBpbnN0cnVjdGlvbiAqLwogCQkJaW5zblswXS5pbW0gPSAodTMyKSAodW5zaWduZWQgbG9uZykgbWFwOwogCQkJaW5zblsxXS5pbW0gPSAoKHU2NCkgKHVuc2lnbmVkIGxvbmcpIG1hcCkgPj4gMzI7CkBAIC0yNTc2LDcgKzI5MjgsNyBAQAogfQogCiAvKiBkcm9wIHJlZmNudCBvZiBtYXBzIHVzZWQgYnkgdGhlIHJlamVjdGVkIHByb2dyYW0gKi8KLXN0YXRpYyB2b2lkIHJlbGVhc2VfbWFwcyhzdHJ1Y3QgdmVyaWZpZXJfZW52ICplbnYpCitzdGF0aWMgdm9pZCByZWxlYXNlX21hcHMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudikKIHsKIAlpbnQgaTsKIApAQCAtMjU4NSw3ICsyOTM3LDcgQEAKIH0KIAogLyogY29udmVydCBwc2V1ZG8gQlBGX0xEX0lNTTY0IGludG8gZ2VuZXJpYyBCUEZfTERfSU1NNjQgKi8KLXN0YXRpYyB2b2lkIGNvbnZlcnRfcHNldWRvX2xkX2ltbTY0KHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudikKK3N0YXRpYyB2b2lkIGNvbnZlcnRfcHNldWRvX2xkX2ltbTY0KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpCiB7CiAJc3RydWN0IGJwZl9pbnNuICppbnNuID0gZW52LT5wcm9nLT5pbnNuc2k7CiAJaW50IGluc25fY250ID0gZW52LT5wcm9nLT5sZW47CkBAIC0yNTk5LDYyICsyOTUxLDc0IEBACiAvKiBjb252ZXJ0IGxvYWQgaW5zdHJ1Y3Rpb25zIHRoYXQgYWNjZXNzIGZpZWxkcyBvZiAnc3RydWN0IF9fc2tfYnVmZicKICAqIGludG8gc2VxdWVuY2Ugb2YgaW5zdHJ1Y3Rpb25zIHRoYXQgYWNjZXNzIGZpZWxkcyBvZiAnc3RydWN0IHNrX2J1ZmYnCiAgKi8KLXN0YXRpYyBpbnQgY29udmVydF9jdHhfYWNjZXNzZXMoc3RydWN0IHZlcmlmaWVyX2VudiAqZW52KQorc3RhdGljIGludCBjb252ZXJ0X2N0eF9hY2Nlc3NlcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KQogewotCXN0cnVjdCBicGZfaW5zbiAqaW5zbiA9IGVudi0+cHJvZy0+aW5zbnNpOwotCWludCBpbnNuX2NudCA9IGVudi0+cHJvZy0+bGVuOwotCXN0cnVjdCBicGZfaW5zbiBpbnNuX2J1ZlsxNl07CisJY29uc3Qgc3RydWN0IGJwZl92ZXJpZmllcl9vcHMgKm9wcyA9IGVudi0+cHJvZy0+YXV4LT5vcHM7CisJY29uc3QgaW50IGluc25fY250ID0gZW52LT5wcm9nLT5sZW47CisJc3RydWN0IGJwZl9pbnNuIGluc25fYnVmWzE2XSwgKmluc247CiAJc3RydWN0IGJwZl9wcm9nICpuZXdfcHJvZzsKIAllbnVtIGJwZl9hY2Nlc3NfdHlwZSB0eXBlOwotCWludCBpOworCWludCBpLCBjbnQsIGRlbHRhID0gMDsKIAotCWlmICghZW52LT5wcm9nLT5hdXgtPm9wcy0+Y29udmVydF9jdHhfYWNjZXNzKQorCWlmIChvcHMtPmdlbl9wcm9sb2d1ZSkgeworCQljbnQgPSBvcHMtPmdlbl9wcm9sb2d1ZShpbnNuX2J1ZiwgZW52LT5zZWVuX2RpcmVjdF93cml0ZSwKKwkJCQkJZW52LT5wcm9nKTsKKwkJaWYgKGNudCA+PSBBUlJBWV9TSVpFKGluc25fYnVmKSkgeworCQkJdmVyYm9zZSgiYnBmIHZlcmlmaWVyIGlzIG1pc2NvbmZpZ3VyZWRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSBpZiAoY250KSB7CisJCQluZXdfcHJvZyA9IGJwZl9wYXRjaF9pbnNuX3NpbmdsZShlbnYtPnByb2csIDAsCisJCQkJCQkJIGluc25fYnVmLCBjbnQpOworCQkJaWYgKCFuZXdfcHJvZykKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCWVudi0+cHJvZyA9IG5ld19wcm9nOworCQkJZGVsdGEgKz0gY250IC0gMTsKKwkJfQorCX0KKworCWlmICghb3BzLT5jb252ZXJ0X2N0eF9hY2Nlc3MpCiAJCXJldHVybiAwOwogCi0JZm9yIChpID0gMDsgaSA8IGluc25fY250OyBpKyssIGluc24rKykgewotCQl1MzIgaW5zbl9kZWx0YSwgY250OworCWluc24gPSBlbnYtPnByb2ctPmluc25zaSArIGRlbHRhOwogCi0JCWlmIChpbnNuLT5jb2RlID09IChCUEZfTERYIHwgQlBGX01FTSB8IEJQRl9XKSkKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbl9jbnQ7IGkrKywgaW5zbisrKSB7CisJCWlmIChpbnNuLT5jb2RlID09IChCUEZfTERYIHwgQlBGX01FTSB8IEJQRl9XKSB8fAorCQkgICAgaW5zbi0+Y29kZSA9PSAoQlBGX0xEWCB8IEJQRl9NRU0gfCBCUEZfRFcpKQogCQkJdHlwZSA9IEJQRl9SRUFEOwotCQllbHNlIGlmIChpbnNuLT5jb2RlID09IChCUEZfU1RYIHwgQlBGX01FTSB8IEJQRl9XKSkKKwkJZWxzZSBpZiAoaW5zbi0+Y29kZSA9PSAoQlBGX1NUWCB8IEJQRl9NRU0gfCBCUEZfVykgfHwKKwkJCSBpbnNuLT5jb2RlID09IChCUEZfU1RYIHwgQlBGX01FTSB8IEJQRl9EVykpCiAJCQl0eXBlID0gQlBGX1dSSVRFOwogCQllbHNlCiAJCQljb250aW51ZTsKIAotCQlpZiAoaW5zbi0+aW1tICE9IFBUUl9UT19DVFgpIHsKLQkJCS8qIGNsZWFyIGludGVybmFsIG1hcmsgKi8KLQkJCWluc24tPmltbSA9IDA7CisJCWlmIChlbnYtPmluc25fYXV4X2RhdGFbaV0ucHRyX3R5cGUgIT0gUFRSX1RPX0NUWCkKIAkJCWNvbnRpbnVlOwotCQl9CiAKLQkJY250ID0gZW52LT5wcm9nLT5hdXgtPm9wcy0+Ci0JCQljb252ZXJ0X2N0eF9hY2Nlc3ModHlwZSwgaW5zbi0+ZHN0X3JlZywgaW5zbi0+c3JjX3JlZywKLQkJCQkJICAgaW5zbi0+b2ZmLCBpbnNuX2J1ZiwgZW52LT5wcm9nKTsKKwkJY250ID0gb3BzLT5jb252ZXJ0X2N0eF9hY2Nlc3ModHlwZSwgaW5zbi0+ZHN0X3JlZywgaW5zbi0+c3JjX3JlZywKKwkJCQkJICAgICAgaW5zbi0+b2ZmLCBpbnNuX2J1ZiwgZW52LT5wcm9nKTsKIAkJaWYgKGNudCA9PSAwIHx8IGNudCA+PSBBUlJBWV9TSVpFKGluc25fYnVmKSkgewogCQkJdmVyYm9zZSgiYnBmIHZlcmlmaWVyIGlzIG1pc2NvbmZpZ3VyZWRcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAotCQluZXdfcHJvZyA9IGJwZl9wYXRjaF9pbnNuX3NpbmdsZShlbnYtPnByb2csIGksIGluc25fYnVmLCBjbnQpOworCQluZXdfcHJvZyA9IGJwZl9wYXRjaF9pbnNuX3NpbmdsZShlbnYtPnByb2csIGkgKyBkZWx0YSwgaW5zbl9idWYsCisJCQkJCQkgY250KTsKIAkJaWYgKCFuZXdfcHJvZykKIAkJCXJldHVybiAtRU5PTUVNOwogCi0JCWluc25fZGVsdGEgPSBjbnQgLSAxOworCQlkZWx0YSArPSBjbnQgLSAxOwogCiAJCS8qIGtlZXAgd2Fsa2luZyBuZXcgcHJvZ3JhbSBhbmQgc2tpcCBpbnNucyB3ZSBqdXN0IGluc2VydGVkICovCiAJCWVudi0+cHJvZyA9IG5ld19wcm9nOwotCQlpbnNuICAgICAgPSBuZXdfcHJvZy0+aW5zbnNpICsgaSArIGluc25fZGVsdGE7Ci0KLQkJaW5zbl9jbnQgKz0gaW5zbl9kZWx0YTsKLQkJaSAgICAgICAgKz0gaW5zbl9kZWx0YTsKKwkJaW5zbiAgICAgID0gbmV3X3Byb2ctPmluc25zaSArIGkgKyBkZWx0YTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZnJlZV9zdGF0ZXMoc3RydWN0IHZlcmlmaWVyX2VudiAqZW52KQorc3RhdGljIHZvaWQgZnJlZV9zdGF0ZXMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudikKIHsKLQlzdHJ1Y3QgdmVyaWZpZXJfc3RhdGVfbGlzdCAqc2wsICpzbG47CisJc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZV9saXN0ICpzbCwgKnNsbjsKIAlpbnQgaTsKIAogCWlmICghZW52LT5leHBsb3JlZF9zdGF0ZXMpCkBAIC0yNjc3LDE5ICszMDQxLDI0IEBACiBpbnQgYnBmX2NoZWNrKHN0cnVjdCBicGZfcHJvZyAqKnByb2csIHVuaW9uIGJwZl9hdHRyICphdHRyKQogewogCWNoYXIgX191c2VyICpsb2dfdWJ1ZiA9IE5VTEw7Ci0Jc3RydWN0IHZlcmlmaWVyX2VudiAqZW52OworCXN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnY7CiAJaW50IHJldCA9IC1FSU5WQUw7CiAKIAlpZiAoKCpwcm9nKS0+bGVuIDw9IDAgfHwgKCpwcm9nKS0+bGVuID4gQlBGX01BWElOU05TKQogCQlyZXR1cm4gLUUyQklHOwogCi0JLyogJ3N0cnVjdCB2ZXJpZmllcl9lbnYnIGNhbiBiZSBnbG9iYWwsIGJ1dCBzaW5jZSBpdCdzIG5vdCBzbWFsbCwKKwkvKiAnc3RydWN0IGJwZl92ZXJpZmllcl9lbnYnIGNhbiBiZSBnbG9iYWwsIGJ1dCBzaW5jZSBpdCdzIG5vdCBzbWFsbCwKIAkgKiBhbGxvY2F0ZS9mcmVlIGl0IGV2ZXJ5IHRpbWUgYnBmX2NoZWNrKCkgaXMgY2FsbGVkCiAJICovCi0JZW52ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZlcmlmaWVyX2VudiksIEdGUF9LRVJORUwpOworCWVudiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlbnYpCiAJCXJldHVybiAtRU5PTUVNOwogCisJZW52LT5pbnNuX2F1eF9kYXRhID0gdnphbGxvYyhzaXplb2Yoc3RydWN0IGJwZl9pbnNuX2F1eF9kYXRhKSAqCisJCQkJICAgICAoKnByb2cpLT5sZW4pOworCXJldCA9IC1FTk9NRU07CisJaWYgKCFlbnYtPmluc25fYXV4X2RhdGEpCisJCWdvdG8gZXJyX2ZyZWVfZW52OwogCWVudi0+cHJvZyA9ICpwcm9nOwogCiAJLyogZ3JhYiB0aGUgbXV0ZXggdG8gcHJvdGVjdCBmZXcgZ2xvYmFscyB1c2VkIGJ5IHZlcmlmaWVyICovCkBAIC0yNzA4LDEyICszMDc3LDEyIEBACiAJCS8qIGxvZ18qIHZhbHVlcyBoYXZlIHRvIGJlIHNhbmUgKi8KIAkJaWYgKGxvZ19zaXplIDwgMTI4IHx8IGxvZ19zaXplID4gVUlOVF9NQVggPj4gOCB8fAogCQkgICAgbG9nX2xldmVsID09IDAgfHwgbG9nX3VidWYgPT0gTlVMTCkKLQkJCWdvdG8gZnJlZV9lbnY7CisJCQlnb3RvIGVycl91bmxvY2s7CiAKIAkJcmV0ID0gLUVOT01FTTsKIAkJbG9nX2J1ZiA9IHZtYWxsb2MobG9nX3NpemUpOwogCQlpZiAoIWxvZ19idWYpCi0JCQlnb3RvIGZyZWVfZW52OworCQkJZ290byBlcnJfdW5sb2NrOwogCX0gZWxzZSB7CiAJCWxvZ19sZXZlbCA9IDA7CiAJfQpAQCAtMjcyMyw3ICszMDkyLDcgQEAKIAkJZ290byBza2lwX2Z1bGxfY2hlY2s7CiAKIAllbnYtPmV4cGxvcmVkX3N0YXRlcyA9IGtjYWxsb2MoZW52LT5wcm9nLT5sZW4sCi0JCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdmVyaWZpZXJfc3RhdGVfbGlzdCAqKSwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGVfbGlzdCAqKSwKIAkJCQkgICAgICAgR0ZQX1VTRVIpOwogCXJldCA9IC1FTk9NRU07CiAJaWYgKCFlbnYtPmV4cGxvcmVkX3N0YXRlcykKQEAgLTI3ODIsMTQgKzMxNTEsNjcgQEAKIGZyZWVfbG9nX2J1ZjoKIAlpZiAobG9nX2xldmVsKQogCQl2ZnJlZShsb2dfYnVmKTsKLWZyZWVfZW52OgogCWlmICghZW52LT5wcm9nLT5hdXgtPnVzZWRfbWFwcykKIAkJLyogaWYgd2UgZGlkbid0IGNvcHkgbWFwIHBvaW50ZXJzIGludG8gYnBmX3Byb2dfaW5mbywgcmVsZWFzZQogCQkgKiB0aGVtIG5vdy4gT3RoZXJ3aXNlIGZyZWVfYnBmX3Byb2dfaW5mbygpIHdpbGwgcmVsZWFzZSB0aGVtLgogCQkgKi8KIAkJcmVsZWFzZV9tYXBzKGVudik7CiAJKnByb2cgPSBlbnYtPnByb2c7Ci0Ja2ZyZWUoZW52KTsKK2Vycl91bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZicGZfdmVyaWZpZXJfbG9jayk7CisJdmZyZWUoZW52LT5pbnNuX2F1eF9kYXRhKTsKK2Vycl9mcmVlX2VudjoKKwlrZnJlZShlbnYpOwogCXJldHVybiByZXQ7CiB9CisKK2ludCBicGZfYW5hbHl6ZXIoc3RydWN0IGJwZl9wcm9nICpwcm9nLCBjb25zdCBzdHJ1Y3QgYnBmX2V4dF9hbmFseXplcl9vcHMgKm9wcywKKwkJIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudjsKKwlpbnQgcmV0OworCisJZW52ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVudikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllbnYtPmluc25fYXV4X2RhdGEgPSB2emFsbG9jKHNpemVvZihzdHJ1Y3QgYnBmX2luc25fYXV4X2RhdGEpICoKKwkJCQkgICAgIHByb2ctPmxlbik7CisJcmV0ID0gLUVOT01FTTsKKwlpZiAoIWVudi0+aW5zbl9hdXhfZGF0YSkKKwkJZ290byBlcnJfZnJlZV9lbnY7CisJZW52LT5wcm9nID0gcHJvZzsKKwllbnYtPmFuYWx5emVyX29wcyA9IG9wczsKKwllbnYtPmFuYWx5emVyX3ByaXYgPSBwcml2OworCisJLyogZ3JhYiB0aGUgbXV0ZXggdG8gcHJvdGVjdCBmZXcgZ2xvYmFscyB1c2VkIGJ5IHZlcmlmaWVyICovCisJbXV0ZXhfbG9jaygmYnBmX3ZlcmlmaWVyX2xvY2spOworCisJbG9nX2xldmVsID0gMDsKKworCWVudi0+ZXhwbG9yZWRfc3RhdGVzID0ga2NhbGxvYyhlbnYtPnByb2ctPmxlbiwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGVfbGlzdCAqKSwKKwkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJcmV0ID0gLUVOT01FTTsKKwlpZiAoIWVudi0+ZXhwbG9yZWRfc3RhdGVzKQorCQlnb3RvIHNraXBfZnVsbF9jaGVjazsKKworCXJldCA9IGNoZWNrX2NmZyhlbnYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIHNraXBfZnVsbF9jaGVjazsKKworCWVudi0+YWxsb3dfcHRyX2xlYWtzID0gY2FwYWJsZShDQVBfU1lTX0FETUlOKTsKKworCXJldCA9IGRvX2NoZWNrKGVudik7CisKK3NraXBfZnVsbF9jaGVjazoKKwl3aGlsZSAocG9wX3N0YWNrKGVudiwgTlVMTCkgPj0gMCk7CisJZnJlZV9zdGF0ZXMoZW52KTsKKworCW11dGV4X3VubG9jaygmYnBmX3ZlcmlmaWVyX2xvY2spOworCXZmcmVlKGVudi0+aW5zbl9hdXhfZGF0YSk7CitlcnJfZnJlZV9lbnY6CisJa2ZyZWUoZW52KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoYnBmX2FuYWx5emVyKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9jZ3JvdXAuYyBiL2tlcm5lbC9jZ3JvdXAuYwppbmRleCBkMWM1MWI3Li40NDA2NjE1IDEwMDY0NAotLS0gYS9rZXJuZWwvY2dyb3VwLmMKKysrIGIva2VybmVsL2Nncm91cC5jCkBAIC0zNDQ2LDkgKzM0NDYsMjggQEAKIAkgKiBFeGNlcHQgZm9yIHRoZSByb290LCBzdWJ0cmVlX2NvbnRyb2wgbXVzdCBiZSB6ZXJvIGZvciBhIGNncm91cAogCSAqIHdpdGggdGFza3Mgc28gdGhhdCBjaGlsZCBjZ3JvdXBzIGRvbid0IGNvbXBldGUgYWdhaW5zdCB0YXNrcy4KIAkgKi8KLQlpZiAoZW5hYmxlICYmIGNncm91cF9wYXJlbnQoY2dycCkgJiYgIWxpc3RfZW1wdHkoJmNncnAtPmNzZXRfbGlua3MpKSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBvdXRfdW5sb2NrOworCWlmIChlbmFibGUgJiYgY2dyb3VwX3BhcmVudChjZ3JwKSkgeworCQlzdHJ1Y3QgY2dycF9jc2V0X2xpbmsgKmxpbms7CisKKwkJLyoKKwkJICogQmVjYXVzZSBuYW1lc3BhY2VzIHBpbiBjc2V0cyB0b28sIEBjZ3JwLT5jc2V0X2xpbmtzCisJCSAqIG1pZ2h0IG5vdCBiZSBlbXB0eSBldmVuIHdoZW4gQGNncnAgaXMgZW1wdHkuICBXYWxrIGFuZAorCQkgKiB2ZXJpZnkgZWFjaCBjc2V0LgorCQkgKi8KKwkJc3Bpbl9sb2NrX2lycSgmY3NzX3NldF9sb2NrKTsKKworCQlyZXQgPSAwOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpbmssICZjZ3JwLT5jc2V0X2xpbmtzLCBjc2V0X2xpbmspIHsKKwkJCWlmIChjc3Nfc2V0X3BvcHVsYXRlZChsaW5rLT5jc2V0KSkgeworCQkJCXJldCA9IC1FQlVTWTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXNwaW5fdW5sb2NrX2lycSgmY3NzX3NldF9sb2NrKTsKKworCQlpZiAocmV0KQorCQkJZ290byBvdXRfdW5sb2NrOwogCX0KIAogCS8qIHNhdmUgYW5kIHVwZGF0ZSBjb250cm9sIG1hc2tzIGFuZCBwcmVwYXJlIGNzc2VzICovCkBAIC0zODk5LDcgKzM5MTgsOSBAQAogICogY2dyb3VwX3Rhc2tfY291bnQgLSBjb3VudCB0aGUgbnVtYmVyIG9mIHRhc2tzIGluIGEgY2dyb3VwLgogICogQGNncnA6IHRoZSBjZ3JvdXAgaW4gcXVlc3Rpb24KICAqCi0gKiBSZXR1cm4gdGhlIG51bWJlciBvZiB0YXNrcyBpbiB0aGUgY2dyb3VwLgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgdGFza3MgaW4gdGhlIGNncm91cC4gIFRoZSByZXR1cm5lZCBudW1iZXIgY2FuIGJlCisgKiBoaWdoZXIgdGhhbiB0aGUgYWN0dWFsIG51bWJlciBvZiB0YXNrcyBkdWUgdG8gY3NzX3NldCByZWZlcmVuY2VzIGZyb20KKyAqIG5hbWVzcGFjZSByb290cyBhbmQgdGVtcG9yYXJ5IHVzYWdlcy4KICAqLwogc3RhdGljIGludCBjZ3JvdXBfdGFza19jb3VudChjb25zdCBzdHJ1Y3QgY2dyb3VwICpjZ3JwKQogewpAQCAtNTYwNiw2ICs1NjI3LDEyIEBACiAJQlVHX09OKGNncm91cF9pbml0X2NmdHlwZXMoTlVMTCwgY2dyb3VwX2RmbF9iYXNlX2ZpbGVzKSk7CiAJQlVHX09OKGNncm91cF9pbml0X2NmdHlwZXMoTlVMTCwgY2dyb3VwX2xlZ2FjeV9iYXNlX2ZpbGVzKSk7CiAKKwkvKgorCSAqIFRoZSBsYXRlbmN5IG9mIHRoZSBzeW5jaHJvbml6ZV9zY2hlZCgpIGlzIHRvbyBoaWdoIGZvciBjZ3JvdXBzLAorCSAqIGF2b2lkIGl0IGF0IHRoZSBjb3N0IG9mIGZvcmNpbmcgYWxsIHJlYWRlcnMgaW50byB0aGUgc2xvdyBwYXRoLgorCSAqLworCXJjdV9zeW5jX2VudGVyX3N0YXJ0KCZjZ3JvdXBfdGhyZWFkZ3JvdXBfcndzZW0ucnNzKTsKKwogCWdldF91c2VyX25zKGluaXRfY2dyb3VwX25zLnVzZXJfbnMpOwogCiAJbXV0ZXhfbG9jaygmY2dyb3VwX211dGV4KTsKQEAgLTYyNzAsNiArNjI5NywxMiBAQAogCWlmIChjZ3JvdXBfc2tfYWxsb2NfZGlzYWJsZWQpCiAJCXJldHVybjsKIAorCS8qIFNvY2tldCBjbG9uZSBwYXRoICovCisJaWYgKHNrY2QtPnZhbCkgeworCQljZ3JvdXBfZ2V0KHNvY2tfY2dyb3VwX3B0cihza2NkKSk7CisJCXJldHVybjsKKwl9CisKIAlyY3VfcmVhZF9sb2NrKCk7CiAKIAl3aGlsZSAodHJ1ZSkgewpAQCAtNjI5NSw2ICs2MzI4LDE2IEBACiAKIC8qIGNncm91cCBuYW1lc3BhY2VzICovCiAKK3N0YXRpYyBzdHJ1Y3QgdWNvdW50cyAqaW5jX2Nncm91cF9uYW1lc3BhY2VzKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnMpCit7CisJcmV0dXJuIGluY191Y291bnQobnMsIGN1cnJlbnRfZXVpZCgpLCBVQ09VTlRfQ0dST1VQX05BTUVTUEFDRVMpOworfQorCitzdGF0aWMgdm9pZCBkZWNfY2dyb3VwX25hbWVzcGFjZXMoc3RydWN0IHVjb3VudHMgKnVjb3VudHMpCit7CisJZGVjX3Vjb3VudCh1Y291bnRzLCBVQ09VTlRfQ0dST1VQX05BTUVTUEFDRVMpOworfQorCiBzdGF0aWMgc3RydWN0IGNncm91cF9uYW1lc3BhY2UgKmFsbG9jX2Nncm91cF9ucyh2b2lkKQogewogCXN0cnVjdCBjZ3JvdXBfbmFtZXNwYWNlICpuZXdfbnM7CkBAIC02MzE2LDYgKzYzNTksNyBAQAogdm9pZCBmcmVlX2Nncm91cF9ucyhzdHJ1Y3QgY2dyb3VwX25hbWVzcGFjZSAqbnMpCiB7CiAJcHV0X2Nzc19zZXQobnMtPnJvb3RfY3NldCk7CisJZGVjX2Nncm91cF9uYW1lc3BhY2VzKG5zLT51Y291bnRzKTsKIAlwdXRfdXNlcl9ucyhucy0+dXNlcl9ucyk7CiAJbnNfZnJlZV9pbnVtKCZucy0+bnMpOwogCWtmcmVlKG5zKTsKQEAgLTYzMjcsNiArNjM3MSw3IEBACiAJCQkJCXN0cnVjdCBjZ3JvdXBfbmFtZXNwYWNlICpvbGRfbnMpCiB7CiAJc3RydWN0IGNncm91cF9uYW1lc3BhY2UgKm5ld19uczsKKwlzdHJ1Y3QgdWNvdW50cyAqdWNvdW50czsKIAlzdHJ1Y3QgY3NzX3NldCAqY3NldDsKIAogCUJVR19PTighb2xkX25zKTsKQEAgLTYzNDAsNiArNjM4NSwxMCBAQAogCWlmICghbnNfY2FwYWJsZSh1c2VyX25zLCBDQVBfU1lTX0FETUlOKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVQRVJNKTsKIAorCXVjb3VudHMgPSBpbmNfY2dyb3VwX25hbWVzcGFjZXModXNlcl9ucyk7CisJaWYgKCF1Y291bnRzKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PU1BDKTsKKwogCS8qIEl0IGlzIG5vdCBzYWZlIHRvIHRha2UgY2dyb3VwX211dGV4IGhlcmUgKi8KIAlzcGluX2xvY2tfaXJxKCZjc3Nfc2V0X2xvY2spOwogCWNzZXQgPSB0YXNrX2Nzc19zZXQoY3VycmVudCk7CkBAIC02MzQ5LDEwICs2Mzk4LDEyIEBACiAJbmV3X25zID0gYWxsb2NfY2dyb3VwX25zKCk7CiAJaWYgKElTX0VSUihuZXdfbnMpKSB7CiAJCXB1dF9jc3Nfc2V0KGNzZXQpOworCQlkZWNfY2dyb3VwX25hbWVzcGFjZXModWNvdW50cyk7CiAJCXJldHVybiBuZXdfbnM7CiAJfQogCiAJbmV3X25zLT51c2VyX25zID0gZ2V0X3VzZXJfbnModXNlcl9ucyk7CisJbmV3X25zLT51Y291bnRzID0gdWNvdW50czsKIAluZXdfbnMtPnJvb3RfY3NldCA9IGNzZXQ7CiAKIAlyZXR1cm4gbmV3X25zOwpAQCAtNjQwMywxMiArNjQ1NCwxOCBAQAogCXB1dF9jZ3JvdXBfbnModG9fY2dfbnMobnMpKTsKIH0KIAorc3RhdGljIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqY2dyb3VwbnNfb3duZXIoc3RydWN0IG5zX2NvbW1vbiAqbnMpCit7CisJcmV0dXJuIHRvX2NnX25zKG5zKS0+dXNlcl9uczsKK30KKwogY29uc3Qgc3RydWN0IHByb2NfbnNfb3BlcmF0aW9ucyBjZ3JvdXBuc19vcGVyYXRpb25zID0gewogCS5uYW1lCQk9ICJjZ3JvdXAiLAogCS50eXBlCQk9IENMT05FX05FV0NHUk9VUCwKIAkuZ2V0CQk9IGNncm91cG5zX2dldCwKIAkucHV0CQk9IGNncm91cG5zX3B1dCwKIAkuaW5zdGFsbAk9IGNncm91cG5zX2luc3RhbGwsCisJLm93bmVyCQk9IGNncm91cG5zX293bmVyLAogfTsKIAogc3RhdGljIF9faW5pdCBpbnQgY2dyb3VwX25hbWVzcGFjZXNfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEva2VybmVsL2NvbmZpZ3Mva3ZtX2d1ZXN0LmNvbmZpZyBiL2tlcm5lbC9jb25maWdzL2t2bV9ndWVzdC5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ5NjQzNwotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC9jb25maWdzL2t2bV9ndWVzdC5jb25maWcKQEAgLTAsMCArMSwzMiBAQAorQ09ORklHX05FVD15CitDT05GSUdfTkVUX0NPUkU9eQorQ09ORklHX05FVERFVklDRVM9eQorQ09ORklHX0JMT0NLPXkKK0NPTkZJR19CTEtfREVWPXkKK0NPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19UVFk9eQorQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKK0NPTkZJR19CSU5GTVRfRUxGPXkKK0NPTkZJR19QQ0k9eQorQ09ORklHX1BDSV9NU0k9eQorQ09ORklHX0RFQlVHX0tFUk5FTD15CitDT05GSUdfVklSVFVBTElaQVRJT049eQorQ09ORklHX0hZUEVSVklTT1JfR1VFU1Q9eQorQ09ORklHX1BBUkFWSVJUPXkKK0NPTkZJR19LVk1fR1VFU1Q9eQorQ09ORklHX1ZJUlRJTz15CitDT05GSUdfVklSVElPX1BDST15CitDT05GSUdfVklSVElPX0JMSz15CitDT05GSUdfVklSVElPX0NPTlNPTEU9eQorQ09ORklHX1ZJUlRJT19ORVQ9eQorQ09ORklHXzlQX0ZTPXkKK0NPTkZJR19ORVRfOVA9eQorQ09ORklHX05FVF85UF9WSVJUSU89eQorQ09ORklHX1NDU0lfTE9XTEVWRUw9eQorQ09ORklHX1NDU0lfVklSVElPPXkKK0NPTkZJR19WSVJUSU9fSU5QVVQ9eQorQ09ORklHX0RSTV9WSVJUSU9fR1BVPXkKZGlmZiAtLWdpdCBhL2tlcm5lbC9jb25maWdzL3RpbnkuY29uZmlnIGIva2VybmVsL2NvbmZpZ3MvdGlueS5jb25maWcKaW5kZXggYzJkZTU2YS4uN2ZhMGM0YSAxMDA2NDQKLS0tIGEva2VybmVsL2NvbmZpZ3MvdGlueS5jb25maWcKKysrIGIva2VybmVsL2NvbmZpZ3MvdGlueS5jb25maWcKQEAgLTEsNCArMSwxMiBAQAorIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1BFUkZPUk1BTkNFIGlzIG5vdCBzZXQKIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CisjIENPTkZJR19LRVJORUxfR1pJUCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVJORUxfQlpJUDIgaXMgbm90IHNldAorIyBDT05GSUdfS0VSTkVMX0xaTUEgaXMgbm90IHNldAogQ09ORklHX0tFUk5FTF9YWj15CisjIENPTkZJR19LRVJORUxfTFpPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFUk5FTF9MWjQgaXMgbm90IHNldAogQ09ORklHX09QVElNSVpFX0lOTElOSU5HPXkKKyMgQ09ORklHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CiBDT05GSUdfU0xPQj15CmRpZmYgLS1naXQgYS9rZXJuZWwvY3B1LmMgYi9rZXJuZWwvY3B1LmMKaW5kZXggMzQxYmY4MC4uNWRmMjBkNiAxMDA2NDQKLS0tIGEva2VybmVsL2NwdS5jCisrKyBiL2tlcm5lbC9jcHUuYwpAQCAtMjMsNiArMjMsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBib290Lmg+CisjaW5jbHVkZSA8bGludXgvcmVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvcG93ZXIuaD4KICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwpAQCAtMzcsOCArMzksOSBAQAogICogQHRocmVhZDoJUG9pbnRlciB0byB0aGUgaG90cGx1ZyB0aHJlYWQKICAqIEBzaG91bGRfcnVuOglUaHJlYWQgc2hvdWxkIGV4ZWN1dGUKICAqIEByb2xsYmFjazoJUGVyZm9ybSBhIHJvbGxiYWNrCi0gKiBAY2Jfc3RhdDoJVGhlIHN0YXRlIGZvciBhIHNpbmdsZSBjYWxsYmFjayAoaW5zdGFsbC91bmluc3RhbGwpCi0gKiBAY2I6CQlTaW5nbGUgY2FsbGJhY2sgZnVuY3Rpb24gKGluc3RhbGwvdW5pbnN0YWxsKQorICogQHNpbmdsZToJU2luZ2xlIGNhbGxiYWNrIGludm9jYXRpb24KKyAqIEBicmluZ3VwOglTaW5nbGUgY2FsbGJhY2sgYnJpbmd1cCBvciB0ZWFyZG93biBzZWxlY3RvcgorICogQGNiX3N0YXRlOglUaGUgc3RhdGUgZm9yIGEgc2luZ2xlIGNhbGxiYWNrIChpbnN0YWxsL3VuaW5zdGFsbCkKICAqIEByZXN1bHQ6CVJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uCiAgKiBAZG9uZToJU2lnbmFsIGNvbXBsZXRpb24gdG8gdGhlIGlzc3VlciBvZiB0aGUgdGFzawogICovCkBAIC00OSw4ICs1MiwxMCBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGhyZWFkOwogCWJvb2wJCQlzaG91bGRfcnVuOwogCWJvb2wJCQlyb2xsYmFjazsKKwlib29sCQkJc2luZ2xlOworCWJvb2wJCQlicmluZ3VwOworCXN0cnVjdCBobGlzdF9ub2RlCSpub2RlOwogCWVudW0gY3B1aHBfc3RhdGUJY2Jfc3RhdGU7Ci0JaW50CQkJKCpjYikodW5zaWduZWQgaW50IGNwdSk7CiAJaW50CQkJcmVzdWx0OwogCXN0cnVjdCBjb21wbGV0aW9uCWRvbmU7CiAjZW5kaWYKQEAgLTY4LDM1ICs3MywxMDMgQEAKICAqIEBjYW50X3N0b3A6CUJyaW5ndXAvdGVhcmRvd24gY2FuJ3QgYmUgc3RvcHBlZCBhdCB0aGlzIHN0ZXAKICAqLwogc3RydWN0IGNwdWhwX3N0ZXAgewotCWNvbnN0IGNoYXIJKm5hbWU7Ci0JaW50CQkoKnN0YXJ0dXApKHVuc2lnbmVkIGludCBjcHUpOwotCWludAkJKCp0ZWFyZG93bikodW5zaWduZWQgaW50IGNwdSk7Ci0JYm9vbAkJc2tpcF9vbmVycjsKLQlib29sCQljYW50X3N0b3A7CisJY29uc3QgY2hhcgkJKm5hbWU7CisJdW5pb24geworCQlpbnQJCSgqc2luZ2xlKSh1bnNpZ25lZCBpbnQgY3B1KTsKKwkJaW50CQkoKm11bHRpKSh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCQkgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUpOworCX0gc3RhcnR1cDsKKwl1bmlvbiB7CisJCWludAkJKCpzaW5nbGUpKHVuc2lnbmVkIGludCBjcHUpOworCQlpbnQJCSgqbXVsdGkpKHVuc2lnbmVkIGludCBjcHUsCisJCQkJCSBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSk7CisJfSB0ZWFyZG93bjsKKwlzdHJ1Y3QgaGxpc3RfaGVhZAlsaXN0OworCWJvb2wJCQlza2lwX29uZXJyOworCWJvb2wJCQljYW50X3N0b3A7CisJYm9vbAkJCW11bHRpX2luc3RhbmNlOwogfTsKIAogc3RhdGljIERFRklORV9NVVRFWChjcHVocF9zdGF0ZV9tdXRleCk7CiBzdGF0aWMgc3RydWN0IGNwdWhwX3N0ZXAgY3B1aHBfYnBfc3RhdGVzW107CiBzdGF0aWMgc3RydWN0IGNwdWhwX3N0ZXAgY3B1aHBfYXBfc3RhdGVzW107CiAKK3N0YXRpYyBib29sIGNwdWhwX2lzX2FwX3N0YXRlKGVudW0gY3B1aHBfc3RhdGUgc3RhdGUpCit7CisJLyoKKwkgKiBUaGUgZXh0cmEgY2hlY2sgZm9yIENQVUhQX1RFQVJET1dOX0NQVSBpcyBvbmx5IGZvciBkb2N1bWVudGF0aW9uCisJICogcHVycG9zZXMgYXMgdGhhdCBzdGF0ZSBpcyBoYW5kbGVkIGV4cGxpY2l0bHkgaW4gY3B1X2Rvd24uCisJICovCisJcmV0dXJuIHN0YXRlID4gQ1BVSFBfQlJJTkdVUF9DUFUgJiYgc3RhdGUgIT0gQ1BVSFBfVEVBUkRPV05fQ1BVOworfQorCitzdGF0aWMgc3RydWN0IGNwdWhwX3N0ZXAgKmNwdWhwX2dldF9zdGVwKGVudW0gY3B1aHBfc3RhdGUgc3RhdGUpCit7CisJc3RydWN0IGNwdWhwX3N0ZXAgKnNwOworCisJc3AgPSBjcHVocF9pc19hcF9zdGF0ZShzdGF0ZSkgPyBjcHVocF9hcF9zdGF0ZXMgOiBjcHVocF9icF9zdGF0ZXM7CisJcmV0dXJuIHNwICsgc3RhdGU7Cit9CisKIC8qKgogICogY3B1aHBfaW52b2tlX2NhbGxiYWNrIF8gSW52b2tlIHRoZSBjYWxsYmFja3MgZm9yIGEgZ2l2ZW4gc3RhdGUKICAqIEBjcHU6CVRoZSBjcHUgZm9yIHdoaWNoIHRoZSBjYWxsYmFjayBzaG91bGQgYmUgaW52b2tlZAogICogQHN0ZXA6CVRoZSBzdGVwIGluIHRoZSBzdGF0ZSBtYWNoaW5lCi0gKiBAY2I6CQlUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gaW52b2tlCisgKiBAYnJpbmd1cDoJVHJ1ZSBpZiB0aGUgYnJpbmd1cCBjYWxsYmFjayBzaG91bGQgYmUgaW52b2tlZAogICoKLSAqIENhbGxlZCBmcm9tIGNwdSBob3RwbHVnIGFuZCBmcm9tIHRoZSBzdGF0ZSByZWdpc3RlciBtYWNoaW5lcnkKKyAqIENhbGxlZCBmcm9tIGNwdSBob3RwbHVnIGFuZCBmcm9tIHRoZSBzdGF0ZSByZWdpc3RlciBtYWNoaW5lcnkuCiAgKi8KLXN0YXRpYyBpbnQgY3B1aHBfaW52b2tlX2NhbGxiYWNrKHVuc2lnbmVkIGludCBjcHUsIGVudW0gY3B1aHBfc3RhdGUgc3RlcCwKLQkJCQkgaW50ICgqY2IpKHVuc2lnbmVkIGludCkpCitzdGF0aWMgaW50IGNwdWhwX2ludm9rZV9jYWxsYmFjayh1bnNpZ25lZCBpbnQgY3B1LCBlbnVtIGNwdWhwX3N0YXRlIHN0YXRlLAorCQkJCSBib29sIGJyaW5ndXAsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKQogewogCXN0cnVjdCBjcHVocF9jcHVfc3RhdGUgKnN0ID0gcGVyX2NwdV9wdHIoJmNwdWhwX3N0YXRlLCBjcHUpOwotCWludCByZXQgPSAwOworCXN0cnVjdCBjcHVocF9zdGVwICpzdGVwID0gY3B1aHBfZ2V0X3N0ZXAoc3RhdGUpOworCWludCAoKmNibSkodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUpOworCWludCAoKmNiKSh1bnNpZ25lZCBpbnQgY3B1KTsKKwlpbnQgcmV0LCBjbnQ7CiAKLQlpZiAoY2IpIHsKLQkJdHJhY2VfY3B1aHBfZW50ZXIoY3B1LCBzdC0+dGFyZ2V0LCBzdGVwLCBjYik7CisJaWYgKCFzdGVwLT5tdWx0aV9pbnN0YW5jZSkgeworCQljYiA9IGJyaW5ndXAgPyBzdGVwLT5zdGFydHVwLnNpbmdsZSA6IHN0ZXAtPnRlYXJkb3duLnNpbmdsZTsKKwkJaWYgKCFjYikKKwkJCXJldHVybiAwOworCQl0cmFjZV9jcHVocF9lbnRlcihjcHUsIHN0LT50YXJnZXQsIHN0YXRlLCBjYik7CiAJCXJldCA9IGNiKGNwdSk7Ci0JCXRyYWNlX2NwdWhwX2V4aXQoY3B1LCBzdC0+c3RhdGUsIHN0ZXAsIHJldCk7CisJCXRyYWNlX2NwdWhwX2V4aXQoY3B1LCBzdC0+c3RhdGUsIHN0YXRlLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwljYm0gPSBicmluZ3VwID8gc3RlcC0+c3RhcnR1cC5tdWx0aSA6IHN0ZXAtPnRlYXJkb3duLm11bHRpOworCWlmICghY2JtKQorCQlyZXR1cm4gMDsKKworCS8qIFNpbmdsZSBpbnZvY2F0aW9uIGZvciBpbnN0YW5jZSBhZGQvcmVtb3ZlICovCisJaWYgKG5vZGUpIHsKKwkJdHJhY2VfY3B1aHBfbXVsdGlfZW50ZXIoY3B1LCBzdC0+dGFyZ2V0LCBzdGF0ZSwgY2JtLCBub2RlKTsKKwkJcmV0ID0gY2JtKGNwdSwgbm9kZSk7CisJCXRyYWNlX2NwdWhwX2V4aXQoY3B1LCBzdC0+c3RhdGUsIHN0YXRlLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFN0YXRlIHRyYW5zaXRpb24uIEludm9rZSBvbiBhbGwgaW5zdGFuY2VzICovCisJY250ID0gMDsKKwlobGlzdF9mb3JfZWFjaChub2RlLCAmc3RlcC0+bGlzdCkgeworCQl0cmFjZV9jcHVocF9tdWx0aV9lbnRlcihjcHUsIHN0LT50YXJnZXQsIHN0YXRlLCBjYm0sIG5vZGUpOworCQlyZXQgPSBjYm0oY3B1LCBub2RlKTsKKwkJdHJhY2VfY3B1aHBfZXhpdChjcHUsIHN0LT5zdGF0ZSwgc3RhdGUsIHJldCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjsKKwkJY250Kys7CisJfQorCXJldHVybiAwOworZXJyOgorCS8qIFJvbGxiYWNrIHRoZSBpbnN0YW5jZXMgaWYgb25lIGZhaWxlZCAqLworCWNibSA9ICFicmluZ3VwID8gc3RlcC0+c3RhcnR1cC5tdWx0aSA6IHN0ZXAtPnRlYXJkb3duLm11bHRpOworCWlmICghY2JtKQorCQlyZXR1cm4gcmV0OworCisJaGxpc3RfZm9yX2VhY2gobm9kZSwgJnN0ZXAtPmxpc3QpIHsKKwkJaWYgKCFjbnQtLSkKKwkJCWJyZWFrOworCQljYm0oY3B1LCBub2RlKTsKIAl9CiAJcmV0dXJuIHJldDsKIH0KQEAgLTI2MCwxMCArMzMzLDE3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjcHVfaG90cGx1Z19kaXNhYmxlKTsKIAorc3RhdGljIHZvaWQgX19jcHVfaG90cGx1Z19lbmFibGUodm9pZCkKK3sKKwlpZiAoV0FSTl9PTkNFKCFjcHVfaG90cGx1Z19kaXNhYmxlZCwgIlVuYmFsYW5jZWQgY3B1IGhvdHBsdWcgZW5hYmxlXG4iKSkKKwkJcmV0dXJuOworCWNwdV9ob3RwbHVnX2Rpc2FibGVkLS07Cit9CisKIHZvaWQgY3B1X2hvdHBsdWdfZW5hYmxlKHZvaWQpCiB7CiAJY3B1X21hcHNfdXBkYXRlX2JlZ2luKCk7Ci0JV0FSTl9PTigtLWNwdV9ob3RwbHVnX2Rpc2FibGVkIDwgMCk7CisJX19jcHVfaG90cGx1Z19lbmFibGUoKTsKIAljcHVfbWFwc191cGRhdGVfZG9uZSgpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY3B1X2hvdHBsdWdfZW5hYmxlKTsKQEAgLTMzMCwxMiArNDEwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBub3RpZnlfc3RhcnRpbmcodW5zaWduZWQgaW50IGNwdSkKLXsKLQljcHVfbm90aWZ5KENQVV9TVEFSVElORywgY3B1KTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBicmluZ3VwX3dhaXRfZm9yX2FwKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJc3RydWN0IGNwdWhwX2NwdV9zdGF0ZSAqc3QgPSBwZXJfY3B1X3B0cigmY3B1aHBfc3RhdGUsIGNwdSk7CkBAIC0zNDksOCArNDIzLDE2IEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICppZGxlID0gaWRsZV90aHJlYWRfZ2V0KGNwdSk7CiAJaW50IHJldDsKIAorCS8qCisJICogU29tZSBhcmNoaXRlY3R1cmVzIGhhdmUgdG8gd2FsayB0aGUgaXJxIGRlc2NyaXB0b3JzIHRvCisJICogc2V0dXAgdGhlIHZlY3RvciBzcGFjZSBmb3IgdGhlIGNwdSB3aGljaCBjb21lcyBvbmxpbmUuCisJICogUHJldmVudCBpcnEgYWxsb2MvZnJlZSBhY3Jvc3MgdGhlIGJyaW5ndXAuCisJICovCisJaXJxX2xvY2tfc3BhcnNlKCk7CisKIAkvKiBBcmNoLXNwZWNpZmljIGVuYWJsaW5nIGNvZGUuICovCiAJcmV0ID0gX19jcHVfdXAoY3B1LCBpZGxlKTsKKwlpcnFfdW5sb2NrX3NwYXJzZSgpOwogCWlmIChyZXQpIHsKIAkJY3B1X25vdGlmeShDUFVfVVBfQ0FOQ0VMRUQsIGNwdSk7CiAJCXJldHVybiByZXQ7CkBAIC0zNjMsNjIgKzQ0NSw1NSBAQAogLyoKICAqIEhvdHBsdWcgc3RhdGUgbWFjaGluZSByZWxhdGVkIGZ1bmN0aW9ucwogICovCi1zdGF0aWMgdm9pZCB1bmRvX2NwdV9kb3duKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBjcHVocF9jcHVfc3RhdGUgKnN0LAotCQkJICBzdHJ1Y3QgY3B1aHBfc3RlcCAqc3RlcHMpCitzdGF0aWMgdm9pZCB1bmRvX2NwdV9kb3duKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBjcHVocF9jcHVfc3RhdGUgKnN0KQogewogCWZvciAoc3QtPnN0YXRlKys7IHN0LT5zdGF0ZSA8IHN0LT50YXJnZXQ7IHN0LT5zdGF0ZSsrKSB7Ci0JCXN0cnVjdCBjcHVocF9zdGVwICpzdGVwID0gc3RlcHMgKyBzdC0+c3RhdGU7CisJCXN0cnVjdCBjcHVocF9zdGVwICpzdGVwID0gY3B1aHBfZ2V0X3N0ZXAoc3QtPnN0YXRlKTsKIAogCQlpZiAoIXN0ZXAtPnNraXBfb25lcnIpCi0JCQljcHVocF9pbnZva2VfY2FsbGJhY2soY3B1LCBzdC0+c3RhdGUsIHN0ZXAtPnN0YXJ0dXApOworCQkJY3B1aHBfaW52b2tlX2NhbGxiYWNrKGNwdSwgc3QtPnN0YXRlLCB0cnVlLCBOVUxMKTsKIAl9CiB9CiAKIHN0YXRpYyBpbnQgY3B1aHBfZG93bl9jYWxsYmFja3ModW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGNwdWhwX2NwdV9zdGF0ZSAqc3QsCi0JCQkJc3RydWN0IGNwdWhwX3N0ZXAgKnN0ZXBzLCBlbnVtIGNwdWhwX3N0YXRlIHRhcmdldCkKKwkJCQllbnVtIGNwdWhwX3N0YXRlIHRhcmdldCkKIHsKIAllbnVtIGNwdWhwX3N0YXRlIHByZXZfc3RhdGUgPSBzdC0+c3RhdGU7CiAJaW50IHJldCA9IDA7CiAKIAlmb3IgKDsgc3QtPnN0YXRlID4gdGFyZ2V0OyBzdC0+c3RhdGUtLSkgewotCQlzdHJ1Y3QgY3B1aHBfc3RlcCAqc3RlcCA9IHN0ZXBzICsgc3QtPnN0YXRlOwotCi0JCXJldCA9IGNwdWhwX2ludm9rZV9jYWxsYmFjayhjcHUsIHN0LT5zdGF0ZSwgc3RlcC0+dGVhcmRvd24pOworCQlyZXQgPSBjcHVocF9pbnZva2VfY2FsbGJhY2soY3B1LCBzdC0+c3RhdGUsIGZhbHNlLCBOVUxMKTsKIAkJaWYgKHJldCkgewogCQkJc3QtPnRhcmdldCA9IHByZXZfc3RhdGU7Ci0JCQl1bmRvX2NwdV9kb3duKGNwdSwgc3QsIHN0ZXBzKTsKKwkJCXVuZG9fY3B1X2Rvd24oY3B1LCBzdCk7CiAJCQlicmVhazsKIAkJfQogCX0KIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCB1bmRvX2NwdV91cCh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgY3B1aHBfY3B1X3N0YXRlICpzdCwKLQkJCXN0cnVjdCBjcHVocF9zdGVwICpzdGVwcykKK3N0YXRpYyB2b2lkIHVuZG9fY3B1X3VwKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBjcHVocF9jcHVfc3RhdGUgKnN0KQogewogCWZvciAoc3QtPnN0YXRlLS07IHN0LT5zdGF0ZSA+IHN0LT50YXJnZXQ7IHN0LT5zdGF0ZS0tKSB7Ci0JCXN0cnVjdCBjcHVocF9zdGVwICpzdGVwID0gc3RlcHMgKyBzdC0+c3RhdGU7CisJCXN0cnVjdCBjcHVocF9zdGVwICpzdGVwID0gY3B1aHBfZ2V0X3N0ZXAoc3QtPnN0YXRlKTsKIAogCQlpZiAoIXN0ZXAtPnNraXBfb25lcnIpCi0JCQljcHVocF9pbnZva2VfY2FsbGJhY2soY3B1LCBzdC0+c3RhdGUsIHN0ZXAtPnRlYXJkb3duKTsKKwkJCWNwdWhwX2ludm9rZV9jYWxsYmFjayhjcHUsIHN0LT5zdGF0ZSwgZmFsc2UsIE5VTEwpOwogCX0KIH0KIAogc3RhdGljIGludCBjcHVocF91cF9jYWxsYmFja3ModW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGNwdWhwX2NwdV9zdGF0ZSAqc3QsCi0JCQkgICAgICBzdHJ1Y3QgY3B1aHBfc3RlcCAqc3RlcHMsIGVudW0gY3B1aHBfc3RhdGUgdGFyZ2V0KQorCQkJICAgICAgZW51bSBjcHVocF9zdGF0ZSB0YXJnZXQpCiB7CiAJZW51bSBjcHVocF9zdGF0ZSBwcmV2X3N0YXRlID0gc3QtPnN0YXRlOwogCWludCByZXQgPSAwOwogCiAJd2hpbGUgKHN0LT5zdGF0ZSA8IHRhcmdldCkgewotCQlzdHJ1Y3QgY3B1aHBfc3RlcCAqc3RlcDsKLQogCQlzdC0+c3RhdGUrKzsKLQkJc3RlcCA9IHN0ZXBzICsgc3QtPnN0YXRlOwotCQlyZXQgPSBjcHVocF9pbnZva2VfY2FsbGJhY2soY3B1LCBzdC0+c3RhdGUsIHN0ZXAtPnN0YXJ0dXApOworCQlyZXQgPSBjcHVocF9pbnZva2VfY2FsbGJhY2soY3B1LCBzdC0+c3RhdGUsIHRydWUsIE5VTEwpOwogCQlpZiAocmV0KSB7CiAJCQlzdC0+dGFyZ2V0ID0gcHJldl9zdGF0ZTsKLQkJCXVuZG9fY3B1X3VwKGNwdSwgc3QsIHN0ZXBzKTsKKwkJCXVuZG9fY3B1X3VwKGNwdSwgc3QpOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC00NDcsMTMgKzUyMiwxMyBAQAogewogCWVudW0gY3B1aHBfc3RhdGUgdGFyZ2V0ID0gbWF4KChpbnQpc3QtPnRhcmdldCwgQ1BVSFBfVEVBUkRPV05fQ1BVKTsKIAotCXJldHVybiBjcHVocF9kb3duX2NhbGxiYWNrcyhjcHUsIHN0LCBjcHVocF9hcF9zdGF0ZXMsIHRhcmdldCk7CisJcmV0dXJuIGNwdWhwX2Rvd25fY2FsbGJhY2tzKGNwdSwgc3QsIHRhcmdldCk7CiB9CiAKIC8qIEV4ZWN1dGUgdGhlIG9ubGluZSBzdGFydHVwIGNhbGxiYWNrcy4gVXNlZCB0byBiZSBDUFVfT05MSU5FICovCiBzdGF0aWMgaW50IGNwdWhwX2FwX29ubGluZSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgY3B1aHBfY3B1X3N0YXRlICpzdCkKIHsKLQlyZXR1cm4gY3B1aHBfdXBfY2FsbGJhY2tzKGNwdSwgc3QsIGNwdWhwX2FwX3N0YXRlcywgc3QtPnRhcmdldCk7CisJcmV0dXJuIGNwdWhwX3VwX2NhbGxiYWNrcyhjcHUsIHN0LCBzdC0+dGFyZ2V0KTsKIH0KIAogLyoKQEAgLTQ3NiwxOCArNTUxLDIwIEBACiAJc3QtPnNob3VsZF9ydW4gPSBmYWxzZTsKIAogCS8qIFNpbmdsZSBjYWxsYmFjayBpbnZvY2F0aW9uIGZvciBbdW5daW5zdGFsbCA/ICovCi0JaWYgKHN0LT5jYikgeworCWlmIChzdC0+c2luZ2xlKSB7CiAJCWlmIChzdC0+Y2Jfc3RhdGUgPCBDUFVIUF9BUF9PTkxJTkUpIHsKIAkJCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JCQlyZXQgPSBjcHVocF9pbnZva2VfY2FsbGJhY2soY3B1LCBzdC0+Y2Jfc3RhdGUsIHN0LT5jYik7CisJCQlyZXQgPSBjcHVocF9pbnZva2VfY2FsbGJhY2soY3B1LCBzdC0+Y2Jfc3RhdGUsCisJCQkJCQkgICAgc3QtPmJyaW5ndXAsIHN0LT5ub2RlKTsKIAkJCWxvY2FsX2lycV9lbmFibGUoKTsKIAkJfSBlbHNlIHsKLQkJCXJldCA9IGNwdWhwX2ludm9rZV9jYWxsYmFjayhjcHUsIHN0LT5jYl9zdGF0ZSwgc3QtPmNiKTsKKwkJCXJldCA9IGNwdWhwX2ludm9rZV9jYWxsYmFjayhjcHUsIHN0LT5jYl9zdGF0ZSwKKwkJCQkJCSAgICBzdC0+YnJpbmd1cCwgc3QtPm5vZGUpOwogCQl9CiAJfSBlbHNlIGlmIChzdC0+cm9sbGJhY2spIHsKIAkJQlVHX09OKHN0LT5zdGF0ZSA8IENQVUhQX0FQX09OTElORV9JRExFKTsKIAotCQl1bmRvX2NwdV9kb3duKGNwdSwgc3QsIGNwdWhwX2FwX3N0YXRlcyk7CisJCXVuZG9fY3B1X2Rvd24oY3B1LCBzdCk7CiAJCS8qCiAJCSAqIFRoaXMgaXMgYSBtb21lbnRhcnkgd29ya2Fyb3VuZCB0byBrZWVwIHRoZSBub3RpZmllciB1c2VycwogCQkgKiBoYXBweS4gV2lsbCBnbyBhd2F5IG9uY2Ugd2UgZ290IHJpZCBvZiB0aGUgbm90aWZpZXJzLgpAQCAtNTA5LDggKzU4Niw5IEBACiB9CiAKIC8qIEludm9rZSBhIHNpbmdsZSBjYWxsYmFjayBvbiBhIHJlbW90ZSBjcHUgKi8KLXN0YXRpYyBpbnQgY3B1aHBfaW52b2tlX2FwX2NhbGxiYWNrKGludCBjcHUsIGVudW0gY3B1aHBfc3RhdGUgc3RhdGUsCi0JCQkJICAgIGludCAoKmNiKSh1bnNpZ25lZCBpbnQpKQorc3RhdGljIGludAorY3B1aHBfaW52b2tlX2FwX2NhbGxiYWNrKGludCBjcHUsIGVudW0gY3B1aHBfc3RhdGUgc3RhdGUsIGJvb2wgYnJpbmd1cCwKKwkJCSBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSkKIHsKIAlzdHJ1Y3QgY3B1aHBfY3B1X3N0YXRlICpzdCA9IHBlcl9jcHVfcHRyKCZjcHVocF9zdGF0ZSwgY3B1KTsKIApAQCAtNTIyLDEwICs2MDAsMTMgQEAKIAkgKiB3ZSBpbnZva2UgdGhlIHRocmVhZCBmdW5jdGlvbiBkaXJlY3RseS4KIAkgKi8KIAlpZiAoIXN0LT50aHJlYWQpCi0JCXJldHVybiBjcHVocF9pbnZva2VfY2FsbGJhY2soY3B1LCBzdGF0ZSwgY2IpOworCQlyZXR1cm4gY3B1aHBfaW52b2tlX2NhbGxiYWNrKGNwdSwgc3RhdGUsIGJyaW5ndXAsIG5vZGUpOwogCiAJc3QtPmNiX3N0YXRlID0gc3RhdGU7Ci0Jc3QtPmNiID0gY2I7CisJc3QtPnNpbmdsZSA9IHRydWU7CisJc3QtPmJyaW5ndXAgPSBicmluZ3VwOworCXN0LT5ub2RlID0gbm9kZTsKKwogCS8qCiAJICogTWFrZSBzdXJlIHRoZSBhYm92ZSBzdG9yZXMgYXJlIHZpc2libGUgYmVmb3JlIHNob3VsZF9ydW4gYmVjb21lcwogCSAqIHRydWUuIFBhaXJlZCB3aXRoIHRoZSBtYigpIGFib3ZlIGluIGNwdWhwX3RocmVhZF9mdW4oKQpAQCAtNTQxLDcgKzYyMiw3IEBACiBzdGF0aWMgdm9pZCBfX2NwdWhwX2tpY2tfYXBfd29yayhzdHJ1Y3QgY3B1aHBfY3B1X3N0YXRlICpzdCkKIHsKIAlzdC0+cmVzdWx0ID0gMDsKLQlzdC0+Y2IgPSBOVUxMOworCXN0LT5zaW5nbGUgPSBmYWxzZTsKIAkvKgogCSAqIE1ha2Ugc3VyZSB0aGUgYWJvdmUgc3RvcmVzIGFyZSB2aXNpYmxlIGJlZm9yZSBzaG91bGRfcnVuIGJlY29tZXMKIAkgKiB0cnVlLiBQYWlyZWQgd2l0aCB0aGUgbWIoKSBhYm92ZSBpbiBjcHVocF90aHJlYWRfZnVuKCkKQEAgLTY3NCwxMiArNzU1LDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IG5vdGlmeV9keWluZyh1bnNpZ25lZCBpbnQgY3B1KQotewotCWNwdV9ub3RpZnkoQ1BVX0RZSU5HLCBjcHUpOwotCXJldHVybiAwOwotfQotCiAvKiBUYWtlIHRoaXMgQ1BVIGRvd24uICovCiBzdGF0aWMgaW50IHRha2VfY3B1X2Rvd24odm9pZCAqX3BhcmFtKQogewpAQCAtNjkyLDEyICs3NjcsMTYgQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAorCS8qCisJICogV2UgZ2V0IGhlcmUgd2hpbGUgd2UgYXJlIGluIENQVUhQX1RFQVJET1dOX0NQVSBzdGF0ZSBhbmQgd2UgbXVzdCBub3QKKwkgKiBkbyB0aGlzIHN0ZXAgYWdhaW4uCisJICovCisJV0FSTl9PTihzdC0+c3RhdGUgIT0gQ1BVSFBfVEVBUkRPV05fQ1BVKTsKKwlzdC0+c3RhdGUtLTsKIAkvKiBJbnZva2UgdGhlIGZvcm1lciBDUFVfRFlJTkcgY2FsbGJhY2tzICovCi0JZm9yICg7IHN0LT5zdGF0ZSA+IHRhcmdldDsgc3QtPnN0YXRlLS0pIHsKLQkJc3RydWN0IGNwdWhwX3N0ZXAgKnN0ZXAgPSBjcHVocF9hcF9zdGF0ZXMgKyBzdC0+c3RhdGU7CisJZm9yICg7IHN0LT5zdGF0ZSA+IHRhcmdldDsgc3QtPnN0YXRlLS0pCisJCWNwdWhwX2ludm9rZV9jYWxsYmFjayhjcHUsIHN0LT5zdGF0ZSwgZmFsc2UsIE5VTEwpOwogCi0JCWNwdWhwX2ludm9rZV9jYWxsYmFjayhjcHUsIHN0LT5zdGF0ZSwgc3RlcC0+dGVhcmRvd24pOwotCX0KIAkvKiBHaXZlIHVwIHRpbWVrZWVwaW5nIGR1dGllcyAqLwogCXRpY2tfaGFuZG92ZXJfZG9fdGltZXIoKTsKIAkvKiBQYXJrIHRoZSBzdG9wcGVyIHRocmVhZCAqLwpAQCAtNzM0LDcgKzgxMyw3IEBACiAJQlVHX09OKGNwdV9vbmxpbmUoY3B1KSk7CiAKIAkvKgotCSAqIFRoZSBtaWdyYXRpb25fY2FsbCgpIENQVV9EWUlORyBjYWxsYmFjayB3aWxsIGhhdmUgcmVtb3ZlZCBhbGwKKwkgKiBUaGUgQ1BVSFBfQVBfU0NIRURfTUlHUkFURV9EWUlORyBjYWxsYmFjayB3aWxsIGhhdmUgcmVtb3ZlZCBhbGwKIAkgKiBydW5uYWJsZSB0YXNrcyBmcm9tIHRoZSBjcHUsIHRoZXJlJ3Mgb25seSB0aGUgaWRsZSB0YXNrIGxlZnQgbm93CiAJICogdGhhdCB0aGUgbWlncmF0aW9uIHRocmVhZCBpcyBkb25lIGRvaW5nIHRoZSBzdG9wX21hY2hpbmUgdGhpbmcuCiAJICoKQEAgLTc4Nyw3ICs4NjYsNiBAQAogI2RlZmluZSBub3RpZnlfZG93bl9wcmVwYXJlCU5VTEwKICNkZWZpbmUgdGFrZWRvd25fY3B1CQlOVUxMCiAjZGVmaW5lIG5vdGlmeV9kZWFkCQlOVUxMCi0jZGVmaW5lIG5vdGlmeV9keWluZwkJTlVMTAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKQEAgLTgzNiw3ICs5MTQsNyBAQAogCSAqIFRoZSBBUCBicm91Z2h0IGl0c2VsZiBkb3duIHRvIENQVUhQX1RFQVJET1dOX0NQVS4gU28gd2UgbmVlZAogCSAqIHRvIGRvIHRoZSBmdXJ0aGVyIGNsZWFudXBzLgogCSAqLwotCXJldCA9IGNwdWhwX2Rvd25fY2FsbGJhY2tzKGNwdSwgc3QsIGNwdWhwX2JwX3N0YXRlcywgdGFyZ2V0KTsKKwlyZXQgPSBjcHVocF9kb3duX2NhbGxiYWNrcyhjcHUsIHN0LCB0YXJnZXQpOwogCWlmIChyZXQgJiYgc3QtPnN0YXRlID4gQ1BVSFBfVEVBUkRPV05fQ1BVICYmIHN0LT5zdGF0ZSA8IHByZXZfc3RhdGUpIHsKIAkJc3QtPnRhcmdldCA9IHByZXZfc3RhdGU7CiAJCXN0LT5yb2xsYmFjayA9IHRydWU7CkBAIC04NzcsMTAgKzk1NSw5IEBACiAjZW5kaWYgLypDT05GSUdfSE9UUExVR19DUFUqLwogCiAvKioKLSAqIG5vdGlmeV9jcHVfc3RhcnRpbmcoY3B1KSAtIGNhbGwgdGhlIENQVV9TVEFSVElORyBub3RpZmllcnMKKyAqIG5vdGlmeV9jcHVfc3RhcnRpbmcoY3B1KSAtIEludm9rZSB0aGUgY2FsbGJhY2tzIG9uIHRoZSBzdGFydGluZyBDUFUKICAqIEBjcHU6IGNwdSB0aGF0IGp1c3Qgc3RhcnRlZAogICoKLSAqIFRoaXMgZnVuY3Rpb24gY2FsbHMgdGhlIGNwdV9jaGFpbiBub3RpZmllcnMgd2l0aCBDUFVfU1RBUlRJTkcuCiAgKiBJdCBtdXN0IGJlIGNhbGxlZCBieSB0aGUgYXJjaCBjb2RlIG9uIHRoZSBuZXcgY3B1LCBiZWZvcmUgdGhlIG5ldyBjcHUKICAqIGVuYWJsZXMgaW50ZXJydXB0cyBhbmQgYmVmb3JlIHRoZSAiYm9vdCIgY3B1IHJldHVybnMgZnJvbSBfX2NwdV91cCgpLgogICovCkBAIC04ODksMTIgKzk2NiwxMCBAQAogCXN0cnVjdCBjcHVocF9jcHVfc3RhdGUgKnN0ID0gcGVyX2NwdV9wdHIoJmNwdWhwX3N0YXRlLCBjcHUpOwogCWVudW0gY3B1aHBfc3RhdGUgdGFyZ2V0ID0gbWluKChpbnQpc3QtPnRhcmdldCwgQ1BVSFBfQVBfT05MSU5FKTsKIAorCXJjdV9jcHVfc3RhcnRpbmcoY3B1KTsJLyogRW5hYmxlcyBSQ1UgdXNhZ2Ugb24gdGhpcyBDUFUuICovCiAJd2hpbGUgKHN0LT5zdGF0ZSA8IHRhcmdldCkgewotCQlzdHJ1Y3QgY3B1aHBfc3RlcCAqc3RlcDsKLQogCQlzdC0+c3RhdGUrKzsKLQkJc3RlcCA9IGNwdWhwX2FwX3N0YXRlcyArIHN0LT5zdGF0ZTsKLQkJY3B1aHBfaW52b2tlX2NhbGxiYWNrKGNwdSwgc3QtPnN0YXRlLCBzdGVwLT5zdGFydHVwKTsKKwkJY3B1aHBfaW52b2tlX2NhbGxiYWNrKGNwdSwgc3QtPnN0YXRlLCB0cnVlLCBOVUxMKTsKIAl9CiB9CiAKQEAgLTk3OSw3ICsxMDU0LDcgQEAKIAkgKiByZXNwb25zaWJsZSBmb3IgYnJpbmdpbmcgaXQgdXAgdG8gdGhlIHRhcmdldCBzdGF0ZS4KIAkgKi8KIAl0YXJnZXQgPSBtaW4oKGludCl0YXJnZXQsIENQVUhQX0JSSU5HVVBfQ1BVKTsKLQlyZXQgPSBjcHVocF91cF9jYWxsYmFja3MoY3B1LCBzdCwgY3B1aHBfYnBfc3RhdGVzLCB0YXJnZXQpOworCXJldCA9IGNwdWhwX3VwX2NhbGxiYWNrcyhjcHUsIHN0LCB0YXJnZXQpOwogb3V0OgogCWNwdV9ob3RwbHVnX2RvbmUoKTsKIAlyZXR1cm4gcmV0OwpAQCAtMTAyNCwxMiArMTA5OSwxMyBAQAogI2lmZGVmIENPTkZJR19QTV9TTEVFUF9TTVAKIHN0YXRpYyBjcHVtYXNrX3Zhcl90IGZyb3plbl9jcHVzOwogCi1pbnQgZGlzYWJsZV9ub25ib290X2NwdXModm9pZCkKK2ludCBmcmVlemVfc2Vjb25kYXJ5X2NwdXMoaW50IHByaW1hcnkpCiB7Ci0JaW50IGNwdSwgZmlyc3RfY3B1LCBlcnJvciA9IDA7CisJaW50IGNwdSwgZXJyb3IgPSAwOwogCiAJY3B1X21hcHNfdXBkYXRlX2JlZ2luKCk7Ci0JZmlyc3RfY3B1ID0gY3B1bWFza19maXJzdChjcHVfb25saW5lX21hc2spOworCWlmICghY3B1X29ubGluZShwcmltYXJ5KSkKKwkJcHJpbWFyeSA9IGNwdW1hc2tfZmlyc3QoY3B1X29ubGluZV9tYXNrKTsKIAkvKgogCSAqIFdlIHRha2UgZG93biBhbGwgb2YgdGhlIG5vbi1ib290IENQVXMgaW4gb25lIHNob3QgdG8gYXZvaWQgcmFjZXMKIAkgKiB3aXRoIHRoZSB1c2Vyc3BhY2UgdHJ5aW5nIHRvIHVzZSB0aGUgQ1BVIGhvdHBsdWcgYXQgdGhlIHNhbWUgdGltZQpAQCAtMTAzOCw3ICsxMTE0LDcgQEAKIAogCXByX2luZm8oIkRpc2FibGluZyBub24tYm9vdCBDUFVzIC4uLlxuIik7CiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKLQkJaWYgKGNwdSA9PSBmaXJzdF9jcHUpCisJCWlmIChjcHUgPT0gcHJpbWFyeSkKIAkJCWNvbnRpbnVlOwogCQl0cmFjZV9zdXNwZW5kX3Jlc3VtZShUUFMoIkNQVV9PRkYiKSwgY3B1LCB0cnVlKTsKIAkJZXJyb3IgPSBfY3B1X2Rvd24oY3B1LCAxLCBDUFVIUF9PRkZMSU5FKTsKQEAgLTEwODEsNyArMTE1Nyw3IEBACiAKIAkvKiBBbGxvdyBldmVyeW9uZSB0byB1c2UgdGhlIENQVSBob3RwbHVnIGFnYWluICovCiAJY3B1X21hcHNfdXBkYXRlX2JlZ2luKCk7Ci0JV0FSTl9PTigtLWNwdV9ob3RwbHVnX2Rpc2FibGVkIDwgMCk7CisJX19jcHVfaG90cGx1Z19lbmFibGUoKTsKIAlpZiAoY3B1bWFza19lbXB0eShmcm96ZW5fY3B1cykpCiAJCWdvdG8gb3V0OwogCkBAIC0xMTcwLDQwICsxMjQ2LDUwIEBACiBzdGF0aWMgc3RydWN0IGNwdWhwX3N0ZXAgY3B1aHBfYnBfc3RhdGVzW10gPSB7CiAJW0NQVUhQX09GRkxJTkVdID0gewogCQkubmFtZQkJCT0gIm9mZmxpbmUiLAotCQkuc3RhcnR1cAkJPSBOVUxMLAotCQkudGVhcmRvd24JCT0gTlVMTCwKKwkJLnN0YXJ0dXAuc2luZ2xlCQk9IE5VTEwsCisJCS50ZWFyZG93bi5zaW5nbGUJPSBOVUxMLAogCX0sCiAjaWZkZWYgQ09ORklHX1NNUAogCVtDUFVIUF9DUkVBVEVfVEhSRUFEU109IHsKLQkJLm5hbWUJCQk9ICJ0aHJlYWRzOmNyZWF0ZSIsCi0JCS5zdGFydHVwCQk9IHNtcGJvb3RfY3JlYXRlX3RocmVhZHMsCi0JCS50ZWFyZG93bgkJPSBOVUxMLAorCQkubmFtZQkJCT0gInRocmVhZHM6cHJlcGFyZSIsCisJCS5zdGFydHVwLnNpbmdsZQkJPSBzbXBib290X2NyZWF0ZV90aHJlYWRzLAorCQkudGVhcmRvd24uc2luZ2xlCT0gTlVMTCwKIAkJLmNhbnRfc3RvcAkJPSB0cnVlLAogCX0sCiAJW0NQVUhQX1BFUkZfUFJFUEFSRV0gPSB7Ci0JCS5uYW1lID0gInBlcmYgcHJlcGFyZSIsCi0JCS5zdGFydHVwID0gcGVyZl9ldmVudF9pbml0X2NwdSwKLQkJLnRlYXJkb3duID0gcGVyZl9ldmVudF9leGl0X2NwdSwKKwkJLm5hbWUJCQk9ICJwZXJmOnByZXBhcmUiLAorCQkuc3RhcnR1cC5zaW5nbGUJCT0gcGVyZl9ldmVudF9pbml0X2NwdSwKKwkJLnRlYXJkb3duLnNpbmdsZQk9IHBlcmZfZXZlbnRfZXhpdF9jcHUsCiAJfSwKIAlbQ1BVSFBfV09SS1FVRVVFX1BSRVBdID0gewotCQkubmFtZSA9ICJ3b3JrcXVldWUgcHJlcGFyZSIsCi0JCS5zdGFydHVwID0gd29ya3F1ZXVlX3ByZXBhcmVfY3B1LAotCQkudGVhcmRvd24gPSBOVUxMLAorCQkubmFtZQkJCT0gIndvcmtxdWV1ZTpwcmVwYXJlIiwKKwkJLnN0YXJ0dXAuc2luZ2xlCQk9IHdvcmtxdWV1ZV9wcmVwYXJlX2NwdSwKKwkJLnRlYXJkb3duLnNpbmdsZQk9IE5VTEwsCiAJfSwKIAlbQ1BVSFBfSFJUSU1FUlNfUFJFUEFSRV0gPSB7Ci0JCS5uYW1lID0gImhydGltZXJzIHByZXBhcmUiLAotCQkuc3RhcnR1cCA9IGhydGltZXJzX3ByZXBhcmVfY3B1LAotCQkudGVhcmRvd24gPSBocnRpbWVyc19kZWFkX2NwdSwKKwkJLm5hbWUJCQk9ICJocnRpbWVyczpwcmVwYXJlIiwKKwkJLnN0YXJ0dXAuc2luZ2xlCQk9IGhydGltZXJzX3ByZXBhcmVfY3B1LAorCQkudGVhcmRvd24uc2luZ2xlCT0gaHJ0aW1lcnNfZGVhZF9jcHUsCiAJfSwKIAlbQ1BVSFBfU01QQ0ZEX1BSRVBBUkVdID0gewotCQkubmFtZSA9ICJTTVBDRkQgcHJlcGFyZSIsCi0JCS5zdGFydHVwID0gc21wY2ZkX3ByZXBhcmVfY3B1LAotCQkudGVhcmRvd24gPSBzbXBjZmRfZGVhZF9jcHUsCisJCS5uYW1lCQkJPSAic21wY2ZkOnByZXBhcmUiLAorCQkuc3RhcnR1cC5zaW5nbGUJCT0gc21wY2ZkX3ByZXBhcmVfY3B1LAorCQkudGVhcmRvd24uc2luZ2xlCT0gc21wY2ZkX2RlYWRfY3B1LAorCX0sCisJW0NQVUhQX1JFTEFZX1BSRVBBUkVdID0geworCQkubmFtZQkJCT0gInJlbGF5OnByZXBhcmUiLAorCQkuc3RhcnR1cC5zaW5nbGUJCT0gcmVsYXlfcHJlcGFyZV9jcHUsCisJCS50ZWFyZG93bi5zaW5nbGUJPSBOVUxMLAorCX0sCisJW0NQVUhQX1NMQUJfUFJFUEFSRV0gPSB7CisJCS5uYW1lCQkJPSAic2xhYjpwcmVwYXJlIiwKKwkJLnN0YXJ0dXAuc2luZ2xlCQk9IHNsYWJfcHJlcGFyZV9jcHUsCisJCS50ZWFyZG93bi5zaW5nbGUJPSBzbGFiX2RlYWRfY3B1LAogCX0sCiAJW0NQVUhQX1JDVVRSRUVfUFJFUF0gPSB7Ci0JCS5uYW1lID0gIlJDVS10cmVlIHByZXBhcmUiLAotCQkuc3RhcnR1cCA9IHJjdXRyZWVfcHJlcGFyZV9jcHUsCi0JCS50ZWFyZG93biA9IHJjdXRyZWVfZGVhZF9jcHUsCisJCS5uYW1lCQkJPSAiUkNVL3RyZWU6cHJlcGFyZSIsCisJCS5zdGFydHVwLnNpbmdsZQkJPSByY3V0cmVlX3ByZXBhcmVfY3B1LAorCQkudGVhcmRvd24uc2luZ2xlCT0gcmN1dHJlZV9kZWFkX2NwdSwKIAl9LAogCS8qCiAJICogUHJlcGFyYXRvcnkgYW5kIGRlYWQgbm90aWZpZXJzLiBXaWxsIGJlIHJlcGxhY2VkIG9uY2UgdGhlIG5vdGlmaWVycwpAQCAtMTIxMSw4ICsxMjk3LDggQEAKIAkgKi8KIAlbQ1BVSFBfTk9USUZZX1BSRVBBUkVdID0gewogCQkubmFtZQkJCT0gIm5vdGlmeTpwcmVwYXJlIiwKLQkJLnN0YXJ0dXAJCT0gbm90aWZ5X3ByZXBhcmUsCi0JCS50ZWFyZG93bgkJPSBub3RpZnlfZGVhZCwKKwkJLnN0YXJ0dXAuc2luZ2xlCQk9IG5vdGlmeV9wcmVwYXJlLAorCQkudGVhcmRvd24uc2luZ2xlCT0gbm90aWZ5X2RlYWQsCiAJCS5za2lwX29uZXJyCQk9IHRydWUsCiAJCS5jYW50X3N0b3AJCT0gdHJ1ZSwKIAl9LApAQCAtMTIyMiwyMCArMTMwOCwyMSBAQAogCSAqIG90aGVyd2lzZSBhIFJDVSBzdGFsbCBvY2N1cnMuCiAJICovCiAJW0NQVUhQX1RJTUVSU19ERUFEXSA9IHsKLQkJLm5hbWUgPSAidGltZXJzIGRlYWQiLAotCQkuc3RhcnR1cCA9IE5VTEwsCi0JCS50ZWFyZG93biA9IHRpbWVyc19kZWFkX2NwdSwKKwkJLm5hbWUJCQk9ICJ0aW1lcnM6ZGVhZCIsCisJCS5zdGFydHVwLnNpbmdsZQkJPSBOVUxMLAorCQkudGVhcmRvd24uc2luZ2xlCT0gdGltZXJzX2RlYWRfY3B1LAogCX0sCiAJLyogS2lja3MgdGhlIHBsdWdnZWQgY3B1IGludG8gbGlmZSAqLwogCVtDUFVIUF9CUklOR1VQX0NQVV0gPSB7CiAJCS5uYW1lCQkJPSAiY3B1OmJyaW5ndXAiLAotCQkuc3RhcnR1cAkJPSBicmluZ3VwX2NwdSwKLQkJLnRlYXJkb3duCQk9IE5VTEwsCisJCS5zdGFydHVwLnNpbmdsZQkJPSBicmluZ3VwX2NwdSwKKwkJLnRlYXJkb3duLnNpbmdsZQk9IE5VTEwsCiAJCS5jYW50X3N0b3AJCT0gdHJ1ZSwKIAl9LAogCVtDUFVIUF9BUF9TTVBDRkRfRFlJTkddID0gewotCQkuc3RhcnR1cCA9IE5VTEwsCi0JCS50ZWFyZG93biA9IHNtcGNmZF9keWluZ19jcHUsCisJCS5uYW1lCQkJPSAic21wY2ZkOmR5aW5nIiwKKwkJLnN0YXJ0dXAuc2luZ2xlCQk9IE5VTEwsCisJCS50ZWFyZG93bi5zaW5nbGUJPSBzbXBjZmRfZHlpbmdfY3B1LAogCX0sCiAJLyoKIAkgKiBIYW5kbGVkIG9uIGNvbnRyb2xsIHByb2Nlc3NvciB1bnRpbCB0aGUgcGx1Z2dlZCBwcm9jZXNzb3IgbWFuYWdlcwpAQCAtMTI0Myw4ICsxMzMwLDggQEAKIAkgKi8KIAlbQ1BVSFBfVEVBUkRPV05fQ1BVXSA9IHsKIAkJLm5hbWUJCQk9ICJjcHU6dGVhcmRvd24iLAotCQkuc3RhcnR1cAkJPSBOVUxMLAotCQkudGVhcmRvd24JCT0gdGFrZWRvd25fY3B1LAorCQkuc3RhcnR1cC5zaW5nbGUJCT0gTlVMTCwKKwkJLnRlYXJkb3duLnNpbmdsZQk9IHRha2Vkb3duX2NwdSwKIAkJLmNhbnRfc3RvcAkJPSB0cnVlLAogCX0sCiAjZWxzZQpAQCAtMTI3MCwyNCArMTM1NywxMyBAQAogCS8qIEZpcnN0IHN0YXRlIGlzIHNjaGVkdWxlciBjb250cm9sLiBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCAqLwogCVtDUFVIUF9BUF9TQ0hFRF9TVEFSVElOR10gPSB7CiAJCS5uYW1lCQkJPSAic2NoZWQ6c3RhcnRpbmciLAotCQkuc3RhcnR1cAkJPSBzY2hlZF9jcHVfc3RhcnRpbmcsCi0JCS50ZWFyZG93bgkJPSBzY2hlZF9jcHVfZHlpbmcsCisJCS5zdGFydHVwLnNpbmdsZQkJPSBzY2hlZF9jcHVfc3RhcnRpbmcsCisJCS50ZWFyZG93bi5zaW5nbGUJPSBzY2hlZF9jcHVfZHlpbmcsCiAJfSwKIAlbQ1BVSFBfQVBfUkNVVFJFRV9EWUlOR10gPSB7Ci0JCS5zdGFydHVwID0gTlVMTCwKLQkJLnRlYXJkb3duID0gcmN1dHJlZV9keWluZ19jcHUsCi0JfSwKLQkvKgotCSAqIExvdyBsZXZlbCBzdGFydHVwL3RlYXJkb3duIG5vdGlmaWVycy4gUnVuIHdpdGggaW50ZXJydXB0cwotCSAqIGRpc2FibGVkLiBXaWxsIGJlIHJlbW92ZWQgb25jZSB0aGUgbm90aWZpZXJzIGFyZSBjb252ZXJ0ZWQgdG8KLQkgKiBzdGF0ZXMuCi0JICovCi0JW0NQVUhQX0FQX05PVElGWV9TVEFSVElOR10gPSB7Ci0JCS5uYW1lCQkJPSAibm90aWZ5OnN0YXJ0aW5nIiwKLQkJLnN0YXJ0dXAJCT0gbm90aWZ5X3N0YXJ0aW5nLAotCQkudGVhcmRvd24JCT0gbm90aWZ5X2R5aW5nLAotCQkuc2tpcF9vbmVycgkJPSB0cnVlLAotCQkuY2FudF9zdG9wCQk9IHRydWUsCisJCS5uYW1lCQkJPSAiUkNVL3RyZWU6ZHlpbmciLAorCQkuc3RhcnR1cC5zaW5nbGUJCT0gTlVMTCwKKwkJLnRlYXJkb3duLnNpbmdsZQk9IHJjdXRyZWVfZHlpbmdfY3B1LAogCX0sCiAJLyogRW50cnkgc3RhdGUgb24gc3RhcnRpbmcuIEludGVycnVwdHMgZW5hYmxlZCBmcm9tIGhlcmUgb24uIFRyYW5zaWVudAogCSAqIHN0YXRlIGZvciBzeW5jaHJvbnNpemF0aW9uICovCkBAIC0xMjk2LDI0ICsxMzcyLDI0IEBACiAJfSwKIAkvKiBIYW5kbGUgc21wYm9vdCB0aHJlYWRzIHBhcmsvdW5wYXJrICovCiAJW0NQVUhQX0FQX1NNUEJPT1RfVEhSRUFEU10gPSB7Ci0JCS5uYW1lCQkJPSAic21wYm9vdDp0aHJlYWRzIiwKLQkJLnN0YXJ0dXAJCT0gc21wYm9vdF91bnBhcmtfdGhyZWFkcywKLQkJLnRlYXJkb3duCQk9IE5VTEwsCisJCS5uYW1lCQkJPSAic21wYm9vdC90aHJlYWRzOm9ubGluZSIsCisJCS5zdGFydHVwLnNpbmdsZQkJPSBzbXBib290X3VucGFya190aHJlYWRzLAorCQkudGVhcmRvd24uc2luZ2xlCT0gTlVMTCwKIAl9LAogCVtDUFVIUF9BUF9QRVJGX09OTElORV0gPSB7Ci0JCS5uYW1lID0gInBlcmYgb25saW5lIiwKLQkJLnN0YXJ0dXAgPSBwZXJmX2V2ZW50X2luaXRfY3B1LAotCQkudGVhcmRvd24gPSBwZXJmX2V2ZW50X2V4aXRfY3B1LAorCQkubmFtZQkJCT0gInBlcmY6b25saW5lIiwKKwkJLnN0YXJ0dXAuc2luZ2xlCQk9IHBlcmZfZXZlbnRfaW5pdF9jcHUsCisJCS50ZWFyZG93bi5zaW5nbGUJPSBwZXJmX2V2ZW50X2V4aXRfY3B1LAogCX0sCiAJW0NQVUhQX0FQX1dPUktRVUVVRV9PTkxJTkVdID0gewotCQkubmFtZSA9ICJ3b3JrcXVldWUgb25saW5lIiwKLQkJLnN0YXJ0dXAgPSB3b3JrcXVldWVfb25saW5lX2NwdSwKLQkJLnRlYXJkb3duID0gd29ya3F1ZXVlX29mZmxpbmVfY3B1LAorCQkubmFtZQkJCT0gIndvcmtxdWV1ZTpvbmxpbmUiLAorCQkuc3RhcnR1cC5zaW5nbGUJCT0gd29ya3F1ZXVlX29ubGluZV9jcHUsCisJCS50ZWFyZG93bi5zaW5nbGUJPSB3b3JrcXVldWVfb2ZmbGluZV9jcHUsCiAJfSwKIAlbQ1BVSFBfQVBfUkNVVFJFRV9PTkxJTkVdID0gewotCQkubmFtZSA9ICJSQ1UtdHJlZSBvbmxpbmUiLAotCQkuc3RhcnR1cCA9IHJjdXRyZWVfb25saW5lX2NwdSwKLQkJLnRlYXJkb3duID0gcmN1dHJlZV9vZmZsaW5lX2NwdSwKKwkJLm5hbWUJCQk9ICJSQ1UvdHJlZTpvbmxpbmUiLAorCQkuc3RhcnR1cC5zaW5nbGUJCT0gcmN1dHJlZV9vbmxpbmVfY3B1LAorCQkudGVhcmRvd24uc2luZ2xlCT0gcmN1dHJlZV9vZmZsaW5lX2NwdSwKIAl9LAogCiAJLyoKQEAgLTEzMjIsOCArMTM5OCw4IEBACiAJICovCiAJW0NQVUhQX0FQX05PVElGWV9PTkxJTkVdID0gewogCQkubmFtZQkJCT0gIm5vdGlmeTpvbmxpbmUiLAotCQkuc3RhcnR1cAkJPSBub3RpZnlfb25saW5lLAotCQkudGVhcmRvd24JCT0gbm90aWZ5X2Rvd25fcHJlcGFyZSwKKwkJLnN0YXJ0dXAuc2luZ2xlCQk9IG5vdGlmeV9vbmxpbmUsCisJCS50ZWFyZG93bi5zaW5nbGUJPSBub3RpZnlfZG93bl9wcmVwYXJlLAogCQkuc2tpcF9vbmVycgkJPSB0cnVlLAogCX0sCiAjZW5kaWYKQEAgLTEzMzUsMTYgKzE0MTEsMTYgQEAKIAkvKiBMYXN0IHN0YXRlIGlzIHNjaGVkdWxlciBjb250cm9sIHNldHRpbmcgdGhlIGNwdSBhY3RpdmUgKi8KIAlbQ1BVSFBfQVBfQUNUSVZFXSA9IHsKIAkJLm5hbWUJCQk9ICJzY2hlZDphY3RpdmUiLAotCQkuc3RhcnR1cAkJPSBzY2hlZF9jcHVfYWN0aXZhdGUsCi0JCS50ZWFyZG93bgkJPSBzY2hlZF9jcHVfZGVhY3RpdmF0ZSwKKwkJLnN0YXJ0dXAuc2luZ2xlCQk9IHNjaGVkX2NwdV9hY3RpdmF0ZSwKKwkJLnRlYXJkb3duLnNpbmdsZQk9IHNjaGVkX2NwdV9kZWFjdGl2YXRlLAogCX0sCiAjZW5kaWYKIAogCS8qIENQVSBpcyBmdWxseSB1cCBhbmQgcnVubmluZy4gKi8KIAlbQ1BVSFBfT05MSU5FXSA9IHsKIAkJLm5hbWUJCQk9ICJvbmxpbmUiLAotCQkuc3RhcnR1cAkJPSBOVUxMLAotCQkudGVhcmRvd24JCT0gTlVMTCwKKwkJLnN0YXJ0dXAuc2luZ2xlCQk9IE5VTEwsCisJCS50ZWFyZG93bi5zaW5nbGUJPSBOVUxMLAogCX0sCiB9OwogCkBAIC0xMzU2LDU0ICsxNDMyLDQyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBib29sIGNwdWhwX2lzX2FwX3N0YXRlKGVudW0gY3B1aHBfc3RhdGUgc3RhdGUpCi17Ci0JLyoKLQkgKiBUaGUgZXh0cmEgY2hlY2sgZm9yIENQVUhQX1RFQVJET1dOX0NQVSBpcyBvbmx5IGZvciBkb2N1bWVudGF0aW9uCi0JICogcHVycG9zZXMgYXMgdGhhdCBzdGF0ZSBpcyBoYW5kbGVkIGV4cGxpY2l0ZWx5IGluIGNwdV9kb3duLgotCSAqLwotCXJldHVybiBzdGF0ZSA+IENQVUhQX0JSSU5HVVBfQ1BVICYmIHN0YXRlICE9IENQVUhQX1RFQVJET1dOX0NQVTsKLX0KLQotc3RhdGljIHN0cnVjdCBjcHVocF9zdGVwICpjcHVocF9nZXRfc3RlcChlbnVtIGNwdWhwX3N0YXRlIHN0YXRlKQotewotCXN0cnVjdCBjcHVocF9zdGVwICpzcDsKLQotCXNwID0gY3B1aHBfaXNfYXBfc3RhdGUoc3RhdGUpID8gY3B1aHBfYXBfc3RhdGVzIDogY3B1aHBfYnBfc3RhdGVzOwotCXJldHVybiBzcCArIHN0YXRlOwotfQotCiBzdGF0aWMgdm9pZCBjcHVocF9zdG9yZV9jYWxsYmFja3MoZW51bSBjcHVocF9zdGF0ZSBzdGF0ZSwKIAkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJICBpbnQgKCpzdGFydHVwKSh1bnNpZ25lZCBpbnQgY3B1KSwKLQkJCQkgIGludCAoKnRlYXJkb3duKSh1bnNpZ25lZCBpbnQgY3B1KSkKKwkJCQkgIGludCAoKnRlYXJkb3duKSh1bnNpZ25lZCBpbnQgY3B1KSwKKwkJCQkgIGJvb2wgbXVsdGlfaW5zdGFuY2UpCiB7CiAJLyogKFVuKUluc3RhbGwgdGhlIGNhbGxiYWNrcyBmb3IgZnVydGhlciBjcHUgaG90cGx1ZyBvcGVyYXRpb25zICovCiAJc3RydWN0IGNwdWhwX3N0ZXAgKnNwOwogCiAJbXV0ZXhfbG9jaygmY3B1aHBfc3RhdGVfbXV0ZXgpOwogCXNwID0gY3B1aHBfZ2V0X3N0ZXAoc3RhdGUpOwotCXNwLT5zdGFydHVwID0gc3RhcnR1cDsKLQlzcC0+dGVhcmRvd24gPSB0ZWFyZG93bjsKKwlzcC0+c3RhcnR1cC5zaW5nbGUgPSBzdGFydHVwOworCXNwLT50ZWFyZG93bi5zaW5nbGUgPSB0ZWFyZG93bjsKIAlzcC0+bmFtZSA9IG5hbWU7CisJc3AtPm11bHRpX2luc3RhbmNlID0gbXVsdGlfaW5zdGFuY2U7CisJSU5JVF9ITElTVF9IRUFEKCZzcC0+bGlzdCk7CiAJbXV0ZXhfdW5sb2NrKCZjcHVocF9zdGF0ZV9tdXRleCk7CiB9CiAKIHN0YXRpYyB2b2lkICpjcHVocF9nZXRfdGVhcmRvd25fY2IoZW51bSBjcHVocF9zdGF0ZSBzdGF0ZSkKIHsKLQlyZXR1cm4gY3B1aHBfZ2V0X3N0ZXAoc3RhdGUpLT50ZWFyZG93bjsKKwlyZXR1cm4gY3B1aHBfZ2V0X3N0ZXAoc3RhdGUpLT50ZWFyZG93bi5zaW5nbGU7CiB9CiAKIC8qCiAgKiBDYWxsIHRoZSBzdGFydHVwL3RlYXJkb3duIGZ1bmN0aW9uIGZvciBhIHN0ZXAgZWl0aGVyIG9uIHRoZSBBUCBvcgogICogb24gdGhlIGN1cnJlbnQgQ1BVLgogICovCi1zdGF0aWMgaW50IGNwdWhwX2lzc3VlX2NhbGwoaW50IGNwdSwgZW51bSBjcHVocF9zdGF0ZSBzdGF0ZSwKLQkJCSAgICBpbnQgKCpjYikodW5zaWduZWQgaW50KSwgYm9vbCBicmluZ3VwKQorc3RhdGljIGludCBjcHVocF9pc3N1ZV9jYWxsKGludCBjcHUsIGVudW0gY3B1aHBfc3RhdGUgc3RhdGUsIGJvb2wgYnJpbmd1cCwKKwkJCSAgICBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSkKIHsKKwlzdHJ1Y3QgY3B1aHBfc3RlcCAqc3AgPSBjcHVocF9nZXRfc3RlcChzdGF0ZSk7CiAJaW50IHJldDsKIAotCWlmICghY2IpCisJaWYgKChicmluZ3VwICYmICFzcC0+c3RhcnR1cC5zaW5nbGUpIHx8CisJICAgICghYnJpbmd1cCAmJiAhc3AtPnRlYXJkb3duLnNpbmdsZSkpCiAJCXJldHVybiAwOwogCS8qCiAJICogVGhlIG5vbiBBUCBib3VuZCBjYWxsYmFja3MgY2FuIGZhaWwgb24gYnJpbmd1cC4gT24gdGVhcmRvd24KQEAgLTE0MTEsMTEgKzE0NzUsMTEgQEAKIAkgKi8KICNpZmRlZiBDT05GSUdfU01QCiAJaWYgKGNwdWhwX2lzX2FwX3N0YXRlKHN0YXRlKSkKLQkJcmV0ID0gY3B1aHBfaW52b2tlX2FwX2NhbGxiYWNrKGNwdSwgc3RhdGUsIGNiKTsKKwkJcmV0ID0gY3B1aHBfaW52b2tlX2FwX2NhbGxiYWNrKGNwdSwgc3RhdGUsIGJyaW5ndXAsIG5vZGUpOwogCWVsc2UKLQkJcmV0ID0gY3B1aHBfaW52b2tlX2NhbGxiYWNrKGNwdSwgc3RhdGUsIGNiKTsKKwkJcmV0ID0gY3B1aHBfaW52b2tlX2NhbGxiYWNrKGNwdSwgc3RhdGUsIGJyaW5ndXAsIG5vZGUpOwogI2Vsc2UKLQlyZXQgPSBjcHVocF9pbnZva2VfY2FsbGJhY2soY3B1LCBzdGF0ZSwgY2IpOworCXJldCA9IGNwdWhwX2ludm9rZV9jYWxsYmFjayhjcHUsIHN0YXRlLCBicmluZ3VwLCBub2RlKTsKICNlbmRpZgogCUJVR19PTihyZXQgJiYgIWJyaW5ndXApOwogCXJldHVybiByZXQ7CkBAIC0xNDI3LDEzICsxNDkxLDEwIEBACiAgKiBOb3RlOiBUaGUgdGVhcmRvd24gY2FsbGJhY2tzIGZvciByb2xsYmFjayBhcmUgbm90IGFsbG93ZWQgdG8gZmFpbCEKICAqLwogc3RhdGljIHZvaWQgY3B1aHBfcm9sbGJhY2tfaW5zdGFsbChpbnQgZmFpbGVkY3B1LCBlbnVtIGNwdWhwX3N0YXRlIHN0YXRlLAotCQkJCSAgIGludCAoKnRlYXJkb3duKSh1bnNpZ25lZCBpbnQgY3B1KSkKKwkJCQkgICBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSkKIHsKIAlpbnQgY3B1OwogCi0JaWYgKCF0ZWFyZG93bikKLQkJcmV0dXJuOwotCiAJLyogUm9sbCBiYWNrIHRoZSBhbHJlYWR5IGV4ZWN1dGVkIHN0ZXBzIG9uIHRoZSBvdGhlciBjcHVzICovCiAJZm9yX2VhY2hfcHJlc2VudF9jcHUoY3B1KSB7CiAJCXN0cnVjdCBjcHVocF9jcHVfc3RhdGUgKnN0ID0gcGVyX2NwdV9wdHIoJmNwdWhwX3N0YXRlLCBjcHUpOwpAQCAtMTQ0NCw3ICsxNTA1LDcgQEAKIAogCQkvKiBEaWQgd2UgaW52b2tlIHRoZSBzdGFydHVwIGNhbGwgb24gdGhhdCBjcHUgPyAqLwogCQlpZiAoY3B1c3RhdGUgPj0gc3RhdGUpCi0JCQljcHVocF9pc3N1ZV9jYWxsKGNwdSwgc3RhdGUsIHRlYXJkb3duLCBmYWxzZSk7CisJCQljcHVocF9pc3N1ZV9jYWxsKGNwdSwgc3RhdGUsIGZhbHNlLCBub2RlKTsKIAl9CiB9CiAKQEAgLTE0NzEsNiArMTUzMiw1MiBAQAogCXJldHVybiAtRU5PU1BDOwogfQogCitpbnQgX19jcHVocF9zdGF0ZV9hZGRfaW5zdGFuY2UoZW51bSBjcHVocF9zdGF0ZSBzdGF0ZSwgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsCisJCQkgICAgICAgYm9vbCBpbnZva2UpCit7CisJc3RydWN0IGNwdWhwX3N0ZXAgKnNwOworCWludCBjcHU7CisJaW50IHJldDsKKworCXNwID0gY3B1aHBfZ2V0X3N0ZXAoc3RhdGUpOworCWlmIChzcC0+bXVsdGlfaW5zdGFuY2UgPT0gZmFsc2UpCisJCXJldHVybiAtRUlOVkFMOworCisJZ2V0X29ubGluZV9jcHVzKCk7CisKKwlpZiAoIWludm9rZSB8fCAhc3AtPnN0YXJ0dXAubXVsdGkpCisJCWdvdG8gYWRkX25vZGU7CisKKwkvKgorCSAqIFRyeSB0byBjYWxsIHRoZSBzdGFydHVwIGNhbGxiYWNrIGZvciBlYWNoIHByZXNlbnQgY3B1CisJICogZGVwZW5kaW5nIG9uIHRoZSBob3RwbHVnIHN0YXRlIG9mIHRoZSBjcHUuCisJICovCisJZm9yX2VhY2hfcHJlc2VudF9jcHUoY3B1KSB7CisJCXN0cnVjdCBjcHVocF9jcHVfc3RhdGUgKnN0ID0gcGVyX2NwdV9wdHIoJmNwdWhwX3N0YXRlLCBjcHUpOworCQlpbnQgY3B1c3RhdGUgPSBzdC0+c3RhdGU7CisKKwkJaWYgKGNwdXN0YXRlIDwgc3RhdGUpCisJCQljb250aW51ZTsKKworCQlyZXQgPSBjcHVocF9pc3N1ZV9jYWxsKGNwdSwgc3RhdGUsIHRydWUsIG5vZGUpOworCQlpZiAocmV0KSB7CisJCQlpZiAoc3AtPnRlYXJkb3duLm11bHRpKQorCQkJCWNwdWhwX3JvbGxiYWNrX2luc3RhbGwoY3B1LCBzdGF0ZSwgbm9kZSk7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KK2FkZF9ub2RlOgorCXJldCA9IDA7CisJbXV0ZXhfbG9jaygmY3B1aHBfc3RhdGVfbXV0ZXgpOworCWhsaXN0X2FkZF9oZWFkKG5vZGUsICZzcC0+bGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZjcHVocF9zdGF0ZV9tdXRleCk7CisKK2VycjoKKwlwdXRfb25saW5lX2NwdXMoKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoX19jcHVocF9zdGF0ZV9hZGRfaW5zdGFuY2UpOworCiAvKioKICAqIF9fY3B1aHBfc2V0dXBfc3RhdGUgLSBTZXR1cCB0aGUgY2FsbGJhY2tzIGZvciBhbiBob3RwbHVnIG1hY2hpbmUgc3RhdGUKICAqIEBzdGF0ZToJVGhlIHN0YXRlIHRvIHNldHVwCkBAIC0xNDg0LDcgKzE1OTEsOCBAQAogaW50IF9fY3B1aHBfc2V0dXBfc3RhdGUoZW51bSBjcHVocF9zdGF0ZSBzdGF0ZSwKIAkJCWNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgaW52b2tlLAogCQkJaW50ICgqc3RhcnR1cCkodW5zaWduZWQgaW50IGNwdSksCi0JCQlpbnQgKCp0ZWFyZG93bikodW5zaWduZWQgaW50IGNwdSkpCisJCQlpbnQgKCp0ZWFyZG93bikodW5zaWduZWQgaW50IGNwdSksCisJCQlib29sIG11bHRpX2luc3RhbmNlKQogewogCWludCBjcHUsIHJldCA9IDA7CiAJaW50IGR5bl9zdGF0ZSA9IDA7CkBAIC0xNTAzLDcgKzE2MTEsNyBAQAogCQlzdGF0ZSA9IHJldDsKIAl9CiAKLQljcHVocF9zdG9yZV9jYWxsYmFja3Moc3RhdGUsIG5hbWUsIHN0YXJ0dXAsIHRlYXJkb3duKTsKKwljcHVocF9zdG9yZV9jYWxsYmFja3Moc3RhdGUsIG5hbWUsIHN0YXJ0dXAsIHRlYXJkb3duLCBtdWx0aV9pbnN0YW5jZSk7CiAKIAlpZiAoIWludm9rZSB8fCAhc3RhcnR1cCkKIAkJZ290byBvdXQ7CkBAIC0xNTE5LDEwICsxNjI3LDExIEBACiAJCWlmIChjcHVzdGF0ZSA8IHN0YXRlKQogCQkJY29udGludWU7CiAKLQkJcmV0ID0gY3B1aHBfaXNzdWVfY2FsbChjcHUsIHN0YXRlLCBzdGFydHVwLCB0cnVlKTsKKwkJcmV0ID0gY3B1aHBfaXNzdWVfY2FsbChjcHUsIHN0YXRlLCB0cnVlLCBOVUxMKTsKIAkJaWYgKHJldCkgewotCQkJY3B1aHBfcm9sbGJhY2tfaW5zdGFsbChjcHUsIHN0YXRlLCB0ZWFyZG93bik7Ci0JCQljcHVocF9zdG9yZV9jYWxsYmFja3Moc3RhdGUsIE5VTEwsIE5VTEwsIE5VTEwpOworCQkJaWYgKHRlYXJkb3duKQorCQkJCWNwdWhwX3JvbGxiYWNrX2luc3RhbGwoY3B1LCBzdGF0ZSwgTlVMTCk7CisJCQljcHVocF9zdG9yZV9jYWxsYmFja3Moc3RhdGUsIE5VTEwsIE5VTEwsIE5VTEwsIGZhbHNlKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJfQpAQCAtMTUzNCw2ICsxNjQzLDQyIEBACiB9CiBFWFBPUlRfU1lNQk9MKF9fY3B1aHBfc2V0dXBfc3RhdGUpOwogCitpbnQgX19jcHVocF9zdGF0ZV9yZW1vdmVfaW5zdGFuY2UoZW51bSBjcHVocF9zdGF0ZSBzdGF0ZSwKKwkJCQkgIHN0cnVjdCBobGlzdF9ub2RlICpub2RlLCBib29sIGludm9rZSkKK3sKKwlzdHJ1Y3QgY3B1aHBfc3RlcCAqc3AgPSBjcHVocF9nZXRfc3RlcChzdGF0ZSk7CisJaW50IGNwdTsKKworCUJVR19PTihjcHVocF9jYl9jaGVjayhzdGF0ZSkpOworCisJaWYgKCFzcC0+bXVsdGlfaW5zdGFuY2UpCisJCXJldHVybiAtRUlOVkFMOworCisJZ2V0X29ubGluZV9jcHVzKCk7CisJaWYgKCFpbnZva2UgfHwgIWNwdWhwX2dldF90ZWFyZG93bl9jYihzdGF0ZSkpCisJCWdvdG8gcmVtb3ZlOworCS8qCisJICogQ2FsbCB0aGUgdGVhcmRvd24gY2FsbGJhY2sgZm9yIGVhY2ggcHJlc2VudCBjcHUgZGVwZW5kaW5nCisJICogb24gdGhlIGhvdHBsdWcgc3RhdGUgb2YgdGhlIGNwdS4gVGhpcyBmdW5jdGlvbiBpcyBub3QKKwkgKiBhbGxvd2VkIHRvIGZhaWwgY3VycmVudGx5IQorCSAqLworCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGNwdSkgeworCQlzdHJ1Y3QgY3B1aHBfY3B1X3N0YXRlICpzdCA9IHBlcl9jcHVfcHRyKCZjcHVocF9zdGF0ZSwgY3B1KTsKKwkJaW50IGNwdXN0YXRlID0gc3QtPnN0YXRlOworCisJCWlmIChjcHVzdGF0ZSA+PSBzdGF0ZSkKKwkJCWNwdWhwX2lzc3VlX2NhbGwoY3B1LCBzdGF0ZSwgZmFsc2UsIG5vZGUpOworCX0KKworcmVtb3ZlOgorCW11dGV4X2xvY2soJmNwdWhwX3N0YXRlX211dGV4KTsKKwlobGlzdF9kZWwobm9kZSk7CisJbXV0ZXhfdW5sb2NrKCZjcHVocF9zdGF0ZV9tdXRleCk7CisJcHV0X29ubGluZV9jcHVzKCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fY3B1aHBfc3RhdGVfcmVtb3ZlX2luc3RhbmNlKTsKIC8qKgogICogX19jcHVocF9yZW1vdmVfc3RhdGUgLSBSZW1vdmUgdGhlIGNhbGxiYWNrcyBmb3IgYW4gaG90cGx1ZyBtYWNoaW5lIHN0YXRlCiAgKiBAc3RhdGU6CVRoZSBzdGF0ZSB0byByZW1vdmUKQEAgLTE1NDUsMTQgKzE2OTAsMjEgQEAKICAqLwogdm9pZCBfX2NwdWhwX3JlbW92ZV9zdGF0ZShlbnVtIGNwdWhwX3N0YXRlIHN0YXRlLCBib29sIGludm9rZSkKIHsKLQlpbnQgKCp0ZWFyZG93bikodW5zaWduZWQgaW50IGNwdSkgPSBjcHVocF9nZXRfdGVhcmRvd25fY2Ioc3RhdGUpOworCXN0cnVjdCBjcHVocF9zdGVwICpzcCA9IGNwdWhwX2dldF9zdGVwKHN0YXRlKTsKIAlpbnQgY3B1OwogCiAJQlVHX09OKGNwdWhwX2NiX2NoZWNrKHN0YXRlKSk7CiAKIAlnZXRfb25saW5lX2NwdXMoKTsKIAotCWlmICghaW52b2tlIHx8ICF0ZWFyZG93bikKKwlpZiAoc3AtPm11bHRpX2luc3RhbmNlKSB7CisJCVdBUk4oIWhsaXN0X2VtcHR5KCZzcC0+bGlzdCksCisJCSAgICAgIkVycm9yOiBSZW1vdmluZyBzdGF0ZSAlZCB3aGljaCBoYXMgaW5zdGFuY2VzIGxlZnQuXG4iLAorCQkgICAgIHN0YXRlKTsKKwkJZ290byByZW1vdmU7CisJfQorCisJaWYgKCFpbnZva2UgfHwgIWNwdWhwX2dldF90ZWFyZG93bl9jYihzdGF0ZSkpCiAJCWdvdG8gcmVtb3ZlOwogCiAJLyoKQEAgLTE1NjUsMTAgKzE3MTcsMTAgQEAKIAkJaW50IGNwdXN0YXRlID0gc3QtPnN0YXRlOwogCiAJCWlmIChjcHVzdGF0ZSA+PSBzdGF0ZSkKLQkJCWNwdWhwX2lzc3VlX2NhbGwoY3B1LCBzdGF0ZSwgdGVhcmRvd24sIGZhbHNlKTsKKwkJCWNwdWhwX2lzc3VlX2NhbGwoY3B1LCBzdGF0ZSwgZmFsc2UsIE5VTEwpOwogCX0KIHJlbW92ZToKLQljcHVocF9zdG9yZV9jYWxsYmFja3Moc3RhdGUsIE5VTEwsIE5VTEwsIE5VTEwpOworCWNwdWhwX3N0b3JlX2NhbGxiYWNrcyhzdGF0ZSwgTlVMTCwgTlVMTCwgTlVMTCwgZmFsc2UpOwogCXB1dF9vbmxpbmVfY3B1cygpOwogfQogRVhQT1JUX1NZTUJPTChfX2NwdWhwX3JlbW92ZV9zdGF0ZSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvY3B1c2V0LmMgYi9rZXJuZWwvY3B1c2V0LmMKaW5kZXggYzdmZDI3Ny4uMmI0YzIwYSAxMDA2NDQKLS0tIGEva2VybmVsL2NwdXNldC5jCisrKyBiL2tlcm5lbC9jcHVzZXQuYwpAQCAtMzI1LDggKzMyNSw3IEBACiAvKgogICogUmV0dXJuIGluIHBtYXNrIHRoZSBwb3J0aW9uIG9mIGEgY3B1c2V0cydzIGNwdXNfYWxsb3dlZCB0aGF0CiAgKiBhcmUgb25saW5lLiAgSWYgbm9uZSBhcmUgb25saW5lLCB3YWxrIHVwIHRoZSBjcHVzZXQgaGllcmFyY2h5Ci0gKiB1bnRpbCB3ZSBmaW5kIG9uZSB0aGF0IGRvZXMgaGF2ZSBzb21lIG9ubGluZSBjcHVzLiAgVGhlIHRvcAotICogY3B1c2V0IGFsd2F5cyBoYXMgc29tZSBjcHVzIG9ubGluZS4KKyAqIHVudGlsIHdlIGZpbmQgb25lIHRoYXQgZG9lcyBoYXZlIHNvbWUgb25saW5lIGNwdXMuCiAgKgogICogT25lIHdheSBvciBhbm90aGVyLCB3ZSBndWFyYW50ZWUgdG8gcmV0dXJuIHNvbWUgbm9uLWVtcHR5IHN1YnNldAogICogb2YgY3B1X29ubGluZV9tYXNrLgpAQCAtMzM1LDggKzMzNCwyMCBAQAogICovCiBzdGF0aWMgdm9pZCBndWFyYW50ZWVfb25saW5lX2NwdXMoc3RydWN0IGNwdXNldCAqY3MsIHN0cnVjdCBjcHVtYXNrICpwbWFzaykKIHsKLQl3aGlsZSAoIWNwdW1hc2tfaW50ZXJzZWN0cyhjcy0+ZWZmZWN0aXZlX2NwdXMsIGNwdV9vbmxpbmVfbWFzaykpCisJd2hpbGUgKCFjcHVtYXNrX2ludGVyc2VjdHMoY3MtPmVmZmVjdGl2ZV9jcHVzLCBjcHVfb25saW5lX21hc2spKSB7CiAJCWNzID0gcGFyZW50X2NzKGNzKTsKKwkJaWYgKHVubGlrZWx5KCFjcykpIHsKKwkJCS8qCisJCQkgKiBUaGUgdG9wIGNwdXNldCBkb2Vzbid0IGhhdmUgYW55IG9ubGluZSBjcHUgYXMgYQorCQkJICogY29uc2VxdWVuY2Ugb2YgYSByYWNlIGJldHdlZW4gY3B1c2V0X2hvdHBsdWdfd29yaworCQkJICogYW5kIGNwdSBob3RwbHVnIG5vdGlmaWVyLiAgQnV0IHdlIGtub3cgdGhlIHRvcAorCQkJICogY3B1c2V0J3MgZWZmZWN0aXZlX2NwdXMgaXMgb24gaXRzIHdheSB0byB0byBiZQorCQkJICogaWRlbnRpY2FsIHRvIGNwdV9vbmxpbmVfbWFzay4KKwkJCSAqLworCQkJY3B1bWFza19jb3B5KHBtYXNrLCBjcHVfb25saW5lX21hc2spOworCQkJcmV0dXJuOworCQl9CisJfQogCWNwdW1hc2tfYW5kKHBtYXNrLCBjcy0+ZWZmZWN0aXZlX2NwdXMsIGNwdV9vbmxpbmVfbWFzayk7CiB9CiAKQEAgLTIwNjksNiArMjA4MCwyMCBAQAogCW11dGV4X3VubG9jaygmY3B1c2V0X211dGV4KTsKIH0KIAorLyoKKyAqIE1ha2Ugc3VyZSB0aGUgbmV3IHRhc2sgY29uZm9ybSB0byB0aGUgY3VycmVudCBzdGF0ZSBvZiBpdHMgcGFyZW50LAorICogd2hpY2ggY291bGQgaGF2ZSBiZWVuIGNoYW5nZWQgYnkgY3B1c2V0IGp1c3QgYWZ0ZXIgaXQgaW5oZXJpdHMgdGhlCisgKiBzdGF0ZSBmcm9tIHRoZSBwYXJlbnQgYW5kIGJlZm9yZSBpdCBzaXRzIG9uIHRoZSBjZ3JvdXAncyB0YXNrIGxpc3QuCisgKi8KK3N0YXRpYyB2b2lkIGNwdXNldF9mb3JrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlpZiAodGFza19jc3NfaXNfcm9vdCh0YXNrLCBjcHVzZXRfY2dycF9pZCkpCisJCXJldHVybjsKKworCXNldF9jcHVzX2FsbG93ZWRfcHRyKHRhc2ssICZjdXJyZW50LT5jcHVzX2FsbG93ZWQpOworCXRhc2stPm1lbXNfYWxsb3dlZCA9IGN1cnJlbnQtPm1lbXNfYWxsb3dlZDsKK30KKwogc3RydWN0IGNncm91cF9zdWJzeXMgY3B1c2V0X2NncnBfc3Vic3lzID0gewogCS5jc3NfYWxsb2MJPSBjcHVzZXRfY3NzX2FsbG9jLAogCS5jc3Nfb25saW5lCT0gY3B1c2V0X2Nzc19vbmxpbmUsCkBAIC0yMDc5LDYgKzIxMDQsNyBAQAogCS5hdHRhY2gJCT0gY3B1c2V0X2F0dGFjaCwKIAkucG9zdF9hdHRhY2gJPSBjcHVzZXRfcG9zdF9hdHRhY2gsCiAJLmJpbmQJCT0gY3B1c2V0X2JpbmQsCisJLmZvcmsJCT0gY3B1c2V0X2ZvcmssCiAJLmxlZ2FjeV9jZnR5cGVzCT0gZmlsZXMsCiAJLmVhcmx5X2luaXQJPSB0cnVlLAogfTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9ldmVudHMvY29yZS5jIGIva2VybmVsL2V2ZW50cy9jb3JlLmMKaW5kZXggMTkwM2I4Zi4uYzZlNDdlOSAxMDA2NDQKLS0tIGEva2VybmVsL2V2ZW50cy9jb3JlLmMKKysrIGIva2VybmVsL2V2ZW50cy9jb3JlLmMKQEAgLTI0MiwxOCArMjQyLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBldmVudF9mdW5jdGlvbl9sb2NhbChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGV2ZW50X2YgZnVuYywgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgZXZlbnRfZnVuY3Rpb25fc3RydWN0IGVmcyA9IHsKLQkJLmV2ZW50ID0gZXZlbnQsCi0JCS5mdW5jID0gZnVuYywKLQkJLmRhdGEgPSBkYXRhLAotCX07Ci0KLQlpbnQgcmV0ID0gZXZlbnRfZnVuY3Rpb24oJmVmcyk7Ci0JV0FSTl9PTl9PTkNFKHJldCk7Ci19Ci0KIHN0YXRpYyB2b2lkIGV2ZW50X2Z1bmN0aW9uX2NhbGwoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBldmVudF9mIGZ1bmMsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqY3R4ID0gZXZlbnQtPmN0eDsKQEAgLTMwMyw2ICsyOTEsNTQgQEAKIAlyYXdfc3Bpbl91bmxvY2tfaXJxKCZjdHgtPmxvY2spOwogfQogCisvKgorICogU2ltaWxhciB0byBldmVudF9mdW5jdGlvbl9jYWxsKCkgKyBldmVudF9mdW5jdGlvbigpLCBidXQgaGFyZCBhc3N1bWVzIElSUXMKKyAqIGFyZSBhbHJlYWR5IGRpc2FibGVkIGFuZCB3ZSdyZSBvbiB0aGUgcmlnaHQgQ1BVLgorICovCitzdGF0aWMgdm9pZCBldmVudF9mdW5jdGlvbl9sb2NhbChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGV2ZW50X2YgZnVuYywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHggPSBldmVudC0+Y3R4OworCXN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHggPSBfX2dldF9jcHVfY29udGV4dChjdHgpOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IFJFQURfT05DRShjdHgtPnRhc2spOworCXN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQgKnRhc2tfY3R4ID0gTlVMTDsKKworCVdBUk5fT05fT05DRSghaXJxc19kaXNhYmxlZCgpKTsKKworCWlmICh0YXNrKSB7CisJCWlmICh0YXNrID09IFRBU0tfVE9NQlNUT05FKQorCQkJcmV0dXJuOworCisJCXRhc2tfY3R4ID0gY3R4OworCX0KKworCXBlcmZfY3R4X2xvY2soY3B1Y3R4LCB0YXNrX2N0eCk7CisKKwl0YXNrID0gY3R4LT50YXNrOworCWlmICh0YXNrID09IFRBU0tfVE9NQlNUT05FKQorCQlnb3RvIHVubG9jazsKKworCWlmICh0YXNrKSB7CisJCS8qCisJCSAqIFdlIG11c3QgYmUgZWl0aGVyIGluYWN0aXZlIG9yIGFjdGl2ZSBhbmQgdGhlIHJpZ2h0IHRhc2ssCisJCSAqIG90aGVyd2lzZSB3ZSdyZSBzY3Jld2VkLCBzaW5jZSB3ZSBjYW5ub3QgSVBJIHRvIHNvbWV3aGVyZQorCQkgKiBlbHNlLgorCQkgKi8KKwkJaWYgKGN0eC0+aXNfYWN0aXZlKSB7CisJCQlpZiAoV0FSTl9PTl9PTkNFKHRhc2sgIT0gY3VycmVudCkpCisJCQkJZ290byB1bmxvY2s7CisKKwkJCWlmIChXQVJOX09OX09OQ0UoY3B1Y3R4LT50YXNrX2N0eCAhPSBjdHgpKQorCQkJCWdvdG8gdW5sb2NrOworCQl9CisJfSBlbHNlIHsKKwkJV0FSTl9PTl9PTkNFKCZjcHVjdHgtPmN0eCAhPSBjdHgpOworCX0KKworCWZ1bmMoZXZlbnQsIGNwdWN0eCwgY3R4LCBkYXRhKTsKK3VubG9jazoKKwlwZXJmX2N0eF91bmxvY2soY3B1Y3R4LCB0YXNrX2N0eCk7Cit9CisKICNkZWZpbmUgUEVSRl9GTEFHX0FMTCAoUEVSRl9GTEFHX0ZEX05PX0dST1VQIHxcCiAJCSAgICAgICBQRVJGX0ZMQUdfRkRfT1VUUFVUICB8XAogCQkgICAgICAgUEVSRl9GTEFHX1BJRF9DR1JPVVAgfFwKQEAgLTE0MzksOCArMTQ3NSw3IEBACiAJaWYgKGV2ZW50LT5ncm91cF9sZWFkZXIgPT0gZXZlbnQpIHsKIAkJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKIAotCQlpZiAoaXNfc29mdHdhcmVfZXZlbnQoZXZlbnQpKQotCQkJZXZlbnQtPmdyb3VwX2ZsYWdzIHw9IFBFUkZfR1JPVVBfU09GVFdBUkU7CisJCWV2ZW50LT5ncm91cF9jYXBzID0gZXZlbnQtPmV2ZW50X2NhcHM7CiAKIAkJbGlzdCA9IGN0eF9ncm91cF9saXN0KGV2ZW50LCBjdHgpOwogCQlsaXN0X2FkZF90YWlsKCZldmVudC0+Z3JvdXBfZW50cnksIGxpc3QpOwpAQCAtMTU5NCw5ICsxNjI5LDcgQEAKIAogCVdBUk5fT05fT05DRShncm91cF9sZWFkZXItPmN0eCAhPSBldmVudC0+Y3R4KTsKIAotCWlmIChncm91cF9sZWFkZXItPmdyb3VwX2ZsYWdzICYgUEVSRl9HUk9VUF9TT0ZUV0FSRSAmJgotCQkJIWlzX3NvZnR3YXJlX2V2ZW50KGV2ZW50KSkKLQkJZ3JvdXBfbGVhZGVyLT5ncm91cF9mbGFncyAmPSB+UEVSRl9HUk9VUF9TT0ZUV0FSRTsKKwlncm91cF9sZWFkZXItPmdyb3VwX2NhcHMgJj0gZXZlbnQtPmV2ZW50X2NhcHM7CiAKIAlsaXN0X2FkZF90YWlsKCZldmVudC0+Z3JvdXBfZW50cnksICZncm91cF9sZWFkZXItPnNpYmxpbmdfbGlzdCk7CiAJZ3JvdXBfbGVhZGVyLT5ucl9zaWJsaW5ncysrOwpAQCAtMTY4Nyw3ICsxNzIwLDcgQEAKIAkJc2libGluZy0+Z3JvdXBfbGVhZGVyID0gc2libGluZzsKIAogCQkvKiBJbmhlcml0IGdyb3VwIGZsYWdzIGZyb20gdGhlIHByZXZpb3VzIGxlYWRlciAqLwotCQlzaWJsaW5nLT5ncm91cF9mbGFncyA9IGV2ZW50LT5ncm91cF9mbGFnczsKKwkJc2libGluZy0+Z3JvdXBfY2FwcyA9IGV2ZW50LT5ncm91cF9jYXBzOwogCiAJCVdBUk5fT05fT05DRShzaWJsaW5nLT5jdHggIT0gZXZlbnQtPmN0eCk7CiAJfQpAQCAtMTc5Niw2ICsxODI5LDggQEAKIAlzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQ7CiAJaW50IHN0YXRlID0gZ3JvdXBfZXZlbnQtPnN0YXRlOwogCisJcGVyZl9wbXVfZGlzYWJsZShjdHgtPnBtdSk7CisKIAlldmVudF9zY2hlZF9vdXQoZ3JvdXBfZXZlbnQsIGNwdWN0eCwgY3R4KTsKIAogCS8qCkBAIC0xODA0LDYgKzE4MzksOCBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZXZlbnQsICZncm91cF9ldmVudC0+c2libGluZ19saXN0LCBncm91cF9lbnRyeSkKIAkJZXZlbnRfc2NoZWRfb3V0KGV2ZW50LCBjcHVjdHgsIGN0eCk7CiAKKwlwZXJmX3BtdV9lbmFibGUoY3R4LT5wbXUpOworCiAJaWYgKHN0YXRlID09IFBFUkZfRVZFTlRfU1RBVEVfQUNUSVZFICYmIGdyb3VwX2V2ZW50LT5hdHRyLmV4Y2x1c2l2ZSkKIAkJY3B1Y3R4LT5leGNsdXNpdmUgPSAwOwogfQpAQCAtMjEwOSw3ICsyMTQ2LDcgQEAKIAkvKgogCSAqIEdyb3VwcyBjb25zaXN0aW5nIGVudGlyZWx5IG9mIHNvZnR3YXJlIGV2ZW50cyBjYW4gYWx3YXlzIGdvIG9uLgogCSAqLwotCWlmIChldmVudC0+Z3JvdXBfZmxhZ3MgJiBQRVJGX0dST1VQX1NPRlRXQVJFKQorCWlmIChldmVudC0+Z3JvdXBfY2FwcyAmIFBFUkZfRVZfQ0FQX1NPRlRXQVJFKQogCQlyZXR1cm4gMTsKIAkvKgogCSAqIElmIGFuIGV4Y2x1c2l2ZSBncm91cCBpcyBhbHJlYWR5IG9uLCBubyBvdGhlciBoYXJkd2FyZQpAQCAtMjQ1NSwxNiArMjQ5MiwxNiBAQAogCSAqIHdoaWxlIHJlc3RhcnRpbmcuCiAJICovCiAJaWYgKHNkLT5yZXN0YXJ0KQotCQlldmVudC0+cG11LT5zdGFydChldmVudCwgUEVSRl9FRl9TVEFSVCk7CisJCWV2ZW50LT5wbXUtPnN0YXJ0KGV2ZW50LCAwKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHBlcmZfZXZlbnRfcmVzdGFydChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCitzdGF0aWMgaW50IHBlcmZfZXZlbnRfc3RvcChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCByZXN0YXJ0KQogewogCXN0cnVjdCBzdG9wX2V2ZW50X2RhdGEgc2QgPSB7CiAJCS5ldmVudAkJPSBldmVudCwKLQkJLnJlc3RhcnQJPSAxLAorCQkucmVzdGFydAk9IHJlc3RhcnQsCiAJfTsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMjgwMSwxOSArMjgzOCwzNiBAQAogCX0KIH0KIAorc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBsaXN0X2hlYWQsIHNjaGVkX2NiX2xpc3QpOworCiB2b2lkIHBlcmZfc2NoZWRfY2JfZGVjKHN0cnVjdCBwbXUgKnBtdSkKIHsKKwlzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4ID0gdGhpc19jcHVfcHRyKHBtdS0+cG11X2NwdV9jb250ZXh0KTsKKwogCXRoaXNfY3B1X2RlYyhwZXJmX3NjaGVkX2NiX3VzYWdlcyk7CisKKwlpZiAoIS0tY3B1Y3R4LT5zY2hlZF9jYl91c2FnZSkKKwkJbGlzdF9kZWwoJmNwdWN0eC0+c2NoZWRfY2JfZW50cnkpOwogfQogCisKIHZvaWQgcGVyZl9zY2hlZF9jYl9pbmMoc3RydWN0IHBtdSAqcG11KQogeworCXN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHggPSB0aGlzX2NwdV9wdHIocG11LT5wbXVfY3B1X2NvbnRleHQpOworCisJaWYgKCFjcHVjdHgtPnNjaGVkX2NiX3VzYWdlKyspCisJCWxpc3RfYWRkKCZjcHVjdHgtPnNjaGVkX2NiX2VudHJ5LCB0aGlzX2NwdV9wdHIoJnNjaGVkX2NiX2xpc3QpKTsKKwogCXRoaXNfY3B1X2luYyhwZXJmX3NjaGVkX2NiX3VzYWdlcyk7CiB9CiAKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIHRoZSBjb250ZXh0IHN3aXRjaCBjYWxsYmFjayB0byB0aGUgbG93ZXIgY29kZQogICogbGF5ZXIuIEl0IGlzIGludm9rZWQgT05MWSB3aGVuIHRoZSBjb250ZXh0IHN3aXRjaCBjYWxsYmFjayBpcyBlbmFibGVkLgorICoKKyAqIFRoaXMgY2FsbGJhY2sgaXMgcmVsZXZhbnQgZXZlbiB0byBwZXItY3B1IGV2ZW50czsgZm9yIGV4YW1wbGUgbXVsdGkgZXZlbnQKKyAqIFBFQlMgcmVxdWlyZXMgdGhpcyB0byBwcm92aWRlIFBJRC9USUQgaW5mb3JtYXRpb24uIFRoaXMgcmVxdWlyZXMgd2UgZmx1c2gKKyAqIGFsbCBxdWV1ZWQgUEVCUyByZWNvcmRzIGJlZm9yZSB3ZSBjb250ZXh0IHN3aXRjaCB0byBhIG5ldyB0YXNrLgogICovCiBzdGF0aWMgdm9pZCBwZXJmX3BtdV9zY2hlZF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwKIAkJCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQsCkBAIC0yODIxLDM0ICsyODc1LDI0IEBACiB7CiAJc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eDsKIAlzdHJ1Y3QgcG11ICpwbXU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChwcmV2ID09IG5leHQpCiAJCXJldHVybjsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNwdWN0eCwgdGhpc19jcHVfcHRyKCZzY2hlZF9jYl9saXN0KSwgc2NoZWRfY2JfZW50cnkpIHsKKwkJcG11ID0gY3B1Y3R4LT51bmlxdWVfcG11OyAvKiBzb2Z0d2FyZSBQTVVzIHdpbGwgbm90IGhhdmUgc2NoZWRfdGFzayAqLwogCi0JcmN1X3JlYWRfbG9jaygpOworCQlpZiAoV0FSTl9PTl9PTkNFKCFwbXUtPnNjaGVkX3Rhc2spKQorCQkJY29udGludWU7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwbXUsICZwbXVzLCBlbnRyeSkgewotCQlpZiAocG11LT5zY2hlZF90YXNrKSB7Ci0JCQljcHVjdHggPSB0aGlzX2NwdV9wdHIocG11LT5wbXVfY3B1X2NvbnRleHQpOworCQlwZXJmX2N0eF9sb2NrKGNwdWN0eCwgY3B1Y3R4LT50YXNrX2N0eCk7CisJCXBlcmZfcG11X2Rpc2FibGUocG11KTsKIAotCQkJcGVyZl9jdHhfbG9jayhjcHVjdHgsIGNwdWN0eC0+dGFza19jdHgpOworCQlwbXUtPnNjaGVkX3Rhc2soY3B1Y3R4LT50YXNrX2N0eCwgc2NoZWRfaW4pOwogCi0JCQlwZXJmX3BtdV9kaXNhYmxlKHBtdSk7Ci0KLQkJCXBtdS0+c2NoZWRfdGFzayhjcHVjdHgtPnRhc2tfY3R4LCBzY2hlZF9pbik7Ci0KLQkJCXBlcmZfcG11X2VuYWJsZShwbXUpOwotCi0JCQlwZXJmX2N0eF91bmxvY2soY3B1Y3R4LCBjcHVjdHgtPnRhc2tfY3R4KTsKLQkJfQorCQlwZXJmX3BtdV9lbmFibGUocG11KTsKKwkJcGVyZl9jdHhfdW5sb2NrKGNwdWN0eCwgY3B1Y3R4LT50YXNrX2N0eCk7CiAJfQotCi0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIHBlcmZfZXZlbnRfc3dpdGNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKQEAgLTMzODAsNiArMzQyNCwyMiBAQAogCWludCByZXQ7CiB9OwogCitzdGF0aWMgaW50IGZpbmRfY3B1X3RvX3JlYWQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgbG9jYWxfY3B1KQoreworCWludCBldmVudF9jcHUgPSBldmVudC0+b25jcHU7CisJdTE2IGxvY2FsX3BrZywgZXZlbnRfcGtnOworCisJaWYgKGV2ZW50LT5ncm91cF9jYXBzICYgUEVSRl9FVl9DQVBfUkVBRF9BQ1RJVkVfUEtHKSB7CisJCWV2ZW50X3BrZyA9ICB0b3BvbG9neV9waHlzaWNhbF9wYWNrYWdlX2lkKGV2ZW50X2NwdSk7CisJCWxvY2FsX3BrZyA9ICB0b3BvbG9neV9waHlzaWNhbF9wYWNrYWdlX2lkKGxvY2FsX2NwdSk7CisKKwkJaWYgKGV2ZW50X3BrZyA9PSBsb2NhbF9wa2cpCisJCQlyZXR1cm4gbG9jYWxfY3B1OworCX0KKworCXJldHVybiBldmVudF9jcHU7Cit9CisKIC8qCiAgKiBDcm9zcyBDUFUgY2FsbCB0byByZWFkIHRoZSBoYXJkd2FyZSBldmVudAogICovCkBAIC0zNTAxLDcgKzM1NjEsNyBAQAogCiBzdGF0aWMgaW50IHBlcmZfZXZlbnRfcmVhZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGJvb2wgZ3JvdXApCiB7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldCA9IDAsIGNwdV90b19yZWFkLCBsb2NhbF9jcHU7CiAKIAkvKgogCSAqIElmIGV2ZW50IGlzIGVuYWJsZWQgYW5kIGN1cnJlbnRseSBhY3RpdmUgb24gYSBDUFUsIHVwZGF0ZSB0aGUKQEAgLTM1MTMsOCArMzU3MywyMiBAQAogCQkJLmdyb3VwID0gZ3JvdXAsCiAJCQkucmV0ID0gMCwKIAkJfTsKLQkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGV2ZW50LT5vbmNwdSwKLQkJCQkJIF9fcGVyZl9ldmVudF9yZWFkLCAmZGF0YSwgMSk7CisKKwkJbG9jYWxfY3B1ID0gZ2V0X2NwdSgpOworCQljcHVfdG9fcmVhZCA9IGZpbmRfY3B1X3RvX3JlYWQoZXZlbnQsIGxvY2FsX2NwdSk7CisJCXB1dF9jcHUoKTsKKworCQkvKgorCQkgKiBQdXJwb3NlbHkgaWdub3JlIHRoZSBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoKSByZXR1cm4KKwkJICogdmFsdWUuCisJCSAqCisJCSAqIElmIGV2ZW50LT5vbmNwdSBpc24ndCBhIHZhbGlkIENQVSBpdCBtZWFucyB0aGUgZXZlbnQgZ290CisJCSAqIHNjaGVkdWxlZCBvdXQgYW5kIHRoYXQgd2lsbCBoYXZlIHVwZGF0ZWQgdGhlIGV2ZW50IGNvdW50LgorCQkgKgorCQkgKiBUaGVyZWZvcmUsIGVpdGhlciB3YXksIHdlJ2xsIGhhdmUgYW4gdXAtdG8tZGF0ZSBldmVudCBjb3VudAorCQkgKiBhZnRlciB0aGlzLgorCQkgKi8KKwkJKHZvaWQpc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdV90b19yZWFkLCBfX3BlcmZfZXZlbnRfcmVhZCwgJmRhdGEsIDEpOwogCQlyZXQgPSBkYXRhLnJldDsKIAl9IGVsc2UgaWYgKGV2ZW50LT5zdGF0ZSA9PSBQRVJGX0VWRU5UX1NUQVRFX0lOQUNUSVZFKSB7CiAJCXN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQgKmN0eCA9IGV2ZW50LT5jdHg7CkBAIC0zODg0LDcgKzM5NTgsNyBAQAogCiBzdGF0aWMgYm9vbCBleGNsdXNpdmVfZXZlbnRfbWF0Y2goc3RydWN0IHBlcmZfZXZlbnQgKmUxLCBzdHJ1Y3QgcGVyZl9ldmVudCAqZTIpCiB7Ci0JaWYgKChlMS0+cG11LT5jYXBhYmlsaXRpZXMgJiBQRVJGX1BNVV9DQVBfRVhDTFVTSVZFKSAmJgorCWlmICgoZTEtPnBtdSA9PSBlMi0+cG11KSAmJgogCSAgICAoZTEtPmNwdSA9PSBlMi0+Y3B1IHx8CiAJICAgICBlMS0+Y3B1ID09IC0xIHx8CiAJICAgICBlMi0+Y3B1ID09IC0xKSkKQEAgLTQ4MDAsNiArNDg3NCwxOSBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyYi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwogCX0KIAorCS8qCisJICogQXZvaWQgcmFjaW5nIHdpdGggcGVyZl9tbWFwX2Nsb3NlKEFVWCk6IHN0b3AgdGhlIGV2ZW50CisJICogYmVmb3JlIHN3aXp6bGluZyB0aGUgZXZlbnQ6OnJiIHBvaW50ZXI7IGlmIGl0J3MgZ2V0dGluZworCSAqIHVubWFwcGVkLCBpdHMgYXV4X21tYXBfY291bnQgd2lsbCBiZSAwIGFuZCBpdCB3b24ndAorCSAqIHJlc3RhcnQuIFNlZSB0aGUgY29tbWVudCBpbiBfX3BlcmZfcG11X291dHB1dF9zdG9wKCkuCisJICoKKwkgKiBEYXRhIHdpbGwgaW5ldml0YWJseSBiZSBsb3N0IHdoZW4gc2V0X291dHB1dCBpcyBkb25lIGluCisJICogbWlkLWFpciwgYnV0IHRoZW4gYWdhaW4sIHdob2V2ZXIgZG9lcyBpdCBsaWtlIHRoaXMgaXMKKwkgKiBub3QgaW4gZm9yIHRoZSBkYXRhIGFueXdheS4KKwkgKi8KKwlpZiAoaGFzX2F1eChldmVudCkpCisJCXBlcmZfZXZlbnRfc3RvcChldmVudCwgMCk7CisKIAlyY3VfYXNzaWduX3BvaW50ZXIoZXZlbnQtPnJiLCByYik7CiAKIAlpZiAob2xkX3JiKSB7CkBAIC01MjkyLDkgKzUzNzksMTAgQEAKIAkJCXN0cnVjdCBwdF9yZWdzICpyZWdzLCB1NjQgbWFzaykKIHsKIAlpbnQgYml0OworCURFQ0xBUkVfQklUTUFQKF9tYXNrLCA2NCk7CiAKLQlmb3JfZWFjaF9zZXRfYml0KGJpdCwgKGNvbnN0IHVuc2lnbmVkIGxvbmcgKikgJm1hc2ssCi0JCQkgc2l6ZW9mKG1hc2spICogQklUU19QRVJfQllURSkgeworCWJpdG1hcF9mcm9tX3U2NChfbWFzaywgbWFzayk7CisJZm9yX2VhY2hfc2V0X2JpdChiaXQsIF9tYXNrLCBzaXplb2YobWFzaykgKiBCSVRTX1BFUl9CWVRFKSB7CiAJCXU2NCB2YWw7CiAKIAkJdmFsID0gcGVyZl9yZWdfdmFsdWUocmVncywgYml0KTsKQEAgLTYwNzUsNyArNjE2Myw3IEBACiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlmaC0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKHJlc3RhcnQpCi0JCXBlcmZfZXZlbnRfcmVzdGFydChldmVudCk7CisJCXBlcmZfZXZlbnRfc3RvcChldmVudCwgMSk7CiB9CiAKIHZvaWQgcGVyZl9ldmVudF9leGVjKHZvaWQpCkBAIC02MTE5LDcgKzYyMDcsMTMgQEAKIAogCS8qCiAJICogSW4gY2FzZSBvZiBpbmhlcml0YW5jZSwgaXQgd2lsbCBiZSB0aGUgcGFyZW50IHRoYXQgbGlua3MgdG8gdGhlCi0JICogcmluZy1idWZmZXIsIGJ1dCBpdCB3aWxsIGJlIHRoZSBjaGlsZCB0aGF0J3MgYWN0dWFsbHkgdXNpbmcgaXQ6CisJICogcmluZy1idWZmZXIsIGJ1dCBpdCB3aWxsIGJlIHRoZSBjaGlsZCB0aGF0J3MgYWN0dWFsbHkgdXNpbmcgaXQuCisJICoKKwkgKiBXZSBhcmUgdXNpbmcgZXZlbnQ6OnJiIHRvIGRldGVybWluZSBpZiB0aGUgZXZlbnQgc2hvdWxkIGJlIHN0b3BwZWQsCisJICogaG93ZXZlciB0aGlzIG1heSByYWNlIHdpdGggcmluZ19idWZmZXJfYXR0YWNoKCkgKHRocm91Z2ggc2V0X291dHB1dCksCisJICogd2hpY2ggd2lsbCBtYWtlIHVzIHNraXAgdGhlIGV2ZW50IHRoYXQgYWN0dWFsbHkgbmVlZHMgdG8gYmUgc3RvcHBlZC4KKwkgKiBTbyByaW5nX2J1ZmZlcl9hdHRhY2goKSBoYXMgdG8gc3RvcCBhbiBhdXggZXZlbnQgYmVmb3JlIHJlLWFzc2lnbmluZworCSAqIGl0cyByYiBwb2ludGVyLgogCSAqLwogCWlmIChyY3VfZGVyZWZlcmVuY2UocGFyZW50LT5yYikgPT0gcmIpCiAJCXJvLT5lcnIgPSBfX3BlcmZfZXZlbnRfc3RvcCgmc2QpOwpAQCAtNjEyOSw3ICs2MjIzLDcgQEAKIHsKIAlzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQgPSBpbmZvOwogCXN0cnVjdCBwbXUgKnBtdSA9IGV2ZW50LT5wbXU7Ci0Jc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eCA9IGdldF9jcHVfcHRyKHBtdS0+cG11X2NwdV9jb250ZXh0KTsKKwlzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4ID0gdGhpc19jcHVfcHRyKHBtdS0+cG11X2NwdV9jb250ZXh0KTsKIAlzdHJ1Y3QgcmVtb3RlX291dHB1dCBybyA9IHsKIAkJLnJiCT0gZXZlbnQtPnJiLAogCX07CkBAIC02NTg0LDE1ICs2Njc4LDYgQEAKIH0KIAogLyoKLSAqIFdoZXRoZXIgdGhpcyBAZmlsdGVyIGRlcGVuZHMgb24gYSBkeW5hbWljIG9iamVjdCB3aGljaCBpcyBub3QgbG9hZGVkCi0gKiB5ZXQgb3IgaXRzIGxvYWQgYWRkcmVzc2VzIGFyZSBub3Qga25vd24uCi0gKi8KLXN0YXRpYyBib29sIHBlcmZfYWRkcl9maWx0ZXJfbmVlZHNfbW1hcChzdHJ1Y3QgcGVyZl9hZGRyX2ZpbHRlciAqZmlsdGVyKQotewotCXJldHVybiBmaWx0ZXItPmZpbHRlciAmJiBmaWx0ZXItPmlub2RlOwotfQotCi0vKgogICogQ2hlY2sgd2hldGhlciBpbm9kZSBhbmQgYWRkcmVzcyByYW5nZSBtYXRjaCBmaWx0ZXIgY3JpdGVyaWEuCiAgKi8KIHN0YXRpYyBib29sIHBlcmZfYWRkcl9maWx0ZXJfbWF0Y2goc3RydWN0IHBlcmZfYWRkcl9maWx0ZXIgKmZpbHRlciwKQEAgLTY2NDIsNyArNjcyNyw3IEBACiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlmaC0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKHJlc3RhcnQpCi0JCXBlcmZfZXZlbnRfcmVzdGFydChldmVudCk7CisJCXBlcmZfZXZlbnRfc3RvcChldmVudCwgMSk7CiB9CiAKIC8qCkBAIC02NjUzLDYgKzY3MzgsMTMgQEAKIAlzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHg7CiAJaW50IGN0eG47CiAKKwkvKgorCSAqIERhdGEgdHJhY2luZyBpc24ndCBzdXBwb3J0ZWQgeWV0IGFuZCBhcyBzdWNoIHRoZXJlIGlzIG5vIG5lZWQKKwkgKiB0byBrZWVwIHRyYWNrIG9mIGFueXRoaW5nIHRoYXQgaXNuJ3QgcmVsYXRlZCB0byBleGVjdXRhYmxlIGNvZGU6CisJICovCisJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX0VYRUMpKQorCQlyZXR1cm47CisKIAlyY3VfcmVhZF9sb2NrKCk7CiAJZm9yX2VhY2hfdGFza19jb250ZXh0X25yKGN0eG4pIHsKIAkJY3R4ID0gcmN1X2RlcmVmZXJlbmNlKGN1cnJlbnQtPnBlcmZfZXZlbnRfY3R4cFtjdHhuXSk7CkBAIC02OTg3LDcgKzcwNzksNyBAQAogCQlpcnFfd29ya19xdWV1ZSgmZXZlbnQtPnBlbmRpbmcpOwogCX0KIAotCWV2ZW50LT5vdmVyZmxvd19oYW5kbGVyKGV2ZW50LCBkYXRhLCByZWdzKTsKKwlSRUFEX09OQ0UoZXZlbnQtPm92ZXJmbG93X2hhbmRsZXIpKGV2ZW50LCBkYXRhLCByZWdzKTsKIAogCWlmICgqcGVyZl9ldmVudF9mYXN5bmMoZXZlbnQpICYmIGV2ZW50LT5wZW5kaW5nX2tpbGwpIHsKIAkJZXZlbnQtPnBlbmRpbmdfd2FrZXVwID0gMTsKQEAgLTc2MDIsMTEgKzc2OTQsODMgQEAKIAlmdHJhY2VfcHJvZmlsZV9mcmVlX2ZpbHRlcihldmVudCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfQlBGX1NZU0NBTEwKK3N0YXRpYyB2b2lkIGJwZl9vdmVyZmxvd19oYW5kbGVyKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKKwkJCQkgc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgKmRhdGEsCisJCQkJIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBicGZfcGVyZl9ldmVudF9kYXRhX2tlcm4gY3R4ID0geworCQkuZGF0YSA9IGRhdGEsCisJCS5yZWdzID0gcmVncywKKwl9OworCWludCByZXQgPSAwOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJaWYgKHVubGlrZWx5KF9fdGhpc19jcHVfaW5jX3JldHVybihicGZfcHJvZ19hY3RpdmUpICE9IDEpKQorCQlnb3RvIG91dDsKKwlyY3VfcmVhZF9sb2NrKCk7CisJcmV0ID0gQlBGX1BST0dfUlVOKGV2ZW50LT5wcm9nLCAodm9pZCAqKSZjdHgpOworCXJjdV9yZWFkX3VubG9jaygpOworb3V0OgorCV9fdGhpc19jcHVfZGVjKGJwZl9wcm9nX2FjdGl2ZSk7CisJcHJlZW1wdF9lbmFibGUoKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuOworCisJZXZlbnQtPm9yaWdfb3ZlcmZsb3dfaGFuZGxlcihldmVudCwgZGF0YSwgcmVncyk7Cit9CisKK3N0YXRpYyBpbnQgcGVyZl9ldmVudF9zZXRfYnBmX2hhbmRsZXIoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCB1MzIgcHJvZ19mZCkKK3sKKwlzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7CisKKwlpZiAoZXZlbnQtPm92ZXJmbG93X2hhbmRsZXJfY29udGV4dCkKKwkJLyogaHcgYnJlYWtwb2ludCBvciBrZXJuZWwgY291bnRlciAqLworCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChldmVudC0+cHJvZykKKwkJcmV0dXJuIC1FRVhJU1Q7CisKKwlwcm9nID0gYnBmX3Byb2dfZ2V0X3R5cGUocHJvZ19mZCwgQlBGX1BST0dfVFlQRV9QRVJGX0VWRU5UKTsKKwlpZiAoSVNfRVJSKHByb2cpKQorCQlyZXR1cm4gUFRSX0VSUihwcm9nKTsKKworCWV2ZW50LT5wcm9nID0gcHJvZzsKKwlldmVudC0+b3JpZ19vdmVyZmxvd19oYW5kbGVyID0gUkVBRF9PTkNFKGV2ZW50LT5vdmVyZmxvd19oYW5kbGVyKTsKKwlXUklURV9PTkNFKGV2ZW50LT5vdmVyZmxvd19oYW5kbGVyLCBicGZfb3ZlcmZsb3dfaGFuZGxlcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmZfZXZlbnRfZnJlZV9icGZfaGFuZGxlcihzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IGJwZl9wcm9nICpwcm9nID0gZXZlbnQtPnByb2c7CisKKwlpZiAoIXByb2cpCisJCXJldHVybjsKKworCVdSSVRFX09OQ0UoZXZlbnQtPm92ZXJmbG93X2hhbmRsZXIsIGV2ZW50LT5vcmlnX292ZXJmbG93X2hhbmRsZXIpOworCWV2ZW50LT5wcm9nID0gTlVMTDsKKwlicGZfcHJvZ19wdXQocHJvZyk7Cit9CisjZWxzZQorc3RhdGljIGludCBwZXJmX2V2ZW50X3NldF9icGZfaGFuZGxlcihzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIHUzMiBwcm9nX2ZkKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KK3N0YXRpYyB2b2lkIHBlcmZfZXZlbnRfZnJlZV9icGZfaGFuZGxlcihzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7Cit9CisjZW5kaWYKKwogc3RhdGljIGludCBwZXJmX2V2ZW50X3NldF9icGZfcHJvZyhzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIHUzMiBwcm9nX2ZkKQogewogCWJvb2wgaXNfa3Byb2JlLCBpc190cmFjZXBvaW50OwogCXN0cnVjdCBicGZfcHJvZyAqcHJvZzsKIAorCWlmIChldmVudC0+YXR0ci50eXBlID09IFBFUkZfVFlQRV9IQVJEV0FSRSB8fAorCSAgICBldmVudC0+YXR0ci50eXBlID09IFBFUkZfVFlQRV9TT0ZUV0FSRSkKKwkJcmV0dXJuIHBlcmZfZXZlbnRfc2V0X2JwZl9oYW5kbGVyKGV2ZW50LCBwcm9nX2ZkKTsKKwogCWlmIChldmVudC0+YXR0ci50eXBlICE9IFBFUkZfVFlQRV9UUkFDRVBPSU5UKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtNzY0Nyw2ICs3ODExLDggQEAKIHsKIAlzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7CiAKKwlwZXJmX2V2ZW50X2ZyZWVfYnBmX2hhbmRsZXIoZXZlbnQpOworCiAJaWYgKCFldmVudC0+dHBfZXZlbnQpCiAJCXJldHVybjsKIApAQCAtNzgwNSw3ICs3OTcxLDExIEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShmaWx0ZXIsICZpZmgtPmxpc3QsIGVudHJ5KSB7CiAJCWV2ZW50LT5hZGRyX2ZpbHRlcnNfb2Zmc1tjb3VudF0gPSAwOwogCi0JCWlmIChwZXJmX2FkZHJfZmlsdGVyX25lZWRzX21tYXAoZmlsdGVyKSkKKwkJLyoKKwkJICogQWRqdXN0IGJhc2Ugb2Zmc2V0IGlmIHRoZSBmaWx0ZXIgaXMgYXNzb2NpYXRlZCB0byBhIGJpbmFyeQorCQkgKiB0aGF0IG5lZWRzIHRvIGJlIG1hcHBlZDoKKwkJICovCisJCWlmIChmaWx0ZXItPmlub2RlKQogCQkJZXZlbnQtPmFkZHJfZmlsdGVyc19vZmZzW2NvdW50XSA9CiAJCQkJcGVyZl9hZGRyX2ZpbHRlcl9hcHBseShmaWx0ZXIsIG1tKTsKIApAQCAtNzgyMCw3ICs3OTkwLDcgQEAKIAltbXB1dChtbSk7CiAKIHJlc3RhcnQ6Ci0JcGVyZl9ldmVudF9yZXN0YXJ0KGV2ZW50KTsKKwlwZXJmX2V2ZW50X3N0b3AoZXZlbnQsIDEpOwogfQogCiAvKgpAQCAtNzkzNiw4ICs4MTA2LDEwIEBACiAJCQkJCWdvdG8gZmFpbDsKIAkJCX0KIAotCQkJaWYgKHRva2VuID09IElGX1NSQ19GSUxFKSB7Ci0JCQkJZmlsZW5hbWUgPSBtYXRjaF9zdHJkdXAoJmFyZ3NbMl0pOworCQkJaWYgKHRva2VuID09IElGX1NSQ19GSUxFIHx8IHRva2VuID09IElGX1NSQ19GSUxFQUREUikgeworCQkJCWludCBmcG9zID0gZmlsdGVyLT5yYW5nZSA/IDIgOiAxOworCisJCQkJZmlsZW5hbWUgPSBtYXRjaF9zdHJkdXAoJmFyZ3NbZnBvc10pOwogCQkJCWlmICghZmlsZW5hbWUpIHsKIAkJCQkJcmV0ID0gLUVOT01FTTsKIAkJCQkJZ290byBmYWlsOwpAQCAtODk1Nyw2ICs5MTI5LDE5IEBACiAJaWYgKCFvdmVyZmxvd19oYW5kbGVyICYmIHBhcmVudF9ldmVudCkgewogCQlvdmVyZmxvd19oYW5kbGVyID0gcGFyZW50X2V2ZW50LT5vdmVyZmxvd19oYW5kbGVyOwogCQljb250ZXh0ID0gcGFyZW50X2V2ZW50LT5vdmVyZmxvd19oYW5kbGVyX2NvbnRleHQ7CisjaWYgZGVmaW5lZChDT05GSUdfQlBGX1NZU0NBTEwpICYmIGRlZmluZWQoQ09ORklHX0VWRU5UX1RSQUNJTkcpCisJCWlmIChvdmVyZmxvd19oYW5kbGVyID09IGJwZl9vdmVyZmxvd19oYW5kbGVyKSB7CisJCQlzdHJ1Y3QgYnBmX3Byb2cgKnByb2cgPSBicGZfcHJvZ19pbmMocGFyZW50X2V2ZW50LT5wcm9nKTsKKworCQkJaWYgKElTX0VSUihwcm9nKSkgeworCQkJCWVyciA9IFBUUl9FUlIocHJvZyk7CisJCQkJZ290byBlcnJfbnM7CisJCQl9CisJCQlldmVudC0+cHJvZyA9IHByb2c7CisJCQlldmVudC0+b3JpZ19vdmVyZmxvd19oYW5kbGVyID0KKwkJCQlwYXJlbnRfZXZlbnQtPm9yaWdfb3ZlcmZsb3dfaGFuZGxlcjsKKwkJfQorI2VuZGlmCiAJfQogCiAJaWYgKG92ZXJmbG93X2hhbmRsZXIpIHsKQEAgLTk0MzcsNiArOTYyMiw5IEBACiAJCQlnb3RvIGVycl9hbGxvYzsKIAl9CiAKKwlpZiAocG11LT50YXNrX2N0eF9uciA9PSBwZXJmX3N3X2NvbnRleHQpCisJCWV2ZW50LT5ldmVudF9jYXBzIHw9IFBFUkZfRVZfQ0FQX1NPRlRXQVJFOworCiAJaWYgKGdyb3VwX2xlYWRlciAmJgogCSAgICAoaXNfc29mdHdhcmVfZXZlbnQoZXZlbnQpICE9IGlzX3NvZnR3YXJlX2V2ZW50KGdyb3VwX2xlYWRlcikpKSB7CiAJCWlmIChpc19zb2Z0d2FyZV9ldmVudChldmVudCkpIHsKQEAgLTk0NTAsNyArOTYzOCw3IEBACiAJCQkgKi8KIAkJCXBtdSA9IGdyb3VwX2xlYWRlci0+cG11OwogCQl9IGVsc2UgaWYgKGlzX3NvZnR3YXJlX2V2ZW50KGdyb3VwX2xlYWRlcikgJiYKLQkJCSAgIChncm91cF9sZWFkZXItPmdyb3VwX2ZsYWdzICYgUEVSRl9HUk9VUF9TT0ZUV0FSRSkpIHsKKwkJCSAgIChncm91cF9sZWFkZXItPmdyb3VwX2NhcHMgJiBQRVJGX0VWX0NBUF9TT0ZUV0FSRSkpIHsKIAkJCS8qCiAJCQkgKiBJbiBjYXNlIHRoZSBncm91cCBpcyBhIHB1cmUgc29mdHdhcmUgZ3JvdXAsIGFuZCB3ZQogCQkJICogdHJ5IHRvIGFkZCBhIGhhcmR3YXJlIGV2ZW50LCBtb3ZlIHRoZSB3aG9sZSBncm91cCB0bwpAQCAtMTAzODUsNiArMTA1NzMsOCBAQAogCiAJCUlOSVRfTElTVF9IRUFEKCZwZXJfY3B1KHBtdV9zYl9ldmVudHMubGlzdCwgY3B1KSk7CiAJCXJhd19zcGluX2xvY2tfaW5pdCgmcGVyX2NwdShwbXVfc2JfZXZlbnRzLmxvY2ssIGNwdSkpOworCisJCUlOSVRfTElTVF9IRUFEKCZwZXJfY3B1KHNjaGVkX2NiX2xpc3QsIGNwdSkpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL2V2ZW50cy9yaW5nX2J1ZmZlci5jIGIva2VybmVsL2V2ZW50cy9yaW5nX2J1ZmZlci5jCmluZGV4IGFlOWI5MGQuLjI1N2ZhNDYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ldmVudHMvcmluZ19idWZmZXIuYworKysgYi9rZXJuZWwvZXZlbnRzL3JpbmdfYnVmZmVyLmMKQEAgLTMzMCwxNSArMzMwLDIyIEBACiAJaWYgKCFyYikKIAkJcmV0dXJuIE5VTEw7CiAKLQlpZiAoIXJiX2hhc19hdXgocmIpIHx8ICFhdG9taWNfaW5jX25vdF96ZXJvKCZyYi0+YXV4X3JlZmNvdW50KSkKKwlpZiAoIXJiX2hhc19hdXgocmIpKQogCQlnb3RvIGVycjsKIAogCS8qCi0JICogSWYgcmI6OmF1eF9tbWFwX2NvdW50IGlzIHplcm8gKGFuZCByYl9oYXNfYXV4KCkgYWJvdmUgd2VudCB0aHJvdWdoKSwKLQkgKiB0aGUgYXV4IGJ1ZmZlciBpcyBpbiBwZXJmX21tYXBfY2xvc2UoKSwgYWJvdXQgdG8gZ2V0IGZyZWVkLgorCSAqIElmIGF1eF9tbWFwX2NvdW50IGlzIHplcm8sIHRoZSBhdXggYnVmZmVyIGlzIGluIHBlcmZfbW1hcF9jbG9zZSgpLAorCSAqIGFib3V0IHRvIGdldCBmcmVlZCwgc28gd2UgbGVhdmUgaW1tZWRpYXRlbHkuCisJICoKKwkgKiBDaGVja2luZyByYjo6YXV4X21tYXBfY291bnQgYW5kIHJiOjpyZWZjb3VudCBoYXMgdG8gYmUgZG9uZSBpbgorCSAqIHRoZSBzYW1lIG9yZGVyLCBzZWUgcGVyZl9tbWFwX2Nsb3NlLiBPdGhlcndpc2Ugd2UgZW5kIHVwIGZyZWVpbmcKKwkgKiBhdXggcGFnZXMgaW4gdGhpcyBwYXRoLCB3aGljaCBpcyBhIGJ1ZywgYmVjYXVzZSBpbl9hdG9taWMoKS4KIAkgKi8KIAlpZiAoIWF0b21pY19yZWFkKCZyYi0+YXV4X21tYXBfY291bnQpKQotCQlnb3RvIGVycl9wdXQ7CisJCWdvdG8gZXJyOworCisJaWYgKCFhdG9taWNfaW5jX25vdF96ZXJvKCZyYi0+YXV4X3JlZmNvdW50KSkKKwkJZ290byBlcnI7CiAKIAkvKgogCSAqIE5lc3RpbmcgaXMgbm90IHN1cHBvcnRlZCBmb3IgQVVYIGFyZWEsIG1ha2Ugc3VyZSBuZXN0ZWQKZGlmZiAtLWdpdCBhL2tlcm5lbC9ldmVudHMvdXByb2Jlcy5jIGIva2VybmVsL2V2ZW50cy91cHJvYmVzLmMKaW5kZXggYjdhNTI1YS4uZDQxMjliYiAxMDA2NDQKLS0tIGEva2VybmVsL2V2ZW50cy91cHJvYmVzLmMKKysrIGIva2VybmVsL2V2ZW50cy91cHJvYmVzLmMKQEAgLTE1MCw3ICsxNTAsNyBAQAogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FRkFVTFQgb24gZmFpbHVyZS4KICAqLwogc3RhdGljIGludCBfX3JlcGxhY2VfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLAotCQkJCXN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgcGFnZSAqa3BhZ2UpCisJCQkJc3RydWN0IHBhZ2UgKm9sZF9wYWdlLCBzdHJ1Y3QgcGFnZSAqbmV3X3BhZ2UpCiB7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtPnZtX21tOwogCXNwaW5sb2NrX3QgKnB0bDsKQEAgLTE2MSw0OCArMTYxLDQ5IEBACiAJY29uc3QgdW5zaWduZWQgbG9uZyBtbXVuX2VuZCAgID0gYWRkciArIFBBR0VfU0laRTsKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiAKLQllcnIgPSBtZW1fY2dyb3VwX3RyeV9jaGFyZ2Uoa3BhZ2UsIHZtYS0+dm1fbW0sIEdGUF9LRVJORUwsICZtZW1jZywKKwllcnIgPSBtZW1fY2dyb3VwX3RyeV9jaGFyZ2UobmV3X3BhZ2UsIHZtYS0+dm1fbW0sIEdGUF9LRVJORUwsICZtZW1jZywKIAkJCWZhbHNlKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCiAJLyogRm9yIHRyeV90b19mcmVlX3N3YXAoKSBhbmQgbXVubG9ja192bWFfcGFnZSgpIGJlbG93ICovCi0JbG9ja19wYWdlKHBhZ2UpOworCWxvY2tfcGFnZShvbGRfcGFnZSk7CiAKIAltbXVfbm90aWZpZXJfaW52YWxpZGF0ZV9yYW5nZV9zdGFydChtbSwgbW11bl9zdGFydCwgbW11bl9lbmQpOwogCWVyciA9IC1FQUdBSU47Ci0JcHRlcCA9IHBhZ2VfY2hlY2tfYWRkcmVzcyhwYWdlLCBtbSwgYWRkciwgJnB0bCwgMCk7Ci0JaWYgKCFwdGVwKQorCXB0ZXAgPSBwYWdlX2NoZWNrX2FkZHJlc3Mob2xkX3BhZ2UsIG1tLCBhZGRyLCAmcHRsLCAwKTsKKwlpZiAoIXB0ZXApIHsKKwkJbWVtX2Nncm91cF9jYW5jZWxfY2hhcmdlKG5ld19wYWdlLCBtZW1jZywgZmFsc2UpOwogCQlnb3RvIHVubG9jazsKKwl9CiAKLQlnZXRfcGFnZShrcGFnZSk7Ci0JcGFnZV9hZGRfbmV3X2Fub25fcm1hcChrcGFnZSwgdm1hLCBhZGRyLCBmYWxzZSk7Ci0JbWVtX2Nncm91cF9jb21taXRfY2hhcmdlKGtwYWdlLCBtZW1jZywgZmFsc2UsIGZhbHNlKTsKLQlscnVfY2FjaGVfYWRkX2FjdGl2ZV9vcl91bmV2aWN0YWJsZShrcGFnZSwgdm1hKTsKKwlnZXRfcGFnZShuZXdfcGFnZSk7CisJcGFnZV9hZGRfbmV3X2Fub25fcm1hcChuZXdfcGFnZSwgdm1hLCBhZGRyLCBmYWxzZSk7CisJbWVtX2Nncm91cF9jb21taXRfY2hhcmdlKG5ld19wYWdlLCBtZW1jZywgZmFsc2UsIGZhbHNlKTsKKwlscnVfY2FjaGVfYWRkX2FjdGl2ZV9vcl91bmV2aWN0YWJsZShuZXdfcGFnZSwgdm1hKTsKIAotCWlmICghUGFnZUFub24ocGFnZSkpIHsKLQkJZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXJfZmlsZShwYWdlKSk7CisJaWYgKCFQYWdlQW5vbihvbGRfcGFnZSkpIHsKKwkJZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXJfZmlsZShvbGRfcGFnZSkpOwogCQlpbmNfbW1fY291bnRlcihtbSwgTU1fQU5PTlBBR0VTKTsKIAl9CiAKIAlmbHVzaF9jYWNoZV9wYWdlKHZtYSwgYWRkciwgcHRlX3BmbigqcHRlcCkpOwogCXB0ZXBfY2xlYXJfZmx1c2hfbm90aWZ5KHZtYSwgYWRkciwgcHRlcCk7Ci0Jc2V0X3B0ZV9hdF9ub3RpZnkobW0sIGFkZHIsIHB0ZXAsIG1rX3B0ZShrcGFnZSwgdm1hLT52bV9wYWdlX3Byb3QpKTsKKwlzZXRfcHRlX2F0X25vdGlmeShtbSwgYWRkciwgcHRlcCwgbWtfcHRlKG5ld19wYWdlLCB2bWEtPnZtX3BhZ2VfcHJvdCkpOwogCi0JcGFnZV9yZW1vdmVfcm1hcChwYWdlLCBmYWxzZSk7Ci0JaWYgKCFwYWdlX21hcHBlZChwYWdlKSkKLQkJdHJ5X3RvX2ZyZWVfc3dhcChwYWdlKTsKKwlwYWdlX3JlbW92ZV9ybWFwKG9sZF9wYWdlLCBmYWxzZSk7CisJaWYgKCFwYWdlX21hcHBlZChvbGRfcGFnZSkpCisJCXRyeV90b19mcmVlX3N3YXAob2xkX3BhZ2UpOwogCXB0ZV91bm1hcF91bmxvY2socHRlcCwgcHRsKTsKIAogCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fTE9DS0VEKQotCQltdW5sb2NrX3ZtYV9wYWdlKHBhZ2UpOwotCXB1dF9wYWdlKHBhZ2UpOworCQltdW5sb2NrX3ZtYV9wYWdlKG9sZF9wYWdlKTsKKwlwdXRfcGFnZShvbGRfcGFnZSk7CiAKIAllcnIgPSAwOwogIHVubG9jazoKLQltZW1fY2dyb3VwX2NhbmNlbF9jaGFyZ2Uoa3BhZ2UsIG1lbWNnLCBmYWxzZSk7CiAJbW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2VfZW5kKG1tLCBtbXVuX3N0YXJ0LCBtbXVuX2VuZCk7Ci0JdW5sb2NrX3BhZ2UocGFnZSk7CisJdW5sb2NrX3BhZ2Uob2xkX3BhZ2UpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9leGl0LmMgYi9rZXJuZWwvZXhpdC5jCmluZGV4IDJmOTc0YWUuLjFlMWQ5MTMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9leGl0LmMKKysrIGIva2VybmVsL2V4aXQuYwpAQCAtNzI1LDcgKzcyNSw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfc3RhY2tfdXNhZ2Uodm9pZCkge30KICNlbmRpZgogCi12b2lkIGRvX2V4aXQobG9uZyBjb2RlKQordm9pZCBfX25vcmV0dXJuIGRvX2V4aXQobG9uZyBjb2RlKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKIAlpbnQgZ3JvdXBfZGVhZDsKQEAgLTg0OCwxMiArODQ4LDcgQEAKIAlUQVNLU19SQ1UocHJlZW1wdF9lbmFibGUoKSk7CiAJZXhpdF9ub3RpZnkodHNrLCBncm91cF9kZWFkKTsKIAlwcm9jX2V4aXRfY29ubmVjdG9yKHRzayk7Ci0jaWZkZWYgQ09ORklHX05VTUEKLQl0YXNrX2xvY2sodHNrKTsKLQltcG9sX3B1dCh0c2stPm1lbXBvbGljeSk7Ci0JdHNrLT5tZW1wb2xpY3kgPSBOVUxMOwotCXRhc2tfdW5sb2NrKHRzayk7Ci0jZW5kaWYKKwltcG9sX3B1dF90YXNrX3BvbGljeSh0c2spOwogI2lmZGVmIENPTkZJR19GVVRFWAogCWlmICh1bmxpa2VseShjdXJyZW50LT5waV9zdGF0ZV9jYWNoZSkpCiAJCWtmcmVlKGN1cnJlbnQtPnBpX3N0YXRlX2NhY2hlKTsKQEAgLTg4NywyOSArODgyLDcgQEAKIAlleGl0X3JjdSgpOwogCVRBU0tTX1JDVShfX3NyY3VfcmVhZF91bmxvY2soJnRhc2tzX3JjdV9leGl0X3NyY3UsIHRhc2tzX3JjdV9pKSk7CiAKLQkvKgotCSAqIFRoZSBzZXR0aW5nIG9mIFRBU0tfUlVOTklORyBieSB0cnlfdG9fd2FrZV91cCgpIG1heSBiZSBkZWxheWVkCi0JICogd2hlbiB0aGUgZm9sbG93aW5nIHR3byBjb25kaXRpb25zIGJlY29tZSB0cnVlLgotCSAqICAgLSBUaGVyZSBpcyByYWNlIGNvbmRpdGlvbiBvZiBtbWFwX3NlbSAoSXQgaXMgYWNxdWlyZWQgYnkKLQkgKiAgICAgZXhpdF9tbSgpKSwgYW5kCi0JICogICAtIFNNSSBvY2N1cnMgYmVmb3JlIHNldHRpbmcgVEFTS19SVU5JTk5HLgotCSAqICAgICAob3IgaHlwZXJ2aXNvciBvZiB2aXJ0dWFsIG1hY2hpbmUgc3dpdGNoZXMgdG8gb3RoZXIgZ3Vlc3QpCi0JICogIEFzIGEgcmVzdWx0LCB3ZSBtYXkgYmVjb21lIFRBU0tfUlVOTklORyBhZnRlciBiZWNvbWluZyBUQVNLX0RFQUQKLQkgKgotCSAqIFRvIGF2b2lkIGl0LCB3ZSBoYXZlIHRvIHdhaXQgZm9yIHJlbGVhc2luZyB0c2stPnBpX2xvY2sgd2hpY2gKLQkgKiBpcyBoZWxkIGJ5IHRyeV90b193YWtlX3VwKCkKLQkgKi8KLQlzbXBfbWIoKTsKLQlyYXdfc3Bpbl91bmxvY2tfd2FpdCgmdHNrLT5waV9sb2NrKTsKLQotCS8qIGNhdXNlcyBmaW5hbCBwdXRfdGFza19zdHJ1Y3QgaW4gZmluaXNoX3Rhc2tfc3dpdGNoKCkuICovCi0JdHNrLT5zdGF0ZSA9IFRBU0tfREVBRDsKLQl0c2stPmZsYWdzIHw9IFBGX05PRlJFRVpFOwkvKiB0ZWxsIGZyZWV6ZXIgdG8gaWdub3JlIHVzICovCi0Jc2NoZWR1bGUoKTsKLQlCVUcoKTsKLQkvKiBBdm9pZCAibm9yZXR1cm4gZnVuY3Rpb24gZG9lcyByZXR1cm4iLiAgKi8KLQlmb3IgKDs7KQotCQljcHVfcmVsYXgoKTsJLyogRm9yIHdoZW4gQlVHIGlzIG51bGwgKi8KKwlkb190YXNrX2RlYWQoKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRvX2V4aXQpOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvZm9yay5jIGIva2VybmVsL2ZvcmsuYwppbmRleCA1MmU3MjVkNC4uOWEwNWJkOSAxMDA2NDQKLS0tIGEva2VybmVsL2ZvcmsuYworKysgYi9rZXJuZWwvZm9yay5jCkBAIC0xNTgsMTkgKzE1OCw4MyBAQAogICogQWxsb2NhdGUgcGFnZXMgaWYgVEhSRUFEX1NJWkUgaXMgPj0gUEFHRV9TSVpFLCBvdGhlcndpc2UgdXNlIGEKICAqIGttZW1jYWNoZSBiYXNlZCBhbGxvY2F0b3IuCiAgKi8KLSMgaWYgVEhSRUFEX1NJWkUgPj0gUEFHRV9TSVpFCi1zdGF0aWMgdW5zaWduZWQgbG9uZyAqYWxsb2NfdGhyZWFkX3N0YWNrX25vZGUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCi0JCQkJCQkgIGludCBub2RlKQorIyBpZiBUSFJFQURfU0laRSA+PSBQQUdFX1NJWkUgfHwgZGVmaW5lZChDT05GSUdfVk1BUF9TVEFDSykKKworI2lmZGVmIENPTkZJR19WTUFQX1NUQUNLCisvKgorICogdm1hbGxvYygpIGlzIGEgYml0IHNsb3csIGFuZCBjYWxsaW5nIHZmcmVlKCkgZW5vdWdoIHRpbWVzIHdpbGwgZm9yY2UgYSBUTEIKKyAqIGZsdXNoLiAgVHJ5IHRvIG1pbmltaXplIHRoZSBudW1iZXIgb2YgY2FsbHMgYnkgY2FjaGluZyBzdGFja3MuCisgKi8KKyNkZWZpbmUgTlJfQ0FDSEVEX1NUQUNLUyAyCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHZtX3N0cnVjdCAqLCBjYWNoZWRfc3RhY2tzW05SX0NBQ0hFRF9TVEFDS1NdKTsKKyNlbmRpZgorCitzdGF0aWMgdW5zaWduZWQgbG9uZyAqYWxsb2NfdGhyZWFkX3N0YWNrX25vZGUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBub2RlKQogeworI2lmZGVmIENPTkZJR19WTUFQX1NUQUNLCisJdm9pZCAqc3RhY2s7CisJaW50IGk7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWZvciAoaSA9IDA7IGkgPCBOUl9DQUNIRURfU1RBQ0tTOyBpKyspIHsKKwkJc3RydWN0IHZtX3N0cnVjdCAqcyA9IHRoaXNfY3B1X3JlYWQoY2FjaGVkX3N0YWNrc1tpXSk7CisKKwkJaWYgKCFzKQorCQkJY29udGludWU7CisJCXRoaXNfY3B1X3dyaXRlKGNhY2hlZF9zdGFja3NbaV0sIE5VTEwpOworCisJCXRzay0+c3RhY2tfdm1fYXJlYSA9IHM7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJcmV0dXJuIHMtPmFkZHI7CisJfQorCWxvY2FsX2lycV9lbmFibGUoKTsKKworCXN0YWNrID0gX192bWFsbG9jX25vZGVfcmFuZ2UoVEhSRUFEX1NJWkUsIFRIUkVBRF9TSVpFLAorCQkJCSAgICAgVk1BTExPQ19TVEFSVCwgVk1BTExPQ19FTkQsCisJCQkJICAgICBUSFJFQURJTkZPX0dGUCB8IF9fR0ZQX0hJR0hNRU0sCisJCQkJICAgICBQQUdFX0tFUk5FTCwKKwkJCQkgICAgIDAsIG5vZGUsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CisKKwkvKgorCSAqIFdlIGNhbid0IGNhbGwgZmluZF92bV9hcmVhKCkgaW4gaW50ZXJydXB0IGNvbnRleHQsIGFuZAorCSAqIGZyZWVfdGhyZWFkX3N0YWNrKCkgY2FuIGJlIGNhbGxlZCBpbiBpbnRlcnJ1cHQgY29udGV4dCwKKwkgKiBzbyBjYWNoZSB0aGUgdm1fc3RydWN0LgorCSAqLworCWlmIChzdGFjaykKKwkJdHNrLT5zdGFja192bV9hcmVhID0gZmluZF92bV9hcmVhKHN0YWNrKTsKKwlyZXR1cm4gc3RhY2s7CisjZWxzZQogCXN0cnVjdCBwYWdlICpwYWdlID0gYWxsb2NfcGFnZXNfbm9kZShub2RlLCBUSFJFQURJTkZPX0dGUCwKIAkJCQkJICAgICBUSFJFQURfU0laRV9PUkRFUik7CiAKIAlyZXR1cm4gcGFnZSA/IHBhZ2VfYWRkcmVzcyhwYWdlKSA6IE5VTEw7CisjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGZyZWVfdGhyZWFkX3N0YWNrKHVuc2lnbmVkIGxvbmcgKnN0YWNrKQorc3RhdGljIGlubGluZSB2b2lkIGZyZWVfdGhyZWFkX3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewotCV9fZnJlZV9wYWdlcyh2aXJ0X3RvX3BhZ2Uoc3RhY2spLCBUSFJFQURfU0laRV9PUkRFUik7CisjaWZkZWYgQ09ORklHX1ZNQVBfU1RBQ0sKKwlpZiAodGFza19zdGFja192bV9hcmVhKHRzaykpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJaW50IGk7CisKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlmb3IgKGkgPSAwOyBpIDwgTlJfQ0FDSEVEX1NUQUNLUzsgaSsrKSB7CisJCQlpZiAodGhpc19jcHVfcmVhZChjYWNoZWRfc3RhY2tzW2ldKSkKKwkJCQljb250aW51ZTsKKworCQkJdGhpc19jcHVfd3JpdGUoY2FjaGVkX3N0YWNrc1tpXSwgdHNrLT5zdGFja192bV9hcmVhKTsKKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwkJdmZyZWUodHNrLT5zdGFjayk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKworCV9fZnJlZV9wYWdlcyh2aXJ0X3RvX3BhZ2UodHNrLT5zdGFjayksIFRIUkVBRF9TSVpFX09SREVSKTsKIH0KICMgZWxzZQogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICp0aHJlYWRfc3RhY2tfY2FjaGU7CkBAIC0xODEsOSArMjQ1LDkgQEAKIAlyZXR1cm4ga21lbV9jYWNoZV9hbGxvY19ub2RlKHRocmVhZF9zdGFja19jYWNoZSwgVEhSRUFESU5GT19HRlAsIG5vZGUpOwogfQogCi1zdGF0aWMgdm9pZCBmcmVlX3RocmVhZF9zdGFjayh1bnNpZ25lZCBsb25nICpzdGFjaykKK3N0YXRpYyB2b2lkIGZyZWVfdGhyZWFkX3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewotCWttZW1fY2FjaGVfZnJlZSh0aHJlYWRfc3RhY2tfY2FjaGUsIHN0YWNrKTsKKwlrbWVtX2NhY2hlX2ZyZWUodGhyZWFkX3N0YWNrX2NhY2hlLCB0c2stPnN0YWNrKTsKIH0KIAogdm9pZCB0aHJlYWRfc3RhY2tfY2FjaGVfaW5pdCh2b2lkKQpAQCAtMjEzLDI0ICsyNzcsNzYgQEAKIC8qIFNMQUIgY2FjaGUgZm9yIG1tX3N0cnVjdCBzdHJ1Y3R1cmVzICh0c2stPm1tKSAqLwogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICptbV9jYWNoZXA7CiAKLXN0YXRpYyB2b2lkIGFjY291bnRfa2VybmVsX3N0YWNrKHVuc2lnbmVkIGxvbmcgKnN0YWNrLCBpbnQgYWNjb3VudCkKK3N0YXRpYyB2b2lkIGFjY291bnRfa2VybmVsX3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgYWNjb3VudCkKIHsKLQkvKiBBbGwgc3RhY2sgcGFnZXMgYXJlIGluIHRoZSBzYW1lIHpvbmUgYW5kIGJlbG9uZyB0byB0aGUgc2FtZSBtZW1jZy4gKi8KLQlzdHJ1Y3QgcGFnZSAqZmlyc3RfcGFnZSA9IHZpcnRfdG9fcGFnZShzdGFjayk7CisJdm9pZCAqc3RhY2sgPSB0YXNrX3N0YWNrX3BhZ2UodHNrKTsKKwlzdHJ1Y3Qgdm1fc3RydWN0ICp2bSA9IHRhc2tfc3RhY2tfdm1fYXJlYSh0c2spOwogCi0JbW9kX3pvbmVfcGFnZV9zdGF0ZShwYWdlX3pvbmUoZmlyc3RfcGFnZSksIE5SX0tFUk5FTF9TVEFDS19LQiwKLQkJCSAgICBUSFJFQURfU0laRSAvIDEwMjQgKiBhY2NvdW50KTsKKwlCVUlMRF9CVUdfT04oSVNfRU5BQkxFRChDT05GSUdfVk1BUF9TVEFDSykgJiYgUEFHRV9TSVpFICUgMTAyNCAhPSAwKTsKIAotCW1lbWNnX2ttZW1fdXBkYXRlX3BhZ2Vfc3RhdCgKLQkJZmlyc3RfcGFnZSwgTUVNQ0dfS0VSTkVMX1NUQUNLX0tCLAotCQlhY2NvdW50ICogKFRIUkVBRF9TSVpFIC8gMTAyNCkpOworCWlmICh2bSkgeworCQlpbnQgaTsKKworCQlCVUdfT04odm0tPm5yX3BhZ2VzICE9IFRIUkVBRF9TSVpFIC8gUEFHRV9TSVpFKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgVEhSRUFEX1NJWkUgLyBQQUdFX1NJWkU7IGkrKykgeworCQkJbW9kX3pvbmVfcGFnZV9zdGF0ZShwYWdlX3pvbmUodm0tPnBhZ2VzW2ldKSwKKwkJCQkJICAgIE5SX0tFUk5FTF9TVEFDS19LQiwKKwkJCQkJICAgIFBBR0VfU0laRSAvIDEwMjQgKiBhY2NvdW50KTsKKwkJfQorCisJCS8qIEFsbCBzdGFjayBwYWdlcyBiZWxvbmcgdG8gdGhlIHNhbWUgbWVtY2cuICovCisJCW1lbWNnX2ttZW1fdXBkYXRlX3BhZ2Vfc3RhdCh2bS0+cGFnZXNbMF0sIE1FTUNHX0tFUk5FTF9TVEFDS19LQiwKKwkJCQkJICAgIGFjY291bnQgKiAoVEhSRUFEX1NJWkUgLyAxMDI0KSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQWxsIHN0YWNrIHBhZ2VzIGFyZSBpbiB0aGUgc2FtZSB6b25lIGFuZCBiZWxvbmcgdG8gdGhlCisJCSAqIHNhbWUgbWVtY2cuCisJCSAqLworCQlzdHJ1Y3QgcGFnZSAqZmlyc3RfcGFnZSA9IHZpcnRfdG9fcGFnZShzdGFjayk7CisKKwkJbW9kX3pvbmVfcGFnZV9zdGF0ZShwYWdlX3pvbmUoZmlyc3RfcGFnZSksIE5SX0tFUk5FTF9TVEFDS19LQiwKKwkJCQkgICAgVEhSRUFEX1NJWkUgLyAxMDI0ICogYWNjb3VudCk7CisKKwkJbWVtY2dfa21lbV91cGRhdGVfcGFnZV9zdGF0KGZpcnN0X3BhZ2UsIE1FTUNHX0tFUk5FTF9TVEFDS19LQiwKKwkJCQkJICAgIGFjY291bnQgKiAoVEhSRUFEX1NJWkUgLyAxMDI0KSk7CisJfQogfQogCitzdGF0aWMgdm9pZCByZWxlYXNlX3Rhc2tfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJYWNjb3VudF9rZXJuZWxfc3RhY2sodHNrLCAtMSk7CisJYXJjaF9yZWxlYXNlX3RocmVhZF9zdGFjayh0c2stPnN0YWNrKTsKKwlmcmVlX3RocmVhZF9zdGFjayh0c2spOworCXRzay0+c3RhY2sgPSBOVUxMOworI2lmZGVmIENPTkZJR19WTUFQX1NUQUNLCisJdHNrLT5zdGFja192bV9hcmVhID0gTlVMTDsKKyNlbmRpZgorfQorCisjaWZkZWYgQ09ORklHX1RIUkVBRF9JTkZPX0lOX1RBU0sKK3ZvaWQgcHV0X3Rhc2tfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnRzay0+c3RhY2tfcmVmY291bnQpKQorCQlyZWxlYXNlX3Rhc2tfc3RhY2sodHNrKTsKK30KKyNlbmRpZgorCiB2b2lkIGZyZWVfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKLQlhY2NvdW50X2tlcm5lbF9zdGFjayh0c2stPnN0YWNrLCAtMSk7Ci0JYXJjaF9yZWxlYXNlX3RocmVhZF9zdGFjayh0c2stPnN0YWNrKTsKLQlmcmVlX3RocmVhZF9zdGFjayh0c2stPnN0YWNrKTsKKyNpZm5kZWYgQ09ORklHX1RIUkVBRF9JTkZPX0lOX1RBU0sKKwkvKgorCSAqIFRoZSB0YXNrIGlzIGZpbmFsbHkgZG9uZSB3aXRoIGJvdGggdGhlIHN0YWNrIGFuZCB0aHJlYWRfaW5mbywKKwkgKiBzbyBmcmVlIGJvdGguCisJICovCisJcmVsZWFzZV90YXNrX3N0YWNrKHRzayk7CisjZWxzZQorCS8qCisJICogSWYgdGhlIHRhc2sgaGFkIGEgc2VwYXJhdGUgc3RhY2sgYWxsb2NhdGlvbiwgaXQgc2hvdWxkIGJlIGdvbmUKKwkgKiBieSBub3cuCisJICovCisJV0FSTl9PTl9PTkNFKGF0b21pY19yZWFkKCZ0c2stPnN0YWNrX3JlZmNvdW50KSAhPSAwKTsKKyNlbmRpZgogCXJ0X211dGV4X2RlYnVnX3Rhc2tfZnJlZSh0c2spOwogCWZ0cmFjZV9ncmFwaF9leGl0X3Rhc2sodHNrKTsKIAlwdXRfc2VjY29tcF9maWx0ZXIodHNrKTsKQEAgLTMwMiw2ICs0MTgsNyBAQAogCiB2b2lkIF9faW5pdCBmb3JrX2luaXQodm9pZCkKIHsKKwlpbnQgaTsKICNpZm5kZWYgQ09ORklHX0FSQ0hfVEFTS19TVFJVQ1RfQUxMT0NBVE9SCiAjaWZuZGVmIEFSQ0hfTUlOX1RBU0tBTElHTgogI2RlZmluZSBBUkNIX01JTl9UQVNLQUxJR04JTDFfQ0FDSEVfQllURVMKQEAgLTMyMSw2ICs0MzgsMTAgQEAKIAlpbml0X3Rhc2suc2lnbmFsLT5ybGltW1JMSU1JVF9OUFJPQ10ucmxpbV9tYXggPSBtYXhfdGhyZWFkcy8yOwogCWluaXRfdGFzay5zaWduYWwtPnJsaW1bUkxJTUlUX1NJR1BFTkRJTkddID0KIAkJaW5pdF90YXNrLnNpZ25hbC0+cmxpbVtSTElNSVRfTlBST0NdOworCisJZm9yIChpID0gMDsgaSA8IFVDT1VOVF9DT1VOVFM7IGkrKykgeworCQlpbml0X3VzZXJfbnMudWNvdW50X21heFtpXSA9IG1heF90aHJlYWRzLzI7CisJfQogfQogCiBpbnQgX193ZWFrIGFyY2hfZHVwX3Rhc2tfc3RydWN0KHN0cnVjdCB0YXNrX3N0cnVjdCAqZHN0LApAQCAtMzQyLDYgKzQ2Myw3IEBACiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CiAJdW5zaWduZWQgbG9uZyAqc3RhY2s7CisJc3RydWN0IHZtX3N0cnVjdCAqc3RhY2tfdm1fYXJlYTsKIAlpbnQgZXJyOwogCiAJaWYgKG5vZGUgPT0gTlVNQV9OT19OT0RFKQpAQCAtMzU0LDExICs0NzYsMjYgQEAKIAlpZiAoIXN0YWNrKQogCQlnb3RvIGZyZWVfdHNrOwogCisJc3RhY2tfdm1fYXJlYSA9IHRhc2tfc3RhY2tfdm1fYXJlYSh0c2spOworCiAJZXJyID0gYXJjaF9kdXBfdGFza19zdHJ1Y3QodHNrLCBvcmlnKTsKKworCS8qCisJICogYXJjaF9kdXBfdGFza19zdHJ1Y3QoKSBjbG9iYmVycyB0aGUgc3RhY2stcmVsYXRlZCBmaWVsZHMuICBNYWtlCisJICogc3VyZSB0aGV5J3JlIHByb3Blcmx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2luZyBhbnkgc3RhY2stcmVsYXRlZAorCSAqIGZ1bmN0aW9ucyBhZ2Fpbi4KKwkgKi8KKwl0c2stPnN0YWNrID0gc3RhY2s7CisjaWZkZWYgQ09ORklHX1ZNQVBfU1RBQ0sKKwl0c2stPnN0YWNrX3ZtX2FyZWEgPSBzdGFja192bV9hcmVhOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1RIUkVBRF9JTkZPX0lOX1RBU0sKKwlhdG9taWNfc2V0KCZ0c2stPnN0YWNrX3JlZmNvdW50LCAxKTsKKyNlbmRpZgorCiAJaWYgKGVycikKIAkJZ290byBmcmVlX3N0YWNrOwogCi0JdHNrLT5zdGFjayA9IHN0YWNrOwogI2lmZGVmIENPTkZJR19TRUNDT01QCiAJLyoKIAkgKiBXZSBtdXN0IGhhbmRsZSBzZXR0aW5nIHVwIHNlY2NvbXAgZmlsdGVycyBvbmNlIHdlJ3JlIHVuZGVyCkBAIC0zOTAsMTQgKzUyNywxNCBAQAogCXRzay0+dGFza19mcmFnLnBhZ2UgPSBOVUxMOwogCXRzay0+d2FrZV9xLm5leHQgPSBOVUxMOwogCi0JYWNjb3VudF9rZXJuZWxfc3RhY2soc3RhY2ssIDEpOworCWFjY291bnRfa2VybmVsX3N0YWNrKHRzaywgMSk7CiAKIAlrY292X3Rhc2tfaW5pdCh0c2spOwogCiAJcmV0dXJuIHRzazsKIAogZnJlZV9zdGFjazoKLQlmcmVlX3RocmVhZF9zdGFjayhzdGFjayk7CisJZnJlZV90aHJlYWRfc3RhY2sodHNrKTsKIGZyZWVfdHNrOgogCWZyZWVfdGFza19zdHJ1Y3QodHNrKTsKIAlyZXR1cm4gTlVMTDsKQEAgLTc5OSw2ICs5MzYsMjkgQEAKIEVYUE9SVF9TWU1CT0woZ2V0X21tX2V4ZV9maWxlKTsKIAogLyoqCisgKiBnZXRfdGFza19leGVfZmlsZSAtIGFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIHRhc2sncyBleGVjdXRhYmxlIGZpbGUKKyAqCisgKiBSZXR1cm5zICVOVUxMIGlmIHRhc2sncyBtbSAoaWYgYW55KSBoYXMgbm8gYXNzb2NpYXRlZCBleGVjdXRhYmxlIGZpbGUgb3IKKyAqIHRoaXMgaXMgYSBrZXJuZWwgdGhyZWFkIHdpdGggYm9ycm93ZWQgbW0gKHNlZSB0aGUgY29tbWVudCBhYm92ZSBnZXRfdGFza19tbSkuCisgKiBVc2VyIG11c3QgcmVsZWFzZSBmaWxlIHZpYSBmcHV0KCkuCisgKi8KK3N0cnVjdCBmaWxlICpnZXRfdGFza19leGVfZmlsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJc3RydWN0IGZpbGUgKmV4ZV9maWxlID0gTlVMTDsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKworCXRhc2tfbG9jayh0YXNrKTsKKwltbSA9IHRhc2stPm1tOworCWlmIChtbSkgeworCQlpZiAoISh0YXNrLT5mbGFncyAmIFBGX0tUSFJFQUQpKQorCQkJZXhlX2ZpbGUgPSBnZXRfbW1fZXhlX2ZpbGUobW0pOworCX0KKwl0YXNrX3VubG9jayh0YXNrKTsKKwlyZXR1cm4gZXhlX2ZpbGU7Cit9CitFWFBPUlRfU1lNQk9MKGdldF90YXNrX2V4ZV9maWxlKTsKKworLyoqCiAgKiBnZXRfdGFza19tbSAtIGFjcXVpcmUgYSByZWZlcmVuY2UgdG8gdGhlIHRhc2sncyBtbQogICoKICAqIFJldHVybnMgJU5VTEwgaWYgdGhlIHRhc2sgaGFzIG5vIG1tLiAgQ2hlY2tzIFBGX0tUSFJFQUQgKG1lYW5pbmcKQEAgLTkxMywxNCArMTA3MywxMiBAQAogCWRlYWN0aXZhdGVfbW0odHNrLCBtbSk7CiAKIAkvKgotCSAqIElmIHdlJ3JlIGV4aXRpbmcgbm9ybWFsbHksIGNsZWFyIGEgdXNlci1zcGFjZSB0aWQgZmllbGQgaWYKLQkgKiByZXF1ZXN0ZWQuICBXZSBsZWF2ZSB0aGlzIGFsb25lIHdoZW4gZHlpbmcgYnkgc2lnbmFsLCB0byBsZWF2ZQotCSAqIHRoZSB2YWx1ZSBpbnRhY3QgaW4gYSBjb3JlIGR1bXAsIGFuZCB0byBzYXZlIHRoZSB1bm5lY2Vzc2FyeQotCSAqIHRyb3VibGUsIHNheSwgYSBraWxsZWQgdmZvcmsgcGFyZW50IHNob3VsZG4ndCB0b3VjaCB0aGlzIG1tLgotCSAqIFVzZXJsYW5kIG9ubHkgd2FudHMgdGhpcyBkb25lIGZvciBhIHN5c19leGl0LgorCSAqIFNpZ25hbCB1c2Vyc3BhY2UgaWYgd2UncmUgbm90IGV4aXRpbmcgd2l0aCBhIGNvcmUgZHVtcAorCSAqIGJlY2F1c2Ugd2Ugd2FudCB0byBsZWF2ZSB0aGUgdmFsdWUgaW50YWN0IGZvciBkZWJ1Z2dpbmcKKwkgKiBwdXJwb3Nlcy4KIAkgKi8KIAlpZiAodHNrLT5jbGVhcl9jaGlsZF90aWQpIHsKLQkJaWYgKCEodHNrLT5mbGFncyAmIFBGX1NJR05BTEVEKSAmJgorCQlpZiAoISh0c2stPnNpZ25hbC0+ZmxhZ3MgJiBTSUdOQUxfR1JPVVBfQ09SRURVTVApICYmCiAJCSAgICBhdG9taWNfcmVhZCgmbW0tPm1tX3VzZXJzKSA+IDEpIHsKIAkJCS8qCiAJCQkgKiBXZSBkb24ndCBjaGVjayB0aGUgZXJyb3IgY29kZSAtIGlmIHVzZXJzcGFjZSBoYXMKQEAgLTE0MDQsNyArMTU2Miw2IEBACiAJcC0+cmVhbF9zdGFydF90aW1lID0ga3RpbWVfZ2V0X2Jvb3RfbnMoKTsKIAlwLT5pb19jb250ZXh0ID0gTlVMTDsKIAlwLT5hdWRpdF9jb250ZXh0ID0gTlVMTDsKLQl0aHJlYWRncm91cF9jaGFuZ2VfYmVnaW4oY3VycmVudCk7CiAJY2dyb3VwX2ZvcmsocCk7CiAjaWZkZWYgQ09ORklHX05VTUEKIAlwLT5tZW1wb2xpY3kgPSBtcG9sX2R1cChwLT5tZW1wb2xpY3kpOwpAQCAtMTU1Niw2ICsxNzEzLDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmcC0+dGhyZWFkX2dyb3VwKTsKIAlwLT50YXNrX3dvcmtzID0gTlVMTDsKIAorCXRocmVhZGdyb3VwX2NoYW5nZV9iZWdpbihjdXJyZW50KTsKIAkvKgogCSAqIEVuc3VyZSB0aGF0IHRoZSBjZ3JvdXAgc3Vic3lzdGVtIHBvbGljaWVzIGFsbG93IHRoZSBuZXcgcHJvY2VzcyB0byBiZQogCSAqIGZvcmtlZC4gSXQgc2hvdWxkIGJlIG5vdGVkIHRoZSB0aGUgbmV3IHByb2Nlc3MncyBjc3Nfc2V0IGNhbiBiZSBjaGFuZ2VkCkBAIC0xNjU2LDYgKzE4MTQsNyBAQAogYmFkX2ZvcmtfY2FuY2VsX2Nncm91cDoKIAljZ3JvdXBfY2FuY2VsX2ZvcmsocCk7CiBiYWRfZm9ya19mcmVlX3BpZDoKKwl0aHJlYWRncm91cF9jaGFuZ2VfZW5kKGN1cnJlbnQpOwogCWlmIChwaWQgIT0gJmluaXRfc3RydWN0X3BpZCkKIAkJZnJlZV9waWQocGlkKTsKIGJhZF9mb3JrX2NsZWFudXBfdGhyZWFkOgpAQCAtMTY4OCwxMiArMTg0NywxMiBAQAogCW1wb2xfcHV0KHAtPm1lbXBvbGljeSk7CiBiYWRfZm9ya19jbGVhbnVwX3RocmVhZGdyb3VwX2xvY2s6CiAjZW5kaWYKLQl0aHJlYWRncm91cF9jaGFuZ2VfZW5kKGN1cnJlbnQpOwogCWRlbGF5YWNjdF90c2tfZnJlZShwKTsKIGJhZF9mb3JrX2NsZWFudXBfY291bnQ6CiAJYXRvbWljX2RlYygmcC0+Y3JlZC0+dXNlci0+cHJvY2Vzc2VzKTsKIAlleGl0X2NyZWRzKHApOwogYmFkX2ZvcmtfZnJlZToKKwlwdXRfdGFza19zdGFjayhwKTsKIAlmcmVlX3Rhc2socCk7CiBmb3JrX291dDoKIAlyZXR1cm4gRVJSX1BUUihyZXR2YWwpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2Z1dGV4LmMgYi9rZXJuZWwvZnV0ZXguYwppbmRleCA0NmNiM2EzLi4yYzRiZTQ2IDEwMDY0NAotLS0gYS9rZXJuZWwvZnV0ZXguYworKysgYi9rZXJuZWwvZnV0ZXguYwpAQCAtMzgxLDggKzM4MSwxMiBAQAogI2VuZGlmCiB9CiAKLS8qCi0gKiBXZSBoYXNoIG9uIHRoZSBrZXlzIHJldHVybmVkIGZyb20gZ2V0X2Z1dGV4X2tleSAoc2VlIGJlbG93KS4KKy8qKgorICogaGFzaF9mdXRleCAtIFJldHVybiB0aGUgaGFzaCBidWNrZXQgaW4gdGhlIGdsb2JhbCBoYXNoCisgKiBAa2V5OglQb2ludGVyIHRvIHRoZSBmdXRleCBrZXkgZm9yIHdoaWNoIHRoZSBoYXNoIGlzIGNhbGN1bGF0ZWQKKyAqCisgKiBXZSBoYXNoIG9uIHRoZSBrZXlzIHJldHVybmVkIGZyb20gZ2V0X2Z1dGV4X2tleSAoc2VlIGJlbG93KSBhbmQgcmV0dXJuIHRoZQorICogY29ycmVzcG9uZGluZyBoYXNoIGJ1Y2tldCBpbiB0aGUgZ2xvYmFsIGhhc2guCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgZnV0ZXhfaGFzaF9idWNrZXQgKmhhc2hfZnV0ZXgodW5pb24gZnV0ZXhfa2V5ICprZXkpCiB7CkBAIC0zOTIsNyArMzk2LDEyIEBACiAJcmV0dXJuICZmdXRleF9xdWV1ZXNbaGFzaCAmIChmdXRleF9oYXNoc2l6ZSAtIDEpXTsKIH0KIAotLyoKKworLyoqCisgKiBtYXRjaF9mdXRleCAtIENoZWNrIHdoZXRoZXIgdHdvIGZ1dGV4IGtleXMgYXJlIGVxdWFsCisgKiBAa2V5MToJUG9pbnRlciB0byBrZXkxCisgKiBAa2V5MjoJUG9pbnRlciB0byBrZXkyCisgKgogICogUmV0dXJuIDEgaWYgdHdvIGZ1dGV4X2tleXMgYXJlIGVxdWFsLCAwIG90aGVyd2lzZS4KICAqLwogc3RhdGljIGlubGluZSBpbnQgbWF0Y2hfZnV0ZXgodW5pb24gZnV0ZXhfa2V5ICprZXkxLCB1bmlvbiBmdXRleF9rZXkgKmtleTIpCmRpZmYgLS1naXQgYS9rZXJuZWwvaHVuZ190YXNrLmMgYi9rZXJuZWwvaHVuZ190YXNrLmMKaW5kZXggZDIzNDAyMi4uNDMyYzNkNyAxMDA2NDQKLS0tIGEva2VybmVsL2h1bmdfdGFzay5jCisrKyBiL2tlcm5lbC9odW5nX3Rhc2suYwpAQCAtMTE3LDcgKzExNyw3IEBACiAJcHJfZXJyKCJcImVjaG8gMCA+IC9wcm9jL3N5cy9rZXJuZWwvaHVuZ190YXNrX3RpbWVvdXRfc2Vjc1wiIgogCQkiIGRpc2FibGVzIHRoaXMgbWVzc2FnZS5cbiIpOwogCXNjaGVkX3Nob3dfdGFzayh0KTsKLQlkZWJ1Z19zaG93X2hlbGRfbG9ja3ModCk7CisJZGVidWdfc2hvd19hbGxfbG9ja3MoKTsKIAogCXRvdWNoX25taV93YXRjaGRvZygpOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL2FmZmluaXR5LmMgYi9rZXJuZWwvaXJxL2FmZmluaXR5LmMKaW5kZXggZjY4OTU5My4uMTdmNTFkNjMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvYWZmaW5pdHkuYworKysgYi9rZXJuZWwvaXJxL2FmZmluaXR5LmMKQEAgLTQsNTggKzQsMTUxIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogCi1zdGF0aWMgaW50IGdldF9maXJzdF9zaWJsaW5nKHVuc2lnbmVkIGludCBjcHUpCitzdGF0aWMgdm9pZCBpcnFfc3ByZWFkX2luaXRfb25lKHN0cnVjdCBjcHVtYXNrICppcnFtc2ssIHN0cnVjdCBjcHVtYXNrICpubXNrLAorCQkJCWludCBjcHVzX3Blcl92ZWMpCiB7Ci0JdW5zaWduZWQgaW50IHJldDsKKwljb25zdCBzdHJ1Y3QgY3B1bWFzayAqc2libG1zazsKKwlpbnQgY3B1LCBzaWJsOwogCi0JcmV0ID0gY3B1bWFza19maXJzdCh0b3BvbG9neV9zaWJsaW5nX2NwdW1hc2soY3B1KSk7Ci0JaWYgKHJldCA8IG5yX2NwdV9pZHMpCi0JCXJldHVybiByZXQ7Ci0JcmV0dXJuIGNwdTsKKwlmb3IgKCA7IGNwdXNfcGVyX3ZlYyA+IDA7ICkgeworCQljcHUgPSBjcHVtYXNrX2ZpcnN0KG5tc2spOworCisJCS8qIFNob3VsZCBub3QgaGFwcGVuLCBidXQgSSdtIHRvbyBsYXp5IHRvIHRoaW5rIGFib3V0IGl0ICovCisJCWlmIChjcHUgPj0gbnJfY3B1X2lkcykKKwkJCXJldHVybjsKKworCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsIG5tc2spOworCQljcHVtYXNrX3NldF9jcHUoY3B1LCBpcnFtc2spOworCQljcHVzX3Blcl92ZWMtLTsKKworCQkvKiBJZiB0aGUgY3B1IGhhcyBzaWJsaW5ncywgdXNlIHRoZW0gZmlyc3QgKi8KKwkJc2libG1zayA9IHRvcG9sb2d5X3NpYmxpbmdfY3B1bWFzayhjcHUpOworCQlmb3IgKHNpYmwgPSAtMTsgY3B1c19wZXJfdmVjID4gMDsgKSB7CisJCQlzaWJsID0gY3B1bWFza19uZXh0KHNpYmwsIHNpYmxtc2spOworCQkJaWYgKHNpYmwgPj0gbnJfY3B1X2lkcykKKwkJCQlicmVhazsKKwkJCWlmICghY3B1bWFza190ZXN0X2FuZF9jbGVhcl9jcHUoc2libCwgbm1zaykpCisJCQkJY29udGludWU7CisJCQljcHVtYXNrX3NldF9jcHUoc2libCwgaXJxbXNrKTsKKwkJCWNwdXNfcGVyX3ZlYy0tOworCQl9CisJfQogfQogCi0vKgotICogVGFrZSBhIG1hcCBvZiBvbmxpbmUgQ1BVcyBhbmQgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgaW50ZXJydXB0IHZlY3RvcnMKLSAqIGFuZCBnZW5lcmF0ZSBhbiBvdXRwdXQgY3B1bWFzayBzdWl0YWJsZSBmb3Igc3ByZWFkaW5nIE1TSS9NU0ktWCB2ZWN0b3JzCi0gKiBzbyB0aGF0IHRoZXkgYXJlIGRpc3RyaWJ1dGVkIGFzIGdvb2QgYXMgcG9zc2libGUgYXJvdW5kIHRoZSBDUFVzLiAgSWYKLSAqIG1vcmUgdmVjdG9ycyB0aGFuIENQVXMgYXJlIGF2YWlsYWJsZSB3ZSdsbCBtYXAgb25lIHRvIGVhY2ggQ1BVLAotICogb3RoZXJ3aXNlIHdlIG1hcCBvbmUgdG8gdGhlIGZpcnN0IHNpYmxpbmcgb2YgZWFjaCBzb2NrZXQuCi0gKgotICogSWYgdGhlcmUgYXJlIG1vcmUgdmVjdG9ycyB0aGFuIENQVXMgd2Ugd2lsbCBzdGlsbCBvbmx5IGhhdmUgb25lIGJpdAotICogc2V0IHBlciBDUFUsIGJ1dCBpbnRlcnJ1cHQgY29kZSB3aWxsIGtlZXAgb24gYXNzaWduaW5nIHRoZSB2ZWN0b3JzIGZyb20KLSAqIHRoZSBzdGFydCBvZiB0aGUgYml0bWFwIHVudGlsIHdlIHJ1biBvdXQgb2YgdmVjdG9ycy4KLSAqLwotc3RydWN0IGNwdW1hc2sgKmlycV9jcmVhdGVfYWZmaW5pdHlfbWFzayh1bnNpZ25lZCBpbnQgKm5yX3ZlY3MpCitzdGF0aWMgaW50IGdldF9ub2Rlc19pbl9jcHVtYXNrKGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrLCBub2RlbWFza190ICpub2RlbXNrKQogewotCXN0cnVjdCBjcHVtYXNrICphZmZpbml0eV9tYXNrOwotCXVuc2lnbmVkIGludCBtYXhfdmVjcyA9ICpucl92ZWNzOworCWludCBuLCBub2RlczsKIAotCWlmIChtYXhfdmVjcyA9PSAxKQotCQlyZXR1cm4gTlVMTDsKLQotCWFmZmluaXR5X21hc2sgPSBremFsbG9jKGNwdW1hc2tfc2l6ZSgpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWFmZmluaXR5X21hc2spIHsKLQkJKm5yX3ZlY3MgPSAxOwotCQlyZXR1cm4gTlVMTDsKKwkvKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgc3VwcGxpZWQgYWZmaW5pdHkgbWFzayAqLworCWZvciAobiA9IDAsIG5vZGVzID0gMDsgbiA8IG51bV9vbmxpbmVfbm9kZXMoKTsgbisrKSB7CisJCWlmIChjcHVtYXNrX2ludGVyc2VjdHMobWFzaywgY3B1bWFza19vZl9ub2RlKG4pKSkgeworCQkJbm9kZV9zZXQobiwgKm5vZGVtc2spOworCQkJbm9kZXMrKzsKKwkJfQogCX0KKwlyZXR1cm4gbm9kZXM7Cit9CiAKLQlpZiAobWF4X3ZlY3MgPj0gbnVtX29ubGluZV9jcHVzKCkpIHsKLQkJY3B1bWFza19jb3B5KGFmZmluaXR5X21hc2ssIGNwdV9vbmxpbmVfbWFzayk7Ci0JCSpucl92ZWNzID0gbnVtX29ubGluZV9jcHVzKCk7Ci0JfSBlbHNlIHsKLQkJdW5zaWduZWQgaW50IHZlY3MgPSAwLCBjcHU7CisvKioKKyAqIGlycV9jcmVhdGVfYWZmaW5pdHlfbWFza3MgLSBDcmVhdGUgYWZmaW5pdHkgbWFza3MgZm9yIG11bHRpcXVldWUgc3ByZWFkaW5nCisgKiBAYWZmaW5pdHk6CQlUaGUgYWZmaW5pdHkgbWFzayB0byBzcHJlYWQuIElmIE5VTEwgY3B1X29ubGluZV9tYXNrCisgKgkJCWlzIHVzZWQKKyAqIEBudmVjczoJCVRoZSBudW1iZXIgb2YgdmVjdG9ycworICoKKyAqIFJldHVybnMgdGhlIG1hc2tzIHBvaW50ZXIgb3IgTlVMTCBpZiBhbGxvY2F0aW9uIGZhaWxlZC4KKyAqLworc3RydWN0IGNwdW1hc2sgKmlycV9jcmVhdGVfYWZmaW5pdHlfbWFza3MoY29uc3Qgc3RydWN0IGNwdW1hc2sgKmFmZmluaXR5LAorCQkJCQkgIGludCBudmVjKQoreworCWludCBuLCBub2RlcywgdmVjc19wZXJfbm9kZSwgY3B1c19wZXJfdmVjLCBleHRyYV92ZWNzLCBjdXJ2ZWMgPSAwOworCW5vZGVtYXNrX3Qgbm9kZW1zayA9IE5PREVfTUFTS19OT05FOworCXN0cnVjdCBjcHVtYXNrICptYXNrczsKKwljcHVtYXNrX3Zhcl90IG5tc2s7CiAKLQkJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKLQkJCWlmIChjcHUgPT0gZ2V0X2ZpcnN0X3NpYmxpbmcoY3B1KSkgewotCQkJCWNwdW1hc2tfc2V0X2NwdShjcHUsIGFmZmluaXR5X21hc2spOwotCQkJCXZlY3MrKzsKLQkJCX0KKwlpZiAoIXphbGxvY19jcHVtYXNrX3Zhcigmbm1zaywgR0ZQX0tFUk5FTCkpCisJCXJldHVybiBOVUxMOwogCi0JCQlpZiAoLS1tYXhfdmVjcyA9PSAwKQorCW1hc2tzID0ga3phbGxvYyhudmVjICogc2l6ZW9mKCptYXNrcyksIEdGUF9LRVJORUwpOworCWlmICghbWFza3MpCisJCWdvdG8gb3V0OworCisJLyogU3RhYmlsaXplIHRoZSBjcHVtYXNrcyAqLworCWdldF9vbmxpbmVfY3B1cygpOworCS8qIElmIHRoZSBzdXBwbGllZCBhZmZpbml0eSBtYXNrIGlzIE5VTEwsIHVzZSBjcHUgb25saW5lIG1hc2sgKi8KKwlpZiAoIWFmZmluaXR5KQorCQlhZmZpbml0eSA9IGNwdV9vbmxpbmVfbWFzazsKKworCW5vZGVzID0gZ2V0X25vZGVzX2luX2NwdW1hc2soYWZmaW5pdHksICZub2RlbXNrKTsKKworCS8qCisJICogSWYgdGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgbWFzayBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdGhlCisJICogbnVtYmVyIG9mIHZlY3RvcnMgd2UganVzdCBzcHJlYWQgdGhlIHZlY3RvcnMgYWNyb3NzIHRoZSBub2Rlcy4KKwkgKi8KKwlpZiAobnZlYyA8PSBub2RlcykgeworCQlmb3JfZWFjaF9ub2RlX21hc2sobiwgbm9kZW1zaykgeworCQkJY3B1bWFza19jb3B5KG1hc2tzICsgY3VydmVjLCBjcHVtYXNrX29mX25vZGUobikpOworCQkJaWYgKCsrY3VydmVjID09IG52ZWMpCiAJCQkJYnJlYWs7CiAJCX0KLQkJKm5yX3ZlY3MgPSB2ZWNzOworCQlnb3RvIG91dG9ubDsKIAl9CiAKLQlyZXR1cm4gYWZmaW5pdHlfbWFzazsKKwkvKiBTcHJlYWQgdGhlIHZlY3RvcnMgcGVyIG5vZGUgKi8KKwl2ZWNzX3Blcl9ub2RlID0gbnZlYyAvIG5vZGVzOworCS8qIEFjY291bnQgZm9yIHJvdW5kaW5nIGVycm9ycyAqLworCWV4dHJhX3ZlY3MgPSBudmVjIC0gKG5vZGVzICogdmVjc19wZXJfbm9kZSk7CisKKwlmb3JfZWFjaF9ub2RlX21hc2sobiwgbm9kZW1zaykgeworCQlpbnQgbmNwdXMsIHYsIHZlY3NfdG9fYXNzaWduID0gdmVjc19wZXJfbm9kZTsKKworCQkvKiBHZXQgdGhlIGNwdXMgb24gdGhpcyBub2RlIHdoaWNoIGFyZSBpbiB0aGUgbWFzayAqLworCQljcHVtYXNrX2FuZChubXNrLCBhZmZpbml0eSwgY3B1bWFza19vZl9ub2RlKG4pKTsKKworCQkvKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBjcHVzIHBlciB2ZWN0b3IgKi8KKwkJbmNwdXMgPSBjcHVtYXNrX3dlaWdodChubXNrKTsKKworCQlmb3IgKHYgPSAwOyBjdXJ2ZWMgPCBudmVjICYmIHYgPCB2ZWNzX3RvX2Fzc2lnbjsgY3VydmVjKyssIHYrKykgeworCQkJY3B1c19wZXJfdmVjID0gbmNwdXMgLyB2ZWNzX3RvX2Fzc2lnbjsKKworCQkJLyogQWNjb3VudCBmb3IgZXh0cmEgdmVjdG9ycyB0byBjb21wZW5zYXRlIHJvdW5kaW5nIGVycm9ycyAqLworCQkJaWYgKGV4dHJhX3ZlY3MpIHsKKwkJCQljcHVzX3Blcl92ZWMrKzsKKwkJCQlpZiAoIS0tZXh0cmFfdmVjcykKKwkJCQkJdmVjc19wZXJfbm9kZSsrOworCQkJfQorCQkJaXJxX3NwcmVhZF9pbml0X29uZShtYXNrcyArIGN1cnZlYywgbm1zaywgY3B1c19wZXJfdmVjKTsKKwkJfQorCisJCWlmIChjdXJ2ZWMgPj0gbnZlYykKKwkJCWJyZWFrOworCX0KKworb3V0b25sOgorCXB1dF9vbmxpbmVfY3B1cygpOworb3V0OgorCWZyZWVfY3B1bWFza192YXIobm1zayk7CisJcmV0dXJuIG1hc2tzOworfQorCisvKioKKyAqIGlycV9jYWxjX2FmZmluaXR5X3ZlY3RvcnMgLSBDYWxjdWxhdGUgdG8gb3B0aW1hbCBudW1iZXIgb2YgdmVjdG9ycyBmb3IgYSBnaXZlbiBhZmZpbml0eSBtYXNrCisgKiBAYWZmaW5pdHk6CQlUaGUgYWZmaW5pdHkgbWFzayB0byBzcHJlYWQuIElmIE5VTEwgY3B1X29ubGluZV9tYXNrCisgKgkJCWlzIHVzZWQKKyAqIEBtYXh2ZWM6CQlUaGUgbWF4aW11bSBudW1iZXIgb2YgdmVjdG9ycyBhdmFpbGFibGUKKyAqLworaW50IGlycV9jYWxjX2FmZmluaXR5X3ZlY3RvcnMoY29uc3Qgc3RydWN0IGNwdW1hc2sgKmFmZmluaXR5LCBpbnQgbWF4dmVjKQoreworCWludCBjcHVzLCByZXQ7CisKKwkvKiBTdGFiaWxpemUgdGhlIGNwdW1hc2tzICovCisJZ2V0X29ubGluZV9jcHVzKCk7CisJLyogSWYgdGhlIHN1cHBsaWVkIGFmZmluaXR5IG1hc2sgaXMgTlVMTCwgdXNlIGNwdSBvbmxpbmUgbWFzayAqLworCWlmICghYWZmaW5pdHkpCisJCWFmZmluaXR5ID0gY3B1X29ubGluZV9tYXNrOworCisJY3B1cyA9IGNwdW1hc2tfd2VpZ2h0KGFmZmluaXR5KTsKKwlyZXQgPSAoY3B1cyA8IG1heHZlYykgPyBjcHVzIDogbWF4dmVjOworCisJcHV0X29ubGluZV9jcHVzKCk7CisJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvY2hpcC5jIGIva2VybmVsL2lycS9jaGlwLmMKaW5kZXggYjRjMWJjNy4uYmUzYzM0ZSAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9jaGlwLmMKKysrIGIva2VybmVsL2lycS9jaGlwLmMKQEAgLTc2LDcgKzc2LDYgQEAKIAlpZiAoIWRlc2MpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JdHlwZSAmPSBJUlFfVFlQRV9TRU5TRV9NQVNLOwogCXJldCA9IF9faXJxX3NldF90cmlnZ2VyKGRlc2MsIHR5cGUpOwogCWlycV9wdXRfZGVzY19idXN1bmxvY2soZGVzYywgZmxhZ3MpOwogCXJldHVybiByZXQ7CkBAIC03NTYsNyArNzU1LDYgQEAKIHsKIAlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBpcnFfZGVzY19nZXRfY2hpcChkZXNjKTsKIAlzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb24gPSBkZXNjLT5hY3Rpb247Ci0Jdm9pZCAqZGV2X2lkID0gcmF3X2NwdV9wdHIoYWN0aW9uLT5wZXJjcHVfZGV2X2lkKTsKIAl1bnNpZ25lZCBpbnQgaXJxID0gaXJxX2Rlc2NfZ2V0X2lycShkZXNjKTsKIAlpcnFyZXR1cm5fdCByZXM7CiAKQEAgLTc2NSwxNSArNzYzLDI2IEBACiAJaWYgKGNoaXAtPmlycV9hY2spCiAJCWNoaXAtPmlycV9hY2soJmRlc2MtPmlycV9kYXRhKTsKIAotCXRyYWNlX2lycV9oYW5kbGVyX2VudHJ5KGlycSwgYWN0aW9uKTsKLQlyZXMgPSBhY3Rpb24tPmhhbmRsZXIoaXJxLCBkZXZfaWQpOwotCXRyYWNlX2lycV9oYW5kbGVyX2V4aXQoaXJxLCBhY3Rpb24sIHJlcyk7CisJaWYgKGxpa2VseShhY3Rpb24pKSB7CisJCXRyYWNlX2lycV9oYW5kbGVyX2VudHJ5KGlycSwgYWN0aW9uKTsKKwkJcmVzID0gYWN0aW9uLT5oYW5kbGVyKGlycSwgcmF3X2NwdV9wdHIoYWN0aW9uLT5wZXJjcHVfZGV2X2lkKSk7CisJCXRyYWNlX2lycV9oYW5kbGVyX2V4aXQoaXJxLCBhY3Rpb24sIHJlcyk7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwkJYm9vbCBlbmFibGVkID0gY3B1bWFza190ZXN0X2NwdShjcHUsIGRlc2MtPnBlcmNwdV9lbmFibGVkKTsKKworCQlpZiAoZW5hYmxlZCkKKwkJCWlycV9wZXJjcHVfZGlzYWJsZShkZXNjLCBjcHUpOworCisJCXByX2Vycl9vbmNlKCJTcHVyaW91cyVzIHBlcmNwdSBJUlEldSBvbiBDUFUldVxuIiwKKwkJCSAgICBlbmFibGVkID8gIiBhbmQgdW5tYXNrZWQiIDogIiIsIGlycSwgY3B1KTsKKwl9CiAKIAlpZiAoY2hpcC0+aXJxX2VvaSkKIAkJY2hpcC0+aXJxX2VvaSgmZGVzYy0+aXJxX2RhdGEpOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogX19pcnFfZG9fc2V0X2hhbmRsZXIoc3RydWN0IGlycV9kZXNjICpkZXNjLCBpcnFfZmxvd19oYW5kbGVyX3QgaGFuZGxlLAogCQkgICAgIGludCBpc19jaGFpbmVkLCBjb25zdCBjaGFyICpuYW1lKQogewpAQCAtODIwLDYgKzgyOSwyMSBAQAogCWRlc2MtPm5hbWUgPSBuYW1lOwogCiAJaWYgKGhhbmRsZSAhPSBoYW5kbGVfYmFkX2lycSAmJiBpc19jaGFpbmVkKSB7CisJCXVuc2lnbmVkIGludCB0eXBlID0gaXJxZF9nZXRfdHJpZ2dlcl90eXBlKCZkZXNjLT5pcnFfZGF0YSk7CisKKwkJLyoKKwkJICogV2UncmUgYWJvdXQgdG8gc3RhcnQgdGhpcyBpbnRlcnJ1cHQgaW1tZWRpYXRlbHksCisJCSAqIGhlbmNlIHRoZSBuZWVkIHRvIHNldCB0aGUgdHJpZ2dlciBjb25maWd1cmF0aW9uLgorCQkgKiBCdXQgdGhlIC5zZXRfdHlwZSBjYWxsYmFjayBtYXkgaGF2ZSBvdmVycmlkZGVuIHRoZQorCQkgKiBmbG93IGhhbmRsZXIsIGlnbm9yaW5nIHRoYXQgd2UncmUgZGVhbGluZyB3aXRoIGEKKwkJICogY2hhaW5lZCBpbnRlcnJ1cHQuIFJlc2V0IGl0IGltbWVkaWF0ZWx5IGJlY2F1c2Ugd2UKKwkJICogZG8ga25vdyBiZXR0ZXIuCisJCSAqLworCQlpZiAodHlwZSAhPSBJUlFfVFlQRV9OT05FKSB7CisJCQlfX2lycV9zZXRfdHJpZ2dlcihkZXNjLCB0eXBlKTsKKwkJCWRlc2MtPmhhbmRsZV9pcnEgPSBoYW5kbGU7CisJCX0KKwogCQlpcnFfc2V0dGluZ3Nfc2V0X25vcHJvYmUoZGVzYyk7CiAJCWlycV9zZXR0aW5nc19zZXRfbm9yZXF1ZXN0KGRlc2MpOwogCQlpcnFfc2V0dGluZ3Nfc2V0X25vdGhyZWFkKGRlc2MpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9nZW5lcmljLWNoaXAuYyBiL2tlcm5lbC9pcnEvZ2VuZXJpYy1jaGlwLmMKaW5kZXggYWJkMjg2YS4uZWUzMjg3MCAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9nZW5lcmljLWNoaXAuYworKysgYi9rZXJuZWwvaXJxL2dlbmVyaWMtY2hpcC5jCkBAIC0yNjAsOSArMjYwLDkgQEAKIH0KIAogLyoqCi0gKiBpcnFfYWxsb2NfZG9tYWluX2dlbmVyaWNfY2hpcCAtIEFsbG9jYXRlIGdlbmVyaWMgY2hpcHMgZm9yIGFuIGlycSBkb21haW4KKyAqIF9faXJxX2FsbG9jX2RvbWFpbl9nZW5lcmljX2NoaXAgLSBBbGxvY2F0ZSBnZW5lcmljIGNoaXBzIGZvciBhbiBpcnEgZG9tYWluCiAgKiBAZDoJCQlpcnEgZG9tYWluIGZvciB3aGljaCB0byBhbGxvY2F0ZSBjaGlwcwotICogQGlycXNfcGVyX2NoaXA6CU51bWJlciBvZiBpbnRlcnJ1cHRzIGVhY2ggY2hpcCBoYW5kbGVzCisgKiBAaXJxc19wZXJfY2hpcDoJTnVtYmVyIG9mIGludGVycnVwdHMgZWFjaCBjaGlwIGhhbmRsZXMgKG1heCAzMikKICAqIEBudW1fY3Q6CQlOdW1iZXIgb2YgaXJxX2NoaXBfdHlwZSBpbnN0YW5jZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMKICAqIEBuYW1lOgkJTmFtZSBvZiB0aGUgaXJxIGNoaXAKICAqIEBoYW5kbGVyOgkJRGVmYXVsdCBmbG93IGhhbmRsZXIgYXNzb2NpYXRlZCB3aXRoIHRoZXNlIGNoaXBzCkBAIC0yNzAsMTEgKzI3MCwxMSBAQAogICogQHNldDoJCUlSUV8qIGJpdHMgdG8gc2V0IGluIHRoZSBtYXBwaW5nIGZ1bmN0aW9uCiAgKiBAZ2NmbGFnczoJCUdlbmVyaWMgY2hpcCBzcGVjaWZpYyBzZXR1cCBmbGFncwogICovCi1pbnQgaXJxX2FsbG9jX2RvbWFpbl9nZW5lcmljX2NoaXBzKHN0cnVjdCBpcnFfZG9tYWluICpkLCBpbnQgaXJxc19wZXJfY2hpcCwKLQkJCQkgICBpbnQgbnVtX2N0LCBjb25zdCBjaGFyICpuYW1lLAotCQkJCSAgIGlycV9mbG93X2hhbmRsZXJfdCBoYW5kbGVyLAotCQkJCSAgIHVuc2lnbmVkIGludCBjbHIsIHVuc2lnbmVkIGludCBzZXQsCi0JCQkJICAgZW51bSBpcnFfZ2NfZmxhZ3MgZ2NmbGFncykKK2ludCBfX2lycV9hbGxvY19kb21haW5fZ2VuZXJpY19jaGlwcyhzdHJ1Y3QgaXJxX2RvbWFpbiAqZCwgaW50IGlycXNfcGVyX2NoaXAsCisJCQkJICAgICBpbnQgbnVtX2N0LCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICAgaXJxX2Zsb3dfaGFuZGxlcl90IGhhbmRsZXIsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgY2xyLCB1bnNpZ25lZCBpbnQgc2V0LAorCQkJCSAgICAgZW51bSBpcnFfZ2NfZmxhZ3MgZ2NmbGFncykKIHsKIAlzdHJ1Y3QgaXJxX2RvbWFpbl9jaGlwX2dlbmVyaWMgKmRnYzsKIAlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2M7CkBAIC0zMjYsNyArMzI2LDIxIEBACiAJZC0+bmFtZSA9IG5hbWU7CiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChpcnFfYWxsb2NfZG9tYWluX2dlbmVyaWNfY2hpcHMpOworRVhQT1JUX1NZTUJPTF9HUEwoX19pcnFfYWxsb2NfZG9tYWluX2dlbmVyaWNfY2hpcHMpOworCitzdGF0aWMgc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKgorX19pcnFfZ2V0X2RvbWFpbl9nZW5lcmljX2NoaXAoc3RydWN0IGlycV9kb21haW4gKmQsIHVuc2lnbmVkIGludCBod19pcnEpCit7CisJc3RydWN0IGlycV9kb21haW5fY2hpcF9nZW5lcmljICpkZ2MgPSBkLT5nYzsKKwlpbnQgaWR4OworCisJaWYgKCFkZ2MpCisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCWlkeCA9IGh3X2lycSAvIGRnYy0+aXJxc19wZXJfY2hpcDsKKwlpZiAoaWR4ID49IGRnYy0+bnVtX2NoaXBzKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwlyZXR1cm4gZGdjLT5nY1tpZHhdOworfQogCiAvKioKICAqIGlycV9nZXRfZG9tYWluX2dlbmVyaWNfY2hpcCAtIEdldCBhIHBvaW50ZXIgdG8gdGhlIGdlbmVyaWMgY2hpcCBvZiBhIGh3X2lycQpAQCAtMzM2LDE1ICszNTAsOSBAQAogc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKgogaXJxX2dldF9kb21haW5fZ2VuZXJpY19jaGlwKHN0cnVjdCBpcnFfZG9tYWluICpkLCB1bnNpZ25lZCBpbnQgaHdfaXJxKQogewotCXN0cnVjdCBpcnFfZG9tYWluX2NoaXBfZ2VuZXJpYyAqZGdjID0gZC0+Z2M7Ci0JaW50IGlkeDsKKwlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2MgPSBfX2lycV9nZXRfZG9tYWluX2dlbmVyaWNfY2hpcChkLCBod19pcnEpOwogCi0JaWYgKCFkZ2MpCi0JCXJldHVybiBOVUxMOwotCWlkeCA9IGh3X2lycSAvIGRnYy0+aXJxc19wZXJfY2hpcDsKLQlpZiAoaWR4ID49IGRnYy0+bnVtX2NoaXBzKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gZGdjLT5nY1tpZHhdOworCXJldHVybiAhSVNfRVJSKGdjKSA/IGdjIDogTlVMTDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlycV9nZXRfZG9tYWluX2dlbmVyaWNfY2hpcCk7CiAKQEAgLTM2OCwxMyArMzc2LDkgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpZHg7CiAKLQlpZiAoIWQtPmdjKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlkeCA9IGh3X2lycSAvIGRnYy0+aXJxc19wZXJfY2hpcDsKLQlpZiAoaWR4ID49IGRnYy0+bnVtX2NoaXBzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlnYyA9IGRnYy0+Z2NbaWR4XTsKKwlnYyA9IF9faXJxX2dldF9kb21haW5fZ2VuZXJpY19jaGlwKGQsIGh3X2lycSk7CisJaWYgKElTX0VSUihnYykpCisJCXJldHVybiBQVFJfRVJSKGdjKTsKIAogCWlkeCA9IGh3X2lycSAlIGRnYy0+aXJxc19wZXJfY2hpcDsKIApAQCAtNDA5LDEwICs0MTMsMzAgQEAKIAlpcnFfbW9kaWZ5X3N0YXR1cyh2aXJxLCBkZ2MtPmlycV9mbGFnc190b19jbGVhciwgZGdjLT5pcnFfZmxhZ3NfdG9fc2V0KTsKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGlycV9tYXBfZ2VuZXJpY19jaGlwKTsKKworc3RhdGljIHZvaWQgaXJxX3VubWFwX2dlbmVyaWNfY2hpcChzdHJ1Y3QgaXJxX2RvbWFpbiAqZCwgdW5zaWduZWQgaW50IHZpcnEpCit7CisJc3RydWN0IGlycV9kYXRhICpkYXRhID0gaXJxX2RvbWFpbl9nZXRfaXJxX2RhdGEoZCwgdmlycSk7CisJc3RydWN0IGlycV9kb21haW5fY2hpcF9nZW5lcmljICpkZ2MgPSBkLT5nYzsKKwl1bnNpZ25lZCBpbnQgaHdfaXJxID0gZGF0YS0+aHdpcnE7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjOworCWludCBpcnFfaWR4OworCisJZ2MgPSBpcnFfZ2V0X2RvbWFpbl9nZW5lcmljX2NoaXAoZCwgaHdfaXJxKTsKKwlpZiAoIWdjKQorCQlyZXR1cm47CisKKwlpcnFfaWR4ID0gaHdfaXJxICUgZGdjLT5pcnFzX3Blcl9jaGlwOworCisJY2xlYXJfYml0KGlycV9pZHgsICZnYy0+aW5zdGFsbGVkKTsKKwlpcnFfZG9tYWluX3NldF9pbmZvKGQsIHZpcnEsIGh3X2lycSwgJm5vX2lycV9jaGlwLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkJICAgIE5VTEwpOworCit9CiAKIHN0cnVjdCBpcnFfZG9tYWluX29wcyBpcnFfZ2VuZXJpY19jaGlwX29wcyA9IHsKIAkubWFwCT0gaXJxX21hcF9nZW5lcmljX2NoaXAsCisJLnVubWFwICA9IGlycV91bm1hcF9nZW5lcmljX2NoaXAsCiAJLnhsYXRlCT0gaXJxX2RvbWFpbl94bGF0ZV9vbmV0d29jZWxsLAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKGlycV9nZW5lcmljX2NoaXBfb3BzKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvaXJxZGVzYy5jIGIva2VybmVsL2lycS9pcnFkZXNjLmMKaW5kZXggYTYyM2I0NC4uMDBiYjBhZSAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9pcnFkZXNjLmMKKysrIGIva2VybmVsL2lycS9pcnFkZXNjLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9yYWRpeC10cmVlLmg+CiAjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KIAogI2luY2x1ZGUgImludGVybmFscy5oIgogCkBAIC0xMjMsNiArMTI0LDE4MSBAQAogCiAjaWZkZWYgQ09ORklHX1NQQVJTRV9JUlEKIAorc3RhdGljIHZvaWQgaXJxX2tvYmpfcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqa29iaik7CisKKyNpZmRlZiBDT05GSUdfU1lTRlMKK3N0YXRpYyBzdHJ1Y3Qga29iamVjdCAqaXJxX2tvYmpfYmFzZTsKKworI2RlZmluZSBJUlFfQVRUUl9STyhfbmFtZSkgXAorc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBfbmFtZSMjX2F0dHIgPSBfX0FUVFJfUk8oX25hbWUpCisKK3N0YXRpYyBzc2l6ZV90IHBlcl9jcHVfY291bnRfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgaXJxX2Rlc2MsIGtvYmopOworCWludCBjcHUsIGlycSA9IGRlc2MtPmlycV9kYXRhLmlycTsKKwlzc2l6ZV90IHJldCA9IDA7CisJY2hhciAqcCA9ICIiOworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQl1bnNpZ25lZCBpbnQgYyA9IGtzdGF0X2lycXNfY3B1KGlycSwgY3B1KTsKKworCQlyZXQgKz0gc2NucHJpbnRmKGJ1ZiArIHJldCwgUEFHRV9TSVpFIC0gcmV0LCAiJXMldSIsIHAsIGMpOworCQlwID0gIiwiOworCX0KKworCXJldCArPSBzY25wcmludGYoYnVmICsgcmV0LCBQQUdFX1NJWkUgLSByZXQsICJcbiIpOworCXJldHVybiByZXQ7Cit9CitJUlFfQVRUUl9STyhwZXJfY3B1X2NvdW50KTsKKworc3RhdGljIHNzaXplX3QgY2hpcF9uYW1lX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkgICAgICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGlycV9kZXNjLCBrb2JqKTsKKwlzc2l6ZV90IHJldCA9IDA7CisKKwlyYXdfc3Bpbl9sb2NrX2lycSgmZGVzYy0+bG9jayk7CisJaWYgKGRlc2MtPmlycV9kYXRhLmNoaXAgJiYgZGVzYy0+aXJxX2RhdGEuY2hpcC0+bmFtZSkgeworCQlyZXQgPSBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwKKwkJCQlkZXNjLT5pcnFfZGF0YS5jaGlwLT5uYW1lKTsKKwl9CisJcmF3X3NwaW5fdW5sb2NrX2lycSgmZGVzYy0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorSVJRX0FUVFJfUk8oY2hpcF9uYW1lKTsKKworc3RhdGljIHNzaXplX3QgaHdpcnFfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCSAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBpcnFfZGVzYywga29iaik7CisJc3NpemVfdCByZXQgPSAwOworCisJcmF3X3NwaW5fbG9ja19pcnEoJmRlc2MtPmxvY2spOworCWlmIChkZXNjLT5pcnFfZGF0YS5kb21haW4pCisJCXJldCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIChpbnQpZGVzYy0+aXJxX2RhdGEuaHdpcnEpOworCXJhd19zcGluX3VubG9ja19pcnEoJmRlc2MtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KK0lSUV9BVFRSX1JPKGh3aXJxKTsKKworc3RhdGljIHNzaXplX3QgdHlwZV9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgaXJxX2Rlc2MsIGtvYmopOworCXNzaXplX3QgcmV0ID0gMDsKKworCXJhd19zcGluX2xvY2tfaXJxKCZkZXNjLT5sb2NrKTsKKwlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVzXG4iLAorCQkgICAgICBpcnFkX2lzX2xldmVsX3R5cGUoJmRlc2MtPmlycV9kYXRhKSA/ICJsZXZlbCIgOiAiZWRnZSIpOworCXJhd19zcGluX3VubG9ja19pcnEoJmRlc2MtPmxvY2spOworCisJcmV0dXJuIHJldDsKKworfQorSVJRX0FUVFJfUk8odHlwZSk7CisKK3N0YXRpYyBzc2l6ZV90IG5hbWVfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCSBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGlycV9kZXNjLCBrb2JqKTsKKwlzc2l6ZV90IHJldCA9IDA7CisKKwlyYXdfc3Bpbl9sb2NrX2lycSgmZGVzYy0+bG9jayk7CisJaWYgKGRlc2MtPm5hbWUpCisJCXJldCA9IHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBkZXNjLT5uYW1lKTsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxKCZkZXNjLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CitJUlFfQVRUUl9STyhuYW1lKTsKKworc3RhdGljIHNzaXplX3QgYWN0aW9uc19zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJICAgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgaXJxX2Rlc2MsIGtvYmopOworCXN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbjsKKwlzc2l6ZV90IHJldCA9IDA7CisJY2hhciAqcCA9ICIiOworCisJcmF3X3NwaW5fbG9ja19pcnEoJmRlc2MtPmxvY2spOworCWZvciAoYWN0aW9uID0gZGVzYy0+YWN0aW9uOyBhY3Rpb24gIT0gTlVMTDsgYWN0aW9uID0gYWN0aW9uLT5uZXh0KSB7CisJCXJldCArPSBzY25wcmludGYoYnVmICsgcmV0LCBQQUdFX1NJWkUgLSByZXQsICIlcyVzIiwKKwkJCQkgcCwgYWN0aW9uLT5uYW1lKTsKKwkJcCA9ICIsIjsKKwl9CisJcmF3X3NwaW5fdW5sb2NrX2lycSgmZGVzYy0+bG9jayk7CisKKwlpZiAocmV0KQorCQlyZXQgKz0gc2NucHJpbnRmKGJ1ZiArIHJldCwgUEFHRV9TSVpFIC0gcmV0LCAiXG4iKTsKKworCXJldHVybiByZXQ7Cit9CitJUlFfQVRUUl9STyhhY3Rpb25zKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmlycV9hdHRyc1tdID0geworCSZwZXJfY3B1X2NvdW50X2F0dHIuYXR0ciwKKwkmY2hpcF9uYW1lX2F0dHIuYXR0ciwKKwkmaHdpcnFfYXR0ci5hdHRyLAorCSZ0eXBlX2F0dHIuYXR0ciwKKwkmbmFtZV9hdHRyLmF0dHIsCisJJmFjdGlvbnNfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGlycV9rb2JqX3R5cGUgPSB7CisJLnJlbGVhc2UJPSBpcnFfa29ial9yZWxlYXNlLAorCS5zeXNmc19vcHMJPSAma29ial9zeXNmc19vcHMsCisJLmRlZmF1bHRfYXR0cnMJPSBpcnFfYXR0cnMsCit9OworCitzdGF0aWMgdm9pZCBpcnFfc3lzZnNfYWRkKGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlpZiAoaXJxX2tvYmpfYmFzZSkgeworCQkvKgorCQkgKiBDb250aW51ZSBldmVuIGluIGNhc2Ugb2YgZmFpbHVyZSBhcyB0aGlzIGlzIG5vdGhpbmcKKwkJICogY3J1Y2lhbC4KKwkJICovCisJCWlmIChrb2JqZWN0X2FkZCgmZGVzYy0+a29iaiwgaXJxX2tvYmpfYmFzZSwgIiVkIiwgaXJxKSkKKwkJCXByX3dhcm4oIkZhaWxlZCB0byBhZGQga29iamVjdCBmb3IgaXJxICVkXG4iLCBpcnEpOworCX0KK30KKworc3RhdGljIGludCBfX2luaXQgaXJxX3N5c2ZzX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CisJaW50IGlycTsKKworCS8qIFByZXZlbnQgY29uY3VycmVudCBpcnEgYWxsb2MvZnJlZSAqLworCWlycV9sb2NrX3NwYXJzZSgpOworCisJaXJxX2tvYmpfYmFzZSA9IGtvYmplY3RfY3JlYXRlX2FuZF9hZGQoImlycSIsIGtlcm5lbF9rb2JqKTsKKwlpZiAoIWlycV9rb2JqX2Jhc2UpIHsKKwkJaXJxX3VubG9ja19zcGFyc2UoKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogQWRkIHRoZSBhbHJlYWR5IGFsbG9jYXRlZCBpbnRlcnJ1cHRzICovCisJZm9yX2VhY2hfaXJxX2Rlc2MoaXJxLCBkZXNjKQorCQlpcnFfc3lzZnNfYWRkKGlycSwgZGVzYyk7CisJaXJxX3VubG9ja19zcGFyc2UoKTsKKworCXJldHVybiAwOworfQorcG9zdGNvcmVfaW5pdGNhbGwoaXJxX3N5c2ZzX2luaXQpOworCisjZWxzZSAvKiAhQ09ORklHX1NZU0ZTICovCisKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGlycV9rb2JqX3R5cGUgPSB7CisJLnJlbGVhc2UJPSBpcnFfa29ial9yZWxlYXNlLAorfTsKKworc3RhdGljIHZvaWQgaXJxX3N5c2ZzX2FkZChpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpIHt9CisKKyNlbmRpZiAvKiBDT05GSUdfU1lTRlMgKi8KKwogc3RhdGljIFJBRElYX1RSRUUoaXJxX2Rlc2NfdHJlZSwgR0ZQX0tFUk5FTCk7CiAKIHN0YXRpYyB2b2lkIGlycV9pbnNlcnRfZGVzYyh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCkBAIC0xODcsNiArMzYzLDcgQEAKIAogCWRlc2Nfc2V0X2RlZmF1bHRzKGlycSwgZGVzYywgbm9kZSwgYWZmaW5pdHksIG93bmVyKTsKIAlpcnFkX3NldCgmZGVzYy0+aXJxX2RhdGEsIGZsYWdzKTsKKwlrb2JqZWN0X2luaXQoJmRlc2MtPmtvYmosICZpcnFfa29ial90eXBlKTsKIAogCXJldHVybiBkZXNjOwogCkBAIC0xOTcsMTUgKzM3NCwyMiBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBkZWxheWVkX2ZyZWVfZGVzYyhzdHJ1Y3QgcmN1X2hlYWQgKnJocCkKK3N0YXRpYyB2b2lkIGlycV9rb2JqX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCiB7Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjID0gY29udGFpbmVyX29mKHJocCwgc3RydWN0IGlycV9kZXNjLCByY3UpOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgaXJxX2Rlc2MsIGtvYmopOwogCiAJZnJlZV9tYXNrcyhkZXNjKTsKIAlmcmVlX3BlcmNwdShkZXNjLT5rc3RhdF9pcnFzKTsKIAlrZnJlZShkZXNjKTsKIH0KIAorc3RhdGljIHZvaWQgZGVsYXllZF9mcmVlX2Rlc2Moc3RydWN0IHJjdV9oZWFkICpyaHApCit7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gY29udGFpbmVyX29mKHJocCwgc3RydWN0IGlycV9kZXNjLCByY3UpOworCisJa29iamVjdF9wdXQoJmRlc2MtPmtvYmopOworfQorCiBzdGF0aWMgdm9pZCBmcmVlX2Rlc2ModW5zaWduZWQgaW50IGlycSkKIHsKIAlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwpAQCAtMjE3LDggKzQwMSwxMiBAQAogCSAqIGtzdGF0X2lycV91c3IoKS4gT25jZSB3ZSBkZWxldGVkIHRoZSBkZXNjcmlwdG9yIGZyb20gdGhlCiAJICogc3BhcnNlIHRyZWUgd2UgY2FuIGZyZWUgaXQuIEFjY2VzcyBpbiBwcm9jIHdpbGwgZmFpbCB0bwogCSAqIGxvb2t1cCB0aGUgZGVzY3JpcHRvci4KKwkgKgorCSAqIFRoZSBzeXNmcyBlbnRyeSBtdXN0IGJlIHNlcmlhbGl6ZWQgYWdhaW5zdCBhIGNvbmN1cnJlbnQKKwkgKiBpcnFfc3lzZnNfaW5pdCgpIGFzIHdlbGwuCiAJICovCiAJbXV0ZXhfbG9jaygmc3BhcnNlX2lycV9sb2NrKTsKKwlrb2JqZWN0X2RlbCgmZGVzYy0+a29iaik7CiAJZGVsZXRlX2lycV9kZXNjKGlycSk7CiAJbXV0ZXhfdW5sb2NrKCZzcGFyc2VfaXJxX2xvY2spOwogCkBAIC0yMzYsMzEgKzQyNCwzMSBAQAogCWNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrID0gTlVMTDsKIAlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CiAJdW5zaWduZWQgaW50IGZsYWdzOwotCWludCBpLCBjcHUgPSAtMTsKKwlpbnQgaTsKIAotCWlmIChhZmZpbml0eSAmJiBjcHVtYXNrX2VtcHR5KGFmZmluaXR5KSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJLyogVmFsaWRhdGUgYWZmaW5pdHkgbWFzayhzKSAqLworCWlmIChhZmZpbml0eSkgeworCQlmb3IgKGkgPSAwLCBtYXNrID0gYWZmaW5pdHk7IGkgPCBjbnQ7IGkrKywgbWFzaysrKSB7CisJCQlpZiAoY3B1bWFza19lbXB0eShtYXNrKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KIAogCWZsYWdzID0gYWZmaW5pdHkgPyBJUlFEX0FGRklOSVRZX01BTkFHRUQgOiAwOworCW1hc2sgPSBOVUxMOwogCiAJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CiAJCWlmIChhZmZpbml0eSkgewotCQkJY3B1ID0gY3B1bWFza19uZXh0KGNwdSwgYWZmaW5pdHkpOwotCQkJaWYgKGNwdSA+PSBucl9jcHVfaWRzKQotCQkJCWNwdSA9IGNwdW1hc2tfZmlyc3QoYWZmaW5pdHkpOwotCQkJbm9kZSA9IGNwdV90b19ub2RlKGNwdSk7Ci0KLQkJCS8qCi0JCQkgKiBGb3Igc2luZ2xlIGFsbG9jYXRpb25zIHdlIHVzZSB0aGUgY2FsbGVyIHByb3ZpZGVkCi0JCQkgKiBtYXNrIG90aGVyd2lzZSB3ZSB1c2UgdGhlIG1hc2sgb2YgdGhlIHRhcmdldCBjcHUKLQkJCSAqLwotCQkJbWFzayA9IGNudCA9PSAxID8gYWZmaW5pdHkgOiBjcHVtYXNrX29mKGNwdSk7CisJCQlub2RlID0gY3B1X3RvX25vZGUoY3B1bWFza19maXJzdChhZmZpbml0eSkpOworCQkJbWFzayA9IGFmZmluaXR5OworCQkJYWZmaW5pdHkrKzsKIAkJfQogCQlkZXNjID0gYWxsb2NfZGVzYyhzdGFydCArIGksIG5vZGUsIGZsYWdzLCBtYXNrLCBvd25lcik7CiAJCWlmICghZGVzYykKIAkJCWdvdG8gZXJyOwogCQltdXRleF9sb2NrKCZzcGFyc2VfaXJxX2xvY2spOwogCQlpcnFfaW5zZXJ0X2Rlc2Moc3RhcnQgKyBpLCBkZXNjKTsKKwkJaXJxX3N5c2ZzX2FkZChzdGFydCArIGksIGRlc2MpOwogCQltdXRleF91bmxvY2soJnNwYXJzZV9pcnFfbG9jayk7CiAJfQogCXJldHVybiBzdGFydDsKQEAgLTQ4MSw5ICs2NjksOSBAQAogICogQGNudDoJTnVtYmVyIG9mIGNvbnNlY3V0aXZlIGlycXMgdG8gYWxsb2NhdGUuCiAgKiBAbm9kZToJUHJlZmVycmVkIG5vZGUgb24gd2hpY2ggdGhlIGlycSBkZXNjcmlwdG9yIHNob3VsZCBiZSBhbGxvY2F0ZWQKICAqIEBvd25lcjoJT3duaW5nIG1vZHVsZSAoY2FuIGJlIE5VTEwpCi0gKiBAYWZmaW5pdHk6CU9wdGlvbmFsIHBvaW50ZXIgdG8gYW4gYWZmaW5pdHkgbWFzayB3aGljaCBoaW50cyB3aGVyZSB0aGUKLSAqCQlpcnEgZGVzY3JpcHRvcnMgc2hvdWxkIGJlIGFsbG9jYXRlZCBhbmQgd2hpY2ggZGVmYXVsdAotICoJCWFmZmluaXRpZXMgdG8gdXNlCisgKiBAYWZmaW5pdHk6CU9wdGlvbmFsIHBvaW50ZXIgdG8gYW4gYWZmaW5pdHkgbWFzayBhcnJheSBvZiBzaXplIEBjbnQgd2hpY2gKKyAqCQloaW50cyB3aGVyZSB0aGUgaXJxIGRlc2NyaXB0b3JzIHNob3VsZCBiZSBhbGxvY2F0ZWQgYW5kIHdoaWNoCisgKgkJZGVmYXVsdCBhZmZpbml0aWVzIHRvIHVzZQogICoKICAqIFJldHVybnMgdGhlIGZpcnN0IGlycSBudW1iZXIgb3IgZXJyb3IgY29kZQogICovCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL2lycWRvbWFpbi5jIGIva2VybmVsL2lycS9pcnFkb21haW4uYwppbmRleCA0NzUyYjQzLi44YzBhMGFlIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL2lycWRvbWFpbi5jCisrKyBiL2tlcm5lbC9pcnEvaXJxZG9tYWluLmMKQEAgLTgwLDcgKzgwLDcgQEAKIAogLyoqCiAgKiBfX2lycV9kb21haW5fYWRkKCkgLSBBbGxvY2F0ZSBhIG5ldyBpcnFfZG9tYWluIGRhdGEgc3RydWN0dXJlCi0gKiBAb2Zfbm9kZTogb3B0aW9uYWwgZGV2aWNlLXRyZWUgbm9kZSBvZiB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIKKyAqIEBmd25vZGU6IGZpcm13YXJlIG5vZGUgZm9yIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlcgogICogQHNpemU6IFNpemUgb2YgbGluZWFyIG1hcDsgMCBmb3IgcmFkaXggbWFwcGluZyBvbmx5CiAgKiBAaHdpcnFfbWF4OiBNYXhpbXVtIG51bWJlciBvZiBpbnRlcnJ1cHRzIHN1cHBvcnRlZCBieSBjb250cm9sbGVyCiAgKiBAZGlyZWN0X21heDogTWF4aW11bSB2YWx1ZSBvZiBkaXJlY3QgbWFwczsgVXNlIH4wIGZvciBubyBsaW1pdDsgMCBmb3Igbm8KQEAgLTk2LDEwICs5Niw4IEBACiAJCQkJICAgIGNvbnN0IHN0cnVjdCBpcnFfZG9tYWluX29wcyAqb3BzLAogCQkJCSAgICB2b2lkICpob3N0X2RhdGEpCiB7CisJc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlID0gdG9fb2Zfbm9kZShmd25vZGUpOwogCXN0cnVjdCBpcnFfZG9tYWluICpkb21haW47Ci0Jc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlOwotCi0Jb2Zfbm9kZSA9IHRvX29mX25vZGUoZndub2RlKTsKIAogCWRvbWFpbiA9IGt6YWxsb2Nfbm9kZShzaXplb2YoKmRvbWFpbikgKyAoc2l6ZW9mKHVuc2lnbmVkIGludCkgKiBzaXplKSwKIAkJCSAgICAgIEdGUF9LRVJORUwsIG9mX25vZGVfdG9fbmlkKG9mX25vZGUpKTsKQEAgLTg2OCw3ICs4NjYsMTAgQEAKIAlpZiAoV0FSTl9PTihpbnRzaXplIDwgMSkpCiAJCXJldHVybiAtRUlOVkFMOwogCSpvdXRfaHdpcnEgPSBpbnRzcGVjWzBdOwotCSpvdXRfdHlwZSA9IChpbnRzaXplID4gMSkgPyBpbnRzcGVjWzFdIDogSVJRX1RZUEVfTk9ORTsKKwlpZiAoaW50c2l6ZSA+IDEpCisJCSpvdXRfdHlwZSA9IGludHNwZWNbMV0gJiBJUlFfVFlQRV9TRU5TRV9NQVNLOworCWVsc2UKKwkJKm91dF90eXBlID0gSVJRX1RZUEVfTk9ORTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlycV9kb21haW5feGxhdGVfb25ldHdvY2VsbCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL21hbmFnZS5jIGIva2VybmVsL2lycS9tYW5hZ2UuYwppbmRleCA3M2EyYjc4Li4wYzVmMWE1IDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL21hbmFnZS5jCisrKyBiL2tlcm5lbC9pcnEvbWFuYWdlLmMKQEAgLTY2OSw4ICs2NjksNiBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlmbGFncyAmPSBJUlFfVFlQRV9TRU5TRV9NQVNLOwotCiAJaWYgKGNoaXAtPmZsYWdzICYgSVJRQ0hJUF9TRVRfVFlQRV9NQVNLRUQpIHsKIAkJaWYgKCFpcnFkX2lycV9tYXNrZWQoJmRlc2MtPmlycV9kYXRhKSkKIAkJCW1hc2tfaXJxKGRlc2MpOwpAQCAtNjc4LDcgKzY3Niw4IEBACiAJCQl1bm1hc2sgPSAxOwogCX0KIAotCS8qIGNhbGxlciBtYXNrZWQgb3V0IGFsbCBleGNlcHQgdHJpZ2dlciBtb2RlIGZsYWdzICovCisJLyogTWFzayBhbGwgZmxhZ3MgZXhjZXB0IHRyaWdnZXIgbW9kZSAqLworCWZsYWdzICY9IElSUV9UWVBFX1NFTlNFX01BU0s7CiAJcmV0ID0gY2hpcC0+aXJxX3NldF90eXBlKCZkZXNjLT5pcnFfZGF0YSwgZmxhZ3MpOwogCiAJc3dpdGNoIChyZXQpIHsKQEAgLTE2ODEsOCArMTY4MCwxMCBAQAogCWFjdGlvbi0+ZGV2X2lkID0gZGV2X2lkOwogCiAJcmV0dmFsID0gaXJxX2NoaXBfcG1fZ2V0KCZkZXNjLT5pcnFfZGF0YSk7Ci0JaWYgKHJldHZhbCA8IDApCisJaWYgKHJldHZhbCA8IDApIHsKKwkJa2ZyZWUoYWN0aW9uKTsKIAkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAljaGlwX2J1c19sb2NrKGRlc2MpOwogCXJldHZhbCA9IF9fc2V0dXBfaXJxKGlycSwgZGVzYywgYWN0aW9uKTsKQEAgLTE5ODUsOCArMTk4NiwxMCBAQAogCWFjdGlvbi0+cGVyY3B1X2Rldl9pZCA9IGRldl9pZDsKIAogCXJldHZhbCA9IGlycV9jaGlwX3BtX2dldCgmZGVzYy0+aXJxX2RhdGEpOwotCWlmIChyZXR2YWwgPCAwKQorCWlmIChyZXR2YWwgPCAwKSB7CisJCWtmcmVlKGFjdGlvbik7CiAJCXJldHVybiByZXR2YWw7CisJfQogCiAJY2hpcF9idXNfbG9jayhkZXNjKTsKIAlyZXR2YWwgPSBfX3NldHVwX2lycShpcnEsIGRlc2MsIGFjdGlvbik7CmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL21zaS5jIGIva2VybmVsL2lycS9tc2kuYwppbmRleCAxOWU5ZGZiLi44YTNlODcyNyAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9tc2kuYworKysgYi9rZXJuZWwvaXJxL21zaS5jCkBAIC0xOCwyMCArMTgsNDIgQEAKIC8qIFRlbXBhcm9yeSBzb2x1dGlvbiBmb3IgYnVpbGRpbmcsIHdpbGwgYmUgcmVtb3ZlZCBsYXRlciAqLwogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCi1zdHJ1Y3QgbXNpX2Rlc2MgKmFsbG9jX21zaV9lbnRyeShzdHJ1Y3QgZGV2aWNlICpkZXYpCisvKioKKyAqIGFsbG9jX21zaV9lbnRyeSAtIEFsbG9jYXRlIGFuIGluaXRpYWxpemUgbXNpX2VudHJ5CisgKiBAZGV2OglQb2ludGVyIHRvIHRoZSBkZXZpY2UgZm9yIHdoaWNoIHRoaXMgaXMgYWxsb2NhdGVkCisgKiBAbnZlYzoJVGhlIG51bWJlciBvZiB2ZWN0b3JzIHVzZWQgaW4gdGhpcyBlbnRyeQorICogQGFmZmluaXR5OglPcHRpb25hbCBwb2ludGVyIHRvIGFuIGFmZmluaXR5IG1hc2sgYXJyYXkgc2l6ZSBvZiBAbnZlYworICoKKyAqIElmIEBhZmZpbml0eSBpcyBub3QgTlVMTCB0aGVuIGEgYW4gYWZmaW5pdHkgYXJyYXlbQG52ZWNdIGlzIGFsbG9jYXRlZAorICogYW5kIHRoZSBhZmZpbml0eSBtYXNrcyBmcm9tIEBhZmZpbml0eSBhcmUgY29waWVkLgorICovCitzdHJ1Y3QgbXNpX2Rlc2MgKgorYWxsb2NfbXNpX2VudHJ5KHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IG52ZWMsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICphZmZpbml0eSkKIHsKLQlzdHJ1Y3QgbXNpX2Rlc2MgKmRlc2MgPSBremFsbG9jKHNpemVvZigqZGVzYyksIEdGUF9LRVJORUwpOworCXN0cnVjdCBtc2lfZGVzYyAqZGVzYzsKKworCWRlc2MgPSBremFsbG9jKHNpemVvZigqZGVzYyksIEdGUF9LRVJORUwpOwogCWlmICghZGVzYykKIAkJcmV0dXJuIE5VTEw7CiAKIAlJTklUX0xJU1RfSEVBRCgmZGVzYy0+bGlzdCk7CiAJZGVzYy0+ZGV2ID0gZGV2OworCWRlc2MtPm52ZWNfdXNlZCA9IG52ZWM7CisJaWYgKGFmZmluaXR5KSB7CisJCWRlc2MtPmFmZmluaXR5ID0ga21lbWR1cChhZmZpbml0eSwKKwkJCW52ZWMgKiBzaXplb2YoKmRlc2MtPmFmZmluaXR5KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZGVzYy0+YWZmaW5pdHkpIHsKKwkJCWtmcmVlKGRlc2MpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CiAKIAlyZXR1cm4gZGVzYzsKIH0KIAogdm9pZCBmcmVlX21zaV9lbnRyeShzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5KQogeworCWtmcmVlKGVudHJ5LT5hZmZpbml0eSk7CiAJa2ZyZWUoZW50cnkpOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwva2V4ZWNfZmlsZS5jIGIva2VybmVsL2tleGVjX2ZpbGUuYwppbmRleCA1MDNiYzJkLi4wMzdjMzIxIDEwMDY0NAotLS0gYS9rZXJuZWwva2V4ZWNfZmlsZS5jCisrKyBiL2tlcm5lbC9rZXhlY19maWxlLmMKQEAgLTg4Nyw3ICs4ODcsMTAgQEAKIAlyZXR1cm4gMDsKIG91dDoKIAl2ZnJlZShwaS0+c2VjaGRycyk7CisJcGktPnNlY2hkcnMgPSBOVUxMOworCiAJdmZyZWUocGktPnB1cmdhdG9yeV9idWYpOworCXBpLT5wdXJnYXRvcnlfYnVmID0gTlVMTDsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwva3RocmVhZC5jIGIva2VybmVsL2t0aHJlYWQuYwppbmRleCA5ZmYxNzNkLi40YWI0YzM3IDEwMDY0NAotLS0gYS9rZXJuZWwva3RocmVhZC5jCisrKyBiL2tlcm5lbC9rdGhyZWFkLmMKQEAgLTY0LDcgKzY0LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qga3RocmVhZCAqdG9fbGl2ZV9rdGhyZWFkKHN0cnVjdCB0YXNrX3N0cnVjdCAqaykKIHsKIAlzdHJ1Y3QgY29tcGxldGlvbiAqdmZvcmsgPSBBQ0NFU1NfT05DRShrLT52Zm9ya19kb25lKTsKLQlpZiAobGlrZWx5KHZmb3JrKSkKKwlpZiAobGlrZWx5KHZmb3JrKSAmJiB0cnlfZ2V0X3Rhc2tfc3RhY2soaykpCiAJCXJldHVybiBfX3RvX2t0aHJlYWQodmZvcmspOwogCXJldHVybiBOVUxMOwogfQpAQCAtNDI1LDggKzQyNSwxMCBAQAogewogCXN0cnVjdCBrdGhyZWFkICprdGhyZWFkID0gdG9fbGl2ZV9rdGhyZWFkKGspOwogCi0JaWYgKGt0aHJlYWQpCisJaWYgKGt0aHJlYWQpIHsKIAkJX19rdGhyZWFkX3VucGFyayhrLCBrdGhyZWFkKTsKKwkJcHV0X3Rhc2tfc3RhY2soayk7CisJfQogfQogRVhQT1JUX1NZTUJPTF9HUEwoa3RocmVhZF91bnBhcmspOwogCkBAIC00NTUsNiArNDU3LDcgQEAKIAkJCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZrdGhyZWFkLT5wYXJrZWQpOwogCQkJfQogCQl9CisJCXB1dF90YXNrX3N0YWNrKGspOwogCQlyZXQgPSAwOwogCX0KIAlyZXR1cm4gcmV0OwpAQCAtNDkwLDYgKzQ5Myw3IEBACiAJCV9fa3RocmVhZF91bnBhcmsoaywga3RocmVhZCk7CiAJCXdha2VfdXBfcHJvY2VzcyhrKTsKIAkJd2FpdF9mb3JfY29tcGxldGlvbigma3RocmVhZC0+ZXhpdGVkKTsKKwkJcHV0X3Rhc2tfc3RhY2soayk7CiAJfQogCXJldCA9IGstPmV4aXRfY29kZTsKIAlwdXRfdGFza19zdHJ1Y3Qoayk7CmRpZmYgLS1naXQgYS9rZXJuZWwvbG9ja2luZy9NYWtlZmlsZSBiL2tlcm5lbC9sb2NraW5nL01ha2VmaWxlCmluZGV4IDMxMzIyYTQuLjZmODhlMzUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9sb2NraW5nL01ha2VmaWxlCisrKyBiL2tlcm5lbC9sb2NraW5nL01ha2VmaWxlCkBAIC0xOCw3ICsxOCw2IEBACiBlbmRpZgogb2JqLSQoQ09ORklHX1NNUCkgKz0gc3BpbmxvY2subwogb2JqLSQoQ09ORklHX0xPQ0tfU1BJTl9PTl9PV05FUikgKz0gb3NxX2xvY2subwotb2JqLSQoQ09ORklHX1NNUCkgKz0gbGdsb2NrLm8KIG9iai0kKENPTkZJR19QUk9WRV9MT0NLSU5HKSArPSBzcGlubG9jay5vCiBvYmotJChDT05GSUdfUVVFVUVEX1NQSU5MT0NLUykgKz0gcXNwaW5sb2NrLm8KIG9iai0kKENPTkZJR19SVF9NVVRFWEVTKSArPSBydG11dGV4Lm8KZGlmZiAtLWdpdCBhL2tlcm5lbC9sb2NraW5nL2xnbG9jay5jIGIva2VybmVsL2xvY2tpbmcvbGdsb2NrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MWNmY2QuLjAwMDAwMDAKLS0tIGEva2VybmVsL2xvY2tpbmcvbGdsb2NrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyogU2VlIGluY2x1ZGUvbGludXgvbGdsb2NrLmggZm9yIGRlc2NyaXB0aW9uICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbGdsb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0KLS8qCi0gKiBOb3RlIHRoZXJlIGlzIG5vIHVuaW5pdCwgc28gbGdsb2NrcyBjYW5ub3QgYmUgZGVmaW5lZCBpbgotICogbW9kdWxlcyAoYnV0IGl0J3MgZmluZSB0byB1c2UgdGhlbSBmcm9tIHRoZXJlKQotICogQ291bGQgYmUgYWRkZWQgdGhvdWdoLCBqdXN0IHVuZG8gbGdfbG9ja19pbml0Ci0gKi8KLQotdm9pZCBsZ19sb2NrX2luaXQoc3RydWN0IGxnbG9jayAqbGcsIGNoYXIgKm5hbWUpCi17Ci0JTE9DS0RFUF9JTklUX01BUCgmbGctPmxvY2tfZGVwX21hcCwgbmFtZSwgJmxnLT5sb2NrX2tleSwgMCk7Ci19Ci1FWFBPUlRfU1lNQk9MKGxnX2xvY2tfaW5pdCk7Ci0KLXZvaWQgbGdfbG9jYWxfbG9jayhzdHJ1Y3QgbGdsb2NrICpsZykKLXsKLQlhcmNoX3NwaW5sb2NrX3QgKmxvY2s7Ci0KLQlwcmVlbXB0X2Rpc2FibGUoKTsKLQlsb2NrX2FjcXVpcmVfc2hhcmVkKCZsZy0+bG9ja19kZXBfbWFwLCAwLCAwLCBOVUxMLCBfUkVUX0lQXyk7Ci0JbG9jayA9IHRoaXNfY3B1X3B0cihsZy0+bG9jayk7Ci0JYXJjaF9zcGluX2xvY2sobG9jayk7Ci19Ci1FWFBPUlRfU1lNQk9MKGxnX2xvY2FsX2xvY2spOwotCi12b2lkIGxnX2xvY2FsX3VubG9jayhzdHJ1Y3QgbGdsb2NrICpsZykKLXsKLQlhcmNoX3NwaW5sb2NrX3QgKmxvY2s7Ci0KLQlsb2NrX3JlbGVhc2UoJmxnLT5sb2NrX2RlcF9tYXAsIDEsIF9SRVRfSVBfKTsKLQlsb2NrID0gdGhpc19jcHVfcHRyKGxnLT5sb2NrKTsKLQlhcmNoX3NwaW5fdW5sb2NrKGxvY2spOwotCXByZWVtcHRfZW5hYmxlKCk7Ci19Ci1FWFBPUlRfU1lNQk9MKGxnX2xvY2FsX3VubG9jayk7Ci0KLXZvaWQgbGdfbG9jYWxfbG9ja19jcHUoc3RydWN0IGxnbG9jayAqbGcsIGludCBjcHUpCi17Ci0JYXJjaF9zcGlubG9ja190ICpsb2NrOwotCi0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0JbG9ja19hY3F1aXJlX3NoYXJlZCgmbGctPmxvY2tfZGVwX21hcCwgMCwgMCwgTlVMTCwgX1JFVF9JUF8pOwotCWxvY2sgPSBwZXJfY3B1X3B0cihsZy0+bG9jaywgY3B1KTsKLQlhcmNoX3NwaW5fbG9jayhsb2NrKTsKLX0KLUVYUE9SVF9TWU1CT0wobGdfbG9jYWxfbG9ja19jcHUpOwotCi12b2lkIGxnX2xvY2FsX3VubG9ja19jcHUoc3RydWN0IGxnbG9jayAqbGcsIGludCBjcHUpCi17Ci0JYXJjaF9zcGlubG9ja190ICpsb2NrOwotCi0JbG9ja19yZWxlYXNlKCZsZy0+bG9ja19kZXBfbWFwLCAxLCBfUkVUX0lQXyk7Ci0JbG9jayA9IHBlcl9jcHVfcHRyKGxnLT5sb2NrLCBjcHUpOwotCWFyY2hfc3Bpbl91bmxvY2sobG9jayk7Ci0JcHJlZW1wdF9lbmFibGUoKTsKLX0KLUVYUE9SVF9TWU1CT0wobGdfbG9jYWxfdW5sb2NrX2NwdSk7Ci0KLXZvaWQgbGdfZG91YmxlX2xvY2soc3RydWN0IGxnbG9jayAqbGcsIGludCBjcHUxLCBpbnQgY3B1MikKLXsKLQlCVUdfT04oY3B1MSA9PSBjcHUyKTsKLQotCS8qIGxvY2sgaW4gY3B1IG9yZGVyLCBqdXN0IGxpa2UgbGdfZ2xvYmFsX2xvY2sgKi8KLQlpZiAoY3B1MiA8IGNwdTEpCi0JCXN3YXAoY3B1MSwgY3B1Mik7Ci0KLQlwcmVlbXB0X2Rpc2FibGUoKTsKLQlsb2NrX2FjcXVpcmVfc2hhcmVkKCZsZy0+bG9ja19kZXBfbWFwLCAwLCAwLCBOVUxMLCBfUkVUX0lQXyk7Ci0JYXJjaF9zcGluX2xvY2socGVyX2NwdV9wdHIobGctPmxvY2ssIGNwdTEpKTsKLQlhcmNoX3NwaW5fbG9jayhwZXJfY3B1X3B0cihsZy0+bG9jaywgY3B1MikpOwotfQotCi12b2lkIGxnX2RvdWJsZV91bmxvY2soc3RydWN0IGxnbG9jayAqbGcsIGludCBjcHUxLCBpbnQgY3B1MikKLXsKLQlsb2NrX3JlbGVhc2UoJmxnLT5sb2NrX2RlcF9tYXAsIDEsIF9SRVRfSVBfKTsKLQlhcmNoX3NwaW5fdW5sb2NrKHBlcl9jcHVfcHRyKGxnLT5sb2NrLCBjcHUxKSk7Ci0JYXJjaF9zcGluX3VubG9jayhwZXJfY3B1X3B0cihsZy0+bG9jaywgY3B1MikpOwotCXByZWVtcHRfZW5hYmxlKCk7Ci19Ci0KLXZvaWQgbGdfZ2xvYmFsX2xvY2soc3RydWN0IGxnbG9jayAqbGcpCi17Ci0JaW50IGk7Ci0KLQlwcmVlbXB0X2Rpc2FibGUoKTsKLQlsb2NrX2FjcXVpcmVfZXhjbHVzaXZlKCZsZy0+bG9ja19kZXBfbWFwLCAwLCAwLCBOVUxMLCBfUkVUX0lQXyk7Ci0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKLQkJYXJjaF9zcGlubG9ja190ICpsb2NrOwotCQlsb2NrID0gcGVyX2NwdV9wdHIobGctPmxvY2ssIGkpOwotCQlhcmNoX3NwaW5fbG9jayhsb2NrKTsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MKGxnX2dsb2JhbF9sb2NrKTsKLQotdm9pZCBsZ19nbG9iYWxfdW5sb2NrKHN0cnVjdCBsZ2xvY2sgKmxnKQotewotCWludCBpOwotCi0JbG9ja19yZWxlYXNlKCZsZy0+bG9ja19kZXBfbWFwLCAxLCBfUkVUX0lQXyk7Ci0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKLQkJYXJjaF9zcGlubG9ja190ICpsb2NrOwotCQlsb2NrID0gcGVyX2NwdV9wdHIobGctPmxvY2ssIGkpOwotCQlhcmNoX3NwaW5fdW5sb2NrKGxvY2spOwotCX0KLQlwcmVlbXB0X2VuYWJsZSgpOwotfQotRVhQT1JUX1NZTUJPTChsZ19nbG9iYWxfdW5sb2NrKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9sb2NraW5nL3BlcmNwdS1yd3NlbS5jIGIva2VybmVsL2xvY2tpbmcvcGVyY3B1LXJ3c2VtLmMKaW5kZXggYmVjMGI2NC4uY2UxODI1OSAxMDA2NDQKLS0tIGEva2VybmVsL2xvY2tpbmcvcGVyY3B1LXJ3c2VtLmMKKysrIGIva2VybmVsL2xvY2tpbmcvcGVyY3B1LXJ3c2VtLmMKQEAgLTgsMTUyICs4LDE4NiBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KIAotaW50IF9fcGVyY3B1X2luaXRfcndzZW0oc3RydWN0IHBlcmNwdV9yd19zZW1hcGhvcmUgKmJydywKK2ludCBfX3BlcmNwdV9pbml0X3J3c2VtKHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlICpzZW0sCiAJCQljb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgKnJ3c2VtX2tleSkKIHsKLQlicnctPmZhc3RfcmVhZF9jdHIgPSBhbGxvY19wZXJjcHUoaW50KTsKLQlpZiAodW5saWtlbHkoIWJydy0+ZmFzdF9yZWFkX2N0cikpCisJc2VtLT5yZWFkX2NvdW50ID0gYWxsb2NfcGVyY3B1KGludCk7CisJaWYgKHVubGlrZWx5KCFzZW0tPnJlYWRfY291bnQpKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qIC0+cndfc2VtIHJlcHJlc2VudHMgdGhlIHdob2xlIHBlcmNwdV9yd19zZW1hcGhvcmUgZm9yIGxvY2tkZXAgKi8KLQlfX2luaXRfcndzZW0oJmJydy0+cndfc2VtLCBuYW1lLCByd3NlbV9rZXkpOwotCXJjdV9zeW5jX2luaXQoJmJydy0+cnNzLCBSQ1VfU0NIRURfU1lOQyk7Ci0JYXRvbWljX3NldCgmYnJ3LT5zbG93X3JlYWRfY3RyLCAwKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZicnctPndyaXRlX3dhaXRxKTsKKwlyY3Vfc3luY19pbml0KCZzZW0tPnJzcywgUkNVX1NDSEVEX1NZTkMpOworCV9faW5pdF9yd3NlbSgmc2VtLT5yd19zZW0sIG5hbWUsIHJ3c2VtX2tleSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmc2VtLT53cml0ZXIpOworCXNlbS0+cmVhZGVyc19ibG9jayA9IDA7CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChfX3BlcmNwdV9pbml0X3J3c2VtKTsKIAotdm9pZCBwZXJjcHVfZnJlZV9yd3NlbShzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqYnJ3KQordm9pZCBwZXJjcHVfZnJlZV9yd3NlbShzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqc2VtKQogewogCS8qCiAJICogWFhYOiB0ZW1wb3Jhcnkga2x1ZGdlLiBUaGUgZXJyb3IgcGF0aCBpbiBhbGxvY19zdXBlcigpCiAJICogYXNzdW1lcyB0aGF0IHBlcmNwdV9mcmVlX3J3c2VtKCkgaXMgc2FmZSBhZnRlciBremFsbG9jKCkuCiAJICovCi0JaWYgKCFicnctPmZhc3RfcmVhZF9jdHIpCisJaWYgKCFzZW0tPnJlYWRfY291bnQpCiAJCXJldHVybjsKIAotCXJjdV9zeW5jX2R0b3IoJmJydy0+cnNzKTsKLQlmcmVlX3BlcmNwdShicnctPmZhc3RfcmVhZF9jdHIpOwotCWJydy0+ZmFzdF9yZWFkX2N0ciA9IE5VTEw7IC8qIGNhdGNoIHVzZSBhZnRlciBmcmVlIGJ1Z3MgKi8KKwlyY3Vfc3luY19kdG9yKCZzZW0tPnJzcyk7CisJZnJlZV9wZXJjcHUoc2VtLT5yZWFkX2NvdW50KTsKKwlzZW0tPnJlYWRfY291bnQgPSBOVUxMOyAvKiBjYXRjaCB1c2UgYWZ0ZXIgZnJlZSBidWdzICovCiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwZXJjcHVfZnJlZV9yd3NlbSk7CiAKLS8qCi0gKiBUaGlzIGlzIHRoZSBmYXN0LXBhdGggZm9yIGRvd25fcmVhZC91cF9yZWFkLiBJZiBpdCBzdWNjZWVkcyB3ZSByZWx5Ci0gKiBvbiB0aGUgYmFycmllcnMgcHJvdmlkZWQgYnkgcmN1X3N5bmNfZW50ZXIvZXhpdDsgc2VlIHRoZSBjb21tZW50cyBpbgotICogcGVyY3B1X2Rvd25fd3JpdGUoKSBhbmQgcGVyY3B1X3VwX3dyaXRlKCkuCi0gKgotICogSWYgdGhpcyBoZWxwZXIgZmFpbHMgdGhlIGNhbGxlcnMgcmVseSBvbiB0aGUgbm9ybWFsIHJ3X3NlbWFwaG9yZSBhbmQKLSAqIGF0b21pY19kZWNfYW5kX3Rlc3QoKSwgc28gaW4gdGhpcyBjYXNlIHdlIGhhdmUgdGhlIG5lY2Vzc2FyeSBiYXJyaWVycy4KLSAqLwotc3RhdGljIGJvb2wgdXBkYXRlX2Zhc3RfY3RyKHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlICpicncsIHVuc2lnbmVkIGludCB2YWwpCi17Ci0JYm9vbCBzdWNjZXNzOwotCi0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0Jc3VjY2VzcyA9IHJjdV9zeW5jX2lzX2lkbGUoJmJydy0+cnNzKTsKLQlpZiAobGlrZWx5KHN1Y2Nlc3MpKQotCQlfX3RoaXNfY3B1X2FkZCgqYnJ3LT5mYXN0X3JlYWRfY3RyLCB2YWwpOwotCXByZWVtcHRfZW5hYmxlKCk7Ci0KLQlyZXR1cm4gc3VjY2VzczsKLX0KLQotLyoKLSAqIExpa2UgdGhlIG5vcm1hbCBkb3duX3JlYWQoKSB0aGlzIGlzIG5vdCByZWN1cnNpdmUsIHRoZSB3cml0ZXIgY2FuCi0gKiBjb21lIGFmdGVyIHRoZSBmaXJzdCBwZXJjcHVfZG93bl9yZWFkKCkgYW5kIGNyZWF0ZSB0aGUgZGVhZGxvY2suCi0gKgotICogTm90ZTogcmV0dXJucyB3aXRoIGxvY2tfaXNfaGVsZChicnctPnJ3X3NlbSkgPT0gVCBmb3IgbG9ja2RlcCwKLSAqIHBlcmNwdV91cF9yZWFkKCkgZG9lcyByd3NlbV9yZWxlYXNlKCkuIFRoaXMgcGFpcnMgd2l0aCB0aGUgdXNhZ2UKLSAqIG9mIC0+cndfc2VtIGluIHBlcmNwdV9kb3duL3VwX3dyaXRlKCkuCi0gKi8KLXZvaWQgcGVyY3B1X2Rvd25fcmVhZChzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqYnJ3KQotewotCW1pZ2h0X3NsZWVwKCk7Ci0JcndzZW1fYWNxdWlyZV9yZWFkKCZicnctPnJ3X3NlbS5kZXBfbWFwLCAwLCAwLCBfUkVUX0lQXyk7Ci0KLQlpZiAobGlrZWx5KHVwZGF0ZV9mYXN0X2N0cihicncsICsxKSkpCi0JCXJldHVybjsKLQotCS8qIEF2b2lkIHJ3c2VtX2FjcXVpcmVfcmVhZCgpIGFuZCByd3NlbV9yZWxlYXNlKCkgKi8KLQlfX2Rvd25fcmVhZCgmYnJ3LT5yd19zZW0pOwotCWF0b21pY19pbmMoJmJydy0+c2xvd19yZWFkX2N0cik7Ci0JX191cF9yZWFkKCZicnctPnJ3X3NlbSk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChwZXJjcHVfZG93bl9yZWFkKTsKLQotaW50IHBlcmNwdV9kb3duX3JlYWRfdHJ5bG9jayhzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqYnJ3KQotewotCWlmICh1bmxpa2VseSghdXBkYXRlX2Zhc3RfY3RyKGJydywgKzEpKSkgewotCQlpZiAoIV9fZG93bl9yZWFkX3RyeWxvY2soJmJydy0+cndfc2VtKSkKLQkJCXJldHVybiAwOwotCQlhdG9taWNfaW5jKCZicnctPnNsb3dfcmVhZF9jdHIpOwotCQlfX3VwX3JlYWQoJmJydy0+cndfc2VtKTsKLQl9Ci0KLQlyd3NlbV9hY3F1aXJlX3JlYWQoJmJydy0+cndfc2VtLmRlcF9tYXAsIDAsIDEsIF9SRVRfSVBfKTsKLQlyZXR1cm4gMTsKLX0KLQotdm9pZCBwZXJjcHVfdXBfcmVhZChzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqYnJ3KQotewotCXJ3c2VtX3JlbGVhc2UoJmJydy0+cndfc2VtLmRlcF9tYXAsIDEsIF9SRVRfSVBfKTsKLQotCWlmIChsaWtlbHkodXBkYXRlX2Zhc3RfY3RyKGJydywgLTEpKSkKLQkJcmV0dXJuOwotCi0JLyogZmFsc2UtcG9zaXRpdmUgaXMgcG9zc2libGUgYnV0IGhhcm1sZXNzICovCi0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmJydy0+c2xvd19yZWFkX2N0cikpCi0JCXdha2VfdXBfYWxsKCZicnctPndyaXRlX3dhaXRxKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHBlcmNwdV91cF9yZWFkKTsKLQotc3RhdGljIGludCBjbGVhcl9mYXN0X2N0cihzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqYnJ3KQotewotCXVuc2lnbmVkIGludCBzdW0gPSAwOwotCWludCBjcHU7Ci0KLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7Ci0JCXN1bSArPSBwZXJfY3B1KCpicnctPmZhc3RfcmVhZF9jdHIsIGNwdSk7Ci0JCXBlcl9jcHUoKmJydy0+ZmFzdF9yZWFkX2N0ciwgY3B1KSA9IDA7Ci0JfQotCi0JcmV0dXJuIHN1bTsKLX0KLQotdm9pZCBwZXJjcHVfZG93bl93cml0ZShzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqYnJ3KQoraW50IF9fcGVyY3B1X2Rvd25fcmVhZChzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqc2VtLCBpbnQgdHJ5KQogewogCS8qCi0JICogTWFrZSByY3Vfc3luY19pc19pZGxlKCkgPT0gRiBhbmQgdGh1cyBkaXNhYmxlIHRoZSBmYXN0LXBhdGggaW4KLQkgKiBwZXJjcHVfZG93bl9yZWFkKCkgYW5kIHBlcmNwdV91cF9yZWFkKCksIGFuZCB3YWl0IGZvciBncCBwYXNzLgorCSAqIER1ZSB0byBoYXZpbmcgcHJlZW1wdGlvbiBkaXNhYmxlZCB0aGUgZGVjcmVtZW50IGhhcHBlbnMgb24KKwkgKiB0aGUgc2FtZSBDUFUgYXMgdGhlIGluY3JlbWVudCwgYXZvaWRpbmcgdGhlCisJICogaW5jcmVtZW50LW9uLW9uZS1DUFUtYW5kLWRlY3JlbWVudC1vbi1hbm90aGVyIHByb2JsZW0uCiAJICoKLQkgKiBUaGUgbGF0dGVyIHN5bmNocm9uaXNlcyB1cyB3aXRoIHRoZSBwcmVjZWRpbmcgcmVhZGVycyB3aGljaCB1c2VkCi0JICogdGhlIGZhc3QtcGFzdCwgc28gd2UgY2FuIG5vdCBtaXNzIHRoZSByZXN1bHQgb2YgX190aGlzX2NwdV9hZGQoKQotCSAqIG9yIGFueXRoaW5nIGVsc2UgaW5zaWRlIHRoZWlyIGNyaXRpY2lhbCBzZWN0aW9ucy4KKwkgKiBJZiB0aGUgcmVhZGVyIG1pc3NlcyB0aGUgd3JpdGVyJ3MgYXNzaWdubWVudCBvZiByZWFkZXJzX2Jsb2NrLCB0aGVuCisJICogdGhlIHdyaXRlciBpcyBndWFyYW50ZWVkIHRvIHNlZSB0aGUgcmVhZGVyJ3MgaW5jcmVtZW50LgorCSAqCisJICogQ29udmVyc2VseSwgYW55IHJlYWRlcnMgdGhhdCBpbmNyZW1lbnQgdGhlaXIgc2VtLT5yZWFkX2NvdW50IGFmdGVyCisJICogdGhlIHdyaXRlciBsb29rcyBhcmUgZ3VhcmFudGVlZCB0byBzZWUgdGhlIHJlYWRlcnNfYmxvY2sgdmFsdWUsCisJICogd2hpY2ggaW4gdHVybiBtZWFucyB0aGF0IHRoZXkgYXJlIGd1YXJhbnRlZWQgdG8gaW1tZWRpYXRlbHkKKwkgKiBkZWNyZW1lbnQgdGhlaXIgc2VtLT5yZWFkX2NvdW50LCBzbyB0aGF0IGl0IGRvZXNuJ3QgbWF0dGVyIHRoYXQgdGhlCisJICogd3JpdGVyIG1pc3NlZCB0aGVtLgogCSAqLwotCXJjdV9zeW5jX2VudGVyKCZicnctPnJzcyk7CiAKLQkvKiBleGNsdWRlIG90aGVyIHdyaXRlcnMsIGFuZCBibG9jayB0aGUgbmV3IHJlYWRlcnMgY29tcGxldGVseSAqLwotCWRvd25fd3JpdGUoJmJydy0+cndfc2VtKTsKKwlzbXBfbWIoKTsgLyogQSBtYXRjaGVzIEQgKi8KIAotCS8qIG5vYm9keSBjYW4gdXNlIGZhc3RfcmVhZF9jdHIsIG1vdmUgaXRzIHN1bSBpbnRvIHNsb3dfcmVhZF9jdHIgKi8KLQlhdG9taWNfYWRkKGNsZWFyX2Zhc3RfY3RyKGJydyksICZicnctPnNsb3dfcmVhZF9jdHIpOworCS8qCisJICogSWYgIXJlYWRlcnNfYmxvY2sgdGhlIGNyaXRpY2FsIHNlY3Rpb24gc3RhcnRzIGhlcmUsIG1hdGNoZWQgYnkgdGhlCisJICogcmVsZWFzZSBpbiBwZXJjcHVfdXBfd3JpdGUoKS4KKwkgKi8KKwlpZiAobGlrZWx5KCFzbXBfbG9hZF9hY3F1aXJlKCZzZW0tPnJlYWRlcnNfYmxvY2spKSkKKwkJcmV0dXJuIDE7CiAKLQkvKiB3YWl0IGZvciBhbGwgcmVhZGVycyB0byBjb21wbGV0ZSB0aGVpciBwZXJjcHVfdXBfcmVhZCgpICovCi0Jd2FpdF9ldmVudChicnctPndyaXRlX3dhaXRxLCAhYXRvbWljX3JlYWQoJmJydy0+c2xvd19yZWFkX2N0cikpOworCS8qCisJICogUGVyIHRoZSBhYm92ZSBjb21tZW50OyB3ZSBzdGlsbCBoYXZlIHByZWVtcHRpb24gZGlzYWJsZWQgYW5kCisJICogd2lsbCB0aHVzIGRlY3JlbWVudCBvbiB0aGUgc2FtZSBDUFUgYXMgd2UgaW5jcmVtZW50ZWQuCisJICovCisJX19wZXJjcHVfdXBfcmVhZChzZW0pOworCisJaWYgKHRyeSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFdlIGVpdGhlciBjYWxsIHNjaGVkdWxlKCkgaW4gdGhlIHdhaXQsIG9yIHdlJ2xsIGZhbGwgdGhyb3VnaAorCSAqIGFuZCByZXNjaGVkdWxlIG9uIHRoZSBwcmVlbXB0X2VuYWJsZSgpIGluIHBlcmNwdV9kb3duX3JlYWQoKS4KKwkgKi8KKwlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CisKKwkvKgorCSAqIEF2b2lkIGxvY2tkZXAgZm9yIHRoZSBkb3duL3VwX3JlYWQoKSB3ZSBhbHJlYWR5IGhhdmUgdGhlbS4KKwkgKi8KKwlfX2Rvd25fcmVhZCgmc2VtLT5yd19zZW0pOworCXRoaXNfY3B1X2luYygqc2VtLT5yZWFkX2NvdW50KTsKKwlfX3VwX3JlYWQoJnNlbS0+cndfc2VtKTsKKworCXByZWVtcHRfZGlzYWJsZSgpOworCXJldHVybiAxOworfQorRVhQT1JUX1NZTUJPTF9HUEwoX19wZXJjcHVfZG93bl9yZWFkKTsKKwordm9pZCBfX3BlcmNwdV91cF9yZWFkKHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlICpzZW0pCit7CisJc21wX21iKCk7IC8qIEIgbWF0Y2hlcyBDICovCisJLyoKKwkgKiBJbiBvdGhlciB3b3JkcywgaWYgdGhleSBzZWUgb3VyIGRlY3JlbWVudCAocHJlc3VtYWJseSB0byBhZ2dyZWdhdGUKKwkgKiB6ZXJvLCBhcyB0aGF0IGlzIHRoZSBvbmx5IHRpbWUgaXQgbWF0dGVycykgdGhleSB3aWxsIGFsc28gc2VlIG91cgorCSAqIGNyaXRpY2FsIHNlY3Rpb24uCisJICovCisJX190aGlzX2NwdV9kZWMoKnNlbS0+cmVhZF9jb3VudCk7CisKKwkvKiBQcm9kIHdyaXRlciB0byByZWNoZWNrIHJlYWRlcnNfYWN0aXZlICovCisJd2FrZV91cCgmc2VtLT53cml0ZXIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoX19wZXJjcHVfdXBfcmVhZCk7CisKKyNkZWZpbmUgcGVyX2NwdV9zdW0odmFyKQkJCQkJCVwKKyh7CQkJCQkJCQkJXAorCXR5cGVvZih2YXIpIF9fc3VtID0gMDsJCQkJCQlcCisJaW50IGNwdTsJCQkJCQkJXAorCWNvbXBpbGV0aW1lX2Fzc2VydF9hdG9taWNfdHlwZShfX3N1bSk7CQkJCVwKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KQkJCQkJXAorCQlfX3N1bSArPSBwZXJfY3B1KHZhciwgY3B1KTsJCQkJXAorCV9fc3VtOwkJCQkJCQkJXAorfSkKKworLyoKKyAqIFJldHVybiB0cnVlIGlmIHRoZSBtb2R1bGFyIHN1bSBvZiB0aGUgc2VtLT5yZWFkX2NvdW50IHBlci1DUFUgdmFyaWFibGUgaXMKKyAqIHplcm8uICBJZiB0aGlzIHN1bSBpcyB6ZXJvLCB0aGVuIGl0IGlzIHN0YWJsZSBkdWUgdG8gdGhlIGZhY3QgdGhhdCBpZiBhbnkKKyAqIG5ld2x5IGFycml2aW5nIHJlYWRlcnMgaW5jcmVtZW50IGEgZ2l2ZW4gY291bnRlciwgdGhleSB3aWxsIGltbWVkaWF0ZWx5CisgKiBkZWNyZW1lbnQgdGhhdCBzYW1lIGNvdW50ZXIuCisgKi8KK3N0YXRpYyBib29sIHJlYWRlcnNfYWN0aXZlX2NoZWNrKHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlICpzZW0pCit7CisJaWYgKHBlcl9jcHVfc3VtKCpzZW0tPnJlYWRfY291bnQpICE9IDApCisJCXJldHVybiBmYWxzZTsKKworCS8qCisJICogSWYgd2Ugb2JzZXJ2ZWQgdGhlIGRlY3JlbWVudDsgZW5zdXJlIHdlIHNlZSB0aGUgZW50aXJlIGNyaXRpY2FsCisJICogc2VjdGlvbi4KKwkgKi8KKworCXNtcF9tYigpOyAvKiBDIG1hdGNoZXMgQiAqLworCisJcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgcGVyY3B1X2Rvd25fd3JpdGUoc3RydWN0IHBlcmNwdV9yd19zZW1hcGhvcmUgKnNlbSkKK3sKKwkvKiBOb3RpZnkgcmVhZGVycyB0byB0YWtlIHRoZSBzbG93IHBhdGguICovCisJcmN1X3N5bmNfZW50ZXIoJnNlbS0+cnNzKTsKKworCWRvd25fd3JpdGUoJnNlbS0+cndfc2VtKTsKKworCS8qCisJICogTm90aWZ5IG5ldyByZWFkZXJzIHRvIGJsb2NrOyB1cCB1bnRpbCBub3csIGFuZCB0aHVzIHRocm91Z2hvdXQgdGhlCisJICogbG9uZ2lzaCByY3Vfc3luY19lbnRlcigpIGFib3ZlLCBuZXcgcmVhZGVycyBjb3VsZCBzdGlsbCBjb21lIGluLgorCSAqLworCVdSSVRFX09OQ0Uoc2VtLT5yZWFkZXJzX2Jsb2NrLCAxKTsKKworCXNtcF9tYigpOyAvKiBEIG1hdGNoZXMgQSAqLworCisJLyoKKwkgKiBJZiB0aGV5IGRvbid0IHNlZSBvdXIgd3JpdGVyIG9mIHJlYWRlcnNfYmxvY2ssIHRoZW4gd2UgYXJlCisJICogZ3VhcmFudGVlZCB0byBzZWUgdGhlaXIgc2VtLT5yZWFkX2NvdW50IGluY3JlbWVudCwgYW5kIHRoZXJlZm9yZQorCSAqIHdpbGwgd2FpdCBmb3IgdGhlbS4KKwkgKi8KKworCS8qIFdhaXQgZm9yIGFsbCBub3cgYWN0aXZlIHJlYWRlcnMgdG8gY29tcGxldGUuICovCisJd2FpdF9ldmVudChzZW0tPndyaXRlciwgcmVhZGVyc19hY3RpdmVfY2hlY2soc2VtKSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwZXJjcHVfZG93bl93cml0ZSk7CiAKLXZvaWQgcGVyY3B1X3VwX3dyaXRlKHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlICpicncpCit2b2lkIHBlcmNwdV91cF93cml0ZShzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqc2VtKQogewotCS8qIHJlbGVhc2UgdGhlIGxvY2ssIGJ1dCB0aGUgcmVhZGVycyBjYW4ndCB1c2UgdGhlIGZhc3QtcGF0aCAqLwotCXVwX3dyaXRlKCZicnctPnJ3X3NlbSk7CiAJLyoKLQkgKiBFbmFibGUgdGhlIGZhc3QtcGF0aCBpbiBwZXJjcHVfZG93bl9yZWFkKCkgYW5kIHBlcmNwdV91cF9yZWFkKCkKLQkgKiBidXQgb25seSBhZnRlciBhbm90aGVyIGdwIHBhc3M7IHRoaXMgYWRkcyB0aGUgbmVjZXNzYXJ5IGJhcnJpZXIKLQkgKiB0byBlbnN1cmUgdGhlIHJlYWRlciBjYW4ndCBtaXNzIHRoZSBjaGFuZ2VzIGRvbmUgYnkgdXMuCisJICogU2lnbmFsIHRoZSB3cml0ZXIgaXMgZG9uZSwgbm8gZmFzdCBwYXRoIHlldC4KKwkgKgorCSAqIE9uZSByZWFzb24gdGhhdCB3ZSBjYW5ub3QganVzdCBpbW1lZGlhdGVseSBmbGlwIHRvIHJlYWRlcnNfZmFzdCBpcworCSAqIHRoYXQgbmV3IHJlYWRlcnMgbWlnaHQgZmFpbCB0byBzZWUgdGhlIHJlc3VsdHMgb2YgdGhpcyB3cml0ZXIncworCSAqIGNyaXRpY2FsIHNlY3Rpb24uCisJICoKKwkgKiBUaGVyZWZvcmUgd2UgZm9yY2UgaXQgdGhyb3VnaCB0aGUgc2xvdyBwYXRoIHdoaWNoIGd1YXJhbnRlZXMgYW4KKwkgKiBhY3F1aXJlIGFuZCB0aGVyZWJ5IGd1YXJhbnRlZXMgdGhlIGNyaXRpY2FsIHNlY3Rpb24ncyBjb25zaXN0ZW5jeS4KIAkgKi8KLQlyY3Vfc3luY19leGl0KCZicnctPnJzcyk7CisJc21wX3N0b3JlX3JlbGVhc2UoJnNlbS0+cmVhZGVyc19ibG9jaywgMCk7CisKKwkvKgorCSAqIFJlbGVhc2UgdGhlIHdyaXRlIGxvY2ssIHRoaXMgd2lsbCBhbGxvdyByZWFkZXJzIGJhY2sgaW4gdGhlIGdhbWUuCisJICovCisJdXBfd3JpdGUoJnNlbS0+cndfc2VtKTsKKworCS8qCisJICogT25jZSB0aGlzIGNvbXBsZXRlcyAoYXQgbGVhc3Qgb25lIFJDVS1zY2hlZCBncmFjZSBwZXJpb2QgaGVuY2UpIHRoZQorCSAqIHJlYWRlciBmYXN0IHBhdGggd2lsbCBiZSBhdmFpbGFibGUgYWdhaW4uIFNhZmUgdG8gdXNlIG91dHNpZGUgdGhlCisJICogZXhjbHVzaXZlIHdyaXRlIGxvY2sgYmVjYXVzZSBpdHMgY291bnRpbmcuCisJICovCisJcmN1X3N5bmNfZXhpdCgmc2VtLT5yc3MpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocGVyY3B1X3VwX3dyaXRlKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9sb2NraW5nL3FzcGlubG9ja19wYXJhdmlydC5oIGIva2VybmVsL2xvY2tpbmcvcXNwaW5sb2NrX3BhcmF2aXJ0LmgKaW5kZXggOGE5OWFiZi4uZTNiNTUyMCAxMDA2NDQKLS0tIGEva2VybmVsL2xvY2tpbmcvcXNwaW5sb2NrX3BhcmF2aXJ0LmgKKysrIGIva2VybmVsL2xvY2tpbmcvcXNwaW5sb2NrX3BhcmF2aXJ0LmgKQEAgLTcwLDExICs3MCwxNCBAQAogc3RhdGljIGlubGluZSBib29sIHB2X3F1ZXVlZF9zcGluX3N0ZWFsX2xvY2soc3RydWN0IHFzcGlubG9jayAqbG9jaykKIHsKIAlzdHJ1Y3QgX19xc3BpbmxvY2sgKmwgPSAodm9pZCAqKWxvY2s7Ci0JaW50IHJldCA9ICEoYXRvbWljX3JlYWQoJmxvY2stPnZhbCkgJiBfUV9MT0NLRURfUEVORElOR19NQVNLKSAmJgotCQkgICAoY21weGNoZygmbC0+bG9ja2VkLCAwLCBfUV9MT0NLRURfVkFMKSA9PSAwKTsKIAotCXFzdGF0X2luYyhxc3RhdF9wdl9sb2NrX3N0ZWFsaW5nLCByZXQpOwotCXJldHVybiByZXQ7CisJaWYgKCEoYXRvbWljX3JlYWQoJmxvY2stPnZhbCkgJiBfUV9MT0NLRURfUEVORElOR19NQVNLKSAmJgorCSAgICAoY21weGNoZygmbC0+bG9ja2VkLCAwLCBfUV9MT0NLRURfVkFMKSA9PSAwKSkgeworCQlxc3RhdF9pbmMocXN0YXRfcHZfbG9ja19zdGVhbGluZywgdHJ1ZSk7CisJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKIH0KIAogLyoKQEAgLTI1Nyw3ICsyNjAsNiBAQAogc3RhdGljIGlubGluZSBib29sCiBwdl93YWl0X2Vhcmx5KHN0cnVjdCBwdl9ub2RlICpwcmV2LCBpbnQgbG9vcCkKIHsKLQogCWlmICgobG9vcCAmIFBWX1BSRVZfQ0hFQ0tfTUFTSykgIT0gMCkKIAkJcmV0dXJuIGZhbHNlOwogCkBAIC0yODYsMTIgKzI4OCwxMCBAQAogewogCXN0cnVjdCBwdl9ub2RlICpwbiA9IChzdHJ1Y3QgcHZfbm9kZSAqKW5vZGU7CiAJc3RydWN0IHB2X25vZGUgKnBwID0gKHN0cnVjdCBwdl9ub2RlICopcHJldjsKLQlpbnQgd2FpdGNudCA9IDA7CiAJaW50IGxvb3A7CiAJYm9vbCB3YWl0X2Vhcmx5OwogCi0JLyogd2FpdGNudCBwcm9jZXNzaW5nIHdpbGwgYmUgY29tcGlsZWQgb3V0IGlmICFRVUVVRURfTE9DS19TVEFUICovCi0JZm9yICg7OyB3YWl0Y250KyspIHsKKwlmb3IgKDs7KSB7CiAJCWZvciAod2FpdF9lYXJseSA9IGZhbHNlLCBsb29wID0gU1BJTl9USFJFU0hPTEQ7IGxvb3A7IGxvb3AtLSkgewogCQkJaWYgKFJFQURfT05DRShub2RlLT5sb2NrZWQpKQogCQkJCXJldHVybjsKQEAgLTMxNSw3ICszMTUsNiBAQAogCiAJCWlmICghUkVBRF9PTkNFKG5vZGUtPmxvY2tlZCkpIHsKIAkJCXFzdGF0X2luYyhxc3RhdF9wdl93YWl0X25vZGUsIHRydWUpOwotCQkJcXN0YXRfaW5jKHFzdGF0X3B2X3dhaXRfYWdhaW4sIHdhaXRjbnQpOwogCQkJcXN0YXRfaW5jKHFzdGF0X3B2X3dhaXRfZWFybHksIHdhaXRfZWFybHkpOwogCQkJcHZfd2FpdCgmcG4tPnN0YXRlLCB2Y3B1X2hhbHRlZCk7CiAJCX0KQEAgLTQ1NiwxMiArNDU1LDkgQEAKIAkJcHZfd2FpdCgmbC0+bG9ja2VkLCBfUV9TTE9XX1ZBTCk7CiAKIAkJLyoKLQkJICogVGhlIHVubG9ja2VyIHNob3VsZCBoYXZlIGZyZWVkIHRoZSBsb2NrIGJlZm9yZSBraWNraW5nIHRoZQotCQkgKiBDUFUuIFNvIGlmIHRoZSBsb2NrIGlzIHN0aWxsIG5vdCBmcmVlLCBpdCBpcyBhIHNwdXJpb3VzCi0JCSAqIHdha2V1cCBvciBhbm90aGVyIHZDUFUgaGFzIHN0b2xlbiB0aGUgbG9jay4gVGhlIGN1cnJlbnQKLQkJICogdkNQVSBzaG91bGQgc3BpbiBhZ2Fpbi4KKwkJICogQmVjYXVzZSBvZiBsb2NrIHN0ZWFsaW5nLCB0aGUgcXVldWUgaGVhZCB2Q1BVIG1heSBub3QgYmUKKwkJICogYWJsZSB0byBhY3F1aXJlIHRoZSBsb2NrIGJlZm9yZSBpdCBoYXMgdG8gd2FpdCBhZ2Fpbi4KIAkJICovCi0JCXFzdGF0X2luYyhxc3RhdF9wdl9zcHVyaW91c193YWtldXAsIFJFQURfT05DRShsLT5sb2NrZWQpKTsKIAl9CiAKIAkvKgpAQCAtNTQ0LDcgKzU0MCw3IEBACiAJICogdW5oYXNoLiBPdGhlcndpc2UgaXQgd291bGQgYmUgcG9zc2libGUgdG8gaGF2ZSBtdWx0aXBsZSBAbG9jawogCSAqIGVudHJpZXMsIHdoaWNoIHdvdWxkIGJlIEJBRC4KIAkgKi8KLQlsb2NrZWQgPSBjbXB4Y2hnKCZsLT5sb2NrZWQsIF9RX0xPQ0tFRF9WQUwsIDApOworCWxvY2tlZCA9IGNtcHhjaGdfcmVsZWFzZSgmbC0+bG9ja2VkLCBfUV9MT0NLRURfVkFMLCAwKTsKIAlpZiAobGlrZWx5KGxvY2tlZCA9PSBfUV9MT0NLRURfVkFMKSkKIAkJcmV0dXJuOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvbG9ja2luZy9xc3BpbmxvY2tfc3RhdC5oIGIva2VybmVsL2xvY2tpbmcvcXNwaW5sb2NrX3N0YXQuaAppbmRleCBiOWQwMzE1Li5lYjBhNTk5IDEwMDY0NAotLS0gYS9rZXJuZWwvbG9ja2luZy9xc3BpbmxvY2tfc3RhdC5oCisrKyBiL2tlcm5lbC9sb2NraW5nL3FzcGlubG9ja19zdGF0LmgKQEAgLTI0LDggKzI0LDggQEAKICAqICAgcHZfbGF0ZW5jeV93YWtlCS0gYXZlcmFnZSBsYXRlbmN5IChucykgZnJvbSB2Q1BVIGtpY2sgdG8gd2FrZXVwCiAgKiAgIHB2X2xvY2tfc2xvd3BhdGgJLSAjIG9mIGxvY2tpbmcgb3BlcmF0aW9ucyB2aWEgdGhlIHNsb3dwYXRoCiAgKiAgIHB2X2xvY2tfc3RlYWxpbmcJLSAjIG9mIGxvY2sgc3RlYWxpbmcgb3BlcmF0aW9ucwotICogICBwdl9zcHVyaW91c193YWtldXAJLSAjIG9mIHNwdXJpb3VzIHdha2V1cHMKLSAqICAgcHZfd2FpdF9hZ2FpbgktICMgb2YgdkNQVSB3YWl0J3MgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHZDUFUga2ljaworICogICBwdl9zcHVyaW91c193YWtldXAJLSAjIG9mIHNwdXJpb3VzIHdha2V1cHMgaW4gbm9uLWhlYWQgdkNQVXMKKyAqICAgcHZfd2FpdF9hZ2FpbgktICMgb2Ygd2FpdCdzIGFmdGVyIGEgcXVldWUgaGVhZCB2Q1BVIGtpY2sKICAqICAgcHZfd2FpdF9lYXJseQktICMgb2YgZWFybHkgdkNQVSB3YWl0J3MKICAqICAgcHZfd2FpdF9oZWFkCS0gIyBvZiB2Q1BVIHdhaXQncyBhdCB0aGUgcXVldWUgaGVhZAogICogICBwdl93YWl0X25vZGUJLSAjIG9mIHZDUFUgd2FpdCdzIGF0IGEgbm9uLWhlYWQgcXVldWUgbm9kZQpkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tpbmcvcndzZW0teGFkZC5jIGIva2VybmVsL2xvY2tpbmcvcndzZW0teGFkZC5jCmluZGV4IDQ0N2UwOGQuLjIzMzdiNGIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9sb2NraW5nL3J3c2VtLXhhZGQuYworKysgYi9rZXJuZWwvbG9ja2luZy9yd3NlbS14YWRkLmMKQEAgLTEyMSwxNiArMTIxLDE5IEBACiAgKiAtIHdva2VuIHByb2Nlc3MgYmxvY2tzIGFyZSBkaXNjYXJkZWQgZnJvbSB0aGUgbGlzdCBhZnRlciBoYXZpbmcgdGFzayB6ZXJvZWQKICAqIC0gd3JpdGVycyBhcmUgb25seSBtYXJrZWQgd29rZW4gaWYgZG93bmdyYWRpbmcgaXMgZmFsc2UKICAqLwotc3RhdGljIHN0cnVjdCByd19zZW1hcGhvcmUgKgotX19yd3NlbV9tYXJrX3dha2Uoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtLAotCQkgIGVudW0gcndzZW1fd2FrZV90eXBlIHdha2VfdHlwZSwgc3RydWN0IHdha2VfcV9oZWFkICp3YWtlX3EpCitzdGF0aWMgdm9pZCBfX3J3c2VtX21hcmtfd2FrZShzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0sCisJCQkgICAgICBlbnVtIHJ3c2VtX3dha2VfdHlwZSB3YWtlX3R5cGUsCisJCQkgICAgICBzdHJ1Y3Qgd2FrZV9xX2hlYWQgKndha2VfcSkKIHsKLQlzdHJ1Y3QgcndzZW1fd2FpdGVyICp3YWl0ZXI7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbmV4dDsKLQlsb25nIG9sZGNvdW50LCB3b2tlbiwgbG9vcCwgYWRqdXN0bWVudDsKKwlzdHJ1Y3QgcndzZW1fd2FpdGVyICp3YWl0ZXIsICp0bXA7CisJbG9uZyBvbGRjb3VudCwgd29rZW4gPSAwLCBhZGp1c3RtZW50ID0gMDsKIAotCXdhaXRlciA9IGxpc3RfZW50cnkoc2VtLT53YWl0X2xpc3QubmV4dCwgc3RydWN0IHJ3c2VtX3dhaXRlciwgbGlzdCk7CisJLyoKKwkgKiBUYWtlIGEgcGVlayBhdCB0aGUgcXVldWUgaGVhZCB3YWl0ZXIgc3VjaCB0aGF0IHdlIGNhbiBkZXRlcm1pbmUKKwkgKiB0aGUgd2FrZXVwKHMpIHRvIHBlcmZvcm0uCisJICovCisJd2FpdGVyID0gbGlzdF9maXJzdF9lbnRyeSgmc2VtLT53YWl0X2xpc3QsIHN0cnVjdCByd3NlbV93YWl0ZXIsIGxpc3QpOworCiAJaWYgKHdhaXRlci0+dHlwZSA9PSBSV1NFTV9XQUlUSU5HX0ZPUl9XUklURSkgewogCQlpZiAod2FrZV90eXBlID09IFJXU0VNX1dBS0VfQU5ZKSB7CiAJCQkvKgpAQCAtMTQyLDE5ICsxNDUsMTkgQEAKIAkJCSAqLwogCQkJd2FrZV9xX2FkZCh3YWtlX3EsIHdhaXRlci0+dGFzayk7CiAJCX0KLQkJZ290byBvdXQ7CisKKwkJcmV0dXJuOwogCX0KIAotCS8qIFdyaXRlcnMgbWlnaHQgc3RlYWwgdGhlIGxvY2sgYmVmb3JlIHdlIGdyYW50IGl0IHRvIHRoZSBuZXh0IHJlYWRlci4KKwkvKgorCSAqIFdyaXRlcnMgbWlnaHQgc3RlYWwgdGhlIGxvY2sgYmVmb3JlIHdlIGdyYW50IGl0IHRvIHRoZSBuZXh0IHJlYWRlci4KIAkgKiBXZSBwcmVmZXIgdG8gZG8gdGhlIGZpcnN0IHJlYWRlciBncmFudCBiZWZvcmUgY291bnRpbmcgcmVhZGVycwogCSAqIHNvIHdlIGNhbiBiYWlsIG91dCBlYXJseSBpZiBhIHdyaXRlciBzdG9sZSB0aGUgbG9jay4KIAkgKi8KLQlhZGp1c3RtZW50ID0gMDsKIAlpZiAod2FrZV90eXBlICE9IFJXU0VNX1dBS0VfUkVBRF9PV05FRCkgewogCQlhZGp1c3RtZW50ID0gUldTRU1fQUNUSVZFX1JFQURfQklBUzsKICB0cnlfcmVhZGVyX2dyYW50OgogCQlvbGRjb3VudCA9IGF0b21pY19sb25nX2ZldGNoX2FkZChhZGp1c3RtZW50LCAmc2VtLT5jb3VudCk7Ci0KIAkJaWYgKHVubGlrZWx5KG9sZGNvdW50IDwgUldTRU1fV0FJVElOR19CSUFTKSkgewogCQkJLyoKIAkJCSAqIElmIHRoZSBjb3VudCBpcyBzdGlsbCBsZXNzIHRoYW4gUldTRU1fV0FJVElOR19CSUFTCkBAIC0xNjQsNyArMTY3LDggQEAKIAkJCSAqLwogCQkJaWYgKGF0b21pY19sb25nX2FkZF9yZXR1cm4oLWFkanVzdG1lbnQsICZzZW0tPmNvdW50KSA8CiAJCQkgICAgUldTRU1fV0FJVElOR19CSUFTKQotCQkJCWdvdG8gb3V0OworCQkJCXJldHVybjsKKwogCQkJLyogTGFzdCBhY3RpdmUgbG9ja2VyIGxlZnQuIFJldHJ5IHdha2luZyByZWFkZXJzLiAqLwogCQkJZ290byB0cnlfcmVhZGVyX2dyYW50OwogCQl9CkBAIC0xNzYsMzggKzE4MCwyMyBAQAogCQlyd3NlbV9zZXRfcmVhZGVyX293bmVkKHNlbSk7CiAJfQogCi0JLyogR3JhbnQgYW4gaW5maW5pdGUgbnVtYmVyIG9mIHJlYWQgbG9ja3MgdG8gdGhlIHJlYWRlcnMgYXQgdGhlIGZyb250Ci0JICogb2YgdGhlIHF1ZXVlLiAgTm90ZSB3ZSBpbmNyZW1lbnQgdGhlICdhY3RpdmUgcGFydCcgb2YgdGhlIGNvdW50IGJ5Ci0JICogdGhlIG51bWJlciBvZiByZWFkZXJzIGJlZm9yZSB3YWtpbmcgYW55IHByb2Nlc3NlcyB1cC4KKwkvKgorCSAqIEdyYW50IGFuIGluZmluaXRlIG51bWJlciBvZiByZWFkIGxvY2tzIHRvIHRoZSByZWFkZXJzIGF0IHRoZSBmcm9udAorCSAqIG9mIHRoZSBxdWV1ZS4gV2Uga25vdyB0aGF0IHdva2VuIHdpbGwgYmUgYXQgbGVhc3QgMSBhcyB3ZSBhY2NvdW50ZWQKKwkgKiBmb3IgYWJvdmUuIE5vdGUgd2UgaW5jcmVtZW50IHRoZSAnYWN0aXZlIHBhcnQnIG9mIHRoZSBjb3VudCBieSB0aGUKKwkgKiBudW1iZXIgb2YgcmVhZGVycyBiZWZvcmUgd2FraW5nIGFueSBwcm9jZXNzZXMgdXAuCiAJICovCi0Jd29rZW4gPSAwOwotCWRvIHsKLQkJd29rZW4rKzsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUod2FpdGVyLCB0bXAsICZzZW0tPndhaXRfbGlzdCwgbGlzdCkgeworCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKIAotCQlpZiAod2FpdGVyLT5saXN0Lm5leHQgPT0gJnNlbS0+d2FpdF9saXN0KQorCQlpZiAod2FpdGVyLT50eXBlID09IFJXU0VNX1dBSVRJTkdfRk9SX1dSSVRFKQogCQkJYnJlYWs7CiAKLQkJd2FpdGVyID0gbGlzdF9lbnRyeSh3YWl0ZXItPmxpc3QubmV4dCwKLQkJCQkJc3RydWN0IHJ3c2VtX3dhaXRlciwgbGlzdCk7Ci0KLQl9IHdoaWxlICh3YWl0ZXItPnR5cGUgIT0gUldTRU1fV0FJVElOR19GT1JfV1JJVEUpOwotCi0JYWRqdXN0bWVudCA9IHdva2VuICogUldTRU1fQUNUSVZFX1JFQURfQklBUyAtIGFkanVzdG1lbnQ7Ci0JaWYgKHdhaXRlci0+dHlwZSAhPSBSV1NFTV9XQUlUSU5HX0ZPUl9XUklURSkKLQkJLyogaGl0IGVuZCBvZiBsaXN0IGFib3ZlICovCi0JCWFkanVzdG1lbnQgLT0gUldTRU1fV0FJVElOR19CSUFTOwotCi0JaWYgKGFkanVzdG1lbnQpCi0JCWF0b21pY19sb25nX2FkZChhZGp1c3RtZW50LCAmc2VtLT5jb3VudCk7Ci0KLQluZXh0ID0gc2VtLT53YWl0X2xpc3QubmV4dDsKLQlsb29wID0gd29rZW47Ci0JZG8gewotCQl3YWl0ZXIgPSBsaXN0X2VudHJ5KG5leHQsIHN0cnVjdCByd3NlbV93YWl0ZXIsIGxpc3QpOwotCQluZXh0ID0gd2FpdGVyLT5saXN0Lm5leHQ7CisJCXdva2VuKys7CiAJCXRzayA9IHdhaXRlci0+dGFzazsKIAogCQl3YWtlX3FfYWRkKHdha2VfcSwgdHNrKTsKKwkJbGlzdF9kZWwoJndhaXRlci0+bGlzdCk7CiAJCS8qCiAJCSAqIEVuc3VyZSB0aGF0IHRoZSBsYXN0IG9wZXJhdGlvbiBpcyBzZXR0aW5nIHRoZSByZWFkZXIKIAkJICogd2FpdGVyIHRvIG5pbCBzdWNoIHRoYXQgcndzZW1fZG93bl9yZWFkX2ZhaWxlZCgpIGNhbm5vdApAQCAtMjE1LDEzICsyMDQsMTYgQEAKIAkJICogdG8gdGhlIHRhc2sgdG8gd2FrZXVwLgogCQkgKi8KIAkJc21wX3N0b3JlX3JlbGVhc2UoJndhaXRlci0+dGFzaywgTlVMTCk7Ci0JfSB3aGlsZSAoLS1sb29wKTsKKwl9CiAKLQlzZW0tPndhaXRfbGlzdC5uZXh0ID0gbmV4dDsKLQluZXh0LT5wcmV2ID0gJnNlbS0+d2FpdF9saXN0OworCWFkanVzdG1lbnQgPSB3b2tlbiAqIFJXU0VNX0FDVElWRV9SRUFEX0JJQVMgLSBhZGp1c3RtZW50OworCWlmIChsaXN0X2VtcHR5KCZzZW0tPndhaXRfbGlzdCkpIHsKKwkJLyogaGl0IGVuZCBvZiBsaXN0IGFib3ZlICovCisJCWFkanVzdG1lbnQgLT0gUldTRU1fV0FJVElOR19CSUFTOworCX0KIAotIG91dDoKLQlyZXR1cm4gc2VtOworCWlmIChhZGp1c3RtZW50KQorCQlhdG9taWNfbG9uZ19hZGQoYWRqdXN0bWVudCwgJnNlbS0+Y291bnQpOwogfQogCiAvKgpAQCAtMjM1LDcgKzIyNyw2IEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwogCVdBS0VfUSh3YWtlX3EpOwogCi0JLyogc2V0IHVwIG15IG93biBzdHlsZSBvZiB3YWl0cXVldWUgKi8KIAl3YWl0ZXIudGFzayA9IHRzazsKIAl3YWl0ZXIudHlwZSA9IFJXU0VNX1dBSVRJTkdfRk9SX1JFQUQ7CiAKQEAgLTI0Nyw3ICsyMzgsOCBAQAogCS8qIHdlJ3JlIG5vdyB3YWl0aW5nIG9uIHRoZSBsb2NrLCBidXQgbm8gbG9uZ2VyIGFjdGl2ZWx5IGxvY2tpbmcgKi8KIAljb3VudCA9IGF0b21pY19sb25nX2FkZF9yZXR1cm4oYWRqdXN0bWVudCwgJnNlbS0+Y291bnQpOwogCi0JLyogSWYgdGhlcmUgYXJlIG5vIGFjdGl2ZSBsb2Nrcywgd2FrZSB0aGUgZnJvbnQgcXVldWVkIHByb2Nlc3MoZXMpLgorCS8qCisJICogSWYgdGhlcmUgYXJlIG5vIGFjdGl2ZSBsb2Nrcywgd2FrZSB0aGUgZnJvbnQgcXVldWVkIHByb2Nlc3MoZXMpLgogCSAqCiAJICogSWYgdGhlcmUgYXJlIG5vIHdyaXRlcnMgYW5kIHdlIGFyZSBmaXJzdCBpbiB0aGUgcXVldWUsCiAJICogd2FrZSBvdXIgb3duIHdhaXRlciB0byBqb2luIHRoZSBleGlzdGluZyBhY3RpdmUgcmVhZGVycyAhCkBAIC0yNTUsNyArMjQ3LDcgQEAKIAlpZiAoY291bnQgPT0gUldTRU1fV0FJVElOR19CSUFTIHx8CiAJICAgIChjb3VudCA+IFJXU0VNX1dBSVRJTkdfQklBUyAmJgogCSAgICAgYWRqdXN0bWVudCAhPSAtUldTRU1fQUNUSVZFX1JFQURfQklBUykpCi0JCXNlbSA9IF9fcndzZW1fbWFya193YWtlKHNlbSwgUldTRU1fV0FLRV9BTlksICZ3YWtlX3EpOworCQlfX3J3c2VtX21hcmtfd2FrZShzZW0sIFJXU0VNX1dBS0VfQU5ZLCAmd2FrZV9xKTsKIAogCXJhd19zcGluX3VubG9ja19pcnEoJnNlbS0+d2FpdF9sb2NrKTsKIAl3YWtlX3VwX3EoJndha2VfcSk7CkBAIC01MDUsNyArNDk3LDcgQEAKIAkJaWYgKGNvdW50ID4gUldTRU1fV0FJVElOR19CSUFTKSB7CiAJCQlXQUtFX1Eod2FrZV9xKTsKIAotCQkJc2VtID0gX19yd3NlbV9tYXJrX3dha2Uoc2VtLCBSV1NFTV9XQUtFX1JFQURFUlMsICZ3YWtlX3EpOworCQkJX19yd3NlbV9tYXJrX3dha2Uoc2VtLCBSV1NFTV9XQUtFX1JFQURFUlMsICZ3YWtlX3EpOwogCQkJLyoKIAkJCSAqIFRoZSB3YWtldXAgaXMgbm9ybWFsbHkgY2FsbGVkIF9hZnRlcl8gdGhlIHdhaXRfbG9jawogCQkJICogaXMgcmVsZWFzZWQsIGJ1dCBnaXZlbiB0aGF0IHdlIGFyZSBwcm9hY3RpdmVseSB3YWtpbmcKQEAgLTYxNCw5ICs2MDYsOCBAQAogCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmc2VtLT53YWl0X2xvY2ssIGZsYWdzKTsKIGxvY2tlZDoKIAotCS8qIGRvIG5vdGhpbmcgaWYgbGlzdCBlbXB0eSAqLwogCWlmICghbGlzdF9lbXB0eSgmc2VtLT53YWl0X2xpc3QpKQotCQlzZW0gPSBfX3J3c2VtX21hcmtfd2FrZShzZW0sIFJXU0VNX1dBS0VfQU5ZLCAmd2FrZV9xKTsKKwkJX19yd3NlbV9tYXJrX3dha2Uoc2VtLCBSV1NFTV9XQUtFX0FOWSwgJndha2VfcSk7CiAKIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VtLT53YWl0X2xvY2ssIGZsYWdzKTsKIAl3YWtlX3VwX3EoJndha2VfcSk7CkBAIC02MzgsOSArNjI5LDggQEAKIAogCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmc2VtLT53YWl0X2xvY2ssIGZsYWdzKTsKIAotCS8qIGRvIG5vdGhpbmcgaWYgbGlzdCBlbXB0eSAqLwogCWlmICghbGlzdF9lbXB0eSgmc2VtLT53YWl0X2xpc3QpKQotCQlzZW0gPSBfX3J3c2VtX21hcmtfd2FrZShzZW0sIFJXU0VNX1dBS0VfUkVBRF9PV05FRCwgJndha2VfcSk7CisJCV9fcndzZW1fbWFya193YWtlKHNlbSwgUldTRU1fV0FLRV9SRUFEX09XTkVELCAmd2FrZV9xKTsKIAogCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZW0tPndhaXRfbG9jaywgZmxhZ3MpOwogCXdha2VfdXBfcSgmd2FrZV9xKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9tZW1yZW1hcC5jIGIva2VybmVsL21lbXJlbWFwLmMKaW5kZXggMjUxZDE2Yi4uYjUwMWUzOSAxMDA2NDQKLS0tIGEva2VybmVsL21lbXJlbWFwLmMKKysrIGIva2VybmVsL21lbXJlbWFwLmMKQEAgLTI0Nyw2ICsyNDcsNyBAQAogCWFsaWduX3N0YXJ0ID0gcmVzLT5zdGFydCAmIH4oU0VDVElPTl9TSVpFIC0gMSk7CiAJYWxpZ25fc2l6ZSA9IEFMSUdOKHJlc291cmNlX3NpemUocmVzKSwgU0VDVElPTl9TSVpFKTsKIAlhcmNoX3JlbW92ZV9tZW1vcnkoYWxpZ25fc3RhcnQsIGFsaWduX3NpemUpOworCXVudHJhY2tfcGZuKE5VTEwsIFBIWVNfUEZOKGFsaWduX3N0YXJ0KSwgYWxpZ25fc2l6ZSk7CiAJcGdtYXBfcmFkaXhfcmVsZWFzZShyZXMpOwogCWRldl9XQVJOX09OQ0UoZGV2LCBwZ21hcC0+YWx0bWFwICYmIHBnbWFwLT5hbHRtYXAtPmFsbG9jLAogCQkJIiVzOiBmYWlsZWQgdG8gZnJlZSBhbGwgcmVzZXJ2ZWQgcGFnZXNcbiIsIF9fZnVuY19fKTsKQEAgLTI4Miw2ICsyODMsNyBAQAogCQlzdHJ1Y3QgcGVyY3B1X3JlZiAqcmVmLCBzdHJ1Y3Qgdm1lbV9hbHRtYXAgKmFsdG1hcCkKIHsKIAlyZXNvdXJjZV9zaXplX3Qga2V5LCBhbGlnbl9zdGFydCwgYWxpZ25fc2l6ZSwgYWxpZ25fZW5kOworCXBncHJvdF90IHBncHJvdCA9IFBBR0VfS0VSTkVMOwogCXN0cnVjdCBkZXZfcGFnZW1hcCAqcGdtYXA7CiAJc3RydWN0IHBhZ2VfbWFwICpwYWdlX21hcDsKIAlpbnQgZXJyb3IsIG5pZCwgaXNfcmFtOwpAQCAtMzUxLDYgKzM1MywxMSBAQAogCWlmIChuaWQgPCAwKQogCQluaWQgPSBudW1hX21lbV9pZCgpOwogCisJZXJyb3IgPSB0cmFja19wZm5fcmVtYXAoTlVMTCwgJnBncHJvdCwgUEhZU19QRk4oYWxpZ25fc3RhcnQpLCAwLAorCQkJYWxpZ25fc2l6ZSk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycl9wZm5fcmVtYXA7CisKIAllcnJvciA9IGFyY2hfYWRkX21lbW9yeShuaWQsIGFsaWduX3N0YXJ0LCBhbGlnbl9zaXplLCB0cnVlKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZXJyX2FkZF9tZW1vcnk7CkBAIC0zNzEsNiArMzc4LDggQEAKIAlyZXR1cm4gX192YShyZXMtPnN0YXJ0KTsKIAogIGVycl9hZGRfbWVtb3J5OgorCXVudHJhY2tfcGZuKE5VTEwsIFBIWVNfUEZOKGFsaWduX3N0YXJ0KSwgYWxpZ25fc2l6ZSk7CisgZXJyX3Bmbl9yZW1hcDoKICBlcnJfcmFkaXg6CiAJcGdtYXBfcmFkaXhfcmVsZWFzZShyZXMpOwogCWRldnJlc19mcmVlKHBhZ2VfbWFwKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wYWRhdGEuYyBiL2tlcm5lbC9wYWRhdGEuYwppbmRleCA5OTMyNzg4Li43ODQ4ZjA1IDEwMDY0NAotLS0gYS9rZXJuZWwvcGFkYXRhLmMKKysrIGIva2VybmVsL3BhZGF0YS5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2RlZmluZSBNQVhfT0JKX05VTSAxMDAwCiAKQEAgLTc2OSw1MiArNzcwLDQzIEBACiAJCWNwdW1hc2tfdGVzdF9jcHUoY3B1LCBwaW5zdC0+Y3B1bWFzay5jYmNwdSk7CiB9CiAKLQotc3RhdGljIGludCBwYWRhdGFfY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQorc3RhdGljIGludCBwYWRhdGFfY3B1X29ubGluZSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSkKIHsKLQlpbnQgZXJyOwogCXN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0OwotCWludCBjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OworCWludCByZXQ7CiAKLQlwaW5zdCA9IGNvbnRhaW5lcl9vZihuZmIsIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UsIGNwdV9ub3RpZmllcik7CisJcGluc3QgPSBobGlzdF9lbnRyeV9zYWZlKG5vZGUsIHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UsIG5vZGUpOworCWlmICghcGluc3RfaGFzX2NwdShwaW5zdCwgY3B1KSkKKwkJcmV0dXJuIDA7CiAKLQlzd2l0Y2ggKGFjdGlvbikgewotCWNhc2UgQ1BVX09OTElORToKLQljYXNlIENQVV9PTkxJTkVfRlJPWkVOOgotCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgotCWNhc2UgQ1BVX0RPV05fRkFJTEVEX0ZST1pFTjoKLQkJaWYgKCFwaW5zdF9oYXNfY3B1KHBpbnN0LCBjcHUpKQotCQkJYnJlYWs7Ci0JCW11dGV4X2xvY2soJnBpbnN0LT5sb2NrKTsKLQkJZXJyID0gX19wYWRhdGFfYWRkX2NwdShwaW5zdCwgY3B1KTsKLQkJbXV0ZXhfdW5sb2NrKCZwaW5zdC0+bG9jayk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gbm90aWZpZXJfZnJvbV9lcnJubyhlcnIpOwotCQlicmVhazsKLQotCWNhc2UgQ1BVX0RPV05fUFJFUEFSRToKLQljYXNlIENQVV9ET1dOX1BSRVBBUkVfRlJPWkVOOgotCWNhc2UgQ1BVX1VQX0NBTkNFTEVEOgotCWNhc2UgQ1BVX1VQX0NBTkNFTEVEX0ZST1pFTjoKLQkJaWYgKCFwaW5zdF9oYXNfY3B1KHBpbnN0LCBjcHUpKQotCQkJYnJlYWs7Ci0JCW11dGV4X2xvY2soJnBpbnN0LT5sb2NrKTsKLQkJZXJyID0gX19wYWRhdGFfcmVtb3ZlX2NwdShwaW5zdCwgY3B1KTsKLQkJbXV0ZXhfdW5sb2NrKCZwaW5zdC0+bG9jayk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gbm90aWZpZXJfZnJvbV9lcnJubyhlcnIpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gTk9USUZZX09LOworCW11dGV4X2xvY2soJnBpbnN0LT5sb2NrKTsKKwlyZXQgPSBfX3BhZGF0YV9hZGRfY3B1KHBpbnN0LCBjcHUpOworCW11dGV4X3VubG9jaygmcGluc3QtPmxvY2spOworCXJldHVybiByZXQ7CiB9CisKK3N0YXRpYyBpbnQgcGFkYXRhX2NwdV9wcmVwX2Rvd24odW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUpCit7CisJc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3Q7CisJaW50IHJldDsKKworCXBpbnN0ID0gaGxpc3RfZW50cnlfc2FmZShub2RlLCBzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlLCBub2RlKTsKKwlpZiAoIXBpbnN0X2hhc19jcHUocGluc3QsIGNwdSkpCisJCXJldHVybiAwOworCisJbXV0ZXhfbG9jaygmcGluc3QtPmxvY2spOworCXJldCA9IF9fcGFkYXRhX3JlbW92ZV9jcHUocGluc3QsIGNwdSk7CisJbXV0ZXhfdW5sb2NrKCZwaW5zdC0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGVudW0gY3B1aHBfc3RhdGUgaHBfb25saW5lOwogI2VuZGlmCiAKIHN0YXRpYyB2b2lkIF9fcGFkYXRhX2ZyZWUoc3RydWN0IHBhZGF0YV9pbnN0YW5jZSAqcGluc3QpCiB7CiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi0JdW5yZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJnBpbnN0LT5jcHVfbm90aWZpZXIpOworCWNwdWhwX3N0YXRlX3JlbW92ZV9pbnN0YW5jZV9ub2NhbGxzKGhwX29ubGluZSwgJnBpbnN0LT5ub2RlKTsKICNlbmRpZgogCiAJcGFkYXRhX3N0b3AocGluc3QpOwpAQCAtMTAxMiwxMSArMTAwNCw4IEBACiAJbXV0ZXhfaW5pdCgmcGluc3QtPmxvY2spOwogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi0JcGluc3QtPmNwdV9ub3RpZmllci5ub3RpZmllcl9jYWxsID0gcGFkYXRhX2NwdV9jYWxsYmFjazsKLQlwaW5zdC0+Y3B1X25vdGlmaWVyLnByaW9yaXR5ID0gMDsKLQlyZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJnBpbnN0LT5jcHVfbm90aWZpZXIpOworCWNwdWhwX3N0YXRlX2FkZF9pbnN0YW5jZV9ub2NhbGxzKGhwX29ubGluZSwgJnBpbnN0LT5ub2RlKTsKICNlbmRpZgotCiAJcmV0dXJuIHBpbnN0OwogCiBlcnJfZnJlZV9tYXNrczoKQEAgLTEwMzksMyArMTAyOCwyNiBAQAogCWtvYmplY3RfcHV0KCZwaW5zdC0+a29iaik7CiB9CiBFWFBPUlRfU1lNQk9MKHBhZGF0YV9mcmVlKTsKKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCitzdGF0aWMgX19pbml0IGludCBwYWRhdGFfZHJpdmVyX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gY3B1aHBfc2V0dXBfc3RhdGVfbXVsdGkoQ1BVSFBfQVBfT05MSU5FX0RZTiwgInBhZGF0YTpvbmxpbmUiLAorCQkJCSAgICAgIHBhZGF0YV9jcHVfb25saW5lLAorCQkJCSAgICAgIHBhZGF0YV9jcHVfcHJlcF9kb3duKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlocF9vbmxpbmUgPSByZXQ7CisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdChwYWRhdGFfZHJpdmVyX2luaXQpOworCitzdGF0aWMgX19leGl0IHZvaWQgcGFkYXRhX2RyaXZlcl9leGl0KHZvaWQpCit7CisJY3B1aHBfcmVtb3ZlX211bHRpX3N0YXRlKGhwX29ubGluZSk7Cit9Cittb2R1bGVfZXhpdChwYWRhdGFfZHJpdmVyX2V4aXQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9rZXJuZWwvcGlkX25hbWVzcGFjZS5jIGIva2VybmVsL3BpZF9uYW1lc3BhY2UuYwppbmRleCBhNjViYTEzLi5kZjllOGU5IDEwMDY0NAotLS0gYS9rZXJuZWwvcGlkX25hbWVzcGFjZS5jCisrKyBiL2tlcm5lbC9waWRfbmFtZXNwYWNlLmMKQEAgLTc5LDIzICs3OSwzNiBAQAogLyogTUFYX1BJRF9OU19MRVZFTCBpcyBuZWVkZWQgZm9yIGxpbWl0aW5nIHNpemUgb2YgJ3N0cnVjdCBwaWQnICovCiAjZGVmaW5lIE1BWF9QSURfTlNfTEVWRUwgMzIKIAorc3RhdGljIHN0cnVjdCB1Y291bnRzICppbmNfcGlkX25hbWVzcGFjZXMoc3RydWN0IHVzZXJfbmFtZXNwYWNlICpucykKK3sKKwlyZXR1cm4gaW5jX3Vjb3VudChucywgY3VycmVudF9ldWlkKCksIFVDT1VOVF9QSURfTkFNRVNQQUNFUyk7Cit9CisKK3N0YXRpYyB2b2lkIGRlY19waWRfbmFtZXNwYWNlcyhzdHJ1Y3QgdWNvdW50cyAqdWNvdW50cykKK3sKKwlkZWNfdWNvdW50KHVjb3VudHMsIFVDT1VOVF9QSURfTkFNRVNQQUNFUyk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqY3JlYXRlX3BpZF9uYW1lc3BhY2Uoc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zLAogCXN0cnVjdCBwaWRfbmFtZXNwYWNlICpwYXJlbnRfcGlkX25zKQogewogCXN0cnVjdCBwaWRfbmFtZXNwYWNlICpuczsKIAl1bnNpZ25lZCBpbnQgbGV2ZWwgPSBwYXJlbnRfcGlkX25zLT5sZXZlbCArIDE7CisJc3RydWN0IHVjb3VudHMgKnVjb3VudHM7CiAJaW50IGk7CiAJaW50IGVycjsKIAotCWlmIChsZXZlbCA+IE1BWF9QSURfTlNfTEVWRUwpIHsKLQkJZXJyID0gLUVJTlZBTDsKKwllcnIgPSAtRU5PU1BDOworCWlmIChsZXZlbCA+IE1BWF9QSURfTlNfTEVWRUwpCiAJCWdvdG8gb3V0OwotCX0KKwl1Y291bnRzID0gaW5jX3BpZF9uYW1lc3BhY2VzKHVzZXJfbnMpOworCWlmICghdWNvdW50cykKKwkJZ290byBvdXQ7CiAKIAllcnIgPSAtRU5PTUVNOwogCW5zID0ga21lbV9jYWNoZV96YWxsb2MocGlkX25zX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CiAJaWYgKG5zID09IE5VTEwpCi0JCWdvdG8gb3V0OworCQlnb3RvIG91dF9kZWM7CiAKIAlucy0+cGlkbWFwWzBdLnBhZ2UgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFucy0+cGlkbWFwWzBdLnBhZ2UpCkBAIC0xMTQsNiArMTI3LDcgQEAKIAlucy0+bGV2ZWwgPSBsZXZlbDsKIAlucy0+cGFyZW50ID0gZ2V0X3BpZF9ucyhwYXJlbnRfcGlkX25zKTsKIAlucy0+dXNlcl9ucyA9IGdldF91c2VyX25zKHVzZXJfbnMpOworCW5zLT51Y291bnRzID0gdWNvdW50czsKIAlucy0+bnJfaGFzaGVkID0gUElETlNfSEFTSF9BRERJTkc7CiAJSU5JVF9XT1JLKCZucy0+cHJvY193b3JrLCBwcm9jX2NsZWFudXBfd29yayk7CiAKQEAgLTEyOSw2ICsxNDMsOCBAQAogCWtmcmVlKG5zLT5waWRtYXBbMF0ucGFnZSk7CiBvdXRfZnJlZToKIAlrbWVtX2NhY2hlX2ZyZWUocGlkX25zX2NhY2hlcCwgbnMpOworb3V0X2RlYzoKKwlkZWNfcGlkX25hbWVzcGFjZXModWNvdW50cyk7CiBvdXQ6CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KQEAgLTE0Niw2ICsxNjIsNyBAQAogCW5zX2ZyZWVfaW51bSgmbnMtPm5zKTsKIAlmb3IgKGkgPSAwOyBpIDwgUElETUFQX0VOVFJJRVM7IGkrKykKIAkJa2ZyZWUobnMtPnBpZG1hcFtpXS5wYWdlKTsKKwlkZWNfcGlkX25hbWVzcGFjZXMobnMtPnVjb3VudHMpOwogCXB1dF91c2VyX25zKG5zLT51c2VyX25zKTsKIAljYWxsX3JjdSgmbnMtPnJjdSwgZGVsYXllZF9mcmVlX3BpZG5zKTsKIH0KQEAgLTM4OCwxMiArNDA1LDM3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgbnNfY29tbW9uICpwaWRuc19nZXRfcGFyZW50KHN0cnVjdCBuc19jb21tb24gKm5zKQoreworCXN0cnVjdCBwaWRfbmFtZXNwYWNlICphY3RpdmUgPSB0YXNrX2FjdGl2ZV9waWRfbnMoY3VycmVudCk7CisJc3RydWN0IHBpZF9uYW1lc3BhY2UgKnBpZF9ucywgKnA7CisKKwkvKiBTZWUgaWYgdGhlIHBhcmVudCBpcyBpbiB0aGUgY3VycmVudCBuYW1lc3BhY2UgKi8KKwlwaWRfbnMgPSBwID0gdG9fcGlkX25zKG5zKS0+cGFyZW50OworCWZvciAoOzspIHsKKwkJaWYgKCFwKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVQRVJNKTsKKwkJaWYgKHAgPT0gYWN0aXZlKQorCQkJYnJlYWs7CisJCXAgPSBwLT5wYXJlbnQ7CisJfQorCisJcmV0dXJuICZnZXRfcGlkX25zKHBpZF9ucyktPm5zOworfQorCitzdGF0aWMgc3RydWN0IHVzZXJfbmFtZXNwYWNlICpwaWRuc19vd25lcihzdHJ1Y3QgbnNfY29tbW9uICpucykKK3sKKwlyZXR1cm4gdG9fcGlkX25zKG5zKS0+dXNlcl9uczsKK30KKwogY29uc3Qgc3RydWN0IHByb2NfbnNfb3BlcmF0aW9ucyBwaWRuc19vcGVyYXRpb25zID0gewogCS5uYW1lCQk9ICJwaWQiLAogCS50eXBlCQk9IENMT05FX05FV1BJRCwKIAkuZ2V0CQk9IHBpZG5zX2dldCwKIAkucHV0CQk9IHBpZG5zX3B1dCwKIAkuaW5zdGFsbAk9IHBpZG5zX2luc3RhbGwsCisJLm93bmVyCQk9IHBpZG5zX293bmVyLAorCS5nZXRfcGFyZW50CT0gcGlkbnNfZ2V0X3BhcmVudCwKIH07CiAKIHN0YXRpYyBfX2luaXQgaW50IHBpZF9uYW1lc3BhY2VzX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9LY29uZmlnIGIva2VybmVsL3Bvd2VyL0tjb25maWcKaW5kZXggNjhkM2ViYy4uZTg1MTdiNiAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL0tjb25maWcKKysrIGIva2VybmVsL3Bvd2VyL0tjb25maWcKQEAgLTE4Niw3ICsxODYsNyBAQAogCiBjb25maWcgRFBNX1dBVENIRE9HCiAJYm9vbCAiRGV2aWNlIHN1c3BlbmQvcmVzdW1lIHdhdGNoZG9nIgotCWRlcGVuZHMgb24gUE1fREVCVUcgJiYgUFNUT1JFCisJZGVwZW5kcyBvbiBQTV9ERUJVRyAmJiBQU1RPUkUgJiYgRVhQRVJUCiAJLS0taGVscC0tLQogCSAgU2V0cyB1cCBhIHdhdGNoZG9nIHRpbWVyIHRvIGNhcHR1cmUgZHJpdmVycyB0aGF0IGFyZQogCSAgbG9ja2VkIHVwIGF0dGVtcHRpbmcgdG8gc3VzcGVuZC9yZXN1bWUgYSBkZXZpY2UuCkBAIC0xOTcsNyArMTk3LDcgQEAKIGNvbmZpZyBEUE1fV0FUQ0hET0dfVElNRU9VVAogCWludCAiV2F0Y2hkb2cgdGltZW91dCBpbiBzZWNvbmRzIgogCXJhbmdlIDEgMTIwCi0JZGVmYXVsdCA2MAorCWRlZmF1bHQgMTIwCiAJZGVwZW5kcyBvbiBEUE1fV0FUQ0hET0cKIAogY29uZmlnIFBNX1RSQUNFCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmMgYi9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmMKaW5kZXggMzNjNzliNi4uYjI2ZGJjNCAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jCisrKyBiL2tlcm5lbC9wb3dlci9oaWJlcm5hdGUuYwpAQCAtMzA2LDggKzMwNiwxMCBAQAogCWlmIChlcnJvcikKIAkJcHJpbnRrKEtFUk5fRVJSICJQTTogRXJyb3IgJWQgY3JlYXRpbmcgaGliZXJuYXRpb24gaW1hZ2VcbiIsCiAJCQllcnJvcik7Ci0JaWYgKCFpbl9zdXNwZW5kKQorCWlmICghaW5fc3VzcGVuZCkgewogCQlldmVudHNfY2hlY2tfZW5hYmxlZCA9IGZhbHNlOworCQljbGVhcl9mcmVlX3BhZ2VzKCk7CisJfQogCiAJcGxhdGZvcm1fbGVhdmUocGxhdGZvcm1fbW9kZSk7CiAKQEAgLTExODksMjIgKzExOTEsNiBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBwYWdlX3BvaXNvbl9ub2hpYmVybmF0ZV9zZXR1cChjaGFyICpzdHIpCi17Ci0jaWZkZWYgQ09ORklHX1BBR0VfUE9JU09OSU5HX1pFUk8KLQkvKgotCSAqIFRoZSB6ZXJvaW5nIG9wdGlvbiBmb3IgcGFnZSBwb2lzb24gc2tpcHMgdGhlIGNoZWNrcyBvbiBhbGxvYy4KLQkgKiBzaW5jZSBoaWJlcm5hdGlvbiBkb2Vzbid0IHNhdmUgZnJlZSBwYWdlcyB0aGVyZSdzIG5vIHdheSB0bwotCSAqIGd1YXJhbnRlZSB0aGUgcGFnZXMgd2lsbCBzdGlsbCBiZSB6ZXJvZWQuCi0JICovCi0JaWYgKCFzdHJjbXAoc3RyLCAib24iKSkgewotCQlwcl9pbmZvKCJEaXNhYmxpbmcgaGliZXJuYXRpb24gZHVlIHRvIHBhZ2UgcG9pc29uaW5nXG4iKTsKLQkJcmV0dXJuIG5vaGliZXJuYXRlX3NldHVwKHN0cik7Ci0JfQotI2VuZGlmCi0JcmV0dXJuIDE7Ci19Ci0KIF9fc2V0dXAoIm5vcmVzdW1lIiwgbm9yZXN1bWVfc2V0dXApOwogX19zZXR1cCgicmVzdW1lX29mZnNldD0iLCByZXN1bWVfb2Zmc2V0X3NldHVwKTsKIF9fc2V0dXAoInJlc3VtZT0iLCByZXN1bWVfc2V0dXApOwpAQCAtMTIxMiw0ICsxMTk4LDMgQEAKIF9fc2V0dXAoInJlc3VtZXdhaXQiLCByZXN1bWV3YWl0X3NldHVwKTsKIF9fc2V0dXAoInJlc3VtZWRlbGF5PSIsIHJlc3VtZWRlbGF5X3NldHVwKTsKIF9fc2V0dXAoIm5vaGliZXJuYXRlIiwgbm9oaWJlcm5hdGVfc2V0dXApOwotX19zZXR1cCgicGFnZV9wb2lzb249IiwgcGFnZV9wb2lzb25fbm9oaWJlcm5hdGVfc2V0dXApOwpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL21haW4uYyBiL2tlcm5lbC9wb3dlci9tYWluLmMKaW5kZXggNWVhNTBiMS4uMjgxYTY5NyAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL21haW4uYworKysgYi9rZXJuZWwvcG93ZXIvbWFpbi5jCkBAIC02NDQsNiArNjQ0LDcgQEAKIAkJcmV0dXJuIGVycm9yOwogCWhpYmVybmF0ZV9pbWFnZV9zaXplX2luaXQoKTsKIAloaWJlcm5hdGVfcmVzZXJ2ZWRfc2l6ZV9pbml0KCk7CisJcG1fc3RhdGVzX2luaXQoKTsKIAlwb3dlcl9rb2JqID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZCgicG93ZXIiLCBOVUxMKTsKIAlpZiAoIXBvd2VyX2tvYmopCiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3Bvd2VyLmggYi9rZXJuZWwvcG93ZXIvcG93ZXIuaAppbmRleCAyNDJkOGI4Li41NmQxZDBkIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvcG93ZXIuaAorKysgYi9rZXJuZWwvcG93ZXIvcG93ZXIuaApAQCAtMTEwLDYgKzExMCw4IEBACiBleHRlcm4gdm9pZCBmcmVlX2Jhc2ljX21lbW9yeV9iaXRtYXBzKHZvaWQpOwogZXh0ZXJuIGludCBoaWJlcm5hdGVfcHJlYWxsb2NhdGVfbWVtb3J5KHZvaWQpOwogCitleHRlcm4gdm9pZCBjbGVhcl9mcmVlX3BhZ2VzKHZvaWQpOworCiAvKioKICAqCUF1eGlsaWFyeSBzdHJ1Y3R1cmUgdXNlZCBmb3IgcmVhZGluZyB0aGUgc25hcHNob3QgaW1hZ2UgZGF0YSBhbmQKICAqCW1ldGFkYXRhIGZyb20gYW5kIHdyaXRpbmcgdGhlbSB0byB0aGUgbGlzdCBvZiBwYWdlIGJhY2t1cCBlbnRyaWVzCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvcW9zLmMgYi9rZXJuZWwvcG93ZXIvcW9zLmMKaW5kZXggOTdiMGRmNy4uMTY4ZmY0NCAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3Fvcy5jCisrKyBiL2tlcm5lbC9wb3dlci9xb3MuYwpAQCAtNDgyLDcgKzQ4MiwxNiBAQAogCQlyZXR1cm47CiAJfQogCi0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZyZXEtPndvcmspOworCS8qCisJICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIHZlcnkgZWFybHkgZHVyaW5nIGJvb3QsIGZvciBleGFtcGxlLAorCSAqIGZyb20gb2ZfY2xrX2luaXQoKSwgd2hlcmUgaXJxIG5lZWRzIHRvIHN0YXkgZGlzYWJsZWQuCisJICogY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCkgYXNzdW1lcyB0aGF0IGlycSBpcyBlbmFibGVkIG9uCisJICogaW52b2NhdGlvbiBhbmQgcmUtZW5hYmxlcyBpdCBvbiByZXR1cm4uICBBdm9pZCBjYWxsaW5nIGl0IHVudGlsCisJICogd29ya3F1ZXVlIGlzIGluaXRpYWxpemVkLgorCSAqLworCWlmIChrZXZlbnRkX3VwKCkpCisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcmVxLT53b3JrKTsKKwogCV9fcG1fcW9zX3VwZGF0ZV9yZXF1ZXN0KHJlcSwgbmV3X3ZhbHVlKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBtX3Fvc191cGRhdGVfcmVxdWVzdCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvc25hcHNob3QuYyBiL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jCmluZGV4IDlhMDE3OGMuLjRmMGYwNjAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jCisrKyBiL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jCkBAIC04MzUsOSArODM1LDkgQEAKICAqLwogc3RhdGljIGJvb2wgcnRyZWVfbmV4dF9ub2RlKHN0cnVjdCBtZW1vcnlfYml0bWFwICpibSkKIHsKLQlibS0+Y3VyLm5vZGUgPSBsaXN0X2VudHJ5KGJtLT5jdXIubm9kZS0+bGlzdC5uZXh0LAotCQkJCSAgc3RydWN0IHJ0cmVlX25vZGUsIGxpc3QpOwotCWlmICgmYm0tPmN1ci5ub2RlLT5saXN0ICE9ICZibS0+Y3VyLnpvbmUtPmxlYXZlcykgeworCWlmICghbGlzdF9pc19sYXN0KCZibS0+Y3VyLm5vZGUtPmxpc3QsICZibS0+Y3VyLnpvbmUtPmxlYXZlcykpIHsKKwkJYm0tPmN1ci5ub2RlID0gbGlzdF9lbnRyeShibS0+Y3VyLm5vZGUtPmxpc3QubmV4dCwKKwkJCQkJICBzdHJ1Y3QgcnRyZWVfbm9kZSwgbGlzdCk7CiAJCWJtLT5jdXIubm9kZV9wZm4gKz0gQk1fQklUU19QRVJfQkxPQ0s7CiAJCWJtLT5jdXIubm9kZV9iaXQgID0gMDsKIAkJdG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZygpOwpAQCAtODQ1LDkgKzg0NSw5IEBACiAJfQogCiAJLyogTm8gbW9yZSBub2RlcywgZ290byBuZXh0IHpvbmUgKi8KLQlibS0+Y3VyLnpvbmUgPSBsaXN0X2VudHJ5KGJtLT5jdXIuem9uZS0+bGlzdC5uZXh0LAorCWlmICghbGlzdF9pc19sYXN0KCZibS0+Y3VyLnpvbmUtPmxpc3QsICZibS0+em9uZXMpKSB7CisJCWJtLT5jdXIuem9uZSA9IGxpc3RfZW50cnkoYm0tPmN1ci56b25lLT5saXN0Lm5leHQsCiAJCQkJICBzdHJ1Y3QgbWVtX3pvbmVfYm1fcnRyZWUsIGxpc3QpOwotCWlmICgmYm0tPmN1ci56b25lLT5saXN0ICE9ICZibS0+em9uZXMpIHsKIAkJYm0tPmN1ci5ub2RlID0gbGlzdF9lbnRyeShibS0+Y3VyLnpvbmUtPmxlYXZlcy5uZXh0LAogCQkJCQkgIHN0cnVjdCBydHJlZV9ub2RlLCBsaXN0KTsKIAkJYm0tPmN1ci5ub2RlX3BmbiA9IDA7CkBAIC0xMTMyLDYgKzExMzIsMjggQEAKIAlwcl9kZWJ1ZygiUE06IEJhc2ljIG1lbW9yeSBiaXRtYXBzIGZyZWVkXG4iKTsKIH0KIAordm9pZCBjbGVhcl9mcmVlX3BhZ2VzKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1BBR0VfUE9JU09OSU5HX1pFUk8KKwlzdHJ1Y3QgbWVtb3J5X2JpdG1hcCAqYm0gPSBmcmVlX3BhZ2VzX21hcDsKKwl1bnNpZ25lZCBsb25nIHBmbjsKKworCWlmIChXQVJOX09OKCEoZnJlZV9wYWdlc19tYXApKSkKKwkJcmV0dXJuOworCisJbWVtb3J5X2JtX3Bvc2l0aW9uX3Jlc2V0KGJtKTsKKwlwZm4gPSBtZW1vcnlfYm1fbmV4dF9wZm4oYm0pOworCXdoaWxlIChwZm4gIT0gQk1fRU5EX09GX01BUCkgeworCQlpZiAocGZuX3ZhbGlkKHBmbikpCisJCQljbGVhcl9oaWdocGFnZShwZm5fdG9fcGFnZShwZm4pKTsKKworCQlwZm4gPSBtZW1vcnlfYm1fbmV4dF9wZm4oYm0pOworCX0KKwltZW1vcnlfYm1fcG9zaXRpb25fcmVzZXQoYm0pOworCXByX2luZm8oIlBNOiBmcmVlIHBhZ2VzIGNsZWFyZWQgYWZ0ZXIgcmVzdG9yZVxuIik7CisjZW5kaWYgLyogUEFHRV9QT0lTT05JTkdfWkVSTyAqLworfQorCiAvKioKICAqIHNuYXBzaG90X2FkZGl0aW9uYWxfcGFnZXMgLSBFc3RpbWF0ZSB0aGUgbnVtYmVyIG9mIGV4dHJhIHBhZ2VzIG5lZWRlZC4KICAqIEB6b25lOiBNZW1vcnkgem9uZSB0byBjYXJyeSBvdXQgdGhlIGNvbXB1dGF0aW9uIGZvci4KZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9zdXNwZW5kLmMgYi9rZXJuZWwvcG93ZXIvc3VzcGVuZC5jCmluZGV4IDBhY2FiOWQuLjFlN2Y1ZGEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9zdXNwZW5kLmMKKysrIGIva2VybmVsL3Bvd2VyL3N1c3BlbmQuYwpAQCAtMTE4LDEwICsxMTgsMTggQEAKICAqLwogc3RhdGljIGJvb2wgcmVsYXRpdmVfc3RhdGVzOwogCit2b2lkIF9faW5pdCBwbV9zdGF0ZXNfaW5pdCh2b2lkKQoreworCS8qCisJICogZnJlZXplIHN0YXRlIHNob3VsZCBiZSBzdXBwb3J0ZWQgZXZlbiB3aXRob3V0IGFueSBzdXNwZW5kX29wcywKKwkgKiBpbml0aWFsaXplIHBtX3N0YXRlcyBhY2NvcmRpbmdseSBoZXJlCisJICovCisJcG1fc3RhdGVzW1BNX1NVU1BFTkRfRlJFRVpFXSA9IHBtX2xhYmVsc1tyZWxhdGl2ZV9zdGF0ZXMgPyAwIDogMl07Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IHNsZWVwX3N0YXRlc19zZXR1cChjaGFyICpzdHIpCiB7CiAJcmVsYXRpdmVfc3RhdGVzID0gIXN0cm5jbXAoc3RyLCAiMSIsIDEpOwotCXBtX3N0YXRlc1tQTV9TVVNQRU5EX0ZSRUVaRV0gPSBwbV9sYWJlbHNbcmVsYXRpdmVfc3RhdGVzID8gMCA6IDJdOwogCXJldHVybiAxOwogfQogCkBAIC0yMTEsNyArMjE5LDcgQEAKIHsKIAlpZiAoc3RhdGUgPT0gUE1fU1VTUEVORF9GUkVFWkUgJiYgZnJlZXplX29wcyAmJiBmcmVlemVfb3BzLT5iZWdpbikKIAkJcmV0dXJuIGZyZWV6ZV9vcHMtPmJlZ2luKCk7Ci0JZWxzZSBpZiAoc3VzcGVuZF9vcHMtPmJlZ2luKQorCWVsc2UgaWYgKHN1c3BlbmRfb3BzICYmIHN1c3BlbmRfb3BzLT5iZWdpbikKIAkJcmV0dXJuIHN1c3BlbmRfb3BzLT5iZWdpbihzdGF0ZSk7CiAJZWxzZQogCQlyZXR1cm4gMDsKQEAgLTIyMSw3ICsyMjksNyBAQAogewogCWlmIChzdGF0ZSA9PSBQTV9TVVNQRU5EX0ZSRUVaRSAmJiBmcmVlemVfb3BzICYmIGZyZWV6ZV9vcHMtPmVuZCkKIAkJZnJlZXplX29wcy0+ZW5kKCk7Ci0JZWxzZSBpZiAoc3VzcGVuZF9vcHMtPmVuZCkKKwllbHNlIGlmIChzdXNwZW5kX29wcyAmJiBzdXNwZW5kX29wcy0+ZW5kKQogCQlzdXNwZW5kX29wcy0+ZW5kKCk7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9wcmludGsvYnJhaWxsZS5jIGIva2VybmVsL3ByaW50ay9icmFpbGxlLmMKaW5kZXggMjc2NzYyZi4uZDU3NjBjNCAxMDA2NDQKLS0tIGEva2VybmVsL3ByaW50ay9icmFpbGxlLmMKKysrIGIva2VybmVsL3ByaW50ay9icmFpbGxlLmMKQEAgLTksMTAgKzksMTAgQEAKIAogY2hhciAqX2JyYWlsbGVfY29uc29sZV9zZXR1cChjaGFyICoqc3RyLCBjaGFyICoqYnJsX29wdGlvbnMpCiB7Ci0JaWYgKCFtZW1jbXAoKnN0ciwgImJybCwiLCA0KSkgeworCWlmICghc3RybmNtcCgqc3RyLCAiYnJsLCIsIDQpKSB7CiAJCSpicmxfb3B0aW9ucyA9ICIiOwogCQkqc3RyICs9IDQ7Ci0JfSBlbHNlIGlmICghbWVtY21wKHN0ciwgImJybD0iLCA0KSkgeworCX0gZWxzZSBpZiAoIXN0cm5jbXAoKnN0ciwgImJybD0iLCA0KSkgewogCQkqYnJsX29wdGlvbnMgPSAqc3RyICsgNDsKIAkJKnN0ciA9IHN0cmNocigqYnJsX29wdGlvbnMsICcsJyk7CiAJCWlmICghKnN0cikKZGlmZiAtLWdpdCBhL2tlcm5lbC9wcmludGsvbm1pLmMgYi9rZXJuZWwvcHJpbnRrL25taS5jCmluZGV4IGI2OWViOGEuLjE2YmFiNDcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wcmludGsvbm1pLmMKKysrIGIva2VybmVsL3ByaW50ay9ubWkuYwpAQCAtOTksMjcgKzk5LDMzIEBACiAJcmV0dXJuIGFkZDsKIH0KIAotLyoKLSAqIHByaW50ayBvbmUgbGluZSBmcm9tIHRoZSB0ZW1wb3JhcnkgYnVmZmVyIGZyb20gQHN0YXJ0IGluZGV4IHVudGlsCi0gKiBhbmQgaW5jbHVkaW5nIHRoZSBAZW5kIGluZGV4LgotICovCi1zdGF0aWMgdm9pZCBwcmludF9ubWlfc2VxX2xpbmUoc3RydWN0IG5taV9zZXFfYnVmICpzLCBpbnQgc3RhcnQsIGludCBlbmQpCitzdGF0aWMgdm9pZCBwcmludGtfbm1pX2ZsdXNoX2xpbmUoY29uc3QgY2hhciAqdGV4dCwgaW50IGxlbikKIHsKLQljb25zdCBjaGFyICpidWYgPSBzLT5idWZmZXIgKyBzdGFydDsKLQogCS8qCiAJICogVGhlIGJ1ZmZlcnMgYXJlIGZsdXNoZWQgaW4gTk1JIG9ubHkgb24gcGFuaWMuICBUaGUgbWVzc2FnZXMgbXVzdAogCSAqIGdvIG9ubHkgaW50byB0aGUgcmluZyBidWZmZXIgYXQgdGhpcyBzdGFnZS4gIENvbnNvbGVzIHdpbGwgZ2V0CiAJICogZXhwbGljaXRseSBjYWxsZWQgbGF0ZXIgd2hlbiBhIGNyYXNoZHVtcCBpcyBub3QgZ2VuZXJhdGVkLgogCSAqLwogCWlmIChpbl9ubWkoKSkKLQkJcHJpbnRrX2RlZmVycmVkKCIlLipzIiwgKGVuZCAtIHN0YXJ0KSArIDEsIGJ1Zik7CisJCXByaW50a19kZWZlcnJlZCgiJS4qcyIsIGxlbiwgdGV4dCk7CiAJZWxzZQotCQlwcmludGsoIiUuKnMiLCAoZW5kIC0gc3RhcnQpICsgMSwgYnVmKTsKKwkJcHJpbnRrKCIlLipzIiwgbGVuLCB0ZXh0KTsKIAogfQogCiAvKgorICogcHJpbnRrIG9uZSBsaW5lIGZyb20gdGhlIHRlbXBvcmFyeSBidWZmZXIgZnJvbSBAc3RhcnQgaW5kZXggdW50aWwKKyAqIGFuZCBpbmNsdWRpbmcgdGhlIEBlbmQgaW5kZXguCisgKi8KK3N0YXRpYyB2b2lkIHByaW50a19ubWlfZmx1c2hfc2VxX2xpbmUoc3RydWN0IG5taV9zZXFfYnVmICpzLAorCQkJCQlpbnQgc3RhcnQsIGludCBlbmQpCit7CisJY29uc3QgY2hhciAqYnVmID0gcy0+YnVmZmVyICsgc3RhcnQ7CisKKwlwcmludGtfbm1pX2ZsdXNoX2xpbmUoYnVmLCAoZW5kIC0gc3RhcnQpICsgMSk7Cit9CisKKy8qCiAgKiBGbHVzaCBkYXRhIGZyb20gdGhlIGFzc29jaWF0ZWQgcGVyX0NQVSBidWZmZXIuIFRoZSBmdW5jdGlvbgogICogY2FuIGJlIGNhbGxlZCBlaXRoZXIgdmlhIElSUSB3b3JrIG9yIGluZGVwZW5kZW50bHkuCiAgKi8KQEAgLTE1MCw5ICsxNTYsMTEgQEAKIAkgKiB0aGUgYnVmZmVyIGFuIHVuZXhwZWN0ZWQgd2F5LiBJZiB3ZSBwcmludGVkIHNvbWV0aGluZyB0aGVuCiAJICogQGxlbiBtdXN0IG9ubHkgaW5jcmVhc2UuCiAJICovCi0JaWYgKGkgJiYgaSA+PSBsZW4pCi0JCXByX2VycigicHJpbnRrX25taV9mbHVzaDogaW50ZXJuYWwgZXJyb3I6IGk9JWQgPj0gbGVuPSV6dVxuIiwKLQkJICAgICAgIGksIGxlbik7CisJaWYgKGkgJiYgaSA+PSBsZW4pIHsKKwkJY29uc3QgY2hhciAqbXNnID0gInByaW50a19ubWlfZmx1c2g6IGludGVybmFsIGVycm9yXG4iOworCisJCXByaW50a19ubWlfZmx1c2hfbGluZShtc2csIHN0cmxlbihtc2cpKTsKKwl9CiAKIAlpZiAoIWxlbikKIAkJZ290byBvdXQ7IC8qIFNvbWVvbmUgZWxzZSBoYXMgYWxyZWFkeSBmbHVzaGVkIHRoZSBidWZmZXIuICovCkBAIC0xNjYsMTQgKzE3NCwxNCBAQAogCS8qIFByaW50IGxpbmUgYnkgbGluZS4gKi8KIAlmb3IgKDsgaSA8IHNpemU7IGkrKykgewogCQlpZiAocy0+YnVmZmVyW2ldID09ICdcbicpIHsKLQkJCXByaW50X25taV9zZXFfbGluZShzLCBsYXN0X2ksIGkpOworCQkJcHJpbnRrX25taV9mbHVzaF9zZXFfbGluZShzLCBsYXN0X2ksIGkpOwogCQkJbGFzdF9pID0gaSArIDE7CiAJCX0KIAl9CiAJLyogQ2hlY2sgaWYgdGhlcmUgd2FzIGEgcGFydGlhbCBsaW5lLiAqLwogCWlmIChsYXN0X2kgPCBzaXplKSB7Ci0JCXByaW50X25taV9zZXFfbGluZShzLCBsYXN0X2ksIHNpemUgLSAxKTsKLQkJcHJfY29udCgiXG4iKTsKKwkJcHJpbnRrX25taV9mbHVzaF9zZXFfbGluZShzLCBsYXN0X2ksIHNpemUgLSAxKTsKKwkJcHJpbnRrX25taV9mbHVzaF9saW5lKCJcbiIsIHN0cmxlbigiXG4iKSk7CiAJfQogCiAJLyoKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3UvcmN1cGVyZi5jIGIva2VybmVsL3JjdS9yY3VwZXJmLmMKaW5kZXggZDM4YWIwOC4uMTIzY2NiZCAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS9yY3VwZXJmLmMKKysrIGIva2VybmVsL3JjdS9yY3VwZXJmLmMKQEAgLTUyLDcgKzUyLDcgQEAKIAogI2RlZmluZSBQRVJGX0ZMQUcgIi1wZXJmOiIKICNkZWZpbmUgUEVSRk9VVF9TVFJJTkcocykgXAotCXByX2FsZXJ0KCIlcyIgUEVSRl9GTEFHIHMgIlxuIiwgcGVyZl90eXBlKQorCXByX2FsZXJ0KCIlcyIgUEVSRl9GTEFHICIgJXNcbiIsIHBlcmZfdHlwZSwgcykKICNkZWZpbmUgVkVSQk9TRV9QRVJGT1VUX1NUUklORyhzKSBcCiAJZG8geyBpZiAodmVyYm9zZSkgcHJfYWxlcnQoIiVzIiBQRVJGX0ZMQUcgIiAlc1xuIiwgcGVyZl90eXBlLCBzKTsgfSB3aGlsZSAoMCkKICNkZWZpbmUgVkVSQk9TRV9QRVJGT1VUX0VSUlNUUklORyhzKSBcCkBAIC00MDAsOSArNDAwLDggQEAKIAkJCXNwLnNjaGVkX3ByaW9yaXR5ID0gMDsKIAkJCXNjaGVkX3NldHNjaGVkdWxlcl9ub2NoZWNrKGN1cnJlbnQsCiAJCQkJCQkgICBTQ0hFRF9OT1JNQUwsICZzcCk7Ci0JCQlwcl9hbGVydCgiJXMiIFBFUkZfRkxBRwotCQkJCSAicmN1X3BlcmZfd3JpdGVyICVsZCBoYXMgJWQgbWVhc3VyZW1lbnRzXG4iLAotCQkJCSBwZXJmX3R5cGUsIG1lLCBNSU5fTUVBUyk7CisJCQlwcl9hbGVydCgiJXMlcyByY3VfcGVyZl93cml0ZXIgJWxkIGhhcyAlZCBtZWFzdXJlbWVudHNcbiIsCisJCQkJIHBlcmZfdHlwZSwgUEVSRl9GTEFHLCBtZSwgTUlOX01FQVMpOwogCQkJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZuX3JjdV9wZXJmX3dyaXRlcl9maW5pc2hlZCkgPj0KIAkJCSAgICBucmVhbHdyaXRlcnMpIHsKIAkJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoMTApOwpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdS9yY3V0b3J0dXJlLmMgYi9rZXJuZWwvcmN1L3JjdXRvcnR1cmUuYwppbmRleCA5NzFlMmIxLi5iZjA4ZmVlIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1L3JjdXRvcnR1cmUuYworKysgYi9rZXJuZWwvcmN1L3JjdXRvcnR1cmUuYwpAQCAtMTIzOCw2ICsxMjM4LDcgQEAKIAlsb25nIHBpcGVzdW1tYXJ5W1JDVV9UT1JUVVJFX1BJUEVfTEVOICsgMV0gPSB7IDAgfTsKIAlsb25nIGJhdGNoc3VtbWFyeVtSQ1VfVE9SVFVSRV9QSVBFX0xFTiArIDFdID0geyAwIH07CiAJc3RhdGljIHVuc2lnbmVkIGxvbmcgcnRjdl9zbmFwID0gVUxPTkdfTUFYOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqd3RwOwogCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewogCQlmb3IgKGkgPSAwOyBpIDwgUkNVX1RPUlRVUkVfUElQRV9MRU4gKyAxOyBpKyspIHsKQEAgLTEyNTgsOCArMTI1OSw5IEBACiAJCWF0b21pY19yZWFkKCZuX3JjdV90b3J0dXJlX2FsbG9jKSwKIAkJYXRvbWljX3JlYWQoJm5fcmN1X3RvcnR1cmVfYWxsb2NfZmFpbCksCiAJCWF0b21pY19yZWFkKCZuX3JjdV90b3J0dXJlX2ZyZWUpKTsKLQlwcl9jb250KCJydG1iZTogJWQgcnRia2U6ICVsZCBydGJyZTogJWxkICIsCisJcHJfY29udCgicnRtYmU6ICVkIHJ0YmU6ICVsZCBydGJrZTogJWxkIHJ0YnJlOiAlbGQgIiwKIAkJYXRvbWljX3JlYWQoJm5fcmN1X3RvcnR1cmVfbWJlcnJvciksCisJCW5fcmN1X3RvcnR1cmVfYmFycmllcl9lcnJvciwKIAkJbl9yY3VfdG9ydHVyZV9ib29zdF9rdHJlcnJvciwKIAkJbl9yY3VfdG9ydHVyZV9ib29zdF9ydGVycm9yKTsKIAlwcl9jb250KCJydGJmOiAlbGQgcnRiOiAlbGQgbnQ6ICVsZCAiLApAQCAtMTMxMiwxMCArMTMxNCwxMiBAQAogCiAJCXJjdXRvcnR1cmVfZ2V0X2dwX2RhdGEoY3VyX29wcy0+dHR5cGUsCiAJCQkJICAgICAgICZmbGFncywgJmdwbnVtLCAmY29tcGxldGVkKTsKLQkJcHJfYWxlcnQoIj8/PyBXcml0ZXIgc3RhbGwgc3RhdGUgJXMoJWQpIGclbHUgYyVsdSBmJSN4XG4iLAorCQl3dHAgPSBSRUFEX09OQ0Uod3JpdGVyX3Rhc2spOworCQlwcl9hbGVydCgiPz8/IFdyaXRlciBzdGFsbCBzdGF0ZSAlcyglZCkgZyVsdSBjJWx1IGYlI3ggLT5zdGF0ZSAlI2x4XG4iLAogCQkJIHJjdV90b3J0dXJlX3dyaXRlcl9zdGF0ZV9nZXRuYW1lKCksCiAJCQkgcmN1X3RvcnR1cmVfd3JpdGVyX3N0YXRlLAotCQkJIGdwbnVtLCBjb21wbGV0ZWQsIGZsYWdzKTsKKwkJCSBncG51bSwgY29tcGxldGVkLCBmbGFncywKKwkJCSB3dHAgPT0gTlVMTCA/IH4wVUwgOiB3dHAtPnN0YXRlKTsKIAkJc2hvd19yY3VfZ3Bfa3RocmVhZHMoKTsKIAkJcmN1X2Z0cmFjZV9kdW1wKERVTVBfQUxMKTsKIAl9CkBAIC0xMzYyLDEyICsxMzY2LDEyIEBACiAJCSBvbm9mZl9pbnRlcnZhbCwgb25vZmZfaG9sZG9mZik7CiB9CiAKLXN0YXRpYyB2b2lkIHJjdXRvcnR1cmVfYm9vc3Rlcl9jbGVhbnVwKGludCBjcHUpCitzdGF0aWMgaW50IHJjdXRvcnR1cmVfYm9vc3Rlcl9jbGVhbnVwKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0OwogCiAJaWYgKGJvb3N0X3Rhc2tzW2NwdV0gPT0gTlVMTCkKLQkJcmV0dXJuOworCQlyZXR1cm4gMDsKIAltdXRleF9sb2NrKCZib29zdF9tdXRleCk7CiAJdCA9IGJvb3N0X3Rhc2tzW2NwdV07CiAJYm9vc3RfdGFza3NbY3B1XSA9IE5VTEw7CkBAIC0xMzc1LDkgKzEzNzksMTAgQEAKIAogCS8qIFRoaXMgbXVzdCBiZSBvdXRzaWRlIG9mIHRoZSBtdXRleCwgb3RoZXJ3aXNlIGRlYWRsb2NrISAqLwogCXRvcnR1cmVfc3RvcF9rdGhyZWFkKHJjdV90b3J0dXJlX2Jvb3N0LCB0KTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByY3V0b3J0dXJlX2Jvb3N0ZXJfaW5pdChpbnQgY3B1KQorc3RhdGljIGludCByY3V0b3J0dXJlX2Jvb3N0ZXJfaW5pdCh1bnNpZ25lZCBpbnQgY3B1KQogewogCWludCByZXR2YWw7CiAKQEAgLTE1NzcsMjggKzE1ODIsNyBAQAogCX0KIH0KIAotc3RhdGljIGludCByY3V0b3J0dXJlX2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAotCQkJCSB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKLXsKLQlsb25nIGNwdSA9IChsb25nKWhjcHU7Ci0KLQlzd2l0Y2ggKGFjdGlvbiAmIH5DUFVfVEFTS1NfRlJPWkVOKSB7Ci0JY2FzZSBDUFVfT05MSU5FOgotCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgotCQkodm9pZClyY3V0b3J0dXJlX2Jvb3N0ZXJfaW5pdChjcHUpOwotCQlicmVhazsKLQljYXNlIENQVV9ET1dOX1BSRVBBUkU6Ci0JCXJjdXRvcnR1cmVfYm9vc3Rlcl9jbGVhbnVwKGNwdSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gTk9USUZZX09LOwotfQotCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHJjdXRvcnR1cmVfY3B1X25iID0gewotCS5ub3RpZmllcl9jYWxsID0gcmN1dG9ydHVyZV9jcHVfbm90aWZ5LAotfTsKK3N0YXRpYyBlbnVtIGNwdWhwX3N0YXRlIHJjdXRvcl9ocDsKIAogc3RhdGljIHZvaWQKIHJjdV90b3J0dXJlX2NsZWFudXAodm9pZCkKQEAgLTE2MzgsMTEgKzE2MjIsOCBAQAogCWZvciAoaSA9IDA7IGkgPCBuY2JmbG9vZGVyczsgaSsrKQogCQl0b3J0dXJlX3N0b3Bfa3RocmVhZChyY3VfdG9ydHVyZV9jYmZsb29kLCBjYmZsb29kX3Rhc2tbaV0pOwogCWlmICgodGVzdF9ib29zdCA9PSAxICYmIGN1cl9vcHMtPmNhbl9ib29zdCkgfHwKLQkgICAgdGVzdF9ib29zdCA9PSAyKSB7Ci0JCXVucmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZyY3V0b3J0dXJlX2NwdV9uYik7Ci0JCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKQotCQkJcmN1dG9ydHVyZV9ib29zdGVyX2NsZWFudXAoaSk7Ci0JfQorCSAgICB0ZXN0X2Jvb3N0ID09IDIpCisJCWNwdWhwX3JlbW92ZV9zdGF0ZShyY3V0b3JfaHApOwogCiAJLyoKIAkgKiBXYWl0IGZvciBhbGwgUkNVIGNhbGxiYWNrcyB0byBmaXJlLCB0aGVuIGRvIGZsYXZvci1zcGVjaWZpYwpAQCAtMTg2OSwxNCArMTg1MCwxMyBAQAogCSAgICB0ZXN0X2Jvb3N0ID09IDIpIHsKIAogCQlib29zdF9zdGFydHRpbWUgPSBqaWZmaWVzICsgdGVzdF9ib29zdF9pbnRlcnZhbCAqIEhaOwotCQlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnJjdXRvcnR1cmVfY3B1X25iKTsKLQkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKLQkJCWlmIChjcHVfaXNfb2ZmbGluZShpKSkKLQkJCQljb250aW51ZTsgIC8qIEhldXJpc3RpYzogQ1BVIGNhbiBnbyBvZmZsaW5lLiAqLwotCQkJZmlyc3RlcnIgPSByY3V0b3J0dXJlX2Jvb3N0ZXJfaW5pdChpKTsKLQkJCWlmIChmaXJzdGVycikKLQkJCQlnb3RvIHVud2luZDsKLQkJfQorCisJCWZpcnN0ZXJyID0gY3B1aHBfc2V0dXBfc3RhdGUoQ1BVSFBfQVBfT05MSU5FX0RZTiwgIlJDVV9UT1JUVVJFIiwKKwkJCQkJICAgICByY3V0b3J0dXJlX2Jvb3N0ZXJfaW5pdCwKKwkJCQkJICAgICByY3V0b3J0dXJlX2Jvb3N0ZXJfY2xlYW51cCk7CisJCWlmIChmaXJzdGVyciA8IDApCisJCQlnb3RvIHVud2luZDsKKwkJcmN1dG9yX2hwID0gZmlyc3RlcnI7CiAJfQogCWZpcnN0ZXJyID0gdG9ydHVyZV9zaHV0ZG93bl9pbml0KHNodXRkb3duX3NlY3MsIHJjdV90b3J0dXJlX2NsZWFudXApOwogCWlmIChmaXJzdGVycikKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3Uvc3luYy5jIGIva2VybmVsL3JjdS9zeW5jLmMKaW5kZXggYmU5MjJjOS4uNTBkMTg2MSAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS9zeW5jLmMKKysrIGIva2VybmVsL3JjdS9zeW5jLmMKQEAgLTY4LDYgKzY4LDggQEAKIAlSQ1VfTE9DS0RFUF9XQVJOKCFncF9vcHNbcnNwLT5ncF90eXBlXS5oZWxkKCksCiAJCQkgInN1c3BpY2lvdXMgcmN1X3N5bmNfaXNfaWRsZSgpIHVzYWdlIik7CiB9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHJjdV9zeW5jX2xvY2tkZXBfYXNzZXJ0KTsKICNlbmRpZgogCiAvKioKQEAgLTgzLDYgKzg1LDE4IEBACiB9CiAKIC8qKgorICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgcmN1X3N5bmNfaW5pdCgpIGFuZCBiZWZvcmUgZmlyc3QgdXNlLgorICoKKyAqIEVuc3VyZXMgcmN1X3N5bmNfaXNfaWRsZSgpIHJldHVybnMgZmFsc2UgYW5kIHJjdV9zeW5jX3tlbnRlcixleGl0fSgpCisgKiBwYWlycyB0dXJuIGludG8gTk8tT1BzLgorICovCit2b2lkIHJjdV9zeW5jX2VudGVyX3N0YXJ0KHN0cnVjdCByY3Vfc3luYyAqcnNwKQoreworCXJzcC0+Z3BfY291bnQrKzsKKwlyc3AtPmdwX3N0YXRlID0gR1BfUEFTU0VEOworfQorCisvKioKICAqIHJjdV9zeW5jX2VudGVyKCkgLSBGb3JjZSByZWFkZXJzIG9udG8gc2xvd3BhdGgKICAqIEByc3A6IFBvaW50ZXIgdG8gcmN1X3N5bmMgc3RydWN0dXJlIHRvIHVzZSBmb3Igc3luY2hyb25pemF0aW9uCiAgKgpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdS90cmVlLmMgYi9rZXJuZWwvcmN1L3RyZWUuYwppbmRleCA1ZDgwOTI1Li43ZTJlMDM4IDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1L3RyZWUuYworKysgYi9rZXJuZWwvcmN1L3RyZWUuYwpAQCAtNDEsNyArNDEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CkBAIC02MCw3ICs1OSw2IEBACiAjaW5jbHVkZSAidHJlZS5oIgogI2luY2x1ZGUgInJjdS5oIgogCi1NT0RVTEVfQUxJQVMoInJjdXRyZWUiKTsKICNpZmRlZiBNT0RVTEVfUEFSQU1fUFJFRklYCiAjdW5kZWYgTU9EVUxFX1BBUkFNX1BSRUZJWAogI2VuZGlmCkBAIC0xODQ4LDYgKzE4NDYsNyBAQAogCQkJICAgICAgc3RydWN0IHJjdV9kYXRhICpyZHApCiB7CiAJYm9vbCByZXQ7CisJYm9vbCBuZWVkX2dwOwogCiAJLyogSGFuZGxlIHRoZSBlbmRzIG9mIGFueSBwcmVjZWRpbmcgZ3JhY2UgcGVyaW9kcyBmaXJzdC4gKi8KIAlpZiAocmRwLT5jb21wbGV0ZWQgPT0gcm5wLT5jb21wbGV0ZWQgJiYKQEAgLTE4NzQsOSArMTg3MywxMCBAQAogCQkgKi8KIAkJcmRwLT5ncG51bSA9IHJucC0+Z3BudW07CiAJCXRyYWNlX3JjdV9ncmFjZV9wZXJpb2QocnNwLT5uYW1lLCByZHAtPmdwbnVtLCBUUFMoImNwdXN0YXJ0IikpOwotCQlyZHAtPmNwdV9ub19xcy5iLm5vcm0gPSB0cnVlOworCQluZWVkX2dwID0gISEocm5wLT5xc21hc2sgJiByZHAtPmdycG1hc2spOworCQlyZHAtPmNwdV9ub19xcy5iLm5vcm0gPSBuZWVkX2dwOwogCQlyZHAtPnJjdV9xc19jdHJfc25hcCA9IF9fdGhpc19jcHVfcmVhZChyY3VfcXNfY3RyKTsKLQkJcmRwLT5jb3JlX25lZWRzX3FzID0gISEocm5wLT5xc21hc2sgJiByZHAtPmdycG1hc2spOworCQlyZHAtPmNvcmVfbmVlZHNfcXMgPSBuZWVkX2dwOwogCQl6ZXJvX2NwdV9zdGFsbF90aWNrcyhyZHApOwogCQlXUklURV9PTkNFKHJkcC0+Z3B3cmFwLCBmYWxzZSk7CiAJfQpAQCAtMjM0NCw3ICsyMzQ0LDcgQEAKIAlXQVJOX09OX09OQ0UoIXJjdV9ncF9pbl9wcm9ncmVzcyhyc3ApKTsKIAlXUklURV9PTkNFKHJzcC0+Z3BfZmxhZ3MsIFJFQURfT05DRShyc3AtPmdwX2ZsYWdzKSB8IFJDVV9HUF9GTEFHX0ZRUyk7CiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmVfcmN1X25vZGUocmN1X2dldF9yb290KHJzcCksIGZsYWdzKTsKLQlzd2FrZV91cCgmcnNwLT5ncF93cSk7ICAvKiBNZW1vcnkgYmFycmllciBpbXBsaWVkIGJ5IHN3YWtlX3VwKCkgcGF0aC4gKi8KKwlyY3VfZ3Bfa3RocmVhZF93YWtlKHJzcCk7CiB9CiAKIC8qCkBAIC0yOTcwLDcgKzI5NzAsNyBAQAogCX0KIAlXUklURV9PTkNFKHJzcC0+Z3BfZmxhZ3MsIFJFQURfT05DRShyc3AtPmdwX2ZsYWdzKSB8IFJDVV9HUF9GTEFHX0ZRUyk7CiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmVfcmN1X25vZGUocm5wX29sZCwgZmxhZ3MpOwotCXN3YWtlX3VwKCZyc3AtPmdwX3dxKTsgLyogTWVtb3J5IGJhcnJpZXIgaW1wbGllZCBieSBzd2FrZV91cCgpIHBhdGguICovCisJcmN1X2dwX2t0aHJlYWRfd2FrZShyc3ApOwogfQogCiAvKgpAQCAtMzc5Miw4ICszNzkyLDYgQEAKIAlybnAgPSByZHAtPm15bm9kZTsKIAltYXNrID0gcmRwLT5ncnBtYXNrOwogCXJhd19zcGluX2xvY2tfcmN1X25vZGUocm5wKTsJCS8qIGlycXMgYWxyZWFkeSBkaXNhYmxlZC4gKi8KLQlybnAtPnFzbWFza2luaXRuZXh0IHw9IG1hc2s7Ci0Jcm5wLT5leHBtYXNraW5pdG5leHQgfD0gbWFzazsKIAlpZiAoIXJkcC0+YmVlbm9ubGluZSkKIAkJV1JJVEVfT05DRShyc3AtPm5jcHVzLCBSRUFEX09OQ0UocnNwLT5uY3B1cykgKyAxKTsKIAlyZHAtPmJlZW5vbmxpbmUgPSB0cnVlOwkgLyogV2UgaGF2ZSBub3cgYmVlbiBvbmxpbmUuICovCkBAIC0zODYwLDYgKzM4NTgsMzIgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIE1hcmsgdGhlIHNwZWNpZmllZCBDUFUgYXMgYmVpbmcgb25saW5lIHNvIHRoYXQgc3Vic2VxdWVudCBncmFjZSBwZXJpb2RzCisgKiAoYm90aCBleHBlZGl0ZWQgYW5kIG5vcm1hbCkgd2lsbCB3YWl0IG9uIGl0LiAgTm90ZSB0aGF0IHRoaXMgbWVhbnMgdGhhdAorICogaW5jb21pbmcgQ1BVcyBhcmUgbm90IGFsbG93ZWQgdG8gdXNlIFJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbnMKKyAqIHVudGlsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiAgRmFpbGluZyB0byBvYnNlcnZlIHRoaXMgcmVzdHJpY3Rpb24KKyAqIHdpbGwgcmVzdWx0IGluIGxvY2tkZXAgc3BsYXRzLgorICovCit2b2lkIHJjdV9jcHVfc3RhcnRpbmcodW5zaWduZWQgaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgbWFzazsKKwlzdHJ1Y3QgcmN1X2RhdGEgKnJkcDsKKwlzdHJ1Y3QgcmN1X25vZGUgKnJucDsKKwlzdHJ1Y3QgcmN1X3N0YXRlICpyc3A7CisKKwlmb3JfZWFjaF9yY3VfZmxhdm9yKHJzcCkgeworCQlyZHAgPSB0aGlzX2NwdV9wdHIocnNwLT5yZGEpOworCQlybnAgPSByZHAtPm15bm9kZTsKKwkJbWFzayA9IHJkcC0+Z3JwbWFzazsKKwkJcmF3X3NwaW5fbG9ja19pcnFzYXZlX3JjdV9ub2RlKHJucCwgZmxhZ3MpOworCQlybnAtPnFzbWFza2luaXRuZXh0IHw9IG1hc2s7CisJCXJucC0+ZXhwbWFza2luaXRuZXh0IHw9IG1hc2s7CisJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlX3JjdV9ub2RlKHJucCwgZmxhZ3MpOworCX0KK30KKwogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogLyoKICAqIFRoZSBDUFUgaXMgZXhpdGluZyB0aGUgaWRsZSBsb29wIGludG8gdGhlIGFyY2hfY3B1X2lkbGVfZGVhZCgpCkBAIC00MjA5LDggKzQyMzMsMTAgQEAKIAkgKiBvciB0aGUgc2NoZWR1bGVyIGFyZSBvcGVyYXRpb25hbC4KIAkgKi8KIAlwbV9ub3RpZmllcihyY3VfcG1fbm90aWZ5LCAwKTsKLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewogCQlyY3V0cmVlX3ByZXBhcmVfY3B1KGNwdSk7CisJCXJjdV9jcHVfc3RhcnRpbmcoY3B1KTsKKwl9CiB9CiAKICNpbmNsdWRlICJ0cmVlX2V4cC5oIgpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdS90cmVlLmggYi9rZXJuZWwvcmN1L3RyZWUuaAppbmRleCBmNzE0Zjg3Li5lOTlhNTIzIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1L3RyZWUuaAorKysgYi9rZXJuZWwvcmN1L3RyZWUuaApAQCAtNDAwLDYgKzQwMCw3IEBACiAjaWZkZWYgQ09ORklHX1JDVV9GQVNUX05PX0haCiAJc3RydWN0IHJjdV9oZWFkIG9vbV9oZWFkOwogI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUkNVX0ZBU1RfTk9fSFogKi8KKwlhdG9taWNfbG9uZ190IGV4cF93b3JrZG9uZTA7CS8qICMgZG9uZSBieSB3b3JrcXVldWUuICovCiAJYXRvbWljX2xvbmdfdCBleHBfd29ya2RvbmUxOwkvKiAjIGRvbmUgYnkgb3RoZXJzICMxLiAqLwogCWF0b21pY19sb25nX3QgZXhwX3dvcmtkb25lMjsJLyogIyBkb25lIGJ5IG90aGVycyAjMi4gKi8KIAlhdG9taWNfbG9uZ190IGV4cF93b3JrZG9uZTM7CS8qICMgZG9uZSBieSBvdGhlcnMgIzMuICovCmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1L3RyZWVfZXhwLmggYi9rZXJuZWwvcmN1L3RyZWVfZXhwLmgKaW5kZXggNmQ4NmFiNi4uMjQzNDNlYiAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS90cmVlX2V4cC5oCisrKyBiL2tlcm5lbC9yY3UvdHJlZV9leHAuaApAQCAtMzU5LDcgKzM1OSw4IEBACiAJCQlzdHJ1Y3QgcmN1X2R5bnRpY2tzICpyZHRwID0gJnBlcl9jcHUocmN1X2R5bnRpY2tzLCBjcHUpOwogCiAJCQlpZiAocmF3X3NtcF9wcm9jZXNzb3JfaWQoKSA9PSBjcHUgfHwKLQkJCSAgICAhKGF0b21pY19hZGRfcmV0dXJuKDAsICZyZHRwLT5keW50aWNrcykgJiAweDEpKQorCQkJICAgICEoYXRvbWljX2FkZF9yZXR1cm4oMCwgJnJkdHAtPmR5bnRpY2tzKSAmIDB4MSkgfHwKKwkJCSAgICAhKHJucC0+cXNtYXNraW5pdG5leHQgJiByZHAtPmdycG1hc2spKQogCQkJCW1hc2tfb2ZsX3Rlc3QgfD0gcmRwLT5ncnBtYXNrOwogCQl9CiAJCW1hc2tfb2ZsX2lwaSA9IHJucC0+ZXhwbWFzayAmIH5tYXNrX29mbF90ZXN0OwpAQCAtMzg0LDE3ICszODUsMTYgQEAKIAkJCQltYXNrX29mbF9pcGkgJj0gfm1hc2s7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQkvKiBGYWlsZWQsIHJhY2VkIHdpdGggb2ZmbGluZS4gKi8KKwkJCS8qIEZhaWxlZCwgcmFjZWQgd2l0aCBDUFUgaG90cGx1ZyBvcGVyYXRpb24uICovCiAJCQlyYXdfc3Bpbl9sb2NrX2lycXNhdmVfcmN1X25vZGUocm5wLCBmbGFncyk7Ci0JCQlpZiAoY3B1X29ubGluZShjcHUpICYmCisJCQlpZiAoKHJucC0+cXNtYXNraW5pdG5leHQgJiBtYXNrKSAmJgogCQkJICAgIChybnAtPmV4cG1hc2sgJiBtYXNrKSkgeworCQkJCS8qIE9ubGluZSwgc28gZGVsYXkgZm9yIGEgYml0IGFuZCB0cnkgYWdhaW4uICovCiAJCQkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmVfcmN1X25vZGUocm5wLCBmbGFncyk7CiAJCQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7Ci0JCQkJaWYgKGNwdV9vbmxpbmUoY3B1KSAmJgotCQkJCSAgICAocm5wLT5leHBtYXNrICYgbWFzaykpCi0JCQkJCWdvdG8gcmV0cnlfaXBpOwotCQkJCXJhd19zcGluX2xvY2tfaXJxc2F2ZV9yY3Vfbm9kZShybnAsIGZsYWdzKTsKKwkJCQlnb3RvIHJldHJ5X2lwaTsKIAkJCX0KKwkJCS8qIENQVSByZWFsbHkgaXMgb2ZmbGluZSwgc28gd2UgY2FuIGlnbm9yZSBpdC4gKi8KIAkJCWlmICghKHJucC0+ZXhwbWFzayAmIG1hc2spKQogCQkJCW1hc2tfb2ZsX2lwaSAmPSB+bWFzazsKIAkJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlX3JjdV9ub2RlKHJucCwgZmxhZ3MpOwpAQCAtNDI3LDEyICs0MjcsMTAgQEAKIAkJCQlqaWZmaWVzX3N0YWxsKTsKIAkJaWYgKHJldCA+IDAgfHwgc3luY19yY3VfcHJlZW1wdF9leHBfZG9uZShybnBfcm9vdCkpCiAJCQlyZXR1cm47Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQkvKiBIaXQgYSBzaWduYWwsIGRpc2FibGUgQ1BVIHN0YWxsIHdhcm5pbmdzLiAqLwotCQkJc3dhaXRfZXZlbnQocnNwLT5leHBlZGl0ZWRfd3EsCi0JCQkJICAgc3luY19yY3VfcHJlZW1wdF9leHBfZG9uZShybnBfcm9vdCkpOwotCQkJcmV0dXJuOwotCQl9CisJCVdBUk5fT04ocmV0IDwgMCk7ICAvKiB3b3JrcXVldWVzIHNob3VsZCBub3QgYmUgc2lnbmFsZWQuICovCisJCWlmIChyY3VfY3B1X3N0YWxsX3N1cHByZXNzKQorCQkJY29udGludWU7CisJCXBhbmljX29uX3JjdV9zdGFsbCgpOwogCQlwcl9lcnIoIklORk86ICVzIGRldGVjdGVkIGV4cGVkaXRlZCBzdGFsbHMgb24gQ1BVcy90YXNrczogeyIsCiAJCSAgICAgICByc3AtPm5hbWUpOwogCQluZGV0ZWN0ZWQgPSAwOwpAQCAtNTAwLDcgKzQ5OCw2IEBACiAJICogbmV4dCBHUCwgdG8gcHJvY2VlZC4KIAkgKi8KIAltdXRleF9sb2NrKCZyc3AtPmV4cF93YWtlX211dGV4KTsKLQltdXRleF91bmxvY2soJnJzcC0+ZXhwX211dGV4KTsKIAogCXJjdV9mb3JfZWFjaF9ub2RlX2JyZWFkdGhfZmlyc3QocnNwLCBybnApIHsKIAkJaWYgKFVMT05HX0NNUF9MVChSRUFEX09OQ0Uocm5wLT5leHBfc2VxX3JxKSwgcykpIHsKQEAgLTUxNiw2ICs1MTMsNzAgQEAKIAltdXRleF91bmxvY2soJnJzcC0+ZXhwX3dha2VfbXV0ZXgpOwogfQogCisvKiBMZXQgdGhlIHdvcmtxdWV1ZSBoYW5kbGVyIGtub3cgd2hhdCBpdCBpcyBzdXBwb3NlZCB0byBkby4gKi8KK3N0cnVjdCByY3VfZXhwX3dvcmsgeworCXNtcF9jYWxsX2Z1bmNfdCByZXdfZnVuYzsKKwlzdHJ1Y3QgcmN1X3N0YXRlICpyZXdfcnNwOworCXVuc2lnbmVkIGxvbmcgcmV3X3M7CisJc3RydWN0IHdvcmtfc3RydWN0IHJld193b3JrOworfTsKKworLyoKKyAqIFdvcmstcXVldWUgaGFuZGxlciB0byBkcml2ZSBhbiBleHBlZGl0ZWQgZ3JhY2UgcGVyaW9kIGZvcndhcmQuCisgKi8KK3N0YXRpYyB2b2lkIHdhaXRfcmN1X2V4cF9ncChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndwKQoreworCXN0cnVjdCByY3VfZXhwX3dvcmsgKnJld3A7CisKKwkvKiBJbml0aWFsaXplIHRoZSByY3Vfbm9kZSB0cmVlIGluIHByZXBhcmF0aW9uIGZvciB0aGUgd2FpdC4gKi8KKwlyZXdwID0gY29udGFpbmVyX29mKHdwLCBzdHJ1Y3QgcmN1X2V4cF93b3JrLCByZXdfd29yayk7CisJc3luY19yY3VfZXhwX3NlbGVjdF9jcHVzKHJld3AtPnJld19yc3AsIHJld3AtPnJld19mdW5jKTsKKworCS8qIFdhaXQgYW5kIGNsZWFuIHVwLCBpbmNsdWRpbmcgd2FraW5nIGV2ZXJ5b25lLiAqLworCXJjdV9leHBfd2FpdF93YWtlKHJld3AtPnJld19yc3AsIHJld3AtPnJld19zKTsKK30KKworLyoKKyAqIEdpdmVuIGFuIHJjdV9zdGF0ZSBwb2ludGVyIGFuZCBhIHNtcF9jYWxsX2Z1bmN0aW9uKCkgaGFuZGxlciwga2ljaworICogb2ZmIHRoZSBzcGVjaWZpZWQgZmxhdm9yIG9mIGV4cGVkaXRlZCBncmFjZSBwZXJpb2QuCisgKi8KK3N0YXRpYyB2b2lkIF9zeW5jaHJvbml6ZV9yY3VfZXhwZWRpdGVkKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCwKKwkJCQkgICAgICAgc21wX2NhbGxfZnVuY190IGZ1bmMpCit7CisJc3RydWN0IHJjdV9kYXRhICpyZHA7CisJc3RydWN0IHJjdV9leHBfd29yayByZXc7CisJc3RydWN0IHJjdV9ub2RlICpybnA7CisJdW5zaWduZWQgbG9uZyBzOworCisJLyogSWYgZXhwZWRpdGVkIGdyYWNlIHBlcmlvZHMgYXJlIHByb2hpYml0ZWQsIGZhbGwgYmFjayB0byBub3JtYWwuICovCisJaWYgKHJjdV9ncF9pc19ub3JtYWwoKSkgeworCQl3YWl0X3JjdV9ncChyc3AtPmNhbGwpOworCQlyZXR1cm47CisJfQorCisJLyogVGFrZSBhIHNuYXBzaG90IG9mIHRoZSBzZXF1ZW5jZSBudW1iZXIuICAqLworCXMgPSByY3VfZXhwX2dwX3NlcV9zbmFwKHJzcCk7CisJaWYgKGV4cF9mdW5uZWxfbG9jayhyc3AsIHMpKQorCQlyZXR1cm47ICAvKiBTb21lb25lIGVsc2UgZGlkIG91ciB3b3JrIGZvciB1cy4gKi8KKworCS8qIE1hcnNoYWxsIGFyZ3VtZW50cyBhbmQgc2NoZWR1bGUgdGhlIGV4cGVkaXRlZCBncmFjZSBwZXJpb2QuICovCisJcmV3LnJld19mdW5jID0gZnVuYzsKKwlyZXcucmV3X3JzcCA9IHJzcDsKKwlyZXcucmV3X3MgPSBzOworCUlOSVRfV09SS19PTlNUQUNLKCZyZXcucmV3X3dvcmssIHdhaXRfcmN1X2V4cF9ncCk7CisJc2NoZWR1bGVfd29yaygmcmV3LnJld193b3JrKTsKKworCS8qIFdhaXQgZm9yIGV4cGVkaXRlZCBncmFjZSBwZXJpb2QgdG8gY29tcGxldGUuICovCisJcmRwID0gcGVyX2NwdV9wdHIocnNwLT5yZGEsIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpOworCXJucCA9IHJjdV9nZXRfcm9vdChyc3ApOworCXdhaXRfZXZlbnQocm5wLT5leHBfd3FbKHMgPj4gMSkgJiAweDNdLAorCQkgICBzeW5jX2V4cF93b3JrX2RvbmUocnNwLAorCQkJCSAgICAgICZyZHAtPmV4cF93b3JrZG9uZTAsIHMpKTsKKworCS8qIExldCB0aGUgbmV4dCBleHBlZGl0ZWQgZ3JhY2UgcGVyaW9kIHN0YXJ0LiAqLworCW11dGV4X3VubG9jaygmcnNwLT5leHBfbXV0ZXgpOworfQorCiAvKioKICAqIHN5bmNocm9uaXplX3NjaGVkX2V4cGVkaXRlZCAtIEJydXRlLWZvcmNlIFJDVS1zY2hlZCBncmFjZSBwZXJpb2QKICAqCkBAIC01MzQsMjkgKzU5NSwxMyBAQAogICovCiB2b2lkIHN5bmNocm9uaXplX3NjaGVkX2V4cGVkaXRlZCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgczsKIAlzdHJ1Y3QgcmN1X3N0YXRlICpyc3AgPSAmcmN1X3NjaGVkX3N0YXRlOwogCiAJLyogSWYgb25seSBvbmUgQ1BVLCB0aGlzIGlzIGF1dG9tYXRpY2FsbHkgYSBncmFjZSBwZXJpb2QuICovCiAJaWYgKHJjdV9ibG9ja2luZ19pc19ncCgpKQogCQlyZXR1cm47CiAKLQkvKiBJZiBleHBlZGl0ZWQgZ3JhY2UgcGVyaW9kcyBhcmUgcHJvaGliaXRlZCwgZmFsbCBiYWNrIHRvIG5vcm1hbC4gKi8KLQlpZiAocmN1X2dwX2lzX25vcm1hbCgpKSB7Ci0JCXdhaXRfcmN1X2dwKGNhbGxfcmN1X3NjaGVkKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFRha2UgYSBzbmFwc2hvdCBvZiB0aGUgc2VxdWVuY2UgbnVtYmVyLiAgKi8KLQlzID0gcmN1X2V4cF9ncF9zZXFfc25hcChyc3ApOwotCWlmIChleHBfZnVubmVsX2xvY2socnNwLCBzKSkKLQkJcmV0dXJuOyAgLyogU29tZW9uZSBlbHNlIGRpZCBvdXIgd29yayBmb3IgdXMuICovCi0KLQkvKiBJbml0aWFsaXplIHRoZSByY3Vfbm9kZSB0cmVlIGluIHByZXBhcmF0aW9uIGZvciB0aGUgd2FpdC4gKi8KLQlzeW5jX3JjdV9leHBfc2VsZWN0X2NwdXMocnNwLCBzeW5jX3NjaGVkX2V4cF9oYW5kbGVyKTsKLQotCS8qIFdhaXQgYW5kIGNsZWFuIHVwLCBpbmNsdWRpbmcgd2FraW5nIGV2ZXJ5b25lLiAqLwotCXJjdV9leHBfd2FpdF93YWtlKHJzcCwgcyk7CisJX3N5bmNocm9uaXplX3JjdV9leHBlZGl0ZWQocnNwLCBzeW5jX3NjaGVkX2V4cF9oYW5kbGVyKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHN5bmNocm9uaXplX3NjaGVkX2V4cGVkaXRlZCk7CiAKQEAgLTYyMCwyMyArNjY1LDggQEAKIHZvaWQgc3luY2hyb25pemVfcmN1X2V4cGVkaXRlZCh2b2lkKQogewogCXN0cnVjdCByY3Vfc3RhdGUgKnJzcCA9IHJjdV9zdGF0ZV9wOwotCXVuc2lnbmVkIGxvbmcgczsKIAotCS8qIElmIGV4cGVkaXRlZCBncmFjZSBwZXJpb2RzIGFyZSBwcm9oaWJpdGVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsLiAqLwotCWlmIChyY3VfZ3BfaXNfbm9ybWFsKCkpIHsKLQkJd2FpdF9yY3VfZ3AoY2FsbF9yY3UpOwotCQlyZXR1cm47Ci0JfQotCi0JcyA9IHJjdV9leHBfZ3Bfc2VxX3NuYXAocnNwKTsKLQlpZiAoZXhwX2Z1bm5lbF9sb2NrKHJzcCwgcykpCi0JCXJldHVybjsgIC8qIFNvbWVvbmUgZWxzZSBkaWQgb3VyIHdvcmsgZm9yIHVzLiAqLwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgcmN1X25vZGUgdHJlZSBpbiBwcmVwYXJhdGlvbiBmb3IgdGhlIHdhaXQuICovCi0Jc3luY19yY3VfZXhwX3NlbGVjdF9jcHVzKHJzcCwgc3luY19yY3VfZXhwX2hhbmRsZXIpOwotCi0JLyogV2FpdCBmb3IgLT5ibGtkX3Rhc2tzIGxpc3RzIHRvIGRyYWluLCB0aGVuIHdha2UgZXZlcnlvbmUgdXAuICovCi0JcmN1X2V4cF93YWl0X3dha2UocnNwLCBzKTsKKwlfc3luY2hyb25pemVfcmN1X2V4cGVkaXRlZChyc3AsIHN5bmNfcmN1X2V4cF9oYW5kbGVyKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHN5bmNocm9uaXplX3JjdV9leHBlZGl0ZWQpOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1L3RyZWVfcGx1Z2luLmggYi9rZXJuZWwvcmN1L3RyZWVfcGx1Z2luLmgKaW5kZXggMDA4MmZjZS4uODVjNWE4OCAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS90cmVlX3BsdWdpbi5oCisrKyBiL2tlcm5lbC9yY3UvdHJlZV9wbHVnaW4uaApAQCAtMjE3Myw2ICsyMTczLDcgQEAKIAkJCQljbCsrOwogCQkJYysrOwogCQkJbG9jYWxfYmhfZW5hYmxlKCk7CisJCQljb25kX3Jlc2NoZWRfcmN1X3FzKCk7CiAJCQlsaXN0ID0gbmV4dDsKIAkJfQogCQl0cmFjZV9yY3VfYmF0Y2hfZW5kKHJkcC0+cnNwLT5uYW1lLCBjLCAhIWxpc3QsIDAsIDAsIDEpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdS90cmVlX3RyYWNlLmMgYi9rZXJuZWwvcmN1L3RyZWVfdHJhY2UuYwppbmRleCA4Njc4MmY5YS4uYjFmMjg5NyAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS90cmVlX3RyYWNlLmMKKysrIGIva2VybmVsL3JjdS90cmVlX3RyYWNlLmMKQEAgLTE4NSwxNiArMTg1LDE3IEBACiAJaW50IGNwdTsKIAlzdHJ1Y3QgcmN1X3N0YXRlICpyc3AgPSAoc3RydWN0IHJjdV9zdGF0ZSAqKW0tPnByaXZhdGU7CiAJc3RydWN0IHJjdV9kYXRhICpyZHA7Ci0JdW5zaWduZWQgbG9uZyBzMSA9IDAsIHMyID0gMCwgczMgPSAwOworCXVuc2lnbmVkIGxvbmcgczAgPSAwLCBzMSA9IDAsIHMyID0gMCwgczMgPSAwOwogCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewogCQlyZHAgPSBwZXJfY3B1X3B0cihyc3AtPnJkYSwgY3B1KTsKKwkJczAgKz0gYXRvbWljX2xvbmdfcmVhZCgmcmRwLT5leHBfd29ya2RvbmUwKTsKIAkJczEgKz0gYXRvbWljX2xvbmdfcmVhZCgmcmRwLT5leHBfd29ya2RvbmUxKTsKIAkJczIgKz0gYXRvbWljX2xvbmdfcmVhZCgmcmRwLT5leHBfd29ya2RvbmUyKTsKIAkJczMgKz0gYXRvbWljX2xvbmdfcmVhZCgmcmRwLT5leHBfd29ya2RvbmUzKTsKIAl9Ci0Jc2VxX3ByaW50ZihtLCAicz0lbHUgd2QxPSVsdSB3ZDI9JWx1IHdkMz0lbHUgbj0lbHUgZW5xPSVkIHNjPSVsdVxuIiwKLQkJICAgcnNwLT5leHBlZGl0ZWRfc2VxdWVuY2UsIHMxLCBzMiwgczMsCisJc2VxX3ByaW50ZihtLCAicz0lbHUgd2QwPSVsdSB3ZDE9JWx1IHdkMj0lbHUgd2QzPSVsdSBuPSVsdSBlbnE9JWQgc2M9JWx1XG4iLAorCQkgICByc3AtPmV4cGVkaXRlZF9zZXF1ZW5jZSwgczAsIHMxLCBzMiwgczMsCiAJCSAgIGF0b21pY19sb25nX3JlYWQoJnJzcC0+ZXhwZWRpdGVkX25vcm1hbCksCiAJCSAgIGF0b21pY19yZWFkKCZyc3AtPmV4cGVkaXRlZF9uZWVkX3FzKSwKIAkJICAgcnNwLT5leHBlZGl0ZWRfc2VxdWVuY2UgLyAyKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3UvdXBkYXRlLmMgYi9rZXJuZWwvcmN1L3VwZGF0ZS5jCmluZGV4IGYwZDgzMjIuLmYxOTI3MWRjIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1L3VwZGF0ZS5jCisrKyBiL2tlcm5lbC9yY3UvdXBkYXRlLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC90aWNrLmg+CiAKQEAgLTU0LDcgKzU0LDYgQEAKIAogI2luY2x1ZGUgInJjdS5oIgogCi1NT0RVTEVfQUxJQVMoInJjdXBkYXRlIik7CiAjaWZkZWYgTU9EVUxFX1BBUkFNX1BSRUZJWAogI3VuZGVmIE1PRFVMRV9QQVJBTV9QUkVGSVgKICNlbmRpZgpkaWZmIC0tZ2l0IGEva2VybmVsL3JlbGF5LmMgYi9rZXJuZWwvcmVsYXkuYwppbmRleCBkNzk3NTAyLi5mYzliNGE0IDEwMDY0NAotLS0gYS9rZXJuZWwvcmVsYXkuYworKysgYi9rZXJuZWwvcmVsYXkuYwpAQCAtMjE0LDcgKzIxNCw3IEBACiAJCQlfX2ZyZWVfcGFnZShidWYtPnBhZ2VfYXJyYXlbaV0pOwogCQlyZWxheV9mcmVlX3BhZ2VfYXJyYXkoYnVmLT5wYWdlX2FycmF5KTsKIAl9Ci0JY2hhbi0+YnVmW2J1Zi0+Y3B1XSA9IE5VTEw7CisJKnBlcl9jcHVfcHRyKGNoYW4tPmJ1ZiwgYnVmLT5jcHUpID0gTlVMTDsKIAlrZnJlZShidWYtPnBhZGRpbmcpOwogCWtmcmVlKGJ1Zik7CiAJa3JlZl9wdXQoJmNoYW4tPmtyZWYsIHJlbGF5X2Rlc3Ryb3lfY2hhbm5lbCk7CkBAIC0zODIsMjAgKzM4MiwyMSBAQAogICovCiB2b2lkIHJlbGF5X3Jlc2V0KHN0cnVjdCByY2hhbiAqY2hhbikKIHsKKwlzdHJ1Y3QgcmNoYW5fYnVmICpidWY7CiAJdW5zaWduZWQgaW50IGk7CiAKIAlpZiAoIWNoYW4pCiAJCXJldHVybjsKIAotCWlmIChjaGFuLT5pc19nbG9iYWwgJiYgY2hhbi0+YnVmWzBdKSB7Ci0JCV9fcmVsYXlfcmVzZXQoY2hhbi0+YnVmWzBdLCAwKTsKKwlpZiAoY2hhbi0+aXNfZ2xvYmFsICYmIChidWYgPSAqcGVyX2NwdV9wdHIoY2hhbi0+YnVmLCAwKSkpIHsKKwkJX19yZWxheV9yZXNldChidWYsIDApOwogCQlyZXR1cm47CiAJfQogCiAJbXV0ZXhfbG9jaygmcmVsYXlfY2hhbm5lbHNfbXV0ZXgpOwogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKQotCQlpZiAoY2hhbi0+YnVmW2ldKQotCQkJX19yZWxheV9yZXNldChjaGFuLT5idWZbaV0sIDApOworCQlpZiAoKGJ1ZiA9ICpwZXJfY3B1X3B0cihjaGFuLT5idWYsIGkpKSkKKwkJCV9fcmVsYXlfcmVzZXQoYnVmLCAwKTsKIAltdXRleF91bmxvY2soJnJlbGF5X2NoYW5uZWxzX211dGV4KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlbGF5X3Jlc2V0KTsKQEAgLTQ0MCw3ICs0NDEsNyBAQAogCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAogIAlpZiAoY2hhbi0+aXNfZ2xvYmFsKQotCQlyZXR1cm4gY2hhbi0+YnVmWzBdOworCQlyZXR1cm4gKnBlcl9jcHVfcHRyKGNoYW4tPmJ1ZiwgMCk7CiAKIAlidWYgPSByZWxheV9jcmVhdGVfYnVmKGNoYW4pOwogCWlmICghYnVmKQpAQCAtNDY0LDcgKzQ2NSw3IEBACiAgCV9fcmVsYXlfcmVzZXQoYnVmLCAxKTsKIAogIAlpZihjaGFuLT5pc19nbG9iYWwpIHsKLSAJCWNoYW4tPmJ1ZlswXSA9IGJ1ZjsKKwkJKnBlcl9jcHVfcHRyKGNoYW4tPmJ1ZiwgMCkgPSBidWY7CiAgCQlidWYtPmNwdSA9IDA7CiAgIAl9CiAKQEAgLTUxMiw0NiArNTEzLDI1IEBACiAJY2hhbi0+Y2IgPSBjYjsKIH0KIAotLyoqCi0gKiAJcmVsYXlfaG90Y3B1X2NhbGxiYWNrIC0gQ1BVIGhvdHBsdWcgY2FsbGJhY2sKLSAqIAlAbmI6IG5vdGlmaWVyIGJsb2NrCi0gKiAJQGFjdGlvbjogaG90cGx1ZyBhY3Rpb24gdG8gdGFrZQotICogCUBoY3B1OiBDUFUgbnVtYmVyCi0gKgotICogCVJldHVybnMgdGhlIHN1Y2Nlc3MvZmFpbHVyZSBvZiB0aGUgb3BlcmF0aW9uLiAoJU5PVElGWV9PSywgJU5PVElGWV9CQUQpCi0gKi8KLXN0YXRpYyBpbnQgcmVsYXlfaG90Y3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCi0JCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24sCi0JCQkJdm9pZCAqaGNwdSkKK2ludCByZWxheV9wcmVwYXJlX2NwdSh1bnNpZ25lZCBpbnQgY3B1KQogewotCXVuc2lnbmVkIGludCBob3RjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OwogCXN0cnVjdCByY2hhbiAqY2hhbjsKKwlzdHJ1Y3QgcmNoYW5fYnVmICpidWY7CiAKLQlzd2l0Y2goYWN0aW9uKSB7Ci0JY2FzZSBDUFVfVVBfUFJFUEFSRToKLQljYXNlIENQVV9VUF9QUkVQQVJFX0ZST1pFTjoKLQkJbXV0ZXhfbG9jaygmcmVsYXlfY2hhbm5lbHNfbXV0ZXgpOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoYW4sICZyZWxheV9jaGFubmVscywgbGlzdCkgewotCQkJaWYgKGNoYW4tPmJ1Zltob3RjcHVdKQotCQkJCWNvbnRpbnVlOwotCQkJY2hhbi0+YnVmW2hvdGNwdV0gPSByZWxheV9vcGVuX2J1ZihjaGFuLCBob3RjcHUpOwotCQkJaWYoIWNoYW4tPmJ1Zltob3RjcHVdKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJCSJyZWxheV9ob3RjcHVfY2FsbGJhY2s6IGNwdSAlZCBidWZmZXIgIgotCQkJCQkiY3JlYXRpb24gZmFpbGVkXG4iLCBob3RjcHUpOwotCQkJCW11dGV4X3VubG9jaygmcmVsYXlfY2hhbm5lbHNfbXV0ZXgpOwotCQkJCXJldHVybiBub3RpZmllcl9mcm9tX2Vycm5vKC1FTk9NRU0pOwotCQkJfQorCW11dGV4X2xvY2soJnJlbGF5X2NoYW5uZWxzX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoYW4sICZyZWxheV9jaGFubmVscywgbGlzdCkgeworCQlpZiAoKGJ1ZiA9ICpwZXJfY3B1X3B0cihjaGFuLT5idWYsIGNwdSkpKQorCQkJY29udGludWU7CisJCWJ1ZiA9IHJlbGF5X29wZW5fYnVmKGNoYW4sIGNwdSk7CisJCWlmICghYnVmKSB7CisJCQlwcl9lcnIoInJlbGF5OiBjcHUgJWQgYnVmZmVyIGNyZWF0aW9uIGZhaWxlZFxuIiwgY3B1KTsKKwkJCW11dGV4X3VubG9jaygmcmVsYXlfY2hhbm5lbHNfbXV0ZXgpOworCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KLQkJbXV0ZXhfdW5sb2NrKCZyZWxheV9jaGFubmVsc19tdXRleCk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BVX0RFQUQ6Ci0JY2FzZSBDUFVfREVBRF9GUk9aRU46Ci0JCS8qIE5vIG5lZWQgdG8gZmx1c2ggdGhlIGNwdSA6IHdpbGwgYmUgZmx1c2hlZCB1cG9uCi0JCSAqIGZpbmFsIHJlbGF5X2ZsdXNoKCkgY2FsbC4gKi8KLQkJYnJlYWs7CisJCSpwZXJfY3B1X3B0cihjaGFuLT5idWYsIGNwdSkgPSBidWY7CiAJfQotCXJldHVybiBOT1RJRllfT0s7CisJbXV0ZXhfdW5sb2NrKCZyZWxheV9jaGFubmVsc19tdXRleCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtNTgzLDYgKzU2Myw3IEBACiB7CiAJdW5zaWduZWQgaW50IGk7CiAJc3RydWN0IHJjaGFuICpjaGFuOworCXN0cnVjdCByY2hhbl9idWYgKmJ1ZjsKIAogCWlmICghKHN1YmJ1Zl9zaXplICYmIG5fc3ViYnVmcykpCiAJCXJldHVybiBOVUxMOwpAQCAtNTkzLDYgKzU3NCw3IEBACiAJaWYgKCFjaGFuKQogCQlyZXR1cm4gTlVMTDsKIAorCWNoYW4tPmJ1ZiA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgcmNoYW5fYnVmICopOwogCWNoYW4tPnZlcnNpb24gPSBSRUxBWUZTX0NIQU5ORUxfVkVSU0lPTjsKIAljaGFuLT5uX3N1YmJ1ZnMgPSBuX3N1YmJ1ZnM7CiAJY2hhbi0+c3ViYnVmX3NpemUgPSBzdWJidWZfc2l6ZTsKQEAgLTYwOCw5ICs1OTAsMTAgQEAKIAogCW11dGV4X2xvY2soJnJlbGF5X2NoYW5uZWxzX211dGV4KTsKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKLQkJY2hhbi0+YnVmW2ldID0gcmVsYXlfb3Blbl9idWYoY2hhbiwgaSk7Ci0JCWlmICghY2hhbi0+YnVmW2ldKQorCQlidWYgPSByZWxheV9vcGVuX2J1ZihjaGFuLCBpKTsKKwkJaWYgKCFidWYpCiAJCQlnb3RvIGZyZWVfYnVmczsKKwkJKnBlcl9jcHVfcHRyKGNoYW4tPmJ1ZiwgaSkgPSBidWY7CiAJfQogCWxpc3RfYWRkKCZjaGFuLT5saXN0LCAmcmVsYXlfY2hhbm5lbHMpOwogCW11dGV4X3VubG9jaygmcmVsYXlfY2hhbm5lbHNfbXV0ZXgpOwpAQCAtNjE5LDggKzYwMiw4IEBACiAKIGZyZWVfYnVmczoKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewotCQlpZiAoY2hhbi0+YnVmW2ldKQotCQkJcmVsYXlfY2xvc2VfYnVmKGNoYW4tPmJ1ZltpXSk7CisJCWlmICgoYnVmID0gKnBlcl9jcHVfcHRyKGNoYW4tPmJ1ZiwgaSkpKQorCQkJcmVsYXlfY2xvc2VfYnVmKGJ1Zik7CiAJfQogCiAJa3JlZl9wdXQoJmNoYW4tPmtyZWYsIHJlbGF5X2Rlc3Ryb3lfY2hhbm5lbCk7CkBAIC02NjYsNiArNjQ5LDcgQEAKIAl1bnNpZ25lZCBpbnQgaSwgY3Vycl9jcHU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IHJjaGFuX2J1ZiAqYnVmOwogCXN0cnVjdCByY2hhbl9wZXJjcHVfYnVmX2Rpc3BhdGNoZXIgZGlzcDsKIAogCWlmICghY2hhbiB8fCAhYmFzZV9maWxlbmFtZSkKQEAgLTY4NCwxMCArNjY4LDExIEBACiAKIAlpZiAoY2hhbi0+aXNfZ2xvYmFsKSB7CiAJCWVyciA9IC1FSU5WQUw7Ci0JCWlmICghV0FSTl9PTl9PTkNFKCFjaGFuLT5idWZbMF0pKSB7Ci0JCQlkZW50cnkgPSByZWxheV9jcmVhdGVfYnVmX2ZpbGUoY2hhbiwgY2hhbi0+YnVmWzBdLCAwKTsKKwkJYnVmID0gKnBlcl9jcHVfcHRyKGNoYW4tPmJ1ZiwgMCk7CisJCWlmICghV0FSTl9PTl9PTkNFKCFidWYpKSB7CisJCQlkZW50cnkgPSByZWxheV9jcmVhdGVfYnVmX2ZpbGUoY2hhbiwgYnVmLCAwKTsKIAkJCWlmIChkZW50cnkgJiYgIVdBUk5fT05fT05DRSghY2hhbi0+aXNfZ2xvYmFsKSkgewotCQkJCXJlbGF5X3NldF9idWZfZGVudHJ5KGNoYW4tPmJ1ZlswXSwgZGVudHJ5KTsKKwkJCQlyZWxheV9zZXRfYnVmX2RlbnRyeShidWYsIGRlbnRyeSk7CiAJCQkJZXJyID0gMDsKIAkJCX0KIAkJfQpAQCAtNzAyLDEzICs2ODcsMTQgQEAKIAkgKiBvbiBhbGwgY3VycmVudGx5IG9ubGluZSBDUFVzLgogCSAqLwogCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgewotCQlpZiAodW5saWtlbHkoIWNoYW4tPmJ1ZltpXSkpIHsKKwkJYnVmID0gKnBlcl9jcHVfcHRyKGNoYW4tPmJ1ZiwgaSk7CisJCWlmICh1bmxpa2VseSghYnVmKSkgewogCQkJV0FSTl9PTkNFKDEsIEtFUk5fRVJSICJDUFUgaGFzIG5vIGJ1ZmZlciFcbiIpOwogCQkJZXJyID0gLUVJTlZBTDsKIAkJCWJyZWFrOwogCQl9CiAKLQkJZGVudHJ5ID0gcmVsYXlfY3JlYXRlX2J1Zl9maWxlKGNoYW4sIGNoYW4tPmJ1ZltpXSwgaSk7CisJCWRlbnRyeSA9IHJlbGF5X2NyZWF0ZV9idWZfZmlsZShjaGFuLCBidWYsIGkpOwogCQlpZiAodW5saWtlbHkoIWRlbnRyeSkpIHsKIAkJCWVyciA9IC1FSU5WQUw7CiAJCQlicmVhazsKQEAgLTcxNiwxMCArNzAyLDEwIEBACiAKIAkJaWYgKGN1cnJfY3B1ID09IGkpIHsKIAkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJCXJlbGF5X3NldF9idWZfZGVudHJ5KGNoYW4tPmJ1ZltpXSwgZGVudHJ5KTsKKwkJCXJlbGF5X3NldF9idWZfZGVudHJ5KGJ1ZiwgZGVudHJ5KTsKIAkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAkJfSBlbHNlIHsKLQkJCWRpc3AuYnVmID0gY2hhbi0+YnVmW2ldOworCQkJZGlzcC5idWYgPSBidWY7CiAJCQlkaXNwLmRlbnRyeSA9IGRlbnRyeTsKIAkJCXNtcF9tYigpOwogCQkJLyogcmVsYXlfY2hhbm5lbHNfbXV0ZXggbXVzdCBiZSBoZWxkLCBzbyB3YWl0LiAqLwpAQCAtODIyLDExICs4MDgsMTAgQEAKIAlpZiAoIWNoYW4pCiAJCXJldHVybjsKIAotCWlmIChjcHUgPj0gTlJfQ1BVUyB8fCAhY2hhbi0+YnVmW2NwdV0gfHwKLQkJCQkJc3ViYnVmc19jb25zdW1lZCA+IGNoYW4tPm5fc3ViYnVmcykKKwlidWYgPSAqcGVyX2NwdV9wdHIoY2hhbi0+YnVmLCBjcHUpOworCWlmIChjcHUgPj0gTlJfQ1BVUyB8fCAhYnVmIHx8IHN1YmJ1ZnNfY29uc3VtZWQgPiBjaGFuLT5uX3N1YmJ1ZnMpCiAJCXJldHVybjsKIAotCWJ1ZiA9IGNoYW4tPmJ1ZltjcHVdOwogCWlmIChzdWJidWZzX2NvbnN1bWVkID4gYnVmLT5zdWJidWZzX3Byb2R1Y2VkIC0gYnVmLT5zdWJidWZzX2NvbnN1bWVkKQogCQlidWYtPnN1YmJ1ZnNfY29uc3VtZWQgPSBidWYtPnN1YmJ1ZnNfcHJvZHVjZWQ7CiAJZWxzZQpAQCAtODQyLDE4ICs4MjcsMTkgQEAKICAqLwogdm9pZCByZWxheV9jbG9zZShzdHJ1Y3QgcmNoYW4gKmNoYW4pCiB7CisJc3RydWN0IHJjaGFuX2J1ZiAqYnVmOwogCXVuc2lnbmVkIGludCBpOwogCiAJaWYgKCFjaGFuKQogCQlyZXR1cm47CiAKIAltdXRleF9sb2NrKCZyZWxheV9jaGFubmVsc19tdXRleCk7Ci0JaWYgKGNoYW4tPmlzX2dsb2JhbCAmJiBjaGFuLT5idWZbMF0pCi0JCXJlbGF5X2Nsb3NlX2J1ZihjaGFuLT5idWZbMF0pOworCWlmIChjaGFuLT5pc19nbG9iYWwgJiYgKGJ1ZiA9ICpwZXJfY3B1X3B0cihjaGFuLT5idWYsIDApKSkKKwkJcmVsYXlfY2xvc2VfYnVmKGJ1Zik7CiAJZWxzZQogCQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkKLQkJCWlmIChjaGFuLT5idWZbaV0pCi0JCQkJcmVsYXlfY2xvc2VfYnVmKGNoYW4tPmJ1ZltpXSk7CisJCQlpZiAoKGJ1ZiA9ICpwZXJfY3B1X3B0cihjaGFuLT5idWYsIGkpKSkKKwkJCQlyZWxheV9jbG9zZV9idWYoYnVmKTsKIAogCWlmIChjaGFuLT5sYXN0X3Rvb2JpZykKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAicmVsYXk6IG9uZSBvciBtb3JlIGl0ZW1zIG5vdCBsb2dnZWQgIgpAQCAtODc0LDIwICs4NjAsMjEgQEAKICAqLwogdm9pZCByZWxheV9mbHVzaChzdHJ1Y3QgcmNoYW4gKmNoYW4pCiB7CisJc3RydWN0IHJjaGFuX2J1ZiAqYnVmOwogCXVuc2lnbmVkIGludCBpOwogCiAJaWYgKCFjaGFuKQogCQlyZXR1cm47CiAKLQlpZiAoY2hhbi0+aXNfZ2xvYmFsICYmIGNoYW4tPmJ1ZlswXSkgewotCQlyZWxheV9zd2l0Y2hfc3ViYnVmKGNoYW4tPmJ1ZlswXSwgMCk7CisJaWYgKGNoYW4tPmlzX2dsb2JhbCAmJiAoYnVmID0gKnBlcl9jcHVfcHRyKGNoYW4tPmJ1ZiwgMCkpKSB7CisJCXJlbGF5X3N3aXRjaF9zdWJidWYoYnVmLCAwKTsKIAkJcmV0dXJuOwogCX0KIAogCW11dGV4X2xvY2soJnJlbGF5X2NoYW5uZWxzX211dGV4KTsKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkKLQkJaWYgKGNoYW4tPmJ1ZltpXSkKLQkJCXJlbGF5X3N3aXRjaF9zdWJidWYoY2hhbi0+YnVmW2ldLCAwKTsKKwkJaWYgKChidWYgPSAqcGVyX2NwdV9wdHIoY2hhbi0+YnVmLCBpKSkpCisJCQlyZWxheV9zd2l0Y2hfc3ViYnVmKGJ1ZiwgMCk7CiAJbXV0ZXhfdW5sb2NrKCZyZWxheV9jaGFubmVsc19tdXRleCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyZWxheV9mbHVzaCk7CkBAIC0xMzc3LDEyICsxMzY0LDMgQEAKIAkuc3BsaWNlX3JlYWQJPSByZWxheV9maWxlX3NwbGljZV9yZWFkLAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKHJlbGF5X2ZpbGVfb3BlcmF0aW9ucyk7Ci0KLXN0YXRpYyBfX2luaXQgaW50IHJlbGF5X2luaXQodm9pZCkKLXsKLQotCWhvdGNwdV9ub3RpZmllcihyZWxheV9ob3RjcHVfY2FsbGJhY2ssIDApOwotCXJldHVybiAwOwotfQotCi1lYXJseV9pbml0Y2FsbChyZWxheV9pbml0KTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9jb3JlLmMgYi9rZXJuZWwvc2NoZWQvY29yZS5jCmluZGV4IDJhOTA2ZjIuLjk0NzMyZDEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9jb3JlLmMKKysrIGIva2VybmVsL3NjaGVkL2NvcmUuYwpAQCAtNTgxLDYgKzU4MSw4IEBACiAJICogSWYgbmVlZGVkIHdlIGNhbiBzdGlsbCBvcHRpbWl6ZSB0aGF0IGxhdGVyIHdpdGggYW4KIAkgKiBlbXB0eSBJUlEuCiAJICovCisJaWYgKGNwdV9pc19vZmZsaW5lKGNwdSkpCisJCXJldHVybiB0cnVlOyAgLyogRG9uJ3QgdHJ5IHRvIHdha2Ugb2ZmbGluZSBDUFVzLiAqLwogCWlmICh0aWNrX25vaHpfZnVsbF9jcHUoY3B1KSkgewogCQlpZiAoY3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSB8fAogCQkgICAgdGlja19ub2h6X3RpY2tfc3RvcHBlZCgpKQpAQCAtNTkxLDYgKzU5MywxMSBAQAogCXJldHVybiBmYWxzZTsKIH0KIAorLyoKKyAqIFdha2UgdXAgdGhlIHNwZWNpZmllZCBDUFUuICBJZiB0aGUgQ1BVIGlzIGdvaW5nIG9mZmxpbmUsIGl0IGlzIHRoZQorICogY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZGVhbCB3aXRoIHRoZSBsb3N0IHdha2V1cCwgZm9yIGV4YW1wbGUsCisgKiBieSBob29raW5nIGludG8gdGhlIENQVV9ERUFEIG5vdGlmaWVyIGxpa2UgdGltZXJzIGFuZCBocnRpbWVycyBkby4KKyAqLwogdm9pZCB3YWtlX3VwX25vaHpfY3B1KGludCBjcHUpCiB7CiAJaWYgKCF3YWtlX3VwX2Z1bGxfbm9oel9jcHUoY3B1KSkKQEAgLTEwNjMsOCArMTA3MCwxMiBAQAogCSAqIGhvbGRpbmcgcnEtPmxvY2ssIGlmIHAtPm9uX3JxID09IDAgaXQgY2Fubm90IGdldCBlbnF1ZXVlZCBiZWNhdXNlCiAJICogd2UncmUgaG9sZGluZyBwLT5waV9sb2NrLgogCSAqLwotCWlmICh0YXNrX3JxKHApID09IHJxICYmIHRhc2tfb25fcnFfcXVldWVkKHApKQotCQlycSA9IF9fbWlncmF0ZV90YXNrKHJxLCBwLCBhcmctPmRlc3RfY3B1KTsKKwlpZiAodGFza19ycShwKSA9PSBycSkgeworCQlpZiAodGFza19vbl9ycV9xdWV1ZWQocCkpCisJCQlycSA9IF9fbWlncmF0ZV90YXNrKHJxLCBwLCBhcmctPmRlc3RfY3B1KTsKKwkJZWxzZQorCQkJcC0+d2FrZV9jcHUgPSBhcmctPmRlc3RfY3B1OworCX0KIAlyYXdfc3Bpbl91bmxvY2soJnJxLT5sb2NrKTsKIAlyYXdfc3Bpbl91bmxvY2soJnAtPnBpX2xvY2spOwogCkBAIC0xMTA1LDEwICsxMTE2LDEwIEBACiAKIAlwLT5zY2hlZF9jbGFzcy0+c2V0X2NwdXNfYWxsb3dlZChwLCBuZXdfbWFzayk7CiAKLQlpZiAocnVubmluZykKLQkJcC0+c2NoZWRfY2xhc3MtPnNldF9jdXJyX3Rhc2socnEpOwogCWlmIChxdWV1ZWQpCiAJCWVucXVldWVfdGFzayhycSwgcCwgRU5RVUVVRV9SRVNUT1JFKTsKKwlpZiAocnVubmluZykKKwkJc2V0X2N1cnJfdGFzayhycSwgcCk7CiB9CiAKIC8qCkBAIC0xMjY1LDcgKzEyNzYsNyBAQAogCQkvKgogCQkgKiBUYXNrIGlzbid0IHJ1bm5pbmcgYW55bW9yZTsgbWFrZSBpdCBhcHBlYXIgbGlrZSB3ZSBtaWdyYXRlZAogCQkgKiBpdCBiZWZvcmUgaXQgd2VudCB0byBzbGVlcC4gVGhpcyBtZWFucyBvbiB3YWtldXAgd2UgbWFrZSB0aGUKLQkJICogcHJldmlvdXMgY3B1IG91ciB0YXJnZXIgaW5zdGVhZCBvZiB3aGVyZSBpdCByZWFsbHkgaXMuCisJCSAqIHByZXZpb3VzIGNwdSBvdXIgdGFyZ2V0IGluc3RlYWQgb2Ygd2hlcmUgaXQgcmVhbGx5IGlzLgogCQkgKi8KIAkJcC0+d2FrZV9jcHUgPSBjcHU7CiAJfQpAQCAtMTYyOSwyMyArMTY0MCwyNSBAQAogc3RhdGljIHZvaWQKIHR0d3Vfc3RhdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBjcHUsIGludCB3YWtlX2ZsYWdzKQogewotI2lmZGVmIENPTkZJR19TQ0hFRFNUQVRTCi0Jc3RydWN0IHJxICpycSA9IHRoaXNfcnEoKTsKKwlzdHJ1Y3QgcnEgKnJxOworCisJaWYgKCFzY2hlZHN0YXRfZW5hYmxlZCgpKQorCQlyZXR1cm47CisKKwlycSA9IHRoaXNfcnEoKTsKIAogI2lmZGVmIENPTkZJR19TTVAKLQlpbnQgdGhpc19jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQlpZiAoY3B1ID09IHRoaXNfY3B1KSB7Ci0JCXNjaGVkc3RhdF9pbmMocnEsIHR0d3VfbG9jYWwpOwotCQlzY2hlZHN0YXRfaW5jKHAsIHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19sb2NhbCk7CisJaWYgKGNwdSA9PSBycS0+Y3B1KSB7CisJCXNjaGVkc3RhdF9pbmMocnEtPnR0d3VfbG9jYWwpOworCQlzY2hlZHN0YXRfaW5jKHAtPnNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19sb2NhbCk7CiAJfSBlbHNlIHsKIAkJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7CiAKLQkJc2NoZWRzdGF0X2luYyhwLCBzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfcmVtb3RlKTsKKwkJc2NoZWRzdGF0X2luYyhwLT5zZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfcmVtb3RlKTsKIAkJcmN1X3JlYWRfbG9jaygpOwotCQlmb3JfZWFjaF9kb21haW4odGhpc19jcHUsIHNkKSB7CisJCWZvcl9lYWNoX2RvbWFpbihycS0+Y3B1LCBzZCkgewogCQkJaWYgKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBzY2hlZF9kb21haW5fc3BhbihzZCkpKSB7Ci0JCQkJc2NoZWRzdGF0X2luYyhzZCwgdHR3dV93YWtlX3JlbW90ZSk7CisJCQkJc2NoZWRzdGF0X2luYyhzZC0+dHR3dV93YWtlX3JlbW90ZSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTE2NTMsMTcgKzE2NjYsMTQgQEAKIAl9CiAKIAlpZiAod2FrZV9mbGFncyAmIFdGX01JR1JBVEVEKQotCQlzY2hlZHN0YXRfaW5jKHAsIHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19taWdyYXRlKTsKLQorCQlzY2hlZHN0YXRfaW5jKHAtPnNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19taWdyYXRlKTsKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKLQlzY2hlZHN0YXRfaW5jKHJxLCB0dHd1X2NvdW50KTsKLQlzY2hlZHN0YXRfaW5jKHAsIHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwcyk7CisJc2NoZWRzdGF0X2luYyhycS0+dHR3dV9jb3VudCk7CisJc2NoZWRzdGF0X2luYyhwLT5zZS5zdGF0aXN0aWNzLm5yX3dha2V1cHMpOwogCiAJaWYgKHdha2VfZmxhZ3MgJiBXRl9TWU5DKQotCQlzY2hlZHN0YXRfaW5jKHAsIHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19zeW5jKTsKLQotI2VuZGlmIC8qIENPTkZJR19TQ0hFRFNUQVRTICovCisJCXNjaGVkc3RhdF9pbmMocC0+c2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX3N5bmMpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdHR3dV9hY3RpdmF0ZShzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBlbl9mbGFncykKQEAgLTIwMTYsNiArMjAyNiwyOCBAQAogCXN1Y2Nlc3MgPSAxOyAvKiB3ZSdyZSBnb2luZyB0byBjaGFuZ2UgLT5zdGF0ZSAqLwogCWNwdSA9IHRhc2tfY3B1KHApOwogCisJLyoKKwkgKiBFbnN1cmUgd2UgbG9hZCBwLT5vbl9ycSBfYWZ0ZXJfIHAtPnN0YXRlLCBvdGhlcndpc2UgaXQgd291bGQKKwkgKiBiZSBwb3NzaWJsZSB0bywgZmFsc2VseSwgb2JzZXJ2ZSBwLT5vbl9ycSA9PSAwIGFuZCBnZXQgc3R1Y2sKKwkgKiBpbiBzbXBfY29uZF9sb2FkX2FjcXVpcmUoKSBiZWxvdy4KKwkgKgorCSAqIHNjaGVkX3R0d3VfcGVuZGluZygpICAgICAgICAgICAgICAgICB0cnlfdG9fd2FrZV91cCgpCisJICogICBbU10gcC0+b25fcnEgPSAxOyAgICAgICAgICAgICAgICAgIFtMXSBQLT5zdGF0ZQorCSAqICAgICAgIFVOTE9DSyBycS0+bG9jayAgLS0tLS0uCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJICoJCQkJICstLS0gICBSTUIKKwkgKiBzY2hlZHVsZSgpICAgICAgICAgICAgICAgICAgIC8KKwkgKiAgICAgICBMT0NLIHJxLT5sb2NrICAgIC0tLS0tJworCSAqICAgICAgIFVOTE9DSyBycS0+bG9jaworCSAqCisJICogW3Rhc2sgcF0KKwkgKiAgIFtTXSBwLT5zdGF0ZSA9IFVOSU5URVJSVVBUSUJMRSAgICAgW0xdIHAtPm9uX3JxCisJICoKKwkgKiBQYWlycyB3aXRoIHRoZSBVTkxPQ0srTE9DSyBvbiBycS0+bG9jayBmcm9tIHRoZQorCSAqIGxhc3Qgd2FrZXVwIG9mIG91ciB0YXNrIGFuZCB0aGUgc2NoZWR1bGUgdGhhdCBnb3Qgb3VyIHRhc2sKKwkgKiBjdXJyZW50LgorCSAqLworCXNtcF9ybWIoKTsKIAlpZiAocC0+b25fcnEgJiYgdHR3dV9yZW1vdGUocCwgd2FrZV9mbGFncykpCiAJCWdvdG8gc3RhdDsKIApAQCAtMjA2Miw4ICsyMDk0LDcgQEAKIAogCXR0d3VfcXVldWUocCwgY3B1LCB3YWtlX2ZsYWdzKTsKIHN0YXQ6Ci0JaWYgKHNjaGVkc3RhdF9lbmFibGVkKCkpCi0JCXR0d3Vfc3RhdChwLCBjcHUsIHdha2VfZmxhZ3MpOworCXR0d3Vfc3RhdChwLCBjcHUsIHdha2VfZmxhZ3MpOwogb3V0OgogCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5waV9sb2NrLCBmbGFncyk7CiAKQEAgLTIwNzMsNiArMjEwNCw3IEBACiAvKioKICAqIHRyeV90b193YWtlX3VwX2xvY2FsIC0gdHJ5IHRvIHdha2UgdXAgYSBsb2NhbCB0YXNrIHdpdGggcnEgbG9jayBoZWxkCiAgKiBAcDogdGhlIHRocmVhZCB0byBiZSBhd2FrZW5lZAorICogQGNvb2tpZTogY29udGV4dCdzIGNvb2tpZSBmb3IgcGlubmluZwogICoKICAqIFB1dCBAcCBvbiB0aGUgcnVuLXF1ZXVlIGlmIGl0J3Mgbm90IGFscmVhZHkgdGhlcmUuIFRoZSBjYWxsZXIgbXVzdAogICogZW5zdXJlIHRoYXQgdGhpc19ycSgpIGlzIGxvY2tlZCwgQHAgaXMgYm91bmQgdG8gdGhpc19ycSgpIGFuZCBub3QKQEAgLTIxMTEsOCArMjE0Myw3IEBACiAJCXR0d3VfYWN0aXZhdGUocnEsIHAsIEVOUVVFVUVfV0FLRVVQKTsKIAogCXR0d3VfZG9fd2FrZXVwKHJxLCBwLCAwLCBjb29raWUpOwotCWlmIChzY2hlZHN0YXRfZW5hYmxlZCgpKQotCQl0dHd1X3N0YXQocCwgc21wX3Byb2Nlc3Nvcl9pZCgpLCAwKTsKKwl0dHd1X3N0YXQocCwgc21wX3Byb2Nlc3Nvcl9pZCgpLCAwKTsKIG91dDoKIAlyYXdfc3Bpbl91bmxvY2soJnAtPnBpX2xvY2spOwogfQpAQCAtMjc1MCw2ICsyNzgxLDEwIEBACiAJCSAqIHRhc2sgYW5kIHB1dCB0aGVtIGJhY2sgb24gdGhlIGZyZWUgbGlzdC4KIAkJICovCiAJCWtwcm9iZV9mbHVzaF90YXNrKHByZXYpOworCisJCS8qIFRhc2sgaXMgZG9uZSB3aXRoIGl0cyBzdGFjay4gKi8KKwkJcHV0X3Rhc2tfc3RhY2socHJldik7CisKIAkJcHV0X3Rhc2tfc3RydWN0KHByZXYpOwogCX0KIApAQCAtMzE3MCw2ICszMjA1LDkgQEAKICAqLwogc3RhdGljIG5vaW5saW5lIHZvaWQgX19zY2hlZHVsZV9idWcoc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KQogeworCS8qIFNhdmUgdGhpcyBiZWZvcmUgY2FsbGluZyBwcmludGsoKSwgc2luY2UgdGhhdCB3aWxsIGNsb2JiZXIgaXQgKi8KKwl1bnNpZ25lZCBsb25nIHByZWVtcHRfZGlzYWJsZV9pcCA9IGdldF9wcmVlbXB0X2Rpc2FibGVfaXAoY3VycmVudCk7CisKIAlpZiAob29wc19pbl9wcm9ncmVzcykKIAkJcmV0dXJuOwogCkBAIC0zMTgwLDEzICszMjE4LDEyIEBACiAJcHJpbnRfbW9kdWxlcygpOwogCWlmIChpcnFzX2Rpc2FibGVkKCkpCiAJCXByaW50X2lycXRyYWNlX2V2ZW50cyhwcmV2KTsKLSNpZmRlZiBDT05GSUdfREVCVUdfUFJFRU1QVAotCWlmIChpbl9hdG9taWNfcHJlZW1wdF9vZmYoKSkgeworCWlmIChJU19FTkFCTEVEKENPTkZJR19ERUJVR19QUkVFTVBUKQorCSAgICAmJiBpbl9hdG9taWNfcHJlZW1wdF9vZmYoKSkgewogCQlwcl9lcnIoIlByZWVtcHRpb24gZGlzYWJsZWQgYXQ6Iik7Ci0JCXByaW50X2lwX3N5bShjdXJyZW50LT5wcmVlbXB0X2Rpc2FibGVfaXApOworCQlwcmludF9pcF9zeW0ocHJlZW1wdF9kaXNhYmxlX2lwKTsKIAkJcHJfY29udCgiXG4iKTsKIAl9Ci0jZW5kaWYKIAlpZiAocGFuaWNfb25fd2FybikKIAkJcGFuaWMoInNjaGVkdWxpbmcgd2hpbGUgYXRvbWljXG4iKTsKIApAQCAtMzIxMiw3ICszMjQ5LDcgQEAKIAogCXByb2ZpbGVfaGl0KFNDSEVEX1BST0ZJTElORywgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIAotCXNjaGVkc3RhdF9pbmModGhpc19ycSgpLCBzY2hlZF9jb3VudCk7CisJc2NoZWRzdGF0X2luYyh0aGlzX3JxKCktPnNjaGVkX2NvdW50KTsKIH0KIAogLyoKQEAgLTMzMDUsMTcgKzMzNDIsNiBAQAogCXJxID0gY3B1X3JxKGNwdSk7CiAJcHJldiA9IHJxLT5jdXJyOwogCi0JLyoKLQkgKiBkb19leGl0KCkgY2FsbHMgc2NoZWR1bGUoKSB3aXRoIHByZWVtcHRpb24gZGlzYWJsZWQgYXMgYW4gZXhjZXB0aW9uOwotCSAqIGhvd2V2ZXIgd2UgbXVzdCBmaXggdGhhdCB1cCwgb3RoZXJ3aXNlIHRoZSBuZXh0IHRhc2sgd2lsbCBzZWUgYW4KLQkgKiBpbmNvbnNpc3RlbnQgKGhpZ2hlcikgcHJlZW1wdCBjb3VudC4KLQkgKgotCSAqIEl0IGFsc28gYXZvaWRzIHRoZSBiZWxvdyBzY2hlZHVsZV9kZWJ1ZygpIHRlc3QgZnJvbSBjb21wbGFpbmluZwotCSAqIGFib3V0IHRoaXMuCi0JICovCi0JaWYgKHVubGlrZWx5KHByZXYtPnN0YXRlID09IFRBU0tfREVBRCkpCi0JCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWRfbm90cmFjZSgpOwotCiAJc2NoZWR1bGVfZGVidWcocHJldik7CiAKIAlpZiAoc2NoZWRfZmVhdChIUlRJQ0spKQpAQCAtMzM4MSw3ICszNDA3LDMzIEBACiAKIAliYWxhbmNlX2NhbGxiYWNrKHJxKTsKIH0KLVNUQUNLX0ZSQU1FX05PTl9TVEFOREFSRChfX3NjaGVkdWxlKTsgLyogc3dpdGNoX3RvKCkgKi8KKwordm9pZCBfX25vcmV0dXJuIGRvX3Rhc2tfZGVhZCh2b2lkKQoreworCS8qCisJICogVGhlIHNldHRpbmcgb2YgVEFTS19SVU5OSU5HIGJ5IHRyeV90b193YWtlX3VwKCkgbWF5IGJlIGRlbGF5ZWQKKwkgKiB3aGVuIHRoZSBmb2xsb3dpbmcgdHdvIGNvbmRpdGlvbnMgYmVjb21lIHRydWUuCisJICogICAtIFRoZXJlIGlzIHJhY2UgY29uZGl0aW9uIG9mIG1tYXBfc2VtIChJdCBpcyBhY3F1aXJlZCBieQorCSAqICAgICBleGl0X21tKCkpLCBhbmQKKwkgKiAgIC0gU01JIG9jY3VycyBiZWZvcmUgc2V0dGluZyBUQVNLX1JVTklOTkcuCisJICogICAgIChvciBoeXBlcnZpc29yIG9mIHZpcnR1YWwgbWFjaGluZSBzd2l0Y2hlcyB0byBvdGhlciBndWVzdCkKKwkgKiAgQXMgYSByZXN1bHQsIHdlIG1heSBiZWNvbWUgVEFTS19SVU5OSU5HIGFmdGVyIGJlY29taW5nIFRBU0tfREVBRAorCSAqCisJICogVG8gYXZvaWQgaXQsIHdlIGhhdmUgdG8gd2FpdCBmb3IgcmVsZWFzaW5nIHRzay0+cGlfbG9jayB3aGljaAorCSAqIGlzIGhlbGQgYnkgdHJ5X3RvX3dha2VfdXAoKQorCSAqLworCXNtcF9tYigpOworCXJhd19zcGluX3VubG9ja193YWl0KCZjdXJyZW50LT5waV9sb2NrKTsKKworCS8qIGNhdXNlcyBmaW5hbCBwdXRfdGFza19zdHJ1Y3QgaW4gZmluaXNoX3Rhc2tfc3dpdGNoKCkuICovCisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0RFQUQpOworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOwkvKiB0ZWxsIGZyZWV6ZXIgdG8gaWdub3JlIHVzICovCisJX19zY2hlZHVsZShmYWxzZSk7CisJQlVHKCk7CisJLyogQXZvaWQgIm5vcmV0dXJuIGZ1bmN0aW9uIGRvZXMgcmV0dXJuIi4gICovCisJZm9yICg7OykKKwkJY3B1X3JlbGF4KCk7CS8qIEZvciB3aGVuIEJVRyBpcyBudWxsICovCit9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzY2hlZF9zdWJtaXRfd29yayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKQEAgLTM2NjUsMTAgKzM3MTcsMTAgQEAKIAogCXAtPnByaW8gPSBwcmlvOwogCi0JaWYgKHJ1bm5pbmcpCi0JCXAtPnNjaGVkX2NsYXNzLT5zZXRfY3Vycl90YXNrKHJxKTsKIAlpZiAocXVldWVkKQogCQllbnF1ZXVlX3Rhc2socnEsIHAsIHF1ZXVlX2ZsYWcpOworCWlmIChydW5uaW5nKQorCQlzZXRfY3Vycl90YXNrKHJxLCBwKTsKIAogCWNoZWNrX2NsYXNzX2NoYW5nZWQocnEsIHAsIHByZXZfY2xhc3MsIG9sZHByaW8pOwogb3V0X3VubG9jazoKQEAgLTM2ODIsNyArMzczNCw4IEBACiAKIHZvaWQgc2V0X3VzZXJfbmljZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGxvbmcgbmljZSkKIHsKLQlpbnQgb2xkX3ByaW8sIGRlbHRhLCBxdWV1ZWQ7CisJYm9vbCBxdWV1ZWQsIHJ1bm5pbmc7CisJaW50IG9sZF9wcmlvLCBkZWx0YTsKIAlzdHJ1Y3QgcnFfZmxhZ3MgcmY7CiAJc3RydWN0IHJxICpycTsKIApAQCAtMzcwNCw4ICszNzU3LDExIEBACiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAJcXVldWVkID0gdGFza19vbl9ycV9xdWV1ZWQocCk7CisJcnVubmluZyA9IHRhc2tfY3VycmVudChycSwgcCk7CiAJaWYgKHF1ZXVlZCkKIAkJZGVxdWV1ZV90YXNrKHJxLCBwLCBERVFVRVVFX1NBVkUpOworCWlmIChydW5uaW5nKQorCQlwdXRfcHJldl90YXNrKHJxLCBwKTsKIAogCXAtPnN0YXRpY19wcmlvID0gTklDRV9UT19QUklPKG5pY2UpOwogCXNldF9sb2FkX3dlaWdodChwKTsKQEAgLTM3MjIsNiArMzc3OCw4IEBACiAJCWlmIChkZWx0YSA8IDAgfHwgKGRlbHRhID4gMCAmJiB0YXNrX3J1bm5pbmcocnEsIHApKSkKIAkJCXJlc2NoZWRfY3VycihycSk7CiAJfQorCWlmIChydW5uaW5nKQorCQlzZXRfY3Vycl90YXNrKHJxLCBwKTsKIG91dF91bmxvY2s6CiAJdGFza19ycV91bmxvY2socnEsIHAsICZyZik7CiB9CkBAIC00MjIxLDggKzQyNzksNiBAQAogCXByZXZfY2xhc3MgPSBwLT5zY2hlZF9jbGFzczsKIAlfX3NldHNjaGVkdWxlcihycSwgcCwgYXR0ciwgcGkpOwogCi0JaWYgKHJ1bm5pbmcpCi0JCXAtPnNjaGVkX2NsYXNzLT5zZXRfY3Vycl90YXNrKHJxKTsKIAlpZiAocXVldWVkKSB7CiAJCS8qCiAJCSAqIFdlIGVucXVldWUgdG8gdGFpbCB3aGVuIHRoZSBwcmlvcml0eSBvZiBhIHRhc2sgaXMKQEAgLTQyMzMsNiArNDI4OSw4IEBACiAKIAkJZW5xdWV1ZV90YXNrKHJxLCBwLCBxdWV1ZV9mbGFncyk7CiAJfQorCWlmIChydW5uaW5nKQorCQlzZXRfY3Vycl90YXNrKHJxLCBwKTsKIAogCWNoZWNrX2NsYXNzX2NoYW5nZWQocnEsIHAsIHByZXZfY2xhc3MsIG9sZHByaW8pOwogCXByZWVtcHRfZGlzYWJsZSgpOyAvKiBhdm9pZCBycSBmcm9tIGdvaW5nIGF3YXkgb24gdXMgKi8KQEAgLTQ4MjQsNyArNDg4Miw3IEBACiB7CiAJc3RydWN0IHJxICpycSA9IHRoaXNfcnFfbG9jaygpOwogCi0Jc2NoZWRzdGF0X2luYyhycSwgeWxkX2NvdW50KTsKKwlzY2hlZHN0YXRfaW5jKHJxLT55bGRfY291bnQpOwogCWN1cnJlbnQtPnNjaGVkX2NsYXNzLT55aWVsZF90YXNrKHJxKTsKIAogCS8qCkBAIC00ODQxLDYgKzQ4OTksNyBAQAogCXJldHVybiAwOwogfQogCisjaWZuZGVmIENPTkZJR19QUkVFTVBUCiBpbnQgX19zY2hlZCBfY29uZF9yZXNjaGVkKHZvaWQpCiB7CiAJaWYgKHNob3VsZF9yZXNjaGVkKDApKSB7CkBAIC00ODUwLDYgKzQ5MDksNyBAQAogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChfY29uZF9yZXNjaGVkKTsKKyNlbmRpZgogCiAvKgogICogX19jb25kX3Jlc2NoZWRfbG9jaygpIC0gaWYgYSByZXNjaGVkdWxlIGlzIHBlbmRpbmcsIGRyb3AgdGhlIGdpdmVuIGxvY2ssCkBAIC00OTc1LDcgKzUwMzUsNyBAQAogCiAJeWllbGRlZCA9IGN1cnItPnNjaGVkX2NsYXNzLT55aWVsZF90b190YXNrKHJxLCBwLCBwcmVlbXB0KTsKIAlpZiAoeWllbGRlZCkgewotCQlzY2hlZHN0YXRfaW5jKHJxLCB5bGRfY291bnQpOworCQlzY2hlZHN0YXRfaW5jKHJxLT55bGRfY291bnQpOwogCQkvKgogCQkgKiBNYWtlIHAncyBDUFUgcmVzY2hlZHVsZTsgcGlja19uZXh0X2VudGl0eSB0YWtlcyBjYXJlIG9mCiAJCSAqIGZhaXJuZXNzLgpAQCAtNTM5NSwxMCArNTQ1NSwxMCBAQAogCiAJcC0+bnVtYV9wcmVmZXJyZWRfbmlkID0gbmlkOwogCi0JaWYgKHJ1bm5pbmcpCi0JCXAtPnNjaGVkX2NsYXNzLT5zZXRfY3Vycl90YXNrKHJxKTsKIAlpZiAocXVldWVkKQogCQllbnF1ZXVlX3Rhc2socnEsIHAsIEVOUVVFVUVfUkVTVE9SRSk7CisJaWYgKHJ1bm5pbmcpCisJCXNldF9jdXJyX3Rhc2socnEsIHApOwogCXRhc2tfcnFfdW5sb2NrKHJxLCBwLCAmcmYpOwogfQogI2VuZGlmIC8qIENPTkZJR19OVU1BX0JBTEFOQ0lORyAqLwpAQCAtNTY5NSw2ICs1NzU1LDggQEAKIAl9CiB9CiAjZWxzZSAvKiAhQ09ORklHX1NDSEVEX0RFQlVHICovCisKKyMgZGVmaW5lIHNjaGVkX2RlYnVnX2VuYWJsZWQgMAogIyBkZWZpbmUgc2NoZWRfZG9tYWluX2RlYnVnKHNkLCBjcHUpIGRvIHsgfSB3aGlsZSAoMCkKIHN0YXRpYyBpbmxpbmUgYm9vbCBzY2hlZF9kZWJ1Zyh2b2lkKQogewpAQCAtNTcxMyw2ICs1Nzc1LDcgQEAKIAkJCSBTRF9CQUxBTkNFX0ZPUksgfAogCQkJIFNEX0JBTEFOQ0VfRVhFQyB8CiAJCQkgU0RfU0hBUkVfQ1BVQ0FQQUNJVFkgfAorCQkJIFNEX0FTWU1fQ1BVQ0FQQUNJVFkgfAogCQkJIFNEX1NIQVJFX1BLR19SRVNPVVJDRVMgfAogCQkJIFNEX1NIQVJFX1BPV0VSRE9NQUlOKSkgewogCQlpZiAoc2QtPmdyb3VwcyAhPSBzZC0+Z3JvdXBzLT5uZXh0KQpAQCAtNTc0Myw2ICs1ODA2LDcgQEAKIAkJCQlTRF9CQUxBTkNFX05FV0lETEUgfAogCQkJCVNEX0JBTEFOQ0VfRk9SSyB8CiAJCQkJU0RfQkFMQU5DRV9FWEVDIHwKKwkJCQlTRF9BU1lNX0NQVUNBUEFDSVRZIHwKIAkJCQlTRF9TSEFSRV9DUFVDQVBBQ0lUWSB8CiAJCQkJU0RfU0hBUkVfUEtHX1JFU09VUkNFUyB8CiAJCQkJU0RfUFJFRkVSX1NJQkxJTkcgfApAQCAtNTg4NywxMCArNTk1MSw4IEBACiAJfSB3aGlsZSAoc2cgIT0gZmlyc3QpOwogfQogCi1zdGF0aWMgdm9pZCBmcmVlX3NjaGVkX2RvbWFpbihzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfc2NoZWRfZG9tYWluKHN0cnVjdCBzY2hlZF9kb21haW4gKnNkKQogewotCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkID0gY29udGFpbmVyX29mKHJjdSwgc3RydWN0IHNjaGVkX2RvbWFpbiwgcmN1KTsKLQogCS8qCiAJICogSWYgaXRzIGFuIG92ZXJsYXBwaW5nIGRvbWFpbiBpdCBoYXMgcHJpdmF0ZSBncm91cHMsIGl0ZXJhdGUgYW5kCiAJICogbnVrZSB0aGVtIGFsbC4KQEAgLTU5MDEsMTggKzU5NjMsMjYgQEAKIAkJa2ZyZWUoc2QtPmdyb3Vwcy0+c2djKTsKIAkJa2ZyZWUoc2QtPmdyb3Vwcyk7CiAJfQorCWlmIChzZC0+c2hhcmVkICYmIGF0b21pY19kZWNfYW5kX3Rlc3QoJnNkLT5zaGFyZWQtPnJlZikpCisJCWtmcmVlKHNkLT5zaGFyZWQpOwogCWtmcmVlKHNkKTsKIH0KIAotc3RhdGljIHZvaWQgZGVzdHJveV9zY2hlZF9kb21haW4oc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCBjcHUpCitzdGF0aWMgdm9pZCBkZXN0cm95X3NjaGVkX2RvbWFpbnNfcmN1KHN0cnVjdCByY3VfaGVhZCAqcmN1KQogewotCWNhbGxfcmN1KCZzZC0+cmN1LCBmcmVlX3NjaGVkX2RvbWFpbik7CisJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QgPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3Qgc2NoZWRfZG9tYWluLCByY3UpOworCisJd2hpbGUgKHNkKSB7CisJCXN0cnVjdCBzY2hlZF9kb21haW4gKnBhcmVudCA9IHNkLT5wYXJlbnQ7CisJCWRlc3Ryb3lfc2NoZWRfZG9tYWluKHNkKTsKKwkJc2QgPSBwYXJlbnQ7CisJfQogfQogCi1zdGF0aWMgdm9pZCBkZXN0cm95X3NjaGVkX2RvbWFpbnMoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCBjcHUpCitzdGF0aWMgdm9pZCBkZXN0cm95X3NjaGVkX2RvbWFpbnMoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QpCiB7Ci0JZm9yICg7IHNkOyBzZCA9IHNkLT5wYXJlbnQpCi0JCWRlc3Ryb3lfc2NoZWRfZG9tYWluKHNkLCBjcHUpOworCWlmIChzZCkKKwkJY2FsbF9yY3UoJnNkLT5yY3UsIGRlc3Ryb3lfc2NoZWRfZG9tYWluc19yY3UpOwogfQogCiAvKgpAQCAtNTkyNywxNCArNTk5NywxNCBAQAogREVGSU5FX1BFUl9DUFUoc3RydWN0IHNjaGVkX2RvbWFpbiAqLCBzZF9sbGMpOwogREVGSU5FX1BFUl9DUFUoaW50LCBzZF9sbGNfc2l6ZSk7CiBERUZJTkVfUEVSX0NQVShpbnQsIHNkX2xsY19pZCk7CitERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc2NoZWRfZG9tYWluX3NoYXJlZCAqLCBzZF9sbGNfc2hhcmVkKTsKIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzY2hlZF9kb21haW4gKiwgc2RfbnVtYSk7Ci1ERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc2NoZWRfZG9tYWluICosIHNkX2J1c3kpOwogREVGSU5FX1BFUl9DUFUoc3RydWN0IHNjaGVkX2RvbWFpbiAqLCBzZF9hc3ltKTsKIAogc3RhdGljIHZvaWQgdXBkYXRlX3RvcF9jYWNoZV9kb21haW4oaW50IGNwdSkKIHsKKwlzdHJ1Y3Qgc2NoZWRfZG9tYWluX3NoYXJlZCAqc2RzID0gTlVMTDsKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKLQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpidXN5X3NkID0gTlVMTDsKIAlpbnQgaWQgPSBjcHU7CiAJaW50IHNpemUgPSAxOwogCkBAIC01OTQyLDEzICs2MDEyLDEzIEBACiAJaWYgKHNkKSB7CiAJCWlkID0gY3B1bWFza19maXJzdChzY2hlZF9kb21haW5fc3BhbihzZCkpOwogCQlzaXplID0gY3B1bWFza193ZWlnaHQoc2NoZWRfZG9tYWluX3NwYW4oc2QpKTsKLQkJYnVzeV9zZCA9IHNkLT5wYXJlbnQ7IC8qIHNkX2J1c3kgKi8KKwkJc2RzID0gc2QtPnNoYXJlZDsKIAl9Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKHBlcl9jcHUoc2RfYnVzeSwgY3B1KSwgYnVzeV9zZCk7CiAKIAlyY3VfYXNzaWduX3BvaW50ZXIocGVyX2NwdShzZF9sbGMsIGNwdSksIHNkKTsKIAlwZXJfY3B1KHNkX2xsY19zaXplLCBjcHUpID0gc2l6ZTsKIAlwZXJfY3B1KHNkX2xsY19pZCwgY3B1KSA9IGlkOworCXJjdV9hc3NpZ25fcG9pbnRlcihwZXJfY3B1KHNkX2xsY19zaGFyZWQsIGNwdSksIHNkcyk7CiAKIAlzZCA9IGxvd2VzdF9mbGFnX2RvbWFpbihjcHUsIFNEX05VTUEpOwogCXJjdV9hc3NpZ25fcG9pbnRlcihwZXJfY3B1KHNkX251bWEsIGNwdSksIHNkKTsKQEAgLTU5ODQsNyArNjA1NCw3IEBACiAJCQkgKi8KIAkJCWlmIChwYXJlbnQtPmZsYWdzICYgU0RfUFJFRkVSX1NJQkxJTkcpCiAJCQkJdG1wLT5mbGFncyB8PSBTRF9QUkVGRVJfU0lCTElORzsKLQkJCWRlc3Ryb3lfc2NoZWRfZG9tYWluKHBhcmVudCwgY3B1KTsKKwkJCWRlc3Ryb3lfc2NoZWRfZG9tYWluKHBhcmVudCk7CiAJCX0gZWxzZQogCQkJdG1wID0gdG1wLT5wYXJlbnQ7CiAJfQpAQCAtNTk5Miw3ICs2MDYyLDcgQEAKIAlpZiAoc2QgJiYgc2RfZGVnZW5lcmF0ZShzZCkpIHsKIAkJdG1wID0gc2Q7CiAJCXNkID0gc2QtPnBhcmVudDsKLQkJZGVzdHJveV9zY2hlZF9kb21haW4odG1wLCBjcHUpOworCQlkZXN0cm95X3NjaGVkX2RvbWFpbih0bXApOwogCQlpZiAoc2QpCiAJCQlzZC0+Y2hpbGQgPSBOVUxMOwogCX0KQEAgLTYwMDIsNyArNjA3Miw3IEBACiAJcnFfYXR0YWNoX3Jvb3QocnEsIHJkKTsKIAl0bXAgPSBycS0+c2Q7CiAJcmN1X2Fzc2lnbl9wb2ludGVyKHJxLT5zZCwgc2QpOwotCWRlc3Ryb3lfc2NoZWRfZG9tYWlucyh0bXAsIGNwdSk7CisJZGVzdHJveV9zY2hlZF9kb21haW5zKHRtcCk7CiAKIAl1cGRhdGVfdG9wX2NhY2hlX2RvbWFpbihjcHUpOwogfQpAQCAtNjI0NSw3ICs2MzE1LDYgQEAKIAkJcmV0dXJuOwogCiAJdXBkYXRlX2dyb3VwX2NhcGFjaXR5KHNkLCBjcHUpOwotCWF0b21pY19zZXQoJnNnLT5zZ2MtPm5yX2J1c3lfY3B1cywgc2ctPmdyb3VwX3dlaWdodCk7CiB9CiAKIC8qCkBAIC02MzMzLDYgKzY0MDIsOSBAQAogCVdBUk5fT05fT05DRSgqcGVyX2NwdV9wdHIoc2RkLT5zZCwgY3B1KSAhPSBzZCk7CiAJKnBlcl9jcHVfcHRyKHNkZC0+c2QsIGNwdSkgPSBOVUxMOwogCisJaWYgKGF0b21pY19yZWFkKCYoKnBlcl9jcHVfcHRyKHNkZC0+c2RzLCBjcHUpKS0+cmVmKSkKKwkJKnBlcl9jcHVfcHRyKHNkZC0+c2RzLCBjcHUpID0gTlVMTDsKKwogCWlmIChhdG9taWNfcmVhZCgmKCpwZXJfY3B1X3B0cihzZGQtPnNnLCBjcHUpKS0+cmVmKSkKIAkJKnBlcl9jcHVfcHRyKHNkZC0+c2csIGNwdSkgPSBOVUxMOwogCkBAIC02MzUyLDI2ICs2NDI0LDM3IEBACiAvKgogICogU0RfZmxhZ3MgYWxsb3dlZCBpbiB0b3BvbG9neSBkZXNjcmlwdGlvbnMuCiAgKgotICogU0RfU0hBUkVfQ1BVQ0FQQUNJVFkgICAgICAtIGRlc2NyaWJlcyBTTVQgdG9wb2xvZ2llcwotICogU0RfU0hBUkVfUEtHX1JFU09VUkNFUyAtIGRlc2NyaWJlcyBzaGFyZWQgY2FjaGVzCi0gKiBTRF9OVU1BICAgICAgICAgICAgICAgIC0gZGVzY3JpYmVzIE5VTUEgdG9wb2xvZ2llcwotICogU0RfU0hBUkVfUE9XRVJET01BSU4gICAtIGRlc2NyaWJlcyBzaGFyZWQgcG93ZXIgZG9tYWluCisgKiBUaGVzZSBmbGFncyBhcmUgcHVyZWx5IGRlc2NyaXB0aXZlIG9mIHRoZSB0b3BvbG9neSBhbmQgZG8gbm90IHByZXNjcmliZQorICogYmVoYXZpb3VyLiBCZWhhdmlvdXIgaXMgYXJ0aWZpY2lhbCBhbmQgbWFwcGVkIGluIHRoZSBiZWxvdyBzZF9pbml0KCkKKyAqIGZ1bmN0aW9uOgogICoKLSAqIE9kZCBvbmUgb3V0OgotICogU0RfQVNZTV9QQUNLSU5HICAgICAgICAtIGRlc2NyaWJlcyBTTVQgcXVpcmtzCisgKiAgIFNEX1NIQVJFX0NQVUNBUEFDSVRZICAgLSBkZXNjcmliZXMgU01UIHRvcG9sb2dpZXMKKyAqICAgU0RfU0hBUkVfUEtHX1JFU09VUkNFUyAtIGRlc2NyaWJlcyBzaGFyZWQgY2FjaGVzCisgKiAgIFNEX05VTUEgICAgICAgICAgICAgICAgLSBkZXNjcmliZXMgTlVNQSB0b3BvbG9naWVzCisgKiAgIFNEX1NIQVJFX1BPV0VSRE9NQUlOICAgLSBkZXNjcmliZXMgc2hhcmVkIHBvd2VyIGRvbWFpbgorICogICBTRF9BU1lNX0NQVUNBUEFDSVRZICAgIC0gZGVzY3JpYmVzIG1peGVkIGNhcGFjaXR5IHRvcG9sb2dpZXMKKyAqCisgKiBPZGQgb25lIG91dCwgd2hpY2ggYmVzaWRlIGRlc2NyaWJpbmcgdGhlIHRvcG9sb2d5IGhhcyBhIHF1aXJrIGFsc28KKyAqIHByZXNjcmliZXMgdGhlIGRlc2lyZWQgYmVoYXZpb3VyIHRoYXQgZ29lcyBhbG9uZyB3aXRoIGl0OgorICoKKyAqICAgU0RfQVNZTV9QQUNLSU5HICAgICAgICAtIGRlc2NyaWJlcyBTTVQgcXVpcmtzCiAgKi8KICNkZWZpbmUgVE9QT0xPR1lfU0RfRkxBR1MJCVwKIAkoU0RfU0hBUkVfQ1BVQ0FQQUNJVFkgfAkJXAogCSBTRF9TSEFSRV9QS0dfUkVTT1VSQ0VTIHwJXAogCSBTRF9OVU1BIHwJCQlcCiAJIFNEX0FTWU1fUEFDS0lORyB8CQlcCisJIFNEX0FTWU1fQ1BVQ0FQQUNJVFkgfAkJXAogCSBTRF9TSEFSRV9QT1dFUkRPTUFJTikKIAogc3RhdGljIHN0cnVjdCBzY2hlZF9kb21haW4gKgotc2RfaW5pdChzdHJ1Y3Qgc2NoZWRfZG9tYWluX3RvcG9sb2d5X2xldmVsICp0bCwgaW50IGNwdSkKK3NkX2luaXQoc3RydWN0IHNjaGVkX2RvbWFpbl90b3BvbG9neV9sZXZlbCAqdGwsCisJY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9tYXAsCisJc3RydWN0IHNjaGVkX2RvbWFpbiAqY2hpbGQsIGludCBjcHUpCiB7Ci0Jc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QgPSAqcGVyX2NwdV9wdHIodGwtPmRhdGEuc2QsIGNwdSk7Ci0JaW50IHNkX3dlaWdodCwgc2RfZmxhZ3MgPSAwOworCXN0cnVjdCBzZF9kYXRhICpzZGQgPSAmdGwtPmRhdGE7CisJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QgPSAqcGVyX2NwdV9wdHIoc2RkLT5zZCwgY3B1KTsKKwlpbnQgc2RfaWQsIHNkX3dlaWdodCwgc2RfZmxhZ3MgPSAwOwogCiAjaWZkZWYgQ09ORklHX05VTUEKIAkvKgpAQCAtNjQyMCwxNSArNjUwMywyNiBAQAogCQkuc210X2dhaW4JCT0gMCwKIAkJLm1heF9uZXdpZGxlX2xiX2Nvc3QJPSAwLAogCQkubmV4dF9kZWNheV9tYXhfbGJfY29zdAk9IGppZmZpZXMsCisJCS5jaGlsZAkJCT0gY2hpbGQsCiAjaWZkZWYgQ09ORklHX1NDSEVEX0RFQlVHCiAJCS5uYW1lCQkJPSB0bC0+bmFtZSwKICNlbmRpZgogCX07CiAKKwljcHVtYXNrX2FuZChzY2hlZF9kb21haW5fc3BhbihzZCksIGNwdV9tYXAsIHRsLT5tYXNrKGNwdSkpOworCXNkX2lkID0gY3B1bWFza19maXJzdChzY2hlZF9kb21haW5fc3BhbihzZCkpOworCiAJLyoKIAkgKiBDb252ZXJ0IHRvcG9sb2dpY2FsIHByb3BlcnRpZXMgaW50byBiZWhhdmlvdXIuCiAJICovCiAKKwlpZiAoc2QtPmZsYWdzICYgU0RfQVNZTV9DUFVDQVBBQ0lUWSkgeworCQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICp0ID0gc2Q7CisKKwkJZm9yX2VhY2hfbG93ZXJfZG9tYWluKHQpCisJCQl0LT5mbGFncyB8PSBTRF9CQUxBTkNFX1dBS0U7CisJfQorCiAJaWYgKHNkLT5mbGFncyAmIFNEX1NIQVJFX0NQVUNBUEFDSVRZKSB7CiAJCXNkLT5mbGFncyB8PSBTRF9QUkVGRVJfU0lCTElORzsKIAkJc2QtPmltYmFsYW5jZV9wY3QgPSAxMTA7CkBAIC02NDYwLDcgKzY1NTQsMTcgQEAKIAkJc2QtPmlkbGVfaWR4ID0gMTsKIAl9CiAKLQlzZC0+cHJpdmF0ZSA9ICZ0bC0+ZGF0YTsKKwkvKgorCSAqIEZvciBhbGwgbGV2ZWxzIHNoYXJpbmcgY2FjaGU7IGNvbm5lY3QgYSBzY2hlZF9kb21haW5fc2hhcmVkCisJICogaW5zdGFuY2UuCisJICovCisJaWYgKHNkLT5mbGFncyAmIFNEX1NIQVJFX1BLR19SRVNPVVJDRVMpIHsKKwkJc2QtPnNoYXJlZCA9ICpwZXJfY3B1X3B0cihzZGQtPnNkcywgc2RfaWQpOworCQlhdG9taWNfaW5jKCZzZC0+c2hhcmVkLT5yZWYpOworCQlhdG9taWNfc2V0KCZzZC0+c2hhcmVkLT5ucl9idXN5X2NwdXMsIHNkX3dlaWdodCk7CisJfQorCisJc2QtPnByaXZhdGUgPSBzZGQ7CiAKIAlyZXR1cm4gc2Q7CiB9CkBAIC02NDg3LDYgKzY1OTEsOSBAQAogCiB2b2lkIHNldF9zY2hlZF90b3BvbG9neShzdHJ1Y3Qgc2NoZWRfZG9tYWluX3RvcG9sb2d5X2xldmVsICp0bCkKIHsKKwlpZiAoV0FSTl9PTl9PTkNFKHNjaGVkX3NtcF9pbml0aWFsaXplZCkpCisJCXJldHVybjsKKwogCXNjaGVkX2RvbWFpbl90b3BvbG9neSA9IHRsOwogfQogCkBAIC02NzY3LDYgKzY4NzQsMTAgQEAKIAkJaWYgKCFzZGQtPnNkKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKKwkJc2RkLT5zZHMgPSBhbGxvY19wZXJjcHUoc3RydWN0IHNjaGVkX2RvbWFpbl9zaGFyZWQgKik7CisJCWlmICghc2RkLT5zZHMpCisJCQlyZXR1cm4gLUVOT01FTTsKKwogCQlzZGQtPnNnID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBzY2hlZF9ncm91cCAqKTsKIAkJaWYgKCFzZGQtPnNnKQogCQkJcmV0dXJuIC1FTk9NRU07CkBAIC02Nzc3LDYgKzY4ODgsNyBAQAogCiAJCWZvcl9lYWNoX2NwdShqLCBjcHVfbWFwKSB7CiAJCQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKKwkJCXN0cnVjdCBzY2hlZF9kb21haW5fc2hhcmVkICpzZHM7CiAJCQlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNnOwogCQkJc3RydWN0IHNjaGVkX2dyb3VwX2NhcGFjaXR5ICpzZ2M7CiAKQEAgLTY3ODcsNiArNjg5OSwxMyBAQAogCiAJCQkqcGVyX2NwdV9wdHIoc2RkLT5zZCwgaikgPSBzZDsKIAorCQkJc2RzID0ga3phbGxvY19ub2RlKHNpemVvZihzdHJ1Y3Qgc2NoZWRfZG9tYWluX3NoYXJlZCksCisJCQkJCUdGUF9LRVJORUwsIGNwdV90b19ub2RlKGopKTsKKwkJCWlmICghc2RzKQorCQkJCXJldHVybiAtRU5PTUVNOworCisJCQkqcGVyX2NwdV9wdHIoc2RkLT5zZHMsIGopID0gc2RzOworCiAJCQlzZyA9IGt6YWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IHNjaGVkX2dyb3VwKSArIGNwdW1hc2tfc2l6ZSgpLAogCQkJCQlHRlBfS0VSTkVMLCBjcHVfdG9fbm9kZShqKSk7CiAJCQlpZiAoIXNnKQpAQCAtNjgyNiw2ICs2OTQ1LDggQEAKIAkJCQlrZnJlZSgqcGVyX2NwdV9wdHIoc2RkLT5zZCwgaikpOwogCQkJfQogCisJCQlpZiAoc2RkLT5zZHMpCisJCQkJa2ZyZWUoKnBlcl9jcHVfcHRyKHNkZC0+c2RzLCBqKSk7CiAJCQlpZiAoc2RkLT5zZykKIAkJCQlrZnJlZSgqcGVyX2NwdV9wdHIoc2RkLT5zZywgaikpOwogCQkJaWYgKHNkZC0+c2djKQpAQCAtNjgzMyw2ICs2OTU0LDggQEAKIAkJfQogCQlmcmVlX3BlcmNwdShzZGQtPnNkKTsKIAkJc2RkLT5zZCA9IE5VTEw7CisJCWZyZWVfcGVyY3B1KHNkZC0+c2RzKTsKKwkJc2RkLT5zZHMgPSBOVUxMOwogCQlmcmVlX3BlcmNwdShzZGQtPnNnKTsKIAkJc2RkLT5zZyA9IE5VTEw7CiAJCWZyZWVfcGVyY3B1KHNkZC0+c2djKTsKQEAgLTY4NDQsMTYgKzY5NjcsMTIgQEAKIAkJY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9tYXAsIHN0cnVjdCBzY2hlZF9kb21haW5fYXR0ciAqYXR0ciwKIAkJc3RydWN0IHNjaGVkX2RvbWFpbiAqY2hpbGQsIGludCBjcHUpCiB7Ci0Jc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QgPSBzZF9pbml0KHRsLCBjcHUpOwotCWlmICghc2QpCi0JCXJldHVybiBjaGlsZDsKKwlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCA9IHNkX2luaXQodGwsIGNwdV9tYXAsIGNoaWxkLCBjcHUpOwogCi0JY3B1bWFza19hbmQoc2NoZWRfZG9tYWluX3NwYW4oc2QpLCBjcHVfbWFwLCB0bC0+bWFzayhjcHUpKTsKIAlpZiAoY2hpbGQpIHsKIAkJc2QtPmxldmVsID0gY2hpbGQtPmxldmVsICsgMTsKIAkJc2NoZWRfZG9tYWluX2xldmVsX21heCA9IG1heChzY2hlZF9kb21haW5fbGV2ZWxfbWF4LCBzZC0+bGV2ZWwpOwogCQljaGlsZC0+cGFyZW50ID0gc2Q7Ci0JCXNkLT5jaGlsZCA9IGNoaWxkOwogCiAJCWlmICghY3B1bWFza19zdWJzZXQoc2NoZWRfZG9tYWluX3NwYW4oY2hpbGQpLAogCQkJCSAgICBzY2hlZF9kb21haW5fc3BhbihzZCkpKSB7CkBAIC02ODg0LDYgKzcwMDMsNyBAQAogCWVudW0gc19hbGxvYyBhbGxvY19zdGF0ZTsKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKIAlzdHJ1Y3Qgc19kYXRhIGQ7CisJc3RydWN0IHJxICpycSA9IE5VTEw7CiAJaW50IGksIHJldCA9IC1FTk9NRU07CiAKIAlhbGxvY19zdGF0ZSA9IF9fdmlzaXRfZG9tYWluX2FsbG9jYXRpb25faGVsbCgmZCwgY3B1X21hcCk7CkBAIC02OTM0LDExICs3MDU0LDIyIEBACiAJLyogQXR0YWNoIHRoZSBkb21haW5zICovCiAJcmN1X3JlYWRfbG9jaygpOwogCWZvcl9lYWNoX2NwdShpLCBjcHVfbWFwKSB7CisJCXJxID0gY3B1X3JxKGkpOwogCQlzZCA9ICpwZXJfY3B1X3B0cihkLnNkLCBpKTsKKworCQkvKiBVc2UgUkVBRF9PTkNFKCkvV1JJVEVfT05DRSgpIHRvIGF2b2lkIGxvYWQvc3RvcmUgdGVhcmluZzogKi8KKwkJaWYgKHJxLT5jcHVfY2FwYWNpdHlfb3JpZyA+IFJFQURfT05DRShkLnJkLT5tYXhfY3B1X2NhcGFjaXR5KSkKKwkJCVdSSVRFX09OQ0UoZC5yZC0+bWF4X2NwdV9jYXBhY2l0eSwgcnEtPmNwdV9jYXBhY2l0eV9vcmlnKTsKKwogCQljcHVfYXR0YWNoX2RvbWFpbihzZCwgZC5yZCwgaSk7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCisJaWYgKHJxICYmIHNjaGVkX2RlYnVnX2VuYWJsZWQpIHsKKwkJcHJfaW5mbygic3BhbjogJSpwYmwgKG1heCBjcHVfY2FwYWNpdHkgPSAlbHUpXG4iLAorCQkJY3B1bWFza19wcl9hcmdzKGNwdV9tYXApLCBycS0+cmQtPm1heF9jcHVfY2FwYWNpdHkpOworCX0KKwogCXJldCA9IDA7CiBlcnJvcjoKIAlfX2ZyZWVfZG9tYWluX2FsbG9jcygmZCwgYWxsb2Nfc3RhdGUsIGNwdV9tYXApOwpAQCAtNzI5Nyw2ICs3NDI4LDIyIEBACiB9CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19TQ0hFRF9TTVQKK0RFRklORV9TVEFUSUNfS0VZX0ZBTFNFKHNjaGVkX3NtdF9wcmVzZW50KTsKKworc3RhdGljIHZvaWQgc2NoZWRfaW5pdF9zbXQodm9pZCkKK3sKKwkvKgorCSAqIFdlJ3ZlIGVudW1lcmF0ZWQgYWxsIENQVXMgYW5kIHdpbGwgYXNzdW1lIHRoYXQgaWYgYW55IENQVQorCSAqIGhhcyBTTVQgc2libGluZ3MsIENQVTAgd2lsbCB0b28uCisJICovCisJaWYgKGNwdW1hc2tfd2VpZ2h0KGNwdV9zbXRfbWFzaygwKSkgPiAxKQorCQlzdGF0aWNfYnJhbmNoX2VuYWJsZSgmc2NoZWRfc210X3ByZXNlbnQpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2hlZF9pbml0X3NtdCh2b2lkKSB7IH0KKyNlbmRpZgorCiB2b2lkIF9faW5pdCBzY2hlZF9pbml0X3NtcCh2b2lkKQogewogCWNwdW1hc2tfdmFyX3Qgbm9uX2lzb2xhdGVkX2NwdXM7CkBAIC03MzI2LDYgKzc0NzMsOSBAQAogCiAJaW5pdF9zY2hlZF9ydF9jbGFzcygpOwogCWluaXRfc2NoZWRfZGxfY2xhc3MoKTsKKworCXNjaGVkX2luaXRfc210KCk7CisKIAlzY2hlZF9zbXBfaW5pdGlhbGl6ZWQgPSB0cnVlOwogfQogCkBAIC03MzYzLDYgKzc1MTMsNyBAQAogI2VuZGlmCiAKIERFQ0xBUkVfUEVSX0NQVShjcHVtYXNrX3Zhcl90LCBsb2FkX2JhbGFuY2VfbWFzayk7CitERUNMQVJFX1BFUl9DUFUoY3B1bWFza192YXJfdCwgc2VsZWN0X2lkbGVfbWFzayk7CiAKIHZvaWQgX19pbml0IHNjaGVkX2luaXQodm9pZCkKIHsKQEAgLTczOTksNiArNzU1MCw4IEBACiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKIAkJcGVyX2NwdShsb2FkX2JhbGFuY2VfbWFzaywgaSkgPSAoY3B1bWFza192YXJfdClremFsbG9jX25vZGUoCiAJCQljcHVtYXNrX3NpemUoKSwgR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoaSkpOworCQlwZXJfY3B1KHNlbGVjdF9pZGxlX21hc2ssIGkpID0gKGNwdW1hc2tfdmFyX3Qpa3phbGxvY19ub2RlKAorCQkJY3B1bWFza19zaXplKCksIEdGUF9LRVJORUwsIGNwdV90b19ub2RlKGkpKTsKIAl9CiAjZW5kaWYgLyogQ09ORklHX0NQVU1BU0tfT0ZGU1RBQ0sgKi8KIApAQCAtNzUwMSwxMCArNzY1NCw2IEBACiAKIAlzZXRfbG9hZF93ZWlnaHQoJmluaXRfdGFzayk7CiAKLSNpZmRlZiBDT05GSUdfUFJFRU1QVF9OT1RJRklFUlMKLQlJTklUX0hMSVNUX0hFQUQoJmluaXRfdGFzay5wcmVlbXB0X25vdGlmaWVycyk7Ci0jZW5kaWYKLQogCS8qCiAJICogVGhlIGJvb3QgaWRsZSB0aHJlYWQgZG9lcyBsYXp5IE1NVSBzd2l0Y2hpbmcgYXMgd2VsbDoKIAkgKi8KQEAgLTc1MTIsMTEgKzc2NjEsNiBAQAogCWVudGVyX2xhenlfdGxiKCZpbml0X21tLCBjdXJyZW50KTsKIAogCS8qCi0JICogRHVyaW5nIGVhcmx5IGJvb3R1cCB3ZSBwcmV0ZW5kIHRvIGJlIGEgbm9ybWFsIHRhc2s6Ci0JICovCi0JY3VycmVudC0+c2NoZWRfY2xhc3MgPSAmZmFpcl9zY2hlZF9jbGFzczsKLQotCS8qCiAJICogTWFrZSB1cyB0aGUgaWRsZSB0aHJlYWQuIFRlY2huaWNhbGx5LCBzY2hlZHVsZSgpIHNob3VsZCBub3QgYmUKIAkgKiBjYWxsZWQgZnJvbSB0aGlzIHRocmVhZCwgaG93ZXZlciBzb21ld2hlcmUgYmVsb3cgaXQgbWlnaHQgYmUsCiAJICogYnV0IGJlY2F1c2Ugd2UgYXJlIHRoZSBpZGxlIHRocmVhZCwgd2UganVzdCBwaWNrIHVwIHJ1bm5pbmcgYWdhaW4KQEAgLTc1NzAsNiArNzcxNCw3IEBACiB2b2lkIF9fX21pZ2h0X3NsZWVwKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBpbnQgcHJlZW1wdF9vZmZzZXQpCiB7CiAJc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJldl9qaWZmeTsJLyogcmF0ZWxpbWl0aW5nICovCisJdW5zaWduZWQgbG9uZyBwcmVlbXB0X2Rpc2FibGVfaXA7CiAKIAlyY3Vfc2xlZXBfY2hlY2soKTsgLyogV0FSTl9PTl9PTkNFKCkgYnkgZGVmYXVsdCwgbm8gcmF0ZSBsaW1pdCByZXFkLiAqLwogCWlmICgocHJlZW1wdF9jb3VudF9lcXVhbHMocHJlZW1wdF9vZmZzZXQpICYmICFpcnFzX2Rpc2FibGVkKCkgJiYKQEAgLTc1ODAsNiArNzcyNSw5IEBACiAJCXJldHVybjsKIAlwcmV2X2ppZmZ5ID0gamlmZmllczsKIAorCS8qIFNhdmUgdGhpcyBiZWZvcmUgY2FsbGluZyBwcmludGsoKSwgc2luY2UgdGhhdCB3aWxsIGNsb2JiZXIgaXQgKi8KKwlwcmVlbXB0X2Rpc2FibGVfaXAgPSBnZXRfcHJlZW1wdF9kaXNhYmxlX2lwKGN1cnJlbnQpOworCiAJcHJpbnRrKEtFUk5fRVJSCiAJCSJCVUc6IHNsZWVwaW5nIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIGludmFsaWQgY29udGV4dCBhdCAlczolZFxuIiwKIAkJCWZpbGUsIGxpbmUpOwpAQCAtNzU5NCwxNCArNzc0MiwxNCBAQAogCWRlYnVnX3Nob3dfaGVsZF9sb2NrcyhjdXJyZW50KTsKIAlpZiAoaXJxc19kaXNhYmxlZCgpKQogCQlwcmludF9pcnF0cmFjZV9ldmVudHMoY3VycmVudCk7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX1BSRUVNUFQKLQlpZiAoIXByZWVtcHRfY291bnRfZXF1YWxzKHByZWVtcHRfb2Zmc2V0KSkgeworCWlmIChJU19FTkFCTEVEKENPTkZJR19ERUJVR19QUkVFTVBUKQorCSAgICAmJiAhcHJlZW1wdF9jb3VudF9lcXVhbHMocHJlZW1wdF9vZmZzZXQpKSB7CiAJCXByX2VycigiUHJlZW1wdGlvbiBkaXNhYmxlZCBhdDoiKTsKLQkJcHJpbnRfaXBfc3ltKGN1cnJlbnQtPnByZWVtcHRfZGlzYWJsZV9pcCk7CisJCXByaW50X2lwX3N5bShwcmVlbXB0X2Rpc2FibGVfaXApOwogCQlwcl9jb250KCJcbiIpOwogCX0KLSNlbmRpZgogCWR1bXBfc3RhY2soKTsKKwlhZGRfdGFpbnQoVEFJTlRfV0FSTiwgTE9DS0RFUF9TVElMTF9PSyk7CiB9CiBFWFBPUlRfU1lNQk9MKF9fX21pZ2h0X3NsZWVwKTsKICNlbmRpZgpAQCAtNzYyMiwxMiArNzc3MCwxMCBAQAogCQlpZiAocC0+ZmxhZ3MgJiBQRl9LVEhSRUFEKQogCQkJY29udGludWU7CiAKLQkJcC0+c2UuZXhlY19zdGFydAkJPSAwOwotI2lmZGVmIENPTkZJR19TQ0hFRFNUQVRTCi0JCXAtPnNlLnN0YXRpc3RpY3Mud2FpdF9zdGFydAk9IDA7Ci0JCXAtPnNlLnN0YXRpc3RpY3Muc2xlZXBfc3RhcnQJPSAwOwotCQlwLT5zZS5zdGF0aXN0aWNzLmJsb2NrX3N0YXJ0CT0gMDsKLSNlbmRpZgorCQlwLT5zZS5leGVjX3N0YXJ0ID0gMDsKKwkJc2NoZWRzdGF0X3NldChwLT5zZS5zdGF0aXN0aWNzLndhaXRfc3RhcnQsICAwKTsKKwkJc2NoZWRzdGF0X3NldChwLT5zZS5zdGF0aXN0aWNzLnNsZWVwX3N0YXJ0LCAwKTsKKwkJc2NoZWRzdGF0X3NldChwLT5zZS5zdGF0aXN0aWNzLmJsb2NrX3N0YXJ0LCAwKTsKIAogCQlpZiAoIWRsX3Rhc2socCkgJiYgIXJ0X3Rhc2socCkpIHsKIAkJCS8qCkBAIC03Njg4LDcgKzc4MzQsNyBAQAogICoKICAqIE9OTFkgVkFMSUQgV0hFTiBUSEUgV0hPTEUgU1lTVEVNIElTIFNUT1BQRUQhCiAgKi8KLXZvaWQgc2V0X2N1cnJfdGFzayhpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit2b2lkIGlhNjRfc2V0X2N1cnJfdGFzayhpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJY3B1X2N1cnIoY3B1KSA9IHA7CiB9CkBAIC03ODE5LDEwICs3OTY1LDEwIEBACiAKIAlzY2hlZF9jaGFuZ2VfZ3JvdXAodHNrLCBUQVNLX01PVkVfR1JPVVApOwogCi0JaWYgKHVubGlrZWx5KHJ1bm5pbmcpKQotCQl0c2stPnNjaGVkX2NsYXNzLT5zZXRfY3Vycl90YXNrKHJxKTsKIAlpZiAocXVldWVkKQogCQllbnF1ZXVlX3Rhc2socnEsIHRzaywgRU5RVUVVRV9SRVNUT1JFIHwgRU5RVUVVRV9NT1ZFKTsKKwlpZiAodW5saWtlbHkocnVubmluZykpCisJCXNldF9jdXJyX3Rhc2socnEsIHRzayk7CiAKIAl0YXNrX3JxX3VubG9jayhycSwgdHNrLCAmcmYpOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL2NwdWRlYWRsaW5lLmMgYi9rZXJuZWwvc2NoZWQvY3B1ZGVhZGxpbmUuYwppbmRleCBkNDE4NDQ5Li5lNzMxMTkwIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvY3B1ZGVhZGxpbmUuYworKysgYi9rZXJuZWwvc2NoZWQvY3B1ZGVhZGxpbmUuYwpAQCAtMzEsNTYgKzMxLDgxIEBACiAJcmV0dXJuIChpIDw8IDEpICsgMjsKIH0KIAotc3RhdGljIHZvaWQgY3B1ZGxfZXhjaGFuZ2Uoc3RydWN0IGNwdWRsICpjcCwgaW50IGEsIGludCBiKQorc3RhdGljIHZvaWQgY3B1ZGxfaGVhcGlmeV9kb3duKHN0cnVjdCBjcHVkbCAqY3AsIGludCBpZHgpCiB7Ci0JaW50IGNwdV9hID0gY3AtPmVsZW1lbnRzW2FdLmNwdSwgY3B1X2IgPSBjcC0+ZWxlbWVudHNbYl0uY3B1OworCWludCBsLCByLCBsYXJnZXN0OwogCi0Jc3dhcChjcC0+ZWxlbWVudHNbYV0uY3B1LCBjcC0+ZWxlbWVudHNbYl0uY3B1KTsKLQlzd2FwKGNwLT5lbGVtZW50c1thXS5kbCAsIGNwLT5lbGVtZW50c1tiXS5kbCApOworCWludCBvcmlnX2NwdSA9IGNwLT5lbGVtZW50c1tpZHhdLmNwdTsKKwl1NjQgb3JpZ19kbCA9IGNwLT5lbGVtZW50c1tpZHhdLmRsOwogCi0Jc3dhcChjcC0+ZWxlbWVudHNbY3B1X2FdLmlkeCwgY3AtPmVsZW1lbnRzW2NwdV9iXS5pZHgpOworCWlmIChsZWZ0X2NoaWxkKGlkeCkgPj0gY3AtPnNpemUpCisJCXJldHVybjsKKworCS8qIGFkYXB0ZWQgZnJvbSBsaWIvcHJpb19oZWFwLmMgKi8KKwl3aGlsZSgxKSB7CisJCXU2NCBsYXJnZXN0X2RsOworCQlsID0gbGVmdF9jaGlsZChpZHgpOworCQlyID0gcmlnaHRfY2hpbGQoaWR4KTsKKwkJbGFyZ2VzdCA9IGlkeDsKKwkJbGFyZ2VzdF9kbCA9IG9yaWdfZGw7CisKKwkJaWYgKChsIDwgY3AtPnNpemUpICYmIGRsX3RpbWVfYmVmb3JlKG9yaWdfZGwsCisJCQkJCQljcC0+ZWxlbWVudHNbbF0uZGwpKSB7CisJCQlsYXJnZXN0ID0gbDsKKwkJCWxhcmdlc3RfZGwgPSBjcC0+ZWxlbWVudHNbbF0uZGw7CisJCX0KKwkJaWYgKChyIDwgY3AtPnNpemUpICYmIGRsX3RpbWVfYmVmb3JlKGxhcmdlc3RfZGwsCisJCQkJCQljcC0+ZWxlbWVudHNbcl0uZGwpKQorCQkJbGFyZ2VzdCA9IHI7CisKKwkJaWYgKGxhcmdlc3QgPT0gaWR4KQorCQkJYnJlYWs7CisKKwkJLyogcHVsbCBsYXJnZXN0IGNoaWxkIG9udG8gaWR4ICovCisJCWNwLT5lbGVtZW50c1tpZHhdLmNwdSA9IGNwLT5lbGVtZW50c1tsYXJnZXN0XS5jcHU7CisJCWNwLT5lbGVtZW50c1tpZHhdLmRsID0gY3AtPmVsZW1lbnRzW2xhcmdlc3RdLmRsOworCQljcC0+ZWxlbWVudHNbY3AtPmVsZW1lbnRzW2lkeF0uY3B1XS5pZHggPSBpZHg7CisJCWlkeCA9IGxhcmdlc3Q7CisJfQorCS8qIGFjdHVhbCBwdXNoIGRvd24gb2Ygc2F2ZWQgb3JpZ2luYWwgdmFsdWVzIG9yaWdfKiAqLworCWNwLT5lbGVtZW50c1tpZHhdLmNwdSA9IG9yaWdfY3B1OworCWNwLT5lbGVtZW50c1tpZHhdLmRsID0gb3JpZ19kbDsKKwljcC0+ZWxlbWVudHNbY3AtPmVsZW1lbnRzW2lkeF0uY3B1XS5pZHggPSBpZHg7Cit9CisKK3N0YXRpYyB2b2lkIGNwdWRsX2hlYXBpZnlfdXAoc3RydWN0IGNwdWRsICpjcCwgaW50IGlkeCkKK3sKKwlpbnQgcDsKKworCWludCBvcmlnX2NwdSA9IGNwLT5lbGVtZW50c1tpZHhdLmNwdTsKKwl1NjQgb3JpZ19kbCA9IGNwLT5lbGVtZW50c1tpZHhdLmRsOworCisJaWYgKGlkeCA9PSAwKQorCQlyZXR1cm47CisKKwlkbyB7CisJCXAgPSBwYXJlbnQoaWR4KTsKKwkJaWYgKGRsX3RpbWVfYmVmb3JlKG9yaWdfZGwsIGNwLT5lbGVtZW50c1twXS5kbCkpCisJCQlicmVhazsKKwkJLyogcHVsbCBwYXJlbnQgb250byBpZHggKi8KKwkJY3AtPmVsZW1lbnRzW2lkeF0uY3B1ID0gY3AtPmVsZW1lbnRzW3BdLmNwdTsKKwkJY3AtPmVsZW1lbnRzW2lkeF0uZGwgPSBjcC0+ZWxlbWVudHNbcF0uZGw7CisJCWNwLT5lbGVtZW50c1tjcC0+ZWxlbWVudHNbaWR4XS5jcHVdLmlkeCA9IGlkeDsKKwkJaWR4ID0gcDsKKwl9IHdoaWxlIChpZHggIT0gMCk7CisJLyogYWN0dWFsIHB1c2ggdXAgb2Ygc2F2ZWQgb3JpZ2luYWwgdmFsdWVzIG9yaWdfKiAqLworCWNwLT5lbGVtZW50c1tpZHhdLmNwdSA9IG9yaWdfY3B1OworCWNwLT5lbGVtZW50c1tpZHhdLmRsID0gb3JpZ19kbDsKKwljcC0+ZWxlbWVudHNbY3AtPmVsZW1lbnRzW2lkeF0uY3B1XS5pZHggPSBpZHg7CiB9CiAKIHN0YXRpYyB2b2lkIGNwdWRsX2hlYXBpZnkoc3RydWN0IGNwdWRsICpjcCwgaW50IGlkeCkKIHsKLQlpbnQgbCwgciwgbGFyZ2VzdDsKLQotCS8qIGFkYXB0ZWQgZnJvbSBsaWIvcHJpb19oZWFwLmMgKi8KLQl3aGlsZSgxKSB7Ci0JCWwgPSBsZWZ0X2NoaWxkKGlkeCk7Ci0JCXIgPSByaWdodF9jaGlsZChpZHgpOwotCQlsYXJnZXN0ID0gaWR4OwotCi0JCWlmICgobCA8IGNwLT5zaXplKSAmJiBkbF90aW1lX2JlZm9yZShjcC0+ZWxlbWVudHNbaWR4XS5kbCwKLQkJCQkJCQljcC0+ZWxlbWVudHNbbF0uZGwpKQotCQkJbGFyZ2VzdCA9IGw7Ci0JCWlmICgociA8IGNwLT5zaXplKSAmJiBkbF90aW1lX2JlZm9yZShjcC0+ZWxlbWVudHNbbGFyZ2VzdF0uZGwsCi0JCQkJCQkJY3AtPmVsZW1lbnRzW3JdLmRsKSkKLQkJCWxhcmdlc3QgPSByOwotCQlpZiAobGFyZ2VzdCA9PSBpZHgpCi0JCQlicmVhazsKLQotCQkvKiBQdXNoIGlkeCBkb3duIHRoZSBoZWFwIG9uZSBsZXZlbCBhbmQgYnVtcCBvbmUgdXAgKi8KLQkJY3B1ZGxfZXhjaGFuZ2UoY3AsIGxhcmdlc3QsIGlkeCk7Ci0JCWlkeCA9IGxhcmdlc3Q7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBjcHVkbF9jaGFuZ2Vfa2V5KHN0cnVjdCBjcHVkbCAqY3AsIGludCBpZHgsIHU2NCBuZXdfZGwpCi17Ci0JV0FSTl9PTihpZHggPT0gSURYX0lOVkFMSUQgfHwgIWNwdV9wcmVzZW50KGlkeCkpOwotCi0JaWYgKGRsX3RpbWVfYmVmb3JlKG5ld19kbCwgY3AtPmVsZW1lbnRzW2lkeF0uZGwpKSB7Ci0JCWNwLT5lbGVtZW50c1tpZHhdLmRsID0gbmV3X2RsOwotCQljcHVkbF9oZWFwaWZ5KGNwLCBpZHgpOwotCX0gZWxzZSB7Ci0JCWNwLT5lbGVtZW50c1tpZHhdLmRsID0gbmV3X2RsOwotCQl3aGlsZSAoaWR4ID4gMCAmJiBkbF90aW1lX2JlZm9yZShjcC0+ZWxlbWVudHNbcGFyZW50KGlkeCldLmRsLAotCQkJCQljcC0+ZWxlbWVudHNbaWR4XS5kbCkpIHsKLQkJCWNwdWRsX2V4Y2hhbmdlKGNwLCBpZHgsIHBhcmVudChpZHgpKTsKLQkJCWlkeCA9IHBhcmVudChpZHgpOwotCQl9Ci0JfQorCWlmIChpZHggPiAwICYmIGRsX3RpbWVfYmVmb3JlKGNwLT5lbGVtZW50c1twYXJlbnQoaWR4KV0uZGwsCisJCQkJY3AtPmVsZW1lbnRzW2lkeF0uZGwpKQorCQljcHVkbF9oZWFwaWZ5X3VwKGNwLCBpZHgpOworCWVsc2UKKwkJY3B1ZGxfaGVhcGlmeV9kb3duKGNwLCBpZHgpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBjcHVkbF9tYXhpbXVtKHN0cnVjdCBjcHVkbCAqY3ApCkBAIC0xMjAsNiArMTQ1LDQ1IEBACiB9CiAKIC8qCisgKiBjcHVkbF9jbGVhciAtIHJlbW92ZSBhIGNwdSBmcm9tIHRoZSBjcHVkbCBtYXgtaGVhcAorICogQGNwOiB0aGUgY3B1ZGwgbWF4LWhlYXAgY29udGV4dAorICogQGNwdTogdGhlIHRhcmdldCBjcHUKKyAqCisgKiBOb3RlczogYXNzdW1lcyBjcHVfcnEoY3B1KS0+bG9jayBpcyBsb2NrZWQKKyAqCisgKiBSZXR1cm5zOiAodm9pZCkKKyAqLwordm9pZCBjcHVkbF9jbGVhcihzdHJ1Y3QgY3B1ZGwgKmNwLCBpbnQgY3B1KQoreworCWludCBvbGRfaWR4LCBuZXdfY3B1OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlXQVJOX09OKCFjcHVfcHJlc2VudChjcHUpKTsKKworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmY3AtPmxvY2ssIGZsYWdzKTsKKworCW9sZF9pZHggPSBjcC0+ZWxlbWVudHNbY3B1XS5pZHg7CisJaWYgKG9sZF9pZHggPT0gSURYX0lOVkFMSUQpIHsKKwkJLyoKKwkJICogTm90aGluZyB0byByZW1vdmUgaWYgb2xkX2lkeCB3YXMgaW52YWxpZC4KKwkJICogVGhpcyBjb3VsZCBoYXBwZW4gaWYgYSBycV9vZmZsaW5lX2RsIGlzCisJCSAqIGNhbGxlZCBmb3IgYSBDUFUgd2l0aG91dCAtZGwgdGFza3MgcnVubmluZy4KKwkJICovCisJfSBlbHNlIHsKKwkJbmV3X2NwdSA9IGNwLT5lbGVtZW50c1tjcC0+c2l6ZSAtIDFdLmNwdTsKKwkJY3AtPmVsZW1lbnRzW29sZF9pZHhdLmRsID0gY3AtPmVsZW1lbnRzW2NwLT5zaXplIC0gMV0uZGw7CisJCWNwLT5lbGVtZW50c1tvbGRfaWR4XS5jcHUgPSBuZXdfY3B1OworCQljcC0+c2l6ZS0tOworCQljcC0+ZWxlbWVudHNbbmV3X2NwdV0uaWR4ID0gb2xkX2lkeDsKKwkJY3AtPmVsZW1lbnRzW2NwdV0uaWR4ID0gSURYX0lOVkFMSUQ7CisJCWNwdWRsX2hlYXBpZnkoY3AsIG9sZF9pZHgpOworCisJCWNwdW1hc2tfc2V0X2NwdShjcHUsIGNwLT5mcmVlX2NwdXMpOworCX0KKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3AtPmxvY2ssIGZsYWdzKTsKK30KKworLyoKICAqIGNwdWRsX3NldCAtIHVwZGF0ZSB0aGUgY3B1ZGwgbWF4LWhlYXAKICAqIEBjcDogdGhlIGNwdWRsIG1heC1oZWFwIGNvbnRleHQKICAqIEBjcHU6IHRoZSB0YXJnZXQgY3B1CkBAIC0xMjksNTUgKzE5MywyOCBAQAogICoKICAqIFJldHVybnM6ICh2b2lkKQogICovCi12b2lkIGNwdWRsX3NldChzdHJ1Y3QgY3B1ZGwgKmNwLCBpbnQgY3B1LCB1NjQgZGwsIGludCBpc192YWxpZCkKK3ZvaWQgY3B1ZGxfc2V0KHN0cnVjdCBjcHVkbCAqY3AsIGludCBjcHUsIHU2NCBkbCkKIHsKLQlpbnQgb2xkX2lkeCwgbmV3X2NwdTsKKwlpbnQgb2xkX2lkeDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJV0FSTl9PTighY3B1X3ByZXNlbnQoY3B1KSk7CiAKIAlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmNwLT5sb2NrLCBmbGFncyk7CisKIAlvbGRfaWR4ID0gY3AtPmVsZW1lbnRzW2NwdV0uaWR4OwotCWlmICghaXNfdmFsaWQpIHsKLQkJLyogcmVtb3ZlIGl0ZW0gKi8KLQkJaWYgKG9sZF9pZHggPT0gSURYX0lOVkFMSUQpIHsKLQkJCS8qCi0JCQkgKiBOb3RoaW5nIHRvIHJlbW92ZSBpZiBvbGRfaWR4IHdhcyBpbnZhbGlkLgotCQkJICogVGhpcyBjb3VsZCBoYXBwZW4gaWYgYSBycV9vZmZsaW5lX2RsIGlzCi0JCQkgKiBjYWxsZWQgZm9yIGEgQ1BVIHdpdGhvdXQgLWRsIHRhc2tzIHJ1bm5pbmcuCi0JCQkgKi8KLQkJCWdvdG8gb3V0OwotCQl9Ci0JCW5ld19jcHUgPSBjcC0+ZWxlbWVudHNbY3AtPnNpemUgLSAxXS5jcHU7Ci0JCWNwLT5lbGVtZW50c1tvbGRfaWR4XS5kbCA9IGNwLT5lbGVtZW50c1tjcC0+c2l6ZSAtIDFdLmRsOwotCQljcC0+ZWxlbWVudHNbb2xkX2lkeF0uY3B1ID0gbmV3X2NwdTsKLQkJY3AtPnNpemUtLTsKLQkJY3AtPmVsZW1lbnRzW25ld19jcHVdLmlkeCA9IG9sZF9pZHg7Ci0JCWNwLT5lbGVtZW50c1tjcHVdLmlkeCA9IElEWF9JTlZBTElEOwotCQl3aGlsZSAob2xkX2lkeCA+IDAgJiYgZGxfdGltZV9iZWZvcmUoCi0JCQkJY3AtPmVsZW1lbnRzW3BhcmVudChvbGRfaWR4KV0uZGwsCi0JCQkJY3AtPmVsZW1lbnRzW29sZF9pZHhdLmRsKSkgewotCQkJY3B1ZGxfZXhjaGFuZ2UoY3AsIG9sZF9pZHgsIHBhcmVudChvbGRfaWR4KSk7Ci0JCQlvbGRfaWR4ID0gcGFyZW50KG9sZF9pZHgpOwotCQl9Ci0JCWNwdW1hc2tfc2V0X2NwdShjcHUsIGNwLT5mcmVlX2NwdXMpOwotICAgICAgICAgICAgICAgIGNwdWRsX2hlYXBpZnkoY3AsIG9sZF9pZHgpOwotCi0JCWdvdG8gb3V0OwotCX0KLQogCWlmIChvbGRfaWR4ID09IElEWF9JTlZBTElEKSB7Ci0JCWNwLT5zaXplKys7Ci0JCWNwLT5lbGVtZW50c1tjcC0+c2l6ZSAtIDFdLmRsID0gZGw7Ci0JCWNwLT5lbGVtZW50c1tjcC0+c2l6ZSAtIDFdLmNwdSA9IGNwdTsKLQkJY3AtPmVsZW1lbnRzW2NwdV0uaWR4ID0gY3AtPnNpemUgLSAxOwotCQljcHVkbF9jaGFuZ2Vfa2V5KGNwLCBjcC0+c2l6ZSAtIDEsIGRsKTsKKwkJaW50IG5ld19pZHggPSBjcC0+c2l6ZSsrOworCQljcC0+ZWxlbWVudHNbbmV3X2lkeF0uZGwgPSBkbDsKKwkJY3AtPmVsZW1lbnRzW25ld19pZHhdLmNwdSA9IGNwdTsKKwkJY3AtPmVsZW1lbnRzW2NwdV0uaWR4ID0gbmV3X2lkeDsKKwkJY3B1ZGxfaGVhcGlmeV91cChjcCwgbmV3X2lkeCk7CiAJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgY3AtPmZyZWVfY3B1cyk7CiAJfSBlbHNlIHsKLQkJY3B1ZGxfY2hhbmdlX2tleShjcCwgb2xkX2lkeCwgZGwpOworCQljcC0+ZWxlbWVudHNbb2xkX2lkeF0uZGwgPSBkbDsKKwkJY3B1ZGxfaGVhcGlmeShjcCwgb2xkX2lkeCk7CiAJfQogCi1vdXQ6CiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNwLT5sb2NrLCBmbGFncyk7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9jcHVkZWFkbGluZS5oIGIva2VybmVsL3NjaGVkL2NwdWRlYWRsaW5lLmgKaW5kZXggZmNiZGY4My4uZjdkYThjNSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkL2NwdWRlYWRsaW5lLmgKKysrIGIva2VybmVsL3NjaGVkL2NwdWRlYWRsaW5lLmgKQEAgLTIzLDcgKzIzLDggQEAKICNpZmRlZiBDT05GSUdfU01QCiBpbnQgY3B1ZGxfZmluZChzdHJ1Y3QgY3B1ZGwgKmNwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsCiAJICAgICAgIHN0cnVjdCBjcHVtYXNrICpsYXRlcl9tYXNrKTsKLXZvaWQgY3B1ZGxfc2V0KHN0cnVjdCBjcHVkbCAqY3AsIGludCBjcHUsIHU2NCBkbCwgaW50IGlzX3ZhbGlkKTsKK3ZvaWQgY3B1ZGxfc2V0KHN0cnVjdCBjcHVkbCAqY3AsIGludCBjcHUsIHU2NCBkbCk7Cit2b2lkIGNwdWRsX2NsZWFyKHN0cnVjdCBjcHVkbCAqY3AsIGludCBjcHUpOwogaW50IGNwdWRsX2luaXQoc3RydWN0IGNwdWRsICpjcCk7CiB2b2lkIGNwdWRsX3NldF9mcmVlY3B1KHN0cnVjdCBjcHVkbCAqY3AsIGludCBjcHUpOwogdm9pZCBjcHVkbF9jbGVhcl9mcmVlY3B1KHN0cnVjdCBjcHVkbCAqY3AsIGludCBjcHUpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL2NwdWZyZXEuYyBiL2tlcm5lbC9zY2hlZC9jcHVmcmVxLmMKaW5kZXggMTE0MTk1NC4uZGJjNTE0NCAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkL2NwdWZyZXEuYworKysgYi9rZXJuZWwvc2NoZWQvY3B1ZnJlcS5jCkBAIC0zMyw3ICszMyw3IEBACiAgKi8KIHZvaWQgY3B1ZnJlcV9hZGRfdXBkYXRlX3V0aWxfaG9vayhpbnQgY3B1LCBzdHJ1Y3QgdXBkYXRlX3V0aWxfZGF0YSAqZGF0YSwKIAkJCXZvaWQgKCpmdW5jKShzdHJ1Y3QgdXBkYXRlX3V0aWxfZGF0YSAqZGF0YSwgdTY0IHRpbWUsCi0JCQkJICAgICB1bnNpZ25lZCBsb25nIHV0aWwsIHVuc2lnbmVkIGxvbmcgbWF4KSkKKwkJCQkgICAgIHVuc2lnbmVkIGludCBmbGFncykpCiB7CiAJaWYgKFdBUk5fT04oIWRhdGEgfHwgIWZ1bmMpKQogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvY3B1ZnJlcV9zY2hlZHV0aWwuYyBiL2tlcm5lbC9zY2hlZC9jcHVmcmVxX3NjaGVkdXRpbC5jCmluZGV4IGE4NDY0MWIuLjY5ZTA2ODkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9jcHVmcmVxX3NjaGVkdXRpbC5jCisrKyBiL2tlcm5lbC9zY2hlZC9jcHVmcmVxX3NjaGVkdXRpbC5jCkBAIC0xMiw3ICsxMiw2IEBACiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAKICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9wb3dlci5oPgogCkBAIC00OCwxMSArNDcsMTQgQEAKIAlzdHJ1Y3Qgc3Vnb3ZfcG9saWN5ICpzZ19wb2xpY3k7CiAKIAl1bnNpZ25lZCBpbnQgY2FjaGVkX3Jhd19mcmVxOworCXVuc2lnbmVkIGxvbmcgaW93YWl0X2Jvb3N0OworCXVuc2lnbmVkIGxvbmcgaW93YWl0X2Jvb3N0X21heDsKKwl1NjQgbGFzdF91cGRhdGU7CiAKIAkvKiBUaGUgZmllbGRzIGJlbG93IGFyZSBvbmx5IG5lZWRlZCB3aGVuIHNoYXJpbmcgYSBwb2xpY3kuICovCiAJdW5zaWduZWQgbG9uZyB1dGlsOwogCXVuc2lnbmVkIGxvbmcgbWF4OwotCXU2NCBsYXN0X3VwZGF0ZTsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CiB9OwogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHN1Z292X2NwdSwgc3Vnb3ZfY3B1KTsKQEAgLTE0NCwyNCArMTQ2LDc1IEBACiAJcmV0dXJuIGNwdWZyZXFfZHJpdmVyX3Jlc29sdmVfZnJlcShwb2xpY3ksIGZyZXEpOwogfQogCitzdGF0aWMgdm9pZCBzdWdvdl9nZXRfdXRpbCh1bnNpZ25lZCBsb25nICp1dGlsLCB1bnNpZ25lZCBsb25nICptYXgpCit7CisJc3RydWN0IHJxICpycSA9IHRoaXNfcnEoKTsKKwl1bnNpZ25lZCBsb25nIGNmc19tYXg7CisKKwljZnNfbWF4ID0gYXJjaF9zY2FsZV9jcHVfY2FwYWNpdHkoTlVMTCwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKworCSp1dGlsID0gbWluKHJxLT5jZnMuYXZnLnV0aWxfYXZnLCBjZnNfbWF4KTsKKwkqbWF4ID0gY2ZzX21heDsKK30KKworc3RhdGljIHZvaWQgc3Vnb3Zfc2V0X2lvd2FpdF9ib29zdChzdHJ1Y3Qgc3Vnb3ZfY3B1ICpzZ19jcHUsIHU2NCB0aW1lLAorCQkJCSAgIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlpZiAoZmxhZ3MgJiBTQ0hFRF9DUFVGUkVRX0lPV0FJVCkgeworCQlzZ19jcHUtPmlvd2FpdF9ib29zdCA9IHNnX2NwdS0+aW93YWl0X2Jvb3N0X21heDsKKwl9IGVsc2UgaWYgKHNnX2NwdS0+aW93YWl0X2Jvb3N0KSB7CisJCXM2NCBkZWx0YV9ucyA9IHRpbWUgLSBzZ19jcHUtPmxhc3RfdXBkYXRlOworCisJCS8qIENsZWFyIGlvd2FpdF9ib29zdCBpZiB0aGUgQ1BVIGFwcHJlYXJzIHRvIGhhdmUgYmVlbiBpZGxlLiAqLworCQlpZiAoZGVsdGFfbnMgPiBUSUNLX05TRUMpCisJCQlzZ19jcHUtPmlvd2FpdF9ib29zdCA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdWdvdl9pb3dhaXRfYm9vc3Qoc3RydWN0IHN1Z292X2NwdSAqc2dfY3B1LCB1bnNpZ25lZCBsb25nICp1dGlsLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKm1heCkKK3sKKwl1bnNpZ25lZCBsb25nIGJvb3N0X3V0aWwgPSBzZ19jcHUtPmlvd2FpdF9ib29zdDsKKwl1bnNpZ25lZCBsb25nIGJvb3N0X21heCA9IHNnX2NwdS0+aW93YWl0X2Jvb3N0X21heDsKKworCWlmICghYm9vc3RfdXRpbCkKKwkJcmV0dXJuOworCisJaWYgKCp1dGlsICogYm9vc3RfbWF4IDwgKm1heCAqIGJvb3N0X3V0aWwpIHsKKwkJKnV0aWwgPSBib29zdF91dGlsOworCQkqbWF4ID0gYm9vc3RfbWF4OworCX0KKwlzZ19jcHUtPmlvd2FpdF9ib29zdCA+Pj0gMTsKK30KKwogc3RhdGljIHZvaWQgc3Vnb3ZfdXBkYXRlX3NpbmdsZShzdHJ1Y3QgdXBkYXRlX3V0aWxfZGF0YSAqaG9vaywgdTY0IHRpbWUsCi0JCQkJdW5zaWduZWQgbG9uZyB1dGlsLCB1bnNpZ25lZCBsb25nIG1heCkKKwkJCQl1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHN1Z292X2NwdSAqc2dfY3B1ID0gY29udGFpbmVyX29mKGhvb2ssIHN0cnVjdCBzdWdvdl9jcHUsIHVwZGF0ZV91dGlsKTsKIAlzdHJ1Y3Qgc3Vnb3ZfcG9saWN5ICpzZ19wb2xpY3kgPSBzZ19jcHUtPnNnX3BvbGljeTsKIAlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSA9IHNnX3BvbGljeS0+cG9saWN5OworCXVuc2lnbmVkIGxvbmcgdXRpbCwgbWF4OwogCXVuc2lnbmVkIGludCBuZXh0X2Y7CiAKKwlzdWdvdl9zZXRfaW93YWl0X2Jvb3N0KHNnX2NwdSwgdGltZSwgZmxhZ3MpOworCXNnX2NwdS0+bGFzdF91cGRhdGUgPSB0aW1lOworCiAJaWYgKCFzdWdvdl9zaG91bGRfdXBkYXRlX2ZyZXEoc2dfcG9saWN5LCB0aW1lKSkKIAkJcmV0dXJuOwogCi0JbmV4dF9mID0gdXRpbCA9PSBVTE9OR19NQVggPyBwb2xpY3ktPmNwdWluZm8ubWF4X2ZyZXEgOgotCQkJZ2V0X25leHRfZnJlcShzZ19jcHUsIHV0aWwsIG1heCk7CisJaWYgKGZsYWdzICYgU0NIRURfQ1BVRlJFUV9SVF9ETCkgeworCQluZXh0X2YgPSBwb2xpY3ktPmNwdWluZm8ubWF4X2ZyZXE7CisJfSBlbHNlIHsKKwkJc3Vnb3ZfZ2V0X3V0aWwoJnV0aWwsICZtYXgpOworCQlzdWdvdl9pb3dhaXRfYm9vc3Qoc2dfY3B1LCAmdXRpbCwgJm1heCk7CisJCW5leHRfZiA9IGdldF9uZXh0X2ZyZXEoc2dfY3B1LCB1dGlsLCBtYXgpOworCX0KIAlzdWdvdl91cGRhdGVfY29tbWl0KHNnX3BvbGljeSwgdGltZSwgbmV4dF9mKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBzdWdvdl9uZXh0X2ZyZXFfc2hhcmVkKHN0cnVjdCBzdWdvdl9jcHUgKnNnX2NwdSwKLQkJCQkJICAgdW5zaWduZWQgbG9uZyB1dGlsLCB1bnNpZ25lZCBsb25nIG1heCkKKwkJCQkJICAgdW5zaWduZWQgbG9uZyB1dGlsLCB1bnNpZ25lZCBsb25nIG1heCwKKwkJCQkJICAgdW5zaWduZWQgaW50IGZsYWdzKQogewogCXN0cnVjdCBzdWdvdl9wb2xpY3kgKnNnX3BvbGljeSA9IHNnX2NwdS0+c2dfcG9saWN5OwogCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5ID0gc2dfcG9saWN5LT5wb2xpY3k7CkBAIC0xNjksOSArMjIyLDExIEBACiAJdTY0IGxhc3RfZnJlcV91cGRhdGVfdGltZSA9IHNnX3BvbGljeS0+bGFzdF9mcmVxX3VwZGF0ZV90aW1lOwogCXVuc2lnbmVkIGludCBqOwogCi0JaWYgKHV0aWwgPT0gVUxPTkdfTUFYKQorCWlmIChmbGFncyAmIFNDSEVEX0NQVUZSRVFfUlRfREwpCiAJCXJldHVybiBtYXhfZjsKIAorCXN1Z292X2lvd2FpdF9ib29zdChzZ19jcHUsICZ1dGlsLCAmbWF4KTsKKwogCWZvcl9lYWNoX2NwdShqLCBwb2xpY3ktPmNwdXMpIHsKIAkJc3RydWN0IHN1Z292X2NwdSAqal9zZ19jcHU7CiAJCXVuc2lnbmVkIGxvbmcgal91dGlsLCBqX21heDsKQEAgLTE4Niw0MSArMjQxLDUwIEBACiAJCSAqIGZyZXF1ZW5jeSB1cGRhdGUgYW5kIHRoZSB0aW1lIGVsYXBzZWQgYmV0d2VlbiB0aGUgbGFzdCB1cGRhdGUKIAkJICogb2YgdGhlIENQVSB1dGlsaXphdGlvbiBhbmQgdGhlIGxhc3QgZnJlcXVlbmN5IHVwZGF0ZSBpcyBsb25nCiAJCSAqIGVub3VnaCwgZG9uJ3QgdGFrZSB0aGUgQ1BVIGludG8gYWNjb3VudCBhcyBpdCBwcm9iYWJseSBpcwotCQkgKiBpZGxlIG5vdy4KKwkJICogaWRsZSBub3cgKGFuZCBjbGVhciBpb3dhaXRfYm9vc3QgZm9yIGl0KS4KIAkJICovCiAJCWRlbHRhX25zID0gbGFzdF9mcmVxX3VwZGF0ZV90aW1lIC0gal9zZ19jcHUtPmxhc3RfdXBkYXRlOwotCQlpZiAoZGVsdGFfbnMgPiBUSUNLX05TRUMpCisJCWlmIChkZWx0YV9ucyA+IFRJQ0tfTlNFQykgeworCQkJal9zZ19jcHUtPmlvd2FpdF9ib29zdCA9IDA7CiAJCQljb250aW51ZTsKLQotCQlqX3V0aWwgPSBqX3NnX2NwdS0+dXRpbDsKLQkJaWYgKGpfdXRpbCA9PSBVTE9OR19NQVgpCisJCX0KKwkJaWYgKGpfc2dfY3B1LT5mbGFncyAmIFNDSEVEX0NQVUZSRVFfUlRfREwpCiAJCQlyZXR1cm4gbWF4X2Y7CiAKKwkJal91dGlsID0gal9zZ19jcHUtPnV0aWw7CiAJCWpfbWF4ID0gal9zZ19jcHUtPm1heDsKIAkJaWYgKGpfdXRpbCAqIG1heCA+IGpfbWF4ICogdXRpbCkgewogCQkJdXRpbCA9IGpfdXRpbDsKIAkJCW1heCA9IGpfbWF4OwogCQl9CisKKwkJc3Vnb3ZfaW93YWl0X2Jvb3N0KGpfc2dfY3B1LCAmdXRpbCwgJm1heCk7CiAJfQogCiAJcmV0dXJuIGdldF9uZXh0X2ZyZXEoc2dfY3B1LCB1dGlsLCBtYXgpOwogfQogCiBzdGF0aWMgdm9pZCBzdWdvdl91cGRhdGVfc2hhcmVkKHN0cnVjdCB1cGRhdGVfdXRpbF9kYXRhICpob29rLCB1NjQgdGltZSwKLQkJCQl1bnNpZ25lZCBsb25nIHV0aWwsIHVuc2lnbmVkIGxvbmcgbWF4KQorCQkJCXVuc2lnbmVkIGludCBmbGFncykKIHsKIAlzdHJ1Y3Qgc3Vnb3ZfY3B1ICpzZ19jcHUgPSBjb250YWluZXJfb2YoaG9vaywgc3RydWN0IHN1Z292X2NwdSwgdXBkYXRlX3V0aWwpOwogCXN0cnVjdCBzdWdvdl9wb2xpY3kgKnNnX3BvbGljeSA9IHNnX2NwdS0+c2dfcG9saWN5OworCXVuc2lnbmVkIGxvbmcgdXRpbCwgbWF4OwogCXVuc2lnbmVkIGludCBuZXh0X2Y7CiAKKwlzdWdvdl9nZXRfdXRpbCgmdXRpbCwgJm1heCk7CisKIAlyYXdfc3Bpbl9sb2NrKCZzZ19wb2xpY3ktPnVwZGF0ZV9sb2NrKTsKIAogCXNnX2NwdS0+dXRpbCA9IHV0aWw7CiAJc2dfY3B1LT5tYXggPSBtYXg7CisJc2dfY3B1LT5mbGFncyA9IGZsYWdzOworCisJc3Vnb3Zfc2V0X2lvd2FpdF9ib29zdChzZ19jcHUsIHRpbWUsIGZsYWdzKTsKIAlzZ19jcHUtPmxhc3RfdXBkYXRlID0gdGltZTsKIAogCWlmIChzdWdvdl9zaG91bGRfdXBkYXRlX2ZyZXEoc2dfcG9saWN5LCB0aW1lKSkgewotCQluZXh0X2YgPSBzdWdvdl9uZXh0X2ZyZXFfc2hhcmVkKHNnX2NwdSwgdXRpbCwgbWF4KTsKKwkJbmV4dF9mID0gc3Vnb3ZfbmV4dF9mcmVxX3NoYXJlZChzZ19jcHUsIHV0aWwsIG1heCwgZmxhZ3MpOwogCQlzdWdvdl91cGRhdGVfY29tbWl0KHNnX3BvbGljeSwgdGltZSwgbmV4dF9mKTsKIAl9CiAKQEAgLTQ0NCwxMCArNTA4LDEzIEBACiAKIAkJc2dfY3B1LT5zZ19wb2xpY3kgPSBzZ19wb2xpY3k7CiAJCWlmIChwb2xpY3lfaXNfc2hhcmVkKHBvbGljeSkpIHsKLQkJCXNnX2NwdS0+dXRpbCA9IFVMT05HX01BWDsKKwkJCXNnX2NwdS0+dXRpbCA9IDA7CiAJCQlzZ19jcHUtPm1heCA9IDA7CisJCQlzZ19jcHUtPmZsYWdzID0gU0NIRURfQ1BVRlJFUV9SVDsKIAkJCXNnX2NwdS0+bGFzdF91cGRhdGUgPSAwOwogCQkJc2dfY3B1LT5jYWNoZWRfcmF3X2ZyZXEgPSAwOworCQkJc2dfY3B1LT5pb3dhaXRfYm9vc3QgPSAwOworCQkJc2dfY3B1LT5pb3dhaXRfYm9vc3RfbWF4ID0gcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxOwogCQkJY3B1ZnJlcV9hZGRfdXBkYXRlX3V0aWxfaG9vayhjcHUsICZzZ19jcHUtPnVwZGF0ZV91dGlsLAogCQkJCQkJICAgICBzdWdvdl91cGRhdGVfc2hhcmVkKTsKIAkJfSBlbHNlIHsKQEAgLTQ5NSwyOCArNTYyLDE1IEBACiAJLmxpbWl0cyA9IHN1Z292X2xpbWl0cywKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHN1Z292X21vZHVsZV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfZ292ZXJub3IoJnNjaGVkdXRpbF9nb3YpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgc3Vnb3ZfbW9kdWxlX2V4aXQodm9pZCkKLXsKLQljcHVmcmVxX3VucmVnaXN0ZXJfZ292ZXJub3IoJnNjaGVkdXRpbF9nb3YpOwotfQotCi1NT0RVTEVfQVVUSE9SKCJSYWZhZWwgSi4gV3lzb2NraSA8cmFmYWVsLmoud3lzb2NraUBpbnRlbC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlV0aWxpemF0aW9uLWJhc2VkIENQVSBmcmVxdWVuY3kgc2VsZWN0aW9uIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KICNpZmRlZiBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfU0NIRURVVElMCiBzdHJ1Y3QgY3B1ZnJlcV9nb3Zlcm5vciAqY3B1ZnJlcV9kZWZhdWx0X2dvdmVybm9yKHZvaWQpCiB7CiAJcmV0dXJuICZzY2hlZHV0aWxfZ292OwogfQotCi1mc19pbml0Y2FsbChzdWdvdl9tb2R1bGVfaW5pdCk7Ci0jZWxzZQotbW9kdWxlX2luaXQoc3Vnb3ZfbW9kdWxlX2luaXQpOwogI2VuZGlmCi1tb2R1bGVfZXhpdChzdWdvdl9tb2R1bGVfZXhpdCk7CisKK3N0YXRpYyBpbnQgX19pbml0IHN1Z292X3JlZ2lzdGVyKHZvaWQpCit7CisJcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfZ292ZXJub3IoJnNjaGVkdXRpbF9nb3YpOworfQorZnNfaW5pdGNhbGwoc3Vnb3ZfcmVnaXN0ZXIpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL2NwdXRpbWUuYyBiL2tlcm5lbC9zY2hlZC9jcHV0aW1lLmMKaW5kZXggOTg1ODI2Ni4uNWViZWUzMSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkL2NwdXRpbWUuYworKysgYi9rZXJuZWwvc2NoZWQvY3B1dGltZS5jCkBAIC0yMywxMCArMjMsOCBAQAogICogdGFzayB3aGVuIGlycSBpcyBpbiBwcm9ncmVzcyB3aGlsZSB3ZSByZWFkIHJxLT5jbG9jay4gVGhhdCBpcyBhIHdvcnRoeQogICogY29tcHJvbWlzZSBpbiBwbGFjZSBvZiBoYXZpbmcgbG9ja3Mgb24gZWFjaCBpcnEgaW4gYWNjb3VudF9zeXN0ZW1fdGltZS4KICAqLwotREVGSU5FX1BFUl9DUFUodTY0LCBjcHVfaGFyZGlycV90aW1lKTsKLURFRklORV9QRVJfQ1BVKHU2NCwgY3B1X3NvZnRpcnFfdGltZSk7CitERUZJTkVfUEVSX0NQVShzdHJ1Y3QgaXJxdGltZSwgY3B1X2lycXRpbWUpOwogCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUodTY0LCBpcnFfc3RhcnRfdGltZSk7CiBzdGF0aWMgaW50IHNjaGVkX2Nsb2NrX2lycXRpbWU7CiAKIHZvaWQgZW5hYmxlX3NjaGVkX2Nsb2NrX2lycXRpbWUodm9pZCkKQEAgLTM5LDE2ICszNywxMyBAQAogCXNjaGVkX2Nsb2NrX2lycXRpbWUgPSAwOwogfQogCi0jaWZuZGVmIENPTkZJR182NEJJVAotREVGSU5FX1BFUl9DUFUoc2VxY291bnRfdCwgaXJxX3RpbWVfc2VxKTsKLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KLQogLyoKICAqIENhbGxlZCBiZWZvcmUgaW5jcmVtZW50aW5nIHByZWVtcHRfY291bnQgb24ge3NvZnQsfWlycV9lbnRlcgogICogYW5kIGJlZm9yZSBkZWNyZW1lbnRpbmcgcHJlZW1wdF9jb3VudCBvbiB7c29mdCx9aXJxX2V4aXQuCiAgKi8KIHZvaWQgaXJxdGltZV9hY2NvdW50X2lycShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnIpCiB7CisJc3RydWN0IGlycXRpbWUgKmlycXRpbWUgPSB0aGlzX2NwdV9wdHIoJmNwdV9pcnF0aW1lKTsKIAlzNjQgZGVsdGE7CiAJaW50IGNwdTsKIApAQCAtNTYsMTAgKzUxLDEwIEBACiAJCXJldHVybjsKIAogCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlkZWx0YSA9IHNjaGVkX2Nsb2NrX2NwdShjcHUpIC0gX190aGlzX2NwdV9yZWFkKGlycV9zdGFydF90aW1lKTsKLQlfX3RoaXNfY3B1X2FkZChpcnFfc3RhcnRfdGltZSwgZGVsdGEpOworCWRlbHRhID0gc2NoZWRfY2xvY2tfY3B1KGNwdSkgLSBpcnF0aW1lLT5pcnFfc3RhcnRfdGltZTsKKwlpcnF0aW1lLT5pcnFfc3RhcnRfdGltZSArPSBkZWx0YTsKIAotCWlycV90aW1lX3dyaXRlX2JlZ2luKCk7CisJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmaXJxdGltZS0+c3luYyk7CiAJLyoKIAkgKiBXZSBkbyBub3QgYWNjb3VudCBmb3Igc29mdGlycSB0aW1lIGZyb20ga3NvZnRpcnFkIGhlcmUuCiAJICogV2Ugd2FudCB0byBjb250aW51ZSBhY2NvdW50aW5nIHNvZnRpcnEgdGltZSB0byBrc29mdGlycWQgdGhyZWFkCkBAIC02Nyw0MiArNjIsMzYgQEAKIAkgKiB0aGF0IGRvIG5vdCBjb25zdW1lIGFueSB0aW1lLCBidXQgc3RpbGwgd2FudHMgdG8gcnVuLgogCSAqLwogCWlmIChoYXJkaXJxX2NvdW50KCkpCi0JCV9fdGhpc19jcHVfYWRkKGNwdV9oYXJkaXJxX3RpbWUsIGRlbHRhKTsKKwkJaXJxdGltZS0+aGFyZGlycV90aW1lICs9IGRlbHRhOwogCWVsc2UgaWYgKGluX3NlcnZpbmdfc29mdGlycSgpICYmIGN1cnIgIT0gdGhpc19jcHVfa3NvZnRpcnFkKCkpCi0JCV9fdGhpc19jcHVfYWRkKGNwdV9zb2Z0aXJxX3RpbWUsIGRlbHRhKTsKKwkJaXJxdGltZS0+c29mdGlycV90aW1lICs9IGRlbHRhOwogCi0JaXJxX3RpbWVfd3JpdGVfZW5kKCk7CisJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJmlycXRpbWUtPnN5bmMpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXJxdGltZV9hY2NvdW50X2lycSk7CiAKLXN0YXRpYyBjcHV0aW1lX3QgaXJxdGltZV9hY2NvdW50X2hpX3VwZGF0ZShjcHV0aW1lX3QgbWF4dGltZSkKK3N0YXRpYyBjcHV0aW1lX3QgaXJxdGltZV9hY2NvdW50X3VwZGF0ZSh1NjQgaXJxdGltZSwgaW50IGlkeCwgY3B1dGltZV90IG1heHRpbWUpCiB7CiAJdTY0ICpjcHVzdGF0ID0ga2NwdXN0YXRfdGhpc19jcHUtPmNwdXN0YXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAljcHV0aW1lX3QgaXJxX2NwdXRpbWU7CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JaXJxX2NwdXRpbWUgPSBuc2Vjc190b19jcHV0aW1lNjQodGhpc19jcHVfcmVhZChjcHVfaGFyZGlycV90aW1lKSkgLQotCQkgICAgICBjcHVzdGF0W0NQVVRJTUVfSVJRXTsKKwlpcnFfY3B1dGltZSA9IG5zZWNzX3RvX2NwdXRpbWU2NChpcnF0aW1lKSAtIGNwdXN0YXRbaWR4XTsKIAlpcnFfY3B1dGltZSA9IG1pbihpcnFfY3B1dGltZSwgbWF4dGltZSk7Ci0JY3B1c3RhdFtDUFVUSU1FX0lSUV0gKz0gaXJxX2NwdXRpbWU7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWNwdXN0YXRbaWR4XSArPSBpcnFfY3B1dGltZTsKKwogCXJldHVybiBpcnFfY3B1dGltZTsKIH0KIAorc3RhdGljIGNwdXRpbWVfdCBpcnF0aW1lX2FjY291bnRfaGlfdXBkYXRlKGNwdXRpbWVfdCBtYXh0aW1lKQoreworCXJldHVybiBpcnF0aW1lX2FjY291bnRfdXBkYXRlKF9fdGhpc19jcHVfcmVhZChjcHVfaXJxdGltZS5oYXJkaXJxX3RpbWUpLAorCQkJCSAgICAgIENQVVRJTUVfSVJRLCBtYXh0aW1lKTsKK30KKwogc3RhdGljIGNwdXRpbWVfdCBpcnF0aW1lX2FjY291bnRfc2lfdXBkYXRlKGNwdXRpbWVfdCBtYXh0aW1lKQogewotCXU2NCAqY3B1c3RhdCA9IGtjcHVzdGF0X3RoaXNfY3B1LT5jcHVzdGF0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JY3B1dGltZV90IHNvZnRpcnFfY3B1dGltZTsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlzb2Z0aXJxX2NwdXRpbWUgPSBuc2Vjc190b19jcHV0aW1lNjQodGhpc19jcHVfcmVhZChjcHVfc29mdGlycV90aW1lKSkgLQotCQkJICBjcHVzdGF0W0NQVVRJTUVfU09GVElSUV07Ci0Jc29mdGlycV9jcHV0aW1lID0gbWluKHNvZnRpcnFfY3B1dGltZSwgbWF4dGltZSk7Ci0JY3B1c3RhdFtDUFVUSU1FX1NPRlRJUlFdICs9IHNvZnRpcnFfY3B1dGltZTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JcmV0dXJuIHNvZnRpcnFfY3B1dGltZTsKKwlyZXR1cm4gaXJxdGltZV9hY2NvdW50X3VwZGF0ZShfX3RoaXNfY3B1X3JlYWQoY3B1X2lycXRpbWUuc29mdGlycV90aW1lKSwKKwkJCQkgICAgICBDUFVUSU1FX1NPRlRJUlEsIG1heHRpbWUpOwogfQogCiAjZWxzZSAvKiBDT05GSUdfSVJRX1RJTUVfQUNDT1VOVElORyAqLwpAQCAtMjYzLDYgKzI1MiwxMSBAQAogCQljcHVzdGF0W0NQVVRJTUVfSURMRV0gKz0gKF9fZm9yY2UgdTY0KSBjcHV0aW1lOwogfQogCisvKgorICogV2hlbiBhIGd1ZXN0IGlzIGludGVycnVwdGVkIGZvciBhIGxvbmdlciBhbW91bnQgb2YgdGltZSwgbWlzc2VkIGNsb2NrCisgKiB0aWNrcyBhcmUgbm90IHJlZGVsaXZlcmVkIGxhdGVyLiBEdWUgdG8gdGhhdCwgdGhpcyBmdW5jdGlvbiBtYXkgb24KKyAqIG9jY2FzaW9uIGFjY291bnQgbW9yZSB0aW1lIHRoYW4gdGhlIGNhbGxpbmcgZnVuY3Rpb25zIHRoaW5rIGVsYXBzZWQuCisgKi8KIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgY3B1dGltZV90IHN0ZWFsX2FjY291bnRfcHJvY2Vzc190aW1lKGNwdXRpbWVfdCBtYXh0aW1lKQogewogI2lmZGVmIENPTkZJR19QQVJBVklSVApAQCAtMjkwLDYgKzI4NCw5IEBACiB7CiAJY3B1dGltZV90IGFjY291bnRlZDsKIAorCS8qIFNoYWxsIGJlIGNvbnZlcnRlZCB0byBhIGxvY2tkZXAtZW5hYmxlZCBsaWdodHdlaWdodCBjaGVjayAqLworCVdBUk5fT05fT05DRSghaXJxc19kaXNhYmxlZCgpKTsKKwogCWFjY291bnRlZCA9IHN0ZWFsX2FjY291bnRfcHJvY2Vzc190aW1lKG1heCk7CiAKIAlpZiAoYWNjb3VudGVkIDwgbWF4KQpAQCAtMzAxLDYgKzI5OCwyNiBAQAogCXJldHVybiBhY2NvdW50ZWQ7CiB9CiAKKyNpZmRlZiBDT05GSUdfNjRCSVQKK3N0YXRpYyBpbmxpbmUgdTY0IHJlYWRfc3VtX2V4ZWNfcnVudGltZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpCit7CisJcmV0dXJuIHQtPnNlLnN1bV9leGVjX3J1bnRpbWU7Cit9CisjZWxzZQorc3RhdGljIHU2NCByZWFkX3N1bV9leGVjX3J1bnRpbWUoc3RydWN0IHRhc2tfc3RydWN0ICp0KQoreworCXU2NCBuczsKKwlzdHJ1Y3QgcnFfZmxhZ3MgcmY7CisJc3RydWN0IHJxICpycTsKKworCXJxID0gdGFza19ycV9sb2NrKHQsICZyZik7CisJbnMgPSB0LT5zZS5zdW1fZXhlY19ydW50aW1lOworCXRhc2tfcnFfdW5sb2NrKHJxLCB0LCAmcmYpOworCisJcmV0dXJuIG5zOworfQorI2VuZGlmCisKIC8qCiAgKiBBY2N1bXVsYXRlIHJhdyBjcHV0aW1lIHZhbHVlcyBvZiBkZWFkIHRhc2tzIChzaWctPlt1c110aW1lKSBhbmQgbGl2ZQogICogdGFza3MgKHN1bSBvbiBncm91cCBpdGVyYXRpb24pIGJlbG9uZ2luZyB0byBAdHNrJ3MgZ3JvdXAuCkBAIC0zMTMsNiArMzMwLDE3IEBACiAJdW5zaWduZWQgaW50IHNlcSwgbmV4dHNlcTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJLyoKKwkgKiBVcGRhdGUgY3VycmVudCB0YXNrIHJ1bnRpbWUgdG8gYWNjb3VudCBwZW5kaW5nIHRpbWUgc2luY2UgbGFzdAorCSAqIHNjaGVkdWxlciBhY3Rpb24gb3IgdGhyZWFkX2dyb3VwX2NwdXRpbWUoKSBjYWxsLiBUaGlzIHRocmVhZCBncm91cAorCSAqIG1pZ2h0IGhhdmUgb3RoZXIgcnVubmluZyB0YXNrcyBvbiBkaWZmZXJlbnQgQ1BVcywgYnV0IHVwZGF0aW5nCisJICogdGhlaXIgcnVudGltZSBjYW4gYWZmZWN0IHN5c2NhbGwgcGVyZm9ybWFuY2UsIHNvIHdlIHNraXAgYWNjb3VudAorCSAqIHRob3NlIHBlbmRpbmcgdGltZXMgYW5kIHJlbHkgb25seSBvbiB2YWx1ZXMgdXBkYXRlZCBvbiB0aWNrIG9yCisJICogb3RoZXIgc2NoZWR1bGVyIGFjdGlvbi4KKwkgKi8KKwlpZiAoc2FtZV90aHJlYWRfZ3JvdXAoY3VycmVudCwgdHNrKSkKKwkJKHZvaWQpIHRhc2tfc2NoZWRfcnVudGltZShjdXJyZW50KTsKKwogCXJjdV9yZWFkX2xvY2soKTsKIAkvKiBBdHRlbXB0IGEgbG9ja2xlc3MgcmVhZCBvbiB0aGUgZmlyc3Qgcm91bmQuICovCiAJbmV4dHNlcSA9IDA7CkBAIC0zMjcsNyArMzU1LDcgQEAKIAkJCXRhc2tfY3B1dGltZSh0LCAmdXRpbWUsICZzdGltZSk7CiAJCQl0aW1lcy0+dXRpbWUgKz0gdXRpbWU7CiAJCQl0aW1lcy0+c3RpbWUgKz0gc3RpbWU7Ci0JCQl0aW1lcy0+c3VtX2V4ZWNfcnVudGltZSArPSB0YXNrX3NjaGVkX3J1bnRpbWUodCk7CisJCQl0aW1lcy0+c3VtX2V4ZWNfcnVudGltZSArPSByZWFkX3N1bV9leGVjX3J1bnRpbWUodCk7CiAJCX0KIAkJLyogSWYgbG9ja2xlc3MgYWNjZXNzIGZhaWxlZCwgdGFrZSB0aGUgbG9jay4gKi8KIAkJbmV4dHNlcSA9IDE7CkBAIC0zNzEsNyArMzk5LDcgQEAKIAkgKiBpZGxlLCBvciBwb3RlbnRpYWxseSB1c2VyIG9yIHN5c3RlbSB0aW1lLiBEdWUgdG8gcm91bmRpbmcsCiAJICogb3RoZXIgdGltZSBjYW4gZXhjZWVkIHRpY2tzIG9jY2FzaW9uYWxseS4KIAkgKi8KLQlvdGhlciA9IGFjY291bnRfb3RoZXJfdGltZShjcHV0aW1lKTsKKwlvdGhlciA9IGFjY291bnRfb3RoZXJfdGltZShVTE9OR19NQVgpOwogCWlmIChvdGhlciA+PSBjcHV0aW1lKQogCQlyZXR1cm47CiAJY3B1dGltZSAtPSBvdGhlcjsKQEAgLTQ4Niw3ICs1MTQsNyBAQAogCX0KIAogCWNwdXRpbWUgPSBjcHV0aW1lX29uZV9qaWZmeTsKLQlzdGVhbCA9IHN0ZWFsX2FjY291bnRfcHJvY2Vzc190aW1lKGNwdXRpbWUpOworCXN0ZWFsID0gc3RlYWxfYWNjb3VudF9wcm9jZXNzX3RpbWUoVUxPTkdfTUFYKTsKIAogCWlmIChzdGVhbCA+PSBjcHV0aW1lKQogCQlyZXR1cm47CkBAIC01MTYsNyArNTQ0LDcgQEAKIAl9CiAKIAljcHV0aW1lID0gamlmZmllc190b19jcHV0aW1lKHRpY2tzKTsKLQlzdGVhbCA9IHN0ZWFsX2FjY291bnRfcHJvY2Vzc190aW1lKGNwdXRpbWUpOworCXN0ZWFsID0gc3RlYWxfYWNjb3VudF9wcm9jZXNzX3RpbWUoVUxPTkdfTUFYKTsKIAogCWlmIChzdGVhbCA+PSBjcHV0aW1lKQogCQlyZXR1cm47CkBAIC02MTQsMTkgKzY0MiwyNSBAQAogCXN0aW1lID0gY3Vyci0+c3RpbWU7CiAJdXRpbWUgPSBjdXJyLT51dGltZTsKIAotCWlmICh1dGltZSA9PSAwKSB7Ci0JCXN0aW1lID0gcnRpbWU7CisJLyoKKwkgKiBJZiBlaXRoZXIgc3RpbWUgb3IgYm90aCBzdGltZSBhbmQgdXRpbWUgYXJlIDAsIGFzc3VtZSBhbGwgcnVudGltZSBpcworCSAqIHVzZXJzcGFjZS4gT25jZSBhIHRhc2sgZ2V0cyBzb21lIHRpY2tzLCB0aGUgbW9ub3RvbmljeSBjb2RlIGF0CisJICogJ3VwZGF0ZScgd2lsbCBlbnN1cmUgdGhpbmdzIGNvbnZlcmdlIHRvIHRoZSBvYnNlcnZlZCByYXRpby4KKwkgKi8KKwlpZiAoc3RpbWUgPT0gMCkgeworCQl1dGltZSA9IHJ0aW1lOwogCQlnb3RvIHVwZGF0ZTsKIAl9CiAKLQlpZiAoc3RpbWUgPT0gMCkgewotCQl1dGltZSA9IHJ0aW1lOworCWlmICh1dGltZSA9PSAwKSB7CisJCXN0aW1lID0gcnRpbWU7CiAJCWdvdG8gdXBkYXRlOwogCX0KIAogCXN0aW1lID0gc2NhbGVfc3RpbWUoKF9fZm9yY2UgdTY0KXN0aW1lLCAoX19mb3JjZSB1NjQpcnRpbWUsCiAJCQkgICAgKF9fZm9yY2UgdTY0KShzdGltZSArIHV0aW1lKSk7CiAKK3VwZGF0ZToKIAkvKgogCSAqIE1ha2Ugc3VyZSBzdGltZSBkb2Vzbid0IGdvIGJhY2t3YXJkczsgdGhpcyBwcmVzZXJ2ZXMgbW9ub3RvbmljaXR5CiAJICogZm9yIHV0aW1lIGJlY2F1c2UgcnRpbWUgaXMgbW9ub3RvbmljLgpAQCAtNjQ5LDcgKzY4Myw2IEBACiAJCXN0aW1lID0gcnRpbWUgLSB1dGltZTsKIAl9CiAKLXVwZGF0ZToKIAlwcmV2LT5zdGltZSA9IHN0aW1lOwogCXByZXYtPnV0aW1lID0gdXRpbWU7CiBvdXQ6CkBAIC02OTQsNiArNzI3LDEzIEBACiAJdW5zaWduZWQgbG9uZyBub3cgPSBSRUFEX09OQ0UoamlmZmllcyk7CiAJY3B1dGltZV90IGRlbHRhLCBvdGhlcjsKIAorCS8qCisJICogVW5saWtlIHRpY2sgYmFzZWQgdGltaW5nLCB2dGltZSBiYXNlZCB0aW1pbmcgbmV2ZXIgaGFzIGxvc3QKKwkgKiB0aWNrcywgYW5kIG5vIG5lZWQgZm9yIHN0ZWFsIHRpbWUgYWNjb3VudGluZyB0byBtYWtlIHVwIGZvcgorCSAqIGxvc3QgdGlja3MuIFZ0aW1lIGFjY291bnRzIGEgcm91bmRlZCB2ZXJzaW9uIG9mIGFjdHVhbAorCSAqIGVsYXBzZWQgdGltZS4gTGltaXQgYWNjb3VudF9vdGhlcl90aW1lIHRvIHByZXZlbnQgcm91bmRpbmcKKwkgKiBlcnJvcnMgZnJvbSBjYXVzaW5nIGVsYXBzZWQgdnRpbWUgdG8gZ28gbmVnYXRpdmUuCisJICovCiAJZGVsdGEgPSBqaWZmaWVzX3RvX2NwdXRpbWUobm93IC0gdHNrLT52dGltZV9zbmFwKTsKIAlvdGhlciA9IGFjY291bnRfb3RoZXJfdGltZShkZWx0YSk7CiAJV0FSTl9PTl9PTkNFKHRzay0+dnRpbWVfc25hcF93aGVuY2UgPT0gVlRJTUVfSU5BQ1RJVkUpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL2RlYWRsaW5lLmMgYi9rZXJuZWwvc2NoZWQvZGVhZGxpbmUuYwppbmRleCAxY2U4ODY3Li4zN2UyNDQ5IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvZGVhZGxpbmUuYworKysgYi9rZXJuZWwvc2NoZWQvZGVhZGxpbmUuYwpAQCAtMjQzLDEwICsyNDMsOCBAQAogc3RhdGljIHN0cnVjdCBycSAqZGxfdGFza19vZmZsaW5lX21pZ3JhdGlvbihzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJc3RydWN0IHJxICpsYXRlcl9ycSA9IE5VTEw7Ci0JYm9vbCBmYWxsYmFjayA9IGZhbHNlOwogCiAJbGF0ZXJfcnEgPSBmaW5kX2xvY2tfbGF0ZXJfcnEocCwgcnEpOwotCiAJaWYgKCFsYXRlcl9ycSkgewogCQlpbnQgY3B1OwogCkBAIC0yNTQsNyArMjUyLDYgQEAKIAkJICogSWYgd2UgY2Fubm90IHByZWVtcHQgYW55IHJxLCBmYWxsIGJhY2sgdG8gcGljayBhbnkKIAkJICogb25saW5lIGNwdS4KIAkJICovCi0JCWZhbGxiYWNrID0gdHJ1ZTsKIAkJY3B1ID0gY3B1bWFza19hbnlfYW5kKGNwdV9hY3RpdmVfbWFzaywgdHNrX2NwdXNfYWxsb3dlZChwKSk7CiAJCWlmIChjcHUgPj0gbnJfY3B1X2lkcykgewogCQkJLyoKQEAgLTI3NCwxNiArMjcxLDcgQEAKIAkJZG91YmxlX2xvY2tfYmFsYW5jZShycSwgbGF0ZXJfcnEpOwogCX0KIAotCS8qCi0JICogQnkgbm93IHRoZSB0YXNrIGlzIHJlcGxlbmlzaGVkIGFuZCBlbnF1ZXVlZDsgbWlncmF0ZSBpdC4KLQkgKi8KLQlkZWFjdGl2YXRlX3Rhc2socnEsIHAsIDApOwogCXNldF90YXNrX2NwdShwLCBsYXRlcl9ycS0+Y3B1KTsKLQlhY3RpdmF0ZV90YXNrKGxhdGVyX3JxLCBwLCAwKTsKLQotCWlmICghZmFsbGJhY2spCi0JCXJlc2NoZWRfY3VycihsYXRlcl9ycSk7Ci0KIAlkb3VibGVfdW5sb2NrX2JhbGFuY2UobGF0ZXJfcnEsIHJxKTsKIAogCXJldHVybiBsYXRlcl9ycTsKQEAgLTM0NiwxMiArMzM0LDEyIEBACiAgKiBvbmUsIGFuZCB0byAodHJ5IHRvISkgcmVjb25jaWxlIGl0c2VsZiB3aXRoIGl0cyBvd24gc2NoZWR1bGluZwogICogcGFyYW1ldGVycy4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIHNldHVwX25ld19kbF9lbnRpdHkoc3RydWN0IHNjaGVkX2RsX2VudGl0eSAqZGxfc2UsCi0JCQkJICAgICAgIHN0cnVjdCBzY2hlZF9kbF9lbnRpdHkgKnBpX3NlKQorc3RhdGljIGlubGluZSB2b2lkIHNldHVwX25ld19kbF9lbnRpdHkoc3RydWN0IHNjaGVkX2RsX2VudGl0eSAqZGxfc2UpCiB7CiAJc3RydWN0IGRsX3JxICpkbF9ycSA9IGRsX3JxX29mX3NlKGRsX3NlKTsKIAlzdHJ1Y3QgcnEgKnJxID0gcnFfb2ZfZGxfcnEoZGxfcnEpOwogCisJV0FSTl9PTihkbF9zZS0+ZGxfYm9vc3RlZCk7CiAJV0FSTl9PTihkbF90aW1lX2JlZm9yZShycV9jbG9jayhycSksIGRsX3NlLT5kZWFkbGluZSkpOwogCiAJLyoKQEAgLTM2Nyw4ICszNTUsOCBAQAogCSAqIGZ1dHVyZTsgaW4gZmFjdCwgd2UgbXVzdCBjb25zaWRlciBleGVjdXRpb24gb3ZlcmhlYWRzICh0aW1lCiAJICogc3BlbnQgb24gaGFyZGlycSBjb250ZXh0LCBldGMuKS4KIAkgKi8KLQlkbF9zZS0+ZGVhZGxpbmUgPSBycV9jbG9jayhycSkgKyBwaV9zZS0+ZGxfZGVhZGxpbmU7Ci0JZGxfc2UtPnJ1bnRpbWUgPSBwaV9zZS0+ZGxfcnVudGltZTsKKwlkbF9zZS0+ZGVhZGxpbmUgPSBycV9jbG9jayhycSkgKyBkbF9zZS0+ZGxfZGVhZGxpbmU7CisJZGxfc2UtPnJ1bnRpbWUgPSBkbF9zZS0+ZGxfcnVudGltZTsKIH0KIAogLyoKQEAgLTY0MSw2ICs2MjksMjQgQEAKIAkJZ290byB1bmxvY2s7CiAJfQogCisjaWZkZWYgQ09ORklHX1NNUAorCWlmICh1bmxpa2VseSghcnEtPm9ubGluZSkpIHsKKwkJLyoKKwkJICogSWYgdGhlIHJ1bnF1ZXVlIGlzIG5vIGxvbmdlciBhdmFpbGFibGUsIG1pZ3JhdGUgdGhlCisJCSAqIHRhc2sgZWxzZXdoZXJlLiBUaGlzIG5lY2Vzc2FyaWx5IGNoYW5nZXMgcnEuCisJCSAqLworCQlsb2NrZGVwX3VucGluX2xvY2soJnJxLT5sb2NrLCByZi5jb29raWUpOworCQlycSA9IGRsX3Rhc2tfb2ZmbGluZV9taWdyYXRpb24ocnEsIHApOworCQlyZi5jb29raWUgPSBsb2NrZGVwX3Bpbl9sb2NrKCZycS0+bG9jayk7CisKKwkJLyoKKwkJICogTm93IHRoYXQgdGhlIHRhc2sgaGFzIGJlZW4gbWlncmF0ZWQgdG8gdGhlIG5ldyBSUSBhbmQgd2UKKwkJICogaGF2ZSB0aGF0IGxvY2tlZCwgcHJvY2VlZCBhcyBub3JtYWwgYW5kIGVucXVldWUgdGhlIHRhc2sKKwkJICogdGhlcmUuCisJCSAqLworCX0KKyNlbmRpZgorCiAJZW5xdWV1ZV90YXNrX2RsKHJxLCBwLCBFTlFVRVVFX1JFUExFTklTSCk7CiAJaWYgKGRsX3Rhc2socnEtPmN1cnIpKQogCQljaGVja19wcmVlbXB0X2N1cnJfZGwocnEsIHAsIDApOwpAQCAtNjQ5LDIyICs2NTUsNiBAQAogCiAjaWZkZWYgQ09ORklHX1NNUAogCS8qCi0JICogUGVyZm9ybSBiYWxhbmNpbmcgb3BlcmF0aW9ucyBoZXJlOyBhZnRlciB0aGUgcmVwbGVuaXNobWVudHMuICBXZQotCSAqIGNhbm5vdCBkcm9wIHJxLT5sb2NrIGJlZm9yZSB0aGlzLCBvdGhlcndpc2UgdGhlIGFzc2VydGlvbiBpbgotCSAqIHN0YXJ0X2RsX3RpbWVyKCkgYWJvdXQgbm90IG1pc3NpbmcgdXBkYXRlcyBpcyBub3QgdHJ1ZS4KLQkgKgotCSAqIElmIHdlIGZpbmQgdGhhdCB0aGUgcnEgdGhlIHRhc2sgd2FzIG9uIGlzIG5vIGxvbmdlciBhdmFpbGFibGUsIHdlCi0JICogbmVlZCB0byBzZWxlY3QgYSBuZXcgcnEuCi0JICoKLQkgKiBYWFggZmlndXJlIG91dCBpZiBzZWxlY3RfdGFza19ycV9kbCgpIGRlYWxzIHdpdGggb2ZmbGluZSBjcHVzLgotCSAqLwotCWlmICh1bmxpa2VseSghcnEtPm9ubGluZSkpIHsKLQkJbG9ja2RlcF91bnBpbl9sb2NrKCZycS0+bG9jaywgcmYuY29va2llKTsKLQkJcnEgPSBkbF90YXNrX29mZmxpbmVfbWlncmF0aW9uKHJxLCBwKTsKLQkJcmYuY29va2llID0gbG9ja2RlcF9waW5fbG9jaygmcnEtPmxvY2spOwotCX0KLQotCS8qCiAJICogUXVldWVpbmcgdGhpcyB0YXNrIGJhY2sgbWlnaHQgaGF2ZSBvdmVybG9hZGVkIHJxLCBjaGVjayBpZiB3ZSBuZWVkCiAJICogdG8ga2ljayBzb21lb25lIGF3YXkuCiAJICovCkBAIC03MzUsOSArNzI1LDggQEAKIAkJcmV0dXJuOwogCX0KIAotCS8qIGtpY2sgY3B1ZnJlcSAoc2VlIHRoZSBjb21tZW50IGluIGxpbnV4L2NwdWZyZXEuaCkuICovCi0JaWYgKGNwdV9vZihycSkgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQotCQljcHVmcmVxX3RyaWdnZXJfdXBkYXRlKHJxX2Nsb2NrKHJxKSk7CisJLyoga2ljayBjcHVmcmVxIChzZWUgdGhlIGNvbW1lbnQgaW4ga2VybmVsL3NjaGVkL3NjaGVkLmgpLiAqLworCWNwdWZyZXFfdXBkYXRlX3RoaXNfY3B1KHJxLCBTQ0hFRF9DUFVGUkVRX0RMKTsKIAogCXNjaGVkc3RhdF9zZXQoY3Vyci0+c2Uuc3RhdGlzdGljcy5leGVjX21heCwKIAkJICAgICAgbWF4KGN1cnItPnNlLnN0YXRpc3RpY3MuZXhlY19tYXgsIGRlbHRhX2V4ZWMpKTsKQEAgLTc5OCw3ICs3ODcsNyBAQAogCWlmIChkbF9ycS0+ZWFybGllc3RfZGwuY3VyciA9PSAwIHx8CiAJICAgIGRsX3RpbWVfYmVmb3JlKGRlYWRsaW5lLCBkbF9ycS0+ZWFybGllc3RfZGwuY3VycikpIHsKIAkJZGxfcnEtPmVhcmxpZXN0X2RsLmN1cnIgPSBkZWFkbGluZTsKLQkJY3B1ZGxfc2V0KCZycS0+cmQtPmNwdWRsLCBycS0+Y3B1LCBkZWFkbGluZSwgMSk7CisJCWNwdWRsX3NldCgmcnEtPnJkLT5jcHVkbCwgcnEtPmNwdSwgZGVhZGxpbmUpOwogCX0KIH0KIApAQCAtODEzLDE0ICs4MDIsMTQgQEAKIAlpZiAoIWRsX3JxLT5kbF9ucl9ydW5uaW5nKSB7CiAJCWRsX3JxLT5lYXJsaWVzdF9kbC5jdXJyID0gMDsKIAkJZGxfcnEtPmVhcmxpZXN0X2RsLm5leHQgPSAwOwotCQljcHVkbF9zZXQoJnJxLT5yZC0+Y3B1ZGwsIHJxLT5jcHUsIDAsIDApOworCQljcHVkbF9jbGVhcigmcnEtPnJkLT5jcHVkbCwgcnEtPmNwdSk7CiAJfSBlbHNlIHsKIAkJc3RydWN0IHJiX25vZGUgKmxlZnRtb3N0ID0gZGxfcnEtPnJiX2xlZnRtb3N0OwogCQlzdHJ1Y3Qgc2NoZWRfZGxfZW50aXR5ICplbnRyeTsKIAogCQllbnRyeSA9IHJiX2VudHJ5KGxlZnRtb3N0LCBzdHJ1Y3Qgc2NoZWRfZGxfZW50aXR5LCByYl9ub2RlKTsKIAkJZGxfcnEtPmVhcmxpZXN0X2RsLmN1cnIgPSBlbnRyeS0+ZGVhZGxpbmU7Ci0JCWNwdWRsX3NldCgmcnEtPnJkLT5jcHVkbCwgcnEtPmNwdSwgZW50cnktPmRlYWRsaW5lLCAxKTsKKwkJY3B1ZGxfc2V0KCZycS0+cmQtPmNwdWRsLCBycS0+Y3B1LCBlbnRyeS0+ZGVhZGxpbmUpOwogCX0KIH0KIApAQCAtMTY3MSw3ICsxNjYwLDcgQEAKIAogCWNwdWRsX3NldF9mcmVlY3B1KCZycS0+cmQtPmNwdWRsLCBycS0+Y3B1KTsKIAlpZiAocnEtPmRsLmRsX25yX3J1bm5pbmcgPiAwKQotCQljcHVkbF9zZXQoJnJxLT5yZC0+Y3B1ZGwsIHJxLT5jcHUsIHJxLT5kbC5lYXJsaWVzdF9kbC5jdXJyLCAxKTsKKwkJY3B1ZGxfc2V0KCZycS0+cmQtPmNwdWRsLCBycS0+Y3B1LCBycS0+ZGwuZWFybGllc3RfZGwuY3Vycik7CiB9CiAKIC8qIEFzc3VtZXMgcnEtPmxvY2sgaXMgaGVsZCAqLwpAQCAtMTY4MCw3ICsxNjY5LDcgQEAKIAlpZiAocnEtPmRsLm92ZXJsb2FkZWQpCiAJCWRsX2NsZWFyX292ZXJsb2FkKHJxKTsKIAotCWNwdWRsX3NldCgmcnEtPnJkLT5jcHVkbCwgcnEtPmNwdSwgMCwgMCk7CisJY3B1ZGxfY2xlYXIoJnJxLT5yZC0+Y3B1ZGwsIHJxLT5jcHUpOwogCWNwdWRsX2NsZWFyX2ZyZWVjcHUoJnJxLT5yZC0+Y3B1ZGwsIHJxLT5jcHUpOwogfQogCkBAIC0xNzIzLDEwICsxNzEyLDIwIEBACiAgKi8KIHN0YXRpYyB2b2lkIHN3aXRjaGVkX3RvX2RsKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKLQlpZiAoZGxfdGltZV9iZWZvcmUocC0+ZGwuZGVhZGxpbmUsIHJxX2Nsb2NrKHJxKSkpCi0JCXNldHVwX25ld19kbF9lbnRpdHkoJnAtPmRsLCAmcC0+ZGwpOwogCi0JaWYgKHRhc2tfb25fcnFfcXVldWVkKHApICYmIHJxLT5jdXJyICE9IHApIHsKKwkvKiBJZiBwIGlzIG5vdCBxdWV1ZWQgd2Ugd2lsbCB1cGRhdGUgaXRzIHBhcmFtZXRlcnMgYXQgbmV4dCB3YWtldXAuICovCisJaWYgKCF0YXNrX29uX3JxX3F1ZXVlZChwKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBJZiBwIGlzIGJvb3N0ZWQgd2UgYWxyZWFkeSB1cGRhdGVkIGl0cyBwYXJhbXMgaW4KKwkgKiBydF9tdXRleF9zZXRwcmlvKCktPmVucXVldWVfdGFzayguLi4sIEVOUVVFVUVfUkVQTEVOSVNIKSwKKwkgKiBwJ3MgZGVhZGxpbmUgYmVpbmcgbm93IGFscmVhZHkgYWZ0ZXIgcnFfY2xvY2socnEpLgorCSAqLworCWlmIChkbF90aW1lX2JlZm9yZShwLT5kbC5kZWFkbGluZSwgcnFfY2xvY2socnEpKSkKKwkJc2V0dXBfbmV3X2RsX2VudGl0eSgmcC0+ZGwpOworCisJaWYgKHJxLT5jdXJyICE9IHApIHsKICNpZmRlZiBDT05GSUdfU01QCiAJCWlmICh0c2tfbnJfY3B1c19hbGxvd2VkKHApID4gMSAmJiBycS0+ZGwub3ZlcmxvYWRlZCkKIAkJCXF1ZXVlX3B1c2hfdGFza3MocnEpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL2RlYnVnLmMgYi9rZXJuZWwvc2NoZWQvZGVidWcuYwppbmRleCAyYTBhOTk5Li4xMzkzNTg4IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvZGVidWcuYworKysgYi9rZXJuZWwvc2NoZWQvZGVidWcuYwpAQCAtMzY5LDggKzM2OSwxMiBAQAogCiAjZGVmaW5lIFAoRikgXAogCVNFUV9wcmludGYobSwgIiAgLiUtMzBzOiAlbGxkXG4iLCAjRiwgKGxvbmcgbG9uZylGKQorI2RlZmluZSBQX1NDSEVEU1RBVChGKSBcCisJU0VRX3ByaW50ZihtLCAiICAuJS0zMHM6ICVsbGRcbiIsICNGLCAobG9uZyBsb25nKXNjaGVkc3RhdF92YWwoRikpCiAjZGVmaW5lIFBOKEYpIFwKIAlTRVFfcHJpbnRmKG0sICIgIC4lLTMwczogJWxsZC4lMDZsZFxuIiwgI0YsIFNQTElUX05TKChsb25nIGxvbmcpRikpCisjZGVmaW5lIFBOX1NDSEVEU1RBVChGKSBcCisJU0VRX3ByaW50ZihtLCAiICAuJS0zMHM6ICVsbGQuJTA2bGRcbiIsICNGLCBTUExJVF9OUygobG9uZyBsb25nKXNjaGVkc3RhdF92YWwoRikpKQogCiAJaWYgKCFzZSkKIAkJcmV0dXJuOwpAQCAtMzc4LDI2ICszODIsMjcgQEAKIAlQTihzZS0+ZXhlY19zdGFydCk7CiAJUE4oc2UtPnZydW50aW1lKTsKIAlQTihzZS0+c3VtX2V4ZWNfcnVudGltZSk7Ci0jaWZkZWYgQ09ORklHX1NDSEVEU1RBVFMKIAlpZiAoc2NoZWRzdGF0X2VuYWJsZWQoKSkgewotCQlQTihzZS0+c3RhdGlzdGljcy53YWl0X3N0YXJ0KTsKLQkJUE4oc2UtPnN0YXRpc3RpY3Muc2xlZXBfc3RhcnQpOwotCQlQTihzZS0+c3RhdGlzdGljcy5ibG9ja19zdGFydCk7Ci0JCVBOKHNlLT5zdGF0aXN0aWNzLnNsZWVwX21heCk7Ci0JCVBOKHNlLT5zdGF0aXN0aWNzLmJsb2NrX21heCk7Ci0JCVBOKHNlLT5zdGF0aXN0aWNzLmV4ZWNfbWF4KTsKLQkJUE4oc2UtPnN0YXRpc3RpY3Muc2xpY2VfbWF4KTsKLQkJUE4oc2UtPnN0YXRpc3RpY3Mud2FpdF9tYXgpOwotCQlQTihzZS0+c3RhdGlzdGljcy53YWl0X3N1bSk7Ci0JCVAoc2UtPnN0YXRpc3RpY3Mud2FpdF9jb3VudCk7CisJCVBOX1NDSEVEU1RBVChzZS0+c3RhdGlzdGljcy53YWl0X3N0YXJ0KTsKKwkJUE5fU0NIRURTVEFUKHNlLT5zdGF0aXN0aWNzLnNsZWVwX3N0YXJ0KTsKKwkJUE5fU0NIRURTVEFUKHNlLT5zdGF0aXN0aWNzLmJsb2NrX3N0YXJ0KTsKKwkJUE5fU0NIRURTVEFUKHNlLT5zdGF0aXN0aWNzLnNsZWVwX21heCk7CisJCVBOX1NDSEVEU1RBVChzZS0+c3RhdGlzdGljcy5ibG9ja19tYXgpOworCQlQTl9TQ0hFRFNUQVQoc2UtPnN0YXRpc3RpY3MuZXhlY19tYXgpOworCQlQTl9TQ0hFRFNUQVQoc2UtPnN0YXRpc3RpY3Muc2xpY2VfbWF4KTsKKwkJUE5fU0NIRURTVEFUKHNlLT5zdGF0aXN0aWNzLndhaXRfbWF4KTsKKwkJUE5fU0NIRURTVEFUKHNlLT5zdGF0aXN0aWNzLndhaXRfc3VtKTsKKwkJUF9TQ0hFRFNUQVQoc2UtPnN0YXRpc3RpY3Mud2FpdF9jb3VudCk7CiAJfQotI2VuZGlmCiAJUChzZS0+bG9hZC53ZWlnaHQpOwogI2lmZGVmIENPTkZJR19TTVAKIAlQKHNlLT5hdmcubG9hZF9hdmcpOwogCVAoc2UtPmF2Zy51dGlsX2F2Zyk7CiAjZW5kaWYKKworI3VuZGVmIFBOX1NDSEVEU1RBVAogI3VuZGVmIFBOCisjdW5kZWYgUF9TQ0hFRFNUQVQKICN1bmRlZiBQCiB9CiAjZW5kaWYKQEAgLTQyOSw5ICs0MzQsOSBAQAogCQlwLT5wcmlvKTsKIAogCVNFUV9wcmludGYobSwgIiU5TGQuJTA2bGQgJTlMZC4lMDZsZCAlOUxkLiUwNmxkIiwKLQkJU1BMSVRfTlMoc2NoZWRzdGF0X3ZhbChwLCBzZS5zdGF0aXN0aWNzLndhaXRfc3VtKSksCisJCVNQTElUX05TKHNjaGVkc3RhdF92YWxfb3JfemVybyhwLT5zZS5zdGF0aXN0aWNzLndhaXRfc3VtKSksCiAJCVNQTElUX05TKHAtPnNlLnN1bV9leGVjX3J1bnRpbWUpLAotCQlTUExJVF9OUyhzY2hlZHN0YXRfdmFsKHAsIHNlLnN0YXRpc3RpY3Muc3VtX3NsZWVwX3J1bnRpbWUpKSk7CisJCVNQTElUX05TKHNjaGVkc3RhdF92YWxfb3JfemVybyhwLT5zZS5zdGF0aXN0aWNzLnN1bV9zbGVlcF9ydW50aW1lKSkpOwogCiAjaWZkZWYgQ09ORklHX05VTUFfQkFMQU5DSU5HCiAJU0VRX3ByaW50ZihtLCAiICVkICVkIiwgdGFza19ub2RlKHApLCB0YXNrX251bWFfZ3JvdXBfaWQocCkpOwpAQCAtNjI2LDkgKzYzMSw3IEBACiAjdW5kZWYgUDY0CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19TQ0hFRFNUQVRTCi0jZGVmaW5lIFAobikgU0VRX3ByaW50ZihtLCAiICAuJS0zMHM6ICVkXG4iLCAjbiwgcnEtPm4pOwotCisjZGVmaW5lIFAobikgU0VRX3ByaW50ZihtLCAiICAuJS0zMHM6ICVkXG4iLCAjbiwgc2NoZWRzdGF0X3ZhbChycS0+bikpOwogCWlmIChzY2hlZHN0YXRfZW5hYmxlZCgpKSB7CiAJCVAoeWxkX2NvdW50KTsKIAkJUChzY2hlZF9jb3VudCk7CkBAIC02MzYsOSArNjM5LDggQEAKIAkJUCh0dHd1X2NvdW50KTsKIAkJUCh0dHd1X2xvY2FsKTsKIAl9Ci0KICN1bmRlZiBQCi0jZW5kaWYKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZzY2hlZF9kZWJ1Z19sb2NrLCBmbGFncyk7CiAJcHJpbnRfY2ZzX3N0YXRzKG0sIGNwdSk7CiAJcHJpbnRfcnRfc3RhdHMobSwgY3B1KTsKQEAgLTg2OCwxMCArODcwLDE0IEBACiAJU0VRX3ByaW50ZihtLCAiJS00NXM6JTIxTGRcbiIsICNGLCAobG9uZyBsb25nKUYpCiAjZGVmaW5lIFAoRikgXAogCVNFUV9wcmludGYobSwgIiUtNDVzOiUyMUxkXG4iLCAjRiwgKGxvbmcgbG9uZylwLT5GKQorI2RlZmluZSBQX1NDSEVEU1RBVChGKSBcCisJU0VRX3ByaW50ZihtLCAiJS00NXM6JTIxTGRcbiIsICNGLCAobG9uZyBsb25nKXNjaGVkc3RhdF92YWwocC0+RikpCiAjZGVmaW5lIF9fUE4oRikgXAogCVNFUV9wcmludGYobSwgIiUtNDVzOiUxNExkLiUwNmxkXG4iLCAjRiwgU1BMSVRfTlMoKGxvbmcgbG9uZylGKSkKICNkZWZpbmUgUE4oRikgXAogCVNFUV9wcmludGYobSwgIiUtNDVzOiUxNExkLiUwNmxkXG4iLCAjRiwgU1BMSVRfTlMoKGxvbmcgbG9uZylwLT5GKSkKKyNkZWZpbmUgUE5fU0NIRURTVEFUKEYpIFwKKwlTRVFfcHJpbnRmKG0sICIlLTQ1czolMTRMZC4lMDZsZFxuIiwgI0YsIFNQTElUX05TKChsb25nIGxvbmcpc2NoZWRzdGF0X3ZhbChwLT5GKSkpCiAKIAlQTihzZS5leGVjX3N0YXJ0KTsKIAlQTihzZS52cnVudGltZSk7CkBAIC04ODEsMzcgKzg4NywzNiBAQAogCiAJUChzZS5ucl9taWdyYXRpb25zKTsKIAotI2lmZGVmIENPTkZJR19TQ0hFRFNUQVRTCiAJaWYgKHNjaGVkc3RhdF9lbmFibGVkKCkpIHsKIAkJdTY0IGF2Z19hdG9tLCBhdmdfcGVyX2NwdTsKIAotCQlQTihzZS5zdGF0aXN0aWNzLnN1bV9zbGVlcF9ydW50aW1lKTsKLQkJUE4oc2Uuc3RhdGlzdGljcy53YWl0X3N0YXJ0KTsKLQkJUE4oc2Uuc3RhdGlzdGljcy5zbGVlcF9zdGFydCk7Ci0JCVBOKHNlLnN0YXRpc3RpY3MuYmxvY2tfc3RhcnQpOwotCQlQTihzZS5zdGF0aXN0aWNzLnNsZWVwX21heCk7Ci0JCVBOKHNlLnN0YXRpc3RpY3MuYmxvY2tfbWF4KTsKLQkJUE4oc2Uuc3RhdGlzdGljcy5leGVjX21heCk7Ci0JCVBOKHNlLnN0YXRpc3RpY3Muc2xpY2VfbWF4KTsKLQkJUE4oc2Uuc3RhdGlzdGljcy53YWl0X21heCk7Ci0JCVBOKHNlLnN0YXRpc3RpY3Mud2FpdF9zdW0pOwotCQlQKHNlLnN0YXRpc3RpY3Mud2FpdF9jb3VudCk7Ci0JCVBOKHNlLnN0YXRpc3RpY3MuaW93YWl0X3N1bSk7Ci0JCVAoc2Uuc3RhdGlzdGljcy5pb3dhaXRfY291bnQpOwotCQlQKHNlLnN0YXRpc3RpY3MubnJfbWlncmF0aW9uc19jb2xkKTsKLQkJUChzZS5zdGF0aXN0aWNzLm5yX2ZhaWxlZF9taWdyYXRpb25zX2FmZmluZSk7Ci0JCVAoc2Uuc3RhdGlzdGljcy5ucl9mYWlsZWRfbWlncmF0aW9uc19ydW5uaW5nKTsKLQkJUChzZS5zdGF0aXN0aWNzLm5yX2ZhaWxlZF9taWdyYXRpb25zX2hvdCk7Ci0JCVAoc2Uuc3RhdGlzdGljcy5ucl9mb3JjZWRfbWlncmF0aW9ucyk7Ci0JCVAoc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzKTsKLQkJUChzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfc3luYyk7Ci0JCVAoc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX21pZ3JhdGUpOwotCQlQKHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19sb2NhbCk7Ci0JCVAoc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX3JlbW90ZSk7Ci0JCVAoc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX2FmZmluZSk7Ci0JCVAoc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX2FmZmluZV9hdHRlbXB0cyk7Ci0JCVAoc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX3Bhc3NpdmUpOwotCQlQKHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19pZGxlKTsKKwkJUE5fU0NIRURTVEFUKHNlLnN0YXRpc3RpY3Muc3VtX3NsZWVwX3J1bnRpbWUpOworCQlQTl9TQ0hFRFNUQVQoc2Uuc3RhdGlzdGljcy53YWl0X3N0YXJ0KTsKKwkJUE5fU0NIRURTVEFUKHNlLnN0YXRpc3RpY3Muc2xlZXBfc3RhcnQpOworCQlQTl9TQ0hFRFNUQVQoc2Uuc3RhdGlzdGljcy5ibG9ja19zdGFydCk7CisJCVBOX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLnNsZWVwX21heCk7CisJCVBOX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLmJsb2NrX21heCk7CisJCVBOX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLmV4ZWNfbWF4KTsKKwkJUE5fU0NIRURTVEFUKHNlLnN0YXRpc3RpY3Muc2xpY2VfbWF4KTsKKwkJUE5fU0NIRURTVEFUKHNlLnN0YXRpc3RpY3Mud2FpdF9tYXgpOworCQlQTl9TQ0hFRFNUQVQoc2Uuc3RhdGlzdGljcy53YWl0X3N1bSk7CisJCVBfU0NIRURTVEFUKHNlLnN0YXRpc3RpY3Mud2FpdF9jb3VudCk7CisJCVBOX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLmlvd2FpdF9zdW0pOworCQlQX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLmlvd2FpdF9jb3VudCk7CisJCVBfU0NIRURTVEFUKHNlLnN0YXRpc3RpY3MubnJfbWlncmF0aW9uc19jb2xkKTsKKwkJUF9TQ0hFRFNUQVQoc2Uuc3RhdGlzdGljcy5ucl9mYWlsZWRfbWlncmF0aW9uc19hZmZpbmUpOworCQlQX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLm5yX2ZhaWxlZF9taWdyYXRpb25zX3J1bm5pbmcpOworCQlQX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLm5yX2ZhaWxlZF9taWdyYXRpb25zX2hvdCk7CisJCVBfU0NIRURTVEFUKHNlLnN0YXRpc3RpY3MubnJfZm9yY2VkX21pZ3JhdGlvbnMpOworCQlQX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHMpOworCQlQX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfc3luYyk7CisJCVBfU0NIRURTVEFUKHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19taWdyYXRlKTsKKwkJUF9TQ0hFRFNUQVQoc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX2xvY2FsKTsKKwkJUF9TQ0hFRFNUQVQoc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX3JlbW90ZSk7CisJCVBfU0NIRURTVEFUKHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19hZmZpbmUpOworCQlQX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfYWZmaW5lX2F0dGVtcHRzKTsKKwkJUF9TQ0hFRFNUQVQoc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX3Bhc3NpdmUpOworCQlQX1NDSEVEU1RBVChzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfaWRsZSk7CiAKIAkJYXZnX2F0b20gPSBwLT5zZS5zdW1fZXhlY19ydW50aW1lOwogCQlpZiAobnJfc3dpdGNoZXMpCkBAIC05MzAsNyArOTM1LDcgQEAKIAkJX19QTihhdmdfYXRvbSk7CiAJCV9fUE4oYXZnX3Blcl9jcHUpOwogCX0KLSNlbmRpZgorCiAJX19QKG5yX3N3aXRjaGVzKTsKIAlTRVFfcHJpbnRmKG0sICIlLTQ1czolMjFMZFxuIiwKIAkJICAgIm5yX3ZvbHVudGFyeV9zd2l0Y2hlcyIsIChsb25nIGxvbmcpcC0+bnZjc3cpOwpAQCAtOTQ3LDggKzk1MiwxMCBAQAogI2VuZGlmCiAJUChwb2xpY3kpOwogCVAocHJpbyk7CisjdW5kZWYgUE5fU0NIRURTVEFUCiAjdW5kZWYgUE4KICN1bmRlZiBfX1BOCisjdW5kZWYgUF9TQ0hFRFNUQVQKICN1bmRlZiBQCiAjdW5kZWYgX19QCiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9mYWlyLmMgYi9rZXJuZWwvc2NoZWQvZmFpci5jCmluZGV4IDAzOWRlMzQuLjUwMmU5NWEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9mYWlyLmMKKysrIGIva2VybmVsL3NjaGVkL2ZhaXIuYwpAQCAtMTE0LDYgKzExNCwxMiBAQAogdW5zaWduZWQgaW50IHN5c2N0bF9zY2hlZF9jZnNfYmFuZHdpZHRoX3NsaWNlID0gNTAwMFVMOwogI2VuZGlmCiAKKy8qCisgKiBUaGUgbWFyZ2luIHVzZWQgd2hlbiBjb21wYXJpbmcgdXRpbGl6YXRpb24gd2l0aCBDUFUgY2FwYWNpdHk6CisgKiB1dGlsICogMTAyNCA8IGNhcGFjaXR5ICogbWFyZ2luCisgKi8KK3Vuc2lnbmVkIGludCBjYXBhY2l0eV9tYXJnaW4gPSAxMjgwOyAvKiB+MjAlICovCisKIHN0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfbG9hZF9hZGQoc3RydWN0IGxvYWRfd2VpZ2h0ICpsdywgdW5zaWduZWQgbG9uZyBpbmMpCiB7CiAJbHctPndlaWdodCArPSBpbmM7CkBAIC0yNTYsOSArMjYyLDcgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2tfb2Yoc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpCiB7Ci0jaWZkZWYgQ09ORklHX1NDSEVEX0RFQlVHCi0JV0FSTl9PTl9PTkNFKCFlbnRpdHlfaXNfdGFzayhzZSkpOwotI2VuZGlmCisJU0NIRURfV0FSTl9PTighZW50aXR5X2lzX3Rhc2soc2UpKTsKIAlyZXR1cm4gY29udGFpbmVyX29mKHNlLCBzdHJ1Y3QgdGFza19zdHJ1Y3QsIHNlKTsKIH0KIApAQCAtNDU2LDE3ICs0NjAsMjMgQEAKIAogc3RhdGljIHZvaWQgdXBkYXRlX21pbl92cnVudGltZShzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEpCiB7CisJc3RydWN0IHNjaGVkX2VudGl0eSAqY3VyciA9IGNmc19ycS0+Y3VycjsKKwogCXU2NCB2cnVudGltZSA9IGNmc19ycS0+bWluX3ZydW50aW1lOwogCi0JaWYgKGNmc19ycS0+Y3VycikKLQkJdnJ1bnRpbWUgPSBjZnNfcnEtPmN1cnItPnZydW50aW1lOworCWlmIChjdXJyKSB7CisJCWlmIChjdXJyLT5vbl9ycSkKKwkJCXZydW50aW1lID0gY3Vyci0+dnJ1bnRpbWU7CisJCWVsc2UKKwkJCWN1cnIgPSBOVUxMOworCX0KIAogCWlmIChjZnNfcnEtPnJiX2xlZnRtb3N0KSB7CiAJCXN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlID0gcmJfZW50cnkoY2ZzX3JxLT5yYl9sZWZ0bW9zdCwKIAkJCQkJCSAgIHN0cnVjdCBzY2hlZF9lbnRpdHksCiAJCQkJCQkgICBydW5fbm9kZSk7CiAKLQkJaWYgKCFjZnNfcnEtPmN1cnIpCisJCWlmICghY3VycikKIAkJCXZydW50aW1lID0gc2UtPnZydW50aW1lOwogCQllbHNlCiAJCQl2cnVudGltZSA9IG1pbl92cnVudGltZSh2cnVudGltZSwgc2UtPnZydW50aW1lKTsKQEAgLTY1Niw3ICs2NjYsNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX1NNUAotc3RhdGljIGludCBzZWxlY3RfaWRsZV9zaWJsaW5nKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IGNwdSk7CitzdGF0aWMgaW50IHNlbGVjdF9pZGxlX3NpYmxpbmcoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgcHJldl9jcHUsIGludCBjcHUpOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgdGFza19oX2xvYWQoc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKIAogLyoKQEAgLTcyNiw3ICs3MzYsNiBAQAogCXN0cnVjdCBzY2hlZF9hdmcgKnNhID0gJnNlLT5hdmc7CiAJbG9uZyBjYXAgPSAobG9uZykoU0NIRURfQ0FQQUNJVFlfU0NBTEUgLSBjZnNfcnEtPmF2Zy51dGlsX2F2ZykgLyAyOwogCXU2NCBub3cgPSBjZnNfcnFfY2xvY2tfdGFzayhjZnNfcnEpOwotCWludCB0Z191cGRhdGU7CiAKIAlpZiAoY2FwID4gMCkgewogCQlpZiAoY2ZzX3JxLT5hdmcudXRpbF9hdmcgIT0gMCkgewpAQCAtNzU5LDEwICs3NjgsOSBAQAogCQl9CiAJfQogCi0JdGdfdXBkYXRlID0gdXBkYXRlX2Nmc19ycV9sb2FkX2F2Zyhub3csIGNmc19ycSwgZmFsc2UpOworCXVwZGF0ZV9jZnNfcnFfbG9hZF9hdmcobm93LCBjZnNfcnEsIGZhbHNlKTsKIAlhdHRhY2hfZW50aXR5X2xvYWRfYXZnKGNmc19ycSwgc2UpOwotCWlmICh0Z191cGRhdGUpCi0JCXVwZGF0ZV90Z19sb2FkX2F2ZyhjZnNfcnEsIGZhbHNlKTsKKwl1cGRhdGVfdGdfbG9hZF9hdmcoY2ZzX3JxLCBmYWxzZSk7CiB9CiAKICNlbHNlIC8qICFDT05GSUdfU01QICovCkBAIC03OTksNyArODA3LDcgQEAKIAkJICAgICAgbWF4KGRlbHRhX2V4ZWMsIGN1cnItPnN0YXRpc3RpY3MuZXhlY19tYXgpKTsKIAogCWN1cnItPnN1bV9leGVjX3J1bnRpbWUgKz0gZGVsdGFfZXhlYzsKLQlzY2hlZHN0YXRfYWRkKGNmc19ycSwgZXhlY19jbG9jaywgZGVsdGFfZXhlYyk7CisJc2NoZWRzdGF0X2FkZChjZnNfcnEtPmV4ZWNfY2xvY2ssIGRlbHRhX2V4ZWMpOwogCiAJY3Vyci0+dnJ1bnRpbWUgKz0gY2FsY19kZWx0YV9mYWlyKGRlbHRhX2V4ZWMsIGN1cnIpOwogCXVwZGF0ZV9taW5fdnJ1bnRpbWUoY2ZzX3JxKTsKQEAgLTgyMCwyNiArODI4LDM0IEBACiAJdXBkYXRlX2N1cnIoY2ZzX3JxX29mKCZycS0+Y3Vyci0+c2UpKTsKIH0KIAotI2lmZGVmIENPTkZJR19TQ0hFRFNUQVRTCiBzdGF0aWMgaW5saW5lIHZvaWQKIHVwZGF0ZV9zdGF0c193YWl0X3N0YXJ0KHN0cnVjdCBjZnNfcnEgKmNmc19ycSwgc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpCiB7Ci0JdTY0IHdhaXRfc3RhcnQgPSBycV9jbG9jayhycV9vZihjZnNfcnEpKTsKKwl1NjQgd2FpdF9zdGFydCwgcHJldl93YWl0X3N0YXJ0OworCisJaWYgKCFzY2hlZHN0YXRfZW5hYmxlZCgpKQorCQlyZXR1cm47CisKKwl3YWl0X3N0YXJ0ID0gcnFfY2xvY2socnFfb2YoY2ZzX3JxKSk7CisJcHJldl93YWl0X3N0YXJ0ID0gc2NoZWRzdGF0X3ZhbChzZS0+c3RhdGlzdGljcy53YWl0X3N0YXJ0KTsKIAogCWlmIChlbnRpdHlfaXNfdGFzayhzZSkgJiYgdGFza19vbl9ycV9taWdyYXRpbmcodGFza19vZihzZSkpICYmCi0JICAgIGxpa2VseSh3YWl0X3N0YXJ0ID4gc2UtPnN0YXRpc3RpY3Mud2FpdF9zdGFydCkpCi0JCXdhaXRfc3RhcnQgLT0gc2UtPnN0YXRpc3RpY3Mud2FpdF9zdGFydDsKKwkgICAgbGlrZWx5KHdhaXRfc3RhcnQgPiBwcmV2X3dhaXRfc3RhcnQpKQorCQl3YWl0X3N0YXJ0IC09IHByZXZfd2FpdF9zdGFydDsKIAotCXNlLT5zdGF0aXN0aWNzLndhaXRfc3RhcnQgPSB3YWl0X3N0YXJ0OworCXNjaGVkc3RhdF9zZXQoc2UtPnN0YXRpc3RpY3Mud2FpdF9zdGFydCwgd2FpdF9zdGFydCk7CiB9CiAKLXN0YXRpYyB2b2lkCitzdGF0aWMgaW5saW5lIHZvaWQKIHVwZGF0ZV9zdGF0c193YWl0X2VuZChzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEsIHN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKIAl1NjQgZGVsdGE7CiAKLQlkZWx0YSA9IHJxX2Nsb2NrKHJxX29mKGNmc19ycSkpIC0gc2UtPnN0YXRpc3RpY3Mud2FpdF9zdGFydDsKKwlpZiAoIXNjaGVkc3RhdF9lbmFibGVkKCkpCisJCXJldHVybjsKKworCWRlbHRhID0gcnFfY2xvY2socnFfb2YoY2ZzX3JxKSkgLSBzY2hlZHN0YXRfdmFsKHNlLT5zdGF0aXN0aWNzLndhaXRfc3RhcnQpOwogCiAJaWYgKGVudGl0eV9pc190YXNrKHNlKSkgewogCQlwID0gdGFza19vZihzZSk7CkBAIC04NDksMzUgKzg2NSwxMTQgQEAKIAkJCSAqIHRpbWUgc3RhbXAgY2FuIGJlIGFkanVzdGVkIHRvIGFjY3VtdWxhdGUgd2FpdCB0aW1lCiAJCQkgKiBwcmlvciB0byBtaWdyYXRpb24uCiAJCQkgKi8KLQkJCXNlLT5zdGF0aXN0aWNzLndhaXRfc3RhcnQgPSBkZWx0YTsKKwkJCXNjaGVkc3RhdF9zZXQoc2UtPnN0YXRpc3RpY3Mud2FpdF9zdGFydCwgZGVsdGEpOwogCQkJcmV0dXJuOwogCQl9CiAJCXRyYWNlX3NjaGVkX3N0YXRfd2FpdChwLCBkZWx0YSk7CiAJfQogCi0Jc2UtPnN0YXRpc3RpY3Mud2FpdF9tYXggPSBtYXgoc2UtPnN0YXRpc3RpY3Mud2FpdF9tYXgsIGRlbHRhKTsKLQlzZS0+c3RhdGlzdGljcy53YWl0X2NvdW50Kys7Ci0Jc2UtPnN0YXRpc3RpY3Mud2FpdF9zdW0gKz0gZGVsdGE7Ci0Jc2UtPnN0YXRpc3RpY3Mud2FpdF9zdGFydCA9IDA7CisJc2NoZWRzdGF0X3NldChzZS0+c3RhdGlzdGljcy53YWl0X21heCwKKwkJICAgICAgbWF4KHNjaGVkc3RhdF92YWwoc2UtPnN0YXRpc3RpY3Mud2FpdF9tYXgpLCBkZWx0YSkpOworCXNjaGVkc3RhdF9pbmMoc2UtPnN0YXRpc3RpY3Mud2FpdF9jb3VudCk7CisJc2NoZWRzdGF0X2FkZChzZS0+c3RhdGlzdGljcy53YWl0X3N1bSwgZGVsdGEpOworCXNjaGVkc3RhdF9zZXQoc2UtPnN0YXRpc3RpY3Mud2FpdF9zdGFydCwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAordXBkYXRlX3N0YXRzX2VucXVldWVfc2xlZXBlcihzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEsIHN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gTlVMTDsKKwl1NjQgc2xlZXBfc3RhcnQsIGJsb2NrX3N0YXJ0OworCisJaWYgKCFzY2hlZHN0YXRfZW5hYmxlZCgpKQorCQlyZXR1cm47CisKKwlzbGVlcF9zdGFydCA9IHNjaGVkc3RhdF92YWwoc2UtPnN0YXRpc3RpY3Muc2xlZXBfc3RhcnQpOworCWJsb2NrX3N0YXJ0ID0gc2NoZWRzdGF0X3ZhbChzZS0+c3RhdGlzdGljcy5ibG9ja19zdGFydCk7CisKKwlpZiAoZW50aXR5X2lzX3Rhc2soc2UpKQorCQl0c2sgPSB0YXNrX29mKHNlKTsKKworCWlmIChzbGVlcF9zdGFydCkgeworCQl1NjQgZGVsdGEgPSBycV9jbG9jayhycV9vZihjZnNfcnEpKSAtIHNsZWVwX3N0YXJ0OworCisJCWlmICgoczY0KWRlbHRhIDwgMCkKKwkJCWRlbHRhID0gMDsKKworCQlpZiAodW5saWtlbHkoZGVsdGEgPiBzY2hlZHN0YXRfdmFsKHNlLT5zdGF0aXN0aWNzLnNsZWVwX21heCkpKQorCQkJc2NoZWRzdGF0X3NldChzZS0+c3RhdGlzdGljcy5zbGVlcF9tYXgsIGRlbHRhKTsKKworCQlzY2hlZHN0YXRfc2V0KHNlLT5zdGF0aXN0aWNzLnNsZWVwX3N0YXJ0LCAwKTsKKwkJc2NoZWRzdGF0X2FkZChzZS0+c3RhdGlzdGljcy5zdW1fc2xlZXBfcnVudGltZSwgZGVsdGEpOworCisJCWlmICh0c2spIHsKKwkJCWFjY291bnRfc2NoZWR1bGVyX2xhdGVuY3kodHNrLCBkZWx0YSA+PiAxMCwgMSk7CisJCQl0cmFjZV9zY2hlZF9zdGF0X3NsZWVwKHRzaywgZGVsdGEpOworCQl9CisJfQorCWlmIChibG9ja19zdGFydCkgeworCQl1NjQgZGVsdGEgPSBycV9jbG9jayhycV9vZihjZnNfcnEpKSAtIGJsb2NrX3N0YXJ0OworCisJCWlmICgoczY0KWRlbHRhIDwgMCkKKwkJCWRlbHRhID0gMDsKKworCQlpZiAodW5saWtlbHkoZGVsdGEgPiBzY2hlZHN0YXRfdmFsKHNlLT5zdGF0aXN0aWNzLmJsb2NrX21heCkpKQorCQkJc2NoZWRzdGF0X3NldChzZS0+c3RhdGlzdGljcy5ibG9ja19tYXgsIGRlbHRhKTsKKworCQlzY2hlZHN0YXRfc2V0KHNlLT5zdGF0aXN0aWNzLmJsb2NrX3N0YXJ0LCAwKTsKKwkJc2NoZWRzdGF0X2FkZChzZS0+c3RhdGlzdGljcy5zdW1fc2xlZXBfcnVudGltZSwgZGVsdGEpOworCisJCWlmICh0c2spIHsKKwkJCWlmICh0c2stPmluX2lvd2FpdCkgeworCQkJCXNjaGVkc3RhdF9hZGQoc2UtPnN0YXRpc3RpY3MuaW93YWl0X3N1bSwgZGVsdGEpOworCQkJCXNjaGVkc3RhdF9pbmMoc2UtPnN0YXRpc3RpY3MuaW93YWl0X2NvdW50KTsKKwkJCQl0cmFjZV9zY2hlZF9zdGF0X2lvd2FpdCh0c2ssIGRlbHRhKTsKKwkJCX0KKworCQkJdHJhY2Vfc2NoZWRfc3RhdF9ibG9ja2VkKHRzaywgZGVsdGEpOworCisJCQkvKgorCQkJICogQmxvY2tpbmcgdGltZSBpcyBpbiB1bml0cyBvZiBuYW5vc2Vjcywgc28gc2hpZnQgYnkKKwkJCSAqIDIwIHRvIGdldCBhIG1pbGxpc2Vjb25kcy1yYW5nZSBlc3RpbWF0aW9uIG9mIHRoZQorCQkJICogYW1vdW50IG9mIHRpbWUgdGhhdCB0aGUgdGFzayBzcGVudCBzbGVlcGluZzoKKwkJCSAqLworCQkJaWYgKHVubGlrZWx5KHByb2Zfb24gPT0gU0xFRVBfUFJPRklMSU5HKSkgeworCQkJCXByb2ZpbGVfaGl0cyhTTEVFUF9QUk9GSUxJTkcsCisJCQkJCQkodm9pZCAqKWdldF93Y2hhbih0c2spLAorCQkJCQkJZGVsdGEgPj4gMjApOworCQkJfQorCQkJYWNjb3VudF9zY2hlZHVsZXJfbGF0ZW5jeSh0c2ssIGRlbHRhID4+IDEwLCAwKTsKKwkJfQorCX0KIH0KIAogLyoKICAqIFRhc2sgaXMgYmVpbmcgZW5xdWV1ZWQgLSB1cGRhdGUgc3RhdHM6CiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZAotdXBkYXRlX3N0YXRzX2VucXVldWUoc3RydWN0IGNmc19ycSAqY2ZzX3JxLCBzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSkKK3VwZGF0ZV9zdGF0c19lbnF1ZXVlKHN0cnVjdCBjZnNfcnEgKmNmc19ycSwgc3RydWN0IHNjaGVkX2VudGl0eSAqc2UsIGludCBmbGFncykKIHsKKwlpZiAoIXNjaGVkc3RhdF9lbmFibGVkKCkpCisJCXJldHVybjsKKwogCS8qCiAJICogQXJlIHdlIGVucXVldWVpbmcgYSB3YWl0aW5nIHRhc2s/IChmb3IgY3VycmVudCB0YXNrcwogCSAqIGEgZGVxdWV1ZS9lbnF1ZXVlIGV2ZW50IGlzIGEgTk9QKQogCSAqLwogCWlmIChzZSAhPSBjZnNfcnEtPmN1cnIpCiAJCXVwZGF0ZV9zdGF0c193YWl0X3N0YXJ0KGNmc19ycSwgc2UpOworCisJaWYgKGZsYWdzICYgRU5RVUVVRV9XQUtFVVApCisJCXVwZGF0ZV9zdGF0c19lbnF1ZXVlX3NsZWVwZXIoY2ZzX3JxLCBzZSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogdXBkYXRlX3N0YXRzX2RlcXVldWUoc3RydWN0IGNmc19ycSAqY2ZzX3JxLCBzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSwgaW50IGZsYWdzKQogeworCisJaWYgKCFzY2hlZHN0YXRfZW5hYmxlZCgpKQorCQlyZXR1cm47CisKIAkvKgogCSAqIE1hcmsgdGhlIGVuZCBvZiB0aGUgd2FpdCBwZXJpb2QgaWYgZGVxdWV1ZWluZyBhCiAJICogd2FpdGluZyB0YXNrOgpAQCAtODg1LDM5ICs5ODAsMTcgQEAKIAlpZiAoc2UgIT0gY2ZzX3JxLT5jdXJyKQogCQl1cGRhdGVfc3RhdHNfd2FpdF9lbmQoY2ZzX3JxLCBzZSk7CiAKLQlpZiAoZmxhZ3MgJiBERVFVRVVFX1NMRUVQKSB7Ci0JCWlmIChlbnRpdHlfaXNfdGFzayhzZSkpIHsKLQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gdGFza19vZihzZSk7CisJaWYgKChmbGFncyAmIERFUVVFVUVfU0xFRVApICYmIGVudGl0eV9pc190YXNrKHNlKSkgeworCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IHRhc2tfb2Yoc2UpOwogCi0JCQlpZiAodHNrLT5zdGF0ZSAmIFRBU0tfSU5URVJSVVBUSUJMRSkKLQkJCQlzZS0+c3RhdGlzdGljcy5zbGVlcF9zdGFydCA9IHJxX2Nsb2NrKHJxX29mKGNmc19ycSkpOwotCQkJaWYgKHRzay0+c3RhdGUgJiBUQVNLX1VOSU5URVJSVVBUSUJMRSkKLQkJCQlzZS0+c3RhdGlzdGljcy5ibG9ja19zdGFydCA9IHJxX2Nsb2NrKHJxX29mKGNmc19ycSkpOwotCQl9CisJCWlmICh0c2stPnN0YXRlICYgVEFTS19JTlRFUlJVUFRJQkxFKQorCQkJc2NoZWRzdGF0X3NldChzZS0+c3RhdGlzdGljcy5zbGVlcF9zdGFydCwKKwkJCQkgICAgICBycV9jbG9jayhycV9vZihjZnNfcnEpKSk7CisJCWlmICh0c2stPnN0YXRlICYgVEFTS19VTklOVEVSUlVQVElCTEUpCisJCQlzY2hlZHN0YXRfc2V0KHNlLT5zdGF0aXN0aWNzLmJsb2NrX3N0YXJ0LAorCQkJCSAgICAgIHJxX2Nsb2NrKHJxX29mKGNmc19ycSkpKTsKIAl9Ci0KIH0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQKLXVwZGF0ZV9zdGF0c193YWl0X3N0YXJ0KHN0cnVjdCBjZnNfcnEgKmNmc19ycSwgc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotdXBkYXRlX3N0YXRzX3dhaXRfZW5kKHN0cnVjdCBjZnNfcnEgKmNmc19ycSwgc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotdXBkYXRlX3N0YXRzX2VucXVldWUoc3RydWN0IGNmc19ycSAqY2ZzX3JxLCBzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSkKLXsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi11cGRhdGVfc3RhdHNfZGVxdWV1ZShzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEsIHN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlLCBpbnQgZmxhZ3MpCi17Ci19Ci0jZW5kaWYKIAogLyoKICAqIFdlIGFyZSBwaWNraW5nIGEgbmV3IGN1cnJlbnQgdGFzayAtIHVwZGF0ZSBpdHMgc3RhdHM6CkBAIC0xNTEzLDggKzE1ODYsMTYgQEAKIAkgKiBPbmUgaWRsZSBDUFUgcGVyIG5vZGUgaXMgZXZhbHVhdGVkIGZvciBhIHRhc2sgbnVtYSBtb3ZlLgogCSAqIENhbGwgc2VsZWN0X2lkbGVfc2libGluZyB0byBtYXliZSBmaW5kIGEgYmV0dGVyIG9uZS4KIAkgKi8KLQlpZiAoIWN1cikKLQkJZW52LT5kc3RfY3B1ID0gc2VsZWN0X2lkbGVfc2libGluZyhlbnYtPnAsIGVudi0+ZHN0X2NwdSk7CisJaWYgKCFjdXIpIHsKKwkJLyoKKwkJICogc2VsZWN0X2lkbGVfc2libGluZ3MoKSB1c2VzIGFuIHBlci1jcHUgY3B1bWFzayB0aGF0CisJCSAqIGNhbiBiZSB1c2VkIGZyb20gSVJRIGNvbnRleHQuCisJCSAqLworCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQllbnYtPmRzdF9jcHUgPSBzZWxlY3RfaWRsZV9zaWJsaW5nKGVudi0+cCwgZW52LT5zcmNfY3B1LAorCQkJCQkJICAgZW52LT5kc3RfY3B1KTsKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOworCX0KIAogYXNzaWduOgogCXRhc2tfbnVtYV9hc3NpZ24oZW52LCBjdXIsIGltcCk7CkBAIC0yMjkyLDcgKzIzNzMsNyBAQAogCXVuc2lnbmVkIGxvbmcgbnJfcHRlX3VwZGF0ZXMgPSAwOwogCWxvbmcgcGFnZXMsIHZpcnRwYWdlczsKIAotCVdBUk5fT05fT05DRShwICE9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdGFza19zdHJ1Y3QsIG51bWFfd29yaykpOworCVNDSEVEX1dBUk5fT04ocCAhPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHRhc2tfc3RydWN0LCBudW1hX3dvcmspKTsKIAogCXdvcmstPm5leHQgPSB3b3JrOyAvKiBwcm90ZWN0IGFnYWluc3QgZG91YmxlIGFkZCAqLwogCS8qCkBAIC0yODAzLDkgKzI4ODQsMjEgQEAKIH0KIAogI2lmZGVmIENPTkZJR19GQUlSX0dST1VQX1NDSEVECi0vKgotICogVXBkYXRpbmcgdGcncyBsb2FkX2F2ZyBpcyBuZWNlc3NhcnkgYmVmb3JlIHVwZGF0ZV9jZnNfc2hhcmUgKHdoaWNoIGlzIGRvbmUpCi0gKiBhbmQgZWZmZWN0aXZlX2xvYWQgKHdoaWNoIGlzIG5vdCBkb25lIGJlY2F1c2UgaXQgaXMgdG9vIGNvc3RseSkuCisvKioKKyAqIHVwZGF0ZV90Z19sb2FkX2F2ZyAtIHVwZGF0ZSB0aGUgdGcncyBsb2FkIGF2ZworICogQGNmc19ycTogdGhlIGNmc19ycSB3aG9zZSBhdmcgY2hhbmdlZAorICogQGZvcmNlOiB1cGRhdGUgcmVnYXJkbGVzcyBvZiBob3cgc21hbGwgdGhlIGRpZmZlcmVuY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uICdlbnN1cmVzJzogdGctPmxvYWRfYXZnIDo9IFxTdW0gdGctPmNmc19ycVtdLT5hdmcubG9hZC4KKyAqIEhvd2V2ZXIsIGJlY2F1c2UgdGctPmxvYWRfYXZnIGlzIGEgZ2xvYmFsIHZhbHVlIHRoZXJlIGFyZSBwZXJmb3JtYW5jZQorICogY29uc2lkZXJhdGlvbnMuCisgKgorICogSW4gb3JkZXIgdG8gYXZvaWQgaGF2aW5nIHRvIGxvb2sgYXQgdGhlIG90aGVyIGNmc19ycSdzLCB3ZSB1c2UgYQorICogZGlmZmVyZW50aWFsIHVwZGF0ZSB3aGVyZSB3ZSBzdG9yZSB0aGUgbGFzdCB2YWx1ZSB3ZSBwcm9wYWdhdGVkLiBUaGlzIGluCisgKiB0dXJuIGFsbG93cyBza2lwcGluZyB1cGRhdGVzIGlmIHRoZSBkaWZmZXJlbnRpYWwgaXMgJ3NtYWxsJy4KKyAqCisgKiBVcGRhdGluZyB0ZydzIGxvYWRfYXZnIGlzIG5lY2Vzc2FyeSBiZWZvcmUgdXBkYXRlX2Nmc19zaGFyZSgpICh3aGljaCBpcworICogZG9uZSkgYW5kIGVmZmVjdGl2ZV9sb2FkKCkgKHdoaWNoIGlzIG5vdCBkb25lIGJlY2F1c2UgaXQgaXMgdG9vIGNvc3RseSkuCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfdGdfbG9hZF9hdmcoc3RydWN0IGNmc19ycSAqY2ZzX3JxLCBpbnQgZm9yY2UpCiB7CkBAIC0yODc1LDEyICsyOTY4LDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGNmc19ycV91dGlsX2NoYW5nZShzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEpCiB7Ci0Jc3RydWN0IHJxICpycSA9IHJxX29mKGNmc19ycSk7Ci0JaW50IGNwdSA9IGNwdV9vZihycSk7Ci0KLQlpZiAoY3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSAmJiAmcnEtPmNmcyA9PSBjZnNfcnEpIHsKLQkJdW5zaWduZWQgbG9uZyBtYXggPSBycS0+Y3B1X2NhcGFjaXR5X29yaWc7Ci0KKwlpZiAoJnRoaXNfcnEoKS0+Y2ZzID09IGNmc19ycSkgewogCQkvKgogCQkgKiBUaGVyZSBhcmUgYSBmZXcgYm91bmRhcnkgY2FzZXMgdGhpcyBtaWdodCBtaXNzIGJ1dCBpdCBzaG91bGQKIAkJICogZ2V0IGNhbGxlZCBvZnRlbiBlbm91Z2ggdGhhdCB0aGF0IHNob3VsZCAoaG9wZWZ1bGx5KSBub3QgYmUKQEAgLTI4OTcsOCArMjk4NSw3IEBACiAJCSAqCiAJCSAqIFNlZSBjcHVfdXRpbCgpLgogCQkgKi8KLQkJY3B1ZnJlcV91cGRhdGVfdXRpbChycV9jbG9jayhycSksCi0JCQkJICAgIG1pbihjZnNfcnEtPmF2Zy51dGlsX2F2ZywgbWF4KSwgbWF4KTsKKwkJY3B1ZnJlcV91cGRhdGVfdXRpbChycV9vZihjZnNfcnEpLCAwKTsKIAl9CiB9CiAKQEAgLTI5MzEsMTAgKzMwMTgsMTAgQEAKICAqCiAgKiBjZnNfcnEtPmF2ZyBpcyB1c2VkIGZvciB0YXNrX2hfbG9hZCgpIGFuZCB1cGRhdGVfY2ZzX3NoYXJlKCkgZm9yIGV4YW1wbGUuCiAgKgotICogUmV0dXJucyB0cnVlIGlmIHRoZSBsb2FkIGRlY2F5ZWQgb3Igd2UgcmVtb3ZlZCB1dGlsaXphdGlvbi4gSXQgaXMgZXhwZWN0ZWQKLSAqIHRoYXQgb25lIGNhbGxzIHVwZGF0ZV90Z19sb2FkX2F2ZygpIG9uIHRoaXMgY29uZGl0aW9uLCBidXQgYWZ0ZXIgeW91J3ZlCi0gKiBtb2RpZmllZCB0aGUgY2ZzX3JxIGF2ZyAoYXR0YWNoL2RldGFjaCksIHN1Y2ggdGhhdCB3ZSBwcm9wYWdhdGUgdGhlIG5ldwotICogYXZnIHVwLgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBsb2FkIGRlY2F5ZWQgb3Igd2UgcmVtb3ZlZCBsb2FkLgorICoKKyAqIFNpbmNlIGJvdGggdGhlc2UgY29uZGl0aW9ucyBpbmRpY2F0ZSBhIGNoYW5nZWQgY2ZzX3JxLT5hdmcubG9hZCB3ZSBzaG91bGQKKyAqIGNhbGwgdXBkYXRlX3RnX2xvYWRfYXZnKCkgd2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZS4KICAqLwogc3RhdGljIGlubGluZSBpbnQKIHVwZGF0ZV9jZnNfcnFfbG9hZF9hdmcodTY0IG5vdywgc3RydWN0IGNmc19ycSAqY2ZzX3JxLCBib29sIHVwZGF0ZV9mcmVxKQpAQCAtMzE1OSwxMCArMzI0Niw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfbG9hZF9hdmcoc3RydWN0IHNjaGVkX2VudGl0eSAqc2UsIGludCBub3RfdXNlZCkKIHsKLQlzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEgPSBjZnNfcnFfb2Yoc2UpOwotCXN0cnVjdCBycSAqcnEgPSBycV9vZihjZnNfcnEpOwotCi0JY3B1ZnJlcV90cmlnZ2VyX3VwZGF0ZShycV9jbG9jayhycSkpOworCWNwdWZyZXFfdXBkYXRlX3V0aWwocnFfb2YoY2ZzX3JxX29mKHNlKSksIDApOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTMxODMsNjggKzMyNjcsNiBAQAogCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCi1zdGF0aWMgdm9pZCBlbnF1ZXVlX3NsZWVwZXIoc3RydWN0IGNmc19ycSAqY2ZzX3JxLCBzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSkKLXsKLSNpZmRlZiBDT05GSUdfU0NIRURTVEFUUwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gTlVMTDsKLQotCWlmIChlbnRpdHlfaXNfdGFzayhzZSkpCi0JCXRzayA9IHRhc2tfb2Yoc2UpOwotCi0JaWYgKHNlLT5zdGF0aXN0aWNzLnNsZWVwX3N0YXJ0KSB7Ci0JCXU2NCBkZWx0YSA9IHJxX2Nsb2NrKHJxX29mKGNmc19ycSkpIC0gc2UtPnN0YXRpc3RpY3Muc2xlZXBfc3RhcnQ7Ci0KLQkJaWYgKChzNjQpZGVsdGEgPCAwKQotCQkJZGVsdGEgPSAwOwotCi0JCWlmICh1bmxpa2VseShkZWx0YSA+IHNlLT5zdGF0aXN0aWNzLnNsZWVwX21heCkpCi0JCQlzZS0+c3RhdGlzdGljcy5zbGVlcF9tYXggPSBkZWx0YTsKLQotCQlzZS0+c3RhdGlzdGljcy5zbGVlcF9zdGFydCA9IDA7Ci0JCXNlLT5zdGF0aXN0aWNzLnN1bV9zbGVlcF9ydW50aW1lICs9IGRlbHRhOwotCi0JCWlmICh0c2spIHsKLQkJCWFjY291bnRfc2NoZWR1bGVyX2xhdGVuY3kodHNrLCBkZWx0YSA+PiAxMCwgMSk7Ci0JCQl0cmFjZV9zY2hlZF9zdGF0X3NsZWVwKHRzaywgZGVsdGEpOwotCQl9Ci0JfQotCWlmIChzZS0+c3RhdGlzdGljcy5ibG9ja19zdGFydCkgewotCQl1NjQgZGVsdGEgPSBycV9jbG9jayhycV9vZihjZnNfcnEpKSAtIHNlLT5zdGF0aXN0aWNzLmJsb2NrX3N0YXJ0OwotCi0JCWlmICgoczY0KWRlbHRhIDwgMCkKLQkJCWRlbHRhID0gMDsKLQotCQlpZiAodW5saWtlbHkoZGVsdGEgPiBzZS0+c3RhdGlzdGljcy5ibG9ja19tYXgpKQotCQkJc2UtPnN0YXRpc3RpY3MuYmxvY2tfbWF4ID0gZGVsdGE7Ci0KLQkJc2UtPnN0YXRpc3RpY3MuYmxvY2tfc3RhcnQgPSAwOwotCQlzZS0+c3RhdGlzdGljcy5zdW1fc2xlZXBfcnVudGltZSArPSBkZWx0YTsKLQotCQlpZiAodHNrKSB7Ci0JCQlpZiAodHNrLT5pbl9pb3dhaXQpIHsKLQkJCQlzZS0+c3RhdGlzdGljcy5pb3dhaXRfc3VtICs9IGRlbHRhOwotCQkJCXNlLT5zdGF0aXN0aWNzLmlvd2FpdF9jb3VudCsrOwotCQkJCXRyYWNlX3NjaGVkX3N0YXRfaW93YWl0KHRzaywgZGVsdGEpOwotCQkJfQotCi0JCQl0cmFjZV9zY2hlZF9zdGF0X2Jsb2NrZWQodHNrLCBkZWx0YSk7Ci0KLQkJCS8qCi0JCQkgKiBCbG9ja2luZyB0aW1lIGlzIGluIHVuaXRzIG9mIG5hbm9zZWNzLCBzbyBzaGlmdCBieQotCQkJICogMjAgdG8gZ2V0IGEgbWlsbGlzZWNvbmRzLXJhbmdlIGVzdGltYXRpb24gb2YgdGhlCi0JCQkgKiBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSB0YXNrIHNwZW50IHNsZWVwaW5nOgotCQkJICovCi0JCQlpZiAodW5saWtlbHkocHJvZl9vbiA9PSBTTEVFUF9QUk9GSUxJTkcpKSB7Ci0JCQkJcHJvZmlsZV9oaXRzKFNMRUVQX1BST0ZJTElORywKLQkJCQkJCSh2b2lkICopZ2V0X3djaGFuKHRzayksCi0JCQkJCQlkZWx0YSA+PiAyMCk7Ci0JCQl9Ci0JCQlhY2NvdW50X3NjaGVkdWxlcl9sYXRlbmN5KHRzaywgZGVsdGEgPj4gMTAsIDApOwotCQl9Ci0JfQotI2VuZGlmCi19Ci0KIHN0YXRpYyB2b2lkIGNoZWNrX3NwcmVhZChzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEsIHN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlKQogewogI2lmZGVmIENPTkZJR19TQ0hFRF9ERUJVRwpAQCAtMzI1NCw3ICszMjc2LDcgQEAKIAkJZCA9IC1kOwogCiAJaWYgKGQgPiAzKnN5c2N0bF9zY2hlZF9sYXRlbmN5KQotCQlzY2hlZHN0YXRfaW5jKGNmc19ycSwgbnJfc3ByZWFkX292ZXIpOworCQlzY2hlZHN0YXRfaW5jKGNmc19ycS0+bnJfc3ByZWFkX292ZXIpOwogI2VuZGlmCiB9CiAKQEAgLTMzNzEsMTcgKzMzOTMsMTIgQEAKIAlhY2NvdW50X2VudGl0eV9lbnF1ZXVlKGNmc19ycSwgc2UpOwogCXVwZGF0ZV9jZnNfc2hhcmVzKGNmc19ycSk7CiAKLQlpZiAoZmxhZ3MgJiBFTlFVRVVFX1dBS0VVUCkgeworCWlmIChmbGFncyAmIEVOUVVFVUVfV0FLRVVQKQogCQlwbGFjZV9lbnRpdHkoY2ZzX3JxLCBzZSwgMCk7Ci0JCWlmIChzY2hlZHN0YXRfZW5hYmxlZCgpKQotCQkJZW5xdWV1ZV9zbGVlcGVyKGNmc19ycSwgc2UpOwotCX0KIAogCWNoZWNrX3NjaGVkc3RhdF9yZXF1aXJlZCgpOwotCWlmIChzY2hlZHN0YXRfZW5hYmxlZCgpKSB7Ci0JCXVwZGF0ZV9zdGF0c19lbnF1ZXVlKGNmc19ycSwgc2UpOwotCQljaGVja19zcHJlYWQoY2ZzX3JxLCBzZSk7Ci0JfQorCXVwZGF0ZV9zdGF0c19lbnF1ZXVlKGNmc19ycSwgc2UsIGZsYWdzKTsKKwljaGVja19zcHJlYWQoY2ZzX3JxLCBzZSk7CiAJaWYgKCFjdXJyKQogCQlfX2VucXVldWVfZW50aXR5KGNmc19ycSwgc2UpOwogCXNlLT5vbl9ycSA9IDE7CkBAIC0zNDQ4LDggKzM0NjUsNyBAQAogCXVwZGF0ZV9jdXJyKGNmc19ycSk7CiAJZGVxdWV1ZV9lbnRpdHlfbG9hZF9hdmcoY2ZzX3JxLCBzZSk7CiAKLQlpZiAoc2NoZWRzdGF0X2VuYWJsZWQoKSkKLQkJdXBkYXRlX3N0YXRzX2RlcXVldWUoY2ZzX3JxLCBzZSwgZmxhZ3MpOworCXVwZGF0ZV9zdGF0c19kZXF1ZXVlKGNmc19ycSwgc2UsIGZsYWdzKTsKIAogCWNsZWFyX2J1ZGRpZXMoY2ZzX3JxLCBzZSk7CiAKQEAgLTM0NTksOSArMzQ3NSwxMCBAQAogCWFjY291bnRfZW50aXR5X2RlcXVldWUoY2ZzX3JxLCBzZSk7CiAKIAkvKgotCSAqIE5vcm1hbGl6ZSB0aGUgZW50aXR5IGFmdGVyIHVwZGF0aW5nIHRoZSBtaW5fdnJ1bnRpbWUgYmVjYXVzZSB0aGUKLQkgKiB1cGRhdGUgY2FuIHJlZmVyIHRvIHRoZSAtPmN1cnIgaXRlbSBhbmQgd2UgbmVlZCB0byByZWZsZWN0IHRoaXMKLQkgKiBtb3ZlbWVudCBpbiBvdXIgbm9ybWFsaXplZCBwb3NpdGlvbi4KKwkgKiBOb3JtYWxpemUgYWZ0ZXIgdXBkYXRlX2N1cnIoKTsgd2hpY2ggd2lsbCBhbHNvIGhhdmUgbW92ZWQKKwkgKiBtaW5fdnJ1bnRpbWUgaWYgQHNlIGlzIHRoZSBvbmUgaG9sZGluZyBpdCBiYWNrLiBCdXQgYmVmb3JlIGRvaW5nCisJICogdXBkYXRlX21pbl92cnVudGltZSgpIGFnYWluLCB3aGljaCB3aWxsIGRpc2NvdW50IEBzZSdzIHBvc2l0aW9uIGFuZAorCSAqIGNhbiBtb3ZlIG1pbl92cnVudGltZSBmb3J3YXJkIHN0aWxsIG1vcmUuCiAJICovCiAJaWYgKCEoZmxhZ3MgJiBERVFVRVVFX1NMRUVQKSkKIAkJc2UtPnZydW50aW1lIC09IGNmc19ycS0+bWluX3ZydW50aW1lOwpAQCAtMzQ2OSw4ICszNDg2LDE2IEBACiAJLyogcmV0dXJuIGV4Y2VzcyBydW50aW1lIG9uIGxhc3QgZGVxdWV1ZSAqLwogCXJldHVybl9jZnNfcnFfcnVudGltZShjZnNfcnEpOwogCi0JdXBkYXRlX21pbl92cnVudGltZShjZnNfcnEpOwogCXVwZGF0ZV9jZnNfc2hhcmVzKGNmc19ycSk7CisKKwkvKgorCSAqIE5vdyBhZHZhbmNlIG1pbl92cnVudGltZSBpZiBAc2Ugd2FzIHRoZSBlbnRpdHkgaG9sZGluZyBpdCBiYWNrLAorCSAqIGV4Y2VwdCB3aGVuOiBERVFVRVVFX1NBVkUgJiYgIURFUVVFVUVfTU9WRSwgaW4gdGhpcyBjYXNlIHdlJ2xsIGJlCisJICogcHV0IGJhY2sgb24sIGFuZCBpZiB3ZSBhZHZhbmNlIG1pbl92cnVudGltZSwgd2UnbGwgYmUgcGxhY2VkIGJhY2sKKwkgKiBmdXJ0aGVyIHRoYW4gd2Ugc3RhcnRlZCAtLSBpZS4gd2UnbGwgYmUgcGVuYWxpemVkLgorCSAqLworCWlmICgoZmxhZ3MgJiAoREVRVUVVRV9TQVZFIHwgREVRVUVVRV9NT1ZFKSkgPT0gREVRVUVVRV9TQVZFKQorCQl1cGRhdGVfbWluX3ZydW50aW1lKGNmc19ycSk7CiB9CiAKIC8qCkBAIC0zNTIzLDI1ICszNTQ4LDI1IEBACiAJCSAqIGEgQ1BVLiBTbyBhY2NvdW50IGZvciB0aGUgdGltZSBpdCBzcGVudCB3YWl0aW5nIG9uIHRoZQogCQkgKiBydW5xdWV1ZS4KIAkJICovCi0JCWlmIChzY2hlZHN0YXRfZW5hYmxlZCgpKQotCQkJdXBkYXRlX3N0YXRzX3dhaXRfZW5kKGNmc19ycSwgc2UpOworCQl1cGRhdGVfc3RhdHNfd2FpdF9lbmQoY2ZzX3JxLCBzZSk7CiAJCV9fZGVxdWV1ZV9lbnRpdHkoY2ZzX3JxLCBzZSk7CiAJCXVwZGF0ZV9sb2FkX2F2ZyhzZSwgMSk7CiAJfQogCiAJdXBkYXRlX3N0YXRzX2N1cnJfc3RhcnQoY2ZzX3JxLCBzZSk7CiAJY2ZzX3JxLT5jdXJyID0gc2U7Ci0jaWZkZWYgQ09ORklHX1NDSEVEU1RBVFMKKwogCS8qCiAJICogVHJhY2sgb3VyIG1heGltdW0gc2xpY2UgbGVuZ3RoLCBpZiB0aGUgQ1BVJ3MgbG9hZCBpcyBhdAogCSAqIGxlYXN0IHR3aWNlIHRoYXQgb2Ygb3VyIG93biB3ZWlnaHQgKGkuZS4gZG9udCB0cmFjayBpdAogCSAqIHdoZW4gdGhlcmUgYXJlIG9ubHkgbGVzc2VyLXdlaWdodCB0YXNrcyBhcm91bmQpOgogCSAqLwogCWlmIChzY2hlZHN0YXRfZW5hYmxlZCgpICYmIHJxX29mKGNmc19ycSktPmxvYWQud2VpZ2h0ID49IDIqc2UtPmxvYWQud2VpZ2h0KSB7Ci0JCXNlLT5zdGF0aXN0aWNzLnNsaWNlX21heCA9IG1heChzZS0+c3RhdGlzdGljcy5zbGljZV9tYXgsCi0JCQlzZS0+c3VtX2V4ZWNfcnVudGltZSAtIHNlLT5wcmV2X3N1bV9leGVjX3J1bnRpbWUpOworCQlzY2hlZHN0YXRfc2V0KHNlLT5zdGF0aXN0aWNzLnNsaWNlX21heCwKKwkJCW1heCgodTY0KXNjaGVkc3RhdF92YWwoc2UtPnN0YXRpc3RpY3Muc2xpY2VfbWF4KSwKKwkJCSAgICBzZS0+c3VtX2V4ZWNfcnVudGltZSAtIHNlLT5wcmV2X3N1bV9leGVjX3J1bnRpbWUpKTsKIAl9Ci0jZW5kaWYKKwogCXNlLT5wcmV2X3N1bV9leGVjX3J1bnRpbWUgPSBzZS0+c3VtX2V4ZWNfcnVudGltZTsKIH0KIApAQCAtMzYyMCwxMyArMzY0NSwxMCBAQAogCS8qIHRocm90dGxlIGNmc19ycXMgZXhjZWVkaW5nIHJ1bnRpbWUgKi8KIAljaGVja19jZnNfcnFfcnVudGltZShjZnNfcnEpOwogCi0JaWYgKHNjaGVkc3RhdF9lbmFibGVkKCkpIHsKLQkJY2hlY2tfc3ByZWFkKGNmc19ycSwgcHJldik7Ci0JCWlmIChwcmV2LT5vbl9ycSkKLQkJCXVwZGF0ZV9zdGF0c193YWl0X3N0YXJ0KGNmc19ycSwgcHJldik7Ci0JfQorCWNoZWNrX3NwcmVhZChjZnNfcnEsIHByZXYpOwogCiAJaWYgKHByZXYtPm9uX3JxKSB7CisJCXVwZGF0ZV9zdGF0c193YWl0X3N0YXJ0KGNmc19ycSwgcHJldik7CiAJCS8qIFB1dCAnY3VycmVudCcgYmFjayBpbnRvIHRoZSB0cmVlLiAqLwogCQlfX2VucXVldWVfZW50aXR5KGNmc19ycSwgcHJldik7CiAJCS8qIGluICFvbl9ycSBjYXNlLCB1cGRhdGUgb2NjdXJyZWQgYXQgZGVxdWV1ZSAqLwpAQCAtNDQ1Niw5ICs0NDc4LDkgQEAKIAlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSA9ICZwLT5zZTsKIAlzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEgPSBjZnNfcnFfb2Yoc2UpOwogCi0JV0FSTl9PTih0YXNrX3JxKHApICE9IHJxKTsKKwlTQ0hFRF9XQVJOX09OKHRhc2tfcnEocCkgIT0gcnEpOwogCi0JaWYgKGNmc19ycS0+bnJfcnVubmluZyA+IDEpIHsKKwlpZiAocnEtPmNmcy5oX25yX3J1bm5pbmcgPiAxKSB7CiAJCXU2NCBzbGljZSA9IHNjaGVkX3NsaWNlKGNmc19ycSwgc2UpOwogCQl1NjQgcmFuID0gc2UtPnN1bV9leGVjX3J1bnRpbWUgLSBzZS0+cHJldl9zdW1fZXhlY19ydW50aW1lOwogCQlzNjQgZGVsdGEgPSBzbGljZSAtIHJhbjsKQEAgLTQ1MDksNiArNDUzMSwxNCBAQAogCXN0cnVjdCBjZnNfcnEgKmNmc19ycTsKIAlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSA9ICZwLT5zZTsKIAorCS8qCisJICogSWYgaW5faW93YWl0IGlzIHNldCwgdGhlIGNvZGUgYmVsb3cgbWF5IG5vdCB0cmlnZ2VyIGFueSBjcHVmcmVxCisJICogdXRpbGl6YXRpb24gdXBkYXRlcywgc28gZG8gaXQgaGVyZSBleHBsaWNpdGx5IHdpdGggdGhlIElPV0FJVCBmbGFnCisJICogcGFzc2VkLgorCSAqLworCWlmIChwLT5pbl9pb3dhaXQpCisJCWNwdWZyZXFfdXBkYXRlX3RoaXNfY3B1KHJxLCBTQ0hFRF9DUFVGUkVRX0lPV0FJVCk7CisKIAlmb3JfZWFjaF9zY2hlZF9lbnRpdHkoc2UpIHsKIAkJaWYgKHNlLT5vbl9ycSkKIAkJCWJyZWFrOwpAQCAtNDYwNSw2ICs0NjM1LDExIEBACiB9CiAKICNpZmRlZiBDT05GSUdfU01QCisKKy8qIFdvcmtpbmcgY3B1bWFzayBmb3I6IGxvYWRfYmFsYW5jZSwgbG9hZF9iYWxhbmNlX25ld2lkbGUuICovCitERUZJTkVfUEVSX0NQVShjcHVtYXNrX3Zhcl90LCBsb2FkX2JhbGFuY2VfbWFzayk7CitERUZJTkVfUEVSX0NQVShjcHVtYXNrX3Zhcl90LCBzZWxlY3RfaWRsZV9tYXNrKTsKKwogI2lmZGVmIENPTkZJR19OT19IWl9DT01NT04KIC8qCiAgKiBwZXIgcnEgJ2xvYWQnIGFycnJheSBjcmFwOyBYWFgga2lsbCB0aGlzLgpAQCAtNTAwNiw5ICs1MDQxLDkgQEAKIAkJICogd2wgPSBTICogcydfaTsgc2VlICgyKQogCQkgKi8KIAkJaWYgKFcgPiAwICYmIHcgPCBXKQotCQkJd2wgPSAodyAqIChsb25nKXRnLT5zaGFyZXMpIC8gVzsKKwkJCXdsID0gKHcgKiAobG9uZylzY2FsZV9sb2FkX2Rvd24odGctPnNoYXJlcykpIC8gVzsKIAkJZWxzZQotCQkJd2wgPSB0Zy0+c2hhcmVzOworCQkJd2wgPSBzY2FsZV9sb2FkX2Rvd24odGctPnNoYXJlcyk7CiAKIAkJLyoKIAkJICogUGVyIHRoZSBhYm92ZSwgd2wgaXMgdGhlIG5ldyBzZS0+bG9hZC53ZWlnaHQgdmFsdWU7IHNpbmNlCkBAIC01MDkxLDE4ICs1MTI2LDE4IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgd2FrZV9hZmZpbmUoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IHN5bmMpCitzdGF0aWMgaW50IHdha2VfYWZmaW5lKHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsCisJCSAgICAgICBpbnQgcHJldl9jcHUsIGludCBzeW5jKQogewogCXM2NCB0aGlzX2xvYWQsIGxvYWQ7CiAJczY0IHRoaXNfZWZmX2xvYWQsIHByZXZfZWZmX2xvYWQ7Ci0JaW50IGlkeCwgdGhpc19jcHUsIHByZXZfY3B1OworCWludCBpZHgsIHRoaXNfY3B1OwogCXN0cnVjdCB0YXNrX2dyb3VwICp0ZzsKIAl1bnNpZ25lZCBsb25nIHdlaWdodDsKIAlpbnQgYmFsYW5jZWQ7CiAKIAlpZHgJICA9IHNkLT53YWtlX2lkeDsKIAl0aGlzX2NwdSAgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JcHJldl9jcHUgID0gdGFza19jcHUocCk7CiAJbG9hZAkgID0gc291cmNlX2xvYWQocHJldl9jcHUsIGlkeCk7CiAJdGhpc19sb2FkID0gdGFyZ2V0X2xvYWQodGhpc19jcHUsIGlkeCk7CiAKQEAgLTUxNDYsMTMgKzUxODEsMTMgQEAKIAogCWJhbGFuY2VkID0gdGhpc19lZmZfbG9hZCA8PSBwcmV2X2VmZl9sb2FkOwogCi0Jc2NoZWRzdGF0X2luYyhwLCBzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfYWZmaW5lX2F0dGVtcHRzKTsKKwlzY2hlZHN0YXRfaW5jKHAtPnNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19hZmZpbmVfYXR0ZW1wdHMpOwogCiAJaWYgKCFiYWxhbmNlZCkKIAkJcmV0dXJuIDA7CiAKLQlzY2hlZHN0YXRfaW5jKHNkLCB0dHd1X21vdmVfYWZmaW5lKTsKLQlzY2hlZHN0YXRfaW5jKHAsIHNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19hZmZpbmUpOworCXNjaGVkc3RhdF9pbmMoc2QtPnR0d3VfbW92ZV9hZmZpbmUpOworCXNjaGVkc3RhdF9pbmMocC0+c2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX2FmZmluZSk7CiAKIAlyZXR1cm4gMTsKIH0KQEAgLTUyMjgsNiArNTI2MywxMCBAQAogCWludCBzaGFsbG93ZXN0X2lkbGVfY3B1ID0gLTE7CiAJaW50IGk7CiAKKwkvKiBDaGVjayBpZiB3ZSBoYXZlIGFueSBjaG9pY2U6ICovCisJaWYgKGdyb3VwLT5ncm91cF93ZWlnaHQgPT0gMSkKKwkJcmV0dXJuIGNwdW1hc2tfZmlyc3Qoc2NoZWRfZ3JvdXBfY3B1cyhncm91cCkpOworCiAJLyogVHJhdmVyc2Ugb25seSB0aGUgYWxsb3dlZCBDUFVzICovCiAJZm9yX2VhY2hfY3B1X2FuZChpLCBzY2hlZF9ncm91cF9jcHVzKGdyb3VwKSwgdHNrX2NwdXNfYWxsb3dlZChwKSkgewogCQlpZiAoaWRsZV9jcHUoaSkpIHsKQEAgLTUyNjUsNjQgKzUzMDQsMjM3IEBACiB9CiAKIC8qCi0gKiBUcnkgYW5kIGxvY2F0ZSBhbiBpZGxlIENQVSBpbiB0aGUgc2NoZWRfZG9tYWluLgorICogSW1wbGVtZW50IGEgZm9yX2VhY2hfY3B1KCkgdmFyaWFudCB0aGF0IHN0YXJ0cyB0aGUgc2NhbiBhdCBhIGdpdmVuIGNwdQorICogKEBzdGFydCksIGFuZCB3cmFwcyBhcm91bmQuCisgKgorICogVGhpcyBpcyB1c2VkIHRvIHNjYW4gZm9yIGlkbGUgQ1BVczsgc3VjaCB0aGF0IG5vdCBhbGwgQ1BVcyBsb29raW5nIGZvciBhbgorICogaWRsZSBDUFUgZmluZCB0aGUgc2FtZSBDUFUuIFRoZSBkb3duLXNpZGUgaXMgdGhhdCB0YXNrcyB0ZW5kIHRvIGN5Y2xlCisgKiB0aHJvdWdoIHRoZSBMTEMgZG9tYWluLgorICoKKyAqIEVzcGVjaWFsbHkgdGJlbmNoIGlzIGZvdW5kIHNlbnNpdGl2ZSB0byB0aGlzLgogICovCi1zdGF0aWMgaW50IHNlbGVjdF9pZGxlX3NpYmxpbmcoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgdGFyZ2V0KQorCitzdGF0aWMgaW50IGNwdW1hc2tfbmV4dF93cmFwKGludCBuLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaywgaW50IHN0YXJ0LCBpbnQgKndyYXBwZWQpCit7CisJaW50IG5leHQ7CisKK2FnYWluOgorCW5leHQgPSBmaW5kX25leHRfYml0KGNwdW1hc2tfYml0cyhtYXNrKSwgbnJfY3B1bWFza19iaXRzLCBuKzEpOworCisJaWYgKCp3cmFwcGVkKSB7CisJCWlmIChuZXh0ID49IHN0YXJ0KQorCQkJcmV0dXJuIG5yX2NwdW1hc2tfYml0czsKKwl9IGVsc2UgeworCQlpZiAobmV4dCA+PSBucl9jcHVtYXNrX2JpdHMpIHsKKwkJCSp3cmFwcGVkID0gMTsKKwkJCW4gPSAtMTsKKwkJCWdvdG8gYWdhaW47CisJCX0KKwl9CisKKwlyZXR1cm4gbmV4dDsKK30KKworI2RlZmluZSBmb3JfZWFjaF9jcHVfd3JhcChjcHUsIG1hc2ssIHN0YXJ0LCB3cmFwKQkJCQlcCisJZm9yICgod3JhcCkgPSAwLCAoY3B1KSA9IChzdGFydCktMTsJCQkJCVwKKwkJKGNwdSkgPSBjcHVtYXNrX25leHRfd3JhcCgoY3B1KSwgKG1hc2spLCAoc3RhcnQpLCAmKHdyYXApKSwJXAorCQkoY3B1KSA8IG5yX2NwdW1hc2tfYml0czsgKQorCisjaWZkZWYgQ09ORklHX1NDSEVEX1NNVAorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2lkbGVfY29yZXMoaW50IGNwdSwgaW50IHZhbCkKK3sKKwlzdHJ1Y3Qgc2NoZWRfZG9tYWluX3NoYXJlZCAqc2RzOworCisJc2RzID0gcmN1X2RlcmVmZXJlbmNlKHBlcl9jcHUoc2RfbGxjX3NoYXJlZCwgY3B1KSk7CisJaWYgKHNkcykKKwkJV1JJVEVfT05DRShzZHMtPmhhc19pZGxlX2NvcmVzLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgdGVzdF9pZGxlX2NvcmVzKGludCBjcHUsIGJvb2wgZGVmKQoreworCXN0cnVjdCBzY2hlZF9kb21haW5fc2hhcmVkICpzZHM7CisKKwlzZHMgPSByY3VfZGVyZWZlcmVuY2UocGVyX2NwdShzZF9sbGNfc2hhcmVkLCBjcHUpKTsKKwlpZiAoc2RzKQorCQlyZXR1cm4gUkVBRF9PTkNFKHNkcy0+aGFzX2lkbGVfY29yZXMpOworCisJcmV0dXJuIGRlZjsKK30KKworLyoKKyAqIFNjYW5zIHRoZSBsb2NhbCBTTVQgbWFzayB0byBzZWUgaWYgdGhlIGVudGlyZSBjb3JlIGlzIGlkbGUsIGFuZCByZWNvcmRzIHRoaXMKKyAqIGluZm9ybWF0aW9uIGluIHNkX2xsY19zaGFyZWQtPmhhc19pZGxlX2NvcmVzLgorICoKKyAqIFNpbmNlIFNNVCBzaWJsaW5ncyBzaGFyZSBhbGwgY2FjaGUgbGV2ZWxzLCBpbnNwZWN0aW5nIHRoaXMgbGltaXRlZCByZW1vdGUKKyAqIHN0YXRlIHNob3VsZCBiZSBmYWlybHkgY2hlYXAuCisgKi8KK3ZvaWQgX191cGRhdGVfaWRsZV9jb3JlKHN0cnVjdCBycSAqcnEpCit7CisJaW50IGNvcmUgPSBjcHVfb2YocnEpOworCWludCBjcHU7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKHRlc3RfaWRsZV9jb3Jlcyhjb3JlLCB0cnVlKSkKKwkJZ290byB1bmxvY2s7CisKKwlmb3JfZWFjaF9jcHUoY3B1LCBjcHVfc210X21hc2soY29yZSkpIHsKKwkJaWYgKGNwdSA9PSBjb3JlKQorCQkJY29udGludWU7CisKKwkJaWYgKCFpZGxlX2NwdShjcHUpKQorCQkJZ290byB1bmxvY2s7CisJfQorCisJc2V0X2lkbGVfY29yZXMoY29yZSwgMSk7Cit1bmxvY2s6CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CisKKy8qCisgKiBTY2FuIHRoZSBlbnRpcmUgTExDIGRvbWFpbiBmb3IgaWRsZSBjb3JlczsgdGhpcyBkeW5hbWljYWxseSBzd2l0Y2hlcyBvZmYgaWYKKyAqIHRoZXJlIGFyZSBubyBpZGxlIGNvcmVzIGxlZnQgaW4gdGhlIHN5c3RlbTsgdHJhY2tlZCB0aHJvdWdoCisgKiBzZF9sbGMtPnNoYXJlZC0+aGFzX2lkbGVfY29yZXMgYW5kIGVuYWJsZWQgdGhyb3VnaCB1cGRhdGVfaWRsZV9jb3JlKCkgYWJvdmUuCisgKi8KK3N0YXRpYyBpbnQgc2VsZWN0X2lkbGVfY29yZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgdGFyZ2V0KQoreworCXN0cnVjdCBjcHVtYXNrICpjcHVzID0gdGhpc19jcHVfY3B1bWFza192YXJfcHRyKHNlbGVjdF9pZGxlX21hc2spOworCWludCBjb3JlLCBjcHUsIHdyYXA7CisKKwlpZiAoIXN0YXRpY19icmFuY2hfbGlrZWx5KCZzY2hlZF9zbXRfcHJlc2VudCkpCisJCXJldHVybiAtMTsKKworCWlmICghdGVzdF9pZGxlX2NvcmVzKHRhcmdldCwgZmFsc2UpKQorCQlyZXR1cm4gLTE7CisKKwljcHVtYXNrX2FuZChjcHVzLCBzY2hlZF9kb21haW5fc3BhbihzZCksIHRza19jcHVzX2FsbG93ZWQocCkpOworCisJZm9yX2VhY2hfY3B1X3dyYXAoY29yZSwgY3B1cywgdGFyZ2V0LCB3cmFwKSB7CisJCWJvb2wgaWRsZSA9IHRydWU7CisKKwkJZm9yX2VhY2hfY3B1KGNwdSwgY3B1X3NtdF9tYXNrKGNvcmUpKSB7CisJCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsIGNwdXMpOworCQkJaWYgKCFpZGxlX2NwdShjcHUpKQorCQkJCWlkbGUgPSBmYWxzZTsKKwkJfQorCisJCWlmIChpZGxlKQorCQkJcmV0dXJuIGNvcmU7CisJfQorCisJLyoKKwkgKiBGYWlsZWQgdG8gZmluZCBhbiBpZGxlIGNvcmU7IHN0b3AgbG9va2luZyBmb3Igb25lLgorCSAqLworCXNldF9pZGxlX2NvcmVzKHRhcmdldCwgMCk7CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBTY2FuIHRoZSBsb2NhbCBTTVQgbWFzayBmb3IgaWRsZSBDUFVzLgorICovCitzdGF0aWMgaW50IHNlbGVjdF9pZGxlX3NtdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgdGFyZ2V0KQoreworCWludCBjcHU7CisKKwlpZiAoIXN0YXRpY19icmFuY2hfbGlrZWx5KCZzY2hlZF9zbXRfcHJlc2VudCkpCisJCXJldHVybiAtMTsKKworCWZvcl9lYWNoX2NwdShjcHUsIGNwdV9zbXRfbWFzayh0YXJnZXQpKSB7CisJCWlmICghY3B1bWFza190ZXN0X2NwdShjcHUsIHRza19jcHVzX2FsbG93ZWQocCkpKQorCQkJY29udGludWU7CisJCWlmIChpZGxlX2NwdShjcHUpKQorCQkJcmV0dXJuIGNwdTsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKyNlbHNlIC8qIENPTkZJR19TQ0hFRF9TTVQgKi8KKworc3RhdGljIGlubGluZSBpbnQgc2VsZWN0X2lkbGVfY29yZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgdGFyZ2V0KQoreworCXJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2VsZWN0X2lkbGVfc210KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCB0YXJnZXQpCit7CisJcmV0dXJuIC0xOworfQorCisjZW5kaWYgLyogQ09ORklHX1NDSEVEX1NNVCAqLworCisvKgorICogU2NhbiB0aGUgTExDIGRvbWFpbiBmb3IgaWRsZSBDUFVzOyB0aGlzIGlzIGR5bmFtaWNhbGx5IHJlZ3VsYXRlZCBieQorICogY29tcGFyaW5nIHRoZSBhdmVyYWdlIHNjYW4gY29zdCAodHJhY2tlZCBpbiBzZC0+YXZnX3NjYW5fY29zdCkgYWdhaW5zdCB0aGUKKyAqIGF2ZXJhZ2UgaWRsZSB0aW1lIGZvciB0aGlzIHJxIChhcyBmb3VuZCBpbiBycS0+YXZnX2lkbGUpLgorICovCitzdGF0aWMgaW50IHNlbGVjdF9pZGxlX2NwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgdGFyZ2V0KQoreworCXN0cnVjdCBzY2hlZF9kb21haW4gKnRoaXNfc2QgPSByY3VfZGVyZWZlcmVuY2UoKnRoaXNfY3B1X3B0cigmc2RfbGxjKSk7CisJdTY0IGF2Z19pZGxlID0gdGhpc19ycSgpLT5hdmdfaWRsZTsKKwl1NjQgYXZnX2Nvc3QgPSB0aGlzX3NkLT5hdmdfc2Nhbl9jb3N0OworCXU2NCB0aW1lLCBjb3N0OworCXM2NCBkZWx0YTsKKwlpbnQgY3B1LCB3cmFwOworCisJLyoKKwkgKiBEdWUgdG8gbGFyZ2UgdmFyaWFuY2Ugd2UgbmVlZCBhIGxhcmdlIGZ1enogZmFjdG9yOyBoYWNrYmVuY2ggaW4KKwkgKiBwYXJ0aWN1bGFybHkgaXMgc2Vuc2l0aXZlIGhlcmUuCisJICovCisJaWYgKChhdmdfaWRsZSAvIDUxMikgPCBhdmdfY29zdCkKKwkJcmV0dXJuIC0xOworCisJdGltZSA9IGxvY2FsX2Nsb2NrKCk7CisKKwlmb3JfZWFjaF9jcHVfd3JhcChjcHUsIHNjaGVkX2RvbWFpbl9zcGFuKHNkKSwgdGFyZ2V0LCB3cmFwKSB7CisJCWlmICghY3B1bWFza190ZXN0X2NwdShjcHUsIHRza19jcHVzX2FsbG93ZWQocCkpKQorCQkJY29udGludWU7CisJCWlmIChpZGxlX2NwdShjcHUpKQorCQkJYnJlYWs7CisJfQorCisJdGltZSA9IGxvY2FsX2Nsb2NrKCkgLSB0aW1lOworCWNvc3QgPSB0aGlzX3NkLT5hdmdfc2Nhbl9jb3N0OworCWRlbHRhID0gKHM2NCkodGltZSAtIGNvc3QpIC8gODsKKwl0aGlzX3NkLT5hdmdfc2Nhbl9jb3N0ICs9IGRlbHRhOworCisJcmV0dXJuIGNwdTsKK30KKworLyoKKyAqIFRyeSBhbmQgbG9jYXRlIGFuIGlkbGUgY29yZS90aHJlYWQgaW4gdGhlIExMQyBjYWNoZSBkb21haW4uCisgKi8KK3N0YXRpYyBpbnQgc2VsZWN0X2lkbGVfc2libGluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBwcmV2LCBpbnQgdGFyZ2V0KQogewogCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOwotCXN0cnVjdCBzY2hlZF9ncm91cCAqc2c7Ci0JaW50IGkgPSB0YXNrX2NwdShwKTsKKwlpbnQgaTsKIAogCWlmIChpZGxlX2NwdSh0YXJnZXQpKQogCQlyZXR1cm4gdGFyZ2V0OwogCiAJLyoKLQkgKiBJZiB0aGUgcHJldm91cyBjcHUgaXMgY2FjaGUgYWZmaW5lIGFuZCBpZGxlLCBkb24ndCBiZSBzdHVwaWQuCisJICogSWYgdGhlIHByZXZpb3VzIGNwdSBpcyBjYWNoZSBhZmZpbmUgYW5kIGlkbGUsIGRvbid0IGJlIHN0dXBpZC4KIAkgKi8KLQlpZiAoaSAhPSB0YXJnZXQgJiYgY3B1c19zaGFyZV9jYWNoZShpLCB0YXJnZXQpICYmIGlkbGVfY3B1KGkpKQorCWlmIChwcmV2ICE9IHRhcmdldCAmJiBjcHVzX3NoYXJlX2NhY2hlKHByZXYsIHRhcmdldCkgJiYgaWRsZV9jcHUocHJldikpCisJCXJldHVybiBwcmV2OworCisJc2QgPSByY3VfZGVyZWZlcmVuY2UocGVyX2NwdShzZF9sbGMsIHRhcmdldCkpOworCWlmICghc2QpCisJCXJldHVybiB0YXJnZXQ7CisKKwlpID0gc2VsZWN0X2lkbGVfY29yZShwLCBzZCwgdGFyZ2V0KTsKKwlpZiAoKHVuc2lnbmVkKWkgPCBucl9jcHVtYXNrX2JpdHMpCiAJCXJldHVybiBpOwogCi0JLyoKLQkgKiBPdGhlcndpc2UsIGl0ZXJhdGUgdGhlIGRvbWFpbnMgYW5kIGZpbmQgYW4gZWxpZ2libGUgaWRsZSBjcHUuCi0JICoKLQkgKiBBIGNvbXBsZXRlbHkgaWRsZSBzY2hlZCBncm91cCBhdCBoaWdoZXIgZG9tYWlucyBpcyBtb3JlCi0JICogZGVzaXJhYmxlIHRoYW4gYW4gaWRsZSBncm91cCBhdCBhIGxvd2VyIGxldmVsLCBiZWNhdXNlIGxvd2VyCi0JICogZG9tYWlucyBoYXZlIHNtYWxsZXIgZ3JvdXBzIGFuZCB1c3VhbGx5IHNoYXJlIGhhcmR3YXJlCi0JICogcmVzb3VyY2VzIHdoaWNoIGNhdXNlcyB0YXNrcyB0byBjb250ZW5kIG9uIHRoZW0sIGUuZy4geDg2Ci0JICogaHlwZXJ0aHJlYWQgc2libGluZ3MgaW4gdGhlIGxvd2VzdCBkb21haW4gKFNNVCkgY2FuIGNvbnRlbmQKLQkgKiBvbiB0aGUgc2hhcmVkIGNwdSBwaXBlbGluZS4KLQkgKgotCSAqIEhvd2V2ZXIsIHdoaWxlIHdlIHByZWZlciBpZGxlIGdyb3VwcyBhdCBoaWdoZXIgZG9tYWlucwotCSAqIGZpbmRpbmcgYW4gaWRsZSBjcHUgYXQgdGhlIGxvd2VzdCBkb21haW4gaXMgc3RpbGwgYmV0dGVyIHRoYW4KLQkgKiByZXR1cm5pbmcgJ3RhcmdldCcsIHdoaWNoIHdlJ3ZlIGFscmVhZHkgZXN0YWJsaXNoZWQsIGlzbid0Ci0JICogaWRsZS4KLQkgKi8KLQlzZCA9IHJjdV9kZXJlZmVyZW5jZShwZXJfY3B1KHNkX2xsYywgdGFyZ2V0KSk7Ci0JZm9yX2VhY2hfbG93ZXJfZG9tYWluKHNkKSB7Ci0JCXNnID0gc2QtPmdyb3VwczsKLQkJZG8gewotCQkJaWYgKCFjcHVtYXNrX2ludGVyc2VjdHMoc2NoZWRfZ3JvdXBfY3B1cyhzZyksCi0JCQkJCQl0c2tfY3B1c19hbGxvd2VkKHApKSkKLQkJCQlnb3RvIG5leHQ7CisJaSA9IHNlbGVjdF9pZGxlX2NwdShwLCBzZCwgdGFyZ2V0KTsKKwlpZiAoKHVuc2lnbmVkKWkgPCBucl9jcHVtYXNrX2JpdHMpCisJCXJldHVybiBpOwogCi0JCQkvKiBFbnN1cmUgdGhlIGVudGlyZSBncm91cCBpcyBpZGxlICovCi0JCQlmb3JfZWFjaF9jcHUoaSwgc2NoZWRfZ3JvdXBfY3B1cyhzZykpIHsKLQkJCQlpZiAoaSA9PSB0YXJnZXQgfHwgIWlkbGVfY3B1KGkpKQotCQkJCQlnb3RvIG5leHQ7Ci0JCQl9CisJaSA9IHNlbGVjdF9pZGxlX3NtdChwLCBzZCwgdGFyZ2V0KTsKKwlpZiAoKHVuc2lnbmVkKWkgPCBucl9jcHVtYXNrX2JpdHMpCisJCXJldHVybiBpOwogCi0JCQkvKgotCQkJICogSXQgZG9lc24ndCBtYXR0ZXIgd2hpY2ggY3B1IHdlIHBpY2ssIHRoZQotCQkJICogd2hvbGUgZ3JvdXAgaXMgaWRsZS4KLQkJCSAqLwotCQkJdGFyZ2V0ID0gY3B1bWFza19maXJzdF9hbmQoc2NoZWRfZ3JvdXBfY3B1cyhzZyksCi0JCQkJCXRza19jcHVzX2FsbG93ZWQocCkpOwotCQkJZ290byBkb25lOwotbmV4dDoKLQkJCXNnID0gc2ctPm5leHQ7Ci0JCX0gd2hpbGUgKHNnICE9IHNkLT5ncm91cHMpOwotCX0KLWRvbmU6CiAJcmV0dXJuIHRhcmdldDsKIH0KIApAQCAtNTM2MCw2ICs1NTcyLDMyIEBACiAJcmV0dXJuICh1dGlsID49IGNhcGFjaXR5KSA/IGNhcGFjaXR5IDogdXRpbDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgdGFza191dGlsKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlyZXR1cm4gcC0+c2UuYXZnLnV0aWxfYXZnOworfQorCisvKgorICogRGlzYWJsZSBXQUtFX0FGRklORSBpbiB0aGUgY2FzZSB3aGVyZSB0YXNrIEBwIGRvZXNuJ3QgZml0IGluIHRoZQorICogY2FwYWNpdHkgb2YgZWl0aGVyIHRoZSB3YWtpbmcgQ1BVIEBjcHUgb3IgdGhlIHByZXZpb3VzIENQVSBAcHJldl9jcHUuCisgKgorICogSW4gdGhhdCBjYXNlIFdBS0VfQUZGSU5FIGRvZXNuJ3QgbWFrZSBzZW5zZSBhbmQgd2UnbGwgbGV0CisgKiBCQUxBTkNFX1dBS0Ugc29ydCB0aGluZ3Mgb3V0LgorICovCitzdGF0aWMgaW50IHdha2VfY2FwKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IGNwdSwgaW50IHByZXZfY3B1KQoreworCWxvbmcgbWluX2NhcCwgbWF4X2NhcDsKKworCW1pbl9jYXAgPSBtaW4oY2FwYWNpdHlfb3JpZ19vZihwcmV2X2NwdSksIGNhcGFjaXR5X29yaWdfb2YoY3B1KSk7CisJbWF4X2NhcCA9IGNwdV9ycShjcHUpLT5yZC0+bWF4X2NwdV9jYXBhY2l0eTsKKworCS8qIE1pbmltdW0gY2FwYWNpdHkgaXMgY2xvc2UgdG8gbWF4LCBubyBuZWVkIHRvIGFib3J0IHdha2VfYWZmaW5lICovCisJaWYgKG1heF9jYXAgLSBtaW5fY2FwIDwgbWF4X2NhcCA+PiAzKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBtaW5fY2FwICogMTAyNCA8IHRhc2tfdXRpbChwKSAqIGNhcGFjaXR5X21hcmdpbjsKK30KKwogLyoKICAqIHNlbGVjdF90YXNrX3JxX2ZhaXI6IFNlbGVjdCB0YXJnZXQgcnVucXVldWUgZm9yIHRoZSB3YWtpbmcgdGFzayBpbiBkb21haW5zCiAgKiB0aGF0IGhhdmUgdGhlICdzZF9mbGFnJyBmbGFnIHNldC4gSW4gcHJhY3RpY2UsIHRoaXMgaXMgU0RfQkFMQU5DRV9XQUtFLApAQCAtNTM4Myw3ICs1NjIxLDggQEAKIAogCWlmIChzZF9mbGFnICYgU0RfQkFMQU5DRV9XQUtFKSB7CiAJCXJlY29yZF93YWtlZShwKTsKLQkJd2FudF9hZmZpbmUgPSAhd2FrZV93aWRlKHApICYmIGNwdW1hc2tfdGVzdF9jcHUoY3B1LCB0c2tfY3B1c19hbGxvd2VkKHApKTsKKwkJd2FudF9hZmZpbmUgPSAhd2FrZV93aWRlKHApICYmICF3YWtlX2NhcChwLCBjcHUsIHByZXZfY3B1KQorCQkJICAgICAgJiYgY3B1bWFza190ZXN0X2NwdShjcHUsIHRza19jcHVzX2FsbG93ZWQocCkpOwogCX0KIAogCXJjdV9yZWFkX2xvY2soKTsKQEAgLTU0MDksMTMgKzU2NDgsMTMgQEAKIAogCWlmIChhZmZpbmVfc2QpIHsKIAkJc2QgPSBOVUxMOyAvKiBQcmVmZXIgd2FrZV9hZmZpbmUgb3ZlciBiYWxhbmNlIGZsYWdzICovCi0JCWlmIChjcHUgIT0gcHJldl9jcHUgJiYgd2FrZV9hZmZpbmUoYWZmaW5lX3NkLCBwLCBzeW5jKSkKKwkJaWYgKGNwdSAhPSBwcmV2X2NwdSAmJiB3YWtlX2FmZmluZShhZmZpbmVfc2QsIHAsIHByZXZfY3B1LCBzeW5jKSkKIAkJCW5ld19jcHUgPSBjcHU7CiAJfQogCiAJaWYgKCFzZCkgewogCQlpZiAoc2RfZmxhZyAmIFNEX0JBTEFOQ0VfV0FLRSkgLyogWFhYIGFsd2F5cyA/ICovCi0JCQluZXdfY3B1ID0gc2VsZWN0X2lkbGVfc2libGluZyhwLCBuZXdfY3B1KTsKKwkJCW5ld19jcHUgPSBzZWxlY3RfaWRsZV9zaWJsaW5nKHAsIHByZXZfY3B1LCBuZXdfY3B1KTsKIAogCX0gZWxzZSB3aGlsZSAoc2QpIHsKIAkJc3RydWN0IHNjaGVkX2dyb3VwICpncm91cDsKQEAgLTU5MzksNyArNjE3OCw3IEBACiAgKgogICogVGhlIGFkamFjZW5jeSBtYXRyaXggb2YgdGhlIHJlc3VsdGluZyBncmFwaCBpcyBnaXZlbiBieToKICAqCi0gKiAgICAgICAgICAgICBsb2dfMiBuICAgICAKKyAqICAgICAgICAgICAgIGxvZ18yIG4KICAqICAgQV9pLGogPSBcVW5pb24gICAgIChpICUgMl5rID09IDApICYmIGkgLyAyXihrKzEpID09IGogLyAyXihrKzEpICAoNikKICAqICAgICAgICAgICAgIGsgPSAwCiAgKgpAQCAtNTk4NSw3ICs2MjI0LDcgQEAKICAqCiAgKiBbWFhYIHdyaXRlIG1vcmUgb24gaG93IHdlIHNvbHZlIHRoaXMuLiBfYWZ0ZXJfIG1lcmdpbmcgcGp0J3MgcGF0Y2hlcyB0aGF0CiAgKiAgICAgIHJld3JpdGUgYWxsIG9mIHRoaXMgb25jZSBhZ2Fpbi5dCi0gKi8gCisgKi8KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgX19yZWFkX21vc3RseSBtYXhfbG9hZF9iYWxhbmNlX2ludGVydmFsID0gSFovMTA7CiAKQEAgLTYxMzMsNyArNjM3Miw3IEBACiAJaWYgKCFjcHVtYXNrX3Rlc3RfY3B1KGVudi0+ZHN0X2NwdSwgdHNrX2NwdXNfYWxsb3dlZChwKSkpIHsKIAkJaW50IGNwdTsKIAotCQlzY2hlZHN0YXRfaW5jKHAsIHNlLnN0YXRpc3RpY3MubnJfZmFpbGVkX21pZ3JhdGlvbnNfYWZmaW5lKTsKKwkJc2NoZWRzdGF0X2luYyhwLT5zZS5zdGF0aXN0aWNzLm5yX2ZhaWxlZF9taWdyYXRpb25zX2FmZmluZSk7CiAKIAkJZW52LT5mbGFncyB8PSBMQkZfU09NRV9QSU5ORUQ7CiAKQEAgLTYxNjQsNyArNjQwMyw3IEBACiAJZW52LT5mbGFncyAmPSB+TEJGX0FMTF9QSU5ORUQ7CiAKIAlpZiAodGFza19ydW5uaW5nKGVudi0+c3JjX3JxLCBwKSkgewotCQlzY2hlZHN0YXRfaW5jKHAsIHNlLnN0YXRpc3RpY3MubnJfZmFpbGVkX21pZ3JhdGlvbnNfcnVubmluZyk7CisJCXNjaGVkc3RhdF9pbmMocC0+c2Uuc3RhdGlzdGljcy5ucl9mYWlsZWRfbWlncmF0aW9uc19ydW5uaW5nKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC02MTgxLDEzICs2NDIwLDEzIEBACiAJaWYgKHRza19jYWNoZV9ob3QgPD0gMCB8fAogCSAgICBlbnYtPnNkLT5ucl9iYWxhbmNlX2ZhaWxlZCA+IGVudi0+c2QtPmNhY2hlX25pY2VfdHJpZXMpIHsKIAkJaWYgKHRza19jYWNoZV9ob3QgPT0gMSkgewotCQkJc2NoZWRzdGF0X2luYyhlbnYtPnNkLCBsYl9ob3RfZ2FpbmVkW2Vudi0+aWRsZV0pOwotCQkJc2NoZWRzdGF0X2luYyhwLCBzZS5zdGF0aXN0aWNzLm5yX2ZvcmNlZF9taWdyYXRpb25zKTsKKwkJCXNjaGVkc3RhdF9pbmMoZW52LT5zZC0+bGJfaG90X2dhaW5lZFtlbnYtPmlkbGVdKTsKKwkJCXNjaGVkc3RhdF9pbmMocC0+c2Uuc3RhdGlzdGljcy5ucl9mb3JjZWRfbWlncmF0aW9ucyk7CiAJCX0KIAkJcmV0dXJuIDE7CiAJfQogCi0Jc2NoZWRzdGF0X2luYyhwLCBzZS5zdGF0aXN0aWNzLm5yX2ZhaWxlZF9taWdyYXRpb25zX2hvdCk7CisJc2NoZWRzdGF0X2luYyhwLT5zZS5zdGF0aXN0aWNzLm5yX2ZhaWxlZF9taWdyYXRpb25zX2hvdCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTYyMjcsNyArNjQ2Niw3IEBACiAJCSAqIHNvIHdlIGNhbiBzYWZlbHkgY29sbGVjdCBzdGF0cyBoZXJlIHJhdGhlciB0aGFuCiAJCSAqIGluc2lkZSBkZXRhY2hfdGFza3MoKS4KIAkJICovCi0JCXNjaGVkc3RhdF9pbmMoZW52LT5zZCwgbGJfZ2FpbmVkW2Vudi0+aWRsZV0pOworCQlzY2hlZHN0YXRfaW5jKGVudi0+c2QtPmxiX2dhaW5lZFtlbnYtPmlkbGVdKTsKIAkJcmV0dXJuIHA7CiAJfQogCXJldHVybiBOVUxMOwpAQCAtNjMxOSw3ICs2NTU4LDcgQEAKIAkgKiBzbyB3ZSBjYW4gc2FmZWx5IGNvbGxlY3QgZGV0YWNoX29uZV90YXNrKCkgc3RhdHMgaGVyZSByYXRoZXIKIAkgKiB0aGFuIGluc2lkZSBkZXRhY2hfb25lX3Rhc2soKS4KIAkgKi8KLQlzY2hlZHN0YXRfYWRkKGVudi0+c2QsIGxiX2dhaW5lZFtlbnYtPmlkbGVdLCBkZXRhY2hlZCk7CisJc2NoZWRzdGF0X2FkZChlbnYtPnNkLT5sYl9nYWluZWRbZW52LT5pZGxlXSwgZGV0YWNoZWQpOwogCiAJcmV0dXJuIGRldGFjaGVkOwogfQpAQCAtNjY0Nyw3ICs2ODg2LDcgQEAKIAkJLyoKIAkJICogIVNEX09WRVJMQVAgZG9tYWlucyBjYW4gYXNzdW1lIHRoYXQgY2hpbGQgZ3JvdXBzCiAJCSAqIHNwYW4gdGhlIGN1cnJlbnQgZ3JvdXAuCi0JCSAqLyAKKwkJICovCiAKIAkJZ3JvdXAgPSBjaGlsZC0+Z3JvdXBzOwogCQlkbyB7CkBAIC03MTQ3LDcgKzczODYsNyBAQAogCQlsb2FkX2Fib3ZlX2NhcGFjaXR5ID0gYnVzaWVzdC0+c3VtX25yX3J1bm5pbmcgKiBTQ0hFRF9DQVBBQ0lUWV9TQ0FMRTsKIAkJaWYgKGxvYWRfYWJvdmVfY2FwYWNpdHkgPiBidXNpZXN0LT5ncm91cF9jYXBhY2l0eSkgewogCQkJbG9hZF9hYm92ZV9jYXBhY2l0eSAtPSBidXNpZXN0LT5ncm91cF9jYXBhY2l0eTsKLQkJCWxvYWRfYWJvdmVfY2FwYWNpdHkgKj0gTklDRV8wX0xPQUQ7CisJCQlsb2FkX2Fib3ZlX2NhcGFjaXR5ICo9IHNjYWxlX2xvYWRfZG93bihOSUNFXzBfTE9BRCk7CiAJCQlsb2FkX2Fib3ZlX2NhcGFjaXR5IC89IGJ1c2llc3QtPmdyb3VwX2NhcGFjaXR5OwogCQl9IGVsc2UKIAkJCWxvYWRfYWJvdmVfY2FwYWNpdHkgPSB+MFVMOwpAQCAtNzM1NCw5ICs3NTkzLDYgQEAKICAqLwogI2RlZmluZSBNQVhfUElOTkVEX0lOVEVSVkFMCTUxMgogCi0vKiBXb3JraW5nIGNwdW1hc2sgZm9yIGxvYWRfYmFsYW5jZSBhbmQgbG9hZF9iYWxhbmNlX25ld2lkbGUuICovCi1ERUZJTkVfUEVSX0NQVShjcHVtYXNrX3Zhcl90LCBsb2FkX2JhbGFuY2VfbWFzayk7Ci0KIHN0YXRpYyBpbnQgbmVlZF9hY3RpdmVfYmFsYW5jZShzdHJ1Y3QgbGJfZW52ICplbnYpCiB7CiAJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QgPSBlbnYtPnNkOwpAQCAtNzQ2MCw3ICs3Njk2LDcgQEAKIAogCWNwdW1hc2tfY29weShjcHVzLCBjcHVfYWN0aXZlX21hc2spOwogCi0Jc2NoZWRzdGF0X2luYyhzZCwgbGJfY291bnRbaWRsZV0pOworCXNjaGVkc3RhdF9pbmMoc2QtPmxiX2NvdW50W2lkbGVdKTsKIAogcmVkbzoKIAlpZiAoIXNob3VsZF93ZV9iYWxhbmNlKCZlbnYpKSB7CkBAIC03NDcwLDE5ICs3NzA2LDE5IEBACiAKIAlncm91cCA9IGZpbmRfYnVzaWVzdF9ncm91cCgmZW52KTsKIAlpZiAoIWdyb3VwKSB7Ci0JCXNjaGVkc3RhdF9pbmMoc2QsIGxiX25vYnVzeWdbaWRsZV0pOworCQlzY2hlZHN0YXRfaW5jKHNkLT5sYl9ub2J1c3lnW2lkbGVdKTsKIAkJZ290byBvdXRfYmFsYW5jZWQ7CiAJfQogCiAJYnVzaWVzdCA9IGZpbmRfYnVzaWVzdF9xdWV1ZSgmZW52LCBncm91cCk7CiAJaWYgKCFidXNpZXN0KSB7Ci0JCXNjaGVkc3RhdF9pbmMoc2QsIGxiX25vYnVzeXFbaWRsZV0pOworCQlzY2hlZHN0YXRfaW5jKHNkLT5sYl9ub2J1c3lxW2lkbGVdKTsKIAkJZ290byBvdXRfYmFsYW5jZWQ7CiAJfQogCiAJQlVHX09OKGJ1c2llc3QgPT0gZW52LmRzdF9ycSk7CiAKLQlzY2hlZHN0YXRfYWRkKHNkLCBsYl9pbWJhbGFuY2VbaWRsZV0sIGVudi5pbWJhbGFuY2UpOworCXNjaGVkc3RhdF9hZGQoc2QtPmxiX2ltYmFsYW5jZVtpZGxlXSwgZW52LmltYmFsYW5jZSk7CiAKIAllbnYuc3JjX2NwdSA9IGJ1c2llc3QtPmNwdTsKIAllbnYuc3JjX3JxID0gYnVzaWVzdDsKQEAgLTc1ODksNyArNzgyNSw3IEBACiAJfQogCiAJaWYgKCFsZF9tb3ZlZCkgewotCQlzY2hlZHN0YXRfaW5jKHNkLCBsYl9mYWlsZWRbaWRsZV0pOworCQlzY2hlZHN0YXRfaW5jKHNkLT5sYl9mYWlsZWRbaWRsZV0pOwogCQkvKgogCQkgKiBJbmNyZW1lbnQgdGhlIGZhaWx1cmUgY291bnRlciBvbmx5IG9uIHBlcmlvZGljIGJhbGFuY2UuCiAJCSAqIFdlIGRvIG5vdCB3YW50IG5ld2lkbGUgYmFsYW5jZSwgd2hpY2ggY2FuIGJlIHZlcnkKQEAgLTc2NzIsNyArNzkwOCw3IEBACiAJICogd2UgY2FuJ3QgbWlncmF0ZSB0aGVtLiBMZXQgdGhlIGltYmFsYW5jZSBmbGFnIHNldCBzbyBwYXJlbnQgbGV2ZWwKIAkgKiBjYW4gdHJ5IHRvIG1pZ3JhdGUgdGhlbS4KIAkgKi8KLQlzY2hlZHN0YXRfaW5jKHNkLCBsYl9iYWxhbmNlZFtpZGxlXSk7CisJc2NoZWRzdGF0X2luYyhzZC0+bGJfYmFsYW5jZWRbaWRsZV0pOwogCiAJc2QtPm5yX2JhbGFuY2VfZmFpbGVkID0gMDsKIApAQCAtNzcwNCwxMSArNzk0MCwxMiBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKLXVwZGF0ZV9uZXh0X2JhbGFuY2Uoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCBjcHVfYnVzeSwgdW5zaWduZWQgbG9uZyAqbmV4dF9iYWxhbmNlKQordXBkYXRlX25leHRfYmFsYW5jZShzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgdW5zaWduZWQgbG9uZyAqbmV4dF9iYWxhbmNlKQogewogCXVuc2lnbmVkIGxvbmcgaW50ZXJ2YWwsIG5leHQ7CiAKLQlpbnRlcnZhbCA9IGdldF9zZF9iYWxhbmNlX2ludGVydmFsKHNkLCBjcHVfYnVzeSk7CisJLyogdXNlZCBieSBpZGxlIGJhbGFuY2UsIHNvIGNwdV9idXN5ID0gMCAqLworCWludGVydmFsID0gZ2V0X3NkX2JhbGFuY2VfaW50ZXJ2YWwoc2QsIDApOwogCW5leHQgPSBzZC0+bGFzdF9iYWxhbmNlICsgaW50ZXJ2YWw7CiAKIAlpZiAodGltZV9hZnRlcigqbmV4dF9iYWxhbmNlLCBuZXh0KSkKQEAgLTc3MzgsNyArNzk3NSw3IEBACiAJCXJjdV9yZWFkX2xvY2soKTsKIAkJc2QgPSByY3VfZGVyZWZlcmVuY2VfY2hlY2tfc2NoZWRfZG9tYWluKHRoaXNfcnEtPnNkKTsKIAkJaWYgKHNkKQotCQkJdXBkYXRlX25leHRfYmFsYW5jZShzZCwgMCwgJm5leHRfYmFsYW5jZSk7CisJCQl1cGRhdGVfbmV4dF9iYWxhbmNlKHNkLCAmbmV4dF9iYWxhbmNlKTsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAkJZ290byBvdXQ7CkBAIC03NzU2LDcgKzc5OTMsNyBAQAogCQkJY29udGludWU7CiAKIAkJaWYgKHRoaXNfcnEtPmF2Z19pZGxlIDwgY3Vycl9jb3N0ICsgc2QtPm1heF9uZXdpZGxlX2xiX2Nvc3QpIHsKLQkJCXVwZGF0ZV9uZXh0X2JhbGFuY2Uoc2QsIDAsICZuZXh0X2JhbGFuY2UpOworCQkJdXBkYXRlX25leHRfYmFsYW5jZShzZCwgJm5leHRfYmFsYW5jZSk7CiAJCQlicmVhazsKIAkJfQogCkBAIC03Nzc0LDcgKzgwMTEsNyBAQAogCQkJY3Vycl9jb3N0ICs9IGRvbWFpbl9jb3N0OwogCQl9CiAKLQkJdXBkYXRlX25leHRfYmFsYW5jZShzZCwgMCwgJm5leHRfYmFsYW5jZSk7CisJCXVwZGF0ZV9uZXh0X2JhbGFuY2Uoc2QsICZuZXh0X2JhbGFuY2UpOwogCiAJCS8qCiAJCSAqIFN0b3Agc2VhcmNoaW5nIGZvciB0YXNrcyB0byBwdWxsIGlmIHRoZXJlIGFyZQpAQCAtNzg2NCwxNSArODEwMSwxNSBAQAogCQkJLmlkbGUJCT0gQ1BVX0lETEUsCiAJCX07CiAKLQkJc2NoZWRzdGF0X2luYyhzZCwgYWxiX2NvdW50KTsKKwkJc2NoZWRzdGF0X2luYyhzZC0+YWxiX2NvdW50KTsKIAogCQlwID0gZGV0YWNoX29uZV90YXNrKCZlbnYpOwogCQlpZiAocCkgewotCQkJc2NoZWRzdGF0X2luYyhzZCwgYWxiX3B1c2hlZCk7CisJCQlzY2hlZHN0YXRfaW5jKHNkLT5hbGJfcHVzaGVkKTsKIAkJCS8qIEFjdGl2ZSBiYWxhbmNpbmcgZG9uZSwgcmVzZXQgdGhlIGZhaWx1cmUgY291bnRlci4gKi8KIAkJCXNkLT5ucl9iYWxhbmNlX2ZhaWxlZCA9IDA7CiAJCX0gZWxzZSB7Ci0JCQlzY2hlZHN0YXRfaW5jKHNkLCBhbGJfZmFpbGVkKTsKKwkJCXNjaGVkc3RhdF9pbmMoc2QtPmFsYl9mYWlsZWQpOwogCQl9CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtNzk2NCwxMyArODIwMSwxMyBAQAogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0Jc2QgPSByY3VfZGVyZWZlcmVuY2UocGVyX2NwdShzZF9idXN5LCBjcHUpKTsKKwlzZCA9IHJjdV9kZXJlZmVyZW5jZShwZXJfY3B1KHNkX2xsYywgY3B1KSk7CiAKIAlpZiAoIXNkIHx8ICFzZC0+bm9oel9pZGxlKQogCQlnb3RvIHVubG9jazsKIAlzZC0+bm9oel9pZGxlID0gMDsKIAotCWF0b21pY19pbmMoJnNkLT5ncm91cHMtPnNnYy0+bnJfYnVzeV9jcHVzKTsKKwlhdG9taWNfaW5jKCZzZC0+c2hhcmVkLT5ucl9idXN5X2NwdXMpOwogdW5sb2NrOgogCXJjdV9yZWFkX3VubG9jaygpOwogfQpAQCAtNzk4MSwxMyArODIxOCwxMyBAQAogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0Jc2QgPSByY3VfZGVyZWZlcmVuY2UocGVyX2NwdShzZF9idXN5LCBjcHUpKTsKKwlzZCA9IHJjdV9kZXJlZmVyZW5jZShwZXJfY3B1KHNkX2xsYywgY3B1KSk7CiAKIAlpZiAoIXNkIHx8IHNkLT5ub2h6X2lkbGUpCiAJCWdvdG8gdW5sb2NrOwogCXNkLT5ub2h6X2lkbGUgPSAxOwogCi0JYXRvbWljX2RlYygmc2QtPmdyb3Vwcy0+c2djLT5ucl9idXN5X2NwdXMpOworCWF0b21pY19kZWMoJnNkLT5zaGFyZWQtPm5yX2J1c3lfY3B1cyk7CiB1bmxvY2s6CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CkBAIC04MjE0LDggKzg0NTEsOCBAQAogc3RhdGljIGlubGluZSBib29sIG5vaHpfa2lja19uZWVkZWQoc3RydWN0IHJxICpycSkKIHsKIAl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CisJc3RydWN0IHNjaGVkX2RvbWFpbl9zaGFyZWQgKnNkczsKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKLQlzdHJ1Y3Qgc2NoZWRfZ3JvdXBfY2FwYWNpdHkgKnNnYzsKIAlpbnQgbnJfYnVzeSwgY3B1ID0gcnEtPmNwdTsKIAlib29sIGtpY2sgPSBmYWxzZTsKIApAQCAtODI0MywxMSArODQ4MCwxMyBAQAogCQlyZXR1cm4gdHJ1ZTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlzZCA9IHJjdV9kZXJlZmVyZW5jZShwZXJfY3B1KHNkX2J1c3ksIGNwdSkpOwotCWlmIChzZCkgewotCQlzZ2MgPSBzZC0+Z3JvdXBzLT5zZ2M7Ci0JCW5yX2J1c3kgPSBhdG9taWNfcmVhZCgmc2djLT5ucl9idXN5X2NwdXMpOwotCisJc2RzID0gcmN1X2RlcmVmZXJlbmNlKHBlcl9jcHUoc2RfbGxjX3NoYXJlZCwgY3B1KSk7CisJaWYgKHNkcykgeworCQkvKgorCQkgKiBYWFg6IHdyaXRlIGEgY29oZXJlbnQgY29tbWVudCBvbiB3aHkgd2UgZG8gdGhpcy4KKwkJICogU2VlIGFsc286IGh0dHA6Ly9sa21sLmtlcm5lbC5vcmcvci8yMDExMTIwMjAxMDgzMi42MDIyMDM0MTFAc2JzaWRkaGEtZGVzay5zYy5pbnRlbC5jb20KKwkJICovCisJCW5yX2J1c3kgPSBhdG9taWNfcmVhZCgmc2RzLT5ucl9idXN5X2NwdXMpOwogCQlpZiAobnJfYnVzeSA+IDEpIHsKIAkJCWtpY2sgPSB0cnVlOwogCQkJZ290byB1bmxvY2s7CkBAIC04NDQxLDcgKzg2ODAsNiBAQAogCXN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlID0gJnAtPnNlOwogCXN0cnVjdCBjZnNfcnEgKmNmc19ycSA9IGNmc19ycV9vZihzZSk7CiAJdTY0IG5vdyA9IGNmc19ycV9jbG9ja190YXNrKGNmc19ycSk7Ci0JaW50IHRnX3VwZGF0ZTsKIAogCWlmICghdnJ1bnRpbWVfbm9ybWFsaXplZChwKSkgewogCQkvKgpAQCAtODQ1MywxMCArODY5MSw5IEBACiAJfQogCiAJLyogQ2F0Y2ggdXAgd2l0aCB0aGUgY2ZzX3JxIGFuZCByZW1vdmUgb3VyIGxvYWQgd2hlbiB3ZSBsZWF2ZSAqLwotCXRnX3VwZGF0ZSA9IHVwZGF0ZV9jZnNfcnFfbG9hZF9hdmcobm93LCBjZnNfcnEsIGZhbHNlKTsKKwl1cGRhdGVfY2ZzX3JxX2xvYWRfYXZnKG5vdywgY2ZzX3JxLCBmYWxzZSk7CiAJZGV0YWNoX2VudGl0eV9sb2FkX2F2ZyhjZnNfcnEsIHNlKTsKLQlpZiAodGdfdXBkYXRlKQotCQl1cGRhdGVfdGdfbG9hZF9hdmcoY2ZzX3JxLCBmYWxzZSk7CisJdXBkYXRlX3RnX2xvYWRfYXZnKGNmc19ycSwgZmFsc2UpOwogfQogCiBzdGF0aWMgdm9pZCBhdHRhY2hfdGFza19jZnNfcnEoc3RydWN0IHRhc2tfc3RydWN0ICpwKQpAQCAtODQ2NCw3ICs4NzAxLDYgQEAKIAlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSA9ICZwLT5zZTsKIAlzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEgPSBjZnNfcnFfb2Yoc2UpOwogCXU2NCBub3cgPSBjZnNfcnFfY2xvY2tfdGFzayhjZnNfcnEpOwotCWludCB0Z191cGRhdGU7CiAKICNpZmRlZiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRAogCS8qCkBAIC04NDc1LDEwICs4NzExLDkgQEAKICNlbmRpZgogCiAJLyogU3luY2hyb25pemUgdGFzayB3aXRoIGl0cyBjZnNfcnEgKi8KLQl0Z191cGRhdGUgPSB1cGRhdGVfY2ZzX3JxX2xvYWRfYXZnKG5vdywgY2ZzX3JxLCBmYWxzZSk7CisJdXBkYXRlX2Nmc19ycV9sb2FkX2F2Zyhub3csIGNmc19ycSwgZmFsc2UpOwogCWF0dGFjaF9lbnRpdHlfbG9hZF9hdmcoY2ZzX3JxLCBzZSk7Ci0JaWYgKHRnX3VwZGF0ZSkKLQkJdXBkYXRlX3RnX2xvYWRfYXZnKGNmc19ycSwgZmFsc2UpOworCXVwZGF0ZV90Z19sb2FkX2F2ZyhjZnNfcnEsIGZhbHNlKTsKIAogCWlmICghdnJ1bnRpbWVfbm9ybWFsaXplZChwKSkKIAkJc2UtPnZydW50aW1lICs9IGNmc19ycS0+bWluX3ZydW50aW1lOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL2lkbGVfdGFzay5jIGIva2VybmVsL3NjaGVkL2lkbGVfdGFzay5jCmluZGV4IDJjZTU0NTguLjU0MDVkM2YgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9pZGxlX3Rhc2suYworKysgYi9rZXJuZWwvc2NoZWQvaWRsZV90YXNrLmMKQEAgLTI3LDggKzI3LDggQEAKIHBpY2tfbmV4dF90YXNrX2lkbGUoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2LCBzdHJ1Y3QgcGluX2Nvb2tpZSBjb29raWUpCiB7CiAJcHV0X3ByZXZfdGFzayhycSwgcHJldik7Ci0KLQlzY2hlZHN0YXRfaW5jKHJxLCBzY2hlZF9nb2lkbGUpOworCXVwZGF0ZV9pZGxlX2NvcmUocnEpOworCXNjaGVkc3RhdF9pbmMocnEtPnNjaGVkX2dvaWRsZSk7CiAJcmV0dXJuIHJxLT5pZGxlOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvcnQuYyBiL2tlcm5lbC9zY2hlZC9ydC5jCmluZGV4IGQ1NjkwYjcuLjI1MTZiOGQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9ydC5jCisrKyBiL2tlcm5lbC9zY2hlZC9ydC5jCkBAIC05NTcsOSArOTU3LDggQEAKIAlpZiAodW5saWtlbHkoKHM2NClkZWx0YV9leGVjIDw9IDApKQogCQlyZXR1cm47CiAKLQkvKiBLaWNrIGNwdWZyZXEgKHNlZSB0aGUgY29tbWVudCBpbiBsaW51eC9jcHVmcmVxLmgpLiAqLwotCWlmIChjcHVfb2YocnEpID09IHNtcF9wcm9jZXNzb3JfaWQoKSkKLQkJY3B1ZnJlcV90cmlnZ2VyX3VwZGF0ZShycV9jbG9jayhycSkpOworCS8qIEtpY2sgY3B1ZnJlcSAoc2VlIHRoZSBjb21tZW50IGluIGtlcm5lbC9zY2hlZC9zY2hlZC5oKS4gKi8KKwljcHVmcmVxX3VwZGF0ZV90aGlzX2NwdShycSwgU0NIRURfQ1BVRlJFUV9SVCk7CiAKIAlzY2hlZHN0YXRfc2V0KGN1cnItPnNlLnN0YXRpc3RpY3MuZXhlY19tYXgsCiAJCSAgICAgIG1heChjdXJyLT5zZS5zdGF0aXN0aWNzLmV4ZWNfbWF4LCBkZWx0YV9leGVjKSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvc2NoZWQuaCBiL2tlcm5lbC9zY2hlZC9zY2hlZC5oCmluZGV4IGM2NGZjNTEuLjA1NWY5MzUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9zY2hlZC5oCisrKyBiL2tlcm5lbC9zY2hlZC9zY2hlZC5oCkBAIC0yLDYgKzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQvc3lzY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC91NjRfc3RhdHNfc3luYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkL2RlYWRsaW5lLmg+CiAjaW5jbHVkZSA8bGludXgvYmluZm10cy5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CkBAIC0xNSw2ICsxNiwxMiBAQAogI2luY2x1ZGUgImNwdWRlYWRsaW5lLmgiCiAjaW5jbHVkZSAiY3B1YWNjdC5oIgogCisjaWZkZWYgQ09ORklHX1NDSEVEX0RFQlVHCisjZGVmaW5lIFNDSEVEX1dBUk5fT04oeCkJV0FSTl9PTkNFKHgsICN4KQorI2Vsc2UKKyNkZWZpbmUgU0NIRURfV0FSTl9PTih4KQkoKHZvaWQpKHgpKQorI2VuZGlmCisKIHN0cnVjdCBycTsKIHN0cnVjdCBjcHVpZGxlX3N0YXRlOwogCkBAIC01NjUsNiArNTcyLDggQEAKIAkgKi8KIAljcHVtYXNrX3Zhcl90IHJ0b19tYXNrOwogCXN0cnVjdCBjcHVwcmkgY3B1cHJpOworCisJdW5zaWduZWQgbG9uZyBtYXhfY3B1X2NhcGFjaXR5OwogfTsKIAogZXh0ZXJuIHN0cnVjdCByb290X2RvbWFpbiBkZWZfcm9vdF9kb21haW47CkBAIC01OTcsNyArNjA2LDYgQEAKICNpZmRlZiBDT05GSUdfU01QCiAJdW5zaWduZWQgbG9uZyBsYXN0X2xvYWRfdXBkYXRlX3RpY2s7CiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwotCXU2NCBub2h6X3N0YW1wOwogCXVuc2lnbmVkIGxvbmcgbm9oel9mbGFnczsKICNlbmRpZiAvKiBDT05GSUdfTk9fSFpfQ09NTU9OICovCiAjaWZkZWYgQ09ORklHX05PX0haX0ZVTEwKQEAgLTcyMyw2ICs3MzEsMjMgQEAKICNlbmRpZgogfQogCisKKyNpZmRlZiBDT05GSUdfU0NIRURfU01UCisKK2V4dGVybiBzdHJ1Y3Qgc3RhdGljX2tleV9mYWxzZSBzY2hlZF9zbXRfcHJlc2VudDsKKworZXh0ZXJuIHZvaWQgX191cGRhdGVfaWRsZV9jb3JlKHN0cnVjdCBycSAqcnEpOworCitzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX2lkbGVfY29yZShzdHJ1Y3QgcnEgKnJxKQoreworCWlmIChzdGF0aWNfYnJhbmNoX3VubGlrZWx5KCZzY2hlZF9zbXRfcHJlc2VudCkpCisJCV9fdXBkYXRlX2lkbGVfY29yZShycSk7Cit9CisKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX2lkbGVfY29yZShzdHJ1Y3QgcnEgKnJxKSB7IH0KKyNlbmRpZgorCiBERUNMQVJFX1BFUl9DUFVfU0hBUkVEX0FMSUdORUQoc3RydWN0IHJxLCBydW5xdWV1ZXMpOwogCiAjZGVmaW5lIGNwdV9ycShjcHUpCQkoJnBlcl9jcHUocnVucXVldWVzLCAoY3B1KSkpCkBAIC04NTcsOCArODgyLDggQEAKIERFQ0xBUkVfUEVSX0NQVShzdHJ1Y3Qgc2NoZWRfZG9tYWluICosIHNkX2xsYyk7CiBERUNMQVJFX1BFUl9DUFUoaW50LCBzZF9sbGNfc2l6ZSk7CiBERUNMQVJFX1BFUl9DUFUoaW50LCBzZF9sbGNfaWQpOworREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBzY2hlZF9kb21haW5fc2hhcmVkICosIHNkX2xsY19zaGFyZWQpOwogREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBzY2hlZF9kb21haW4gKiwgc2RfbnVtYSk7Ci1ERUNMQVJFX1BFUl9DUFUoc3RydWN0IHNjaGVkX2RvbWFpbiAqLCBzZF9idXN5KTsKIERFQ0xBUkVfUEVSX0NQVShzdHJ1Y3Qgc2NoZWRfZG9tYWluICosIHNkX2FzeW0pOwogCiBzdHJ1Y3Qgc2NoZWRfZ3JvdXBfY2FwYWNpdHkgewpAQCAtODcwLDEwICs4OTUsNiBAQAogCXVuc2lnbmVkIGludCBjYXBhY2l0eTsKIAl1bnNpZ25lZCBsb25nIG5leHRfdXBkYXRlOwogCWludCBpbWJhbGFuY2U7IC8qIFhYWCB1bnJlbGF0ZWQgdG8gY2FwYWNpdHkgYnV0IHNoYXJlZCBncm91cCBzdGF0ZSAqLwotCS8qCi0JICogTnVtYmVyIG9mIGJ1c3kgY3B1cyBpbiB0aGlzIGdyb3VwLgotCSAqLwotCWF0b21pY190IG5yX2J1c3lfY3B1czsKIAogCXVuc2lnbmVkIGxvbmcgY3B1bWFza1swXTsgLyogaXRlcmF0aW9uIG1hc2sgKi8KIH07CkBAIC0xMDAwLDcgKzEwMjEsMTEgQEAKIAkgKiBwZXItdGFzayBkYXRhIGhhdmUgYmVlbiBjb21wbGV0ZWQgYnkgdGhpcyBtb21lbnQuCiAJICovCiAJc21wX3dtYigpOworI2lmZGVmIENPTkZJR19USFJFQURfSU5GT19JTl9UQVNLCisJcC0+Y3B1ID0gY3B1OworI2Vsc2UKIAl0YXNrX3RocmVhZF9pbmZvKHApLT5jcHUgPSBjcHU7CisjZW5kaWYKIAlwLT53YWtlX2NwdSA9IGNwdTsKICNlbmRpZgogfQpAQCAtMTI2MCw2ICsxMjg1LDExIEBACiAJcHJldi0+c2NoZWRfY2xhc3MtPnB1dF9wcmV2X3Rhc2socnEsIHByZXYpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2N1cnJfdGFzayhzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnIpCit7CisJY3Vyci0+c2NoZWRfY2xhc3MtPnNldF9jdXJyX3Rhc2socnEpOworfQorCiAjZGVmaW5lIHNjaGVkX2NsYXNzX2hpZ2hlc3QgKCZzdG9wX3NjaGVkX2NsYXNzKQogI2RlZmluZSBmb3JfZWFjaF9jbGFzcyhjbGFzcykgXAogICAgZm9yIChjbGFzcyA9IHNjaGVkX2NsYXNzX2hpZ2hlc3Q7IGNsYXNzOyBjbGFzcyA9IGNsYXNzLT5uZXh0KQpAQCAtMTI5MCw3ICsxMzIwLDcgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqaWRsZV9nZXRfc3RhdGUoc3RydWN0IHJxICpycSkKIHsKLQlXQVJOX09OKCFyY3VfcmVhZF9sb2NrX2hlbGQoKSk7CisJU0NIRURfV0FSTl9PTighcmN1X3JlYWRfbG9ja19oZWxkKCkpOwogCXJldHVybiBycS0+aWRsZV9zdGF0ZTsKIH0KICNlbHNlCkBAIC0xNzEwLDUyICsxNzQwLDI4IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19JUlFfVElNRV9BQ0NPVU5USU5HCitzdHJ1Y3QgaXJxdGltZSB7CisJdTY0CQkJaGFyZGlycV90aW1lOworCXU2NAkJCXNvZnRpcnFfdGltZTsKKwl1NjQJCQlpcnFfc3RhcnRfdGltZTsKKwlzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMJc3luYzsKK307CiAKLURFQ0xBUkVfUEVSX0NQVSh1NjQsIGNwdV9oYXJkaXJxX3RpbWUpOwotREVDTEFSRV9QRVJfQ1BVKHU2NCwgY3B1X3NvZnRpcnFfdGltZSk7Ci0KLSNpZm5kZWYgQ09ORklHXzY0QklUCi1ERUNMQVJFX1BFUl9DUFUoc2VxY291bnRfdCwgaXJxX3RpbWVfc2VxKTsKLQotc3RhdGljIGlubGluZSB2b2lkIGlycV90aW1lX3dyaXRlX2JlZ2luKHZvaWQpCi17Ci0JX190aGlzX2NwdV9pbmMoaXJxX3RpbWVfc2VxLnNlcXVlbmNlKTsKLQlzbXBfd21iKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpcnFfdGltZV93cml0ZV9lbmQodm9pZCkKLXsKLQlzbXBfd21iKCk7Ci0JX190aGlzX2NwdV9pbmMoaXJxX3RpbWVfc2VxLnNlcXVlbmNlKTsKLX0KK0RFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgaXJxdGltZSwgY3B1X2lycXRpbWUpOwogCiBzdGF0aWMgaW5saW5lIHU2NCBpcnFfdGltZV9yZWFkKGludCBjcHUpCiB7Ci0JdTY0IGlycV90aW1lOwotCXVuc2lnbmVkIHNlcTsKKwlzdHJ1Y3QgaXJxdGltZSAqaXJxdGltZSA9ICZwZXJfY3B1KGNwdV9pcnF0aW1lLCBjcHUpOworCXVuc2lnbmVkIGludCBzZXE7CisJdTY0IHRvdGFsOwogCiAJZG8gewotCQlzZXEgPSByZWFkX3NlcWNvdW50X2JlZ2luKCZwZXJfY3B1KGlycV90aW1lX3NlcSwgY3B1KSk7Ci0JCWlycV90aW1lID0gcGVyX2NwdShjcHVfc29mdGlycV90aW1lLCBjcHUpICsKLQkJCSAgIHBlcl9jcHUoY3B1X2hhcmRpcnFfdGltZSwgY3B1KTsKLQl9IHdoaWxlIChyZWFkX3NlcWNvdW50X3JldHJ5KCZwZXJfY3B1KGlycV90aW1lX3NlcSwgY3B1KSwgc2VxKSk7CisJCXNlcSA9IF9fdTY0X3N0YXRzX2ZldGNoX2JlZ2luKCZpcnF0aW1lLT5zeW5jKTsKKwkJdG90YWwgPSBpcnF0aW1lLT5zb2Z0aXJxX3RpbWUgKyBpcnF0aW1lLT5oYXJkaXJxX3RpbWU7CisJfSB3aGlsZSAoX191NjRfc3RhdHNfZmV0Y2hfcmV0cnkoJmlycXRpbWUtPnN5bmMsIHNlcSkpOwogCi0JcmV0dXJuIGlycV90aW1lOworCXJldHVybiB0b3RhbDsKIH0KLSNlbHNlIC8qIENPTkZJR182NEJJVCAqLwotc3RhdGljIGlubGluZSB2b2lkIGlycV90aW1lX3dyaXRlX2JlZ2luKHZvaWQpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpcnFfdGltZV93cml0ZV9lbmQodm9pZCkKLXsKLX0KLQotc3RhdGljIGlubGluZSB1NjQgaXJxX3RpbWVfcmVhZChpbnQgY3B1KQotewotCXJldHVybiBwZXJfY3B1KGNwdV9zb2Z0aXJxX3RpbWUsIGNwdSkgKyBwZXJfY3B1KGNwdV9oYXJkaXJxX3RpbWUsIGNwdSk7Ci19Ci0jZW5kaWYgLyogQ09ORklHXzY0QklUICovCiAjZW5kaWYgLyogQ09ORklHX0lSUV9USU1FX0FDQ09VTlRJTkcgKi8KIAogI2lmZGVmIENPTkZJR19DUFVfRlJFUQpAQCAtMTc2MywyNyArMTc2OSwxMyBAQAogCiAvKioKICAqIGNwdWZyZXFfdXBkYXRlX3V0aWwgLSBUYWtlIGEgbm90ZSBhYm91dCBDUFUgdXRpbGl6YXRpb24gY2hhbmdlcy4KLSAqIEB0aW1lOiBDdXJyZW50IHRpbWUuCi0gKiBAdXRpbDogQ3VycmVudCB1dGlsaXphdGlvbi4KLSAqIEBtYXg6IFV0aWxpemF0aW9uIGNlaWxpbmcuCisgKiBAcnE6IFJ1bnF1ZXVlIHRvIGNhcnJ5IG91dCB0aGUgdXBkYXRlIGZvci4KKyAqIEBmbGFnczogVXBkYXRlIHJlYXNvbiBmbGFncy4KICAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgc2NoZWR1bGVyIG9uIGV2ZXJ5IGludm9jYXRpb24gb2YKLSAqIHVwZGF0ZV9sb2FkX2F2ZygpIG9uIHRoZSBDUFUgd2hvc2UgdXRpbGl6YXRpb24gaXMgYmVpbmcgdXBkYXRlZC4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBzY2hlZHVsZXIgb24gdGhlIENQVSB3aG9zZSB1dGlsaXphdGlvbiBpcworICogYmVpbmcgdXBkYXRlZC4KICAqCiAgKiBJdCBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSBSQ1Utc2NoZWQgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgY3B1ZnJlcV91cGRhdGVfdXRpbCh1NjQgdGltZSwgdW5zaWduZWQgbG9uZyB1dGlsLCB1bnNpZ25lZCBsb25nIG1heCkKLXsKLSAgICAgICBzdHJ1Y3QgdXBkYXRlX3V0aWxfZGF0YSAqZGF0YTsKLQotICAgICAgIGRhdGEgPSByY3VfZGVyZWZlcmVuY2Vfc2NoZWQoKnRoaXNfY3B1X3B0cigmY3B1ZnJlcV91cGRhdGVfdXRpbF9kYXRhKSk7Ci0gICAgICAgaWYgKGRhdGEpCi0gICAgICAgICAgICAgICBkYXRhLT5mdW5jKGRhdGEsIHRpbWUsIHV0aWwsIG1heCk7Ci19Ci0KLS8qKgotICogY3B1ZnJlcV90cmlnZ2VyX3VwZGF0ZSAtIFRyaWdnZXIgQ1BVIHBlcmZvcm1hbmNlIHN0YXRlIGV2YWx1YXRpb24gaWYgbmVlZGVkLgotICogQHRpbWU6IEN1cnJlbnQgdGltZS4KICAqCiAgKiBUaGUgd2F5IGNwdWZyZXEgaXMgY3VycmVudGx5IGFycmFuZ2VkIHJlcXVpcmVzIGl0IHRvIGV2YWx1YXRlIHRoZSBDUFUKICAqIHBlcmZvcm1hbmNlIHN0YXRlIChmcmVxdWVuY3kvdm9sdGFnZSkgb24gYSByZWd1bGFyIGJhc2lzIHRvIHByZXZlbnQgaXQgZnJvbQpAQCAtMTc5NywxMyArMTc4OSwyMyBAQAogICogYnV0IHRoYXQgcmVhbGx5IGlzIGEgYmFuZC1haWQuICBHb2luZyBmb3J3YXJkIGl0IHNob3VsZCBiZSByZXBsYWNlZCB3aXRoCiAgKiBzb2x1dGlvbnMgdGFyZ2V0ZWQgbW9yZSBzcGVjaWZpY2FsbHkgYXQgUlQgYW5kIERMIHRhc2tzLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgY3B1ZnJlcV90cmlnZ2VyX3VwZGF0ZSh1NjQgdGltZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVmcmVxX3VwZGF0ZV91dGlsKHN0cnVjdCBycSAqcnEsIHVuc2lnbmVkIGludCBmbGFncykKIHsKLQljcHVmcmVxX3VwZGF0ZV91dGlsKHRpbWUsIFVMT05HX01BWCwgMCk7CisJc3RydWN0IHVwZGF0ZV91dGlsX2RhdGEgKmRhdGE7CisKKwlkYXRhID0gcmN1X2RlcmVmZXJlbmNlX3NjaGVkKCp0aGlzX2NwdV9wdHIoJmNwdWZyZXFfdXBkYXRlX3V0aWxfZGF0YSkpOworCWlmIChkYXRhKQorCQlkYXRhLT5mdW5jKGRhdGEsIHJxX2Nsb2NrKHJxKSwgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1ZnJlcV91cGRhdGVfdGhpc19jcHUoc3RydWN0IHJxICpycSwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCWlmIChjcHVfb2YocnEpID09IHNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJY3B1ZnJlcV91cGRhdGVfdXRpbChycSwgZmxhZ3MpOwogfQogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBjcHVmcmVxX3VwZGF0ZV91dGlsKHU2NCB0aW1lLCB1bnNpZ25lZCBsb25nIHV0aWwsIHVuc2lnbmVkIGxvbmcgbWF4KSB7fQotc3RhdGljIGlubGluZSB2b2lkIGNwdWZyZXFfdHJpZ2dlcl91cGRhdGUodTY0IHRpbWUpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgY3B1ZnJlcV91cGRhdGVfdXRpbChzdHJ1Y3QgcnEgKnJxLCB1bnNpZ25lZCBpbnQgZmxhZ3MpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgY3B1ZnJlcV91cGRhdGVfdGhpc19jcHUoc3RydWN0IHJxICpycSwgdW5zaWduZWQgaW50IGZsYWdzKSB7fQogI2VuZGlmIC8qIENPTkZJR19DUFVfRlJFUSAqLwogCiAjaWZkZWYgYXJjaF9zY2FsZV9mcmVxX2NhcGFjaXR5CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvc3RhdHMuaCBiL2tlcm5lbC9zY2hlZC9zdGF0cy5oCmluZGV4IDc4OTU1Y2IuLjM0NjU5YTggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9zdGF0cy5oCisrKyBiL2tlcm5lbC9zY2hlZC9zdGF0cy5oCkBAIC0yOSwxMSArMjksMTIgQEAKIAlpZiAocnEpCiAJCXJxLT5ycV9zY2hlZF9pbmZvLnJ1bl9kZWxheSArPSBkZWx0YTsKIH0KLSMgZGVmaW5lIHNjaGVkc3RhdF9lbmFibGVkKCkJCXN0YXRpY19icmFuY2hfdW5saWtlbHkoJnNjaGVkX3NjaGVkc3RhdHMpCi0jIGRlZmluZSBzY2hlZHN0YXRfaW5jKHJxLCBmaWVsZCkJZG8geyBpZiAoc2NoZWRzdGF0X2VuYWJsZWQoKSkgeyAocnEpLT5maWVsZCsrOyB9IH0gd2hpbGUgKDApCi0jIGRlZmluZSBzY2hlZHN0YXRfYWRkKHJxLCBmaWVsZCwgYW10KQlkbyB7IGlmIChzY2hlZHN0YXRfZW5hYmxlZCgpKSB7IChycSktPmZpZWxkICs9IChhbXQpOyB9IH0gd2hpbGUgKDApCi0jIGRlZmluZSBzY2hlZHN0YXRfc2V0KHZhciwgdmFsKQlkbyB7IGlmIChzY2hlZHN0YXRfZW5hYmxlZCgpKSB7IHZhciA9ICh2YWwpOyB9IH0gd2hpbGUgKDApCi0jIGRlZmluZSBzY2hlZHN0YXRfdmFsKHJxLCBmaWVsZCkJKChzY2hlZHN0YXRfZW5hYmxlZCgpKSA/IChycSktPmZpZWxkIDogMCkKKyNkZWZpbmUgc2NoZWRzdGF0X2VuYWJsZWQoKQkJc3RhdGljX2JyYW5jaF91bmxpa2VseSgmc2NoZWRfc2NoZWRzdGF0cykKKyNkZWZpbmUgc2NoZWRzdGF0X2luYyh2YXIpCQlkbyB7IGlmIChzY2hlZHN0YXRfZW5hYmxlZCgpKSB7IHZhcisrOyB9IH0gd2hpbGUgKDApCisjZGVmaW5lIHNjaGVkc3RhdF9hZGQodmFyLCBhbXQpCQlkbyB7IGlmIChzY2hlZHN0YXRfZW5hYmxlZCgpKSB7IHZhciArPSAoYW10KTsgfSB9IHdoaWxlICgwKQorI2RlZmluZSBzY2hlZHN0YXRfc2V0KHZhciwgdmFsKQkJZG8geyBpZiAoc2NoZWRzdGF0X2VuYWJsZWQoKSkgeyB2YXIgPSAodmFsKTsgfSB9IHdoaWxlICgwKQorI2RlZmluZSBzY2hlZHN0YXRfdmFsKHZhcikJCSh2YXIpCisjZGVmaW5lIHNjaGVkc3RhdF92YWxfb3JfemVybyh2YXIpCSgoc2NoZWRzdGF0X2VuYWJsZWQoKSkgPyAodmFyKSA6IDApCiAKICNlbHNlIC8qICFDT05GSUdfU0NIRURTVEFUUyAqLwogc3RhdGljIGlubGluZSB2b2lkCkBAIC00NSwxMiArNDYsMTMgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogcnFfc2NoZWRfaW5mb19kZXBhcnQoc3RydWN0IHJxICpycSwgdW5zaWduZWQgbG9uZyBsb25nIGRlbHRhKQoge30KLSMgZGVmaW5lIHNjaGVkc3RhdF9lbmFibGVkKCkJCTAKLSMgZGVmaW5lIHNjaGVkc3RhdF9pbmMocnEsIGZpZWxkKQlkbyB7IH0gd2hpbGUgKDApCi0jIGRlZmluZSBzY2hlZHN0YXRfYWRkKHJxLCBmaWVsZCwgYW10KQlkbyB7IH0gd2hpbGUgKDApCi0jIGRlZmluZSBzY2hlZHN0YXRfc2V0KHZhciwgdmFsKQlkbyB7IH0gd2hpbGUgKDApCi0jIGRlZmluZSBzY2hlZHN0YXRfdmFsKHJxLCBmaWVsZCkJMAotI2VuZGlmCisjZGVmaW5lIHNjaGVkc3RhdF9lbmFibGVkKCkJCTAKKyNkZWZpbmUgc2NoZWRzdGF0X2luYyh2YXIpCQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHNjaGVkc3RhdF9hZGQodmFyLCBhbXQpCQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHNjaGVkc3RhdF9zZXQodmFyLCB2YWwpCQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHNjaGVkc3RhdF92YWwodmFyKQkJMAorI2RlZmluZSBzY2hlZHN0YXRfdmFsX29yX3plcm8odmFyKQkwCisjZW5kaWYgLyogQ09ORklHX1NDSEVEU1RBVFMgKi8KIAogI2lmZGVmIENPTkZJR19TQ0hFRF9JTkZPCiBzdGF0aWMgaW5saW5lIHZvaWQgc2NoZWRfaW5mb19yZXNldF9kZXF1ZXVlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvd2FpdC5jIGIva2VybmVsL3NjaGVkL3dhaXQuYwppbmRleCBmMTVkNmI2Li40ZjcwNTM1IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvd2FpdC5jCisrKyBiL2tlcm5lbC9zY2hlZC93YWl0LmMKQEAgLTE5NiwyNyArMTk2LDQ4IEBACiB9CiBFWFBPUlRfU1lNQk9MKHByZXBhcmVfdG9fd2FpdF9leGNsdXNpdmUpOwogCit2b2lkIGluaXRfd2FpdF9lbnRyeSh3YWl0X3F1ZXVlX3QgKndhaXQsIGludCBmbGFncykKK3sKKwl3YWl0LT5mbGFncyA9IGZsYWdzOworCXdhaXQtPnByaXZhdGUgPSBjdXJyZW50OworCXdhaXQtPmZ1bmMgPSBhdXRvcmVtb3ZlX3dha2VfZnVuY3Rpb247CisJSU5JVF9MSVNUX0hFQUQoJndhaXQtPnRhc2tfbGlzdCk7Cit9CitFWFBPUlRfU1lNQk9MKGluaXRfd2FpdF9lbnRyeSk7CisKIGxvbmcgcHJlcGFyZV90b193YWl0X2V2ZW50KHdhaXRfcXVldWVfaGVhZF90ICpxLCB3YWl0X3F1ZXVlX3QgKndhaXQsIGludCBzdGF0ZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKHNpZ25hbF9wZW5kaW5nX3N0YXRlKHN0YXRlLCBjdXJyZW50KSkKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQotCXdhaXQtPnByaXZhdGUgPSBjdXJyZW50OwotCXdhaXQtPmZ1bmMgPSBhdXRvcmVtb3ZlX3dha2VfZnVuY3Rpb247CisJbG9uZyByZXQgPSAwOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnEtPmxvY2ssIGZsYWdzKTsKLQlpZiAobGlzdF9lbXB0eSgmd2FpdC0+dGFza19saXN0KSkgewotCQlpZiAod2FpdC0+ZmxhZ3MgJiBXUV9GTEFHX0VYQ0xVU0lWRSkKLQkJCV9fYWRkX3dhaXRfcXVldWVfdGFpbChxLCB3YWl0KTsKLQkJZWxzZQotCQkJX19hZGRfd2FpdF9xdWV1ZShxLCB3YWl0KTsKKwlpZiAodW5saWtlbHkoc2lnbmFsX3BlbmRpbmdfc3RhdGUoc3RhdGUsIGN1cnJlbnQpKSkgeworCQkvKgorCQkgKiBFeGNsdXNpdmUgd2FpdGVyIG11c3Qgbm90IGZhaWwgaWYgaXQgd2FzIHNlbGVjdGVkIGJ5IHdha2V1cCwKKwkJICogaXQgc2hvdWxkICJjb25zdW1lIiB0aGUgY29uZGl0aW9uIHdlIHdlcmUgd2FpdGluZyBmb3IuCisJCSAqCisJCSAqIFRoZSBjYWxsZXIgd2lsbCByZWNoZWNrIHRoZSBjb25kaXRpb24gYW5kIHJldHVybiBzdWNjZXNzIGlmCisJCSAqIHdlIHdlcmUgYWxyZWFkeSB3b2tlbiB1cCwgd2UgY2FuIG5vdCBtaXNzIHRoZSBldmVudCBiZWNhdXNlCisJCSAqIHdha2V1cCBsb2Nrcy91bmxvY2tzIHRoZSBzYW1lIHEtPmxvY2suCisJCSAqCisJCSAqIEJ1dCB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHNldC1jb25kaXRpb24gKyB3YWtldXAgYWZ0ZXIgdGhhdAorCQkgKiBjYW4ndCBzZWUgdXMsIGl0IHNob3VsZCB3YWtlIHVwIGFub3RoZXIgZXhjbHVzaXZlIHdhaXRlciBpZgorCQkgKiB3ZSBmYWlsLgorCQkgKi8KKwkJbGlzdF9kZWxfaW5pdCgmd2FpdC0+dGFza19saXN0KTsKKwkJcmV0ID0gLUVSRVNUQVJUU1lTOworCX0gZWxzZSB7CisJCWlmIChsaXN0X2VtcHR5KCZ3YWl0LT50YXNrX2xpc3QpKSB7CisJCQlpZiAod2FpdC0+ZmxhZ3MgJiBXUV9GTEFHX0VYQ0xVU0lWRSkKKwkJCQlfX2FkZF93YWl0X3F1ZXVlX3RhaWwocSwgd2FpdCk7CisJCQllbHNlCisJCQkJX19hZGRfd2FpdF9xdWV1ZShxLCB3YWl0KTsKKwkJfQorCQlzZXRfY3VycmVudF9zdGF0ZShzdGF0ZSk7CiAJfQotCXNldF9jdXJyZW50X3N0YXRlKHN0YXRlKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxLT5sb2NrLCBmbGFncyk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChwcmVwYXJlX3RvX3dhaXRfZXZlbnQpOwogCkBAIC0yNTUsMzkgKzI3Niw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGZpbmlzaF93YWl0KTsKIAotLyoqCi0gKiBhYm9ydF9leGNsdXNpdmVfd2FpdCAtIGFib3J0IGV4Y2x1c2l2ZSB3YWl0aW5nIGluIGEgcXVldWUKLSAqIEBxOiB3YWl0cXVldWUgd2FpdGVkIG9uCi0gKiBAd2FpdDogd2FpdCBkZXNjcmlwdG9yCi0gKiBAbW9kZTogcnVuc3RhdGUgb2YgdGhlIHdhaXRlciB0byBiZSB3b2tlbgotICogQGtleToga2V5IHRvIGlkZW50aWZ5IGEgd2FpdCBiaXQgcXVldWUgb3IgJU5VTEwKLSAqCi0gKiBTZXRzIGN1cnJlbnQgdGhyZWFkIGJhY2sgdG8gcnVubmluZyBzdGF0ZSBhbmQgcmVtb3ZlcwotICogdGhlIHdhaXQgZGVzY3JpcHRvciBmcm9tIHRoZSBnaXZlbiB3YWl0cXVldWUgaWYgc3RpbGwKLSAqIHF1ZXVlZC4KLSAqCi0gKiBXYWtlcyB1cCB0aGUgbmV4dCB3YWl0ZXIgaWYgdGhlIGNhbGxlciBpcyBjb25jdXJyZW50bHkKLSAqIHdva2VuIHVwIHRocm91Z2ggdGhlIHF1ZXVlLgotICoKLSAqIFRoaXMgcHJldmVudHMgd2FpdGVyIHN0YXJ2YXRpb24gd2hlcmUgYW4gZXhjbHVzaXZlIHdhaXRlcgotICogYWJvcnRzIGFuZCBpcyB3b2tlbiB1cCBjb25jdXJyZW50bHkgYW5kIG5vIG9uZSB3YWtlcyB1cAotICogdGhlIG5leHQgd2FpdGVyLgotICovCi12b2lkIGFib3J0X2V4Y2x1c2l2ZV93YWl0KHdhaXRfcXVldWVfaGVhZF90ICpxLCB3YWl0X3F1ZXVlX3QgKndhaXQsCi0JCQl1bnNpZ25lZCBpbnQgbW9kZSwgdm9pZCAqa2V5KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnEtPmxvY2ssIGZsYWdzKTsKLQlpZiAoIWxpc3RfZW1wdHkoJndhaXQtPnRhc2tfbGlzdCkpCi0JCWxpc3RfZGVsX2luaXQoJndhaXQtPnRhc2tfbGlzdCk7Ci0JZWxzZSBpZiAod2FpdHF1ZXVlX2FjdGl2ZShxKSkKLQkJX193YWtlX3VwX2xvY2tlZF9rZXkocSwgbW9kZSwga2V5KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxLT5sb2NrLCBmbGFncyk7Ci19Ci1FWFBPUlRfU1lNQk9MKGFib3J0X2V4Y2x1c2l2ZV93YWl0KTsKLQogaW50IGF1dG9yZW1vdmVfd2FrZV9mdW5jdGlvbih3YWl0X3F1ZXVlX3QgKndhaXQsIHVuc2lnbmVkIG1vZGUsIGludCBzeW5jLCB2b2lkICprZXkpCiB7CiAJaW50IHJldCA9IGRlZmF1bHRfd2FrZV9mdW5jdGlvbih3YWl0LCBtb2RlLCBzeW5jLCBrZXkpOwpAQCAtNDI1LDIwICs0MTMsMjkgQEAKIF9fd2FpdF9vbl9iaXRfbG9jayh3YWl0X3F1ZXVlX2hlYWRfdCAqd3EsIHN0cnVjdCB3YWl0X2JpdF9xdWV1ZSAqcSwKIAkJCXdhaXRfYml0X2FjdGlvbl9mICphY3Rpb24sIHVuc2lnbmVkIG1vZGUpCiB7Ci0JZG8gewotCQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCisJZm9yICg7OykgewogCQlwcmVwYXJlX3RvX3dhaXRfZXhjbHVzaXZlKHdxLCAmcS0+d2FpdCwgbW9kZSk7Ci0JCWlmICghdGVzdF9iaXQocS0+a2V5LmJpdF9uciwgcS0+a2V5LmZsYWdzKSkKLQkJCWNvbnRpbnVlOwotCQlyZXQgPSBhY3Rpb24oJnEtPmtleSwgbW9kZSk7Ci0JCWlmICghcmV0KQotCQkJY29udGludWU7Ci0JCWFib3J0X2V4Y2x1c2l2ZV93YWl0KHdxLCAmcS0+d2FpdCwgbW9kZSwgJnEtPmtleSk7Ci0JCXJldHVybiByZXQ7Ci0JfSB3aGlsZSAodGVzdF9hbmRfc2V0X2JpdChxLT5rZXkuYml0X25yLCBxLT5rZXkuZmxhZ3MpKTsKLQlmaW5pc2hfd2FpdCh3cSwgJnEtPndhaXQpOwotCXJldHVybiAwOworCQlpZiAodGVzdF9iaXQocS0+a2V5LmJpdF9uciwgcS0+a2V5LmZsYWdzKSkgeworCQkJcmV0ID0gYWN0aW9uKCZxLT5rZXksIG1vZGUpOworCQkJLyoKKwkJCSAqIFNlZSB0aGUgY29tbWVudCBpbiBwcmVwYXJlX3RvX3dhaXRfZXZlbnQoKS4KKwkJCSAqIGZpbmlzaF93YWl0KCkgZG9lcyBub3QgbmVjZXNzYXJpbHkgdGFrZXMgd3EtPmxvY2ssCisJCQkgKiBidXQgdGVzdF9hbmRfc2V0X2JpdCgpIGltcGxpZXMgbWIoKSB3aGljaCBwYWlycyB3aXRoCisJCQkgKiBzbXBfbWJfX2FmdGVyX2F0b21pYygpIGJlZm9yZSB3YWtlX3VwX3BhZ2UoKS4KKwkJCSAqLworCQkJaWYgKHJldCkKKwkJCQlmaW5pc2hfd2FpdCh3cSwgJnEtPndhaXQpOworCQl9CisJCWlmICghdGVzdF9hbmRfc2V0X2JpdChxLT5rZXkuYml0X25yLCBxLT5rZXkuZmxhZ3MpKSB7CisJCQlpZiAoIXJldCkKKwkJCQlmaW5pc2hfd2FpdCh3cSwgJnEtPndhaXQpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAocmV0KSB7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQogfQogRVhQT1JUX1NZTUJPTChfX3dhaXRfb25fYml0X2xvY2spOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvc2VjY29tcC5jIGIva2VybmVsL3NlY2NvbXAuYwppbmRleCBlZjZjNmMzLi4wZGI3YzhhIDEwMDY0NAotLS0gYS9rZXJuZWwvc2VjY29tcC5jCisrKyBiL2tlcm5lbC9zZWNjb21wLmMKQEAgLTYwNSwxMiArNjA1LDE2IEBACiAJCXB0cmFjZV9ldmVudChQVFJBQ0VfRVZFTlRfU0VDQ09NUCwgZGF0YSk7CiAJCS8qCiAJCSAqIFRoZSBkZWxpdmVyeSBvZiBhIGZhdGFsIHNpZ25hbCBkdXJpbmcgZXZlbnQKLQkJICogbm90aWZpY2F0aW9uIG1heSBzaWxlbnRseSBza2lwIHRyYWNlciBub3RpZmljYXRpb24uCi0JCSAqIFRlcm1pbmF0aW5nIHRoZSB0YXNrIG5vdyBhdm9pZHMgZXhlY3V0aW5nIGEgc3lzdGVtCi0JCSAqIGNhbGwgdGhhdCBtYXkgbm90IGJlIGludGVuZGVkLgorCQkgKiBub3RpZmljYXRpb24gbWF5IHNpbGVudGx5IHNraXAgdHJhY2VyIG5vdGlmaWNhdGlvbiwKKwkJICogd2hpY2ggY291bGQgbGVhdmUgdXMgd2l0aCBhIHBvdGVudGlhbGx5IHVubW9kaWZpZWQKKwkJICogc3lzY2FsbCB0aGF0IHRoZSB0cmFjZXIgd291bGQgaGF2ZSBsaWtlZCB0byBoYXZlCisJCSAqIGNoYW5nZWQuIFNpbmNlIHRoZSBwcm9jZXNzIGlzIGFib3V0IHRvIGRpZSwgd2UganVzdAorCQkgKiBmb3JjZSB0aGUgc3lzY2FsbCB0byBiZSBza2lwcGVkIGFuZCBsZXQgdGhlIHNpZ25hbAorCQkgKiBraWxsIHRoZSBwcm9jZXNzIGFuZCBjb3JyZWN0bHkgaGFuZGxlIGFueSB0cmFjZXIgZXhpdAorCQkgKiBub3RpZmljYXRpb25zLgogCQkgKi8KIAkJaWYgKGZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJZG9fZXhpdChTSUdTWVMpOworCQkJZ290byBza2lwOwogCQkvKiBDaGVjayBpZiB0aGUgdHJhY2VyIGZvcmNlZCB0aGUgc3lzY2FsbCB0byBiZSBza2lwcGVkLiAqLwogCQl0aGlzX3N5c2NhbGwgPSBzeXNjYWxsX2dldF9ucihjdXJyZW50LCB0YXNrX3B0X3JlZ3MoY3VycmVudCkpOwogCQlpZiAodGhpc19zeXNjYWxsIDwgMCkKZGlmZiAtLWdpdCBhL2tlcm5lbC9zaWduYWwuYyBiL2tlcm5lbC9zaWduYWwuYwppbmRleCBhZjIxYWZjLi43NTc2MWFjIDEwMDY0NAotLS0gYS9rZXJuZWwvc2lnbmFsLmMKKysrIGIva2VybmVsL3NpZ25hbC5jCkBAIC0zMDQ0LDYgKzMwNDQsMTEgQEAKIH0KIEVYUE9SVF9TWU1CT0woa2VybmVsX3NpZ2FjdGlvbik7CiAKK3ZvaWQgX193ZWFrIHNpZ2FjdGlvbl9jb21wYXRfYWJpKHN0cnVjdCBrX3NpZ2FjdGlvbiAqYWN0LAorCQlzdHJ1Y3Qga19zaWdhY3Rpb24gKm9hY3QpCit7Cit9CisKIGludCBkb19zaWdhY3Rpb24oaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICphY3QsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqb2FjdCkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAgPSBjdXJyZW50LCAqdDsKQEAgLTMwNTksNiArMzA2NCw4IEBACiAJaWYgKG9hY3QpCiAJCSpvYWN0ID0gKms7CiAKKwlzaWdhY3Rpb25fY29tcGF0X2FiaShhY3QsIG9hY3QpOworCiAJaWYgKGFjdCkgewogCQlzaWdkZWxzZXRtYXNrKCZhY3QtPnNhLnNhX21hc2ssCiAJCQkgICAgICBzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdTVE9QKSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc21wLmMgYi9rZXJuZWwvc21wLmMKaW5kZXggM2FhNjQyZC4uYmJhM2IyMCAxMDA2NDQKLS0tIGEva2VybmVsL3NtcC5jCisrKyBiL2tlcm5lbC9zbXAuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaHlwZXJ2aXNvci5oPgogCiAjaW5jbHVkZSAic21wYm9vdC5oIgogCkBAIC03MjQsMyArNzI1LDU0IEBACiAJcHJlZW1wdF9lbmFibGUoKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHdha2VfdXBfYWxsX2lkbGVfY3B1cyk7CisKKy8qKgorICogc21wX2NhbGxfb25fY3B1IC0gQ2FsbCBhIGZ1bmN0aW9uIG9uIGEgc3BlY2lmaWMgY3B1CisgKgorICogVXNlZCB0byBjYWxsIGEgZnVuY3Rpb24gb24gYSBzcGVjaWZpYyBjcHUgYW5kIHdhaXQgZm9yIGl0IHRvIHJldHVybi4KKyAqIE9wdGlvbmFsbHkgbWFrZSBzdXJlIHRoZSBjYWxsIGlzIGRvbmUgb24gYSBzcGVjaWZpZWQgcGh5c2ljYWwgY3B1IHZpYSB2Y3B1CisgKiBwaW5uaW5nIGluIG9yZGVyIHRvIHN1cHBvcnQgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLgorICovCitzdHJ1Y3Qgc21wX2NhbGxfb25fY3B1X3N0cnVjdCB7CisJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CisJc3RydWN0IGNvbXBsZXRpb24JZG9uZTsKKwlpbnQJCQkoKmZ1bmMpKHZvaWQgKik7CisJdm9pZAkJCSpkYXRhOworCWludAkJCXJldDsKKwlpbnQJCQljcHU7Cit9OworCitzdGF0aWMgdm9pZCBzbXBfY2FsbF9vbl9jcHVfY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBzbXBfY2FsbF9vbl9jcHVfc3RydWN0ICpzc2NzOworCisJc3NjcyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc21wX2NhbGxfb25fY3B1X3N0cnVjdCwgd29yayk7CisJaWYgKHNzY3MtPmNwdSA+PSAwKQorCQloeXBlcnZpc29yX3Bpbl92Y3B1KHNzY3MtPmNwdSk7CisJc3Njcy0+cmV0ID0gc3Njcy0+ZnVuYyhzc2NzLT5kYXRhKTsKKwlpZiAoc3Njcy0+Y3B1ID49IDApCisJCWh5cGVydmlzb3JfcGluX3ZjcHUoLTEpOworCisJY29tcGxldGUoJnNzY3MtPmRvbmUpOworfQorCitpbnQgc21wX2NhbGxfb25fY3B1KHVuc2lnbmVkIGludCBjcHUsIGludCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKnBhciwgYm9vbCBwaHlzKQoreworCXN0cnVjdCBzbXBfY2FsbF9vbl9jcHVfc3RydWN0IHNzY3MgPSB7CisJCS5kb25lID0gQ09NUExFVElPTl9JTklUSUFMSVpFUl9PTlNUQUNLKHNzY3MuZG9uZSksCisJCS5mdW5jID0gZnVuYywKKwkJLmRhdGEgPSBwYXIsCisJCS5jcHUgID0gcGh5cyA/IGNwdSA6IC0xLAorCX07CisKKwlJTklUX1dPUktfT05TVEFDSygmc3Njcy53b3JrLCBzbXBfY2FsbF9vbl9jcHVfY2FsbGJhY2spOworCisJaWYgKGNwdSA+PSBucl9jcHVfaWRzIHx8ICFjcHVfb25saW5lKGNwdSkpCisJCXJldHVybiAtRU5YSU87CisKKwlxdWV1ZV93b3JrX29uKGNwdSwgc3lzdGVtX3dxLCAmc3Njcy53b3JrKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZzc2NzLmRvbmUpOworCisJcmV0dXJuIHNzY3MucmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc21wX2NhbGxfb25fY3B1KTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zbXBib290LmMgYi9rZXJuZWwvc21wYm9vdC5jCmluZGV4IDEzYmM0M2QuLmZjMGQ4MjcwIDEwMDY0NAotLS0gYS9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2tlcm5lbC9zbXBib290LmMKQEAgLTEyMiwxMiArMTIyLDEyIEBACiAKIAkJaWYgKGt0aHJlYWRfc2hvdWxkX3BhcmsoKSkgewogCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCQkJcHJlZW1wdF9lbmFibGUoKTsKIAkJCWlmIChodC0+cGFyayAmJiB0ZC0+c3RhdHVzID09IEhQX1RIUkVBRF9BQ1RJVkUpIHsKIAkJCQlCVUdfT04odGQtPmNwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCQkJCWh0LT5wYXJrKHRkLT5jcHUpOwogCQkJCXRkLT5zdGF0dXMgPSBIUF9USFJFQURfUEFSS0VEOwogCQkJfQorCQkJcHJlZW1wdF9lbmFibGUoKTsKIAkJCWt0aHJlYWRfcGFya21lKCk7CiAJCQkvKiBXZSBtaWdodCBoYXZlIGJlZW4gd29rZW4gZm9yIHN0b3AgKi8KIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NvZnRpcnEuYyBiL2tlcm5lbC9zb2Z0aXJxLmMKaW5kZXggMTdjYWY0Yi4uNjY3NjI2NCAxMDA2NDQKLS0tIGEva2VybmVsL3NvZnRpcnEuYworKysgYi9rZXJuZWwvc29mdGlycS5jCkBAIC03OCw2ICs3OCwxNyBAQAogfQogCiAvKgorICogSWYga3NvZnRpcnFkIGlzIHNjaGVkdWxlZCwgd2UgZG8gbm90IHdhbnQgdG8gcHJvY2VzcyBwZW5kaW5nIHNvZnRpcnFzCisgKiByaWdodCBub3cuIExldCBrc29mdGlycWQgaGFuZGxlIHRoaXMgYXQgaXRzIG93biByYXRlLCB0byBnZXQgZmFpcm5lc3MuCisgKi8KK3N0YXRpYyBib29sIGtzb2Z0aXJxZF9ydW5uaW5nKHZvaWQpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBfX3RoaXNfY3B1X3JlYWQoa3NvZnRpcnFkKTsKKworCXJldHVybiB0c2sgJiYgKHRzay0+c3RhdGUgPT0gVEFTS19SVU5OSU5HKTsKK30KKworLyoKICAqIHByZWVtcHRfY291bnQgYW5kIFNPRlRJUlFfT0ZGU0VUIHVzYWdlOgogICogLSBwcmVlbXB0X2NvdW50IGlzIGNoYW5nZWQgYnkgU09GVElSUV9PRkZTRVQgb24gZW50ZXJpbmcgb3IgbGVhdmluZwogICogICBzb2Z0aXJxIHByb2Nlc3NpbmcuCkBAIC0zMTMsNyArMzI0LDcgQEAKIAogCXBlbmRpbmcgPSBsb2NhbF9zb2Z0aXJxX3BlbmRpbmcoKTsKIAotCWlmIChwZW5kaW5nKQorCWlmIChwZW5kaW5nICYmICFrc29mdGlycWRfcnVubmluZygpKQogCQlkb19zb2Z0aXJxX293bl9zdGFjaygpOwogCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwpAQCAtMzQwLDYgKzM1MSw5IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbnZva2Vfc29mdGlycSh2b2lkKQogeworCWlmIChrc29mdGlycWRfcnVubmluZygpKQorCQlyZXR1cm47CisKIAlpZiAoIWZvcmNlX2lycXRocmVhZHMpIHsKICNpZmRlZiBDT05GSUdfSEFWRV9JUlFfRVhJVF9PTl9JUlFfU1RBQ0sKIAkJLyoKQEAgLTcwMCw3ICs3MTQsNyBAQAogCUJVRygpOwogfQogCi1zdGF0aWMgdm9pZCB0YWtlb3Zlcl90YXNrbGV0cyh1bnNpZ25lZCBpbnQgY3B1KQorc3RhdGljIGludCB0YWtlb3Zlcl90YXNrbGV0cyh1bnNpZ25lZCBpbnQgY3B1KQogewogCS8qIENQVSBpcyBkZWFkLCBzbyBubyBsb2NrIG5lZWRlZC4gKi8KIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwpAQCAtNzIzLDI3ICs3MzcsMTIgQEAKIAlyYWlzZV9zb2Z0aXJxX2lycW9mZihISV9TT0ZUSVJRKTsKIAogCWxvY2FsX2lycV9lbmFibGUoKTsKKwlyZXR1cm4gMDsKIH0KKyNlbHNlCisjZGVmaW5lIHRha2VvdmVyX3Rhc2tsZXRzCU5VTEwKICNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KIAotc3RhdGljIGludCBjcHVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLAotCQkJdm9pZCAqaGNwdSkKLXsKLQlzd2l0Y2ggKGFjdGlvbikgewotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCWNhc2UgQ1BVX0RFQUQ6Ci0JY2FzZSBDUFVfREVBRF9GUk9aRU46Ci0JCXRha2VvdmVyX3Rhc2tsZXRzKCh1bnNpZ25lZCBsb25nKWhjcHUpOwotCQlicmVhazsKLSNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KLQl9Ci0JcmV0dXJuIE5PVElGWV9PSzsKLX0KLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBjcHVfbmZiID0gewotCS5ub3RpZmllcl9jYWxsID0gY3B1X2NhbGxiYWNrCi19OwotCiBzdGF0aWMgc3RydWN0IHNtcF9ob3RwbHVnX3RocmVhZCBzb2Z0aXJxX3RocmVhZHMgPSB7CiAJLnN0b3JlCQkJPSAma3NvZnRpcnFkLAogCS50aHJlYWRfc2hvdWxkX3J1bgk9IGtzb2Z0aXJxZF9zaG91bGRfcnVuLApAQCAtNzUzLDggKzc1Miw4IEBACiAKIHN0YXRpYyBfX2luaXQgaW50IHNwYXduX2tzb2Z0aXJxZCh2b2lkKQogewotCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmY3B1X25mYik7Ci0KKwljcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX1NPRlRJUlFfREVBRCwgInNvZnRpcnE6ZGVhZCIsIE5VTEwsCisJCQkJICB0YWtlb3Zlcl90YXNrbGV0cyk7CiAJQlVHX09OKHNtcGJvb3RfcmVnaXN0ZXJfcGVyY3B1X3RocmVhZCgmc29mdGlycV90aHJlYWRzKSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zdG9wX21hY2hpbmUuYyBiL2tlcm5lbC9zdG9wX21hY2hpbmUuYwppbmRleCA0YTFjYTVmLi5lYzlhYjJmIDEwMDY0NAotLS0gYS9rZXJuZWwvc3RvcF9tYWNoaW5lLmMKKysrIGIva2VybmVsL3N0b3BfbWFjaGluZS5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBib290Lmg+CiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+Ci0jaW5jbHVkZSA8bGludXgvbGdsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbm1pLmg+CiAKIC8qCkBAIC00NywxMyArNDYsOSBAQAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHVfc3RvcHBlciwgY3B1X3N0b3BwZXIpOwogc3RhdGljIGJvb2wgc3RvcF9tYWNoaW5lX2luaXRpYWxpemVkID0gZmFsc2U7CiAKLS8qCi0gKiBBdm9pZHMgYSByYWNlIGJldHdlZW4gc3RvcF90d29fY3B1cyBhbmQgZ2xvYmFsIHN0b3BfY3B1cywgd2hlcmUKLSAqIHRoZSBzdG9wcGVycyBjb3VsZCBnZXQgcXVldWVkIHVwIGluIHJldmVyc2Ugb3JkZXIsIGxlYWRpbmcgdG8KLSAqIHN5c3RlbSBkZWFkbG9jay4gVXNpbmcgYW4gbGdsb2NrIG1lYW5zIHN0b3BfdHdvX2NwdXMgcmVtYWlucwotICogcmVsYXRpdmVseSBjaGVhcC4KLSAqLwotREVGSU5FX1NUQVRJQ19MR0xPQ0soc3RvcF9jcHVzX2xvY2spOworLyogc3RhdGljIGRhdGEgZm9yIHN0b3BfY3B1cyAqLworc3RhdGljIERFRklORV9NVVRFWChzdG9wX2NwdXNfbXV0ZXgpOworc3RhdGljIGJvb2wgc3RvcF9jcHVzX2luX3Byb2dyZXNzOwogCiBzdGF0aWMgdm9pZCBjcHVfc3RvcF9pbml0X2RvbmUoc3RydWN0IGNwdV9zdG9wX2RvbmUgKmRvbmUsIHVuc2lnbmVkIGludCBucl90b2RvKQogewpAQCAtMTI2LDYgKzEyMSwxMSBAQAogCWNwdV9zdG9wX2luaXRfZG9uZSgmZG9uZSwgMSk7CiAJaWYgKCFjcHVfc3RvcF9xdWV1ZV93b3JrKGNwdSwgJndvcmspKQogCQlyZXR1cm4gLUVOT0VOVDsKKwkvKgorCSAqIEluIGNhc2UgQGNwdSA9PSBzbXBfcHJvY2Nlc3Nvcl9pZCgpIHdlIGNhbiBhdm9pZCBhIHNsZWVwK3dha2V1cAorCSAqIGN5Y2xlIGJ5IGRvaW5nIGEgcHJlZW1wdGlvbjoKKwkgKi8KKwljb25kX3Jlc2NoZWQoKTsKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZkb25lLmNvbXBsZXRpb24pOwogCXJldHVybiBkb25lLnJldDsKIH0KQEAgLTIzMCwxNCArMjMwLDI2IEBACiAJc3RydWN0IGNwdV9zdG9wcGVyICpzdG9wcGVyMSA9IHBlcl9jcHVfcHRyKCZjcHVfc3RvcHBlciwgY3B1MSk7CiAJc3RydWN0IGNwdV9zdG9wcGVyICpzdG9wcGVyMiA9IHBlcl9jcHVfcHRyKCZjcHVfc3RvcHBlciwgY3B1Mik7CiAJaW50IGVycjsKLQotCWxnX2RvdWJsZV9sb2NrKCZzdG9wX2NwdXNfbG9jaywgY3B1MSwgY3B1Mik7CityZXRyeToKIAlzcGluX2xvY2tfaXJxKCZzdG9wcGVyMS0+bG9jayk7CiAJc3Bpbl9sb2NrX25lc3RlZCgmc3RvcHBlcjItPmxvY2ssIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKIAogCWVyciA9IC1FTk9FTlQ7CiAJaWYgKCFzdG9wcGVyMS0+ZW5hYmxlZCB8fCAhc3RvcHBlcjItPmVuYWJsZWQpCiAJCWdvdG8gdW5sb2NrOworCS8qCisJICogRW5zdXJlIHRoYXQgaWYgd2UgcmFjZSB3aXRoIF9fc3RvcF9jcHVzKCkgdGhlIHN0b3BwZXJzIHdvbid0IGdldAorCSAqIHF1ZXVlZCB1cCBpbiByZXZlcnNlIG9yZGVyIGxlYWRpbmcgdG8gc3lzdGVtIGRlYWRsb2NrLgorCSAqCisJICogV2UgY2FuJ3QgbWlzcyBzdG9wX2NwdXNfaW5fcHJvZ3Jlc3MgaWYgcXVldWVfc3RvcF9jcHVzX3dvcmsoKSBoYXMKKwkgKiBxdWV1ZWQgYSB3b3JrIG9uIGNwdTEgYnV0IG5vdCBvbiBjcHUyLCB3ZSBob2xkIGJvdGggbG9ja3MuCisJICoKKwkgKiBJdCBjYW4gYmUgZmFsc2VseSB0cnVlIGJ1dCBpdCBpcyBzYWZlIHRvIHNwaW4gdW50aWwgaXQgaXMgY2xlYXJlZCwKKwkgKiBxdWV1ZV9zdG9wX2NwdXNfd29yaygpIGRvZXMgZXZlcnl0aGluZyB1bmRlciBwcmVlbXB0X2Rpc2FibGUoKS4KKwkgKi8KKwllcnIgPSAtRURFQURMSzsKKwlpZiAodW5saWtlbHkoc3RvcF9jcHVzX2luX3Byb2dyZXNzKSkKKwkJCWdvdG8gdW5sb2NrOwogCiAJZXJyID0gMDsKIAlfX2NwdV9zdG9wX3F1ZXVlX3dvcmsoc3RvcHBlcjEsIHdvcmsxKTsKQEAgLTI0NSw4ICsyNTcsMTIgQEAKIHVubG9jazoKIAlzcGluX3VubG9jaygmc3RvcHBlcjItPmxvY2spOwogCXNwaW5fdW5sb2NrX2lycSgmc3RvcHBlcjEtPmxvY2spOwotCWxnX2RvdWJsZV91bmxvY2soJnN0b3BfY3B1c19sb2NrLCBjcHUxLCBjcHUyKTsKIAorCWlmICh1bmxpa2VseShlcnIgPT0gLUVERUFETEspKSB7CisJCXdoaWxlIChzdG9wX2NwdXNfaW5fcHJvZ3Jlc3MpCisJCQljcHVfcmVsYXgoKTsKKwkJZ290byByZXRyeTsKKwl9CiAJcmV0dXJuIGVycjsKIH0KIC8qKgpAQCAtMzE2LDkgKzMzMiw2IEBACiAJcmV0dXJuIGNwdV9zdG9wX3F1ZXVlX3dvcmsoY3B1LCB3b3JrX2J1Zik7CiB9CiAKLS8qIHN0YXRpYyBkYXRhIGZvciBzdG9wX2NwdXMgKi8KLXN0YXRpYyBERUZJTkVfTVVURVgoc3RvcF9jcHVzX211dGV4KTsKLQogc3RhdGljIGJvb2wgcXVldWVfc3RvcF9jcHVzX3dvcmsoY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2ssCiAJCQkJIGNwdV9zdG9wX2ZuX3QgZm4sIHZvaWQgKmFyZywKIAkJCQkgc3RydWN0IGNwdV9zdG9wX2RvbmUgKmRvbmUpCkBAIC0zMzIsNyArMzQ1LDggQEAKIAkgKiBwcmVlbXB0ZWQgYnkgYSBzdG9wcGVyIHdoaWNoIG1pZ2h0IHdhaXQgZm9yIG90aGVyIHN0b3BwZXJzCiAJICogdG8gZW50ZXIgQGZuIHdoaWNoIGNhbiBsZWFkIHRvIGRlYWRsb2NrLgogCSAqLwotCWxnX2dsb2JhbF9sb2NrKCZzdG9wX2NwdXNfbG9jayk7CisJcHJlZW1wdF9kaXNhYmxlKCk7CisJc3RvcF9jcHVzX2luX3Byb2dyZXNzID0gdHJ1ZTsKIAlmb3JfZWFjaF9jcHUoY3B1LCBjcHVtYXNrKSB7CiAJCXdvcmsgPSAmcGVyX2NwdShjcHVfc3RvcHBlci5zdG9wX3dvcmssIGNwdSk7CiAJCXdvcmstPmZuID0gZm47CkBAIC0zNDEsNyArMzU1LDggQEAKIAkJaWYgKGNwdV9zdG9wX3F1ZXVlX3dvcmsoY3B1LCB3b3JrKSkKIAkJCXF1ZXVlZCA9IHRydWU7CiAJfQotCWxnX2dsb2JhbF91bmxvY2soJnN0b3BfY3B1c19sb2NrKTsKKwlzdG9wX2NwdXNfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKKwlwcmVlbXB0X2VuYWJsZSgpOwogCiAJcmV0dXJuIHF1ZXVlZDsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNjdGwuYyBiL2tlcm5lbC9zeXNjdGwuYwppbmRleCBiNDNkMGIyLi5hNDM3NzVjIDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzY3RsLmMKKysrIGIva2VybmVsL3N5c2N0bC5jCkBAIC02NSw2ICs2NSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQvc3lzY3RsLmg+CiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KICNpbmNsdWRlIDxsaW51eC9icGYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CkBAIC0xODM4LDYgKzE4MzksMTQgQEAKIAkJLm1vZGUJCT0gMDY0NCwKIAkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG91bG9uZ3ZlY19taW5tYXgsCiAJfSwKKwl7CisJCS5wcm9jbmFtZQk9ICJtb3VudC1tYXgiLAorCQkuZGF0YQkJPSAmc3lzY3RsX21vdW50X21heCwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuZXh0cmExCQk9ICZvbmUsCisJfSwKIAl7IH0KIH07CiAKQEAgLTIxNDAsNiArMjE0OSwyMSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGRvX3Byb2NfZG91aW50dmVjX2NvbnYoYm9vbCAqbmVncCwgdW5zaWduZWQgbG9uZyAqbHZhbHAsCisJCQkJIGludCAqdmFscCwKKwkJCQkgaW50IHdyaXRlLCB2b2lkICpkYXRhKQoreworCWlmICh3cml0ZSkgeworCQlpZiAoKm5lZ3ApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJKnZhbHAgPSAqbHZhbHA7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgaW50IHZhbCA9ICp2YWxwOworCQkqbHZhbHAgPSAodW5zaWduZWQgbG9uZyl2YWw7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3QgY2hhciBwcm9jX3dzcGFjZV9zZXBbXSA9IHsgJyAnLCAnXHQnLCAnXG4nIH07CiAKIHN0YXRpYyBpbnQgX19kb19wcm9jX2RvaW50dmVjKHZvaWQgKnRibF9kYXRhLCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwKQEAgLTIyNTksOCArMjI4MywyNyBAQAogaW50IHByb2NfZG9pbnR2ZWMoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKIAkJICAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKLSAgICByZXR1cm4gZG9fcHJvY19kb2ludHZlYyh0YWJsZSx3cml0ZSxidWZmZXIsbGVucCxwcG9zLAotCQkgICAgCSAgICBOVUxMLE5VTEwpOworCXJldHVybiBkb19wcm9jX2RvaW50dmVjKHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zLCBOVUxMLCBOVUxMKTsKK30KKworLyoqCisgKiBwcm9jX2RvdWludHZlYyAtIHJlYWQgYSB2ZWN0b3Igb2YgdW5zaWduZWQgaW50ZWdlcnMKKyAqIEB0YWJsZTogdGhlIHN5c2N0bCB0YWJsZQorICogQHdyaXRlOiAlVFJVRSBpZiB0aGlzIGlzIGEgd3JpdGUgdG8gdGhlIHN5c2N0bCBmaWxlCisgKiBAYnVmZmVyOiB0aGUgdXNlciBidWZmZXIKKyAqIEBsZW5wOiB0aGUgc2l6ZSBvZiB0aGUgdXNlciBidWZmZXIKKyAqIEBwcG9zOiBmaWxlIHBvc2l0aW9uCisgKgorICogUmVhZHMvd3JpdGVzIHVwIHRvIHRhYmxlLT5tYXhsZW4vc2l6ZW9mKHVuc2lnbmVkIGludCkgdW5zaWduZWQgaW50ZWdlcgorICogdmFsdWVzIGZyb20vdG8gdGhlIHVzZXIgYnVmZmVyLCB0cmVhdGVkIGFzIGFuIEFTQ0lJIHN0cmluZy4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IHByb2NfZG91aW50dmVjKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCisJCSAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJcmV0dXJuIGRvX3Byb2NfZG9pbnR2ZWModGFibGUsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MsCisJCQkJZG9fcHJvY19kb3VpbnR2ZWNfY29udiwgTlVMTCk7CiB9CiAKIC8qCkBAIC0yODU4LDYgKzI5MDEsMTIgQEAKIAlyZXR1cm4gLUVOT1NZUzsKIH0KIAoraW50IHByb2NfZG91aW50dmVjKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCisJCSAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKIGludCBwcm9jX2RvaW50dmVjX21pbm1heChzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogCQkgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7CkBAIC0yOTAzLDYgKzI5NTIsNyBAQAogICogZXhjZXB0aW9uIGdyYW50ZWQgOi0pCiAgKi8KIEVYUE9SVF9TWU1CT0wocHJvY19kb2ludHZlYyk7CitFWFBPUlRfU1lNQk9MKHByb2NfZG91aW50dmVjKTsKIEVYUE9SVF9TWU1CT0wocHJvY19kb2ludHZlY19qaWZmaWVzKTsKIEVYUE9SVF9TWU1CT0wocHJvY19kb2ludHZlY19taW5tYXgpOwogRVhQT1JUX1NZTUJPTChwcm9jX2RvaW50dmVjX3VzZXJoel9qaWZmaWVzKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMgYi9rZXJuZWwvdGltZS9jbG9ja3NvdXJjZS5jCmluZGV4IDZhNWEzMTAuLjdlNGZhZDcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMKKysrIGIva2VybmVsL3RpbWUvY2xvY2tzb3VyY2UuYwpAQCAtNjAwLDkgKzYwMCwxOCBAQAogCQkgKi8KIAkJaWYgKCEoY3MtPmZsYWdzICYgQ0xPQ0tfU09VUkNFX1ZBTElEX0ZPUl9IUkVTKSAmJiBvbmVzaG90KSB7CiAJCQkvKiBPdmVycmlkZSBjbG9ja3NvdXJjZSBjYW5ub3QgYmUgdXNlZC4gKi8KLQkJCXByX3dhcm4oIk92ZXJyaWRlIGNsb2Nrc291cmNlICVzIGlzIG5vdCBIUlQgY29tcGF0aWJsZSAtIGNhbm5vdCBzd2l0Y2ggd2hpbGUgaW4gSFJUL05PSFogbW9kZVxuIiwKLQkJCQljcy0+bmFtZSk7Ci0JCQlvdmVycmlkZV9uYW1lWzBdID0gMDsKKwkJCWlmIChjcy0+ZmxhZ3MgJiBDTE9DS19TT1VSQ0VfVU5TVEFCTEUpIHsKKwkJCQlwcl93YXJuKCJPdmVycmlkZSBjbG9ja3NvdXJjZSAlcyBpcyB1bnN0YWJsZSBhbmQgbm90IEhSVCBjb21wYXRpYmxlIC0gY2Fubm90IHN3aXRjaCB3aGlsZSBpbiBIUlQvTk9IWiBtb2RlXG4iLAorCQkJCQljcy0+bmFtZSk7CisJCQkJb3ZlcnJpZGVfbmFtZVswXSA9IDA7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogVGhlIG92ZXJyaWRlIGNhbm5vdCBiZSBjdXJyZW50bHkgdmVyaWZpZWQuCisJCQkJICogRGVmZXJyaW5nIHRvIGxldCB0aGUgd2F0Y2hkb2cgY2hlY2suCisJCQkJICovCisJCQkJcHJfaW5mbygiT3ZlcnJpZGUgY2xvY2tzb3VyY2UgJXMgaXMgbm90IGN1cnJlbnRseSBIUlQgY29tcGF0aWJsZSAtIGRlZmVycmluZ1xuIiwKKwkJCQkJY3MtPm5hbWUpOworCQkJfQogCQl9IGVsc2UKIAkJCS8qIE92ZXJyaWRlIGNsb2Nrc291cmNlIGNhbiBiZSB1c2VkLiAqLwogCQkJYmVzdCA9IGNzOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvaHJ0aW1lci5jIGIva2VybmVsL3RpbWUvaHJ0aW1lci5jCmluZGV4IDliYTdjODIuLmJiNWVjNDIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL2hydGltZXIuYworKysgYi9rZXJuZWwvdGltZS9ocnRpbWVyLmMKQEAgLTMwNyw3ICszMDcsNyBAQAogICovCiBrdGltZV90IGt0aW1lX2FkZF9zYWZlKGNvbnN0IGt0aW1lX3QgbGhzLCBjb25zdCBrdGltZV90IHJocykKIHsKLQlrdGltZV90IHJlcyA9IGt0aW1lX2FkZChsaHMsIHJocyk7CisJa3RpbWVfdCByZXMgPSBrdGltZV9hZGRfdW5zYWZlKGxocywgcmhzKTsKIAogCS8qCiAJICogV2UgdXNlIEtUSU1FX1NFQ19NQVggaGVyZSwgdGhlIG1heGltdW0gdGltZW91dCB3aGljaCB3ZSBjYW4KQEAgLTcwMyw3ICs3MDMsNyBAQAogc3RhdGljIERFQ0xBUkVfV09SSyhocnRpbWVyX3dvcmssIGNsb2NrX3dhc19zZXRfd29yayk7CiAKIC8qCi0gKiBDYWxsZWQgZnJvbSB0aW1la2VlcGluZyBhbmQgcmVzdW1lIGNvZGUgdG8gcmVwcm9ncmFtbSB0aGUgaHJ0aW1lcgorICogQ2FsbGVkIGZyb20gdGltZWtlZXBpbmcgYW5kIHJlc3VtZSBjb2RlIHRvIHJlcHJvZ3JhbSB0aGUgaHJ0aW1lcgogICogaW50ZXJydXB0IGRldmljZSBvbiBhbGwgY3B1cy4KICAqLwogdm9pZCBjbG9ja193YXNfc2V0X2RlbGF5ZWQodm9pZCkKQEAgLTEyNDEsNyArMTI0MSw3IEBACiAKIAkvKgogCSAqIE5vdGU6IFdlIGNsZWFyIHRoZSBydW5uaW5nIHN0YXRlIGFmdGVyIGVucXVldWVfaHJ0aW1lciBhbmQKLQkgKiB3ZSBkbyBub3QgcmVwcm9ncmFtbSB0aGUgZXZlbnQgaGFyZHdhcmUuIEhhcHBlbnMgZWl0aGVyIGluCisJICogd2UgZG8gbm90IHJlcHJvZ3JhbSB0aGUgZXZlbnQgaGFyZHdhcmUuIEhhcHBlbnMgZWl0aGVyIGluCiAJICogaHJ0aW1lcl9zdGFydF9yYW5nZV9ucygpIG9yIGluIGhydGltZXJfaW50ZXJydXB0KCkKIAkgKgogCSAqIE5vdGU6IEJlY2F1c2Ugd2UgZHJvcHBlZCB0aGUgY3B1X2Jhc2UtPmxvY2sgYWJvdmUsCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aWNrLXNjaGVkLmMgYi9rZXJuZWwvdGltZS90aWNrLXNjaGVkLmMKaW5kZXggMjA0ZmRjOC4uM2JjYjYxYiAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvdGljay1zY2hlZC5jCisrKyBiL2tlcm5lbC90aW1lL3RpY2stc2NoZWQuYwpAQCAtMTg2LDEwICsxODYsMTMgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBib29sIGNhbl9zdG9wX2Z1bGxfdGljayhzdHJ1Y3QgdGlja19zY2hlZCAqdHMpCitzdGF0aWMgYm9vbCBjYW5fc3RvcF9mdWxsX3RpY2soaW50IGNwdSwgc3RydWN0IHRpY2tfc2NoZWQgKnRzKQogewogCVdBUk5fT05fT05DRSghaXJxc19kaXNhYmxlZCgpKTsKIAorCWlmICh1bmxpa2VseSghY3B1X29ubGluZShjcHUpKSkKKwkJcmV0dXJuIGZhbHNlOworCiAJaWYgKGNoZWNrX3RpY2tfZGVwZW5kZW5jeSgmdGlja19kZXBfbWFzaykpCiAJCXJldHVybiBmYWxzZTsKIApAQCAtODQzLDcgKzg0Niw3IEBACiAJaWYgKCF0cy0+dGlja19zdG9wcGVkICYmIHRzLT5ub2h6X21vZGUgPT0gTk9IWl9NT0RFX0lOQUNUSVZFKQogCQlyZXR1cm47CiAKLQlpZiAoY2FuX3N0b3BfZnVsbF90aWNrKHRzKSkKKwlpZiAoY2FuX3N0b3BfZnVsbF90aWNrKGNwdSwgdHMpKQogCQl0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKHRzLCBrdGltZV9nZXQoKSwgY3B1KTsKIAllbHNlIGlmICh0cy0+dGlja19zdG9wcGVkKQogCQl0aWNrX25vaHpfcmVzdGFydF9zY2hlZF90aWNrKHRzLCBrdGltZV9nZXQoKSk7CkBAIC05MDgsMTAgKzkxMSwxMSBAQAogCWt0aW1lX3Qgbm93LCBleHBpcmVzOwogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKKwlub3cgPSB0aWNrX25vaHpfc3RhcnRfaWRsZSh0cyk7CisKIAlpZiAoY2FuX3N0b3BfaWRsZV90aWNrKGNwdSwgdHMpKSB7CiAJCWludCB3YXNfc3RvcHBlZCA9IHRzLT50aWNrX3N0b3BwZWQ7CiAKLQkJbm93ID0gdGlja19ub2h6X3N0YXJ0X2lkbGUodHMpOwogCQl0cy0+aWRsZV9jYWxscysrOwogCiAJCWV4cGlyZXMgPSB0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKHRzLCBub3csIGNwdSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aW1lLmMgYi9rZXJuZWwvdGltZS90aW1lLmMKaW5kZXggNjY3YjkzMy4uYmQ2MmZiOCAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvdGltZS5jCisrKyBiL2tlcm5lbC90aW1lL3RpbWUuYwpAQCAtNzgwLDcgKzc4MCw3IEBACiB7CiAJc3RydWN0IHRpbWVzcGVjNjQgcmVzOwogCi0Jc2V0X25vcm1hbGl6ZWRfdGltZXNwZWM2NCgmcmVzLCBsaHMudHZfc2VjICsgcmhzLnR2X3NlYywKKwlzZXRfbm9ybWFsaXplZF90aW1lc3BlYzY0KCZyZXMsICh0aW1ldTY0X3QpIGxocy50dl9zZWMgKyByaHMudHZfc2VjLAogCQkJbGhzLnR2X25zZWMgKyByaHMudHZfbnNlYyk7CiAKIAlpZiAodW5saWtlbHkocmVzLnR2X3NlYyA8IGxocy50dl9zZWMgfHwgcmVzLnR2X3NlYyA8IHJocy50dl9zZWMpKSB7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jIGIva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYwppbmRleCAzYjY1NzQ2Li5lMDdmYjA5IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jCisrKyBiL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMKQEAgLTQwMSw3ICs0MDEsMTAgQEAKIAlkbyB7CiAJCXNlcSA9IHJhd19yZWFkX3NlcWNvdW50X2xhdGNoKCZ0a2YtPnNlcSk7CiAJCXRrciA9IHRrZi0+YmFzZSArIChzZXEgJiAweDAxKTsKLQkJbm93ID0ga3RpbWVfdG9fbnModGtyLT5iYXNlKSArIHRpbWVrZWVwaW5nX2dldF9ucyh0a3IpOworCQlub3cgPSBrdGltZV90b19ucyh0a3ItPmJhc2UpOworCisJCW5vdyArPSBjbG9ja3NvdXJjZV9kZWx0YSh0a3ItPnJlYWQodGtyLT5jbG9jayksCisJCQkJCSB0a3ItPmN5Y2xlX2xhc3QsIHRrci0+bWFzayk7CiAJfSB3aGlsZSAocmVhZF9zZXFjb3VudF9yZXRyeSgmdGtmLT5zZXEsIHNlcSkpOwogCiAJcmV0dXJuIG5vdzsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nX2RlYnVnLmMgYi9rZXJuZWwvdGltZS90aW1la2VlcGluZ19kZWJ1Zy5jCmluZGV4IGY2YmQ2NTIuLmNhOWZiODAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nX2RlYnVnLmMKKysrIGIva2VybmVsL3RpbWUvdGltZWtlZXBpbmdfZGVidWcuYwpAQCAtMjMsNyArMjMsOSBAQAogCiAjaW5jbHVkZSAidGltZWtlZXBpbmdfaW50ZXJuYWwuaCIKIAotc3RhdGljIHVuc2lnbmVkIGludCBzbGVlcF90aW1lX2JpblszMl0gPSB7MH07CisjZGVmaW5lIE5VTV9CSU5TIDMyCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2xlZXBfdGltZV9iaW5bTlVNX0JJTlNdID0gezB9OwogCiBzdGF0aWMgaW50IHRrX2RlYnVnX3Nob3dfc2xlZXBfdGltZShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKmRhdGEpCiB7CkBAIC02OSw2ICs3MSwxMSBAQAogCiB2b2lkIHRrX2RlYnVnX2FjY291bnRfc2xlZXBfdGltZShzdHJ1Y3QgdGltZXNwZWM2NCAqdCkKIHsKLQlzbGVlcF90aW1lX2JpbltmbHModC0+dHZfc2VjKV0rKzsKKwkvKiBDYXAgYmluIGluZGV4IHNvIHdlIGRvbid0IG92ZXJmbG93IHRoZSBhcnJheSAqLworCWludCBiaW4gPSBtaW4oZmxzKHQtPnR2X3NlYyksIE5VTV9CSU5TLTEpOworCisJc2xlZXBfdGltZV9iaW5bYmluXSsrOworCXByX2luZm8oIlN1c3BlbmRlZCBmb3IgJWxsZC4lMDNsdSBzZWNvbmRzXG4iLCAoczY0KXQtPnR2X3NlYywKKwkJCXQtPnR2X25zZWMgLyBOU0VDX1BFUl9NU0VDKTsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL3RvcnR1cmUuYyBiL2tlcm5lbC90b3J0dXJlLmMKaW5kZXggNzU5NjFiMy4uMGQ4ODdlYiAxMDA2NDQKLS0tIGEva2VybmVsL3RvcnR1cmUuYworKysgYi9rZXJuZWwvdG9ydHVyZS5jCkBAIC00Myw2ICs0Myw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90cmFjZV9jbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGxpbnV4L3RvcnR1cmUuaD4KIApAQCAtNDQ2LDkgKzQ0Nyw4IEBACiAgKiBWYXJpYWJsZXMgZm9yIGF1dG8tc2h1dGRvd24uICBUaGlzIGFsbG93cyAibGlnaHRzIG91dCIgdG9ydHVyZSBydW5zCiAgKiB0byBiZSBmdWxseSBzY3JpcHRlZC4KICAqLwotc3RhdGljIGludCBzaHV0ZG93bl9zZWNzOwkJLyogZGVzaXJlZCB0ZXN0IGR1cmF0aW9uIGluIHNlY29uZHMuICovCiBzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpzaHV0ZG93bl90YXNrOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgc2h1dGRvd25fdGltZTsJLyogamlmZmllcyB0byBzeXN0ZW0gc2h1dGRvd24uICovCitzdGF0aWMga3RpbWVfdCBzaHV0ZG93bl90aW1lOwkJLyogdGltZSB0byBzeXN0ZW0gc2h1dGRvd24uICovCiBzdGF0aWMgdm9pZCAoKnRvcnR1cmVfc2h1dGRvd25faG9vaykodm9pZCk7CiAKIC8qCkBAIC00NzEsMjAgKzQ3MSwyMCBAQAogICovCiBzdGF0aWMgaW50IHRvcnR1cmVfc2h1dGRvd24odm9pZCAqYXJnKQogewotCWxvbmcgZGVsdGE7Ci0JdW5zaWduZWQgbG9uZyBqaWZmaWVzX3NuYXA7CisJa3RpbWVfdCBrdGltZV9zbmFwOwogCiAJVkVSQk9TRV9UT1JPVVRfU1RSSU5HKCJ0b3J0dXJlX3NodXRkb3duIHRhc2sgc3RhcnRlZCIpOwotCWppZmZpZXNfc25hcCA9IGppZmZpZXM7Ci0Jd2hpbGUgKFVMT05HX0NNUF9MVChqaWZmaWVzX3NuYXAsIHNodXRkb3duX3RpbWUpICYmCisJa3RpbWVfc25hcCA9IGt0aW1lX2dldCgpOworCXdoaWxlIChrdGltZV9iZWZvcmUoa3RpbWVfc25hcCwgc2h1dGRvd25fdGltZSkgJiYKIAkgICAgICAgIXRvcnR1cmVfbXVzdF9zdG9wKCkpIHsKLQkJZGVsdGEgPSBzaHV0ZG93bl90aW1lIC0gamlmZmllc19zbmFwOwogCQlpZiAodmVyYm9zZSkKIAkJCXByX2FsZXJ0KCIlcyIgVE9SVFVSRV9GTEFHCi0JCQkJICJ0b3J0dXJlX3NodXRkb3duIHRhc2s6ICVsdSBqaWZmaWVzIHJlbWFpbmluZ1xuIiwKLQkJCQkgdG9ydHVyZV90eXBlLCBkZWx0YSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShkZWx0YSk7Ci0JCWppZmZpZXNfc25hcCA9IGppZmZpZXM7CisJCQkJICJ0b3J0dXJlX3NodXRkb3duIHRhc2s6ICVsbHUgbXMgcmVtYWluaW5nXG4iLAorCQkJCSB0b3J0dXJlX3R5cGUsCisJCQkJIGt0aW1lX21zX2RlbHRhKHNodXRkb3duX3RpbWUsIGt0aW1lX3NuYXApKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfaHJ0aW1lb3V0KCZzaHV0ZG93bl90aW1lLCBIUlRJTUVSX01PREVfQUJTKTsKKwkJa3RpbWVfc25hcCA9IGt0aW1lX2dldCgpOwogCX0KIAlpZiAodG9ydHVyZV9tdXN0X3N0b3AoKSkgewogCQl0b3J0dXJlX2t0aHJlYWRfc3RvcHBpbmcoInRvcnR1cmVfc2h1dGRvd24iKTsKQEAgLTUxMSwxMCArNTExLDkgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCXNodXRkb3duX3NlY3MgPSBzc2VjczsKIAl0b3J0dXJlX3NodXRkb3duX2hvb2sgPSBjbGVhbnVwOwotCWlmIChzaHV0ZG93bl9zZWNzID4gMCkgewotCQlzaHV0ZG93bl90aW1lID0gamlmZmllcyArIHNodXRkb3duX3NlY3MgKiBIWjsKKwlpZiAoc3NlY3MgPiAwKSB7CisJCXNodXRkb3duX3RpbWUgPSBrdGltZV9hZGQoa3RpbWVfZ2V0KCksIGt0aW1lX3NldChzc2VjcywgMCkpOwogCQlyZXQgPSB0b3J0dXJlX2NyZWF0ZV9rdGhyZWFkKHRvcnR1cmVfc2h1dGRvd24sIE5VTEwsCiAJCQkJCSAgICAgc2h1dGRvd25fdGFzayk7CiAJfQpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL0tjb25maWcgYi9rZXJuZWwvdHJhY2UvS2NvbmZpZwppbmRleCBmNGI4NmU4Li4yYTk2YjA2IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvS2NvbmZpZworKysgYi9rZXJuZWwvdHJhY2UvS2NvbmZpZwpAQCAtMjQsMTEgKzI0LDYgQEAKIAloZWxwCiAJICBTZWUgRG9jdW1lbnRhdGlvbi90cmFjZS9mdHJhY2UtZGVzaWduLnR4dAogCi1jb25maWcgSEFWRV9GVU5DVElPTl9HUkFQSF9GUF9URVNUCi0JYm9vbAotCWhlbHAKLQkgIFNlZSBEb2N1bWVudGF0aW9uL3RyYWNlL2Z0cmFjZS1kZXNpZ24udHh0Ci0KIGNvbmZpZyBIQVZFX0RZTkFNSUNfRlRSQUNFCiAJYm9vbAogCWhlbHAKQEAgLTIyMSw2ICsyMTYsNDEgQEAKIAkgIFRoaXMgdHJhY2VyIHRyYWNrcyB0aGUgbGF0ZW5jeSBvZiB0aGUgaGlnaGVzdCBwcmlvcml0eSB0YXNrCiAJICB0byBiZSBzY2hlZHVsZWQgaW4sIHN0YXJ0aW5nIGZyb20gdGhlIHBvaW50IGl0IGhhcyB3b2tlbiB1cC4KIAorY29uZmlnIEhXTEFUX1RSQUNFUgorCWJvb2wgIlRyYWNlciB0byBkZXRlY3QgaGFyZHdhcmUgbGF0ZW5jaWVzIChsaWtlIFNNSXMpIgorCXNlbGVjdCBHRU5FUklDX1RSQUNFUgorCWhlbHAKKwkgVGhpcyB0cmFjZXIsIHdoZW4gZW5hYmxlZCB3aWxsIGNyZWF0ZSBvbmUgb3IgbW9yZSBrZXJuZWwgdGhyZWFkcywKKwkgZGVwZW5pbmcgb24gd2hhdCB0aGUgY3B1bWFzayBmaWxlIGlzIHNldCB0bywgd2hpY2ggZWFjaCB0aHJlYWQKKwkgc3Bpbm5pbmcgaW4gYSBsb29wIGxvb2tpbmcgZm9yIGludGVycnVwdGlvbnMgY2F1c2VkIGJ5CisJIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBrZXJuZWwuIEZvciBleGFtcGxlLCBpZiBhCisJIFN5c3RlbSBNYW5hZ2VtZW50IEludGVycnVwdCAoU01JKSB0YWtlcyBhIG5vdGljZWFibGUgYW1vdW50IG9mCisJIHRpbWUsIHRoaXMgdHJhY2VyIHdpbGwgZGV0ZWN0IGl0LiBUaGlzIGlzIHVzZWZ1bCBmb3IgdGVzdGluZworCSBpZiBhIHN5c3RlbSBpcyByZWxpYWJsZSBmb3IgUmVhbCBUaW1lIHRhc2tzLgorCisJIFNvbWUgZmlsZXMgYXJlIGNyZWF0ZWQgaW4gdGhlIHRyYWNpbmcgZGlyZWN0b3J5IHdoZW4gdGhpcworCSBpcyBlbmFibGVkOgorCisJICAgaHdsYXRfZGV0ZWN0b3Ivd2lkdGggICAtIHRpbWUgaW4gdXNlY3MgZm9yIGhvdyBsb25nIHRvIHNwaW4gZm9yCisJICAgaHdsYXRfZGV0ZWN0b3Ivd2luZG93ICAtIHRpbWUgaW4gdXNlY3MgYmV0d2VlbiB0aGUgc3RhcnQgb2YgZWFjaAorCQkJCSAgICAgaXRlcmF0aW9uCisKKwkgQSBrZXJuZWwgdGhyZWFkIGlzIGNyZWF0ZWQgdGhhdCB3aWxsIHNwaW4gd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkCisJIGZvciAid2lkdGgiIG1pY3Jvc2Vjb25kcyBpbiBldmVyeSAid2lkb3ciIGN5Y2xlLiBJdCB3aWxsIG5vdCBzcGluCisJIGZvciAid2luZG93IC0gd2lkdGgiIG1pY3Jvc2Vjb25kcywgd2hlcmUgdGhlIHN5c3RlbSBjYW4KKwkgY29udGludWUgdG8gb3BlcmF0ZS4KKworCSBUaGUgb3V0cHV0IHdpbGwgYXBwZWFyIGluIHRoZSB0cmFjZSBhbmQgdHJhY2VfcGlwZSBmaWxlcy4KKworCSBXaGVuIHRoZSB0cmFjZXIgaXMgbm90IHJ1bm5pbmcsIGl0IGhhcyBubyBhZmZlY3Qgb24gdGhlIHN5c3RlbSwKKwkgYnV0IHdoZW4gaXQgaXMgcnVubmluZywgaXQgY2FuIGNhdXNlIHRoZSBzeXN0ZW0gdG8gYmUKKwkgcGVyaW9kaWNhbGx5IG5vbiByZXNwb25zaXZlLiBEbyBub3QgcnVuIHRoaXMgdHJhY2VyIG9uIGEKKwkgcHJvZHVjdGlvbiBzeXN0ZW0uCisKKwkgVG8gZW5hYmxlIHRoaXMgdHJhY2VyLCBlY2hvIGluICJod2xhdCIgaW50byB0aGUgY3VycmVudF90cmFjZXIKKwkgZmlsZS4gRXZlcnkgdGltZSBhIGxhdGVuY3kgaXMgZ3JlYXRlciB0aGFuIHRyYWNpbmdfdGhyZXNoLCBpdCB3aWxsCisJIGJlIHJlY29yZGVkIGludG8gdGhlIHJpbmcgYnVmZmVyLgorCiBjb25maWcgRU5BQkxFX0RFRkFVTFRfVFJBQ0VSUwogCWJvb2wgIlRyYWNlIHByb2Nlc3MgY29udGV4dCBzd2l0Y2hlcyBhbmQgZXZlbnRzIgogCWRlcGVuZHMgb24gIUdFTkVSSUNfVFJBQ0VSCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvTWFrZWZpbGUgYi9rZXJuZWwvdHJhY2UvTWFrZWZpbGUKaW5kZXggZDBhMTYxNy4uOTkyYWI5ZCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL01ha2VmaWxlCisrKyBiL2tlcm5lbC90cmFjZS9NYWtlZmlsZQpAQCAtNDEsNiArNDEsNyBAQAogb2JqLSQoQ09ORklHX0lSUVNPRkZfVFJBQ0VSKSArPSB0cmFjZV9pcnFzb2ZmLm8KIG9iai0kKENPTkZJR19QUkVFTVBUX1RSQUNFUikgKz0gdHJhY2VfaXJxc29mZi5vCiBvYmotJChDT05GSUdfU0NIRURfVFJBQ0VSKSArPSB0cmFjZV9zY2hlZF93YWtldXAubworb2JqLSQoQ09ORklHX0hXTEFUX1RSQUNFUikgKz0gdHJhY2VfaHdsYXQubwogb2JqLSQoQ09ORklHX05PUF9UUkFDRVIpICs9IHRyYWNlX25vcC5vCiBvYmotJChDT05GSUdfU1RBQ0tfVFJBQ0VSKSArPSB0cmFjZV9zdGFjay5vCiBvYmotJChDT05GSUdfTU1JT1RSQUNFKSArPSB0cmFjZV9tbWlvdHJhY2UubwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL2Jsa3RyYWNlLmMgYi9rZXJuZWwvdHJhY2UvYmxrdHJhY2UuYwppbmRleCA3NTk4ZTZjLi5kYmFmYzVkIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvYmxrdHJhY2UuYworKysgYi9rZXJuZWwvdHJhY2UvYmxrdHJhY2UuYwpAQCAtMjIzLDcgKzIyMyw3IEBACiAJd2hhdCB8PSBNQVNLX1RDX0JJVChvcF9mbGFncywgTUVUQSk7CiAJd2hhdCB8PSBNQVNLX1RDX0JJVChvcF9mbGFncywgUFJFRkxVU0gpOwogCXdoYXQgfD0gTUFTS19UQ19CSVQob3BfZmxhZ3MsIEZVQSk7Ci0JaWYgKG9wID09IFJFUV9PUF9ESVNDQVJEKQorCWlmIChvcCA9PSBSRVFfT1BfRElTQ0FSRCB8fCBvcCA9PSBSRVFfT1BfU0VDVVJFX0VSQVNFKQogCQl3aGF0IHw9IEJMS19UQ19BQ1QoQkxLX1RDX0RJU0NBUkQpOwogCWlmIChvcCA9PSBSRVFfT1BfRkxVU0gpCiAJCXdoYXQgfD0gQkxLX1RDX0FDVChCTEtfVENfRkxVU0gpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL2JwZl90cmFjZS5jIGIva2VybmVsL3RyYWNlL2JwZl90cmFjZS5jCmluZGV4IGIyMDQzOGYuLjVkY2I5OTIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS9icGZfdHJhY2UuYworKysgYi9rZXJuZWwvdHJhY2UvYnBmX3RyYWNlLmMKQEAgLTEsNCArMSw1IEBACiAvKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSBQTFVNZ3JpZCwgaHR0cDovL3BsdW1ncmlkLmNvbQorICogQ29weXJpZ2h0IChjKSAyMDE2IEZhY2Vib29rCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwpAQCAtOCw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9icGYuaD4KKyNpbmNsdWRlIDxsaW51eC9icGZfcGVyZl9ldmVudC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbHRlci5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgpAQCAtNTksMTEgKzYxLDkgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHRyYWNlX2NhbGxfYnBmKTsKIAotc3RhdGljIHU2NCBicGZfcHJvYmVfcmVhZCh1NjQgcjEsIHU2NCByMiwgdTY0IHIzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzMoYnBmX3Byb2JlX3JlYWQsIHZvaWQgKiwgZHN0LCB1MzIsIHNpemUsIGNvbnN0IHZvaWQgKiwgdW5zYWZlX3B0cikKIHsKLQl2b2lkICpkc3QgPSAodm9pZCAqKSAobG9uZykgcjE7Ci0JaW50IHJldCwgc2l6ZSA9IChpbnQpIHIyOwotCXZvaWQgKnVuc2FmZV9wdHIgPSAodm9pZCAqKSAobG9uZykgcjM7CisJaW50IHJldDsKIAogCXJldCA9IHByb2JlX2tlcm5lbF9yZWFkKGRzdCwgdW5zYWZlX3B0ciwgc2l6ZSk7CiAJaWYgKHVubGlrZWx5KHJldCA8IDApKQpAQCAtODEsMTIgKzgxLDkgQEAKIAkuYXJnM190eXBlCT0gQVJHX0FOWVRISU5HLAogfTsKIAotc3RhdGljIHU2NCBicGZfcHJvYmVfd3JpdGVfdXNlcih1NjQgcjEsIHU2NCByMiwgdTY0IHIzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzMoYnBmX3Byb2JlX3dyaXRlX3VzZXIsIHZvaWQgKiwgdW5zYWZlX3B0ciwgY29uc3Qgdm9pZCAqLCBzcmMsCisJICAgdTMyLCBzaXplKQogewotCXZvaWQgKnVuc2FmZV9wdHIgPSAodm9pZCAqKSAobG9uZykgcjE7Ci0Jdm9pZCAqc3JjID0gKHZvaWQgKikgKGxvbmcpIHIyOwotCWludCBzaXplID0gKGludCkgcjM7Ci0KIAkvKgogCSAqIEVuc3VyZSB3ZSdyZSBpbiB1c2VyIGNvbnRleHQgd2hpY2ggaXMgc2FmZSBmb3IgdGhlIGhlbHBlciB0bwogCSAqIHJ1bi4gVGhpcyBoZWxwZXIgaGFzIG5vIGJ1c2luZXNzIGluIGEga3RocmVhZC4KQEAgLTEyOCw5ICsxMjUsOSBAQAogICogbGltaXRlZCB0cmFjZV9wcmludGsoKQogICogb25seSAlZCAldSAleCAlbGQgJWx1ICVseCAlbGxkICVsbHUgJWxseCAlcCAlcyBjb252ZXJzaW9uIHNwZWNpZmllcnMgYWxsb3dlZAogICovCi1zdGF0aWMgdTY0IGJwZl90cmFjZV9wcmludGsodTY0IHIxLCB1NjQgZm10X3NpemUsIHU2NCByMywgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF81KGJwZl90cmFjZV9wcmludGssIGNoYXIgKiwgZm10LCB1MzIsIGZtdF9zaXplLCB1NjQsIGFyZzEsCisJICAgdTY0LCBhcmcyLCB1NjQsIGFyZzMpCiB7Ci0JY2hhciAqZm10ID0gKGNoYXIgKikgKGxvbmcpIHIxOwogCWJvb2wgc3RyX3NlZW4gPSBmYWxzZTsKIAlpbnQgbW9kWzNdID0ge307CiAJaW50IGZtdF9jbnQgPSAwOwpAQCAtMTc2LDE2ICsxNzMsMTYgQEAKIAogCQkJCXN3aXRjaCAoZm10X2NudCkgewogCQkJCWNhc2UgMToKLQkJCQkJdW5zYWZlX2FkZHIgPSByMzsKLQkJCQkJcjMgPSAobG9uZykgYnVmOworCQkJCQl1bnNhZmVfYWRkciA9IGFyZzE7CisJCQkJCWFyZzEgPSAobG9uZykgYnVmOwogCQkJCQlicmVhazsKIAkJCQljYXNlIDI6Ci0JCQkJCXVuc2FmZV9hZGRyID0gcjQ7Ci0JCQkJCXI0ID0gKGxvbmcpIGJ1ZjsKKwkJCQkJdW5zYWZlX2FkZHIgPSBhcmcyOworCQkJCQlhcmcyID0gKGxvbmcpIGJ1ZjsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAzOgotCQkJCQl1bnNhZmVfYWRkciA9IHI1OwotCQkJCQlyNSA9IChsb25nKSBidWY7CisJCQkJCXVuc2FmZV9hZGRyID0gYXJnMzsKKwkJCQkJYXJnMyA9IChsb25nKSBidWY7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCQlidWZbMF0gPSAwOwpAQCAtMjA3LDkgKzIwNCw5IEBACiAJfQogCiAJcmV0dXJuIF9fdHJhY2VfcHJpbnRrKDEvKiBmYWtlIGlwIHdpbGwgbm90IGJlIHByaW50ZWQgKi8sIGZtdCwKLQkJCSAgICAgIG1vZFswXSA9PSAyID8gcjMgOiBtb2RbMF0gPT0gMSA/IChsb25nKSByMyA6ICh1MzIpIHIzLAotCQkJICAgICAgbW9kWzFdID09IDIgPyByNCA6IG1vZFsxXSA9PSAxID8gKGxvbmcpIHI0IDogKHUzMikgcjQsCi0JCQkgICAgICBtb2RbMl0gPT0gMiA/IHI1IDogbW9kWzJdID09IDEgPyAobG9uZykgcjUgOiAodTMyKSByNSk7CisJCQkgICAgICBtb2RbMF0gPT0gMiA/IGFyZzEgOiBtb2RbMF0gPT0gMSA/IChsb25nKSBhcmcxIDogKHUzMikgYXJnMSwKKwkJCSAgICAgIG1vZFsxXSA9PSAyID8gYXJnMiA6IG1vZFsxXSA9PSAxID8gKGxvbmcpIGFyZzIgOiAodTMyKSBhcmcyLAorCQkJICAgICAgbW9kWzJdID09IDIgPyBhcmczIDogbW9kWzJdID09IDEgPyAobG9uZykgYXJnMyA6ICh1MzIpIGFyZzMpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl90cmFjZV9wcmludGtfcHJvdG8gPSB7CkBAIC0yMzEsOSArMjI4LDggQEAKIAlyZXR1cm4gJmJwZl90cmFjZV9wcmludGtfcHJvdG87CiB9CiAKLXN0YXRpYyB1NjQgYnBmX3BlcmZfZXZlbnRfcmVhZCh1NjQgcjEsIHU2NCBmbGFncywgdTY0IHIzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzIoYnBmX3BlcmZfZXZlbnRfcmVhZCwgc3RydWN0IGJwZl9tYXAgKiwgbWFwLCB1NjQsIGZsYWdzKQogewotCXN0cnVjdCBicGZfbWFwICptYXAgPSAoc3RydWN0IGJwZl9tYXAgKikgKHVuc2lnbmVkIGxvbmcpIHIxOwogCXN0cnVjdCBicGZfYXJyYXkgKmFycmF5ID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9hcnJheSwgbWFwKTsKIAl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCXU2NCBpbmRleCA9IGZsYWdzICYgQlBGX0ZfSU5ERVhfTUFTSzsKQEAgLTMxMCwxMSArMzA2LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHU2NCBicGZfcGVyZl9ldmVudF9vdXRwdXQodTY0IHIxLCB1NjQgcjIsIHU2NCBmbGFncywgdTY0IHI0LCB1NjQgc2l6ZSkKK0JQRl9DQUxMXzUoYnBmX3BlcmZfZXZlbnRfb3V0cHV0LCBzdHJ1Y3QgcHRfcmVncyAqLCByZWdzLCBzdHJ1Y3QgYnBmX21hcCAqLCBtYXAsCisJICAgdTY0LCBmbGFncywgdm9pZCAqLCBkYXRhLCB1NjQsIHNpemUpCiB7Ci0Jc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikobG9uZykgcjE7Ci0Jc3RydWN0IGJwZl9tYXAgKm1hcCAgPSAoc3RydWN0IGJwZl9tYXAgKikobG9uZykgcjI7Ci0Jdm9pZCAqZGF0YSA9ICh2b2lkICopKGxvbmcpIHI0OwogCXN0cnVjdCBwZXJmX3Jhd19yZWNvcmQgcmF3ID0gewogCQkuZnJhZyA9IHsKIAkJCS5zaXplID0gc2l6ZSwKQEAgLTM2NSw3ICszNTksNyBAQAogCXJldHVybiBfX2JwZl9wZXJmX2V2ZW50X291dHB1dChyZWdzLCBtYXAsIGZsYWdzLCAmcmF3KTsKIH0KIAotc3RhdGljIHU2NCBicGZfZ2V0X2N1cnJlbnRfdGFzayh1NjQgcjEsIHU2NCByMiwgdTY0IHIzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzAoYnBmX2dldF9jdXJyZW50X3Rhc2spCiB7CiAJcmV0dXJuIChsb25nKSBjdXJyZW50OwogfQpAQCAtMzc2LDYgKzM3MCwzMSBAQAogCS5yZXRfdHlwZQk9IFJFVF9JTlRFR0VSLAogfTsKIAorQlBGX0NBTExfMihicGZfY3VycmVudF90YXNrX3VuZGVyX2Nncm91cCwgc3RydWN0IGJwZl9tYXAgKiwgbWFwLCB1MzIsIGlkeCkKK3sKKwlzdHJ1Y3QgYnBmX2FycmF5ICphcnJheSA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfYXJyYXksIG1hcCk7CisJc3RydWN0IGNncm91cCAqY2dycDsKKworCWlmICh1bmxpa2VseShpbl9pbnRlcnJ1cHQoKSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh1bmxpa2VseShpZHggPj0gYXJyYXktPm1hcC5tYXhfZW50cmllcykpCisJCXJldHVybiAtRTJCSUc7CisKKwljZ3JwID0gUkVBRF9PTkNFKGFycmF5LT5wdHJzW2lkeF0pOworCWlmICh1bmxpa2VseSghY2dycCkpCisJCXJldHVybiAtRUFHQUlOOworCisJcmV0dXJuIHRhc2tfdW5kZXJfY2dyb3VwX2hpZXJhcmNoeShjdXJyZW50LCBjZ3JwKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfY3VycmVudF90YXNrX3VuZGVyX2Nncm91cF9wcm90byA9IHsKKwkuZnVuYyAgICAgICAgICAgPSBicGZfY3VycmVudF90YXNrX3VuZGVyX2Nncm91cCwKKwkuZ3BsX29ubHkgICAgICAgPSBmYWxzZSwKKwkucmV0X3R5cGUgICAgICAgPSBSRVRfSU5URUdFUiwKKwkuYXJnMV90eXBlICAgICAgPSBBUkdfQ09OU1RfTUFQX1BUUiwKKwkuYXJnMl90eXBlICAgICAgPSBBUkdfQU5ZVEhJTkcsCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvICp0cmFjaW5nX2Z1bmNfcHJvdG8oZW51bSBicGZfZnVuY19pZCBmdW5jX2lkKQogewogCXN3aXRjaCAoZnVuY19pZCkgewpAQCAtNDA3LDYgKzQyNiwxMCBAQAogCQlyZXR1cm4gJmJwZl9wZXJmX2V2ZW50X3JlYWRfcHJvdG87CiAJY2FzZSBCUEZfRlVOQ19wcm9iZV93cml0ZV91c2VyOgogCQlyZXR1cm4gYnBmX2dldF9wcm9iZV93cml0ZV9wcm90bygpOworCWNhc2UgQlBGX0ZVTkNfY3VycmVudF90YXNrX3VuZGVyX2Nncm91cDoKKwkJcmV0dXJuICZicGZfY3VycmVudF90YXNrX3VuZGVyX2Nncm91cF9wcm90bzsKKwljYXNlIEJQRl9GVU5DX2dldF9wcmFuZG9tX3UzMjoKKwkJcmV0dXJuICZicGZfZ2V0X3ByYW5kb21fdTMyX3Byb3RvOwogCWRlZmF1bHQ6CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTQ0NywxNiArNDcwLDE3IEBACiAJLnR5cGUJPSBCUEZfUFJPR19UWVBFX0tQUk9CRSwKIH07CiAKLXN0YXRpYyB1NjQgYnBmX3BlcmZfZXZlbnRfb3V0cHV0X3RwKHU2NCByMSwgdTY0IHIyLCB1NjQgaW5kZXgsIHU2NCByNCwgdTY0IHNpemUpCitCUEZfQ0FMTF81KGJwZl9wZXJmX2V2ZW50X291dHB1dF90cCwgdm9pZCAqLCB0cF9idWZmLCBzdHJ1Y3QgYnBmX21hcCAqLCBtYXAsCisJICAgdTY0LCBmbGFncywgdm9pZCAqLCBkYXRhLCB1NjQsIHNpemUpCiB7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSAqKHN0cnVjdCBwdF9yZWdzICoqKXRwX2J1ZmY7CisKIAkvKgogCSAqIHIxIHBvaW50cyB0byBwZXJmIHRyYWNlcG9pbnQgYnVmZmVyIHdoZXJlIGZpcnN0IDggYnl0ZXMgYXJlIGhpZGRlbgogCSAqIGZyb20gYnBmIHByb2dyYW0gYW5kIGNvbnRhaW4gYSBwb2ludGVyIHRvICdzdHJ1Y3QgcHRfcmVncycuIEZldGNoIGl0Ci0JICogZnJvbSB0aGVyZSBhbmQgY2FsbCB0aGUgc2FtZSBicGZfcGVyZl9ldmVudF9vdXRwdXQoKSBoZWxwZXIKKwkgKiBmcm9tIHRoZXJlIGFuZCBjYWxsIHRoZSBzYW1lIGJwZl9wZXJmX2V2ZW50X291dHB1dCgpIGhlbHBlciBpbmxpbmUuCiAJICovCi0JdTY0IGN0eCA9ICoobG9uZyAqKSh1aW50cHRyX3QpcjE7Ci0KLQlyZXR1cm4gYnBmX3BlcmZfZXZlbnRfb3V0cHV0KGN0eCwgcjIsIGluZGV4LCByNCwgc2l6ZSk7CisJcmV0dXJuIF9fX19icGZfcGVyZl9ldmVudF9vdXRwdXQocmVncywgbWFwLCBmbGFncywgZGF0YSwgc2l6ZSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX3BlcmZfZXZlbnRfb3V0cHV0X3Byb3RvX3RwID0gewpAQCAtNDcwLDExICs0OTQsMTggQEAKIAkuYXJnNV90eXBlCT0gQVJHX0NPTlNUX1NUQUNLX1NJWkUsCiB9OwogCi1zdGF0aWMgdTY0IGJwZl9nZXRfc3RhY2tpZF90cCh1NjQgcjEsIHU2NCByMiwgdTY0IHIzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzMoYnBmX2dldF9zdGFja2lkX3RwLCB2b2lkICosIHRwX2J1ZmYsIHN0cnVjdCBicGZfbWFwICosIG1hcCwKKwkgICB1NjQsIGZsYWdzKQogewotCXU2NCBjdHggPSAqKGxvbmcgKikodWludHB0cl90KXIxOworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gKihzdHJ1Y3QgcHRfcmVncyAqKil0cF9idWZmOwogCi0JcmV0dXJuIGJwZl9nZXRfc3RhY2tpZChjdHgsIHIyLCByMywgcjQsIHI1KTsKKwkvKgorCSAqIFNhbWUgY29tbWVudCBhcyBpbiBicGZfcGVyZl9ldmVudF9vdXRwdXRfdHAoKSwgb25seSB0aGF0IHRoaXMgdGltZQorCSAqIHRoZSBvdGhlciBoZWxwZXIncyBmdW5jdGlvbiBib2R5IGNhbm5vdCBiZSBpbmxpbmVkIGR1ZSB0byBiZWluZworCSAqIGV4dGVybmFsLCB0aHVzIHdlIG5lZWQgdG8gY2FsbCByYXcgaGVscGVyIGZ1bmN0aW9uLgorCSAqLworCXJldHVybiBicGZfZ2V0X3N0YWNraWQoKHVuc2lnbmVkIGxvbmcpIHJlZ3MsICh1bnNpZ25lZCBsb25nKSBtYXAsCisJCQkgICAgICAgZmxhZ3MsIDAsIDApOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9nZXRfc3RhY2tpZF9wcm90b190cCA9IHsKQEAgLTUyMCwxMCArNTUxLDY5IEBACiAJLnR5cGUJPSBCUEZfUFJPR19UWVBFX1RSQUNFUE9JTlQsCiB9OwogCitzdGF0aWMgYm9vbCBwZV9wcm9nX2lzX3ZhbGlkX2FjY2VzcyhpbnQgb2ZmLCBpbnQgc2l6ZSwgZW51bSBicGZfYWNjZXNzX3R5cGUgdHlwZSwKKwkJCQkgICAgZW51bSBicGZfcmVnX3R5cGUgKnJlZ190eXBlKQoreworCWlmIChvZmYgPCAwIHx8IG9mZiA+PSBzaXplb2Yoc3RydWN0IGJwZl9wZXJmX2V2ZW50X2RhdGEpKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKHR5cGUgIT0gQlBGX1JFQUQpCisJCXJldHVybiBmYWxzZTsKKwlpZiAob2ZmICUgc2l6ZSAhPSAwKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKG9mZiA9PSBvZmZzZXRvZihzdHJ1Y3QgYnBmX3BlcmZfZXZlbnRfZGF0YSwgc2FtcGxlX3BlcmlvZCkpIHsKKwkJaWYgKHNpemUgIT0gc2l6ZW9mKHU2NCkpCisJCQlyZXR1cm4gZmFsc2U7CisJfSBlbHNlIHsKKwkJaWYgKHNpemUgIT0gc2l6ZW9mKGxvbmcpKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHUzMiBwZV9wcm9nX2NvbnZlcnRfY3R4X2FjY2VzcyhlbnVtIGJwZl9hY2Nlc3NfdHlwZSB0eXBlLCBpbnQgZHN0X3JlZywKKwkJCQkgICAgICBpbnQgc3JjX3JlZywgaW50IGN0eF9vZmYsCisJCQkJICAgICAgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZiwKKwkJCQkgICAgICBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpCit7CisJc3RydWN0IGJwZl9pbnNuICppbnNuID0gaW5zbl9idWY7CisKKwlzd2l0Y2ggKGN0eF9vZmYpIHsKKwljYXNlIG9mZnNldG9mKHN0cnVjdCBicGZfcGVyZl9ldmVudF9kYXRhLCBzYW1wbGVfcGVyaW9kKToKKwkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSwgcGVyaW9kKSAhPSBzaXplb2YodTY0KSk7CisKKwkJKmluc24rKyA9IEJQRl9MRFhfTUVNKEJQRl9GSUVMRF9TSVpFT0Yoc3RydWN0IGJwZl9wZXJmX2V2ZW50X2RhdGFfa2VybiwKKwkJCQkJCSAgICAgICBkYXRhKSwgZHN0X3JlZywgc3JjX3JlZywKKwkJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3QgYnBmX3BlcmZfZXZlbnRfZGF0YV9rZXJuLCBkYXRhKSk7CisJCSppbnNuKysgPSBCUEZfTERYX01FTShCUEZfRFcsIGRzdF9yZWcsIGRzdF9yZWcsCisJCQkJICAgICAgb2Zmc2V0b2Yoc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEsIHBlcmlvZCkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkqaW5zbisrID0gQlBGX0xEWF9NRU0oQlBGX0ZJRUxEX1NJWkVPRihzdHJ1Y3QgYnBmX3BlcmZfZXZlbnRfZGF0YV9rZXJuLAorCQkJCQkJICAgICAgIHJlZ3MpLCBkc3RfcmVnLCBzcmNfcmVnLAorCQkJCSAgICAgIG9mZnNldG9mKHN0cnVjdCBicGZfcGVyZl9ldmVudF9kYXRhX2tlcm4sIHJlZ3MpKTsKKwkJKmluc24rKyA9IEJQRl9MRFhfTUVNKEJQRl9TSVpFT0YobG9uZyksIGRzdF9yZWcsIGRzdF9yZWcsIGN0eF9vZmYpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gaW5zbiAtIGluc25fYnVmOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl92ZXJpZmllcl9vcHMgcGVyZl9ldmVudF9wcm9nX29wcyA9IHsKKwkuZ2V0X2Z1bmNfcHJvdG8JCT0gdHBfcHJvZ19mdW5jX3Byb3RvLAorCS5pc192YWxpZF9hY2Nlc3MJPSBwZV9wcm9nX2lzX3ZhbGlkX2FjY2VzcywKKwkuY29udmVydF9jdHhfYWNjZXNzCT0gcGVfcHJvZ19jb252ZXJ0X2N0eF9hY2Nlc3MsCit9OworCitzdGF0aWMgc3RydWN0IGJwZl9wcm9nX3R5cGVfbGlzdCBwZXJmX2V2ZW50X3RsID0geworCS5vcHMJPSAmcGVyZl9ldmVudF9wcm9nX29wcywKKwkudHlwZQk9IEJQRl9QUk9HX1RZUEVfUEVSRl9FVkVOVCwKK307CisKIHN0YXRpYyBpbnQgX19pbml0IHJlZ2lzdGVyX2twcm9iZV9wcm9nX29wcyh2b2lkKQogewogCWJwZl9yZWdpc3Rlcl9wcm9nX3R5cGUoJmtwcm9iZV90bCk7CiAJYnBmX3JlZ2lzdGVyX3Byb2dfdHlwZSgmdHJhY2Vwb2ludF90bCk7CisJYnBmX3JlZ2lzdGVyX3Byb2dfdHlwZSgmcGVyZl9ldmVudF90bCk7CiAJcmV0dXJuIDA7CiB9CiBsYXRlX2luaXRjYWxsKHJlZ2lzdGVyX2twcm9iZV9wcm9nX29wcyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvZnRyYWNlLmMgYi9rZXJuZWwvdHJhY2UvZnRyYWNlLmMKaW5kZXggODQ3NTJjOC4uMjA1MGE3NjUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS9mdHJhY2UuYworKysgYi9rZXJuZWwvdHJhY2UvZnRyYWNlLmMKQEAgLTg3Miw3ICs4NzIsMTMgQEAKICNpZmRlZiBDT05GSUdfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSCiBzdGF0aWMgaW50IHByb2ZpbGVfZ3JhcGhfZW50cnkoc3RydWN0IGZ0cmFjZV9ncmFwaF9lbnQgKnRyYWNlKQogeworCWludCBpbmRleCA9IHRyYWNlLT5kZXB0aDsKKwogCWZ1bmN0aW9uX3Byb2ZpbGVfY2FsbCh0cmFjZS0+ZnVuYywgMCwgTlVMTCwgTlVMTCk7CisKKwlpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IEZUUkFDRV9SRVRGVU5DX0RFUFRIKQorCQljdXJyZW50LT5yZXRfc3RhY2tbaW5kZXhdLnN1YnRpbWUgPSAwOworCiAJcmV0dXJuIDE7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZS5jIGIva2VybmVsL3RyYWNlL3RyYWNlLmMKaW5kZXggZGFkZTRjOS4uODY5NmNlNiAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlLmMKQEAgLTEwNDcsNyArMTA0Nyw3IEBACiAgKgogICogU2hvd3MgcmVhbCBzdGF0ZSBvZiB0aGUgcmluZyBidWZmZXIgaWYgaXQgaXMgZW5hYmxlZCBvciBub3QuCiAgKi8KLXN0YXRpYyBpbnQgdHJhY2VyX3RyYWNpbmdfaXNfb24oc3RydWN0IHRyYWNlX2FycmF5ICp0cikKK2ludCB0cmFjZXJfdHJhY2luZ19pc19vbihzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyKQogewogCWlmICh0ci0+dHJhY2VfYnVmZmVyLmJ1ZmZlcikKIAkJcmV0dXJuIHJpbmdfYnVmZmVyX3JlY29yZF9pc19vbih0ci0+dHJhY2VfYnVmZmVyLmJ1ZmZlcik7CkBAIC00MTIzLDYgKzQxMjMsMzAgQEAKIAkiXHRcdFx0ICB0cmFjZXNcbiIKICNlbmRpZgogI2VuZGlmIC8qIENPTkZJR19TVEFDS19UUkFDRVIgKi8KKyNpZmRlZiBDT05GSUdfS1BST0JFX0VWRU5UCisJIiAga3Byb2JlX2V2ZW50c1x0XHQtIEFkZC9yZW1vdmUvc2hvdyB0aGUga2VybmVsIGR5bmFtaWMgZXZlbnRzXG4iCisJIlx0XHRcdCAgV3JpdGUgaW50byB0aGlzIGZpbGUgdG8gZGVmaW5lL3VuZGVmaW5lIG5ldyB0cmFjZSBldmVudHMuXG4iCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVVBST0JFX0VWRU5UCisJIiAgdXByb2JlX2V2ZW50c1x0XHQtIEFkZC9yZW1vdmUvc2hvdyB0aGUgdXNlcnNwYWNlIGR5bmFtaWMgZXZlbnRzXG4iCisJIlx0XHRcdCAgV3JpdGUgaW50byB0aGlzIGZpbGUgdG8gZGVmaW5lL3VuZGVmaW5lIG5ldyB0cmFjZSBldmVudHMuXG4iCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19LUFJPQkVfRVZFTlQpIHx8IGRlZmluZWQoQ09ORklHX1VQUk9CRV9FVkVOVCkKKwkiXHQgIGFjY2VwdHM6IGV2ZW50LWRlZmluaXRpb25zIChvbmUgZGVmaW5pdGlvbiBwZXIgbGluZSlcbiIKKwkiXHQgICBGb3JtYXQ6IHB8cls6Wzxncm91cD4vXTxldmVudD5dIDxwbGFjZT4gWzxhcmdzPl1cbiIKKwkiXHQgICAgICAgICAgIC06Wzxncm91cD4vXTxldmVudD5cbiIKKyNpZmRlZiBDT05GSUdfS1BST0JFX0VWRU5UCisJIlx0ICAgIHBsYWNlOiBbPG1vZHVsZT46XTxzeW1ib2w+Wys8b2Zmc2V0Pl18PG1lbWFkZHI+XG4iCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVVBST0JFX0VWRU5UCisJIlx0ICAgIHBsYWNlOiA8cGF0aD46PG9mZnNldD5cbiIKKyNlbmRpZgorCSJcdCAgICAgYXJnczogPG5hbWU+PWZldGNoYXJnWzp0eXBlXVxuIgorCSJcdCBmZXRjaGFyZzogJTxyZWdpc3Rlcj4sIEA8YWRkcmVzcz4sIEA8c3ltYm9sPlsrfC08b2Zmc2V0Pl0sXG4iCisJIlx0ICAgICAgICAgICAkc3RhY2s8aW5kZXg+LCAkc3RhY2ssICRyZXR2YWwsICRjb21tXG4iCisJIlx0ICAgICB0eXBlOiBzOC8xNi8zMi82NCwgdTgvMTYvMzIvNjQsIHg4LzE2LzMyLzY0LCBzdHJpbmcsXG4iCisJIlx0ICAgICAgICAgICBiPGJpdC13aWR0aD5APGJpdC1vZmZzZXQ+Lzxjb250YWluZXItc2l6ZT5cbiIKKyNlbmRpZgogCSIgIGV2ZW50cy9cdFx0LSBEaXJlY3RvcnkgY29udGFpbmluZyBhbGwgdHJhY2UgZXZlbnQgc3Vic3lzdGVtczpcbiIKIAkiICAgICAgZW5hYmxlXHRcdC0gV3JpdGUgMC8xIHRvIGVuYWJsZS9kaXNhYmxlIHRyYWNpbmcgb2YgYWxsIGV2ZW50c1xuIgogCSIgIGV2ZW50cy88c3lzdGVtPi9cdC0gRGlyZWN0b3J5IGNvbnRhaW5pbmcgYWxsIHRyYWNlIGV2ZW50cyBmb3IgPHN5c3RlbT46XG4iCkBAIC00OTQ1LDcgKzQ5NjksNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLSNpZmRlZiBDT05GSUdfVFJBQ0VSX01BWF9UUkFDRQorI2lmIGRlZmluZWQoQ09ORklHX1RSQUNFUl9NQVhfVFJBQ0UpIHx8IGRlZmluZWQoQ09ORklHX0hXTEFUX1RSQUNFUikKIAogc3RhdGljIHNzaXplX3QKIHRyYWNpbmdfbWF4X2xhdF9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqdWJ1ZiwKQEAgLTUxMjQsMTkgKzUxNDgsMjAgQEAKIAlzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJc3NpemVfdCBzcmV0OwogCi0JLyogcmV0dXJuIGFueSBsZWZ0b3ZlciBkYXRhICovCi0Jc3JldCA9IHRyYWNlX3NlcV90b191c2VyKCZpdGVyLT5zZXEsIHVidWYsIGNudCk7Ci0JaWYgKHNyZXQgIT0gLUVCVVNZKQotCQlyZXR1cm4gc3JldDsKLQotCXRyYWNlX3NlcV9pbml0KCZpdGVyLT5zZXEpOwotCiAJLyoKIAkgKiBBdm9pZCBtb3JlIHRoYW4gb25lIGNvbnN1bWVyIG9uIGEgc2luZ2xlIGZpbGUgZGVzY3JpcHRvcgogCSAqIFRoaXMgaXMganVzdCBhIG1hdHRlciBvZiB0cmFjZXMgY29oZXJlbmN5LCB0aGUgcmluZyBidWZmZXIgaXRzZWxmCiAJICogaXMgcHJvdGVjdGVkLgogCSAqLwogCW11dGV4X2xvY2soJml0ZXItPm11dGV4KTsKKworCS8qIHJldHVybiBhbnkgbGVmdG92ZXIgZGF0YSAqLworCXNyZXQgPSB0cmFjZV9zZXFfdG9fdXNlcigmaXRlci0+c2VxLCB1YnVmLCBjbnQpOworCWlmIChzcmV0ICE9IC1FQlVTWSkKKwkJZ290byBvdXQ7CisKKwl0cmFjZV9zZXFfaW5pdCgmaXRlci0+c2VxKTsKKwogCWlmIChpdGVyLT50cmFjZS0+cmVhZCkgewogCQlzcmV0ID0gaXRlci0+dHJhY2UtPnJlYWQoaXRlciwgZmlscCwgdWJ1ZiwgY250LCBwcG9zKTsKIAkJaWYgKHNyZXQpCkBAIC01ODY3LDcgKzU4OTIsNyBAQAogCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKIH07CiAKLSNpZmRlZiBDT05GSUdfVFJBQ0VSX01BWF9UUkFDRQorI2lmIGRlZmluZWQoQ09ORklHX1RSQUNFUl9NQVhfVFJBQ0UpIHx8IGRlZmluZWQoQ09ORklHX0hXTEFUX1RSQUNFUikKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHRyYWNpbmdfbWF4X2xhdF9mb3BzID0gewogCS5vcGVuCQk9IHRyYWNpbmdfb3Blbl9nZW5lcmljLAogCS5yZWFkCQk9IHRyYWNpbmdfbWF4X2xhdF9yZWFkLApAQCAtNjE2Myw5ICs2MTg4LDYgQEAKIAkJcmV0dXJuIC1FQlVTWTsKICNlbmRpZgogCi0JaWYgKHNwbGljZV9ncm93X3NwZChwaXBlLCAmc3BkKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAlpZiAoKnBwb3MgJiAoUEFHRV9TSVpFIC0gMSkpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC02MTc1LDYgKzYxOTcsOSBAQAogCQlsZW4gJj0gUEFHRV9NQVNLOwogCX0KIAorCWlmIChzcGxpY2VfZ3Jvd19zcGQocGlwZSwgJnNwZCkpCisJCXJldHVybiAtRU5PTUVNOworCiAgYWdhaW46CiAJdHJhY2VfYWNjZXNzX2xvY2soaXRlci0+Y3B1X2ZpbGUpOwogCWVudHJpZXMgPSByaW5nX2J1ZmZlcl9lbnRyaWVzX2NwdShpdGVyLT50cmFjZV9idWZmZXItPmJ1ZmZlciwgaXRlci0+Y3B1X2ZpbGUpOwpAQCAtNjIzMiwxOSArNjI1NywyMSBAQAogCS8qIGRpZCB3ZSByZWFkIGFueXRoaW5nPyAqLwogCWlmICghc3BkLm5yX3BhZ2VzKSB7CiAJCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCQkJZ290byBvdXQ7CiAKKwkJcmV0ID0gLUVBR0FJTjsKIAkJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgfHwgKGZsYWdzICYgU1BMSUNFX0ZfTk9OQkxPQ0spKQotCQkJcmV0dXJuIC1FQUdBSU47CisJCQlnb3RvIG91dDsKIAogCQlyZXQgPSB3YWl0X29uX3BpcGUoaXRlciwgdHJ1ZSk7CiAJCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCQkJZ290byBvdXQ7CiAKIAkJZ290byBhZ2FpbjsKIAl9CiAKIAlyZXQgPSBzcGxpY2VfdG9fcGlwZShwaXBlLCAmc3BkKTsKK291dDoKIAlzcGxpY2Vfc2hyaW5rX3NwZCgmc3BkKTsKIAogCXJldHVybiByZXQ7CkBAIC03MTk1LDcgKzcyMjIsNyBAQAogCiAJY3JlYXRlX3RyYWNlX29wdGlvbnNfZGlyKHRyKTsKIAotI2lmZGVmIENPTkZJR19UUkFDRVJfTUFYX1RSQUNFCisjaWYgZGVmaW5lZChDT05GSUdfVFJBQ0VSX01BWF9UUkFDRSkgfHwgZGVmaW5lZChDT05GSUdfSFdMQVRfVFJBQ0VSKQogCXRyYWNlX2NyZWF0ZV9maWxlKCJ0cmFjaW5nX21heF9sYXRlbmN5IiwgMDY0NCwgZF90cmFjZXIsCiAJCQkmdHItPm1heF9sYXRlbmN5LCAmdHJhY2luZ19tYXhfbGF0X2ZvcHMpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2UuaCBiL2tlcm5lbC90cmFjZS90cmFjZS5oCmluZGV4IGY3ODNkZjQuLmZkMjRiMWYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZS5oCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZS5oCkBAIC0zOCw2ICszOCw3IEBACiAJVFJBQ0VfVVNFUl9TVEFDSywKIAlUUkFDRV9CTEssCiAJVFJBQ0VfQlBVVFMsCisJVFJBQ0VfSFdMQVQsCiAKIAlfX1RSQUNFX0xBU1RfVFlQRSwKIH07CkBAIC0yMTMsNiArMjE0LDggQEAKIAkgKi8KIAlzdHJ1Y3QgdHJhY2VfYnVmZmVyCW1heF9idWZmZXI7CiAJYm9vbAkJCWFsbG9jYXRlZF9zbmFwc2hvdDsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1RSQUNFUl9NQVhfVFJBQ0UpIHx8IGRlZmluZWQoQ09ORklHX0hXTEFUX1RSQUNFUikKIAl1bnNpZ25lZCBsb25nCQltYXhfbGF0ZW5jeTsKICNlbmRpZgogCXN0cnVjdCB0cmFjZV9waWRfbGlzdAlfX3JjdSAqZmlsdGVyZWRfcGlkczsKQEAgLTMyNiw2ICszMjksNyBAQAogCQlJRl9BU1NJR04odmFyLCBlbnQsIHN0cnVjdCBwcmludF9lbnRyeSwgVFJBQ0VfUFJJTlQpOwlcCiAJCUlGX0FTU0lHTih2YXIsIGVudCwgc3RydWN0IGJwcmludF9lbnRyeSwgVFJBQ0VfQlBSSU5UKTsJXAogCQlJRl9BU1NJR04odmFyLCBlbnQsIHN0cnVjdCBicHV0c19lbnRyeSwgVFJBQ0VfQlBVVFMpOwlcCisJCUlGX0FTU0lHTih2YXIsIGVudCwgc3RydWN0IGh3bGF0X2VudHJ5LCBUUkFDRV9IV0xBVCk7CVwKIAkJSUZfQVNTSUdOKHZhciwgZW50LCBzdHJ1Y3QgdHJhY2VfbW1pb3RyYWNlX3J3LAkJXAogCQkJICBUUkFDRV9NTUlPX1JXKTsJCQkJXAogCQlJRl9BU1NJR04odmFyLCBlbnQsIHN0cnVjdCB0cmFjZV9tbWlvdHJhY2VfbWFwLAkJXApAQCAtNTcxLDYgKzU3NSw3IEBACiB2b2lkIHRyYWNpbmdfcmVzZXRfYWxsX29ubGluZV9jcHVzKHZvaWQpOwogaW50IHRyYWNpbmdfb3Blbl9nZW5lcmljKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKTsKIGJvb2wgdHJhY2luZ19pc19kaXNhYmxlZCh2b2lkKTsKK2ludCB0cmFjZXJfdHJhY2luZ19pc19vbihzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyKTsKIHN0cnVjdCBkZW50cnkgKnRyYWNlX2NyZWF0ZV9maWxlKGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJIHVtb2RlX3QgbW9kZSwKIAkJCQkgc3RydWN0IGRlbnRyeSAqcGFyZW50LApkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2VudHJpZXMuaCBiL2tlcm5lbC90cmFjZS90cmFjZV9lbnRyaWVzLmgKaW5kZXggNWMzMGVmYy4uZDFjYzM3ZSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2VudHJpZXMuaAorKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZW50cmllcy5oCkBAIC0zMjIsMyArMzIyLDMwIEBACiAJRklMVEVSX09USEVSCiApOwogCisKK0ZUUkFDRV9FTlRSWShod2xhdCwgaHdsYXRfZW50cnksCisKKwlUUkFDRV9IV0xBVCwKKworCUZfU1RSVUNUKAorCQlfX2ZpZWxkKAl1NjQsCQkJZHVyYXRpb24JKQorCQlfX2ZpZWxkKAl1NjQsCQkJb3V0ZXJfZHVyYXRpb24JKQorCQlfX2ZpZWxkKAl1NjQsCQkJbm1pX3RvdGFsX3RzCSkKKwkJX19maWVsZF9zdHJ1Y3QoIHN0cnVjdCB0aW1lc3BlYywJdGltZXN0YW1wCSkKKwkJX19maWVsZF9kZXNjKAlsb25nLAl0aW1lc3RhbXAsCXR2X3NlYwkJKQorCQlfX2ZpZWxkX2Rlc2MoCWxvbmcsCXRpbWVzdGFtcCwJdHZfbnNlYwkJKQorCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsCQlubWlfY291bnQJKQorCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsCQlzZXFudW0JCSkKKwkpLAorCisJRl9wcmludGsoImNudDoldVx0dHM6JTAxMGx1LiUwMTBsdVx0aW5uZXI6JWxsdVx0b3V0ZXI6JWxsdW5taS10czolbGx1XHRubWktY291bnQ6JXVcbiIsCisJCSBfX2VudHJ5LT5zZXFudW0sCisJCSBfX2VudHJ5LT50dl9zZWMsCisJCSBfX2VudHJ5LT50dl9uc2VjLAorCQkgX19lbnRyeS0+ZHVyYXRpb24sCisJCSBfX2VudHJ5LT5vdXRlcl9kdXJhdGlvbiwKKwkJIF9fZW50cnktPm5taV90b3RhbF90cywKKwkJIF9fZW50cnktPm5taV9jb3VudCksCisKKwlGSUxURVJfT1RIRVIKKyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzX3RyaWdnZXIuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHNfdHJpZ2dlci5jCmluZGV4IGE5NzU1NzEuLjY3MjFhMWU4IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzX3RyaWdnZXIuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzX3RyaWdnZXIuYwpAQCAtMTAyOCw2ICsxMDI4LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgZXZlbnRfY29tbWFuZCB0cmlnZ2VyX3RyYWNlb2ZmX2NtZCA9IHsKIAkubmFtZQkJCT0gInRyYWNlb2ZmIiwKIAkudHJpZ2dlcl90eXBlCQk9IEVUVF9UUkFDRV9PTk9GRiwKKwkuZmxhZ3MJCQk9IEVWRU5UX0NNRF9GTF9QT1NUX1RSSUdHRVIsCiAJLmZ1bmMJCQk9IGV2ZW50X3RyaWdnZXJfY2FsbGJhY2ssCiAJLnJlZwkJCT0gcmVnaXN0ZXJfdHJpZ2dlciwKIAkudW5yZWcJCQk9IHVucmVnaXN0ZXJfdHJpZ2dlciwKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9mdW5jdGlvbnNfZ3JhcGguYyBiL2tlcm5lbC90cmFjZS90cmFjZV9mdW5jdGlvbnNfZ3JhcGguYwppbmRleCA3MzYzY2NmLi40ZTQ4MGU4IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfZnVuY3Rpb25zX2dyYXBoLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2Z1bmN0aW9uc19ncmFwaC5jCkBAIC0xMTksNyArMTE5LDcgQEAKIC8qIEFkZCBhIGZ1bmN0aW9uIHJldHVybiBhZGRyZXNzIHRvIHRoZSB0cmFjZSBzdGFjayBvbiB0aHJlYWQgaW5mby4qLwogaW50CiBmdHJhY2VfcHVzaF9yZXR1cm5fdHJhY2UodW5zaWduZWQgbG9uZyByZXQsIHVuc2lnbmVkIGxvbmcgZnVuYywgaW50ICpkZXB0aCwKLQkJCSB1bnNpZ25lZCBsb25nIGZyYW1lX3BvaW50ZXIpCisJCQkgdW5zaWduZWQgbG9uZyBmcmFtZV9wb2ludGVyLCB1bnNpZ25lZCBsb25nICpyZXRwKQogewogCXVuc2lnbmVkIGxvbmcgbG9uZyBjYWxsdGltZTsKIAlpbnQgaW5kZXg7CkBAIC0xNzAsOCArMTcwLDEyIEBACiAJY3VycmVudC0+cmV0X3N0YWNrW2luZGV4XS5yZXQgPSByZXQ7CiAJY3VycmVudC0+cmV0X3N0YWNrW2luZGV4XS5mdW5jID0gZnVuYzsKIAljdXJyZW50LT5yZXRfc3RhY2tbaW5kZXhdLmNhbGx0aW1lID0gY2FsbHRpbWU7Ci0JY3VycmVudC0+cmV0X3N0YWNrW2luZGV4XS5zdWJ0aW1lID0gMDsKKyNpZmRlZiBIQVZFX0ZVTkNUSU9OX0dSQVBIX0ZQX1RFU1QKIAljdXJyZW50LT5yZXRfc3RhY2tbaW5kZXhdLmZwID0gZnJhbWVfcG9pbnRlcjsKKyNlbmRpZgorI2lmZGVmIEhBVkVfRlVOQ1RJT05fR1JBUEhfUkVUX0FERFJfUFRSCisJY3VycmVudC0+cmV0X3N0YWNrW2luZGV4XS5yZXRwID0gcmV0cDsKKyNlbmRpZgogCSpkZXB0aCA9IGN1cnJlbnQtPmN1cnJfcmV0X3N0YWNrOwogCiAJcmV0dXJuIDA7CkBAIC0yMDQsNyArMjA4LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotI2lmIGRlZmluZWQoQ09ORklHX0hBVkVfRlVOQ1RJT05fR1JBUEhfRlBfVEVTVCkgJiYgIWRlZmluZWQoQ0NfVVNJTkdfRkVOVFJZKQorI2lmZGVmIEhBVkVfRlVOQ1RJT05fR1JBUEhfRlBfVEVTVAogCS8qCiAJICogVGhlIGFyY2ggbWF5IGNob29zZSB0byByZWNvcmQgdGhlIGZyYW1lIHBvaW50ZXIgdXNlZAogCSAqIGFuZCBjaGVjayBpdCBoZXJlIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIHdoYXQgd2UgZXhwZWN0IGl0CkBAIC0yNzksNiArMjgzLDY0IEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyoqCisgKiBmdHJhY2VfZ3JhcGhfcmV0X2FkZHIgLSBjb252ZXJ0IGEgcG90ZW50aWFsbHkgbW9kaWZpZWQgc3RhY2sgcmV0dXJuIGFkZHJlc3MKKyAqCQkJICAgdG8gaXRzIG9yaWdpbmFsIHZhbHVlCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGJ5IHN0YWNrIHVud2luZGluZyBjb2RlIHRvIGNvbnZlcnQgYSBmb3VuZCBzdGFjaworICogcmV0dXJuIGFkZHJlc3MgKCdyZXQnKSB0byBpdHMgb3JpZ2luYWwgdmFsdWUsIGluIGNhc2UgdGhlIGZ1bmN0aW9uIGdyYXBoCisgKiB0cmFjZXIgaGFzIG1vZGlmaWVkIGl0IHRvIGJlICdyZXR1cm5fdG9faGFuZGxlcicuICBJZiB0aGUgYWRkcmVzcyBoYXNuJ3QKKyAqIGJlZW4gbW9kaWZpZWQsIHRoZSB1bmNoYW5nZWQgdmFsdWUgb2YgJ3JldCcgaXMgcmV0dXJuZWQuCisgKgorICogJ2lkeCcgaXMgYSBzdGF0ZSB2YXJpYWJsZSB3aGljaCBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgYnkgdGhlIGNhbGxlciB0byB6ZXJvCisgKiBiZWZvcmUgdGhlIGZpcnN0IGNhbGwuCisgKgorICogJ3JldHAnIGlzIGEgcG9pbnRlciB0byB0aGUgcmV0dXJuIGFkZHJlc3Mgb24gdGhlIHN0YWNrLiAgSXQncyBpZ25vcmVkIGlmCisgKiB0aGUgYXJjaCBkb2Vzbid0IGhhdmUgSEFWRV9GVU5DVElPTl9HUkFQSF9SRVRfQUREUl9QVFIgZGVmaW5lZC4KKyAqLworI2lmZGVmIEhBVkVfRlVOQ1RJT05fR1JBUEhfUkVUX0FERFJfUFRSCit1bnNpZ25lZCBsb25nIGZ0cmFjZV9ncmFwaF9yZXRfYWRkcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCAqaWR4LAorCQkJCSAgICB1bnNpZ25lZCBsb25nIHJldCwgdW5zaWduZWQgbG9uZyAqcmV0cCkKK3sKKwlpbnQgaW5kZXggPSB0YXNrLT5jdXJyX3JldF9zdGFjazsKKwlpbnQgaTsKKworCWlmIChyZXQgIT0gKHVuc2lnbmVkIGxvbmcpcmV0dXJuX3RvX2hhbmRsZXIpCisJCXJldHVybiByZXQ7CisKKwlpZiAoaW5kZXggPCAtMSkKKwkJaW5kZXggKz0gRlRSQUNFX05PVFJBQ0VfREVQVEg7CisKKwlpZiAoaW5kZXggPCAwKQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8PSBpbmRleDsgaSsrKQorCQlpZiAodGFzay0+cmV0X3N0YWNrW2ldLnJldHAgPT0gcmV0cCkKKwkJCXJldHVybiB0YXNrLT5yZXRfc3RhY2tbaV0ucmV0OworCisJcmV0dXJuIHJldDsKK30KKyNlbHNlIC8qICFIQVZFX0ZVTkNUSU9OX0dSQVBIX1JFVF9BRERSX1BUUiAqLwordW5zaWduZWQgbG9uZyBmdHJhY2VfZ3JhcGhfcmV0X2FkZHIoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgKmlkeCwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyByZXQsIHVuc2lnbmVkIGxvbmcgKnJldHApCit7CisJaW50IHRhc2tfaWR4OworCisJaWYgKHJldCAhPSAodW5zaWduZWQgbG9uZylyZXR1cm5fdG9faGFuZGxlcikKKwkJcmV0dXJuIHJldDsKKworCXRhc2tfaWR4ID0gdGFzay0+Y3Vycl9yZXRfc3RhY2s7CisKKwlpZiAoIXRhc2stPnJldF9zdGFjayB8fCB0YXNrX2lkeCA8ICppZHgpCisJCXJldHVybiByZXQ7CisKKwl0YXNrX2lkeCAtPSAqaWR4OworCSgqaWR4KSsrOworCisJcmV0dXJuIHRhc2stPnJldF9zdGFja1t0YXNrX2lkeF0ucmV0OworfQorI2VuZGlmIC8qIEhBVkVfRlVOQ1RJT05fR1JBUEhfUkVUX0FERFJfUFRSICovCisKIGludCBfX3RyYWNlX2dyYXBoX2VudHJ5KHN0cnVjdCB0cmFjZV9hcnJheSAqdHIsCiAJCQkJc3RydWN0IGZ0cmFjZV9ncmFwaF9lbnQgKnRyYWNlLAogCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsCkBAIC0xMTIwLDYgKzExODIsMTEgQEAKIAl0cmFjZV9zZXFfcHV0cyhzLCAiLyogIik7CiAKIAlzd2l0Y2ggKGl0ZXItPmVudC0+dHlwZSkgeworCWNhc2UgVFJBQ0VfQlBVVFM6CisJCXJldCA9IHRyYWNlX3ByaW50X2JwdXRzX21zZ19vbmx5KGl0ZXIpOworCQlpZiAocmV0ICE9IFRSQUNFX1RZUEVfSEFORExFRCkKKwkJCXJldHVybiByZXQ7CisJCWJyZWFrOwogCWNhc2UgVFJBQ0VfQlBSSU5UOgogCQlyZXQgPSB0cmFjZV9wcmludF9icHJpbnRrX21zZ19vbmx5KGl0ZXIpOwogCQlpZiAocmV0ICE9IFRSQUNFX1RZUEVfSEFORExFRCkKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9od2xhdC5jIGIva2VybmVsL3RyYWNlL3RyYWNlX2h3bGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk3Mjg2YwotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9od2xhdC5jCkBAIC0wLDAgKzEsNjMzIEBACisvKgorICogdHJhY2VfaHdsYXRkZXRlY3QuYyAtIEEgc2ltcGxlIEhhcmR3YXJlIExhdGVuY3kgZGV0ZWN0b3IuCisgKgorICogVXNlIHRoaXMgdHJhY2VyIHRvIGRldGVjdCBsYXJnZSBzeXN0ZW0gbGF0ZW5jaWVzIGluZHVjZWQgYnkgdGhlIGJlaGF2aW9yIG9mCisgKiBjZXJ0YWluIHVuZGVybHlpbmcgc3lzdGVtIGhhcmR3YXJlIG9yIGZpcm13YXJlLCBpbmRlcGVuZGVudCBvZiBMaW51eCBpdHNlbGYuCisgKiBUaGUgY29kZSB3YXMgZGV2ZWxvcGVkIG9yaWdpbmFsbHkgdG8gZGV0ZWN0IHRoZSBwcmVzZW5jZSBvZiBTTUlzIG9uIEludGVsCisgKiBhbmQgQU1EIHN5c3RlbXMsIGFsdGhvdWdoIHRoZXJlIGlzIG5vIGRlcGVuZGVuY3kgdXBvbiB4ODYgaGVyZWluLgorICoKKyAqIFRoZSBjbGFzc2ljYWwgZXhhbXBsZSB1c2FnZSBvZiB0aGlzIHRyYWNlciBpcyBpbiBkZXRlY3RpbmcgdGhlIHByZXNlbmNlIG9mCisgKiBTTUlzIG9yIFN5c3RlbSBNYW5hZ2VtZW50IEludGVycnVwdHMgb24gSW50ZWwgYW5kIEFNRCBzeXN0ZW1zLiBBbiBTTUkgaXMgYQorICogc29tZXdoYXQgc3BlY2lhbCBmb3JtIG9mIGhhcmR3YXJlIGludGVycnVwdCBzcGF3bmVkIGZyb20gZWFybGllciBDUFUgZGVidWcKKyAqIG1vZGVzIGluIHdoaWNoIHRoZSAoQklPUy9FRkkvZXRjLikgZmlybXdhcmUgYXJyYW5nZXMgZm9yIHRoZSBTb3V0aCBCcmlkZ2UKKyAqIExQQyAob3Igb3RoZXIgZGV2aWNlKSB0byBnZW5lcmF0ZSBhIHNwZWNpYWwgaW50ZXJydXB0IHVuZGVyIGNlcnRhaW4KKyAqIGNpcmN1bXN0YW5jZXMsIGZvciBleGFtcGxlLCB1cG9uIGV4cGlyYXRpb24gb2YgYSBzcGVjaWFsIFNNSSB0aW1lciBkZXZpY2UsCisgKiBkdWUgdG8gY2VydGFpbiBleHRlcm5hbCB0aGVybWFsIHJlYWRpbmdzLCBvbiBjZXJ0YWluIEkvTyBhZGRyZXNzIGFjY2Vzc2VzLAorICogYW5kIG90aGVyIHNpdHVhdGlvbnMuIEFuIFNNSSBoaXRzIGEgc3BlY2lhbCBDUFUgcGluLCB0cmlnZ2VycyBhIHNwZWNpYWwKKyAqIFNNSSBtb2RlIChjb21wbGV0ZSB3aXRoIHNwZWNpYWwgbWVtb3J5IG1hcCksIGFuZCB0aGUgT1MgaXMgdW5hd2FyZS4KKyAqCisgKiBBbHRob3VnaCBjZXJ0YWluIGhhcmR3YXJlLWluZHVjaW5nIGxhdGVuY2llcyBhcmUgbmVjZXNzYXJ5IChmb3IgZXhhbXBsZSwKKyAqIGEgbW9kZXJuIHN5c3RlbSBvZnRlbiByZXF1aXJlcyBhbiBTTUkgaGFuZGxlciBmb3IgY29ycmVjdCB0aGVybWFsIGNvbnRyb2wKKyAqIGFuZCByZW1vdGUgbWFuYWdlbWVudCkgdGhleSBjYW4gd3JlYWsgaGF2b2MgdXBvbiBhbnkgT1MtbGV2ZWwgcGVyZm9ybWFuY2UKKyAqIGd1YXJhbnRlZXMgdG93YXJkIGxvdy1sYXRlbmN5LCBlc3BlY2lhbGx5IHdoZW4gdGhlIE9TIGlzIG5vdCBldmVuIG1hZGUKKyAqIGF3YXJlIG9mIHRoZSBwcmVzZW5jZSBvZiB0aGVzZSBpbnRlcnJ1cHRzLiBGb3IgdGhpcyByZWFzb24sIHdlIG5lZWQgYQorICogc29tZXdoYXQgYnJ1dGUgZm9yY2UgbWVjaGFuaXNtIHRvIGRldGVjdCB0aGVzZSBpbnRlcnJ1cHRzLiBJbiB0aGlzIGNhc2UsCisgKiB3ZSBkbyBpdCBieSBob2dnaW5nIGFsbCBvZiB0aGUgQ1BVKHMpIGZvciBjb25maWd1cmFibGUgdGltZXIgaW50ZXJ2YWxzLAorICogc2FtcGxpbmcgdGhlIGJ1aWx0LWluIENQVSB0aW1lciwgbG9va2luZyBmb3IgZGlzY29udGlndW91cyByZWFkaW5ncy4KKyAqCisgKiBXQVJOSU5HOiBUaGlzIGltcGxlbWVudGF0aW9uIG5lY2Vzc2FyaWx5IGludHJvZHVjZXMgbGF0ZW5jaWVzLiBUaGVyZWZvcmUsCisgKiAgICAgICAgICB5b3Ugc2hvdWxkIE5FVkVSIHVzZSB0aGlzIHRyYWNlciB3aGlsZSBydW5uaW5nIGluIGEgcHJvZHVjdGlvbgorICogICAgICAgICAgZW52aXJvbm1lbnQgcmVxdWlyaW5nIGFueSBraW5kIG9mIGxvdy1sYXRlbmN5IHBlcmZvcm1hbmNlCisgKiAgICAgICAgICBndWFyYW50ZWUocykuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgSm9uIE1hc3RlcnMsIFJlZCBIYXQsIEluYy4gPGpjbUByZWRoYXQuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTYgU3RldmVuIFJvc3RlZHQsIFJlZCBIYXQsIEluYy4gPHNyb3N0ZWR0QHJlZGhhdC5jb20+CisgKgorICogSW5jbHVkZXMgdXNlZnVsIGZlZWRiYWNrIGZyb20gQ2xhcmsgV2lsbGlhbXMgPGNsYXJrQHJlZGhhdC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZWZzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgInRyYWNlLmgiCisKK3N0YXRpYyBzdHJ1Y3QgdHJhY2VfYXJyYXkJKmh3bGF0X3RyYWNlOworCisjZGVmaW5lIFU2NFNUUl9TSVpFCQkyMgkJCS8qIDIwIGRpZ2l0cyBtYXggKi8KKworI2RlZmluZSBCQU5ORVIJCQkiaHdsYXRfZGV0ZWN0b3I6ICIKKyNkZWZpbmUgREVGQVVMVF9TQU1QTEVfV0lORE9XCTEwMDAwMDAJCQkvKiAxcyAqLworI2RlZmluZSBERUZBVUxUX1NBTVBMRV9XSURUSAk1MDAwMDAJCQkvKiAwLjVzICovCisjZGVmaW5lIERFRkFVTFRfTEFUX1RIUkVTSE9MRAkxMAkJCS8qIDEwdXMgKi8KKworLyogc2FtcGxpbmcgdGhyZWFkKi8KK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmh3bGF0X2t0aHJlYWQ7CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpod2xhdF9zYW1wbGVfd2lkdGg7CS8qIHNhbXBsZSB3aWR0aCB1cyAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKmh3bGF0X3NhbXBsZV93aW5kb3c7CS8qIHNhbXBsZSB3aW5kb3cgdXMgKi8KKworLyogU2F2ZSB0aGUgcHJldmlvdXMgdHJhY2luZ190aHJlc2ggdmFsdWUgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNhdmVfdHJhY2luZ190aHJlc2g7CisKKy8qIE5NSSB0aW1lc3RhbXAgY291bnRlcnMgKi8KK3N0YXRpYyB1NjQgbm1pX3RzX3N0YXJ0Oworc3RhdGljIHU2NCBubWlfdG90YWxfdHM7CitzdGF0aWMgaW50IG5taV9jb3VudDsKK3N0YXRpYyBpbnQgbm1pX2NwdTsKKworLyogVGVsbHMgTk1JcyB0byBjYWxsIGJhY2sgdG8gdGhlIGh3bGF0IHRyYWNlciB0byByZWNvcmQgdGltZXN0YW1wcyAqLworYm9vbCB0cmFjZV9od2xhdF9jYWxsYmFja19lbmFibGVkOworCisvKiBJZiB0aGUgdXNlciBjaGFuZ2VkIHRocmVzaG9sZCwgcmVtZW1iZXIgaXQgKi8KK3N0YXRpYyB1NjQgbGFzdF90cmFjaW5nX3RocmVzaCA9IERFRkFVTFRfTEFUX1RIUkVTSE9MRCAqIE5TRUNfUEVSX1VTRUM7CisKKy8qIEluZGl2aWR1YWwgbGF0ZW5jeSBzYW1wbGVzIGFyZSBzdG9yZWQgaGVyZSB3aGVuIGRldGVjdGVkLiAqLworc3RydWN0IGh3bGF0X3NhbXBsZSB7CisJdTY0CQlzZXFudW07CQkvKiB1bmlxdWUgc2VxdWVuY2UgKi8KKwl1NjQJCWR1cmF0aW9uOwkvKiBkZWx0YSAqLworCXU2NAkJb3V0ZXJfZHVyYXRpb247CS8qIGRlbHRhIChvdXRlciBsb29wKSAqLworCXU2NAkJbm1pX3RvdGFsX3RzOwkvKiBUb3RhbCB0aW1lIHNwZW50IGluIE5NSXMgKi8KKwlzdHJ1Y3QgdGltZXNwZWMJdGltZXN0YW1wOwkvKiB3YWxsIHRpbWUgKi8KKwlpbnQJCW5taV9jb3VudDsJLyogIyBOTUlzIGR1cmluZyB0aGlzIHNhbXBsZSAqLworfTsKKworLyoga2VlcCB0aGUgZ2xvYmFsIHN0YXRlIHNvbWV3aGVyZS4gKi8KK3N0YXRpYyBzdHJ1Y3QgaHdsYXRfZGF0YSB7CisKKwlzdHJ1Y3QgbXV0ZXggbG9jazsJCS8qIHByb3RlY3QgY2hhbmdlcyAqLworCisJdTY0CWNvdW50OwkJCS8qIHRvdGFsIHNpbmNlIHJlc2V0ICovCisKKwl1NjQJc2FtcGxlX3dpbmRvdzsJCS8qIHRvdGFsIHNhbXBsaW5nIHdpbmRvdyAob24rb2ZmKSAqLworCXU2NAlzYW1wbGVfd2lkdGg7CQkvKiBhY3RpdmUgc2FtcGxpbmcgcG9ydGlvbiBvZiB3aW5kb3cgKi8KKworfSBod2xhdF9kYXRhID0geworCS5zYW1wbGVfd2luZG93CQk9IERFRkFVTFRfU0FNUExFX1dJTkRPVywKKwkuc2FtcGxlX3dpZHRoCQk9IERFRkFVTFRfU0FNUExFX1dJRFRILAorfTsKKworc3RhdGljIHZvaWQgdHJhY2VfaHdsYXRfc2FtcGxlKHN0cnVjdCBod2xhdF9zYW1wbGUgKnNhbXBsZSkKK3sKKwlzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyID0gaHdsYXRfdHJhY2U7CisJc3RydWN0IHRyYWNlX2V2ZW50X2NhbGwgKmNhbGwgPSAmZXZlbnRfaHdsYXQ7CisJc3RydWN0IHJpbmdfYnVmZmVyICpidWZmZXIgPSB0ci0+dHJhY2VfYnVmZmVyLmJ1ZmZlcjsKKwlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50OworCXN0cnVjdCBod2xhdF9lbnRyeSAqZW50cnk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcGM7CisKKwlwYyA9IHByZWVtcHRfY291bnQoKTsKKwlsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsKKworCWV2ZW50ID0gdHJhY2VfYnVmZmVyX2xvY2tfcmVzZXJ2ZShidWZmZXIsIFRSQUNFX0hXTEFULCBzaXplb2YoKmVudHJ5KSwKKwkJCQkJICBmbGFncywgcGMpOworCWlmICghZXZlbnQpCisJCXJldHVybjsKKwllbnRyeQk9IHJpbmdfYnVmZmVyX2V2ZW50X2RhdGEoZXZlbnQpOworCWVudHJ5LT5zZXFudW0JCQk9IHNhbXBsZS0+c2VxbnVtOworCWVudHJ5LT5kdXJhdGlvbgkJCT0gc2FtcGxlLT5kdXJhdGlvbjsKKwllbnRyeS0+b3V0ZXJfZHVyYXRpb24JCT0gc2FtcGxlLT5vdXRlcl9kdXJhdGlvbjsKKwllbnRyeS0+dGltZXN0YW1wCQk9IHNhbXBsZS0+dGltZXN0YW1wOworCWVudHJ5LT5ubWlfdG90YWxfdHMJCT0gc2FtcGxlLT5ubWlfdG90YWxfdHM7CisJZW50cnktPm5taV9jb3VudAkJPSBzYW1wbGUtPm5taV9jb3VudDsKKworCWlmICghY2FsbF9maWx0ZXJfY2hlY2tfZGlzY2FyZChjYWxsLCBlbnRyeSwgYnVmZmVyLCBldmVudCkpCisJCV9fYnVmZmVyX3VubG9ja19jb21taXQoYnVmZmVyLCBldmVudCk7Cit9CisKKy8qIE1hY3JvcyB0byBlbmNhcHN1bGF0ZSB0aGUgdGltZSBjYXB0dXJpbmcgaW5mcmFzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgdGltZV90eXBlCXU2NAorI2RlZmluZSB0aW1lX2dldCgpCXRyYWNlX2Nsb2NrX2xvY2FsKCkKKyNkZWZpbmUgdGltZV90b191cyh4KQlkaXZfdTY0KHgsIDEwMDApCisjZGVmaW5lIHRpbWVfc3ViKGEsIGIpCSgoYSkgLSAoYikpCisjZGVmaW5lIGluaXRfdGltZShhLCBiKQkoYSA9IGIpCisjZGVmaW5lIHRpbWVfdTY0KGEpCWEKKwordm9pZCB0cmFjZV9od2xhdF9jYWxsYmFjayhib29sIGVudGVyKQoreworCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgIT0gbm1pX2NwdSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBDdXJyZW50bHkgdHJhY2VfY2xvY2tfbG9jYWwoKSBjYWxscyBzY2hlZF9jbG9jaygpIGFuZCB0aGUKKwkgKiBnZW5lcmljIHZlcnNpb24gaXMgbm90IE5NSSBzYWZlLgorCSAqLworCWlmICghSVNfRU5BQkxFRChDT05GSUdfR0VORVJJQ19TQ0hFRF9DTE9DSykpIHsKKwkJaWYgKGVudGVyKQorCQkJbm1pX3RzX3N0YXJ0ID0gdGltZV9nZXQoKTsKKwkJZWxzZQorCQkJbm1pX3RvdGFsX3RzID0gdGltZV9nZXQoKSAtIG5taV90c19zdGFydDsKKwl9CisKKwlpZiAoZW50ZXIpCisJCW5taV9jb3VudCsrOworfQorCisvKioKKyAqIGdldF9zYW1wbGUgLSBzYW1wbGUgdGhlIENQVSBUU0MgYW5kIGxvb2sgZm9yIGxpa2VseSBoYXJkd2FyZSBsYXRlbmNpZXMKKyAqCisgKiBVc2VkIHRvIHJlcGVhdGVkbHkgY2FwdHVyZSB0aGUgQ1BVIFRTQyAob3Igc2ltaWxhciksIGxvb2tpbmcgZm9yIHBvdGVudGlhbAorICogaGFyZHdhcmUtaW5kdWNlZCBsYXRlbmN5LiBDYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkIGFuZCB3aXRoCisgKiBod2xhdF9kYXRhLmxvY2sgaGVsZC4KKyAqLworc3RhdGljIGludCBnZXRfc2FtcGxlKHZvaWQpCit7CisJc3RydWN0IHRyYWNlX2FycmF5ICp0ciA9IGh3bGF0X3RyYWNlOworCXRpbWVfdHlwZSBzdGFydCwgdDEsIHQyLCBsYXN0X3QyOworCXM2NCBkaWZmLCB0b3RhbCwgbGFzdF90b3RhbCA9IDA7CisJdTY0IHNhbXBsZSA9IDA7CisJdTY0IHRocmVzaCA9IHRyYWNpbmdfdGhyZXNoOworCXU2NCBvdXRlcl9zYW1wbGUgPSAwOworCWludCByZXQgPSAtMTsKKworCWRvX2Rpdih0aHJlc2gsIE5TRUNfUEVSX1VTRUMpOyAvKiBtb2RpZmllcyBpbnRlcnZhbCB2YWx1ZSAqLworCisJbm1pX2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlubWlfdG90YWxfdHMgPSAwOworCW5taV9jb3VudCA9IDA7CisJLyogTWFrZSBzdXJlIE5NSXMgc2VlIHRoaXMgZmlyc3QgKi8KKwliYXJyaWVyKCk7CisKKwl0cmFjZV9od2xhdF9jYWxsYmFja19lbmFibGVkID0gdHJ1ZTsKKworCWluaXRfdGltZShsYXN0X3QyLCAwKTsKKwlzdGFydCA9IHRpbWVfZ2V0KCk7IC8qIHN0YXJ0IHRpbWVzdGFtcCAqLworCisJZG8geworCisJCXQxID0gdGltZV9nZXQoKTsJLyogd2UnbGwgbG9vayBmb3IgYSBkaXNjb250aW51aXR5ICovCisJCXQyID0gdGltZV9nZXQoKTsKKworCQlpZiAodGltZV91NjQobGFzdF90MikpIHsKKwkJCS8qIENoZWNrIHRoZSBkZWx0YSBmcm9tIG91dGVyIGxvb3AgKHQyIHRvIG5leHQgdDEpICovCisJCQlkaWZmID0gdGltZV90b191cyh0aW1lX3N1Yih0MSwgbGFzdF90MikpOworCQkJLyogVGhpcyBzaG91bGRuJ3QgaGFwcGVuICovCisJCQlpZiAoZGlmZiA8IDApIHsKKwkJCQlwcl9lcnIoQkFOTkVSICJ0aW1lIHJ1bm5pbmcgYmFja3dhcmRzXG4iKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWlmIChkaWZmID4gb3V0ZXJfc2FtcGxlKQorCQkJCW91dGVyX3NhbXBsZSA9IGRpZmY7CisJCX0KKwkJbGFzdF90MiA9IHQyOworCisJCXRvdGFsID0gdGltZV90b191cyh0aW1lX3N1Yih0Miwgc3RhcnQpKTsgLyogc2FtcGxlIHdpZHRoICovCisKKwkJLyogQ2hlY2sgZm9yIHBvc3NpYmxlIG92ZXJmbG93cyAqLworCQlpZiAodG90YWwgPCBsYXN0X3RvdGFsKSB7CisJCQlwcl9lcnIoIlRpbWUgdG90YWwgb3ZlcmZsb3dlZFxuIik7CisJCQlicmVhazsKKwkJfQorCQlsYXN0X3RvdGFsID0gdG90YWw7CisKKwkJLyogVGhpcyBjaGVja3MgdGhlIGlubmVyIGxvb3AgKHQxIHRvIHQyKSAqLworCQlkaWZmID0gdGltZV90b191cyh0aW1lX3N1Yih0MiwgdDEpKTsgICAgIC8qIGN1cnJlbnQgZGlmZiAqLworCisJCS8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbiAqLworCQlpZiAoZGlmZiA8IDApIHsKKwkJCXByX2VycihCQU5ORVIgInRpbWUgcnVubmluZyBiYWNrd2FyZHNcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoZGlmZiA+IHNhbXBsZSkKKwkJCXNhbXBsZSA9IGRpZmY7IC8qIG9ubHkgd2FudCBoaWdoZXN0IHZhbHVlICovCisKKwl9IHdoaWxlICh0b3RhbCA8PSBod2xhdF9kYXRhLnNhbXBsZV93aWR0aCk7CisKKwliYXJyaWVyKCk7IC8qIGZpbmlzaCB0aGUgYWJvdmUgaW4gdGhlIHZpZXcgZm9yIE5NSXMgKi8KKwl0cmFjZV9od2xhdF9jYWxsYmFja19lbmFibGVkID0gZmFsc2U7CisJYmFycmllcigpOyAvKiBNYWtlIHN1cmUgbm1pX3RvdGFsX3RzIGlzIG5vIGxvbmdlciB1cGRhdGVkICovCisKKwlyZXQgPSAwOworCisJLyogSWYgd2UgZXhjZWVkIHRoZSB0aHJlc2hvbGQgdmFsdWUsIHdlIGhhdmUgZm91bmQgYSBoYXJkd2FyZSBsYXRlbmN5ICovCisJaWYgKHNhbXBsZSA+IHRocmVzaCB8fCBvdXRlcl9zYW1wbGUgPiB0aHJlc2gpIHsKKwkJc3RydWN0IGh3bGF0X3NhbXBsZSBzOworCisJCXJldCA9IDE7CisKKwkJLyogV2UgcmVhZCBpbiBtaWNyb3NlY29uZHMgKi8KKwkJaWYgKG5taV90b3RhbF90cykKKwkJCWRvX2RpdihubWlfdG90YWxfdHMsIE5TRUNfUEVSX1VTRUMpOworCisJCWh3bGF0X2RhdGEuY291bnQrKzsKKwkJcy5zZXFudW0gPSBod2xhdF9kYXRhLmNvdW50OworCQlzLmR1cmF0aW9uID0gc2FtcGxlOworCQlzLm91dGVyX2R1cmF0aW9uID0gb3V0ZXJfc2FtcGxlOworCQlzLnRpbWVzdGFtcCA9IENVUlJFTlRfVElNRTsKKwkJcy5ubWlfdG90YWxfdHMgPSBubWlfdG90YWxfdHM7CisJCXMubm1pX2NvdW50ID0gbm1pX2NvdW50OworCQl0cmFjZV9od2xhdF9zYW1wbGUoJnMpOworCisJCS8qIEtlZXAgYSBydW5uaW5nIG1heGltdW0gZXZlciByZWNvcmRlZCBoYXJkd2FyZSBsYXRlbmN5ICovCisJCWlmIChzYW1wbGUgPiB0ci0+bWF4X2xhdGVuY3kpCisJCQl0ci0+bWF4X2xhdGVuY3kgPSBzYW1wbGU7CisJfQorCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBjcHVtYXNrIHNhdmVfY3B1bWFzazsKK3N0YXRpYyBib29sIGRpc2FibGVfbWlncmF0ZTsKKworc3RhdGljIHZvaWQgbW92ZV90b19uZXh0X2NwdSh2b2lkKQoreworCXN0YXRpYyBzdHJ1Y3QgY3B1bWFzayAqY3VycmVudF9tYXNrOworCWludCBuZXh0X2NwdTsKKworCWlmIChkaXNhYmxlX21pZ3JhdGUpCisJCXJldHVybjsKKworCS8qIEp1c3QgcGljayB0aGUgZmlyc3QgQ1BVIG9uIGZpcnN0IGl0ZXJhdGlvbiAqLworCWlmICghY3VycmVudF9tYXNrKSB7CisJCWN1cnJlbnRfbWFzayA9ICZzYXZlX2NwdW1hc2s7CisJCWdldF9vbmxpbmVfY3B1cygpOworCQljcHVtYXNrX2FuZChjdXJyZW50X21hc2ssIGNwdV9vbmxpbmVfbWFzaywgdHJhY2luZ19idWZmZXJfbWFzayk7CisJCXB1dF9vbmxpbmVfY3B1cygpOworCQluZXh0X2NwdSA9IGNwdW1hc2tfZmlyc3QoY3VycmVudF9tYXNrKTsKKwkJZ290byBzZXRfYWZmaW5pdHk7CisJfQorCisJLyoKKwkgKiBJZiBmb3Igc29tZSByZWFzb24gdGhlIHVzZXIgbW9kaWZpZXMgdGhlIENQVSBhZmZpbml0eQorCSAqIG9mIHRoaXMgdGhyZWFkLCB0aGFuIHN0b3AgbWlncmF0aW5nIGZvciB0aGUgZHVyYXRpb24KKwkgKiBvZiB0aGUgY3VycmVudCB0ZXN0LgorCSAqLworCWlmICghY3B1bWFza19lcXVhbChjdXJyZW50X21hc2ssICZjdXJyZW50LT5jcHVzX2FsbG93ZWQpKQorCQlnb3RvIGRpc2FibGU7CisKKwlnZXRfb25saW5lX2NwdXMoKTsKKwljcHVtYXNrX2FuZChjdXJyZW50X21hc2ssIGNwdV9vbmxpbmVfbWFzaywgdHJhY2luZ19idWZmZXJfbWFzayk7CisJbmV4dF9jcHUgPSBjcHVtYXNrX25leHQoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjdXJyZW50X21hc2spOworCXB1dF9vbmxpbmVfY3B1cygpOworCisJaWYgKG5leHRfY3B1ID49IG5yX2NwdV9pZHMpCisJCW5leHRfY3B1ID0gY3B1bWFza19maXJzdChjdXJyZW50X21hc2spOworCisgc2V0X2FmZmluaXR5OgorCWlmIChuZXh0X2NwdSA+PSBucl9jcHVfaWRzKSAvKiBTaG91bGRuJ3QgaGFwcGVuISAqLworCQlnb3RvIGRpc2FibGU7CisKKwljcHVtYXNrX2NsZWFyKGN1cnJlbnRfbWFzayk7CisJY3B1bWFza19zZXRfY3B1KG5leHRfY3B1LCBjdXJyZW50X21hc2spOworCisJc2NoZWRfc2V0YWZmaW5pdHkoMCwgY3VycmVudF9tYXNrKTsKKwlyZXR1cm47CisKKyBkaXNhYmxlOgorCWRpc2FibGVfbWlncmF0ZSA9IHRydWU7Cit9CisKKy8qCisgKiBrdGhyZWFkX2ZuIC0gVGhlIENQVSB0aW1lIHNhbXBsaW5nL2hhcmR3YXJlIGxhdGVuY3kgZGV0ZWN0aW9uIGtlcm5lbCB0aHJlYWQKKyAqCisgKiBVc2VkIHRvIHBlcmlvZGljYWxseSBzYW1wbGUgdGhlIENQVSBUU0MgdmlhIGEgY2FsbCB0byBnZXRfc2FtcGxlLiBXZQorICogZGlzYWJsZSBpbnRlcnJ1cHRzLCB3aGljaCBkb2VzIChpbnRlbnRpb25hbGx5KSBpbnRyb2R1Y2UgbGF0ZW5jeSBzaW5jZSB3ZQorICogbmVlZCB0byBlbnN1cmUgbm90aGluZyBlbHNlIG1pZ2h0IGJlIHJ1bm5pbmcgKGFuZCB0aHVzIHByZWVtcHRpbmcpLgorICogT2J2aW91c2x5IHRoaXMgc2hvdWxkIG5ldmVyIGJlIHVzZWQgaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMuCisgKgorICogQ3VycmVudGx5IHRoaXMgcnVucyBvbiB3aGljaCBldmVyIENQVSBpdCB3YXMgc2NoZWR1bGVkIG9uLCBidXQgbW9zdAorICogcmVhbC13b3JsZCBoYXJkd2FyZSBsYXRlbmN5IHNpdHVhdGlvbnMgb2NjdXIgYWNyb3NzIHNldmVyYWwgQ1BVcywKKyAqIGJ1dCB3ZSBtaWdodCBsYXRlciBnZW5lcmFsaXplIHRoaXMgaWYgd2UgZmluZCB0aGVyZSBhcmUgYW55IGFjdHVhbHkKKyAqIHN5c3RlbXMgd2l0aCBhbHRlcm5hdGUgU01JIGRlbGl2ZXJ5IG9yIG90aGVyIGhhcmR3YXJlIGxhdGVuY2llcy4KKyAqLworc3RhdGljIGludCBrdGhyZWFkX2ZuKHZvaWQgKmRhdGEpCit7CisJdTY0IGludGVydmFsOworCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKworCQltb3ZlX3RvX25leHRfY3B1KCk7CisKKwkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJZ2V0X3NhbXBsZSgpOworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwkJbXV0ZXhfbG9jaygmaHdsYXRfZGF0YS5sb2NrKTsKKwkJaW50ZXJ2YWwgPSBod2xhdF9kYXRhLnNhbXBsZV93aW5kb3cgLSBod2xhdF9kYXRhLnNhbXBsZV93aWR0aDsKKwkJbXV0ZXhfdW5sb2NrKCZod2xhdF9kYXRhLmxvY2spOworCisJCWRvX2RpdihpbnRlcnZhbCwgVVNFQ19QRVJfTVNFQyk7IC8qIG1vZGlmaWVzIGludGVydmFsIHZhbHVlICovCisKKwkJLyogQWx3YXlzIHNsZWVwIGZvciBhdCBsZWFzdCAxbXMgKi8KKwkJaWYgKGludGVydmFsIDwgMSkKKwkJCWludGVydmFsID0gMTsKKworCQlpZiAobXNsZWVwX2ludGVycnVwdGlibGUoaW50ZXJ2YWwpKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc3RhcnRfa3RocmVhZCAtIEtpY2sgb2ZmIHRoZSBoYXJkd2FyZSBsYXRlbmN5IHNhbXBsaW5nL2RldGVjdG9yIGt0aHJlYWQKKyAqCisgKiBUaGlzIHN0YXJ0cyB0aGUga2VybmVsIHRocmVhZCB0aGF0IHdpbGwgc2l0IGFuZCBzYW1wbGUgdGhlIENQVSB0aW1lc3RhbXAKKyAqIGNvdW50ZXIgKFRTQyBvciBzaW1pbGFyKSBhbmQgbG9vayBmb3IgcG90ZW50aWFsIGhhcmR3YXJlIGxhdGVuY2llcy4KKyAqLworc3RhdGljIGludCBzdGFydF9rdGhyZWFkKHN0cnVjdCB0cmFjZV9hcnJheSAqdHIpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICprdGhyZWFkOworCisJa3RocmVhZCA9IGt0aHJlYWRfY3JlYXRlKGt0aHJlYWRfZm4sIE5VTEwsICJod2xhdGQiKTsKKwlpZiAoSVNfRVJSKGt0aHJlYWQpKSB7CisJCXByX2VycihCQU5ORVIgImNvdWxkIG5vdCBzdGFydCBzYW1wbGluZyB0aHJlYWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaHdsYXRfa3RocmVhZCA9IGt0aHJlYWQ7CisJd2FrZV91cF9wcm9jZXNzKGt0aHJlYWQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc3RvcF9rdGhyZWFkIC0gSW5mb3JtIHRoZSBoYXJkd2FyZSBsYXRlbmN5IHNhbXBpbmcvZGV0ZWN0b3Iga3RocmVhZCB0byBzdG9wCisgKgorICogVGhpcyBraWNrcyB0aGUgcnVubmluZyBoYXJkd2FyZSBsYXRlbmN5IHNhbXBsaW5nL2RldGVjdG9yIGtlcm5lbCB0aHJlYWQgYW5kCisgKiB0ZWxscyBpdCB0byBzdG9wIHNhbXBsaW5nIG5vdy4gVXNlIHRoaXMgb24gdW5sb2FkIGFuZCBhdCBzeXN0ZW0gc2h1dGRvd24uCisgKi8KK3N0YXRpYyB2b2lkIHN0b3Bfa3RocmVhZCh2b2lkKQoreworCWlmICghaHdsYXRfa3RocmVhZCkKKwkJcmV0dXJuOworCWt0aHJlYWRfc3RvcChod2xhdF9rdGhyZWFkKTsKKwlod2xhdF9rdGhyZWFkID0gTlVMTDsKK30KKworLyoKKyAqIGh3bGF0X3JlYWQgLSBXcmFwcGVyIHJlYWQgZnVuY3Rpb24gZm9yIHJlYWRpbmcgYm90aCB3aW5kb3cgYW5kIHdpZHRoCisgKiBAZmlscDogVGhlIGFjdGl2ZSBvcGVuIGZpbGUgc3RydWN0dXJlCisgKiBAdWJ1ZjogVGhlIHVzZXJzcGFjZSBwcm92aWRlZCBidWZmZXIgdG8gcmVhZCB2YWx1ZSBpbnRvCisgKiBAY250OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICogQHBwb3M6IFRoZSBjdXJyZW50ICJmaWxlIiBwb3NpdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBnZW5lcmljIHJlYWQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBnbG9iYWwgc3RhdGUKKyAqICJod2xhdF9kYXRhIiBzdHJ1Y3R1cmUgZmlsZXN5c3RlbSBlbnRyaWVzLgorICovCitzdGF0aWMgc3NpemVfdCBod2xhdF9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqdWJ1ZiwKKwkJCSAgc2l6ZV90IGNudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgYnVmW1U2NFNUUl9TSVpFXTsKKwl1NjQgKmVudHJ5ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXU2NCB2YWw7CisJaW50IGxlbjsKKworCWlmICghZW50cnkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGNudCA+IHNpemVvZihidWYpKQorCQljbnQgPSBzaXplb2YoYnVmKTsKKworCXZhbCA9ICplbnRyeTsKKworCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlbGx1XG4iLCB2YWwpOworCisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVidWYsIGNudCwgcHBvcywgYnVmLCBsZW4pOworfQorCisvKioKKyAqIGh3bGF0X3dpZHRoX3dyaXRlIC0gV3JpdGUgZnVuY3Rpb24gZm9yICJ3aWR0aCIgZW50cnkKKyAqIEBmaWxwOiBUaGUgYWN0aXZlIG9wZW4gZmlsZSBzdHJ1Y3R1cmUKKyAqIEB1YnVmOiBUaGUgdXNlciBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgdmFsdWUgdG8gd3JpdGUKKyAqIEBjbnQ6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSB0byAiZmlsZSIKKyAqIEBwcG9zOiBUaGUgY3VycmVudCBwb3NpdGlvbiBpbiBAZmlsZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSB3cml0ZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlICJ3aWR0aCIgaW50ZXJmYWNlCisgKiB0byB0aGUgaGFyZHdhcmUgbGF0ZW5jeSBkZXRlY3Rvci4gSXQgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlCisgKiBmb3IgaG93IG1hbnkgdXMgb2YgdGhlIHRvdGFsIHdpbmRvdyB1cyB3ZSB3aWxsIGFjdGl2ZWx5IHNhbXBsZSBmb3IgYW55CisgKiBoYXJkd2FyZS1pbmR1Y2VkIGxhdGVuY3kgcGVyaW9kcy4gT2J2aW91c2x5LCBpdCBpcyBub3QgcG9zc2libGUgdG8KKyAqIHNhbXBsZSBjb25zdGFudGx5IGFuZCBoYXZlIHRoZSBzeXN0ZW0gcmVzcG9uZCB0byBhIHNhbXBsZSByZWFkZXIsIG9yLAorICogd29yc2UsIHdpdGhvdXQgaGF2aW5nIHRoZSBzeXN0ZW0gYXBwZWFyIHRvIGhhdmUgZ29uZSBvdXQgdG8gbHVuY2guIEl0CisgKiBpcyBlbmZvcmNlZCB0aGF0IHdpZHRoIGlzIGxlc3MgdGhhdCB0aGUgdG90YWwgd2luZG93IHNpemUuCisgKi8KK3N0YXRpYyBzc2l6ZV90Citod2xhdF93aWR0aF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKnVidWYsCisJCSAgc2l6ZV90IGNudCwgbG9mZl90ICpwcG9zKQoreworCXU2NCB2YWw7CisJaW50IGVycjsKKworCWVyciA9IGtzdHJ0b3VsbF9mcm9tX3VzZXIodWJ1ZiwgY250LCAxMCwgJnZhbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCW11dGV4X2xvY2soJmh3bGF0X2RhdGEubG9jayk7CisJaWYgKHZhbCA8IGh3bGF0X2RhdGEuc2FtcGxlX3dpbmRvdykKKwkJaHdsYXRfZGF0YS5zYW1wbGVfd2lkdGggPSB2YWw7CisJZWxzZQorCQllcnIgPSAtRUlOVkFMOworCW11dGV4X3VubG9jaygmaHdsYXRfZGF0YS5sb2NrKTsKKworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gY250OworfQorCisvKioKKyAqIGh3bGF0X3dpbmRvd193cml0ZSAtIFdyaXRlIGZ1bmN0aW9uIGZvciAid2luZG93IiBlbnRyeQorICogQGZpbHA6IFRoZSBhY3RpdmUgb3BlbiBmaWxlIHN0cnVjdHVyZQorICogQHVidWY6IFRoZSB1c2VyIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSB2YWx1ZSB0byB3cml0ZQorICogQGNudDogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIHRvICJmaWxlIgorICogQHBwb3M6IFRoZSBjdXJyZW50IHBvc2l0aW9uIGluIEBmaWxlCisgKgorICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIHdyaXRlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgIndpbmRvdyIgaW50ZXJmYWNlCisgKiB0byB0aGUgaGFyZHdhcmUgbGF0ZW5jeSBkZXRldGVjdG9yLiBUaGUgd2luZG93IGlzIHRoZSB0b3RhbCB0aW1lCisgKiBpbiB1cyB0aGF0IHdpbGwgYmUgY29uc2lkZXJlZCBvbmUgc2FtcGxlIHBlcmlvZC4gQ29uY2VwdHVhbGx5LCB3aW5kb3dzCisgKiBvY2N1ciBiYWNrLXRvLWJhY2sgYW5kIGNvbnRhaW4gYSBzYW1wbGUgd2lkdGggcGVyaW9kIGR1cmluZyB3aGljaAorICogYWN0dWFsIHNhbXBsaW5nIG9jY3Vycy4gQ2FuIGJlIHVzZWQgdG8gd3JpdGUgYSBuZXcgdG90YWwgd2luZG93IHNpemUuIEl0CisgKiBpcyBlbmZvY2VkIHRoYXQgYW55IHZhbHVlIHdyaXR0ZW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gdGhlIHNhbXBsZSB3aWR0aAorICogc2l6ZSwgb3IgYW4gZXJyb3IgcmVzdWx0cy4KKyAqLworc3RhdGljIHNzaXplX3QKK2h3bGF0X3dpbmRvd193cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKnVidWYsCisJCSAgIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcykKK3sKKwl1NjQgdmFsOworCWludCBlcnI7CisKKwllcnIgPSBrc3RydG91bGxfZnJvbV91c2VyKHVidWYsIGNudCwgMTAsICZ2YWwpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwltdXRleF9sb2NrKCZod2xhdF9kYXRhLmxvY2spOworCWlmIChod2xhdF9kYXRhLnNhbXBsZV93aWR0aCA8IHZhbCkKKwkJaHdsYXRfZGF0YS5zYW1wbGVfd2luZG93ID0gdmFsOworCWVsc2UKKwkJZXJyID0gLUVJTlZBTDsKKwltdXRleF91bmxvY2soJmh3bGF0X2RhdGEubG9jayk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIGNudDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgd2lkdGhfZm9wcyA9IHsKKwkub3BlbgkJPSB0cmFjaW5nX29wZW5fZ2VuZXJpYywKKwkucmVhZAkJPSBod2xhdF9yZWFkLAorCS53cml0ZQkJPSBod2xhdF93aWR0aF93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHdpbmRvd19mb3BzID0geworCS5vcGVuCQk9IHRyYWNpbmdfb3Blbl9nZW5lcmljLAorCS5yZWFkCQk9IGh3bGF0X3JlYWQsCisJLndyaXRlCQk9IGh3bGF0X3dpbmRvd193cml0ZSwKK307CisKKy8qKgorICogaW5pdF90cmFjZWZzIC0gQSBmdW5jdGlvbiB0byBpbml0aWFsaXplIHRoZSB0cmFjZWZzIGludGVyZmFjZSBmaWxlcworICoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBlbnRyaWVzIGluIHRyYWNlZnMgZm9yICJod2xhdF9kZXRlY3RvciIuCisgKiBJdCBjcmVhdGVzIHRoZSBod2xhdF9kZXRlY3RvciBkaXJlY3RvcnkgaW4gdGhlIHRyYWNpbmcgZGlyZWN0b3J5LAorICogYW5kIHdpdGhpbiB0aGF0IGRpcmVjdG9yeSBpcyB0aGUgY291bnQsIHdpZHRoIGFuZCB3aW5kb3cgZmlsZXMgdG8KKyAqIGNoYW5nZSBhbmQgdmlldyB0aG9zZSB2YWx1ZXMuCisgKi8KK3N0YXRpYyBpbnQgaW5pdF90cmFjZWZzKHZvaWQpCit7CisJc3RydWN0IGRlbnRyeSAqZF90cmFjZXI7CisJc3RydWN0IGRlbnRyeSAqdG9wX2RpcjsKKworCWRfdHJhY2VyID0gdHJhY2luZ19pbml0X2RlbnRyeSgpOworCWlmIChJU19FUlIoZF90cmFjZXIpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRvcF9kaXIgPSB0cmFjZWZzX2NyZWF0ZV9kaXIoImh3bGF0X2RldGVjdG9yIiwgZF90cmFjZXIpOworCWlmICghdG9wX2RpcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlod2xhdF9zYW1wbGVfd2luZG93ID0gdHJhY2Vmc19jcmVhdGVfZmlsZSgid2luZG93IiwgMDY0MCwKKwkJCQkJCSAgdG9wX2RpciwKKwkJCQkJCSAgJmh3bGF0X2RhdGEuc2FtcGxlX3dpbmRvdywKKwkJCQkJCSAgJndpbmRvd19mb3BzKTsKKwlpZiAoIWh3bGF0X3NhbXBsZV93aW5kb3cpCisJCWdvdG8gZXJyOworCisJaHdsYXRfc2FtcGxlX3dpZHRoID0gdHJhY2Vmc19jcmVhdGVfZmlsZSgid2lkdGgiLCAwNjQ0LAorCQkJCQkJIHRvcF9kaXIsCisJCQkJCQkgJmh3bGF0X2RhdGEuc2FtcGxlX3dpZHRoLAorCQkJCQkJICZ3aWR0aF9mb3BzKTsKKwlpZiAoIWh3bGF0X3NhbXBsZV93aWR0aCkKKwkJZ290byBlcnI7CisKKwlyZXR1cm4gMDsKKworIGVycjoKKwl0cmFjZWZzX3JlbW92ZV9yZWN1cnNpdmUodG9wX2Rpcik7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIGh3bGF0X3RyYWNlcl9zdGFydChzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyKQoreworCWludCBlcnI7CisKKwllcnIgPSBzdGFydF9rdGhyZWFkKHRyKTsKKwlpZiAoZXJyKQorCQlwcl9lcnIoQkFOTkVSICJDYW5ub3Qgc3RhcnQgaHdsYXQga3RocmVhZFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGh3bGF0X3RyYWNlcl9zdG9wKHN0cnVjdCB0cmFjZV9hcnJheSAqdHIpCit7CisJc3RvcF9rdGhyZWFkKCk7Cit9CisKK3N0YXRpYyBib29sIGh3bGF0X2J1c3k7CisKK3N0YXRpYyBpbnQgaHdsYXRfdHJhY2VyX2luaXQoc3RydWN0IHRyYWNlX2FycmF5ICp0cikKK3sKKwkvKiBPbmx5IGFsbG93IG9uZSBpbnN0YW5jZSB0byBlbmFibGUgdGhpcyAqLworCWlmIChod2xhdF9idXN5KQorCQlyZXR1cm4gLUVCVVNZOworCisJaHdsYXRfdHJhY2UgPSB0cjsKKworCWRpc2FibGVfbWlncmF0ZSA9IGZhbHNlOworCWh3bGF0X2RhdGEuY291bnQgPSAwOworCXRyLT5tYXhfbGF0ZW5jeSA9IDA7CisJc2F2ZV90cmFjaW5nX3RocmVzaCA9IHRyYWNpbmdfdGhyZXNoOworCisJLyogdHJhY2luZ190aHJlc2ggaXMgaW4gbnNlY3MsIHdlIHNwZWFrIGluIHVzZWNzICovCisJaWYgKCF0cmFjaW5nX3RocmVzaCkKKwkJdHJhY2luZ190aHJlc2ggPSBsYXN0X3RyYWNpbmdfdGhyZXNoOworCisJaWYgKHRyYWNlcl90cmFjaW5nX2lzX29uKHRyKSkKKwkJaHdsYXRfdHJhY2VyX3N0YXJ0KHRyKTsKKworCWh3bGF0X2J1c3kgPSB0cnVlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGh3bGF0X3RyYWNlcl9yZXNldChzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyKQoreworCXN0b3Bfa3RocmVhZCgpOworCisJLyogdGhlIHRyYWNpbmcgdGhyZXNob2xkIGlzIHN0YXRpYyBiZXR3ZWVuIHJ1bnMgKi8KKwlsYXN0X3RyYWNpbmdfdGhyZXNoID0gdHJhY2luZ190aHJlc2g7CisKKwl0cmFjaW5nX3RocmVzaCA9IHNhdmVfdHJhY2luZ190aHJlc2g7CisJaHdsYXRfYnVzeSA9IGZhbHNlOworfQorCitzdGF0aWMgc3RydWN0IHRyYWNlciBod2xhdF90cmFjZXIgX19yZWFkX21vc3RseSA9Cit7CisJLm5hbWUJCT0gImh3bGF0IiwKKwkuaW5pdAkJPSBod2xhdF90cmFjZXJfaW5pdCwKKwkucmVzZXQJCT0gaHdsYXRfdHJhY2VyX3Jlc2V0LAorCS5zdGFydAkJPSBod2xhdF90cmFjZXJfc3RhcnQsCisJLnN0b3AJCT0gaHdsYXRfdHJhY2VyX3N0b3AsCisJLmFsbG93X2luc3RhbmNlcyA9IHRydWUsCit9OworCitfX2luaXQgc3RhdGljIGludCBpbml0X2h3bGF0X3RyYWNlcih2b2lkKQoreworCWludCByZXQ7CisKKwltdXRleF9pbml0KCZod2xhdF9kYXRhLmxvY2spOworCisJcmV0ID0gcmVnaXN0ZXJfdHJhY2VyKCZod2xhdF90cmFjZXIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpbml0X3RyYWNlZnMoKTsKKworCXJldHVybiAwOworfQorbGF0ZV9pbml0Y2FsbChpbml0X2h3bGF0X3RyYWNlcik7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2Vfa3Byb2JlLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfa3Byb2JlLmMKaW5kZXggOWFlZGIwYi4uZWI2YzlmMSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2twcm9iZS5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9rcHJvYmUuYwpAQCAtMjUzLDYgKzI1MywxMCBAQAogCUFTU0lHTl9GRVRDSF9UWVBFKHMxNiwgdTE2LCAxKSwKIAlBU1NJR05fRkVUQ0hfVFlQRShzMzIsIHUzMiwgMSksCiAJQVNTSUdOX0ZFVENIX1RZUEUoczY0LCB1NjQsIDEpLAorCUFTU0lHTl9GRVRDSF9UWVBFX0FMSUFTKHg4LCAgdTgsICB1OCwgIDApLAorCUFTU0lHTl9GRVRDSF9UWVBFX0FMSUFTKHgxNiwgdTE2LCB1MTYsIDApLAorCUFTU0lHTl9GRVRDSF9UWVBFX0FMSUFTKHgzMiwgdTMyLCB1MzIsIDApLAorCUFTU0lHTl9GRVRDSF9UWVBFX0FMSUFTKHg2NCwgdTY0LCB1NjQsIDApLAogCiAJQVNTSUdOX0ZFVENIX1RZUEVfRU5ECiB9OwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX291dHB1dC5jIGIva2VybmVsL3RyYWNlL3RyYWNlX291dHB1dC5jCmluZGV4IDBiYjljZjIuLjNmYzIwNDIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9vdXRwdXQuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfb3V0cHV0LmMKQEAgLTEwOTgsNiArMTA5OCw3MSBAQAogCS5mdW5jcwkJPSAmdHJhY2VfdXNlcl9zdGFja19mdW5jcywKIH07CiAKKy8qIFRSQUNFX0hXTEFUICovCitzdGF0aWMgZW51bSBwcmludF9saW5lX3QKK3RyYWNlX2h3bGF0X3ByaW50KHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlciwgaW50IGZsYWdzLAorCQkgIHN0cnVjdCB0cmFjZV9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IHRyYWNlX2VudHJ5ICplbnRyeSA9IGl0ZXItPmVudDsKKwlzdHJ1Y3QgdHJhY2Vfc2VxICpzID0gJml0ZXItPnNlcTsKKwlzdHJ1Y3QgaHdsYXRfZW50cnkgKmZpZWxkOworCisJdHJhY2VfYXNzaWduX3R5cGUoZmllbGQsIGVudHJ5KTsKKworCXRyYWNlX3NlcV9wcmludGYocywgIiMlLTV1IGlubmVyL291dGVyKHVzKTogJTRsbHUvJS01bGx1IHRzOiVsZC4lMDlsZCIsCisJCQkgZmllbGQtPnNlcW51bSwKKwkJCSBmaWVsZC0+ZHVyYXRpb24sCisJCQkgZmllbGQtPm91dGVyX2R1cmF0aW9uLAorCQkJIGZpZWxkLT50aW1lc3RhbXAudHZfc2VjLAorCQkJIGZpZWxkLT50aW1lc3RhbXAudHZfbnNlYyk7CisKKwlpZiAoZmllbGQtPm5taV9jb3VudCkgeworCQkvKgorCQkgKiBUaGUgZ2VuZXJpYyBzY2hlZF9jbG9jaygpIGlzIG5vdCBOTUkgc2FmZSwgdGh1cworCQkgKiB3ZSBvbmx5IHJlY29yZCB0aGUgY291bnQgYW5kIG5vdCB0aGUgdGltZS4KKwkJICovCisJCWlmICghSVNfRU5BQkxFRChDT05GSUdfR0VORVJJQ19TQ0hFRF9DTE9DSykpCisJCQl0cmFjZV9zZXFfcHJpbnRmKHMsICIgbm1pLXRvdGFsOiVsbHUiLAorCQkJCQkgZmllbGQtPm5taV90b3RhbF90cyk7CisJCXRyYWNlX3NlcV9wcmludGYocywgIiBubWktY291bnQ6JXUiLAorCQkJCSBmaWVsZC0+bm1pX2NvdW50KTsKKwl9CisKKwl0cmFjZV9zZXFfcHV0YyhzLCAnXG4nKTsKKworCXJldHVybiB0cmFjZV9oYW5kbGVfcmV0dXJuKHMpOworfQorCisKK3N0YXRpYyBlbnVtIHByaW50X2xpbmVfdAordHJhY2VfaHdsYXRfcmF3KHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlciwgaW50IGZsYWdzLAorCQlzdHJ1Y3QgdHJhY2VfZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCBod2xhdF9lbnRyeSAqZmllbGQ7CisJc3RydWN0IHRyYWNlX3NlcSAqcyA9ICZpdGVyLT5zZXE7CisKKwl0cmFjZV9hc3NpZ25fdHlwZShmaWVsZCwgaXRlci0+ZW50KTsKKworCXRyYWNlX3NlcV9wcmludGYocywgIiVsbHUgJWxsZCAlbGQgJTA5bGQgJXVcbiIsCisJCQkgZmllbGQtPmR1cmF0aW9uLAorCQkJIGZpZWxkLT5vdXRlcl9kdXJhdGlvbiwKKwkJCSBmaWVsZC0+dGltZXN0YW1wLnR2X3NlYywKKwkJCSBmaWVsZC0+dGltZXN0YW1wLnR2X25zZWMsCisJCQkgZmllbGQtPnNlcW51bSk7CisKKwlyZXR1cm4gdHJhY2VfaGFuZGxlX3JldHVybihzKTsKK30KKworc3RhdGljIHN0cnVjdCB0cmFjZV9ldmVudF9mdW5jdGlvbnMgdHJhY2VfaHdsYXRfZnVuY3MgPSB7CisJLnRyYWNlCQk9IHRyYWNlX2h3bGF0X3ByaW50LAorCS5yYXcJCT0gdHJhY2VfaHdsYXRfcmF3LAorfTsKKworc3RhdGljIHN0cnVjdCB0cmFjZV9ldmVudCB0cmFjZV9od2xhdF9ldmVudCA9IHsKKwkudHlwZQkJPSBUUkFDRV9IV0xBVCwKKwkuZnVuY3MJCT0gJnRyYWNlX2h3bGF0X2Z1bmNzLAorfTsKKwogLyogVFJBQ0VfQlBVVFMgKi8KIHN0YXRpYyBlbnVtIHByaW50X2xpbmVfdAogdHJhY2VfYnB1dHNfcHJpbnQoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyLCBpbnQgZmxhZ3MsCkBAIC0xMjMzLDYgKzEyOTgsNyBAQAogCSZ0cmFjZV9icHV0c19ldmVudCwKIAkmdHJhY2VfYnByaW50X2V2ZW50LAogCSZ0cmFjZV9wcmludF9ldmVudCwKKwkmdHJhY2VfaHdsYXRfZXZlbnQsCiAJTlVMTAogfTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX3Byb2JlLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfcHJvYmUuYwppbmRleCA3NGU4MGE1Li44YzA1NTNkIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfcHJvYmUuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfcHJvYmUuYwpAQCAtMzYsMjQgKzM2LDI4IEBACiB9OwogCiAvKiBQcmludGluZyAgaW4gYmFzaWMgdHlwZSBmdW5jdGlvbiB0ZW1wbGF0ZSAqLwotI2RlZmluZSBERUZJTkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHR5cGUsIGZtdCkJCQkJXAotaW50IFBSSU5UX1RZUEVfRlVOQ19OQU1FKHR5cGUpKHN0cnVjdCB0cmFjZV9zZXEgKnMsIGNvbnN0IGNoYXIgKm5hbWUsCVwKKyNkZWZpbmUgREVGSU5FX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyh0bmFtZSwgdHlwZSwgZm10KQkJCVwKK2ludCBQUklOVF9UWVBFX0ZVTkNfTkFNRSh0bmFtZSkoc3RydWN0IHRyYWNlX3NlcSAqcywgY29uc3QgY2hhciAqbmFtZSwJXAogCQkJCXZvaWQgKmRhdGEsIHZvaWQgKmVudCkJCQlcCiB7CQkJCQkJCQkJXAogCXRyYWNlX3NlcV9wcmludGYocywgIiAlcz0iIGZtdCwgbmFtZSwgKih0eXBlICopZGF0YSk7CQlcCiAJcmV0dXJuICF0cmFjZV9zZXFfaGFzX292ZXJmbG93ZWQocyk7CQkJCVwKIH0JCQkJCQkJCQlcCi1jb25zdCBjaGFyIFBSSU5UX1RZUEVfRk1UX05BTUUodHlwZSlbXSA9IGZtdDsJCQkJXAotTk9LUFJPQkVfU1lNQk9MKFBSSU5UX1RZUEVfRlVOQ19OQU1FKHR5cGUpKTsKK2NvbnN0IGNoYXIgUFJJTlRfVFlQRV9GTVRfTkFNRSh0bmFtZSlbXSA9IGZtdDsJCQkJXAorTk9LUFJPQkVfU1lNQk9MKFBSSU5UX1RZUEVfRlVOQ19OQU1FKHRuYW1lKSk7CiAKLURFRklORV9CQVNJQ19QUklOVF9UWVBFX0ZVTkModTggLCAiMHgleCIpCi1ERUZJTkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHUxNiwgIjB4JXgiKQotREVGSU5FX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyh1MzIsICIweCV4IikKLURFRklORV9CQVNJQ19QUklOVF9UWVBFX0ZVTkModTY0LCAiMHglTHgiKQotREVGSU5FX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyhzOCwgICIlZCIpCi1ERUZJTkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHMxNiwgIiVkIikKLURFRklORV9CQVNJQ19QUklOVF9UWVBFX0ZVTkMoczMyLCAiJWQiKQotREVGSU5FX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyhzNjQsICIlTGQiKQorREVGSU5FX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyh1OCwgIHU4LCAgIiV1IikKK0RFRklORV9CQVNJQ19QUklOVF9UWVBFX0ZVTkModTE2LCB1MTYsICIldSIpCitERUZJTkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHUzMiwgdTMyLCAiJXUiKQorREVGSU5FX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyh1NjQsIHU2NCwgIiVMdSIpCitERUZJTkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHM4LCAgczgsICAiJWQiKQorREVGSU5FX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyhzMTYsIHMxNiwgIiVkIikKK0RFRklORV9CQVNJQ19QUklOVF9UWVBFX0ZVTkMoczMyLCBzMzIsICIlZCIpCitERUZJTkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHM2NCwgczY0LCAiJUxkIikKK0RFRklORV9CQVNJQ19QUklOVF9UWVBFX0ZVTkMoeDgsICB1OCwgICIweCV4IikKK0RFRklORV9CQVNJQ19QUklOVF9UWVBFX0ZVTkMoeDE2LCB1MTYsICIweCV4IikKK0RFRklORV9CQVNJQ19QUklOVF9UWVBFX0ZVTkMoeDMyLCB1MzIsICIweCV4IikKK0RFRklORV9CQVNJQ19QUklOVF9UWVBFX0ZVTkMoeDY0LCB1NjQsICIweCVMeCIpCiAKIC8qIFByaW50IHR5cGUgZnVuY3Rpb24gZm9yIHN0cmluZyB0eXBlICovCiBpbnQgUFJJTlRfVFlQRV9GVU5DX05BTUUoc3RyaW5nKShzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCBjaGFyICpuYW1lLApkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX3Byb2JlLmggYi9rZXJuZWwvdHJhY2UvdHJhY2VfcHJvYmUuaAppbmRleCA0NTQwMGNhLi4wYzBhZTU0IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfcHJvYmUuaAorKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfcHJvYmUuaApAQCAtMTQ5LDYgKzE0OSwxMSBAQAogREVDTEFSRV9CQVNJQ19QUklOVF9UWVBFX0ZVTkMoczE2KTsKIERFQ0xBUkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHMzMik7CiBERUNMQVJFX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyhzNjQpOworREVDTEFSRV9CQVNJQ19QUklOVF9UWVBFX0ZVTkMoeDgpOworREVDTEFSRV9CQVNJQ19QUklOVF9UWVBFX0ZVTkMoeDE2KTsKK0RFQ0xBUkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHgzMik7CitERUNMQVJFX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyh4NjQpOworCiBERUNMQVJFX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyhzdHJpbmcpOwogCiAjZGVmaW5lIEZFVENIX0ZVTkNfTkFNRShtZXRob2QsIHR5cGUpCWZldGNoXyMjbWV0aG9kIyNfIyN0eXBlCkBAIC0yMDMsNyArMjA4LDcgQEAKIERFRklORV9GRVRDSF8jI21ldGhvZCh1NjQpCiAKIC8qIERlZmF1bHQgKHVuc2lnbmVkIGxvbmcpIGZldGNoIHR5cGUgKi8KLSNkZWZpbmUgX19ERUZBVUxUX0ZFVENIX1RZUEUodCkgdSMjdAorI2RlZmluZSBfX0RFRkFVTFRfRkVUQ0hfVFlQRSh0KSB4IyN0CiAjZGVmaW5lIF9ERUZBVUxUX0ZFVENIX1RZUEUodCkgX19ERUZBVUxUX0ZFVENIX1RZUEUodCkKICNkZWZpbmUgREVGQVVMVF9GRVRDSF9UWVBFIF9ERUZBVUxUX0ZFVENIX1RZUEUoQklUU19QRVJfTE9ORykKICNkZWZpbmUgREVGQVVMVF9GRVRDSF9UWVBFX1NUUiBfX3N0cmluZ2lmeShERUZBVUxUX0ZFVENIX1RZUEUpCkBAIC0yMzQsNiArMjM5LDEwIEBACiAjZGVmaW5lIEFTU0lHTl9GRVRDSF9UWVBFKHB0eXBlLCBmdHlwZSwgc2lnbikJCQlcCiAJX19BU1NJR05fRkVUQ0hfVFlQRSgjcHR5cGUsIHB0eXBlLCBmdHlwZSwgc2l6ZW9mKGZ0eXBlKSwgc2lnbiwgI3B0eXBlKQogCisvKiBJZiBwdHlwZSBpcyBhbiBhbGlhcyBvZiBhdHlwZSwgdXNlIHRoaXMgbWFjcm8gKHNob3cgYXR5cGUgaW4gZm9ybWF0KSAqLworI2RlZmluZSBBU1NJR05fRkVUQ0hfVFlQRV9BTElBUyhwdHlwZSwgYXR5cGUsIGZ0eXBlLCBzaWduKQkJXAorCV9fQVNTSUdOX0ZFVENIX1RZUEUoI3B0eXBlLCBwdHlwZSwgZnR5cGUsIHNpemVvZihmdHlwZSksIHNpZ24sICNhdHlwZSkKKwogI2RlZmluZSBBU1NJR05fRkVUQ0hfVFlQRV9FTkQge30KIAogI2RlZmluZSBGRVRDSF9UWVBFX1NUUklORwkwCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfdXByb2JlLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfdXByb2JlLmMKaW5kZXggYzUzNDg1NC4uMDkxMzY5MyAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX3Vwcm9iZS5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV91cHJvYmUuYwpAQCAtMjExLDYgKzIxMSwxMCBAQAogCUFTU0lHTl9GRVRDSF9UWVBFKHMxNiwgdTE2LCAxKSwKIAlBU1NJR05fRkVUQ0hfVFlQRShzMzIsIHUzMiwgMSksCiAJQVNTSUdOX0ZFVENIX1RZUEUoczY0LCB1NjQsIDEpLAorCUFTU0lHTl9GRVRDSF9UWVBFX0FMSUFTKHg4LCAgdTgsICB1OCwgIDApLAorCUFTU0lHTl9GRVRDSF9UWVBFX0FMSUFTKHgxNiwgdTE2LCB1MTYsIDApLAorCUFTU0lHTl9GRVRDSF9UWVBFX0FMSUFTKHgzMiwgdTMyLCB1MzIsIDApLAorCUFTU0lHTl9GRVRDSF9UWVBFX0FMSUFTKHg2NCwgdTY0LCB1NjQsIDApLAogCiAJQVNTSUdOX0ZFVENIX1RZUEVfRU5ECiB9OwpAQCAtNDI3LDEwICs0MzEsNiBAQAogCQlwcl9pbmZvKCJQcm9iZSBwb2ludCBpcyBub3Qgc3BlY2lmaWVkLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoaXNkaWdpdChhcmd2WzFdWzBdKSkgewotCQlwcl9pbmZvKCJwcm9iZSBwb2ludCBtdXN0IGJlIGhhdmUgYSBmaWxlbmFtZS5cbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAJYXJnID0gc3RyY2hyKGFyZ3ZbMV0sICc6Jyk7CiAJaWYgKCFhcmcpIHsKIAkJcmV0ID0gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2tlcm5lbC91Y291bnQuYyBiL2tlcm5lbC91Y291bnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDIwZDVkCi0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3Vjb3VudC5jCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIgb2YgdGhlCisgKiAgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CisjaW5jbHVkZSA8bGludXgvdXNlcl9uYW1lc3BhY2UuaD4KKworI2RlZmluZSBVQ09VTlRTX0hBU0hUQUJMRV9CSVRTIDEwCitzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQgdWNvdW50c19oYXNodGFibGVbKDEgPDwgVUNPVU5UU19IQVNIVEFCTEVfQklUUyldOworc3RhdGljIERFRklORV9TUElOTE9DSyh1Y291bnRzX2xvY2spOworCisjZGVmaW5lIHVjb3VudHNfaGFzaGZuKG5zLCB1aWQpCQkJCQkJXAorCWhhc2hfbG9uZygodW5zaWduZWQgbG9uZylfX2t1aWRfdmFsKHVpZCkgKyAodW5zaWduZWQgbG9uZykobnMpLCBcCisJCSAgVUNPVU5UU19IQVNIVEFCTEVfQklUUykKKyNkZWZpbmUgdWNvdW50c19oYXNoZW50cnkobnMsIHVpZCkJXAorCSh1Y291bnRzX2hhc2h0YWJsZSArIHVjb3VudHNfaGFzaGZuKG5zLCB1aWQpKQorCisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9zZXQgKgorc2V0X2xvb2t1cChzdHJ1Y3QgY3RsX3RhYmxlX3Jvb3QgKnJvb3QpCit7CisJcmV0dXJuICZjdXJyZW50X3VzZXJfbnMoKS0+c2V0OworfQorCitzdGF0aWMgaW50IHNldF9pc19zZWVuKHN0cnVjdCBjdGxfdGFibGVfc2V0ICpzZXQpCit7CisJcmV0dXJuICZjdXJyZW50X3VzZXJfbnMoKS0+c2V0ID09IHNldDsKK30KKworc3RhdGljIGludCBzZXRfcGVybWlzc2lvbnMoc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmhlYWQsCisJCQkJICBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSkKK3sKKwlzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnVzZXJfbnMgPQorCQljb250YWluZXJfb2YoaGVhZC0+c2V0LCBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UsIHNldCk7CisJaW50IG1vZGU7CisKKwkvKiBBbGxvdyB1c2VycyB3aXRoIENBUF9TWVNfUkVTT1VSQ0UgdW5yZXN0cmFpbmVkIGFjY2VzcyAqLworCWlmIChuc19jYXBhYmxlKHVzZXJfbnMsIENBUF9TWVNfUkVTT1VSQ0UpKQorCQltb2RlID0gKHRhYmxlLT5tb2RlICYgU19JUldYVSkgPj4gNjsKKwllbHNlCisJLyogQWxsb3cgYWxsIG90aGVycyBhdCBtb3N0IHJlYWQtb25seSBhY2Nlc3MgKi8KKwkJbW9kZSA9IHRhYmxlLT5tb2RlICYgU19JUk9USDsKKwlyZXR1cm4gKG1vZGUgPDwgNikgfCAobW9kZSA8PCAzKSB8IG1vZGU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX3Jvb3Qgc2V0X3Jvb3QgPSB7CisJLmxvb2t1cCA9IHNldF9sb29rdXAsCisJLnBlcm1pc3Npb25zID0gc2V0X3Blcm1pc3Npb25zLAorfTsKKworc3RhdGljIGludCB6ZXJvID0gMDsKK3N0YXRpYyBpbnQgaW50X21heCA9IElOVF9NQVg7CisjZGVmaW5lIFVDT1VOVF9FTlRSWShuYW1lKSAJCQkJXAorCXsJCQkJCQlcCisJCS5wcm9jbmFtZQk9IG5hbWUsCQkJXAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAkJXAorCQkubW9kZQkJPSAwNjQ0LAkJCVwKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfbWlubWF4LAlcCisJCS5leHRyYTEJCT0gJnplcm8sCQlcCisJCS5leHRyYTIJCT0gJmludF9tYXgsCQlcCisJfQorc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgdXNlcl90YWJsZVtdID0geworCVVDT1VOVF9FTlRSWSgibWF4X3VzZXJfbmFtZXNwYWNlcyIpLAorCVVDT1VOVF9FTlRSWSgibWF4X3BpZF9uYW1lc3BhY2VzIiksCisJVUNPVU5UX0VOVFJZKCJtYXhfdXRzX25hbWVzcGFjZXMiKSwKKwlVQ09VTlRfRU5UUlkoIm1heF9pcGNfbmFtZXNwYWNlcyIpLAorCVVDT1VOVF9FTlRSWSgibWF4X25ldF9uYW1lc3BhY2VzIiksCisJVUNPVU5UX0VOVFJZKCJtYXhfbW50X25hbWVzcGFjZXMiKSwKKwlVQ09VTlRfRU5UUlkoIm1heF9jZ3JvdXBfbmFtZXNwYWNlcyIpLAorCXsgfQorfTsKKyNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCisKK2Jvb2wgc2V0dXBfdXNlcm5zX3N5c2N0bHMoc3RydWN0IHVzZXJfbmFtZXNwYWNlICpucykKK3sKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJc3RydWN0IGN0bF90YWJsZSAqdGJsOworCXNldHVwX3N5c2N0bF9zZXQoJm5zLT5zZXQsICZzZXRfcm9vdCwgc2V0X2lzX3NlZW4pOworCXRibCA9IGttZW1kdXAodXNlcl90YWJsZSwgc2l6ZW9mKHVzZXJfdGFibGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAodGJsKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgVUNPVU5UX0NPVU5UUzsgaSsrKSB7CisJCQl0YmxbaV0uZGF0YSA9ICZucy0+dWNvdW50X21heFtpXTsKKwkJfQorCQlucy0+c3lzY3RscyA9IF9fcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKCZucy0+c2V0LCAidXNlciIsIHRibCk7CisJfQorCWlmICghbnMtPnN5c2N0bHMpIHsKKwkJa2ZyZWUodGJsKTsKKwkJcmV0aXJlX3N5c2N0bF9zZXQoJm5zLT5zZXQpOworCQlyZXR1cm4gZmFsc2U7CisJfQorI2VuZGlmCisJcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgcmV0aXJlX3VzZXJuc19zeXNjdGxzKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnMpCit7CisjaWZkZWYgQ09ORklHX1NZU0NUTAorCXN0cnVjdCBjdGxfdGFibGUgKnRibDsKKworCXRibCA9IG5zLT5zeXNjdGxzLT5jdGxfdGFibGVfYXJnOworCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKG5zLT5zeXNjdGxzKTsKKwlyZXRpcmVfc3lzY3RsX3NldCgmbnMtPnNldCk7CisJa2ZyZWUodGJsKTsKKyNlbmRpZgorfQorCitzdGF0aWMgc3RydWN0IHVjb3VudHMgKmZpbmRfdWNvdW50cyhzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zLCBrdWlkX3QgdWlkLCBzdHJ1Y3QgaGxpc3RfaGVhZCAqaGFzaGVudCkKK3sKKwlzdHJ1Y3QgdWNvdW50cyAqdWNvdW50czsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHVjb3VudHMsIGhhc2hlbnQsIG5vZGUpIHsKKwkJaWYgKHVpZF9lcSh1Y291bnRzLT51aWQsIHVpZCkgJiYgKHVjb3VudHMtPm5zID09IG5zKSkKKwkJCXJldHVybiB1Y291bnRzOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCB1Y291bnRzICpnZXRfdWNvdW50cyhzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zLCBrdWlkX3QgdWlkKQoreworCXN0cnVjdCBobGlzdF9oZWFkICpoYXNoZW50ID0gdWNvdW50c19oYXNoZW50cnkobnMsIHVpZCk7CisJc3RydWN0IHVjb3VudHMgKnVjb3VudHMsICpuZXc7CisKKwlzcGluX2xvY2soJnVjb3VudHNfbG9jayk7CisJdWNvdW50cyA9IGZpbmRfdWNvdW50cyhucywgdWlkLCBoYXNoZW50KTsKKwlpZiAoIXVjb3VudHMpIHsKKwkJc3Bpbl91bmxvY2soJnVjb3VudHNfbG9jayk7CisKKwkJbmV3ID0ga3phbGxvYyhzaXplb2YoKm5ldyksIEdGUF9LRVJORUwpOworCQlpZiAoIW5ldykKKwkJCXJldHVybiBOVUxMOworCisJCW5ldy0+bnMgPSBuczsKKwkJbmV3LT51aWQgPSB1aWQ7CisJCWF0b21pY19zZXQoJm5ldy0+Y291bnQsIDApOworCisJCXNwaW5fbG9jaygmdWNvdW50c19sb2NrKTsKKwkJdWNvdW50cyA9IGZpbmRfdWNvdW50cyhucywgdWlkLCBoYXNoZW50KTsKKwkJaWYgKHVjb3VudHMpIHsKKwkJCWtmcmVlKG5ldyk7CisJCX0gZWxzZSB7CisJCQlobGlzdF9hZGRfaGVhZCgmbmV3LT5ub2RlLCBoYXNoZW50KTsKKwkJCXVjb3VudHMgPSBuZXc7CisJCX0KKwl9CisJaWYgKCFhdG9taWNfYWRkX3VubGVzcygmdWNvdW50cy0+Y291bnQsIDEsIElOVF9NQVgpKQorCQl1Y291bnRzID0gTlVMTDsKKwlzcGluX3VubG9jaygmdWNvdW50c19sb2NrKTsKKwlyZXR1cm4gdWNvdW50czsKK30KKworc3RhdGljIHZvaWQgcHV0X3Vjb3VudHMoc3RydWN0IHVjb3VudHMgKnVjb3VudHMpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnVjb3VudHMtPmNvdW50KSkgeworCQlzcGluX2xvY2soJnVjb3VudHNfbG9jayk7CisJCWhsaXN0X2RlbF9pbml0KCZ1Y291bnRzLT5ub2RlKTsKKwkJc3Bpbl91bmxvY2soJnVjb3VudHNfbG9jayk7CisKKwkJa2ZyZWUodWNvdW50cyk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGJvb2wgYXRvbWljX2luY19iZWxvdyhhdG9taWNfdCAqdiwgaW50IHUpCit7CisJaW50IGMsIG9sZDsKKwljID0gYXRvbWljX3JlYWQodik7CisJZm9yICg7OykgeworCQlpZiAodW5saWtlbHkoYyA+PSB1KSkKKwkJCXJldHVybiBmYWxzZTsKKwkJb2xkID0gYXRvbWljX2NtcHhjaGcodiwgYywgYysxKTsKKwkJaWYgKGxpa2VseShvbGQgPT0gYykpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJYyA9IG9sZDsKKwl9Cit9CisKK3N0cnVjdCB1Y291bnRzICppbmNfdWNvdW50KHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnMsIGt1aWRfdCB1aWQsCisJCQkgICBlbnVtIHVjb3VudF90eXBlIHR5cGUpCit7CisJc3RydWN0IHVjb3VudHMgKnVjb3VudHMsICppdGVyLCAqYmFkOworCXN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdG5zOworCXVjb3VudHMgPSBnZXRfdWNvdW50cyhucywgdWlkKTsKKwlmb3IgKGl0ZXIgPSB1Y291bnRzOyBpdGVyOyBpdGVyID0gdG5zLT51Y291bnRzKSB7CisJCWludCBtYXg7CisJCXRucyA9IGl0ZXItPm5zOworCQltYXggPSBSRUFEX09OQ0UodG5zLT51Y291bnRfbWF4W3R5cGVdKTsKKwkJaWYgKCFhdG9taWNfaW5jX2JlbG93KCZpdGVyLT51Y291bnRbdHlwZV0sIG1heCkpCisJCQlnb3RvIGZhaWw7CisJfQorCXJldHVybiB1Y291bnRzOworZmFpbDoKKwliYWQgPSBpdGVyOworCWZvciAoaXRlciA9IHVjb3VudHM7IGl0ZXIgIT0gYmFkOyBpdGVyID0gaXRlci0+bnMtPnVjb3VudHMpCisJCWF0b21pY19kZWMoJml0ZXItPnVjb3VudFt0eXBlXSk7CisKKwlwdXRfdWNvdW50cyh1Y291bnRzKTsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBkZWNfdWNvdW50KHN0cnVjdCB1Y291bnRzICp1Y291bnRzLCBlbnVtIHVjb3VudF90eXBlIHR5cGUpCit7CisJc3RydWN0IHVjb3VudHMgKml0ZXI7CisJZm9yIChpdGVyID0gdWNvdW50czsgaXRlcjsgaXRlciA9IGl0ZXItPm5zLT51Y291bnRzKSB7CisJCWludCBkZWMgPSBhdG9taWNfZGVjX2lmX3Bvc2l0aXZlKCZpdGVyLT51Y291bnRbdHlwZV0pOworCQlXQVJOX09OX09OQ0UoZGVjIDwgMCk7CisJfQorCXB1dF91Y291bnRzKHVjb3VudHMpOworfQorCitzdGF0aWMgX19pbml0IGludCB1c2VyX25hbWVzcGFjZV9zeXNjdGxfaW5pdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19TWVNDVEwKKwlzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKnVzZXJfaGVhZGVyOworCXN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIGVtcHR5WzFdOworCS8qCisJICogSXQgaXMgbmVjZXNzYXJ5IHRvIHJlZ2lzdGVyIHRoZSB1c2VyIGRpcmVjdG9yeSBpbiB0aGUKKwkgKiBkZWZhdWx0IHNldCBzbyB0aGF0IHJlZ2lzdHJhdGlvbnMgaW4gdGhlIGNoaWxkIHNldHMgd29yaworCSAqIHByb3Blcmx5LgorCSAqLworCXVzZXJfaGVhZGVyID0gcmVnaXN0ZXJfc3lzY3RsKCJ1c2VyIiwgZW1wdHkpOworCUJVR19PTighdXNlcl9oZWFkZXIpOworCUJVR19PTighc2V0dXBfdXNlcm5zX3N5c2N0bHMoJmluaXRfdXNlcl9ucykpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CitzdWJzeXNfaW5pdGNhbGwodXNlcl9uYW1lc3BhY2Vfc3lzY3RsX2luaXQpOworCisKZGlmZiAtLWdpdCBhL2tlcm5lbC91cC5jIGIva2VybmVsL3VwLmMKaW5kZXggMTc2MGJmMy4uZWU4MWFjOSAxMDA2NDQKLS0tIGEva2VybmVsL3VwLmMKKysrIGIva2VybmVsL3VwLmMKQEAgLTYsNiArNiw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvaHlwZXJ2aXNvci5oPgogCiBpbnQgc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGludCBjcHUsIHZvaWQgKCpmdW5jKSAodm9pZCAqaW5mbyksIHZvaWQgKmluZm8sCiAJCQkJaW50IHdhaXQpCkBAIC04MiwzICs4MywyMCBAQAogCXByZWVtcHRfZW5hYmxlKCk7CiB9CiBFWFBPUlRfU1lNQk9MKG9uX2VhY2hfY3B1X2NvbmQpOworCitpbnQgc21wX2NhbGxfb25fY3B1KHVuc2lnbmVkIGludCBjcHUsIGludCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKnBhciwgYm9vbCBwaHlzKQoreworCWludCByZXQ7CisKKwlpZiAoY3B1ICE9IDApCisJCXJldHVybiAtRU5YSU87CisKKwlpZiAocGh5cykKKwkJaHlwZXJ2aXNvcl9waW5fdmNwdSgwKTsKKwlyZXQgPSBmdW5jKHBhcik7CisJaWYgKHBoeXMpCisJCWh5cGVydmlzb3JfcGluX3ZjcHUoLTEpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNtcF9jYWxsX29uX2NwdSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdXNlcl9uYW1lc3BhY2UuYyBiL2tlcm5lbC91c2VyX25hbWVzcGFjZS5jCmluZGV4IDY4ZjU5NDIuLjg2Yjc4NTQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC91c2VyX25hbWVzcGFjZS5jCisrKyBiL2tlcm5lbC91c2VyX25hbWVzcGFjZS5jCkBAIC0yOSw2ICsyOSwxNyBAQAogc3RhdGljIGJvb2wgbmV3X2lkbWFwX3Blcm1pdHRlZChjb25zdCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCQlzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zLCBpbnQgY2FwX3NldGlkLAogCQkJCXN0cnVjdCB1aWRfZ2lkX21hcCAqbWFwKTsKK3N0YXRpYyB2b2lkIGZyZWVfdXNlcl9ucyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworCitzdGF0aWMgc3RydWN0IHVjb3VudHMgKmluY191c2VyX25hbWVzcGFjZXMoc3RydWN0IHVzZXJfbmFtZXNwYWNlICpucywga3VpZF90IHVpZCkKK3sKKwlyZXR1cm4gaW5jX3Vjb3VudChucywgdWlkLCBVQ09VTlRfVVNFUl9OQU1FU1BBQ0VTKTsKK30KKworc3RhdGljIHZvaWQgZGVjX3VzZXJfbmFtZXNwYWNlcyhzdHJ1Y3QgdWNvdW50cyAqdWNvdW50cykKK3sKKwlyZXR1cm4gZGVjX3Vjb3VudCh1Y291bnRzLCBVQ09VTlRfVVNFUl9OQU1FU1BBQ0VTKTsKK30KIAogc3RhdGljIHZvaWQgc2V0X2NyZWRfdXNlcl9ucyhzdHJ1Y3QgY3JlZCAqY3JlZCwgc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zKQogewpAQCAtNjIsMTAgKzczLDE2IEBACiAJc3RydWN0IHVzZXJfbmFtZXNwYWNlICpucywgKnBhcmVudF9ucyA9IG5ldy0+dXNlcl9uczsKIAlrdWlkX3Qgb3duZXIgPSBuZXctPmV1aWQ7CiAJa2dpZF90IGdyb3VwID0gbmV3LT5lZ2lkOwotCWludCByZXQ7CisJc3RydWN0IHVjb3VudHMgKnVjb3VudHM7CisJaW50IHJldCwgaTsKIAorCXJldCA9IC1FTk9TUEM7CiAJaWYgKHBhcmVudF9ucy0+bGV2ZWwgPiAzMikKLQkJcmV0dXJuIC1FVVNFUlM7CisJCWdvdG8gZmFpbDsKKworCXVjb3VudHMgPSBpbmNfdXNlcl9uYW1lc3BhY2VzKHBhcmVudF9ucywgb3duZXIpOworCWlmICghdWNvdW50cykKKwkJZ290byBmYWlsOwogCiAJLyoKIAkgKiBWZXJpZnkgdGhhdCB3ZSBjYW4gbm90IHZpb2xhdGUgdGhlIHBvbGljeSBvZiB3aGljaCBmaWxlcwpAQCAtNzMsMjYgKzkwLDI3IEBACiAJICogYnkgdmVyaWZpbmcgdGhhdCB0aGUgcm9vdCBkaXJlY3RvcnkgaXMgYXQgdGhlIHJvb3Qgb2YgdGhlCiAJICogbW91bnQgbmFtZXNwYWNlIHdoaWNoIGFsbG93cyBhbGwgZmlsZXMgdG8gYmUgYWNjZXNzZWQuCiAJICovCisJcmV0ID0gLUVQRVJNOwogCWlmIChjdXJyZW50X2Nocm9vdGVkKCkpCi0JCXJldHVybiAtRVBFUk07CisJCWdvdG8gZmFpbF9kZWM7CiAKIAkvKiBUaGUgY3JlYXRvciBuZWVkcyBhIG1hcHBpbmcgaW4gdGhlIHBhcmVudCB1c2VyIG5hbWVzcGFjZQogCSAqIG9yIGVsc2Ugd2Ugd29uJ3QgYmUgYWJsZSB0byByZWFzb25hYmx5IHRlbGwgdXNlcnNwYWNlIHdobwogCSAqIGNyZWF0ZWQgYSB1c2VyX25hbWVzcGFjZS4KIAkgKi8KKwlyZXQgPSAtRVBFUk07CiAJaWYgKCFrdWlkX2hhc19tYXBwaW5nKHBhcmVudF9ucywgb3duZXIpIHx8CiAJICAgICFrZ2lkX2hhc19tYXBwaW5nKHBhcmVudF9ucywgZ3JvdXApKQotCQlyZXR1cm4gLUVQRVJNOworCQlnb3RvIGZhaWxfZGVjOwogCisJcmV0ID0gLUVOT01FTTsKIAlucyA9IGttZW1fY2FjaGVfemFsbG9jKHVzZXJfbnNfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5zKQotCQlyZXR1cm4gLUVOT01FTTsKKwkJZ290byBmYWlsX2RlYzsKIAogCXJldCA9IG5zX2FsbG9jX2ludW0oJm5zLT5ucyk7Ci0JaWYgKHJldCkgewotCQlrbWVtX2NhY2hlX2ZyZWUodXNlcl9uc19jYWNoZXAsIG5zKTsKLQkJcmV0dXJuIHJldDsKLQl9CisJaWYgKHJldCkKKwkJZ290byBmYWlsX2ZyZWU7CiAJbnMtPm5zLm9wcyA9ICZ1c2VybnNfb3BlcmF0aW9uczsKIAogCWF0b21pY19zZXQoJm5zLT5jb3VudCwgMSk7CkBAIC0xMDEsMTggKzExOSwzNyBAQAogCW5zLT5sZXZlbCA9IHBhcmVudF9ucy0+bGV2ZWwgKyAxOwogCW5zLT5vd25lciA9IG93bmVyOwogCW5zLT5ncm91cCA9IGdyb3VwOworCUlOSVRfV09SSygmbnMtPndvcmssIGZyZWVfdXNlcl9ucyk7CisJZm9yIChpID0gMDsgaSA8IFVDT1VOVF9DT1VOVFM7IGkrKykgeworCQlucy0+dWNvdW50X21heFtpXSA9IElOVF9NQVg7CisJfQorCW5zLT51Y291bnRzID0gdWNvdW50czsKIAogCS8qIEluaGVyaXQgVVNFUk5TX1NFVEdST1VQU19BTExPV0VEIGZyb20gb3VyIHBhcmVudCAqLwogCW11dGV4X2xvY2soJnVzZXJuc19zdGF0ZV9tdXRleCk7CiAJbnMtPmZsYWdzID0gcGFyZW50X25zLT5mbGFnczsKIAltdXRleF91bmxvY2soJnVzZXJuc19zdGF0ZV9tdXRleCk7CiAKLQlzZXRfY3JlZF91c2VyX25zKG5ldywgbnMpOwotCiAjaWZkZWYgQ09ORklHX1BFUlNJU1RFTlRfS0VZUklOR1MKIAlpbml0X3J3c2VtKCZucy0+cGVyc2lzdGVudF9rZXlyaW5nX3JlZ2lzdGVyX3NlbSk7CiAjZW5kaWYKKwlyZXQgPSAtRU5PTUVNOworCWlmICghc2V0dXBfdXNlcm5zX3N5c2N0bHMobnMpKQorCQlnb3RvIGZhaWxfa2V5cmluZzsKKworCXNldF9jcmVkX3VzZXJfbnMobmV3LCBucyk7CiAJcmV0dXJuIDA7CitmYWlsX2tleXJpbmc6CisjaWZkZWYgQ09ORklHX1BFUlNJU1RFTlRfS0VZUklOR1MKKwlrZXlfcHV0KG5zLT5wZXJzaXN0ZW50X2tleXJpbmdfcmVnaXN0ZXIpOworI2VuZGlmCisJbnNfZnJlZV9pbnVtKCZucy0+bnMpOworZmFpbF9mcmVlOgorCWttZW1fY2FjaGVfZnJlZSh1c2VyX25zX2NhY2hlcCwgbnMpOworZmFpbF9kZWM6CisJZGVjX3VzZXJfbmFtZXNwYWNlcyh1Y291bnRzKTsKK2ZhaWw6CisJcmV0dXJuIHJldDsKIH0KIAogaW50IHVuc2hhcmVfdXNlcm5zKHVuc2lnbmVkIGxvbmcgdW5zaGFyZV9mbGFncywgc3RydWN0IGNyZWQgKipuZXdfY3JlZCkKQEAgLTEzNSwyMSArMTcyLDMwIEBACiAJcmV0dXJuIGVycjsKIH0KIAotdm9pZCBmcmVlX3VzZXJfbnMoc3RydWN0IHVzZXJfbmFtZXNwYWNlICpucykKK3N0YXRpYyB2b2lkIGZyZWVfdXNlcl9ucyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHVzZXJfbmFtZXNwYWNlICpwYXJlbnQ7CisJc3RydWN0IHVzZXJfbmFtZXNwYWNlICpwYXJlbnQsICpucyA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UsIHdvcmspOwogCiAJZG8geworCQlzdHJ1Y3QgdWNvdW50cyAqdWNvdW50cyA9IG5zLT51Y291bnRzOwogCQlwYXJlbnQgPSBucy0+cGFyZW50OworCQlyZXRpcmVfdXNlcm5zX3N5c2N0bHMobnMpOwogI2lmZGVmIENPTkZJR19QRVJTSVNURU5UX0tFWVJJTkdTCiAJCWtleV9wdXQobnMtPnBlcnNpc3RlbnRfa2V5cmluZ19yZWdpc3Rlcik7CiAjZW5kaWYKIAkJbnNfZnJlZV9pbnVtKCZucy0+bnMpOwogCQlrbWVtX2NhY2hlX2ZyZWUodXNlcl9uc19jYWNoZXAsIG5zKTsKKwkJZGVjX3VzZXJfbmFtZXNwYWNlcyh1Y291bnRzKTsKIAkJbnMgPSBwYXJlbnQ7CiAJfSB3aGlsZSAoYXRvbWljX2RlY19hbmRfdGVzdCgmcGFyZW50LT5jb3VudCkpOwogfQotRVhQT1JUX1NZTUJPTChmcmVlX3VzZXJfbnMpOworCit2b2lkIF9fcHV0X3VzZXJfbnMoc3RydWN0IHVzZXJfbmFtZXNwYWNlICpucykKK3sKKwlzY2hlZHVsZV93b3JrKCZucy0+d29yayk7Cit9CitFWFBPUlRfU1lNQk9MKF9fcHV0X3VzZXJfbnMpOwogCiBzdGF0aWMgdTMyIG1hcF9pZF9yYW5nZV9kb3duKHN0cnVjdCB1aWRfZ2lkX21hcCAqbWFwLCB1MzIgaWQsIHUzMiBjb3VudCkKIHsKQEAgLTEwMDQsMTIgKzEwNTAsMzcgQEAKIAlyZXR1cm4gY29tbWl0X2NyZWRzKGNyZWQpOwogfQogCitzdHJ1Y3QgbnNfY29tbW9uICpuc19nZXRfb3duZXIoc3RydWN0IG5zX2NvbW1vbiAqbnMpCit7CisJc3RydWN0IHVzZXJfbmFtZXNwYWNlICpteV91c2VyX25zID0gY3VycmVudF91c2VyX25zKCk7CisJc3RydWN0IHVzZXJfbmFtZXNwYWNlICpvd25lciwgKnA7CisKKwkvKiBTZWUgaWYgdGhlIG93bmVyIGlzIGluIHRoZSBjdXJyZW50IHVzZXIgbmFtZXNwYWNlICovCisJb3duZXIgPSBwID0gbnMtPm9wcy0+b3duZXIobnMpOworCWZvciAoOzspIHsKKwkJaWYgKCFwKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVQRVJNKTsKKwkJaWYgKHAgPT0gbXlfdXNlcl9ucykKKwkJCWJyZWFrOworCQlwID0gcC0+cGFyZW50OworCX0KKworCXJldHVybiAmZ2V0X3VzZXJfbnMob3duZXIpLT5uczsKK30KKworc3RhdGljIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdXNlcm5zX293bmVyKHN0cnVjdCBuc19jb21tb24gKm5zKQoreworCXJldHVybiB0b191c2VyX25zKG5zKS0+cGFyZW50OworfQorCiBjb25zdCBzdHJ1Y3QgcHJvY19uc19vcGVyYXRpb25zIHVzZXJuc19vcGVyYXRpb25zID0gewogCS5uYW1lCQk9ICJ1c2VyIiwKIAkudHlwZQkJPSBDTE9ORV9ORVdVU0VSLAogCS5nZXQJCT0gdXNlcm5zX2dldCwKIAkucHV0CQk9IHVzZXJuc19wdXQsCiAJLmluc3RhbGwJPSB1c2VybnNfaW5zdGFsbCwKKwkub3duZXIJCT0gdXNlcm5zX293bmVyLAorCS5nZXRfcGFyZW50CT0gbnNfZ2V0X293bmVyLAogfTsKIAogc3RhdGljIF9faW5pdCBpbnQgdXNlcl9uYW1lc3BhY2VzX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2tlcm5lbC91dHNuYW1lLmMgYi9rZXJuZWwvdXRzbmFtZS5jCmluZGV4IDgzMWVhNzEuLjY5NzZjZDQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC91dHNuYW1lLmMKKysrIGIva2VybmVsL3V0c25hbWUuYwpAQCAtMTcsNiArMTcsMTYgQEAKICNpbmNsdWRlIDxsaW51eC91c2VyX25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfbnMuaD4KIAorc3RhdGljIHN0cnVjdCB1Y291bnRzICppbmNfdXRzX25hbWVzcGFjZXMoc3RydWN0IHVzZXJfbmFtZXNwYWNlICpucykKK3sKKwlyZXR1cm4gaW5jX3Vjb3VudChucywgY3VycmVudF9ldWlkKCksIFVDT1VOVF9VVFNfTkFNRVNQQUNFUyk7Cit9CisKK3N0YXRpYyB2b2lkIGRlY191dHNfbmFtZXNwYWNlcyhzdHJ1Y3QgdWNvdW50cyAqdWNvdW50cykKK3sKKwlkZWNfdWNvdW50KHVjb3VudHMsIFVDT1VOVF9VVFNfTkFNRVNQQUNFUyk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqY3JlYXRlX3V0c19ucyh2b2lkKQogewogCXN0cnVjdCB1dHNfbmFtZXNwYWNlICp1dHNfbnM7CkBAIC0zNiwxOCArNDYsMjQgQEAKIAkJCQkJICBzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqb2xkX25zKQogewogCXN0cnVjdCB1dHNfbmFtZXNwYWNlICpuczsKKwlzdHJ1Y3QgdWNvdW50cyAqdWNvdW50czsKIAlpbnQgZXJyOwogCisJZXJyID0gLUVOT1NQQzsKKwl1Y291bnRzID0gaW5jX3V0c19uYW1lc3BhY2VzKHVzZXJfbnMpOworCWlmICghdWNvdW50cykKKwkJZ290byBmYWlsOworCisJZXJyID0gLUVOT01FTTsKIAlucyA9IGNyZWF0ZV91dHNfbnMoKTsKIAlpZiAoIW5zKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwkJZ290byBmYWlsX2RlYzsKIAogCWVyciA9IG5zX2FsbG9jX2ludW0oJm5zLT5ucyk7Ci0JaWYgKGVycikgewotCQlrZnJlZShucyk7Ci0JCXJldHVybiBFUlJfUFRSKGVycik7Ci0JfQorCWlmIChlcnIpCisJCWdvdG8gZmFpbF9mcmVlOwogCisJbnMtPnVjb3VudHMgPSB1Y291bnRzOwogCW5zLT5ucy5vcHMgPSAmdXRzbnNfb3BlcmF0aW9uczsKIAogCWRvd25fcmVhZCgmdXRzX3NlbSk7CkBAIC01NSw2ICs3MSwxMyBAQAogCW5zLT51c2VyX25zID0gZ2V0X3VzZXJfbnModXNlcl9ucyk7CiAJdXBfcmVhZCgmdXRzX3NlbSk7CiAJcmV0dXJuIG5zOworCitmYWlsX2ZyZWU6CisJa2ZyZWUobnMpOworZmFpbF9kZWM6CisJZGVjX3V0c19uYW1lc3BhY2VzKHVjb3VudHMpOworZmFpbDoKKwlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQogCiAvKgpAQCAtODUsNiArMTA4LDcgQEAKIAlzdHJ1Y3QgdXRzX25hbWVzcGFjZSAqbnM7CiAKIAlucyA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgdXRzX25hbWVzcGFjZSwga3JlZik7CisJZGVjX3V0c19uYW1lc3BhY2VzKG5zLT51Y291bnRzKTsKIAlwdXRfdXNlcl9ucyhucy0+dXNlcl9ucyk7CiAJbnNfZnJlZV9pbnVtKCZucy0+bnMpOwogCWtmcmVlKG5zKTsKQEAgLTEzMCwxMCArMTU0LDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnV0c25zX293bmVyKHN0cnVjdCBuc19jb21tb24gKm5zKQoreworCXJldHVybiB0b191dHNfbnMobnMpLT51c2VyX25zOworfQorCiBjb25zdCBzdHJ1Y3QgcHJvY19uc19vcGVyYXRpb25zIHV0c25zX29wZXJhdGlvbnMgPSB7CiAJLm5hbWUJCT0gInV0cyIsCiAJLnR5cGUJCT0gQ0xPTkVfTkVXVVRTLAogCS5nZXQJCT0gdXRzbnNfZ2V0LAogCS5wdXQJCT0gdXRzbnNfcHV0LAogCS5pbnN0YWxsCT0gdXRzbnNfaW5zdGFsbCwKKwkub3duZXIJCT0gdXRzbnNfb3duZXIsCiB9OwpkaWZmIC0tZ2l0IGEvbGliL0tjb25maWcuZGVidWcgYi9saWIvS2NvbmZpZy5kZWJ1ZwppbmRleCAyMzA3ZDdjLi5jYWI3NDA1IDEwMDY0NAotLS0gYS9saWIvS2NvbmZpZy5kZWJ1ZworKysgYi9saWIvS2NvbmZpZy5kZWJ1ZwpAQCAtODIxLDcgKzgyMSw3IEBACiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgdGhlIGtlcm5lbCB0byBkZXRlY3QgImh1bmcgdGFza3MiLAogCSAgd2hpY2ggYXJlIGJ1Z3MgdGhhdCBjYXVzZSB0aGUgdGFzayB0byBiZSBzdHVjayBpbgotCSAgdW5pbnRlcnJ1cHRpYmxlICJEIiBzdGF0ZSBpbmRlZmluaXRpbGV5LgorCSAgdW5pbnRlcnJ1cHRpYmxlICJEIiBzdGF0ZSBpbmRlZmluaXRlbHkuCiAKIAkgIFdoZW4gYSBodW5nIHRhc2sgaXMgZGV0ZWN0ZWQsIHRoZSBrZXJuZWwgd2lsbCBwcmludCB0aGUKIAkgIGN1cnJlbnQgc3RhY2sgdHJhY2UgKHdoaWNoIHlvdSBzaG91bGQgcmVwb3J0KSwgYnV0IHRoZQpAQCAtMTY4NiwyNCArMTY4Niw2IEBACiAJICBFbmFibGUgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBMYXRlbmN5VE9QIHRvb2wKIAkgIHRvIGZpbmQgb3V0IHdoaWNoIHVzZXJzcGFjZSBpcyBibG9ja2luZyBvbiB3aGF0IGtlcm5lbCBvcGVyYXRpb25zLgogCi1jb25maWcgQVJDSF9IQVNfREVCVUdfU1RSSUNUX1VTRVJfQ09QWV9DSEVDS1MKLQlib29sCi0KLWNvbmZpZyBERUJVR19TVFJJQ1RfVVNFUl9DT1BZX0NIRUNLUwotCWJvb2wgIlN0cmljdCB1c2VyIGNvcHkgc2l6ZSBjaGVja3MiCi0JZGVwZW5kcyBvbiBBUkNIX0hBU19ERUJVR19TVFJJQ1RfVVNFUl9DT1BZX0NIRUNLUwotCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmICFUUkFDRV9CUkFOQ0hfUFJPRklMSU5HCi0JaGVscAotCSAgRW5hYmxpbmcgdGhpcyBvcHRpb24gdHVybnMgYSBjZXJ0YWluIHNldCBvZiBzYW5pdHkgY2hlY2tzIGZvciB1c2VyCi0JICBjb3B5IG9wZXJhdGlvbnMgaW50byBjb21waWxlIHRpbWUgZmFpbHVyZXMuCi0KLQkgIFRoZSBjb3B5X2Zyb21fdXNlcigpIGV0YyBjaGVja3MgYXJlIHRoZXJlIHRvIGhlbHAgdGVzdCBpZiB0aGVyZQotCSAgYXJlIHN1ZmZpY2llbnQgc2VjdXJpdHkgY2hlY2tzIG9uIHRoZSBsZW5ndGggYXJndW1lbnQgb2YKLQkgIHRoZSBjb3B5IG9wZXJhdGlvbiwgYnkgaGF2aW5nIGdjYyBwcm92ZSB0aGF0IHRoZSBhcmd1bWVudCBpcwotCSAgd2l0aGluIGJvdW5kcy4KLQotCSAgSWYgdW5zdXJlLCBzYXkgTi4KLQogc291cmNlIGtlcm5lbC90cmFjZS9LY29uZmlnCiAKIG1lbnUgIlJ1bnRpbWUgVGVzdGluZyIKZGlmZiAtLWdpdCBhL2xpYi9LY29uZmlnLnVic2FuIGIvbGliL0tjb25maWcudWJzYW4KaW5kZXggMzk0OTRhZi4uYmM2ZTY1MSAxMDA2NDQKLS0tIGEvbGliL0tjb25maWcudWJzYW4KKysrIGIvbGliL0tjb25maWcudWJzYW4KQEAgLTEsNiArMSw5IEBACiBjb25maWcgQVJDSF9IQVNfVUJTQU5fU0FOSVRJWkVfQUxMCiAJYm9vbAogCitjb25maWcgQVJDSF9XQU5UU19VQlNBTl9OT19OVUxMCisJZGVmX2Jvb2wgbgorCiBjb25maWcgVUJTQU4KIAlib29sICJVbmRlZmluZWQgYmVoYXZpb3VyIHNhbml0eSBjaGVja2VyIgogCWhlbHAKQEAgLTM0LDMgKzM3LDExIEBACiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIGRldGVjdGlvbiBvZiB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzLgogCSAgRW5hYmxpbmcgdGhpcyBvcHRpb24gb24gYXJjaGl0ZWN0dXJlcyB0aGF0IHN1cHBvcnQgdW5hbGlnbmVkCiAJICBhY2Nlc3NlcyBtYXkgcHJvZHVjZSBhIGxvdCBvZiBmYWxzZSBwb3NpdGl2ZXMuCisKK2NvbmZpZyBVQlNBTl9OVUxMCisJYm9vbCAiRW5hYmxlIGNoZWNraW5nIG9mIG51bGwgcG9pbnRlcnMiCisJZGVwZW5kcyBvbiBVQlNBTgorCWRlZmF1bHQgeSBpZiAhQVJDSF9XQU5UU19VQlNBTl9OT19OVUxMCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBkZXRlY3Rpb24gb2YgbWVtb3J5IGFjY2Vzc2VzIHZpYSBhCisJICBudWxsIHBvaW50ZXIuCmRpZmYgLS1naXQgYS9saWIvTWFrZWZpbGUgYi9saWIvTWFrZWZpbGUKaW5kZXggY2ZhNjhlYi4uZGY3NDdlNSAxMDA2NDQKLS0tIGEvbGliL01ha2VmaWxlCisrKyBiL2xpYi9NYWtlZmlsZQpAQCAtMjIsOSArMjIsOCBAQAogCSBzaGExLm8gY2hhY2hhMjAubyBtZDUubyBpcnFfcmVncy5vIGFyZ3Zfc3BsaXQubyBcCiAJIGZsZXhfcHJvcG9ydGlvbnMubyByYXRlbGltaXQubyBzaG93X21lbS5vIFwKIAkgaXNfc2luZ2xlX3RocmVhZGVkLm8gcGxpc3QubyBkZWNvbXByZXNzLm8ga29iamVjdF91ZXZlbnQubyBcCi0JIGVhcmx5Y3Bpby5vIHNlcV9idWYubyBubWlfYmFja3RyYWNlLm8gbm9kZW1hc2subworCSBlYXJseWNwaW8ubyBzZXFfYnVmLm8gbm1pX2JhY2t0cmFjZS5vIG5vZGVtYXNrLm8gd2luX21pbm1heC5vCiAKLW9iai0kKENPTkZJR19BUkNIX0hBU19ERUJVR19TVFJJQ1RfVVNFUl9DT1BZX0NIRUNLUykgKz0gdXNlcmNvcHkubwogbGliLSQoQ09ORklHX01NVSkgKz0gaW9yZW1hcC5vCiBsaWItJChDT05GSUdfU01QKSArPSBjcHVtYXNrLm8KIGxpYi0kKENPTkZJR19IQVNfRE1BKSArPSBkbWEtbm9vcC5vCmRpZmYgLS1naXQgYS9saWIvY3B1LW5vdGlmaWVyLWVycm9yLWluamVjdC5jIGIvbGliL2NwdS1ub3RpZmllci1lcnJvci1pbmplY3QuYwppbmRleCA3MDdjYTI0Li4wZTJjOWExIDEwMDY0NAotLS0gYS9saWIvY3B1LW5vdGlmaWVyLWVycm9yLWluamVjdC5jCisrKyBiL2xpYi9jcHUtbm90aWZpZXItZXJyb3ItaW5qZWN0LmMKQEAgLTgsMTYgKzgsNDcgQEAKIG1vZHVsZV9wYXJhbShwcmlvcml0eSwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MocHJpb3JpdHksICJzcGVjaWZ5IGNwdSBub3RpZmllciBwcmlvcml0eSIpOwogCisjZGVmaW5lIFVQX1BSRVBBUkUgMAorI2RlZmluZSBVUF9QUkVQQVJFX0ZST1pFTiAwCisjZGVmaW5lIERPV05fUFJFUEFSRSAwCisjZGVmaW5lIERPV05fUFJFUEFSRV9GUk9aRU4gMAorCiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Vycl9pbmplY3QgY3B1X25vdGlmaWVyX2Vycl9pbmplY3QgPSB7CiAJLmFjdGlvbnMgPSB7Ci0JCXsgTk9USUZJRVJfRVJSX0lOSkVDVF9BQ1RJT04oQ1BVX1VQX1BSRVBBUkUpIH0sCi0JCXsgTk9USUZJRVJfRVJSX0lOSkVDVF9BQ1RJT04oQ1BVX1VQX1BSRVBBUkVfRlJPWkVOKSB9LAotCQl7IE5PVElGSUVSX0VSUl9JTkpFQ1RfQUNUSU9OKENQVV9ET1dOX1BSRVBBUkUpIH0sCi0JCXsgTk9USUZJRVJfRVJSX0lOSkVDVF9BQ1RJT04oQ1BVX0RPV05fUFJFUEFSRV9GUk9aRU4pIH0sCisJCXsgTk9USUZJRVJfRVJSX0lOSkVDVF9BQ1RJT04oVVBfUFJFUEFSRSkgfSwKKwkJeyBOT1RJRklFUl9FUlJfSU5KRUNUX0FDVElPTihVUF9QUkVQQVJFX0ZST1pFTikgfSwKKwkJeyBOT1RJRklFUl9FUlJfSU5KRUNUX0FDVElPTihET1dOX1BSRVBBUkUpIH0sCisJCXsgTk9USUZJRVJfRVJSX0lOSkVDVF9BQ1RJT04oRE9XTl9QUkVQQVJFX0ZST1pFTikgfSwKIAkJe30KIAl9CiB9OwogCitzdGF0aWMgaW50IG5vdGZfZXJyX2hhbmRsZShzdHJ1Y3Qgbm90aWZpZXJfZXJyX2luamVjdF9hY3Rpb24gKmFjdGlvbikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gYWN0aW9uLT5lcnJvcjsKKwlpZiAocmV0KQorCQlwcl9pbmZvKCJJbmplY3RpbmcgZXJyb3IgKCVkKSB0byAlc1xuIiwgcmV0LCBhY3Rpb24tPm5hbWUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbm90Zl9lcnJfaW5qX3VwX3ByZXBhcmUodW5zaWduZWQgaW50IGNwdSkKK3sKKwlpZiAoIWNwdWhwX3Rhc2tzX2Zyb3plbikKKwkJcmV0dXJuIG5vdGZfZXJyX2hhbmRsZSgmY3B1X25vdGlmaWVyX2Vycl9pbmplY3QuYWN0aW9uc1swXSk7CisJZWxzZQorCQlyZXR1cm4gbm90Zl9lcnJfaGFuZGxlKCZjcHVfbm90aWZpZXJfZXJyX2luamVjdC5hY3Rpb25zWzFdKTsKK30KKworc3RhdGljIGludCBub3RmX2Vycl9pbmpfZGVhZCh1bnNpZ25lZCBpbnQgY3B1KQoreworCWlmICghY3B1aHBfdGFza3NfZnJvemVuKQorCQlyZXR1cm4gbm90Zl9lcnJfaGFuZGxlKCZjcHVfbm90aWZpZXJfZXJyX2luamVjdC5hY3Rpb25zWzJdKTsKKwllbHNlCisJCXJldHVybiBub3RmX2Vycl9oYW5kbGUoJmNwdV9ub3RpZmllcl9lcnJfaW5qZWN0LmFjdGlvbnNbM10pOworfQorCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqZGlyOwogCiBzdGF0aWMgaW50IGVycl9pbmplY3RfaW5pdCh2b2lkKQpAQCAtMjksNyArNjAsMTAgQEAKIAlpZiAoSVNfRVJSKGRpcikpCiAJCXJldHVybiBQVFJfRVJSKGRpcik7CiAKLQllcnIgPSByZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJmNwdV9ub3RpZmllcl9lcnJfaW5qZWN0Lm5iKTsKKwllcnIgPSBjcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX05PVEZfRVJSX0lOSl9QUkVQQVJFLAorCQkJCQkiY3B1LWVyci1ub3RpZjpwcmVwYXJlIiwKKwkJCQkJbm90Zl9lcnJfaW5qX3VwX3ByZXBhcmUsCisJCQkJCW5vdGZfZXJyX2lual9kZWFkKTsKIAlpZiAoZXJyKQogCQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZGlyKTsKIApAQCAtMzgsNyArNzIsNyBAQAogCiBzdGF0aWMgdm9pZCBlcnJfaW5qZWN0X2V4aXQodm9pZCkKIHsKLQl1bnJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmY3B1X25vdGlmaWVyX2Vycl9pbmplY3QubmIpOworCWNwdWhwX3JlbW92ZV9zdGF0ZV9ub2NhbGxzKENQVUhQX05PVEZfRVJSX0lOSl9QUkVQQVJFKTsKIAlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZGlyKTsKIH0KIApkaWZmIC0tZ2l0IGEvbGliL2RtYS1kZWJ1Zy5jIGIvbGliL2RtYS1kZWJ1Zy5jCmluZGV4IGZjZmExOTMuLjg5NzEzNzAgMTAwNjQ0Ci0tLSBhL2xpYi9kbWEtZGVidWcuYworKysgYi9saWIvZG1hLWRlYnVnLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGFja3RyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLWRlYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KQEAgLTQzLDYgKzQ0LDcgQEAKIAlkbWFfZGVidWdfcGFnZSwKIAlkbWFfZGVidWdfc2csCiAJZG1hX2RlYnVnX2NvaGVyZW50LAorCWRtYV9kZWJ1Z19yZXNvdXJjZSwKIH07CiAKIGVudW0gbWFwX2Vycl90eXBlcyB7CkBAIC0xNTAsOCArMTUyLDkgQEAKIAlbTUFQX0VSUl9DSEVDS0VEXSA9ICJkbWEgbWFwIGVycm9yIGNoZWNrZWQiLAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKnR5cGUybmFtZVs0XSA9IHsgInNpbmdsZSIsICJwYWdlIiwKLQkJCQkgICAgInNjYXRoZXItZ2F0aGVyIiwgImNvaGVyZW50IiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKnR5cGUybmFtZVs1XSA9IHsgInNpbmdsZSIsICJwYWdlIiwKKwkJCQkgICAgInNjYXRoZXItZ2F0aGVyIiwgImNvaGVyZW50IiwKKwkJCQkgICAgInJlc291cmNlIiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqZGlyMm5hbWVbNF0gPSB7ICJETUFfQklESVJFQ1RJT05BTCIsICJETUFfVE9fREVWSUNFIiwKIAkJCQkgICAiRE1BX0ZST01fREVWSUNFIiwgIkRNQV9OT05FIiB9OwpAQCAtMzk5LDYgKzQwMiw5IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgcGh5c19hZGRyKHN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmVudHJ5KQogeworCWlmIChlbnRyeS0+dHlwZSA9PSBkbWFfZGVidWdfcmVzb3VyY2UpCisJCXJldHVybiBfX3Bmbl90b19waHlzKGVudHJ5LT5wZm4pICsgZW50cnktPm9mZnNldDsKKwogCXJldHVybiBwYWdlX3RvX3BoeXMocGZuX3RvX3BhZ2UoZW50cnktPnBmbikpICsgZW50cnktPm9mZnNldDsKIH0KIApAQCAtMTE2NCwxMSArMTE3MCwzMiBAQAogCXB1dF9oYXNoX2J1Y2tldChidWNrZXQsICZmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIGNoZWNrX2Zvcl9zdGFjayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCitzdGF0aWMgdm9pZCBjaGVja19mb3Jfc3RhY2soc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBwYWdlICpwYWdlLCBzaXplX3Qgb2Zmc2V0KQogewotCWlmIChvYmplY3RfaXNfb25fc3RhY2soYWRkcikpCi0JCWVycl9wcmludGsoZGV2LCBOVUxMLCAiRE1BLUFQSTogZGV2aWNlIGRyaXZlciBtYXBzIG1lbW9yeSBmcm9tICIKLQkJCQkic3RhY2sgW2FkZHI9JXBdXG4iLCBhZGRyKTsKKwl2b2lkICphZGRyOworCXN0cnVjdCB2bV9zdHJ1Y3QgKnN0YWNrX3ZtX2FyZWEgPSB0YXNrX3N0YWNrX3ZtX2FyZWEoY3VycmVudCk7CisKKwlpZiAoIXN0YWNrX3ZtX2FyZWEpIHsKKwkJLyogU3RhY2sgaXMgZGlyZWN0LW1hcHBlZC4gKi8KKwkJaWYgKFBhZ2VIaWdoTWVtKHBhZ2UpKQorCQkJcmV0dXJuOworCQlhZGRyID0gcGFnZV9hZGRyZXNzKHBhZ2UpICsgb2Zmc2V0OworCQlpZiAob2JqZWN0X2lzX29uX3N0YWNrKGFkZHIpKQorCQkJZXJyX3ByaW50ayhkZXYsIE5VTEwsICJETUEtQVBJOiBkZXZpY2UgZHJpdmVyIG1hcHMgbWVtb3J5IGZyb20gc3RhY2sgW2FkZHI9JXBdXG4iLCBhZGRyKTsKKwl9IGVsc2UgeworCQkvKiBTdGFjayBpcyB2bWFsbG9jZWQuICovCisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBzdGFja192bV9hcmVhLT5ucl9wYWdlczsgaSsrKSB7CisJCQlpZiAocGFnZSAhPSBzdGFja192bV9hcmVhLT5wYWdlc1tpXSkKKwkJCQljb250aW51ZTsKKworCQkJYWRkciA9ICh1OCAqKWN1cnJlbnQtPnN0YWNrICsgaSAqIFBBR0VfU0laRSArIG9mZnNldDsKKwkJCWVycl9wcmludGsoZGV2LCBOVUxMLCAiRE1BLUFQSTogZGV2aWNlIGRyaXZlciBtYXBzIG1lbW9yeSBmcm9tIHN0YWNrIFtwcm9iYWJsZSBhZGRyPSVwXVxuIiwgYWRkcik7CisJCQlicmVhazsKKwkJfQorCX0KIH0KIAogc3RhdGljIGlubGluZSBib29sIG92ZXJsYXAodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sIHZvaWQgKnN0YXJ0LCB2b2lkICplbmQpCkBAIC0xMjkxLDEwICsxMzE4LDExIEBACiAJaWYgKG1hcF9zaW5nbGUpCiAJCWVudHJ5LT50eXBlID0gZG1hX2RlYnVnX3NpbmdsZTsKIAorCWNoZWNrX2Zvcl9zdGFjayhkZXYsIHBhZ2UsIG9mZnNldCk7CisKIAlpZiAoIVBhZ2VIaWdoTWVtKHBhZ2UpKSB7CiAJCXZvaWQgKmFkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSkgKyBvZmZzZXQ7CiAKLQkJY2hlY2tfZm9yX3N0YWNrKGRldiwgYWRkcik7CiAJCWNoZWNrX2Zvcl9pbGxlZ2FsX2FyZWEoZGV2LCBhZGRyLCBzaXplKTsKIAl9CiAKQEAgLTEzODYsOCArMTQxNCw5IEBACiAJCWVudHJ5LT5zZ19jYWxsX2VudHMgICA9IG5lbnRzOwogCQllbnRyeS0+c2dfbWFwcGVkX2VudHMgPSBtYXBwZWRfZW50czsKIAorCQljaGVja19mb3Jfc3RhY2soZGV2LCBzZ19wYWdlKHMpLCBzLT5vZmZzZXQpOworCiAJCWlmICghUGFnZUhpZ2hNZW0oc2dfcGFnZShzKSkpIHsKLQkJCWNoZWNrX2Zvcl9zdGFjayhkZXYsIHNnX3ZpcnQocykpOwogCQkJY2hlY2tfZm9yX2lsbGVnYWxfYXJlYShkZXYsIHNnX3ZpcnQocyksIHNnX2RtYV9sZW4ocykpOwogCQl9CiAKQEAgLTE0OTUsNiArMTUyNCw0OSBAQAogfQogRVhQT1JUX1NZTUJPTChkZWJ1Z19kbWFfZnJlZV9jb2hlcmVudCk7CiAKK3ZvaWQgZGVidWdfZG1hX21hcF9yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBoeXNfYWRkcl90IGFkZHIsIHNpemVfdCBzaXplLAorCQkJICAgIGludCBkaXJlY3Rpb24sIGRtYV9hZGRyX3QgZG1hX2FkZHIpCit7CisJc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqZW50cnk7CisKKwlpZiAodW5saWtlbHkoZG1hX2RlYnVnX2Rpc2FibGVkKCkpKQorCQlyZXR1cm47CisKKwllbnRyeSA9IGRtYV9lbnRyeV9hbGxvYygpOworCWlmICghZW50cnkpCisJCXJldHVybjsKKworCWVudHJ5LT50eXBlCQk9IGRtYV9kZWJ1Z19yZXNvdXJjZTsKKwllbnRyeS0+ZGV2CQk9IGRldjsKKwllbnRyeS0+cGZuCQk9IFBIWVNfUEZOKGFkZHIpOworCWVudHJ5LT5vZmZzZXQJCT0gb2Zmc2V0X2luX3BhZ2UoYWRkcik7CisJZW50cnktPnNpemUJCT0gc2l6ZTsKKwllbnRyeS0+ZGV2X2FkZHIJCT0gZG1hX2FkZHI7CisJZW50cnktPmRpcmVjdGlvbgk9IGRpcmVjdGlvbjsKKwllbnRyeS0+bWFwX2Vycl90eXBlCT0gTUFQX0VSUl9OT1RfQ0hFQ0tFRDsKKworCWFkZF9kbWFfZW50cnkoZW50cnkpOworfQorRVhQT1JUX1NZTUJPTChkZWJ1Z19kbWFfbWFwX3Jlc291cmNlKTsKKwordm9pZCBkZWJ1Z19kbWFfdW5tYXBfcmVzb3VyY2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLAorCQkJICAgICAgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pCit7CisJc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSByZWYgPSB7CisJCS50eXBlICAgICAgICAgICA9IGRtYV9kZWJ1Z19yZXNvdXJjZSwKKwkJLmRldiAgICAgICAgICAgID0gZGV2LAorCQkuZGV2X2FkZHIgICAgICAgPSBkbWFfYWRkciwKKwkJLnNpemUgICAgICAgICAgID0gc2l6ZSwKKwkJLmRpcmVjdGlvbiAgICAgID0gZGlyZWN0aW9uLAorCX07CisKKwlpZiAodW5saWtlbHkoZG1hX2RlYnVnX2Rpc2FibGVkKCkpKQorCQlyZXR1cm47CisKKwljaGVja191bm1hcCgmcmVmKTsKK30KK0VYUE9SVF9TWU1CT0woZGVidWdfZG1hX3VubWFwX3Jlc291cmNlKTsKKwogdm9pZCBkZWJ1Z19kbWFfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKIAkJCQkgICBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbikKIHsKZGlmZiAtLWdpdCBhL2xpYi9pb3ZfaXRlci5jIGIvbGliL2lvdl9pdGVyLmMKaW5kZXggOWU4YzczOC4uN2UzMTM4YyAxMDA2NDQKLS0tIGEvbGliL2lvdl9pdGVyLmMKKysrIGIvbGliL2lvdl9pdGVyLmMKQEAgLTI5MSwzMyArMjkxLDEzIEBACiB9CiAKIC8qCi0gKiBGYXVsdCBpbiB0aGUgZmlyc3QgaW92ZWMgb2YgdGhlIGdpdmVuIGlvdl9pdGVyLCB0byBhIG1heGltdW0gbGVuZ3RoCi0gKiBvZiBieXRlcy4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIG5vbi16ZXJvIGlmIHRoZSBtZW1vcnkgY291bGQgbm90IGJlCi0gKiBhY2Nlc3NlZCAoaWUuIGJlY2F1c2UgaXQgaXMgYW4gaW52YWxpZCBhZGRyZXNzKS4KLSAqCi0gKiB3cml0ZXYtaW50ZW5zaXZlIGNvZGUgbWF5IHdhbnQgdGhpcyB0byBwcmVmYXVsdCBzZXZlcmFsIGlvdmVjcyAtLSB0aGF0Ci0gKiB3b3VsZCBiZSBwb3NzaWJsZSAoY2FsbGVycyBtdXN0IG5vdCByZWx5IG9uIHRoZSBmYWN0IHRoYXQgX29ubHlfIHRoZQotICogZmlyc3QgaW92ZWMgd2lsbCBiZSBmYXVsdGVkIHdpdGggdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24pLgotICovCi1pbnQgaW92X2l0ZXJfZmF1bHRfaW5fcmVhZGFibGUoc3RydWN0IGlvdl9pdGVyICppLCBzaXplX3QgYnl0ZXMpCi17Ci0JaWYgKCEoaS0+dHlwZSAmIChJVEVSX0JWRUN8SVRFUl9LVkVDKSkpIHsKLQkJY2hhciBfX3VzZXIgKmJ1ZiA9IGktPmlvdi0+aW92X2Jhc2UgKyBpLT5pb3Zfb2Zmc2V0OwotCQlieXRlcyA9IG1pbihieXRlcywgaS0+aW92LT5pb3ZfbGVuIC0gaS0+aW92X29mZnNldCk7Ci0JCXJldHVybiBmYXVsdF9pbl9wYWdlc19yZWFkYWJsZShidWYsIGJ5dGVzKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGlvdl9pdGVyX2ZhdWx0X2luX3JlYWRhYmxlKTsKLQotLyoKICAqIEZhdWx0IGluIG9uZSBvciBtb3JlIGlvdmVjcyBvZiB0aGUgZ2l2ZW4gaW92X2l0ZXIsIHRvIGEgbWF4aW11bSBsZW5ndGggb2YKICAqIGJ5dGVzLiAgRm9yIGVhY2ggaW92ZWMsIGZhdWx0IGluIGVhY2ggcGFnZSB0aGF0IGNvbnN0aXR1dGVzIHRoZSBpb3ZlYy4KICAqCiAgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCBvciBub24temVybyBpZiB0aGUgbWVtb3J5IGNvdWxkIG5vdCBiZSBhY2Nlc3NlZCAoaS5lLgogICogYmVjYXVzZSBpdCBpcyBhbiBpbnZhbGlkIGFkZHJlc3MpLgogICovCi1pbnQgaW92X2l0ZXJfZmF1bHRfaW5fbXVsdGlwYWdlc19yZWFkYWJsZShzdHJ1Y3QgaW92X2l0ZXIgKmksIHNpemVfdCBieXRlcykKK2ludCBpb3ZfaXRlcl9mYXVsdF9pbl9yZWFkYWJsZShzdHJ1Y3QgaW92X2l0ZXIgKmksIHNpemVfdCBieXRlcykKIHsKIAlzaXplX3Qgc2tpcCA9IGktPmlvdl9vZmZzZXQ7CiAJY29uc3Qgc3RydWN0IGlvdmVjICppb3Y7CkBAIC0zMzQsNyArMzE0LDcgQEAKIAl9CiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKGlvdl9pdGVyX2ZhdWx0X2luX211bHRpcGFnZXNfcmVhZGFibGUpOworRVhQT1JUX1NZTUJPTChpb3ZfaXRlcl9mYXVsdF9pbl9yZWFkYWJsZSk7CiAKIHZvaWQgaW92X2l0ZXJfaW5pdChzdHJ1Y3QgaW92X2l0ZXIgKmksIGludCBkaXJlY3Rpb24sCiAJCQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgdW5zaWduZWQgbG9uZyBucl9zZWdzLApkaWZmIC0tZ2l0IGEvbGliL2lycV9wb2xsLmMgYi9saWIvaXJxX3BvbGwuYwppbmRleCA4MzZmN2RiLi4yYmU1NTY5IDEwMDY0NAotLS0gYS9saWIvaXJxX3BvbGwuYworKysgYi9saWIvaXJxX3BvbGwuYwpAQCAtMTg0LDMwICsxODQsMjEgQEAKIH0KIEVYUE9SVF9TWU1CT0woaXJxX3BvbGxfaW5pdCk7CiAKLXN0YXRpYyBpbnQgaXJxX3BvbGxfY3B1X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCi0JCQkJIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQorc3RhdGljIGludCBpcnFfcG9sbF9jcHVfZGVhZCh1bnNpZ25lZCBpbnQgY3B1KQogewogCS8qCiAJICogSWYgYSBDUFUgZ29lcyBhd2F5LCBzcGxpY2UgaXRzIGVudHJpZXMgdG8gdGhlIGN1cnJlbnQgQ1BVCiAJICogYW5kIHRyaWdnZXIgYSBydW4gb2YgdGhlIHNvZnRpcnEKIAkgKi8KLQlpZiAoYWN0aW9uID09IENQVV9ERUFEIHx8IGFjdGlvbiA9PSBDUFVfREVBRF9GUk9aRU4pIHsKLQkJaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKSBoY3B1OworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJbGlzdF9zcGxpY2VfaW5pdCgmcGVyX2NwdShibGtfY3B1X2lvcG9sbCwgY3B1KSwKKwkJCSB0aGlzX2NwdV9wdHIoJmJsa19jcHVfaW9wb2xsKSk7CisJX19yYWlzZV9zb2Z0aXJxX2lycW9mZihJUlFfUE9MTF9TT0ZUSVJRKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKLQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQkJbGlzdF9zcGxpY2VfaW5pdCgmcGVyX2NwdShibGtfY3B1X2lvcG9sbCwgY3B1KSwKLQkJCQkgdGhpc19jcHVfcHRyKCZibGtfY3B1X2lvcG9sbCkpOwotCQlfX3JhaXNlX3NvZnRpcnFfaXJxb2ZmKElSUV9QT0xMX1NPRlRJUlEpOwotCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JfQotCi0JcmV0dXJuIE5PVElGWV9PSzsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBpcnFfcG9sbF9jcHVfbm90aWZpZXIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwJPSBpcnFfcG9sbF9jcHVfbm90aWZ5LAotfTsKLQogc3RhdGljIF9faW5pdCBpbnQgaXJxX3BvbGxfc2V0dXAodm9pZCkKIHsKIAlpbnQgaTsKQEAgLTIxNiw3ICsyMDcsOCBAQAogCQlJTklUX0xJU1RfSEVBRCgmcGVyX2NwdShibGtfY3B1X2lvcG9sbCwgaSkpOwogCiAJb3Blbl9zb2Z0aXJxKElSUV9QT0xMX1NPRlRJUlEsIGlycV9wb2xsX3NvZnRpcnEpOwotCXJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmaXJxX3BvbGxfY3B1X25vdGlmaWVyKTsKKwljcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX0lSUV9QT0xMX0RFQUQsICJpcnFfcG9sbDpkZWFkIiwgTlVMTCwKKwkJCQkgIGlycV9wb2xsX2NwdV9kZWFkKTsKIAlyZXR1cm4gMDsKIH0KIHN1YnN5c19pbml0Y2FsbChpcnFfcG9sbF9zZXR1cCk7CmRpZmYgLS1naXQgYS9saWIvcmFkaXgtdHJlZS5jIGIvbGliL3JhZGl4LXRyZWUuYwppbmRleCAxYjdiZjczLi44ZTZkNTUyIDEwMDY0NAotLS0gYS9saWIvcmFkaXgtdHJlZS5jCisrKyBiL2xpYi9yYWRpeC10cmVlLmMKQEAgLTEwNSwxMCArMTA1LDEwIEBACiAKICNpZmRlZiBDT05GSUdfUkFESVhfVFJFRV9NVUxUSU9SREVSCiAJaWYgKHJhZGl4X3RyZWVfaXNfaW50ZXJuYWxfbm9kZShlbnRyeSkpIHsKLQkJdW5zaWduZWQgbG9uZyBzaWJvZmYgPSBnZXRfc2xvdF9vZmZzZXQocGFyZW50LCBlbnRyeSk7Ci0JCWlmIChzaWJvZmYgPCBSQURJWF9UUkVFX01BUF9TSVpFKSB7Ci0JCQlvZmZzZXQgPSBzaWJvZmY7Ci0JCQllbnRyeSA9IHJjdV9kZXJlZmVyZW5jZV9yYXcocGFyZW50LT5zbG90c1tvZmZzZXRdKTsKKwkJaWYgKGlzX3NpYmxpbmdfZW50cnkocGFyZW50LCBlbnRyeSkpIHsKKwkJCXZvaWQgKipzaWJlbnRyeSA9ICh2b2lkICoqKSBlbnRyeV90b19ub2RlKGVudHJ5KTsKKwkJCW9mZnNldCA9IGdldF9zbG90X29mZnNldChwYXJlbnQsIHNpYmVudHJ5KTsKKwkJCWVudHJ5ID0gcmN1X2RlcmVmZXJlbmNlX3Jhdygqc2liZW50cnkpOwogCQl9CiAJfQogI2VuZGlmCkBAIC0xNTgzLDE1ICsxNTgzLDEwIEBACiB9CiBFWFBPUlRfU1lNQk9MKHJhZGl4X3RyZWVfZGVsZXRlKTsKIAotc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqcmFkaXhfdHJlZV9yZXBsYWNlX2NsZWFyX3RhZ3MoCi0JCQlzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LAotCQkJdW5zaWduZWQgbG9uZyBpbmRleCwgdm9pZCAqZW50cnkpCit2b2lkIHJhZGl4X3RyZWVfY2xlYXJfdGFncyhzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LAorCQkJICAgc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZSwKKwkJCSAgIHZvaWQgKipzbG90KQogewotCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGU7Ci0Jdm9pZCAqKnNsb3Q7Ci0KLQlfX3JhZGl4X3RyZWVfbG9va3VwKHJvb3QsIGluZGV4LCAmbm9kZSwgJnNsb3QpOwotCiAJaWYgKG5vZGUpIHsKIAkJdW5zaWduZWQgaW50IHRhZywgb2Zmc2V0ID0gZ2V0X3Nsb3Rfb2Zmc2V0KG5vZGUsIHNsb3QpOwogCQlmb3IgKHRhZyA9IDA7IHRhZyA8IFJBRElYX1RSRUVfTUFYX1RBR1M7IHRhZysrKQpAQCAtMTYwMCw5ICsxNTk1LDYgQEAKIAkJLyogQ2xlYXIgcm9vdCBub2RlIHRhZ3MgKi8KIAkJcm9vdC0+Z2ZwX21hc2sgJj0gX19HRlBfQklUU19NQVNLOwogCX0KLQotCXJhZGl4X3RyZWVfcmVwbGFjZV9zbG90KHNsb3QsIGVudHJ5KTsKLQlyZXR1cm4gbm9kZTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9saWIvcmFpZDYvLmdpdGlnbm9yZSBiL2xpYi9yYWlkNi8uZ2l0aWdub3JlCmluZGV4IDBhN2U0OTQuLmYwMWIxY2IgMTAwNjQ0Ci0tLSBhL2xpYi9yYWlkNi8uZ2l0aWdub3JlCisrKyBiL2xpYi9yYWlkNi8uZ2l0aWdub3JlCkBAIC0zLDMgKzMsNCBAQAogaW50Ki5jCiB0YWJsZXMuYwogbmVvbj8uYworczM5MHZ4Py5jCmRpZmYgLS1naXQgYS9saWIvcmFpZDYvTWFrZWZpbGUgYi9saWIvcmFpZDYvTWFrZWZpbGUKaW5kZXggM2IxMGE0OC4uMjlmNTAzZSAxMDA2NDQKLS0tIGEvbGliL3JhaWQ2L01ha2VmaWxlCisrKyBiL2xpYi9yYWlkNi9NYWtlZmlsZQpAQCAtNyw2ICs3LDcgQEAKIHJhaWQ2X3BxLSQoQ09ORklHX0FMVElWRUMpICs9IGFsdGl2ZWMxLm8gYWx0aXZlYzIubyBhbHRpdmVjNC5vIGFsdGl2ZWM4Lm8KIHJhaWQ2X3BxLSQoQ09ORklHX0tFUk5FTF9NT0RFX05FT04pICs9IG5lb24ubyBuZW9uMS5vIG5lb24yLm8gbmVvbjQubyBuZW9uOC5vCiByYWlkNl9wcS0kKENPTkZJR19USUxFR1gpICs9IHRpbGVneDgubworcmFpZDZfcHEtJChDT05GSUdfUzM5MCkgKz0gczM5MHZ4OC5vIHJlY292X3MzOTB4Yy5vCiAKIGhvc3Rwcm9ncy15CSs9IG1rdGFibGVzCiAKQEAgLTExNiw2ICsxMTcsMTEgQEAKICQob2JqKS90aWxlZ3g4LmM6ICAgJChzcmMpL3RpbGVneC51YyAkKHNyYykvdW5yb2xsLmF3ayBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkLHVucm9sbCkKIAordGFyZ2V0cyArPSBzMzkwdng4LmMKKyQob2JqKS9zMzkwdng4LmM6ICAgVU5ST0xMIDo9IDgKKyQob2JqKS9zMzkwdng4LmM6ICAgJChzcmMpL3MzOTB2eC51YyAkKHNyYykvdW5yb2xsLmF3ayBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLHVucm9sbCkKKwogcXVpZXRfY21kX21rdGFibGUgPSBUQUJMRSAgICRACiAgICAgICBjbWRfbWt0YWJsZSA9ICQob2JqKS9ta3RhYmxlcyA+ICRAIHx8ICggcm0gLWYgJEAgJiYgZXhpdCAxICkKIApkaWZmIC0tZ2l0IGEvbGliL3JhaWQ2L2FsZ29zLmMgYi9saWIvcmFpZDYvYWxnb3MuYwppbmRleCA5NzVjNmUwLi41OTJmZjQ5IDEwMDY0NAotLS0gYS9saWIvcmFpZDYvYWxnb3MuYworKysgYi9saWIvcmFpZDYvYWxnb3MuYwpAQCAtNjksNiArNjksOSBAQAogI2lmIGRlZmluZWQoQ09ORklHX1RJTEVHWCkKIAkmcmFpZDZfdGlsZWd4OCwKICNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1MzOTApCisJJnJhaWQ2X3MzOTB2eDgsCisjZW5kaWYKIAkmcmFpZDZfaW50eDEsCiAJJnJhaWQ2X2ludHgyLAogCSZyYWlkNl9pbnR4NCwKQEAgLTk1LDYgKzk4LDkgQEAKICNpZmRlZiBDT05GSUdfQVNfU1NTRTMKIAkmcmFpZDZfcmVjb3Zfc3NzZTMsCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfUzM5MAorCSZyYWlkNl9yZWNvdl9zMzkweGMsCisjZW5kaWYKIAkmcmFpZDZfcmVjb3ZfaW50eDEsCiAJTlVMTAogfTsKZGlmZiAtLWdpdCBhL2xpYi9yYWlkNi9yZWNvdl9zMzkweGMuYyBiL2xpYi9yYWlkNi9yZWNvdl9zMzkweGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDQyZGFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JhaWQ2L3JlY292X3MzOTB4Yy5jCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogUkFJRC02IGRhdGEgcmVjb3ZlcnkgaW4gZHVhbCBmYWlsdXJlIG1vZGUgYmFzZWQgb24gdGhlIFhDIGluc3RydWN0aW9uLgorICoKKyAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAxNgorICogQXV0aG9yKHMpOiBNYXJ0aW4gU2Nod2lkZWZza3kgPHNjaHdpZGVmc2t5QGRlLmlibS5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhaWQvcHEuaD4KKworc3RhdGljIGlubGluZSB2b2lkIHhvcl9ibG9jayh1OCAqcDEsIHU4ICpwMikKK3sKKwl0eXBlZGVmIHN0cnVjdCB7IHU4IF9bMjU2XTsgfSBhZGRydHlwZTsKKworCWFzbSB2b2xhdGlsZSgKKwkJIgl4YwkwKDI1NiwlW3AxXSksMCglW3AyXSlcbiIKKwkJOiAiK20iICgqKGFkZHJ0eXBlICopIHAxKSA6ICJtIiAoKihhZGRydHlwZSAqKSBwMiksCisJCSAgW3AxXSAiYSIgKHAxKSwgW3AyXSAiYSIgKHAyKSA6ICJjYyIpOworfQorCisvKiBSZWNvdmVyIHR3byBmYWlsZWQgZGF0YSBibG9ja3MuICovCitzdGF0aWMgdm9pZCByYWlkNl8yZGF0YV9yZWNvdl9zMzkweGMoaW50IGRpc2tzLCBzaXplX3QgYnl0ZXMsIGludCBmYWlsYSwKKwkJaW50IGZhaWxiLCB2b2lkICoqcHRycykKK3sKKwl1OCAqcCwgKnEsICpkcCwgKmRxOworCWNvbnN0IHU4ICpwYm11bDsJLyogUCBtdWx0aXBsaWVyIHRhYmxlIGZvciBCIGRhdGEgKi8KKwljb25zdCB1OCAqcW11bDsJCS8qIFEgbXVsdGlwbGllciB0YWJsZSAoZm9yIGJvdGgpICovCisJaW50IGk7CisKKwlwID0gKHU4ICopcHRyc1tkaXNrcy0yXTsKKwlxID0gKHU4ICopcHRyc1tkaXNrcy0xXTsKKworCS8qIENvbXB1dGUgc3luZHJvbWUgd2l0aCB6ZXJvIGZvciB0aGUgbWlzc2luZyBkYXRhIHBhZ2VzCisJICAgVXNlIHRoZSBkZWFkIGRhdGEgcGFnZXMgYXMgdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yCisJICAgZGVsdGEgcCBhbmQgZGVsdGEgcSAqLworCWRwID0gKHU4ICopcHRyc1tmYWlsYV07CisJcHRyc1tmYWlsYV0gPSAodm9pZCAqKXJhaWQ2X2VtcHR5X3plcm9fcGFnZTsKKwlwdHJzW2Rpc2tzLTJdID0gZHA7CisJZHEgPSAodTggKilwdHJzW2ZhaWxiXTsKKwlwdHJzW2ZhaWxiXSA9ICh2b2lkICopcmFpZDZfZW1wdHlfemVyb19wYWdlOworCXB0cnNbZGlza3MtMV0gPSBkcTsKKworCXJhaWQ2X2NhbGwuZ2VuX3N5bmRyb21lKGRpc2tzLCBieXRlcywgcHRycyk7CisKKwkvKiBSZXN0b3JlIHBvaW50ZXIgdGFibGUgKi8KKwlwdHJzW2ZhaWxhXSAgID0gZHA7CisJcHRyc1tmYWlsYl0gICA9IGRxOworCXB0cnNbZGlza3MtMl0gPSBwOworCXB0cnNbZGlza3MtMV0gPSBxOworCisJLyogTm93LCBwaWNrIHRoZSBwcm9wZXIgZGF0YSB0YWJsZXMgKi8KKwlwYm11bCA9IHJhaWQ2X2dmbXVsW3JhaWQ2X2dmZXhpW2ZhaWxiLWZhaWxhXV07CisJcW11bCAgPSByYWlkNl9nZm11bFtyYWlkNl9nZmludltyYWlkNl9nZmV4cFtmYWlsYV1ecmFpZDZfZ2ZleHBbZmFpbGJdXV07CisKKwkvKiBOb3cgZG8gaXQuLi4gKi8KKwl3aGlsZSAoYnl0ZXMpIHsKKwkJeG9yX2Jsb2NrKGRwLCBwKTsKKwkJeG9yX2Jsb2NrKGRxLCBxKTsKKwkJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorCQkJZHFbaV0gPSBwYm11bFtkcFtpXV0gXiBxbXVsW2RxW2ldXTsKKwkJeG9yX2Jsb2NrKGRwLCBkcSk7CisJCXAgKz0gMjU2OworCQlxICs9IDI1NjsKKwkJZHAgKz0gMjU2OworCQlkcSArPSAyNTY7CisJCWJ5dGVzIC09IDI1NjsKKwl9Cit9CisKKy8qIFJlY292ZXIgZmFpbHVyZSBvZiBvbmUgZGF0YSBibG9jayBwbHVzIHRoZSBQIGJsb2NrICovCitzdGF0aWMgdm9pZCByYWlkNl9kYXRhcF9yZWNvdl9zMzkweGMoaW50IGRpc2tzLCBzaXplX3QgYnl0ZXMsIGludCBmYWlsYSwKKwkJdm9pZCAqKnB0cnMpCit7CisJdTggKnAsICpxLCAqZHE7CisJY29uc3QgdTggKnFtdWw7CQkvKiBRIG11bHRpcGxpZXIgdGFibGUgKi8KKwlpbnQgaTsKKworCXAgPSAodTggKilwdHJzW2Rpc2tzLTJdOworCXEgPSAodTggKilwdHJzW2Rpc2tzLTFdOworCisJLyogQ29tcHV0ZSBzeW5kcm9tZSB3aXRoIHplcm8gZm9yIHRoZSBtaXNzaW5nIGRhdGEgcGFnZQorCSAgIFVzZSB0aGUgZGVhZCBkYXRhIHBhZ2UgYXMgdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIGRlbHRhIHEgKi8KKwlkcSA9ICh1OCAqKXB0cnNbZmFpbGFdOworCXB0cnNbZmFpbGFdID0gKHZvaWQgKilyYWlkNl9lbXB0eV96ZXJvX3BhZ2U7CisJcHRyc1tkaXNrcy0xXSA9IGRxOworCisJcmFpZDZfY2FsbC5nZW5fc3luZHJvbWUoZGlza3MsIGJ5dGVzLCBwdHJzKTsKKworCS8qIFJlc3RvcmUgcG9pbnRlciB0YWJsZSAqLworCXB0cnNbZmFpbGFdICAgPSBkcTsKKwlwdHJzW2Rpc2tzLTFdID0gcTsKKworCS8qIE5vdywgcGljayB0aGUgcHJvcGVyIGRhdGEgdGFibGVzICovCisJcW11bCAgPSByYWlkNl9nZm11bFtyYWlkNl9nZmludltyYWlkNl9nZmV4cFtmYWlsYV1dXTsKKworCS8qIE5vdyBkbyBpdC4uLiAqLworCXdoaWxlIChieXRlcykgeworCQl4b3JfYmxvY2soZHEsIHEpOworCQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCQlkcVtpXSA9IHFtdWxbZHFbaV1dOworCQl4b3JfYmxvY2socCwgZHEpOworCQlwICs9IDI1NjsKKwkJcSArPSAyNTY7CisJCWRxICs9IDI1NjsKKwkJYnl0ZXMgLT0gMjU2OworCX0KK30KKworCitjb25zdCBzdHJ1Y3QgcmFpZDZfcmVjb3ZfY2FsbHMgcmFpZDZfcmVjb3ZfczM5MHhjID0geworCS5kYXRhMiA9IHJhaWQ2XzJkYXRhX3JlY292X3MzOTB4YywKKwkuZGF0YXAgPSByYWlkNl9kYXRhcF9yZWNvdl9zMzkweGMsCisJLnZhbGlkID0gTlVMTCwKKwkubmFtZSA9ICJzMzkweGMiLAorCS5wcmlvcml0eSA9IDEsCit9OwpkaWZmIC0tZ2l0IGEvbGliL3JhaWQ2L3MzOTB2eC51YyBiL2xpYi9yYWlkNi9zMzkwdngudWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0NTE5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYWlkNi9zMzkwdngudWMKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiByYWlkNl92eCQjLmMKKyAqCisgKiAkIy13YXkgdW5yb2xsZWQgUkFJRDYgZ2VuL3hvciBmdW5jdGlvbnMgZm9yIHMzOTAKKyAqIGJhc2VkIG9uIHRoZSB2ZWN0b3IgZmFjaWxpdHkKKyAqCisgKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMTYKKyAqIEF1dGhvcihzKTogTWFydGluIFNjaHdpZGVmc2t5IDxzY2h3aWRlZnNreUBkZS5pYm0uY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwb3N0cHJvY2Vzc2VkIHVzaW5nIHVucm9sbC5hd2suCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3JhaWQvcHEuaD4KKyNpbmNsdWRlIDxhc20vZnB1L2FwaS5oPgorCithc20oIi5pbmNsdWRlIFwiYXNtL3Z4LWluc24uaFwiXG4iKTsKKworI2RlZmluZSBOU0laRSAxNgorCitzdGF0aWMgaW5saW5lIHZvaWQgTE9BRF9DT05TVCh2b2lkKQoreworCWFzbSB2b2xhdGlsZSgiVlJFUElCICV2MjQsNyIpOworCWFzbSB2b2xhdGlsZSgiVlJFUElCICV2MjUsMHgxZCIpOworfQorCisvKgorICogVGhlIFNITEJZVEUoKSBvcGVyYXRpb24gc2hpZnRzIGVhY2ggb2YgdGhlIDE2IGJ5dGVzIGluCisgKiB2ZWN0b3IgcmVnaXN0ZXIgeSBsZWZ0IGJ5IDEgYml0IGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbgorICogdmVjdG9yIHJlZ2lzdGVyIHguCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBTSExCWVRFKGludCB4LCBpbnQgeSkKK3sKKwlhc20gdm9sYXRpbGUgKCJWQUIgJTAsJTEsJTEiIDogOiAiaSIgKHgpLCAiaSIgKHkpKTsKK30KKworLyoKKyAqIEZvciBlYWNoIG9mIHRoZSAxNiBieXRlcyBpbiB0aGUgdmVjdG9yIHJlZ2lzdGVyIHkgdGhlIE1BU0soKQorICogb3BlcmF0aW9uIHJldHVybnMgMHhGRiBpZiB0aGUgaGlnaCBiaXQgb2YgdGhlIGJ5dGUgaXMgMSwKKyAqIG9yIDB4MDAgaWYgdGhlIGhpZ2ggYml0IGlzIDAuIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIHZlY3RvcgorICogcmVnaXN0ZXIgeC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIE1BU0soaW50IHgsIGludCB5KQoreworCWFzbSB2b2xhdGlsZSAoIlZFU1JBVkIJJTAsJTEsMjQiIDogOiAiaSIgKHgpLCAiaSIgKHkpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIEFORChpbnQgeCwgaW50IHksIGludCB6KQoreworCWFzbSB2b2xhdGlsZSAoIlZOICUwLCUxLCUyIiA6IDogImkiICh4KSwgImkiICh5KSwgImkiICh6KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBYT1IoaW50IHgsIGludCB5LCBpbnQgeikKK3sKKwlhc20gdm9sYXRpbGUgKCJWWCAlMCwlMSwlMiIgOiA6ICJpIiAoeCksICJpIiAoeSksICJpIiAoeikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgTE9BRF9EQVRBKGludCB4LCBpbnQgbiwgdTggKnB0cikKK3sKKwl0eXBlZGVmIHN0cnVjdCB7IHU4IF9bMTYqbl07IH0gYWRkcnR5cGU7CisJcmVnaXN0ZXIgYWRkcnR5cGUgKl9fcHRyIGFzbSgiMSIpID0gKGFkZHJ0eXBlICopIHB0cjsKKworCWFzbSB2b2xhdGlsZSAoIlZMTSAlMiwlMywwLCVyMSIKKwkJICAgICAgOiA6ICJtIiAoKl9fcHRyKSwgImEiIChfX3B0ciksICJpIiAoeCksICJpIiAoeCArIG4gLSAxKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBTVE9SRV9EQVRBKGludCB4LCBpbnQgbiwgdTggKnB0cikKK3sKKwl0eXBlZGVmIHN0cnVjdCB7IHU4IF9bMTYqbl07IH0gYWRkcnR5cGU7CisJcmVnaXN0ZXIgYWRkcnR5cGUgKl9fcHRyIGFzbSgiMSIpID0gKGFkZHJ0eXBlICopIHB0cjsKKworCWFzbSB2b2xhdGlsZSAoIlZTVE0gJTIsJTMsMCwxIgorCQkgICAgICA6ICI9bSIgKCpfX3B0cikgOiAiYSIgKF9fcHRyKSwgImkiICh4KSwgImkiICh4ICsgbiAtIDEpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIENPUFlfVkVDKGludCB4LCBpbnQgeSkKK3sKKwlhc20gdm9sYXRpbGUgKCJWTFIgJTAsJTEiIDogOiAiaSIgKHgpLCAiaSIgKHkpKTsKK30KKworc3RhdGljIHZvaWQgcmFpZDZfczM5MHZ4JCNfZ2VuX3N5bmRyb21lKGludCBkaXNrcywgc2l6ZV90IGJ5dGVzLCB2b2lkICoqcHRycykKK3sKKwlzdHJ1Y3Qga2VybmVsX2ZwdSB2eHN0YXRlOworCXU4ICoqZHB0ciwgKnAsICpxOworCWludCBkLCB6LCB6MDsKKworCWtlcm5lbF9mcHVfYmVnaW4oJnZ4c3RhdGUsIEtFUk5FTF9WWFIpOworCUxPQURfQ09OU1QoKTsKKworCWRwdHIgPSAodTggKiopIHB0cnM7CisJejAgPSBkaXNrcyAtIDM7CQkvKiBIaWdoZXN0IGRhdGEgZGlzayAqLworCXAgPSBkcHRyW3owICsgMV07CS8qIFhPUiBwYXJpdHkgKi8KKwlxID0gZHB0clt6MCArIDJdOwkvKiBSUyBzeW5kcm9tZSAqLworCisJZm9yIChkID0gMDsgZCA8IGJ5dGVzOyBkICs9ICQjKk5TSVpFKSB7CisJCUxPQURfREFUQSgwLCQjLCZkcHRyW3owXVtkXSk7CisJCUNPUFlfVkVDKDgrJCQsMCskJCk7CisJCWZvciAoeiA9IHowIC0gMTsgeiA+PSAwOyB6LS0pIHsKKwkJCU1BU0soMTYrJCQsOCskJCk7CisJCQlBTkQoMTYrJCQsMTYrJCQsMjUpOworCQkJU0hMQllURSg4KyQkLDgrJCQpOworCQkJWE9SKDgrJCQsOCskJCwxNiskJCk7CisJCQlMT0FEX0RBVEEoMTYsJCMsJmRwdHJbel1bZF0pOworCQkJWE9SKDArJCQsMCskJCwxNiskJCk7CisJCQlYT1IoOCskJCw4KyQkLDE2KyQkKTsKKwkJfQorCQlTVE9SRV9EQVRBKDAsJCMsJnBbZF0pOworCQlTVE9SRV9EQVRBKDgsJCMsJnFbZF0pOworCX0KKwlrZXJuZWxfZnB1X2VuZCgmdnhzdGF0ZSwgS0VSTkVMX1ZYUik7Cit9CisKK3N0YXRpYyB2b2lkIHJhaWQ2X3MzOTB2eCQjX3hvcl9zeW5kcm9tZShpbnQgZGlza3MsIGludCBzdGFydCwgaW50IHN0b3AsCisJCQkJCXNpemVfdCBieXRlcywgdm9pZCAqKnB0cnMpCit7CisJc3RydWN0IGtlcm5lbF9mcHUgdnhzdGF0ZTsKKwl1OCAqKmRwdHIsICpwLCAqcTsKKwlpbnQgZCwgeiwgejA7CisKKwlkcHRyID0gKHU4ICoqKSBwdHJzOworCXowID0gc3RvcDsJCS8qIFAvUSByaWdodCBzaWRlIG9wdGltaXphdGlvbiAqLworCXAgPSBkcHRyW2Rpc2tzIC0gMl07CS8qIFhPUiBwYXJpdHkgKi8KKwlxID0gZHB0cltkaXNrcyAtIDFdOwkvKiBSUyBzeW5kcm9tZSAqLworCisJa2VybmVsX2ZwdV9iZWdpbigmdnhzdGF0ZSwgS0VSTkVMX1ZYUik7CisJTE9BRF9DT05TVCgpOworCisJZm9yIChkID0gMDsgZCA8IGJ5dGVzOyBkICs9ICQjKk5TSVpFKSB7CisJCS8qIFAvUSBkYXRhIHBhZ2VzICovCisJCUxPQURfREFUQSgwLCQjLCZkcHRyW3owXVtkXSk7CisJCUNPUFlfVkVDKDgrJCQsMCskJCk7CisJCWZvciAoeiA9IHowIC0gMTsgeiA+PSBzdGFydDsgei0tKSB7CisJCQlNQVNLKDE2KyQkLDgrJCQpOworCQkJQU5EKDE2KyQkLDE2KyQkLDI1KTsKKwkJCVNITEJZVEUoOCskJCw4KyQkKTsKKwkJCVhPUig4KyQkLDgrJCQsMTYrJCQpOworCQkJTE9BRF9EQVRBKDE2LCQjLCZkcHRyW3pdW2RdKTsKKwkJCVhPUigwKyQkLDArJCQsMTYrJCQpOworCQkJWE9SKDgrJCQsOCskJCwxNiskJCk7CisJCX0KKwkJLyogUC9RIGxlZnQgc2lkZSBvcHRpbWl6YXRpb24gKi8KKwkJZm9yICh6ID0gc3RhcnQgLSAxOyB6ID49IDA7IHotLSkgeworCQkJTUFTSygxNiskJCw4KyQkKTsKKwkJCUFORCgxNiskJCwxNiskJCwyNSk7CisJCQlTSExCWVRFKDgrJCQsOCskJCk7CisJCQlYT1IoOCskJCw4KyQkLDE2KyQkKTsKKwkJfQorCQlMT0FEX0RBVEEoMTYsJCMsJnBbZF0pOworCQlYT1IoMTYrJCQsMTYrJCQsMCskJCk7CisJCVNUT1JFX0RBVEEoMTYsJCMsJnBbZF0pOworCQlMT0FEX0RBVEEoMTYsJCMsJnFbZF0pOworCQlYT1IoMTYrJCQsMTYrJCQsOCskJCk7CisJCVNUT1JFX0RBVEEoMTYsJCMsJnFbZF0pOworCX0KKwlrZXJuZWxfZnB1X2VuZCgmdnhzdGF0ZSwgS0VSTkVMX1ZYUik7Cit9CisKK3N0YXRpYyBpbnQgcmFpZDZfczM5MHZ4JCNfdmFsaWQodm9pZCkKK3sKKwlyZXR1cm4gTUFDSElORV9IQVNfVlg7Cit9CisKK2NvbnN0IHN0cnVjdCByYWlkNl9jYWxscyByYWlkNl9zMzkwdngkIyA9IHsKKwlyYWlkNl9zMzkwdngkI19nZW5fc3luZHJvbWUsCisJcmFpZDZfczM5MHZ4JCNfeG9yX3N5bmRyb21lLAorCXJhaWQ2X3MzOTB2eCQjX3ZhbGlkLAorCSJ2eDEyOHgkIyIsCisJMQorfTsKZGlmZiAtLWdpdCBhL2xpYi9yYW5kb20zMi5jIGIvbGliL3JhbmRvbTMyLmMKaW5kZXggNjllZDU5My4uOTE1OTgyYiAxMDA2NDQKLS0tIGEvbGliL3JhbmRvbTMyLmMKKysrIGIvbGliL3JhbmRvbTMyLmMKQEAgLTgxLDcgKzgxLDcgQEAKIAl1MzIgcmVzOwogCiAJcmVzID0gcHJhbmRvbV91MzJfc3RhdGUoc3RhdGUpOwotCXB1dF9jcHVfdmFyKHN0YXRlKTsKKwlwdXRfY3B1X3ZhcihuZXRfcmFuZF9zdGF0ZSk7CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMTI4LDcgKzEyOCw3IEBACiAJc3RydWN0IHJuZF9zdGF0ZSAqc3RhdGUgPSAmZ2V0X2NwdV92YXIobmV0X3JhbmRfc3RhdGUpOwogCiAJcHJhbmRvbV9ieXRlc19zdGF0ZShzdGF0ZSwgYnVmLCBieXRlcyk7Ci0JcHV0X2NwdV92YXIoc3RhdGUpOworCXB1dF9jcHVfdmFyKG5ldF9yYW5kX3N0YXRlKTsKIH0KIEVYUE9SVF9TWU1CT0wocHJhbmRvbV9ieXRlcyk7CiAKZGlmZiAtLWdpdCBhL2xpYi9yaGFzaHRhYmxlLmMgYi9saWIvcmhhc2h0YWJsZS5jCmluZGV4IDVkODQ1ZmYuLjMyZDBhZDAgMTAwNjQ0Ci0tLSBhL2xpYi9yaGFzaHRhYmxlLmMKKysrIGIvbGliL3JoYXNodGFibGUuYwpAQCAtMzAsNyArMzAsNyBAQAogCiAjZGVmaW5lIEhBU0hfREVGQVVMVF9TSVpFCTY0VUwKICNkZWZpbmUgSEFTSF9NSU5fU0laRQkJNFUKLSNkZWZpbmUgQlVDS0VUX0xPQ0tTX1BFUl9DUFUgICAxMjhVTAorI2RlZmluZSBCVUNLRVRfTE9DS1NfUEVSX0NQVQkzMlVMCiAKIHN0YXRpYyB1MzIgaGVhZF9oYXNoZm4oc3RydWN0IHJoYXNodGFibGUgKmh0LAogCQkgICAgICAgY29uc3Qgc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsLApAQCAtNzAsMjEgKzcwLDI1IEBACiAJdW5zaWduZWQgaW50IG5yX3BjcHVzID0gbnVtX3Bvc3NpYmxlX2NwdXMoKTsKICNlbmRpZgogCi0JbnJfcGNwdXMgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIG5yX3BjcHVzLCAzMlVMKTsKKwlucl9wY3B1cyA9IG1pbl90KHVuc2lnbmVkIGludCwgbnJfcGNwdXMsIDY0VUwpOwogCXNpemUgPSByb3VuZHVwX3Bvd19vZl90d28obnJfcGNwdXMgKiBodC0+cC5sb2Nrc19tdWwpOwogCiAJLyogTmV2ZXIgYWxsb2NhdGUgbW9yZSB0aGFuIDAuNSBsb2NrcyBwZXIgYnVja2V0ICovCiAJc2l6ZSA9IG1pbl90KHVuc2lnbmVkIGludCwgc2l6ZSwgdGJsLT5zaXplID4+IDEpOwogCiAJaWYgKHNpemVvZihzcGlubG9ja190KSAhPSAwKSB7CisJCXRibC0+bG9ja3MgPSBOVUxMOwogI2lmZGVmIENPTkZJR19OVU1BCiAJCWlmIChzaXplICogc2l6ZW9mKHNwaW5sb2NrX3QpID4gUEFHRV9TSVpFICYmCiAJCSAgICBnZnAgPT0gR0ZQX0tFUk5FTCkKIAkJCXRibC0+bG9ja3MgPSB2bWFsbG9jKHNpemUgKiBzaXplb2Yoc3BpbmxvY2tfdCkpOwotCQllbHNlCiAjZW5kaWYKLQkJdGJsLT5sb2NrcyA9IGttYWxsb2NfYXJyYXkoc2l6ZSwgc2l6ZW9mKHNwaW5sb2NrX3QpLAotCQkJCQkgICBnZnApOworCQlpZiAoZ2ZwICE9IEdGUF9LRVJORUwpCisJCQlnZnAgfD0gX19HRlBfTk9XQVJOIHwgX19HRlBfTk9SRVRSWTsKKworCQlpZiAoIXRibC0+bG9ja3MpCisJCQl0YmwtPmxvY2tzID0ga21hbGxvY19hcnJheShzaXplLCBzaXplb2Yoc3BpbmxvY2tfdCksCisJCQkJCQkgICBnZnApOwogCQlpZiAoIXRibC0+bG9ja3MpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKQEAgLTMyMSwxMiArMzI1LDE0IEBACiBzdGF0aWMgaW50IHJoYXNodGFibGVfc2hyaW5rKHN0cnVjdCByaGFzaHRhYmxlICpodCkKIHsKIAlzdHJ1Y3QgYnVja2V0X3RhYmxlICpuZXdfdGJsLCAqb2xkX3RibCA9IHJodF9kZXJlZmVyZW5jZShodC0+dGJsLCBodCk7Ci0JdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgaW50IG5lbGVtcyA9IGF0b21pY19yZWFkKCZodC0+bmVsZW1zKTsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IDA7CiAJaW50IGVycjsKIAogCUFTU0VSVF9SSFRfTVVURVgoaHQpOwogCi0Jc2l6ZSA9IHJvdW5kdXBfcG93X29mX3R3byhhdG9taWNfcmVhZCgmaHQtPm5lbGVtcykgKiAzIC8gMik7CisJaWYgKG5lbGVtcykKKwkJc2l6ZSA9IHJvdW5kdXBfcG93X29mX3R3byhuZWxlbXMgKiAzIC8gMik7CiAJaWYgKHNpemUgPCBodC0+cC5taW5fc2l6ZSkKIAkJc2l6ZSA9IGh0LT5wLm1pbl9zaXplOwogCkBAIC0zNzIsMjIgKzM3OCw4IEBACiAJCXNjaGVkdWxlX3dvcmsoJmh0LT5ydW5fd29yayk7CiB9CiAKLXN0YXRpYyBib29sIHJoYXNodGFibGVfY2hlY2tfZWxhc3RpY2l0eShzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCi0JCQkJCXN0cnVjdCBidWNrZXRfdGFibGUgKnRibCwKLQkJCQkJdW5zaWduZWQgaW50IGhhc2gpCi17Ci0JdW5zaWduZWQgaW50IGVsYXN0aWNpdHkgPSBodC0+ZWxhc3RpY2l0eTsKLQlzdHJ1Y3Qgcmhhc2hfaGVhZCAqaGVhZDsKLQotCXJodF9mb3JfZWFjaChoZWFkLCB0YmwsIGhhc2gpCi0JCWlmICghLS1lbGFzdGljaXR5KQotCQkJcmV0dXJuIHRydWU7Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLWludCByaGFzaHRhYmxlX2luc2VydF9yZWhhc2goc3RydWN0IHJoYXNodGFibGUgKmh0LAotCQkJICAgICBzdHJ1Y3QgYnVja2V0X3RhYmxlICp0YmwpCitzdGF0aWMgaW50IHJoYXNodGFibGVfaW5zZXJ0X3JlaGFzaChzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCisJCQkJICAgIHN0cnVjdCBidWNrZXRfdGFibGUgKnRibCkKIHsKIAlzdHJ1Y3QgYnVja2V0X3RhYmxlICpvbGRfdGJsOwogCXN0cnVjdCBidWNrZXRfdGFibGUgKm5ld190Ymw7CkBAIC00MzMsNjEgKzQyNSwxNzIgQEAKIAogCXJldHVybiBlcnI7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChyaGFzaHRhYmxlX2luc2VydF9yZWhhc2gpOwogCi1zdHJ1Y3QgYnVja2V0X3RhYmxlICpyaGFzaHRhYmxlX2luc2VydF9zbG93KHN0cnVjdCByaGFzaHRhYmxlICpodCwKLQkJCQkJICAgIGNvbnN0IHZvaWQgKmtleSwKLQkJCQkJICAgIHN0cnVjdCByaGFzaF9oZWFkICpvYmosCi0JCQkJCSAgICBzdHJ1Y3QgYnVja2V0X3RhYmxlICp0YmwpCitzdGF0aWMgdm9pZCAqcmhhc2h0YWJsZV9sb29rdXBfb25lKHN0cnVjdCByaGFzaHRhYmxlICpodCwKKwkJCQkgICBzdHJ1Y3QgYnVja2V0X3RhYmxlICp0YmwsIHVuc2lnbmVkIGludCBoYXNoLAorCQkJCSAgIGNvbnN0IHZvaWQgKmtleSwgc3RydWN0IHJoYXNoX2hlYWQgKm9iaikKIHsKKwlzdHJ1Y3Qgcmhhc2h0YWJsZV9jb21wYXJlX2FyZyBhcmcgPSB7CisJCS5odCA9IGh0LAorCQkua2V5ID0ga2V5LAorCX07CisJc3RydWN0IHJoYXNoX2hlYWQgX19yY3UgKipwcHJldjsKIAlzdHJ1Y3Qgcmhhc2hfaGVhZCAqaGVhZDsKLQl1bnNpZ25lZCBpbnQgaGFzaDsKLQlpbnQgZXJyOworCWludCBlbGFzdGljaXR5OwogCi0JdGJsID0gcmhhc2h0YWJsZV9sYXN0X3RhYmxlKGh0LCB0YmwpOwotCWhhc2ggPSBoZWFkX2hhc2hmbihodCwgdGJsLCBvYmopOwotCXNwaW5fbG9ja19uZXN0ZWQocmh0X2J1Y2tldF9sb2NrKHRibCwgaGFzaCksIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKKwllbGFzdGljaXR5ID0gaHQtPmVsYXN0aWNpdHk7CisJcHByZXYgPSAmdGJsLT5idWNrZXRzW2hhc2hdOworCXJodF9mb3JfZWFjaChoZWFkLCB0YmwsIGhhc2gpIHsKKwkJc3RydWN0IHJobGlzdF9oZWFkICpsaXN0OworCQlzdHJ1Y3QgcmhsaXN0X2hlYWQgKnBsaXN0OwogCi0JZXJyID0gLUVFWElTVDsKLQlpZiAoa2V5ICYmIHJoYXNodGFibGVfbG9va3VwX2Zhc3QoaHQsIGtleSwgaHQtPnApKQotCQlnb3RvIGV4aXQ7CisJCWVsYXN0aWNpdHktLTsKKwkJaWYgKCFrZXkgfHwKKwkJICAgIChodC0+cC5vYmpfY21wZm4gPworCQkgICAgIGh0LT5wLm9ial9jbXBmbigmYXJnLCByaHRfb2JqKGh0LCBoZWFkKSkgOgorCQkgICAgIHJoYXNodGFibGVfY29tcGFyZSgmYXJnLCByaHRfb2JqKGh0LCBoZWFkKSkpKQorCQkJY29udGludWU7CiAKLQllcnIgPSAtRTJCSUc7CisJCWlmICghaHQtPnJobGlzdCkKKwkJCXJldHVybiByaHRfb2JqKGh0LCBoZWFkKTsKKworCQlsaXN0ID0gY29udGFpbmVyX29mKG9iaiwgc3RydWN0IHJobGlzdF9oZWFkLCByaGVhZCk7CisJCXBsaXN0ID0gY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCByaGxpc3RfaGVhZCwgcmhlYWQpOworCisJCVJDVV9JTklUX1BPSU5URVIobGlzdC0+bmV4dCwgcGxpc3QpOworCQloZWFkID0gcmh0X2RlcmVmZXJlbmNlX2J1Y2tldChoZWFkLT5uZXh0LCB0YmwsIGhhc2gpOworCQlSQ1VfSU5JVF9QT0lOVEVSKGxpc3QtPnJoZWFkLm5leHQsIGhlYWQpOworCQlyY3VfYXNzaWduX3BvaW50ZXIoKnBwcmV2LCBvYmopOworCisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChlbGFzdGljaXR5IDw9IDApCisJCXJldHVybiBFUlJfUFRSKC1FQUdBSU4pOworCisJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVja2V0X3RhYmxlICpyaGFzaHRhYmxlX2luc2VydF9vbmUoc3RydWN0IHJoYXNodGFibGUgKmh0LAorCQkJCQkJICBzdHJ1Y3QgYnVja2V0X3RhYmxlICp0YmwsCisJCQkJCQkgIHVuc2lnbmVkIGludCBoYXNoLAorCQkJCQkJICBzdHJ1Y3Qgcmhhc2hfaGVhZCAqb2JqLAorCQkJCQkJICB2b2lkICpkYXRhKQoreworCXN0cnVjdCBidWNrZXRfdGFibGUgKm5ld190Ymw7CisJc3RydWN0IHJoYXNoX2hlYWQgKmhlYWQ7CisKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKGRhdGEpKQorCQlyZXR1cm4gRVJSX1BUUigtRUVYSVNUKTsKKworCWlmIChQVFJfRVJSKGRhdGEpICE9IC1FQUdBSU4gJiYgUFRSX0VSUihkYXRhKSAhPSAtRU5PRU5UKQorCQlyZXR1cm4gRVJSX0NBU1QoZGF0YSk7CisKKwluZXdfdGJsID0gcmN1X2RlcmVmZXJlbmNlKHRibC0+ZnV0dXJlX3RibCk7CisJaWYgKG5ld190YmwpCisJCXJldHVybiBuZXdfdGJsOworCisJaWYgKFBUUl9FUlIoZGF0YSkgIT0gLUVOT0VOVCkKKwkJcmV0dXJuIEVSUl9DQVNUKGRhdGEpOworCiAJaWYgKHVubGlrZWx5KHJodF9ncm93X2Fib3ZlX21heChodCwgdGJsKSkpCi0JCWdvdG8gZXhpdDsKKwkJcmV0dXJuIEVSUl9QVFIoLUUyQklHKTsKIAotCWVyciA9IC1FQUdBSU47Ci0JaWYgKHJoYXNodGFibGVfY2hlY2tfZWxhc3RpY2l0eShodCwgdGJsLCBoYXNoKSB8fAotCSAgICByaHRfZ3Jvd19hYm92ZV8xMDAoaHQsIHRibCkpCi0JCWdvdG8gZXhpdDsKLQotCWVyciA9IDA7CisJaWYgKHVubGlrZWx5KHJodF9ncm93X2Fib3ZlXzEwMChodCwgdGJsKSkpCisJCXJldHVybiBFUlJfUFRSKC1FQUdBSU4pOwogCiAJaGVhZCA9IHJodF9kZXJlZmVyZW5jZV9idWNrZXQodGJsLT5idWNrZXRzW2hhc2hdLCB0YmwsIGhhc2gpOwogCiAJUkNVX0lOSVRfUE9JTlRFUihvYmotPm5leHQsIGhlYWQpOworCWlmIChodC0+cmhsaXN0KSB7CisJCXN0cnVjdCByaGxpc3RfaGVhZCAqbGlzdDsKKworCQlsaXN0ID0gY29udGFpbmVyX29mKG9iaiwgc3RydWN0IHJobGlzdF9oZWFkLCByaGVhZCk7CisJCVJDVV9JTklUX1BPSU5URVIobGlzdC0+bmV4dCwgTlVMTCk7CisJfQogCiAJcmN1X2Fzc2lnbl9wb2ludGVyKHRibC0+YnVja2V0c1toYXNoXSwgb2JqKTsKIAogCWF0b21pY19pbmMoJmh0LT5uZWxlbXMpOworCWlmIChyaHRfZ3Jvd19hYm92ZV83NShodCwgdGJsKSkKKwkJc2NoZWR1bGVfd29yaygmaHQtPnJ1bl93b3JrKTsKIAotZXhpdDoKLQlzcGluX3VubG9jayhyaHRfYnVja2V0X2xvY2sodGJsLCBoYXNoKSk7CisJcmV0dXJuIE5VTEw7Cit9CiAKLQlpZiAoZXJyID09IDApCi0JCXJldHVybiBOVUxMOwotCWVsc2UgaWYgKGVyciA9PSAtRUFHQUlOKQotCQlyZXR1cm4gdGJsOwotCWVsc2UKLQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK3N0YXRpYyB2b2lkICpyaGFzaHRhYmxlX3RyeV9pbnNlcnQoc3RydWN0IHJoYXNodGFibGUgKmh0LCBjb25zdCB2b2lkICprZXksCisJCQkJICAgc3RydWN0IHJoYXNoX2hlYWQgKm9iaikKK3sKKwlzdHJ1Y3QgYnVja2V0X3RhYmxlICpuZXdfdGJsOworCXN0cnVjdCBidWNrZXRfdGFibGUgKnRibDsKKwl1bnNpZ25lZCBpbnQgaGFzaDsKKwlzcGlubG9ja190ICpsb2NrOworCXZvaWQgKmRhdGE7CisKKwl0YmwgPSByY3VfZGVyZWZlcmVuY2UoaHQtPnRibCk7CisKKwkvKiBBbGwgaW5zZXJ0aW9ucyBtdXN0IGdyYWIgdGhlIG9sZGVzdCB0YWJsZSBjb250YWluaW5nCisJICogdGhlIGhhc2hlZCBidWNrZXQgdGhhdCBpcyB5ZXQgdG8gYmUgcmVoYXNoZWQuCisJICovCisJZm9yICg7OykgeworCQloYXNoID0gcmh0X2hlYWRfaGFzaGZuKGh0LCB0YmwsIG9iaiwgaHQtPnApOworCQlsb2NrID0gcmh0X2J1Y2tldF9sb2NrKHRibCwgaGFzaCk7CisJCXNwaW5fbG9ja19iaChsb2NrKTsKKworCQlpZiAodGJsLT5yZWhhc2ggPD0gaGFzaCkKKwkJCWJyZWFrOworCisJCXNwaW5fdW5sb2NrX2JoKGxvY2spOworCQl0YmwgPSByY3VfZGVyZWZlcmVuY2UodGJsLT5mdXR1cmVfdGJsKTsKKwl9CisKKwlkYXRhID0gcmhhc2h0YWJsZV9sb29rdXBfb25lKGh0LCB0YmwsIGhhc2gsIGtleSwgb2JqKTsKKwluZXdfdGJsID0gcmhhc2h0YWJsZV9pbnNlcnRfb25lKGh0LCB0YmwsIGhhc2gsIG9iaiwgZGF0YSk7CisJaWYgKFBUUl9FUlIobmV3X3RibCkgIT0gLUVFWElTVCkKKwkJZGF0YSA9IEVSUl9DQVNUKG5ld190YmwpOworCisJd2hpbGUgKCFJU19FUlJfT1JfTlVMTChuZXdfdGJsKSkgeworCQl0YmwgPSBuZXdfdGJsOworCQloYXNoID0gcmh0X2hlYWRfaGFzaGZuKGh0LCB0YmwsIG9iaiwgaHQtPnApOworCQlzcGluX2xvY2tfbmVzdGVkKHJodF9idWNrZXRfbG9jayh0YmwsIGhhc2gpLAorCQkJCSBTSU5HTEVfREVQVEhfTkVTVElORyk7CisKKwkJZGF0YSA9IHJoYXNodGFibGVfbG9va3VwX29uZShodCwgdGJsLCBoYXNoLCBrZXksIG9iaik7CisJCW5ld190YmwgPSByaGFzaHRhYmxlX2luc2VydF9vbmUoaHQsIHRibCwgaGFzaCwgb2JqLCBkYXRhKTsKKwkJaWYgKFBUUl9FUlIobmV3X3RibCkgIT0gLUVFWElTVCkKKwkJCWRhdGEgPSBFUlJfQ0FTVChuZXdfdGJsKTsKKworCQlzcGluX3VubG9jayhyaHRfYnVja2V0X2xvY2sodGJsLCBoYXNoKSk7CisJfQorCisJc3Bpbl91bmxvY2tfYmgobG9jayk7CisKKwlpZiAoUFRSX0VSUihkYXRhKSA9PSAtRUFHQUlOKQorCQlkYXRhID0gRVJSX1BUUihyaGFzaHRhYmxlX2luc2VydF9yZWhhc2goaHQsIHRibCkgPzoKKwkJCSAgICAgICAtRUFHQUlOKTsKKworCXJldHVybiBkYXRhOworfQorCit2b2lkICpyaGFzaHRhYmxlX2luc2VydF9zbG93KHN0cnVjdCByaGFzaHRhYmxlICpodCwgY29uc3Qgdm9pZCAqa2V5LAorCQkJICAgICBzdHJ1Y3Qgcmhhc2hfaGVhZCAqb2JqKQoreworCXZvaWQgKmRhdGE7CisKKwlkbyB7CisJCXJjdV9yZWFkX2xvY2soKTsKKwkJZGF0YSA9IHJoYXNodGFibGVfdHJ5X2luc2VydChodCwga2V5LCBvYmopOworCQlyY3VfcmVhZF91bmxvY2soKTsKKwl9IHdoaWxlIChQVFJfRVJSKGRhdGEpID09IC1FQUdBSU4pOworCisJcmV0dXJuIGRhdGE7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyaGFzaHRhYmxlX2luc2VydF9zbG93KTsKIAogLyoqCi0gKiByaGFzaHRhYmxlX3dhbGtfaW5pdCAtIEluaXRpYWxpc2UgYW4gaXRlcmF0b3IKKyAqIHJoYXNodGFibGVfd2Fsa19lbnRlciAtIEluaXRpYWxpc2UgYW4gaXRlcmF0b3IKICAqIEBodDoJCVRhYmxlIHRvIHdhbGsgb3ZlcgogICogQGl0ZXI6CUhhc2ggdGFibGUgSXRlcmF0b3IKLSAqIEBnZnA6CUdGUCBmbGFncyBmb3IgYWxsb2NhdGlvbnMKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIGEgaGFzaCB0YWJsZSB3YWxrLgogICoKQEAgLTUwMiwzMCArNjA1LDIyIEBACiAgKiBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcCBzbyB5b3UgbXVzdCBub3QgY2FsbCBpdCBmcm9tIGludGVycnVwdAogICogY29udGV4dCBvciB3aXRoIHNwaW4gbG9ja3MgaGVsZC4KICAqCi0gKiBZb3UgbXVzdCBjYWxsIHJoYXNodGFibGVfd2Fsa19leGl0IGlmIHRoaXMgZnVuY3Rpb24gcmV0dXJucwotICogc3VjY2Vzc2Z1bGx5LgorICogWW91IG11c3QgY2FsbCByaGFzaHRhYmxlX3dhbGtfZXhpdCBhZnRlciB0aGlzIGZ1bmN0aW9uIHJldHVybnMuCiAgKi8KLWludCByaGFzaHRhYmxlX3dhbGtfaW5pdChzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIHN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgKml0ZXIsCi0JCQkgZ2ZwX3QgZ2ZwKQordm9pZCByaGFzaHRhYmxlX3dhbGtfZW50ZXIoc3RydWN0IHJoYXNodGFibGUgKmh0LCBzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyICppdGVyKQogewogCWl0ZXItPmh0ID0gaHQ7CiAJaXRlci0+cCA9IE5VTEw7CiAJaXRlci0+c2xvdCA9IDA7CiAJaXRlci0+c2tpcCA9IDA7CiAKLQlpdGVyLT53YWxrZXIgPSBrbWFsbG9jKHNpemVvZigqaXRlci0+d2Fsa2VyKSwgZ2ZwKTsKLQlpZiAoIWl0ZXItPndhbGtlcikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAlzcGluX2xvY2soJmh0LT5sb2NrKTsKLQlpdGVyLT53YWxrZXItPnRibCA9CisJaXRlci0+d2Fsa2VyLnRibCA9CiAJCXJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoaHQtPnRibCwgbG9ja2RlcF9pc19oZWxkKCZodC0+bG9jaykpOwotCWxpc3RfYWRkKCZpdGVyLT53YWxrZXItPmxpc3QsICZpdGVyLT53YWxrZXItPnRibC0+d2Fsa2Vycyk7CisJbGlzdF9hZGQoJml0ZXItPndhbGtlci5saXN0LCAmaXRlci0+d2Fsa2VyLnRibC0+d2Fsa2Vycyk7CiAJc3Bpbl91bmxvY2soJmh0LT5sb2NrKTsKLQotCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTF9HUEwocmhhc2h0YWJsZV93YWxrX2luaXQpOworRVhQT1JUX1NZTUJPTF9HUEwocmhhc2h0YWJsZV93YWxrX2VudGVyKTsKIAogLyoqCiAgKiByaGFzaHRhYmxlX3dhbGtfZXhpdCAtIEZyZWUgYW4gaXRlcmF0b3IKQEAgLTUzNiwxMCArNjMxLDkgQEAKIHZvaWQgcmhhc2h0YWJsZV93YWxrX2V4aXQoc3RydWN0IHJoYXNodGFibGVfaXRlciAqaXRlcikKIHsKIAlzcGluX2xvY2soJml0ZXItPmh0LT5sb2NrKTsKLQlpZiAoaXRlci0+d2Fsa2VyLT50YmwpCi0JCWxpc3RfZGVsKCZpdGVyLT53YWxrZXItPmxpc3QpOworCWlmIChpdGVyLT53YWxrZXIudGJsKQorCQlsaXN0X2RlbCgmaXRlci0+d2Fsa2VyLmxpc3QpOwogCXNwaW5fdW5sb2NrKCZpdGVyLT5odC0+bG9jayk7Ci0Ja2ZyZWUoaXRlci0+d2Fsa2VyKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJoYXNodGFibGVfd2Fsa19leGl0KTsKIApAQCAtNTY1LDEyICs2NTksMTIgQEAKIAlyY3VfcmVhZF9sb2NrKCk7CiAKIAlzcGluX2xvY2soJmh0LT5sb2NrKTsKLQlpZiAoaXRlci0+d2Fsa2VyLT50YmwpCi0JCWxpc3RfZGVsKCZpdGVyLT53YWxrZXItPmxpc3QpOworCWlmIChpdGVyLT53YWxrZXIudGJsKQorCQlsaXN0X2RlbCgmaXRlci0+d2Fsa2VyLmxpc3QpOwogCXNwaW5fdW5sb2NrKCZodC0+bG9jayk7CiAKLQlpZiAoIWl0ZXItPndhbGtlci0+dGJsKSB7Ci0JCWl0ZXItPndhbGtlci0+dGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdShodC0+dGJsLCBodCk7CisJaWYgKCFpdGVyLT53YWxrZXIudGJsKSB7CisJCWl0ZXItPndhbGtlci50YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KGh0LT50YmwsIGh0KTsKIAkJcmV0dXJuIC1FQUdBSU47CiAJfQogCkBAIC01OTIsMTIgKzY4NiwxNyBAQAogICovCiB2b2lkICpyaGFzaHRhYmxlX3dhbGtfbmV4dChzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyICppdGVyKQogewotCXN0cnVjdCBidWNrZXRfdGFibGUgKnRibCA9IGl0ZXItPndhbGtlci0+dGJsOworCXN0cnVjdCBidWNrZXRfdGFibGUgKnRibCA9IGl0ZXItPndhbGtlci50Ymw7CisJc3RydWN0IHJobGlzdF9oZWFkICpsaXN0ID0gaXRlci0+bGlzdDsKIAlzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQgPSBpdGVyLT5odDsKIAlzdHJ1Y3Qgcmhhc2hfaGVhZCAqcCA9IGl0ZXItPnA7CisJYm9vbCByaGxpc3QgPSBodC0+cmhsaXN0OwogCiAJaWYgKHApIHsKLQkJcCA9IHJodF9kZXJlZmVyZW5jZV9idWNrZXRfcmN1KHAtPm5leHQsIHRibCwgaXRlci0+c2xvdCk7CisJCWlmICghcmhsaXN0IHx8ICEobGlzdCA9IHJjdV9kZXJlZmVyZW5jZShsaXN0LT5uZXh0KSkpIHsKKwkJCXAgPSByY3VfZGVyZWZlcmVuY2UocC0+bmV4dCk7CisJCQlsaXN0ID0gY29udGFpbmVyX29mKHAsIHN0cnVjdCByaGxpc3RfaGVhZCwgcmhlYWQpOworCQl9CiAJCWdvdG8gbmV4dDsKIAl9CiAKQEAgLTYwNSw2ICs3MDQsMTggQEAKIAkJaW50IHNraXAgPSBpdGVyLT5za2lwOwogCiAJCXJodF9mb3JfZWFjaF9yY3UocCwgdGJsLCBpdGVyLT5zbG90KSB7CisJCQlpZiAocmhsaXN0KSB7CisJCQkJbGlzdCA9IGNvbnRhaW5lcl9vZihwLCBzdHJ1Y3QgcmhsaXN0X2hlYWQsCisJCQkJCQkgICAgcmhlYWQpOworCQkJCWRvIHsKKwkJCQkJaWYgKCFza2lwKQorCQkJCQkJZ290byBuZXh0OworCQkJCQlza2lwLS07CisJCQkJCWxpc3QgPSByY3VfZGVyZWZlcmVuY2UobGlzdC0+bmV4dCk7CisJCQkJfSB3aGlsZSAobGlzdCk7CisKKwkJCQljb250aW51ZTsKKwkJCX0KIAkJCWlmICghc2tpcCkKIAkJCQlicmVhazsKIAkJCXNraXAtLTsKQEAgLTYxNCw3ICs3MjUsOCBAQAogCQlpZiAoIXJodF9pc19hX251bGxzKHApKSB7CiAJCQlpdGVyLT5za2lwKys7CiAJCQlpdGVyLT5wID0gcDsKLQkJCXJldHVybiByaHRfb2JqKGh0LCBwKTsKKwkJCWl0ZXItPmxpc3QgPSBsaXN0OworCQkJcmV0dXJuIHJodF9vYmooaHQsIHJobGlzdCA/ICZsaXN0LT5yaGVhZCA6IHApOwogCQl9CiAKIAkJaXRlci0+c2tpcCA9IDA7CkBAIC02MjUsOCArNzM3LDggQEAKIAkvKiBFbnN1cmUgd2Ugc2VlIGFueSBuZXcgdGFibGVzLiAqLwogCXNtcF9ybWIoKTsKIAotCWl0ZXItPndhbGtlci0+dGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdSh0YmwtPmZ1dHVyZV90YmwsIGh0KTsKLQlpZiAoaXRlci0+d2Fsa2VyLT50YmwpIHsKKwlpdGVyLT53YWxrZXIudGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdSh0YmwtPmZ1dHVyZV90YmwsIGh0KTsKKwlpZiAoaXRlci0+d2Fsa2VyLnRibCkgewogCQlpdGVyLT5zbG90ID0gMDsKIAkJaXRlci0+c2tpcCA9IDA7CiAJCXJldHVybiBFUlJfUFRSKC1FQUdBSU4pOwpAQCAtNjQ2LDcgKzc1OCw3IEBACiAJX19yZWxlYXNlcyhSQ1UpCiB7CiAJc3RydWN0IHJoYXNodGFibGUgKmh0OwotCXN0cnVjdCBidWNrZXRfdGFibGUgKnRibCA9IGl0ZXItPndhbGtlci0+dGJsOworCXN0cnVjdCBidWNrZXRfdGFibGUgKnRibCA9IGl0ZXItPndhbGtlci50Ymw7CiAKIAlpZiAoIXRibCkKIAkJZ290byBvdXQ7CkBAIC02NTUsOSArNzY3LDkgQEAKIAogCXNwaW5fbG9jaygmaHQtPmxvY2spOwogCWlmICh0YmwtPnJlaGFzaCA8IHRibC0+c2l6ZSkKLQkJbGlzdF9hZGQoJml0ZXItPndhbGtlci0+bGlzdCwgJnRibC0+d2Fsa2Vycyk7CisJCWxpc3RfYWRkKCZpdGVyLT53YWxrZXIubGlzdCwgJnRibC0+d2Fsa2Vycyk7CiAJZWxzZQotCQlpdGVyLT53YWxrZXItPnRibCA9IE5VTEw7CisJCWl0ZXItPndhbGtlci50YmwgPSBOVUxMOwogCXNwaW5fdW5sb2NrKCZodC0+bG9jayk7CiAKIAlpdGVyLT5wID0gTlVMTDsKQEAgLTgwMyw2ICs5MTUsNDggQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHJoYXNodGFibGVfaW5pdCk7CiAKIC8qKgorICogcmhsdGFibGVfaW5pdCAtIGluaXRpYWxpemUgYSBuZXcgaGFzaCBsaXN0IHRhYmxlCisgKiBAaGx0OgloYXNoIGxpc3QgdGFibGUgdG8gYmUgaW5pdGlhbGl6ZWQKKyAqIEBwYXJhbXM6CWNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworICoKKyAqIEluaXRpYWxpemVzIGEgbmV3IGhhc2ggbGlzdCB0YWJsZS4KKyAqCisgKiBTZWUgZG9jdW1lbnRhdGlvbiBmb3Igcmhhc2h0YWJsZV9pbml0LgorICovCitpbnQgcmhsdGFibGVfaW5pdChzdHJ1Y3QgcmhsdGFibGUgKmhsdCwgY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zICpwYXJhbXMpCit7CisJaW50IGVycjsKKworCS8qIE5vIHJobGlzdCBOVUxMcyBtYXJraW5nIGZvciBub3cuICovCisJaWYgKHBhcmFtcy0+bnVsbHNfYmFzZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSByaGFzaHRhYmxlX2luaXQoJmhsdC0+aHQsIHBhcmFtcyk7CisJaGx0LT5odC5yaGxpc3QgPSB0cnVlOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyaGx0YWJsZV9pbml0KTsKKworc3RhdGljIHZvaWQgcmhhc2h0YWJsZV9mcmVlX29uZShzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIHN0cnVjdCByaGFzaF9oZWFkICpvYmosCisJCQkJdm9pZCAoKmZyZWVfZm4pKHZvaWQgKnB0ciwgdm9pZCAqYXJnKSwKKwkJCQl2b2lkICphcmcpCit7CisJc3RydWN0IHJobGlzdF9oZWFkICpsaXN0OworCisJaWYgKCFodC0+cmhsaXN0KSB7CisJCWZyZWVfZm4ocmh0X29iaihodCwgb2JqKSwgYXJnKTsKKwkJcmV0dXJuOworCX0KKworCWxpc3QgPSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgcmhsaXN0X2hlYWQsIHJoZWFkKTsKKwlkbyB7CisJCW9iaiA9ICZsaXN0LT5yaGVhZDsKKwkJbGlzdCA9IHJodF9kZXJlZmVyZW5jZShsaXN0LT5uZXh0LCBodCk7CisJCWZyZWVfZm4ocmh0X29iaihodCwgb2JqKSwgYXJnKTsKKwl9IHdoaWxlIChsaXN0KTsKK30KKworLyoqCiAgKiByaGFzaHRhYmxlX2ZyZWVfYW5kX2Rlc3Ryb3kgLSBmcmVlIGVsZW1lbnRzIGFuZCBkZXN0cm95IGhhc2ggdGFibGUKICAqIEBodDoJCXRoZSBoYXNoIHRhYmxlIHRvIGRlc3Ryb3kKICAqIEBmcmVlX2ZuOgljYWxsYmFjayB0byByZWxlYXNlIHJlc291cmNlcyBvZiBlbGVtZW50CkBAIC04MzksNyArOTkzLDcgQEAKIAkJCSAgICAgcG9zID0gbmV4dCwKIAkJCSAgICAgbmV4dCA9ICFyaHRfaXNfYV9udWxscyhwb3MpID8KIAkJCQkJcmh0X2RlcmVmZXJlbmNlKHBvcy0+bmV4dCwgaHQpIDogTlVMTCkKLQkJCQlmcmVlX2ZuKHJodF9vYmooaHQsIHBvcyksIGFyZyk7CisJCQkJcmhhc2h0YWJsZV9mcmVlX29uZShodCwgcG9zLCBmcmVlX2ZuLCBhcmcpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9saWIvc3lzY2FsbC5jIGIvbGliL3N5c2NhbGwuYwppbmRleCBlMzBlMDM5Li42MzIzOWUwIDEwMDY0NAotLS0gYS9saWIvc3lzY2FsbC5jCisrKyBiL2xpYi9zeXNjYWxsLmMKQEAgLTcsOSArNywxOSBAQAogCQkJICAgdW5zaWduZWQgbG9uZyBhcmdzWzZdLCB1bnNpZ25lZCBpbnQgbWF4YXJncywKIAkJCSAgIHVuc2lnbmVkIGxvbmcgKnNwLCB1bnNpZ25lZCBsb25nICpwYykKIHsKLQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRhc2tfcHRfcmVncyh0YXJnZXQpOwotCWlmICh1bmxpa2VseSghcmVncykpCisJc3RydWN0IHB0X3JlZ3MgKnJlZ3M7CisKKwlpZiAoIXRyeV9nZXRfdGFza19zdGFjayh0YXJnZXQpKSB7CisJCS8qIFRhc2sgaGFzIG5vIHN0YWNrLCBzbyB0aGUgdGFzayBpc24ndCBpbiBhIHN5c2NhbGwuICovCisJCSpjYWxsbm8gPSAtMTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVncyA9IHRhc2tfcHRfcmVncyh0YXJnZXQpOworCWlmICh1bmxpa2VseSghcmVncykpIHsKKwkJcHV0X3Rhc2tfc3RhY2sodGFyZ2V0KTsKIAkJcmV0dXJuIC1FQUdBSU47CisJfQogCiAJKnNwID0gdXNlcl9zdGFja19wb2ludGVyKHJlZ3MpOwogCSpwYyA9IGluc3RydWN0aW9uX3BvaW50ZXIocmVncyk7CkBAIC0xOCw2ICsyOCw3IEBACiAJaWYgKCpjYWxsbm8gIT0gLTFMICYmIG1heGFyZ3MgPiAwKQogCQlzeXNjYWxsX2dldF9hcmd1bWVudHModGFyZ2V0LCByZWdzLCAwLCBtYXhhcmdzLCBhcmdzKTsKIAorCXB1dF90YXNrX3N0YWNrKHRhcmdldCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYi90ZXN0X2JwZi5jIGIvbGliL3Rlc3RfYnBmLmMKaW5kZXggOTNmNDUwMS4uOTQzNDZiNCAxMDA2NDQKLS0tIGEvbGliL3Rlc3RfYnBmLmMKKysrIGIvbGliL3Rlc3RfYnBmLmMKQEAgLTU0ODUsNiArNTQ4NSw3IEBACiAJc2tiLT5oYXNoID0gU0tCX0hBU0g7CiAJc2tiLT5xdWV1ZV9tYXBwaW5nID0gU0tCX1FVRVVFX01BUDsKIAlza2ItPnZsYW5fdGNpID0gU0tCX1ZMQU5fVENJOworCXNrYi0+dmxhbl9wcm90byA9IGh0b25zKEVUSF9QX0lQKTsKIAlza2ItPmRldiA9ICZkZXY7CiAJc2tiLT5kZXYtPmlmaW5kZXggPSBTS0JfREVWX0lGSU5ERVg7CiAJc2tiLT5kZXYtPnR5cGUgPSBTS0JfREVWX1RZUEU7CmRpZmYgLS1naXQgYS9saWIvdGVzdF9oYXNoLmMgYi9saWIvdGVzdF9oYXNoLmMKaW5kZXggNjZjNWZjOC4uY2FjMjBjNSAxMDA2NDQKLS0tIGEvbGliL3Rlc3RfaGFzaC5jCisrKyBiL2xpYi90ZXN0X2hhc2guYwpAQCAtMTQzLDcgKzE0Myw3IEBACiB0ZXN0X2hhc2hfaW5pdCh2b2lkKQogewogCWNoYXIgYnVmW1NJWkUrMV07Ci0JdTMyIHN0cmluZ19vciA9IDAsIGhhc2hfb3JbMl1bMzNdID0geyAwIH07CisJdTMyIHN0cmluZ19vciA9IDAsIGhhc2hfb3JbMl1bMzNdID0geyB7IDAsIH0gfTsKIAl1bnNpZ25lZCB0ZXN0cyA9IDA7CiAJdW5zaWduZWQgbG9uZyBsb25nIGg2NCA9IDA7CiAJaW50IGksIGo7CkBAIC0yMTksMjEgKzIxOSwyNyBAQAogCX0KIAogCS8qIElzc3VlIG5vdGljZXMgYWJvdXQgc2tpcHBlZCB0ZXN0cy4gKi8KLSNpZm5kZWYgSEFWRV9BUkNIX19IQVNIXzMyCi0JcHJfaW5mbygiX19oYXNoXzMyKCkgaGFzIG5vIGFyY2ggaW1wbGVtZW50YXRpb24gdG8gdGVzdC4iKTsKLSNlbGlmIEhBVkVfQVJDSF9fSEFTSF8zMiAhPSAxCisjaWZkZWYgSEFWRV9BUkNIX19IQVNIXzMyCisjaWYgSEFWRV9BUkNIX19IQVNIXzMyICE9IDEKIAlwcl9pbmZvKCJfX2hhc2hfMzIoKSBpcyBhcmNoLXNwZWNpZmljOyBub3QgY29tcGFyZWQgdG8gZ2VuZXJpYy4iKTsKICNlbmRpZgotI2lmbmRlZiBIQVZFX0FSQ0hfSEFTSF8zMgotCXByX2luZm8oImhhc2hfMzIoKSBoYXMgbm8gYXJjaCBpbXBsZW1lbnRhdGlvbiB0byB0ZXN0LiIpOwotI2VsaWYgSEFWRV9BUkNIX0hBU0hfMzIgIT0gMQorI2Vsc2UKKwlwcl9pbmZvKCJfX2hhc2hfMzIoKSBoYXMgbm8gYXJjaCBpbXBsZW1lbnRhdGlvbiB0byB0ZXN0LiIpOworI2VuZGlmCisjaWZkZWYgSEFWRV9BUkNIX0hBU0hfMzIKKyNpZiBIQVZFX0FSQ0hfSEFTSF8zMiAhPSAxCiAJcHJfaW5mbygiaGFzaF8zMigpIGlzIGFyY2gtc3BlY2lmaWM7IG5vdCBjb21wYXJlZCB0byBnZW5lcmljLiIpOwogI2VuZGlmCi0jaWZuZGVmIEhBVkVfQVJDSF9IQVNIXzY0Ci0JcHJfaW5mbygiaGFzaF82NCgpIGhhcyBubyBhcmNoIGltcGxlbWVudGF0aW9uIHRvIHRlc3QuIik7Ci0jZWxpZiBIQVZFX0FSQ0hfSEFTSF82NCAhPSAxCisjZWxzZQorCXByX2luZm8oImhhc2hfMzIoKSBoYXMgbm8gYXJjaCBpbXBsZW1lbnRhdGlvbiB0byB0ZXN0LiIpOworI2VuZGlmCisjaWZkZWYgSEFWRV9BUkNIX0hBU0hfNjQKKyNpZiBIQVZFX0FSQ0hfSEFTSF82NCAhPSAxCiAJcHJfaW5mbygiaGFzaF82NCgpIGlzIGFyY2gtc3BlY2lmaWM7IG5vdCBjb21wYXJlZCB0byBnZW5lcmljLiIpOwogI2VuZGlmCisjZWxzZQorCXByX2luZm8oImhhc2hfNjQoKSBoYXMgbm8gYXJjaCBpbXBsZW1lbnRhdGlvbiB0byB0ZXN0LiIpOworI2VuZGlmCiAKIAlwcl9ub3RpY2UoIiV1IHRlc3RzIHBhc3NlZC4iLCB0ZXN0cyk7CiAKZGlmZiAtLWdpdCBhL2xpYi90ZXN0X3JoYXNodGFibGUuYyBiL2xpYi90ZXN0X3JoYXNodGFibGUuYwppbmRleCAyOTdmZGI1Li42NGU4OTliIDEwMDY0NAotLS0gYS9saWIvdGVzdF9yaGFzaHRhYmxlLmMKKysrIGIvbGliL3Rlc3Rfcmhhc2h0YWJsZS5jCkBAIC0zOCw3ICszOCw3IEBACiAKIHN0YXRpYyBpbnQgbWF4X3NpemUgPSAwOwogbW9kdWxlX3BhcmFtKG1heF9zaXplLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhydW5zLCAiTWF4aW11bSB0YWJsZSBzaXplIChkZWZhdWx0OiBjYWxjdWxhdGVkKSIpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfc2l6ZSwgIk1heGltdW0gdGFibGUgc2l6ZSAoZGVmYXVsdDogY2FsY3VsYXRlZCkiKTsKIAogc3RhdGljIGJvb2wgc2hyaW5raW5nID0gZmFsc2U7CiBtb2R1bGVfcGFyYW0oc2hyaW5raW5nLCBib29sLCAwKTsKZGlmZiAtLWdpdCBhL2xpYi91Y3MyX3N0cmluZy5jIGIvbGliL3VjczJfc3RyaW5nLmMKaW5kZXggZjBiMzIzYS4uYWU4ZDI0OSAxMDA2NDQKLS0tIGEvbGliL3VjczJfc3RyaW5nLmMKKysrIGIvbGliL3VjczJfc3RyaW5nLmMKQEAgLTU2LDcgKzU2LDcgQEAKIAl1bnNpZ25lZCBsb25nIGk7CiAJdW5zaWduZWQgbG9uZyBqID0gMDsKIAotCWZvciAoaSA9IDA7IGkgPCB1Y3MyX3N0cmxlbihzcmMpOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBzcmNbaV07IGkrKykgewogCQl1MTYgYyA9IHNyY1tpXTsKIAogCQlpZiAoYyA+PSAweDgwMCkKZGlmZiAtLWdpdCBhL2xpYi91c2VyY29weS5jIGIvbGliL3VzZXJjb3B5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNWIxZGQuLjAwMDAwMDAKLS0tIGEvbGliL3VzZXJjb3B5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9idWcuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0KLXZvaWQgY29weV9mcm9tX3VzZXJfb3ZlcmZsb3codm9pZCkKLXsKLQlXQVJOKDEsICJCdWZmZXIgb3ZlcmZsb3cgZGV0ZWN0ZWQhXG4iKTsKLX0KLUVYUE9SVF9TWU1CT0woY29weV9mcm9tX3VzZXJfb3ZlcmZsb3cpOwpkaWZmIC0tZ2l0IGEvbGliL3dpbl9taW5tYXguYyBiL2xpYi93aW5fbWlubWF4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg0MjBkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi93aW5fbWlubWF4LmMKQEAgLTAsMCArMSw5OCBAQAorLyoqCisgKiBsaWIvbWlubWF4LmM6IHdpbmRvd2VkIG1pbi9tYXggdHJhY2tlcgorICoKKyAqIEthdGhsZWVuIE5pY2hvbHMnIGFsZ29yaXRobSBmb3IgdHJhY2tpbmcgdGhlIG1pbmltdW0gKG9yIG1heGltdW0pCisgKiB2YWx1ZSBvZiBhIGRhdGEgc3RyZWFtIG92ZXIgc29tZSBmaXhlZCB0aW1lIGludGVydmFsLiAgKEUuZy4sCisgKiB0aGUgbWluaW11bSBSVFQgb3ZlciB0aGUgcGFzdCBmaXZlIG1pbnV0ZXMuKSBJdCB1c2VzIGNvbnN0YW50CisgKiBzcGFjZSBhbmQgY29uc3RhbnQgdGltZSBwZXIgdXBkYXRlIHlldCBhbG1vc3QgYWx3YXlzIGRlbGl2ZXJzCisgKiB0aGUgc2FtZSBtaW5pbXVtIGFzIGFuIGltcGxlbWVudGF0aW9uIHRoYXQgaGFzIHRvIGtlZXAgYWxsIHRoZQorICogZGF0YSBpbiB0aGUgd2luZG93LgorICoKKyAqIFRoZSBhbGdvcml0aG0ga2VlcHMgdHJhY2sgb2YgdGhlIGJlc3QsIDJuZCBiZXN0ICYgM3JkIGJlc3QgbWluCisgKiB2YWx1ZXMsIG1haW50YWluaW5nIGFuIGludmFyaWFudCB0aGF0IHRoZSBtZWFzdXJlbWVudCB0aW1lIG9mCisgKiB0aGUgbid0aCBiZXN0ID49IG4tMSd0aCBiZXN0LiBJdCBhbHNvIG1ha2VzIHN1cmUgdGhhdCB0aGUgdGhyZWUKKyAqIHZhbHVlcyBhcmUgd2lkZWx5IHNlcGFyYXRlZCBpbiB0aGUgdGltZSB3aW5kb3cgc2luY2UgdGhhdCBib3VuZHMKKyAqIHRoZSB3b3JzZSBjYXNlIGVycm9yIHdoZW4gdGhhdCBkYXRhIGlzIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZworICogb3ZlciB0aGUgd2luZG93LgorICoKKyAqIFVwb24gZ2V0dGluZyBhIG5ldyBtaW4sIHdlIGNhbiBmb3JnZXQgZXZlcnl0aGluZyBlYXJsaWVyIGJlY2F1c2UKKyAqIGl0IGhhcyBubyB2YWx1ZSAtIHRoZSBuZXcgbWluIGlzIDw9IGV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgd2luZG93CisgKiBieSBkZWZpbml0aW9uIGFuZCBpdCdzIHRoZSBtb3N0IHJlY2VudC4gU28gd2UgcmVzdGFydCBmcmVzaCBvbgorICogZXZlcnkgbmV3IG1pbiBhbmQgb3ZlcndyaXRlcyAybmQgJiAzcmQgY2hvaWNlcy4gVGhlIHNhbWUgcHJvcGVydHkKKyAqIGhvbGRzIGZvciAybmQgJiAzcmQgYmVzdC4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dpbl9taW5tYXguaD4KKworLyogQXMgdGltZSBhZHZhbmNlcywgdXBkYXRlIHRoZSAxc3QsIDJuZCwgYW5kIDNyZCBjaG9pY2VzLiAqLworc3RhdGljIHUzMiBtaW5tYXhfc3Vid2luX3VwZGF0ZShzdHJ1Y3QgbWlubWF4ICptLCB1MzIgd2luLAorCQkJCWNvbnN0IHN0cnVjdCBtaW5tYXhfc2FtcGxlICp2YWwpCit7CisJdTMyIGR0ID0gdmFsLT50IC0gbS0+c1swXS50OworCisJaWYgKHVubGlrZWx5KGR0ID4gd2luKSkgeworCQkvKgorCQkgKiBQYXNzZWQgZW50aXJlIHdpbmRvdyB3aXRob3V0IGEgbmV3IHZhbCBzbyBtYWtlIDJuZAorCQkgKiBjaG9pY2UgdGhlIG5ldyB2YWwgJiAzcmQgY2hvaWNlIHRoZSBuZXcgMm5kIGNob2ljZS4KKwkJICogd2UgbWF5IGhhdmUgdG8gaXRlcmF0ZSB0aGlzIHNpbmNlIG91ciAybmQgY2hvaWNlCisJCSAqIG1heSBhbHNvIGJlIG91dHNpZGUgdGhlIHdpbmRvdyAod2UgY2hlY2tlZCBvbiBlbnRyeQorCQkgKiB0aGF0IHRoZSB0aGlyZCBjaG9pY2Ugd2FzIGluIHRoZSB3aW5kb3cpLgorCQkgKi8KKwkJbS0+c1swXSA9IG0tPnNbMV07CisJCW0tPnNbMV0gPSBtLT5zWzJdOworCQltLT5zWzJdID0gKnZhbDsKKwkJaWYgKHVubGlrZWx5KHZhbC0+dCAtIG0tPnNbMF0udCA+IHdpbikpIHsKKwkJCW0tPnNbMF0gPSBtLT5zWzFdOworCQkJbS0+c1sxXSA9IG0tPnNbMl07CisJCQltLT5zWzJdID0gKnZhbDsKKwkJfQorCX0gZWxzZSBpZiAodW5saWtlbHkobS0+c1sxXS50ID09IG0tPnNbMF0udCkgJiYgZHQgPiB3aW4vNCkgeworCQkvKgorCQkgKiBXZSd2ZSBwYXNzZWQgYSBxdWFydGVyIG9mIHRoZSB3aW5kb3cgd2l0aG91dCBhIG5ldyB2YWwKKwkJICogc28gdGFrZSBhIDJuZCBjaG9pY2UgZnJvbSB0aGUgMm5kIHF1YXJ0ZXIgb2YgdGhlIHdpbmRvdy4KKwkJICovCisJCW0tPnNbMl0gPSBtLT5zWzFdID0gKnZhbDsKKwl9IGVsc2UgaWYgKHVubGlrZWx5KG0tPnNbMl0udCA9PSBtLT5zWzFdLnQpICYmIGR0ID4gd2luLzIpIHsKKwkJLyoKKwkJICogV2UndmUgcGFzc2VkIGhhbGYgdGhlIHdpbmRvdyB3aXRob3V0IGZpbmRpbmcgYSBuZXcgdmFsCisJCSAqIHNvIHRha2UgYSAzcmQgY2hvaWNlIGZyb20gdGhlIGxhc3QgaGFsZiBvZiB0aGUgd2luZG93CisJCSAqLworCQltLT5zWzJdID0gKnZhbDsKKwl9CisJcmV0dXJuIG0tPnNbMF0udjsKK30KKworLyogQ2hlY2sgaWYgbmV3IG1lYXN1cmVtZW50IHVwZGF0ZXMgdGhlIDFzdCwgMm5kIG9yIDNyZCBjaG9pY2UgbWF4LiAqLwordTMyIG1pbm1heF9ydW5uaW5nX21heChzdHJ1Y3QgbWlubWF4ICptLCB1MzIgd2luLCB1MzIgdCwgdTMyIG1lYXMpCit7CisJc3RydWN0IG1pbm1heF9zYW1wbGUgdmFsID0geyAudCA9IHQsIC52ID0gbWVhcyB9OworCisJaWYgKHVubGlrZWx5KHZhbC52ID49IG0tPnNbMF0udikgfHwJICAvKiBmb3VuZCBuZXcgbWF4PyAqLworCSAgICB1bmxpa2VseSh2YWwudCAtIG0tPnNbMl0udCA+IHdpbikpCSAgLyogbm90aGluZyBsZWZ0IGluIHdpbmRvdz8gKi8KKwkJcmV0dXJuIG1pbm1heF9yZXNldChtLCB0LCBtZWFzKTsgIC8qIGZvcmdldCBlYXJsaWVyIHNhbXBsZXMgKi8KKworCWlmICh1bmxpa2VseSh2YWwudiA+PSBtLT5zWzFdLnYpKQorCQltLT5zWzJdID0gbS0+c1sxXSA9IHZhbDsKKwllbHNlIGlmICh1bmxpa2VseSh2YWwudiA+PSBtLT5zWzJdLnYpKQorCQltLT5zWzJdID0gdmFsOworCisJcmV0dXJuIG1pbm1heF9zdWJ3aW5fdXBkYXRlKG0sIHdpbiwgJnZhbCk7Cit9CitFWFBPUlRfU1lNQk9MKG1pbm1heF9ydW5uaW5nX21heCk7CisKKy8qIENoZWNrIGlmIG5ldyBtZWFzdXJlbWVudCB1cGRhdGVzIHRoZSAxc3QsIDJuZCBvciAzcmQgY2hvaWNlIG1pbi4gKi8KK3UzMiBtaW5tYXhfcnVubmluZ19taW4oc3RydWN0IG1pbm1heCAqbSwgdTMyIHdpbiwgdTMyIHQsIHUzMiBtZWFzKQoreworCXN0cnVjdCBtaW5tYXhfc2FtcGxlIHZhbCA9IHsgLnQgPSB0LCAudiA9IG1lYXMgfTsKKworCWlmICh1bmxpa2VseSh2YWwudiA8PSBtLT5zWzBdLnYpIHx8CSAgLyogZm91bmQgbmV3IG1pbj8gKi8KKwkgICAgdW5saWtlbHkodmFsLnQgLSBtLT5zWzJdLnQgPiB3aW4pKQkgIC8qIG5vdGhpbmcgbGVmdCBpbiB3aW5kb3c/ICovCisJCXJldHVybiBtaW5tYXhfcmVzZXQobSwgdCwgbWVhcyk7ICAvKiBmb3JnZXQgZWFybGllciBzYW1wbGVzICovCisKKwlpZiAodW5saWtlbHkodmFsLnYgPD0gbS0+c1sxXS52KSkKKwkJbS0+c1syXSA9IG0tPnNbMV0gPSB2YWw7CisJZWxzZSBpZiAodW5saWtlbHkodmFsLnYgPD0gbS0+c1syXS52KSkKKwkJbS0+c1syXSA9IHZhbDsKKworCXJldHVybiBtaW5tYXhfc3Vid2luX3VwZGF0ZShtLCB3aW4sICZ2YWwpOworfQpkaWZmIC0tZ2l0IGEvbW0vS2NvbmZpZyBiL21tL0tjb25maWcKaW5kZXggNzhhMjNjNS4uYmUwZWUxMSAxMDA2NDQKLS0tIGEvbW0vS2NvbmZpZworKysgYi9tbS9LY29uZmlnCkBAIC0yNjIsNyArMjYyLDE0IEBACiAJc2VsZWN0IE1JR1JBVElPTgogCWRlcGVuZHMgb24gTU1VCiAJaGVscAotCSAgQWxsb3dzIHRoZSBjb21wYWN0aW9uIG9mIG1lbW9yeSBmb3IgdGhlIGFsbG9jYXRpb24gb2YgaHVnZSBwYWdlcy4KKyAgICAgICAgICBDb21wYWN0aW9uIGlzIHRoZSBvbmx5IG1lbW9yeSBtYW5hZ2VtZW50IGNvbXBvbmVudCB0byBmb3JtCisgICAgICAgICAgaGlnaCBvcmRlciAobGFyZ2VyIHBoeXNpY2FsbHkgY29udGlndW91cykgbWVtb3J5IGJsb2NrcworICAgICAgICAgIHJlbGlhYmx5LiBUaGUgcGFnZSBhbGxvY2F0b3IgcmVsaWVzIG9uIGNvbXBhY3Rpb24gaGVhdmlseSBhbmQKKyAgICAgICAgICB0aGUgbGFjayBvZiB0aGUgZmVhdHVyZSBjYW4gbGVhZCB0byB1bmV4cGVjdGVkIE9PTSBraWxsZXIKKyAgICAgICAgICBpbnZvY2F0aW9ucyBmb3IgaGlnaCBvcmRlciBtZW1vcnkgcmVxdWVzdHMuIFlvdSBzaG91bGRuJ3QKKyAgICAgICAgICBkaXNhYmxlIHRoaXMgb3B0aW9uIHVubGVzcyB0aGVyZSByZWFsbHkgaXMgYSBzdHJvbmcgcmVhc29uIGZvcgorICAgICAgICAgIGl0IGFuZCB0aGVuIHdlIHdvdWxkIGJlIHJlYWxseSBpbnRlcmVzdGVkIHRvIGhlYXIgYWJvdXQgdGhhdCBhdAorICAgICAgICAgIGxpbnV4LW1tQGt2YWNrLm9yZy4KIAogIwogIyBzdXBwb3J0IGZvciBwYWdlIG1pZ3JhdGlvbgpkaWZmIC0tZ2l0IGEvbW0vS2NvbmZpZy5kZWJ1ZyBiL21tL0tjb25maWcuZGVidWcKaW5kZXggMjJmNGNkOS4uYWZjYzU1MCAxMDA2NDQKLS0tIGEvbW0vS2NvbmZpZy5kZWJ1ZworKysgYi9tbS9LY29uZmlnLmRlYnVnCkBAIC03Niw4ICs3Niw2IEBACiAJICAgbm8gbG9uZ2VyIG5lY2Vzc2FyeSB0byB3cml0ZSB6ZXJvcyB3aGVuIEdGUF9aRVJPIGlzIHVzZWQgb24KIAkgICBhbGxvY2F0aW9uLgogCi0JICAgRW5hYmxpbmcgcGFnZSBwb2lzb25pbmcgd2l0aCB0aGlzIG9wdGlvbiB3aWxsIGRpc2FibGUgaGliZXJuYXRpb24KLQogCSAgIElmIHVuc3VyZSwgc2F5IE4KIAlib29sCiAKZGlmZiAtLWdpdCBhL21tL2RlYnVnLmMgYi9tbS9kZWJ1Zy5jCmluZGV4IDg4NjViZmIuLjc0YzdjYWUgMTAwNjQ0Ci0tLSBhL21tL2RlYnVnLmMKKysrIGIvbW0vZGVidWcuYwpAQCAtNDIsOSArNDIsMTEgQEAKIAogdm9pZCBfX2R1bXBfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgY29uc3QgY2hhciAqcmVhc29uKQogeworCWludCBtYXBjb3VudCA9IFBhZ2VTbGFiKHBhZ2UpID8gMCA6IHBhZ2VfbWFwY291bnQocGFnZSk7CisKIAlwcl9lbWVyZygicGFnZTolcCBjb3VudDolZCBtYXBjb3VudDolZCBtYXBwaW5nOiVwIGluZGV4OiUjbHgiLAotCQkgIHBhZ2UsIHBhZ2VfcmVmX2NvdW50KHBhZ2UpLCBwYWdlX21hcGNvdW50KHBhZ2UpLAotCQkgIHBhZ2UtPm1hcHBpbmcsIHBhZ2UtPmluZGV4KTsKKwkJICBwYWdlLCBwYWdlX3JlZl9jb3VudChwYWdlKSwgbWFwY291bnQsCisJCSAgcGFnZS0+bWFwcGluZywgcGFnZV90b19wZ29mZihwYWdlKSk7CiAJaWYgKFBhZ2VDb21wb3VuZChwYWdlKSkKIAkJcHJfY29udCgiIGNvbXBvdW5kX21hcGNvdW50OiAlZCIsIGNvbXBvdW5kX21hcGNvdW50KHBhZ2UpKTsKIAlwcl9jb250KCJcbiIpOwpkaWZmIC0tZ2l0IGEvbW0vZmlsZW1hcC5jIGIvbW0vZmlsZW1hcC5jCmluZGV4IDhhMjg3ZGYuLjY4ZjE4MTMgMTAwNjQ0Ci0tLSBhL21tL2ZpbGVtYXAuYworKysgYi9tbS9maWxlbWFwLmMKQEAgLTExMCwzNiArMTEwLDk0IEBACiAgKiAgIC0+dGFza2xpc3RfbG9jayAgICAgICAgICAgIChtZW1vcnlfZmFpbHVyZSwgY29sbGVjdF9wcm9jc19hbykKICAqLwogCitzdGF0aWMgaW50IHBhZ2VfY2FjaGVfdHJlZV9pbnNlcnQoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkJICBzdHJ1Y3QgcGFnZSAqcGFnZSwgdm9pZCAqKnNoYWRvd3ApCit7CisJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZTsKKwl2b2lkICoqc2xvdDsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IF9fcmFkaXhfdHJlZV9jcmVhdGUoJm1hcHBpbmctPnBhZ2VfdHJlZSwgcGFnZS0+aW5kZXgsIDAsCisJCQkJICAgICZub2RlLCAmc2xvdCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJaWYgKCpzbG90KSB7CisJCXZvaWQgKnA7CisKKwkJcCA9IHJhZGl4X3RyZWVfZGVyZWZfc2xvdF9wcm90ZWN0ZWQoc2xvdCwgJm1hcHBpbmctPnRyZWVfbG9jayk7CisJCWlmICghcmFkaXhfdHJlZV9leGNlcHRpb25hbF9lbnRyeShwKSkKKwkJCXJldHVybiAtRUVYSVNUOworCisJCW1hcHBpbmctPm5yZXhjZXB0aW9uYWwtLTsKKwkJaWYgKCFkYXhfbWFwcGluZyhtYXBwaW5nKSkgeworCQkJaWYgKHNoYWRvd3ApCisJCQkJKnNoYWRvd3AgPSBwOworCQkJaWYgKG5vZGUpCisJCQkJd29ya2luZ3NldF9ub2RlX3NoYWRvd3NfZGVjKG5vZGUpOworCQl9IGVsc2UgeworCQkJLyogREFYIGNhbiByZXBsYWNlIGVtcHR5IGxvY2tlZCBlbnRyeSB3aXRoIGEgaG9sZSAqLworCQkJV0FSTl9PTl9PTkNFKHAgIT0KKwkJCQkodm9pZCAqKShSQURJWF9UUkVFX0VYQ0VQVElPTkFMX0VOVFJZIHwKKwkJCQkJIFJBRElYX0RBWF9FTlRSWV9MT0NLKSk7CisJCQkvKiBEQVggYWNjb3VudHMgZXhjZXB0aW9uYWwgZW50cmllcyBhcyBub3JtYWwgcGFnZXMgKi8KKwkJCWlmIChub2RlKQorCQkJCXdvcmtpbmdzZXRfbm9kZV9wYWdlc19kZWMobm9kZSk7CisJCQkvKiBXYWtldXAgd2FpdGVycyBmb3IgZXhjZXB0aW9uYWwgZW50cnkgbG9jayAqLworCQkJZGF4X3dha2VfbWFwcGluZ19lbnRyeV93YWl0ZXIobWFwcGluZywgcGFnZS0+aW5kZXgsCisJCQkJCQkgICAgICBmYWxzZSk7CisJCX0KKwl9CisJcmFkaXhfdHJlZV9yZXBsYWNlX3Nsb3Qoc2xvdCwgcGFnZSk7CisJbWFwcGluZy0+bnJwYWdlcysrOworCWlmIChub2RlKSB7CisJCXdvcmtpbmdzZXRfbm9kZV9wYWdlc19pbmMobm9kZSk7CisJCS8qCisJCSAqIERvbid0IHRyYWNrIG5vZGUgdGhhdCBjb250YWlucyBhY3R1YWwgcGFnZXMuCisJCSAqCisJCSAqIEF2b2lkIGFjcXVpcmluZyB0aGUgbGlzdF9scnUgbG9jayBpZiBhbHJlYWR5CisJCSAqIHVudHJhY2tlZC4gIFRoZSBsaXN0X2VtcHR5KCkgdGVzdCBpcyBzYWZlIGFzCisJCSAqIG5vZGUtPnByaXZhdGVfbGlzdCBpcyBwcm90ZWN0ZWQgYnkKKwkJICogbWFwcGluZy0+dHJlZV9sb2NrLgorCQkgKi8KKwkJaWYgKCFsaXN0X2VtcHR5KCZub2RlLT5wcml2YXRlX2xpc3QpKQorCQkJbGlzdF9scnVfZGVsKCZ3b3JraW5nc2V0X3NoYWRvd19ub2RlcywKKwkJCQkgICAgICZub2RlLT5wcml2YXRlX2xpc3QpOworCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgcGFnZV9jYWNoZV90cmVlX2RlbGV0ZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKIAkJCQkgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgdm9pZCAqc2hhZG93KQogewotCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGU7CiAJaW50IGksIG5yID0gUGFnZUh1Z2UocGFnZSkgPyAxIDogaHBhZ2VfbnJfcGFnZXMocGFnZSk7CiAKIAlWTV9CVUdfT05fUEFHRSghUGFnZUxvY2tlZChwYWdlKSwgcGFnZSk7CiAJVk1fQlVHX09OX1BBR0UoUGFnZVRhaWwocGFnZSksIHBhZ2UpOwogCVZNX0JVR19PTl9QQUdFKG5yICE9IDEgJiYgc2hhZG93LCBwYWdlKTsKIAotCWlmIChzaGFkb3cpIHsKLQkJbWFwcGluZy0+bnJleGNlcHRpb25hbCArPSBucjsKLQkJLyoKLQkJICogTWFrZSBzdXJlIHRoZSBucmV4Y2VwdGlvbmFsIHVwZGF0ZSBpcyBjb21taXR0ZWQgYmVmb3JlCi0JCSAqIHRoZSBucnBhZ2VzIHVwZGF0ZSBzbyB0aGF0IGZpbmFsIHRydW5jYXRlIHJhY2luZwotCQkgKiB3aXRoIHJlY2xhaW0gZG9lcyBub3Qgc2VlIGJvdGggY291bnRlcnMgMCBhdCB0aGUKLQkJICogc2FtZSB0aW1lIGFuZCBtaXNzIGEgc2hhZG93IGVudHJ5LgotCQkgKi8KLQkJc21wX3dtYigpOwotCX0KLQltYXBwaW5nLT5ucnBhZ2VzIC09IG5yOwotCiAJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspIHsKLQkJbm9kZSA9IHJhZGl4X3RyZWVfcmVwbGFjZV9jbGVhcl90YWdzKCZtYXBwaW5nLT5wYWdlX3RyZWUsCi0JCQkJcGFnZS0+aW5kZXggKyBpLCBzaGFkb3cpOworCQlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlOworCQl2b2lkICoqc2xvdDsKKworCQlfX3JhZGl4X3RyZWVfbG9va3VwKCZtYXBwaW5nLT5wYWdlX3RyZWUsIHBhZ2UtPmluZGV4ICsgaSwKKwkJCQkgICAgJm5vZGUsICZzbG90KTsKKworCQlyYWRpeF90cmVlX2NsZWFyX3RhZ3MoJm1hcHBpbmctPnBhZ2VfdHJlZSwgbm9kZSwgc2xvdCk7CisKIAkJaWYgKCFub2RlKSB7CiAJCQlWTV9CVUdfT05fUEFHRShuciAhPSAxLCBwYWdlKTsKLQkJCXJldHVybjsKKwkJCS8qCisJCQkgKiBXZSBuZWVkIGEgbm9kZSB0byBwcm9wZXJseSBhY2NvdW50IHNoYWRvdworCQkJICogZW50cmllcy4gRG9uJ3QgcGxhbnQgYW55IHdpdGhvdXQuIFhYWAorCQkJICovCisJCQlzaGFkb3cgPSBOVUxMOwogCQl9CiAKKwkJcmFkaXhfdHJlZV9yZXBsYWNlX3Nsb3Qoc2xvdCwgc2hhZG93KTsKKworCQlpZiAoIW5vZGUpCisJCQlicmVhazsKKwogCQl3b3JraW5nc2V0X25vZGVfcGFnZXNfZGVjKG5vZGUpOwogCQlpZiAoc2hhZG93KQogCQkJd29ya2luZ3NldF9ub2RlX3NoYWRvd3NfaW5jKG5vZGUpOwpAQCAtMTYzLDYgKzIyMSwxOCBAQAogCQkJCQkmbm9kZS0+cHJpdmF0ZV9saXN0KTsKIAkJfQogCX0KKworCWlmIChzaGFkb3cpIHsKKwkJbWFwcGluZy0+bnJleGNlcHRpb25hbCArPSBucjsKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoZSBucmV4Y2VwdGlvbmFsIHVwZGF0ZSBpcyBjb21taXR0ZWQgYmVmb3JlCisJCSAqIHRoZSBucnBhZ2VzIHVwZGF0ZSBzbyB0aGF0IGZpbmFsIHRydW5jYXRlIHJhY2luZworCQkgKiB3aXRoIHJlY2xhaW0gZG9lcyBub3Qgc2VlIGJvdGggY291bnRlcnMgMCBhdCB0aGUKKwkJICogc2FtZSB0aW1lIGFuZCBtaXNzIGEgc2hhZG93IGVudHJ5LgorCQkgKi8KKwkJc21wX3dtYigpOworCX0KKwltYXBwaW5nLT5ucnBhZ2VzIC09IG5yOwogfQogCiAvKgpAQCAtNTYxLDkgKzYzMSw4IEBACiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJm1hcHBpbmctPnRyZWVfbG9jaywgZmxhZ3MpOwogCQlfX2RlbGV0ZV9mcm9tX3BhZ2VfY2FjaGUob2xkLCBOVUxMKTsKLQkJZXJyb3IgPSByYWRpeF90cmVlX2luc2VydCgmbWFwcGluZy0+cGFnZV90cmVlLCBvZmZzZXQsIG5ldyk7CisJCWVycm9yID0gcGFnZV9jYWNoZV90cmVlX2luc2VydChtYXBwaW5nLCBuZXcsIE5VTEwpOwogCQlCVUdfT04oZXJyb3IpOwotCQltYXBwaW5nLT5ucnBhZ2VzKys7CiAKIAkJLyoKIAkJICogaHVnZXRsYiBwYWdlcyBkbyBub3QgcGFydGljaXBhdGUgaW4gcGFnZSBjYWNoZSBhY2NvdW50aW5nLgpAQCAtNTg0LDYyICs2NTMsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocmVwbGFjZV9wYWdlX2NhY2hlX3BhZ2UpOwogCi1zdGF0aWMgaW50IHBhZ2VfY2FjaGVfdHJlZV9pbnNlcnQoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCi0JCQkJICBzdHJ1Y3QgcGFnZSAqcGFnZSwgdm9pZCAqKnNoYWRvd3ApCi17Ci0Jc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZTsKLQl2b2lkICoqc2xvdDsKLQlpbnQgZXJyb3I7Ci0KLQllcnJvciA9IF9fcmFkaXhfdHJlZV9jcmVhdGUoJm1hcHBpbmctPnBhZ2VfdHJlZSwgcGFnZS0+aW5kZXgsIDAsCi0JCQkJICAgICZub2RlLCAmc2xvdCk7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7Ci0JaWYgKCpzbG90KSB7Ci0JCXZvaWQgKnA7Ci0KLQkJcCA9IHJhZGl4X3RyZWVfZGVyZWZfc2xvdF9wcm90ZWN0ZWQoc2xvdCwgJm1hcHBpbmctPnRyZWVfbG9jayk7Ci0JCWlmICghcmFkaXhfdHJlZV9leGNlcHRpb25hbF9lbnRyeShwKSkKLQkJCXJldHVybiAtRUVYSVNUOwotCi0JCW1hcHBpbmctPm5yZXhjZXB0aW9uYWwtLTsKLQkJaWYgKCFkYXhfbWFwcGluZyhtYXBwaW5nKSkgewotCQkJaWYgKHNoYWRvd3ApCi0JCQkJKnNoYWRvd3AgPSBwOwotCQkJaWYgKG5vZGUpCi0JCQkJd29ya2luZ3NldF9ub2RlX3NoYWRvd3NfZGVjKG5vZGUpOwotCQl9IGVsc2UgewotCQkJLyogREFYIGNhbiByZXBsYWNlIGVtcHR5IGxvY2tlZCBlbnRyeSB3aXRoIGEgaG9sZSAqLwotCQkJV0FSTl9PTl9PTkNFKHAgIT0KLQkJCQkodm9pZCAqKShSQURJWF9UUkVFX0VYQ0VQVElPTkFMX0VOVFJZIHwKLQkJCQkJIFJBRElYX0RBWF9FTlRSWV9MT0NLKSk7Ci0JCQkvKiBEQVggYWNjb3VudHMgZXhjZXB0aW9uYWwgZW50cmllcyBhcyBub3JtYWwgcGFnZXMgKi8KLQkJCWlmIChub2RlKQotCQkJCXdvcmtpbmdzZXRfbm9kZV9wYWdlc19kZWMobm9kZSk7Ci0JCQkvKiBXYWtldXAgd2FpdGVycyBmb3IgZXhjZXB0aW9uYWwgZW50cnkgbG9jayAqLwotCQkJZGF4X3dha2VfbWFwcGluZ19lbnRyeV93YWl0ZXIobWFwcGluZywgcGFnZS0+aW5kZXgsCi0JCQkJCQkgICAgICBmYWxzZSk7Ci0JCX0KLQl9Ci0JcmFkaXhfdHJlZV9yZXBsYWNlX3Nsb3Qoc2xvdCwgcGFnZSk7Ci0JbWFwcGluZy0+bnJwYWdlcysrOwotCWlmIChub2RlKSB7Ci0JCXdvcmtpbmdzZXRfbm9kZV9wYWdlc19pbmMobm9kZSk7Ci0JCS8qCi0JCSAqIERvbid0IHRyYWNrIG5vZGUgdGhhdCBjb250YWlucyBhY3R1YWwgcGFnZXMuCi0JCSAqCi0JCSAqIEF2b2lkIGFjcXVpcmluZyB0aGUgbGlzdF9scnUgbG9jayBpZiBhbHJlYWR5Ci0JCSAqIHVudHJhY2tlZC4gIFRoZSBsaXN0X2VtcHR5KCkgdGVzdCBpcyBzYWZlIGFzCi0JCSAqIG5vZGUtPnByaXZhdGVfbGlzdCBpcyBwcm90ZWN0ZWQgYnkKLQkJICogbWFwcGluZy0+dHJlZV9sb2NrLgotCQkgKi8KLQkJaWYgKCFsaXN0X2VtcHR5KCZub2RlLT5wcml2YXRlX2xpc3QpKQotCQkJbGlzdF9scnVfZGVsKCZ3b3JraW5nc2V0X3NoYWRvd19ub2RlcywKLQkJCQkgICAgICZub2RlLT5wcml2YXRlX2xpc3QpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBfX2FkZF90b19wYWdlX2NhY2hlX2xvY2tlZChzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJCQkgICAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKIAkJCQkgICAgICBwZ29mZl90IG9mZnNldCwgZ2ZwX3QgZ2ZwX21hc2ssCkBAIC0xOTEwLDE2ICsxOTIzLDE4IEBACiAJaWYgKGlvY2ItPmtpX2ZsYWdzICYgSU9DQl9ESVJFQ1QpIHsKIAkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7CiAJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCQlzdHJ1Y3QgaW92X2l0ZXIgZGF0YSA9ICppdGVyOwogCQlsb2ZmX3Qgc2l6ZTsKIAogCQlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwogCQlyZXR2YWwgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKG1hcHBpbmcsIGlvY2ItPmtpX3BvcywKIAkJCQkJaW9jYi0+a2lfcG9zICsgY291bnQgLSAxKTsKLQkJaWYgKCFyZXR2YWwpIHsKLQkJCXN0cnVjdCBpb3ZfaXRlciBkYXRhID0gKml0ZXI7Ci0JCQlyZXR2YWwgPSBtYXBwaW5nLT5hX29wcy0+ZGlyZWN0X0lPKGlvY2IsICZkYXRhKTsKLQkJfQorCQlpZiAocmV0dmFsIDwgMCkKKwkJCWdvdG8gb3V0OwogCisJCWZpbGVfYWNjZXNzZWQoZmlsZSk7CisKKwkJcmV0dmFsID0gbWFwcGluZy0+YV9vcHMtPmRpcmVjdF9JTyhpb2NiLCAmZGF0YSk7CiAJCWlmIChyZXR2YWwgPiAwKSB7CiAJCQlpb2NiLT5raV9wb3MgKz0gcmV0dmFsOwogCQkJaW92X2l0ZXJfYWR2YW5jZShpdGVyLCByZXR2YWwpOwpAQCAtMTkzNSwxMCArMTk1MCw4IEBACiAJCSAqIERBWCBmaWxlcywgc28gZG9uJ3QgYm90aGVyIHRyeWluZy4KIAkJICovCiAJCWlmIChyZXR2YWwgPCAwIHx8ICFpb3ZfaXRlcl9jb3VudChpdGVyKSB8fCBpb2NiLT5raV9wb3MgPj0gc2l6ZSB8fAotCQkgICAgSVNfREFYKGlub2RlKSkgewotCQkJZmlsZV9hY2Nlc3NlZChmaWxlKTsKKwkJICAgIElTX0RBWChpbm9kZSkpCiAJCQlnb3RvIG91dDsKLQkJfQogCX0KIAogCXJldHZhbCA9IGRvX2dlbmVyaWNfZmlsZV9yZWFkKGZpbGUsICZpb2NiLT5raV9wb3MsIGl0ZXIsIHJldHZhbCk7CmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuYwppbmRleCAyMzczZjBhLi4yODM1ODNmIDEwMDY0NAotLS0gYS9tbS9odWdlX21lbW9yeS5jCisrKyBiL21tL2h1Z2VfbWVtb3J5LmMKQEAgLTEwNzgsNyArMTA3OCw3IEBACiAJCWdvdG8gb3V0OwogCiAJcGFnZSA9IHBtZF9wYWdlKCpwbWQpOwotCVZNX0JVR19PTl9QQUdFKCFQYWdlSGVhZChwYWdlKSwgcGFnZSk7CisJVk1fQlVHX09OX1BBR0UoIVBhZ2VIZWFkKHBhZ2UpICYmICFpc196b25lX2RldmljZV9wYWdlKHBhZ2UpLCBwYWdlKTsKIAlpZiAoZmxhZ3MgJiBGT0xMX1RPVUNIKQogCQl0b3VjaF9wbWQodm1hLCBhZGRyLCBwbWQpOwogCWlmICgoZmxhZ3MgJiBGT0xMX01MT0NLKSAmJiAodm1hLT52bV9mbGFncyAmIFZNX0xPQ0tFRCkpIHsKQEAgLTExMTYsNyArMTExNiw3IEBACiAJfQogc2tpcF9tbG9jazoKIAlwYWdlICs9IChhZGRyICYgfkhQQUdFX1BNRF9NQVNLKSA+PiBQQUdFX1NISUZUOwotCVZNX0JVR19PTl9QQUdFKCFQYWdlQ29tcG91bmQocGFnZSksIHBhZ2UpOworCVZNX0JVR19PTl9QQUdFKCFQYWdlQ29tcG91bmQocGFnZSkgJiYgIWlzX3pvbmVfZGV2aWNlX3BhZ2UocGFnZSksIHBhZ2UpOwogCWlmIChmbGFncyAmIEZPTExfR0VUKQogCQlnZXRfcGFnZShwYWdlKTsKIApAQCAtMTEzOCw5ICsxMTM4LDYgQEAKIAlib29sIHdhc193cml0YWJsZTsKIAlpbnQgZmxhZ3MgPSAwOwogCi0JLyogQSBQUk9UX05PTkUgZmF1bHQgc2hvdWxkIG5vdCBlbmQgdXAgaGVyZSAqLwotCUJVR19PTighKHZtYS0+dm1fZmxhZ3MgJiAoVk1fUkVBRCB8IFZNX0VYRUMgfCBWTV9XUklURSkpKTsKLQogCWZlLT5wdGwgPSBwbWRfbG9jayh2bWEtPnZtX21tLCBmZS0+cG1kKTsKIAlpZiAodW5saWtlbHkoIXBtZF9zYW1lKHBtZCwgKmZlLT5wbWQpKSkKIAkJZ290byBvdXRfdW5sb2NrOwpAQCAtMTE2OCw3ICsxMTY1LDcgQEAKIAl9CiAKIAkvKiBTZWUgc2ltaWxhciBjb21tZW50IGluIGRvX251bWFfcGFnZSBmb3IgZXhwbGFuYXRpb24gKi8KLQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpKQorCWlmICghcG1kX3dyaXRlKHBtZCkpCiAJCWZsYWdzIHw9IFRORl9OT19HUk9VUDsKIAogCS8qCkBAIC0xNTEyLDcgKzE1MDksNyBAQAogCXN0cnVjdCBwYWdlICpwYWdlOwogCXBndGFibGVfdCBwZ3RhYmxlOwogCXBtZF90IF9wbWQ7Ci0JYm9vbCB5b3VuZywgd3JpdGUsIGRpcnR5OworCWJvb2wgeW91bmcsIHdyaXRlLCBkaXJ0eSwgc29mdF9kaXJ0eTsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CiAJaW50IGk7CiAKQEAgLTE1NDYsNiArMTU0Myw3IEBACiAJd3JpdGUgPSBwbWRfd3JpdGUoKnBtZCk7CiAJeW91bmcgPSBwbWRfeW91bmcoKnBtZCk7CiAJZGlydHkgPSBwbWRfZGlydHkoKnBtZCk7CisJc29mdF9kaXJ0eSA9IHBtZF9zb2Z0X2RpcnR5KCpwbWQpOwogCiAJcG1kcF9odWdlX3NwbGl0X3ByZXBhcmUodm1hLCBoYWRkciwgcG1kKTsKIAlwZ3RhYmxlID0gcGd0YWJsZV90cmFuc19odWdlX3dpdGhkcmF3KG1tLCBwbWQpOwpAQCAtMTU2Miw2ICsxNTYwLDggQEAKIAkJCXN3cF9lbnRyeV90IHN3cF9lbnRyeTsKIAkJCXN3cF9lbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5KHBhZ2UgKyBpLCB3cml0ZSk7CiAJCQllbnRyeSA9IHN3cF9lbnRyeV90b19wdGUoc3dwX2VudHJ5KTsKKwkJCWlmIChzb2Z0X2RpcnR5KQorCQkJCWVudHJ5ID0gcHRlX3N3cF9ta3NvZnRfZGlydHkoZW50cnkpOwogCQl9IGVsc2UgewogCQkJZW50cnkgPSBta19wdGUocGFnZSArIGksIHZtYS0+dm1fcGFnZV9wcm90KTsKIAkJCWVudHJ5ID0gbWF5YmVfbWt3cml0ZShlbnRyeSwgdm1hKTsKQEAgLTE1NjksNiArMTU2OSw4IEBACiAJCQkJZW50cnkgPSBwdGVfd3Jwcm90ZWN0KGVudHJ5KTsKIAkJCWlmICgheW91bmcpCiAJCQkJZW50cnkgPSBwdGVfbWtvbGQoZW50cnkpOworCQkJaWYgKHNvZnRfZGlydHkpCisJCQkJZW50cnkgPSBwdGVfbWtzb2Z0X2RpcnR5KGVudHJ5KTsKIAkJfQogCQlpZiAoZGlydHkpCiAJCQlTZXRQYWdlRGlydHkocGFnZSArIGkpOwpkaWZmIC0tZ2l0IGEvbW0va2h1Z2VwYWdlZC5jIGIvbW0va2h1Z2VwYWdlZC5jCmluZGV4IDc5YzUyZDAuLjcyOGQ3NzkgMTAwNjQ0Ci0tLSBhL21tL2todWdlcGFnZWQuYworKysgYi9tbS9raHVnZXBhZ2VkLmMKQEAgLTgzOCw3ICs4MzgsOCBAQAogICogdmFsdWUgKHNjYW4gY29kZSkuCiAgKi8KIAotc3RhdGljIGludCBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQorc3RhdGljIGludCBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKip2bWFwKQogewogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogCXVuc2lnbmVkIGxvbmcgaHN0YXJ0LCBoZW5kOwpAQCAtODQ2LDcgKzg0Nyw3IEBACiAJaWYgKHVubGlrZWx5KGtodWdlcGFnZWRfdGVzdF9leGl0KG1tKSkpCiAJCXJldHVybiBTQ0FOX0FOWV9QUk9DRVNTOwogCi0Jdm1hID0gZmluZF92bWEobW0sIGFkZHJlc3MpOworCSp2bWFwID0gdm1hID0gZmluZF92bWEobW0sIGFkZHJlc3MpOwogCWlmICghdm1hKQogCQlyZXR1cm4gU0NBTl9WTUFfTlVMTDsKIApAQCAtODgxLDYgKzg4MiwxMSBAQAogCQkucG1kID0gcG1kLAogCX07CiAKKwkvKiB3ZSBvbmx5IGRlY2lkZSB0byBzd2FwaW4sIGlmIHRoZXJlIGlzIGVub3VnaCB5b3VuZyBwdGVzICovCisJaWYgKHJlZmVyZW5jZWQgPCBIUEFHRV9QTURfTlIvMikgeworCQl0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKG1tLCBzd2FwcGVkX2luLCByZWZlcmVuY2VkLCAwKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KIAlmZS5wdGUgPSBwdGVfb2Zmc2V0X21hcChwbWQsIGFkZHJlc3MpOwogCWZvciAoOyBmZS5hZGRyZXNzIDwgYWRkcmVzcyArIEhQQUdFX1BNRF9OUipQQUdFX1NJWkU7CiAJCQlmZS5wdGUrKywgZmUuYWRkcmVzcyArPSBQQUdFX1NJWkUpIHsKQEAgLTg4OCwxNyArODk0LDEyIEBACiAJCWlmICghaXNfc3dhcF9wdGUocHRldmFsKSkKIAkJCWNvbnRpbnVlOwogCQlzd2FwcGVkX2luKys7Ci0JCS8qIHdlIG9ubHkgZGVjaWRlIHRvIHN3YXBpbiwgaWYgdGhlcmUgaXMgZW5vdWdoIHlvdW5nIHB0ZXMgKi8KLQkJaWYgKHJlZmVyZW5jZWQgPCBIUEFHRV9QTURfTlIvMikgewotCQkJdHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbihtbSwgc3dhcHBlZF9pbiwgcmVmZXJlbmNlZCwgMCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KIAkJcmV0ID0gZG9fc3dhcF9wYWdlKCZmZSwgcHRldmFsKTsKIAogCQkvKiBkb19zd2FwX3BhZ2UgcmV0dXJucyBWTV9GQVVMVF9SRVRSWSB3aXRoIHJlbGVhc2VkIG1tYXBfc2VtICovCiAJCWlmIChyZXQgJiBWTV9GQVVMVF9SRVRSWSkgewogCQkJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOwotCQkJaWYgKGh1Z2VwYWdlX3ZtYV9yZXZhbGlkYXRlKG1tLCBhZGRyZXNzKSkgeworCQkJaWYgKGh1Z2VwYWdlX3ZtYV9yZXZhbGlkYXRlKG1tLCBhZGRyZXNzLCAmZmUudm1hKSkgewogCQkJCS8qIHZtYSBpcyBubyBsb25nZXIgYXZhaWxhYmxlLCBkb24ndCBjb250aW51ZSB0byBzd2FwaW4gKi8KIAkJCQl0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKG1tLCBzd2FwcGVkX2luLCByZWZlcmVuY2VkLCAwKTsKIAkJCQlyZXR1cm4gZmFsc2U7CkBAIC05MjMsNyArOTI0LDYgQEAKIHN0YXRpYyB2b2lkIGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQkgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiAJCQkJICAgc3RydWN0IHBhZ2UgKipocGFnZSwKLQkJCQkgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCQkgICBpbnQgbm9kZSwgaW50IHJlZmVyZW5jZWQpCiB7CiAJcG1kX3QgKnBtZCwgX3BtZDsKQEAgLTkzMyw2ICs5MzMsNyBAQAogCXNwaW5sb2NrX3QgKnBtZF9wdGwsICpwdGVfcHRsOwogCWludCBpc29sYXRlZCA9IDAsIHJlc3VsdCA9IDA7CiAJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogCXVuc2lnbmVkIGxvbmcgbW11bl9zdGFydDsJLyogRm9yIG1tdV9ub3RpZmllcnMgKi8KIAl1bnNpZ25lZCBsb25nIG1tdW5fZW5kOwkJLyogRm9yIG1tdV9ub3RpZmllcnMgKi8KIAlnZnBfdCBnZnA7CkBAIC05NjEsNyArOTYyLDcgQEAKIAl9CiAKIAlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7Ci0JcmVzdWx0ID0gaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUobW0sIGFkZHJlc3MpOworCXJlc3VsdCA9IGh1Z2VwYWdlX3ZtYV9yZXZhbGlkYXRlKG1tLCBhZGRyZXNzLCAmdm1hKTsKIAlpZiAocmVzdWx0KSB7CiAJCW1lbV9jZ3JvdXBfY2FuY2VsX2NoYXJnZShuZXdfcGFnZSwgbWVtY2csIHRydWUpOwogCQl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOwpAQCAtOTk0LDcgKzk5NSw3IEBACiAJICogaGFuZGxlZCBieSB0aGUgYW5vbl92bWEgbG9jayArIFBHX2xvY2suCiAJICovCiAJZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKLQlyZXN1bHQgPSBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZShtbSwgYWRkcmVzcyk7CisJcmVzdWx0ID0gaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUobW0sIGFkZHJlc3MsICZ2bWEpOwogCWlmIChyZXN1bHQpCiAJCWdvdG8gb3V0OwogCS8qIGNoZWNrIGlmIHRoZSBwbWQgaXMgc3RpbGwgdmFsaWQgKi8KQEAgLTEyMDIsNyArMTIwMyw3IEBACiAJaWYgKHJldCkgewogCQlub2RlID0ga2h1Z2VwYWdlZF9maW5kX3RhcmdldF9ub2RlKCk7CiAJCS8qIGNvbGxhcHNlX2h1Z2VfcGFnZSB3aWxsIHJldHVybiB3aXRoIHRoZSBtbWFwX3NlbSByZWxlYXNlZCAqLwotCQljb2xsYXBzZV9odWdlX3BhZ2UobW0sIGFkZHJlc3MsIGhwYWdlLCB2bWEsIG5vZGUsIHJlZmVyZW5jZWQpOworCQljb2xsYXBzZV9odWdlX3BhZ2UobW0sIGFkZHJlc3MsIGhwYWdlLCBub2RlLCByZWZlcmVuY2VkKTsKIAl9CiBvdXQ6CiAJdHJhY2VfbW1fa2h1Z2VwYWdlZF9zY2FuX3BtZChtbSwgcGFnZSwgd3JpdGFibGUsIHJlZmVyZW5jZWQsCmRpZmYgLS1naXQgYS9tbS9rc20uYyBiL21tL2tzbS5jCmluZGV4IDczZDQzYmEuLjUwNDgwODMgMTAwNjQ0Ci0tLSBhL21tL2tzbS5jCisrKyBiL21tL2tzbS5jCkBAIC0yODMsNyArMjgzLDggQEAKIHsKIAlzdHJ1Y3Qgcm1hcF9pdGVtICpybWFwX2l0ZW07CiAKLQlybWFwX2l0ZW0gPSBrbWVtX2NhY2hlX3phbGxvYyhybWFwX2l0ZW1fY2FjaGUsIEdGUF9LRVJORUwpOworCXJtYXBfaXRlbSA9IGttZW1fY2FjaGVfemFsbG9jKHJtYXBfaXRlbV9jYWNoZSwgR0ZQX0tFUk5FTCB8CisJCQkJCQlfX0dGUF9OT1JFVFJZIHwgX19HRlBfTk9XQVJOKTsKIAlpZiAocm1hcF9pdGVtKQogCQlrc21fcm1hcF9pdGVtcysrOwogCXJldHVybiBybWFwX2l0ZW07CmRpZmYgLS1naXQgYS9tbS9tZW1jb250cm9sLmMgYi9tbS9tZW1jb250cm9sLmMKaW5kZXggMmZmMDI4OS4uNGJlNTE4ZCAxMDA2NDQKLS0tIGEvbW0vbWVtY29udHJvbC5jCisrKyBiL21tL21lbWNvbnRyb2wuYwpAQCAtMTc0MCwxNyArMTc0MCwyMiBAQAogc3RhdGljIGJvb2wgY29uc3VtZV9zdG9jayhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHVuc2lnbmVkIGludCBucl9wYWdlcykKIHsKIAlzdHJ1Y3QgbWVtY2dfc3RvY2tfcGNwICpzdG9jazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWJvb2wgcmV0ID0gZmFsc2U7CiAKIAlpZiAobnJfcGFnZXMgPiBDSEFSR0VfQkFUQ0gpCiAJCXJldHVybiByZXQ7CiAKLQlzdG9jayA9ICZnZXRfY3B1X3ZhcihtZW1jZ19zdG9jayk7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJc3RvY2sgPSB0aGlzX2NwdV9wdHIoJm1lbWNnX3N0b2NrKTsKIAlpZiAobWVtY2cgPT0gc3RvY2stPmNhY2hlZCAmJiBzdG9jay0+bnJfcGFnZXMgPj0gbnJfcGFnZXMpIHsKIAkJc3RvY2stPm5yX3BhZ2VzIC09IG5yX3BhZ2VzOwogCQlyZXQgPSB0cnVlOwogCX0KLQlwdXRfY3B1X3ZhcihtZW1jZ19zdG9jayk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNzcxLDE1ICsxNzc2LDE4IEBACiAJc3RvY2stPmNhY2hlZCA9IE5VTEw7CiB9CiAKLS8qCi0gKiBUaGlzIG11c3QgYmUgY2FsbGVkIHVuZGVyIHByZWVtcHQgZGlzYWJsZWQgb3IgbXVzdCBiZSBjYWxsZWQgYnkKLSAqIGEgdGhyZWFkIHdoaWNoIGlzIHBpbm5lZCB0byBsb2NhbCBjcHUuCi0gKi8KIHN0YXRpYyB2b2lkIGRyYWluX2xvY2FsX3N0b2NrKHN0cnVjdCB3b3JrX3N0cnVjdCAqZHVtbXkpCiB7Ci0Jc3RydWN0IG1lbWNnX3N0b2NrX3BjcCAqc3RvY2sgPSB0aGlzX2NwdV9wdHIoJm1lbWNnX3N0b2NrKTsKKwlzdHJ1Y3QgbWVtY2dfc3RvY2tfcGNwICpzdG9jazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJc3RvY2sgPSB0aGlzX2NwdV9wdHIoJm1lbWNnX3N0b2NrKTsKIAlkcmFpbl9zdG9jayhzdG9jayk7CiAJY2xlYXJfYml0KEZMVVNISU5HX0NBQ0hFRF9DSEFSR0UsICZzdG9jay0+ZmxhZ3MpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiAvKgpAQCAtMTc4OCwxNCArMTc5NiwxOSBAQAogICovCiBzdGF0aWMgdm9pZCByZWZpbGxfc3RvY2soc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCB1bnNpZ25lZCBpbnQgbnJfcGFnZXMpCiB7Ci0Jc3RydWN0IG1lbWNnX3N0b2NrX3BjcCAqc3RvY2sgPSAmZ2V0X2NwdV92YXIobWVtY2dfc3RvY2spOworCXN0cnVjdCBtZW1jZ19zdG9ja19wY3AgKnN0b2NrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlzdG9jayA9IHRoaXNfY3B1X3B0cigmbWVtY2dfc3RvY2spOwogCWlmIChzdG9jay0+Y2FjaGVkICE9IG1lbWNnKSB7IC8qIHJlc2V0IGlmIG5lY2Vzc2FyeSAqLwogCQlkcmFpbl9zdG9jayhzdG9jayk7CiAJCXN0b2NrLT5jYWNoZWQgPSBtZW1jZzsKIAl9CiAJc3RvY2stPm5yX3BhZ2VzICs9IG5yX3BhZ2VzOwotCXB1dF9jcHVfdmFyKG1lbWNnX3N0b2NrKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogLyoKQEAgLTQwODIsMjQgKzQwOTUsNiBAQAogCWF0b21pY19hZGQobiwgJm1lbWNnLT5pZC5yZWYpOwogfQogCi1zdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbV9jZ3JvdXBfaWRfZ2V0X29ubGluZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCi17Ci0Jd2hpbGUgKCFhdG9taWNfaW5jX25vdF96ZXJvKCZtZW1jZy0+aWQucmVmKSkgewotCQkvKgotCQkgKiBUaGUgcm9vdCBjZ3JvdXAgY2Fubm90IGJlIGRlc3Ryb3llZCwgc28gaXQncyByZWZjb3VudCBtdXN0Ci0JCSAqIGFsd2F5cyBiZSA+PSAxLgotCQkgKi8KLQkJaWYgKFdBUk5fT05fT05DRShtZW1jZyA9PSByb290X21lbV9jZ3JvdXApKSB7Ci0JCQlWTV9CVUdfT04oMSk7Ci0JCQlicmVhazsKLQkJfQotCQltZW1jZyA9IHBhcmVudF9tZW1fY2dyb3VwKG1lbWNnKTsKLQkJaWYgKCFtZW1jZykKLQkJCW1lbWNnID0gcm9vdF9tZW1fY2dyb3VwOwotCX0KLQlyZXR1cm4gbWVtY2c7Ci19Ci0KIHN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfaWRfcHV0X21hbnkoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCB1bnNpZ25lZCBpbnQgbikKIHsKIAlpZiAoYXRvbWljX3N1Yl9hbmRfdGVzdChuLCAmbWVtY2ctPmlkLnJlZikpIHsKQEAgLTU4MjEsNiArNTgxNiwyNCBAQAogc3Vic3lzX2luaXRjYWxsKG1lbV9jZ3JvdXBfaW5pdCk7CiAKICNpZmRlZiBDT05GSUdfTUVNQ0dfU1dBUAorc3RhdGljIHN0cnVjdCBtZW1fY2dyb3VwICptZW1fY2dyb3VwX2lkX2dldF9vbmxpbmUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQoreworCXdoaWxlICghYXRvbWljX2luY19ub3RfemVybygmbWVtY2ctPmlkLnJlZikpIHsKKwkJLyoKKwkJICogVGhlIHJvb3QgY2dyb3VwIGNhbm5vdCBiZSBkZXN0cm95ZWQsIHNvIGl0J3MgcmVmY291bnQgbXVzdAorCQkgKiBhbHdheXMgYmUgPj0gMS4KKwkJICovCisJCWlmIChXQVJOX09OX09OQ0UobWVtY2cgPT0gcm9vdF9tZW1fY2dyb3VwKSkgeworCQkJVk1fQlVHX09OKDEpOworCQkJYnJlYWs7CisJCX0KKwkJbWVtY2cgPSBwYXJlbnRfbWVtX2Nncm91cChtZW1jZyk7CisJCWlmICghbWVtY2cpCisJCQltZW1jZyA9IHJvb3RfbWVtX2Nncm91cDsKKwl9CisJcmV0dXJuIG1lbWNnOworfQorCiAvKioKICAqIG1lbV9jZ3JvdXBfc3dhcG91dCAtIHRyYW5zZmVyIGEgbWVtc3cgY2hhcmdlIHRvIHN3YXAKICAqIEBwYWdlOiBwYWdlIHdob3NlIG1lbXN3IGNoYXJnZSB0byB0cmFuc2ZlcgpkaWZmIC0tZ2l0IGEvbW0vbWVtb3J5LmMgYi9tbS9tZW1vcnkuYwppbmRleCA4M2JlOTlkLi5mMWE2ODA0IDEwMDY0NAotLS0gYS9tbS9tZW1vcnkuYworKysgYi9tbS9tZW1vcnkuYwpAQCAtMzM1MSw5ICszMzUxLDYgQEAKIAlib29sIHdhc193cml0YWJsZSA9IHB0ZV93cml0ZShwdGUpOwogCWludCBmbGFncyA9IDA7CiAKLQkvKiBBIFBST1RfTk9ORSBmYXVsdCBzaG91bGQgbm90IGVuZCB1cCBoZXJlICovCi0JQlVHX09OKCEodm1hLT52bV9mbGFncyAmIChWTV9SRUFEIHwgVk1fRVhFQyB8IFZNX1dSSVRFKSkpOwotCiAJLyoKIAkqIFRoZSAicHRlIiBhdCB0aGlzIHBvaW50IGNhbm5vdCBiZSB1c2VkIHNhZmVseSB3aXRob3V0CiAJKiB2YWxpZGF0aW9uIHRocm91Z2ggcHRlX3VubWFwX3NhbWUoKS4gSXQncyBvZiBOVU1BIHR5cGUgYnV0CkBAIC0zMzk4LDcgKzMzOTUsNyBAQAogCSAqIHB0ZV9kaXJ0eSBoYXMgdW5wcmVkaWN0YWJsZSBiZWhhdmlvdXIgYmV0d2VlbiBQVEUgc2NhbiB1cGRhdGVzLAogCSAqIGJhY2tncm91bmQgd3JpdGViYWNrLCBkaXJ0eSBiYWxhbmNpbmcgYW5kIGFwcGxpY2F0aW9uIGJlaGF2aW91ci4KIAkgKi8KLQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpKQorCWlmICghcHRlX3dyaXRlKHB0ZSkpCiAJCWZsYWdzIHw9IFRORl9OT19HUk9VUDsKIAogCS8qCkBAIC0zNDU4LDYgKzM0NTUsMTEgQEAKIAlyZXR1cm4gVk1fRkFVTFRfRkFMTEJBQ0s7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCB2bWFfaXNfYWNjZXNzaWJsZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlyZXR1cm4gdm1hLT52bV9mbGFncyAmIChWTV9SRUFEIHwgVk1fRVhFQyB8IFZNX1dSSVRFKTsKK30KKwogLyoKICAqIFRoZXNlIHJvdXRpbmVzIGFsc28gbmVlZCB0byBoYW5kbGUgc3R1ZmYgbGlrZSBtYXJraW5nIHBhZ2VzIGRpcnR5CiAgKiBhbmQvb3IgYWNjZXNzZWQgZm9yIGFyY2hpdGVjdHVyZXMgdGhhdCBkb24ndCBkbyBpdCBpbiBoYXJkd2FyZSAobW9zdApAQCAtMzUyNCw3ICszNTI2LDcgQEAKIAlpZiAoIXB0ZV9wcmVzZW50KGVudHJ5KSkKIAkJcmV0dXJuIGRvX3N3YXBfcGFnZShmZSwgZW50cnkpOwogCi0JaWYgKHB0ZV9wcm90bm9uZShlbnRyeSkpCisJaWYgKHB0ZV9wcm90bm9uZShlbnRyeSkgJiYgdm1hX2lzX2FjY2Vzc2libGUoZmUtPnZtYSkpCiAJCXJldHVybiBkb19udW1hX3BhZ2UoZmUsIGVudHJ5KTsKIAogCWZlLT5wdGwgPSBwdGVfbG9ja3B0cihmZS0+dm1hLT52bV9tbSwgZmUtPnBtZCk7CkBAIC0zNTkwLDcgKzM1OTIsNyBAQAogCiAJCWJhcnJpZXIoKTsKIAkJaWYgKHBtZF90cmFuc19odWdlKG9yaWdfcG1kKSB8fCBwbWRfZGV2bWFwKG9yaWdfcG1kKSkgewotCQkJaWYgKHBtZF9wcm90bm9uZShvcmlnX3BtZCkpCisJCQlpZiAocG1kX3Byb3Rub25lKG9yaWdfcG1kKSAmJiB2bWFfaXNfYWNjZXNzaWJsZSh2bWEpKQogCQkJCXJldHVybiBkb19odWdlX3BtZF9udW1hX3BhZ2UoJmZlLCBvcmlnX3BtZCk7CiAKIAkJCWlmICgoZmUuZmxhZ3MgJiBGQVVMVF9GTEFHX1dSSVRFKSAmJgpkaWZmIC0tZ2l0IGEvbW0vbWVtb3J5X2hvdHBsdWcuYyBiL21tL21lbW9yeV9ob3RwbHVnLmMKaW5kZXggNDEyNjZkYy4uOWQyOWJhMCAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5X2hvdHBsdWcuYworKysgYi9tbS9tZW1vcnlfaG90cGx1Zy5jCkBAIC0xNTU1LDggKzE1NTUsOCBAQAogewogCWdmcF90IGdmcF9tYXNrID0gR0ZQX1VTRVIgfCBfX0dGUF9NT1ZBQkxFOwogCWludCBuaWQgPSBwYWdlX3RvX25pZChwYWdlKTsKLQlub2RlbWFza190IG5tYXNrID0gbm9kZV9vbmxpbmVfbWFwOwotCXN0cnVjdCBwYWdlICpuZXdfcGFnZTsKKwlub2RlbWFza190IG5tYXNrID0gbm9kZV9zdGF0ZXNbTl9NRU1PUlldOworCXN0cnVjdCBwYWdlICpuZXdfcGFnZSA9IE5VTEw7CiAKIAkvKgogCSAqIFRPRE86IGFsbG9jYXRlIGEgZGVzdGluYXRpb24gaHVnZXBhZ2UgZnJvbSBhIG5lYXJlc3QgbmVpZ2hib3Igbm9kZSwKQEAgLTE1NjgsMTEgKzE1NjgsMTMgQEAKIAkJCQkJbmV4dF9ub2RlX2luKG5pZCwgbm1hc2spKTsKIAogCW5vZGVfY2xlYXIobmlkLCBubWFzayk7CisKIAlpZiAoUGFnZUhpZ2hNZW0ocGFnZSkKIAkgICAgfHwgKHpvbmVfaWR4KHBhZ2Vfem9uZShwYWdlKSkgPT0gWk9ORV9NT1ZBQkxFKSkKIAkJZ2ZwX21hc2sgfD0gX19HRlBfSElHSE1FTTsKIAotCW5ld19wYWdlID0gX19hbGxvY19wYWdlc19ub2RlbWFzayhnZnBfbWFzaywgMCwKKwlpZiAoIW5vZGVzX2VtcHR5KG5tYXNrKSkKKwkJbmV3X3BhZ2UgPSBfX2FsbG9jX3BhZ2VzX25vZGVtYXNrKGdmcF9tYXNrLCAwLAogCQkJCQlub2RlX3pvbmVsaXN0KG5pZCwgZ2ZwX21hc2spLCAmbm1hc2spOwogCWlmICghbmV3X3BhZ2UpCiAJCW5ld19wYWdlID0gX19hbGxvY19wYWdlcyhnZnBfbWFzaywgMCwKZGlmZiAtLWdpdCBhL21tL21lbXBvbGljeS5jIGIvbW0vbWVtcG9saWN5LmMKaW5kZXggZDhjNGUzOC4uMmRhNzJhNSAxMDA2NDQKLS0tIGEvbW0vbWVtcG9saWN5LmMKKysrIGIvbW0vbWVtcG9saWN5LmMKQEAgLTIzMzYsNiArMjMzNiwyMyBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qCisgKiBEcm9wIHRoZSAocG9zc2libHkgZmluYWwpIHJlZmVyZW5jZSB0byB0YXNrLT5tZW1wb2xpY3kuICBJdCBuZWVkcyB0byBiZQorICogZHJvcHBlZCBhZnRlciB0YXNrLT5tZW1wb2xpY3kgaXMgc2V0IHRvIE5VTEwgc28gdGhhdCBhbnkgYWxsb2NhdGlvbiBkb25lIGFzCisgKiBwYXJ0IG9mIGl0cyBrbWVtX2NhY2hlX2ZyZWUoKSwgc3VjaCBhcyBieSBLQVNBTiwgZG9lc24ndCByZWZlcmVuY2UgYSBmcmVlZAorICogcG9saWN5LgorICovCit2b2lkIG1wb2xfcHV0X3Rhc2tfcG9saWN5KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlzdHJ1Y3QgbWVtcG9saWN5ICpwb2w7CisKKwl0YXNrX2xvY2sodGFzayk7CisJcG9sID0gdGFzay0+bWVtcG9saWN5OworCXRhc2stPm1lbXBvbGljeSA9IE5VTEw7CisJdGFza191bmxvY2sodGFzayk7CisJbXBvbF9wdXQocG9sKTsKK30KKwogc3RhdGljIHZvaWQgc3BfZGVsZXRlKHN0cnVjdCBzaGFyZWRfcG9saWN5ICpzcCwgc3RydWN0IHNwX25vZGUgKm4pCiB7CiAJcHJfZGVidWcoImRlbGV0aW5nICVseC1sJWx4XG4iLCBuLT5zdGFydCwgbi0+ZW5kKTsKZGlmZiAtLWdpdCBhL21tL21tYXAuYyBiL21tL21tYXAuYwppbmRleCBjYTlkOTFiLi43YTA3MDdhIDEwMDY0NAotLS0gYS9tbS9tbWFwLmMKKysrIGIvbW0vbW1hcC5jCkBAIC04OCw2ICs4OCwxMSBAQAogICoJCXc6IChubykgbm8JdzogKG5vKSBubwl3OiAoY29weSkgY29weQl3OiAobm8pIG5vCiAgKgkJeDogKG5vKSBubwl4OiAobm8pIHllcwl4OiAobm8pIHllcwl4OiAoeWVzKSB5ZXMKICAqCisgKiBPbiBhcm02NCwgUFJPVF9FWEVDIGhhcyB0aGUgZm9sbG93aW5nIGJlaGF2aW91ciBmb3IgYm90aCBNQVBfU0hBUkVEIGFuZAorICogTUFQX1BSSVZBVEU6CisgKgkJCQkJCQkJcjogKG5vKSBubworICoJCQkJCQkJCXc6IChubykgbm8KKyAqCQkJCQkJCQl4OiAoeWVzKSB5ZXMKICAqLwogcGdwcm90X3QgcHJvdGVjdGlvbl9tYXBbMTZdID0gewogCV9fUDAwMCwgX19QMDAxLCBfX1AwMTAsIF9fUDAxMSwgX19QMTAwLCBfX1AxMDEsIF9fUDExMCwgX19QMTExLApAQCAtMzA2Myw2ICszMDY4LDE0IEBACiAJcmV0dXJuIEVSUl9QVFIocmV0KTsKIH0KIAorYm9vbCB2bWFfaXNfc3BlY2lhbF9tYXBwaW5nKGNvbnN0IHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCWNvbnN0IHN0cnVjdCB2bV9zcGVjaWFsX21hcHBpbmcgKnNtKQoreworCXJldHVybiB2bWEtPnZtX3ByaXZhdGVfZGF0YSA9PSBzbSAmJgorCQkodm1hLT52bV9vcHMgPT0gJnNwZWNpYWxfbWFwcGluZ192bW9wcyB8fAorCQkgdm1hLT52bV9vcHMgPT0gJmxlZ2FjeV9zcGVjaWFsX21hcHBpbmdfdm1vcHMpOworfQorCiAvKgogICogQ2FsbGVkIHdpdGggbW0tPm1tYXBfc2VtIGhlbGQgZm9yIHdyaXRpbmcuCiAgKiBJbnNlcnQgYSBuZXcgdm1hIGNvdmVyaW5nIHRoZSBnaXZlbiByZWdpb24sIHdpdGggdGhlIGdpdmVuIGZsYWdzLgpkaWZmIC0tZ2l0IGEvbW0vcGFnZS13cml0ZWJhY2suYyBiL21tL3BhZ2Utd3JpdGViYWNrLmMKaW5kZXggZjRjZDdkOC4uMjhkNmYzNiAxMDA2NDQKLS0tIGEvbW0vcGFnZS13cml0ZWJhY2suYworKysgYi9tbS9wYWdlLXdyaXRlYmFjay5jCkBAIC0yMDgwLDI2ICsyMDgwLDEyIEBACiAJCXJhdGVsaW1pdF9wYWdlcyA9IDE2OwogfQogCi1zdGF0aWMgaW50Ci1yYXRlbGltaXRfaGFuZGxlcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLAotCQkgIHZvaWQgKmhjcHUpCitzdGF0aWMgaW50IHBhZ2Vfd3JpdGViYWNrX2NwdV9vbmxpbmUodW5zaWduZWQgaW50IGNwdSkKIHsKLQotCXN3aXRjaCAoYWN0aW9uICYgfkNQVV9UQVNLU19GUk9aRU4pIHsKLQljYXNlIENQVV9PTkxJTkU6Ci0JY2FzZSBDUFVfREVBRDoKLQkJd3JpdGViYWNrX3NldF9yYXRlbGltaXQoKTsKLQkJcmV0dXJuIE5PVElGWV9PSzsKLQlkZWZhdWx0OgotCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0JfQorCXdyaXRlYmFja19zZXRfcmF0ZWxpbWl0KCk7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcmF0ZWxpbWl0X25iID0gewotCS5ub3RpZmllcl9jYWxsCT0gcmF0ZWxpbWl0X2hhbmRsZXIsCi0JLm5leHQJCT0gTlVMTCwKLX07Ci0KIC8qCiAgKiBDYWxsZWQgZWFybHkgb24gdG8gdHVuZSB0aGUgcGFnZSB3cml0ZWJhY2sgZGlydHkgbGltaXRzLgogICoKQEAgLTIxMjIsOCArMjEwOCwxMCBAQAogewogCUJVR19PTih3Yl9kb21haW5faW5pdCgmZ2xvYmFsX3diX2RvbWFpbiwgR0ZQX0tFUk5FTCkpOwogCi0Jd3JpdGViYWNrX3NldF9yYXRlbGltaXQoKTsKLQlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnJhdGVsaW1pdF9uYik7CisJY3B1aHBfc2V0dXBfc3RhdGUoQ1BVSFBfQVBfT05MSU5FX0RZTiwgIm1tL3dyaXRlYmFjazpvbmxpbmUiLAorCQkJICBwYWdlX3dyaXRlYmFja19jcHVfb25saW5lLCBOVUxMKTsKKwljcHVocF9zZXR1cF9zdGF0ZShDUFVIUF9NTV9XUklURUJBQ0tfREVBRCwgIm1tL3dyaXRlYmFjazpkZWFkIiwgTlVMTCwKKwkJCSAgcGFnZV93cml0ZWJhY2tfY3B1X29ubGluZSk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvYy5jIGIvbW0vcGFnZV9hbGxvYy5jCmluZGV4IDNmYmU3M2EuLmEyMjE0YzYgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfYWxsb2MuYworKysgYi9tbS9wYWdlX2FsbG9jLmMKQEAgLTMxMzcsNTQgKzMxMzcsNiBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wKLXNob3VsZF9jb21wYWN0X3JldHJ5KHN0cnVjdCBhbGxvY19jb250ZXh0ICphYywgaW50IG9yZGVyLCBpbnQgYWxsb2NfZmxhZ3MsCi0JCSAgICAgZW51bSBjb21wYWN0X3Jlc3VsdCBjb21wYWN0X3Jlc3VsdCwKLQkJICAgICBlbnVtIGNvbXBhY3RfcHJpb3JpdHkgKmNvbXBhY3RfcHJpb3JpdHksCi0JCSAgICAgaW50IGNvbXBhY3Rpb25fcmV0cmllcykKLXsKLQlpbnQgbWF4X3JldHJpZXMgPSBNQVhfQ09NUEFDVF9SRVRSSUVTOwotCi0JaWYgKCFvcmRlcikKLQkJcmV0dXJuIGZhbHNlOwotCi0JLyoKLQkgKiBjb21wYWN0aW9uIGNvbnNpZGVycyBhbGwgdGhlIHpvbmUgYXMgZGVzcGVyYXRlbHkgb3V0IG9mIG1lbW9yeQotCSAqIHNvIGl0IGRvZXNuJ3QgcmVhbGx5IG1ha2UgbXVjaCBzZW5zZSB0byByZXRyeSBleGNlcHQgd2hlbiB0aGUKLQkgKiBmYWlsdXJlIGNvdWxkIGJlIGNhdXNlZCBieSBpbnN1ZmZpY2llbnQgcHJpb3JpdHkKLQkgKi8KLQlpZiAoY29tcGFjdGlvbl9mYWlsZWQoY29tcGFjdF9yZXN1bHQpKSB7Ci0JCWlmICgqY29tcGFjdF9wcmlvcml0eSA+IE1JTl9DT01QQUNUX1BSSU9SSVRZKSB7Ci0JCQkoKmNvbXBhY3RfcHJpb3JpdHkpLS07Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBtYWtlIHN1cmUgdGhlIGNvbXBhY3Rpb24gd2Fzbid0IGRlZmVycmVkIG9yIGRpZG4ndCBiYWlsIG91dCBlYXJseQotCSAqIGR1ZSB0byBsb2NrcyBjb250ZW50aW9uIGJlZm9yZSB3ZSBkZWNsYXJlIHRoYXQgd2Ugc2hvdWxkIGdpdmUgdXAuCi0JICogQnV0IGRvIG5vdCByZXRyeSBpZiB0aGUgZ2l2ZW4gem9uZWxpc3QgaXMgbm90IHN1aXRhYmxlIGZvcgotCSAqIGNvbXBhY3Rpb24uCi0JICovCi0JaWYgKGNvbXBhY3Rpb25fd2l0aGRyYXduKGNvbXBhY3RfcmVzdWx0KSkKLQkJcmV0dXJuIGNvbXBhY3Rpb25fem9uZWxpc3Rfc3VpdGFibGUoYWMsIG9yZGVyLCBhbGxvY19mbGFncyk7Ci0KLQkvKgotCSAqICFjb3N0bHkgcmVxdWVzdHMgYXJlIG11Y2ggbW9yZSBpbXBvcnRhbnQgdGhhbiBfX0dGUF9SRVBFQVQKLQkgKiBjb3N0bHkgb25lcyBiZWNhdXNlIHRoZXkgYXJlIGRlIGZhY3RvIG5vZmFpbCBhbmQgaW52b2tlIE9PTQotCSAqIGtpbGxlciB0byBtb3ZlIG9uIHdoaWxlIGNvc3RseSBjYW4gZmFpbCBhbmQgdXNlcnMgYXJlIHJlYWR5Ci0JICogdG8gY29wZSB3aXRoIHRoYXQuIDEvNCByZXRyaWVzIGlzIHJhdGhlciBhcmJpdHJhcnkgYnV0IHdlCi0JICogd291bGQgbmVlZCBtdWNoIG1vcmUgZGV0YWlsZWQgZmVlZGJhY2sgZnJvbSBjb21wYWN0aW9uIHRvCi0JICogbWFrZSBhIGJldHRlciBkZWNpc2lvbi4KLQkgKi8KLQlpZiAob3JkZXIgPiBQQUdFX0FMTE9DX0NPU1RMWV9PUkRFUikKLQkJbWF4X3JldHJpZXMgLz0gNDsKLQlpZiAoY29tcGFjdGlvbl9yZXRyaWVzIDw9IG1heF9yZXRyaWVzKQotCQlyZXR1cm4gdHJ1ZTsKLQotCXJldHVybiBmYWxzZTsKLX0KICNlbHNlCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICoKIF9fYWxsb2NfcGFnZXNfZGlyZWN0X2NvbXBhY3QoZ2ZwX3QgZ2ZwX21hc2ssIHVuc2lnbmVkIGludCBvcmRlciwKQEAgLTMxOTUsNiArMzE0Nyw4IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKKyNlbmRpZiAvKiBDT05GSUdfQ09NUEFDVElPTiAqLworCiBzdGF0aWMgaW5saW5lIGJvb2wKIHNob3VsZF9jb21wYWN0X3JldHJ5KHN0cnVjdCBhbGxvY19jb250ZXh0ICphYywgdW5zaWduZWQgaW50IG9yZGVyLCBpbnQgYWxsb2NfZmxhZ3MsCiAJCSAgICAgZW51bSBjb21wYWN0X3Jlc3VsdCBjb21wYWN0X3Jlc3VsdCwKQEAgLTMyMjEsNyArMzE3NSw2IEBACiAJfQogCXJldHVybiBmYWxzZTsKIH0KLSNlbmRpZiAvKiBDT05GSUdfQ09NUEFDVElPTiAqLwogCiAvKiBQZXJmb3JtIGRpcmVjdCBzeW5jaHJvbm91cyBwYWdlIHJlY2xhaW0gKi8KIHN0YXRpYyBpbnQKQEAgLTQ0MDcsNyArNDM2MCw3IEBACiAJZG8gewogCQl6b25lX3R5cGUtLTsKIAkJem9uZSA9IHBnZGF0LT5ub2RlX3pvbmVzICsgem9uZV90eXBlOwotCQlpZiAocG9wdWxhdGVkX3pvbmUoem9uZSkpIHsKKwkJaWYgKG1hbmFnZWRfem9uZSh6b25lKSkgewogCQkJem9uZXJlZl9zZXRfem9uZSh6b25lLAogCQkJCSZ6b25lbGlzdC0+X3pvbmVyZWZzW25yX3pvbmVzKytdKTsKIAkJCWNoZWNrX2hpZ2hlc3Rfem9uZSh6b25lX3R5cGUpOwpAQCAtNDY0NSw3ICs0NTk4LDcgQEAKIAkJZm9yIChqID0gMDsgaiA8IG5yX25vZGVzOyBqKyspIHsKIAkJCW5vZGUgPSBub2RlX29yZGVyW2pdOwogCQkJeiA9ICZOT0RFX0RBVEEobm9kZSktPm5vZGVfem9uZXNbem9uZV90eXBlXTsKLQkJCWlmIChwb3B1bGF0ZWRfem9uZSh6KSkgeworCQkJaWYgKG1hbmFnZWRfem9uZSh6KSkgewogCQkJCXpvbmVyZWZfc2V0X3pvbmUoeiwKIAkJCQkJJnpvbmVsaXN0LT5fem9uZXJlZnNbcG9zKytdKTsKIAkJCQljaGVja19oaWdoZXN0X3pvbmUoem9uZV90eXBlKTsKZGlmZiAtLWdpdCBhL21tL3BhZ2VfaW8uYyBiL21tL3BhZ2VfaW8uYwppbmRleCAxNmJkODJmYS4uZWFmZTVkZCAxMDA2NDQKLS0tIGEvbW0vcGFnZV9pby5jCisrKyBiL21tL3BhZ2VfaW8uYwpAQCAtMjY0LDYgKzI2NCw3IEBACiAJaW50IHJldDsKIAlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lzID0gcGFnZV9zd2FwX2luZm8ocGFnZSk7CiAKKwlCVUdfT04oIVBhZ2VTd2FwQ2FjaGUocGFnZSkpOwogCWlmIChzaXMtPmZsYWdzICYgU1dQX0ZJTEUpIHsKIAkJc3RydWN0IGtpb2NiIGtpb2NiOwogCQlzdHJ1Y3QgZmlsZSAqc3dhcF9maWxlID0gc2lzLT5zd2FwX2ZpbGU7CkBAIC0zMzcsNiArMzM4LDcgQEAKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lzID0gcGFnZV9zd2FwX2luZm8ocGFnZSk7CiAKKwlCVUdfT04oIVBhZ2VTd2FwQ2FjaGUocGFnZSkpOwogCVZNX0JVR19PTl9QQUdFKCFQYWdlTG9ja2VkKHBhZ2UpLCBwYWdlKTsKIAlWTV9CVUdfT05fUEFHRShQYWdlVXB0b2RhdGUocGFnZSksIHBhZ2UpOwogCWlmIChmcm9udHN3YXBfbG9hZChwYWdlKSA9PSAwKSB7CkBAIC0zODYsNiArMzg4LDcgQEAKIAogCWlmIChzaXMtPmZsYWdzICYgU1dQX0ZJTEUpIHsKIAkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBzaXMtPnN3YXBfZmlsZS0+Zl9tYXBwaW5nOworCQlCVUdfT04oIVBhZ2VTd2FwQ2FjaGUocGFnZSkpOwogCQlyZXR1cm4gbWFwcGluZy0+YV9vcHMtPnNldF9wYWdlX2RpcnR5KHBhZ2UpOwogCX0gZWxzZSB7CiAJCXJldHVybiBfX3NldF9wYWdlX2RpcnR5X25vX3dyaXRlYmFjayhwYWdlKTsKZGlmZiAtLWdpdCBhL21tL3JlYWRhaGVhZC5jIGIvbW0vcmVhZGFoZWFkLmMKaW5kZXggNjVlYzI4OC4uYzhhOTU1YiAxMDA2NDQKLS0tIGEvbW0vcmVhZGFoZWFkLmMKKysrIGIvbW0vcmVhZGFoZWFkLmMKQEAgLTgsNiArOCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RheC5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgpAQCAtNTQ0LDYgKzU0NSwxNCBAQAogCWlmICghbWFwcGluZyB8fCAhbWFwcGluZy0+YV9vcHMpCiAJCXJldHVybiAtRUlOVkFMOwogCisJLyoKKwkgKiBSZWFkYWhlYWQgZG9lc24ndCBtYWtlIHNlbnNlIGZvciBEQVggaW5vZGVzLCBidXQgd2UgZG9uJ3Qgd2FudCBpdAorCSAqIHRvIHJlcG9ydCBhIGZhaWx1cmUgZWl0aGVyLiAgSW5zdGVhZCwgd2UganVzdCByZXR1cm4gc3VjY2VzcyBhbmQKKwkgKiBkb24ndCBkbyBhbnkgd29yay4KKwkgKi8KKwlpZiAoZGF4X21hcHBpbmcobWFwcGluZykpCisJCXJldHVybiAwOworCiAJcmV0dXJuIGZvcmNlX3BhZ2VfY2FjaGVfcmVhZGFoZWFkKG1hcHBpbmcsIGZpbHAsIGluZGV4LCBucik7CiB9CiAKZGlmZiAtLWdpdCBhL21tL3NobWVtLmMgYi9tbS9zaG1lbS5jCmluZGV4IGZkOGIyYjUuLjk3MWZjODMgMTAwNjQ0Ci0tLSBhL21tL3NobWVtLmMKKysrIGIvbW0vc2htZW0uYwpAQCAtMjcwLDcgKzI3MCw3IEBACiAJCWluZm8tPmFsbG9jZWQgLT0gcGFnZXM7CiAJCXNobWVtX3JlY2FsY19pbm9kZShpbm9kZSk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQorCQlzaG1lbV91bmFjY3RfYmxvY2tzKGluZm8tPmZsYWdzLCBwYWdlcyk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAJcGVyY3B1X2NvdW50ZXJfYWRkKCZzYmluZm8tPnVzZWRfYmxvY2tzLCBwYWdlcyk7CkBAIC0yOTEsNiArMjkxLDcgQEAKIAogCWlmIChzYmluZm8tPm1heF9ibG9ja3MpCiAJCXBlcmNwdV9jb3VudGVyX3N1Yigmc2JpbmZvLT51c2VkX2Jsb2NrcywgcGFnZXMpOworCXNobWVtX3VuYWNjdF9ibG9ja3MoaW5mby0+ZmxhZ3MsIHBhZ2VzKTsKIH0KIAogLyoKQEAgLTE5ODAsNyArMTk4MSw3IEBACiAJCQkJcmV0dXJuIGFkZHI7CiAJCQlzYiA9IHNobV9tbnQtPm1udF9zYjsKIAkJfQotCQlpZiAoU0hNRU1fU0Ioc2IpLT5odWdlICE9IFNITUVNX0hVR0VfTkVWRVIpCisJCWlmIChTSE1FTV9TQihzYiktPmh1Z2UgPT0gU0hNRU1fSFVHRV9ORVZFUikKIAkJCXJldHVybiBhZGRyOwogCX0KIApkaWZmIC0tZ2l0IGEvbW0vc2xhYi5jIGIvbW0vc2xhYi5jCmluZGV4IGI2NzI3MTAuLjA5MGZiMjYgMTAwNjQ0Ci0tLSBhL21tL3NsYWIuYworKysgYi9tbS9zbGFiLmMKQEAgLTg4Niw2ICs4ODYsNyBAQAogCXJldHVybiAwOwogfQogCisjaWYgKGRlZmluZWQoQ09ORklHX05VTUEpICYmIGRlZmluZWQoQ09ORklHX01FTU9SWV9IT1RQTFVHKSkgfHwgZGVmaW5lZChDT05GSUdfU01QKQogLyoKICAqIEFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgbm9kZSBmb3IgYSBub2RlIG9uIGVhY2ggc2xhYiBjYWNoZSwgdXNlZCBmb3IKICAqIGVpdGhlciBtZW1vcnkgb3IgY3B1IGhvdHBsdWcuICBJZiBtZW1vcnkgaXMgYmVpbmcgaG90LWFkZGVkLCB0aGUga21lbV9jYWNoZV9ub2RlCkBAIC05MDgsNiArOTA5LDcgQEAKIAogCXJldHVybiAwOwogfQorI2VuZGlmCiAKIHN0YXRpYyBpbnQgc2V0dXBfa21lbV9jYWNoZV9ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsCiAJCQkJaW50IG5vZGUsIGdmcF90IGdmcCwgYm9vbCBmb3JjZV9jaGFuZ2UpCkBAIC05NzUsNiArOTc3LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCisjaWZkZWYgQ09ORklHX1NNUAorCiBzdGF0aWMgdm9pZCBjcHV1cF9jYW5jZWxlZChsb25nIGNwdSkKIHsKIAlzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwOwpAQCAtMTA3NSw2NSArMTA3OSw1NCBAQAogCXJldHVybiAtRU5PTUVNOwogfQogCi1zdGF0aWMgaW50IGNwdXVwX2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK2ludCBzbGFiX3ByZXBhcmVfY3B1KHVuc2lnbmVkIGludCBjcHUpCiB7Ci0JbG9uZyBjcHUgPSAobG9uZyloY3B1OwotCWludCBlcnIgPSAwOworCWludCBlcnI7CiAKLQlzd2l0Y2ggKGFjdGlvbikgewotCWNhc2UgQ1BVX1VQX1BSRVBBUkU6Ci0JY2FzZSBDUFVfVVBfUFJFUEFSRV9GUk9aRU46Ci0JCW11dGV4X2xvY2soJnNsYWJfbXV0ZXgpOwotCQllcnIgPSBjcHV1cF9wcmVwYXJlKGNwdSk7Ci0JCW11dGV4X3VubG9jaygmc2xhYl9tdXRleCk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BVX09OTElORToKLQljYXNlIENQVV9PTkxJTkVfRlJPWkVOOgotCQlzdGFydF9jcHVfdGltZXIoY3B1KTsKLQkJYnJlYWs7Ci0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi0gIAljYXNlIENQVV9ET1dOX1BSRVBBUkU6Ci0gIAljYXNlIENQVV9ET1dOX1BSRVBBUkVfRlJPWkVOOgotCQkvKgotCQkgKiBTaHV0ZG93biBjYWNoZSByZWFwZXIuIE5vdGUgdGhhdCB0aGUgc2xhYl9tdXRleCBpcwotCQkgKiBoZWxkIHNvIHRoYXQgaWYgY2FjaGVfcmVhcCgpIGlzIGludm9rZWQgaXQgY2Fubm90IGRvCi0JCSAqIGFueXRoaW5nIGV4cGVuc2l2ZSBidXQgd2lsbCBvbmx5IG1vZGlmeSByZWFwX3dvcmsKLQkJICogYW5kIHJlc2NoZWR1bGUgdGhlIHRpbWVyLgotCQkqLwotCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnBlcl9jcHUoc2xhYl9yZWFwX3dvcmssIGNwdSkpOwotCQkvKiBOb3cgdGhlIGNhY2hlX3JlYXBlciBpcyBndWFyYW50ZWVkIHRvIGJlIG5vdCBydW5uaW5nLiAqLwotCQlwZXJfY3B1KHNsYWJfcmVhcF93b3JrLCBjcHUpLndvcmsuZnVuYyA9IE5VTEw7Ci0gIAkJYnJlYWs7Ci0gIAljYXNlIENQVV9ET1dOX0ZBSUxFRDoKLSAgCWNhc2UgQ1BVX0RPV05fRkFJTEVEX0ZST1pFTjoKLQkJc3RhcnRfY3B1X3RpbWVyKGNwdSk7Ci0gIAkJYnJlYWs7Ci0JY2FzZSBDUFVfREVBRDoKLQljYXNlIENQVV9ERUFEX0ZST1pFTjoKLQkJLyoKLQkJICogRXZlbiBpZiBhbGwgdGhlIGNwdXMgb2YgYSBub2RlIGFyZSBkb3duLCB3ZSBkb24ndCBmcmVlIHRoZQotCQkgKiBrbWVtX2NhY2hlX25vZGUgb2YgYW55IGNhY2hlLiBUaGlzIHRvIGF2b2lkIGEgcmFjZSBiZXR3ZWVuCi0JCSAqIGNwdV9kb3duLCBhbmQgYSBrbWFsbG9jIGFsbG9jYXRpb24gZnJvbSBhbm90aGVyIGNwdSBmb3IKLQkJICogbWVtb3J5IGZyb20gdGhlIG5vZGUgb2YgdGhlIGNwdSBnb2luZyBkb3duLiAgVGhlIG5vZGUKLQkJICogc3RydWN0dXJlIGlzIHVzdWFsbHkgYWxsb2NhdGVkIGZyb20ga21lbV9jYWNoZV9jcmVhdGUoKSBhbmQKLQkJICogZ2V0cyBkZXN0cm95ZWQgYXQga21lbV9jYWNoZV9kZXN0cm95KCkuCi0JCSAqLwotCQkvKiBmYWxsIHRocm91Z2ggKi8KLSNlbmRpZgotCWNhc2UgQ1BVX1VQX0NBTkNFTEVEOgotCWNhc2UgQ1BVX1VQX0NBTkNFTEVEX0ZST1pFTjoKLQkJbXV0ZXhfbG9jaygmc2xhYl9tdXRleCk7Ci0JCWNwdXVwX2NhbmNlbGVkKGNwdSk7Ci0JCW11dGV4X3VubG9jaygmc2xhYl9tdXRleCk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gbm90aWZpZXJfZnJvbV9lcnJubyhlcnIpOworCW11dGV4X2xvY2soJnNsYWJfbXV0ZXgpOworCWVyciA9IGNwdXVwX3ByZXBhcmUoY3B1KTsKKwltdXRleF91bmxvY2soJnNsYWJfbXV0ZXgpOworCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgY3B1Y2FjaGVfbm90aWZpZXIgPSB7Ci0JJmNwdXVwX2NhbGxiYWNrLCBOVUxMLCAwCi19OworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIGZvciBhIGZhaWxlZCBvbmxpbmUgYXR0ZW1wdCBhbmQgZm9yIGEgc3VjY2Vzc2Z1bAorICogb2ZmbGluZS4KKyAqCisgKiBFdmVuIGlmIGFsbCB0aGUgY3B1cyBvZiBhIG5vZGUgYXJlIGRvd24sIHdlIGRvbid0IGZyZWUgdGhlCisgKiBrbWVtX2xpc3QzIG9mIGFueSBjYWNoZS4gVGhpcyB0byBhdm9pZCBhIHJhY2UgYmV0d2VlbiBjcHVfZG93biwgYW5kCisgKiBhIGttYWxsb2MgYWxsb2NhdGlvbiBmcm9tIGFub3RoZXIgY3B1IGZvciBtZW1vcnkgZnJvbSB0aGUgbm9kZSBvZgorICogdGhlIGNwdSBnb2luZyBkb3duLiAgVGhlIGxpc3QzIHN0cnVjdHVyZSBpcyB1c3VhbGx5IGFsbG9jYXRlZCBmcm9tCisgKiBrbWVtX2NhY2hlX2NyZWF0ZSgpIGFuZCBnZXRzIGRlc3Ryb3llZCBhdCBrbWVtX2NhY2hlX2Rlc3Ryb3koKS4KKyAqLworaW50IHNsYWJfZGVhZF9jcHUodW5zaWduZWQgaW50IGNwdSkKK3sKKwltdXRleF9sb2NrKCZzbGFiX211dGV4KTsKKwljcHV1cF9jYW5jZWxlZChjcHUpOworCW11dGV4X3VubG9jaygmc2xhYl9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBzbGFiX29ubGluZV9jcHUodW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdGFydF9jcHVfdGltZXIoY3B1KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbGFiX29mZmxpbmVfY3B1KHVuc2lnbmVkIGludCBjcHUpCit7CisJLyoKKwkgKiBTaHV0ZG93biBjYWNoZSByZWFwZXIuIE5vdGUgdGhhdCB0aGUgc2xhYl9tdXRleCBpcyBoZWxkIHNvCisJICogdGhhdCBpZiBjYWNoZV9yZWFwKCkgaXMgaW52b2tlZCBpdCBjYW5ub3QgZG8gYW55dGhpbmcKKwkgKiBleHBlbnNpdmUgYnV0IHdpbGwgb25seSBtb2RpZnkgcmVhcF93b3JrIGFuZCByZXNjaGVkdWxlIHRoZQorCSAqIHRpbWVyLgorCSAqLworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcGVyX2NwdShzbGFiX3JlYXBfd29yaywgY3B1KSk7CisJLyogTm93IHRoZSBjYWNoZV9yZWFwZXIgaXMgZ3VhcmFudGVlZCB0byBiZSBub3QgcnVubmluZy4gKi8KKwlwZXJfY3B1KHNsYWJfcmVhcF93b3JrLCBjcHUpLndvcmsuZnVuYyA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CiAKICNpZiBkZWZpbmVkKENPTkZJR19OVU1BKSAmJiBkZWZpbmVkKENPTkZJR19NRU1PUllfSE9UUExVRykKIC8qCkBAIC0xMzM2LDEyICsxMzI5LDYgQEAKIAkvKiBEb25lISAqLwogCXNsYWJfc3RhdGUgPSBGVUxMOwogCi0JLyoKLQkgKiBSZWdpc3RlciBhIGNwdSBzdGFydHVwIG5vdGlmaWVyIGNhbGxiYWNrIHRoYXQgaW5pdGlhbGl6ZXMKLQkgKiBjcHVfY2FjaGVfZ2V0IGZvciBhbGwgbmV3IGNwdXMKLQkgKi8KLQlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJmNwdWNhY2hlX25vdGlmaWVyKTsKLQogI2lmZGVmIENPTkZJR19OVU1BCiAJLyoKIAkgKiBSZWdpc3RlciBhIG1lbW9yeSBob3RwbHVnIGNhbGxiYWNrIHRoYXQgaW5pdGlhbGl6ZXMgYW5kIGZyZWVzCkBAIC0xMzU4LDEzICsxMzQ1LDE0IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGNwdWNhY2hlX2luaXQodm9pZCkKIHsKLQlpbnQgY3B1OworCWludCByZXQ7CiAKIAkvKgogCSAqIFJlZ2lzdGVyIHRoZSB0aW1lcnMgdGhhdCByZXR1cm4gdW5uZWVkZWQgcGFnZXMgdG8gdGhlIHBhZ2UgYWxsb2NhdG9yCiAJICovCi0JZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCi0JCXN0YXJ0X2NwdV90aW1lcihjcHUpOworCXJldCA9IGNwdWhwX3NldHVwX3N0YXRlKENQVUhQX0FQX09OTElORV9EWU4sICJTTEFCIG9ubGluZSIsCisJCQkJc2xhYl9vbmxpbmVfY3B1LCBzbGFiX29mZmxpbmVfY3B1KTsKKwlXQVJOX09OKHJldCA8IDApOwogCiAJLyogRG9uZSEgKi8KIAlzbGFiX3N0YXRlID0gRlVMTDsKZGlmZiAtLWdpdCBhL21tL3NsdWIuYyBiL21tL3NsdWIuYwppbmRleCA5YWRhZTU4Li4yYjNlNzQwIDEwMDY0NAotLS0gYS9tbS9zbHViLmMKKysrIGIvbW0vc2x1Yi5jCkBAIC0xOTQsMTAgKzE5NCw2IEBACiAjZGVmaW5lIF9fT0JKRUNUX1BPSVNPTgkJMHg4MDAwMDAwMFVMIC8qIFBvaXNvbiBvYmplY3QgKi8KICNkZWZpbmUgX19DTVBYQ0hHX0RPVUJMRQkweDQwMDAwMDAwVUwgLyogVXNlIGNtcHhjaGdfZG91YmxlICovCiAKLSNpZmRlZiBDT05GSUdfU01QCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHNsYWJfbm90aWZpZXI7Ci0jZW5kaWYKLQogLyoKICAqIFRyYWNraW5nIHVzZXIgb2YgYSBzbGFiLgogICovCkBAIC0yMzA1LDYgKzIzMDEsMjUgQEAKIH0KIAogLyoKKyAqIFVzZSB0aGUgY3B1IG5vdGlmaWVyIHRvIGluc3VyZSB0aGF0IHRoZSBjcHUgc2xhYnMgYXJlIGZsdXNoZWQgd2hlbgorICogbmVjZXNzYXJ5LgorICovCitzdGF0aWMgaW50IHNsdWJfY3B1X2RlYWQodW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3Qga21lbV9jYWNoZSAqczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbXV0ZXhfbG9jaygmc2xhYl9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzLCAmc2xhYl9jYWNoZXMsIGxpc3QpIHsKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlfX2ZsdXNoX2NwdV9zbGFiKHMsIGNwdSk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZzbGFiX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworLyoKICAqIENoZWNrIGlmIHRoZSBvYmplY3RzIGluIGEgcGVyIGNwdSBzdHJ1Y3R1cmUgZml0IG51bWEKICAqIGxvY2FsaXR5IGV4cGVjdGF0aW9ucy4KICAqLwpAQCAtNDE0NCw5ICs0MTU5LDggQEAKIAkvKiBTZXR1cCByYW5kb20gZnJlZWxpc3RzIGZvciBlYWNoIGNhY2hlICovCiAJaW5pdF9mcmVlbGlzdF9yYW5kb21pemF0aW9uKCk7CiAKLSNpZmRlZiBDT05GSUdfU01QCi0JcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZzbGFiX25vdGlmaWVyKTsKLSNlbmRpZgorCWNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfU0xVQl9ERUFELCAic2x1YjpkZWFkIiwgTlVMTCwKKwkJCQkgIHNsdWJfY3B1X2RlYWQpOwogCiAJcHJfaW5mbygiU0xVQjogSFdhbGlnbj0lZCwgT3JkZXI9JWQtJWQsIE1pbk9iamVjdHM9JWQsIENQVXM9JWQsIE5vZGVzPSVkXG4iLAogCQljYWNoZV9saW5lX3NpemUoKSwKQEAgLTQyMTAsNDMgKzQyMjQsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLSNpZmRlZiBDT05GSUdfU01QCi0vKgotICogVXNlIHRoZSBjcHUgbm90aWZpZXIgdG8gaW5zdXJlIHRoYXQgdGhlIGNwdSBzbGFicyBhcmUgZmx1c2hlZCB3aGVuCi0gKiBuZWNlc3NhcnkuCi0gKi8KLXN0YXRpYyBpbnQgc2xhYl9jcHV1cF9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKLQkJdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCi17Ci0JbG9uZyBjcHUgPSAobG9uZyloY3B1OwotCXN0cnVjdCBrbWVtX2NhY2hlICpzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzd2l0Y2ggKGFjdGlvbikgewotCWNhc2UgQ1BVX1VQX0NBTkNFTEVEOgotCWNhc2UgQ1BVX1VQX0NBTkNFTEVEX0ZST1pFTjoKLQljYXNlIENQVV9ERUFEOgotCWNhc2UgQ1BVX0RFQURfRlJPWkVOOgotCQltdXRleF9sb2NrKCZzbGFiX211dGV4KTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShzLCAmc2xhYl9jYWNoZXMsIGxpc3QpIHsKLQkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJCV9fZmx1c2hfY3B1X3NsYWIocywgY3B1KTsKLQkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJfQotCQltdXRleF91bmxvY2soJnNsYWJfbXV0ZXgpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIE5PVElGWV9PSzsKLX0KLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBzbGFiX25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsID0gc2xhYl9jcHV1cF9jYWxsYmFjawotfTsKLQotI2VuZGlmCi0KIHZvaWQgKl9fa21hbGxvY190cmFja19jYWxsZXIoc2l6ZV90IHNpemUsIGdmcF90IGdmcGZsYWdzLCB1bnNpZ25lZCBsb25nIGNhbGxlcikKIHsKIAlzdHJ1Y3Qga21lbV9jYWNoZSAqczsKZGlmZiAtLWdpdCBhL21tL3N3YXBmaWxlLmMgYi9tbS9zd2FwZmlsZS5jCmluZGV4IDc4Y2ZhMjkuLjI2NTdhY2MgMTAwNjQ0Ci0tLSBhL21tL3N3YXBmaWxlLmMKKysrIGIvbW0vc3dhcGZpbGUuYwpAQCAtMjcyNCw3ICsyNzI0LDYgQEAKIHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpwYWdlX3N3YXBfaW5mbyhzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlzd3BfZW50cnlfdCBzd2FwID0geyAudmFsID0gcGFnZV9wcml2YXRlKHBhZ2UpIH07Ci0JQlVHX09OKCFQYWdlU3dhcENhY2hlKHBhZ2UpKTsKIAlyZXR1cm4gc3dhcF9pbmZvW3N3cF90eXBlKHN3YXApXTsKIH0KIApkaWZmIC0tZ2l0IGEvbW0vdXNlcmNvcHkuYyBiL21tL3VzZXJjb3B5LmMKaW5kZXggOGViYWU5MS4uM2M4ZGEwYSAxMDA2NDQKLS0tIGEvbW0vdXNlcmNvcHkuYworKysgYi9tbS91c2VyY29weS5jCkBAIC04Myw3ICs4Myw3IEBACiAJdW5zaWduZWQgbG9uZyBjaGVja19oaWdoID0gY2hlY2tfbG93ICsgbjsKIAogCS8qIERvZXMgbm90IG92ZXJsYXAgaWYgZW50aXJlbHkgYWJvdmUgb3IgZW50aXJlbHkgYmVsb3cuICovCi0JaWYgKGNoZWNrX2xvdyA+PSBoaWdoIHx8IGNoZWNrX2hpZ2ggPCBsb3cpCisJaWYgKGNoZWNrX2xvdyA+PSBoaWdoIHx8IGNoZWNrX2hpZ2ggPD0gbG93KQogCQlyZXR1cm4gZmFsc2U7CiAKIAlyZXR1cm4gdHJ1ZTsKQEAgLTEyNCw3ICsxMjQsNyBAQAogc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpjaGVja19ib2d1c19hZGRyZXNzKGNvbnN0IHZvaWQgKnB0ciwgdW5zaWduZWQgbG9uZyBuKQogewogCS8qIFJlamVjdCBpZiBvYmplY3Qgd3JhcHMgcGFzdCBlbmQgb2YgbWVtb3J5LiAqLwotCWlmIChwdHIgKyBuIDwgcHRyKQorCWlmICgodW5zaWduZWQgbG9uZylwdHIgKyBuIDwgKHVuc2lnbmVkIGxvbmcpcHRyKQogCQlyZXR1cm4gIjx3cmFwcGVkIGFkZHJlc3M+IjsKIAogCS8qIFJlamVjdCBpZiBOVUxMIG9yIFpFUk8tYWxsb2NhdGlvbi4gKi8KQEAgLTEzNCwzMSArMTM0LDE2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqY2hlY2tfaGVhcF9vYmplY3QoY29uc3Qgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIG4sCi0JCQkJCSAgICBib29sIHRvX3VzZXIpCisvKiBDaGVja3MgZm9yIGFsbG9jcyB0aGF0IGFyZSBtYXJrZWQgaW4gc29tZSB3YXkgYXMgc3Bhbm5pbmcgbXVsdGlwbGUgcGFnZXMuICovCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmNoZWNrX3BhZ2Vfc3Bhbihjb25zdCB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgbiwKKwkJCQkJICBzdHJ1Y3QgcGFnZSAqcGFnZSwgYm9vbCB0b191c2VyKQogewotCXN0cnVjdCBwYWdlICpwYWdlLCAqZW5kcGFnZTsKKyNpZmRlZiBDT05GSUdfSEFSREVORURfVVNFUkNPUFlfUEFHRVNQQU4KIAljb25zdCB2b2lkICplbmQgPSBwdHIgKyBuIC0gMTsKKwlzdHJ1Y3QgcGFnZSAqZW5kcGFnZTsKIAlib29sIGlzX3Jlc2VydmVkLCBpc19jbWE7CiAKIAkvKgotCSAqIFNvbWUgYXJjaGl0ZWN0dXJlcyAoYXJtNjQpIHJldHVybiB0cnVlIGZvciB2aXJ0X2FkZHJfdmFsaWQoKSBvbgotCSAqIHZtYWxsb2NlZCBhZGRyZXNzZXMuIFdvcmsgYXJvdW5kIHRoaXMgYnkgY2hlY2tpbmcgZm9yIHZtYWxsb2MKLQkgKiBmaXJzdC4KLQkgKi8KLQlpZiAoaXNfdm1hbGxvY19hZGRyKHB0cikpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKCF2aXJ0X2FkZHJfdmFsaWQocHRyKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlwYWdlID0gdmlydF90b19oZWFkX3BhZ2UocHRyKTsKLQotCS8qIENoZWNrIHNsYWIgYWxsb2NhdG9yIGZvciBmbGFncyBhbmQgc2l6ZS4gKi8KLQlpZiAoUGFnZVNsYWIocGFnZSkpCi0JCXJldHVybiBfX2NoZWNrX2hlYXBfb2JqZWN0KHB0ciwgbiwgcGFnZSk7Ci0KLQkvKgogCSAqIFNvbWV0aW1lcyB0aGUga2VybmVsIGRhdGEgcmVnaW9ucyBhcmUgbm90IG1hcmtlZCBSZXNlcnZlZCAoc2VlCiAJICogY2hlY2sgYmVsb3cpLiBBbmQgc29tZXRpbWVzIFtfc2RhdGEsX2VkYXRhKSBkb2VzIG5vdCBjb3ZlcgogCSAqIHJvZGF0YSBhbmQvb3IgYnNzLCBzbyBjaGVjayBlYWNoIHJhbmdlIGV4cGxpY2l0bHkuCkBAIC0xODYsNyArMTcxLDcgQEAKIAkJICAgKCh1bnNpZ25lZCBsb25nKWVuZCAmICh1bnNpZ25lZCBsb25nKVBBR0VfTUFTSykpKQogCQlyZXR1cm4gTlVMTDsKIAotCS8qIEFsbG93IGlmIHN0YXJ0IGFuZCBlbmQgYXJlIGluc2lkZSB0aGUgc2FtZSBjb21wb3VuZCBwYWdlLiAqLworCS8qIEFsbG93IGlmIGZ1bGx5IGluc2lkZSB0aGUgc2FtZSBjb21wb3VuZCAoX19HRlBfQ09NUCkgcGFnZS4gKi8KIAllbmRwYWdlID0gdmlydF90b19oZWFkX3BhZ2UoZW5kKTsKIAlpZiAobGlrZWx5KGVuZHBhZ2UgPT0gcGFnZSkpCiAJCXJldHVybiBOVUxMOwpAQCAtMTk5LDIwICsxODQsNDcgQEAKIAlpc19yZXNlcnZlZCA9IFBhZ2VSZXNlcnZlZChwYWdlKTsKIAlpc19jbWEgPSBpc19taWdyYXRlX2NtYV9wYWdlKHBhZ2UpOwogCWlmICghaXNfcmVzZXJ2ZWQgJiYgIWlzX2NtYSkKLQkJZ290byByZWplY3Q7CisJCXJldHVybiAiPHNwYW5zIG11bHRpcGxlIHBhZ2VzPiI7CiAKIAlmb3IgKHB0ciArPSBQQUdFX1NJWkU7IHB0ciA8PSBlbmQ7IHB0ciArPSBQQUdFX1NJWkUpIHsKIAkJcGFnZSA9IHZpcnRfdG9faGVhZF9wYWdlKHB0cik7CiAJCWlmIChpc19yZXNlcnZlZCAmJiAhUGFnZVJlc2VydmVkKHBhZ2UpKQotCQkJZ290byByZWplY3Q7CisJCQlyZXR1cm4gIjxzcGFucyBSZXNlcnZlZCBhbmQgbm9uLVJlc2VydmVkIHBhZ2VzPiI7CiAJCWlmIChpc19jbWEgJiYgIWlzX21pZ3JhdGVfY21hX3BhZ2UocGFnZSkpCi0JCQlnb3RvIHJlamVjdDsKKwkJCXJldHVybiAiPHNwYW5zIENNQSBhbmQgbm9uLUNNQSBwYWdlcz4iOwogCX0KKyNlbmRpZgogCiAJcmV0dXJuIE5VTEw7Cit9CiAKLXJlamVjdDoKLQlyZXR1cm4gIjxzcGFucyBtdWx0aXBsZSBwYWdlcz4iOworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpjaGVja19oZWFwX29iamVjdChjb25zdCB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgbiwKKwkJCQkJICAgIGJvb2wgdG9fdXNlcikKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCS8qCisJICogU29tZSBhcmNoaXRlY3R1cmVzIChhcm02NCkgcmV0dXJuIHRydWUgZm9yIHZpcnRfYWRkcl92YWxpZCgpIG9uCisJICogdm1hbGxvY2VkIGFkZHJlc3Nlcy4gV29yayBhcm91bmQgdGhpcyBieSBjaGVja2luZyBmb3Igdm1hbGxvYworCSAqIGZpcnN0LgorCSAqCisJICogV2UgYWxzbyBuZWVkIHRvIGNoZWNrIGZvciBtb2R1bGUgYWRkcmVzc2VzIGV4cGxpY2l0bHkgc2luY2Ugd2UKKwkgKiBtYXkgY29weSBzdGF0aWMgZGF0YSBmcm9tIG1vZHVsZXMgdG8gdXNlcnNwYWNlCisJICovCisJaWYgKGlzX3ZtYWxsb2Nfb3JfbW9kdWxlX2FkZHIocHRyKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIXZpcnRfYWRkcl92YWxpZChwdHIpKQorCQlyZXR1cm4gTlVMTDsKKworCXBhZ2UgPSB2aXJ0X3RvX2hlYWRfcGFnZShwdHIpOworCisJLyogQ2hlY2sgc2xhYiBhbGxvY2F0b3IgZm9yIGZsYWdzIGFuZCBzaXplLiAqLworCWlmIChQYWdlU2xhYihwYWdlKSkKKwkJcmV0dXJuIF9fY2hlY2tfaGVhcF9vYmplY3QocHRyLCBuLCBwYWdlKTsKKworCS8qIFZlcmlmeSBvYmplY3QgZG9lcyBub3QgaW5jb3JyZWN0bHkgc3BhbiBtdWx0aXBsZSBwYWdlcy4gKi8KKwlyZXR1cm4gY2hlY2tfcGFnZV9zcGFuKHB0ciwgbiwgcGFnZSwgdG9fdXNlcik7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9tbS92bXNjYW4uYyBiL21tL3Ztc2Nhbi5jCmluZGV4IDM3NGQ5NWQuLjBmZThiNzEgMTAwNjQ0Ci0tLSBhL21tL3Ztc2Nhbi5jCisrKyBiL21tL3Ztc2Nhbi5jCkBAIC0xNjY1LDcgKzE2NjUsNyBAQAogCiAJZm9yICh6aWQgPSBzYy0+cmVjbGFpbV9pZHg7IHppZCA+PSAwOyB6aWQtLSkgewogCQl6b25lID0gJnBnZGF0LT5ub2RlX3pvbmVzW3ppZF07Ci0JCWlmICghcG9wdWxhdGVkX3pvbmUoem9uZSkpCisJCWlmICghbWFuYWdlZF96b25lKHpvbmUpKQogCQkJY29udGludWU7CiAKIAkJaWYgKHpvbmVfcGFnZV9zdGF0ZV9zbmFwc2hvdCh6b25lLCBOUl9aT05FX0xSVV9CQVNFICsKQEAgLTIwMzYsNyArMjAzNiw3IEBACiAJCXN0cnVjdCB6b25lICp6b25lID0gJnBnZGF0LT5ub2RlX3pvbmVzW3ppZF07CiAJCXVuc2lnbmVkIGxvbmcgaW5hY3RpdmVfem9uZSwgYWN0aXZlX3pvbmU7CiAKLQkJaWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSkKKwkJaWYgKCFtYW5hZ2VkX3pvbmUoem9uZSkpCiAJCQljb250aW51ZTsKIAogCQlpbmFjdGl2ZV96b25lID0gem9uZV9wYWdlX3N0YXRlKHpvbmUsCkBAIC0yMTcxLDcgKzIxNzEsNyBAQAogCiAJCWZvciAoeiA9IDA7IHogPCBNQVhfTlJfWk9ORVM7IHorKykgewogCQkJc3RydWN0IHpvbmUgKnpvbmUgPSAmcGdkYXQtPm5vZGVfem9uZXNbel07Ci0JCQlpZiAoIXBvcHVsYXRlZF96b25lKHpvbmUpKQorCQkJaWYgKCFtYW5hZ2VkX3pvbmUoem9uZSkpCiAJCQkJY29udGludWU7CiAKIAkJCXRvdGFsX2hpZ2hfd21hcmsgKz0gaGlnaF93bWFya19wYWdlcyh6b25lKTsKQEAgLTIzMDMsMjMgKzIzMDMsNiBAQAogCX0KIH0KIAotI2lmZGVmIENPTkZJR19BUkNIX1dBTlRfQkFUQ0hFRF9VTk1BUF9UTEJfRkxVU0gKLXN0YXRpYyB2b2lkIGluaXRfdGxiX3ViYyh2b2lkKQotewotCS8qCi0JICogVGhpcyBkZWxpYmVyYXRlbHkgZG9lcyBub3QgY2xlYXIgdGhlIGNwdW1hc2sgYXMgaXQncyBleHBlbnNpdmUKLQkgKiBhbmQgdW5uZWNlc3NhcnkuIElmIHRoZXJlIGhhcHBlbnMgdG8gYmUgZGF0YSBpbiB0aGVyZSB0aGVuIHRoZQotCSAqIGZpcnN0IFNXQVBfQ0xVU1RFUl9NQVggcGFnZXMgd2lsbCBzZW5kIGFuIHVubmVjZXNzYXJ5IElQSSBhbmQKLQkgKiB0aGVuIHdpbGwgYmUgY2xlYXJlZC4KLQkgKi8KLQljdXJyZW50LT50bGJfdWJjLmZsdXNoX3JlcXVpcmVkID0gZmFsc2U7Ci19Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGluaXRfdGxiX3ViYyh2b2lkKQotewotfQotI2VuZGlmIC8qIENPTkZJR19BUkNIX1dBTlRfQkFUQ0hFRF9VTk1BUF9UTEJfRkxVU0ggKi8KLQogLyoKICAqIFRoaXMgaXMgYSBiYXNpYyBwZXItbm9kZSBwYWdlIGZyZWVyLiAgVXNlZCBieSBib3RoIGtzd2FwZCBhbmQgZGlyZWN0IHJlY2xhaW0uCiAgKi8KQEAgLTIzNTUsOCArMjMzOCw2IEBACiAJc2Nhbl9hZGp1c3RlZCA9IChnbG9iYWxfcmVjbGFpbShzYykgJiYgIWN1cnJlbnRfaXNfa3N3YXBkKCkgJiYKIAkJCSBzYy0+cHJpb3JpdHkgPT0gREVGX1BSSU9SSVRZKTsKIAotCWluaXRfdGxiX3ViYygpOwotCiAJYmxrX3N0YXJ0X3BsdWcoJnBsdWcpOwogCXdoaWxlIChucltMUlVfSU5BQ1RJVkVfQU5PTl0gfHwgbnJbTFJVX0FDVElWRV9GSUxFXSB8fAogCQkJCQlucltMUlVfSU5BQ1RJVkVfRklMRV0pIHsKQEAgLTI1MTAsNyArMjQ5MSw3IEBACiAJLyogSWYgY29tcGFjdGlvbiB3b3VsZCBnbyBhaGVhZCBvciB0aGUgYWxsb2NhdGlvbiB3b3VsZCBzdWNjZWVkLCBzdG9wICovCiAJZm9yICh6ID0gMDsgeiA8PSBzYy0+cmVjbGFpbV9pZHg7IHorKykgewogCQlzdHJ1Y3Qgem9uZSAqem9uZSA9ICZwZ2RhdC0+bm9kZV96b25lc1t6XTsKLQkJaWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSkKKwkJaWYgKCFtYW5hZ2VkX3pvbmUoem9uZSkpCiAJCQljb250aW51ZTsKIAogCQlzd2l0Y2ggKGNvbXBhY3Rpb25fc3VpdGFibGUoem9uZSwgc2MtPm9yZGVyLCAwLCBzYy0+cmVjbGFpbV9pZHgpKSB7CkBAIC0yODQwLDcgKzI4MjEsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8PSBaT05FX05PUk1BTDsgaSsrKSB7CiAJCXpvbmUgPSAmcGdkYXQtPm5vZGVfem9uZXNbaV07Ci0JCWlmICghcG9wdWxhdGVkX3pvbmUoem9uZSkgfHwKKwkJaWYgKCFtYW5hZ2VkX3pvbmUoem9uZSkgfHwKIAkJICAgIHBnZGF0X3JlY2xhaW1hYmxlX3BhZ2VzKHBnZGF0KSA9PSAwKQogCQkJY29udGludWU7CiAKQEAgLTMxNDEsNyArMzEyMiw3IEBACiAJZm9yIChpID0gMDsgaSA8PSBjbGFzc3pvbmVfaWR4OyBpKyspIHsKIAkJc3RydWN0IHpvbmUgKnpvbmUgPSBwZ2RhdC0+bm9kZV96b25lcyArIGk7CiAKLQkJaWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSkKKwkJaWYgKCFtYW5hZ2VkX3pvbmUoem9uZSkpCiAJCQljb250aW51ZTsKIAogCQlpZiAoIXpvbmVfYmFsYW5jZWQoem9uZSwgb3JkZXIsIGNsYXNzem9uZV9pZHgpKQpAQCAtMzE2OSw3ICszMTUwLDcgQEAKIAlzYy0+bnJfdG9fcmVjbGFpbSA9IDA7CiAJZm9yICh6ID0gMDsgeiA8PSBzYy0+cmVjbGFpbV9pZHg7IHorKykgewogCQl6b25lID0gcGdkYXQtPm5vZGVfem9uZXMgKyB6OwotCQlpZiAoIXBvcHVsYXRlZF96b25lKHpvbmUpKQorCQlpZiAoIW1hbmFnZWRfem9uZSh6b25lKSkKIAkJCWNvbnRpbnVlOwogCiAJCXNjLT5ucl90b19yZWNsYWltICs9IG1heChoaWdoX3dtYXJrX3BhZ2VzKHpvbmUpLCBTV0FQX0NMVVNURVJfTUFYKTsKQEAgLTMyNDIsNyArMzIyMyw3IEBACiAJCWlmIChidWZmZXJfaGVhZHNfb3Zlcl9saW1pdCkgewogCQkJZm9yIChpID0gTUFYX05SX1pPTkVTIC0gMTsgaSA+PSAwOyBpLS0pIHsKIAkJCQl6b25lID0gcGdkYXQtPm5vZGVfem9uZXMgKyBpOwotCQkJCWlmICghcG9wdWxhdGVkX3pvbmUoem9uZSkpCisJCQkJaWYgKCFtYW5hZ2VkX3pvbmUoem9uZSkpCiAJCQkJCWNvbnRpbnVlOwogCiAJCQkJc2MucmVjbGFpbV9pZHggPSBpOwpAQCAtMzI2Miw3ICszMjQzLDcgQEAKIAkJICovCiAJCWZvciAoaSA9IGNsYXNzem9uZV9pZHg7IGkgPj0gMDsgaS0tKSB7CiAJCQl6b25lID0gcGdkYXQtPm5vZGVfem9uZXMgKyBpOwotCQkJaWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSkKKwkJCWlmICghbWFuYWdlZF96b25lKHpvbmUpKQogCQkJCWNvbnRpbnVlOwogCiAJCQlpZiAoem9uZV9iYWxhbmNlZCh6b25lLCBzYy5vcmRlciwgY2xhc3N6b25lX2lkeCkpCkBAIC0zNTA4LDcgKzM0ODksNyBAQAogCXBnX2RhdGFfdCAqcGdkYXQ7CiAJaW50IHo7CiAKLQlpZiAoIXBvcHVsYXRlZF96b25lKHpvbmUpKQorCWlmICghbWFuYWdlZF96b25lKHpvbmUpKQogCQlyZXR1cm47CiAKIAlpZiAoIWNwdXNldF96b25lX2FsbG93ZWQoem9uZSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX0hBUkRXQUxMKSkKQEAgLTM1MjIsNyArMzUwMyw3IEBACiAJLyogT25seSB3YWtlIGtzd2FwZCBpZiBhbGwgem9uZXMgYXJlIHVuYmFsYW5jZWQgKi8KIAlmb3IgKHogPSAwOyB6IDw9IGNsYXNzem9uZV9pZHg7IHorKykgewogCQl6b25lID0gcGdkYXQtPm5vZGVfem9uZXMgKyB6OwotCQlpZiAoIXBvcHVsYXRlZF96b25lKHpvbmUpKQorCQlpZiAoIW1hbmFnZWRfem9uZSh6b25lKSkKIAkJCWNvbnRpbnVlOwogCiAJCWlmICh6b25lX2JhbGFuY2VkKHpvbmUsIG9yZGVyLCBjbGFzc3pvbmVfaWR4KSkKZGlmZiAtLWdpdCBhL21tL3dvcmtpbmdzZXQuYyBiL21tL3dvcmtpbmdzZXQuYwppbmRleCA2OTU1MWNmLi42MTc0NzVmIDEwMDY0NAotLS0gYS9tbS93b3JraW5nc2V0LmMKKysrIGIvbW0vd29ya2luZ3NldC5jCkBAIC00MTgsMjEgKzQxOCwxOSBAQAogCSAqIG5vIHBhZ2VzLCBzbyB3ZSBleHBlY3QgdG8gYmUgYWJsZSB0byByZW1vdmUgdGhlbSBhbGwgYW5kCiAJICogZGVsZXRlIGFuZCBmcmVlIHRoZSBlbXB0eSBub2RlIGFmdGVyd2FyZHMuCiAJICovCi0KLQlCVUdfT04oIW5vZGUtPmNvdW50KTsKLQlCVUdfT04obm9kZS0+Y291bnQgJiBSQURJWF9UUkVFX0NPVU5UX01BU0spOworCUJVR19PTighd29ya2luZ3NldF9ub2RlX3NoYWRvd3Mobm9kZSkpOworCUJVR19PTih3b3JraW5nc2V0X25vZGVfcGFnZXMobm9kZSkpOwogCiAJZm9yIChpID0gMDsgaSA8IFJBRElYX1RSRUVfTUFQX1NJWkU7IGkrKykgewogCQlpZiAobm9kZS0+c2xvdHNbaV0pIHsKIAkJCUJVR19PTighcmFkaXhfdHJlZV9leGNlcHRpb25hbF9lbnRyeShub2RlLT5zbG90c1tpXSkpOwogCQkJbm9kZS0+c2xvdHNbaV0gPSBOVUxMOwotCQkJQlVHX09OKG5vZGUtPmNvdW50IDwgKDFVIDw8IFJBRElYX1RSRUVfQ09VTlRfU0hJRlQpKTsKLQkJCW5vZGUtPmNvdW50IC09IDFVIDw8IFJBRElYX1RSRUVfQ09VTlRfU0hJRlQ7CisJCQl3b3JraW5nc2V0X25vZGVfc2hhZG93c19kZWMobm9kZSk7CiAJCQlCVUdfT04oIW1hcHBpbmctPm5yZXhjZXB0aW9uYWwpOwogCQkJbWFwcGluZy0+bnJleGNlcHRpb25hbC0tOwogCQl9CiAJfQotCUJVR19PTihub2RlLT5jb3VudCk7CisJQlVHX09OKHdvcmtpbmdzZXRfbm9kZV9zaGFkb3dzKG5vZGUpKTsKIAlpbmNfbm9kZV9zdGF0ZShwYWdlX3BnZGF0KHZpcnRfdG9fcGFnZShub2RlKSksIFdPUktJTkdTRVRfTk9ERVJFQ0xBSU0pOwogCWlmICghX19yYWRpeF90cmVlX2RlbGV0ZV9ub2RlKCZtYXBwaW5nLT5wYWdlX3RyZWUsIG5vZGUpKQogCQlCVUcoKTsKZGlmZiAtLWdpdCBhL25ldC82bG93cGFuL25kaXNjLmMgYi9uZXQvNmxvd3Bhbi9uZGlzYy5jCmluZGV4IDg2NDUwYjcuLjk0MWRmMmYgMTAwNjQ0Ci0tLSBhL25ldC82bG93cGFuL25kaXNjLmMKKysrIGIvbmV0LzZsb3dwYW4vbmRpc2MuYwpAQCAtMTAxLDggKzEwMSw2IEBACiAJCWllZWU4MDIxNTRfYmUxNl90b19sZTE2KCZuZWlnaC0+c2hvcnRfYWRkciwgbGxhZGRyX3Nob3J0KTsKIAkJaWYgKCFsb3dwYW5fODAyMTU0X2lzX3ZhbGlkX3NyY19zaG9ydF9hZGRyKG5laWdoLT5zaG9ydF9hZGRyKSkKIAkJCW5laWdoLT5zaG9ydF9hZGRyID0gY3B1X3RvX2xlMTYoSUVFRTgwMjE1NF9BRERSX1NIT1JUX1VOU1BFQyk7Ci0JfSBlbHNlIHsKLQkJbmVpZ2gtPnNob3J0X2FkZHIgPSBjcHVfdG9fbGUxNihJRUVFODAyMTU0X0FERFJfU0hPUlRfVU5TUEVDKTsKIAl9CiAJd3JpdGVfdW5sb2NrX2JoKCZuLT5sb2NrKTsKIH0KZGlmZiAtLWdpdCBhL25ldC84MDIxcS92bGFuLmMgYi9uZXQvODAyMXEvdmxhbi5jCmluZGV4IDgyYTExNmIuLjhkZTEzOGQgMTAwNjQ0Ci0tLSBhL25ldC84MDIxcS92bGFuLmMKKysrIGIvbmV0LzgwMjFxL3ZsYW4uYwpAQCAtMTY5LDcgKzE2OSw3IEBACiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0X3VuaW5pdF9tdnJwOwogCi0Jdmxhbi0+bmVzdF9sZXZlbCA9IGRldl9nZXRfbmVzdF9sZXZlbChyZWFsX2RldiwgaXNfdmxhbl9kZXYpICsgMTsKKwl2bGFuLT5uZXN0X2xldmVsID0gZGV2X2dldF9uZXN0X2xldmVsKHJlYWxfZGV2KSArIDE7CiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2aWNlKGRldik7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0X3VuaW5pdF9tdnJwOwpkaWZmIC0tZ2l0IGEvbmV0L0tjb25maWcgYi9uZXQvS2NvbmZpZwppbmRleCBjMmNkYmNlLi43YjZjZDM0IDEwMDY0NAotLS0gYS9uZXQvS2NvbmZpZworKysgYi9uZXQvS2NvbmZpZwpAQCAtMzY5LDYgKzM2OSw3IEBACiBzb3VyY2UgIm5ldC9ibHVldG9vdGgvS2NvbmZpZyIKIHNvdXJjZSAibmV0L3J4cnBjL0tjb25maWciCiBzb3VyY2UgIm5ldC9rY20vS2NvbmZpZyIKK3NvdXJjZSAibmV0L3N0cnBhcnNlci9LY29uZmlnIgogCiBjb25maWcgRklCX1JVTEVTCiAJYm9vbApkaWZmIC0tZ2l0IGEvbmV0L01ha2VmaWxlIGIvbmV0L01ha2VmaWxlCmluZGV4IDliZDIwYmIuLjRjYWZhYTIgMTAwNjQ0Ci0tLSBhL25ldC9NYWtlZmlsZQorKysgYi9uZXQvTWFrZWZpbGUKQEAgLTM1LDYgKzM1LDcgQEAKIG9iai0kKENPTkZJR19TVU5SUEMpCQkrPSBzdW5ycGMvCiBvYmotJChDT05GSUdfQUZfUlhSUEMpCQkrPSByeHJwYy8KIG9iai0kKENPTkZJR19BRl9LQ00pCQkrPSBrY20vCitvYmotJChDT05GSUdfU1RSRUFNX1BBUlNFUikJKz0gc3RycGFyc2VyLwogb2JqLSQoQ09ORklHX0FUTSkJCSs9IGF0bS8KIG9iai0kKENPTkZJR19MMlRQKQkJKz0gbDJ0cC8KIG9iai0kKENPTkZJR19ERUNORVQpCQkrPSBkZWNuZXQvCmRpZmYgLS1naXQgYS9uZXQvYXBwbGV0YWxrL2RkcC5jIGIvbmV0L2FwcGxldGFsay9kZHAuYwppbmRleCBmMDY2NzgxLi4xMGQyYmRjIDEwMDY0NAotLS0gYS9uZXQvYXBwbGV0YWxrL2RkcC5jCisrKyBiL25ldC9hcHBsZXRhbGsvZGRwLmMKQEAgLTEyNzgsNyArMTI3OCw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0lQRERQKSB8fCBkZWZpbmVkKENPTkZJR19JUEREUF9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBERFApCiBzdGF0aWMgX19pbmxpbmVfXyBpbnQgaXNfaXBfb3Zlcl9kZHAoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlyZXR1cm4gc2tiLT5kYXRhWzEyXSA9PSAyMjsKZGlmZiAtLWdpdCBhL25ldC9hdG0vbGVjLmMgYi9uZXQvYXRtL2xlYy5jCmluZGV4IGU1NzRhN2UuLjVkMjY5MzggMTAwNjQ0Ci0tLSBhL25ldC9hdG0vbGVjLmMKKysrIGIvbmV0L2F0bS9sZWMuYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2F0bWxlYy5oPgogCiAvKiBQcm94eSBMRUMga25vd3MgYWJvdXQgYnJpZGdpbmcgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19CUklER0UpIHx8IGRlZmluZWQoQ09ORklHX0JSSURHRV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfQlJJREdFKQogI2luY2x1ZGUgIi4uL2JyaWRnZS9icl9wcml2YXRlLmgiCiAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGJyaWRnZV91bGFfbGVjW10gPSB7IDB4MDEsIDB4ODAsIDB4YzIsIDB4MDAsIDB4MDAgfTsKQEAgLTEyMSw3ICsxMjEsNyBAQAogLyogRGV2aWNlIHN0cnVjdHVyZXMgKi8KIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X2xlY1tNQVhfTEVDX0lURl07CiAKLSNpZiBkZWZpbmVkKENPTkZJR19CUklER0UpIHx8IGRlZmluZWQoQ09ORklHX0JSSURHRV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfQlJJREdFKQogc3RhdGljIHZvaWQgbGVjX2hhbmRsZV9icmlkZ2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAljaGFyICpidWZmOwpAQCAtMTU1LDcgKzE1NSw3IEBACiAJCXNrLT5za19kYXRhX3JlYWR5KHNrKTsKIAl9CiB9Ci0jZW5kaWYgLyogZGVmaW5lZChDT05GSUdfQlJJREdFKSB8fCBkZWZpbmVkKENPTkZJR19CUklER0VfTU9EVUxFKSAqLworI2VuZGlmIC8qIElTX0VOQUJMRUQoQ09ORklHX0JSSURHRSkgKi8KIAogLyoKICAqIE9wZW4vaW5pdGlhbGl6ZSB0aGUgbmV0ZGV2aWNlLiBUaGlzIGlzIGNhbGxlZCAoaW4gdGhlIGN1cnJlbnQga2VybmVsKQpAQCAtMjIyLDcgKzIyMiw3IEBACiAJcHJfZGVidWcoInNrYnVmZiBoZWFkOiVseCBkYXRhOiVseCB0YWlsOiVseCBlbmQ6JWx4XG4iLAogCQkgKGxvbmcpc2tiLT5oZWFkLCAobG9uZylza2ItPmRhdGEsIChsb25nKXNrYl90YWlsX3BvaW50ZXIoc2tiKSwKIAkJIChsb25nKXNrYl9lbmRfcG9pbnRlcihza2IpKTsKLSNpZiBkZWZpbmVkKENPTkZJR19CUklER0UpIHx8IGRlZmluZWQoQ09ORklHX0JSSURHRV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfQlJJREdFKQogCWlmIChtZW1jbXAoc2tiLT5kYXRhLCBicmlkZ2VfdWxhX2xlYywgc2l6ZW9mKGJyaWRnZV91bGFfbGVjKSkgPT0gMCkKIAkJbGVjX2hhbmRsZV9icmlkZ2Uoc2tiLCBkZXYpOwogI2VuZGlmCkBAIC00MjYsNyArNDI2LDcgQEAKIAkJICAgICh1bnNpZ25lZCBzaG9ydCkoMHhmZmZmICYgbWVzZy0+Y29udGVudC5ub3JtYWwuZmxhZyk7CiAJCWJyZWFrOwogCWNhc2UgbF9zaG91bGRfYnJpZGdlOgotI2lmIGRlZmluZWQoQ09ORklHX0JSSURHRSkgfHwgZGVmaW5lZChDT05GSUdfQlJJREdFX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19CUklER0UpCiAJewogCQlwcl9kZWJ1ZygiJXM6IGJyaWRnZSB6ZXBwZWxpbiBhc2tzIGFib3V0ICVwTVxuIiwKIAkJCSBkZXYtPm5hbWUsIG1lc2ctPmNvbnRlbnQucHJveHkubWFjX2FkZHIpOwpAQCAtNDUyLDcgKzQ1Miw3IEBACiAJCQlzay0+c2tfZGF0YV9yZWFkeShzayk7CiAJCX0KIAl9Ci0jZW5kaWYgLyogZGVmaW5lZChDT05GSUdfQlJJREdFKSB8fCBkZWZpbmVkKENPTkZJR19CUklER0VfTU9EVUxFKSAqLworI2VuZGlmIC8qIElTX0VOQUJMRUQoQ09ORklHX0JSSURHRSkgKi8KIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJfaW5mbygiJXM6IFVua25vd24gbWVzc2FnZSB0eXBlICVkXG4iLCBkZXYtPm5hbWUsIG1lc2ctPnR5cGUpOwpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9tcGMuYyBiL25ldC9hdG0vbXBjLmMKaW5kZXggMGU5ODIyMi4uM2IzYjFhMiAxMDA2NDQKLS0tIGEvbmV0L2F0bS9tcGMuYworKysgYi9uZXQvYXRtL21wYy5jCkBAIC0xMDA3LDcgKzEwMDcsNyBAQAogCWlmICghbmV0X2VxKGRldl9uZXQoZGV2KSwgJmluaXRfbmV0KSkKIAkJcmV0dXJuIE5PVElGWV9ET05FOwogCi0JaWYgKGRldi0+bmFtZSA9PSBOVUxMIHx8IHN0cm5jbXAoZGV2LT5uYW1lLCAibGVjIiwgMykpCisJaWYgKHN0cm5jbXAoZGV2LT5uYW1lLCAibGVjIiwgMykpCiAJCXJldHVybiBOT1RJRllfRE9ORTsgLyogd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBsZWM6cyAqLwogCiAJc3dpdGNoIChldmVudCkgewpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvS2NvbmZpZyBiL25ldC9iYXRtYW4tYWR2L0tjb25maWcKaW5kZXggODMzYmIxNC4uZjIwNzQyYyAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvS2NvbmZpZworKysgYi9uZXQvYmF0bWFuLWFkdi9LY29uZmlnCkBAIC03MywxMCArNzMsMjEgQEAKIAkgIHJlZHVjZSB0aGUgYWlyIG92ZXJoZWFkIHdoaWxlIGltcHJvdmluZyB0aGUgcmVsaWFiaWxpdHkgb2YKIAkgIG11bHRpY2FzdCBtZXNzYWdlcy4KIAotY29uZmlnIEJBVE1BTl9BRFZfREVCVUcKLQlib29sICJCLkEuVC5NLkEuTi4gZGVidWdnaW5nIgorY29uZmlnIEJBVE1BTl9BRFZfREVCVUdGUworCWJvb2wgImJhdG1hbi1hZHYgZGVidWdmcyBlbnRyaWVzIgogCWRlcGVuZHMgb24gQkFUTUFOX0FEVgogCWRlcGVuZHMgb24gREVCVUdfRlMKKwlkZWZhdWx0IHkKKwloZWxwCisJICBFbmFibGUgdGhpcyB0byBleHBvcnQgcm91dGluZyByZWxhdGVkIGRlYnVnIHRhYmxlcyB2aWEgZGVidWdmcy4KKwkgIFRoZSBpbmZvcm1hdGlvbiBmb3IgZWFjaCBzb2Z0LWludGVyZmFjZSBhbmQgdXNlZCBoYXJkLWludGVyZmFjZSBjYW4gYmUKKwkgIGZvdW5kIHVuZGVyIGJhdG1hbl9hZHYvCisKKwkgIElmIHVuc3VyZSwgc2F5IFkuCisKK2NvbmZpZyBCQVRNQU5fQURWX0RFQlVHCisJYm9vbCAiQi5BLlQuTS5BLk4uIGRlYnVnZ2luZyIKKwlkZXBlbmRzIG9uIEJBVE1BTl9BRFZfREVCVUdGUwogCWhlbHAKIAkgIFRoaXMgaXMgYW4gb3B0aW9uIGZvciB1c2UgYnkgZGV2ZWxvcGVyczsgbW9zdCBwZW9wbGUgc2hvdWxkCiAJICBzYXkgTiBoZXJlLiBUaGlzIGVuYWJsZXMgY29tcGlsYXRpb24gb2Ygc3VwcG9ydCBmb3IKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L01ha2VmaWxlIGIvbmV0L2JhdG1hbi1hZHYvTWFrZWZpbGUKaW5kZXggYTgzZmM2Yy4uZjcyNGQzYyAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvTWFrZWZpbGUKKysrIGIvbmV0L2JhdG1hbi1hZHYvTWFrZWZpbGUKQEAgLTI0LDE0ICsyNCwxNCBAQAogYmF0bWFuLWFkdi0kKENPTkZJR19CQVRNQU5fQURWX0JBVE1BTl9WKSArPSBiYXRfdl9vZ20ubwogYmF0bWFuLWFkdi15ICs9IGJpdGFycmF5Lm8KIGJhdG1hbi1hZHYtJChDT05GSUdfQkFUTUFOX0FEVl9CTEEpICs9IGJyaWRnZV9sb29wX2F2b2lkYW5jZS5vCi1iYXRtYW4tYWR2LSQoQ09ORklHX0RFQlVHX0ZTKSArPSBkZWJ1Z2ZzLm8KK2JhdG1hbi1hZHYtJChDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTKSArPSBkZWJ1Z2ZzLm8KIGJhdG1hbi1hZHYtJChDT05GSUdfQkFUTUFOX0FEVl9EQVQpICs9IGRpc3RyaWJ1dGVkLWFycC10YWJsZS5vCiBiYXRtYW4tYWR2LXkgKz0gZnJhZ21lbnRhdGlvbi5vCiBiYXRtYW4tYWR2LXkgKz0gZ2F0ZXdheV9jbGllbnQubwogYmF0bWFuLWFkdi15ICs9IGdhdGV3YXlfY29tbW9uLm8KIGJhdG1hbi1hZHYteSArPSBoYXJkLWludGVyZmFjZS5vCiBiYXRtYW4tYWR2LXkgKz0gaGFzaC5vCi1iYXRtYW4tYWR2LXkgKz0gaWNtcF9zb2NrZXQubworYmF0bWFuLWFkdi0kKENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMpICs9IGljbXBfc29ja2V0Lm8KIGJhdG1hbi1hZHYtJChDT05GSUdfQkFUTUFOX0FEVl9ERUJVRykgKz0gbG9nLm8KIGJhdG1hbi1hZHYteSArPSBtYWluLm8KIGJhdG1hbi1hZHYtJChDT05GSUdfQkFUTUFOX0FEVl9NQ0FTVCkgKz0gbXVsdGljYXN0Lm8KZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L2JhdF9hbGdvLmMgYi9uZXQvYmF0bWFuLWFkdi9iYXRfYWxnby5jCmluZGV4IDgxZGJiZjUuLjYyM2QwNDMgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2JhdF9hbGdvLmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvYmF0X2FsZ28uYwpAQCAtMjAsMTIgKzIwLDE4IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvcHJpbnRrLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L2JhdG1hbl9hZHYuaD4KIAogI2luY2x1ZGUgImJhdF9hbGdvLmgiCisjaW5jbHVkZSAibmV0bGluay5oIgogCiBjaGFyIGJhdGFkdl9yb3V0aW5nX2FsZ29bMjBdID0gIkJBVE1BTl9JViI7CiBzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQgYmF0YWR2X2FsZ29fbGlzdDsKQEAgLTk1LDYgKzEwMSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCiBpbnQgYmF0YWR2X2FsZ29fc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKIAlzdHJ1Y3QgYmF0YWR2X2FsZ29fb3BzICpiYXRfYWxnb19vcHM7CkBAIC0xMDcsNiArMTE0LDcgQEAKIAogCXJldHVybiAwOwogfQorI2VuZGlmCiAKIHN0YXRpYyBpbnQgYmF0YWR2X3BhcmFtX3NldF9yYShjb25zdCBjaGFyICp2YWwsIGNvbnN0IHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQogewpAQCAtMTM4LDMgKzE0Niw2NSBAQAogCiBtb2R1bGVfcGFyYW1fY2Iocm91dGluZ19hbGdvLCAmYmF0YWR2X3BhcmFtX29wc19yYSwgJmJhdGFkdl9wYXJhbV9zdHJpbmdfcmEsCiAJCTA2NDQpOworCisvKioKKyAqIGJhdGFkdl9hbGdvX2R1bXBfZW50cnkgLSBmaWxsIGluIGluZm9ybWF0aW9uIGFib3V0IG9uZSBzdXBwb3J0ZWQgcm91dGluZworICogIGFsZ29yaXRobQorICogQG1zZzogbmV0bGluayBtZXNzYWdlIHRvIGJlIHNlbnQgYmFjaworICogQHBvcnRpZDogUG9ydCB0byByZXBseSB0bworICogQHNlcTogU2VxdWVuY2UgbnVtYmVyIG9mIG1lc3NhZ2UKKyAqIEBiYXRfYWxnb19vcHM6IEFsZ29yaXRobSB0byBiZSBkdW1wZWQKKyAqCisgKiBSZXR1cm46IEVycm9yIG51bWJlciwgb3IgMCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQgYmF0YWR2X2FsZ29fZHVtcF9lbnRyeShzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCB1MzIgcG9ydGlkLCB1MzIgc2VxLAorCQkJCSAgc3RydWN0IGJhdGFkdl9hbGdvX29wcyAqYmF0X2FsZ29fb3BzKQoreworCXZvaWQgKmhkcjsKKworCWhkciA9IGdlbmxtc2dfcHV0KG1zZywgcG9ydGlkLCBzZXEsICZiYXRhZHZfbmV0bGlua19mYW1pbHksCisJCQkgIE5MTV9GX01VTFRJLCBCQVRBRFZfQ01EX0dFVF9ST1VUSU5HX0FMR09TKTsKKwlpZiAoIWhkcikKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCWlmIChubGFfcHV0X3N0cmluZyhtc2csIEJBVEFEVl9BVFRSX0FMR09fTkFNRSwgYmF0X2FsZ29fb3BzLT5uYW1lKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CisJcmV0dXJuIDA7CisKKyBubGFfcHV0X2ZhaWx1cmU6CisJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworCXJldHVybiAtRU1TR1NJWkU7Cit9CisKKy8qKgorICogYmF0YWR2X2FsZ29fZHVtcCAtIGZpbGwgaW4gaW5mb3JtYXRpb24gYWJvdXQgc3VwcG9ydGVkIHJvdXRpbmcKKyAqICBhbGdvcml0aG1zCisgKiBAbXNnOiBuZXRsaW5rIG1lc3NhZ2UgdG8gYmUgc2VudCBiYWNrCisgKiBAY2I6IFBhcmFtZXRlcnMgdG8gdGhlIG5ldGxpbmsgcmVxdWVzdAorICoKKyAqIFJldHVybjogTGVuZ3RoIG9mIHJlcGx5IG1lc3NhZ2UuCisgKi8KK2ludCBiYXRhZHZfYWxnb19kdW1wKHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlpbnQgcG9ydGlkID0gTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQ7CisJc3RydWN0IGJhdGFkdl9hbGdvX29wcyAqYmF0X2FsZ29fb3BzOworCWludCBza2lwID0gY2ItPmFyZ3NbMF07CisJaW50IGkgPSAwOworCisJaGxpc3RfZm9yX2VhY2hfZW50cnkoYmF0X2FsZ29fb3BzLCAmYmF0YWR2X2FsZ29fbGlzdCwgbGlzdCkgeworCQlpZiAoaSsrIDwgc2tpcCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChiYXRhZHZfYWxnb19kdW1wX2VudHJ5KG1zZywgcG9ydGlkLCBjYi0+bmxoLT5ubG1zZ19zZXEsCisJCQkJCSAgIGJhdF9hbGdvX29wcykpIHsKKwkJCWktLTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJY2ItPmFyZ3NbMF0gPSBpOworCisJcmV0dXJuIG1zZy0+bGVuOworfQpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvYmF0X2FsZ28uaCBiL25ldC9iYXRtYW4tYWR2L2JhdF9hbGdvLmgKaW5kZXggODYwZDc3My4uM2I1YjY5YyAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvYmF0X2FsZ28uaAorKysgYi9uZXQvYmF0bWFuLWFkdi9iYXRfYWxnby5oCkBAIC0yMiw3ICsyMiw5IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCitzdHJ1Y3QgbmV0bGlua19jYWxsYmFjazsKIHN0cnVjdCBzZXFfZmlsZTsKK3N0cnVjdCBza19idWZmOwogCiBleHRlcm4gY2hhciBiYXRhZHZfcm91dGluZ19hbGdvW107CiBleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBiYXRhZHZfaGFyZGlmX2xpc3Q7CkBAIC0zMSw1ICszMyw2IEBACiBpbnQgYmF0YWR2X2FsZ29fcmVnaXN0ZXIoc3RydWN0IGJhdGFkdl9hbGdvX29wcyAqYmF0X2FsZ29fb3BzKTsKIGludCBiYXRhZHZfYWxnb19zZWxlY3Qoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwgY2hhciAqbmFtZSk7CiBpbnQgYmF0YWR2X2FsZ29fc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCk7CitpbnQgYmF0YWR2X2FsZ29fZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOwogCiAjZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX0JBVF9BTEdPX0hfICovCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9iYXRfaXZfb2dtLmMgYi9uZXQvYmF0bWFuLWFkdi9iYXRfaXZfb2dtLmMKaW5kZXggMTliMGFiZC4uZTJkMThkMCAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvYmF0X2l2X29nbS5jCisrKyBiL25ldC9iYXRtYW4tYWR2L2JhdF9pdl9vZ20uYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9sb2NrZGVwLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L3BrdF9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgpAQCAtNDgsMTIgKzQ5LDE3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L2JhdG1hbl9hZHYuaD4KIAogI2luY2x1ZGUgImJhdF9hbGdvLmgiCiAjaW5jbHVkZSAiYml0YXJyYXkuaCIKKyNpbmNsdWRlICJnYXRld2F5X2NsaWVudC5oIgogI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCiAjaW5jbHVkZSAiaGFzaC5oIgogI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgIm5ldGxpbmsuaCIKICNpbmNsdWRlICJuZXR3b3JrLWNvZGluZy5oIgogI2luY2x1ZGUgIm9yaWdpbmF0b3IuaCIKICNpbmNsdWRlICJwYWNrZXQuaCIKQEAgLTMxOCwxNyArMzI0LDE4IEBACiAJaWYgKCFvcmlnX25vZGUtPmJhdF9pdi5iY2FzdF9vd25fc3VtKQogCQlnb3RvIGZyZWVfb3JpZ19ub2RlOwogCisJa3JlZl9nZXQoJm9yaWdfbm9kZS0+cmVmY291bnQpOwogCWhhc2hfYWRkZWQgPSBiYXRhZHZfaGFzaF9hZGQoYmF0X3ByaXYtPm9yaWdfaGFzaCwgYmF0YWR2X2NvbXBhcmVfb3JpZywKIAkJCQkgICAgIGJhdGFkdl9jaG9vc2Vfb3JpZywgb3JpZ19ub2RlLAogCQkJCSAgICAgJm9yaWdfbm9kZS0+aGFzaF9lbnRyeSk7CiAJaWYgKGhhc2hfYWRkZWQgIT0gMCkKLQkJZ290byBmcmVlX29yaWdfbm9kZTsKKwkJZ290byBmcmVlX29yaWdfbm9kZV9oYXNoOwogCiAJcmV0dXJuIG9yaWdfbm9kZTsKIAotZnJlZV9vcmlnX25vZGU6Ci0JLyogZnJlZSB0d2ljZSwgYXMgYmF0YWR2X29yaWdfbm9kZV9uZXcgc2V0cyByZWZjb3VudCB0byAyICovCitmcmVlX29yaWdfbm9kZV9oYXNoOgogCWJhdGFkdl9vcmlnX25vZGVfcHV0KG9yaWdfbm9kZSk7CitmcmVlX29yaWdfbm9kZToKIAliYXRhZHZfb3JpZ19ub2RlX3B1dChvcmlnX25vZGUpOwogCiAJcmV0dXJuIE5VTEw7CkBAIC01MjgsMzYgKzUzNSwyNSBAQAogc3RhdGljIHZvaWQgYmF0YWR2X2l2X29nbV9lbWl0KHN0cnVjdCBiYXRhZHZfZm9yd19wYWNrZXQgKmZvcndfcGFja2V0KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlOwotCXN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXY7Ci0Jc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpwcmltYXJ5X2lmID0gTlVMTDsKIAogCWlmICghZm9yd19wYWNrZXQtPmlmX2luY29taW5nKSB7CiAJCXByX2VycigiRXJyb3IgLSBjYW4ndCBmb3J3YXJkIHBhY2tldDogaW5jb21pbmcgaWZhY2Ugbm90IHNwZWNpZmllZFxuIik7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm47CiAJfQogCiAJc29mdF9pZmFjZSA9IGZvcndfcGFja2V0LT5pZl9pbmNvbWluZy0+c29mdF9pZmFjZTsKLQliYXRfcHJpdiA9IG5ldGRldl9wcml2KHNvZnRfaWZhY2UpOwogCiAJaWYgKFdBUk5fT04oIWZvcndfcGFja2V0LT5pZl9vdXRnb2luZykpCi0JCWdvdG8gb3V0OworCQlyZXR1cm47CiAKIAlpZiAoV0FSTl9PTihmb3J3X3BhY2tldC0+aWZfb3V0Z29pbmctPnNvZnRfaWZhY2UgIT0gc29mdF9pZmFjZSkpCi0JCWdvdG8gb3V0OworCQlyZXR1cm47CiAKIAlpZiAoZm9yd19wYWNrZXQtPmlmX2luY29taW5nLT5pZl9zdGF0dXMgIT0gQkFUQURWX0lGX0FDVElWRSkKLQkJZ290byBvdXQ7Ci0KLQlwcmltYXJ5X2lmID0gYmF0YWR2X3ByaW1hcnlfaWZfZ2V0X3NlbGVjdGVkKGJhdF9wcml2KTsKLQlpZiAoIXByaW1hcnlfaWYpCi0JCWdvdG8gb3V0OworCQlyZXR1cm47CiAKIAkvKiBvbmx5IGZvciBvbmUgc3BlY2lmaWMgb3V0Z29pbmcgaW50ZXJmYWNlICovCiAJYmF0YWR2X2l2X29nbV9zZW5kX3RvX2lmKGZvcndfcGFja2V0LCBmb3J3X3BhY2tldC0+aWZfb3V0Z29pbmcpOwotCi1vdXQ6Ci0JaWYgKHByaW1hcnlfaWYpCi0JCWJhdGFkdl9oYXJkaWZfcHV0KHByaW1hcnlfaWYpOwogfQogCiAvKioKQEAgLTY4NSwxOSArNjgxLDEyIEBACiAJc3RydWN0IGJhdGFkdl9mb3J3X3BhY2tldCAqZm9yd19wYWNrZXRfYWdncjsKIAl1bnNpZ25lZCBjaGFyICpza2JfYnVmZjsKIAl1bnNpZ25lZCBpbnQgc2tiX3NpemU7CisJYXRvbWljX3QgKnF1ZXVlX2xlZnQgPSBvd25fcGFja2V0ID8gTlVMTCA6ICZiYXRfcHJpdi0+YmF0bWFuX3F1ZXVlX2xlZnQ7CiAKLQkvKiBvd24gcGFja2V0IHNob3VsZCBhbHdheXMgYmUgc2NoZWR1bGVkICovCi0JaWYgKCFvd25fcGFja2V0KSB7Ci0JCWlmICghYmF0YWR2X2F0b21pY19kZWNfbm90X3plcm8oJmJhdF9wcml2LT5iYXRtYW5fcXVldWVfbGVmdCkpIHsKLQkJCWJhdGFkdl9kYmcoQkFUQURWX0RCR19CQVRNQU4sIGJhdF9wcml2LAotCQkJCSAgICJiYXRtYW4gcGFja2V0IHF1ZXVlIGZ1bGxcbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JZm9yd19wYWNrZXRfYWdnciA9IGttYWxsb2Moc2l6ZW9mKCpmb3J3X3BhY2tldF9hZ2dyKSwgR0ZQX0FUT01JQyk7CisJZm9yd19wYWNrZXRfYWdnciA9IGJhdGFkdl9mb3J3X3BhY2tldF9hbGxvYyhpZl9pbmNvbWluZywgaWZfb3V0Z29pbmcsCisJCQkJCQkgICAgcXVldWVfbGVmdCwgYmF0X3ByaXYpOwogCWlmICghZm9yd19wYWNrZXRfYWdncikKLQkJZ290byBvdXRfbm9tZW07CisJCXJldHVybjsKIAogCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmFnZ3JlZ2F0ZWRfb2dtcykgJiYKIAkgICAgcGFja2V0X2xlbiA8IEJBVEFEVl9NQVhfQUdHUkVHQVRJT05fQllURVMpCkBAIC03MDgsOCArNjk3LDExIEBACiAJc2tiX3NpemUgKz0gRVRIX0hMRU47CiAKIAlmb3J3X3BhY2tldF9hZ2dyLT5za2IgPSBuZXRkZXZfYWxsb2Nfc2tiX2lwX2FsaWduKE5VTEwsIHNrYl9zaXplKTsKLQlpZiAoIWZvcndfcGFja2V0X2FnZ3ItPnNrYikKLQkJZ290byBvdXRfZnJlZV9mb3J3X3BhY2tldDsKKwlpZiAoIWZvcndfcGFja2V0X2FnZ3ItPnNrYikgeworCQliYXRhZHZfZm9yd19wYWNrZXRfZnJlZShmb3J3X3BhY2tldF9hZ2dyKTsKKwkJcmV0dXJuOworCX0KKwogCWZvcndfcGFja2V0X2FnZ3ItPnNrYi0+cHJpb3JpdHkgPSBUQ19QUklPX0NPTlRST0w7CiAJc2tiX3Jlc2VydmUoZm9yd19wYWNrZXRfYWdnci0+c2tiLCBFVEhfSExFTik7CiAKQEAgLTcxNywxMiArNzA5LDcgQEAKIAlmb3J3X3BhY2tldF9hZ2dyLT5wYWNrZXRfbGVuID0gcGFja2V0X2xlbjsKIAltZW1jcHkoc2tiX2J1ZmYsIHBhY2tldF9idWZmLCBwYWNrZXRfbGVuKTsKIAotCWtyZWZfZ2V0KCZpZl9pbmNvbWluZy0+cmVmY291bnQpOwotCWtyZWZfZ2V0KCZpZl9vdXRnb2luZy0+cmVmY291bnQpOwogCWZvcndfcGFja2V0X2FnZ3ItPm93biA9IG93bl9wYWNrZXQ7Ci0JZm9yd19wYWNrZXRfYWdnci0+aWZfaW5jb21pbmcgPSBpZl9pbmNvbWluZzsKLQlmb3J3X3BhY2tldF9hZ2dyLT5pZl9vdXRnb2luZyA9IGlmX291dGdvaW5nOwotCWZvcndfcGFja2V0X2FnZ3ItPm51bV9wYWNrZXRzID0gMDsKIAlmb3J3X3BhY2tldF9hZ2dyLT5kaXJlY3RfbGlua19mbGFncyA9IEJBVEFEVl9OT19GTEFHUzsKIAlmb3J3X3BhY2tldF9hZ2dyLT5zZW5kX3RpbWUgPSBzZW5kX3RpbWU7CiAKQEAgLTc0MSwxMyArNzI4LDYgQEAKIAlxdWV1ZV9kZWxheWVkX3dvcmsoYmF0YWR2X2V2ZW50X3dvcmtxdWV1ZSwKIAkJCSAgICZmb3J3X3BhY2tldF9hZ2dyLT5kZWxheWVkX3dvcmssCiAJCQkgICBzZW5kX3RpbWUgLSBqaWZmaWVzKTsKLQotCXJldHVybjsKLW91dF9mcmVlX2ZvcndfcGFja2V0OgotCWtmcmVlKGZvcndfcGFja2V0X2FnZ3IpOwotb3V0X25vbWVtOgotCWlmICghb3duX3BhY2tldCkKLQkJYXRvbWljX2luYygmYmF0X3ByaXYtPmJhdG1hbl9xdWV1ZV9sZWZ0KTsKIH0KIAogLyogYWdncmVnYXRlIGEgbmV3IHBhY2tldCBpbnRvIHRoZSBleGlzdGluZyBvZ20gcGFja2V0ICovCkBAIC0xODMwLDEwICsxODEwLDYgQEAKIAkJYmF0YWR2X2l2X29nbV9zY2hlZHVsZShmb3J3X3BhY2tldC0+aWZfaW5jb21pbmcpOwogCiBvdXQ6Ci0JLyogZG9uJ3QgY291bnQgb3duIHBhY2tldCAqLwotCWlmICghZm9yd19wYWNrZXQtPm93bikKLQkJYXRvbWljX2luYygmYmF0X3ByaXYtPmJhdG1hbl9xdWV1ZV9sZWZ0KTsKLQogCWJhdGFkdl9mb3J3X3BhY2tldF9mcmVlKGZvcndfcGFja2V0KTsKIH0KIApAQCAtMTg3OSw2ICsxODU1LDcgQEAKIAlyZXR1cm4gTkVUX1JYX1NVQ0NFU1M7CiB9CiAKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCiAvKioKICAqIGJhdGFkdl9pdl9vZ21fb3JpZ19wcmludF9uZWlnaCAtIHByaW50IG5laWdoYm9ycyBmb3IgdGhlIG9yaWdpbmF0b3IgdGFibGUKICAqIEBvcmlnX25vZGU6IHRoZSBvcmlnX25vZGUgZm9yIHdoaWNoIHRoZSBuZWlnaGJvcnMgYXJlIHByaW50ZWQKQEAgLTE5NzYsOCArMTk1MywyMzkgQEAKIAlpZiAoYmF0bWFuX2NvdW50ID09IDApCiAJCXNlcV9wdXRzKHNlcSwgIk5vIGJhdG1hbiBub2RlcyBpbiByYW5nZSAuLi5cbiIpOwogfQorI2VuZGlmCiAKIC8qKgorICogYmF0YWR2X2l2X29nbV9uZWlnaF9nZXRfdHFfYXZnIC0gR2V0IHRoZSBUUSBhdmVyYWdlIGZvciBhIG5laWdoYm91ciBvbiBhCisgKiAgZ2l2ZW4gb3V0Z29pbmcgaW50ZXJmYWNlLgorICogQG5laWdoX25vZGU6IE5laWdoYm91ciBvZiBpbnRlcmVzdAorICogQGlmX291dGdvaW5nOiBPdXRnb2luZyBpbnRlcmZhY2Ugb2YgaW50ZXJlc3QKKyAqIEB0cV9hdmc6IFBvaW50ZXIgb2Ygd2hlcmUgdG8gc3RvcmUgdGhlIFRRIGF2ZXJhZ2UKKyAqCisgKiBSZXR1cm46IEZhbHNlIGlmIG5vIGF2ZXJhZ2UgVFEgYXZhaWxhYmxlLCBvdGhlcndpc2UgdHJ1ZS4KKyAqLworc3RhdGljIGJvb2wKK2JhdGFkdl9pdl9vZ21fbmVpZ2hfZ2V0X3RxX2F2ZyhzdHJ1Y3QgYmF0YWR2X25laWdoX25vZGUgKm5laWdoX25vZGUsCisJCQkgICAgICAgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICppZl9vdXRnb2luZywKKwkJCSAgICAgICB1OCAqdHFfYXZnKQoreworCXN0cnVjdCBiYXRhZHZfbmVpZ2hfaWZpbmZvICpuX2lmaW5mbzsKKworCW5faWZpbmZvID0gYmF0YWR2X25laWdoX2lmaW5mb19nZXQobmVpZ2hfbm9kZSwgaWZfb3V0Z29pbmcpOworCWlmICghbl9pZmluZm8pCisJCXJldHVybiBmYWxzZTsKKworCSp0cV9hdmcgPSBuX2lmaW5mby0+YmF0X2l2LnRxX2F2ZzsKKwliYXRhZHZfbmVpZ2hfaWZpbmZvX3B1dChuX2lmaW5mbyk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBiYXRhZHZfaXZfb2dtX29yaWdfZHVtcF9zdWJlbnRyeSAtIER1bXAgYW4gb3JpZ2luYXRvciBzdWJlbnRyeSBpbnRvIGEKKyAqICBtZXNzYWdlCisgKiBAbXNnOiBOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAcG9ydGlkOiBQb3J0IG1ha2luZyBuZXRsaW5rIHJlcXVlc3QKKyAqIEBzZXE6IFNlcXVlbmNlIG51bWJlciBvZiBuZXRsaW5rIG1lc3NhZ2UKKyAqIEBiYXRfcHJpdjogVGhlIGJhdCBwcml2IHdpdGggYWxsIHRoZSBzb2Z0IGludGVyZmFjZSBpbmZvcm1hdGlvbgorICogQGlmX291dGdvaW5nOiBMaW1pdCBkdW1wIHRvIGVudHJpZXMgd2l0aCB0aGlzIG91dGdvaW5nIGludGVyZmFjZQorICogQG9yaWdfbm9kZTogT3JpZ2luYXRvciB0byBkdW1wCisgKiBAbmVpZ2hfbm9kZTogU2luZ2xlIGhvcHMgbmVpZ2hib3VyCisgKiBAYmVzdDogSXMgdGhlIGJlc3Qgb3JpZ2luYXRvcgorICoKKyAqIFJldHVybjogRXJyb3IgY29kZSwgb3IgMCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK2JhdGFkdl9pdl9vZ21fb3JpZ19kdW1wX3N1YmVudHJ5KHN0cnVjdCBza19idWZmICptc2csIHUzMiBwb3J0aWQsIHUzMiBzZXEsCisJCQkJIHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCQkJIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaWZfb3V0Z29pbmcsCisJCQkJIHN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpvcmlnX25vZGUsCisJCQkJIHN0cnVjdCBiYXRhZHZfbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZSwKKwkJCQkgYm9vbCBiZXN0KQoreworCXZvaWQgKmhkcjsKKwl1OCB0cV9hdmc7CisJdW5zaWduZWQgaW50IGxhc3Rfc2Vlbl9tc2VjczsKKworCWxhc3Rfc2Vlbl9tc2VjcyA9IGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIG9yaWdfbm9kZS0+bGFzdF9zZWVuKTsKKworCWlmICghYmF0YWR2X2l2X29nbV9uZWlnaF9nZXRfdHFfYXZnKG5laWdoX25vZGUsIGlmX291dGdvaW5nLCAmdHFfYXZnKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoaWZfb3V0Z29pbmcgIT0gQkFUQURWX0lGX0RFRkFVTFQgJiYKKwkgICAgaWZfb3V0Z29pbmcgIT0gbmVpZ2hfbm9kZS0+aWZfaW5jb21pbmcpCisJCXJldHVybiAwOworCisJaGRyID0gZ2VubG1zZ19wdXQobXNnLCBwb3J0aWQsIHNlcSwgJmJhdGFkdl9uZXRsaW5rX2ZhbWlseSwKKwkJCSAgTkxNX0ZfTVVMVEksIEJBVEFEVl9DTURfR0VUX09SSUdJTkFUT1JTKTsKKwlpZiAoIWhkcikKKwkJcmV0dXJuIC1FTk9CVUZTOworCisJaWYgKG5sYV9wdXQobXNnLCBCQVRBRFZfQVRUUl9PUklHX0FERFJFU1MsIEVUSF9BTEVOLAorCQkgICAgb3JpZ19ub2RlLT5vcmlnKSB8fAorCSAgICBubGFfcHV0KG1zZywgQkFUQURWX0FUVFJfTkVJR0hfQUREUkVTUywgRVRIX0FMRU4sCisJCSAgICBuZWlnaF9ub2RlLT5hZGRyKSB8fAorCSAgICBubGFfcHV0X3UzMihtc2csIEJBVEFEVl9BVFRSX0hBUkRfSUZJTkRFWCwKKwkJCW5laWdoX25vZGUtPmlmX2luY29taW5nLT5uZXRfZGV2LT5pZmluZGV4KSB8fAorCSAgICBubGFfcHV0X3U4KG1zZywgQkFUQURWX0FUVFJfVFEsIHRxX2F2ZykgfHwKKwkgICAgbmxhX3B1dF91MzIobXNnLCBCQVRBRFZfQVRUUl9MQVNUX1NFRU5fTVNFQ1MsCisJCQlsYXN0X3NlZW5fbXNlY3MpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWlmIChiZXN0ICYmIG5sYV9wdXRfZmxhZyhtc2csIEJBVEFEVl9BVFRSX0ZMQUdfQkVTVCkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOworCXJldHVybiAwOworCisgbmxhX3B1dF9mYWlsdXJlOgorCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorCisvKioKKyAqIGJhdGFkdl9pdl9vZ21fb3JpZ19kdW1wX2VudHJ5IC0gRHVtcCBhbiBvcmlnaW5hdG9yIGVudHJ5IGludG8gYSBtZXNzYWdlCisgKiBAbXNnOiBOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAcG9ydGlkOiBQb3J0IG1ha2luZyBuZXRsaW5rIHJlcXVlc3QKKyAqIEBzZXE6IFNlcXVlbmNlIG51bWJlciBvZiBuZXRsaW5rIG1lc3NhZ2UKKyAqIEBiYXRfcHJpdjogVGhlIGJhdCBwcml2IHdpdGggYWxsIHRoZSBzb2Z0IGludGVyZmFjZSBpbmZvcm1hdGlvbgorICogQGlmX291dGdvaW5nOiBMaW1pdCBkdW1wIHRvIGVudHJpZXMgd2l0aCB0aGlzIG91dGdvaW5nIGludGVyZmFjZQorICogQG9yaWdfbm9kZTogT3JpZ2luYXRvciB0byBkdW1wCisgKiBAc3ViX3M6IE51bWJlciBvZiBzdWIgZW50cmllcyB0byBza2lwCisgKgorICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoZSBjYWxsZXIgaG9sZHMgcmN1X3JlYWRfbG9jaygpLgorICoKKyAqIFJldHVybjogRXJyb3IgY29kZSwgb3IgMCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK2JhdGFkdl9pdl9vZ21fb3JpZ19kdW1wX2VudHJ5KHN0cnVjdCBza19idWZmICptc2csIHUzMiBwb3J0aWQsIHUzMiBzZXEsCisJCQkgICAgICBzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkJICAgICAgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICppZl9vdXRnb2luZywKKwkJCSAgICAgIHN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpvcmlnX25vZGUsIGludCAqc3ViX3MpCit7CisJc3RydWN0IGJhdGFkdl9uZWlnaF9ub2RlICpuZWlnaF9ub2RlX2Jlc3Q7CisJc3RydWN0IGJhdGFkdl9uZWlnaF9ub2RlICpuZWlnaF9ub2RlOworCWludCBzdWIgPSAwOworCWJvb2wgYmVzdDsKKwl1OCB0cV9hdmdfYmVzdDsKKworCW5laWdoX25vZGVfYmVzdCA9IGJhdGFkdl9vcmlnX3JvdXRlcl9nZXQob3JpZ19ub2RlLCBpZl9vdXRnb2luZyk7CisJaWYgKCFuZWlnaF9ub2RlX2Jlc3QpCisJCWdvdG8gb3V0OworCisJaWYgKCFiYXRhZHZfaXZfb2dtX25laWdoX2dldF90cV9hdmcobmVpZ2hfbm9kZV9iZXN0LCBpZl9vdXRnb2luZywKKwkJCQkJICAgICZ0cV9hdmdfYmVzdCkpCisJCWdvdG8gb3V0OworCisJaWYgKHRxX2F2Z19iZXN0ID09IDApCisJCWdvdG8gb3V0OworCisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KG5laWdoX25vZGUsICZvcmlnX25vZGUtPm5laWdoX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHN1YisrIDwgKnN1Yl9zKQorCQkJY29udGludWU7CisKKwkJYmVzdCA9IChuZWlnaF9ub2RlID09IG5laWdoX25vZGVfYmVzdCk7CisKKwkJaWYgKGJhdGFkdl9pdl9vZ21fb3JpZ19kdW1wX3N1YmVudHJ5KG1zZywgcG9ydGlkLCBzZXEsCisJCQkJCQkgICAgIGJhdF9wcml2LCBpZl9vdXRnb2luZywKKwkJCQkJCSAgICAgb3JpZ19ub2RlLCBuZWlnaF9ub2RlLAorCQkJCQkJICAgICBiZXN0KSkgeworCQkJYmF0YWR2X25laWdoX25vZGVfcHV0KG5laWdoX25vZGVfYmVzdCk7CisKKwkJCSpzdWJfcyA9IHN1YiAtIDE7CisJCQlyZXR1cm4gLUVNU0dTSVpFOworCQl9CisJfQorCisgb3V0OgorCWlmIChuZWlnaF9ub2RlX2Jlc3QpCisJCWJhdGFkdl9uZWlnaF9ub2RlX3B1dChuZWlnaF9ub2RlX2Jlc3QpOworCisJKnN1Yl9zID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBiYXRhZHZfaXZfb2dtX29yaWdfZHVtcF9idWNrZXQgLSBEdW1wIGFuIG9yaWdpbmF0b3IgYnVja2V0IGludG8gYQorICogIG1lc3NhZ2UKKyAqIEBtc2c6IE5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBwb3J0aWQ6IFBvcnQgbWFraW5nIG5ldGxpbmsgcmVxdWVzdAorICogQHNlcTogU2VxdWVuY2UgbnVtYmVyIG9mIG5ldGxpbmsgbWVzc2FnZQorICogQGJhdF9wcml2OiBUaGUgYmF0IHByaXYgd2l0aCBhbGwgdGhlIHNvZnQgaW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKiBAaWZfb3V0Z29pbmc6IExpbWl0IGR1bXAgdG8gZW50cmllcyB3aXRoIHRoaXMgb3V0Z29pbmcgaW50ZXJmYWNlCisgKiBAaGVhZDogQnVja2V0IHRvIGJlIGR1bXBlZAorICogQGlkeF9zOiBOdW1iZXIgb2YgZW50cmllcyB0byBiZSBza2lwcGVkCisgKiBAc3ViOiBOdW1iZXIgb2Ygc3ViIGVudHJpZXMgdG8gYmUgc2tpcHBlZAorICoKKyAqIFJldHVybjogRXJyb3IgY29kZSwgb3IgMCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK2JhdGFkdl9pdl9vZ21fb3JpZ19kdW1wX2J1Y2tldChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCB1MzIgcG9ydGlkLCB1MzIgc2VxLAorCQkJICAgICAgIHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCQkgICAgICAgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICppZl9vdXRnb2luZywKKwkJCSAgICAgICBzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCwgaW50ICppZHhfcywgaW50ICpzdWIpCit7CisJc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKm9yaWdfbm9kZTsKKwlpbnQgaWR4ID0gMDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uob3JpZ19ub2RlLCBoZWFkLCBoYXNoX2VudHJ5KSB7CisJCWlmIChpZHgrKyA8ICppZHhfcykKKwkJCWNvbnRpbnVlOworCisJCWlmIChiYXRhZHZfaXZfb2dtX29yaWdfZHVtcF9lbnRyeShtc2csIHBvcnRpZCwgc2VxLCBiYXRfcHJpdiwKKwkJCQkJCSAgaWZfb3V0Z29pbmcsIG9yaWdfbm9kZSwKKwkJCQkJCSAgc3ViKSkgeworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQkqaWR4X3MgPSBpZHggLSAxOworCQkJcmV0dXJuIC1FTVNHU0laRTsKKwkJfQorCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCSppZHhfcyA9IDA7CisJKnN1YiA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYmF0YWR2X2l2X29nbV9vcmlnX2R1bXAgLSBEdW1wIHRoZSBvcmlnaW5hdG9ycyBpbnRvIGEgbWVzc2FnZQorICogQG1zZzogTmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQGNiOiBDb250cm9sIGJsb2NrIGNvbnRhaW5pbmcgYWRkaXRpb25hbCBvcHRpb25zCisgKiBAYmF0X3ByaXY6IFRoZSBiYXQgcHJpdiB3aXRoIGFsbCB0aGUgc29mdCBpbnRlcmZhY2UgaW5mb3JtYXRpb24KKyAqIEBpZl9vdXRnb2luZzogTGltaXQgZHVtcCB0byBlbnRyaWVzIHdpdGggdGhpcyBvdXRnb2luZyBpbnRlcmZhY2UKKyAqLworc3RhdGljIHZvaWQKK2JhdGFkdl9pdl9vZ21fb3JpZ19kdW1wKHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKKwkJCXN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCQlzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmlmX291dGdvaW5nKQoreworCXN0cnVjdCBiYXRhZHZfaGFzaHRhYmxlICpoYXNoID0gYmF0X3ByaXYtPm9yaWdfaGFzaDsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKKwlpbnQgYnVja2V0ID0gY2ItPmFyZ3NbMF07CisJaW50IGlkeCA9IGNiLT5hcmdzWzFdOworCWludCBzdWIgPSBjYi0+YXJnc1syXTsKKwlpbnQgcG9ydGlkID0gTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQ7CisKKwl3aGlsZSAoYnVja2V0IDwgaGFzaC0+c2l6ZSkgeworCQloZWFkID0gJmhhc2gtPnRhYmxlW2J1Y2tldF07CisKKwkJaWYgKGJhdGFkdl9pdl9vZ21fb3JpZ19kdW1wX2J1Y2tldChtc2csIHBvcnRpZCwKKwkJCQkJCSAgIGNiLT5ubGgtPm5sbXNnX3NlcSwKKwkJCQkJCSAgIGJhdF9wcml2LCBpZl9vdXRnb2luZywgaGVhZCwKKwkJCQkJCSAgICZpZHgsICZzdWIpKQorCQkJYnJlYWs7CisKKwkJYnVja2V0Kys7CisJfQorCisJY2ItPmFyZ3NbMF0gPSBidWNrZXQ7CisJY2ItPmFyZ3NbMV0gPSBpZHg7CisJY2ItPmFyZ3NbMl0gPSBzdWI7Cit9CisKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCisvKioKICAqIGJhdGFkdl9pdl9oYXJkaWZfbmVpZ2hfcHJpbnQgLSBwcmludCBhIHNpbmdsZSBob3AgbmVpZ2hib3VyIG5vZGUKICAqIEBzZXE6IG5laWdoYm91ciB0YWJsZSBzZXFfZmlsZSBzdHJ1Y3QKICAqIEBoYXJkaWZfbmVpZ2g6IGhhcmRpZiBuZWlnaGJvdXIgaW5mb3JtYXRpb24KQEAgLTIwMjcsNiArMjIzNSwxODIgQEAKIAlpZiAoYmF0bWFuX2NvdW50ID09IDApCiAJCXNlcV9wdXRzKHNlcSwgIk5vIGJhdG1hbiBub2RlcyBpbiByYW5nZSAuLi5cbiIpOwogfQorI2VuZGlmCisKKy8qKgorICogYmF0YWR2X2l2X29nbV9uZWlnaF9kaWZmIC0gY2FsY3VsYXRlIHRxIGRpZmZlcmVuY2Ugb2YgdHdvIG5laWdoYm9ycworICogQG5laWdoMTogdGhlIGZpcnN0IG5laWdoYm9yIG9iamVjdCBvZiB0aGUgY29tcGFyaXNvbgorICogQGlmX291dGdvaW5nMTogb3V0Z29pbmcgaW50ZXJmYWNlIGZvciB0aGUgZmlyc3QgbmVpZ2hib3IKKyAqIEBuZWlnaDI6IHRoZSBzZWNvbmQgbmVpZ2hib3Igb2JqZWN0IG9mIHRoZSBjb21wYXJpc29uCisgKiBAaWZfb3V0Z29pbmcyOiBvdXRnb2luZyBpbnRlcmZhY2UgZm9yIHRoZSBzZWNvbmQgbmVpZ2hib3IKKyAqIEBkaWZmOiBwb2ludGVyIHRvIGludGVnZXIgcmVjZWl2aW5nIHRoZSBjYWxjdWxhdGVkIGRpZmZlcmVuY2UKKyAqCisgKiBUaGUgY29udGVudCBvZiAqQGRpZmYgaXMgb25seSB2YWxpZCB3aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlLgorICogSXQgaXMgbGVzcywgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIDAgaWYgdGhlIG1ldHJpYyB2aWEgbmVpZ2gxIGlzIGxvd2VyLAorICogdGhlIHNhbWUgYXMgb3IgaGlnaGVyIHRoYW4gdGhlIG1ldHJpYyB2aWEgbmVpZ2gyCisgKgorICogUmV0dXJuOiB0cnVlIHdoZW4gdGhlIGRpZmZlcmVuY2UgY291bGQgYmUgY2FsY3VsYXRlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBib29sIGJhdGFkdl9pdl9vZ21fbmVpZ2hfZGlmZihzdHJ1Y3QgYmF0YWR2X25laWdoX25vZGUgKm5laWdoMSwKKwkJCQkgICAgIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaWZfb3V0Z29pbmcxLAorCQkJCSAgICAgc3RydWN0IGJhdGFkdl9uZWlnaF9ub2RlICpuZWlnaDIsCisJCQkJICAgICBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmlmX291dGdvaW5nMiwKKwkJCQkgICAgIGludCAqZGlmZikKK3sKKwlzdHJ1Y3QgYmF0YWR2X25laWdoX2lmaW5mbyAqbmVpZ2gxX2lmaW5mbywgKm5laWdoMl9pZmluZm87CisJdTggdHExLCB0cTI7CisJYm9vbCByZXQgPSB0cnVlOworCisJbmVpZ2gxX2lmaW5mbyA9IGJhdGFkdl9uZWlnaF9pZmluZm9fZ2V0KG5laWdoMSwgaWZfb3V0Z29pbmcxKTsKKwluZWlnaDJfaWZpbmZvID0gYmF0YWR2X25laWdoX2lmaW5mb19nZXQobmVpZ2gyLCBpZl9vdXRnb2luZzIpOworCisJaWYgKCFuZWlnaDFfaWZpbmZvIHx8ICFuZWlnaDJfaWZpbmZvKSB7CisJCXJldCA9IGZhbHNlOworCQlnb3RvIG91dDsKKwl9CisKKwl0cTEgPSBuZWlnaDFfaWZpbmZvLT5iYXRfaXYudHFfYXZnOworCXRxMiA9IG5laWdoMl9pZmluZm8tPmJhdF9pdi50cV9hdmc7CisJKmRpZmYgPSAoaW50KXRxMSAtIChpbnQpdHEyOworCitvdXQ6CisJaWYgKG5laWdoMV9pZmluZm8pCisJCWJhdGFkdl9uZWlnaF9pZmluZm9fcHV0KG5laWdoMV9pZmluZm8pOworCWlmIChuZWlnaDJfaWZpbmZvKQorCQliYXRhZHZfbmVpZ2hfaWZpbmZvX3B1dChuZWlnaDJfaWZpbmZvKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYmF0YWR2X2l2X29nbV9uZWlnaF9kdW1wX25laWdoIC0gRHVtcCBhIG5laWdoYm91ciBpbnRvIGEgbmV0bGluayBtZXNzYWdlCisgKiBAbXNnOiBOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAcG9ydGlkOiBQb3J0IG1ha2luZyBuZXRsaW5rIHJlcXVlc3QKKyAqIEBzZXE6IFNlcXVlbmNlIG51bWJlciBvZiBuZXRsaW5rIG1lc3NhZ2UKKyAqIEBoYXJkaWZfbmVpZ2g6IE5laWdoYm91ciB0byBiZSBkdW1wZWQKKyAqCisgKiBSZXR1cm46IEVycm9yIGNvZGUsIG9yIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50CitiYXRhZHZfaXZfb2dtX25laWdoX2R1bXBfbmVpZ2goc3RydWN0IHNrX2J1ZmYgKm1zZywgdTMyIHBvcnRpZCwgdTMyIHNlcSwKKwkJCSAgICAgICBzdHJ1Y3QgYmF0YWR2X2hhcmRpZl9uZWlnaF9ub2RlICpoYXJkaWZfbmVpZ2gpCit7CisJdm9pZCAqaGRyOworCXVuc2lnbmVkIGludCBsYXN0X3NlZW5fbXNlY3M7CisKKwlsYXN0X3NlZW5fbXNlY3MgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBoYXJkaWZfbmVpZ2gtPmxhc3Rfc2Vlbik7CisKKwloZHIgPSBnZW5sbXNnX3B1dChtc2csIHBvcnRpZCwgc2VxLCAmYmF0YWR2X25ldGxpbmtfZmFtaWx5LAorCQkJICBOTE1fRl9NVUxUSSwgQkFUQURWX0NNRF9HRVRfTkVJR0hCT1JTKTsKKwlpZiAoIWhkcikKKwkJcmV0dXJuIC1FTk9CVUZTOworCisJaWYgKG5sYV9wdXQobXNnLCBCQVRBRFZfQVRUUl9ORUlHSF9BRERSRVNTLCBFVEhfQUxFTiwKKwkJICAgIGhhcmRpZl9uZWlnaC0+YWRkcikgfHwKKwkgICAgbmxhX3B1dF91MzIobXNnLCBCQVRBRFZfQVRUUl9IQVJEX0lGSU5ERVgsCisJCQloYXJkaWZfbmVpZ2gtPmlmX2luY29taW5nLT5uZXRfZGV2LT5pZmluZGV4KSB8fAorCSAgICBubGFfcHV0X3UzMihtc2csIEJBVEFEVl9BVFRSX0xBU1RfU0VFTl9NU0VDUywKKwkJCWxhc3Rfc2Vlbl9tc2VjcykpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOworCXJldHVybiAwOworCisgbmxhX3B1dF9mYWlsdXJlOgorCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorCisvKioKKyAqIGJhdGFkdl9pdl9vZ21fbmVpZ2hfZHVtcF9oYXJkaWYgLSBEdW1wIHRoZSBuZWlnaGJvdXJzIG9mIGEgaGFyZCBpbnRlcmZhY2UKKyAqICBpbnRvIGEgbWVzc2FnZQorICogQG1zZzogTmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQHBvcnRpZDogUG9ydCBtYWtpbmcgbmV0bGluayByZXF1ZXN0CisgKiBAc2VxOiBTZXF1ZW5jZSBudW1iZXIgb2YgbmV0bGluayBtZXNzYWdlCisgKiBAYmF0X3ByaXY6IFRoZSBiYXQgcHJpdiB3aXRoIGFsbCB0aGUgc29mdCBpbnRlcmZhY2UgaW5mb3JtYXRpb24KKyAqIEBoYXJkX2lmYWNlOiBIYXJkIGludGVyZmFjZSB0byBkdW1wIHRoZSBuZWlnaGJvdXJzIGZvcgorICogQGlkeF9zOiBOdW1iZXIgb2YgZW50cmllcyB0byBza2lwCisgKgorICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoZSBjYWxsZXIgaG9sZHMgcmN1X3JlYWRfbG9jaygpLgorICoKKyAqIFJldHVybjogRXJyb3IgY29kZSwgb3IgMCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK2JhdGFkdl9pdl9vZ21fbmVpZ2hfZHVtcF9oYXJkaWYoc3RydWN0IHNrX2J1ZmYgKm1zZywgdTMyIHBvcnRpZCwgdTMyIHNlcSwKKwkJCQlzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkJCXN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaGFyZF9pZmFjZSwKKwkJCQlpbnQgKmlkeF9zKQoreworCXN0cnVjdCBiYXRhZHZfaGFyZGlmX25laWdoX25vZGUgKmhhcmRpZl9uZWlnaDsKKwlpbnQgaWR4ID0gMDsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShoYXJkaWZfbmVpZ2gsCisJCQkJICZoYXJkX2lmYWNlLT5uZWlnaF9saXN0LCBsaXN0KSB7CisJCWlmIChpZHgrKyA8ICppZHhfcykKKwkJCWNvbnRpbnVlOworCisJCWlmIChiYXRhZHZfaXZfb2dtX25laWdoX2R1bXBfbmVpZ2gobXNnLCBwb3J0aWQsIHNlcSwKKwkJCQkJCSAgIGhhcmRpZl9uZWlnaCkpIHsKKwkJCSppZHhfcyA9IGlkeCAtIDE7CisJCQlyZXR1cm4gLUVNU0dTSVpFOworCQl9CisJfQorCisJKmlkeF9zID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBiYXRhZHZfaXZfb2dtX25laWdoX2R1bXAgLSBEdW1wIHRoZSBuZWlnaGJvdXJzIGludG8gYSBtZXNzYWdlCisgKiBAbXNnOiBOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAY2I6IENvbnRyb2wgYmxvY2sgY29udGFpbmluZyBhZGRpdGlvbmFsIG9wdGlvbnMKKyAqIEBiYXRfcHJpdjogVGhlIGJhdCBwcml2IHdpdGggYWxsIHRoZSBzb2Z0IGludGVyZmFjZSBpbmZvcm1hdGlvbgorICogQHNpbmdsZV9oYXJkaWY6IExpbWl0IGR1bXAgdG8gdGhpcyBoYXJkIGludGVyZmFhY2UKKyAqLworc3RhdGljIHZvaWQKK2JhdGFkdl9pdl9vZ21fbmVpZ2hfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCisJCQkgc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJCSBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKnNpbmdsZV9oYXJkaWYpCit7CisJc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpoYXJkX2lmYWNlOworCWludCBpX2hhcmRpZiA9IDA7CisJaW50IGlfaGFyZGlmX3MgPSBjYi0+YXJnc1swXTsKKwlpbnQgaWR4ID0gY2ItPmFyZ3NbMV07CisJaW50IHBvcnRpZCA9IE5FVExJTktfQ0IoY2ItPnNrYikucG9ydGlkOworCisJcmN1X3JlYWRfbG9jaygpOworCWlmIChzaW5nbGVfaGFyZGlmKSB7CisJCWlmIChpX2hhcmRpZl9zID09IDApIHsKKwkJCWlmIChiYXRhZHZfaXZfb2dtX25laWdoX2R1bXBfaGFyZGlmKG1zZywgcG9ydGlkLAorCQkJCQkJCSAgICBjYi0+bmxoLT5ubG1zZ19zZXEsCisJCQkJCQkJICAgIGJhdF9wcml2LAorCQkJCQkJCSAgICBzaW5nbGVfaGFyZGlmLAorCQkJCQkJCSAgICAmaWR4KSA9PSAwKQorCQkJCWlfaGFyZGlmKys7CisJCX0KKwl9IGVsc2UgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShoYXJkX2lmYWNlLCAmYmF0YWR2X2hhcmRpZl9saXN0LAorCQkJCQlsaXN0KSB7CisJCQlpZiAoaGFyZF9pZmFjZS0+c29mdF9pZmFjZSAhPSBiYXRfcHJpdi0+c29mdF9pZmFjZSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGlfaGFyZGlmKysgPCBpX2hhcmRpZl9zKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoYmF0YWR2X2l2X29nbV9uZWlnaF9kdW1wX2hhcmRpZihtc2csIHBvcnRpZCwKKwkJCQkJCQkgICAgY2ItPm5saC0+bmxtc2dfc2VxLAorCQkJCQkJCSAgICBiYXRfcHJpdiwKKwkJCQkJCQkgICAgaGFyZF9pZmFjZSwgJmlkeCkpIHsKKwkJCQlpX2hhcmRpZi0tOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJY2ItPmFyZ3NbMF0gPSBpX2hhcmRpZjsKKwljYi0+YXJnc1sxXSA9IGlkeDsKK30KIAogLyoqCiAgKiBiYXRhZHZfaXZfb2dtX25laWdoX2NtcCAtIGNvbXBhcmUgdGhlIG1ldHJpY3Mgb2YgdHdvIG5laWdoYm9ycwpAQCAtMjA0MywyNyArMjQyNywxMyBAQAogCQkJCSAgIHN0cnVjdCBiYXRhZHZfbmVpZ2hfbm9kZSAqbmVpZ2gyLAogCQkJCSAgIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaWZfb3V0Z29pbmcyKQogewotCXN0cnVjdCBiYXRhZHZfbmVpZ2hfaWZpbmZvICpuZWlnaDFfaWZpbmZvLCAqbmVpZ2gyX2lmaW5mbzsKLQl1OCB0cTEsIHRxMjsKKwlib29sIHJldDsKIAlpbnQgZGlmZjsKIAotCW5laWdoMV9pZmluZm8gPSBiYXRhZHZfbmVpZ2hfaWZpbmZvX2dldChuZWlnaDEsIGlmX291dGdvaW5nMSk7Ci0JbmVpZ2gyX2lmaW5mbyA9IGJhdGFkdl9uZWlnaF9pZmluZm9fZ2V0KG5laWdoMiwgaWZfb3V0Z29pbmcyKTsKLQotCWlmICghbmVpZ2gxX2lmaW5mbyB8fCAhbmVpZ2gyX2lmaW5mbykgewotCQlkaWZmID0gMDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JdHExID0gbmVpZ2gxX2lmaW5mby0+YmF0X2l2LnRxX2F2ZzsKLQl0cTIgPSBuZWlnaDJfaWZpbmZvLT5iYXRfaXYudHFfYXZnOwotCWRpZmYgPSB0cTEgLSB0cTI7Ci0KLW91dDoKLQlpZiAobmVpZ2gxX2lmaW5mbykKLQkJYmF0YWR2X25laWdoX2lmaW5mb19wdXQobmVpZ2gxX2lmaW5mbyk7Ci0JaWYgKG5laWdoMl9pZmluZm8pCi0JCWJhdGFkdl9uZWlnaF9pZmluZm9fcHV0KG5laWdoMl9pZmluZm8pOworCXJldCA9IGJhdGFkdl9pdl9vZ21fbmVpZ2hfZGlmZihuZWlnaDEsIGlmX291dGdvaW5nMSwgbmVpZ2gyLAorCQkJCSAgICAgICBpZl9vdXRnb2luZzIsICZkaWZmKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gZGlmZjsKIH0KQEAgLTIwODUsMjkgKzI0NTUsMTUgQEAKIAkJCSAgIHN0cnVjdCBiYXRhZHZfbmVpZ2hfbm9kZSAqbmVpZ2gyLAogCQkJICAgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICppZl9vdXRnb2luZzIpCiB7Ci0Jc3RydWN0IGJhdGFkdl9uZWlnaF9pZmluZm8gKm5laWdoMV9pZmluZm8sICpuZWlnaDJfaWZpbmZvOwotCXU4IHRxMSwgdHEyOwogCWJvb2wgcmV0OworCWludCBkaWZmOwogCi0JbmVpZ2gxX2lmaW5mbyA9IGJhdGFkdl9uZWlnaF9pZmluZm9fZ2V0KG5laWdoMSwgaWZfb3V0Z29pbmcxKTsKLQluZWlnaDJfaWZpbmZvID0gYmF0YWR2X25laWdoX2lmaW5mb19nZXQobmVpZ2gyLCBpZl9vdXRnb2luZzIpOworCXJldCA9IGJhdGFkdl9pdl9vZ21fbmVpZ2hfZGlmZihuZWlnaDEsIGlmX291dGdvaW5nMSwgbmVpZ2gyLAorCQkJCSAgICAgICBpZl9vdXRnb2luZzIsICZkaWZmKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIGZhbHNlOwogCi0JLyogd2UgY2FuJ3Qgc2F5IHRoYXQgdGhlIG1ldHJpYyBpcyBiZXR0ZXIgKi8KLQlpZiAoIW5laWdoMV9pZmluZm8gfHwgIW5laWdoMl9pZmluZm8pIHsKLQkJcmV0ID0gZmFsc2U7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXRxMSA9IG5laWdoMV9pZmluZm8tPmJhdF9pdi50cV9hdmc7Ci0JdHEyID0gbmVpZ2gyX2lmaW5mby0+YmF0X2l2LnRxX2F2ZzsKLQlyZXQgPSAodHExIC0gdHEyKSA+IC1CQVRBRFZfVFFfU0lNSUxBUklUWV9USFJFU0hPTEQ7Ci0KLW91dDoKLQlpZiAobmVpZ2gxX2lmaW5mbykKLQkJYmF0YWR2X25laWdoX2lmaW5mb19wdXQobmVpZ2gxX2lmaW5mbyk7Ci0JaWYgKG5laWdoMl9pZmluZm8pCi0JCWJhdGFkdl9uZWlnaF9pZmluZm9fcHV0KG5laWdoMl9pZmluZm8pOwotCisJcmV0ID0gZGlmZiA+IC1CQVRBRFZfVFFfU0lNSUxBUklUWV9USFJFU0hPTEQ7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjExNyw2ICsyNDczLDMyNSBAQAogCWJhdGFkdl9pdl9vZ21fc2NoZWR1bGUoaGFyZF9pZmFjZSk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKgorYmF0YWR2X2l2X2d3X2dldF9iZXN0X2d3X25vZGUoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdikKK3sKKwlzdHJ1Y3QgYmF0YWR2X25laWdoX25vZGUgKnJvdXRlcjsKKwlzdHJ1Y3QgYmF0YWR2X25laWdoX2lmaW5mbyAqcm91dGVyX2lmaW5mbzsKKwlzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKmd3X25vZGUsICpjdXJyX2d3ID0gTlVMTDsKKwl1NjQgbWF4X2d3X2ZhY3RvciA9IDA7CisJdTY0IHRtcF9nd19mYWN0b3IgPSAwOworCXU4IG1heF90cSA9IDA7CisJdTggdHFfYXZnOworCXN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpvcmlnX25vZGU7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGd3X25vZGUsICZiYXRfcHJpdi0+Z3cubGlzdCwgbGlzdCkgeworCQlvcmlnX25vZGUgPSBnd19ub2RlLT5vcmlnX25vZGU7CisJCXJvdXRlciA9IGJhdGFkdl9vcmlnX3JvdXRlcl9nZXQob3JpZ19ub2RlLCBCQVRBRFZfSUZfREVGQVVMVCk7CisJCWlmICghcm91dGVyKQorCQkJY29udGludWU7CisKKwkJcm91dGVyX2lmaW5mbyA9IGJhdGFkdl9uZWlnaF9pZmluZm9fZ2V0KHJvdXRlciwKKwkJCQkJCQlCQVRBRFZfSUZfREVGQVVMVCk7CisJCWlmICghcm91dGVyX2lmaW5mbykKKwkJCWdvdG8gbmV4dDsKKworCQlpZiAoIWtyZWZfZ2V0X3VubGVzc196ZXJvKCZnd19ub2RlLT5yZWZjb3VudCkpCisJCQlnb3RvIG5leHQ7CisKKwkJdHFfYXZnID0gcm91dGVyX2lmaW5mby0+YmF0X2l2LnRxX2F2ZzsKKworCQlzd2l0Y2ggKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Z3cuc2VsX2NsYXNzKSkgeworCQljYXNlIDE6IC8qIGZhc3QgY29ubmVjdGlvbiAqLworCQkJdG1wX2d3X2ZhY3RvciA9IHRxX2F2ZyAqIHRxX2F2ZzsKKwkJCXRtcF9nd19mYWN0b3IgKj0gZ3dfbm9kZS0+YmFuZHdpZHRoX2Rvd247CisJCQl0bXBfZ3dfZmFjdG9yICo9IDEwMCAqIDEwMDsKKwkJCXRtcF9nd19mYWN0b3IgPj49IDE4OworCisJCQlpZiAoKHRtcF9nd19mYWN0b3IgPiBtYXhfZ3dfZmFjdG9yKSB8fAorCQkJICAgICgodG1wX2d3X2ZhY3RvciA9PSBtYXhfZ3dfZmFjdG9yKSAmJgorCQkJICAgICAodHFfYXZnID4gbWF4X3RxKSkpIHsKKwkJCQlpZiAoY3Vycl9ndykKKwkJCQkJYmF0YWR2X2d3X25vZGVfcHV0KGN1cnJfZ3cpOworCQkJCWN1cnJfZ3cgPSBnd19ub2RlOworCQkJCWtyZWZfZ2V0KCZjdXJyX2d3LT5yZWZjb3VudCk7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OiAvKiAyOiAgc3RhYmxlIGNvbm5lY3Rpb24gKHVzZSBiZXN0IHN0YXRpc3RpYykKKwkJCSAgKiAzOiAgZmFzdC1zd2l0Y2ggKHVzZSBiZXN0IHN0YXRpc3RpYyBidXQgY2hhbmdlIGFzCisJCQkgICogICAgIHNvb24gYXMgYSBiZXR0ZXIgZ2F0ZXdheSBhcHBlYXJzKQorCQkJICAqIFhYOiBsYXRlLXN3aXRjaCAodXNlIGJlc3Qgc3RhdGlzdGljIGJ1dCBjaGFuZ2UgYXMKKwkJCSAgKiAgICAgc29vbiBhcyBhIGJldHRlciBnYXRld2F5IGFwcGVhcnMgd2hpY2ggaGFzCisJCQkgICogICAgICRyb3V0aW5nX2NsYXNzIG1vcmUgdHEgcG9pbnRzKQorCQkJICAqLworCQkJaWYgKHRxX2F2ZyA+IG1heF90cSkgeworCQkJCWlmIChjdXJyX2d3KQorCQkJCQliYXRhZHZfZ3dfbm9kZV9wdXQoY3Vycl9ndyk7CisJCQkJY3Vycl9ndyA9IGd3X25vZGU7CisJCQkJa3JlZl9nZXQoJmN1cnJfZ3ctPnJlZmNvdW50KTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHRxX2F2ZyA+IG1heF90cSkKKwkJCW1heF90cSA9IHRxX2F2ZzsKKworCQlpZiAodG1wX2d3X2ZhY3RvciA+IG1heF9nd19mYWN0b3IpCisJCQltYXhfZ3dfZmFjdG9yID0gdG1wX2d3X2ZhY3RvcjsKKworCQliYXRhZHZfZ3dfbm9kZV9wdXQoZ3dfbm9kZSk7CisKK25leHQ6CisJCWJhdGFkdl9uZWlnaF9ub2RlX3B1dChyb3V0ZXIpOworCQlpZiAocm91dGVyX2lmaW5mbykKKwkJCWJhdGFkdl9uZWlnaF9pZmluZm9fcHV0KHJvdXRlcl9pZmluZm8pOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiBjdXJyX2d3OworfQorCitzdGF0aWMgYm9vbCBiYXRhZHZfaXZfZ3dfaXNfZWxpZ2libGUoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJCQkgICAgIHN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpjdXJyX2d3X29yaWcsCisJCQkJICAgICBzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqb3JpZ19ub2RlKQoreworCXN0cnVjdCBiYXRhZHZfbmVpZ2hfaWZpbmZvICpyb3V0ZXJfb3JpZ19pZmluZm8gPSBOVUxMOworCXN0cnVjdCBiYXRhZHZfbmVpZ2hfaWZpbmZvICpyb3V0ZXJfZ3dfaWZpbmZvID0gTlVMTDsKKwlzdHJ1Y3QgYmF0YWR2X25laWdoX25vZGUgKnJvdXRlcl9ndyA9IE5VTEw7CisJc3RydWN0IGJhdGFkdl9uZWlnaF9ub2RlICpyb3V0ZXJfb3JpZyA9IE5VTEw7CisJdTggZ3dfdHFfYXZnLCBvcmlnX3RxX2F2ZzsKKwlib29sIHJldCA9IGZhbHNlOworCisJLyogZHluYW1pYyByZS1lbGVjdGlvbiBpcyBwZXJmb3JtZWQgb25seSBvbiBmYXN0IG9yIGxhdGUgc3dpdGNoICovCisJaWYgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Z3cuc2VsX2NsYXNzKSA8PSAyKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyb3V0ZXJfZ3cgPSBiYXRhZHZfb3JpZ19yb3V0ZXJfZ2V0KGN1cnJfZ3dfb3JpZywgQkFUQURWX0lGX0RFRkFVTFQpOworCWlmICghcm91dGVyX2d3KSB7CisJCXJldCA9IHRydWU7CisJCWdvdG8gb3V0OworCX0KKworCXJvdXRlcl9nd19pZmluZm8gPSBiYXRhZHZfbmVpZ2hfaWZpbmZvX2dldChyb3V0ZXJfZ3csCisJCQkJCQkgICBCQVRBRFZfSUZfREVGQVVMVCk7CisJaWYgKCFyb3V0ZXJfZ3dfaWZpbmZvKSB7CisJCXJldCA9IHRydWU7CisJCWdvdG8gb3V0OworCX0KKworCXJvdXRlcl9vcmlnID0gYmF0YWR2X29yaWdfcm91dGVyX2dldChvcmlnX25vZGUsIEJBVEFEVl9JRl9ERUZBVUxUKTsKKwlpZiAoIXJvdXRlcl9vcmlnKQorCQlnb3RvIG91dDsKKworCXJvdXRlcl9vcmlnX2lmaW5mbyA9IGJhdGFkdl9uZWlnaF9pZmluZm9fZ2V0KHJvdXRlcl9vcmlnLAorCQkJCQkJICAgICBCQVRBRFZfSUZfREVGQVVMVCk7CisJaWYgKCFyb3V0ZXJfb3JpZ19pZmluZm8pCisJCWdvdG8gb3V0OworCisJZ3dfdHFfYXZnID0gcm91dGVyX2d3X2lmaW5mby0+YmF0X2l2LnRxX2F2ZzsKKwlvcmlnX3RxX2F2ZyA9IHJvdXRlcl9vcmlnX2lmaW5mby0+YmF0X2l2LnRxX2F2ZzsKKworCS8qIHRoZSBUUSB2YWx1ZSBoYXMgdG8gYmUgYmV0dGVyICovCisJaWYgKG9yaWdfdHFfYXZnIDwgZ3dfdHFfYXZnKQorCQlnb3RvIG91dDsKKworCS8qIGlmIHRoZSByb3V0aW5nIGNsYXNzIGlzIGdyZWF0ZXIgdGhhbiAzIHRoZSB2YWx1ZSB0ZWxscyB1cyBob3cgbXVjaAorCSAqIGdyZWF0ZXIgdGhlIFRRIHZhbHVlIG9mIHRoZSBuZXcgZ2F0ZXdheSBtdXN0IGJlCisJICovCisJaWYgKChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmd3LnNlbF9jbGFzcykgPiAzKSAmJgorCSAgICAob3JpZ190cV9hdmcgLSBnd190cV9hdmcgPCBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmd3LnNlbF9jbGFzcykpKQorCQlnb3RvIG91dDsKKworCWJhdGFkdl9kYmcoQkFUQURWX0RCR19CQVRNQU4sIGJhdF9wcml2LAorCQkgICAiUmVzdGFydGluZyBnYXRld2F5IHNlbGVjdGlvbjogYmV0dGVyIGdhdGV3YXkgZm91bmQgKHRxIGN1cnI6ICVpLCB0cSBuZXc6ICVpKVxuIiwKKwkJICAgZ3dfdHFfYXZnLCBvcmlnX3RxX2F2Zyk7CisKKwlyZXQgPSB0cnVlOworb3V0OgorCWlmIChyb3V0ZXJfZ3dfaWZpbmZvKQorCQliYXRhZHZfbmVpZ2hfaWZpbmZvX3B1dChyb3V0ZXJfZ3dfaWZpbmZvKTsKKwlpZiAocm91dGVyX29yaWdfaWZpbmZvKQorCQliYXRhZHZfbmVpZ2hfaWZpbmZvX3B1dChyb3V0ZXJfb3JpZ19pZmluZm8pOworCWlmIChyb3V0ZXJfZ3cpCisJCWJhdGFkdl9uZWlnaF9ub2RlX3B1dChyb3V0ZXJfZ3cpOworCWlmIChyb3V0ZXJfb3JpZykKKwkJYmF0YWR2X25laWdoX25vZGVfcHV0KHJvdXRlcl9vcmlnKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCisvKiBmYWlscyBpZiBvcmlnX25vZGUgaGFzIG5vIHJvdXRlciAqLworc3RhdGljIGludCBiYXRhZHZfaXZfZ3dfd3JpdGVfYnVmZmVyX3RleHQoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJCQkJICBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwKKwkJCQkJICBjb25zdCBzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKmd3X25vZGUpCit7CisJc3RydWN0IGJhdGFkdl9nd19ub2RlICpjdXJyX2d3OworCXN0cnVjdCBiYXRhZHZfbmVpZ2hfbm9kZSAqcm91dGVyOworCXN0cnVjdCBiYXRhZHZfbmVpZ2hfaWZpbmZvICpyb3V0ZXJfaWZpbmZvID0gTlVMTDsKKwlpbnQgcmV0ID0gLTE7CisKKwlyb3V0ZXIgPSBiYXRhZHZfb3JpZ19yb3V0ZXJfZ2V0KGd3X25vZGUtPm9yaWdfbm9kZSwgQkFUQURWX0lGX0RFRkFVTFQpOworCWlmICghcm91dGVyKQorCQlnb3RvIG91dDsKKworCXJvdXRlcl9pZmluZm8gPSBiYXRhZHZfbmVpZ2hfaWZpbmZvX2dldChyb3V0ZXIsIEJBVEFEVl9JRl9ERUZBVUxUKTsKKwlpZiAoIXJvdXRlcl9pZmluZm8pCisJCWdvdG8gb3V0OworCisJY3Vycl9ndyA9IGJhdGFkdl9nd19nZXRfc2VsZWN0ZWRfZ3dfbm9kZShiYXRfcHJpdik7CisKKwlzZXFfcHJpbnRmKHNlcSwgIiVzICVwTSAoJTNpKSAlcE0gWyUxMHNdOiAldS4ldS8ldS4ldSBNQml0XG4iLAorCQkgICAoY3Vycl9ndyA9PSBnd19ub2RlID8gIj0+IiA6ICIgICIpLAorCQkgICBnd19ub2RlLT5vcmlnX25vZGUtPm9yaWcsCisJCSAgIHJvdXRlcl9pZmluZm8tPmJhdF9pdi50cV9hdmcsIHJvdXRlci0+YWRkciwKKwkJICAgcm91dGVyLT5pZl9pbmNvbWluZy0+bmV0X2Rldi0+bmFtZSwKKwkJICAgZ3dfbm9kZS0+YmFuZHdpZHRoX2Rvd24gLyAxMCwKKwkJICAgZ3dfbm9kZS0+YmFuZHdpZHRoX2Rvd24gJSAxMCwKKwkJICAgZ3dfbm9kZS0+YmFuZHdpZHRoX3VwIC8gMTAsCisJCSAgIGd3X25vZGUtPmJhbmR3aWR0aF91cCAlIDEwKTsKKwlyZXQgPSBzZXFfaGFzX292ZXJmbG93ZWQoc2VxKSA/IC0xIDogMDsKKworCWlmIChjdXJyX2d3KQorCQliYXRhZHZfZ3dfbm9kZV9wdXQoY3Vycl9ndyk7CitvdXQ6CisJaWYgKHJvdXRlcl9pZmluZm8pCisJCWJhdGFkdl9uZWlnaF9pZmluZm9fcHV0KHJvdXRlcl9pZmluZm8pOworCWlmIChyb3V0ZXIpCisJCWJhdGFkdl9uZWlnaF9ub2RlX3B1dChyb3V0ZXIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGJhdGFkdl9pdl9nd19wcmludChzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkJICAgICAgIHN0cnVjdCBzZXFfZmlsZSAqc2VxKQoreworCXN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqZ3dfbm9kZTsKKwlpbnQgZ3dfY291bnQgPSAwOworCisJc2VxX3B1dHMoc2VxLAorCQkgIiAgICAgIEdhdGV3YXkgICAgICAoIy8yNTUpICAgICAgICAgICBOZXh0aG9wIFtvdXRnb2luZ0lGXTogYWR2ZXJ0aXNlZCB1cGxpbmsgYmFuZHdpZHRoXG4iKTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZ3dfbm9kZSwgJmJhdF9wcml2LT5ndy5saXN0LCBsaXN0KSB7CisJCS8qIGZhaWxzIGlmIG9yaWdfbm9kZSBoYXMgbm8gcm91dGVyICovCisJCWlmIChiYXRhZHZfaXZfZ3dfd3JpdGVfYnVmZmVyX3RleHQoYmF0X3ByaXYsIHNlcSwgZ3dfbm9kZSkgPCAwKQorCQkJY29udGludWU7CisKKwkJZ3dfY291bnQrKzsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlpZiAoZ3dfY291bnQgPT0gMCkKKwkJc2VxX3B1dHMoc2VxLCAiTm8gZ2F0ZXdheXMgaW4gcmFuZ2UgLi4uXG4iKTsKK30KKyNlbmRpZgorCisvKioKKyAqIGJhdGFkdl9pdl9nd19kdW1wX2VudHJ5IC0gRHVtcCBhIGdhdGV3YXkgaW50byBhIG1lc3NhZ2UKKyAqIEBtc2c6IE5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBwb3J0aWQ6IFBvcnQgbWFraW5nIG5ldGxpbmsgcmVxdWVzdAorICogQHNlcTogU2VxdWVuY2UgbnVtYmVyIG9mIG5ldGxpbmsgbWVzc2FnZQorICogQGJhdF9wcml2OiBUaGUgYmF0IHByaXYgd2l0aCBhbGwgdGhlIHNvZnQgaW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKiBAZ3dfbm9kZTogR2F0ZXdheSB0byBiZSBkdW1wZWQKKyAqCisgKiBSZXR1cm46IEVycm9yIGNvZGUsIG9yIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50IGJhdGFkdl9pdl9nd19kdW1wX2VudHJ5KHN0cnVjdCBza19idWZmICptc2csIHUzMiBwb3J0aWQsIHUzMiBzZXEsCisJCQkJICAgc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJCQkgICBzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKmd3X25vZGUpCit7CisJc3RydWN0IGJhdGFkdl9uZWlnaF9pZmluZm8gKnJvdXRlcl9pZmluZm8gPSBOVUxMOworCXN0cnVjdCBiYXRhZHZfbmVpZ2hfbm9kZSAqcm91dGVyOworCXN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqY3Vycl9ndzsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwl2b2lkICpoZHI7CisKKwlyb3V0ZXIgPSBiYXRhZHZfb3JpZ19yb3V0ZXJfZ2V0KGd3X25vZGUtPm9yaWdfbm9kZSwgQkFUQURWX0lGX0RFRkFVTFQpOworCWlmICghcm91dGVyKQorCQlnb3RvIG91dDsKKworCXJvdXRlcl9pZmluZm8gPSBiYXRhZHZfbmVpZ2hfaWZpbmZvX2dldChyb3V0ZXIsIEJBVEFEVl9JRl9ERUZBVUxUKTsKKwlpZiAoIXJvdXRlcl9pZmluZm8pCisJCWdvdG8gb3V0OworCisJY3Vycl9ndyA9IGJhdGFkdl9nd19nZXRfc2VsZWN0ZWRfZ3dfbm9kZShiYXRfcHJpdik7CisKKwloZHIgPSBnZW5sbXNnX3B1dChtc2csIHBvcnRpZCwgc2VxLCAmYmF0YWR2X25ldGxpbmtfZmFtaWx5LAorCQkJICBOTE1fRl9NVUxUSSwgQkFUQURWX0NNRF9HRVRfR0FURVdBWVMpOworCWlmICghaGRyKSB7CisJCXJldCA9IC1FTk9CVUZTOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSAtRU1TR1NJWkU7CisKKwlpZiAoY3Vycl9ndyA9PSBnd19ub2RlKQorCQlpZiAobmxhX3B1dF9mbGFnKG1zZywgQkFUQURWX0FUVFJfRkxBR19CRVNUKSkgeworCQkJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworCQkJZ290byBvdXQ7CisJCX0KKworCWlmIChubGFfcHV0KG1zZywgQkFUQURWX0FUVFJfT1JJR19BRERSRVNTLCBFVEhfQUxFTiwKKwkJICAgIGd3X25vZGUtPm9yaWdfbm9kZS0+b3JpZykgfHwKKwkgICAgbmxhX3B1dF91OChtc2csIEJBVEFEVl9BVFRSX1RRLCByb3V0ZXJfaWZpbmZvLT5iYXRfaXYudHFfYXZnKSB8fAorCSAgICBubGFfcHV0KG1zZywgQkFUQURWX0FUVFJfUk9VVEVSLCBFVEhfQUxFTiwKKwkJICAgIHJvdXRlci0+YWRkcikgfHwKKwkgICAgbmxhX3B1dF9zdHJpbmcobXNnLCBCQVRBRFZfQVRUUl9IQVJEX0lGTkFNRSwKKwkJCSAgIHJvdXRlci0+aWZfaW5jb21pbmctPm5ldF9kZXYtPm5hbWUpIHx8CisJICAgIG5sYV9wdXRfdTMyKG1zZywgQkFUQURWX0FUVFJfQkFORFdJRFRIX0RPV04sCisJCQlnd19ub2RlLT5iYW5kd2lkdGhfZG93bikgfHwKKwkgICAgbmxhX3B1dF91MzIobXNnLCBCQVRBRFZfQVRUUl9CQU5EV0lEVEhfVVAsCisJCQlnd19ub2RlLT5iYW5kd2lkdGhfdXApKSB7CisJCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKKwkJZ290byBvdXQ7CisJfQorCisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOworCXJldCA9IDA7CisKK291dDoKKwlpZiAocm91dGVyX2lmaW5mbykKKwkJYmF0YWR2X25laWdoX2lmaW5mb19wdXQocm91dGVyX2lmaW5mbyk7CisJaWYgKHJvdXRlcikKKwkJYmF0YWR2X25laWdoX25vZGVfcHV0KHJvdXRlcik7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBiYXRhZHZfaXZfZ3dfZHVtcCAtIER1bXAgZ2F0ZXdheXMgaW50byBhIG1lc3NhZ2UKKyAqIEBtc2c6IE5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBjYjogQ29udHJvbCBibG9jayBjb250YWluaW5nIGFkZGl0aW9uYWwgb3B0aW9ucworICogQGJhdF9wcml2OiBUaGUgYmF0IHByaXYgd2l0aCBhbGwgdGhlIHNvZnQgaW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIGJhdGFkdl9pdl9nd19kdW1wKHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKKwkJCSAgICAgIHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYpCit7CisJaW50IHBvcnRpZCA9IE5FVExJTktfQ0IoY2ItPnNrYikucG9ydGlkOworCXN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqZ3dfbm9kZTsKKwlpbnQgaWR4X3NraXAgPSBjYi0+YXJnc1swXTsKKwlpbnQgaWR4ID0gMDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZ3dfbm9kZSwgJmJhdF9wcml2LT5ndy5saXN0LCBsaXN0KSB7CisJCWlmIChpZHgrKyA8IGlkeF9za2lwKQorCQkJY29udGludWU7CisKKwkJaWYgKGJhdGFkdl9pdl9nd19kdW1wX2VudHJ5KG1zZywgcG9ydGlkLCBjYi0+bmxoLT5ubG1zZ19zZXEsCisJCQkJCSAgICBiYXRfcHJpdiwgZ3dfbm9kZSkpIHsKKwkJCWlkeF9za2lwID0gaWR4IC0gMTsKKwkJCWdvdG8gdW5sb2NrOworCQl9CisJfQorCisJaWR4X3NraXAgPSBpZHg7Cit1bmxvY2s6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwljYi0+YXJnc1swXSA9IGlkeF9za2lwOworfQorCiBzdGF0aWMgc3RydWN0IGJhdGFkdl9hbGdvX29wcyBiYXRhZHZfYmF0bWFuX2l2IF9fcmVhZF9tb3N0bHkgPSB7CiAJLm5hbWUgPSAiQkFUTUFOX0lWIiwKIAkuaWZhY2UgPSB7CkBAIC0yMTI5LDE0ICsyODA0LDI4IEBACiAJLm5laWdoID0gewogCQkuY21wID0gYmF0YWR2X2l2X29nbV9uZWlnaF9jbXAsCiAJCS5pc19zaW1pbGFyX29yX2JldHRlciA9IGJhdGFkdl9pdl9vZ21fbmVpZ2hfaXNfc29iLAorI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKIAkJLnByaW50ID0gYmF0YWR2X2l2X25laWdoX3ByaW50LAorI2VuZGlmCisJCS5kdW1wID0gYmF0YWR2X2l2X29nbV9uZWlnaF9kdW1wLAogCX0sCiAJLm9yaWcgPSB7CisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUwogCQkucHJpbnQgPSBiYXRhZHZfaXZfb2dtX29yaWdfcHJpbnQsCisjZW5kaWYKKwkJLmR1bXAgPSBiYXRhZHZfaXZfb2dtX29yaWdfZHVtcCwKIAkJLmZyZWUgPSBiYXRhZHZfaXZfb2dtX29yaWdfZnJlZSwKIAkJLmFkZF9pZiA9IGJhdGFkdl9pdl9vZ21fb3JpZ19hZGRfaWYsCiAJCS5kZWxfaWYgPSBiYXRhZHZfaXZfb2dtX29yaWdfZGVsX2lmLAogCX0sCisJLmd3ID0geworCQkuZ2V0X2Jlc3RfZ3dfbm9kZSA9IGJhdGFkdl9pdl9nd19nZXRfYmVzdF9nd19ub2RlLAorCQkuaXNfZWxpZ2libGUgPSBiYXRhZHZfaXZfZ3dfaXNfZWxpZ2libGUsCisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUworCQkucHJpbnQgPSBiYXRhZHZfaXZfZ3dfcHJpbnQsCisjZW5kaWYKKwkJLmR1bXAgPSBiYXRhZHZfaXZfZ3dfZHVtcCwKKwl9LAogfTsKIAogaW50IF9faW5pdCBiYXRhZHZfaXZfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvYmF0X3YuYyBiL25ldC9iYXRtYW4tYWR2L2JhdF92LmMKaW5kZXggMDM2NmNiZi4uZTc5ZjZmMCAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvYmF0X3YuYworKysgYi9uZXQvYmF0bWFuLWFkdi9iYXRfdi5jCkBAIC0yMSwyNCArMjEsMzggQEAKICNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KICNpbmNsdWRlIDxsaW51eC9idWcuaD4KICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvYmF0bWFuX2Fkdi5oPgogCiAjaW5jbHVkZSAiYmF0X2FsZ28uaCIKICNpbmNsdWRlICJiYXRfdl9lbHAuaCIKICNpbmNsdWRlICJiYXRfdl9vZ20uaCIKKyNpbmNsdWRlICJnYXRld2F5X2NsaWVudC5oIgorI2luY2x1ZGUgImdhdGV3YXlfY29tbW9uLmgiCiAjaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKICNpbmNsdWRlICJoYXNoLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAibmV0bGluay5oIgogI2luY2x1ZGUgIm9yaWdpbmF0b3IuaCIKICNpbmNsdWRlICJwYWNrZXQuaCIKIAorc3RydWN0IHNrX2J1ZmY7CisKIHN0YXRpYyB2b2lkIGJhdGFkdl92X2lmYWNlX2FjdGl2YXRlKHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaGFyZF9pZmFjZSkKIHsKIAlzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoaGFyZF9pZmFjZS0+c29mdF9pZmFjZSk7CkBAIC0xMTUsNiArMTI5LDcgQEAKIAkJICBiYXRhZHZfdl9lbHBfdGhyb3VnaHB1dF9tZXRyaWNfdXBkYXRlKTsKIH0KIAorI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKIC8qKgogICogYmF0YWR2X3Zfb3JpZ19wcmludF9uZWlnaCAtIHByaW50IG5laWdoYm9ycyBmb3IgdGhlIG9yaWdpbmF0b3IgdGFibGUKICAqIEBvcmlnX25vZGU6IHRoZSBvcmlnX25vZGUgZm9yIHdoaWNoIHRoZSBuZWlnaGJvcnMgYXJlIHByaW50ZWQKQEAgLTE5OCw4ICsyMTMsMTQyIEBACiAJaWYgKGJhdG1hbl9jb3VudCA9PSAwKQogCQlzZXFfcHV0cyhzZXEsICJObyBiYXRtYW4gbm9kZXMgaW4gcmFuZ2UgLi4uXG4iKTsKIH0KKyNlbmRpZgogCiAvKioKKyAqIGJhdGFkdl92X25laWdoX2R1bXBfbmVpZ2ggLSBEdW1wIGEgbmVpZ2hib3VyIGludG8gYSBtZXNzYWdlCisgKiBAbXNnOiBOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAcG9ydGlkOiBQb3J0IG1ha2luZyBuZXRsaW5rIHJlcXVlc3QKKyAqIEBzZXE6IFNlcXVlbmNlIG51bWJlciBvZiBuZXRsaW5rIG1lc3NhZ2UKKyAqIEBoYXJkaWZfbmVpZ2g6IE5laWdoYm91ciB0byBkdW1wCisgKgorICogUmV0dXJuOiBFcnJvciBjb2RlLCBvciAwIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludAorYmF0YWR2X3ZfbmVpZ2hfZHVtcF9uZWlnaChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCB1MzIgcG9ydGlkLCB1MzIgc2VxLAorCQkJICBzdHJ1Y3QgYmF0YWR2X2hhcmRpZl9uZWlnaF9ub2RlICpoYXJkaWZfbmVpZ2gpCit7CisJdm9pZCAqaGRyOworCXVuc2lnbmVkIGludCBsYXN0X3NlZW5fbXNlY3M7CisJdTMyIHRocm91Z2hwdXQ7CisKKwlsYXN0X3NlZW5fbXNlY3MgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBoYXJkaWZfbmVpZ2gtPmxhc3Rfc2Vlbik7CisJdGhyb3VnaHB1dCA9IGV3bWFfdGhyb3VnaHB1dF9yZWFkKCZoYXJkaWZfbmVpZ2gtPmJhdF92LnRocm91Z2hwdXQpOworCXRocm91Z2hwdXQgPSB0aHJvdWdocHV0ICogMTAwOworCisJaGRyID0gZ2VubG1zZ19wdXQobXNnLCBwb3J0aWQsIHNlcSwgJmJhdGFkdl9uZXRsaW5rX2ZhbWlseSwgTkxNX0ZfTVVMVEksCisJCQkgIEJBVEFEVl9DTURfR0VUX05FSUdIQk9SUyk7CisJaWYgKCFoZHIpCisJCXJldHVybiAtRU5PQlVGUzsKKworCWlmIChubGFfcHV0KG1zZywgQkFUQURWX0FUVFJfTkVJR0hfQUREUkVTUywgRVRIX0FMRU4sCisJCSAgICBoYXJkaWZfbmVpZ2gtPmFkZHIpIHx8CisJICAgIG5sYV9wdXRfdTMyKG1zZywgQkFUQURWX0FUVFJfSEFSRF9JRklOREVYLAorCQkJaGFyZGlmX25laWdoLT5pZl9pbmNvbWluZy0+bmV0X2Rldi0+aWZpbmRleCkgfHwKKwkgICAgbmxhX3B1dF91MzIobXNnLCBCQVRBRFZfQVRUUl9MQVNUX1NFRU5fTVNFQ1MsCisJCQlsYXN0X3NlZW5fbXNlY3MpIHx8CisJICAgIG5sYV9wdXRfdTMyKG1zZywgQkFUQURWX0FUVFJfVEhST1VHSFBVVCwgdGhyb3VnaHB1dCkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOworCXJldHVybiAwOworCisgbmxhX3B1dF9mYWlsdXJlOgorCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorCisvKioKKyAqIGJhdGFkdl92X25laWdoX2R1bXBfaGFyZGlmIC0gRHVtcCB0aGUgIG5laWdoYm91cnMgb2YgYSBoYXJkIGludGVyZmFjZSAgaW50bworICogIGEgbWVzc2FnZQorICogQG1zZzogTmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQHBvcnRpZDogUG9ydCBtYWtpbmcgbmV0bGluayByZXF1ZXN0CisgKiBAc2VxOiBTZXF1ZW5jZSBudW1iZXIgb2YgbmV0bGluayBtZXNzYWdlCisgKiBAYmF0X3ByaXY6IFRoZSBiYXQgcHJpdiB3aXRoIGFsbCB0aGUgc29mdCBpbnRlcmZhY2UgaW5mb3JtYXRpb24KKyAqIEBoYXJkX2lmYWNlOiBUaGUgaGFyZCBpbnRlcmZhY2UgdG8gYmUgZHVtcGVkCisgKiBAaWR4X3M6IEVudHJpZXMgdG8gYmUgc2tpcHBlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGUgY2FsbGVyIGhvbGRzIHJjdV9yZWFkX2xvY2soKS4KKyAqCisgKiBSZXR1cm46IEVycm9yIGNvZGUsIG9yIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50CitiYXRhZHZfdl9uZWlnaF9kdW1wX2hhcmRpZihzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCB1MzIgcG9ydGlkLCB1MzIgc2VxLAorCQkJICAgc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJCSAgIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaGFyZF9pZmFjZSwKKwkJCSAgIGludCAqaWR4X3MpCit7CisJc3RydWN0IGJhdGFkdl9oYXJkaWZfbmVpZ2hfbm9kZSAqaGFyZGlmX25laWdoOworCWludCBpZHggPSAwOworCisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGhhcmRpZl9uZWlnaCwKKwkJCQkgJmhhcmRfaWZhY2UtPm5laWdoX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGlkeCsrIDwgKmlkeF9zKQorCQkJY29udGludWU7CisKKwkJaWYgKGJhdGFkdl92X25laWdoX2R1bXBfbmVpZ2gobXNnLCBwb3J0aWQsIHNlcSwgaGFyZGlmX25laWdoKSkgeworCQkJKmlkeF9zID0gaWR4IC0gMTsKKwkJCXJldHVybiAtRU1TR1NJWkU7CisJCX0KKwl9CisKKwkqaWR4X3MgPSAwOworCXJldHVybiAwOworfQorCisvKioKKyAqIGJhdGFkdl92X25laWdoX2R1bXAgLSBEdW1wIHRoZSBuZWlnaGJvdXJzIG9mIGEgaGFyZCBpbnRlcmZhY2UgIGludG8gYQorICogIG1lc3NhZ2UKKyAqIEBtc2c6IE5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBjYjogQ29udHJvbCBibG9jayBjb250YWluaW5nIGFkZGl0aW9uYWwgb3B0aW9ucworICogQGJhdF9wcml2OiBUaGUgYmF0IHByaXYgd2l0aCBhbGwgdGhlIHNvZnQgaW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKiBAc2luZ2xlX2hhcmRpZjogTGltaXQgZHVtcGluZyB0byB0aGlzIGhhcmQgaW50ZXJmYWNlCisgKi8KK3N0YXRpYyB2b2lkCitiYXRhZHZfdl9uZWlnaF9kdW1wKHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKKwkJICAgIHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCSAgICBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKnNpbmdsZV9oYXJkaWYpCit7CisJc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpoYXJkX2lmYWNlOworCWludCBpX2hhcmRpZiA9IDA7CisJaW50IGlfaGFyZGlmX3MgPSBjYi0+YXJnc1swXTsKKwlpbnQgaWR4ID0gY2ItPmFyZ3NbMV07CisJaW50IHBvcnRpZCA9IE5FVExJTktfQ0IoY2ItPnNrYikucG9ydGlkOworCisJcmN1X3JlYWRfbG9jaygpOworCWlmIChzaW5nbGVfaGFyZGlmKSB7CisJCWlmIChpX2hhcmRpZl9zID09IDApIHsKKwkJCWlmIChiYXRhZHZfdl9uZWlnaF9kdW1wX2hhcmRpZihtc2csIHBvcnRpZCwKKwkJCQkJCSAgICAgICBjYi0+bmxoLT5ubG1zZ19zZXEsCisJCQkJCQkgICAgICAgYmF0X3ByaXYsIHNpbmdsZV9oYXJkaWYsCisJCQkJCQkgICAgICAgJmlkeCkgPT0gMCkKKwkJCQlpX2hhcmRpZisrOworCQl9CisJfSBlbHNlIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaGFyZF9pZmFjZSwgJmJhdGFkdl9oYXJkaWZfbGlzdCwgbGlzdCkgeworCQkJaWYgKGhhcmRfaWZhY2UtPnNvZnRfaWZhY2UgIT0gYmF0X3ByaXYtPnNvZnRfaWZhY2UpCisJCQkJY29udGludWU7CisKKwkJCWlmIChpX2hhcmRpZisrIDwgaV9oYXJkaWZfcykKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGJhdGFkdl92X25laWdoX2R1bXBfaGFyZGlmKG1zZywgcG9ydGlkLAorCQkJCQkJICAgICAgIGNiLT5ubGgtPm5sbXNnX3NlcSwKKwkJCQkJCSAgICAgICBiYXRfcHJpdiwgaGFyZF9pZmFjZSwKKwkJCQkJCSAgICAgICAmaWR4KSkgeworCQkJCWlfaGFyZGlmLS07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwljYi0+YXJnc1swXSA9IGlfaGFyZGlmOworCWNiLT5hcmdzWzFdID0gaWR4OworfQorCisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUworLyoqCiAgKiBiYXRhZHZfdl9vcmlnX3ByaW50IC0gcHJpbnQgdGhlIG9yaWdpbmF0b3IgdGFibGUKICAqIEBiYXRfcHJpdjogdGhlIGJhdCBwcml2IHdpdGggYWxsIHRoZSBzb2Z0IGludGVyZmFjZSBpbmZvcm1hdGlvbgogICogQHNlcTogZGVidWdmcyB0YWJsZSBzZXFfZmlsZSBzdHJ1Y3QKQEAgLTI2NSw2ICs0MTQsMjA1IEBACiAJaWYgKGJhdG1hbl9jb3VudCA9PSAwKQogCQlzZXFfcHV0cyhzZXEsICJObyBiYXRtYW4gbm9kZXMgaW4gcmFuZ2UgLi4uXG4iKTsKIH0KKyNlbmRpZgorCisvKioKKyAqIGJhdGFkdl92X29yaWdfZHVtcF9zdWJlbnRyeSAtIER1bXAgYW4gb3JpZ2luYXRvciBzdWJlbnRyeSBpbnRvIGEKKyAqICBtZXNzYWdlCisgKiBAbXNnOiBOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAcG9ydGlkOiBQb3J0IG1ha2luZyBuZXRsaW5rIHJlcXVlc3QKKyAqIEBzZXE6IFNlcXVlbmNlIG51bWJlciBvZiBuZXRsaW5rIG1lc3NhZ2UKKyAqIEBiYXRfcHJpdjogVGhlIGJhdCBwcml2IHdpdGggYWxsIHRoZSBzb2Z0IGludGVyZmFjZSBpbmZvcm1hdGlvbgorICogQGlmX291dGdvaW5nOiBMaW1pdCBkdW1wIHRvIGVudHJpZXMgd2l0aCB0aGlzIG91dGdvaW5nIGludGVyZmFjZQorICogQG9yaWdfbm9kZTogT3JpZ2luYXRvciB0byBkdW1wCisgKiBAbmVpZ2hfbm9kZTogU2luZ2xlIGhvcHMgbmVpZ2hib3VyCisgKiBAYmVzdDogSXMgdGhlIGJlc3Qgb3JpZ2luYXRvcgorICoKKyAqIFJldHVybjogRXJyb3IgY29kZSwgb3IgMCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK2JhdGFkdl92X29yaWdfZHVtcF9zdWJlbnRyeShzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCB1MzIgcG9ydGlkLCB1MzIgc2VxLAorCQkJICAgIHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCQkgICAgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICppZl9vdXRnb2luZywKKwkJCSAgICBzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqb3JpZ19ub2RlLAorCQkJICAgIHN0cnVjdCBiYXRhZHZfbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZSwKKwkJCSAgICBib29sIGJlc3QpCit7CisJc3RydWN0IGJhdGFkdl9uZWlnaF9pZmluZm8gKm5faWZpbmZvOworCXVuc2lnbmVkIGludCBsYXN0X3NlZW5fbXNlY3M7CisJdTMyIHRocm91Z2hwdXQ7CisJdm9pZCAqaGRyOworCisJbl9pZmluZm8gPSBiYXRhZHZfbmVpZ2hfaWZpbmZvX2dldChuZWlnaF9ub2RlLCBpZl9vdXRnb2luZyk7CisJaWYgKCFuX2lmaW5mbykKKwkJcmV0dXJuIDA7CisKKwl0aHJvdWdocHV0ID0gbl9pZmluZm8tPmJhdF92LnRocm91Z2hwdXQgKiAxMDA7CisKKwliYXRhZHZfbmVpZ2hfaWZpbmZvX3B1dChuX2lmaW5mbyk7CisKKwlsYXN0X3NlZW5fbXNlY3MgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBvcmlnX25vZGUtPmxhc3Rfc2Vlbik7CisKKwlpZiAoaWZfb3V0Z29pbmcgIT0gQkFUQURWX0lGX0RFRkFVTFQgJiYKKwkgICAgaWZfb3V0Z29pbmcgIT0gbmVpZ2hfbm9kZS0+aWZfaW5jb21pbmcpCisJCXJldHVybiAwOworCisJaGRyID0gZ2VubG1zZ19wdXQobXNnLCBwb3J0aWQsIHNlcSwgJmJhdGFkdl9uZXRsaW5rX2ZhbWlseSwgTkxNX0ZfTVVMVEksCisJCQkgIEJBVEFEVl9DTURfR0VUX09SSUdJTkFUT1JTKTsKKwlpZiAoIWhkcikKKwkJcmV0dXJuIC1FTk9CVUZTOworCisJaWYgKG5sYV9wdXQobXNnLCBCQVRBRFZfQVRUUl9PUklHX0FERFJFU1MsIEVUSF9BTEVOLCBvcmlnX25vZGUtPm9yaWcpIHx8CisJICAgIG5sYV9wdXQobXNnLCBCQVRBRFZfQVRUUl9ORUlHSF9BRERSRVNTLCBFVEhfQUxFTiwKKwkJICAgIG5laWdoX25vZGUtPmFkZHIpIHx8CisJICAgIG5sYV9wdXRfdTMyKG1zZywgQkFUQURWX0FUVFJfSEFSRF9JRklOREVYLAorCQkJbmVpZ2hfbm9kZS0+aWZfaW5jb21pbmctPm5ldF9kZXYtPmlmaW5kZXgpIHx8CisJICAgIG5sYV9wdXRfdTMyKG1zZywgQkFUQURWX0FUVFJfVEhST1VHSFBVVCwgdGhyb3VnaHB1dCkgfHwKKwkgICAgbmxhX3B1dF91MzIobXNnLCBCQVRBRFZfQVRUUl9MQVNUX1NFRU5fTVNFQ1MsCisJCQlsYXN0X3NlZW5fbXNlY3MpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWlmIChiZXN0ICYmIG5sYV9wdXRfZmxhZyhtc2csIEJBVEFEVl9BVFRSX0ZMQUdfQkVTVCkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOworCXJldHVybiAwOworCisgbmxhX3B1dF9mYWlsdXJlOgorCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorCisvKioKKyAqIGJhdGFkdl92X29yaWdfZHVtcF9lbnRyeSAtIER1bXAgYW4gb3JpZ2luYXRvciBlbnRyeSBpbnRvIGEgbWVzc2FnZQorICogQG1zZzogTmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQHBvcnRpZDogUG9ydCBtYWtpbmcgbmV0bGluayByZXF1ZXN0CisgKiBAc2VxOiBTZXF1ZW5jZSBudW1iZXIgb2YgbmV0bGluayBtZXNzYWdlCisgKiBAYmF0X3ByaXY6IFRoZSBiYXQgcHJpdiB3aXRoIGFsbCB0aGUgc29mdCBpbnRlcmZhY2UgaW5mb3JtYXRpb24KKyAqIEBpZl9vdXRnb2luZzogTGltaXQgZHVtcCB0byBlbnRyaWVzIHdpdGggdGhpcyBvdXRnb2luZyBpbnRlcmZhY2UKKyAqIEBvcmlnX25vZGU6IE9yaWdpbmF0b3IgdG8gZHVtcAorICogQHN1Yl9zOiBOdW1iZXIgb2Ygc3ViIGVudHJpZXMgdG8gc2tpcAorICoKKyAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGUgY2FsbGVyIGhvbGRzIHJjdV9yZWFkX2xvY2soKS4KKyAqCisgKiBSZXR1cm46IEVycm9yIGNvZGUsIG9yIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50CitiYXRhZHZfdl9vcmlnX2R1bXBfZW50cnkoc3RydWN0IHNrX2J1ZmYgKm1zZywgdTMyIHBvcnRpZCwgdTMyIHNlcSwKKwkJCSBzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkJIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaWZfb3V0Z29pbmcsCisJCQkgc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKm9yaWdfbm9kZSwgaW50ICpzdWJfcykKK3sKKwlzdHJ1Y3QgYmF0YWR2X25laWdoX25vZGUgKm5laWdoX25vZGVfYmVzdDsKKwlzdHJ1Y3QgYmF0YWR2X25laWdoX25vZGUgKm5laWdoX25vZGU7CisJaW50IHN1YiA9IDA7CisJYm9vbCBiZXN0OworCisJbmVpZ2hfbm9kZV9iZXN0ID0gYmF0YWR2X29yaWdfcm91dGVyX2dldChvcmlnX25vZGUsIGlmX291dGdvaW5nKTsKKwlpZiAoIW5laWdoX25vZGVfYmVzdCkKKwkJZ290byBvdXQ7CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UobmVpZ2hfbm9kZSwgJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdCwgbGlzdCkgeworCQlpZiAoc3ViKysgPCAqc3ViX3MpCisJCQljb250aW51ZTsKKworCQliZXN0ID0gKG5laWdoX25vZGUgPT0gbmVpZ2hfbm9kZV9iZXN0KTsKKworCQlpZiAoYmF0YWR2X3Zfb3JpZ19kdW1wX3N1YmVudHJ5KG1zZywgcG9ydGlkLCBzZXEsIGJhdF9wcml2LAorCQkJCQkJaWZfb3V0Z29pbmcsIG9yaWdfbm9kZSwKKwkJCQkJCW5laWdoX25vZGUsIGJlc3QpKSB7CisJCQliYXRhZHZfbmVpZ2hfbm9kZV9wdXQobmVpZ2hfbm9kZV9iZXN0KTsKKworCQkJKnN1Yl9zID0gc3ViIC0gMTsKKwkJCXJldHVybiAtRU1TR1NJWkU7CisJCX0KKwl9CisKKyBvdXQ6CisJaWYgKG5laWdoX25vZGVfYmVzdCkKKwkJYmF0YWR2X25laWdoX25vZGVfcHV0KG5laWdoX25vZGVfYmVzdCk7CisKKwkqc3ViX3MgPSAwOworCXJldHVybiAwOworfQorCisvKioKKyAqIGJhdGFkdl92X29yaWdfZHVtcF9idWNrZXQgLSBEdW1wIGFuIG9yaWdpbmF0b3IgYnVja2V0IGludG8gYQorICogIG1lc3NhZ2UKKyAqIEBtc2c6IE5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBwb3J0aWQ6IFBvcnQgbWFraW5nIG5ldGxpbmsgcmVxdWVzdAorICogQHNlcTogU2VxdWVuY2UgbnVtYmVyIG9mIG5ldGxpbmsgbWVzc2FnZQorICogQGJhdF9wcml2OiBUaGUgYmF0IHByaXYgd2l0aCBhbGwgdGhlIHNvZnQgaW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKiBAaWZfb3V0Z29pbmc6IExpbWl0IGR1bXAgdG8gZW50cmllcyB3aXRoIHRoaXMgb3V0Z29pbmcgaW50ZXJmYWNlCisgKiBAaGVhZDogQnVja2V0IHRvIGJlIGR1bXBlZAorICogQGlkeF9zOiBOdW1iZXIgb2YgZW50cmllcyB0byBiZSBza2lwcGVkCisgKiBAc3ViOiBOdW1iZXIgb2Ygc3ViIGVudHJpZXMgdG8gYmUgc2tpcHBlZAorICoKKyAqIFJldHVybjogRXJyb3IgY29kZSwgb3IgMCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK2JhdGFkdl92X29yaWdfZHVtcF9idWNrZXQoc3RydWN0IHNrX2J1ZmYgKm1zZywgdTMyIHBvcnRpZCwgdTMyIHNlcSwKKwkJCSAgc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJCSAgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICppZl9vdXRnb2luZywKKwkJCSAgc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQsIGludCAqaWR4X3MsIGludCAqc3ViKQoreworCXN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpvcmlnX25vZGU7CisJaW50IGlkeCA9IDA7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KG9yaWdfbm9kZSwgaGVhZCwgaGFzaF9lbnRyeSkgeworCQlpZiAoaWR4KysgPCAqaWR4X3MpCisJCQljb250aW51ZTsKKworCQlpZiAoYmF0YWR2X3Zfb3JpZ19kdW1wX2VudHJ5KG1zZywgcG9ydGlkLCBzZXEsIGJhdF9wcml2LAorCQkJCQkgICAgIGlmX291dGdvaW5nLCBvcmlnX25vZGUsIHN1YikpIHsKKwkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJKmlkeF9zID0gaWR4IC0gMTsKKwkJCXJldHVybiAtRU1TR1NJWkU7CisJCX0KKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwkqaWR4X3MgPSAwOworCSpzdWIgPSAwOworCXJldHVybiAwOworfQorCisvKioKKyAqIGJhdGFkdl92X29yaWdfZHVtcCAtIER1bXAgdGhlIG9yaWdpbmF0b3JzIGludG8gYSBtZXNzYWdlCisgKiBAbXNnOiBOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAY2I6IENvbnRyb2wgYmxvY2sgY29udGFpbmluZyBhZGRpdGlvbmFsIG9wdGlvbnMKKyAqIEBiYXRfcHJpdjogVGhlIGJhdCBwcml2IHdpdGggYWxsIHRoZSBzb2Z0IGludGVyZmFjZSBpbmZvcm1hdGlvbgorICogQGlmX291dGdvaW5nOiBMaW1pdCBkdW1wIHRvIGVudHJpZXMgd2l0aCB0aGlzIG91dGdvaW5nIGludGVyZmFjZQorICovCitzdGF0aWMgdm9pZAorYmF0YWR2X3Zfb3JpZ19kdW1wKHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKKwkJICAgc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJICAgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICppZl9vdXRnb2luZykKK3sKKwlzdHJ1Y3QgYmF0YWR2X2hhc2h0YWJsZSAqaGFzaCA9IGJhdF9wcml2LT5vcmlnX2hhc2g7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CisJaW50IGJ1Y2tldCA9IGNiLT5hcmdzWzBdOworCWludCBpZHggPSBjYi0+YXJnc1sxXTsKKwlpbnQgc3ViID0gY2ItPmFyZ3NbMl07CisJaW50IHBvcnRpZCA9IE5FVExJTktfQ0IoY2ItPnNrYikucG9ydGlkOworCisJd2hpbGUgKGJ1Y2tldCA8IGhhc2gtPnNpemUpIHsKKwkJaGVhZCA9ICZoYXNoLT50YWJsZVtidWNrZXRdOworCisJCWlmIChiYXRhZHZfdl9vcmlnX2R1bXBfYnVja2V0KG1zZywgcG9ydGlkLAorCQkJCQkgICAgICBjYi0+bmxoLT5ubG1zZ19zZXEsCisJCQkJCSAgICAgIGJhdF9wcml2LCBpZl9vdXRnb2luZywgaGVhZCwgJmlkeCwKKwkJCQkJICAgICAgJnN1YikpCisJCQlicmVhazsKKworCQlidWNrZXQrKzsKKwl9CisKKwljYi0+YXJnc1swXSA9IGJ1Y2tldDsKKwljYi0+YXJnc1sxXSA9IGlkeDsKKwljYi0+YXJnc1syXSA9IHN1YjsKK30KIAogc3RhdGljIGludCBiYXRhZHZfdl9uZWlnaF9jbXAoc3RydWN0IGJhdGFkdl9uZWlnaF9ub2RlICpuZWlnaDEsCiAJCQkgICAgICBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmlmX291dGdvaW5nMSwKQEAgLTMyMCw2ICs2NjgsMzY1IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHNzaXplX3QgYmF0YWR2X3Zfc3RvcmVfc2VsX2NsYXNzKHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCQkJCWNoYXIgKmJ1ZmYsIHNpemVfdCBjb3VudCkKK3sKKwl1MzIgb2xkX2NsYXNzLCBjbGFzczsKKworCWlmICghYmF0YWR2X3BhcnNlX3Rocm91Z2hwdXQoYmF0X3ByaXYtPnNvZnRfaWZhY2UsIGJ1ZmYsCisJCQkJICAgICAiQi5BLlQuTS5BLk4uIFYgR1cgc2VsZWN0aW9uIGNsYXNzIiwKKwkJCQkgICAgICZjbGFzcykpCisJCXJldHVybiAtRUlOVkFMOworCisJb2xkX2NsYXNzID0gYXRvbWljX3JlYWQoJmJhdF9wcml2LT5ndy5zZWxfY2xhc3MpOworCWF0b21pY19zZXQoJmJhdF9wcml2LT5ndy5zZWxfY2xhc3MsIGNsYXNzKTsKKworCWlmIChvbGRfY2xhc3MgIT0gY2xhc3MpCisJCWJhdGFkdl9nd19yZXNlbGVjdChiYXRfcHJpdik7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGJhdGFkdl92X3Nob3dfc2VsX2NsYXNzKHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsIGNoYXIgKmJ1ZmYpCit7CisJdTMyIGNsYXNzID0gYXRvbWljX3JlYWQoJmJhdF9wcml2LT5ndy5zZWxfY2xhc3MpOworCisJcmV0dXJuIHNwcmludGYoYnVmZiwgIiV1LiV1IE1CaXRcbiIsIGNsYXNzIC8gMTAsIGNsYXNzICUgMTApOworfQorCisvKioKKyAqIGJhdGFkdl92X2d3X3Rocm91Z2hwdXRfZ2V0IC0gcmV0cmlldmUgdGhlIEdXLWJhbmR3aWR0aCBmb3IgYSBnaXZlbiBHVworICogQGd3X25vZGU6IHRoZSBHVyB0byByZXRyaWV2ZSB0aGUgbWV0cmljIGZvcgorICogQGJ3OiB0aGUgcG9pbnRlciB3aGVyZSB0aGUgbWV0cmljIHdpbGwgYmUgc3RvcmVkLiBUaGUgbWV0cmljIGlzIGNvbXB1dGVkIGFzCisgKiAgdGhlIG1pbmltdW0gYmV0d2VlbiB0aGUgR1cgYWR2ZXJ0aXNlZCB0aHJvdWdocHV0IGFuZCB0aGUgcGF0aCB0aHJvdWdocHV0IHRvCisgKiAgaXQgaW4gdGhlIG1lc2gKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IGJhdGFkdl92X2d3X3Rocm91Z2hwdXRfZ2V0KHN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqZ3dfbm9kZSwgdTMyICpidykKK3sKKwlzdHJ1Y3QgYmF0YWR2X25laWdoX2lmaW5mbyAqcm91dGVyX2lmaW5mbyA9IE5VTEw7CisJc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKm9yaWdfbm9kZTsKKwlzdHJ1Y3QgYmF0YWR2X25laWdoX25vZGUgKnJvdXRlcjsKKwlpbnQgcmV0ID0gLTE7CisKKwlvcmlnX25vZGUgPSBnd19ub2RlLT5vcmlnX25vZGU7CisJcm91dGVyID0gYmF0YWR2X29yaWdfcm91dGVyX2dldChvcmlnX25vZGUsIEJBVEFEVl9JRl9ERUZBVUxUKTsKKwlpZiAoIXJvdXRlcikKKwkJZ290byBvdXQ7CisKKwlyb3V0ZXJfaWZpbmZvID0gYmF0YWR2X25laWdoX2lmaW5mb19nZXQocm91dGVyLCBCQVRBRFZfSUZfREVGQVVMVCk7CisJaWYgKCFyb3V0ZXJfaWZpbmZvKQorCQlnb3RvIG91dDsKKworCS8qIHRoZSBHVyBtZXRyaWMgaXMgY29tcHV0ZWQgYXMgdGhlIG1pbmltdW0gYmV0d2VlbiB0aGUgcGF0aCB0aHJvdWdocHV0CisJICogdG8gcmVhY2ggdGhlIEdXIGl0c2VsZiBhbmQgdGhlIGFkdmVydGlzZWQgYmFuZHdpZHRoLgorCSAqIFRoaXMgZ2l2ZXMgdXMgYW4gYXBwcm94aW1hdGlvbiBvZiB0aGUgZWZmZWN0aXZlIHRocm91Z2hwdXQgdGhhdCB0aGUKKwkgKiBjbGllbnQgY2FuIGV4cGVjdCB2aWEgdGhpcyBwYXJ0aWN1bGFyIEdXIG5vZGUKKwkgKi8KKwkqYncgPSByb3V0ZXJfaWZpbmZvLT5iYXRfdi50aHJvdWdocHV0OworCSpidyA9IG1pbl90KHUzMiwgKmJ3LCBnd19ub2RlLT5iYW5kd2lkdGhfZG93bik7CisKKwlyZXQgPSAwOworb3V0OgorCWlmIChyb3V0ZXIpCisJCWJhdGFkdl9uZWlnaF9ub2RlX3B1dChyb3V0ZXIpOworCWlmIChyb3V0ZXJfaWZpbmZvKQorCQliYXRhZHZfbmVpZ2hfaWZpbmZvX3B1dChyb3V0ZXJfaWZpbmZvKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYmF0YWR2X3ZfZ3dfZ2V0X2Jlc3RfZ3dfbm9kZSAtIHJldHJpZXZlIHRoZSBiZXN0IEdXIG5vZGUKKyAqIEBiYXRfcHJpdjogdGhlIGJhdCBwcml2IHdpdGggYWxsIHRoZSBzb2Z0IGludGVyZmFjZSBpbmZvcm1hdGlvbgorICoKKyAqIFJldHVybjogdGhlIEdXIG5vZGUgaGF2aW5nIHRoZSBiZXN0IEdXLW1ldHJpYywgTlVMTCBpZiBubyBHVyBpcyBrbm93bgorICovCitzdGF0aWMgc3RydWN0IGJhdGFkdl9nd19ub2RlICoKK2JhdGFkdl92X2d3X2dldF9iZXN0X2d3X25vZGUoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdikKK3sKKwlzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKmd3X25vZGUsICpjdXJyX2d3ID0gTlVMTDsKKwl1MzIgbWF4X2J3ID0gMCwgYnc7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGd3X25vZGUsICZiYXRfcHJpdi0+Z3cubGlzdCwgbGlzdCkgeworCQlpZiAoIWtyZWZfZ2V0X3VubGVzc196ZXJvKCZnd19ub2RlLT5yZWZjb3VudCkpCisJCQljb250aW51ZTsKKworCQlpZiAoYmF0YWR2X3ZfZ3dfdGhyb3VnaHB1dF9nZXQoZ3dfbm9kZSwgJmJ3KSA8IDApCisJCQlnb3RvIG5leHQ7CisKKwkJaWYgKGN1cnJfZ3cgJiYgKGJ3IDw9IG1heF9idykpCisJCQlnb3RvIG5leHQ7CisKKwkJaWYgKGN1cnJfZ3cpCisJCQliYXRhZHZfZ3dfbm9kZV9wdXQoY3Vycl9ndyk7CisKKwkJY3Vycl9ndyA9IGd3X25vZGU7CisJCWtyZWZfZ2V0KCZjdXJyX2d3LT5yZWZjb3VudCk7CisJCW1heF9idyA9IGJ3OworCituZXh0OgorCQliYXRhZHZfZ3dfbm9kZV9wdXQoZ3dfbm9kZSk7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIGN1cnJfZ3c7Cit9CisKKy8qKgorICogYmF0YWR2X3ZfZ3dfaXNfZWxpZ2libGUgLSBjaGVjayBpZiBhIG9yaWdpbmF0b3Igd291bGQgYmUgc2VsZWN0ZWQgYXMgR1cKKyAqIEBiYXRfcHJpdjogdGhlIGJhdCBwcml2IHdpdGggYWxsIHRoZSBzb2Z0IGludGVyZmFjZSBpbmZvcm1hdGlvbgorICogQGN1cnJfZ3dfb3JpZzogb3JpZ2luYXRvciByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBHVworICogQG9yaWdfbm9kZTogdGhlIG9yaWdpbmF0b3IgcmVwcmVzZW50aW5nIHRoZSBuZXcgY2FuZGlkYXRlCisgKgorICogUmV0dXJuOiB0cnVlIGlmIG9yaWdfbm9kZSBjYW4gYmUgc2VsZWN0ZWQgYXMgY3VycmVudCBHVywgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBib29sIGJhdGFkdl92X2d3X2lzX2VsaWdpYmxlKHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCQkJICAgIHN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpjdXJyX2d3X29yaWcsCisJCQkJICAgIHN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpvcmlnX25vZGUpCit7CisJc3RydWN0IGJhdGFkdl9nd19ub2RlICpjdXJyX2d3ID0gTlVMTCwgKm9yaWdfZ3cgPSBOVUxMOworCXUzMiBnd190aHJvdWdocHV0LCBvcmlnX3Rocm91Z2hwdXQsIHRocmVzaG9sZDsKKwlib29sIHJldCA9IGZhbHNlOworCisJdGhyZXNob2xkID0gYXRvbWljX3JlYWQoJmJhdF9wcml2LT5ndy5zZWxfY2xhc3MpOworCisJY3Vycl9ndyA9IGJhdGFkdl9nd19ub2RlX2dldChiYXRfcHJpdiwgY3Vycl9nd19vcmlnKTsKKwlpZiAoIWN1cnJfZ3cpIHsKKwkJcmV0ID0gdHJ1ZTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGJhdGFkdl92X2d3X3Rocm91Z2hwdXRfZ2V0KGN1cnJfZ3csICZnd190aHJvdWdocHV0KSA8IDApIHsKKwkJcmV0ID0gdHJ1ZTsKKwkJZ290byBvdXQ7CisJfQorCisJb3JpZ19ndyA9IGJhdGFkdl9nd19ub2RlX2dldChiYXRfcHJpdiwgb3JpZ19ub2RlKTsKKwlpZiAoIW9yaWdfbm9kZSkKKwkJZ290byBvdXQ7CisKKwlpZiAoYmF0YWR2X3ZfZ3dfdGhyb3VnaHB1dF9nZXQob3JpZ19ndywgJm9yaWdfdGhyb3VnaHB1dCkgPCAwKQorCQlnb3RvIG91dDsKKworCWlmIChvcmlnX3Rocm91Z2hwdXQgPCBnd190aHJvdWdocHV0KQorCQlnb3RvIG91dDsKKworCWlmICgob3JpZ190aHJvdWdocHV0IC0gZ3dfdGhyb3VnaHB1dCkgPCB0aHJlc2hvbGQpCisJCWdvdG8gb3V0OworCisJYmF0YWR2X2RiZyhCQVRBRFZfREJHX0JBVE1BTiwgYmF0X3ByaXYsCisJCSAgICJSZXN0YXJ0aW5nIGdhdGV3YXkgc2VsZWN0aW9uOiBiZXR0ZXIgZ2F0ZXdheSBmb3VuZCAodGhyb3VnaHB1dCBjdXJyOiAldSwgdGhyb3VnaHB1dCBuZXc6ICV1KVxuIiwKKwkJICAgZ3dfdGhyb3VnaHB1dCwgb3JpZ190aHJvdWdocHV0KTsKKworCXJldCA9IHRydWU7CitvdXQ6CisJaWYgKGN1cnJfZ3cpCisJCWJhdGFkdl9nd19ub2RlX3B1dChjdXJyX2d3KTsKKwlpZiAob3JpZ19ndykKKwkJYmF0YWR2X2d3X25vZGVfcHV0KG9yaWdfZ3cpOworCisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKKy8qIGZhaWxzIGlmIG9yaWdfbm9kZSBoYXMgbm8gcm91dGVyICovCitzdGF0aWMgaW50IGJhdGFkdl92X2d3X3dyaXRlX2J1ZmZlcl90ZXh0KHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCQkJCSBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwKKwkJCQkJIGNvbnN0IHN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqZ3dfbm9kZSkKK3sKKwlzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKmN1cnJfZ3c7CisJc3RydWN0IGJhdGFkdl9uZWlnaF9ub2RlICpyb3V0ZXI7CisJc3RydWN0IGJhdGFkdl9uZWlnaF9pZmluZm8gKnJvdXRlcl9pZmluZm8gPSBOVUxMOworCWludCByZXQgPSAtMTsKKworCXJvdXRlciA9IGJhdGFkdl9vcmlnX3JvdXRlcl9nZXQoZ3dfbm9kZS0+b3JpZ19ub2RlLCBCQVRBRFZfSUZfREVGQVVMVCk7CisJaWYgKCFyb3V0ZXIpCisJCWdvdG8gb3V0OworCisJcm91dGVyX2lmaW5mbyA9IGJhdGFkdl9uZWlnaF9pZmluZm9fZ2V0KHJvdXRlciwgQkFUQURWX0lGX0RFRkFVTFQpOworCWlmICghcm91dGVyX2lmaW5mbykKKwkJZ290byBvdXQ7CisKKwljdXJyX2d3ID0gYmF0YWR2X2d3X2dldF9zZWxlY3RlZF9nd19ub2RlKGJhdF9wcml2KTsKKworCXNlcV9wcmludGYoc2VxLCAiJXMgJXBNICglOXUuJTF1KSAlcE0gWyUxMHNdOiAldS4ldS8ldS4ldSBNQml0XG4iLAorCQkgICAoY3Vycl9ndyA9PSBnd19ub2RlID8gIj0+IiA6ICIgICIpLAorCQkgICBnd19ub2RlLT5vcmlnX25vZGUtPm9yaWcsCisJCSAgIHJvdXRlcl9pZmluZm8tPmJhdF92LnRocm91Z2hwdXQgLyAxMCwKKwkJICAgcm91dGVyX2lmaW5mby0+YmF0X3YudGhyb3VnaHB1dCAlIDEwLCByb3V0ZXItPmFkZHIsCisJCSAgIHJvdXRlci0+aWZfaW5jb21pbmctPm5ldF9kZXYtPm5hbWUsCisJCSAgIGd3X25vZGUtPmJhbmR3aWR0aF9kb3duIC8gMTAsCisJCSAgIGd3X25vZGUtPmJhbmR3aWR0aF9kb3duICUgMTAsCisJCSAgIGd3X25vZGUtPmJhbmR3aWR0aF91cCAvIDEwLAorCQkgICBnd19ub2RlLT5iYW5kd2lkdGhfdXAgJSAxMCk7CisJcmV0ID0gc2VxX2hhc19vdmVyZmxvd2VkKHNlcSkgPyAtMSA6IDA7CisKKwlpZiAoY3Vycl9ndykKKwkJYmF0YWR2X2d3X25vZGVfcHV0KGN1cnJfZ3cpOworb3V0OgorCWlmIChyb3V0ZXJfaWZpbmZvKQorCQliYXRhZHZfbmVpZ2hfaWZpbmZvX3B1dChyb3V0ZXJfaWZpbmZvKTsKKwlpZiAocm91dGVyKQorCQliYXRhZHZfbmVpZ2hfbm9kZV9wdXQocm91dGVyKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGJhdGFkdl92X2d3X3ByaW50IC0gcHJpbnQgdGhlIGdhdGV3YXkgbGlzdAorICogQGJhdF9wcml2OiB0aGUgYmF0IHByaXYgd2l0aCBhbGwgdGhlIHNvZnQgaW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKiBAc2VxOiBnYXRld2F5IHRhYmxlIHNlcV9maWxlIHN0cnVjdAorICovCitzdGF0aWMgdm9pZCBiYXRhZHZfdl9nd19wcmludChzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkJICAgICAgc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJc3RydWN0IGJhdGFkdl9nd19ub2RlICpnd19ub2RlOworCWludCBnd19jb3VudCA9IDA7CisKKwlzZXFfcHV0cyhzZXEsCisJCSAiICAgICAgR2F0ZXdheSAgICAgICAgKCB0aHJvdWdocHV0KSAgICAgICAgICAgTmV4dGhvcCBbb3V0Z29pbmdJRl06IGFkdmVydGlzZWQgdXBsaW5rIGJhbmR3aWR0aFxuIik7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGd3X25vZGUsICZiYXRfcHJpdi0+Z3cubGlzdCwgbGlzdCkgeworCQkvKiBmYWlscyBpZiBvcmlnX25vZGUgaGFzIG5vIHJvdXRlciAqLworCQlpZiAoYmF0YWR2X3ZfZ3dfd3JpdGVfYnVmZmVyX3RleHQoYmF0X3ByaXYsIHNlcSwgZ3dfbm9kZSkgPCAwKQorCQkJY29udGludWU7CisKKwkJZ3dfY291bnQrKzsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlpZiAoZ3dfY291bnQgPT0gMCkKKwkJc2VxX3B1dHMoc2VxLCAiTm8gZ2F0ZXdheXMgaW4gcmFuZ2UgLi4uXG4iKTsKK30KKyNlbmRpZgorCisvKioKKyAqIGJhdGFkdl92X2d3X2R1bXBfZW50cnkgLSBEdW1wIGEgZ2F0ZXdheSBpbnRvIGEgbWVzc2FnZQorICogQG1zZzogTmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQHBvcnRpZDogUG9ydCBtYWtpbmcgbmV0bGluayByZXF1ZXN0CisgKiBAc2VxOiBTZXF1ZW5jZSBudW1iZXIgb2YgbmV0bGluayBtZXNzYWdlCisgKiBAYmF0X3ByaXY6IFRoZSBiYXQgcHJpdiB3aXRoIGFsbCB0aGUgc29mdCBpbnRlcmZhY2UgaW5mb3JtYXRpb24KKyAqIEBnd19ub2RlOiBHYXRld2F5IHRvIGJlIGR1bXBlZAorICoKKyAqIFJldHVybjogRXJyb3IgY29kZSwgb3IgMCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQgYmF0YWR2X3ZfZ3dfZHVtcF9lbnRyeShzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCB1MzIgcG9ydGlkLCB1MzIgc2VxLAorCQkJCSAgc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJCQkgIHN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqZ3dfbm9kZSkKK3sKKwlzdHJ1Y3QgYmF0YWR2X25laWdoX2lmaW5mbyAqcm91dGVyX2lmaW5mbyA9IE5VTEw7CisJc3RydWN0IGJhdGFkdl9uZWlnaF9ub2RlICpyb3V0ZXI7CisJc3RydWN0IGJhdGFkdl9nd19ub2RlICpjdXJyX2d3OworCWludCByZXQgPSAtRUlOVkFMOworCXZvaWQgKmhkcjsKKworCXJvdXRlciA9IGJhdGFkdl9vcmlnX3JvdXRlcl9nZXQoZ3dfbm9kZS0+b3JpZ19ub2RlLCBCQVRBRFZfSUZfREVGQVVMVCk7CisJaWYgKCFyb3V0ZXIpCisJCWdvdG8gb3V0OworCisJcm91dGVyX2lmaW5mbyA9IGJhdGFkdl9uZWlnaF9pZmluZm9fZ2V0KHJvdXRlciwgQkFUQURWX0lGX0RFRkFVTFQpOworCWlmICghcm91dGVyX2lmaW5mbykKKwkJZ290byBvdXQ7CisKKwljdXJyX2d3ID0gYmF0YWR2X2d3X2dldF9zZWxlY3RlZF9nd19ub2RlKGJhdF9wcml2KTsKKworCWhkciA9IGdlbmxtc2dfcHV0KG1zZywgcG9ydGlkLCBzZXEsICZiYXRhZHZfbmV0bGlua19mYW1pbHksCisJCQkgIE5MTV9GX01VTFRJLCBCQVRBRFZfQ01EX0dFVF9HQVRFV0FZUyk7CisJaWYgKCFoZHIpIHsKKwkJcmV0ID0gLUVOT0JVRlM7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IC1FTVNHU0laRTsKKworCWlmIChjdXJyX2d3ID09IGd3X25vZGUpIHsKKwkJaWYgKG5sYV9wdXRfZmxhZyhtc2csIEJBVEFEVl9BVFRSX0ZMQUdfQkVTVCkpIHsKKwkJCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKG5sYV9wdXQobXNnLCBCQVRBRFZfQVRUUl9PUklHX0FERFJFU1MsIEVUSF9BTEVOLAorCQkgICAgZ3dfbm9kZS0+b3JpZ19ub2RlLT5vcmlnKSkgeworCQlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChubGFfcHV0X3UzMihtc2csIEJBVEFEVl9BVFRSX1RIUk9VR0hQVVQsCisJCQlyb3V0ZXJfaWZpbmZvLT5iYXRfdi50aHJvdWdocHV0KSkgeworCQlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChubGFfcHV0KG1zZywgQkFUQURWX0FUVFJfUk9VVEVSLCBFVEhfQUxFTiwgcm91dGVyLT5hZGRyKSkgeworCQlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChubGFfcHV0X3N0cmluZyhtc2csIEJBVEFEVl9BVFRSX0hBUkRfSUZOQU1FLAorCQkJICAgcm91dGVyLT5pZl9pbmNvbWluZy0+bmV0X2Rldi0+bmFtZSkpIHsKKwkJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobmxhX3B1dF91MzIobXNnLCBCQVRBRFZfQVRUUl9CQU5EV0lEVEhfRE9XTiwKKwkJCWd3X25vZGUtPmJhbmR3aWR0aF9kb3duKSkgeworCQlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChubGFfcHV0X3UzMihtc2csIEJBVEFEVl9BVFRSX0JBTkRXSURUSF9VUCwgZ3dfbm9kZS0+YmFuZHdpZHRoX3VwKSkgeworCQlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CisJCWdvdG8gb3V0OworCX0KKworCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKKwlyZXQgPSAwOworCitvdXQ6CisJaWYgKHJvdXRlcl9pZmluZm8pCisJCWJhdGFkdl9uZWlnaF9pZmluZm9fcHV0KHJvdXRlcl9pZmluZm8pOworCWlmIChyb3V0ZXIpCisJCWJhdGFkdl9uZWlnaF9ub2RlX3B1dChyb3V0ZXIpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYmF0YWR2X3ZfZ3dfZHVtcCAtIER1bXAgZ2F0ZXdheXMgaW50byBhIG1lc3NhZ2UKKyAqIEBtc2c6IE5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBjYjogQ29udHJvbCBibG9jayBjb250YWluaW5nIGFkZGl0aW9uYWwgb3B0aW9ucworICogQGJhdF9wcml2OiBUaGUgYmF0IHByaXYgd2l0aCBhbGwgdGhlIHNvZnQgaW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIGJhdGFkdl92X2d3X2R1bXAoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAorCQkJICAgICBzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2KQoreworCWludCBwb3J0aWQgPSBORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZDsKKwlzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKmd3X25vZGU7CisJaW50IGlkeF9za2lwID0gY2ItPmFyZ3NbMF07CisJaW50IGlkeCA9IDA7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGd3X25vZGUsICZiYXRfcHJpdi0+Z3cubGlzdCwgbGlzdCkgeworCQlpZiAoaWR4KysgPCBpZHhfc2tpcCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChiYXRhZHZfdl9nd19kdW1wX2VudHJ5KG1zZywgcG9ydGlkLCBjYi0+bmxoLT5ubG1zZ19zZXEsCisJCQkJCSAgIGJhdF9wcml2LCBnd19ub2RlKSkgeworCQkJaWR4X3NraXAgPSBpZHggLSAxOworCQkJZ290byB1bmxvY2s7CisJCX0KKwl9CisKKwlpZHhfc2tpcCA9IGlkeDsKK3VubG9jazoKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCWNiLT5hcmdzWzBdID0gaWR4X3NraXA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgYmF0YWR2X2FsZ29fb3BzIGJhdGFkdl9iYXRtYW5fdiBfX3JlYWRfbW9zdGx5ID0gewogCS5uYW1lID0gIkJBVE1BTl9WIiwKIAkuaWZhY2UgPSB7CkBAIC0zMzMsMTAgKzEwNDAsMjYgQEAKIAkJLmhhcmRpZl9pbml0ID0gYmF0YWR2X3ZfaGFyZGlmX25laWdoX2luaXQsCiAJCS5jbXAgPSBiYXRhZHZfdl9uZWlnaF9jbXAsCiAJCS5pc19zaW1pbGFyX29yX2JldHRlciA9IGJhdGFkdl92X25laWdoX2lzX3NvYiwKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCiAJCS5wcmludCA9IGJhdGFkdl92X25laWdoX3ByaW50LAorI2VuZGlmCisJCS5kdW1wID0gYmF0YWR2X3ZfbmVpZ2hfZHVtcCwKIAl9LAogCS5vcmlnID0geworI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKIAkJLnByaW50ID0gYmF0YWR2X3Zfb3JpZ19wcmludCwKKyNlbmRpZgorCQkuZHVtcCA9IGJhdGFkdl92X29yaWdfZHVtcCwKKwl9LAorCS5ndyA9IHsKKwkJLnN0b3JlX3NlbF9jbGFzcyA9IGJhdGFkdl92X3N0b3JlX3NlbF9jbGFzcywKKwkJLnNob3dfc2VsX2NsYXNzID0gYmF0YWR2X3Zfc2hvd19zZWxfY2xhc3MsCisJCS5nZXRfYmVzdF9nd19ub2RlID0gYmF0YWR2X3ZfZ3dfZ2V0X2Jlc3RfZ3dfbm9kZSwKKwkJLmlzX2VsaWdpYmxlID0gYmF0YWR2X3ZfZ3dfaXNfZWxpZ2libGUsCisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUworCQkucHJpbnQgPSBiYXRhZHZfdl9nd19wcmludCwKKyNlbmRpZgorCQkuZHVtcCA9IGJhdGFkdl92X2d3X2R1bXAsCiAJfSwKIH07CiAKQEAgLTM2Myw3ICsxMDg2LDE2IEBACiAgKi8KIGludCBiYXRhZHZfdl9tZXNoX2luaXQoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdikKIHsKLQlyZXR1cm4gYmF0YWR2X3Zfb2dtX2luaXQoYmF0X3ByaXYpOworCWludCByZXQgPSAwOworCisJcmV0ID0gYmF0YWR2X3Zfb2dtX2luaXQoYmF0X3ByaXYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogc2V0IGRlZmF1bHQgdGhyb3VnaHB1dCBkaWZmZXJlbmNlIHRocmVzaG9sZCB0byA1TWJwcyAqLworCWF0b21pY19zZXQoJmJhdF9wcml2LT5ndy5zZWxfY2xhc3MsIDUwKTsKKworCXJldHVybiAwOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L2JhdF92X2VscC5jIGIvbmV0L2JhdG1hbi1hZHYvYmF0X3ZfZWxwLmMKaW5kZXggN2QxNzAwMS4uZWUwODU0MCAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvYmF0X3ZfZWxwLmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvYmF0X3ZfZWxwLmMKQEAgLTMzNSw3ICszMzUsNyBAQAogCQlnb3RvIG91dDsKIAogCXNrYl9yZXNlcnZlKGhhcmRfaWZhY2UtPmJhdF92LmVscF9za2IsIEVUSF9ITEVOICsgTkVUX0lQX0FMSUdOKTsKLQllbHBfYnVmZiA9IHNrYl9wdXNoKGhhcmRfaWZhY2UtPmJhdF92LmVscF9za2IsIEJBVEFEVl9FTFBfSExFTik7CisJZWxwX2J1ZmYgPSBza2JfcHV0KGhhcmRfaWZhY2UtPmJhdF92LmVscF9za2IsIEJBVEFEVl9FTFBfSExFTik7CiAJZWxwX3BhY2tldCA9IChzdHJ1Y3QgYmF0YWR2X2VscF9wYWNrZXQgKillbHBfYnVmZjsKIAltZW1zZXQoZWxwX3BhY2tldCwgMCwgQkFUQURWX0VMUF9ITEVOKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvYmF0X3Zfb2dtLmMgYi9uZXQvYmF0bWFuLWFkdi9iYXRfdl9vZ20uYwppbmRleCA2ZmJiYTRlLi4xYWVlYWRjIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9iYXRfdl9vZ20uYworKysgYi9uZXQvYmF0bWFuLWFkdi9iYXRfdl9vZ20uYwpAQCAtNzMsMTMgKzczLDEyIEBACiAJaWYgKCFvcmlnX25vZGUpCiAJCXJldHVybiBOVUxMOwogCisJa3JlZl9nZXQoJm9yaWdfbm9kZS0+cmVmY291bnQpOwogCWhhc2hfYWRkZWQgPSBiYXRhZHZfaGFzaF9hZGQoYmF0X3ByaXYtPm9yaWdfaGFzaCwgYmF0YWR2X2NvbXBhcmVfb3JpZywKIAkJCQkgICAgIGJhdGFkdl9jaG9vc2Vfb3JpZywgb3JpZ19ub2RlLAogCQkJCSAgICAgJm9yaWdfbm9kZS0+aGFzaF9lbnRyeSk7CiAJaWYgKGhhc2hfYWRkZWQgIT0gMCkgewotCQkvKiBvcmlnX25vZGUtPnJlZmNvdW50ZXIgaXMgaW5pdGlhbGlzZWQgdG8gMiBieQotCQkgKiBiYXRhZHZfb3JpZ19ub2RlX25ldygpCi0JCSAqLworCQkvKiByZW1vdmUgcmVmY250IGZvciBuZXdseSBjcmVhdGVkIG9yaWdfbm9kZSBhbmQgaGFzaCBlbnRyeSAqLwogCQliYXRhZHZfb3JpZ19ub2RlX3B1dChvcmlnX25vZGUpOwogCQliYXRhZHZfb3JpZ19ub2RlX3B1dChvcmlnX25vZGUpOwogCQlvcmlnX25vZGUgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvYnJpZGdlX2xvb3BfYXZvaWRhbmNlLmMgYi9uZXQvYmF0bWFuLWFkdi9icmlkZ2VfbG9vcF9hdm9pZGFuY2UuYwppbmRleCBhZDJmZmUxLi5lN2Y2OTBiIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9icmlkZ2VfbG9vcF9hdm9pZGFuY2UuYworKysgYi9uZXQvYmF0bWFuLWFkdi9icmlkZ2VfbG9vcF9hdm9pZGFuY2UuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9sb2NrZGVwLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CkBAIC00NSwxMiArNDYsMTggQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxuZXQvYXJwLmg+CisjaW5jbHVkZSA8bmV0L2dlbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L2JhdG1hbl9hZHYuaD4KIAogI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCiAjaW5jbHVkZSAiaGFzaC5oIgogI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgIm5ldGxpbmsuaCIKICNpbmNsdWRlICJvcmlnaW5hdG9yLmgiCiAjaW5jbHVkZSAicGFja2V0LmgiCisjaW5jbHVkZSAic29mdC1pbnRlcmZhY2UuaCIKICNpbmNsdWRlICJzeXNmcy5oIgogI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCiAKQEAgLTUxOSwxMSArNTI2LDkgQEAKIAlhdG9taWNfc2V0KCZlbnRyeS0+d2FpdF9wZXJpb2RzLCAwKTsKIAlldGhlcl9hZGRyX2NvcHkoZW50cnktPm9yaWcsIG9yaWcpOwogCUlOSVRfV09SSygmZW50cnktPnJlcG9ydF93b3JrLCBiYXRhZHZfYmxhX2xvb3BkZXRlY3RfcmVwb3J0KTsKLQotCS8qIG9uZSBmb3IgdGhlIGhhc2gsIG9uZSBmb3IgcmV0dXJuaW5nICovCiAJa3JlZl9pbml0KCZlbnRyeS0+cmVmY291bnQpOwotCWtyZWZfZ2V0KCZlbnRyeS0+cmVmY291bnQpOwogCisJa3JlZl9nZXQoJmVudHJ5LT5yZWZjb3VudCk7CiAJaGFzaF9hZGRlZCA9IGJhdGFkdl9oYXNoX2FkZChiYXRfcHJpdi0+YmxhLmJhY2tib25lX2hhc2gsCiAJCQkJICAgICBiYXRhZHZfY29tcGFyZV9iYWNrYm9uZV9ndywKIAkJCQkgICAgIGJhdGFkdl9jaG9vc2VfYmFja2JvbmVfZ3csIGVudHJ5LApAQCAtNzExLDEyICs3MTYsMTMgQEAKIAkJY2xhaW0tPmxhc3R0aW1lID0gamlmZmllczsKIAkJa3JlZl9nZXQoJmJhY2tib25lX2d3LT5yZWZjb3VudCk7CiAJCWNsYWltLT5iYWNrYm9uZV9ndyA9IGJhY2tib25lX2d3OwotCiAJCWtyZWZfaW5pdCgmY2xhaW0tPnJlZmNvdW50KTsKLQkJa3JlZl9nZXQoJmNsYWltLT5yZWZjb3VudCk7CisKIAkJYmF0YWR2X2RiZyhCQVRBRFZfREJHX0JMQSwgYmF0X3ByaXYsCiAJCQkgICAiYmxhX2FkZF9jbGFpbSgpOiBhZGRpbmcgbmV3IGVudHJ5ICVwTSwgdmlkICVkIHRvIGhhc2ggLi4uXG4iLAogCQkJICAgbWFjLCBCQVRBRFZfUFJJTlRfVklEKHZpZCkpOworCisJCWtyZWZfZ2V0KCZjbGFpbS0+cmVmY291bnQpOwogCQloYXNoX2FkZGVkID0gYmF0YWR2X2hhc2hfYWRkKGJhdF9wcml2LT5ibGEuY2xhaW1faGFzaCwKIAkJCQkJICAgICBiYXRhZHZfY29tcGFyZV9jbGFpbSwKIAkJCQkJICAgICBiYXRhZHZfY2hvb3NlX2NsYWltLCBjbGFpbSwKQEAgLTExNDgsNyArMTE1NCw3IEBACiAKIAkvKiBMZXQgdGhlIGxvb3BkZXRlY3QgZnJhbWVzIG9uIHRoZSBtZXNoIGluIGFueSBjYXNlLiAqLwogCWlmIChibGFfZHN0LT50eXBlID09IEJBVEFEVl9DTEFJTV9UWVBFX0xPT1BERVRFQ1QpCi0JCXJldHVybiAwOworCQlyZXR1cm4gZmFsc2U7CiAKIAkvKiBjaGVjayBpZiBpdCBpcyBhIGNsYWltIGZyYW1lLiAqLwogCXJldCA9IGJhdGFkdl9jaGVja19jbGFpbV9ncm91cChiYXRfcHJpdiwgcHJpbWFyeV9pZiwgaHdfc3JjLCBod19kc3QsCkBAIC0xOTkwLDYgKzE5OTYsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCiAvKioKICAqIGJhdGFkdl9ibGFfY2xhaW1fdGFibGVfc2VxX3ByaW50X3RleHQgLSBwcmludCB0aGUgY2xhaW0gdGFibGUgaW4gYSBzZXEgZmlsZQogICogQHNlcTogc2VxIGZpbGUgdG8gcHJpbnQgb24KQEAgLTIwNTAsOCArMjA1NywxNzIgQEAKIAkJYmF0YWR2X2hhcmRpZl9wdXQocHJpbWFyeV9pZik7CiAJcmV0dXJuIDA7CiB9CisjZW5kaWYKIAogLyoqCisgKiBiYXRhZHZfYmxhX2NsYWltX2R1bXBfZW50cnkgLSBkdW1wIG9uZSBlbnRyeSBvZiB0aGUgY2xhaW0gdGFibGUKKyAqIHRvIGEgbmV0bGluayBzb2NrZXQKKyAqIEBtc2c6IGJ1ZmZlciBmb3IgdGhlIG1lc3NhZ2UKKyAqIEBwb3J0aWQ6IG5ldGxpbmsgcG9ydAorICogQHNlcTogU2VxdWVuY2UgbnVtYmVyIG9mIG5ldGxpbmsgbWVzc2FnZQorICogQHByaW1hcnlfaWY6IHByaW1hcnkgaW50ZXJmYWNlCisgKiBAY2xhaW06IGVudHJ5IHRvIGR1bXAKKyAqCisgKiBSZXR1cm46IDAgb3IgZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludAorYmF0YWR2X2JsYV9jbGFpbV9kdW1wX2VudHJ5KHN0cnVjdCBza19idWZmICptc2csIHUzMiBwb3J0aWQsIHUzMiBzZXEsCisJCQkgICAgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpwcmltYXJ5X2lmLAorCQkJICAgIHN0cnVjdCBiYXRhZHZfYmxhX2NsYWltICpjbGFpbSkKK3sKKwl1OCAqcHJpbWFyeV9hZGRyID0gcHJpbWFyeV9pZi0+bmV0X2Rldi0+ZGV2X2FkZHI7CisJdTE2IGJhY2tib25lX2NyYzsKKwlib29sIGlzX293bjsKKwl2b2lkICpoZHI7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwloZHIgPSBnZW5sbXNnX3B1dChtc2csIHBvcnRpZCwgc2VxLCAmYmF0YWR2X25ldGxpbmtfZmFtaWx5LAorCQkJICBOTE1fRl9NVUxUSSwgQkFUQURWX0NNRF9HRVRfQkxBX0NMQUlNKTsKKwlpZiAoIWhkcikgeworCQlyZXQgPSAtRU5PQlVGUzsKKwkJZ290byBvdXQ7CisJfQorCisJaXNfb3duID0gYmF0YWR2X2NvbXBhcmVfZXRoKGNsYWltLT5iYWNrYm9uZV9ndy0+b3JpZywKKwkJCQkgICAgcHJpbWFyeV9hZGRyKTsKKworCXNwaW5fbG9ja19iaCgmY2xhaW0tPmJhY2tib25lX2d3LT5jcmNfbG9jayk7CisJYmFja2JvbmVfY3JjID0gY2xhaW0tPmJhY2tib25lX2d3LT5jcmM7CisJc3Bpbl91bmxvY2tfYmgoJmNsYWltLT5iYWNrYm9uZV9ndy0+Y3JjX2xvY2spOworCisJaWYgKGlzX293bikKKwkJaWYgKG5sYV9wdXRfZmxhZyhtc2csIEJBVEFEVl9BVFRSX0JMQV9PV04pKSB7CisJCQlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJaWYgKG5sYV9wdXQobXNnLCBCQVRBRFZfQVRUUl9CTEFfQUREUkVTUywgRVRIX0FMRU4sIGNsYWltLT5hZGRyKSB8fAorCSAgICBubGFfcHV0X3UxNihtc2csIEJBVEFEVl9BVFRSX0JMQV9WSUQsIGNsYWltLT52aWQpIHx8CisJICAgIG5sYV9wdXQobXNnLCBCQVRBRFZfQVRUUl9CTEFfQkFDS0JPTkUsIEVUSF9BTEVOLAorCQkgICAgY2xhaW0tPmJhY2tib25lX2d3LT5vcmlnKSB8fAorCSAgICBubGFfcHV0X3UxNihtc2csIEJBVEFEVl9BVFRSX0JMQV9DUkMsCisJCQliYWNrYm9uZV9jcmMpKSB7CisJCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKKwkJZ290byBvdXQ7CisJfQorCisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOworCXJldCA9IDA7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGJhdGFkdl9ibGFfY2xhaW1fZHVtcF9idWNrZXQgLSBkdW1wIG9uZSBidWNrZXQgb2YgdGhlIGNsYWltIHRhYmxlCisgKiB0byBhIG5ldGxpbmsgc29ja2V0CisgKiBAbXNnOiBidWZmZXIgZm9yIHRoZSBtZXNzYWdlCisgKiBAcG9ydGlkOiBuZXRsaW5rIHBvcnQKKyAqIEBzZXE6IFNlcXVlbmNlIG51bWJlciBvZiBuZXRsaW5rIG1lc3NhZ2UKKyAqIEBwcmltYXJ5X2lmOiBwcmltYXJ5IGludGVyZmFjZQorICogQGhlYWQ6IGJ1Y2tldCB0byBkdW1wCisgKiBAaWR4X3NraXA6IEhvdyBtYW55IGVudHJpZXMgdG8gc2tpcAorICoKKyAqIFJldHVybjogYWx3YXlzIDAuCisgKi8KK3N0YXRpYyBpbnQKK2JhdGFkdl9ibGFfY2xhaW1fZHVtcF9idWNrZXQoc3RydWN0IHNrX2J1ZmYgKm1zZywgdTMyIHBvcnRpZCwgdTMyIHNlcSwKKwkJCSAgICAgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpwcmltYXJ5X2lmLAorCQkJICAgICBzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCwgaW50ICppZHhfc2tpcCkKK3sKKwlzdHJ1Y3QgYmF0YWR2X2JsYV9jbGFpbSAqY2xhaW07CisJaW50IGlkeCA9IDA7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNsYWltLCBoZWFkLCBoYXNoX2VudHJ5KSB7CisJCWlmIChpZHgrKyA8ICppZHhfc2tpcCkKKwkJCWNvbnRpbnVlOworCQlpZiAoYmF0YWR2X2JsYV9jbGFpbV9kdW1wX2VudHJ5KG1zZywgcG9ydGlkLCBzZXEsCisJCQkJCQlwcmltYXJ5X2lmLCBjbGFpbSkpIHsKKwkJCSppZHhfc2tpcCA9IGlkeCAtIDE7CisJCQlnb3RvIHVubG9jazsKKwkJfQorCX0KKworCSppZHhfc2tpcCA9IGlkeDsKK3VubG9jazoKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBiYXRhZHZfYmxhX2NsYWltX2R1bXAgLSBkdW1wIGNsYWltIHRhYmxlIHRvIGEgbmV0bGluayBzb2NrZXQKKyAqIEBtc2c6IGJ1ZmZlciBmb3IgdGhlIG1lc3NhZ2UKKyAqIEBjYjogY2FsbGJhY2sgc3RydWN0dXJlIGNvbnRhaW5pbmcgYXJndW1lbnRzCisgKgorICogUmV0dXJuOiBtZXNzYWdlIGxlbmd0aC4KKyAqLworaW50IGJhdGFkdl9ibGFfY2xhaW1fZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpwcmltYXJ5X2lmID0gTlVMTDsKKwlpbnQgcG9ydGlkID0gTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQ7CisJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoY2ItPnNrYi0+c2spOworCXN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlOworCXN0cnVjdCBiYXRhZHZfaGFzaHRhYmxlICpoYXNoOworCXN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXY7CisJaW50IGJ1Y2tldCA9IGNiLT5hcmdzWzBdOworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCWludCBpZHggPSBjYi0+YXJnc1sxXTsKKwlpbnQgaWZpbmRleDsKKwlpbnQgcmV0ID0gMDsKKworCWlmaW5kZXggPSBiYXRhZHZfbmV0bGlua19nZXRfaWZpbmRleChjYi0+bmxoLAorCQkJCQkgICAgIEJBVEFEVl9BVFRSX01FU0hfSUZJTkRFWCk7CisJaWYgKCFpZmluZGV4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNvZnRfaWZhY2UgPSBkZXZfZ2V0X2J5X2luZGV4KG5ldCwgaWZpbmRleCk7CisJaWYgKCFzb2Z0X2lmYWNlIHx8ICFiYXRhZHZfc29mdGlmX2lzX3ZhbGlkKHNvZnRfaWZhY2UpKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCWJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9pZmFjZSk7CisJaGFzaCA9IGJhdF9wcml2LT5ibGEuY2xhaW1faGFzaDsKKworCXByaW1hcnlfaWYgPSBiYXRhZHZfcHJpbWFyeV9pZl9nZXRfc2VsZWN0ZWQoYmF0X3ByaXYpOworCWlmICghcHJpbWFyeV9pZiB8fCBwcmltYXJ5X2lmLT5pZl9zdGF0dXMgIT0gQkFUQURWX0lGX0FDVElWRSkgeworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIG91dDsKKwl9CisKKwl3aGlsZSAoYnVja2V0IDwgaGFzaC0+c2l6ZSkgeworCQloZWFkID0gJmhhc2gtPnRhYmxlW2J1Y2tldF07CisKKwkJaWYgKGJhdGFkdl9ibGFfY2xhaW1fZHVtcF9idWNrZXQobXNnLCBwb3J0aWQsCisJCQkJCQkgY2ItPm5saC0+bmxtc2dfc2VxLAorCQkJCQkJIHByaW1hcnlfaWYsIGhlYWQsICZpZHgpKQorCQkJYnJlYWs7CisJCWJ1Y2tldCsrOworCX0KKworCWNiLT5hcmdzWzBdID0gYnVja2V0OworCWNiLT5hcmdzWzFdID0gaWR4OworCisJcmV0ID0gbXNnLT5sZW47CisKK291dDoKKwlpZiAocHJpbWFyeV9pZikKKwkJYmF0YWR2X2hhcmRpZl9wdXQocHJpbWFyeV9pZik7CisKKwlpZiAoc29mdF9pZmFjZSkKKwkJZGV2X3B1dChzb2Z0X2lmYWNlKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCisvKioKICAqIGJhdGFkdl9ibGFfYmFja2JvbmVfdGFibGVfc2VxX3ByaW50X3RleHQgLSBwcmludCB0aGUgYmFja2JvbmUgdGFibGUgaW4gYSBzZXEKICAqICBmaWxlCiAgKiBAc2VxOiBzZXEgZmlsZSB0byBwcmludCBvbgpAQCAtMjExNCwzICsyMjg1LDE2OCBAQAogCQliYXRhZHZfaGFyZGlmX3B1dChwcmltYXJ5X2lmKTsKIAlyZXR1cm4gMDsKIH0KKyNlbmRpZgorCisvKioKKyAqIGJhdGFkdl9ibGFfYmFja2JvbmVfZHVtcF9lbnRyeSAtIGR1bXAgb25lIGVudHJ5IG9mIHRoZSBiYWNrYm9uZSB0YWJsZQorICogdG8gYSBuZXRsaW5rIHNvY2tldAorICogQG1zZzogYnVmZmVyIGZvciB0aGUgbWVzc2FnZQorICogQHBvcnRpZDogbmV0bGluayBwb3J0CisgKiBAc2VxOiBTZXF1ZW5jZSBudW1iZXIgb2YgbmV0bGluayBtZXNzYWdlCisgKiBAcHJpbWFyeV9pZjogcHJpbWFyeSBpbnRlcmZhY2UKKyAqIEBiYWNrYm9uZV9ndzogZW50cnkgdG8gZHVtcAorICoKKyAqIFJldHVybjogMCBvciBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW50CitiYXRhZHZfYmxhX2JhY2tib25lX2R1bXBfZW50cnkoc3RydWN0IHNrX2J1ZmYgKm1zZywgdTMyIHBvcnRpZCwgdTMyIHNlcSwKKwkJCSAgICAgICBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKnByaW1hcnlfaWYsCisJCQkgICAgICAgc3RydWN0IGJhdGFkdl9ibGFfYmFja2JvbmVfZ3cgKmJhY2tib25lX2d3KQoreworCXU4ICpwcmltYXJ5X2FkZHIgPSBwcmltYXJ5X2lmLT5uZXRfZGV2LT5kZXZfYWRkcjsKKwl1MTYgYmFja2JvbmVfY3JjOworCWJvb2wgaXNfb3duOworCWludCBtc2VjczsKKwl2b2lkICpoZHI7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwloZHIgPSBnZW5sbXNnX3B1dChtc2csIHBvcnRpZCwgc2VxLCAmYmF0YWR2X25ldGxpbmtfZmFtaWx5LAorCQkJICBOTE1fRl9NVUxUSSwgQkFUQURWX0NNRF9HRVRfQkxBX0JBQ0tCT05FKTsKKwlpZiAoIWhkcikgeworCQlyZXQgPSAtRU5PQlVGUzsKKwkJZ290byBvdXQ7CisJfQorCisJaXNfb3duID0gYmF0YWR2X2NvbXBhcmVfZXRoKGJhY2tib25lX2d3LT5vcmlnLCBwcmltYXJ5X2FkZHIpOworCisJc3Bpbl9sb2NrX2JoKCZiYWNrYm9uZV9ndy0+Y3JjX2xvY2spOworCWJhY2tib25lX2NyYyA9IGJhY2tib25lX2d3LT5jcmM7CisJc3Bpbl91bmxvY2tfYmgoJmJhY2tib25lX2d3LT5jcmNfbG9jayk7CisKKwltc2VjcyA9IGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIGJhY2tib25lX2d3LT5sYXN0dGltZSk7CisKKwlpZiAoaXNfb3duKQorCQlpZiAobmxhX3B1dF9mbGFnKG1zZywgQkFUQURWX0FUVFJfQkxBX09XTikpIHsKKwkJCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwlpZiAobmxhX3B1dChtc2csIEJBVEFEVl9BVFRSX0JMQV9CQUNLQk9ORSwgRVRIX0FMRU4sCisJCSAgICBiYWNrYm9uZV9ndy0+b3JpZykgfHwKKwkgICAgbmxhX3B1dF91MTYobXNnLCBCQVRBRFZfQVRUUl9CTEFfVklELCBiYWNrYm9uZV9ndy0+dmlkKSB8fAorCSAgICBubGFfcHV0X3UxNihtc2csIEJBVEFEVl9BVFRSX0JMQV9DUkMsCisJCQliYWNrYm9uZV9jcmMpIHx8CisJICAgIG5sYV9wdXRfdTMyKG1zZywgQkFUQURWX0FUVFJfTEFTVF9TRUVOX01TRUNTLCBtc2VjcykpIHsKKwkJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworCQlnb3RvIG91dDsKKwl9CisKKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CisJcmV0ID0gMDsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYmF0YWR2X2JsYV9iYWNrYm9uZV9kdW1wX2J1Y2tldCAtIGR1bXAgb25lIGJ1Y2tldCBvZiB0aGUgYmFja2JvbmUgdGFibGUKKyAqIHRvIGEgbmV0bGluayBzb2NrZXQKKyAqIEBtc2c6IGJ1ZmZlciBmb3IgdGhlIG1lc3NhZ2UKKyAqIEBwb3J0aWQ6IG5ldGxpbmsgcG9ydAorICogQHNlcTogU2VxdWVuY2UgbnVtYmVyIG9mIG5ldGxpbmsgbWVzc2FnZQorICogQHByaW1hcnlfaWY6IHByaW1hcnkgaW50ZXJmYWNlCisgKiBAaGVhZDogYnVja2V0IHRvIGR1bXAKKyAqIEBpZHhfc2tpcDogSG93IG1hbnkgZW50cmllcyB0byBza2lwCisgKgorICogUmV0dXJuOiBhbHdheXMgMC4KKyAqLworc3RhdGljIGludAorYmF0YWR2X2JsYV9iYWNrYm9uZV9kdW1wX2J1Y2tldChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCB1MzIgcG9ydGlkLCB1MzIgc2VxLAorCQkJCXN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqcHJpbWFyeV9pZiwKKwkJCQlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCwgaW50ICppZHhfc2tpcCkKK3sKKwlzdHJ1Y3QgYmF0YWR2X2JsYV9iYWNrYm9uZV9ndyAqYmFja2JvbmVfZ3c7CisJaW50IGlkeCA9IDA7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGJhY2tib25lX2d3LCBoZWFkLCBoYXNoX2VudHJ5KSB7CisJCWlmIChpZHgrKyA8ICppZHhfc2tpcCkKKwkJCWNvbnRpbnVlOworCQlpZiAoYmF0YWR2X2JsYV9iYWNrYm9uZV9kdW1wX2VudHJ5KG1zZywgcG9ydGlkLCBzZXEsCisJCQkJCQkgICBwcmltYXJ5X2lmLCBiYWNrYm9uZV9ndykpIHsKKwkJCSppZHhfc2tpcCA9IGlkeCAtIDE7CisJCQlnb3RvIHVubG9jazsKKwkJfQorCX0KKworCSppZHhfc2tpcCA9IGlkeDsKK3VubG9jazoKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBiYXRhZHZfYmxhX2JhY2tib25lX2R1bXAgLSBkdW1wIGJhY2tib25lIHRhYmxlIHRvIGEgbmV0bGluayBzb2NrZXQKKyAqIEBtc2c6IGJ1ZmZlciBmb3IgdGhlIG1lc3NhZ2UKKyAqIEBjYjogY2FsbGJhY2sgc3RydWN0dXJlIGNvbnRhaW5pbmcgYXJndW1lbnRzCisgKgorICogUmV0dXJuOiBtZXNzYWdlIGxlbmd0aC4KKyAqLworaW50IGJhdGFkdl9ibGFfYmFja2JvbmVfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpwcmltYXJ5X2lmID0gTlVMTDsKKwlpbnQgcG9ydGlkID0gTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQ7CisJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoY2ItPnNrYi0+c2spOworCXN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlOworCXN0cnVjdCBiYXRhZHZfaGFzaHRhYmxlICpoYXNoOworCXN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXY7CisJaW50IGJ1Y2tldCA9IGNiLT5hcmdzWzBdOworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCWludCBpZHggPSBjYi0+YXJnc1sxXTsKKwlpbnQgaWZpbmRleDsKKwlpbnQgcmV0ID0gMDsKKworCWlmaW5kZXggPSBiYXRhZHZfbmV0bGlua19nZXRfaWZpbmRleChjYi0+bmxoLAorCQkJCQkgICAgIEJBVEFEVl9BVFRSX01FU0hfSUZJTkRFWCk7CisJaWYgKCFpZmluZGV4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNvZnRfaWZhY2UgPSBkZXZfZ2V0X2J5X2luZGV4KG5ldCwgaWZpbmRleCk7CisJaWYgKCFzb2Z0X2lmYWNlIHx8ICFiYXRhZHZfc29mdGlmX2lzX3ZhbGlkKHNvZnRfaWZhY2UpKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCWJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9pZmFjZSk7CisJaGFzaCA9IGJhdF9wcml2LT5ibGEuYmFja2JvbmVfaGFzaDsKKworCXByaW1hcnlfaWYgPSBiYXRhZHZfcHJpbWFyeV9pZl9nZXRfc2VsZWN0ZWQoYmF0X3ByaXYpOworCWlmICghcHJpbWFyeV9pZiB8fCBwcmltYXJ5X2lmLT5pZl9zdGF0dXMgIT0gQkFUQURWX0lGX0FDVElWRSkgeworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIG91dDsKKwl9CisKKwl3aGlsZSAoYnVja2V0IDwgaGFzaC0+c2l6ZSkgeworCQloZWFkID0gJmhhc2gtPnRhYmxlW2J1Y2tldF07CisKKwkJaWYgKGJhdGFkdl9ibGFfYmFja2JvbmVfZHVtcF9idWNrZXQobXNnLCBwb3J0aWQsCisJCQkJCQkgICAgY2ItPm5saC0+bmxtc2dfc2VxLAorCQkJCQkJICAgIHByaW1hcnlfaWYsIGhlYWQsICZpZHgpKQorCQkJYnJlYWs7CisJCWJ1Y2tldCsrOworCX0KKworCWNiLT5hcmdzWzBdID0gYnVja2V0OworCWNiLT5hcmdzWzFdID0gaWR4OworCisJcmV0ID0gbXNnLT5sZW47CisKK291dDoKKwlpZiAocHJpbWFyeV9pZikKKwkJYmF0YWR2X2hhcmRpZl9wdXQocHJpbWFyeV9pZik7CisKKwlpZiAoc29mdF9pZmFjZSkKKwkJZGV2X3B1dChzb2Z0X2lmYWNlKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9icmlkZ2VfbG9vcF9hdm9pZGFuY2UuaCBiL25ldC9iYXRtYW4tYWR2L2JyaWRnZV9sb29wX2F2b2lkYW5jZS5oCmluZGV4IDBmMDFkYWUuLjFhZTkzZTQgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2JyaWRnZV9sb29wX2F2b2lkYW5jZS5oCisrKyBiL25ldC9iYXRtYW4tYWR2L2JyaWRnZV9sb29wX2F2b2lkYW5jZS5oCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogc3RydWN0IG5ldF9kZXZpY2U7CitzdHJ1Y3QgbmV0bGlua19jYWxsYmFjazsKIHN0cnVjdCBzZXFfZmlsZTsKIHN0cnVjdCBza19idWZmOwogCkBAIC0zNSw4ICszNiwxMCBAQAogCQkJICAgICAgIHN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpvcmlnX25vZGUsCiAJCQkgICAgICAgaW50IGhkcl9zaXplKTsKIGludCBiYXRhZHZfYmxhX2NsYWltX3RhYmxlX3NlcV9wcmludF90ZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpOworaW50IGJhdGFkdl9ibGFfY2xhaW1fZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOwogaW50IGJhdGFkdl9ibGFfYmFja2JvbmVfdGFibGVfc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsCiAJCQkJCSAgICAgdm9pZCAqb2Zmc2V0KTsKK2ludCBiYXRhZHZfYmxhX2JhY2tib25lX2R1bXAoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKTsKIGJvb2wgYmF0YWR2X2JsYV9pc19iYWNrYm9uZV9nd19vcmlnKHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsIHU4ICpvcmlnLAogCQkJCSAgICB1bnNpZ25lZCBzaG9ydCB2aWQpOwogYm9vbCBiYXRhZHZfYmxhX2NoZWNrX2JjYXN0X2R1cGxpc3Qoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKQEAgLTQ3LDcgKzUwLDcgQEAKIHZvaWQgYmF0YWR2X2JsYV9zdGF0dXNfdXBkYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2KTsKIGludCBiYXRhZHZfYmxhX2luaXQoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdik7CiB2b2lkIGJhdGFkdl9ibGFfZnJlZShzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2KTsKLQoraW50IGJhdGFkdl9ibGFfY2xhaW1fZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOwogI2RlZmluZSBCQVRBRFZfQkxBX0NSQ19JTklUCTAKICNlbHNlIC8qIGlmZGVmIENPTkZJR19CQVRNQU5fQURWX0JMQSAqLwogCkBAIC0xMTIsNiArMTE1LDE4IEBACiB7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGJhdGFkdl9ibGFfY2xhaW1fZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLAorCQkJCQlzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitzdGF0aWMgaW5saW5lIGludCBiYXRhZHZfYmxhX2JhY2tib25lX2R1bXAoc3RydWN0IHNrX2J1ZmYgKm1zZywKKwkJCQkJICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKwogI2VuZGlmIC8qIGlmZGVmIENPTkZJR19CQVRNQU5fQURWX0JMQSAqLwogCiAjZW5kaWYgLyogaWZuZGVmIF9ORVRfQkFUTUFOX0FEVl9CTEFfSF8gKi8KZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L2RlYnVnZnMuYyBiL25ldC9iYXRtYW4tYWR2L2RlYnVnZnMuYwppbmRleCAxZDY4YjZlLi5iNGZmYmE3ZGQgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2RlYnVnZnMuYworKysgYi9uZXQvYmF0bWFuLWFkdi9kZWJ1Z2ZzLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAKICNpbmNsdWRlICJiYXRfYWxnby5oIgogI2luY2x1ZGUgImJyaWRnZV9sb29wX2F2b2lkYW5jZS5oIgpAQCAtMzA1LDEyICszMDYsMTYgQEAKICAqLwogaW50IGJhdGFkdl9kZWJ1Z2ZzX2FkZF9oYXJkaWYoc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpoYXJkX2lmYWNlKQogeworCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoaGFyZF9pZmFjZS0+bmV0X2Rldik7CiAJc3RydWN0IGJhdGFkdl9kZWJ1Z2luZm8gKipiYXRfZGVidWc7CiAJc3RydWN0IGRlbnRyeSAqZmlsZTsKIAogCWlmICghYmF0YWR2X2RlYnVnZnMpCiAJCWdvdG8gb3V0OwogCisJaWYgKG5ldCAhPSAmaW5pdF9uZXQpCisJCXJldHVybiAwOworCiAJaGFyZF9pZmFjZS0+ZGVidWdfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKGhhcmRfaWZhY2UtPm5ldF9kZXYtPm5hbWUsCiAJCQkJCQkgICBiYXRhZHZfZGVidWdmcyk7CiAJaWYgKCFoYXJkX2lmYWNlLT5kZWJ1Z19kaXIpCkBAIC0zNDEsNiArMzQ2LDExIEBACiAgKi8KIHZvaWQgYmF0YWR2X2RlYnVnZnNfZGVsX2hhcmRpZihzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmhhcmRfaWZhY2UpCiB7CisJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChoYXJkX2lmYWNlLT5uZXRfZGV2KTsKKworCWlmIChuZXQgIT0gJmluaXRfbmV0KQorCQlyZXR1cm47CisKIAlpZiAoYmF0YWR2X2RlYnVnZnMpIHsKIAkJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGhhcmRfaWZhY2UtPmRlYnVnX2Rpcik7CiAJCWhhcmRfaWZhY2UtPmRlYnVnX2RpciA9IE5VTEw7CkBAIC0zNTEsMTEgKzM2MSwxNSBAQAogewogCXN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBiYXRhZHZfZGVidWdpbmZvICoqYmF0X2RlYnVnOworCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTsKIAlzdHJ1Y3QgZGVudHJ5ICpmaWxlOwogCiAJaWYgKCFiYXRhZHZfZGVidWdmcykKIAkJZ290byBvdXQ7CiAKKwlpZiAobmV0ICE9ICZpbml0X25ldCkKKwkJcmV0dXJuIDA7CisKIAliYXRfcHJpdi0+ZGVidWdfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKGRldi0+bmFtZSwgYmF0YWR2X2RlYnVnZnMpOwogCWlmICghYmF0X3ByaXYtPmRlYnVnX2RpcikKIAkJZ290byBvdXQ7CkBAIC0zOTIsNiArNDA2LDEwIEBACiB2b2lkIGJhdGFkdl9kZWJ1Z2ZzX2RlbF9tZXNoaWYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KGRldik7CisKKwlpZiAobmV0ICE9ICZpbml0X25ldCkKKwkJcmV0dXJuOwogCiAJYmF0YWR2X2RlYnVnX2xvZ19jbGVhbnVwKGJhdF9wcml2KTsKIApkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvZGVidWdmcy5oIGIvbmV0L2JhdG1hbi1hZHYvZGVidWdmcy5oCmluZGV4IDFhYjRlMmU2Li5jNjhmZjNkIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9kZWJ1Z2ZzLmgKKysrIGIvbmV0L2JhdG1hbi1hZHYvZGVidWdmcy5oCkBAIC0yNiw3ICsyNiw3IEBACiAKICNkZWZpbmUgQkFUQURWX0RFQlVHRlNfU1VCRElSICJiYXRtYW5fYWR2IgogCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfREVCVUdfRlMpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTKQogCiB2b2lkIGJhdGFkdl9kZWJ1Z2ZzX2luaXQodm9pZCk7CiB2b2lkIGJhdGFkdl9kZWJ1Z2ZzX2Rlc3Ryb3kodm9pZCk7CmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9kaXN0cmlidXRlZC1hcnAtdGFibGUuYyBiL25ldC9iYXRtYW4tYWR2L2Rpc3RyaWJ1dGVkLWFycC10YWJsZS5jCmluZGV4IGIxY2M4YmYuLmUyNTdlZmQgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2Rpc3RyaWJ1dGVkLWFycC10YWJsZS5jCisrKyBiL25ldC9iYXRtYW4tYWR2L2Rpc3RyaWJ1dGVkLWFycC10YWJsZS5jCkBAIC0zNDMsOCArMzQzLDggQEAKIAlldGhlcl9hZGRyX2NvcHkoZGF0X2VudHJ5LT5tYWNfYWRkciwgbWFjX2FkZHIpOwogCWRhdF9lbnRyeS0+bGFzdF91cGRhdGUgPSBqaWZmaWVzOwogCWtyZWZfaW5pdCgmZGF0X2VudHJ5LT5yZWZjb3VudCk7Ci0Ja3JlZl9nZXQoJmRhdF9lbnRyeS0+cmVmY291bnQpOwogCisJa3JlZl9nZXQoJmRhdF9lbnRyeS0+cmVmY291bnQpOwogCWhhc2hfYWRkZWQgPSBiYXRhZHZfaGFzaF9hZGQoYmF0X3ByaXYtPmRhdC5oYXNoLCBiYXRhZHZfY29tcGFyZV9kYXQsCiAJCQkJICAgICBiYXRhZHZfaGFzaF9kYXQsIGRhdF9lbnRyeSwKIAkJCQkgICAgICZkYXRfZW50cnktPmhhc2hfZW50cnkpOwpAQCAtNzk1LDYgKzc5NSw3IEBACiAJYmF0YWR2X2RhdF9oYXNoX2ZyZWUoYmF0X3ByaXYpOwogfQogCisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUwogLyoqCiAgKiBiYXRhZHZfZGF0X2NhY2hlX3NlcV9wcmludF90ZXh0IC0gcHJpbnQgdGhlIGxvY2FsIERBVCBoYXNoIHRhYmxlCiAgKiBAc2VxOiBzZXEgZmlsZSB0byBwcmludCBvbgpAQCAtODQ2LDYgKzg0Nyw3IEBACiAJCWJhdGFkdl9oYXJkaWZfcHV0KHByaW1hcnlfaWYpOwogCXJldHVybiAwOwogfQorI2VuZGlmCiAKIC8qKgogICogYmF0YWR2X2FycF9nZXRfdHlwZSAtIHBhcnNlIGFuIEFSUCBwYWNrZXQgYW5kIGdldHMgdGhlIHR5cGUKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L2dhdGV3YXlfY2xpZW50LmMgYi9uZXQvYmF0bWFuLWFkdi9nYXRld2F5X2NsaWVudC5jCmluZGV4IDYzYTgwNWQuLmRlMDU1ZDYgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2dhdGV3YXlfY2xpZW50LmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvZ2F0ZXdheV9jbGllbnQuYwpAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2dlbmVyaWMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgpAQCAtMzEsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CkBAIC0zOSwxMyArNDEsMTcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9iYXRtYW5fYWR2Lmg+CiAKICNpbmNsdWRlICJnYXRld2F5X2NvbW1vbi5oIgogI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCiAjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAibmV0bGluay5oIgogI2luY2x1ZGUgIm9yaWdpbmF0b3IuaCIKICNpbmNsdWRlICJwYWNrZXQuaCIKICNpbmNsdWRlICJyb3V0aW5nLmgiCisjaW5jbHVkZSAic29mdC1pbnRlcmZhY2UuaCIKICNpbmNsdWRlICJzeXNmcy5oIgogI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCiAKQEAgLTgwLDEyICs4NiwxMiBAQAogICogYmF0YWR2X2d3X25vZGVfcHV0IC0gZGVjcmVtZW50IHRoZSBnd19ub2RlIHJlZmNvdW50ZXIgYW5kIHBvc3NpYmx5IHJlbGVhc2UgaXQKICAqIEBnd19ub2RlOiBnYXRld2F5IG5vZGUgdG8gZnJlZQogICovCi1zdGF0aWMgdm9pZCBiYXRhZHZfZ3dfbm9kZV9wdXQoc3RydWN0IGJhdGFkdl9nd19ub2RlICpnd19ub2RlKQordm9pZCBiYXRhZHZfZ3dfbm9kZV9wdXQoc3RydWN0IGJhdGFkdl9nd19ub2RlICpnd19ub2RlKQogewogCWtyZWZfcHV0KCZnd19ub2RlLT5yZWZjb3VudCwgYmF0YWR2X2d3X25vZGVfcmVsZWFzZSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKgorc3RydWN0IGJhdGFkdl9nd19ub2RlICoKIGJhdGFkdl9nd19nZXRfc2VsZWN0ZWRfZ3dfbm9kZShzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2KQogewogCXN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqZ3dfbm9kZTsKQEAgLTE2NCw4NiArMTcwLDYgQEAKIAlhdG9taWNfc2V0KCZiYXRfcHJpdi0+Z3cucmVzZWxlY3QsIDEpOwogfQogCi1zdGF0aWMgc3RydWN0IGJhdGFkdl9nd19ub2RlICoKLWJhdGFkdl9nd19nZXRfYmVzdF9nd19ub2RlKHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYpCi17Ci0Jc3RydWN0IGJhdGFkdl9uZWlnaF9ub2RlICpyb3V0ZXI7Ci0Jc3RydWN0IGJhdGFkdl9uZWlnaF9pZmluZm8gKnJvdXRlcl9pZmluZm87Ci0Jc3RydWN0IGJhdGFkdl9nd19ub2RlICpnd19ub2RlLCAqY3Vycl9ndyA9IE5VTEw7Ci0JdTY0IG1heF9nd19mYWN0b3IgPSAwOwotCXU2NCB0bXBfZ3dfZmFjdG9yID0gMDsKLQl1OCBtYXhfdHEgPSAwOwotCXU4IHRxX2F2ZzsKLQlzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqb3JpZ19ub2RlOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShnd19ub2RlLCAmYmF0X3ByaXYtPmd3Lmxpc3QsIGxpc3QpIHsKLQkJb3JpZ19ub2RlID0gZ3dfbm9kZS0+b3JpZ19ub2RlOwotCQlyb3V0ZXIgPSBiYXRhZHZfb3JpZ19yb3V0ZXJfZ2V0KG9yaWdfbm9kZSwgQkFUQURWX0lGX0RFRkFVTFQpOwotCQlpZiAoIXJvdXRlcikKLQkJCWNvbnRpbnVlOwotCi0JCXJvdXRlcl9pZmluZm8gPSBiYXRhZHZfbmVpZ2hfaWZpbmZvX2dldChyb3V0ZXIsCi0JCQkJCQkJQkFUQURWX0lGX0RFRkFVTFQpOwotCQlpZiAoIXJvdXRlcl9pZmluZm8pCi0JCQlnb3RvIG5leHQ7Ci0KLQkJaWYgKCFrcmVmX2dldF91bmxlc3NfemVybygmZ3dfbm9kZS0+cmVmY291bnQpKQotCQkJZ290byBuZXh0OwotCi0JCXRxX2F2ZyA9IHJvdXRlcl9pZmluZm8tPmJhdF9pdi50cV9hdmc7Ci0KLQkJc3dpdGNoIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmd3LnNlbF9jbGFzcykpIHsKLQkJY2FzZSAxOiAvKiBmYXN0IGNvbm5lY3Rpb24gKi8KLQkJCXRtcF9nd19mYWN0b3IgPSB0cV9hdmcgKiB0cV9hdmc7Ci0JCQl0bXBfZ3dfZmFjdG9yICo9IGd3X25vZGUtPmJhbmR3aWR0aF9kb3duOwotCQkJdG1wX2d3X2ZhY3RvciAqPSAxMDAgKiAxMDA7Ci0JCQl0bXBfZ3dfZmFjdG9yID4+PSAxODsKLQotCQkJaWYgKCh0bXBfZ3dfZmFjdG9yID4gbWF4X2d3X2ZhY3RvcikgfHwKLQkJCSAgICAoKHRtcF9nd19mYWN0b3IgPT0gbWF4X2d3X2ZhY3RvcikgJiYKLQkJCSAgICAgKHRxX2F2ZyA+IG1heF90cSkpKSB7Ci0JCQkJaWYgKGN1cnJfZ3cpCi0JCQkJCWJhdGFkdl9nd19ub2RlX3B1dChjdXJyX2d3KTsKLQkJCQljdXJyX2d3ID0gZ3dfbm9kZTsKLQkJCQlrcmVmX2dldCgmY3Vycl9ndy0+cmVmY291bnQpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDogLyogMjogIHN0YWJsZSBjb25uZWN0aW9uICh1c2UgYmVzdCBzdGF0aXN0aWMpCi0JCQkgICogMzogIGZhc3Qtc3dpdGNoICh1c2UgYmVzdCBzdGF0aXN0aWMgYnV0IGNoYW5nZSBhcwotCQkJICAqICAgICBzb29uIGFzIGEgYmV0dGVyIGdhdGV3YXkgYXBwZWFycykKLQkJCSAgKiBYWDogbGF0ZS1zd2l0Y2ggKHVzZSBiZXN0IHN0YXRpc3RpYyBidXQgY2hhbmdlIGFzCi0JCQkgICogICAgIHNvb24gYXMgYSBiZXR0ZXIgZ2F0ZXdheSBhcHBlYXJzIHdoaWNoIGhhcwotCQkJICAqICAgICAkcm91dGluZ19jbGFzcyBtb3JlIHRxIHBvaW50cykKLQkJCSAgKi8KLQkJCWlmICh0cV9hdmcgPiBtYXhfdHEpIHsKLQkJCQlpZiAoY3Vycl9ndykKLQkJCQkJYmF0YWR2X2d3X25vZGVfcHV0KGN1cnJfZ3cpOwotCQkJCWN1cnJfZ3cgPSBnd19ub2RlOwotCQkJCWtyZWZfZ2V0KCZjdXJyX2d3LT5yZWZjb3VudCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmICh0cV9hdmcgPiBtYXhfdHEpCi0JCQltYXhfdHEgPSB0cV9hdmc7Ci0KLQkJaWYgKHRtcF9nd19mYWN0b3IgPiBtYXhfZ3dfZmFjdG9yKQotCQkJbWF4X2d3X2ZhY3RvciA9IHRtcF9nd19mYWN0b3I7Ci0KLQkJYmF0YWR2X2d3X25vZGVfcHV0KGd3X25vZGUpOwotCi1uZXh0OgotCQliYXRhZHZfbmVpZ2hfbm9kZV9wdXQocm91dGVyKTsKLQkJaWYgKHJvdXRlcl9pZmluZm8pCi0JCQliYXRhZHZfbmVpZ2hfaWZpbmZvX3B1dChyb3V0ZXJfaWZpbmZvKTsKLQl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQlyZXR1cm4gY3Vycl9ndzsKLX0KLQogLyoqCiAgKiBiYXRhZHZfZ3dfY2hlY2tfY2xpZW50X3N0b3AgLSBjaGVjayBpZiBjbGllbnQgbW9kZSBoYXMgYmVlbiBzd2l0Y2hlZCBvZmYKICAqIEBiYXRfcHJpdjogdGhlIGJhdCBwcml2IHdpdGggYWxsIHRoZSBzb2Z0IGludGVyZmFjZSBpbmZvcm1hdGlvbgpAQCAtMjg3LDEyICsyMTMsMTkgQEAKIAlpZiAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5ndy5tb2RlKSAhPSBCQVRBRFZfR1dfTU9ERV9DTElFTlQpCiAJCWdvdG8gb3V0OwogCisJaWYgKCFiYXRfcHJpdi0+YWxnb19vcHMtPmd3LmdldF9iZXN0X2d3X25vZGUpCisJCWdvdG8gb3V0OworCiAJY3Vycl9ndyA9IGJhdGFkdl9nd19nZXRfc2VsZWN0ZWRfZ3dfbm9kZShiYXRfcHJpdik7CiAKIAlpZiAoIWJhdGFkdl9hdG9taWNfZGVjX25vdF96ZXJvKCZiYXRfcHJpdi0+Z3cucmVzZWxlY3QpICYmIGN1cnJfZ3cpCiAJCWdvdG8gb3V0OwogCi0JbmV4dF9ndyA9IGJhdGFkdl9nd19nZXRfYmVzdF9nd19ub2RlKGJhdF9wcml2KTsKKwkvKiBpZiBndy5yZXNlbGVjdCBpcyBzZXQgdG8gMSBpdCBtZWFucyB0aGF0IGEgcHJldmlvdXMgY2FsbCB0bworCSAqIGd3LmlzX2VsaWdpYmxlKCkgc2FpZCB0aGF0IHdlIGhhdmUgYSBuZXcgYmVzdCBHVywgdGhlcmVmb3JlIGl0IGNhbgorCSAqIG5vdyBiZSBwaWNrZWQgZnJvbSB0aGUgbGlzdCBhbmQgc2VsZWN0ZWQKKwkgKi8KKwluZXh0X2d3ID0gYmF0X3ByaXYtPmFsZ29fb3BzLT5ndy5nZXRfYmVzdF9nd19ub2RlKGJhdF9wcml2KTsKIAogCWlmIChjdXJyX2d3ID09IG5leHRfZ3cpCiAJCWdvdG8gb3V0OwpAQCAtMzYwLDcwICsyOTMsMzEgQEAKIHZvaWQgYmF0YWR2X2d3X2NoZWNrX2VsZWN0aW9uKHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCiAJCQkgICAgICBzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqb3JpZ19ub2RlKQogewotCXN0cnVjdCBiYXRhZHZfbmVpZ2hfaWZpbmZvICpyb3V0ZXJfb3JpZ190cSA9IE5VTEw7Ci0Jc3RydWN0IGJhdGFkdl9uZWlnaF9pZmluZm8gKnJvdXRlcl9nd190cSA9IE5VTEw7CiAJc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKmN1cnJfZ3dfb3JpZzsKLQlzdHJ1Y3QgYmF0YWR2X25laWdoX25vZGUgKnJvdXRlcl9ndyA9IE5VTEw7Ci0Jc3RydWN0IGJhdGFkdl9uZWlnaF9ub2RlICpyb3V0ZXJfb3JpZyA9IE5VTEw7Ci0JdTggZ3dfdHFfYXZnLCBvcmlnX3RxX2F2ZzsKKworCS8qIGFib3J0IGltbWVkaWF0ZWx5IGlmIHRoZSByb3V0aW5nIGFsZ29yaXRobSBkb2VzIG5vdCBzdXBwb3J0IGdhdGV3YXkKKwkgKiBlbGVjdGlvbgorCSAqLworCWlmICghYmF0X3ByaXYtPmFsZ29fb3BzLT5ndy5pc19lbGlnaWJsZSkKKwkJcmV0dXJuOwogCiAJY3Vycl9nd19vcmlnID0gYmF0YWR2X2d3X2dldF9zZWxlY3RlZF9vcmlnKGJhdF9wcml2KTsKIAlpZiAoIWN1cnJfZ3dfb3JpZykKIAkJZ290byByZXNlbGVjdDsKIAotCXJvdXRlcl9ndyA9IGJhdGFkdl9vcmlnX3JvdXRlcl9nZXQoY3Vycl9nd19vcmlnLCBCQVRBRFZfSUZfREVGQVVMVCk7Ci0JaWYgKCFyb3V0ZXJfZ3cpCi0JCWdvdG8gcmVzZWxlY3Q7Ci0KLQlyb3V0ZXJfZ3dfdHEgPSBiYXRhZHZfbmVpZ2hfaWZpbmZvX2dldChyb3V0ZXJfZ3csCi0JCQkJCSAgICAgICBCQVRBRFZfSUZfREVGQVVMVCk7Ci0JaWYgKCFyb3V0ZXJfZ3dfdHEpCi0JCWdvdG8gcmVzZWxlY3Q7Ci0KIAkvKiB0aGlzIG5vZGUgYWxyZWFkeSBpcyB0aGUgZ2F0ZXdheSAqLwogCWlmIChjdXJyX2d3X29yaWcgPT0gb3JpZ19ub2RlKQogCQlnb3RvIG91dDsKIAotCXJvdXRlcl9vcmlnID0gYmF0YWR2X29yaWdfcm91dGVyX2dldChvcmlnX25vZGUsIEJBVEFEVl9JRl9ERUZBVUxUKTsKLQlpZiAoIXJvdXRlcl9vcmlnKQorCWlmICghYmF0X3ByaXYtPmFsZ29fb3BzLT5ndy5pc19lbGlnaWJsZShiYXRfcHJpdiwgY3Vycl9nd19vcmlnLAorCQkJCQkJb3JpZ19ub2RlKSkKIAkJZ290byBvdXQ7CiAKLQlyb3V0ZXJfb3JpZ190cSA9IGJhdGFkdl9uZWlnaF9pZmluZm9fZ2V0KHJvdXRlcl9vcmlnLAotCQkJCQkJIEJBVEFEVl9JRl9ERUZBVUxUKTsKLQlpZiAoIXJvdXRlcl9vcmlnX3RxKQotCQlnb3RvIG91dDsKLQotCWd3X3RxX2F2ZyA9IHJvdXRlcl9nd190cS0+YmF0X2l2LnRxX2F2ZzsKLQlvcmlnX3RxX2F2ZyA9IHJvdXRlcl9vcmlnX3RxLT5iYXRfaXYudHFfYXZnOwotCi0JLyogdGhlIFRRIHZhbHVlIGhhcyB0byBiZSBiZXR0ZXIgKi8KLQlpZiAob3JpZ190cV9hdmcgPCBnd190cV9hdmcpCi0JCWdvdG8gb3V0OwotCi0JLyogaWYgdGhlIHJvdXRpbmcgY2xhc3MgaXMgZ3JlYXRlciB0aGFuIDMgdGhlIHZhbHVlIHRlbGxzIHVzIGhvdyBtdWNoCi0JICogZ3JlYXRlciB0aGUgVFEgdmFsdWUgb2YgdGhlIG5ldyBnYXRld2F5IG11c3QgYmUKLQkgKi8KLQlpZiAoKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Z3cuc2VsX2NsYXNzKSA+IDMpICYmCi0JICAgIChvcmlnX3RxX2F2ZyAtIGd3X3RxX2F2ZyA8IGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Z3cuc2VsX2NsYXNzKSkpCi0JCWdvdG8gb3V0OwotCi0JYmF0YWR2X2RiZyhCQVRBRFZfREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCSAgICJSZXN0YXJ0aW5nIGdhdGV3YXkgc2VsZWN0aW9uOiBiZXR0ZXIgZ2F0ZXdheSBmb3VuZCAodHEgY3VycjogJWksIHRxIG5ldzogJWkpXG4iLAotCQkgICBnd190cV9hdmcsIG9yaWdfdHFfYXZnKTsKLQogcmVzZWxlY3Q6CiAJYmF0YWR2X2d3X3Jlc2VsZWN0KGJhdF9wcml2KTsKIG91dDoKIAlpZiAoY3Vycl9nd19vcmlnKQogCQliYXRhZHZfb3JpZ19ub2RlX3B1dChjdXJyX2d3X29yaWcpOwotCWlmIChyb3V0ZXJfZ3cpCi0JCWJhdGFkdl9uZWlnaF9ub2RlX3B1dChyb3V0ZXJfZ3cpOwotCWlmIChyb3V0ZXJfb3JpZykKLQkJYmF0YWR2X25laWdoX25vZGVfcHV0KHJvdXRlcl9vcmlnKTsKLQlpZiAocm91dGVyX2d3X3RxKQotCQliYXRhZHZfbmVpZ2hfaWZpbmZvX3B1dChyb3V0ZXJfZ3dfdHEpOwotCWlmIChyb3V0ZXJfb3JpZ190cSkKLQkJYmF0YWR2X25laWdoX2lmaW5mb19wdXQocm91dGVyX29yaWdfdHEpOwogfQogCiAvKioKQEAgLTQ0NSwxNCArMzM5LDE1IEBACiAJaWYgKCFnd19ub2RlKQogCQlyZXR1cm47CiAKLQlrcmVmX2dldCgmb3JpZ19ub2RlLT5yZWZjb3VudCk7CisJa3JlZl9pbml0KCZnd19ub2RlLT5yZWZjb3VudCk7CiAJSU5JVF9ITElTVF9OT0RFKCZnd19ub2RlLT5saXN0KTsKKwlrcmVmX2dldCgmb3JpZ19ub2RlLT5yZWZjb3VudCk7CiAJZ3dfbm9kZS0+b3JpZ19ub2RlID0gb3JpZ19ub2RlOwogCWd3X25vZGUtPmJhbmR3aWR0aF9kb3duID0gbnRvaGwoZ2F0ZXdheS0+YmFuZHdpZHRoX2Rvd24pOwogCWd3X25vZGUtPmJhbmR3aWR0aF91cCA9IG50b2hsKGdhdGV3YXktPmJhbmR3aWR0aF91cCk7Ci0Ja3JlZl9pbml0KCZnd19ub2RlLT5yZWZjb3VudCk7CiAKIAlzcGluX2xvY2tfYmgoJmJhdF9wcml2LT5ndy5saXN0X2xvY2spOworCWtyZWZfZ2V0KCZnd19ub2RlLT5yZWZjb3VudCk7CiAJaGxpc3RfYWRkX2hlYWRfcmN1KCZnd19ub2RlLT5saXN0LCAmYmF0X3ByaXYtPmd3Lmxpc3QpOwogCXNwaW5fdW5sb2NrX2JoKCZiYXRfcHJpdi0+Z3cubGlzdF9sb2NrKTsKIApAQCAtNDYzLDYgKzM1OCw5IEBACiAJCSAgIG50b2hsKGdhdGV3YXktPmJhbmR3aWR0aF9kb3duKSAlIDEwLAogCQkgICBudG9obChnYXRld2F5LT5iYW5kd2lkdGhfdXApIC8gMTAsCiAJCSAgIG50b2hsKGdhdGV3YXktPmJhbmR3aWR0aF91cCkgJSAxMCk7CisKKwkvKiBkb24ndCByZXR1cm4gcmVmZXJlbmNlIHRvIG5ldyBnd19ub2RlICovCisJYmF0YWR2X2d3X25vZGVfcHV0KGd3X25vZGUpOwogfQogCiAvKioKQEAgLTQ3Miw5ICszNzAsOCBAQAogICoKICAqIFJldHVybjogZ2F0ZXdheSBub2RlIGlmIGZvdW5kIG9yIE5VTEwgb3RoZXJ3aXNlLgogICovCi1zdGF0aWMgc3RydWN0IGJhdGFkdl9nd19ub2RlICoKLWJhdGFkdl9nd19ub2RlX2dldChzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAotCQkgICBzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqb3JpZ19ub2RlKQorc3RydWN0IGJhdGFkdl9nd19ub2RlICpiYXRhZHZfZ3dfbm9kZV9nZXQoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJCQkJICBzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqb3JpZ19ub2RlKQogewogCXN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqZ3dfbm9kZV90bXAsICpnd19ub2RlID0gTlVMTDsKIApAQCAtNTg1LDgxICs0ODIsODcgQEAKIAlzcGluX3VubG9ja19iaCgmYmF0X3ByaXYtPmd3Lmxpc3RfbG9jayk7CiB9CiAKLS8qIGZhaWxzIGlmIG9yaWdfbm9kZSBoYXMgbm8gcm91dGVyICovCi1zdGF0aWMgaW50IGJhdGFkdl93cml0ZV9idWZmZXJfdGV4dChzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAotCQkJCSAgICBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwKLQkJCQkgICAgY29uc3Qgc3RydWN0IGJhdGFkdl9nd19ub2RlICpnd19ub2RlKQotewotCXN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqY3Vycl9ndzsKLQlzdHJ1Y3QgYmF0YWR2X25laWdoX25vZGUgKnJvdXRlcjsKLQlzdHJ1Y3QgYmF0YWR2X25laWdoX2lmaW5mbyAqcm91dGVyX2lmaW5mbyA9IE5VTEw7Ci0JaW50IHJldCA9IC0xOwotCi0Jcm91dGVyID0gYmF0YWR2X29yaWdfcm91dGVyX2dldChnd19ub2RlLT5vcmlnX25vZGUsIEJBVEFEVl9JRl9ERUZBVUxUKTsKLQlpZiAoIXJvdXRlcikKLQkJZ290byBvdXQ7Ci0KLQlyb3V0ZXJfaWZpbmZvID0gYmF0YWR2X25laWdoX2lmaW5mb19nZXQocm91dGVyLCBCQVRBRFZfSUZfREVGQVVMVCk7Ci0JaWYgKCFyb3V0ZXJfaWZpbmZvKQotCQlnb3RvIG91dDsKLQotCWN1cnJfZ3cgPSBiYXRhZHZfZ3dfZ2V0X3NlbGVjdGVkX2d3X25vZGUoYmF0X3ByaXYpOwotCi0Jc2VxX3ByaW50ZihzZXEsICIlcyAlcE0gKCUzaSkgJXBNIFslMTBzXTogJXUuJXUvJXUuJXUgTUJpdFxuIiwKLQkJICAgKGN1cnJfZ3cgPT0gZ3dfbm9kZSA/ICI9PiIgOiAiICAiKSwKLQkJICAgZ3dfbm9kZS0+b3JpZ19ub2RlLT5vcmlnLAotCQkgICByb3V0ZXJfaWZpbmZvLT5iYXRfaXYudHFfYXZnLCByb3V0ZXItPmFkZHIsCi0JCSAgIHJvdXRlci0+aWZfaW5jb21pbmctPm5ldF9kZXYtPm5hbWUsCi0JCSAgIGd3X25vZGUtPmJhbmR3aWR0aF9kb3duIC8gMTAsCi0JCSAgIGd3X25vZGUtPmJhbmR3aWR0aF9kb3duICUgMTAsCi0JCSAgIGd3X25vZGUtPmJhbmR3aWR0aF91cCAvIDEwLAotCQkgICBnd19ub2RlLT5iYW5kd2lkdGhfdXAgJSAxMCk7Ci0JcmV0ID0gc2VxX2hhc19vdmVyZmxvd2VkKHNlcSkgPyAtMSA6IDA7Ci0KLQlpZiAoY3Vycl9ndykKLQkJYmF0YWR2X2d3X25vZGVfcHV0KGN1cnJfZ3cpOwotb3V0OgotCWlmIChyb3V0ZXJfaWZpbmZvKQotCQliYXRhZHZfbmVpZ2hfaWZpbmZvX3B1dChyb3V0ZXJfaWZpbmZvKTsKLQlpZiAocm91dGVyKQotCQliYXRhZHZfbmVpZ2hfbm9kZV9wdXQocm91dGVyKTsKLQlyZXR1cm4gcmV0OwotfQotCisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUwogaW50IGJhdGFkdl9nd19jbGllbnRfc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKXNlcS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CiAJc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpwcmltYXJ5X2lmOwotCXN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqZ3dfbm9kZTsKLQlpbnQgZ3dfY291bnQgPSAwOwogCiAJcHJpbWFyeV9pZiA9IGJhdGFkdl9zZXFfcHJpbnRfdGV4dF9wcmltYXJ5X2lmX2dldChzZXEpOwogCWlmICghcHJpbWFyeV9pZikKLQkJZ290byBvdXQ7CisJCXJldHVybiAwOwogCi0Jc2VxX3ByaW50ZihzZXEsCi0JCSAgICIgICAgICBHYXRld2F5ICAgICAgKCMvMjU1KSAgICAgICAgICAgTmV4dGhvcCBbb3V0Z29pbmdJRl06IGFkdmVydGlzZWQgdXBsaW5rIGJhbmR3aWR0aCAuLi4gW0IuQS5ULk0uQS5OLiBhZHYgJXMsIE1haW5JRi9NQUM6ICVzLyVwTSAoJXMpXVxuIiwKKwlzZXFfcHJpbnRmKHNlcSwgIltCLkEuVC5NLkEuTi4gYWR2ICVzLCBNYWluSUYvTUFDOiAlcy8lcE0gKCVzICVzKV1cbiIsCiAJCSAgIEJBVEFEVl9TT1VSQ0VfVkVSU0lPTiwgcHJpbWFyeV9pZi0+bmV0X2Rldi0+bmFtZSwKLQkJICAgcHJpbWFyeV9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIsIG5ldF9kZXYtPm5hbWUpOworCQkgICBwcmltYXJ5X2lmLT5uZXRfZGV2LT5kZXZfYWRkciwgbmV0X2Rldi0+bmFtZSwKKwkJICAgYmF0X3ByaXYtPmFsZ29fb3BzLT5uYW1lKTsKIAotCXJjdV9yZWFkX2xvY2soKTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZ3dfbm9kZSwgJmJhdF9wcml2LT5ndy5saXN0LCBsaXN0KSB7Ci0JCS8qIGZhaWxzIGlmIG9yaWdfbm9kZSBoYXMgbm8gcm91dGVyICovCi0JCWlmIChiYXRhZHZfd3JpdGVfYnVmZmVyX3RleHQoYmF0X3ByaXYsIHNlcSwgZ3dfbm9kZSkgPCAwKQotCQkJY29udGludWU7CisJYmF0YWR2X2hhcmRpZl9wdXQocHJpbWFyeV9pZik7CiAKLQkJZ3dfY291bnQrKzsKKwlpZiAoIWJhdF9wcml2LT5hbGdvX29wcy0+Z3cucHJpbnQpIHsKKwkJc2VxX3B1dHMoc2VxLAorCQkJICJObyBwcmludGluZyBmdW5jdGlvbiBmb3IgdGhpcyByb3V0aW5nIHByb3RvY29sXG4iKTsKKwkJcmV0dXJuIDA7CiAJfQotCXJjdV9yZWFkX3VubG9jaygpOwogCi0JaWYgKGd3X2NvdW50ID09IDApCi0JCXNlcV9wdXRzKHNlcSwgIk5vIGdhdGV3YXlzIGluIHJhbmdlIC4uLlxuIik7CisJYmF0X3ByaXYtPmFsZ29fb3BzLT5ndy5wcmludChiYXRfcHJpdiwgc2VxKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qKgorICogYmF0YWR2X2d3X2R1bXAgLSBEdW1wIGdhdGV3YXlzIGludG8gYSBtZXNzYWdlCisgKiBAbXNnOiBOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAY2I6IENvbnRyb2wgYmxvY2sgY29udGFpbmluZyBhZGRpdGlvbmFsIG9wdGlvbnMKKyAqCisgKiBSZXR1cm46IEVycm9yIGNvZGUsIG9yIGxlbmd0aCBvZiBtZXNzYWdlCisgKi8KK2ludCBiYXRhZHZfZ3dfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpwcmltYXJ5X2lmID0gTlVMTDsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChjYi0+c2tiLT5zayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2U7CisJc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdjsKKwlpbnQgaWZpbmRleDsKKwlpbnQgcmV0OworCisJaWZpbmRleCA9IGJhdGFkdl9uZXRsaW5rX2dldF9pZmluZGV4KGNiLT5ubGgsCisJCQkJCSAgICAgQkFUQURWX0FUVFJfTUVTSF9JRklOREVYKTsKKwlpZiAoIWlmaW5kZXgpCisJCXJldHVybiAtRUlOVkFMOworCisJc29mdF9pZmFjZSA9IGRldl9nZXRfYnlfaW5kZXgobmV0LCBpZmluZGV4KTsKKwlpZiAoIXNvZnRfaWZhY2UgfHwgIWJhdGFkdl9zb2Z0aWZfaXNfdmFsaWQoc29mdF9pZmFjZSkpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2lmYWNlKTsKKworCXByaW1hcnlfaWYgPSBiYXRhZHZfcHJpbWFyeV9pZl9nZXRfc2VsZWN0ZWQoYmF0X3ByaXYpOworCWlmICghcHJpbWFyeV9pZiB8fCBwcmltYXJ5X2lmLT5pZl9zdGF0dXMgIT0gQkFUQURWX0lGX0FDVElWRSkgeworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIWJhdF9wcml2LT5hbGdvX29wcy0+Z3cuZHVtcCkgeworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBvdXQ7CisJfQorCisJYmF0X3ByaXYtPmFsZ29fb3BzLT5ndy5kdW1wKG1zZywgY2IsIGJhdF9wcml2KTsKKworCXJldCA9IG1zZy0+bGVuOwogCiBvdXQ6CiAJaWYgKHByaW1hcnlfaWYpCiAJCWJhdGFkdl9oYXJkaWZfcHV0KHByaW1hcnlfaWYpOwotCXJldHVybiAwOworCWlmIChzb2Z0X2lmYWNlKQorCQlkZXZfcHV0KHNvZnRfaWZhY2UpOworCisJcmV0dXJuIHJldDsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9nYXRld2F5X2NsaWVudC5oIGIvbmV0L2JhdG1hbi1hZHYvZ2F0ZXdheV9jbGllbnQuaAppbmRleCA1ODJkZDhjLi44NTkxNjZkIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9nYXRld2F5X2NsaWVudC5oCisrKyBiL25ldC9iYXRtYW4tYWR2L2dhdGV3YXlfY2xpZW50LmgKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiBzdHJ1Y3QgYmF0YWR2X3R2bHZfZ2F0ZXdheV9kYXRhOworc3RydWN0IG5ldGxpbmtfY2FsbGJhY2s7CiBzdHJ1Y3Qgc2VxX2ZpbGU7CiBzdHJ1Y3Qgc2tfYnVmZjsKIApAQCAtMzksMTAgKzQwLDE2IEBACiB2b2lkIGJhdGFkdl9nd19ub2RlX2RlbGV0ZShzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAogCQkJICAgc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKm9yaWdfbm9kZSk7CiB2b2lkIGJhdGFkdl9nd19ub2RlX2ZyZWUoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdik7Cit2b2lkIGJhdGFkdl9nd19ub2RlX3B1dChzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKmd3X25vZGUpOworc3RydWN0IGJhdGFkdl9nd19ub2RlICoKK2JhdGFkdl9nd19nZXRfc2VsZWN0ZWRfZ3dfbm9kZShzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2KTsKIGludCBiYXRhZHZfZ3dfY2xpZW50X3NlcV9wcmludF90ZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpOworaW50IGJhdGFkdl9nd19kdW1wKHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYik7CiBib29sIGJhdGFkdl9nd19vdXRfb2ZfcmFuZ2Uoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBlbnVtIGJhdGFkdl9kaGNwX3JlY2lwaWVudAogYmF0YWR2X2d3X2RoY3BfcmVjaXBpZW50X2dldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgKmhlYWRlcl9sZW4sCiAJCQkgICAgIHU4ICpjaGFkZHIpOworc3RydWN0IGJhdGFkdl9nd19ub2RlICpiYXRhZHZfZ3dfbm9kZV9nZXQoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJCQkJICBzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqb3JpZ19ub2RlKTsKIAogI2VuZGlmIC8qIF9ORVRfQkFUTUFOX0FEVl9HQVRFV0FZX0NMSUVOVF9IXyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvZ2F0ZXdheV9jb21tb24uYyBiL25ldC9iYXRtYW4tYWR2L2dhdGV3YXlfY29tbW9uLmMKaW5kZXggZDdiYzZhOC4uMjExODQ4MSAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvZ2F0ZXdheV9jb21tb24uYworKysgYi9uZXQvYmF0bWFuLWFkdi9nYXRld2F5X2NvbW1vbi5jCkBAIC0yNDEsMTAgKzI0MSw5IEBACiAKIAliYXRhZHZfZ3dfbm9kZV91cGRhdGUoYmF0X3ByaXYsIG9yaWcsICZnYXRld2F5KTsKIAotCS8qIHJlc3RhcnQgZ2F0ZXdheSBzZWxlY3Rpb24gaWYgZmFzdCBvciBsYXRlIHN3aXRjaGluZyB3YXMgZW5hYmxlZCAqLworCS8qIHJlc3RhcnQgZ2F0ZXdheSBzZWxlY3Rpb24gKi8KIAlpZiAoKGdhdGV3YXkuYmFuZHdpZHRoX2Rvd24gIT0gMCkgJiYKLQkgICAgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Z3cubW9kZSkgPT0gQkFUQURWX0dXX01PREVfQ0xJRU5UKSAmJgotCSAgICAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5ndy5zZWxfY2xhc3MpID4gMikpCisJICAgIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmd3Lm1vZGUpID09IEJBVEFEVl9HV19NT0RFX0NMSUVOVCkpCiAJCWJhdGFkdl9nd19jaGVja19lbGVjdGlvbihiYXRfcHJpdiwgb3JpZyk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L2hhcmQtaW50ZXJmYWNlLmMgYi9uZXQvYmF0bWFuLWFkdi9oYXJkLWludGVyZmFjZS5jCmluZGV4IDFmOTA4MDguLjA4Y2UzNjEgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2hhcmQtaW50ZXJmYWNlLmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvaGFyZC1pbnRlcmZhY2UuYwpAQCAtMzUsNyArMzUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CisjaW5jbHVkZSA8bmV0L3J0bmV0bGluay5oPgogCiAjaW5jbHVkZSAiYmF0X3YuaCIKICNpbmNsdWRlICJicmlkZ2VfbG9vcF9hdm9pZGFuY2UuaCIKQEAgLTg1LDI1ICs4Niw1NSBAQAogfQogCiAvKioKKyAqIGJhdGFkdl9nZXRsaW5rX25ldCAtIHJldHVybiBsaW5rIG5ldCBuYW1lc3BhY2UgKG9mIHVzZSBmYWxsYmFjaykKKyAqIEBuZXRkZXY6IG5ldF9kZXZpY2UgdG8gY2hlY2sKKyAqIEBmYWxsYmFja19uZXQ6IHJldHVybiBpbiBjYXNlIGdldF9saW5rX25ldCBpcyBub3QgYXZhaWxhYmxlIGZvciBAbmV0ZGV2CisgKgorICogUmV0dXJuOiByZXN1bHQgb2YgcnRubF9saW5rX29wcy0+Z2V0X2xpbmtfbmV0IG9yIEBmYWxsYmFja19uZXQKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXQgKmJhdGFkdl9nZXRsaW5rX25ldChjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJCQkgICAgY29uc3Qgc3RydWN0IG5ldCAqZmFsbGJhY2tfbmV0KQoreworCWlmICghbmV0ZGV2LT5ydG5sX2xpbmtfb3BzKQorCQlyZXR1cm4gZmFsbGJhY2tfbmV0OworCisJaWYgKCFuZXRkZXYtPnJ0bmxfbGlua19vcHMtPmdldF9saW5rX25ldCkKKwkJcmV0dXJuIGZhbGxiYWNrX25ldDsKKworCXJldHVybiBuZXRkZXYtPnJ0bmxfbGlua19vcHMtPmdldF9saW5rX25ldChuZXRkZXYpOworfQorCisvKioKICAqIGJhdGFkdl9tdXR1YWxfcGFyZW50cyAtIGNoZWNrIGlmIHR3byBkZXZpY2VzIGFyZSBlYWNoIG90aGVycyBwYXJlbnQKLSAqIEBkZXYxOiAxc3QgbmV0X2RldmljZQotICogQGRldjI6IDJuZCBuZXRfZGV2aWNlCisgKiBAZGV2MTogMXN0IG5ldCBkZXYKKyAqIEBuZXQxOiAxc3QgZGV2aWNlcyBuZXRucworICogQGRldjI6IDJuZCBuZXQgZGV2CisgKiBAbmV0MjogMm5kIGRldmljZXMgbmV0bnMKICAqCiAgKiB2ZXRoIGRldmljZXMgY29tZSBpbiBwYWlycyBhbmQgZWFjaCBpcyB0aGUgcGFyZW50IG9mIHRoZSBvdGhlciEKICAqCiAgKiBSZXR1cm46IHRydWUgaWYgdGhlIGRldmljZXMgYXJlIGVhY2ggb3RoZXJzIHBhcmVudCwgb3RoZXJ3aXNlIGZhbHNlCiAgKi8KIHN0YXRpYyBib29sIGJhdGFkdl9tdXR1YWxfcGFyZW50cyhjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2MSwKLQkJCQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYyKQorCQkJCSAgY29uc3Qgc3RydWN0IG5ldCAqbmV0MSwKKwkJCQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYyLAorCQkJCSAgY29uc3Qgc3RydWN0IG5ldCAqbmV0MikKIHsKIAlpbnQgZGV2MV9wYXJlbnRfaWZsaW5rID0gZGV2X2dldF9pZmxpbmsoZGV2MSk7CiAJaW50IGRldjJfcGFyZW50X2lmbGluayA9IGRldl9nZXRfaWZsaW5rKGRldjIpOworCWNvbnN0IHN0cnVjdCBuZXQgKmRldjFfcGFyZW50X25ldDsKKwljb25zdCBzdHJ1Y3QgbmV0ICpkZXYyX3BhcmVudF9uZXQ7CisKKwlkZXYxX3BhcmVudF9uZXQgPSBiYXRhZHZfZ2V0bGlua19uZXQoZGV2MSwgbmV0MSk7CisJZGV2Ml9wYXJlbnRfbmV0ID0gYmF0YWR2X2dldGxpbmtfbmV0KGRldjIsIG5ldDIpOwogCiAJaWYgKCFkZXYxX3BhcmVudF9pZmxpbmsgfHwgIWRldjJfcGFyZW50X2lmbGluaykKIAkJcmV0dXJuIGZhbHNlOwogCiAJcmV0dXJuIChkZXYxX3BhcmVudF9pZmxpbmsgPT0gZGV2Mi0+aWZpbmRleCkgJiYKLQkgICAgICAgKGRldjJfcGFyZW50X2lmbGluayA9PSBkZXYxLT5pZmluZGV4KTsKKwkgICAgICAgKGRldjJfcGFyZW50X2lmbGluayA9PSBkZXYxLT5pZmluZGV4KSAmJgorCSAgICAgICBuZXRfZXEoZGV2MV9wYXJlbnRfbmV0LCBuZXQyKSAmJgorCSAgICAgICBuZXRfZXEoZGV2Ml9wYXJlbnRfbmV0LCBuZXQxKTsKIH0KIAogLyoqCkBAIC0xMjEsOCArMTUyLDkgQEAKICAqLwogc3RhdGljIGJvb2wgYmF0YWR2X2lzX29uX2JhdG1hbl9pZmFjZShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcGFyZW50X2RldjsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KG5ldF9kZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpwYXJlbnRfZGV2OworCWNvbnN0IHN0cnVjdCBuZXQgKnBhcmVudF9uZXQ7CiAJYm9vbCByZXQ7CiAKIAkvKiBjaGVjayBpZiB0aGlzIGlzIGEgYmF0bWFuLWFkdiBtZXNoIGludGVyZmFjZSAqLwpAQCAtMTM0LDEzICsxNjYsMTYgQEAKIAkgICAgZGV2X2dldF9pZmxpbmsobmV0X2RldikgPT0gbmV0X2Rldi0+aWZpbmRleCkKIAkJcmV0dXJuIGZhbHNlOwogCisJcGFyZW50X25ldCA9IGJhdGFkdl9nZXRsaW5rX25ldChuZXRfZGV2LCBuZXQpOworCiAJLyogcmVjdXJzZSBvdmVyIHRoZSBwYXJlbnQgZGV2aWNlICovCi0JcGFyZW50X2RldiA9IF9fZGV2X2dldF9ieV9pbmRleChuZXQsIGRldl9nZXRfaWZsaW5rKG5ldF9kZXYpKTsKKwlwYXJlbnRfZGV2ID0gX19kZXZfZ2V0X2J5X2luZGV4KChzdHJ1Y3QgbmV0ICopcGFyZW50X25ldCwKKwkJCQkJZGV2X2dldF9pZmxpbmsobmV0X2RldikpOwogCS8qIGlmIHdlIGdvdCBhIE5VTEwgcGFyZW50X2RldiB0aGVyZSBpcyBzb21ldGhpbmcgYnJva2VuLi4gKi8KIAlpZiAoV0FSTighcGFyZW50X2RldiwgIkNhbm5vdCBmaW5kIHBhcmVudCBkZXZpY2UiKSkKIAkJcmV0dXJuIGZhbHNlOwogCi0JaWYgKGJhdGFkdl9tdXR1YWxfcGFyZW50cyhuZXRfZGV2LCBwYXJlbnRfZGV2KSkKKwlpZiAoYmF0YWR2X211dHVhbF9wYXJlbnRzKG5ldF9kZXYsIG5ldCwgcGFyZW50X2RldiwgcGFyZW50X25ldCkpCiAJCXJldHVybiBmYWxzZTsKIAogCXJldCA9IGJhdGFkdl9pc19vbl9iYXRtYW5faWZhY2UocGFyZW50X2Rldik7CkBAIC02MjUsMjUgKzY2MCw2IEBACiAJCWJhdGFkdl9oYXJkaWZfcHV0KHByaW1hcnlfaWYpOwogfQogCi0vKioKLSAqIGJhdGFkdl9oYXJkaWZfcmVtb3ZlX2ludGVyZmFjZV9maW5pc2ggLSBjbGVhbnMgdXAgdGhlIHJlbWFpbnMgb2YgYSBoYXJkaWYKLSAqIEB3b3JrOiB3b3JrIHF1ZXVlIGl0ZW0KLSAqCi0gKiBGcmVlIHRoZSBwYXJ0cyBvZiB0aGUgaGFyZCBpbnRlcmZhY2Ugd2hpY2ggY2FuIG5vdCBiZSByZW1vdmVkIHVuZGVyCi0gKiBydG5sIGxvY2sgKHRvIHByZXZlbnQgZGVhZGxvY2sgc2l0dWF0aW9ucykuCi0gKi8KLXN0YXRpYyB2b2lkIGJhdGFkdl9oYXJkaWZfcmVtb3ZlX2ludGVyZmFjZV9maW5pc2goc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaGFyZF9pZmFjZTsKLQotCWhhcmRfaWZhY2UgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlLAotCQkJCSAgY2xlYW51cF93b3JrKTsKLQotCWJhdGFkdl9kZWJ1Z2ZzX2RlbF9oYXJkaWYoaGFyZF9pZmFjZSk7Ci0JYmF0YWR2X3N5c2ZzX2RlbF9oYXJkaWYoJmhhcmRfaWZhY2UtPmhhcmRpZl9vYmopOwotCWJhdGFkdl9oYXJkaWZfcHV0KGhhcmRfaWZhY2UpOwotfQotCiBzdGF0aWMgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICoKIGJhdGFkdl9oYXJkaWZfYWRkX2ludGVyZmFjZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKIHsKQEAgLTY3NiwxMCArNjkyLDkgQEAKIAogCUlOSVRfTElTVF9IRUFEKCZoYXJkX2lmYWNlLT5saXN0KTsKIAlJTklUX0hMSVNUX0hFQUQoJmhhcmRfaWZhY2UtPm5laWdoX2xpc3QpOwotCUlOSVRfV09SSygmaGFyZF9pZmFjZS0+Y2xlYW51cF93b3JrLAotCQkgIGJhdGFkdl9oYXJkaWZfcmVtb3ZlX2ludGVyZmFjZV9maW5pc2gpOwogCiAJc3Bpbl9sb2NrX2luaXQoJmhhcmRfaWZhY2UtPm5laWdoX2xpc3RfbG9jayk7CisJa3JlZl9pbml0KCZoYXJkX2lmYWNlLT5yZWZjb3VudCk7CiAKIAloYXJkX2lmYWNlLT5udW1fYmNhc3RzID0gQkFUQURWX05VTV9CQ0FTVFNfREVGQVVMVDsKIAlpZiAoYmF0YWR2X2lzX3dpZmlfbmV0ZGV2KG5ldF9kZXYpKQpAQCAtNjg3LDExICs3MDIsOCBAQAogCiAJYmF0YWR2X3ZfaGFyZGlmX2luaXQoaGFyZF9pZmFjZSk7CiAKLQkvKiBleHRyYSByZWZlcmVuY2UgZm9yIHJldHVybiAqLwotCWtyZWZfaW5pdCgmaGFyZF9pZmFjZS0+cmVmY291bnQpOwotCWtyZWZfZ2V0KCZoYXJkX2lmYWNlLT5yZWZjb3VudCk7Ci0KIAliYXRhZHZfY2hlY2tfa25vd25fbWFjX2FkZHIoaGFyZF9pZmFjZS0+bmV0X2Rldik7CisJa3JlZl9nZXQoJmhhcmRfaWZhY2UtPnJlZmNvdW50KTsKIAlsaXN0X2FkZF90YWlsX3JjdSgmaGFyZF9pZmFjZS0+bGlzdCwgJmJhdGFkdl9oYXJkaWZfbGlzdCk7CiAKIAlyZXR1cm4gaGFyZF9pZmFjZTsKQEAgLTcxMywxMyArNzI1LDE1IEBACiAJLyogZmlyc3QgZGVhY3RpdmF0ZSBpbnRlcmZhY2UgKi8KIAlpZiAoaGFyZF9pZmFjZS0+aWZfc3RhdHVzICE9IEJBVEFEVl9JRl9OT1RfSU5fVVNFKQogCQliYXRhZHZfaGFyZGlmX2Rpc2FibGVfaW50ZXJmYWNlKGhhcmRfaWZhY2UsCi0JCQkJCQlCQVRBRFZfSUZfQ0xFQU5VUF9BVVRPKTsKKwkJCQkJCUJBVEFEVl9JRl9DTEVBTlVQX0tFRVApOwogCiAJaWYgKGhhcmRfaWZhY2UtPmlmX3N0YXR1cyAhPSBCQVRBRFZfSUZfTk9UX0lOX1VTRSkKIAkJcmV0dXJuOwogCiAJaGFyZF9pZmFjZS0+aWZfc3RhdHVzID0gQkFUQURWX0lGX1RPX0JFX1JFTU9WRUQ7Ci0JcXVldWVfd29yayhiYXRhZHZfZXZlbnRfd29ya3F1ZXVlLCAmaGFyZF9pZmFjZS0+Y2xlYW51cF93b3JrKTsKKwliYXRhZHZfZGVidWdmc19kZWxfaGFyZGlmKGhhcmRfaWZhY2UpOworCWJhdGFkdl9zeXNmc19kZWxfaGFyZGlmKCZoYXJkX2lmYWNlLT5oYXJkaWZfb2JqKTsKKwliYXRhZHZfaGFyZGlmX3B1dChoYXJkX2lmYWNlKTsKIH0KIAogdm9pZCBiYXRhZHZfaGFyZGlmX3JlbW92ZV9pbnRlcmZhY2VzKHZvaWQpCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9pY21wX3NvY2tldC5oIGIvbmV0L2JhdG1hbi1hZHYvaWNtcF9zb2NrZXQuaAppbmRleCA2MThkNWRlLi5lNDRhN2RhIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9pY21wX3NvY2tldC5oCisrKyBiL25ldC9iYXRtYW4tYWR2L2ljbXBfc29ja2V0LmgKQEAgLTI2LDkgKzI2LDI1IEBACiAKICNkZWZpbmUgQkFUQURWX0lDTVBfU09DS0VUICJzb2NrZXQiCiAKLXZvaWQgYmF0YWR2X3NvY2tldF9pbml0KHZvaWQpOwogaW50IGJhdGFkdl9zb2NrZXRfc2V0dXAoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdik7CisKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCisKK3ZvaWQgYmF0YWR2X3NvY2tldF9pbml0KHZvaWQpOwogdm9pZCBiYXRhZHZfc29ja2V0X3JlY2VpdmVfcGFja2V0KHN0cnVjdCBiYXRhZHZfaWNtcF9oZWFkZXIgKmljbXBoLAogCQkJCSAgc2l6ZV90IGljbXBfbGVuKTsKIAorI2Vsc2UKKworc3RhdGljIGlubGluZSB2b2lkIGJhdGFkdl9zb2NrZXRfaW5pdCh2b2lkKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2JhdGFkdl9zb2NrZXRfcmVjZWl2ZV9wYWNrZXQoc3RydWN0IGJhdGFkdl9pY21wX2hlYWRlciAqaWNtcGgsIHNpemVfdCBpY21wX2xlbikKK3sKK30KKworI2VuZGlmCisKICNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfSUNNUF9TT0NLRVRfSF8gKi8KZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L21haW4uYyBiL25ldC9iYXRtYW4tYWR2L21haW4uYwppbmRleCBmZTRjNWUyLi4yYzAxN2FiIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9tYWluLmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvbWFpbi5jCkBAIC04Miw2ICs4MiwxMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBiYXRhZHZfaW5pdCh2b2lkKQogeworCWludCByZXQ7CisKKwlyZXQgPSBiYXRhZHZfdHRfY2FjaGVfaW5pdCgpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCiAJSU5JVF9MSVNUX0hFQUQoJmJhdGFkdl9oYXJkaWZfbGlzdCk7CiAJYmF0YWR2X2FsZ29faW5pdCgpOwogCkBAIC05Myw5ICs5OSw4IEBACiAJYmF0YWR2X3RwX21ldGVyX2luaXQoKTsKIAogCWJhdGFkdl9ldmVudF93b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiYmF0X2V2ZW50cyIpOwotCiAJaWYgKCFiYXRhZHZfZXZlbnRfd29ya3F1ZXVlKQotCQlyZXR1cm4gLUVOT01FTTsKKwkJZ290byBlcnJfY3JlYXRlX3dxOwogCiAJYmF0YWR2X3NvY2tldF9pbml0KCk7CiAJYmF0YWR2X2RlYnVnZnNfaW5pdCgpOwpAQCAtMTA4LDYgKzExMywxMSBAQAogCQlCQVRBRFZfU09VUkNFX1ZFUlNJT04sIEJBVEFEVl9DT01QQVRfVkVSU0lPTik7CiAKIAlyZXR1cm4gMDsKKworZXJyX2NyZWF0ZV93cToKKwliYXRhZHZfdHRfY2FjaGVfZGVzdHJveSgpOworCisJcmV0dXJuIC1FTk9NRU07CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBiYXRhZHZfZXhpdCh2b2lkKQpAQCAtMTIzLDYgKzEzMyw4IEBACiAJYmF0YWR2X2V2ZW50X3dvcmtxdWV1ZSA9IE5VTEw7CiAKIAlyY3VfYmFycmllcigpOworCisJYmF0YWR2X3R0X2NhY2hlX2Rlc3Ryb3koKTsKIH0KIAogaW50IGJhdGFkdl9tZXNoX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2UpCkBAIC0yNzAsNiArMjgyLDcgQEAKIAlyZXR1cm4gaXNfbXlfbWFjOwogfQogCisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUwogLyoqCiAgKiBiYXRhZHZfc2VxX3ByaW50X3RleHRfcHJpbWFyeV9pZl9nZXQgLSBjYWxsZWQgZnJvbSBkZWJ1Z2ZzIHRhYmxlIHByaW50aW5nCiAgKiAgZnVuY3Rpb24gdGhhdCByZXF1aXJlcyB0aGUgcHJpbWFyeSBpbnRlcmZhY2UKQEAgLTMwNSw2ICszMTgsNyBAQAogb3V0OgogCXJldHVybiBwcmltYXJ5X2lmOwogfQorI2VuZGlmCiAKIC8qKgogICogYmF0YWR2X21heF9oZWFkZXJfbGVuIC0gY2FsY3VsYXRlIG1heGltdW0gZW5jYXBzdWxhdGlvbiBvdmVyaGVhZCBmb3IgYQpAQCAtNjM4LDMgKzY1Miw0IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oQkFUQURWX0RSSVZFUl9ERVNDKTsKIE1PRFVMRV9TVVBQT1JURURfREVWSUNFKEJBVEFEVl9EUklWRVJfREVWSUNFKTsKIE1PRFVMRV9WRVJTSU9OKEJBVEFEVl9TT1VSQ0VfVkVSU0lPTik7CitNT0RVTEVfQUxJQVNfUlROTF9MSU5LKCJiYXRhZHYiKTsKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L21haW4uaCBiL25ldC9iYXRtYW4tYWR2L21haW4uaAppbmRleCAwNmE4NjA4Li4wOWFmMjFlIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9tYWluLmgKKysrIGIvbmV0L2JhdG1hbi1hZHYvbWFpbi5oCkBAIC0yNCw3ICsyNCw3IEBACiAjZGVmaW5lIEJBVEFEVl9EUklWRVJfREVWSUNFICJiYXRtYW4tYWR2IgogCiAjaWZuZGVmIEJBVEFEVl9TT1VSQ0VfVkVSU0lPTgotI2RlZmluZSBCQVRBRFZfU09VUkNFX1ZFUlNJT04gIjIwMTYuMyIKKyNkZWZpbmUgQkFUQURWX1NPVVJDRV9WRVJTSU9OICIyMDE2LjQiCiAjZW5kaWYKIAogLyogQi5BLlQuTS5BLk4uIHBhcmFtZXRlcnMgKi8KZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L211bHRpY2FzdC5jIGIvbmV0L2JhdG1hbi1hZHYvbXVsdGljYXN0LmMKaW5kZXggY2M5MTUwNy4uMTM2NjFmNCAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvbXVsdGljYXN0LmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvbXVsdGljYXN0LmMKQEAgLTUyOCw3ICs1MjgsNyBAQAogCX0KIAogCXJldHVybiAhKG1jYXN0X2RhdGEuZmxhZ3MgJgotCQkgKEJBVEFEVl9NQ0FTVF9XQU5UX0FMTF9JUFY0ICsgQkFUQURWX01DQVNUX1dBTlRfQUxMX0lQVjYpKTsKKwkJIChCQVRBRFZfTUNBU1RfV0FOVF9BTExfSVBWNCB8IEJBVEFEVl9NQ0FTVF9XQU5UX0FMTF9JUFY2KSk7CiB9CiAKIC8qKgpAQCAtMTEzNCw2ICsxMTM0LDcgQEAKIAkJCQkgICAgIEJBVEFEVl9UVkxWX0hBTkRMRVJfT0dNX0NJRk5PVEZORCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCiAvKioKICAqIGJhdGFkdl9tY2FzdF9mbGFnc19wcmludF9oZWFkZXIgLSBwcmludCBvd24gbWNhc3QgZmxhZ3MgdG8gZGVidWdmcyB0YWJsZQogICogQGJhdF9wcml2OiB0aGUgYmF0IHByaXYgd2l0aCBhbGwgdGhlIHNvZnQgaW50ZXJmYWNlIGluZm9ybWF0aW9uCkBAIC0xMjM0LDYgKzEyMzUsNyBAQAogCiAJcmV0dXJuIDA7CiB9CisjZW5kaWYKIAogLyoqCiAgKiBiYXRhZHZfbWNhc3RfZnJlZSAtIGZyZWUgdGhlIG11bHRpY2FzdCBvcHRpbWl6YXRpb25zIHN0cnVjdHVyZXMKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L25ldGxpbmsuYyBiL25ldC9iYXRtYW4tYWR2L25ldGxpbmsuYwppbmRleCAyMzFmOGVhLi42NGNiNmFjIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9uZXRsaW5rLmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvbmV0bGluay5jCkBAIC0xOCw2ICsxOCw4IEBACiAjaW5jbHVkZSAibmV0bGluay5oIgogI2luY2x1ZGUgIm1haW4uaCIKIAorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9nZW5lcmljLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2dlbmV0bGluay5oPgpAQCAtMjYsMjQgKzI4LDMzIEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bmV0L2dlbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDx1YXBpL2xpbnV4L2JhdG1hbl9hZHYuaD4KIAorI2luY2x1ZGUgImJhdF9hbGdvLmgiCisjaW5jbHVkZSAiYnJpZGdlX2xvb3BfYXZvaWRhbmNlLmgiCisjaW5jbHVkZSAiZ2F0ZXdheV9jbGllbnQuaCIKICNpbmNsdWRlICJoYXJkLWludGVyZmFjZS5oIgorI2luY2x1ZGUgIm9yaWdpbmF0b3IuaCIKKyNpbmNsdWRlICJwYWNrZXQuaCIKICNpbmNsdWRlICJzb2Z0LWludGVyZmFjZS5oIgogI2luY2x1ZGUgInRwX21ldGVyLmgiCisjaW5jbHVkZSAidHJhbnNsYXRpb24tdGFibGUuaCIKIAotc3RydWN0IHNrX2J1ZmY7Ci0KLXN0YXRpYyBzdHJ1Y3QgZ2VubF9mYW1pbHkgYmF0YWR2X25ldGxpbmtfZmFtaWx5ID0geworc3RydWN0IGdlbmxfZmFtaWx5IGJhdGFkdl9uZXRsaW5rX2ZhbWlseSA9IHsKIAkuaWQgPSBHRU5MX0lEX0dFTkVSQVRFLAogCS5oZHJzaXplID0gMCwKIAkubmFtZSA9IEJBVEFEVl9OTF9OQU1FLAogCS52ZXJzaW9uID0gMSwKIAkubWF4YXR0ciA9IEJBVEFEVl9BVFRSX01BWCwKKwkubmV0bnNvayA9IHRydWUsCiB9OwogCiAvKiBtdWx0aWNhc3QgZ3JvdXBzICovCkBAIC01MSwxMSArNjIsMTEgQEAKIAlCQVRBRFZfTkxfTUNHUlBfVFBNRVRFUiwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZ2VubF9tdWx0aWNhc3RfZ3JvdXAgYmF0YWR2X25ldGxpbmtfbWNncnBzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdlbmxfbXVsdGljYXN0X2dyb3VwIGJhdGFkdl9uZXRsaW5rX21jZ3Jwc1tdID0gewogCVtCQVRBRFZfTkxfTUNHUlBfVFBNRVRFUl0gPSB7IC5uYW1lID0gQkFUQURWX05MX01DQVNUX0dST1VQX1RQTUVURVIgfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbmxhX3BvbGljeSBiYXRhZHZfbmV0bGlua19wb2xpY3lbTlVNX0JBVEFEVl9BVFRSXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBiYXRhZHZfbmV0bGlua19wb2xpY3lbTlVNX0JBVEFEVl9BVFRSXSA9IHsKIAlbQkFUQURWX0FUVFJfVkVSU0lPTl0JCT0geyAudHlwZSA9IE5MQV9TVFJJTkcgfSwKIAlbQkFUQURWX0FUVFJfQUxHT19OQU1FXQkJPSB7IC50eXBlID0gTkxBX1NUUklORyB9LAogCVtCQVRBRFZfQVRUUl9NRVNIX0lGSU5ERVhdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKQEAgLTY5LDkgKzgwLDQ0IEBACiAJW0JBVEFEVl9BVFRSX1RQTUVURVJfVEVTVF9USU1FXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiAJW0JBVEFEVl9BVFRSX1RQTUVURVJfQllURVNdCT0geyAudHlwZSA9IE5MQV9VNjQgfSwKIAlbQkFUQURWX0FUVFJfVFBNRVRFUl9DT09LSUVdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbQkFUQURWX0FUVFJfQUNUSVZFXQkJPSB7IC50eXBlID0gTkxBX0ZMQUcgfSwKKwlbQkFUQURWX0FUVFJfVFRfQUREUkVTU10JPSB7IC5sZW4gPSBFVEhfQUxFTiB9LAorCVtCQVRBRFZfQVRUUl9UVF9UVFZOXQkJPSB7IC50eXBlID0gTkxBX1U4IH0sCisJW0JBVEFEVl9BVFRSX1RUX0xBU1RfVFRWTl0JPSB7IC50eXBlID0gTkxBX1U4IH0sCisJW0JBVEFEVl9BVFRSX1RUX0NSQzMyXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtCQVRBRFZfQVRUUl9UVF9WSURdCQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCisJW0JBVEFEVl9BVFRSX1RUX0ZMQUdTXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtCQVRBRFZfQVRUUl9GTEFHX0JFU1RdCQk9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAorCVtCQVRBRFZfQVRUUl9MQVNUX1NFRU5fTVNFQ1NdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbQkFUQURWX0FUVFJfTkVJR0hfQUREUkVTU10JPSB7IC5sZW4gPSBFVEhfQUxFTiB9LAorCVtCQVRBRFZfQVRUUl9UUV0JCT0geyAudHlwZSA9IE5MQV9VOCB9LAorCVtCQVRBRFZfQVRUUl9USFJPVUdIUFVUXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW0JBVEFEVl9BVFRSX0JBTkRXSURUSF9VUF0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtCQVRBRFZfQVRUUl9CQU5EV0lEVEhfRE9XTl0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtCQVRBRFZfQVRUUl9ST1VURVJdCQk9IHsgLmxlbiA9IEVUSF9BTEVOIH0sCisJW0JBVEFEVl9BVFRSX0JMQV9PV05dCQk9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAorCVtCQVRBRFZfQVRUUl9CTEFfQUREUkVTU10JPSB7IC5sZW4gPSBFVEhfQUxFTiB9LAorCVtCQVRBRFZfQVRUUl9CTEFfVklEXQkJPSB7IC50eXBlID0gTkxBX1UxNiB9LAorCVtCQVRBRFZfQVRUUl9CTEFfQkFDS0JPTkVdCT0geyAubGVuID0gRVRIX0FMRU4gfSwKKwlbQkFUQURWX0FUVFJfQkxBX0NSQ10JCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKIH07CiAKIC8qKgorICogYmF0YWR2X25ldGxpbmtfZ2V0X2lmaW5kZXggLSBFeHRyYWN0IGFuIGludGVyZmFjZSBpbmRleCBmcm9tIGEgbWVzc2FnZQorICogQG5saDogTWVzc2FnZSBoZWFkZXIKKyAqIEBhdHRydHlwZTogQXR0cmlidXRlIHdoaWNoIGhvbGRzIGFuIGludGVyZmFjZSBpbmRleAorICoKKyAqIFJldHVybjogaW50ZXJmYWNlIGluZGV4LCBvciAwLgorICovCitpbnQKK2JhdGFkdl9uZXRsaW5rX2dldF9pZmluZGV4KGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoLCBpbnQgYXR0cnR5cGUpCit7CisJc3RydWN0IG5sYXR0ciAqYXR0ciA9IG5sbXNnX2ZpbmRfYXR0cihubGgsIEdFTkxfSERSTEVOLCBhdHRydHlwZSk7CisKKwlyZXR1cm4gYXR0ciA/IG5sYV9nZXRfdTMyKGF0dHIpIDogMDsKK30KKworLyoqCiAgKiBiYXRhZHZfbmV0bGlua19tZXNoX2luZm9fcHV0IC0gZmlsbCBpbiBnZW5lcmljIGluZm9ybWF0aW9uIGFib3V0IG1lc2gKICAqICBpbnRlcmZhY2UKICAqIEBtc2c6IG5ldGxpbmsgbWVzc2FnZSB0byBiZSBzZW50IGJhY2sKQEAgLTkzLDkgKzEzOSwxNyBAQAogCSAgICBubGFfcHV0X3UzMihtc2csIEJBVEFEVl9BVFRSX01FU0hfSUZJTkRFWCwgc29mdF9pZmFjZS0+aWZpbmRleCkgfHwKIAkgICAgbmxhX3B1dF9zdHJpbmcobXNnLCBCQVRBRFZfQVRUUl9NRVNIX0lGTkFNRSwgc29mdF9pZmFjZS0+bmFtZSkgfHwKIAkgICAgbmxhX3B1dChtc2csIEJBVEFEVl9BVFRSX01FU0hfQUREUkVTUywgRVRIX0FMRU4sCi0JCSAgICBzb2Z0X2lmYWNlLT5kZXZfYWRkcikpCisJCSAgICBzb2Z0X2lmYWNlLT5kZXZfYWRkcikgfHwKKwkgICAgbmxhX3B1dF91OChtc2csIEJBVEFEVl9BVFRSX1RUX1RUVk4sCisJCSAgICAgICAodTgpYXRvbWljX3JlYWQoJmJhdF9wcml2LT50dC52bikpKQogCQlnb3RvIG91dDsKIAorI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0JMQQorCWlmIChubGFfcHV0X3UxNihtc2csIEJBVEFEVl9BVFRSX0JMQV9DUkMsCisJCQludG9ocyhiYXRfcHJpdi0+YmxhLmNsYWltX2Rlc3QuZ3JvdXApKSkKKwkJZ290byBvdXQ7CisjZW5kaWYKKwogCXByaW1hcnlfaWYgPSBiYXRhZHZfcHJpbWFyeV9pZl9nZXRfc2VsZWN0ZWQoYmF0X3ByaXYpOwogCWlmIChwcmltYXJ5X2lmICYmIHByaW1hcnlfaWYtPmlmX3N0YXR1cyA9PSBCQVRBRFZfSUZfQUNUSVZFKSB7CiAJCWhhcmRfaWZhY2UgPSBwcmltYXJ5X2lmLT5uZXRfZGV2OwpAQCAtMzgwLDYgKzQzNCwxMDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKioKKyAqIGJhdGFkdl9uZXRsaW5rX2R1bXBfaGFyZGlmX2VudHJ5IC0gRHVtcCBvbmUgaGFyZCBpbnRlcmZhY2UgaW50byBhIG1lc3NhZ2UKKyAqIEBtc2c6IE5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBwb3J0aWQ6IFBvcnQgbWFraW5nIG5ldGxpbmsgcmVxdWVzdAorICogQHNlcTogU2VxdWVuY2UgbnVtYmVyIG9mIG5ldGxpbmsgbWVzc2FnZQorICogQGhhcmRfaWZhY2U6IEhhcmQgaW50ZXJmYWNlIHRvIGR1bXAKKyAqCisgKiBSZXR1cm46IGVycm9yIGNvZGUsIG9yIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50CitiYXRhZHZfbmV0bGlua19kdW1wX2hhcmRpZl9lbnRyeShzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCB1MzIgcG9ydGlkLCB1MzIgc2VxLAorCQkJCSBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmhhcmRfaWZhY2UpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBoYXJkX2lmYWNlLT5uZXRfZGV2OworCXZvaWQgKmhkcjsKKworCWhkciA9IGdlbmxtc2dfcHV0KG1zZywgcG9ydGlkLCBzZXEsICZiYXRhZHZfbmV0bGlua19mYW1pbHksIE5MTV9GX01VTFRJLAorCQkJICBCQVRBRFZfQ01EX0dFVF9IQVJESUZTKTsKKwlpZiAoIWhkcikKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCWlmIChubGFfcHV0X3UzMihtc2csIEJBVEFEVl9BVFRSX0hBUkRfSUZJTkRFWCwKKwkJCW5ldF9kZXYtPmlmaW5kZXgpIHx8CisJICAgIG5sYV9wdXRfc3RyaW5nKG1zZywgQkFUQURWX0FUVFJfSEFSRF9JRk5BTUUsCisJCQkgICBuZXRfZGV2LT5uYW1lKSB8fAorCSAgICBubGFfcHV0KG1zZywgQkFUQURWX0FUVFJfSEFSRF9BRERSRVNTLCBFVEhfQUxFTiwKKwkJICAgIG5ldF9kZXYtPmRldl9hZGRyKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlpZiAoaGFyZF9pZmFjZS0+aWZfc3RhdHVzID09IEJBVEFEVl9JRl9BQ1RJVkUpIHsKKwkJaWYgKG5sYV9wdXRfZmxhZyhtc2csIEJBVEFEVl9BVFRSX0FDVElWRSkpCisJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwl9CisKKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CisJcmV0dXJuIDA7CisKKyBubGFfcHV0X2ZhaWx1cmU6CisJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworCXJldHVybiAtRU1TR1NJWkU7Cit9CisKKy8qKgorICogYmF0YWR2X25ldGxpbmtfZHVtcF9oYXJkaWZzIC0gRHVtcCBhbGwgaGFyZCBpbnRlcmZhY2UgaW50byBhIG1lc3NhZ2VzCisgKiBAbXNnOiBOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAY2I6IFBhcmFtZXRlcnMgZnJvbSBxdWVyeQorICoKKyAqIFJldHVybjogZXJyb3IgY29kZSwgb3IgbGVuZ3RoIG9mIHJlcGx5IG1lc3NhZ2Ugb24gc3VjY2VzcworICovCitzdGF0aWMgaW50CitiYXRhZHZfbmV0bGlua19kdW1wX2hhcmRpZnMoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KGNiLT5za2ItPnNrKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZTsKKwlzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmhhcmRfaWZhY2U7CisJaW50IGlmaW5kZXg7CisJaW50IHBvcnRpZCA9IE5FVExJTktfQ0IoY2ItPnNrYikucG9ydGlkOworCWludCBzZXEgPSBjYi0+bmxoLT5ubG1zZ19zZXE7CisJaW50IHNraXAgPSBjYi0+YXJnc1swXTsKKwlpbnQgaSA9IDA7CisKKwlpZmluZGV4ID0gYmF0YWR2X25ldGxpbmtfZ2V0X2lmaW5kZXgoY2ItPm5saCwKKwkJCQkJICAgICBCQVRBRFZfQVRUUl9NRVNIX0lGSU5ERVgpOworCWlmICghaWZpbmRleCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzb2Z0X2lmYWNlID0gZGV2X2dldF9ieV9pbmRleChuZXQsIGlmaW5kZXgpOworCWlmICghc29mdF9pZmFjZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIWJhdGFkdl9zb2Z0aWZfaXNfdmFsaWQoc29mdF9pZmFjZSkpIHsKKwkJZGV2X3B1dChzb2Z0X2lmYWNlKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmN1X3JlYWRfbG9jaygpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaGFyZF9pZmFjZSwgJmJhdGFkdl9oYXJkaWZfbGlzdCwgbGlzdCkgeworCQlpZiAoaGFyZF9pZmFjZS0+c29mdF9pZmFjZSAhPSBzb2Z0X2lmYWNlKQorCQkJY29udGludWU7CisKKwkJaWYgKGkrKyA8IHNraXApCisJCQljb250aW51ZTsKKworCQlpZiAoYmF0YWR2X25ldGxpbmtfZHVtcF9oYXJkaWZfZW50cnkobXNnLCBwb3J0aWQsIHNlcSwKKwkJCQkJCSAgICAgaGFyZF9pZmFjZSkpIHsKKwkJCWktLTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlkZXZfcHV0KHNvZnRfaWZhY2UpOworCisJY2ItPmFyZ3NbMF0gPSBpOworCisJcmV0dXJuIG1zZy0+bGVuOworfQorCiBzdGF0aWMgc3RydWN0IGdlbmxfb3BzIGJhdGFkdl9uZXRsaW5rX29wc1tdID0gewogCXsKIAkJLmNtZCA9IEJBVEFEVl9DTURfR0VUX01FU0hfSU5GTywKQEAgLTM5OSw2ICs1NTMsNjEgQEAKIAkJLnBvbGljeSA9IGJhdGFkdl9uZXRsaW5rX3BvbGljeSwKIAkJLmRvaXQgPSBiYXRhZHZfbmV0bGlua190cF9tZXRlcl9jYW5jZWwsCiAJfSwKKwl7CisJCS5jbWQgPSBCQVRBRFZfQ01EX0dFVF9ST1VUSU5HX0FMR09TLAorCQkuZmxhZ3MgPSBHRU5MX0FETUlOX1BFUk0sCisJCS5wb2xpY3kgPSBiYXRhZHZfbmV0bGlua19wb2xpY3ksCisJCS5kdW1waXQgPSBiYXRhZHZfYWxnb19kdW1wLAorCX0sCisJeworCQkuY21kID0gQkFUQURWX0NNRF9HRVRfSEFSRElGUywKKwkJLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLAorCQkucG9saWN5ID0gYmF0YWR2X25ldGxpbmtfcG9saWN5LAorCQkuZHVtcGl0ID0gYmF0YWR2X25ldGxpbmtfZHVtcF9oYXJkaWZzLAorCX0sCisJeworCQkuY21kID0gQkFUQURWX0NNRF9HRVRfVFJBTlNUQUJMRV9MT0NBTCwKKwkJLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLAorCQkucG9saWN5ID0gYmF0YWR2X25ldGxpbmtfcG9saWN5LAorCQkuZHVtcGl0ID0gYmF0YWR2X3R0X2xvY2FsX2R1bXAsCisJfSwKKwl7CisJCS5jbWQgPSBCQVRBRFZfQ01EX0dFVF9UUkFOU1RBQkxFX0dMT0JBTCwKKwkJLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLAorCQkucG9saWN5ID0gYmF0YWR2X25ldGxpbmtfcG9saWN5LAorCQkuZHVtcGl0ID0gYmF0YWR2X3R0X2dsb2JhbF9kdW1wLAorCX0sCisJeworCQkuY21kID0gQkFUQURWX0NNRF9HRVRfT1JJR0lOQVRPUlMsCisJCS5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwKKwkJLnBvbGljeSA9IGJhdGFkdl9uZXRsaW5rX3BvbGljeSwKKwkJLmR1bXBpdCA9IGJhdGFkdl9vcmlnX2R1bXAsCisJfSwKKwl7CisJCS5jbWQgPSBCQVRBRFZfQ01EX0dFVF9ORUlHSEJPUlMsCisJCS5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwKKwkJLnBvbGljeSA9IGJhdGFkdl9uZXRsaW5rX3BvbGljeSwKKwkJLmR1bXBpdCA9IGJhdGFkdl9oYXJkaWZfbmVpZ2hfZHVtcCwKKwl9LAorCXsKKwkJLmNtZCA9IEJBVEFEVl9DTURfR0VUX0dBVEVXQVlTLAorCQkuZmxhZ3MgPSBHRU5MX0FETUlOX1BFUk0sCisJCS5wb2xpY3kgPSBiYXRhZHZfbmV0bGlua19wb2xpY3ksCisJCS5kdW1waXQgPSBiYXRhZHZfZ3dfZHVtcCwKKwl9LAorCXsKKwkJLmNtZCA9IEJBVEFEVl9DTURfR0VUX0JMQV9DTEFJTSwKKwkJLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLAorCQkucG9saWN5ID0gYmF0YWR2X25ldGxpbmtfcG9saWN5LAorCQkuZHVtcGl0ID0gYmF0YWR2X2JsYV9jbGFpbV9kdW1wLAorCX0sCisJeworCQkuY21kID0gQkFUQURWX0NNRF9HRVRfQkxBX0JBQ0tCT05FLAorCQkuZmxhZ3MgPSBHRU5MX0FETUlOX1BFUk0sCisJCS5wb2xpY3kgPSBiYXRhZHZfbmV0bGlua19wb2xpY3ksCisJCS5kdW1waXQgPSBiYXRhZHZfYmxhX2JhY2tib25lX2R1bXAsCisJfSwKKwogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9uZXRsaW5rLmggYi9uZXQvYmF0bWFuLWFkdi9uZXRsaW5rLmgKaW5kZXggOTQ1NjUzYS4uNTJlYjE2MiAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvbmV0bGluay5oCisrKyBiL25ldC9iYXRtYW4tYWR2L25ldGxpbmsuaApAQCAtMjEsMTIgKzIxLDE4IEBACiAjaW5jbHVkZSAibWFpbi5oIgogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CisKK3N0cnVjdCBubG1zZ2hkcjsKIAogdm9pZCBiYXRhZHZfbmV0bGlua19yZWdpc3Rlcih2b2lkKTsKIHZvaWQgYmF0YWR2X25ldGxpbmtfdW5yZWdpc3Rlcih2b2lkKTsKK2ludCBiYXRhZHZfbmV0bGlua19nZXRfaWZpbmRleChjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgaW50IGF0dHJ0eXBlKTsKIAogaW50IGJhdGFkdl9uZXRsaW5rX3RwbWV0ZXJfbm90aWZ5KHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsIGNvbnN0IHU4ICpkc3QsCiAJCQkJICB1OCByZXN1bHQsIHUzMiB0ZXN0X3RpbWUsIHU2NCB0b3RhbF9ieXRlcywKIAkJCQkgIHUzMiBjb29raWUpOwogCitleHRlcm4gc3RydWN0IGdlbmxfZmFtaWx5IGJhdGFkdl9uZXRsaW5rX2ZhbWlseTsKKwogI2VuZGlmIC8qIF9ORVRfQkFUTUFOX0FEVl9ORVRMSU5LX0hfICovCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9uZXR3b3JrLWNvZGluZy5jIGIvbmV0L2JhdG1hbi1hZHYvbmV0d29yay1jb2RpbmcuYwppbmRleCAyOTNlZjRmLi5lM2JhZjY5IDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9uZXR3b3JrLWNvZGluZy5jCisrKyBiL25ldC9iYXRtYW4tYWR2L25ldHdvcmstY29kaW5nLmMKQEAgLTg1NiwxNCArODU2LDEyIEBACiAJaWYgKCFuY19ub2RlKQogCQlyZXR1cm4gTlVMTDsKIAotCWtyZWZfZ2V0KCZvcmlnX25laWdoX25vZGUtPnJlZmNvdW50KTsKLQogCS8qIEluaXRpYWxpemUgbmNfbm9kZSAqLwogCUlOSVRfTElTVF9IRUFEKCZuY19ub2RlLT5saXN0KTsKLQlldGhlcl9hZGRyX2NvcHkobmNfbm9kZS0+YWRkciwgb3JpZ19ub2RlLT5vcmlnKTsKLQluY19ub2RlLT5vcmlnX25vZGUgPSBvcmlnX25laWdoX25vZGU7CiAJa3JlZl9pbml0KCZuY19ub2RlLT5yZWZjb3VudCk7Ci0Ja3JlZl9nZXQoJm5jX25vZGUtPnJlZmNvdW50KTsKKwlldGhlcl9hZGRyX2NvcHkobmNfbm9kZS0+YWRkciwgb3JpZ19ub2RlLT5vcmlnKTsKKwlrcmVmX2dldCgmb3JpZ19uZWlnaF9ub2RlLT5yZWZjb3VudCk7CisJbmNfbm9kZS0+b3JpZ19ub2RlID0gb3JpZ19uZWlnaF9ub2RlOwogCiAJLyogU2VsZWN0IGluZ29pbmcgb3Igb3V0Z29pbmcgY29kaW5nIG5vZGUgKi8KIAlpZiAoaW5fY29kaW5nKSB7CkBAIC04NzksNiArODc3LDcgQEAKIAogCS8qIEFkZCBuY19ub2RlIHRvIG9yaWdfbm9kZSAqLwogCXNwaW5fbG9ja19iaChsb2NrKTsKKwlrcmVmX2dldCgmbmNfbm9kZS0+cmVmY291bnQpOwogCWxpc3RfYWRkX3RhaWxfcmN1KCZuY19ub2RlLT5saXN0LCBsaXN0KTsKIAlzcGluX3VubG9ja19iaChsb2NrKTsKIApAQCAtOTc5LDcgKzk3OCw2IEBACiAJSU5JVF9MSVNUX0hFQUQoJm5jX3BhdGgtPnBhY2tldF9saXN0KTsKIAlzcGluX2xvY2tfaW5pdCgmbmNfcGF0aC0+cGFja2V0X2xpc3RfbG9jayk7CiAJa3JlZl9pbml0KCZuY19wYXRoLT5yZWZjb3VudCk7Ci0Ja3JlZl9nZXQoJm5jX3BhdGgtPnJlZmNvdW50KTsKIAluY19wYXRoLT5sYXN0X3ZhbGlkID0gamlmZmllczsKIAlldGhlcl9hZGRyX2NvcHkobmNfcGF0aC0+bmV4dF9ob3AsIGRzdCk7CiAJZXRoZXJfYWRkcl9jb3B5KG5jX3BhdGgtPnByZXZfaG9wLCBzcmMpOwpAQCAtOTg5LDYgKzk4Nyw3IEBACiAJCSAgIG5jX3BhdGgtPm5leHRfaG9wKTsKIAogCS8qIEFkZCBuY19wYXRoIHRvIGhhc2ggdGFibGUgKi8KKwlrcmVmX2dldCgmbmNfcGF0aC0+cmVmY291bnQpOwogCWhhc2hfYWRkZWQgPSBiYXRhZHZfaGFzaF9hZGQoaGFzaCwgYmF0YWR2X25jX2hhc2hfY29tcGFyZSwKIAkJCQkgICAgIGJhdGFkdl9uY19oYXNoX2Nob29zZSwgJm5jX3BhdGhfa2V5LAogCQkJCSAgICAgJm5jX3BhdGgtPmhhc2hfZW50cnkpOwpAQCAtMTg4Miw2ICsxODgxLDcgQEAKIAliYXRhZHZfaGFzaF9kZXN0cm95KGJhdF9wcml2LT5uYy5kZWNvZGluZ19oYXNoKTsKIH0KIAorI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKIC8qKgogICogYmF0YWR2X25jX25vZGVzX3NlcV9wcmludF90ZXh0IC0gcHJpbnQgdGhlIG5jIG5vZGUgaW5mb3JtYXRpb24KICAqIEBzZXE6IHNlcSBmaWxlIHRvIHByaW50IG9uCkBAIC0xOTgxLDMgKzE5ODEsNCBAQAogb3V0OgogCXJldHVybiAtRU5PTUVNOwogfQorI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmMgYi9uZXQvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmMKaW5kZXggMzk0MGI1ZC4uNWYzYmZjNCAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvb3JpZ2luYXRvci5jCisrKyBiL25ldC9iYXRtYW4tYWR2L29yaWdpbmF0b3IuYwpAQCAtMjgsMTEgKzI4LDE1IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkZXAuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L2JhdG1hbl9hZHYuaD4KIAogI2luY2x1ZGUgImJhdF9hbGdvLmgiCiAjaW5jbHVkZSAiZGlzdHJpYnV0ZWQtYXJwLXRhYmxlLmgiCkBAIC00Miw4ICs0NiwxMCBAQAogI2luY2x1ZGUgImhhc2guaCIKICNpbmNsdWRlICJsb2cuaCIKICNpbmNsdWRlICJtdWx0aWNhc3QuaCIKKyNpbmNsdWRlICJuZXRsaW5rLmgiCiAjaW5jbHVkZSAibmV0d29yay1jb2RpbmcuaCIKICNpbmNsdWRlICJyb3V0aW5nLmgiCisjaW5jbHVkZSAic29mdC1pbnRlcmZhY2UuaCIKICNpbmNsdWRlICJ0cmFuc2xhdGlvbi10YWJsZS5oIgogCiAvKiBoYXNoIGNsYXNzIGtleXMgKi8KQEAgLTEyNyw5ICsxMzMsOSBAQAogCQlnb3RvIG91dDsKIAogCWtyZWZfaW5pdCgmdmxhbi0+cmVmY291bnQpOwotCWtyZWZfZ2V0KCZ2bGFuLT5yZWZjb3VudCk7CiAJdmxhbi0+dmlkID0gdmlkOwogCisJa3JlZl9nZXQoJnZsYW4tPnJlZmNvdW50KTsKIAlobGlzdF9hZGRfaGVhZF9yY3UoJnZsYW4tPmxpc3QsICZvcmlnX25vZGUtPnZsYW5fbGlzdCk7CiAKIG91dDoKQEAgLTM4MCw2ICszODYsNyBAQAogCW9yaWdfaWZpbmZvLT5pZl9vdXRnb2luZyA9IGlmX291dGdvaW5nOwogCUlOSVRfSExJU1RfTk9ERSgmb3JpZ19pZmluZm8tPmxpc3QpOwogCWtyZWZfaW5pdCgmb3JpZ19pZmluZm8tPnJlZmNvdW50KTsKKwogCWtyZWZfZ2V0KCZvcmlnX2lmaW5mby0+cmVmY291bnQpOwogCWhsaXN0X2FkZF9oZWFkX3JjdSgmb3JpZ19pZmluZm8tPmxpc3QsCiAJCQkgICAmb3JpZ19ub2RlLT5pZmluZm9fbGlzdCk7CkBAIC00NTMsOSArNDYwLDkgQEAKIAogCUlOSVRfSExJU1RfTk9ERSgmbmVpZ2hfaWZpbmZvLT5saXN0KTsKIAlrcmVmX2luaXQoJm5laWdoX2lmaW5mby0+cmVmY291bnQpOwotCWtyZWZfZ2V0KCZuZWlnaF9pZmluZm8tPnJlZmNvdW50KTsKIAluZWlnaF9pZmluZm8tPmlmX291dGdvaW5nID0gaWZfb3V0Z29pbmc7CiAKKwlrcmVmX2dldCgmbmVpZ2hfaWZpbmZvLT5yZWZjb3VudCk7CiAJaGxpc3RfYWRkX2hlYWRfcmN1KCZuZWlnaF9pZmluZm8tPmxpc3QsICZuZWlnaC0+aWZpbmZvX2xpc3QpOwogCiBvdXQ6CkBAIC02NDcsOCArNjU0LDggQEAKIAogCS8qIGV4dHJhIHJlZmVyZW5jZSBmb3IgcmV0dXJuICovCiAJa3JlZl9pbml0KCZuZWlnaF9ub2RlLT5yZWZjb3VudCk7Ci0Ja3JlZl9nZXQoJm5laWdoX25vZGUtPnJlZmNvdW50KTsKIAorCWtyZWZfZ2V0KCZuZWlnaF9ub2RlLT5yZWZjb3VudCk7CiAJaGxpc3RfYWRkX2hlYWRfcmN1KCZuZWlnaF9ub2RlLT5saXN0LCAmb3JpZ19ub2RlLT5uZWlnaF9saXN0KTsKIAogCWJhdGFkdl9kYmcoQkFUQURWX0RCR19CQVRNQU4sIG9yaWdfbm9kZS0+YmF0X3ByaXYsCkBAIC02ODYsNiArNjkzLDcgQEAKIAlyZXR1cm4gYmF0YWR2X25laWdoX25vZGVfY3JlYXRlKG9yaWdfbm9kZSwgaGFyZF9pZmFjZSwgbmVpZ2hfYWRkcik7CiB9CiAKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCiAvKioKICAqIGJhdGFkdl9oYXJkaWZfbmVpZ2hfc2VxX3ByaW50X3RleHQgLSBwcmludCB0aGUgc2luZ2xlIGhvcCBuZWlnaGJvdXIgbGlzdAogICogQHNlcTogbmVpZ2hib3VyIHRhYmxlIHNlcV9maWxlIHN0cnVjdApAQCAtNzE5LDYgKzcyNyw4NCBAQAogCWJhdF9wcml2LT5hbGdvX29wcy0+bmVpZ2gucHJpbnQoYmF0X3ByaXYsIHNlcSk7CiAJcmV0dXJuIDA7CiB9CisjZW5kaWYKKworLyoqCisgKiBiYXRhZHZfaGFyZGlmX25laWdoX2R1bXAgLSBEdW1wIHRvIG5ldGxpbmsgdGhlIG5laWdoYm9yIGluZm9zIGZvciBhIHNwZWNpZmljCisgKiAgb3V0Z29pbmcgaW50ZXJmYWNlCisgKiBAbXNnOiBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQGNiOiBwYXJhbWV0ZXJzIGZvciB0aGUgZHVtcAorICoKKyAqIFJldHVybjogMCBvciBlcnJvciB2YWx1ZQorICovCitpbnQgYmF0YWR2X2hhcmRpZl9uZWlnaF9kdW1wKHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChjYi0+c2tiLT5zayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2U7CisJc3RydWN0IG5ldF9kZXZpY2UgKmhhcmRfaWZhY2UgPSBOVUxMOworCXN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaGFyZGlmID0gQkFUQURWX0lGX0RFRkFVTFQ7CisJc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdjsKKwlzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKnByaW1hcnlfaWYgPSBOVUxMOworCWludCByZXQ7CisJaW50IGlmaW5kZXgsIGhhcmRfaWZpbmRleDsKKworCWlmaW5kZXggPSBiYXRhZHZfbmV0bGlua19nZXRfaWZpbmRleChjYi0+bmxoLCBCQVRBRFZfQVRUUl9NRVNIX0lGSU5ERVgpOworCWlmICghaWZpbmRleCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzb2Z0X2lmYWNlID0gZGV2X2dldF9ieV9pbmRleChuZXQsIGlmaW5kZXgpOworCWlmICghc29mdF9pZmFjZSB8fCAhYmF0YWR2X3NvZnRpZl9pc192YWxpZChzb2Z0X2lmYWNlKSkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwliYXRfcHJpdiA9IG5ldGRldl9wcml2KHNvZnRfaWZhY2UpOworCisJcHJpbWFyeV9pZiA9IGJhdGFkdl9wcmltYXJ5X2lmX2dldF9zZWxlY3RlZChiYXRfcHJpdik7CisJaWYgKCFwcmltYXJ5X2lmIHx8IHByaW1hcnlfaWYtPmlmX3N0YXR1cyAhPSBCQVRBRFZfSUZfQUNUSVZFKSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0OworCX0KKworCWhhcmRfaWZpbmRleCA9IGJhdGFkdl9uZXRsaW5rX2dldF9pZmluZGV4KGNiLT5ubGgsCisJCQkJCQkgIEJBVEFEVl9BVFRSX0hBUkRfSUZJTkRFWCk7CisJaWYgKGhhcmRfaWZpbmRleCkgeworCQloYXJkX2lmYWNlID0gZGV2X2dldF9ieV9pbmRleChuZXQsIGhhcmRfaWZpbmRleCk7CisJCWlmIChoYXJkX2lmYWNlKQorCQkJaGFyZGlmID0gYmF0YWR2X2hhcmRpZl9nZXRfYnlfbmV0ZGV2KGhhcmRfaWZhY2UpOworCisJCWlmICghaGFyZGlmKSB7CisJCQlyZXQgPSAtRU5PREVWOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoaGFyZGlmLT5zb2Z0X2lmYWNlICE9IHNvZnRfaWZhY2UpIHsKKwkJCXJldCA9IC1FTk9FTlQ7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmICghYmF0X3ByaXYtPmFsZ29fb3BzLT5uZWlnaC5kdW1wKSB7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCQlnb3RvIG91dDsKKwl9CisKKwliYXRfcHJpdi0+YWxnb19vcHMtPm5laWdoLmR1bXAobXNnLCBjYiwgYmF0X3ByaXYsIGhhcmRpZik7CisKKwlyZXQgPSBtc2ctPmxlbjsKKworIG91dDoKKwlpZiAoaGFyZGlmKQorCQliYXRhZHZfaGFyZGlmX3B1dChoYXJkaWYpOworCWlmIChoYXJkX2lmYWNlKQorCQlkZXZfcHV0KGhhcmRfaWZhY2UpOworCWlmIChwcmltYXJ5X2lmKQorCQliYXRhZHZfaGFyZGlmX3B1dChwcmltYXJ5X2lmKTsKKwlpZiAoc29mdF9pZmFjZSkKKwkJZGV2X3B1dChzb2Z0X2lmYWNlKTsKKworCXJldHVybiByZXQ7Cit9CiAKIC8qKgogICogYmF0YWR2X29yaWdfaWZpbmZvX3JlbGVhc2UgLSByZWxlYXNlIG9yaWdfaWZpbmZvIGZyb20gbGlzdHMgYW5kIHF1ZXVlIGZvcgpAQCAtOTA1LDcgKzk5MSw2IEBACiAKIAkvKiBleHRyYSByZWZlcmVuY2UgZm9yIHJldHVybiAqLwogCWtyZWZfaW5pdCgmb3JpZ19ub2RlLT5yZWZjb3VudCk7Ci0Ja3JlZl9nZXQoJm9yaWdfbm9kZS0+cmVmY291bnQpOwogCiAJb3JpZ19ub2RlLT5iYXRfcHJpdiA9IGJhdF9wcml2OwogCWV0aGVyX2FkZHJfY29weShvcmlnX25vZGUtPm9yaWcsIGFkZHIpOwpAQCAtMTI1Niw2ICsxMzQxLDcgQEAKIAlfYmF0YWR2X3B1cmdlX29yaWcoYmF0X3ByaXYpOwogfQogCisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUwogaW50IGJhdGFkdl9vcmlnX3NlcV9wcmludF90ZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilzZXEtPnByaXZhdGU7CkBAIC0xMzI5LDYgKzE0MTUsODQgQEAKIAkJYmF0YWR2X2hhcmRpZl9wdXQoaGFyZF9pZmFjZSk7CiAJcmV0dXJuIDA7CiB9CisjZW5kaWYKKworLyoqCisgKiBiYXRhZHZfb3JpZ19kdW1wIC0gRHVtcCB0byBuZXRsaW5rIHRoZSBvcmlnaW5hdG9yIGluZm9zIGZvciBhIHNwZWNpZmljCisgKiAgb3V0Z29pbmcgaW50ZXJmYWNlCisgKiBAbXNnOiBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQGNiOiBwYXJhbWV0ZXJzIGZvciB0aGUgZHVtcAorICoKKyAqIFJldHVybjogMCBvciBlcnJvciB2YWx1ZQorICovCitpbnQgYmF0YWR2X29yaWdfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoY2ItPnNrYi0+c2spOworCXN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlOworCXN0cnVjdCBuZXRfZGV2aWNlICpoYXJkX2lmYWNlID0gTlVMTDsKKwlzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmhhcmRpZiA9IEJBVEFEVl9JRl9ERUZBVUxUOworCXN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXY7CisJc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpwcmltYXJ5X2lmID0gTlVMTDsKKwlpbnQgcmV0OworCWludCBpZmluZGV4LCBoYXJkX2lmaW5kZXg7CisKKwlpZmluZGV4ID0gYmF0YWR2X25ldGxpbmtfZ2V0X2lmaW5kZXgoY2ItPm5saCwgQkFUQURWX0FUVFJfTUVTSF9JRklOREVYKTsKKwlpZiAoIWlmaW5kZXgpCisJCXJldHVybiAtRUlOVkFMOworCisJc29mdF9pZmFjZSA9IGRldl9nZXRfYnlfaW5kZXgobmV0LCBpZmluZGV4KTsKKwlpZiAoIXNvZnRfaWZhY2UgfHwgIWJhdGFkdl9zb2Z0aWZfaXNfdmFsaWQoc29mdF9pZmFjZSkpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2lmYWNlKTsKKworCXByaW1hcnlfaWYgPSBiYXRhZHZfcHJpbWFyeV9pZl9nZXRfc2VsZWN0ZWQoYmF0X3ByaXYpOworCWlmICghcHJpbWFyeV9pZiB8fCBwcmltYXJ5X2lmLT5pZl9zdGF0dXMgIT0gQkFUQURWX0lGX0FDVElWRSkgeworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIG91dDsKKwl9CisKKwloYXJkX2lmaW5kZXggPSBiYXRhZHZfbmV0bGlua19nZXRfaWZpbmRleChjYi0+bmxoLAorCQkJCQkJICBCQVRBRFZfQVRUUl9IQVJEX0lGSU5ERVgpOworCWlmIChoYXJkX2lmaW5kZXgpIHsKKwkJaGFyZF9pZmFjZSA9IGRldl9nZXRfYnlfaW5kZXgobmV0LCBoYXJkX2lmaW5kZXgpOworCQlpZiAoaGFyZF9pZmFjZSkKKwkJCWhhcmRpZiA9IGJhdGFkdl9oYXJkaWZfZ2V0X2J5X25ldGRldihoYXJkX2lmYWNlKTsKKworCQlpZiAoIWhhcmRpZikgeworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGhhcmRpZi0+c29mdF9pZmFjZSAhPSBzb2Z0X2lmYWNlKSB7CisJCQlyZXQgPSAtRU5PRU5UOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAoIWJhdF9wcml2LT5hbGdvX29wcy0+b3JpZy5kdW1wKSB7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCQlnb3RvIG91dDsKKwl9CisKKwliYXRfcHJpdi0+YWxnb19vcHMtPm9yaWcuZHVtcChtc2csIGNiLCBiYXRfcHJpdiwgaGFyZGlmKTsKKworCXJldCA9IG1zZy0+bGVuOworCisgb3V0OgorCWlmIChoYXJkaWYpCisJCWJhdGFkdl9oYXJkaWZfcHV0KGhhcmRpZik7CisJaWYgKGhhcmRfaWZhY2UpCisJCWRldl9wdXQoaGFyZF9pZmFjZSk7CisJaWYgKHByaW1hcnlfaWYpCisJCWJhdGFkdl9oYXJkaWZfcHV0KHByaW1hcnlfaWYpOworCWlmIChzb2Z0X2lmYWNlKQorCQlkZXZfcHV0KHNvZnRfaWZhY2UpOworCisJcmV0dXJuIHJldDsKK30KIAogaW50IGJhdGFkdl9vcmlnX2hhc2hfYWRkX2lmKHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaGFyZF9pZmFjZSwKIAkJCSAgICBpbnQgbWF4X2lmX251bSkKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L29yaWdpbmF0b3IuaCBiL25ldC9iYXRtYW4tYWR2L29yaWdpbmF0b3IuaAppbmRleCA1NjYzMDZiLi5lYmM1NjE4IDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmgKKysrIGIvbmV0L2JhdG1hbi1hZHYvb3JpZ2luYXRvci5oCkBAIC0zMSw3ICszMSw5IEBACiAKICNpbmNsdWRlICJoYXNoLmgiCiAKK3N0cnVjdCBuZXRsaW5rX2NhbGxiYWNrOwogc3RydWN0IHNlcV9maWxlOworc3RydWN0IHNrX2J1ZmY7CiAKIGJvb2wgYmF0YWR2X2NvbXBhcmVfb3JpZyhjb25zdCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgY29uc3Qgdm9pZCAqZGF0YTIpOwogaW50IGJhdGFkdl9vcmlnaW5hdG9yX2luaXQoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdik7CkBAIC02MSw2ICs2Myw3IEBACiAJCQlzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmlmX291dGdvaW5nKTsKIHZvaWQgYmF0YWR2X25laWdoX2lmaW5mb19wdXQoc3RydWN0IGJhdGFkdl9uZWlnaF9pZmluZm8gKm5laWdoX2lmaW5mbyk7CiAKK2ludCBiYXRhZHZfaGFyZGlmX25laWdoX2R1bXAoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKTsKIGludCBiYXRhZHZfaGFyZGlmX25laWdoX3NlcV9wcmludF90ZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpOwogCiBzdHJ1Y3QgYmF0YWR2X29yaWdfaWZpbmZvICoKQEAgLTcyLDYgKzc1LDcgQEAKIHZvaWQgYmF0YWR2X29yaWdfaWZpbmZvX3B1dChzdHJ1Y3QgYmF0YWR2X29yaWdfaWZpbmZvICpvcmlnX2lmaW5mbyk7CiAKIGludCBiYXRhZHZfb3JpZ19zZXFfcHJpbnRfdGV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KTsKK2ludCBiYXRhZHZfb3JpZ19kdW1wKHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYik7CiBpbnQgYmF0YWR2X29yaWdfaGFyZGlmX3NlcV9wcmludF90ZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpOwogaW50IGJhdGFkdl9vcmlnX2hhc2hfYWRkX2lmKHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaGFyZF9pZmFjZSwKIAkJCSAgICBpbnQgbWF4X2lmX251bSk7CmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9wYWNrZXQuaCBiL25ldC9iYXRtYW4tYWR2L3BhY2tldC5oCmluZGV4IDZiMDExZmYuLjZhZmMwYjggMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L3BhY2tldC5oCisrKyBiL25ldC9iYXRtYW4tYWR2L3BhY2tldC5oCkBAIC0xMjksNDIgKzEyOSw2IEBACiB9OwogCiAvKioKLSAqIGVudW0gYmF0YWR2X3R0X2NsaWVudF9mbGFncyAtIFRUIGNsaWVudCBzcGVjaWZpYyBmbGFncwotICogQEJBVEFEVl9UVF9DTElFTlRfREVMOiB0aGUgY2xpZW50IGhhcyB0byBiZSBkZWxldGVkIGZyb20gdGhlIHRhYmxlCi0gKiBAQkFUQURWX1RUX0NMSUVOVF9ST0FNOiB0aGUgY2xpZW50IHJvYW1lZCB0by9mcm9tIGFub3RoZXIgbm9kZSBhbmQgdGhlIG5ldwotICogIHVwZGF0ZSB0ZWxsaW5nIGl0cyBuZXcgcmVhbCBsb2NhdGlvbiBoYXMgbm90IGJlZW4gcmVjZWl2ZWQvc2VudCB5ZXQKLSAqIEBCQVRBRFZfVFRfQ0xJRU5UX1dJRkk6IHRoaXMgY2xpZW50IGlzIGNvbm5lY3RlZCB0aHJvdWdoIGEgd2lmaSBpbnRlcmZhY2UuCi0gKiAgVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGJ5IHRoZSAiQVAgSXNvbGF0aW9uIiBmZWF0dXJlCi0gKiBAQkFUQURWX1RUX0NMSUVOVF9JU09MQTogdGhpcyBjbGllbnQgaXMgY29uc2lkZXJlZCAiaXNvbGF0ZWQiLiBUaGlzCi0gKiAgaW5mb3JtYXRpb24gaXMgdXNlZCBieSB0aGUgRXh0ZW5kZWQgSXNvbGF0aW9uIGZlYXR1cmUKLSAqIEBCQVRBRFZfVFRfQ0xJRU5UX05PUFVSR0U6IHRoaXMgY2xpZW50IHNob3VsZCBuZXZlciBiZSByZW1vdmVkIGZyb20gdGhlIHRhYmxlCi0gKiBAQkFUQURWX1RUX0NMSUVOVF9ORVc6IHRoaXMgY2xpZW50IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBsb2NhbCB0YWJsZSBidXQgaGFzCi0gKiAgbm90IGJlZW4gYW5ub3VuY2VkIHlldAotICogQEJBVEFEVl9UVF9DTElFTlRfUEVORElORzogdGhpcyBjbGllbnQgaXMgbWFya2VkIGZvciByZW1vdmFsIGJ1dCBpdCBpcyBrZXB0Ci0gKiAgaW4gdGhlIHRhYmxlIGZvciBvbmUgbW9yZSBvcmlnaW5hdG9yIGludGVydmFsIGZvciBjb25zaXN0ZW5jeSBwdXJwb3NlcwotICogQEJBVEFEVl9UVF9DTElFTlRfVEVNUDogdGhpcyBnbG9iYWwgY2xpZW50IGhhcyBiZWVuIGRldGVjdGVkIHRvIGJlIHBhcnQgb2YKLSAqICB0aGUgbmV0d29yayBidXQgbm8gbm5vZGUgaGFzIGFscmVhZHkgYW5ub3VuY2VkIGl0Ci0gKgotICogQml0cyBmcm9tIDAgdG8gNyBhcmUgY2FsbGVkIF9yZW1vdGUgZmxhZ3NfIGJlY2F1c2UgdGhleSBhcmUgc2VudCBvbiB0aGUgd2lyZS4KLSAqIEJpdHMgZnJvbSA4IHRvIDE1IGFyZSBjYWxsZWQgX2xvY2FsIGZsYWdzXyBiZWNhdXNlIHRoZXkgYXJlIHVzZWQgZm9yIGxvY2FsCi0gKiBjb21wdXRhdGlvbnMgb25seS4KLSAqCi0gKiBCaXRzIGZyb20gNCB0byA3IC0gYSBzdWJzZXQgb2YgcmVtb3RlIGZsYWdzIC0gYXJlIGVuc3VyZWQgdG8gYmUgaW4gc3luYyB3aXRoCi0gKiB0aGUgb3RoZXIgbm9kZXMgaW4gdGhlIG5ldHdvcmsuIFRvIGFjaGlldmUgdGhpcyBnb2FsIHRoZXNlIGZsYWdzIGFyZSBpbmNsdWRlZAotICogaW4gdGhlIFRUIENSQyBjb21wdXRhdGlvbi4KLSAqLwotZW51bSBiYXRhZHZfdHRfY2xpZW50X2ZsYWdzIHsKLQlCQVRBRFZfVFRfQ0xJRU5UX0RFTCAgICAgPSBCSVQoMCksCi0JQkFUQURWX1RUX0NMSUVOVF9ST0FNICAgID0gQklUKDEpLAotCUJBVEFEVl9UVF9DTElFTlRfV0lGSSAgICA9IEJJVCg0KSwKLQlCQVRBRFZfVFRfQ0xJRU5UX0lTT0xBCSA9IEJJVCg1KSwKLQlCQVRBRFZfVFRfQ0xJRU5UX05PUFVSR0UgPSBCSVQoOCksCi0JQkFUQURWX1RUX0NMSUVOVF9ORVcgICAgID0gQklUKDkpLAotCUJBVEFEVl9UVF9DTElFTlRfUEVORElORyA9IEJJVCgxMCksCi0JQkFUQURWX1RUX0NMSUVOVF9URU1QCSA9IEJJVCgxMSksCi19OwotCi0vKioKICAqIGVudW0gYmF0YWR2X3ZsYW5fZmxhZ3MgLSBmbGFncyBmb3IgdGhlIGZvdXIgTVNCIG9mIGFueSB2bGFuIElEIGZpZWxkCiAgKiBAQkFUQURWX1ZMQU5fSEFTX1RBRzogd2hldGhlciB0aGUgZmllbGQgY29udGFpbnMgYSB2YWxpZCB2bGFuIHRhZyBvciBub3QKICAqLwpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvcm91dGluZy5jIGIvbmV0L2JhdG1hbi1hZHYvcm91dGluZy5jCmluZGV4IDc2MDJjMDAuLjdlOGRjNjQgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L3JvdXRpbmcuYworKysgYi9uZXQvYmF0bWFuLWFkdi9yb3V0aW5nLmMKQEAgLTc0LDExICs3NCwyMyBAQAogCWlmICghb3JpZ19pZmluZm8pCiAJCXJldHVybjsKIAotCXJjdV9yZWFkX2xvY2soKTsKLQljdXJyX3JvdXRlciA9IHJjdV9kZXJlZmVyZW5jZShvcmlnX2lmaW5mby0+cm91dGVyKTsKLQlpZiAoY3Vycl9yb3V0ZXIgJiYgIWtyZWZfZ2V0X3VubGVzc196ZXJvKCZjdXJyX3JvdXRlci0+cmVmY291bnQpKQotCQljdXJyX3JvdXRlciA9IE5VTEw7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CisJc3Bpbl9sb2NrX2JoKCZvcmlnX25vZGUtPm5laWdoX2xpc3RfbG9jayk7CisJLyogY3Vycl9yb3V0ZXIgdXNlZCBlYXJsaWVyIG1heSBub3QgYmUgdGhlIGN1cnJlbnQgb3JpZ19pZmluZm8tPnJvdXRlcgorCSAqIGFueW1vcmUgYmVjYXVzZSBpdCB3YXMgZGVyZWZlcmVuY2VkIG91dHNpZGUgb2YgdGhlIG5laWdoX2xpc3RfbG9jaworCSAqIHByb3RlY3RlZCByZWdpb24uIEFmdGVyIHRoZSBuZXcgYmVzdCBuZWlnaGJvciBoYXMgcmVwbGFjZSB0aGUgY3VycmVudAorCSAqIGJlc3QgbmVpZ2hib3IgdGhlIHJlZmVyZW5jZSBjb3VudGVyIG5lZWRzIHRvIGRlY3JlYXNlLiBDb25zZXF1ZW50bHksCisJICogdGhlIGNvZGUgbmVlZHMgdG8gZW5zdXJlIHRoZSBjdXJyX3JvdXRlciB2YXJpYWJsZSBjb250YWlucyBhIHBvaW50ZXIKKwkgKiB0byB0aGUgcmVwbGFjZWQgYmVzdCBuZWlnaGJvci4KKwkgKi8KKwljdXJyX3JvdXRlciA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQob3JpZ19pZmluZm8tPnJvdXRlciwgdHJ1ZSk7CisKKwkvKiBpbmNyZWFzZSByZWZjb3VudCBvZiBuZXcgYmVzdCBuZWlnaGJvciAqLworCWlmIChuZWlnaF9ub2RlKQorCQlrcmVmX2dldCgmbmVpZ2hfbm9kZS0+cmVmY291bnQpOworCisJcmN1X2Fzc2lnbl9wb2ludGVyKG9yaWdfaWZpbmZvLT5yb3V0ZXIsIG5laWdoX25vZGUpOworCXNwaW5fdW5sb2NrX2JoKCZvcmlnX25vZGUtPm5laWdoX2xpc3RfbG9jayk7CisJYmF0YWR2X29yaWdfaWZpbmZvX3B1dChvcmlnX2lmaW5mbyk7CiAKIAkvKiByb3V0ZSBkZWxldGVkICovCiAJaWYgKChjdXJyX3JvdXRlcikgJiYgKCFuZWlnaF9ub2RlKSkgewpAQCAtMTAwLDI3ICsxMTIsNiBAQAogCQkJICAgY3Vycl9yb3V0ZXItPmFkZHIpOwogCX0KIAotCWlmIChjdXJyX3JvdXRlcikKLQkJYmF0YWR2X25laWdoX25vZGVfcHV0KGN1cnJfcm91dGVyKTsKLQotCXNwaW5fbG9ja19iaCgmb3JpZ19ub2RlLT5uZWlnaF9saXN0X2xvY2spOwotCS8qIGN1cnJfcm91dGVyIHVzZWQgZWFybGllciBtYXkgbm90IGJlIHRoZSBjdXJyZW50IG9yaWdfaWZpbmZvLT5yb3V0ZXIKLQkgKiBhbnltb3JlIGJlY2F1c2UgaXQgd2FzIGRlcmVmZXJlbmNlZCBvdXRzaWRlIG9mIHRoZSBuZWlnaF9saXN0X2xvY2sKLQkgKiBwcm90ZWN0ZWQgcmVnaW9uLiBBZnRlciB0aGUgbmV3IGJlc3QgbmVpZ2hib3IgaGFzIHJlcGxhY2UgdGhlIGN1cnJlbnQKLQkgKiBiZXN0IG5laWdoYm9yIHRoZSByZWZlcmVuY2UgY291bnRlciBuZWVkcyB0byBkZWNyZWFzZS4gQ29uc2VxdWVudGx5LAotCSAqIHRoZSBjb2RlIG5lZWRzIHRvIGVuc3VyZSB0aGUgY3Vycl9yb3V0ZXIgdmFyaWFibGUgY29udGFpbnMgYSBwb2ludGVyCi0JICogdG8gdGhlIHJlcGxhY2VkIGJlc3QgbmVpZ2hib3IuCi0JICovCi0JY3Vycl9yb3V0ZXIgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKG9yaWdfaWZpbmZvLT5yb3V0ZXIsIHRydWUpOwotCi0JLyogaW5jcmVhc2UgcmVmY291bnQgb2YgbmV3IGJlc3QgbmVpZ2hib3IgKi8KLQlpZiAobmVpZ2hfbm9kZSkKLQkJa3JlZl9nZXQoJm5laWdoX25vZGUtPnJlZmNvdW50KTsKLQotCXJjdV9hc3NpZ25fcG9pbnRlcihvcmlnX2lmaW5mby0+cm91dGVyLCBuZWlnaF9ub2RlKTsKLQlzcGluX3VubG9ja19iaCgmb3JpZ19ub2RlLT5uZWlnaF9saXN0X2xvY2spOwotCWJhdGFkdl9vcmlnX2lmaW5mb19wdXQob3JpZ19pZmluZm8pOwotCiAJLyogZGVjcmVhc2UgcmVmY291bnQgb2YgcHJldmlvdXMgYmVzdCBuZWlnaGJvciAqLwogCWlmIChjdXJyX3JvdXRlcikKIAkJYmF0YWR2X25laWdoX25vZGVfcHV0KGN1cnJfcm91dGVyKTsKQEAgLTQ3MCw2ICs0NjEsMjkgQEAKIH0KIAogLyoqCisgKiBiYXRhZHZfbGFzdF9ib25kaW5nX2dldCAtIEdldCBsYXN0X2JvbmRpbmdfY2FuZGlkYXRlIG9mIG9yaWdfbm9kZQorICogQG9yaWdfbm9kZTogb3JpZ2luYXRvciBub2RlIHdob3NlIGxhc3QgYm9uZGluZyBjYW5kaWRhdGUgc2hvdWxkIGJlIHJldHJpZXZlZAorICoKKyAqIFJldHVybjogbGFzdCBib25kaW5nIGNhbmRpZGF0ZSBvZiByb3V0ZXIgb3IgTlVMTCBpZiBub3QgZm91bmQKKyAqCisgKiBUaGUgb2JqZWN0IGlzIHJldHVybmVkIHdpdGggcmVmY291bnRlciBpbmNyZWFzZWQgYnkgMS4KKyAqLworc3RhdGljIHN0cnVjdCBiYXRhZHZfb3JpZ19pZmluZm8gKgorYmF0YWR2X2xhc3RfYm9uZGluZ19nZXQoc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKm9yaWdfbm9kZSkKK3sKKwlzdHJ1Y3QgYmF0YWR2X29yaWdfaWZpbmZvICpsYXN0X2JvbmRpbmdfY2FuZGlkYXRlOworCisJc3Bpbl9sb2NrX2JoKCZvcmlnX25vZGUtPm5laWdoX2xpc3RfbG9jayk7CisJbGFzdF9ib25kaW5nX2NhbmRpZGF0ZSA9IG9yaWdfbm9kZS0+bGFzdF9ib25kaW5nX2NhbmRpZGF0ZTsKKworCWlmIChsYXN0X2JvbmRpbmdfY2FuZGlkYXRlKQorCQlrcmVmX2dldCgmbGFzdF9ib25kaW5nX2NhbmRpZGF0ZS0+cmVmY291bnQpOworCXNwaW5fdW5sb2NrX2JoKCZvcmlnX25vZGUtPm5laWdoX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gbGFzdF9ib25kaW5nX2NhbmRpZGF0ZTsKK30KKworLyoqCiAgKiBiYXRhZHZfbGFzdF9ib25kaW5nX3JlcGxhY2UgLSBSZXBsYWNlIGxhc3RfYm9uZGluZ19jYW5kaWRhdGUgb2Ygb3JpZ19ub2RlCiAgKiBAb3JpZ19ub2RlOiBvcmlnaW5hdG9yIG5vZGUgd2hvc2UgYm9uZGluZyBjYW5kaWRhdGVzIHNob3VsZCBiZSByZXBsYWNlZAogICogQG5ld19jYW5kaWRhdGU6IG5ldyBib25kaW5nIGNhbmRpZGF0ZSBvciBOVUxMCkBAIC01MzksNyArNTUzLDcgQEAKIAkgKiByb3V0ZXIgLSBvYnZpb3VzbHkgdGhlcmUgYXJlIG5vIG90aGVyIGNhbmRpZGF0ZXMuCiAJICovCiAJcmN1X3JlYWRfbG9jaygpOwotCWxhc3RfY2FuZGlkYXRlID0gb3JpZ19ub2RlLT5sYXN0X2JvbmRpbmdfY2FuZGlkYXRlOworCWxhc3RfY2FuZGlkYXRlID0gYmF0YWR2X2xhc3RfYm9uZGluZ19nZXQob3JpZ19ub2RlKTsKIAlpZiAobGFzdF9jYW5kaWRhdGUpCiAJCWxhc3RfY2FuZF9yb3V0ZXIgPSByY3VfZGVyZWZlcmVuY2UobGFzdF9jYW5kaWRhdGUtPnJvdXRlcik7CiAKQEAgLTYzMSw2ICs2NDUsOSBAQAogCQliYXRhZHZfb3JpZ19pZmluZm9fcHV0KG5leHRfY2FuZGlkYXRlKTsKIAl9CiAKKwlpZiAobGFzdF9jYW5kaWRhdGUpCisJCWJhdGFkdl9vcmlnX2lmaW5mb19wdXQobGFzdF9jYW5kaWRhdGUpOworCiAJcmV0dXJuIHJvdXRlcjsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvc2VuZC5jIGIvbmV0L2JhdG1hbi1hZHYvc2VuZC5jCmluZGV4IDYxOTExNTkuLjhkNGUxZjUgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L3NlbmQuYworKysgYi9uZXQvYmF0bWFuLWFkdi9zZW5kLmMKQEAgLTMxNSw4ICszMTUsNyBAQAogICoKICAqIFdyYXAgdGhlIGdpdmVuIHNrYiBpbnRvIGEgYmF0bWFuLWFkdiB1bmljYXN0IG9yIHVuaWNhc3QtNGFkZHIgaGVhZGVyCiAgKiBkZXBlbmRpbmcgb24gd2hldGhlciBCQVRBRFZfVU5JQ0FTVCBvciBCQVRBRFZfVU5JQ0FTVF80QUREUiB3YXMgc3VwcGxpZWQKLSAqIGFzIHBhY2tldF90eXBlLiBUaGVuIHNlbmQgdGhpcyBmcmFtZSB0byB0aGUgZ2l2ZW4gb3JpZ19ub2RlIGFuZCByZWxlYXNlIGEKLSAqIHJlZmVyZW5jZSB0byB0aGlzIG9yaWdfbm9kZS4KKyAqIGFzIHBhY2tldF90eXBlLiBUaGVuIHNlbmQgdGhpcyBmcmFtZSB0byB0aGUgZ2l2ZW4gb3JpZ19ub2RlLgogICoKICAqIFJldHVybjogTkVUX1hNSVRfRFJPUCBpbiBjYXNlIG9mIGVycm9yIG9yIE5FVF9YTUlUX1NVQ0NFU1Mgb3RoZXJ3aXNlLgogICovCkBAIC0zNzAsOCArMzY5LDYgQEAKIAkJcmV0ID0gTkVUX1hNSVRfU1VDQ0VTUzsKIAogb3V0OgotCWlmIChvcmlnX25vZGUpCi0JCWJhdGFkdl9vcmlnX25vZGVfcHV0KG9yaWdfbm9kZSk7CiAJaWYgKHJldCA9PSBORVRfWE1JVF9EUk9QKQogCQlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gcmV0OwpAQCAtNDAzLDYgKzQwMCw3IEBACiAJc3RydWN0IGV0aGhkciAqZXRoaGRyID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7CiAJc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKm9yaWdfbm9kZTsKIAl1OCAqc3JjLCAqZHN0OworCWludCByZXQ7CiAKIAlzcmMgPSBldGhoZHItPmhfc291cmNlOwogCWRzdCA9IGV0aGhkci0+aF9kZXN0OwpAQCAtNDE0LDggKzQxMiwxMyBAQAogCX0KIAlvcmlnX25vZGUgPSBiYXRhZHZfdHJhbnN0YWJsZV9zZWFyY2goYmF0X3ByaXYsIHNyYywgZHN0LCB2aWQpOwogCi0JcmV0dXJuIGJhdGFkdl9zZW5kX3NrYl91bmljYXN0KGJhdF9wcml2LCBza2IsIHBhY2tldF90eXBlLAotCQkJCSAgICAgICBwYWNrZXRfc3VidHlwZSwgb3JpZ19ub2RlLCB2aWQpOworCXJldCA9IGJhdGFkdl9zZW5kX3NrYl91bmljYXN0KGJhdF9wcml2LCBza2IsIHBhY2tldF90eXBlLAorCQkJCSAgICAgIHBhY2tldF9zdWJ0eXBlLCBvcmlnX25vZGUsIHZpZCk7CisKKwlpZiAob3JpZ19ub2RlKQorCQliYXRhZHZfb3JpZ19ub2RlX3B1dChvcmlnX25vZGUpOworCisJcmV0dXJuIHJldDsKIH0KIAogLyoqCkBAIC00MzMsMTIgKzQzNiwyNSBAQAogCQkJICAgdW5zaWduZWQgc2hvcnQgdmlkKQogewogCXN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpvcmlnX25vZGU7CisJaW50IHJldDsKIAogCW9yaWdfbm9kZSA9IGJhdGFkdl9nd19nZXRfc2VsZWN0ZWRfb3JpZyhiYXRfcHJpdik7Ci0JcmV0dXJuIGJhdGFkdl9zZW5kX3NrYl91bmljYXN0KGJhdF9wcml2LCBza2IsIEJBVEFEVl9VTklDQVNUXzRBRERSLAotCQkJCSAgICAgICBCQVRBRFZfUF9EQVRBLCBvcmlnX25vZGUsIHZpZCk7CisJcmV0ID0gYmF0YWR2X3NlbmRfc2tiX3VuaWNhc3QoYmF0X3ByaXYsIHNrYiwgQkFUQURWX1VOSUNBU1RfNEFERFIsCisJCQkJICAgICAgQkFUQURWX1BfREFUQSwgb3JpZ19ub2RlLCB2aWQpOworCisJaWYgKG9yaWdfbm9kZSkKKwkJYmF0YWR2X29yaWdfbm9kZV9wdXQob3JpZ19ub2RlKTsKKworCXJldHVybiByZXQ7CiB9CiAKKy8qKgorICogYmF0YWR2X2ZvcndfcGFja2V0X2ZyZWUgLSBmcmVlIGEgZm9yd2FyZGluZyBwYWNrZXQKKyAqIEBmb3J3X3BhY2tldDogVGhlIHBhY2tldCB0byBmcmVlCisgKgorICogVGhpcyBmcmVlcyBhIGZvcndhcmRpbmcgcGFja2V0IGFuZCByZWxlYXNlcyBhbnkgcmVzb3VyY2VzIGl0IG1pZ2h0CisgKiBoYXZlIGNsYWltZWQuCisgKi8KIHZvaWQgYmF0YWR2X2ZvcndfcGFja2V0X2ZyZWUoc3RydWN0IGJhdGFkdl9mb3J3X3BhY2tldCAqZm9yd19wYWNrZXQpCiB7CiAJa2ZyZWVfc2tiKGZvcndfcGFja2V0LT5za2IpOwpAQCAtNDQ2LDkgKzQ2Miw3MyBAQAogCQliYXRhZHZfaGFyZGlmX3B1dChmb3J3X3BhY2tldC0+aWZfaW5jb21pbmcpOwogCWlmIChmb3J3X3BhY2tldC0+aWZfb3V0Z29pbmcpCiAJCWJhdGFkdl9oYXJkaWZfcHV0KGZvcndfcGFja2V0LT5pZl9vdXRnb2luZyk7CisJaWYgKGZvcndfcGFja2V0LT5xdWV1ZV9sZWZ0KQorCQlhdG9taWNfaW5jKGZvcndfcGFja2V0LT5xdWV1ZV9sZWZ0KTsKIAlrZnJlZShmb3J3X3BhY2tldCk7CiB9CiAKKy8qKgorICogYmF0YWR2X2ZvcndfcGFja2V0X2FsbG9jIC0gYWxsb2NhdGUgYSBmb3J3YXJkaW5nIHBhY2tldAorICogQGlmX2luY29taW5nOiBUaGUgKG9wdGlvbmFsKSBpZl9pbmNvbWluZyB0byBiZSBncmFiYmVkCisgKiBAaWZfb3V0Z29pbmc6IFRoZSAob3B0aW9uYWwpIGlmX291dGdvaW5nIHRvIGJlIGdyYWJiZWQKKyAqIEBxdWV1ZV9sZWZ0OiBUaGUgKG9wdGlvbmFsKSBxdWV1ZSBjb3VudGVyIHRvIGRlY3JlYXNlCisgKiBAYmF0X3ByaXY6IFRoZSBiYXRfcHJpdiBmb3IgdGhlIG1lc2ggb2YgdGhpcyBmb3J3X3BhY2tldAorICoKKyAqIEFsbG9jYXRlcyBhIGZvcndhcmRpbmcgcGFja2V0IGFuZCB0cmllcyB0byBnZXQgYSByZWZlcmVuY2UgdG8gdGhlCisgKiAob3B0aW9uYWwpIGlmX2luY29taW5nLCBpZl9vdXRnb2luZyBhbmQgcXVldWVfbGVmdC4gSWYgcXVldWVfbGVmdAorICogaXMgTlVMTCB0aGVuIGJhdF9wcml2IGlzIG9wdGlvbmFsLCB0b28uCisgKgorICogUmV0dXJuOiBBbiBhbGxvY2F0ZWQgZm9yd2FyZGluZyBwYWNrZXQgb24gc3VjY2VzcywgTlVMTCBvdGhlcndpc2UuCisgKi8KK3N0cnVjdCBiYXRhZHZfZm9yd19wYWNrZXQgKgorYmF0YWR2X2ZvcndfcGFja2V0X2FsbG9jKHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaWZfaW5jb21pbmcsCisJCQkgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICppZl9vdXRnb2luZywKKwkJCSBhdG9taWNfdCAqcXVldWVfbGVmdCwKKwkJCSBzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2KQoreworCXN0cnVjdCBiYXRhZHZfZm9yd19wYWNrZXQgKmZvcndfcGFja2V0OworCWNvbnN0IGNoYXIgKnFuYW1lOworCisJaWYgKHF1ZXVlX2xlZnQgJiYgIWJhdGFkdl9hdG9taWNfZGVjX25vdF96ZXJvKHF1ZXVlX2xlZnQpKSB7CisJCXFuYW1lID0gInVua25vd24iOworCisJCWlmIChxdWV1ZV9sZWZ0ID09ICZiYXRfcHJpdi0+YmNhc3RfcXVldWVfbGVmdCkKKwkJCXFuYW1lID0gImJjYXN0IjsKKworCQlpZiAocXVldWVfbGVmdCA9PSAmYmF0X3ByaXYtPmJhdG1hbl9xdWV1ZV9sZWZ0KQorCQkJcW5hbWUgPSAiYmF0bWFuIjsKKworCQliYXRhZHZfZGJnKEJBVEFEVl9EQkdfQkFUTUFOLCBiYXRfcHJpdiwKKwkJCSAgICIlcyBxdWV1ZSBpcyBmdWxsXG4iLCBxbmFtZSk7CisKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZm9yd19wYWNrZXQgPSBrbWFsbG9jKHNpemVvZigqZm9yd19wYWNrZXQpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWZvcndfcGFja2V0KQorCQlnb3RvIGVycjsKKworCWlmIChpZl9pbmNvbWluZykKKwkJa3JlZl9nZXQoJmlmX2luY29taW5nLT5yZWZjb3VudCk7CisKKwlpZiAoaWZfb3V0Z29pbmcpCisJCWtyZWZfZ2V0KCZpZl9vdXRnb2luZy0+cmVmY291bnQpOworCisJZm9yd19wYWNrZXQtPnNrYiA9IE5VTEw7CisJZm9yd19wYWNrZXQtPnF1ZXVlX2xlZnQgPSBxdWV1ZV9sZWZ0OworCWZvcndfcGFja2V0LT5pZl9pbmNvbWluZyA9IGlmX2luY29taW5nOworCWZvcndfcGFja2V0LT5pZl9vdXRnb2luZyA9IGlmX291dGdvaW5nOworCWZvcndfcGFja2V0LT5udW1fcGFja2V0cyA9IDA7CisKKwlyZXR1cm4gZm9yd19wYWNrZXQ7CisKK2VycjoKKwlpZiAocXVldWVfbGVmdCkKKwkJYXRvbWljX2luYyhxdWV1ZV9sZWZ0KTsKKworCXJldHVybiBOVUxMOworfQorCiBzdGF0aWMgdm9pZAogX2JhdGFkdl9hZGRfYmNhc3RfcGFja2V0X3RvX2xpc3Qoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKIAkJCQkgc3RydWN0IGJhdGFkdl9mb3J3X3BhY2tldCAqZm9yd19wYWNrZXQsCkBAIC00ODcsMjQgKzU2NywyMCBAQAogCXN0cnVjdCBiYXRhZHZfYmNhc3RfcGFja2V0ICpiY2FzdF9wYWNrZXQ7CiAJc3RydWN0IHNrX2J1ZmYgKm5ld3NrYjsKIAotCWlmICghYmF0YWR2X2F0b21pY19kZWNfbm90X3plcm8oJmJhdF9wcml2LT5iY2FzdF9xdWV1ZV9sZWZ0KSkgewotCQliYXRhZHZfZGJnKEJBVEFEVl9EQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCSAgICJiY2FzdCBwYWNrZXQgcXVldWUgZnVsbFxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQogCXByaW1hcnlfaWYgPSBiYXRhZHZfcHJpbWFyeV9pZl9nZXRfc2VsZWN0ZWQoYmF0X3ByaXYpOwogCWlmICghcHJpbWFyeV9pZikKLQkJZ290byBvdXRfYW5kX2luYzsKKwkJZ290byBlcnI7CiAKLQlmb3J3X3BhY2tldCA9IGttYWxsb2Moc2l6ZW9mKCpmb3J3X3BhY2tldCksIEdGUF9BVE9NSUMpOwotCisJZm9yd19wYWNrZXQgPSBiYXRhZHZfZm9yd19wYWNrZXRfYWxsb2MocHJpbWFyeV9pZiwgTlVMTCwKKwkJCQkJICAgICAgICZiYXRfcHJpdi0+YmNhc3RfcXVldWVfbGVmdCwKKwkJCQkJICAgICAgIGJhdF9wcml2KTsKKwliYXRhZHZfaGFyZGlmX3B1dChwcmltYXJ5X2lmKTsKIAlpZiAoIWZvcndfcGFja2V0KQotCQlnb3RvIG91dF9hbmRfaW5jOworCQlnb3RvIGVycjsKIAogCW5ld3NrYiA9IHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7CiAJaWYgKCFuZXdza2IpCi0JCWdvdG8gcGFja2V0X2ZyZWU7CisJCWdvdG8gZXJyX3BhY2tldF9mcmVlOwogCiAJLyogYXMgd2UgaGF2ZSBhIGNvcHkgbm93LCBpdCBpcyBzYWZlIHRvIGRlY3JlYXNlIHRoZSBUVEwgKi8KIAliY2FzdF9wYWNrZXQgPSAoc3RydWN0IGJhdGFkdl9iY2FzdF9wYWNrZXQgKiluZXdza2ItPmRhdGE7CkBAIC01MTMsMTEgKzU4OSw2IEBACiAJc2tiX3Jlc2V0X21hY19oZWFkZXIobmV3c2tiKTsKIAogCWZvcndfcGFja2V0LT5za2IgPSBuZXdza2I7Ci0JZm9yd19wYWNrZXQtPmlmX2luY29taW5nID0gcHJpbWFyeV9pZjsKLQlmb3J3X3BhY2tldC0+aWZfb3V0Z29pbmcgPSBOVUxMOwotCi0JLyogaG93IG9mdGVuIGRpZCB3ZSBzZW5kIHRoZSBiY2FzdCBwYWNrZXQgPyAqLwotCWZvcndfcGFja2V0LT5udW1fcGFja2V0cyA9IDA7CiAKIAlJTklUX0RFTEFZRURfV09SSygmZm9yd19wYWNrZXQtPmRlbGF5ZWRfd29yaywKIAkJCSAgYmF0YWR2X3NlbmRfb3V0c3RhbmRpbmdfYmNhc3RfcGFja2V0KTsKQEAgLTUyNSwxMyArNTk2LDkgQEAKIAlfYmF0YWR2X2FkZF9iY2FzdF9wYWNrZXRfdG9fbGlzdChiYXRfcHJpdiwgZm9yd19wYWNrZXQsIGRlbGF5KTsKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogCi1wYWNrZXRfZnJlZToKLQlrZnJlZShmb3J3X3BhY2tldCk7Ci1vdXRfYW5kX2luYzoKLQlhdG9taWNfaW5jKCZiYXRfcHJpdi0+YmNhc3RfcXVldWVfbGVmdCk7Ci1vdXQ6Ci0JaWYgKHByaW1hcnlfaWYpCi0JCWJhdGFkdl9oYXJkaWZfcHV0KHByaW1hcnlfaWYpOworZXJyX3BhY2tldF9mcmVlOgorCWJhdGFkdl9mb3J3X3BhY2tldF9mcmVlKGZvcndfcGFja2V0KTsKK2VycjoKIAlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CiB9CiAKQEAgLTU5Miw3ICs2NTksNiBAQAogCiBvdXQ6CiAJYmF0YWR2X2ZvcndfcGFja2V0X2ZyZWUoZm9yd19wYWNrZXQpOwotCWF0b21pY19pbmMoJmJhdF9wcml2LT5iY2FzdF9xdWV1ZV9sZWZ0KTsKIH0KIAogdm9pZApAQCAtNjMzLDkgKzY5OSw2IEBACiAKIAkJaWYgKHBlbmRpbmcpIHsKIAkJCWhsaXN0X2RlbCgmZm9yd19wYWNrZXQtPmxpc3QpOwotCQkJaWYgKCFmb3J3X3BhY2tldC0+b3duKQotCQkJCWF0b21pY19pbmMoJmJhdF9wcml2LT5iY2FzdF9xdWV1ZV9sZWZ0KTsKLQogCQkJYmF0YWR2X2ZvcndfcGFja2V0X2ZyZWUoZm9yd19wYWNrZXQpOwogCQl9CiAJfQpAQCAtNjYzLDkgKzcyNiw2IEBACiAKIAkJaWYgKHBlbmRpbmcpIHsKIAkJCWhsaXN0X2RlbCgmZm9yd19wYWNrZXQtPmxpc3QpOwotCQkJaWYgKCFmb3J3X3BhY2tldC0+b3duKQotCQkJCWF0b21pY19pbmMoJmJhdF9wcml2LT5iYXRtYW5fcXVldWVfbGVmdCk7Ci0KIAkJCWJhdGFkdl9mb3J3X3BhY2tldF9mcmVlKGZvcndfcGFja2V0KTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L3NlbmQuaCBiL25ldC9iYXRtYW4tYWR2L3NlbmQuaAppbmRleCA3Y2VjYjc1Li45OTlmNzg2IDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9zZW5kLmgKKysrIGIvbmV0L2JhdG1hbi1hZHYvc2VuZC5oCkBAIC0yOCw2ICsyOCwxMiBAQAogc3RydWN0IHNrX2J1ZmY7CiAKIHZvaWQgYmF0YWR2X2ZvcndfcGFja2V0X2ZyZWUoc3RydWN0IGJhdGFkdl9mb3J3X3BhY2tldCAqZm9yd19wYWNrZXQpOworc3RydWN0IGJhdGFkdl9mb3J3X3BhY2tldCAqCitiYXRhZHZfZm9yd19wYWNrZXRfYWxsb2Moc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICppZl9pbmNvbWluZywKKwkJCSBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmlmX291dGdvaW5nLAorCQkJIGF0b21pY190ICpxdWV1ZV9sZWZ0LAorCQkJIHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYpOworCiBpbnQgYmF0YWR2X3NlbmRfc2tiX3RvX29yaWcoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICBzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqb3JpZ19ub2RlLAogCQkJICAgIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqcmVjdl9pZik7CmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9zb2Z0LWludGVyZmFjZS5jIGIvbmV0L2JhdG1hbi1hZHYvc29mdC1pbnRlcmZhY2UuYwppbmRleCA3NTI3YzA2Li40OWUxNmI2IDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9zb2Z0LWludGVyZmFjZS5jCisrKyBiL25ldC9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmMKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CkBAIC00Niw3ICs0Nyw2IEBACiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KIAogI2luY2x1ZGUgImJhdF9hbGdvLmgiCiAjaW5jbHVkZSAiYnJpZGdlX2xvb3BfYXZvaWRhbmNlLmgiCkBAIC01Nyw2ICs1Nyw3IEBACiAjaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKICNpbmNsdWRlICJtdWx0aWNhc3QuaCIKICNpbmNsdWRlICJuZXR3b3JrLWNvZGluZy5oIgorI2luY2x1ZGUgIm9yaWdpbmF0b3IuaCIKICNpbmNsdWRlICJwYWNrZXQuaCIKICNpbmNsdWRlICJzZW5kLmgiCiAjaW5jbHVkZSAic3lzZnMuaCIKQEAgLTM3Nyw2ICszNzgsOCBAQAogZHJvcHBlZF9mcmVlZDoKIAliYXRhZHZfaW5jX2NvdW50ZXIoYmF0X3ByaXYsIEJBVEFEVl9DTlRfVFhfRFJPUFBFRCk7CiBlbmQ6CisJaWYgKG1jYXN0X3NpbmdsZV9vcmlnKQorCQliYXRhZHZfb3JpZ19ub2RlX3B1dChtY2FzdF9zaW5nbGVfb3JpZyk7CiAJaWYgKHByaW1hcnlfaWYpCiAJCWJhdGFkdl9oYXJkaWZfcHV0KHByaW1hcnlfaWYpOwogCXJldHVybiBORVRERVZfVFhfT0s7CkBAIC01OTEsNiArNTk0LDcgQEAKIAl9CiAKIAlzcGluX2xvY2tfYmgoJmJhdF9wcml2LT5zb2Z0aWZfdmxhbl9saXN0X2xvY2spOworCWtyZWZfZ2V0KCZ2bGFuLT5yZWZjb3VudCk7CiAJaGxpc3RfYWRkX2hlYWRfcmN1KCZ2bGFuLT5saXN0LCAmYmF0X3ByaXYtPnNvZnRpZl92bGFuX2xpc3QpOwogCXNwaW5fdW5sb2NrX2JoKCZiYXRfcHJpdi0+c29mdGlmX3ZsYW5fbGlzdF9sb2NrKTsKIApAQCAtNjAxLDYgKzYwNSw5IEBACiAJCQkgICAgYmF0X3ByaXYtPnNvZnRfaWZhY2UtPmRldl9hZGRyLCB2aWQsCiAJCQkgICAgQkFUQURWX05VTExfSUZJTkRFWCwgQkFUQURWX05PX01BUkspOwogCisJLyogZG9uJ3QgcmV0dXJuIHJlZmVyZW5jZSB0byBuZXcgc29mdGlmX3ZsYW4gKi8KKwliYXRhZHZfc29mdGlmX3ZsYW5fcHV0KHZsYW4pOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc0NywzNCArNzU0LDYgQEAKIH0KIAogLyoqCi0gKiBiYXRhZHZfc29mdGlmX2Rlc3Ryb3lfZmluaXNoIC0gY2xlYW5zIHVwIHRoZSByZW1haW5zIG9mIGEgc29mdGlmCi0gKiBAd29yazogd29yayBxdWV1ZSBpdGVtCi0gKgotICogRnJlZSB0aGUgcGFydHMgb2YgdGhlIHNvZnQgaW50ZXJmYWNlIHdoaWNoIGNhbiBub3QgYmUgcmVtb3ZlZCB1bmRlcgotICogcnRubCBsb2NrICh0byBwcmV2ZW50IGRlYWRsb2NrIHNpdHVhdGlvbnMpLgotICovCi1zdGF0aWMgdm9pZCBiYXRhZHZfc29mdGlmX2Rlc3Ryb3lfZmluaXNoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgYmF0YWR2X3NvZnRpZl92bGFuICp2bGFuOwotCXN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXY7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2U7Ci0KLQliYXRfcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYmF0YWR2X3ByaXYsCi0JCQkJY2xlYW51cF93b3JrKTsKLQlzb2Z0X2lmYWNlID0gYmF0X3ByaXYtPnNvZnRfaWZhY2U7Ci0KLQkvKiBkZXN0cm95IHRoZSAidW50YWdnZWQiIFZMQU4gKi8KLQl2bGFuID0gYmF0YWR2X3NvZnRpZl92bGFuX2dldChiYXRfcHJpdiwgQkFUQURWX05PX0ZMQUdTKTsKLQlpZiAodmxhbikgewotCQliYXRhZHZfc29mdGlmX2Rlc3Ryb3lfdmxhbihiYXRfcHJpdiwgdmxhbik7Ci0JCWJhdGFkdl9zb2Z0aWZfdmxhbl9wdXQodmxhbik7Ci0JfQotCi0JYmF0YWR2X3N5c2ZzX2RlbF9tZXNoaWYoc29mdF9pZmFjZSk7Ci0JdW5yZWdpc3Rlcl9uZXRkZXYoc29mdF9pZmFjZSk7Ci19Ci0KLS8qKgogICogYmF0YWR2X3NvZnRpZl9pbml0X2xhdGUgLSBsYXRlIHN0YWdlIGluaXRpYWxpemF0aW9uIG9mIHNvZnQgaW50ZXJmYWNlCiAgKiBAZGV2OiByZWdpc3RlcmVkIG5ldHdvcmsgZGV2aWNlIHRvIG1vZGlmeQogICoKQEAgLTc5MSw3ICs3NzAsNiBAQAogCiAJYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWJhdF9wcml2LT5zb2Z0X2lmYWNlID0gZGV2OwotCUlOSVRfV09SSygmYmF0X3ByaXYtPmNsZWFudXBfd29yaywgYmF0YWR2X3NvZnRpZl9kZXN0cm95X2ZpbmlzaCk7CiAKIAkvKiBiYXRhZHZfaW50ZXJmYWNlX3N0YXRzKCkgbmVlZHMgdG8gYmUgYXZhaWxhYmxlIGFzIHNvb24gYXMKIAkgKiByZWdpc3Rlcl9uZXRkZXZpY2UoKSBoYXMgYmVlbiBjYWxsZWQKQEAgLTEwMjgsOCArMTAwNiwxOSBAQAogdm9pZCBiYXRhZHZfc29mdGlmX2Rlc3Ryb3lfc3lzZnMoc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2UpCiB7CiAJc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHNvZnRfaWZhY2UpOworCXN0cnVjdCBiYXRhZHZfc29mdGlmX3ZsYW4gKnZsYW47CiAKLQlxdWV1ZV93b3JrKGJhdGFkdl9ldmVudF93b3JrcXVldWUsICZiYXRfcHJpdi0+Y2xlYW51cF93b3JrKTsKKwlBU1NFUlRfUlROTCgpOworCisJLyogZGVzdHJveSB0aGUgInVudGFnZ2VkIiBWTEFOICovCisJdmxhbiA9IGJhdGFkdl9zb2Z0aWZfdmxhbl9nZXQoYmF0X3ByaXYsIEJBVEFEVl9OT19GTEFHUyk7CisJaWYgKHZsYW4pIHsKKwkJYmF0YWR2X3NvZnRpZl9kZXN0cm95X3ZsYW4oYmF0X3ByaXYsIHZsYW4pOworCQliYXRhZHZfc29mdGlmX3ZsYW5fcHV0KHZsYW4pOworCX0KKworCWJhdGFkdl9zeXNmc19kZWxfbWVzaGlmKHNvZnRfaWZhY2UpOworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKHNvZnRfaWZhY2UpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L3N5c2ZzLmMgYi9uZXQvYmF0bWFuLWFkdi9zeXNmcy5jCmluZGV4IGZlOWNhOTQuLjAyZDk2ZjIgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L3N5c2ZzLmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvc3lzZnMuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCiAjaW5jbHVkZSAiYnJpZGdlX2xvb3BfYXZvaWRhbmNlLmgiCiAjaW5jbHVkZSAiZGlzdHJpYnV0ZWQtYXJwLXRhYmxlLmgiCkBAIC00MjgsNiArNDI5LDEzIEBACiAJc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiA9IGJhdGFkdl9rb2JqX3RvX2JhdHByaXYoa29iaik7CiAJaW50IGJ5dGVzX3dyaXR0ZW47CiAKKwkvKiBHVyBtb2RlIGlzIG5vdCBhdmFpbGFibGUgaWYgdGhlIHJvdXRpbmcgYWxnb3JpdGhtIGluIHVzZSBkb2VzIG5vdAorCSAqIGltcGxlbWVudCB0aGUgR1cgQVBJCisJICovCisJaWYgKCFiYXRfcHJpdi0+YWxnb19vcHMtPmd3LmdldF9iZXN0X2d3X25vZGUgfHwKKwkgICAgIWJhdF9wcml2LT5hbGdvX29wcy0+Z3cuaXNfZWxpZ2libGUpCisJCXJldHVybiAtRU5PRU5UOworCiAJc3dpdGNoIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmd3Lm1vZGUpKSB7CiAJY2FzZSBCQVRBRFZfR1dfTU9ERV9DTElFTlQ6CiAJCWJ5dGVzX3dyaXR0ZW4gPSBzcHJpbnRmKGJ1ZmYsICIlc1xuIiwKQEAgLTQ1NSw2ICs0NjMsMTMgQEAKIAljaGFyICpjdXJyX2d3X21vZGVfc3RyOwogCWludCBnd19tb2RlX3RtcCA9IC0xOwogCisJLyogdG9nZ2xpbmcgR1cgbW9kZSBpcyBhbGxvd2VkIG9ubHkgaWYgdGhlIHJvdXRpbmcgYWxnb3JpdGhtIGluIHVzZQorCSAqIHByb3ZpZGVzIHRoZSBHVyBBUEkKKwkgKi8KKwlpZiAoIWJhdF9wcml2LT5hbGdvX29wcy0+Z3cuZ2V0X2Jlc3RfZ3dfbm9kZSB8fAorCSAgICAhYmF0X3ByaXYtPmFsZ29fb3BzLT5ndy5pc19lbGlnaWJsZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlpZiAoYnVmZltjb3VudCAtIDFdID09ICdcbicpCiAJCWJ1ZmZbY291bnQgLSAxXSA9ICdcMCc7CiAKQEAgLTUxNCw2ICs1MjksNTAgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IGJhdGFkdl9zaG93X2d3X3NlbF9jbGFzcyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkJc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmZikKK3sKKwlzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2ID0gYmF0YWR2X2tvYmpfdG9fYmF0cHJpdihrb2JqKTsKKworCS8qIEdXIHNlbGVjdGlvbiBjbGFzcyBpcyBub3QgYXZhaWxhYmxlIGlmIHRoZSByb3V0aW5nIGFsZ29yaXRobSBpbiB1c2UKKwkgKiBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIEdXIEFQSQorCSAqLworCWlmICghYmF0X3ByaXYtPmFsZ29fb3BzLT5ndy5nZXRfYmVzdF9nd19ub2RlIHx8CisJICAgICFiYXRfcHJpdi0+YWxnb19vcHMtPmd3LmlzX2VsaWdpYmxlKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWlmIChiYXRfcHJpdi0+YWxnb19vcHMtPmd3LnNob3dfc2VsX2NsYXNzKQorCQlyZXR1cm4gYmF0X3ByaXYtPmFsZ29fb3BzLT5ndy5zaG93X3NlbF9jbGFzcyhiYXRfcHJpdiwgYnVmZik7CisKKwlyZXR1cm4gc3ByaW50ZihidWZmLCAiJWlcbiIsIGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Z3cuc2VsX2NsYXNzKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGJhdGFkdl9zdG9yZV9nd19zZWxfY2xhc3Moc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJCSBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWZmLAorCQkJCQkgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYgPSBiYXRhZHZfa29ial90b19iYXRwcml2KGtvYmopOworCisJLyogc2V0dGluZyB0aGUgR1cgc2VsZWN0aW9uIGNsYXNzIGlzIGFsbG93ZWQgb25seSBpZiB0aGUgcm91dGluZworCSAqIGFsZ29yaXRobSBpbiB1c2UgaW1wbGVtZW50cyB0aGUgR1cgQVBJCisJICovCisJaWYgKCFiYXRfcHJpdi0+YWxnb19vcHMtPmd3LmdldF9iZXN0X2d3X25vZGUgfHwKKwkgICAgIWJhdF9wcml2LT5hbGdvX29wcy0+Z3cuaXNfZWxpZ2libGUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGJ1ZmZbY291bnQgLSAxXSA9PSAnXG4nKQorCQlidWZmW2NvdW50IC0gMV0gPSAnXDAnOworCisJaWYgKGJhdF9wcml2LT5hbGdvX29wcy0+Z3cuc3RvcmVfc2VsX2NsYXNzKQorCQlyZXR1cm4gYmF0X3ByaXYtPmFsZ29fb3BzLT5ndy5zdG9yZV9zZWxfY2xhc3MoYmF0X3ByaXYsIGJ1ZmYsCisJCQkJCQkJICAgICAgY291bnQpOworCisJcmV0dXJuIF9fYmF0YWR2X3N0b3JlX3VpbnRfYXR0cihidWZmLCBjb3VudCwgMSwgQkFUQURWX1RRX01BWF9WQUxVRSwKKwkJCQkJYmF0YWR2X3Bvc3RfZ3dfcmVzZWxlY3QsIGF0dHIsCisJCQkJCSZiYXRfcHJpdi0+Z3cuc2VsX2NsYXNzLAorCQkJCQliYXRfcHJpdi0+c29mdF9pZmFjZSk7Cit9CisKIHN0YXRpYyBzc2l6ZV90IGJhdGFkdl9zaG93X2d3X2J3aWR0aChzdHJ1Y3Qga29iamVjdCAqa29iaiwKIAkJCQkgICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZmYpCiB7CkBAIC02MjUsOCArNjg0LDggQEAKIAkJICAgICAyICogQkFUQURWX0pJVFRFUiwgSU5UX01BWCwgTlVMTCk7CiBCQVRBRFZfQVRUUl9TSUZfVUlOVChob3BfcGVuYWx0eSwgaG9wX3BlbmFsdHksIFNfSVJVR08gfCBTX0lXVVNSLCAwLAogCQkgICAgIEJBVEFEVl9UUV9NQVhfVkFMVUUsIE5VTEwpOwotQkFUQURWX0FUVFJfU0lGX1VJTlQoZ3dfc2VsX2NsYXNzLCBndy5zZWxfY2xhc3MsIFNfSVJVR08gfCBTX0lXVVNSLCAxLAotCQkgICAgIEJBVEFEVl9UUV9NQVhfVkFMVUUsIGJhdGFkdl9wb3N0X2d3X3Jlc2VsZWN0KTsKK3N0YXRpYyBCQVRBRFZfQVRUUihnd19zZWxfY2xhc3MsIFNfSVJVR08gfCBTX0lXVVNSLCBiYXRhZHZfc2hvd19nd19zZWxfY2xhc3MsCisJCSAgIGJhdGFkdl9zdG9yZV9nd19zZWxfY2xhc3MpOwogc3RhdGljIEJBVEFEVl9BVFRSKGd3X2JhbmR3aWR0aCwgU19JUlVHTyB8IFNfSVdVU1IsIGJhdGFkdl9zaG93X2d3X2J3aWR0aCwKIAkJICAgYmF0YWR2X3N0b3JlX2d3X2J3aWR0aCk7CiAjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfTUNBU1QKQEAgLTcxMiw2ICs3NzEsOCBAQAogCWZvciAoYmF0X2F0dHIgPSBiYXRhZHZfbWVzaF9hdHRyczsgKmJhdF9hdHRyOyArK2JhdF9hdHRyKQogCQlzeXNmc19yZW1vdmVfZmlsZShiYXRfcHJpdi0+bWVzaF9vYmosICYoKCpiYXRfYXR0ciktPmF0dHIpKTsKIAorCWtvYmplY3RfdWV2ZW50KGJhdF9wcml2LT5tZXNoX29iaiwgS09CSl9SRU1PVkUpOworCWtvYmplY3RfZGVsKGJhdF9wcml2LT5tZXNoX29iaik7CiAJa29iamVjdF9wdXQoYmF0X3ByaXYtPm1lc2hfb2JqKTsKIAliYXRfcHJpdi0+bWVzaF9vYmogPSBOVUxMOwogb3V0OgpAQCAtNzI2LDYgKzc4Nyw4IEBACiAJZm9yIChiYXRfYXR0ciA9IGJhdGFkdl9tZXNoX2F0dHJzOyAqYmF0X2F0dHI7ICsrYmF0X2F0dHIpCiAJCXN5c2ZzX3JlbW92ZV9maWxlKGJhdF9wcml2LT5tZXNoX29iaiwgJigoKmJhdF9hdHRyKS0+YXR0cikpOwogCisJa29iamVjdF91ZXZlbnQoYmF0X3ByaXYtPm1lc2hfb2JqLCBLT0JKX1JFTU9WRSk7CisJa29iamVjdF9kZWwoYmF0X3ByaXYtPm1lc2hfb2JqKTsKIAlrb2JqZWN0X3B1dChiYXRfcHJpdi0+bWVzaF9vYmopOwogCWJhdF9wcml2LT5tZXNoX29iaiA9IE5VTEw7CiB9CkBAIC03ODEsNiArODQ0LDEwIEBACiAJZm9yIChiYXRfYXR0ciA9IGJhdGFkdl92bGFuX2F0dHJzOyAqYmF0X2F0dHI7ICsrYmF0X2F0dHIpCiAJCXN5c2ZzX3JlbW92ZV9maWxlKHZsYW4tPmtvYmosICYoKCpiYXRfYXR0ciktPmF0dHIpKTsKIAorCWlmICh2bGFuLT5rb2JqICE9IGJhdF9wcml2LT5tZXNoX29iaikgeworCQlrb2JqZWN0X3VldmVudCh2bGFuLT5rb2JqLCBLT0JKX1JFTU9WRSk7CisJCWtvYmplY3RfZGVsKHZsYW4tPmtvYmopOworCX0KIAlrb2JqZWN0X3B1dCh2bGFuLT5rb2JqKTsKIAl2bGFuLT5rb2JqID0gTlVMTDsKIG91dDoKQEAgLTgwMCw2ICs4NjcsMTAgQEAKIAlmb3IgKGJhdF9hdHRyID0gYmF0YWR2X3ZsYW5fYXR0cnM7ICpiYXRfYXR0cjsgKytiYXRfYXR0cikKIAkJc3lzZnNfcmVtb3ZlX2ZpbGUodmxhbi0+a29iaiwgJigoKmJhdF9hdHRyKS0+YXR0cikpOwogCisJaWYgKHZsYW4tPmtvYmogIT0gYmF0X3ByaXYtPm1lc2hfb2JqKSB7CisJCWtvYmplY3RfdWV2ZW50KHZsYW4tPmtvYmosIEtPQkpfUkVNT1ZFKTsKKwkJa29iamVjdF9kZWwodmxhbi0+a29iaik7CisJfQogCWtvYmplY3RfcHV0KHZsYW4tPmtvYmopOwogCXZsYW4tPmtvYmogPSBOVUxMOwogfQpAQCAtODI4LDMxICs4OTksMzEgQEAKIAlyZXR1cm4gbGVuZ3RoOwogfQogCi1zdGF0aWMgc3NpemVfdCBiYXRhZHZfc3RvcmVfbWVzaF9pZmFjZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkgICAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmZiwKLQkJCQkgICAgICAgc2l6ZV90IGNvdW50KQorLyoqCisgKiBiYXRhZHZfc3RvcmVfbWVzaF9pZmFjZV9maW5pc2ggLSBzdG9yZSBuZXcgaGFyZGlmIG1lc2hfaWZhY2Ugc3RhdGUKKyAqIEBuZXRfZGV2OiBuZXRkZXZpY2UgdG8gYWRkL3JlbW92ZSB0by9mcm9tIGJhdG1hbi1hZHYgc29mdC1pbnRlcmZhY2UKKyAqIEBpZm5hbWU6IG5hbWUgb2Ygc29mdC1pbnRlcmZhY2UgdG8gbW9kaWZ5CisgKgorICogQ2hhbmdlcyB0aGUgcGFydHMgb2YgdGhlIGhhcmQrc29mdCBpbnRlcmZhY2Ugd2hpY2ggY2FuIG5vdCBiZSBtb2RpZmllZCB1bmRlcgorICogc3lzZnMgbG9jayAodG8gcHJldmVudCBkZWFkbG9jayBzaXR1YXRpb25zKS4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgMCA8IG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBiYXRhZHZfc3RvcmVfbWVzaF9pZmFjZV9maW5pc2goc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsCisJCQkJCSAgY2hhciBpZm5hbWVbSUZOQU1TSVpdKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gYmF0YWR2X2tvYmpfdG9fbmV0ZGV2KGtvYmopOwogCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQobmV0X2Rldik7CiAJc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpoYXJkX2lmYWNlOwotCWludCBzdGF0dXNfdG1wID0gLTE7Ci0JaW50IHJldCA9IGNvdW50OworCWludCBzdGF0dXNfdG1wOworCWludCByZXQgPSAwOworCisJQVNTRVJUX1JUTkwoKTsKIAogCWhhcmRfaWZhY2UgPSBiYXRhZHZfaGFyZGlmX2dldF9ieV9uZXRkZXYobmV0X2Rldik7CiAJaWYgKCFoYXJkX2lmYWNlKQotCQlyZXR1cm4gY291bnQ7CisJCXJldHVybiAwOwogCi0JaWYgKGJ1ZmZbY291bnQgLSAxXSA9PSAnXG4nKQotCQlidWZmW2NvdW50IC0gMV0gPSAnXDAnOwotCi0JaWYgKHN0cmxlbihidWZmKSA+PSBJRk5BTVNJWikgewotCQlwcl9lcnIoIkludmFsaWQgcGFyYW1ldGVyIGZvciAnbWVzaF9pZmFjZScgc2V0dGluZyByZWNlaXZlZDogaW50ZXJmYWNlIG5hbWUgdG9vIGxvbmcgJyVzJ1xuIiwKLQkJICAgICAgIGJ1ZmYpOwotCQliYXRhZHZfaGFyZGlmX3B1dChoYXJkX2lmYWNlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHN0cm5jbXAoYnVmZiwgIm5vbmUiLCA0KSA9PSAwKQorCWlmIChzdHJuY21wKGlmbmFtZSwgIm5vbmUiLCA0KSA9PSAwKQogCQlzdGF0dXNfdG1wID0gQkFUQURWX0lGX05PVF9JTl9VU0U7CiAJZWxzZQogCQlzdGF0dXNfdG1wID0gQkFUQURWX0lGX0lfV0FOVF9ZT1U7CkBAIC04NjEsMTUgKzkzMiwxMyBAQAogCQlnb3RvIG91dDsKIAogCWlmICgoaGFyZF9pZmFjZS0+c29mdF9pZmFjZSkgJiYKLQkgICAgKHN0cm5jbXAoaGFyZF9pZmFjZS0+c29mdF9pZmFjZS0+bmFtZSwgYnVmZiwgSUZOQU1TSVopID09IDApKQorCSAgICAoc3RybmNtcChoYXJkX2lmYWNlLT5zb2Z0X2lmYWNlLT5uYW1lLCBpZm5hbWUsIElGTkFNU0laKSA9PSAwKSkKIAkJZ290byBvdXQ7CiAKLQlydG5sX2xvY2soKTsKLQogCWlmIChzdGF0dXNfdG1wID09IEJBVEFEVl9JRl9OT1RfSU5fVVNFKSB7CiAJCWJhdGFkdl9oYXJkaWZfZGlzYWJsZV9pbnRlcmZhY2UoaGFyZF9pZmFjZSwKIAkJCQkJCUJBVEFEVl9JRl9DTEVBTlVQX0FVVE8pOwotCQlnb3RvIHVubG9jazsKKwkJZ290byBvdXQ7CiAJfQogCiAJLyogaWYgdGhlIGludGVyZmFjZSBhbHJlYWR5IGlzIGluIHVzZSAqLwpAQCAtODc3LDE1ICs5NDYsNzEgQEAKIAkJYmF0YWR2X2hhcmRpZl9kaXNhYmxlX2ludGVyZmFjZShoYXJkX2lmYWNlLAogCQkJCQkJQkFUQURWX0lGX0NMRUFOVVBfQVVUTyk7CiAKLQlyZXQgPSBiYXRhZHZfaGFyZGlmX2VuYWJsZV9pbnRlcmZhY2UoaGFyZF9pZmFjZSwgbmV0LCBidWZmKTsKLQotdW5sb2NrOgotCXJ0bmxfdW5sb2NrKCk7CisJcmV0ID0gYmF0YWR2X2hhcmRpZl9lbmFibGVfaW50ZXJmYWNlKGhhcmRfaWZhY2UsIG5ldCwgaWZuYW1lKTsKIG91dDoKIAliYXRhZHZfaGFyZGlmX3B1dChoYXJkX2lmYWNlKTsKIAlyZXR1cm4gcmV0OwogfQogCisvKioKKyAqIGJhdGFkdl9zdG9yZV9tZXNoX2lmYWNlX3dvcmsgLSBzdG9yZSBuZXcgaGFyZGlmIG1lc2hfaWZhY2Ugc3RhdGUKKyAqIEB3b3JrOiB3b3JrIHF1ZXVlIGl0ZW0KKyAqCisgKiBDaGFuZ2VzIHRoZSBwYXJ0cyBvZiB0aGUgaGFyZCtzb2Z0IGludGVyZmFjZSB3aGljaCBjYW4gbm90IGJlIG1vZGlmaWVkIHVuZGVyCisgKiBzeXNmcyBsb2NrICh0byBwcmV2ZW50IGRlYWRsb2NrIHNpdHVhdGlvbnMpLgorICovCitzdGF0aWMgdm9pZCBiYXRhZHZfc3RvcmVfbWVzaF9pZmFjZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYmF0YWR2X3N0b3JlX21lc2hfd29yayAqc3RvcmVfd29yazsKKwlpbnQgcmV0OworCisJc3RvcmVfd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYmF0YWR2X3N0b3JlX21lc2hfd29yaywgd29yayk7CisKKwlydG5sX2xvY2soKTsKKwlyZXQgPSBiYXRhZHZfc3RvcmVfbWVzaF9pZmFjZV9maW5pc2goc3RvcmVfd29yay0+bmV0X2RldiwKKwkJCQkJICAgICBzdG9yZV93b3JrLT5zb2Z0X2lmYWNlX25hbWUpOworCXJ0bmxfdW5sb2NrKCk7CisKKwlpZiAocmV0IDwgMCkKKwkJcHJfZXJyKCJGYWlsZWQgdG8gc3RvcmUgbmV3IG1lc2hfaWZhY2Ugc3RhdGUgJXMgZm9yICVzOiAlZFxuIiwKKwkJICAgICAgIHN0b3JlX3dvcmstPnNvZnRfaWZhY2VfbmFtZSwgc3RvcmVfd29yay0+bmV0X2Rldi0+bmFtZSwKKwkJICAgICAgIHJldCk7CisKKwlkZXZfcHV0KHN0b3JlX3dvcmstPm5ldF9kZXYpOworCWtmcmVlKHN0b3JlX3dvcmspOworfQorCitzdGF0aWMgc3NpemVfdCBiYXRhZHZfc3RvcmVfbWVzaF9pZmFjZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmZiwKKwkJCQkgICAgICAgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gYmF0YWR2X2tvYmpfdG9fbmV0ZGV2KGtvYmopOworCXN0cnVjdCBiYXRhZHZfc3RvcmVfbWVzaF93b3JrICpzdG9yZV93b3JrOworCisJaWYgKGJ1ZmZbY291bnQgLSAxXSA9PSAnXG4nKQorCQlidWZmW2NvdW50IC0gMV0gPSAnXDAnOworCisJaWYgKHN0cmxlbihidWZmKSA+PSBJRk5BTVNJWikgeworCQlwcl9lcnIoIkludmFsaWQgcGFyYW1ldGVyIGZvciAnbWVzaF9pZmFjZScgc2V0dGluZyByZWNlaXZlZDogaW50ZXJmYWNlIG5hbWUgdG9vIGxvbmcgJyVzJ1xuIiwKKwkJICAgICAgIGJ1ZmYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdG9yZV93b3JrID0ga21hbGxvYyhzaXplb2YoKnN0b3JlX3dvcmspLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0b3JlX3dvcmspCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2X2hvbGQobmV0X2Rldik7CisJSU5JVF9XT1JLKCZzdG9yZV93b3JrLT53b3JrLCBiYXRhZHZfc3RvcmVfbWVzaF9pZmFjZV93b3JrKTsKKwlzdG9yZV93b3JrLT5uZXRfZGV2ID0gbmV0X2RldjsKKwlzdHJsY3B5KHN0b3JlX3dvcmstPnNvZnRfaWZhY2VfbmFtZSwgYnVmZiwKKwkJc2l6ZW9mKHN0b3JlX3dvcmstPnNvZnRfaWZhY2VfbmFtZSkpOworCisJcXVldWVfd29yayhiYXRhZHZfZXZlbnRfd29ya3F1ZXVlLCAmc3RvcmVfd29yay0+d29yayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKIHN0YXRpYyBzc2l6ZV90IGJhdGFkdl9zaG93X2lmYWNlX3N0YXR1cyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKIAkJCQkJc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmZikKIHsKQEAgLTEwNDgsNiArMTE3Myw4IEBACiAKIHZvaWQgYmF0YWR2X3N5c2ZzX2RlbF9oYXJkaWYoc3RydWN0IGtvYmplY3QgKipoYXJkaWZfb2JqKQogeworCWtvYmplY3RfdWV2ZW50KCpoYXJkaWZfb2JqLCBLT0JKX1JFTU9WRSk7CisJa29iamVjdF9kZWwoKmhhcmRpZl9vYmopOwogCWtvYmplY3RfcHV0KCpoYXJkaWZfb2JqKTsKIAkqaGFyZGlmX29iaiA9IE5VTEw7CiB9CmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi90cmFuc2xhdGlvbi10YWJsZS5jIGIvbmV0L2JhdG1hbi1hZHYvdHJhbnNsYXRpb24tdGFibGUuYwppbmRleCA3ZTZkZjdhLi43ZjY2MzA5IDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi90cmFuc2xhdGlvbi10YWJsZS5jCisrKyBiL25ldC9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmMKQEAgLTIyLDEyICsyMiwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9nZW5lcmljLmg+CisjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYzMyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMzUsMjUgKzM3LDM5IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkZXAuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvYmF0bWFuX2Fkdi5oPgogCiAjaW5jbHVkZSAiYnJpZGdlX2xvb3BfYXZvaWRhbmNlLmgiCiAjaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKICNpbmNsdWRlICJoYXNoLmgiCiAjaW5jbHVkZSAibG9nLmgiCiAjaW5jbHVkZSAibXVsdGljYXN0LmgiCisjaW5jbHVkZSAibmV0bGluay5oIgogI2luY2x1ZGUgIm9yaWdpbmF0b3IuaCIKICNpbmNsdWRlICJwYWNrZXQuaCIKICNpbmNsdWRlICJzb2Z0LWludGVyZmFjZS5oIgogI2luY2x1ZGUgInR2bHYuaCIKIAorc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpiYXRhZHZfdGxfY2FjaGUgX19yZWFkX21vc3RseTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqYmF0YWR2X3RnX2NhY2hlIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmJhdGFkdl90dF9vcmlnX2NhY2hlIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmJhdGFkdl90dF9jaGFuZ2VfY2FjaGUgX19yZWFkX21vc3RseTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqYmF0YWR2X3R0X3JlcV9jYWNoZSBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpiYXRhZHZfdHRfcm9hbV9jYWNoZSBfX3JlYWRfbW9zdGx5OworCiAvKiBoYXNoIGNsYXNzIGtleXMgKi8KIHN0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgYmF0YWR2X3R0X2xvY2FsX2hhc2hfbG9ja19jbGFzc19rZXk7CiBzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGJhdGFkdl90dF9nbG9iYWxfaGFzaF9sb2NrX2NsYXNzX2tleTsKQEAgLTIwNSw2ICsyMjEsMjAgQEAKIH0KIAogLyoqCisgKiBiYXRhZHZfdHRfbG9jYWxfZW50cnlfZnJlZV9yY3UgLSBmcmVlIHRoZSB0dF9sb2NhbF9lbnRyeQorICogQHJjdTogcmN1IHBvaW50ZXIgb2YgdGhlIHR0X2xvY2FsX2VudHJ5CisgKi8KK3N0YXRpYyB2b2lkIGJhdGFkdl90dF9sb2NhbF9lbnRyeV9mcmVlX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKK3sKKwlzdHJ1Y3QgYmF0YWR2X3R0X2xvY2FsX2VudHJ5ICp0dF9sb2NhbF9lbnRyeTsKKworCXR0X2xvY2FsX2VudHJ5ID0gY29udGFpbmVyX29mKHJjdSwgc3RydWN0IGJhdGFkdl90dF9sb2NhbF9lbnRyeSwKKwkJCQkgICAgICBjb21tb24ucmN1KTsKKworCWttZW1fY2FjaGVfZnJlZShiYXRhZHZfdGxfY2FjaGUsIHR0X2xvY2FsX2VudHJ5KTsKK30KKworLyoqCiAgKiBiYXRhZHZfdHRfbG9jYWxfZW50cnlfcmVsZWFzZSAtIHJlbGVhc2UgdHRfbG9jYWxfZW50cnkgZnJvbSBsaXN0cyBhbmQgcXVldWUKICAqICBmb3IgZnJlZSBhZnRlciByY3UgZ3JhY2UgcGVyaW9kCiAgKiBAcmVmOiBrcmVmIHBvaW50ZXIgb2YgdGhlIG5jX25vZGUKQEAgLTIxOCw3ICsyNDgsNyBAQAogCiAJYmF0YWR2X3NvZnRpZl92bGFuX3B1dCh0dF9sb2NhbF9lbnRyeS0+dmxhbik7CiAKLQlrZnJlZV9yY3UodHRfbG9jYWxfZW50cnksIGNvbW1vbi5yY3UpOworCWNhbGxfcmN1KCZ0dF9sb2NhbF9lbnRyeS0+Y29tbW9uLnJjdSwgYmF0YWR2X3R0X2xvY2FsX2VudHJ5X2ZyZWVfcmN1KTsKIH0KIAogLyoqCkBAIC0yMzQsNiArMjY0LDIwIEBACiB9CiAKIC8qKgorICogYmF0YWR2X3R0X2dsb2JhbF9lbnRyeV9mcmVlX3JjdSAtIGZyZWUgdGhlIHR0X2dsb2JhbF9lbnRyeQorICogQHJjdTogcmN1IHBvaW50ZXIgb2YgdGhlIHR0X2dsb2JhbF9lbnRyeQorICovCitzdGF0aWMgdm9pZCBiYXRhZHZfdHRfZ2xvYmFsX2VudHJ5X2ZyZWVfcmN1KHN0cnVjdCByY3VfaGVhZCAqcmN1KQoreworCXN0cnVjdCBiYXRhZHZfdHRfZ2xvYmFsX2VudHJ5ICp0dF9nbG9iYWxfZW50cnk7CisKKwl0dF9nbG9iYWxfZW50cnkgPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3QgYmF0YWR2X3R0X2dsb2JhbF9lbnRyeSwKKwkJCQkgICAgICAgY29tbW9uLnJjdSk7CisKKwlrbWVtX2NhY2hlX2ZyZWUoYmF0YWR2X3RnX2NhY2hlLCB0dF9nbG9iYWxfZW50cnkpOworfQorCisvKioKICAqIGJhdGFkdl90dF9nbG9iYWxfZW50cnlfcmVsZWFzZSAtIHJlbGVhc2UgdHRfZ2xvYmFsX2VudHJ5IGZyb20gbGlzdHMgYW5kIHF1ZXVlCiAgKiAgZm9yIGZyZWUgYWZ0ZXIgcmN1IGdyYWNlIHBlcmlvZAogICogQHJlZjoga3JlZiBwb2ludGVyIG9mIHRoZSBuY19ub2RlCkBAIC0yNDYsNyArMjkwLDggQEAKIAkJCQkgICAgICAgY29tbW9uLnJlZmNvdW50KTsKIAogCWJhdGFkdl90dF9nbG9iYWxfZGVsX29yaWdfbGlzdCh0dF9nbG9iYWxfZW50cnkpOwotCWtmcmVlX3JjdSh0dF9nbG9iYWxfZW50cnksIGNvbW1vbi5yY3UpOworCisJY2FsbF9yY3UoJnR0X2dsb2JhbF9lbnRyeS0+Y29tbW9uLnJjdSwgYmF0YWR2X3R0X2dsb2JhbF9lbnRyeV9mcmVlX3JjdSk7CiB9CiAKIC8qKgpAQCAtMzg0LDYgKzQyOSwxOSBAQAogfQogCiAvKioKKyAqIGJhdGFkdl90dF9vcmlnX2xpc3RfZW50cnlfZnJlZV9yY3UgLSBmcmVlIHRoZSBvcmlnX2VudHJ5CisgKiBAcmN1OiByY3UgcG9pbnRlciBvZiB0aGUgb3JpZ19lbnRyeQorICovCitzdGF0aWMgdm9pZCBiYXRhZHZfdHRfb3JpZ19saXN0X2VudHJ5X2ZyZWVfcmN1KHN0cnVjdCByY3VfaGVhZCAqcmN1KQoreworCXN0cnVjdCBiYXRhZHZfdHRfb3JpZ19saXN0X2VudHJ5ICpvcmlnX2VudHJ5OworCisJb3JpZ19lbnRyeSA9IGNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCBiYXRhZHZfdHRfb3JpZ19saXN0X2VudHJ5LCByY3UpOworCisJa21lbV9jYWNoZV9mcmVlKGJhdGFkdl90dF9vcmlnX2NhY2hlLCBvcmlnX2VudHJ5KTsKK30KKworLyoqCiAgKiBiYXRhZHZfdHRfb3JpZ19saXN0X2VudHJ5X3JlbGVhc2UgLSByZWxlYXNlIHR0IG9yaWcgZW50cnkgZnJvbSBsaXN0cyBhbmQKICAqICBxdWV1ZSBmb3IgZnJlZSBhZnRlciByY3UgZ3JhY2UgcGVyaW9kCiAgKiBAcmVmOiBrcmVmIHBvaW50ZXIgb2YgdGhlIHR0IG9yaWcgZW50cnkKQEAgLTM5Niw3ICs0NTQsNyBAQAogCQkJCSAgcmVmY291bnQpOwogCiAJYmF0YWR2X29yaWdfbm9kZV9wdXQob3JpZ19lbnRyeS0+b3JpZ19ub2RlKTsKLQlrZnJlZV9yY3Uob3JpZ19lbnRyeSwgcmN1KTsKKwljYWxsX3JjdSgmb3JpZ19lbnRyeS0+cmN1LCBiYXRhZHZfdHRfb3JpZ19saXN0X2VudHJ5X2ZyZWVfcmN1KTsKIH0KIAogLyoqCkBAIC00MjYsNyArNDg0LDcgQEAKIAlib29sIGV2ZW50X3JlbW92ZWQgPSBmYWxzZTsKIAlib29sIGRlbF9vcF9yZXF1ZXN0ZWQsIGRlbF9vcF9lbnRyeTsKIAotCXR0X2NoYW5nZV9ub2RlID0ga21hbGxvYyhzaXplb2YoKnR0X2NoYW5nZV9ub2RlKSwgR0ZQX0FUT01JQyk7CisJdHRfY2hhbmdlX25vZGUgPSBrbWVtX2NhY2hlX2FsbG9jKGJhdGFkdl90dF9jaGFuZ2VfY2FjaGUsIEdGUF9BVE9NSUMpOwogCWlmICghdHRfY2hhbmdlX25vZGUpCiAJCXJldHVybjsKIApAQCAtNDY3LDggKzUyNSw4IEBACiAJCWNvbnRpbnVlOwogZGVsOgogCQlsaXN0X2RlbCgmZW50cnktPmxpc3QpOwotCQlrZnJlZShlbnRyeSk7Ci0JCWtmcmVlKHR0X2NoYW5nZV9ub2RlKTsKKwkJa21lbV9jYWNoZV9mcmVlKGJhdGFkdl90dF9jaGFuZ2VfY2FjaGUsIGVudHJ5KTsKKwkJa21lbV9jYWNoZV9mcmVlKGJhdGFkdl90dF9jaGFuZ2VfY2FjaGUsIHR0X2NoYW5nZV9ub2RlKTsKIAkJZXZlbnRfcmVtb3ZlZCA9IHRydWU7CiAJCWdvdG8gdW5sb2NrOwogCX0KQEAgLTY0Niw3ICs3MDQsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQl0dF9sb2NhbCA9IGttYWxsb2Moc2l6ZW9mKCp0dF9sb2NhbCksIEdGUF9BVE9NSUMpOworCXR0X2xvY2FsID0ga21lbV9jYWNoZV9hbGxvYyhiYXRhZHZfdGxfY2FjaGUsIEdGUF9BVE9NSUMpOwogCWlmICghdHRfbG9jYWwpCiAJCWdvdG8gb3V0OwogCkBAIC02NTYsNyArNzE0LDcgQEAKIAkJbmV0X3JhdGVsaW1pdGVkX2Z1bmN0aW9uKGJhdGFkdl9pbmZvLCBzb2Z0X2lmYWNlLAogCQkJCQkgImFkZGluZyBUVCBsb2NhbCBlbnRyeSAlcE0gdG8gbm9uLWV4aXN0ZW50IFZMQU4gJWRcbiIsCiAJCQkJCSBhZGRyLCBCQVRBRFZfUFJJTlRfVklEKHZpZCkpOwotCQlrZnJlZSh0dF9sb2NhbCk7CisJCWttZW1fY2FjaGVfZnJlZShiYXRhZHZfdGxfY2FjaGUsIHR0X2xvY2FsKTsKIAkJdHRfbG9jYWwgPSBOVUxMOwogCQlnb3RvIG91dDsKIAl9CkBAIC02NzYsNyArNzM0LDYgQEAKIAlpZiAoYmF0YWR2X2lzX3dpZmlfbmV0ZGV2KGluX2RldikpCiAJCXR0X2xvY2FsLT5jb21tb24uZmxhZ3MgfD0gQkFUQURWX1RUX0NMSUVOVF9XSUZJOwogCWtyZWZfaW5pdCgmdHRfbG9jYWwtPmNvbW1vbi5yZWZjb3VudCk7Ci0Ja3JlZl9nZXQoJnR0X2xvY2FsLT5jb21tb24ucmVmY291bnQpOwogCXR0X2xvY2FsLT5sYXN0X3NlZW4gPSBqaWZmaWVzOwogCXR0X2xvY2FsLT5jb21tb24uYWRkZWRfYXQgPSB0dF9sb2NhbC0+bGFzdF9zZWVuOwogCXR0X2xvY2FsLT52bGFuID0gdmxhbjsKQEAgLTY4OCw2ICs3NDUsNyBAQAogCSAgICBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihhZGRyKSkKIAkJdHRfbG9jYWwtPmNvbW1vbi5mbGFncyB8PSBCQVRBRFZfVFRfQ0xJRU5UX05PUFVSR0U7CiAKKwlrcmVmX2dldCgmdHRfbG9jYWwtPmNvbW1vbi5yZWZjb3VudCk7CiAJaGFzaF9hZGRlZCA9IGJhdGFkdl9oYXNoX2FkZChiYXRfcHJpdi0+dHQubG9jYWxfaGFzaCwgYmF0YWR2X2NvbXBhcmVfdHQsCiAJCQkJICAgICBiYXRhZHZfY2hvb3NlX3R0LCAmdHRfbG9jYWwtPmNvbW1vbiwKIAkJCQkgICAgICZ0dF9sb2NhbC0+Y29tbW9uLmhhc2hfZW50cnkpOwpAQCAtOTU5LDcgKzEwMTcsNyBAQAogCQkJdHRfZGlmZl9lbnRyaWVzX2NvdW50Kys7CiAJCX0KIAkJbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKLQkJa2ZyZWUoZW50cnkpOworCQlrbWVtX2NhY2hlX2ZyZWUoYmF0YWR2X3R0X2NoYW5nZV9jYWNoZSwgZW50cnkpOwogCX0KIAlzcGluX3VubG9ja19iaCgmYmF0X3ByaXYtPnR0LmNoYW5nZXNfbGlzdF9sb2NrKTsKIApAQCAtOTg5LDYgKzEwNDcsNyBAQAogCWtmcmVlKHR0X2RhdGEpOwogfQogCisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUwogaW50IGJhdGFkdl90dF9sb2NhbF9zZXFfcHJpbnRfdGV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopc2VxLT5wcml2YXRlOwpAQCAtMTA1Niw2ICsxMTE1LDE2NSBAQAogCQliYXRhZHZfaGFyZGlmX3B1dChwcmltYXJ5X2lmKTsKIAlyZXR1cm4gMDsKIH0KKyNlbmRpZgorCisvKioKKyAqIGJhdGFkdl90dF9sb2NhbF9kdW1wX2VudHJ5IC0gRHVtcCBvbmUgVFQgbG9jYWwgZW50cnkgaW50byBhIG1lc3NhZ2UKKyAqIEBtc2cgOk5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBwb3J0aWQ6IFBvcnQgbWFraW5nIG5ldGxpbmsgcmVxdWVzdAorICogQHNlcTogU2VxdWVuY2UgbnVtYmVyIG9mIG5ldGxpbmsgbWVzc2FnZQorICogQGJhdF9wcml2OiBUaGUgYmF0IHByaXYgd2l0aCBhbGwgdGhlIHNvZnQgaW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKiBAY29tbW9uOiB0dCBsb2NhbCAmIHR0IGdsb2JhbCBjb21tb24gZGF0YQorICoKKyAqIFJldHVybjogRXJyb3IgY29kZSwgb3IgMCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK2JhdGFkdl90dF9sb2NhbF9kdW1wX2VudHJ5KHN0cnVjdCBza19idWZmICptc2csIHUzMiBwb3J0aWQsIHUzMiBzZXEsCisJCQkgICBzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkJICAgc3RydWN0IGJhdGFkdl90dF9jb21tb25fZW50cnkgKmNvbW1vbikKK3sKKwl2b2lkICpoZHI7CisJc3RydWN0IGJhdGFkdl9zb2Z0aWZfdmxhbiAqdmxhbjsKKwlzdHJ1Y3QgYmF0YWR2X3R0X2xvY2FsX2VudHJ5ICpsb2NhbDsKKwl1bnNpZ25lZCBpbnQgbGFzdF9zZWVuX21zZWNzOworCXUzMiBjcmM7CisKKwlsb2NhbCA9IGNvbnRhaW5lcl9vZihjb21tb24sIHN0cnVjdCBiYXRhZHZfdHRfbG9jYWxfZW50cnksIGNvbW1vbik7CisJbGFzdF9zZWVuX21zZWNzID0gamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gbG9jYWwtPmxhc3Rfc2Vlbik7CisKKwl2bGFuID0gYmF0YWR2X3NvZnRpZl92bGFuX2dldChiYXRfcHJpdiwgY29tbW9uLT52aWQpOworCWlmICghdmxhbikKKwkJcmV0dXJuIDA7CisKKwljcmMgPSB2bGFuLT50dC5jcmM7CisKKwliYXRhZHZfc29mdGlmX3ZsYW5fcHV0KHZsYW4pOworCisJaGRyID0gZ2VubG1zZ19wdXQobXNnLCBwb3J0aWQsIHNlcSwgJmJhdGFkdl9uZXRsaW5rX2ZhbWlseSwKKwkJCSAgTkxNX0ZfTVVMVEksCisJCQkgIEJBVEFEVl9DTURfR0VUX1RSQU5TVEFCTEVfTE9DQUwpOworCWlmICghaGRyKQorCQlyZXR1cm4gLUVOT0JVRlM7CisKKwlpZiAobmxhX3B1dChtc2csIEJBVEFEVl9BVFRSX1RUX0FERFJFU1MsIEVUSF9BTEVOLCBjb21tb24tPmFkZHIpIHx8CisJICAgIG5sYV9wdXRfdTMyKG1zZywgQkFUQURWX0FUVFJfVFRfQ1JDMzIsIGNyYykgfHwKKwkgICAgbmxhX3B1dF91MTYobXNnLCBCQVRBRFZfQVRUUl9UVF9WSUQsIGNvbW1vbi0+dmlkKSB8fAorCSAgICBubGFfcHV0X3UzMihtc2csIEJBVEFEVl9BVFRSX1RUX0ZMQUdTLCBjb21tb24tPmZsYWdzKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlpZiAoIShjb21tb24tPmZsYWdzICYgQkFUQURWX1RUX0NMSUVOVF9OT1BVUkdFKSAmJgorCSAgICBubGFfcHV0X3UzMihtc2csIEJBVEFEVl9BVFRSX0xBU1RfU0VFTl9NU0VDUywgbGFzdF9zZWVuX21zZWNzKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CisJcmV0dXJuIDA7CisKKyBubGFfcHV0X2ZhaWx1cmU6CisJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworCXJldHVybiAtRU1TR1NJWkU7Cit9CisKKy8qKgorICogYmF0YWR2X3R0X2xvY2FsX2R1bXBfYnVja2V0IC0gRHVtcCBvbmUgVFQgbG9jYWwgYnVja2V0IGludG8gYSBtZXNzYWdlCisgKiBAbXNnOiBOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAcG9ydGlkOiBQb3J0IG1ha2luZyBuZXRsaW5rIHJlcXVlc3QKKyAqIEBzZXE6IFNlcXVlbmNlIG51bWJlciBvZiBuZXRsaW5rIG1lc3NhZ2UKKyAqIEBiYXRfcHJpdjogVGhlIGJhdCBwcml2IHdpdGggYWxsIHRoZSBzb2Z0IGludGVyZmFjZSBpbmZvcm1hdGlvbgorICogQGhlYWQ6IFBvaW50ZXIgdG8gdGhlIGxpc3QgY29udGFpbmluZyB0aGUgbG9jYWwgdHQgZW50cmllcworICogQGlkeF9zOiBOdW1iZXIgb2YgZW50cmllcyB0byBza2lwCisgKgorICogUmV0dXJuOiBFcnJvciBjb2RlLCBvciAwIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludAorYmF0YWR2X3R0X2xvY2FsX2R1bXBfYnVja2V0KHN0cnVjdCBza19idWZmICptc2csIHUzMiBwb3J0aWQsIHUzMiBzZXEsCisJCQkgICAgc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJCSAgICBzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCwgaW50ICppZHhfcykKK3sKKwlzdHJ1Y3QgYmF0YWR2X3R0X2NvbW1vbl9lbnRyeSAqY29tbW9uOworCWludCBpZHggPSAwOworCisJcmN1X3JlYWRfbG9jaygpOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjb21tb24sIGhlYWQsIGhhc2hfZW50cnkpIHsKKwkJaWYgKGlkeCsrIDwgKmlkeF9zKQorCQkJY29udGludWU7CisKKwkJaWYgKGJhdGFkdl90dF9sb2NhbF9kdW1wX2VudHJ5KG1zZywgcG9ydGlkLCBzZXEsIGJhdF9wcml2LAorCQkJCQkgICAgICAgY29tbW9uKSkgeworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQkqaWR4X3MgPSBpZHggLSAxOworCQkJcmV0dXJuIC1FTVNHU0laRTsKKwkJfQorCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCSppZHhfcyA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYmF0YWR2X3R0X2xvY2FsX2R1bXAgLSBEdW1wIFRUIGxvY2FsIGVudHJpZXMgaW50byBhIG1lc3NhZ2UKKyAqIEBtc2c6IE5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBjYjogUGFyYW1ldGVycyBmcm9tIHF1ZXJ5CisgKgorICogUmV0dXJuOiBFcnJvciBjb2RlLCBvciAwIG9uIHN1Y2Nlc3MKKyAqLworaW50IGJhdGFkdl90dF9sb2NhbF9kdW1wKHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChjYi0+c2tiLT5zayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2U7CisJc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdjsKKwlzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKnByaW1hcnlfaWYgPSBOVUxMOworCXN0cnVjdCBiYXRhZHZfaGFzaHRhYmxlICpoYXNoOworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCWludCByZXQ7CisJaW50IGlmaW5kZXg7CisJaW50IGJ1Y2tldCA9IGNiLT5hcmdzWzBdOworCWludCBpZHggPSBjYi0+YXJnc1sxXTsKKwlpbnQgcG9ydGlkID0gTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQ7CisKKwlpZmluZGV4ID0gYmF0YWR2X25ldGxpbmtfZ2V0X2lmaW5kZXgoY2ItPm5saCwgQkFUQURWX0FUVFJfTUVTSF9JRklOREVYKTsKKwlpZiAoIWlmaW5kZXgpCisJCXJldHVybiAtRUlOVkFMOworCisJc29mdF9pZmFjZSA9IGRldl9nZXRfYnlfaW5kZXgobmV0LCBpZmluZGV4KTsKKwlpZiAoIXNvZnRfaWZhY2UgfHwgIWJhdGFkdl9zb2Z0aWZfaXNfdmFsaWQoc29mdF9pZmFjZSkpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2lmYWNlKTsKKworCXByaW1hcnlfaWYgPSBiYXRhZHZfcHJpbWFyeV9pZl9nZXRfc2VsZWN0ZWQoYmF0X3ByaXYpOworCWlmICghcHJpbWFyeV9pZiB8fCBwcmltYXJ5X2lmLT5pZl9zdGF0dXMgIT0gQkFUQURWX0lGX0FDVElWRSkgeworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIG91dDsKKwl9CisKKwloYXNoID0gYmF0X3ByaXYtPnR0LmxvY2FsX2hhc2g7CisKKwl3aGlsZSAoYnVja2V0IDwgaGFzaC0+c2l6ZSkgeworCQloZWFkID0gJmhhc2gtPnRhYmxlW2J1Y2tldF07CisKKwkJaWYgKGJhdGFkdl90dF9sb2NhbF9kdW1wX2J1Y2tldChtc2csIHBvcnRpZCwgY2ItPm5saC0+bmxtc2dfc2VxLAorCQkJCQkJYmF0X3ByaXYsIGhlYWQsICZpZHgpKQorCQkJYnJlYWs7CisKKwkJYnVja2V0Kys7CisJfQorCisJcmV0ID0gbXNnLT5sZW47CisKKyBvdXQ6CisJaWYgKHByaW1hcnlfaWYpCisJCWJhdGFkdl9oYXJkaWZfcHV0KHByaW1hcnlfaWYpOworCWlmIChzb2Z0X2lmYWNlKQorCQlkZXZfcHV0KHNvZnRfaWZhY2UpOworCisJY2ItPmFyZ3NbMF0gPSBidWNrZXQ7CisJY2ItPmFyZ3NbMV0gPSBpZHg7CisKKwlyZXR1cm4gcmV0OworfQogCiBzdGF0aWMgdm9pZAogYmF0YWR2X3R0X2xvY2FsX3NldF9wZW5kaW5nKHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCkBAIC0xMjU5LDcgKzE0NzcsNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbnRyeSwgc2FmZSwgJmJhdF9wcml2LT50dC5jaGFuZ2VzX2xpc3QsCiAJCQkJIGxpc3QpIHsKIAkJbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKLQkJa2ZyZWUoZW50cnkpOworCQlrbWVtX2NhY2hlX2ZyZWUoYmF0YWR2X3R0X2NoYW5nZV9jYWNoZSwgZW50cnkpOwogCX0KIAogCWF0b21pY19zZXQoJmJhdF9wcml2LT50dC5sb2NhbF9jaGFuZ2VzLCAwKTsKQEAgLTEzNDEsNyArMTU1OSw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCW9yaWdfZW50cnkgPSBremFsbG9jKHNpemVvZigqb3JpZ19lbnRyeSksIEdGUF9BVE9NSUMpOworCW9yaWdfZW50cnkgPSBrbWVtX2NhY2hlX3phbGxvYyhiYXRhZHZfdHRfb3JpZ19jYWNoZSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFvcmlnX2VudHJ5KQogCQlnb3RvIG91dDsKIApAQCAtMTM1MSw5ICsxNTY5LDkgQEAKIAlvcmlnX2VudHJ5LT5vcmlnX25vZGUgPSBvcmlnX25vZGU7CiAJb3JpZ19lbnRyeS0+dHR2biA9IHR0dm47CiAJa3JlZl9pbml0KCZvcmlnX2VudHJ5LT5yZWZjb3VudCk7Ci0Ja3JlZl9nZXQoJm9yaWdfZW50cnktPnJlZmNvdW50KTsKIAogCXNwaW5fbG9ja19iaCgmdHRfZ2xvYmFsLT5saXN0X2xvY2spOworCWtyZWZfZ2V0KCZvcmlnX2VudHJ5LT5yZWZjb3VudCk7CiAJaGxpc3RfYWRkX2hlYWRfcmN1KCZvcmlnX2VudHJ5LT5saXN0LAogCQkJICAgJnR0X2dsb2JhbC0+b3JpZ19saXN0KTsKIAlzcGluX3VubG9ja19iaCgmdHRfZ2xvYmFsLT5saXN0X2xvY2spOwpAQCAtMTQxMSw3ICsxNjI5LDggQEAKIAkJZ290byBvdXQ7CiAKIAlpZiAoIXR0X2dsb2JhbF9lbnRyeSkgewotCQl0dF9nbG9iYWxfZW50cnkgPSBremFsbG9jKHNpemVvZigqdHRfZ2xvYmFsX2VudHJ5KSwgR0ZQX0FUT01JQyk7CisJCXR0X2dsb2JhbF9lbnRyeSA9IGttZW1fY2FjaGVfemFsbG9jKGJhdGFkdl90Z19jYWNoZSwKKwkJCQkJCSAgICBHRlBfQVRPTUlDKTsKIAkJaWYgKCF0dF9nbG9iYWxfZW50cnkpCiAJCQlnb3RvIG91dDsKIApAQCAtMTQyOCwxMyArMTY0NywxMyBAQAogCQlpZiAoZmxhZ3MgJiBCQVRBRFZfVFRfQ0xJRU5UX1JPQU0pCiAJCQl0dF9nbG9iYWxfZW50cnktPnJvYW1fYXQgPSBqaWZmaWVzOwogCQlrcmVmX2luaXQoJmNvbW1vbi0+cmVmY291bnQpOwotCQlrcmVmX2dldCgmY29tbW9uLT5yZWZjb3VudCk7CiAJCWNvbW1vbi0+YWRkZWRfYXQgPSBqaWZmaWVzOwogCiAJCUlOSVRfSExJU1RfSEVBRCgmdHRfZ2xvYmFsX2VudHJ5LT5vcmlnX2xpc3QpOwogCQlhdG9taWNfc2V0KCZ0dF9nbG9iYWxfZW50cnktPm9yaWdfbGlzdF9jb3VudCwgMCk7CiAJCXNwaW5fbG9ja19pbml0KCZ0dF9nbG9iYWxfZW50cnktPmxpc3RfbG9jayk7CiAKKwkJa3JlZl9nZXQoJmNvbW1vbi0+cmVmY291bnQpOwogCQloYXNoX2FkZGVkID0gYmF0YWR2X2hhc2hfYWRkKGJhdF9wcml2LT50dC5nbG9iYWxfaGFzaCwKIAkJCQkJICAgICBiYXRhZHZfY29tcGFyZV90dCwKIAkJCQkJICAgICBiYXRhZHZfY2hvb3NlX3R0LCBjb21tb24sCkBAIC0xNTc5LDYgKzE3OTgsNyBAQAogCXJldHVybiBiZXN0X2VudHJ5OwogfQogCisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUwogLyoqCiAgKiBiYXRhZHZfdHRfZ2xvYmFsX3ByaW50X2VudHJ5IC0gcHJpbnQgYWxsIG9yaWcgbm9kZXMgd2hvIGFubm91bmNlIHRoZSBhZGRyZXNzCiAgKiAgZm9yIHRoaXMgZ2xvYmFsIGVudHJ5CkBAIC0xNzAyLDYgKzE5MjIsMjE5IEBACiAJCWJhdGFkdl9oYXJkaWZfcHV0KHByaW1hcnlfaWYpOwogCXJldHVybiAwOwogfQorI2VuZGlmCisKKy8qKgorICogYmF0YWR2X3R0X2dsb2JhbF9kdW1wX3N1YmVudHJ5IC0gRHVtcCBhbGwgVFQgbG9jYWwgZW50cmllcyBpbnRvIGEgbWVzc2FnZQorICogQG1zZzogTmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQHBvcnRpZDogUG9ydCBtYWtpbmcgbmV0bGluayByZXF1ZXN0CisgKiBAc2VxOiBTZXF1ZW5jZSBudW1iZXIgb2YgbmV0bGluayBtZXNzYWdlCisgKiBAY29tbW9uOiB0dCBsb2NhbCAmIHR0IGdsb2JhbCBjb21tb24gZGF0YQorICogQG9yaWc6IE9yaWdpbmF0b3Igbm9kZSBhbm5vdW5jaW5nIGEgbm9uLW1lc2ggY2xpZW50CisgKiBAYmVzdDogSXMgdGhlIGJlc3Qgb3JpZ2luYXRvciBmb3IgdGhlIFRUIGVudHJ5CisgKgorICogUmV0dXJuOiBFcnJvciBjb2RlLCBvciAwIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludAorYmF0YWR2X3R0X2dsb2JhbF9kdW1wX3N1YmVudHJ5KHN0cnVjdCBza19idWZmICptc2csIHUzMiBwb3J0aWQsIHUzMiBzZXEsCisJCQkgICAgICAgc3RydWN0IGJhdGFkdl90dF9jb21tb25fZW50cnkgKmNvbW1vbiwKKwkJCSAgICAgICBzdHJ1Y3QgYmF0YWR2X3R0X29yaWdfbGlzdF9lbnRyeSAqb3JpZywKKwkJCSAgICAgICBib29sIGJlc3QpCit7CisJdm9pZCAqaGRyOworCXN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlX3ZsYW4gKnZsYW47CisJdTggbGFzdF90dHZuOworCXUzMiBjcmM7CisKKwl2bGFuID0gYmF0YWR2X29yaWdfbm9kZV92bGFuX2dldChvcmlnLT5vcmlnX25vZGUsCisJCQkJCSBjb21tb24tPnZpZCk7CisJaWYgKCF2bGFuKQorCQlyZXR1cm4gMDsKKworCWNyYyA9IHZsYW4tPnR0LmNyYzsKKworCWJhdGFkdl9vcmlnX25vZGVfdmxhbl9wdXQodmxhbik7CisKKwloZHIgPSBnZW5sbXNnX3B1dChtc2csIHBvcnRpZCwgc2VxLCAmYmF0YWR2X25ldGxpbmtfZmFtaWx5LAorCQkJICBOTE1fRl9NVUxUSSwKKwkJCSAgQkFUQURWX0NNRF9HRVRfVFJBTlNUQUJMRV9HTE9CQUwpOworCWlmICghaGRyKQorCQlyZXR1cm4gLUVOT0JVRlM7CisKKwlsYXN0X3R0dm4gPSBhdG9taWNfcmVhZCgmb3JpZy0+b3JpZ19ub2RlLT5sYXN0X3R0dm4pOworCisJaWYgKG5sYV9wdXQobXNnLCBCQVRBRFZfQVRUUl9UVF9BRERSRVNTLCBFVEhfQUxFTiwgY29tbW9uLT5hZGRyKSB8fAorCSAgICBubGFfcHV0KG1zZywgQkFUQURWX0FUVFJfT1JJR19BRERSRVNTLCBFVEhfQUxFTiwKKwkJICAgIG9yaWctPm9yaWdfbm9kZS0+b3JpZykgfHwKKwkgICAgbmxhX3B1dF91OChtc2csIEJBVEFEVl9BVFRSX1RUX1RUVk4sIG9yaWctPnR0dm4pIHx8CisJICAgIG5sYV9wdXRfdTgobXNnLCBCQVRBRFZfQVRUUl9UVF9MQVNUX1RUVk4sIGxhc3RfdHR2bikgfHwKKwkgICAgbmxhX3B1dF91MzIobXNnLCBCQVRBRFZfQVRUUl9UVF9DUkMzMiwgY3JjKSB8fAorCSAgICBubGFfcHV0X3UxNihtc2csIEJBVEFEVl9BVFRSX1RUX1ZJRCwgY29tbW9uLT52aWQpIHx8CisJICAgIG5sYV9wdXRfdTMyKG1zZywgQkFUQURWX0FUVFJfVFRfRkxBR1MsIGNvbW1vbi0+ZmxhZ3MpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWlmIChiZXN0ICYmIG5sYV9wdXRfZmxhZyhtc2csIEJBVEFEVl9BVFRSX0ZMQUdfQkVTVCkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOworCXJldHVybiAwOworCisgbmxhX3B1dF9mYWlsdXJlOgorCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorCisvKioKKyAqIGJhdGFkdl90dF9nbG9iYWxfZHVtcF9lbnRyeSAtIER1bXAgb25lIFRUIGdsb2JhbCBlbnRyeSBpbnRvIGEgbWVzc2FnZQorICogQG1zZzogTmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQHBvcnRpZDogUG9ydCBtYWtpbmcgbmV0bGluayByZXF1ZXN0CisgKiBAc2VxOiBTZXF1ZW5jZSBudW1iZXIgb2YgbmV0bGluayBtZXNzYWdlCisgKiBAYmF0X3ByaXY6IFRoZSBiYXQgcHJpdiB3aXRoIGFsbCB0aGUgc29mdCBpbnRlcmZhY2UgaW5mb3JtYXRpb24KKyAqIEBjb21tb246IHR0IGxvY2FsICYgdHQgZ2xvYmFsIGNvbW1vbiBkYXRhCisgKiBAc3ViX3M6IE51bWJlciBvZiBlbnRyaWVzIHRvIHNraXAKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhlIGNhbGxlciBob2xkcyByY3VfcmVhZF9sb2NrKCkuCisgKgorICogUmV0dXJuOiBFcnJvciBjb2RlLCBvciAwIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludAorYmF0YWR2X3R0X2dsb2JhbF9kdW1wX2VudHJ5KHN0cnVjdCBza19idWZmICptc2csIHUzMiBwb3J0aWQsIHUzMiBzZXEsCisJCQkgICAgc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJCSAgICBzdHJ1Y3QgYmF0YWR2X3R0X2NvbW1vbl9lbnRyeSAqY29tbW9uLCBpbnQgKnN1Yl9zKQoreworCXN0cnVjdCBiYXRhZHZfdHRfb3JpZ19saXN0X2VudHJ5ICpvcmlnX2VudHJ5LCAqYmVzdF9lbnRyeTsKKwlzdHJ1Y3QgYmF0YWR2X3R0X2dsb2JhbF9lbnRyeSAqZ2xvYmFsOworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCWludCBzdWIgPSAwOworCWJvb2wgYmVzdDsKKworCWdsb2JhbCA9IGNvbnRhaW5lcl9vZihjb21tb24sIHN0cnVjdCBiYXRhZHZfdHRfZ2xvYmFsX2VudHJ5LCBjb21tb24pOworCWJlc3RfZW50cnkgPSBiYXRhZHZfdHJhbnN0YWJsZV9iZXN0X29yaWcoYmF0X3ByaXYsIGdsb2JhbCk7CisJaGVhZCA9ICZnbG9iYWwtPm9yaWdfbGlzdDsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShvcmlnX2VudHJ5LCBoZWFkLCBsaXN0KSB7CisJCWlmIChzdWIrKyA8ICpzdWJfcykKKwkJCWNvbnRpbnVlOworCisJCWJlc3QgPSAob3JpZ19lbnRyeSA9PSBiZXN0X2VudHJ5KTsKKworCQlpZiAoYmF0YWR2X3R0X2dsb2JhbF9kdW1wX3N1YmVudHJ5KG1zZywgcG9ydGlkLCBzZXEsIGNvbW1vbiwKKwkJCQkJCSAgIG9yaWdfZW50cnksIGJlc3QpKSB7CisJCQkqc3ViX3MgPSBzdWIgLSAxOworCQkJcmV0dXJuIC1FTVNHU0laRTsKKwkJfQorCX0KKworCSpzdWJfcyA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYmF0YWR2X3R0X2dsb2JhbF9kdW1wX2J1Y2tldCAtIER1bXAgb25lIFRUIGxvY2FsIGJ1Y2tldCBpbnRvIGEgbWVzc2FnZQorICogQG1zZzogTmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQHBvcnRpZDogUG9ydCBtYWtpbmcgbmV0bGluayByZXF1ZXN0CisgKiBAc2VxOiBTZXF1ZW5jZSBudW1iZXIgb2YgbmV0bGluayBtZXNzYWdlCisgKiBAYmF0X3ByaXY6IFRoZSBiYXQgcHJpdiB3aXRoIGFsbCB0aGUgc29mdCBpbnRlcmZhY2UgaW5mb3JtYXRpb24KKyAqIEBoZWFkOiBQb2ludGVyIHRvIHRoZSBsaXN0IGNvbnRhaW5pbmcgdGhlIGdsb2JhbCB0dCBlbnRyaWVzCisgKiBAaWR4X3M6IE51bWJlciBvZiBlbnRyaWVzIHRvIHNraXAKKyAqIEBzdWI6IE51bWJlciBvZiBlbnRyaWVzIHRvIHNraXAKKyAqCisgKiBSZXR1cm46IEVycm9yIGNvZGUsIG9yIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50CitiYXRhZHZfdHRfZ2xvYmFsX2R1bXBfYnVja2V0KHN0cnVjdCBza19idWZmICptc2csIHUzMiBwb3J0aWQsIHUzMiBzZXEsCisJCQkgICAgIHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCQkgICAgIHN0cnVjdCBobGlzdF9oZWFkICpoZWFkLCBpbnQgKmlkeF9zLCBpbnQgKnN1YikKK3sKKwlzdHJ1Y3QgYmF0YWR2X3R0X2NvbW1vbl9lbnRyeSAqY29tbW9uOworCWludCBpZHggPSAwOworCisJcmN1X3JlYWRfbG9jaygpOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjb21tb24sIGhlYWQsIGhhc2hfZW50cnkpIHsKKwkJaWYgKGlkeCsrIDwgKmlkeF9zKQorCQkJY29udGludWU7CisKKwkJaWYgKGJhdGFkdl90dF9nbG9iYWxfZHVtcF9lbnRyeShtc2csIHBvcnRpZCwgc2VxLCBiYXRfcHJpdiwKKwkJCQkJCWNvbW1vbiwgc3ViKSkgeworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQkqaWR4X3MgPSBpZHggLSAxOworCQkJcmV0dXJuIC1FTVNHU0laRTsKKwkJfQorCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCSppZHhfcyA9IDA7CisJKnN1YiA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYmF0YWR2X3R0X2dsb2JhbF9kdW1wIC0gIER1bXAgVFQgZ2xvYmFsIGVudHJpZXMgaW50byBhIG1lc3NhZ2UKKyAqIEBtc2c6IE5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBjYjogUGFyYW1ldGVycyBmcm9tIHF1ZXJ5CisgKgorICogUmV0dXJuOiBFcnJvciBjb2RlLCBvciBsZW5ndGggb2YgbWVzc2FnZSBvbiBzdWNjZXNzCisgKi8KK2ludCBiYXRhZHZfdHRfZ2xvYmFsX2R1bXAoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KGNiLT5za2ItPnNrKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZTsKKwlzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2OworCXN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqcHJpbWFyeV9pZiA9IE5VTEw7CisJc3RydWN0IGJhdGFkdl9oYXNodGFibGUgKmhhc2g7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CisJaW50IHJldDsKKwlpbnQgaWZpbmRleDsKKwlpbnQgYnVja2V0ID0gY2ItPmFyZ3NbMF07CisJaW50IGlkeCA9IGNiLT5hcmdzWzFdOworCWludCBzdWIgPSBjYi0+YXJnc1syXTsKKwlpbnQgcG9ydGlkID0gTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQ7CisKKwlpZmluZGV4ID0gYmF0YWR2X25ldGxpbmtfZ2V0X2lmaW5kZXgoY2ItPm5saCwgQkFUQURWX0FUVFJfTUVTSF9JRklOREVYKTsKKwlpZiAoIWlmaW5kZXgpCisJCXJldHVybiAtRUlOVkFMOworCisJc29mdF9pZmFjZSA9IGRldl9nZXRfYnlfaW5kZXgobmV0LCBpZmluZGV4KTsKKwlpZiAoIXNvZnRfaWZhY2UgfHwgIWJhdGFkdl9zb2Z0aWZfaXNfdmFsaWQoc29mdF9pZmFjZSkpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2lmYWNlKTsKKworCXByaW1hcnlfaWYgPSBiYXRhZHZfcHJpbWFyeV9pZl9nZXRfc2VsZWN0ZWQoYmF0X3ByaXYpOworCWlmICghcHJpbWFyeV9pZiB8fCBwcmltYXJ5X2lmLT5pZl9zdGF0dXMgIT0gQkFUQURWX0lGX0FDVElWRSkgeworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIG91dDsKKwl9CisKKwloYXNoID0gYmF0X3ByaXYtPnR0Lmdsb2JhbF9oYXNoOworCisJd2hpbGUgKGJ1Y2tldCA8IGhhc2gtPnNpemUpIHsKKwkJaGVhZCA9ICZoYXNoLT50YWJsZVtidWNrZXRdOworCisJCWlmIChiYXRhZHZfdHRfZ2xvYmFsX2R1bXBfYnVja2V0KG1zZywgcG9ydGlkLAorCQkJCQkJIGNiLT5ubGgtPm5sbXNnX3NlcSwgYmF0X3ByaXYsCisJCQkJCQkgaGVhZCwgJmlkeCwgJnN1YikpCisJCQlicmVhazsKKworCQlidWNrZXQrKzsKKwl9CisKKwlyZXQgPSBtc2ctPmxlbjsKKworIG91dDoKKwlpZiAocHJpbWFyeV9pZikKKwkJYmF0YWR2X2hhcmRpZl9wdXQocHJpbWFyeV9pZik7CisJaWYgKHNvZnRfaWZhY2UpCisJCWRldl9wdXQoc29mdF9pZmFjZSk7CisKKwljYi0+YXJnc1swXSA9IGJ1Y2tldDsKKwljYi0+YXJnc1sxXSA9IGlkeDsKKwljYi0+YXJnc1syXSA9IHN1YjsKKworCXJldHVybiByZXQ7Cit9CiAKIC8qKgogICogX2JhdGFkdl90dF9nbG9iYWxfZGVsX29yaWdfZW50cnkgLSByZW1vdmUgYW5kIGZyZWUgYW4gb3JpZ19lbnRyeQpAQCAtMjI4MCw3ICsyNzEzLDcgQEAKIAogCXR0X3JlcV9ub2RlID0gY29udGFpbmVyX29mKHJlZiwgc3RydWN0IGJhdGFkdl90dF9yZXFfbm9kZSwgcmVmY291bnQpOwogCi0Ja2ZyZWUodHRfcmVxX25vZGUpOworCWttZW1fY2FjaGVfZnJlZShiYXRhZHZfdHRfcmVxX2NhY2hlLCB0dF9yZXFfbm9kZSk7CiB9CiAKIC8qKgpAQCAtMjM2Nyw3ICsyODAwLDcgQEAKIAkJCWdvdG8gdW5sb2NrOwogCX0KIAotCXR0X3JlcV9ub2RlID0ga21hbGxvYyhzaXplb2YoKnR0X3JlcV9ub2RlKSwgR0ZQX0FUT01JQyk7CisJdHRfcmVxX25vZGUgPSBrbWVtX2NhY2hlX2FsbG9jKGJhdGFkdl90dF9yZXFfY2FjaGUsIEdGUF9BVE9NSUMpOwogCWlmICghdHRfcmVxX25vZGUpCiAJCWdvdG8gdW5sb2NrOwogCkBAIC0zMTA0LDcgKzM1MzcsNyBAQAogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5vZGUsIHNhZmUsICZiYXRfcHJpdi0+dHQucm9hbV9saXN0LCBsaXN0KSB7CiAJCWxpc3RfZGVsKCZub2RlLT5saXN0KTsKLQkJa2ZyZWUobm9kZSk7CisJCWttZW1fY2FjaGVfZnJlZShiYXRhZHZfdHRfcm9hbV9jYWNoZSwgbm9kZSk7CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgoJmJhdF9wcml2LT50dC5yb2FtX2xpc3RfbG9jayk7CkBAIC0zMTIxLDcgKzM1NTQsNyBAQAogCQkJY29udGludWU7CiAKIAkJbGlzdF9kZWwoJm5vZGUtPmxpc3QpOwotCQlrZnJlZShub2RlKTsKKwkJa21lbV9jYWNoZV9mcmVlKGJhdGFkdl90dF9yb2FtX2NhY2hlLCBub2RlKTsKIAl9CiAJc3Bpbl91bmxvY2tfYmgoJmJhdF9wcml2LT50dC5yb2FtX2xpc3RfbG9jayk7CiB9CkBAIC0zMTYyLDcgKzM1OTUsOCBAQAogCX0KIAogCWlmICghcmV0KSB7Ci0JCXR0X3JvYW1fbm9kZSA9IGttYWxsb2Moc2l6ZW9mKCp0dF9yb2FtX25vZGUpLCBHRlBfQVRPTUlDKTsKKwkJdHRfcm9hbV9ub2RlID0ga21lbV9jYWNoZV9hbGxvYyhiYXRhZHZfdHRfcm9hbV9jYWNoZSwKKwkJCQkJCUdGUF9BVE9NSUMpOwogCQlpZiAoIXR0X3JvYW1fbm9kZSkKIAkJCWdvdG8gdW5sb2NrOwogCkBAIC0zODY1LDMgKzQyOTksODUgQEAKIAogCXJldHVybiByZXQ7CiB9CisKKy8qKgorICogYmF0YWR2X3R0X2NhY2hlX2luaXQgLSBJbml0aWFsaXplIHR0IG1lbW9yeSBvYmplY3QgY2FjaGUKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBudW1iZXIgaW4gY2FzZSBvZiBmYWlsdXJlLgorICovCitpbnQgX19pbml0IGJhdGFkdl90dF9jYWNoZV9pbml0KHZvaWQpCit7CisJc2l6ZV90IHRsX3NpemUgPSBzaXplb2Yoc3RydWN0IGJhdGFkdl90dF9sb2NhbF9lbnRyeSk7CisJc2l6ZV90IHRnX3NpemUgPSBzaXplb2Yoc3RydWN0IGJhdGFkdl90dF9nbG9iYWxfZW50cnkpOworCXNpemVfdCB0dF9vcmlnX3NpemUgPSBzaXplb2Yoc3RydWN0IGJhdGFkdl90dF9vcmlnX2xpc3RfZW50cnkpOworCXNpemVfdCB0dF9jaGFuZ2Vfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYmF0YWR2X3R0X2NoYW5nZV9ub2RlKTsKKwlzaXplX3QgdHRfcmVxX3NpemUgPSBzaXplb2Yoc3RydWN0IGJhdGFkdl90dF9yZXFfbm9kZSk7CisJc2l6ZV90IHR0X3JvYW1fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYmF0YWR2X3R0X3JvYW1fbm9kZSk7CisKKwliYXRhZHZfdGxfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiYmF0YWR2X3RsX2NhY2hlIiwgdGxfc2l6ZSwgMCwKKwkJCQkJICAgIFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7CisJaWYgKCFiYXRhZHZfdGxfY2FjaGUpCisJCXJldHVybiAtRU5PTUVNOworCisJYmF0YWR2X3RnX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImJhdGFkdl90Z19jYWNoZSIsIHRnX3NpemUsIDAsCisJCQkJCSAgICBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwpOworCWlmICghYmF0YWR2X3RnX2NhY2hlKQorCQlnb3RvIGVycl90dF90bF9kZXN0cm95OworCisJYmF0YWR2X3R0X29yaWdfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiYmF0YWR2X3R0X29yaWdfY2FjaGUiLAorCQkJCQkJIHR0X29yaWdfc2l6ZSwgMCwKKwkJCQkJCSBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwpOworCWlmICghYmF0YWR2X3R0X29yaWdfY2FjaGUpCisJCWdvdG8gZXJyX3R0X3RnX2Rlc3Ryb3k7CisKKwliYXRhZHZfdHRfY2hhbmdlX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImJhdGFkdl90dF9jaGFuZ2VfY2FjaGUiLAorCQkJCQkJICAgdHRfY2hhbmdlX3NpemUsIDAsCisJCQkJCQkgICBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwpOworCWlmICghYmF0YWR2X3R0X2NoYW5nZV9jYWNoZSkKKwkJZ290byBlcnJfdHRfb3JpZ19kZXN0cm95OworCisJYmF0YWR2X3R0X3JlcV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJiYXRhZHZfdHRfcmVxX2NhY2hlIiwKKwkJCQkJCXR0X3JlcV9zaXplLCAwLAorCQkJCQkJU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTsKKwlpZiAoIWJhdGFkdl90dF9yZXFfY2FjaGUpCisJCWdvdG8gZXJyX3R0X2NoYW5nZV9kZXN0cm95OworCisJYmF0YWR2X3R0X3JvYW1fY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiYmF0YWR2X3R0X3JvYW1fY2FjaGUiLAorCQkJCQkJIHR0X3JvYW1fc2l6ZSwgMCwKKwkJCQkJCSBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwpOworCWlmICghYmF0YWR2X3R0X3JvYW1fY2FjaGUpCisJCWdvdG8gZXJyX3R0X3JlcV9kZXN0cm95OworCisJcmV0dXJuIDA7CisKK2Vycl90dF9yZXFfZGVzdHJveToKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koYmF0YWR2X3R0X3JlcV9jYWNoZSk7CisJYmF0YWR2X3R0X3JlcV9jYWNoZSA9IE5VTEw7CitlcnJfdHRfY2hhbmdlX2Rlc3Ryb3k6CisJa21lbV9jYWNoZV9kZXN0cm95KGJhdGFkdl90dF9jaGFuZ2VfY2FjaGUpOworCWJhdGFkdl90dF9jaGFuZ2VfY2FjaGUgPSBOVUxMOworZXJyX3R0X29yaWdfZGVzdHJveToKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koYmF0YWR2X3R0X29yaWdfY2FjaGUpOworCWJhdGFkdl90dF9vcmlnX2NhY2hlID0gTlVMTDsKK2Vycl90dF90Z19kZXN0cm95OgorCWttZW1fY2FjaGVfZGVzdHJveShiYXRhZHZfdGdfY2FjaGUpOworCWJhdGFkdl90Z19jYWNoZSA9IE5VTEw7CitlcnJfdHRfdGxfZGVzdHJveToKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koYmF0YWR2X3RsX2NhY2hlKTsKKwliYXRhZHZfdGxfY2FjaGUgPSBOVUxMOworCisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qKgorICogYmF0YWR2X3R0X2NhY2hlX2Rlc3Ryb3kgLSBEZXN0cm95IHR0IG1lbW9yeSBvYmplY3QgY2FjaGUKKyAqLwordm9pZCBiYXRhZHZfdHRfY2FjaGVfZGVzdHJveSh2b2lkKQoreworCWttZW1fY2FjaGVfZGVzdHJveShiYXRhZHZfdGxfY2FjaGUpOworCWttZW1fY2FjaGVfZGVzdHJveShiYXRhZHZfdGdfY2FjaGUpOworCWttZW1fY2FjaGVfZGVzdHJveShiYXRhZHZfdHRfb3JpZ19jYWNoZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KGJhdGFkdl90dF9jaGFuZ2VfY2FjaGUpOworCWttZW1fY2FjaGVfZGVzdHJveShiYXRhZHZfdHRfcmVxX2NhY2hlKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koYmF0YWR2X3R0X3JvYW1fY2FjaGUpOworfQpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvdHJhbnNsYXRpb24tdGFibGUuaCBiL25ldC9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmgKaW5kZXggN2M3ZTJjMC4uNzgzZmRiYSAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvdHJhbnNsYXRpb24tdGFibGUuaAorKysgYi9uZXQvYmF0bWFuLWFkdi90cmFuc2xhdGlvbi10YWJsZS5oCkBAIC0yMiw4ICsyMiwxMCBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAorc3RydWN0IG5ldGxpbmtfY2FsbGJhY2s7CiBzdHJ1Y3QgbmV0X2RldmljZTsKIHN0cnVjdCBzZXFfZmlsZTsKK3N0cnVjdCBza19idWZmOwogCiBpbnQgYmF0YWR2X3R0X2luaXQoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdik7CiBib29sIGJhdGFkdl90dF9sb2NhbF9hZGQoc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2UsIGNvbnN0IHU4ICphZGRyLApAQCAtMzMsNiArMzUsOCBAQAogCQkJICAgY29uc3QgY2hhciAqbWVzc2FnZSwgYm9vbCByb2FtaW5nKTsKIGludCBiYXRhZHZfdHRfbG9jYWxfc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCk7CiBpbnQgYmF0YWR2X3R0X2dsb2JhbF9zZXFfcHJpbnRfdGV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KTsKK2ludCBiYXRhZHZfdHRfbG9jYWxfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOworaW50IGJhdGFkdl90dF9nbG9iYWxfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOwogdm9pZCBiYXRhZHZfdHRfZ2xvYmFsX2RlbF9vcmlnKHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCiAJCQkgICAgICAgc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKm9yaWdfbm9kZSwKIAkJCSAgICAgICBzMzIgbWF0Y2hfdmlkLCBjb25zdCBjaGFyICptZXNzYWdlKTsKQEAgLTU5LDQgKzYzLDcgQEAKIGJvb2wgYmF0YWR2X3R0X2dsb2JhbF9pc19pc29sYXRlZChzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAogCQkJCSAgY29uc3QgdTggKmFkZHIsIHVuc2lnbmVkIHNob3J0IHZpZCk7CiAKK2ludCBiYXRhZHZfdHRfY2FjaGVfaW5pdCh2b2lkKTsKK3ZvaWQgYmF0YWR2X3R0X2NhY2hlX2Rlc3Ryb3kodm9pZCk7CisKICNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfVFJBTlNMQVRJT05fVEFCTEVfSF8gKi8KZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L3R2bHYuYyBiL25ldC9iYXRtYW4tYWR2L3R2bHYuYwppbmRleCAzZDFjZjBmLi43NzY1NGYwIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi90dmx2LmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvdHZsdi5jCkBAIC0yNTcsOCArMjU3LDEzIEBACiAJc3Bpbl9sb2NrX2JoKCZiYXRfcHJpdi0+dHZsdi5jb250YWluZXJfbGlzdF9sb2NrKTsKIAl0dmx2X29sZCA9IGJhdGFkdl90dmx2X2NvbnRhaW5lcl9nZXQoYmF0X3ByaXYsIHR5cGUsIHZlcnNpb24pOwogCWJhdGFkdl90dmx2X2NvbnRhaW5lcl9yZW1vdmUoYmF0X3ByaXYsIHR2bHZfb2xkKTsKKworCWtyZWZfZ2V0KCZ0dmx2X25ldy0+cmVmY291bnQpOwogCWhsaXN0X2FkZF9oZWFkKCZ0dmx2X25ldy0+bGlzdCwgJmJhdF9wcml2LT50dmx2LmNvbnRhaW5lcl9saXN0KTsKIAlzcGluX3VubG9ja19iaCgmYmF0X3ByaXYtPnR2bHYuY29udGFpbmVyX2xpc3RfbG9jayk7CisKKwkvKiBkb24ndCByZXR1cm4gcmVmZXJlbmNlIHRvIG5ldyB0dmx2X2NvbnRhaW5lciAqLworCWJhdGFkdl90dmx2X2NvbnRhaW5lcl9wdXQodHZsdl9uZXcpOwogfQogCiAvKioKQEAgLTU0Miw4ICs1NDcsMTIgQEAKIAlJTklUX0hMSVNUX05PREUoJnR2bHZfaGFuZGxlci0+bGlzdCk7CiAKIAlzcGluX2xvY2tfYmgoJmJhdF9wcml2LT50dmx2LmhhbmRsZXJfbGlzdF9sb2NrKTsKKwlrcmVmX2dldCgmdHZsdl9oYW5kbGVyLT5yZWZjb3VudCk7CiAJaGxpc3RfYWRkX2hlYWRfcmN1KCZ0dmx2X2hhbmRsZXItPmxpc3QsICZiYXRfcHJpdi0+dHZsdi5oYW5kbGVyX2xpc3QpOwogCXNwaW5fdW5sb2NrX2JoKCZiYXRfcHJpdi0+dHZsdi5oYW5kbGVyX2xpc3RfbG9jayk7CisKKwkvKiBkb24ndCByZXR1cm4gcmVmZXJlbmNlIHRvIG5ldyB0dmx2X2hhbmRsZXIgKi8KKwliYXRhZHZfdHZsdl9oYW5kbGVyX3B1dCh0dmx2X2hhbmRsZXIpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L3R5cGVzLmggYi9uZXQvYmF0bWFuLWFkdi90eXBlcy5oCmluZGV4IGE2NDUyMmMuLmIzZGQxYTMgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L3R5cGVzLmgKKysrIGIvbmV0L2JhdG1hbi1hZHYvdHlwZXMuaApAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CiAjaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPiAvKiBmb3IgbGludXgvd2FpdC5oICovCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtMTMyLDcgKzEzMyw2IEBACiAgKiBAcmN1OiBzdHJ1Y3QgdXNlZCBmb3IgZnJlZWluZyBpbiBhbiBSQ1Utc2FmZSBtYW5uZXIKICAqIEBiYXRfaXY6IHBlciBoYXJkLWludGVyZmFjZSBCLkEuVC5NLkEuTi4gSVYgZGF0YQogICogQGJhdF92OiBwZXIgaGFyZC1pbnRlcmZhY2UgQi5BLlQuTS5BLk4uIFYgZGF0YQotICogQGNsZWFudXBfd29yazogd29yayBxdWV1ZSBjYWxsYmFjayBpdGVtIGZvciBoYXJkLWludGVyZmFjZSBkZWluaXQKICAqIEBkZWJ1Z19kaXI6IGRlbnRyeSBmb3IgbmMgc3ViZGlyIGluIGJhdG1hbi1hZHYgZGlyZWN0b3J5IGluIGRlYnVnZnMKICAqIEBuZWlnaF9saXN0OiBsaXN0IG9mIHVuaXF1ZSBzaW5nbGUgaG9wIG5laWdoYm9ycyB2aWEgdGhpcyBpbnRlcmZhY2UKICAqIEBuZWlnaF9saXN0X2xvY2s6IGxvY2sgcHJvdGVjdGluZyBuZWlnaF9saXN0CkBAIC0xNTIsNyArMTUyLDYgQEAKICNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9CQVRNQU5fVgogCXN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZV9iYXRfdiBiYXRfdjsKICNlbmRpZgotCXN0cnVjdCB3b3JrX3N0cnVjdCBjbGVhbnVwX3dvcms7CiAJc3RydWN0IGRlbnRyeSAqZGVidWdfZGlyOwogCXN0cnVjdCBobGlzdF9oZWFkIG5laWdoX2xpc3Q7CiAJLyogbmVpZ2hfbGlzdF9sb2NrIHByb3RlY3RzOiBuZWlnaF9saXN0ICovCkBAIC0xMDE1LDcgKzEwMTQsNiBAQAogICogQGZvcndfYmNhc3RfbGlzdF9sb2NrOiBsb2NrIHByb3RlY3RpbmcgZm9yd19iY2FzdF9saXN0CiAgKiBAdHBfbGlzdF9sb2NrOiBzcGlubG9jayBwcm90ZWN0aW5nIEB0cF9saXN0CiAgKiBAb3JpZ193b3JrOiB3b3JrIHF1ZXVlIGNhbGxiYWNrIGl0ZW0gZm9yIG9yaWcgbm9kZSBwdXJnaW5nCi0gKiBAY2xlYW51cF93b3JrOiB3b3JrIHF1ZXVlIGNhbGxiYWNrIGl0ZW0gZm9yIHNvZnQtaW50ZXJmYWNlIGRlaW5pdAogICogQHByaW1hcnlfaWY6IG9uZSBvZiB0aGUgaGFyZC1pbnRlcmZhY2VzIGFzc2lnbmVkIHRvIHRoaXMgbWVzaCBpbnRlcmZhY2UKICAqICBiZWNvbWVzIHRoZSBwcmltYXJ5IGludGVyZmFjZQogICogQGFsZ29fb3BzOiByb3V0aW5nIGFsZ29yaXRobSB1c2VkIGJ5IHRoaXMgbWVzaCBpbnRlcmZhY2UKQEAgLTEwNzQsNyArMTA3Miw2IEBACiAJc3BpbmxvY2tfdCB0cF9saXN0X2xvY2s7IC8qIHByb3RlY3RzIHRwX2xpc3QgKi8KIAlhdG9taWNfdCB0cF9udW07CiAJc3RydWN0IGRlbGF5ZWRfd29yayBvcmlnX3dvcms7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IGNsZWFudXBfd29yazsKIAlzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgX19yY3UgKnByaW1hcnlfaWY7ICAvKiByY3UgcHJvdGVjdGVkIHBvaW50ZXIgKi8KIAlzdHJ1Y3QgYmF0YWR2X2FsZ29fb3BzICphbGdvX29wczsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCBzb2Z0aWZfdmxhbl9saXN0OwpAQCAtMTM3OSw2ICsxMzc2LDcgQEAKICAqICBsb2NhbGx5IGdlbmVyYXRlZCBwYWNrZXQKICAqIEBpZl9vdXRnb2luZzogcGFja2V0IHdoZXJlIHRoZSBwYWNrZXQgc2hvdWxkIGJlIHNlbnQgdG8sIG9yIE5VTEwgaWYKICAqICB1bnNwZWNpZmllZAorICogQHF1ZXVlX2xlZnQ6IFRoZSBxdWV1ZSAoY291bnRlcikgdGhpcyBwYWNrZXQgd2FzIGFwcGxpZWQgdG8KICAqLwogc3RydWN0IGJhdGFkdl9mb3J3X3BhY2tldCB7CiAJc3RydWN0IGhsaXN0X25vZGUgbGlzdDsKQEAgLTEzOTEsMTEgKzEzODksMTMgQEAKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIGRlbGF5ZWRfd29yazsKIAlzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmlmX2luY29taW5nOwogCXN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaWZfb3V0Z29pbmc7CisJYXRvbWljX3QgKnF1ZXVlX2xlZnQ7CiB9OwogCiAvKioKICAqIHN0cnVjdCBiYXRhZHZfYWxnb19pZmFjZV9vcHMgLSBtZXNoIGFsZ29yaXRobSBjYWxsYmFja3MgKGludGVyZmFjZSBzcGVjaWZpYykKICAqIEBhY3RpdmF0ZTogc3RhcnQgcm91dGluZyBtZWNoYW5pc21zIHdoZW4gaGFyZC1pbnRlcmZhY2UgaXMgYnJvdWdodCB1cAorICogIChvcHRpb25hbCkKICAqIEBlbmFibGU6IGluaXQgcm91dGluZyBpbmZvIHdoZW4gaGFyZC1pbnRlcmZhY2UgaXMgZW5hYmxlZAogICogQGRpc2FibGU6IGRlLWluaXQgcm91dGluZyBpbmZvIHdoZW4gaGFyZC1pbnRlcmZhY2UgaXMgZGlzYWJsZWQKICAqIEB1cGRhdGVfbWFjOiAocmUtKWluaXQgbWFjIGFkZHJlc3NlcyBvZiB0aGUgcHJvdG9jb2wgaW5mb3JtYXRpb24KQEAgLTE0MTMsMTEgKzE0MTMsMTMgQEAKIC8qKgogICogc3RydWN0IGJhdGFkdl9hbGdvX25laWdoX29wcyAtIG1lc2ggYWxnb3JpdGhtIGNhbGxiYWNrcyAobmVpZ2hib3VyIHNwZWNpZmljKQogICogQGhhcmRpZl9pbml0OiBjYWxsZWQgb24gY3JlYXRpb24gb2Ygc2luZ2xlIGhvcCBlbnRyeQorICogIChvcHRpb25hbCkKICAqIEBjbXA6IGNvbXBhcmUgdGhlIG1ldHJpY3Mgb2YgdHdvIG5laWdoYm9ycyBmb3IgdGhlaXIgcmVzcGVjdGl2ZSBvdXRnb2luZwogICogIGludGVyZmFjZXMKICAqIEBpc19zaW1pbGFyX29yX2JldHRlcjogY2hlY2sgaWYgbmVpZ2gxIGlzIGVxdWFsbHkgc2ltaWxhciBvciBiZXR0ZXIgdGhhbgogICogIG5laWdoMiBmb3IgdGhlaXIgcmVzcGVjdGl2ZSBvdXRnb2luZyBpbnRlcmZhY2UgZnJvbSB0aGUgbWV0cmljIHByb3NwZWN0aXZlCiAgKiBAcHJpbnQ6IHByaW50IHRoZSBzaW5nbGUgaG9wIG5laWdoYm9yIGxpc3QgKG9wdGlvbmFsKQorICogQGR1bXA6IGR1bXAgbmVpZ2hib3JzIHRvIGEgbmV0bGluayBzb2NrZXQgKG9wdGlvbmFsKQogICovCiBzdHJ1Y3QgYmF0YWR2X2FsZ29fbmVpZ2hfb3BzIHsKIAl2b2lkICgqaGFyZGlmX2luaXQpKHN0cnVjdCBiYXRhZHZfaGFyZGlmX25laWdoX25vZGUgKm5laWdoKTsKQEAgLTE0MjksMjYgKzE0MzEsNjQgQEAKIAkJCQkgICAgIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaWZfb3V0Z29pbmcxLAogCQkJCSAgICAgc3RydWN0IGJhdGFkdl9uZWlnaF9ub2RlICpuZWlnaDIsCiAJCQkJICAgICBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmlmX291dGdvaW5nMik7CisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUwogCXZvaWQgKCpwcmludCkoc3RydWN0IGJhdGFkdl9wcml2ICpwcml2LCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSk7CisjZW5kaWYKKwl2b2lkICgqZHVtcCkoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAorCQkgICAgIHN0cnVjdCBiYXRhZHZfcHJpdiAqcHJpdiwKKwkJICAgICBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmhhcmRfaWZhY2UpOwogfTsKIAogLyoqCiAgKiBzdHJ1Y3QgYmF0YWR2X2FsZ29fb3JpZ19vcHMgLSBtZXNoIGFsZ29yaXRobSBjYWxsYmFja3MgKG9yaWdpbmF0b3Igc3BlY2lmaWMpCiAgKiBAZnJlZTogZnJlZSB0aGUgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGUgcm91dGluZyBhbGdvcml0aG0gZm9yIGFuIG9yaWdfbm9kZQotICogIG9iamVjdAorICogIG9iamVjdCAob3B0aW9uYWwpCiAgKiBAYWRkX2lmOiBhc2sgdGhlIHJvdXRpbmcgYWxnb3JpdGhtIHRvIGFwcGx5IHRoZSBuZWVkZWQgY2hhbmdlcyB0byB0aGUKLSAqICBvcmlnX25vZGUgZHVlIHRvIGEgbmV3IGhhcmQtaW50ZXJmYWNlIGJlaW5nIGFkZGVkIGludG8gdGhlIG1lc2gKKyAqICBvcmlnX25vZGUgZHVlIHRvIGEgbmV3IGhhcmQtaW50ZXJmYWNlIGJlaW5nIGFkZGVkIGludG8gdGhlIG1lc2ggKG9wdGlvbmFsKQogICogQGRlbF9pZjogYXNrIHRoZSByb3V0aW5nIGFsZ29yaXRobSB0byBhcHBseSB0aGUgbmVlZGVkIGNoYW5nZXMgdG8gdGhlCi0gKiAgb3JpZ19ub2RlIGR1ZSB0byBhbiBoYXJkLWludGVyZmFjZSBiZWluZyByZW1vdmVkIGZyb20gdGhlIG1lc2gKKyAqICBvcmlnX25vZGUgZHVlIHRvIGFuIGhhcmQtaW50ZXJmYWNlIGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgbWVzaCAob3B0aW9uYWwpCiAgKiBAcHJpbnQ6IHByaW50IHRoZSBvcmlnaW5hdG9yIHRhYmxlIChvcHRpb25hbCkKKyAqIEBkdW1wOiBkdW1wIG9yaWdpbmF0b3JzIHRvIGEgbmV0bGluayBzb2NrZXQgKG9wdGlvbmFsKQogICovCiBzdHJ1Y3QgYmF0YWR2X2FsZ29fb3JpZ19vcHMgewogCXZvaWQgKCpmcmVlKShzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqb3JpZ19ub2RlKTsKIAlpbnQgKCphZGRfaWYpKHN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpvcmlnX25vZGUsIGludCBtYXhfaWZfbnVtKTsKIAlpbnQgKCpkZWxfaWYpKHN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpvcmlnX25vZGUsIGludCBtYXhfaWZfbnVtLAogCQkgICAgICBpbnQgZGVsX2lmX251bSk7CisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUwogCXZvaWQgKCpwcmludCkoc3RydWN0IGJhdGFkdl9wcml2ICpwcml2LCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwKIAkJICAgICAgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpoYXJkX2lmYWNlKTsKKyNlbmRpZgorCXZvaWQgKCpkdW1wKShzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCisJCSAgICAgc3RydWN0IGJhdGFkdl9wcml2ICpwcml2LAorCQkgICAgIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaGFyZF9pZmFjZSk7Cit9OworCisvKioKKyAqIHN0cnVjdCBiYXRhZHZfYWxnb19nd19vcHMgLSBtZXNoIGFsZ29yaXRobSBjYWxsYmFja3MgKEdXIHNwZWNpZmljKQorICogQHN0b3JlX3NlbF9jbGFzczogcGFyc2UgYW5kIHN0b3JlcyBhIG5ldyBHVyBzZWxlY3Rpb24gY2xhc3MgKG9wdGlvbmFsKQorICogQHNob3dfc2VsX2NsYXNzOiBwcmludHMgdGhlIGN1cnJlbnQgR1cgc2VsZWN0aW9uIGNsYXNzIChvcHRpb25hbCkKKyAqIEBnZXRfYmVzdF9nd19ub2RlOiBzZWxlY3QgdGhlIGJlc3QgR1cgZnJvbSB0aGUgbGlzdCBvZiBhdmFpbGFibGUgbm9kZXMKKyAqICAob3B0aW9uYWwpCisgKiBAaXNfZWxpZ2libGU6IGNoZWNrIGlmIGEgbmV3bHkgZGlzY292ZXJlZCBHVyBpcyBhIHBvdGVudGlhbCBjYW5kaWRhdGUgZm9yCisgKiAgdGhlIGVsZWN0aW9uIGFzIGJlc3QgR1cgKG9wdGlvbmFsKQorICogQHByaW50OiBwcmludCB0aGUgZ2F0ZXdheSB0YWJsZSAob3B0aW9uYWwpCisgKiBAZHVtcDogZHVtcCBnYXRld2F5cyB0byBhIG5ldGxpbmsgc29ja2V0IChvcHRpb25hbCkKKyAqLworc3RydWN0IGJhdGFkdl9hbGdvX2d3X29wcyB7CisJc3NpemVfdCAoKnN0b3JlX3NlbF9jbGFzcykoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwgY2hhciAqYnVmZiwKKwkJCQkgICBzaXplX3QgY291bnQpOworCXNzaXplX3QgKCpzaG93X3NlbF9jbGFzcykoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwgY2hhciAqYnVmZik7CisJc3RydWN0IGJhdGFkdl9nd19ub2RlICooKmdldF9iZXN0X2d3X25vZGUpCisJCShzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2KTsKKwlib29sICgqaXNfZWxpZ2libGUpKHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCQkgICAgc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKmN1cnJfZ3dfb3JpZywKKwkJCSAgICBzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqb3JpZ19ub2RlKTsKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCisJdm9pZCAoKnByaW50KShzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LCBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSk7CisjZW5kaWYKKwl2b2lkICgqZHVtcCkoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAorCQkgICAgIHN0cnVjdCBiYXRhZHZfcHJpdiAqcHJpdik7CiB9OwogCiAvKioKQEAgLTE0NTgsNiArMTQ5OCw3IEBACiAgKiBAaWZhY2U6IGNhbGxiYWNrcyByZWxhdGVkIHRvIGludGVyZmFjZSBoYW5kbGluZwogICogQG5laWdoOiBjYWxsYmFja3MgcmVsYXRlZCB0byBuZWlnaGJvcnMgaGFuZGxpbmcKICAqIEBvcmlnOiBjYWxsYmFja3MgcmVsYXRlZCB0byBvcmlnaW5hdG9ycyBoYW5kbGluZworICogQGd3OiBjYWxsYmFja3MgcmVsYXRlZCB0byBHVyBtb2RlCiAgKi8KIHN0cnVjdCBiYXRhZHZfYWxnb19vcHMgewogCXN0cnVjdCBobGlzdF9ub2RlIGxpc3Q7CkBAIC0xNDY1LDYgKzE1MDYsNyBAQAogCXN0cnVjdCBiYXRhZHZfYWxnb19pZmFjZV9vcHMgaWZhY2U7CiAJc3RydWN0IGJhdGFkdl9hbGdvX25laWdoX29wcyBuZWlnaDsKIAlzdHJ1Y3QgYmF0YWR2X2FsZ29fb3JpZ19vcHMgb3JpZzsKKwlzdHJ1Y3QgYmF0YWR2X2FsZ29fZ3dfb3BzIGd3OwogfTsKIAogLyoqCkBAIC0xNTY0LDQgKzE2MDYsMTcgQEAKIAlCQVRBRFZfVFZMVl9IQU5ETEVSX09HTV9DQUxMRUQgPSBCSVQoMiksCiB9OwogCisvKioKKyAqIHN0cnVjdCBiYXRhZHZfc3RvcmVfbWVzaF93b3JrIC0gV29yayBxdWV1ZSBpdGVtIHRvIGRldGFjaCBhZGQvZGVsIGludGVyZmFjZQorICogIGZyb20gc3lzZnMgbG9ja3MKKyAqIEBuZXRfZGV2OiBuZXRkZXZpY2UgdG8gYWRkL3JlbW92ZSB0by9mcm9tIGJhdG1hbi1hZHYgc29mdC1pbnRlcmZhY2UKKyAqIEBzb2Z0X2lmYWNlX25hbWU6IG5hbWUgb2Ygc29mdC1pbnRlcmZhY2UgdG8gbW9kaWZ5CisgKiBAd29yazogd29yayBxdWV1ZSBpdGVtCisgKi8KK3N0cnVjdCBiYXRhZHZfc3RvcmVfbWVzaF93b3JrIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldjsKKwljaGFyIHNvZnRfaWZhY2VfbmFtZVtJRk5BTVNJWl07CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7Cit9OworCiAjZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX1RZUEVTX0hfICovCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jIGIvbmV0L2JsdWV0b290aC9hZl9ibHVldG9vdGguYwppbmRleCBlY2U0NWUwLi4xYWZmMmRhIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jCisrKyBiL25ldC9ibHVldG9vdGgvYWZfYmx1ZXRvb3RoLmMKQEAgLTI2LDExICsyNiwxMyBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgogI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KIAogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogCisjaW5jbHVkZSAibGVkcy5oIgogI2luY2x1ZGUgInNlbGZ0ZXN0LmgiCiAKIC8qIEJsdWV0b290aCBzb2NrZXRzICovCkBAIC0yNTAsNyArMjUyLDcgQEAKIAogCXNrYl9mcmVlX2RhdGFncmFtKHNrLCBza2IpOwogCi0JaWYgKG1zZy0+bXNnX2ZsYWdzICYgTVNHX1RSVU5DKQorCWlmIChmbGFncyAmIE1TR19UUlVOQykKIAkJY29waWVkID0gc2tibGVuOwogCiAJcmV0dXJuIGVyciA/IDogY29waWVkOwpAQCAtNzEyLDEzICs3MTQsMTYgQEAKIHN0cnVjdCBkZW50cnkgKmJ0X2RlYnVnZnM7CiBFWFBPUlRfU1lNQk9MX0dQTChidF9kZWJ1Z2ZzKTsKIAorI2RlZmluZSBWRVJTSU9OIF9fc3RyaW5naWZ5KEJUX1NVQlNZU19WRVJTSU9OKSAiLiIgXAorCQlfX3N0cmluZ2lmeShCVF9TVUJTWVNfUkVWSVNJT04pCisKIHN0YXRpYyBpbnQgX19pbml0IGJ0X2luaXQodm9pZCkKIHsKIAlpbnQgZXJyOwogCiAJc29ja19za2JfY2JfY2hlY2tfc2l6ZShzaXplb2Yoc3RydWN0IGJ0X3NrYl9jYikpOwogCi0JQlRfSU5GTygiQ29yZSB2ZXIgJXMiLCBCVF9TVUJTWVNfVkVSU0lPTik7CisJQlRfSU5GTygiQ29yZSB2ZXIgJXMiLCBWRVJTSU9OKTsKIAogCWVyciA9IGJ0X3NlbGZ0ZXN0KCk7CiAJaWYgKGVyciA8IDApCkBAIC03MjYsNiArNzMxLDggQEAKIAogCWJ0X2RlYnVnZnMgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImJsdWV0b290aCIsIE5VTEwpOwogCisJYnRfbGVkc19pbml0KCk7CisKIAllcnIgPSBidF9zeXNmc19pbml0KCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CkBAIC03ODUsNiArNzkyLDggQEAKIAogCWJ0X3N5c2ZzX2NsZWFudXAoKTsKIAorCWJ0X2xlZHNfY2xlYW51cCgpOworCiAJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGJ0X2RlYnVnZnMpOwogfQogCkBAIC03OTIsNyArODAxLDcgQEAKIG1vZHVsZV9leGl0KGJ0X2V4aXQpOwogCiBNT0RVTEVfQVVUSE9SKCJNYXJjZWwgSG9sdG1hbm4gPG1hcmNlbEBob2x0bWFubi5vcmc+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkJsdWV0b290aCBDb3JlIHZlciAiIEJUX1NVQlNZU19WRVJTSU9OKTsKLU1PRFVMRV9WRVJTSU9OKEJUX1NVQlNZU19WRVJTSU9OKTsKK01PRFVMRV9ERVNDUklQVElPTigiQmx1ZXRvb3RoIENvcmUgdmVyICIgVkVSU0lPTik7CitNT0RVTEVfVkVSU0lPTihWRVJTSU9OKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BTElBU19ORVRQUk9UTyhQRl9CTFVFVE9PVEgpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfY29yZS5jIGIvbmV0L2JsdWV0b290aC9oY2lfY29yZS5jCmluZGV4IGRkZjg0MzIuLjNhYzg5ZTkgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmMKQEAgLTE1NjIsNiArMTU2Miw3IEBACiAJYXV0b19vZmYgPSBoY2lfZGV2X3Rlc3RfYW5kX2NsZWFyX2ZsYWcoaGRldiwgSENJX0FVVE9fT0ZGKTsKIAogCWlmICghYXV0b19vZmYgJiYgaGRldi0+ZGV2X3R5cGUgPT0gSENJX1BSSU1BUlkgJiYKKwkgICAgIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9VU0VSX0NIQU5ORUwpICYmCiAJICAgIGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9NR01UKSkKIAkJX19tZ210X3Bvd2VyX29mZihoZGV2KTsKIApkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfcmVxdWVzdC5jIGIvbmV0L2JsdWV0b290aC9oY2lfcmVxdWVzdC5jCmluZGV4IGMwNDViM2MuLmM4MTM1NjggMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGNpX3JlcXVlc3QuYworKysgYi9uZXQvYmx1ZXRvb3RoL2hjaV9yZXF1ZXN0LmMKQEAgLTI2Miw2ICsyNjIsOCBAQAogCQlicmVhazsKIAl9CiAKKwlrZnJlZV9za2IoaGRldi0+cmVxX3NrYik7CisJaGRldi0+cmVxX3NrYiA9IE5VTEw7CiAJaGRldi0+cmVxX3N0YXR1cyA9IGhkZXYtPnJlcV9yZXN1bHQgPSAwOwogCiAJQlRfREJHKCIlcyBlbmQ6IGVyciAlZCIsIGhkZXYtPm5hbWUsIGVycik7CkBAIC05NjksMTQgKzk3MSwxNCBAQAogCWhjaV9yZXFfYWRkKHJlcSwgSENJX09QX0xFX1NFVF9BRFZfRU5BQkxFLCBzaXplb2YoZW5hYmxlKSwgJmVuYWJsZSk7CiB9CiAKLXN0YXRpYyB1OCBjcmVhdGVfZGVmYXVsdF9zY2FuX3JzcF9kYXRhKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCAqcHRyKQorc3RhdGljIHU4IGFwcGVuZF9sb2NhbF9uYW1lKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCAqcHRyLCB1OCBhZF9sZW4pCiB7Ci0JdTggYWRfbGVuID0gMDsKIAlzaXplX3QgbmFtZV9sZW47CisJaW50IG1heF9sZW47CiAKKwltYXhfbGVuID0gSENJX01BWF9BRF9MRU5HVEggLSBhZF9sZW4gLSAyOwogCW5hbWVfbGVuID0gc3RybGVuKGhkZXYtPmRldl9uYW1lKTsKLQlpZiAobmFtZV9sZW4gPiAwKSB7Ci0JCXNpemVfdCBtYXhfbGVuID0gSENJX01BWF9BRF9MRU5HVEggLSBhZF9sZW4gLSAyOworCWlmIChuYW1lX2xlbiA+IDAgJiYgbWF4X2xlbiA+IDApIHsKIAogCQlpZiAobmFtZV9sZW4gPiBtYXhfbGVuKSB7CiAJCQluYW1lX2xlbiA9IG1heF9sZW47CkBAIC05OTUsMjIgKzk5Nyw0MiBAQAogCXJldHVybiBhZF9sZW47CiB9CiAKK3N0YXRpYyB1OCBjcmVhdGVfZGVmYXVsdF9zY2FuX3JzcF9kYXRhKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCAqcHRyKQoreworCXJldHVybiBhcHBlbmRfbG9jYWxfbmFtZShoZGV2LCBwdHIsIDApOworfQorCiBzdGF0aWMgdTggY3JlYXRlX2luc3RhbmNlX3NjYW5fcnNwX2RhdGEoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4IGluc3RhbmNlLAogCQkJCQl1OCAqcHRyKQogewogCXN0cnVjdCBhZHZfaW5mbyAqYWR2X2luc3RhbmNlOworCXUzMiBpbnN0YW5jZV9mbGFnczsKKwl1OCBzY2FuX3JzcF9sZW4gPSAwOwogCiAJYWR2X2luc3RhbmNlID0gaGNpX2ZpbmRfYWR2X2luc3RhbmNlKGhkZXYsIGluc3RhbmNlKTsKIAlpZiAoIWFkdl9pbnN0YW5jZSkKIAkJcmV0dXJuIDA7CiAKLQkvKiBUT0RPOiBTZXQgdGhlIGFwcHJvcHJpYXRlIGVudHJpZXMgYmFzZWQgb24gYWR2ZXJ0aXNpbmcgaW5zdGFuY2UgZmxhZ3MKLQkgKiBoZXJlIG9uY2UgZmxhZ3Mgb3RoZXIgdGhhbiAwIGFyZSBzdXBwb3J0ZWQuCi0JICovCisJaW5zdGFuY2VfZmxhZ3MgPSBhZHZfaW5zdGFuY2UtPmZsYWdzOworCisJaWYgKChpbnN0YW5jZV9mbGFncyAmIE1HTVRfQURWX0ZMQUdfQVBQRUFSQU5DRSkgJiYgaGRldi0+YXBwZWFyYW5jZSkgeworCQlwdHJbMF0gPSAzOworCQlwdHJbMV0gPSBFSVJfQVBQRUFSQU5DRTsKKwkJcHV0X3VuYWxpZ25lZF9sZTE2KGhkZXYtPmFwcGVhcmFuY2UsIHB0ciArIDIpOworCQlzY2FuX3JzcF9sZW4gKz0gNDsKKwkJcHRyICs9IDQ7CisJfQorCiAJbWVtY3B5KHB0ciwgYWR2X2luc3RhbmNlLT5zY2FuX3JzcF9kYXRhLAogCSAgICAgICBhZHZfaW5zdGFuY2UtPnNjYW5fcnNwX2xlbik7CiAKLQlyZXR1cm4gYWR2X2luc3RhbmNlLT5zY2FuX3JzcF9sZW47CisJc2Nhbl9yc3BfbGVuICs9IGFkdl9pbnN0YW5jZS0+c2Nhbl9yc3BfbGVuOworCXB0ciArPSBhZHZfaW5zdGFuY2UtPnNjYW5fcnNwX2xlbjsKKworCWlmIChpbnN0YW5jZV9mbGFncyAmIE1HTVRfQURWX0ZMQUdfTE9DQUxfTkFNRSkKKwkJc2Nhbl9yc3BfbGVuID0gYXBwZW5kX2xvY2FsX25hbWUoaGRldiwgcHRyLCBzY2FuX3JzcF9sZW4pOworCisJcmV0dXJuIHNjYW5fcnNwX2xlbjsKIH0KIAogdm9pZCBfX2hjaV9yZXFfdXBkYXRlX3NjYW5fcnNwX2RhdGEoc3RydWN0IGhjaV9yZXF1ZXN0ICpyZXEsIHU4IGluc3RhbmNlKQpAQCAtMTE5Miw3ICsxMjE0LDcgQEAKIAogCWhjaV9yZXFfaW5pdCgmcmVxLCBoZGV2KTsKIAotCWhjaV9yZXFfY2xlYXJfYWR2X2luc3RhbmNlKGhkZXYsICZyZXEsIGluc3RhbmNlLCBmYWxzZSk7CisJaGNpX3JlcV9jbGVhcl9hZHZfaW5zdGFuY2UoaGRldiwgTlVMTCwgJnJlcSwgaW5zdGFuY2UsIGZhbHNlKTsKIAogCWlmIChsaXN0X2VtcHR5KCZoZGV2LT5hZHZfaW5zdGFuY2VzKSkKIAkJX19oY2lfcmVxX2Rpc2FibGVfYWR2ZXJ0aXNpbmcoJnJlcSk7CkBAIC0xMjgyLDggKzEzMDQsOSBAQAogICogICBzZXR0aW5nLgogICogLSBmb3JjZSA9PSBmYWxzZTogT25seSBpbnN0YW5jZXMgdGhhdCBoYXZlIGEgdGltZW91dCB3aWxsIGJlIHJlbW92ZWQuCiAgKi8KLXZvaWQgaGNpX3JlcV9jbGVhcl9hZHZfaW5zdGFuY2Uoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBoY2lfcmVxdWVzdCAqcmVxLAotCQkJCXU4IGluc3RhbmNlLCBib29sIGZvcmNlKQordm9pZCBoY2lfcmVxX2NsZWFyX2Fkdl9pbnN0YW5jZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNvY2sgKnNrLAorCQkJCXN0cnVjdCBoY2lfcmVxdWVzdCAqcmVxLCB1OCBpbnN0YW5jZSwKKwkJCQlib29sIGZvcmNlKQogewogCXN0cnVjdCBhZHZfaW5mbyAqYWR2X2luc3RhbmNlLCAqbiwgKm5leHRfaW5zdGFuY2UgPSBOVUxMOwogCWludCBlcnI7CkBAIC0xMzA5LDcgKzEzMzIsNyBAQAogCQkJcmVtX2luc3QgPSBhZHZfaW5zdGFuY2UtPmluc3RhbmNlOwogCQkJZXJyID0gaGNpX3JlbW92ZV9hZHZfaW5zdGFuY2UoaGRldiwgcmVtX2luc3QpOwogCQkJaWYgKCFlcnIpCi0JCQkJbWdtdF9hZHZlcnRpc2luZ19yZW1vdmVkKE5VTEwsIGhkZXYsIHJlbV9pbnN0KTsKKwkJCQltZ210X2FkdmVydGlzaW5nX3JlbW92ZWQoc2ssIGhkZXYsIHJlbV9pbnN0KTsKIAkJfQogCX0gZWxzZSB7CiAJCWFkdl9pbnN0YW5jZSA9IGhjaV9maW5kX2Fkdl9pbnN0YW5jZShoZGV2LCBpbnN0YW5jZSk7CkBAIC0xMzIzLDcgKzEzNDYsNyBAQAogCiAJCQllcnIgPSBoY2lfcmVtb3ZlX2Fkdl9pbnN0YW5jZShoZGV2LCBpbnN0YW5jZSk7CiAJCQlpZiAoIWVycikKLQkJCQltZ210X2FkdmVydGlzaW5nX3JlbW92ZWQoTlVMTCwgaGRldiwgaW5zdGFuY2UpOworCQkJCW1nbXRfYWR2ZXJ0aXNpbmdfcmVtb3ZlZChzaywgaGRldiwgaW5zdGFuY2UpOwogCQl9CiAJfQogCkBAIC0xNzE0LDcgKzE3MzcsNyBAQAogCQkJICogZnVuY3Rpb24uIFRvIGJlIHNhZmUgaGFyZC1jb2RlIG9uZSBvZiB0aGUKIAkJCSAqIHZhbHVlcyB0aGF0J3Mgc3VpdGFibGUgZm9yIFNDTy4KIAkJCSAqLwotCQkJcmVqLnJlYXNvbiA9IEhDSV9FUlJPUl9SRU1PVEVfTE9XX1JFU09VUkNFUzsKKwkJCXJlai5yZWFzb24gPSBIQ0lfRVJST1JfUkVKX0xJTUlURURfUkVTT1VSQ0VTOwogCiAJCQloY2lfcmVxX2FkZChyZXEsIEhDSV9PUF9SRUpFQ1RfU1lOQ19DT05OX1JFUSwKIAkJCQkgICAgc2l6ZW9mKHJlaiksICZyZWopOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfcmVxdWVzdC5oIGIvbmV0L2JsdWV0b290aC9oY2lfcmVxdWVzdC5oCmluZGV4IGIyZDA0NGIuLmFjMWUxMTAgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGNpX3JlcXVlc3QuaAorKysgYi9uZXQvYmx1ZXRvb3RoL2hjaV9yZXF1ZXN0LmgKQEAgLTczLDggKzczLDkgQEAKIAogaW50IF9faGNpX3JlcV9zY2hlZHVsZV9hZHZfaW5zdGFuY2Uoc3RydWN0IGhjaV9yZXF1ZXN0ICpyZXEsIHU4IGluc3RhbmNlLAogCQkJCSAgICBib29sIGZvcmNlKTsKLXZvaWQgaGNpX3JlcV9jbGVhcl9hZHZfaW5zdGFuY2Uoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBoY2lfcmVxdWVzdCAqcmVxLAotCQkJCXU4IGluc3RhbmNlLCBib29sIGZvcmNlKTsKK3ZvaWQgaGNpX3JlcV9jbGVhcl9hZHZfaW5zdGFuY2Uoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBzb2NrICpzaywKKwkJCQlzdHJ1Y3QgaGNpX3JlcXVlc3QgKnJlcSwgdTggaW5zdGFuY2UsCisJCQkJYm9vbCBmb3JjZSk7CiAKIHZvaWQgX19oY2lfcmVxX3VwZGF0ZV9jbGFzcyhzdHJ1Y3QgaGNpX3JlcXVlc3QgKnJlcSk7CiAKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX3NvY2suYyBiL25ldC9ibHVldG9vdGgvaGNpX3NvY2suYwppbmRleCA2ZWY4YTAxLi40OGY5NDcxIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmMKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfc29jay5jCkBAIC0yNiw2ICsyNiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgpAQCAtMzgsNiArMzksOCBAQAogc3RhdGljIExJU1RfSEVBRChtZ210X2NoYW5fbGlzdCk7CiBzdGF0aWMgREVGSU5FX01VVEVYKG1nbXRfY2hhbl9saXN0X2xvY2spOwogCitzdGF0aWMgREVGSU5FX0lEQShzb2NrX2Nvb2tpZV9pZGEpOworCiBzdGF0aWMgYXRvbWljX3QgbW9uaXRvcl9wcm9taXNjID0gQVRPTUlDX0lOSVQoMCk7CiAKIC8qIC0tLS0tIEhDSSBzb2NrZXQgaW50ZXJmYWNlIC0tLS0tICovCkBAIC01Miw2ICs1NSw4IEBACiAJX191MzIgICAgICAgICAgICAgY21zZ19tYXNrOwogCXVuc2lnbmVkIHNob3J0ICAgIGNoYW5uZWw7CiAJdW5zaWduZWQgbG9uZyAgICAgZmxhZ3M7CisJX191MzIgICAgICAgICAgICAgY29va2llOworCWNoYXIgICAgICAgICAgICAgIGNvbW1bVEFTS19DT01NX0xFTl07CiB9OwogCiB2b2lkIGhjaV9zb2NrX3NldF9mbGFnKHN0cnVjdCBzb2NrICpzaywgaW50IG5yKQpAQCAtNzQsNiArNzksMzggQEAKIAlyZXR1cm4gaGNpX3BpKHNrKS0+Y2hhbm5lbDsKIH0KIAordTMyIGhjaV9zb2NrX2dldF9jb29raWUoc3RydWN0IHNvY2sgKnNrKQoreworCXJldHVybiBoY2lfcGkoc2spLT5jb29raWU7Cit9CisKK3N0YXRpYyBib29sIGhjaV9zb2NrX2dlbl9jb29raWUoc3RydWN0IHNvY2sgKnNrKQoreworCWludCBpZCA9IGhjaV9waShzayktPmNvb2tpZTsKKworCWlmICghaWQpIHsKKwkJaWQgPSBpZGFfc2ltcGxlX2dldCgmc29ja19jb29raWVfaWRhLCAxLCAwLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGlkIDwgMCkKKwkJCWlkID0gMHhmZmZmZmZmZjsKKworCQloY2lfcGkoc2spLT5jb29raWUgPSBpZDsKKwkJZ2V0X3Rhc2tfY29tbShoY2lfcGkoc2spLT5jb21tLCBjdXJyZW50KTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBoY2lfc29ja19mcmVlX2Nvb2tpZShzdHJ1Y3Qgc29jayAqc2spCit7CisJaW50IGlkID0gaGNpX3BpKHNrKS0+Y29va2llOworCisJaWYgKGlkKSB7CisJCWhjaV9waShzayktPmNvb2tpZSA9IDB4ZmZmZmZmZmY7CisJCWlkYV9zaW1wbGVfcmVtb3ZlKCZzb2NrX2Nvb2tpZV9pZGEsIGlkKTsKKwl9Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGhjaV90ZXN0X2JpdChpbnQgbnIsIGNvbnN0IHZvaWQgKmFkZHIpCiB7CiAJcmV0dXJuICooKGNvbnN0IF9fdTMyICopIGFkZHIgKyAobnIgPj4gNSkpICYgKChfX3UzMikgMSA8PCAobnIgJiAzMSkpOwpAQCAtMzA1LDYgKzM0Miw2MCBAQAogCWtmcmVlX3NrYihza2JfY29weSk7CiB9CiAKK3ZvaWQgaGNpX3NlbmRfbW9uaXRvcl9jdHJsX2V2ZW50KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1MTYgZXZlbnQsCisJCQkJIHZvaWQgKmRhdGEsIHUxNiBkYXRhX2xlbiwga3RpbWVfdCB0c3RhbXAsCisJCQkJIGludCBmbGFnLCBzdHJ1Y3Qgc29jayAqc2tpcF9zaykKK3sKKwlzdHJ1Y3Qgc29jayAqc2s7CisJX19sZTE2IGluZGV4OworCisJaWYgKGhkZXYpCisJCWluZGV4ID0gY3B1X3RvX2xlMTYoaGRldi0+aWQpOworCWVsc2UKKwkJaW5kZXggPSBjcHVfdG9fbGUxNihNR01UX0lOREVYX05PTkUpOworCisJcmVhZF9sb2NrKCZoY2lfc2tfbGlzdC5sb2NrKTsKKworCXNrX2Zvcl9lYWNoKHNrLCAmaGNpX3NrX2xpc3QuaGVhZCkgeworCQlzdHJ1Y3QgaGNpX21vbl9oZHIgKmhkcjsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQlpZiAoaGNpX3BpKHNrKS0+Y2hhbm5lbCAhPSBIQ0lfQ0hBTk5FTF9DT05UUk9MKQorCQkJY29udGludWU7CisKKwkJLyogSWdub3JlIHNvY2tldCB3aXRob3V0IHRoZSBmbGFnIHNldCAqLworCQlpZiAoIWhjaV9zb2NrX3Rlc3RfZmxhZyhzaywgZmxhZykpCisJCQljb250aW51ZTsKKworCQkvKiBTa2lwIHRoZSBvcmlnaW5hbCBzb2NrZXQgKi8KKwkJaWYgKHNrID09IHNraXBfc2spCisJCQljb250aW51ZTsKKworCQlza2IgPSBidF9za2JfYWxsb2MoNiArIGRhdGFfbGVuLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFza2IpCisJCQljb250aW51ZTsKKworCQlwdXRfdW5hbGlnbmVkX2xlMzIoaGNpX3BpKHNrKS0+Y29va2llLCBza2JfcHV0KHNrYiwgNCkpOworCQlwdXRfdW5hbGlnbmVkX2xlMTYoZXZlbnQsIHNrYl9wdXQoc2tiLCAyKSk7CisKKwkJaWYgKGRhdGEpCisJCQltZW1jcHkoc2tiX3B1dChza2IsIGRhdGFfbGVuKSwgZGF0YSwgZGF0YV9sZW4pOworCisJCXNrYi0+dHN0YW1wID0gdHN0YW1wOworCisJCWhkciA9ICh2b2lkICopc2tiX3B1c2goc2tiLCBIQ0lfTU9OX0hEUl9TSVpFKTsKKwkJaGRyLT5vcGNvZGUgPSBjcHVfdG9fbGUxNihIQ0lfTU9OX0NUUkxfRVZFTlQpOworCQloZHItPmluZGV4ID0gaW5kZXg7CisJCWhkci0+bGVuID0gY3B1X3RvX2xlMTYoc2tiLT5sZW4gLSBIQ0lfTU9OX0hEUl9TSVpFKTsKKworCQloY2lfc2VuZF90b19jaGFubmVsKEhDSV9DSEFOTkVMX01PTklUT1IsIHNrYiwKKwkJCQkgICAgSENJX1NPQ0tfVFJVU1RFRCwgTlVMTCk7CisJCWtmcmVlX3NrYihza2IpOworCX0KKworCXJlYWRfdW5sb2NrKCZoY2lfc2tfbGlzdC5sb2NrKTsKK30KKwogc3RhdGljIHN0cnVjdCBza19idWZmICpjcmVhdGVfbW9uaXRvcl9ldmVudChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgaW50IGV2ZW50KQogewogCXN0cnVjdCBoY2lfbW9uX2hkciAqaGRyOwpAQCAtMzg0LDYgKzQ3NSwxMjkgQEAKIAlyZXR1cm4gc2tiOwogfQogCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmNyZWF0ZV9tb25pdG9yX2N0cmxfb3BlbihzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGhjaV9tb25faGRyICpoZHI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1MTYgZm9ybWF0OworCXU4IHZlclszXTsKKwl1MzIgZmxhZ3M7CisKKwkvKiBObyBtZXNzYWdlIG5lZWRlZCB3aGVuIGNvb2tpZSBpcyBub3QgcHJlc2VudCAqLworCWlmICghaGNpX3BpKHNrKS0+Y29va2llKQorCQlyZXR1cm4gTlVMTDsKKworCXN3aXRjaCAoaGNpX3BpKHNrKS0+Y2hhbm5lbCkgeworCWNhc2UgSENJX0NIQU5ORUxfUkFXOgorCQlmb3JtYXQgPSAweDAwMDA7CisJCXZlclswXSA9IEJUX1NVQlNZU19WRVJTSU9OOworCQlwdXRfdW5hbGlnbmVkX2xlMTYoQlRfU1VCU1lTX1JFVklTSU9OLCB2ZXIgKyAxKTsKKwkJYnJlYWs7CisJY2FzZSBIQ0lfQ0hBTk5FTF9VU0VSOgorCQlmb3JtYXQgPSAweDAwMDE7CisJCXZlclswXSA9IEJUX1NVQlNZU19WRVJTSU9OOworCQlwdXRfdW5hbGlnbmVkX2xlMTYoQlRfU1VCU1lTX1JFVklTSU9OLCB2ZXIgKyAxKTsKKwkJYnJlYWs7CisJY2FzZSBIQ0lfQ0hBTk5FTF9DT05UUk9MOgorCQlmb3JtYXQgPSAweDAwMDI7CisJCW1nbXRfZmlsbF92ZXJzaW9uX2luZm8odmVyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogTm8gbWVzc2FnZSBmb3IgdW5zdXBwb3J0ZWQgZm9ybWF0ICovCisJCXJldHVybiBOVUxMOworCX0KKworCXNrYiA9IGJ0X3NrYl9hbGxvYygxNCArIFRBU0tfQ09NTV9MRU4gLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwlmbGFncyA9IGhjaV9zb2NrX3Rlc3RfZmxhZyhzaywgSENJX1NPQ0tfVFJVU1RFRCkgPyAweDEgOiAweDA7CisKKwlwdXRfdW5hbGlnbmVkX2xlMzIoaGNpX3BpKHNrKS0+Y29va2llLCBza2JfcHV0KHNrYiwgNCkpOworCXB1dF91bmFsaWduZWRfbGUxNihmb3JtYXQsIHNrYl9wdXQoc2tiLCAyKSk7CisJbWVtY3B5KHNrYl9wdXQoc2tiLCBzaXplb2YodmVyKSksIHZlciwgc2l6ZW9mKHZlcikpOworCXB1dF91bmFsaWduZWRfbGUzMihmbGFncywgc2tiX3B1dChza2IsIDQpKTsKKwkqc2tiX3B1dChza2IsIDEpID0gVEFTS19DT01NX0xFTjsKKwltZW1jcHkoc2tiX3B1dChza2IsIFRBU0tfQ09NTV9MRU4pLCBoY2lfcGkoc2spLT5jb21tLCBUQVNLX0NPTU1fTEVOKTsKKworCV9fbmV0X3RpbWVzdGFtcChza2IpOworCisJaGRyID0gKHZvaWQgKilza2JfcHVzaChza2IsIEhDSV9NT05fSERSX1NJWkUpOworCWhkci0+b3Bjb2RlID0gY3B1X3RvX2xlMTYoSENJX01PTl9DVFJMX09QRU4pOworCWlmIChoY2lfcGkoc2spLT5oZGV2KQorCQloZHItPmluZGV4ID0gY3B1X3RvX2xlMTYoaGNpX3BpKHNrKS0+aGRldi0+aWQpOworCWVsc2UKKwkJaGRyLT5pbmRleCA9IGNwdV90b19sZTE2KEhDSV9ERVZfTk9ORSk7CisJaGRyLT5sZW4gPSBjcHVfdG9fbGUxNihza2ItPmxlbiAtIEhDSV9NT05fSERSX1NJWkUpOworCisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICpjcmVhdGVfbW9uaXRvcl9jdHJsX2Nsb3NlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgaGNpX21vbl9oZHIgKmhkcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJLyogTm8gbWVzc2FnZSBuZWVkZWQgd2hlbiBjb29raWUgaXMgbm90IHByZXNlbnQgKi8KKwlpZiAoIWhjaV9waShzayktPmNvb2tpZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzd2l0Y2ggKGhjaV9waShzayktPmNoYW5uZWwpIHsKKwljYXNlIEhDSV9DSEFOTkVMX1JBVzoKKwljYXNlIEhDSV9DSEFOTkVMX1VTRVI6CisJY2FzZSBIQ0lfQ0hBTk5FTF9DT05UUk9MOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBObyBtZXNzYWdlIGZvciB1bnN1cHBvcnRlZCBmb3JtYXQgKi8KKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc2tiID0gYnRfc2tiX2FsbG9jKDQsIEdGUF9BVE9NSUMpOworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCXB1dF91bmFsaWduZWRfbGUzMihoY2lfcGkoc2spLT5jb29raWUsIHNrYl9wdXQoc2tiLCA0KSk7CisKKwlfX25ldF90aW1lc3RhbXAoc2tiKTsKKworCWhkciA9ICh2b2lkICopc2tiX3B1c2goc2tiLCBIQ0lfTU9OX0hEUl9TSVpFKTsKKwloZHItPm9wY29kZSA9IGNwdV90b19sZTE2KEhDSV9NT05fQ1RSTF9DTE9TRSk7CisJaWYgKGhjaV9waShzayktPmhkZXYpCisJCWhkci0+aW5kZXggPSBjcHVfdG9fbGUxNihoY2lfcGkoc2spLT5oZGV2LT5pZCk7CisJZWxzZQorCQloZHItPmluZGV4ID0gY3B1X3RvX2xlMTYoSENJX0RFVl9OT05FKTsKKwloZHItPmxlbiA9IGNwdV90b19sZTE2KHNrYi0+bGVuIC0gSENJX01PTl9IRFJfU0laRSk7CisKKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmNyZWF0ZV9tb25pdG9yX2N0cmxfY29tbWFuZChzdHJ1Y3Qgc29jayAqc2ssIHUxNiBpbmRleCwKKwkJCQkJCSAgIHUxNiBvcGNvZGUsIHUxNiBsZW4sCisJCQkJCQkgICBjb25zdCB2b2lkICpidWYpCit7CisJc3RydWN0IGhjaV9tb25faGRyICpoZHI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXNrYiA9IGJ0X3NrYl9hbGxvYyg2ICsgbGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwlwdXRfdW5hbGlnbmVkX2xlMzIoaGNpX3BpKHNrKS0+Y29va2llLCBza2JfcHV0KHNrYiwgNCkpOworCXB1dF91bmFsaWduZWRfbGUxNihvcGNvZGUsIHNrYl9wdXQoc2tiLCAyKSk7CisKKwlpZiAoYnVmKQorCQltZW1jcHkoc2tiX3B1dChza2IsIGxlbiksIGJ1ZiwgbGVuKTsKKworCV9fbmV0X3RpbWVzdGFtcChza2IpOworCisJaGRyID0gKHZvaWQgKilza2JfcHVzaChza2IsIEhDSV9NT05fSERSX1NJWkUpOworCWhkci0+b3Bjb2RlID0gY3B1X3RvX2xlMTYoSENJX01PTl9DVFJMX0NPTU1BTkQpOworCWhkci0+aW5kZXggPSBjcHVfdG9fbGUxNihpbmRleCk7CisJaGRyLT5sZW4gPSBjcHVfdG9fbGUxNihza2ItPmxlbiAtIEhDSV9NT05fSERSX1NJWkUpOworCisJcmV0dXJuIHNrYjsKK30KKwogc3RhdGljIHZvaWQgX19wcmludGYoMiwgMykKIHNlbmRfbW9uaXRvcl9ub3RlKHN0cnVjdCBzb2NrICpzaywgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CkBAIC00NTgsNiArNjcyLDI2IEBACiAJcmVhZF91bmxvY2soJmhjaV9kZXZfbGlzdF9sb2NrKTsKIH0KIAorc3RhdGljIHZvaWQgc2VuZF9tb25pdG9yX2NvbnRyb2xfcmVwbGF5KHN0cnVjdCBzb2NrICptb25fc2spCit7CisJc3RydWN0IHNvY2sgKnNrOworCisJcmVhZF9sb2NrKCZoY2lfc2tfbGlzdC5sb2NrKTsKKworCXNrX2Zvcl9lYWNoKHNrLCAmaGNpX3NrX2xpc3QuaGVhZCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCXNrYiA9IGNyZWF0ZV9tb25pdG9yX2N0cmxfb3Blbihzayk7CisJCWlmICghc2tiKQorCQkJY29udGludWU7CisKKwkJaWYgKHNvY2tfcXVldWVfcmN2X3NrYihtb25fc2ssIHNrYikpCisJCQlrZnJlZV9za2Ioc2tiKTsKKwl9CisKKwlyZWFkX3VubG9jaygmaGNpX3NrX2xpc3QubG9jayk7Cit9CisKIC8qIEdlbmVyYXRlIGludGVybmFsIHN0YWNrIGV2ZW50ICovCiBzdGF0aWMgdm9pZCBoY2lfc2lfZXZlbnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGludCB0eXBlLCBpbnQgZGxlbiwgdm9pZCAqZGF0YSkKIHsKQEAgLTU4NSw2ICs4MTksNyBAQAogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBoY2lfZGV2ICpoZGV2OworCXN0cnVjdCBza19idWZmICpza2I7CiAKIAlCVF9EQkcoInNvY2sgJXAgc2sgJXAiLCBzb2NrLCBzayk7CiAKQEAgLTU5Myw4ICs4MjgsMjQgQEAKIAogCWhkZXYgPSBoY2lfcGkoc2spLT5oZGV2OwogCi0JaWYgKGhjaV9waShzayktPmNoYW5uZWwgPT0gSENJX0NIQU5ORUxfTU9OSVRPUikKKwlzd2l0Y2ggKGhjaV9waShzayktPmNoYW5uZWwpIHsKKwljYXNlIEhDSV9DSEFOTkVMX01PTklUT1I6CiAJCWF0b21pY19kZWMoJm1vbml0b3JfcHJvbWlzYyk7CisJCWJyZWFrOworCWNhc2UgSENJX0NIQU5ORUxfUkFXOgorCWNhc2UgSENJX0NIQU5ORUxfVVNFUjoKKwljYXNlIEhDSV9DSEFOTkVMX0NPTlRST0w6CisJCS8qIFNlbmQgZXZlbnQgdG8gbW9uaXRvciAqLworCQlza2IgPSBjcmVhdGVfbW9uaXRvcl9jdHJsX2Nsb3NlKHNrKTsKKwkJaWYgKHNrYikgeworCQkJaGNpX3NlbmRfdG9fY2hhbm5lbChIQ0lfQ0hBTk5FTF9NT05JVE9SLCBza2IsCisJCQkJCSAgICBIQ0lfU09DS19UUlVTVEVELCBOVUxMKTsKKwkJCWtmcmVlX3NrYihza2IpOworCQl9CisKKwkJaGNpX3NvY2tfZnJlZV9jb29raWUoc2spOworCQlicmVhazsKKwl9CiAKIAlidF9zb2NrX3VubGluaygmaGNpX3NrX2xpc3QsIHNrKTsKIApAQCAtNzIxLDYgKzk3MiwyNyBAQAogCQlnb3RvIGRvbmU7CiAJfQogCisJLyogV2hlbiBjYWxsaW5nIGFuIGlvY3RsIG9uIGFuIHVuYm91bmQgcmF3IHNvY2tldCwgdGhlbiBlbnN1cmUKKwkgKiB0aGF0IHRoZSBtb25pdG9yIGdldHMgaW5mb3JtZWQuIEVuc3VyZSB0aGF0IHRoZSByZXN1bHRpbmcgZXZlbnQKKwkgKiBpcyBvbmx5IHNlbmQgb25jZSBieSBjaGVja2luZyBpZiB0aGUgY29va2llIGV4aXN0cyBvciBub3QuIFRoZQorCSAqIHNvY2tldCBjb29raWUgd2lsbCBiZSBvbmx5IGV2ZXIgZ2VuZXJhdGVkIG9uY2UgZm9yIHRoZSBsaWZldGltZQorCSAqIG9mIGEgZ2l2ZW4gc29ja2V0LgorCSAqLworCWlmIChoY2lfc29ja19nZW5fY29va2llKHNrKSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCWlmIChjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJaGNpX3NvY2tfc2V0X2ZsYWcoc2ssIEhDSV9TT0NLX1RSVVNURUQpOworCisJCS8qIFNlbmQgZXZlbnQgdG8gbW9uaXRvciAqLworCQlza2IgPSBjcmVhdGVfbW9uaXRvcl9jdHJsX29wZW4oc2spOworCQlpZiAoc2tiKSB7CisJCQloY2lfc2VuZF90b19jaGFubmVsKEhDSV9DSEFOTkVMX01PTklUT1IsIHNrYiwKKwkJCQkJICAgIEhDSV9TT0NLX1RSVVNURUQsIE5VTEwpOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCX0KKwl9CisKIAlyZWxlYXNlX3NvY2soc2spOwogCiAJc3dpdGNoIChjbWQpIHsKQEAgLTc4NCw2ICsxMDU2LDcgQEAKIAlzdHJ1Y3Qgc29ja2FkZHJfaGNpIGhhZGRyOwogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gTlVMTDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCBsZW4sIGVyciA9IDA7CiAKIAlCVF9EQkcoInNvY2sgJXAgc2sgJXAiLCBzb2NrLCBzayk7CkBAIC04MjIsNyArMTA5NSwzNSBAQAogCQkJYXRvbWljX2luYygmaGRldi0+cHJvbWlzYyk7CiAJCX0KIAorCQloY2lfcGkoc2spLT5jaGFubmVsID0gaGFkZHIuaGNpX2NoYW5uZWw7CisKKwkJaWYgKCFoY2lfc29ja19nZW5fY29va2llKHNrKSkgeworCQkJLyogSW4gdGhlIGNhc2Ugd2hlbiBhIGNvb2tpZSBoYXMgYWxyZWFkeSBiZWVuIGFzc2lnbmVkLAorCQkJICogdGhlbiB0aGVyZSBoYXMgYmVlbiBhbHJlYWR5IGFuIGlvY3RsIGlzc3VlZCBhZ2FpbnN0CisJCQkgKiBhbiB1bmJvdW5kIHNvY2tldCBhbmQgd2l0aCB0aGF0IHRyaWdnZXJkIGFuIG9wZW4KKwkJCSAqIG5vdGlmaWNhdGlvbi4gU2VuZCBhIGNsb3NlIG5vdGlmaWNhdGlvbiBmaXJzdCB0bworCQkJICogYWxsb3cgdGhlIHN0YXRlIHRyYW5zaXRpb24gdG8gYm91bmRlZC4KKwkJCSAqLworCQkJc2tiID0gY3JlYXRlX21vbml0b3JfY3RybF9jbG9zZShzayk7CisJCQlpZiAoc2tiKSB7CisJCQkJaGNpX3NlbmRfdG9fY2hhbm5lbChIQ0lfQ0hBTk5FTF9NT05JVE9SLCBza2IsCisJCQkJCQkgICAgSENJX1NPQ0tfVFJVU1RFRCwgTlVMTCk7CisJCQkJa2ZyZWVfc2tiKHNrYik7CisJCQl9CisJCX0KKworCQlpZiAoY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCWhjaV9zb2NrX3NldF9mbGFnKHNrLCBIQ0lfU09DS19UUlVTVEVEKTsKKwogCQloY2lfcGkoc2spLT5oZGV2ID0gaGRldjsKKworCQkvKiBTZW5kIGV2ZW50IHRvIG1vbml0b3IgKi8KKwkJc2tiID0gY3JlYXRlX21vbml0b3JfY3RybF9vcGVuKHNrKTsKKwkJaWYgKHNrYikgeworCQkJaGNpX3NlbmRfdG9fY2hhbm5lbChIQ0lfQ0hBTk5FTF9NT05JVE9SLCBza2IsCisJCQkJCSAgICBIQ0lfU09DS19UUlVTVEVELCBOVUxMKTsKKwkJCWtmcmVlX3NrYihza2IpOworCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBIQ0lfQ0hBTk5FTF9VU0VSOgpAQCAtODg0LDkgKzExODUsMzggQEAKIAkJCX0KIAkJfQogCi0JCWF0b21pY19pbmMoJmhkZXYtPnByb21pc2MpOworCQloY2lfcGkoc2spLT5jaGFubmVsID0gaGFkZHIuaGNpX2NoYW5uZWw7CisKKwkJaWYgKCFoY2lfc29ja19nZW5fY29va2llKHNrKSkgeworCQkJLyogSW4gdGhlIGNhc2Ugd2hlbiBhIGNvb2tpZSBoYXMgYWxyZWFkeSBiZWVuIGFzc2lnbmVkLAorCQkJICogdGhpcyBzb2NrZXQgd2lsbCB0cmFuc2l0aW9uIGZyb20gYSByYXcgc29ja2V0IGludG8KKwkJCSAqIGFuIHVzZXIgY2hhbm5lbCBzb2NrZXQuIEZvciBhIGNsZWFuIHRyYW5zaXRpb24sIHNlbmQKKwkJCSAqIHRoZSBjbG9zZSBub3RpZmljYXRpb24gZmlyc3QuCisJCQkgKi8KKwkJCXNrYiA9IGNyZWF0ZV9tb25pdG9yX2N0cmxfY2xvc2Uoc2spOworCQkJaWYgKHNrYikgeworCQkJCWhjaV9zZW5kX3RvX2NoYW5uZWwoSENJX0NIQU5ORUxfTU9OSVRPUiwgc2tiLAorCQkJCQkJICAgIEhDSV9TT0NLX1RSVVNURUQsIE5VTEwpOworCQkJCWtmcmVlX3NrYihza2IpOworCQkJfQorCQl9CisKKwkJLyogVGhlIHVzZXIgY2hhbm5lbCBpcyByZXN0cmljdGVkIHRvIENBUF9ORVRfQURNSU4KKwkJICogY2FwYWJpbGl0aWVzIGFuZCB3aXRoIHRoYXQgaW1wbGljaXRseSB0cnVzdGVkLgorCQkgKi8KKwkJaGNpX3NvY2tfc2V0X2ZsYWcoc2ssIEhDSV9TT0NLX1RSVVNURUQpOwogCiAJCWhjaV9waShzayktPmhkZXYgPSBoZGV2OworCisJCS8qIFNlbmQgZXZlbnQgdG8gbW9uaXRvciAqLworCQlza2IgPSBjcmVhdGVfbW9uaXRvcl9jdHJsX29wZW4oc2spOworCQlpZiAoc2tiKSB7CisJCQloY2lfc2VuZF90b19jaGFubmVsKEhDSV9DSEFOTkVMX01PTklUT1IsIHNrYiwKKwkJCQkJICAgIEhDSV9TT0NLX1RSVVNURUQsIE5VTEwpOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCX0KKworCQlhdG9taWNfaW5jKCZoZGV2LT5wcm9taXNjKTsKIAkJYnJlYWs7CiAKIAljYXNlIEhDSV9DSEFOTkVMX01PTklUT1I6CkBAIC05MDAsNiArMTIzMCw4IEBACiAJCQlnb3RvIGRvbmU7CiAJCX0KIAorCQloY2lfcGkoc2spLT5jaGFubmVsID0gaGFkZHIuaGNpX2NoYW5uZWw7CisKIAkJLyogVGhlIG1vbml0b3IgaW50ZXJmYWNlIGlzIHJlc3RyaWN0ZWQgdG8gQ0FQX05FVF9SQVcKIAkJICogY2FwYWJpbGl0aWVzIGFuZCB3aXRoIHRoYXQgaW1wbGljaXRseSB0cnVzdGVkLgogCQkgKi8KQEAgLTkwOCw5ICsxMjQwLDEwIEBACiAJCXNlbmRfbW9uaXRvcl9ub3RlKHNrLCAiTGludXggdmVyc2lvbiAlcyAoJXMpIiwKIAkJCQkgIGluaXRfdXRzbmFtZSgpLT5yZWxlYXNlLAogCQkJCSAgaW5pdF91dHNuYW1lKCktPm1hY2hpbmUpOwotCQlzZW5kX21vbml0b3Jfbm90ZShzaywgIkJsdWV0b290aCBzdWJzeXN0ZW0gdmVyc2lvbiAlcyIsCi0JCQkJICBCVF9TVUJTWVNfVkVSU0lPTik7CisJCXNlbmRfbW9uaXRvcl9ub3RlKHNrLCAiQmx1ZXRvb3RoIHN1YnN5c3RlbSB2ZXJzaW9uICV1LiV1IiwKKwkJCQkgIEJUX1NVQlNZU19WRVJTSU9OLCBCVF9TVUJTWVNfUkVWSVNJT04pOwogCQlzZW5kX21vbml0b3JfcmVwbGF5KHNrKTsKKwkJc2VuZF9tb25pdG9yX2NvbnRyb2xfcmVwbGF5KHNrKTsKIAogCQlhdG9taWNfaW5jKCZtb25pdG9yX3Byb21pc2MpOwogCQlicmVhazsKQEAgLTkyNSw2ICsxMjU4LDggQEAKIAkJCWVyciA9IC1FUEVSTTsKIAkJCWdvdG8gZG9uZTsKIAkJfQorCisJCWhjaV9waShzayktPmNoYW5uZWwgPSBoYWRkci5oY2lfY2hhbm5lbDsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtOTQ2LDYgKzEyODEsOCBAQAogCQlpZiAoY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKIAkJCWhjaV9zb2NrX3NldF9mbGFnKHNrLCBIQ0lfU09DS19UUlVTVEVEKTsKIAorCQloY2lfcGkoc2spLT5jaGFubmVsID0gaGFkZHIuaGNpX2NoYW5uZWw7CisKIAkJLyogQXQgdGhlIG1vbWVudCB0aGUgaW5kZXggYW5kIHVuY29uZmlndXJlZCBpbmRleCBldmVudHMKIAkJICogYXJlIGVuYWJsZWQgdW5jb25kaXRpb25hbGx5LiBTZXR0aW5nIHRoZW0gb24gZWFjaAogCQkgKiBzb2NrZXQgd2hlbiBiaW5kaW5nIGtlZXBzIHRoaXMgZnVuY3Rpb25hbGl0eS4gVGhleQpAQCAtOTU2LDE2ICsxMjkzLDQwIEBACiAJCSAqIHJlY2VpdmVkIGJ5IHVudHJ1c3RlZCB1c2Vycy4gRXhhbXBsZSBmb3Igc3VjaCBldmVudHMKIAkJICogYXJlIGNoYW5nZXMgdG8gc2V0dGluZ3MsIGNsYXNzIG9mIGRldmljZSwgbmFtZSBldGMuCiAJCSAqLwotCQlpZiAoaGFkZHIuaGNpX2NoYW5uZWwgPT0gSENJX0NIQU5ORUxfQ09OVFJPTCkgeworCQlpZiAoaGNpX3BpKHNrKS0+Y2hhbm5lbCA9PSBIQ0lfQ0hBTk5FTF9DT05UUk9MKSB7CisJCQlpZiAoIWhjaV9zb2NrX2dlbl9jb29raWUoc2spKSB7CisJCQkJLyogSW4gdGhlIGNhc2Ugd2hlbiBhIGNvb2tpZSBoYXMgYWxyZWFkeSBiZWVuCisJCQkJICogYXNzaWduZWQsIHRoaXMgc29ja2V0IHdpbGwgdHJhbnN0aW9uIGZyb20KKwkJCQkgKiBhIHJhdyBzb2NrZXQgaW50byBhIGNvbnRyb2wgc29ja2V0LiBUbworCQkJCSAqIGFsbG93IGZvciBhIGNsZWFuIHRyYW5zdGlvbiwgc2VuZCB0aGUKKwkJCQkgKiBjbG9zZSBub3RpZmljYXRpb24gZmlyc3QuCisJCQkJICovCisJCQkJc2tiID0gY3JlYXRlX21vbml0b3JfY3RybF9jbG9zZShzayk7CisJCQkJaWYgKHNrYikgeworCQkJCQloY2lfc2VuZF90b19jaGFubmVsKEhDSV9DSEFOTkVMX01PTklUT1IsIHNrYiwKKwkJCQkJCQkgICAgSENJX1NPQ0tfVFJVU1RFRCwgTlVMTCk7CisJCQkJCWtmcmVlX3NrYihza2IpOworCQkJCX0KKwkJCX0KKworCQkJLyogU2VuZCBldmVudCB0byBtb25pdG9yICovCisJCQlza2IgPSBjcmVhdGVfbW9uaXRvcl9jdHJsX29wZW4oc2spOworCQkJaWYgKHNrYikgeworCQkJCWhjaV9zZW5kX3RvX2NoYW5uZWwoSENJX0NIQU5ORUxfTU9OSVRPUiwgc2tiLAorCQkJCQkJICAgIEhDSV9TT0NLX1RSVVNURUQsIE5VTEwpOworCQkJCWtmcmVlX3NrYihza2IpOworCQkJfQorCiAJCQloY2lfc29ja19zZXRfZmxhZyhzaywgSENJX01HTVRfSU5ERVhfRVZFTlRTKTsKIAkJCWhjaV9zb2NrX3NldF9mbGFnKHNrLCBIQ0lfTUdNVF9VTkNPTkZfSU5ERVhfRVZFTlRTKTsKLQkJCWhjaV9zb2NrX3NldF9mbGFnKHNrLCBIQ0lfTUdNVF9HRU5FUklDX0VWRU5UUyk7CisJCQloY2lfc29ja19zZXRfZmxhZyhzaywgSENJX01HTVRfT1BUSU9OX0VWRU5UUyk7CisJCQloY2lfc29ja19zZXRfZmxhZyhzaywgSENJX01HTVRfU0VUVElOR19FVkVOVFMpOworCQkJaGNpX3NvY2tfc2V0X2ZsYWcoc2ssIEhDSV9NR01UX0RFVl9DTEFTU19FVkVOVFMpOworCQkJaGNpX3NvY2tfc2V0X2ZsYWcoc2ssIEhDSV9NR01UX0xPQ0FMX05BTUVfRVZFTlRTKTsKIAkJfQogCQlicmVhazsKIAl9CiAKLQotCWhjaV9waShzayktPmNoYW5uZWwgPSBoYWRkci5oY2lfY2hhbm5lbDsKIAlzay0+c2tfc3RhdGUgPSBCVF9CT1VORDsKIAogZG9uZToKQEAgLTEwOTEsNyArMTQ1Miw3IEBACiAKIAlza2JfZnJlZV9kYXRhZ3JhbShzaywgc2tiKTsKIAotCWlmIChtc2ctPm1zZ19mbGFncyAmIE1TR19UUlVOQykKKwlpZiAoZmxhZ3MgJiBNU0dfVFJVTkMpCiAJCWNvcGllZCA9IHNrYmxlbjsKIAogCXJldHVybiBlcnIgPyA6IGNvcGllZDsKQEAgLTExMzMsNiArMTQ5NCwxOSBAQAogCQlnb3RvIGRvbmU7CiAJfQogCisJaWYgKGNoYW4tPmNoYW5uZWwgPT0gSENJX0NIQU5ORUxfQ09OVFJPTCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCS8qIFNlbmQgZXZlbnQgdG8gbW9uaXRvciAqLworCQlza2IgPSBjcmVhdGVfbW9uaXRvcl9jdHJsX2NvbW1hbmQoc2ssIGluZGV4LCBvcGNvZGUsIGxlbiwKKwkJCQkJCSAgYnVmICsgc2l6ZW9mKCpoZHIpKTsKKwkJaWYgKHNrYikgeworCQkJaGNpX3NlbmRfdG9fY2hhbm5lbChIQ0lfQ0hBTk5FTF9NT05JVE9SLCBza2IsCisJCQkJCSAgICBIQ0lfU09DS19UUlVTVEVELCBOVUxMKTsKKwkJCWtmcmVlX3NrYihza2IpOworCQl9CisJfQorCiAJaWYgKG9wY29kZSA+PSBjaGFuLT5oYW5kbGVyX2NvdW50IHx8CiAJICAgIGNoYW4tPmhhbmRsZXJzW29wY29kZV0uZnVuYyA9PSBOVUxMKSB7CiAJCUJUX0RCRygiVW5rbm93biBvcCAldSIsIG9wY29kZSk7CkBAIC0xNDQwLDYgKzE4MTQsOSBAQAogCiAJQlRfREJHKCJzayAlcCwgb3B0ICVkIiwgc2ssIG9wdG5hbWUpOwogCisJaWYgKGxldmVsICE9IFNPTF9IQ0kpCisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisKIAlsb2NrX3NvY2soc2spOwogCiAJaWYgKGhjaV9waShzayktPmNoYW5uZWwgIT0gSENJX0NIQU5ORUxfUkFXKSB7CkBAIC0xNTIzLDYgKzE5MDAsOSBAQAogCiAJQlRfREJHKCJzayAlcCwgb3B0ICVkIiwgc2ssIG9wdG5hbWUpOwogCisJaWYgKGxldmVsICE9IFNPTF9IQ0kpCisJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisKIAlpZiAoZ2V0X3VzZXIobGVuLCBvcHRsZW4pKQogCQlyZXR1cm4gLUVGQVVMVDsKIApkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9sMmNhcF9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2wyY2FwX2NvcmUuYwppbmRleCA1NGNlYjFmLi5kNGNhZDI5YjAgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvbDJjYXBfY29yZS5jCisrKyBiL25ldC9ibHVldG9vdGgvbDJjYXBfY29yZS5jCkBAIC0zMiw2ICszMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMTYuaD4KKyNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KIAogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgpAQCAtNTgzNSw2ICs1ODM2LDkgQEAKIAkJaWYgKGNoYW4tPnNkdSkKIAkJCWJyZWFrOwogCisJCWlmICghcHNrYl9tYXlfcHVsbChza2IsIEwyQ0FQX1NEVUxFTl9TSVpFKSkKKwkJCWJyZWFrOworCiAJCWNoYW4tPnNkdV9sZW4gPSBnZXRfdW5hbGlnbmVkX2xlMTYoc2tiLT5kYXRhKTsKIAkJc2tiX3B1bGwoc2tiLCBMMkNBUF9TRFVMRU5fU0laRSk7CiAKQEAgLTY2MTAsNiArNjYxNCwxMCBAQAogCQlnb3RvIGRyb3A7CiAJfQogCisJaWYgKChjaGFuLT5tb2RlID09IEwyQ0FQX01PREVfRVJUTSB8fAorCSAgICAgY2hhbi0+bW9kZSA9PSBMMkNBUF9NT0RFX1NUUkVBTUlORykgJiYgc2tfZmlsdGVyKGNoYW4tPmRhdGEsIHNrYikpCisJCWdvdG8gZHJvcDsKKwogCWlmICghY29udHJvbC0+c2ZyYW1lKSB7CiAJCWludCBlcnI7CiAKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvbDJjYXBfc29jay5jIGIvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmMKaW5kZXggMTg0MjE0MS4uYThiYTc1MiAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmMKKysrIGIvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmMKQEAgLTEwMTksNyArMTAxOSw3IEBACiAJCWdvdG8gZG9uZTsKIAogCWlmIChwaS0+cnhfYnVzeV9za2IpIHsKLQkJaWYgKCFzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssIHBpLT5yeF9idXN5X3NrYikpCisJCWlmICghX19zb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssIHBpLT5yeF9idXN5X3NrYikpCiAJCQlwaS0+cnhfYnVzeV9za2IgPSBOVUxMOwogCQllbHNlCiAJCQlnb3RvIGRvbmU7CkBAIC0xMjcwLDcgKzEyNzAsMTcgQEAKIAkJZ290byBkb25lOwogCX0KIAotCWVyciA9IHNvY2tfcXVldWVfcmN2X3NrYihzaywgc2tiKTsKKwlpZiAoY2hhbi0+bW9kZSAhPSBMMkNBUF9NT0RFX0VSVE0gJiYKKwkgICAgY2hhbi0+bW9kZSAhPSBMMkNBUF9NT0RFX1NUUkVBTUlORykgeworCQkvKiBFdmVuIGlmIG5vIGZpbHRlciBpcyBhdHRhY2hlZCwgd2UgY291bGQgcG90ZW50aWFsbHkKKwkJICogZ2V0IGVycm9ycyBmcm9tIHNlY3VyaXR5IG1vZHVsZXMsIGV0Yy4KKwkJICovCisJCWVyciA9IHNrX2ZpbHRlcihzaywgc2tiKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZG9uZTsKKwl9CisKKwllcnIgPSBfX3NvY2tfcXVldWVfcmN2X3NrYihzaywgc2tiKTsKIAogCS8qIEZvciBFUlRNLCBoYW5kbGUgb25lIHNrYiB0aGF0IGRvZXNuJ3QgZml0IGludG8gdGhlIHJlY3YKIAkgKiBidWZmZXIuICBUaGlzIGlzIGltcG9ydGFudCB0byBkbyBiZWNhdXNlIHRoZSBkYXRhIGZyYW1lcwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9sZWRzLmMgYi9uZXQvYmx1ZXRvb3RoL2xlZHMuYwppbmRleCA4MzE5Yzg0Li5jYjY3MGI1IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2xlZHMuYworKysgYi9uZXQvYmx1ZXRvb3RoL2xlZHMuYwpAQCAtMTEsNiArMTEsOCBAQAogCiAjaW5jbHVkZSAibGVkcy5oIgogCitERUZJTkVfTEVEX1RSSUdHRVIoYnRfcG93ZXJfbGVkX3RyaWdnZXIpOworCiBzdHJ1Y3QgaGNpX2Jhc2ljX2xlZF90cmlnZ2VyIHsKIAlzdHJ1Y3QgbGVkX3RyaWdnZXIJbGVkX3RyaWdnZXI7CiAJc3RydWN0IGhjaV9kZXYJCSpoZGV2OwpAQCAtMjQsNiArMjYsMjEgQEAKIAlpZiAoaGRldi0+cG93ZXJfbGVkKQogCQlsZWRfdHJpZ2dlcl9ldmVudChoZGV2LT5wb3dlcl9sZWQsCiAJCQkJICBlbmFibGVkID8gTEVEX0ZVTEwgOiBMRURfT0ZGKTsKKworCWlmICghZW5hYmxlZCkgeworCQlzdHJ1Y3QgaGNpX2RldiAqZDsKKworCQlyZWFkX2xvY2soJmhjaV9kZXZfbGlzdF9sb2NrKTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGQsICZoY2lfZGV2X2xpc3QsIGxpc3QpIHsKKwkJCWlmICh0ZXN0X2JpdChIQ0lfVVAsICZkLT5mbGFncykpCisJCQkJZW5hYmxlZCA9IHRydWU7CisJCX0KKworCQlyZWFkX3VubG9jaygmaGNpX2Rldl9saXN0X2xvY2spOworCX0KKworCWxlZF90cmlnZ2VyX2V2ZW50KGJ0X3Bvd2VyX2xlZF90cmlnZ2VyLCBlbmFibGVkID8gTEVEX0ZVTEwgOiBMRURfT0ZGKTsKIH0KIAogc3RhdGljIHZvaWQgcG93ZXJfYWN0aXZhdGUoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYpCkBAIC03MiwzICs4OSwxMyBAQAogCS8qIGluaXRpYWxpemUgcG93ZXJfbGVkICovCiAJaGRldi0+cG93ZXJfbGVkID0gbGVkX2FsbG9jYXRlX2Jhc2ljKGhkZXYsIHBvd2VyX2FjdGl2YXRlLCAicG93ZXIiKTsKIH0KKwordm9pZCBidF9sZWRzX2luaXQodm9pZCkKK3sKKwlsZWRfdHJpZ2dlcl9yZWdpc3Rlcl9zaW1wbGUoImJsdWV0b290aC1wb3dlciIsICZidF9wb3dlcl9sZWRfdHJpZ2dlcik7Cit9CisKK3ZvaWQgYnRfbGVkc19jbGVhbnVwKHZvaWQpCit7CisJbGVkX3RyaWdnZXJfdW5yZWdpc3Rlcl9zaW1wbGUoYnRfcG93ZXJfbGVkX3RyaWdnZXIpOworfQpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9sZWRzLmggYi9uZXQvYmx1ZXRvb3RoL2xlZHMuaAppbmRleCBhOWM0ZDZlLi4wODcyNWEyIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2xlZHMuaAorKysgYi9uZXQvYmx1ZXRvb3RoL2xlZHMuaApAQCAtNywxMCArNywyMCBAQAogICovCiAKICNpZiBJU19FTkFCTEVEKENPTkZJR19CVF9MRURTKQorCiB2b2lkIGhjaV9sZWRzX3VwZGF0ZV9wb3dlcmVkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBib29sIGVuYWJsZWQpOwogdm9pZCBoY2lfbGVkc19pbml0KHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKKwordm9pZCBidF9sZWRzX2luaXQodm9pZCk7Cit2b2lkIGJ0X2xlZHNfY2xlYW51cCh2b2lkKTsKKwogI2Vsc2UKKwogc3RhdGljIGlubGluZSB2b2lkIGhjaV9sZWRzX3VwZGF0ZV9wb3dlcmVkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LAogCQkJCQkgICBib29sIGVuYWJsZWQpIHt9CiBzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2xlZHNfaW5pdChzdHJ1Y3QgaGNpX2RldiAqaGRldikge30KKworc3RhdGljIGlubGluZSB2b2lkIGJ0X2xlZHNfaW5pdCh2b2lkKSB7fQorc3RhdGljIGlubGluZSB2b2lkIGJ0X2xlZHNfY2xlYW51cCh2b2lkKSB7fQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvbWdtdC5jIGIvbmV0L2JsdWV0b290aC9tZ210LmMKaW5kZXggNzYzOTI5MC4uMTliOGE1ZSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9tZ210LmMKKysrIGIvbmV0L2JsdWV0b290aC9tZ210LmMKQEAgLTM4LDcgKzM4LDcgQEAKICNpbmNsdWRlICJtZ210X3V0aWwuaCIKIAogI2RlZmluZSBNR01UX1ZFUlNJT04JMQotI2RlZmluZSBNR01UX1JFVklTSU9OCTEzCisjZGVmaW5lIE1HTVRfUkVWSVNJT04JMTQKIAogc3RhdGljIGNvbnN0IHUxNiBtZ210X2NvbW1hbmRzW10gPSB7CiAJTUdNVF9PUF9SRUFEX0lOREVYX0xJU1QsCkBAIC0xMDQsNiArMTA0LDggQEAKIAlNR01UX09QX1JFTU9WRV9BRFZFUlRJU0lORywKIAlNR01UX09QX0dFVF9BRFZfU0laRV9JTkZPLAogCU1HTVRfT1BfU1RBUlRfTElNSVRFRF9ESVNDT1ZFUlksCisJTUdNVF9PUF9SRUFEX0VYVF9JTkZPLAorCU1HTVRfT1BfU0VUX0FQUEVBUkFOQ0UsCiB9OwogCiBzdGF0aWMgY29uc3QgdTE2IG1nbXRfZXZlbnRzW10gPSB7CkBAIC0xNDEsNiArMTQzLDcgQEAKIAlNR01UX0VWX0xPQ0FMX09PQl9EQVRBX1VQREFURUQsCiAJTUdNVF9FVl9BRFZFUlRJU0lOR19BRERFRCwKIAlNR01UX0VWX0FEVkVSVElTSU5HX1JFTU9WRUQsCisJTUdNVF9FVl9FWFRfSU5GT19DSEFOR0VELAogfTsKIAogc3RhdGljIGNvbnN0IHUxNiBtZ210X3VudHJ1c3RlZF9jb21tYW5kc1tdID0gewpAQCAtMTQ5LDYgKzE1Miw3IEBACiAJTUdNVF9PUF9SRUFEX1VOQ09ORl9JTkRFWF9MSVNULAogCU1HTVRfT1BfUkVBRF9DT05GSUdfSU5GTywKIAlNR01UX09QX1JFQURfRVhUX0lOREVYX0xJU1QsCisJTUdNVF9PUF9SRUFEX0VYVF9JTkZPLAogfTsKIAogc3RhdGljIGNvbnN0IHUxNiBtZ210X3VudHJ1c3RlZF9ldmVudHNbXSA9IHsKQEAgLTE2Miw2ICsxNjYsNyBAQAogCU1HTVRfRVZfTkVXX0NPTkZJR19PUFRJT05TLAogCU1HTVRfRVZfRVhUX0lOREVYX0FEREVELAogCU1HTVRfRVZfRVhUX0lOREVYX1JFTU9WRUQsCisJTUdNVF9FVl9FWFRfSU5GT19DSEFOR0VELAogfTsKIAogI2RlZmluZSBDQUNIRV9USU1FT1VUCW1zZWNzX3RvX2ppZmZpZXMoMiAqIDEwMDApCkBAIC0yNTYsMTMgKzI2MSw2IEBACiAJCQkgICAgICAgZmxhZywgc2tpcF9zayk7CiB9CiAKLXN0YXRpYyBpbnQgbWdtdF9nZW5lcmljX2V2ZW50KHUxNiBldmVudCwgc3RydWN0IGhjaV9kZXYgKmhkZXYsIHZvaWQgKmRhdGEsCi0JCQkgICAgICB1MTYgbGVuLCBzdHJ1Y3Qgc29jayAqc2tpcF9zaykKLXsKLQlyZXR1cm4gbWdtdF9zZW5kX2V2ZW50KGV2ZW50LCBoZGV2LCBIQ0lfQ0hBTk5FTF9DT05UUk9MLCBkYXRhLCBsZW4sCi0JCQkgICAgICAgSENJX01HTVRfR0VORVJJQ19FVkVOVFMsIHNraXBfc2spOwotfQotCiBzdGF0aWMgaW50IG1nbXRfZXZlbnQodTE2IGV2ZW50LCBzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdm9pZCAqZGF0YSwgdTE2IGxlbiwKIAkJICAgICAgc3RydWN0IHNvY2sgKnNraXBfc2spCiB7CkBAIC0yNzgsNiArMjc2LDE0IEBACiAJCXJldHVybiBBRERSX0xFX0RFVl9SQU5ET007CiB9CiAKK3ZvaWQgbWdtdF9maWxsX3ZlcnNpb25faW5mbyh2b2lkICp2ZXIpCit7CisJc3RydWN0IG1nbXRfcnBfcmVhZF92ZXJzaW9uICpycCA9IHZlcjsKKworCXJwLT52ZXJzaW9uID0gTUdNVF9WRVJTSU9OOworCXJwLT5yZXZpc2lvbiA9IGNwdV90b19sZTE2KE1HTVRfUkVWSVNJT04pOworfQorCiBzdGF0aWMgaW50IHJlYWRfdmVyc2lvbihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB2b2lkICpkYXRhLAogCQkJdTE2IGRhdGFfbGVuKQogewpAQCAtMjg1LDggKzI5MSw3IEBACiAKIAlCVF9EQkcoInNvY2sgJXAiLCBzayk7CiAKLQlycC52ZXJzaW9uID0gTUdNVF9WRVJTSU9OOwotCXJwLnJldmlzaW9uID0gY3B1X3RvX2xlMTYoTUdNVF9SRVZJU0lPTik7CisJbWdtdF9maWxsX3ZlcnNpb25faW5mbygmcnApOwogCiAJcmV0dXJuIG1nbXRfY21kX2NvbXBsZXRlKHNrLCBNR01UX0lOREVYX05PTkUsIE1HTVRfT1BfUkVBRF9WRVJTSU9OLCAwLAogCQkJCSAmcnAsIHNpemVvZihycCkpOwpAQCAtNTcyLDggKzU3Nyw4IEBACiB7CiAJX19sZTMyIG9wdGlvbnMgPSBnZXRfbWlzc2luZ19vcHRpb25zKGhkZXYpOwogCi0JcmV0dXJuIG1nbXRfZ2VuZXJpY19ldmVudChNR01UX0VWX05FV19DT05GSUdfT1BUSU9OUywgaGRldiwgJm9wdGlvbnMsCi0JCQkJICBzaXplb2Yob3B0aW9ucyksIHNraXApOworCXJldHVybiBtZ210X2xpbWl0ZWRfZXZlbnQoTUdNVF9FVl9ORVdfQ09ORklHX09QVElPTlMsIGhkZXYsICZvcHRpb25zLAorCQkJCSAgc2l6ZW9mKG9wdGlvbnMpLCBIQ0lfTUdNVF9PUFRJT05fRVZFTlRTLCBza2lwKTsKIH0KIAogc3RhdGljIGludCBzZW5kX29wdGlvbnNfcnNwKHN0cnVjdCBzb2NrICpzaywgdTE2IG9wY29kZSwgc3RydWN0IGhjaV9kZXYgKmhkZXYpCkBAIC04NjIsNiArODY3LDEwNyBAQAogCQkJCSBzaXplb2YocnApKTsKIH0KIAorc3RhdGljIGlubGluZSB1MTYgZWlyX2FwcGVuZF9kYXRhKHU4ICplaXIsIHUxNiBlaXJfbGVuLCB1OCB0eXBlLCB1OCAqZGF0YSwKKwkJCQkgIHU4IGRhdGFfbGVuKQoreworCWVpcltlaXJfbGVuKytdID0gc2l6ZW9mKHR5cGUpICsgZGF0YV9sZW47CisJZWlyW2Vpcl9sZW4rK10gPSB0eXBlOworCW1lbWNweSgmZWlyW2Vpcl9sZW5dLCBkYXRhLCBkYXRhX2xlbik7CisJZWlyX2xlbiArPSBkYXRhX2xlbjsKKworCXJldHVybiBlaXJfbGVuOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBlaXJfYXBwZW5kX2xlMTYodTggKmVpciwgdTE2IGVpcl9sZW4sIHU4IHR5cGUsIHUxNiBkYXRhKQoreworCWVpcltlaXJfbGVuKytdID0gc2l6ZW9mKHR5cGUpICsgc2l6ZW9mKGRhdGEpOworCWVpcltlaXJfbGVuKytdID0gdHlwZTsKKwlwdXRfdW5hbGlnbmVkX2xlMTYoZGF0YSwgJmVpcltlaXJfbGVuXSk7CisJZWlyX2xlbiArPSBzaXplb2YoZGF0YSk7CisKKwlyZXR1cm4gZWlyX2xlbjsKK30KKworc3RhdGljIHUxNiBhcHBlbmRfZWlyX2RhdGFfdG9fYnVmKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCAqZWlyKQoreworCXUxNiBlaXJfbGVuID0gMDsKKwlzaXplX3QgbmFtZV9sZW47CisKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0JSRURSX0VOQUJMRUQpKQorCQllaXJfbGVuID0gZWlyX2FwcGVuZF9kYXRhKGVpciwgZWlyX2xlbiwgRUlSX0NMQVNTX09GX0RFViwKKwkJCQkJICBoZGV2LT5kZXZfY2xhc3MsIDMpOworCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9MRV9FTkFCTEVEKSkKKwkJZWlyX2xlbiA9IGVpcl9hcHBlbmRfbGUxNihlaXIsIGVpcl9sZW4sIEVJUl9BUFBFQVJBTkNFLAorCQkJCQkgIGhkZXYtPmFwcGVhcmFuY2UpOworCisJbmFtZV9sZW4gPSBzdHJsZW4oaGRldi0+ZGV2X25hbWUpOworCWVpcl9sZW4gPSBlaXJfYXBwZW5kX2RhdGEoZWlyLCBlaXJfbGVuLCBFSVJfTkFNRV9DT01QTEVURSwKKwkJCQkgIGhkZXYtPmRldl9uYW1lLCBuYW1lX2xlbik7CisKKwluYW1lX2xlbiA9IHN0cmxlbihoZGV2LT5zaG9ydF9uYW1lKTsKKwllaXJfbGVuID0gZWlyX2FwcGVuZF9kYXRhKGVpciwgZWlyX2xlbiwgRUlSX05BTUVfU0hPUlQsCisJCQkJICBoZGV2LT5zaG9ydF9uYW1lLCBuYW1lX2xlbik7CisKKwlyZXR1cm4gZWlyX2xlbjsKK30KKworc3RhdGljIGludCByZWFkX2V4dF9jb250cm9sbGVyX2luZm8oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaGNpX2RldiAqaGRldiwKKwkJCQkgICAgdm9pZCAqZGF0YSwgdTE2IGRhdGFfbGVuKQoreworCWNoYXIgYnVmWzUxMl07CisJc3RydWN0IG1nbXRfcnBfcmVhZF9leHRfaW5mbyAqcnAgPSAodm9pZCAqKWJ1ZjsKKwl1MTYgZWlyX2xlbjsKKworCUJUX0RCRygic29jayAlcCAlcyIsIHNrLCBoZGV2LT5uYW1lKTsKKworCW1lbXNldCgmYnVmLCAwLCBzaXplb2YoYnVmKSk7CisKKwloY2lfZGV2X2xvY2soaGRldik7CisKKwliYWNweSgmcnAtPmJkYWRkciwgJmhkZXYtPmJkYWRkcik7CisKKwlycC0+dmVyc2lvbiA9IGhkZXYtPmhjaV92ZXI7CisJcnAtPm1hbnVmYWN0dXJlciA9IGNwdV90b19sZTE2KGhkZXYtPm1hbnVmYWN0dXJlcik7CisKKwlycC0+c3VwcG9ydGVkX3NldHRpbmdzID0gY3B1X3RvX2xlMzIoZ2V0X3N1cHBvcnRlZF9zZXR0aW5ncyhoZGV2KSk7CisJcnAtPmN1cnJlbnRfc2V0dGluZ3MgPSBjcHVfdG9fbGUzMihnZXRfY3VycmVudF9zZXR0aW5ncyhoZGV2KSk7CisKKworCWVpcl9sZW4gPSBhcHBlbmRfZWlyX2RhdGFfdG9fYnVmKGhkZXYsIHJwLT5laXIpOworCXJwLT5laXJfbGVuID0gY3B1X3RvX2xlMTYoZWlyX2xlbik7CisKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKKworCS8qIElmIHRoaXMgY29tbWFuZCBpcyBjYWxsZWQgYXQgbGVhc3Qgb25jZSwgdGhlbiB0aGUgZXZlbnRzCisJICogZm9yIGNsYXNzIG9mIGRldmljZSBhbmQgbG9jYWwgbmFtZSBjaGFuZ2VzIGFyZSBkaXNhYmxlZAorCSAqIGFuZCBvbmx5IHRoZSBuZXcgZXh0ZW5kZWQgY29udHJvbGxlciBpbmZvcm1hdGlvbiBldmVudAorCSAqIGlzIHVzZWQuCisJICovCisJaGNpX3NvY2tfc2V0X2ZsYWcoc2ssIEhDSV9NR01UX0VYVF9JTkZPX0VWRU5UUyk7CisJaGNpX3NvY2tfY2xlYXJfZmxhZyhzaywgSENJX01HTVRfREVWX0NMQVNTX0VWRU5UUyk7CisJaGNpX3NvY2tfY2xlYXJfZmxhZyhzaywgSENJX01HTVRfTE9DQUxfTkFNRV9FVkVOVFMpOworCisJcmV0dXJuIG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9SRUFEX0VYVF9JTkZPLCAwLCBycCwKKwkJCQkgc2l6ZW9mKCpycCkgKyBlaXJfbGVuKTsKK30KKworc3RhdGljIGludCBleHRfaW5mb19jaGFuZ2VkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc29jayAqc2tpcCkKK3sKKwljaGFyIGJ1Zls1MTJdOworCXN0cnVjdCBtZ210X2V2X2V4dF9pbmZvX2NoYW5nZWQgKmV2ID0gKHZvaWQgKilidWY7CisJdTE2IGVpcl9sZW47CisKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisKKwllaXJfbGVuID0gYXBwZW5kX2Vpcl9kYXRhX3RvX2J1ZihoZGV2LCBldi0+ZWlyKTsKKwlldi0+ZWlyX2xlbiA9IGNwdV90b19sZTE2KGVpcl9sZW4pOworCisJcmV0dXJuIG1nbXRfbGltaXRlZF9ldmVudChNR01UX0VWX0VYVF9JTkZPX0NIQU5HRUQsIGhkZXYsIGV2LAorCQkJCSAgc2l6ZW9mKCpldikgKyBlaXJfbGVuLAorCQkJCSAgSENJX01HTVRfRVhUX0lORk9fRVZFTlRTLCBza2lwKTsKK30KKwogc3RhdGljIGludCBzZW5kX3NldHRpbmdzX3JzcChzdHJ1Y3Qgc29jayAqc2ssIHUxNiBvcGNvZGUsIHN0cnVjdCBoY2lfZGV2ICpoZGV2KQogewogCV9fbGUzMiBzZXR0aW5ncyA9IGNwdV90b19sZTMyKGdldF9jdXJyZW50X3NldHRpbmdzKGhkZXYpKTsKQEAgLTkyMiw3ICsxMDI4LDcgQEAKIAkJaGNpX3JlcV9hZGQoJnJlcSwgSENJX09QX1dSSVRFX1NDQU5fRU5BQkxFLCAxLCAmc2Nhbik7CiAJfQogCi0JaGNpX3JlcV9jbGVhcl9hZHZfaW5zdGFuY2UoaGRldiwgTlVMTCwgMHgwMCwgZmFsc2UpOworCWhjaV9yZXFfY2xlYXJfYWR2X2luc3RhbmNlKGhkZXYsIE5VTEwsIE5VTEwsIDB4MDAsIGZhbHNlKTsKIAogCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfTEVfQURWKSkKIAkJX19oY2lfcmVxX2Rpc2FibGVfYWR2ZXJ0aXNpbmcoJnJlcSk7CkBAIC0xMDAwLDggKzExMDYsOCBAQAogewogCV9fbGUzMiBldiA9IGNwdV90b19sZTMyKGdldF9jdXJyZW50X3NldHRpbmdzKGhkZXYpKTsKIAotCXJldHVybiBtZ210X2dlbmVyaWNfZXZlbnQoTUdNVF9FVl9ORVdfU0VUVElOR1MsIGhkZXYsICZldiwKLQkJCQkgIHNpemVvZihldiksIHNraXApOworCXJldHVybiBtZ210X2xpbWl0ZWRfZXZlbnQoTUdNVF9FVl9ORVdfU0VUVElOR1MsIGhkZXYsICZldiwKKwkJCQkgIHNpemVvZihldiksIEhDSV9NR01UX1NFVFRJTkdfRVZFTlRTLCBza2lwKTsKIH0KIAogaW50IG1nbXRfbmV3X3NldHRpbmdzKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQpAQCAtMTY5MCw3ICsxNzk2LDcgQEAKIAllbmFibGVkID0gbG1wX2hvc3RfbGVfY2FwYWJsZShoZGV2KTsKIAogCWlmICghdmFsKQotCQloY2lfcmVxX2NsZWFyX2Fkdl9pbnN0YW5jZShoZGV2LCBOVUxMLCAweDAwLCB0cnVlKTsKKwkJaGNpX3JlcV9jbGVhcl9hZHZfaW5zdGFuY2UoaGRldiwgTlVMTCwgTlVMTCwgMHgwMCwgdHJ1ZSk7CiAKIAlpZiAoIWhkZXZfaXNfcG93ZXJlZChoZGV2KSB8fCB2YWwgPT0gZW5hYmxlZCkgewogCQlib29sIGNoYW5nZWQgPSBmYWxzZTsKQEAgLTI0MzUsNiArMjU0MSw4IEBACiAJaWYgKCFjbWQpCiAJCXJldHVybiAtRU5PTUVNOwogCisJY21kLT5jbWRfY29tcGxldGUgPSBhZGRyX2NtZF9jb21wbGV0ZTsKKwogCWVyciA9IGhjaV9zZW5kX2NtZChoZGV2LCBIQ0lfT1BfUElOX0NPREVfTkVHX1JFUExZLAogCQkJICAgc2l6ZW9mKGNwLT5hZGRyLmJkYWRkciksICZjcC0+YWRkci5iZGFkZHIpOwogCWlmIChlcnIgPCAwKQpAQCAtMjUxMyw4ICsyNjIxLDggQEAKIAlCVF9EQkcoIiIpOwogCiAJaWYgKGNwLT5pb19jYXBhYmlsaXR5ID4gU01QX0lPX0tFWUJPQVJEX0RJU1BMQVkpCi0JCXJldHVybiBtZ210X2NtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0lPX0NBUEFCSUxJVFksCi0JCQkJCSBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUywgTlVMTCwgMCk7CisJCXJldHVybiBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9JT19DQVBBQklMSVRZLAorCQkJCSAgICAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKQEAgLTI5MzIsNiArMzA0MCwzNSBAQAogCQkJCSBIQ0lfT1BfVVNFUl9QQVNTS0VZX05FR19SRVBMWSwgMCk7CiB9CiAKK3N0YXRpYyB2b2lkIGFkdl9leHBpcmUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHUzMiBmbGFncykKK3sKKwlzdHJ1Y3QgYWR2X2luZm8gKmFkdl9pbnN0YW5jZTsKKwlzdHJ1Y3QgaGNpX3JlcXVlc3QgcmVxOworCWludCBlcnI7CisKKwlhZHZfaW5zdGFuY2UgPSBoY2lfZmluZF9hZHZfaW5zdGFuY2UoaGRldiwgaGRldi0+Y3VyX2Fkdl9pbnN0YW5jZSk7CisJaWYgKCFhZHZfaW5zdGFuY2UpCisJCXJldHVybjsKKworCS8qIHN0b3AgaWYgY3VycmVudCBpbnN0YW5jZSBkb2Vzbid0IG5lZWQgdG8gYmUgY2hhbmdlZCAqLworCWlmICghKGFkdl9pbnN0YW5jZS0+ZmxhZ3MgJiBmbGFncykpCisJCXJldHVybjsKKworCWNhbmNlbF9hZHZfdGltZW91dChoZGV2KTsKKworCWFkdl9pbnN0YW5jZSA9IGhjaV9nZXRfbmV4dF9pbnN0YW5jZShoZGV2LCBhZHZfaW5zdGFuY2UtPmluc3RhbmNlKTsKKwlpZiAoIWFkdl9pbnN0YW5jZSkKKwkJcmV0dXJuOworCisJaGNpX3JlcV9pbml0KCZyZXEsIGhkZXYpOworCWVyciA9IF9faGNpX3JlcV9zY2hlZHVsZV9hZHZfaW5zdGFuY2UoJnJlcSwgYWR2X2luc3RhbmNlLT5pbnN0YW5jZSwKKwkJCQkJICAgICAgdHJ1ZSk7CisJaWYgKGVycikKKwkJcmV0dXJuOworCisJaGNpX3JlcV9ydW4oJnJlcSwgTlVMTCk7Cit9CisKIHN0YXRpYyB2b2lkIHNldF9uYW1lX2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCBzdGF0dXMsIHUxNiBvcGNvZGUpCiB7CiAJc3RydWN0IG1nbXRfY3Bfc2V0X2xvY2FsX25hbWUgKmNwOwpAQCAtMjk0NywxMyArMzA4NCwxNyBAQAogCiAJY3AgPSBjbWQtPnBhcmFtOwogCi0JaWYgKHN0YXR1cykKKwlpZiAoc3RhdHVzKSB7CiAJCW1nbXRfY21kX3N0YXR1cyhjbWQtPnNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfTE9DQUxfTkFNRSwKIAkJCSAgICAgICAgbWdtdF9zdGF0dXMoc3RhdHVzKSk7Ci0JZWxzZQorCX0gZWxzZSB7CiAJCW1nbXRfY21kX2NvbXBsZXRlKGNtZC0+c2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9MT0NBTF9OQU1FLCAwLAogCQkJCSAgY3AsIHNpemVvZigqY3ApKTsKIAorCQlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0xFX0FEVikpCisJCQlhZHZfZXhwaXJlKGhkZXYsIE1HTVRfQURWX0ZMQUdfTE9DQUxfTkFNRSk7CisJfQorCiAJbWdtdF9wZW5kaW5nX3JlbW92ZShjbWQpOwogCiB1bmxvY2s6CkBAIC0yOTkzLDggKzMxMzQsOSBAQAogCQlpZiAoZXJyIDwgMCkKIAkJCWdvdG8gZmFpbGVkOwogCi0JCWVyciA9IG1nbXRfZ2VuZXJpY19ldmVudChNR01UX0VWX0xPQ0FMX05BTUVfQ0hBTkdFRCwgaGRldiwKLQkJCQkJIGRhdGEsIGxlbiwgc2spOworCQllcnIgPSBtZ210X2xpbWl0ZWRfZXZlbnQoTUdNVF9FVl9MT0NBTF9OQU1FX0NIQU5HRUQsIGhkZXYsIGRhdGEsCisJCQkJCSBsZW4sIEhDSV9NR01UX0xPQ0FMX05BTUVfRVZFTlRTLCBzayk7CisJCWV4dF9pbmZvX2NoYW5nZWQoaGRldiwgc2spOwogCiAJCWdvdG8gZmFpbGVkOwogCX0KQEAgLTMwMTcsNyArMzE1OSw3IEBACiAJLyogVGhlIG5hbWUgaXMgc3RvcmVkIGluIHRoZSBzY2FuIHJlc3BvbnNlIGRhdGEgYW5kIHNvCiAJICogbm8gbmVlZCB0byB1ZHBhdGUgdGhlIGFkdmVydGlzaW5nIGRhdGEgaGVyZS4KIAkgKi8KLQlpZiAobG1wX2xlX2NhcGFibGUoaGRldikpCisJaWYgKGxtcF9sZV9jYXBhYmxlKGhkZXYpICYmIGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9BRFZFUlRJU0lORykpCiAJCV9faGNpX3JlcV91cGRhdGVfc2Nhbl9yc3BfZGF0YSgmcmVxLCBoZGV2LT5jdXJfYWR2X2luc3RhbmNlKTsKIAogCWVyciA9IGhjaV9yZXFfcnVuKCZyZXEsIHNldF9uYW1lX2NvbXBsZXRlKTsKQEAgLTMwMjksNiArMzE3MSw0MCBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgc2V0X2FwcGVhcmFuY2Uoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdm9pZCAqZGF0YSwKKwkJCSAgdTE2IGxlbikKK3sKKwlzdHJ1Y3QgbWdtdF9jcF9zZXRfYXBwZWFyYW5jZSAqY3AgPSBkYXRhOworCXUxNiBhcHBlcmFuY2U7CisJaW50IGVycjsKKworCUJUX0RCRygiIik7CisKKwlpZiAoIWxtcF9sZV9jYXBhYmxlKGhkZXYpKQorCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfQVBQRUFSQU5DRSwKKwkJCQkgICAgICAgTUdNVF9TVEFUVVNfTk9UX1NVUFBPUlRFRCk7CisKKwlhcHBlcmFuY2UgPSBsZTE2X3RvX2NwdShjcC0+YXBwZWFyYW5jZSk7CisKKwloY2lfZGV2X2xvY2soaGRldik7CisKKwlpZiAoaGRldi0+YXBwZWFyYW5jZSAhPSBhcHBlcmFuY2UpIHsKKwkJaGRldi0+YXBwZWFyYW5jZSA9IGFwcGVyYW5jZTsKKworCQlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0xFX0FEVikpCisJCQlhZHZfZXhwaXJlKGhkZXYsIE1HTVRfQURWX0ZMQUdfQVBQRUFSQU5DRSk7CisKKwkJZXh0X2luZm9fY2hhbmdlZChoZGV2LCBzayk7CisJfQorCisJZXJyID0gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9BUFBFQVJBTkNFLCAwLCBOVUxMLAorCQkJCTApOworCisJaGNpX2Rldl91bmxvY2soaGRldik7CisKKwlyZXR1cm4gZXJyOworfQorCiBzdGF0aWMgdm9pZCByZWFkX2xvY2FsX29vYl9kYXRhX2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCBzdGF0dXMsCiAJCQkJICAgICAgICAgdTE2IG9wY29kZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKQEAgLTQ4NjksNyArNTA0NSw3IEBACiAJaW50IGVycjsKIAogCW1lbXNldCgmcnAsIDAsIHNpemVvZihycCkpOwotCW1lbWNweSgmcnAuYWRkciwgJmNtZC0+cGFyYW0sIHNpemVvZihycC5hZGRyKSk7CisJbWVtY3B5KCZycC5hZGRyLCBjbWQtPnBhcmFtLCBzaXplb2YocnAuYWRkcikpOwogCiAJaWYgKHN0YXR1cykKIAkJZ290byBjb21wbGV0ZTsKQEAgLTU1MDEsMTcgKzU2NzcsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTE2IGVpcl9hcHBlbmRfZGF0YSh1OCAqZWlyLCB1MTYgZWlyX2xlbiwgdTggdHlwZSwgdTggKmRhdGEsCi0JCQkJICB1OCBkYXRhX2xlbikKLXsKLQllaXJbZWlyX2xlbisrXSA9IHNpemVvZih0eXBlKSArIGRhdGFfbGVuOwotCWVpcltlaXJfbGVuKytdID0gdHlwZTsKLQltZW1jcHkoJmVpcltlaXJfbGVuXSwgZGF0YSwgZGF0YV9sZW4pOwotCWVpcl9sZW4gKz0gZGF0YV9sZW47Ci0KLQlyZXR1cm4gZWlyX2xlbjsKLX0KLQogc3RhdGljIHZvaWQgcmVhZF9sb2NhbF9vb2JfZXh0X2RhdGFfY29tcGxldGUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4IHN0YXR1cywKIAkJCQkJICAgICB1MTYgb3Bjb2RlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtNTgxNSw2ICs1OTgwLDggQEAKIAlmbGFncyB8PSBNR01UX0FEVl9GTEFHX0RJU0NPVjsKIAlmbGFncyB8PSBNR01UX0FEVl9GTEFHX0xJTUlURURfRElTQ09WOwogCWZsYWdzIHw9IE1HTVRfQURWX0ZMQUdfTUFOQUdFRF9GTEFHUzsKKwlmbGFncyB8PSBNR01UX0FEVl9GTEFHX0FQUEVBUkFOQ0U7CisJZmxhZ3MgfD0gTUdNVF9BRFZfRkxBR19MT0NBTF9OQU1FOwogCiAJaWYgKGhkZXYtPmFkdl90eF9wb3dlciAhPSBIQ0lfVFhfUE9XRVJfSU5WQUxJRCkKIAkJZmxhZ3MgfD0gTUdNVF9BRFZfRkxBR19UWF9QT1dFUjsKQEAgLTU4NzEsMjggKzYwMzgsNTkgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgYm9vbCB0bHZfZGF0YV9pc192YWxpZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTMyIGFkdl9mbGFncywgdTggKmRhdGEsCi0JCQkgICAgICB1OCBsZW4sIGJvb2wgaXNfYWR2X2RhdGEpCitzdGF0aWMgdTggdGx2X2RhdGFfbWF4X2xlbih1MzIgYWR2X2ZsYWdzLCBib29sIGlzX2Fkdl9kYXRhKQogewogCXU4IG1heF9sZW4gPSBIQ0lfTUFYX0FEX0xFTkdUSDsKLQlpbnQgaSwgY3VyX2xlbjsKLQlib29sIGZsYWdzX21hbmFnZWQgPSBmYWxzZTsKLQlib29sIHR4X3Bvd2VyX21hbmFnZWQgPSBmYWxzZTsKIAogCWlmIChpc19hZHZfZGF0YSkgewogCQlpZiAoYWR2X2ZsYWdzICYgKE1HTVRfQURWX0ZMQUdfRElTQ09WIHwKIAkJCQkgTUdNVF9BRFZfRkxBR19MSU1JVEVEX0RJU0NPViB8Ci0JCQkJIE1HTVRfQURWX0ZMQUdfTUFOQUdFRF9GTEFHUykpIHsKLQkJCWZsYWdzX21hbmFnZWQgPSB0cnVlOworCQkJCSBNR01UX0FEVl9GTEFHX01BTkFHRURfRkxBR1MpKQogCQkJbWF4X2xlbiAtPSAzOwotCQl9CiAKLQkJaWYgKGFkdl9mbGFncyAmIE1HTVRfQURWX0ZMQUdfVFhfUE9XRVIpIHsKLQkJCXR4X3Bvd2VyX21hbmFnZWQgPSB0cnVlOworCQlpZiAoYWR2X2ZsYWdzICYgTUdNVF9BRFZfRkxBR19UWF9QT1dFUikKIAkJCW1heF9sZW4gLT0gMzsKLQkJfQorCX0gZWxzZSB7CisJCS8qIGF0IGxlYXN0IDEgYnl0ZSBvZiBuYW1lIHNob3VsZCBmaXQgaW4gKi8KKwkJaWYgKGFkdl9mbGFncyAmIE1HTVRfQURWX0ZMQUdfTE9DQUxfTkFNRSkKKwkJCW1heF9sZW4gLT0gMzsKKworCQlpZiAoYWR2X2ZsYWdzICYgKE1HTVRfQURWX0ZMQUdfQVBQRUFSQU5DRSkpCisJCQltYXhfbGVuIC09IDQ7CiAJfQogCisJcmV0dXJuIG1heF9sZW47Cit9CisKK3N0YXRpYyBib29sIGZsYWdzX21hbmFnZWQodTMyIGFkdl9mbGFncykKK3sKKwlyZXR1cm4gYWR2X2ZsYWdzICYgKE1HTVRfQURWX0ZMQUdfRElTQ09WIHwKKwkJCSAgICBNR01UX0FEVl9GTEFHX0xJTUlURURfRElTQ09WIHwKKwkJCSAgICBNR01UX0FEVl9GTEFHX01BTkFHRURfRkxBR1MpOworfQorCitzdGF0aWMgYm9vbCB0eF9wb3dlcl9tYW5hZ2VkKHUzMiBhZHZfZmxhZ3MpCit7CisJcmV0dXJuIGFkdl9mbGFncyAmIE1HTVRfQURWX0ZMQUdfVFhfUE9XRVI7Cit9CisKK3N0YXRpYyBib29sIG5hbWVfbWFuYWdlZCh1MzIgYWR2X2ZsYWdzKQoreworCXJldHVybiBhZHZfZmxhZ3MgJiBNR01UX0FEVl9GTEFHX0xPQ0FMX05BTUU7Cit9CisKK3N0YXRpYyBib29sIGFwcGVhcmFuY2VfbWFuYWdlZCh1MzIgYWR2X2ZsYWdzKQoreworCXJldHVybiBhZHZfZmxhZ3MgJiBNR01UX0FEVl9GTEFHX0FQUEVBUkFOQ0U7Cit9CisKK3N0YXRpYyBib29sIHRsdl9kYXRhX2lzX3ZhbGlkKHUzMiBhZHZfZmxhZ3MsIHU4ICpkYXRhLCB1OCBsZW4sIGJvb2wgaXNfYWR2X2RhdGEpCit7CisJaW50IGksIGN1cl9sZW47CisJdTggbWF4X2xlbjsKKworCW1heF9sZW4gPSB0bHZfZGF0YV9tYXhfbGVuKGFkdl9mbGFncywgaXNfYWR2X2RhdGEpOworCiAJaWYgKGxlbiA+IG1heF9sZW4pCiAJCXJldHVybiBmYWxzZTsKIApAQCAtNTkwMCwxMCArNjA5OCwyMSBAQAogCWZvciAoaSA9IDAsIGN1cl9sZW4gPSAwOyBpIDwgbGVuOyBpICs9IChjdXJfbGVuICsgMSkpIHsKIAkJY3VyX2xlbiA9IGRhdGFbaV07CiAKLQkJaWYgKGZsYWdzX21hbmFnZWQgJiYgZGF0YVtpICsgMV0gPT0gRUlSX0ZMQUdTKQorCQlpZiAoZGF0YVtpICsgMV0gPT0gRUlSX0ZMQUdTICYmCisJCSAgICAoIWlzX2Fkdl9kYXRhIHx8IGZsYWdzX21hbmFnZWQoYWR2X2ZsYWdzKSkpCiAJCQlyZXR1cm4gZmFsc2U7CiAKLQkJaWYgKHR4X3Bvd2VyX21hbmFnZWQgJiYgZGF0YVtpICsgMV0gPT0gRUlSX1RYX1BPV0VSKQorCQlpZiAoZGF0YVtpICsgMV0gPT0gRUlSX1RYX1BPV0VSICYmIHR4X3Bvd2VyX21hbmFnZWQoYWR2X2ZsYWdzKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlpZiAoZGF0YVtpICsgMV0gPT0gRUlSX05BTUVfQ09NUExFVEUgJiYgbmFtZV9tYW5hZ2VkKGFkdl9mbGFncykpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJaWYgKGRhdGFbaSArIDFdID09IEVJUl9OQU1FX1NIT1JUICYmIG5hbWVfbWFuYWdlZChhZHZfZmxhZ3MpKQorCQkJcmV0dXJuIGZhbHNlOworCisJCWlmIChkYXRhW2kgKyAxXSA9PSBFSVJfQVBQRUFSQU5DRSAmJgorCQkgICAgYXBwZWFyYW5jZV9tYW5hZ2VkKGFkdl9mbGFncykpCiAJCQlyZXR1cm4gZmFsc2U7CiAKIAkJLyogSWYgdGhlIGN1cnJlbnQgZmllbGQgbGVuZ3RoIHdvdWxkIGV4Y2VlZCB0aGUgdG90YWwgZGF0YQpAQCAtNjAyNyw4ICs2MjM2LDggQEAKIAkJZ290byB1bmxvY2s7CiAJfQogCi0JaWYgKCF0bHZfZGF0YV9pc192YWxpZChoZGV2LCBmbGFncywgY3AtPmRhdGEsIGNwLT5hZHZfZGF0YV9sZW4sIHRydWUpIHx8Ci0JICAgICF0bHZfZGF0YV9pc192YWxpZChoZGV2LCBmbGFncywgY3AtPmRhdGEgKyBjcC0+YWR2X2RhdGFfbGVuLAorCWlmICghdGx2X2RhdGFfaXNfdmFsaWQoZmxhZ3MsIGNwLT5kYXRhLCBjcC0+YWR2X2RhdGFfbGVuLCB0cnVlKSB8fAorCSAgICAhdGx2X2RhdGFfaXNfdmFsaWQoZmxhZ3MsIGNwLT5kYXRhICsgY3AtPmFkdl9kYXRhX2xlbiwKIAkJCSAgICAgICBjcC0+c2Nhbl9yc3BfbGVuLCBmYWxzZSkpIHsKIAkJZXJyID0gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9BRERfQURWRVJUSVNJTkcsCiAJCQkJICAgICAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOwpAQCAtNjE3NSw3ICs2Mzg0LDcgQEAKIAogCWhjaV9yZXFfaW5pdCgmcmVxLCBoZGV2KTsKIAotCWhjaV9yZXFfY2xlYXJfYWR2X2luc3RhbmNlKGhkZXYsICZyZXEsIGNwLT5pbnN0YW5jZSwgdHJ1ZSk7CisJaGNpX3JlcV9jbGVhcl9hZHZfaW5zdGFuY2UoaGRldiwgc2ssICZyZXEsIGNwLT5pbnN0YW5jZSwgdHJ1ZSk7CiAKIAlpZiAobGlzdF9lbXB0eSgmaGRldi0+YWR2X2luc3RhbmNlcykpCiAJCV9faGNpX3JlcV9kaXNhYmxlX2FkdmVydGlzaW5nKCZyZXEpOwpAQCAtNjIxMSwyMyArNjQyMCw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHU4IHRsdl9kYXRhX21heF9sZW4odTMyIGFkdl9mbGFncywgYm9vbCBpc19hZHZfZGF0YSkKLXsKLQl1OCBtYXhfbGVuID0gSENJX01BWF9BRF9MRU5HVEg7Ci0KLQlpZiAoaXNfYWR2X2RhdGEpIHsKLQkJaWYgKGFkdl9mbGFncyAmIChNR01UX0FEVl9GTEFHX0RJU0NPViB8Ci0JCQkJIE1HTVRfQURWX0ZMQUdfTElNSVRFRF9ESVNDT1YgfAotCQkJCSBNR01UX0FEVl9GTEFHX01BTkFHRURfRkxBR1MpKQotCQkJbWF4X2xlbiAtPSAzOwotCi0JCWlmIChhZHZfZmxhZ3MgJiBNR01UX0FEVl9GTEFHX1RYX1BPV0VSKQotCQkJbWF4X2xlbiAtPSAzOwotCX0KLQotCXJldHVybiBtYXhfbGVuOwotfQotCiBzdGF0aWMgaW50IGdldF9hZHZfc2l6ZV9pbmZvKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGhjaV9kZXYgKmhkZXYsCiAJCQkgICAgIHZvaWQgKmRhdGEsIHUxNiBkYXRhX2xlbikKIHsKQEAgLTYzNTYsNiArNjU0OCw5IEBACiAJeyByZW1vdmVfYWR2ZXJ0aXNpbmcsCSAgIE1HTVRfUkVNT1ZFX0FEVkVSVElTSU5HX1NJWkUgfSwKIAl7IGdldF9hZHZfc2l6ZV9pbmZvLCAgICAgICBNR01UX0dFVF9BRFZfU0laRV9JTkZPX1NJWkUgfSwKIAl7IHN0YXJ0X2xpbWl0ZWRfZGlzY292ZXJ5LCBNR01UX1NUQVJUX0RJU0NPVkVSWV9TSVpFIH0sCisJeyByZWFkX2V4dF9jb250cm9sbGVyX2luZm8sTUdNVF9SRUFEX0VYVF9JTkZPX1NJWkUsCisJCQkJCQlIQ0lfTUdNVF9VTlRSVVNURUQgfSwKKwl7IHNldF9hcHBlYXJhbmNlLAkgICBNR01UX1NFVF9BUFBFQVJBTkNFX1NJWkUgfSwKIH07CiAKIHZvaWQgbWdtdF9pbmRleF9hZGRlZChzdHJ1Y3QgaGNpX2RldiAqaGRldikKQEAgLTY0OTQsOSArNjY4OSwxMiBAQAogCiAJbWdtdF9wZW5kaW5nX2ZvcmVhY2goMCwgaGRldiwgY21kX2NvbXBsZXRlX3JzcCwgJnN0YXR1cyk7CiAKLQlpZiAobWVtY21wKGhkZXYtPmRldl9jbGFzcywgemVyb19jb2QsIHNpemVvZih6ZXJvX2NvZCkpICE9IDApCi0JCW1nbXRfZ2VuZXJpY19ldmVudChNR01UX0VWX0NMQVNTX09GX0RFVl9DSEFOR0VELCBoZGV2LAotCQkJCSAgIHplcm9fY29kLCBzaXplb2YoemVyb19jb2QpLCBOVUxMKTsKKwlpZiAobWVtY21wKGhkZXYtPmRldl9jbGFzcywgemVyb19jb2QsIHNpemVvZih6ZXJvX2NvZCkpICE9IDApIHsKKwkJbWdtdF9saW1pdGVkX2V2ZW50KE1HTVRfRVZfQ0xBU1NfT0ZfREVWX0NIQU5HRUQsIGhkZXYsCisJCQkJICAgemVyb19jb2QsIHNpemVvZih6ZXJvX2NvZCksCisJCQkJICAgSENJX01HTVRfREVWX0NMQVNTX0VWRU5UUywgTlVMTCk7CisJCWV4dF9pbmZvX2NoYW5nZWQoaGRldiwgTlVMTCk7CisJfQogCiAJbmV3X3NldHRpbmdzKGhkZXYsIG1hdGNoLnNrKTsKIApAQCAtNzA5Miw5ICs3MjkwLDExIEBACiAJbWdtdF9wZW5kaW5nX2ZvcmVhY2goTUdNVF9PUF9BRERfVVVJRCwgaGRldiwgc2tfbG9va3VwLCAmbWF0Y2gpOwogCW1nbXRfcGVuZGluZ19mb3JlYWNoKE1HTVRfT1BfUkVNT1ZFX1VVSUQsIGhkZXYsIHNrX2xvb2t1cCwgJm1hdGNoKTsKIAotCWlmICghc3RhdHVzKQotCQltZ210X2dlbmVyaWNfZXZlbnQoTUdNVF9FVl9DTEFTU19PRl9ERVZfQ0hBTkdFRCwgaGRldiwKLQkJCQkgICBkZXZfY2xhc3MsIDMsIE5VTEwpOworCWlmICghc3RhdHVzKSB7CisJCW1nbXRfbGltaXRlZF9ldmVudChNR01UX0VWX0NMQVNTX09GX0RFVl9DSEFOR0VELCBoZGV2LCBkZXZfY2xhc3MsCisJCQkJICAgMywgSENJX01HTVRfREVWX0NMQVNTX0VWRU5UUywgTlVMTCk7CisJCWV4dF9pbmZvX2NoYW5nZWQoaGRldiwgTlVMTCk7CisJfQogCiAJaWYgKG1hdGNoLnNrKQogCQlzb2NrX3B1dChtYXRjaC5zayk7CkBAIC03MTIzLDggKzczMjMsOSBAQAogCQkJcmV0dXJuOwogCX0KIAotCW1nbXRfZ2VuZXJpY19ldmVudChNR01UX0VWX0xPQ0FMX05BTUVfQ0hBTkdFRCwgaGRldiwgJmV2LCBzaXplb2YoZXYpLAotCQkJICAgY21kID8gY21kLT5zayA6IE5VTEwpOworCW1nbXRfbGltaXRlZF9ldmVudChNR01UX0VWX0xPQ0FMX05BTUVfQ0hBTkdFRCwgaGRldiwgJmV2LCBzaXplb2YoZXYpLAorCQkJICAgSENJX01HTVRfTE9DQUxfTkFNRV9FVkVOVFMsIGNtZCA/IGNtZC0+c2sgOiBOVUxMKTsKKwlleHRfaW5mb19jaGFuZ2VkKGhkZXYsIGNtZCA/IGNtZC0+c2sgOiBOVUxMKTsKIH0KIAogc3RhdGljIGlubGluZSBib29sIGhhc191dWlkKHU4ICp1dWlkLCB1MTYgdXVpZF9jb3VudCwgdTggKCp1dWlkcylbMTZdKQpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9tZ210X3V0aWwuYyBiL25ldC9ibHVldG9vdGgvbWdtdF91dGlsLmMKaW5kZXggOGMzMGM3ZS4uYzkzM2JkMCAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9tZ210X3V0aWwuYworKysgYi9uZXQvYmx1ZXRvb3RoL21nbXRfdXRpbC5jCkBAIC0yMSwxMiArMjEsNDEgQEAKICAgIFNPRlRXQVJFIElTIERJU0NMQUlNRUQuCiAqLwogCisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfbW9uLmg+CiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9tZ210Lmg+CiAKICNpbmNsdWRlICJtZ210X3V0aWwuaCIKIAorc3RhdGljIHN0cnVjdCBza19idWZmICpjcmVhdGVfbW9uaXRvcl9jdHJsX2V2ZW50KF9fbGUxNiBpbmRleCwgdTMyIGNvb2tpZSwKKwkJCQkJCSB1MTYgb3Bjb2RlLCB1MTYgbGVuLCB2b2lkICpidWYpCit7CisJc3RydWN0IGhjaV9tb25faGRyICpoZHI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXNrYiA9IGJ0X3NrYl9hbGxvYyg2ICsgbGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwlwdXRfdW5hbGlnbmVkX2xlMzIoY29va2llLCBza2JfcHV0KHNrYiwgNCkpOworCXB1dF91bmFsaWduZWRfbGUxNihvcGNvZGUsIHNrYl9wdXQoc2tiLCAyKSk7CisKKwlpZiAoYnVmKQorCQltZW1jcHkoc2tiX3B1dChza2IsIGxlbiksIGJ1ZiwgbGVuKTsKKworCV9fbmV0X3RpbWVzdGFtcChza2IpOworCisJaGRyID0gKHZvaWQgKilza2JfcHVzaChza2IsIEhDSV9NT05fSERSX1NJWkUpOworCWhkci0+b3Bjb2RlID0gY3B1X3RvX2xlMTYoSENJX01PTl9DVFJMX0VWRU5UKTsKKwloZHItPmluZGV4ID0gaW5kZXg7CisJaGRyLT5sZW4gPSBjcHVfdG9fbGUxNihza2ItPmxlbiAtIEhDSV9NT05fSERSX1NJWkUpOworCisJcmV0dXJuIHNrYjsKK30KKwogaW50IG1nbXRfc2VuZF9ldmVudCh1MTYgZXZlbnQsIHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1bnNpZ25lZCBzaG9ydCBjaGFubmVsLAogCQkgICAgdm9pZCAqZGF0YSwgdTE2IGRhdGFfbGVuLCBpbnQgZmxhZywgc3RydWN0IHNvY2sgKnNraXBfc2spCiB7CkBAIC01MiwxNCArODEsMTggQEAKIAlfX25ldF90aW1lc3RhbXAoc2tiKTsKIAogCWhjaV9zZW5kX3RvX2NoYW5uZWwoY2hhbm5lbCwgc2tiLCBmbGFnLCBza2lwX3NrKTsKLQlrZnJlZV9za2Ioc2tiKTsKIAorCWlmIChjaGFubmVsID09IEhDSV9DSEFOTkVMX0NPTlRST0wpCisJCWhjaV9zZW5kX21vbml0b3JfY3RybF9ldmVudChoZGV2LCBldmVudCwgZGF0YSwgZGF0YV9sZW4sCisJCQkJCSAgICBza2JfZ2V0X2t0aW1lKHNrYiksIGZsYWcsIHNraXBfc2spOworCisJa2ZyZWVfc2tiKHNrYik7CiAJcmV0dXJuIDA7CiB9CiAKIGludCBtZ210X2NtZF9zdGF0dXMoc3RydWN0IHNvY2sgKnNrLCB1MTYgaW5kZXgsIHUxNiBjbWQsIHU4IHN0YXR1cykKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBza19idWZmICpza2IsICptc2tiOwogCXN0cnVjdCBtZ210X2hkciAqaGRyOwogCXN0cnVjdCBtZ210X2V2X2NtZF9zdGF0dXMgKmV2OwogCWludCBlcnI7CkBAIC04MCwxNyArMTEzLDMwIEBACiAJZXYtPnN0YXR1cyA9IHN0YXR1czsKIAlldi0+b3Bjb2RlID0gY3B1X3RvX2xlMTYoY21kKTsKIAorCW1za2IgPSBjcmVhdGVfbW9uaXRvcl9jdHJsX2V2ZW50KGhkci0+aW5kZXgsIGhjaV9zb2NrX2dldF9jb29raWUoc2spLAorCQkJCQkgTUdNVF9FVl9DTURfU1RBVFVTLCBzaXplb2YoKmV2KSwgZXYpOworCWlmIChtc2tiKQorCQlza2ItPnRzdGFtcCA9IG1za2ItPnRzdGFtcDsKKwllbHNlCisJCV9fbmV0X3RpbWVzdGFtcChza2IpOworCiAJZXJyID0gc29ja19xdWV1ZV9yY3Zfc2tiKHNrLCBza2IpOwogCWlmIChlcnIgPCAwKQogCQlrZnJlZV9za2Ioc2tiKTsKIAorCWlmIChtc2tiKSB7CisJCWhjaV9zZW5kX3RvX2NoYW5uZWwoSENJX0NIQU5ORUxfTU9OSVRPUiwgbXNrYiwKKwkJCQkgICAgSENJX1NPQ0tfVFJVU1RFRCwgTlVMTCk7CisJCWtmcmVlX3NrYihtc2tiKTsKKwl9CisKIAlyZXR1cm4gZXJyOwogfQogCiBpbnQgbWdtdF9jbWRfY29tcGxldGUoc3RydWN0IHNvY2sgKnNrLCB1MTYgaW5kZXgsIHUxNiBjbWQsIHU4IHN0YXR1cywKIAkJICAgICAgdm9pZCAqcnAsIHNpemVfdCBycF9sZW4pCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqbXNrYjsKIAlzdHJ1Y3QgbWdtdF9oZHIgKmhkcjsKIAlzdHJ1Y3QgbWdtdF9ldl9jbWRfY29tcGxldGUgKmV2OwogCWludCBlcnI7CkBAIC0xMTQsMTAgKzE2MCwyNCBAQAogCWlmIChycCkKIAkJbWVtY3B5KGV2LT5kYXRhLCBycCwgcnBfbGVuKTsKIAorCW1za2IgPSBjcmVhdGVfbW9uaXRvcl9jdHJsX2V2ZW50KGhkci0+aW5kZXgsIGhjaV9zb2NrX2dldF9jb29raWUoc2spLAorCQkJCQkgTUdNVF9FVl9DTURfQ09NUExFVEUsCisJCQkJCSBzaXplb2YoKmV2KSArIHJwX2xlbiwgZXYpOworCWlmIChtc2tiKQorCQlza2ItPnRzdGFtcCA9IG1za2ItPnRzdGFtcDsKKwllbHNlCisJCV9fbmV0X3RpbWVzdGFtcChza2IpOworCiAJZXJyID0gc29ja19xdWV1ZV9yY3Zfc2tiKHNrLCBza2IpOwogCWlmIChlcnIgPCAwKQogCQlrZnJlZV9za2Ioc2tiKTsKIAorCWlmIChtc2tiKSB7CisJCWhjaV9zZW5kX3RvX2NoYW5uZWwoSENJX0NIQU5ORUxfTU9OSVRPUiwgbXNrYiwKKwkJCQkgICAgSENJX1NPQ0tfVFJVU1RFRCwgTlVMTCk7CisJCWtmcmVlX3NrYihtc2tiKTsKKwl9CisKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL3NtcC5jIGIvbmV0L2JsdWV0b290aC9zbXAuYwppbmRleCA0YzFhMTZhLi40M2ZhZjJhIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL3NtcC5jCisrKyBiL25ldC9ibHVldG9vdGgvc21wLmMKQEAgLTMzODcsNyArMzM4NywxMCBAQAogCWlmICghbG1wX3NjX2NhcGFibGUoaGRldikpIHsKIAkJZGVidWdmc19jcmVhdGVfZmlsZSgiZm9yY2VfYnJlZHJfc21wIiwgMDY0NCwgaGRldi0+ZGVidWdmcywKIAkJCQkgICAgaGRldiwgJmZvcmNlX2JyZWRyX3NtcF9mb3BzKTsKLQkJcmV0dXJuIDA7CisKKwkJLyogRmxhZyBjYW4gYmUgYWxyZWFkeSBzZXQgaGVyZSAoZHVlIHRvIHBvd2VyIHRvZ2dsZSkgKi8KKwkJaWYgKCFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfRk9SQ0VfQlJFRFJfU01QKSkKKwkJCXJldHVybiAwOwogCX0KIAogCWlmIChXQVJOX09OKGhkZXYtPnNtcF9icmVkcl9kYXRhKSkgewpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9NYWtlZmlsZSBiL25ldC9icmlkZ2UvTWFrZWZpbGUKaW5kZXggYTFjZGE1ZC4uMGFlZmMwMSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9NYWtlZmlsZQorKysgYi9uZXQvYnJpZGdlL01ha2VmaWxlCkBAIC0yMCw0ICsyMCw2IEBACiAKIGJyaWRnZS0kKENPTkZJR19CUklER0VfVkxBTl9GSUxURVJJTkcpICs9IGJyX3ZsYW4ubwogCiticmlkZ2UtJChDT05GSUdfTkVUX1NXSVRDSERFVikgKz0gYnJfc3dpdGNoZGV2Lm8KKwogb2JqLSQoQ09ORklHX05FVEZJTFRFUikgKz0gbmV0ZmlsdGVyLwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9ici5jIGIvbmV0L2JyaWRnZS9ici5jCmluZGV4IDNhZGRjMDUuLjg4OWU1NjQgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnIuYworKysgYi9uZXQvYnJpZGdlL2JyLmMKQEAgLTIyNyw5ICsyMjcsMTEgQEAKIAlicl9mZGJfdGVzdF9hZGRyX2hvb2sgPSBicl9mZGJfdGVzdF9hZGRyOwogI2VuZGlmCiAKLQlwcl9pbmZvKCJicmlkZ2U6IGF1dG9tYXRpYyBmaWx0ZXJpbmcgdmlhIGFycC9pcC9pcDZ0YWJsZXMgaGFzIGJlZW4gIgotCQkiZGVwcmVjYXRlZC4gVXBkYXRlIHlvdXIgc2NyaXB0cyB0byBsb2FkIGJyX25ldGZpbHRlciBpZiB5b3UgIgorI2lmIElTX01PRFVMRShDT05GSUdfQlJJREdFX05FVEZJTFRFUikKKwlwcl9pbmZvKCJicmlkZ2U6IGZpbHRlcmluZyB2aWEgYXJwL2lwL2lwNnRhYmxlcyBpcyBubyBsb25nZXIgYXZhaWxhYmxlICIKKwkJImJ5IGRlZmF1bHQuIFVwZGF0ZSB5b3VyIHNjcmlwdHMgdG8gbG9hZCBicl9uZXRmaWx0ZXIgaWYgeW91ICIKIAkJIm5lZWQgdGhpcy5cbiIpOworI2VuZGlmCiAKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9kZXZpY2UuYyBiL25ldC9icmlkZ2UvYnJfZGV2aWNlLmMKaW5kZXggMDlmMjY5NC4uODlhNjg3ZiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9kZXZpY2UuYworKysgYi9uZXQvYnJpZGdlL2JyX2RldmljZS5jCkBAIC02MiwxMCArNjIsMTAgQEAKIAkJZ290byBvdXQ7CiAKIAlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoZGVzdCkpIHsKLQkJYnJfZmxvb2QoYnIsIHNrYiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKwkJYnJfZmxvb2QoYnIsIHNrYiwgQlJfUEtUX0JST0FEQ0FTVCwgZmFsc2UsIHRydWUpOwogCX0gZWxzZSBpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZGVzdCkpIHsKIAkJaWYgKHVubGlrZWx5KG5ldHBvbGxfdHhfcnVubmluZyhkZXYpKSkgewotCQkJYnJfZmxvb2QoYnIsIHNrYiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKwkJCWJyX2Zsb29kKGJyLCBza2IsIEJSX1BLVF9NVUxUSUNBU1QsIGZhbHNlLCB0cnVlKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJCWlmIChicl9tdWx0aWNhc3RfcmN2KGJyLCBOVUxMLCBza2IsIHZpZCkpIHsKQEAgLTc4LDExICs3OCwxMSBAQAogCQkgICAgYnJfbXVsdGljYXN0X3F1ZXJpZXJfZXhpc3RzKGJyLCBldGhfaGRyKHNrYikpKQogCQkJYnJfbXVsdGljYXN0X2Zsb29kKG1kc3QsIHNrYiwgZmFsc2UsIHRydWUpOwogCQllbHNlCi0JCQlicl9mbG9vZChiciwgc2tiLCBmYWxzZSwgZmFsc2UsIHRydWUpOworCQkJYnJfZmxvb2QoYnIsIHNrYiwgQlJfUEtUX01VTFRJQ0FTVCwgZmFsc2UsIHRydWUpOwogCX0gZWxzZSBpZiAoKGRzdCA9IF9fYnJfZmRiX2dldChiciwgZGVzdCwgdmlkKSkgIT0gTlVMTCkgewogCQlicl9mb3J3YXJkKGRzdC0+ZHN0LCBza2IsIGZhbHNlLCB0cnVlKTsKIAl9IGVsc2UgewotCQlicl9mbG9vZChiciwgc2tiLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisJCWJyX2Zsb29kKGJyLCBza2IsIEJSX1BLVF9VTklDQVNULCBmYWxzZSwgdHJ1ZSk7CiAJfQogb3V0OgogCXJjdV9yZWFkX3VubG9jaygpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9mZGIuYyBiL25ldC9icmlkZ2UvYnJfZmRiLmMKaW5kZXggYzE4MDgwYS4uNmI0M2M4YyAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9mZGIuYworKysgYi9uZXQvYnJpZGdlL2JyX2ZkYi5jCkBAIC0yNjcsNyArMjY3LDcgQEAKIAogCS8qIElmIG9sZCBlbnRyeSB3YXMgdW5hc3NvY2lhdGVkIHdpdGggYW55IHBvcnQsIHRoZW4gZGVsZXRlIGl0LiAqLwogCWYgPSBfX2JyX2ZkYl9nZXQoYnIsIGJyLT5kZXYtPmRldl9hZGRyLCAwKTsKLQlpZiAoZiAmJiBmLT5pc19sb2NhbCAmJiAhZi0+ZHN0KQorCWlmIChmICYmIGYtPmlzX2xvY2FsICYmICFmLT5kc3QgJiYgIWYtPmFkZGVkX2J5X3VzZXIpCiAJCWZkYl9kZWxldGVfbG9jYWwoYnIsIE5VTEwsIGYpOwogCiAJZmRiX2luc2VydChiciwgTlVMTCwgbmV3YWRkciwgMCk7CkBAIC0yODIsNyArMjgyLDcgQEAKIAkJaWYgKCFicl92bGFuX3Nob3VsZF91c2UodikpCiAJCQljb250aW51ZTsKIAkJZiA9IF9fYnJfZmRiX2dldChiciwgYnItPmRldi0+ZGV2X2FkZHIsIHYtPnZpZCk7Ci0JCWlmIChmICYmIGYtPmlzX2xvY2FsICYmICFmLT5kc3QpCisJCWlmIChmICYmIGYtPmlzX2xvY2FsICYmICFmLT5kc3QgJiYgIWYtPmFkZGVkX2J5X3VzZXIpCiAJCQlmZGJfZGVsZXRlX2xvY2FsKGJyLCBOVUxMLCBmKTsKIAkJZmRiX2luc2VydChiciwgTlVMTCwgbmV3YWRkciwgdi0+dmlkKTsKIAl9CkBAIC03MTAsMjQgKzcxMCwyNyBAQAogCQlzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCiAJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBuZXRfZGV2aWNlICpmaWx0ZXJfZGV2LAotCQlpbnQgaWR4KQorCQlpbnQgKmlkeCkKIHsKIAlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnIgPSAwOwogCWludCBpOwogCiAJaWYgKCEoZGV2LT5wcml2X2ZsYWdzICYgSUZGX0VCUklER0UpKQogCQlnb3RvIG91dDsKIAotCWlmICghZmlsdGVyX2RldikKLQkJaWR4ID0gbmRvX2RmbHRfZmRiX2R1bXAoc2tiLCBjYiwgZGV2LCBOVUxMLCBpZHgpOworCWlmICghZmlsdGVyX2RldikgeworCQllcnIgPSBuZG9fZGZsdF9mZGJfZHVtcChza2IsIGNiLCBkZXYsIE5VTEwsIGlkeCk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXQ7CisJfQogCiAJZm9yIChpID0gMDsgaSA8IEJSX0hBU0hfU0laRTsgaSsrKSB7CiAJCXN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqZjsKIAogCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZiwgJmJyLT5oYXNoW2ldLCBobGlzdCkgewotCQkJaW50IGVycjsKIAotCQkJaWYgKGlkeCA8IGNiLT5hcmdzWzBdKQorCQkJaWYgKCppZHggPCBjYi0+YXJnc1syXSkKIAkJCQlnb3RvIHNraXA7CiAKIAkJCWlmIChmaWx0ZXJfZGV2ICYmCkBAIC03NTAsMzQgKzc1MywzNyBAQAogCQkJCQkgICAgY2ItPm5saC0+bmxtc2dfc2VxLAogCQkJCQkgICAgUlRNX05FV05FSUdILAogCQkJCQkgICAgTkxNX0ZfTVVMVEkpOwotCQkJaWYgKGVyciA8IDApIHsKLQkJCQljYi0+YXJnc1sxXSA9IGVycjsKLQkJCQlicmVhazsKLQkJCX0KKwkJCWlmIChlcnIgPCAwKQorCQkJCWdvdG8gb3V0Owogc2tpcDoKLQkJCSsraWR4OworCQkJKmlkeCArPSAxOwogCQl9CiAJfQogCiBvdXQ6Ci0JcmV0dXJuIGlkeDsKKwlyZXR1cm4gZXJyOwogfQogCiAvKiBVcGRhdGUgKGNyZWF0ZSBvciByZXBsYWNlKSBmb3J3YXJkaW5nIGRhdGFiYXNlIGVudHJ5ICovCi1zdGF0aWMgaW50IGZkYl9hZGRfZW50cnkoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqc291cmNlLCBjb25zdCBfX3U4ICphZGRyLAotCQkJIF9fdTE2IHN0YXRlLCBfX3UxNiBmbGFncywgX191MTYgdmlkKQorc3RhdGljIGludCBmZGJfYWRkX2VudHJ5KHN0cnVjdCBuZXRfYnJpZGdlICpiciwgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqc291cmNlLAorCQkJIGNvbnN0IF9fdTggKmFkZHIsIF9fdTE2IHN0YXRlLCBfX3UxNiBmbGFncywgX191MTYgdmlkKQogewotCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IHNvdXJjZS0+YnI7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSAmYnItPmhhc2hbYnJfbWFjX2hhc2goYWRkciwgdmlkKV07CiAJc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmZGI7CiAJYm9vbCBtb2RpZmllZCA9IGZhbHNlOwogCiAJLyogSWYgdGhlIHBvcnQgY2Fubm90IGxlYXJuIGFsbG93IG9ubHkgbG9jYWwgYW5kIHN0YXRpYyBlbnRyaWVzICovCi0JaWYgKCEoc3RhdGUgJiBOVURfUEVSTUFORU5UKSAmJiAhKHN0YXRlICYgTlVEX05PQVJQKSAmJgorCWlmIChzb3VyY2UgJiYgIShzdGF0ZSAmIE5VRF9QRVJNQU5FTlQpICYmICEoc3RhdGUgJiBOVURfTk9BUlApICYmCiAJICAgICEoc291cmNlLT5zdGF0ZSA9PSBCUl9TVEFURV9MRUFSTklORyB8fAogCSAgICAgIHNvdXJjZS0+c3RhdGUgPT0gQlJfU1RBVEVfRk9SV0FSRElORykpCiAJCXJldHVybiAtRVBFUk07CiAKKwlpZiAoIXNvdXJjZSAmJiAhKHN0YXRlICYgTlVEX1BFUk1BTkVOVCkpIHsKKwkJcHJfaW5mbygiYnJpZGdlOiBSVE1fTkVXTkVJR0ggJXMgd2l0aG91dCBOVURfUEVSTUFORU5UXG4iLAorCQkJYnItPmRldi0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWZkYiA9IGZkYl9maW5kKGhlYWQsIGFkZHIsIHZpZCk7CiAJaWYgKGZkYiA9PSBOVUxMKSB7CiAJCWlmICghKGZsYWdzICYgTkxNX0ZfQ1JFQVRFKSkKQEAgLTgzMiwyMiArODM4LDI4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19icl9mZGJfYWRkKHN0cnVjdCBuZG1zZyAqbmRtLCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLAotCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyLCB1MTYgbmxoX2ZsYWdzLCB1MTYgdmlkKQorc3RhdGljIGludCBfX2JyX2ZkYl9hZGQoc3RydWN0IG5kbXNnICpuZG0sIHN0cnVjdCBuZXRfYnJpZGdlICpiciwKKwkJCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsCisJCQl1MTYgbmxoX2ZsYWdzLCB1MTYgdmlkKQogewogCWludCBlcnIgPSAwOwogCiAJaWYgKG5kbS0+bmRtX2ZsYWdzICYgTlRGX1VTRSkgeworCQlpZiAoIXApIHsKKwkJCXByX2luZm8oImJyaWRnZTogUlRNX05FV05FSUdIICVzIHdpdGggTlRGX1VTRSBpcyBub3Qgc3VwcG9ydGVkXG4iLAorCQkJCWJyLT5kZXYtPm5hbWUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAkJbG9jYWxfYmhfZGlzYWJsZSgpOwogCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCWJyX2ZkYl91cGRhdGUocC0+YnIsIHAsIGFkZHIsIHZpZCwgdHJ1ZSk7CisJCWJyX2ZkYl91cGRhdGUoYnIsIHAsIGFkZHIsIHZpZCwgdHJ1ZSk7CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCQlsb2NhbF9iaF9lbmFibGUoKTsKIAl9IGVsc2UgewotCQlzcGluX2xvY2tfYmgoJnAtPmJyLT5oYXNoX2xvY2spOwotCQllcnIgPSBmZGJfYWRkX2VudHJ5KHAsIGFkZHIsIG5kbS0+bmRtX3N0YXRlLAorCQlzcGluX2xvY2tfYmgoJmJyLT5oYXNoX2xvY2spOworCQllcnIgPSBmZGJfYWRkX2VudHJ5KGJyLCBwLCBhZGRyLCBuZG0tPm5kbV9zdGF0ZSwKIAkJCQkgICAgbmxoX2ZsYWdzLCB2aWQpOwotCQlzcGluX3VubG9ja19iaCgmcC0+YnItPmhhc2hfbG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZici0+aGFzaF9sb2NrKTsKIAl9CiAKIAlyZXR1cm4gZXJyOwpAQCAtODg0LDYgKzg5Niw3IEBACiAJCQkJZGV2LT5uYW1lKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CisJCWJyID0gcC0+YnI7CiAJCXZnID0gbmJwX3ZsYW5fZ3JvdXAocCk7CiAJfQogCkBAIC04OTUsMTUgKzkwOCw5IEBACiAJCX0KIAogCQkvKiBWSUQgd2FzIHNwZWNpZmllZCwgc28gdXNlIGl0LiAqLwotCQlpZiAoZGV2LT5wcml2X2ZsYWdzICYgSUZGX0VCUklER0UpCi0JCQllcnIgPSBicl9mZGJfaW5zZXJ0KGJyLCBOVUxMLCBhZGRyLCB2aWQpOwotCQllbHNlCi0JCQllcnIgPSBfX2JyX2ZkYl9hZGQobmRtLCBwLCBhZGRyLCBubGhfZmxhZ3MsIHZpZCk7CisJCWVyciA9IF9fYnJfZmRiX2FkZChuZG0sIGJyLCBwLCBhZGRyLCBubGhfZmxhZ3MsIHZpZCk7CiAJfSBlbHNlIHsKLQkJaWYgKGRldi0+cHJpdl9mbGFncyAmIElGRl9FQlJJREdFKQotCQkJZXJyID0gYnJfZmRiX2luc2VydChiciwgTlVMTCwgYWRkciwgMCk7Ci0JCWVsc2UKLQkJCWVyciA9IF9fYnJfZmRiX2FkZChuZG0sIHAsIGFkZHIsIG5saF9mbGFncywgMCk7CisJCWVyciA9IF9fYnJfZmRiX2FkZChuZG0sIGJyLCBwLCBhZGRyLCBubGhfZmxhZ3MsIDApOwogCQlpZiAoZXJyIHx8ICF2ZyB8fCAhdmctPm51bV92bGFucykKIAkJCWdvdG8gb3V0OwogCkBAIC05MTQsMTEgKzkyMSw3IEBACiAJCWxpc3RfZm9yX2VhY2hfZW50cnkodiwgJnZnLT52bGFuX2xpc3QsIHZsaXN0KSB7CiAJCQlpZiAoIWJyX3ZsYW5fc2hvdWxkX3VzZSh2KSkKIAkJCQljb250aW51ZTsKLQkJCWlmIChkZXYtPnByaXZfZmxhZ3MgJiBJRkZfRUJSSURHRSkKLQkJCQllcnIgPSBicl9mZGJfaW5zZXJ0KGJyLCBOVUxMLCBhZGRyLCB2LT52aWQpOwotCQkJZWxzZQotCQkJCWVyciA9IF9fYnJfZmRiX2FkZChuZG0sIHAsIGFkZHIsIG5saF9mbGFncywKLQkJCQkJCSAgIHYtPnZpZCk7CisJCQllcnIgPSBfX2JyX2ZkYl9hZGQobmRtLCBiciwgcCwgYWRkciwgbmxoX2ZsYWdzLCB2LT52aWQpOwogCQkJaWYgKGVycikKIAkJCQlnb3RvIG91dDsKIAkJfQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9mb3J3YXJkLmMgYi9uZXQvYnJpZGdlL2JyX2ZvcndhcmQuYwppbmRleCA2M2E4M2Q4Li43Y2I0MWFlIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX2ZvcndhcmQuYworKysgYi9uZXQvYnJpZGdlL2JyX2ZvcndhcmQuYwpAQCAtMjksNyArMjksOCBAQAogCiAJdmcgPSBuYnBfdmxhbl9ncm91cF9yY3UocCk7CiAJcmV0dXJuICgocC0+ZmxhZ3MgJiBCUl9IQUlSUElOX01PREUpIHx8IHNrYi0+ZGV2ICE9IHAtPmRldikgJiYKLQkJYnJfYWxsb3dlZF9lZ3Jlc3ModmcsIHNrYikgJiYgcC0+c3RhdGUgPT0gQlJfU1RBVEVfRk9SV0FSRElORzsKKwkJYnJfYWxsb3dlZF9lZ3Jlc3ModmcsIHNrYikgJiYgcC0+c3RhdGUgPT0gQlJfU1RBVEVfRk9SV0FSRElORyAmJgorCQluYnBfc3dpdGNoZGV2X2FsbG93ZWRfZWdyZXNzKHAsIHNrYik7CiB9CiAKIGludCBicl9kZXZfcXVldWVfcHVzaF94bWl0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtMTc1LDcgKzE3Niw3IEBACiAKIC8qIGNhbGxlZCB1bmRlciByY3VfcmVhZF9sb2NrICovCiB2b2lkIGJyX2Zsb29kKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkgICAgICBib29sIHVuaWNhc3QsIGJvb2wgbG9jYWxfcmN2LCBib29sIGxvY2FsX29yaWcpCisJICAgICAgZW51bSBicl9wa3RfdHlwZSBwa3RfdHlwZSwgYm9vbCBsb2NhbF9yY3YsIGJvb2wgbG9jYWxfb3JpZykKIHsKIAl1OCBpZ21wX3R5cGUgPSBicl9tdWx0aWNhc3RfaWdtcF90eXBlKHNrYik7CiAJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcHJldiA9IE5VTEw7CkBAIC0xODMsNyArMTg0LDEwIEBACiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwLCAmYnItPnBvcnRfbGlzdCwgbGlzdCkgewogCQkvKiBEbyBub3QgZmxvb2QgdW5pY2FzdCB0cmFmZmljIHRvIHBvcnRzIHRoYXQgdHVybiBpdCBvZmYgKi8KLQkJaWYgKHVuaWNhc3QgJiYgIShwLT5mbGFncyAmIEJSX0ZMT09EKSkKKwkJaWYgKHBrdF90eXBlID09IEJSX1BLVF9VTklDQVNUICYmICEocC0+ZmxhZ3MgJiBCUl9GTE9PRCkpCisJCQljb250aW51ZTsKKwkJaWYgKHBrdF90eXBlID09IEJSX1BLVF9NVUxUSUNBU1QgJiYKKwkJICAgICEocC0+ZmxhZ3MgJiBCUl9NQ0FTVF9GTE9PRCkpCiAJCQljb250aW51ZTsKIAogCQkvKiBEbyBub3QgZmxvb2QgdG8gcG9ydHMgdGhhdCBlbmFibGUgcHJveHkgQVJQICovCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2lmLmMgYi9uZXQvYnJpZGdlL2JyX2lmLmMKaW5kZXggZjJmZWRlMC4uZWQwZGQzMyAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9pZi5jCisrKyBiL25ldC9icmlkZ2UvYnJfaWYuYwpAQCAtMzYyLDcgKzM2Miw3IEBACiAJcC0+cGF0aF9jb3N0ID0gcG9ydF9jb3N0KGRldik7CiAJcC0+cHJpb3JpdHkgPSAweDgwMDAgPj4gQlJfUE9SVF9CSVRTOwogCXAtPnBvcnRfbm8gPSBpbmRleDsKLQlwLT5mbGFncyA9IEJSX0xFQVJOSU5HIHwgQlJfRkxPT0Q7CisJcC0+ZmxhZ3MgPSBCUl9MRUFSTklORyB8IEJSX0ZMT09EIHwgQlJfTUNBU1RfRkxPT0Q7CiAJYnJfaW5pdF9wb3J0KHApOwogCWJyX3NldF9zdGF0ZShwLCBCUl9TVEFURV9ESVNBQkxFRCk7CiAJYnJfc3RwX3BvcnRfdGltZXJfaW5pdChwKTsKQEAgLTU0NSw2ICs1NDUsMTAgQEAKIAlpZiAoZXJyKQogCQlnb3RvIGVycjU7CiAKKwllcnIgPSBuYnBfc3dpdGNoZGV2X21hcmtfc2V0KHApOworCWlmIChlcnIpCisJCWdvdG8gZXJyNjsKKwogCWRldl9kaXNhYmxlX2xybyhkZXYpOwogCiAJbGlzdF9hZGRfcmN1KCZwLT5saXN0LCAmYnItPnBvcnRfbGlzdCk7CkBAIC01NjYsNyArNTcwLDcgQEAKIAllcnIgPSBuYnBfdmxhbl9pbml0KHApOwogCWlmIChlcnIpIHsKIAkJbmV0ZGV2X2VycihkZXYsICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB2bGFuIGZpbHRlcmluZyBvbiB0aGlzIHBvcnRcbiIpOwotCQlnb3RvIGVycjY7CisJCWdvdG8gZXJyNzsKIAl9CiAKIAlzcGluX2xvY2tfYmgoJmJyLT5sb2NrKTsKQEAgLTU4OSwxMiArNTkzLDEyIEBACiAKIAlyZXR1cm4gMDsKIAotZXJyNjoKK2Vycjc6CiAJbGlzdF9kZWxfcmN1KCZwLT5saXN0KTsKIAlicl9mZGJfZGVsZXRlX2J5X3BvcnQoYnIsIHAsIDAsIDEpOwogCW5icF91cGRhdGVfcG9ydF9jb3VudChicik7CitlcnI2OgogCW5ldGRldl91cHBlcl9kZXZfdW5saW5rKGRldiwgYnItPmRldik7Ci0KIGVycjU6CiAJZGV2LT5wcml2X2ZsYWdzICY9IH5JRkZfQlJJREdFX1BPUlQ7CiAJbmV0ZGV2X3J4X2hhbmRsZXJfdW5yZWdpc3RlcihkZXYpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9pbnB1dC5jIGIvbmV0L2JyaWRnZS9icl9pbnB1dC5jCmluZGV4IDhlNDg2MjAuLjg1NWI3MmYgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfaW5wdXQuYworKysgYi9uZXQvYnJpZGdlL2JyX2lucHV0LmMKQEAgLTgwLDEzICs4MCwxMCBAQAogCiAJQlJfSU5QVVRfU0tCX0NCKHNrYiktPnByb3h5YXJwX3JlcGxpZWQgPSBmYWxzZTsKIAotCWlmIChkZXYtPmZsYWdzICYgSUZGX05PQVJQKQorCWlmICgoZGV2LT5mbGFncyAmIElGRl9OT0FSUCkgfHwKKwkgICAgIXBza2JfbWF5X3B1bGwoc2tiLCBhcnBfaGRyX2xlbihkZXYpKSkKIAkJcmV0dXJuOwogCi0JaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgYXJwX2hkcl9sZW4oZGV2KSkpIHsKLQkJZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7Ci0JCXJldHVybjsKLQl9CiAJcGFycCA9IGFycF9oZHIoc2tiKTsKIAogCWlmIChwYXJwLT5hcl9wcm8gIT0gaHRvbnMoRVRIX1BfSVApIHx8CkBAIC0xMzEsMTEgKzEyOCwxMiBAQAogLyogbm90ZTogYWxyZWFkeSBjYWxsZWQgd2l0aCByY3VfcmVhZF9sb2NrICovCiBpbnQgYnJfaGFuZGxlX2ZyYW1lX2ZpbmlzaChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlib29sIGxvY2FsX3JjdiA9IGZhbHNlLCBtY2FzdF9oaXQgPSBmYWxzZSwgdW5pY2FzdCA9IHRydWU7CiAJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCA9IGJyX3BvcnRfZ2V0X3JjdShza2ItPmRldik7CiAJY29uc3QgdW5zaWduZWQgY2hhciAqZGVzdCA9IGV0aF9oZHIoc2tiKS0+aF9kZXN0OworCWVudW0gYnJfcGt0X3R5cGUgcGt0X3R5cGUgPSBCUl9QS1RfVU5JQ0FTVDsKIAlzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmRzdCA9IE5VTEw7CiAJc3RydWN0IG5ldF9icmlkZ2VfbWRiX2VudHJ5ICptZHN0OworCWJvb2wgbG9jYWxfcmN2LCBtY2FzdF9oaXQgPSBmYWxzZTsKIAlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnI7CiAJdTE2IHZpZCA9IDA7CiAKQEAgLTE0NSwyOSArMTQzLDM2IEBACiAJaWYgKCFicl9hbGxvd2VkX2luZ3Jlc3MocC0+YnIsIG5icF92bGFuX2dyb3VwX3JjdShwKSwgc2tiLCAmdmlkKSkKIAkJZ290byBvdXQ7CiAKKwluYnBfc3dpdGNoZGV2X2ZyYW1lX21hcmsocCwgc2tiKTsKKwogCS8qIGluc2VydCBpbnRvIGZvcndhcmRpbmcgZGF0YWJhc2UgYWZ0ZXIgZmlsdGVyaW5nIHRvIGF2b2lkIHNwb29maW5nICovCiAJYnIgPSBwLT5icjsKIAlpZiAocC0+ZmxhZ3MgJiBCUl9MRUFSTklORykKIAkJYnJfZmRiX3VwZGF0ZShiciwgcCwgZXRoX2hkcihza2IpLT5oX3NvdXJjZSwgdmlkLCBmYWxzZSk7CiAKLQlpZiAoIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGRlc3QpICYmIGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRlc3QpICYmCi0JICAgIGJyX211bHRpY2FzdF9yY3YoYnIsIHAsIHNrYiwgdmlkKSkKLQkJZ290byBkcm9wOworCWxvY2FsX3JjdiA9ICEhKGJyLT5kZXYtPmZsYWdzICYgSUZGX1BST01JU0MpOworCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihkZXN0KSkgeworCQkvKiBieSBkZWZpbml0aW9uIHRoZSBicm9hZGNhc3QgaXMgYWxzbyBhIG11bHRpY2FzdCBhZGRyZXNzICovCisJCWlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihkZXN0KSkgeworCQkJcGt0X3R5cGUgPSBCUl9QS1RfQlJPQURDQVNUOworCQkJbG9jYWxfcmN2ID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCXBrdF90eXBlID0gQlJfUEtUX01VTFRJQ0FTVDsKKwkJCWlmIChicl9tdWx0aWNhc3RfcmN2KGJyLCBwLCBza2IsIHZpZCkpCisJCQkJZ290byBkcm9wOworCQl9CisJfQogCiAJaWYgKHAtPnN0YXRlID09IEJSX1NUQVRFX0xFQVJOSU5HKQogCQlnb3RvIGRyb3A7CiAKIAlCUl9JTlBVVF9TS0JfQ0Ioc2tiKS0+YnJkZXYgPSBici0+ZGV2OwogCi0JbG9jYWxfcmN2ID0gISEoYnItPmRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQyk7Ci0KIAlpZiAoSVNfRU5BQkxFRChDT05GSUdfSU5FVCkgJiYgc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9BUlApKQogCQlicl9kb19wcm94eV9hcnAoc2tiLCBiciwgdmlkLCBwKTsKIAotCWlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihkZXN0KSkgewotCQlsb2NhbF9yY3YgPSB0cnVlOwotCQl1bmljYXN0ID0gZmFsc2U7Ci0JfSBlbHNlIGlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihkZXN0KSkgeworCXN3aXRjaCAocGt0X3R5cGUpIHsKKwljYXNlIEJSX1BLVF9NVUxUSUNBU1Q6CiAJCW1kc3QgPSBicl9tZGJfZ2V0KGJyLCBza2IsIHZpZCk7CiAJCWlmICgobWRzdCB8fCBCUl9JTlBVVF9TS0JfQ0JfTVJPVVRFUlNfT05MWShza2IpKSAmJgogCQkgICAgYnJfbXVsdGljYXN0X3F1ZXJpZXJfZXhpc3RzKGJyLCBldGhfaGRyKHNrYikpKSB7CkBAIC0xODEsMTggKzE4NiwyMiBAQAogCQkJbG9jYWxfcmN2ID0gdHJ1ZTsKIAkJCWJyLT5kZXYtPnN0YXRzLm11bHRpY2FzdCsrOwogCQl9Ci0JCXVuaWNhc3QgPSBmYWxzZTsKLQl9IGVsc2UgaWYgKChkc3QgPSBfX2JyX2ZkYl9nZXQoYnIsIGRlc3QsIHZpZCkpICYmIGRzdC0+aXNfbG9jYWwpIHsKLQkJLyogRG8gbm90IGZvcndhcmQgdGhlIHBhY2tldCBzaW5jZSBpdCdzIGxvY2FsLiAqLwotCQlyZXR1cm4gYnJfcGFzc19mcmFtZV91cChza2IpOworCQlicmVhazsKKwljYXNlIEJSX1BLVF9VTklDQVNUOgorCQlkc3QgPSBfX2JyX2ZkYl9nZXQoYnIsIGRlc3QsIHZpZCk7CisJZGVmYXVsdDoKKwkJYnJlYWs7CiAJfQogCiAJaWYgKGRzdCkgeworCQlpZiAoZHN0LT5pc19sb2NhbCkKKwkJCXJldHVybiBicl9wYXNzX2ZyYW1lX3VwKHNrYik7CisKIAkJZHN0LT51c2VkID0gamlmZmllczsKIAkJYnJfZm9yd2FyZChkc3QtPmRzdCwgc2tiLCBsb2NhbF9yY3YsIGZhbHNlKTsKIAl9IGVsc2UgewogCQlpZiAoIW1jYXN0X2hpdCkKLQkJCWJyX2Zsb29kKGJyLCBza2IsIHVuaWNhc3QsIGxvY2FsX3JjdiwgZmFsc2UpOworCQkJYnJfZmxvb2QoYnIsIHNrYiwgcGt0X3R5cGUsIGxvY2FsX3JjdiwgZmFsc2UpOwogCQllbHNlCiAJCQlicl9tdWx0aWNhc3RfZmxvb2QobWRzdCwgc2tiLCBsb2NhbF9yY3YsIGZhbHNlKTsKIAl9CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX211bHRpY2FzdC5jIGIvbmV0L2JyaWRnZS9icl9tdWx0aWNhc3QuYwppbmRleCBhNTQyM2ExLi5jNWZlYTkzIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX211bHRpY2FzdC5jCisrKyBiL25ldC9icmlkZ2UvYnJfbXVsdGljYXN0LmMKQEAgLTExMzgsNyArMTEzOCw3IEBACiAJCX0gZWxzZSB7CiAJCQllcnIgPSBicl9pcDZfbXVsdGljYXN0X2FkZF9ncm91cChiciwgcG9ydCwKIAkJCQkJCQkgJmdyZWMtPmdyZWNfbWNhLCB2aWQpOwotCQkJaWYgKCFlcnIpCisJCQlpZiAoZXJyKQogCQkJCWJyZWFrOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXJfaG9va3MuYyBiL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyX2hvb2tzLmMKaW5kZXggNzdlN2Y2OS4uMmZlOTM0NSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXJfaG9va3MuYworKysgYi9uZXQvYnJpZGdlL2JyX25ldGZpbHRlcl9ob29rcy5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvaW5fcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgogCiAjaW5jbHVkZSA8bmV0L2lwLmg+CkBAIC0zOTUsMTEgKzM5NiwxMCBAQAogCQkJCXNrYi0+ZGV2ID0gbmZfYnJpZGdlLT5waHlzaW5kZXY7CiAJCQkJbmZfYnJpZGdlX3VwZGF0ZV9wcm90b2NvbChza2IpOwogCQkJCW5mX2JyaWRnZV9wdXNoX2VuY2FwX2hlYWRlcihza2IpOwotCQkJCU5GX0hPT0tfVEhSRVNIKE5GUFJPVE9fQlJJREdFLAotCQkJCQkgICAgICAgTkZfQlJfUFJFX1JPVVRJTkcsCi0JCQkJCSAgICAgICBuZXQsIHNrLCBza2IsIHNrYi0+ZGV2LCBOVUxMLAotCQkJCQkgICAgICAgYnJfbmZfcHJlX3JvdXRpbmdfZmluaXNoX2JyaWRnZSwKLQkJCQkJICAgICAgIDEpOworCQkJCWJyX25mX2hvb2tfdGhyZXNoKE5GX0JSX1BSRV9ST1VUSU5HLAorCQkJCQkJICBuZXQsIHNrLCBza2IsIHNrYi0+ZGV2LAorCQkJCQkJICBOVUxMLAorCQkJCQkJICBicl9uZl9wcmVfcm91dGluZ19maW5pc2gpOwogCQkJCXJldHVybiAwOwogCQkJfQogCQkJZXRoZXJfYWRkcl9jb3B5KGV0aF9oZHIoc2tiKS0+aF9kZXN0LCBkZXYtPmRldl9hZGRyKTsKQEAgLTQxNywxMCArNDE3LDggQEAKIAlza2ItPmRldiA9IG5mX2JyaWRnZS0+cGh5c2luZGV2OwogCW5mX2JyaWRnZV91cGRhdGVfcHJvdG9jb2woc2tiKTsKIAluZl9icmlkZ2VfcHVzaF9lbmNhcF9oZWFkZXIoc2tiKTsKLQlORl9IT09LX1RIUkVTSChORlBST1RPX0JSSURHRSwgTkZfQlJfUFJFX1JPVVRJTkcsIG5ldCwgc2ssIHNrYiwKLQkJICAgICAgIHNrYi0+ZGV2LCBOVUxMLAotCQkgICAgICAgYnJfaGFuZGxlX2ZyYW1lX2ZpbmlzaCwgMSk7Ci0KKwlicl9uZl9ob29rX3RocmVzaChORl9CUl9QUkVfUk9VVElORywgbmV0LCBzaywgc2tiLCBza2ItPmRldiwgTlVMTCwKKwkJCSAgYnJfaGFuZGxlX2ZyYW1lX2ZpbmlzaCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk5Miw2ICs5OTAsNDMgQEAKIAkubm90aWZpZXJfY2FsbCA9IGJybmZfZGV2aWNlX2V2ZW50LAogfTsKIAorLyogcmVjdXJzaXZlbHkgaW52b2tlcyBuZl9ob29rX3Nsb3cgKGFnYWluKSwgc2tpcHBpbmcgYWxyZWFkeS1jYWxsZWQKKyAqIGhvb2tzICg8IE5GX0JSX1BSSV9CUk5GKS4KKyAqCisgKiBDYWxsZWQgd2l0aCByY3UgcmVhZCBsb2NrIGhlbGQuCisgKi8KK2ludCBicl9uZl9ob29rX3RocmVzaCh1bnNpZ25lZCBpbnQgaG9vaywgc3RydWN0IG5ldCAqbmV0LAorCQkgICAgICBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCisJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICppbmRldiwKKwkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm91dGRldiwKKwkJICAgICAgaW50ICgqb2tmbikoc3RydWN0IG5ldCAqLCBzdHJ1Y3Qgc29jayAqLAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKikpCit7CisJc3RydWN0IG5mX2hvb2tfZW50cnkgKmVsZW07CisJc3RydWN0IG5mX2hvb2tfc3RhdGUgc3RhdGU7CisJaW50IHJldDsKKworCWVsZW0gPSByY3VfZGVyZWZlcmVuY2UobmV0LT5uZi5ob29rc1tORlBST1RPX0JSSURHRV1baG9va10pOworCisJd2hpbGUgKGVsZW0gJiYgKGVsZW0tPm9wcy5wcmlvcml0eSA8PSBORl9CUl9QUklfQlJORikpCisJCWVsZW0gPSByY3VfZGVyZWZlcmVuY2UoZWxlbS0+bmV4dCk7CisKKwlpZiAoIWVsZW0pCisJCXJldHVybiBva2ZuKG5ldCwgc2ssIHNrYik7CisKKwkvKiBXZSBtYXkgYWxyZWFkeSBoYXZlIHRoaXMsIGJ1dCByZWFkLWxvY2tzIG5lc3QgYW55d2F5ICovCisJcmN1X3JlYWRfbG9jaygpOworCW5mX2hvb2tfc3RhdGVfaW5pdCgmc3RhdGUsIGVsZW0sIGhvb2ssIE5GX0JSX1BSSV9CUk5GICsgMSwKKwkJCSAgIE5GUFJPVE9fQlJJREdFLCBpbmRldiwgb3V0ZGV2LCBzaywgbmV0LCBva2ZuKTsKKworCXJldCA9IG5mX2hvb2tfc2xvdyhza2IsICZzdGF0ZSk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJaWYgKHJldCA9PSAxKQorCQlyZXQgPSBva2ZuKG5ldCwgc2ssIHNrYik7CisKKwlyZXR1cm4gcmV0OworfQorCiAjaWZkZWYgQ09ORklHX1NZU0NUTAogc3RhdGljCiBpbnQgYnJuZl9zeXNjdGxfY2FsbF90YWJsZXMoc3RydWN0IGN0bF90YWJsZSAqY3RsLCBpbnQgd3JpdGUsCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX25ldGZpbHRlcl9pcHY2LmMgYi9uZXQvYnJpZGdlL2JyX25ldGZpbHRlcl9pcHY2LmMKaW5kZXggNWU1OWE4NC4uNTk4OTY2MSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXJfaXB2Ni5jCisrKyBiL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyX2lwdjYuYwpAQCAtMTg3LDEwICsxODcsOSBAQAogCQkJc2tiLT5kZXYgPSBuZl9icmlkZ2UtPnBoeXNpbmRldjsKIAkJCW5mX2JyaWRnZV91cGRhdGVfcHJvdG9jb2woc2tiKTsKIAkJCW5mX2JyaWRnZV9wdXNoX2VuY2FwX2hlYWRlcihza2IpOwotCQkJTkZfSE9PS19USFJFU0goTkZQUk9UT19CUklER0UsIE5GX0JSX1BSRV9ST1VUSU5HLAotCQkJCSAgICAgICBuZXQsIHNrLCBza2IsIHNrYi0+ZGV2LCBOVUxMLAotCQkJCSAgICAgICBicl9uZl9wcmVfcm91dGluZ19maW5pc2hfYnJpZGdlLAotCQkJCSAgICAgICAxKTsKKwkJCWJyX25mX2hvb2tfdGhyZXNoKE5GX0JSX1BSRV9ST1VUSU5HLAorCQkJCQkgIG5ldCwgc2ssIHNrYiwgc2tiLT5kZXYsIE5VTEwsCisJCQkJCSAgYnJfbmZfcHJlX3JvdXRpbmdfZmluaXNoX2JyaWRnZSk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQlldGhlcl9hZGRyX2NvcHkoZXRoX2hkcihza2IpLT5oX2Rlc3QsIGRldi0+ZGV2X2FkZHIpOwpAQCAtMjA3LDkgKzIwNiw4IEBACiAJc2tiLT5kZXYgPSBuZl9icmlkZ2UtPnBoeXNpbmRldjsKIAluZl9icmlkZ2VfdXBkYXRlX3Byb3RvY29sKHNrYik7CiAJbmZfYnJpZGdlX3B1c2hfZW5jYXBfaGVhZGVyKHNrYik7Ci0JTkZfSE9PS19USFJFU0goTkZQUk9UT19CUklER0UsIE5GX0JSX1BSRV9ST1VUSU5HLCBuZXQsIHNrLCBza2IsCi0JCSAgICAgICBza2ItPmRldiwgTlVMTCwKLQkJICAgICAgIGJyX2hhbmRsZV9mcmFtZV9maW5pc2gsIDEpOworCWJyX25mX2hvb2tfdGhyZXNoKE5GX0JSX1BSRV9ST1VUSU5HLCBuZXQsIHNrLCBza2IsCisJCQkgIHNrYi0+ZGV2LCBOVUxMLCBicl9oYW5kbGVfZnJhbWVfZmluaXNoKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9uZXRsaW5rLmMgYi9uZXQvYnJpZGdlL2JyX25ldGxpbmsuYwppbmRleCBmMmEyOWU0Li5lOTkwMzdjIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX25ldGxpbmsuYworKysgYi9uZXQvYnJpZGdlL2JyX25ldGxpbmsuYwpAQCAtMTY5LDEwICsxNjksMTUgQEAKIAkgICAgbmxhX3B1dF91MzIoc2tiLCBJRkxBX0JSUE9SVF9DT1NULCBwLT5wYXRoX2Nvc3QpIHx8CiAJICAgIG5sYV9wdXRfdTgoc2tiLCBJRkxBX0JSUE9SVF9NT0RFLCBtb2RlKSB8fAogCSAgICBubGFfcHV0X3U4KHNrYiwgSUZMQV9CUlBPUlRfR1VBUkQsICEhKHAtPmZsYWdzICYgQlJfQlBEVV9HVUFSRCkpIHx8Ci0JICAgIG5sYV9wdXRfdTgoc2tiLCBJRkxBX0JSUE9SVF9QUk9URUNULCAhIShwLT5mbGFncyAmIEJSX1JPT1RfQkxPQ0spKSB8fAotCSAgICBubGFfcHV0X3U4KHNrYiwgSUZMQV9CUlBPUlRfRkFTVF9MRUFWRSwgISEocC0+ZmxhZ3MgJiBCUl9NVUxUSUNBU1RfRkFTVF9MRUFWRSkpIHx8CisJICAgIG5sYV9wdXRfdTgoc2tiLCBJRkxBX0JSUE9SVF9QUk9URUNULAorCQkgICAgICAgISEocC0+ZmxhZ3MgJiBCUl9ST09UX0JMT0NLKSkgfHwKKwkgICAgbmxhX3B1dF91OChza2IsIElGTEFfQlJQT1JUX0ZBU1RfTEVBVkUsCisJCSAgICAgICAhIShwLT5mbGFncyAmIEJSX01VTFRJQ0FTVF9GQVNUX0xFQVZFKSkgfHwKIAkgICAgbmxhX3B1dF91OChza2IsIElGTEFfQlJQT1JUX0xFQVJOSU5HLCAhIShwLT5mbGFncyAmIEJSX0xFQVJOSU5HKSkgfHwKLQkgICAgbmxhX3B1dF91OChza2IsIElGTEFfQlJQT1JUX1VOSUNBU1RfRkxPT0QsICEhKHAtPmZsYWdzICYgQlJfRkxPT0QpKSB8fAorCSAgICBubGFfcHV0X3U4KHNrYiwgSUZMQV9CUlBPUlRfVU5JQ0FTVF9GTE9PRCwKKwkJICAgICAgICEhKHAtPmZsYWdzICYgQlJfRkxPT0QpKSB8fAorCSAgICBubGFfcHV0X3U4KHNrYiwgSUZMQV9CUlBPUlRfTUNBU1RfRkxPT0QsCisJCSAgICAgICAhIShwLT5mbGFncyAmIEJSX01DQVNUX0ZMT09EKSkgfHwKIAkgICAgbmxhX3B1dF91OChza2IsIElGTEFfQlJQT1JUX1BST1hZQVJQLCAhIShwLT5mbGFncyAmIEJSX1BST1hZQVJQKSkgfHwKIAkgICAgbmxhX3B1dF91OChza2IsIElGTEFfQlJQT1JUX1BST1hZQVJQX1dJRkksCiAJCSAgICAgICAhIShwLT5mbGFncyAmIEJSX1BST1hZQVJQX1dJRkkpKSB8fApAQCAtNjMwLDYgKzYzNSw3IEBACiAJYnJfc2V0X3BvcnRfZmxhZyhwLCB0YiwgSUZMQV9CUlBPUlRfUFJPVEVDVCwgQlJfUk9PVF9CTE9DSyk7CiAJYnJfc2V0X3BvcnRfZmxhZyhwLCB0YiwgSUZMQV9CUlBPUlRfTEVBUk5JTkcsIEJSX0xFQVJOSU5HKTsKIAlicl9zZXRfcG9ydF9mbGFnKHAsIHRiLCBJRkxBX0JSUE9SVF9VTklDQVNUX0ZMT09ELCBCUl9GTE9PRCk7CisJYnJfc2V0X3BvcnRfZmxhZyhwLCB0YiwgSUZMQV9CUlBPUlRfTUNBU1RfRkxPT0QsIEJSX01DQVNUX0ZMT09EKTsKIAlicl9zZXRfcG9ydF9mbGFnKHAsIHRiLCBJRkxBX0JSUE9SVF9QUk9YWUFSUCwgQlJfUFJPWFlBUlApOwogCWJyX3NldF9wb3J0X2ZsYWcocCwgdGIsIElGTEFfQlJQT1JUX1BST1hZQVJQX1dJRkksIEJSX1BST1hZQVJQX1dJRkkpOwogCkBAIC0xMjQ1LDE0ICsxMjUxLDMwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzaXplX3QgYnJpZGdlX2dldF9saW5reHN0YXRzX3NpemUoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBzaXplX3QgYnJfZ2V0X2xpbmt4c3RhdHNfc2l6ZShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYXR0cikKIHsKLQlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAgPSBOVUxMOwogCXN0cnVjdCBuZXRfYnJpZGdlX3ZsYW5fZ3JvdXAgKnZnOwogCXN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKnY7CisJc3RydWN0IG5ldF9icmlkZ2UgKmJyOwogCWludCBudW12bHMgPSAwOwogCi0JdmcgPSBicl92bGFuX2dyb3VwKGJyKTsKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIElGTEFfU1RBVFNfTElOS19YU1RBVFM6CisJCWJyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJdmcgPSBicl92bGFuX2dyb3VwKGJyKTsKKwkJYnJlYWs7CisJY2FzZSBJRkxBX1NUQVRTX0xJTktfWFNUQVRTX1NMQVZFOgorCQlwID0gYnJfcG9ydF9nZXRfcnRubChkZXYpOworCQlpZiAoIXApCisJCQlyZXR1cm4gMDsKKwkJYnIgPSBwLT5icjsKKwkJdmcgPSBuYnBfdmxhbl9ncm91cChwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCiAJaWYgKHZnKSB7CiAJCS8qIHdlIG5lZWQgdG8gY291bnQgYWxsLCBldmVuIHBsYWNlaG9sZGVyIGVudHJpZXMgKi8KIAkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2LCAmdmctPnZsYW5fbGlzdCwgdmxpc3QpCkBAIC0xMjY0LDQ1ICsxMjg2LDQyIEBACiAJICAgICAgIG5sYV90b3RhbF9zaXplKDApOwogfQogCi1zdGF0aWMgc2l6ZV90IGJycG9ydF9nZXRfbGlua3hzdGF0c19zaXplKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGJyX2ZpbGxfbGlua3hzdGF0cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIGludCAqcHJpdmlkeCwgaW50IGF0dHIpCiB7Ci0JcmV0dXJuIG5sYV90b3RhbF9zaXplKHNpemVvZihzdHJ1Y3QgYnJfbWNhc3Rfc3RhdHMpKSArCi0JICAgICAgIG5sYV90b3RhbF9zaXplKDApOwotfQotCi1zdGF0aWMgc2l6ZV90IGJyX2dldF9saW5reHN0YXRzX3NpemUoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGF0dHIpCi17Ci0Jc2l6ZV90IHJldHNpemUgPSAwOworCXN0cnVjdCBubGF0dHIgKm5sYSBfX21heWJlX3VudXNlZDsKKwlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwID0gTlVMTDsKKwlzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuX2dyb3VwICp2ZzsKKwlzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuICp2OworCXN0cnVjdCBuZXRfYnJpZGdlICpicjsKKwlzdHJ1Y3QgbmxhdHRyICpuZXN0OworCWludCB2bF9pZHggPSAwOwogCiAJc3dpdGNoIChhdHRyKSB7CiAJY2FzZSBJRkxBX1NUQVRTX0xJTktfWFNUQVRTOgotCQlyZXRzaXplID0gYnJpZGdlX2dldF9saW5reHN0YXRzX3NpemUoZGV2KTsKKwkJYnIgPSBuZXRkZXZfcHJpdihkZXYpOworCQl2ZyA9IGJyX3ZsYW5fZ3JvdXAoYnIpOwogCQlicmVhazsKIAljYXNlIElGTEFfU1RBVFNfTElOS19YU1RBVFNfU0xBVkU6Ci0JCXJldHNpemUgPSBicnBvcnRfZ2V0X2xpbmt4c3RhdHNfc2l6ZShkZXYpOworCQlwID0gYnJfcG9ydF9nZXRfcnRubChkZXYpOworCQlpZiAoIXApCisJCQlyZXR1cm4gMDsKKwkJYnIgPSBwLT5icjsKKwkJdmcgPSBuYnBfdmxhbl9ncm91cChwKTsKIAkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmV0dXJuIHJldHNpemU7Ci19Ci0KLXN0YXRpYyBpbnQgYnJpZGdlX2ZpbGxfbGlua3hzdGF0cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgIGludCAqcHJpdmlkeCkKLXsKLQlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBubGF0dHIgKm5sYSBfX21heWJlX3VudXNlZDsKLQlzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuX2dyb3VwICp2ZzsKLQlzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuICp2OwotCXN0cnVjdCBubGF0dHIgKm5lc3Q7Ci0JaW50IHZsX2lkeCA9IDA7Ci0KIAluZXN0ID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBMSU5LX1hTVEFUU19UWVBFX0JSSURHRSk7CiAJaWYgKCFuZXN0KQogCQlyZXR1cm4gLUVNU0dTSVpFOwogCi0JdmcgPSBicl92bGFuX2dyb3VwKGJyKTsKIAlpZiAodmcpIHsKKwkJdTE2IHB2aWQ7CisKKwkJcHZpZCA9IGJyX2dldF9wdmlkKHZnKTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2LCAmdmctPnZsYW5fbGlzdCwgdmxpc3QpIHsKIAkJCXN0cnVjdCBicmlkZ2Vfdmxhbl94c3RhdHMgdnhpOwogCQkJc3RydWN0IGJyX3ZsYW5fc3RhdHMgc3RhdHM7CkBAIC0xMzExLDYgKzEzMzAsOSBAQAogCQkJCWNvbnRpbnVlOwogCQkJbWVtc2V0KCZ2eGksIDAsIHNpemVvZih2eGkpKTsKIAkJCXZ4aS52aWQgPSB2LT52aWQ7CisJCQl2eGkuZmxhZ3MgPSB2LT5mbGFnczsKKwkJCWlmICh2LT52aWQgPT0gcHZpZCkKKwkJCQl2eGkuZmxhZ3MgfD0gQlJJREdFX1ZMQU5fSU5GT19QVklEOwogCQkJYnJfdmxhbl9nZXRfc3RhdHModiwgJnN0YXRzKTsKIAkJCXZ4aS5yeF9ieXRlcyA9IHN0YXRzLnJ4X2J5dGVzOwogCQkJdnhpLnJ4X3BhY2tldHMgPSBzdGF0cy5yeF9wYWNrZXRzOwpAQCAtMTMyOSw3ICsxMzUxLDcgQEAKIAkJCQkJQlJJREdFX1hTVEFUU19QQUQpOwogCQlpZiAoIW5sYSkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwotCQlicl9tdWx0aWNhc3RfZ2V0X3N0YXRzKGJyLCBOVUxMLCBubGFfZGF0YShubGEpKTsKKwkJYnJfbXVsdGljYXN0X2dldF9zdGF0cyhiciwgcCwgbmxhX2RhdGEobmxhKSk7CiAJfQogI2VuZGlmCiAJbmxhX25lc3RfZW5kKHNrYiwgbmVzdCk7CkBAIC0xMzQ0LDUyICsxMzY2LDYgQEAKIAlyZXR1cm4gLUVNU0dTSVpFOwogfQogCi1zdGF0aWMgaW50IGJycG9ydF9maWxsX2xpbmt4c3RhdHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICBpbnQgKnByaXZpZHgpCi17Ci0Jc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCA9IGJyX3BvcnRfZ2V0X3J0bmwoZGV2KTsKLQlzdHJ1Y3QgbmxhdHRyICpubGEgX19tYXliZV91bnVzZWQ7Ci0Jc3RydWN0IG5sYXR0ciAqbmVzdDsKLQotCWlmICghcCkKLQkJcmV0dXJuIDA7Ci0KLQluZXN0ID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBMSU5LX1hTVEFUU19UWVBFX0JSSURHRSk7Ci0JaWYgKCFuZXN0KQotCQlyZXR1cm4gLUVNU0dTSVpFOwotI2lmZGVmIENPTkZJR19CUklER0VfSUdNUF9TTk9PUElORwotCW5sYSA9IG5sYV9yZXNlcnZlXzY0Yml0KHNrYiwgQlJJREdFX1hTVEFUU19NQ0FTVCwKLQkJCQlzaXplb2Yoc3RydWN0IGJyX21jYXN0X3N0YXRzKSwKLQkJCQlCUklER0VfWFNUQVRTX1BBRCk7Ci0JaWYgKCFubGEpIHsKLQkJbmxhX25lc3RfZW5kKHNrYiwgbmVzdCk7Ci0JCXJldHVybiAtRU1TR1NJWkU7Ci0JfQotCWJyX211bHRpY2FzdF9nZXRfc3RhdHMocC0+YnIsIHAsIG5sYV9kYXRhKG5sYSkpOwotI2VuZGlmCi0JbmxhX25lc3RfZW5kKHNrYiwgbmVzdCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBicl9maWxsX2xpbmt4c3RhdHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICAgIGludCAqcHJpdmlkeCwgaW50IGF0dHIpCi17Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0KLQlzd2l0Y2ggKGF0dHIpIHsKLQljYXNlIElGTEFfU1RBVFNfTElOS19YU1RBVFM6Ci0JCXJldCA9IGJyaWRnZV9maWxsX2xpbmt4c3RhdHMoc2tiLCBkZXYsIHByaXZpZHgpOwotCQlicmVhazsKLQljYXNlIElGTEFfU1RBVFNfTElOS19YU1RBVFNfU0xBVkU6Ci0JCXJldCA9IGJycG9ydF9maWxsX2xpbmt4c3RhdHMoc2tiLCBkZXYsIHByaXZpZHgpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCiBzdGF0aWMgc3RydWN0IHJ0bmxfYWZfb3BzIGJyX2FmX29wcyBfX3JlYWRfbW9zdGx5ID0gewogCS5mYW1pbHkJCQk9IEFGX0JSSURHRSwKIAkuZ2V0X2xpbmtfYWZfc2l6ZQk9IGJyX2dldF9saW5rX2FmX3NpemVfZmlsdGVyZWQsCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX3ByaXZhdGUuaCBiL25ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oCmluZGV4IGFhYzJhNmUuLjFiNjMxNzcgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oCisrKyBiL25ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oCkBAIC0yNTEsNiArMjUxLDkgQEAKICNpZmRlZiBDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HCiAJc3RydWN0IG5ldF9icmlkZ2Vfdmxhbl9ncm91cAlfX3JjdSAqdmxncnA7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfTkVUX1NXSVRDSERFVgorCWludAkJCQlvZmZsb2FkX2Z3ZF9tYXJrOworI2VuZGlmCiB9OwogCiAjZGVmaW5lIGJyX2F1dG9fcG9ydChwKSAoKHApLT5mbGFncyAmIEJSX0FVVE9fTUFTSykKQEAgLTM1OSw2ICszNjIsMTEgQEAKIAlzdHJ1Y3QgdGltZXJfbGlzdAkJZ2NfdGltZXI7CiAJc3RydWN0IGtvYmplY3QJCQkqaWZvYmo7CiAJdTMyCQkJCWF1dG9fY250OworCisjaWZkZWYgQ09ORklHX05FVF9TV0lUQ0hERVYKKwlpbnQgb2ZmbG9hZF9md2RfbWFyazsKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklORwogCXN0cnVjdCBuZXRfYnJpZGdlX3ZsYW5fZ3JvdXAJX19yY3UgKnZsZ3JwOwogCXU4CQkJCXZsYW5fZW5hYmxlZDsKQEAgLTM4MSw2ICszODksMTAgQEAKICNpZmRlZiBDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HCiAJYm9vbCB2bGFuX2ZpbHRlcmVkOwogI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTkVUX1NXSVRDSERFVgorCWludCBvZmZsb2FkX2Z3ZF9tYXJrOworI2VuZGlmCiB9OwogCiAjZGVmaW5lIEJSX0lOUFVUX1NLQl9DQihfX3NrYikJKChzdHJ1Y3QgYnJfaW5wdXRfc2tiX2NiICopKF9fc2tiKS0+Y2IpCkBAIC00OTYsNyArNTA4LDcgQEAKIGludCBicl9mZGJfYWRkKHN0cnVjdCBuZG1zZyAqbmxoLCBzdHJ1Y3QgbmxhdHRyICp0YltdLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyLCB1MTYgdmlkLCB1MTYgbmxoX2ZsYWdzKTsKIGludCBicl9mZGJfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCi0JCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpmZGV2LCBpbnQgaWR4KTsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5ldF9kZXZpY2UgKmZkZXYsIGludCAqaWR4KTsKIGludCBicl9mZGJfc3luY19zdGF0aWMoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwKTsKIHZvaWQgYnJfZmRiX3Vuc3luY19zdGF0aWMoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwKTsKIGludCBicl9mZGJfZXh0ZXJuYWxfbGVhcm5fYWRkKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwKQEAgLTUwNSwxMiArNTE3LDE3IEBACiAJCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyLCB1MTYgdmlkKTsKIAogLyogYnJfZm9yd2FyZC5jICovCitlbnVtIGJyX3BrdF90eXBlIHsKKwlCUl9QS1RfVU5JQ0FTVCwKKwlCUl9QS1RfTVVMVElDQVNULAorCUJSX1BLVF9CUk9BRENBU1QKK307CiBpbnQgYnJfZGV2X3F1ZXVlX3B1c2hfeG1pdChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiB2b2lkIGJyX2ZvcndhcmQoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqdG8sIHN0cnVjdCBza19idWZmICpza2IsCiAJCWJvb2wgbG9jYWxfcmN2LCBib29sIGxvY2FsX29yaWcpOwogaW50IGJyX2ZvcndhcmRfZmluaXNoKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHZvaWQgYnJfZmxvb2Qoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCSAgICAgIGJvb2wgdW5pY2FzdCwgYm9vbCBsb2NhbF9yY3YsIGJvb2wgbG9jYWxfb3JpZyk7CisJICAgICAgZW51bSBicl9wa3RfdHlwZSBwa3RfdHlwZSwgYm9vbCBsb2NhbF9yY3YsIGJvb2wgbG9jYWxfb3JpZyk7CiAKIC8qIGJyX2lmLmMgKi8KIHZvaWQgYnJfcG9ydF9jYXJyaWVyX2NoZWNrKHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnApOwpAQCAtMTAzNCw0ICsxMDUxLDI5IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgYnJfc3lzZnNfZGVsYnIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikgeyByZXR1cm47IH0KICNlbmRpZiAvKiBDT05GSUdfU1lTRlMgKi8KIAorLyogYnJfc3dpdGNoZGV2LmMgKi8KKyNpZmRlZiBDT05GSUdfTkVUX1NXSVRDSERFVgoraW50IG5icF9zd2l0Y2hkZXZfbWFya19zZXQoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCk7Cit2b2lkIG5icF9zd2l0Y2hkZXZfZnJhbWVfbWFyayhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7Citib29sIG5icF9zd2l0Y2hkZXZfYWxsb3dlZF9lZ3Jlc3MoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwKKwkJCQkgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IG5icF9zd2l0Y2hkZXZfbWFya19zZXQoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5icF9zd2l0Y2hkZXZfZnJhbWVfbWFyayhjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLAorCQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKK30KKworc3RhdGljIGlubGluZSBib29sIG5icF9zd2l0Y2hkZXZfYWxsb3dlZF9lZ3Jlc3MoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwKKwkJCQkJCWNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHRydWU7Cit9CisjZW5kaWYgLyogQ09ORklHX05FVF9TV0lUQ0hERVYgKi8KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX3N0cF9pZi5jIGIvbmV0L2JyaWRnZS9icl9zdHBfaWYuYwppbmRleCAzNDFjYWEwLi5kOGFkNzNiMyAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9zdHBfaWYuYworKysgYi9uZXQvYnJpZGdlL2JyX3N0cF9pZi5jCkBAIC0xMzQsMTcgKzEzNCwzNiBAQAogCQlicl9iZWNvbWVfcm9vdF9icmlkZ2UoYnIpOwogfQogCitzdGF0aWMgaW50IGJyX3N0cF9jYWxsX3VzZXIoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCBjaGFyICphcmcpCit7CisJY2hhciAqYXJndltdID0geyBCUl9TVFBfUFJPRywgYnItPmRldi0+bmFtZSwgYXJnLCBOVUxMIH07CisJY2hhciAqZW52cFtdID0geyBOVUxMIH07CisJaW50IHJjOworCisJLyogY2FsbCB1c2Vyc3BhY2UgU1RQIGFuZCByZXBvcnQgcHJvZ3JhbSBlcnJvcnMgKi8KKwlyYyA9IGNhbGxfdXNlcm1vZGVoZWxwZXIoQlJfU1RQX1BST0csIGFyZ3YsIGVudnAsIFVNSF9XQUlUX1BST0MpOworCWlmIChyYyA+IDApIHsKKwkJaWYgKHJjICYgMHhmZikKKwkJCWJyX2RlYnVnKGJyLCBCUl9TVFBfUFJPRyAiIHJlY2VpdmVkIHNpZ25hbCAlZFxuIiwKKwkJCQkgcmMgJiAweDdmKTsKKwkJZWxzZQorCQkJYnJfZGVidWcoYnIsIEJSX1NUUF9QUk9HICIgZXhpdGVkIHdpdGggY29kZSAlZFxuIiwKKwkJCQkgKHJjID4+IDgpICYgMHhmZik7CisJfQorCisJcmV0dXJuIHJjOworfQorCiBzdGF0aWMgdm9pZCBicl9zdHBfc3RhcnQoc3RydWN0IG5ldF9icmlkZ2UgKmJyKQogewotCWludCByOwotCWNoYXIgKmFyZ3ZbXSA9IHsgQlJfU1RQX1BST0csIGJyLT5kZXYtPm5hbWUsICJzdGFydCIsIE5VTEwgfTsKLQljaGFyICplbnZwW10gPSB7IE5VTEwgfTsKIAlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwOworCWludCBlcnIgPSAtRU5PRU5UOwogCiAJaWYgKG5ldF9lcShkZXZfbmV0KGJyLT5kZXYpLCAmaW5pdF9uZXQpKQotCQlyID0gY2FsbF91c2VybW9kZWhlbHBlcihCUl9TVFBfUFJPRywgYXJndiwgZW52cCwgVU1IX1dBSVRfUFJPQyk7Ci0JZWxzZQotCQlyID0gLUVOT0VOVDsKKwkJZXJyID0gYnJfc3RwX2NhbGxfdXNlcihiciwgInN0YXJ0Iik7CisKKwlpZiAoZXJyICYmIGVyciAhPSAtRU5PRU5UKQorCQlicl9lcnIoYnIsICJmYWlsZWQgdG8gc3RhcnQgdXNlcnNwYWNlIFNUUCAoJWQpXG4iLCBlcnIpOwogCiAJc3Bpbl9sb2NrX2JoKCZici0+bG9jayk7CiAKQEAgLTE1Myw5ICsxNzIsMTAgQEAKIAllbHNlIGlmIChici0+YnJpZGdlX2ZvcndhcmRfZGVsYXkgPiBCUl9NQVhfRk9SV0FSRF9ERUxBWSkKIAkJX19icl9zZXRfZm9yd2FyZF9kZWxheShiciwgQlJfTUFYX0ZPUldBUkRfREVMQVkpOwogCi0JaWYgKHIgPT0gMCkgeworCWlmICghZXJyKSB7CiAJCWJyLT5zdHBfZW5hYmxlZCA9IEJSX1VTRVJfU1RQOwogCQlicl9kZWJ1ZyhiciwgInVzZXJzcGFjZSBTVFAgc3RhcnRlZFxuIik7CisKIAkJLyogU3RvcCBoZWxsbyBhbmQgaG9sZCB0aW1lcnMgKi8KIAkJZGVsX3RpbWVyKCZici0+aGVsbG9fdGltZXIpOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZici0+cG9ydF9saXN0LCBsaXN0KQpAQCAtMTczLDE0ICsxOTMsMTMgQEAKIAogc3RhdGljIHZvaWQgYnJfc3RwX3N0b3Aoc3RydWN0IG5ldF9icmlkZ2UgKmJyKQogewotCWludCByOwotCWNoYXIgKmFyZ3ZbXSA9IHsgQlJfU1RQX1BST0csIGJyLT5kZXYtPm5hbWUsICJzdG9wIiwgTlVMTCB9OwotCWNoYXIgKmVudnBbXSA9IHsgTlVMTCB9OwogCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnA7CisJaW50IGVycjsKIAogCWlmIChici0+c3RwX2VuYWJsZWQgPT0gQlJfVVNFUl9TVFApIHsKLQkJciA9IGNhbGxfdXNlcm1vZGVoZWxwZXIoQlJfU1RQX1BST0csIGFyZ3YsIGVudnAsIFVNSF9XQUlUX1BST0MpOwotCQlicl9pbmZvKGJyLCAidXNlcnNwYWNlIFNUUCBzdG9wcGVkLCByZXR1cm4gY29kZSAlZFxuIiwgcik7CisJCWVyciA9IGJyX3N0cF9jYWxsX3VzZXIoYnIsICJzdG9wIik7CisJCWlmIChlcnIpCisJCQlicl9lcnIoYnIsICJmYWlsZWQgdG8gc3RvcCB1c2Vyc3BhY2UgU1RQICglZClcbiIsIGVycik7CiAKIAkJLyogVG8gc3RhcnQgdGltZXJzIG9uIGFueSBwb3J0cyBsZWZ0IGluIGJsb2NraW5nICovCiAJCW1vZF90aW1lcigmYnItPmhlbGxvX3RpbWVyLCBqaWZmaWVzICsgYnItPmhlbGxvX3RpbWUpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9zd2l0Y2hkZXYuYyBiL25ldC9icmlkZ2UvYnJfc3dpdGNoZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQwOTdiOQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9icmlkZ2UvYnJfc3dpdGNoZGV2LmMKQEAgLTAsMCArMSw1NyBAQAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvc3dpdGNoZGV2Lmg+CisKKyNpbmNsdWRlICJicl9wcml2YXRlLmgiCisKK3N0YXRpYyBpbnQgYnJfc3dpdGNoZGV2X21hcmtfZ2V0KHN0cnVjdCBuZXRfYnJpZGdlICpiciwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwOworCisJLyogZGV2IGlzIHlldCB0byBiZSBhZGRlZCB0byB0aGUgcG9ydCBsaXN0LiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmJyLT5wb3J0X2xpc3QsIGxpc3QpIHsKKwkJaWYgKHN3aXRjaGRldl9wb3J0X3NhbWVfcGFyZW50X2lkKGRldiwgcC0+ZGV2KSkKKwkJCXJldHVybiBwLT5vZmZsb2FkX2Z3ZF9tYXJrOworCX0KKworCXJldHVybiArK2JyLT5vZmZsb2FkX2Z3ZF9tYXJrOworfQorCitpbnQgbmJwX3N3aXRjaGRldl9tYXJrX3NldChzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwKQoreworCXN0cnVjdCBzd2l0Y2hkZXZfYXR0ciBhdHRyID0geworCQkub3JpZ19kZXYgPSBwLT5kZXYsCisJCS5pZCA9IFNXSVRDSERFVl9BVFRSX0lEX1BPUlRfUEFSRU5UX0lELAorCX07CisJaW50IGVycjsKKworCUFTU0VSVF9SVE5MKCk7CisKKwllcnIgPSBzd2l0Y2hkZXZfcG9ydF9hdHRyX2dldChwLT5kZXYsICZhdHRyKTsKKwlpZiAoZXJyKSB7CisJCWlmIChlcnIgPT0gLUVPUE5PVFNVUFApCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlwLT5vZmZsb2FkX2Z3ZF9tYXJrID0gYnJfc3dpdGNoZGV2X21hcmtfZ2V0KHAtPmJyLCBwLT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbmJwX3N3aXRjaGRldl9mcmFtZV9tYXJrKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmIChza2ItPm9mZmxvYWRfZndkX21hcmsgJiYgIVdBUk5fT05fT05DRSghcC0+b2ZmbG9hZF9md2RfbWFyaykpCisJCUJSX0lOUFVUX1NLQl9DQihza2IpLT5vZmZsb2FkX2Z3ZF9tYXJrID0gcC0+b2ZmbG9hZF9md2RfbWFyazsKK30KKworYm9vbCBuYnBfc3dpdGNoZGV2X2FsbG93ZWRfZWdyZXNzKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsCisJCQkJICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAhc2tiLT5vZmZsb2FkX2Z3ZF9tYXJrIHx8CisJICAgICAgIEJSX0lOUFVUX1NLQl9DQihza2IpLT5vZmZsb2FkX2Z3ZF9tYXJrICE9IHAtPm9mZmxvYWRfZndkX21hcms7Cit9CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX3N5c2ZzX2lmLmMgYi9uZXQvYnJpZGdlL2JyX3N5c2ZzX2lmLmMKaW5kZXggMWUwNGQ0ZC4uZTY1NzI1OCAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9zeXNmc19pZi5jCisrKyBiL25ldC9icmlkZ2UvYnJfc3lzZnNfaWYuYwpAQCAtMTcxLDYgKzE3MSw3IEBACiBCUlBPUlRfQVRUUl9GTEFHKHVuaWNhc3RfZmxvb2QsIEJSX0ZMT09EKTsKIEJSUE9SVF9BVFRSX0ZMQUcocHJveHlhcnAsIEJSX1BST1hZQVJQKTsKIEJSUE9SVF9BVFRSX0ZMQUcocHJveHlhcnBfd2lmaSwgQlJfUFJPWFlBUlBfV0lGSSk7CitCUlBPUlRfQVRUUl9GTEFHKG11bHRpY2FzdF9mbG9vZCwgQlJfTUNBU1RfRkxPT0QpOwogCiAjaWZkZWYgQ09ORklHX0JSSURHRV9JR01QX1NOT09QSU5HCiBzdGF0aWMgc3NpemVfdCBzaG93X211bHRpY2FzdF9yb3V0ZXIoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgY2hhciAqYnVmKQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2xvZy5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2xvZy5jCmluZGV4IDE1MjMwMGQuLjlhMTEwODYgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9sb2cuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbG9nLmMKQEAgLTkxLDcgKzkxLDcgQEAKIAlpZiAobG9naW5mby0+dHlwZSA9PSBORl9MT0dfVFlQRV9MT0cpCiAJCWJpdG1hc2sgPSBsb2dpbmZvLT51LmxvZy5sb2dmbGFnczsKIAllbHNlCi0JCWJpdG1hc2sgPSBORl9MT0dfTUFTSzsKKwkJYml0bWFzayA9IE5GX0xPR19ERUZBVUxUX01BU0s7CiAKIAlpZiAoKGJpdG1hc2sgJiBFQlRfTE9HX0lQKSAmJiBldGhfaGRyKHNrYiktPmhfcHJvdG8gPT0KIAkgICBodG9ucyhFVEhfUF9JUCkpIHsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9yZWRpcmVjdC5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X3JlZGlyZWN0LmMKaW5kZXggMjAzOTY0OTkuLjJlN2M0ZjkgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9yZWRpcmVjdC5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9yZWRpcmVjdC5jCkBAIC0yNCw3ICsyNCw3IEBACiAJCXJldHVybiBFQlRfRFJPUDsKIAogCWlmIChwYXItPmhvb2tudW0gIT0gTkZfQlJfQlJPVVRJTkcpCi0JCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfc2xvdyAqLworCQkvKiByY3VfcmVhZF9sb2NrKCllZCBieSBuZl9ob29rX3RocmVzaCAqLwogCQlldGhlcl9hZGRyX2NvcHkoZXRoX2hkcihza2IpLT5oX2Rlc3QsCiAJCQkJYnJfcG9ydF9nZXRfcmN1KHBhci0+aW4pLT5ici0+ZGV2LT5kZXZfYWRkcik7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0YWJsZXMuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidGFibGVzLmMKaW5kZXggY2NlYWM1Yi4uZjVjMTFiYiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0YWJsZXMuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlcy5jCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAkJcmV0dXJuIDE7CiAJaWYgKE5GX0lOVkYoZSwgRUJUX0lPVVQsIGVidF9kZXZfY2hlY2soZS0+b3V0LCBvdXQpKSkKIAkJcmV0dXJuIDE7Ci0JLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va19zbG93ICovCisJLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va190aHJlc2ggKi8KIAlpZiAoaW4gJiYgKHAgPSBicl9wb3J0X2dldF9yY3UoaW4pKSAhPSBOVUxMICYmCiAJICAgIE5GX0lOVkYoZSwgRUJUX0lMT0dJQ0FMSU4sCiAJCSAgICBlYnRfZGV2X2NoZWNrKGUtPmxvZ2ljYWxfaW4sIHAtPmJyLT5kZXYpKSkKQEAgLTM2OCw2ICszNjgsOCBAQAogCiAJbWF0Y2ggPSB4dF9maW5kX21hdGNoKE5GUFJPVE9fQlJJREdFLCBtLT51Lm5hbWUsIDApOwogCWlmIChJU19FUlIobWF0Y2gpIHx8IG1hdGNoLT5mYW1pbHkgIT0gTkZQUk9UT19CUklER0UpIHsKKwkJaWYgKCFJU19FUlIobWF0Y2gpKQorCQkJbW9kdWxlX3B1dChtYXRjaC0+bWUpOwogCQlyZXF1ZXN0X21vZHVsZSgiZWJ0XyVzIiwgbS0+dS5uYW1lKTsKIAkJbWF0Y2ggPSB4dF9maW5kX21hdGNoKE5GUFJPVE9fQlJJREdFLCBtLT51Lm5hbWUsIDApOwogCX0KZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL25mX2xvZ19icmlkZ2UuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL25mX2xvZ19icmlkZ2UuYwppbmRleCA1ZDk5NTNhLi4xNjYzZGY1IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9uZl9sb2dfYnJpZGdlLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvbmZfbG9nX2JyaWRnZS5jCkBAIC01MCw4ICs1MCw3IEBACiAKIHN0YXRpYyBpbnQgX19uZXRfaW5pdCBuZl9sb2dfYnJpZGdlX25ldF9pbml0KHN0cnVjdCBuZXQgKm5ldCkKIHsKLQluZl9sb2dfc2V0KG5ldCwgTkZQUk9UT19CUklER0UsICZuZl9icmlkZ2VfbG9nZ2VyKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gbmZfbG9nX3NldChuZXQsIE5GUFJPVE9fQlJJREdFLCAmbmZfYnJpZGdlX2xvZ2dlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fbmV0X2V4aXQgbmZfbG9nX2JyaWRnZV9uZXRfZXhpdChzdHJ1Y3QgbmV0ICpuZXQpCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9uZl90YWJsZXNfYnJpZGdlLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9uZl90YWJsZXNfYnJpZGdlLmMKaW5kZXggYTc4YzRlMi4uOTdhZmRjMCAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvbmZfdGFibGVzX2JyaWRnZS5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL25mX3RhYmxlc19icmlkZ2UuYwpAQCAtMTMsNzkgKzEzLDExIEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl90YWJsZXNfYnJpZGdlLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl90YWJsZXNfaXB2NC5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2lwdjYuaD4KIAotaW50IG5mdF9icmlkZ2VfaXBoZHJfdmFsaWRhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgaXBoZHIgKmlwaDsKLQl1MzIgbGVuOwotCi0JaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpKQotCQlyZXR1cm4gMDsKLQotCWlwaCA9IGlwX2hkcihza2IpOwotCWlmIChpcGgtPmlobCA8IDUgfHwgaXBoLT52ZXJzaW9uICE9IDQpCi0JCXJldHVybiAwOwotCi0JbGVuID0gbnRvaHMoaXBoLT50b3RfbGVuKTsKLQlpZiAoc2tiLT5sZW4gPCBsZW4pCi0JCXJldHVybiAwOwotCWVsc2UgaWYgKGxlbiA8IChpcGgtPmlobCo0KSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBpcGgtPmlobCo0KSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gMTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKG5mdF9icmlkZ2VfaXBoZHJfdmFsaWRhdGUpOwotCi1pbnQgbmZ0X2JyaWRnZV9pcDZoZHJfdmFsaWRhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgaXB2NmhkciAqaGRyOwotCXUzMiBwa3RfbGVuOwotCi0JaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSkpCi0JCXJldHVybiAwOwotCi0JaGRyID0gaXB2Nl9oZHIoc2tiKTsKLQlpZiAoaGRyLT52ZXJzaW9uICE9IDYpCi0JCXJldHVybiAwOwotCi0JcGt0X2xlbiA9IG50b2hzKGhkci0+cGF5bG9hZF9sZW4pOwotCWlmIChwa3RfbGVuICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSA+IHNrYi0+bGVuKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAxOwotfQotRVhQT1JUX1NZTUJPTF9HUEwobmZ0X2JyaWRnZV9pcDZoZHJfdmFsaWRhdGUpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgbmZ0X2JyaWRnZV9zZXRfcGt0aW5mb19pcHY0KHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0LAotCQkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKLXsKLQlpZiAobmZ0X2JyaWRnZV9pcGhkcl92YWxpZGF0ZShza2IpKQotCQluZnRfc2V0X3BrdGluZm9faXB2NChwa3QsIHNrYiwgc3RhdGUpOwotCWVsc2UKLQkJbmZ0X3NldF9wa3RpbmZvKHBrdCwgc2tiLCBzdGF0ZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBuZnRfYnJpZGdlX3NldF9wa3RpbmZvX2lwdjYoc3RydWN0IG5mdF9wa3RpbmZvICpwa3QsCi0JCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkgICAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQotewotI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCi0JaWYgKG5mdF9icmlkZ2VfaXA2aGRyX3ZhbGlkYXRlKHNrYikgJiYKLQkgICAgbmZ0X3NldF9wa3RpbmZvX2lwdjYocGt0LCBza2IsIHN0YXRlKSA9PSAwKQotCQlyZXR1cm47Ci0jZW5kaWYKLQluZnRfc2V0X3BrdGluZm8ocGt0LCBza2IsIHN0YXRlKTsKLX0KLQogc3RhdGljIHVuc2lnbmVkIGludAogbmZ0X2RvX2NoYWluX2JyaWRnZSh2b2lkICpwcml2LAogCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTk1LDEzICsyNywxMyBAQAogCiAJc3dpdGNoIChldGhfaGRyKHNrYiktPmhfcHJvdG8pIHsKIAljYXNlIGh0b25zKEVUSF9QX0lQKToKLQkJbmZ0X2JyaWRnZV9zZXRfcGt0aW5mb19pcHY0KCZwa3QsIHNrYiwgc3RhdGUpOworCQluZnRfc2V0X3BrdGluZm9faXB2NF92YWxpZGF0ZSgmcGt0LCBza2IsIHN0YXRlKTsKIAkJYnJlYWs7CiAJY2FzZSBodG9ucyhFVEhfUF9JUFY2KToKLQkJbmZ0X2JyaWRnZV9zZXRfcGt0aW5mb19pcHY2KCZwa3QsIHNrYiwgc3RhdGUpOworCQluZnRfc2V0X3BrdGluZm9faXB2Nl92YWxpZGF0ZSgmcGt0LCBza2IsIHN0YXRlKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJbmZ0X3NldF9wa3RpbmZvKCZwa3QsIHNrYiwgc3RhdGUpOworCQluZnRfc2V0X3BrdGluZm9fdW5zcGVjKCZwa3QsIHNrYiwgc3RhdGUpOwogCQlicmVhazsKIAl9CiAKQEAgLTIwNywxMiArMTM5LDIwIEBACiAJaW50IHJldDsKIAogCW5mX3JlZ2lzdGVyX2FmaW5mbygmbmZfYnJfYWZpbmZvKTsKLQluZnRfcmVnaXN0ZXJfY2hhaW5fdHlwZSgmZmlsdGVyX2JyaWRnZSk7CisJcmV0ID0gbmZ0X3JlZ2lzdGVyX2NoYWluX3R5cGUoJmZpbHRlcl9icmlkZ2UpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjE7CisKIAlyZXQgPSByZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKCZuZl90YWJsZXNfYnJpZGdlX25ldF9vcHMpOwotCWlmIChyZXQgPCAwKSB7Ci0JCW5mdF91bnJlZ2lzdGVyX2NoYWluX3R5cGUoJmZpbHRlcl9icmlkZ2UpOwotCQluZl91bnJlZ2lzdGVyX2FmaW5mbygmbmZfYnJfYWZpbmZvKTsKLQl9CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyMjsKKworCXJldHVybiByZXQ7CisKK2VycjI6CisJbmZ0X3VucmVnaXN0ZXJfY2hhaW5fdHlwZSgmZmlsdGVyX2JyaWRnZSk7CitlcnIxOgorCW5mX3VucmVnaXN0ZXJfYWZpbmZvKCZuZl9icl9hZmluZm8pOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL25mdF9tZXRhX2JyaWRnZS5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvbmZ0X21ldGFfYnJpZGdlLmMKaW5kZXggNGI5MDFkOS4uYWQ0N2E5MiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvbmZ0X21ldGFfYnJpZGdlLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvbmZ0X21ldGFfYnJpZGdlLmMKQEAgLTg2LDYgKzg2LDcgQEAKIAkuaW5pdAkJPSBuZnRfbWV0YV9zZXRfaW5pdCwKIAkuZGVzdHJveQk9IG5mdF9tZXRhX3NldF9kZXN0cm95LAogCS5kdW1wCQk9IG5mdF9tZXRhX3NldF9kdW1wLAorCS52YWxpZGF0ZQk9IG5mdF9tZXRhX3NldF92YWxpZGF0ZSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHJfb3BzICoKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL25mdF9yZWplY3RfYnJpZGdlLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9uZnRfcmVqZWN0X2JyaWRnZS5jCmluZGV4IDBiNzdmZmIuLjRiM2RmNmIgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL25mdF9yZWplY3RfYnJpZGdlLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvbmZ0X3JlamVjdF9icmlkZ2UuYwpAQCAtMTQsNyArMTQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl90YWJsZXMuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX3RhYmxlcy5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZ0X3JlamVjdC5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2JyaWRnZS5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvaXB2NC9uZl9yZWplY3QuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL2lwdjYvbmZfcmVqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KQEAgLTM3LDYgKzM2LDMwIEBACiAJc2tiX3B1bGwobnNrYiwgRVRIX0hMRU4pOwogfQogCitzdGF0aWMgaW50IG5mdF9icmlkZ2VfaXBoZHJfdmFsaWRhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwl1MzIgbGVuOworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpKQorCQlyZXR1cm4gMDsKKworCWlwaCA9IGlwX2hkcihza2IpOworCWlmIChpcGgtPmlobCA8IDUgfHwgaXBoLT52ZXJzaW9uICE9IDQpCisJCXJldHVybiAwOworCisJbGVuID0gbnRvaHMoaXBoLT50b3RfbGVuKTsKKwlpZiAoc2tiLT5sZW4gPCBsZW4pCisJCXJldHVybiAwOworCWVsc2UgaWYgKGxlbiA8IChpcGgtPmlobCo0KSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBpcGgtPmlobCo0KSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKwogLyogV2UgY2Fubm90IHVzZSBvbGRza2ItPmRldiwgaXQgY2FuIGJlIGVpdGhlciBicmlkZ2UgZGV2aWNlIChORl9CUklER0UgSU5QVVQpCiAgKiBvciB0aGUgYnJpZGdlIHBvcnQgKE5GX0JSSURHRSBQUkVST1VUSU5HKS4KICAqLwpAQCAtMTQzLDYgKzE2NiwyNSBAQAogCWJyX2ZvcndhcmQoYnJfcG9ydF9nZXRfcmN1KGRldiksIG5za2IsIGZhbHNlLCB0cnVlKTsKIH0KIAorc3RhdGljIGludCBuZnRfYnJpZGdlX2lwNmhkcl92YWxpZGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcHY2aGRyICpoZHI7CisJdTMyIHBrdF9sZW47CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKSkKKwkJcmV0dXJuIDA7CisKKwloZHIgPSBpcHY2X2hkcihza2IpOworCWlmIChoZHItPnZlcnNpb24gIT0gNikKKwkJcmV0dXJuIDA7CisKKwlwa3RfbGVuID0gbnRvaHMoaGRyLT5wYXlsb2FkX2xlbik7CisJaWYgKHBrdF9sZW4gKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpID4gc2tiLT5sZW4pCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKIHN0YXRpYyB2b2lkIG5mdF9yZWplY3RfYnJfc2VuZF92Nl90Y3BfcmVzZXQoc3RydWN0IG5ldCAqbmV0LAogCQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKm9sZHNrYiwKIAkJCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9uZXQvY29yZS9kZXYuYyBiL25ldC9jb3JlL2Rldi5jCmluZGV4IDRjZTA3ZGMuLmYxZmUyNmYgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2Rldi5jCisrKyBiL25ldC9jb3JlL2Rldi5jCkBAIC0zMzU1LDE2ICszMzU1LDYgQEAKIAllbHNlCiAJCXNrYl9kc3RfZm9yY2Uoc2tiKTsKIAotI2lmZGVmIENPTkZJR19ORVRfU1dJVENIREVWCi0JLyogRG9uJ3QgZm9yd2FyZCBpZiBvZmZsb2FkIGRldmljZSBhbHJlYWR5IGZvcndhcmRlZCAqLwotCWlmIChza2ItPm9mZmxvYWRfZndkX21hcmsgJiYKLQkgICAgc2tiLT5vZmZsb2FkX2Z3ZF9tYXJrID09IGRldi0+b2ZmbG9hZF9md2RfbWFyaykgewotCQljb25zdW1lX3NrYihza2IpOwotCQlyYyA9IE5FVF9YTUlUX1NVQ0NFU1M7Ci0JCWdvdG8gb3V0OwotCX0KLSNlbmRpZgotCiAJdHhxID0gbmV0ZGV2X3BpY2tfdHgoZGV2LCBza2IsIGFjY2VsX3ByaXYpOwogCXEgPSByY3VfZGVyZWZlcmVuY2VfYmgodHhxLT5xZGlzYyk7CiAKQEAgLTM5MTQsOCArMzkwNCw3IEBACiAJfQogfQogCi0jaWYgKGRlZmluZWQoQ09ORklHX0JSSURHRSkgfHwgZGVmaW5lZChDT05GSUdfQlJJREdFX01PRFVMRSkpICYmIFwKLSAgICAoZGVmaW5lZChDT05GSUdfQVRNX0xBTkUpIHx8IGRlZmluZWQoQ09ORklHX0FUTV9MQU5FX01PRFVMRSkpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfQlJJREdFKSAmJiBJU19FTkFCTEVEKENPTkZJR19BVE1fTEFORSkKIC8qIFRoaXMgaG9vayBpcyBkZWZpbmVkIGhlcmUgZm9yIEFUTSBMQU5FICovCiBpbnQgKCpicl9mZGJfdGVzdF9hZGRyX2hvb2spKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgICAgIHVuc2lnbmVkIGNoYXIgKmFkZHIpIF9fcmVhZF9tb3N0bHk7CkBAIC0zOTc1LDYgKzM5NjQsMjIgQEAKIH0KIAogLyoqCisgKgluZXRkZXZfaXNfcnhfaGFuZGxlcl9idXN5IC0gY2hlY2sgaWYgcmVjZWl2ZSBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQKKyAqCUBkZXY6IGRldmljZSB0byBjaGVjaworICoKKyAqCUNoZWNrIGlmIGEgcmVjZWl2ZSBoYW5kbGVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3IgYSBnaXZlbiBkZXZpY2UuCisgKglSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBvbmUuCisgKgorICoJVGhlIGNhbGxlciBtdXN0IGhvbGQgdGhlIHJ0bmxfbXV0ZXguCisgKi8KK2Jvb2wgbmV0ZGV2X2lzX3J4X2hhbmRsZXJfYnVzeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCUFTU0VSVF9SVE5MKCk7CisJcmV0dXJuIGRldiAmJiBydG5sX2RlcmVmZXJlbmNlKGRldi0+cnhfaGFuZGxlcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZXRkZXZfaXNfcnhfaGFuZGxlcl9idXN5KTsKKworLyoqCiAgKgluZXRkZXZfcnhfaGFuZGxlcl9yZWdpc3RlciAtIHJlZ2lzdGVyIHJlY2VpdmUgaGFuZGxlcgogICoJQGRldjogZGV2aWNlIHRvIHJlZ2lzdGVyIGEgaGFuZGxlciBmb3IKICAqCUByeF9oYW5kbGVyOiByZWNlaXZlIGhhbmRsZXIgdG8gcmVnaXN0ZXIKQEAgLTQwNTAsMTIgKzQwNTUsMTcgQEAKIHsKICNpZmRlZiBDT05GSUdfTkVURklMVEVSX0lOR1JFU1MKIAlpZiAobmZfaG9va19pbmdyZXNzX2FjdGl2ZShza2IpKSB7CisJCWludCBpbmdyZXNzX3JldHZhbDsKKwogCQlpZiAoKnB0X3ByZXYpIHsKIAkJCSpyZXQgPSBkZWxpdmVyX3NrYihza2IsICpwdF9wcmV2LCBvcmlnX2Rldik7CiAJCQkqcHRfcHJldiA9IE5VTEw7CiAJCX0KIAotCQlyZXR1cm4gbmZfaG9va19pbmdyZXNzKHNrYik7CisJCXJjdV9yZWFkX2xvY2soKTsKKwkJaW5ncmVzc19yZXR2YWwgPSBuZl9ob29rX2luZ3Jlc3Moc2tiKTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybiBpbmdyZXNzX3JldHZhbDsKIAl9CiAjZW5kaWYgLyogQ09ORklHX05FVEZJTFRFUl9JTkdSRVNTICovCiAJcmV0dXJuIDA7CkBAIC00MjkyLDMyICs0MzAyLDUzIEBACiB9CiBFWFBPUlRfU1lNQk9MKG5ldGlmX3JlY2VpdmVfc2tiKTsKIAotLyogTmV0d29yayBkZXZpY2UgaXMgZ29pbmcgYXdheSwgZmx1c2ggYW55IHBhY2tldHMgc3RpbGwgcGVuZGluZwotICogQ2FsbGVkIHdpdGggaXJxcyBkaXNhYmxlZC4KLSAqLwotc3RhdGljIHZvaWQgZmx1c2hfYmFja2xvZyh2b2lkICphcmcpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFyZzsKLQlzdHJ1Y3Qgc29mdG5ldF9kYXRhICpzZCA9IHRoaXNfY3B1X3B0cigmc29mdG5ldF9kYXRhKTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqdG1wOworREVGSU5FX1BFUl9DUFUoc3RydWN0IHdvcmtfc3RydWN0LCBmbHVzaF93b3Jrcyk7CiAKKy8qIE5ldHdvcmsgZGV2aWNlIGlzIGdvaW5nIGF3YXksIGZsdXNoIGFueSBwYWNrZXRzIHN0aWxsIHBlbmRpbmcgKi8KK3N0YXRpYyB2b2lkIGZsdXNoX2JhY2tsb2coc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBza19idWZmICpza2IsICp0bXA7CisJc3RydWN0IHNvZnRuZXRfZGF0YSAqc2Q7CisKKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisJc2QgPSB0aGlzX2NwdV9wdHIoJnNvZnRuZXRfZGF0YSk7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCXJwc19sb2NrKHNkKTsKIAlza2JfcXVldWVfd2Fsa19zYWZlKCZzZC0+aW5wdXRfcGt0X3F1ZXVlLCBza2IsIHRtcCkgewotCQlpZiAoc2tiLT5kZXYgPT0gZGV2KSB7CisJCWlmIChza2ItPmRldi0+cmVnX3N0YXRlID09IE5FVFJFR19VTlJFR0lTVEVSSU5HKSB7CiAJCQlfX3NrYl91bmxpbmsoc2tiLCAmc2QtPmlucHV0X3BrdF9xdWV1ZSk7CiAJCQlrZnJlZV9za2Ioc2tiKTsKIAkJCWlucHV0X3F1ZXVlX2hlYWRfaW5jcihzZCk7CiAJCX0KIAl9CiAJcnBzX3VubG9jayhzZCk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOwogCiAJc2tiX3F1ZXVlX3dhbGtfc2FmZSgmc2QtPnByb2Nlc3NfcXVldWUsIHNrYiwgdG1wKSB7Ci0JCWlmIChza2ItPmRldiA9PSBkZXYpIHsKKwkJaWYgKHNrYi0+ZGV2LT5yZWdfc3RhdGUgPT0gTkVUUkVHX1VOUkVHSVNURVJJTkcpIHsKIAkJCV9fc2tiX3VubGluayhza2IsICZzZC0+cHJvY2Vzc19xdWV1ZSk7CiAJCQlrZnJlZV9za2Ioc2tiKTsKIAkJCWlucHV0X3F1ZXVlX2hlYWRfaW5jcihzZCk7CiAJCX0KIAl9CisJbG9jYWxfYmhfZW5hYmxlKCk7Cit9CisKK3N0YXRpYyB2b2lkIGZsdXNoX2FsbF9iYWNrbG9ncyh2b2lkKQoreworCXVuc2lnbmVkIGludCBjcHU7CisKKwlnZXRfb25saW5lX2NwdXMoKTsKKworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQorCQlxdWV1ZV93b3JrX29uKGNwdSwgc3lzdGVtX2hpZ2hwcmlfd3EsCisJCQkgICAgICBwZXJfY3B1X3B0cigmZmx1c2hfd29ya3MsIGNwdSkpOworCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCisJCWZsdXNoX3dvcmsocGVyX2NwdV9wdHIoJmZsdXNoX3dvcmtzLCBjcHUpKTsKKworCXB1dF9vbmxpbmVfY3B1cygpOwogfQogCiBzdGF0aWMgaW50IG5hcGlfZ3JvX2NvbXBsZXRlKHN0cnVjdCBza19idWZmICpza2IpCkBAIC00ODA1LDggKzQ4MzYsOSBAQAogCiBzdGF0aWMgaW50IHByb2Nlc3NfYmFja2xvZyhzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBxdW90YSkKIHsKLQlpbnQgd29yayA9IDA7CiAJc3RydWN0IHNvZnRuZXRfZGF0YSAqc2QgPSBjb250YWluZXJfb2YobmFwaSwgc3RydWN0IHNvZnRuZXRfZGF0YSwgYmFja2xvZyk7CisJYm9vbCBhZ2FpbiA9IHRydWU7CisJaW50IHdvcmsgPSAwOwogCiAJLyogQ2hlY2sgaWYgd2UgaGF2ZSBwZW5kaW5nIGlwaSwgaXRzIGJldHRlciB0byBzZW5kIHRoZW0gbm93LAogCSAqIG5vdCB3YWl0aW5nIG5ldF9yeF9hY3Rpb24oKSBlbmQuCkBAIC00ODE3LDIzICs0ODQ5LDIwIEBACiAJfQogCiAJbmFwaS0+d2VpZ2h0ID0gd2VpZ2h0X3A7Ci0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQl3aGlsZSAoMSkgeworCXdoaWxlIChhZ2FpbikgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZSgmc2QtPnByb2Nlc3NfcXVldWUpKSkgewogCQkJcmN1X3JlYWRfbG9jaygpOwotCQkJbG9jYWxfaXJxX2VuYWJsZSgpOwogCQkJX19uZXRpZl9yZWNlaXZlX3NrYihza2IpOwogCQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCQkJaW5wdXRfcXVldWVfaGVhZF9pbmNyKHNkKTsKLQkJCWlmICgrK3dvcmsgPj0gcXVvdGEpIHsKLQkJCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCQlpZiAoKyt3b3JrID49IHF1b3RhKQogCQkJCXJldHVybiB3b3JrOwotCQkJfQorCiAJCX0KIAorCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCQlycHNfbG9jayhzZCk7CiAJCWlmIChza2JfcXVldWVfZW1wdHkoJnNkLT5pbnB1dF9wa3RfcXVldWUpKSB7CiAJCQkvKgpAQCAtNDg0NSwxNiArNDg3NCwxNCBAQAogCQkJICogYW5kIHdlIGRvbnQgbmVlZCBhbiBzbXBfbWIoKSBtZW1vcnkgYmFycmllci4KIAkJCSAqLwogCQkJbmFwaS0+c3RhdGUgPSAwOwotCQkJcnBzX3VubG9jayhzZCk7Ci0KLQkJCWJyZWFrOworCQkJYWdhaW4gPSBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJCXNrYl9xdWV1ZV9zcGxpY2VfdGFpbF9pbml0KCZzZC0+aW5wdXRfcGt0X3F1ZXVlLAorCQkJCQkJICAgJnNkLT5wcm9jZXNzX3F1ZXVlKTsKIAkJfQotCi0JCXNrYl9xdWV1ZV9zcGxpY2VfdGFpbF9pbml0KCZzZC0+aW5wdXRfcGt0X3F1ZXVlLAotCQkJCQkgICAmc2QtPnByb2Nlc3NfcXVldWUpOwogCQlycHNfdW5sb2NrKHNkKTsKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOwogCX0KLQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKIAlyZXR1cm4gd29yazsKIH0KQEAgLTU1NjIsNiArNTU4OSw3IEBACiAKIHN0YXRpYyBpbnQgX19uZXRkZXZfYWRqYWNlbnRfZGV2X2luc2VydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqYWRqX2RldiwKKwkJCQkJdTE2IHJlZl9uciwKIAkJCQkJc3RydWN0IGxpc3RfaGVhZCAqZGV2X2xpc3QsCiAJCQkJCXZvaWQgKnByaXZhdGUsIGJvb2wgbWFzdGVyKQogewpAQCAtNTU3MSw3ICs1NTk5LDcgQEAKIAlhZGogPSBfX25ldGRldl9maW5kX2FkaihhZGpfZGV2LCBkZXZfbGlzdCk7CiAKIAlpZiAoYWRqKSB7Ci0JCWFkai0+cmVmX25yKys7CisJCWFkai0+cmVmX25yICs9IHJlZl9ucjsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC01NTgxLDcgKzU2MDksNyBAQAogCiAJYWRqLT5kZXYgPSBhZGpfZGV2OwogCWFkai0+bWFzdGVyID0gbWFzdGVyOwotCWFkai0+cmVmX25yID0gMTsKKwlhZGotPnJlZl9uciA9IHJlZl9ucjsKIAlhZGotPnByaXZhdGUgPSBwcml2YXRlOwogCWRldl9ob2xkKGFkal9kZXYpOwogCkBAIC01NjIwLDYgKzU2NDgsNyBAQAogCiBzdGF0aWMgdm9pZCBfX25ldGRldl9hZGphY2VudF9kZXZfcmVtb3ZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqYWRqX2RldiwKKwkJCQkJIHUxNiByZWZfbnIsCiAJCQkJCSBzdHJ1Y3QgbGlzdF9oZWFkICpkZXZfbGlzdCkKIHsKIAlzdHJ1Y3QgbmV0ZGV2X2FkamFjZW50ICphZGo7CkBAIC01NjMyLDEwICs1NjYxLDEwIEBACiAJCUJVRygpOwogCX0KIAotCWlmIChhZGotPnJlZl9uciA+IDEpIHsKLQkJcHJfZGVidWcoIiVzIHRvICVzIHJlZl9uci0tID0gJWRcbiIsIGRldi0+bmFtZSwgYWRqX2Rldi0+bmFtZSwKLQkJCSBhZGotPnJlZl9uci0xKTsKLQkJYWRqLT5yZWZfbnItLTsKKwlpZiAoYWRqLT5yZWZfbnIgPiByZWZfbnIpIHsKKwkJcHJfZGVidWcoIiVzIHRvICVzIHJlZl9uci0lZCA9ICVkXG4iLCBkZXYtPm5hbWUsIGFkal9kZXYtPm5hbWUsCisJCQkgcmVmX25yLCBhZGotPnJlZl9uci1yZWZfbnIpOworCQlhZGotPnJlZl9uciAtPSByZWZfbnI7CiAJCXJldHVybjsKIAl9CiAKQEAgLTU2NTQsMjEgKzU2ODMsMjIgQEAKIAogc3RhdGljIGludCBfX25ldGRldl9hZGphY2VudF9kZXZfbGlua19saXN0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKnVwcGVyX2RldiwKKwkJCQkJICAgIHUxNiByZWZfbnIsCiAJCQkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICp1cF9saXN0LAogCQkJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqZG93bl9saXN0LAogCQkJCQkgICAgdm9pZCAqcHJpdmF0ZSwgYm9vbCBtYXN0ZXIpCiB7CiAJaW50IHJldDsKIAotCXJldCA9IF9fbmV0ZGV2X2FkamFjZW50X2Rldl9pbnNlcnQoZGV2LCB1cHBlcl9kZXYsIHVwX2xpc3QsIHByaXZhdGUsCi0JCQkJCSAgIG1hc3Rlcik7CisJcmV0ID0gX19uZXRkZXZfYWRqYWNlbnRfZGV2X2luc2VydChkZXYsIHVwcGVyX2RldiwgcmVmX25yLCB1cF9saXN0LAorCQkJCQkgICBwcml2YXRlLCBtYXN0ZXIpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBfX25ldGRldl9hZGphY2VudF9kZXZfaW5zZXJ0KHVwcGVyX2RldiwgZGV2LCBkb3duX2xpc3QsIHByaXZhdGUsCi0JCQkJCSAgIGZhbHNlKTsKKwlyZXQgPSBfX25ldGRldl9hZGphY2VudF9kZXZfaW5zZXJ0KHVwcGVyX2RldiwgZGV2LCByZWZfbnIsIGRvd25fbGlzdCwKKwkJCQkJICAgcHJpdmF0ZSwgZmFsc2UpOwogCWlmIChyZXQpIHsKLQkJX19uZXRkZXZfYWRqYWNlbnRfZGV2X3JlbW92ZShkZXYsIHVwcGVyX2RldiwgdXBfbGlzdCk7CisJCV9fbmV0ZGV2X2FkamFjZW50X2Rldl9yZW1vdmUoZGV2LCB1cHBlcl9kZXYsIHJlZl9uciwgdXBfbGlzdCk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC01Njc2LDkgKzU3MDYsMTAgQEAKIH0KIAogc3RhdGljIGludCBfX25ldGRldl9hZGphY2VudF9kZXZfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICp1cHBlcl9kZXYpCisJCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKnVwcGVyX2RldiwKKwkJCQkgICAgICB1MTYgcmVmX25yKQogewotCXJldHVybiBfX25ldGRldl9hZGphY2VudF9kZXZfbGlua19saXN0cyhkZXYsIHVwcGVyX2RldiwKKwlyZXR1cm4gX19uZXRkZXZfYWRqYWNlbnRfZGV2X2xpbmtfbGlzdHMoZGV2LCB1cHBlcl9kZXYsIHJlZl9uciwKIAkJCQkJCSZkZXYtPmFsbF9hZGpfbGlzdC51cHBlciwKIAkJCQkJCSZ1cHBlcl9kZXYtPmFsbF9hZGpfbGlzdC5sb3dlciwKIAkJCQkJCU5VTEwsIGZhbHNlKTsKQEAgLTU2ODYsMTcgKzU3MTcsMTkgQEAKIAogc3RhdGljIHZvaWQgX19uZXRkZXZfYWRqYWNlbnRfZGV2X3VubGlua19saXN0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKnVwcGVyX2RldiwKKwkJCQkJICAgICAgIHUxNiByZWZfbnIsCiAJCQkJCSAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICp1cF9saXN0LAogCQkJCQkgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqZG93bl9saXN0KQogewotCV9fbmV0ZGV2X2FkamFjZW50X2Rldl9yZW1vdmUoZGV2LCB1cHBlcl9kZXYsIHVwX2xpc3QpOwotCV9fbmV0ZGV2X2FkamFjZW50X2Rldl9yZW1vdmUodXBwZXJfZGV2LCBkZXYsIGRvd25fbGlzdCk7CisJX19uZXRkZXZfYWRqYWNlbnRfZGV2X3JlbW92ZShkZXYsIHVwcGVyX2RldiwgcmVmX25yLCB1cF9saXN0KTsKKwlfX25ldGRldl9hZGphY2VudF9kZXZfcmVtb3ZlKHVwcGVyX2RldiwgZGV2LCByZWZfbnIsIGRvd25fbGlzdCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fbmV0ZGV2X2FkamFjZW50X2Rldl91bmxpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICp1cHBlcl9kZXYpCisJCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqdXBwZXJfZGV2LAorCQkJCQkgdTE2IHJlZl9ucikKIHsKLQlfX25ldGRldl9hZGphY2VudF9kZXZfdW5saW5rX2xpc3RzKGRldiwgdXBwZXJfZGV2LAorCV9fbmV0ZGV2X2FkamFjZW50X2Rldl91bmxpbmtfbGlzdHMoZGV2LCB1cHBlcl9kZXYsIHJlZl9uciwKIAkJCQkJICAgJmRldi0+YWxsX2Fkal9saXN0LnVwcGVyLAogCQkJCQkgICAmdXBwZXJfZGV2LT5hbGxfYWRqX2xpc3QubG93ZXIpOwogfQpAQCAtNTcwNSwxNyArNTczOCwxNyBAQAogCQkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKnVwcGVyX2RldiwKIAkJCQkJCXZvaWQgKnByaXZhdGUsIGJvb2wgbWFzdGVyKQogewotCWludCByZXQgPSBfX25ldGRldl9hZGphY2VudF9kZXZfbGluayhkZXYsIHVwcGVyX2Rldik7CisJaW50IHJldCA9IF9fbmV0ZGV2X2FkamFjZW50X2Rldl9saW5rKGRldiwgdXBwZXJfZGV2LCAxKTsKIAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBfX25ldGRldl9hZGphY2VudF9kZXZfbGlua19saXN0cyhkZXYsIHVwcGVyX2RldiwKKwlyZXQgPSBfX25ldGRldl9hZGphY2VudF9kZXZfbGlua19saXN0cyhkZXYsIHVwcGVyX2RldiwgMSwKIAkJCQkJICAgICAgICZkZXYtPmFkal9saXN0LnVwcGVyLAogCQkJCQkgICAgICAgJnVwcGVyX2Rldi0+YWRqX2xpc3QubG93ZXIsCiAJCQkJCSAgICAgICBwcml2YXRlLCBtYXN0ZXIpOwogCWlmIChyZXQpIHsKLQkJX19uZXRkZXZfYWRqYWNlbnRfZGV2X3VubGluayhkZXYsIHVwcGVyX2Rldik7CisJCV9fbmV0ZGV2X2FkamFjZW50X2Rldl91bmxpbmsoZGV2LCB1cHBlcl9kZXYsIDEpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtNTcyNSw4ICs1NzU4LDggQEAKIHN0YXRpYyB2b2lkIF9fbmV0ZGV2X2FkamFjZW50X2Rldl91bmxpbmtfbmVpZ2hib3VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqdXBwZXJfZGV2KQogewotCV9fbmV0ZGV2X2FkamFjZW50X2Rldl91bmxpbmsoZGV2LCB1cHBlcl9kZXYpOwotCV9fbmV0ZGV2X2FkamFjZW50X2Rldl91bmxpbmtfbGlzdHMoZGV2LCB1cHBlcl9kZXYsCisJX19uZXRkZXZfYWRqYWNlbnRfZGV2X3VubGluayhkZXYsIHVwcGVyX2RldiwgMSk7CisJX19uZXRkZXZfYWRqYWNlbnRfZGV2X3VubGlua19saXN0cyhkZXYsIHVwcGVyX2RldiwgMSwKIAkJCQkJICAgJmRldi0+YWRqX2xpc3QudXBwZXIsCiAJCQkJCSAgICZ1cHBlcl9kZXYtPmFkal9saXN0Lmxvd2VyKTsKIH0KQEAgLTU3NzksNyArNTgxMiw3IEBACiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoaiwgJnVwcGVyX2Rldi0+YWxsX2Fkal9saXN0LnVwcGVyLCBsaXN0KSB7CiAJCQlwcl9kZWJ1ZygiSW50ZXJsaW5raW5nICVzIHdpdGggJXMsIG5vbi1uZWlnaGJvdXJcbiIsCiAJCQkJIGktPmRldi0+bmFtZSwgai0+ZGV2LT5uYW1lKTsKLQkJCXJldCA9IF9fbmV0ZGV2X2FkamFjZW50X2Rldl9saW5rKGktPmRldiwgai0+ZGV2KTsKKwkJCXJldCA9IF9fbmV0ZGV2X2FkamFjZW50X2Rldl9saW5rKGktPmRldiwgai0+ZGV2LCBpLT5yZWZfbnIpOwogCQkJaWYgKHJldCkKIAkJCQlnb3RvIHJvbGxiYWNrX21lc2g7CiAJCX0KQEAgLTU3ODksNyArNTgyMiw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShpLCAmdXBwZXJfZGV2LT5hbGxfYWRqX2xpc3QudXBwZXIsIGxpc3QpIHsKIAkJcHJfZGVidWcoImxpbmtpbmcgJXMncyB1cHBlciBkZXZpY2UgJXMgd2l0aCAlc1xuIiwKIAkJCSB1cHBlcl9kZXYtPm5hbWUsIGktPmRldi0+bmFtZSwgZGV2LT5uYW1lKTsKLQkJcmV0ID0gX19uZXRkZXZfYWRqYWNlbnRfZGV2X2xpbmsoZGV2LCBpLT5kZXYpOworCQlyZXQgPSBfX25ldGRldl9hZGphY2VudF9kZXZfbGluayhkZXYsIGktPmRldiwgaS0+cmVmX25yKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gcm9sbGJhY2tfdXBwZXJfbWVzaDsKIAl9CkBAIC01Nzk4LDcgKzU4MzEsNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoaSwgJmRldi0+YWxsX2Fkal9saXN0Lmxvd2VyLCBsaXN0KSB7CiAJCXByX2RlYnVnKCJsaW5raW5nICVzJ3MgbG93ZXIgZGV2aWNlICVzIHdpdGggJXNcbiIsIGRldi0+bmFtZSwKIAkJCSBpLT5kZXYtPm5hbWUsIHVwcGVyX2Rldi0+bmFtZSk7Ci0JCXJldCA9IF9fbmV0ZGV2X2FkamFjZW50X2Rldl9saW5rKGktPmRldiwgdXBwZXJfZGV2KTsKKwkJcmV0ID0gX19uZXRkZXZfYWRqYWNlbnRfZGV2X2xpbmsoaS0+ZGV2LCB1cHBlcl9kZXYsIGktPnJlZl9ucik7CiAJCWlmIChyZXQpCiAJCQlnb3RvIHJvbGxiYWNrX2xvd2VyX21lc2g7CiAJfQpAQCAtNTgxNiw3ICs1ODQ5LDcgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksICZkZXYtPmFsbF9hZGpfbGlzdC5sb3dlciwgbGlzdCkgewogCQlpZiAoaSA9PSB0b19pKQogCQkJYnJlYWs7Ci0JCV9fbmV0ZGV2X2FkamFjZW50X2Rldl91bmxpbmsoaS0+ZGV2LCB1cHBlcl9kZXYpOworCQlfX25ldGRldl9hZGphY2VudF9kZXZfdW5saW5rKGktPmRldiwgdXBwZXJfZGV2LCBpLT5yZWZfbnIpOwogCX0KIAogCWkgPSBOVUxMOwpAQCAtNTgyNiw3ICs1ODU5LDcgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksICZ1cHBlcl9kZXYtPmFsbF9hZGpfbGlzdC51cHBlciwgbGlzdCkgewogCQlpZiAoaSA9PSB0b19pKQogCQkJYnJlYWs7Ci0JCV9fbmV0ZGV2X2FkamFjZW50X2Rldl91bmxpbmsoZGV2LCBpLT5kZXYpOworCQlfX25ldGRldl9hZGphY2VudF9kZXZfdW5saW5rKGRldiwgaS0+ZGV2LCBpLT5yZWZfbnIpOwogCX0KIAogCWkgPSBqID0gTlVMTDsKQEAgLTU4MzgsNyArNTg3MSw3IEBACiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoaiwgJnVwcGVyX2Rldi0+YWxsX2Fkal9saXN0LnVwcGVyLCBsaXN0KSB7CiAJCQlpZiAoaSA9PSB0b19pICYmIGogPT0gdG9faikKIAkJCQlicmVhazsKLQkJCV9fbmV0ZGV2X2FkamFjZW50X2Rldl91bmxpbmsoaS0+ZGV2LCBqLT5kZXYpOworCQkJX19uZXRkZXZfYWRqYWNlbnRfZGV2X3VubGluayhpLT5kZXYsIGotPmRldiwgaS0+cmVmX25yKTsKIAkJfQogCQlpZiAoaSA9PSB0b19pKQogCQkJYnJlYWs7CkBAIC01OTE4LDE2ICs1OTUxLDE2IEBACiAJICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShpLCAmZGV2LT5hbGxfYWRqX2xpc3QubG93ZXIsIGxpc3QpCiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoaiwgJnVwcGVyX2Rldi0+YWxsX2Fkal9saXN0LnVwcGVyLCBsaXN0KQotCQkJX19uZXRkZXZfYWRqYWNlbnRfZGV2X3VubGluayhpLT5kZXYsIGotPmRldik7CisJCQlfX25ldGRldl9hZGphY2VudF9kZXZfdW5saW5rKGktPmRldiwgai0+ZGV2LCBpLT5yZWZfbnIpOwogCiAJLyogcmVtb3ZlIGFsc28gdGhlIGRldmljZXMgaXRzZWxmIGZyb20gbG93ZXIvdXBwZXIgZGV2aWNlCiAJICogbGlzdAogCSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoaSwgJmRldi0+YWxsX2Fkal9saXN0Lmxvd2VyLCBsaXN0KQotCQlfX25ldGRldl9hZGphY2VudF9kZXZfdW5saW5rKGktPmRldiwgdXBwZXJfZGV2KTsKKwkJX19uZXRkZXZfYWRqYWNlbnRfZGV2X3VubGluayhpLT5kZXYsIHVwcGVyX2RldiwgaS0+cmVmX25yKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoaSwgJnVwcGVyX2Rldi0+YWxsX2Fkal9saXN0LnVwcGVyLCBsaXN0KQotCQlfX25ldGRldl9hZGphY2VudF9kZXZfdW5saW5rKGRldiwgaS0+ZGV2KTsKKwkJX19uZXRkZXZfYWRqYWNlbnRfZGV2X3VubGluayhkZXYsIGktPmRldiwgaS0+cmVmX25yKTsKIAogCWNhbGxfbmV0ZGV2aWNlX25vdGlmaWVyc19pbmZvKE5FVERFVl9DSEFOR0VVUFBFUiwgZGV2LAogCQkJCSAgICAgICZjaGFuZ2V1cHBlcl9pbmZvLmluZm8pOwpAQCAtNjA0NSw4ICs2MDc4LDcgQEAKIEVYUE9SVF9TWU1CT0wobmV0ZGV2X2xvd2VyX2Rldl9nZXRfcHJpdmF0ZSk7CiAKIAotaW50IGRldl9nZXRfbmVzdF9sZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkgICAgICAgYm9vbCAoKnR5cGVfY2hlY2spKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpKQoraW50IGRldl9nZXRfbmVzdF9sZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpsb3dlciA9IE5VTEw7CiAJc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKQEAgLTYwNTYsMTUgKzYwODgsMTIgQEAKIAlBU1NFUlRfUlROTCgpOwogCiAJbmV0ZGV2X2Zvcl9lYWNoX2xvd2VyX2RldihkZXYsIGxvd2VyLCBpdGVyKSB7Ci0JCW5lc3QgPSBkZXZfZ2V0X25lc3RfbGV2ZWwobG93ZXIsIHR5cGVfY2hlY2spOworCQluZXN0ID0gZGV2X2dldF9uZXN0X2xldmVsKGxvd2VyKTsKIAkJaWYgKG1heF9uZXN0IDwgbmVzdCkKIAkJCW1heF9uZXN0ID0gbmVzdDsKIAl9CiAKLQlpZiAodHlwZV9jaGVjayhkZXYpKQotCQltYXhfbmVzdCsrOwotCi0JcmV0dXJuIG1heF9uZXN0OworCXJldHVybiBtYXhfbmVzdCArIDE7CiB9CiBFWFBPUlRfU1lNQk9MKGRldl9nZXRfbmVzdF9sZXZlbCk7CiAKQEAgLTY3MTEsOCArNjc0MCw4IEBACiAJCXVubGlzdF9uZXRkZXZpY2UoZGV2KTsKIAogCQlkZXYtPnJlZ19zdGF0ZSA9IE5FVFJFR19VTlJFR0lTVEVSSU5HOwotCQlvbl9lYWNoX2NwdShmbHVzaF9iYWNrbG9nLCBkZXYsIDEpOwogCX0KKwlmbHVzaF9hbGxfYmFja2xvZ3MoKTsKIAogCXN5bmNocm9uaXplX25ldCgpOwogCkBAIC03NjI5LDYgKzc2NTgsOSBAQAogCUlOSVRfTElTVF9IRUFEKCZkZXYtPmFsbF9hZGpfbGlzdC5sb3dlcik7CiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+cHR5cGVfYWxsKTsKIAlJTklUX0xJU1RfSEVBRCgmZGV2LT5wdHlwZV9zcGVjaWZpYyk7CisjaWZkZWYgQ09ORklHX05FVF9TQ0hFRAorCWhhc2hfaW5pdChkZXYtPnFkaXNjX2hhc2gpOworI2VuZGlmCiAJZGV2LT5wcml2X2ZsYWdzID0gSUZGX1hNSVRfRFNUX1JFTEVBU0UgfCBJRkZfWE1JVF9EU1RfUkVMRUFTRV9QRVJNOwogCXNldHVwKGRldik7CiAKQEAgLTgyNzQsOCArODMwNiwxMSBAQAogCSAqLwogCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKKwkJc3RydWN0IHdvcmtfc3RydWN0ICpmbHVzaCA9IHBlcl9jcHVfcHRyKCZmbHVzaF93b3JrcywgaSk7CiAJCXN0cnVjdCBzb2Z0bmV0X2RhdGEgKnNkID0gJnBlcl9jcHUoc29mdG5ldF9kYXRhLCBpKTsKIAorCQlJTklUX1dPUksoZmx1c2gsIGZsdXNoX2JhY2tsb2cpOworCiAJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnNkLT5pbnB1dF9wa3RfcXVldWUpOwogCQlza2JfcXVldWVfaGVhZF9pbml0KCZzZC0+cHJvY2Vzc19xdWV1ZSk7CiAJCUlOSVRfTElTVF9IRUFEKCZzZC0+cG9sbF9saXN0KTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2Ryb3BfbW9uaXRvci5jIGIvbmV0L2NvcmUvZHJvcF9tb25pdG9yLmMKaW5kZXggZDZiM2I1Ny4uNzJjZmIwYyAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZHJvcF9tb25pdG9yLmMKKysrIGIvbmV0L2NvcmUvZHJvcF9tb25pdG9yLmMKQEAgLTEwNSw3ICsxMDUsNyBAQAogCXJldHVybiBza2I7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ2VubF9tdWx0aWNhc3RfZ3JvdXAgZHJvcG1vbl9tY2dycHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ2VubF9tdWx0aWNhc3RfZ3JvdXAgZHJvcG1vbl9tY2dycHNbXSA9IHsKIAl7IC5uYW1lID0gImV2ZW50cyIsIH0sCiB9OwogCmRpZmYgLS1naXQgYS9uZXQvY29yZS9maWx0ZXIuYyBiL25ldC9jb3JlL2ZpbHRlci5jCmluZGV4IDU3MDg5OTkuLjAwMzUxY2QgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2ZpbHRlci5jCisrKyBiL25ldC9jb3JlL2ZpbHRlci5jCkBAIC05NCwxNCArOTQsMTMgQEAKIH0KIEVYUE9SVF9TWU1CT0woc2tfZmlsdGVyX3RyaW1fY2FwKTsKIAotc3RhdGljIHU2NCBfX3NrYl9nZXRfcGF5X29mZnNldCh1NjQgY3R4LCB1NjQgYSwgdTY0IHgsIHU2NCByNCwgdTY0IHI1KQorQlBGX0NBTExfMShfX3NrYl9nZXRfcGF5X29mZnNldCwgc3RydWN0IHNrX2J1ZmYgKiwgc2tiKQogewotCXJldHVybiBza2JfZ2V0X3BvZmYoKHN0cnVjdCBza19idWZmICopKHVuc2lnbmVkIGxvbmcpIGN0eCk7CisJcmV0dXJuIHNrYl9nZXRfcG9mZihza2IpOwogfQogCi1zdGF0aWMgdTY0IF9fc2tiX2dldF9ubGF0dHIodTY0IGN0eCwgdTY0IGEsIHU2NCB4LCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzMoX19za2JfZ2V0X25sYXR0ciwgc3RydWN0IHNrX2J1ZmYgKiwgc2tiLCB1MzIsIGEsIHUzMiwgeCkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopKHVuc2lnbmVkIGxvbmcpIGN0eDsKIAlzdHJ1Y3QgbmxhdHRyICpubGE7CiAKIAlpZiAoc2tiX2lzX25vbmxpbmVhcihza2IpKQpAQCAtMTIwLDkgKzExOSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1NjQgX19za2JfZ2V0X25sYXR0cl9uZXN0KHU2NCBjdHgsIHU2NCBhLCB1NjQgeCwgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8zKF9fc2tiX2dldF9ubGF0dHJfbmVzdCwgc3RydWN0IHNrX2J1ZmYgKiwgc2tiLCB1MzIsIGEsIHUzMiwgeCkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopKHVuc2lnbmVkIGxvbmcpIGN0eDsKIAlzdHJ1Y3QgbmxhdHRyICpubGE7CiAKIAlpZiAoc2tiX2lzX25vbmxpbmVhcihza2IpKQpAQCAtMTQ1LDcgKzE0Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1NjQgX19nZXRfcmF3X2NwdV9pZCh1NjQgY3R4LCB1NjQgYSwgdTY0IHgsIHU2NCByNCwgdTY0IHI1KQorQlBGX0NBTExfMChfX2dldF9yYXdfY3B1X2lkKQogewogCXJldHVybiByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOwogfQpAQCAtMjMzLDkgKzIzMSw4IEBACiAJY2FzZSBTS0ZfQURfT0ZGICsgU0tGX0FEX0hBVFlQRToKIAkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3QgbmV0X2RldmljZSwgaWZpbmRleCkgIT0gNCk7CiAJCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IG5ldF9kZXZpY2UsIHR5cGUpICE9IDIpOwotCQlCVUlMRF9CVUdfT04oYnl0ZXNfdG9fYnBmX3NpemUoRklFTERfU0laRU9GKHN0cnVjdCBza19idWZmLCBkZXYpKSA8IDApOwogCi0JCSppbnNuKysgPSBCUEZfTERYX01FTShieXRlc190b19icGZfc2l6ZShGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIGRldikpLAorCQkqaW5zbisrID0gQlBGX0xEWF9NRU0oQlBGX0ZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwgZGV2KSwKIAkJCQkgICAgICBCUEZfUkVHX1RNUCwgQlBGX1JFR19DVFgsCiAJCQkJICAgICAgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIGRldikpOwogCQkvKiBpZiAodG1wICE9IDApIGdvdG8gcGMgKyAxICovCkBAIC0xMzUwLDYxICsxMzQ3LDU4IEBACiAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgYnBmX3NjcmF0Y2hwYWQsIGJwZl9zcCk7CiAKK3N0YXRpYyBpbmxpbmUgaW50IF9fYnBmX3RyeV9tYWtlX3dyaXRhYmxlKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgdW5zaWduZWQgaW50IHdyaXRlX2xlbikKK3sKKwlyZXR1cm4gc2tiX2Vuc3VyZV93cml0YWJsZShza2IsIHdyaXRlX2xlbik7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGJwZl90cnlfbWFrZV93cml0YWJsZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQl1bnNpZ25lZCBpbnQgd3JpdGVfbGVuKQogewotCWludCBlcnI7CisJaW50IGVyciA9IF9fYnBmX3RyeV9tYWtlX3dyaXRhYmxlKHNrYiwgd3JpdGVfbGVuKTsKIAotCWlmICghc2tiX2Nsb25lZChza2IpKQotCQlyZXR1cm4gMDsKLQlpZiAoc2tiX2Nsb25lX3dyaXRhYmxlKHNrYiwgd3JpdGVfbGVuKSkKLQkJcmV0dXJuIDA7Ci0JZXJyID0gcHNrYl9leHBhbmRfaGVhZChza2IsIDAsIDAsIEdGUF9BVE9NSUMpOwotCWlmICghZXJyKQotCQlicGZfY29tcHV0ZV9kYXRhX2VuZChza2IpOworCWJwZl9jb21wdXRlX2RhdGFfZW5kKHNrYik7CiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHU2NCBicGZfc2tiX3N0b3JlX2J5dGVzKHU2NCByMSwgdTY0IHIyLCB1NjQgcjMsIHU2NCByNCwgdTY0IGZsYWdzKQorc3RhdGljIGludCBicGZfdHJ5X21ha2VfaGVhZF93cml0YWJsZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBicGZfc2NyYXRjaHBhZCAqc3AgPSB0aGlzX2NwdV9wdHIoJmJwZl9zcCk7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSAobG9uZykgcjE7Ci0JaW50IG9mZnNldCA9IChpbnQpIHIyOwotCXZvaWQgKmZyb20gPSAodm9pZCAqKSAobG9uZykgcjM7Ci0JdW5zaWduZWQgaW50IGxlbiA9ICh1bnNpZ25lZCBpbnQpIHI0OworCXJldHVybiBicGZfdHJ5X21ha2Vfd3JpdGFibGUoc2tiLCBza2JfaGVhZGxlbihza2IpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJwZl9wdXNoX21hY19yY3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmIChza2JfYXRfdGNfaW5ncmVzcyhza2IpKQorCQlza2JfcG9zdHB1c2hfcmNzdW0oc2tiLCBza2JfbWFjX2hlYWRlcihza2IpLCBza2ItPm1hY19sZW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYnBmX3B1bGxfbWFjX3Jjc3VtKHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKHNrYl9hdF90Y19pbmdyZXNzKHNrYikpCisJCXNrYl9wb3N0cHVsbF9yY3N1bShza2IsIHNrYl9tYWNfaGVhZGVyKHNrYiksIHNrYi0+bWFjX2xlbik7Cit9CisKK0JQRl9DQUxMXzUoYnBmX3NrYl9zdG9yZV9ieXRlcywgc3RydWN0IHNrX2J1ZmYgKiwgc2tiLCB1MzIsIG9mZnNldCwKKwkgICBjb25zdCB2b2lkICosIGZyb20sIHUzMiwgbGVuLCB1NjQsIGZsYWdzKQorewogCXZvaWQgKnB0cjsKIAogCWlmICh1bmxpa2VseShmbGFncyAmIH4oQlBGX0ZfUkVDT01QVVRFX0NTVU0gfCBCUEZfRl9JTlZBTElEQVRFX0hBU0gpKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBicGYgdmVyaWZpZXIgZ3VhcmFudGVlcyB0aGF0OgotCSAqICdmcm9tJyBwb2ludGVyIHBvaW50cyB0byBicGYgcHJvZ3JhbSBzdGFjawotCSAqICdsZW4nIGJ5dGVzIG9mIGl0IHdlcmUgaW5pdGlhbGl6ZWQKLQkgKiAnbGVuJyA+IDAKLQkgKiAnc2tiJyBpcyBhIHZhbGlkIHBvaW50ZXIgdG8gJ3N0cnVjdCBza19idWZmJwotCSAqCi0JICogc28gY2hlY2sgZm9yIGludmFsaWQgJ29mZnNldCcgYW5kIHRvbyBsYXJnZSAnbGVuJwotCSAqLwotCWlmICh1bmxpa2VseSgodTMyKSBvZmZzZXQgPiAweGZmZmYgfHwgbGVuID4gc2l6ZW9mKHNwLT5idWZmKSkpCisJaWYgKHVubGlrZWx5KG9mZnNldCA+IDB4ZmZmZikpCiAJCXJldHVybiAtRUZBVUxUOwogCWlmICh1bmxpa2VseShicGZfdHJ5X21ha2Vfd3JpdGFibGUoc2tiLCBvZmZzZXQgKyBsZW4pKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlwdHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvZmZzZXQsIGxlbiwgc3AtPmJ1ZmYpOwotCWlmICh1bmxpa2VseSghcHRyKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KKwlwdHIgPSBza2ItPmRhdGEgKyBvZmZzZXQ7CiAJaWYgKGZsYWdzICYgQlBGX0ZfUkVDT01QVVRFX0NTVU0pCi0JCXNrYl9wb3N0cHVsbF9yY3N1bShza2IsIHB0ciwgbGVuKTsKKwkJX19za2JfcG9zdHB1bGxfcmNzdW0oc2tiLCBwdHIsIGxlbiwgb2Zmc2V0KTsKIAogCW1lbWNweShwdHIsIGZyb20sIGxlbik7CiAKLQlpZiAocHRyID09IHNwLT5idWZmKQotCQkvKiBza2Jfc3RvcmVfYml0cyBjYW5ub3QgcmV0dXJuIC1FRkFVTFQgaGVyZSAqLwotCQlza2Jfc3RvcmVfYml0cyhza2IsIG9mZnNldCwgcHRyLCBsZW4pOwotCiAJaWYgKGZsYWdzICYgQlBGX0ZfUkVDT01QVVRFX0NTVU0pCi0JCXNrYl9wb3N0cHVzaF9yY3N1bShza2IsIHB0ciwgbGVuKTsKKwkJX19za2JfcG9zdHB1c2hfcmNzdW0oc2tiLCBwdHIsIGxlbiwgb2Zmc2V0KTsKIAlpZiAoZmxhZ3MgJiBCUEZfRl9JTlZBTElEQVRFX0hBU0gpCiAJCXNrYl9jbGVhcl9oYXNoKHNrYik7CiAKQEAgLTE0MjIsMTUgKzE0MTYsMTIgQEAKIAkuYXJnNV90eXBlCT0gQVJHX0FOWVRISU5HLAogfTsKIAotc3RhdGljIHU2NCBicGZfc2tiX2xvYWRfYnl0ZXModTY0IHIxLCB1NjQgcjIsIHU2NCByMywgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF80KGJwZl9za2JfbG9hZF9ieXRlcywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKiwgc2tiLCB1MzIsIG9mZnNldCwKKwkgICB2b2lkICosIHRvLCB1MzIsIGxlbikKIHsKLQljb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKGNvbnN0IHN0cnVjdCBza19idWZmICopKHVuc2lnbmVkIGxvbmcpIHIxOwotCWludCBvZmZzZXQgPSAoaW50KSByMjsKLQl2b2lkICp0byA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpIHIzOwotCXVuc2lnbmVkIGludCBsZW4gPSAodW5zaWduZWQgaW50KSByNDsKIAl2b2lkICpwdHI7CiAKLQlpZiAodW5saWtlbHkoKHUzMikgb2Zmc2V0ID4gMHhmZmZmKSkKKwlpZiAodW5saWtlbHkob2Zmc2V0ID4gMHhmZmZmKSkKIAkJZ290byBlcnJfY2xlYXI7CiAKIAlwdHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvZmZzZXQsIGxlbiwgdG8pOwpAQCAtMTQ1NSwyMyArMTQ0Niw0MSBAQAogCS5hcmc0X3R5cGUJPSBBUkdfQ09OU1RfU1RBQ0tfU0laRSwKIH07CiAKLXN0YXRpYyB1NjQgYnBmX2wzX2NzdW1fcmVwbGFjZSh1NjQgcjEsIHU2NCByMiwgdTY0IGZyb20sIHU2NCB0bywgdTY0IGZsYWdzKQorQlBGX0NBTExfMihicGZfc2tiX3B1bGxfZGF0YSwgc3RydWN0IHNrX2J1ZmYgKiwgc2tiLCB1MzIsIGxlbikKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopIChsb25nKSByMTsKLQlpbnQgb2Zmc2V0ID0gKGludCkgcjI7Ci0JX19zdW0xNiBzdW0sICpwdHI7CisJLyogSWRlYSBpcyB0aGUgZm9sbG93aW5nOiBzaG91bGQgdGhlIG5lZWRlZCBkaXJlY3QgcmVhZC93cml0ZQorCSAqIHRlc3QgZmFpbCBkdXJpbmcgcnVudGltZSwgd2UgY2FuIHB1bGwgaW4gbW9yZSBkYXRhIGFuZCByZWRvCisJICogYWdhaW4sIHNpbmNlIGltcGxpY2l0bHksIHdlIGludmFsaWRhdGUgcHJldmlvdXMgY2hlY2tzIGhlcmUuCisJICoKKwkgKiBPciwgc2luY2Ugd2Uga25vdyBob3cgbXVjaCB3ZSBuZWVkIHRvIG1ha2UgcmVhZC93cml0ZWFibGUsCisJICogdGhpcyBjYW4gYmUgZG9uZSBvbmNlIGF0IHRoZSBwcm9ncmFtIGJlZ2lubmluZyBmb3IgZGlyZWN0CisJICogYWNjZXNzIGNhc2UuIEJ5IHRoaXMgd2Ugb3ZlcmNvbWUgbGltaXRhdGlvbnMgb2Ygb25seSBjdXJyZW50CisJICogaGVhZHJvb20gYmVpbmcgYWNjZXNzaWJsZS4KKwkgKi8KKwlyZXR1cm4gYnBmX3RyeV9tYWtlX3dyaXRhYmxlKHNrYiwgbGVuID8gOiBza2JfaGVhZGxlbihza2IpKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfc2tiX3B1bGxfZGF0YV9wcm90byA9IHsKKwkuZnVuYwkJPSBicGZfc2tiX3B1bGxfZGF0YSwKKwkuZ3BsX29ubHkJPSBmYWxzZSwKKwkucmV0X3R5cGUJPSBSRVRfSU5URUdFUiwKKwkuYXJnMV90eXBlCT0gQVJHX1BUUl9UT19DVFgsCisJLmFyZzJfdHlwZQk9IEFSR19BTllUSElORywKK307CisKK0JQRl9DQUxMXzUoYnBmX2wzX2NzdW1fcmVwbGFjZSwgc3RydWN0IHNrX2J1ZmYgKiwgc2tiLCB1MzIsIG9mZnNldCwKKwkgICB1NjQsIGZyb20sIHU2NCwgdG8sIHU2NCwgZmxhZ3MpCit7CisJX19zdW0xNiAqcHRyOwogCiAJaWYgKHVubGlrZWx5KGZsYWdzICYgfihCUEZfRl9IRFJfRklFTERfTUFTSykpKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAodW5saWtlbHkoKHUzMikgb2Zmc2V0ID4gMHhmZmZmKSkKKwlpZiAodW5saWtlbHkob2Zmc2V0ID4gMHhmZmZmIHx8IG9mZnNldCAmIDEpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAodW5saWtlbHkoYnBmX3RyeV9tYWtlX3dyaXRhYmxlKHNrYiwgb2Zmc2V0ICsgc2l6ZW9mKHN1bSkpKSkKKwlpZiAodW5saWtlbHkoYnBmX3RyeV9tYWtlX3dyaXRhYmxlKHNrYiwgb2Zmc2V0ICsgc2l6ZW9mKCpwdHIpKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb2Zmc2V0LCBzaXplb2Yoc3VtKSwgJnN1bSk7Ci0JaWYgKHVubGlrZWx5KCFwdHIpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQorCXB0ciA9IChfX3N1bTE2ICopKHNrYi0+ZGF0YSArIG9mZnNldCk7CiAJc3dpdGNoIChmbGFncyAmIEJQRl9GX0hEUl9GSUVMRF9NQVNLKSB7CiAJY2FzZSAwOgogCQlpZiAodW5saWtlbHkoZnJvbSAhPSAwKSkKQEAgLTE0ODksMTAgKzE0OTgsNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAocHRyID09ICZzdW0pCi0JCS8qIHNrYl9zdG9yZV9iaXRzIGd1YXJhbnRlZWQgdG8gbm90IHJldHVybiAtRUZBVUxUIGhlcmUgKi8KLQkJc2tiX3N0b3JlX2JpdHMoc2tiLCBvZmZzZXQsIHB0ciwgc2l6ZW9mKHN1bSkpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE1MDcsMjUgKzE1MTIsMjIgQEAKIAkuYXJnNV90eXBlCT0gQVJHX0FOWVRISU5HLAogfTsKIAotc3RhdGljIHU2NCBicGZfbDRfY3N1bV9yZXBsYWNlKHU2NCByMSwgdTY0IHIyLCB1NjQgZnJvbSwgdTY0IHRvLCB1NjQgZmxhZ3MpCitCUEZfQ0FMTF81KGJwZl9sNF9jc3VtX3JlcGxhY2UsIHN0cnVjdCBza19idWZmICosIHNrYiwgdTMyLCBvZmZzZXQsCisJICAgdTY0LCBmcm9tLCB1NjQsIHRvLCB1NjQsIGZsYWdzKQogewotCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikgKGxvbmcpIHIxOwogCWJvb2wgaXNfcHNldWRvID0gZmxhZ3MgJiBCUEZfRl9QU0VVRE9fSERSOwogCWJvb2wgaXNfbW16ZXJvID0gZmxhZ3MgJiBCUEZfRl9NQVJLX01BTkdMRURfMDsKLQlpbnQgb2Zmc2V0ID0gKGludCkgcjI7Ci0JX19zdW0xNiBzdW0sICpwdHI7CisJX19zdW0xNiAqcHRyOwogCiAJaWYgKHVubGlrZWx5KGZsYWdzICYgfihCUEZfRl9NQVJLX01BTkdMRURfMCB8IEJQRl9GX1BTRVVET19IRFIgfAogCQkJICAgICAgIEJQRl9GX0hEUl9GSUVMRF9NQVNLKSkpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmICh1bmxpa2VseSgodTMyKSBvZmZzZXQgPiAweGZmZmYpKQorCWlmICh1bmxpa2VseShvZmZzZXQgPiAweGZmZmYgfHwgb2Zmc2V0ICYgMSkpCiAJCXJldHVybiAtRUZBVUxUOwotCWlmICh1bmxpa2VseShicGZfdHJ5X21ha2Vfd3JpdGFibGUoc2tiLCBvZmZzZXQgKyBzaXplb2Yoc3VtKSkpKQorCWlmICh1bmxpa2VseShicGZfdHJ5X21ha2Vfd3JpdGFibGUoc2tiLCBvZmZzZXQgKyBzaXplb2YoKnB0cikpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlwdHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvZmZzZXQsIHNpemVvZihzdW0pLCAmc3VtKTsKLQlpZiAodW5saWtlbHkoIXB0cikpCi0JCXJldHVybiAtRUZBVUxUOworCXB0ciA9IChfX3N1bTE2ICopKHNrYi0+ZGF0YSArIG9mZnNldCk7CiAJaWYgKGlzX21temVybyAmJiAhKnB0cikKIAkJcmV0dXJuIDA7CiAKQEAgLTE1NDgsMTAgKzE1NTAsNiBAQAogCiAJaWYgKGlzX21temVybyAmJiAhKnB0cikKIAkJKnB0ciA9IENTVU1fTUFOR0xFRF8wOwotCWlmIChwdHIgPT0gJnN1bSkKLQkJLyogc2tiX3N0b3JlX2JpdHMgZ3VhcmFudGVlZCB0byBub3QgcmV0dXJuIC1FRkFVTFQgaGVyZSAqLwotCQlza2Jfc3RvcmVfYml0cyhza2IsIG9mZnNldCwgcHRyLCBzaXplb2Yoc3VtKSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU2NiwxMiArMTU2NCwxMSBAQAogCS5hcmc1X3R5cGUJPSBBUkdfQU5ZVEhJTkcsCiB9OwogCi1zdGF0aWMgdTY0IGJwZl9jc3VtX2RpZmYodTY0IHIxLCB1NjQgZnJvbV9zaXplLCB1NjQgcjMsIHU2NCB0b19zaXplLCB1NjQgc2VlZCkKK0JQRl9DQUxMXzUoYnBmX2NzdW1fZGlmZiwgX19iZTMyICosIGZyb20sIHUzMiwgZnJvbV9zaXplLAorCSAgIF9fYmUzMiAqLCB0bywgdTMyLCB0b19zaXplLCBfX3dzdW0sIHNlZWQpCiB7CiAJc3RydWN0IGJwZl9zY3JhdGNocGFkICpzcCA9IHRoaXNfY3B1X3B0cigmYnBmX3NwKTsKLQl1NjQgZGlmZl9zaXplID0gZnJvbV9zaXplICsgdG9fc2l6ZTsKLQlfX2JlMzIgKmZyb20gPSAoX19iZTMyICopIChsb25nKSByMTsKLQlfX2JlMzIgKnRvICAgPSAoX19iZTMyICopIChsb25nKSByMzsKKwl1MzIgZGlmZl9zaXplID0gZnJvbV9zaXplICsgdG9fc2l6ZTsKIAlpbnQgaSwgaiA9IDA7CiAKIAkvKiBUaGlzIGlzIHF1aXRlIGZsZXhpYmxlLCBzb21lIGV4YW1wbGVzOgpAQCAtMTU5Nyw2ICsxNTk0LDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX2NzdW1fZGlmZl9wcm90byA9IHsKIAkuZnVuYwkJPSBicGZfY3N1bV9kaWZmLAogCS5ncGxfb25seQk9IGZhbHNlLAorCS5wa3RfYWNjZXNzCT0gdHJ1ZSwKIAkucmV0X3R5cGUJPSBSRVRfSU5URUdFUiwKIAkuYXJnMV90eXBlCT0gQVJHX1BUUl9UT19TVEFDSywKIAkuYXJnMl90eXBlCT0gQVJHX0NPTlNUX1NUQUNLX1NJWkVfT1JfWkVSTywKQEAgLTE2MDUsMTEgKzE2MDMsMjggQEAKIAkuYXJnNV90eXBlCT0gQVJHX0FOWVRISU5HLAogfTsKIAorQlBGX0NBTExfMihicGZfY3N1bV91cGRhdGUsIHN0cnVjdCBza19idWZmICosIHNrYiwgX193c3VtLCBjc3VtKQoreworCS8qIFRoZSBpbnRlcmZhY2UgaXMgdG8gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIGJwZl9jc3VtX2RpZmYoKQorCSAqIGZvciBkaXJlY3QgcGFja2V0IHdyaXRlcy4gY3N1bSByb3RhdGlvbiBmb3IgYWxpZ25tZW50IGFzIHdlbGwKKwkgKiBhcyBlbXVsYXRpbmcgY3N1bV9zdWIoKSBjYW4gYmUgZG9uZSBmcm9tIHRoZSBlQlBGIHByb2dyYW0uCisJICovCisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQorCQlyZXR1cm4gKHNrYi0+Y3N1bSA9IGNzdW1fYWRkKHNrYi0+Y3N1bSwgY3N1bSkpOworCisJcmV0dXJuIC1FTk9UU1VQUDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfY3N1bV91cGRhdGVfcHJvdG8gPSB7CisJLmZ1bmMJCT0gYnBmX2NzdW1fdXBkYXRlLAorCS5ncGxfb25seQk9IGZhbHNlLAorCS5yZXRfdHlwZQk9IFJFVF9JTlRFR0VSLAorCS5hcmcxX3R5cGUJPSBBUkdfUFRSX1RPX0NUWCwKKwkuYXJnMl90eXBlCT0gQVJHX0FOWVRISU5HLAorfTsKKwogc3RhdGljIGlubGluZSBpbnQgX19icGZfcnhfc2tiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaWYgKHNrYl9hdF90Y19pbmdyZXNzKHNrYikpCi0JCXNrYl9wb3N0cHVzaF9yY3N1bShza2IsIHNrYl9tYWNfaGVhZGVyKHNrYiksIHNrYi0+bWFjX2xlbik7Ci0KIAlyZXR1cm4gZGV2X2ZvcndhcmRfc2tiKGRldiwgc2tiKTsKIH0KIApAQCAtMTYzMiwxMCArMTY0NywxMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB1NjQgYnBmX2Nsb25lX3JlZGlyZWN0KHU2NCByMSwgdTY0IGlmaW5kZXgsIHU2NCBmbGFncywgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8zKGJwZl9jbG9uZV9yZWRpcmVjdCwgc3RydWN0IHNrX2J1ZmYgKiwgc2tiLCB1MzIsIGlmaW5kZXgsIHU2NCwgZmxhZ3MpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSAobG9uZykgcjE7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqY2xvbmU7CisJaW50IHJldDsKIAogCWlmICh1bmxpa2VseShmbGFncyAmIH4oQlBGX0ZfSU5HUkVTUykpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE2NDQsMTIgKzE2NjAsMjUgQEAKIAlpZiAodW5saWtlbHkoIWRldikpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jc2tiID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7Ci0JaWYgKHVubGlrZWx5KCFza2IpKQorCWNsb25lID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJaWYgKHVubGlrZWx5KCFjbG9uZSkpCiAJCXJldHVybiAtRU5PTUVNOwogCisJLyogRm9yIGRpcmVjdCB3cml0ZSwgd2UgbmVlZCB0byBrZWVwIHRoZSBpbnZhcmlhbnQgdGhhdCB0aGUgc2ticworCSAqIHdlJ3JlIGRlYWxpbmcgd2l0aCBuZWVkIHRvIGJlIHVuY2xvbmVkLiBTaG91bGQgdW5jbG9uaW5nIGZhaWwKKwkgKiBoZXJlLCB3ZSBuZWVkIHRvIGZyZWUgdGhlIGp1c3QgZ2VuZXJhdGVkIGNsb25lIHRvIHVuY2xvbmUgb25jZQorCSAqIGFnYWluLgorCSAqLworCXJldCA9IGJwZl90cnlfbWFrZV9oZWFkX3dyaXRhYmxlKHNrYik7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJa2ZyZWVfc2tiKGNsb25lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYnBmX3B1c2hfbWFjX3Jjc3VtKGNsb25lKTsKKwogCXJldHVybiBmbGFncyAmIEJQRl9GX0lOR1JFU1MgPwotCSAgICAgICBfX2JwZl9yeF9za2IoZGV2LCBza2IpIDogX19icGZfdHhfc2tiKGRldiwgc2tiKTsKKwkgICAgICAgX19icGZfcnhfc2tiKGRldiwgY2xvbmUpIDogX19icGZfdHhfc2tiKGRldiwgY2xvbmUpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9jbG9uZV9yZWRpcmVjdF9wcm90byA9IHsKQEAgLTE2NjgsNyArMTY5Nyw3IEBACiAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcmVkaXJlY3RfaW5mbywgcmVkaXJlY3RfaW5mbyk7CiAKLXN0YXRpYyB1NjQgYnBmX3JlZGlyZWN0KHU2NCBpZmluZGV4LCB1NjQgZmxhZ3MsIHU2NCByMywgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8yKGJwZl9yZWRpcmVjdCwgdTMyLCBpZmluZGV4LCB1NjQsIGZsYWdzKQogewogCXN0cnVjdCByZWRpcmVjdF9pbmZvICpyaSA9IHRoaXNfY3B1X3B0cigmcmVkaXJlY3RfaW5mbyk7CiAKQEAgLTE2OTMsNiArMTcyMiw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWJwZl9wdXNoX21hY19yY3N1bShza2IpOworCiAJcmV0dXJuIHJpLT5mbGFncyAmIEJQRl9GX0lOR1JFU1MgPwogCSAgICAgICBfX2JwZl9yeF9za2IoZGV2LCBza2IpIDogX19icGZfdHhfc2tiKGRldiwgc2tiKTsKIH0KQEAgLTE3MDUsOSArMTczNiw5IEBACiAJLmFyZzJfdHlwZSAgICAgID0gQVJHX0FOWVRISU5HLAogfTsKIAotc3RhdGljIHU2NCBicGZfZ2V0X2Nncm91cF9jbGFzc2lkKHU2NCByMSwgdTY0IHIyLCB1NjQgcjMsIHU2NCByNCwgdTY0IHI1KQorQlBGX0NBTExfMShicGZfZ2V0X2Nncm91cF9jbGFzc2lkLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqLCBza2IpCiB7Ci0JcmV0dXJuIHRhc2tfZ2V0X2NsYXNzaWQoKHN0cnVjdCBza19idWZmICopICh1bnNpZ25lZCBsb25nKSByMSk7CisJcmV0dXJuIHRhc2tfZ2V0X2NsYXNzaWQoc2tiKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfZ2V0X2Nncm91cF9jbGFzc2lkX3Byb3RvID0gewpAQCAtMTcxNyw5ICsxNzQ4LDkgQEAKIAkuYXJnMV90eXBlICAgICAgPSBBUkdfUFRSX1RPX0NUWCwKIH07CiAKLXN0YXRpYyB1NjQgYnBmX2dldF9yb3V0ZV9yZWFsbSh1NjQgcjEsIHU2NCByMiwgdTY0IHIzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzEoYnBmX2dldF9yb3V0ZV9yZWFsbSwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKiwgc2tiKQogewotCXJldHVybiBkc3RfdGNsYXNzaWQoKHN0cnVjdCBza19idWZmICopICh1bnNpZ25lZCBsb25nKSByMSk7CisJcmV0dXJuIGRzdF90Y2xhc3NpZChza2IpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9nZXRfcm91dGVfcmVhbG1fcHJvdG8gPSB7CkBAIC0xNzI5LDE0ICsxNzYwLDE0IEBACiAJLmFyZzFfdHlwZSAgICAgID0gQVJHX1BUUl9UT19DVFgsCiB9OwogCi1zdGF0aWMgdTY0IGJwZl9nZXRfaGFzaF9yZWNhbGModTY0IHIxLCB1NjQgcjIsIHU2NCByMywgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8xKGJwZl9nZXRfaGFzaF9yZWNhbGMsIHN0cnVjdCBza19idWZmICosIHNrYikKIHsKIAkvKiBJZiBza2JfY2xlYXJfaGFzaCgpIHdhcyBjYWxsZWQgZHVlIHRvIG1hbmdsaW5nLCB3ZSBjYW4KIAkgKiB0cmlnZ2VyIFNXIHJlY2FsY3VsYXRpb24gaGVyZS4gTGF0ZXIgYWNjZXNzIHRvIGhhc2gKIAkgKiBjYW4gdGhlbiB1c2UgdGhlIGlubGluZSBza2ItPmhhc2ggdmlhIGNvbnRleHQgZGlyZWN0bHkKIAkgKiBpbnN0ZWFkIG9mIGNhbGxpbmcgdGhpcyBoZWxwZXIgYWdhaW4uCiAJICovCi0JcmV0dXJuIHNrYl9nZXRfaGFzaCgoc3RydWN0IHNrX2J1ZmYgKikgKHVuc2lnbmVkIGxvbmcpIHIxKTsKKwlyZXR1cm4gc2tiX2dldF9oYXNoKHNrYik7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX2dldF9oYXNoX3JlY2FsY19wcm90byA9IHsKQEAgLTE3NDYsMTcgKzE3NzcsMzUgQEAKIAkuYXJnMV90eXBlCT0gQVJHX1BUUl9UT19DVFgsCiB9OwogCi1zdGF0aWMgdTY0IGJwZl9za2Jfdmxhbl9wdXNoKHU2NCByMSwgdTY0IHIyLCB1NjQgdmxhbl90Y2ksIHU2NCByNCwgdTY0IHI1KQorQlBGX0NBTExfMShicGZfc2V0X2hhc2hfaW52YWxpZCwgc3RydWN0IHNrX2J1ZmYgKiwgc2tiKQogewotCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikgKGxvbmcpIHIxOwotCV9fYmUxNiB2bGFuX3Byb3RvID0gKF9fZm9yY2UgX19iZTE2KSByMjsKKwkvKiBBZnRlciBhbGwgZGlyZWN0IHBhY2tldCB3cml0ZSwgdGhpcyBjYW4gYmUgdXNlZCBvbmNlIGZvcgorCSAqIHRyaWdnZXJpbmcgYSBsYXp5IHJlY2FsYyBvbiBuZXh0IHNrYl9nZXRfaGFzaCgpIGludm9jYXRpb24uCisJICovCisJc2tiX2NsZWFyX2hhc2goc2tiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfc2V0X2hhc2hfaW52YWxpZF9wcm90byA9IHsKKwkuZnVuYwkJPSBicGZfc2V0X2hhc2hfaW52YWxpZCwKKwkuZ3BsX29ubHkJPSBmYWxzZSwKKwkucmV0X3R5cGUJPSBSRVRfSU5URUdFUiwKKwkuYXJnMV90eXBlCT0gQVJHX1BUUl9UT19DVFgsCit9OworCitCUEZfQ0FMTF8zKGJwZl9za2Jfdmxhbl9wdXNoLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBza2IsIF9fYmUxNiwgdmxhbl9wcm90bywKKwkgICB1MTYsIHZsYW5fdGNpKQorewogCWludCByZXQ7CiAKIAlpZiAodW5saWtlbHkodmxhbl9wcm90byAhPSBodG9ucyhFVEhfUF84MDIxUSkgJiYKIAkJICAgICB2bGFuX3Byb3RvICE9IGh0b25zKEVUSF9QXzgwMjFBRCkpKQogCQl2bGFuX3Byb3RvID0gaHRvbnMoRVRIX1BfODAyMVEpOwogCisJYnBmX3B1c2hfbWFjX3Jjc3VtKHNrYik7CiAJcmV0ID0gc2tiX3ZsYW5fcHVzaChza2IsIHZsYW5fcHJvdG8sIHZsYW5fdGNpKTsKKwlicGZfcHVsbF9tYWNfcmNzdW0oc2tiKTsKKwogCWJwZl9jb21wdXRlX2RhdGFfZW5kKHNrYik7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE3NzEsMTIgKzE4MjAsMTQgQEAKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChicGZfc2tiX3ZsYW5fcHVzaF9wcm90byk7CiAKLXN0YXRpYyB1NjQgYnBmX3NrYl92bGFuX3BvcCh1NjQgcjEsIHU2NCByMiwgdTY0IHIzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzEoYnBmX3NrYl92bGFuX3BvcCwgc3RydWN0IHNrX2J1ZmYgKiwgc2tiKQogewotCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikgKGxvbmcpIHIxOwogCWludCByZXQ7CiAKKwlicGZfcHVzaF9tYWNfcmNzdW0oc2tiKTsKIAlyZXQgPSBza2Jfdmxhbl9wb3Aoc2tiKTsKKwlicGZfcHVsbF9tYWNfcmNzdW0oc2tiKTsKKwogCWJwZl9jb21wdXRlX2RhdGFfZW5kKHNrYik7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE5NDUsMTAgKzE5OTYsOSBAQAogCXJldHVybiAtRU5PVFNVUFA7CiB9CiAKLXN0YXRpYyB1NjQgYnBmX3NrYl9jaGFuZ2VfcHJvdG8odTY0IHIxLCB1NjQgcjIsIHU2NCBmbGFncywgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8zKGJwZl9za2JfY2hhbmdlX3Byb3RvLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBza2IsIF9fYmUxNiwgcHJvdG8sCisJICAgdTY0LCBmbGFncykKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopIChsb25nKSByMTsKLQlfX2JlMTYgcHJvdG8gPSAoX19mb3JjZSBfX2JlMTYpIHIyOwogCWludCByZXQ7CiAKIAlpZiAodW5saWtlbHkoZmxhZ3MpKQpAQCAtMTk4NSwxNCArMjAzNSwxMSBAQAogCS5hcmczX3R5cGUJPSBBUkdfQU5ZVEhJTkcsCiB9OwogCi1zdGF0aWMgdTY0IGJwZl9za2JfY2hhbmdlX3R5cGUodTY0IHIxLCB1NjQgcjIsIHU2NCByMywgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8yKGJwZl9za2JfY2hhbmdlX3R5cGUsIHN0cnVjdCBza19idWZmICosIHNrYiwgdTMyLCBwa3RfdHlwZSkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopIChsb25nKSByMTsKLQl1MzIgcGt0X3R5cGUgPSByMjsKLQogCS8qIFdlIG9ubHkgYWxsb3cgYSByZXN0cmljdGVkIHN1YnNldCB0byBiZSBjaGFuZ2VkIGZvciBub3cuICovCi0JaWYgKHVubGlrZWx5KHNrYi0+cGt0X3R5cGUgPiBQQUNLRVRfT1RIRVJIT1NUIHx8Ci0JCSAgICAgcGt0X3R5cGUgPiBQQUNLRVRfT1RIRVJIT1NUKSkKKwlpZiAodW5saWtlbHkoIXNrYl9wa3RfdHlwZV9vayhza2ItPnBrdF90eXBlKSB8fAorCQkgICAgICFza2JfcGt0X3R5cGVfb2socGt0X3R5cGUpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlza2ItPnBrdF90eXBlID0gcGt0X3R5cGU7CkBAIC0yMDA3LDE5ICsyMDU0LDEwMCBAQAogCS5hcmcyX3R5cGUJPSBBUkdfQU5ZVEhJTkcsCiB9OwogCitzdGF0aWMgdTMyIF9fYnBmX3NrYl9taW5fbGVuKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTMyIG1pbl9sZW4gPSBza2JfbmV0d29ya19vZmZzZXQoc2tiKTsKKworCWlmIChza2JfdHJhbnNwb3J0X2hlYWRlcl93YXNfc2V0KHNrYikpCisJCW1pbl9sZW4gPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpOworCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKQorCQltaW5fbGVuID0gc2tiX2NoZWNrc3VtX3N0YXJ0X29mZnNldChza2IpICsKKwkJCSAgc2tiLT5jc3VtX29mZnNldCArIHNpemVvZihfX3N1bTE2KTsKKwlyZXR1cm4gbWluX2xlbjsKK30KKworc3RhdGljIHUzMiBfX2JwZl9za2JfbWF4X2xlbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2ItPmRldi0+bXR1ICsgc2tiLT5kZXYtPmhhcmRfaGVhZGVyX2xlbjsKK30KKworc3RhdGljIGludCBicGZfc2tiX2dyb3dfcmNzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IG5ld19sZW4pCit7CisJdW5zaWduZWQgaW50IG9sZF9sZW4gPSBza2ItPmxlbjsKKwlpbnQgcmV0OworCisJcmV0ID0gX19za2JfZ3Jvd19yY3N1bShza2IsIG5ld19sZW4pOworCWlmICghcmV0KQorCQltZW1zZXQoc2tiLT5kYXRhICsgb2xkX2xlbiwgMCwgbmV3X2xlbiAtIG9sZF9sZW4pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYnBmX3NrYl90cmltX3Jjc3VtKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBuZXdfbGVuKQoreworCXJldHVybiBfX3NrYl90cmltX3Jjc3VtKHNrYiwgbmV3X2xlbik7Cit9CisKK0JQRl9DQUxMXzMoYnBmX3NrYl9jaGFuZ2VfdGFpbCwgc3RydWN0IHNrX2J1ZmYgKiwgc2tiLCB1MzIsIG5ld19sZW4sCisJICAgdTY0LCBmbGFncykKK3sKKwl1MzIgbWF4X2xlbiA9IF9fYnBmX3NrYl9tYXhfbGVuKHNrYik7CisJdTMyIG1pbl9sZW4gPSBfX2JwZl9za2JfbWluX2xlbihza2IpOworCWludCByZXQ7CisKKwlpZiAodW5saWtlbHkoZmxhZ3MgfHwgbmV3X2xlbiA+IG1heF9sZW4gfHwgbmV3X2xlbiA8IG1pbl9sZW4pKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc2tiLT5lbmNhcHN1bGF0aW9uKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCisJLyogVGhlIGJhc2ljIGlkZWEgb2YgdGhpcyBoZWxwZXIgaXMgdGhhdCBpdCdzIHBlcmZvcm1pbmcgdGhlCisJICogbmVlZGVkIHdvcmsgdG8gZWl0aGVyIGdyb3cgb3IgdHJpbSBhbiBza2IsIGFuZCBlQlBGIHByb2dyYW0KKwkgKiByZXdyaXRlcyB0aGUgcmVzdCB2aWEgaGVscGVycyBsaWtlIGJwZl9za2Jfc3RvcmVfYnl0ZXMoKSwKKwkgKiBicGZfbFhfY3N1bV9yZXBsYWNlKCkgYW5kIG90aGVycyByYXRoZXIgdGhhbiBwYXNzaW5nIGEgcmF3CisJICogYnVmZmVyIGhlcmUuIFRoaXMgb25lIGlzIGEgc2xvdyBwYXRoIGhlbHBlciBhbmQgaW50ZW5kZWQKKwkgKiBmb3IgcmVwbGllcyB3aXRoIGNvbnRyb2wgbWVzc2FnZXMuCisJICoKKwkgKiBMaWtlIGluIGJwZl9za2JfY2hhbmdlX3Byb3RvKCksIHdlIHdhbnQgdG8ga2VlcCB0aGlzIHJhdGhlcgorCSAqIG1pbmltYWwgYW5kIHdpdGhvdXQgcHJvdG9jb2wgc3BlY2lmaWNzIHNvIHRoYXQgd2UgYXJlIGFibGUKKwkgKiB0byBzZXBhcmF0ZSBjb25jZXJucyBhcyBpbiBicGZfc2tiX3N0b3JlX2J5dGVzKCkgc2hvdWxkIG9ubHkKKwkgKiBiZSB0aGUgb25lIHJlc3BvbnNpYmxlIGZvciB3cml0aW5nIGJ1ZmZlcnMuCisJICoKKwkgKiBJdCdzIHJlYWxseSBleHBlY3RlZCB0byBiZSBhIHNsb3cgcGF0aCBvcGVyYXRpb24gaGVyZSBmb3IKKwkgKiBjb250cm9sIG1lc3NhZ2UgcmVwbGllcywgc28gd2UncmUgaW1wbGljaXRseSBsaW5lYXJpemluZywKKwkgKiB1bmNsb25pbmcgYW5kIGRyb3Agb2ZmbG9hZHMgZnJvbSB0aGUgc2tiIGJ5IHRoaXMuCisJICovCisJcmV0ID0gX19icGZfdHJ5X21ha2Vfd3JpdGFibGUoc2tiLCBza2ItPmxlbik7CisJaWYgKCFyZXQpIHsKKwkJaWYgKG5ld19sZW4gPiBza2ItPmxlbikKKwkJCXJldCA9IGJwZl9za2JfZ3Jvd19yY3N1bShza2IsIG5ld19sZW4pOworCQllbHNlIGlmIChuZXdfbGVuIDwgc2tiLT5sZW4pCisJCQlyZXQgPSBicGZfc2tiX3RyaW1fcmNzdW0oc2tiLCBuZXdfbGVuKTsKKwkJaWYgKCFyZXQgJiYgc2tiX2lzX2dzbyhza2IpKQorCQkJc2tiX2dzb19yZXNldChza2IpOworCX0KKworCWJwZl9jb21wdXRlX2RhdGFfZW5kKHNrYik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfc2tiX2NoYW5nZV90YWlsX3Byb3RvID0geworCS5mdW5jCQk9IGJwZl9za2JfY2hhbmdlX3RhaWwsCisJLmdwbF9vbmx5CT0gZmFsc2UsCisJLnJldF90eXBlCT0gUkVUX0lOVEVHRVIsCisJLmFyZzFfdHlwZQk9IEFSR19QVFJfVE9fQ1RYLAorCS5hcmcyX3R5cGUJPSBBUkdfQU5ZVEhJTkcsCisJLmFyZzNfdHlwZQk9IEFSR19BTllUSElORywKK307CisKIGJvb2wgYnBmX2hlbHBlcl9jaGFuZ2VzX3NrYl9kYXRhKHZvaWQgKmZ1bmMpCiB7Ci0JaWYgKGZ1bmMgPT0gYnBmX3NrYl92bGFuX3B1c2gpCi0JCXJldHVybiB0cnVlOwotCWlmIChmdW5jID09IGJwZl9za2Jfdmxhbl9wb3ApCi0JCXJldHVybiB0cnVlOwotCWlmIChmdW5jID09IGJwZl9za2Jfc3RvcmVfYnl0ZXMpCi0JCXJldHVybiB0cnVlOwotCWlmIChmdW5jID09IGJwZl9za2JfY2hhbmdlX3Byb3RvKQotCQlyZXR1cm4gdHJ1ZTsKLQlpZiAoZnVuYyA9PSBicGZfbDNfY3N1bV9yZXBsYWNlKQotCQlyZXR1cm4gdHJ1ZTsKLQlpZiAoZnVuYyA9PSBicGZfbDRfY3N1bV9yZXBsYWNlKQorCWlmIChmdW5jID09IGJwZl9za2Jfdmxhbl9wdXNoIHx8CisJICAgIGZ1bmMgPT0gYnBmX3NrYl92bGFuX3BvcCB8fAorCSAgICBmdW5jID09IGJwZl9za2Jfc3RvcmVfYnl0ZXMgfHwKKwkgICAgZnVuYyA9PSBicGZfc2tiX2NoYW5nZV9wcm90byB8fAorCSAgICBmdW5jID09IGJwZl9za2JfY2hhbmdlX3RhaWwgfHwKKwkgICAgZnVuYyA9PSBicGZfc2tiX3B1bGxfZGF0YSB8fAorCSAgICBmdW5jID09IGJwZl9sM19jc3VtX3JlcGxhY2UgfHwKKwkgICAgZnVuYyA9PSBicGZfbDRfY3N1bV9yZXBsYWNlKQogCQlyZXR1cm4gdHJ1ZTsKIAogCXJldHVybiBmYWxzZTsKQEAgLTIwMzgsMTMgKzIxNjYsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHU2NCBicGZfc2tiX2V2ZW50X291dHB1dCh1NjQgcjEsIHU2NCByMiwgdTY0IGZsYWdzLCB1NjQgcjQsCi0JCQkJdTY0IG1ldGFfc2l6ZSkKK0JQRl9DQUxMXzUoYnBmX3NrYl9ldmVudF9vdXRwdXQsIHN0cnVjdCBza19idWZmICosIHNrYiwgc3RydWN0IGJwZl9tYXAgKiwgbWFwLAorCSAgIHU2NCwgZmxhZ3MsIHZvaWQgKiwgbWV0YSwgdTY0LCBtZXRhX3NpemUpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKShsb25nKSByMTsKLQlzdHJ1Y3QgYnBmX21hcCAqbWFwID0gKHN0cnVjdCBicGZfbWFwICopKGxvbmcpIHIyOwogCXU2NCBza2Jfc2l6ZSA9IChmbGFncyAmIEJQRl9GX0NUWExFTl9NQVNLKSA+PiAzMjsKLQl2b2lkICptZXRhID0gKHZvaWQgKikobG9uZykgcjQ7CiAKIAlpZiAodW5saWtlbHkoZmxhZ3MgJiB+KEJQRl9GX0NUWExFTl9NQVNLIHwgQlBGX0ZfSU5ERVhfTUFTSykpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIwNzEsMTAgKzIxOTYsOSBAQAogCXJldHVybiBmbGFncyAmIEJQRl9GX1RVTklORk9fSVBWNiA/IEFGX0lORVQ2IDogQUZfSU5FVDsKIH0KIAotc3RhdGljIHU2NCBicGZfc2tiX2dldF90dW5uZWxfa2V5KHU2NCByMSwgdTY0IHIyLCB1NjQgc2l6ZSwgdTY0IGZsYWdzLCB1NjQgcjUpCitCUEZfQ0FMTF80KGJwZl9za2JfZ2V0X3R1bm5lbF9rZXksIHN0cnVjdCBza19idWZmICosIHNrYiwgc3RydWN0IGJwZl90dW5uZWxfa2V5ICosIHRvLAorCSAgIHUzMiwgc2l6ZSwgdTY0LCBmbGFncykKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopIChsb25nKSByMTsKLQlzdHJ1Y3QgYnBmX3R1bm5lbF9rZXkgKnRvID0gKHN0cnVjdCBicGZfdHVubmVsX2tleSAqKSAobG9uZykgcjI7CiAJY29uc3Qgc3RydWN0IGlwX3R1bm5lbF9pbmZvICppbmZvID0gc2tiX3R1bm5lbF9pbmZvKHNrYik7CiAJdTggY29tcGF0W3NpemVvZihzdHJ1Y3QgYnBmX3R1bm5lbF9rZXkpXTsKIAl2b2lkICp0b19vcmlnID0gdG87CkBAIC0yMTM5LDEwICsyMjYzLDggQEAKIAkuYXJnNF90eXBlCT0gQVJHX0FOWVRISU5HLAogfTsKIAotc3RhdGljIHU2NCBicGZfc2tiX2dldF90dW5uZWxfb3B0KHU2NCByMSwgdTY0IHIyLCB1NjQgc2l6ZSwgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8zKGJwZl9za2JfZ2V0X3R1bm5lbF9vcHQsIHN0cnVjdCBza19idWZmICosIHNrYiwgdTggKiwgdG8sIHUzMiwgc2l6ZSkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopIChsb25nKSByMTsKLQl1OCAqdG8gPSAodTggKikgKGxvbmcpIHIyOwogCWNvbnN0IHN0cnVjdCBpcF90dW5uZWxfaW5mbyAqaW5mbyA9IHNrYl90dW5uZWxfaW5mbyhza2IpOwogCWludCBlcnI7CiAKQEAgLTIxNzcsMTAgKzIyOTksOSBAQAogCiBzdGF0aWMgc3RydWN0IG1ldGFkYXRhX2RzdCBfX3BlcmNwdSAqbWRfZHN0OwogCi1zdGF0aWMgdTY0IGJwZl9za2Jfc2V0X3R1bm5lbF9rZXkodTY0IHIxLCB1NjQgcjIsIHU2NCBzaXplLCB1NjQgZmxhZ3MsIHU2NCByNSkKK0JQRl9DQUxMXzQoYnBmX3NrYl9zZXRfdHVubmVsX2tleSwgc3RydWN0IHNrX2J1ZmYgKiwgc2tiLAorCSAgIGNvbnN0IHN0cnVjdCBicGZfdHVubmVsX2tleSAqLCBmcm9tLCB1MzIsIHNpemUsIHU2NCwgZmxhZ3MpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSAobG9uZykgcjE7Ci0Jc3RydWN0IGJwZl90dW5uZWxfa2V5ICpmcm9tID0gKHN0cnVjdCBicGZfdHVubmVsX2tleSAqKSAobG9uZykgcjI7CiAJc3RydWN0IG1ldGFkYXRhX2RzdCAqbWQgPSB0aGlzX2NwdV9wdHIobWRfZHN0KTsKIAl1OCBjb21wYXRbc2l6ZW9mKHN0cnVjdCBicGZfdHVubmVsX2tleSldOwogCXN0cnVjdCBpcF90dW5uZWxfaW5mbyAqaW5mbzsKQEAgLTIxOTgsNyArMjMxOSw3IEBACiAJCQkgKi8KIAkJCW1lbWNweShjb21wYXQsIGZyb20sIHNpemUpOwogCQkJbWVtc2V0KGNvbXBhdCArIHNpemUsIDAsIHNpemVvZihjb21wYXQpIC0gc2l6ZSk7Ci0JCQlmcm9tID0gKHN0cnVjdCBicGZfdHVubmVsX2tleSAqKWNvbXBhdDsKKwkJCWZyb20gPSAoY29uc3Qgc3RydWN0IGJwZl90dW5uZWxfa2V5ICopIGNvbXBhdDsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMjQ4LDEwICsyMzY5LDkgQEAKIAkuYXJnNF90eXBlCT0gQVJHX0FOWVRISU5HLAogfTsKIAotc3RhdGljIHU2NCBicGZfc2tiX3NldF90dW5uZWxfb3B0KHU2NCByMSwgdTY0IHIyLCB1NjQgc2l6ZSwgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8zKGJwZl9za2Jfc2V0X3R1bm5lbF9vcHQsIHN0cnVjdCBza19idWZmICosIHNrYiwKKwkgICBjb25zdCB1OCAqLCBmcm9tLCB1MzIsIHNpemUpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSAobG9uZykgcjE7Ci0JdTggKmZyb20gPSAodTggKikgKGxvbmcpIHIyOwogCXN0cnVjdCBpcF90dW5uZWxfaW5mbyAqaW5mbyA9IHNrYl90dW5uZWxfaW5mbyhza2IpOwogCWNvbnN0IHN0cnVjdCBtZXRhZGF0YV9kc3QgKm1kID0gdGhpc19jcHVfcHRyKG1kX2RzdCk7CiAKQEAgLTIyOTcsMzkgKzI0MTcsNjYgQEAKIAl9CiB9CiAKLSNpZmRlZiBDT05GSUdfU09DS19DR1JPVVBfREFUQQotc3RhdGljIHU2NCBicGZfc2tiX2luX2Nncm91cCh1NjQgcjEsIHU2NCByMiwgdTY0IHIzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzMoYnBmX3NrYl91bmRlcl9jZ3JvdXAsIHN0cnVjdCBza19idWZmICosIHNrYiwgc3RydWN0IGJwZl9tYXAgKiwgbWFwLAorCSAgIHUzMiwgaWR4KQogewotCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikobG9uZylyMTsKLQlzdHJ1Y3QgYnBmX21hcCAqbWFwID0gKHN0cnVjdCBicGZfbWFwICopKGxvbmcpcjI7CiAJc3RydWN0IGJwZl9hcnJheSAqYXJyYXkgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX2FycmF5LCBtYXApOwogCXN0cnVjdCBjZ3JvdXAgKmNncnA7CiAJc3RydWN0IHNvY2sgKnNrOwotCXUzMiBpID0gKHUzMilyMzsKIAotCXNrID0gc2tiLT5zazsKKwlzayA9IHNrYl90b19mdWxsX3NrKHNrYik7CiAJaWYgKCFzayB8fCAhc2tfZnVsbHNvY2soc2spKQogCQlyZXR1cm4gLUVOT0VOVDsKLQotCWlmICh1bmxpa2VseShpID49IGFycmF5LT5tYXAubWF4X2VudHJpZXMpKQorCWlmICh1bmxpa2VseShpZHggPj0gYXJyYXktPm1hcC5tYXhfZW50cmllcykpCiAJCXJldHVybiAtRTJCSUc7CiAKLQljZ3JwID0gUkVBRF9PTkNFKGFycmF5LT5wdHJzW2ldKTsKKwljZ3JwID0gUkVBRF9PTkNFKGFycmF5LT5wdHJzW2lkeF0pOwogCWlmICh1bmxpa2VseSghY2dycCkpCiAJCXJldHVybiAtRUFHQUlOOwogCi0JcmV0dXJuIGNncm91cF9pc19kZXNjZW5kYW50KHNvY2tfY2dyb3VwX3B0cigmc2stPnNrX2NncnBfZGF0YSksIGNncnApOworCXJldHVybiBza191bmRlcl9jZ3JvdXBfaGllcmFyY2h5KHNrLCBjZ3JwKTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfc2tiX2luX2Nncm91cF9wcm90byA9IHsKLQkuZnVuYwkJPSBicGZfc2tiX2luX2Nncm91cCwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX3NrYl91bmRlcl9jZ3JvdXBfcHJvdG8gPSB7CisJLmZ1bmMJCT0gYnBmX3NrYl91bmRlcl9jZ3JvdXAsCiAJLmdwbF9vbmx5CT0gZmFsc2UsCiAJLnJldF90eXBlCT0gUkVUX0lOVEVHRVIsCiAJLmFyZzFfdHlwZQk9IEFSR19QVFJfVE9fQ1RYLAogCS5hcmcyX3R5cGUJPSBBUkdfQ09OU1RfTUFQX1BUUiwKIAkuYXJnM190eXBlCT0gQVJHX0FOWVRISU5HLAogfTsKLSNlbmRpZgorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBicGZfeGRwX2NvcHkodm9pZCAqZHN0X2J1ZmYsIGNvbnN0IHZvaWQgKnNyY19idWZmLAorCQkJCSAgdW5zaWduZWQgbG9uZyBvZmYsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCW1lbWNweShkc3RfYnVmZiwgc3JjX2J1ZmYgKyBvZmYsIGxlbik7CisJcmV0dXJuIDA7Cit9CisKK0JQRl9DQUxMXzUoYnBmX3hkcF9ldmVudF9vdXRwdXQsIHN0cnVjdCB4ZHBfYnVmZiAqLCB4ZHAsIHN0cnVjdCBicGZfbWFwICosIG1hcCwKKwkgICB1NjQsIGZsYWdzLCB2b2lkICosIG1ldGEsIHU2NCwgbWV0YV9zaXplKQoreworCXU2NCB4ZHBfc2l6ZSA9IChmbGFncyAmIEJQRl9GX0NUWExFTl9NQVNLKSA+PiAzMjsKKworCWlmICh1bmxpa2VseShmbGFncyAmIH4oQlBGX0ZfQ1RYTEVOX01BU0sgfCBCUEZfRl9JTkRFWF9NQVNLKSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh1bmxpa2VseSh4ZHBfc2l6ZSA+ICh1bnNpZ25lZCBsb25nKSh4ZHAtPmRhdGFfZW5kIC0geGRwLT5kYXRhKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGJwZl9ldmVudF9vdXRwdXQobWFwLCBmbGFncywgbWV0YSwgbWV0YV9zaXplLCB4ZHAsIHhkcF9zaXplLAorCQkJCWJwZl94ZHBfY29weSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX3hkcF9ldmVudF9vdXRwdXRfcHJvdG8gPSB7CisJLmZ1bmMJCT0gYnBmX3hkcF9ldmVudF9vdXRwdXQsCisJLmdwbF9vbmx5CT0gdHJ1ZSwKKwkucmV0X3R5cGUJPSBSRVRfSU5URUdFUiwKKwkuYXJnMV90eXBlCT0gQVJHX1BUUl9UT19DVFgsCisJLmFyZzJfdHlwZQk9IEFSR19DT05TVF9NQVBfUFRSLAorCS5hcmczX3R5cGUJPSBBUkdfQU5ZVEhJTkcsCisJLmFyZzRfdHlwZQk9IEFSR19QVFJfVE9fU1RBQ0ssCisJLmFyZzVfdHlwZQk9IEFSR19DT05TVF9TVEFDS19TSVpFLAorfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byAqCiBza19maWx0ZXJfZnVuY19wcm90byhlbnVtIGJwZl9mdW5jX2lkIGZ1bmNfaWQpCkBAIC0yMzY1LDggKzI1MTIsMTIgQEAKIAkJcmV0dXJuICZicGZfc2tiX3N0b3JlX2J5dGVzX3Byb3RvOwogCWNhc2UgQlBGX0ZVTkNfc2tiX2xvYWRfYnl0ZXM6CiAJCXJldHVybiAmYnBmX3NrYl9sb2FkX2J5dGVzX3Byb3RvOworCWNhc2UgQlBGX0ZVTkNfc2tiX3B1bGxfZGF0YToKKwkJcmV0dXJuICZicGZfc2tiX3B1bGxfZGF0YV9wcm90bzsKIAljYXNlIEJQRl9GVU5DX2NzdW1fZGlmZjoKIAkJcmV0dXJuICZicGZfY3N1bV9kaWZmX3Byb3RvOworCWNhc2UgQlBGX0ZVTkNfY3N1bV91cGRhdGU6CisJCXJldHVybiAmYnBmX2NzdW1fdXBkYXRlX3Byb3RvOwogCWNhc2UgQlBGX0ZVTkNfbDNfY3N1bV9yZXBsYWNlOgogCQlyZXR1cm4gJmJwZl9sM19jc3VtX3JlcGxhY2VfcHJvdG87CiAJY2FzZSBCUEZfRlVOQ19sNF9jc3VtX3JlcGxhY2U6CkBAIC0yMzgzLDYgKzI1MzQsOCBAQAogCQlyZXR1cm4gJmJwZl9za2JfY2hhbmdlX3Byb3RvX3Byb3RvOwogCWNhc2UgQlBGX0ZVTkNfc2tiX2NoYW5nZV90eXBlOgogCQlyZXR1cm4gJmJwZl9za2JfY2hhbmdlX3R5cGVfcHJvdG87CisJY2FzZSBCUEZfRlVOQ19za2JfY2hhbmdlX3RhaWw6CisJCXJldHVybiAmYnBmX3NrYl9jaGFuZ2VfdGFpbF9wcm90bzsKIAljYXNlIEJQRl9GVU5DX3NrYl9nZXRfdHVubmVsX2tleToKIAkJcmV0dXJuICZicGZfc2tiX2dldF90dW5uZWxfa2V5X3Byb3RvOwogCWNhc2UgQlBGX0ZVTkNfc2tiX3NldF90dW5uZWxfa2V5OgpAQCAtMjM5NywxNCArMjU1MCwxNCBAQAogCQlyZXR1cm4gJmJwZl9nZXRfcm91dGVfcmVhbG1fcHJvdG87CiAJY2FzZSBCUEZfRlVOQ19nZXRfaGFzaF9yZWNhbGM6CiAJCXJldHVybiAmYnBmX2dldF9oYXNoX3JlY2FsY19wcm90bzsKKwljYXNlIEJQRl9GVU5DX3NldF9oYXNoX2ludmFsaWQ6CisJCXJldHVybiAmYnBmX3NldF9oYXNoX2ludmFsaWRfcHJvdG87CiAJY2FzZSBCUEZfRlVOQ19wZXJmX2V2ZW50X291dHB1dDoKIAkJcmV0dXJuICZicGZfc2tiX2V2ZW50X291dHB1dF9wcm90bzsKIAljYXNlIEJQRl9GVU5DX2dldF9zbXBfcHJvY2Vzc29yX2lkOgogCQlyZXR1cm4gJmJwZl9nZXRfc21wX3Byb2Nlc3Nvcl9pZF9wcm90bzsKLSNpZmRlZiBDT05GSUdfU09DS19DR1JPVVBfREFUQQotCWNhc2UgQlBGX0ZVTkNfc2tiX2luX2Nncm91cDoKLQkJcmV0dXJuICZicGZfc2tiX2luX2Nncm91cF9wcm90bzsKLSNlbmRpZgorCWNhc2UgQlBGX0ZVTkNfc2tiX3VuZGVyX2Nncm91cDoKKwkJcmV0dXJuICZicGZfc2tiX3VuZGVyX2Nncm91cF9wcm90bzsKIAlkZWZhdWx0OgogCQlyZXR1cm4gc2tfZmlsdGVyX2Z1bmNfcHJvdG8oZnVuY19pZCk7CiAJfQpAQCAtMjQxMyw3ICsyNTY2LDE0IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvICoKIHhkcF9mdW5jX3Byb3RvKGVudW0gYnBmX2Z1bmNfaWQgZnVuY19pZCkKIHsKLQlyZXR1cm4gc2tfZmlsdGVyX2Z1bmNfcHJvdG8oZnVuY19pZCk7CisJc3dpdGNoIChmdW5jX2lkKSB7CisJY2FzZSBCUEZfRlVOQ19wZXJmX2V2ZW50X291dHB1dDoKKwkJcmV0dXJuICZicGZfeGRwX2V2ZW50X291dHB1dF9wcm90bzsKKwljYXNlIEJQRl9GVU5DX2dldF9zbXBfcHJvY2Vzc29yX2lkOgorCQlyZXR1cm4gJmJwZl9nZXRfc21wX3Byb2Nlc3Nvcl9pZF9wcm90bzsKKwlkZWZhdWx0OgorCQlyZXR1cm4gc2tfZmlsdGVyX2Z1bmNfcHJvdG8oZnVuY19pZCk7CisJfQogfQogCiBzdGF0aWMgYm9vbCBfX2lzX3ZhbGlkX2FjY2VzcyhpbnQgb2ZmLCBpbnQgc2l6ZSwgZW51bSBicGZfYWNjZXNzX3R5cGUgdHlwZSkKQEAgLTI0NTMsNiArMjYxMyw0NSBAQAogCXJldHVybiBfX2lzX3ZhbGlkX2FjY2VzcyhvZmYsIHNpemUsIHR5cGUpOwogfQogCitzdGF0aWMgaW50IHRjX2Nsc19hY3RfcHJvbG9ndWUoc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZiwgYm9vbCBkaXJlY3Rfd3JpdGUsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGJwZl9wcm9nICpwcm9nKQoreworCXN0cnVjdCBicGZfaW5zbiAqaW5zbiA9IGluc25fYnVmOworCisJaWYgKCFkaXJlY3Rfd3JpdGUpCisJCXJldHVybiAwOworCisJLyogaWYgKCFza2ItPmNsb25lZCkKKwkgKiAgICAgICBnb3RvIHN0YXJ0OworCSAqCisJICogKEZhc3QtcGF0aCwgb3RoZXJ3aXNlIGFwcHJveGltYXRpb24gdGhhdCB3ZSBtaWdodCBiZQorCSAqICBhIGNsb25lLCBkbyB0aGUgcmVzdCBpbiBoZWxwZXIuKQorCSAqLworCSppbnNuKysgPSBCUEZfTERYX01FTShCUEZfQiwgQlBGX1JFR182LCBCUEZfUkVHXzEsIENMT05FRF9PRkZTRVQoKSk7CisJKmluc24rKyA9IEJQRl9BTFUzMl9JTU0oQlBGX0FORCwgQlBGX1JFR182LCBDTE9ORURfTUFTSyk7CisJKmluc24rKyA9IEJQRl9KTVBfSU1NKEJQRl9KRVEsIEJQRl9SRUdfNiwgMCwgNyk7CisKKwkvKiByZXQgPSBicGZfc2tiX3B1bGxfZGF0YShza2IsIDApOyAqLworCSppbnNuKysgPSBCUEZfTU9WNjRfUkVHKEJQRl9SRUdfNiwgQlBGX1JFR18xKTsKKwkqaW5zbisrID0gQlBGX0FMVTY0X1JFRyhCUEZfWE9SLCBCUEZfUkVHXzIsIEJQRl9SRUdfMik7CisJKmluc24rKyA9IEJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsCisJCQkgICAgICAgQlBGX0ZVTkNfc2tiX3B1bGxfZGF0YSk7CisJLyogaWYgKCFyZXQpCisJICogICAgICBnb3RvIHJlc3RvcmU7CisJICogcmV0dXJuIFRDX0FDVF9TSE9UOworCSAqLworCSppbnNuKysgPSBCUEZfSk1QX0lNTShCUEZfSkVRLCBCUEZfUkVHXzAsIDAsIDIpOworCSppbnNuKysgPSBCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIEJQRl9SRUdfMCwgVENfQUNUX1NIT1QpOworCSppbnNuKysgPSBCUEZfRVhJVF9JTlNOKCk7CisKKwkvKiByZXN0b3JlOiAqLworCSppbnNuKysgPSBCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMSwgQlBGX1JFR182KTsKKwkvKiBzdGFydDogKi8KKwkqaW5zbisrID0gcHJvZy0+aW5zbnNpWzBdOworCisJcmV0dXJuIGluc24gLSBpbnNuX2J1ZjsKK30KKwogc3RhdGljIGJvb2wgdGNfY2xzX2FjdF9pc192YWxpZF9hY2Nlc3MoaW50IG9mZiwgaW50IHNpemUsCiAJCQkJICAgICAgIGVudW0gYnBmX2FjY2Vzc190eXBlIHR5cGUsCiAJCQkJICAgICAgIGVudW0gYnBmX3JlZ190eXBlICpyZWdfdHlwZSkKQEAgLTI0OTAsNyArMjY4OSw3IEBACiAJCXJldHVybiBmYWxzZTsKIAlpZiAob2ZmICUgc2l6ZSAhPSAwKQogCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKHNpemUgIT0gNCkKKwlpZiAoc2l6ZSAhPSBzaXplb2YoX191MzIpKQogCQlyZXR1cm4gZmFsc2U7CiAKIAlyZXR1cm4gdHJ1ZTsKQEAgLTI1MjEsMTAgKzI3MjAsMTAgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGJwZl93YXJuX2ludmFsaWRfeGRwX2FjdGlvbik7CiAKLXN0YXRpYyB1MzIgYnBmX25ldF9jb252ZXJ0X2N0eF9hY2Nlc3MoZW51bSBicGZfYWNjZXNzX3R5cGUgdHlwZSwgaW50IGRzdF9yZWcsCi0JCQkJICAgICAgaW50IHNyY19yZWcsIGludCBjdHhfb2ZmLAotCQkJCSAgICAgIHN0cnVjdCBicGZfaW5zbiAqaW5zbl9idWYsCi0JCQkJICAgICAgc3RydWN0IGJwZl9wcm9nICpwcm9nKQorc3RhdGljIHUzMiBza19maWx0ZXJfY29udmVydF9jdHhfYWNjZXNzKGVudW0gYnBmX2FjY2Vzc190eXBlIHR5cGUsIGludCBkc3RfcmVnLAorCQkJCQlpbnQgc3JjX3JlZywgaW50IGN0eF9vZmYsCisJCQkJCXN0cnVjdCBicGZfaW5zbiAqaW5zbl9idWYsCisJCQkJCXN0cnVjdCBicGZfcHJvZyAqcHJvZykKIHsKIAlzdHJ1Y3QgYnBmX2luc24gKmluc24gPSBpbnNuX2J1ZjsKIApAQCAtMjU3MSw3ICsyNzcwLDcgQEAKIAljYXNlIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGlmaW5kZXgpOgogCQlCVUlMRF9CVUdfT04oRklFTERfU0laRU9GKHN0cnVjdCBuZXRfZGV2aWNlLCBpZmluZGV4KSAhPSA0KTsKIAotCQkqaW5zbisrID0gQlBGX0xEWF9NRU0oYnl0ZXNfdG9fYnBmX3NpemUoRklFTERfU0laRU9GKHN0cnVjdCBza19idWZmLCBkZXYpKSwKKwkJKmluc24rKyA9IEJQRl9MRFhfTUVNKEJQRl9GSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIGRldiksCiAJCQkJICAgICAgZHN0X3JlZywgc3JjX3JlZywKIAkJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgZGV2KSk7CiAJCSppbnNuKysgPSBCUEZfSk1QX0lNTShCUEZfSkVRLCBkc3RfcmVnLCAwLCAxKTsKQEAgLTI2MTIsNyArMjgxMSw3IEBACiAJCQkJCSAgZHN0X3JlZywgc3JjX3JlZywgaW5zbik7CiAKIAljYXNlIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGNiWzBdKSAuLi4KLQkJb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgY2JbNF0pOgorCSAgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgY2JbNF0pOgogCQlCVUlMRF9CVUdfT04oRklFTERfU0laRU9GKHN0cnVjdCBxZGlzY19za2JfY2IsIGRhdGEpIDwgMjApOwogCiAJCXByb2ctPmNiX2FjY2VzcyA9IDE7CkBAIC0yNjM2LDcgKzI4MzUsNyBAQAogCQlicmVhazsKIAogCWNhc2Ugb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YSk6Ci0JCSppbnNuKysgPSBCUEZfTERYX01FTShieXRlc190b19icGZfc2l6ZShGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIGRhdGEpKSwKKwkJKmluc24rKyA9IEJQRl9MRFhfTUVNKEJQRl9GSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIGRhdGEpLAogCQkJCSAgICAgIGRzdF9yZWcsIHNyY19yZWcsCiAJCQkJICAgICAgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIGRhdGEpKTsKIAkJYnJlYWs7CkBAIC0yNjQ1LDggKzI4NDQsOCBAQAogCQljdHhfb2ZmIC09IG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGFfZW5kKTsKIAkJY3R4X29mZiArPSBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgY2IpOwogCQljdHhfb2ZmICs9IG9mZnNldG9mKHN0cnVjdCBicGZfc2tiX2RhdGFfZW5kLCBkYXRhX2VuZCk7Ci0JCSppbnNuKysgPSBCUEZfTERYX01FTShieXRlc190b19icGZfc2l6ZShzaXplb2Yodm9pZCAqKSksCi0JCQkJICAgICAgZHN0X3JlZywgc3JjX3JlZywgY3R4X29mZik7CisJCSppbnNuKysgPSBCUEZfTERYX01FTShCUEZfU0laRU9GKHZvaWQgKiksIGRzdF9yZWcsIHNyY19yZWcsCisJCQkJICAgICAgY3R4X29mZik7CiAJCWJyZWFrOwogCiAJY2FzZSBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCB0Y19pbmRleCk6CkBAIC0yNjcyLDYgKzI4NzEsMzEgQEAKIAlyZXR1cm4gaW5zbiAtIGluc25fYnVmOwogfQogCitzdGF0aWMgdTMyIHRjX2Nsc19hY3RfY29udmVydF9jdHhfYWNjZXNzKGVudW0gYnBmX2FjY2Vzc190eXBlIHR5cGUsIGludCBkc3RfcmVnLAorCQkJCQkgaW50IHNyY19yZWcsIGludCBjdHhfb2ZmLAorCQkJCQkgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZiwKKwkJCQkJIHN0cnVjdCBicGZfcHJvZyAqcHJvZykKK3sKKwlzdHJ1Y3QgYnBmX2luc24gKmluc24gPSBpbnNuX2J1ZjsKKworCXN3aXRjaCAoY3R4X29mZikgeworCWNhc2Ugb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgaWZpbmRleCk6CisJCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IG5ldF9kZXZpY2UsIGlmaW5kZXgpICE9IDQpOworCisJCSppbnNuKysgPSBCUEZfTERYX01FTShCUEZfRklFTERfU0laRU9GKHN0cnVjdCBza19idWZmLCBkZXYpLAorCQkJCSAgICAgIGRzdF9yZWcsIHNyY19yZWcsCisJCQkJICAgICAgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIGRldikpOworCQkqaW5zbisrID0gQlBGX0xEWF9NRU0oQlBGX1csIGRzdF9yZWcsIGRzdF9yZWcsCisJCQkJICAgICAgb2Zmc2V0b2Yoc3RydWN0IG5ldF9kZXZpY2UsIGlmaW5kZXgpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIHNrX2ZpbHRlcl9jb252ZXJ0X2N0eF9hY2Nlc3ModHlwZSwgZHN0X3JlZywgc3JjX3JlZywKKwkJCQkJCSAgICBjdHhfb2ZmLCBpbnNuX2J1ZiwgcHJvZyk7CisJfQorCisJcmV0dXJuIGluc24gLSBpbnNuX2J1ZjsKK30KKwogc3RhdGljIHUzMiB4ZHBfY29udmVydF9jdHhfYWNjZXNzKGVudW0gYnBmX2FjY2Vzc190eXBlIHR5cGUsIGludCBkc3RfcmVnLAogCQkJCSAgaW50IHNyY19yZWcsIGludCBjdHhfb2ZmLAogCQkJCSAgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZiwKQEAgLTI2ODEsMTIgKzI5MDUsMTIgQEAKIAogCXN3aXRjaCAoY3R4X29mZikgewogCWNhc2Ugb2Zmc2V0b2Yoc3RydWN0IHhkcF9tZCwgZGF0YSk6Ci0JCSppbnNuKysgPSBCUEZfTERYX01FTShieXRlc190b19icGZfc2l6ZShGSUVMRF9TSVpFT0Yoc3RydWN0IHhkcF9idWZmLCBkYXRhKSksCisJCSppbnNuKysgPSBCUEZfTERYX01FTShCUEZfRklFTERfU0laRU9GKHN0cnVjdCB4ZHBfYnVmZiwgZGF0YSksCiAJCQkJICAgICAgZHN0X3JlZywgc3JjX3JlZywKIAkJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3QgeGRwX2J1ZmYsIGRhdGEpKTsKIAkJYnJlYWs7CiAJY2FzZSBvZmZzZXRvZihzdHJ1Y3QgeGRwX21kLCBkYXRhX2VuZCk6Ci0JCSppbnNuKysgPSBCUEZfTERYX01FTShieXRlc190b19icGZfc2l6ZShGSUVMRF9TSVpFT0Yoc3RydWN0IHhkcF9idWZmLCBkYXRhX2VuZCkpLAorCQkqaW5zbisrID0gQlBGX0xEWF9NRU0oQlBGX0ZJRUxEX1NJWkVPRihzdHJ1Y3QgeGRwX2J1ZmYsIGRhdGFfZW5kKSwKIAkJCQkgICAgICBkc3RfcmVnLCBzcmNfcmVnLAogCQkJCSAgICAgIG9mZnNldG9mKHN0cnVjdCB4ZHBfYnVmZiwgZGF0YV9lbmQpKTsKIAkJYnJlYWs7CkBAIC0yNjk4LDEzICsyOTIyLDE0IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl92ZXJpZmllcl9vcHMgc2tfZmlsdGVyX29wcyA9IHsKIAkuZ2V0X2Z1bmNfcHJvdG8JCT0gc2tfZmlsdGVyX2Z1bmNfcHJvdG8sCiAJLmlzX3ZhbGlkX2FjY2Vzcwk9IHNrX2ZpbHRlcl9pc192YWxpZF9hY2Nlc3MsCi0JLmNvbnZlcnRfY3R4X2FjY2Vzcwk9IGJwZl9uZXRfY29udmVydF9jdHhfYWNjZXNzLAorCS5jb252ZXJ0X2N0eF9hY2Nlc3MJPSBza19maWx0ZXJfY29udmVydF9jdHhfYWNjZXNzLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfdmVyaWZpZXJfb3BzIHRjX2Nsc19hY3Rfb3BzID0gewogCS5nZXRfZnVuY19wcm90bwkJPSB0Y19jbHNfYWN0X2Z1bmNfcHJvdG8sCiAJLmlzX3ZhbGlkX2FjY2Vzcwk9IHRjX2Nsc19hY3RfaXNfdmFsaWRfYWNjZXNzLAotCS5jb252ZXJ0X2N0eF9hY2Nlc3MJPSBicGZfbmV0X2NvbnZlcnRfY3R4X2FjY2VzcywKKwkuY29udmVydF9jdHhfYWNjZXNzCT0gdGNfY2xzX2FjdF9jb252ZXJ0X2N0eF9hY2Nlc3MsCisJLmdlbl9wcm9sb2d1ZQkJPSB0Y19jbHNfYWN0X3Byb2xvZ3VlLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfdmVyaWZpZXJfb3BzIHhkcF9vcHMgPSB7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9mbG93X2Rpc3NlY3Rvci5jIGIvbmV0L2NvcmUvZmxvd19kaXNzZWN0b3IuYwppbmRleCA2MWFkNDNmLi4xYTdiODBmIDEwMDY0NAotLS0gYS9uZXQvY29yZS9mbG93X2Rpc3NlY3Rvci5jCisrKyBiL25ldC9jb3JlL2Zsb3dfZGlzc2VjdG9yLmMKQEAgLTYsNiArNiw4IEBACiAjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L2dyZS5oPgorI2luY2x1ZGUgPG5ldC9wcHRwLmg+CiAjaW5jbHVkZSA8bGludXgvaWdtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2ljbXAuaD4KICNpbmNsdWRlIDxsaW51eC9zY3RwLmg+CkBAIC0xMTYsMTMgKzExOCwxNiBAQAogCXN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfYWRkcnMgKmtleV9hZGRyczsKIAlzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X3BvcnRzICprZXlfcG9ydHM7CiAJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV90YWdzICprZXlfdGFnczsKKwlzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X3ZsYW4gKmtleV92bGFuOwogCXN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfa2V5aWQgKmtleV9rZXlpZDsKKwlib29sIHNraXBfdmxhbiA9IGZhbHNlOwogCXU4IGlwX3Byb3RvID0gMDsKIAlib29sIHJldCA9IGZhbHNlOwogCiAJaWYgKCFkYXRhKSB7CiAJCWRhdGEgPSBza2ItPmRhdGE7Ci0JCXByb3RvID0gc2tiLT5wcm90b2NvbDsKKwkJcHJvdG8gPSBza2Jfdmxhbl90YWdfcHJlc2VudChza2IpID8KKwkJCSBza2ItPnZsYW5fcHJvdG8gOiBza2ItPnByb3RvY29sOwogCQluaG9mZiA9IHNrYl9uZXR3b3JrX29mZnNldChza2IpOwogCQlobGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKIAl9CkBAIC0yNDEsMjMgKzI0Niw0NSBAQAogCWNhc2UgaHRvbnMoRVRIX1BfODAyMUFEKToKIAljYXNlIGh0b25zKEVUSF9QXzgwMjFRKTogewogCQljb25zdCBzdHJ1Y3Qgdmxhbl9oZHIgKnZsYW47Ci0JCXN0cnVjdCB2bGFuX2hkciBfdmxhbjsKIAotCQl2bGFuID0gX19za2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBuaG9mZiwgc2l6ZW9mKF92bGFuKSwgZGF0YSwgaGxlbiwgJl92bGFuKTsKLQkJaWYgKCF2bGFuKQotCQkJZ290byBvdXRfYmFkOworCQlpZiAoc2tiX3ZsYW5fdGFnX3ByZXNlbnQoc2tiKSkKKwkJCXByb3RvID0gc2tiLT5wcm90b2NvbDsKIAotCQlpZiAoZGlzc2VjdG9yX3VzZXNfa2V5KGZsb3dfZGlzc2VjdG9yLAotCQkJCSAgICAgICBGTE9XX0RJU1NFQ1RPUl9LRVlfVkxBTklEKSkgewotCQkJa2V5X3RhZ3MgPSBza2JfZmxvd19kaXNzZWN0b3JfdGFyZ2V0KGZsb3dfZGlzc2VjdG9yLAotCQkJCQkJCSAgICAgRkxPV19ESVNTRUNUT1JfS0VZX1ZMQU5JRCwKLQkJCQkJCQkgICAgIHRhcmdldF9jb250YWluZXIpOworCQlpZiAoIXNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikgfHwKKwkJICAgIHByb3RvID09IGNwdV90b19iZTE2KEVUSF9QXzgwMjFRKSB8fAorCQkgICAgcHJvdG8gPT0gY3B1X3RvX2JlMTYoRVRIX1BfODAyMUFEKSkgeworCQkJc3RydWN0IHZsYW5faGRyIF92bGFuOwogCi0JCQlrZXlfdGFncy0+dmxhbl9pZCA9IHNrYl92bGFuX3RhZ19nZXRfaWQoc2tiKTsKKwkJCXZsYW4gPSBfX3NrYl9oZWFkZXJfcG9pbnRlcihza2IsIG5ob2ZmLCBzaXplb2YoX3ZsYW4pLAorCQkJCQkJICAgIGRhdGEsIGhsZW4sICZfdmxhbik7CisJCQlpZiAoIXZsYW4pCisJCQkJZ290byBvdXRfYmFkOworCQkJcHJvdG8gPSB2bGFuLT5oX3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvOworCQkJbmhvZmYgKz0gc2l6ZW9mKCp2bGFuKTsKKwkJCWlmIChza2lwX3ZsYW4pCisJCQkJZ290byBhZ2FpbjsKIAkJfQogCi0JCXByb3RvID0gdmxhbi0+aF92bGFuX2VuY2Fwc3VsYXRlZF9wcm90bzsKLQkJbmhvZmYgKz0gc2l6ZW9mKCp2bGFuKTsKKwkJc2tpcF92bGFuID0gdHJ1ZTsKKwkJaWYgKGRpc3NlY3Rvcl91c2VzX2tleShmbG93X2Rpc3NlY3RvciwKKwkJCQkgICAgICAgRkxPV19ESVNTRUNUT1JfS0VZX1ZMQU4pKSB7CisJCQlrZXlfdmxhbiA9IHNrYl9mbG93X2Rpc3NlY3Rvcl90YXJnZXQoZmxvd19kaXNzZWN0b3IsCisJCQkJCQkJICAgICBGTE9XX0RJU1NFQ1RPUl9LRVlfVkxBTiwKKwkJCQkJCQkgICAgIHRhcmdldF9jb250YWluZXIpOworCisJCQlpZiAoc2tiX3ZsYW5fdGFnX3ByZXNlbnQoc2tiKSkgeworCQkJCWtleV92bGFuLT52bGFuX2lkID0gc2tiX3ZsYW5fdGFnX2dldF9pZChza2IpOworCQkJCWtleV92bGFuLT52bGFuX3ByaW9yaXR5ID0KKwkJCQkJKHNrYl92bGFuX3RhZ19nZXRfcHJpbyhza2IpID4+IFZMQU5fUFJJT19TSElGVCk7CisJCQl9IGVsc2UgeworCQkJCWtleV92bGFuLT52bGFuX2lkID0gbnRvaHModmxhbi0+aF92bGFuX1RDSSkgJgorCQkJCQlWTEFOX1ZJRF9NQVNLOworCQkJCWtleV92bGFuLT52bGFuX3ByaW9yaXR5ID0KKwkJCQkJKG50b2hzKHZsYW4tPmhfdmxhbl9UQ0kpICYKKwkJCQkJIFZMQU5fUFJJT19NQVNLKSA+PiBWTEFOX1BSSU9fU0hJRlQ7CisJCQl9CisJCX0KKwogCQlnb3RvIGFnYWluOwogCX0KIAljYXNlIGh0b25zKEVUSF9QX1BQUF9TRVMpOiB7CkBAIC0zMzgsMzIgKzM2NSw0MiBAQAogaXBfcHJvdG9fYWdhaW46CiAJc3dpdGNoIChpcF9wcm90bykgewogCWNhc2UgSVBQUk9UT19HUkU6IHsKLQkJc3RydWN0IGdyZV9oZHIgewotCQkJX19iZTE2IGZsYWdzOwotCQkJX19iZTE2IHByb3RvOwotCQl9ICpoZHIsIF9oZHI7CisJCXN0cnVjdCBncmVfYmFzZV9oZHIgKmhkciwgX2hkcjsKKwkJdTE2IGdyZV92ZXI7CisJCWludCBvZmZzZXQgPSAwOwogCiAJCWhkciA9IF9fc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgbmhvZmYsIHNpemVvZihfaGRyKSwgZGF0YSwgaGxlbiwgJl9oZHIpOwogCQlpZiAoIWhkcikKIAkJCWdvdG8gb3V0X2JhZDsKLQkJLyoKLQkJICogT25seSBsb29rIGluc2lkZSBHUkUgaWYgdmVyc2lvbiB6ZXJvIGFuZCBubwotCQkgKiByb3V0aW5nCi0JCSAqLwotCQlpZiAoaGRyLT5mbGFncyAmIChHUkVfVkVSU0lPTiB8IEdSRV9ST1VUSU5HKSkKKworCQkvKiBPbmx5IGxvb2sgaW5zaWRlIEdSRSB3aXRob3V0IHJvdXRpbmcgKi8KKwkJaWYgKGhkci0+ZmxhZ3MgJiBHUkVfUk9VVElORykKIAkJCWJyZWFrOwogCi0JCXByb3RvID0gaGRyLT5wcm90bzsKLQkJbmhvZmYgKz0gNDsKKwkJLyogT25seSBsb29rIGluc2lkZSBHUkUgZm9yIHZlcnNpb24gMCBhbmQgMSAqLworCQlncmVfdmVyID0gbnRvaHMoaGRyLT5mbGFncyAmIEdSRV9WRVJTSU9OKTsKKwkJaWYgKGdyZV92ZXIgPiAxKQorCQkJYnJlYWs7CisKKwkJcHJvdG8gPSBoZHItPnByb3RvY29sOworCQlpZiAoZ3JlX3ZlcikgeworCQkJLyogVmVyc2lvbjEgbXVzdCBiZSBQUFRQLCBhbmQgY2hlY2sgdGhlIGZsYWdzICovCisJCQlpZiAoIShwcm90byA9PSBHUkVfUFJPVE9fUFBQICYmIChoZHItPmZsYWdzICYgR1JFX0tFWSkpKQorCQkJCWJyZWFrOworCQl9CisKKwkJb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3QgZ3JlX2Jhc2VfaGRyKTsKKwogCQlpZiAoaGRyLT5mbGFncyAmIEdSRV9DU1VNKQotCQkJbmhvZmYgKz0gNDsKKwkJCW9mZnNldCArPSBzaXplb2YoKChzdHJ1Y3QgZ3JlX2Z1bGxfaGRyICopMCktPmNzdW0pICsKKwkJCQkgIHNpemVvZigoKHN0cnVjdCBncmVfZnVsbF9oZHIgKikwKS0+cmVzZXJ2ZWQxKTsKKwogCQlpZiAoaGRyLT5mbGFncyAmIEdSRV9LRVkpIHsKIAkJCWNvbnN0IF9fYmUzMiAqa2V5aWQ7CiAJCQlfX2JlMzIgX2tleWlkOwogCi0JCQlrZXlpZCA9IF9fc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgbmhvZmYsIHNpemVvZihfa2V5aWQpLAorCQkJa2V5aWQgPSBfX3NrYl9oZWFkZXJfcG9pbnRlcihza2IsIG5ob2ZmICsgb2Zmc2V0LCBzaXplb2YoX2tleWlkKSwKIAkJCQkJCSAgICAgZGF0YSwgaGxlbiwgJl9rZXlpZCk7Ci0KIAkJCWlmICgha2V5aWQpCiAJCQkJZ290byBvdXRfYmFkOwogCkBAIC0zNzIsMzIgKzQwOSw2NSBAQAogCQkJCWtleV9rZXlpZCA9IHNrYl9mbG93X2Rpc3NlY3Rvcl90YXJnZXQoZmxvd19kaXNzZWN0b3IsCiAJCQkJCQkJCSAgICAgIEZMT1dfRElTU0VDVE9SX0tFWV9HUkVfS0VZSUQsCiAJCQkJCQkJCSAgICAgIHRhcmdldF9jb250YWluZXIpOwotCQkJCWtleV9rZXlpZC0+a2V5aWQgPSAqa2V5aWQ7CisJCQkJaWYgKGdyZV92ZXIgPT0gMCkKKwkJCQkJa2V5X2tleWlkLT5rZXlpZCA9ICprZXlpZDsKKwkJCQllbHNlCisJCQkJCWtleV9rZXlpZC0+a2V5aWQgPSAqa2V5aWQgJiBHUkVfUFBUUF9LRVlfTUFTSzsKIAkJCX0KLQkJCW5ob2ZmICs9IDQ7CisJCQlvZmZzZXQgKz0gc2l6ZW9mKCgoc3RydWN0IGdyZV9mdWxsX2hkciAqKTApLT5rZXkpOwogCQl9CisKIAkJaWYgKGhkci0+ZmxhZ3MgJiBHUkVfU0VRKQotCQkJbmhvZmYgKz0gNDsKLQkJaWYgKHByb3RvID09IGh0b25zKEVUSF9QX1RFQikpIHsKLQkJCWNvbnN0IHN0cnVjdCBldGhoZHIgKmV0aDsKLQkJCXN0cnVjdCBldGhoZHIgX2V0aDsKKwkJCW9mZnNldCArPSBzaXplb2YoKChzdHJ1Y3QgcHB0cF9ncmVfaGVhZGVyICopMCktPnNlcSk7CiAKLQkJCWV0aCA9IF9fc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgbmhvZmYsCi0JCQkJCQkgICBzaXplb2YoX2V0aCksCi0JCQkJCQkgICBkYXRhLCBobGVuLCAmX2V0aCk7Ci0JCQlpZiAoIWV0aCkKKwkJaWYgKGdyZV92ZXIgPT0gMCkgeworCQkJaWYgKHByb3RvID09IGh0b25zKEVUSF9QX1RFQikpIHsKKwkJCQljb25zdCBzdHJ1Y3QgZXRoaGRyICpldGg7CisJCQkJc3RydWN0IGV0aGhkciBfZXRoOworCisJCQkJZXRoID0gX19za2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBuaG9mZiArIG9mZnNldCwKKwkJCQkJCQkgICBzaXplb2YoX2V0aCksCisJCQkJCQkJICAgZGF0YSwgaGxlbiwgJl9ldGgpOworCQkJCWlmICghZXRoKQorCQkJCQlnb3RvIG91dF9iYWQ7CisJCQkJcHJvdG8gPSBldGgtPmhfcHJvdG87CisJCQkJb2Zmc2V0ICs9IHNpemVvZigqZXRoKTsKKworCQkJCS8qIENhcCBoZWFkZXJzIHRoYXQgd2UgYWNjZXNzIHZpYSBwb2ludGVycyBhdCB0aGUKKwkJCQkgKiBlbmQgb2YgdGhlIEV0aGVybmV0IGhlYWRlciBhcyBvdXIgbWF4aW11bSBhbGlnbm1lbnQKKwkJCQkgKiBhdCB0aGF0IHBvaW50IGlzIG9ubHkgMiBieXRlcy4KKwkJCQkgKi8KKwkJCQlpZiAoTkVUX0lQX0FMSUdOKQorCQkJCQlobGVuID0gKG5ob2ZmICsgb2Zmc2V0KTsKKwkJCX0KKwkJfSBlbHNlIHsgLyogdmVyc2lvbiAxLCBtdXN0IGJlIFBQVFAgKi8KKwkJCXU4IF9wcHBfaGRyW1BQUF9IRFJMRU5dOworCQkJdTggKnBwcF9oZHI7CisKKwkJCWlmIChoZHItPmZsYWdzICYgR1JFX0FDSykKKwkJCQlvZmZzZXQgKz0gc2l6ZW9mKCgoc3RydWN0IHBwdHBfZ3JlX2hlYWRlciAqKTApLT5hY2spOworCisJCQlwcHBfaGRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgbmhvZmYgKyBvZmZzZXQsCisJCQkJCQkgICAgIHNpemVvZihfcHBwX2hkciksIF9wcHBfaGRyKTsKKwkJCWlmICghcHBwX2hkcikKIAkJCQlnb3RvIG91dF9iYWQ7Ci0JCQlwcm90byA9IGV0aC0+aF9wcm90bzsKLQkJCW5ob2ZmICs9IHNpemVvZigqZXRoKTsKIAotCQkJLyogQ2FwIGhlYWRlcnMgdGhhdCB3ZSBhY2Nlc3MgdmlhIHBvaW50ZXJzIGF0IHRoZQotCQkJICogZW5kIG9mIHRoZSBFdGhlcm5ldCBoZWFkZXIgYXMgb3VyIG1heGltdW0gYWxpZ25tZW50Ci0JCQkgKiBhdCB0aGF0IHBvaW50IGlzIG9ubHkgMiBieXRlcy4KLQkJCSAqLwotCQkJaWYgKE5FVF9JUF9BTElHTikKLQkJCQlobGVuID0gbmhvZmY7CisJCQlzd2l0Y2ggKFBQUF9QUk9UT0NPTChwcHBfaGRyKSkgeworCQkJY2FzZSBQUFBfSVA6CisJCQkJcHJvdG8gPSBodG9ucyhFVEhfUF9JUCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFBQUF9JUFY2OgorCQkJCXByb3RvID0gaHRvbnMoRVRIX1BfSVBWNik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCS8qIENvdWxkIHByb2JhYmx5IGNhdGNoIHNvbWUgbW9yZSBsaWtlIE1QTFMgKi8KKwkJCQlicmVhazsKKwkJCX0KKworCQkJb2Zmc2V0ICs9IFBQUF9IRFJMRU47CiAJCX0KIAorCQluaG9mZiArPSBvZmZzZXQ7CiAJCWtleV9jb250cm9sLT5mbGFncyB8PSBGTE9XX0RJU19FTkNBUFNVTEFUSU9OOwogCQlpZiAoZmxhZ3MgJiBGTE9XX0RJU1NFQ1RPUl9GX1NUT1BfQVRfRU5DQVApCiAJCQlnb3RvIG91dF9nb29kOwpAQCAtNjgwLDExICs3NTAsMTMgQEAKIHZvaWQgX19za2JfZ2V0X2hhc2goc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgZmxvd19rZXlzIGtleXM7CisJdTMyIGhhc2g7CiAKIAlfX2Zsb3dfaGFzaF9zZWNyZXRfaW5pdCgpOwogCi0JX19za2Jfc2V0X3N3X2hhc2goc2tiLCBfX19za2JfZ2V0X2hhc2goc2tiLCAma2V5cywgaGFzaHJuZCksCi0JCQkgIGZsb3dfa2V5c19oYXZlX2w0KCZrZXlzKSk7CisJaGFzaCA9IF9fX3NrYl9nZXRfaGFzaChza2IsICZrZXlzLCBoYXNocm5kKTsKKworCV9fc2tiX3NldF9zd19oYXNoKHNrYiwgaGFzaCwgZmxvd19rZXlzX2hhdmVfbDQoJmtleXMpKTsKIH0KIEVYUE9SVF9TWU1CT0woX19za2JfZ2V0X2hhc2gpOwogCkBAIC04NzIsOCArOTQ0LDggQEAKIAkJLm9mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBmbG93X2tleXMsIHBvcnRzKSwKIAl9LAogCXsKLQkJLmtleV9pZCA9IEZMT1dfRElTU0VDVE9SX0tFWV9WTEFOSUQsCi0JCS5vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgZmxvd19rZXlzLCB0YWdzKSwKKwkJLmtleV9pZCA9IEZMT1dfRElTU0VDVE9SX0tFWV9WTEFOLAorCQkub2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGZsb3dfa2V5cywgdmxhbiksCiAJfSwKIAl7CiAJCS5rZXlfaWQgPSBGTE9XX0RJU1NFQ1RPUl9LRVlfRkxPV19MQUJFTCwKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2x3dHVubmVsLmMgYi9uZXQvY29yZS9sd3R1bm5lbC5jCmluZGV4IDY2OWVjYzkuLmU1Zjg0YzIgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2x3dHVubmVsLmMKKysrIGIvbmV0L2NvcmUvbHd0dW5uZWwuYwpAQCAtMjUxLDYgKzI1MSw0MSBAQAogfQogRVhQT1JUX1NZTUJPTChsd3R1bm5lbF9vdXRwdXQpOwogCitpbnQgbHd0dW5uZWxfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IHNrYl9kc3Qoc2tiKTsKKwljb25zdCBzdHJ1Y3QgbHd0dW5uZWxfZW5jYXBfb3BzICpvcHM7CisJc3RydWN0IGx3dHVubmVsX3N0YXRlICpsd3RzdGF0ZTsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCWlmICghZHN0KQorCQlnb3RvIGRyb3A7CisKKwlsd3RzdGF0ZSA9IGRzdC0+bHd0c3RhdGU7CisKKwlpZiAobHd0c3RhdGUtPnR5cGUgPT0gTFdUVU5ORUxfRU5DQVBfTk9ORSB8fAorCSAgICBsd3RzdGF0ZS0+dHlwZSA+IExXVFVOTkVMX0VOQ0FQX01BWCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSAtRU9QTk9UU1VQUDsKKwlyY3VfcmVhZF9sb2NrKCk7CisJb3BzID0gcmN1X2RlcmVmZXJlbmNlKGx3dHVuX2VuY2Fwc1tsd3RzdGF0ZS0+dHlwZV0pOworCWlmIChsaWtlbHkob3BzICYmIG9wcy0+eG1pdCkpCisJCXJldCA9IG9wcy0+eG1pdChza2IpOworCXJjdV9yZWFkX3VubG9jaygpOworCisJaWYgKHJldCA9PSAtRU9QTk9UU1VQUCkKKwkJZ290byBkcm9wOworCisJcmV0dXJuIHJldDsKKworZHJvcDoKKwlrZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGx3dHVubmVsX3htaXQpOworCiBpbnQgbHd0dW5uZWxfaW5wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBza2JfZHN0KHNrYik7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9uZWlnaGJvdXIuYyBiL25ldC9jb3JlL25laWdoYm91ci5jCmluZGV4IGNmMjZlMDRjNC4uMmFlOTI5ZiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmVpZ2hib3VyLmMKKysrIGIvbmV0L2NvcmUvbmVpZ2hib3VyLmMKQEAgLTExNDgsNyArMTE0OCw4IEBACiAJCQl9IGVsc2UKIAkJCQlnb3RvIG91dDsKIAkJfSBlbHNlIHsKLQkJCWlmIChsbGFkZHIgPT0gbmVpZ2gtPmhhICYmIG5ldyA9PSBOVURfU1RBTEUpCisJCQlpZiAobGxhZGRyID09IG5laWdoLT5oYSAmJiBuZXcgPT0gTlVEX1NUQUxFICYmCisJCQkgICAgIShmbGFncyAmIE5FSUdIX1VQREFURV9GX0FETUlOKSkKIAkJCQluZXcgPSBvbGQ7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9uZXQvY29yZS9uZXRfbmFtZXNwYWNlLmMgYi9uZXQvY29yZS9uZXRfbmFtZXNwYWNlLmMKaW5kZXggMmMyZWIxYi4uOTg5NDM0ZiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmV0X25hbWVzcGFjZS5jCisrKyBiL25ldC9jb3JlL25ldF9uYW1lc3BhY2UuYwpAQCAtMzcsNiArMzcsOCBAQAogfTsKIEVYUE9SVF9TWU1CT0woaW5pdF9uZXQpOwogCitzdGF0aWMgYm9vbCBpbml0X25ldF9pbml0aWFsaXplZDsKKwogI2RlZmluZSBJTklUSUFMX05FVF9HRU5fUFRSUwkxMyAvKiArMSBmb3IgbGVuICsyIGZvciByY3VfaGVhZCAqLwogCiBzdGF0aWMgdW5zaWduZWQgaW50IG1heF9nZW5fcHRycyA9IElOSVRJQUxfTkVUX0dFTl9QVFJTOwpAQCAtMjEzLDMxICsyMTUsMjkgQEAKICAqLwogaW50IHBlZXJuZXQyaWRfYWxsb2Moc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgbmV0ICpwZWVyKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJYm9vbCBhbGxvYzsKIAlpbnQgaWQ7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbmV0LT5uc2lkX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfYmgoJm5ldC0+bnNpZF9sb2NrKTsKIAlhbGxvYyA9IGF0b21pY19yZWFkKCZwZWVyLT5jb3VudCkgPT0gMCA/IGZhbHNlIDogdHJ1ZTsKIAlpZCA9IF9fcGVlcm5ldDJpZF9hbGxvYyhuZXQsIHBlZXIsICZhbGxvYyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmV0LT5uc2lkX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19iaCgmbmV0LT5uc2lkX2xvY2spOwogCWlmIChhbGxvYyAmJiBpZCA+PSAwKQogCQlydG5sX25ldF9ub3RpZnlpZChuZXQsIFJUTV9ORVdOU0lELCBpZCk7CiAJcmV0dXJuIGlkOwogfQotRVhQT1JUX1NZTUJPTChwZWVybmV0MmlkX2FsbG9jKTsKIAogLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zLCBpZiBhc3NpZ25lZCwgdGhlIGlkIG9mIGEgcGVlciBuZXRucy4gKi8KIGludCBwZWVybmV0MmlkKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IG5ldCAqcGVlcikKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpZDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZuZXQtPm5zaWRfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19iaCgmbmV0LT5uc2lkX2xvY2spOwogCWlkID0gX19wZWVybmV0MmlkKG5ldCwgcGVlcik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmV0LT5uc2lkX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19iaCgmbmV0LT5uc2lkX2xvY2spOwogCXJldHVybiBpZDsKIH0KK0VYUE9SVF9TWU1CT0wocGVlcm5ldDJpZCk7CiAKIC8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlzIHRoZSBwZWVyIG5ldG5zIGhhcyBhbiBpZCBhc3NpZ25lZCBpbnRvIHRoZQogICogY3VycmVudCBuZXRucy4KQEAgLTI0OSwxOCArMjQ5LDE3IEBACiAKIHN0cnVjdCBuZXQgKmdldF9uZXRfbnNfYnlfaWQoc3RydWN0IG5ldCAqbmV0LCBpbnQgaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbmV0ICpwZWVyOwogCiAJaWYgKGlkIDwgMCkKIAkJcmV0dXJuIE5VTEw7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJm5ldC0+bnNpZF9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2JoKCZuZXQtPm5zaWRfbG9jayk7CiAJcGVlciA9IGlkcl9maW5kKCZuZXQtPm5ldG5zX2lkcywgaWQpOwogCWlmIChwZWVyKQogCQlnZXRfbmV0KHBlZXIpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5ldC0+bnNpZF9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfYmgoJm5ldC0+bnNpZF9sb2NrKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAogCXJldHVybiBwZWVyOwpAQCAtMzEwLDYgKzMwOSwxNiBAQAogCiAKICNpZmRlZiBDT05GSUdfTkVUX05TCitzdGF0aWMgc3RydWN0IHVjb3VudHMgKmluY19uZXRfbmFtZXNwYWNlcyhzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zKQoreworCXJldHVybiBpbmNfdWNvdW50KG5zLCBjdXJyZW50X2V1aWQoKSwgVUNPVU5UX05FVF9OQU1FU1BBQ0VTKTsKK30KKworc3RhdGljIHZvaWQgZGVjX25ldF9uYW1lc3BhY2VzKHN0cnVjdCB1Y291bnRzICp1Y291bnRzKQoreworCWRlY191Y291bnQodWNvdW50cywgVUNPVU5UX05FVF9OQU1FU1BBQ0VTKTsKK30KKwogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpuZXRfY2FjaGVwOwogc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpuZXRuc193cTsKIApAQCAtMzUxLDE5ICszNjAsMjcgQEAKIHN0cnVjdCBuZXQgKmNvcHlfbmV0X25zKHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiAJCQlzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnVzZXJfbnMsIHN0cnVjdCBuZXQgKm9sZF9uZXQpCiB7CisJc3RydWN0IHVjb3VudHMgKnVjb3VudHM7CiAJc3RydWN0IG5ldCAqbmV0OwogCWludCBydjsKIAogCWlmICghKGZsYWdzICYgQ0xPTkVfTkVXTkVUKSkKIAkJcmV0dXJuIGdldF9uZXQob2xkX25ldCk7CiAKKwl1Y291bnRzID0gaW5jX25ldF9uYW1lc3BhY2VzKHVzZXJfbnMpOworCWlmICghdWNvdW50cykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT1NQQyk7CisKIAluZXQgPSBuZXRfYWxsb2MoKTsKLQlpZiAoIW5ldCkKKwlpZiAoIW5ldCkgeworCQlkZWNfbmV0X25hbWVzcGFjZXModWNvdW50cyk7CiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KIAogCWdldF91c2VyX25zKHVzZXJfbnMpOwogCiAJbXV0ZXhfbG9jaygmbmV0X211dGV4KTsKKwluZXQtPnVjb3VudHMgPSB1Y291bnRzOwogCXJ2ID0gc2V0dXBfbmV0KG5ldCwgdXNlcl9ucyk7CiAJaWYgKHJ2ID09IDApIHsKIAkJcnRubF9sb2NrKCk7CkBAIC0zNzIsNiArMzg5LDcgQEAKIAl9CiAJbXV0ZXhfdW5sb2NrKCZuZXRfbXV0ZXgpOwogCWlmIChydiA8IDApIHsKKwkJZGVjX25ldF9uYW1lc3BhY2VzKHVjb3VudHMpOwogCQlwdXRfdXNlcl9ucyh1c2VyX25zKTsKIAkJbmV0X2Ryb3BfbnMobmV0KTsKIAkJcmV0dXJuIEVSUl9QVFIocnYpOwpAQCAtNDA0LDE3ICs0MjIsMTcgQEAKIAkJZm9yX2VhY2hfbmV0KHRtcCkgewogCQkJaW50IGlkOwogCi0JCQlzcGluX2xvY2tfaXJxKCZ0bXAtPm5zaWRfbG9jayk7CisJCQlzcGluX2xvY2tfYmgoJnRtcC0+bnNpZF9sb2NrKTsKIAkJCWlkID0gX19wZWVybmV0MmlkKHRtcCwgbmV0KTsKIAkJCWlmIChpZCA+PSAwKQogCQkJCWlkcl9yZW1vdmUoJnRtcC0+bmV0bnNfaWRzLCBpZCk7Ci0JCQlzcGluX3VubG9ja19pcnEoJnRtcC0+bnNpZF9sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZ0bXAtPm5zaWRfbG9jayk7CiAJCQlpZiAoaWQgPj0gMCkKIAkJCQlydG5sX25ldF9ub3RpZnlpZCh0bXAsIFJUTV9ERUxOU0lELCBpZCk7CiAJCX0KLQkJc3Bpbl9sb2NrX2lycSgmbmV0LT5uc2lkX2xvY2spOworCQlzcGluX2xvY2tfYmgoJm5ldC0+bnNpZF9sb2NrKTsKIAkJaWRyX2Rlc3Ryb3koJm5ldC0+bmV0bnNfaWRzKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZuZXQtPm5zaWRfbG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZuZXQtPm5zaWRfbG9jayk7CiAKIAl9CiAJcnRubF91bmxvY2soKTsKQEAgLTQ0NCw2ICs0NjIsNyBAQAogCS8qIEZpbmFsbHkgaXQgaXMgc2FmZSB0byBmcmVlIG15IG5ldHdvcmsgbmFtZXNwYWNlIHN0cnVjdHVyZSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShuZXQsIHRtcCwgJm5ldF9leGl0X2xpc3QsIGV4aXRfbGlzdCkgewogCQlsaXN0X2RlbF9pbml0KCZuZXQtPmV4aXRfbGlzdCk7CisJCWRlY19uZXRfbmFtZXNwYWNlcyhuZXQtPnVjb3VudHMpOwogCQlwdXRfdXNlcl9ucyhuZXQtPnVzZXJfbnMpOwogCQluZXRfZHJvcF9ucyhuZXQpOwogCX0KQEAgLTUzMSw3ICs1NTAsNyBAQAogCS5leGl0ID0gbmV0X25zX25ldF9leGl0LAogfTsKIAotc3RhdGljIHN0cnVjdCBubGFfcG9saWN5IHJ0bmxfbmV0X3BvbGljeVtORVROU0FfTUFYICsgMV0gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgcnRubF9uZXRfcG9saWN5W05FVE5TQV9NQVggKyAxXSA9IHsKIAlbTkVUTlNBX05PTkVdCQk9IHsgLnR5cGUgPSBOTEFfVU5TUEVDIH0sCiAJW05FVE5TQV9OU0lEXQkJPSB7IC50eXBlID0gTkxBX1MzMiB9LAogCVtORVROU0FfUElEXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LApAQCAtNTQyLDcgKzU2MSw2IEBACiB7CiAJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2tiLT5zayk7CiAJc3RydWN0IG5sYXR0ciAqdGJbTkVUTlNBX01BWCArIDFdOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IG5ldCAqcGVlcjsKIAlpbnQgbnNpZCwgZXJyOwogCkBAIC01NjMsMTUgKzU4MSwxNSBAQAogCWlmIChJU19FUlIocGVlcikpCiAJCXJldHVybiBQVFJfRVJSKHBlZXIpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm5ldC0+bnNpZF9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2JoKCZuZXQtPm5zaWRfbG9jayk7CiAJaWYgKF9fcGVlcm5ldDJpZChuZXQsIHBlZXIpID49IDApIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmV0LT5uc2lkX2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfYmgoJm5ldC0+bnNpZF9sb2NrKTsKIAkJZXJyID0gLUVFWElTVDsKIAkJZ290byBvdXQ7CiAJfQogCiAJZXJyID0gYWxsb2NfbmV0aWQobmV0LCBwZWVyLCBuc2lkKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXQtPm5zaWRfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2JoKCZuZXQtPm5zaWRfbG9jayk7CiAJaWYgKGVyciA+PSAwKSB7CiAJCXJ0bmxfbmV0X25vdGlmeWlkKG5ldCwgUlRNX05FV05TSUQsIGVycik7CiAJCWVyciA9IDA7CkBAIC02OTMsMTEgKzcxMSwxMCBAQAogCQkuaWR4ID0gMCwKIAkJLnNfaWR4ID0gY2ItPmFyZ3NbMF0sCiAJfTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm5ldC0+bnNpZF9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2JoKCZuZXQtPm5zaWRfbG9jayk7CiAJaWRyX2Zvcl9lYWNoKCZuZXQtPm5ldG5zX2lkcywgcnRubF9uZXRfZHVtcGlkX29uZSwgJm5ldF9jYik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmV0LT5uc2lkX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19iaCgmbmV0LT5uc2lkX2xvY2spOwogCiAJY2ItPmFyZ3NbMF0gPSBuZXRfY2IuaWR4OwogCXJldHVybiBza2ItPmxlbjsKQEAgLTc1MCw2ICs3NjcsOCBAQAogCWlmIChzZXR1cF9uZXQoJmluaXRfbmV0LCAmaW5pdF91c2VyX25zKSkKIAkJcGFuaWMoIkNvdWxkIG5vdCBzZXR1cCB0aGUgaW5pdGlhbCBuZXR3b3JrIG5hbWVzcGFjZSIpOwogCisJaW5pdF9uZXRfaW5pdGlhbGl6ZWQgPSB0cnVlOworCiAJcnRubF9sb2NrKCk7CiAJbGlzdF9hZGRfdGFpbF9yY3UoJmluaXRfbmV0Lmxpc3QsICZuZXRfbmFtZXNwYWNlX2xpc3QpOwogCXJ0bmxfdW5sb2NrKCk7CkBAIC04MTEsMTUgKzgzMCwyNCBAQAogc3RhdGljIGludCBfX3JlZ2lzdGVyX3Blcm5ldF9vcGVyYXRpb25zKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCiAJCQkJCXN0cnVjdCBwZXJuZXRfb3BlcmF0aW9ucyAqb3BzKQogeworCWlmICghaW5pdF9uZXRfaW5pdGlhbGl6ZWQpIHsKKwkJbGlzdF9hZGRfdGFpbCgmb3BzLT5saXN0LCBsaXN0KTsKKwkJcmV0dXJuIDA7CisJfQorCiAJcmV0dXJuIG9wc19pbml0KG9wcywgJmluaXRfbmV0KTsKIH0KIAogc3RhdGljIHZvaWQgX191bnJlZ2lzdGVyX3Blcm5ldF9vcGVyYXRpb25zKHN0cnVjdCBwZXJuZXRfb3BlcmF0aW9ucyAqb3BzKQogewotCUxJU1RfSEVBRChuZXRfZXhpdF9saXN0KTsKLQlsaXN0X2FkZCgmaW5pdF9uZXQuZXhpdF9saXN0LCAmbmV0X2V4aXRfbGlzdCk7Ci0Jb3BzX2V4aXRfbGlzdChvcHMsICZuZXRfZXhpdF9saXN0KTsKLQlvcHNfZnJlZV9saXN0KG9wcywgJm5ldF9leGl0X2xpc3QpOworCWlmICghaW5pdF9uZXRfaW5pdGlhbGl6ZWQpIHsKKwkJbGlzdF9kZWwoJm9wcy0+bGlzdCk7CisJfSBlbHNlIHsKKwkJTElTVF9IRUFEKG5ldF9leGl0X2xpc3QpOworCQlsaXN0X2FkZCgmaW5pdF9uZXQuZXhpdF9saXN0LCAmbmV0X2V4aXRfbGlzdCk7CisJCW9wc19leGl0X2xpc3Qob3BzLCAmbmV0X2V4aXRfbGlzdCk7CisJCW9wc19mcmVlX2xpc3Qob3BzLCAmbmV0X2V4aXRfbGlzdCk7CisJfQogfQogCiAjZW5kaWYgLyogQ09ORklHX05FVF9OUyAqLwpAQCAtOTk2LDExICsxMDI0LDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5ldG5zX293bmVyKHN0cnVjdCBuc19jb21tb24gKm5zKQoreworCXJldHVybiB0b19uZXRfbnMobnMpLT51c2VyX25zOworfQorCiBjb25zdCBzdHJ1Y3QgcHJvY19uc19vcGVyYXRpb25zIG5ldG5zX29wZXJhdGlvbnMgPSB7CiAJLm5hbWUJCT0gIm5ldCIsCiAJLnR5cGUJCT0gQ0xPTkVfTkVXTkVULAogCS5nZXQJCT0gbmV0bnNfZ2V0LAogCS5wdXQJCT0gbmV0bnNfcHV0LAogCS5pbnN0YWxsCT0gbmV0bnNfaW5zdGFsbCwKKwkub3duZXIJCT0gbmV0bnNfb3duZXIsCiB9OwogI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvY29yZS9wa3RnZW4uYyBiL25ldC9jb3JlL3BrdGdlbi5jCmluZGV4IGJiZDExOGIuLjUyMTlhOWUgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3BrdGdlbi5jCisrKyBiL25ldC9jb3JlL3BrdGdlbi5jCkBAIC0yMjg2LDcgKzIyODYsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3BrdF9vdmVyaGVhZChzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikKIHsKLQlwa3RfZGV2LT5wa3Rfb3ZlcmhlYWQgPSBMTF9SRVNFUlZFRF9TUEFDRShwa3RfZGV2LT5vZGV2KTsKKwlwa3RfZGV2LT5wa3Rfb3ZlcmhlYWQgPSAwOwogCXBrdF9kZXYtPnBrdF9vdmVyaGVhZCArPSBwa3RfZGV2LT5ucl9sYWJlbHMqc2l6ZW9mKHUzMik7CiAJcGt0X2Rldi0+cGt0X292ZXJoZWFkICs9IFZMQU5fVEFHX1NJWkUocGt0X2Rldik7CiAJcGt0X2Rldi0+cGt0X292ZXJoZWFkICs9IFNWTEFOX1RBR19TSVpFKHBrdF9kZXYpOwpAQCAtMjc3NywxMyArMjc3NywxMyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnBrdGdlbl9hbGxvY19za2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYsCi0JCQkJCXVuc2lnbmVkIGludCBleHRyYWxlbikKKwkJCQkJc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpCiB7CisJdW5zaWduZWQgaW50IGV4dHJhbGVuID0gTExfUkVTRVJWRURfU1BBQ0UoZGV2KTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKLQl1bnNpZ25lZCBpbnQgc2l6ZSA9IHBrdF9kZXYtPmN1cl9wa3Rfc2l6ZSArIDY0ICsgZXh0cmFsZW4gKwotCQkJICAgIHBrdF9kZXYtPnBrdF9vdmVyaGVhZDsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKIAorCXNpemUgPSBwa3RfZGV2LT5jdXJfcGt0X3NpemUgKyA2NCArIGV4dHJhbGVuICsgcGt0X2Rldi0+cGt0X292ZXJoZWFkOwogCWlmIChwa3RfZGV2LT5mbGFncyAmIEZfTk9ERSkgewogCQlpbnQgbm9kZSA9IHBrdF9kZXYtPm5vZGUgPj0gMCA/IHBrdF9kZXYtPm5vZGUgOiBudW1hX25vZGVfaWQoKTsKIApAQCAtMjc5Niw4ICsyNzk2LDkgQEAKIAkJIHNrYiA9IF9fbmV0ZGV2X2FsbG9jX3NrYihkZXYsIHNpemUsIEdGUF9OT1dBSVQpOwogCX0KIAorCS8qIHRoZSBjYWxsZXIgcHJlLWZldGNoZXMgZnJvbSBza2ItPmRhdGEgYW5kIHJlc2VydmVzIGZvciB0aGUgbWFjIGhkciAqLwogCWlmIChsaWtlbHkoc2tiKSkKLQkJc2tiX3Jlc2VydmUoc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKTsKKwkJc2tiX3Jlc2VydmUoc2tiLCBleHRyYWxlbiAtIDE2KTsKIAogCXJldHVybiBza2I7CiB9CkBAIC0yODMwLDE2ICsyODMxLDE0IEBACiAJbW9kX2N1cl9oZWFkZXJzKHBrdF9kZXYpOwogCXF1ZXVlX21hcCA9IHBrdF9kZXYtPmN1cl9xdWV1ZV9tYXA7CiAKLQlkYXRhbGVuID0gKG9kZXYtPmhhcmRfaGVhZGVyX2xlbiArIDE2KSAmIH4weGY7Ci0KLQlza2IgPSBwa3RnZW5fYWxsb2Nfc2tiKG9kZXYsIHBrdF9kZXYsIGRhdGFsZW4pOworCXNrYiA9IHBrdGdlbl9hbGxvY19za2Iob2RldiwgcGt0X2Rldik7CiAJaWYgKCFza2IpIHsKIAkJc3ByaW50Zihwa3RfZGV2LT5yZXN1bHQsICJObyBtZW1vcnkiKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCiAJcHJlZmV0Y2h3KHNrYi0+ZGF0YSk7Ci0Jc2tiX3Jlc2VydmUoc2tiLCBkYXRhbGVuKTsKKwlza2JfcmVzZXJ2ZShza2IsIDE2KTsKIAogCS8qICBSZXNlcnZlIGZvciBldGhlcm5ldCBhbmQgSVAgaGVhZGVyICAqLwogCWV0aCA9IChfX3U4ICopIHNrYl9wdXNoKHNrYiwgMTQpOwpAQCAtMjk1OSw3ICsyOTU4LDcgQEAKIAltb2RfY3VyX2hlYWRlcnMocGt0X2Rldik7CiAJcXVldWVfbWFwID0gcGt0X2Rldi0+Y3VyX3F1ZXVlX21hcDsKIAotCXNrYiA9IHBrdGdlbl9hbGxvY19za2Iob2RldiwgcGt0X2RldiwgMTYpOworCXNrYiA9IHBrdGdlbl9hbGxvY19za2Iob2RldiwgcGt0X2Rldik7CiAJaWYgKCFza2IpIHsKIAkJc3ByaW50Zihwa3RfZGV2LT5yZXN1bHQsICJObyBtZW1vcnkiKTsKIAkJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9ydG5ldGxpbmsuYyBiL25ldC9jb3JlL3J0bmV0bGluay5jCmluZGV4IDE4OWNjNzguLmIwNmQyZjQgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3J0bmV0bGluay5jCisrKyBiL25ldC9jb3JlL3J0bmV0bGluay5jCkBAIC03MDQsNiArNzA0LDggQEAKIAkJCX0gZWxzZSBpZiAoaSA9PSBSVEFYX0ZFQVRVUkVTIC0gMSkgewogCQkJCXUzMiB1c2VyX2ZlYXR1cmVzID0gbWV0cmljc1tpXSAmIFJUQVhfRkVBVFVSRV9NQVNLOwogCisJCQkJaWYgKCF1c2VyX2ZlYXR1cmVzKQorCQkJCQljb250aW51ZTsKIAkJCQlCVUlMRF9CVUdfT04oUlRBWF9GRUFUVVJFX01BU0sgJiBEU1RfRkVBVFVSRV9NQVNLKTsKIAkJCQlpZiAobmxhX3B1dF91MzIoc2tiLCBpICsgMSwgdXNlcl9mZWF0dXJlcykpCiAJCQkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwpAQCAtODQxLDcgKzg0MywxMCBAQAogCQlzaXplICs9IG5sYV90b3RhbF9zaXplKG51bV92ZnMgKiBzaXplb2Yoc3RydWN0IG5sYXR0cikpOwogCQlzaXplICs9IG51bV92ZnMgKgogCQkJKG5sYV90b3RhbF9zaXplKHNpemVvZihzdHJ1Y3QgaWZsYV92Zl9tYWMpKSArCi0JCQkgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBpZmxhX3ZmX3ZsYW4pKSArCisJCQkgbmxhX3RvdGFsX3NpemUoTUFYX1ZMQU5fTElTVF9MRU4gKgorCQkJCQlzaXplb2Yoc3RydWN0IG5sYXR0cikpICsKKwkJCSBubGFfdG90YWxfc2l6ZShNQVhfVkxBTl9MSVNUX0xFTiAqCisJCQkJCXNpemVvZihzdHJ1Y3QgaWZsYV92Zl92bGFuX2luZm8pKSArCiAJCQkgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBpZmxhX3ZmX3Nwb29mY2hrKSkgKwogCQkJIG5sYV90b3RhbF9zaXplKHNpemVvZihzdHJ1Y3QgaWZsYV92Zl9yYXRlKSkgKwogCQkJIG5sYV90b3RhbF9zaXplKHNpemVvZihzdHJ1Y3QgaWZsYV92Zl9saW5rX3N0YXRlKSkgKwpAQCAtMTEwOSwxNCArMTExNCwxNSBAQAogCQkJCQkgICAgICAgc3RydWN0IG5sYXR0ciAqdmZpbmZvKQogewogCXN0cnVjdCBpZmxhX3ZmX3Jzc19xdWVyeV9lbiB2Zl9yc3NfcXVlcnlfZW47CisJc3RydWN0IG5sYXR0ciAqdmYsICp2ZnN0YXRzLCAqdmZ2bGFubGlzdDsKIAlzdHJ1Y3QgaWZsYV92Zl9saW5rX3N0YXRlIHZmX2xpbmtzdGF0ZTsKKwlzdHJ1Y3QgaWZsYV92Zl92bGFuX2luZm8gdmZfdmxhbl9pbmZvOwogCXN0cnVjdCBpZmxhX3ZmX3Nwb29mY2hrIHZmX3Nwb29mY2hrOwogCXN0cnVjdCBpZmxhX3ZmX3R4X3JhdGUgdmZfdHhfcmF0ZTsKIAlzdHJ1Y3QgaWZsYV92Zl9zdGF0cyB2Zl9zdGF0czsKIAlzdHJ1Y3QgaWZsYV92Zl90cnVzdCB2Zl90cnVzdDsKIAlzdHJ1Y3QgaWZsYV92Zl92bGFuIHZmX3ZsYW47CiAJc3RydWN0IGlmbGFfdmZfcmF0ZSB2Zl9yYXRlOwotCXN0cnVjdCBubGF0dHIgKnZmLCAqdmZzdGF0czsKIAlzdHJ1Y3QgaWZsYV92Zl9tYWMgdmZfbWFjOwogCXN0cnVjdCBpZmxhX3ZmX2luZm8gaXZpOwogCkBAIC0xMTMzLDExICsxMTM5LDE0IEBACiAJICogSUZMQV9WRl9MSU5LX1NUQVRFX0FVVE8gd2hpY2ggZXF1YWxzIHplcm8KIAkgKi8KIAlpdmkubGlua3N0YXRlID0gMDsKKwkvKiBWTEFOIFByb3RvY29sIGJ5IGRlZmF1bHQgaXMgODAyLjFRICovCisJaXZpLnZsYW5fcHJvdG8gPSBodG9ucyhFVEhfUF84MDIxUSk7CiAJaWYgKGRldi0+bmV0ZGV2X29wcy0+bmRvX2dldF92Zl9jb25maWcoZGV2LCB2ZnNfbnVtLCAmaXZpKSkKIAkJcmV0dXJuIDA7CiAKIAl2Zl9tYWMudmYgPQogCQl2Zl92bGFuLnZmID0KKwkJdmZfdmxhbl9pbmZvLnZmID0KIAkJdmZfcmF0ZS52ZiA9CiAJCXZmX3R4X3JhdGUudmYgPQogCQl2Zl9zcG9vZmNoay52ZiA9CkBAIC0xMTQ4LDYgKzExNTcsOSBAQAogCW1lbWNweSh2Zl9tYWMubWFjLCBpdmkubWFjLCBzaXplb2YoaXZpLm1hYykpOwogCXZmX3ZsYW4udmxhbiA9IGl2aS52bGFuOwogCXZmX3ZsYW4ucW9zID0gaXZpLnFvczsKKwl2Zl92bGFuX2luZm8udmxhbiA9IGl2aS52bGFuOworCXZmX3ZsYW5faW5mby5xb3MgPSBpdmkucW9zOworCXZmX3ZsYW5faW5mby52bGFuX3Byb3RvID0gaXZpLnZsYW5fcHJvdG87CiAJdmZfdHhfcmF0ZS5yYXRlID0gaXZpLm1heF90eF9yYXRlOwogCXZmX3JhdGUubWluX3R4X3JhdGUgPSBpdmkubWluX3R4X3JhdGU7CiAJdmZfcmF0ZS5tYXhfdHhfcmF0ZSA9IGl2aS5tYXhfdHhfcmF0ZTsKQEAgLTExNTYsMTAgKzExNjgsOCBAQAogCXZmX3Jzc19xdWVyeV9lbi5zZXR0aW5nID0gaXZpLnJzc19xdWVyeV9lbjsKIAl2Zl90cnVzdC5zZXR0aW5nID0gaXZpLnRydXN0ZWQ7CiAJdmYgPSBubGFfbmVzdF9zdGFydChza2IsIElGTEFfVkZfSU5GTyk7Ci0JaWYgKCF2ZikgewotCQlubGFfbmVzdF9jYW5jZWwoc2tiLCB2ZmluZm8pOwotCQlyZXR1cm4gLUVNU0dTSVpFOwotCX0KKwlpZiAoIXZmKQorCQlnb3RvIG5sYV9wdXRfdmZpbmZvX2ZhaWx1cmU7CiAJaWYgKG5sYV9wdXQoc2tiLCBJRkxBX1ZGX01BQywgc2l6ZW9mKHZmX21hYyksICZ2Zl9tYWMpIHx8CiAJICAgIG5sYV9wdXQoc2tiLCBJRkxBX1ZGX1ZMQU4sIHNpemVvZih2Zl92bGFuKSwgJnZmX3ZsYW4pIHx8CiAJICAgIG5sYV9wdXQoc2tiLCBJRkxBX1ZGX1JBVEUsIHNpemVvZih2Zl9yYXRlKSwKQEAgLTExNzUsMTcgKzExODUsMjMgQEAKIAkJICAgICZ2Zl9yc3NfcXVlcnlfZW4pIHx8CiAJICAgIG5sYV9wdXQoc2tiLCBJRkxBX1ZGX1RSVVNULAogCQkgICAgc2l6ZW9mKHZmX3RydXN0KSwgJnZmX3RydXN0KSkKLQkJcmV0dXJuIC1FTVNHU0laRTsKKwkJZ290byBubGFfcHV0X3ZmX2ZhaWx1cmU7CisJdmZ2bGFubGlzdCA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwgSUZMQV9WRl9WTEFOX0xJU1QpOworCWlmICghdmZ2bGFubGlzdCkKKwkJZ290byBubGFfcHV0X3ZmX2ZhaWx1cmU7CisJaWYgKG5sYV9wdXQoc2tiLCBJRkxBX1ZGX1ZMQU5fSU5GTywgc2l6ZW9mKHZmX3ZsYW5faW5mbyksCisJCSAgICAmdmZfdmxhbl9pbmZvKSkgeworCQlubGFfbmVzdF9jYW5jZWwoc2tiLCB2ZnZsYW5saXN0KTsKKwkJZ290byBubGFfcHV0X3ZmX2ZhaWx1cmU7CisJfQorCW5sYV9uZXN0X2VuZChza2IsIHZmdmxhbmxpc3QpOwogCW1lbXNldCgmdmZfc3RhdHMsIDAsIHNpemVvZih2Zl9zdGF0cykpOwogCWlmIChkZXYtPm5ldGRldl9vcHMtPm5kb19nZXRfdmZfc3RhdHMpCiAJCWRldi0+bmV0ZGV2X29wcy0+bmRvX2dldF92Zl9zdGF0cyhkZXYsIHZmc19udW0sCiAJCQkJCQkmdmZfc3RhdHMpOwogCXZmc3RhdHMgPSBubGFfbmVzdF9zdGFydChza2IsIElGTEFfVkZfU1RBVFMpOwotCWlmICghdmZzdGF0cykgewotCQlubGFfbmVzdF9jYW5jZWwoc2tiLCB2Zik7Ci0JCW5sYV9uZXN0X2NhbmNlbChza2IsIHZmaW5mbyk7Ci0JCXJldHVybiAtRU1TR1NJWkU7Ci0JfQorCWlmICghdmZzdGF0cykKKwkJZ290byBubGFfcHV0X3ZmX2ZhaWx1cmU7CiAJaWYgKG5sYV9wdXRfdTY0XzY0Yml0KHNrYiwgSUZMQV9WRl9TVEFUU19SWF9QQUNLRVRTLAogCQkJICAgICAgdmZfc3RhdHMucnhfcGFja2V0cywgSUZMQV9WRl9TVEFUU19QQUQpIHx8CiAJICAgIG5sYV9wdXRfdTY0XzY0Yml0KHNrYiwgSUZMQV9WRl9TVEFUU19UWF9QQUNLRVRTLApAQCAtMTE5NywxMSArMTIxMywxOSBAQAogCSAgICBubGFfcHV0X3U2NF82NGJpdChza2IsIElGTEFfVkZfU1RBVFNfQlJPQURDQVNULAogCQkJICAgICAgdmZfc3RhdHMuYnJvYWRjYXN0LCBJRkxBX1ZGX1NUQVRTX1BBRCkgfHwKIAkgICAgbmxhX3B1dF91NjRfNjRiaXQoc2tiLCBJRkxBX1ZGX1NUQVRTX01VTFRJQ0FTVCwKLQkJCSAgICAgIHZmX3N0YXRzLm11bHRpY2FzdCwgSUZMQV9WRl9TVEFUU19QQUQpKQotCQlyZXR1cm4gLUVNU0dTSVpFOworCQkJICAgICAgdmZfc3RhdHMubXVsdGljYXN0LCBJRkxBX1ZGX1NUQVRTX1BBRCkpIHsKKwkJbmxhX25lc3RfY2FuY2VsKHNrYiwgdmZzdGF0cyk7CisJCWdvdG8gbmxhX3B1dF92Zl9mYWlsdXJlOworCX0KIAlubGFfbmVzdF9lbmQoc2tiLCB2ZnN0YXRzKTsKIAlubGFfbmVzdF9lbmQoc2tiLCB2Zik7CiAJcmV0dXJuIDA7CisKK25sYV9wdXRfdmZfZmFpbHVyZToKKwlubGFfbmVzdF9jYW5jZWwoc2tiLCB2Zik7CitubGFfcHV0X3ZmaW5mb19mYWlsdXJlOgorCW5sYV9uZXN0X2NhbmNlbChza2IsIHZmaW5mbyk7CisJcmV0dXJuIC1FTVNHU0laRTsKIH0KIAogc3RhdGljIGludCBydG5sX2ZpbGxfbGlua19pZm1hcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMTQ0Niw2ICsxNDcwLDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBpZmxhX3ZmX3BvbGljeVtJRkxBX1ZGX01BWCsxXSA9IHsKIAlbSUZMQV9WRl9NQUNdCQk9IHsgLmxlbiA9IHNpemVvZihzdHJ1Y3QgaWZsYV92Zl9tYWMpIH0sCiAJW0lGTEFfVkZfVkxBTl0JCT0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCBpZmxhX3ZmX3ZsYW4pIH0sCisJW0lGTEFfVkZfVkxBTl9MSVNUXSAgICAgPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAogCVtJRkxBX1ZGX1RYX1JBVEVdCT0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCBpZmxhX3ZmX3R4X3JhdGUpIH0sCiAJW0lGTEFfVkZfU1BPT0ZDSEtdCT0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCBpZmxhX3ZmX3Nwb29mY2hrKSB9LAogCVtJRkxBX1ZGX1JBVEVdCQk9IHsgLmxlbiA9IHNpemVvZihzdHJ1Y3QgaWZsYV92Zl9yYXRlKSB9LApAQCAtMTcwMiw3ICsxNzI3LDM3IEBACiAJCWVyciA9IC1FT1BOT1RTVVBQOwogCQlpZiAob3BzLT5uZG9fc2V0X3ZmX3ZsYW4pCiAJCQllcnIgPSBvcHMtPm5kb19zZXRfdmZfdmxhbihkZXYsIGl2di0+dmYsIGl2di0+dmxhbiwKLQkJCQkJCSAgIGl2di0+cW9zKTsKKwkJCQkJCSAgIGl2di0+cW9zLAorCQkJCQkJICAgaHRvbnMoRVRIX1BfODAyMVEpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCWlmICh0YltJRkxBX1ZGX1ZMQU5fTElTVF0pIHsKKwkJc3RydWN0IGlmbGFfdmZfdmxhbl9pbmZvICppdnZsW01BWF9WTEFOX0xJU1RfTEVOXTsKKwkJc3RydWN0IG5sYXR0ciAqYXR0cjsKKwkJaW50IHJlbSwgbGVuID0gMDsKKworCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJaWYgKCFvcHMtPm5kb19zZXRfdmZfdmxhbikKKwkJCXJldHVybiBlcnI7CisKKwkJbmxhX2Zvcl9lYWNoX25lc3RlZChhdHRyLCB0YltJRkxBX1ZGX1ZMQU5fTElTVF0sIHJlbSkgeworCQkJaWYgKG5sYV90eXBlKGF0dHIpICE9IElGTEFfVkZfVkxBTl9JTkZPIHx8CisJCQkgICAgbmxhX2xlbihhdHRyKSA8IE5MQV9IRFJMRU4pIHsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWlmIChsZW4gPj0gTUFYX1ZMQU5fTElTVF9MRU4pCisJCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQkJaXZ2bFtsZW5dID0gbmxhX2RhdGEoYXR0cik7CisKKwkJCWxlbisrOworCQl9CisJCWlmIChsZW4gPT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWVyciA9IG9wcy0+bmRvX3NldF92Zl92bGFuKGRldiwgaXZ2bFswXS0+dmYsIGl2dmxbMF0tPnZsYW4sCisJCQkJCSAgIGl2dmxbMF0tPnFvcywgaXZ2bFswXS0+dmxhbl9wcm90byk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAl9CkBAIC0zMDY2LDcgKzMxMjEsNyBAQAogCXNlcSA9IGNiLT5ubGgtPm5sbXNnX3NlcTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoaGEsICZsaXN0LT5saXN0LCBsaXN0KSB7Ci0JCWlmICgqaWR4IDwgY2ItPmFyZ3NbMF0pCisJCWlmICgqaWR4IDwgY2ItPmFyZ3NbMl0pCiAJCQlnb3RvIHNraXA7CiAKIAkJZXJyID0gbmxtc2dfcG9wdWxhdGVfZmRiX2ZpbGwoc2tiLCBkZXYsIGhhLT5hZGRyLCAwLApAQCAtMzA5MywxOSArMzE0OCwxOCBAQAogCQkgICAgICBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCiAJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpmaWx0ZXJfZGV2LAotCQkgICAgICBpbnQgaWR4KQorCQkgICAgICBpbnQgKmlkeCkKIHsKIAlpbnQgZXJyOwogCiAJbmV0aWZfYWRkcl9sb2NrX2JoKGRldik7Ci0JZXJyID0gbmxtc2dfcG9wdWxhdGVfZmRiKHNrYiwgY2IsIGRldiwgJmlkeCwgJmRldi0+dWMpOworCWVyciA9IG5sbXNnX3BvcHVsYXRlX2ZkYihza2IsIGNiLCBkZXYsIGlkeCwgJmRldi0+dWMpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwotCW5sbXNnX3BvcHVsYXRlX2ZkYihza2IsIGNiLCBkZXYsICZpZHgsICZkZXYtPm1jKTsKKwlubG1zZ19wb3B1bGF0ZV9mZGIoc2tiLCBjYiwgZGV2LCBpZHgsICZkZXYtPm1jKTsKIG91dDoKIAluZXRpZl9hZGRyX3VubG9ja19iaChkZXYpOwotCWNiLT5hcmdzWzFdID0gZXJyOwotCXJldHVybiBpZHg7CisJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0wobmRvX2RmbHRfZmRiX2R1bXApOwogCkBAIC0zMTE4LDkgKzMxNzIsMTMgQEAKIAljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKmNvcHMgPSBOVUxMOwogCXN0cnVjdCBpZmluZm9tc2cgKmlmbSA9IG5sbXNnX2RhdGEoY2ItPm5saCk7CiAJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2tiLT5zayk7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CiAJaW50IGJycG9ydF9pZHggPSAwOwogCWludCBicl9pZHggPSAwOwotCWludCBpZHggPSAwOworCWludCBoLCBzX2g7CisJaW50IGlkeCA9IDAsIHNfaWR4OworCWludCBlcnIgPSAwOworCWludCBmaWR4ID0gMDsKIAogCWlmIChubG1zZ19wYXJzZShjYi0+bmxoLCBzaXplb2Yoc3RydWN0IGlmaW5mb21zZyksIHRiLCBJRkxBX01BWCwKIAkJCWlmbGFfcG9saWN5KSA9PSAwKSB7CkBAIC0zMTM4LDQ5ICszMTk2LDcxIEBACiAJCW9wcyA9IGJyX2Rldi0+bmV0ZGV2X29wczsKIAl9CiAKLQljYi0+YXJnc1sxXSA9IDA7Ci0JZm9yX2VhY2hfbmV0ZGV2KG5ldCwgZGV2KSB7Ci0JCWlmIChicnBvcnRfaWR4ICYmIChkZXYtPmlmaW5kZXggIT0gYnJwb3J0X2lkeCkpCi0JCQljb250aW51ZTsKKwlzX2ggPSBjYi0+YXJnc1swXTsKKwlzX2lkeCA9IGNiLT5hcmdzWzFdOwogCi0JCWlmICghYnJfaWR4KSB7IC8qIHVzZXIgZGlkIG5vdCBzcGVjaWZ5IGEgc3BlY2lmaWMgYnJpZGdlICovCi0JCQlpZiAoZGV2LT5wcml2X2ZsYWdzICYgSUZGX0JSSURHRV9QT1JUKSB7Ci0JCQkJYnJfZGV2ID0gbmV0ZGV2X21hc3Rlcl91cHBlcl9kZXZfZ2V0KGRldik7Ci0JCQkJY29wcyA9IGJyX2Rldi0+bmV0ZGV2X29wczsKKwlmb3IgKGggPSBzX2g7IGggPCBORVRERVZfSEFTSEVOVFJJRVM7IGgrKywgc19pZHggPSAwKSB7CisJCWlkeCA9IDA7CisJCWhlYWQgPSAmbmV0LT5kZXZfaW5kZXhfaGVhZFtoXTsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCBoZWFkLCBpbmRleF9obGlzdCkgeworCisJCQlpZiAoYnJwb3J0X2lkeCAmJiAoZGV2LT5pZmluZGV4ICE9IGJycG9ydF9pZHgpKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoIWJyX2lkeCkgeyAvKiB1c2VyIGRpZCBub3Qgc3BlY2lmeSBhIHNwZWNpZmljIGJyaWRnZSAqLworCQkJCWlmIChkZXYtPnByaXZfZmxhZ3MgJiBJRkZfQlJJREdFX1BPUlQpIHsKKwkJCQkJYnJfZGV2ID0gbmV0ZGV2X21hc3Rlcl91cHBlcl9kZXZfZ2V0KGRldik7CisJCQkJCWNvcHMgPSBicl9kZXYtPm5ldGRldl9vcHM7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoZGV2ICE9IGJyX2RldiAmJgorCQkJCSAgICAhKGRldi0+cHJpdl9mbGFncyAmIElGRl9CUklER0VfUE9SVCkpCisJCQkJCWNvbnRpbnVlOworCisJCQkJaWYgKGJyX2RldiAhPSBuZXRkZXZfbWFzdGVyX3VwcGVyX2Rldl9nZXQoZGV2KSAmJgorCQkJCSAgICAhKGRldi0+cHJpdl9mbGFncyAmIElGRl9FQlJJREdFKSkKKwkJCQkJY29udGludWU7CisJCQkJY29wcyA9IG9wczsKIAkJCX0KIAotCQl9IGVsc2UgewotCQkJaWYgKGRldiAhPSBicl9kZXYgJiYKLQkJCSAgICAhKGRldi0+cHJpdl9mbGFncyAmIElGRl9CUklER0VfUE9SVCkpCi0JCQkJY29udGludWU7CisJCQlpZiAoaWR4IDwgc19pZHgpCisJCQkJZ290byBjb250OwogCi0JCQlpZiAoYnJfZGV2ICE9IG5ldGRldl9tYXN0ZXJfdXBwZXJfZGV2X2dldChkZXYpICYmCi0JCQkgICAgIShkZXYtPnByaXZfZmxhZ3MgJiBJRkZfRUJSSURHRSkpCi0JCQkJY29udGludWU7CisJCQlpZiAoZGV2LT5wcml2X2ZsYWdzICYgSUZGX0JSSURHRV9QT1JUKSB7CisJCQkJaWYgKGNvcHMgJiYgY29wcy0+bmRvX2ZkYl9kdW1wKSB7CisJCQkJCWVyciA9IGNvcHMtPm5kb19mZGJfZHVtcChza2IsIGNiLAorCQkJCQkJCQlicl9kZXYsIGRldiwKKwkJCQkJCQkJJmZpZHgpOworCQkJCQlpZiAoZXJyID09IC1FTVNHU0laRSkKKwkJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCX0KIAotCQkJY29wcyA9IG9wczsKKwkJCWlmIChkZXYtPm5ldGRldl9vcHMtPm5kb19mZGJfZHVtcCkKKwkJCQllcnIgPSBkZXYtPm5ldGRldl9vcHMtPm5kb19mZGJfZHVtcChza2IsIGNiLAorCQkJCQkJCQkgICAgZGV2LCBOVUxMLAorCQkJCQkJCQkgICAgJmZpZHgpOworCQkJZWxzZQorCQkJCWVyciA9IG5kb19kZmx0X2ZkYl9kdW1wKHNrYiwgY2IsIGRldiwgTlVMTCwKKwkJCQkJCQkmZmlkeCk7CisJCQlpZiAoZXJyID09IC1FTVNHU0laRSkKKwkJCQlnb3RvIG91dDsKKworCQkJY29wcyA9IE5VTEw7CisKKwkJCS8qIHJlc2V0IGZkYiBvZmZzZXQgdG8gMCBmb3IgcmVzdCBvZiB0aGUgaW50ZXJmYWNlcyAqLworCQkJY2ItPmFyZ3NbMl0gPSAwOworCQkJZmlkeCA9IDA7Citjb250OgorCQkJaWR4Kys7CiAJCX0KLQotCQlpZiAoZGV2LT5wcml2X2ZsYWdzICYgSUZGX0JSSURHRV9QT1JUKSB7Ci0JCQlpZiAoY29wcyAmJiBjb3BzLT5uZG9fZmRiX2R1bXApCi0JCQkJaWR4ID0gY29wcy0+bmRvX2ZkYl9kdW1wKHNrYiwgY2IsIGJyX2RldiwgZGV2LAotCQkJCQkJCSBpZHgpOwotCQl9Ci0JCWlmIChjYi0+YXJnc1sxXSA9PSAtRU1TR1NJWkUpCi0JCQlicmVhazsKLQotCQlpZiAoZGV2LT5uZXRkZXZfb3BzLT5uZG9fZmRiX2R1bXApCi0JCQlpZHggPSBkZXYtPm5ldGRldl9vcHMtPm5kb19mZGJfZHVtcChza2IsIGNiLCBkZXYsIE5VTEwsCi0JCQkJCQkJICAgIGlkeCk7Ci0JCWVsc2UKLQkJCWlkeCA9IG5kb19kZmx0X2ZkYl9kdW1wKHNrYiwgY2IsIGRldiwgTlVMTCwgaWR4KTsKLQkJaWYgKGNiLT5hcmdzWzFdID09IC1FTVNHU0laRSkKLQkJCWJyZWFrOwotCi0JCWNvcHMgPSBOVUxMOwogCX0KIAotCWNiLT5hcmdzWzBdID0gaWR4Oworb3V0OgorCWNiLT5hcmdzWzBdID0gaDsKKwljYi0+YXJnc1sxXSA9IGlkeDsKKwljYi0+YXJnc1syXSA9IGZpZHg7CisKIAlyZXR1cm4gc2tiLT5sZW47CiB9CiAKQEAgLTM1NTAsNiArMzYzMCw5MSBAQAogCSAgICAgICAoIWlkeGF0dHIgfHwgaWR4YXR0ciA9PSBhdHRyaWQpOwogfQogCisjZGVmaW5lIElGTEFfT0ZGTE9BRF9YU1RBVFNfRklSU1QgKElGTEFfT0ZGTE9BRF9YU1RBVFNfVU5TUEVDICsgMSkKK3N0YXRpYyBpbnQgcnRubF9nZXRfb2ZmbG9hZF9zdGF0c19hdHRyX3NpemUoaW50IGF0dHJfaWQpCit7CisJc3dpdGNoIChhdHRyX2lkKSB7CisJY2FzZSBJRkxBX09GRkxPQURfWFNUQVRTX0NQVV9ISVQ6CisJCXJldHVybiBzaXplb2Yoc3RydWN0IHJ0bmxfbGlua19zdGF0czY0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydG5sX2dldF9vZmZsb2FkX3N0YXRzKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBpbnQgKnByaXZpZHgpCit7CisJc3RydWN0IG5sYXR0ciAqYXR0ciA9IE5VTEw7CisJaW50IGF0dHJfaWQsIHNpemU7CisJdm9pZCAqYXR0cl9kYXRhOworCWludCBlcnI7CisKKwlpZiAoIShkZXYtPm5ldGRldl9vcHMgJiYgZGV2LT5uZXRkZXZfb3BzLT5uZG9faGFzX29mZmxvYWRfc3RhdHMgJiYKKwkgICAgICBkZXYtPm5ldGRldl9vcHMtPm5kb19nZXRfb2ZmbG9hZF9zdGF0cykpCisJCXJldHVybiAtRU5PREFUQTsKKworCWZvciAoYXR0cl9pZCA9IElGTEFfT0ZGTE9BRF9YU1RBVFNfRklSU1Q7CisJICAgICBhdHRyX2lkIDw9IElGTEFfT0ZGTE9BRF9YU1RBVFNfTUFYOyBhdHRyX2lkKyspIHsKKwkJaWYgKGF0dHJfaWQgPCAqcHJpdmlkeCkKKwkJCWNvbnRpbnVlOworCisJCXNpemUgPSBydG5sX2dldF9vZmZsb2FkX3N0YXRzX2F0dHJfc2l6ZShhdHRyX2lkKTsKKwkJaWYgKCFzaXplKQorCQkJY29udGludWU7CisKKwkJaWYgKCFkZXYtPm5ldGRldl9vcHMtPm5kb19oYXNfb2ZmbG9hZF9zdGF0cyhhdHRyX2lkKSkKKwkJCWNvbnRpbnVlOworCisJCWF0dHIgPSBubGFfcmVzZXJ2ZV82NGJpdChza2IsIGF0dHJfaWQsIHNpemUsCisJCQkJCSBJRkxBX09GRkxPQURfWFNUQVRTX1VOU1BFQyk7CisJCWlmICghYXR0cikKKwkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJCWF0dHJfZGF0YSA9IG5sYV9kYXRhKGF0dHIpOworCQltZW1zZXQoYXR0cl9kYXRhLCAwLCBzaXplKTsKKwkJZXJyID0gZGV2LT5uZXRkZXZfb3BzLT5uZG9fZ2V0X29mZmxvYWRfc3RhdHMoYXR0cl9pZCwgZGV2LAorCQkJCQkJCSAgICAgYXR0cl9kYXRhKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZ2V0X29mZmxvYWRfc3RhdHNfZmFpbHVyZTsKKwl9CisKKwlpZiAoIWF0dHIpCisJCXJldHVybiAtRU5PREFUQTsKKworCSpwcml2aWR4ID0gMDsKKwlyZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorCWVyciA9IC1FTVNHU0laRTsKK2dldF9vZmZsb2FkX3N0YXRzX2ZhaWx1cmU6CisJKnByaXZpZHggPSBhdHRyX2lkOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcnRubF9nZXRfb2ZmbG9hZF9zdGF0c19zaXplKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IG5sYV9zaXplID0gMDsKKwlpbnQgYXR0cl9pZDsKKwlpbnQgc2l6ZTsKKworCWlmICghKGRldi0+bmV0ZGV2X29wcyAmJiBkZXYtPm5ldGRldl9vcHMtPm5kb19oYXNfb2ZmbG9hZF9zdGF0cyAmJgorCSAgICAgIGRldi0+bmV0ZGV2X29wcy0+bmRvX2dldF9vZmZsb2FkX3N0YXRzKSkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGF0dHJfaWQgPSBJRkxBX09GRkxPQURfWFNUQVRTX0ZJUlNUOworCSAgICAgYXR0cl9pZCA8PSBJRkxBX09GRkxPQURfWFNUQVRTX01BWDsgYXR0cl9pZCsrKSB7CisJCWlmICghZGV2LT5uZXRkZXZfb3BzLT5uZG9faGFzX29mZmxvYWRfc3RhdHMoYXR0cl9pZCkpCisJCQljb250aW51ZTsKKwkJc2l6ZSA9IHJ0bmxfZ2V0X29mZmxvYWRfc3RhdHNfYXR0cl9zaXplKGF0dHJfaWQpOworCQlubGFfc2l6ZSArPSBubGFfdG90YWxfc2l6ZV82NGJpdChzaXplKTsKKwl9CisKKwlpZiAobmxhX3NpemUgIT0gMCkKKwkJbmxhX3NpemUgKz0gbmxhX3RvdGFsX3NpemUoMCk7CisKKwlyZXR1cm4gbmxhX3NpemU7Cit9CisKIHN0YXRpYyBpbnQgcnRubF9maWxsX3N0YXRzaW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICAgICAgIGludCB0eXBlLCB1MzIgcGlkLCB1MzIgc2VxLCB1MzIgY2hhbmdlLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgaW50IGZpbHRlcl9tYXNrLApAQCAtMzU1OSw2ICszNzI0LDcgQEAKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKIAlzdHJ1Y3QgbmxhdHRyICphdHRyOwogCWludCBzX3ByaXZpZHggPSAqcHJpdmlkeDsKKwlpbnQgZXJyOwogCiAJQVNTRVJUX1JUTkwoKTsKIApAQCAtMzU4Nyw4ICszNzUzLDYgQEAKIAkJY29uc3Qgc3RydWN0IHJ0bmxfbGlua19vcHMgKm9wcyA9IGRldi0+cnRubF9saW5rX29wczsKIAogCQlpZiAob3BzICYmIG9wcy0+ZmlsbF9saW5reHN0YXRzKSB7Ci0JCQlpbnQgZXJyOwotCiAJCQkqaWR4YXR0ciA9IElGTEFfU1RBVFNfTElOS19YU1RBVFM7CiAJCQlhdHRyID0gbmxhX25lc3Rfc3RhcnQoc2tiLAogCQkJCQkgICAgICBJRkxBX1NUQVRTX0xJTktfWFNUQVRTKTsKQEAgLTM2MTIsOCArMzc3Niw2IEBACiAJCWlmIChtYXN0ZXIpCiAJCQlvcHMgPSBtYXN0ZXItPnJ0bmxfbGlua19vcHM7CiAJCWlmIChvcHMgJiYgb3BzLT5maWxsX2xpbmt4c3RhdHMpIHsKLQkJCWludCBlcnI7Ci0KIAkJCSppZHhhdHRyID0gSUZMQV9TVEFUU19MSU5LX1hTVEFUU19TTEFWRTsKIAkJCWF0dHIgPSBubGFfbmVzdF9zdGFydChza2IsCiAJCQkJCSAgICAgIElGTEFfU1RBVFNfTElOS19YU1RBVFNfU0xBVkUpOwpAQCAtMzYyOCw2ICszNzkwLDI0IEBACiAJCX0KIAl9CiAKKwlpZiAoc3RhdHNfYXR0cl92YWxpZChmaWx0ZXJfbWFzaywgSUZMQV9TVEFUU19MSU5LX09GRkxPQURfWFNUQVRTLAorCQkJICAgICAqaWR4YXR0cikpIHsKKwkJKmlkeGF0dHIgPSBJRkxBX1NUQVRTX0xJTktfT0ZGTE9BRF9YU1RBVFM7CisJCWF0dHIgPSBubGFfbmVzdF9zdGFydChza2IsIElGTEFfU1RBVFNfTElOS19PRkZMT0FEX1hTVEFUUyk7CisJCWlmICghYXR0cikKKwkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJCWVyciA9IHJ0bmxfZ2V0X29mZmxvYWRfc3RhdHMoc2tiLCBkZXYsIHByaXZpZHgpOworCQlpZiAoZXJyID09IC1FTk9EQVRBKQorCQkJbmxhX25lc3RfY2FuY2VsKHNrYiwgYXR0cik7CisJCWVsc2UKKwkJCW5sYV9uZXN0X2VuZChza2IsIGF0dHIpOworCisJCWlmIChlcnIgJiYgZXJyICE9IC1FTk9EQVRBKQorCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJCSppZHhhdHRyID0gMDsKKwl9CisKIAlubG1zZ19lbmQoc2tiLCBubGgpOwogCiAJcmV0dXJuIDA7CkBAIC0zNjQyLDEwICszODIyLDYgQEAKIAlyZXR1cm4gLUVNU0dTSVpFOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgaWZsYV9zdGF0c19wb2xpY3lbSUZMQV9TVEFUU19NQVggKyAxXSA9IHsKLQlbSUZMQV9TVEFUU19MSU5LXzY0XQk9IHsgLmxlbiA9IHNpemVvZihzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQpIH0sCi19OwotCiBzdGF0aWMgc2l6ZV90IGlmX25sbXNnX3N0YXRzX3NpemUoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgIHUzMiBmaWx0ZXJfbWFzaykKIHsKQEAgLTM2ODUsNiArMzg2MSw5IEBACiAJCX0KIAl9CiAKKwlpZiAoc3RhdHNfYXR0cl92YWxpZChmaWx0ZXJfbWFzaywgSUZMQV9TVEFUU19MSU5LX09GRkxPQURfWFNUQVRTLCAwKSkKKwkJc2l6ZSArPSBydG5sX2dldF9vZmZsb2FkX3N0YXRzX3NpemUoZGV2KTsKKwogCXJldHVybiBzaXplOwogfQogCmRpZmYgLS1naXQgYS9uZXQvY29yZS9za2J1ZmYuYyBiL25ldC9jb3JlL3NrYnVmZi5jCmluZGV4IDM4NjRiNGI2Li5jYmQxOWQyIDEwMDY0NAotLS0gYS9uZXQvY29yZS9za2J1ZmYuYworKysgYi9uZXQvY29yZS9za2J1ZmYuYwpAQCAtMjQ0NSw2ICsyNDQ1LDI1IEBACiBFWFBPUlRfU1lNQk9MKHNrYl9xdWV1ZV9wdXJnZSk7CiAKIC8qKgorICoJc2tiX3JidHJlZV9wdXJnZSAtIGVtcHR5IGEgc2tiIHJidHJlZQorICoJQHJvb3Q6IHJvb3Qgb2YgdGhlIHJidHJlZSB0byBlbXB0eQorICoKKyAqCURlbGV0ZSBhbGwgYnVmZmVycyBvbiBhbiAmc2tfYnVmZiByYnRyZWUuIEVhY2ggYnVmZmVyIGlzIHJlbW92ZWQgZnJvbQorICoJdGhlIGxpc3QgYW5kIG9uZSByZWZlcmVuY2UgZHJvcHBlZC4gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB0YWtlCisgKglhbnkgbG9jay4gU3luY2hyb25pemF0aW9uIHNob3VsZCBiZSBoYW5kbGVkIGJ5IHRoZSBjYWxsZXIgKGUuZy4sIFRDUAorICoJb3V0LW9mLW9yZGVyIHF1ZXVlIGlzIHByb3RlY3RlZCBieSB0aGUgc29ja2V0IGxvY2spLgorICovCit2b2lkIHNrYl9yYnRyZWVfcHVyZ2Uoc3RydWN0IHJiX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKm5leHQ7CisKKwlyYnRyZWVfcG9zdG9yZGVyX2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2tiLCBuZXh0LCByb290LCByYm5vZGUpCisJCWtmcmVlX3NrYihza2IpOworCisJKnJvb3QgPSBSQl9ST09UOworfQorCisvKioKICAqCXNrYl9xdWV1ZV9oZWFkIC0gcXVldWUgYSBidWZmZXIgYXQgdGhlIGxpc3QgaGVhZAogICoJQGxpc3Q6IGxpc3QgdG8gdXNlCiAgKglAbmV3c2s6IGJ1ZmZlciB0byBxdWV1ZQpAQCAtMzA3OCwxMSArMzA5NywzMSBAQAogCXNnID0gISEoZmVhdHVyZXMgJiBORVRJRl9GX1NHKTsKIAljc3VtID0gISFjYW5fY2hlY2tzdW1fcHJvdG9jb2woZmVhdHVyZXMsIHByb3RvKTsKIAotCS8qIEdTTyBwYXJ0aWFsIG9ubHkgcmVxdWlyZXMgdGhhdCB3ZSB0cmltIG9mZiBhbnkgZXhjZXNzIHRoYXQKLQkgKiBkb2Vzbid0IGZpdCBpbnRvIGFuIE1TUyBzaXplZCBibG9jaywgc28gdGFrZSBjYXJlIG9mIHRoYXQKLQkgKiBub3cuCi0JICovCi0JaWYgKHNnICYmIGNzdW0gJiYgKGZlYXR1cmVzICYgTkVUSUZfRl9HU09fUEFSVElBTCkpIHsKKwlpZiAoc2cgJiYgY3N1bSAmJiAobXNzICE9IEdTT19CWV9GUkFHUykpICB7CisJCWlmICghKGZlYXR1cmVzICYgTkVUSUZfRl9HU09fUEFSVElBTCkpIHsKKwkJCXN0cnVjdCBza19idWZmICppdGVyOworCisJCQlpZiAoIWxpc3Rfc2tiIHx8CisJCQkgICAgIW5ldF9nc29fb2soZmVhdHVyZXMsIHNrYl9zaGluZm8oaGVhZF9za2IpLT5nc29fdHlwZSkpCisJCQkJZ290byBub3JtYWw7CisKKwkJCS8qIFNwbGl0IHRoZSBidWZmZXIgYXQgdGhlIGZyYWdfbGlzdCBwb2ludGVyLgorCQkJICogVGhpcyBpcyBiYXNlZCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGFsbAorCQkJICogYnVmZmVycyBpbiB0aGUgY2hhaW4gZXhjbHVkaW5nIHRoZSBsYXN0CisJCQkgKiBjb250YWluaW5nIHRoZSBzYW1lIGFtb3VudCBvZiBkYXRhLgorCQkJICovCisJCQlza2Jfd2Fsa19mcmFncyhoZWFkX3NrYiwgaXRlcikgeworCQkJCWlmIChza2JfaGVhZGxlbihpdGVyKSkKKwkJCQkJZ290byBub3JtYWw7CisKKwkJCQlsZW4gLT0gaXRlci0+bGVuOworCQkJfQorCQl9CisKKwkJLyogR1NPIHBhcnRpYWwgb25seSByZXF1aXJlcyB0aGF0IHdlIHRyaW0gb2ZmIGFueSBleGNlc3MgdGhhdAorCQkgKiBkb2Vzbid0IGZpdCBpbnRvIGFuIE1TUyBzaXplZCBibG9jaywgc28gdGFrZSBjYXJlIG9mIHRoYXQKKwkJICogbm93LgorCQkgKi8KIAkJcGFydGlhbF9zZWdzID0gbGVuIC8gbXNzOwogCQlpZiAocGFydGlhbF9zZWdzID4gMSkKIAkJCW1zcyAqPSBwYXJ0aWFsX3NlZ3M7CkBAIC0zMDkwLDYgKzMxMjksNyBAQAogCQkJcGFydGlhbF9zZWdzID0gMDsKIAl9CiAKK25vcm1hbDoKIAloZWFkcm9vbSA9IHNrYl9oZWFkcm9vbShoZWFkX3NrYik7CiAJcG9zID0gc2tiX2hlYWRsZW4oaGVhZF9za2IpOwogCkBAIC0zMjgxLDIxICszMzIxLDI5IEBACiAJICovCiAJc2Vncy0+cHJldiA9IHRhaWw7CiAKLQkvKiBVcGRhdGUgR1NPIGluZm8gb24gZmlyc3Qgc2tiIGluIHBhcnRpYWwgc2VxdWVuY2UuICovCiAJaWYgKHBhcnRpYWxfc2VncykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqaXRlcjsKIAkJaW50IHR5cGUgPSBza2Jfc2hpbmZvKGhlYWRfc2tiKS0+Z3NvX3R5cGU7CisJCXVuc2lnbmVkIHNob3J0IGdzb19zaXplID0gc2tiX3NoaW5mbyhoZWFkX3NrYiktPmdzb19zaXplOwogCiAJCS8qIFVwZGF0ZSB0eXBlIHRvIGFkZCBwYXJ0aWFsIGFuZCB0aGVuIHJlbW92ZSBkb2RneSBpZiBzZXQgKi8KLQkJdHlwZSB8PSBTS0JfR1NPX1BBUlRJQUw7CisJCXR5cGUgfD0gKGZlYXR1cmVzICYgTkVUSUZfRl9HU09fUEFSVElBTCkgLyBORVRJRl9GX0dTT19QQVJUSUFMICogU0tCX0dTT19QQVJUSUFMOwogCQl0eXBlICY9IH5TS0JfR1NPX0RPREdZOwogCiAJCS8qIFVwZGF0ZSBHU08gaW5mbyBhbmQgcHJlcGFyZSB0byBzdGFydCB1cGRhdGluZyBoZWFkZXJzIG9uCiAJCSAqIG91ciB3YXkgYmFjayBkb3duIHRoZSBzdGFjayBvZiBwcm90b2NvbHMuCiAJCSAqLwotCQlza2Jfc2hpbmZvKHNlZ3MpLT5nc29fc2l6ZSA9IHNrYl9zaGluZm8oaGVhZF9za2IpLT5nc29fc2l6ZTsKLQkJc2tiX3NoaW5mbyhzZWdzKS0+Z3NvX3NlZ3MgPSBwYXJ0aWFsX3NlZ3M7Ci0JCXNrYl9zaGluZm8oc2VncyktPmdzb190eXBlID0gdHlwZTsKLQkJU0tCX0dTT19DQihzZWdzKS0+ZGF0YV9vZmZzZXQgPSBza2JfaGVhZHJvb20oc2VncykgKyBkb2Zmc2V0OworCQlmb3IgKGl0ZXIgPSBzZWdzOyBpdGVyOyBpdGVyID0gaXRlci0+bmV4dCkgeworCQkJc2tiX3NoaW5mbyhpdGVyKS0+Z3NvX3NpemUgPSBnc29fc2l6ZTsKKwkJCXNrYl9zaGluZm8oaXRlciktPmdzb19zZWdzID0gcGFydGlhbF9zZWdzOworCQkJc2tiX3NoaW5mbyhpdGVyKS0+Z3NvX3R5cGUgPSB0eXBlOworCQkJU0tCX0dTT19DQihpdGVyKS0+ZGF0YV9vZmZzZXQgPSBza2JfaGVhZHJvb20oaXRlcikgKyBkb2Zmc2V0OworCQl9CisKKwkJaWYgKHRhaWwtPmxlbiAtIGRvZmZzZXQgPD0gZ3NvX3NpemUpCisJCQlza2Jfc2hpbmZvKHRhaWwpLT5nc29fc2l6ZSA9IDA7CisJCWVsc2UgaWYgKHRhaWwgIT0gc2VncykKKwkJCXNrYl9zaGluZm8odGFpbCktPmdzb19zZWdzID0gRElWX1JPVU5EX1VQKHRhaWwtPmxlbiAtIGRvZmZzZXQsIGdzb19zaXplKTsKIAl9CiAKIAkvKiBGb2xsb3dpbmcgcGVybWl0cyBjb3JyZWN0IGJhY2twcmVzc3VyZSwgZm9yIHByb3RvY29scwpAQCAtNDQ3NCwxNyArNDUyMiwyNCBAQAogfQogRVhQT1JUX1NZTUJPTChza2JfZW5zdXJlX3dyaXRhYmxlKTsKIAotLyogcmVtb3ZlIFZMQU4gaGVhZGVyIGZyb20gcGFja2V0IGFuZCB1cGRhdGUgY3N1bSBhY2NvcmRpbmdseS4gKi8KLXN0YXRpYyBpbnQgX19za2Jfdmxhbl9wb3Aoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2ICp2bGFuX3RjaSkKKy8qIHJlbW92ZSBWTEFOIGhlYWRlciBmcm9tIHBhY2tldCBhbmQgdXBkYXRlIGNzdW0gYWNjb3JkaW5nbHkuCisgKiBleHBlY3RzIGEgbm9uIHNrYl92bGFuX3RhZ19wcmVzZW50IHNrYiB3aXRoIGEgdmxhbiB0YWcgcGF5bG9hZAorICovCitpbnQgX19za2Jfdmxhbl9wb3Aoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2ICp2bGFuX3RjaSkKIHsKIAlzdHJ1Y3Qgdmxhbl9oZHIgKnZoZHI7Ci0JdW5zaWduZWQgaW50IG9mZnNldCA9IHNrYi0+ZGF0YSAtIHNrYl9tYWNfaGVhZGVyKHNrYik7CisJaW50IG9mZnNldCA9IHNrYi0+ZGF0YSAtIHNrYl9tYWNfaGVhZGVyKHNrYik7CiAJaW50IGVycjsKIAotCV9fc2tiX3B1c2goc2tiLCBvZmZzZXQpOworCWlmIChXQVJOX09OQ0Uob2Zmc2V0LAorCQkgICAgICAiX19za2Jfdmxhbl9wb3AgZ290IHNrYiB3aXRoIHNrYi0+ZGF0YSBub3QgYXQgbWFjIGhlYWRlciAob2Zmc2V0ICVkKVxuIiwKKwkJICAgICAgb2Zmc2V0KSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAllcnIgPSBza2JfZW5zdXJlX3dyaXRhYmxlKHNrYiwgVkxBTl9FVEhfSExFTik7CiAJaWYgKHVubGlrZWx5KGVycikpCi0JCWdvdG8gcHVsbDsKKwkJcmV0dXJuIGVycjsKIAogCXNrYl9wb3N0cHVsbF9yY3N1bShza2IsIHNrYi0+ZGF0YSArICgyICogRVRIX0FMRU4pLCBWTEFOX0hMRU4pOwogCkBAIC00NTAxLDEyICs0NTU2LDE0IEBACiAJCXNrYl9zZXRfbmV0d29ya19oZWFkZXIoc2tiLCBFVEhfSExFTik7CiAKIAlza2JfcmVzZXRfbWFjX2xlbihza2IpOwotcHVsbDoKLQlfX3NrYl9wdWxsKHNrYiwgb2Zmc2V0KTsKIAogCXJldHVybiBlcnI7CiB9CitFWFBPUlRfU1lNQk9MKF9fc2tiX3ZsYW5fcG9wKTsKIAorLyogUG9wIGEgdmxhbiB0YWcgZWl0aGVyIGZyb20gaHdhY2NlbCBvciBmcm9tIHBheWxvYWQuCisgKiBFeHBlY3RzIHNrYi0+ZGF0YSBhdCBtYWMgaGVhZGVyLgorICovCiBpbnQgc2tiX3ZsYW5fcG9wKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJdTE2IHZsYW5fdGNpOwpAQCAtNDUxNiw5ICs0NTczLDcgQEAKIAlpZiAobGlrZWx5KHNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikpKSB7CiAJCXNrYi0+dmxhbl90Y2kgPSAwOwogCX0gZWxzZSB7Ci0JCWlmICh1bmxpa2VseSgoc2tiLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF84MDIxUSkgJiYKLQkJCSAgICAgIHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfODAyMUFEKSkgfHwKLQkJCSAgICAgc2tiLT5sZW4gPCBWTEFOX0VUSF9ITEVOKSkKKwkJaWYgKHVubGlrZWx5KCFldGhfdHlwZV92bGFuKHNrYi0+cHJvdG9jb2wpKSkKIAkJCXJldHVybiAwOwogCiAJCWVyciA9IF9fc2tiX3ZsYW5fcG9wKHNrYiwgJnZsYW5fdGNpKTsKQEAgLTQ1MjYsOSArNDU4MSw3IEBACiAJCQlyZXR1cm4gZXJyOwogCX0KIAkvKiBtb3ZlIG5leHQgdmxhbiB0YWcgdG8gaHcgYWNjZWwgdGFnICovCi0JaWYgKGxpa2VseSgoc2tiLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF84MDIxUSkgJiYKLQkJICAgIHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfODAyMUFEKSkgfHwKLQkJICAgc2tiLT5sZW4gPCBWTEFOX0VUSF9ITEVOKSkKKwlpZiAobGlrZWx5KCFldGhfdHlwZV92bGFuKHNrYi0+cHJvdG9jb2wpKSkKIAkJcmV0dXJuIDA7CiAKIAl2bGFuX3Byb3RvID0gc2tiLT5wcm90b2NvbDsKQEAgLTQ1NDEsMjkgKzQ1OTQsMzAgQEAKIH0KIEVYUE9SVF9TWU1CT0woc2tiX3ZsYW5fcG9wKTsKIAorLyogUHVzaCBhIHZsYW4gdGFnIGVpdGhlciBpbnRvIGh3YWNjZWwgb3IgaW50byBwYXlsb2FkIChpZiBod2FjY2VsIHRhZyBwcmVzZW50KS4KKyAqIEV4cGVjdHMgc2tiLT5kYXRhIGF0IG1hYyBoZWFkZXIuCisgKi8KIGludCBza2Jfdmxhbl9wdXNoKHN0cnVjdCBza19idWZmICpza2IsIF9fYmUxNiB2bGFuX3Byb3RvLCB1MTYgdmxhbl90Y2kpCiB7CiAJaWYgKHNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikpIHsKLQkJdW5zaWduZWQgaW50IG9mZnNldCA9IHNrYi0+ZGF0YSAtIHNrYl9tYWNfaGVhZGVyKHNrYik7CisJCWludCBvZmZzZXQgPSBza2ItPmRhdGEgLSBza2JfbWFjX2hlYWRlcihza2IpOwogCQlpbnQgZXJyOwogCi0JCS8qIF9fdmxhbl9pbnNlcnRfdGFnIGV4cGVjdCBza2ItPmRhdGEgcG9pbnRpbmcgdG8gbWFjIGhlYWRlci4KLQkJICogU28gY2hhbmdlIHNrYi0+ZGF0YSBiZWZvcmUgY2FsbGluZyBpdCBhbmQgY2hhbmdlIGJhY2sgdG8KLQkJICogb3JpZ2luYWwgcG9zaXRpb24gbGF0ZXIKLQkJICovCi0JCV9fc2tiX3B1c2goc2tiLCBvZmZzZXQpOworCQlpZiAoV0FSTl9PTkNFKG9mZnNldCwKKwkJCSAgICAgICJza2Jfdmxhbl9wdXNoIGdvdCBza2Igd2l0aCBza2ItPmRhdGEgbm90IGF0IG1hYyBoZWFkZXIgKG9mZnNldCAlZClcbiIsCisJCQkgICAgICBvZmZzZXQpKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCiAJCWVyciA9IF9fdmxhbl9pbnNlcnRfdGFnKHNrYiwgc2tiLT52bGFuX3Byb3RvLAogCQkJCQlza2Jfdmxhbl90YWdfZ2V0KHNrYikpOwotCQlpZiAoZXJyKSB7Ci0JCQlfX3NrYl9wdWxsKHNrYiwgb2Zmc2V0KTsKKwkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7Ci0JCX0KIAogCQlza2ItPnByb3RvY29sID0gc2tiLT52bGFuX3Byb3RvOwogCQlza2ItPm1hY19sZW4gKz0gVkxBTl9ITEVOOwogCiAJCXNrYl9wb3N0cHVzaF9yY3N1bShza2IsIHNrYi0+ZGF0YSArICgyICogRVRIX0FMRU4pLCBWTEFOX0hMRU4pOwotCQlfX3NrYl9wdWxsKHNrYiwgb2Zmc2V0KTsKIAl9CiAJX192bGFuX2h3YWNjZWxfcHV0X3RhZyhza2IsIHZsYW5fcHJvdG8sIHZsYW5fdGNpKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NvY2suYyBiL25ldC9jb3JlL3NvY2suYwppbmRleCAyNWRhYjhiLi4wMzhlNjYwIDEwMDY0NAotLS0gYS9uZXQvY29yZS9zb2NrLmMKKysrIGIvbmV0L2NvcmUvc29jay5jCkBAIC0xMzE1LDI0ICsxMzE1LDYgQEAKICNlbmRpZgogfQogCi12b2lkIHNrX3Byb3RfY2xlYXJfcG9ydGFkZHJfbnVsbHMoc3RydWN0IHNvY2sgKnNrLCBpbnQgc2l6ZSkKLXsKLQl1bnNpZ25lZCBsb25nIG51bGxzMSwgbnVsbHMyOwotCi0JbnVsbHMxID0gb2Zmc2V0b2Yoc3RydWN0IHNvY2ssIF9fc2tfY29tbW9uLnNrY19ub2RlLm5leHQpOwotCW51bGxzMiA9IG9mZnNldG9mKHN0cnVjdCBzb2NrLCBfX3NrX2NvbW1vbi5za2NfcG9ydGFkZHJfbm9kZS5uZXh0KTsKLQlpZiAobnVsbHMxID4gbnVsbHMyKQotCQlzd2FwKG51bGxzMSwgbnVsbHMyKTsKLQotCWlmIChudWxsczEgIT0gMCkKLQkJbWVtc2V0KChjaGFyICopc2ssIDAsIG51bGxzMSk7Ci0JbWVtc2V0KChjaGFyICopc2sgKyBudWxsczEgKyBzaXplb2Yodm9pZCAqKSwgMCwKLQkgICAgICAgbnVsbHMyIC0gbnVsbHMxIC0gc2l6ZW9mKHZvaWQgKikpOwotCW1lbXNldCgoY2hhciAqKXNrICsgbnVsbHMyICsgc2l6ZW9mKHZvaWQgKiksIDAsCi0JICAgICAgIHNpemUgLSBudWxsczIgLSBzaXplb2Yodm9pZCAqKSk7Ci19Ci1FWFBPUlRfU1lNQk9MKHNrX3Byb3RfY2xlYXJfcG9ydGFkZHJfbnVsbHMpOwotCiBzdGF0aWMgc3RydWN0IHNvY2sgKnNrX3Byb3RfYWxsb2Moc3RydWN0IHByb3RvICpwcm90LCBnZnBfdCBwcmlvcml0eSwKIAkJaW50IGZhbWlseSkKIHsKQEAgLTEzNDQsMTIgKzEzMjYsOCBAQAogCQlzayA9IGttZW1fY2FjaGVfYWxsb2Moc2xhYiwgcHJpb3JpdHkgJiB+X19HRlBfWkVSTyk7CiAJCWlmICghc2spCiAJCQlyZXR1cm4gc2s7Ci0JCWlmIChwcmlvcml0eSAmIF9fR0ZQX1pFUk8pIHsKLQkJCWlmIChwcm90LT5jbGVhcl9zaykKLQkJCQlwcm90LT5jbGVhcl9zayhzaywgcHJvdC0+b2JqX3NpemUpOwotCQkJZWxzZQotCQkJCXNrX3Byb3RfY2xlYXJfbnVsbHMoc2ssIHByb3QtPm9ial9zaXplKTsKLQkJfQorCQlpZiAocHJpb3JpdHkgJiBfX0dGUF9aRVJPKQorCQkJc2tfcHJvdF9jbGVhcl9udWxscyhzaywgcHJvdC0+b2JqX3NpemUpOwogCX0gZWxzZQogCQlzayA9IGttYWxsb2MocHJvdC0+b2JqX3NpemUsIHByaW9yaXR5KTsKIApAQCAtMTM2Miw3ICsxMzQwLDYgQEAKIAkJaWYgKCF0cnlfbW9kdWxlX2dldChwcm90LT5vd25lcikpCiAJCQlnb3RvIG91dF9mcmVlX3NlYzsKIAkJc2tfdHhfcXVldWVfY2xlYXIoc2spOwotCQljZ3JvdXBfc2tfYWxsb2MoJnNrLT5za19jZ3JwX2RhdGEpOwogCX0KIAogCXJldHVybiBzazsKQEAgLTE0MjIsNiArMTM5OSw3IEBACiAJCXNvY2tfbmV0X3NldChzaywgbmV0KTsKIAkJYXRvbWljX3NldCgmc2stPnNrX3dtZW1fYWxsb2MsIDEpOwogCisJCWNncm91cF9za19hbGxvYygmc2stPnNrX2NncnBfZGF0YSk7CiAJCXNvY2tfdXBkYXRlX2NsYXNzaWQoJnNrLT5za19jZ3JwX2RhdGEpOwogCQlzb2NrX3VwZGF0ZV9uZXRwcmlvaWR4KCZzay0+c2tfY2dycF9kYXRhKTsKIAl9CkBAIC0xNTY2LDYgKzE1NDQsOSBAQAogCQluZXdzay0+c2tfcHJpb3JpdHkgPSAwOwogCQluZXdzay0+c2tfaW5jb21pbmdfY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKIAkJYXRvbWljNjRfc2V0KCZuZXdzay0+c2tfY29va2llLCAwKTsKKworCQljZ3JvdXBfc2tfYWxsb2MoJm5ld3NrLT5za19jZ3JwX2RhdGEpOworCiAJCS8qCiAJCSAqIEJlZm9yZSB1cGRhdGluZyBza19yZWZjbnQsIHdlIG11c3QgY29tbWl0IHByaW9yIGNoYW5nZXMgdG8gbWVtb3J5CiAJCSAqIChEb2N1bWVudGF0aW9uL1JDVS9yY3VsaXN0X251bGxzLnR4dCBmb3IgZGV0YWlscykKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3N0cmVhbS5jIGIvbmV0L2NvcmUvc3RyZWFtLmMKaW5kZXggMTU5NTE2YS4uMTA4NmM4YiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc3RyZWFtLmMKKysrIGIvbmV0L2NvcmUvc3RyZWFtLmMKQEAgLTQzLDcgKzQzLDYgQEAKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJfQogfQotRVhQT1JUX1NZTUJPTChza19zdHJlYW1fd3JpdGVfc3BhY2UpOwogCiAvKioKICAqIHNrX3N0cmVhbV93YWl0X2Nvbm5lY3QgLSBXYWl0IGZvciBhIHNvY2tldCB0byBnZXQgaW50byB0aGUgY29ubmVjdGVkIHN0YXRlCmRpZmYgLS1naXQgYS9uZXQvZHNhL0tjb25maWcgYi9uZXQvZHNhL0tjb25maWcKaW5kZXggZmY3NzM2Zi4uOTZlNDdjNSAxMDA2NDQKLS0tIGEvbmV0L2RzYS9LY29uZmlnCisrKyBiL25ldC9kc2EvS2NvbmZpZwpAQCAtMzgsNCArMzgsNyBAQAogY29uZmlnIE5FVF9EU0FfVEFHX1RSQUlMRVIKIAlib29sCiAKK2NvbmZpZyBORVRfRFNBX1RBR19RQ0EKKwlib29sCisKIGVuZGlmCmRpZmYgLS1naXQgYS9uZXQvZHNhL01ha2VmaWxlIGIvbmV0L2RzYS9NYWtlZmlsZQppbmRleCA4YWY0ZGVkLi5hMzM4MGVkIDEwMDY0NAotLS0gYS9uZXQvZHNhL01ha2VmaWxlCisrKyBiL25ldC9kc2EvTWFrZWZpbGUKQEAgLTcsMyArNyw0IEBACiBkc2FfY29yZS0kKENPTkZJR19ORVRfRFNBX1RBR19EU0EpICs9IHRhZ19kc2EubwogZHNhX2NvcmUtJChDT05GSUdfTkVUX0RTQV9UQUdfRURTQSkgKz0gdGFnX2Vkc2EubwogZHNhX2NvcmUtJChDT05GSUdfTkVUX0RTQV9UQUdfVFJBSUxFUikgKz0gdGFnX3RyYWlsZXIubworZHNhX2NvcmUtJChDT05GSUdfTkVUX0RTQV9UQUdfUUNBKSArPSB0YWdfcWNhLm8KZGlmZiAtLWdpdCBhL25ldC9kc2EvZHNhLmMgYi9uZXQvZHNhL2RzYS5jCmluZGV4IDdlNjhiYzYuLmE2OTAyYzEgMTAwNjQ0Ci0tLSBhL25ldC9kc2EvZHNhLmMKKysrIGIvbmV0L2RzYS9kc2EuYwpAQCAtNTQsNiArNTQsOSBAQAogI2lmZGVmIENPTkZJR19ORVRfRFNBX1RBR19CUkNNCiAJW0RTQV9UQUdfUFJPVE9fQlJDTV0gPSAmYnJjbV9uZXRkZXZfb3BzLAogI2VuZGlmCisjaWZkZWYgQ09ORklHX05FVF9EU0FfVEFHX1FDQQorCVtEU0FfVEFHX1BST1RPX1FDQV0gPSAmcWNhX25ldGRldl9vcHMsCisjZW5kaWYKIAlbRFNBX1RBR19QUk9UT19OT05FXSA9ICZub25lX29wcywKIH07CiAKQEAgLTYxLDI3ICs2NCwyNyBAQAogc3RhdGljIERFRklORV9NVVRFWChkc2Ffc3dpdGNoX2RyaXZlcnNfbXV0ZXgpOwogc3RhdGljIExJU1RfSEVBRChkc2Ffc3dpdGNoX2RyaXZlcnMpOwogCi12b2lkIHJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyICpkcnYpCit2b2lkIHJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoc3RydWN0IGRzYV9zd2l0Y2hfb3BzICpvcHMpCiB7CiAJbXV0ZXhfbG9jaygmZHNhX3N3aXRjaF9kcml2ZXJzX211dGV4KTsKLQlsaXN0X2FkZF90YWlsKCZkcnYtPmxpc3QsICZkc2Ffc3dpdGNoX2RyaXZlcnMpOworCWxpc3RfYWRkX3RhaWwoJm9wcy0+bGlzdCwgJmRzYV9zd2l0Y2hfZHJpdmVycyk7CiAJbXV0ZXhfdW5sb2NrKCZkc2Ffc3dpdGNoX2RyaXZlcnNfbXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocmVnaXN0ZXJfc3dpdGNoX2RyaXZlcik7CiAKLXZvaWQgdW5yZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKHN0cnVjdCBkc2Ffc3dpdGNoX2RyaXZlciAqZHJ2KQordm9pZCB1bnJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoc3RydWN0IGRzYV9zd2l0Y2hfb3BzICpvcHMpCiB7CiAJbXV0ZXhfbG9jaygmZHNhX3N3aXRjaF9kcml2ZXJzX211dGV4KTsKLQlsaXN0X2RlbF9pbml0KCZkcnYtPmxpc3QpOworCWxpc3RfZGVsX2luaXQoJm9wcy0+bGlzdCk7CiAJbXV0ZXhfdW5sb2NrKCZkc2Ffc3dpdGNoX2RyaXZlcnNfbXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodW5yZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKTsKIAotc3RhdGljIHN0cnVjdCBkc2Ffc3dpdGNoX2RyaXZlciAqCitzdGF0aWMgc3RydWN0IGRzYV9zd2l0Y2hfb3BzICoKIGRzYV9zd2l0Y2hfcHJvYmUoc3RydWN0IGRldmljZSAqcGFyZW50LCBzdHJ1Y3QgZGV2aWNlICpob3N0X2RldiwgaW50IHN3X2FkZHIsCiAJCSBjb25zdCBjaGFyICoqX25hbWUsIHZvaWQgKipwcml2KQogewotCXN0cnVjdCBkc2Ffc3dpdGNoX2RyaXZlciAqcmV0OworCXN0cnVjdCBkc2Ffc3dpdGNoX29wcyAqcmV0OwogCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAJY29uc3QgY2hhciAqbmFtZTsKIApAQCAtOTAsMTMgKzkzLDEzIEBACiAKIAltdXRleF9sb2NrKCZkc2Ffc3dpdGNoX2RyaXZlcnNfbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2gobGlzdCwgJmRzYV9zd2l0Y2hfZHJpdmVycykgewotCQlzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgKmRydjsKKwkJc3RydWN0IGRzYV9zd2l0Y2hfb3BzICpvcHM7CiAKLQkJZHJ2ID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIsIGxpc3QpOworCQlvcHMgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBkc2Ffc3dpdGNoX29wcywgbGlzdCk7CiAKLQkJbmFtZSA9IGRydi0+cHJvYmUocGFyZW50LCBob3N0X2Rldiwgc3dfYWRkciwgcHJpdik7CisJCW5hbWUgPSBvcHMtPnByb2JlKHBhcmVudCwgaG9zdF9kZXYsIHN3X2FkZHIsIHByaXYpOwogCQlpZiAobmFtZSAhPSBOVUxMKSB7Ci0JCQlyZXQgPSBkcnY7CisJCQlyZXQgPSBvcHM7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTExNyw3ICsxMjAsNyBAQAogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCB0ZW1wLCByZXQ7CiAKLQlyZXQgPSBkcy0+ZHJ2LT5nZXRfdGVtcChkcywgJnRlbXApOworCXJldCA9IGRzLT5vcHMtPmdldF90ZW1wKGRzLCAmdGVtcCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTEzMSw3ICsxMzQsNyBAQAogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWludCB0ZW1wLCByZXQ7CiAKLQlyZXQgPSBkcy0+ZHJ2LT5nZXRfdGVtcF9saW1pdChkcywgJnRlbXApOworCXJldCA9IGRzLT5vcHMtPmdldF90ZW1wX2xpbWl0KGRzLCAmdGVtcCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTE0OSw3ICsxNTIsNyBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gZHMtPmRydi0+c2V0X3RlbXBfbGltaXQoZHMsIERJVl9ST1VORF9DTE9TRVNUKHRlbXAsIDEwMDApKTsKKwlyZXQgPSBkcy0+b3BzLT5zZXRfdGVtcF9saW1pdChkcywgRElWX1JPVU5EX0NMT1NFU1QodGVtcCwgMTAwMCkpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0xNjQsNyArMTY3LDcgQEAKIAlib29sIGFsYXJtOwogCWludCByZXQ7CiAKLQlyZXQgPSBkcy0+ZHJ2LT5nZXRfdGVtcF9hbGFybShkcywgJmFsYXJtKTsKKwlyZXQgPSBkcy0+b3BzLT5nZXRfdGVtcF9hbGFybShkcywgJmFsYXJtKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTg0LDE1ICsxODcsMTUgQEAKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyICpkcnYgPSBkcy0+ZHJ2OworCXN0cnVjdCBkc2Ffc3dpdGNoX29wcyAqb3BzID0gZHMtPm9wczsKIAl1bW9kZV90IG1vZGUgPSBhdHRyLT5tb2RlOwogCiAJaWYgKGluZGV4ID09IDEpIHsKLQkJaWYgKCFkcnYtPmdldF90ZW1wX2xpbWl0KQorCQlpZiAoIW9wcy0+Z2V0X3RlbXBfbGltaXQpCiAJCQltb2RlID0gMDsKLQkJZWxzZSBpZiAoIWRydi0+c2V0X3RlbXBfbGltaXQpCisJCWVsc2UgaWYgKCFvcHMtPnNldF90ZW1wX2xpbWl0KQogCQkJbW9kZSAmPSB+U19JV1VTUjsKLQl9IGVsc2UgaWYgKGluZGV4ID09IDIgJiYgIWRydi0+Z2V0X3RlbXBfYWxhcm0pIHsKKwl9IGVsc2UgaWYgKGluZGV4ID09IDIgJiYgIW9wcy0+Z2V0X3RlbXBfYWxhcm0pIHsKIAkJbW9kZSA9IDA7CiAJfQogCXJldHVybiBtb2RlOwpAQCAtMjI4LDggKzIzMSw4IEBACiAKIAkJZ2VucGh5X2NvbmZpZ19pbml0KHBoeWRldik7CiAJCWdlbnBoeV9yZWFkX3N0YXR1cyhwaHlkZXYpOwotCQlpZiAoZHMtPmRydi0+YWRqdXN0X2xpbmspCi0JCQlkcy0+ZHJ2LT5hZGp1c3RfbGluayhkcywgcG9ydCwgcGh5ZGV2KTsKKwkJaWYgKGRzLT5vcHMtPmFkanVzdF9saW5rKQorCQkJZHMtPm9wcy0+YWRqdXN0X2xpbmsoZHMsIHBvcnQsIHBoeWRldik7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0zMDMsNyArMzA2LDcgQEAKIAogc3RhdGljIGludCBkc2Ffc3dpdGNoX3NldHVwX29uZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKIHsKLQlzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgKmRydiA9IGRzLT5kcnY7CisJc3RydWN0IGRzYV9zd2l0Y2hfb3BzICpvcHMgPSBkcy0+b3BzOwogCXN0cnVjdCBkc2Ffc3dpdGNoX3RyZWUgKmRzdCA9IGRzLT5kc3Q7CiAJc3RydWN0IGRzYV9jaGlwX2RhdGEgKmNkID0gZHMtPmNkOwogCWJvb2wgdmFsaWRfbmFtZV9mb3VuZCA9IGZhbHNlOwpAQCAtMzU0LDcgKzM1NywxMCBAQAogCSAqIHN3aXRjaC4KIAkgKi8KIAlpZiAoZHN0LT5jcHVfc3dpdGNoID09IGluZGV4KSB7Ci0JCWRzdC0+dGFnX29wcyA9IGRzYV9yZXNvbHZlX3RhZ19wcm90b2NvbChkcnYtPnRhZ19wcm90b2NvbCk7CisJCWVudW0gZHNhX3RhZ19wcm90b2NvbCB0YWdfcHJvdG9jb2w7CisKKwkJdGFnX3Byb3RvY29sID0gb3BzLT5nZXRfdGFnX3Byb3RvY29sKGRzKTsKKwkJZHN0LT50YWdfb3BzID0gZHNhX3Jlc29sdmVfdGFnX3Byb3RvY29sKHRhZ19wcm90b2NvbCk7CiAJCWlmIChJU19FUlIoZHN0LT50YWdfb3BzKSkgewogCQkJcmV0ID0gUFRSX0VSUihkc3QtPnRhZ19vcHMpOwogCQkJZ290byBvdXQ7CkBAIC0zNjgsMTUgKzM3NCwxNyBAQAogCS8qCiAJICogRG8gYmFzaWMgcmVnaXN0ZXIgc2V0dXAuCiAJICovCi0JcmV0ID0gZHJ2LT5zZXR1cChkcyk7CisJcmV0ID0gb3BzLT5zZXR1cChkcyk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0JcmV0ID0gZHJ2LT5zZXRfYWRkcihkcywgZHN0LT5tYXN0ZXJfbmV0ZGV2LT5kZXZfYWRkcik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OworCWlmIChvcHMtPnNldF9hZGRyKSB7CisJCXJldCA9IG9wcy0+c2V0X2FkZHIoZHMsIGRzdC0+bWFzdGVyX25ldGRldi0+ZGV2X2FkZHIpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCX0KIAotCWlmICghZHMtPnNsYXZlX21paV9idXMgJiYgZHJ2LT5waHlfcmVhZCkgeworCWlmICghZHMtPnNsYXZlX21paV9idXMgJiYgb3BzLT5waHlfcmVhZCkgewogCQlkcy0+c2xhdmVfbWlpX2J1cyA9IGRldm1fbWRpb2J1c19hbGxvYyhwYXJlbnQpOwogCQlpZiAoIWRzLT5zbGF2ZV9taWlfYnVzKSB7CiAJCQlyZXQgPSAtRU5PTUVNOwpAQCAtNDIzLDcgKzQzMSw3IEBACiAJICogcmVnaXN0ZXIgd2l0aCBoYXJkd2FyZSBtb25pdG9yaW5nIHN1YnN5c3RlbS4KIAkgKiBUcmVhdCByZWdpc3RyYXRpb24gZXJyb3IgYXMgbm9uLWZhdGFsIGFuZCBpZ25vcmUgaXQuCiAJICovCi0JaWYgKGRydi0+Z2V0X3RlbXApIHsKKwlpZiAob3BzLT5nZXRfdGVtcCkgewogCQljb25zdCBjaGFyICpuZXRuYW1lID0gbmV0ZGV2X25hbWUoZHN0LT5tYXN0ZXJfbmV0ZGV2KTsKIAkJY2hhciBobmFtZVtJRk5BTVNJWiArIDFdOwogCQlpbnQgaSwgajsKQEAgLTQ1NCw3ICs0NjIsNyBAQAogCQkgc3RydWN0IGRldmljZSAqcGFyZW50LCBzdHJ1Y3QgZGV2aWNlICpob3N0X2RldikKIHsKIAlzdHJ1Y3QgZHNhX2NoaXBfZGF0YSAqY2QgPSBkc3QtPnBkLT5jaGlwICsgaW5kZXg7Ci0Jc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyICpkcnY7CisJc3RydWN0IGRzYV9zd2l0Y2hfb3BzICpvcHM7CiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzOwogCWludCByZXQ7CiAJY29uc3QgY2hhciAqbmFtZTsKQEAgLTQ2Myw4ICs0NzEsOCBAQAogCS8qCiAJICogUHJvYmUgZm9yIHN3aXRjaCBtb2RlbC4KIAkgKi8KLQlkcnYgPSBkc2Ffc3dpdGNoX3Byb2JlKHBhcmVudCwgaG9zdF9kZXYsIGNkLT5zd19hZGRyLCAmbmFtZSwgJnByaXYpOwotCWlmIChkcnYgPT0gTlVMTCkgeworCW9wcyA9IGRzYV9zd2l0Y2hfcHJvYmUocGFyZW50LCBob3N0X2RldiwgY2QtPnN3X2FkZHIsICZuYW1lLCAmcHJpdik7CisJaWYgKCFvcHMpIHsKIAkJbmV0ZGV2X2Vycihkc3QtPm1hc3Rlcl9uZXRkZXYsICJbJWRdOiBjb3VsZCBub3QgZGV0ZWN0IGF0dGFjaGVkIHN3aXRjaFxuIiwKIAkJCSAgIGluZGV4KTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CkBAIC00ODMsNyArNDkxLDcgQEAKIAlkcy0+ZHN0ID0gZHN0OwogCWRzLT5pbmRleCA9IGluZGV4OwogCWRzLT5jZCA9IGNkOwotCWRzLT5kcnYgPSBkcnY7CisJZHMtPm9wcyA9IG9wczsKIAlkcy0+cHJpdiA9IHByaXY7CiAJZHMtPmRldiA9IHBhcmVudDsKIApAQCAtNTM4LDEyICs1NDYsMTIgQEAKIAkJZHMtPmRzYV9wb3J0X21hc2sgfD0gfigxIDw8IHBvcnQpOwogCX0KIAotCWlmIChkcy0+c2xhdmVfbWlpX2J1cyAmJiBkcy0+ZHJ2LT5waHlfcmVhZCkKKwlpZiAoZHMtPnNsYXZlX21paV9idXMgJiYgZHMtPm9wcy0+cGh5X3JlYWQpCiAJCW1kaW9idXNfdW5yZWdpc3Rlcihkcy0+c2xhdmVfbWlpX2J1cyk7CiB9CiAKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKLXN0YXRpYyBpbnQgZHNhX3N3aXRjaF9zdXNwZW5kKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKK2ludCBkc2Ffc3dpdGNoX3N1c3BlbmQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQogewogCWludCBpLCByZXQgPSAwOwogCkBAIC01NTcsMTggKzU2NSwxOSBAQAogCQkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAoZHMtPmRydi0+c3VzcGVuZCkKLQkJcmV0ID0gZHMtPmRydi0+c3VzcGVuZChkcyk7CisJaWYgKGRzLT5vcHMtPnN1c3BlbmQpCisJCXJldCA9IGRzLT5vcHMtPnN1c3BlbmQoZHMpOwogCiAJcmV0dXJuIHJldDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGRzYV9zd2l0Y2hfc3VzcGVuZCk7CiAKLXN0YXRpYyBpbnQgZHNhX3N3aXRjaF9yZXN1bWUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQoraW50IGRzYV9zd2l0Y2hfcmVzdW1lKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKIHsKIAlpbnQgaSwgcmV0ID0gMDsKIAotCWlmIChkcy0+ZHJ2LT5yZXN1bWUpCi0JCXJldCA9IGRzLT5kcnYtPnJlc3VtZShkcyk7CisJaWYgKGRzLT5vcHMtPnJlc3VtZSkKKwkJcmV0ID0gZHMtPm9wcy0+cmVzdW1lKGRzKTsKIAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CkBAIC01ODUsNiArNTk0LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoZHNhX3N3aXRjaF9yZXN1bWUpOwogI2VuZGlmCiAKIC8qIHBsYXRmb3JtIGRyaXZlciBpbml0IGFuZCBjbGVhbnVwICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTA4Niw3ICsxMDk2LDYgQEAKIHN0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhkc2FfcG1fb3BzLCBkc2Ffc3VzcGVuZCwgZHNhX3Jlc3VtZSk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGRzYV9vZl9tYXRjaF90YWJsZVtdID0gewotCXsgLmNvbXBhdGlibGUgPSAiYnJjbSxiY203NDQ1LXN3aXRjaC12NC4wIiB9LAogCXsgLmNvbXBhdGlibGUgPSAibWFydmVsbCxkc2EiLCB9LAogCXt9CiB9OwpkaWZmIC0tZ2l0IGEvbmV0L2RzYS9kc2EyLmMgYi9uZXQvZHNhL2RzYTIuYwppbmRleCBmMzBiYWQ5Li5mOGE3ZDlhIDEwMDY0NAotLS0gYS9uZXQvZHNhL2RzYTIuYworKysgYi9uZXQvZHNhL2RzYTIuYwpAQCAtMjk0LDI1ICsyOTQsMjMgQEAKIAlpbnQgZXJyOwogCiAJLyogSW5pdGlhbGl6ZSBkcy0+cGh5c19taWlfbWFzayBiZWZvcmUgcmVnaXN0ZXJpbmcgdGhlIHNsYXZlIE1ESU8gYnVzCi0JICogZHJpdmVyIGFuZCBiZWZvcmUgZHJ2LT5zZXR1cCgpIGhhcyBydW4sIHNpbmNlIHRoZSBzd2l0Y2ggZHJpdmVycyBhbmQKKwkgKiBkcml2ZXIgYW5kIGJlZm9yZSBvcHMtPnNldHVwKCkgaGFzIHJ1biwgc2luY2UgdGhlIHN3aXRjaCBkcml2ZXJzIGFuZAogCSAqIHRoZSBzbGF2ZSBNRElPIGJ1cyBkcml2ZXIgcmVseSBvbiB0aGVzZSB2YWx1ZXMgZm9yIHByb2JpbmcgUEhZCiAJICogZGV2aWNlcyBvciBub3QKIAkgKi8KIAlkcy0+cGh5c19taWlfbWFzayA9IGRzLT5lbmFibGVkX3BvcnRfbWFzazsKIAotCWVyciA9IGRzLT5kcnYtPnNldHVwKGRzKTsKKwllcnIgPSBkcy0+b3BzLT5zZXR1cChkcyk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQllcnIgPSBkcy0+ZHJ2LT5zZXRfYWRkcihkcywgZHN0LT5tYXN0ZXJfbmV0ZGV2LT5kZXZfYWRkcik7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7CisJaWYgKGRzLT5vcHMtPnNldF9hZGRyKSB7CisJCWVyciA9IGRzLT5vcHMtPnNldF9hZGRyKGRzLCBkc3QtPm1hc3Rlcl9uZXRkZXYtPmRldl9hZGRyKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KIAotCWVyciA9IGRzLT5kcnYtPnNldF9hZGRyKGRzLCBkc3QtPm1hc3Rlcl9uZXRkZXYtPmRldl9hZGRyKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWlmICghZHMtPnNsYXZlX21paV9idXMgJiYgZHMtPmRydi0+cGh5X3JlYWQpIHsKKwlpZiAoIWRzLT5zbGF2ZV9taWlfYnVzICYmIGRzLT5vcHMtPnBoeV9yZWFkKSB7CiAJCWRzLT5zbGF2ZV9taWlfYnVzID0gZGV2bV9tZGlvYnVzX2FsbG9jKGRzLT5kZXYpOwogCQlpZiAoIWRzLT5zbGF2ZV9taWlfYnVzKQogCQkJcmV0dXJuIC1FTk9NRU07CkBAIC0zNzQsNyArMzcyLDcgQEAKIAkJZHNhX3VzZXJfcG9ydF91bmFwcGx5KHBvcnQsIGluZGV4LCBkcyk7CiAJfQogCi0JaWYgKGRzLT5zbGF2ZV9taWlfYnVzICYmIGRzLT5kcnYtPnBoeV9yZWFkKQorCWlmIChkcy0+c2xhdmVfbWlpX2J1cyAmJiBkcy0+b3BzLT5waHlfcmVhZCkKIAkJbWRpb2J1c191bnJlZ2lzdGVyKGRzLT5zbGF2ZV9taWlfYnVzKTsKIH0KIApAQCAtNDQzLDYgKzQ0MSw3IEBACiAJCQkgc3RydWN0IGRzYV9zd2l0Y2hfdHJlZSAqZHN0LAogCQkJIHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKIHsKKwllbnVtIGRzYV90YWdfcHJvdG9jb2wgdGFnX3Byb3RvY29sOwogCXN0cnVjdCBuZXRfZGV2aWNlICpldGhlcm5ldF9kZXY7CiAJc3RydWN0IGRldmljZV9ub2RlICpldGhlcm5ldDsKIApAQCAtNDY1LDcgKzQ2NCw4IEBACiAJCWRzdC0+Y3B1X3BvcnQgPSBpbmRleDsKIAl9CiAKLQlkc3QtPnRhZ19vcHMgPSBkc2FfcmVzb2x2ZV90YWdfcHJvdG9jb2woZHMtPmRydi0+dGFnX3Byb3RvY29sKTsKKwl0YWdfcHJvdG9jb2wgPSBkcy0+b3BzLT5nZXRfdGFnX3Byb3RvY29sKGRzKTsKKwlkc3QtPnRhZ19vcHMgPSBkc2FfcmVzb2x2ZV90YWdfcHJvdG9jb2wodGFnX3Byb3RvY29sKTsKIAlpZiAoSVNfRVJSKGRzdC0+dGFnX29wcykpIHsKIAkJZGV2X3dhcm4oZHMtPmRldiwgIk5vIHRhZ2dlciBmb3IgdGhpcyBzd2l0Y2hcbiIpOwogCQlyZXR1cm4gUFRSX0VSUihkc3QtPnRhZ19vcHMpOwpAQCAtNTQxLDcgKzU0MSw3IEBACiAKIAkJZHMtPnBvcnRzW3JlZ10uZG4gPSBwb3J0OwogCi0JCS8qIEluaXRpYWxpemUgZW5hYmxlZF9wb3J0X21hc2sgbm93IGZvciBkcnYtPnNldHVwKCkKKwkJLyogSW5pdGlhbGl6ZSBlbmFibGVkX3BvcnRfbWFzayBub3cgZm9yIG9wcy0+c2V0dXAoKQogCQkgKiB0byBoYXZlIGFjY2VzcyB0byBhIGNvcnJlY3QgdmFsdWUsIGp1c3QgbGlrZSB3aGF0CiAJCSAqIG5ldC9kc2EvZHNhLmM6OmRzYV9zd2l0Y2hfc2V0dXBfb25lIGRvZXMuCiAJCSAqLwpkaWZmIC0tZ2l0IGEvbmV0L2RzYS9kc2FfcHJpdi5oIGIvbmV0L2RzYS9kc2FfcHJpdi5oCmluZGV4IDAwMDc3YTkuLjZjZmQ3MzggMTAwNjQ0Ci0tLSBhL25ldC9kc2EvZHNhX3ByaXYuaAorKysgYi9uZXQvZHNhL2RzYV9wcml2LmgKQEAgLTgxLDUgKzgxLDcgQEAKIC8qIHRhZ19icmNtLmMgKi8KIGV4dGVybiBjb25zdCBzdHJ1Y3QgZHNhX2RldmljZV9vcHMgYnJjbV9uZXRkZXZfb3BzOwogCisvKiB0YWdfcWNhLmMgKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3QgZHNhX2RldmljZV9vcHMgcWNhX25ldGRldl9vcHM7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2RzYS9zbGF2ZS5jIGIvbmV0L2RzYS9zbGF2ZS5jCmluZGV4IGZjOTE5NjcuLjZiMTI4MmMgMTAwNjQ0Ci0tLSBhL25ldC9kc2Evc2xhdmUuYworKysgYi9uZXQvZHNhL3NsYXZlLmMKQEAgLTI4LDcgKzI4LDcgQEAKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBidXMtPnByaXY7CiAKIAlpZiAoZHMtPnBoeXNfbWlpX21hc2sgJiAoMSA8PCBhZGRyKSkKLQkJcmV0dXJuIGRzLT5kcnYtPnBoeV9yZWFkKGRzLCBhZGRyLCByZWcpOworCQlyZXR1cm4gZHMtPm9wcy0+cGh5X3JlYWQoZHMsIGFkZHIsIHJlZyk7CiAKIAlyZXR1cm4gMHhmZmZmOwogfQpAQCAtMzgsNyArMzgsNyBAQAogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IGJ1cy0+cHJpdjsKIAogCWlmIChkcy0+cGh5c19taWlfbWFzayAmICgxIDw8IGFkZHIpKQotCQlyZXR1cm4gZHMtPmRydi0+cGh5X3dyaXRlKGRzLCBhZGRyLCByZWcsIHZhbCk7CisJCXJldHVybiBkcy0+b3BzLT5waHlfd3JpdGUoZHMsIGFkZHIsIHJlZywgdmFsKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjksNiArNjksMzAgQEAKIAlyZXR1cm4gISFwLT5icmlkZ2VfZGV2OwogfQogCitzdGF0aWMgdm9pZCBkc2FfcG9ydF9zZXRfc3RwX3N0YXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIHU4IHN0YXRlKQoreworCXN0cnVjdCBkc2FfcG9ydCAqZHAgPSAmZHMtPnBvcnRzW3BvcnRdOworCisJaWYgKGRzLT5vcHMtPnBvcnRfc3RwX3N0YXRlX3NldCkKKwkJZHMtPm9wcy0+cG9ydF9zdHBfc3RhdGVfc2V0KGRzLCBwb3J0LCBzdGF0ZSk7CisKKwlpZiAoZHMtPm9wcy0+cG9ydF9mYXN0X2FnZSkgeworCQkvKiBGYXN0IGFnZSBGREIgZW50cmllcyBvciBmbHVzaCBhcHByb3ByaWF0ZSBmb3J3YXJkaW5nIGRhdGFiYXNlCisJCSAqIGZvciB0aGUgZ2l2ZW4gcG9ydCwgaWYgd2UgYXJlIG1vdmluZyBpdCBmcm9tIExlYXJuaW5nIG9yCisJCSAqIEZvcndhcmRpbmcgc3RhdGUsIHRvIERpc2FibGVkIG9yIEJsb2NraW5nIG9yIExpc3RlbmluZyBzdGF0ZS4KKwkJICovCisKKwkJaWYgKChkcC0+c3RwX3N0YXRlID09IEJSX1NUQVRFX0xFQVJOSU5HIHx8CisJCSAgICAgZHAtPnN0cF9zdGF0ZSA9PSBCUl9TVEFURV9GT1JXQVJESU5HKSAmJgorCQkgICAgKHN0YXRlID09IEJSX1NUQVRFX0RJU0FCTEVEIHx8CisJCSAgICAgc3RhdGUgPT0gQlJfU1RBVEVfQkxPQ0tJTkcgfHwKKwkJICAgICBzdGF0ZSA9PSBCUl9TVEFURV9MSVNURU5JTkcpKQorCQkJZHMtPm9wcy0+cG9ydF9mYXN0X2FnZShkcywgcG9ydCk7CisJfQorCisJZHAtPnN0cF9zdGF0ZSA9IHN0YXRlOworfQorCiBzdGF0aWMgaW50IGRzYV9zbGF2ZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRzYV9zbGF2ZV9wcml2ICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTk4LDE0ICsxMjIsMTMgQEAKIAkJCWdvdG8gY2xlYXJfYWxsbXVsdGk7CiAJfQogCi0JaWYgKGRzLT5kcnYtPnBvcnRfZW5hYmxlKSB7Ci0JCWVyciA9IGRzLT5kcnYtPnBvcnRfZW5hYmxlKGRzLCBwLT5wb3J0LCBwLT5waHkpOworCWlmIChkcy0+b3BzLT5wb3J0X2VuYWJsZSkgeworCQllcnIgPSBkcy0+b3BzLT5wb3J0X2VuYWJsZShkcywgcC0+cG9ydCwgcC0+cGh5KTsKIAkJaWYgKGVycikKIAkJCWdvdG8gY2xlYXJfcHJvbWlzYzsKIAl9CiAKLQlpZiAoZHMtPmRydi0+cG9ydF9zdHBfc3RhdGVfc2V0KQotCQlkcy0+ZHJ2LT5wb3J0X3N0cF9zdGF0ZV9zZXQoZHMsIHAtPnBvcnQsIHN0cF9zdGF0ZSk7CisJZHNhX3BvcnRfc2V0X3N0cF9zdGF0ZShkcywgcC0+cG9ydCwgc3RwX3N0YXRlKTsKIAogCWlmIChwLT5waHkpCiAJCXBoeV9zdGFydChwLT5waHkpOwpAQCAtMTQ0LDExICsxNjcsMTAgQEAKIAlpZiAoIWV0aGVyX2FkZHJfZXF1YWwoZGV2LT5kZXZfYWRkciwgbWFzdGVyLT5kZXZfYWRkcikpCiAJCWRldl91Y19kZWwobWFzdGVyLCBkZXYtPmRldl9hZGRyKTsKIAotCWlmIChkcy0+ZHJ2LT5wb3J0X2Rpc2FibGUpCi0JCWRzLT5kcnYtPnBvcnRfZGlzYWJsZShkcywgcC0+cG9ydCwgcC0+cGh5KTsKKwlpZiAoZHMtPm9wcy0+cG9ydF9kaXNhYmxlKQorCQlkcy0+b3BzLT5wb3J0X2Rpc2FibGUoZHMsIHAtPnBvcnQsIHAtPnBoeSk7CiAKLQlpZiAoZHMtPmRydi0+cG9ydF9zdHBfc3RhdGVfc2V0KQotCQlkcy0+ZHJ2LT5wb3J0X3N0cF9zdGF0ZV9zZXQoZHMsIHAtPnBvcnQsIEJSX1NUQVRFX0RJU0FCTEVEKTsKKwlkc2FfcG9ydF9zZXRfc3RwX3N0YXRlKGRzLCBwLT5wb3J0LCBCUl9TVEFURV9ESVNBQkxFRCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIwOSwxMyArMjMxLDEzIEBACiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gcC0+cGFyZW50OwogCiAJaWYgKHN3aXRjaGRldl90cmFuc19waF9wcmVwYXJlKHRyYW5zKSkgewotCQlpZiAoIWRzLT5kcnYtPnBvcnRfdmxhbl9wcmVwYXJlIHx8ICFkcy0+ZHJ2LT5wb3J0X3ZsYW5fYWRkKQorCQlpZiAoIWRzLT5vcHMtPnBvcnRfdmxhbl9wcmVwYXJlIHx8ICFkcy0+b3BzLT5wb3J0X3ZsYW5fYWRkKQogCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JCXJldHVybiBkcy0+ZHJ2LT5wb3J0X3ZsYW5fcHJlcGFyZShkcywgcC0+cG9ydCwgdmxhbiwgdHJhbnMpOworCQlyZXR1cm4gZHMtPm9wcy0+cG9ydF92bGFuX3ByZXBhcmUoZHMsIHAtPnBvcnQsIHZsYW4sIHRyYW5zKTsKIAl9CiAKLQlkcy0+ZHJ2LT5wb3J0X3ZsYW5fYWRkKGRzLCBwLT5wb3J0LCB2bGFuLCB0cmFucyk7CisJZHMtPm9wcy0+cG9ydF92bGFuX2FkZChkcywgcC0+cG9ydCwgdmxhbiwgdHJhbnMpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMjYsMTAgKzI0OCwxMCBAQAogCXN0cnVjdCBkc2Ffc2xhdmVfcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gcC0+cGFyZW50OwogCi0JaWYgKCFkcy0+ZHJ2LT5wb3J0X3ZsYW5fZGVsKQorCWlmICghZHMtPm9wcy0+cG9ydF92bGFuX2RlbCkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JcmV0dXJuIGRzLT5kcnYtPnBvcnRfdmxhbl9kZWwoZHMsIHAtPnBvcnQsIHZsYW4pOworCXJldHVybiBkcy0+b3BzLT5wb3J0X3ZsYW5fZGVsKGRzLCBwLT5wb3J0LCB2bGFuKTsKIH0KIAogc3RhdGljIGludCBkc2Ffc2xhdmVfcG9ydF92bGFuX2R1bXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKQEAgLTIzOSw4ICsyNjEsOCBAQAogCXN0cnVjdCBkc2Ffc2xhdmVfcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gcC0+cGFyZW50OwogCi0JaWYgKGRzLT5kcnYtPnBvcnRfdmxhbl9kdW1wKQotCQlyZXR1cm4gZHMtPmRydi0+cG9ydF92bGFuX2R1bXAoZHMsIHAtPnBvcnQsIHZsYW4sIGNiKTsKKwlpZiAoZHMtPm9wcy0+cG9ydF92bGFuX2R1bXApCisJCXJldHVybiBkcy0+b3BzLT5wb3J0X3ZsYW5fZHVtcChkcywgcC0+cG9ydCwgdmxhbiwgY2IpOwogCiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQpAQCAtMjUzLDEzICsyNzUsMTMgQEAKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBwLT5wYXJlbnQ7CiAKIAlpZiAoc3dpdGNoZGV2X3RyYW5zX3BoX3ByZXBhcmUodHJhbnMpKSB7Ci0JCWlmICghZHMtPmRydi0+cG9ydF9mZGJfcHJlcGFyZSB8fCAhZHMtPmRydi0+cG9ydF9mZGJfYWRkKQorCQlpZiAoIWRzLT5vcHMtPnBvcnRfZmRiX3ByZXBhcmUgfHwgIWRzLT5vcHMtPnBvcnRfZmRiX2FkZCkKIAkJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCQlyZXR1cm4gZHMtPmRydi0+cG9ydF9mZGJfcHJlcGFyZShkcywgcC0+cG9ydCwgZmRiLCB0cmFucyk7CisJCXJldHVybiBkcy0+b3BzLT5wb3J0X2ZkYl9wcmVwYXJlKGRzLCBwLT5wb3J0LCBmZGIsIHRyYW5zKTsKIAl9CiAKLQlkcy0+ZHJ2LT5wb3J0X2ZkYl9hZGQoZHMsIHAtPnBvcnQsIGZkYiwgdHJhbnMpOworCWRzLT5vcHMtPnBvcnRfZmRiX2FkZChkcywgcC0+cG9ydCwgZmRiLCB0cmFucyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI3MSw4ICsyOTMsOCBAQAogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHAtPnBhcmVudDsKIAlpbnQgcmV0ID0gLUVPUE5PVFNVUFA7CiAKLQlpZiAoZHMtPmRydi0+cG9ydF9mZGJfZGVsKQotCQlyZXQgPSBkcy0+ZHJ2LT5wb3J0X2ZkYl9kZWwoZHMsIHAtPnBvcnQsIGZkYik7CisJaWYgKGRzLT5vcHMtPnBvcnRfZmRiX2RlbCkKKwkJcmV0ID0gZHMtPm9wcy0+cG9ydF9mZGJfZGVsKGRzLCBwLT5wb3J0LCBmZGIpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTI4NCw4ICszMDYsNTIgQEAKIAlzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHAtPnBhcmVudDsKIAotCWlmIChkcy0+ZHJ2LT5wb3J0X2ZkYl9kdW1wKQotCQlyZXR1cm4gZHMtPmRydi0+cG9ydF9mZGJfZHVtcChkcywgcC0+cG9ydCwgZmRiLCBjYik7CisJaWYgKGRzLT5vcHMtPnBvcnRfZmRiX2R1bXApCisJCXJldHVybiBkcy0+b3BzLT5wb3J0X2ZkYl9kdW1wKGRzLCBwLT5wb3J0LCBmZGIsIGNiKTsKKworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGludCBkc2Ffc2xhdmVfcG9ydF9tZGJfYWRkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X21kYiAqbWRiLAorCQkJCSAgc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpCit7CisJc3RydWN0IGRzYV9zbGF2ZV9wcml2ICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBwLT5wYXJlbnQ7CisKKwlpZiAoc3dpdGNoZGV2X3RyYW5zX3BoX3ByZXBhcmUodHJhbnMpKSB7CisJCWlmICghZHMtPm9wcy0+cG9ydF9tZGJfcHJlcGFyZSB8fCAhZHMtPm9wcy0+cG9ydF9tZGJfYWRkKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJCXJldHVybiBkcy0+b3BzLT5wb3J0X21kYl9wcmVwYXJlKGRzLCBwLT5wb3J0LCBtZGIsIHRyYW5zKTsKKwl9CisKKwlkcy0+b3BzLT5wb3J0X21kYl9hZGQoZHMsIHAtPnBvcnQsIG1kYiwgdHJhbnMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNhX3NsYXZlX3BvcnRfbWRiX2RlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9tZGIgKm1kYikKK3sKKwlzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHAtPnBhcmVudDsKKworCWlmIChkcy0+b3BzLT5wb3J0X21kYl9kZWwpCisJCXJldHVybiBkcy0+b3BzLT5wb3J0X21kYl9kZWwoZHMsIHAtPnBvcnQsIG1kYik7CisKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbnQgZHNhX3NsYXZlX3BvcnRfbWRiX2R1bXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X21kYiAqbWRiLAorCQkJCSAgIHN3aXRjaGRldl9vYmpfZHVtcF9jYl90ICpjYikKK3sKKwlzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHAtPnBhcmVudDsKKworCWlmIChkcy0+b3BzLT5wb3J0X21kYl9kdW1wKQorCQlyZXR1cm4gZHMtPm9wcy0+cG9ydF9tZGJfZHVtcChkcywgcC0+cG9ydCwgbWRiLCBjYik7CiAKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CkBAIC0zMDgsOSArMzc0LDkgQEAKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBwLT5wYXJlbnQ7CiAKIAlpZiAoc3dpdGNoZGV2X3RyYW5zX3BoX3ByZXBhcmUodHJhbnMpKQotCQlyZXR1cm4gZHMtPmRydi0+cG9ydF9zdHBfc3RhdGVfc2V0ID8gMCA6IC1FT1BOT1RTVVBQOworCQlyZXR1cm4gZHMtPm9wcy0+cG9ydF9zdHBfc3RhdGVfc2V0ID8gMCA6IC1FT1BOT1RTVVBQOwogCi0JZHMtPmRydi0+cG9ydF9zdHBfc3RhdGVfc2V0KGRzLCBwLT5wb3J0LCBhdHRyLT51LnN0cF9zdGF0ZSk7CisJZHNhX3BvcnRfc2V0X3N0cF9zdGF0ZShkcywgcC0+cG9ydCwgYXR0ci0+dS5zdHBfc3RhdGUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMjYsOCArMzkyLDggQEAKIAlpZiAoc3dpdGNoZGV2X3RyYW5zX3BoX3ByZXBhcmUodHJhbnMpKQogCQlyZXR1cm4gMDsKIAotCWlmIChkcy0+ZHJ2LT5wb3J0X3ZsYW5fZmlsdGVyaW5nKQotCQlyZXR1cm4gZHMtPmRydi0+cG9ydF92bGFuX2ZpbHRlcmluZyhkcywgcC0+cG9ydCwKKwlpZiAoZHMtPm9wcy0+cG9ydF92bGFuX2ZpbHRlcmluZykKKwkJcmV0dXJuIGRzLT5vcHMtPnBvcnRfdmxhbl9maWx0ZXJpbmcoZHMsIHAtPnBvcnQsCiAJCQkJCQkgICAgYXR0ci0+dS52bGFuX2ZpbHRlcmluZyk7CiAKIAlyZXR1cm4gMDsKQEAgLTM2NSw4ICs0MzEsOCBAQAogCWRzLT5wb3J0c1twLT5wb3J0XS5hZ2VpbmdfdGltZSA9IGFnZWluZ190aW1lOwogCWFnZWluZ190aW1lID0gZHNhX2Zhc3Rlc3RfYWdlaW5nX3RpbWUoZHMsIGFnZWluZ190aW1lKTsKIAotCWlmIChkcy0+ZHJ2LT5zZXRfYWdlaW5nX3RpbWUpCi0JCXJldHVybiBkcy0+ZHJ2LT5zZXRfYWdlaW5nX3RpbWUoZHMsIGFnZWluZ190aW1lKTsKKwlpZiAoZHMtPm9wcy0+c2V0X2FnZWluZ190aW1lKQorCQlyZXR1cm4gZHMtPm9wcy0+c2V0X2FnZWluZ190aW1lKGRzLCBhZ2VpbmdfdGltZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQxMiw2ICs0NzgsMTAgQEAKIAkJCQkJICAgICBTV0lUQ0hERVZfT0JKX1BPUlRfRkRCKG9iaiksCiAJCQkJCSAgICAgdHJhbnMpOwogCQlicmVhazsKKwljYXNlIFNXSVRDSERFVl9PQkpfSURfUE9SVF9NREI6CisJCWVyciA9IGRzYV9zbGF2ZV9wb3J0X21kYl9hZGQoZGV2LCBTV0lUQ0hERVZfT0JKX1BPUlRfTURCKG9iaiksCisJCQkJCSAgICAgdHJhbnMpOworCQlicmVhazsKIAljYXNlIFNXSVRDSERFVl9PQkpfSURfUE9SVF9WTEFOOgogCQllcnIgPSBkc2Ffc2xhdmVfcG9ydF92bGFuX2FkZChkZXYsCiAJCQkJCSAgICAgIFNXSVRDSERFVl9PQkpfUE9SVF9WTEFOKG9iaiksCkBAIC00MzUsNiArNTA1LDkgQEAKIAkJZXJyID0gZHNhX3NsYXZlX3BvcnRfZmRiX2RlbChkZXYsCiAJCQkJCSAgICAgU1dJVENIREVWX09CSl9QT1JUX0ZEQihvYmopKTsKIAkJYnJlYWs7CisJY2FzZSBTV0lUQ0hERVZfT0JKX0lEX1BPUlRfTURCOgorCQllcnIgPSBkc2Ffc2xhdmVfcG9ydF9tZGJfZGVsKGRldiwgU1dJVENIREVWX09CSl9QT1JUX01EQihvYmopKTsKKwkJYnJlYWs7CiAJY2FzZSBTV0lUQ0hERVZfT0JKX0lEX1BPUlRfVkxBTjoKIAkJZXJyID0gZHNhX3NsYXZlX3BvcnRfdmxhbl9kZWwoZGV2LAogCQkJCQkgICAgICBTV0lUQ0hERVZfT0JKX1BPUlRfVkxBTihvYmopKTsKQEAgLTQ1OSw2ICs1MzIsMTAgQEAKIAkJCQkJICAgICAgU1dJVENIREVWX09CSl9QT1JUX0ZEQihvYmopLAogCQkJCQkgICAgICBjYik7CiAJCWJyZWFrOworCWNhc2UgU1dJVENIREVWX09CSl9JRF9QT1JUX01EQjoKKwkJZXJyID0gZHNhX3NsYXZlX3BvcnRfbWRiX2R1bXAoZGV2LCBTV0lUQ0hERVZfT0JKX1BPUlRfTURCKG9iaiksCisJCQkJCSAgICAgIGNiKTsKKwkJYnJlYWs7CiAJY2FzZSBTV0lUQ0hERVZfT0JKX0lEX1BPUlRfVkxBTjoKIAkJZXJyID0gZHNhX3NsYXZlX3BvcnRfdmxhbl9kdW1wKGRldiwKIAkJCQkJICAgICAgIFNXSVRDSERFVl9PQkpfUE9SVF9WTEFOKG9iaiksCkBAIC00ODEsOCArNTU4LDggQEAKIAogCXAtPmJyaWRnZV9kZXYgPSBicjsKIAotCWlmIChkcy0+ZHJ2LT5wb3J0X2JyaWRnZV9qb2luKQotCQlyZXQgPSBkcy0+ZHJ2LT5wb3J0X2JyaWRnZV9qb2luKGRzLCBwLT5wb3J0LCBicik7CisJaWYgKGRzLT5vcHMtPnBvcnRfYnJpZGdlX2pvaW4pCisJCXJldCA9IGRzLT5vcHMtPnBvcnRfYnJpZGdlX2pvaW4oZHMsIHAtPnBvcnQsIGJyKTsKIAogCXJldHVybiByZXQgPT0gLUVPUE5PVFNVUFAgPyAwIDogcmV0OwogfQpAQCAtNDkzLDE2ICs1NzAsMTUgQEAKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBwLT5wYXJlbnQ7CiAKIAotCWlmIChkcy0+ZHJ2LT5wb3J0X2JyaWRnZV9sZWF2ZSkKLQkJZHMtPmRydi0+cG9ydF9icmlkZ2VfbGVhdmUoZHMsIHAtPnBvcnQpOworCWlmIChkcy0+b3BzLT5wb3J0X2JyaWRnZV9sZWF2ZSkKKwkJZHMtPm9wcy0+cG9ydF9icmlkZ2VfbGVhdmUoZHMsIHAtPnBvcnQpOwogCiAJcC0+YnJpZGdlX2RldiA9IE5VTEw7CiAKIAkvKiBQb3J0IGxlZnQgdGhlIGJyaWRnZSwgcHV0IGluIEJSX1NUQVRFX0RJU0FCTEVEIGJ5IHRoZSBicmlkZ2UgbGF5ZXIsCiAJICogc28gYWxsb3cgaXQgdG8gYmUgaW4gQlJfU1RBVEVfRk9SV0FSRElORyB0byBiZSBrZXB0IGZ1bmN0aW9uYWwKIAkgKi8KLQlpZiAoZHMtPmRydi0+cG9ydF9zdHBfc3RhdGVfc2V0KQotCQlkcy0+ZHJ2LT5wb3J0X3N0cF9zdGF0ZV9zZXQoZHMsIHAtPnBvcnQsIEJSX1NUQVRFX0ZPUldBUkRJTkcpOworCWRzYV9wb3J0X3NldF9zdHBfc3RhdGUoZHMsIHAtPnBvcnQsIEJSX1NUQVRFX0ZPUldBUkRJTkcpOwogfQogCiBzdGF0aWMgaW50IGRzYV9zbGF2ZV9wb3J0X2F0dHJfZ2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC02MDUsOCArNjgxLDggQEAKIAlzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHAtPnBhcmVudDsKIAotCWlmIChkcy0+ZHJ2LT5nZXRfcmVnc19sZW4pCi0JCXJldHVybiBkcy0+ZHJ2LT5nZXRfcmVnc19sZW4oZHMsIHAtPnBvcnQpOworCWlmIChkcy0+b3BzLT5nZXRfcmVnc19sZW4pCisJCXJldHVybiBkcy0+b3BzLT5nZXRfcmVnc19sZW4oZHMsIHAtPnBvcnQpOwogCiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQpAQCAtNjE3LDggKzY5Myw4IEBACiAJc3RydWN0IGRzYV9zbGF2ZV9wcml2ICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBwLT5wYXJlbnQ7CiAKLQlpZiAoZHMtPmRydi0+Z2V0X3JlZ3MpCi0JCWRzLT5kcnYtPmdldF9yZWdzKGRzLCBwLT5wb3J0LCByZWdzLCBfcCk7CisJaWYgKGRzLT5vcHMtPmdldF9yZWdzKQorCQlkcy0+b3BzLT5nZXRfcmVncyhkcywgcC0+cG9ydCwgcmVncywgX3ApOwogfQogCiBzdGF0aWMgaW50IGRzYV9zbGF2ZV9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC02NTEsOCArNzI3LDggQEAKIAlpZiAoZHMtPmNkICYmIGRzLT5jZC0+ZWVwcm9tX2xlbikKIAkJcmV0dXJuIGRzLT5jZC0+ZWVwcm9tX2xlbjsKIAotCWlmIChkcy0+ZHJ2LT5nZXRfZWVwcm9tX2xlbikKLQkJcmV0dXJuIGRzLT5kcnYtPmdldF9lZXByb21fbGVuKGRzKTsKKwlpZiAoZHMtPm9wcy0+Z2V0X2VlcHJvbV9sZW4pCisJCXJldHVybiBkcy0+b3BzLT5nZXRfZWVwcm9tX2xlbihkcyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTY2Myw4ICs3MzksOCBAQAogCXN0cnVjdCBkc2Ffc2xhdmVfcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gcC0+cGFyZW50OwogCi0JaWYgKGRzLT5kcnYtPmdldF9lZXByb20pCi0JCXJldHVybiBkcy0+ZHJ2LT5nZXRfZWVwcm9tKGRzLCBlZXByb20sIGRhdGEpOworCWlmIChkcy0+b3BzLT5nZXRfZWVwcm9tKQorCQlyZXR1cm4gZHMtPm9wcy0+Z2V0X2VlcHJvbShkcywgZWVwcm9tLCBkYXRhKTsKIAogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KQEAgLTY3NSw4ICs3NTEsOCBAQAogCXN0cnVjdCBkc2Ffc2xhdmVfcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gcC0+cGFyZW50OwogCi0JaWYgKGRzLT5kcnYtPnNldF9lZXByb20pCi0JCXJldHVybiBkcy0+ZHJ2LT5zZXRfZWVwcm9tKGRzLCBlZXByb20sIGRhdGEpOworCWlmIChkcy0+b3BzLT5zZXRfZWVwcm9tKQorCQlyZXR1cm4gZHMtPm9wcy0+c2V0X2VlcHJvbShkcywgZWVwcm9tLCBkYXRhKTsKIAogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KQEAgLTY5NCw4ICs3NzAsOCBAQAogCQlzdHJuY3B5KGRhdGEgKyBsZW4sICJ0eF9ieXRlcyIsIGxlbik7CiAJCXN0cm5jcHkoZGF0YSArIDIgKiBsZW4sICJyeF9wYWNrZXRzIiwgbGVuKTsKIAkJc3RybmNweShkYXRhICsgMyAqIGxlbiwgInJ4X2J5dGVzIiwgbGVuKTsKLQkJaWYgKGRzLT5kcnYtPmdldF9zdHJpbmdzICE9IE5VTEwpCi0JCQlkcy0+ZHJ2LT5nZXRfc3RyaW5ncyhkcywgcC0+cG9ydCwgZGF0YSArIDQgKiBsZW4pOworCQlpZiAoZHMtPm9wcy0+Z2V0X3N0cmluZ3MpCisJCQlkcy0+b3BzLT5nZXRfc3RyaW5ncyhkcywgcC0+cG9ydCwgZGF0YSArIDQgKiBsZW4pOwogCX0KIH0KIApAQCAtNzE0LDggKzc5MCw4IEBACiAJCWRzdC0+bWFzdGVyX2V0aHRvb2xfb3BzLmdldF9ldGh0b29sX3N0YXRzKGRldiwgc3RhdHMsIGRhdGEpOwogCX0KIAotCWlmIChkcy0+ZHJ2LT5nZXRfZXRodG9vbF9zdGF0cykKLQkJZHMtPmRydi0+Z2V0X2V0aHRvb2xfc3RhdHMoZHMsIGNwdV9wb3J0LCBkYXRhICsgY291bnQpOworCWlmIChkcy0+b3BzLT5nZXRfZXRodG9vbF9zdGF0cykKKwkJZHMtPm9wcy0+Z2V0X2V0aHRvb2xfc3RhdHMoZHMsIGNwdV9wb3J0LCBkYXRhICsgY291bnQpOwogfQogCiBzdGF0aWMgaW50IGRzYV9jcHVfcG9ydF9nZXRfc3NldF9jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3NldCkKQEAgLTcyNyw4ICs4MDMsOCBAQAogCWlmIChkc3QtPm1hc3Rlcl9ldGh0b29sX29wcy5nZXRfc3NldF9jb3VudCkKIAkJY291bnQgKz0gZHN0LT5tYXN0ZXJfZXRodG9vbF9vcHMuZ2V0X3NzZXRfY291bnQoZGV2LCBzc2V0KTsKIAotCWlmIChzc2V0ID09IEVUSF9TU19TVEFUUyAmJiBkcy0+ZHJ2LT5nZXRfc3NldF9jb3VudCkKLQkJY291bnQgKz0gZHMtPmRydi0+Z2V0X3NzZXRfY291bnQoZHMpOworCWlmIChzc2V0ID09IEVUSF9TU19TVEFUUyAmJiBkcy0+b3BzLT5nZXRfc3NldF9jb3VudCkKKwkJY291bnQgKz0gZHMtPm9wcy0+Z2V0X3NzZXRfY291bnQoZHMpOwogCiAJcmV0dXJuIGNvdW50OwogfQpAQCAtNzU1LDE0ICs4MzEsMTQgQEAKIAkJZHN0LT5tYXN0ZXJfZXRodG9vbF9vcHMuZ2V0X3N0cmluZ3MoZGV2LCBzdHJpbmdzZXQsIGRhdGEpOwogCX0KIAotCWlmIChzdHJpbmdzZXQgPT0gRVRIX1NTX1NUQVRTICYmIGRzLT5kcnYtPmdldF9zdHJpbmdzKSB7CisJaWYgKHN0cmluZ3NldCA9PSBFVEhfU1NfU1RBVFMgJiYgZHMtPm9wcy0+Z2V0X3N0cmluZ3MpIHsKIAkJbmRhdGEgPSBkYXRhICsgbWNvdW50ICogbGVuOwogCQkvKiBUaGlzIGZ1bmN0aW9uIGNvcGllcyBFVEhfR1NUUklOR1NfTEVOIGJ5dGVzLCB3ZSB3aWxsIG1hbmdsZQogCQkgKiB0aGUgb3V0cHV0IGFmdGVyIHRvIHByZXBlbmQgb3VyIENQVSBwb3J0IHByZWZpeCB3ZQogCQkgKiBjb25zdHJ1Y3RlZCBlYXJsaWVyCiAJCSAqLwotCQlkcy0+ZHJ2LT5nZXRfc3RyaW5ncyhkcywgY3B1X3BvcnQsIG5kYXRhKTsKLQkJY291bnQgPSBkcy0+ZHJ2LT5nZXRfc3NldF9jb3VudChkcyk7CisJCWRzLT5vcHMtPmdldF9zdHJpbmdzKGRzLCBjcHVfcG9ydCwgbmRhdGEpOworCQljb3VudCA9IGRzLT5vcHMtPmdldF9zc2V0X2NvdW50KGRzKTsKIAkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKIAkJCW1lbW1vdmUobmRhdGEgKyAoaSAqIGxlbiArIHNpemVvZihwZngpKSwKIAkJCQluZGF0YSArIGkgKiBsZW4sIGxlbiAtIHNpemVvZihwZngpKTsKQEAgLTc4Miw4ICs4NTgsOCBAQAogCWRhdGFbMV0gPSBkZXYtPnN0YXRzLnR4X2J5dGVzOwogCWRhdGFbMl0gPSBkZXYtPnN0YXRzLnJ4X3BhY2tldHM7CiAJZGF0YVszXSA9IGRldi0+c3RhdHMucnhfYnl0ZXM7Ci0JaWYgKGRzLT5kcnYtPmdldF9ldGh0b29sX3N0YXRzICE9IE5VTEwpCi0JCWRzLT5kcnYtPmdldF9ldGh0b29sX3N0YXRzKGRzLCBwLT5wb3J0LCBkYXRhICsgNCk7CisJaWYgKGRzLT5vcHMtPmdldF9ldGh0b29sX3N0YXRzKQorCQlkcy0+b3BzLT5nZXRfZXRodG9vbF9zdGF0cyhkcywgcC0+cG9ydCwgZGF0YSArIDQpOwogfQogCiBzdGF0aWMgaW50IGRzYV9zbGF2ZV9nZXRfc3NldF9jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3NldCkKQEAgLTc5NSw4ICs4NzEsOCBAQAogCQlpbnQgY291bnQ7CiAKIAkJY291bnQgPSA0OwotCQlpZiAoZHMtPmRydi0+Z2V0X3NzZXRfY291bnQgIT0gTlVMTCkKLQkJCWNvdW50ICs9IGRzLT5kcnYtPmdldF9zc2V0X2NvdW50KGRzKTsKKwkJaWYgKGRzLT5vcHMtPmdldF9zc2V0X2NvdW50KQorCQkJY291bnQgKz0gZHMtPm9wcy0+Z2V0X3NzZXRfY291bnQoZHMpOwogCiAJCXJldHVybiBjb3VudDsKIAl9CkBAIC04MDksOCArODg1LDggQEAKIAlzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHAtPnBhcmVudDsKIAotCWlmIChkcy0+ZHJ2LT5nZXRfd29sKQotCQlkcy0+ZHJ2LT5nZXRfd29sKGRzLCBwLT5wb3J0LCB3KTsKKwlpZiAoZHMtPm9wcy0+Z2V0X3dvbCkKKwkJZHMtPm9wcy0+Z2V0X3dvbChkcywgcC0+cG9ydCwgdyk7CiB9CiAKIHN0YXRpYyBpbnQgZHNhX3NsYXZlX3NldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqdykKQEAgLTgxOSw4ICs4OTUsOCBAQAogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHAtPnBhcmVudDsKIAlpbnQgcmV0ID0gLUVPUE5PVFNVUFA7CiAKLQlpZiAoZHMtPmRydi0+c2V0X3dvbCkKLQkJcmV0ID0gZHMtPmRydi0+c2V0X3dvbChkcywgcC0+cG9ydCwgdyk7CisJaWYgKGRzLT5vcHMtPnNldF93b2wpCisJCXJldCA9IGRzLT5vcHMtPnNldF93b2woZHMsIHAtPnBvcnQsIHcpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTgzMSwxMCArOTA3LDEwIEBACiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gcC0+cGFyZW50OwogCWludCByZXQ7CiAKLQlpZiAoIWRzLT5kcnYtPnNldF9lZWUpCisJaWYgKCFkcy0+b3BzLT5zZXRfZWVlKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlyZXQgPSBkcy0+ZHJ2LT5zZXRfZWVlKGRzLCBwLT5wb3J0LCBwLT5waHksIGUpOworCXJldCA9IGRzLT5vcHMtPnNldF9lZWUoZHMsIHAtPnBvcnQsIHAtPnBoeSwgZSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtODUwLDEwICs5MjYsMTAgQEAKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBwLT5wYXJlbnQ7CiAJaW50IHJldDsKIAotCWlmICghZHMtPmRydi0+Z2V0X2VlZSkKKwlpZiAoIWRzLT5vcHMtPmdldF9lZWUpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCXJldCA9IGRzLT5kcnYtPmdldF9lZWUoZHMsIHAtPnBvcnQsIGUpOworCXJldCA9IGRzLT5vcHMtPmdldF9lZWUoZHMsIHAtPnBvcnQsIGUpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTk4OCw4ICsxMDY0LDggQEAKIAkJcC0+b2xkX3BhdXNlID0gcC0+cGh5LT5wYXVzZTsKIAl9CiAKLQlpZiAoZHMtPmRydi0+YWRqdXN0X2xpbmsgJiYgc3RhdHVzX2NoYW5nZWQpCi0JCWRzLT5kcnYtPmFkanVzdF9saW5rKGRzLCBwLT5wb3J0LCBwLT5waHkpOworCWlmIChkcy0+b3BzLT5hZGp1c3RfbGluayAmJiBzdGF0dXNfY2hhbmdlZCkKKwkJZHMtPm9wcy0+YWRqdXN0X2xpbmsoZHMsIHAtPnBvcnQsIHAtPnBoeSk7CiAKIAlpZiAoc3RhdHVzX2NoYW5nZWQpCiAJCXBoeV9wcmludF9zdGF0dXMocC0+cGh5KTsKQEAgLTEwMDQsOCArMTA4MCw4IEBACiAJaWYgKGRldikgewogCQlwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAkJZHMgPSBwLT5wYXJlbnQ7Ci0JCWlmIChkcy0+ZHJ2LT5maXhlZF9saW5rX3VwZGF0ZSkKLQkJCWRzLT5kcnYtPmZpeGVkX2xpbmtfdXBkYXRlKGRzLCBwLT5wb3J0LCBzdGF0dXMpOworCQlpZiAoZHMtPm9wcy0+Zml4ZWRfbGlua191cGRhdGUpCisJCQlkcy0+b3BzLT5maXhlZF9saW5rX3VwZGF0ZShkcywgcC0+cG9ydCwgc3RhdHVzKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTEwNjIsOCArMTEzOCw4IEBACiAJCXBoeV9kbiA9IHBvcnRfZG47CiAJfQogCi0JaWYgKGRzLT5kcnYtPmdldF9waHlfZmxhZ3MpCi0JCXBoeV9mbGFncyA9IGRzLT5kcnYtPmdldF9waHlfZmxhZ3MoZHMsIHAtPnBvcnQpOworCWlmIChkcy0+b3BzLT5nZXRfcGh5X2ZsYWdzKQorCQlwaHlfZmxhZ3MgPSBkcy0+b3BzLT5nZXRfcGh5X2ZsYWdzKGRzLCBwLT5wb3J0KTsKIAogCWlmIChwaHlfZG4pIHsKIAkJaW50IHBoeV9pZCA9IG9mX21kaW9fcGFyc2VfYWRkcigmc2xhdmVfZGV2LT5kZXYsIHBoeV9kbik7CmRpZmYgLS1naXQgYS9uZXQvZHNhL3RhZ19xY2EuYyBiL25ldC9kc2EvdGFnX3FjYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOTBjYWMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvZHNhL3RhZ19xY2EuYwpAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlICJkc2FfcHJpdi5oIgorCisjZGVmaW5lIFFDQV9IRFJfTEVOCTIKKyNkZWZpbmUgUUNBX0hEUl9WRVJTSU9OCTB4MgorCisjZGVmaW5lIFFDQV9IRFJfUkVDVl9WRVJTSU9OX01BU0sJR0VOTUFTSygxNSwgMTQpCisjZGVmaW5lIFFDQV9IRFJfUkVDVl9WRVJTSU9OX1MJCTE0CisjZGVmaW5lIFFDQV9IRFJfUkVDVl9QUklPUklUWV9NQVNLCUdFTk1BU0soMTMsIDExKQorI2RlZmluZSBRQ0FfSERSX1JFQ1ZfUFJJT1JJVFlfUwkJMTEKKyNkZWZpbmUgUUNBX0hEUl9SRUNWX1RZUEVfTUFTSwkJR0VOTUFTSygxMCwgNikKKyNkZWZpbmUgUUNBX0hEUl9SRUNWX1RZUEVfUwkJNgorI2RlZmluZSBRQ0FfSERSX1JFQ1ZfRlJBTUVfSVNfVEFHR0VECUJJVCgzKQorI2RlZmluZSBRQ0FfSERSX1JFQ1ZfU09VUkNFX1BPUlRfTUFTSwlHRU5NQVNLKDIsIDApCisKKyNkZWZpbmUgUUNBX0hEUl9YTUlUX1ZFUlNJT05fTUFTSwlHRU5NQVNLKDE1LCAxNCkKKyNkZWZpbmUgUUNBX0hEUl9YTUlUX1ZFUlNJT05fUwkJMTQKKyNkZWZpbmUgUUNBX0hEUl9YTUlUX1BSSU9SSVRZX01BU0sJR0VOTUFTSygxMywgMTEpCisjZGVmaW5lIFFDQV9IRFJfWE1JVF9QUklPUklUWV9TCQkxMQorI2RlZmluZSBRQ0FfSERSX1hNSVRfQ09OVFJPTF9NQVNLCUdFTk1BU0soMTAsIDgpCisjZGVmaW5lIFFDQV9IRFJfWE1JVF9DT05UUk9MX1MJCTgKKyNkZWZpbmUgUUNBX0hEUl9YTUlUX0ZST01fQ1BVCQlCSVQoNykKKyNkZWZpbmUgUUNBX0hEUl9YTUlUX0RQX0JJVF9NQVNLCUdFTk1BU0soNiwgMCkKKworc3RhdGljIHN0cnVjdCBza19idWZmICpxY2FfdGFnX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUxNiAqcGhkciwgaGRyOworCisJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCWlmIChza2JfY293X2hlYWQoc2tiLCAwKSA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlza2JfcHVzaChza2IsIFFDQV9IRFJfTEVOKTsKKworCW1lbW1vdmUoc2tiLT5kYXRhLCBza2ItPmRhdGEgKyBRQ0FfSERSX0xFTiwgMiAqIEVUSF9BTEVOKTsKKwlwaGRyID0gKHUxNiAqKShza2ItPmRhdGEgKyAyICogRVRIX0FMRU4pOworCisJLyogU2V0IHRoZSB2ZXJzaW9uIGZpZWxkLCBhbmQgc2V0IGRlc3RpbmF0aW9uIHBvcnQgaW5mb3JtYXRpb24gKi8KKwloZHIgPSBRQ0FfSERSX1ZFUlNJT04gPDwgUUNBX0hEUl9YTUlUX1ZFUlNJT05fUyB8CisJCVFDQV9IRFJfWE1JVF9GUk9NX0NQVSB8CisJCUJJVChwLT5wb3J0KTsKKworCSpwaGRyID0gaHRvbnMoaGRyKTsKKworCXJldHVybiBza2I7CisKK291dF9mcmVlOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHFjYV90YWdfcmN2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0LCBzdHJ1Y3QgbmV0X2RldmljZSAqb3JpZ19kZXYpCit7CisJc3RydWN0IGRzYV9zd2l0Y2hfdHJlZSAqZHN0ID0gZGV2LT5kc2FfcHRyOworCXN0cnVjdCBkc2Ffc3dpdGNoICpkczsKKwl1OCB2ZXI7CisJaW50IHBvcnQ7CisJX19iZTE2ICpwaGRyLCBoZHI7CisKKwlpZiAodW5saWtlbHkoIWRzdCkpCisJCWdvdG8gb3V0X2Ryb3A7CisKKwlza2IgPSBza2JfdW5zaGFyZShza2IsIEdGUF9BVE9NSUMpOworCWlmICghc2tiKQorCQlnb3RvIG91dDsKKworCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIFFDQV9IRFJfTEVOKSkpCisJCWdvdG8gb3V0X2Ryb3A7CisKKwkvKiBUaGUgUUNBIGhlYWRlciBpcyBhZGRlZCBieSB0aGUgc3dpdGNoIGJldHdlZW4gc3JjIGFkZHIgYW5kIEV0aGVydHlwZQorCSAqIEF0IHRoaXMgcG9pbnQsIHNrYi0+ZGF0YSBwb2ludHMgdG8gZXRoZXJ0eXBlIHNvIGhlYWRlciBzaG91bGQgYmUKKwkgKiByaWdodCBiZWZvcmUKKwkgKi8KKwlwaGRyID0gKF9fYmUxNiAqKShza2ItPmRhdGEgLSAyKTsKKwloZHIgPSBudG9ocygqcGhkcik7CisKKwkvKiBNYWtlIHN1cmUgdGhlIHZlcnNpb24gaXMgY29ycmVjdCAqLworCXZlciA9IChoZHIgJiBRQ0FfSERSX1JFQ1ZfVkVSU0lPTl9NQVNLKSA+PiBRQ0FfSERSX1JFQ1ZfVkVSU0lPTl9TOworCWlmICh1bmxpa2VseSh2ZXIgIT0gUUNBX0hEUl9WRVJTSU9OKSkKKwkJZ290byBvdXRfZHJvcDsKKworCS8qIFJlbW92ZSBRQ0EgdGFnIGFuZCByZWNhbGN1bGF0ZSBjaGVja3N1bSAqLworCXNrYl9wdWxsX3Jjc3VtKHNrYiwgUUNBX0hEUl9MRU4pOworCW1lbW1vdmUoc2tiLT5kYXRhIC0gRVRIX0hMRU4sIHNrYi0+ZGF0YSAtIEVUSF9ITEVOIC0gUUNBX0hEUl9MRU4sCisJCUVUSF9ITEVOIC0gUUNBX0hEUl9MRU4pOworCisJLyogVGhpcyBwcm90b2NvbCBkb2Vzbid0IHN1cHBvcnQgY2FzY2FkaW5nIG11bHRpcGxlIHN3aXRjaGVzIHNvIGl0J3MKKwkgKiBzYWZlIHRvIGFzc3VtZSB0aGUgc3dpdGNoIGlzIGZpcnN0IGluIHRoZSB0cmVlCisJICovCisJZHMgPSBkc3QtPmRzWzBdOworCWlmICghZHMpCisJCWdvdG8gb3V0X2Ryb3A7CisKKwkvKiBHZXQgc291cmNlIHBvcnQgaW5mb3JtYXRpb24gKi8KKwlwb3J0ID0gKGhkciAmIFFDQV9IRFJfUkVDVl9TT1VSQ0VfUE9SVF9NQVNLKTsKKwlpZiAoIWRzLT5wb3J0c1twb3J0XS5uZXRkZXYpCisJCWdvdG8gb3V0X2Ryb3A7CisKKwkvKiBVcGRhdGUgc2tiICYgZm9yd2FyZCB0aGUgZnJhbWUgYWNjb3JkaW5nbHkgKi8KKwlza2JfcHVzaChza2IsIEVUSF9ITEVOKTsKKwlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CisJc2tiLT5kZXYgPSBkcy0+cG9ydHNbcG9ydF0ubmV0ZGV2OworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHNrYi0+ZGV2KTsKKworCXNrYi0+ZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJc2tiLT5kZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCisJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworCitvdXRfZHJvcDoKKwlrZnJlZV9za2Ioc2tiKTsKK291dDoKKwlyZXR1cm4gMDsKK30KKworY29uc3Qgc3RydWN0IGRzYV9kZXZpY2Vfb3BzIHFjYV9uZXRkZXZfb3BzID0geworCS54bWl0CT0gcWNhX3RhZ194bWl0LAorCS5yY3YJPSBxY2FfdGFnX3JjdiwKK307CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9LY29uZmlnIGIvbmV0L2lwdjQvS2NvbmZpZwppbmRleCA1MGQ2YTliLi4zMDBiMDY4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9LY29uZmlnCisrKyBiL25ldC9pcHY0L0tjb25maWcKQEAgLTY0MCw2ICs2NDAsMjEgQEAKIAkgIEQuQS4gSGF5ZXMgYW5kIEcuIEFybWl0YWdlLiAiUmV2aXNpdGluZyBUQ1AgY29uZ2VzdGlvbiBjb250cm9sIHVzaW5nCiAJICBkZWxheSBncmFkaWVudHMuIiBJbiBOZXR3b3JraW5nIDIwMTEuIFByZXByaW50OiBodHRwOi8vZ29vLmdsL05vM3ZkZwogCitjb25maWcgVENQX0NPTkdfQkJSCisJdHJpc3RhdGUgIkJCUiBUQ1AiCisJZGVmYXVsdCBuCisJLS0taGVscC0tLQorCisJQkJSIChCb3R0bGVuZWNrIEJhbmR3aWR0aCBhbmQgUlRUKSBUQ1AgY29uZ2VzdGlvbiBjb250cm9sIGFpbXMgdG8KKwltYXhpbWl6ZSBuZXR3b3JrIHV0aWxpemF0aW9uIGFuZCBtaW5pbWl6ZSBxdWV1ZXMuIEl0IGJ1aWxkcyBhbiBleHBsaWNpdAorCW1vZGVsIG9mIHRoZSB0aGUgYm90dGxlbmVjayBkZWxpdmVyeSByYXRlIGFuZCBwYXRoIHJvdW5kLXRyaXAKKwlwcm9wYWdhdGlvbiBkZWxheS4gSXQgdG9sZXJhdGVzIHBhY2tldCBsb3NzIGFuZCBkZWxheSB1bnJlbGF0ZWQgdG8KKwljb25nZXN0aW9uLiBJdCBjYW4gb3BlcmF0ZSBvdmVyIExBTiwgV0FOLCBjZWxsdWxhciwgd2lmaSwgb3IgY2FibGUKKwltb2RlbSBsaW5rcy4gSXQgY2FuIGNvZXhpc3Qgd2l0aCBmbG93cyB0aGF0IHVzZSBsb3NzLWJhc2VkIGNvbmdlc3Rpb24KKwljb250cm9sLCBhbmQgY2FuIG9wZXJhdGUgd2l0aCBzaGFsbG93IGJ1ZmZlcnMsIGRlZXAgYnVmZmVycywKKwlidWZmZXJibG9hdCwgcG9saWNlcnMsIG9yIEFRTSBzY2hlbWVzIHRoYXQgZG8gbm90IHByb3ZpZGUgYSBkZWxheQorCXNpZ25hbC4gSXQgcmVxdWlyZXMgdGhlIGZxICgiRmFpciBRdWV1ZSIpIHBhY2luZyBwYWNrZXQgc2NoZWR1bGVyLgorCiBjaG9pY2UKIAlwcm9tcHQgIkRlZmF1bHQgVENQIGNvbmdlc3Rpb24gY29udHJvbCIKIAlkZWZhdWx0IERFRkFVTFRfQ1VCSUMKQEAgLTY3NCw2ICs2ODksOSBAQAogCWNvbmZpZyBERUZBVUxUX0NERwogCQlib29sICJDREciIGlmIFRDUF9DT05HX0NERz15CiAKKwljb25maWcgREVGQVVMVF9CQlIKKwkJYm9vbCAiQkJSIiBpZiBUQ1BfQ09OR19CQlI9eQorCiAJY29uZmlnIERFRkFVTFRfUkVOTwogCQlib29sICJSZW5vIgogZW5kY2hvaWNlCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9NYWtlZmlsZSBiL25ldC9pcHY0L01ha2VmaWxlCmluZGV4IDI0NjI5YjYuLmJjNmE2YzggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L01ha2VmaWxlCisrKyBiL25ldC9pcHY0L01ha2VmaWxlCkBAIC04LDcgKzgsNyBAQAogCSAgICAgaW5ldF90aW1ld2FpdF9zb2NrLm8gaW5ldF9jb25uZWN0aW9uX3NvY2subyBcCiAJICAgICB0Y3AubyB0Y3BfaW5wdXQubyB0Y3Bfb3V0cHV0Lm8gdGNwX3RpbWVyLm8gdGNwX2lwdjQubyBcCiAJICAgICB0Y3BfbWluaXNvY2tzLm8gdGNwX2NvbmcubyB0Y3BfbWV0cmljcy5vIHRjcF9mYXN0b3Blbi5vIFwKLQkgICAgIHRjcF9yZWNvdmVyeS5vIFwKKwkgICAgIHRjcF9yYXRlLm8gdGNwX3JlY292ZXJ5Lm8gXAogCSAgICAgdGNwX29mZmxvYWQubyBkYXRhZ3JhbS5vIHJhdy5vIHVkcC5vIHVkcGxpdGUubyBcCiAJICAgICB1ZHBfb2ZmbG9hZC5vIGFycC5vIGljbXAubyBkZXZpbmV0Lm8gYWZfaW5ldC5vIGlnbXAubyBcCiAJICAgICBmaWJfZnJvbnRlbmQubyBmaWJfc2VtYW50aWNzLm8gZmliX3RyaWUubyBcCkBAIC00MSw2ICs0MSw3IEBACiBvYmotJChDT05GSUdfSU5FVF9UQ1BfRElBRykgKz0gdGNwX2RpYWcubwogb2JqLSQoQ09ORklHX0lORVRfVURQX0RJQUcpICs9IHVkcF9kaWFnLm8KIG9iai0kKENPTkZJR19ORVRfVENQUFJPQkUpICs9IHRjcF9wcm9iZS5vCitvYmotJChDT05GSUdfVENQX0NPTkdfQkJSKSArPSB0Y3BfYmJyLm8KIG9iai0kKENPTkZJR19UQ1BfQ09OR19CSUMpICs9IHRjcF9iaWMubwogb2JqLSQoQ09ORklHX1RDUF9DT05HX0NERykgKz0gdGNwX2NkZy5vCiBvYmotJChDT05GSUdfVENQX0NPTkdfQ1VCSUMpICs9IHRjcF9jdWJpYy5vCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9hZl9pbmV0LmMgYi9uZXQvaXB2NC9hZl9pbmV0LmMKaW5kZXggNTU1MTNlNi4uMWVmZmM5OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvYWZfaW5ldC5jCisrKyBiL25ldC9pcHY0L2FmX2luZXQuYwpAQCAtMjExLDI0ICsyMTEsMTkgQEAKIAkgKiB3ZSBjYW4gb25seSBhbGxvdyB0aGUgYmFja2xvZyB0byBiZSBhZGp1c3RlZC4KIAkgKi8KIAlpZiAob2xkX3N0YXRlICE9IFRDUF9MSVNURU4pIHsKLQkJLyogQ2hlY2sgc3BlY2lhbCBzZXR1cHMgZm9yIHRlc3RpbmcgcHVycG9zZSB0byBlbmFibGUgVEZPIHcvbwotCQkgKiByZXF1aXJpbmcgVENQX0ZBU1RPUEVOIHNvY2tvcHQuCisJCS8qIEVuYWJsZSBURk8gdy9vIHJlcXVpcmluZyBUQ1BfRkFTVE9QRU4gc29ja2V0IG9wdGlvbi4KIAkJICogTm90ZSB0aGF0IG9ubHkgVENQIHNvY2tldHMgKFNPQ0tfU1RSRUFNKSB3aWxsIHJlYWNoIGhlcmUuCi0JCSAqIEFsc28gZmFzdG9wZW5xIG1heSBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJlY2F1c2UgdGhpcwotCQkgKiBzb2NrZXQgd2FzIGluIFRDUF9MSVNURU4gc3RhdGUgcHJldmlvdXNseSBidXQgd2FzCi0JCSAqIHNodXRkb3duKCkgKHJhdGhlciB0aGFuIGNsb3NlKCkpLgorCQkgKiBBbHNvIGZhc3RvcGVuIGJhY2tsb2cgbWF5IGFscmVhZHkgYmVlbiBzZXQgdmlhIHRoZSBvcHRpb24KKwkJICogYmVjYXVzZSB0aGUgc29ja2V0IHdhcyBpbiBUQ1BfTElTVEVOIHN0YXRlIHByZXZpb3VzbHkgYnV0CisJCSAqIHdhcyBzaHV0ZG93bigpIHJhdGhlciB0aGFuIGNsb3NlKCkuCiAJCSAqLwotCQlpZiAoKHN5c2N0bF90Y3BfZmFzdG9wZW4gJiBURk9fU0VSVkVSX0VOQUJMRSkgIT0gMCAmJgorCQlpZiAoKHN5c2N0bF90Y3BfZmFzdG9wZW4gJiBURk9fU0VSVkVSX1dPX1NPQ0tPUFQxKSAmJgorCQkgICAgKHN5c2N0bF90Y3BfZmFzdG9wZW4gJiBURk9fU0VSVkVSX0VOQUJMRSkgJiYKIAkJICAgICFpbmV0X2NzayhzayktPmljc2tfYWNjZXB0X3F1ZXVlLmZhc3RvcGVucS5tYXhfcWxlbikgewotCQkJaWYgKChzeXNjdGxfdGNwX2Zhc3RvcGVuICYgVEZPX1NFUlZFUl9XT19TT0NLT1BUMSkgIT0gMCkKLQkJCQlmYXN0b3Blbl9xdWV1ZV90dW5lKHNrLCBiYWNrbG9nKTsKLQkJCWVsc2UgaWYgKChzeXNjdGxfdGNwX2Zhc3RvcGVuICYKLQkJCQkgIFRGT19TRVJWRVJfV09fU09DS09QVDIpICE9IDApCi0JCQkJZmFzdG9wZW5fcXVldWVfdHVuZShzaywKLQkJCQkgICAgKCh1aW50KXN5c2N0bF90Y3BfZmFzdG9wZW4pID4+IDE2KTsKLQorCQkJZmFzdG9wZW5fcXVldWVfdHVuZShzaywgYmFja2xvZyk7CiAJCQl0Y3BfZmFzdG9wZW5faW5pdF9rZXlfb25jZSh0cnVlKTsKIAkJfQorCiAJCWVyciA9IGluZXRfY3NrX2xpc3Rlbl9zdGFydChzaywgYmFja2xvZyk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKQEAgLTkyMSw2ICs5MTYsOCBAQAogCS5tbWFwCQkgICA9IHNvY2tfbm9fbW1hcCwKIAkuc2VuZHBhZ2UJICAgPSBpbmV0X3NlbmRwYWdlLAogCS5zcGxpY2VfcmVhZAkgICA9IHRjcF9zcGxpY2VfcmVhZCwKKwkucmVhZF9zb2NrCSAgID0gdGNwX3JlYWRfc29jaywKKwkucGVla19sZW4JICAgPSB0Y3BfcGVla19sZW4sCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCS5jb21wYXRfc2V0c29ja29wdCA9IGNvbXBhdF9zb2NrX2NvbW1vbl9zZXRzb2Nrb3B0LAogCS5jb21wYXRfZ2V0c29ja29wdCA9IGNvbXBhdF9zb2NrX2NvbW1vbl9nZXRzb2Nrb3B0LApAQCAtMTE5NSw3ICsxMTkyLDcgQEAKIHN0cnVjdCBza19idWZmICppbmV0X2dzb19zZWdtZW50KHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewotCWJvb2wgdWRwZnJhZyA9IGZhbHNlLCBmaXhlZGlkID0gZmFsc2UsIGVuY2FwOworCWJvb2wgdWRwZnJhZyA9IGZhbHNlLCBmaXhlZGlkID0gZmFsc2UsIGdzb19wYXJ0aWFsLCBlbmNhcDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2VncyA9IEVSUl9QVFIoLUVJTlZBTCk7CiAJY29uc3Qgc3RydWN0IG5ldF9vZmZsb2FkICpvcHM7CiAJdW5zaWduZWQgaW50IG9mZnNldCA9IDA7CkBAIC0xMjQ4LDYgKzEyNDUsOCBAQAogCWlmIChJU19FUlJfT1JfTlVMTChzZWdzKSkKIAkJZ290byBvdXQ7CiAKKwlnc29fcGFydGlhbCA9ICEhKHNrYl9zaGluZm8oc2VncyktPmdzb190eXBlICYgU0tCX0dTT19QQVJUSUFMKTsKKwogCXNrYiA9IHNlZ3M7CiAJZG8gewogCQlpcGggPSAoc3RydWN0IGlwaGRyICopKHNrYl9tYWNfaGVhZGVyKHNrYikgKyBuaG9mZik7CkBAIC0xMjYyLDkgKzEyNjEsMTMgQEAKIAkJCQlpcGgtPmlkID0gaHRvbnMoaWQpOwogCQkJCWlkICs9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NlZ3M7CiAJCQl9Ci0JCQl0b3RfbGVuID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSArCi0JCQkJICBTS0JfR1NPX0NCKHNrYiktPmRhdGFfb2Zmc2V0ICsKLQkJCQkgIHNrYi0+aGVhZCAtICh1bnNpZ25lZCBjaGFyICopaXBoOworCisJCQlpZiAoZ3NvX3BhcnRpYWwpCisJCQkJdG90X2xlbiA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgKworCQkJCQkgIFNLQl9HU09fQ0Ioc2tiKS0+ZGF0YV9vZmZzZXQgKworCQkJCQkgIHNrYi0+aGVhZCAtICh1bnNpZ25lZCBjaGFyICopaXBoOworCQkJZWxzZQorCQkJCXRvdF9sZW4gPSBza2ItPmxlbiAtIG5ob2ZmOwogCQl9IGVsc2UgewogCQkJaWYgKCFmaXhlZGlkKQogCQkJCWlwaC0+aWQgPSBodG9ucyhpZCsrKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2RldmluZXQuYyBiL25ldC9pcHY0L2RldmluZXQuYwppbmRleCA0MTVlMTE3Li4wNjJhNjdjIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9kZXZpbmV0LmMKKysrIGIvbmV0L2lwdjQvZGV2aW5ldC5jCkBAIC0yMjMyLDcgKzIyMzIsNyBAQAogfTsKIAogc3RhdGljIGludCBfX2RldmluZXRfc3lzY3RsX3JlZ2lzdGVyKHN0cnVjdCBuZXQgKm5ldCwgY2hhciAqZGV2X25hbWUsCi0JCQkJCXN0cnVjdCBpcHY0X2RldmNvbmYgKnApCisJCQkJICAgICBpbnQgaWZpbmRleCwgc3RydWN0IGlwdjRfZGV2Y29uZiAqcCkKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgZGV2aW5ldF9zeXNjdGxfdGFibGUgKnQ7CkBAIC0yMjU1LDYgKzIyNTUsOCBAQAogCQlnb3RvIGZyZWU7CiAKIAlwLT5zeXNjdGwgPSB0OworCisJaW5ldF9uZXRjb25mX25vdGlmeV9kZXZjb25mKG5ldCwgTkVUQ09ORkFfQUxMLCBpZmluZGV4LCBwKTsKIAlyZXR1cm4gMDsKIAogZnJlZToKQEAgLTIyODYsNyArMjI4OCw3IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAllcnIgPSBfX2RldmluZXRfc3lzY3RsX3JlZ2lzdGVyKGRldl9uZXQoaWRldi0+ZGV2KSwgaWRldi0+ZGV2LT5uYW1lLAotCQkJCQkmaWRldi0+Y25mKTsKKwkJCQkJaWRldi0+ZGV2LT5pZmluZGV4LCAmaWRldi0+Y25mKTsKIAlpZiAoZXJyKQogCQluZWlnaF9zeXNjdGxfdW5yZWdpc3RlcihpZGV2LT5hcnBfcGFybXMpOwogCXJldHVybiBlcnI7CkBAIC0yMzQ3LDExICsyMzQ5LDEyIEBACiAJfQogCiAjaWZkZWYgQ09ORklHX1NZU0NUTAotCWVyciA9IF9fZGV2aW5ldF9zeXNjdGxfcmVnaXN0ZXIobmV0LCAiYWxsIiwgYWxsKTsKKwllcnIgPSBfX2RldmluZXRfc3lzY3RsX3JlZ2lzdGVyKG5ldCwgImFsbCIsIE5FVENPTkZBX0lGSU5ERVhfQUxMLCBhbGwpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycl9yZWdfYWxsOwogCi0JZXJyID0gX19kZXZpbmV0X3N5c2N0bF9yZWdpc3RlcihuZXQsICJkZWZhdWx0IiwgZGZsdCk7CisJZXJyID0gX19kZXZpbmV0X3N5c2N0bF9yZWdpc3RlcihuZXQsICJkZWZhdWx0IiwKKwkJCQkJTkVUQ09ORkFfSUZJTkRFWF9ERUZBVUxULCBkZmx0KTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnJfcmVnX2RmbHQ7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2ZpYl9mcm9udGVuZC5jIGIvbmV0L2lwdjQvZmliX2Zyb250ZW5kLmMKaW5kZXggZWYyZWJlYi4uYzNiODA0NyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZmliX2Zyb250ZW5kLmMKKysrIGIvbmV0L2lwdjQvZmliX2Zyb250ZW5kLmMKQEAgLTkzLDkgKzkzLDYgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlzd2l0Y2ggKGlkKSB7Ci0JY2FzZSBSVF9UQUJMRV9MT0NBTDoKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKG5ldC0+aXB2NC5maWJfbG9jYWwsIHRiKTsKLQkJYnJlYWs7CiAJY2FzZSBSVF9UQUJMRV9NQUlOOgogCQlyY3VfYXNzaWduX3BvaW50ZXIobmV0LT5pcHY0LmZpYl9tYWluLCB0Yik7CiAJCWJyZWFrOwpAQCAtMTM3LDkgKzEzNCw2IEBACiB7CiAjaWZkZWYgQ09ORklHX0lQX01VTFRJUExFX1RBQkxFUwogCXN3aXRjaCAobmV3LT50Yl9pZCkgewotCWNhc2UgUlRfVEFCTEVfTE9DQUw6Ci0JCXJjdV9hc3NpZ25fcG9pbnRlcihuZXQtPmlwdjQuZmliX2xvY2FsLCBuZXcpOwotCQlicmVhazsKIAljYXNlIFJUX1RBQkxFX01BSU46CiAJCXJjdV9hc3NpZ25fcG9pbnRlcihuZXQtPmlwdjQuZmliX21haW4sIG5ldyk7CiAJCWJyZWFrOwpAQCAtMTg4LDI2ICsxODIsMTMgQEAKIAkJc3RydWN0IGZpYl90YWJsZSAqdGI7CiAKIAkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0YiwgdG1wLCBoZWFkLCB0Yl9obGlzdCkKLQkJCWZsdXNoZWQgKz0gZmliX3RhYmxlX2ZsdXNoKHRiKTsKKwkJCWZsdXNoZWQgKz0gZmliX3RhYmxlX2ZsdXNoKG5ldCwgdGIpOwogCX0KIAogCWlmIChmbHVzaGVkKQogCQlydF9jYWNoZV9mbHVzaChuZXQpOwogfQogCi12b2lkIGZpYl9mbHVzaF9leHRlcm5hbChzdHJ1Y3QgbmV0ICpuZXQpCi17Ci0Jc3RydWN0IGZpYl90YWJsZSAqdGI7Ci0Jc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7Ci0JdW5zaWduZWQgaW50IGg7Ci0KLQlmb3IgKGggPSAwOyBoIDwgRklCX1RBQkxFX0hBU0hTWjsgaCsrKSB7Ci0JCWhlYWQgPSAmbmV0LT5pcHY0LmZpYl90YWJsZV9oYXNoW2hdOwotCQlobGlzdF9mb3JfZWFjaF9lbnRyeSh0YiwgaGVhZCwgdGJfaGxpc3QpCi0JCQlmaWJfdGFibGVfZmx1c2hfZXh0ZXJuYWwodGIpOwotCX0KLX0KLQogLyoKICAqIEZpbmQgYWRkcmVzcyB0eXBlIGFzIGlmIG9ubHkgImRldiIgd2FzIHByZXNlbnQgaW4gdGhlIHN5c3RlbS4gSWYKICAqIG9uX2RldiBpcyBOVUxMIHRoZW4gYWxsIGludGVyZmFjZXMgYXJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvbi4KQEAgLTUwOSw2ICs0OTAsNyBAQAogCQlpZiAoIWRldikKIAkJCXJldHVybiAtRU5PREVWOwogCQljZmctPmZjX29pZiA9IGRldi0+aWZpbmRleDsKKwkJY2ZnLT5mY190YWJsZSA9IGwzbWRldl9maWJfdGFibGUoZGV2KTsKIAkJaWYgKGNvbG9uKSB7CiAJCQlzdHJ1Y3QgaW5faWZhZGRyICppZmE7CiAJCQlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYgPSBfX2luX2Rldl9nZXRfcnRubChkZXYpOwpAQCAtNTk1LDEzICs1NzcsMTMgQEAKIAkJCWlmIChjbWQgPT0gU0lPQ0RFTFJUKSB7CiAJCQkJdGIgPSBmaWJfZ2V0X3RhYmxlKG5ldCwgY2ZnLmZjX3RhYmxlKTsKIAkJCQlpZiAodGIpCi0JCQkJCWVyciA9IGZpYl90YWJsZV9kZWxldGUodGIsICZjZmcpOworCQkJCQllcnIgPSBmaWJfdGFibGVfZGVsZXRlKG5ldCwgdGIsICZjZmcpOwogCQkJCWVsc2UKIAkJCQkJZXJyID0gLUVTUkNIOwogCQkJfSBlbHNlIHsKIAkJCQl0YiA9IGZpYl9uZXdfdGFibGUobmV0LCBjZmcuZmNfdGFibGUpOwogCQkJCWlmICh0YikKLQkJCQkJZXJyID0gZmliX3RhYmxlX2luc2VydCh0YiwgJmNmZyk7CisJCQkJCWVyciA9IGZpYl90YWJsZV9pbnNlcnQobmV0LCB0YiwgJmNmZyk7CiAJCQkJZWxzZQogCQkJCQllcnIgPSAtRU5PQlVGUzsKIAkJCX0KQEAgLTcyNCw3ICs3MDYsNyBAQAogCQlnb3RvIGVycm91dDsKIAl9CiAKLQllcnIgPSBmaWJfdGFibGVfZGVsZXRlKHRiLCAmY2ZnKTsKKwllcnIgPSBmaWJfdGFibGVfZGVsZXRlKG5ldCwgdGIsICZjZmcpOwogZXJyb3V0OgogCXJldHVybiBlcnI7CiB9CkBAIC03NDYsNyArNzI4LDcgQEAKIAkJZ290byBlcnJvdXQ7CiAJfQogCi0JZXJyID0gZmliX3RhYmxlX2luc2VydCh0YiwgJmNmZyk7CisJZXJyID0gZmliX3RhYmxlX2luc2VydChuZXQsIHRiLCAmY2ZnKTsKIGVycm91dDoKIAlyZXR1cm4gZXJyOwogfQpAQCAtODMzLDkgKzgxNSw5IEBACiAJCWNmZy5mY19zY29wZSA9IFJUX1NDT1BFX0hPU1Q7CiAKIAlpZiAoY21kID09IFJUTV9ORVdST1VURSkKLQkJZmliX3RhYmxlX2luc2VydCh0YiwgJmNmZyk7CisJCWZpYl90YWJsZV9pbnNlcnQobmV0LCB0YiwgJmNmZyk7CiAJZWxzZQotCQlmaWJfdGFibGVfZGVsZXRlKHRiLCAmY2ZnKTsKKwkJZmliX3RhYmxlX2RlbGV0ZShuZXQsIHRiLCAmY2ZnKTsKIH0KIAogdm9pZCBmaWJfYWRkX2lmYWRkcihzdHJ1Y3QgaW5faWZhZGRyICppZmEpCkBAIC0xMDI3LDcgKzEwMDksNyBAQAogCQkJICogRmlyc3Qgb2YgYWxsLCB3ZSBzY2FuIGZpYl9pbmZvIGxpc3Qgc2VhcmNoaW5nCiAJCQkgKiBmb3Igc3RyYXkgbmV4dGhvcCBlbnRyaWVzLCB0aGVuIGlnbml0ZSBmaWJfZmx1c2guCiAJCQkgKi8KLQkJCWlmIChmaWJfc3luY19kb3duX2FkZHIoZGV2X25ldChkZXYpLCBpZmEtPmlmYV9sb2NhbCkpCisJCQlpZiAoZmliX3N5bmNfZG93bl9hZGRyKGRldiwgaWZhLT5pZmFfbG9jYWwpKQogCQkJCWZpYl9mbHVzaChkZXZfbmV0KGRldikpOwogCQl9CiAJfQpAQCAtMTI0OSw3ICsxMjMxLDYgQEAKIAogCXJ0bmxfbG9jaygpOwogI2lmZGVmIENPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVMKLQlSQ1VfSU5JVF9QT0lOVEVSKG5ldC0+aXB2NC5maWJfbG9jYWwsIE5VTEwpOwogCVJDVV9JTklUX1BPSU5URVIobmV0LT5pcHY0LmZpYl9tYWluLCBOVUxMKTsKIAlSQ1VfSU5JVF9QT0lOVEVSKG5ldC0+aXB2NC5maWJfZGVmYXVsdCwgTlVMTCk7CiAjZW5kaWYKQEAgLTEyNjAsNyArMTI0MSw3IEBACiAKIAkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0YiwgdG1wLCBoZWFkLCB0Yl9obGlzdCkgewogCQkJaGxpc3RfZGVsKCZ0Yi0+dGJfaGxpc3QpOwotCQkJZmliX3RhYmxlX2ZsdXNoKHRiKTsKKwkJCWZpYl90YWJsZV9mbHVzaChuZXQsIHRiKTsKIAkJCWZpYl9mcmVlX3RhYmxlKHRiKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2ZpYl9ydWxlcy5jIGIvbmV0L2lwdjQvZmliX3J1bGVzLmMKaW5kZXggNmU5ZWE2OS4uMmU1MDA2MiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZmliX3J1bGVzLmMKKysrIGIvbmV0L2lwdjQvZmliX3J1bGVzLmMKQEAgLTU2LDYgKzU2LDkgQEAKIAl9OwogCWludCBlcnI7CiAKKwkvKiB1cGRhdGUgZmxvdyBpZiBvaWYgb3IgaWlmIHBvaW50IHRvIGRldmljZSBlbnNsYXZlZCB0byBsM21kZXYgKi8KKwlsM21kZXZfdXBkYXRlX2Zsb3cobmV0LCBmbG93aTRfdG9fZmxvd2koZmxwKSk7CisKIAllcnIgPSBmaWJfcnVsZXNfbG9va3VwKG5ldC0+aXB2NC5ydWxlc19vcHMsIGZsb3dpNF90b19mbG93aShmbHApLCAwLCAmYXJnKTsKICNpZmRlZiBDT05GSUdfSVBfUk9VVEVfQ0xBU1NJRAogCWlmIChhcmcucnVsZSkKQEAgLTE2MSw2ICsxNjQsMTQgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGludCBjYWxsX2ZpYl9ydWxlX25vdGlmaWVycyhzdHJ1Y3QgbmV0ICpuZXQsCisJCQkJICAgZW51bSBmaWJfZXZlbnRfdHlwZSBldmVudF90eXBlKQoreworCXN0cnVjdCBmaWJfbm90aWZpZXJfaW5mbyBpbmZvOworCisJcmV0dXJuIGNhbGxfZmliX25vdGlmaWVycyhuZXQsIGV2ZW50X3R5cGUsICZpbmZvKTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IGZpYjRfcnVsZV9wb2xpY3lbRlJBX01BWCsxXSA9IHsKIAlGUkFfR0VORVJJQ19QT0xJQ1ksCiAJW0ZSQV9GTE9XXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCkBAIC0yMTcsNyArMjI4LDcgQEAKIAlydWxlNC0+dG9zID0gZnJoLT50b3M7CiAKIAluZXQtPmlwdjQuZmliX2hhc19jdXN0b21fcnVsZXMgPSB0cnVlOwotCWZpYl9mbHVzaF9leHRlcm5hbChydWxlLT5mcl9uZXQpOworCWNhbGxfZmliX3J1bGVfbm90aWZpZXJzKG5ldCwgRklCX0VWRU5UX1JVTEVfQUREKTsKIAogCWVyciA9IDA7CiBlcnJvdXQ6CkBAIC0yMzksNyArMjUwLDcgQEAKIAkJbmV0LT5pcHY0LmZpYl9udW1fdGNsYXNzaWRfdXNlcnMtLTsKICNlbmRpZgogCW5ldC0+aXB2NC5maWJfaGFzX2N1c3RvbV9ydWxlcyA9IHRydWU7Ci0JZmliX2ZsdXNoX2V4dGVybmFsKHJ1bGUtPmZyX25ldCk7CisJY2FsbF9maWJfcnVsZV9ub3RpZmllcnMobmV0LCBGSUJfRVZFTlRfUlVMRV9ERUwpOwogZXJyb3V0OgogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9maWJfc2VtYW50aWNzLmMgYi9uZXQvaXB2NC9maWJfc2VtYW50aWNzLmMKaW5kZXggNTM5ZmEyNi4uMzg4ZDNlMiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZmliX3NlbWFudGljcy5jCisrKyBiL25ldC9pcHY0L2ZpYl9zZW1hbnRpY3MuYwpAQCAtMTA1Nyw2ICsxMDU3LDcgQEAKIAlmaS0+ZmliX3ByaW9yaXR5ID0gY2ZnLT5mY19wcmlvcml0eTsKIAlmaS0+ZmliX3ByZWZzcmMgPSBjZmctPmZjX3ByZWZzcmM7CiAJZmktPmZpYl90eXBlID0gY2ZnLT5mY190eXBlOworCWZpLT5maWJfdGJfaWQgPSBjZmctPmZjX3RhYmxlOwogCiAJZmktPmZpYl9uaHMgPSBuaHM7CiAJY2hhbmdlX25leHRob3BzKGZpKSB7CkBAIC0xMzM3LDE4ICsxMzM4LDIxIEBACiAgKiAgIHJlZmVycmluZyB0byBpdC4KICAqIC0gZGV2aWNlIHdlbnQgZG93biAtPiB3ZSBtdXN0IHNodXRkb3duIGFsbCBuZXh0aG9wcyBnb2luZyB2aWEgaXQuCiAgKi8KLWludCBmaWJfc3luY19kb3duX2FkZHIoc3RydWN0IG5ldCAqbmV0LCBfX2JlMzIgbG9jYWwpCitpbnQgZmliX3N5bmNfZG93bl9hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fYmUzMiBsb2NhbCkKIHsKIAlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBpbnQgaGFzaCA9IGZpYl9sYWRkcl9oYXNoZm4obG9jYWwpOwogCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkID0gJmZpYl9pbmZvX2xhZGRyaGFzaFtoYXNoXTsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KGRldik7CisJaW50IHRiX2lkID0gbDNtZGV2X2ZpYl90YWJsZShkZXYpOwogCXN0cnVjdCBmaWJfaW5mbyAqZmk7CiAKIAlpZiAoIWZpYl9pbmZvX2xhZGRyaGFzaCB8fCBsb2NhbCA9PSAwKQogCQlyZXR1cm4gMDsKIAogCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGZpLCBoZWFkLCBmaWJfbGhhc2gpIHsKLQkJaWYgKCFuZXRfZXEoZmktPmZpYl9uZXQsIG5ldCkpCisJCWlmICghbmV0X2VxKGZpLT5maWJfbmV0LCBuZXQpIHx8CisJCSAgICBmaS0+ZmliX3RiX2lkICE9IHRiX2lkKQogCQkJY29udGludWU7CiAJCWlmIChmaS0+ZmliX3ByZWZzcmMgPT0gbG9jYWwpIHsKIAkJCWZpLT5maWJfZmxhZ3MgfD0gUlROSF9GX0RFQUQ7CkBAIC0xNTc2LDcgKzE1ODAsOCBAQAogCiAJCXJjdV9yZWFkX2xvY2tfYmgoKTsKIAotCQluID0gX19pcHY0X25laWdoX2xvb2t1cF9ub3JlZihuaC0+bmhfZGV2LCBuaC0+bmhfZ3cpOworCQluID0gX19pcHY0X25laWdoX2xvb2t1cF9ub3JlZihuaC0+bmhfZGV2LAorCQkJCQkgICAgICAoX19mb3JjZSB1MzIpbmgtPm5oX2d3KTsKIAkJaWYgKG4pCiAJCQlzdGF0ZSA9IG4tPm51ZF9zdGF0ZTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZmliX3RyaWUuYyBiL25ldC9pcHY0L2ZpYl90cmllLmMKaW5kZXggZDA3ZmMwNy4uMzFjZWYzNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZmliX3RyaWUuYworKysgYi9uZXQvaXB2NC9maWJfdHJpZS5jCkBAIC03Myw2ICs3Myw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CkBAIC04MCwxMCArODEsNDcgQEAKICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvaXBfZmliLmg+Ci0jaW5jbHVkZSA8bmV0L3N3aXRjaGRldi5oPgogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9maWIuaD4KICNpbmNsdWRlICJmaWJfbG9va3VwLmgiCiAKK3N0YXRpYyBCTE9DS0lOR19OT1RJRklFUl9IRUFEKGZpYl9jaGFpbik7CisKK2ludCByZWdpc3Rlcl9maWJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJmZpYl9jaGFpbiwgbmIpOworfQorRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9maWJfbm90aWZpZXIpOworCitpbnQgdW5yZWdpc3Rlcl9maWJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmZmliX2NoYWluLCBuYik7Cit9CitFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfZmliX25vdGlmaWVyKTsKKworaW50IGNhbGxfZmliX25vdGlmaWVycyhzdHJ1Y3QgbmV0ICpuZXQsIGVudW0gZmliX2V2ZW50X3R5cGUgZXZlbnRfdHlwZSwKKwkJICAgICAgIHN0cnVjdCBmaWJfbm90aWZpZXJfaW5mbyAqaW5mbykKK3sKKwlpbmZvLT5uZXQgPSBuZXQ7CisJcmV0dXJuIGJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmZpYl9jaGFpbiwgZXZlbnRfdHlwZSwgaW5mbyk7Cit9CisKK3N0YXRpYyBpbnQgY2FsbF9maWJfZW50cnlfbm90aWZpZXJzKHN0cnVjdCBuZXQgKm5ldCwKKwkJCQkgICAgZW51bSBmaWJfZXZlbnRfdHlwZSBldmVudF90eXBlLCB1MzIgZHN0LAorCQkJCSAgICBpbnQgZHN0X2xlbiwgc3RydWN0IGZpYl9pbmZvICpmaSwKKwkJCQkgICAgdTggdG9zLCB1OCB0eXBlLCB1MzIgdGJfaWQsIHUzMiBubGZsYWdzKQoreworCXN0cnVjdCBmaWJfZW50cnlfbm90aWZpZXJfaW5mbyBpbmZvID0geworCQkuZHN0ID0gZHN0LAorCQkuZHN0X2xlbiA9IGRzdF9sZW4sCisJCS5maSA9IGZpLAorCQkudG9zID0gdG9zLAorCQkudHlwZSA9IHR5cGUsCisJCS50Yl9pZCA9IHRiX2lkLAorCQkubmxmbGFncyA9IG5sZmxhZ3MsCisJfTsKKwlyZXR1cm4gY2FsbF9maWJfbm90aWZpZXJzKG5ldCwgZXZlbnRfdHlwZSwgJmluZm8uaW5mbyk7Cit9CisKICNkZWZpbmUgTUFYX1NUQVRfREVQVEggMzIKIAogI2RlZmluZSBLRVlMRU5HVEgJKDgqc2l6ZW9mKHRfa2V5KSkKQEAgLTI0OSw3ICsyODcsNyBAQAogICogaW5kZXggaW50byB0aGUgcGFyZW50J3MgY2hpbGQgYXJyYXkuIFRoYXQgaXMsIHRoZXkgd2lsbCBiZSB1c2VkIHRvIGZpbmQKICAqICduJyBhbW9uZyB0cCdzIGNoaWxkcmVuLgogICoKLSAqIFRoZSBiaXRzIGZyb20gKG4tPnBvcyArIG4tPmJpdHMpIHRvICh0bi0+cG9zIC0gMSkgLSAiUyIgLSBhcmUgc2tpcHBlZCBiaXRzCisgKiBUaGUgYml0cyBmcm9tIChuLT5wb3MgKyBuLT5iaXRzKSB0byAodHAtPnBvcyAtIDEpIC0gIlMiIC0gYXJlIHNraXBwZWQgYml0cwogICogZm9yIHRoZSBub2RlIG4uCiAgKgogICogQWxsIHRoZSBiaXRzIHdlIGhhdmUgc2VlbiBzbyBmYXIgYXJlIHNpZ25pZmljYW50IHRvIHRoZSBub2RlIG4uIFRoZSByZXN0CkBAIC0yNTgsNyArMjk2LDcgQEAKICAqIFRoZSBiaXRzIGZyb20gKG4tPnBvcykgdG8gKG4tPnBvcyArIG4tPmJpdHMgLSAxKSAtICJDIiAtIGFyZSB0aGUgaW5kZXggaW50bwogICogbidzIGNoaWxkIGFycmF5LCBhbmQgd2lsbCBvZiBjb3Vyc2UgYmUgZGlmZmVyZW50IGZvciBlYWNoIGNoaWxkLgogICoKLSAqIFRoZSByZXN0IG9mIHRoZSBiaXRzLCBmcm9tIDAgdG8gKG4tPnBvcyArIG4tPmJpdHMpLCBhcmUgY29tcGxldGVseSB1bmtub3duCisgKiBUaGUgcmVzdCBvZiB0aGUgYml0cywgZnJvbSAwIHRvIChuLT5wb3MgLTEpIC0gInUiIC0gYXJlIGNvbXBsZXRlbHkgdW5rbm93bgogICogYXQgdGhpcyBwb2ludC4KICAqLwogCkBAIC0xMDc2LDEyICsxMTE0LDEzIEBACiB9CiAKIC8qIENhbGxlciBtdXN0IGhvbGQgUlROTC4gKi8KLWludCBmaWJfdGFibGVfaW5zZXJ0KHN0cnVjdCBmaWJfdGFibGUgKnRiLCBzdHJ1Y3QgZmliX2NvbmZpZyAqY2ZnKQoraW50IGZpYl90YWJsZV9pbnNlcnQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgZmliX3RhYmxlICp0YiwKKwkJICAgICBzdHJ1Y3QgZmliX2NvbmZpZyAqY2ZnKQogewogCXN0cnVjdCB0cmllICp0ID0gKHN0cnVjdCB0cmllICopdGItPnRiX2RhdGE7CiAJc3RydWN0IGZpYl9hbGlhcyAqZmEsICpuZXdfZmE7CiAJc3RydWN0IGtleV92ZWN0b3IgKmwsICp0cDsKLQl1bnNpZ25lZCBpbnQgbmxmbGFncyA9IDA7CisJdTE2IG5sZmxhZ3MgPSBOTE1fRl9FWENMOwogCXN0cnVjdCBmaWJfaW5mbyAqZmk7CiAJdTggcGxlbiA9IGNmZy0+ZmNfZHN0X2xlbjsKIAl1OCBzbGVuID0gS0VZTEVOR1RIIC0gcGxlbjsKQEAgLTExMjYsNiArMTE2NSw4IEBACiAJCWlmIChjZmctPmZjX25sZmxhZ3MgJiBOTE1fRl9FWENMKQogCQkJZ290byBvdXQ7CiAKKwkJbmxmbGFncyAmPSB+TkxNX0ZfRVhDTDsKKwogCQkvKiBXZSBoYXZlIDIgZ29hbHM6CiAJCSAqIDEuIEZpbmQgZXhhY3QgbWF0Y2ggZm9yIHR5cGUsIHNjb3BlLCBmaWJfaW5mbyB0byBhdm9pZAogCQkgKiBkdXBsaWNhdGUgcm91dGVzCkBAIC0xMTUxLDYgKzExOTIsNyBAQAogCQkJc3RydWN0IGZpYl9pbmZvICpmaV9kcm9wOwogCQkJdTggc3RhdGU7CiAKKwkJCW5sZmxhZ3MgfD0gTkxNX0ZfUkVQTEFDRTsKIAkJCWZhID0gZmFfZmlyc3Q7CiAJCQlpZiAoZmFfbWF0Y2gpIHsKIAkJCQlpZiAoZmEgPT0gZmFfbWF0Y2gpCkBAIC0xMTcyLDE3ICsxMjE0LDYgQEAKIAkJCW5ld19mYS0+dGJfaWQgPSB0Yi0+dGJfaWQ7CiAJCQluZXdfZmEtPmZhX2RlZmF1bHQgPSAtMTsKIAotCQkJZXJyID0gc3dpdGNoZGV2X2ZpYl9pcHY0X2FkZChrZXksIHBsZW4sIGZpLAotCQkJCQkJICAgICBuZXdfZmEtPmZhX3RvcywKLQkJCQkJCSAgICAgY2ZnLT5mY190eXBlLAotCQkJCQkJICAgICBjZmctPmZjX25sZmxhZ3MsCi0JCQkJCQkgICAgIHRiLT50Yl9pZCk7Ci0JCQlpZiAoZXJyKSB7Ci0JCQkJc3dpdGNoZGV2X2ZpYl9pcHY0X2Fib3J0KGZpKTsKLQkJCQlrbWVtX2NhY2hlX2ZyZWUoZm5fYWxpYXNfa21lbSwgbmV3X2ZhKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQogCQkJaGxpc3RfcmVwbGFjZV9yY3UoJmZhLT5mYV9saXN0LCAmbmV3X2ZhLT5mYV9saXN0KTsKIAogCQkJYWxpYXNfZnJlZV9tZW1fcmN1KGZhKTsKQEAgLTExOTAsOCArMTIyMSwxMyBAQAogCQkJZmliX3JlbGVhc2VfaW5mbyhmaV9kcm9wKTsKIAkJCWlmIChzdGF0ZSAmIEZBX1NfQUNDRVNTRUQpCiAJCQkJcnRfY2FjaGVfZmx1c2goY2ZnLT5mY19ubGluZm8ubmxfbmV0KTsKKworCQkJY2FsbF9maWJfZW50cnlfbm90aWZpZXJzKG5ldCwgRklCX0VWRU5UX0VOVFJZX0FERCwKKwkJCQkJCSBrZXksIHBsZW4sIGZpLAorCQkJCQkJIG5ld19mYS0+ZmFfdG9zLCBjZmctPmZjX3R5cGUsCisJCQkJCQkgdGItPnRiX2lkLCBjZmctPmZjX25sZmxhZ3MpOwogCQkJcnRtc2dfZmliKFJUTV9ORVdST1VURSwgaHRvbmwoa2V5KSwgbmV3X2ZhLCBwbGVuLAotCQkJCXRiLT50Yl9pZCwgJmNmZy0+ZmNfbmxpbmZvLCBOTE1fRl9SRVBMQUNFKTsKKwkJCQl0Yi0+dGJfaWQsICZjZmctPmZjX25saW5mbywgbmxmbGFncyk7CiAKIAkJCWdvdG8gc3VjY2VlZGVkOwogCQl9CkBAIC0xMjAzLDcgKzEyMzksNyBAQAogCQkJZ290byBvdXQ7CiAKIAkJaWYgKGNmZy0+ZmNfbmxmbGFncyAmIE5MTV9GX0FQUEVORCkKLQkJCW5sZmxhZ3MgPSBOTE1fRl9BUFBFTkQ7CisJCQlubGZsYWdzIHw9IE5MTV9GX0FQUEVORDsKIAkJZWxzZQogCQkJZmEgPSBmYV9maXJzdDsKIAl9CkBAIC0xMjExLDYgKzEyNDcsNyBAQAogCWlmICghKGNmZy0+ZmNfbmxmbGFncyAmIE5MTV9GX0NSRUFURSkpCiAJCWdvdG8gb3V0OwogCisJbmxmbGFncyB8PSBOTE1fRl9DUkVBVEU7CiAJZXJyID0gLUVOT0JVRlM7CiAJbmV3X2ZhID0ga21lbV9jYWNoZV9hbGxvYyhmbl9hbGlhc19rbWVtLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5ld19mYSkKQEAgLTEyMjQsMzAgKzEyNjEsMjIgQEAKIAluZXdfZmEtPnRiX2lkID0gdGItPnRiX2lkOwogCW5ld19mYS0+ZmFfZGVmYXVsdCA9IC0xOwogCi0JLyogKE9wdGlvbmFsbHkpIG9mZmxvYWQgZmliIGVudHJ5IHRvIHN3aXRjaCBoYXJkd2FyZS4gKi8KLQllcnIgPSBzd2l0Y2hkZXZfZmliX2lwdjRfYWRkKGtleSwgcGxlbiwgZmksIHRvcywgY2ZnLT5mY190eXBlLAotCQkJCSAgICAgY2ZnLT5mY19ubGZsYWdzLCB0Yi0+dGJfaWQpOwotCWlmIChlcnIpIHsKLQkJc3dpdGNoZGV2X2ZpYl9pcHY0X2Fib3J0KGZpKTsKLQkJZ290byBvdXRfZnJlZV9uZXdfZmE7Ci0JfQotCiAJLyogSW5zZXJ0IG5ldyBlbnRyeSB0byB0aGUgbGlzdC4gKi8KIAllcnIgPSBmaWJfaW5zZXJ0X2FsaWFzKHQsIHRwLCBsLCBuZXdfZmEsIGZhLCBrZXkpOwogCWlmIChlcnIpCi0JCWdvdG8gb3V0X3N3X2ZpYl9kZWw7CisJCWdvdG8gb3V0X2ZyZWVfbmV3X2ZhOwogCiAJaWYgKCFwbGVuKQogCQl0Yi0+dGJfbnVtX2RlZmF1bHQrKzsKIAogCXJ0X2NhY2hlX2ZsdXNoKGNmZy0+ZmNfbmxpbmZvLm5sX25ldCk7CisJY2FsbF9maWJfZW50cnlfbm90aWZpZXJzKG5ldCwgRklCX0VWRU5UX0VOVFJZX0FERCwga2V5LCBwbGVuLCBmaSwgdG9zLAorCQkJCSBjZmctPmZjX3R5cGUsIHRiLT50Yl9pZCwgY2ZnLT5mY19ubGZsYWdzKTsKIAlydG1zZ19maWIoUlRNX05FV1JPVVRFLCBodG9ubChrZXkpLCBuZXdfZmEsIHBsZW4sIG5ld19mYS0+dGJfaWQsCiAJCSAgJmNmZy0+ZmNfbmxpbmZvLCBubGZsYWdzKTsKIHN1Y2NlZWRlZDoKIAlyZXR1cm4gMDsKIAotb3V0X3N3X2ZpYl9kZWw6Ci0Jc3dpdGNoZGV2X2ZpYl9pcHY0X2RlbChrZXksIHBsZW4sIGZpLCB0b3MsIGNmZy0+ZmNfdHlwZSwgdGItPnRiX2lkKTsKIG91dF9mcmVlX25ld19mYToKIAlrbWVtX2NhY2hlX2ZyZWUoZm5fYWxpYXNfa21lbSwgbmV3X2ZhKTsKIG91dDoKQEAgLTE0ODYsNyArMTUxNSw4IEBACiB9CiAKIC8qIENhbGxlciBtdXN0IGhvbGQgUlROTC4gKi8KLWludCBmaWJfdGFibGVfZGVsZXRlKHN0cnVjdCBmaWJfdGFibGUgKnRiLCBzdHJ1Y3QgZmliX2NvbmZpZyAqY2ZnKQoraW50IGZpYl90YWJsZV9kZWxldGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgZmliX3RhYmxlICp0YiwKKwkJICAgICBzdHJ1Y3QgZmliX2NvbmZpZyAqY2ZnKQogewogCXN0cnVjdCB0cmllICp0ID0gKHN0cnVjdCB0cmllICopIHRiLT50Yl9kYXRhOwogCXN0cnVjdCBmaWJfYWxpYXMgKmZhLCAqZmFfdG9fZGVsZXRlOwpAQCAtMTUzOSw5ICsxNTY5LDkgQEAKIAlpZiAoIWZhX3RvX2RlbGV0ZSkKIAkJcmV0dXJuIC1FU1JDSDsKIAotCXN3aXRjaGRldl9maWJfaXB2NF9kZWwoa2V5LCBwbGVuLCBmYV90b19kZWxldGUtPmZhX2luZm8sIHRvcywKLQkJCSAgICAgICBjZmctPmZjX3R5cGUsIHRiLT50Yl9pZCk7Ci0KKwljYWxsX2ZpYl9lbnRyeV9ub3RpZmllcnMobmV0LCBGSUJfRVZFTlRfRU5UUllfREVMLCBrZXksIHBsZW4sCisJCQkJIGZhX3RvX2RlbGV0ZS0+ZmFfaW5mbywgdG9zLCBjZmctPmZjX3R5cGUsCisJCQkJIHRiLT50Yl9pZCwgMCk7CiAJcnRtc2dfZmliKFJUTV9ERUxST1VURSwgaHRvbmwoa2V5KSwgZmFfdG9fZGVsZXRlLCBwbGVuLCB0Yi0+dGJfaWQsCiAJCSAgJmNmZy0+ZmNfbmxpbmZvLCAwKTsKIApAQCAtMTczMCw4MiArMTc2MCw4IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLS8qIENhbGxlciBtdXN0IGhvbGQgUlROTCAqLwotdm9pZCBmaWJfdGFibGVfZmx1c2hfZXh0ZXJuYWwoc3RydWN0IGZpYl90YWJsZSAqdGIpCi17Ci0Jc3RydWN0IHRyaWUgKnQgPSAoc3RydWN0IHRyaWUgKil0Yi0+dGJfZGF0YTsKLQlzdHJ1Y3Qga2V5X3ZlY3RvciAqcG4gPSB0LT5rdjsKLQl1bnNpZ25lZCBsb25nIGNpbmRleCA9IDE7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKnRtcDsKLQlzdHJ1Y3QgZmliX2FsaWFzICpmYTsKLQotCS8qIHdhbGsgdHJpZSBpbiByZXZlcnNlIG9yZGVyICovCi0JZm9yICg7OykgewotCQl1bnNpZ25lZCBjaGFyIHNsZW4gPSAwOwotCQlzdHJ1Y3Qga2V5X3ZlY3RvciAqbjsKLQotCQlpZiAoIShjaW5kZXgtLSkpIHsKLQkJCXRfa2V5IHBrZXkgPSBwbi0+a2V5OwotCi0JCQkvKiBjYW5ub3QgcmVzaXplIHRoZSB0cmllIHZlY3RvciAqLwotCQkJaWYgKElTX1RSSUUocG4pKQotCQkJCWJyZWFrOwotCi0JCQkvKiByZXNpemUgY29tcGxldGVkIG5vZGUgKi8KLQkJCXBuID0gcmVzaXplKHQsIHBuKTsKLQkJCWNpbmRleCA9IGdldF9pbmRleChwa2V5LCBwbik7Ci0KLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogZ3JhYiB0aGUgbmV4dCBhdmFpbGFibGUgbm9kZSAqLwotCQluID0gZ2V0X2NoaWxkKHBuLCBjaW5kZXgpOwotCQlpZiAoIW4pCi0JCQljb250aW51ZTsKLQotCQlpZiAoSVNfVE5PREUobikpIHsKLQkJCS8qIHJlY29yZCBwbiBhbmQgY2luZGV4IGZvciBsZWFmIHdhbGtpbmcgKi8KLQkJCXBuID0gbjsKLQkJCWNpbmRleCA9IDF1bCA8PCBuLT5iaXRzOwotCi0JCQljb250aW51ZTsKLQkJfQotCi0JCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmEsIHRtcCwgJm4tPmxlYWYsIGZhX2xpc3QpIHsKLQkJCXN0cnVjdCBmaWJfaW5mbyAqZmkgPSBmYS0+ZmFfaW5mbzsKLQotCQkJLyogaWYgYWxpYXMgd2FzIGNsb25lZCB0byBsb2NhbCB0aGVuIHdlIGp1c3QKLQkJCSAqIG5lZWQgdG8gcmVtb3ZlIHRoZSBsb2NhbCBjb3B5IGZyb20gbWFpbgotCQkJICovCi0JCQlpZiAodGItPnRiX2lkICE9IGZhLT50Yl9pZCkgewotCQkJCWhsaXN0X2RlbF9yY3UoJmZhLT5mYV9saXN0KTsKLQkJCQlhbGlhc19mcmVlX21lbV9yY3UoZmEpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvKiByZWNvcmQgbG9jYWwgc2xlbiAqLwotCQkJc2xlbiA9IGZhLT5mYV9zbGVuOwotCi0JCQlpZiAoIWZpIHx8ICEoZmktPmZpYl9mbGFncyAmIFJUTkhfRl9PRkZMT0FEKSkKLQkJCQljb250aW51ZTsKLQotCQkJc3dpdGNoZGV2X2ZpYl9pcHY0X2RlbChuLT5rZXksIEtFWUxFTkdUSCAtIGZhLT5mYV9zbGVuLAotCQkJCQkgICAgICAgZmksIGZhLT5mYV90b3MsIGZhLT5mYV90eXBlLAotCQkJCQkgICAgICAgdGItPnRiX2lkKTsKLQkJfQotCi0JCS8qIHVwZGF0ZSBsZWFmIHNsZW4gKi8KLQkJbi0+c2xlbiA9IHNsZW47Ci0KLQkJaWYgKGhsaXN0X2VtcHR5KCZuLT5sZWFmKSkgewotCQkJcHV0X2NoaWxkX3Jvb3QocG4sIG4tPmtleSwgTlVMTCk7Ci0JCQlub2RlX2ZyZWUobik7Ci0JCX0KLQl9Ci19Ci0KIC8qIENhbGxlciBtdXN0IGhvbGQgUlROTC4gKi8KLWludCBmaWJfdGFibGVfZmx1c2goc3RydWN0IGZpYl90YWJsZSAqdGIpCitpbnQgZmliX3RhYmxlX2ZsdXNoKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IGZpYl90YWJsZSAqdGIpCiB7CiAJc3RydWN0IHRyaWUgKnQgPSAoc3RydWN0IHRyaWUgKil0Yi0+dGJfZGF0YTsKIAlzdHJ1Y3Qga2V5X3ZlY3RvciAqcG4gPSB0LT5rdjsKQEAgLTE4NTQsOSArMTgxMCwxMSBAQAogCQkJCWNvbnRpbnVlOwogCQkJfQogCi0JCQlzd2l0Y2hkZXZfZmliX2lwdjRfZGVsKG4tPmtleSwgS0VZTEVOR1RIIC0gZmEtPmZhX3NsZW4sCi0JCQkJCSAgICAgICBmaSwgZmEtPmZhX3RvcywgZmEtPmZhX3R5cGUsCi0JCQkJCSAgICAgICB0Yi0+dGJfaWQpOworCQkJY2FsbF9maWJfZW50cnlfbm90aWZpZXJzKG5ldCwgRklCX0VWRU5UX0VOVFJZX0RFTCwKKwkJCQkJCSBuLT5rZXksCisJCQkJCQkgS0VZTEVOR1RIIC0gZmEtPmZhX3NsZW4sCisJCQkJCQkgZmksIGZhLT5mYV90b3MsIGZhLT5mYV90eXBlLAorCQkJCQkJIHRiLT50Yl9pZCwgMCk7CiAJCQlobGlzdF9kZWxfcmN1KCZmYS0+ZmFfbGlzdCk7CiAJCQlmaWJfcmVsZWFzZV9pbmZvKGZhLT5mYV9pbmZvKTsKIAkJCWFsaWFzX2ZyZWVfbWVtX3JjdShmYSk7CkBAIC0yNDUyLDkgKzI0MTAsNyBAQAogc3RhdGljIHN0cnVjdCBrZXlfdmVjdG9yICpmaWJfcm91dGVfZ2V0X2lkeChzdHJ1Y3QgZmliX3JvdXRlX2l0ZXIgKml0ZXIsCiAJCQkJCSAgICBsb2ZmX3QgcG9zKQogewotCXN0cnVjdCBmaWJfdGFibGUgKnRiID0gaXRlci0+bWFpbl90YjsKIAlzdHJ1Y3Qga2V5X3ZlY3RvciAqbCwgKip0cCA9ICZpdGVyLT50bm9kZTsKLQlzdHJ1Y3QgdHJpZSAqdDsKIAl0X2tleSBrZXk7CiAKIAkvKiB1c2UgY2FjaGUgbG9jYXRpb24gb2YgbmV4dC10by1maW5kIGtleSAqLwpAQCAtMjQ2Miw4ICsyNDE4LDYgQEAKIAkJcG9zIC09IGl0ZXItPnBvczsKIAkJa2V5ID0gaXRlci0+a2V5OwogCX0gZWxzZSB7Ci0JCXQgPSAoc3RydWN0IHRyaWUgKil0Yi0+dGJfZGF0YTsKLQkJaXRlci0+dG5vZGUgPSB0LT5rdjsKIAkJaXRlci0+cG9zID0gMDsKIAkJa2V5ID0gMDsKIAl9CkBAIC0yNTA0LDEyICsyNDU4LDEyIEBACiAJCXJldHVybiBOVUxMOwogCiAJaXRlci0+bWFpbl90YiA9IHRiOworCXQgPSAoc3RydWN0IHRyaWUgKil0Yi0+dGJfZGF0YTsKKwlpdGVyLT50bm9kZSA9IHQtPmt2OwogCiAJaWYgKCpwb3MgIT0gMCkKIAkJcmV0dXJuIGZpYl9yb3V0ZV9nZXRfaWR4KGl0ZXIsICpwb3MpOwogCi0JdCA9IChzdHJ1Y3QgdHJpZSAqKXRiLT50Yl9kYXRhOwotCWl0ZXItPnRub2RlID0gdC0+a3Y7CiAJaXRlci0+cG9zID0gMDsKIAlpdGVyLT5rZXkgPSAwOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9mb3UuYyBiL25ldC9pcHY0L2ZvdS5jCmluZGV4IDMyMWQ1N2YuLmNmNTBmN2UgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ZvdS5jCisrKyBiL25ldC9pcHY0L2ZvdS5jCkBAIC02MzEsNyArNjMxLDcgQEAKIAkubmV0bnNvawk9IHRydWUsCiB9OwogCi1zdGF0aWMgc3RydWN0IG5sYV9wb2xpY3kgZm91X25sX3BvbGljeVtGT1VfQVRUUl9NQVggKyAxXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBmb3VfbmxfcG9saWN5W0ZPVV9BVFRSX01BWCArIDFdID0gewogCVtGT1VfQVRUUl9QT1JUXSA9IHsgLnR5cGUgPSBOTEFfVTE2LCB9LAogCVtGT1VfQVRUUl9BRl0gPSB7IC50eXBlID0gTkxBX1U4LCB9LAogCVtGT1VfQVRUUl9JUFBST1RPXSA9IHsgLnR5cGUgPSBOTEFfVTgsIH0sCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9ncmVfb2ZmbG9hZC5jIGIvbmV0L2lwdjQvZ3JlX29mZmxvYWQuYwppbmRleCBlY2QxZTA5Li45NmUwZWZlIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9ncmVfb2ZmbG9hZC5jCisrKyBiL25ldC9pcHY0L2dyZV9vZmZsb2FkLmMKQEAgLTI0LDcgKzI0LDcgQEAKIAlfX2JlMTYgcHJvdG9jb2wgPSBza2ItPnByb3RvY29sOwogCXUxNiBtYWNfbGVuID0gc2tiLT5tYWNfbGVuOwogCWludCBncmVfb2Zmc2V0LCBvdXRlcl9obGVuOwotCWJvb2wgbmVlZF9jc3VtLCB1Zm87CisJYm9vbCBuZWVkX2NzdW0sIHVmbywgZ3NvX3BhcnRpYWw7CiAKIAlpZiAoIXNrYi0+ZW5jYXBzdWxhdGlvbikKIAkJZ290byBvdXQ7CkBAIC02OSw2ICs2OSw4IEBACiAJCWdvdG8gb3V0OwogCX0KIAorCWdzb19wYXJ0aWFsID0gISEoc2tiX3NoaW5mbyhzZWdzKS0+Z3NvX3R5cGUgJiBTS0JfR1NPX1BBUlRJQUwpOworCiAJb3V0ZXJfaGxlbiA9IHNrYl90bmxfaGVhZGVyX2xlbihza2IpOwogCWdyZV9vZmZzZXQgPSBvdXRlcl9obGVuIC0gdG5sX2hsZW47CiAJc2tiID0gc2VnczsKQEAgLTk2LDcgKzk4LDcgQEAKIAkJZ3JlaCA9IChzdHJ1Y3QgZ3JlX2Jhc2VfaGRyICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAkJcGNzdW0gPSAoX19zdW0xNiAqKShncmVoICsgMSk7CiAKLQkJaWYgKHNrYl9pc19nc28oc2tiKSkgeworCQlpZiAoZ3NvX3BhcnRpYWwpIHsKIAkJCXVuc2lnbmVkIGludCBwYXJ0aWFsX2FkajsKIAogCQkJLyogQWRqdXN0IGNoZWNrc3VtIHRvIGFjY291bnQgZm9yIHRoZSBmYWN0IHRoYXQKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lnbXAuYyBiL25ldC9pcHY0L2lnbXAuYwppbmRleCA5YjRjYTg3Li42MDZjYzNlIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pZ21wLmMKKysrIGIvbmV0L2lwdjQvaWdtcC5jCkBAIC00NzIsNiArNDcyLDE1IEBACiAJCQljb250aW51ZTsKIAkJfQogCisJCS8qIEJhc2VkIG9uIFJGQzMzNzYgNS4xLiBTaG91bGQgbm90IHNlbmQgc291cmNlLWxpc3QgY2hhbmdlCisJCSAqIHJlY29yZHMgd2hlbiB0aGVyZSBpcyBhIGZpbHRlciBtb2RlIGNoYW5nZS4KKwkJICovCisJCWlmICgoKGdkZWxldGVkICYmIHBtYy0+c2Ztb2RlID09IE1DQVNUX0VYQ0xVREUpIHx8CisJCSAgICAgKCFnZGVsZXRlZCAmJiBwbWMtPmNyY291bnQpKSAmJgorCQkgICAgKHR5cGUgPT0gSUdNUFYzX0FMTE9XX05FV19TT1VSQ0VTIHx8CisJCSAgICAgdHlwZSA9PSBJR01QVjNfQkxPQ0tfT0xEX1NPVVJDRVMpICYmIHBzZi0+c2ZfY3Jjb3VudCkKKwkJCWdvdG8gZGVjcmVhc2Vfc2ZfY3Jjb3VudDsKKwogCQkvKiBjbGVhciBtYXJrcyBvbiBxdWVyeSByZXNwb25zZXMgKi8KIAkJaWYgKGlzcXVlcnkpCiAJCQlwc2YtPnNmX2dzcmVzcCA9IDA7CkBAIC00OTksNiArNTA4LDcgQEAKIAkJc2NvdW50Kys7IHN0b3RhbCsrOwogCQlpZiAoKHR5cGUgPT0gSUdNUFYzX0FMTE9XX05FV19TT1VSQ0VTIHx8CiAJCSAgICAgdHlwZSA9PSBJR01QVjNfQkxPQ0tfT0xEX1NPVVJDRVMpICYmIHBzZi0+c2ZfY3Jjb3VudCkgeworZGVjcmVhc2Vfc2ZfY3Jjb3VudDoKIAkJCXBzZi0+c2ZfY3Jjb3VudC0tOwogCQkJaWYgKChzZGVsZXRlZCB8fCBnZGVsZXRlZCkgJiYgcHNmLT5zZl9jcmNvdW50ID09IDApIHsKIAkJCQlpZiAocHNmX3ByZXYpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pbmV0X2RpYWcuYyBiL25ldC9pcHY0L2luZXRfZGlhZy5jCmluZGV4IDM4YzJjNDcuLmU0ZDE2ZmMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2luZXRfZGlhZy5jCisrKyBiL25ldC9pcHY0L2luZXRfZGlhZy5jCkBAIC00NSw2ICs0NSw3IEBACiAJdTE2IGZhbWlseTsKIAl1MTYgdXNlcmxvY2tzOwogCXUzMiBpZmluZGV4OworCXUzMiBtYXJrOwogfTsKIAogc3RhdGljIERFRklORV9NVVRFWChpbmV0X2RpYWdfdGFibGVfbXV0ZXgpOwpAQCAtOTgsNiArOTksNyBAQAogCQkrIG5sYV90b3RhbF9zaXplKDEpIC8qIElORVRfRElBR19TSFVURE9XTiAqLwogCQkrIG5sYV90b3RhbF9zaXplKDEpIC8qIElORVRfRElBR19UT1MgKi8KIAkJKyBubGFfdG90YWxfc2l6ZSgxKSAvKiBJTkVUX0RJQUdfVENMQVNTICovCisJCSsgbmxhX3RvdGFsX3NpemUoNCkgLyogSU5FVF9ESUFHX01BUksgKi8KIAkJKyBubGFfdG90YWxfc2l6ZShzaXplb2Yoc3RydWN0IGluZXRfZGlhZ19tZW1pbmZvKSkKIAkJKyBubGFfdG90YWxfc2l6ZShzaXplb2Yoc3RydWN0IGluZXRfZGlhZ19tc2cpKQogCQkrIG5sYV90b3RhbF9zaXplKFNLX01FTUlORk9fVkFSUyAqIHNpemVvZih1MzIpKQpAQCAtMTA4LDcgKzExMCw4IEBACiAKIGludCBpbmV0X2RpYWdfbXNnX2F0dHJzX2ZpbGwoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICBzdHJ1Y3QgaW5ldF9kaWFnX21zZyAqciwgaW50IGV4dCwKLQkJCSAgICAgc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zKQorCQkJICAgICBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnVzZXJfbnMsCisJCQkgICAgIGJvb2wgbmV0X2FkbWluKQogewogCWNvbnN0IHN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIApAQCAtMTM1LDYgKzEzOCw5IEBACiAJfQogI2VuZGlmCiAKKwlpZiAobmV0X2FkbWluICYmIG5sYV9wdXRfdTMyKHNrYiwgSU5FVF9ESUFHX01BUkssIHNrLT5za19tYXJrKSkKKwkJZ290byBlcnJvdXQ7CisKIAlyLT5pZGlhZ191aWQgPSBmcm9tX2t1aWRfbXVuZ2VkKHVzZXJfbnMsIHNvY2tfaV91aWQoc2spKTsKIAlyLT5pZGlhZ19pbm9kZSA9IHNvY2tfaV9pbm8oc2spOwogCkBAIC0xNDgsNyArMTU0LDggQEAKIAkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnJlcSwKIAkJICAgICAgc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zLAogCQkgICAgICB1MzIgcG9ydGlkLCB1MzIgc2VxLCB1MTYgbmxtc2dfZmxhZ3MsCi0JCSAgICAgIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqdW5saCkKKwkJICAgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICp1bmxoLAorCQkgICAgICBib29sIG5ldF9hZG1pbikKIHsKIAljb25zdCBzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzICpjYV9vcHM7CiAJY29uc3Qgc3RydWN0IGluZXRfZGlhZ19oYW5kbGVyICpoYW5kbGVyOwpAQCAtMTc0LDcgKzE4MSw3IEBACiAJci0+aWRpYWdfdGltZXIgPSAwOwogCXItPmlkaWFnX3JldHJhbnMgPSAwOwogCi0JaWYgKGluZXRfZGlhZ19tc2dfYXR0cnNfZmlsbChzaywgc2tiLCByLCBleHQsIHVzZXJfbnMpKQorCWlmIChpbmV0X2RpYWdfbXNnX2F0dHJzX2ZpbGwoc2ssIHNrYiwgciwgZXh0LCB1c2VyX25zLCBuZXRfYWRtaW4pKQogCQlnb3RvIGVycm91dDsKIAogCWlmIChleHQgJiAoMSA8PCAoSU5FVF9ESUFHX01FTUlORk8gLSAxKSkpIHsKQEAgLTI3MywxMCArMjgwLDExIEBACiAJCQkgICAgICBjb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiAqcmVxLAogCQkJICAgICAgc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zLAogCQkJICAgICAgdTMyIHBvcnRpZCwgdTMyIHNlcSwgdTE2IG5sbXNnX2ZsYWdzLAotCQkJICAgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICp1bmxoKQorCQkJICAgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICp1bmxoLAorCQkJICAgICAgYm9vbCBuZXRfYWRtaW4pCiB7Ci0JcmV0dXJuIGluZXRfc2tfZGlhZ19maWxsKHNrLCBpbmV0X2NzayhzayksIHNrYiwgcmVxLAotCQkJCSB1c2VyX25zLCBwb3J0aWQsIHNlcSwgbmxtc2dfZmxhZ3MsIHVubGgpOworCXJldHVybiBpbmV0X3NrX2RpYWdfZmlsbChzaywgaW5ldF9jc2soc2spLCBza2IsIHJlcSwgdXNlcl9ucywKKwkJCQkgcG9ydGlkLCBzZXEsIG5sbXNnX2ZsYWdzLCB1bmxoLCBuZXRfYWRtaW4pOwogfQogCiBzdGF0aWMgaW50IGluZXRfdHdza19kaWFnX2ZpbGwoc3RydWN0IHNvY2sgKnNrLApAQCAtMzE4LDggKzMyNiw5IEBACiAKIHN0YXRpYyBpbnQgaW5ldF9yZXFfZGlhZ19maWxsKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgIHUzMiBwb3J0aWQsIHUzMiBzZXEsIHUxNiBubG1zZ19mbGFncywKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqdW5saCkKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqdW5saCwgYm9vbCBuZXRfYWRtaW4pCiB7CisJc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxc2sgPSBpbmV0X3JlcXNrKHNrKTsKIAlzdHJ1Y3QgaW5ldF9kaWFnX21zZyAqcjsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKIAlsb25nIHRtbzsKQEAgLTMzMyw3ICszNDIsNyBAQAogCWluZXRfZGlhZ19tc2dfY29tbW9uX2ZpbGwociwgc2spOwogCXItPmlkaWFnX3N0YXRlID0gVENQX1NZTl9SRUNWOwogCXItPmlkaWFnX3RpbWVyID0gMTsKLQlyLT5pZGlhZ19yZXRyYW5zID0gaW5ldF9yZXFzayhzayktPm51bV9yZXRyYW5zOworCXItPmlkaWFnX3JldHJhbnMgPSByZXFzay0+bnVtX3JldHJhbnM7CiAKIAlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGluZXRfcmVxdWVzdF9zb2NrLCBpcl9jb29raWUpICE9CiAJCSAgICAgb2Zmc2V0b2Yoc3RydWN0IHNvY2ssIHNrX2Nvb2tpZSkpOwpAQCAtMzQ1LDYgKzM1NCwxMCBAQAogCXItPmlkaWFnX3VpZAk9IDA7CiAJci0+aWRpYWdfaW5vZGUJPSAwOwogCisJaWYgKG5ldF9hZG1pbiAmJiBubGFfcHV0X3UzMihza2IsIElORVRfRElBR19NQVJLLAorCQkJCSAgICAgaW5ldF9yc2socmVxc2spLT5pcl9tYXJrKSkKKwkJcmV0dXJuIC1FTVNHU0laRTsKKwogCW5sbXNnX2VuZChza2IsIG5saCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0zNTMsNyArMzY2LDcgQEAKIAkJCWNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyLAogCQkJc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zLAogCQkJdTMyIHBvcnRpZCwgdTMyIHNlcSwgdTE2IG5sbXNnX2ZsYWdzLAotCQkJY29uc3Qgc3RydWN0IG5sbXNnaGRyICp1bmxoKQorCQkJY29uc3Qgc3RydWN0IG5sbXNnaGRyICp1bmxoLCBib29sIG5ldF9hZG1pbikKIHsKIAlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9USU1FX1dBSVQpCiAJCXJldHVybiBpbmV0X3R3c2tfZGlhZ19maWxsKHNrLCBza2IsIHBvcnRpZCwgc2VxLApAQCAtMzYxLDEwICszNzQsMTAgQEAKIAogCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX05FV19TWU5fUkVDVikKIAkJcmV0dXJuIGluZXRfcmVxX2RpYWdfZmlsbChzaywgc2tiLCBwb3J0aWQsIHNlcSwKLQkJCQkJICBubG1zZ19mbGFncywgdW5saCk7CisJCQkJCSAgbmxtc2dfZmxhZ3MsIHVubGgsIG5ldF9hZG1pbik7CiAKIAlyZXR1cm4gaW5ldF9jc2tfZGlhZ19maWxsKHNrLCBza2IsIHIsIHVzZXJfbnMsIHBvcnRpZCwgc2VxLAotCQkJCSAgbmxtc2dfZmxhZ3MsIHVubGgpOworCQkJCSAgbmxtc2dfZmxhZ3MsIHVubGgsIG5ldF9hZG1pbik7CiB9CiAKIHN0cnVjdCBzb2NrICppbmV0X2RpYWdfZmluZF9vbmVfaWNzayhzdHJ1Y3QgbmV0ICpuZXQsCkBAIC00MzQsNyArNDQ3LDggQEAKIAllcnIgPSBza19kaWFnX2ZpbGwoc2ssIHJlcCwgcmVxLAogCQkJICAgc2tfdXNlcl9ucyhORVRMSU5LX0NCKGluX3NrYikuc2spLAogCQkJICAgTkVUTElOS19DQihpbl9za2IpLnBvcnRpZCwKLQkJCSAgIG5saC0+bmxtc2dfc2VxLCAwLCBubGgpOworCQkJICAgbmxoLT5ubG1zZ19zZXEsIDAsIG5saCwKKwkJCSAgIG5ldGxpbmtfbmV0X2NhcGFibGUoaW5fc2tiLCBDQVBfTkVUX0FETUlOKSk7CiAJaWYgKGVyciA8IDApIHsKIAkJV0FSTl9PTihlcnIgPT0gLUVNU0dTSVpFKTsKIAkJbmxtc2dfZnJlZShyZXApOwpAQCAtNTgwLDYgKzU5NCwxNCBAQAogCQkJCXllcyA9IDA7CiAJCQlicmVhazsKIAkJfQorCQljYXNlIElORVRfRElBR19CQ19NQVJLX0NPTkQ6IHsKKwkJCXN0cnVjdCBpbmV0X2RpYWdfbWFya2NvbmQgKmNvbmQ7CisKKwkJCWNvbmQgPSAoc3RydWN0IGluZXRfZGlhZ19tYXJrY29uZCAqKShvcCArIDEpOworCQkJaWYgKChlbnRyeS0+bWFyayAmIGNvbmQtPm1hc2spICE9IGNvbmQtPm1hcmspCisJCQkJeWVzID0gMDsKKwkJCWJyZWFrOworCQl9CiAJCX0KIAogCQlpZiAoeWVzKSB7CkBAIC02MjQsNiArNjQ2LDEyIEBACiAJZW50cnkuZHBvcnQgPSBudG9ocyhpbmV0LT5pbmV0X2Rwb3J0KTsKIAllbnRyeS5pZmluZGV4ID0gc2stPnNrX2JvdW5kX2Rldl9pZjsKIAllbnRyeS51c2VybG9ja3MgPSBza19mdWxsc29jayhzaykgPyBzay0+c2tfdXNlcmxvY2tzIDogMDsKKwlpZiAoc2tfZnVsbHNvY2soc2spKQorCQllbnRyeS5tYXJrID0gc2stPnNrX21hcms7CisJZWxzZSBpZiAoc2stPnNrX3N0YXRlID09IFRDUF9ORVdfU1lOX1JFQ1YpCisJCWVudHJ5Lm1hcmsgPSBpbmV0X3JzayhpbmV0X3JlcXNrKHNrKSktPmlyX21hcms7CisJZWxzZQorCQllbnRyeS5tYXJrID0gMDsKIAogCXJldHVybiBpbmV0X2RpYWdfYmNfcnVuKGJjLCAmZW50cnkpOwogfQpAQCAtNzA2LDEwICs3MzQsMjUgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIGludCBpbmV0X2RpYWdfYmNfYXVkaXQoY29uc3Qgdm9pZCAqYnl0ZWNvZGUsIGludCBieXRlY29kZV9sZW4pCitzdGF0aWMgYm9vbCB2YWxpZF9tYXJrY29uZChjb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wICpvcCwgaW50IGxlbiwKKwkJCSAgIGludCAqbWluX2xlbikKIHsKLQljb25zdCB2b2lkICpiYyA9IGJ5dGVjb2RlOwotCWludCAgbGVuID0gYnl0ZWNvZGVfbGVuOworCSptaW5fbGVuICs9IHNpemVvZihzdHJ1Y3QgaW5ldF9kaWFnX21hcmtjb25kKTsKKwlyZXR1cm4gbGVuID49ICptaW5fbGVuOworfQorCitzdGF0aWMgaW50IGluZXRfZGlhZ19iY19hdWRpdChjb25zdCBzdHJ1Y3QgbmxhdHRyICphdHRyLAorCQkJICAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlib29sIG5ldF9hZG1pbiA9IG5ldGxpbmtfbmV0X2NhcGFibGUoc2tiLCBDQVBfTkVUX0FETUlOKTsKKwljb25zdCB2b2lkICpieXRlY29kZSwgKmJjOworCWludCBieXRlY29kZV9sZW4sIGxlbjsKKworCWlmICghYXR0ciB8fCBubGFfbGVuKGF0dHIpIDwgc2l6ZW9mKHN0cnVjdCBpbmV0X2RpYWdfYmNfb3ApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJ5dGVjb2RlID0gYmMgPSBubGFfZGF0YShhdHRyKTsKKwlsZW4gPSBieXRlY29kZV9sZW4gPSBubGFfbGVuKGF0dHIpOwogCiAJd2hpbGUgKGxlbiA+IDApIHsKIAkJaW50IG1pbl9sZW4gPSBzaXplb2Yoc3RydWN0IGluZXRfZGlhZ19iY19vcCk7CkBAIC03MzIsNiArNzc1LDEyIEBACiAJCQlpZiAoIXZhbGlkX3BvcnRfY29tcGFyaXNvbihiYywgbGVuLCAmbWluX2xlbikpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQlicmVhazsKKwkJY2FzZSBJTkVUX0RJQUdfQkNfTUFSS19DT05EOgorCQkJaWYgKCFuZXRfYWRtaW4pCisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCWlmICghdmFsaWRfbWFya2NvbmQoYmMsIGxlbiwgJm1pbl9sZW4pKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CiAJCWNhc2UgSU5FVF9ESUFHX0JDX0FVVE86CiAJCWNhc2UgSU5FVF9ESUFHX0JDX0pNUDoKIAkJY2FzZSBJTkVUX0RJQUdfQkNfTk9QOgpAQCAtNzYwLDcgKzgwOSw4IEBACiAJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAogCQkJICAgICAgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnIsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICpiYykKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKmJjLAorCQkJICAgICAgYm9vbCBuZXRfYWRtaW4pCiB7CiAJaWYgKCFpbmV0X2RpYWdfYmNfc2soYmMsIHNrKSkKIAkJcmV0dXJuIDA7CkBAIC03NjgsNyArODE4LDggQEAKIAlyZXR1cm4gaW5ldF9jc2tfZGlhZ19maWxsKHNrLCBza2IsIHIsCiAJCQkJICBza191c2VyX25zKE5FVExJTktfQ0IoY2ItPnNrYikuc2spLAogCQkJCSAgTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQsCi0JCQkJICBjYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLCBjYi0+bmxoKTsKKwkJCQkgIGNiLT5ubGgtPm5sbXNnX3NlcSwgTkxNX0ZfTVVMVEksIGNiLT5ubGgsCisJCQkJICBuZXRfYWRtaW4pOwogfQogCiBzdGF0aWMgdm9pZCB0d3NrX2J1aWxkX2Fzc2VydCh2b2lkKQpAQCAtODA0LDYgKzg1NSw3IEBACiAJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2tiLT5zayk7CiAJaW50IGksIG51bSwgc19pLCBzX251bTsKIAl1MzIgaWRpYWdfc3RhdGVzID0gci0+aWRpYWdfc3RhdGVzOworCWJvb2wgbmV0X2FkbWluID0gbmV0bGlua19uZXRfY2FwYWJsZShjYi0+c2tiLCBDQVBfTkVUX0FETUlOKTsKIAogCWlmIChpZGlhZ19zdGF0ZXMgJiBUQ1BGX1NZTl9SRUNWKQogCQlpZGlhZ19zdGF0ZXMgfD0gVENQRl9ORVdfU1lOX1JFQ1Y7CkBAIC04NDQsNyArODk2LDggQEAKIAkJCQkgICAgY2ItPmFyZ3NbM10gPiAwKQogCQkJCQlnb3RvIG5leHRfbGlzdGVuOwogCi0JCQkJaWYgKGluZXRfY3NrX2RpYWdfZHVtcChzaywgc2tiLCBjYiwgciwgYmMpIDwgMCkgeworCQkJCWlmIChpbmV0X2Nza19kaWFnX2R1bXAoc2ssIHNrYiwgY2IsIHIsCisJCQkJCQkgICAgICAgYmMsIG5ldF9hZG1pbikgPCAwKSB7CiAJCQkJCXNwaW5fdW5sb2NrX2JoKCZpbGItPmxvY2spOwogCQkJCQlnb3RvIGRvbmU7CiAJCQkJfQpAQCAtOTEyLDcgKzk2NSw3IEBACiAJCQkJCSAgIHNrX3VzZXJfbnMoTkVUTElOS19DQihjYi0+c2tiKS5zayksCiAJCQkJCSAgIE5FVExJTktfQ0IoY2ItPnNrYikucG9ydGlkLAogCQkJCQkgICBjYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLAotCQkJCQkgICBjYi0+bmxoKTsKKwkJCQkJICAgY2ItPm5saCwgbmV0X2FkbWluKTsKIAkJCWlmIChyZXMgPCAwKSB7CiAJCQkJc3Bpbl91bmxvY2tfYmgobG9jayk7CiAJCQkJZ290byBkb25lOwpAQCAtMTAyMCwxMyArMTA3MywxMyBAQAogCWlmIChubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfRFVNUCkgewogCQlpZiAobmxtc2dfYXR0cmxlbihubGgsIGhkcmxlbikpIHsKIAkJCXN0cnVjdCBubGF0dHIgKmF0dHI7CisJCQlpbnQgZXJyOwogCiAJCQlhdHRyID0gbmxtc2dfZmluZF9hdHRyKG5saCwgaGRybGVuLAogCQkJCQkgICAgICAgSU5FVF9ESUFHX1JFUV9CWVRFQ09ERSk7Ci0JCQlpZiAoIWF0dHIgfHwKLQkJCSAgICBubGFfbGVuKGF0dHIpIDwgc2l6ZW9mKHN0cnVjdCBpbmV0X2RpYWdfYmNfb3ApIHx8Ci0JCQkgICAgaW5ldF9kaWFnX2JjX2F1ZGl0KG5sYV9kYXRhKGF0dHIpLCBubGFfbGVuKGF0dHIpKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWVyciA9IGluZXRfZGlhZ19iY19hdWRpdChhdHRyLCBza2IpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOwogCQl9CiAJCXsKIAkJCXN0cnVjdCBuZXRsaW5rX2R1bXBfY29udHJvbCBjID0gewpAQCAtMTA1MSwxMyArMTEwNCwxMyBAQAogCSAgICBoLT5ubG1zZ19mbGFncyAmIE5MTV9GX0RVTVApIHsKIAkJaWYgKG5sbXNnX2F0dHJsZW4oaCwgaGRybGVuKSkgewogCQkJc3RydWN0IG5sYXR0ciAqYXR0cjsKKwkJCWludCBlcnI7CiAKIAkJCWF0dHIgPSBubG1zZ19maW5kX2F0dHIoaCwgaGRybGVuLAogCQkJCQkgICAgICAgSU5FVF9ESUFHX1JFUV9CWVRFQ09ERSk7Ci0JCQlpZiAoIWF0dHIgfHwKLQkJCSAgICBubGFfbGVuKGF0dHIpIDwgc2l6ZW9mKHN0cnVjdCBpbmV0X2RpYWdfYmNfb3ApIHx8Ci0JCQkgICAgaW5ldF9kaWFnX2JjX2F1ZGl0KG5sYV9kYXRhKGF0dHIpLCBubGFfbGVuKGF0dHIpKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWVyciA9IGluZXRfZGlhZ19iY19hdWRpdChhdHRyLCBza2IpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOwogCQl9CiAJCXsKIAkJCXN0cnVjdCBuZXRsaW5rX2R1bXBfY29udHJvbCBjID0gewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfZ3JlLmMgYi9uZXQvaXB2NC9pcF9ncmUuYwppbmRleCA1YjE0ODFiLi41NzZmNzA1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9ncmUuYworKysgYi9uZXQvaXB2NC9pcF9ncmUuYwpAQCAtMjQ2LDI1ICsyNDYsNiBAQAogCWlwZ3JlX2Vycihza2IsIGluZm8sICZ0cGkpOwogfQogCi1zdGF0aWMgX19iZTY0IGtleV90b190dW5uZWxfaWQoX19iZTMyIGtleSkKLXsKLSNpZmRlZiBfX0JJR19FTkRJQU4KLQlyZXR1cm4gKF9fZm9yY2UgX19iZTY0KSgoX19mb3JjZSB1MzIpa2V5KTsKLSNlbHNlCi0JcmV0dXJuIChfX2ZvcmNlIF9fYmU2NCkoKF9fZm9yY2UgdTY0KWtleSA8PCAzMik7Ci0jZW5kaWYKLX0KLQotLyogUmV0dXJucyB0aGUgbGVhc3Qtc2lnbmlmaWNhbnQgMzIgYml0cyBvZiBhIF9fYmU2NC4gKi8KLXN0YXRpYyBfX2JlMzIgdHVubmVsX2lkX3RvX2tleShfX2JlNjQgeCkKLXsKLSNpZmRlZiBfX0JJR19FTkRJQU4KLQlyZXR1cm4gKF9fZm9yY2UgX19iZTMyKXg7Ci0jZWxzZQotCXJldHVybiAoX19mb3JjZSBfX2JlMzIpKChfX2ZvcmNlIHU2NCl4ID4+IDMyKTsKLSNlbmRpZgotfQotCiBzdGF0aWMgaW50IF9faXBncmVfcmN2KHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB0bmxfcHRrX2luZm8gKnRwaSwKIAkJICAgICAgIHN0cnVjdCBpcF90dW5uZWxfbmV0ICppdG4sIGludCBoZHJfbGVuLCBib29sIHJhd19wcm90bykKIHsKQEAgLTI5MCw3ICsyNzEsNyBAQAogCQkJX19iZTY0IHR1bl9pZDsKIAogCQkJZmxhZ3MgPSB0cGktPmZsYWdzICYgKFRVTk5FTF9DU1VNIHwgVFVOTkVMX0tFWSk7Ci0JCQl0dW5faWQgPSBrZXlfdG9fdHVubmVsX2lkKHRwaS0+a2V5KTsKKwkJCXR1bl9pZCA9IGtleTMyX3RvX3R1bm5lbF9pZCh0cGktPmtleSk7CiAJCQl0dW5fZHN0ID0gaXBfdHVuX3J4X2RzdChza2IsIGZsYWdzLCB0dW5faWQsIDApOwogCQkJaWYgKCF0dW5fZHN0KQogCQkJCXJldHVybiBQQUNLRVRfUkVKRUNUOwpAQCAtMzcwLDcgKzM1MSw2IEBACiAJCQkgdHVubmVsLT5wYXJtcy5vX2ZsYWdzLCBwcm90bywgdHVubmVsLT5wYXJtcy5vX2tleSwKIAkJCSBodG9ubCh0dW5uZWwtPm9fc2Vxbm8pKTsKIAotCXNrYl9zZXRfaW5uZXJfcHJvdG9jb2woc2tiLCBwcm90byk7CiAJaXBfdHVubmVsX3htaXQoc2tiLCBkZXYsIHRubF9wYXJhbXMsIHRubF9wYXJhbXMtPnByb3RvY29sKTsKIH0KIApAQCAtNDQ3LDcgKzQyNyw3IEBACiAKIAlmbGFncyA9IHR1bl9pbmZvLT5rZXkudHVuX2ZsYWdzICYgKFRVTk5FTF9DU1VNIHwgVFVOTkVMX0tFWSk7CiAJZ3JlX2J1aWxkX2hlYWRlcihza2IsIHR1bm5lbF9obGVuLCBmbGFncywgcHJvdG8sCi0JCQkgdHVubmVsX2lkX3RvX2tleSh0dW5faW5mby0+a2V5LnR1bl9pZCksIDApOworCQkJIHR1bm5lbF9pZF90b19rZXkzMih0dW5faW5mby0+a2V5LnR1bl9pZCksIDApOwogCiAJZGYgPSBrZXktPnR1bl9mbGFncyAmIFRVTk5FTF9ET05UX0ZSQUdNRU5UID8gIGh0b25zKElQX0RGKSA6IDA7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX2lucHV0LmMgYi9uZXQvaXB2NC9pcF9pbnB1dC5jCmluZGV4IDRiMzUxYWYuLmQ2ZmVhYmIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX2lucHV0LmMKKysrIGIvbmV0L2lwdjQvaXBfaW5wdXQuYwpAQCAtMzEyLDYgKzMxMiw3IEBACiB7CiAJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAlzdHJ1Y3QgcnRhYmxlICpydDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CiAKIAkvKiBpZiBpbmdyZXNzIGRldmljZSBpcyBlbnNsYXZlZCB0byBhbiBMMyBtYXN0ZXIgZGV2aWNlIHBhc3MgdGhlCiAJICogc2tiIHRvIGl0cyBoYW5kbGVyIGZvciBwcm9jZXNzaW5nCkBAIC0zNDEsNyArMzQyLDcgQEAKIAkgKi8KIAlpZiAoIXNrYl92YWxpZF9kc3Qoc2tiKSkgewogCQlpbnQgZXJyID0gaXBfcm91dGVfaW5wdXRfbm9yZWYoc2tiLCBpcGgtPmRhZGRyLCBpcGgtPnNhZGRyLAotCQkJCQkgICAgICAgaXBoLT50b3MsIHNrYi0+ZGV2KTsKKwkJCQkJICAgICAgIGlwaC0+dG9zLCBkZXYpOwogCQlpZiAodW5saWtlbHkoZXJyKSkgewogCQkJaWYgKGVyciA9PSAtRVhERVYpCiAJCQkJX19ORVRfSU5DX1NUQVRTKG5ldCwgTElOVVhfTUlCX0lQUlBGSUxURVIpOwpAQCAtMzcwLDcgKzM3MSw3IEBACiAJCV9fSVBfVVBEX1BPX1NUQVRTKG5ldCwgSVBTVEFUU19NSUJfSU5CQ0FTVCwgc2tiLT5sZW4pOwogCX0gZWxzZSBpZiAoc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfQlJPQURDQVNUIHx8CiAJCSAgIHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX01VTFRJQ0FTVCkgewotCQlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXYgPSBfX2luX2Rldl9nZXRfcmN1KHNrYi0+ZGV2KTsKKwkJc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gX19pbl9kZXZfZ2V0X3JjdShkZXYpOwogCiAJCS8qIFJGQyAxMTIyIDMuMy42OgogCQkgKgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfb3V0cHV0LmMgYi9uZXQvaXB2NC9pcF9vdXRwdXQuYwppbmRleCBkZGUzN2ZiLi4wNWQxMDU4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9vdXRwdXQuYworKysgYi9uZXQvaXB2NC9pcF9vdXRwdXQuYwpAQCAtNzMsNiArNzMsNyBAQAogI2luY2x1ZGUgPG5ldC9pY21wLmg+CiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CiAjaW5jbHVkZSA8bmV0L2luZXRwZWVyLmg+CisjaW5jbHVkZSA8bmV0L2x3dHVubmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaWdtcC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS5oPgpAQCAtOTgsNiArOTksMTQgQEAKIAogCWlwaC0+dG90X2xlbiA9IGh0b25zKHNrYi0+bGVuKTsKIAlpcF9zZW5kX2NoZWNrKGlwaCk7CisKKwkvKiBpZiBlZ3Jlc3MgZGV2aWNlIGlzIGVuc2xhdmVkIHRvIGFuIEwzIG1hc3RlciBkZXZpY2UgcGFzcyB0aGUKKwkgKiBza2IgdG8gaXRzIGhhbmRsZXIgZm9yIHByb2Nlc3NpbmcKKwkgKi8KKwlza2IgPSBsM21kZXZfaXBfb3V0KHNrLCBza2IpOworCWlmICh1bmxpa2VseSghc2tiKSkKKwkJcmV0dXJuIDA7CisKIAlyZXR1cm4gbmZfaG9vayhORlBST1RPX0lQVjQsIE5GX0lORVRfTE9DQUxfT1VULAogCQkgICAgICAgbmV0LCBzaywgc2tiLCBOVUxMLCBza2JfZHN0KHNrYiktPmRldiwKIAkJICAgICAgIGRzdF9vdXRwdXQpOwpAQCAtMTk3LDYgKzIwNiwxMyBAQAogCQlza2IgPSBza2IyOwogCX0KIAorCWlmIChsd3R1bm5lbF94bWl0X3JlZGlyZWN0KGRzdC0+bHd0c3RhdGUpKSB7CisJCWludCByZXMgPSBsd3R1bm5lbF94bWl0KHNrYik7CisKKwkJaWYgKHJlcyA8IDAgfHwgcmVzID09IExXVFVOTkVMX1hNSVRfRE9ORSkKKwkJCXJldHVybiByZXM7CisJfQorCiAJcmN1X3JlYWRfbG9ja19iaCgpOwogCW5leHRob3AgPSAoX19mb3JjZSB1MzIpIHJ0X25leHRob3AocnQsIGlwX2hkcihza2IpLT5kYWRkcik7CiAJbmVpZ2ggPSBfX2lwdjRfbmVpZ2hfbG9va3VwX25vcmVmKGRldiwgbmV4dGhvcCk7CkBAIC00ODIsNyArNDk4LDcgQEAKIAl0by0+dGNfaW5kZXggPSBmcm9tLT50Y19pbmRleDsKICNlbmRpZgogCW5mX2NvcHkodG8sIGZyb20pOwotI2lmIGRlZmluZWQoQ09ORklHX0lQX1ZTKSB8fCBkZWZpbmVkKENPTkZJR19JUF9WU19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBfVlMpCiAJdG8tPmlwdnNfcHJvcGVydHkgPSBmcm9tLT5pcHZzX3Byb3BlcnR5OwogI2VuZGlmCiAJc2tiX2NvcHlfc2VjbWFyayh0bywgZnJvbSk7CkBAIC0xNTY2LDggKzE1ODIsNyBAQAogCX0KIAogCW9pZiA9IGFyZy0+Ym91bmRfZGV2X2lmOwotCWlmICghb2lmICYmIG5ldGlmX2luZGV4X2lzX2wzX21hc3RlcihuZXQsIHNrYi0+c2tiX2lpZikpCi0JCW9pZiA9IHNrYi0+c2tiX2lpZjsKKwlvaWYgPSBvaWYgPyA6IHNrYi0+c2tiX2lpZjsKIAogCWZsb3dpNF9pbml0X291dHB1dCgmZmw0LCBvaWYsCiAJCQkgICBJUDRfUkVQTFlfTUFSSyhuZXQsIHNrYi0+bWFyayksCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9zb2NrZ2x1ZS5jIGIvbmV0L2lwdjQvaXBfc29ja2dsdWUuYwppbmRleCA3MWE1MmY0ZC4uYWY0OTE5NyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfc29ja2dsdWUuYworKysgYi9uZXQvaXB2NC9pcF9zb2NrZ2x1ZS5jCkBAIC0yODQsOSArMjg0LDEyIEBACiAJCQlpcGMtPnR0bCA9IHZhbDsKIAkJCWJyZWFrOwogCQljYXNlIElQX1RPUzoKLQkJCWlmIChjbXNnLT5jbXNnX2xlbiAhPSBDTVNHX0xFTihzaXplb2YoaW50KSkpCisJCQlpZiAoY21zZy0+Y21zZ19sZW4gPT0gQ01TR19MRU4oc2l6ZW9mKGludCkpKQorCQkJCXZhbCA9ICooaW50ICopQ01TR19EQVRBKGNtc2cpOworCQkJZWxzZSBpZiAoY21zZy0+Y21zZ19sZW4gPT0gQ01TR19MRU4oc2l6ZW9mKHU4KSkpCisJCQkJdmFsID0gKih1OCAqKUNNU0dfREFUQShjbXNnKTsKKwkJCWVsc2UKIAkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCXZhbCA9ICooaW50ICopQ01TR19EQVRBKGNtc2cpOwogCQkJaWYgKHZhbCA8IDAgfHwgdmFsID4gMjU1KQogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJaXBjLT50b3MgPSB2YWw7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF90dW5uZWwuYyBiL25ldC9pcHY0L2lwX3R1bm5lbC5jCmluZGV4IDk1NjQ5ZWIuLjU3MTlkNmIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX3R1bm5lbC5jCisrKyBiL25ldC9pcHY0L2lwX3R1bm5lbC5jCkBAIC01NSw2ICs1NSw3IEBACiAjaW5jbHVkZSA8bmV0L25ldG5zL2dlbmVyaWMuaD4KICNpbmNsdWRlIDxuZXQvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L3VkcC5oPgorI2luY2x1ZGUgPG5ldC9kc3RfbWV0YWRhdGEuaD4KIAogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KQEAgLTU0Niw2ICs1NDcsODEgQEAKIAlyZXR1cm4gMDsKIH0KIAordm9pZCBpcF9tZF90dW5uZWxfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBwcm90bykKK3sKKwlzdHJ1Y3QgaXBfdHVubmVsICp0dW5uZWwgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiBoZWFkcm9vbSA9IHNpemVvZihzdHJ1Y3QgaXBoZHIpOworCXN0cnVjdCBpcF90dW5uZWxfaW5mbyAqdHVuX2luZm87CisJY29uc3Qgc3RydWN0IGlwX3R1bm5lbF9rZXkgKmtleTsKKwljb25zdCBzdHJ1Y3QgaXBoZHIgKmlubmVyX2lwaDsKKwlzdHJ1Y3QgcnRhYmxlICpydDsKKwlzdHJ1Y3QgZmxvd2k0IGZsNDsKKwlfX2JlMTYgZGYgPSAwOworCXU4IHRvcywgdHRsOworCisJdHVuX2luZm8gPSBza2JfdHVubmVsX2luZm8oc2tiKTsKKwlpZiAodW5saWtlbHkoIXR1bl9pbmZvIHx8ICEodHVuX2luZm8tPm1vZGUgJiBJUF9UVU5ORUxfSU5GT19UWCkgfHwKKwkJICAgICBpcF90dW5uZWxfaW5mb19hZih0dW5faW5mbykgIT0gQUZfSU5FVCkpCisJCWdvdG8gdHhfZXJyb3I7CisJa2V5ID0gJnR1bl9pbmZvLT5rZXk7CisJbWVtc2V0KCYoSVBDQihza2IpLT5vcHQpLCAwLCBzaXplb2YoSVBDQihza2IpLT5vcHQpKTsKKwlpbm5lcl9pcGggPSAoY29uc3Qgc3RydWN0IGlwaGRyICopc2tiX2lubmVyX25ldHdvcmtfaGVhZGVyKHNrYik7CisJdG9zID0ga2V5LT50b3M7CisJaWYgKHRvcyA9PSAxKSB7CisJCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkKKwkJCXRvcyA9IGlubmVyX2lwaC0+dG9zOworCQllbHNlIGlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQVjYpKQorCQkJdG9zID0gaXB2Nl9nZXRfZHNmaWVsZCgoY29uc3Qgc3RydWN0IGlwdjZoZHIgKilpbm5lcl9pcGgpOworCX0KKwlpbml0X3R1bm5lbF9mbG93KCZmbDQsIHByb3RvLCBrZXktPnUuaXB2NC5kc3QsIGtleS0+dS5pcHY0LnNyYywgMCwKKwkJCSBSVF9UT1ModG9zKSwgdHVubmVsLT5wYXJtcy5saW5rKTsKKwlpZiAodHVubmVsLT5lbmNhcC50eXBlICE9IFRVTk5FTF9FTkNBUF9OT05FKQorCQlnb3RvIHR4X2Vycm9yOworCXJ0ID0gaXBfcm91dGVfb3V0cHV0X2tleSh0dW5uZWwtPm5ldCwgJmZsNCk7CisJaWYgKElTX0VSUihydCkpIHsKKwkJZGV2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOworCQlnb3RvIHR4X2Vycm9yOworCX0KKwlpZiAocnQtPmRzdC5kZXYgPT0gZGV2KSB7CisJCWlwX3J0X3B1dChydCk7CisJCWRldi0+c3RhdHMuY29sbGlzaW9ucysrOworCQlnb3RvIHR4X2Vycm9yOworCX0KKwl0b3MgPSBpcF90dW5uZWxfZWNuX2VuY2FwKHRvcywgaW5uZXJfaXBoLCBza2IpOworCXR0bCA9IGtleS0+dHRsOworCWlmICh0dGwgPT0gMCkgeworCQlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpCisJCQl0dGwgPSBpbm5lcl9pcGgtPnR0bDsKKwkJZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUFY2KSkKKwkJCXR0bCA9ICgoY29uc3Qgc3RydWN0IGlwdjZoZHIgKilpbm5lcl9pcGgpLT5ob3BfbGltaXQ7CisJCWVsc2UKKwkJCXR0bCA9IGlwNF9kc3RfaG9wbGltaXQoJnJ0LT5kc3QpOworCX0KKwlpZiAoa2V5LT50dW5fZmxhZ3MgJiBUVU5ORUxfRE9OVF9GUkFHTUVOVCkKKwkJZGYgPSBodG9ucyhJUF9ERik7CisJZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpCisJCWRmID0gaW5uZXJfaXBoLT5mcmFnX29mZiAmIGh0b25zKElQX0RGKTsKKwloZWFkcm9vbSArPSBMTF9SRVNFUlZFRF9TUEFDRShydC0+ZHN0LmRldikgKyBydC0+ZHN0LmhlYWRlcl9sZW47CisJaWYgKGhlYWRyb29tID4gZGV2LT5uZWVkZWRfaGVhZHJvb20pCisJCWRldi0+bmVlZGVkX2hlYWRyb29tID0gaGVhZHJvb207CisKKwlpZiAoc2tiX2Nvd19oZWFkKHNrYiwgZGV2LT5uZWVkZWRfaGVhZHJvb20pKSB7CisJCWlwX3J0X3B1dChydCk7CisJCWdvdG8gdHhfZHJvcHBlZDsKKwl9CisJaXB0dW5uZWxfeG1pdChOVUxMLCBydCwgc2tiLCBmbDQuc2FkZHIsIGZsNC5kYWRkciwgcHJvdG8sIGtleS0+dG9zLAorCQkgICAgICBrZXktPnR0bCwgZGYsICFuZXRfZXEodHVubmVsLT5uZXQsIGRldl9uZXQoZGV2KSkpOworCXJldHVybjsKK3R4X2Vycm9yOgorCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CisJZ290byBrZnJlZTsKK3R4X2Ryb3BwZWQ6CisJZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7CitrZnJlZToKKwlrZnJlZV9za2Ioc2tiKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlwX21kX3R1bm5lbF94bWl0KTsKKwogdm9pZCBpcF90dW5uZWxfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkgICAgY29uc3Qgc3RydWN0IGlwaGRyICp0bmxfcGFyYW1zLCB1OCBwcm90b2NvbCkKIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX3R1bm5lbF9jb3JlLmMgYi9uZXQvaXB2NC9pcF90dW5uZWxfY29yZS5jCmluZGV4IDlkODQ3YzMuLjc3N2JjMTggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX3R1bm5lbF9jb3JlLmMKKysrIGIvbmV0L2lwdjQvaXBfdHVubmVsX2NvcmUuYwpAQCAtNjksMTMgKzY5LDE1IEBACiAKIAlza2Jfc2NydWJfcGFja2V0KHNrYiwgeG5ldCk7CiAKLQlza2JfY2xlYXJfaGFzaChza2IpOworCXNrYl9jbGVhcl9oYXNoX2lmX25vdF9sNChza2IpOwogCXNrYl9kc3Rfc2V0KHNrYiwgJnJ0LT5kc3QpOwogCW1lbXNldChJUENCKHNrYiksIDAsIHNpemVvZigqSVBDQihza2IpKSk7CiAKLQlpZiAoc2tiX2lpZiAmJiBwcm90byA9PSBJUFBST1RPX1VEUCkgewotCQkvKiBBcnJpdmVkIGZyb20gYW4gaW5ncmVzcyBpbnRlcmZhY2UgYW5kIGdvdCB1ZHAgZW5jYXB1c2xhdGVkLgotCQkgKiBUaGUgZW5jYXBzdWxhdGVkIG5ldHdvcmsgc2VnbWVudCBsZW5ndGggbWF5IGV4Y2VlZCBkc3QgbXR1LgorCWlmIChza2JfaWlmICYmICEoZGYgJiBodG9ucyhJUF9ERikpKSB7CisJCS8qIEFycml2ZWQgZnJvbSBhbiBpbmdyZXNzIGludGVyZmFjZSwgZ290IGVuY2Fwc3VsYXRlZCwgd2l0aAorCQkgKiBmcmFnbWVudGF0aW9uIG9mIGVuY2FwdWxhdGluZyBmcmFtZXMgYWxsb3dlZC4KKwkJICogSWYgc2tiIGlzIGdzbywgdGhlIHJlc3VsdGluZyBlbmNhcHN1bGF0ZWQgbmV0d29yayBzZWdtZW50cworCQkgKiBtYXkgZXhjZWVkIGRzdCBtdHUuCiAJCSAqIEFsbG93IElQIEZyYWdtZW50YXRpb24gb2Ygc2VnbWVudHMuCiAJCSAqLwogCQlJUENCKHNrYiktPmZsYWdzIHw9IElQU0tCX0ZSQUdfU0VHUzsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX3Z0aS5jIGIvbmV0L2lwdjQvaXBfdnRpLmMKaW5kZXggYTkxNzkwMy4uNWQ3OTQ0ZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfdnRpLmMKKysrIGIvbmV0L2lwdjQvaXBfdnRpLmMKQEAgLTg4LDYgKzg4LDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXN0cnVjdCBwY3B1X3N3X25ldHN0YXRzICp0c3RhdHM7CiAJc3RydWN0IHhmcm1fc3RhdGUgKng7CisJc3RydWN0IHhmcm1fbW9kZSAqaW5uZXJfbW9kZTsKIAlzdHJ1Y3QgaXBfdHVubmVsICp0dW5uZWwgPSBYRlJNX1RVTk5FTF9TS0JfQ0Ioc2tiKS0+dHVubmVsLmlwNDsKIAl1MzIgb3JpZ19tYXJrID0gc2tiLT5tYXJrOwogCWludCByZXQ7CkBAIC0xMDUsNyArMTA2LDE5IEBACiAJfQogCiAJeCA9IHhmcm1faW5wdXRfc3RhdGUoc2tiKTsKLQlmYW1pbHkgPSB4LT5pbm5lcl9tb2RlLT5hZmluZm8tPmZhbWlseTsKKworCWlubmVyX21vZGUgPSB4LT5pbm5lcl9tb2RlOworCisJaWYgKHgtPnNlbC5mYW1pbHkgPT0gQUZfVU5TUEVDKSB7CisJCWlubmVyX21vZGUgPSB4ZnJtX2lwMmlubmVyX21vZGUoeCwgWEZSTV9NT0RFX1NLQl9DQihza2IpLT5wcm90b2NvbCk7CisJCWlmIChpbm5lcl9tb2RlID09IE5VTEwpIHsKKwkJCVhGUk1fSU5DX1NUQVRTKGRldl9uZXQoc2tiLT5kZXYpLAorCQkJCSAgICAgICBMSU5VWF9NSUJfWEZSTUlOU1RBVEVNT0RFRVJST1IpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlmYW1pbHkgPSBpbm5lcl9tb2RlLT5hZmluZm8tPmZhbWlseTsKIAogCXNrYi0+bWFyayA9IGJlMzJfdG9fY3B1KHR1bm5lbC0+cGFybXMuaV9rZXkpOwogCXJldCA9IHhmcm1fcG9saWN5X2NoZWNrKE5VTEwsIFhGUk1fUE9MSUNZX0lOLCBza2IsIGZhbWlseSk7CkBAIC01NTcsNiArNTcwLDMzIEBACiAJLmdldF9saW5rX25ldAk9IGlwX3R1bm5lbF9nZXRfbGlua19uZXQsCiB9OwogCitzdGF0aWMgYm9vbCBpc192dGlfdHVubmVsKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldi0+bmV0ZGV2X29wcyA9PSAmdnRpX25ldGRldl9vcHM7Cit9CisKK3N0YXRpYyBpbnQgdnRpX2RldmljZV9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnVudXNlZCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5ldGRldl9ub3RpZmllcl9pbmZvX3RvX2RldihwdHIpOworCXN0cnVjdCBpcF90dW5uZWwgKnR1bm5lbCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoIWlzX3Z0aV90dW5uZWwoZGV2KSkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTkVUREVWX0RPV046CisJCWlmICghbmV0X2VxKHR1bm5lbC0+bmV0LCBkZXZfbmV0KGRldikpKQorCQkJeGZybV9nYXJiYWdlX2NvbGxlY3QodHVubmVsLT5uZXQpOworCQlicmVhazsKKwl9CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHZ0aV9ub3RpZmllcl9ibG9jayBfX3JlYWRfbW9zdGx5ID0geworCS5ub3RpZmllcl9jYWxsID0gdnRpX2RldmljZV9ldmVudCwKK307CisKIHN0YXRpYyBpbnQgX19pbml0IHZ0aV9pbml0KHZvaWQpCiB7CiAJY29uc3QgY2hhciAqbXNnOwpAQCAtNTY0LDYgKzYwNCw4IEBACiAKIAlwcl9pbmZvKCJJUHY0IG92ZXIgSVBzZWMgdHVubmVsaW5nIGRyaXZlclxuIik7CiAKKwlyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJnZ0aV9ub3RpZmllcl9ibG9jayk7CisKIAltc2cgPSAidHVubmVsIGRldmljZSI7CiAJZXJyID0gcmVnaXN0ZXJfcGVybmV0X2RldmljZSgmdnRpX25ldF9vcHMpOwogCWlmIChlcnIgPCAwKQpAQCAtNTk2LDYgKzYzOCw3IEBACiB4ZnJtX3Byb3RvX2VzcF9mYWlsZWQ6CiAJdW5yZWdpc3Rlcl9wZXJuZXRfZGV2aWNlKCZ2dGlfbmV0X29wcyk7CiBwZXJuZXRfZGV2X2ZhaWxlZDoKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmdnRpX25vdGlmaWVyX2Jsb2NrKTsKIAlwcl9lcnIoInZ0aSBpbml0OiBmYWlsZWQgdG8gcmVnaXN0ZXIgJXNcbiIsIG1zZyk7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTYwNyw2ICs2NTAsNyBAQAogCXhmcm00X3Byb3RvY29sX2RlcmVnaXN0ZXIoJnZ0aV9haDRfcHJvdG9jb2wsIElQUFJPVE9fQUgpOwogCXhmcm00X3Byb3RvY29sX2RlcmVnaXN0ZXIoJnZ0aV9lc3A0X3Byb3RvY29sLCBJUFBST1RPX0VTUCk7CiAJdW5yZWdpc3Rlcl9wZXJuZXRfZGV2aWNlKCZ2dGlfbmV0X29wcyk7CisJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJnZ0aV9ub3RpZmllcl9ibG9jayk7CiB9CiAKIG1vZHVsZV9pbml0KHZ0aV9pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwY29uZmlnLmMgYi9uZXQvaXB2NC9pcGNvbmZpZy5jCmluZGV4IDFkNzFjNDAuLjA3MWE3ODUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwY29uZmlnLmMKKysrIGIvbmV0L2lwdjQvaXBjb25maWcuYwpAQCAtODUsNyArODUsNiBAQAogLyogRGVmaW5lIHRoZSB0aW1lb3V0IGZvciB3YWl0aW5nIGZvciBhIERIQ1AvQk9PVFAvUkFSUCByZXBseSAqLwogI2RlZmluZSBDT05GX09QRU5fUkVUUklFUyAJMgkvKiAoUmUpb3BlbiBkZXZpY2VzIHR3aWNlICovCiAjZGVmaW5lIENPTkZfU0VORF9SRVRSSUVTIAk2CS8qIFNlbmQgc2l4IHJlcXVlc3RzIHBlciBvcGVuICovCi0jZGVmaW5lIENPTkZfSU5URVJfVElNRU9VVAkoSFopCS8qIEludGVyLWRldmljZSB0aW1lb3V0OiAxIHNlY29uZCAqLwogI2RlZmluZSBDT05GX0JBU0VfVElNRU9VVAkoSFoqMikJLyogSW5pdGlhbCB0aW1lb3V0OiAyIHNlY29uZHMgKi8KICNkZWZpbmUgQ09ORl9USU1FT1VUX1JBTkRPTQkoSFopCS8qIE1heGltdW0gYW1vdW50IG9mIHJhbmRvbWl6YXRpb24gKi8KICNkZWZpbmUgQ09ORl9USU1FT1VUX01VTFQJKjcvNAkvKiBSYXRlIG9mIHRpbWVvdXQgZ3Jvd3RoICovCkBAIC0xODgsNyArMTg3LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaWNfZGV2aWNlICppY19maXJzdF9kZXYgX19pbml0ZGF0YTsJLyogTGlzdCBvZiBvcGVuIGRldmljZSAqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICppY19kZXYgX19pbml0ZGF0YTsJCS8qIFNlbGVjdGVkIGRldmljZSAqLworc3RhdGljIHN0cnVjdCBpY19kZXZpY2UgKmljX2RldiBfX2luaXRkYXRhOwkJLyogU2VsZWN0ZWQgZGV2aWNlICovCiAKIHN0YXRpYyBib29sIF9faW5pdCBpY19pc19pbml0X2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewpAQCAtMzA3LDcgKzMwNiw3IEBACiAJd2hpbGUgKChkID0gbmV4dCkpIHsKIAkJbmV4dCA9IGQtPm5leHQ7CiAJCWRldiA9IGQtPmRldjsKLQkJaWYgKGRldiAhPSBpY19kZXYgJiYgIW5ldGRldl91c2VzX2RzYShkZXYpKSB7CisJCWlmICgoIWljX2RldiB8fCBkZXYgIT0gaWNfZGV2LT5kZXYpICYmICFuZXRkZXZfdXNlc19kc2EoZGV2KSkgewogCQkJcHJfZGVidWcoIklQLUNvbmZpZzogRG93bmluZyAlc1xuIiwgZGV2LT5uYW1lKTsKIAkJCWRldl9jaGFuZ2VfZmxhZ3MoZGV2LCBkLT5mbGFncyk7CiAJCX0KQEAgLTM3Miw3ICszNzEsNyBAQAogCWludCBlcnI7CiAKIAltZW1zZXQoJmlyLCAwLCBzaXplb2YoaXIpKTsKLQlzdHJjcHkoaXIuaWZyX2lmcm4uaWZybl9uYW1lLCBpY19kZXYtPm5hbWUpOworCXN0cmNweShpci5pZnJfaWZybi5pZnJuX25hbWUsIGljX2Rldi0+ZGV2LT5uYW1lKTsKIAlzZXRfc29ja2FkZHIoc2luLCBpY19teWFkZHIsIDApOwogCWlmICgoZXJyID0gaWNfZGV2aW5ldF9pb2N0bChTSU9DU0lGQUREUiwgJmlyKSkgPCAwKSB7CiAJCXByX2VycigiSVAtQ29uZmlnOiBVbmFibGUgdG8gc2V0IGludGVyZmFjZSBhZGRyZXNzICglZClcbiIsCkBAIC0zOTYsNyArMzk1LDcgQEAKIAkgKiBvdXQsIHdlJ2xsIHRyeSB0byBtdWRkbGUgYWxvbmcuCiAJICovCiAJaWYgKGljX2Rldl9tdHUgIT0gMCkgewotCQlzdHJjcHkoaXIuaWZyX25hbWUsIGljX2Rldi0+bmFtZSk7CisJCXN0cmNweShpci5pZnJfbmFtZSwgaWNfZGV2LT5kZXYtPm5hbWUpOwogCQlpci5pZnJfbXR1ID0gaWNfZGV2X210dTsKIAkJaWYgKChlcnIgPSBpY19kZXZfaW9jdGwoU0lPQ1NJRk1UVSwgJmlyKSkgPCAwKQogCQkJcHJfZXJyKCJJUC1Db25maWc6IFVuYWJsZSB0byBzZXQgaW50ZXJmYWNlIG10dSB0byAlZCAoJWQpXG4iLApAQCAtNTY4LDcgKzU2Nyw3IEBACiAJCWdvdG8gZHJvcF91bmxvY2s7CiAKIAkvKiBXZSBoYXZlIGEgd2lubmVyISAqLwotCWljX2RldiA9IGRldjsKKwlpY19kZXYgPSBkOwogCWlmIChpY19teWFkZHIgPT0gTk9ORSkKIAkJaWNfbXlhZGRyID0gdGlwOwogCWljX3NlcnZhZGRyID0gc2lwOwpAQCAtNjU1LDggKzY1NCw2IEBACiAJLmZ1bmMgPQlpY19ib290cF9yZWN2LAogfTsKIAotc3RhdGljIF9fYmUzMiBpY19kZXZfeGlkOwkJLyogRGV2aWNlIHVuZGVyIGNvbmZpZ3VyYXRpb24gKi8KLQogLyoKICAqICBJbml0aWFsaXplIERIQ1AvQk9PVFAgZXh0ZW5zaW9uIGZpZWxkcyBpbiB0aGUgcmVxdWVzdC4KICAqLwpAQCAtNjY2LDE0ICs2NjMsMTQgQEAKICNpZmRlZiBJUENPTkZJR19ESENQCiAKIHN0YXRpYyB2b2lkIF9faW5pdAotaWNfZGhjcF9pbml0X29wdGlvbnModTggKm9wdGlvbnMpCitpY19kaGNwX2luaXRfb3B0aW9ucyh1OCAqb3B0aW9ucywgc3RydWN0IGljX2RldmljZSAqZCkKIHsKIAl1OCBtdCA9ICgoaWNfc2VydmFkZHIgPT0gTk9ORSkKIAkJID8gREhDUERJU0NPVkVSIDogREhDUFJFUVVFU1QpOwogCXU4ICplID0gb3B0aW9uczsKIAlpbnQgbGVuOwogCi0JcHJfZGVidWcoIkRIQ1A6IFNlbmRpbmcgbWVzc2FnZSB0eXBlICVkXG4iLCBtdCk7CisJcHJfZGVidWcoIkRIQ1A6IFNlbmRpbmcgbWVzc2FnZSB0eXBlICVkICglcylcbiIsIG10LCBkLT5kZXYtPm5hbWUpOwogCiAJbWVtY3B5KGUsIGljX2Jvb3RwX2Nvb2tpZSwgNCk7CS8qIFJGQzEwNDggTWFnaWMgQ29va2llICovCiAJZSArPSA0OwpAQCAtODU3LDcgKzg1NCw3IEBACiAJLyogYWRkIERIQ1Agb3B0aW9ucyBvciBCT09UUCBleHRlbnNpb25zICovCiAjaWZkZWYgSVBDT05GSUdfREhDUAogCWlmIChpY19wcm90b19lbmFibGVkICYgSUNfVVNFX0RIQ1ApCi0JCWljX2RoY3BfaW5pdF9vcHRpb25zKGItPmV4dGVuKTsKKwkJaWNfZGhjcF9pbml0X29wdGlvbnMoYi0+ZXh0ZW4sIGQpOwogCWVsc2UKICNlbmRpZgogCQlpY19ib290cF9pbml0X2V4dChiLT5leHRlbik7CkBAIC0xMDMzLDE0ICsxMDMwLDggQEAKIAkvKiBJcyBpdCBhIHJlcGx5IHRvIG91ciBCT09UUCByZXF1ZXN0PyAqLwogCWlmIChiLT5vcCAhPSBCT09UUF9SRVBMWSB8fAogCSAgICBiLT54aWQgIT0gZC0+eGlkKSB7Ci0JCW5ldF9lcnJfcmF0ZWxpbWl0ZWQoIkRIQ1AvQk9PVFA6IFJlcGx5IG5vdCBmb3IgdXMsIG9wWyV4XSB4aWRbJXhdXG4iLAotCQkJCSAgICBiLT5vcCwgYi0+eGlkKTsKLQkJZ290byBkcm9wX3VubG9jazsKLQl9Ci0KLQkvKiBJcyBpdCBhIHJlcGx5IGZvciB0aGUgZGV2aWNlIHdlIGFyZSBjb25maWd1cmluZz8gKi8KLQlpZiAoYi0+eGlkICE9IGljX2Rldl94aWQpIHsKLQkJbmV0X2Vycl9yYXRlbGltaXRlZCgiREhDUC9CT09UUDogSWdub3JpbmcgZGVsYXllZCBwYWNrZXRcbiIpOworCQluZXRfZXJyX3JhdGVsaW1pdGVkKCJESENQL0JPT1RQOiBSZXBseSBub3QgZm9yIHVzIG9uICVzLCBvcFsleF0geGlkWyV4XVxuIiwKKwkJCQkgICAgZC0+ZGV2LT5uYW1lLCBiLT5vcCwgYi0+eGlkKTsKIAkJZ290byBkcm9wX3VubG9jazsKIAl9CiAKQEAgLTEwNzUsNyArMTA2Niw3IEBACiAJCQkJfQogCQkJfQogCi0JCQlwcl9kZWJ1ZygiREhDUDogR290IG1lc3NhZ2UgdHlwZSAlZFxuIiwgbXQpOworCQkJcHJfZGVidWcoIkRIQ1A6IEdvdCBtZXNzYWdlIHR5cGUgJWQgKCVzKVxuIiwgbXQsIGQtPmRldi0+bmFtZSk7CiAKIAkJCXN3aXRjaCAobXQpIHsKIAkJCWNhc2UgREhDUE9GRkVSOgpAQCAtMTEzMCw3ICsxMTIxLDcgQEAKIAl9CiAKIAkvKiBXZSBoYXZlIGEgd2lubmVyISAqLwotCWljX2RldiA9IGRldjsKKwlpY19kZXYgPSBkOwogCWljX215YWRkciA9IGItPnlvdXJfaXA7CiAJaWNfc2VydmFkZHIgPSBiLT5zZXJ2ZXJfaXA7CiAJaWNfYWRkcnNlcnZhZGRyID0gYi0+aXBoLnNhZGRyOwpAQCAtMTIyNSw5ICsxMjE2LDYgQEAKIAl0aW1lb3V0ID0gQ09ORl9CQVNFX1RJTUVPVVQgKyAodGltZW91dCAlICh1bnNpZ25lZCBpbnQpIENPTkZfVElNRU9VVF9SQU5ET00pOwogCWZvciAoOzspIHsKICNpZmRlZiBJUENPTkZJR19CT09UUAotCQkvKiBUcmFjayB0aGUgZGV2aWNlIHdlIGFyZSBjb25maWd1cmluZyAqLwotCQlpY19kZXZfeGlkID0gZC0+eGlkOwotCiAJCWlmIChkb19ib290cCAmJiAoZC0+YWJsZSAmIElDX0JPT1RQKSkKIAkJCWljX2Jvb3RwX3NlbmRfaWYoZCwgamlmZmllcyAtIHN0YXJ0X2ppZmZpZXMpOwogI2VuZGlmCkBAIC0xMjM2LDE1ICsxMjI0LDE5IEBACiAJCQlpY19yYXJwX3NlbmRfaWYoZCk7CiAjZW5kaWYKIAotCQlqaWZmID0gamlmZmllcyArIChkLT5uZXh0ID8gQ09ORl9JTlRFUl9USU1FT1VUIDogdGltZW91dCk7Ci0JCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBqaWZmKSAmJiAhaWNfZ290X3JlcGx5KQotCQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CisJCWlmICghZC0+bmV4dCkgeworCQkJamlmZiA9IGppZmZpZXMgKyB0aW1lb3V0OworCQkJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGppZmYpICYmICFpY19nb3RfcmVwbHkpCisJCQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CisJCX0KICNpZmRlZiBJUENPTkZJR19ESENQCiAJCS8qIERIQ1AgaXNuJ3QgZG9uZSB1bnRpbCB3ZSBnZXQgYSBESENQQUNLLiAqLwogCQlpZiAoKGljX2dvdF9yZXBseSAmIElDX0JPT1RQKSAmJgogCQkgICAgKGljX3Byb3RvX2VuYWJsZWQgJiBJQ19VU0VfREhDUCkgJiYKIAkJICAgIGljX2RoY3BfbXNndHlwZSAhPSBESENQQUNLKSB7CiAJCQlpY19nb3RfcmVwbHkgPSAwOworCQkJLyogY29udGludWUgb24gZGV2aWNlIHRoYXQgZ290IHRoZSByZXBseSAqLworCQkJZCA9IGljX2RldjsKIAkJCXByX2NvbnQoIiwiKTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC0xNDg3LDcgKzE0NzksNyBAQAogI2VuZGlmIC8qIElQQ09ORklHX0RZTkFNSUMgKi8KIAl9IGVsc2UgewogCQkvKiBEZXZpY2Ugc2VsZWN0ZWQgbWFudWFsbHkgb3Igb25seSBvbmUgZGV2aWNlIC0+IHVzZSBpdCAqLwotCQlpY19kZXYgPSBpY19maXJzdF9kZXYtPmRldjsKKwkJaWNfZGV2ID0gaWNfZmlyc3RfZGV2OwogCX0KIAogCWFkZHIgPSByb290X25mc19wYXJzZV9hZGRyKHJvb3Rfc2VydmVyX3BhdGgpOwpAQCAtMTUwMSwxNCArMTQ5Myw2IEBACiAJCXJldHVybiAtMTsKIAogCS8qCi0JICogQ2xvc2UgYWxsIG5ldHdvcmsgZGV2aWNlcyBleGNlcHQgdGhlIGRldmljZSB3ZSd2ZQotCSAqIGF1dG9jb25maWd1cmVkIGFuZCBzZXQgdXAgcm91dGVzLgotCSAqLwotCWljX2Nsb3NlX2RldnMoKTsKLQlpZiAoaWNfc2V0dXBfaWYoKSA8IDAgfHwgaWNfc2V0dXBfcm91dGVzKCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0KLQkvKgogCSAqIFJlY29yZCB3aGljaCBwcm90b2NvbCB3YXMgYWN0dWFsbHkgdXNlZC4KIAkgKi8KICNpZmRlZiBJUENPTkZJR19EWU5BTUlDCkBAIC0xNTIyLDcgKzE1MDYsNyBAQAogCXByX2luZm8oIklQLUNvbmZpZzogQ29tcGxldGU6XG4iKTsKIAogCXByX2luZm8oIiAgICAgZGV2aWNlPSVzLCBod2FkZHI9JSpwaEMsIGlwYWRkcj0lcEk0LCBtYXNrPSVwSTQsIGd3PSVwSTRcbiIsCi0JCWljX2Rldi0+bmFtZSwgaWNfZGV2LT5hZGRyX2xlbiwgaWNfZGV2LT5kZXZfYWRkciwKKwkJaWNfZGV2LT5kZXYtPm5hbWUsIGljX2Rldi0+ZGV2LT5hZGRyX2xlbiwgaWNfZGV2LT5kZXYtPmRldl9hZGRyLAogCQkmaWNfbXlhZGRyLCAmaWNfbmV0bWFzaywgJmljX2dhdGV3YXkpOwogCXByX2luZm8oIiAgICAgaG9zdD0lcywgZG9tYWluPSVzLCBuaXMtZG9tYWluPSVzXG4iLAogCQl1dHNuYW1lKCktPm5vZGVuYW1lLCBpY19kb21haW4sIHV0c25hbWUoKS0+ZG9tYWlubmFtZSk7CkBAIC0xNTQyLDcgKzE1MjYsMTggQEAKIAlwcl9jb250KCJcbiIpOwogI2VuZGlmIC8qICFTSUxFTlQgKi8KIAotCXJldHVybiAwOworCS8qCisJICogQ2xvc2UgYWxsIG5ldHdvcmsgZGV2aWNlcyBleGNlcHQgdGhlIGRldmljZSB3ZSd2ZQorCSAqIGF1dG9jb25maWd1cmVkIGFuZCBzZXQgdXAgcm91dGVzLgorCSAqLworCWlmIChpY19zZXR1cF9pZigpIDwgMCB8fCBpY19zZXR1cF9yb3V0ZXMoKSA8IDApCisJCWVyciA9IC0xOworCWVsc2UKKwkJZXJyID0gMDsKKworCWljX2Nsb3NlX2RldnMoKTsKKworCXJldHVybiBlcnI7CiB9CiAKIGxhdGVfaW5pdGNhbGwoaXBfYXV0b19jb25maWcpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBpcC5jIGIvbmV0L2lwdjQvaXBpcC5jCmluZGV4IDRhZTNmOGUuLmM5MzkyNTggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwaXAuYworKysgYi9uZXQvaXB2NC9pcGlwLmMKQEAgLTExNSw2ICsxMTUsNyBAQAogI2luY2x1ZGUgPG5ldC94ZnJtLmg+CiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxuZXQvbmV0bnMvZ2VuZXJpYy5oPgorI2luY2x1ZGUgPG5ldC9kc3RfbWV0YWRhdGEuaD4KIAogc3RhdGljIGJvb2wgbG9nX2Vjbl9lcnJvciA9IHRydWU7CiBtb2R1bGVfcGFyYW0obG9nX2Vjbl9lcnJvciwgYm9vbCwgMDY0NCk7CkBAIC0xOTMsNiArMTk0LDcgQEAKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KHNrYi0+ZGV2KTsKIAlzdHJ1Y3QgaXBfdHVubmVsX25ldCAqaXRuID0gbmV0X2dlbmVyaWMobmV0LCBpcGlwX25ldF9pZCk7CisJc3RydWN0IG1ldGFkYXRhX2RzdCAqdHVuX2RzdCA9IE5VTEw7CiAJc3RydWN0IGlwX3R1bm5lbCAqdHVubmVsOwogCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoOwogCkBAIC0yMTYsNyArMjE4LDEyIEBACiAJCQl0cGkgPSAmaXBpcF90cGk7CiAJCWlmIChpcHR1bm5lbF9wdWxsX2hlYWRlcihza2IsIDAsIHRwaS0+cHJvdG8sIGZhbHNlKSkKIAkJCWdvdG8gZHJvcDsKLQkJcmV0dXJuIGlwX3R1bm5lbF9yY3YodHVubmVsLCBza2IsIHRwaSwgTlVMTCwgbG9nX2Vjbl9lcnJvcik7CisJCWlmICh0dW5uZWwtPmNvbGxlY3RfbWQpIHsKKwkJCXR1bl9kc3QgPSBpcF90dW5fcnhfZHN0KHNrYiwgMCwgMCwgMCk7CisJCQlpZiAoIXR1bl9kc3QpCisJCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIGlwX3R1bm5lbF9yY3YodHVubmVsLCBza2IsIHRwaSwgdHVuX2RzdCwgbG9nX2Vjbl9lcnJvcik7CiAJfQogCiAJcmV0dXJuIC0xOwpAQCAtMjcwLDcgKzI3NywxMCBAQAogCiAJc2tiX3NldF9pbm5lcl9pcHByb3RvKHNrYiwgaXBwcm90byk7CiAKLQlpcF90dW5uZWxfeG1pdChza2IsIGRldiwgdGlwaCwgaXBwcm90byk7CisJaWYgKHR1bm5lbC0+Y29sbGVjdF9tZCkKKwkJaXBfbWRfdHVubmVsX3htaXQoc2tiLCBkZXYsIGlwcHJvdG8pOworCWVsc2UKKwkJaXBfdHVubmVsX3htaXQoc2tiLCBkZXYsIHRpcGgsIGlwcHJvdG8pOwogCXJldHVybiBORVRERVZfVFhfT0s7CiAKIHR4X2Vycm9yOgpAQCAtMzgwLDEzICszOTAsMTQgQEAKIH0KIAogc3RhdGljIHZvaWQgaXBpcF9uZXRsaW5rX3Bhcm1zKHN0cnVjdCBubGF0dHIgKmRhdGFbXSwKLQkJCSAgICAgICBzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gKnBhcm1zKQorCQkJICAgICAgIHN0cnVjdCBpcF90dW5uZWxfcGFybSAqcGFybXMsIGJvb2wgKmNvbGxlY3RfbWQpCiB7CiAJbWVtc2V0KHBhcm1zLCAwLCBzaXplb2YoKnBhcm1zKSk7CiAKIAlwYXJtcy0+aXBoLnZlcnNpb24gPSA0OwogCXBhcm1zLT5pcGgucHJvdG9jb2wgPSBJUFBST1RPX0lQSVA7CiAJcGFybXMtPmlwaC5paGwgPSA1OworCSpjb2xsZWN0X21kID0gZmFsc2U7CiAKIAlpZiAoIWRhdGEpCiAJCXJldHVybjsKQEAgLTQxNCw2ICs0MjUsOSBAQAogCiAJaWYgKCFkYXRhW0lGTEFfSVBUVU5fUE1UVURJU0NdIHx8IG5sYV9nZXRfdTgoZGF0YVtJRkxBX0lQVFVOX1BNVFVESVNDXSkpCiAJCXBhcm1zLT5pcGguZnJhZ19vZmYgPSBodG9ucyhJUF9ERik7CisKKwlpZiAoZGF0YVtJRkxBX0lQVFVOX0NPTExFQ1RfTUVUQURBVEFdKQorCQkqY29sbGVjdF9tZCA9IHRydWU7CiB9CiAKIC8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW4gRU5DQVAgYXR0cmlidXRlcyBhcmUgcHJlc2VudCBpbiB0aGUgbmwgbXNnICovCkBAIC00NTMsMTggKzQ2NywxOCBAQAogc3RhdGljIGludCBpcGlwX25ld2xpbmsoc3RydWN0IG5ldCAqc3JjX25ldCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCXN0cnVjdCBubGF0dHIgKnRiW10sIHN0cnVjdCBubGF0dHIgKmRhdGFbXSkKIHsKKwlzdHJ1Y3QgaXBfdHVubmVsICp0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gcDsKIAlzdHJ1Y3QgaXBfdHVubmVsX2VuY2FwIGlwZW5jYXA7CiAKIAlpZiAoaXBpcF9uZXRsaW5rX2VuY2FwX3Bhcm1zKGRhdGEsICZpcGVuY2FwKSkgewotCQlzdHJ1Y3QgaXBfdHVubmVsICp0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAkJaW50IGVyciA9IGlwX3R1bm5lbF9lbmNhcF9zZXR1cCh0LCAmaXBlbmNhcCk7CiAKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogCX0KIAotCWlwaXBfbmV0bGlua19wYXJtcyhkYXRhLCAmcCk7CisJaXBpcF9uZXRsaW5rX3Bhcm1zKGRhdGEsICZwLCAmdC0+Y29sbGVjdF9tZCk7CiAJcmV0dXJuIGlwX3R1bm5lbF9uZXdsaW5rKGRldiwgdGIsICZwKTsKIH0KIApAQCAtNDczLDYgKzQ4Nyw3IEBACiB7CiAJc3RydWN0IGlwX3R1bm5lbF9wYXJtIHA7CiAJc3RydWN0IGlwX3R1bm5lbF9lbmNhcCBpcGVuY2FwOworCWJvb2wgY29sbGVjdF9tZDsKIAogCWlmIChpcGlwX25ldGxpbmtfZW5jYXBfcGFybXMoZGF0YSwgJmlwZW5jYXApKSB7CiAJCXN0cnVjdCBpcF90dW5uZWwgKnQgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtNDgyLDcgKzQ5Nyw5IEBACiAJCQlyZXR1cm4gZXJyOwogCX0KIAotCWlwaXBfbmV0bGlua19wYXJtcyhkYXRhLCAmcCk7CisJaXBpcF9uZXRsaW5rX3Bhcm1zKGRhdGEsICZwLCAmY29sbGVjdF9tZCk7CisJaWYgKGNvbGxlY3RfbWQpCisJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKCgoZGV2LT5mbGFncyAmIElGRl9QT0lOVE9QT0lOVCkgJiYgIXAuaXBoLmRhZGRyKSB8fAogCSAgICAoIShkZXYtPmZsYWdzICYgSUZGX1BPSU5UT1BPSU5UKSAmJiBwLmlwaC5kYWRkcikpCkBAIC01MTYsNiArNTMzLDggQEAKIAkJbmxhX3RvdGFsX3NpemUoMikgKwogCQkvKiBJRkxBX0lQVFVOX0VOQ0FQX0RQT1JUICovCiAJCW5sYV90b3RhbF9zaXplKDIpICsKKwkJLyogSUZMQV9JUFRVTl9DT0xMRUNUX01FVEFEQVRBICovCisJCW5sYV90b3RhbF9zaXplKDApICsKIAkJMDsKIH0KIApAQCAtNTQ0LDYgKzU2Myw5IEBACiAJCQl0dW5uZWwtPmVuY2FwLmZsYWdzKSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKKwlpZiAodHVubmVsLT5jb2xsZWN0X21kKQorCQlpZiAobmxhX3B1dF9mbGFnKHNrYiwgSUZMQV9JUFRVTl9DT0xMRUNUX01FVEFEQVRBKSkKKwkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCXJldHVybiAwOwogCiBubGFfcHV0X2ZhaWx1cmU6CkBAIC01NjIsNiArNTg0LDcgQEAKIAlbSUZMQV9JUFRVTl9FTkNBUF9GTEFHU10JPSB7IC50eXBlID0gTkxBX1UxNiB9LAogCVtJRkxBX0lQVFVOX0VOQ0FQX1NQT1JUXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCiAJW0lGTEFfSVBUVU5fRU5DQVBfRFBPUlRdCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKKwlbSUZMQV9JUFRVTl9DT0xMRUNUX01FVEFEQVRBXQk9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBydG5sX2xpbmtfb3BzIGlwaXBfbGlua19vcHMgX19yZWFkX21vc3RseSA9IHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwbXIuYyBiL25ldC9pcHY0L2lwbXIuYwppbmRleCAyNjI1MzMyLi41ZjAwNmUxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcG1yLmMKKysrIGIvbmV0L2lwdjQvaXBtci5jCkBAIC0yMDc2LDYgKzIwNzYsNyBAQAogCXN0cnVjdCBydGFfbWZjX3N0YXRzIG1mY3M7CiAJc3RydWN0IG5sYXR0ciAqbXBfYXR0cjsKIAlzdHJ1Y3QgcnRuZXh0aG9wICpuaHA7CisJdW5zaWduZWQgbG9uZyBsYXN0dXNlOwogCWludCBjdDsKIAogCS8qIElmIGNhY2hlIGlzIHVucmVzb2x2ZWQsIGRvbid0IHRyeSB0byBwYXJzZSBJSUYgYW5kIE9JRiAqLwpAQCAtMjEwNSwxMiArMjEwNiwxNCBAQAogCiAJbmxhX25lc3RfZW5kKHNrYiwgbXBfYXR0cik7CiAKKwlsYXN0dXNlID0gUkVBRF9PTkNFKGMtPm1mY191bi5yZXMubGFzdHVzZSk7CisJbGFzdHVzZSA9IHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgbGFzdHVzZSkgPyBqaWZmaWVzIC0gbGFzdHVzZSA6IDA7CisKIAltZmNzLm1mY3NfcGFja2V0cyA9IGMtPm1mY191bi5yZXMucGt0OwogCW1mY3MubWZjc19ieXRlcyA9IGMtPm1mY191bi5yZXMuYnl0ZXM7CiAJbWZjcy5tZmNzX3dyb25nX2lmID0gYy0+bWZjX3VuLnJlcy53cm9uZ19pZjsKIAlpZiAobmxhX3B1dF82NGJpdChza2IsIFJUQV9NRkNfU1RBVFMsIHNpemVvZihtZmNzKSwgJm1mY3MsIFJUQV9QQUQpIHx8Ci0JICAgIG5sYV9wdXRfdTY0XzY0Yml0KHNrYiwgUlRBX0VYUElSRVMsCi0JCQkgICAgICBqaWZmaWVzX3RvX2Nsb2NrX3QoYy0+bWZjX3VuLnJlcy5sYXN0dXNlKSwKKwkgICAgbmxhX3B1dF91NjRfNjRiaXQoc2tiLCBSVEFfRVhQSVJFUywgamlmZmllc190b19jbG9ja190KGxhc3R1c2UpLAogCQkJICAgICAgUlRBX1BBRCkpCiAJCXJldHVybiAtRU1TR1NJWkU7CiAKQEAgLTIxMjAsNyArMjEyMyw3IEBACiAKIGludCBpcG1yX2dldF9yb3V0ZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgIF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAotCQkgICBzdHJ1Y3QgcnRtc2cgKnJ0bSwgaW50IG5vd2FpdCkKKwkJICAgc3RydWN0IHJ0bXNnICpydG0sIGludCBub3dhaXQsIHUzMiBwb3J0aWQpCiB7CiAJc3RydWN0IG1mY19jYWNoZSAqY2FjaGU7CiAJc3RydWN0IG1yX3RhYmxlICptcnQ7CkBAIC0yMTY1LDYgKzIxNjgsNyBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAorCQlORVRMSU5LX0NCKHNrYjIpLnBvcnRpZCA9IHBvcnRpZDsKIAkJc2tiX3B1c2goc2tiMiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOwogCQlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiMik7CiAJCWlwaCA9IGlwX2hkcihza2IyKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9LY29uZmlnIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcKaW5kZXggYzE4N2M2MC4uZDYxMzMwOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcKQEAgLTI1LDE3ICsyNSw2IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUCi0JYm9vbCAicHJvYy9zeXNjdGwgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBjb25uZWN0aW9uIHRyYWNraW5nIgotCWRlcGVuZHMgb24gTkZfQ09OTlRSQUNLX1BST0NGUyAmJiBORl9DT05OVFJBQ0tfSVBWNAotCWRlZmF1bHQgeQotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgL3Byb2MgYW5kIHN5c2N0bCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZAotCSAgbGF5ZXIgMyBkZXBlbmRlbnQgY29ubmVjdGlvbiB0cmFja2luZy4gVGhpcyBpcyBuZWVkZWQgdG8ga2VlcAotCSAgb2xkIHByb2dyYW1zIHRoYXQgaGF2ZSBub3QgYmVlbiBhZGFwdGVkIHRvIHRoZSBuZXcgbmFtZXMgd29ya2luZy4KLQotCSAgSWYgdW5zdXJlLCBzYXkgWS4KLQogaWYgTkZfVEFCTEVTCiAKIGNvbmZpZyBORl9UQUJMRVNfSVBWNApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL01ha2VmaWxlIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL01ha2VmaWxlCmluZGV4IDg3YjA3M2QuLjg1MzMyOGYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9NYWtlZmlsZQorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvTWFrZWZpbGUKQEAgLTQsMTEgKzQsNiBAQAogCiAjIG9iamVjdHMgZm9yIGwzIGluZGVwZW5kZW50IGNvbm50cmFjawogbmZfY29ubnRyYWNrX2lwdjQteQk6PSAgbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NC5vIG5mX2Nvbm50cmFja19wcm90b19pY21wLm8KLWlmZXEgKCQoQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCkseSkKLWlmZXEgKCQoQ09ORklHX1BST0NfRlMpLHkpCi1uZl9jb25udHJhY2tfaXB2NC1vYmpzCSs9IG5mX2Nvbm50cmFja19sM3Byb3RvX2lwdjRfY29tcGF0Lm8KLWVuZGlmCi1lbmRpZgogCiAjIGNvbm5lY3Rpb24gdHJhY2tpbmcKIG9iai0kKENPTkZJR19ORl9DT05OVFJBQ0tfSVBWNCkgKz0gbmZfY29ubnRyYWNrX2lwdjQubwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jCmluZGV4IGY5OTM1NDUuLjdjMDBjZTkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF90YWJsZXMuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMKQEAgLTE1Niw3ICsxNTYsNyBAQAogCS51ID0gewogCQkubG9nID0gewogCQkJLmxldmVsID0gNCwKLQkJCS5sb2dmbGFncyA9IE5GX0xPR19NQVNLLAorCQkJLmxvZ2ZsYWdzID0gTkZfTE9HX0RFRkFVTFRfTUFTSywKIAkJfSwKIAl9LAogfTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NC5jCmluZGV4IGFlMWE3MWEuLjcxM2MwOWEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0LmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjQuYwpAQCAtMTEwLDcgKzExMCw3IEBACiAJaWYgKCFoZWxwKQogCQlyZXR1cm4gTkZfQUNDRVBUOwogCi0JLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va19zbG93ICovCisJLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va190aHJlc2ggKi8KIAloZWxwZXIgPSByY3VfZGVyZWZlcmVuY2UoaGVscC0+aGVscGVyKTsKIAlpZiAoIWhlbHBlcikKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKQEAgLTIwMiw0NyArMjAyLDYgQEAKIAl9LAogfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX1NZU0NUTCkgJiYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUKQotc3RhdGljIGludCBsb2dfaW52YWxpZF9wcm90b19taW4gPSAwOwotc3RhdGljIGludCBsb2dfaW52YWxpZF9wcm90b19tYXggPSAyNTU7Ci0KLXN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIGlwX2N0X3N5c2N0bF90YWJsZVtdID0gewotCXsKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19tYXgiLAotCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYywKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19jb3VudCIsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA0NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAotCX0sCi0JewotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX2J1Y2tldHMiLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNDQ0LAotCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYywKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19jaGVja3N1bSIsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAotCX0sCi0JewotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX2xvZ19pbnZhbGlkIiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfbWlubWF4LAotCQkuZXh0cmExCQk9ICZsb2dfaW52YWxpZF9wcm90b19taW4sCi0JCS5leHRyYTIJCT0gJmxvZ19pbnZhbGlkX3Byb3RvX21heCwKLQl9LAotCXsgfQotfTsKLSNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICYmIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQgKi8KLQogLyogRmFzdCBmdW5jdGlvbiBmb3IgdGhvc2Ugd2hvIGRvbid0IHdhbnQgdG8gcGFyc2UgL3Byb2MgKGFuZCBJIGRvbid0CiAgICBibGFtZSB0aGVtKS4gKi8KIC8qIFJldmVyc2luZyB0aGUgc29ja2V0J3MgZHN0L3NyYyBwb2ludCBvZiB2aWV3IGdpdmVzIHVzIHRoZSByZXBseQpAQCAtMzUwLDIwICszMDksNiBAQAogCiBzdGF0aWMgaW50IGlwdjRfaW5pdF9uZXQoc3RydWN0IG5ldCAqbmV0KQogewotI2lmIGRlZmluZWQoQ09ORklHX1NZU0NUTCkgJiYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUKQotCXN0cnVjdCBuZl9pcF9uZXQgKmluID0gJm5ldC0+Y3QubmZfY3RfcHJvdG87Ci0JaW4tPmN0bF90YWJsZSA9IGttZW1kdXAoaXBfY3Rfc3lzY3RsX3RhYmxlLAotCQkJCXNpemVvZihpcF9jdF9zeXNjdGxfdGFibGUpLAotCQkJCUdGUF9LRVJORUwpOwotCWlmICghaW4tPmN0bF90YWJsZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpbi0+Y3RsX3RhYmxlWzBdLmRhdGEgPSAmbmZfY29ubnRyYWNrX21heDsKLQlpbi0+Y3RsX3RhYmxlWzFdLmRhdGEgPSAmbmV0LT5jdC5jb3VudDsKLQlpbi0+Y3RsX3RhYmxlWzJdLmRhdGEgPSAmbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplOwotCWluLT5jdGxfdGFibGVbM10uZGF0YSA9ICZuZXQtPmN0LnN5c2N0bF9jaGVja3N1bTsKLQlpbi0+Y3RsX3RhYmxlWzRdLmRhdGEgPSAmbmV0LT5jdC5zeXNjdGxfbG9nX2ludmFsaWQ7Ci0jZW5kaWYKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzgwLDkgKzMyNSw2IEBACiAJLm5sYXR0cl90b190dXBsZSA9IGlwdjRfbmxhdHRyX3RvX3R1cGxlLAogCS5ubGFfcG9saWN5CSA9IGlwdjRfbmxhX3BvbGljeSwKICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX1NZU0NUTCkgJiYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUKQotCS5jdGxfdGFibGVfcGF0aCAgPSAibmV0L2lwdjQvbmV0ZmlsdGVyIiwKLSNlbmRpZgogCS5pbml0X25ldAkgPSBpcHY0X2luaXRfbmV0LAogCS5tZQkJID0gVEhJU19NT0RVTEUsCiB9OwpAQCAtNDkyLDE2ICs0MzQsNyBAQAogCQlnb3RvIGNsZWFudXBfaWNtcHY0OwogCX0KIAotI2lmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpICYmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCkKLQlyZXQgPSBuZl9jb25udHJhY2tfaXB2NF9jb21wYXRfaW5pdCgpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGNsZWFudXBfcHJvdG87Ci0jZW5kaWYKIAlyZXR1cm4gcmV0OwotI2lmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpICYmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCkKLSBjbGVhbnVwX3Byb3RvOgotCW5mX2N0X2wzcHJvdG9fdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NCk7Ci0jZW5kaWYKICBjbGVhbnVwX2ljbXB2NDoKIAluZl9jdF9sNHByb3RvX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sNHByb3RvX2ljbXApOwogIGNsZWFudXBfdWRwNDoKQEAgLTUyMCw5ICs0NTMsNiBAQAogc3RhdGljIHZvaWQgX19leGl0IG5mX2Nvbm50cmFja19sM3Byb3RvX2lwdjRfZmluaSh2b2lkKQogewogCXN5bmNocm9uaXplX25ldCgpOwotI2lmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpICYmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCkKLQluZl9jb25udHJhY2tfaXB2NF9jb21wYXRfZmluaSgpOwotI2VuZGlmCiAJbmZfY3RfbDNwcm90b191bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfbDNwcm90b19pcHY0KTsKIAluZl9jdF9sNHByb3RvX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sNHByb3RvX2ljbXApOwogCW5mX2N0X2w0cHJvdG9fdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2w0cHJvdG9fdWRwNCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NF9jb21wYXQuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0X2NvbXBhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzkyMzcxLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0X2NvbXBhdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkyICswLDAgQEAKLS8qIGlwX2Nvbm50cmFjayBwcm9jIGNvbXBhdCAtIGJhc2VkIG9uIGlwX2Nvbm50cmFja19zdGFuZGFsb25lLmMKLSAqCi0gKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCi0gKiAoQykgMjAwMi0yMDA2IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Ci0gKiAoQykgMjAwNi0yMDEwIFBhdHJpY2sgTWNIYXJkeSA8a2FiZXJAdHJhc2gubmV0PgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgotI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+Ci0jaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2FjY3QuaD4KLSNpbmNsdWRlIDxsaW51eC9yY3VsaXN0X251bGxzLmg+Ci0jaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+Ci0KLXN0cnVjdCBjdF9pdGVyX3N0YXRlIHsKLQlzdHJ1Y3Qgc2VxX25ldF9wcml2YXRlIHA7Ci0Jc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKmhhc2g7Ci0JdW5zaWduZWQgaW50IGh0YWJsZV9zaXplOwotCXVuc2lnbmVkIGludCBidWNrZXQ7Ci19OwotCi1zdGF0aWMgc3RydWN0IGhsaXN0X251bGxzX25vZGUgKmN0X2dldF9maXJzdChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKLXsKLQlzdHJ1Y3QgY3RfaXRlcl9zdGF0ZSAqc3QgPSBzZXEtPnByaXZhdGU7Ci0Jc3RydWN0IGhsaXN0X251bGxzX25vZGUgKm47Ci0KLQlmb3IgKHN0LT5idWNrZXQgPSAwOwotCSAgICAgc3QtPmJ1Y2tldCA8IHN0LT5odGFibGVfc2l6ZTsKLQkgICAgIHN0LT5idWNrZXQrKykgewotCQluID0gcmN1X2RlcmVmZXJlbmNlKAotCQkJaGxpc3RfbnVsbHNfZmlyc3RfcmN1KCZzdC0+aGFzaFtzdC0+YnVja2V0XSkpOwotCQlpZiAoIWlzX2FfbnVsbHMobikpCi0JCQlyZXR1cm4gbjsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqY3RfZ2V0X25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsCi0JCQkJICAgICAgc3RydWN0IGhsaXN0X251bGxzX25vZGUgKmhlYWQpCi17Ci0Jc3RydWN0IGN0X2l0ZXJfc3RhdGUgKnN0ID0gc2VxLT5wcml2YXRlOwotCi0JaGVhZCA9IHJjdV9kZXJlZmVyZW5jZShobGlzdF9udWxsc19uZXh0X3JjdShoZWFkKSk7Ci0Jd2hpbGUgKGlzX2FfbnVsbHMoaGVhZCkpIHsKLQkJaWYgKGxpa2VseShnZXRfbnVsbHNfdmFsdWUoaGVhZCkgPT0gc3QtPmJ1Y2tldCkpIHsKLQkJCWlmICgrK3N0LT5idWNrZXQgPj0gc3QtPmh0YWJsZV9zaXplKQotCQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWhlYWQgPSByY3VfZGVyZWZlcmVuY2UoCi0JCQlobGlzdF9udWxsc19maXJzdF9yY3UoJnN0LT5oYXNoW3N0LT5idWNrZXRdKSk7Ci0JfQotCXJldHVybiBoZWFkOwotfQotCi1zdGF0aWMgc3RydWN0IGhsaXN0X251bGxzX25vZGUgKmN0X2dldF9pZHgoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCBwb3MpCi17Ci0Jc3RydWN0IGhsaXN0X251bGxzX25vZGUgKmhlYWQgPSBjdF9nZXRfZmlyc3Qoc2VxKTsKLQotCWlmIChoZWFkKQotCQl3aGlsZSAocG9zICYmIChoZWFkID0gY3RfZ2V0X25leHQoc2VxLCBoZWFkKSkpCi0JCQlwb3MtLTsKLQlyZXR1cm4gcG9zID8gTlVMTCA6IGhlYWQ7Ci19Ci0KLXN0YXRpYyB2b2lkICpjdF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQotCV9fYWNxdWlyZXMoUkNVKQotewotCXN0cnVjdCBjdF9pdGVyX3N0YXRlICpzdCA9IHNlcS0+cHJpdmF0ZTsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQotCW5mX2Nvbm50cmFja19nZXRfaHQoJnN0LT5oYXNoLCAmc3QtPmh0YWJsZV9zaXplKTsKLQlyZXR1cm4gY3RfZ2V0X2lkeChzZXEsICpwb3MpOwotfQotCi1zdGF0aWMgdm9pZCAqY3Rfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKLXsKLQkoKnBvcykrKzsKLQlyZXR1cm4gY3RfZ2V0X25leHQocywgdik7Ci19Ci0KLXN0YXRpYyB2b2lkIGN0X3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKLQlfX3JlbGVhc2VzKFJDVSkKLXsKLQlyY3VfcmVhZF91bmxvY2soKTsKLX0KLQotI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfU0VDTUFSSwotc3RhdGljIHZvaWQgY3Rfc2hvd19zZWNjdHgoc3RydWN0IHNlcV9maWxlICpzLCBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCi17Ci0JaW50IHJldDsKLQl1MzIgbGVuOwotCWNoYXIgKnNlY2N0eDsKLQotCXJldCA9IHNlY3VyaXR5X3NlY2lkX3RvX3NlY2N0eChjdC0+c2VjbWFyaywgJnNlY2N0eCwgJmxlbik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuOwotCi0Jc2VxX3ByaW50ZihzLCAic2VjY3R4PSVzICIsIHNlY2N0eCk7Ci0KLQlzZWN1cml0eV9yZWxlYXNlX3NlY2N0eChzZWNjdHgsIGxlbik7Ci19Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGN0X3Nob3dfc2VjY3R4KHN0cnVjdCBzZXFfZmlsZSAqcywgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQotewotfQotI2VuZGlmCi0KLXN0YXRpYyBib29sIGN0X3NlcV9zaG91bGRfc2tpcChjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldCAqbmV0LAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaGFzaCkKLXsKLQkvKiB3ZSBvbmx5IHdhbnQgdG8gcHJpbnQgRElSX09SSUdJTkFMICovCi0JaWYgKE5GX0NUX0RJUkVDVElPTihoYXNoKSkKLQkJcmV0dXJuIHRydWU7Ci0KLQlpZiAobmZfY3RfbDNudW0oY3QpICE9IEFGX0lORVQpCi0JCXJldHVybiB0cnVlOwotCi0JaWYgKCFuZXRfZXEobmZfY3RfbmV0KGN0KSwgbmV0KSkKLQkJcmV0dXJuIHRydWU7Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbnQgY3Rfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQotewotCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaGFzaCA9IHY7Ci0Jc3RydWN0IG5mX2Nvbm4gKmN0ID0gbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhoYXNoKTsKLQljb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKmwzcHJvdG87Ci0JY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvOwotCWludCByZXQgPSAwOwotCi0JTkZfQ1RfQVNTRVJUKGN0KTsKLQlpZiAoY3Rfc2VxX3Nob3VsZF9za2lwKGN0LCBzZXFfZmlsZV9uZXQocyksIGhhc2gpKQotCQlyZXR1cm4gMDsKLQotCWlmICh1bmxpa2VseSghYXRvbWljX2luY19ub3RfemVybygmY3QtPmN0X2dlbmVyYWwudXNlKSkpCi0JCXJldHVybiAwOwotCi0JLyogY2hlY2sgaWYgd2UgcmFjZWQgdy4gb2JqZWN0IHJldXNlICovCi0JaWYgKCFuZl9jdF9pc19jb25maXJtZWQoY3QpIHx8Ci0JICAgIGN0X3NlcV9zaG91bGRfc2tpcChjdCwgc2VxX2ZpbGVfbmV0KHMpLCBoYXNoKSkKLQkJZ290byByZWxlYXNlOwotCi0JbDNwcm90byA9IF9fbmZfY3RfbDNwcm90b19maW5kKG5mX2N0X2wzbnVtKGN0KSk7Ci0JTkZfQ1RfQVNTRVJUKGwzcHJvdG8pOwotCWw0cHJvdG8gPSBfX25mX2N0X2w0cHJvdG9fZmluZChuZl9jdF9sM251bShjdCksIG5mX2N0X3Byb3RvbnVtKGN0KSk7Ci0JTkZfQ1RfQVNTRVJUKGw0cHJvdG8pOwotCi0JcmV0ID0gLUVOT1NQQzsKLQlzZXFfcHJpbnRmKHMsICIlLThzICV1ICVsZCAiLAotCQkgICBsNHByb3RvLT5uYW1lLCBuZl9jdF9wcm90b251bShjdCksCi0JCSAgIHRpbWVyX3BlbmRpbmcoJmN0LT50aW1lb3V0KQotCQkgICA/IChsb25nKShjdC0+dGltZW91dC5leHBpcmVzIC0gamlmZmllcykvSFogOiAwKTsKLQotCWlmIChsNHByb3RvLT5wcmludF9jb25udHJhY2spCi0JCWw0cHJvdG8tPnByaW50X2Nvbm50cmFjayhzLCBjdCk7Ci0KLQlpZiAoc2VxX2hhc19vdmVyZmxvd2VkKHMpKQotCQlnb3RvIHJlbGVhc2U7Ci0KLQlwcmludF90dXBsZShzLCAmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLAotCQkgICAgbDNwcm90bywgbDRwcm90byk7Ci0KLQlpZiAoc2VxX2hhc19vdmVyZmxvd2VkKHMpKQotCQlnb3RvIHJlbGVhc2U7Ci0KLQlpZiAoc2VxX3ByaW50X2FjY3QocywgY3QsIElQX0NUX0RJUl9PUklHSU5BTCkpCi0JCWdvdG8gcmVsZWFzZTsKLQotCWlmICghKHRlc3RfYml0KElQU19TRUVOX1JFUExZX0JJVCwgJmN0LT5zdGF0dXMpKSkKLQkJc2VxX3ByaW50ZihzLCAiW1VOUkVQTElFRF0gIik7Ci0KLQlwcmludF90dXBsZShzLCAmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLAotCQkgICAgbDNwcm90bywgbDRwcm90byk7Ci0KLQlpZiAoc2VxX2hhc19vdmVyZmxvd2VkKHMpKQotCQlnb3RvIHJlbGVhc2U7Ci0KLQlpZiAoc2VxX3ByaW50X2FjY3QocywgY3QsIElQX0NUX0RJUl9SRVBMWSkpCi0JCWdvdG8gcmVsZWFzZTsKLQotCWlmICh0ZXN0X2JpdChJUFNfQVNTVVJFRF9CSVQsICZjdC0+c3RhdHVzKSkKLQkJc2VxX3ByaW50ZihzLCAiW0FTU1VSRURdICIpOwotCi0jaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19NQVJLCi0Jc2VxX3ByaW50ZihzLCAibWFyaz0ldSAiLCBjdC0+bWFyayk7Ci0jZW5kaWYKLQotCWN0X3Nob3dfc2VjY3R4KHMsIGN0KTsKLQotCXNlcV9wcmludGYocywgInVzZT0ldVxuIiwgYXRvbWljX3JlYWQoJmN0LT5jdF9nZW5lcmFsLnVzZSkpOwotCi0JaWYgKHNlcV9oYXNfb3ZlcmZsb3dlZChzKSkKLQkJZ290byByZWxlYXNlOwotCi0JcmV0ID0gMDsKLXJlbGVhc2U6Ci0JbmZfY3RfcHV0KGN0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGN0X3NlcV9vcHMgPSB7Ci0JLnN0YXJ0ID0gY3Rfc2VxX3N0YXJ0LAotCS5uZXh0ICA9IGN0X3NlcV9uZXh0LAotCS5zdG9wICA9IGN0X3NlcV9zdG9wLAotCS5zaG93ICA9IGN0X3NlcV9zaG93Ci19OwotCi1zdGF0aWMgaW50IGN0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHNlcV9vcGVuX25ldChpbm9kZSwgZmlsZSwgJmN0X3NlcV9vcHMsCi0JCQkgICAgc2l6ZW9mKHN0cnVjdCBjdF9pdGVyX3N0YXRlKSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGN0X2ZpbGVfb3BzID0gewotCS5vd25lciAgID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gICAgPSBjdF9vcGVuLAotCS5yZWFkICAgID0gc2VxX3JlYWQsCi0JLmxsc2VlayAgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzZXFfcmVsZWFzZV9uZXQsCi19OwotCi0vKiBleHBlY3RzICovCi1zdHJ1Y3QgY3RfZXhwZWN0X2l0ZXJfc3RhdGUgewotCXN0cnVjdCBzZXFfbmV0X3ByaXZhdGUgcDsKLQl1bnNpZ25lZCBpbnQgYnVja2V0OwotfTsKLQotc3RhdGljIHN0cnVjdCBobGlzdF9ub2RlICpjdF9leHBlY3RfZ2V0X2ZpcnN0KHN0cnVjdCBzZXFfZmlsZSAqc2VxKQotewotCXN0cnVjdCBjdF9leHBlY3RfaXRlcl9zdGF0ZSAqc3QgPSBzZXEtPnByaXZhdGU7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKm47Ci0KLQlmb3IgKHN0LT5idWNrZXQgPSAwOyBzdC0+YnVja2V0IDwgbmZfY3RfZXhwZWN0X2hzaXplOyBzdC0+YnVja2V0KyspIHsKLQkJbiA9IHJjdV9kZXJlZmVyZW5jZSgKLQkJCWhsaXN0X2ZpcnN0X3JjdSgmbmZfY3RfZXhwZWN0X2hhc2hbc3QtPmJ1Y2tldF0pKTsKLQkJaWYgKG4pCi0JCQlyZXR1cm4gbjsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaGxpc3Rfbm9kZSAqY3RfZXhwZWN0X2dldF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLAotCQkJCQkgICAgIHN0cnVjdCBobGlzdF9ub2RlICpoZWFkKQotewotCXN0cnVjdCBjdF9leHBlY3RfaXRlcl9zdGF0ZSAqc3QgPSBzZXEtPnByaXZhdGU7Ci0KLQloZWFkID0gcmN1X2RlcmVmZXJlbmNlKGhsaXN0X25leHRfcmN1KGhlYWQpKTsKLQl3aGlsZSAoaGVhZCA9PSBOVUxMKSB7Ci0JCWlmICgrK3N0LT5idWNrZXQgPj0gbmZfY3RfZXhwZWN0X2hzaXplKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWhlYWQgPSByY3VfZGVyZWZlcmVuY2UoCi0JCQlobGlzdF9maXJzdF9yY3UoJm5mX2N0X2V4cGVjdF9oYXNoW3N0LT5idWNrZXRdKSk7Ci0JfQotCXJldHVybiBoZWFkOwotfQotCi1zdGF0aWMgc3RydWN0IGhsaXN0X25vZGUgKmN0X2V4cGVjdF9nZXRfaWR4KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgcG9zKQotewotCXN0cnVjdCBobGlzdF9ub2RlICpoZWFkID0gY3RfZXhwZWN0X2dldF9maXJzdChzZXEpOwotCi0JaWYgKGhlYWQpCi0JCXdoaWxlIChwb3MgJiYgKGhlYWQgPSBjdF9leHBlY3RfZ2V0X25leHQoc2VxLCBoZWFkKSkpCi0JCQlwb3MtLTsKLQlyZXR1cm4gcG9zID8gTlVMTCA6IGhlYWQ7Ci19Ci0KLXN0YXRpYyB2b2lkICpleHBfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKLQlfX2FjcXVpcmVzKFJDVSkKLXsKLQlyY3VfcmVhZF9sb2NrKCk7Ci0JcmV0dXJuIGN0X2V4cGVjdF9nZXRfaWR4KHNlcSwgKnBvcyk7Ci19Ci0KLXN0YXRpYyB2b2lkICpleHBfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQotewotCSgqcG9zKSsrOwotCXJldHVybiBjdF9leHBlY3RfZ2V0X25leHQoc2VxLCB2KTsKLX0KLQotc3RhdGljIHZvaWQgZXhwX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQotCV9fcmVsZWFzZXMoUkNVKQotewotCXJjdV9yZWFkX3VubG9jaygpOwotfQotCi1zdGF0aWMgaW50IGV4cF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCi17Ci0Jc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cDsKLQljb25zdCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbiA9IHY7Ci0KLQlleHAgPSBobGlzdF9lbnRyeShuLCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCwgaG5vZGUpOwotCi0JaWYgKCFuZXRfZXEobmZfY3RfbmV0KGV4cC0+bWFzdGVyKSwgc2VxX2ZpbGVfbmV0KHMpKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoZXhwLT50dXBsZS5zcmMubDNudW0gIT0gQUZfSU5FVCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoZXhwLT50aW1lb3V0LmZ1bmN0aW9uKQotCQlzZXFfcHJpbnRmKHMsICIlbGQgIiwgdGltZXJfcGVuZGluZygmZXhwLT50aW1lb3V0KQotCQkJICAgPyAobG9uZykoZXhwLT50aW1lb3V0LmV4cGlyZXMgLSBqaWZmaWVzKS9IWiA6IDApOwotCWVsc2UKLQkJc2VxX3ByaW50ZihzLCAiLSAiKTsKLQotCXNlcV9wcmludGYocywgInByb3RvPSV1ICIsIGV4cC0+dHVwbGUuZHN0LnByb3RvbnVtKTsKLQotCXByaW50X3R1cGxlKHMsICZleHAtPnR1cGxlLAotCQkgICAgX19uZl9jdF9sM3Byb3RvX2ZpbmQoZXhwLT50dXBsZS5zcmMubDNudW0pLAotCQkgICAgX19uZl9jdF9sNHByb3RvX2ZpbmQoZXhwLT50dXBsZS5zcmMubDNudW0sCi0JCQkJCSBleHAtPnR1cGxlLmRzdC5wcm90b251bSkpOwotCXNlcV9wdXRjKHMsICdcbicpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZXhwX3NlcV9vcHMgPSB7Ci0JLnN0YXJ0ID0gZXhwX3NlcV9zdGFydCwKLQkubmV4dCA9IGV4cF9zZXFfbmV4dCwKLQkuc3RvcCA9IGV4cF9zZXFfc3RvcCwKLQkuc2hvdyA9IGV4cF9zZXFfc2hvdwotfTsKLQotc3RhdGljIGludCBleHBfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gc2VxX29wZW5fbmV0KGlub2RlLCBmaWxlLCAmZXhwX3NlcV9vcHMsCi0JCQkgICAgc2l6ZW9mKHN0cnVjdCBjdF9leHBlY3RfaXRlcl9zdGF0ZSkpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcF9leHBfZmlsZV9vcHMgPSB7Ci0JLm93bmVyICAgPSBUSElTX01PRFVMRSwKLQkub3BlbiAgICA9IGV4cF9vcGVuLAotCS5yZWFkICAgID0gc2VxX3JlYWQsCi0JLmxsc2VlayAgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzZXFfcmVsZWFzZV9uZXQsCi19OwotCi1zdGF0aWMgdm9pZCAqY3RfY3B1X3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IG5ldCAqbmV0ID0gc2VxX2ZpbGVfbmV0KHNlcSk7Ci0JaW50IGNwdTsKLQotCWlmICgqcG9zID09IDApCi0JCXJldHVybiBTRVFfU1RBUlRfVE9LRU47Ci0KLQlmb3IgKGNwdSA9ICpwb3MtMTsgY3B1IDwgbnJfY3B1X2lkczsgKytjcHUpIHsKLQkJaWYgKCFjcHVfcG9zc2libGUoY3B1KSkKLQkJCWNvbnRpbnVlOwotCQkqcG9zID0gY3B1KzE7Ci0JCXJldHVybiBwZXJfY3B1X3B0cihuZXQtPmN0LnN0YXQsIGNwdSk7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkICpjdF9jcHVfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBuZXQgKm5ldCA9IHNlcV9maWxlX25ldChzZXEpOwotCWludCBjcHU7Ci0KLQlmb3IgKGNwdSA9ICpwb3M7IGNwdSA8IG5yX2NwdV9pZHM7ICsrY3B1KSB7Ci0JCWlmICghY3B1X3Bvc3NpYmxlKGNwdSkpCi0JCQljb250aW51ZTsKLQkJKnBvcyA9IGNwdSsxOwotCQlyZXR1cm4gcGVyX2NwdV9wdHIobmV0LT5jdC5zdGF0LCBjcHUpOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBjdF9jcHVfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCi17Ci19Ci0KLXN0YXRpYyBpbnQgY3RfY3B1X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQotewotCXN0cnVjdCBuZXQgKm5ldCA9IHNlcV9maWxlX25ldChzZXEpOwotCXVuc2lnbmVkIGludCBucl9jb25udHJhY2tzID0gYXRvbWljX3JlYWQoJm5ldC0+Y3QuY291bnQpOwotCWNvbnN0IHN0cnVjdCBpcF9jb25udHJhY2tfc3RhdCAqc3QgPSB2OwotCi0JaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7Ci0JCXNlcV9wcmludGYoc2VxLCAiZW50cmllcyAgc2VhcmNoZWQgZm91bmQgbmV3IGludmFsaWQgaWdub3JlIGRlbGV0ZSBkZWxldGVfbGlzdCBpbnNlcnQgaW5zZXJ0X2ZhaWxlZCBkcm9wIGVhcmx5X2Ryb3AgaWNtcF9lcnJvciAgZXhwZWN0X25ldyBleHBlY3RfY3JlYXRlIGV4cGVjdF9kZWxldGUgc2VhcmNoX3Jlc3RhcnRcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzZXFfcHJpbnRmKHNlcSwgIiUwOHggICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggIgotCQkJIiUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAgJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKLQkJICAgbnJfY29ubnRyYWNrcywKLQkJICAgc3QtPnNlYXJjaGVkLAotCQkgICBzdC0+Zm91bmQsCi0JCSAgIHN0LT5uZXcsCi0JCSAgIHN0LT5pbnZhbGlkLAotCQkgICBzdC0+aWdub3JlLAotCQkgICBzdC0+ZGVsZXRlLAotCQkgICBzdC0+ZGVsZXRlX2xpc3QsCi0JCSAgIHN0LT5pbnNlcnQsCi0JCSAgIHN0LT5pbnNlcnRfZmFpbGVkLAotCQkgICBzdC0+ZHJvcCwKLQkJICAgc3QtPmVhcmx5X2Ryb3AsCi0JCSAgIHN0LT5lcnJvciwKLQotCQkgICBzdC0+ZXhwZWN0X25ldywKLQkJICAgc3QtPmV4cGVjdF9jcmVhdGUsCi0JCSAgIHN0LT5leHBlY3RfZGVsZXRlLAotCQkgICBzdC0+c2VhcmNoX3Jlc3RhcnQKLQkJKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBjdF9jcHVfc2VxX29wcyA9IHsKLQkuc3RhcnQgID0gY3RfY3B1X3NlcV9zdGFydCwKLQkubmV4dCAgID0gY3RfY3B1X3NlcV9uZXh0LAotCS5zdG9wICAgPSBjdF9jcHVfc2VxX3N0b3AsCi0JLnNob3cgICA9IGN0X2NwdV9zZXFfc2hvdywKLX07Ci0KLXN0YXRpYyBpbnQgY3RfY3B1X3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiBzZXFfb3Blbl9uZXQoaW5vZGUsIGZpbGUsICZjdF9jcHVfc2VxX29wcywKLQkJCSAgICBzaXplb2Yoc3RydWN0IHNlcV9uZXRfcHJpdmF0ZSkpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjdF9jcHVfc2VxX2ZvcHMgPSB7Ci0JLm93bmVyICAgPSBUSElTX01PRFVMRSwKLQkub3BlbiAgICA9IGN0X2NwdV9zZXFfb3BlbiwKLQkucmVhZCAgICA9IHNlcV9yZWFkLAotCS5sbHNlZWsgID0gc2VxX2xzZWVrLAotCS5yZWxlYXNlID0gc2VxX3JlbGVhc2VfbmV0LAotfTsKLQotc3RhdGljIGludCBfX25ldF9pbml0IGlwX2Nvbm50cmFja19uZXRfaW5pdChzdHJ1Y3QgbmV0ICpuZXQpCi17Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jLCAqcHJvY19leHAsICpwcm9jX3N0YXQ7Ci0KLQlwcm9jID0gcHJvY19jcmVhdGUoImlwX2Nvbm50cmFjayIsIDA0NDAsIG5ldC0+cHJvY19uZXQsICZjdF9maWxlX29wcyk7Ci0JaWYgKCFwcm9jKQotCQlnb3RvIGVycjE7Ci0KLQlwcm9jX2V4cCA9IHByb2NfY3JlYXRlKCJpcF9jb25udHJhY2tfZXhwZWN0IiwgMDQ0MCwgbmV0LT5wcm9jX25ldCwKLQkJCSAgICAgICAmaXBfZXhwX2ZpbGVfb3BzKTsKLQlpZiAoIXByb2NfZXhwKQotCQlnb3RvIGVycjI7Ci0KLQlwcm9jX3N0YXQgPSBwcm9jX2NyZWF0ZSgiaXBfY29ubnRyYWNrIiwgU19JUlVHTywKLQkJCQluZXQtPnByb2NfbmV0X3N0YXQsICZjdF9jcHVfc2VxX2ZvcHMpOwotCWlmICghcHJvY19zdGF0KQotCQlnb3RvIGVycjM7Ci0JcmV0dXJuIDA7Ci0KLWVycjM6Ci0JcmVtb3ZlX3Byb2NfZW50cnkoImlwX2Nvbm50cmFja19leHBlY3QiLCBuZXQtPnByb2NfbmV0KTsKLWVycjI6Ci0JcmVtb3ZlX3Byb2NfZW50cnkoImlwX2Nvbm50cmFjayIsIG5ldC0+cHJvY19uZXQpOwotZXJyMToKLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotc3RhdGljIHZvaWQgX19uZXRfZXhpdCBpcF9jb25udHJhY2tfbmV0X2V4aXQoc3RydWN0IG5ldCAqbmV0KQotewotCXJlbW92ZV9wcm9jX2VudHJ5KCJpcF9jb25udHJhY2siLCBuZXQtPnByb2NfbmV0X3N0YXQpOwotCXJlbW92ZV9wcm9jX2VudHJ5KCJpcF9jb25udHJhY2tfZXhwZWN0IiwgbmV0LT5wcm9jX25ldCk7Ci0JcmVtb3ZlX3Byb2NfZW50cnkoImlwX2Nvbm50cmFjayIsIG5ldC0+cHJvY19uZXQpOwotfQotCi1zdGF0aWMgc3RydWN0IHBlcm5ldF9vcGVyYXRpb25zIGlwX2Nvbm50cmFja19uZXRfb3BzID0gewotCS5pbml0ID0gaXBfY29ubnRyYWNrX25ldF9pbml0LAotCS5leGl0ID0gaXBfY29ubnRyYWNrX25ldF9leGl0LAotfTsKLQotaW50IF9faW5pdCBuZl9jb25udHJhY2tfaXB2NF9jb21wYXRfaW5pdCh2b2lkKQotewotCXJldHVybiByZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKCZpcF9jb25udHJhY2tfbmV0X29wcyk7Ci19Ci0KLXZvaWQgX19leGl0IG5mX2Nvbm50cmFja19pcHY0X2NvbXBhdF9maW5pKHZvaWQpCi17Ci0JdW5yZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKCZpcF9jb25udHJhY2tfbmV0X29wcyk7Ci19CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2ljbXAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcC5jCmluZGV4IGM1NjdlMWIuLmQwNzViM2MgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcC5jCkBAIC0xNDksNyArMTQ5LDcgQEAKIAkJcmV0dXJuIC1ORl9BQ0NFUFQ7CiAJfQogCi0JLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va19zbG93ICovCisJLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va190aHJlc2ggKi8KIAlpbm5lcnByb3RvID0gX19uZl9jdF9sNHByb3RvX2ZpbmQoUEZfSU5FVCwgb3JpZ3R1cGxlLmRzdC5wcm90b251bSk7CiAKIAkvKiBPcmRpbmFyaWx5LCB3ZSdkIGV4cGVjdCB0aGUgaW52ZXJ0ZWQgdHVwbGVwcm90bywgYnV0IGl0J3MKQEAgLTMyNywxNyArMzI3LDYgQEAKIAl9LAogCXsgfQogfTsKLSNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUCi1zdGF0aWMgc3RydWN0IGN0bF90YWJsZSBpY21wX2NvbXBhdF9zeXNjdGxfdGFibGVbXSA9IHsKLQl7Ci0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfaWNtcF90aW1lb3V0IiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsgfQotfTsKLSNlbmRpZiAvKiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUICovCiAjZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLwogCiBzdGF0aWMgaW50IGljbXBfa21lbWR1cF9zeXNjdGxfdGFibGUoc3RydWN0IG5mX3Byb3RvX25ldCAqcG4sCkBAIC0zNTUsNDAgKzM0NCwxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGljbXBfa21lbWR1cF9jb21wYXRfc3lzY3RsX3RhYmxlKHN0cnVjdCBuZl9wcm90b19uZXQgKnBuLAotCQkJCQkgICAgc3RydWN0IG5mX2ljbXBfbmV0ICppbikKLXsKLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0jaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVAotCXBuLT5jdGxfY29tcGF0X3RhYmxlID0ga21lbWR1cChpY21wX2NvbXBhdF9zeXNjdGxfdGFibGUsCi0JCQkJICAgICAgIHNpemVvZihpY21wX2NvbXBhdF9zeXNjdGxfdGFibGUpLAotCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKLQlpZiAoIXBuLT5jdGxfY29tcGF0X3RhYmxlKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBuLT5jdGxfY29tcGF0X3RhYmxlWzBdLmRhdGEgPSAmaW4tPnRpbWVvdXQ7Ci0jZW5kaWYKLSNlbmRpZgotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGljbXBfaW5pdF9uZXQoc3RydWN0IG5ldCAqbmV0LCB1X2ludDE2X3QgcHJvdG8pCiB7Ci0JaW50IHJldDsKIAlzdHJ1Y3QgbmZfaWNtcF9uZXQgKmluID0gaWNtcF9wZXJuZXQobmV0KTsKIAlzdHJ1Y3QgbmZfcHJvdG9fbmV0ICpwbiA9ICZpbi0+cG47CiAKIAlpbi0+dGltZW91dCA9IG5mX2N0X2ljbXBfdGltZW91dDsKIAotCXJldCA9IGljbXBfa21lbWR1cF9jb21wYXRfc3lzY3RsX3RhYmxlKHBuLCBpbik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBpY21wX2ttZW1kdXBfc3lzY3RsX3RhYmxlKHBuLCBpbik7Ci0JaWYgKHJldCA8IDApCi0JCW5mX2N0X2tmcmVlX2NvbXBhdF9zeXNjdGxfdGFibGUocG4pOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gaWNtcF9rbWVtZHVwX3N5c2N0bF90YWJsZShwbiwgaW4pOwogfQogCiBzdGF0aWMgc3RydWN0IG5mX3Byb3RvX25ldCAqaWNtcF9nZXRfbmV0X3Byb3RvKHN0cnVjdCBuZXQgKm5ldCkKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9kdXBfaXB2NC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2R1cF9pcHY0LmMKaW5kZXggY2ViMTg3My4uY2Y5ODZlMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2R1cF9pcHY0LmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2R1cF9pcHY0LmMKQEAgLTc0LDIxICs3NCwxOSBAQAogCW5mX2Nvbm50cmFja19nZXQoc2tiLT5uZmN0KTsKICNlbmRpZgogCS8qCi0JICogSWYgd2UgYXJlIGluIFBSRVJPVVRJTkcvSU5QVVQsIHRoZSBjaGVja3N1bSBtdXN0IGJlIHJlY2FsY3VsYXRlZAotCSAqIHNpbmNlIHRoZSBsZW5ndGggY291bGQgaGF2ZSBjaGFuZ2VkIGFzIGEgcmVzdWx0IG9mIGRlZnJhZ21lbnRhdGlvbi4KLQkgKgotCSAqIFdlIGFsc28gZGVjcmVhc2UgdGhlIFRUTCB0byBtaXRpZ2F0ZSBwb3RlbnRpYWwgbG9vcHMgYmV0d2VlbiB0d28KLQkgKiBob3N0cy4KKwkgKiBJZiB3ZSBhcmUgaW4gUFJFUk9VVElORy9JTlBVVCwgZGVjcmVhc2UgdGhlIFRUTCB0byBtaXRpZ2F0ZSBwb3RlbnRpYWwKKwkgKiBsb29wcyBiZXR3ZWVuIHR3byBob3N0cy4KIAkgKgogCSAqIFNldCAlSVBfREYgc28gdGhhdCB0aGUgb3JpZ2luYWwgc291cmNlIGlzIG5vdGlmaWVkIG9mIGEgcG90ZW50aWFsbHkKIAkgKiBkZWNyZWFzZWQgTVRVIG9uIHRoZSBjbG9uZSByb3V0ZS4gSVB2NiBkb2VzIHRoaXMgdG9vLgorCSAqCisJICogSVAgaGVhZGVyIGNoZWNrc3VtIHdpbGwgYmUgcmVjYWxjdWxhdGVkIGF0IGlwX2xvY2FsX291dC4KIAkgKi8KIAlpcGggPSBpcF9oZHIoc2tiKTsKIAlpcGgtPmZyYWdfb2ZmIHw9IGh0b25zKElQX0RGKTsKIAlpZiAoaG9va251bSA9PSBORl9JTkVUX1BSRV9ST1VUSU5HIHx8CiAJICAgIGhvb2tudW0gPT0gTkZfSU5FVF9MT0NBTF9JTikKIAkJLS1pcGgtPnR0bDsKLQlpcF9zZW5kX2NoZWNrKGlwaCk7CiAKIAlpZiAobmZfZHVwX2lwdjRfcm91dGUobmV0LCBza2IsIGd3LCBvaWYpKSB7CiAJCV9fdGhpc19jcHVfd3JpdGUobmZfc2tiX2R1cGxpY2F0ZWQsIHRydWUpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2xvZ19hcnAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9sb2dfYXJwLmMKaW5kZXggZTdhZDk1MC4uYjI0Nzk1ZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2xvZ19hcnAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbG9nX2FycC5jCkBAIC0zMCw3ICszMCw3IEBACiAJLnUgPSB7CiAJCS5sb2cgPSB7CiAJCQkubGV2ZWwJICA9IExPR0xFVkVMX05PVElDRSwKLQkJCS5sb2dmbGFncyA9IE5GX0xPR19NQVNLLAorCQkJLmxvZ2ZsYWdzID0gTkZfTE9HX0RFRkFVTFRfTUFTSywKIAkJfSwKIAl9LAogfTsKQEAgLTYyLDcgKzYyLDcgQEAKIAkvKiBJZiBpdCdzIGZvciBFdGhlcm5ldCBhbmQgdGhlIGxlbmd0aHMgYXJlIE9LLCB0aGVuIGxvZyB0aGUgQVJQCiAJICogcGF5bG9hZC4KIAkgKi8KLQlpZiAoYWgtPmFyX2hyZCAhPSBodG9ucygxKSB8fAorCWlmIChhaC0+YXJfaHJkICE9IGh0b25zKEFSUEhSRF9FVEhFUikgfHwKIAkgICAgYWgtPmFyX2hsbiAhPSBFVEhfQUxFTiB8fAogCSAgICBhaC0+YXJfcGxuICE9IHNpemVvZihfX2JlMzIpKQogCQlyZXR1cm47CkBAIC0xMTEsOCArMTExLDcgQEAKIAogc3RhdGljIGludCBfX25ldF9pbml0IG5mX2xvZ19hcnBfbmV0X2luaXQoc3RydWN0IG5ldCAqbmV0KQogewotCW5mX2xvZ19zZXQobmV0LCBORlBST1RPX0FSUCwgJm5mX2FycF9sb2dnZXIpOwotCXJldHVybiAwOworCXJldHVybiBuZl9sb2dfc2V0KG5ldCwgTkZQUk9UT19BUlAsICZuZl9hcnBfbG9nZ2VyKTsKIH0KIAogc3RhdGljIHZvaWQgX19uZXRfZXhpdCBuZl9sb2dfYXJwX25ldF9leGl0KHN0cnVjdCBuZXQgKm5ldCkKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9sb2dfaXB2NC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2xvZ19pcHY0LmMKaW5kZXggMDc2YWFkZC4uODU2NjQ4OSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2xvZ19pcHY0LmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2xvZ19pcHY0LmMKQEAgLTI5LDcgKzI5LDcgQEAKIAkudSA9IHsKIAkJLmxvZyA9IHsKIAkJCS5sZXZlbAkgID0gTE9HTEVWRUxfTk9USUNFLAotCQkJLmxvZ2ZsYWdzID0gTkZfTE9HX01BU0ssCisJCQkubG9nZmxhZ3MgPSBORl9MT0dfREVGQVVMVF9NQVNLLAogCQl9LAogCX0sCiB9OwpAQCAtNDYsNyArNDYsNyBAQAogCWlmIChpbmZvLT50eXBlID09IE5GX0xPR19UWVBFX0xPRykKIAkJbG9nZmxhZ3MgPSBpbmZvLT51LmxvZy5sb2dmbGFnczsKIAllbHNlCi0JCWxvZ2ZsYWdzID0gTkZfTE9HX01BU0s7CisJCWxvZ2ZsYWdzID0gTkZfTE9HX0RFRkFVTFRfTUFTSzsKIAogCWloID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBob2ZmLCBzaXplb2YoX2lwaCksICZfaXBoKTsKIAlpZiAoaWggPT0gTlVMTCkgewpAQCAtNzYsNyArNzYsNyBAQAogCWlmIChudG9ocyhpaC0+ZnJhZ19vZmYpICYgSVBfT0ZGU0VUKQogCQluZl9sb2dfYnVmX2FkZChtLCAiRlJBRzoldSAiLCBudG9ocyhpaC0+ZnJhZ19vZmYpICYgSVBfT0ZGU0VUKTsKIAotCWlmICgobG9nZmxhZ3MgJiBYVF9MT0dfSVBPUFQpICYmCisJaWYgKChsb2dmbGFncyAmIE5GX0xPR19JUE9QVCkgJiYKIAkgICAgaWgtPmlobCAqIDQgPiBzaXplb2Yoc3RydWN0IGlwaGRyKSkgewogCQljb25zdCB1bnNpZ25lZCBjaGFyICpvcDsKIAkJdW5zaWduZWQgY2hhciBfb3B0WzQgKiAxNSAtIHNpemVvZihzdHJ1Y3QgaXBoZHIpXTsKQEAgLTI1MCw3ICsyNTAsNyBAQAogCX0KIAogCS8qIE1heCBsZW5ndGg6IDE1ICJVSUQ9NDI5NDk2NzI5NSAiICovCi0JaWYgKChsb2dmbGFncyAmIFhUX0xPR19VSUQpICYmICFpcGhvZmYpCisJaWYgKChsb2dmbGFncyAmIE5GX0xPR19VSUQpICYmICFpcGhvZmYpCiAJCW5mX2xvZ19kdW1wX3NrX3VpZF9naWQobSwgc2tiLT5zayk7CiAKIAkvKiBNYXggbGVuZ3RoOiAxNiAiTUFSSz0weEZGRkZGRkZGICIgKi8KQEAgLTI4Miw3ICsyODIsNyBAQAogCWlmIChpbmZvLT50eXBlID09IE5GX0xPR19UWVBFX0xPRykKIAkJbG9nZmxhZ3MgPSBpbmZvLT51LmxvZy5sb2dmbGFnczsKIAotCWlmICghKGxvZ2ZsYWdzICYgWFRfTE9HX01BQ0RFQ09ERSkpCisJaWYgKCEobG9nZmxhZ3MgJiBORl9MT0dfTUFDREVDT0RFKSkKIAkJZ290byBmYWxsYmFjazsKIAogCXN3aXRjaCAoZGV2LT50eXBlKSB7CkBAIC0zNDcsOCArMzQ3LDcgQEAKIAogc3RhdGljIGludCBfX25ldF9pbml0IG5mX2xvZ19pcHY0X25ldF9pbml0KHN0cnVjdCBuZXQgKm5ldCkKIHsKLQluZl9sb2dfc2V0KG5ldCwgTkZQUk9UT19JUFY0LCAmbmZfaXBfbG9nZ2VyKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gbmZfbG9nX3NldChuZXQsIE5GUFJPVE9fSVBWNCwgJm5mX2lwX2xvZ2dlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fbmV0X2V4aXQgbmZfbG9nX2lwdjRfbmV0X2V4aXQoc3RydWN0IG5ldCAqbmV0KQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b19ncmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fZ3JlLmMKaW5kZXggOTQxNDkyMy4uZWRmMDUwMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b19ncmUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX2dyZS5jCkBAIC04OCw4ICs4OCw4IEBACiAJICAgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCiAJICAgICAgZW51bSBuZl9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUpCiB7Ci0JY29uc3Qgc3RydWN0IGdyZV9oZHIgKmdyZWg7Ci0Jc3RydWN0IGdyZV9oZHJfcHB0cCAqcGdyZWg7CisJY29uc3Qgc3RydWN0IGdyZV9iYXNlX2hkciAqZ3JlaDsKKwlzdHJ1Y3QgcHB0cF9ncmVfaGVhZGVyICpwZ3JlaDsKIAogCS8qIHBncmVoIGluY2x1ZGVzIHR3byBvcHRpb25hbCAzMmJpdCBmaWVsZHMgd2hpY2ggYXJlIG5vdCByZXF1aXJlZAogCSAqIHRvIGJlIHRoZXJlLiAgVGhhdCdzIHdoZXJlIHRoZSBtYWdpYyAnOCcgY29tZXMgZnJvbSAqLwpAQCAtOTcsMTggKzk3LDE5IEBACiAJCXJldHVybiBmYWxzZTsKIAogCWdyZWggPSAodm9pZCAqKXNrYi0+ZGF0YSArIGhkcm9mZjsKLQlwZ3JlaCA9IChzdHJ1Y3QgZ3JlX2hkcl9wcHRwICopZ3JlaDsKKwlwZ3JlaCA9IChzdHJ1Y3QgcHB0cF9ncmVfaGVhZGVyICopZ3JlaDsKIAogCS8qIHdlIG9ubHkgaGF2ZSBkZXN0aW5hdGlvbiBtYW5pcCBvZiBhIHBhY2tldCwgc2luY2UgJ3NvdXJjZSBrZXknCiAJICogaXMgbm90IHByZXNlbnQgaW4gdGhlIHBhY2tldCBpdHNlbGYgKi8KIAlpZiAobWFuaXB0eXBlICE9IE5GX05BVF9NQU5JUF9EU1QpCiAJCXJldHVybiB0cnVlOwotCXN3aXRjaCAoZ3JlaC0+dmVyc2lvbikgewotCWNhc2UgR1JFX1ZFUlNJT05fMTcwMToKKworCXN3aXRjaCAoZ3JlaC0+ZmxhZ3MgJiBHUkVfVkVSU0lPTikgeworCWNhc2UgR1JFX1ZFUlNJT05fMDoKIAkJLyogV2UgZG8gbm90IGN1cnJlbnRseSBOQVQgYW55IEdSRXYwIHBhY2tldHMuCiAJCSAqIFRyeSB0byBiZWhhdmUgbGlrZSAibmZfbmF0X3Byb3RvX3Vua25vd24iICovCiAJCWJyZWFrOwotCWNhc2UgR1JFX1ZFUlNJT05fUFBUUDoKKwljYXNlIEdSRV9WRVJTSU9OXzE6CiAJCXByX2RlYnVnKCJjYWxsX2lkIC0+IDB4JTA0eFxuIiwgbnRvaHModHVwbGUtPmRzdC51LmdyZS5rZXkpKTsKIAkJcGdyZWgtPmNhbGxfaWQgPSB0dXBsZS0+ZHN0LnUuZ3JlLmtleTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfdGFibGVzX2FycC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX3RhYmxlc19hcnAuYwppbmRleCBjZDg0ZDQyLi44MDVjOGRkIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfdGFibGVzX2FycC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl90YWJsZXNfYXJwLmMKQEAgLTIxLDcgKzIxLDcgQEAKIHsKIAlzdHJ1Y3QgbmZ0X3BrdGluZm8gcGt0OwogCi0JbmZ0X3NldF9wa3RpbmZvKCZwa3QsIHNrYiwgc3RhdGUpOworCW5mdF9zZXRfcGt0aW5mb191bnNwZWMoJnBrdCwgc2tiLCBzdGF0ZSk7CiAKIAlyZXR1cm4gbmZ0X2RvX2NoYWluKCZwa3QsIHByaXYpOwogfQpAQCAtODAsNyArODAsMTAgQEAKIHsKIAlpbnQgcmV0OwogCi0JbmZ0X3JlZ2lzdGVyX2NoYWluX3R5cGUoJmZpbHRlcl9hcnApOworCXJldCA9IG5mdF9yZWdpc3Rlcl9jaGFpbl90eXBlKCZmaWx0ZXJfYXJwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwogCXJldCA9IHJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJm5mX3RhYmxlc19hcnBfbmV0X29wcyk7CiAJaWYgKHJldCA8IDApCiAJCW5mdF91bnJlZ2lzdGVyX2NoYWluX3R5cGUoJmZpbHRlcl9hcnApOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX3RhYmxlc19pcHY0LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfdGFibGVzX2lwdjQuYwppbmRleCBlNDRiYTNiLi4yODQwYTI5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfdGFibGVzX2lwdjQuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfdGFibGVzX2lwdjQuYwpAQCAtMTAzLDcgKzEwMywxMCBAQAogewogCWludCByZXQ7CiAKLQluZnRfcmVnaXN0ZXJfY2hhaW5fdHlwZSgmZmlsdGVyX2lwdjQpOworCXJldCA9IG5mdF9yZWdpc3Rlcl9jaGFpbl90eXBlKCZmaWx0ZXJfaXB2NCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKIAlyZXQgPSByZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKCZuZl90YWJsZXNfaXB2NF9uZXRfb3BzKTsKIAlpZiAocmV0IDwgMCkKIAkJbmZ0X3VucmVnaXN0ZXJfY2hhaW5fdHlwZSgmZmlsdGVyX2lwdjQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mdF9jaGFpbl9yb3V0ZV9pcHY0LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZ0X2NoYWluX3JvdXRlX2lwdjQuYwppbmRleCAyMzc1YjBhLi4zMDQ5M2JlIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZ0X2NoYWluX3JvdXRlX2lwdjQuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZ0X2NoYWluX3JvdXRlX2lwdjQuYwpAQCAtMzEsNiArMzEsNyBAQAogCV9fYmUzMiBzYWRkciwgZGFkZHI7CiAJdV9pbnQ4X3QgdG9zOwogCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoOworCWludCBlcnI7CiAKIAkvKiByb290IGlzIHBsYXlpbmcgd2l0aCByYXcgc29ja2V0cy4gKi8KIAlpZiAoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IGlwaGRyKSB8fApAQCAtNDYsMTUgKzQ3LDE3IEBACiAJdG9zID0gaXBoLT50b3M7CiAKIAlyZXQgPSBuZnRfZG9fY2hhaW4oJnBrdCwgcHJpdik7Ci0JaWYgKHJldCAhPSBORl9EUk9QICYmIHJldCAhPSBORl9RVUVVRSkgeworCWlmIChyZXQgIT0gTkZfRFJPUCAmJiByZXQgIT0gTkZfU1RPTEVOKSB7CiAJCWlwaCA9IGlwX2hkcihza2IpOwogCiAJCWlmIChpcGgtPnNhZGRyICE9IHNhZGRyIHx8CiAJCSAgICBpcGgtPmRhZGRyICE9IGRhZGRyIHx8CiAJCSAgICBza2ItPm1hcmsgIT0gbWFyayB8fAotCQkgICAgaXBoLT50b3MgIT0gdG9zKQotCQkJaWYgKGlwX3JvdXRlX21lX2hhcmRlcihzdGF0ZS0+bmV0LCBza2IsIFJUTl9VTlNQRUMpKQotCQkJCXJldCA9IE5GX0RST1A7CisJCSAgICBpcGgtPnRvcyAhPSB0b3MpIHsKKwkJCWVyciA9IGlwX3JvdXRlX21lX2hhcmRlcihzdGF0ZS0+bmV0LCBza2IsIFJUTl9VTlNQRUMpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0ID0gTkZfRFJPUF9FUlIoZXJyKTsKKwkJfQogCX0KIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mdF9yZWplY3RfaXB2NC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mdF9yZWplY3RfaXB2NC5jCmluZGV4IGMyNGY0MWMuLjJjMjU1M2IgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZnRfcmVqZWN0X2lwdjQuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZ0X3JlamVjdF9pcHY0LmMKQEAgLTQ2LDYgKzQ2LDcgQEAKIAkuZXZhbAkJPSBuZnRfcmVqZWN0X2lwdjRfZXZhbCwKIAkuaW5pdAkJPSBuZnRfcmVqZWN0X2luaXQsCiAJLmR1bXAJCT0gbmZ0X3JlamVjdF9kdW1wLAorCS52YWxpZGF0ZQk9IG5mdF9yZWplY3RfdmFsaWRhdGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IG5mdF9leHByX3R5cGUgbmZ0X3JlamVjdF9pcHY0X3R5cGUgX19yZWFkX21vc3RseSA9IHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3Byb2MuYyBiL25ldC9pcHY0L3Byb2MuYwppbmRleCA5ZjY2NWI2Li43MTQzY2ExIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9wcm9jLmMKKysrIGIvbmV0L2lwdjQvcHJvYy5jCkBAIC00Niw2ICs0Niw4IEBACiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvcmF3Lmg+CiAKKyNkZWZpbmUgVENQVURQX01JQl9NQVggbWF4X3QodTMyLCBVRFBfTUlCX01BWCwgVENQX01JQl9NQVgpCisKIC8qCiAgKglSZXBvcnQgc29ja2V0IGFsbG9jYXRpb24gc3RhdGlzdGljcyBbbWVhQHV0dS5maV0KICAqLwpAQCAtMjU3LDYgKzI1OSw3IEBACiAJU05NUF9NSUJfSVRFTSgiVENQU3B1cmlvdXNSVE9zIiwgTElOVVhfTUlCX1RDUFNQVVJJT1VTUlRPUyksCiAJU05NUF9NSUJfSVRFTSgiVENQTUQ1Tm90Rm91bmQiLCBMSU5VWF9NSUJfVENQTUQ1Tk9URk9VTkQpLAogCVNOTVBfTUlCX0lURU0oIlRDUE1ENVVuZXhwZWN0ZWQiLCBMSU5VWF9NSUJfVENQTUQ1VU5FWFBFQ1RFRCksCisJU05NUF9NSUJfSVRFTSgiVENQTUQ1RmFpbHVyZSIsIExJTlVYX01JQl9UQ1BNRDVGQUlMVVJFKSwKIAlTTk1QX01JQl9JVEVNKCJUQ1BTYWNrU2hpZnRlZCIsIExJTlVYX01JQl9TQUNLU0hJRlRFRCksCiAJU05NUF9NSUJfSVRFTSgiVENQU2Fja01lcmdlZCIsIExJTlVYX01JQl9TQUNLTUVSR0VEKSwKIAlTTk1QX01JQl9JVEVNKCJUQ1BTYWNrU2hpZnRGYWxsYmFjayIsIExJTlVYX01JQl9TQUNLU0hJRlRGQUxMQkFDSyksCkBAIC0zNTUsMjIgKzM1OCwyMiBAQAogCWF0b21pY19sb25nX3QgKnB0ciA9IG5ldC0+bWliLmljbXBtc2dfc3RhdGlzdGljcy0+bWliczsKIAogCXNlcV9wdXRzKHNlcSwgIlxuSWNtcDogSW5Nc2dzIEluRXJyb3JzIEluQ3N1bUVycm9ycyIpOwotCWZvciAoaSA9IDA7IGljbXBtaWJtYXBbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisJZm9yIChpID0gMDsgaWNtcG1pYm1hcFtpXS5uYW1lOyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiIEluJXMiLCBpY21wbWlibWFwW2ldLm5hbWUpOwogCXNlcV9wdXRzKHNlcSwgIiBPdXRNc2dzIE91dEVycm9ycyIpOwotCWZvciAoaSA9IDA7IGljbXBtaWJtYXBbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisJZm9yIChpID0gMDsgaWNtcG1pYm1hcFtpXS5uYW1lOyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiIE91dCVzIiwgaWNtcG1pYm1hcFtpXS5uYW1lKTsKIAlzZXFfcHJpbnRmKHNlcSwgIlxuSWNtcDogJWx1ICVsdSAlbHUiLAogCQlzbm1wX2ZvbGRfZmllbGQobmV0LT5taWIuaWNtcF9zdGF0aXN0aWNzLCBJQ01QX01JQl9JTk1TR1MpLAogCQlzbm1wX2ZvbGRfZmllbGQobmV0LT5taWIuaWNtcF9zdGF0aXN0aWNzLCBJQ01QX01JQl9JTkVSUk9SUyksCiAJCXNubXBfZm9sZF9maWVsZChuZXQtPm1pYi5pY21wX3N0YXRpc3RpY3MsIElDTVBfTUlCX0NTVU1FUlJPUlMpKTsKLQlmb3IgKGkgPSAwOyBpY21wbWlibWFwW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorCWZvciAoaSA9IDA7IGljbXBtaWJtYXBbaV0ubmFtZTsgaSsrKQogCQlzZXFfcHJpbnRmKHNlcSwgIiAlbHUiLAogCQkJICAgYXRvbWljX2xvbmdfcmVhZChwdHIgKyBpY21wbWlibWFwW2ldLmluZGV4KSk7CiAJc2VxX3ByaW50ZihzZXEsICIgJWx1ICVsdSIsCiAJCXNubXBfZm9sZF9maWVsZChuZXQtPm1pYi5pY21wX3N0YXRpc3RpY3MsIElDTVBfTUlCX09VVE1TR1MpLAogCQlzbm1wX2ZvbGRfZmllbGQobmV0LT5taWIuaWNtcF9zdGF0aXN0aWNzLCBJQ01QX01JQl9PVVRFUlJPUlMpKTsKLQlmb3IgKGkgPSAwOyBpY21wbWlibWFwW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorCWZvciAoaSA9IDA7IGljbXBtaWJtYXBbaV0ubmFtZTsgaSsrKQogCQlzZXFfcHJpbnRmKHNlcSwgIiAlbHUiLAogCQkJICAgYXRvbWljX2xvbmdfcmVhZChwdHIgKyAoaWNtcG1pYm1hcFtpXS5pbmRleCB8IDB4MTAwKSkpOwogfQpAQCAtMzc4LDE0ICszODEsMTYgQEAKIC8qCiAgKglDYWxsZWQgZnJvbSB0aGUgUFJPQ2ZzIG1vZHVsZS4gVGhpcyBvdXRwdXRzIC9wcm9jL25ldC9zbm1wLgogICovCi1zdGF0aWMgaW50IHNubXBfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCitzdGF0aWMgaW50IHNubXBfc2VxX3Nob3dfaXBzdGF0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKLQlpbnQgaTsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzZXEtPnByaXZhdGU7CisJdTY0IGJ1ZmY2NFtJUFNUQVRTX01JQl9NQVhdOworCWludCBpOworCisJbWVtc2V0KGJ1ZmY2NCwgMCwgSVBTVEFUU19NSUJfTUFYICogc2l6ZW9mKHU2NCkpOwogCiAJc2VxX3B1dHMoc2VxLCAiSXA6IEZvcndhcmRpbmcgRGVmYXVsdFRUTCIpOwotCi0JZm9yIChpID0gMDsgc25tcDRfaXBzdGF0c19saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorCWZvciAoaSA9IDA7IHNubXA0X2lwc3RhdHNfbGlzdFtpXS5uYW1lOyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiICVzIiwgc25tcDRfaXBzdGF0c19saXN0W2ldLm5hbWUpOwogCiAJc2VxX3ByaW50ZihzZXEsICJcbklwOiAlZCAlZCIsCkBAIC0zOTMsNTQgKzM5OCw3NCBAQAogCQkgICBuZXQtPmlwdjQuc3lzY3RsX2lwX2RlZmF1bHRfdHRsKTsKIAogCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgaXBzdGF0c19taWIsIG1pYnMpICE9IDApOwotCWZvciAoaSA9IDA7IHNubXA0X2lwc3RhdHNfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKLQkJc2VxX3ByaW50ZihzZXEsICIgJWxsdSIsCi0JCQkgICBzbm1wX2ZvbGRfZmllbGQ2NChuZXQtPm1pYi5pcF9zdGF0aXN0aWNzLAotCQkJCQkgICAgIHNubXA0X2lwc3RhdHNfbGlzdFtpXS5lbnRyeSwKLQkJCQkJICAgICBvZmZzZXRvZihzdHJ1Y3QgaXBzdGF0c19taWIsIHN5bmNwKSkpOworCXNubXBfZ2V0X2NwdV9maWVsZDY0X2JhdGNoKGJ1ZmY2NCwgc25tcDRfaXBzdGF0c19saXN0LAorCQkJCSAgIG5ldC0+bWliLmlwX3N0YXRpc3RpY3MsCisJCQkJICAgb2Zmc2V0b2Yoc3RydWN0IGlwc3RhdHNfbWliLCBzeW5jcCkpOworCWZvciAoaSA9IDA7IHNubXA0X2lwc3RhdHNfbGlzdFtpXS5uYW1lOyBpKyspCisJCXNlcV9wcmludGYoc2VxLCAiICVsbHUiLCBidWZmNjRbaV0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25tcF9zZXFfc2hvd190Y3BfdWRwKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXVuc2lnbmVkIGxvbmcgYnVmZltUQ1BVRFBfTUlCX01BWF07CisJc3RydWN0IG5ldCAqbmV0ID0gc2VxLT5wcml2YXRlOworCWludCBpOworCisJbWVtc2V0KGJ1ZmYsIDAsIFRDUFVEUF9NSUJfTUFYICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKworCXNlcV9wdXRzKHNlcSwgIlxuVGNwOiIpOworCWZvciAoaSA9IDA7IHNubXA0X3RjcF9saXN0W2ldLm5hbWU7IGkrKykKKwkJc2VxX3ByaW50ZihzZXEsICIgJXMiLCBzbm1wNF90Y3BfbGlzdFtpXS5uYW1lKTsKKworCXNlcV9wdXRzKHNlcSwgIlxuVGNwOiIpOworCXNubXBfZ2V0X2NwdV9maWVsZF9iYXRjaChidWZmLCBzbm1wNF90Y3BfbGlzdCwKKwkJCQkgbmV0LT5taWIudGNwX3N0YXRpc3RpY3MpOworCWZvciAoaSA9IDA7IHNubXA0X3RjcF9saXN0W2ldLm5hbWU7IGkrKykgeworCQkvKiBNYXhDb25uIGZpZWxkIGlzIHNpZ25lZCwgUkZDIDIwMTIgKi8KKwkJaWYgKHNubXA0X3RjcF9saXN0W2ldLmVudHJ5ID09IFRDUF9NSUJfTUFYQ09OTikKKwkJCXNlcV9wcmludGYoc2VxLCAiICVsZCIsIGJ1ZmZbaV0pOworCQllbHNlCisJCQlzZXFfcHJpbnRmKHNlcSwgIiAlbHUiLCBidWZmW2ldKTsKKwl9CisKKwltZW1zZXQoYnVmZiwgMCwgVENQVURQX01JQl9NQVggKiBzaXplb2YodW5zaWduZWQgbG9uZykpOworCisJc25tcF9nZXRfY3B1X2ZpZWxkX2JhdGNoKGJ1ZmYsIHNubXA0X3VkcF9saXN0LAorCQkJCSBuZXQtPm1pYi51ZHBfc3RhdGlzdGljcyk7CisJc2VxX3B1dHMoc2VxLCAiXG5VZHA6Iik7CisJZm9yIChpID0gMDsgc25tcDRfdWRwX2xpc3RbaV0ubmFtZTsgaSsrKQorCQlzZXFfcHJpbnRmKHNlcSwgIiAlcyIsIHNubXA0X3VkcF9saXN0W2ldLm5hbWUpOworCXNlcV9wdXRzKHNlcSwgIlxuVWRwOiIpOworCWZvciAoaSA9IDA7IHNubXA0X3VkcF9saXN0W2ldLm5hbWU7IGkrKykKKwkJc2VxX3ByaW50ZihzZXEsICIgJWx1IiwgYnVmZltpXSk7CisKKwltZW1zZXQoYnVmZiwgMCwgVENQVURQX01JQl9NQVggKiBzaXplb2YodW5zaWduZWQgbG9uZykpOworCisJLyogdGhlIFVEUCBhbmQgVURQLUxpdGUgTUlCcyBhcmUgdGhlIHNhbWUgKi8KKwlzZXFfcHV0cyhzZXEsICJcblVkcExpdGU6Iik7CisJc25tcF9nZXRfY3B1X2ZpZWxkX2JhdGNoKGJ1ZmYsIHNubXA0X3VkcF9saXN0LAorCQkJCSBuZXQtPm1pYi51ZHBsaXRlX3N0YXRpc3RpY3MpOworCWZvciAoaSA9IDA7IHNubXA0X3VkcF9saXN0W2ldLm5hbWU7IGkrKykKKwkJc2VxX3ByaW50ZihzZXEsICIgJXMiLCBzbm1wNF91ZHBfbGlzdFtpXS5uYW1lKTsKKwlzZXFfcHV0cyhzZXEsICJcblVkcExpdGU6Iik7CisJZm9yIChpID0gMDsgc25tcDRfdWRwX2xpc3RbaV0ubmFtZTsgaSsrKQorCQlzZXFfcHJpbnRmKHNlcSwgIiAlbHUiLCBidWZmW2ldKTsKKworCXNlcV9wdXRjKHNlcSwgJ1xuJyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25tcF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzbm1wX3NlcV9zaG93X2lwc3RhdHMoc2VxLCB2KTsKIAogCWljbXBfcHV0KHNlcSk7CS8qIFJGQyAyMDExIGNvbXBhdGliaWxpdHkgKi8KIAlpY21wbXNnX3B1dChzZXEpOwogCi0Jc2VxX3B1dHMoc2VxLCAiXG5UY3A6Iik7Ci0JZm9yIChpID0gMDsgc25tcDRfdGNwX2xpc3RbaV0ubmFtZSAhPSBOVUxMOyBpKyspCi0JCXNlcV9wcmludGYoc2VxLCAiICVzIiwgc25tcDRfdGNwX2xpc3RbaV0ubmFtZSk7CisJc25tcF9zZXFfc2hvd190Y3BfdWRwKHNlcSwgdik7CiAKLQlzZXFfcHV0cyhzZXEsICJcblRjcDoiKTsKLQlmb3IgKGkgPSAwOyBzbm1wNF90Y3BfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykgewotCQkvKiBNYXhDb25uIGZpZWxkIGlzIHNpZ25lZCwgUkZDIDIwMTIgKi8KLQkJaWYgKHNubXA0X3RjcF9saXN0W2ldLmVudHJ5ID09IFRDUF9NSUJfTUFYQ09OTikKLQkJCXNlcV9wcmludGYoc2VxLCAiICVsZCIsCi0JCQkJICAgc25tcF9mb2xkX2ZpZWxkKG5ldC0+bWliLnRjcF9zdGF0aXN0aWNzLAotCQkJCQkJICAgc25tcDRfdGNwX2xpc3RbaV0uZW50cnkpKTsKLQkJZWxzZQotCQkJc2VxX3ByaW50ZihzZXEsICIgJWx1IiwKLQkJCQkgICBzbm1wX2ZvbGRfZmllbGQobmV0LT5taWIudGNwX3N0YXRpc3RpY3MsCi0JCQkJCQkgICBzbm1wNF90Y3BfbGlzdFtpXS5lbnRyeSkpOwotCX0KLQotCXNlcV9wdXRzKHNlcSwgIlxuVWRwOiIpOwotCWZvciAoaSA9IDA7IHNubXA0X3VkcF9saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQotCQlzZXFfcHJpbnRmKHNlcSwgIiAlcyIsIHNubXA0X3VkcF9saXN0W2ldLm5hbWUpOwotCi0Jc2VxX3B1dHMoc2VxLCAiXG5VZHA6Iik7Ci0JZm9yIChpID0gMDsgc25tcDRfdWRwX2xpc3RbaV0ubmFtZSAhPSBOVUxMOyBpKyspCi0JCXNlcV9wcmludGYoc2VxLCAiICVsdSIsCi0JCQkgICBzbm1wX2ZvbGRfZmllbGQobmV0LT5taWIudWRwX3N0YXRpc3RpY3MsCi0JCQkJCSAgIHNubXA0X3VkcF9saXN0W2ldLmVudHJ5KSk7Ci0KLQkvKiB0aGUgVURQIGFuZCBVRFAtTGl0ZSBNSUJzIGFyZSB0aGUgc2FtZSAqLwotCXNlcV9wdXRzKHNlcSwgIlxuVWRwTGl0ZToiKTsKLQlmb3IgKGkgPSAwOyBzbm1wNF91ZHBfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKLQkJc2VxX3ByaW50ZihzZXEsICIgJXMiLCBzbm1wNF91ZHBfbGlzdFtpXS5uYW1lKTsKLQotCXNlcV9wdXRzKHNlcSwgIlxuVWRwTGl0ZToiKTsKLQlmb3IgKGkgPSAwOyBzbm1wNF91ZHBfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKLQkJc2VxX3ByaW50ZihzZXEsICIgJWx1IiwKLQkJCSAgIHNubXBfZm9sZF9maWVsZChuZXQtPm1pYi51ZHBsaXRlX3N0YXRpc3RpY3MsCi0JCQkJCSAgIHNubXA0X3VkcF9saXN0W2ldLmVudHJ5KSk7Ci0KLQlzZXFfcHV0YyhzZXEsICdcbicpOwogCXJldHVybiAwOwogfQogCkBAIC00NjgsMjEgKzQ5MywyMSBAQAogCXN0cnVjdCBuZXQgKm5ldCA9IHNlcS0+cHJpdmF0ZTsKIAogCXNlcV9wdXRzKHNlcSwgIlRjcEV4dDoiKTsKLQlmb3IgKGkgPSAwOyBzbm1wNF9uZXRfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKKwlmb3IgKGkgPSAwOyBzbm1wNF9uZXRfbGlzdFtpXS5uYW1lOyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiICVzIiwgc25tcDRfbmV0X2xpc3RbaV0ubmFtZSk7CiAKIAlzZXFfcHV0cyhzZXEsICJcblRjcEV4dDoiKTsKLQlmb3IgKGkgPSAwOyBzbm1wNF9uZXRfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKKwlmb3IgKGkgPSAwOyBzbm1wNF9uZXRfbGlzdFtpXS5uYW1lOyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiICVsdSIsCiAJCQkgICBzbm1wX2ZvbGRfZmllbGQobmV0LT5taWIubmV0X3N0YXRpc3RpY3MsCiAJCQkJCSAgIHNubXA0X25ldF9saXN0W2ldLmVudHJ5KSk7CiAKIAlzZXFfcHV0cyhzZXEsICJcbklwRXh0OiIpOwotCWZvciAoaSA9IDA7IHNubXA0X2lwZXh0c3RhdHNfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKKwlmb3IgKGkgPSAwOyBzbm1wNF9pcGV4dHN0YXRzX2xpc3RbaV0ubmFtZTsgaSsrKQogCQlzZXFfcHJpbnRmKHNlcSwgIiAlcyIsIHNubXA0X2lwZXh0c3RhdHNfbGlzdFtpXS5uYW1lKTsKIAogCXNlcV9wdXRzKHNlcSwgIlxuSXBFeHQ6Iik7Ci0JZm9yIChpID0gMDsgc25tcDRfaXBleHRzdGF0c19saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorCWZvciAoaSA9IDA7IHNubXA0X2lwZXh0c3RhdHNfbGlzdFtpXS5uYW1lOyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiICVsbHUiLAogCQkJICAgc25tcF9mb2xkX2ZpZWxkNjQobmV0LT5taWIuaXBfc3RhdGlzdGljcywKIAkJCQkJICAgICBzbm1wNF9pcGV4dHN0YXRzX2xpc3RbaV0uZW50cnksCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9yYXcuYyBiL25ldC9pcHY0L3Jhdy5jCmluZGV4IDQzOGY1MGMuLjkwYTg1YzkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3Jhdy5jCisrKyBiL25ldC9pcHY0L3Jhdy5jCkBAIC02MDYsMTIgKzYwNiw2IEBACiAJCQkgICAgKGluZXQtPmhkcmluY2wgPyBGTE9XSV9GTEFHX0tOT1dOX05IIDogMCksCiAJCQkgICBkYWRkciwgc2FkZHIsIDAsIDApOwogCi0JaWYgKCFzYWRkciAmJiBpcGMub2lmKSB7Ci0JCWVyciA9IGwzbWRldl9nZXRfc2FkZHIobmV0LCBpcGMub2lmLCAmZmw0KTsKLQkJaWYgKGVyciA8IDApCi0JCQlnb3RvIGRvbmU7Ci0JfQotCiAJaWYgKCFpbmV0LT5oZHJpbmNsKSB7CiAJCXJmdi5tc2cgPSBtc2c7CiAJCXJmdi5obGVuID0gMDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3JvdXRlLmMgYi9uZXQvaXB2NC9yb3V0ZS5jCmluZGV4IGExZjI4MzAuLmYyYmU2ODkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3JvdXRlLmMKKysrIGIvbmV0L2lwdjQvcm91dGUuYwpAQCAtNDc2LDEyICs0NzYsMTggQEAKIAlhdG9taWNfdCAqcF9pZCA9IGlwX2lkZW50cyArIGhhc2ggJSBJUF9JREVOVFNfU1o7CiAJdTMyIG9sZCA9IEFDQ0VTU19PTkNFKCpwX3RzdGFtcCk7CiAJdTMyIG5vdyA9ICh1MzIpamlmZmllczsKLQl1MzIgZGVsdGEgPSAwOworCXUzMiBuZXcsIGRlbHRhID0gMDsKIAogCWlmIChvbGQgIT0gbm93ICYmIGNtcHhjaGcocF90c3RhbXAsIG9sZCwgbm93KSA9PSBvbGQpCiAJCWRlbHRhID0gcHJhbmRvbV91MzJfbWF4KG5vdyAtIG9sZCk7CiAKLQlyZXR1cm4gYXRvbWljX2FkZF9yZXR1cm4oc2VncyArIGRlbHRhLCBwX2lkKSAtIHNlZ3M7CisJLyogRG8gbm90IHVzZSBhdG9taWNfYWRkX3JldHVybigpIGFzIGl0IG1ha2VzIFVCU0FOIHVuaGFwcHkgKi8KKwlkbyB7CisJCW9sZCA9ICh1MzIpYXRvbWljX3JlYWQocF9pZCk7CisJCW5ldyA9IG9sZCArIGRlbHRhICsgc2VnczsKKwl9IHdoaWxlIChhdG9taWNfY21weGNoZyhwX2lkLCBvbGQsIG5ldykgIT0gb2xkKTsKKworCXJldHVybiBuZXcgLSBzZWdzOwogfQogRVhQT1JUX1NZTUJPTChpcF9pZGVudHNfcmVzZXJ2ZSk7CiAKQEAgLTEyNDYsNyArMTI1Miw5IEBACiAJCQltdHUgPSA1NzY7CiAJfQogCi0JcmV0dXJuIG1pbl90KHVuc2lnbmVkIGludCwgbXR1LCBJUF9NQVhfTVRVKTsKKwltdHUgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIG10dSwgSVBfTUFYX01UVSk7CisKKwlyZXR1cm4gbXR1IC0gbHd0dW5uZWxfaGVhZHJvb20oZHN0LT5sd3RzdGF0ZSwgbXR1KTsKIH0KIAogc3RhdGljIHN0cnVjdCBmaWJfbmhfZXhjZXB0aW9uICpmaW5kX2V4Y2VwdGlvbihzdHJ1Y3QgZmliX25oICpuaCwgX19iZTMyIGRhZGRyKQpAQCAtMTgyOSw3ICsxODM3LDcgQEAKIAkgKglOb3cgd2UgYXJlIHJlYWR5IHRvIHJvdXRlIHBhY2tldC4KIAkgKi8KIAlmbDQuZmxvd2k0X29pZiA9IDA7Ci0JZmw0LmZsb3dpNF9paWYgPSBsM21kZXZfZmliX29pZl9yY3UoZGV2KTsKKwlmbDQuZmxvd2k0X2lpZiA9IGRldi0+aWZpbmRleDsKIAlmbDQuZmxvd2k0X21hcmsgPSBza2ItPm1hcms7CiAJZmw0LmZsb3dpNF90b3MgPSB0b3M7CiAJZmw0LmZsb3dpNF9zY29wZSA9IFJUX1NDT1BFX1VOSVZFUlNFOwpAQCAtMjAxNiw3ICsyMDI0LDkgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKIAlpZiAobGlrZWx5KCFJTl9ERVZfUk9VVEVfTE9DQUxORVQoaW5fZGV2KSkpCi0JCWlmIChpcHY0X2lzX2xvb3BiYWNrKGZsNC0+c2FkZHIpICYmICEoZGV2X291dC0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spKQorCQlpZiAoaXB2NF9pc19sb29wYmFjayhmbDQtPnNhZGRyKSAmJgorCQkgICAgIShkZXZfb3V0LT5mbGFncyAmIElGRl9MT09QQkFDSykgJiYKKwkJICAgICFuZXRpZl9pc19sM19tYXN0ZXIoZGV2X291dCkpCiAJCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAogCWlmIChpcHY0X2lzX2xiY2FzdChmbDQtPmRhZGRyKSkKQEAgLTIxNDYsNyArMjE1Niw2IEBACiAJdW5zaWduZWQgaW50IGZsYWdzID0gMDsKIAlzdHJ1Y3QgZmliX3Jlc3VsdCByZXM7CiAJc3RydWN0IHJ0YWJsZSAqcnRoOwotCWludCBtYXN0ZXJfaWR4OwogCWludCBvcmlnX29pZjsKIAlpbnQgZXJyID0gLUVORVRVTlJFQUNIOwogCkBAIC0yMTU2LDkgKzIxNjUsNiBAQAogCiAJb3JpZ19vaWYgPSBmbDQtPmZsb3dpNF9vaWY7CiAKLQltYXN0ZXJfaWR4ID0gbDNtZGV2X21hc3Rlcl9pZmluZGV4X2J5X2luZGV4KG5ldCwgZmw0LT5mbG93aTRfb2lmKTsKLQlpZiAobWFzdGVyX2lkeCkKLQkJZmw0LT5mbG93aTRfb2lmID0gbWFzdGVyX2lkeDsKIAlmbDQtPmZsb3dpNF9paWYgPSBMT09QQkFDS19JRklOREVYOwogCWZsNC0+Zmxvd2k0X3RvcyA9IHRvcyAmIElQVE9TX1JUX01BU0s7CiAJZmw0LT5mbG93aTRfc2NvcGUgPSAoKHRvcyAmIFJUT19PTkxJTkspID8KQEAgLTIyNDIsMTAgKzIyNDgsNiBAQAogCQkJCWZsNC0+c2FkZHIgPSBpbmV0X3NlbGVjdF9hZGRyKGRldl9vdXQsIDAsCiAJCQkJCQkJICAgICAgUlRfU0NPUEVfSE9TVCk7CiAJCX0KLQotCQlydGggPSBsM21kZXZfZ2V0X3J0YWJsZShkZXZfb3V0LCBmbDQpOwotCQlpZiAocnRoKQotCQkJZ290byBvdXQ7CiAJfQogCiAJaWYgKCFmbDQtPmRhZGRyKSB7CkBAIC0yMjYzLDggKzIyNjUsNyBAQAogCWlmIChlcnIpIHsKIAkJcmVzLmZpID0gTlVMTDsKIAkJcmVzLnRhYmxlID0gTlVMTDsKLQkJaWYgKGZsNC0+Zmxvd2k0X29pZiAmJgotCQkgICAgIW5ldGlmX2luZGV4X2lzX2wzX21hc3RlcihuZXQsIGZsNC0+Zmxvd2k0X29pZikpIHsKKwkJaWYgKGZsNC0+Zmxvd2k0X29pZikgewogCQkJLyogQXBwYXJlbnRseSwgcm91dGluZyB0YWJsZXMgYXJlIHdyb25nLiBBc3N1bWUsCiAJCQkgICB0aGF0IHRoZSBkZXN0aW5hdGlvbiBpcyBvbiBsaW5rLgogCkBAIC0yMzAwLDcgKzIzMDEsOSBAQAogCQkJZWxzZQogCQkJCWZsNC0+c2FkZHIgPSBmbDQtPmRhZGRyOwogCQl9Ci0JCWRldl9vdXQgPSBuZXQtPmxvb3BiYWNrX2RldjsKKworCQkvKiBMMyBtYXN0ZXIgZGV2aWNlIGlzIHRoZSBsb29wYmFjayBmb3IgdGhhdCBkb21haW4gKi8KKwkJZGV2X291dCA9IGwzbWRldl9tYXN0ZXJfZGV2X3JjdShkZXZfb3V0KSA/IDogbmV0LT5sb29wYmFja19kZXY7CiAJCWZsNC0+Zmxvd2k0X29pZiA9IGRldl9vdXQtPmlmaW5kZXg7CiAJCWZsYWdzIHw9IFJUQ0ZfTE9DQUw7CiAJCWdvdG8gbWFrZV9yb3V0ZTsKQEAgLTI0OTcsNyArMjUwMCw4IEBACiAJCSAgICBJUFY0X0RFVkNPTkZfQUxMKG5ldCwgTUNfRk9SV0FSRElORykpIHsKIAkJCWludCBlcnIgPSBpcG1yX2dldF9yb3V0ZShuZXQsIHNrYiwKIAkJCQkJCSBmbDQtPnNhZGRyLCBmbDQtPmRhZGRyLAotCQkJCQkJIHIsIG5vd2FpdCk7CisJCQkJCQkgciwgbm93YWl0LCBwb3J0aWQpOworCiAJCQlpZiAoZXJyIDw9IDApIHsKIAkJCQlpZiAoIW5vd2FpdCkgewogCQkJCQlpZiAoZXJyID09IDApCkBAIC0yNTc1LDkgKzI1NzksNiBAQAogCWZsNC5mbG93aTRfb2lmID0gdGJbUlRBX09JRl0gPyBubGFfZ2V0X3UzMih0YltSVEFfT0lGXSkgOiAwOwogCWZsNC5mbG93aTRfbWFyayA9IG1hcms7CiAKLQlpZiAobmV0aWZfaW5kZXhfaXNfbDNfbWFzdGVyKG5ldCwgZmw0LmZsb3dpNF9vaWYpKQotCQlmbDQuZmxvd2k0X2ZsYWdzID0gRkxPV0lfRkxBR19MM01ERVZfU1JDIHwgRkxPV0lfRkxBR19TS0lQX05IX09JRjsKLQogCWlmIChpaWYpIHsKIAkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwLmMgYi9uZXQvaXB2NC90Y3AuYwppbmRleCAwMzJhOTZkLi5mMjUzZTUwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3AuYworKysgYi9uZXQvaXB2NC90Y3AuYwpAQCAtMzgwLDE0ICszODAsMTQgQEAKIAlzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAKLQlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOworCXRwLT5vdXRfb2Zfb3JkZXJfcXVldWUgPSBSQl9ST09UOwogCXRjcF9pbml0X3htaXRfdGltZXJzKHNrKTsKIAl0Y3BfcHJlcXVldWVfaW5pdCh0cCk7CiAJSU5JVF9MSVNUX0hFQUQoJnRwLT50c3Ffbm9kZSk7CiAKIAlpY3NrLT5pY3NrX3J0byA9IFRDUF9USU1FT1VUX0lOSVQ7CiAJdHAtPm1kZXZfdXMgPSBqaWZmaWVzX3RvX3VzZWNzKFRDUF9USU1FT1VUX0lOSVQpOwotCXRwLT5ydHRfbWluWzBdLnJ0dCA9IH4wVTsKKwltaW5tYXhfcmVzZXQoJnRwLT5ydHRfbWluLCB0Y3BfdGltZV9zdGFtcCwgfjBVKTsKIAogCS8qIFNvIG1hbnkgVENQIGltcGxlbWVudGF0aW9ucyBvdXQgdGhlcmUgKGluY29ycmVjdGx5KSBjb3VudCB0aGUKIAkgKiBpbml0aWFsIFNZTiBmcmFtZSBpbiB0aGVpciBkZWxheWVkLUFDSyBhbmQgY29uZ2VzdGlvbiBjb250cm9sCkBAIC0zOTYsNiArMzk2LDkgQEAKIAkgKi8KIAl0cC0+c25kX2N3bmQgPSBUQ1BfSU5JVF9DV05EOwogCisJLyogVGhlcmUncyBhIGJ1YmJsZSBpbiB0aGUgcGlwZSB1bnRpbCBhdCBsZWFzdCB0aGUgZmlyc3QgQUNLLiAqLworCXRwLT5hcHBfbGltaXRlZCA9IH4wVTsKKwogCS8qIFNlZSBkcmFmdC1zdGV2ZW5zLXRjcGNhLXNwZWMtMDEgZm9yIGRpc2N1c3Npb24gb2YgdGhlCiAJICogaW5pdGlhbGl6YXRpb24gb2YgdGhlc2UgdmFsdWVzLgogCSAqLwpAQCAtMTAxNCwyMyArMTAxNyw0MCBAQAogCQkJCQlmbGFncyk7CiAKIAlsb2NrX3NvY2soc2spOworCisJdGNwX3JhdGVfY2hlY2tfYXBwX2xpbWl0ZWQoc2spOyAgLyogaXMgc2VuZGluZyBhcHBsaWNhdGlvbi1saW1pdGVkPyAqLworCiAJcmVzID0gZG9fdGNwX3NlbmRwYWdlcyhzaywgcGFnZSwgb2Zmc2V0LCBzaXplLCBmbGFncyk7CiAJcmVsZWFzZV9zb2NrKHNrKTsKIAlyZXR1cm4gcmVzOwogfQogRVhQT1JUX1NZTUJPTCh0Y3Bfc2VuZHBhZ2UpOwogCi1zdGF0aWMgaW5saW5lIGludCBzZWxlY3Rfc2l6ZShjb25zdCBzdHJ1Y3Qgc29jayAqc2ssIGJvb2wgc2cpCisvKiBEbyBub3QgYm90aGVyIHVzaW5nIGEgcGFnZSBmcmFnIGZvciB2ZXJ5IHNtYWxsIGZyYW1lcy4KKyAqIEJ1dCB1c2UgdGhpcyBoZXVyaXN0aWMgb25seSBmb3IgdGhlIGZpcnN0IHNrYiBpbiB3cml0ZSBxdWV1ZS4KKyAqCisgKiBIYXZpbmcgbm8gcGF5bG9hZCBpbiBza2ItPmhlYWQgYWxsb3dzIGJldHRlciBTQUNLIHNoaWZ0aW5nCisgKiBpbiB0Y3Bfc2hpZnRfc2tiX2RhdGEoKSwgcmVkdWNpbmcgc2Fjay9yYWNrIG92ZXJoZWFkLCBiZWNhdXNlCisgKiB3cml0ZSBxdWV1ZSBoYXMgbGVzcyBza2JzLgorICogRWFjaCBza2IgY2FuIGhvbGQgdXAgdG8gTUFYX1NLQl9GUkFHUyAqIDMyS2J5dGVzLCBvciB+MC41IE1CLgorICogVGhpcyBhbHNvIHNwZWVkcyB1cCB0c29fZnJhZ21lbnQoKSwgc2luY2UgaXQgd29udCBmYWxsYmFjaworICogdG8gdGNwX2ZyYWdtZW50KCkuCisgKi8KK3N0YXRpYyBpbnQgbGluZWFyX3BheWxvYWRfc3ooYm9vbCBmaXJzdF9za2IpCit7CisJaWYgKGZpcnN0X3NrYikKKwkJcmV0dXJuIFNLQl9XSVRIX09WRVJIRUFEKDIwNDggLSBNQVhfVENQX0hFQURFUik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2VsZWN0X3NpemUoY29uc3Qgc3RydWN0IHNvY2sgKnNrLCBib29sIHNnLCBib29sIGZpcnN0X3NrYikKIHsKIAljb25zdCBzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlpbnQgdG1wID0gdHAtPm1zc19jYWNoZTsKIAogCWlmIChzZykgewogCQlpZiAoc2tfY2FuX2dzbyhzaykpIHsKLQkJCS8qIFNtYWxsIGZyYW1lcyB3b250IHVzZSBhIGZ1bGwgcGFnZToKLQkJCSAqIFBheWxvYWQgd2lsbCBpbW1lZGlhdGVseSBmb2xsb3cgdGNwIGhlYWRlci4KLQkJCSAqLwotCQkJdG1wID0gU0tCX1dJVEhfT1ZFUkhFQUQoMjA0OCAtIE1BWF9UQ1BfSEVBREVSKTsKKwkJCXRtcCA9IGxpbmVhcl9wYXlsb2FkX3N6KGZpcnN0X3NrYik7CiAJCX0gZWxzZSB7CiAJCQlpbnQgcGdicmVhayA9IFNLQl9NQVhfSEVBRChNQVhfVENQX0hFQURFUik7CiAKQEAgLTExMDEsNiArMTEyMSw4IEBACiAKIAl0aW1lbyA9IHNvY2tfc25kdGltZW8oc2ssIGZsYWdzICYgTVNHX0RPTlRXQUlUKTsKIAorCXRjcF9yYXRlX2NoZWNrX2FwcF9saW1pdGVkKHNrKTsgIC8qIGlzIHNlbmRpbmcgYXBwbGljYXRpb24tbGltaXRlZD8gKi8KKwogCS8qIFdhaXQgZm9yIGEgY29ubmVjdGlvbiB0byBmaW5pc2guIE9uZSBleGNlcHRpb24gaXMgVENQIEZhc3QgT3BlbgogCSAqIChwYXNzaXZlIHNpZGUpIHdoZXJlIGRhdGEgaXMgYWxsb3dlZCB0byBiZSBzZW50IGJlZm9yZSBhIGNvbm5lY3Rpb24KIAkgKiBpcyBmdWxseSBlc3RhYmxpc2hlZC4KQEAgLTExNjEsNiArMTE4Myw4IEBACiAJCX0KIAogCQlpZiAoY29weSA8PSAwIHx8ICF0Y3Bfc2tiX2Nhbl9jb2xsYXBzZV90byhza2IpKSB7CisJCQlib29sIGZpcnN0X3NrYjsKKwogbmV3X3NlZ21lbnQ6CiAJCQkvKiBBbGxvY2F0ZSBuZXcgc2VnbWVudC4gSWYgdGhlIGludGVyZmFjZSBpcyBTRywKIAkJCSAqIGFsbG9jYXRlIHNrYiBmaXR0aW5nIHRvIHNpbmdsZSBwYWdlLgpAQCAtMTE3MiwxMCArMTE5NiwxMSBAQAogCQkJCXByb2Nlc3NfYmFja2xvZyA9IGZhbHNlOwogCQkJCWdvdG8gcmVzdGFydDsKIAkJCX0KKwkJCWZpcnN0X3NrYiA9IHNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3dyaXRlX3F1ZXVlKTsKIAkJCXNrYiA9IHNrX3N0cmVhbV9hbGxvY19za2Ioc2ssCi0JCQkJCQkgIHNlbGVjdF9zaXplKHNrLCBzZyksCisJCQkJCQkgIHNlbGVjdF9zaXplKHNrLCBzZywgZmlyc3Rfc2tiKSwKIAkJCQkJCSAgc2stPnNrX2FsbG9jYXRpb24sCi0JCQkJCQkgIHNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3dyaXRlX3F1ZXVlKSk7CisJCQkJCQkgIGZpcnN0X3NrYik7CiAJCQlpZiAoIXNrYikKIAkJCQlnb3RvIHdhaXRfZm9yX21lbW9yeTsKIApAQCAtMTU3MCw2ICsxNTk1LDEyIEBACiB9CiBFWFBPUlRfU1lNQk9MKHRjcF9yZWFkX3NvY2spOwogCitpbnQgdGNwX3BlZWtfbGVuKHN0cnVjdCBzb2NrZXQgKnNvY2spCit7CisJcmV0dXJuIHRjcF9pbnEoc29jay0+c2spOworfQorRVhQT1JUX1NZTUJPTCh0Y3BfcGVla19sZW4pOworCiAvKgogICoJVGhpcyByb3V0aW5lIGNvcGllcyBmcm9tIGEgc29jayBzdHJ1Y3QgaW50byB0aGUgdXNlciBidWZmZXIuCiAgKgpAQCAtMjIzNyw3ICsyMjY4LDcgQEAKIAl0Y3BfY2xlYXJfeG1pdF90aW1lcnMoc2spOwogCV9fc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CiAJdGNwX3dyaXRlX3F1ZXVlX3B1cmdlKHNrKTsKLQlfX3NrYl9xdWV1ZV9wdXJnZSgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CisJc2tiX3JidHJlZV9wdXJnZSgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CiAKIAlpbmV0LT5pbmV0X2Rwb3J0ID0gMDsKIApAQCAtMjY4MSw3ICsyNzEyLDcgQEAKIHsKIAljb25zdCBzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsgLyogaWZmIHNrX3R5cGUgPT0gU09DS19TVFJFQU0gKi8KIAljb25zdCBzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7Ci0JdTMyIG5vdyA9IHRjcF90aW1lX3N0YW1wOworCXUzMiBub3cgPSB0Y3BfdGltZV9zdGFtcCwgaW50djsKIAl1bnNpZ25lZCBpbnQgc3RhcnQ7CiAJaW50IG5vdHNlbnRfYnl0ZXM7CiAJdTY0IHJhdGU2NDsKQEAgLTI3NzEsNiArMjgwMiwxNSBAQAogCWluZm8tPnRjcGlfbWluX3J0dCA9IHRjcF9taW5fcnR0KHRwKTsKIAlpbmZvLT50Y3BpX2RhdGFfc2Vnc19pbiA9IHRwLT5kYXRhX3NlZ3NfaW47CiAJaW5mby0+dGNwaV9kYXRhX3NlZ3Nfb3V0ID0gdHAtPmRhdGFfc2Vnc19vdXQ7CisKKwlpbmZvLT50Y3BpX2RlbGl2ZXJ5X3JhdGVfYXBwX2xpbWl0ZWQgPSB0cC0+cmF0ZV9hcHBfbGltaXRlZCA/IDEgOiAwOworCXJhdGUgPSBSRUFEX09OQ0UodHAtPnJhdGVfZGVsaXZlcmVkKTsKKwlpbnR2ID0gUkVBRF9PTkNFKHRwLT5yYXRlX2ludGVydmFsX3VzKTsKKwlpZiAocmF0ZSAmJiBpbnR2KSB7CisJCXJhdGU2NCA9ICh1NjQpcmF0ZSAqIHRwLT5tc3NfY2FjaGUgKiBVU0VDX1BFUl9TRUM7CisJCWRvX2RpdihyYXRlNjQsIGludHYpOworCQlwdXRfdW5hbGlnbmVkKHJhdGU2NCwgJmluZm8tPnRjcGlfZGVsaXZlcnlfcmF0ZSk7CisJfQogfQogRVhQT1JUX1NZTUJPTF9HUEwodGNwX2dldF9pbmZvKTsKIApAQCAtMzA5MiwyMyArMzEzMiw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKHRjcF9nZXRfbWQ1c2lnX3Bvb2wpOwogCi1pbnQgdGNwX21kNV9oYXNoX2hlYWRlcihzdHJ1Y3QgdGNwX21kNXNpZ19wb29sICpocCwKLQkJCWNvbnN0IHN0cnVjdCB0Y3BoZHIgKnRoKQotewotCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKLQlzdHJ1Y3QgdGNwaGRyIGhkcjsKLQotCS8qIFdlIGFyZSBub3QgYWxsb3dlZCB0byBjaGFuZ2UgdGNwaGRyLCBtYWtlIGEgbG9jYWwgY29weSAqLwotCW1lbWNweSgmaGRyLCB0aCwgc2l6ZW9mKGhkcikpOwotCWhkci5jaGVjayA9IDA7Ci0KLQkvKiBvcHRpb25zIGFyZW4ndCBpbmNsdWRlZCBpbiB0aGUgaGFzaCAqLwotCXNnX2luaXRfb25lKCZzZywgJmhkciwgc2l6ZW9mKGhkcikpOwotCWFoYXNoX3JlcXVlc3Rfc2V0X2NyeXB0KGhwLT5tZDVfcmVxLCAmc2csIE5VTEwsIHNpemVvZihoZHIpKTsKLQlyZXR1cm4gY3J5cHRvX2FoYXNoX3VwZGF0ZShocC0+bWQ1X3JlcSk7Ci19Ci1FWFBPUlRfU1lNQk9MKHRjcF9tZDVfaGFzaF9oZWFkZXIpOwotCiBpbnQgdGNwX21kNV9oYXNoX3NrYl9kYXRhKHN0cnVjdCB0Y3BfbWQ1c2lnX3Bvb2wgKmhwLAogCQkJICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgaGVhZGVyX2xlbikKIHsKQEAgLTMxOTMsNyArMzIxNiw2IEBACiAJCQlsb2NhbF9iaF9lbmFibGUoKTsKIAkJCXJldHVybiAwOwogCQl9Ci0JCXNvY2tfZ2VuX3B1dChzayk7CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKQEAgLTMyMjIsNyArMzI0NCw2IEBACiAJYmhfdW5sb2NrX3NvY2soc2spOwogCWxvY2FsX2JoX2VuYWJsZSgpOwogCXJlbGVhc2Vfc29jayhzayk7Ci0Jc29ja19wdXQoc2spOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodGNwX2Fib3J0KTsKQEAgLTMyNTcsMTEgKzMyNzgsMTIgQEAKIAogdm9pZCBfX2luaXQgdGNwX2luaXQodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGxpbWl0OwogCWludCBtYXhfcnNoYXJlLCBtYXhfd3NoYXJlLCBjbnQ7CisJdW5zaWduZWQgbG9uZyBsaW1pdDsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCXNvY2tfc2tiX2NiX2NoZWNrX3NpemUoc2l6ZW9mKHN0cnVjdCB0Y3Bfc2tiX2NiKSk7CisJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgdGNwX3NrYl9jYikgPgorCQkgICAgIEZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwgY2IpKTsKIAogCXBlcmNwdV9jb3VudGVyX2luaXQoJnRjcF9zb2NrZXRzX2FsbG9jYXRlZCwgMCwgR0ZQX0tFUk5FTCk7CiAJcGVyY3B1X2NvdW50ZXJfaW5pdCgmdGNwX29ycGhhbl9jb3VudCwgMCwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfYmJyLmMgYi9uZXQvaXB2NC90Y3BfYmJyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVhNjZjMgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L3RjcF9iYnIuYwpAQCAtMCwwICsxLDg5NiBAQAorLyogQm90dGxlbmVjayBCYW5kd2lkdGggYW5kIFJUVCAoQkJSKSBjb25nZXN0aW9uIGNvbnRyb2wKKyAqCisgKiBCQlIgY29uZ2VzdGlvbiBjb250cm9sIGNvbXB1dGVzIHRoZSBzZW5kaW5nIHJhdGUgYmFzZWQgb24gdGhlIGRlbGl2ZXJ5CisgKiByYXRlICh0aHJvdWdocHV0KSBlc3RpbWF0ZWQgZnJvbSBBQ0tzLiBJbiBhIG51dHNoZWxsOgorICoKKyAqICAgT24gZWFjaCBBQ0ssIHVwZGF0ZSBvdXIgbW9kZWwgb2YgdGhlIG5ldHdvcmsgcGF0aDoKKyAqICAgICAgYm90dGxlbmVja19iYW5kd2lkdGggPSB3aW5kb3dlZF9tYXgoZGVsaXZlcmVkIC8gZWxhcHNlZCwgMTAgcm91bmQgdHJpcHMpCisgKiAgICAgIG1pbl9ydHQgPSB3aW5kb3dlZF9taW4ocnR0LCAxMCBzZWNvbmRzKQorICogICBwYWNpbmdfcmF0ZSA9IHBhY2luZ19nYWluICogYm90dGxlbmVja19iYW5kd2lkdGgKKyAqICAgY3duZCA9IG1heChjd25kX2dhaW4gKiBib3R0bGVuZWNrX2JhbmR3aWR0aCAqIG1pbl9ydHQsIDQpCisgKgorICogVGhlIGNvcmUgYWxnb3JpdGhtIGRvZXMgbm90IHJlYWN0IGRpcmVjdGx5IHRvIHBhY2tldCBsb3NzZXMgb3IgZGVsYXlzLAorICogYWx0aG91Z2ggQkJSIG1heSBhZGp1c3QgdGhlIHNpemUgb2YgbmV4dCBzZW5kIHBlciBBQ0sgd2hlbiBsb3NzIGlzCisgKiBvYnNlcnZlZCwgb3IgYWRqdXN0IHRoZSBzZW5kaW5nIHJhdGUgaWYgaXQgZXN0aW1hdGVzIHRoZXJlIGlzIGEKKyAqIHRyYWZmaWMgcG9saWNlciwgaW4gb3JkZXIgdG8ga2VlcCB0aGUgZHJvcCByYXRlIHJlYXNvbmFibGUuCisgKgorICogQkJSIGlzIGRlc2NyaWJlZCBpbiBkZXRhaWwgaW46CisgKiAgICJCQlI6IENvbmdlc3Rpb24tQmFzZWQgQ29uZ2VzdGlvbiBDb250cm9sIiwKKyAqICAgTmVhbCBDYXJkd2VsbCwgWXVjaHVuZyBDaGVuZywgQy4gU3RlcGhlbiBHdW5uLCBTb2hlaWwgSGFzc2FzIFllZ2FuZWgsCisgKiAgIFZhbiBKYWNvYnNvbi4gQUNNIFF1ZXVlLCBWb2wuIDE0IE5vLiA1LCBTZXB0ZW1iZXItT2N0b2JlciAyMDE2LgorICoKKyAqIFRoZXJlIGlzIGEgcHVibGljIGUtbWFpbCBsaXN0IGZvciBkaXNjdXNzaW5nIEJCUiBkZXZlbG9wbWVudCBhbmQgdGVzdGluZzoKKyAqICAgaHR0cHM6Ly9ncm91cHMuZ29vZ2xlLmNvbS9mb3J1bS8jIWZvcnVtL2Jici1kZXYKKyAqCisgKiBOT1RFOiBCQlIgKm11c3QqIGJlIHVzZWQgd2l0aCB0aGUgZnEgcWRpc2MgKCJtYW4gdGMtZnEiKSB3aXRoIHBhY2luZyBlbmFibGVkLAorICogc2luY2UgcGFjaW5nIGlzIGludGVncmFsIHRvIHRoZSBCQlIgZGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbi4KKyAqIEJCUiB3aXRob3V0IHBhY2luZyB3b3VsZCBub3QgZnVuY3Rpb24gcHJvcGVybHksIGFuZCBtYXkgaW5jdXIgdW5uZWNlc3NhcnkKKyAqIGhpZ2ggcGFja2V0IGxvc3MgcmF0ZXMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldF9kaWFnLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3dpbl9taW5tYXguaD4KKworLyogU2NhbGUgZmFjdG9yIGZvciByYXRlIGluIHBrdC91U2VjIHVuaXQgdG8gYXZvaWQgdHJ1bmNhdGlvbiBpbiBiYW5kd2lkdGgKKyAqIGVzdGltYXRpb24uIFRoZSByYXRlIHVuaXQgfj0gKDE1MDAgYnl0ZXMgLyAxIHVzZWMgLyAyXjI0KSB+PSA3MTUgYnBzLgorICogVGhpcyBoYW5kbGVzIGJhbmR3aWR0aHMgZnJvbSAwLjA2cHBzICg3MTVicHMpIHRvIDI1Nk1wcHMgKDNUYnBzKSBpbiBhIHUzMi4KKyAqIFNpbmNlIHRoZSBtaW5pbXVtIHdpbmRvdyBpcyA+PTQgcGFja2V0cywgdGhlIGxvd2VyIGJvdW5kIGlzbid0CisgKiBhbiBpc3N1ZS4gVGhlIHVwcGVyIGJvdW5kIGlzbid0IGFuIGlzc3VlIHdpdGggZXhpc3RpbmcgdGVjaG5vbG9naWVzLgorICovCisjZGVmaW5lIEJXX1NDQUxFIDI0CisjZGVmaW5lIEJXX1VOSVQgKDEgPDwgQldfU0NBTEUpCisKKyNkZWZpbmUgQkJSX1NDQUxFIDgJLyogc2NhbGluZyBmYWN0b3IgZm9yIGZyYWN0aW9ucyBpbiBCQlIgKGUuZy4gZ2FpbnMpICovCisjZGVmaW5lIEJCUl9VTklUICgxIDw8IEJCUl9TQ0FMRSkKKworLyogQkJSIGhhcyB0aGUgZm9sbG93aW5nIG1vZGVzIGZvciBkZWNpZGluZyBob3cgZmFzdCB0byBzZW5kOiAqLworZW51bSBiYnJfbW9kZSB7CisJQkJSX1NUQVJUVVAsCS8qIHJhbXAgdXAgc2VuZGluZyByYXRlIHJhcGlkbHkgdG8gZmlsbCBwaXBlICovCisJQkJSX0RSQUlOLAkvKiBkcmFpbiBhbnkgcXVldWUgY3JlYXRlZCBkdXJpbmcgc3RhcnR1cCAqLworCUJCUl9QUk9CRV9CVywJLyogZGlzY292ZXIsIHNoYXJlIGJ3OiBwYWNlIGFyb3VuZCBlc3RpbWF0ZWQgYncgKi8KKwlCQlJfUFJPQkVfUlRULAkvKiBjdXQgY3duZCB0byBtaW4gdG8gcHJvYmUgbWluX3J0dCAqLworfTsKKworLyogQkJSIGNvbmdlc3Rpb24gY29udHJvbCBibG9jayAqLworc3RydWN0IGJiciB7CisJdTMyCW1pbl9ydHRfdXM7CSAgICAgICAgLyogbWluIFJUVCBpbiBtaW5fcnR0X3dpbl9zZWMgd2luZG93ICovCisJdTMyCW1pbl9ydHRfc3RhbXA7CSAgICAgICAgLyogdGltZXN0YW1wIG9mIG1pbl9ydHRfdXMgKi8KKwl1MzIJcHJvYmVfcnR0X2RvbmVfc3RhbXA7ICAgLyogZW5kIHRpbWUgZm9yIEJCUl9QUk9CRV9SVFQgbW9kZSAqLworCXN0cnVjdCBtaW5tYXggYnc7CS8qIE1heCByZWNlbnQgZGVsaXZlcnkgcmF0ZSBpbiBwa3RzL3VTIDw8IDI0ICovCisJdTMyCXJ0dF9jbnQ7CSAgICAvKiBjb3VudCBvZiBwYWNrZXQtdGltZWQgcm91bmRzIGVsYXBzZWQgKi8KKwl1MzIgICAgIG5leHRfcnR0X2RlbGl2ZXJlZDsgLyogc2NiLT50eC5kZWxpdmVyZWQgYXQgZW5kIG9mIHJvdW5kICovCisJc3RydWN0IHNrYl9tc3RhbXAgY3ljbGVfbXN0YW1wOyAgLyogdGltZSBvZiB0aGlzIGN5Y2xlIHBoYXNlIHN0YXJ0ICovCisJdTMyICAgICBtb2RlOjMsCQkgICAgIC8qIGN1cnJlbnQgYmJyX21vZGUgaW4gc3RhdGUgbWFjaGluZSAqLworCQlwcmV2X2NhX3N0YXRlOjMsICAgICAvKiBDQSBzdGF0ZSBvbiBwcmV2aW91cyBBQ0sgKi8KKwkJcGFja2V0X2NvbnNlcnZhdGlvbjoxLCAgLyogdXNlIHBhY2tldCBjb25zZXJ2YXRpb24/ICovCisJCXJlc3RvcmVfY3duZDoxLAkgICAgIC8qIGRlY2lkZWQgdG8gcmV2ZXJ0IGN3bmQgdG8gb2xkIHZhbHVlICovCisJCXJvdW5kX3N0YXJ0OjEsCSAgICAgLyogc3RhcnQgb2YgcGFja2V0LXRpbWVkIHR4LT5hY2sgcm91bmQ/ICovCisJCXRzb19zZWdzX2dvYWw6NywgICAgIC8qIHNlZ21lbnRzIHdlIHdhbnQgaW4gZWFjaCBza2Igd2Ugc2VuZCAqLworCQlpZGxlX3Jlc3RhcnQ6MSwJICAgICAvKiByZXN0YXJ0aW5nIGFmdGVyIGlkbGU/ICovCisJCXByb2JlX3J0dF9yb3VuZF9kb25lOjEsICAvKiBhIEJCUl9QUk9CRV9SVFQgcm91bmQgYXQgNCBwa3RzPyAqLworCQl1bnVzZWQ6NSwKKwkJbHRfaXNfc2FtcGxpbmc6MSwgICAgLyogdGFraW5nIGxvbmctdGVybSAoIkxUIikgc2FtcGxlcyBub3c/ICovCisJCWx0X3J0dF9jbnQ6NywJICAgICAvKiByb3VuZCB0cmlwcyBpbiBsb25nLXRlcm0gaW50ZXJ2YWwgKi8KKwkJbHRfdXNlX2J3OjE7CSAgICAgLyogdXNlIGx0X2J3IGFzIG91ciBidyBlc3RpbWF0ZT8gKi8KKwl1MzIJbHRfYnc7CQkgICAgIC8qIExUIGVzdCBkZWxpdmVyeSByYXRlIGluIHBrdHMvdVMgPDwgMjQgKi8KKwl1MzIJbHRfbGFzdF9kZWxpdmVyZWQ7ICAgLyogTFQgaW50dmwgc3RhcnQ6IHRwLT5kZWxpdmVyZWQgKi8KKwl1MzIJbHRfbGFzdF9zdGFtcDsJICAgICAvKiBMVCBpbnR2bCBzdGFydDogdHAtPmRlbGl2ZXJlZF9tc3RhbXAgKi8KKwl1MzIJbHRfbGFzdF9sb3N0OwkgICAgIC8qIExUIGludHZsIHN0YXJ0OiB0cC0+bG9zdCAqLworCXUzMglwYWNpbmdfZ2FpbjoxMCwJLyogY3VycmVudCBnYWluIGZvciBzZXR0aW5nIHBhY2luZyByYXRlICovCisJCWN3bmRfZ2FpbjoxMCwJLyogY3VycmVudCBnYWluIGZvciBzZXR0aW5nIGN3bmQgKi8KKwkJZnVsbF9id19jbnQ6MywJLyogbnVtYmVyIG9mIHJvdW5kcyB3aXRob3V0IGxhcmdlIGJ3IGdhaW5zICovCisJCWN5Y2xlX2lkeDozLAkvKiBjdXJyZW50IGluZGV4IGluIHBhY2luZ19nYWluIGN5Y2xlIGFycmF5ICovCisJCXVudXNlZF9iOjY7CisJdTMyCXByaW9yX2N3bmQ7CS8qIHByaW9yIGN3bmQgdXBvbiBlbnRlcmluZyBsb3NzIHJlY292ZXJ5ICovCisJdTMyCWZ1bGxfYnc7CS8qIHJlY2VudCBidywgdG8gZXN0aW1hdGUgaWYgcGlwZSBpcyBmdWxsICovCit9OworCisjZGVmaW5lIENZQ0xFX0xFTgk4CS8qIG51bWJlciBvZiBwaGFzZXMgaW4gYSBwYWNpbmcgZ2FpbiBjeWNsZSAqLworCisvKiBXaW5kb3cgbGVuZ3RoIG9mIGJ3IGZpbHRlciAoaW4gcm91bmRzKTogKi8KK3N0YXRpYyBjb25zdCBpbnQgYmJyX2J3X3J0dHMgPSBDWUNMRV9MRU4gKyAyOworLyogV2luZG93IGxlbmd0aCBvZiBtaW5fcnR0IGZpbHRlciAoaW4gc2VjKTogKi8KK3N0YXRpYyBjb25zdCB1MzIgYmJyX21pbl9ydHRfd2luX3NlYyA9IDEwOworLyogTWluaW11bSB0aW1lIChpbiBtcykgc3BlbnQgYXQgYmJyX2N3bmRfbWluX3RhcmdldCBpbiBCQlJfUFJPQkVfUlRUIG1vZGU6ICovCitzdGF0aWMgY29uc3QgdTMyIGJicl9wcm9iZV9ydHRfbW9kZV9tcyA9IDIwMDsKKy8qIFNraXAgVFNPIGJlbG93IHRoZSBmb2xsb3dpbmcgYmFuZHdpZHRoIChiaXRzL3NlYyk6ICovCitzdGF0aWMgY29uc3QgaW50IGJicl9taW5fdHNvX3JhdGUgPSAxMjAwMDAwOworCisvKiBXZSB1c2UgYSBoaWdoX2dhaW4gdmFsdWUgb2YgMi9sbigyKSBiZWNhdXNlIGl0J3MgdGhlIHNtYWxsZXN0IHBhY2luZyBnYWluCisgKiB0aGF0IHdpbGwgYWxsb3cgYSBzbW9vdGhseSBpbmNyZWFzaW5nIHBhY2luZyByYXRlIHRoYXQgd2lsbCBkb3VibGUgZWFjaCBSVFQKKyAqIGFuZCBzZW5kIHRoZSBzYW1lIG51bWJlciBvZiBwYWNrZXRzIHBlciBSVFQgdGhhdCBhbiB1bi1wYWNlZCwgc2xvdy1zdGFydGluZworICogUmVubyBvciBDVUJJQyBmbG93IHdvdWxkOgorICovCitzdGF0aWMgY29uc3QgaW50IGJicl9oaWdoX2dhaW4gID0gQkJSX1VOSVQgKiAyODg1IC8gMTAwMCArIDE7CisvKiBUaGUgcGFjaW5nIGdhaW4gb2YgMS9oaWdoX2dhaW4gaW4gQkJSX0RSQUlOIGlzIGNhbGN1bGF0ZWQgdG8gdHlwaWNhbGx5IGRyYWluCisgKiB0aGUgcXVldWUgY3JlYXRlZCBpbiBCQlJfU1RBUlRVUCBpbiBhIHNpbmdsZSByb3VuZDoKKyAqLworc3RhdGljIGNvbnN0IGludCBiYnJfZHJhaW5fZ2FpbiA9IEJCUl9VTklUICogMTAwMCAvIDI4ODU7CisvKiBUaGUgZ2FpbiBmb3IgZGVyaXZpbmcgc3RlYWR5LXN0YXRlIGN3bmQgdG9sZXJhdGVzIGRlbGF5ZWQvc3RyZXRjaGVkIEFDS3M6ICovCitzdGF0aWMgY29uc3QgaW50IGJicl9jd25kX2dhaW4gID0gQkJSX1VOSVQgKiAyOworLyogVGhlIHBhY2luZ19nYWluIHZhbHVlcyBmb3IgdGhlIFBST0JFX0JXIGdhaW4gY3ljbGUsIHRvIGRpc2NvdmVyL3NoYXJlIGJ3OiAqLworc3RhdGljIGNvbnN0IGludCBiYnJfcGFjaW5nX2dhaW5bXSA9IHsKKwlCQlJfVU5JVCAqIDUgLyA0LAkvKiBwcm9iZSBmb3IgbW9yZSBhdmFpbGFibGUgYncgKi8KKwlCQlJfVU5JVCAqIDMgLyA0LAkvKiBkcmFpbiBxdWV1ZSBhbmQvb3IgeWllbGQgYncgdG8gb3RoZXIgZmxvd3MgKi8KKwlCQlJfVU5JVCwgQkJSX1VOSVQsIEJCUl9VTklULAkvKiBjcnVpc2UgYXQgMS4wKmJ3IHRvIHV0aWxpemUgcGlwZSwgKi8KKwlCQlJfVU5JVCwgQkJSX1VOSVQsIEJCUl9VTklUCS8qIHdpdGhvdXQgY3JlYXRpbmcgZXhjZXNzIHF1ZXVlLi4uICovCit9OworLyogUmFuZG9taXplIHRoZSBzdGFydGluZyBnYWluIGN5Y2xpbmcgcGhhc2Ugb3ZlciBOIHBoYXNlczogKi8KK3N0YXRpYyBjb25zdCB1MzIgYmJyX2N5Y2xlX3JhbmQgPSA3OworCisvKiBUcnkgdG8ga2VlcCBhdCBsZWFzdCB0aGlzIG1hbnkgcGFja2V0cyBpbiBmbGlnaHQsIGlmIHRoaW5ncyBnbyBzbW9vdGhseS4gRm9yCisgKiBzbW9vdGggZnVuY3Rpb25pbmcsIGEgc2xpZGluZyB3aW5kb3cgcHJvdG9jb2wgQUNLaW5nIGV2ZXJ5IG90aGVyIHBhY2tldAorICogbmVlZHMgYXQgbGVhc3QgNCBwYWNrZXRzIGluIGZsaWdodDoKKyAqLworc3RhdGljIGNvbnN0IHUzMiBiYnJfY3duZF9taW5fdGFyZ2V0ID0gNDsKKworLyogVG8gZXN0aW1hdGUgaWYgQkJSX1NUQVJUVVAgbW9kZSAoaS5lLiBoaWdoX2dhaW4pIGhhcyBmaWxsZWQgcGlwZS4uLiAqLworLyogSWYgYncgaGFzIGluY3JlYXNlZCBzaWduaWZpY2FudGx5ICgxLjI1eCksIHRoZXJlIG1heSBiZSBtb3JlIGJ3IGF2YWlsYWJsZTogKi8KK3N0YXRpYyBjb25zdCB1MzIgYmJyX2Z1bGxfYndfdGhyZXNoID0gQkJSX1VOSVQgKiA1IC8gNDsKKy8qIEJ1dCBhZnRlciAzIHJvdW5kcyB3L28gc2lnbmlmaWNhbnQgYncgZ3Jvd3RoLCBlc3RpbWF0ZSBwaXBlIGlzIGZ1bGw6ICovCitzdGF0aWMgY29uc3QgdTMyIGJicl9mdWxsX2J3X2NudCA9IDM7CisKKy8qICJsb25nLXRlcm0iICgiTFQiKSBiYW5kd2lkdGggZXN0aW1hdG9yIHBhcmFtZXRlcnMuLi4gKi8KKy8qIFRoZSBtaW5pbXVtIG51bWJlciBvZiByb3VuZHMgaW4gYW4gTFQgYncgc2FtcGxpbmcgaW50ZXJ2YWw6ICovCitzdGF0aWMgY29uc3QgdTMyIGJicl9sdF9pbnR2bF9taW5fcnR0cyA9IDQ7CisvKiBJZiBsb3N0L2RlbGl2ZXJlZCByYXRpbyA+IDIwJSwgaW50ZXJ2YWwgaXMgImxvc3N5IiBhbmQgd2UgbWF5IGJlIHBvbGljZWQ6ICovCitzdGF0aWMgY29uc3QgdTMyIGJicl9sdF9sb3NzX3RocmVzaCA9IDUwOworLyogSWYgMiBpbnRlcnZhbHMgaGF2ZSBhIGJ3IHJhdGlvIDw9IDEvOCwgdGhlaXIgYncgaXMgImNvbnNpc3RlbnQiOiAqLworc3RhdGljIGNvbnN0IHUzMiBiYnJfbHRfYndfcmF0aW8gPSBCQlJfVU5JVCAvIDg7CisvKiBJZiAyIGludGVydmFscyBoYXZlIGEgYncgZGlmZiA8PSA0IEtiaXQvc2VjIHRoZWlyIGJ3IGlzICJjb25zaXN0ZW50IjogKi8KK3N0YXRpYyBjb25zdCB1MzIgYmJyX2x0X2J3X2RpZmYgPSA0MDAwIC8gODsKKy8qIElmIHdlIGVzdGltYXRlIHdlJ3JlIHBvbGljZWQsIHVzZSBsdF9idyBmb3IgdGhpcyBtYW55IHJvdW5kIHRyaXBzOiAqLworc3RhdGljIGNvbnN0IHUzMiBiYnJfbHRfYndfbWF4X3J0dHMgPSA0ODsKKworLyogRG8gd2UgZXN0aW1hdGUgdGhhdCBTVEFSVFVQIGZpbGxlZCB0aGUgcGlwZT8gKi8KK3N0YXRpYyBib29sIGJicl9mdWxsX2J3X3JlYWNoZWQoY29uc3Qgc3RydWN0IHNvY2sgKnNrKQoreworCWNvbnN0IHN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKworCXJldHVybiBiYnItPmZ1bGxfYndfY250ID49IGJicl9mdWxsX2J3X2NudDsKK30KKworLyogUmV0dXJuIHRoZSB3aW5kb3dlZCBtYXggcmVjZW50IGJhbmR3aWR0aCBzYW1wbGUsIGluIHBrdHMvdVMgPDwgQldfU0NBTEUuICovCitzdGF0aWMgdTMyIGJicl9tYXhfYncoY29uc3Qgc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKworCXJldHVybiBtaW5tYXhfZ2V0KCZiYnItPmJ3KTsKK30KKworLyogUmV0dXJuIHRoZSBlc3RpbWF0ZWQgYmFuZHdpZHRoIG9mIHRoZSBwYXRoLCBpbiBwa3RzL3VTIDw8IEJXX1NDQUxFLiAqLworc3RhdGljIHUzMiBiYnJfYncoY29uc3Qgc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKworCXJldHVybiBiYnItPmx0X3VzZV9idyA/IGJici0+bHRfYncgOiBiYnJfbWF4X2J3KHNrKTsKK30KKworLyogUmV0dXJuIHJhdGUgaW4gYnl0ZXMgcGVyIHNlY29uZCwgb3B0aW9uYWxseSB3aXRoIGEgZ2Fpbi4KKyAqIFRoZSBvcmRlciBoZXJlIGlzIGNob3NlbiBjYXJlZnVsbHkgdG8gYXZvaWQgb3ZlcmZsb3cgb2YgdTY0LiBUaGlzIHNob3VsZAorICogd29yayBmb3IgaW5wdXQgcmF0ZXMgb2YgdXAgdG8gMi45VGJpdC9zZWMgYW5kIGdhaW4gb2YgMi44OXguCisgKi8KK3N0YXRpYyB1NjQgYmJyX3JhdGVfYnl0ZXNfcGVyX3NlYyhzdHJ1Y3Qgc29jayAqc2ssIHU2NCByYXRlLCBpbnQgZ2FpbikKK3sKKwlyYXRlICo9IHRjcF9tc3NfdG9fbXR1KHNrLCB0Y3Bfc2soc2spLT5tc3NfY2FjaGUpOworCXJhdGUgKj0gZ2FpbjsKKwlyYXRlID4+PSBCQlJfU0NBTEU7CisJcmF0ZSAqPSBVU0VDX1BFUl9TRUM7CisJcmV0dXJuIHJhdGUgPj4gQldfU0NBTEU7Cit9CisKKy8qIFBhY2UgdXNpbmcgY3VycmVudCBidyBlc3RpbWF0ZSBhbmQgYSBnYWluIGZhY3Rvci4gSW4gb3JkZXIgdG8gaGVscCBkcml2ZSB0aGUKKyAqIG5ldHdvcmsgdG93YXJkIGxvd2VyIHF1ZXVlcyB3aGlsZSBtYWludGFpbmluZyBoaWdoIHV0aWxpemF0aW9uIGFuZCBsb3cKKyAqIGxhdGVuY3ksIHRoZSBhdmVyYWdlIHBhY2luZyByYXRlIGFpbXMgdG8gYmUgc2xpZ2h0bHkgKH4xJSkgbG93ZXIgdGhhbiB0aGUKKyAqIGVzdGltYXRlZCBiYW5kd2lkdGguIFRoaXMgaXMgYW4gaW1wb3J0YW50IGFzcGVjdCBvZiB0aGUgZGVzaWduLiBJbiB0aGlzCisgKiBpbXBsZW1lbnRhdGlvbiB0aGlzIHNsaWdodGx5IGxvd2VyIHBhY2luZyByYXRlIGlzIGFjaGlldmVkIGltcGxpY2l0bHkgYnkgbm90CisgKiBpbmNsdWRpbmcgbGluay1sYXllciBoZWFkZXJzIGluIHRoZSBwYWNrZXQgc2l6ZSB1c2VkIGZvciB0aGUgcGFjaW5nIHJhdGUuCisgKi8KK3N0YXRpYyB2b2lkIGJicl9zZXRfcGFjaW5nX3JhdGUoc3RydWN0IHNvY2sgKnNrLCB1MzIgYncsIGludCBnYWluKQoreworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKwl1NjQgcmF0ZSA9IGJ3OworCisJcmF0ZSA9IGJicl9yYXRlX2J5dGVzX3Blcl9zZWMoc2ssIHJhdGUsIGdhaW4pOworCXJhdGUgPSBtaW5fdCh1NjQsIHJhdGUsIHNrLT5za19tYXhfcGFjaW5nX3JhdGUpOworCWlmIChiYnItPm1vZGUgIT0gQkJSX1NUQVJUVVAgfHwgcmF0ZSA+IHNrLT5za19wYWNpbmdfcmF0ZSkKKwkJc2stPnNrX3BhY2luZ19yYXRlID0gcmF0ZTsKK30KKworLyogUmV0dXJuIGNvdW50IG9mIHNlZ21lbnRzIHdlIHdhbnQgaW4gdGhlIHNrYnMgd2Ugc2VuZCwgb3IgMCBmb3IgZGVmYXVsdC4gKi8KK3N0YXRpYyB1MzIgYmJyX3Rzb19zZWdzX2dvYWwoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKworCXJldHVybiBiYnItPnRzb19zZWdzX2dvYWw7Cit9CisKK3N0YXRpYyB2b2lkIGJicl9zZXRfdHNvX3NlZ3NfZ29hbChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IGJiciAqYmJyID0gaW5ldF9jc2tfY2Eoc2spOworCXUzMiBtaW5fc2VnczsKKworCW1pbl9zZWdzID0gc2stPnNrX3BhY2luZ19yYXRlIDwgKGJicl9taW5fdHNvX3JhdGUgPj4gMykgPyAxIDogMjsKKwliYnItPnRzb19zZWdzX2dvYWwgPSBtaW4odGNwX3Rzb19hdXRvc2l6ZShzaywgdHAtPm1zc19jYWNoZSwgbWluX3NlZ3MpLAorCQkJCSAweDdGVSk7Cit9CisKKy8qIFNhdmUgImxhc3Qga25vd24gZ29vZCIgY3duZCBzbyB3ZSBjYW4gcmVzdG9yZSBpdCBhZnRlciBsb3NzZXMgb3IgUFJPQkVfUlRUICovCitzdGF0aWMgdm9pZCBiYnJfc2F2ZV9jd25kKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisKKwlpZiAoYmJyLT5wcmV2X2NhX3N0YXRlIDwgVENQX0NBX1JlY292ZXJ5ICYmIGJici0+bW9kZSAhPSBCQlJfUFJPQkVfUlRUKQorCQliYnItPnByaW9yX2N3bmQgPSB0cC0+c25kX2N3bmQ7ICAvKiB0aGlzIGN3bmQgaXMgZ29vZCBlbm91Z2ggKi8KKwllbHNlICAvKiBsb3NzIHJlY292ZXJ5IG9yIEJCUl9QUk9CRV9SVFQgaGF2ZSB0ZW1wb3JhcmlseSBjdXQgY3duZCAqLworCQliYnItPnByaW9yX2N3bmQgPSBtYXgoYmJyLT5wcmlvcl9jd25kLCB0cC0+c25kX2N3bmQpOworfQorCitzdGF0aWMgdm9pZCBiYnJfY3duZF9ldmVudChzdHJ1Y3Qgc29jayAqc2ssIGVudW0gdGNwX2NhX2V2ZW50IGV2ZW50KQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKworCWlmIChldmVudCA9PSBDQV9FVkVOVF9UWF9TVEFSVCAmJiB0cC0+YXBwX2xpbWl0ZWQpIHsKKwkJYmJyLT5pZGxlX3Jlc3RhcnQgPSAxOworCQkvKiBBdm9pZCBwb2ludGxlc3MgYnVmZmVyIG92ZXJmbG93czogcGFjZSBhdCBlc3QuIGJ3IGlmIHdlIGRvbid0CisJCSAqIG5lZWQgbW9yZSBzcGVlZCAod2UncmUgcmVzdGFydGluZyBmcm9tIGlkbGUgYW5kIGFwcC1saW1pdGVkKS4KKwkJICovCisJCWlmIChiYnItPm1vZGUgPT0gQkJSX1BST0JFX0JXKQorCQkJYmJyX3NldF9wYWNpbmdfcmF0ZShzaywgYmJyX2J3KHNrKSwgQkJSX1VOSVQpOworCX0KK30KKworLyogRmluZCB0YXJnZXQgY3duZC4gUmlnaHQtc2l6ZSB0aGUgY3duZCBiYXNlZCBvbiBtaW4gUlRUIGFuZCB0aGUKKyAqIGVzdGltYXRlZCBib3R0bGVuZWNrIGJhbmR3aWR0aDoKKyAqCisgKiBjd25kID0gYncgKiBtaW5fcnR0ICogZ2FpbiA9IEJEUCAqIGdhaW4KKyAqCisgKiBUaGUga2V5IGZhY3RvciwgZ2FpbiwgY29udHJvbHMgdGhlIGFtb3VudCBvZiBxdWV1ZS4gV2hpbGUgYSBzbWFsbCBnYWluCisgKiBidWlsZHMgYSBzbWFsbGVyIHF1ZXVlLCBpdCBiZWNvbWVzIG1vcmUgdnVsbmVyYWJsZSB0byBub2lzZSBpbiBSVFQKKyAqIG1lYXN1cmVtZW50cyAoZS5nLiwgZGVsYXllZCBBQ0tzIG9yIG90aGVyIEFDSyBjb21wcmVzc2lvbiBlZmZlY3RzKS4gVGhpcworICogbm9pc2UgbWF5IGNhdXNlIEJCUiB0byB1bmRlci1lc3RpbWF0ZSB0aGUgcmF0ZS4KKyAqCisgKiBUbyBhY2hpZXZlIGZ1bGwgcGVyZm9ybWFuY2UgaW4gaGlnaC1zcGVlZCBwYXRocywgd2UgYnVkZ2V0IGVub3VnaCBjd25kIHRvCisgKiBmaXQgZnVsbC1zaXplZCBza2JzIGluLWZsaWdodCBvbiBib3RoIGVuZCBob3N0cyB0byBmdWxseSB1dGlsaXplIHRoZSBwYXRoOgorICogICAtIG9uZSBza2IgaW4gc2VuZGluZyBob3N0IFFkaXNjLAorICogICAtIG9uZSBza2IgaW4gc2VuZGluZyBob3N0IFRTTy9HU08gZW5naW5lCisgKiAgIC0gb25lIHNrYiBiZWluZyByZWNlaXZlZCBieSByZWNlaXZlciBob3N0IExSTy9HUk8vZGVsYXllZC1BQ0sgZW5naW5lCisgKiBEb24ndCB3b3JyeSwgYXQgbG93IHJhdGVzIChiYnJfbWluX3Rzb19yYXRlKSB0aGlzIHdvbid0IGJsb2F0IGN3bmQgYmVjYXVzZQorICogaW4gc3VjaCBjYXNlcyB0c29fc2Vnc19nb2FsIGlzIDEuIFRoZSBtaW5pbXVtIGN3bmQgaXMgNCBwYWNrZXRzLAorICogd2hpY2ggYWxsb3dzIDIgb3V0c3RhbmRpbmcgMi1wYWNrZXQgc2VxdWVuY2VzLCB0byB0cnkgdG8ga2VlcCBwaXBlCisgKiBmdWxsIGV2ZW4gd2l0aCBBQ0stZXZlcnktb3RoZXItcGFja2V0IGRlbGF5ZWQgQUNLcy4KKyAqLworc3RhdGljIHUzMiBiYnJfdGFyZ2V0X2N3bmQoc3RydWN0IHNvY2sgKnNrLCB1MzIgYncsIGludCBnYWluKQoreworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKwl1MzIgY3duZDsKKwl1NjQgdzsKKworCS8qIElmIHdlJ3ZlIG5ldmVyIGhhZCBhIHZhbGlkIFJUVCBzYW1wbGUsIGNhcCBjd25kIGF0IHRoZSBpbml0aWFsCisJICogZGVmYXVsdC4gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBub3QgdXNpbmcgVENQCisJICogdGltZXN0YW1wcyBhbmQgaGFzIHJldHJhbnNtaXR0ZWQgYWxsIG9mIHRoZSBTWU4vU1lOQUNLL2RhdGEgcGFja2V0cworCSAqIEFDS2VkIHNvIGZhci4gSW4gdGhpcyBjYXNlLCBhbiBSVE8gY2FuIGN1dCBjd25kIHRvIDEsIGluIHdoaWNoCisJICogY2FzZSB3ZSBuZWVkIHRvIHNsb3ctc3RhcnQgdXAgdG93YXJkIHNvbWV0aGluZyBzYWZlOiBUQ1BfSU5JVF9DV05ELgorCSAqLworCWlmICh1bmxpa2VseShiYnItPm1pbl9ydHRfdXMgPT0gfjBVKSkJIC8qIG5vIHZhbGlkIFJUVCBzYW1wbGVzIHlldD8gKi8KKwkJcmV0dXJuIFRDUF9JTklUX0NXTkQ7ICAvKiBiZSBzYWZlOiBjYXAgYXQgZGVmYXVsdCBpbml0aWFsIGN3bmQqLworCisJdyA9ICh1NjQpYncgKiBiYnItPm1pbl9ydHRfdXM7CisKKwkvKiBBcHBseSBhIGdhaW4gdG8gdGhlIGdpdmVuIHZhbHVlLCB0aGVuIHJlbW92ZSB0aGUgQldfU0NBTEUgc2hpZnQuICovCisJY3duZCA9ICgoKHcgKiBnYWluKSA+PiBCQlJfU0NBTEUpICsgQldfVU5JVCAtIDEpIC8gQldfVU5JVDsKKworCS8qIEFsbG93IGVub3VnaCBmdWxsLXNpemVkIHNrYnMgaW4gZmxpZ2h0IHRvIHV0aWxpemUgZW5kIHN5c3RlbXMuICovCisJY3duZCArPSAzICogYmJyLT50c29fc2Vnc19nb2FsOworCisJLyogUmVkdWNlIGRlbGF5ZWQgQUNLcyBieSByb3VuZGluZyB1cCBjd25kIHRvIHRoZSBuZXh0IGV2ZW4gbnVtYmVyLiAqLworCWN3bmQgPSAoY3duZCArIDEpICYgfjFVOworCisJcmV0dXJuIGN3bmQ7Cit9CisKKy8qIEFuIG9wdGltaXphdGlvbiBpbiBCQlIgdG8gcmVkdWNlIGxvc3NlczogT24gdGhlIGZpcnN0IHJvdW5kIG9mIHJlY292ZXJ5LCB3ZQorICogZm9sbG93IHRoZSBwYWNrZXQgY29uc2VydmF0aW9uIHByaW5jaXBsZTogc2VuZCBQIHBhY2tldHMgcGVyIFAgcGFja2V0cyBhY2tlZC4KKyAqIEFmdGVyIHRoYXQsIHdlIHNsb3ctc3RhcnQgYW5kIHNlbmQgYXQgbW9zdCAyKlAgcGFja2V0cyBwZXIgUCBwYWNrZXRzIGFja2VkLgorICogQWZ0ZXIgcmVjb3ZlcnkgZmluaXNoZXMsIG9yIHVwb24gdW5kbywgd2UgcmVzdG9yZSB0aGUgY3duZCB3ZSBoYWQgd2hlbgorICogcmVjb3Zlcnkgc3RhcnRlZCAoY2FwcGVkIGJ5IHRoZSB0YXJnZXQgY3duZCBiYXNlZCBvbiBlc3RpbWF0ZWQgQkRQKS4KKyAqCisgKiBUT0RPKHljaGVuZy9uY2FyZHdlbGwpOiBpbXBsZW1lbnQgYSByYXRlLWJhc2VkIGFwcHJvYWNoLgorICovCitzdGF0aWMgYm9vbCBiYnJfc2V0X2N3bmRfdG9fcmVjb3Zlcl9vcl9yZXN0b3JlKAorCXN0cnVjdCBzb2NrICpzaywgY29uc3Qgc3RydWN0IHJhdGVfc2FtcGxlICpycywgdTMyIGFja2VkLCB1MzIgKm5ld19jd25kKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKwl1OCBwcmV2X3N0YXRlID0gYmJyLT5wcmV2X2NhX3N0YXRlLCBzdGF0ZSA9IGluZXRfY3NrKHNrKS0+aWNza19jYV9zdGF0ZTsKKwl1MzIgY3duZCA9IHRwLT5zbmRfY3duZDsKKworCS8qIEFuIEFDSyBmb3IgUCBwa3RzIHNob3VsZCByZWxlYXNlIGF0IG1vc3QgMipQIHBhY2tldHMuIFdlIGRvIHRoaXMKKwkgKiBpbiB0d28gc3RlcHMuIEZpcnN0LCBoZXJlIHdlIGRlZHVjdCB0aGUgbnVtYmVyIG9mIGxvc3QgcGFja2V0cy4KKwkgKiBUaGVuLCBpbiBiYnJfc2V0X2N3bmQoKSB3ZSBzbG93IHN0YXJ0IHVwIHRvd2FyZCB0aGUgdGFyZ2V0IGN3bmQuCisJICovCisJaWYgKHJzLT5sb3NzZXMgPiAwKQorCQljd25kID0gbWF4X3QoczMyLCBjd25kIC0gcnMtPmxvc3NlcywgMSk7CisKKwlpZiAoc3RhdGUgPT0gVENQX0NBX1JlY292ZXJ5ICYmIHByZXZfc3RhdGUgIT0gVENQX0NBX1JlY292ZXJ5KSB7CisJCS8qIFN0YXJ0aW5nIDFzdCByb3VuZCBvZiBSZWNvdmVyeSwgc28gZG8gcGFja2V0IGNvbnNlcnZhdGlvbi4gKi8KKwkJYmJyLT5wYWNrZXRfY29uc2VydmF0aW9uID0gMTsKKwkJYmJyLT5uZXh0X3J0dF9kZWxpdmVyZWQgPSB0cC0+ZGVsaXZlcmVkOyAgLyogc3RhcnQgcm91bmQgbm93ICovCisJCS8qIEN1dCB1bnVzZWQgY3duZCBmcm9tIGFwcCBiZWhhdmlvciwgVFNRLCBvciBUU08gZGVmZXJyYWw6ICovCisJCWN3bmQgPSB0Y3BfcGFja2V0c19pbl9mbGlnaHQodHApICsgYWNrZWQ7CisJfSBlbHNlIGlmIChwcmV2X3N0YXRlID49IFRDUF9DQV9SZWNvdmVyeSAmJiBzdGF0ZSA8IFRDUF9DQV9SZWNvdmVyeSkgeworCQkvKiBFeGl0aW5nIGxvc3MgcmVjb3Zlcnk7IHJlc3RvcmUgY3duZCBzYXZlZCBiZWZvcmUgcmVjb3ZlcnkuICovCisJCWJici0+cmVzdG9yZV9jd25kID0gMTsKKwkJYmJyLT5wYWNrZXRfY29uc2VydmF0aW9uID0gMDsKKwl9CisJYmJyLT5wcmV2X2NhX3N0YXRlID0gc3RhdGU7CisKKwlpZiAoYmJyLT5yZXN0b3JlX2N3bmQpIHsKKwkJLyogUmVzdG9yZSBjd25kIGFmdGVyIGV4aXRpbmcgbG9zcyByZWNvdmVyeSBvciBQUk9CRV9SVFQuICovCisJCWN3bmQgPSBtYXgoY3duZCwgYmJyLT5wcmlvcl9jd25kKTsKKwkJYmJyLT5yZXN0b3JlX2N3bmQgPSAwOworCX0KKworCWlmIChiYnItPnBhY2tldF9jb25zZXJ2YXRpb24pIHsKKwkJKm5ld19jd25kID0gbWF4KGN3bmQsIHRjcF9wYWNrZXRzX2luX2ZsaWdodCh0cCkgKyBhY2tlZCk7CisJCXJldHVybiB0cnVlOwkvKiB5ZXMsIHVzaW5nIHBhY2tldCBjb25zZXJ2YXRpb24gKi8KKwl9CisJKm5ld19jd25kID0gY3duZDsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qIFNsb3ctc3RhcnQgdXAgdG93YXJkIHRhcmdldCBjd25kIChpZiBidyBlc3RpbWF0ZSBpcyBncm93aW5nLCBvciBwYWNrZXQgbG9zcworICogaGFzIGRyYXduIHVzIGRvd24gYmVsb3cgdGFyZ2V0KSwgb3Igc25hcCBkb3duIHRvIHRhcmdldCBpZiB3ZSdyZSBhYm92ZSBpdC4KKyAqLworc3RhdGljIHZvaWQgYmJyX3NldF9jd25kKHN0cnVjdCBzb2NrICpzaywgY29uc3Qgc3RydWN0IHJhdGVfc2FtcGxlICpycywKKwkJCSB1MzIgYWNrZWQsIHUzMiBidywgaW50IGdhaW4pCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IGJiciAqYmJyID0gaW5ldF9jc2tfY2Eoc2spOworCXUzMiBjd25kID0gMCwgdGFyZ2V0X2N3bmQgPSAwOworCisJaWYgKCFhY2tlZCkKKwkJcmV0dXJuOworCisJaWYgKGJicl9zZXRfY3duZF90b19yZWNvdmVyX29yX3Jlc3RvcmUoc2ssIHJzLCBhY2tlZCwgJmN3bmQpKQorCQlnb3RvIGRvbmU7CisKKwkvKiBJZiB3ZSdyZSBiZWxvdyB0YXJnZXQgY3duZCwgc2xvdyBzdGFydCBjd25kIHRvd2FyZCB0YXJnZXQgY3duZC4gKi8KKwl0YXJnZXRfY3duZCA9IGJicl90YXJnZXRfY3duZChzaywgYncsIGdhaW4pOworCWlmIChiYnJfZnVsbF9id19yZWFjaGVkKHNrKSkgIC8qIG9ubHkgY3V0IGN3bmQgaWYgd2UgZmlsbGVkIHRoZSBwaXBlICovCisJCWN3bmQgPSBtaW4oY3duZCArIGFja2VkLCB0YXJnZXRfY3duZCk7CisJZWxzZSBpZiAoY3duZCA8IHRhcmdldF9jd25kIHx8IHRwLT5kZWxpdmVyZWQgPCBUQ1BfSU5JVF9DV05EKQorCQljd25kID0gY3duZCArIGFja2VkOworCWN3bmQgPSBtYXgoY3duZCwgYmJyX2N3bmRfbWluX3RhcmdldCk7CisKK2RvbmU6CisJdHAtPnNuZF9jd25kID0gbWluKGN3bmQsIHRwLT5zbmRfY3duZF9jbGFtcCk7CS8qIGFwcGx5IGdsb2JhbCBjYXAgKi8KKwlpZiAoYmJyLT5tb2RlID09IEJCUl9QUk9CRV9SVFQpICAvKiBkcmFpbiBxdWV1ZSwgcmVmcmVzaCBtaW5fcnR0ICovCisJCXRwLT5zbmRfY3duZCA9IG1pbih0cC0+c25kX2N3bmQsIGJicl9jd25kX21pbl90YXJnZXQpOworfQorCisvKiBFbmQgY3ljbGUgcGhhc2UgaWYgaXQncyB0aW1lIGFuZC9vciB3ZSBoaXQgdGhlIHBoYXNlJ3MgaW4tZmxpZ2h0IHRhcmdldC4gKi8KK3N0YXRpYyBib29sIGJicl9pc19uZXh0X2N5Y2xlX3BoYXNlKHN0cnVjdCBzb2NrICpzaywKKwkJCQkgICAgY29uc3Qgc3RydWN0IHJhdGVfc2FtcGxlICpycykKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisJYm9vbCBpc19mdWxsX2xlbmd0aCA9CisJCXNrYl9tc3RhbXBfdXNfZGVsdGEoJnRwLT5kZWxpdmVyZWRfbXN0YW1wLCAmYmJyLT5jeWNsZV9tc3RhbXApID4KKwkJYmJyLT5taW5fcnR0X3VzOworCXUzMiBpbmZsaWdodCwgYnc7CisKKwkvKiBUaGUgcGFjaW5nX2dhaW4gb2YgMS4wIHBhY2VzIGF0IHRoZSBlc3RpbWF0ZWQgYncgdG8gdHJ5IHRvIGZ1bGx5CisJICogdXNlIHRoZSBwaXBlIHdpdGhvdXQgaW5jcmVhc2luZyB0aGUgcXVldWUuCisJICovCisJaWYgKGJici0+cGFjaW5nX2dhaW4gPT0gQkJSX1VOSVQpCisJCXJldHVybiBpc19mdWxsX2xlbmd0aDsJCS8qIGp1c3QgdXNlIHdhbGwgY2xvY2sgdGltZSAqLworCisJaW5mbGlnaHQgPSBycy0+cHJpb3JfaW5fZmxpZ2h0OyAgLyogd2hhdCB3YXMgaW4tZmxpZ2h0IGJlZm9yZSBBQ0s/ICovCisJYncgPSBiYnJfbWF4X2J3KHNrKTsKKworCS8qIEEgcGFjaW5nX2dhaW4gPiAxLjAgcHJvYmVzIGZvciBidyBieSB0cnlpbmcgdG8gcmFpc2UgaW5mbGlnaHQgdG8gYXQKKwkgKiBsZWFzdCBwYWNpbmdfZ2FpbipCRFA7IHRoaXMgbWF5IHRha2UgbW9yZSB0aGFuIG1pbl9ydHQgaWYgbWluX3J0dCBpcworCSAqIHNtYWxsIChlLmcuIG9uIGEgTEFOKS4gV2UgZG8gbm90IHBlcnNpc3QgaWYgcGFja2V0cyBhcmUgbG9zdCwgc2luY2UKKwkgKiBhIHBhdGggd2l0aCBzbWFsbCBidWZmZXJzIG1heSBub3QgaG9sZCB0aGF0IG11Y2guCisJICovCisJaWYgKGJici0+cGFjaW5nX2dhaW4gPiBCQlJfVU5JVCkKKwkJcmV0dXJuIGlzX2Z1bGxfbGVuZ3RoICYmCisJCQkocnMtPmxvc3NlcyB8fCAgLyogcGVyaGFwcyBwYWNpbmdfZ2FpbipCRFAgd29uJ3QgZml0ICovCisJCQkgaW5mbGlnaHQgPj0gYmJyX3RhcmdldF9jd25kKHNrLCBidywgYmJyLT5wYWNpbmdfZ2FpbikpOworCisJLyogQSBwYWNpbmdfZ2FpbiA8IDEuMCB0cmllcyB0byBkcmFpbiBleHRyYSBxdWV1ZSB3ZSBhZGRlZCBpZiBidworCSAqIHByb2JpbmcgZGlkbid0IGZpbmQgbW9yZSBidy4gSWYgaW5mbGlnaHQgZmFsbHMgdG8gbWF0Y2ggQkRQIHRoZW4gd2UKKwkgKiBlc3RpbWF0ZSBxdWV1ZSBpcyBkcmFpbmVkOyBwZXJzaXN0aW5nIHdvdWxkIHVuZGVydXRpbGl6ZSB0aGUgcGlwZS4KKwkgKi8KKwlyZXR1cm4gaXNfZnVsbF9sZW5ndGggfHwKKwkJaW5mbGlnaHQgPD0gYmJyX3RhcmdldF9jd25kKHNrLCBidywgQkJSX1VOSVQpOworfQorCitzdGF0aWMgdm9pZCBiYnJfYWR2YW5jZV9jeWNsZV9waGFzZShzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IGJiciAqYmJyID0gaW5ldF9jc2tfY2Eoc2spOworCisJYmJyLT5jeWNsZV9pZHggPSAoYmJyLT5jeWNsZV9pZHggKyAxKSAmIChDWUNMRV9MRU4gLSAxKTsKKwliYnItPmN5Y2xlX21zdGFtcCA9IHRwLT5kZWxpdmVyZWRfbXN0YW1wOworCWJici0+cGFjaW5nX2dhaW4gPSBiYnJfcGFjaW5nX2dhaW5bYmJyLT5jeWNsZV9pZHhdOworfQorCisvKiBHYWluIGN5Y2xpbmc6IGN5Y2xlIHBhY2luZyBnYWluIHRvIGNvbnZlcmdlIHRvIGZhaXIgc2hhcmUgb2YgYXZhaWxhYmxlIGJ3LiAqLworc3RhdGljIHZvaWQgYmJyX3VwZGF0ZV9jeWNsZV9waGFzZShzdHJ1Y3Qgc29jayAqc2ssCisJCQkJICAgY29uc3Qgc3RydWN0IHJhdGVfc2FtcGxlICpycykKK3sKKwlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisKKwlpZiAoKGJici0+bW9kZSA9PSBCQlJfUFJPQkVfQlcpICYmICFiYnItPmx0X3VzZV9idyAmJgorCSAgICBiYnJfaXNfbmV4dF9jeWNsZV9waGFzZShzaywgcnMpKQorCQliYnJfYWR2YW5jZV9jeWNsZV9waGFzZShzayk7Cit9CisKK3N0YXRpYyB2b2lkIGJicl9yZXNldF9zdGFydHVwX21vZGUoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKworCWJici0+bW9kZSA9IEJCUl9TVEFSVFVQOworCWJici0+cGFjaW5nX2dhaW4gPSBiYnJfaGlnaF9nYWluOworCWJici0+Y3duZF9nYWluCSA9IGJicl9oaWdoX2dhaW47Cit9CisKK3N0YXRpYyB2b2lkIGJicl9yZXNldF9wcm9iZV9id19tb2RlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisKKwliYnItPm1vZGUgPSBCQlJfUFJPQkVfQlc7CisJYmJyLT5wYWNpbmdfZ2FpbiA9IEJCUl9VTklUOworCWJici0+Y3duZF9nYWluID0gYmJyX2N3bmRfZ2FpbjsKKwliYnItPmN5Y2xlX2lkeCA9IENZQ0xFX0xFTiAtIDEgLSBwcmFuZG9tX3UzMl9tYXgoYmJyX2N5Y2xlX3JhbmQpOworCWJicl9hZHZhbmNlX2N5Y2xlX3BoYXNlKHNrKTsJLyogZmxpcCB0byBuZXh0IHBoYXNlIG9mIGdhaW4gY3ljbGUgKi8KK30KKworc3RhdGljIHZvaWQgYmJyX3Jlc2V0X21vZGUoc3RydWN0IHNvY2sgKnNrKQoreworCWlmICghYmJyX2Z1bGxfYndfcmVhY2hlZChzaykpCisJCWJicl9yZXNldF9zdGFydHVwX21vZGUoc2spOworCWVsc2UKKwkJYmJyX3Jlc2V0X3Byb2JlX2J3X21vZGUoc2spOworfQorCisvKiBTdGFydCBhIG5ldyBsb25nLXRlcm0gc2FtcGxpbmcgaW50ZXJ2YWwuICovCitzdGF0aWMgdm9pZCBiYnJfcmVzZXRfbHRfYndfc2FtcGxpbmdfaW50ZXJ2YWwoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKworCWJici0+bHRfbGFzdF9zdGFtcCA9IHRwLT5kZWxpdmVyZWRfbXN0YW1wLnN0YW1wX2ppZmZpZXM7CisJYmJyLT5sdF9sYXN0X2RlbGl2ZXJlZCA9IHRwLT5kZWxpdmVyZWQ7CisJYmJyLT5sdF9sYXN0X2xvc3QgPSB0cC0+bG9zdDsKKwliYnItPmx0X3J0dF9jbnQgPSAwOworfQorCisvKiBDb21wbGV0ZWx5IHJlc2V0IGxvbmctdGVybSBiYW5kd2lkdGggc2FtcGxpbmcuICovCitzdGF0aWMgdm9pZCBiYnJfcmVzZXRfbHRfYndfc2FtcGxpbmcoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKworCWJici0+bHRfYncgPSAwOworCWJici0+bHRfdXNlX2J3ID0gMDsKKwliYnItPmx0X2lzX3NhbXBsaW5nID0gZmFsc2U7CisJYmJyX3Jlc2V0X2x0X2J3X3NhbXBsaW5nX2ludGVydmFsKHNrKTsKK30KKworLyogTG9uZy10ZXJtIGJ3IHNhbXBsaW5nIGludGVydmFsIGlzIGRvbmUuIEVzdGltYXRlIHdoZXRoZXIgd2UncmUgcG9saWNlZC4gKi8KK3N0YXRpYyB2b2lkIGJicl9sdF9id19pbnRlcnZhbF9kb25lKHN0cnVjdCBzb2NrICpzaywgdTMyIGJ3KQoreworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKwl1MzIgZGlmZjsKKworCWlmIChiYnItPmx0X2J3KSB7ICAvKiBkbyB3ZSBoYXZlIGJ3IGZyb20gYSBwcmV2aW91cyBpbnRlcnZhbD8gKi8KKwkJLyogSXMgbmV3IGJ3IGNsb3NlIHRvIHRoZSBsdF9idyBmcm9tIHRoZSBwcmV2aW91cyBpbnRlcnZhbD8gKi8KKwkJZGlmZiA9IGFicyhidyAtIGJici0+bHRfYncpOworCQlpZiAoKGRpZmYgKiBCQlJfVU5JVCA8PSBiYnJfbHRfYndfcmF0aW8gKiBiYnItPmx0X2J3KSB8fAorCQkgICAgKGJicl9yYXRlX2J5dGVzX3Blcl9zZWMoc2ssIGRpZmYsIEJCUl9VTklUKSA8PQorCQkgICAgIGJicl9sdF9id19kaWZmKSkgeworCQkJLyogQWxsIGNyaXRlcmlhIGFyZSBtZXQ7IGVzdGltYXRlIHdlJ3JlIHBvbGljZWQuICovCisJCQliYnItPmx0X2J3ID0gKGJ3ICsgYmJyLT5sdF9idykgPj4gMTsgIC8qIGF2ZyAyIGludHZscyAqLworCQkJYmJyLT5sdF91c2VfYncgPSAxOworCQkJYmJyLT5wYWNpbmdfZ2FpbiA9IEJCUl9VTklUOyAgLyogdHJ5IHRvIGF2b2lkIGRyb3BzICovCisJCQliYnItPmx0X3J0dF9jbnQgPSAwOworCQkJcmV0dXJuOworCQl9CisJfQorCWJici0+bHRfYncgPSBidzsKKwliYnJfcmVzZXRfbHRfYndfc2FtcGxpbmdfaW50ZXJ2YWwoc2spOworfQorCisvKiBUb2tlbi1idWNrZXQgdHJhZmZpYyBwb2xpY2VycyBhcmUgY29tbW9uIChzZWUgIkFuIEludGVybmV0LVdpZGUgQW5hbHlzaXMgb2YKKyAqIFRyYWZmaWMgUG9saWNpbmciLCBTSUdDT01NIDIwMTYpLiBCQlIgZGV0ZWN0cyB0b2tlbi1idWNrZXQgcG9saWNlcnMgYW5kCisgKiBleHBsaWNpdGx5IG1vZGVscyB0aGVpciBwb2xpY2VkIHJhdGUsIHRvIHJlZHVjZSB1bm5lY2Vzc2FyeSBsb3NzZXMuIFdlCisgKiBlc3RpbWF0ZSB0aGF0IHdlJ3JlIHBvbGljZWQgaWYgd2Ugc2VlIDIgY29uc2VjdXRpdmUgc2FtcGxpbmcgaW50ZXJ2YWxzIHdpdGgKKyAqIGNvbnNpc3RlbnQgdGhyb3VnaHB1dCBhbmQgaGlnaCBwYWNrZXQgbG9zcy4gSWYgd2UgdGhpbmsgd2UncmUgYmVpbmcgcG9saWNlZCwKKyAqIHNldCBsdF9idyB0byB0aGUgImxvbmctdGVybSIgYXZlcmFnZSBkZWxpdmVyeSByYXRlIGZyb20gdGhvc2UgMiBpbnRlcnZhbHMuCisgKi8KK3N0YXRpYyB2b2lkIGJicl9sdF9id19zYW1wbGluZyhzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IHN0cnVjdCByYXRlX3NhbXBsZSAqcnMpCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IGJiciAqYmJyID0gaW5ldF9jc2tfY2Eoc2spOworCXUzMiBsb3N0LCBkZWxpdmVyZWQ7CisJdTY0IGJ3OworCXMzMiB0OworCisJaWYgKGJici0+bHRfdXNlX2J3KSB7CS8qIGFscmVhZHkgdXNpbmcgbG9uZy10ZXJtIHJhdGUsIGx0X2J3PyAqLworCQlpZiAoYmJyLT5tb2RlID09IEJCUl9QUk9CRV9CVyAmJiBiYnItPnJvdW5kX3N0YXJ0ICYmCisJCSAgICArK2Jici0+bHRfcnR0X2NudCA+PSBiYnJfbHRfYndfbWF4X3J0dHMpIHsKKwkJCWJicl9yZXNldF9sdF9id19zYW1wbGluZyhzayk7ICAgIC8qIHN0b3AgdXNpbmcgbHRfYncgKi8KKwkJCWJicl9yZXNldF9wcm9iZV9id19tb2RlKHNrKTsgIC8qIHJlc3RhcnQgZ2FpbiBjeWNsaW5nICovCisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qIFdhaXQgZm9yIHRoZSBmaXJzdCBsb3NzIGJlZm9yZSBzYW1wbGluZywgdG8gbGV0IHRoZSBwb2xpY2VyIGV4aGF1c3QKKwkgKiBpdHMgdG9rZW5zIGFuZCBlc3RpbWF0ZSB0aGUgc3RlYWR5LXN0YXRlIHJhdGUgYWxsb3dlZCBieSB0aGUgcG9saWNlci4KKwkgKiBTdGFydGluZyBzYW1wbGVzIGVhcmxpZXIgaW5jbHVkZXMgYnVyc3RzIHRoYXQgb3Zlci1lc3RpbWF0ZSB0aGUgYncuCisJICovCisJaWYgKCFiYnItPmx0X2lzX3NhbXBsaW5nKSB7CisJCWlmICghcnMtPmxvc3NlcykKKwkJCXJldHVybjsKKwkJYmJyX3Jlc2V0X2x0X2J3X3NhbXBsaW5nX2ludGVydmFsKHNrKTsKKwkJYmJyLT5sdF9pc19zYW1wbGluZyA9IHRydWU7CisJfQorCisJLyogVG8gYXZvaWQgdW5kZXJlc3RpbWF0ZXMsIHJlc2V0IHNhbXBsaW5nIGlmIHdlIHJ1biBvdXQgb2YgZGF0YS4gKi8KKwlpZiAocnMtPmlzX2FwcF9saW1pdGVkKSB7CisJCWJicl9yZXNldF9sdF9id19zYW1wbGluZyhzayk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoYmJyLT5yb3VuZF9zdGFydCkKKwkJYmJyLT5sdF9ydHRfY250Kys7CS8qIGNvdW50IHJvdW5kIHRyaXBzIGluIHRoaXMgaW50ZXJ2YWwgKi8KKwlpZiAoYmJyLT5sdF9ydHRfY250IDwgYmJyX2x0X2ludHZsX21pbl9ydHRzKQorCQlyZXR1cm47CQkvKiBzYW1wbGluZyBpbnRlcnZhbCBuZWVkcyB0byBiZSBsb25nZXIgKi8KKwlpZiAoYmJyLT5sdF9ydHRfY250ID4gNCAqIGJicl9sdF9pbnR2bF9taW5fcnR0cykgeworCQliYnJfcmVzZXRfbHRfYndfc2FtcGxpbmcoc2spOyAgLyogaW50ZXJ2YWwgaXMgdG9vIGxvbmcgKi8KKwkJcmV0dXJuOworCX0KKworCS8qIEVuZCBzYW1wbGluZyBpbnRlcnZhbCB3aGVuIGEgcGFja2V0IGlzIGxvc3QsIHNvIHdlIGVzdGltYXRlIHRoZQorCSAqIHBvbGljZXIgdG9rZW5zIHdlcmUgZXhoYXVzdGVkLiBTdG9wcGluZyB0aGUgc2FtcGxpbmcgYmVmb3JlIHRoZQorCSAqIHRva2VucyBhcmUgZXhoYXVzdGVkIHVuZGVyLWVzdGltYXRlcyB0aGUgcG9saWNlZCByYXRlLgorCSAqLworCWlmICghcnMtPmxvc3NlcykKKwkJcmV0dXJuOworCisJLyogQ2FsY3VsYXRlIHBhY2tldHMgbG9zdCBhbmQgZGVsaXZlcmVkIGluIHNhbXBsaW5nIGludGVydmFsLiAqLworCWxvc3QgPSB0cC0+bG9zdCAtIGJici0+bHRfbGFzdF9sb3N0OworCWRlbGl2ZXJlZCA9IHRwLT5kZWxpdmVyZWQgLSBiYnItPmx0X2xhc3RfZGVsaXZlcmVkOworCS8qIElzIGxvc3MgcmF0ZSAobG9zdC9kZWxpdmVyZWQpID49IGx0X2xvc3NfdGhyZXNoPyBJZiBub3QsIHdhaXQuICovCisJaWYgKCFkZWxpdmVyZWQgfHwgKGxvc3QgPDwgQkJSX1NDQUxFKSA8IGJicl9sdF9sb3NzX3RocmVzaCAqIGRlbGl2ZXJlZCkKKwkJcmV0dXJuOworCisJLyogRmluZCBhdmVyYWdlIGRlbGl2ZXJ5IHJhdGUgaW4gdGhpcyBzYW1wbGluZyBpbnRlcnZhbC4gKi8KKwl0ID0gKHMzMikodHAtPmRlbGl2ZXJlZF9tc3RhbXAuc3RhbXBfamlmZmllcyAtIGJici0+bHRfbGFzdF9zdGFtcCk7CisJaWYgKHQgPCAxKQorCQlyZXR1cm47CQkvKiBpbnRlcnZhbCBpcyBsZXNzIHRoYW4gb25lIGppZmZ5LCBzbyB3YWl0ICovCisJdCA9IGppZmZpZXNfdG9fdXNlY3ModCk7CisJLyogSW50ZXJ2YWwgbG9uZyBlbm91Z2ggZm9yIGppZmZpZXNfdG9fdXNlY3MoKSB0byByZXR1cm4gYSBib2d1cyAwPyAqLworCWlmICh0IDwgMSkgeworCQliYnJfcmVzZXRfbHRfYndfc2FtcGxpbmcoc2spOyAgLyogaW50ZXJ2YWwgdG9vIGxvbmc7IHJlc2V0ICovCisJCXJldHVybjsKKwl9CisJYncgPSAodTY0KWRlbGl2ZXJlZCAqIEJXX1VOSVQ7CisJZG9fZGl2KGJ3LCB0KTsKKwliYnJfbHRfYndfaW50ZXJ2YWxfZG9uZShzaywgYncpOworfQorCisvKiBFc3RpbWF0ZSB0aGUgYmFuZHdpZHRoIGJhc2VkIG9uIGhvdyBmYXN0IHBhY2tldHMgYXJlIGRlbGl2ZXJlZCAqLworc3RhdGljIHZvaWQgYmJyX3VwZGF0ZV9idyhzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IHN0cnVjdCByYXRlX3NhbXBsZSAqcnMpCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IGJiciAqYmJyID0gaW5ldF9jc2tfY2Eoc2spOworCXU2NCBidzsKKworCWJici0+cm91bmRfc3RhcnQgPSAwOworCWlmIChycy0+ZGVsaXZlcmVkIDwgMCB8fCBycy0+aW50ZXJ2YWxfdXMgPD0gMCkKKwkJcmV0dXJuOyAvKiBOb3QgYSB2YWxpZCBvYnNlcnZhdGlvbiAqLworCisJLyogU2VlIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlIG5leHQgUlRUICovCisJaWYgKCFiZWZvcmUocnMtPnByaW9yX2RlbGl2ZXJlZCwgYmJyLT5uZXh0X3J0dF9kZWxpdmVyZWQpKSB7CisJCWJici0+bmV4dF9ydHRfZGVsaXZlcmVkID0gdHAtPmRlbGl2ZXJlZDsKKwkJYmJyLT5ydHRfY250Kys7CisJCWJici0+cm91bmRfc3RhcnQgPSAxOworCQliYnItPnBhY2tldF9jb25zZXJ2YXRpb24gPSAwOworCX0KKworCWJicl9sdF9id19zYW1wbGluZyhzaywgcnMpOworCisJLyogRGl2aWRlIGRlbGl2ZXJlZCBieSB0aGUgaW50ZXJ2YWwgdG8gZmluZCBhIChsb3dlciBib3VuZCkgYm90dGxlbmVjaworCSAqIGJhbmR3aWR0aCBzYW1wbGUuIERlbGl2ZXJlZCBpcyBpbiBwYWNrZXRzIGFuZCBpbnRlcnZhbF91cyBpbiB1UyBhbmQKKwkgKiByYXRpbyB3aWxsIGJlIDw8MSBmb3IgbW9zdCBjb25uZWN0aW9ucy4gU28gZGVsaXZlcmVkIGlzIGZpcnN0IHNjYWxlZC4KKwkgKi8KKwlidyA9ICh1NjQpcnMtPmRlbGl2ZXJlZCAqIEJXX1VOSVQ7CisJZG9fZGl2KGJ3LCBycy0+aW50ZXJ2YWxfdXMpOworCisJLyogSWYgdGhpcyBzYW1wbGUgaXMgYXBwbGljYXRpb24tbGltaXRlZCwgaXQgaXMgbGlrZWx5IHRvIGhhdmUgYSB2ZXJ5CisJICogbG93IGRlbGl2ZXJlZCBjb3VudCB0aGF0IHJlcHJlc2VudHMgYXBwbGljYXRpb24gYmVoYXZpb3IgcmF0aGVyIHRoYW4KKwkgKiB0aGUgYXZhaWxhYmxlIG5ldHdvcmsgcmF0ZS4gU3VjaCBhIHNhbXBsZSBjb3VsZCBkcmFnIGRvd24gZXN0aW1hdGVkCisJICogYncsIGNhdXNpbmcgbmVlZGxlc3Mgc2xvdy1kb3duLiBUaHVzLCB0byBjb250aW51ZSB0byBzZW5kIGF0IHRoZQorCSAqIGxhc3QgbWVhc3VyZWQgbmV0d29yayByYXRlLCB3ZSBmaWx0ZXIgb3V0IGFwcC1saW1pdGVkIHNhbXBsZXMgdW5sZXNzCisJICogdGhleSBkZXNjcmliZSB0aGUgcGF0aCBidyBhdCBsZWFzdCBhcyB3ZWxsIGFzIG91ciBidyBtb2RlbC4KKwkgKgorCSAqIFNvIHRoZSBnb2FsIGR1cmluZyBhcHAtbGltaXRlZCBwaGFzZSBpcyB0byBwcm9jZWVkIHdpdGggdGhlIGJlc3QKKwkgKiBuZXR3b3JrIHJhdGUgbm8gbWF0dGVyIGhvdyBsb25nLiBXZSBhdXRvbWF0aWNhbGx5IGxlYXZlIHRoaXMKKwkgKiBwaGFzZSB3aGVuIGFwcCB3cml0ZXMgZmFzdGVyIHRoYW4gdGhlIG5ldHdvcmsgY2FuIGRlbGl2ZXIgOikKKwkgKi8KKwlpZiAoIXJzLT5pc19hcHBfbGltaXRlZCB8fCBidyA+PSBiYnJfbWF4X2J3KHNrKSkgeworCQkvKiBJbmNvcnBvcmF0ZSBuZXcgc2FtcGxlIGludG8gb3VyIG1heCBidyBmaWx0ZXIuICovCisJCW1pbm1heF9ydW5uaW5nX21heCgmYmJyLT5idywgYmJyX2J3X3J0dHMsIGJici0+cnR0X2NudCwgYncpOworCX0KK30KKworLyogRXN0aW1hdGUgd2hlbiB0aGUgcGlwZSBpcyBmdWxsLCB1c2luZyB0aGUgY2hhbmdlIGluIGRlbGl2ZXJ5IHJhdGU6IEJCUgorICogZXN0aW1hdGVzIHRoYXQgU1RBUlRVUCBmaWxsZWQgdGhlIHBpcGUgaWYgdGhlIGVzdGltYXRlZCBidyBoYXNuJ3QgY2hhbmdlZCBieQorICogYXQgbGVhc3QgYmJyX2Z1bGxfYndfdGhyZXNoICgyNSUpIGFmdGVyIGJicl9mdWxsX2J3X2NudCAoMykgbm9uLWFwcC1saW1pdGVkCisgKiByb3VuZHMuIFdoeSAzIHJvdW5kczogMTogcndpbiBhdXRvdHVuaW5nIGdyb3dzIHRoZSByd2luLCAyOiB3ZSBmaWxsIHRoZQorICogaGlnaGVyIHJ3aW4sIDM6IHdlIGdldCBoaWdoZXIgZGVsaXZlcnkgcmF0ZSBzYW1wbGVzLiBPciB0cmFuc2llbnQKKyAqIGNyb3NzLXRyYWZmaWMgb3IgcmFkaW8gbm9pc2UgY2FuIGdvIGF3YXkuIENVQklDIEh5c3RhcnQgc2hhcmVzIGEgc2ltaWxhcgorICogZGVzaWduIGdvYWwsIGJ1dCB1c2VzIGRlbGF5IGFuZCBpbnRlci1BQ0sgc3BhY2luZyBpbnN0ZWFkIG9mIGJhbmR3aWR0aC4KKyAqLworc3RhdGljIHZvaWQgYmJyX2NoZWNrX2Z1bGxfYndfcmVhY2hlZChzdHJ1Y3Qgc29jayAqc2ssCisJCQkJICAgICAgY29uc3Qgc3RydWN0IHJhdGVfc2FtcGxlICpycykKK3sKKwlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisJdTMyIGJ3X3RocmVzaDsKKworCWlmIChiYnJfZnVsbF9id19yZWFjaGVkKHNrKSB8fCAhYmJyLT5yb3VuZF9zdGFydCB8fCBycy0+aXNfYXBwX2xpbWl0ZWQpCisJCXJldHVybjsKKworCWJ3X3RocmVzaCA9ICh1NjQpYmJyLT5mdWxsX2J3ICogYmJyX2Z1bGxfYndfdGhyZXNoID4+IEJCUl9TQ0FMRTsKKwlpZiAoYmJyX21heF9idyhzaykgPj0gYndfdGhyZXNoKSB7CisJCWJici0+ZnVsbF9idyA9IGJicl9tYXhfYncoc2spOworCQliYnItPmZ1bGxfYndfY250ID0gMDsKKwkJcmV0dXJuOworCX0KKwkrK2Jici0+ZnVsbF9id19jbnQ7Cit9CisKKy8qIElmIHBpcGUgaXMgcHJvYmFibHkgZnVsbCwgZHJhaW4gdGhlIHF1ZXVlIGFuZCB0aGVuIGVudGVyIHN0ZWFkeS1zdGF0ZS4gKi8KK3N0YXRpYyB2b2lkIGJicl9jaGVja19kcmFpbihzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IHN0cnVjdCByYXRlX3NhbXBsZSAqcnMpCit7CisJc3RydWN0IGJiciAqYmJyID0gaW5ldF9jc2tfY2Eoc2spOworCisJaWYgKGJici0+bW9kZSA9PSBCQlJfU1RBUlRVUCAmJiBiYnJfZnVsbF9id19yZWFjaGVkKHNrKSkgeworCQliYnItPm1vZGUgPSBCQlJfRFJBSU47CS8qIGRyYWluIHF1ZXVlIHdlIGNyZWF0ZWQgKi8KKwkJYmJyLT5wYWNpbmdfZ2FpbiA9IGJicl9kcmFpbl9nYWluOwkvKiBwYWNlIHNsb3cgdG8gZHJhaW4gKi8KKwkJYmJyLT5jd25kX2dhaW4gPSBiYnJfaGlnaF9nYWluOwkvKiBtYWludGFpbiBjd25kICovCisJfQkvKiBmYWxsIHRocm91Z2ggdG8gY2hlY2sgaWYgaW4tZmxpZ2h0IGlzIGFscmVhZHkgc21hbGw6ICovCisJaWYgKGJici0+bW9kZSA9PSBCQlJfRFJBSU4gJiYKKwkgICAgdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRjcF9zayhzaykpIDw9CisJICAgIGJicl90YXJnZXRfY3duZChzaywgYmJyX21heF9idyhzayksIEJCUl9VTklUKSkKKwkJYmJyX3Jlc2V0X3Byb2JlX2J3X21vZGUoc2spOyAgLyogd2UgZXN0aW1hdGUgcXVldWUgaXMgZHJhaW5lZCAqLworfQorCisvKiBUaGUgZ29hbCBvZiBQUk9CRV9SVFQgbW9kZSBpcyB0byBoYXZlIEJCUiBmbG93cyBjb29wZXJhdGl2ZWx5IGFuZAorICogcGVyaW9kaWNhbGx5IGRyYWluIHRoZSBib3R0bGVuZWNrIHF1ZXVlLCB0byBjb252ZXJnZSB0byBtZWFzdXJlIHRoZSB0cnVlCisgKiBtaW5fcnR0ICh1bmxvYWRlZCBwcm9wYWdhdGlvbiBkZWxheSkuIFRoaXMgYWxsb3dzIHRoZSBmbG93cyB0byBrZWVwIHF1ZXVlcworICogc21hbGwgKHJlZHVjaW5nIHF1ZXVpbmcgZGVsYXkgYW5kIHBhY2tldCBsb3NzKSBhbmQgYWNoaWV2ZSBmYWlybmVzcyBhbW9uZworICogQkJSIGZsb3dzLgorICoKKyAqIFRoZSBtaW5fcnR0IGZpbHRlciB3aW5kb3cgaXMgMTAgc2Vjb25kcy4gV2hlbiB0aGUgbWluX3J0dCBlc3RpbWF0ZSBleHBpcmVzLAorICogd2UgZW50ZXIgUFJPQkVfUlRUIG1vZGUgYW5kIGNhcCB0aGUgY3duZCBhdCBiYnJfY3duZF9taW5fdGFyZ2V0PTQgcGFja2V0cy4KKyAqIEFmdGVyIGF0IGxlYXN0IGJicl9wcm9iZV9ydHRfbW9kZV9tcz0yMDBtcyBhbmQgYXQgbGVhc3Qgb25lIHBhY2tldC10aW1lZAorICogcm91bmQgdHJpcCBlbGFwc2VkIHdpdGggdGhhdCBmbGlnaHQgc2l6ZSA8PSA0LCB3ZSBsZWF2ZSBQUk9CRV9SVFQgbW9kZSBhbmQKKyAqIHJlLWVudGVyIHRoZSBwcmV2aW91cyBtb2RlLiBCQlIgdXNlcyAyMDBtcyB0byBhcHByb3hpbWF0ZWx5IGJvdW5kIHRoZQorICogcGVyZm9ybWFuY2UgcGVuYWx0eSBvZiBQUk9CRV9SVFQncyBjd25kIGNhcHBpbmcgdG8gcm91Z2hseSAyJSAoMjAwbXMvMTBzKS4KKyAqCisgKiBOb3RlIHRoYXQgZmxvd3MgbmVlZCBvbmx5IHBheSAyJSBpZiB0aGV5IGFyZSBidXN5IHNlbmRpbmcgb3ZlciB0aGUgbGFzdCAxMAorICogc2Vjb25kcy4gSW50ZXJhY3RpdmUgYXBwbGljYXRpb25zIChlLmcuLCBXZWIsIFJQQ3MsIHZpZGVvIGNodW5rcykgb2Z0ZW4gaGF2ZQorICogbmF0dXJhbCBzaWxlbmNlcyBvciBsb3ctcmF0ZSBwZXJpb2RzIHdpdGhpbiAxMCBzZWNvbmRzIHdoZXJlIHRoZSByYXRlIGlzIGxvdworICogZW5vdWdoIGZvciBsb25nIGVub3VnaCB0byBkcmFpbiBpdHMgcXVldWUgaW4gdGhlIGJvdHRsZW5lY2suIFdlIHBpY2sgdXAKKyAqIHRoZXNlIG1pbiBSVFQgbWVhc3VyZW1lbnRzIG9wcG9ydHVuaXN0aWNhbGx5IHdpdGggb3VyIG1pbl9ydHQgZmlsdGVyLiA6LSkKKyAqLworc3RhdGljIHZvaWQgYmJyX3VwZGF0ZV9taW5fcnR0KHN0cnVjdCBzb2NrICpzaywgY29uc3Qgc3RydWN0IHJhdGVfc2FtcGxlICpycykKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisJYm9vbCBmaWx0ZXJfZXhwaXJlZDsKKworCS8qIFRyYWNrIG1pbiBSVFQgc2VlbiBpbiB0aGUgbWluX3J0dF93aW5fc2VjIGZpbHRlciB3aW5kb3c6ICovCisJZmlsdGVyX2V4cGlyZWQgPSBhZnRlcih0Y3BfdGltZV9zdGFtcCwKKwkJCSAgICAgICBiYnItPm1pbl9ydHRfc3RhbXAgKyBiYnJfbWluX3J0dF93aW5fc2VjICogSFopOworCWlmIChycy0+cnR0X3VzID49IDAgJiYKKwkgICAgKHJzLT5ydHRfdXMgPD0gYmJyLT5taW5fcnR0X3VzIHx8IGZpbHRlcl9leHBpcmVkKSkgeworCQliYnItPm1pbl9ydHRfdXMgPSBycy0+cnR0X3VzOworCQliYnItPm1pbl9ydHRfc3RhbXAgPSB0Y3BfdGltZV9zdGFtcDsKKwl9CisKKwlpZiAoYmJyX3Byb2JlX3J0dF9tb2RlX21zID4gMCAmJiBmaWx0ZXJfZXhwaXJlZCAmJgorCSAgICAhYmJyLT5pZGxlX3Jlc3RhcnQgJiYgYmJyLT5tb2RlICE9IEJCUl9QUk9CRV9SVFQpIHsKKwkJYmJyLT5tb2RlID0gQkJSX1BST0JFX1JUVDsgIC8qIGRpcCwgZHJhaW4gcXVldWUgKi8KKwkJYmJyLT5wYWNpbmdfZ2FpbiA9IEJCUl9VTklUOworCQliYnItPmN3bmRfZ2FpbiA9IEJCUl9VTklUOworCQliYnJfc2F2ZV9jd25kKHNrKTsgIC8qIG5vdGUgY3duZCBzbyB3ZSBjYW4gcmVzdG9yZSBpdCAqLworCQliYnItPnByb2JlX3J0dF9kb25lX3N0YW1wID0gMDsKKwl9CisKKwlpZiAoYmJyLT5tb2RlID09IEJCUl9QUk9CRV9SVFQpIHsKKwkJLyogSWdub3JlIGxvdyByYXRlIHNhbXBsZXMgZHVyaW5nIHRoaXMgbW9kZS4gKi8KKwkJdHAtPmFwcF9saW1pdGVkID0KKwkJCSh0cC0+ZGVsaXZlcmVkICsgdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKSkgPyA6IDE7CisJCS8qIE1haW50YWluIG1pbiBwYWNrZXRzIGluIGZsaWdodCBmb3IgbWF4KDIwMCBtcywgMSByb3VuZCkuICovCisJCWlmICghYmJyLT5wcm9iZV9ydHRfZG9uZV9zdGFtcCAmJgorCQkgICAgdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKSA8PSBiYnJfY3duZF9taW5fdGFyZ2V0KSB7CisJCQliYnItPnByb2JlX3J0dF9kb25lX3N0YW1wID0gdGNwX3RpbWVfc3RhbXAgKworCQkJCW1zZWNzX3RvX2ppZmZpZXMoYmJyX3Byb2JlX3J0dF9tb2RlX21zKTsKKwkJCWJici0+cHJvYmVfcnR0X3JvdW5kX2RvbmUgPSAwOworCQkJYmJyLT5uZXh0X3J0dF9kZWxpdmVyZWQgPSB0cC0+ZGVsaXZlcmVkOworCQl9IGVsc2UgaWYgKGJici0+cHJvYmVfcnR0X2RvbmVfc3RhbXApIHsKKwkJCWlmIChiYnItPnJvdW5kX3N0YXJ0KQorCQkJCWJici0+cHJvYmVfcnR0X3JvdW5kX2RvbmUgPSAxOworCQkJaWYgKGJici0+cHJvYmVfcnR0X3JvdW5kX2RvbmUgJiYKKwkJCSAgICBhZnRlcih0Y3BfdGltZV9zdGFtcCwgYmJyLT5wcm9iZV9ydHRfZG9uZV9zdGFtcCkpIHsKKwkJCQliYnItPm1pbl9ydHRfc3RhbXAgPSB0Y3BfdGltZV9zdGFtcDsKKwkJCQliYnItPnJlc3RvcmVfY3duZCA9IDE7ICAvKiBzbmFwIHRvIHByaW9yX2N3bmQgKi8KKwkJCQliYnJfcmVzZXRfbW9kZShzayk7CisJCQl9CisJCX0KKwl9CisJYmJyLT5pZGxlX3Jlc3RhcnQgPSAwOworfQorCitzdGF0aWMgdm9pZCBiYnJfdXBkYXRlX21vZGVsKHN0cnVjdCBzb2NrICpzaywgY29uc3Qgc3RydWN0IHJhdGVfc2FtcGxlICpycykKK3sKKwliYnJfdXBkYXRlX2J3KHNrLCBycyk7CisJYmJyX3VwZGF0ZV9jeWNsZV9waGFzZShzaywgcnMpOworCWJicl9jaGVja19mdWxsX2J3X3JlYWNoZWQoc2ssIHJzKTsKKwliYnJfY2hlY2tfZHJhaW4oc2ssIHJzKTsKKwliYnJfdXBkYXRlX21pbl9ydHQoc2ssIHJzKTsKK30KKworc3RhdGljIHZvaWQgYmJyX21haW4oc3RydWN0IHNvY2sgKnNrLCBjb25zdCBzdHJ1Y3QgcmF0ZV9zYW1wbGUgKnJzKQoreworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKwl1MzIgYnc7CisKKwliYnJfdXBkYXRlX21vZGVsKHNrLCBycyk7CisKKwlidyA9IGJicl9idyhzayk7CisJYmJyX3NldF9wYWNpbmdfcmF0ZShzaywgYncsIGJici0+cGFjaW5nX2dhaW4pOworCWJicl9zZXRfdHNvX3NlZ3NfZ29hbChzayk7CisJYmJyX3NldF9jd25kKHNrLCBycywgcnMtPmFja2VkX3NhY2tlZCwgYncsIGJici0+Y3duZF9nYWluKTsKK30KKworc3RhdGljIHZvaWQgYmJyX2luaXQoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKwl1NjQgYnc7CisKKwliYnItPnByaW9yX2N3bmQgPSAwOworCWJici0+dHNvX3NlZ3NfZ29hbCA9IDA7CSAvKiBkZWZhdWx0IHNlZ3MgcGVyIHNrYiB1bnRpbCBmaXJzdCBBQ0sgKi8KKwliYnItPnJ0dF9jbnQgPSAwOworCWJici0+bmV4dF9ydHRfZGVsaXZlcmVkID0gMDsKKwliYnItPnByZXZfY2Ffc3RhdGUgPSBUQ1BfQ0FfT3BlbjsKKwliYnItPnBhY2tldF9jb25zZXJ2YXRpb24gPSAwOworCisJYmJyLT5wcm9iZV9ydHRfZG9uZV9zdGFtcCA9IDA7CisJYmJyLT5wcm9iZV9ydHRfcm91bmRfZG9uZSA9IDA7CisJYmJyLT5taW5fcnR0X3VzID0gdGNwX21pbl9ydHQodHApOworCWJici0+bWluX3J0dF9zdGFtcCA9IHRjcF90aW1lX3N0YW1wOworCisJbWlubWF4X3Jlc2V0KCZiYnItPmJ3LCBiYnItPnJ0dF9jbnQsIDApOyAgLyogaW5pdCBtYXggYncgdG8gMCAqLworCisJLyogSW5pdGlhbGl6ZSBwYWNpbmcgcmF0ZSB0bzogaGlnaF9nYWluICogaW5pdF9jd25kIC8gUlRULiAqLworCWJ3ID0gKHU2NCl0cC0+c25kX2N3bmQgKiBCV19VTklUOworCWRvX2RpdihidywgKHRwLT5zcnR0X3VzID4+IDMpID8gOiBVU0VDX1BFUl9NU0VDKTsKKwlzay0+c2tfcGFjaW5nX3JhdGUgPSAwOwkJLyogZm9yY2UgYW4gdXBkYXRlIG9mIHNrX3BhY2luZ19yYXRlICovCisJYmJyX3NldF9wYWNpbmdfcmF0ZShzaywgYncsIGJicl9oaWdoX2dhaW4pOworCisJYmJyLT5yZXN0b3JlX2N3bmQgPSAwOworCWJici0+cm91bmRfc3RhcnQgPSAwOworCWJici0+aWRsZV9yZXN0YXJ0ID0gMDsKKwliYnItPmZ1bGxfYncgPSAwOworCWJici0+ZnVsbF9id19jbnQgPSAwOworCWJici0+Y3ljbGVfbXN0YW1wLnY2NCA9IDA7CisJYmJyLT5jeWNsZV9pZHggPSAwOworCWJicl9yZXNldF9sdF9id19zYW1wbGluZyhzayk7CisJYmJyX3Jlc2V0X3N0YXJ0dXBfbW9kZShzayk7Cit9CisKK3N0YXRpYyB1MzIgYmJyX3NuZGJ1Zl9leHBhbmQoc3RydWN0IHNvY2sgKnNrKQoreworCS8qIFByb3Zpc2lvbiAzICogY3duZCBzaW5jZSBCQlIgbWF5IHNsb3ctc3RhcnQgZXZlbiBkdXJpbmcgcmVjb3ZlcnkuICovCisJcmV0dXJuIDM7Cit9CisKKy8qIEluIHRoZW9yeSBCQlIgZG9lcyBub3QgbmVlZCB0byB1bmRvIHRoZSBjd25kIHNpbmNlIGl0IGRvZXMgbm90CisgKiBhbHdheXMgcmVkdWNlIGN3bmQgb24gbG9zc2VzIChzZWUgYmJyX21haW4oKSkuIEtlZXAgaXQgZm9yIG5vdy4KKyAqLworc3RhdGljIHUzMiBiYnJfdW5kb19jd25kKHN0cnVjdCBzb2NrICpzaykKK3sKKwlyZXR1cm4gdGNwX3NrKHNrKS0+c25kX2N3bmQ7Cit9CisKKy8qIEVudGVyaW5nIGxvc3MgcmVjb3ZlcnksIHNvIHNhdmUgY3duZCBmb3Igd2hlbiB3ZSBleGl0IG9yIHVuZG8gcmVjb3ZlcnkuICovCitzdGF0aWMgdTMyIGJicl9zc3RocmVzaChzdHJ1Y3Qgc29jayAqc2spCit7CisJYmJyX3NhdmVfY3duZChzayk7CisJcmV0dXJuIFRDUF9JTkZJTklURV9TU1RIUkVTSDsJIC8qIEJCUiBkb2VzIG5vdCB1c2Ugc3N0aHJlc2ggKi8KK30KKworc3RhdGljIHNpemVfdCBiYnJfZ2V0X2luZm8oc3RydWN0IHNvY2sgKnNrLCB1MzIgZXh0LCBpbnQgKmF0dHIsCisJCQkgICB1bmlvbiB0Y3BfY2NfaW5mbyAqaW5mbykKK3sKKwlpZiAoZXh0ICYgKDEgPDwgKElORVRfRElBR19CQlJJTkZPIC0gMSkpIHx8CisJICAgIGV4dCAmICgxIDw8IChJTkVUX0RJQUdfVkVHQVNJTkZPIC0gMSkpKSB7CisJCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCQlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisJCXU2NCBidyA9IGJicl9idyhzayk7CisKKwkJYncgPSBidyAqIHRwLT5tc3NfY2FjaGUgKiBVU0VDX1BFUl9TRUMgPj4gQldfU0NBTEU7CisJCW1lbXNldCgmaW5mby0+YmJyLCAwLCBzaXplb2YoaW5mby0+YmJyKSk7CisJCWluZm8tPmJici5iYnJfYndfbG8JCT0gKHUzMilidzsKKwkJaW5mby0+YmJyLmJicl9id19oaQkJPSAodTMyKShidyA+PiAzMik7CisJCWluZm8tPmJici5iYnJfbWluX3J0dAkJPSBiYnItPm1pbl9ydHRfdXM7CisJCWluZm8tPmJici5iYnJfcGFjaW5nX2dhaW4JPSBiYnItPnBhY2luZ19nYWluOworCQlpbmZvLT5iYnIuYmJyX2N3bmRfZ2FpbgkJPSBiYnItPmN3bmRfZ2FpbjsKKwkJKmF0dHIgPSBJTkVUX0RJQUdfQkJSSU5GTzsKKwkJcmV0dXJuIHNpemVvZihpbmZvLT5iYnIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmJyX3NldF9zdGF0ZShzdHJ1Y3Qgc29jayAqc2ssIHU4IG5ld19zdGF0ZSkKK3sKKwlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisKKwlpZiAobmV3X3N0YXRlID09IFRDUF9DQV9Mb3NzKSB7CisJCXN0cnVjdCByYXRlX3NhbXBsZSBycyA9IHsgLmxvc3NlcyA9IDEgfTsKKworCQliYnItPnByZXZfY2Ffc3RhdGUgPSBUQ1BfQ0FfTG9zczsKKwkJYmJyLT5mdWxsX2J3ID0gMDsKKwkJYmJyLT5yb3VuZF9zdGFydCA9IDE7CS8qIHRyZWF0IFJUTyBsaWtlIGVuZCBvZiBhIHJvdW5kICovCisJCWJicl9sdF9id19zYW1wbGluZyhzaywgJnJzKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzIHRjcF9iYnJfY29uZ19vcHMgX19yZWFkX21vc3RseSA9IHsKKwkuZmxhZ3MJCT0gVENQX0NPTkdfTk9OX1JFU1RSSUNURUQsCisJLm5hbWUJCT0gImJiciIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pbml0CQk9IGJicl9pbml0LAorCS5jb25nX2NvbnRyb2wJPSBiYnJfbWFpbiwKKwkuc25kYnVmX2V4cGFuZAk9IGJicl9zbmRidWZfZXhwYW5kLAorCS51bmRvX2N3bmQJPSBiYnJfdW5kb19jd25kLAorCS5jd25kX2V2ZW50CT0gYmJyX2N3bmRfZXZlbnQsCisJLnNzdGhyZXNoCT0gYmJyX3NzdGhyZXNoLAorCS50c29fc2Vnc19nb2FsCT0gYmJyX3Rzb19zZWdzX2dvYWwsCisJLmdldF9pbmZvCT0gYmJyX2dldF9pbmZvLAorCS5zZXRfc3RhdGUJPSBiYnJfc2V0X3N0YXRlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYmJyX3JlZ2lzdGVyKHZvaWQpCit7CisJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgYmJyKSA+IElDU0tfQ0FfUFJJVl9TSVpFKTsKKwlyZXR1cm4gdGNwX3JlZ2lzdGVyX2Nvbmdlc3Rpb25fY29udHJvbCgmdGNwX2Jicl9jb25nX29wcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBiYnJfdW5yZWdpc3Rlcih2b2lkKQoreworCXRjcF91bnJlZ2lzdGVyX2Nvbmdlc3Rpb25fY29udHJvbCgmdGNwX2Jicl9jb25nX29wcyk7Cit9CisKK21vZHVsZV9pbml0KGJicl9yZWdpc3Rlcik7Cittb2R1bGVfZXhpdChiYnJfdW5yZWdpc3Rlcik7CisKK01PRFVMRV9BVVRIT1IoIlZhbiBKYWNvYnNvbiA8dmFuakBnb29nbGUuY29tPiIpOworTU9EVUxFX0FVVEhPUigiTmVhbCBDYXJkd2VsbCA8bmNhcmR3ZWxsQGdvb2dsZS5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJZdWNodW5nIENoZW5nIDx5Y2hlbmdAZ29vZ2xlLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIlNvaGVpbCBIYXNzYXMgWWVnYW5laCA8c29oZWlsQGdvb2dsZS5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRDUCBCQlIgKEJvdHRsZW5lY2sgQmFuZHdpZHRoIGFuZCBSVFQpIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfY2RnLmMgYi9uZXQvaXB2NC90Y3BfY2RnLmMKaW5kZXggMDM3MjViMi4uMzViMjgwMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2NkZy5jCisrKyBiL25ldC9pcHY0L3RjcF9jZGcuYwpAQCAtNTYsNyArNTYsNyBAQAogbW9kdWxlX3BhcmFtKHVzZV90b2xlcmFuY2UsIGJvb2wsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyh1c2VfdG9sZXJhbmNlLCAidXNlIGxvc3MgdG9sZXJhbmNlIGhldXJpc3RpYyIpOwogCi1zdHJ1Y3QgbWlubWF4IHsKK3N0cnVjdCBjZGdfbWlubWF4IHsKIAl1bmlvbiB7CiAJCXN0cnVjdCB7CiAJCQlzMzIgbWluOwpAQCAtNzQsMTAgKzc0LDEwIEBACiB9OwogCiBzdHJ1Y3QgY2RnIHsKLQlzdHJ1Y3QgbWlubWF4IHJ0dDsKLQlzdHJ1Y3QgbWlubWF4IHJ0dF9wcmV2OwotCXN0cnVjdCBtaW5tYXggKmdyYWRpZW50czsKLQlzdHJ1Y3QgbWlubWF4IGdzdW07CisJc3RydWN0IGNkZ19taW5tYXggcnR0OworCXN0cnVjdCBjZGdfbWlubWF4IHJ0dF9wcmV2OworCXN0cnVjdCBjZGdfbWlubWF4ICpncmFkaWVudHM7CisJc3RydWN0IGNkZ19taW5tYXggZ3N1bTsKIAlib29sIGdmaWxsZWQ7CiAJdTggIHRhaWw7CiAJdTggIHN0YXRlOwpAQCAtMzUzLDcgKzM1Myw3IEBACiB7CiAJc3RydWN0IGNkZyAqY2EgPSBpbmV0X2Nza19jYShzayk7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7Ci0Jc3RydWN0IG1pbm1heCAqZ3JhZGllbnRzOworCXN0cnVjdCBjZGdfbWlubWF4ICpncmFkaWVudHM7CiAKIAlzd2l0Y2ggKGV2KSB7CiAJY2FzZSBDQV9FVkVOVF9DV05EX1JFU1RBUlQ6CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfY29uZy5jIGIvbmV0L2lwdjQvdGNwX2NvbmcuYwppbmRleCA4ODJjYWE0Li4xMjk0YWY0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfY29uZy5jCisrKyBiL25ldC9pcHY0L3RjcF9jb25nLmMKQEAgLTY5LDcgKzY5LDcgQEAKIAlpbnQgcmV0ID0gMDsKIAogCS8qIGFsbCBhbGdvcml0aG1zIG11c3QgaW1wbGVtZW50IHNzdGhyZXNoIGFuZCBjb25nX2F2b2lkIG9wcyAqLwotCWlmICghY2EtPnNzdGhyZXNoIHx8ICFjYS0+Y29uZ19hdm9pZCkgeworCWlmICghY2EtPnNzdGhyZXNoIHx8ICEoY2EtPmNvbmdfYXZvaWQgfHwgY2EtPmNvbmdfY29udHJvbCkpIHsKIAkJcHJfZXJyKCIlcyBkb2VzIG5vdCBpbXBsZW1lbnQgcmVxdWlyZWQgb3BzXG4iLCBjYS0+bmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9kaWFnLmMgYi9uZXQvaXB2NC90Y3BfZGlhZy5jCmluZGV4IDRkNjEwOTMuLmE3NDhjNzQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9kaWFnLmMKKysrIGIvbmV0L2lwdjQvdGNwX2RpYWcuYwpAQCAtNTQsMTEgKzU0LDE2IEBACiB7CiAJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoaW5fc2tiLT5zayk7CiAJc3RydWN0IHNvY2sgKnNrID0gaW5ldF9kaWFnX2ZpbmRfb25lX2ljc2sobmV0LCAmdGNwX2hhc2hpbmZvLCByZXEpOworCWludCBlcnI7CiAKIAlpZiAoSVNfRVJSKHNrKSkKIAkJcmV0dXJuIFBUUl9FUlIoc2spOwogCi0JcmV0dXJuIHNvY2tfZGlhZ19kZXN0cm95KHNrLCBFQ09OTkFCT1JURUQpOworCWVyciA9IHNvY2tfZGlhZ19kZXN0cm95KHNrLCBFQ09OTkFCT1JURUQpOworCisJc29ja19nZW5fcHV0KHNrKTsKKworCXJldHVybiBlcnI7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2Zhc3RvcGVuLmMgYi9uZXQvaXB2NC90Y3BfZmFzdG9wZW4uYwppbmRleCA1NGQ5ZjliLi40ZTc3N2EzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfZmFzdG9wZW4uYworKysgYi9uZXQvaXB2NC90Y3BfZmFzdG9wZW4uYwpAQCAtMTUwLDYgKzE1MCw3IEBACiAJdHAtPnNlZ3NfaW4gPSAwOwogCXRjcF9zZWdzX2luKHRwLCBza2IpOwogCV9fc2tiX3B1bGwoc2tiLCB0Y3BfaGRybGVuKHNrYikpOworCXNrX2ZvcmNlZF9tZW1fc2NoZWR1bGUoc2ssIHNrYi0+dHJ1ZXNpemUpOwogCXNrYl9zZXRfb3duZXJfcihza2IsIHNrKTsKIAogCVRDUF9TS0JfQ0Ioc2tiKS0+c2VxKys7CkBAIC0yMjYsNiArMjI3LDcgQEAKIAl0Y3BfZmFzdG9wZW5fYWRkX3NrYihjaGlsZCwgc2tiKTsKIAogCXRjcF9yc2socmVxKS0+cmN2X254dCA9IHRwLT5yY3Zfbnh0OworCXRwLT5yY3Zfd3VwID0gdHAtPnJjdl9ueHQ7CiAJLyogdGNwX2Nvbm5fcmVxdWVzdCgpIGlzIHNlbmRpbmcgdGhlIFNZTkFDSywKIAkgKiBhbmQgcXVldWVzIHRoZSBjaGlsZCBpbnRvIGxpc3RlbmVyIGFjY2VwdCBxdWV1ZS4KIAkgKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9pbnB1dC5jIGIvbmV0L2lwdjQvdGNwX2lucHV0LmMKaW5kZXggM2ViZjQ1Yi4uYTI3YjljMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2lucHV0LmMKKysrIGIvbmV0L2lwdjQvdGNwX2lucHV0LmMKQEAgLTI4OSw2ICsyODksNyBAQAogc3RhdGljIHZvaWQgdGNwX3NuZGJ1Zl9leHBhbmQoc3RydWN0IHNvY2sgKnNrKQogewogCWNvbnN0IHN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCWNvbnN0IHN0cnVjdCB0Y3BfY29uZ2VzdGlvbl9vcHMgKmNhX29wcyA9IGluZXRfY3NrKHNrKS0+aWNza19jYV9vcHM7CiAJaW50IHNuZG1lbSwgcGVyX21zczsKIAl1MzIgbnJfc2VnczsKIApAQCAtMzA5LDcgKzMxMCw4IEBACiAJICogQ3ViaWMgbmVlZHMgMS43IGZhY3Rvciwgcm91bmRlZCB0byAyIHRvIGluY2x1ZGUKIAkgKiBleHRyYSBjdXNoaW9uIChhcHBsaWNhdGlvbiBtaWdodCByZWFjdCBzbG93bHkgdG8gUE9MTE9VVCkKIAkgKi8KLQlzbmRtZW0gPSAyICogbnJfc2VncyAqIHBlcl9tc3M7CisJc25kbWVtID0gY2Ffb3BzLT5zbmRidWZfZXhwYW5kID8gY2Ffb3BzLT5zbmRidWZfZXhwYW5kKHNrKSA6IDI7CisJc25kbWVtICo9IG5yX3NlZ3MgKiBwZXJfbXNzOwogCiAJaWYgKHNrLT5za19zbmRidWYgPCBzbmRtZW0pCiAJCXNrLT5za19zbmRidWYgPSBtaW4oc25kbWVtLCBzeXNjdGxfdGNwX3dtZW1bMl0pOwpAQCAtODk5LDEyICs5MDEsMjkgQEAKIAkJdHAtPnJldHJhbnNtaXRfaGlnaCA9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKIH0KIAorLyogU3VtIHRoZSBudW1iZXIgb2YgcGFja2V0cyBvbiB0aGUgd2lyZSB3ZSBoYXZlIG1hcmtlZCBhcyBsb3N0LgorICogVGhlcmUgYXJlIHR3byBjYXNlcyB3ZSBjYXJlIGFib3V0IGhlcmU6CisgKiBhKSBQYWNrZXQgaGFzbid0IGJlZW4gbWFya2VkIGxvc3QgKG5vciByZXRyYW5zbWl0dGVkKSwKKyAqICAgIGFuZCB0aGlzIGlzIHRoZSBmaXJzdCBsb3NzLgorICogYikgUGFja2V0IGhhcyBiZWVuIG1hcmtlZCBib3RoIGxvc3QgYW5kIHJldHJhbnNtaXR0ZWQsCisgKiAgICBhbmQgdGhpcyBtZWFucyB3ZSB0aGluayBpdCB3YXMgbG9zdCBhZ2Fpbi4KKyAqLworc3RhdGljIHZvaWQgdGNwX3N1bV9sb3N0KHN0cnVjdCB0Y3Bfc29jayAqdHAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJX191OCBzYWNrZWQgPSBUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZDsKKworCWlmICghKHNhY2tlZCAmIFRDUENCX0xPU1QpIHx8CisJICAgICgoc2Fja2VkICYgVENQQ0JfTE9TVCkgJiYgKHNhY2tlZCAmIFRDUENCX1NBQ0tFRF9SRVRSQU5TKSkpCisJCXRwLT5sb3N0ICs9IHRjcF9za2JfcGNvdW50KHNrYik7Cit9CisKIHN0YXRpYyB2b2lkIHRjcF9za2JfbWFya19sb3N0KHN0cnVjdCB0Y3Bfc29jayAqdHAsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaWYgKCEoVENQX1NLQl9DQihza2IpLT5zYWNrZWQgJiAoVENQQ0JfTE9TVHxUQ1BDQl9TQUNLRURfQUNLRUQpKSkgewogCQl0Y3BfdmVyaWZ5X3JldHJhbnNtaXRfaGludCh0cCwgc2tiKTsKIAogCQl0cC0+bG9zdF9vdXQgKz0gdGNwX3NrYl9wY291bnQoc2tiKTsKKwkJdGNwX3N1bV9sb3N0KHRwLCBza2IpOwogCQlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCB8PSBUQ1BDQl9MT1NUOwogCX0KIH0KQEAgLTkxMyw2ICs5MzIsNyBAQAogewogCXRjcF92ZXJpZnlfcmV0cmFuc21pdF9oaW50KHRwLCBza2IpOwogCisJdGNwX3N1bV9sb3N0KHRwLCBza2IpOwogCWlmICghKFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkICYgKFRDUENCX0xPU1R8VENQQ0JfU0FDS0VEX0FDS0VEKSkpIHsKIAkJdHAtPmxvc3Rfb3V0ICs9IHRjcF9za2JfcGNvdW50KHNrYik7CiAJCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkIHw9IFRDUENCX0xPU1Q7CkBAIC0xMDk0LDYgKzExMTQsNyBAQAogCSAqLwogCXN0cnVjdCBza2JfbXN0YW1wIGZpcnN0X3NhY2t0OwogCXN0cnVjdCBza2JfbXN0YW1wIGxhc3Rfc2Fja3Q7CisJc3RydWN0IHJhdGVfc2FtcGxlICpyYXRlOwogCWludAlmbGFnOwogfTsKIApAQCAtMTI2MSw2ICsxMjgyLDcgQEAKIAl0Y3Bfc2Fja3RhZ19vbmUoc2ssIHN0YXRlLCBUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCwKIAkJCXN0YXJ0X3NlcSwgZW5kX3NlcSwgZHVwX3NhY2ssIHBjb3VudCwKIAkJCSZza2ItPnNrYl9tc3RhbXApOworCXRjcF9yYXRlX3NrYl9kZWxpdmVyZWQoc2ssIHNrYiwgc3RhdGUtPnJhdGUpOwogCiAJaWYgKHNrYiA9PSB0cC0+bG9zdF9za2JfaGludCkKIAkJdHAtPmxvc3RfY250X2hpbnQgKz0gcGNvdW50OwpAQCAtMTMxMSw2ICsxMzMzLDkgQEAKIAkJdGNwX2FkdmFuY2VfaGlnaGVzdF9zYWNrKHNrLCBza2IpOwogCiAJdGNwX3NrYl9jb2xsYXBzZV90c3RhbXAocHJldiwgc2tiKTsKKwlpZiAodW5saWtlbHkoVENQX1NLQl9DQihwcmV2KS0+dHguZGVsaXZlcmVkX21zdGFtcC52NjQpKQorCQlUQ1BfU0tCX0NCKHByZXYpLT50eC5kZWxpdmVyZWRfbXN0YW1wLnY2NCA9IDA7CisKIAl0Y3BfdW5saW5rX3dyaXRlX3F1ZXVlKHNrYiwgc2spOwogCXNrX3dtZW1fZnJlZV9za2Ioc2ssIHNrYik7CiAKQEAgLTE1NDAsNiArMTU2NSw3IEBACiAJCQkJCQlkdXBfc2FjaywKIAkJCQkJCXRjcF9za2JfcGNvdW50KHNrYiksCiAJCQkJCQkmc2tiLT5za2JfbXN0YW1wKTsKKwkJCXRjcF9yYXRlX3NrYl9kZWxpdmVyZWQoc2ssIHNrYiwgc3RhdGUtPnJhdGUpOwogCiAJCQlpZiAoIWJlZm9yZShUQ1BfU0tCX0NCKHNrYiktPnNlcSwKIAkJCQkgICAgdGNwX2hpZ2hlc3Rfc2Fja19zZXEodHApKSkKQEAgLTE2MjIsOCArMTY0OCwxMCBAQAogCiAJZm91bmRfZHVwX3NhY2sgPSB0Y3BfY2hlY2tfZHNhY2soc2ssIGFja19za2IsIHNwX3dpcmUsCiAJCQkJCSBudW1fc2Fja3MsIHByaW9yX3NuZF91bmEpOwotCWlmIChmb3VuZF9kdXBfc2FjaykKKwlpZiAoZm91bmRfZHVwX3NhY2spIHsKIAkJc3RhdGUtPmZsYWcgfD0gRkxBR19EU0FDS0lOR19BQ0s7CisJCXRwLT5kZWxpdmVyZWQrKzsgLyogQSBzcHVyaW91cyByZXRyYW5zbWlzc2lvbiBpcyBkZWxpdmVyZWQgKi8KKwl9CiAKIAkvKiBFbGltaW5hdGUgdG9vIG9sZCBBQ0tzLCBidXQgdGFrZSBpbnRvCiAJICogYWNjb3VudCBtb3JlIG9yIGxlc3MgZnJlc2ggb25lcywgdGhleSBjYW4KQEAgLTE4OTAsNiArMTkxOCw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlib29sIG5ld19yZWNvdmVyeSA9IGljc2stPmljc2tfY2Ffc3RhdGUgPCBUQ1BfQ0FfUmVjb3Zlcnk7CiAJYm9vbCBpc19yZW5lZzsJCQkvKiBpcyByZWNlaXZlciByZW5lZ2luZyBvbiBTQUNLcz8gKi8KKwlib29sIG1hcmtfbG9zdDsKIAogCS8qIFJlZHVjZSBzc3RocmVzaCBpZiBpdCBoYXMgbm90IHlldCBiZWVuIG1hZGUgaW5zaWRlIHRoaXMgd2luZG93LiAqLwogCWlmIChpY3NrLT5pY3NrX2NhX3N0YXRlIDw9IFRDUF9DQV9EaXNvcmRlciB8fApAQCAtMTkyMyw4ICsxOTUyLDEyIEBACiAJCWlmIChza2IgPT0gdGNwX3NlbmRfaGVhZChzaykpCiAJCQlicmVhazsKIAorCQltYXJrX2xvc3QgPSAoIShUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCAmIFRDUENCX1NBQ0tFRF9BQ0tFRCkgfHwKKwkJCSAgICAgaXNfcmVuZWcpOworCQlpZiAobWFya19sb3N0KQorCQkJdGNwX3N1bV9sb3N0KHRwLCBza2IpOwogCQlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCAmPSAoflRDUENCX1RBR0JJVFMpfFRDUENCX1NBQ0tFRF9BQ0tFRDsKLQkJaWYgKCEoVENQX1NLQl9DQihza2IpLT5zYWNrZWQmVENQQ0JfU0FDS0VEX0FDS0VEKSB8fCBpc19yZW5lZykgeworCQlpZiAobWFya19sb3N0KSB7CiAJCQlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCAmPSB+VENQQ0JfU0FDS0VEX0FDS0VEOwogCQkJVENQX1NLQl9DQihza2IpLT5zYWNrZWQgfD0gVENQQ0JfTE9TVDsKIAkJCXRwLT5sb3N0X291dCArPSB0Y3Bfc2tiX3Bjb3VudChza2IpOwpAQCAtMjMyOSwxMCArMjM2Miw5IEBACiAJfQogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJZWxzZSBpZiAoc2stPnNrX2ZhbWlseSA9PSBBRl9JTkVUNikgewotCQlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CiAJCXByX2RlYnVnKCJVbmRvICVzICVwSTYvJXUgYyV1IGwldSBzcyV1LyV1IHAldVxuIiwKIAkJCSBtc2csCi0JCQkgJm5wLT5kYWRkciwgbnRvaHMoaW5ldC0+aW5ldF9kcG9ydCksCisJCQkgJnNrLT5za192Nl9kYWRkciwgbnRvaHMoaW5ldC0+aW5ldF9kcG9ydCksCiAJCQkgdHAtPnNuZF9jd25kLCB0Y3BfbGVmdF9vdXQodHApLAogCQkJIHRwLT5zbmRfc3N0aHJlc2gsIHRwLT5wcmlvcl9zc3RocmVzaCwKIAkJCSB0cC0+cGFja2V0c19vdXQpOwpAQCAtMjUwMyw2ICsyNTM1LDkgQEAKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAorCWlmIChpbmV0X2NzayhzayktPmljc2tfY2Ffb3BzLT5jb25nX2NvbnRyb2wpCisJCXJldHVybjsKKwogCS8qIFJlc2V0IGN3bmQgdG8gc3N0aHJlc2ggaW4gQ1dSIG9yIFJlY292ZXJ5ICh1bmxlc3MgaXQncyB1bmRvbmUpICovCiAJaWYgKGluZXRfY3NrKHNrKS0+aWNza19jYV9zdGF0ZSA9PSBUQ1BfQ0FfQ1dSIHx8CiAJICAgICh0cC0+dW5kb19tYXJrZXIgJiYgdHAtPnNuZF9zc3RocmVzaCA8IFRDUF9JTkZJTklURV9TU1RIUkVTSCkpIHsKQEAgLTI4NzksNjcgKzI5MTQsMTMgQEAKIAkqcmV4bWl0ID0gUkVYTUlUX0xPU1Q7CiB9CiAKLS8qIEthdGhsZWVuIE5pY2hvbHMnIGFsZ29yaXRobSBmb3IgdHJhY2tpbmcgdGhlIG1pbmltdW0gdmFsdWUgb2YKLSAqIGEgZGF0YSBzdHJlYW0gb3ZlciBzb21lIGZpeGVkIHRpbWUgaW50ZXJ2YWwuIChFLmcuLCB0aGUgbWluaW11bQotICogUlRUIG92ZXIgdGhlIHBhc3QgZml2ZSBtaW51dGVzLikgSXQgdXNlcyBjb25zdGFudCBzcGFjZSBhbmQgY29uc3RhbnQKLSAqIHRpbWUgcGVyIHVwZGF0ZSB5ZXQgYWxtb3N0IGFsd2F5cyBkZWxpdmVycyB0aGUgc2FtZSBtaW5pbXVtIGFzIGFuCi0gKiBpbXBsZW1lbnRhdGlvbiB0aGF0IGhhcyB0byBrZWVwIGFsbCB0aGUgZGF0YSBpbiB0aGUgd2luZG93LgotICoKLSAqIFRoZSBhbGdvcml0aG0ga2VlcHMgdHJhY2sgb2YgdGhlIGJlc3QsIDJuZCBiZXN0ICYgM3JkIGJlc3QgbWluCi0gKiB2YWx1ZXMsIG1haW50YWluaW5nIGFuIGludmFyaWFudCB0aGF0IHRoZSBtZWFzdXJlbWVudCB0aW1lIG9mIHRoZQotICogbid0aCBiZXN0ID49IG4tMSd0aCBiZXN0LiBJdCBhbHNvIG1ha2VzIHN1cmUgdGhhdCB0aGUgdGhyZWUgdmFsdWVzCi0gKiBhcmUgd2lkZWx5IHNlcGFyYXRlZCBpbiB0aGUgdGltZSB3aW5kb3cgc2luY2UgdGhhdCBib3VuZHMgdGhlIHdvcnNlCi0gKiBjYXNlIGVycm9yIHdoZW4gdGhhdCBkYXRhIGlzIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBvdmVyIHRoZSB3aW5kb3cuCi0gKgotICogVXBvbiBnZXR0aW5nIGEgbmV3IG1pbiwgd2UgY2FuIGZvcmdldCBldmVyeXRoaW5nIGVhcmxpZXIgYmVjYXVzZSBpdAotICogaGFzIG5vIHZhbHVlIC0gdGhlIG5ldyBtaW4gaXMgPD0gZXZlcnl0aGluZyBlbHNlIGluIHRoZSB3aW5kb3cgYnkKLSAqIGRlZmluaXRpb24gYW5kIGl0J3MgdGhlIG1vc3QgcmVjZW50LiBTbyB3ZSByZXN0YXJ0IGZyZXNoIG9uIGV2ZXJ5IG5ldyBtaW4KLSAqIGFuZCBvdmVyd3JpdGVzIDJuZCAmIDNyZCBjaG9pY2VzLiBUaGUgc2FtZSBwcm9wZXJ0eSBob2xkcyBmb3IgMm5kICYgM3JkCi0gKiBiZXN0LgotICovCiBzdGF0aWMgdm9pZCB0Y3BfdXBkYXRlX3J0dF9taW4oc3RydWN0IHNvY2sgKnNrLCB1MzIgcnR0X3VzKQogewotCWNvbnN0IHUzMiBub3cgPSB0Y3BfdGltZV9zdGFtcCwgd2xlbiA9IHN5c2N0bF90Y3BfbWluX3J0dF93bGVuICogSFo7Ci0Jc3RydWN0IHJ0dF9tZWFzICptID0gdGNwX3NrKHNrKS0+cnR0X21pbjsKLQlzdHJ1Y3QgcnR0X21lYXMgcnR0bSA9IHsKLQkJLnJ0dCA9IGxpa2VseShydHRfdXMpID8gcnR0X3VzIDogamlmZmllc190b191c2VjcygxKSwKLQkJLnRzID0gbm93LAotCX07Ci0JdTMyIGVsYXBzZWQ7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJdTMyIHdsZW4gPSBzeXNjdGxfdGNwX21pbl9ydHRfd2xlbiAqIEhaOwogCi0JLyogQ2hlY2sgaWYgdGhlIG5ldyBtZWFzdXJlbWVudCB1cGRhdGVzIHRoZSAxc3QsIDJuZCwgb3IgM3JkIGNob2ljZXMgKi8KLQlpZiAodW5saWtlbHkocnR0bS5ydHQgPD0gbVswXS5ydHQpKQotCQltWzBdID0gbVsxXSA9IG1bMl0gPSBydHRtOwotCWVsc2UgaWYgKHJ0dG0ucnR0IDw9IG1bMV0ucnR0KQotCQltWzFdID0gbVsyXSA9IHJ0dG07Ci0JZWxzZSBpZiAocnR0bS5ydHQgPD0gbVsyXS5ydHQpCi0JCW1bMl0gPSBydHRtOwotCi0JZWxhcHNlZCA9IG5vdyAtIG1bMF0udHM7Ci0JaWYgKHVubGlrZWx5KGVsYXBzZWQgPiB3bGVuKSkgewotCQkvKiBQYXNzZWQgZW50aXJlIHdpbmRvdyB3aXRob3V0IGEgbmV3IG1pbiBzbyBtYWtlIDJuZCBjaG9pY2UKLQkJICogdGhlIG5ldyBtaW4gJiAzcmQgY2hvaWNlIHRoZSBuZXcgMm5kLiBTbyBmb3J0aCBhbmQgc28gb24uCi0JCSAqLwotCQltWzBdID0gbVsxXTsKLQkJbVsxXSA9IG1bMl07Ci0JCW1bMl0gPSBydHRtOwotCQlpZiAobm93IC0gbVswXS50cyA+IHdsZW4pIHsKLQkJCW1bMF0gPSBtWzFdOwotCQkJbVsxXSA9IHJ0dG07Ci0JCQlpZiAobm93IC0gbVswXS50cyA+IHdsZW4pCi0JCQkJbVswXSA9IHJ0dG07Ci0JCX0KLQl9IGVsc2UgaWYgKG1bMV0udHMgPT0gbVswXS50cyAmJiBlbGFwc2VkID4gd2xlbiAvIDQpIHsKLQkJLyogUGFzc2VkIGEgcXVhcnRlciBvZiB0aGUgd2luZG93IHdpdGhvdXQgYSBuZXcgbWluIHNvCi0JCSAqIHRha2UgMm5kIGNob2ljZSBmcm9tIHRoZSAybmQgcXVhcnRlciBvZiB0aGUgd2luZG93LgotCQkgKi8KLQkJbVsyXSA9IG1bMV0gPSBydHRtOwotCX0gZWxzZSBpZiAobVsyXS50cyA9PSBtWzFdLnRzICYmIGVsYXBzZWQgPiB3bGVuIC8gMikgewotCQkvKiBQYXNzZWQgaGFsZiB0aGUgd2luZG93IHdpdGhvdXQgYSBuZXcgbWluIHNvIHRha2UgdGhlIDNyZAotCQkgKiBjaG9pY2UgZnJvbSB0aGUgbGFzdCBoYWxmIG9mIHRoZSB3aW5kb3cuCi0JCSAqLwotCQltWzJdID0gcnR0bTsKLQl9CisJbWlubWF4X3J1bm5pbmdfbWluKCZ0cC0+cnR0X21pbiwgd2xlbiwgdGNwX3RpbWVfc3RhbXAsCisJCQkgICBydHRfdXMgPyA6IGppZmZpZXNfdG9fdXNlY3MoMSkpOwogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgdGNwX2Fja191cGRhdGVfcnR0KHN0cnVjdCBzb2NrICpzaywgY29uc3QgaW50IGZsYWcsCkBAIC0zMTAyLDEwICszMDgzLDExIEBACiAgKi8KIHN0YXRpYyBpbnQgdGNwX2NsZWFuX3J0eF9xdWV1ZShzdHJ1Y3Qgc29jayAqc2ssIGludCBwcmlvcl9mYWNrZXRzLAogCQkJICAgICAgIHUzMiBwcmlvcl9zbmRfdW5hLCBpbnQgKmFja2VkLAotCQkJICAgICAgIHN0cnVjdCB0Y3Bfc2Fja3RhZ19zdGF0ZSAqc2FjaykKKwkJCSAgICAgICBzdHJ1Y3QgdGNwX3NhY2t0YWdfc3RhdGUgKnNhY2ssCisJCQkgICAgICAgc3RydWN0IHNrYl9tc3RhbXAgKm5vdykKIHsKIAljb25zdCBzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7Ci0Jc3RydWN0IHNrYl9tc3RhbXAgZmlyc3RfYWNrdCwgbGFzdF9hY2t0LCBub3c7CisJc3RydWN0IHNrYl9tc3RhbXAgZmlyc3RfYWNrdCwgbGFzdF9hY2t0OwogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCXUzMiBwcmlvcl9zYWNrZWQgPSB0cC0+c2Fja2VkX291dDsKIAl1MzIgcmVvcmQgPSB0cC0+cGFja2V0c19vdXQ7CkBAIC0zMTM3LDcgKzMxMTksNiBAQAogCQkJYWNrZWRfcGNvdW50ID0gdGNwX3Rzb19hY2tlZChzaywgc2tiKTsKIAkJCWlmICghYWNrZWRfcGNvdW50KQogCQkJCWJyZWFrOwotCiAJCQlmdWxseV9hY2tlZCA9IGZhbHNlOwogCQl9IGVsc2UgewogCQkJLyogU3BlZWR1cCB0Y3BfdW5saW5rX3dyaXRlX3F1ZXVlKCkgYW5kIG5leHQgbG9vcCAqLwpAQCAtMzE3Myw2ICszMTU0LDcgQEAKIAogCQl0cC0+cGFja2V0c19vdXQgLT0gYWNrZWRfcGNvdW50OwogCQlwa3RzX2Fja2VkICs9IGFja2VkX3Bjb3VudDsKKwkJdGNwX3JhdGVfc2tiX2RlbGl2ZXJlZChzaywgc2tiLCBzYWNrLT5yYXRlKTsKIAogCQkvKiBJbml0aWFsIG91dGdvaW5nIFNZTidzIGdldCBwdXQgb250byB0aGUgd3JpdGVfcXVldWUKIAkJICoganVzdCBsaWtlIGFueXRoaW5nIGVsc2Ugd2UgdHJhbnNtaXQuICBJdCBpcyBub3QKQEAgLTMyMDUsMTYgKzMxODcsMTUgQEAKIAlpZiAoc2tiICYmIChUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCAmIFRDUENCX1NBQ0tFRF9BQ0tFRCkpCiAJCWZsYWcgfD0gRkxBR19TQUNLX1JFTkVHSU5HOwogCi0Jc2tiX21zdGFtcF9nZXQoJm5vdyk7CiAJaWYgKGxpa2VseShmaXJzdF9hY2t0LnY2NCkgJiYgIShmbGFnICYgRkxBR19SRVRSQU5TX0RBVEFfQUNLRUQpKSB7Ci0JCXNlcV9ydHRfdXMgPSBza2JfbXN0YW1wX3VzX2RlbHRhKCZub3csICZmaXJzdF9hY2t0KTsKLQkJY2FfcnR0X3VzID0gc2tiX21zdGFtcF91c19kZWx0YSgmbm93LCAmbGFzdF9hY2t0KTsKKwkJc2VxX3J0dF91cyA9IHNrYl9tc3RhbXBfdXNfZGVsdGEobm93LCAmZmlyc3RfYWNrdCk7CisJCWNhX3J0dF91cyA9IHNrYl9tc3RhbXBfdXNfZGVsdGEobm93LCAmbGFzdF9hY2t0KTsKIAl9CiAJaWYgKHNhY2stPmZpcnN0X3NhY2t0LnY2NCkgewotCQlzYWNrX3J0dF91cyA9IHNrYl9tc3RhbXBfdXNfZGVsdGEoJm5vdywgJnNhY2stPmZpcnN0X3NhY2t0KTsKLQkJY2FfcnR0X3VzID0gc2tiX21zdGFtcF91c19kZWx0YSgmbm93LCAmc2Fjay0+bGFzdF9zYWNrdCk7CisJCXNhY2tfcnR0X3VzID0gc2tiX21zdGFtcF91c19kZWx0YShub3csICZzYWNrLT5maXJzdF9zYWNrdCk7CisJCWNhX3J0dF91cyA9IHNrYl9tc3RhbXBfdXNfZGVsdGEobm93LCAmc2Fjay0+bGFzdF9zYWNrdCk7CiAJfQotCisJc2Fjay0+cmF0ZS0+cnR0X3VzID0gY2FfcnR0X3VzOyAvKiBSVFQgb2YgbGFzdCAoUylBQ0tlZCBwYWNrZXQsIG9yIC0xICovCiAJcnR0X3VwZGF0ZSA9IHRjcF9hY2tfdXBkYXRlX3J0dChzaywgZmxhZywgc2VxX3J0dF91cywgc2Fja19ydHRfdXMsCiAJCQkJCWNhX3J0dF91cyk7CiAKQEAgLTMyNDIsNyArMzIyMyw3IEBACiAJCXRwLT5mYWNrZXRzX291dCAtPSBtaW4ocGt0c19hY2tlZCwgdHAtPmZhY2tldHNfb3V0KTsKIAogCX0gZWxzZSBpZiAoc2tiICYmIHJ0dF91cGRhdGUgJiYgc2Fja19ydHRfdXMgPj0gMCAmJgotCQkgICBzYWNrX3J0dF91cyA+IHNrYl9tc3RhbXBfdXNfZGVsdGEoJm5vdywgJnNrYi0+c2tiX21zdGFtcCkpIHsKKwkJICAgc2Fja19ydHRfdXMgPiBza2JfbXN0YW1wX3VzX2RlbHRhKG5vdywgJnNrYi0+c2tiX21zdGFtcCkpIHsKIAkJLyogRG8gbm90IHJlLWFybSBSVE8gaWYgdGhlIHNhY2sgUlRUIGlzIG1lYXN1cmVkIGZyb20gZGF0YSBzZW50CiAJCSAqIGFmdGVyIHdoZW4gdGhlIGhlYWQgd2FzIGxhc3QgKHJlKXRyYW5zbWl0dGVkLiBPdGhlcndpc2UgdGhlCiAJCSAqIHRpbWVvdXQgbWF5IGNvbnRpbnVlIHRvIGV4dGVuZCBpbiBsb3NzIHJlY292ZXJ5LgpAQCAtMzMzMyw4ICszMzE0LDE1IEBACiAgKiBpbmZvcm1hdGlvbi4gQWxsIHRyYW5zbWlzc2lvbiBvciByZXRyYW5zbWlzc2lvbiBhcmUgZGVsYXllZCBhZnRlcndhcmRzLgogICovCiBzdGF0aWMgdm9pZCB0Y3BfY29uZ19jb250cm9sKHN0cnVjdCBzb2NrICpzaywgdTMyIGFjaywgdTMyIGFja2VkX3NhY2tlZCwKLQkJCSAgICAgaW50IGZsYWcpCisJCQkgICAgIGludCBmbGFnLCBjb25zdCBzdHJ1Y3QgcmF0ZV9zYW1wbGUgKnJzKQogeworCWNvbnN0IHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNrKTsKKworCWlmIChpY3NrLT5pY3NrX2NhX29wcy0+Y29uZ19jb250cm9sKSB7CisJCWljc2stPmljc2tfY2Ffb3BzLT5jb25nX2NvbnRyb2woc2ssIHJzKTsKKwkJcmV0dXJuOworCX0KKwogCWlmICh0Y3BfaW5fY3duZF9yZWR1Y3Rpb24oc2spKSB7CiAJCS8qIFJlZHVjZSBjd25kIGlmIHN0YXRlIG1hbmRhdGVzICovCiAJCXRjcF9jd25kX3JlZHVjdGlvbihzaywgYWNrZWRfc2Fja2VkLCBmbGFnKTsKQEAgLTM1NzksMTcgKzM1NjcsMjEgQEAKIAlzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJc3RydWN0IHRjcF9zYWNrdGFnX3N0YXRlIHNhY2tfc3RhdGU7CisJc3RydWN0IHJhdGVfc2FtcGxlIHJzID0geyAucHJpb3JfZGVsaXZlcmVkID0gMCB9OwogCXUzMiBwcmlvcl9zbmRfdW5hID0gdHAtPnNuZF91bmE7CiAJdTMyIGFja19zZXEgPSBUQ1BfU0tCX0NCKHNrYiktPnNlcTsKIAl1MzIgYWNrID0gVENQX1NLQl9DQihza2IpLT5hY2tfc2VxOwogCWJvb2wgaXNfZHVwYWNrID0gZmFsc2U7CiAJdTMyIHByaW9yX2ZhY2tldHM7CiAJaW50IHByaW9yX3BhY2tldHMgPSB0cC0+cGFja2V0c19vdXQ7Ci0JdTMyIHByaW9yX2RlbGl2ZXJlZCA9IHRwLT5kZWxpdmVyZWQ7CisJdTMyIGRlbGl2ZXJlZCA9IHRwLT5kZWxpdmVyZWQ7CisJdTMyIGxvc3QgPSB0cC0+bG9zdDsKIAlpbnQgYWNrZWQgPSAwOyAvKiBOdW1iZXIgb2YgcGFja2V0cyBuZXdseSBhY2tlZCAqLwogCWludCByZXhtaXQgPSBSRVhNSVRfTk9ORTsgLyogRmxhZyB0byAocmUpdHJhbnNtaXQgdG8gcmVjb3ZlciBsb3NzZXMgKi8KKwlzdHJ1Y3Qgc2tiX21zdGFtcCBub3c7CiAKIAlzYWNrX3N0YXRlLmZpcnN0X3NhY2t0LnY2NCA9IDA7CisJc2Fja19zdGF0ZS5yYXRlID0gJnJzOwogCiAJLyogV2UgdmVyeSBsaWtlbHkgd2lsbCBuZWVkIHRvIGFjY2VzcyB3cml0ZSBxdWV1ZSBoZWFkLiAqLwogCXByZWZldGNodyhzay0+c2tfd3JpdGVfcXVldWUubmV4dCk7CkBAIC0zNjEyLDYgKzM2MDQsOCBAQAogCWlmIChhZnRlcihhY2ssIHRwLT5zbmRfbnh0KSkKIAkJZ290byBpbnZhbGlkX2FjazsKIAorCXNrYl9tc3RhbXBfZ2V0KCZub3cpOworCiAJaWYgKGljc2stPmljc2tfcGVuZGluZyA9PSBJQ1NLX1RJTUVfRUFSTFlfUkVUUkFOUyB8fAogCSAgICBpY3NrLT5pY3NrX3BlbmRpbmcgPT0gSUNTS19USU1FX0xPU1NfUFJPQkUpCiAJCXRjcF9yZWFybV9ydG8oc2spOwpAQCAtMzYyMiw2ICszNjE2LDcgQEAKIAl9CiAKIAlwcmlvcl9mYWNrZXRzID0gdHAtPmZhY2tldHNfb3V0OworCXJzLnByaW9yX2luX2ZsaWdodCA9IHRjcF9wYWNrZXRzX2luX2ZsaWdodCh0cCk7CiAKIAkvKiB0c19yZWNlbnQgdXBkYXRlIG11c3QgYmUgbWFkZSBhZnRlciB3ZSBhcmUgc3VyZSB0aGF0IHRoZSBwYWNrZXQKIAkgKiBpcyBpbiB3aW5kb3cuCkBAIC0zNjc3LDcgKzM2NzIsNyBAQAogCiAJLyogU2VlIGlmIHdlIGNhbiB0YWtlIGFueXRoaW5nIG9mZiBvZiB0aGUgcmV0cmFuc21pdCBxdWV1ZS4gKi8KIAlmbGFnIHw9IHRjcF9jbGVhbl9ydHhfcXVldWUoc2ssIHByaW9yX2ZhY2tldHMsIHByaW9yX3NuZF91bmEsICZhY2tlZCwKLQkJCQkgICAgJnNhY2tfc3RhdGUpOworCQkJCSAgICAmc2Fja19zdGF0ZSwgJm5vdyk7CiAKIAlpZiAodGNwX2Fja19pc19kdWJpb3VzKHNrLCBmbGFnKSkgewogCQlpc19kdXBhY2sgPSAhKGZsYWcgJiAoRkxBR19TTkRfVU5BX0FEVkFOQ0VEIHwgRkxBR19OT1RfRFVQKSk7CkBAIC0zNjk0LDcgKzM2ODksMTAgQEAKIAogCWlmIChpY3NrLT5pY3NrX3BlbmRpbmcgPT0gSUNTS19USU1FX1JFVFJBTlMpCiAJCXRjcF9zY2hlZHVsZV9sb3NzX3Byb2JlKHNrKTsKLQl0Y3BfY29uZ19jb250cm9sKHNrLCBhY2ssIHRwLT5kZWxpdmVyZWQgLSBwcmlvcl9kZWxpdmVyZWQsIGZsYWcpOworCWRlbGl2ZXJlZCA9IHRwLT5kZWxpdmVyZWQgLSBkZWxpdmVyZWQ7CS8qIGZyZXNobHkgQUNLZWQgb3IgU0FDS2VkICovCisJbG9zdCA9IHRwLT5sb3N0IC0gbG9zdDsJCQkvKiBmcmVzaGx5IG1hcmtlZCBsb3N0ICovCisJdGNwX3JhdGVfZ2VuKHNrLCBkZWxpdmVyZWQsIGxvc3QsICZub3csICZycyk7CisJdGNwX2NvbmdfY29udHJvbChzaywgYWNrLCBkZWxpdmVyZWQsIGZsYWcsICZycyk7CiAJdGNwX3htaXRfcmVjb3Zlcnkoc2ssIHJleG1pdCk7CiAJcmV0dXJuIDE7CiAKQEAgLTQxMDgsNyArNDEwNiw3IEBACiAJLyogSXQgX2lzXyBwb3NzaWJsZSwgdGhhdCB3ZSBoYXZlIHNvbWV0aGluZyBvdXQtb2Ytb3JkZXIgX2FmdGVyXyBGSU4uCiAJICogUHJvYmFibHksIHdlIHNob3VsZCByZXNldCBpbiB0aGlzIGNhc2UuIEZvciBub3cgZHJvcCB0aGVtLgogCSAqLwotCV9fc2tiX3F1ZXVlX3B1cmdlKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKKwlza2JfcmJ0cmVlX3B1cmdlKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKIAlpZiAodGNwX2lzX3NhY2sodHApKQogCQl0Y3Bfc2Fja19yZXNldCgmdHAtPnJ4X29wdCk7CiAJc2tfbWVtX3JlY2xhaW0oc2spOwpAQCAtNDI2OCw3ICs0MjY2LDcgQEAKIAlpbnQgdGhpc19zYWNrOwogCiAJLyogRW1wdHkgb2ZvIHF1ZXVlLCBoZW5jZSwgYWxsIHRoZSBTQUNLcyBhcmUgZWF0ZW4uIENsZWFyLiAqLwotCWlmIChza2JfcXVldWVfZW1wdHkoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpKSB7CisJaWYgKFJCX0VNUFRZX1JPT1QoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpKSB7CiAJCXRwLT5yeF9vcHQubnVtX3NhY2tzID0gMDsKIAkJcmV0dXJuOwogCX0KQEAgLTQzNDQsMTAgKzQzNDIsMTMgQEAKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlfX3UzMiBkc2Fja19oaWdoID0gdHAtPnJjdl9ueHQ7CisJYm9vbCBmaW4sIGZyYWdzdG9sZW4sIGVhdGVuOwogCXN0cnVjdCBza19idWZmICpza2IsICp0YWlsOwotCWJvb2wgZnJhZ3N0b2xlbiwgZWF0ZW47CisJc3RydWN0IHJiX25vZGUgKnA7CiAKLQl3aGlsZSAoKHNrYiA9IHNrYl9wZWVrKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkgIT0gTlVMTCkgeworCXAgPSByYl9maXJzdCgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CisJd2hpbGUgKHApIHsKKwkJc2tiID0gcmJfZW50cnkocCwgc3RydWN0IHNrX2J1ZmYsIHJibm9kZSk7CiAJCWlmIChhZnRlcihUQ1BfU0tCX0NCKHNrYiktPnNlcSwgdHAtPnJjdl9ueHQpKQogCQkJYnJlYWs7CiAKQEAgLTQzNTcsOSArNDM1OCwxMCBAQAogCQkJCWRzYWNrX2hpZ2ggPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7CiAJCQl0Y3BfZHNhY2tfZXh0ZW5kKHNrLCBUQ1BfU0tCX0NCKHNrYiktPnNlcSwgZHNhY2spOwogCQl9CisJCXAgPSByYl9uZXh0KHApOworCQlyYl9lcmFzZSgmc2tiLT5yYm5vZGUsICZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKIAotCQlfX3NrYl91bmxpbmsoc2tiLCAmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7Ci0JCWlmICghYWZ0ZXIoVENQX1NLQl9DQihza2IpLT5lbmRfc2VxLCB0cC0+cmN2X254dCkpIHsKKwkJaWYgKHVubGlrZWx5KCFhZnRlcihUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEsIHRwLT5yY3Zfbnh0KSkpIHsKIAkJCVNPQ0tfREVCVUcoc2ssICJvZm8gcGFja2V0IHdhcyBhbHJlYWR5IHJlY2VpdmVkXG4iKTsKIAkJCXRjcF9kcm9wKHNrLCBza2IpOwogCQkJY29udGludWU7CkBAIC00MzcxLDEyICs0MzczLDE5IEBACiAJCXRhaWwgPSBza2JfcGVla190YWlsKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CiAJCWVhdGVuID0gdGFpbCAmJiB0Y3BfdHJ5X2NvYWxlc2NlKHNrLCB0YWlsLCBza2IsICZmcmFnc3RvbGVuKTsKIAkJdGNwX3Jjdl9ueHRfdXBkYXRlKHRwLCBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEpOworCQlmaW4gPSBUQ1BfU0tCX0NCKHNrYiktPnRjcF9mbGFncyAmIFRDUEhEUl9GSU47CiAJCWlmICghZWF0ZW4pCiAJCQlfX3NrYl9xdWV1ZV90YWlsKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKLQkJaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+dGNwX2ZsYWdzICYgVENQSERSX0ZJTikKLQkJCXRjcF9maW4oc2spOwotCQlpZiAoZWF0ZW4pCisJCWVsc2UKIAkJCWtmcmVlX3NrYl9wYXJ0aWFsKHNrYiwgZnJhZ3N0b2xlbik7CisKKwkJaWYgKHVubGlrZWx5KGZpbikpIHsKKwkJCXRjcF9maW4oc2spOworCQkJLyogdGNwX2ZpbigpIHB1cmdlcyB0cC0+b3V0X29mX29yZGVyX3F1ZXVlLAorCQkJICogc28gd2UgbXVzdCBlbmQgdGhpcyBsb29wIHJpZ2h0IG5vdy4KKwkJCSAqLworCQkJYnJlYWs7CisJCX0KIAl9CiB9CiAKQEAgLTQzOTIsMTIgKzQ0MDEsOSBAQAogCQlpZiAodGNwX3BydW5lX3F1ZXVlKHNrKSA8IDApCiAJCQlyZXR1cm4gLTE7CiAKLQkJaWYgKCFza19ybWVtX3NjaGVkdWxlKHNrLCBza2IsIHNpemUpKSB7CisJCXdoaWxlICghc2tfcm1lbV9zY2hlZHVsZShzaywgc2tiLCBzaXplKSkgewogCQkJaWYgKCF0Y3BfcHJ1bmVfb2ZvX3F1ZXVlKHNrKSkKIAkJCQlyZXR1cm4gLTE7Ci0KLQkJCWlmICghc2tfcm1lbV9zY2hlZHVsZShzaywgc2tiLCBzaXplKSkKLQkJCQlyZXR1cm4gLTE7CiAJCX0KIAl9CiAJcmV0dXJuIDA7CkBAIC00NDA2LDggKzQ0MTIsMTAgQEAKIHN0YXRpYyB2b2lkIHRjcF9kYXRhX3F1ZXVlX29mbyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IHJiX25vZGUgKipwLCAqcSwgKnBhcmVudDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMTsKIAl1MzIgc2VxLCBlbmRfc2VxOworCWJvb2wgZnJhZ3N0b2xlbjsKIAogCXRjcF9lY25fY2hlY2tfY2UodHAsIHNrYik7CiAKQEAgLTQ0MjIsODggKzQ0MzAsOTIgQEAKIAlpbmV0X2Nza19zY2hlZHVsZV9hY2soc2spOwogCiAJTkVUX0lOQ19TVEFUUyhzb2NrX25ldChzayksIExJTlVYX01JQl9UQ1BPRk9RVUVVRSk7CisJc2VxID0gVENQX1NLQl9DQihza2IpLT5zZXE7CisJZW5kX3NlcSA9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKIAlTT0NLX0RFQlVHKHNrLCAib3V0IG9mIG9yZGVyIHNlZ21lbnQ6IHJjdl9uZXh0ICVYIHNlcSAlWCAtICVYXG4iLAotCQkgICB0cC0+cmN2X254dCwgVENQX1NLQl9DQihza2IpLT5zZXEsIFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSk7CisJCSAgIHRwLT5yY3Zfbnh0LCBzZXEsIGVuZF9zZXEpOwogCi0Jc2tiMSA9IHNrYl9wZWVrX3RhaWwoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOwotCWlmICghc2tiMSkgeworCXAgPSAmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZS5yYl9ub2RlOworCWlmIChSQl9FTVBUWV9ST09UKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkgewogCQkvKiBJbml0aWFsIG91dCBvZiBvcmRlciBzZWdtZW50LCBidWlsZCAxIFNBQ0suICovCiAJCWlmICh0Y3BfaXNfc2Fjayh0cCkpIHsKIAkJCXRwLT5yeF9vcHQubnVtX3NhY2tzID0gMTsKLQkJCXRwLT5zZWxlY3RpdmVfYWNrc1swXS5zdGFydF9zZXEgPSBUQ1BfU0tCX0NCKHNrYiktPnNlcTsKLQkJCXRwLT5zZWxlY3RpdmVfYWNrc1swXS5lbmRfc2VxID0KLQkJCQkJCVRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKKwkJCXRwLT5zZWxlY3RpdmVfYWNrc1swXS5zdGFydF9zZXEgPSBzZXE7CisJCQl0cC0+c2VsZWN0aXZlX2Fja3NbMF0uZW5kX3NlcSA9IGVuZF9zZXE7CiAJCX0KLQkJX19za2JfcXVldWVfaGVhZCgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSwgc2tiKTsKKwkJcmJfbGlua19ub2RlKCZza2ItPnJibm9kZSwgTlVMTCwgcCk7CisJCXJiX2luc2VydF9jb2xvcigmc2tiLT5yYm5vZGUsICZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKKwkJdHAtPm9vb19sYXN0X3NrYiA9IHNrYjsKIAkJZ290byBlbmQ7CiAJfQogCi0Jc2VxID0gVENQX1NLQl9DQihza2IpLT5zZXE7Ci0JZW5kX3NlcSA9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKLQotCWlmIChzZXEgPT0gVENQX1NLQl9DQihza2IxKS0+ZW5kX3NlcSkgewotCQlib29sIGZyYWdzdG9sZW47Ci0KLQkJaWYgKCF0Y3BfdHJ5X2NvYWxlc2NlKHNrLCBza2IxLCBza2IsICZmcmFnc3RvbGVuKSkgewotCQkJX19za2JfcXVldWVfYWZ0ZXIoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUsIHNrYjEsIHNrYik7Ci0JCX0gZWxzZSB7Ci0JCQl0Y3BfZ3Jvd193aW5kb3coc2ssIHNrYik7Ci0JCQlrZnJlZV9za2JfcGFydGlhbChza2IsIGZyYWdzdG9sZW4pOwotCQkJc2tiID0gTlVMTDsKLQkJfQotCi0JCWlmICghdHAtPnJ4X29wdC5udW1fc2Fja3MgfHwKLQkJICAgIHRwLT5zZWxlY3RpdmVfYWNrc1swXS5lbmRfc2VxICE9IHNlcSkKLQkJCWdvdG8gYWRkX3NhY2s7Ci0KLQkJLyogQ29tbW9uIGNhc2U6IGRhdGEgYXJyaXZlIGluIG9yZGVyIGFmdGVyIGhvbGUuICovCi0JCXRwLT5zZWxlY3RpdmVfYWNrc1swXS5lbmRfc2VxID0gZW5kX3NlcTsKLQkJZ290byBlbmQ7CisJLyogSW4gdGhlIHR5cGljYWwgY2FzZSwgd2UgYXJlIGFkZGluZyBhbiBza2IgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4KKwkgKiBVc2Ugb2Ygb29vX2xhc3Rfc2tiIGF2b2lkcyB0aGUgTyhMb2coTikpIHJidHJlZSBsb29rdXAuCisJICovCisJaWYgKHRjcF90cnlfY29hbGVzY2Uoc2ssIHRwLT5vb29fbGFzdF9za2IsIHNrYiwgJmZyYWdzdG9sZW4pKSB7Citjb2FsZXNjZV9kb25lOgorCQl0Y3BfZ3Jvd193aW5kb3coc2ssIHNrYik7CisJCWtmcmVlX3NrYl9wYXJ0aWFsKHNrYiwgZnJhZ3N0b2xlbik7CisJCXNrYiA9IE5VTEw7CisJCWdvdG8gYWRkX3NhY2s7CisJfQorCS8qIENhbiBhdm9pZCBhbiByYnRyZWUgbG9va3VwIGlmIHdlIGFyZSBhZGRpbmcgc2tiIGFmdGVyIG9vb19sYXN0X3NrYiAqLworCWlmICghYmVmb3JlKHNlcSwgVENQX1NLQl9DQih0cC0+b29vX2xhc3Rfc2tiKS0+ZW5kX3NlcSkpIHsKKwkJcGFyZW50ID0gJnRwLT5vb29fbGFzdF9za2ItPnJibm9kZTsKKwkJcCA9ICZwYXJlbnQtPnJiX3JpZ2h0OworCQlnb3RvIGluc2VydDsKIAl9CiAKLQkvKiBGaW5kIHBsYWNlIHRvIGluc2VydCB0aGlzIHNlZ21lbnQuICovCi0Jd2hpbGUgKDEpIHsKLQkJaWYgKCFhZnRlcihUQ1BfU0tCX0NCKHNrYjEpLT5zZXEsIHNlcSkpCi0JCQlicmVhazsKLQkJaWYgKHNrYl9xdWV1ZV9pc19maXJzdCgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSwgc2tiMSkpIHsKLQkJCXNrYjEgPSBOVUxMOwotCQkJYnJlYWs7CisJLyogRmluZCBwbGFjZSB0byBpbnNlcnQgdGhpcyBzZWdtZW50LiBIYW5kbGUgb3ZlcmxhcHMgb24gdGhlIHdheS4gKi8KKwlwYXJlbnQgPSBOVUxMOworCXdoaWxlICgqcCkgeworCQlwYXJlbnQgPSAqcDsKKwkJc2tiMSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IHNrX2J1ZmYsIHJibm9kZSk7CisJCWlmIChiZWZvcmUoc2VxLCBUQ1BfU0tCX0NCKHNrYjEpLT5zZXEpKSB7CisJCQlwID0gJnBhcmVudC0+cmJfbGVmdDsKKwkJCWNvbnRpbnVlOwogCQl9Ci0JCXNrYjEgPSBza2JfcXVldWVfcHJldigmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSwgc2tiMSk7CisJCWlmIChiZWZvcmUoc2VxLCBUQ1BfU0tCX0NCKHNrYjEpLT5lbmRfc2VxKSkgeworCQkJaWYgKCFhZnRlcihlbmRfc2VxLCBUQ1BfU0tCX0NCKHNrYjEpLT5lbmRfc2VxKSkgeworCQkJCS8qIEFsbCB0aGUgYml0cyBhcmUgcHJlc2VudC4gRHJvcC4gKi8KKwkJCQlORVRfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwKKwkJCQkJICAgICAgTElOVVhfTUlCX1RDUE9GT01FUkdFKTsKKwkJCQlfX2tmcmVlX3NrYihza2IpOworCQkJCXNrYiA9IE5VTEw7CisJCQkJdGNwX2RzYWNrX3NldChzaywgc2VxLCBlbmRfc2VxKTsKKwkJCQlnb3RvIGFkZF9zYWNrOworCQkJfQorCQkJaWYgKGFmdGVyKHNlcSwgVENQX1NLQl9DQihza2IxKS0+c2VxKSkgeworCQkJCS8qIFBhcnRpYWwgb3ZlcmxhcC4gKi8KKwkJCQl0Y3BfZHNhY2tfc2V0KHNrLCBzZXEsIFRDUF9TS0JfQ0Ioc2tiMSktPmVuZF9zZXEpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBza2IncyBzZXEgPT0gc2tiMSdzIHNlcSBhbmQgc2tiIGNvdmVycyBza2IxLgorCQkJCSAqIFJlcGxhY2Ugc2tiMSB3aXRoIHNrYi4KKwkJCQkgKi8KKwkJCQlyYl9yZXBsYWNlX25vZGUoJnNrYjEtPnJibm9kZSwgJnNrYi0+cmJub2RlLAorCQkJCQkJJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOworCQkJCXRjcF9kc2Fja19leHRlbmQoc2ssCisJCQkJCQkgVENQX1NLQl9DQihza2IxKS0+c2VxLAorCQkJCQkJIFRDUF9TS0JfQ0Ioc2tiMSktPmVuZF9zZXEpOworCQkJCU5FVF9JTkNfU1RBVFMoc29ja19uZXQoc2spLAorCQkJCQkgICAgICBMSU5VWF9NSUJfVENQT0ZPTUVSR0UpOworCQkJCV9fa2ZyZWVfc2tiKHNrYjEpOworCQkJCWdvdG8gbWVyZ2VfcmlnaHQ7CisJCQl9CisJCX0gZWxzZSBpZiAodGNwX3RyeV9jb2FsZXNjZShzaywgc2tiMSwgc2tiLCAmZnJhZ3N0b2xlbikpIHsKKwkJCWdvdG8gY29hbGVzY2VfZG9uZTsKKwkJfQorCQlwID0gJnBhcmVudC0+cmJfcmlnaHQ7CiAJfQoraW5zZXJ0OgorCS8qIEluc2VydCBzZWdtZW50IGludG8gUkIgdHJlZS4gKi8KKwlyYl9saW5rX25vZGUoJnNrYi0+cmJub2RlLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcigmc2tiLT5yYm5vZGUsICZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKIAotCS8qIERvIHNrYiBvdmVybGFwIHRvIHByZXZpb3VzIG9uZT8gKi8KLQlpZiAoc2tiMSAmJiBiZWZvcmUoc2VxLCBUQ1BfU0tCX0NCKHNrYjEpLT5lbmRfc2VxKSkgewotCQlpZiAoIWFmdGVyKGVuZF9zZXEsIFRDUF9TS0JfQ0Ioc2tiMSktPmVuZF9zZXEpKSB7Ci0JCQkvKiBBbGwgdGhlIGJpdHMgYXJlIHByZXNlbnQuIERyb3AuICovCi0JCQlORVRfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX1RDUE9GT01FUkdFKTsKLQkJCXRjcF9kcm9wKHNrLCBza2IpOwotCQkJc2tiID0gTlVMTDsKLQkJCXRjcF9kc2Fja19zZXQoc2ssIHNlcSwgZW5kX3NlcSk7Ci0JCQlnb3RvIGFkZF9zYWNrOwotCQl9Ci0JCWlmIChhZnRlcihzZXEsIFRDUF9TS0JfQ0Ioc2tiMSktPnNlcSkpIHsKLQkJCS8qIFBhcnRpYWwgb3ZlcmxhcC4gKi8KLQkJCXRjcF9kc2Fja19zZXQoc2ssIHNlcSwKLQkJCQkgICAgICBUQ1BfU0tCX0NCKHNrYjEpLT5lbmRfc2VxKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChza2JfcXVldWVfaXNfZmlyc3QoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUsCi0JCQkJCSAgICAgICBza2IxKSkKLQkJCQlza2IxID0gTlVMTDsKLQkJCWVsc2UKLQkJCQlza2IxID0gc2tiX3F1ZXVlX3ByZXYoCi0JCQkJCSZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlLAotCQkJCQlza2IxKTsKLQkJfQotCX0KLQlpZiAoIXNrYjEpCi0JCV9fc2tiX3F1ZXVlX2hlYWQoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUsIHNrYik7Ci0JZWxzZQotCQlfX3NrYl9xdWV1ZV9hZnRlcigmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSwgc2tiMSwgc2tiKTsKLQotCS8qIEFuZCBjbGVhbiBzZWdtZW50cyBjb3ZlcmVkIGJ5IG5ldyBvbmUgYXMgd2hvbGUuICovCi0Jd2hpbGUgKCFza2JfcXVldWVfaXNfbGFzdCgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSwgc2tiKSkgewotCQlza2IxID0gc2tiX3F1ZXVlX25leHQoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUsIHNrYik7CittZXJnZV9yaWdodDoKKwkvKiBSZW1vdmUgb3RoZXIgc2VnbWVudHMgY292ZXJlZCBieSBza2IuICovCisJd2hpbGUgKChxID0gcmJfbmV4dCgmc2tiLT5yYm5vZGUpKSAhPSBOVUxMKSB7CisJCXNrYjEgPSByYl9lbnRyeShxLCBzdHJ1Y3Qgc2tfYnVmZiwgcmJub2RlKTsKIAogCQlpZiAoIWFmdGVyKGVuZF9zZXEsIFRDUF9TS0JfQ0Ioc2tiMSktPnNlcSkpCiAJCQlicmVhazsKQEAgLTQ1MTIsMTIgKzQ1MjQsMTUgQEAKIAkJCQkJIGVuZF9zZXEpOwogCQkJYnJlYWs7CiAJCX0KLQkJX19za2JfdW5saW5rKHNrYjEsICZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKKwkJcmJfZXJhc2UoJnNrYjEtPnJibm9kZSwgJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOwogCQl0Y3BfZHNhY2tfZXh0ZW5kKHNrLCBUQ1BfU0tCX0NCKHNrYjEpLT5zZXEsCiAJCQkJIFRDUF9TS0JfQ0Ioc2tiMSktPmVuZF9zZXEpOwogCQlORVRfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX1RDUE9GT01FUkdFKTsKIAkJdGNwX2Ryb3Aoc2ssIHNrYjEpOwogCX0KKwkvKiBJZiB0aGVyZSBpcyBubyBza2IgYWZ0ZXIgdXMsIHdlIGFyZSB0aGUgbGFzdF9za2IgISAqLworCWlmICghcSkKKwkJdHAtPm9vb19sYXN0X3NrYiA9IHNrYjsKIAogYWRkX3NhY2s6CiAJaWYgKHRjcF9pc19zYWNrKHRwKSkKQEAgLTQ2NTQsMTMgKzQ2NjksMTMgQEAKIAkJaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+dGNwX2ZsYWdzICYgVENQSERSX0ZJTikKIAkJCXRjcF9maW4oc2spOwogCi0JCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkgeworCQlpZiAoIVJCX0VNUFRZX1JPT1QoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpKSB7CiAJCQl0Y3Bfb2ZvX3F1ZXVlKHNrKTsKIAogCQkJLyogUkZDMjU4MS4gNC4yLiBTSE9VTEQgc2VuZCBpbW1lZGlhdGUgQUNLLCB3aGVuCiAJCQkgKiBnYXAgaW4gcXVldWUgaXMgZmlsbGVkLgogCQkJICovCi0JCQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkKKwkJCWlmIChSQl9FTVBUWV9ST09UKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkKIAkJCQlpbmV0X2NzayhzayktPmljc2tfYWNrLnBpbmdwb25nID0gMDsKIAkJfQogCkBAIC00NzE0LDQ4ICs0NzI5LDc2IEBACiAJdGNwX2RhdGFfcXVldWVfb2ZvKHNrLCBza2IpOwogfQogCi1zdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnRjcF9jb2xsYXBzZV9vbmUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0KQorc3RhdGljIHN0cnVjdCBza19idWZmICp0Y3Bfc2tiX25leHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqbmV4dCA9IE5VTEw7CisJaWYgKGxpc3QpCisJCXJldHVybiAhc2tiX3F1ZXVlX2lzX2xhc3QobGlzdCwgc2tiKSA/IHNrYi0+bmV4dCA6IE5VTEw7CiAKLQlpZiAoIXNrYl9xdWV1ZV9pc19sYXN0KGxpc3QsIHNrYikpCi0JCW5leHQgPSBza2JfcXVldWVfbmV4dChsaXN0LCBza2IpOworCXJldHVybiByYl9lbnRyeV9zYWZlKHJiX25leHQoJnNrYi0+cmJub2RlKSwgc3RydWN0IHNrX2J1ZmYsIHJibm9kZSk7Cit9CiAKLQlfX3NrYl91bmxpbmsoc2tiLCBsaXN0KTsKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqdGNwX2NvbGxhcHNlX29uZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCXN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QsCisJCQkJCXN0cnVjdCByYl9yb290ICpyb290KQoreworCXN0cnVjdCBza19idWZmICpuZXh0ID0gdGNwX3NrYl9uZXh0KHNrYiwgbGlzdCk7CisKKwlpZiAobGlzdCkKKwkJX19za2JfdW5saW5rKHNrYiwgbGlzdCk7CisJZWxzZQorCQlyYl9lcmFzZSgmc2tiLT5yYm5vZGUsIHJvb3QpOworCiAJX19rZnJlZV9za2Ioc2tiKTsKIAlORVRfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX1RDUFJDVkNPTExBUFNFRCk7CiAKIAlyZXR1cm4gbmV4dDsKIH0KIAorLyogSW5zZXJ0IHNrYiBpbnRvIHJiIHRyZWUsIG9yZGVyZWQgYnkgVENQX1NLQl9DQihza2IpLT5zZXEgKi8KK3N0YXRpYyB2b2lkIHRjcF9yYnRyZWVfaW5zZXJ0KHN0cnVjdCByYl9yb290ICpyb290LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZyb290LT5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpza2IxOworCisJd2hpbGUgKCpwKSB7CisJCXBhcmVudCA9ICpwOworCQlza2IxID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3Qgc2tfYnVmZiwgcmJub2RlKTsKKwkJaWYgKGJlZm9yZShUQ1BfU0tCX0NCKHNrYiktPnNlcSwgVENQX1NLQl9DQihza2IxKS0+c2VxKSkKKwkJCXAgPSAmcGFyZW50LT5yYl9sZWZ0OworCQllbHNlCisJCQlwID0gJnBhcmVudC0+cmJfcmlnaHQ7CisJfQorCXJiX2xpbmtfbm9kZSgmc2tiLT5yYm5vZGUsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKCZza2ItPnJibm9kZSwgcm9vdCk7Cit9CisKIC8qIENvbGxhcHNlIGNvbnRpZ3VvdXMgc2VxdWVuY2Ugb2Ygc2ticyBoZWFkLi50YWlsIHdpdGgKICAqIHNlcXVlbmNlIG51bWJlcnMgc3RhcnQuLmVuZC4KICAqCi0gKiBJZiB0YWlsIGlzIE5VTEwsIHRoaXMgbWVhbnMgdW50aWwgdGhlIGVuZCBvZiB0aGUgbGlzdC4KKyAqIElmIHRhaWwgaXMgTlVMTCwgdGhpcyBtZWFucyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBxdWV1ZS4KICAqCiAgKiBTZWdtZW50cyB3aXRoIEZJTi9TWU4gYXJlIG5vdCBjb2xsYXBzZWQgKG9ubHkgYmVjYXVzZSB0aGlzCiAgKiBzaW1wbGlmaWVzIGNvZGUpCiAgKi8KIHN0YXRpYyB2b2lkCi10Y3BfY29sbGFwc2Uoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0LAotCSAgICAgc3RydWN0IHNrX2J1ZmYgKmhlYWQsIHN0cnVjdCBza19idWZmICp0YWlsLAotCSAgICAgdTMyIHN0YXJ0LCB1MzIgZW5kKQordGNwX2NvbGxhcHNlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCwgc3RydWN0IHJiX3Jvb3QgKnJvb3QsCisJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqaGVhZCwgc3RydWN0IHNrX2J1ZmYgKnRhaWwsIHUzMiBzdGFydCwgdTMyIGVuZCkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gaGVhZCwgKm47CisJc3RydWN0IHNrX2J1ZmZfaGVhZCB0bXA7CiAJYm9vbCBlbmRfb2Zfc2ticzsKIAogCS8qIEZpcnN0LCBjaGVjayB0aGF0IHF1ZXVlIGlzIGNvbGxhcHNpYmxlIGFuZCBmaW5kCi0JICogdGhlIHBvaW50IHdoZXJlIGNvbGxhcHNpbmcgY2FuIGJlIHVzZWZ1bC4gKi8KLQlza2IgPSBoZWFkOworCSAqIHRoZSBwb2ludCB3aGVyZSBjb2xsYXBzaW5nIGNhbiBiZSB1c2VmdWwuCisJICovCiByZXN0YXJ0OgotCWVuZF9vZl9za2JzID0gdHJ1ZTsKLQlza2JfcXVldWVfd2Fsa19mcm9tX3NhZmUobGlzdCwgc2tiLCBuKSB7Ci0JCWlmIChza2IgPT0gdGFpbCkKLQkJCWJyZWFrOworCWZvciAoZW5kX29mX3NrYnMgPSB0cnVlOyBza2IgIT0gTlVMTCAmJiBza2IgIT0gdGFpbDsgc2tiID0gbikgeworCQluID0gdGNwX3NrYl9uZXh0KHNrYiwgbGlzdCk7CisKIAkJLyogTm8gbmV3IGJpdHM/IEl0IGlzIHBvc3NpYmxlIG9uIG9mbyBxdWV1ZS4gKi8KIAkJaWYgKCFiZWZvcmUoc3RhcnQsIFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSkpIHsKLQkJCXNrYiA9IHRjcF9jb2xsYXBzZV9vbmUoc2ssIHNrYiwgbGlzdCk7CisJCQlza2IgPSB0Y3BfY29sbGFwc2Vfb25lKHNrLCBza2IsIGxpc3QsIHJvb3QpOwogCQkJaWYgKCFza2IpCiAJCQkJYnJlYWs7CiAJCQlnb3RvIHJlc3RhcnQ7CkBAIC00NzczLDEzICs0ODE2LDEwIEBACiAJCQlicmVhazsKIAkJfQogCi0JCWlmICghc2tiX3F1ZXVlX2lzX2xhc3QobGlzdCwgc2tiKSkgewotCQkJc3RydWN0IHNrX2J1ZmYgKm5leHQgPSBza2JfcXVldWVfbmV4dChsaXN0LCBza2IpOwotCQkJaWYgKG5leHQgIT0gdGFpbCAmJgotCQkJICAgIFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSAhPSBUQ1BfU0tCX0NCKG5leHQpLT5zZXEpIHsKLQkJCQllbmRfb2Zfc2ticyA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQorCQlpZiAobiAmJiBuICE9IHRhaWwgJiYKKwkJICAgIFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSAhPSBUQ1BfU0tCX0NCKG4pLT5zZXEpIHsKKwkJCWVuZF9vZl9za2JzID0gZmFsc2U7CisJCQlicmVhazsKIAkJfQogCiAJCS8qIERlY2lkZWQgdG8gc2tpcCB0aGlzLCBhZHZhbmNlIHN0YXJ0IHNlcS4gKi8KQEAgLTQ3ODksMTcgKzQ4MjksMjIgQEAKIAkgICAgKFRDUF9TS0JfQ0Ioc2tiKS0+dGNwX2ZsYWdzICYgKFRDUEhEUl9TWU4gfCBUQ1BIRFJfRklOKSkpCiAJCXJldHVybjsKIAorCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmdG1wKTsKKwogCXdoaWxlIChiZWZvcmUoc3RhcnQsIGVuZCkpIHsKIAkJaW50IGNvcHkgPSBtaW5fdChpbnQsIFNLQl9NQVhfT1JERVIoMCwgMCksIGVuZCAtIHN0YXJ0KTsKIAkJc3RydWN0IHNrX2J1ZmYgKm5za2I7CiAKIAkJbnNrYiA9IGFsbG9jX3NrYihjb3B5LCBHRlBfQVRPTUlDKTsKIAkJaWYgKCFuc2tiKQotCQkJcmV0dXJuOworCQkJYnJlYWs7CiAKIAkJbWVtY3B5KG5za2ItPmNiLCBza2ItPmNiLCBzaXplb2Yoc2tiLT5jYikpOwogCQlUQ1BfU0tCX0NCKG5za2IpLT5zZXEgPSBUQ1BfU0tCX0NCKG5za2IpLT5lbmRfc2VxID0gc3RhcnQ7Ci0JCV9fc2tiX3F1ZXVlX2JlZm9yZShsaXN0LCBza2IsIG5za2IpOworCQlpZiAobGlzdCkKKwkJCV9fc2tiX3F1ZXVlX2JlZm9yZShsaXN0LCBza2IsIG5za2IpOworCQllbHNlCisJCQlfX3NrYl9xdWV1ZV90YWlsKCZ0bXAsIG5za2IpOyAvKiBkZWZlciByYnRyZWUgaW5zZXJ0aW9uICovCiAJCXNrYl9zZXRfb3duZXJfcihuc2tiLCBzayk7CiAKIAkJLyogQ29weSBkYXRhLCByZWxlYXNpbmcgY29sbGFwc2VkIHNrYnMuICovCkBAIC00ODE3LDE0ICs0ODYyLDE3IEBACiAJCQkJc3RhcnQgKz0gc2l6ZTsKIAkJCX0KIAkJCWlmICghYmVmb3JlKHN0YXJ0LCBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEpKSB7Ci0JCQkJc2tiID0gdGNwX2NvbGxhcHNlX29uZShzaywgc2tiLCBsaXN0KTsKKwkJCQlza2IgPSB0Y3BfY29sbGFwc2Vfb25lKHNrLCBza2IsIGxpc3QsIHJvb3QpOwogCQkJCWlmICghc2tiIHx8CiAJCQkJICAgIHNrYiA9PSB0YWlsIHx8CiAJCQkJICAgIChUQ1BfU0tCX0NCKHNrYiktPnRjcF9mbGFncyAmIChUQ1BIRFJfU1lOIHwgVENQSERSX0ZJTikpKQotCQkJCQlyZXR1cm47CisJCQkJCWdvdG8gZW5kOwogCQkJfQogCQl9CiAJfQorZW5kOgorCXNrYl9xdWV1ZV93YWxrX3NhZmUoJnRtcCwgc2tiLCBuKQorCQl0Y3BfcmJ0cmVlX2luc2VydChyb290LCBza2IpOwogfQogCiAvKiBDb2xsYXBzZSBvZm8gcXVldWUuIEFsZ29yaXRobTogc2VsZWN0IGNvbnRpZ3VvdXMgc2VxdWVuY2Ugb2Ygc2ticwpAQCAtNDgzMyw3MCArNDg4MSw4NiBAQAogc3RhdGljIHZvaWQgdGNwX2NvbGxhcHNlX29mb19xdWV1ZShzdHJ1Y3Qgc29jayAqc2spCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrYl9wZWVrKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqaGVhZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqaGVhZDsKKwlzdHJ1Y3QgcmJfbm9kZSAqcDsKIAl1MzIgc3RhcnQsIGVuZDsKIAotCWlmICghc2tiKQorCXAgPSByYl9maXJzdCgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CisJc2tiID0gcmJfZW50cnlfc2FmZShwLCBzdHJ1Y3Qgc2tfYnVmZiwgcmJub2RlKTsKK25ld19yYW5nZToKKwlpZiAoIXNrYikgeworCQlwID0gcmJfbGFzdCgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CisJCS8qIE5vdGU6IFRoaXMgaXMgcG9zc2libGUgcCBpcyBOVUxMIGhlcmUuIFdlIGRvIG5vdAorCQkgKiB1c2UgcmJfZW50cnlfc2FmZSgpLCBhcyBvb29fbGFzdF9za2IgaXMgdmFsaWQgb25seQorCQkgKiBpZiByYnRyZWUgaXMgbm90IGVtcHR5LgorCQkgKi8KKwkJdHAtPm9vb19sYXN0X3NrYiA9IHJiX2VudHJ5KHAsIHN0cnVjdCBza19idWZmLCByYm5vZGUpOwogCQlyZXR1cm47Ci0KKwl9CiAJc3RhcnQgPSBUQ1BfU0tCX0NCKHNrYiktPnNlcTsKIAllbmQgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7Ci0JaGVhZCA9IHNrYjsKIAotCWZvciAoOzspIHsKLQkJc3RydWN0IHNrX2J1ZmYgKm5leHQgPSBOVUxMOworCWZvciAoaGVhZCA9IHNrYjs7KSB7CisJCXNrYiA9IHRjcF9za2JfbmV4dChza2IsIE5VTEwpOwogCi0JCWlmICghc2tiX3F1ZXVlX2lzX2xhc3QoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUsIHNrYikpCi0JCQluZXh0ID0gc2tiX3F1ZXVlX25leHQoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUsIHNrYik7Ci0JCXNrYiA9IG5leHQ7Ci0KLQkJLyogU2VnbWVudCBpcyB0ZXJtaW5hdGVkIHdoZW4gd2Ugc2VlIGdhcCBvciB3aGVuCi0JCSAqIHdlIGFyZSBhdCB0aGUgZW5kIG9mIGFsbCB0aGUgcXVldWUuICovCisJCS8qIFJhbmdlIGlzIHRlcm1pbmF0ZWQgd2hlbiB3ZSBzZWUgYSBnYXAgb3Igd2hlbgorCQkgKiB3ZSBhcmUgYXQgdGhlIHF1ZXVlIGVuZC4KKwkJICovCiAJCWlmICghc2tiIHx8CiAJCSAgICBhZnRlcihUQ1BfU0tCX0NCKHNrYiktPnNlcSwgZW5kKSB8fAogCQkgICAgYmVmb3JlKFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSwgc3RhcnQpKSB7Ci0JCQl0Y3BfY29sbGFwc2Uoc2ssICZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlLAorCQkJdGNwX2NvbGxhcHNlKHNrLCBOVUxMLCAmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSwKIAkJCQkgICAgIGhlYWQsIHNrYiwgc3RhcnQsIGVuZCk7Ci0JCQloZWFkID0gc2tiOwotCQkJaWYgKCFza2IpCi0JCQkJYnJlYWs7Ci0JCQkvKiBTdGFydCBuZXcgc2VnbWVudCAqLwotCQkJc3RhcnQgPSBUQ1BfU0tCX0NCKHNrYiktPnNlcTsKLQkJCWVuZCA9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKLQkJfSBlbHNlIHsKLQkJCWlmIChiZWZvcmUoVENQX1NLQl9DQihza2IpLT5zZXEsIHN0YXJ0KSkKLQkJCQlzdGFydCA9IFRDUF9TS0JfQ0Ioc2tiKS0+c2VxOwotCQkJaWYgKGFmdGVyKFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSwgZW5kKSkKLQkJCQllbmQgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7CisJCQlnb3RvIG5ld19yYW5nZTsKIAkJfQorCisJCWlmICh1bmxpa2VseShiZWZvcmUoVENQX1NLQl9DQihza2IpLT5zZXEsIHN0YXJ0KSkpCisJCQlzdGFydCA9IFRDUF9TS0JfQ0Ioc2tiKS0+c2VxOworCQlpZiAoYWZ0ZXIoVENQX1NLQl9DQihza2IpLT5lbmRfc2VxLCBlbmQpKQorCQkJZW5kID0gVENQX1NLQl9DQihza2IpLT5lbmRfc2VxOwogCX0KIH0KIAogLyoKLSAqIFB1cmdlIHRoZSBvdXQtb2Ytb3JkZXIgcXVldWUuCi0gKiBSZXR1cm4gdHJ1ZSBpZiBxdWV1ZSB3YXMgcHJ1bmVkLgorICogQ2xlYW4gdGhlIG91dC1vZi1vcmRlciBxdWV1ZSB0byBtYWtlIHJvb20uCisgKiBXZSBkcm9wIGhpZ2ggc2VxdWVuY2VzIHBhY2tldHMgdG8gOgorICogMSkgTGV0IGEgY2hhbmNlIGZvciBob2xlcyB0byBiZSBmaWxsZWQuCisgKiAyKSBub3QgYWRkIHRvbyBiaWcgbGF0ZW5jaWVzIGlmIHRob3VzYW5kcyBvZiBwYWNrZXRzIHNpdCB0aGVyZS4KKyAqICAgIChCdXQgaWYgYXBwbGljYXRpb24gc2hyaW5rcyBTT19SQ1ZCVUYsIHdlIGNvdWxkIHN0aWxsIGVuZCB1cAorICogICAgIGZyZWVpbmcgd2hvbGUgcXVldWUgaGVyZSkKKyAqCisgKiBSZXR1cm4gdHJ1ZSBpZiBxdWV1ZSBoYXMgc2hydW5rLgogICovCiBzdGF0aWMgYm9vbCB0Y3BfcHJ1bmVfb2ZvX3F1ZXVlKHN0cnVjdCBzb2NrICpzaykKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKLQlib29sIHJlcyA9IGZhbHNlOworCXN0cnVjdCByYl9ub2RlICpub2RlLCAqcHJldjsKIAotCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkgewotCQlORVRfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX09GT1BSVU5FRCk7Ci0JCV9fc2tiX3F1ZXVlX3B1cmdlKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKKwlpZiAoUkJfRU1QVFlfUk9PVCgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSkpCisJCXJldHVybiBmYWxzZTsKIAotCQkvKiBSZXNldCBTQUNLIHN0YXRlLiAgQSBjb25mb3JtaW5nIFNBQ0sgaW1wbGVtZW50YXRpb24gd2lsbAotCQkgKiBkbyB0aGUgc2FtZSBhdCBhIHRpbWVvdXQgYmFzZWQgcmV0cmFuc21pdC4gIFdoZW4gYSBjb25uZWN0aW9uCi0JCSAqIGlzIGluIGEgc2FkIHN0YXRlIGxpa2UgdGhpcywgd2UgY2FyZSBvbmx5IGFib3V0IGludGVncml0eQotCQkgKiBvZiB0aGUgY29ubmVjdGlvbiBub3QgcGVyZm9ybWFuY2UuCi0JCSAqLwotCQlpZiAodHAtPnJ4X29wdC5zYWNrX29rKQotCQkJdGNwX3NhY2tfcmVzZXQoJnRwLT5yeF9vcHQpOworCU5FVF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBMSU5VWF9NSUJfT0ZPUFJVTkVEKTsKKwlub2RlID0gJnRwLT5vb29fbGFzdF9za2ItPnJibm9kZTsKKwlkbyB7CisJCXByZXYgPSByYl9wcmV2KG5vZGUpOworCQlyYl9lcmFzZShub2RlLCAmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CisJCXRjcF9kcm9wKHNrLCByYl9lbnRyeShub2RlLCBzdHJ1Y3Qgc2tfYnVmZiwgcmJub2RlKSk7CiAJCXNrX21lbV9yZWNsYWltKHNrKTsKLQkJcmVzID0gdHJ1ZTsKLQl9Ci0JcmV0dXJuIHJlczsKKwkJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgPD0gc2stPnNrX3JjdmJ1ZiAmJgorCQkgICAgIXRjcF91bmRlcl9tZW1vcnlfcHJlc3N1cmUoc2spKQorCQkJYnJlYWs7CisJCW5vZGUgPSBwcmV2OworCX0gd2hpbGUgKG5vZGUpOworCXRwLT5vb29fbGFzdF9za2IgPSByYl9lbnRyeShwcmV2LCBzdHJ1Y3Qgc2tfYnVmZiwgcmJub2RlKTsKKworCS8qIFJlc2V0IFNBQ0sgc3RhdGUuICBBIGNvbmZvcm1pbmcgU0FDSyBpbXBsZW1lbnRhdGlvbiB3aWxsCisJICogZG8gdGhlIHNhbWUgYXQgYSB0aW1lb3V0IGJhc2VkIHJldHJhbnNtaXQuICBXaGVuIGEgY29ubmVjdGlvbgorCSAqIGlzIGluIGEgc2FkIHN0YXRlIGxpa2UgdGhpcywgd2UgY2FyZSBvbmx5IGFib3V0IGludGVncml0eQorCSAqIG9mIHRoZSBjb25uZWN0aW9uIG5vdCBwZXJmb3JtYW5jZS4KKwkgKi8KKwlpZiAodHAtPnJ4X29wdC5zYWNrX29rKQorCQl0Y3Bfc2Fja19yZXNldCgmdHAtPnJ4X29wdCk7CisJcmV0dXJuIHRydWU7CiB9CiAKIC8qIFJlZHVjZSBhbGxvY2F0ZWQgbWVtb3J5IGlmIHdlIGNhbiwgdHJ5aW5nIHRvIGdldApAQCAtNDkyMSw3ICs0OTg1LDcgQEAKIAogCXRjcF9jb2xsYXBzZV9vZm9fcXVldWUoc2spOwogCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpCi0JCXRjcF9jb2xsYXBzZShzaywgJnNrLT5za19yZWNlaXZlX3F1ZXVlLAorCQl0Y3BfY29sbGFwc2Uoc2ssICZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgTlVMTCwKIAkJCSAgICAgc2tiX3BlZWsoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSwKIAkJCSAgICAgTlVMTCwKIAkJCSAgICAgdHAtPmNvcGllZF9zZXEsIHRwLT5yY3Zfbnh0KTsKQEAgLTUwMjYsNyArNTA5MCw3IEBACiAJICAgIC8qIFdlIEFDSyBlYWNoIGZyYW1lIG9yLi4uICovCiAJICAgIHRjcF9pbl9xdWlja2Fja19tb2RlKHNrKSB8fAogCSAgICAvKiBXZSBoYXZlIG91dCBvZiBvcmRlciBkYXRhLiAqLwotCSAgICAob2ZvX3Bvc3NpYmxlICYmIHNrYl9wZWVrKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkpIHsKKwkgICAgKG9mb19wb3NzaWJsZSAmJiAhUkJfRU1QVFlfUk9PVCgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSkpKSB7CiAJCS8qIFRoZW4gYWNrIGl0IG5vdyAqLwogCQl0Y3Bfc2VuZF9hY2soc2spOwogCX0gZWxzZSB7CkBAIC01ODg1LDcgKzU5NDksNyBAQAogCQkgKiBzbyByZWxlYXNlIGl0LgogCQkgKi8KIAkJaWYgKHJlcSkgewotCQkJdHAtPnRvdGFsX3JldHJhbnMgPSByZXEtPm51bV9yZXRyYW5zOworCQkJaW5ldF9jc2soc2spLT5pY3NrX3JldHJhbnNtaXRzID0gMDsKIAkJCXJlcXNrX2Zhc3RvcGVuX3JlbW92ZShzaywgcmVxLCBmYWxzZSk7CiAJCX0gZWxzZSB7CiAJCQkvKiBNYWtlIHN1cmUgc29ja2V0IGlzIHJvdXRlZCwgZm9yIGNvcnJlY3QgbWV0cmljcy4gKi8KQEAgLTU5MjcsNyArNTk5MSw4IEBACiAJCX0gZWxzZQogCQkJdGNwX2luaXRfbWV0cmljcyhzayk7CiAKLQkJdGNwX3VwZGF0ZV9wYWNpbmdfcmF0ZShzayk7CisJCWlmICghaW5ldF9jc2soc2spLT5pY3NrX2NhX29wcy0+Y29uZ19jb250cm9sKQorCQkJdGNwX3VwZGF0ZV9wYWNpbmdfcmF0ZShzayk7CiAKIAkJLyogUHJldmVudCBzcHVyaW91cyB0Y3BfY3duZF9yZXN0YXJ0KCkgb24gZmlyc3QgZGF0YSBwYWNrZXQgKi8KIAkJdHAtPmxzbmR0aW1lID0gdGNwX3RpbWVfc3RhbXA7CkBAIC02MjYwLDYgKzYzMjUsNyBAQAogCiAJdG1wX29wdC50c3RhbXBfb2sgPSB0bXBfb3B0LnNhd190c3RhbXA7CiAJdGNwX29wZW5yZXFfaW5pdChyZXEsICZ0bXBfb3B0LCBza2IsIHNrKTsKKwlpbmV0X3JzayhyZXEpLT5ub19zcmNjaGVjayA9IGluZXRfc2soc2spLT50cmFuc3BhcmVudDsKIAogCS8qIE5vdGU6IHRjcF92Nl9pbml0X3JlcSgpIG1pZ2h0IG92ZXJyaWRlIGlyX2lpZiBmb3IgbGluayBsb2NhbHMgKi8KIAlpbmV0X3JzayhyZXEpLT5pcl9paWYgPSBpbmV0X3JlcXVlc3RfYm91bmRfZGV2X2lmKHNrLCBza2IpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2lwdjQuYyBiL25ldC9pcHY0L3RjcF9pcHY0LmMKaW5kZXggMzJiMDQ4ZS4uN2FjMzdjMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2lwdjQuYworKysgYi9uZXQvaXB2NC90Y3BfaXB2NC5jCkBAIC04MTQsOCArODE0LDE0IEBACiAJdTMyIHNlcSA9IChzay0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTikgPyB0Y3BfcnNrKHJlcSktPnNudF9pc24gKyAxIDoKIAkJCQkJICAgICB0Y3Bfc2soc2spLT5zbmRfbnh0OwogCisJLyogUkZDIDczMjMgMi4zCisJICogVGhlIHdpbmRvdyBmaWVsZCAoU0VHLldORCkgb2YgZXZlcnkgb3V0Z29pbmcgc2VnbWVudCwgd2l0aCB0aGUKKwkgKiBleGNlcHRpb24gb2YgPFNZTj4gc2VnbWVudHMsIE1VU1QgYmUgcmlnaHQtc2hpZnRlZCBieQorCSAqIFJjdi5XaW5kLlNoaWZ0IGJpdHM6CisJICovCiAJdGNwX3Y0X3NlbmRfYWNrKHNvY2tfbmV0KHNrKSwgc2tiLCBzZXEsCi0JCQl0Y3BfcnNrKHJlcSktPnJjdl9ueHQsIHJlcS0+cnNrX3Jjdl93bmQsCisJCQl0Y3BfcnNrKHJlcSktPnJjdl9ueHQsCisJCQlyZXEtPnJza19yY3Zfd25kID4+IGluZXRfcnNrKHJlcSktPnJjdl93c2NhbGUsCiAJCQl0Y3BfdGltZV9zdGFtcCwKIAkJCXJlcS0+dHNfcmVjZW50LAogCQkJMCwKQEAgLTExNjksNiArMTE3NSw3IEBACiAJCQkJICAgICAgTlVMTCwgc2tiKTsKIAogCWlmIChnZW5oYXNoIHx8IG1lbWNtcChoYXNoX2xvY2F0aW9uLCBuZXdoYXNoLCAxNikgIT0gMCkgeworCQlORVRfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX1RDUE1ENUZBSUxVUkUpOwogCQluZXRfaW5mb19yYXRlbGltaXRlZCgiTUQ1IEhhc2ggZmFpbGVkIGZvciAoJXBJNCwgJWQpLT4oJXBJNCwgJWQpJXNcbiIsCiAJCQkJICAgICAmaXBoLT5zYWRkciwgbnRvaHModGgtPnNvdXJjZSksCiAJCQkJICAgICAmaXBoLT5kYWRkciwgbnRvaHModGgtPmRlc3QpLApAQCAtMTE4OSw3ICsxMTk2LDYgQEAKIAogCXNrX3Jjdl9zYWRkcl9zZXQocmVxX3RvX3NrKHJlcSksIGlwX2hkcihza2IpLT5kYWRkcik7CiAJc2tfZGFkZHJfc2V0KHJlcV90b19zayhyZXEpLCBpcF9oZHIoc2tiKS0+c2FkZHIpOwotCWlyZXEtPm5vX3NyY2NoZWNrID0gaW5ldF9zayhza19saXN0ZW5lciktPnRyYW5zcGFyZW50OwogCWlyZXEtPm9wdCA9IHRjcF92NF9zYXZlX29wdGlvbnMoc2tiKTsKIH0KIApAQCAtMTUzMSw2ICsxNTM3LDM0IEBACiB9CiBFWFBPUlRfU1lNQk9MKHRjcF9wcmVxdWV1ZSk7CiAKK2Jvb2wgdGNwX2FkZF9iYWNrbG9nKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1MzIgbGltaXQgPSBzay0+c2tfcmN2YnVmICsgc2stPnNrX3NuZGJ1ZjsKKworCS8qIE9ubHkgc29ja2V0IG93bmVyIGNhbiB0cnkgdG8gY29sbGFwc2UvcHJ1bmUgcnggcXVldWVzCisJICogdG8gcmVkdWNlIG1lbW9yeSBvdmVyaGVhZCwgc28gYWRkIGEgbGl0dGxlIGhlYWRyb29tIGhlcmUuCisJICogRmV3IHNvY2tldHMgYmFja2xvZyBhcmUgcG9zc2libHkgY29uY3VycmVudGx5IG5vbiBlbXB0eS4KKwkgKi8KKwlsaW1pdCArPSA2NCoxMDI0OworCisJLyogSW4gY2FzZSBhbGwgZGF0YSB3YXMgcHVsbGVkIGZyb20gc2tiIGZyYWdzIChpbiBfX3Bza2JfcHVsbF90YWlsKCkpLAorCSAqIHdlIGNhbiBmaXggc2tiLT50cnVlc2l6ZSB0byBpdHMgcmVhbCB2YWx1ZSB0byBhdm9pZCBmdXR1cmUgZHJvcHMuCisJICogVGhpcyBpcyB2YWxpZCBiZWNhdXNlIHNrYiBpcyBub3QgeWV0IGNoYXJnZWQgdG8gdGhlIHNvY2tldC4KKwkgKiBJdCBoYXMgYmVlbiBub3RpY2VkIHB1cmUgU0FDSyBwYWNrZXRzIHdlcmUgc29tZXRpbWVzIGRyb3BwZWQKKwkgKiAoaWYgY29va2VkIGJ5IGRyaXZlcnMgd2l0aG91dCBjb3B5YnJlYWsgZmVhdHVyZSkuCisJICovCisJaWYgKCFza2ItPmRhdGFfbGVuKQorCQlza2ItPnRydWVzaXplID0gU0tCX1RSVUVTSVpFKHNrYl9lbmRfb2Zmc2V0KHNrYikpOworCisJaWYgKHVubGlrZWx5KHNrX2FkZF9iYWNrbG9nKHNrLCBza2IsIGxpbWl0KSkpIHsKKwkJYmhfdW5sb2NrX3NvY2soc2spOworCQlfX05FVF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBMSU5VWF9NSUJfVENQQkFDS0xPR0RST1ApOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorRVhQT1JUX1NZTUJPTCh0Y3BfYWRkX2JhY2tsb2cpOworCiAvKgogICoJRnJvbSB0Y3BfaW5wdXQuYwogICovCkBAIC0xNjAyLDYgKzE2MzYsNyBAQAogCiAJCXNrID0gcmVxLT5yc2tfbGlzdGVuZXI7CiAJCWlmICh1bmxpa2VseSh0Y3BfdjRfaW5ib3VuZF9tZDVfaGFzaChzaywgc2tiKSkpIHsKKwkJCXNrX2Ryb3BzX2FkZChzaywgc2tiKTsKIAkJCXJlcXNrX3B1dChyZXEpOwogCQkJZ290byBkaXNjYXJkX2l0OwogCQl9CkBAIC0xNjYwLDEwICsxNjk1LDcgQEAKIAlpZiAoIXNvY2tfb3duZWRfYnlfdXNlcihzaykpIHsKIAkJaWYgKCF0Y3BfcHJlcXVldWUoc2ssIHNrYikpCiAJCQlyZXQgPSB0Y3BfdjRfZG9fcmN2KHNrLCBza2IpOwotCX0gZWxzZSBpZiAodW5saWtlbHkoc2tfYWRkX2JhY2tsb2coc2ssIHNrYiwKLQkJCQkJICAgc2stPnNrX3JjdmJ1ZiArIHNrLT5za19zbmRidWYpKSkgewotCQliaF91bmxvY2tfc29jayhzayk7Ci0JCV9fTkVUX0lOQ19TVEFUUyhuZXQsIExJTlVYX01JQl9UQ1BCQUNLTE9HRFJPUCk7CisJfSBlbHNlIGlmICh0Y3BfYWRkX2JhY2tsb2coc2ssIHNrYikpIHsKIAkJZ290byBkaXNjYXJkX2FuZF9yZWxzZTsKIAl9CiAJYmhfdW5sb2NrX3NvY2soc2spOwpAQCAtMTgxMiw3ICsxODQ0LDcgQEAKIAl0Y3Bfd3JpdGVfcXVldWVfcHVyZ2Uoc2spOwogCiAJLyogQ2xlYW5zIHVwIG91ciwgaG9wZWZ1bGx5IGVtcHR5LCBvdXRfb2Zfb3JkZXJfcXVldWUuICovCi0JX19za2JfcXVldWVfcHVyZ2UoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOworCXNrYl9yYnRyZWVfcHVyZ2UoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOwogCiAjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKIAkvKiBDbGVhbiB1cCB0aGUgTUQ1IGtleSBsaXN0LCBpZiBhbnkgKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9tZXRyaWNzLmMgYi9uZXQvaXB2NC90Y3BfbWV0cmljcy5jCmluZGV4IGI2MTc4MjYuLmJmMWYzYjIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9tZXRyaWNzLmMKKysrIGIvbmV0L2lwdjQvdGNwX21ldHJpY3MuYwpAQCAtNzUxLDcgKzc1MSw3IEBACiAJLm5ldG5zb2sJPSB0cnVlLAogfTsKIAotc3RhdGljIHN0cnVjdCBubGFfcG9saWN5IHRjcF9tZXRyaWNzX25sX3BvbGljeVtUQ1BfTUVUUklDU19BVFRSX01BWCArIDFdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IHRjcF9tZXRyaWNzX25sX3BvbGljeVtUQ1BfTUVUUklDU19BVFRSX01BWCArIDFdID0gewogCVtUQ1BfTUVUUklDU19BVFRSX0FERFJfSVBWNF0JPSB7IC50eXBlID0gTkxBX1UzMiwgfSwKIAlbVENQX01FVFJJQ1NfQVRUUl9BRERSX0lQVjZdCT0geyAudHlwZSA9IE5MQV9CSU5BUlksCiAJCQkJCSAgICAubGVuID0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkciksIH0sCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfbWluaXNvY2tzLmMgYi9uZXQvaXB2NC90Y3BfbWluaXNvY2tzLmMKaW5kZXggNGI5NWVjNC4uNjIzNGViYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX21pbmlzb2Nrcy5jCisrKyBiL25ldC9pcHY0L3RjcF9taW5pc29ja3MuYwpAQCAtNDY0LDcgKzQ2NCw3IEBACiAKIAkJbmV3dHAtPnNydHRfdXMgPSAwOwogCQluZXd0cC0+bWRldl91cyA9IGppZmZpZXNfdG9fdXNlY3MoVENQX1RJTUVPVVRfSU5JVCk7Ci0JCW5ld3RwLT5ydHRfbWluWzBdLnJ0dCA9IH4wVTsKKwkJbWlubWF4X3Jlc2V0KCZuZXd0cC0+cnR0X21pbiwgdGNwX3RpbWVfc3RhbXAsIH4wVSk7CiAJCW5ld2ljc2stPmljc2tfcnRvID0gVENQX1RJTUVPVVRfSU5JVDsKIAogCQluZXd0cC0+cGFja2V0c19vdXQgPSAwOwpAQCAtNDg3LDggKzQ4NywxMCBAQAogCQluZXd0cC0+c25kX2N3bmQgPSBUQ1BfSU5JVF9DV05EOwogCQluZXd0cC0+c25kX2N3bmRfY250ID0gMDsKIAorCQkvKiBUaGVyZSdzIGEgYnViYmxlIGluIHRoZSBwaXBlIHVudGlsIGF0IGxlYXN0IHRoZSBmaXJzdCBBQ0suICovCisJCW5ld3RwLT5hcHBfbGltaXRlZCA9IH4wVTsKKwogCQl0Y3BfaW5pdF94bWl0X3RpbWVycyhuZXdzayk7Ci0JCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbmV3dHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CiAJCW5ld3RwLT53cml0ZV9zZXEgPSBuZXd0cC0+cHVzaGVkX3NlcSA9IHRyZXEtPnNudF9pc24gKyAxOwogCiAJCW5ld3RwLT5yeF9vcHQuc2F3X3RzdGFtcCA9IDA7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3Bfb2ZmbG9hZC5jIGIvbmV0L2lwdjQvdGNwX29mZmxvYWQuYwppbmRleCA1YzU5NjQ5Li5iYzY4ZGEzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3Bfb2ZmbG9hZC5jCisrKyBiL25ldC9pcHY0L3RjcF9vZmZsb2FkLmMKQEAgLTkwLDEyICs5MCw2IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCS8qIEdTTyBwYXJ0aWFsIG9ubHkgcmVxdWlyZXMgc3BsaXR0aW5nIHRoZSBmcmFtZSBpbnRvIGFuIE1TUwotCSAqIG11bHRpcGxlIGFuZCBwb3NzaWJseSBhIHJlbWFpbmRlci4gIFNvIHVwZGF0ZSB0aGUgbXNzIG5vdy4KLQkgKi8KLQlpZiAoZmVhdHVyZXMgJiBORVRJRl9GX0dTT19QQVJUSUFMKQotCQltc3MgPSBza2ItPmxlbiAtIChza2ItPmxlbiAlIG1zcyk7Ci0KIAljb3B5X2Rlc3RydWN0b3IgPSBnc29fc2tiLT5kZXN0cnVjdG9yID09IHRjcF93ZnJlZTsKIAlvb29fb2theSA9IGdzb19za2ItPm9vb19va2F5OwogCS8qIEFsbCBzZWdtZW50cyBidXQgdGhlIGZpcnN0IHNob3VsZCBoYXZlIG9vb19va2F5IGNsZWFyZWQgKi8KQEAgLTEwOCw2ICsxMDIsMTMgQEAKIAkvKiBPbmx5IGZpcnN0IHNlZ21lbnQgbWlnaHQgaGF2ZSBvb29fb2theSBzZXQgKi8KIAlzZWdzLT5vb29fb2theSA9IG9vb19va2F5OwogCisJLyogR1NPIHBhcnRpYWwgYW5kIGZyYWdfbGlzdCBzZWdtZW50YXRpb24gb25seSByZXF1aXJlcyBzcGxpdHRpbmcKKwkgKiB0aGUgZnJhbWUgaW50byBhbiBNU1MgbXVsdGlwbGUgYW5kIHBvc3NpYmx5IGEgcmVtYWluZGVyLCBib3RoCisJICogY2FzZXMgcmV0dXJuIGEgR1NPIHNrYi4gU28gdXBkYXRlIHRoZSBtc3Mgbm93LgorCSAqLworCWlmIChza2JfaXNfZ3NvKHNlZ3MpKQorCQltc3MgKj0gc2tiX3NoaW5mbyhzZWdzKS0+Z3NvX3NlZ3M7CisKIAlkZWx0YSA9IGh0b25sKG9sZGxlbiArICh0aGxlbiArIG1zcykpOwogCiAJc2tiID0gc2VnczsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9vdXRwdXQuYyBiL25ldC9pcHY0L3RjcF9vdXRwdXQuYwppbmRleCBiZGFlZjdmLi44OTZlOWRmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjQvdGNwX291dHB1dC5jCkBAIC03MzQsOSArNzM0LDE2IEBACiB7CiAJaWYgKCgxIDw8IHNrLT5za19zdGF0ZSkgJgogCSAgICAoVENQRl9FU1RBQkxJU0hFRCB8IFRDUEZfRklOX1dBSVQxIHwgVENQRl9DTE9TSU5HIHwKLQkgICAgIFRDUEZfQ0xPU0VfV0FJVCAgfCBUQ1BGX0xBU1RfQUNLKSkKLQkJdGNwX3dyaXRlX3htaXQoc2ssIHRjcF9jdXJyZW50X21zcyhzayksIHRjcF9zayhzayktPm5vbmFnbGUsCisJICAgICBUQ1BGX0NMT1NFX1dBSVQgIHwgVENQRl9MQVNUX0FDSykpIHsKKwkJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisKKwkJaWYgKHRwLT5sb3N0X291dCA+IHRwLT5yZXRyYW5zX291dCAmJgorCQkgICAgdHAtPnNuZF9jd25kID4gdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKSkKKwkJCXRjcF94bWl0X3JldHJhbnNtaXRfcXVldWUoc2spOworCisJCXRjcF93cml0ZV94bWl0KHNrLCB0Y3BfY3VycmVudF9tc3Moc2spLCB0cC0+bm9uYWdsZSwKIAkJCSAgICAgICAwLCBHRlBfQVRPTUlDKTsKKwl9CiB9CiAvKgogICogT25lIHRhc2tsZXQgcGVyIGNwdSB0cmllcyB0byBzZW5kIG1vcmUgc2ticy4KQEAgLTkxOCw2ICs5MjUsNyBAQAogCQlza2JfbXN0YW1wX2dldCgmc2tiLT5za2JfbXN0YW1wKTsKIAkJVENQX1NLQl9DQihza2IpLT50eC5pbl9mbGlnaHQgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEKIAkJCS0gdHAtPnNuZF91bmE7CisJCXRjcF9yYXRlX3NrYl9zZW50KHNrLCBza2IpOwogCiAJCWlmICh1bmxpa2VseShza2JfY2xvbmVkKHNrYikpKQogCQkJc2tiID0gcHNrYl9jb3B5KHNrYiwgZ2ZwX21hc2spOwpAQCAtMTIxMyw2ICsxMjIxLDkgQEAKIAl0Y3Bfc2V0X3NrYl90c29fc2Vncyhza2IsIG1zc19ub3cpOwogCXRjcF9zZXRfc2tiX3Rzb19zZWdzKGJ1ZmYsIG1zc19ub3cpOwogCisJLyogVXBkYXRlIGRlbGl2ZXJlZCBpbmZvIGZvciB0aGUgbmV3IHNlZ21lbnQgKi8KKwlUQ1BfU0tCX0NCKGJ1ZmYpLT50eCA9IFRDUF9TS0JfQ0Ioc2tiKS0+dHg7CisKIAkvKiBJZiB0aGlzIHBhY2tldCBoYXMgYmVlbiBzZW50IG91dCBhbHJlYWR5LCB3ZSBtdXN0CiAJICogYWRqdXN0IHRoZSB2YXJpb3VzIHBhY2tldCBjb3VudGVycy4KIAkgKi8KQEAgLTEzNTgsNiArMTM2OSw3IEBACiAJfQogCXJldHVybiBtdHU7CiB9CitFWFBPUlRfU1lNQk9MKHRjcF9tc3NfdG9fbXR1KTsKIAogLyogTVRVIHByb2JpbmcgaW5pdCBwZXIgc29ja2V0ICovCiB2b2lkIHRjcF9tdHVwX2luaXQoc3RydWN0IHNvY2sgKnNrKQpAQCAtMTU0NSw3ICsxNTU3LDggQEAKIC8qIFJldHVybiBob3cgbWFueSBzZWdzIHdlJ2QgbGlrZSBvbiBhIFRTTyBwYWNrZXQsCiAgKiB0byBzZW5kIG9uZSBUU08gcGFja2V0IHBlciBtcwogICovCi1zdGF0aWMgdTMyIHRjcF90c29fYXV0b3NpemUoY29uc3Qgc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgbXNzX25vdykKK3UzMiB0Y3BfdHNvX2F1dG9zaXplKGNvbnN0IHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IG1zc19ub3csCisJCSAgICAgaW50IG1pbl90c29fc2VncykKIHsKIAl1MzIgYnl0ZXMsIHNlZ3M7CiAKQEAgLTE1NTcsMTAgKzE1NzAsMjMgQEAKIAkgKiBUaGlzIHByZXNlcnZlcyBBQ0sgY2xvY2tpbmcgYW5kIGlzIGNvbnNpc3RlbnQKIAkgKiB3aXRoIHRjcF90c29fc2hvdWxkX2RlZmVyKCkgaGV1cmlzdGljLgogCSAqLwotCXNlZ3MgPSBtYXhfdCh1MzIsIGJ5dGVzIC8gbXNzX25vdywgc3lzY3RsX3RjcF9taW5fdHNvX3NlZ3MpOworCXNlZ3MgPSBtYXhfdCh1MzIsIGJ5dGVzIC8gbXNzX25vdywgbWluX3Rzb19zZWdzKTsKIAogCXJldHVybiBtaW5fdCh1MzIsIHNlZ3MsIHNrLT5za19nc29fbWF4X3NlZ3MpOwogfQorRVhQT1JUX1NZTUJPTCh0Y3BfdHNvX2F1dG9zaXplKTsKKworLyogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc2VnbWVudHMgd2Ugd2FudCBpbiB0aGUgc2tiIHdlIGFyZSB0cmFuc21pdHRpbmcuCisgKiBTZWUgaWYgY29uZ2VzdGlvbiBjb250cm9sIG1vZHVsZSB3YW50cyB0byBkZWNpZGU7IG90aGVyd2lzZSwgYXV0b3NpemUuCisgKi8KK3N0YXRpYyB1MzIgdGNwX3Rzb19zZWdzKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IG1zc19ub3cpCit7CisJY29uc3Qgc3RydWN0IHRjcF9jb25nZXN0aW9uX29wcyAqY2Ffb3BzID0gaW5ldF9jc2soc2spLT5pY3NrX2NhX29wczsKKwl1MzIgdHNvX3NlZ3MgPSBjYV9vcHMtPnRzb19zZWdzX2dvYWwgPyBjYV9vcHMtPnRzb19zZWdzX2dvYWwoc2spIDogMDsKKworCXJldHVybiB0c29fc2VncyA/IDoKKwkJdGNwX3Rzb19hdXRvc2l6ZShzaywgbXNzX25vdywgc3lzY3RsX3RjcF9taW5fdHNvX3NlZ3MpOworfQogCiAvKiBSZXR1cm5zIHRoZSBwb3J0aW9uIG9mIHNrYiB3aGljaCBjYW4gYmUgc2VudCByaWdodCBhd2F5ICovCiBzdGF0aWMgdW5zaWduZWQgaW50IHRjcF9tc3Nfc3BsaXRfcG9pbnQoY29uc3Qgc3RydWN0IHNvY2sgKnNrLApAQCAtMTk2NiwxMiArMTk5MiwxNCBAQAogCWxlbiA9IDA7CiAJdGNwX2Zvcl93cml0ZV9xdWV1ZV9mcm9tX3NhZmUoc2tiLCBuZXh0LCBzaykgewogCQljb3B5ID0gbWluX3QoaW50LCBza2ItPmxlbiwgcHJvYmVfc2l6ZSAtIGxlbik7Ci0JCWlmIChuc2tiLT5pcF9zdW1tZWQpCisJCWlmIChuc2tiLT5pcF9zdW1tZWQpIHsKIAkJCXNrYl9jb3B5X2JpdHMoc2tiLCAwLCBza2JfcHV0KG5za2IsIGNvcHkpLCBjb3B5KTsKLQkJZWxzZQotCQkJbnNrYi0+Y3N1bSA9IHNrYl9jb3B5X2FuZF9jc3VtX2JpdHMoc2tiLCAwLAotCQkJCQkJCSAgICBza2JfcHV0KG5za2IsIGNvcHkpLAotCQkJCQkJCSAgICBjb3B5LCBuc2tiLT5jc3VtKTsKKwkJfSBlbHNlIHsKKwkJCV9fd3N1bSBjc3VtID0gc2tiX2NvcHlfYW5kX2NzdW1fYml0cyhza2IsIDAsCisJCQkJCQkJICAgICBza2JfcHV0KG5za2IsIGNvcHkpLAorCQkJCQkJCSAgICAgY29weSwgMCk7CisJCQluc2tiLT5jc3VtID0gY3N1bV9ibG9ja19hZGQobnNrYi0+Y3N1bSwgY3N1bSwgbGVuKTsKKwkJfQogCiAJCWlmIChza2ItPmxlbiA8PSBjb3B5KSB7CiAJCQkvKiBXZSd2ZSBlYXRlbiBhbGwgdGhlIGRhdGEgZnJvbSB0aGlzIHNrYi4KQEAgLTIwMjAsNiArMjA0OCwzOSBAQAogCXJldHVybiAtMTsKIH0KIAorLyogVENQIFNtYWxsIFF1ZXVlcyA6CisgKiBDb250cm9sIG51bWJlciBvZiBwYWNrZXRzIGluIHFkaXNjL2RldmljZXMgdG8gdHdvIHBhY2tldHMgLyBvciB+MSBtcy4KKyAqIChUaGVzZSBsaW1pdHMgYXJlIGRvdWJsZWQgZm9yIHJldHJhbnNtaXRzKQorICogVGhpcyBhbGxvd3MgZm9yIDoKKyAqICAtIGJldHRlciBSVFQgZXN0aW1hdGlvbiBhbmQgQUNLIHNjaGVkdWxpbmcKKyAqICAtIGZhc3RlciByZWNvdmVyeQorICogIC0gaGlnaCByYXRlcworICogQWxhcywgc29tZSBkcml2ZXJzIC8gc3Vic3lzdGVtcyByZXF1aXJlIGEgZmFpciBhbW91bnQKKyAqIG9mIHF1ZXVlZCBieXRlcyB0byBlbnN1cmUgbGluZSByYXRlLgorICogT25lIGV4YW1wbGUgaXMgd2lmaSBhZ2dyZWdhdGlvbiAoODAyLjExIEFNUERVKQorICovCitzdGF0aWMgYm9vbCB0Y3Bfc21hbGxfcXVldWVfY2hlY2soc3RydWN0IHNvY2sgKnNrLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgdW5zaWduZWQgaW50IGZhY3RvcikKK3sKKwl1bnNpZ25lZCBpbnQgbGltaXQ7CisKKwlsaW1pdCA9IG1heCgyICogc2tiLT50cnVlc2l6ZSwgc2stPnNrX3BhY2luZ19yYXRlID4+IDEwKTsKKwlsaW1pdCA9IG1pbl90KHUzMiwgbGltaXQsIHN5c2N0bF90Y3BfbGltaXRfb3V0cHV0X2J5dGVzKTsKKwlsaW1pdCA8PD0gZmFjdG9yOworCisJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYykgPiBsaW1pdCkgeworCQlzZXRfYml0KFRTUV9USFJPVFRMRUQsICZ0Y3Bfc2soc2spLT50c3FfZmxhZ3MpOworCQkvKiBJdCBpcyBwb3NzaWJsZSBUWCBjb21wbGV0aW9uIGFscmVhZHkgaGFwcGVuZWQKKwkJICogYmVmb3JlIHdlIHNldCBUU1FfVEhST1RUTEVELCBzbyB3ZSBtdXN0CisJCSAqIHRlc3QgYWdhaW4gdGhlIGNvbmRpdGlvbi4KKwkJICovCisJCXNtcF9tYl9fYWZ0ZXJfYXRvbWljKCk7CisJCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpID4gbGltaXQpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCiAvKiBUaGlzIHJvdXRpbmUgd3JpdGVzIHBhY2tldHMgdG8gdGhlIG5ldHdvcmsuICBJdCBhZHZhbmNlcyB0aGUKICAqIHNlbmRfaGVhZC4gIFRoaXMgaGFwcGVucyBhcyBpbmNvbWluZyBhY2tzIG9wZW4gdXAgdGhlIHJlbW90ZQogICogd2luZG93IGZvciB1cy4KQEAgLTIwNTcsNyArMjExOCw3IEBACiAJCX0KIAl9CiAKLQltYXhfc2VncyA9IHRjcF90c29fYXV0b3NpemUoc2ssIG1zc19ub3cpOworCW1heF9zZWdzID0gdGNwX3Rzb19zZWdzKHNrLCBtc3Nfbm93KTsKIAl3aGlsZSAoKHNrYiA9IHRjcF9zZW5kX2hlYWQoc2spKSkgewogCQl1bnNpZ25lZCBpbnQgbGltaXQ7CiAKQEAgLTIxMDYsMjkgKzIxNjcsOCBAQAogCQkgICAgdW5saWtlbHkodHNvX2ZyYWdtZW50KHNrLCBza2IsIGxpbWl0LCBtc3Nfbm93LCBnZnApKSkKIAkJCWJyZWFrOwogCi0JCS8qIFRDUCBTbWFsbCBRdWV1ZXMgOgotCQkgKiBDb250cm9sIG51bWJlciBvZiBwYWNrZXRzIGluIHFkaXNjL2RldmljZXMgdG8gdHdvIHBhY2tldHMgLyBvciB+MSBtcy4KLQkJICogVGhpcyBhbGxvd3MgZm9yIDoKLQkJICogIC0gYmV0dGVyIFJUVCBlc3RpbWF0aW9uIGFuZCBBQ0sgc2NoZWR1bGluZwotCQkgKiAgLSBmYXN0ZXIgcmVjb3ZlcnkKLQkJICogIC0gaGlnaCByYXRlcwotCQkgKiBBbGFzLCBzb21lIGRyaXZlcnMgLyBzdWJzeXN0ZW1zIHJlcXVpcmUgYSBmYWlyIGFtb3VudAotCQkgKiBvZiBxdWV1ZWQgYnl0ZXMgdG8gZW5zdXJlIGxpbmUgcmF0ZS4KLQkJICogT25lIGV4YW1wbGUgaXMgd2lmaSBhZ2dyZWdhdGlvbiAoODAyLjExIEFNUERVKQotCQkgKi8KLQkJbGltaXQgPSBtYXgoMiAqIHNrYi0+dHJ1ZXNpemUsIHNrLT5za19wYWNpbmdfcmF0ZSA+PiAxMCk7Ci0JCWxpbWl0ID0gbWluX3QodTMyLCBsaW1pdCwgc3lzY3RsX3RjcF9saW1pdF9vdXRwdXRfYnl0ZXMpOwotCi0JCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpID4gbGltaXQpIHsKLQkJCXNldF9iaXQoVFNRX1RIUk9UVExFRCwgJnRwLT50c3FfZmxhZ3MpOwotCQkJLyogSXQgaXMgcG9zc2libGUgVFggY29tcGxldGlvbiBhbHJlYWR5IGhhcHBlbmVkCi0JCQkgKiBiZWZvcmUgd2Ugc2V0IFRTUV9USFJPVFRMRUQsIHNvIHdlIG11c3QKLQkJCSAqIHRlc3QgYWdhaW4gdGhlIGNvbmRpdGlvbi4KLQkJCSAqLwotCQkJc21wX21iX19hZnRlcl9hdG9taWMoKTsKLQkJCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpID4gbGltaXQpCi0JCQkJYnJlYWs7Ci0JCX0KKwkJaWYgKHRjcF9zbWFsbF9xdWV1ZV9jaGVjayhzaywgc2tiLCAwKSkKKwkJCWJyZWFrOwogCiAJCWlmICh1bmxpa2VseSh0Y3BfdHJhbnNtaXRfc2tiKHNrLCBza2IsIDEsIGdmcCkpKQogCQkJYnJlYWs7CkBAIC0yNjA1LDcgKzI2NDUsOCBAQAogCSAqIGNvcHlpbmcgb3ZlcmhlYWQ6IGZyYWdtZW50YXRpb24sIHR1bm5lbGluZywgbWFuZ2xpbmcgZXRjLgogCSAqLwogCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpID4KLQkgICAgbWluKHNrLT5za193bWVtX3F1ZXVlZCArIChzay0+c2tfd21lbV9xdWV1ZWQgPj4gMiksIHNrLT5za19zbmRidWYpKQorCSAgICBtaW5fdCh1MzIsIHNrLT5za193bWVtX3F1ZXVlZCArIChzay0+c2tfd21lbV9xdWV1ZWQgPj4gMiksCisJCSAgc2stPnNrX3NuZGJ1ZikpCiAJCXJldHVybiAtRUFHQUlOOwogCiAJaWYgKHNrYl9zdGlsbF9pbl9ob3N0X3F1ZXVlKHNrLCBza2IpKQpAQCAtMjc3NCw5ICsyODE1LDkgQEAKIAkJbGFzdF9sb3N0ID0gdHAtPnNuZF91bmE7CiAJfQogCi0JbWF4X3NlZ3MgPSB0Y3BfdHNvX2F1dG9zaXplKHNrLCB0Y3BfY3VycmVudF9tc3Moc2spKTsKKwltYXhfc2VncyA9IHRjcF90c29fc2VncyhzaywgdGNwX2N1cnJlbnRfbXNzKHNrKSk7CiAJdGNwX2Zvcl93cml0ZV9xdWV1ZV9mcm9tKHNrYiwgc2spIHsKLQkJX191OCBzYWNrZWQgPSBUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZDsKKwkJX191OCBzYWNrZWQ7CiAJCWludCBzZWdzOwogCiAJCWlmIChza2IgPT0gdGNwX3NlbmRfaGVhZChzaykpCkBAIC0yNzg4LDYgKzI4MjksNyBAQAogCQlzZWdzID0gdHAtPnNuZF9jd25kIC0gdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKTsKIAkJaWYgKHNlZ3MgPD0gMCkKIAkJCXJldHVybjsKKwkJc2Fja2VkID0gVENQX1NLQl9DQihza2IpLT5zYWNrZWQ7CiAJCS8qIEluIGNhc2UgdGNwX3NoaWZ0X3NrYl9kYXRhKCkgaGF2ZSBhZ2dyZWdhdGVkIGxhcmdlIHNrYnMsCiAJCSAqIHdlIG5lZWQgdG8gbWFrZSBzdXJlIG5vdCBzZW5kaW5nIHRvbyBiaWdzIFRTTyBwYWNrZXRzCiAJCSAqLwpAQCAtMjgyNywxMCArMjg2OSwxMyBAQAogCQlpZiAoc2Fja2VkICYgKFRDUENCX1NBQ0tFRF9BQ0tFRHxUQ1BDQl9TQUNLRURfUkVUUkFOUykpCiAJCQljb250aW51ZTsKIAorCQlpZiAodGNwX3NtYWxsX3F1ZXVlX2NoZWNrKHNrLCBza2IsIDEpKQorCQkJcmV0dXJuOworCiAJCWlmICh0Y3BfcmV0cmFuc21pdF9za2Ioc2ssIHNrYiwgc2VncykpCiAJCQlyZXR1cm47CiAKLQkJTkVUX0lOQ19TVEFUUyhzb2NrX25ldChzayksIG1pYl9pZHgpOworCQlORVRfQUREX1NUQVRTKHNvY2tfbmV0KHNrKSwgbWliX2lkeCwgdGNwX3NrYl9wY291bnQoc2tiKSk7CiAKIAkJaWYgKHRjcF9pbl9jd25kX3JlZHVjdGlvbihzaykpCiAJCQl0cC0+cHJyX291dCArPSB0Y3Bfc2tiX3Bjb3VudChza2IpOwpAQCAtMzU2Nyw2ICszNjEyLDggQEAKIAlpZiAoIXJlcykgewogCQlfX1RDUF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBUQ1BfTUlCX1JFVFJBTlNTRUdTKTsKIAkJX19ORVRfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX1RDUFNZTlJFVFJBTlMpOworCQlpZiAodW5saWtlbHkodGNwX3Bhc3NpdmVfZmFzdG9wZW4oc2spKSkKKwkJCXRjcF9zayhzayktPnRvdGFsX3JldHJhbnMrKzsKIAl9CiAJcmV0dXJuIHJlczsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9yYXRlLmMgYi9uZXQvaXB2NC90Y3BfcmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZTE1ODEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC90Y3BfcmF0ZS5jCkBAIC0wLDAgKzEsMTg2IEBACisjaW5jbHVkZSA8bmV0L3RjcC5oPgorCisvKiBUaGUgYmFuZHdpZHRoIGVzdGltYXRvciBlc3RpbWF0ZXMgdGhlIHJhdGUgYXQgd2hpY2ggdGhlIG5ldHdvcmsKKyAqIGNhbiBjdXJyZW50bHkgZGVsaXZlciBvdXRib3VuZCBkYXRhIHBhY2tldHMgZm9yIHRoaXMgZmxvdy4gQXQgYSBoaWdoCisgKiBsZXZlbCwgaXQgb3BlcmF0ZXMgYnkgdGFraW5nIGEgZGVsaXZlcnkgcmF0ZSBzYW1wbGUgZm9yIGVhY2ggQUNLLgorICoKKyAqIEEgcmF0ZSBzYW1wbGUgcmVjb3JkcyB0aGUgcmF0ZSBhdCB3aGljaCB0aGUgbmV0d29yayBkZWxpdmVyZWQgcGFja2V0cworICogZm9yIHRoaXMgZmxvdywgY2FsY3VsYXRlZCBvdmVyIHRoZSB0aW1lIGludGVydmFsIGJldHdlZW4gdGhlIHRyYW5zbWlzc2lvbgorICogb2YgYSBkYXRhIHBhY2tldCBhbmQgdGhlIGFja25vd2xlZGdtZW50IG9mIHRoYXQgcGFja2V0LgorICoKKyAqIFNwZWNpZmljYWxseSwgb3ZlciB0aGUgaW50ZXJ2YWwgYmV0d2VlbiBlYWNoIHRyYW5zbWl0IGFuZCBjb3JyZXNwb25kaW5nIEFDSywKKyAqIHRoZSBlc3RpbWF0b3IgZ2VuZXJhdGVzIGEgZGVsaXZlcnkgcmF0ZSBzYW1wbGUuIFR5cGljYWxseSBpdCB1c2VzIHRoZSByYXRlCisgKiBhdCB3aGljaCBwYWNrZXRzIHdlcmUgYWNrbm93bGVkZ2VkLiBIb3dldmVyLCB0aGUgYXBwcm9hY2ggb2YgdXNpbmcgb25seSB0aGUKKyAqIGFja25vd2xlZGdtZW50IHJhdGUgZmFjZXMgYSBjaGFsbGVuZ2UgdW5kZXIgdGhlIHByZXZhbGVudCBBQ0sgZGVjaW1hdGlvbiBvcgorICogY29tcHJlc3Npb246IHBhY2tldHMgY2FuIHRlbXBvcmFyaWx5IGFwcGVhciB0byBiZSBkZWxpdmVyZWQgbXVjaCBxdWlja2VyCisgKiB0aGFuIHRoZSBib3R0bGVuZWNrIHJhdGUuIFNpbmNlIGl0IGlzIHBoeXNpY2FsbHkgaW1wb3NzaWJsZSB0byBkbyB0aGF0IGluIGEKKyAqIHN1c3RhaW5lZCBmYXNoaW9uLCB3aGVuIHRoZSBlc3RpbWF0b3Igbm90aWNlcyB0aGF0IHRoZSBBQ0sgcmF0ZSBpcyBmYXN0ZXIKKyAqIHRoYW4gdGhlIHRyYW5zbWl0IHJhdGUsIGl0IHVzZXMgdGhlIGxhdHRlcjoKKyAqCisgKiAgICBzZW5kX3JhdGUgPSAjcGt0c19kZWxpdmVyZWQvKGxhc3Rfc25kX3RpbWUgLSBmaXJzdF9zbmRfdGltZSkKKyAqICAgIGFja19yYXRlICA9ICNwa3RzX2RlbGl2ZXJlZC8obGFzdF9hY2tfdGltZSAtIGZpcnN0X2Fja190aW1lKQorICogICAgYncgPSBtaW4oc2VuZF9yYXRlLCBhY2tfcmF0ZSkKKyAqCisgKiBOb3RpY2UgdGhlIGVzdGltYXRvciBlc3NlbnRpYWxseSBlc3RpbWF0ZXMgdGhlIGdvb2RwdXQsIG5vdCBhbHdheXMgdGhlCisgKiBuZXR3b3JrIGJvdHRsZW5lY2sgbGluayByYXRlIHdoZW4gdGhlIHNlbmRpbmcgb3IgcmVjZWl2aW5nIGlzIGxpbWl0ZWQgYnkKKyAqIG90aGVyIGZhY3RvcnMgbGlrZSBhcHBsaWNhdGlvbnMgb3IgcmVjZWl2ZXIgd2luZG93IGxpbWl0cy4gIFRoZSBlc3RpbWF0b3IKKyAqIGRlbGliZXJhdGVseSBhdm9pZHMgdXNpbmcgdGhlIGludGVyLXBhY2tldCBzcGFjaW5nIGFwcHJvYWNoIGJlY2F1c2UgdGhhdAorICogYXBwcm9hY2ggcmVxdWlyZXMgYSBsYXJnZSBudW1iZXIgb2Ygc2FtcGxlcyBhbmQgc29waGlzdGljYXRlZCBmaWx0ZXJpbmcuCisgKgorICogVENQIGZsb3dzIGNhbiBvZnRlbiBiZSBhcHBsaWNhdGlvbi1saW1pdGVkIGluIHJlcXVlc3QvcmVzcG9uc2Ugd29ya2xvYWRzLgorICogVGhlIGVzdGltYXRvciBtYXJrcyBhIGJhbmR3aWR0aCBzYW1wbGUgYXMgYXBwbGljYXRpb24tbGltaXRlZCBpZiB0aGVyZQorICogd2FzIHNvbWUgbW9tZW50IGR1cmluZyB0aGUgc2FtcGxlZCB3aW5kb3cgb2YgcGFja2V0cyB3aGVuIHRoZXJlIHdhcyBubyBkYXRhCisgKiByZWFkeSB0byBzZW5kIGluIHRoZSB3cml0ZSBxdWV1ZS4KKyAqLworCisvKiBTbmFwc2hvdCB0aGUgY3VycmVudCBkZWxpdmVyeSBpbmZvcm1hdGlvbiBpbiB0aGUgc2tiLCB0byBnZW5lcmF0ZQorICogYSByYXRlIHNhbXBsZSBsYXRlciB3aGVuIHRoZSBza2IgaXMgKHMpYWNrZWQgaW4gdGNwX3JhdGVfc2tiX2RlbGl2ZXJlZCgpLgorICovCit2b2lkIHRjcF9yYXRlX3NrYl9zZW50KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKworCSAvKiBJbiBnZW5lcmFsIHdlIG5lZWQgdG8gc3RhcnQgZGVsaXZlcnkgcmF0ZSBzYW1wbGVzIGZyb20gdGhlCisJICAqIHRpbWUgd2UgcmVjZWl2ZWQgdGhlIG1vc3QgcmVjZW50IEFDSywgdG8gZW5zdXJlIHdlIGluY2x1ZGUKKwkgICogdGhlIGZ1bGwgdGltZSB0aGUgbmV0d29yayBuZWVkcyB0byBkZWxpdmVyIGFsbCBpbi1mbGlnaHQKKwkgICogcGFja2V0cy4gSWYgdGhlcmUgYXJlIG5vIHBhY2tldHMgaW4gZmxpZ2h0IHlldCwgdGhlbiB3ZQorCSAgKiBrbm93IHRoYXQgYW55IEFDS3MgYWZ0ZXIgbm93IGluZGljYXRlIHRoYXQgdGhlIG5ldHdvcmsgd2FzCisJICAqIGFibGUgdG8gZGVsaXZlciB0aG9zZSBwYWNrZXRzIGNvbXBsZXRlbHkgaW4gdGhlIHNhbXBsaW5nCisJICAqIGludGVydmFsIGJldHdlZW4gbm93IGFuZCB0aGUgbmV4dCBBQ0suCisJICAqCisJICAqIE5vdGUgdGhhdCB3ZSB1c2UgcGFja2V0c19vdXQgaW5zdGVhZCBvZiB0Y3BfcGFja2V0c19pbl9mbGlnaHQodHApCisJICAqIGJlY2F1c2UgdGhlIGxhdHRlciBpcyBhIGd1ZXNzIGJhc2VkIG9uIFJUTyBhbmQgbG9zcy1tYXJraW5nCisJICAqIGhldXJpc3RpY3MuIFdlIGRvbid0IHdhbnQgc3B1cmlvdXMgUlRPcyBvciBsb3NzIG1hcmtpbmdzIHRvIGNhdXNlCisJICAqIGEgc3B1cmlvdXNseSBzbWFsbCB0aW1lIGludGVydmFsLCBjYXVzaW5nIGEgc3B1cmlvdXNseSBoaWdoCisJICAqIGJhbmR3aWR0aCBlc3RpbWF0ZS4KKwkgICovCisJaWYgKCF0cC0+cGFja2V0c19vdXQpIHsKKwkJdHAtPmZpcnN0X3R4X21zdGFtcCAgPSBza2ItPnNrYl9tc3RhbXA7CisJCXRwLT5kZWxpdmVyZWRfbXN0YW1wID0gc2tiLT5za2JfbXN0YW1wOworCX0KKworCVRDUF9TS0JfQ0Ioc2tiKS0+dHguZmlyc3RfdHhfbXN0YW1wCT0gdHAtPmZpcnN0X3R4X21zdGFtcDsKKwlUQ1BfU0tCX0NCKHNrYiktPnR4LmRlbGl2ZXJlZF9tc3RhbXAJPSB0cC0+ZGVsaXZlcmVkX21zdGFtcDsKKwlUQ1BfU0tCX0NCKHNrYiktPnR4LmRlbGl2ZXJlZAkJPSB0cC0+ZGVsaXZlcmVkOworCVRDUF9TS0JfQ0Ioc2tiKS0+dHguaXNfYXBwX2xpbWl0ZWQJPSB0cC0+YXBwX2xpbWl0ZWQgPyAxIDogMDsKK30KKworLyogV2hlbiBhbiBza2IgaXMgc2Fja2VkIG9yIGFja2VkLCB3ZSBmaWxsIGluIHRoZSByYXRlIHNhbXBsZSB3aXRoIHRoZSAocHJpb3IpCisgKiBkZWxpdmVyeSBpbmZvcm1hdGlvbiB3aGVuIHRoZSBza2Igd2FzIGxhc3QgdHJhbnNtaXR0ZWQuCisgKgorICogSWYgYW4gQUNLIChzKWFja3MgbXVsdGlwbGUgc2ticyAoZS5nLiwgc3RyZXRjaGVkLWFja3MpLCB0aGlzIGZ1bmN0aW9uIGlzCisgKiBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIFdlIGZhdm9yIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBtb3N0IHJlY2VudGx5CisgKiBzZW50IHNrYiwgaS5lLiwgdGhlIHNrYiB3aXRoIHRoZSBoaWdoZXN0IHByaW9yX2RlbGl2ZXJlZCBjb3VudC4KKyAqLwordm9pZCB0Y3BfcmF0ZV9za2JfZGVsaXZlcmVkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICBzdHJ1Y3QgcmF0ZV9zYW1wbGUgKnJzKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCB0Y3Bfc2tiX2NiICpzY2IgPSBUQ1BfU0tCX0NCKHNrYik7CisKKwlpZiAoIXNjYi0+dHguZGVsaXZlcmVkX21zdGFtcC52NjQpCisJCXJldHVybjsKKworCWlmICghcnMtPnByaW9yX2RlbGl2ZXJlZCB8fAorCSAgICBhZnRlcihzY2ItPnR4LmRlbGl2ZXJlZCwgcnMtPnByaW9yX2RlbGl2ZXJlZCkpIHsKKwkJcnMtPnByaW9yX2RlbGl2ZXJlZCAgPSBzY2ItPnR4LmRlbGl2ZXJlZDsKKwkJcnMtPnByaW9yX21zdGFtcCAgICAgPSBzY2ItPnR4LmRlbGl2ZXJlZF9tc3RhbXA7CisJCXJzLT5pc19hcHBfbGltaXRlZCAgID0gc2NiLT50eC5pc19hcHBfbGltaXRlZDsKKwkJcnMtPmlzX3JldHJhbnMJICAgICA9IHNjYi0+c2Fja2VkICYgVENQQ0JfUkVUUkFOUzsKKworCQkvKiBGaW5kIHRoZSBkdXJhdGlvbiBvZiB0aGUgInNlbmQgcGhhc2UiIG9mIHRoaXMgd2luZG93OiAqLworCQlycy0+aW50ZXJ2YWxfdXMgICAgICA9IHNrYl9tc3RhbXBfdXNfZGVsdGEoCisJCQkJCQkmc2tiLT5za2JfbXN0YW1wLAorCQkJCQkJJnNjYi0+dHguZmlyc3RfdHhfbXN0YW1wKTsKKworCQkvKiBSZWNvcmQgc2VuZCB0aW1lIG9mIG1vc3QgcmVjZW50bHkgQUNLZWQgcGFja2V0OiAqLworCQl0cC0+Zmlyc3RfdHhfbXN0YW1wICA9IHNrYi0+c2tiX21zdGFtcDsKKwl9CisJLyogTWFyayBvZmYgdGhlIHNrYiBkZWxpdmVyZWQgb25jZSBpdCdzIHNhY2tlZCB0byBhdm9pZCBiZWluZworCSAqIHVzZWQgYWdhaW4gd2hlbiBpdCdzIGN1bXVsYXRpdmVseSBhY2tlZC4gRm9yIGFja2VkIHBhY2tldHMKKwkgKiB3ZSBkb24ndCBuZWVkIHRvIHJlc2V0IHNpbmNlIGl0J2xsIGJlIGZyZWVkIHNvb24uCisJICovCisJaWYgKHNjYi0+c2Fja2VkICYgVENQQ0JfU0FDS0VEX0FDS0VEKQorCQlzY2ItPnR4LmRlbGl2ZXJlZF9tc3RhbXAudjY0ID0gMDsKK30KKworLyogVXBkYXRlIHRoZSBjb25uZWN0aW9uIGRlbGl2ZXJ5IGluZm9ybWF0aW9uIGFuZCBnZW5lcmF0ZSBhIHJhdGUgc2FtcGxlLiAqLwordm9pZCB0Y3BfcmF0ZV9nZW4oc3RydWN0IHNvY2sgKnNrLCB1MzIgZGVsaXZlcmVkLCB1MzIgbG9zdCwKKwkJICBzdHJ1Y3Qgc2tiX21zdGFtcCAqbm93LCBzdHJ1Y3QgcmF0ZV9zYW1wbGUgKnJzKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXUzMiBzbmRfdXMsIGFja191czsKKworCS8qIENsZWFyIGFwcCBsaW1pdGVkIGlmIGJ1YmJsZSBpcyBhY2tlZCBhbmQgZ29uZS4gKi8KKwlpZiAodHAtPmFwcF9saW1pdGVkICYmIGFmdGVyKHRwLT5kZWxpdmVyZWQsIHRwLT5hcHBfbGltaXRlZCkpCisJCXRwLT5hcHBfbGltaXRlZCA9IDA7CisKKwkvKiBUT0RPOiB0aGVyZSBhcmUgbXVsdGlwbGUgcGxhY2VzIHRocm91Z2hvdXQgdGNwX2FjaygpIHRvIGdldAorCSAqIGN1cnJlbnQgdGltZS4gUmVmYWN0b3IgdGhlIGNvZGUgdXNpbmcgYSBuZXcgInRjcF9hY2t0YWdfc3RhdGUiCisJICogdG8gY2FycnkgY3VycmVudCB0aW1lLCBmbGFncywgc3RhdHMgbGlrZSAidGNwX3NhY2t0YWdfc3RhdGUiLgorCSAqLworCWlmIChkZWxpdmVyZWQpCisJCXRwLT5kZWxpdmVyZWRfbXN0YW1wID0gKm5vdzsKKworCXJzLT5hY2tlZF9zYWNrZWQgPSBkZWxpdmVyZWQ7CS8qIGZyZXNobHkgQUNLZWQgb3IgU0FDS2VkICovCisJcnMtPmxvc3NlcyA9IGxvc3Q7CQkvKiBmcmVzaGx5IG1hcmtlZCBsb3N0ICovCisJLyogUmV0dXJuIGFuIGludmFsaWQgc2FtcGxlIGlmIG5vIHRpbWluZyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuICovCisJaWYgKCFycy0+cHJpb3JfbXN0YW1wLnY2NCkgeworCQlycy0+ZGVsaXZlcmVkID0gLTE7CisJCXJzLT5pbnRlcnZhbF91cyA9IC0xOworCQlyZXR1cm47CisJfQorCXJzLT5kZWxpdmVyZWQgICA9IHRwLT5kZWxpdmVyZWQgLSBycy0+cHJpb3JfZGVsaXZlcmVkOworCisJLyogTW9kZWwgc2VuZGluZyBkYXRhIGFuZCByZWNlaXZpbmcgQUNLcyBhcyBzZXBhcmF0ZSBwaXBlbGluZSBwaGFzZXMKKwkgKiBmb3IgYSB3aW5kb3cuIFVzdWFsbHkgdGhlIEFDSyBwaGFzZSBpcyBsb25nZXIsIGJ1dCB3aXRoIEFDSworCSAqIGNvbXByZXNzaW9uIHRoZSBzZW5kIHBoYXNlIGNhbiBiZSBsb25nZXIuIFRvIGJlIHNhZmUgd2UgdXNlIHRoZQorCSAqIGxvbmdlciBwaGFzZS4KKwkgKi8KKwlzbmRfdXMgPSBycy0+aW50ZXJ2YWxfdXM7CQkJCS8qIHNlbmQgcGhhc2UgKi8KKwlhY2tfdXMgPSBza2JfbXN0YW1wX3VzX2RlbHRhKG5vdywgJnJzLT5wcmlvcl9tc3RhbXApOwkvKiBhY2sgcGhhc2UgKi8KKwlycy0+aW50ZXJ2YWxfdXMgPSBtYXgoc25kX3VzLCBhY2tfdXMpOworCisJLyogTm9ybWFsbHkgd2UgZXhwZWN0IGludGVydmFsX3VzID49IG1pbi1ydHQuCisJICogTm90ZSB0aGF0IHJhdGUgbWF5IHN0aWxsIGJlIG92ZXItZXN0aW1hdGVkIHdoZW4gYSBzcHVyaW91c2x5CisJICogcmV0cmFuc21pc3R0ZWQgc2tiIHdhcyBmaXJzdCAocylhY2tlZCBiZWNhdXNlICJpbnRlcnZhbF91cyIKKwkgKiBpcyB1bmRlci1lc3RpbWF0ZWQgKHVwIHRvIGFuIFJUVCkuIEhvd2V2ZXIgY29udGludW91c2x5CisJICogbWVhc3VyaW5nIHRoZSBkZWxpdmVyeSByYXRlIGR1cmluZyBsb3NzIHJlY292ZXJ5IGlzIGNydWNpYWwKKwkgKiBmb3IgY29ubmVjdGlvbnMgc3VmZmVyIGhlYXZ5IG9yIHByb2xvbmdlZCBsb3NzZXMuCisJICovCisJaWYgKHVubGlrZWx5KHJzLT5pbnRlcnZhbF91cyA8IHRjcF9taW5fcnR0KHRwKSkpIHsKKwkJaWYgKCFycy0+aXNfcmV0cmFucykKKwkJCXByX2RlYnVnKCJ0Y3AgcmF0ZTogJWxkICVkICV1ICV1ICV1XG4iLAorCQkJCSBycy0+aW50ZXJ2YWxfdXMsIHJzLT5kZWxpdmVyZWQsCisJCQkJIGluZXRfY3NrKHNrKS0+aWNza19jYV9zdGF0ZSwKKwkJCQkgdHAtPnJ4X29wdC5zYWNrX29rLCB0Y3BfbWluX3J0dCh0cCkpOworCQlycy0+aW50ZXJ2YWxfdXMgPSAtMTsKKwkJcmV0dXJuOworCX0KKworCS8qIFJlY29yZCB0aGUgbGFzdCBub24tYXBwLWxpbWl0ZWQgb3IgdGhlIGhpZ2hlc3QgYXBwLWxpbWl0ZWQgYncgKi8KKwlpZiAoIXJzLT5pc19hcHBfbGltaXRlZCB8fAorCSAgICAoKHU2NClycy0+ZGVsaXZlcmVkICogdHAtPnJhdGVfaW50ZXJ2YWxfdXMgPj0KKwkgICAgICh1NjQpdHAtPnJhdGVfZGVsaXZlcmVkICogcnMtPmludGVydmFsX3VzKSkgeworCQl0cC0+cmF0ZV9kZWxpdmVyZWQgPSBycy0+ZGVsaXZlcmVkOworCQl0cC0+cmF0ZV9pbnRlcnZhbF91cyA9IHJzLT5pbnRlcnZhbF91czsKKwkJdHAtPnJhdGVfYXBwX2xpbWl0ZWQgPSBycy0+aXNfYXBwX2xpbWl0ZWQ7CisJfQorfQorCisvKiBJZiBhIGdhcCBpcyBkZXRlY3RlZCBiZXR3ZWVuIHNlbmRzLCBtYXJrIHRoZSBzb2NrZXQgYXBwbGljYXRpb24tbGltaXRlZC4gKi8KK3ZvaWQgdGNwX3JhdGVfY2hlY2tfYXBwX2xpbWl0ZWQoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJaWYgKC8qIFdlIGhhdmUgbGVzcyB0aGFuIG9uZSBwYWNrZXQgdG8gc2VuZC4gKi8KKwkgICAgdHAtPndyaXRlX3NlcSAtIHRwLT5zbmRfbnh0IDwgdHAtPm1zc19jYWNoZSAmJgorCSAgICAvKiBOb3RoaW5nIGluIHNlbmRpbmcgaG9zdCdzIHFkaXNjIHF1ZXVlcyBvciBOSUMgdHggcXVldWUuICovCisJICAgIHNrX3dtZW1fYWxsb2NfZ2V0KHNrKSA8IFNLQl9UUlVFU0laRSgxKSAmJgorCSAgICAvKiBXZSBhcmUgbm90IGxpbWl0ZWQgYnkgQ1dORC4gKi8KKwkgICAgdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKSA8IHRwLT5zbmRfY3duZCAmJgorCSAgICAvKiBBbGwgbG9zdCBwYWNrZXRzIGhhdmUgYmVlbiByZXRyYW5zbWl0dGVkLiAqLworCSAgICB0cC0+bG9zdF9vdXQgPD0gdHAtPnJldHJhbnNfb3V0KQorCQl0cC0+YXBwX2xpbWl0ZWQgPQorCQkJKHRwLT5kZWxpdmVyZWQgKyB0Y3BfcGFja2V0c19pbl9mbGlnaHQodHApKSA/IDogMTsKK30KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF90aW1lci5jIGIvbmV0L2lwdjQvdGNwX3RpbWVyLmMKaW5kZXggZDg0OTMwYi4uM2VhMWNmOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX3RpbWVyLmMKKysrIGIvbmV0L2lwdjQvdGNwX3RpbWVyLmMKQEAgLTE5Miw2ICsxOTIsOCBAQAogCQkJaWYgKHRwLT5zeW5fZGF0YSAmJiBpY3NrLT5pY3NrX3JldHJhbnNtaXRzID09IDEpCiAJCQkJTkVUX0lOQ19TVEFUUyhzb2NrX25ldChzayksCiAJCQkJCSAgICAgIExJTlVYX01JQl9UQ1BGQVNUT1BFTkFDVElWRUZBSUwpOworCQl9IGVsc2UgaWYgKCF0cC0+c3luX2RhdGEgJiYgIXRwLT5zeW5fZmFzdG9wZW4pIHsKKwkJCXNrX3JldGhpbmtfdHhoYXNoKHNrKTsKIAkJfQogCQlyZXRyeV91bnRpbCA9IGljc2stPmljc2tfc3luX3JldHJpZXMgPyA6IG5ldC0+aXB2NC5zeXNjdGxfdGNwX3N5bl9yZXRyaWVzOwogCQlzeW5fc2V0ID0gdHJ1ZTsKQEAgLTIxMyw2ICsyMTUsOCBAQAogCQkJdGNwX210dV9wcm9iaW5nKGljc2ssIHNrKTsKIAogCQkJZHN0X25lZ2F0aXZlX2FkdmljZShzayk7CisJCX0gZWxzZSB7CisJCQlza19yZXRoaW5rX3R4aGFzaChzayk7CiAJCX0KIAogCQlyZXRyeV91bnRpbCA9IG5ldC0+aXB2NC5zeXNjdGxfdGNwX3JldHJpZXMyOwpAQCAtMzg0LDYgKzM4OCw3IEBACiAJICovCiAJaW5ldF9ydHhfc3luX2FjayhzaywgcmVxKTsKIAlyZXEtPm51bV90aW1lb3V0Kys7CisJaWNzay0+aWNza19yZXRyYW5zbWl0cysrOwogCWluZXRfY3NrX3Jlc2V0X3htaXRfdGltZXIoc2ssIElDU0tfVElNRV9SRVRSQU5TLAogCQkJICBUQ1BfVElNRU9VVF9JTklUIDw8IHJlcS0+bnVtX3RpbWVvdXQsIFRDUF9SVE9fTUFYKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF95ZWFoLmMgYi9uZXQvaXB2NC90Y3BfeWVhaC5jCmluZGV4IDAyOGViMDQuLjljNWZjOTcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF95ZWFoLmMKKysrIGIvbmV0L2lwdjQvdGNwX3llYWguYwpAQCAtNzYsNyArNzYsNyBAQAogCWlmICghdGNwX2lzX2N3bmRfbGltaXRlZChzaykpCiAJCXJldHVybjsKIAotCWlmICh0cC0+c25kX2N3bmQgPD0gdHAtPnNuZF9zc3RocmVzaCkKKwlpZiAodGNwX2luX3Nsb3dfc3RhcnQodHApKQogCQl0Y3Bfc2xvd19zdGFydCh0cCwgYWNrZWQpOwogCiAJZWxzZSBpZiAoIXllYWgtPmRvaW5nX3Jlbm9fbm93KSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC91ZHAuYyBiL25ldC9pcHY0L3VkcC5jCmluZGV4IGU2MWY3Y2QuLjdkOTZkYzIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3VkcC5jCisrKyBiL25ldC9pcHY0L3VkcC5jCkBAIC0xMTQsNiArMTE0LDcgQEAKICNpbmNsdWRlIDxuZXQvYnVzeV9wb2xsLmg+CiAjaW5jbHVkZSAidWRwX2ltcGwuaCIKICNpbmNsdWRlIDxuZXQvc29ja19yZXVzZXBvcnQuaD4KKyNpbmNsdWRlIDxuZXQvYWRkcmNvbmYuaD4KIAogc3RydWN0IHVkcF90YWJsZSB1ZHBfdGFibGUgX19yZWFkX21vc3RseTsKIEVYUE9SVF9TWU1CT0wodWRwX3RhYmxlKTsKQEAgLTEwMjAsMTIgKzEwMjEsNiBAQAogCQkJCSAgIGZsb3dfZmxhZ3MsCiAJCQkJICAgZmFkZHIsIHNhZGRyLCBkcG9ydCwgaW5ldC0+aW5ldF9zcG9ydCk7CiAKLQkJaWYgKCFzYWRkciAmJiBpcGMub2lmKSB7Ci0JCQllcnIgPSBsM21kZXZfZ2V0X3NhZGRyKG5ldCwgaXBjLm9pZiwgZmw0KTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCWdvdG8gb3V0OwotCQl9Ci0KIAkJc2VjdXJpdHlfc2tfY2xhc3NpZnlfZmxvdyhzaywgZmxvd2k0X3RvX2Zsb3dpKGZsNCkpOwogCQlydCA9IGlwX3JvdXRlX291dHB1dF9mbG93KG5ldCwgZmw0LCBzayk7CiAJCWlmIChJU19FUlIocnQpKSB7CkBAIC0xMTgyLDEzICsxMTc3LDEzIEBACiAgKglAc2s6IHNvY2tldAogICoKICAqCURyb3BzIGFsbCBiYWQgY2hlY2tzdW0gZnJhbWVzLCB1bnRpbCBhIHZhbGlkIG9uZSBpcyBmb3VuZC4KLSAqCVJldHVybnMgdGhlIGxlbmd0aCBvZiBmb3VuZCBza2IsIG9yIDAgaWYgbm9uZSBpcyBmb3VuZC4KKyAqCVJldHVybnMgdGhlIGxlbmd0aCBvZiBmb3VuZCBza2IsIG9yIC0xIGlmIG5vbmUgaXMgZm91bmQuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZmlyc3RfcGFja2V0X2xlbmd0aChzdHJ1Y3Qgc29jayAqc2spCitzdGF0aWMgaW50IGZpcnN0X3BhY2tldF9sZW5ndGgoc3RydWN0IHNvY2sgKnNrKQogewogCXN0cnVjdCBza19idWZmX2hlYWQgbGlzdF9raWxsLCAqcmN2cSA9ICZzay0+c2tfcmVjZWl2ZV9xdWV1ZTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXVuc2lnbmVkIGludCByZXM7CisJaW50IHJlczsKIAogCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbGlzdF9raWxsKTsKIApAQCAtMTIwMyw3ICsxMTk4LDcgQEAKIAkJX19za2JfdW5saW5rKHNrYiwgcmN2cSk7CiAJCV9fc2tiX3F1ZXVlX3RhaWwoJmxpc3Rfa2lsbCwgc2tiKTsKIAl9Ci0JcmVzID0gc2tiID8gc2tiLT5sZW4gOiAwOworCXJlcyA9IHNrYiA/IHNrYi0+bGVuIDogLTE7CiAJc3Bpbl91bmxvY2tfYmgoJnJjdnEtPmxvY2spOwogCiAJaWYgKCFza2JfcXVldWVfZW1wdHkoJmxpc3Rfa2lsbCkpIHsKQEAgLTEyMzIsNyArMTIyNyw3IEBACiAKIAljYXNlIFNJT0NJTlE6CiAJewotCQl1bnNpZ25lZCBpbnQgYW1vdW50ID0gZmlyc3RfcGFja2V0X2xlbmd0aChzayk7CisJCWludCBhbW91bnQgPSBtYXhfdChpbnQsIDAsIGZpcnN0X3BhY2tldF9sZW5ndGgoc2spKTsKIAogCQlyZXR1cm4gcHV0X3VzZXIoYW1vdW50LCAoaW50IF9fdXNlciAqKWFyZyk7CiAJfQpAQCAtMjE4NCw3ICsyMTc5LDcgQEAKIAogCS8qIENoZWNrIGZvciBmYWxzZSBwb3NpdGl2ZXMgZHVlIHRvIGNoZWNrc3VtIGVycm9ycyAqLwogCWlmICgobWFzayAmIFBPTExSRE5PUk0pICYmICEoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spICYmCi0JICAgICEoc2stPnNrX3NodXRkb3duICYgUkNWX1NIVVRET1dOKSAmJiAhZmlyc3RfcGFja2V0X2xlbmd0aChzaykpCisJICAgICEoc2stPnNrX3NodXRkb3duICYgUkNWX1NIVVRET1dOKSAmJiBmaXJzdF9wYWNrZXRfbGVuZ3RoKHNrKSA9PSAtMSkKIAkJbWFzayAmPSB+KFBPTExJTiB8IFBPTExSRE5PUk0pOwogCiAJcmV0dXJuIG1hc2s7CkBAIC0yMTkyLDYgKzIxODcsMjAgQEAKIH0KIEVYUE9SVF9TWU1CT0wodWRwX3BvbGwpOwogCitpbnQgdWRwX2Fib3J0KHN0cnVjdCBzb2NrICpzaywgaW50IGVycikKK3sKKwlsb2NrX3NvY2soc2spOworCisJc2stPnNrX2VyciA9IGVycjsKKwlzay0+c2tfZXJyb3JfcmVwb3J0KHNrKTsKKwl1ZHBfZGlzY29ubmVjdChzaywgMCk7CisKKwlyZWxlYXNlX3NvY2soc2spOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1ZHBfYWJvcnQpOworCiBzdHJ1Y3QgcHJvdG8gdWRwX3Byb3QgPSB7CiAJLm5hbWUJCSAgID0gIlVEUCIsCiAJLm93bmVyCQkgICA9IFRISVNfTU9EVUxFLApAQCAtMjIxNiwxMyArMjIyNSwxMiBAQAogCS5zeXNjdGxfd21lbQkgICA9ICZzeXNjdGxfdWRwX3dtZW1fbWluLAogCS5zeXNjdGxfcm1lbQkgICA9ICZzeXNjdGxfdWRwX3JtZW1fbWluLAogCS5vYmpfc2l6ZQkgICA9IHNpemVvZihzdHJ1Y3QgdWRwX3NvY2spLAotCS5zbGFiX2ZsYWdzCSAgID0gU0xBQl9ERVNUUk9ZX0JZX1JDVSwKIAkuaC51ZHBfdGFibGUJICAgPSAmdWRwX3RhYmxlLAogI2lmZGVmIENPTkZJR19DT01QQVQKIAkuY29tcGF0X3NldHNvY2tvcHQgPSBjb21wYXRfdWRwX3NldHNvY2tvcHQsCiAJLmNvbXBhdF9nZXRzb2Nrb3B0ID0gY29tcGF0X3VkcF9nZXRzb2Nrb3B0LAogI2VuZGlmCi0JLmNsZWFyX3NrCSAgID0gc2tfcHJvdF9jbGVhcl9wb3J0YWRkcl9udWxscywKKwkuZGlhZ19kZXN0cm95CSAgID0gdWRwX2Fib3J0LAogfTsKIEVYUE9SVF9TWU1CT0wodWRwX3Byb3QpOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC91ZHBfZGlhZy5jIGIvbmV0L2lwdjQvdWRwX2RpYWcuYwppbmRleCAzZDVjY2Y0Li45YTg5YzEwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC91ZHBfZGlhZy5jCisrKyBiL25ldC9pcHY0L3VkcF9kaWFnLmMKQEAgLTIwLDcgKzIwLDcgQEAKIHN0YXRpYyBpbnQgc2tfZGlhZ19kdW1wKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCXN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKIAkJCWNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyZXEsCi0JCQlzdHJ1Y3QgbmxhdHRyICpiYykKKwkJCXN0cnVjdCBubGF0dHIgKmJjLCBib29sIG5ldF9hZG1pbikKIHsKIAlpZiAoIWluZXRfZGlhZ19iY19zayhiYywgc2spKQogCQlyZXR1cm4gMDsKQEAgLTI4LDcgKzI4LDcgQEAKIAlyZXR1cm4gaW5ldF9za19kaWFnX2ZpbGwoc2ssIE5VTEwsIHNrYiwgcmVxLAogCQkJc2tfdXNlcl9ucyhORVRMSU5LX0NCKGNiLT5za2IpLnNrKSwKIAkJCU5FVExJTktfQ0IoY2ItPnNrYikucG9ydGlkLAotCQkJY2ItPm5saC0+bmxtc2dfc2VxLCBOTE1fRl9NVUxUSSwgY2ItPm5saCk7CisJCQljYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLCBjYi0+bmxoLCBuZXRfYWRtaW4pOwogfQogCiBzdGF0aWMgaW50IHVkcF9kdW1wX29uZShzdHJ1Y3QgdWRwX3RhYmxlICp0YmwsIHN0cnVjdCBza19idWZmICppbl9za2IsCkBAIC03Niw3ICs3Niw4IEBACiAJZXJyID0gaW5ldF9za19kaWFnX2ZpbGwoc2ssIE5VTEwsIHJlcCwgcmVxLAogCQkJICAgc2tfdXNlcl9ucyhORVRMSU5LX0NCKGluX3NrYikuc2spLAogCQkJICAgTkVUTElOS19DQihpbl9za2IpLnBvcnRpZCwKLQkJCSAgIG5saC0+bmxtc2dfc2VxLCAwLCBubGgpOworCQkJICAgbmxoLT5ubG1zZ19zZXEsIDAsIG5saCwKKwkJCSAgIG5ldGxpbmtfbmV0X2NhcGFibGUoaW5fc2tiLCBDQVBfTkVUX0FETUlOKSk7CiAJaWYgKGVyciA8IDApIHsKIAkJV0FSTl9PTihlcnIgPT0gLUVNU0dTSVpFKTsKIAkJa2ZyZWVfc2tiKHJlcCk7CkBAIC05Nyw2ICs5OCw3IEBACiAJCSAgICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAogCQkgICAgIGNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyLCBzdHJ1Y3QgbmxhdHRyICpiYykKIHsKKwlib29sIG5ldF9hZG1pbiA9IG5ldGxpbmtfbmV0X2NhcGFibGUoY2ItPnNrYiwgQ0FQX05FVF9BRE1JTik7CiAJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2tiLT5zayk7CiAJaW50IG51bSwgc19udW0sIHNsb3QsIHNfc2xvdDsKIApAQCAtMTMyLDcgKzEzNCw3IEBACiAJCQkgICAgci0+aWQuaWRpYWdfZHBvcnQpCiAJCQkJZ290byBuZXh0OwogCi0JCQlpZiAoc2tfZGlhZ19kdW1wKHNrLCBza2IsIGNiLCByLCBiYykgPCAwKSB7CisJCQlpZiAoc2tfZGlhZ19kdW1wKHNrLCBza2IsIGNiLCByLCBiYywgbmV0X2FkbWluKSA8IDApIHsKIAkJCQlzcGluX3VubG9ja19iaCgmaHNsb3QtPmxvY2spOwogCQkJCWdvdG8gZG9uZTsKIAkJCX0KQEAgLTE2NSwxMiArMTY3LDg4IEBACiAJci0+aWRpYWdfd3F1ZXVlID0gc2tfd21lbV9hbGxvY19nZXQoc2spOwogfQogCisjaWZkZWYgQ09ORklHX0lORVRfRElBR19ERVNUUk9ZCitzdGF0aWMgaW50IF9fdWRwX2RpYWdfZGVzdHJveShzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLAorCQkJICAgICAgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnJlcSwKKwkJCSAgICAgIHN0cnVjdCB1ZHBfdGFibGUgKnRibCkKK3sKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChpbl9za2ItPnNrKTsKKwlzdHJ1Y3Qgc29jayAqc2s7CisJaW50IGVycjsKKworCXJjdV9yZWFkX2xvY2soKTsKKworCWlmIChyZXEtPnNkaWFnX2ZhbWlseSA9PSBBRl9JTkVUKQorCQlzayA9IF9fdWRwNF9saWJfbG9va3VwKG5ldCwKKwkJCQlyZXEtPmlkLmlkaWFnX2RzdFswXSwgcmVxLT5pZC5pZGlhZ19kcG9ydCwKKwkJCQlyZXEtPmlkLmlkaWFnX3NyY1swXSwgcmVxLT5pZC5pZGlhZ19zcG9ydCwKKwkJCQlyZXEtPmlkLmlkaWFnX2lmLCB0YmwsIE5VTEwpOworI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCisJZWxzZSBpZiAocmVxLT5zZGlhZ19mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJaWYgKGlwdjZfYWRkcl92NG1hcHBlZCgoc3RydWN0IGluNl9hZGRyICopcmVxLT5pZC5pZGlhZ19kc3QpICYmCisJCSAgICBpcHY2X2FkZHJfdjRtYXBwZWQoKHN0cnVjdCBpbjZfYWRkciAqKXJlcS0+aWQuaWRpYWdfc3JjKSkKKwkJCXNrID0gX191ZHA0X2xpYl9sb29rdXAobmV0LAorCQkJCQlyZXEtPmlkLmlkaWFnX2RzdFszXSwgcmVxLT5pZC5pZGlhZ19kcG9ydCwKKwkJCQkJcmVxLT5pZC5pZGlhZ19zcmNbM10sIHJlcS0+aWQuaWRpYWdfc3BvcnQsCisJCQkJCXJlcS0+aWQuaWRpYWdfaWYsIHRibCwgTlVMTCk7CisKKwkJZWxzZQorCQkJc2sgPSBfX3VkcDZfbGliX2xvb2t1cChuZXQsCisJCQkJCShzdHJ1Y3QgaW42X2FkZHIgKilyZXEtPmlkLmlkaWFnX2RzdCwKKwkJCQkJcmVxLT5pZC5pZGlhZ19kcG9ydCwKKwkJCQkJKHN0cnVjdCBpbjZfYWRkciAqKXJlcS0+aWQuaWRpYWdfc3JjLAorCQkJCQlyZXEtPmlkLmlkaWFnX3Nwb3J0LAorCQkJCQlyZXEtPmlkLmlkaWFnX2lmLCB0YmwsIE5VTEwpOworCX0KKyNlbmRpZgorCWVsc2UgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHNrICYmICFhdG9taWNfaW5jX25vdF96ZXJvKCZzay0+c2tfcmVmY250KSkKKwkJc2sgPSBOVUxMOworCisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlpZiAoIXNrKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWlmIChzb2NrX2RpYWdfY2hlY2tfY29va2llKHNrLCByZXEtPmlkLmlkaWFnX2Nvb2tpZSkpIHsKKwkJc29ja19wdXQoc2spOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwllcnIgPSBzb2NrX2RpYWdfZGVzdHJveShzaywgRUNPTk5BQk9SVEVEKTsKKworCXNvY2tfcHV0KHNrKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdWRwX2RpYWdfZGVzdHJveShzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLAorCQkJICAgIGNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyZXEpCit7CisJcmV0dXJuIF9fdWRwX2RpYWdfZGVzdHJveShpbl9za2IsIHJlcSwgJnVkcF90YWJsZSk7Cit9CisKK3N0YXRpYyBpbnQgdWRwbGl0ZV9kaWFnX2Rlc3Ryb3koc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwKKwkJCQljb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiAqcmVxKQoreworCXJldHVybiBfX3VkcF9kaWFnX2Rlc3Ryb3koaW5fc2tiLCByZXEsICZ1ZHBsaXRlX3RhYmxlKTsKK30KKworI2VuZGlmCisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX2hhbmRsZXIgdWRwX2RpYWdfaGFuZGxlciA9IHsKIAkuZHVtcAkJID0gdWRwX2RpYWdfZHVtcCwKIAkuZHVtcF9vbmUJID0gdWRwX2RpYWdfZHVtcF9vbmUsCiAJLmlkaWFnX2dldF9pbmZvICA9IHVkcF9kaWFnX2dldF9pbmZvLAogCS5pZGlhZ190eXBlCSA9IElQUFJPVE9fVURQLAogCS5pZGlhZ19pbmZvX3NpemUgPSAwLAorI2lmZGVmIENPTkZJR19JTkVUX0RJQUdfREVTVFJPWQorCS5kZXN0cm95CSA9IHVkcF9kaWFnX2Rlc3Ryb3ksCisjZW5kaWYKIH07CiAKIHN0YXRpYyB2b2lkIHVkcGxpdGVfZGlhZ19kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKQEAgLTE5Miw2ICsyNzAsOSBAQAogCS5pZGlhZ19nZXRfaW5mbyAgPSB1ZHBfZGlhZ19nZXRfaW5mbywKIAkuaWRpYWdfdHlwZQkgPSBJUFBST1RPX1VEUExJVEUsCiAJLmlkaWFnX2luZm9fc2l6ZSA9IDAsCisjaWZkZWYgQ09ORklHX0lORVRfRElBR19ERVNUUk9ZCisJLmRlc3Ryb3kJID0gdWRwbGl0ZV9kaWFnX2Rlc3Ryb3ksCisjZW5kaWYKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHVkcF9kaWFnX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3VkcF9vZmZsb2FkLmMgYi9uZXQvaXB2NC91ZHBfb2ZmbG9hZC5jCmluZGV4IDgxZjI1M2IuLmY5MzMzYzkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3VkcF9vZmZsb2FkLmMKKysrIGIvbmV0L2lwdjQvdWRwX29mZmxvYWQuYwpAQCAtMjEsNyArMjEsNyBAQAogCV9fYmUxNiBuZXdfcHJvdG9jb2wsIGJvb2wgaXNfaXB2NikKIHsKIAlpbnQgdG5sX2hsZW4gPSBza2JfaW5uZXJfbWFjX2hlYWRlcihza2IpIC0gc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKLQlib29sIHJlbWNzdW0sIG5lZWRfY3N1bSwgb2ZmbG9hZF9jc3VtLCB1Zm87CisJYm9vbCByZW1jc3VtLCBuZWVkX2NzdW0sIG9mZmxvYWRfY3N1bSwgdWZvLCBnc29fcGFydGlhbDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2VncyA9IEVSUl9QVFIoLUVJTlZBTCk7CiAJc3RydWN0IHVkcGhkciAqdWggPSB1ZHBfaGRyKHNrYik7CiAJdTE2IG1hY19vZmZzZXQgPSBza2ItPm1hY19oZWFkZXI7CkBAIC04OCw2ICs4OCw4IEBACiAJCWdvdG8gb3V0OwogCX0KIAorCWdzb19wYXJ0aWFsID0gISEoc2tiX3NoaW5mbyhzZWdzKS0+Z3NvX3R5cGUgJiBTS0JfR1NPX1BBUlRJQUwpOworCiAJb3V0ZXJfaGxlbiA9IHNrYl90bmxfaGVhZGVyX2xlbihza2IpOwogCXVkcF9vZmZzZXQgPSBvdXRlcl9obGVuIC0gdG5sX2hsZW47CiAJc2tiID0gc2VnczsKQEAgLTExNyw3ICsxMTksNyBAQAogCQkgKiB3aWxsIGJlIHVzaW5nIGEgbGVuZ3RoIHZhbHVlIGVxdWFsIHRvIG9ubHkgb25lIE1TUyBzaXplZAogCQkgKiBzZWdtZW50IGluc3RlYWQgb2YgdGhlIGVudGlyZSBmcmFtZS4KIAkJICovCi0JCWlmIChza2JfaXNfZ3NvKHNrYikpIHsKKwkJaWYgKGdzb19wYXJ0aWFsKSB7CiAJCQl1aC0+bGVuID0gaHRvbnMoc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSArCiAJCQkJCVNLQl9HU09fQ0Ioc2tiKS0+ZGF0YV9vZmZzZXQgKwogCQkJCQlza2ItPmhlYWQgLSAodW5zaWduZWQgY2hhciAqKXVoKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3VkcGxpdGUuYyBiL25ldC9pcHY0L3VkcGxpdGUuYwppbmRleCAzYjNlZmJkLi5hZjgxNzE1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC91ZHBsaXRlLmMKKysrIGIvbmV0L2lwdjQvdWRwbGl0ZS5jCkBAIC01NSwxMyArNTUsMTEgQEAKIAkudW5oYXNoCQkgICA9IHVkcF9saWJfdW5oYXNoLAogCS5nZXRfcG9ydAkgICA9IHVkcF92NF9nZXRfcG9ydCwKIAkub2JqX3NpemUJICAgPSBzaXplb2Yoc3RydWN0IHVkcF9zb2NrKSwKLQkuc2xhYl9mbGFncwkgICA9IFNMQUJfREVTVFJPWV9CWV9SQ1UsCiAJLmgudWRwX3RhYmxlCSAgID0gJnVkcGxpdGVfdGFibGUsCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCS5jb21wYXRfc2V0c29ja29wdCA9IGNvbXBhdF91ZHBfc2V0c29ja29wdCwKIAkuY29tcGF0X2dldHNvY2tvcHQgPSBjb21wYXRfdWRwX2dldHNvY2tvcHQsCiAjZW5kaWYKLQkuY2xlYXJfc2sJICAgPSBza19wcm90X2NsZWFyX3BvcnRhZGRyX251bGxzLAogfTsKIEVYUE9SVF9TWU1CT0wodWRwbGl0ZV9wcm90KTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQveGZybTRfcG9saWN5LmMgYi9uZXQvaXB2NC94ZnJtNF9wb2xpY3kuYwppbmRleCBiNjQ0YTIzLi42YTdmZjY5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC94ZnJtNF9wb2xpY3kuYworKysgYi9uZXQvaXB2NC94ZnJtNF9wb2xpY3kuYwpAQCAtMjksNyArMjksNyBAQAogCW1lbXNldChmbDQsIDAsIHNpemVvZigqZmw0KSk7CiAJZmw0LT5kYWRkciA9IGRhZGRyLT5hNDsKIAlmbDQtPmZsb3dpNF90b3MgPSB0b3M7Ci0JZmw0LT5mbG93aTRfb2lmID0gb2lmOworCWZsNC0+Zmxvd2k0X29pZiA9IGwzbWRldl9tYXN0ZXJfaWZpbmRleF9ieV9pbmRleChuZXQsIG9pZik7CiAJaWYgKHNhZGRyKQogCQlmbDQtPnNhZGRyID0gc2FkZHItPmE0OwogCkBAIC0xMTIsNyArMTEyLDcgQEAKIAlpbnQgb2lmID0gMDsKIAogCWlmIChza2JfZHN0KHNrYikpCi0JCW9pZiA9IGwzbWRldl9maWJfb2lmKHNrYl9kc3Qoc2tiKS0+ZGV2KTsKKwkJb2lmID0gc2tiX2RzdChza2IpLT5kZXYtPmlmaW5kZXg7CiAKIAltZW1zZXQoZmw0LCAwLCBzaXplb2Yoc3RydWN0IGZsb3dpNCkpOwogCWZsNC0+Zmxvd2k0X21hcmsgPSBza2ItPm1hcms7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9hZGRyY29uZi5jIGIvbmV0L2lwdjYvYWRkcmNvbmYuYwppbmRleCBhYjNlNzk2Li5jYmQ5MzQzIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9hZGRyY29uZi5jCisrKyBiL25ldC9pcHY2L2FkZHJjb25mLmMKQEAgLTExMiw2ICsxMTIsMjcgQEAKIAlyZXR1cm4gKGNzdGFtcCAtIElOSVRJQUxfSklGRklFUykgKiAxMDBVTCAvIEhaOwogfQogCitzdGF0aWMgaW5saW5lIHMzMiByZmMzMzE1X3MxNF9iYWNrb2ZmX2luaXQoczMyIGlydCkKK3sKKwkvKiBtdWx0aXBseSAnaW5pdGlhbCByZXRyYW5zbWlzc2lvbiB0aW1lJyBieSAwLjkgLi4gMS4xICovCisJdTY0IHRtcCA9ICg5MDAwMDAgKyBwcmFuZG9tX3UzMigpICUgMjAwMDAxKSAqICh1NjQpaXJ0OworCWRvX2Rpdih0bXAsIDEwMDAwMDApOworCXJldHVybiAoczMyKXRtcDsKK30KKworc3RhdGljIGlubGluZSBzMzIgcmZjMzMxNV9zMTRfYmFja29mZl91cGRhdGUoczMyIHJ0LCBzMzIgbXJ0KQoreworCS8qIG11bHRpcGx5ICdyZXRyYW5zbWlzc2lvbiB0aW1lb3V0JyBieSAxLjkgLi4gMi4xICovCisJdTY0IHRtcCA9ICgxOTAwMDAwICsgcHJhbmRvbV91MzIoKSAlIDIwMDAwMSkgKiAodTY0KXJ0OworCWRvX2Rpdih0bXAsIDEwMDAwMDApOworCWlmICgoczMyKXRtcCA+IG1ydCkgeworCQkvKiBtdWx0aXBseSAnbWF4aW11bSByZXRyYW5zbWlzc2lvbiB0aW1lJyBieSAwLjkgLi4gMS4xICovCisJCXRtcCA9ICg5MDAwMDAgKyBwcmFuZG9tX3UzMigpICUgMjAwMDAxKSAqICh1NjQpbXJ0OworCQlkb19kaXYodG1wLCAxMDAwMDAwKTsKKwl9CisJcmV0dXJuIChzMzIpdG1wOworfQorCiAjaWZkZWYgQ09ORklHX1NZU0NUTAogc3RhdGljIGludCBhZGRyY29uZl9zeXNjdGxfcmVnaXN0ZXIoc3RydWN0IGluZXQ2X2RldiAqaWRldik7CiBzdGF0aWMgdm9pZCBhZGRyY29uZl9zeXNjdGxfdW5yZWdpc3RlcihzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KTsKQEAgLTE4Nyw2ICsyMDgsNyBAQAogCS5kYWRfdHJhbnNtaXRzCQk9IDEsCiAJLnJ0cl9zb2xpY2l0cwkJPSBNQVhfUlRSX1NPTElDSVRBVElPTlMsCiAJLnJ0cl9zb2xpY2l0X2ludGVydmFsCT0gUlRSX1NPTElDSVRBVElPTl9JTlRFUlZBTCwKKwkucnRyX3NvbGljaXRfbWF4X2ludGVydmFsID0gUlRSX1NPTElDSVRBVElPTl9NQVhfSU5URVJWQUwsCiAJLnJ0cl9zb2xpY2l0X2RlbGF5CT0gTUFYX1JUUl9TT0xJQ0lUQVRJT05fREVMQVksCiAJLnVzZV90ZW1wYWRkcgkJPSAwLAogCS50ZW1wX3ZhbGlkX2xmdAkJPSBURU1QX1ZBTElEX0xJRkVUSU1FLApAQCAtMjMyLDYgKzI1NCw3IEBACiAJLmRhZF90cmFuc21pdHMJCT0gMSwKIAkucnRyX3NvbGljaXRzCQk9IE1BWF9SVFJfU09MSUNJVEFUSU9OUywKIAkucnRyX3NvbGljaXRfaW50ZXJ2YWwJPSBSVFJfU09MSUNJVEFUSU9OX0lOVEVSVkFMLAorCS5ydHJfc29saWNpdF9tYXhfaW50ZXJ2YWwgPSBSVFJfU09MSUNJVEFUSU9OX01BWF9JTlRFUlZBTCwKIAkucnRyX3NvbGljaXRfZGVsYXkJPSBNQVhfUlRSX1NPTElDSVRBVElPTl9ERUxBWSwKIAkudXNlX3RlbXBhZGRyCQk9IDAsCiAJLnRlbXBfdmFsaWRfbGZ0CQk9IFRFTVBfVkFMSURfTElGRVRJTUUsCkBAIC03NzgsNyArODAxLDE0IEBACiAJfQogCiAJaWYgKHAgPT0gJm5ldC0+aXB2Ni5kZXZjb25mX2FsbC0+Zm9yd2FyZGluZykgeworCQlpbnQgb2xkX2RmbHQgPSBuZXQtPmlwdjYuZGV2Y29uZl9kZmx0LT5mb3J3YXJkaW5nOworCiAJCW5ldC0+aXB2Ni5kZXZjb25mX2RmbHQtPmZvcndhcmRpbmcgPSBuZXdmOworCQlpZiAoKCFuZXdmKSBeICghb2xkX2RmbHQpKQorCQkJaW5ldDZfbmV0Y29uZl9ub3RpZnlfZGV2Y29uZihuZXQsIE5FVENPTkZBX0ZPUldBUkRJTkcsCisJCQkJCQkgICAgIE5FVENPTkZBX0lGSU5ERVhfREVGQVVMVCwKKwkJCQkJCSAgICAgbmV0LT5pcHY2LmRldmNvbmZfZGZsdCk7CisKIAkJYWRkcmNvbmZfZm9yd2FyZF9jaGFuZ2UobmV0LCBuZXdmKTsKIAkJaWYgKCghbmV3ZikgXiAoIW9sZCkpCiAJCQlpbmV0Nl9uZXRjb25mX25vdGlmeV9kZXZjb25mKG5ldCwgTkVUQ09ORkFfRk9SV0FSRElORywKQEAgLTE4NzIsNyArMTkwMiw2IEBACiAKIHZvaWQgYWRkcmNvbmZfZGFkX2ZhaWx1cmUoc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwKQogewotCXN0cnVjdCBpbjZfYWRkciBhZGRyOwogCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSBpZnAtPmlkZXY7CiAJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChpZnAtPmlkZXYtPmRldik7CiAKQEAgLTE5MzQsMTggKzE5NjMsNiBAQAogCQlpbjZfaWZhX3B1dChpZnAyKTsKIGxvY2tfZXJyZGFkOgogCQlzcGluX2xvY2tfYmgoJmlmcC0+bG9jayk7Ci0JfSBlbHNlIGlmIChpZGV2LT5jbmYuYWNjZXB0X2RhZCA+IDEgJiYgIWlkZXYtPmNuZi5kaXNhYmxlX2lwdjYpIHsKLQkJYWRkci5zNl9hZGRyMzJbMF0gPSBodG9ubCgweGZlODAwMDAwKTsKLQkJYWRkci5zNl9hZGRyMzJbMV0gPSAwOwotCi0JCWlmICghaXB2Nl9nZW5lcmF0ZV9ldWk2NChhZGRyLnM2X2FkZHIgKyA4LCBpZGV2LT5kZXYpICYmCi0JCSAgICBpcHY2X2FkZHJfZXF1YWwoJmlmcC0+YWRkciwgJmFkZHIpKSB7Ci0JCQkvKiBEQUQgZmFpbGVkIGZvciBsaW5rLWxvY2FsIGJhc2VkIG9uIE1BQyBhZGRyZXNzICovCi0JCQlpZGV2LT5jbmYuZGlzYWJsZV9pcHY2ID0gMTsKLQotCQkJcHJfaW5mbygiJXM6IElQdjYgYmVpbmcgZGlzYWJsZWQhXG4iLAotCQkJCWlmcC0+aWRldi0+ZGV2LT5uYW1lKTsKLQkJfQogCX0KIAogZXJyZGFkOgpAQCAtMTk1NCw2ICsxOTcxLDcgQEAKIAlzcGluX3VubG9ja19iaCgmaWZwLT5sb2NrKTsKIAogCWFkZHJjb25mX21vZF9kYWRfd29yayhpZnAsIDApOworCWluNl9pZmFfcHV0KGlmcCk7CiB9CiAKIC8qIEpvaW4gdG8gc29saWNpdGVkIGFkZHIgbXVsdGljYXN0IGdyb3VwLgpAQCAtMzU0Myw3ICszNTYxLDcgQEAKIAkvKiBjb21iaW5lIHRoZSB1c2VyIGNvbmZpZyB3aXRoIGV2ZW50IHRvIGRldGVybWluZSBpZiBwZXJtYW5lbnQKIAkgKiBhZGRyZXNzZXMgYXJlIHRvIGJlIHJlbW92ZWQgZnJvbSBhZGRyZXNzIGhhc2ggdGFibGUKIAkgKi8KLQlrZWVwX2FkZHIgPSAhKGhvdyB8fCBfa2VlcF9hZGRyIDw9IDApOworCWtlZXBfYWRkciA9ICEoaG93IHx8IF9rZWVwX2FkZHIgPD0gMCB8fCBpZGV2LT5jbmYuZGlzYWJsZV9pcHY2KTsKIAogCS8qIFN0ZXAgMjogY2xlYXIgaGFzaCB0YWJsZSAqLwogCWZvciAoaSA9IDA7IGkgPCBJTjZfQUREUl9IU0laRTsgaSsrKSB7CkBAIC0zNTk5LDcgKzM2MTcsNyBAQAogCS8qIHJlLWNvbWJpbmUgdGhlIHVzZXIgY29uZmlnIHdpdGggZXZlbnQgdG8gZGV0ZXJtaW5lIGlmIHBlcm1hbmVudAogCSAqIGFkZHJlc3NlcyBhcmUgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBpbnRlcmZhY2UgbGlzdAogCSAqLwotCWtlZXBfYWRkciA9ICghaG93ICYmIF9rZWVwX2FkZHIgPiAwKTsKKwlrZWVwX2FkZHIgPSAoIWhvdyAmJiBfa2VlcF9hZGRyID4gMCAmJiAhaWRldi0+Y25mLmRpc2FibGVfaXB2Nik7CiAKIAlJTklUX0xJU1RfSEVBRCgmZGVsX2xpc3QpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpZmEsIHRtcCwgJmlkZXYtPmFkZHJfbGlzdCwgaWZfbGlzdCkgewpAQCAtMzY5Miw3ICszNzEwLDcgQEAKIAlpZiAoaWRldi0+aWZfZmxhZ3MgJiBJRl9SQV9SQ1ZEKQogCQlnb3RvIG91dDsKIAotCWlmIChpZGV2LT5yc19wcm9iZXMrKyA8IGlkZXYtPmNuZi5ydHJfc29saWNpdHMpIHsKKwlpZiAoaWRldi0+cnNfcHJvYmVzKysgPCBpZGV2LT5jbmYucnRyX3NvbGljaXRzIHx8IGlkZXYtPmNuZi5ydHJfc29saWNpdHMgPCAwKSB7CiAJCXdyaXRlX3VubG9jaygmaWRldi0+bG9jayk7CiAJCWlmICghaXB2Nl9nZXRfbGxhZGRyKGRldiwgJmxsYWRkciwgSUZBX0ZfVEVOVEFUSVZFKSkKIAkJCW5kaXNjX3NlbmRfcnMoZGV2LCAmbGxhZGRyLApAQCAtMzcwMSwxMSArMzcxOSwxMyBAQAogCQkJZ290byBwdXQ7CiAKIAkJd3JpdGVfbG9jaygmaWRldi0+bG9jayk7CisJCWlkZXYtPnJzX2ludGVydmFsID0gcmZjMzMxNV9zMTRfYmFja29mZl91cGRhdGUoCisJCQlpZGV2LT5yc19pbnRlcnZhbCwgaWRldi0+Y25mLnJ0cl9zb2xpY2l0X21heF9pbnRlcnZhbCk7CiAJCS8qIFRoZSB3YWl0IGFmdGVyIHRoZSBsYXN0IHByb2JlIGNhbiBiZSBzaG9ydGVyICovCiAJCWFkZHJjb25mX21vZF9yc190aW1lcihpZGV2LCAoaWRldi0+cnNfcHJvYmVzID09CiAJCQkJCSAgICAgaWRldi0+Y25mLnJ0cl9zb2xpY2l0cykgPwogCQkJCSAgICAgIGlkZXYtPmNuZi5ydHJfc29saWNpdF9kZWxheSA6Ci0JCQkJICAgICAgaWRldi0+Y25mLnJ0cl9zb2xpY2l0X2ludGVydmFsKTsKKwkJCQkgICAgICBpZGV2LT5yc19pbnRlcnZhbCk7CiAJfSBlbHNlIHsKIAkJLyoKIAkJICogTm90ZTogd2UgZG8gbm90IHN1cHBvcnQgZGVwcmVjYXRlZCAiYWxsIG9uLWxpbmsiCkBAIC0zODIxLDYgKzM4NDEsNyBAQAogCQkJCQkJZGFkX3dvcmspOwogCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSBpZnAtPmlkZXY7CiAJc3RydWN0IGluNl9hZGRyIG1jYWRkcjsKKwlib29sIGRpc2FibGVfaXB2NiA9IGZhbHNlOwogCiAJZW51bSB7CiAJCURBRF9QUk9DRVNTLApAQCAtMzgzNyw2ICszODU4LDI0IEBACiAJfSBlbHNlIGlmIChpZnAtPnN0YXRlID09IElORVQ2X0lGQUREUl9TVEFURV9FUlJEQUQpIHsKIAkJYWN0aW9uID0gREFEX0FCT1JUOwogCQlpZnAtPnN0YXRlID0gSU5FVDZfSUZBRERSX1NUQVRFX1BPU1REQUQ7CisKKwkJaWYgKGlkZXYtPmNuZi5hY2NlcHRfZGFkID4gMSAmJiAhaWRldi0+Y25mLmRpc2FibGVfaXB2NiAmJgorCQkgICAgIShpZnAtPmZsYWdzICYgSUZBX0ZfU1RBQkxFX1BSSVZBQ1kpKSB7CisJCQlzdHJ1Y3QgaW42X2FkZHIgYWRkcjsKKworCQkJYWRkci5zNl9hZGRyMzJbMF0gPSBodG9ubCgweGZlODAwMDAwKTsKKwkJCWFkZHIuczZfYWRkcjMyWzFdID0gMDsKKworCQkJaWYgKCFpcHY2X2dlbmVyYXRlX2V1aTY0KGFkZHIuczZfYWRkciArIDgsIGlkZXYtPmRldikgJiYKKwkJCSAgICBpcHY2X2FkZHJfZXF1YWwoJmlmcC0+YWRkciwgJmFkZHIpKSB7CisJCQkJLyogREFEIGZhaWxlZCBmb3IgbGluay1sb2NhbCBiYXNlZCBvbiBNQUMgKi8KKwkJCQlpZGV2LT5jbmYuZGlzYWJsZV9pcHY2ID0gMTsKKworCQkJCXByX2luZm8oIiVzOiBJUHY2IGJlaW5nIGRpc2FibGVkIVxuIiwKKwkJCQkJaWZwLT5pZGV2LT5kZXYtPm5hbWUpOworCQkJCWRpc2FibGVfaXB2NiA9IHRydWU7CisJCQl9CisJCX0KIAl9CiAJc3Bpbl91bmxvY2tfYmgoJmlmcC0+bG9jayk7CiAKQEAgLTM4NDQsNyArMzg4MywxMCBAQAogCQlhZGRyY29uZl9kYWRfYmVnaW4oaWZwKTsKIAkJZ290byBvdXQ7CiAJfSBlbHNlIGlmIChhY3Rpb24gPT0gREFEX0FCT1JUKSB7CisJCWluNl9pZmFfaG9sZChpZnApOwogCQlhZGRyY29uZl9kYWRfc3RvcChpZnAsIDEpOworCQlpZiAoZGlzYWJsZV9pcHY2KQorCQkJYWRkcmNvbmZfaWZkb3duKGlkZXYtPmRldiwgMCk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMzkzMiw3ICszOTc0LDcgQEAKIAlzZW5kX21sZCA9IGlmcC0+c2NvcGUgPT0gSUZBX0xJTksgJiYgaXB2Nl9sb25lbHlfbGxhZGRyKGlmcCk7CiAJc2VuZF9ycyA9IHNlbmRfbWxkICYmCiAJCSAgaXB2Nl9hY2NlcHRfcmEoaWZwLT5pZGV2KSAmJgotCQkgIGlmcC0+aWRldi0+Y25mLnJ0cl9zb2xpY2l0cyA+IDAgJiYKKwkJICBpZnAtPmlkZXYtPmNuZi5ydHJfc29saWNpdHMgIT0gMCAmJgogCQkgIChkZXYtPmZsYWdzJklGRl9MT09QQkFDSykgPT0gMDsKIAlyZWFkX3VubG9ja19iaCgmaWZwLT5pZGV2LT5sb2NrKTsKIApAQCAtMzk1NCwxMCArMzk5NiwxMSBAQAogCiAJCXdyaXRlX2xvY2tfYmgoJmlmcC0+aWRldi0+bG9jayk7CiAJCXNwaW5fbG9jaygmaWZwLT5sb2NrKTsKKwkJaWZwLT5pZGV2LT5yc19pbnRlcnZhbCA9IHJmYzMzMTVfczE0X2JhY2tvZmZfaW5pdCgKKwkJCWlmcC0+aWRldi0+Y25mLnJ0cl9zb2xpY2l0X2ludGVydmFsKTsKIAkJaWZwLT5pZGV2LT5yc19wcm9iZXMgPSAxOwogCQlpZnAtPmlkZXYtPmlmX2ZsYWdzIHw9IElGX1JTX1NFTlQ7Ci0JCWFkZHJjb25mX21vZF9yc190aW1lcihpZnAtPmlkZXYsCi0JCQkJICAgICAgaWZwLT5pZGV2LT5jbmYucnRyX3NvbGljaXRfaW50ZXJ2YWwpOworCQlhZGRyY29uZl9tb2RfcnNfdGltZXIoaWZwLT5pZGV2LCBpZnAtPmlkZXYtPnJzX2ludGVydmFsKTsKIAkJc3Bpbl91bmxvY2soJmlmcC0+bG9jayk7CiAJCXdyaXRlX3VubG9ja19iaCgmaWZwLT5pZGV2LT5sb2NrKTsKIAl9CkBAIC00ODc0LDYgKzQ5MTcsOCBAQAogCWFycmF5W0RFVkNPTkZfUlRSX1NPTElDSVRTXSA9IGNuZi0+cnRyX3NvbGljaXRzOwogCWFycmF5W0RFVkNPTkZfUlRSX1NPTElDSVRfSU5URVJWQUxdID0KIAkJamlmZmllc190b19tc2VjcyhjbmYtPnJ0cl9zb2xpY2l0X2ludGVydmFsKTsKKwlhcnJheVtERVZDT05GX1JUUl9TT0xJQ0lUX01BWF9JTlRFUlZBTF0gPQorCQlqaWZmaWVzX3RvX21zZWNzKGNuZi0+cnRyX3NvbGljaXRfbWF4X2ludGVydmFsKTsKIAlhcnJheVtERVZDT05GX1JUUl9TT0xJQ0lUX0RFTEFZXSA9CiAJCWppZmZpZXNfdG9fbXNlY3MoY25mLT5ydHJfc29saWNpdF9kZWxheSk7CiAJYXJyYXlbREVWQ09ORl9GT1JDRV9NTERfVkVSU0lPTl0gPSBjbmYtPmZvcmNlX21sZF92ZXJzaW9uOwpAQCAtNDk0NCwxOCArNDk4OSwxOCBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19zbm1wNl9maWxsX3N0YXRzZGV2KHU2NCAqc3RhdHMsIGF0b21pY19sb25nX3QgKm1pYiwKLQkJCQkgICAgICBpbnQgaXRlbXMsIGludCBieXRlcykKKwkJCQkJaW50IGJ5dGVzKQogewogCWludCBpOwotCWludCBwYWQgPSBieXRlcyAtIHNpemVvZih1NjQpICogaXRlbXM7CisJaW50IHBhZCA9IGJ5dGVzIC0gc2l6ZW9mKHU2NCkgKiBJQ01QNl9NSUJfTUFYOwogCUJVR19PTihwYWQgPCAwKTsKIAogCS8qIFVzZSBwdXRfdW5hbGlnbmVkKCkgYmVjYXVzZSBzdGF0cyBtYXkgbm90IGJlIGFsaWduZWQgZm9yIHU2NC4gKi8KLQlwdXRfdW5hbGlnbmVkKGl0ZW1zLCAmc3RhdHNbMF0pOwotCWZvciAoaSA9IDE7IGkgPCBpdGVtczsgaSsrKQorCXB1dF91bmFsaWduZWQoSUNNUDZfTUlCX01BWCwgJnN0YXRzWzBdKTsKKwlmb3IgKGkgPSAxOyBpIDwgSUNNUDZfTUlCX01BWDsgaSsrKQogCQlwdXRfdW5hbGlnbmVkKGF0b21pY19sb25nX3JlYWQoJm1pYltpXSksICZzdGF0c1tpXSk7CiAKLQltZW1zZXQoJnN0YXRzW2l0ZW1zXSwgMCwgcGFkKTsKKwltZW1zZXQoJnN0YXRzW0lDTVA2X01JQl9NQVhdLCAwLCBwYWQpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19zbm1wNl9maWxsX3N0YXRzNjQodTY0ICpzdGF0cywgdm9pZCBfX3BlcmNwdSAqbWliLApAQCAtNDk4OCw3ICs1MDMzLDcgQEAKIAkJCQkgICAgIG9mZnNldG9mKHN0cnVjdCBpcHN0YXRzX21pYiwgc3luY3ApKTsKIAkJYnJlYWs7CiAJY2FzZSBJRkxBX0lORVQ2X0lDTVA2U1RBVFM6Ci0JCV9fc25tcDZfZmlsbF9zdGF0c2RldihzdGF0cywgaWRldi0+c3RhdHMuaWNtcHY2ZGV2LT5taWJzLCBJQ01QNl9NSUJfTUFYLCBieXRlcyk7CisJCV9fc25tcDZfZmlsbF9zdGF0c2RldihzdGF0cywgaWRldi0+c3RhdHMuaWNtcHY2ZGV2LT5taWJzLCBieXRlcyk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTUwODIsNyArNTEyNyw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCWlmICghaXB2Nl9hY2NlcHRfcmEoaWRldikpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmIChpZGV2LT5jbmYucnRyX3NvbGljaXRzIDw9IDApCisJaWYgKGlkZXYtPmNuZi5ydHJfc29saWNpdHMgPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAl3cml0ZV9sb2NrX2JoKCZpZGV2LT5sb2NrKTsKQEAgLTUxMTEsOCArNTE1NiwxMCBAQAogCiAJaWYgKHVwZGF0ZV9ycykgewogCQlpZGV2LT5pZl9mbGFncyB8PSBJRl9SU19TRU5UOworCQlpZGV2LT5yc19pbnRlcnZhbCA9IHJmYzMzMTVfczE0X2JhY2tvZmZfaW5pdCgKKwkJCWlkZXYtPmNuZi5ydHJfc29saWNpdF9pbnRlcnZhbCk7CiAJCWlkZXYtPnJzX3Byb2JlcyA9IDE7Ci0JCWFkZHJjb25mX21vZF9yc190aW1lcihpZGV2LCBpZGV2LT5jbmYucnRyX3NvbGljaXRfaW50ZXJ2YWwpOworCQlhZGRyY29uZl9tb2RfcnNfdGltZXIoaWRldiwgaWRldi0+cnNfaW50ZXJ2YWwpOwogCX0KIAogCS8qIFdlbGwsIHRoYXQncyBraW5kYSBuYXN0eSAuLi4gKi8KQEAgLTU0NTAsMjAgKzU0OTcsNiBAQAogfQogCiBzdGF0aWMKLWludCBhZGRyY29uZl9zeXNjdGxfaG9wX2xpbWl0KHN0cnVjdCBjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGN0bF90YWJsZSBsY3RsOwotCWludCBtaW5faGwgPSAxLCBtYXhfaGwgPSAyNTU7Ci0KLQlsY3RsID0gKmN0bDsKLQlsY3RsLmV4dHJhMSA9ICZtaW5faGw7Ci0JbGN0bC5leHRyYTIgPSAmbWF4X2hsOwotCi0JcmV0dXJuIHByb2NfZG9pbnR2ZWNfbWlubWF4KCZsY3RsLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKLX0KLQotc3RhdGljCiBpbnQgYWRkcmNvbmZfc3lzY3RsX210dShzdHJ1Y3QgY3RsX3RhYmxlICpjdGwsIGludCB3cml0ZSwKIAkJCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewpAQCAtNTY5Niw2ICs1NzI5LDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgY29uc3QgaW50IG9uZSA9IDE7CitzdGF0aWMgY29uc3QgaW50IHR3b19maXZlX2ZpdmUgPSAyNTU7CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlIGFkZHJjb25mX3N5c2N0bFtdID0gewogCXsKIAkJLnByb2NuYW1lCT0gImZvcndhcmRpbmciLApAQCAtNTcwOSw3ICs1NzQ1LDkgQEAKIAkJLmRhdGEJCT0gJmlwdjZfZGV2Y29uZi5ob3BfbGltaXQsCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCiAJCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBhZGRyY29uZl9zeXNjdGxfaG9wX2xpbWl0LAorCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5leHRyYTEJCT0gKHZvaWQgKikmb25lLAorCQkuZXh0cmEyCQk9ICh2b2lkICopJnR3b19maXZlX2ZpdmUsCiAJfSwKIAl7CiAJCS5wcm9jbmFtZQk9ICJtdHUiLApAQCAtNTc2MSw2ICs1Nzk5LDEzIEBACiAJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX2ppZmZpZXMsCiAJfSwKIAl7CisJCS5wcm9jbmFtZQk9ICJyb3V0ZXJfc29saWNpdGF0aW9uX21heF9pbnRlcnZhbCIsCisJCS5kYXRhCQk9ICZpcHY2X2RldmNvbmYucnRyX3NvbGljaXRfbWF4X2ludGVydmFsLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJewogCQkucHJvY25hbWUJPSAicm91dGVyX3NvbGljaXRhdGlvbl9kZWxheSIsCiAJCS5kYXRhCQk9ICZpcHY2X2RldmNvbmYucnRyX3NvbGljaXRfZGVsYXksCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCkBAIC02MDE3LDcgKzYwNjIsNyBAQAogc3RhdGljIGludCBfX2FkZHJjb25mX3N5c2N0bF9yZWdpc3RlcihzdHJ1Y3QgbmV0ICpuZXQsIGNoYXIgKmRldl9uYW1lLAogCQlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2LCBzdHJ1Y3QgaXB2Nl9kZXZjb25mICpwKQogewotCWludCBpOworCWludCBpLCBpZmluZGV4OwogCXN0cnVjdCBjdGxfdGFibGUgKnRhYmxlOwogCWNoYXIgcGF0aFtzaXplb2YoIm5ldC9pcHY2L2NvbmYvIikgKyBJRk5BTVNJWl07CiAKQEAgLTYwMjcsOCArNjA3MiwxNCBAQAogCiAJZm9yIChpID0gMDsgdGFibGVbaV0uZGF0YTsgaSsrKSB7CiAJCXRhYmxlW2ldLmRhdGEgKz0gKGNoYXIgKilwIC0gKGNoYXIgKikmaXB2Nl9kZXZjb25mOwotCQl0YWJsZVtpXS5leHRyYTEgPSBpZGV2OyAvKiBlbWJlZGRlZDsgbm8gcmVmICovCi0JCXRhYmxlW2ldLmV4dHJhMiA9IG5ldDsKKwkJLyogSWYgb25lIG9mIHRoZXNlIGlzIGFscmVhZHkgc2V0LCB0aGVuIGl0IGlzIG5vdCBzYWZlIHRvCisJCSAqIG92ZXJ3cml0ZSBlaXRoZXIgb2YgdGhlbTogdGhpcyBtYWtlcyBwcm9jX2RvaW50dmVjX21pbm1heAorCQkgKiB1c2FibGUuCisJCSAqLworCQlpZiAoIXRhYmxlW2ldLmV4dHJhMSAmJiAhdGFibGVbaV0uZXh0cmEyKSB7CisJCQl0YWJsZVtpXS5leHRyYTEgPSBpZGV2OyAvKiBlbWJlZGRlZDsgbm8gcmVmICovCisJCQl0YWJsZVtpXS5leHRyYTIgPSBuZXQ7CisJCX0KIAl9CiAKIAlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICJuZXQvaXB2Ni9jb25mLyVzIiwgZGV2X25hbWUpOwpAQCAtNjAzNyw2ICs2MDg4LDEzIEBACiAJaWYgKCFwLT5zeXNjdGxfaGVhZGVyKQogCQlnb3RvIGZyZWU7CiAKKwlpZiAoIXN0cmNtcChkZXZfbmFtZSwgImFsbCIpKQorCQlpZmluZGV4ID0gTkVUQ09ORkFfSUZJTkRFWF9BTEw7CisJZWxzZSBpZiAoIXN0cmNtcChkZXZfbmFtZSwgImRlZmF1bHQiKSkKKwkJaWZpbmRleCA9IE5FVENPTkZBX0lGSU5ERVhfREVGQVVMVDsKKwllbHNlCisJCWlmaW5kZXggPSBpZGV2LT5kZXYtPmlmaW5kZXg7CisJaW5ldDZfbmV0Y29uZl9ub3RpZnlfZGV2Y29uZihuZXQsIE5FVENPTkZBX0FMTCwgaWZpbmRleCwgcCk7CiAJcmV0dXJuIDA7CiAKIGZyZWU6CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9hZl9pbmV0Ni5jIGIvbmV0L2lwdjYvYWZfaW5ldDYuYwppbmRleCBiNDU0MDU1Li40NmFkNjk5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9hZl9pbmV0Ni5jCisrKyBiL25ldC9pcHY2L2FmX2luZXQ2LmMKQEAgLTU0NSw2ICs1NDUsOCBAQAogCS5tbWFwCQkgICA9IHNvY2tfbm9fbW1hcCwKIAkuc2VuZHBhZ2UJICAgPSBpbmV0X3NlbmRwYWdlLAogCS5zcGxpY2VfcmVhZAkgICA9IHRjcF9zcGxpY2VfcmVhZCwKKwkucmVhZF9zb2NrCSAgID0gdGNwX3JlYWRfc29jaywKKwkucGVla19sZW4JICAgPSB0Y3BfcGVla19sZW4sCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCS5jb21wYXRfc2V0c29ja29wdCA9IGNvbXBhdF9zb2NrX2NvbW1vbl9zZXRzb2Nrb3B0LAogCS5jb21wYXRfZ2V0c29ja29wdCA9IGNvbXBhdF9zb2NrX2NvbW1vbl9nZXRzb2Nrb3B0LApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvY2FsaXBzby5jIGIvbmV0L2lwdjYvY2FsaXBzby5jCmluZGV4IGM1M2I5MmMuLjM3YWM5ZGUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2NhbGlwc28uYworKysgYi9uZXQvaXB2Ni9jYWxpcHNvLmMKQEAgLTk1Miw4ICs5NTIsMTAgQEAKIAkJbWVtY3B5KG5ldywgaG9wLCBzdGFydCk7CiAJcmV0X3ZhbCA9IGNhbGlwc29fZ2Vub3B0KCh1bnNpZ25lZCBjaGFyICopbmV3LCBzdGFydCwgYnVmX2xlbiwgZG9pX2RlZiwKIAkJCQkgc2VjYXR0cik7Ci0JaWYgKHJldF92YWwgPCAwKQorCWlmIChyZXRfdmFsIDwgMCkgeworCQlrZnJlZShuZXcpOwogCQlyZXR1cm4gRVJSX1BUUihyZXRfdmFsKTsKKwl9CiAKIAlidWZfbGVuID0gc3RhcnQgKyByZXRfdmFsOwogCS8qIEF0IHRoaXMgcG9pbnQgYnVmX2xlbiBhbGlnbnMgdG8gNG4sIHNvIChidWZfbGVuICYgNCkgcGFkcyB0byA4biAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvZmliNl9ydWxlcy5jIGIvbmV0L2lwdjYvZmliNl9ydWxlcy5jCmluZGV4IDU4NTdjMWYuLmVlYTIzYjUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2ZpYjZfcnVsZXMuYworKysgYi9uZXQvaXB2Ni9maWI2X3J1bGVzLmMKQEAgLTM4LDYgKzM4LDkgQEAKIAkJLmZsYWdzID0gRklCX0xPT0tVUF9OT1JFRiwKIAl9OwogCisJLyogdXBkYXRlIGZsb3cgaWYgb2lmIG9yIGlpZiBwb2ludCB0byBkZXZpY2UgZW5zbGF2ZWQgdG8gbDNtZGV2ICovCisJbDNtZGV2X3VwZGF0ZV9mbG93KG5ldCwgZmxvd2k2X3RvX2Zsb3dpKGZsNikpOworCiAJZmliX3J1bGVzX2xvb2t1cChuZXQtPmlwdjYuZmliNl9ydWxlc19vcHMsCiAJCQkgZmxvd2k2X3RvX2Zsb3dpKGZsNiksIGZsYWdzLCAmYXJnKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaWxhL2lsYV9jb21tb24uYyBiL25ldC9pcHY2L2lsYS9pbGFfY29tbW9uLmMKaW5kZXggZWM5ZWZiYy4uYWJhMDk5OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaWxhL2lsYV9jb21tb24uYworKysgYi9uZXQvaXB2Ni9pbGEvaWxhX2NvbW1vbi5jCkBAIC0xNzIsNiArMTcyLDUgQEAKIAogbW9kdWxlX2luaXQoaWxhX2luaXQpOwogbW9kdWxlX2V4aXQoaWxhX2ZpbmkpOwotTU9EVUxFX0FMSUFTX1JUTkxfTFdUKElMQSk7CiBNT0RVTEVfQVVUSE9SKCJUb20gSGVyYmVydCA8dG9tQGhlcmJlcnRsYW5kLmNvbT4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lsYS9pbGFfbHd0LmMgYi9uZXQvaXB2Ni9pbGEvaWxhX2x3dC5jCmluZGV4IGM4MzE0YzYuLmU1MGMyN2EgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lsYS9pbGFfbHd0LmMKKysrIGIvbmV0L2lwdjYvaWxhL2lsYV9sd3QuYwpAQCAtNTEsNyArNTEsNyBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgc3RydWN0IG5sYV9wb2xpY3kgaWxhX25sX3BvbGljeVtJTEFfQVRUUl9NQVggKyAxXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBpbGFfbmxfcG9saWN5W0lMQV9BVFRSX01BWCArIDFdID0gewogCVtJTEFfQVRUUl9MT0NBVE9SXSA9IHsgLnR5cGUgPSBOTEFfVTY0LCB9LAogCVtJTEFfQVRUUl9DU1VNX01PREVdID0geyAudHlwZSA9IE5MQV9VOCwgfSwKIH07CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pbGEvaWxhX3hsYXQuYyBiL25ldC9pcHY2L2lsYS9pbGFfeGxhdC5jCmluZGV4IGU2ZWNhNWYuLmU2MDQwMTMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lsYS9pbGFfeGxhdC5jCisrKyBiL25ldC9pcHY2L2lsYS9pbGFfeGxhdC5jCkBAIC0xMjgsNyArMTI4LDcgQEAKIAkucGFyYWxsZWxfb3BzCT0gdHJ1ZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbmxhX3BvbGljeSBpbGFfbmxfcG9saWN5W0lMQV9BVFRSX01BWCArIDFdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IGlsYV9ubF9wb2xpY3lbSUxBX0FUVFJfTUFYICsgMV0gPSB7CiAJW0lMQV9BVFRSX0xPQ0FUT1JdID0geyAudHlwZSA9IE5MQV9VNjQsIH0sCiAJW0lMQV9BVFRSX0xPQ0FUT1JfTUFUQ0hdID0geyAudHlwZSA9IE5MQV9VNjQsIH0sCiAJW0lMQV9BVFRSX0lGSU5ERVhdID0geyAudHlwZSA9IE5MQV9VMzIsIH0sCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfZmliLmMgYi9uZXQvaXB2Ni9pcDZfZmliLmMKaW5kZXggNzcxYmUxZi4uZWY1NDg1MiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X2ZpYi5jCisrKyBiL25ldC9pcHY2L2lwNl9maWIuYwpAQCAtNzQzLDYgKzc0Myw3IEBACiAJCSAgIChpbmZvLT5ubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfQ1JFQVRFKSk7CiAJaW50IGZvdW5kID0gMDsKIAlib29sIHJ0X2Nhbl9lY21wID0gcnQ2X3F1YWxpZnlfZm9yX2VjbXAocnQpOworCXUxNiBubGZsYWdzID0gTkxNX0ZfRVhDTDsKIAlpbnQgZXJyOwogCiAJaW5zID0gJmZuLT5sZWFmOwpAQCAtNzU5LDYgKzc2MCw4IEBACiAJCQlpZiAoaW5mby0+bmxoICYmCiAJCQkgICAgKGluZm8tPm5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9FWENMKSkKIAkJCQlyZXR1cm4gLUVFWElTVDsKKworCQkJbmxmbGFncyAmPSB+TkxNX0ZfRVhDTDsKIAkJCWlmIChyZXBsYWNlKSB7CiAJCQkJaWYgKHJ0X2Nhbl9lY21wID09IHJ0Nl9xdWFsaWZ5X2Zvcl9lY21wKGl0ZXIpKSB7CiAJCQkJCWZvdW5kKys7CkBAIC04NTYsNiArODU5LDcgQEAKIAkJCXByX3dhcm4oIk5MTV9GX0NSRUFURSBzaG91bGQgYmUgc2V0IHdoZW4gY3JlYXRpbmcgbmV3IHJvdXRlXG4iKTsKIAogYWRkOgorCQlubGZsYWdzIHw9IE5MTV9GX0NSRUFURTsKIAkJZXJyID0gZmliNl9jb21taXRfbWV0cmljcygmcnQtPmRzdCwgbXhjKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CkBAIC04NjQsNyArODY4LDcgQEAKIAkJKmlucyA9IHJ0OwogCQlydC0+cnQ2aV9ub2RlID0gZm47CiAJCWF0b21pY19pbmMoJnJ0LT5ydDZpX3JlZik7Ci0JCWluZXQ2X3J0X25vdGlmeShSVE1fTkVXUk9VVEUsIHJ0LCBpbmZvLCAwKTsKKwkJaW5ldDZfcnRfbm90aWZ5KFJUTV9ORVdST1VURSwgcnQsIGluZm8sIG5sZmxhZ3MpOwogCQlpbmZvLT5ubF9uZXQtPmlwdjYucnQ2X3N0YXRzLT5maWJfcnRfZW50cmllcysrOwogCiAJCWlmICghKGZuLT5mbl9mbGFncyAmIFJUTl9SVElORk8pKSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfZ3JlLmMgYi9uZXQvaXB2Ni9pcDZfZ3JlLmMKaW5kZXggNzc2ZDE0NS4uZDdkNmQzYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X2dyZS5jCisrKyBiL25ldC9pcHY2L2lwNl9ncmUuYwpAQCAtNjEsMTIgKzYxLDEyIEBACiBtb2R1bGVfcGFyYW0obG9nX2Vjbl9lcnJvciwgYm9vbCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGxvZ19lY25fZXJyb3IsICJMb2cgcGFja2V0cyByZWNlaXZlZCB3aXRoIGNvcnJ1cHRlZCBFQ04iKTsKIAotI2RlZmluZSBIQVNIX1NJWkVfU0hJRlQgIDUKLSNkZWZpbmUgSEFTSF9TSVpFICgxIDw8IEhBU0hfU0laRV9TSElGVCkKKyNkZWZpbmUgSVA2X0dSRV9IQVNIX1NJWkVfU0hJRlQgIDUKKyNkZWZpbmUgSVA2X0dSRV9IQVNIX1NJWkUgKDEgPDwgSVA2X0dSRV9IQVNIX1NJWkVfU0hJRlQpCiAKIHN0YXRpYyBpbnQgaXA2Z3JlX25ldF9pZCBfX3JlYWRfbW9zdGx5Owogc3RydWN0IGlwNmdyZV9uZXQgewotCXN0cnVjdCBpcDZfdG5sIF9fcmN1ICp0dW5uZWxzWzRdW0hBU0hfU0laRV07CisJc3RydWN0IGlwNl90bmwgX19yY3UgKnR1bm5lbHNbNF1bSVA2X0dSRV9IQVNIX1NJWkVdOwogCiAJc3RydWN0IG5ldF9kZXZpY2UgKmZiX3R1bm5lbF9kZXY7CiB9OwpAQCAtOTYsMTIgKzk2LDEyIEBACiAgICB3aWxsIG1hdGNoIGZhbGxiYWNrIHR1bm5lbC4KICAqLwogCi0jZGVmaW5lIEhBU0hfS0VZKGtleSkgKCgoX19mb3JjZSB1MzIpa2V5XigoX19mb3JjZSB1MzIpa2V5Pj40KSkmKEhBU0hfU0laRSAtIDEpKQorI2RlZmluZSBIQVNIX0tFWShrZXkpICgoKF9fZm9yY2UgdTMyKWtleV4oKF9fZm9yY2UgdTMyKWtleT4+NCkpJihJUDZfR1JFX0hBU0hfU0laRSAtIDEpKQogc3RhdGljIHUzMiBIQVNIX0FERFIoY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRyKQogewogCXUzMiBoYXNoID0gaXB2Nl9hZGRyX2hhc2goYWRkcik7CiAKLQlyZXR1cm4gaGFzaF8zMihoYXNoLCBIQVNIX1NJWkVfU0hJRlQpOworCXJldHVybiBoYXNoXzMyKGhhc2gsIElQNl9HUkVfSEFTSF9TSVpFX1NISUZUKTsKIH0KIAogI2RlZmluZSB0dW5uZWxzX3JfbAl0dW5uZWxzWzNdCkBAIC01MTksOCArNTE5LDYgQEAKIAlncmVfYnVpbGRfaGVhZGVyKHNrYiwgdHVubmVsLT50dW5faGxlbiwgdHVubmVsLT5wYXJtcy5vX2ZsYWdzLAogCQkJIHByb3RvY29sLCB0dW5uZWwtPnBhcm1zLm9fa2V5LCBodG9ubCh0dW5uZWwtPm9fc2Vxbm8pKTsKIAotCXNrYl9zZXRfaW5uZXJfcHJvdG9jb2woc2tiLCBwcm90b2NvbCk7Ci0KIAlyZXR1cm4gaXA2X3RubF94bWl0KHNrYiwgZGV2LCBkc2ZpZWxkLCBmbDYsIGVuY2FwX2xpbWl0LCBwbXR1LAogCQkJICAgIE5FWFRIRFJfR1JFKTsKIH0KQEAgLTY1MCw3ICs2NDgsNiBAQAogCQllbmNhcF9saW1pdCA9IHQtPnBhcm1zLmVuY2FwX2xpbWl0OwogCiAJbWVtY3B5KCZmbDYsICZ0LT5mbC51LmlwNiwgc2l6ZW9mKGZsNikpOwotCWZsNi5mbG93aTZfcHJvdG8gPSBza2ItPnByb3RvY29sOwogCiAJZXJyID0gZ3JlX2hhbmRsZV9vZmZsb2Fkcyhza2IsICEhKHQtPnBhcm1zLm9fZmxhZ3MgJiBUVU5ORUxfQ1NVTSkpOwogCWlmIChlcnIpCkBAIC0xMDg5LDcgKzEwODYsNyBAQAogCiAJZm9yIChwcmlvID0gMDsgcHJpbyA8IDQ7IHByaW8rKykgewogCQlpbnQgaDsKLQkJZm9yIChoID0gMDsgaCA8IEhBU0hfU0laRTsgaCsrKSB7CisJCWZvciAoaCA9IDA7IGggPCBJUDZfR1JFX0hBU0hfU0laRTsgaCsrKSB7CiAJCQlzdHJ1Y3QgaXA2X3RubCAqdDsKIAogCQkJdCA9IHJ0bmxfZGVyZWZlcmVuY2UoaWduLT50dW5uZWxzW3ByaW9dW2hdKTsKQEAgLTEyNDEsNyArMTIzOCw3IEBACiAJCXBhcm1zLT5lbmNhcF9saW1pdCA9IG5sYV9nZXRfdTgoZGF0YVtJRkxBX0dSRV9FTkNBUF9MSU1JVF0pOwogCiAJaWYgKGRhdGFbSUZMQV9HUkVfRkxPV0lORk9dKQotCQlwYXJtcy0+Zmxvd2luZm8gPSBubGFfZ2V0X3UzMihkYXRhW0lGTEFfR1JFX0ZMT1dJTkZPXSk7CisJCXBhcm1zLT5mbG93aW5mbyA9IG5sYV9nZXRfYmUzMihkYXRhW0lGTEFfR1JFX0ZMT1dJTkZPXSk7CiAKIAlpZiAoZGF0YVtJRkxBX0dSRV9GTEFHU10pCiAJCXBhcm1zLT5mbGFncyA9IG5sYV9nZXRfdTMyKGRhdGFbSUZMQV9HUkVfRkxBR1NdKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl9vZmZsb2FkLmMgYi9uZXQvaXB2Ni9pcDZfb2ZmbG9hZC5jCmluZGV4IDIyZTkwZTUuLmU3YmZkNTUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl9vZmZsb2FkLmMKKysrIGIvbmV0L2lwdjYvaXA2X29mZmxvYWQuYwpAQCAtNjksNiArNjksNyBAQAogCWludCBvZmZzZXQgPSAwOwogCWJvb2wgZW5jYXAsIHVkcGZyYWc7CiAJaW50IG5ob2ZmOworCWJvb2wgZ3NvX3BhcnRpYWw7CiAKIAlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAluaG9mZiA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpIC0gc2tiX21hY19oZWFkZXIoc2tiKTsKQEAgLTEwMSw5ICsxMDIsMTEgQEAKIAlpZiAoSVNfRVJSKHNlZ3MpKQogCQlnb3RvIG91dDsKIAorCWdzb19wYXJ0aWFsID0gISEoc2tiX3NoaW5mbyhzZWdzKS0+Z3NvX3R5cGUgJiBTS0JfR1NPX1BBUlRJQUwpOworCiAJZm9yIChza2IgPSBzZWdzOyBza2I7IHNrYiA9IHNrYi0+bmV4dCkgewogCQlpcHY2aCA9IChzdHJ1Y3QgaXB2NmhkciAqKShza2JfbWFjX2hlYWRlcihza2IpICsgbmhvZmYpOwotCQlpZiAoc2tiX2lzX2dzbyhza2IpKQorCQlpZiAoZ3NvX3BhcnRpYWwpCiAJCQlwYXlsb2FkX2xlbiA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgKwogCQkJCSAgICAgIFNLQl9HU09fQ0Ioc2tiKS0+ZGF0YV9vZmZzZXQgKwogCQkJCSAgICAgIHNrYi0+aGVhZCAtICh1bnNpZ25lZCBjaGFyICopKGlwdjZoICsgMSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMgYi9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKaW5kZXggMWRmYzQwMi4uNjAwMWU3OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X291dHB1dC5jCisrKyBiL25ldC9pcHY2L2lwNl9vdXRwdXQuYwpAQCAtNTYsNiArNTYsNyBAQAogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogI2luY2x1ZGUgPGxpbnV4L21yb3V0ZTYuaD4KICNpbmNsdWRlIDxuZXQvbDNtZGV2Lmg+CisjaW5jbHVkZSA8bmV0L2x3dHVubmVsLmg+CiAKIHN0YXRpYyBpbnQgaXA2X2ZpbmlzaF9vdXRwdXQyKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtMTA0LDYgKzEwNSwxMyBAQAogCQl9CiAJfQogCisJaWYgKGx3dHVubmVsX3htaXRfcmVkaXJlY3QoZHN0LT5sd3RzdGF0ZSkpIHsKKwkJaW50IHJlcyA9IGx3dHVubmVsX3htaXQoc2tiKTsKKworCQlpZiAocmVzIDwgMCB8fCByZXMgPT0gTFdUVU5ORUxfWE1JVF9ET05FKQorCQkJcmV0dXJuIHJlczsKKwl9CisKIAlyY3VfcmVhZF9sb2NrX2JoKCk7CiAJbmV4dGhvcCA9IHJ0Nl9uZXh0aG9wKChzdHJ1Y3QgcnQ2X2luZm8gKilkc3QsICZpcHY2X2hkcihza2IpLT5kYWRkcik7CiAJbmVpZ2ggPSBfX2lwdjZfbmVpZ2hfbG9va3VwX25vcmVmKGRzdC0+ZGV2LCBuZXh0aG9wKTsKQEAgLTIyOCw2ICsyMzYsMTQgQEAKIAlpZiAoKHNrYi0+bGVuIDw9IG10dSkgfHwgc2tiLT5pZ25vcmVfZGYgfHwgc2tiX2lzX2dzbyhza2IpKSB7CiAJCUlQNl9VUERfUE9fU1RBVFMobmV0LCBpcDZfZHN0X2lkZXYoc2tiX2RzdChza2IpKSwKIAkJCSAgICAgIElQU1RBVFNfTUlCX09VVCwgc2tiLT5sZW4pOworCisJCS8qIGlmIGVncmVzcyBkZXZpY2UgaXMgZW5zbGF2ZWQgdG8gYW4gTDMgbWFzdGVyIGRldmljZSBwYXNzIHRoZQorCQkgKiBza2IgdG8gaXRzIGhhbmRsZXIgZm9yIHByb2Nlc3NpbmcKKwkJICovCisJCXNrYiA9IGwzbWRldl9pcDZfb3V0KChzdHJ1Y3Qgc29jayAqKXNrLCBza2IpOworCQlpZiAodW5saWtlbHkoIXNrYikpCisJCQlyZXR1cm4gMDsKKwogCQkvKiBob29rcyBzaG91bGQgbmV2ZXIgYXNzdW1lIHNvY2tldCBsb2NrIGlzIGhlbGQuCiAJCSAqIHdlIHByb21vdGUgb3VyIHNvY2tldCB0byBub24gY29uc3QKIAkJICovCkBAIC05MTAsMTMgKzkyNiw2IEBACiAJaW50IGVycjsKIAlpbnQgZmxhZ3MgPSAwOwogCi0JaWYgKGlwdjZfYWRkcl9hbnkoJmZsNi0+c2FkZHIpICYmIGZsNi0+Zmxvd2k2X29pZiAmJgotCSAgICAoISpkc3QgfHwgISgqZHN0KS0+ZXJyb3IpKSB7Ci0JCWVyciA9IGwzbWRldl9nZXRfc2FkZHI2KG5ldCwgc2ssIGZsNik7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIG91dF9lcnI7Ci0JfQotCiAJLyogVGhlIGNvcnJlY3Qgd2F5IHRvIGhhbmRsZSB0aGlzIHdvdWxkIGJlIHRvIGRvCiAJICogaXA2X3JvdXRlX2dldF9zYWRkciwgYW5kIHRoZW4gaXA2X3JvdXRlX291dHB1dDsgaG93ZXZlciwKIAkgKiB0aGUgcm91dGUtc3BlY2lmaWMgcHJlZmVycmVkIHNvdXJjZSBmb3JjZXMgdGhlCkBAIC0xMDA4LDcgKzEwMTcsNyBAQAogb3V0X2Vycl9yZWxlYXNlOgogCWRzdF9yZWxlYXNlKCpkc3QpOwogCSpkc3QgPSBOVUxMOwotb3V0X2VycjoKKwogCWlmIChlcnIgPT0gLUVORVRVTlJFQUNIKQogCQlJUDZfSU5DX1NUQVRTKG5ldCwgTlVMTCwgSVBTVEFUU19NSUJfT1VUTk9ST1VURVMpOwogCXJldHVybiBlcnI7CkBAIC0xMDU0LDggKzEwNjMsNiBAQAogCQlyZXR1cm4gRVJSX1BUUihlcnIpOwogCWlmIChmaW5hbF9kc3QpCiAJCWZsNi0+ZGFkZHIgPSAqZmluYWxfZHN0OwotCWlmICghZmw2LT5mbG93aTZfb2lmKQotCQlmbDYtPmZsb3dpNl9vaWYgPSBsM21kZXZfZmliX29pZihkc3QtPmRldik7CiAKIAlyZXR1cm4geGZybV9sb29rdXBfcm91dGUoc29ja19uZXQoc2spLCBkc3QsIGZsb3dpNl90b19mbG93aShmbDYpLCBzaywgMCk7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfdHVubmVsLmMgYi9uZXQvaXB2Ni9pcDZfdHVubmVsLmMKaW5kZXggN2IwNDgxZS4uNmE2NmFkYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X3R1bm5lbC5jCisrKyBiL25ldC9pcHY2L2lwNl90dW5uZWwuYwpAQCAtNTcsNiArNTcsNyBAQAogI2luY2x1ZGUgPG5ldC9pbmV0X2Vjbi5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L25ldG5zL2dlbmVyaWMuaD4KKyNpbmNsdWRlIDxuZXQvZHN0X21ldGFkYXRhLmg+CiAKIE1PRFVMRV9BVVRIT1IoIlZpbGxlIE51b3J2YWxhIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIklQdjYgdHVubmVsaW5nIGRldmljZSIpOwpAQCAtNjQsOCArNjUsOCBAQAogTU9EVUxFX0FMSUFTX1JUTkxfTElOSygiaXA2dG5sIik7CiBNT0RVTEVfQUxJQVNfTkVUREVWKCJpcDZ0bmwwIik7CiAKLSNkZWZpbmUgSEFTSF9TSVpFX1NISUZUICA1Ci0jZGVmaW5lIEhBU0hfU0laRSAoMSA8PCBIQVNIX1NJWkVfU0hJRlQpCisjZGVmaW5lIElQNl9UVU5ORUxfSEFTSF9TSVpFX1NISUZUICA1CisjZGVmaW5lIElQNl9UVU5ORUxfSEFTSF9TSVpFICgxIDw8IElQNl9UVU5ORUxfSEFTSF9TSVpFX1NISUZUKQogCiBzdGF0aWMgYm9vbCBsb2dfZWNuX2Vycm9yID0gdHJ1ZTsKIG1vZHVsZV9wYXJhbShsb2dfZWNuX2Vycm9yLCBib29sLCAwNjQ0KTsKQEAgLTc1LDcgKzc2LDcgQEAKIHsKIAl1MzIgaGFzaCA9IGlwdjZfYWRkcl9oYXNoKGFkZHIxKSBeIGlwdjZfYWRkcl9oYXNoKGFkZHIyKTsKIAotCXJldHVybiBoYXNoXzMyKGhhc2gsIEhBU0hfU0laRV9TSElGVCk7CisJcmV0dXJuIGhhc2hfMzIoaGFzaCwgSVA2X1RVTk5FTF9IQVNIX1NJWkVfU0hJRlQpOwogfQogCiBzdGF0aWMgaW50IGlwNl90bmxfZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CkBAIC04Nyw5ICs4OCwxMCBAQAogCS8qIHRoZSBJUHY2IHR1bm5lbCBmYWxsYmFjayBkZXZpY2UgKi8KIAlzdHJ1Y3QgbmV0X2RldmljZSAqZmJfdG5sX2RldjsKIAkvKiBsaXN0cyBmb3Igc3RvcmluZyB0dW5uZWxzIGluIHVzZSAqLwotCXN0cnVjdCBpcDZfdG5sIF9fcmN1ICp0bmxzX3JfbFtIQVNIX1NJWkVdOworCXN0cnVjdCBpcDZfdG5sIF9fcmN1ICp0bmxzX3JfbFtJUDZfVFVOTkVMX0hBU0hfU0laRV07CiAJc3RydWN0IGlwNl90bmwgX19yY3UgKnRubHNfd2NbMV07CiAJc3RydWN0IGlwNl90bmwgX19yY3UgKip0bmxzWzJdOworCXN0cnVjdCBpcDZfdG5sIF9fcmN1ICpjb2xsZWN0X21kX3R1bjsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaXA2X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMTY2LDYgKzE2OCwxMCBAQAogCQkJcmV0dXJuIHQ7CiAJfQogCisJdCA9IHJjdV9kZXJlZmVyZW5jZShpcDZuLT5jb2xsZWN0X21kX3R1bik7CisJaWYgKHQpCisJCXJldHVybiB0OworCiAJdCA9IHJjdV9kZXJlZmVyZW5jZShpcDZuLT50bmxzX3djWzBdKTsKIAlpZiAodCAmJiAodC0+ZGV2LT5mbGFncyAmIElGRl9VUCkpCiAJCXJldHVybiB0OwpAQCAtMjA5LDYgKzIxNSw4IEBACiB7CiAJc3RydWN0IGlwNl90bmwgX19yY3UgKip0cCA9IGlwNl90bmxfYnVja2V0KGlwNm4sICZ0LT5wYXJtcyk7CiAKKwlpZiAodC0+cGFybXMuY29sbGVjdF9tZCkKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGlwNm4tPmNvbGxlY3RfbWRfdHVuLCB0KTsKIAlyY3VfYXNzaWduX3BvaW50ZXIodC0+bmV4dCAsIHJ0bmxfZGVyZWZlcmVuY2UoKnRwKSk7CiAJcmN1X2Fzc2lnbl9wb2ludGVyKCp0cCwgdCk7CiB9CkBAIC0yMjQsNiArMjMyLDkgQEAKIAlzdHJ1Y3QgaXA2X3RubCBfX3JjdSAqKnRwOwogCXN0cnVjdCBpcDZfdG5sICppdGVyOwogCisJaWYgKHQtPnBhcm1zLmNvbGxlY3RfbWQpCisJCXJjdV9hc3NpZ25fcG9pbnRlcihpcDZuLT5jb2xsZWN0X21kX3R1biwgTlVMTCk7CisKIAlmb3IgKHRwID0gaXA2X3RubF9idWNrZXQoaXA2biwgJnQtPnBhcm1zKTsKIAkgICAgIChpdGVyID0gcnRubF9kZXJlZmVyZW5jZSgqdHApKSAhPSBOVUxMOwogCSAgICAgdHAgPSAmaXRlci0+bmV4dCkgewpAQCAtODI5LDYgKzg0MCw5IEBACiAKIAlza2Jfc2NydWJfcGFja2V0KHNrYiwgIW5ldF9lcSh0dW5uZWwtPm5ldCwgZGV2X25ldCh0dW5uZWwtPmRldikpKTsKIAorCWlmICh0dW5fZHN0KQorCQlza2JfZHN0X3NldChza2IsIChzdHJ1Y3QgZHN0X2VudHJ5ICopdHVuX2RzdCk7CisKIAlncm9fY2VsbHNfcmVjZWl2ZSgmdHVubmVsLT5ncm9fY2VsbHMsIHNrYik7CiAJcmV0dXJuIDA7CiAKQEAgLTg2NSw2ICs4NzksNyBAQAogewogCXN0cnVjdCBpcDZfdG5sICp0OwogCWNvbnN0IHN0cnVjdCBpcHY2aGRyICppcHY2aCA9IGlwdjZfaGRyKHNrYik7CisJc3RydWN0IG1ldGFkYXRhX2RzdCAqdHVuX2RzdCA9IE5VTEw7CiAJaW50IHJldCA9IC0xOwogCiAJcmN1X3JlYWRfbG9jaygpOwpAQCAtODgxLDcgKzg5NiwxMiBAQAogCQkJZ290byBkcm9wOwogCQlpZiAoaXB0dW5uZWxfcHVsbF9oZWFkZXIoc2tiLCAwLCB0cGktPnByb3RvLCBmYWxzZSkpCiAJCQlnb3RvIGRyb3A7Ci0JCXJldCA9IF9faXA2X3RubF9yY3YodCwgc2tiLCB0cGksIE5VTEwsIGRzY3BfZWNuX2RlY2Fwc3VsYXRlLAorCQlpZiAodC0+cGFybXMuY29sbGVjdF9tZCkgeworCQkJdHVuX2RzdCA9IGlwdjZfdHVuX3J4X2RzdChza2IsIDAsIDAsIDApOworCQkJaWYgKCF0dW5fZHN0KQorCQkJCXJldHVybiAwOworCQl9CisJCXJldCA9IF9faXA2X3RubF9yY3YodCwgc2tiLCB0cGksIHR1bl9kc3QsIGRzY3BfZWNuX2RlY2Fwc3VsYXRlLAogCQkJCSAgICBsb2dfZWNuX2Vycm9yKTsKIAl9CiAKQEAgLTEwMTIsOCArMTAzMiwxNiBAQAogCWludCBtdHU7CiAJdW5zaWduZWQgaW50IHBzaF9obGVuID0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSArIHQtPmVuY2FwX2hsZW47CiAJdW5zaWduZWQgaW50IG1heF9oZWFkcm9vbSA9IHBzaF9obGVuOworCXU4IGhvcF9saW1pdDsKIAlpbnQgZXJyID0gLTE7CiAKKwlpZiAodC0+cGFybXMuY29sbGVjdF9tZCkgeworCQlob3BfbGltaXQgPSBza2JfdHVubmVsX2luZm8oc2tiKS0+a2V5LnR0bDsKKwkJZ290byByb3V0ZV9sb29rdXA7CisJfSBlbHNlIHsKKwkJaG9wX2xpbWl0ID0gdC0+cGFybXMuaG9wX2xpbWl0OworCX0KKwogCS8qIE5CTUEgdHVubmVsICovCiAJaWYgKGlwdjZfYWRkcl9hbnkoJnQtPnBhcm1zLnJhZGRyKSkgewogCQlzdHJ1Y3QgaW42X2FkZHIgKmFkZHI2OwpAQCAtMTA0Myw2ICsxMDcxLDcgQEAKIAkJZ290byB0eF9lcnJfbGlua19mYWlsdXJlOwogCiAJaWYgKCFkc3QpIHsKK3JvdXRlX2xvb2t1cDoKIAkJZHN0ID0gaXA2X3JvdXRlX291dHB1dChuZXQsIE5VTEwsIGZsNik7CiAKIAkJaWYgKGRzdC0+ZXJyb3IpCkBAIC0xMDUzLDYgKzEwODIsMTAgQEAKIAkJCWRzdCA9IE5VTEw7CiAJCQlnb3RvIHR4X2Vycl9saW5rX2ZhaWx1cmU7CiAJCX0KKwkJaWYgKHQtPnBhcm1zLmNvbGxlY3RfbWQgJiYKKwkJICAgIGlwdjZfZGV2X2dldF9zYWRkcihuZXQsIGlwNl9kc3RfaWRldihkc3QpLT5kZXYsCisJCQkJICAgICAgICZmbDYtPmRhZGRyLCAwLCAmZmw2LT5zYWRkcikpCisJCQlnb3RvIHR4X2Vycl9saW5rX2ZhaWx1cmU7CiAJCW5kc3QgPSBkc3Q7CiAJfQogCkBAIC0xMDcxLDcgKzExMDQsNyBAQAogCX0KIAlpZiAobXR1IDwgSVBWNl9NSU5fTVRVKQogCQltdHUgPSBJUFY2X01JTl9NVFU7Ci0JaWYgKHNrYl9kc3Qoc2tiKSkKKwlpZiAoc2tiX2RzdChza2IpICYmICF0LT5wYXJtcy5jb2xsZWN0X21kKQogCQlza2JfZHN0KHNrYiktPm9wcy0+dXBkYXRlX3BtdHUoc2tiX2RzdChza2IpLCBOVUxMLCBza2IsIG10dSk7CiAJaWYgKHNrYi0+bGVuID4gbXR1ICYmICFza2JfaXNfZ3NvKHNrYikpIHsKIAkJKnBtdHUgPSBtdHU7CkBAIC0xMTExLDggKzExNDQsMTMgQEAKIAkJc2tiID0gbmV3X3NrYjsKIAl9CiAKLQlpZiAoIWZsNi0+Zmxvd2k2X21hcmsgJiYgbmRzdCkKLQkJZHN0X2NhY2hlX3NldF9pcDYoJnQtPmRzdF9jYWNoZSwgbmRzdCwgJmZsNi0+c2FkZHIpOworCWlmICh0LT5wYXJtcy5jb2xsZWN0X21kKSB7CisJCWlmICh0LT5lbmNhcC50eXBlICE9IFRVTk5FTF9FTkNBUF9OT05FKQorCQkJZ290byB0eF9lcnJfZHN0X3JlbGVhc2U7CisJfSBlbHNlIHsKKwkJaWYgKCFmbDYtPmZsb3dpNl9tYXJrICYmIG5kc3QpCisJCQlkc3RfY2FjaGVfc2V0X2lwNigmdC0+ZHN0X2NhY2hlLCBuZHN0LCAmZmw2LT5zYWRkcik7CisJfQogCXNrYl9kc3Rfc2V0KHNrYiwgZHN0KTsKIAogCWlmIChlbmNhcF9saW1pdCA+PSAwKSB7CkBAIC0xMTM3LDcgKzExNzUsNyBAQAogCWlwdjZoID0gaXB2Nl9oZHIoc2tiKTsKIAlpcDZfZmxvd19oZHIoaXB2NmgsIElORVRfRUNOX2VuY2Fwc3VsYXRlKDAsIGRzZmllbGQpLAogCQkgICAgIGlwNl9tYWtlX2Zsb3dsYWJlbChuZXQsIHNrYiwgZmw2LT5mbG93bGFiZWwsIHRydWUsIGZsNikpOwotCWlwdjZoLT5ob3BfbGltaXQgPSB0LT5wYXJtcy5ob3BfbGltaXQ7CisJaXB2NmgtPmhvcF9saW1pdCA9IGhvcF9saW1pdDsKIAlpcHY2aC0+bmV4dGhkciA9IHByb3RvOwogCWlwdjZoLT5zYWRkciA9IGZsNi0+c2FkZHI7CiAJaXB2NmgtPmRhZGRyID0gZmw2LT5kYWRkcjsKQEAgLTExNzAsMTggKzEyMDgsMzQgQEAKIAlpZiAodHByb3RvICE9IElQUFJPVE9fSVBJUCAmJiB0cHJvdG8gIT0gMCkKIAkJcmV0dXJuIC0xOwogCi0JaWYgKCEodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfSUdOX0VOQ0FQX0xJTUlUKSkKLQkJZW5jYXBfbGltaXQgPSB0LT5wYXJtcy5lbmNhcF9saW1pdDsKLQotCW1lbWNweSgmZmw2LCAmdC0+ZmwudS5pcDYsIHNpemVvZihmbDYpKTsKLQogCWRzZmllbGQgPSBpcHY0X2dldF9kc2ZpZWxkKGlwaCk7CiAKLQlpZiAodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfVVNFX09SSUdfVENMQVNTKQotCQlmbDYuZmxvd2xhYmVsIHw9IGh0b25sKChfX3UzMilpcGgtPnRvcyA8PCBJUFY2X1RDTEFTU19TSElGVCkKLQkJCQkJICAmIElQVjZfVENMQVNTX01BU0s7Ci0JaWYgKHQtPnBhcm1zLmZsYWdzICYgSVA2X1ROTF9GX1VTRV9PUklHX0ZXTUFSSykKLQkJZmw2LmZsb3dpNl9tYXJrID0gc2tiLT5tYXJrOworCWlmICh0LT5wYXJtcy5jb2xsZWN0X21kKSB7CisJCXN0cnVjdCBpcF90dW5uZWxfaW5mbyAqdHVuX2luZm87CisJCWNvbnN0IHN0cnVjdCBpcF90dW5uZWxfa2V5ICprZXk7CisKKwkJdHVuX2luZm8gPSBza2JfdHVubmVsX2luZm8oc2tiKTsKKwkJaWYgKHVubGlrZWx5KCF0dW5faW5mbyB8fCAhKHR1bl9pbmZvLT5tb2RlICYgSVBfVFVOTkVMX0lORk9fVFgpIHx8CisJCQkgICAgIGlwX3R1bm5lbF9pbmZvX2FmKHR1bl9pbmZvKSAhPSBBRl9JTkVUNikpCisJCQlyZXR1cm4gLTE7CisJCWtleSA9ICZ0dW5faW5mby0+a2V5OworCQltZW1zZXQoJmZsNiwgMCwgc2l6ZW9mKGZsNikpOworCQlmbDYuZmxvd2k2X3Byb3RvID0gSVBQUk9UT19JUElQOworCQlmbDYuZGFkZHIgPSBrZXktPnUuaXB2Ni5kc3Q7CisJCWZsNi5mbG93bGFiZWwgPSBrZXktPmxhYmVsOworCX0gZWxzZSB7CisJCWlmICghKHQtPnBhcm1zLmZsYWdzICYgSVA2X1ROTF9GX0lHTl9FTkNBUF9MSU1JVCkpCisJCQllbmNhcF9saW1pdCA9IHQtPnBhcm1zLmVuY2FwX2xpbWl0OworCisJCW1lbWNweSgmZmw2LCAmdC0+ZmwudS5pcDYsIHNpemVvZihmbDYpKTsKKwkJZmw2LmZsb3dpNl9wcm90byA9IElQUFJPVE9fSVBJUDsKKworCQlpZiAodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfVVNFX09SSUdfVENMQVNTKQorCQkJZmw2LmZsb3dsYWJlbCB8PSBodG9ubCgoX191MzIpaXBoLT50b3MgPDwgSVBWNl9UQ0xBU1NfU0hJRlQpCisJCQkJCSAmIElQVjZfVENMQVNTX01BU0s7CisJCWlmICh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9VU0VfT1JJR19GV01BUkspCisJCQlmbDYuZmxvd2k2X21hcmsgPSBza2ItPm1hcms7CisJfQogCiAJaWYgKGlwdHVubmVsX2hhbmRsZV9vZmZsb2Fkcyhza2IsIFNLQl9HU09fSVBYSVA2KSkKIAkJcmV0dXJuIC0xOwpAQCAtMTIxOSwyOCArMTI3Myw0NyBAQAogCSAgICBpcDZfdG5sX2FkZHJfY29uZmxpY3QodCwgaXB2NmgpKQogCQlyZXR1cm4gLTE7CiAKLQlvZmZzZXQgPSBpcDZfdG5sX3BhcnNlX3Rsdl9lbmNfbGltKHNrYiwgc2tiX25ldHdvcmtfaGVhZGVyKHNrYikpOwotCWlmIChvZmZzZXQgPiAwKSB7Ci0JCXN0cnVjdCBpcHY2X3Rsdl90bmxfZW5jX2xpbSAqdGVsOwotCQl0ZWwgPSAoc3RydWN0IGlwdjZfdGx2X3RubF9lbmNfbGltICopJnNrYl9uZXR3b3JrX2hlYWRlcihza2IpW29mZnNldF07Ci0JCWlmICh0ZWwtPmVuY2FwX2xpbWl0ID09IDApIHsKLQkJCWljbXB2Nl9zZW5kKHNrYiwgSUNNUFY2X1BBUkFNUFJPQiwKLQkJCQkgICAgSUNNUFY2X0hEUl9GSUVMRCwgb2Zmc2V0ICsgMik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZW5jYXBfbGltaXQgPSB0ZWwtPmVuY2FwX2xpbWl0IC0gMTsKLQl9IGVsc2UgaWYgKCEodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfSUdOX0VOQ0FQX0xJTUlUKSkKLQkJZW5jYXBfbGltaXQgPSB0LT5wYXJtcy5lbmNhcF9saW1pdDsKLQotCW1lbWNweSgmZmw2LCAmdC0+ZmwudS5pcDYsIHNpemVvZihmbDYpKTsKLQogCWRzZmllbGQgPSBpcHY2X2dldF9kc2ZpZWxkKGlwdjZoKTsKLQlpZiAodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfVVNFX09SSUdfVENMQVNTKQotCQlmbDYuZmxvd2xhYmVsIHw9ICgqKF9fYmUzMiAqKSBpcHY2aCAmIElQVjZfVENMQVNTX01BU0spOwotCWlmICh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9VU0VfT1JJR19GTE9XTEFCRUwpCi0JCWZsNi5mbG93bGFiZWwgfD0gaXA2X2Zsb3dsYWJlbChpcHY2aCk7Ci0JaWYgKHQtPnBhcm1zLmZsYWdzICYgSVA2X1ROTF9GX1VTRV9PUklHX0ZXTUFSSykKLQkJZmw2LmZsb3dpNl9tYXJrID0gc2tiLT5tYXJrOworCisJaWYgKHQtPnBhcm1zLmNvbGxlY3RfbWQpIHsKKwkJc3RydWN0IGlwX3R1bm5lbF9pbmZvICp0dW5faW5mbzsKKwkJY29uc3Qgc3RydWN0IGlwX3R1bm5lbF9rZXkgKmtleTsKKworCQl0dW5faW5mbyA9IHNrYl90dW5uZWxfaW5mbyhza2IpOworCQlpZiAodW5saWtlbHkoIXR1bl9pbmZvIHx8ICEodHVuX2luZm8tPm1vZGUgJiBJUF9UVU5ORUxfSU5GT19UWCkgfHwKKwkJCSAgICAgaXBfdHVubmVsX2luZm9fYWYodHVuX2luZm8pICE9IEFGX0lORVQ2KSkKKwkJCXJldHVybiAtMTsKKwkJa2V5ID0gJnR1bl9pbmZvLT5rZXk7CisJCW1lbXNldCgmZmw2LCAwLCBzaXplb2YoZmw2KSk7CisJCWZsNi5mbG93aTZfcHJvdG8gPSBJUFBST1RPX0lQVjY7CisJCWZsNi5kYWRkciA9IGtleS0+dS5pcHY2LmRzdDsKKwkJZmw2LmZsb3dsYWJlbCA9IGtleS0+bGFiZWw7CisJfSBlbHNlIHsKKwkJb2Zmc2V0ID0gaXA2X3RubF9wYXJzZV90bHZfZW5jX2xpbShza2IsIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpKTsKKwkJaWYgKG9mZnNldCA+IDApIHsKKwkJCXN0cnVjdCBpcHY2X3Rsdl90bmxfZW5jX2xpbSAqdGVsOworCisJCQl0ZWwgPSAodm9pZCAqKSZza2JfbmV0d29ya19oZWFkZXIoc2tiKVtvZmZzZXRdOworCQkJaWYgKHRlbC0+ZW5jYXBfbGltaXQgPT0gMCkgeworCQkJCWljbXB2Nl9zZW5kKHNrYiwgSUNNUFY2X1BBUkFNUFJPQiwKKwkJCQkJICAgIElDTVBWNl9IRFJfRklFTEQsIG9mZnNldCArIDIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWVuY2FwX2xpbWl0ID0gdGVsLT5lbmNhcF9saW1pdCAtIDE7CisJCX0gZWxzZSBpZiAoISh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9JR05fRU5DQVBfTElNSVQpKSB7CisJCQllbmNhcF9saW1pdCA9IHQtPnBhcm1zLmVuY2FwX2xpbWl0OworCQl9CisKKwkJbWVtY3B5KCZmbDYsICZ0LT5mbC51LmlwNiwgc2l6ZW9mKGZsNikpOworCQlmbDYuZmxvd2k2X3Byb3RvID0gSVBQUk9UT19JUFY2OworCisJCWlmICh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9VU0VfT1JJR19UQ0xBU1MpCisJCQlmbDYuZmxvd2xhYmVsIHw9ICgqKF9fYmUzMiAqKWlwdjZoICYgSVBWNl9UQ0xBU1NfTUFTSyk7CisJCWlmICh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9VU0VfT1JJR19GTE9XTEFCRUwpCisJCQlmbDYuZmxvd2xhYmVsIHw9IGlwNl9mbG93bGFiZWwoaXB2NmgpOworCQlpZiAodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfVVNFX09SSUdfRldNQVJLKQorCQkJZmw2LmZsb3dpNl9tYXJrID0gc2tiLT5tYXJrOworCX0KIAogCWlmIChpcHR1bm5lbF9oYW5kbGVfb2ZmbG9hZHMoc2tiLCBTS0JfR1NPX0lQWElQNikpCiAJCXJldHVybiAtMTsKQEAgLTE3MzksNiArMTgxMiwxMCBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAJaXA2X3RubF9saW5rX2NvbmZpZyh0KTsKKwlpZiAodC0+cGFybXMuY29sbGVjdF9tZCkgeworCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfTkVUTlNfTE9DQUw7CisJCW5ldGlmX2tlZXBfZHN0KGRldik7CisJfQogCXJldHVybiAwOwogfQogCkBAIC0xODA5LDYgKzE4ODYsOSBAQAogCiAJaWYgKGRhdGFbSUZMQV9JUFRVTl9QUk9UT10pCiAJCXBhcm1zLT5wcm90byA9IG5sYV9nZXRfdTgoZGF0YVtJRkxBX0lQVFVOX1BST1RPXSk7CisKKwlpZiAoZGF0YVtJRkxBX0lQVFVOX0NPTExFQ1RfTUVUQURBVEFdKQorCQlwYXJtcy0+Y29sbGVjdF9tZCA9IHRydWU7CiB9CiAKIHN0YXRpYyBib29sIGlwNl90bmxfbmV0bGlua19lbmNhcF9wYXJtcyhzdHJ1Y3QgbmxhdHRyICpkYXRhW10sCkBAIC0xODQ4LDYgKzE5MjgsNyBAQAogCQkJICAgc3RydWN0IG5sYXR0ciAqdGJbXSwgc3RydWN0IG5sYXR0ciAqZGF0YVtdKQogewogCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTsKKwlzdHJ1Y3QgaXA2X3RubF9uZXQgKmlwNm4gPSBuZXRfZ2VuZXJpYyhuZXQsIGlwNl90bmxfbmV0X2lkKTsKIAlzdHJ1Y3QgaXA2X3RubCAqbnQsICp0OwogCXN0cnVjdCBpcF90dW5uZWxfZW5jYXAgaXBlbmNhcDsKIApAQCAtMTg2Miw5ICsxOTQzLDE0IEBACiAKIAlpcDZfdG5sX25ldGxpbmtfcGFybXMoZGF0YSwgJm50LT5wYXJtcyk7CiAKLQl0ID0gaXA2X3RubF9sb2NhdGUobmV0LCAmbnQtPnBhcm1zLCAwKTsKLQlpZiAoIUlTX0VSUih0KSkKLQkJcmV0dXJuIC1FRVhJU1Q7CisJaWYgKG50LT5wYXJtcy5jb2xsZWN0X21kKSB7CisJCWlmIChydG5sX2RlcmVmZXJlbmNlKGlwNm4tPmNvbGxlY3RfbWRfdHVuKSkKKwkJCXJldHVybiAtRUVYSVNUOworCX0gZWxzZSB7CisJCXQgPSBpcDZfdG5sX2xvY2F0ZShuZXQsICZudC0+cGFybXMsIDApOworCQlpZiAoIUlTX0VSUih0KSkKKwkJCXJldHVybiAtRUVYSVNUOworCX0KIAogCXJldHVybiBpcDZfdG5sX2NyZWF0ZTIoZGV2KTsKIH0KQEAgLTE4ODgsNiArMTk3NCw4IEBACiAJCQlyZXR1cm4gZXJyOwogCX0KIAlpcDZfdG5sX25ldGxpbmtfcGFybXMoZGF0YSwgJnApOworCWlmIChwLmNvbGxlY3RfbWQpCisJCXJldHVybiAtRUlOVkFMOwogCiAJdCA9IGlwNl90bmxfbG9jYXRlKG5ldCwgJnAsIDApOwogCWlmICghSVNfRVJSKHQpKSB7CkBAIC0xOTM1LDYgKzIwMjMsOCBAQAogCQlubGFfdG90YWxfc2l6ZSgyKSArCiAJCS8qIElGTEFfSVBUVU5fRU5DQVBfRFBPUlQgKi8KIAkJbmxhX3RvdGFsX3NpemUoMikgKworCQkvKiBJRkxBX0lQVFVOX0NPTExFQ1RfTUVUQURBVEEgKi8KKwkJbmxhX3RvdGFsX3NpemUoMCkgKwogCQkwOwogfQogCkBAIC0xOTUzLDE2ICsyMDQzLDE1IEBACiAJICAgIG5sYV9wdXRfdTgoc2tiLCBJRkxBX0lQVFVOX1BST1RPLCBwYXJtLT5wcm90bykpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCi0JaWYgKG5sYV9wdXRfdTE2KHNrYiwgSUZMQV9JUFRVTl9FTkNBUF9UWVBFLAotCQkJdHVubmVsLT5lbmNhcC50eXBlKSB8fAotCW5sYV9wdXRfYmUxNihza2IsIElGTEFfSVBUVU5fRU5DQVBfU1BPUlQsCi0JCSAgICAgdHVubmVsLT5lbmNhcC5zcG9ydCkgfHwKLQlubGFfcHV0X2JlMTYoc2tiLCBJRkxBX0lQVFVOX0VOQ0FQX0RQT1JULAotCQkgICAgIHR1bm5lbC0+ZW5jYXAuZHBvcnQpIHx8Ci0JbmxhX3B1dF91MTYoc2tiLCBJRkxBX0lQVFVOX0VOQ0FQX0ZMQUdTLAotCQkgICAgdHVubmVsLT5lbmNhcC5mbGFncykpCisJaWYgKG5sYV9wdXRfdTE2KHNrYiwgSUZMQV9JUFRVTl9FTkNBUF9UWVBFLCB0dW5uZWwtPmVuY2FwLnR5cGUpIHx8CisJICAgIG5sYV9wdXRfYmUxNihza2IsIElGTEFfSVBUVU5fRU5DQVBfU1BPUlQsIHR1bm5lbC0+ZW5jYXAuc3BvcnQpIHx8CisJICAgIG5sYV9wdXRfYmUxNihza2IsIElGTEFfSVBUVU5fRU5DQVBfRFBPUlQsIHR1bm5lbC0+ZW5jYXAuZHBvcnQpIHx8CisJICAgIG5sYV9wdXRfdTE2KHNrYiwgSUZMQV9JUFRVTl9FTkNBUF9GTEFHUywgdHVubmVsLT5lbmNhcC5mbGFncykpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCisJaWYgKHBhcm0tPmNvbGxlY3RfbWQpCisJCWlmIChubGFfcHV0X2ZsYWcoc2tiLCBJRkxBX0lQVFVOX0NPTExFQ1RfTUVUQURBVEEpKQorCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJcmV0dXJuIDA7CiAKIG5sYV9wdXRfZmFpbHVyZToKQEAgLTE5OTAsNiArMjA3OSw3IEBACiAJW0lGTEFfSVBUVU5fRU5DQVBfRkxBR1NdCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKIAlbSUZMQV9JUFRVTl9FTkNBUF9TUE9SVF0JPSB7IC50eXBlID0gTkxBX1UxNiB9LAogCVtJRkxBX0lQVFVOX0VOQ0FQX0RQT1JUXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCisJW0lGTEFfSVBUVU5fQ09MTEVDVF9NRVRBREFUQV0JPSB7IC50eXBlID0gTkxBX0ZMQUcgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcnRubF9saW5rX29wcyBpcDZfbGlua19vcHMgX19yZWFkX21vc3RseSA9IHsKQEAgLTIwMzEsNyArMjEyMSw3IEBACiAJCWlmIChkZXYtPnJ0bmxfbGlua19vcHMgPT0gJmlwNl9saW5rX29wcykKIAkJCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX3F1ZXVlKGRldiwgJmxpc3QpOwogCi0JZm9yIChoID0gMDsgaCA8IEhBU0hfU0laRTsgaCsrKSB7CisJZm9yIChoID0gMDsgaCA8IElQNl9UVU5ORUxfSEFTSF9TSVpFOyBoKyspIHsKIAkJdCA9IHJ0bmxfZGVyZWZlcmVuY2UoaXA2bi0+dG5sc19yX2xbaF0pOwogCQl3aGlsZSAodCkgewogCQkJLyogSWYgZGV2IGlzIGluIHRoZSBzYW1lIG5ldG5zLCBpdCBoYXMgYWxyZWFkeQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X3Z0aS5jIGIvbmV0L2lwdjYvaXA2X3Z0aS5jCmluZGV4IGQ5MGExMWYuLjhhMDJjYTggMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl92dGkuYworKysgYi9uZXQvaXB2Ni9pcDZfdnRpLmMKQEAgLTUwLDE0ICs1MCwxNCBAQAogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L25ldG5zL2dlbmVyaWMuaD4KIAotI2RlZmluZSBIQVNIX1NJWkVfU0hJRlQgIDUKLSNkZWZpbmUgSEFTSF9TSVpFICgxIDw8IEhBU0hfU0laRV9TSElGVCkKKyNkZWZpbmUgSVA2X1ZUSV9IQVNIX1NJWkVfU0hJRlQgIDUKKyNkZWZpbmUgSVA2X1ZUSV9IQVNIX1NJWkUgKDEgPDwgSVA2X1ZUSV9IQVNIX1NJWkVfU0hJRlQpCiAKIHN0YXRpYyB1MzIgSEFTSChjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIxLCBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIyKQogewogCXUzMiBoYXNoID0gaXB2Nl9hZGRyX2hhc2goYWRkcjEpIF4gaXB2Nl9hZGRyX2hhc2goYWRkcjIpOwogCi0JcmV0dXJuIGhhc2hfMzIoaGFzaCwgSEFTSF9TSVpFX1NISUZUKTsKKwlyZXR1cm4gaGFzaF8zMihoYXNoLCBJUDZfVlRJX0hBU0hfU0laRV9TSElGVCk7CiB9CiAKIHN0YXRpYyBpbnQgdnRpNl9kZXZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKQEAgLTY5LDcgKzY5LDcgQEAKIAkvKiB0aGUgdnRpNiB0dW5uZWwgZmFsbGJhY2sgZGV2aWNlICovCiAJc3RydWN0IG5ldF9kZXZpY2UgKmZiX3RubF9kZXY7CiAJLyogbGlzdHMgZm9yIHN0b3JpbmcgdHVubmVscyBpbiB1c2UgKi8KLQlzdHJ1Y3QgaXA2X3RubCBfX3JjdSAqdG5sc19yX2xbSEFTSF9TSVpFXTsKKwlzdHJ1Y3QgaXA2X3RubCBfX3JjdSAqdG5sc19yX2xbSVA2X1ZUSV9IQVNIX1NJWkVdOwogCXN0cnVjdCBpcDZfdG5sIF9fcmN1ICp0bmxzX3djWzFdOwogCXN0cnVjdCBpcDZfdG5sIF9fcmN1ICoqdG5sc1syXTsKIH07CkBAIC0zMjEsMTEgKzMyMSw5IEBACiAJCQlnb3RvIGRpc2NhcmQ7CiAJCX0KIAotCQlYRlJNX1RVTk5FTF9TS0JfQ0Ioc2tiKS0+dHVubmVsLmlwNiA9IHQ7Ci0KIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQkJcmV0dXJuIHhmcm02X3Jjdihza2IpOworCQlyZXR1cm4geGZybTZfcmN2X3RubChza2IsIHQpOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gLUVJTlZBTDsKQEAgLTM0MCw2ICszMzgsNyBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IHBjcHVfc3dfbmV0c3RhdHMgKnRzdGF0czsKIAlzdHJ1Y3QgeGZybV9zdGF0ZSAqeDsKKwlzdHJ1Y3QgeGZybV9tb2RlICppbm5lcl9tb2RlOwogCXN0cnVjdCBpcDZfdG5sICp0ID0gWEZSTV9UVU5ORUxfU0tCX0NCKHNrYiktPnR1bm5lbC5pcDY7CiAJdTMyIG9yaWdfbWFyayA9IHNrYi0+bWFyazsKIAlpbnQgcmV0OwpAQCAtMzU3LDcgKzM1NiwxOSBAQAogCX0KIAogCXggPSB4ZnJtX2lucHV0X3N0YXRlKHNrYik7Ci0JZmFtaWx5ID0geC0+aW5uZXJfbW9kZS0+YWZpbmZvLT5mYW1pbHk7CisKKwlpbm5lcl9tb2RlID0geC0+aW5uZXJfbW9kZTsKKworCWlmICh4LT5zZWwuZmFtaWx5ID09IEFGX1VOU1BFQykgeworCQlpbm5lcl9tb2RlID0geGZybV9pcDJpbm5lcl9tb2RlKHgsIFhGUk1fTU9ERV9TS0JfQ0Ioc2tiKS0+cHJvdG9jb2wpOworCQlpZiAoaW5uZXJfbW9kZSA9PSBOVUxMKSB7CisJCQlYRlJNX0lOQ19TVEFUUyhkZXZfbmV0KHNrYi0+ZGV2KSwKKwkJCQkgICAgICAgTElOVVhfTUlCX1hGUk1JTlNUQVRFTU9ERUVSUk9SKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJZmFtaWx5ID0gaW5uZXJfbW9kZS0+YWZpbmZvLT5mYW1pbHk7CiAKIAlza2ItPm1hcmsgPSBiZTMyX3RvX2NwdSh0LT5wYXJtcy5pX2tleSk7CiAJcmV0ID0geGZybV9wb2xpY3lfY2hlY2soTlVMTCwgWEZSTV9QT0xJQ1lfSU4sIHNrYiwgZmFtaWx5KTsKQEAgLTEwNDAsNyArMTA1MSw3IEBACiAJc3RydWN0IGlwNl90bmwgKnQ7CiAJTElTVF9IRUFEKGxpc3QpOwogCi0JZm9yIChoID0gMDsgaCA8IEhBU0hfU0laRTsgaCsrKSB7CisJZm9yIChoID0gMDsgaCA8IElQNl9WVElfSEFTSF9TSVpFOyBoKyspIHsKIAkJdCA9IHJ0bmxfZGVyZWZlcmVuY2UoaXA2bi0+dG5sc19yX2xbaF0pOwogCQl3aGlsZSAodCkgewogCQkJdW5yZWdpc3Rlcl9uZXRkZXZpY2VfcXVldWUodC0+ZGV2LCAmbGlzdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZtci5jIGIvbmV0L2lwdjYvaXA2bXIuYwppbmRleCA2MTIyZjljLi43ZjQyNjViIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZtci5jCisrKyBiL25ldC9pcHY2L2lwNm1yLmMKQEAgLTIyMzksNiArMjIzOSw3IEBACiAJc3RydWN0IHJ0YV9tZmNfc3RhdHMgbWZjczsKIAlzdHJ1Y3QgbmxhdHRyICptcF9hdHRyOwogCXN0cnVjdCBydG5leHRob3AgKm5ocDsKKwl1bnNpZ25lZCBsb25nIGxhc3R1c2U7CiAJaW50IGN0OwogCiAJLyogSWYgY2FjaGUgaXMgdW5yZXNvbHZlZCwgZG9uJ3QgdHJ5IHRvIHBhcnNlIElJRiBhbmQgT0lGICovCkBAIC0yMjY5LDEyICsyMjcwLDE0IEBACiAKIAlubGFfbmVzdF9lbmQoc2tiLCBtcF9hdHRyKTsKIAorCWxhc3R1c2UgPSBSRUFEX09OQ0UoYy0+bWZjX3VuLnJlcy5sYXN0dXNlKTsKKwlsYXN0dXNlID0gdGltZV9hZnRlcl9lcShqaWZmaWVzLCBsYXN0dXNlKSA/IGppZmZpZXMgLSBsYXN0dXNlIDogMDsKKwogCW1mY3MubWZjc19wYWNrZXRzID0gYy0+bWZjX3VuLnJlcy5wa3Q7CiAJbWZjcy5tZmNzX2J5dGVzID0gYy0+bWZjX3VuLnJlcy5ieXRlczsKIAltZmNzLm1mY3Nfd3JvbmdfaWYgPSBjLT5tZmNfdW4ucmVzLndyb25nX2lmOwogCWlmIChubGFfcHV0XzY0Yml0KHNrYiwgUlRBX01GQ19TVEFUUywgc2l6ZW9mKG1mY3MpLCAmbWZjcywgUlRBX1BBRCkgfHwKLQkgICAgbmxhX3B1dF91NjRfNjRiaXQoc2tiLCBSVEFfRVhQSVJFUywKLQkJCSAgICAgIGppZmZpZXNfdG9fY2xvY2tfdChjLT5tZmNfdW4ucmVzLmxhc3R1c2UpLAorCSAgICBubGFfcHV0X3U2NF82NGJpdChza2IsIFJUQV9FWFBJUkVTLCBqaWZmaWVzX3RvX2Nsb2NrX3QobGFzdHVzZSksCiAJCQkgICAgICBSVEFfUEFEKSkKIAkJcmV0dXJuIC1FTVNHU0laRTsKIApAQCAtMjI4Miw4ICsyMjg1LDggQEAKIAlyZXR1cm4gMTsKIH0KIAotaW50IGlwNm1yX2dldF9yb3V0ZShzdHJ1Y3QgbmV0ICpuZXQsCi0JCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgcnRtc2cgKnJ0bSwgaW50IG5vd2FpdCkKK2ludCBpcDZtcl9nZXRfcm91dGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgcnRtc2cgKnJ0bSwKKwkJICAgIGludCBub3dhaXQsIHUzMiBwb3J0aWQpCiB7CiAJaW50IGVycjsKIAlzdHJ1Y3QgbXI2X3RhYmxlICptcnQ7CkBAIC0yMzI4LDYgKzIzMzEsNyBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAorCQlORVRMSU5LX0NCKHNrYjIpLnBvcnRpZCA9IHBvcnRpZDsKIAkJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiMik7CiAKIAkJc2tiX3B1dChza2IyLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L21jYXN0LmMgYi9uZXQvaXB2Ni9tY2FzdC5jCmluZGV4IGQ2NGVlN2UuLjc1YzFmYzUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L21jYXN0LmMKKysrIGIvbmV0L2lwdjYvbWNhc3QuYwpAQCAtMTczOSw2ICsxNzM5LDE1IEBACiAJCQljb250aW51ZTsKIAkJfQogCisJCS8qIEJhc2VkIG9uIFJGQzM4MTAgNi4xLiBTaG91bGQgbm90IHNlbmQgc291cmNlLWxpc3QgY2hhbmdlCisJCSAqIHJlY29yZHMgd2hlbiB0aGVyZSBpcyBhIGZpbHRlciBtb2RlIGNoYW5nZS4KKwkJICovCisJCWlmICgoKGdkZWxldGVkICYmIHBtYy0+bWNhX3NmbW9kZSA9PSBNQ0FTVF9FWENMVURFKSB8fAorCQkgICAgICghZ2RlbGV0ZWQgJiYgcG1jLT5tY2FfY3Jjb3VudCkpICYmCisJCSAgICAodHlwZSA9PSBNTEQyX0FMTE9XX05FV19TT1VSQ0VTIHx8CisJCSAgICAgdHlwZSA9PSBNTEQyX0JMT0NLX09MRF9TT1VSQ0VTKSAmJiBwc2YtPnNmX2NyY291bnQpCisJCQlnb3RvIGRlY3JlYXNlX3NmX2NyY291bnQ7CisKIAkJLyogY2xlYXIgbWFya3Mgb24gcXVlcnkgcmVzcG9uc2VzICovCiAJCWlmIChpc3F1ZXJ5KQogCQkJcHNmLT5zZl9nc3Jlc3AgPSAwOwpAQCAtMTc2Niw2ICsxNzc1LDcgQEAKIAkJc2NvdW50Kys7IHN0b3RhbCsrOwogCQlpZiAoKHR5cGUgPT0gTUxEMl9BTExPV19ORVdfU09VUkNFUyB8fAogCQkgICAgIHR5cGUgPT0gTUxEMl9CTE9DS19PTERfU09VUkNFUykgJiYgcHNmLT5zZl9jcmNvdW50KSB7CitkZWNyZWFzZV9zZl9jcmNvdW50OgogCQkJcHNmLT5zZl9jcmNvdW50LS07CiAJCQlpZiAoKHNkZWxldGVkIHx8IGdkZWxldGVkKSAmJiBwc2YtPnNmX2NyY291bnQgPT0gMCkgewogCQkJCWlmIChwc2ZfcHJldikKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25kaXNjLmMgYi9uZXQvaXB2Ni9uZGlzYy5jCmluZGV4IGZlNjVjZGMuLmQ4ZTY3MTQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25kaXNjLmMKKysrIGIvbmV0L2lwdjYvbmRpc2MuYwpAQCAtNjcsNyArNjcsNiBAQAogI2luY2x1ZGUgPG5ldC9mbG93Lmg+CiAjaW5jbHVkZSA8bmV0L2lwNl9jaGVja3N1bS5oPgogI2luY2x1ZGUgPG5ldC9pbmV0X2NvbW1vbi5oPgotI2luY2x1ZGUgPG5ldC9sM21kZXYuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KQEAgLTQ1NywxMSArNDU2LDkgQEAKIAogCWlmICghZHN0KSB7CiAJCXN0cnVjdCBmbG93aTYgZmw2OwotCQlpbnQgb2lmID0gbDNtZGV2X2ZpYl9vaWYoc2tiLT5kZXYpOworCQlpbnQgb2lmID0gc2tiLT5kZXYtPmlmaW5kZXg7CiAKIAkJaWNtcHY2X2Zsb3dfaW5pdChzaywgJmZsNiwgdHlwZSwgc2FkZHIsIGRhZGRyLCBvaWYpOwotCQlpZiAob2lmICE9IHNrYi0+ZGV2LT5pZmluZGV4KQotCQkJZmw2LmZsb3dpNl9mbGFncyB8PSBGTE9XSV9GTEFHX0wzTURFVl9TUkM7CiAJCWRzdCA9IGljbXA2X2RzdF9hbGxvYyhza2ItPmRldiwgJmZsNik7CiAJCWlmIChJU19FUlIoZHN0KSkgewogCQkJa2ZyZWVfc2tiKHNrYik7CkBAIC0xNTM4LDcgKzE1MzUsNiBAQAogCWludCByZF9sZW47CiAJdTggaGFfYnVmW01BWF9BRERSX0xFTl0sICpoYSA9IE5VTEwsCiAJICAgb3BzX2RhdGFfYnVmW05ESVNDX09QU19SRURJUkVDVF9EQVRBX1NQQUNFXSwgKm9wc19kYXRhID0gTlVMTDsKLQlpbnQgb2lmID0gbDNtZGV2X2ZpYl9vaWYoZGV2KTsKIAlib29sIHJldDsKIAogCWlmIChpcHY2X2dldF9sbGFkZHIoZGV2LCAmc2FkZHJfYnVmLCBJRkFfRl9URU5UQVRJVkUpKSB7CkBAIC0xNTU1LDEwICsxNTUxLDcgQEAKIAl9CiAKIAlpY21wdjZfZmxvd19pbml0KHNrLCAmZmw2LCBORElTQ19SRURJUkVDVCwKLQkJCSAmc2FkZHJfYnVmLCAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsIG9pZik7Ci0KLQlpZiAob2lmICE9IHNrYi0+ZGV2LT5pZmluZGV4KQotCQlmbDYuZmxvd2k2X2ZsYWdzIHw9IEZMT1dJX0ZMQUdfTDNNREVWX1NSQzsKKwkJCSAmc2FkZHJfYnVmLCAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsIGRldi0+aWZpbmRleCk7CiAKIAlkc3QgPSBpcDZfcm91dGVfb3V0cHV0KG5ldCwgTlVMTCwgJmZsNik7CiAJaWYgKGRzdC0+ZXJyb3IpIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZfdGFibGVzLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3RhYmxlcy5jCmluZGV4IDU1MmZhYzIuLjU1YWFjZWEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZfdGFibGVzLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl90YWJsZXMuYwpAQCAtMTkwLDcgKzE5MCw3IEBACiAJLnUgPSB7CiAJCS5sb2cgPSB7CiAJCQkubGV2ZWwgPSBMT0dMRVZFTF9XQVJOSU5HLAotCQkJLmxvZ2ZsYWdzID0gTkZfTE9HX01BU0ssCisJCQkubG9nZmxhZ3MgPSBORl9MT0dfREVGQVVMVF9NQVNLLAogCQl9LAogCX0sCiB9OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjYuYyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY2LmMKaW5kZXggMWFhNTg0OC4uOTYzZWUzOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjYuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2Ni5jCkBAIC0xMTUsNyArMTE1LDcgQEAKIAloZWxwID0gbmZjdF9oZWxwKGN0KTsKIAlpZiAoIWhlbHApCiAJCXJldHVybiBORl9BQ0NFUFQ7Ci0JLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va19zbG93ICovCisJLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va190aHJlc2ggKi8KIAloZWxwZXIgPSByY3VfZGVyZWZlcmVuY2UoaGVscC0+aGVscGVyKTsKIAlpZiAoIWhlbHBlcikKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcHY2LmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2ljbXB2Ni5jCmluZGV4IDY2MGJjMTAuLmY1YTYxYmMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcHY2LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19pY21wdjYuYwpAQCAtMTY1LDcgKzE2NSw3IEBACiAJCXJldHVybiAtTkZfQUNDRVBUOwogCX0KIAotCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfc2xvdyAqLworCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfdGhyZXNoICovCiAJaW5wcm90byA9IF9fbmZfY3RfbDRwcm90b19maW5kKFBGX0lORVQ2LCBvcmlndHVwbGUuZHN0LnByb3RvbnVtKTsKIAogCS8qIE9yZGluYXJpbHksIHdlJ2QgZXhwZWN0IHRoZSBpbnZlcnRlZCB0dXBsZXByb3RvLCBidXQgaXQncwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2xvZ19pcHY2LmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfbG9nX2lwdjYuYwppbmRleCA4ZGQ4Njk2Li41N2Q4NjA2IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfbG9nX2lwdjYuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfbG9nX2lwdjYuYwpAQCAtMzAsNyArMzAsNyBAQAogCS51ID0gewogCQkubG9nID0gewogCQkJLmxldmVsCSAgPSBMT0dMRVZFTF9OT1RJQ0UsCi0JCQkubG9nZmxhZ3MgPSBORl9MT0dfTUFTSywKKwkJCS5sb2dmbGFncyA9IE5GX0xPR19ERUZBVUxUX01BU0ssCiAJCX0sCiAJfSwKIH07CkBAIC01Miw3ICs1Miw3IEBACiAJaWYgKGluZm8tPnR5cGUgPT0gTkZfTE9HX1RZUEVfTE9HKQogCQlsb2dmbGFncyA9IGluZm8tPnUubG9nLmxvZ2ZsYWdzOwogCWVsc2UKLQkJbG9nZmxhZ3MgPSBORl9MT0dfTUFTSzsKKwkJbG9nZmxhZ3MgPSBORl9MT0dfREVGQVVMVF9NQVNLOwogCiAJaWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBpcDZob2ZmLCBzaXplb2YoX2lwNmgpLCAmX2lwNmgpOwogCWlmIChpaCA9PSBOVUxMKSB7CkBAIC04NCw3ICs4NCw3IEBACiAJCX0KIAogCQkvKiBNYXggbGVuZ3RoOiA0OCAiT1BUICguLi4pICIgKi8KLQkJaWYgKGxvZ2ZsYWdzICYgWFRfTE9HX0lQT1BUKQorCQlpZiAobG9nZmxhZ3MgJiBORl9MT0dfSVBPUFQpCiAJCQluZl9sb2dfYnVmX2FkZChtLCAiT1BUICggIik7CiAKIAkJc3dpdGNoIChjdXJyZW50aGRyKSB7CkBAIC0xMjEsNyArMTIxLDcgQEAKIAkJY2FzZSBJUFBST1RPX1JPVVRJTkc6CiAJCWNhc2UgSVBQUk9UT19IT1BPUFRTOgogCQkJaWYgKGZyYWdtZW50KSB7Ci0JCQkJaWYgKGxvZ2ZsYWdzICYgWFRfTE9HX0lQT1BUKQorCQkJCWlmIChsb2dmbGFncyAmIE5GX0xPR19JUE9QVCkKIAkJCQkJbmZfbG9nX2J1Zl9hZGQobSwgIikiKTsKIAkJCQlyZXR1cm47CiAJCQl9CkBAIC0xMjksNyArMTI5LDcgQEAKIAkJCWJyZWFrOwogCQkvKiBNYXggTGVuZ3RoICovCiAJCWNhc2UgSVBQUk9UT19BSDoKLQkJCWlmIChsb2dmbGFncyAmIFhUX0xPR19JUE9QVCkgeworCQkJaWYgKGxvZ2ZsYWdzICYgTkZfTE9HX0lQT1BUKSB7CiAJCQkJc3RydWN0IGlwX2F1dGhfaGRyIF9haGRyOwogCQkJCWNvbnN0IHN0cnVjdCBpcF9hdXRoX2hkciAqYWg7CiAKQEAgLTE2MSw3ICsxNjEsNyBAQAogCQkJaGRybGVuID0gKGhwLT5oZHJsZW4rMik8PDI7CiAJCQlicmVhazsKIAkJY2FzZSBJUFBST1RPX0VTUDoKLQkJCWlmIChsb2dmbGFncyAmIFhUX0xPR19JUE9QVCkgeworCQkJaWYgKGxvZ2ZsYWdzICYgTkZfTE9HX0lQT1BUKSB7CiAJCQkJc3RydWN0IGlwX2VzcF9oZHIgX2VzcGg7CiAJCQkJY29uc3Qgc3RydWN0IGlwX2VzcF9oZHIgKmVoOwogCkBAIC0xOTQsNyArMTk0LDcgQEAKIAkJCW5mX2xvZ19idWZfYWRkKG0sICJVbmtub3duIEV4dCBIZHIgJXUiLCBjdXJyZW50aGRyKTsKIAkJCXJldHVybjsKIAkJfQotCQlpZiAobG9nZmxhZ3MgJiBYVF9MT0dfSVBPUFQpCisJCWlmIChsb2dmbGFncyAmIE5GX0xPR19JUE9QVCkKIAkJCW5mX2xvZ19idWZfYWRkKG0sICIpICIpOwogCiAJCWN1cnJlbnRoZHIgPSBocC0+bmV4dGhkcjsKQEAgLTI3Nyw3ICsyNzcsNyBAQAogCX0KIAogCS8qIE1heCBsZW5ndGg6IDE1ICJVSUQ9NDI5NDk2NzI5NSAiICovCi0JaWYgKChsb2dmbGFncyAmIFhUX0xPR19VSUQpICYmIHJlY3Vyc2UpCisJaWYgKChsb2dmbGFncyAmIE5GX0xPR19VSUQpICYmIHJlY3Vyc2UpCiAJCW5mX2xvZ19kdW1wX3NrX3VpZF9naWQobSwgc2tiLT5zayk7CiAKIAkvKiBNYXggbGVuZ3RoOiAxNiAiTUFSSz0weEZGRkZGRkZGICIgKi8KQEAgLTI5NSw3ICsyOTUsNyBAQAogCWlmIChpbmZvLT50eXBlID09IE5GX0xPR19UWVBFX0xPRykKIAkJbG9nZmxhZ3MgPSBpbmZvLT51LmxvZy5sb2dmbGFnczsKIAotCWlmICghKGxvZ2ZsYWdzICYgWFRfTE9HX01BQ0RFQ09ERSkpCisJaWYgKCEobG9nZmxhZ3MgJiBORl9MT0dfTUFDREVDT0RFKSkKIAkJZ290byBmYWxsYmFjazsKIAogCXN3aXRjaCAoZGV2LT50eXBlKSB7CkBAIC0zNzksOCArMzc5LDcgQEAKIAogc3RhdGljIGludCBfX25ldF9pbml0IG5mX2xvZ19pcHY2X25ldF9pbml0KHN0cnVjdCBuZXQgKm5ldCkKIHsKLQluZl9sb2dfc2V0KG5ldCwgTkZQUk9UT19JUFY2LCAmbmZfaXA2X2xvZ2dlcik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIG5mX2xvZ19zZXQobmV0LCBORlBST1RPX0lQVjYsICZuZl9pcDZfbG9nZ2VyKTsKIH0KIAogc3RhdGljIHZvaWQgX19uZXRfZXhpdCBuZl9sb2dfaXB2Nl9uZXRfZXhpdChzdHJ1Y3QgbmV0ICpuZXQpCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfdGFibGVzX2lwdjYuYyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl90YWJsZXNfaXB2Ni5jCmluZGV4IDMwYjIyZjQuLmQ2ZTRiYTUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9uZl90YWJsZXNfaXB2Ni5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl90YWJsZXNfaXB2Ni5jCkBAIC0yMiw5ICsyMiw3IEBACiB7CiAJc3RydWN0IG5mdF9wa3RpbmZvIHBrdDsKIAotCS8qIG1hbGZvcm1lZCBwYWNrZXQsIGRyb3AgaXQgKi8KLQlpZiAobmZ0X3NldF9wa3RpbmZvX2lwdjYoJnBrdCwgc2tiLCBzdGF0ZSkgPCAwKQotCQlyZXR1cm4gTkZfRFJPUDsKKwluZnRfc2V0X3BrdGluZm9faXB2NigmcGt0LCBza2IsIHN0YXRlKTsKIAogCXJldHVybiBuZnRfZG9fY2hhaW4oJnBrdCwgcHJpdik7CiB9CkBAIC0xMDIsNyArMTAwLDEwIEBACiB7CiAJaW50IHJldDsKIAotCW5mdF9yZWdpc3Rlcl9jaGFpbl90eXBlKCZmaWx0ZXJfaXB2Nik7CisJcmV0ID0gbmZ0X3JlZ2lzdGVyX2NoYWluX3R5cGUoJmZpbHRlcl9pcHY2KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwogCXJldCA9IHJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJm5mX3RhYmxlc19pcHY2X25ldF9vcHMpOwogCWlmIChyZXQgPCAwKQogCQluZnRfdW5yZWdpc3Rlcl9jaGFpbl90eXBlKCZmaWx0ZXJfaXB2Nik7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZ0X2NoYWluX3JvdXRlX2lwdjYuYyBiL25ldC9pcHY2L25ldGZpbHRlci9uZnRfY2hhaW5fcm91dGVfaXB2Ni5jCmluZGV4IDcxZDk5NWYuLmYyNzI3NDcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9uZnRfY2hhaW5fcm91dGVfaXB2Ni5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9uZnRfY2hhaW5fcm91dGVfaXB2Ni5jCkBAIC0zMSwxMCArMzEsOSBAQAogCXN0cnVjdCBpbjZfYWRkciBzYWRkciwgZGFkZHI7CiAJdV9pbnQ4X3QgaG9wX2xpbWl0OwogCXUzMiBtYXJrLCBmbG93bGFiZWw7CisJaW50IGVycjsKIAotCS8qIG1hbGZvcm1lZCBwYWNrZXQsIGRyb3AgaXQgKi8KLQlpZiAobmZ0X3NldF9wa3RpbmZvX2lwdjYoJnBrdCwgc2tiLCBzdGF0ZSkgPCAwKQotCQlyZXR1cm4gTkZfRFJPUDsKKwluZnRfc2V0X3BrdGluZm9faXB2NigmcGt0LCBza2IsIHN0YXRlKTsKIAogCS8qIHNhdmUgc291cmNlL2Rlc3QgYWRkcmVzcywgbWFyaywgaG9wbGltaXQsIGZsb3dsYWJlbCwgcHJpb3JpdHkgKi8KIAltZW1jcHkoJnNhZGRyLCAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsIHNpemVvZihzYWRkcikpOwpAQCAtNDYsMTMgKzQ1LDE2IEBACiAJZmxvd2xhYmVsID0gKigodTMyICopaXB2Nl9oZHIoc2tiKSk7CiAKIAlyZXQgPSBuZnRfZG9fY2hhaW4oJnBrdCwgcHJpdik7Ci0JaWYgKHJldCAhPSBORl9EUk9QICYmIHJldCAhPSBORl9RVUVVRSAmJgorCWlmIChyZXQgIT0gTkZfRFJPUCAmJiByZXQgIT0gTkZfU1RPTEVOICYmCiAJICAgIChtZW1jbXAoJmlwdjZfaGRyKHNrYiktPnNhZGRyLCAmc2FkZHIsIHNpemVvZihzYWRkcikpIHx8CiAJICAgICBtZW1jbXAoJmlwdjZfaGRyKHNrYiktPmRhZGRyLCAmZGFkZHIsIHNpemVvZihkYWRkcikpIHx8CiAJICAgICBza2ItPm1hcmsgIT0gbWFyayB8fAogCSAgICAgaXB2Nl9oZHIoc2tiKS0+aG9wX2xpbWl0ICE9IGhvcF9saW1pdCB8fAotCSAgICAgZmxvd2xhYmVsICE9ICooKHVfaW50MzJfdCAqKWlwdjZfaGRyKHNrYikpKSkKLQkJcmV0dXJuIGlwNl9yb3V0ZV9tZV9oYXJkZXIoc3RhdGUtPm5ldCwgc2tiKSA9PSAwID8gcmV0IDogTkZfRFJPUDsKKwkgICAgIGZsb3dsYWJlbCAhPSAqKCh1X2ludDMyX3QgKilpcHY2X2hkcihza2IpKSkpIHsKKwkJZXJyID0gaXA2X3JvdXRlX21lX2hhcmRlcihzdGF0ZS0+bmV0LCBza2IpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldCA9IE5GX0RST1BfRVJSKGVycik7CisJfQogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9uZnRfcmVqZWN0X2lwdjYuYyBiL25ldC9pcHY2L25ldGZpbHRlci9uZnRfcmVqZWN0X2lwdjYuYwppbmRleCA1MzNjZDU3Li45MmJkYTk5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZ0X3JlamVjdF9pcHY2LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mdF9yZWplY3RfaXB2Ni5jCkBAIC00Nyw2ICs0Nyw3IEBACiAJLmV2YWwJCT0gbmZ0X3JlamVjdF9pcHY2X2V2YWwsCiAJLmluaXQJCT0gbmZ0X3JlamVjdF9pbml0LAogCS5kdW1wCQk9IG5mdF9yZWplY3RfZHVtcCwKKwkudmFsaWRhdGUJPSBuZnRfcmVqZWN0X3ZhbGlkYXRlLAogfTsKIAogc3RhdGljIHN0cnVjdCBuZnRfZXhwcl90eXBlIG5mdF9yZWplY3RfaXB2Nl90eXBlIF9fcmVhZF9tb3N0bHkgPSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9vdXRwdXRfY29yZS5jIGIvbmV0L2lwdjYvb3V0cHV0X2NvcmUuYwppbmRleCA0NjJmMmE3NmIuLjdjY2E4YWMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L291dHB1dF9jb3JlLmMKKysrIGIvbmV0L2lwdjYvb3V0cHV0X2NvcmUuYwpAQCAtMTQ4LDYgKzE0OCwxMyBAQAogCWlwdjZfaGRyKHNrYiktPnBheWxvYWRfbGVuID0gaHRvbnMobGVuKTsKIAlJUDZDQihza2IpLT5uaG9mZiA9IG9mZnNldG9mKHN0cnVjdCBpcHY2aGRyLCBuZXh0aGRyKTsKIAorCS8qIGlmIGVncmVzcyBkZXZpY2UgaXMgZW5zbGF2ZWQgdG8gYW4gTDMgbWFzdGVyIGRldmljZSBwYXNzIHRoZQorCSAqIHNrYiB0byBpdHMgaGFuZGxlciBmb3IgcHJvY2Vzc2luZworCSAqLworCXNrYiA9IGwzbWRldl9pcDZfb3V0KHNrLCBza2IpOworCWlmICh1bmxpa2VseSghc2tiKSkKKwkJcmV0dXJuIDA7CisKIAlyZXR1cm4gbmZfaG9vayhORlBST1RPX0lQVjYsIE5GX0lORVRfTE9DQUxfT1VULAogCQkgICAgICAgbmV0LCBzaywgc2tiLCBOVUxMLCBza2JfZHN0KHNrYiktPmRldiwKIAkJICAgICAgIGRzdF9vdXRwdXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvcGluZy5jIGIvbmV0L2lwdjYvcGluZy5jCmluZGV4IGZlZDQwZDEuLjBlOTgzYjYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3BpbmcuYworKysgYi9uZXQvaXB2Ni9waW5nLmMKQEAgLTU1LDcgKzU1LDcgQEAKIAlzdHJ1Y3QgaWNtcDZoZHIgdXNlcl9pY21waDsKIAlpbnQgYWRkcl90eXBlOwogCXN0cnVjdCBpbjZfYWRkciAqZGFkZHI7Ci0JaW50IGlpZiA9IDA7CisJaW50IG9pZiA9IDA7CiAJc3RydWN0IGZsb3dpNiBmbDY7CiAJaW50IGVycjsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CkBAIC03OCwyNSArNzgsMzAgQEAKIAkJaWYgKHUtPnNpbjZfZmFtaWx5ICE9IEFGX0lORVQ2KSB7CiAJCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKIAkJfQotCQlpZiAoc2stPnNrX2JvdW5kX2Rldl9pZiAmJgotCQkgICAgc2stPnNrX2JvdW5kX2Rldl9pZiAhPSB1LT5zaW42X3Njb3BlX2lkKSB7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQogCQlkYWRkciA9ICYodS0+c2luNl9hZGRyKTsKLQkJaWlmID0gdS0+c2luNl9zY29wZV9pZDsKKwkJaWYgKF9faXB2Nl9hZGRyX25lZWRzX3Njb3BlX2lkKGlwdjZfYWRkcl90eXBlKGRhZGRyKSkpCisJCQlvaWYgPSB1LT5zaW42X3Njb3BlX2lkOwogCX0gZWxzZSB7CiAJCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0VTVEFCTElTSEVEKQogCQkJcmV0dXJuIC1FREVTVEFERFJSRVE7CiAJCWRhZGRyID0gJnNrLT5za192Nl9kYWRkcjsKIAl9CiAKLQlpZiAoIWlpZikKLQkJaWlmID0gc2stPnNrX2JvdW5kX2Rldl9pZjsKKwlpZiAoIW9pZikKKwkJb2lmID0gc2stPnNrX2JvdW5kX2Rldl9pZjsKKworCWlmICghb2lmKQorCQlvaWYgPSBucC0+c3RpY2t5X3BrdGluZm8uaXBpNl9pZmluZGV4OworCisJaWYgKCFvaWYgJiYgaXB2Nl9hZGRyX2lzX211bHRpY2FzdChkYWRkcikpCisJCW9pZiA9IG5wLT5tY2FzdF9vaWY7CisJZWxzZSBpZiAoIW9pZikKKwkJb2lmID0gbnAtPnVjYXN0X29pZjsKIAogCWFkZHJfdHlwZSA9IGlwdjZfYWRkcl90eXBlKGRhZGRyKTsKLQlpZiAoX19pcHY2X2FkZHJfbmVlZHNfc2NvcGVfaWQoYWRkcl90eXBlKSAmJiAhaWlmKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoYWRkcl90eXBlICYgSVBWNl9BRERSX01BUFBFRCkKKwlpZiAoKF9faXB2Nl9hZGRyX25lZWRzX3Njb3BlX2lkKGFkZHJfdHlwZSkgJiYgIW9pZikgfHwKKwkgICAgKGFkZHJfdHlwZSAmIElQVjZfQUREUl9NQVBQRUQpIHx8CisJICAgIChvaWYgJiYgc2stPnNrX2JvdW5kX2Rldl9pZiAmJiBvaWYgIT0gc2stPnNrX2JvdW5kX2Rldl9pZikpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogVE9ETzogdXNlIGlwNl9kYXRhZ3JhbV9zZW5kX2N0bCB0byBnZXQgb3B0aW9ucyBmcm9tIGNtc2cgKi8KQEAgLTEwNiwxNiArMTExLDEyIEBACiAJZmw2LmZsb3dpNl9wcm90byA9IElQUFJPVE9fSUNNUFY2OwogCWZsNi5zYWRkciA9IG5wLT5zYWRkcjsKIAlmbDYuZGFkZHIgPSAqZGFkZHI7CisJZmw2LmZsb3dpNl9vaWYgPSBvaWY7CiAJZmw2LmZsb3dpNl9tYXJrID0gc2stPnNrX21hcms7CiAJZmw2LmZsNl9pY21wX3R5cGUgPSB1c2VyX2ljbXBoLmljbXA2X3R5cGU7CiAJZmw2LmZsNl9pY21wX2NvZGUgPSB1c2VyX2ljbXBoLmljbXA2X2NvZGU7CiAJc2VjdXJpdHlfc2tfY2xhc3NpZnlfZmxvdyhzaywgZmxvd2k2X3RvX2Zsb3dpKCZmbDYpKTsKIAotCWlmICghZmw2LmZsb3dpNl9vaWYgJiYgaXB2Nl9hZGRyX2lzX211bHRpY2FzdCgmZmw2LmRhZGRyKSkKLQkJZmw2LmZsb3dpNl9vaWYgPSBucC0+bWNhc3Rfb2lmOwotCWVsc2UgaWYgKCFmbDYuZmxvd2k2X29pZikKLQkJZmw2LmZsb3dpNl9vaWYgPSBucC0+dWNhc3Rfb2lmOwotCiAJaXBjNi50Y2xhc3MgPSBucC0+dGNsYXNzOwogCWZsNi5mbG93bGFiZWwgPSBpcDZfbWFrZV9mbG93aW5mbyhpcGM2LnRjbGFzcywgZmw2LmZsb3dsYWJlbCk7CiAKQEAgLTEyNSw4ICsxMjYsMTAgQEAKIAlydCA9IChzdHJ1Y3QgcnQ2X2luZm8gKikgZHN0OwogCiAJbnAgPSBpbmV0Nl9zayhzayk7Ci0JaWYgKCFucCkKLQkJcmV0dXJuIC1FQkFERjsKKwlpZiAoIW5wKSB7CisJCWVyciA9IC1FQkFERjsKKwkJZ290byBkc3RfZXJyX291dDsKKwl9CiAKIAlpZiAoIWZsNi5mbG93aTZfb2lmICYmIGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJmZsNi5kYWRkcikpCiAJCWZsNi5mbG93aTZfb2lmID0gbnAtPm1jYXN0X29pZjsKQEAgLTE2Miw2ICsxNjUsOSBAQAogCX0KIAlyZWxlYXNlX3NvY2soc2spOwogCitkc3RfZXJyX291dDoKKwlkc3RfcmVsZWFzZShkc3QpOworCiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvcHJvYy5jIGIvbmV0L2lwdjYvcHJvYy5jCmluZGV4IDY3OTI1M2QwLi5jYzhlM2FlIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9wcm9jLmMKKysrIGIvbmV0L2lwdjYvcHJvYy5jCkBAIC0zMCw2ICszMCwxMSBAQAogI2luY2x1ZGUgPG5ldC90cmFuc3BfdjYuaD4KICNpbmNsdWRlIDxuZXQvaXB2Ni5oPgogCisjZGVmaW5lIE1BWDQoYSwgYiwgYywgZCkgXAorCW1heF90KHUzMiwgbWF4X3QodTMyLCBhLCBiKSwgbWF4X3QodTMyLCBjLCBkKSkKKyNkZWZpbmUgU05NUF9NSUJfTUFYIE1BWDQoVURQX01JQl9NQVgsIFRDUF9NSUJfTUFYLCBcCisJCQlJUFNUQVRTX01JQl9NQVgsIElDTVBfTUlCX01BWCkKKwogc3RhdGljIGludCBzb2Nrc3RhdDZfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiB7CiAJc3RydWN0IG5ldCAqbmV0ID0gc2VxLT5wcml2YXRlOwpAQCAtMTkxLDI1ICsxOTYsMzQgQEAKIAkJCQlhdG9taWNfbG9uZ190ICpzbWliLAogCQkJCWNvbnN0IHN0cnVjdCBzbm1wX21pYiAqaXRlbWxpc3QpCiB7CisJdW5zaWduZWQgbG9uZyBidWZmW1NOTVBfTUlCX01BWF07CiAJaW50IGk7Ci0JdW5zaWduZWQgbG9uZyB2YWw7CiAKLQlmb3IgKGkgPSAwOyBpdGVtbGlzdFtpXS5uYW1lOyBpKyspIHsKLQkJdmFsID0gcGNwdW1pYiA/Ci0JCQlzbm1wX2ZvbGRfZmllbGQocGNwdW1pYiwgaXRlbWxpc3RbaV0uZW50cnkpIDoKLQkJCWF0b21pY19sb25nX3JlYWQoc21pYiArIGl0ZW1saXN0W2ldLmVudHJ5KTsKLQkJc2VxX3ByaW50ZihzZXEsICIlLTMyc1x0JWx1XG4iLCBpdGVtbGlzdFtpXS5uYW1lLCB2YWwpOworCWlmIChwY3B1bWliKSB7CisJCW1lbXNldChidWZmLCAwLCBzaXplb2YodW5zaWduZWQgbG9uZykgKiBTTk1QX01JQl9NQVgpOworCisJCXNubXBfZ2V0X2NwdV9maWVsZF9iYXRjaChidWZmLCBpdGVtbGlzdCwgcGNwdW1pYik7CisJCWZvciAoaSA9IDA7IGl0ZW1saXN0W2ldLm5hbWU7IGkrKykKKwkJCXNlcV9wcmludGYoc2VxLCAiJS0zMnNcdCVsdVxuIiwKKwkJCQkgICBpdGVtbGlzdFtpXS5uYW1lLCBidWZmW2ldKTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpdGVtbGlzdFtpXS5uYW1lOyBpKyspCisJCQlzZXFfcHJpbnRmKHNlcSwgIiUtMzJzXHQlbHVcbiIsIGl0ZW1saXN0W2ldLm5hbWUsCisJCQkJICAgYXRvbWljX2xvbmdfcmVhZChzbWliICsgaXRlbWxpc3RbaV0uZW50cnkpKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIHNubXA2X3NlcV9zaG93X2l0ZW02NChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCBfX3BlcmNwdSAqbWliLAogCQkJCSAgY29uc3Qgc3RydWN0IHNubXBfbWliICppdGVtbGlzdCwgc2l6ZV90IHN5bmNwb2ZmKQogeworCXU2NCBidWZmNjRbU05NUF9NSUJfTUFYXTsKIAlpbnQgaTsKIAorCW1lbXNldChidWZmNjQsIDAsIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIFNOTVBfTUlCX01BWCk7CisKKwlzbm1wX2dldF9jcHVfZmllbGQ2NF9iYXRjaChidWZmNjQsIGl0ZW1saXN0LCBtaWIsIHN5bmNwb2ZmKTsKIAlmb3IgKGkgPSAwOyBpdGVtbGlzdFtpXS5uYW1lOyBpKyspCi0JCXNlcV9wcmludGYoc2VxLCAiJS0zMnNcdCVsbHVcbiIsIGl0ZW1saXN0W2ldLm5hbWUsCi0JCQkgICBzbm1wX2ZvbGRfZmllbGQ2NChtaWIsIGl0ZW1saXN0W2ldLmVudHJ5LCBzeW5jcG9mZikpOworCQlzZXFfcHJpbnRmKHNlcSwgIiUtMzJzXHQlbGx1XG4iLCBpdGVtbGlzdFtpXS5uYW1lLCBidWZmNjRbaV0pOwogfQogCiBzdGF0aWMgaW50IHNubXA2X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvcmF3LmMgYi9uZXQvaXB2Ni9yYXcuYwppbmRleCA1OTBkZDFmLi41NDQwNGYwIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9yYXcuYworKysgYi9uZXQvaXB2Ni9yYXcuYwpAQCAtNjUzLDYgKzY1MywxMyBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXJyb3JfZmF1bHQ7CiAKKwkvKiBpZiBlZ3Jlc3MgZGV2aWNlIGlzIGVuc2xhdmVkIHRvIGFuIEwzIG1hc3RlciBkZXZpY2UgcGFzcyB0aGUKKwkgKiBza2IgdG8gaXRzIGhhbmRsZXIgZm9yIHByb2Nlc3NpbmcKKwkgKi8KKwlza2IgPSBsM21kZXZfaXA2X291dChzaywgc2tiKTsKKwlpZiAodW5saWtlbHkoIXNrYikpCisJCXJldHVybiAwOworCiAJSVA2X1VQRF9QT19TVEFUUyhuZXQsIHJ0LT5ydDZpX2lkZXYsIElQU1RBVFNfTUlCX09VVCwgc2tiLT5sZW4pOwogCWVyciA9IE5GX0hPT0soTkZQUk9UT19JUFY2LCBORl9JTkVUX0xPQ0FMX09VVCwgbmV0LCBzaywgc2tiLAogCQkgICAgICBOVUxMLCBydC0+ZHN0LmRldiwgZHN0X291dHB1dCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9yb3V0ZS5jIGIvbmV0L2lwdjYvcm91dGUuYwppbmRleCA0OTgxNzU1Li5iZGJjMzhlIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9yb3V0ZS5jCisrKyBiL25ldC9pcHY2L3JvdXRlLmMKQEAgLTExNDcsMTUgKzExNDcsMTYgQEAKIAlyZXR1cm4gaXA2X3BvbF9yb3V0ZShuZXQsIHRhYmxlLCBmbDYtPmZsb3dpNl9paWYsIGZsNiwgZmxhZ3MpOwogfQogCi1zdGF0aWMgc3RydWN0IGRzdF9lbnRyeSAqaXA2X3JvdXRlX2lucHV0X2xvb2t1cChzdHJ1Y3QgbmV0ICpuZXQsCi0JCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkJc3RydWN0IGZsb3dpNiAqZmw2LCBpbnQgZmxhZ3MpCitzdHJ1Y3QgZHN0X2VudHJ5ICppcDZfcm91dGVfaW5wdXRfbG9va3VwKHN0cnVjdCBuZXQgKm5ldCwKKwkJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZmxvd2k2ICpmbDYsIGludCBmbGFncykKIHsKIAlpZiAocnQ2X25lZWRfc3RyaWN0KCZmbDYtPmRhZGRyKSAmJiBkZXYtPnR5cGUgIT0gQVJQSFJEX1BJTVJFRykKIAkJZmxhZ3MgfD0gUlQ2X0xPT0tVUF9GX0lGQUNFOwogCiAJcmV0dXJuIGZpYjZfcnVsZV9sb29rdXAobmV0LCBmbDYsIGZsYWdzLCBpcDZfcG9sX3JvdXRlX2lucHV0KTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGlwNl9yb3V0ZV9pbnB1dF9sb29rdXApOwogCiB2b2lkIGlwNl9yb3V0ZV9pbnB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtMTE2NCw3ICsxMTY1LDcgQEAKIAlpbnQgZmxhZ3MgPSBSVDZfTE9PS1VQX0ZfSEFTX1NBRERSOwogCXN0cnVjdCBpcF90dW5uZWxfaW5mbyAqdHVuX2luZm87CiAJc3RydWN0IGZsb3dpNiBmbDYgPSB7Ci0JCS5mbG93aTZfaWlmID0gbDNtZGV2X2ZpYl9vaWYoc2tiLT5kZXYpLAorCQkuZmxvd2k2X2lpZiA9IHNrYi0+ZGV2LT5pZmluZGV4LAogCQkuZGFkZHIgPSBpcGgtPmRhZGRyLAogCQkuc2FkZHIgPSBpcGgtPnNhZGRyLAogCQkuZmxvd2xhYmVsID0gaXA2X2Zsb3dpbmZvKGlwaCksCkBAIC0xMTg4LDEyICsxMTg5LDE1IEBACiBzdHJ1Y3QgZHN0X2VudHJ5ICppcDZfcm91dGVfb3V0cHV0X2ZsYWdzKHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IHNvY2sgKnNrLAogCQkJCQkgc3RydWN0IGZsb3dpNiAqZmw2LCBpbnQgZmxhZ3MpCiB7Ci0Jc3RydWN0IGRzdF9lbnRyeSAqZHN0OwogCWJvb2wgYW55X3NyYzsKIAotCWRzdCA9IGwzbWRldl9nZXRfcnQ2X2RzdChuZXQsIGZsNik7Ci0JaWYgKGRzdCkKLQkJcmV0dXJuIGRzdDsKKwlpZiAocnQ2X25lZWRfc3RyaWN0KCZmbDYtPmRhZGRyKSkgeworCQlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CisKKwkJZHN0ID0gbDNtZGV2X2xpbmtfc2NvcGVfbG9va3VwKG5ldCwgZmw2KTsKKwkJaWYgKGRzdCkKKwkJCXJldHVybiBkc3Q7CisJfQogCiAJZmw2LT5mbG93aTZfaWlmID0gTE9PUEJBQ0tfSUZJTkRFWDsKIApAQCAtMTYwNCw3ICsxNjA4LDkgQEAKIAlyY3VfcmVhZF91bmxvY2soKTsKIAogb3V0OgotCXJldHVybiBtaW5fdCh1bnNpZ25lZCBpbnQsIG10dSwgSVA2X01BWF9NVFUpOworCW10dSA9IG1pbl90KHVuc2lnbmVkIGludCwgbXR1LCBJUDZfTUFYX01UVSk7CisKKwlyZXR1cm4gbXR1IC0gbHd0dW5uZWxfaGVhZHJvb20oZHN0LT5sd3RzdGF0ZSwgbXR1KTsKIH0KIAogc3RhdGljIHN0cnVjdCBkc3RfZW50cnkgKmljbXA2X2RzdF9nY19saXN0OwpAQCAtMTk4Niw5ICsxOTkyLDE4IEBACiAJCQlpZiAoIShnd2FfdHlwZSAmIElQVjZfQUREUl9VTklDQVNUKSkKIAkJCQlnb3RvIG91dDsKIAotCQkJaWYgKGNmZy0+ZmNfdGFibGUpCisJCQlpZiAoY2ZnLT5mY190YWJsZSkgewogCQkJCWdydCA9IGlwNl9uaF9sb29rdXBfdGFibGUobmV0LCBjZmcsIGd3X2FkZHIpOwogCisJCQkJaWYgKGdydCkgeworCQkJCQlpZiAoZ3J0LT5ydDZpX2ZsYWdzICYgUlRGX0dBVEVXQVkgfHwKKwkJCQkJICAgIChkZXYgJiYgZGV2ICE9IGdydC0+ZHN0LmRldikpIHsKKwkJCQkJCWlwNl9ydF9wdXQoZ3J0KTsKKwkJCQkJCWdydCA9IE5VTEw7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKIAkJCWlmICghZ3J0KQogCQkJCWdydCA9IHJ0Nl9sb29rdXAobmV0LCBnd19hZGRyLCBOVUxMLAogCQkJCQkJIGNmZy0+ZmNfaWZpbmRleCwgMSk7CkBAIC0yNTU2LDggKzI1NzEsMTYgQEAKIHsKIAl1MzIgdGJfaWQ7CiAJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChpZGV2LT5kZXYpOwotCXN0cnVjdCBydDZfaW5mbyAqcnQgPSBpcDZfZHN0X2FsbG9jKG5ldCwgbmV0LT5sb29wYmFja19kZXYsCi0JCQkJCSAgICBEU1RfTk9DT1VOVCk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5ldC0+bG9vcGJhY2tfZGV2OworCXN0cnVjdCBydDZfaW5mbyAqcnQ7CisKKwkvKiB1c2UgTDMgTWFzdGVyIGRldmljZSBhcyBsb29wYmFjayBmb3IgaG9zdCByb3V0ZXMgaWYgZGV2aWNlCisJICogaXMgZW5zbGF2ZWQgYW5kIGFkZHJlc3MgaXMgbm90IGxpbmsgbG9jYWwgb3IgbXVsdGljYXN0CisJICovCisJaWYgKCFydDZfbmVlZF9zdHJpY3QoYWRkcikpCisJCWRldiA9IGwzbWRldl9tYXN0ZXJfZGV2X3JjdShpZGV2LT5kZXYpID8gOiBkZXY7CisKKwlydCA9IGlwNl9kc3RfYWxsb2MobmV0LCBkZXYsIERTVF9OT0NPVU5UKTsKIAlpZiAoIXJ0KQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIApAQCAtMzE5Myw3ICszMjE2LDkgQEAKIAlpZiAoaWlmKSB7CiAjaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFCiAJCWlmIChpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZydC0+cnQ2aV9kc3QuYWRkcikpIHsKLQkJCWludCBlcnIgPSBpcDZtcl9nZXRfcm91dGUobmV0LCBza2IsIHJ0bSwgbm93YWl0KTsKKwkJCWludCBlcnIgPSBpcDZtcl9nZXRfcm91dGUobmV0LCBza2IsIHJ0bSwgbm93YWl0LAorCQkJCQkJICBwb3J0aWQpOworCiAJCQlpZiAoZXJyIDw9IDApIHsKIAkJCQlpZiAoIW5vd2FpdCkgewogCQkJCQlpZiAoZXJyID09IDApCkBAIC0zMzM2LDExICszMzYxLDYgQEAKIAl9IGVsc2UgewogCQlmbDYuZmxvd2k2X29pZiA9IG9pZjsKIAotCQlpZiAobmV0aWZfaW5kZXhfaXNfbDNfbWFzdGVyKG5ldCwgb2lmKSkgewotCQkJZmw2LmZsb3dpNl9mbGFncyA9IEZMT1dJX0ZMQUdfTDNNREVWX1NSQyB8Ci0JCQkJCSAgIEZMT1dJX0ZMQUdfU0tJUF9OSF9PSUY7Ci0JCX0KLQogCQlydCA9IChzdHJ1Y3QgcnQ2X2luZm8gKilpcDZfcm91dGVfb3V0cHV0KG5ldCwgTlVMTCwgJmZsNik7CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9zaXQuYyBiL25ldC9pcHY2L3NpdC5jCmluZGV4IDE4MmI2YTkuLmIxY2RmODAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3NpdC5jCisrKyBiL25ldC9pcHY2L3NpdC5jCkBAIC02Miw3ICs2Miw3IEBACiAgICBGb3IgY29tbWVudHMgbG9vayBhdCBuZXQvaXB2NC9pcF9ncmUuYyAtLUFOSwogICovCiAKLSNkZWZpbmUgSEFTSF9TSVpFICAxNgorI2RlZmluZSBJUDZfU0lUX0hBU0hfU0laRSAgMTYKICNkZWZpbmUgSEFTSChhZGRyKSAoKChfX2ZvcmNlIHUzMilhZGRyXigoX19mb3JjZSB1MzIpYWRkcj4+NCkpJjB4RikKIAogc3RhdGljIGJvb2wgbG9nX2Vjbl9lcnJvciA9IHRydWU7CkBAIC03OCw5ICs3OCw5IEBACiAKIHN0YXRpYyBpbnQgc2l0X25ldF9pZCBfX3JlYWRfbW9zdGx5Owogc3RydWN0IHNpdF9uZXQgewotCXN0cnVjdCBpcF90dW5uZWwgX19yY3UgKnR1bm5lbHNfcl9sW0hBU0hfU0laRV07Ci0Jc3RydWN0IGlwX3R1bm5lbCBfX3JjdSAqdHVubmVsc19yW0hBU0hfU0laRV07Ci0Jc3RydWN0IGlwX3R1bm5lbCBfX3JjdSAqdHVubmVsc19sW0hBU0hfU0laRV07CisJc3RydWN0IGlwX3R1bm5lbCBfX3JjdSAqdHVubmVsc19yX2xbSVA2X1NJVF9IQVNIX1NJWkVdOworCXN0cnVjdCBpcF90dW5uZWwgX19yY3UgKnR1bm5lbHNfcltJUDZfU0lUX0hBU0hfU0laRV07CisJc3RydWN0IGlwX3R1bm5lbCBfX3JjdSAqdHVubmVsc19sW0lQNl9TSVRfSEFTSF9TSVpFXTsKIAlzdHJ1Y3QgaXBfdHVubmVsIF9fcmN1ICp0dW5uZWxzX3djWzFdOwogCXN0cnVjdCBpcF90dW5uZWwgX19yY3UgKip0dW5uZWxzWzRdOwogCkBAIC0xMTI2LDcgKzExMjYsNyBAQAogfQogI2VuZGlmCiAKLWJvb2wgaXBpcDZfdmFsaWRfaXBfcHJvdG8odTggaXBwcm90bykKK3N0YXRpYyBib29sIGlwaXA2X3ZhbGlkX2lwX3Byb3RvKHU4IGlwcHJvdG8pCiB7CiAJcmV0dXJuIGlwcHJvdG8gPT0gSVBQUk9UT19JUFY2IHx8CiAJCWlwcHJvdG8gPT0gSVBQUk9UT19JUElQIHx8CkBAIC0xNzgzLDcgKzE3ODMsNyBAQAogCiAJZm9yIChwcmlvID0gMTsgcHJpbyA8IDQ7IHByaW8rKykgewogCQlpbnQgaDsKLQkJZm9yIChoID0gMDsgaCA8IEhBU0hfU0laRTsgaCsrKSB7CisJCWZvciAoaCA9IDA7IGggPCBJUDZfU0lUX0hBU0hfU0laRTsgaCsrKSB7CiAJCQlzdHJ1Y3QgaXBfdHVubmVsICp0OwogCiAJCQl0ID0gcnRubF9kZXJlZmVyZW5jZShzaXRuLT50dW5uZWxzW3ByaW9dW2hdKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3RjcF9pcHY2LmMgYi9uZXQvaXB2Ni90Y3BfaXB2Ni5jCmluZGV4IDMzZGY4YjguLjU0Y2Y3MTkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3RjcF9pcHY2LmMKKysrIGIvbmV0L2lwdjYvdGNwX2lwdjYuYwpAQCAtNjcxLDYgKzY3MSw3IEBACiAJCQkJICAgICAgTlVMTCwgc2tiKTsKIAogCWlmIChnZW5oYXNoIHx8IG1lbWNtcChoYXNoX2xvY2F0aW9uLCBuZXdoYXNoLCAxNikgIT0gMCkgeworCQlORVRfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX1RDUE1ENUZBSUxVUkUpOwogCQluZXRfaW5mb19yYXRlbGltaXRlZCgiTUQ1IEhhc2ggJXMgZm9yIFslcEk2Y106JXUtPlslcEk2Y106JXVcbiIsCiAJCQkJICAgICBnZW5oYXNoID8gImZhaWxlZCIgOiAibWlzbWF0Y2giLAogCQkJCSAgICAgJmlwNmgtPnNhZGRyLCBudG9ocyh0aC0+c291cmNlKSwKQEAgLTgxNywxMiArODE4LDggQEAKIAlmbDYuZmxvd2k2X3Byb3RvID0gSVBQUk9UT19UQ1A7CiAJaWYgKHJ0Nl9uZWVkX3N0cmljdCgmZmw2LmRhZGRyKSAmJiAhb2lmKQogCQlmbDYuZmxvd2k2X29pZiA9IHRjcF92Nl9paWYoc2tiKTsKLQllbHNlIHsKLQkJaWYgKCFvaWYgJiYgbmV0aWZfaW5kZXhfaXNfbDNfbWFzdGVyKG5ldCwgc2tiLT5za2JfaWlmKSkKLQkJCW9pZiA9IHNrYi0+c2tiX2lpZjsKLQotCQlmbDYuZmxvd2k2X29pZiA9IG9pZjsKLQl9CisJZWxzZQorCQlmbDYuZmxvd2k2X29pZiA9IG9pZiA/IDogc2tiLT5za2JfaWlmOwogCiAJZmw2LmZsb3dpNl9tYXJrID0gSVA2X1JFUExZX01BUksobmV0LCBza2ItPm1hcmspOwogCWZsNi5mbDZfZHBvcnQgPSB0MS0+ZGVzdDsKQEAgLTk0NCw5ICs5NDEsMTUgQEAKIAkvKiBzay0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTiAtPiBmb3IgcmVndWxhciBUQ1BfU1lOX1JFQ1YKIAkgKiBzay0+c2tfc3RhdGUgPT0gVENQX1NZTl9SRUNWIC0+IGZvciBGYXN0IE9wZW4uCiAJICovCisJLyogUkZDIDczMjMgMi4zCisJICogVGhlIHdpbmRvdyBmaWVsZCAoU0VHLldORCkgb2YgZXZlcnkgb3V0Z29pbmcgc2VnbWVudCwgd2l0aCB0aGUKKwkgKiBleGNlcHRpb24gb2YgPFNZTj4gc2VnbWVudHMsIE1VU1QgYmUgcmlnaHQtc2hpZnRlZCBieQorCSAqIFJjdi5XaW5kLlNoaWZ0IGJpdHM6CisJICovCiAJdGNwX3Y2X3NlbmRfYWNrKHNrLCBza2IsIChzay0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTikgPwogCQkJdGNwX3JzayhyZXEpLT5zbnRfaXNuICsgMSA6IHRjcF9zayhzayktPnNuZF9ueHQsCi0JCQl0Y3BfcnNrKHJlcSktPnJjdl9ueHQsIHJlcS0+cnNrX3Jjdl93bmQsCisJCQl0Y3BfcnNrKHJlcSktPnJjdl9ueHQsCisJCQlyZXEtPnJza19yY3Zfd25kID4+IGluZXRfcnNrKHJlcSktPnJjdl93c2NhbGUsCiAJCQl0Y3BfdGltZV9zdGFtcCwgcmVxLT50c19yZWNlbnQsIHNrLT5za19ib3VuZF9kZXZfaWYsCiAJCQl0Y3BfdjZfbWQ1X2RvX2xvb2t1cChzaywgJmlwdjZfaGRyKHNrYiktPmRhZGRyKSwKIAkJCTAsIDApOwpAQCAtMTQwOSw2ICsxNDEyLDcgQEAKIAkJc2sgPSByZXEtPnJza19saXN0ZW5lcjsKIAkJdGNwX3Y2X2ZpbGxfY2Ioc2tiLCBoZHIsIHRoKTsKIAkJaWYgKHRjcF92Nl9pbmJvdW5kX21kNV9oYXNoKHNrLCBza2IpKSB7CisJCQlza19kcm9wc19hZGQoc2ssIHNrYik7CiAJCQlyZXFza19wdXQocmVxKTsKIAkJCWdvdG8gZGlzY2FyZF9pdDsKIAkJfQpAQCAtMTQ2NSwxMCArMTQ2OSw3IEBACiAJaWYgKCFzb2NrX293bmVkX2J5X3VzZXIoc2spKSB7CiAJCWlmICghdGNwX3ByZXF1ZXVlKHNrLCBza2IpKQogCQkJcmV0ID0gdGNwX3Y2X2RvX3Jjdihzaywgc2tiKTsKLQl9IGVsc2UgaWYgKHVubGlrZWx5KHNrX2FkZF9iYWNrbG9nKHNrLCBza2IsCi0JCQkJCSAgIHNrLT5za19yY3ZidWYgKyBzay0+c2tfc25kYnVmKSkpIHsKLQkJYmhfdW5sb2NrX3NvY2soc2spOwotCQlfX05FVF9JTkNfU1RBVFMobmV0LCBMSU5VWF9NSUJfVENQQkFDS0xPR0RST1ApOworCX0gZWxzZSBpZiAodGNwX2FkZF9iYWNrbG9nKHNrLCBza2IpKSB7CiAJCWdvdG8gZGlzY2FyZF9hbmRfcmVsc2U7CiAJfQogCWJoX3VubG9ja19zb2NrKHNrKTsKQEAgLTE4NjIsMTcgKzE4NjMsNiBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIHRjcF92Nl9jbGVhcl9zayhzdHJ1Y3Qgc29jayAqc2ssIGludCBzaXplKQotewotCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKLQotCS8qIHdlIGRvIG5vdCB3YW50IHRvIGNsZWFyIHBpbmV0NiBmaWVsZCwgYmVjYXVzZSBvZiBSQ1UgbG9va3VwcyAqLwotCXNrX3Byb3RfY2xlYXJfbnVsbHMoc2ssIG9mZnNldG9mKHN0cnVjdCBpbmV0X3NvY2ssIHBpbmV0NikpOwotCi0Jc2l6ZSAtPSBvZmZzZXRvZihzdHJ1Y3QgaW5ldF9zb2NrLCBwaW5ldDYpICsgc2l6ZW9mKGluZXQtPnBpbmV0Nik7Ci0JbWVtc2V0KCZpbmV0LT5waW5ldDYgKyAxLCAwLCBzaXplKTsKLX0KLQogc3RydWN0IHByb3RvIHRjcHY2X3Byb3QgPSB7CiAJLm5hbWUJCQk9ICJUQ1B2NiIsCiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKQEAgLTE5MTQsNyArMTkwNCw2IEBACiAJLmNvbXBhdF9zZXRzb2Nrb3B0CT0gY29tcGF0X3RjcF9zZXRzb2Nrb3B0LAogCS5jb21wYXRfZ2V0c29ja29wdAk9IGNvbXBhdF90Y3BfZ2V0c29ja29wdCwKICNlbmRpZgotCS5jbGVhcl9zawkJPSB0Y3BfdjZfY2xlYXJfc2ssCiAJLmRpYWdfZGVzdHJveQkJPSB0Y3BfYWJvcnQsCiB9OwogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni91ZHAuYyBiL25ldC9pcHY2L3VkcC5jCmluZGV4IDgxZTJmOTguLjlhYTdjMWMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3VkcC5jCisrKyBiL25ldC9pcHY2L3VkcC5jCkBAIC0xNDI0LDE3ICsxNDI0LDYgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwogCi12b2lkIHVkcF92Nl9jbGVhcl9zayhzdHJ1Y3Qgc29jayAqc2ssIGludCBzaXplKQotewotCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKLQotCS8qIHdlIGRvIG5vdCB3YW50IHRvIGNsZWFyIHBpbmV0NiBmaWVsZCwgYmVjYXVzZSBvZiBSQ1UgbG9va3VwcyAqLwotCXNrX3Byb3RfY2xlYXJfcG9ydGFkZHJfbnVsbHMoc2ssIG9mZnNldG9mKHN0cnVjdCBpbmV0X3NvY2ssIHBpbmV0NikpOwotCi0Jc2l6ZSAtPSBvZmZzZXRvZihzdHJ1Y3QgaW5ldF9zb2NrLCBwaW5ldDYpICsgc2l6ZW9mKGluZXQtPnBpbmV0Nik7Ci0JbWVtc2V0KCZpbmV0LT5waW5ldDYgKyAxLCAwLCBzaXplKTsKLX0KLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0cnVjdCBwcm90byB1ZHB2Nl9wcm90ID0gewpAQCAtMTQ2MCwxMyArMTQ0OSwxMiBAQAogCS5zeXNjdGxfd21lbQkgICA9ICZzeXNjdGxfdWRwX3dtZW1fbWluLAogCS5zeXNjdGxfcm1lbQkgICA9ICZzeXNjdGxfdWRwX3JtZW1fbWluLAogCS5vYmpfc2l6ZQkgICA9IHNpemVvZihzdHJ1Y3QgdWRwNl9zb2NrKSwKLQkuc2xhYl9mbGFncwkgICA9IFNMQUJfREVTVFJPWV9CWV9SQ1UsCiAJLmgudWRwX3RhYmxlCSAgID0gJnVkcF90YWJsZSwKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAJLmNvbXBhdF9zZXRzb2Nrb3B0ID0gY29tcGF0X3VkcHY2X3NldHNvY2tvcHQsCiAJLmNvbXBhdF9nZXRzb2Nrb3B0ID0gY29tcGF0X3VkcHY2X2dldHNvY2tvcHQsCiAjZW5kaWYKLQkuY2xlYXJfc2sJICAgPSB1ZHBfdjZfY2xlYXJfc2ssCisJLmRpYWdfZGVzdHJveSAgICAgID0gdWRwX2Fib3J0LAogfTsKIAogc3RhdGljIHN0cnVjdCBpbmV0X3Byb3Rvc3cgdWRwdjZfcHJvdG9zdyA9IHsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3VkcF9pbXBsLmggYi9uZXQvaXB2Ni91ZHBfaW1wbC5oCmluZGV4IDA2ODJjMDMuLmY2ZWIxYWIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3VkcF9pbXBsLmgKKysrIGIvbmV0L2lwdjYvdWRwX2ltcGwuaApAQCAtMjksOCArMjksNiBAQAogaW50IHVkcHY2X3F1ZXVlX3Jjdl9za2Ioc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHZvaWQgdWRwdjZfZGVzdHJveV9zb2NrKHN0cnVjdCBzb2NrICpzayk7CiAKLXZvaWQgdWRwX3Y2X2NsZWFyX3NrKHN0cnVjdCBzb2NrICpzaywgaW50IHNpemUpOwotCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIGludCB1ZHA2X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdWRwbGl0ZS5jIGIvbmV0L2lwdjYvdWRwbGl0ZS5jCmluZGV4IDljZjA5N2UuLjQ3ZDBkMmIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3VkcGxpdGUuYworKysgYi9uZXQvaXB2Ni91ZHBsaXRlLmMKQEAgLTUwLDEzICs1MCwxMSBAQAogCS51bmhhc2gJCSAgID0gdWRwX2xpYl91bmhhc2gsCiAJLmdldF9wb3J0CSAgID0gdWRwX3Y2X2dldF9wb3J0LAogCS5vYmpfc2l6ZQkgICA9IHNpemVvZihzdHJ1Y3QgdWRwNl9zb2NrKSwKLQkuc2xhYl9mbGFncwkgICA9IFNMQUJfREVTVFJPWV9CWV9SQ1UsCiAJLmgudWRwX3RhYmxlCSAgID0gJnVkcGxpdGVfdGFibGUsCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCS5jb21wYXRfc2V0c29ja29wdCA9IGNvbXBhdF91ZHB2Nl9zZXRzb2Nrb3B0LAogCS5jb21wYXRfZ2V0c29ja29wdCA9IGNvbXBhdF91ZHB2Nl9nZXRzb2Nrb3B0LAogI2VuZGlmCi0JLmNsZWFyX3NrCSAgID0gdWRwX3Y2X2NsZWFyX3NrLAogfTsKIAogc3RhdGljIHN0cnVjdCBpbmV0X3Byb3Rvc3cgdWRwbGl0ZTZfcHJvdG9zdyA9IHsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3hmcm02X2lucHV0LmMgYi9uZXQvaXB2Ni94ZnJtNl9pbnB1dC5jCmluZGV4IDBlYWFiMWYuLmI1Nzg5NTYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3hmcm02X2lucHV0LmMKKysrIGIvbmV0L2lwdjYveGZybTZfaW5wdXQuYwpAQCAtMjEsOCArMjEsMTAgQEAKIAlyZXR1cm4geGZybTZfZXh0cmFjdF9oZWFkZXIoc2tiKTsKIH0KIAotaW50IHhmcm02X3Jjdl9zcGkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG5leHRoZHIsIF9fYmUzMiBzcGkpCitpbnQgeGZybTZfcmN2X3NwaShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbmV4dGhkciwgX19iZTMyIHNwaSwKKwkJICBzdHJ1Y3QgaXA2X3RubCAqdCkKIHsKKwlYRlJNX1RVTk5FTF9TS0JfQ0Ioc2tiKS0+dHVubmVsLmlwNiA9IHQ7CiAJWEZSTV9TUElfU0tCX0NCKHNrYiktPmZhbWlseSA9IEFGX0lORVQ2OwogCVhGUk1fU1BJX1NLQl9DQihza2IpLT5kYWRkcm9mZiA9IG9mZnNldG9mKHN0cnVjdCBpcHY2aGRyLCBkYWRkcik7CiAJcmV0dXJuIHhmcm1faW5wdXQoc2tiLCBuZXh0aGRyLCBzcGksIDApOwpAQCAtNDgsMTMgKzUwLDE4IEBACiAJcmV0dXJuIC0xOwogfQogCi1pbnQgeGZybTZfcmN2KHN0cnVjdCBza19idWZmICpza2IpCitpbnQgeGZybTZfcmN2X3RubChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXA2X3RubCAqdCkKIHsKIAlyZXR1cm4geGZybTZfcmN2X3NwaShza2IsIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpW0lQNkNCKHNrYiktPm5ob2ZmXSwKLQkJCSAgICAgMCk7CisJCQkgICAgIDAsIHQpOworfQorRVhQT1JUX1NZTUJPTCh4ZnJtNl9yY3ZfdG5sKTsKKworaW50IHhmcm02X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiB4ZnJtNl9yY3ZfdG5sKHNrYiwgTlVMTCk7CiB9CiBFWFBPUlRfU1lNQk9MKHhmcm02X3Jjdik7Ci0KIGludCB4ZnJtNl9pbnB1dF9hZGRyKHN0cnVjdCBza19idWZmICpza2IsIHhmcm1fYWRkcmVzc190ICpkYWRkciwKIAkJICAgICB4ZnJtX2FkZHJlc3NfdCAqc2FkZHIsIHU4IHByb3RvKQogewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfcG9saWN5LmMgYi9uZXQvaXB2Ni94ZnJtNl9wb2xpY3kuYwppbmRleCA2Y2M5NzAwLi5lMGY3MWMwIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni94ZnJtNl9wb2xpY3kuYworKysgYi9uZXQvaXB2Ni94ZnJtNl9wb2xpY3kuYwpAQCAtMzYsNyArMzYsNyBAQAogCWludCBlcnI7CiAKIAltZW1zZXQoJmZsNiwgMCwgc2l6ZW9mKGZsNikpOwotCWZsNi5mbG93aTZfb2lmID0gb2lmOworCWZsNi5mbG93aTZfb2lmID0gbDNtZGV2X21hc3Rlcl9pZmluZGV4X2J5X2luZGV4KG5ldCwgb2lmKTsKIAlmbDYuZmxvd2k2X2ZsYWdzID0gRkxPV0lfRkxBR19TS0lQX05IX09JRjsKIAltZW1jcHkoJmZsNi5kYWRkciwgZGFkZHIsIHNpemVvZihmbDYuZGFkZHIpKTsKIAlpZiAoc2FkZHIpCkBAIC0xMzQsNyArMTM0LDcgQEAKIAluZXh0aGRyID0gbmhbbmhvZmZdOwogCiAJaWYgKHNrYl9kc3Qoc2tiKSkKLQkJb2lmID0gbDNtZGV2X2ZpYl9vaWYoc2tiX2RzdChza2IpLT5kZXYpOworCQlvaWYgPSBza2JfZHN0KHNrYiktPmRldi0+aWZpbmRleDsKIAogCW1lbXNldChmbDYsIDAsIHNpemVvZihzdHJ1Y3QgZmxvd2k2KSk7CiAJZmw2LT5mbG93aTZfbWFyayA9IHNrYi0+bWFyazsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3hmcm02X3R1bm5lbC5jIGIvbmV0L2lwdjYveGZybTZfdHVubmVsLmMKaW5kZXggNTc0MzA0NC4uZTFjMGJiZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYveGZybTZfdHVubmVsLmMKKysrIGIvbmV0L2lwdjYveGZybTZfdHVubmVsLmMKQEAgLTIzNiw3ICsyMzYsNyBAQAogCV9fYmUzMiBzcGk7CiAKIAlzcGkgPSB4ZnJtNl90dW5uZWxfc3BpX2xvb2t1cChuZXQsIChjb25zdCB4ZnJtX2FkZHJlc3NfdCAqKSZpcGgtPnNhZGRyKTsKLQlyZXR1cm4geGZybTZfcmN2X3NwaShza2IsIElQUFJPVE9fSVBWNiwgc3BpKTsKKwlyZXR1cm4geGZybTZfcmN2X3NwaShza2IsIElQUFJPVE9fSVBWNiwgc3BpLCBOVUxMKTsKIH0KIAogc3RhdGljIGludCB4ZnJtNl90dW5uZWxfZXJyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpbmV0Nl9za2JfcGFybSAqb3B0LApkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvYWZfaXJkYS5jIGIvbmV0L2lyZGEvYWZfaXJkYS5jCmluZGV4IDhkMmY3YzkuLjM5MWMzY2IgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2FmX2lyZGEuYworKysgYi9uZXQvaXJkYS9hZl9pcmRhLmMKQEAgLTgzMiw3ICs4MzIsNyBAQAogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBpcmRhX3NvY2sgKm5ldywgKnNlbGYgPSBpcmRhX3NrKHNrKTsKIAlzdHJ1Y3Qgc29jayAqbmV3c2s7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKIAlpbnQgZXJyOwogCiAJZXJyID0gaXJkYV9jcmVhdGUoc29ja19uZXQoc2spLCBuZXdzb2NrLCBzay0+c2tfcHJvdG9jb2wsIDApOwpAQCAtODQ1LDkgKzg0NSw2IEBACiAJaWYgKHNvY2stPnN0YXRlICE9IFNTX1VOQ09OTkVDVEVEKQogCQlnb3RvIG91dDsKIAotCWlmICgoc2sgPSBzb2NrLT5zaykgPT0gTlVMTCkKLQkJZ290byBvdXQ7Ci0KIAllcnIgPSAtRU9QTk9UU1VQUDsKIAlpZiAoKHNrLT5za190eXBlICE9IFNPQ0tfU1RSRUFNKSAmJiAoc2stPnNrX3R5cGUgIT0gU09DS19TRVFQQUNLRVQpICYmCiAJICAgIChzay0+c2tfdHlwZSAhPSBTT0NLX0RHUkFNKSkKQEAgLTkwMCw3ICs4OTcsNiBAQAogCWVyciA9IC1FUEVSTTsgLyogdmFsdWUgZG9lcyBub3Qgc2VlbSB0byBtYWtlIHNlbnNlLiAtYXJuZCAqLwogCWlmICghbmV3LT50c2FwKSB7CiAJCXByX2RlYnVnKCIlcygpLCBkdXAgZmFpbGVkIVxuIiwgX19mdW5jX18pOwotCQlrZnJlZV9za2Ioc2tiKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC05MTksNyArOTE1LDYgQEAKIAkvKiBDbGVhbiB1cCB0aGUgb3JpZ2luYWwgb25lIHRvIGtlZXAgaXQgaW4gbGlzdGVuIHN0YXRlICovCiAJaXJ0dHBfbGlzdGVuKHNlbGYtPnRzYXApOwogCi0Ja2ZyZWVfc2tiKHNrYik7CiAJc2stPnNrX2Fja19iYWNrbG9nLS07CiAKIAluZXdzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKQEAgLTkyNyw2ICs5MjIsNyBAQAogCWlyZGFfY29ubmVjdF9yZXNwb25zZShuZXcpOwogCWVyciA9IDA7CiBvdXQ6CisJa2ZyZWVfc2tiKHNrYik7CiAJcmVsZWFzZV9zb2NrKHNrKTsKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJpYXAuYyBiL25ldC9pcmRhL2lyaWFwLmMKaW5kZXggNGE3YWUzMmEuLjExMzhlYWYgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lyaWFwLmMKKysrIGIvbmV0L2lyZGEvaXJpYXAuYwpAQCAtMTg1LDggKzE4NSwxMiBAQAogCiAJc2VsZi0+bWFnaWMgPSBJQVNfTUFHSUM7CiAJc2VsZi0+bW9kZSA9IG1vZGU7Ci0JaWYgKG1vZGUgPT0gSUFTX0NMSUVOVCkKLQkJaXJpYXBfcmVnaXN0ZXJfbHNhcChzZWxmLCBzbHNhcF9zZWwsIG1vZGUpOworCWlmIChtb2RlID09IElBU19DTElFTlQpIHsKKwkJaWYgKGlyaWFwX3JlZ2lzdGVyX2xzYXAoc2VsZiwgc2xzYXBfc2VsLCBtb2RlKSkgeworCQkJa2ZyZWUoc2VsZik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KIAogCXNlbGYtPmNvbmZpcm0gPSBjYWxsYmFjazsKIAlzZWxmLT5wcml2ID0gcHJpdjsKZGlmZiAtLWdpdCBhL25ldC9rY20vS2NvbmZpZyBiL25ldC9rY20vS2NvbmZpZwppbmRleCA1ZGI5NGQ5Li44N2ZjYTM2IDEwMDY0NAotLS0gYS9uZXQva2NtL0tjb25maWcKKysrIGIvbmV0L2tjbS9LY29uZmlnCkBAIC0zLDYgKzMsNyBAQAogCXRyaXN0YXRlICJLQ00gc29ja2V0cyIKIAlkZXBlbmRzIG9uIElORVQKIAlzZWxlY3QgQlBGX1NZU0NBTEwKKwlzZWxlY3QgU1RSRUFNX1BBUlNFUgogCS0tLWhlbHAtLS0KIAkgIEtDTSAoS2VybmVsIENvbm5lY3Rpb24gTXVsdGlwbGV4b3IpIHNvY2tldHMgcHJvdmlkZSBhIG1ldGhvZAogCSAgZm9yIG11bHRpcGxleGluZyBtZXNzYWdlcyBvZiBhIG1lc3NhZ2UgYmFzZWQgYXBwbGljYXRpb24KZGlmZiAtLWdpdCBhL25ldC9rY20va2NtcHJvYy5jIGIvbmV0L2tjbS9rY21wcm9jLmMKaW5kZXggMTZjMmUwMy4uYmY3NWM5MiAxMDA2NDQKLS0tIGEvbmV0L2tjbS9rY21wcm9jLmMKKysrIGIvbmV0L2tjbS9rY21wcm9jLmMKQEAgLTE1NSw4ICsxNTUsOCBAQAogCXNlcV9wcmludGYoc2VxLAogCQkgICAiICAgcHNvY2stJS01dSAlLTEwbGx1ICUtMTZsbHUgJS0xMGxsdSAlLTE2bGx1ICUtOGQgJS04ZCAlLThkICUtOGQgIiwKIAkJICAgcHNvY2stPmluZGV4LAotCQkgICBwc29jay0+c3RhdHMucnhfbXNncywKLQkJICAgcHNvY2stPnN0YXRzLnJ4X2J5dGVzLAorCQkgICBwc29jay0+c3RycC5zdGF0cy5yeF9tc2dzLAorCQkgICBwc29jay0+c3RycC5zdGF0cy5yeF9ieXRlcywKIAkJICAgcHNvY2stPnN0YXRzLnR4X21zZ3MsCiAJCSAgIHBzb2NrLT5zdGF0cy50eF9ieXRlcywKIAkJICAgcHNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlLnFsZW4sCkBAIC0xNzAsMTQgKzE3MCwyNyBAQAogCWlmIChwc29jay0+dHhfc3RvcHBlZCkKIAkJc2VxX3B1dHMoc2VxLCAiVHhTdG9wICIpOwogCi0JaWYgKHBzb2NrLT5yeF9zdG9wcGVkKQorCWlmIChwc29jay0+c3RycC5yeF9zdG9wcGVkKQogCQlzZXFfcHV0cyhzZXEsICJSeFN0b3AgIik7CiAKIAlpZiAocHNvY2stPnR4X2tjbSkKIAkJc2VxX3ByaW50ZihzZXEsICJSc3ZkLSVkICIsIHBzb2NrLT50eF9rY20tPmluZGV4KTsKIAotCWlmIChwc29jay0+cmVhZHlfcnhfbXNnKQotCQlzZXFfcHV0cyhzZXEsICJSZHlSeCAiKTsKKwlpZiAoIXBzb2NrLT5zdHJwLnJ4X3BhdXNlZCAmJiAhcHNvY2stPnJlYWR5X3J4X21zZykgeworCQlpZiAocHNvY2stPnNrLT5za19yZWNlaXZlX3F1ZXVlLnFsZW4pIHsKKwkJCWlmIChwc29jay0+c3RycC5yeF9uZWVkX2J5dGVzKQorCQkJCXNlcV9wcmludGYoc2VxLCAiUnhXYWl0PSV1ICIsCisJCQkJCSAgIHBzb2NrLT5zdHJwLnJ4X25lZWRfYnl0ZXMpOworCQkJZWxzZQorCQkJCXNlcV9wcmludGYoc2VxLCAiUnhXYWl0ICIpOworCQl9CisJfSBlbHNlICB7CisJCWlmIChwc29jay0+c3RycC5yeF9wYXVzZWQpCisJCQlzZXFfcHV0cyhzZXEsICJSeFBhdXNlICIpOworCisJCWlmIChwc29jay0+cmVhZHlfcnhfbXNnKQorCQkJc2VxX3B1dHMoc2VxLCAiUmR5UnggIik7CisJfQogCiAJc2VxX3B1dHMoc2VxLCAiXG4iKTsKIH0KQEAgLTI3NSw2ICsyODgsNyBAQAogewogCXN0cnVjdCBrY21fcHNvY2tfc3RhdHMgcHNvY2tfc3RhdHM7CiAJc3RydWN0IGtjbV9tdXhfc3RhdHMgbXV4X3N0YXRzOworCXN0cnVjdCBzdHJwX2FnZ3Jfc3RhdHMgc3RycF9zdGF0czsKIAlzdHJ1Y3Qga2NtX211eCAqbXV4OwogCXN0cnVjdCBrY21fcHNvY2sgKnBzb2NrOwogCXN0cnVjdCBuZXQgKm5ldCA9IHNlcS0+cHJpdmF0ZTsKQEAgLTI4MiwyMCArMjk2LDI4IEBACiAKIAltZW1zZXQoJm11eF9zdGF0cywgMCwgc2l6ZW9mKG11eF9zdGF0cykpOwogCW1lbXNldCgmcHNvY2tfc3RhdHMsIDAsIHNpemVvZihwc29ja19zdGF0cykpOworCW1lbXNldCgmc3RycF9zdGF0cywgMCwgc2l6ZW9mKHN0cnBfc3RhdHMpKTsKIAogCW11dGV4X2xvY2soJmtuZXQtPm11dGV4KTsKIAogCWFnZ3JlZ2F0ZV9tdXhfc3RhdHMoJmtuZXQtPmFnZ3JlZ2F0ZV9tdXhfc3RhdHMsICZtdXhfc3RhdHMpOwogCWFnZ3JlZ2F0ZV9wc29ja19zdGF0cygma25ldC0+YWdncmVnYXRlX3Bzb2NrX3N0YXRzLAogCQkJICAgICAgJnBzb2NrX3N0YXRzKTsKKwlhZ2dyZWdhdGVfc3RycF9zdGF0cygma25ldC0+YWdncmVnYXRlX3N0cnBfc3RhdHMsCisJCQkgICAgICZzdHJwX3N0YXRzKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KG11eCwgJmtuZXQtPm11eF9saXN0LCBrY21fbXV4X2xpc3QpIHsKIAkJc3Bpbl9sb2NrX2JoKCZtdXgtPmxvY2spOwogCQlhZ2dyZWdhdGVfbXV4X3N0YXRzKCZtdXgtPnN0YXRzLCAmbXV4X3N0YXRzKTsKIAkJYWdncmVnYXRlX3Bzb2NrX3N0YXRzKCZtdXgtPmFnZ3JlZ2F0ZV9wc29ja19zdGF0cywKIAkJCQkgICAgICAmcHNvY2tfc3RhdHMpOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBzb2NrLCAmbXV4LT5wc29ja3MsIHBzb2NrX2xpc3QpCisJCWFnZ3JlZ2F0ZV9zdHJwX3N0YXRzKCZtdXgtPmFnZ3JlZ2F0ZV9zdHJwX3N0YXRzLAorCQkJCSAgICAgJnN0cnBfc3RhdHMpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBzb2NrLCAmbXV4LT5wc29ja3MsIHBzb2NrX2xpc3QpIHsKIAkJCWFnZ3JlZ2F0ZV9wc29ja19zdGF0cygmcHNvY2stPnN0YXRzLCAmcHNvY2tfc3RhdHMpOworCQkJc2F2ZV9zdHJwX3N0YXRzKCZwc29jay0+c3RycCwgJnN0cnBfc3RhdHMpOworCQl9CisKIAkJc3Bpbl91bmxvY2tfYmgoJm11eC0+bG9jayk7CiAJfQogCkBAIC0zMjgsNyArMzUwLDcgQEAKIAkJICAgbXV4X3N0YXRzLnJ4X3JlYWR5X2Ryb3BzKTsKIAogCXNlcV9wcmludGYoc2VxLAotCQkgICAiJS04cyAlLTEwcyAlLTE2cyAlLTEwcyAlLTE2cyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwc1xuIiwKKwkJICAgIiUtOHMgJS0xMHMgJS0xNnMgJS0xMHMgJS0xNnMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHNcbiIsCiAJCSAgICJQc29jayIsCiAJCSAgICJSWC1Nc2dzIiwKIAkJICAgIlJYLUJ5dGVzIiwKQEAgLTMzNyw2ICszNTksOCBAQAogCQkgICAiUmVzZXJ2ZWQiLAogCQkgICAiVW5yZXNlcnZlZCIsCiAJCSAgICJSWC1BYm9ydHMiLAorCQkgICAiUlgtSW50ciIsCisJCSAgICJSWC1VbnJlY292IiwKIAkJICAgIlJYLU1lbUZhaWwiLAogCQkgICAiUlgtTmVlZE1vciIsCiAJCSAgICJSWC1CYWRMZW4iLApAQCAtMzQ1LDIwICszNjksMjIgQEAKIAkJICAgIlRYLUFib3J0cyIpOwogCiAJc2VxX3ByaW50ZihzZXEsCi0JCSAgICIlLThzICUtMTBsbHUgJS0xNmxsdSAlLTEwbGx1ICUtMTZsbHUgJS0xMGxsdSAlLTEwbGx1ICUtMTB1ICUtMTB1ICUtMTB1ICUtMTB1ICUtMTB1ICUtMTB1ICUtMTB1XG4iLAorCQkgICAiJS04cyAlLTEwbGx1ICUtMTZsbHUgJS0xMGxsdSAlLTE2bGx1ICUtMTBsbHUgJS0xMGxsdSAlLTEwdSAlLTEwdSAlLTEwdSAlLTEwdSAlLTEwdSAlLTEwdSAlLTEwdSAlLTEwdSAlLTEwdVxuIiwKIAkJICAgIiIsCi0JCSAgIHBzb2NrX3N0YXRzLnJ4X21zZ3MsCi0JCSAgIHBzb2NrX3N0YXRzLnJ4X2J5dGVzLAorCQkgICBzdHJwX3N0YXRzLnJ4X21zZ3MsCisJCSAgIHN0cnBfc3RhdHMucnhfYnl0ZXMsCiAJCSAgIHBzb2NrX3N0YXRzLnR4X21zZ3MsCiAJCSAgIHBzb2NrX3N0YXRzLnR4X2J5dGVzLAogCQkgICBwc29ja19zdGF0cy5yZXNlcnZlZCwKIAkJICAgcHNvY2tfc3RhdHMudW5yZXNlcnZlZCwKLQkJICAgcHNvY2tfc3RhdHMucnhfYWJvcnRzLAotCQkgICBwc29ja19zdGF0cy5yeF9tZW1fZmFpbCwKLQkJICAgcHNvY2tfc3RhdHMucnhfbmVlZF9tb3JlX2hkciwKLQkJICAgcHNvY2tfc3RhdHMucnhfYmFkX2hkcl9sZW4sCi0JCSAgIHBzb2NrX3N0YXRzLnJ4X21zZ190b29fYmlnLAotCQkgICBwc29ja19zdGF0cy5yeF9tc2dfdGltZW91dHMsCisJCSAgIHN0cnBfc3RhdHMucnhfYWJvcnRzLAorCQkgICBzdHJwX3N0YXRzLnJ4X2ludGVycnVwdGVkLAorCQkgICBzdHJwX3N0YXRzLnJ4X3VucmVjb3ZfaW50ciwKKwkJICAgc3RycF9zdGF0cy5yeF9tZW1fZmFpbCwKKwkJICAgc3RycF9zdGF0cy5yeF9uZWVkX21vcmVfaGRyLAorCQkgICBzdHJwX3N0YXRzLnJ4X2JhZF9oZHJfbGVuLAorCQkgICBzdHJwX3N0YXRzLnJ4X21zZ190b29fYmlnLAorCQkgICBzdHJwX3N0YXRzLnJ4X21zZ190aW1lb3V0cywKIAkJICAgcHNvY2tfc3RhdHMudHhfYWJvcnRzKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0L2tjbS9rY21zb2NrLmMgYi9uZXQva2NtL2tjbXNvY2suYwppbmRleCBjYjM5ZTA1Li5iN2Y4NjlhOCAxMDA2NDQKLS0tIGEvbmV0L2tjbS9rY21zb2NrLmMKKysrIGIvbmV0L2tjbS9rY21zb2NrLmMKQEAgLTEsMyArMSwxMyBAQAorLyoKKyAqIEtlcm5lbCBDb25uZWN0aW9uIE11bHRpcGxleG9yCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFRvbSBIZXJiZXJ0IDx0b21AaGVyYmVydGxhbmQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKwogI2luY2x1ZGUgPGxpbnV4L2JwZi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZXJycXVldWUuaD4KQEAgLTEzLDEwICsyMywxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPG5ldC9rY20uaD4KICNpbmNsdWRlIDxuZXQvbmV0bnMvZ2VuZXJpYy5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+Ci0jaW5jbHVkZSA8bmV0L3RjcC5oPgogI2luY2x1ZGUgPHVhcGkvbGludXgva2NtLmg+CiAKIHVuc2lnbmVkIGludCBrY21fbmV0X2lkOwpAQCAtMzUsMzggKzQ1LDEyIEBACiAJcmV0dXJuIChzdHJ1Y3Qga2NtX3R4X21zZyAqKXNrYi0+Y2I7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGtjbV9yeF9tc2cgKmtjbV9yeF9tc2coc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlyZXR1cm4gKHN0cnVjdCBrY21fcnhfbXNnICopKCh2b2lkICopc2tiLT5jYiArCi0JCQkJICAgICBvZmZzZXRvZihzdHJ1Y3QgcWRpc2Nfc2tiX2NiLCBkYXRhKSk7Ci19Ci0KIHN0YXRpYyB2b2lkIHJlcG9ydF9jc2tfZXJyb3Ioc3RydWN0IHNvY2sgKmNzaywgaW50IGVycikKIHsKIAljc2stPnNrX2VyciA9IEVQSVBFOwogCWNzay0+c2tfZXJyb3JfcmVwb3J0KGNzayk7CiB9CiAKLS8qIENhbGxiYWNrIGxvY2sgaGVsZCAqLwotc3RhdGljIHZvaWQga2NtX2Fib3J0X3J4X3Bzb2NrKHN0cnVjdCBrY21fcHNvY2sgKnBzb2NrLCBpbnQgZXJyLAotCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IHNvY2sgKmNzayA9IHBzb2NrLT5zazsKLQotCS8qIFVucmVjb3ZlcmFibGUgZXJyb3IgaW4gcmVjZWl2ZSAqLwotCi0JZGVsX3RpbWVyKCZwc29jay0+cnhfbXNnX3RpbWVyKTsKLQotCWlmIChwc29jay0+cnhfc3RvcHBlZCkKLQkJcmV0dXJuOwotCi0JcHNvY2stPnJ4X3N0b3BwZWQgPSAxOwotCUtDTV9TVEFUU19JTkNSKHBzb2NrLT5zdGF0cy5yeF9hYm9ydHMpOwotCi0JLyogUmVwb3J0IGFuIGVycm9yIG9uIHRoZSBsb3dlciBzb2NrZXQgKi8KLQlyZXBvcnRfY3NrX2Vycm9yKGNzaywgZXJyKTsKLX0KLQogc3RhdGljIHZvaWQga2NtX2Fib3J0X3R4X3Bzb2NrKHN0cnVjdCBrY21fcHNvY2sgKnBzb2NrLCBpbnQgZXJyLAogCQkJICAgICAgIGJvb2wgd2FrZXVwX2tjbSkKIHsKQEAgLTEwOSwxMiArOTMsMTMgQEAKIHN0YXRpYyB2b2lkIGtjbV91cGRhdGVfcnhfbXV4X3N0YXRzKHN0cnVjdCBrY21fbXV4ICptdXgsCiAJCQkJICAgIHN0cnVjdCBrY21fcHNvY2sgKnBzb2NrKQogewotCUtDTV9TVEFUU19BREQobXV4LT5zdGF0cy5yeF9ieXRlcywKLQkJICAgICAgcHNvY2stPnN0YXRzLnJ4X2J5dGVzIC0gcHNvY2stPnNhdmVkX3J4X2J5dGVzKTsKKwlTVFJQX1NUQVRTX0FERChtdXgtPnN0YXRzLnJ4X2J5dGVzLAorCQkgICAgICAgcHNvY2stPnN0cnAuc3RhdHMucnhfYnl0ZXMgLQorCQkgICAgICAgcHNvY2stPnNhdmVkX3J4X2J5dGVzKTsKIAltdXgtPnN0YXRzLnJ4X21zZ3MgKz0KLQkJcHNvY2stPnN0YXRzLnJ4X21zZ3MgLSBwc29jay0+c2F2ZWRfcnhfbXNnczsKLQlwc29jay0+c2F2ZWRfcnhfbXNncyA9IHBzb2NrLT5zdGF0cy5yeF9tc2dzOwotCXBzb2NrLT5zYXZlZF9yeF9ieXRlcyA9IHBzb2NrLT5zdGF0cy5yeF9ieXRlczsKKwkJcHNvY2stPnN0cnAuc3RhdHMucnhfbXNncyAtIHBzb2NrLT5zYXZlZF9yeF9tc2dzOworCXBzb2NrLT5zYXZlZF9yeF9tc2dzID0gcHNvY2stPnN0cnAuc3RhdHMucnhfbXNnczsKKwlwc29jay0+c2F2ZWRfcnhfYnl0ZXMgPSBwc29jay0+c3RycC5zdGF0cy5yeF9ieXRlczsKIH0KIAogc3RhdGljIHZvaWQga2NtX3VwZGF0ZV90eF9tdXhfc3RhdHMoc3RydWN0IGtjbV9tdXggKm11eCwKQEAgLTE2NywxMSArMTUyLDExIEBACiAJCSAqLwogCQlsaXN0X2RlbCgmcHNvY2stPnBzb2NrX3JlYWR5X2xpc3QpOwogCQlwc29jay0+cmVhZHlfcnhfbXNnID0gTlVMTDsKLQogCQkvKiBDb21taXQgY2xlYXJpbmcgb2YgcmVhZHlfcnhfbXNnIGZvciBxdWV1aW5nIHdvcmsgKi8KIAkJc21wX21iKCk7CiAKLQkJcXVldWVfd29yayhrY21fd3EsICZwc29jay0+cnhfd29yayk7CisJCXN0cnBfdW5wYXVzZSgmcHNvY2stPnN0cnApOworCQlzdHJwX2NoZWNrX3JjdigmcHNvY2stPnN0cnApOwogCX0KIAogCS8qIEJ1ZmZlciBsaW1pdCBpcyBva2F5IG5vdywgYWRkIHRvIHJlYWR5IGxpc3QgKi8KQEAgLTI4NSw2ICsyNzAsNyBAQAogCiAJaWYgKGxpc3RfZW1wdHkoJm11eC0+a2NtX3J4X3dhaXRlcnMpKSB7CiAJCXBzb2NrLT5yZWFkeV9yeF9tc2cgPSBoZWFkOworCQlzdHJwX3BhdXNlKCZwc29jay0+c3RycCk7CiAJCWxpc3RfYWRkX3RhaWwoJnBzb2NrLT5wc29ja19yZWFkeV9saXN0LAogCQkJICAgICAgJm11eC0+cHNvY2tzX3JlYWR5KTsKIAkJc3Bpbl91bmxvY2tfYmgoJm11eC0+cnhfbG9jayk7CkBAIC0zNTMsMzQ2ICszMzksNjAgQEAKIAlzcGluX3VubG9ja19iaCgmbXV4LT5yeF9sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQga2NtX3N0YXJ0X3J4X3RpbWVyKHN0cnVjdCBrY21fcHNvY2sgKnBzb2NrKQotewotCWlmIChwc29jay0+c2stPnNrX3JjdnRpbWVvKQotCQltb2RfdGltZXIoJnBzb2NrLT5yeF9tc2dfdGltZXIsIHBzb2NrLT5zay0+c2tfcmN2dGltZW8pOwotfQotCi0vKiBNYWNybyB0byBpbnZva2UgZmlsdGVyIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBLQ01fUlVOX0ZJTFRFUihwcm9nLCBjdHgpIFwKLQkoKnByb2ctPmJwZl9mdW5jKShjdHgsIHByb2ctPmluc25zaSkKLQotLyogTG93ZXIgc29ja2V0IGxvY2sgaGVsZCAqLwotc3RhdGljIGludCBrY21fdGNwX3JlY3YocmVhZF9kZXNjcmlwdG9yX3QgKmRlc2MsIHN0cnVjdCBza19idWZmICpvcmlnX3NrYiwKLQkJCXVuc2lnbmVkIGludCBvcmlnX29mZnNldCwgc2l6ZV90IG9yaWdfbGVuKQotewotCXN0cnVjdCBrY21fcHNvY2sgKnBzb2NrID0gKHN0cnVjdCBrY21fcHNvY2sgKilkZXNjLT5hcmcuZGF0YTsKLQlzdHJ1Y3Qga2NtX3J4X21zZyAqcnhtOwotCXN0cnVjdCBrY21fc29jayAqa2NtOwotCXN0cnVjdCBza19idWZmICpoZWFkLCAqc2tiOwotCXNpemVfdCBlYXRlbiA9IDAsIGNhbmRfbGVuOwotCXNzaXplX3QgZXh0cmE7Ci0JaW50IGVycjsKLQlib29sIGNsb25lZF9vcmlnID0gZmFsc2U7Ci0KLQlpZiAocHNvY2stPnJlYWR5X3J4X21zZykKLQkJcmV0dXJuIDA7Ci0KLQloZWFkID0gcHNvY2stPnJ4X3NrYl9oZWFkOwotCWlmIChoZWFkKSB7Ci0JCS8qIE1lc3NhZ2UgYWxyZWFkeSBpbiBwcm9ncmVzcyAqLwotCi0JCXJ4bSA9IGtjbV9yeF9tc2coaGVhZCk7Ci0JCWlmICh1bmxpa2VseShyeG0tPmVhcmx5X2VhdGVuKSkgewotCQkJLyogQWxyZWFkeSBzb21lIG51bWJlciBvZiBieXRlcyBvbiB0aGUgcmVjZWl2ZSBzb2NrCi0JCQkgKiBkYXRhIHNhdmVkIGluIHJ4X3NrYl9oZWFkLCBqdXN0IGluZGljYXRlIHRoZXkKLQkJCSAqIGFyZSBjb25zdW1lZC4KLQkJCSAqLwotCQkJZWF0ZW4gPSBvcmlnX2xlbiA8PSByeG0tPmVhcmx5X2VhdGVuID8KLQkJCQlvcmlnX2xlbiA6IHJ4bS0+ZWFybHlfZWF0ZW47Ci0JCQlyeG0tPmVhcmx5X2VhdGVuIC09IGVhdGVuOwotCi0JCQlyZXR1cm4gZWF0ZW47Ci0JCX0KLQotCQlpZiAodW5saWtlbHkob3JpZ19vZmZzZXQpKSB7Ci0JCQkvKiBHZXR0aW5nIGRhdGEgd2l0aCBhIG5vbi16ZXJvIG9mZnNldCB3aGVuIGEgbWVzc2FnZSBpcwotCQkJICogaW4gcHJvZ3Jlc3MgaXMgbm90IGV4cGVjdGVkLiBJZiBpdCBkb2VzIGhhcHBlbiwgd2UKLQkJCSAqIG5lZWQgdG8gY2xvbmUgYW5kIHB1bGwgc2luY2Ugd2UgY2FuJ3QgZGVhbCB3aXRoCi0JCQkgKiBvZmZzZXRzIGluIHRoZSBza2JzIGZvciBhIG1lc3NhZ2UgZXhwZWN0IGluIHRoZSBoZWFkLgotCQkJICovCi0JCQlvcmlnX3NrYiA9IHNrYl9jbG9uZShvcmlnX3NrYiwgR0ZQX0FUT01JQyk7Ci0JCQlpZiAoIW9yaWdfc2tiKSB7Ci0JCQkJS0NNX1NUQVRTX0lOQ1IocHNvY2stPnN0YXRzLnJ4X21lbV9mYWlsKTsKLQkJCQlkZXNjLT5lcnJvciA9IC1FTk9NRU07Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlpZiAoIXBza2JfcHVsbChvcmlnX3NrYiwgb3JpZ19vZmZzZXQpKSB7Ci0JCQkJS0NNX1NUQVRTX0lOQ1IocHNvY2stPnN0YXRzLnJ4X21lbV9mYWlsKTsKLQkJCQlrZnJlZV9za2Iob3JpZ19za2IpOwotCQkJCWRlc2MtPmVycm9yID0gLUVOT01FTTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWNsb25lZF9vcmlnID0gdHJ1ZTsKLQkJCW9yaWdfb2Zmc2V0ID0gMDsKLQkJfQotCi0JCWlmICghcHNvY2stPnJ4X3NrYl9uZXh0cCkgewotCQkJLyogV2UgYXJlIGdvaW5nIHRvIGFwcGVuZCB0byB0aGUgZnJhZ3NfbGlzdCBvZiBoZWFkLgotCQkJICogTmVlZCB0byB1bnNoYXJlIHRoZSBmcmFnX2xpc3QuCi0JCQkgKi8KLQkJCWVyciA9IHNrYl91bmNsb25lKGhlYWQsIEdGUF9BVE9NSUMpOwotCQkJaWYgKGVycikgewotCQkJCUtDTV9TVEFUU19JTkNSKHBzb2NrLT5zdGF0cy5yeF9tZW1fZmFpbCk7Ci0JCQkJZGVzYy0+ZXJyb3IgPSBlcnI7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0KLQkJCWlmICh1bmxpa2VseShza2Jfc2hpbmZvKGhlYWQpLT5mcmFnX2xpc3QpKSB7Ci0JCQkJLyogV2UgY2FuJ3QgYXBwZW5kIHRvIGFuIHNrX2J1ZmYgdGhhdCBhbHJlYWR5Ci0JCQkJICogaGFzIGEgZnJhZ19saXN0LiBXZSBjcmVhdGUgYSBuZXcgaGVhZCwgcG9pbnQKLQkJCQkgKiB0aGUgZnJhZ19saXN0IG9mIHRoYXQgdG8gdGhlIG9sZCBoZWFkLCBhbmQKLQkJCQkgKiB0aGVuIGFyZSBhYmxlIHRvIHVzZSB0aGUgb2xkIGhlYWQtPm5leHQgZm9yCi0JCQkJICogYXBwZW5kaW5nIHRvIHRoZSBtZXNzYWdlLgotCQkJCSAqLwotCQkJCWlmIChXQVJOX09OKGhlYWQtPm5leHQpKSB7Ci0JCQkJCWRlc2MtPmVycm9yID0gLUVJTlZBTDsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCi0JCQkJc2tiID0gYWxsb2Nfc2tiKDAsIEdGUF9BVE9NSUMpOwotCQkJCWlmICghc2tiKSB7Ci0JCQkJCUtDTV9TVEFUU19JTkNSKHBzb2NrLT5zdGF0cy5yeF9tZW1fZmFpbCk7Ci0JCQkJCWRlc2MtPmVycm9yID0gLUVOT01FTTsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJCXNrYi0+bGVuID0gaGVhZC0+bGVuOwotCQkJCXNrYi0+ZGF0YV9sZW4gPSBoZWFkLT5sZW47Ci0JCQkJc2tiLT50cnVlc2l6ZSA9IGhlYWQtPnRydWVzaXplOwotCQkJCSprY21fcnhfbXNnKHNrYikgPSAqa2NtX3J4X21zZyhoZWFkKTsKLQkJCQlwc29jay0+cnhfc2tiX25leHRwID0gJmhlYWQtPm5leHQ7Ci0JCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QgPSBoZWFkOwotCQkJCXBzb2NrLT5yeF9za2JfaGVhZCA9IHNrYjsKLQkJCQloZWFkID0gc2tiOwotCQkJfSBlbHNlIHsKLQkJCQlwc29jay0+cnhfc2tiX25leHRwID0KLQkJCQkgICAgJnNrYl9zaGluZm8oaGVhZCktPmZyYWdfbGlzdDsKLQkJCX0KLQkJfQotCX0KLQotCXdoaWxlIChlYXRlbiA8IG9yaWdfbGVuKSB7Ci0JCS8qIEFsd2F5cyBjbG9uZSBzaW5jZSB3ZSB3aWxsIGNvbnN1bWUgc29tZXRoaW5nICovCi0JCXNrYiA9IHNrYl9jbG9uZShvcmlnX3NrYiwgR0ZQX0FUT01JQyk7Ci0JCWlmICghc2tiKSB7Ci0JCQlLQ01fU1RBVFNfSU5DUihwc29jay0+c3RhdHMucnhfbWVtX2ZhaWwpOwotCQkJZGVzYy0+ZXJyb3IgPSAtRU5PTUVNOwotCQkJYnJlYWs7Ci0JCX0KLQotCQljYW5kX2xlbiA9IG9yaWdfbGVuIC0gZWF0ZW47Ci0KLQkJaGVhZCA9IHBzb2NrLT5yeF9za2JfaGVhZDsKLQkJaWYgKCFoZWFkKSB7Ci0JCQloZWFkID0gc2tiOwotCQkJcHNvY2stPnJ4X3NrYl9oZWFkID0gaGVhZDsKLQkJCS8qIFdpbGwgc2V0IHJ4X3NrYl9uZXh0cCBvbiBuZXh0IHBhY2tldCBpZiBuZWVkZWQgKi8KLQkJCXBzb2NrLT5yeF9za2JfbmV4dHAgPSBOVUxMOwotCQkJcnhtID0ga2NtX3J4X21zZyhoZWFkKTsKLQkJCW1lbXNldChyeG0sIDAsIHNpemVvZigqcnhtKSk7Ci0JCQlyeG0tPm9mZnNldCA9IG9yaWdfb2Zmc2V0ICsgZWF0ZW47Ci0JCX0gZWxzZSB7Ci0JCQkvKiBVbmNsb25lIHNpbmNlIHdlIG1heSBiZSBhcHBlbmRpbmcgdG8gYW4gc2tiIHRoYXQgd2UKLQkJCSAqIGFscmVhZHkgc2hhcmUgYSBmcmFnX2xpc3Qgd2l0aC4KLQkJCSAqLwotCQkJZXJyID0gc2tiX3VuY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKLQkJCWlmIChlcnIpIHsKLQkJCQlLQ01fU1RBVFNfSU5DUihwc29jay0+c3RhdHMucnhfbWVtX2ZhaWwpOwotCQkJCWRlc2MtPmVycm9yID0gZXJyOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlyeG0gPSBrY21fcnhfbXNnKGhlYWQpOwotCQkJKnBzb2NrLT5yeF9za2JfbmV4dHAgPSBza2I7Ci0JCQlwc29jay0+cnhfc2tiX25leHRwID0gJnNrYi0+bmV4dDsKLQkJCWhlYWQtPmRhdGFfbGVuICs9IHNrYi0+bGVuOwotCQkJaGVhZC0+bGVuICs9IHNrYi0+bGVuOwotCQkJaGVhZC0+dHJ1ZXNpemUgKz0gc2tiLT50cnVlc2l6ZTsKLQkJfQotCi0JCWlmICghcnhtLT5mdWxsX2xlbikgewotCQkJc3NpemVfdCBsZW47Ci0KLQkJCWxlbiA9IEtDTV9SVU5fRklMVEVSKHBzb2NrLT5icGZfcHJvZywgaGVhZCk7Ci0KLQkJCWlmICghbGVuKSB7Ci0JCQkJLyogTmVlZCBtb3JlIGhlYWRlciB0byBkZXRlcm1pbmUgbGVuZ3RoICovCi0JCQkJaWYgKCFyeG0tPmFjY3VtX2xlbikgewotCQkJCQkvKiBTdGFydCBSWCB0aW1lciBmb3IgbmV3IG1lc3NhZ2UgKi8KLQkJCQkJa2NtX3N0YXJ0X3J4X3RpbWVyKHBzb2NrKTsKLQkJCQl9Ci0JCQkJcnhtLT5hY2N1bV9sZW4gKz0gY2FuZF9sZW47Ci0JCQkJZWF0ZW4gKz0gY2FuZF9sZW47Ci0JCQkJS0NNX1NUQVRTX0lOQ1IocHNvY2stPnN0YXRzLnJ4X25lZWRfbW9yZV9oZHIpOwotCQkJCVdBUk5fT04oZWF0ZW4gIT0gb3JpZ19sZW4pOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmIChsZW4gPiBwc29jay0+c2stPnNrX3JjdmJ1ZikgewotCQkJCS8qIE1lc3NhZ2UgbGVuZ3RoIGV4Y2VlZHMgbWF4aW11bSBhbGxvd2VkICovCi0JCQkJS0NNX1NUQVRTX0lOQ1IocHNvY2stPnN0YXRzLnJ4X21zZ190b29fYmlnKTsKLQkJCQlkZXNjLT5lcnJvciA9IC1FTVNHU0laRTsKLQkJCQlwc29jay0+cnhfc2tiX2hlYWQgPSBOVUxMOwotCQkJCWtjbV9hYm9ydF9yeF9wc29jayhwc29jaywgRU1TR1NJWkUsIGhlYWQpOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmIChsZW4gPD0gKHNzaXplX3QpaGVhZC0+bGVuIC0KLQkJCQkJICBza2ItPmxlbiAtIHJ4bS0+b2Zmc2V0KSB7Ci0JCQkJLyogTGVuZ3RoIG11c3QgYmUgaW50byBuZXcgc2tiIChhbmQgYWxzbwotCQkJCSAqIGdyZWF0ZXIgdGhhbiB6ZXJvKQotCQkJCSAqLwotCQkJCUtDTV9TVEFUU19JTkNSKHBzb2NrLT5zdGF0cy5yeF9iYWRfaGRyX2xlbik7Ci0JCQkJZGVzYy0+ZXJyb3IgPSAtRVBST1RPOwotCQkJCXBzb2NrLT5yeF9za2JfaGVhZCA9IE5VTEw7Ci0JCQkJa2NtX2Fib3J0X3J4X3Bzb2NrKHBzb2NrLCBFUFJPVE8sIGhlYWQpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlyeG0tPmZ1bGxfbGVuID0gbGVuOwotCQl9Ci0KLQkJZXh0cmEgPSAoc3NpemVfdCkocnhtLT5hY2N1bV9sZW4gKyBjYW5kX2xlbikgLSByeG0tPmZ1bGxfbGVuOwotCi0JCWlmIChleHRyYSA8IDApIHsKLQkJCS8qIE1lc3NhZ2Ugbm90IGNvbXBsZXRlIHlldC4gKi8KLQkJCWlmIChyeG0tPmZ1bGxfbGVuIC0gcnhtLT5hY2N1bV9sZW4gPgotCQkJICAgIHRjcF9pbnEocHNvY2stPnNrKSkgewotCQkJCS8qIERvbid0IGhhdmUgdGhlIHdob2xlIG1lc3NhZ2VzIGluIHRoZSBzb2NrZXQKLQkJCQkgKiBidWZmZXIuIFNldCBwc29jay0+cnhfbmVlZF9ieXRlcyB0byB3YWl0IGZvcgotCQkJCSAqIHRoZSByZXN0IG9mIHRoZSBtZXNzYWdlLiBBbHNvLCBzZXQgImVhcmx5Ci0JCQkJICogZWF0ZW4iIHNpbmNlIHdlJ3ZlIGFscmVhZHkgYnVmZmVyZWQgdGhlIHNrYgotCQkJCSAqIGJ1dCBkb24ndCBjb25zdW1lIHlldCBwZXIgdGNwX3JlYWRfc29jay4KLQkJCQkgKi8KLQotCQkJCWlmICghcnhtLT5hY2N1bV9sZW4pIHsKLQkJCQkJLyogU3RhcnQgUlggdGltZXIgZm9yIG5ldyBtZXNzYWdlICovCi0JCQkJCWtjbV9zdGFydF9yeF90aW1lcihwc29jayk7Ci0JCQkJfQotCi0JCQkJcHNvY2stPnJ4X25lZWRfYnl0ZXMgPSByeG0tPmZ1bGxfbGVuIC0KLQkJCQkJCSAgICAgICByeG0tPmFjY3VtX2xlbjsKLQkJCQlyeG0tPmFjY3VtX2xlbiArPSBjYW5kX2xlbjsKLQkJCQlyeG0tPmVhcmx5X2VhdGVuID0gY2FuZF9sZW47Ci0JCQkJS0NNX1NUQVRTX0FERChwc29jay0+c3RhdHMucnhfYnl0ZXMsIGNhbmRfbGVuKTsKLQkJCQlkZXNjLT5jb3VudCA9IDA7IC8qIFN0b3AgcmVhZGluZyBzb2NrZXQgKi8KLQkJCQlicmVhazsKLQkJCX0KLQkJCXJ4bS0+YWNjdW1fbGVuICs9IGNhbmRfbGVuOwotCQkJZWF0ZW4gKz0gY2FuZF9sZW47Ci0JCQlXQVJOX09OKGVhdGVuICE9IG9yaWdfbGVuKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogUG9zaXRpdmUgZXh0cmEgaW5kaWNhdGVzIG9yZSBieXRlcyB0aGFuIG5lZWRlZCBmb3IgdGhlCi0JCSAqIG1lc3NhZ2UKLQkJICovCi0KLQkJV0FSTl9PTihleHRyYSA+IGNhbmRfbGVuKTsKLQotCQllYXRlbiArPSAoY2FuZF9sZW4gLSBleHRyYSk7Ci0KLQkJLyogSHVycmF5LCB3ZSBoYXZlIGEgbmV3IG1lc3NhZ2UhICovCi0JCWRlbF90aW1lcigmcHNvY2stPnJ4X21zZ190aW1lcik7Ci0JCXBzb2NrLT5yeF9za2JfaGVhZCA9IE5VTEw7Ci0JCUtDTV9TVEFUU19JTkNSKHBzb2NrLT5zdGF0cy5yeF9tc2dzKTsKLQotdHJ5X3F1ZXVlOgotCQlrY20gPSByZXNlcnZlX3J4X2tjbShwc29jaywgaGVhZCk7Ci0JCWlmICgha2NtKSB7Ci0JCQkvKiBVbmFibGUgdG8gcmVzZXJ2ZSBhIEtDTSwgbWVzc2FnZSBpcyBoZWxkIGluIHBzb2NrLiAqLwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoa2NtX3F1ZXVlX3Jjdl9za2IoJmtjbS0+c2ssIGhlYWQpKSB7Ci0JCQkvKiBTaG91bGQgbWVhbiBzb2NrZXQgYnVmZmVyIGZ1bGwgKi8KLQkJCXVucmVzZXJ2ZV9yeF9rY20ocHNvY2ssIGZhbHNlKTsKLQkJCWdvdG8gdHJ5X3F1ZXVlOwotCQl9Ci0JfQotCi0JaWYgKGNsb25lZF9vcmlnKQotCQlrZnJlZV9za2Iob3JpZ19za2IpOwotCi0JS0NNX1NUQVRTX0FERChwc29jay0+c3RhdHMucnhfYnl0ZXMsIGVhdGVuKTsKLQotCXJldHVybiBlYXRlbjsKLX0KLQotLyogQ2FsbGVkIHdpdGggbG9jayBoZWxkIG9uIGxvd2VyIHNvY2tldCAqLwotc3RhdGljIGludCBwc29ja190Y3BfcmVhZF9zb2NrKHN0cnVjdCBrY21fcHNvY2sgKnBzb2NrKQotewotCXJlYWRfZGVzY3JpcHRvcl90IGRlc2M7Ci0KLQlkZXNjLmFyZy5kYXRhID0gcHNvY2s7Ci0JZGVzYy5lcnJvciA9IDA7Ci0JZGVzYy5jb3VudCA9IDE7IC8qIGdpdmUgbW9yZSB0aGFuIG9uZSBza2IgcGVyIGNhbGwgKi8KLQotCS8qIHNrIHNob3VsZCBiZSBsb2NrZWQgaGVyZSwgc28gb2theSB0byBkbyB0Y3BfcmVhZF9zb2NrICovCi0JdGNwX3JlYWRfc29jayhwc29jay0+c2ssICZkZXNjLCBrY21fdGNwX3JlY3YpOwotCi0JdW5yZXNlcnZlX3J4X2tjbShwc29jaywgdHJ1ZSk7Ci0KLQlyZXR1cm4gZGVzYy5lcnJvcjsKLX0KLQogLyogTG93ZXIgc29jayBsb2NrIGhlbGQgKi8KLXN0YXRpYyB2b2lkIHBzb2NrX3RjcF9kYXRhX3JlYWR5KHN0cnVjdCBzb2NrICpzaykKK3N0YXRpYyB2b2lkIHBzb2NrX2RhdGFfcmVhZHkoc3RydWN0IHNvY2sgKnNrKQogewogCXN0cnVjdCBrY21fcHNvY2sgKnBzb2NrOwogCiAJcmVhZF9sb2NrX2JoKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CiAKIAlwc29jayA9IChzdHJ1Y3Qga2NtX3Bzb2NrICopc2stPnNrX3VzZXJfZGF0YTsKLQlpZiAodW5saWtlbHkoIXBzb2NrIHx8IHBzb2NrLT5yeF9zdG9wcGVkKSkKLQkJZ290byBvdXQ7CisJaWYgKGxpa2VseShwc29jaykpCisJCXN0cnBfZGF0YV9yZWFkeSgmcHNvY2stPnN0cnApOwogCi0JaWYgKHBzb2NrLT5yZWFkeV9yeF9tc2cpCi0JCWdvdG8gb3V0OwotCi0JaWYgKHBzb2NrLT5yeF9uZWVkX2J5dGVzKSB7Ci0JCWlmICh0Y3BfaW5xKHNrKSA+PSBwc29jay0+cnhfbmVlZF9ieXRlcykKLQkJCXBzb2NrLT5yeF9uZWVkX2J5dGVzID0gMDsKLQkJZWxzZQotCQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKHBzb2NrX3RjcF9yZWFkX3NvY2socHNvY2spID09IC1FTk9NRU0pCi0JCXF1ZXVlX2RlbGF5ZWRfd29yayhrY21fd3EsICZwc29jay0+cnhfZGVsYXllZF93b3JrLCAwKTsKLQotb3V0OgogCXJlYWRfdW5sb2NrX2JoKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CiB9CiAKLXN0YXRpYyB2b2lkIGRvX3Bzb2NrX3J4X3dvcmsoc3RydWN0IGtjbV9wc29jayAqcHNvY2spCisvKiBDYWxsZWQgd2l0aCBsb3dlciBzb2NrIGhlbGQgKi8KK3N0YXRpYyB2b2lkIGtjbV9yY3Zfc3RycGFyc2VyKHN0cnVjdCBzdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmVhZF9kZXNjcmlwdG9yX3QgcmRfZGVzYzsKLQlzdHJ1Y3Qgc29jayAqY3NrID0gcHNvY2stPnNrOworCXN0cnVjdCBrY21fcHNvY2sgKnBzb2NrID0gY29udGFpbmVyX29mKHN0cnAsIHN0cnVjdCBrY21fcHNvY2ssIHN0cnApOworCXN0cnVjdCBrY21fc29jayAqa2NtOwogCi0JLyogV2UgbmVlZCB0aGUgcmVhZCBsb2NrIHRvIHN5bmNocm9uaXplIHdpdGggcHNvY2tfdGNwX2RhdGFfcmVhZHkuIFdlCi0JICogbmVlZCB0aGUgc29ja2V0IGxvY2sgZm9yIGNhbGxpbmcgdGNwX3JlYWRfc29jay4KLQkgKi8KLQlsb2NrX3NvY2soY3NrKTsKLQlyZWFkX2xvY2tfYmgoJmNzay0+c2tfY2FsbGJhY2tfbG9jayk7Cit0cnlfcXVldWU6CisJa2NtID0gcmVzZXJ2ZV9yeF9rY20ocHNvY2ssIHNrYik7CisJaWYgKCFrY20pIHsKKwkJIC8qIFVuYWJsZSB0byByZXNlcnZlIGEgS0NNLCBtZXNzYWdlIGlzIGhlbGQgaW4gcHNvY2sgYW5kIHN0cnAKKwkJICAqIGlzIHBhdXNlZC4KKwkJICAqLworCQlyZXR1cm47CisJfQogCi0JaWYgKHVubGlrZWx5KGNzay0+c2tfdXNlcl9kYXRhICE9IHBzb2NrKSkKLQkJZ290byBvdXQ7Ci0KLQlpZiAodW5saWtlbHkocHNvY2stPnJ4X3N0b3BwZWQpKQotCQlnb3RvIG91dDsKLQotCWlmIChwc29jay0+cmVhZHlfcnhfbXNnKQotCQlnb3RvIG91dDsKLQotCXJkX2Rlc2MuYXJnLmRhdGEgPSBwc29jazsKLQotCWlmIChwc29ja190Y3BfcmVhZF9zb2NrKHBzb2NrKSA9PSAtRU5PTUVNKQotCQlxdWV1ZV9kZWxheWVkX3dvcmsoa2NtX3dxLCAmcHNvY2stPnJ4X2RlbGF5ZWRfd29yaywgMCk7Ci0KLW91dDoKLQlyZWFkX3VubG9ja19iaCgmY3NrLT5za19jYWxsYmFja19sb2NrKTsKLQlyZWxlYXNlX3NvY2soY3NrKTsKKwlpZiAoa2NtX3F1ZXVlX3Jjdl9za2IoJmtjbS0+c2ssIHNrYikpIHsKKwkJLyogU2hvdWxkIG1lYW4gc29ja2V0IGJ1ZmZlciBmdWxsICovCisJCXVucmVzZXJ2ZV9yeF9rY20ocHNvY2ssIGZhbHNlKTsKKwkJZ290byB0cnlfcXVldWU7CisJfQogfQogCi1zdGF0aWMgdm9pZCBwc29ja19yeF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqdykKK3N0YXRpYyBpbnQga2NtX3BhcnNlX2Z1bmNfc3RycGFyc2VyKHN0cnVjdCBzdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JZG9fcHNvY2tfcnhfd29yayhjb250YWluZXJfb2Yodywgc3RydWN0IGtjbV9wc29jaywgcnhfd29yaykpOworCXN0cnVjdCBrY21fcHNvY2sgKnBzb2NrID0gY29udGFpbmVyX29mKHN0cnAsIHN0cnVjdCBrY21fcHNvY2ssIHN0cnApOworCXN0cnVjdCBicGZfcHJvZyAqcHJvZyA9IHBzb2NrLT5icGZfcHJvZzsKKworCXJldHVybiAoKnByb2ctPmJwZl9mdW5jKShza2IsIHByb2ctPmluc25zaSk7CiB9CiAKLXN0YXRpYyB2b2lkIHBzb2NrX3J4X2RlbGF5ZWRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKncpCitzdGF0aWMgaW50IGtjbV9yZWFkX3NvY2tfZG9uZShzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwLCBpbnQgZXJyKQogewotCWRvX3Bzb2NrX3J4X3dvcmsoY29udGFpbmVyX29mKHcsIHN0cnVjdCBrY21fcHNvY2ssCi0JCQkJICAgICAgcnhfZGVsYXllZF93b3JrLndvcmspKTsKKwlzdHJ1Y3Qga2NtX3Bzb2NrICpwc29jayA9IGNvbnRhaW5lcl9vZihzdHJwLCBzdHJ1Y3Qga2NtX3Bzb2NrLCBzdHJwKTsKKworCXVucmVzZXJ2ZV9yeF9rY20ocHNvY2ssIHRydWUpOworCisJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgcHNvY2tfdGNwX3N0YXRlX2NoYW5nZShzdHJ1Y3Qgc29jayAqc2spCitzdGF0aWMgdm9pZCBwc29ja19zdGF0ZV9jaGFuZ2Uoc3RydWN0IHNvY2sgKnNrKQogewogCS8qIFRDUCBvbmx5IGRvZXMgYSBQT0xMSU4gZm9yIGEgaGFsZiBjbG9zZS4gRG8gYSBQT0xMSFVQIGhlcmUKIAkgKiBzaW5jZSBhcHBsaWNhdGlvbiB3aWxsIG5vcm1hbGx5IG5vdCBwb2xsIHdpdGggUE9MTElOCkBAIC03MDIsNyArNDAyLDcgQEAKIAlyZXBvcnRfY3NrX2Vycm9yKHNrLCBFUElQRSk7CiB9CiAKLXN0YXRpYyB2b2lkIHBzb2NrX3RjcF93cml0ZV9zcGFjZShzdHJ1Y3Qgc29jayAqc2spCitzdGF0aWMgdm9pZCBwc29ja193cml0ZV9zcGFjZShzdHJ1Y3Qgc29jayAqc2spCiB7CiAJc3RydWN0IGtjbV9wc29jayAqcHNvY2s7CiAJc3RydWN0IGtjbV9tdXggKm11eDsKQEAgLTcxMywxNCArNDEzLDEzIEBACiAJcHNvY2sgPSAoc3RydWN0IGtjbV9wc29jayAqKXNrLT5za191c2VyX2RhdGE7CiAJaWYgKHVubGlrZWx5KCFwc29jaykpCiAJCWdvdG8gb3V0OwotCiAJbXV4ID0gcHNvY2stPm11eDsKIAogCXNwaW5fbG9ja19iaCgmbXV4LT5sb2NrKTsKIAogCS8qIENoZWNrIGlmIHRoZSBzb2NrZXQgaXMgcmVzZXJ2ZWQgc28gc29tZW9uZSBpcyB3YWl0aW5nIGZvciBzZW5kaW5nLiAqLwogCWtjbSA9IHBzb2NrLT50eF9rY207Ci0JaWYgKGtjbSkKKwlpZiAoa2NtICYmICF1bmxpa2VseShrY20tPnR4X3N0b3BwZWQpKQogCQlxdWV1ZV93b3JrKGtjbV93cSwgJmtjbS0+dHhfd29yayk7CiAKIAlzcGluX3VubG9ja19iaCgmbXV4LT5sb2NrKTsKQEAgLTE0MTEsNyArMTExMCw3IEBACiAJc3RydWN0IGtjbV9zb2NrICprY20gPSBrY21fc2soc2spOwogCWludCBlcnIgPSAwOwogCWxvbmcgdGltZW87Ci0Jc3RydWN0IGtjbV9yeF9tc2cgKnJ4bTsKKwlzdHJ1Y3Qgc3RycF9yeF9tc2cgKnJ4bTsKIAlpbnQgY29waWVkID0gMDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCkBAIC0xNDI1LDcgKzExMjQsNyBAQAogCiAJLyogT2theSwgaGF2ZSBhIG1lc3NhZ2Ugb24gdGhlIHJlY2VpdmUgcXVldWUgKi8KIAotCXJ4bSA9IGtjbV9yeF9tc2coc2tiKTsKKwlyeG0gPSBzdHJwX3J4X21zZyhza2IpOwogCiAJaWYgKGxlbiA+IHJ4bS0+ZnVsbF9sZW4pCiAJCWxlbiA9IHJ4bS0+ZnVsbF9sZW47CkBAIC0xNDgxLDcgKzExODAsNyBAQAogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBrY21fc29jayAqa2NtID0ga2NtX3NrKHNrKTsKIAlsb25nIHRpbWVvOwotCXN0cnVjdCBrY21fcnhfbXNnICpyeG07CisJc3RydWN0IHN0cnBfcnhfbXNnICpyeG07CiAJaW50IGVyciA9IDA7CiAJc3NpemVfdCBjb3BpZWQ7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTE0OTgsNyArMTE5Nyw3IEBACiAKIAkvKiBPa2F5LCBoYXZlIGEgbWVzc2FnZSBvbiB0aGUgcmVjZWl2ZSBxdWV1ZSAqLwogCi0JcnhtID0ga2NtX3J4X21zZyhza2IpOworCXJ4bSA9IHN0cnBfcnhfbXNnKHNrYik7CiAKIAlpZiAobGVuID4gcnhtLT5mdWxsX2xlbikKIAkJbGVuID0gcnhtLT5mdWxsX2xlbjsKQEAgLTE2NzQsMTUgKzEzNzMsNiBAQAogCXNwaW5fdW5sb2NrX2JoKCZtdXgtPnJ4X2xvY2spOwogfQogCi1zdGF0aWMgdm9pZCBrY21fcnhfbXNnX3RpbWVvdXQodW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGtjbV9wc29jayAqcHNvY2sgPSAoc3RydWN0IGtjbV9wc29jayAqKWFyZzsKLQotCS8qIE1lc3NhZ2UgYXNzZW1ibHkgdGltZWQgb3V0ICovCi0JS0NNX1NUQVRTX0lOQ1IocHNvY2stPnN0YXRzLnJ4X21zZ190aW1lb3V0cyk7Ci0Ja2NtX2Fib3J0X3J4X3Bzb2NrKHBzb2NrLCBFVElNRURPVVQsIE5VTEwpOwotfQotCiBzdGF0aWMgaW50IGtjbV9hdHRhY2goc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2tldCAqY3NvY2ssCiAJCSAgICAgIHN0cnVjdCBicGZfcHJvZyAqcHJvZykKIHsKQEAgLTE2OTIsMTkgKzEzODIsMTMgQEAKIAlzdHJ1Y3Qga2NtX3Bzb2NrICpwc29jayA9IE5VTEwsICp0cHNvY2s7CiAJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKIAlpbnQgaW5kZXggPSAwOwotCi0JaWYgKGNzb2NrLT5vcHMtPmZhbWlseSAhPSBQRl9JTkVUICYmCi0JICAgIGNzb2NrLT5vcHMtPmZhbWlseSAhPSBQRl9JTkVUNikKLQkJcmV0dXJuIC1FSU5WQUw7CisJc3RydWN0IHN0cnBfY2FsbGJhY2tzIGNiOworCWludCBlcnI7CiAKIAljc2sgPSBjc29jay0+c2s7CiAJaWYgKCFjc2spCiAJCXJldHVybiAtRUlOVkFMOwogCi0JLyogT25seSBzdXBwb3J0IFRDUCBmb3Igbm93ICovCi0JaWYgKGNzay0+c2tfcHJvdG9jb2wgIT0gSVBQUk9UT19UQ1ApCi0JCXJldHVybiAtRUlOVkFMOwotCiAJcHNvY2sgPSBrbWVtX2NhY2hlX3phbGxvYyhrY21fcHNvY2twLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBzb2NrKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE3MTMsMTEgKzEzOTcsMTYgQEAKIAlwc29jay0+c2sgPSBjc2s7CiAJcHNvY2stPmJwZl9wcm9nID0gcHJvZzsKIAotCXNldHVwX3RpbWVyKCZwc29jay0+cnhfbXNnX3RpbWVyLCBrY21fcnhfbXNnX3RpbWVvdXQsCi0JCSAgICAodW5zaWduZWQgbG9uZylwc29jayk7CisJY2IucmN2X21zZyA9IGtjbV9yY3Zfc3RycGFyc2VyOworCWNiLmFib3J0X3BhcnNlciA9IE5VTEw7CisJY2IucGFyc2VfbXNnID0ga2NtX3BhcnNlX2Z1bmNfc3RycGFyc2VyOworCWNiLnJlYWRfc29ja19kb25lID0ga2NtX3JlYWRfc29ja19kb25lOwogCi0JSU5JVF9XT1JLKCZwc29jay0+cnhfd29yaywgcHNvY2tfcnhfd29yayk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnBzb2NrLT5yeF9kZWxheWVkX3dvcmssIHBzb2NrX3J4X2RlbGF5ZWRfd29yayk7CisJZXJyID0gc3RycF9pbml0KCZwc29jay0+c3RycCwgY3NrLCAmY2IpOworCWlmIChlcnIpIHsKKwkJa21lbV9jYWNoZV9mcmVlKGtjbV9wc29ja3AsIHBzb2NrKTsKKwkJcmV0dXJuIGVycjsKKwl9CiAKIAlzb2NrX2hvbGQoY3NrKTsKIApAQCAtMTcyNiw5ICsxNDE1LDkgQEAKIAlwc29jay0+c2F2ZV93cml0ZV9zcGFjZSA9IGNzay0+c2tfd3JpdGVfc3BhY2U7CiAJcHNvY2stPnNhdmVfc3RhdGVfY2hhbmdlID0gY3NrLT5za19zdGF0ZV9jaGFuZ2U7CiAJY3NrLT5za191c2VyX2RhdGEgPSBwc29jazsKLQljc2stPnNrX2RhdGFfcmVhZHkgPSBwc29ja190Y3BfZGF0YV9yZWFkeTsKLQljc2stPnNrX3dyaXRlX3NwYWNlID0gcHNvY2tfdGNwX3dyaXRlX3NwYWNlOwotCWNzay0+c2tfc3RhdGVfY2hhbmdlID0gcHNvY2tfdGNwX3N0YXRlX2NoYW5nZTsKKwljc2stPnNrX2RhdGFfcmVhZHkgPSBwc29ja19kYXRhX3JlYWR5OworCWNzay0+c2tfd3JpdGVfc3BhY2UgPSBwc29ja193cml0ZV9zcGFjZTsKKwljc2stPnNrX3N0YXRlX2NoYW5nZSA9IHBzb2NrX3N0YXRlX2NoYW5nZTsKIAl3cml0ZV91bmxvY2tfYmgoJmNzay0+c2tfY2FsbGJhY2tfbG9jayk7CiAKIAkvKiBGaW5pc2hlZCBpbml0aWFsaXphdGlvbiwgbm93IGFkZCB0aGUgcHNvY2sgdG8gdGhlIE1VWC4gKi8KQEAgLTE3NTAsNyArMTQzOSw3IEBACiAJc3Bpbl91bmxvY2tfYmgoJm11eC0+bG9jayk7CiAKIAkvKiBTY2hlZHVsZSBSWCB3b3JrIGluIGNhc2UgdGhlcmUgYXJlIGFscmVhZHkgYnl0ZXMgcXVldWVkICovCi0JcXVldWVfd29yayhrY21fd3EsICZwc29jay0+cnhfd29yayk7CisJc3RycF9jaGVja19yY3YoJnBzb2NrLT5zdHJwKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTc5MCw2ICsxNDc5LDggQEAKIAlzdHJ1Y3Qgc29jayAqY3NrID0gcHNvY2stPnNrOwogCXN0cnVjdCBrY21fbXV4ICptdXggPSBwc29jay0+bXV4OwogCisJbG9ja19zb2NrKGNzayk7CisKIAkvKiBTdG9wIGdldHRpbmcgY2FsbGJhY2tzIGZyb20gVENQIHNvY2tldC4gQWZ0ZXIgdGhpcyB0aGVyZSBzaG91bGQKIAkgKiBiZSBubyB3YXkgdG8gcmVzZXJ2ZSBhIGtjbSBmb3IgdGhpcyBwc29jay4KIAkgKi8KQEAgLTE3OTgsNyArMTQ4OSw3IEBACiAJY3NrLT5za19kYXRhX3JlYWR5ID0gcHNvY2stPnNhdmVfZGF0YV9yZWFkeTsKIAljc2stPnNrX3dyaXRlX3NwYWNlID0gcHNvY2stPnNhdmVfd3JpdGVfc3BhY2U7CiAJY3NrLT5za19zdGF0ZV9jaGFuZ2UgPSBwc29jay0+c2F2ZV9zdGF0ZV9jaGFuZ2U7Ci0JcHNvY2stPnJ4X3N0b3BwZWQgPSAxOworCXN0cnBfc3RvcCgmcHNvY2stPnN0cnApOwogCiAJaWYgKFdBUk5fT04ocHNvY2stPnJ4X2tjbSkpIHsKIAkJd3JpdGVfdW5sb2NrX2JoKCZjc2stPnNrX2NhbGxiYWNrX2xvY2spOwpAQCAtMTgyMSwxOCArMTUxMiwxNyBAQAogCiAJd3JpdGVfdW5sb2NrX2JoKCZjc2stPnNrX2NhbGxiYWNrX2xvY2spOwogCi0JZGVsX3RpbWVyX3N5bmMoJnBzb2NrLT5yeF9tc2dfdGltZXIpOwotCWNhbmNlbF93b3JrX3N5bmMoJnBzb2NrLT5yeF93b3JrKTsKLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnBzb2NrLT5yeF9kZWxheWVkX3dvcmspOworCS8qIENhbGwgc3RycF9kb25lIHdpdGhvdXQgc29jayBsb2NrICovCisJcmVsZWFzZV9zb2NrKGNzayk7CisJc3RycF9kb25lKCZwc29jay0+c3RycCk7CisJbG9ja19zb2NrKGNzayk7CiAKIAlicGZfcHJvZ19wdXQocHNvY2stPmJwZl9wcm9nKTsKIAotCWtmcmVlX3NrYihwc29jay0+cnhfc2tiX2hlYWQpOwotCXBzb2NrLT5yeF9za2JfaGVhZCA9IE5VTEw7Ci0KIAlzcGluX2xvY2tfYmgoJm11eC0+bG9jayk7CiAKIAlhZ2dyZWdhdGVfcHNvY2tfc3RhdHMoJnBzb2NrLT5zdGF0cywgJm11eC0+YWdncmVnYXRlX3Bzb2NrX3N0YXRzKTsKKwlzYXZlX3N0cnBfc3RhdHMoJnBzb2NrLT5zdHJwLCAmbXV4LT5hZ2dyZWdhdGVfc3RycF9zdGF0cyk7CiAKIAlLQ01fU1RBVFNfSU5DUihtdXgtPnN0YXRzLnBzb2NrX3VuYXR0YWNoKTsKIApAQCAtMTg3NSw2ICsxNTY1LDggQEAKIAkJZnB1dChjc2stPnNrX3NvY2tldC0+ZmlsZSk7CiAJCWttZW1fY2FjaGVfZnJlZShrY21fcHNvY2twLCBwc29jayk7CiAJfQorCisJcmVsZWFzZV9zb2NrKGNzayk7CiB9CiAKIHN0YXRpYyBpbnQga2NtX3VuYXR0YWNoX2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBrY21fdW5hdHRhY2ggKmluZm8pCkBAIC0xOTE1LDYgKzE2MDcsNyBAQAogCiAJCXNwaW5fdW5sb2NrX2JoKCZtdXgtPmxvY2spOwogCisJCS8qIExvd2VyIHNvY2tldCBsb2NrIHNob3VsZCBhbHJlYWR5IGJlIGhlbGQgKi8KIAkJa2NtX3VuYXR0YWNoKHBzb2NrKTsKIAogCQllcnIgPSAwOwpAQCAtMjAyOSw3ICsxNzIyLDcgQEAKIAkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5mbywKIAkJCQkJIHNpemVvZihpbmZvKSkpIHsKIAkJCQllcnIgPSAtRUZBVUxUOwotCQkJCXNvY2tfcmVsZWFzZShuZXdzb2NrKTsKKwkJCQlzeXNfY2xvc2UoaW5mby5mZCk7CiAJCQl9CiAJCX0KIApAQCAtMjA3Miw2ICsxNzY1LDggQEAKIAlhZ2dyZWdhdGVfbXV4X3N0YXRzKCZtdXgtPnN0YXRzLCAma25ldC0+YWdncmVnYXRlX211eF9zdGF0cyk7CiAJYWdncmVnYXRlX3Bzb2NrX3N0YXRzKCZtdXgtPmFnZ3JlZ2F0ZV9wc29ja19zdGF0cywKIAkJCSAgICAgICZrbmV0LT5hZ2dyZWdhdGVfcHNvY2tfc3RhdHMpOworCWFnZ3JlZ2F0ZV9zdHJwX3N0YXRzKCZtdXgtPmFnZ3JlZ2F0ZV9zdHJwX3N0YXRzLAorCQkJICAgICAma25ldC0+YWdncmVnYXRlX3N0cnBfc3RhdHMpOwogCWxpc3RfZGVsX3JjdSgmbXV4LT5rY21fbXV4X2xpc3QpOwogCWtuZXQtPmNvdW50LS07CiAJbXV0ZXhfdW5sb2NrKCZrbmV0LT5tdXRleCk7CkBAIC0yMTUxLDYgKzE4NDYsMTMgQEAKIAkgKiBpdCB3aWxsIGp1c3QgcmV0dXJuLgogCSAqLwogCV9fc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfd3JpdGVfcXVldWUpOworCisJLyogU2V0IHR4X3N0b3BwZWQuIFRoaXMgaXMgY2hlY2tlZCB3aGVuIHBzb2NrIGlzIGJvdW5kIHRvIGEga2NtIGFuZCB3ZQorCSAqIGdldCBhIHdyaXRlc3BhY2UgY2FsbGJhY2suIFRoaXMgcHJldmVudHMgZnVydGhlciB3b3JrIGJlaW5nIHF1ZXVlZAorCSAqIGZyb20gdGhlIGNhbGxiYWNrICh1bmJpbmRpbmcgdGhlIHBzb2NrIG9jY3VycyBhZnRlciBjYW5jZWxpbmcgd29yay4KKwkgKi8KKwlrY20tPnR4X3N0b3BwZWQgPSAxOworCiAJcmVsZWFzZV9zb2NrKHNrKTsKIAogCXNwaW5fbG9ja19iaCgmbXV4LT5sb2NrKTsKZGlmZiAtLWdpdCBhL25ldC9sMnRwL2wydHBfY29yZS5jIGIvbmV0L2wydHAvbDJ0cF9jb3JlLmMKaW5kZXggMWU0MGRhYy4uYTJlZDNiZCAxMDA2NDQKLS0tIGEvbmV0L2wydHAvbDJ0cF9jb3JlLmMKKysrIGIvbmV0L2wydHAvbDJ0cF9jb3JlLmMKQEAgLTE4NTUsNiArMTg1NSw5IEBACiAJCSh2b2lkKWwydHBfdHVubmVsX2RlbGV0ZSh0dW5uZWwpOwogCX0KIAlyY3VfcmVhZF91bmxvY2tfYmgoKTsKKworCWZsdXNoX3dvcmtxdWV1ZShsMnRwX3dxKTsKKwlyY3VfYmFycmllcigpOwogfQogCiBzdGF0aWMgc3RydWN0IHBlcm5ldF9vcGVyYXRpb25zIGwydHBfbmV0X29wcyA9IHsKZGlmZiAtLWdpdCBhL25ldC9sMnRwL2wydHBfY29yZS5oIGIvbmV0L2wydHAvbDJ0cF9jb3JlLmgKaW5kZXggNTg3MTUzNy4uMjU5OWFmNiAxMDA2NDQKLS0tIGEvbmV0L2wydHAvbDJ0cF9jb3JlLmgKKysrIGIvbmV0L2wydHAvbDJ0cF9jb3JlLmgKQEAgLTEzOSw3ICsxMzksNyBAQAogCXZvaWQgKCpzZXNzaW9uX2Nsb3NlKShzdHJ1Y3QgbDJ0cF9zZXNzaW9uICpzZXNzaW9uKTsKIAl2b2lkICgqcmVmKShzdHJ1Y3QgbDJ0cF9zZXNzaW9uICpzZXNzaW9uKTsKIAl2b2lkICgqZGVyZWYpKHN0cnVjdCBsMnRwX3Nlc3Npb24gKnNlc3Npb24pOwotI2lmIGRlZmluZWQoQ09ORklHX0wyVFBfREVCVUdGUykgfHwgZGVmaW5lZChDT05GSUdfTDJUUF9ERUJVR0ZTX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19MMlRQX0RFQlVHRlMpCiAJdm9pZCAoKnNob3cpKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcHJpdik7CiAjZW5kaWYKIAl1aW50OF90CQkJcHJpdlswXTsJLyogcHJpdmF0ZSBkYXRhICovCmRpZmYgLS1naXQgYS9uZXQvbDJ0cC9sMnRwX2V0aC5jIGIvbmV0L2wydHAvbDJ0cF9ldGguYwppbmRleCA1N2ZjNWE0Li45NjVmN2UzIDEwMDY0NAotLS0gYS9uZXQvbDJ0cC9sMnRwX2V0aC5jCisrKyBiL25ldC9sMnRwL2wydHBfZXRoLmMKQEAgLTEyMSw3ICsxMjEsNyBAQAogfQogCiAKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgbDJ0cF9ldGhfbmV0ZGV2X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgbDJ0cF9ldGhfbmV0ZGV2X29wcyA9IHsKIAkubmRvX2luaXQJCT0gbDJ0cF9ldGhfZGV2X2luaXQsCiAJLm5kb191bmluaXQJCT0gbDJ0cF9ldGhfZGV2X3VuaW5pdCwKIAkubmRvX3N0YXJ0X3htaXQJCT0gbDJ0cF9ldGhfZGV2X3htaXQsCkBAIC0xOTUsNyArMTk1LDcgQEAKIAl9CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19MMlRQX0RFQlVHRlMpIHx8IGRlZmluZWQoQ09ORklHX0wyVFBfREVCVUdGU19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTDJUUF9ERUJVR0ZTKQogc3RhdGljIHZvaWQgbDJ0cF9ldGhfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgbDJ0cF9zZXNzaW9uICpzZXNzaW9uID0gYXJnOwpAQCAtMjY4LDcgKzI2OCw3IEBACiAJcHJpdi0+dHVubmVsX3NvY2sgPSB0dW5uZWwtPnNvY2s7CiAJc2Vzc2lvbi0+cmVjdl9za2IgPSBsMnRwX2V0aF9kZXZfcmVjdjsKIAlzZXNzaW9uLT5zZXNzaW9uX2Nsb3NlID0gbDJ0cF9ldGhfZGVsZXRlOwotI2lmIGRlZmluZWQoQ09ORklHX0wyVFBfREVCVUdGUykgfHwgZGVmaW5lZChDT05GSUdfTDJUUF9ERUJVR0ZTX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19MMlRQX0RFQlVHRlMpCiAJc2Vzc2lvbi0+c2hvdyA9IGwydHBfZXRoX3Nob3c7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbmV0L2wydHAvbDJ0cF9uZXRsaW5rLmMgYi9uZXQvbDJ0cC9sMnRwX25ldGxpbmsuYwppbmRleCAxZDAyZThkLi5iZjMxMTc3IDEwMDY0NAotLS0gYS9uZXQvbDJ0cC9sMnRwX25ldGxpbmsuYworKysgYi9uZXQvbDJ0cC9sMnRwX25ldGxpbmsuYwpAQCAtODY3LDcgKzg2Nyw3IEBACiAJcmV0dXJuIHNrYi0+bGVuOwogfQogCi1zdGF0aWMgc3RydWN0IG5sYV9wb2xpY3kgbDJ0cF9ubF9wb2xpY3lbTDJUUF9BVFRSX01BWCArIDFdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IGwydHBfbmxfcG9saWN5W0wyVFBfQVRUUl9NQVggKyAxXSA9IHsKIAlbTDJUUF9BVFRSX05PTkVdCQk9IHsgLnR5cGUgPSBOTEFfVU5TUEVDLCB9LAogCVtMMlRQX0FUVFJfUFdfVFlQRV0JCT0geyAudHlwZSA9IE5MQV9VMTYsIH0sCiAJW0wyVFBfQVRUUl9FTkNBUF9UWVBFXQkJPSB7IC50eXBlID0gTkxBX1UxNiwgfSwKZGlmZiAtLWdpdCBhL25ldC9sMnRwL2wydHBfcHBwLmMgYi9uZXQvbDJ0cC9sMnRwX3BwcC5jCmluZGV4IGQ5NTYwYWEuLjQxZDQ3YmYgMTAwNjQ0Ci0tLSBhL25ldC9sMnRwL2wydHBfcHBwLmMKKysrIGIvbmV0L2wydHAvbDJ0cF9wcHAuYwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgMikpCiAJCXJldHVybiAxOwogCi0JaWYgKChza2ItPmRhdGFbMF0gPT0gMHhmZikgJiYgKHNrYi0+ZGF0YVsxXSA9PSAweDAzKSkKKwlpZiAoKHNrYi0+ZGF0YVswXSA9PSBQUFBfQUxMU1RBVElPTlMpICYmIChza2ItPmRhdGFbMV0gPT0gUFBQX1VJKSkKIAkJc2tiX3B1bGwoc2tiLCAyKTsKIAogCXJldHVybiAwOwpAQCAtMjgyLDcgKzI4Miw2IEBACiBzdGF0aWMgaW50IHBwcG9sMnRwX3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbSwKIAkJCSAgICBzaXplX3QgdG90YWxfbGVuKQogewotCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBwcGhbMl0gPSB7IDB4ZmYsIDB4MDMgfTsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCBlcnJvcjsKQEAgLTMxMiw3ICszMTEsNyBAQAogCWVycm9yID0gLUVOT01FTTsKIAlza2IgPSBzb2NrX3dtYWxsb2Moc2ssIE5FVF9TS0JfUEFEICsgc2l6ZW9mKHN0cnVjdCBpcGhkcikgKwogCQkJICAgdWhsZW4gKyBzZXNzaW9uLT5oZHJfbGVuICsKLQkJCSAgIHNpemVvZihwcHBoKSArIHRvdGFsX2xlbiwKKwkJCSAgIDIgKyB0b3RhbF9sZW4sIC8qIDIgYnl0ZXMgZm9yIFBQUF9BTExTVEFUSU9OUyAmIFBQUF9VSSAqLwogCQkJICAgMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFza2IpCiAJCWdvdG8gZXJyb3JfcHV0X3Nlc3NfdHVuOwpAQCAtMzI1LDggKzMyNCw4IEBACiAJc2tiX3Jlc2VydmUoc2tiLCB1aGxlbik7CiAKIAkvKiBBZGQgUFBQIGhlYWRlciAqLwotCXNrYi0+ZGF0YVswXSA9IHBwcGhbMF07Ci0Jc2tiLT5kYXRhWzFdID0gcHBwaFsxXTsKKwlza2ItPmRhdGFbMF0gPSBQUFBfQUxMU1RBVElPTlM7CisJc2tiLT5kYXRhWzFdID0gUFBQX1VJOwogCXNrYl9wdXQoc2tiLCAyKTsKIAogCS8qIENvcHkgdXNlciBkYXRhIGludG8gc2tiICovCkBAIC0zNjksNyArMzY4LDYgQEAKICAqLwogc3RhdGljIGludCBwcHBvbDJ0cF94bWl0KHN0cnVjdCBwcHBfY2hhbm5lbCAqY2hhbiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdGF0aWMgY29uc3QgdTggcHBwaFsyXSA9IHsgMHhmZiwgMHgwMyB9OwogCXN0cnVjdCBzb2NrICpzayA9IChzdHJ1Y3Qgc29jayAqKSBjaGFuLT5wcml2YXRlOwogCXN0cnVjdCBzb2NrICpza190dW47CiAJc3RydWN0IGwydHBfc2Vzc2lvbiAqc2Vzc2lvbjsKQEAgLTM5OCwxNCArMzk2LDE0IEBACiAJCSAgIHNpemVvZihzdHJ1Y3QgaXBoZHIpICsgLyogSVAgaGVhZGVyICovCiAJCSAgIHVobGVuICsJCS8qIFVEUCBoZWFkZXIgKGlmIEwyVFBfRU5DQVBUWVBFX1VEUCkgKi8KIAkJICAgc2Vzc2lvbi0+aGRyX2xlbiArCS8qIEwyVFAgaGVhZGVyICovCi0JCSAgIHNpemVvZihwcHBoKTsJLyogUFBQIGhlYWRlciAqLworCQkgICAyOwkJCS8qIDIgYnl0ZXMgZm9yIFBQUF9BTExTVEFUSU9OUyAmIFBQUF9VSSAqLwogCWlmIChza2JfY293X2hlYWQoc2tiLCBoZWFkcm9vbSkpCiAJCWdvdG8gYWJvcnRfcHV0X3Nlc3NfdHVuOwogCiAJLyogU2V0dXAgUFBQIGhlYWRlciAqLwotCV9fc2tiX3B1c2goc2tiLCBzaXplb2YocHBwaCkpOwotCXNrYi0+ZGF0YVswXSA9IHBwcGhbMF07Ci0Jc2tiLT5kYXRhWzFdID0gcHBwaFsxXTsKKwlfX3NrYl9wdXNoKHNrYiwgMik7CisJc2tiLT5kYXRhWzBdID0gUFBQX0FMTFNUQVRJT05TOworCXNrYi0+ZGF0YVsxXSA9IFBQUF9VSTsKIAogCWxvY2FsX2JoX2Rpc2FibGUoKTsKIAlsMnRwX3htaXRfc2tiKHNlc3Npb24sIHNrYiwgc2Vzc2lvbi0+aGRyX2xlbik7CkBAIC00NDAsNyArNDM4LDcgQEAKIAlCVUdfT04oc2Vzc2lvbi0+bWFnaWMgIT0gTDJUUF9TRVNTSU9OX01BR0lDKTsKIAogCWlmIChzb2NrKSB7Ci0JCWluZXRfc2h1dGRvd24oc29jaywgMik7CisJCWluZXRfc2h1dGRvd24oc29jaywgU0VORF9TSFVURE9XTik7CiAJCS8qIERvbid0IGxldCB0aGUgc2Vzc2lvbiBnbyBhd2F5IGJlZm9yZSBvdXIgc29ja2V0IGRvZXMgKi8KIAkJbDJ0cF9zZXNzaW9uX2luY19yZWZjb3VudChzZXNzaW9uKTsKIAl9CkBAIC01NTQsNyArNTUyLDcgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19MMlRQX0RFQlVHRlMpIHx8IGRlZmluZWQoQ09ORklHX0wyVFBfREVCVUdGU19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTDJUUF9ERUJVR0ZTKQogc3RhdGljIHZvaWQgcHBwb2wydHBfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgbDJ0cF9zZXNzaW9uICpzZXNzaW9uID0gYXJnOwpAQCAtNzI1LDcgKzcyMyw3IEBACiAKIAlzZXNzaW9uLT5yZWN2X3NrYgk9IHBwcG9sMnRwX3JlY3Y7CiAJc2Vzc2lvbi0+c2Vzc2lvbl9jbG9zZQk9IHBwcG9sMnRwX3Nlc3Npb25fY2xvc2U7Ci0jaWYgZGVmaW5lZChDT05GSUdfTDJUUF9ERUJVR0ZTKSB8fCBkZWZpbmVkKENPTkZJR19MMlRQX0RFQlVHRlNfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0wyVFBfREVCVUdGUykKIAlzZXNzaW9uLT5zaG93CQk9IHBwcG9sMnRwX3Nob3c7CiAjZW5kaWYKIApAQCAtODU2LDcgKzg1NCw3IEBACiAJZXJyb3IgPSAtRU5PVENPTk47CiAJaWYgKHNrID09IE5VTEwpCiAJCWdvdG8gZW5kOwotCWlmIChzay0+c2tfc3RhdGUgIT0gUFBQT1hfQ09OTkVDVEVEKQorCWlmICghKHNrLT5za19zdGF0ZSAmIFBQUE9YX0NPTk5FQ1RFRCkpCiAJCWdvdG8gZW5kOwogCiAJZXJyb3IgPSAtRUJBREY7CmRpZmYgLS1naXQgYS9uZXQvbDNtZGV2L2wzbWRldi5jIGIvbmV0L2wzbWRldi9sM21kZXYuYwppbmRleCBjNGExYzNlLi44ZGE4NmNlIDEwMDY0NAotLS0gYS9uZXQvbDNtZGV2L2wzbWRldi5jCisrKyBiL25ldC9sM21kZXYvbDNtZGV2LmMKQEAgLTEwMCwxNSArMTAwLDE0IEBACiBFWFBPUlRfU1lNQk9MX0dQTChsM21kZXZfZmliX3RhYmxlX2J5X2luZGV4KTsKIAogLyoqCi0gKglsM21kZXZfZ2V0X3J0Nl9kc3QgLSBJUHY2IHJvdXRlIGxvb2t1cCBiYXNlZCBvbiBmbG93LiBSZXR1cm5zCi0gKgkJCSAgICAgY2FjaGVkIHJvdXRlIGZvciBMMyBtYXN0ZXIgZGV2aWNlIGlmIHJlbGV2YW50Ci0gKgkJCSAgICAgdG8gZmxvdworICoJbDNtZGV2X2xpbmtfc2NvcGVfbG9va3VwIC0gSVB2NiByb3V0ZSBsb29rdXAgYmFzZWQgb24gZmxvdyBmb3IgbGluaworICoJCQkgICAgIGxvY2FsIGFuZCBtdWx0aWNhc3QgYWRkcmVzc2VzCiAgKglAbmV0OiBuZXR3b3JrIG5hbWVzcGFjZSBmb3IgZGV2aWNlIGluZGV4IGxvb2t1cAogICoJQGZsNjogSVB2NiBmbG93IHN0cnVjdCBmb3IgbG9va3VwCiAgKi8KIAotc3RydWN0IGRzdF9lbnRyeSAqbDNtZGV2X2dldF9ydDZfZHN0KHN0cnVjdCBuZXQgKm5ldCwKLQkJCQkgICAgIHN0cnVjdCBmbG93aTYgKmZsNikKK3N0cnVjdCBkc3RfZW50cnkgKmwzbWRldl9saW5rX3Njb3BlX2xvb2t1cChzdHJ1Y3QgbmV0ICpuZXQsCisJCQkJCSAgIHN0cnVjdCBmbG93aTYgKmZsNikKIHsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBOVUxMOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CkBAIC0xMjEsNzAgKzEyMCwxNSBAQAogCQkJZGV2ID0gbmV0ZGV2X21hc3Rlcl91cHBlcl9kZXZfZ2V0X3JjdShkZXYpOwogCiAJCWlmIChkZXYgJiYgbmV0aWZfaXNfbDNfbWFzdGVyKGRldikgJiYKLQkJICAgIGRldi0+bDNtZGV2X29wcy0+bDNtZGV2X2dldF9ydDZfZHN0KQotCQkJZHN0ID0gZGV2LT5sM21kZXZfb3BzLT5sM21kZXZfZ2V0X3J0Nl9kc3QoZGV2LCBmbDYpOworCQkgICAgZGV2LT5sM21kZXZfb3BzLT5sM21kZXZfbGlua19zY29wZV9sb29rdXApCisJCQlkc3QgPSBkZXYtPmwzbWRldl9vcHMtPmwzbWRldl9saW5rX3Njb3BlX2xvb2t1cChkZXYsIGZsNik7CiAKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJfQogCiAJcmV0dXJuIGRzdDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGwzbWRldl9nZXRfcnQ2X2RzdCk7Ci0KLS8qKgotICoJbDNtZGV2X2dldF9zYWRkciAtIGdldCBzb3VyY2UgYWRkcmVzcyBmb3IgYSBmbG93IGJhc2VkIG9uIGFuIGludGVyZmFjZQotICoJCQkgICBlbnNsYXZlZCB0byBhbiBMMyBtYXN0ZXIgZGV2aWNlCi0gKglAbmV0OiBuZXR3b3JrIG5hbWVzcGFjZSBmb3IgZGV2aWNlIGluZGV4IGxvb2t1cAotICoJQGlmaW5kZXg6IEludGVyZmFjZSBpbmRleAotICoJQGZsNDogSVB2NCBmbG93IHN0cnVjdAotICovCi0KLWludCBsM21kZXZfZ2V0X3NhZGRyKHN0cnVjdCBuZXQgKm5ldCwgaW50IGlmaW5kZXgsIHN0cnVjdCBmbG93aTQgKmZsNCkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotCWludCByYyA9IDA7Ci0KLQlpZiAoaWZpbmRleCkgewotCQlyY3VfcmVhZF9sb2NrKCk7Ci0KLQkJZGV2ID0gZGV2X2dldF9ieV9pbmRleF9yY3UobmV0LCBpZmluZGV4KTsKLQkJaWYgKGRldiAmJiBuZXRpZl9pc19sM19zbGF2ZShkZXYpKQotCQkJZGV2ID0gbmV0ZGV2X21hc3Rlcl91cHBlcl9kZXZfZ2V0X3JjdShkZXYpOwotCi0JCWlmIChkZXYgJiYgbmV0aWZfaXNfbDNfbWFzdGVyKGRldikgJiYKLQkJICAgIGRldi0+bDNtZGV2X29wcy0+bDNtZGV2X2dldF9zYWRkcikKLQkJCXJjID0gZGV2LT5sM21kZXZfb3BzLT5sM21kZXZfZ2V0X3NhZGRyKGRldiwgZmw0KTsKLQotCQlyY3VfcmVhZF91bmxvY2soKTsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChsM21kZXZfZ2V0X3NhZGRyKTsKLQotaW50IGwzbWRldl9nZXRfc2FkZHI2KHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IHNvY2sgKnNrLAotCQkgICAgICBzdHJ1Y3QgZmxvd2k2ICpmbDYpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKGZsNi0+Zmxvd2k2X29pZikgewotCQlyY3VfcmVhZF9sb2NrKCk7Ci0KLQkJZGV2ID0gZGV2X2dldF9ieV9pbmRleF9yY3UobmV0LCBmbDYtPmZsb3dpNl9vaWYpOwotCQlpZiAoZGV2ICYmIG5ldGlmX2lzX2wzX3NsYXZlKGRldikpCi0JCQlkZXYgPSBuZXRkZXZfbWFzdGVyX3VwcGVyX2Rldl9nZXRfcmN1KGRldik7Ci0KLQkJaWYgKGRldiAmJiBuZXRpZl9pc19sM19tYXN0ZXIoZGV2KSAmJgotCQkgICAgZGV2LT5sM21kZXZfb3BzLT5sM21kZXZfZ2V0X3NhZGRyNikKLQkJCXJjID0gZGV2LT5sM21kZXZfb3BzLT5sM21kZXZfZ2V0X3NhZGRyNihkZXYsIHNrLCBmbDYpOwotCi0JCXJjdV9yZWFkX3VubG9jaygpOwotCX0KLQotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGwzbWRldl9nZXRfc2FkZHI2KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGwzbWRldl9saW5rX3Njb3BlX2xvb2t1cCk7CiAKIC8qKgogICoJbDNtZGV2X2ZpYl9ydWxlX21hdGNoIC0gRGV0ZXJtaW5lIGlmIGZsb3dpIHJlZmVyZW5jZXMgYW4KQEAgLTIyMiwzICsxNjYsMzggQEAKIAogCXJldHVybiByYzsKIH0KKwordm9pZCBsM21kZXZfdXBkYXRlX2Zsb3coc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgZmxvd2kgKmZsKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGlmaW5kZXg7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwlpZiAoZmwtPmZsb3dpX29pZikgeworCQlkZXYgPSBkZXZfZ2V0X2J5X2luZGV4X3JjdShuZXQsIGZsLT5mbG93aV9vaWYpOworCQlpZiAoZGV2KSB7CisJCQlpZmluZGV4ID0gbDNtZGV2X21hc3Rlcl9pZmluZGV4X3JjdShkZXYpOworCQkJaWYgKGlmaW5kZXgpIHsKKwkJCQlmbC0+Zmxvd2lfb2lmID0gaWZpbmRleDsKKwkJCQlmbC0+Zmxvd2lfZmxhZ3MgfD0gRkxPV0lfRkxBR19TS0lQX05IX09JRjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCX0KKworCWlmIChmbC0+Zmxvd2lfaWlmKSB7CisJCWRldiA9IGRldl9nZXRfYnlfaW5kZXhfcmN1KG5ldCwgZmwtPmZsb3dpX2lpZik7CisJCWlmIChkZXYpIHsKKwkJCWlmaW5kZXggPSBsM21kZXZfbWFzdGVyX2lmaW5kZXhfcmN1KGRldik7CisJCQlpZiAoaWZpbmRleCkgeworCQkJCWZsLT5mbG93aV9paWYgPSBpZmluZGV4OworCQkJCWZsLT5mbG93aV9mbGFncyB8PSBGTE9XSV9GTEFHX1NLSVBfTkhfT0lGOworCQkJfQorCQl9CisJfQorCitvdXQ6CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChsM21kZXZfdXBkYXRlX2Zsb3cpOwpkaWZmIC0tZ2l0IGEvbmV0L2xsYy9hZl9sbGMuYyBiL25ldC9sbGMvYWZfbGxjLmMKaW5kZXggOGFlM2VkOS4uZGI5MTZjZiAxMDA2NDQKLS0tIGEvbmV0L2xsYy9hZl9sbGMuYworKysgYi9uZXQvbGxjL2FmX2xsYy5jCkBAIC0zOCw3ICszOCw3IEBACiBzdGF0aWMgc3RydWN0IHNvY2thZGRyX2xsYyBsbGNfdWlfYWRkcm51bGw7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHByb3RvX29wcyBsbGNfdWlfb3BzOwogCi1zdGF0aWMgbG9uZyBsbGNfdWlfd2FpdF9mb3JfY29ubihzdHJ1Y3Qgc29jayAqc2ssIGxvbmcgdGltZW91dCk7CitzdGF0aWMgYm9vbCBsbGNfdWlfd2FpdF9mb3JfY29ubihzdHJ1Y3Qgc29jayAqc2ssIGxvbmcgdGltZW91dCk7CiBzdGF0aWMgaW50IGxsY191aV93YWl0X2Zvcl9kaXNjKHN0cnVjdCBzb2NrICpzaywgbG9uZyB0aW1lb3V0KTsKIHN0YXRpYyBpbnQgbGxjX3VpX3dhaXRfZm9yX2J1c3lfY29yZShzdHJ1Y3Qgc29jayAqc2ssIGxvbmcgdGltZW91dCk7CiAKQEAgLTU1MSw3ICs1NTEsNyBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGxvbmcgbGxjX3VpX3dhaXRfZm9yX2Nvbm4oc3RydWN0IHNvY2sgKnNrLCBsb25nIHRpbWVvdXQpCitzdGF0aWMgYm9vbCBsbGNfdWlfd2FpdF9mb3JfY29ubihzdHJ1Y3Qgc29jayAqc2ssIGxvbmcgdGltZW91dCkKIHsKIAlERUZJTkVfV0FJVCh3YWl0KTsKIApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2FnZy1yeC5jIGIvbmV0L21hYzgwMjExL2FnZy1yeC5jCmluZGV4IGE5YWZmNjAuLmY2NzQ5ZGMgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9hZ2ctcnguYworKysgYi9uZXQvbWFjODAyMTEvYWdnLXJ4LmMKQEAgLTI2MSwxMCArMjYxLDE2IEBACiAJCS50aW1lb3V0ID0gdGltZW91dCwKIAkJLnNzbiA9IHN0YXJ0X3NlcV9udW0sCiAJfTsKLQogCWludCBpLCByZXQgPSAtRU9QTk9UU1VQUDsKIAl1MTYgc3RhdHVzID0gV0xBTl9TVEFUVVNfUkVRVUVTVF9ERUNMSU5FRDsKIAorCWlmICh0aWQgPj0gSUVFRTgwMjExX0ZJUlNUX1RTUEVDX1RTSUQpIHsKKwkJaHRfZGJnKHN0YS0+c2RhdGEsCisJCSAgICAgICAiU1RBICVwTSByZXF1ZXN0cyBCQSBzZXNzaW9uIG9uIHVuc3VwcG9ydGVkIHRpZCAlZFxuIiwKKwkJICAgICAgIHN0YS0+c3RhLmFkZHIsIHRpZCk7CisJCWdvdG8gZW5kX25vX2xvY2s7CisJfQorCiAJaWYgKCFzdGEtPnN0YS5odF9jYXAuaHRfc3VwcG9ydGVkKSB7CiAJCWh0X2RiZyhzdGEtPnNkYXRhLAogCQkgICAgICAgIlNUQSAlcE0gZXJyb25lb3VzbHkgcmVxdWVzdHMgQkEgc2Vzc2lvbiBvbiB0aWQgJWQgdy9vIFFvU1xuIiwKQEAgLTI5OCwxMCArMzA0LDEzIEBACiAJCWJ1Zl9zaXplID0gSUVFRTgwMjExX01BWF9BTVBEVV9CVUY7CiAKIAkvKiBtYWtlIHN1cmUgdGhlIHNpemUgZG9lc24ndCBleGNlZWQgdGhlIG1heGltdW0gc3VwcG9ydGVkIGJ5IHRoZSBodyAqLwotCWlmIChidWZfc2l6ZSA+IGxvY2FsLT5ody5tYXhfcnhfYWdncmVnYXRpb25fc3ViZnJhbWVzKQotCQlidWZfc2l6ZSA9IGxvY2FsLT5ody5tYXhfcnhfYWdncmVnYXRpb25fc3ViZnJhbWVzOworCWlmIChidWZfc2l6ZSA+IHN0YS0+c3RhLm1heF9yeF9hZ2dyZWdhdGlvbl9zdWJmcmFtZXMpCisJCWJ1Zl9zaXplID0gc3RhLT5zdGEubWF4X3J4X2FnZ3JlZ2F0aW9uX3N1YmZyYW1lczsKIAlwYXJhbXMuYnVmX3NpemUgPSBidWZfc2l6ZTsKIAorCWh0X2RiZyhzdGEtPnNkYXRhLCAiQWRkQkEgUmVxIGJ1Zl9zaXplPSVkIGZvciAlcE1cbiIsCisJICAgICAgIGJ1Zl9zaXplLCBzdGEtPnN0YS5hZGRyKTsKKwogCS8qIGV4YW1pbmUgc3RhdGUgbWFjaGluZSAqLwogCW11dGV4X2xvY2soJnN0YS0+YW1wZHVfbWxtZS5tdHgpOwogCkBAIC00MDYsOCArNDE1LDEwIEBACiAJfQogCiBlbmQ6Ci0JaWYgKHN0YXR1cyA9PSBXTEFOX1NUQVRVU19TVUNDRVNTKQorCWlmIChzdGF0dXMgPT0gV0xBTl9TVEFUVVNfU1VDQ0VTUykgewogCQlfX3NldF9iaXQodGlkLCBzdGEtPmFtcGR1X21sbWUuYWdnX3Nlc3Npb25fdmFsaWQpOworCQlfX2NsZWFyX2JpdCh0aWQsIHN0YS0+YW1wZHVfbWxtZS51bmV4cGVjdGVkX2FnZyk7CisJfQogCW11dGV4X3VubG9jaygmc3RhLT5hbXBkdV9tbG1lLm10eCk7CiAKIGVuZF9ub19sb2NrOgpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2FnZy10eC5jIGIvbmV0L21hYzgwMjExL2FnZy10eC5jCmluZGV4IDU2NTBjNDYuLjQ1MzE5Y2MgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9hZ2ctdHguYworKysgYi9uZXQvbWFjODAyMTEvYWdnLXR4LmMKQEAgLTU4NCw2ICs1ODQsOSBAQAogCSAgICBpZWVlODAyMTFfaHdfY2hlY2soJmxvY2FsLT5odywgVFhfQU1QRFVfU0VUVVBfSU5fSFcpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWlmIChXQVJOX09OKHRpZCA+PSBJRUVFODAyMTFfRklSU1RfVFNQRUNfVFNJRCkpCisJCXJldHVybiAtRUlOVkFMOworCiAJaHRfZGJnKHNkYXRhLCAiT3BlbiBCQSBzZXNzaW9uIHJlcXVlc3RlZCBmb3IgJXBNIHRpZCAldVxuIiwKIAkgICAgICAgcHVic3RhLT5hZGRyLCB0aWQpOwogCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvY2ZnLmMgYi9uZXQvbWFjODAyMTEvY2ZnLmMKaW5kZXggNDdlOTlhYjguLmZkNjU0MWYgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9jZmcuYworKysgYi9uZXQvbWFjODAyMTEvY2ZnLmMKQEAgLTMsNiArMyw3IEBACiAgKgogICogQ29weXJpZ2h0IDIwMDYtMjAxMAlKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgogICogQ29weXJpZ2h0IDIwMTMtMjAxNSAgSW50ZWwgTW9iaWxlIENvbW11bmljYXRpb25zIEdtYkgKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEludGVsIERldXRzY2hsYW5kIEdtYkgKICAqCiAgKiBUaGlzIGZpbGUgaXMgR1BMdjIgYXMgZm91bmQgaW4gQ09QWUlORy4KICAqLwpAQCAtMzksNyArNDAsNyBAQAogCiAJaWYgKHR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUiAmJiBmbGFncykgewogCQlzZGF0YSA9IElFRUU4MDIxMV9XREVWX1RPX1NVQl9JRih3ZGV2KTsKLQkJc2RhdGEtPnUubW50cl9mbGFncyA9ICpmbGFnczsKKwkJc2RhdGEtPnUubW50ci5mbGFncyA9ICpmbGFnczsKIAl9CiAKIAlyZXR1cm4gd2RldjsKQEAgLTczLDggKzc0LDI5IEBACiAJCXNkYXRhLT51Lm1nZC51c2VfNGFkZHIgPSBwYXJhbXMtPnVzZV80YWRkcjsKIAl9CiAKLQlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IgJiYgZmxhZ3MpIHsKKwlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IpIHsKIAkJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKm1vbml0b3Jfc2RhdGE7CisJCXUzMiBtdV9tbnRyX2NhcF9mbGFnID0gTkw4MDIxMV9FWFRfRkVBVFVSRV9NVV9NSU1PX0FJUl9TTklGRkVSOworCisJCW1vbml0b3Jfc2RhdGEgPSBydG5sX2RlcmVmZXJlbmNlKGxvY2FsLT5tb25pdG9yX3NkYXRhKTsKKwkJaWYgKG1vbml0b3Jfc2RhdGEgJiYKKwkJICAgIHdpcGh5X2V4dF9mZWF0dXJlX2lzc2V0KHdpcGh5LCBtdV9tbnRyX2NhcF9mbGFnKSkgeworCQkJbWVtY3B5KG1vbml0b3Jfc2RhdGEtPnZpZi5ic3NfY29uZi5tdV9ncm91cC5tZW1iZXJzaGlwLAorCQkJICAgICAgIHBhcmFtcy0+dmh0X211bWltb19ncm91cHMsIFdMQU5fTUVNQkVSU0hJUF9MRU4pOworCQkJbWVtY3B5KG1vbml0b3Jfc2RhdGEtPnZpZi5ic3NfY29uZi5tdV9ncm91cC5wb3NpdGlvbiwKKwkJCSAgICAgICBwYXJhbXMtPnZodF9tdW1pbW9fZ3JvdXBzICsgV0xBTl9NRU1CRVJTSElQX0xFTiwKKwkJCSAgICAgICBXTEFOX1VTRVJfUE9TSVRJT05fTEVOKTsKKwkJCW1vbml0b3Jfc2RhdGEtPnZpZi5tdV9taW1vX293bmVyID0gdHJ1ZTsKKwkJCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KG1vbml0b3Jfc2RhdGEsCisJCQkJCQkJIEJTU19DSEFOR0VEX01VX0dST1VQUyk7CisKKwkJCWV0aGVyX2FkZHJfY29weShtb25pdG9yX3NkYXRhLT51Lm1udHIubXVfZm9sbG93X2FkZHIsCisJCQkJCXBhcmFtcy0+bWFjYWRkcik7CisJCX0KKworCQlpZiAoIWZsYWdzKQorCQkJcmV0dXJuIDA7CiAKIAkJaWYgKGllZWU4MDIxMV9zZGF0YV9ydW5uaW5nKHNkYXRhKSkgewogCQkJdTMyIG1hc2sgPSBNT05JVE9SX0ZMQUdfQ09PS19GUkFNRVMgfApAQCAtODksMTEgKzExMSwxMSBAQAogCQkJICoJY29va2VkX21udHJzLCBtb25pdG9yIGFuZCBhbGwgZmlmXyogY291bnRlcnMKIAkJCSAqCXJlY29uZmlndXJlIGhhcmR3YXJlCiAJCQkgKi8KLQkJCWlmICgoKmZsYWdzICYgbWFzaykgIT0gKHNkYXRhLT51Lm1udHJfZmxhZ3MgJiBtYXNrKSkKKwkJCWlmICgoKmZsYWdzICYgbWFzaykgIT0gKHNkYXRhLT51Lm1udHIuZmxhZ3MgJiBtYXNrKSkKIAkJCQlyZXR1cm4gLUVCVVNZOwogCiAJCQlpZWVlODAyMTFfYWRqdXN0X21vbml0b3JfZmxhZ3Moc2RhdGEsIC0xKTsKLQkJCXNkYXRhLT51Lm1udHJfZmxhZ3MgPSAqZmxhZ3M7CisJCQlzZGF0YS0+dS5tbnRyLmZsYWdzID0gKmZsYWdzOwogCQkJaWVlZTgwMjExX2FkanVzdF9tb25pdG9yX2ZsYWdzKHNkYXRhLCAxKTsKIAogCQkJaWVlZTgwMjExX2NvbmZpZ3VyZV9maWx0ZXIobG9jYWwpOwpAQCAtMTAzLDcgKzEyNSw3IEBACiAJCQkgKiBhbmQgaWVlZTgwMjExX2RvX29wZW4gdGFrZSBjYXJlIG9mICJldmVyeXRoaW5nIgogCQkJICogbWVudGlvbmVkIGluIHRoZSBjb21tZW50IGFib3ZlLgogCQkJICovCi0JCQlzZGF0YS0+dS5tbnRyX2ZsYWdzID0gKmZsYWdzOworCQkJc2RhdGEtPnUubW50ci5mbGFncyA9ICpmbGFnczsKIAkJfQogCX0KIApAQCAtMTMxLDYgKzE1MywxNDkgQEAKIAlpZWVlODAyMTFfc2RhdGFfc3RvcChJRUVFODAyMTFfV0RFVl9UT19TVUJfSUYod2RldikpOwogfQogCitzdGF0aWMgaW50IGllZWU4MDIxMV9zdGFydF9uYW4oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCSAgICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJICAgICAgIHN0cnVjdCBjZmc4MDIxMV9uYW5fY29uZiAqY29uZikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9XREVWX1RPX1NVQl9JRih3ZGV2KTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmc2RhdGEtPmxvY2FsLT5jaGFuY3R4X210eCk7CisJcmV0ID0gaWVlZTgwMjExX2NoZWNrX2NvbWJpbmF0aW9ucyhzZGF0YSwgTlVMTCwgMCwgMCk7CisJbXV0ZXhfdW5sb2NrKCZzZGF0YS0+bG9jYWwtPmNoYW5jdHhfbXR4KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGllZWU4MDIxMV9kb19vcGVuKHdkZXYsIHRydWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBkcnZfc3RhcnRfbmFuKHNkYXRhLT5sb2NhbCwgc2RhdGEsIGNvbmYpOworCWlmIChyZXQpCisJCWllZWU4MDIxMV9zZGF0YV9zdG9wKHNkYXRhKTsKKworCXNkYXRhLT51Lm5hbi5jb25mID0gKmNvbmY7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfc3RvcF9uYW4oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCSAgICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KQoreworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX1dERVZfVE9fU1VCX0lGKHdkZXYpOworCisJZHJ2X3N0b3BfbmFuKHNkYXRhLT5sb2NhbCwgc2RhdGEpOworCWllZWU4MDIxMV9zZGF0YV9zdG9wKHNkYXRhKTsKK30KKworc3RhdGljIGludCBpZWVlODAyMTFfbmFuX2NoYW5nZV9jb25mKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCSAgICAgc3RydWN0IGNmZzgwMjExX25hbl9jb25mICpjb25mLAorCQkJCSAgICAgdTMyIGNoYW5nZXMpCit7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfV0RFVl9UT19TVUJfSUYod2Rldik7CisJc3RydWN0IGNmZzgwMjExX25hbl9jb25mIG5ld19jb25mOworCWludCByZXQgPSAwOworCisJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9OQU4pCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmICghaWVlZTgwMjExX3NkYXRhX3J1bm5pbmcoc2RhdGEpKQorCQlyZXR1cm4gLUVORVRET1dOOworCisJbmV3X2NvbmYgPSBzZGF0YS0+dS5uYW4uY29uZjsKKworCWlmIChjaGFuZ2VzICYgQ0ZHODAyMTFfTkFOX0NPTkZfQ0hBTkdFRF9QUkVGKQorCQluZXdfY29uZi5tYXN0ZXJfcHJlZiA9IGNvbmYtPm1hc3Rlcl9wcmVmOworCisJaWYgKGNoYW5nZXMgJiBDRkc4MDIxMV9OQU5fQ09ORl9DSEFOR0VEX0RVQUwpCisJCW5ld19jb25mLmR1YWwgPSBjb25mLT5kdWFsOworCisJcmV0ID0gZHJ2X25hbl9jaGFuZ2VfY29uZihzZGF0YS0+bG9jYWwsIHNkYXRhLCAmbmV3X2NvbmYsIGNoYW5nZXMpOworCWlmICghcmV0KQorCQlzZGF0YS0+dS5uYW4uY29uZiA9IG5ld19jb25mOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpZWVlODAyMTFfYWRkX25hbl9mdW5jKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCSAgc3RydWN0IGNmZzgwMjExX25hbl9mdW5jICpuYW5fZnVuYykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9XREVWX1RPX1NVQl9JRih3ZGV2KTsKKwlpbnQgcmV0OworCisJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9OQU4pCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmICghaWVlZTgwMjExX3NkYXRhX3J1bm5pbmcoc2RhdGEpKQorCQlyZXR1cm4gLUVORVRET1dOOworCisJc3Bpbl9sb2NrX2JoKCZzZGF0YS0+dS5uYW4uZnVuY19sb2NrKTsKKworCXJldCA9IGlkcl9hbGxvYygmc2RhdGEtPnUubmFuLmZ1bmN0aW9uX2luc3RfaWRzLAorCQkJbmFuX2Z1bmMsIDEsIHNkYXRhLT5sb2NhbC0+aHcubWF4X25hbl9kZV9lbnRyaWVzICsgMSwKKwkJCUdGUF9BVE9NSUMpOworCXNwaW5fdW5sb2NrX2JoKCZzZGF0YS0+dS5uYW4uZnVuY19sb2NrKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJbmFuX2Z1bmMtPmluc3RhbmNlX2lkID0gcmV0OworCisJV0FSTl9PTihuYW5fZnVuYy0+aW5zdGFuY2VfaWQgPT0gMCk7CisKKwlyZXQgPSBkcnZfYWRkX25hbl9mdW5jKHNkYXRhLT5sb2NhbCwgc2RhdGEsIG5hbl9mdW5jKTsKKwlpZiAocmV0KSB7CisJCXNwaW5fbG9ja19iaCgmc2RhdGEtPnUubmFuLmZ1bmNfbG9jayk7CisJCWlkcl9yZW1vdmUoJnNkYXRhLT51Lm5hbi5mdW5jdGlvbl9pbnN0X2lkcywKKwkJCSAgIG5hbl9mdW5jLT5pbnN0YW5jZV9pZCk7CisJCXNwaW5fdW5sb2NrX2JoKCZzZGF0YS0+dS5uYW4uZnVuY19sb2NrKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGNmZzgwMjExX25hbl9mdW5jICoKK2llZWU4MDIxMV9maW5kX25hbl9mdW5jX2J5X2Nvb2tpZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkgIHU2NCBjb29raWUpCit7CisJc3RydWN0IGNmZzgwMjExX25hbl9mdW5jICpmdW5jOworCWludCBpZDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnNkYXRhLT51Lm5hbi5mdW5jX2xvY2spOworCisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZzZGF0YS0+dS5uYW4uZnVuY3Rpb25faW5zdF9pZHMsIGZ1bmMsIGlkKSB7CisJCWlmIChmdW5jLT5jb29raWUgPT0gY29va2llKQorCQkJcmV0dXJuIGZ1bmM7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9kZWxfbmFuX2Z1bmMoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsIHU2NCBjb29raWUpCit7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfV0RFVl9UT19TVUJfSUYod2Rldik7CisJc3RydWN0IGNmZzgwMjExX25hbl9mdW5jICpmdW5jOworCXU4IGluc3RhbmNlX2lkID0gMDsKKworCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTkFOIHx8CisJICAgICFpZWVlODAyMTFfc2RhdGFfcnVubmluZyhzZGF0YSkpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19iaCgmc2RhdGEtPnUubmFuLmZ1bmNfbG9jayk7CisKKwlmdW5jID0gaWVlZTgwMjExX2ZpbmRfbmFuX2Z1bmNfYnlfY29va2llKHNkYXRhLCBjb29raWUpOworCWlmIChmdW5jKQorCQlpbnN0YW5jZV9pZCA9IGZ1bmMtPmluc3RhbmNlX2lkOworCisJc3Bpbl91bmxvY2tfYmgoJnNkYXRhLT51Lm5hbi5mdW5jX2xvY2spOworCisJaWYgKGluc3RhbmNlX2lkKQorCQlkcnZfZGVsX25hbl9mdW5jKHNkYXRhLT5sb2NhbCwgc2RhdGEsIGluc3RhbmNlX2lkKTsKK30KKwogc3RhdGljIGludCBpZWVlODAyMTFfc2V0X25vYWNrX21hcChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAogCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgIHUxNiBub2Fja19tYXApCkBAIC0yMzYsNiArNDAxLDcgQEAKIAljYXNlIE5MODAyMTFfSUZUWVBFX1dEUzoKIAljYXNlIE5MODAyMTFfSUZUWVBFX01PTklUT1I6CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfTkFOOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQ6CiAJY2FzZSBOVU1fTkw4MDIxMV9JRlRZUEVTOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVDoKQEAgLTg2OSw3ICsxMDM1LDcgQEAKIAogCS8qIGZyZWUgYWxsIHBvdGVudGlhbGx5IHN0aWxsIGJ1ZmZlcmVkIGJjYXN0IGZyYW1lcyAqLwogCWxvY2FsLT50b3RhbF9wc19idWZmZXJlZCAtPSBza2JfcXVldWVfbGVuKCZzZGF0YS0+dS5hcC5wcy5iY19idWYpOwotCXNrYl9xdWV1ZV9wdXJnZSgmc2RhdGEtPnUuYXAucHMuYmNfYnVmKTsKKwlpZWVlODAyMTFfcHVyZ2VfdHhfcXVldWUoJmxvY2FsLT5odywgJnNkYXRhLT51LmFwLnBzLmJjX2J1Zik7CiAKIAltdXRleF9sb2NrKCZsb2NhbC0+bXR4KTsKIAlpZWVlODAyMTFfdmlmX2NvcHlfY2hhbmN0eF90b192bGFucyhzZGF0YSwgdHJ1ZSk7CkBAIC0yMDE1LDYgKzIxODEsNyBAQAogCQkgICAgICEocmVxLT5mbGFncyAmIE5MODAyMTFfU0NBTl9GTEFHX0FQKSkpCiAJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfTkFOOgogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CkBAIC0yOTQwLDEwICszMTA3LDYgQEAKIAl9CiAKIAljaGFuY3R4ID0gY29udGFpbmVyX29mKGNvbmYsIHN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eCwgY29uZik7Ci0JaWYgKCFjaGFuY3R4KSB7Ci0JCWVyciA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQogCiAJY2hfc3dpdGNoLnRpbWVzdGFtcCA9IDA7CiAJY2hfc3dpdGNoLmRldmljZV90aW1lc3RhbXAgPSAwOwpAQCAtMzM2MCw2ICszNTIzLDYzIEBACiAJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKK3ZvaWQgaWVlZTgwMjExX25hbl9mdW5jX3Rlcm1pbmF0ZWQoc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCQkgICB1OCBpbnN0X2lkLAorCQkJCSAgIGVudW0gbmw4MDIxMV9uYW5fZnVuY190ZXJtX3JlYXNvbiByZWFzb24sCisJCQkJICAgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gdmlmX3RvX3NkYXRhKHZpZik7CisJc3RydWN0IGNmZzgwMjExX25hbl9mdW5jICpmdW5jOworCXU2NCBjb29raWU7CisKKwlpZiAoV0FSTl9PTih2aWYtPnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTkFOKSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2JoKCZzZGF0YS0+dS5uYW4uZnVuY19sb2NrKTsKKworCWZ1bmMgPSBpZHJfZmluZCgmc2RhdGEtPnUubmFuLmZ1bmN0aW9uX2luc3RfaWRzLCBpbnN0X2lkKTsKKwlpZiAoV0FSTl9PTighZnVuYykpIHsKKwkJc3Bpbl91bmxvY2tfYmgoJnNkYXRhLT51Lm5hbi5mdW5jX2xvY2spOworCQlyZXR1cm47CisJfQorCisJY29va2llID0gZnVuYy0+Y29va2llOworCWlkcl9yZW1vdmUoJnNkYXRhLT51Lm5hbi5mdW5jdGlvbl9pbnN0X2lkcywgaW5zdF9pZCk7CisKKwlzcGluX3VubG9ja19iaCgmc2RhdGEtPnUubmFuLmZ1bmNfbG9jayk7CisKKwljZmc4MDIxMV9mcmVlX25hbl9mdW5jKGZ1bmMpOworCisJY2ZnODAyMTFfbmFuX2Z1bmNfdGVybWluYXRlZChpZWVlODAyMTFfdmlmX3RvX3dkZXYodmlmKSwgaW5zdF9pZCwKKwkJCQkgICAgIHJlYXNvbiwgY29va2llLCBnZnApOworfQorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfbmFuX2Z1bmNfdGVybWluYXRlZCk7CisKK3ZvaWQgaWVlZTgwMjExX25hbl9mdW5jX21hdGNoKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgICBzdHJ1Y3QgY2ZnODAyMTFfbmFuX21hdGNoX3BhcmFtcyAqbWF0Y2gsCisJCQkgICAgICBnZnBfdCBnZnApCit7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSB2aWZfdG9fc2RhdGEodmlmKTsKKwlzdHJ1Y3QgY2ZnODAyMTFfbmFuX2Z1bmMgKmZ1bmM7CisKKwlpZiAoV0FSTl9PTih2aWYtPnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTkFOKSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2JoKCZzZGF0YS0+dS5uYW4uZnVuY19sb2NrKTsKKworCWZ1bmMgPSBpZHJfZmluZCgmc2RhdGEtPnUubmFuLmZ1bmN0aW9uX2luc3RfaWRzLCAgbWF0Y2gtPmluc3RfaWQpOworCWlmIChXQVJOX09OKCFmdW5jKSkgeworCQlzcGluX3VubG9ja19iaCgmc2RhdGEtPnUubmFuLmZ1bmNfbG9jayk7CisJCXJldHVybjsKKwl9CisJbWF0Y2gtPmNvb2tpZSA9IGZ1bmMtPmNvb2tpZTsKKworCXNwaW5fdW5sb2NrX2JoKCZzZGF0YS0+dS5uYW4uZnVuY19sb2NrKTsKKworCWNmZzgwMjExX25hbl9tYXRjaChpZWVlODAyMTFfdmlmX3RvX3dkZXYodmlmKSwgbWF0Y2gsIGdmcCk7Cit9CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9uYW5fZnVuY19tYXRjaCk7CisKIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9vcHMgbWFjODAyMTFfY29uZmlnX29wcyA9IHsKIAkuYWRkX3ZpcnR1YWxfaW50ZiA9IGllZWU4MDIxMV9hZGRfaWZhY2UsCiAJLmRlbF92aXJ0dWFsX2ludGYgPSBpZWVlODAyMTFfZGVsX2lmYWNlLApAQCAtMzQ0NSw0ICszNjY1LDkgQEAKIAkuc2V0X2FwX2NoYW53aWR0aCA9IGllZWU4MDIxMV9zZXRfYXBfY2hhbndpZHRoLAogCS5hZGRfdHhfdHMgPSBpZWVlODAyMTFfYWRkX3R4X3RzLAogCS5kZWxfdHhfdHMgPSBpZWVlODAyMTFfZGVsX3R4X3RzLAorCS5zdGFydF9uYW4gPSBpZWVlODAyMTFfc3RhcnRfbmFuLAorCS5zdG9wX25hbiA9IGllZWU4MDIxMV9zdG9wX25hbiwKKwkubmFuX2NoYW5nZV9jb25mID0gaWVlZTgwMjExX25hbl9jaGFuZ2VfY29uZiwKKwkuYWRkX25hbl9mdW5jID0gaWVlZTgwMjExX2FkZF9uYW5fZnVuYywKKwkuZGVsX25hbl9mdW5jID0gaWVlZTgwMjExX2RlbF9uYW5fZnVuYywKIH07CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvY2hhbi5jIGIvbmV0L21hYzgwMjExL2NoYW4uYwppbmRleCA3NDE0MmQwLi5lNzVjYmY2IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvY2hhbi5jCisrKyBiL25ldC9tYWM4MDIxMS9jaGFuLmMKQEAgLTI3NCw2ICsyNzQsNyBAQAogCQkJCSAgICBpZWVlODAyMTFfZ2V0X21heF9yZXF1aXJlZF9idyhzZGF0YSkpOwogCQkJYnJlYWs7CiAJCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRToKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9OQU46CiAJCQljb250aW51ZTsKIAkJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKIAkJY2FzZSBOTDgwMjExX0lGVFlQRV9XRFM6CkBAIC02NDYsNiArNjQ3LDkgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHggKmN1cnJfY3R4ID0gTlVMTDsKIAlpbnQgcmV0ID0gMDsKIAorCWlmIChXQVJOX09OKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9OQU4pKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCiAJY29uZiA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoc2RhdGEtPnZpZi5jaGFuY3R4X2NvbmYsCiAJCQkJCSBsb2NrZGVwX2lzX2hlbGQoJmxvY2FsLT5jaGFuY3R4X210eCkpOwogCkBAIC03MTgsNiArNzIyLDcgQEAKIAogCQlzd2l0Y2ggKHNkYXRhLT52aWYudHlwZSkgewogCQljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0U6CisJCWNhc2UgTkw4MDIxMV9JRlRZUEVfTkFOOgogCQkJY29udGludWU7CiAJCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKIAkJCWlmICghc2RhdGEtPnUubWdkLmFzc29jaWF0ZWQpCkBAIC05ODAsNiArOTg1LDcgQEAKIAljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ6CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfTkFOOgogCWNhc2UgTlVNX05MODAyMTFfSUZUWVBFUzoKIAkJV0FSTl9PTigxKTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvZGVidWdmcy5jIGIvbmV0L21hYzgwMjExL2RlYnVnZnMuYwppbmRleCAyOTA2YzEwLi5mNTZlMmY0IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvZGVidWdmcy5jCisrKyBiL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzLmMKQEAgLTcxLDEzOCArNzEsNDUgQEAKIERFQlVHRlNfUkVBRE9OTFlfRklMRShyYXRlX2N0cmxfYWxnLCAiJXMiLAogCWxvY2FsLT5yYXRlX2N0cmwgPyBsb2NhbC0+cmF0ZV9jdHJsLT5vcHMtPm5hbWUgOiAiaHcvZHJpdmVyIik7CiAKLXN0cnVjdCBhcW1faW5mbyB7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWw7Ci0Jc2l6ZV90IHNpemU7Ci0Jc2l6ZV90IGxlbjsKLQl1bnNpZ25lZCBjaGFyIGJ1ZlswXTsKLX07Ci0KLSNkZWZpbmUgQVFNX0hEUl9MRU4gMjAwCi0jZGVmaW5lIEFRTV9IV19FTlRSWV9MRU4gNDAKLSNkZWZpbmUgQVFNX1RYUV9FTlRSWV9MRU4gMTEwCi0KLXN0YXRpYyBpbnQgYXFtX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBpbm9kZS0+aV9wcml2YXRlOwotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOwotCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwotCXN0cnVjdCB0eHFfaW5mbyAqdHhxaTsKLQlzdHJ1Y3QgZnEgKmZxID0gJmxvY2FsLT5mcTsKLQlzdHJ1Y3QgYXFtX2luZm8gKmluZm8gPSBOVUxMOwotCWludCBsZW4gPSAwOwotCWludCBpOwotCi0JaWYgKCFsb2NhbC0+b3BzLT53YWtlX3R4X3F1ZXVlKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQlsZW4gKz0gQVFNX0hEUl9MRU47Ci0JbGVuICs9IDYgKiBBUU1fSFdfRU5UUllfTEVOOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHNkYXRhLCAmbG9jYWwtPmludGVyZmFjZXMsIGxpc3QpCi0JCWxlbiArPSBBUU1fVFhRX0VOVFJZX0xFTjsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzdGEsICZsb2NhbC0+c3RhX2xpc3QsIGxpc3QpCi0JCWxlbiArPSBBUU1fVFhRX0VOVFJZX0xFTiAqIEFSUkFZX1NJWkUoc3RhLT5zdGEudHhxKTsKLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCWluZm8gPSB2bWFsbG9jKGxlbik7Ci0JaWYgKCFpbmZvKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNwaW5fbG9ja19iaCgmbG9jYWwtPmZxLmxvY2spOwotCXJjdV9yZWFkX2xvY2soKTsKLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGluZm87Ci0JaW5mby0+bG9jYWwgPSBsb2NhbDsKLQlpbmZvLT5zaXplID0gbGVuOwotCWxlbiA9IDA7Ci0KLQlsZW4gKz0gc2NucHJpbnRmKGluZm8tPmJ1ZiArIGxlbiwgaW5mby0+c2l6ZSAtIGxlbiwKLQkJCSAiKiBod1xuIgotCQkJICJhY2Nlc3MgbmFtZSB2YWx1ZVxuIgotCQkJICJSIGZxX2Zsb3dzX2NudCAldVxuIgotCQkJICJSIGZxX2JhY2tsb2cgJXVcbiIKLQkJCSAiUiBmcV9vdmVybGltaXQgJXVcbiIKLQkJCSAiUiBmcV9jb2xsaXNpb25zICV1XG4iCi0JCQkgIlJXIGZxX2xpbWl0ICV1XG4iCi0JCQkgIlJXIGZxX3F1YW50dW0gJXVcbiIsCi0JCQkgZnEtPmZsb3dzX2NudCwKLQkJCSBmcS0+YmFja2xvZywKLQkJCSBmcS0+b3ZlcmxpbWl0LAotCQkJIGZxLT5jb2xsaXNpb25zLAotCQkJIGZxLT5saW1pdCwKLQkJCSBmcS0+cXVhbnR1bSk7Ci0KLQlsZW4gKz0gc2NucHJpbnRmKGluZm8tPmJ1ZiArIGxlbiwKLQkJCSBpbmZvLT5zaXplIC0gbGVuLAotCQkJICIqIHZpZlxuIgotCQkJICJpZm5hbWUgYWRkciBhYyBiYWNrbG9nLWJ5dGVzIGJhY2tsb2ctcGFja2V0cyBmbG93cyBvdmVybGltaXQgY29sbGlzaW9ucyB0eC1ieXRlcyB0eC1wYWNrZXRzXG4iKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHNkYXRhLCAmbG9jYWwtPmludGVyZmFjZXMsIGxpc3QpIHsKLQkJdHhxaSA9IHRvX3R4cV9pbmZvKHNkYXRhLT52aWYudHhxKTsKLQkJbGVuICs9IHNjbnByaW50ZihpbmZvLT5idWYgKyBsZW4sIGluZm8tPnNpemUgLSBsZW4sCi0JCQkJICIlcyAlcE0gJXUgJXUgJXUgJXUgJXUgJXUgJXUgJXVcbiIsCi0JCQkJIHNkYXRhLT5uYW1lLAotCQkJCSBzZGF0YS0+dmlmLmFkZHIsCi0JCQkJIHR4cWktPnR4cS5hYywKLQkJCQkgdHhxaS0+dGluLmJhY2tsb2dfYnl0ZXMsCi0JCQkJIHR4cWktPnRpbi5iYWNrbG9nX3BhY2tldHMsCi0JCQkJIHR4cWktPnRpbi5mbG93cywKLQkJCQkgdHhxaS0+dGluLm92ZXJsaW1pdCwKLQkJCQkgdHhxaS0+dGluLmNvbGxpc2lvbnMsCi0JCQkJIHR4cWktPnRpbi50eF9ieXRlcywKLQkJCQkgdHhxaS0+dGluLnR4X3BhY2tldHMpOwotCX0KLQotCWxlbiArPSBzY25wcmludGYoaW5mby0+YnVmICsgbGVuLAotCQkJIGluZm8tPnNpemUgLSBsZW4sCi0JCQkgIiogc3RhXG4iCi0JCQkgImlmbmFtZSBhZGRyIHRpZCBhYyBiYWNrbG9nLWJ5dGVzIGJhY2tsb2ctcGFja2V0cyBmbG93cyBvdmVybGltaXQgY29sbGlzaW9ucyB0eC1ieXRlcyB0eC1wYWNrZXRzXG4iKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHN0YSwgJmxvY2FsLT5zdGFfbGlzdCwgbGlzdCkgewotCQlzZGF0YSA9IHN0YS0+c2RhdGE7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN0YS0+c3RhLnR4cSk7IGkrKykgewotCQkJdHhxaSA9IHRvX3R4cV9pbmZvKHN0YS0+c3RhLnR4cVtpXSk7Ci0JCQlsZW4gKz0gc2NucHJpbnRmKGluZm8tPmJ1ZiArIGxlbiwgaW5mby0+c2l6ZSAtIGxlbiwKLQkJCQkJICIlcyAlcE0gJWQgJWQgJXUgJXUgJXUgJXUgJXUgJXUgJXVcbiIsCi0JCQkJCSBzZGF0YS0+bmFtZSwKLQkJCQkJIHN0YS0+c3RhLmFkZHIsCi0JCQkJCSB0eHFpLT50eHEudGlkLAotCQkJCQkgdHhxaS0+dHhxLmFjLAotCQkJCQkgdHhxaS0+dGluLmJhY2tsb2dfYnl0ZXMsCi0JCQkJCSB0eHFpLT50aW4uYmFja2xvZ19wYWNrZXRzLAotCQkJCQkgdHhxaS0+dGluLmZsb3dzLAotCQkJCQkgdHhxaS0+dGluLm92ZXJsaW1pdCwKLQkJCQkJIHR4cWktPnRpbi5jb2xsaXNpb25zLAotCQkJCQkgdHhxaS0+dGluLnR4X2J5dGVzLAotCQkJCQkgdHhxaS0+dGluLnR4X3BhY2tldHMpOwotCQl9Ci0JfQotCi0JaW5mby0+bGVuID0gbGVuOwotCi0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmxvY2FsLT5mcS5sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFxbV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXZmcmVlKGZpbGUtPnByaXZhdGVfZGF0YSk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzc2l6ZV90IGFxbV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAogCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAogCQkJc2l6ZV90IGNvdW50LAogCQkJbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBhcW1faW5mbyAqaW5mbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZnEgKmZxID0gJmxvY2FsLT5mcTsKKwljaGFyIGJ1ZlsyMDBdOworCWludCBsZW4gPSAwOworCisJc3Bpbl9sb2NrX2JoKCZsb2NhbC0+ZnEubG9jayk7CisJcmN1X3JlYWRfbG9jaygpOworCisJbGVuID0gc2NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCQkiYWNjZXNzIG5hbWUgdmFsdWVcbiIKKwkJCSJSIGZxX2Zsb3dzX2NudCAldVxuIgorCQkJIlIgZnFfYmFja2xvZyAldVxuIgorCQkJIlIgZnFfb3ZlcmxpbWl0ICV1XG4iCisJCQkiUiBmcV9vdmVybWVtb3J5ICV1XG4iCisJCQkiUiBmcV9jb2xsaXNpb25zICV1XG4iCisJCQkiUiBmcV9tZW1vcnlfdXNhZ2UgJXVcbiIKKwkJCSJSVyBmcV9tZW1vcnlfbGltaXQgJXVcbiIKKwkJCSJSVyBmcV9saW1pdCAldVxuIgorCQkJIlJXIGZxX3F1YW50dW0gJXVcbiIsCisJCQlmcS0+Zmxvd3NfY250LAorCQkJZnEtPmJhY2tsb2csCisJCQlmcS0+b3Zlcm1lbW9yeSwKKwkJCWZxLT5vdmVybGltaXQsCisJCQlmcS0+Y29sbGlzaW9ucywKKwkJCWZxLT5tZW1vcnlfdXNhZ2UsCisJCQlmcS0+bWVtb3J5X2xpbWl0LAorCQkJZnEtPmxpbWl0LAorCQkJZnEtPnF1YW50dW0pOworCisJcmN1X3JlYWRfdW5sb2NrKCk7CisJc3Bpbl91bmxvY2tfYmgoJmxvY2FsLT5mcS5sb2NrKTsKIAogCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsCi0JCQkJICAgICAgIGluZm8tPmJ1ZiwgaW5mby0+bGVuKTsKKwkJCQkgICAgICAgYnVmLCBsZW4pOwogfQogCiBzdGF0aWMgc3NpemVfdCBhcW1fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCkBAIC0yMTAsOCArMTE3LDcgQEAKIAkJCSBzaXplX3QgY291bnQsCiAJCQkgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBhcW1faW5mbyAqaW5mbyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IGluZm8tPmxvY2FsOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWNoYXIgYnVmWzEwMF07CiAJc2l6ZV90IGxlbjsKIApAQCAtMjI4LDYgKzEzNCw4IEBACiAKIAlpZiAoc3NjYW5mKGJ1ZiwgImZxX2xpbWl0ICV1IiwgJmxvY2FsLT5mcS5saW1pdCkgPT0gMSkKIAkJcmV0dXJuIGNvdW50OworCWVsc2UgaWYgKHNzY2FuZihidWYsICJmcV9tZW1vcnlfbGltaXQgJXUiLCAmbG9jYWwtPmZxLm1lbW9yeV9saW1pdCkgPT0gMSkKKwkJcmV0dXJuIGNvdW50OwogCWVsc2UgaWYgKHNzY2FuZihidWYsICJmcV9xdWFudHVtICV1IiwgJmxvY2FsLT5mcS5xdWFudHVtKSA9PSAxKQogCQlyZXR1cm4gY291bnQ7CiAKQEAgLTIzNyw4ICsxNDUsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXFtX29wcyA9IHsKIAkud3JpdGUgPSBhcW1fd3JpdGUsCiAJLnJlYWQgPSBhcW1fcmVhZCwKLQkub3BlbiA9IGFxbV9vcGVuLAotCS5yZWxlYXNlID0gYXFtX3JlbGVhc2UsCisJLm9wZW4gPSBzaW1wbGVfb3BlbiwKIAkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCiB9OwogCkBAIC0zMDIsNiArMjA5LDcgQEAKIAlGTEFHKFVTRVNfUlNTKSwKIAlGTEFHKFRYX0FNU0RVKSwKIAlGTEFHKFRYX0ZSQUdfTElTVCksCisJRkxBRyhSRVBPUlRTX0xPV19BQ0spLAogI3VuZGVmIEZMQUcKIH07CiAKQEAgLTQyOCw3ICszMzYsOSBAQAogCURFQlVHRlNfQUREKGh3ZmxhZ3MpOwogCURFQlVHRlNfQUREKHVzZXJfcG93ZXIpOwogCURFQlVHRlNfQUREKHBvd2VyKTsKLQlERUJVR0ZTX0FERF9NT0RFKGFxbSwgMDYwMCk7CisKKwlpZiAobG9jYWwtPm9wcy0+d2FrZV90eF9xdWV1ZSkKKwkJREVCVUdGU19BRERfTU9ERShhcW0sIDA2MDApOwogCiAJc3RhdHNkID0gZGVidWdmc19jcmVhdGVfZGlyKCJzdGF0aXN0aWNzIiwgcGh5ZCk7CiAKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX25ldGRldi5jIGIvbmV0L21hYzgwMjExL2RlYnVnZnNfbmV0ZGV2LmMKaW5kZXggYTViYTczOS4uYmNlYzEyNCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2RlYnVnZnNfbmV0ZGV2LmMKKysrIGIvbmV0L21hYzgwMjExL2RlYnVnZnNfbmV0ZGV2LmMKQEAgLTMwLDcgKzMwLDcgQEAKIAlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcywKIAlzc2l6ZV90ICgqZm9ybWF0KShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICosIGNoYXIgKiwgaW50KSkKIHsKLQljaGFyIGJ1Zls3MF07CisJY2hhciBidWZbMjAwXTsKIAlzc2l6ZV90IHJldCA9IC1FSU5WQUw7CiAKIAlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOwpAQCAtNDg2LDYgKzQ4NiwzOCBAQAogfQogSUVFRTgwMjExX0lGX0ZJTEVfUihudW1fYnVmZmVyZWRfbXVsdGljYXN0KTsKIAorc3RhdGljIHNzaXplX3QgaWVlZTgwMjExX2lmX2ZtdF9hcW0oCisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKKwlzdHJ1Y3QgdHhxX2luZm8gKnR4cWkgPSB0b190eHFfaW5mbyhzZGF0YS0+dmlmLnR4cSk7CisJaW50IGxlbjsKKworCXNwaW5fbG9ja19iaCgmbG9jYWwtPmZxLmxvY2spOworCXJjdV9yZWFkX2xvY2soKTsKKworCWxlbiA9IHNjbnByaW50ZihidWYsCisJCQlidWZsZW4sCisJCQkiYWMgYmFja2xvZy1ieXRlcyBiYWNrbG9nLXBhY2tldHMgbmV3LWZsb3dzIGRyb3BzIG1hcmtzIG92ZXJsaW1pdCBjb2xsaXNpb25zIHR4LWJ5dGVzIHR4LXBhY2tldHNcbiIKKwkJCSIldSAldSAldSAldSAldSAldSAldSAldSAldSAldVxuIiwKKwkJCXR4cWktPnR4cS5hYywKKwkJCXR4cWktPnRpbi5iYWNrbG9nX2J5dGVzLAorCQkJdHhxaS0+dGluLmJhY2tsb2dfcGFja2V0cywKKwkJCXR4cWktPnRpbi5mbG93cywKKwkJCXR4cWktPmNzdGF0cy5kcm9wX2NvdW50LAorCQkJdHhxaS0+Y3N0YXRzLmVjbl9tYXJrLAorCQkJdHhxaS0+dGluLm92ZXJsaW1pdCwKKwkJCXR4cWktPnRpbi5jb2xsaXNpb25zLAorCQkJdHhxaS0+dGluLnR4X2J5dGVzLAorCQkJdHhxaS0+dGluLnR4X3BhY2tldHMpOworCisJcmN1X3JlYWRfdW5sb2NrKCk7CisJc3Bpbl91bmxvY2tfYmgoJmxvY2FsLT5mcS5sb2NrKTsKKworCXJldHVybiBsZW47Cit9CitJRUVFODAyMTFfSUZfRklMRV9SKGFxbSk7CisKIC8qIElCU1MgYXR0cmlidXRlcyAqLwogc3RhdGljIHNzaXplX3QgaWVlZTgwMjExX2lmX2ZtdF90c2YoCiAJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbikKQEAgLTUyNCw5ICs1NTYsMTUgQEAKIAkJcmV0ID0ga3N0cnRvdWxsKGJ1ZiwgMTAsICZ0c2YpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7Ci0JCWlmICh0c2ZfaXNfZGVsdGEpCi0JCQl0c2YgPSBkcnZfZ2V0X3RzZihsb2NhbCwgc2RhdGEpICsgdHNmX2lzX2RlbHRhICogdHNmOwotCQlpZiAobG9jYWwtPm9wcy0+c2V0X3RzZikgeworCQlpZiAodHNmX2lzX2RlbHRhICYmIGxvY2FsLT5vcHMtPm9mZnNldF90c2YpIHsKKwkJCWRydl9vZmZzZXRfdHNmKGxvY2FsLCBzZGF0YSwgdHNmX2lzX2RlbHRhICogdHNmKTsKKwkJCXdpcGh5X2luZm8obG9jYWwtPmh3LndpcGh5LAorCQkJCSAgICJkZWJ1Z2ZzIG9mZnNldCBUU0YgYnkgJTAxOGxsZFxuIiwKKwkJCQkgICB0c2ZfaXNfZGVsdGEgKiB0c2YpOworCQl9IGVsc2UgaWYgKGxvY2FsLT5vcHMtPnNldF90c2YpIHsKKwkJCWlmICh0c2ZfaXNfZGVsdGEpCisJCQkJdHNmID0gZHJ2X2dldF90c2YobG9jYWwsIHNkYXRhKSArCisJCQkJICAgICAgdHNmX2lzX2RlbHRhICogdHNmOwogCQkJZHJ2X3NldF90c2YobG9jYWwsIHNkYXRhLCB0c2YpOwogCQkJd2lwaHlfaW5mbyhsb2NhbC0+aHcud2lwaHksCiAJCQkJICAgImRlYnVnZnMgc2V0IFRTRiB0byAlIzAxOGxseFxuIiwgdHNmKTsKQEAgLTYxOCw2ICs2NTYsOSBAQAogCURFQlVHRlNfQUREKHJjX3JhdGVpZHhfdmh0X21jc19tYXNrXzJnaHopOwogCURFQlVHRlNfQUREKHJjX3JhdGVpZHhfdmh0X21jc19tYXNrXzVnaHopOwogCURFQlVHRlNfQUREKGh3X3F1ZXVlcyk7CisKKwlpZiAoc2RhdGEtPmxvY2FsLT5vcHMtPndha2VfdHhfcXVldWUpCisJCURFQlVHRlNfQUREKGFxbSk7CiB9CiAKIHN0YXRpYyB2b2lkIGFkZF9zdGFfZmlsZXMoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvZGVidWdmc19zdGEuYyBiL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX3N0YS5jCmluZGV4IGZkMzM0MTMuLmEyZmNkYjQgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX3N0YS5jCisrKyBiL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX3N0YS5jCkBAIC0xMzMsNiArMTMzLDU1IEBACiB9CiBTVEFfT1BTKGxhc3Rfc2VxX2N0cmwpOwogCisjZGVmaW5lIEFRTV9UWFFfRU5UUllfTEVOIDEzMAorCitzdGF0aWMgc3NpemVfdCBzdGFfYXFtX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHN0YV9pbmZvICpzdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzdGEtPmxvY2FsOworCXNpemVfdCBidWZzeiA9IEFRTV9UWFFfRU5UUllfTEVOKihJRUVFODAyMTFfTlVNX1RJRFMrMSk7CisJY2hhciAqYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCksICpwID0gYnVmOworCXN0cnVjdCB0eHFfaW5mbyAqdHhxaTsKKwlzc2l6ZV90IHJ2OworCWludCBpOworCisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJc3Bpbl9sb2NrX2JoKCZsb2NhbC0+ZnEubG9jayk7CisJcmN1X3JlYWRfbG9jaygpOworCisJcCArPSBzY25wcmludGYocCwKKwkJICAgICAgIGJ1ZnN6K2J1Zi1wLAorCQkgICAgICAgInRpZCBhYyBiYWNrbG9nLWJ5dGVzIGJhY2tsb2ctcGFja2V0cyBuZXctZmxvd3MgZHJvcHMgbWFya3Mgb3ZlcmxpbWl0IGNvbGxpc2lvbnMgdHgtYnl0ZXMgdHgtcGFja2V0c1xuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgSUVFRTgwMjExX05VTV9USURTOyBpKyspIHsKKwkJdHhxaSA9IHRvX3R4cV9pbmZvKHN0YS0+c3RhLnR4cVtpXSk7CisJCXAgKz0gc2NucHJpbnRmKHAsIGJ1ZnN6K2J1Zi1wLAorCQkJICAgICAgICIlZCAlZCAldSAldSAldSAldSAldSAldSAldSAldSAldVxuIiwKKwkJCSAgICAgICB0eHFpLT50eHEudGlkLAorCQkJICAgICAgIHR4cWktPnR4cS5hYywKKwkJCSAgICAgICB0eHFpLT50aW4uYmFja2xvZ19ieXRlcywKKwkJCSAgICAgICB0eHFpLT50aW4uYmFja2xvZ19wYWNrZXRzLAorCQkJICAgICAgIHR4cWktPnRpbi5mbG93cywKKwkJCSAgICAgICB0eHFpLT5jc3RhdHMuZHJvcF9jb3VudCwKKwkJCSAgICAgICB0eHFpLT5jc3RhdHMuZWNuX21hcmssCisJCQkgICAgICAgdHhxaS0+dGluLm92ZXJsaW1pdCwKKwkJCSAgICAgICB0eHFpLT50aW4uY29sbGlzaW9ucywKKwkJCSAgICAgICB0eHFpLT50aW4udHhfYnl0ZXMsCisJCQkgICAgICAgdHhxaS0+dGluLnR4X3BhY2tldHMpOworCX0KKworCXJjdV9yZWFkX3VubG9jaygpOworCXNwaW5fdW5sb2NrX2JoKCZsb2NhbC0+ZnEubG9jayk7CisKKwlydiA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJidWYsIGNvdW50LCBwcG9zLCBidWYsIHAgLSBidWYpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJ2OworfQorU1RBX09QUyhhcW0pOworCiBzdGF0aWMgc3NpemVfdCBzdGFfYWdnX3N0YXR1c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKIAkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CkBAIC00NzgsNiArNTI3LDkgQEAKIAlERUJVR0ZTX0FERF9DT1VOVEVSKHJ4X2ZyYWdtZW50cywgcnhfc3RhdHMuZnJhZ21lbnRzKTsKIAlERUJVR0ZTX0FERF9DT1VOVEVSKHR4X2ZpbHRlcmVkLCBzdGF0dXNfc3RhdHMuZmlsdGVyZWQpOwogCisJaWYgKGxvY2FsLT5vcHMtPndha2VfdHhfcXVldWUpCisJCURFQlVHRlNfQUREKGFxbSk7CisKIAlpZiAoc2l6ZW9mKHN0YS0+ZHJpdmVyX2J1ZmZlcmVkX3RpZHMpID09IHNpemVvZih1MzIpKQogCQlkZWJ1Z2ZzX2NyZWF0ZV94MzIoImRyaXZlcl9idWZmZXJlZF90aWRzIiwgMDQwMCwKIAkJCQkgICBzdGEtPmRlYnVnZnNfZGlyLApAQCAtNDkyLDEwICs1NDQsNiBAQAogCiB2b2lkIGllZWU4MDIxMV9zdGFfZGVidWdmc19yZW1vdmUoc3RydWN0IHN0YV9pbmZvICpzdGEpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzdGEtPmxvY2FsOwotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gc3RhLT5zZGF0YTsKLQotCWRydl9zdGFfcmVtb3ZlX2RlYnVnZnMobG9jYWwsIHNkYXRhLCAmc3RhLT5zdGEsIHN0YS0+ZGVidWdmc19kaXIpOwogCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShzdGEtPmRlYnVnZnNfZGlyKTsKIAlzdGEtPmRlYnVnZnNfZGlyID0gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9kcml2ZXItb3BzLmMgYi9uZXQvbWFjODAyMTEvZHJpdmVyLW9wcy5jCmluZGV4IGMyNThmMTAuLmJiODg2ZTcgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9kcml2ZXItb3BzLmMKKysrIGIvbmV0L21hYzgwMjExL2RyaXZlci1vcHMuYwpAQCAtNjIsNyArNjIsNyBAQAogCWlmIChXQVJOX09OKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOIHx8CiAJCSAgICAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IgJiYKIAkJICAgICAhaWVlZTgwMjExX2h3X2NoZWNrKCZsb2NhbC0+aHcsIFdBTlRfTU9OSVRPUl9WSUYpICYmCi0JCSAgICAgIShzZGF0YS0+dS5tbnRyX2ZsYWdzICYgTU9OSVRPUl9GTEFHX0FDVElWRSkpKSkKKwkJICAgICAhKHNkYXRhLT51Lm1udHIuZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQUNUSVZFKSkpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXRyYWNlX2Rydl9hZGRfaW50ZXJmYWNlKGxvY2FsLCBzZGF0YSk7CkBAIC0yMTUsNiArMjE1LDIxIEBACiAJdHJhY2VfZHJ2X3JldHVybl92b2lkKGxvY2FsKTsKIH0KIAordm9pZCBkcnZfb2Zmc2V0X3RzZihzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkgICAgczY0IG9mZnNldCkKK3sKKwltaWdodF9zbGVlcCgpOworCisJaWYgKCFjaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpKQorCQlyZXR1cm47CisKKwl0cmFjZV9kcnZfb2Zmc2V0X3RzZihsb2NhbCwgc2RhdGEsIG9mZnNldCk7CisJaWYgKGxvY2FsLT5vcHMtPm9mZnNldF90c2YpCisJCWxvY2FsLT5vcHMtPm9mZnNldF90c2YoJmxvY2FsLT5odywgJnNkYXRhLT52aWYsIG9mZnNldCk7CisJdHJhY2VfZHJ2X3JldHVybl92b2lkKGxvY2FsKTsKK30KKwogdm9pZCBkcnZfcmVzZXRfdHNmKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAogCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKIHsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9kcml2ZXItb3BzLmggYi9uZXQvbWFjODAyMTEvZHJpdmVyLW9wcy5oCmluZGV4IDE4NDQ3M2MuLjA5Zjc3ZTQgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9kcml2ZXItb3BzLmgKKysrIGIvbmV0L21hYzgwMjExL2RyaXZlci1vcHMuaApAQCAtMTYyLDcgKzE2Miw5IEBACiAJCXJldHVybjsKIAogCWlmIChXQVJOX09OX09OQ0Uoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0UgfHwKLQkJCSBzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUikpCisJCQkgc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX05BTiB8fAorCQkJIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUiAmJgorCQkJICAhc2RhdGEtPnZpZi5tdV9taW1vX293bmVyKSkpCiAJCXJldHVybjsKIAogCWlmICghY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKSkKQEAgLTQ5OCwyMSArNTAwLDYgQEAKIAkJbG9jYWwtPm9wcy0+c3RhX2FkZF9kZWJ1Z2ZzKCZsb2NhbC0+aHcsICZzZGF0YS0+dmlmLAogCQkJCQkgICAgc3RhLCBkaXIpOwogfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZHJ2X3N0YV9yZW1vdmVfZGVidWdmcyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKLQkJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKLQkJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJCQkgIHN0cnVjdCBkZW50cnkgKmRpcikKLXsKLQltaWdodF9zbGVlcCgpOwotCi0Jc2RhdGEgPSBnZXRfYnNzX3NkYXRhKHNkYXRhKTsKLQljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOwotCi0JaWYgKGxvY2FsLT5vcHMtPnN0YV9yZW1vdmVfZGVidWdmcykKLQkJbG9jYWwtPm9wcy0+c3RhX3JlbW92ZV9kZWJ1Z2ZzKCZsb2NhbC0+aHcsICZzZGF0YS0+dmlmLAotCQkJCQkgICAgICAgc3RhLCBkaXIpOwotfQogI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkcnZfc3RhX3ByZV9yY3VfcmVtb3ZlKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLApAQCAtNTgyLDYgKzU2OSw5IEBACiB2b2lkIGRydl9zZXRfdHNmKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAogCQkgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCiAJCSB1NjQgdHNmKTsKK3ZvaWQgZHJ2X29mZnNldF90c2Yoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJICAgIHM2NCBvZmZzZXQpOwogdm9pZCBkcnZfcmVzZXRfdHNmKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAogCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7CiAKQEAgLTEwODgsMTMgKzEwNzgsMTMgQEAKIH0KIAogc3RhdGljIGlubGluZSB1MzIgZHJ2X2dldF9leHBlY3RlZF90aHJvdWdocHV0KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAotCQkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQorCQkJCQkgICAgICBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKIHsKIAl1MzIgcmV0ID0gMDsKIAotCXRyYWNlX2Rydl9nZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dChzdGEpOwotCWlmIChsb2NhbC0+b3BzLT5nZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dCkKLQkJcmV0ID0gbG9jYWwtPm9wcy0+Z2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQoc3RhKTsKKwl0cmFjZV9kcnZfZ2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQoJnN0YS0+c3RhKTsKKwlpZiAobG9jYWwtPm9wcy0+Z2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQgJiYgc3RhLT51cGxvYWRlZCkKKwkJcmV0ID0gbG9jYWwtPm9wcy0+Z2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQoJmxvY2FsLT5odywgJnN0YS0+c3RhKTsKIAl0cmFjZV9kcnZfcmV0dXJuX3UzMihsb2NhbCwgcmV0KTsKIAogCXJldHVybiByZXQ7CkBAIC0xMTc5LDQgKzExNjksODMgQEAKIAlsb2NhbC0+b3BzLT53YWtlX3R4X3F1ZXVlKCZsb2NhbC0+aHcsICZ0eHEtPnR4cSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGRydl9zdGFydF9uYW4oc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJc3RydWN0IGNmZzgwMjExX25hbl9jb25mICpjb25mKQoreworCWludCByZXQ7CisKKwltaWdodF9zbGVlcCgpOworCWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSk7CisKKwl0cmFjZV9kcnZfc3RhcnRfbmFuKGxvY2FsLCBzZGF0YSwgY29uZik7CisJcmV0ID0gbG9jYWwtPm9wcy0+c3RhcnRfbmFuKCZsb2NhbC0+aHcsICZzZGF0YS0+dmlmLCBjb25mKTsKKwl0cmFjZV9kcnZfcmV0dXJuX2ludChsb2NhbCwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHJ2X3N0b3BfbmFuKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQoreworCW1pZ2h0X3NsZWVwKCk7CisJY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKworCXRyYWNlX2Rydl9zdG9wX25hbihsb2NhbCwgc2RhdGEpOworCWxvY2FsLT5vcHMtPnN0b3BfbmFuKCZsb2NhbC0+aHcsICZzZGF0YS0+dmlmKTsKKwl0cmFjZV9kcnZfcmV0dXJuX3ZvaWQobG9jYWwpOworfQorCitzdGF0aWMgaW5saW5lIGludCBkcnZfbmFuX2NoYW5nZV9jb25mKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkgICAgICAgc3RydWN0IGNmZzgwMjExX25hbl9jb25mICpjb25mLAorCQkJCSAgICAgICB1MzIgY2hhbmdlcykKK3sKKwlpbnQgcmV0OworCisJbWlnaHRfc2xlZXAoKTsKKwljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCisJaWYgKCFsb2NhbC0+b3BzLT5uYW5fY2hhbmdlX2NvbmYpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXRyYWNlX2Rydl9uYW5fY2hhbmdlX2NvbmYobG9jYWwsIHNkYXRhLCBjb25mLCBjaGFuZ2VzKTsKKwlyZXQgPSBsb2NhbC0+b3BzLT5uYW5fY2hhbmdlX2NvbmYoJmxvY2FsLT5odywgJnNkYXRhLT52aWYsIGNvbmYsCisJCQkJCSAgY2hhbmdlcyk7CisJdHJhY2VfZHJ2X3JldHVybl9pbnQobG9jYWwsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGludCBkcnZfYWRkX25hbl9mdW5jKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9uYW5fZnVuYyAqbmFuX2Z1bmMpCit7CisJaW50IHJldDsKKworCW1pZ2h0X3NsZWVwKCk7CisJY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKworCWlmICghbG9jYWwtPm9wcy0+YWRkX25hbl9mdW5jKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwl0cmFjZV9kcnZfYWRkX25hbl9mdW5jKGxvY2FsLCBzZGF0YSwgbmFuX2Z1bmMpOworCXJldCA9IGxvY2FsLT5vcHMtPmFkZF9uYW5fZnVuYygmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZiwgbmFuX2Z1bmMpOworCXRyYWNlX2Rydl9yZXR1cm5faW50KGxvY2FsLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRydl9kZWxfbmFuX2Z1bmMoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJICAgdTggaW5zdGFuY2VfaWQpCit7CisJbWlnaHRfc2xlZXAoKTsKKwljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCisJdHJhY2VfZHJ2X2RlbF9uYW5fZnVuYyhsb2NhbCwgc2RhdGEsIGluc3RhbmNlX2lkKTsKKwlpZiAobG9jYWwtPm9wcy0+ZGVsX25hbl9mdW5jKQorCQlsb2NhbC0+b3BzLT5kZWxfbmFuX2Z1bmMoJmxvY2FsLT5odywgJnNkYXRhLT52aWYsIGluc3RhbmNlX2lkKTsKKwl0cmFjZV9kcnZfcmV0dXJuX3ZvaWQobG9jYWwpOworfQorCiAjZW5kaWYgLyogX19NQUM4MDIxMV9EUklWRVJfT1BTICovCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvaWVlZTgwMjExX2kuaCBiL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfaS5oCmluZGV4IGY1NmQzNDIuLjM0YzJhZGQgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfaS5oCisrKyBiL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfaS5oCkBAIC0zLDcgKzMsNyBAQAogICogQ29weXJpZ2h0IDIwMDUsIERldmljZXNjYXBlIFNvZnR3YXJlLCBJbmMuCiAgKiBDb3B5cmlnaHQgMjAwNi0yMDA3CUppcmkgQmVuYyA8amJlbmNAc3VzZS5jej4KICAqIENvcHlyaWdodCAyMDA3LTIwMTAJSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KLSAqIENvcHlyaWdodCAyMDEzLTIwMTQgIEludGVsIE1vYmlsZSBDb21tdW5pY2F0aW9ucyBHbWJICisgKiBDb3B5cmlnaHQgMjAxMy0yMDE1ICBJbnRlbCBNb2JpbGUgQ29tbXVuaWNhdGlvbnMgR21iSAogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtODYsNiArODYsOCBAQAogCiAjZGVmaW5lIElFRUU4MDIxMV9ERUFVVEhfRlJBTUVfTEVOCSgyNCAvKiBoZHIgKi8gKyAyIC8qIHJlYXNvbiAqLykKIAorI2RlZmluZSBJRUVFODAyMTFfTUFYX05BTl9JTlNUQU5DRV9JRCAyNTUKKwogc3RydWN0IGllZWU4MDIxMV9mcmFnbWVudF9lbnRyeSB7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCBza2JfbGlzdDsKIAl1bnNpZ25lZCBsb25nIGZpcnN0X2ZyYWdfdGltZTsKQEAgLTgxMywxNyArODE1LDM5IEBACiAgKiBAZGVmX2Zsb3c6IHVzZWQgYXMgYSBmYWxsYmFjayBmbG93IHdoZW4gYSBwYWNrZXQgZGVzdGluZWQgdG8gQHRpbiBoYXNoZXMgdG8KICAqCWEgZnFfZmxvdyB3aGljaCBpcyBhbHJlYWR5IG93bmVkIGJ5IGEgZGlmZmVyZW50IHRpbgogICogQGRlZl9jdmFyczogY29kZWwgdmFycyBmb3IgQGRlZl9mbG93CisgKiBAZnJhZ3M6IHVzZWQgdG8ga2VlcCBmcmFnbWVudHMgY3JlYXRlZCBhZnRlciBkZXF1ZXVlCiAgKi8KIHN0cnVjdCB0eHFfaW5mbyB7CiAJc3RydWN0IGZxX3RpbiB0aW47CiAJc3RydWN0IGZxX2Zsb3cgZGVmX2Zsb3c7CiAJc3RydWN0IGNvZGVsX3ZhcnMgZGVmX2N2YXJzOworCXN0cnVjdCBjb2RlbF9zdGF0cyBjc3RhdHM7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCBmcmFnczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyoga2VlcCBsYXN0ISAqLwogCXN0cnVjdCBpZWVlODAyMTFfdHhxIHR4cTsKIH07CiAKK3N0cnVjdCBpZWVlODAyMTFfaWZfbW50ciB7CisJdTMyIGZsYWdzOworCXU4IG11X2ZvbGxvd19hZGRyW0VUSF9BTEVOXSBfX2FsaWduZWQoMik7Cit9OworCisvKioKKyAqIHN0cnVjdCBpZWVlODAyMTFfaWZfbmFuIC0gTkFOIHN0YXRlCisgKgorICogQGNvbmY6IGN1cnJlbnQgTkFOIGNvbmZpZ3VyYXRpb24KKyAqIEBmdW5jX2lkczogYSBiaXRtYXAgb2YgYXZhaWxhYmxlIGluc3RhbmNlX2lkJ3MKKyAqLworc3RydWN0IGllZWU4MDIxMV9pZl9uYW4geworCXN0cnVjdCBjZmc4MDIxMV9uYW5fY29uZiBjb25mOworCisJLyogcHJvdGVjdHMgZnVuY3Rpb25faW5zdF9pZHMgKi8KKwlzcGlubG9ja190IGZ1bmNfbG9jazsKKwlzdHJ1Y3QgaWRyIGZ1bmN0aW9uX2luc3RfaWRzOworfTsKKwogc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCkBAIC05MjIsNyArOTQ2LDggQEAKIAkJc3RydWN0IGllZWU4MDIxMV9pZl9pYnNzIGlic3M7CiAJCXN0cnVjdCBpZWVlODAyMTFfaWZfbWVzaCBtZXNoOwogCQlzdHJ1Y3QgaWVlZTgwMjExX2lmX29jYiBvY2I7Ci0JCXUzMiBtbnRyX2ZsYWdzOworCQlzdHJ1Y3QgaWVlZTgwMjExX2lmX21udHIgbW50cjsKKwkJc3RydWN0IGllZWU4MDIxMV9pZl9uYW4gbmFuOwogCX0gdTsKIAogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCkBAIC0xMTEyLDcgKzExMzcsNiBAQAogCXN0cnVjdCBmcSBmcTsKIAlzdHJ1Y3QgY29kZWxfdmFycyAqY3ZhcnM7CiAJc3RydWN0IGNvZGVsX3BhcmFtcyBjcGFyYW1zOwotCXN0cnVjdCBjb2RlbF9zdGF0cyBjc3RhdHM7CiAKIAljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX29wcyAqb3BzOwogCkBAIC0xMjA4LDcgKzEyMzIsNyBAQAogCXNwaW5sb2NrX3QgdGltX2xvY2s7CiAJdW5zaWduZWQgbG9uZyBudW1fc3RhOwogCXN0cnVjdCBsaXN0X2hlYWQgc3RhX2xpc3Q7Ci0Jc3RydWN0IHJoYXNodGFibGUgc3RhX2hhc2g7CisJc3RydWN0IHJobHRhYmxlIHN0YV9oYXNoOwogCXN0cnVjdCB0aW1lcl9saXN0IHN0YV9jbGVhbnVwOwogCWludCBzdGFfZ2VuZXJhdGlvbjsKIApAQCAtMTQ3Niw2ICsxNTAwLDEzIEBACiAJcmV0dXJuIGNvbnRhaW5lcl9vZih0eHEsIHN0cnVjdCB0eHFfaW5mbywgdHhxKTsKIH0KIAorc3RhdGljIGlubGluZSBib29sIHR4cV9oYXNfcXVldWUoc3RydWN0IGllZWU4MDIxMV90eHEgKnR4cSkKK3sKKwlzdHJ1Y3QgdHhxX2luZm8gKnR4cWkgPSB0b190eHFfaW5mbyh0eHEpOworCisJcmV0dXJuICEoc2tiX3F1ZXVlX2VtcHR5KCZ0eHFpLT5mcmFncykgJiYgIXR4cWktPnRpbi5iYWNrbG9nX3BhY2tldHMpOworfQorCiBzdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfYnNzaWRfbWF0Y2goY29uc3QgdTggKnJhZGRyLCBjb25zdCB1OCAqYWRkcikKIHsKIAlyZXR1cm4gZXRoZXJfYWRkcl9lcXVhbChyYWRkciwgYWRkcikgfHwKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9pZmFjZS5jIGIvbmV0L21hYzgwMjExL2lmYWNlLmMKaW5kZXggYjEyM2E5ZS4uNjM4ZWMwNyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2lmYWNlLmMKKysrIGIvbmV0L21hYzgwMjExL2lmYWNlLmMKQEAgLTQzLDYgKzQzLDggQEAKICAqIGJ5IGVpdGhlciB0aGUgUlROTCwgdGhlIGlmbGlzdF9tdHggb3IgUkNVLgogICovCiAKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9pZmFjZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKIGJvb2wgX19pZWVlODAyMTFfcmVjYWxjX3R4cG93ZXIoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4X2NvbmYgKmNoYW5jdHhfY29uZjsKQEAgLTE4OCw3ICsxOTAsNyBAQAogCQkJY29udGludWU7CiAKIAkJaWYgKGl0ZXItPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IgJiYKLQkJICAgICEoaXRlci0+dS5tbnRyX2ZsYWdzICYgTU9OSVRPUl9GTEFHX0FDVElWRSkpCisJCSAgICAhKGl0ZXItPnUubW50ci5mbGFncyAmIE1PTklUT1JfRkxBR19BQ1RJVkUpKQogCQkJY29udGludWU7CiAKIAkJbSA9IGl0ZXItPnZpZi5hZGRyOwpAQCAtMjE3LDcgKzIxOSw3IEBACiAJCXJldHVybiAtRUJVU1k7CiAKIAlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IgJiYKLQkgICAgIShzZGF0YS0+dS5tbnRyX2ZsYWdzICYgTU9OSVRPUl9GTEFHX0FDVElWRSkpCisJICAgICEoc2RhdGEtPnUubW50ci5mbGFncyAmIE1PTklUT1JfRkxBR19BQ1RJVkUpKQogCQljaGVja19kdXAgPSBmYWxzZTsKIAogCXJldCA9IGllZWU4MDIxMV92ZXJpZnlfbWFjKHNkYXRhLCBzYS0+c2FfZGF0YSwgY2hlY2tfZHVwKTsKQEAgLTMyNSw2ICszMjcsOSBAQAogCWludCBuX3F1ZXVlcyA9IHNkYXRhLT5sb2NhbC0+aHcucXVldWVzOwogCWludCBpOwogCisJaWYgKGlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9OQU4pCisJCXJldHVybiAwOworCiAJaWYgKGlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBJRUVFODAyMTFfTlVNX0FDUzsgaSsrKSB7CiAJCQlpZiAoV0FSTl9PTl9PTkNFKHNkYXRhLT52aWYuaHdfcXVldWVbaV0gPT0KQEAgLTM1Nyw3ICszNjIsNyBAQAogCQkJCSAgICBjb25zdCBpbnQgb2Zmc2V0KQogewogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwotCXUzMiBmbGFncyA9IHNkYXRhLT51Lm1udHJfZmxhZ3M7CisJdTMyIGZsYWdzID0gc2RhdGEtPnUubW50ci5mbGFnczsKIAogI2RlZmluZSBBREpVU1QoX2YsIF9zKQlkbyB7CQkJCQlcCiAJaWYgKGZsYWdzICYgTU9OSVRPUl9GTEFHXyMjX2YpCQkJCVwKQEAgLTQ0OCw2ICs0NTMsOSBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAorCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnNkYXRhLT5za2JfcXVldWUpOworCUlOSVRfV09SSygmc2RhdGEtPndvcmssIGllZWU4MDIxMV9pZmFjZV93b3JrKTsKKwogCXJldHVybiAwOwogfQogCkBAIC01NDAsNiArNTQ4LDcgQEAKIAljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRToKIAljYXNlIE5MODAyMTFfSUZUWVBFX09DQjoKKwljYXNlIE5MODAyMTFfSUZUWVBFX05BTjoKIAkJLyogbm8gc3BlY2lhbCB0cmVhdG1lbnQgKi8KIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRDoKQEAgLTU4OSwxMiArNTk4LDEyIEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOgotCQlpZiAoc2RhdGEtPnUubW50cl9mbGFncyAmIE1PTklUT1JfRkxBR19DT09LX0ZSQU1FUykgeworCQlpZiAoc2RhdGEtPnUubW50ci5mbGFncyAmIE1PTklUT1JfRkxBR19DT09LX0ZSQU1FUykgewogCQkJbG9jYWwtPmNvb2tlZF9tbnRycysrOwogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoc2RhdGEtPnUubW50cl9mbGFncyAmIE1PTklUT1JfRkxBR19BQ1RJVkUpIHsKKwkJaWYgKHNkYXRhLT51Lm1udHIuZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQUNUSVZFKSB7CiAJCQlyZXMgPSBkcnZfYWRkX2ludGVyZmFjZShsb2NhbCwgc2RhdGEpOwogCQkJaWYgKHJlcykKIAkJCQlnb3RvIGVycl9zdG9wOwpAQCAtNjQxLDcgKzY1MCw4IEBACiAJCQlsb2NhbC0+ZmlmX3Byb2JlX3JlcSsrOwogCQl9CiAKLQkJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFKQorCQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0UgJiYKKwkJICAgIHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9OQU4pCiAJCQljaGFuZ2VkIHw9IGllZWU4MDIxMV9yZXNldF9lcnBfaW5mbyhzZGF0YSk7CiAJCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLCBjaGFuZ2VkKTsKIApAQCAtNjU1LDYgKzY2NSw3IEBACiAJCQlicmVhazsKIAkJY2FzZSBOTDgwMjExX0lGVFlQRV9XRFM6CiAJCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRToKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9OQU46CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCS8qIG5vdCByZWFjaGVkICovCkBAIC03ODcsNiArNzk4LDcgQEAKIAlzdHJ1Y3QgcHNfZGF0YSAqcHM7CiAJc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmIGNoYW5kZWY7CiAJYm9vbCBjYW5jZWxfc2NhbjsKKwlzdHJ1Y3QgY2ZnODAyMTFfbmFuX2Z1bmMgKmZ1bmM7CiAKIAljbGVhcl9iaXQoU0RBVEFfU1RBVEVfUlVOTklORywgJnNkYXRhLT5zdGF0ZSk7CiAKQEAgLTkyNiw3ICs5MzgsNyBAQAogCQkvKiBubyBuZWVkIHRvIHRlbGwgZHJpdmVyICovCiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKLQkJaWYgKHNkYXRhLT51Lm1udHJfZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQ09PS19GUkFNRVMpIHsKKwkJaWYgKHNkYXRhLT51Lm1udHIuZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQ09PS19GUkFNRVMpIHsKIAkJCWxvY2FsLT5jb29rZWRfbW50cnMtLTsKIAkJCWJyZWFrOwogCQl9CkBAIC05MzksNiArOTUxLDE4IEBACiAKIAkJaWVlZTgwMjExX2FkanVzdF9tb25pdG9yX2ZsYWdzKHNkYXRhLCAtMSk7CiAJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfTkFOOgorCQkvKiBjbGVhbiBhbGwgdGhlIGZ1bmN0aW9ucyAqLworCQlzcGluX2xvY2tfYmgoJnNkYXRhLT51Lm5hbi5mdW5jX2xvY2spOworCisJCWlkcl9mb3JfZWFjaF9lbnRyeSgmc2RhdGEtPnUubmFuLmZ1bmN0aW9uX2luc3RfaWRzLCBmdW5jLCBpKSB7CisJCQlpZHJfcmVtb3ZlKCZzZGF0YS0+dS5uYW4uZnVuY3Rpb25faW5zdF9pZHMsIGkpOworCQkJY2ZnODAyMTFfZnJlZV9uYW5fZnVuYyhmdW5jKTsKKwkJfQorCQlpZHJfZGVzdHJveSgmc2RhdGEtPnUubmFuLmZ1bmN0aW9uX2luc3RfaWRzKTsKKworCQlzcGluX3VubG9ja19iaCgmc2RhdGEtPnUubmFuLmZ1bmNfbG9jayk7CisJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRToKIAkJLyogcmVsaWVzIG9uIHN5bmNocm9uaXplX3JjdSgpIGJlbG93ICovCiAJCVJDVV9JTklUX1BPSU5URVIobG9jYWwtPnAycF9zZGF0YSwgTlVMTCk7CkBAIC0xMDEyLDcgKzEwMzYsNyBAQAogCQlpZWVlODAyMTFfcmVjYWxjX2lkbGUobG9jYWwpOwogCQltdXRleF91bmxvY2soJmxvY2FsLT5tdHgpOwogCi0JCWlmICghKHNkYXRhLT51Lm1udHJfZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQUNUSVZFKSkKKwkJaWYgKCEoc2RhdGEtPnUubW50ci5mbGFncyAmIE1PTklUT1JfRkxBR19BQ1RJVkUpKQogCQkJYnJlYWs7CiAKIAkJLyogZmFsbCB0aHJvdWdoICovCkBAIC0xNDQ0LDEyICsxNDY4LDE3IEBACiAJY2FzZSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOgogCQlzZGF0YS0+ZGV2LT50eXBlID0gQVJQSFJEX0lFRUU4MDIxMV9SQURJT1RBUDsKIAkJc2RhdGEtPmRldi0+bmV0ZGV2X29wcyA9ICZpZWVlODAyMTFfbW9uaXRvcmlmX29wczsKLQkJc2RhdGEtPnUubW50cl9mbGFncyA9IE1PTklUT1JfRkxBR19DT05UUk9MIHwKKwkJc2RhdGEtPnUubW50ci5mbGFncyA9IE1PTklUT1JfRkxBR19DT05UUk9MIHwKIAkJCQkgICAgICBNT05JVE9SX0ZMQUdfT1RIRVJfQlNTOwogCQlicmVhazsKIAljYXNlIE5MODAyMTFfSUZUWVBFX1dEUzoKIAkJc2RhdGEtPnZpZi5ic3NfY29uZi5ic3NpZCA9IE5VTEw7CiAJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfTkFOOgorCQlpZHJfaW5pdCgmc2RhdGEtPnUubmFuLmZ1bmN0aW9uX2luc3RfaWRzKTsKKwkJc3Bpbl9sb2NrX2luaXQoJnNkYXRhLT51Lm5hbi5mdW5jX2xvY2spOworCQlzZGF0YS0+dmlmLmJzc19jb25mLmJzc2lkID0gc2RhdGEtPnZpZi5hZGRyOworCQlicmVhazsKIAljYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFOgogCQlzZGF0YS0+dmlmLmJzc19jb25mLmJzc2lkID0gc2RhdGEtPnZpZi5hZGRyOwpAQCAtMTcxNyw3ICsxNzQ2LDcgQEAKIAogCUFTU0VSVF9SVE5MKCk7CiAKLQlpZiAodHlwZSA9PSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFKSB7CisJaWYgKHR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRSB8fCB0eXBlID09IE5MODAyMTFfSUZUWVBFX05BTikgewogCQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2OwogCiAJCXNkYXRhID0ga3phbGxvYyhzaXplb2YoKnNkYXRhKSArIGxvY2FsLT5ody52aWZfZGF0YV9zaXplLApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL21haW4uYyBiL25ldC9tYWM4MDIxMS9tYWluLmMKaW5kZXggZDAwZWE5Yi4uMTA3NWFjMiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL21haW4uYworKysgYi9uZXQvbWFjODAyMTEvbWFpbi5jCkBAIC02NjAsNiArNjYwLDkgQEAKIAogCWllZWU4MDIxMV9yb2Nfc2V0dXAobG9jYWwpOwogCisJbG9jYWwtPmh3LnJhZGlvdGFwX3RpbWVzdGFtcC51bml0c19wb3MgPSAtMTsKKwlsb2NhbC0+aHcucmFkaW90YXBfdGltZXN0YW1wLmFjY3VyYWN5ID0gLTE7CisKIAlyZXR1cm4gJmxvY2FsLT5odzsKICBlcnJfZnJlZToKIAl3aXBoeV9mcmVlKHdpcGh5KTsKQEAgLTgxOCw2ICs4MjEsMTEgQEAKIAkgICAgICFsb2NhbC0+b3BzLT50ZGxzX3JlY3ZfY2hhbm5lbF9zd2l0Y2gpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKKwlpZiAoV0FSTl9PTihsb2NhbC0+aHcud2lwaHktPmludGVyZmFjZV9tb2RlcyAmCisJCQlCSVQoTkw4MDIxMV9JRlRZUEVfTkFOKSAmJgorCQkgICAgKCFsb2NhbC0+b3BzLT5zdGFydF9uYW4gfHwgIWxvY2FsLT5vcHMtPnN0b3BfbmFuKSkpCisJCXJldHVybiAtRUlOVkFMOworCiAjaWZkZWYgQ09ORklHX1BNCiAJaWYgKGh3LT53aXBoeS0+d293bGFuICYmICghbG9jYWwtPm9wcy0+c3VzcGVuZCB8fCAhbG9jYWwtPm9wcy0+cmVzdW1lKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMDU1LDYgKzEwNjMsOSBAQAogCiAJbG9jYWwtPmR5bmFtaWNfcHNfZm9yY2VkX3RpbWVvdXQgPSAtMTsKIAorCWlmICghbG9jYWwtPmh3Lm1heF9uYW5fZGVfZW50cmllcykKKwkJbG9jYWwtPmh3Lm1heF9uYW5fZGVfZW50cmllcyA9IElFRUU4MDIxMV9NQVhfTkFOX0lOU1RBTkNFX0lEOworCiAJcmVzdWx0ID0gaWVlZTgwMjExX3dlcF9pbml0KGxvY2FsKTsKIAlpZiAocmVzdWx0IDwgMCkKIAkJd2lwaHlfZGVidWcobG9jYWwtPmh3LndpcGh5LCAiRmFpbGVkIHRvIGluaXRpYWxpemUgd2VwOiAlZFxuIiwKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9tZXNoLmMgYi9uZXQvbWFjODAyMTEvbWVzaC5jCmluZGV4IGM2NjQxMWQuLjQyMTIwZDkgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9tZXNoLmMKKysrIGIvbmV0L21hYzgwMjExL21lc2guYwpAQCAtODgxLDIwICs4ODEsMjIgQEAKIAogCW5ldGlmX2NhcnJpZXJfb2ZmKHNkYXRhLT5kZXYpOwogCisJLyogZmx1c2ggU1RBcyBhbmQgbXBhdGhzIG9uIHRoaXMgaWZhY2UgKi8KKwlzdGFfaW5mb19mbHVzaChzZGF0YSk7CisJbWVzaF9wYXRoX2ZsdXNoX2J5X2lmYWNlKHNkYXRhKTsKKwogCS8qIHN0b3AgdGhlIGJlYWNvbiAqLwogCWlmbXNoLT5tZXNoX2lkX2xlbiA9IDA7CiAJc2RhdGEtPnZpZi5ic3NfY29uZi5lbmFibGVfYmVhY29uID0gZmFsc2U7CiAJY2xlYXJfYml0KFNEQVRBX1NUQVRFX09GRkNIQU5ORUxfQkVBQ09OX1NUT1BQRUQsICZzZGF0YS0+c3RhdGUpOwogCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLCBCU1NfQ0hBTkdFRF9CRUFDT05fRU5BQkxFRCk7CisKKwkvKiByZW1vdmUgYmVhY29uICovCiAJYmNuID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChpZm1zaC0+YmVhY29uLAogCQkJCQlsb2NrZGVwX2lzX2hlbGQoJnNkYXRhLT53ZGV2Lm10eCkpOwogCVJDVV9JTklUX1BPSU5URVIoaWZtc2gtPmJlYWNvbiwgTlVMTCk7CiAJa2ZyZWVfcmN1KGJjbiwgcmN1X2hlYWQpOwogCi0JLyogZmx1c2ggU1RBcyBhbmQgbXBhdGhzIG9uIHRoaXMgaWZhY2UgKi8KLQlzdGFfaW5mb19mbHVzaChzZGF0YSk7Ci0JbWVzaF9wYXRoX2ZsdXNoX2J5X2lmYWNlKHNkYXRhKTsKLQogCS8qIGZyZWUgYWxsIHBvdGVudGlhbGx5IHN0aWxsIGJ1ZmZlcmVkIGdyb3VwLWFkZHJlc3NlZCBmcmFtZXMgKi8KIAlsb2NhbC0+dG90YWxfcHNfYnVmZmVyZWQgLT0gc2tiX3F1ZXVlX2xlbigmaWZtc2gtPnBzLmJjX2J1Zik7CiAJc2tiX3F1ZXVlX3B1cmdlKCZpZm1zaC0+cHMuYmNfYnVmKTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9tZXNoX2h3bXAuYyBiL25ldC9tYWM4MDIxMS9tZXNoX2h3bXAuYwppbmRleCA4ZjljM2JkLi5iNzQ3Yzk2IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvbWVzaF9od21wLmMKKysrIGIvbmV0L21hYzgwMjExL21lc2hfaHdtcC5jCkBAIC0zMjYsMjIgKzMyNiwzMyBAQAogCXUzMiB0eF90aW1lLCBlc3RpbWF0ZWRfcmV0eDsKIAl1NjQgcmVzdWx0OwogCi0JaWYgKHN0YS0+bWVzaC0+ZmFpbF9hdmcgPj0gMTAwKQotCQlyZXR1cm4gTUFYX01FVFJJQzsKKwkvKiBUcnkgdG8gZ2V0IHJhdGUgYmFzZWQgb24gSFcvU1cgUkMgYWxnb3JpdGhtLgorCSAqIFJhdGUgaXMgcmV0dXJuZWQgaW4gdW5pdHMgb2YgS2JwcywgY29ycmVjdCB0aGlzCisJICogdG8gY29tcGx5IHdpdGggYWlydGltZSBjYWxjdWxhdGlvbiB1bml0cworCSAqIFJvdW5kIHVwIGluIGNhc2Ugd2UgZ2V0IHJhdGUgPCAxMDBLYnBzCisJICovCisJcmF0ZSA9IERJVl9ST1VORF9VUChzdGFfZ2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQoc3RhKSwgMTAwKTsKIAotCXN0YV9zZXRfcmF0ZV9pbmZvX3R4KHN0YSwgJnN0YS0+dHhfc3RhdHMubGFzdF9yYXRlLCAmcmluZm8pOwotCXJhdGUgPSBjZmc4MDIxMV9jYWxjdWxhdGVfYml0cmF0ZSgmcmluZm8pOwotCWlmIChXQVJOX09OKCFyYXRlKSkKLQkJcmV0dXJuIE1BWF9NRVRSSUM7CisJaWYgKHJhdGUpIHsKKwkJZXJyID0gMDsKKwl9IGVsc2UgeworCQlpZiAoc3RhLT5tZXNoLT5mYWlsX2F2ZyA+PSAxMDApCisJCQlyZXR1cm4gTUFYX01FVFJJQzsKIAotCWVyciA9IChzdGEtPm1lc2gtPmZhaWxfYXZnIDw8IEFSSVRIX1NISUZUKSAvIDEwMDsKKwkJc3RhX3NldF9yYXRlX2luZm9fdHgoc3RhLCAmc3RhLT50eF9zdGF0cy5sYXN0X3JhdGUsICZyaW5mbyk7CisJCXJhdGUgPSBjZmc4MDIxMV9jYWxjdWxhdGVfYml0cmF0ZSgmcmluZm8pOworCQlpZiAoV0FSTl9PTighcmF0ZSkpCisJCQlyZXR1cm4gTUFYX01FVFJJQzsKKworCQllcnIgPSAoc3RhLT5tZXNoLT5mYWlsX2F2ZyA8PCBBUklUSF9TSElGVCkgLyAxMDA7CisJfQogCiAJLyogYml0cmF0ZSBpcyBpbiB1bml0cyBvZiAxMDAgS2Jwcywgd2hpbGUgd2UgbmVlZCByYXRlIGluIHVuaXRzIG9mCiAJICogMU1icHMuIFRoaXMgd2lsbCBiZSBjb3JyZWN0ZWQgb24gdHhfdGltZSBjb21wdXRhdGlvbi4KIAkgKi8KIAl0eF90aW1lID0gKGRldmljZV9jb25zdGFudCArIDEwICogdGVzdF9mcmFtZV9sZW4gLyByYXRlKTsKIAllc3RpbWF0ZWRfcmV0eCA9ICgoMSA8PCAoMiAqIEFSSVRIX1NISUZUKSkgLyAoc191bml0IC0gZXJyKSk7Ci0JcmVzdWx0ID0gKHR4X3RpbWUgKiBlc3RpbWF0ZWRfcmV0eCkgPj4gKDIgKiBBUklUSF9TSElGVCkgOworCXJlc3VsdCA9ICh0eF90aW1lICogZXN0aW1hdGVkX3JldHgpID4+ICgyICogQVJJVEhfU0hJRlQpOwogCXJldHVybiAodTMyKXJlc3VsdDsKIH0KIApAQCAtNzQ2LDYgKzc1Nyw3IEBACiAJCXN0YSA9IG5leHRfaG9wX2RlcmVmX3Byb3RlY3RlZChtcGF0aCk7CiAJCWlmIChtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfQUNUSVZFICYmCiAJCSAgICBldGhlcl9hZGRyX2VxdWFsKHRhLCBzdGEtPnN0YS5hZGRyKSAmJgorCQkgICAgIShtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfRklYRUQpICYmCiAJCSAgICAoIShtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfU05fVkFMSUQpIHx8CiAJCSAgICBTTl9HVCh0YXJnZXRfc24sIG1wYXRoLT5zbikgIHx8IHRhcmdldF9zbiA9PSAwKSkgewogCQkJbXBhdGgtPmZsYWdzICY9IH5NRVNIX1BBVEhfQUNUSVZFOwpAQCAtMTAxMiw3ICsxMDI0LDcgQEAKIAkJZ290byBlbmRkaXNjb3Zlcnk7CiAKIAlzcGluX2xvY2tfYmgoJm1wYXRoLT5zdGF0ZV9sb2NrKTsKLQlpZiAobXBhdGgtPmZsYWdzICYgTUVTSF9QQVRIX0RFTEVURUQpIHsKKwlpZiAobXBhdGgtPmZsYWdzICYgKE1FU0hfUEFUSF9ERUxFVEVEIHwgTUVTSF9QQVRIX0ZJWEVEKSkgewogCQlzcGluX3VubG9ja19iaCgmbXBhdGgtPnN0YXRlX2xvY2spOwogCQlnb3RvIGVuZGRpc2NvdmVyeTsKIAl9CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWVzaF9wYXRodGJsLmMgYi9uZXQvbWFjODAyMTEvbWVzaF9wYXRodGJsLmMKaW5kZXggNmRiMmRkZi4uZjBlNjE3NSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL21lc2hfcGF0aHRibC5jCisrKyBiL25ldC9tYWM4MDIxMS9tZXNoX3BhdGh0YmwuYwpAQCAtODI2LDcgKzgyNiw3IEBACiAJbXBhdGgtPm1ldHJpYyA9IDA7CiAJbXBhdGgtPmhvcF9jb3VudCA9IDA7CiAJbXBhdGgtPmV4cF90aW1lID0gMDsKLQltcGF0aC0+ZmxhZ3MgfD0gTUVTSF9QQVRIX0ZJWEVEOworCW1wYXRoLT5mbGFncyA9IE1FU0hfUEFUSF9GSVhFRCB8IE1FU0hfUEFUSF9TTl9WQUxJRDsKIAltZXNoX3BhdGhfYWN0aXZhdGUobXBhdGgpOwogCXNwaW5fdW5sb2NrX2JoKCZtcGF0aC0+c3RhdGVfbG9jayk7CiAJbWVzaF9wYXRoX3R4X3BlbmRpbmcobXBhdGgpOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL21lc2hfc3luYy5jIGIvbmV0L21hYzgwMjExL21lc2hfc3luYy5jCmluZGV4IDY0YmMyMmEuLmZhY2EyMmMgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9tZXNoX3N5bmMuYworKysgYi9uZXQvbWFjODAyMTEvbWVzaF9zeW5jLmMKQEAgLTI4LDcgKzI4LDcgQEAKICAqIGNvdWxkIGJlLCBmb3IgaW5zdGFuY2UsIGluIGNhc2UgYSBuZWlnaGJvciBpcyByZXN0YXJ0ZWQgYW5kIGl0cyBUU0YgY291bnRlcgogICogcmVzZXQuCiAgKi8KLSNkZWZpbmUgVE9GRlNFVF9NQVhJTVVNX0FESlVTVE1FTlQgMzAwMDAJCS8qIDMwIG1zICovCisjZGVmaW5lIFRPRkZTRVRfTUFYSU1VTV9BREpVU1RNRU5UIDgwMAkJLyogMC44IG1zICovCiAKIHN0cnVjdCBzeW5jX21ldGhvZCB7CiAJdTggbWV0aG9kOwpAQCAtNzAsOSArNzAsMTMgQEAKIAl9CiAJc3Bpbl91bmxvY2tfYmgoJmlmbXNoLT5zeW5jX29mZnNldF9sb2NrKTsKIAotCXRzZiA9IGRydl9nZXRfdHNmKGxvY2FsLCBzZGF0YSk7Ci0JaWYgKHRzZiAhPSAtMVVMTCkKLQkJZHJ2X3NldF90c2YobG9jYWwsIHNkYXRhLCB0c2YgKyB0c2ZkZWx0YSk7CisJaWYgKGxvY2FsLT5vcHMtPm9mZnNldF90c2YpIHsKKwkJZHJ2X29mZnNldF90c2YobG9jYWwsIHNkYXRhLCB0c2ZkZWx0YSk7CisJfSBlbHNlIHsKKwkJdHNmID0gZHJ2X2dldF90c2YobG9jYWwsIHNkYXRhKTsKKwkJaWYgKHRzZiAhPSAtMVVMTCkKKwkJCWRydl9zZXRfdHNmKGxvY2FsLCBzZGF0YSwgdHNmICsgdHNmZGVsdGEpOworCX0KIH0KIAogc3RhdGljIHZvaWQgbWVzaF9zeW5jX29mZnNldF9yeF9iY25fcHJlc3Aoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWxtZS5jIGIvbmV0L21hYzgwMjExL21sbWUuYwppbmRleCA4ZDQyNmY2Li43NDg2ZjJkIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvbWxtZS5jCisrKyBiL25ldC9tYWM4MDIxMS9tbG1lLmMKQEAgLTE2NzIsMTEgKzE2NzIsMTUgQEAKIAkJCSAgICAgbm9uX2FjbV9hYysrKQogCQkJCWlmICghKHNkYXRhLT53bW1fYWNtICYgQklUKDcgLSAyICogbm9uX2FjbV9hYykpKQogCQkJCQlicmVhazsKLQkJCS8qIFRoZSBsb29wIHdpbGwgcmVzdWx0IGluIHVzaW5nIEJLIGV2ZW4gaWYgaXQgcmVxdWlyZXMKLQkJCSAqIGFkbWlzc2lvbiBjb250cm9sLCBzdWNoIGNvbmZpZ3VyYXRpb24gbWFrZXMgbm8gc2Vuc2UKLQkJCSAqIGFuZCB3ZSBoYXZlIHRvIHRyYW5zbWl0IHNvbWVob3cgLSB0aGUgQUMgc2VsZWN0aW9uCi0JCQkgKiBkb2VzIHRoZSBzYW1lIHRoaW5nLgorCQkJLyogVXN1YWxseSB0aGUgbG9vcCB3aWxsIHJlc3VsdCBpbiB1c2luZyBCSyBldmVuIGlmIGl0CisJCQkgKiByZXF1aXJlcyBhZG1pc3Npb24gY29udHJvbCwgYnV0IHN1Y2ggYSBjb25maWd1cmF0aW9uCisJCQkgKiBtYWtlcyBubyBzZW5zZSBhbmQgd2UgaGF2ZSB0byB0cmFuc21pdCBzb21laG93IC0gdGhlCisJCQkgKiBBQyBzZWxlY3Rpb24gZG9lcyB0aGUgc2FtZSB0aGluZy4KKwkJCSAqIElmIHdlIHN0YXJ0ZWQgb3V0IHRyeWluZyB0byBkb3duZ3JhZGUgZnJvbSBCSywgdGhlbgorCQkJICogdGhlIGV4dHJhIGNvbmRpdGlvbiBoZXJlIG1pZ2h0IGJlIG5lZWRlZC4KIAkJCSAqLworCQkJaWYgKG5vbl9hY21fYWMgPj0gSUVFRTgwMjExX05VTV9BQ1MpCisJCQkJbm9uX2FjbV9hYyA9IElFRUU4MDIxMV9BQ19CSzsKIAkJCWlmIChkcnZfY29uZl90eChsb2NhbCwgc2RhdGEsIGFjLAogCQkJCQkmc2RhdGEtPnR4X2NvbmZbbm9uX2FjbV9hY10pKQogCQkJCXNkYXRhX2VycihzZGF0YSwKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9vZmZjaGFubmVsLmMgYi9uZXQvbWFjODAyMTEvb2ZmY2hhbm5lbC5jCmluZGV4IDU1YTljNWIuLmMzZjYxMGIgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9vZmZjaGFubmVsLmMKKysrIGIvbmV0L21hYzgwMjExL29mZmNoYW5uZWwuYwpAQCAtMTI4LDcgKzEyOCw4IEBACiAJCWlmICghaWVlZTgwMjExX3NkYXRhX3J1bm5pbmcoc2RhdGEpKQogCQkJY29udGludWU7CiAKLQkJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFKQorCQlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0UgfHwKKwkJICAgIHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9OQU4pCiAJCQljb250aW51ZTsKIAogCQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX01PTklUT1IpCkBAIC04MzgsNiArODM5LDcgQEAKIAljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0U6CiAJCW5lZWRfb2ZmY2hhbiA9IHRydWU7CiAJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfTkFOOgogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcG0uYyBiL25ldC9tYWM4MDIxMS9wbS5jCmluZGV4IDAwYTQzYTcuLjI4YTNhMDkgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9wbS5jCisrKyBiL25ldC9tYWM4MDIxMS9wbS5jCkBAIC0xNzgsOCArMTc4LDcgQEAKIAlXQVJOX09OKCFsaXN0X2VtcHR5KCZsb2NhbC0+Y2hhbmN0eF9saXN0KSk7CiAKIAkvKiBzdG9wIGhhcmR3YXJlIC0gdGhpcyBtdXN0IHN0b3AgUlggKi8KLQlpZiAobG9jYWwtPm9wZW5fY291bnQpCi0JCWllZWU4MDIxMV9zdG9wX2RldmljZShsb2NhbCk7CisJaWVlZTgwMjExX3N0b3BfZGV2aWNlKGxvY2FsKTsKIAogIHN1c3BlbmQ6CiAJbG9jYWwtPnN1c3BlbmRlZCA9IHRydWU7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcnguYyBiL25ldC9tYWM4MDIxMS9yeC5jCmluZGV4IDJlOGE5MDIuLjYxNzVkYjMgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9yeC5jCisrKyBiL25ldC9tYWM4MDIxMS9yeC5jCkBAIC0xODAsNiArMTgwLDExIEBACiAJCWxlbiArPSAxMjsKIAl9CiAKKwlpZiAobG9jYWwtPmh3LnJhZGlvdGFwX3RpbWVzdGFtcC51bml0c19wb3MgPj0gMCkgeworCQlsZW4gPSBBTElHTihsZW4sIDgpOworCQlsZW4gKz0gMTI7CisJfQorCiAJaWYgKHN0YXR1cy0+Y2hhaW5zKSB7CiAJCS8qIGFudGVubmEgYW5kIGFudGVubmEgc2lnbmFsIGZpZWxkcyAqLwogCQlsZW4gKz0gMiAqIGh3ZWlnaHQ4KHN0YXR1cy0+Y2hhaW5zKTsKQEAgLTQ0Nyw2ICs0NTIsMzEgQEAKIAkJcG9zICs9IDI7CiAJfQogCisJaWYgKGxvY2FsLT5ody5yYWRpb3RhcF90aW1lc3RhbXAudW5pdHNfcG9zID49IDApIHsKKwkJdTE2IGFjY3VyYWN5ID0gMDsKKwkJdTggZmxhZ3MgPSBJRUVFODAyMTFfUkFESU9UQVBfVElNRVNUQU1QX0ZMQUdfMzJCSVQ7CisKKwkJcnRoZHItPml0X3ByZXNlbnQgfD0KKwkJCWNwdV90b19sZTMyKDEgPDwgSUVFRTgwMjExX1JBRElPVEFQX1RJTUVTVEFNUCk7CisKKwkJLyogZW5zdXJlIDggYnl0ZSBhbGlnbm1lbnQgKi8KKwkJd2hpbGUgKChwb3MgLSAodTggKilydGhkcikgJiA3KQorCQkJcG9zKys7CisKKwkJcHV0X3VuYWxpZ25lZF9sZTY0KHN0YXR1cy0+ZGV2aWNlX3RpbWVzdGFtcCwgcG9zKTsKKwkJcG9zICs9IHNpemVvZih1NjQpOworCisJCWlmIChsb2NhbC0+aHcucmFkaW90YXBfdGltZXN0YW1wLmFjY3VyYWN5ID49IDApIHsKKwkJCWFjY3VyYWN5ID0gbG9jYWwtPmh3LnJhZGlvdGFwX3RpbWVzdGFtcC5hY2N1cmFjeTsKKwkJCWZsYWdzIHw9IElFRUU4MDIxMV9SQURJT1RBUF9USU1FU1RBTVBfRkxBR19BQ0NVUkFDWTsKKwkJfQorCQlwdXRfdW5hbGlnbmVkX2xlMTYoYWNjdXJhY3ksIHBvcyk7CisJCXBvcyArPSBzaXplb2YodTE2KTsKKworCQkqcG9zKysgPSBsb2NhbC0+aHcucmFkaW90YXBfdGltZXN0YW1wLnVuaXRzX3BvczsKKwkJKnBvcysrID0gZmxhZ3M7CisJfQorCiAJZm9yX2VhY2hfc2V0X2JpdChjaGFpbiwgJmNoYWlucywgSUVFRTgwMjExX01BWF9DSEFJTlMpIHsKIAkJKnBvcysrID0gc3RhdHVzLT5jaGFpbl9zaWduYWxbY2hhaW5dOwogCQkqcG9zKysgPSBjaGFpbjsKQEAgLTQ4NSw2ICs1MTUsOSBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpwcmV2X2RldiA9IE5VTEw7CiAJaW50IHByZXNlbnRfZmNzX2xlbiA9IDA7CiAJdW5zaWduZWQgaW50IHJ0YXBfdmVuZG9yX3NwYWNlID0gMDsKKwlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqbW9uaXRvcl9zZGF0YSA9CisJCXJjdV9kZXJlZmVyZW5jZShsb2NhbC0+bW9uaXRvcl9zZGF0YSk7CiAKIAlpZiAodW5saWtlbHkoc3RhdHVzLT5mbGFnICYgUlhfRkxBR19SQURJT1RBUF9WRU5ET1JfREFUQSkpIHsKIAkJc3RydWN0IGllZWU4MDIxMV92ZW5kb3JfcmFkaW90YXAgKnJ0YXAgPSAodm9pZCAqKW9yaWdza2ItPmRhdGE7CkBAIC01NjcsNyArNjAwLDcgQEAKIAkJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9NT05JVE9SKQogCQkJY29udGludWU7CiAKLQkJaWYgKHNkYXRhLT51Lm1udHJfZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQ09PS19GUkFNRVMpCisJCWlmIChzZGF0YS0+dS5tbnRyLmZsYWdzICYgTU9OSVRPUl9GTEFHX0NPT0tfRlJBTUVTKQogCQkJY29udGludWU7CiAKIAkJaWYgKCFpZWVlODAyMTFfc2RhdGFfcnVubmluZyhzZGF0YSkpCkBAIC01ODUsNiArNjE4LDIzIEBACiAJCWllZWU4MDIxMV9yeF9zdGF0cyhzZGF0YS0+ZGV2LCBza2ItPmxlbik7CiAJfQogCisJbWdtdCA9ICh2b2lkICopc2tiLT5kYXRhOworCWlmIChtb25pdG9yX3NkYXRhICYmCisJICAgIHNrYi0+bGVuID49IElFRUU4MDIxMV9NSU5fQUNUSU9OX1NJWkUgKyAxICsgVkhUX01VTUlNT19HUk9VUFNfREFUQV9MRU4gJiYKKwkgICAgaWVlZTgwMjExX2lzX2FjdGlvbihtZ210LT5mcmFtZV9jb250cm9sKSAmJgorCSAgICBtZ210LT51LmFjdGlvbi5jYXRlZ29yeSA9PSBXTEFOX0NBVEVHT1JZX1ZIVCAmJgorCSAgICBtZ210LT51LmFjdGlvbi51LnZodF9ncm91cF9ub3RpZi5hY3Rpb25fY29kZSA9PSBXTEFOX1ZIVF9BQ1RJT05fR1JPVVBJRF9NR01UICYmCisJICAgIGlzX3ZhbGlkX2V0aGVyX2FkZHIobW9uaXRvcl9zZGF0YS0+dS5tbnRyLm11X2ZvbGxvd19hZGRyKSAmJgorCSAgICBldGhlcl9hZGRyX2VxdWFsKG1nbXQtPmRhLCBtb25pdG9yX3NkYXRhLT51Lm1udHIubXVfZm9sbG93X2FkZHIpKSB7CisJCXN0cnVjdCBza19idWZmICptdV9za2IgPSBza2JfY29weShza2IsIEdGUF9BVE9NSUMpOworCisJCWlmIChtdV9za2IpIHsKKwkJCW11X3NrYi0+cGt0X3R5cGUgPSBJRUVFODAyMTFfU0RBVEFfUVVFVUVfVFlQRV9GUkFNRTsKKwkJCXNrYl9xdWV1ZV90YWlsKCZtb25pdG9yX3NkYXRhLT5za2JfcXVldWUsIG11X3NrYik7CisJCQlpZWVlODAyMTFfcXVldWVfd29yaygmbG9jYWwtPmh3LCAmbW9uaXRvcl9zZGF0YS0+d29yayk7CisJCX0KKwl9CisKIAlpZiAocHJldl9kZXYpIHsKIAkJc2tiLT5kZXYgPSBwcmV2X2RldjsKIAkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKQEAgLTEwNzIsOCArMTEyMiwxNSBAQAogCXRpZCA9ICppZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKSAmIElFRUU4MDIxMV9RT1NfQ1RMX1RJRF9NQVNLOwogCiAJdGlkX2FnZ19yeCA9IHJjdV9kZXJlZmVyZW5jZShzdGEtPmFtcGR1X21sbWUudGlkX3J4W3RpZF0pOwotCWlmICghdGlkX2FnZ19yeCkKKwlpZiAoIXRpZF9hZ2dfcngpIHsKKwkJaWYgKGFja19wb2xpY3kgPT0gSUVFRTgwMjExX1FPU19DVExfQUNLX1BPTElDWV9CTE9DS0FDSyAmJgorCQkgICAgIXRlc3RfYml0KHRpZCwgcngtPnN0YS0+YW1wZHVfbWxtZS5hZ2dfc2Vzc2lvbl92YWxpZCkgJiYKKwkJICAgICF0ZXN0X2FuZF9zZXRfYml0KHRpZCwgcngtPnN0YS0+YW1wZHVfbWxtZS51bmV4cGVjdGVkX2FnZykpCisJCQlpZWVlODAyMTFfc2VuZF9kZWxiYShyeC0+c2RhdGEsIHJ4LT5zdGEtPnN0YS5hZGRyLCB0aWQsCisJCQkJCSAgICAgV0xBTl9CQUNLX1JFQ0lQSUVOVCwKKwkJCQkJICAgICBXTEFOX1JFQVNPTl9RU1RBX1JFUVVJUkVfU0VUVVApOwogCQlnb3RvIGRvbnRfcmVvcmRlcjsKKwl9CiAKIAkvKiBxb3MgbnVsbCBkYXRhIGZyYW1lcyBhcmUgZXhjbHVkZWQgKi8KIAlpZiAodW5saWtlbHkoaGRyLT5mcmFtZV9jb250cm9sICYgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX05VTExGVU5DKSkpCkBAIC0xMjY2LDkgKzEzMjMsNyBAQAogCQlyZXR1cm47CiAKIAlmb3IgKHRpZCA9IDA7IHRpZCA8IEFSUkFZX1NJWkUoc3RhLT5zdGEudHhxKTsgdGlkKyspIHsKLQkJc3RydWN0IHR4cV9pbmZvICp0eHFpID0gdG9fdHhxX2luZm8oc3RhLT5zdGEudHhxW3RpZF0pOwotCi0JCWlmICghdHhxaS0+dGluLmJhY2tsb2dfcGFja2V0cykKKwkJaWYgKHR4cV9oYXNfcXVldWUoc3RhLT5zdGEudHhxW3RpZF0pKQogCQkJc2V0X2JpdCh0aWQsICZzdGEtPnR4cV9idWZmZXJlZF90aWRzKTsKIAkJZWxzZQogCQkJY2xlYXJfYml0KHRpZCwgJnN0YS0+dHhxX2J1ZmZlcmVkX3RpZHMpOwpAQCAtMjUzNSw2ICsyNTkwLDEyIEBACiAKIAkJdGlkID0gbGUxNl90b19jcHUoYmFyX2RhdGEuY29udHJvbCkgPj4gMTI7CiAKKwkJaWYgKCF0ZXN0X2JpdCh0aWQsIHJ4LT5zdGEtPmFtcGR1X21sbWUuYWdnX3Nlc3Npb25fdmFsaWQpICYmCisJCSAgICAhdGVzdF9hbmRfc2V0X2JpdCh0aWQsIHJ4LT5zdGEtPmFtcGR1X21sbWUudW5leHBlY3RlZF9hZ2cpKQorCQkJaWVlZTgwMjExX3NlbmRfZGVsYmEocngtPnNkYXRhLCByeC0+c3RhLT5zdGEuYWRkciwgdGlkLAorCQkJCQkgICAgIFdMQU5fQkFDS19SRUNJUElFTlQsCisJCQkJCSAgICAgV0xBTl9SRUFTT05fUVNUQV9SRVFVSVJFX1NFVFVQKTsKKwogCQl0aWRfYWdnX3J4ID0gcmN1X2RlcmVmZXJlbmNlKHJ4LT5zdGEtPmFtcGR1X21sbWUudGlkX3J4W3RpZF0pOwogCQlpZiAoIXRpZF9hZ2dfcngpCiAJCQlyZXR1cm4gUlhfRFJPUF9NT05JVE9SOwpAQCAtMzE0Nyw3ICszMjA4LDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUiB8fAotCQkgICAgIShzZGF0YS0+dS5tbnRyX2ZsYWdzICYgTU9OSVRPUl9GTEFHX0NPT0tfRlJBTUVTKSkKKwkJICAgICEoc2RhdGEtPnUubW50ci5mbGFncyAmIE1PTklUT1JfRkxBR19DT09LX0ZSQU1FUykpCiAJCQljb250aW51ZTsKIAogCQlpZiAocHJldl9kZXYpIHsKQEAgLTM1MjMsNiArMzU4NCw5IEBACiAJCSAgICAgICBpZWVlODAyMTFfaXNfcHJvYmVfcmVxKGhkci0+ZnJhbWVfY29udHJvbCkgfHwKIAkJICAgICAgIGllZWU4MDIxMV9pc19wcm9iZV9yZXNwKGhkci0+ZnJhbWVfY29udHJvbCkgfHwKIAkJICAgICAgIGllZWU4MDIxMV9pc19iZWFjb24oaGRyLT5mcmFtZV9jb250cm9sKTsKKwljYXNlIE5MODAyMTFfSUZUWVBFX05BTjoKKwkJLyogQ3VycmVudGx5IG5vIGZyYW1lcyBvbiBOQU4gaW50ZXJmYWNlIGFyZSBhbGxvd2VkICovCisJCXJldHVybiBmYWxzZTsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CkBAIC0zOTQwLDcgKzQwMDQsNyBAQAogCV9fbGUxNiBmYzsKIAlzdHJ1Y3QgaWVlZTgwMjExX3J4X2RhdGEgcng7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqcHJldjsKLQlzdHJ1Y3Qgcmhhc2hfaGVhZCAqdG1wOworCXN0cnVjdCByaGxpc3RfaGVhZCAqdG1wOwogCWludCBlcnIgPSAwOwogCiAJZmMgPSAoKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhKS0+ZnJhbWVfY29udHJvbDsKQEAgLTM5ODMsMTMgKzQwNDcsMTAgQEAKIAkJZ290byBvdXQ7CiAJfSBlbHNlIGlmIChpZWVlODAyMTFfaXNfZGF0YShmYykpIHsKIAkJc3RydWN0IHN0YV9pbmZvICpzdGEsICpwcmV2X3N0YTsKLQkJY29uc3Qgc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsOwogCiAJCXByZXZfc3RhID0gTlVMTDsKIAotCQl0YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KGxvY2FsLT5zdGFfaGFzaC50YmwsICZsb2NhbC0+c3RhX2hhc2gpOwotCi0JCWZvcl9lYWNoX3N0YV9pbmZvKGxvY2FsLCB0YmwsIGhkci0+YWRkcjIsIHN0YSwgdG1wKSB7CisJCWZvcl9lYWNoX3N0YV9pbmZvKGxvY2FsLCBoZHItPmFkZHIyLCBzdGEsIHRtcCkgewogCQkJaWYgKCFwcmV2X3N0YSkgewogCQkJCXByZXZfc3RhID0gc3RhOwogCQkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3NjYW4uYyBiL25ldC9tYWM4MDIxMS9zY2FuLmMKaW5kZXggMDcwYjQwZi4uMjNkOGFjOCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3NjYW4uYworKysgYi9uZXQvbWFjODAyMTEvc2Nhbi5jCkBAIC00MjAsNyArNDIwLDcgQEAKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IGh3X3RvX2xvY2FsKGh3KTsKIAotCXRyYWNlX2FwaV9zY2FuX2NvbXBsZXRlZChsb2NhbCwgaW5mbyk7CisJdHJhY2VfYXBpX3NjYW5fY29tcGxldGVkKGxvY2FsLCBpbmZvLT5hYm9ydGVkKTsKIAogCXNldF9iaXQoU0NBTl9DT01QTEVURUQsICZsb2NhbC0+c2Nhbm5pbmcpOwogCWlmIChpbmZvLT5hYm9ydGVkKQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3N0YV9pbmZvLmMgYi9uZXQvbWFjODAyMTEvc3RhX2luZm8uYwppbmRleCA3NmI3MzdkLi43OGU5ZWNiIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvc3RhX2luZm8uYworKysgYi9uZXQvbWFjODAyMTEvc3RhX2luZm8uYwpAQCAtNjcsMTIgKzY3LDEwIEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgc3RhX3JodF9wYXJhbXMgPSB7CiAJLm5lbGVtX2hpbnQgPSAzLCAvKiBzdGFydCBzbWFsbCAqLwotCS5pbnNlY3VyZV9lbGFzdGljaXR5ID0gdHJ1ZSwgLyogRGlzYWJsZSBjaGFpbi1sZW5ndGggY2hlY2tzLiAqLwogCS5hdXRvbWF0aWNfc2hyaW5raW5nID0gdHJ1ZSwKIAkuaGVhZF9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc3RhX2luZm8sIGhhc2hfbm9kZSksCiAJLmtleV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc3RhX2luZm8sIGFkZHIpLAogCS5rZXlfbGVuID0gRVRIX0FMRU4sCi0JLmhhc2hmbiA9IHN0YV9hZGRyX2hhc2gsCiAJLm1heF9zaXplID0gQ09ORklHX01BQzgwMjExX1NUQV9IQVNIX01BWF9TSVpFLAogfTsKIApAQCAtODAsOCArNzgsOCBAQAogc3RhdGljIGludCBzdGFfaW5mb19oYXNoX2RlbChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKIAkJCSAgICAgc3RydWN0IHN0YV9pbmZvICpzdGEpCiB7Ci0JcmV0dXJuIHJoYXNodGFibGVfcmVtb3ZlX2Zhc3QoJmxvY2FsLT5zdGFfaGFzaCwgJnN0YS0+aGFzaF9ub2RlLAotCQkJCSAgICAgIHN0YV9yaHRfcGFyYW1zKTsKKwlyZXR1cm4gcmhsdGFibGVfcmVtb3ZlKCZsb2NhbC0+c3RhX2hhc2gsICZzdGEtPmhhc2hfbm9kZSwKKwkJCSAgICAgICBzdGFfcmh0X3BhcmFtcyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fY2xlYW51cF9zaW5nbGVfc3RhKHN0cnVjdCBzdGFfaW5mbyAqc3RhKQpAQCAtMTU3LDE5ICsxNTUsMjIgQEAKIAlzdGFfaW5mb19mcmVlKGxvY2FsLCBzdGEpOwogfQogCitzdHJ1Y3QgcmhsaXN0X2hlYWQgKnN0YV9pbmZvX2hhc2hfbG9va3VwKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJCQkgY29uc3QgdTggKmFkZHIpCit7CisJcmV0dXJuIHJobHRhYmxlX2xvb2t1cCgmbG9jYWwtPnN0YV9oYXNoLCBhZGRyLCBzdGFfcmh0X3BhcmFtcyk7Cit9CisKIC8qIHByb3RlY3RlZCBieSBSQ1UgKi8KIHN0cnVjdCBzdGFfaW5mbyAqc3RhX2luZm9fZ2V0KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkJICAgICAgY29uc3QgdTggKmFkZHIpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJc3RydWN0IHJobGlzdF9oZWFkICp0bXA7CiAJc3RydWN0IHN0YV9pbmZvICpzdGE7Ci0Jc3RydWN0IHJoYXNoX2hlYWQgKnRtcDsKLQljb25zdCBzdHJ1Y3QgYnVja2V0X3RhYmxlICp0Ymw7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JdGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdShsb2NhbC0+c3RhX2hhc2gudGJsLCAmbG9jYWwtPnN0YV9oYXNoKTsKLQotCWZvcl9lYWNoX3N0YV9pbmZvKGxvY2FsLCB0YmwsIGFkZHIsIHN0YSwgdG1wKSB7CisJZm9yX2VhY2hfc3RhX2luZm8obG9jYWwsIGFkZHIsIHN0YSwgdG1wKSB7CiAJCWlmIChzdGEtPnNkYXRhID09IHNkYXRhKSB7CiAJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCS8qIHRoaXMgaXMgc2FmZSBhcyB0aGUgY2FsbGVyIG11c3QgYWxyZWFkeSBob2xkCkBAIC0xOTAsMTQgKzE5MSwxMSBAQAogCQkJCSAgY29uc3QgdTggKmFkZHIpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJc3RydWN0IHJobGlzdF9oZWFkICp0bXA7CiAJc3RydWN0IHN0YV9pbmZvICpzdGE7Ci0Jc3RydWN0IHJoYXNoX2hlYWQgKnRtcDsKLQljb25zdCBzdHJ1Y3QgYnVja2V0X3RhYmxlICp0Ymw7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JdGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdShsb2NhbC0+c3RhX2hhc2gudGJsLCAmbG9jYWwtPnN0YV9oYXNoKTsKLQotCWZvcl9lYWNoX3N0YV9pbmZvKGxvY2FsLCB0YmwsIGFkZHIsIHN0YSwgdG1wKSB7CisJZm9yX2VhY2hfc3RhX2luZm8obG9jYWwsIGFkZHIsIHN0YSwgdG1wKSB7CiAJCWlmIChzdGEtPnNkYXRhID09IHNkYXRhIHx8CiAJCSAgICAoc3RhLT5zZGF0YS0+YnNzICYmIHN0YS0+c2RhdGEtPmJzcyA9PSBzZGF0YS0+YnNzKSkgewogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC0yNjMsOCArMjYxLDggQEAKIHN0YXRpYyBpbnQgc3RhX2luZm9faGFzaF9hZGQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCiAJCQkgICAgIHN0cnVjdCBzdGFfaW5mbyAqc3RhKQogewotCXJldHVybiByaGFzaHRhYmxlX2luc2VydF9mYXN0KCZsb2NhbC0+c3RhX2hhc2gsICZzdGEtPmhhc2hfbm9kZSwKLQkJCQkgICAgICBzdGFfcmh0X3BhcmFtcyk7CisJcmV0dXJuIHJobHRhYmxlX2luc2VydCgmbG9jYWwtPnN0YV9oYXNoLCAmc3RhLT5oYXNoX25vZGUsCisJCQkgICAgICAgc3RhX3JodF9wYXJhbXMpOwogfQogCiBzdGF0aWMgdm9pZCBzdGFfZGVsaXZlcl9wc19mcmFtZXMoc3RydWN0IHdvcmtfc3RydWN0ICp3aykKQEAgLTM0MCw2ICszMzgsOSBAQAogCiAJbWVtY3B5KHN0YS0+YWRkciwgYWRkciwgRVRIX0FMRU4pOwogCW1lbWNweShzdGEtPnN0YS5hZGRyLCBhZGRyLCBFVEhfQUxFTik7CisJc3RhLT5zdGEubWF4X3J4X2FnZ3JlZ2F0aW9uX3N1YmZyYW1lcyA9CisJCWxvY2FsLT5ody5tYXhfcnhfYWdncmVnYXRpb25fc3ViZnJhbWVzOworCiAJc3RhLT5sb2NhbCA9IGxvY2FsOwogCXN0YS0+c2RhdGEgPSBzZGF0YTsKIAlzdGEtPnJ4X3N0YXRzLmxhc3RfcnggPSBqaWZmaWVzOwpAQCAtNDUwLDkgKzQ1MSw5IEBACiAJCSAgICBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihzdGEtPnN0YS5hZGRyKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JLyogU3RyaWN0bHkgc3BlYWtpbmcgdGhpcyBpc24ndCBuZWNlc3NhcnkgYXMgd2UgaG9sZCB0aGUgbXV0ZXgsIGJ1dAotCSAqIHRoZSByaGFzaHRhYmxlIGNvZGUgY2FuJ3QgcmVhbGx5IGRlYWwgd2l0aCB0aGF0IGRpc3RpbmN0aW9uLiBXZQotCSAqIGRvIHJlcXVpcmUgdGhlIG11dGV4IGZvciBjb3JyZWN0bmVzcyB0aG91Z2guCisJLyogVGhlIFJDVSByZWFkIGxvY2sgaXMgcmVxdWlyZWQgYnkgcmhhc2h0YWJsZSBkdWUgdG8KKwkgKiBhc3luY2hyb25vdXMgcmVzaXplL3JlaGFzaC4gIFdlIGFsc28gcmVxdWlyZSB0aGUgbXV0ZXgKKwkgKiBmb3IgY29ycmVjdG5lc3MuCiAJICovCiAJcmN1X3JlYWRfbG9jaygpOwogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnNkYXRhLT5sb2NhbC0+c3RhX210eCk7CkBAIC02ODcsNyArNjg4LDcgQEAKIAl9CiAKIAkvKiBObyBuZWVkIHRvIGRvIGFueXRoaW5nIGlmIHRoZSBkcml2ZXIgZG9lcyBhbGwgKi8KLQlpZiAoaWVlZTgwMjExX2h3X2NoZWNrKCZsb2NhbC0+aHcsIEFQX0xJTktfUFMpKQorCWlmICghbG9jYWwtPm9wcy0+c2V0X3RpbSkKIAkJcmV0dXJuOwogCiAJaWYgKHN0YS0+ZGVhZCkKQEAgLTEwNDAsMTYgKzEwNDEsMTEgQEAKIAkJICByb3VuZF9qaWZmaWVzKGppZmZpZXMgKyBTVEFfSU5GT19DTEVBTlVQX0lOVEVSVkFMKSk7CiB9CiAKLXUzMiBzdGFfYWRkcl9oYXNoKGNvbnN0IHZvaWQgKmtleSwgdTMyIGxlbmd0aCwgdTMyIHNlZWQpCi17Ci0JcmV0dXJuIGpoYXNoKGtleSwgRVRIX0FMRU4sIHNlZWQpOwotfQotCiBpbnQgc3RhX2luZm9faW5pdChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCkKIHsKIAlpbnQgZXJyOwogCi0JZXJyID0gcmhhc2h0YWJsZV9pbml0KCZsb2NhbC0+c3RhX2hhc2gsICZzdGFfcmh0X3BhcmFtcyk7CisJZXJyID0gcmhsdGFibGVfaW5pdCgmbG9jYWwtPnN0YV9oYXNoLCAmc3RhX3JodF9wYXJhbXMpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKQEAgLTEwNjUsNyArMTA2MSw3IEBACiB2b2lkIHN0YV9pbmZvX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpCiB7CiAJZGVsX3RpbWVyX3N5bmMoJmxvY2FsLT5zdGFfY2xlYW51cCk7Ci0Jcmhhc2h0YWJsZV9kZXN0cm95KCZsb2NhbC0+c3RhX2hhc2gpOworCXJobHRhYmxlX2Rlc3Ryb3koJmxvY2FsLT5zdGFfaGFzaCk7CiB9CiAKIApAQCAtMTEzNSwxNyArMTEzMSwxNCBAQAogCQkJCQkJICAgY29uc3QgdTggKmxvY2FsYWRkcikKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IGh3X3RvX2xvY2FsKGh3KTsKKwlzdHJ1Y3QgcmhsaXN0X2hlYWQgKnRtcDsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKLQlzdHJ1Y3Qgcmhhc2hfaGVhZCAqdG1wOwotCWNvbnN0IHN0cnVjdCBidWNrZXRfdGFibGUgKnRibDsKLQotCXRibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UobG9jYWwtPnN0YV9oYXNoLnRibCwgJmxvY2FsLT5zdGFfaGFzaCk7CiAKIAkvKgogCSAqIEp1c3QgcmV0dXJuIGEgcmFuZG9tIHN0YXRpb24gaWYgbG9jYWxhZGRyIGlzIE5VTEwKIAkgKiAuLi4gZmlyc3QgaW4gbGlzdC4KIAkgKi8KLQlmb3JfZWFjaF9zdGFfaW5mbyhsb2NhbCwgdGJsLCBhZGRyLCBzdGEsIHRtcCkgeworCWZvcl9lYWNoX3N0YV9pbmZvKGxvY2FsLCBhZGRyLCBzdGEsIHRtcCkgewogCQlpZiAobG9jYWxhZGRyICYmCiAJCSAgICAhZXRoZXJfYWRkcl9lcXVhbChzdGEtPnNkYXRhLT52aWYuYWRkciwgbG9jYWxhZGRyKSkKIAkJCWNvbnRpbnVlOwpAQCAtMTIwOSwxMiArMTIwMiwxMCBAQAogCiAJaWYgKHN0YS0+c3RhLnR4cVswXSkgewogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdGEtPnN0YS50eHEpOyBpKyspIHsKLQkJCXN0cnVjdCB0eHFfaW5mbyAqdHhxaSA9IHRvX3R4cV9pbmZvKHN0YS0+c3RhLnR4cVtpXSk7Ci0KLQkJCWlmICghdHhxaS0+dGluLmJhY2tsb2dfcGFja2V0cykKKwkJCWlmICghdHhxX2hhc19xdWV1ZShzdGEtPnN0YS50eHFbaV0pKQogCQkJCWNvbnRpbnVlOwogCi0JCQlkcnZfd2FrZV90eF9xdWV1ZShsb2NhbCwgdHhxaSk7CisJCQlkcnZfd2FrZV90eF9xdWV1ZShsb2NhbCwgdG9fdHhxX2luZm8oc3RhLT5zdGEudHhxW2ldKSk7CiAJCX0KIAl9CiAKQEAgLTE2MTYsNyArMTYwNyw2IEBACiAKIAkJc3RhX2luZm9fcmVjYWxjX3RpbShzdGEpOwogCX0gZWxzZSB7Ci0JCXVuc2lnbmVkIGxvbmcgdGlkcyA9IHN0YS0+dHhxX2J1ZmZlcmVkX3RpZHMgJiBkcml2ZXJfcmVsZWFzZV90aWRzOwogCQlpbnQgdGlkOwogCiAJCS8qCkBAIC0xNjQ2LDkgKzE2MzYsOCBAQAogCQkJcmV0dXJuOwogCiAJCWZvciAodGlkID0gMDsgdGlkIDwgQVJSQVlfU0laRShzdGEtPnN0YS50eHEpOyB0aWQrKykgewotCQkJc3RydWN0IHR4cV9pbmZvICp0eHFpID0gdG9fdHhxX2luZm8oc3RhLT5zdGEudHhxW3RpZF0pOwotCi0JCQlpZiAoISh0aWRzICYgQklUKHRpZCkpIHx8IHR4cWktPnRpbi5iYWNrbG9nX3BhY2tldHMpCisJCQlpZiAoIShkcml2ZXJfcmVsZWFzZV90aWRzICYgQklUKHRpZCkpIHx8CisJCQkgICAgdHhxX2hhc19xdWV1ZShzdGEtPnN0YS50eHFbdGlkXSkpCiAJCQkJY29udGludWU7CiAKIAkJCXN0YV9pbmZvX3JlY2FsY190aW0oc3RhKTsKQEAgLTIyNzksMTEgKzIyNjgsNyBAQAogCWlmICh0ZXN0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfVERMU19QRUVSKSkKIAkJc2luZm8tPnN0YV9mbGFncy5zZXQgfD0gQklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKTsKIAotCS8qIGNoZWNrIGlmIHRoZSBkcml2ZXIgaGFzIGEgU1cgUkMgaW1wbGVtZW50YXRpb24gKi8KLQlpZiAocmVmICYmIHJlZi0+b3BzLT5nZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dCkKLQkJdGhyID0gcmVmLT5vcHMtPmdldF9leHBlY3RlZF90aHJvdWdocHV0KHN0YS0+cmF0ZV9jdHJsX3ByaXYpOwotCWVsc2UKLQkJdGhyID0gZHJ2X2dldF9leHBlY3RlZF90aHJvdWdocHV0KGxvY2FsLCAmc3RhLT5zdGEpOworCXRociA9IHN0YV9nZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dChzdGEpOwogCiAJaWYgKHRociAhPSAwKSB7CiAJCXNpbmZvLT5maWxsZWQgfD0gQklUKE5MODAyMTFfU1RBX0lORk9fRVhQRUNURURfVEhST1VHSFBVVCk7CkBAIC0yMjkxLDYgKzIyNzYsMjUgQEAKIAl9CiB9CiAKK3UzMiBzdGFfZ2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQoc3RydWN0IHN0YV9pbmZvICpzdGEpCit7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBzdGEtPnNkYXRhOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCXN0cnVjdCByYXRlX2NvbnRyb2xfcmVmICpyZWYgPSBOVUxMOworCXUzMiB0aHIgPSAwOworCisJaWYgKHRlc3Rfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9SQVRFX0NPTlRST0wpKQorCQlyZWYgPSBsb2NhbC0+cmF0ZV9jdHJsOworCisJLyogY2hlY2sgaWYgdGhlIGRyaXZlciBoYXMgYSBTVyBSQyBpbXBsZW1lbnRhdGlvbiAqLworCWlmIChyZWYgJiYgcmVmLT5vcHMtPmdldF9leHBlY3RlZF90aHJvdWdocHV0KQorCQl0aHIgPSByZWYtPm9wcy0+Z2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQoc3RhLT5yYXRlX2N0cmxfcHJpdik7CisJZWxzZQorCQl0aHIgPSBkcnZfZ2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQobG9jYWwsIHN0YSk7CisKKwlyZXR1cm4gdGhyOworfQorCiB1bnNpZ25lZCBsb25nIGllZWU4MDIxMV9zdGFfbGFzdF9hY3RpdmUoc3RydWN0IHN0YV9pbmZvICpzdGEpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9zdGFfcnhfc3RhdHMgKnN0YXRzID0gc3RhX2dldF9sYXN0X3J4X3N0YXRzKHN0YSk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvc3RhX2luZm8uaCBiL25ldC9tYWM4MDIxMS9zdGFfaW5mby5oCmluZGV4IDc4YjBlZjMuLmVkNWZjYjkgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9zdGFfaW5mby5oCisrKyBiL25ldC9tYWM4MDIxMS9zdGFfaW5mby5oCkBAIC0yMzAsNiArMjMwLDggQEAKICAqIEB0aWRfcnhfc3RvcF9yZXF1ZXN0ZWQ6ICBiaXRtYXAgaW5kaWNhdGluZyB3aGljaCBCQSBzZXNzaW9ucyBwZXIgVElEIHRoZQogICoJZHJpdmVyIHJlcXVlc3RlZCB0byBjbG9zZSB1bnRpbCB0aGUgd29yayBmb3IgaXQgcnVucwogICogQGFnZ19zZXNzaW9uX3ZhbGlkOiBiaXRtYXAgaW5kaWNhdGluZyB3aGljaCBUSUQgaGFzIGEgcnggQkEgc2Vzc2lvbiBvcGVuIG9uCisgKiBAdW5leHBlY3RlZF9hZ2c6IGJpdG1hcCBpbmRpY2F0aW5nIHdoaWNoIFRJRCBhbHJlYWR5IHNlbnQgYSBkZWxCQSBkdWUgdG8KKyAqCXVuZXhwZWN0ZWQgYWdncmVnYXRpb24gcmVsYXRlZCBmcmFtZXMgb3V0c2lkZSBhIHNlc3Npb24KICAqIEB3b3JrOiB3b3JrIHN0cnVjdCBmb3Igc3RhcnRpbmcvc3RvcHBpbmcgYWdncmVnYXRpb24KICAqIEB0aWRfdHg6IGFnZ3JlZ2F0aW9uIGluZm8gZm9yIFR4IHBlciBUSUQKICAqIEB0aWRfc3RhcnRfdHg6IHNlc3Npb25zIHdoZXJlIHN0YXJ0IHdhcyByZXF1ZXN0ZWQKQEAgLTI0NCw2ICsyNDYsNyBAQAogCXVuc2lnbmVkIGxvbmcgdGlkX3J4X3RpbWVyX2V4cGlyZWRbQklUU19UT19MT05HUyhJRUVFODAyMTFfTlVNX1RJRFMpXTsKIAl1bnNpZ25lZCBsb25nIHRpZF9yeF9zdG9wX3JlcXVlc3RlZFtCSVRTX1RPX0xPTkdTKElFRUU4MDIxMV9OVU1fVElEUyldOwogCXVuc2lnbmVkIGxvbmcgYWdnX3Nlc3Npb25fdmFsaWRbQklUU19UT19MT05HUyhJRUVFODAyMTFfTlVNX1RJRFMpXTsKKwl1bnNpZ25lZCBsb25nIHVuZXhwZWN0ZWRfYWdnW0JJVFNfVE9fTE9OR1MoSUVFRTgwMjExX05VTV9USURTKV07CiAJLyogdHggKi8KIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKIAlzdHJ1Y3QgdGlkX2FtcGR1X3R4IF9fcmN1ICp0aWRfdHhbSUVFRTgwMjExX05VTV9USURTXTsKQEAgLTQ1Miw3ICs0NTUsNyBAQAogCS8qIEdlbmVyYWwgaW5mb3JtYXRpb24sIG1vc3RseSBzdGF0aWMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3QsIGZyZWVfbGlzdDsKIAlzdHJ1Y3QgcmN1X2hlYWQgcmN1X2hlYWQ7Ci0Jc3RydWN0IHJoYXNoX2hlYWQgaGFzaF9ub2RlOworCXN0cnVjdCByaGxpc3RfaGVhZCBoYXNoX25vZGU7CiAJdTggYWRkcltFVEhfQUxFTl07CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWw7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CkBAIC02MzUsNiArNjM4LDkgQEAKICAqLwogI2RlZmluZSBTVEFfSU5GT19DTEVBTlVQX0lOVEVSVkFMICgxMCAqIEhaKQogCitzdHJ1Y3QgcmhsaXN0X2hlYWQgKnN0YV9pbmZvX2hhc2hfbG9va3VwKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJCQkgY29uc3QgdTggKmFkZHIpOworCiAvKgogICogR2V0IGEgU1RBIGluZm8sIG11c3QgYmUgdW5kZXIgUkNVIHJlYWQgbG9jay4KICAqLwpAQCAtNjQ0LDE3ICs2NTAsOSBAQAogc3RydWN0IHN0YV9pbmZvICpzdGFfaW5mb19nZXRfYnNzKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkJCSAgY29uc3QgdTggKmFkZHIpOwogCi11MzIgc3RhX2FkZHJfaGFzaChjb25zdCB2b2lkICprZXksIHUzMiBsZW5ndGgsIHUzMiBzZWVkKTsKLQotI2RlZmluZSBfc3RhX2J1Y2tldF9pZHgoX3RibCwgX2EpCQkJCQlcCi0Jcmh0X2J1Y2tldF9pbmRleChfdGJsLCBzdGFfYWRkcl9oYXNoKF9hLCBFVEhfQUxFTiwgKF90YmwpLT5oYXNoX3JuZCkpCi0KLSNkZWZpbmUgZm9yX2VhY2hfc3RhX2luZm8obG9jYWwsIHRibCwgX2FkZHIsIF9zdGEsIF90bXApCQlcCi0Jcmh0X2Zvcl9lYWNoX2VudHJ5X3JjdShfc3RhLCBfdG1wLCB0YmwsIAkJCVwKLQkJCSAgICAgICBfc3RhX2J1Y2tldF9pZHgodGJsLCBfYWRkciksCQlcCi0JCQkgICAgICAgaGFzaF9ub2RlKQkJCQlcCi0JLyogY29tcGFyZSBhZGRyZXNzIGFuZCBydW4gY29kZSBvbmx5IGlmIGl0IG1hdGNoZXMgKi8JCVwKLQlpZiAoZXRoZXJfYWRkcl9lcXVhbChfc3RhLT5hZGRyLCAoX2FkZHIpKSkKKyNkZWZpbmUgZm9yX2VhY2hfc3RhX2luZm8obG9jYWwsIF9hZGRyLCBfc3RhLCBfdG1wKQkJCVwKKwlyaGxfZm9yX2VhY2hfZW50cnlfcmN1KF9zdGEsIF90bXAsCQkJCVwKKwkJCSAgICAgICBzdGFfaW5mb19oYXNoX2xvb2t1cChsb2NhbCwgX2FkZHIpLCBoYXNoX25vZGUpCiAKIC8qCiAgKiBHZXQgU1RBIGluZm8gYnkgaW5kZXgsIEJST0tFTiEKQEAgLTcxMiw2ICs3MTAsOCBAQAogCQkJICBzdHJ1Y3QgcmF0ZV9pbmZvICpyaW5mbyk7CiB2b2lkIHN0YV9zZXRfc2luZm8oc3RydWN0IHN0YV9pbmZvICpzdGEsIHN0cnVjdCBzdGF0aW9uX2luZm8gKnNpbmZvKTsKIAordTMyIHN0YV9nZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dChzdHJ1Y3Qgc3RhX2luZm8gKnN0YSk7CisKIHZvaWQgaWVlZTgwMjExX3N0YV9leHBpcmUoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCiAJCQkgIHVuc2lnbmVkIGxvbmcgZXhwX3RpbWUpOwogdTggc3RhX2luZm9fdHhfc3RyZWFtcyhzdHJ1Y3Qgc3RhX2luZm8gKnN0YSk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvc3RhdHVzLmMgYi9uZXQvbWFjODAyMTEvc3RhdHVzLmMKaW5kZXggYzZkNWM3Mi4uZGRmNzFjNiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3N0YXR1cy5jCisrKyBiL25ldC9tYWM4MDIxMS9zdGF0dXMuYwpAQCAtNTU3LDYgKzU1NywxMiBAQAogc3RhdGljIHZvaWQgaWVlZTgwMjExX2xvc3RfcGFja2V0KHN0cnVjdCBzdGFfaW5mbyAqc3RhLAogCQkJCSAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvKQogeworCS8qIElmIGRyaXZlciByZWxpZXMgb24gaXRzIG93biBhbGdvcml0aG0gZm9yIHN0YXRpb24ga2lja291dCwgc2tpcAorCSAqIG1hYzgwMjExIHBhY2tldCBsb3NzIG1lY2hhbmlzbS4KKwkgKi8KKwlpZiAoaWVlZTgwMjExX2h3X2NoZWNrKCZzdGEtPmxvY2FsLT5odywgUkVQT1JUU19MT1dfQUNLKSkKKwkJcmV0dXJuOworCiAJLyogVGhpcyBwYWNrZXQgd2FzIGFnZ3JlZ2F0ZWQgYnV0IGRvZXNuJ3QgY2Fycnkgc3RhdHVzIGluZm8gKi8KIAlpZiAoKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkgJiYKIAkgICAgIShpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9TVEFUX0FNUERVKSkKQEAgLTcwOSw3ICs3MTUsNyBAQAogCQkJaWYgKCFpZWVlODAyMTFfc2RhdGFfcnVubmluZyhzZGF0YSkpCiAJCQkJY29udGludWU7CiAKLQkJCWlmICgoc2RhdGEtPnUubW50cl9mbGFncyAmIE1PTklUT1JfRkxBR19DT09LX0ZSQU1FUykgJiYKKwkJCWlmICgoc2RhdGEtPnUubW50ci5mbGFncyAmIE1PTklUT1JfRkxBR19DT09LX0ZSQU1FUykgJiYKIAkJCSAgICAhc2VuZF90b19jb29rZWQpCiAJCQkJY29udGludWU7CiAKQEAgLTc0MCw4ICs3NDYsOCBAQAogCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKIAlfX2xlMTYgZmM7CiAJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CisJc3RydWN0IHJobGlzdF9oZWFkICp0bXA7CiAJc3RydWN0IHN0YV9pbmZvICpzdGE7Ci0Jc3RydWN0IHJoYXNoX2hlYWQgKnRtcDsKIAlpbnQgcmV0cnlfY291bnQ7CiAJaW50IHJhdGVzX2lkeDsKIAlib29sIHNlbmRfdG9fY29va2VkOwpAQCAtNzQ5LDcgKzc1NSw2IEBACiAJc3RydWN0IGllZWU4MDIxMV9iYXIgKmJhcjsKIAlpbnQgc2hpZnQgPSAwOwogCWludCB0aWQgPSBJRUVFODAyMTFfTlVNX1RJRFM7Ci0JY29uc3Qgc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsOwogCiAJcmF0ZXNfaWR4ID0gaWVlZTgwMjExX3R4X2dldF9yYXRlcyhodywgaW5mbywgJnJldHJ5X2NvdW50KTsKIApAQCAtNzU4LDkgKzc2Myw3IEBACiAJc2JhbmQgPSBsb2NhbC0+aHcud2lwaHktPmJhbmRzW2luZm8tPmJhbmRdOwogCWZjID0gaGRyLT5mcmFtZV9jb250cm9sOwogCi0JdGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdShsb2NhbC0+c3RhX2hhc2gudGJsLCAmbG9jYWwtPnN0YV9oYXNoKTsKLQotCWZvcl9lYWNoX3N0YV9pbmZvKGxvY2FsLCB0YmwsIGhkci0+YWRkcjEsIHN0YSwgdG1wKSB7CisJZm9yX2VhY2hfc3RhX2luZm8obG9jYWwsIGhkci0+YWRkcjEsIHN0YSwgdG1wKSB7CiAJCS8qIHNraXAgd3JvbmcgdmlydHVhbCBpbnRlcmZhY2UgKi8KIAkJaWYgKCFldGhlcl9hZGRyX2VxdWFsKGhkci0+YWRkcjIsIHN0YS0+c2RhdGEtPnZpZi5hZGRyKSkKIAkJCWNvbnRpbnVlOwpAQCAtNzcxLDYgKzc3NCwxMyBAQAogCQkJY2xlYXJfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9TUCk7CiAKIAkJYWNrZWQgPSAhIShpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9TVEFUX0FDSyk7CisKKwkJLyogbWVzaCBQZWVyIFNlcnZpY2UgUGVyaW9kIHN1cHBvcnQgKi8KKwkJaWYgKGllZWU4MDIxMV92aWZfaXNfbWVzaCgmc3RhLT5zZGF0YS0+dmlmKSAmJgorCQkgICAgaWVlZTgwMjExX2lzX2RhdGFfcW9zKGZjKSkKKwkJCWllZWU4MDIxMV9tcHNwX3RyaWdnZXJfcHJvY2VzcygKKwkJCQlpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKSwgc3RhLCB0cnVlLCBhY2tlZCk7CisKIAkJaWYgKCFhY2tlZCAmJiB0ZXN0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfUFNfU1RBKSkgewogCQkJLyoKIAkJCSAqIFRoZSBTVEEgaXMgaW4gcG93ZXIgc2F2ZSBtb2RlLCBzbyBhc3N1bWUKQEAgLTc4MSwxMyArNzkxLDYgQEAKIAkJCXJldHVybjsKIAkJfQogCi0JCS8qIG1lc2ggUGVlciBTZXJ2aWNlIFBlcmlvZCBzdXBwb3J0ICovCi0JCWlmIChpZWVlODAyMTFfdmlmX2lzX21lc2goJnN0YS0+c2RhdGEtPnZpZikgJiYKLQkJICAgIGllZWU4MDIxMV9pc19kYXRhX3FvcyhmYykpCi0JCQlpZWVlODAyMTFfbXBzcF90cmlnZ2VyX3Byb2Nlc3MoCi0JCQkJCWllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpLAotCQkJCQlzdGEsIHRydWUsIGFja2VkKTsKLQogCQlpZiAoaWVlZTgwMjExX2h3X2NoZWNrKCZsb2NhbC0+aHcsIEhBU19SQVRFX0NPTlRST0wpICYmCiAJCSAgICAoaWVlZTgwMjExX2lzX2RhdGEoaGRyLT5mcmFtZV9jb250cm9sKSkgJiYKIAkJICAgIChyYXRlc19pZHggIT0gLTEpKQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3RkbHMuYyBiL25ldC9tYWM4MDIxMS90ZGxzLmMKaW5kZXggYjVkMjhmMS4uYWZjYTdkMSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3RkbHMuYworKysgYi9uZXQvbWFjODAyMTEvdGRscy5jCkBAIC0zMzMsMTAgKzMzMywxMSBAQAogCWlmICghdWMuY2VudGVyX2ZyZXExKQogCQlyZXR1cm47CiAKLQkvKiBwcm9jZWVkIHRvIGRvd25ncmFkZSB0aGUgY2hhbmRlZiB1bnRpbCB1c2FibGUgb3IgdGhlIHNhbWUgKi8KKwkvKiBwcm9jZWVkIHRvIGRvd25ncmFkZSB0aGUgY2hhbmRlZiB1bnRpbCB1c2FibGUgb3IgdGhlIHNhbWUgYXMgQVAgQlcgKi8KIAl3aGlsZSAodWMud2lkdGggPiBtYXhfd2lkdGggfHwKLQkgICAgICAgIWNmZzgwMjExX3JlZ19jYW5fYmVhY29uX3JlbGF4KHNkYXRhLT5sb2NhbC0+aHcud2lwaHksICZ1YywKLQkJCQkJICAgICAgc2RhdGEtPndkZXYuaWZ0eXBlKSkKKwkgICAgICAgKHVjLndpZHRoID4gc3RhLT50ZGxzX2NoYW5kZWYud2lkdGggJiYKKwkJIWNmZzgwMjExX3JlZ19jYW5fYmVhY29uX3JlbGF4KHNkYXRhLT5sb2NhbC0+aHcud2lwaHksICZ1YywKKwkJCQkJICAgICAgIHNkYXRhLT53ZGV2LmlmdHlwZSkpKQogCQlpZWVlODAyMTFfY2hhbmRlZl9kb3duZ3JhZGUoJnVjKTsKIAogCWlmICghY2ZnODAyMTFfY2hhbmRlZl9pZGVudGljYWwoJnVjLCAmc3RhLT50ZGxzX2NoYW5kZWYpKSB7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvdHJhY2UuaCBiL25ldC9tYWM4MDIxMS90cmFjZS5oCmluZGV4IDc3ZTRjNTMuLjkyYTQ3YWYgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS90cmFjZS5oCisrKyBiL25ldC9tYWM4MDIxMS90cmFjZS5oCkBAIC05ODQsNiArOTg0LDMyIEBACiAJKQogKTsKIAorVFJBQ0VfRVZFTlQoZHJ2X29mZnNldF90c2YsCisJVFBfUFJPVE8oc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCSBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJIHM2NCBvZmZzZXQpLAorCisJVFBfQVJHUyhsb2NhbCwgc2RhdGEsIG9mZnNldCksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlMT0NBTF9FTlRSWQorCQlWSUZfRU5UUlkKKwkJX19maWVsZChzNjQsIHRzZl9vZmZzZXQpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlMT0NBTF9BU1NJR047CisJCVZJRl9BU1NJR047CisJCV9fZW50cnktPnRzZl9vZmZzZXQgPSBvZmZzZXQ7CisJKSwKKworCVRQX3ByaW50aygKKwkJTE9DQUxfUFJfRk1UICBWSUZfUFJfRk1UICAiIHRzZiBvZmZzZXQ6JWxsZCIsCisJCUxPQ0FMX1BSX0FSRywgVklGX1BSX0FSRywKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylfX2VudHJ5LT50c2Zfb2Zmc2V0CisJKQorKTsKKwogREVGSU5FX0VWRU5UKGxvY2FsX3NkYXRhX2V2dCwgZHJ2X3Jlc2V0X3RzZiwKIAlUUF9QUk9UTyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKIAkJIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKSwKQEAgLTE3MDAsNiArMTcyNiwxMzkgQEAKIAkpCiApOwogCitUUkFDRV9FVkVOVChkcnZfc3RhcnRfbmFuLAorCVRQX1BST1RPKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCSBzdHJ1Y3QgY2ZnODAyMTFfbmFuX2NvbmYgKmNvbmYpLAorCisJVFBfQVJHUyhsb2NhbCwgc2RhdGEsIGNvbmYpLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCUxPQ0FMX0VOVFJZCisJCVZJRl9FTlRSWQorCQlfX2ZpZWxkKHU4LCBtYXN0ZXJfcHJlZikKKwkJX19maWVsZCh1OCwgZHVhbCkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCUxPQ0FMX0FTU0lHTjsKKwkJVklGX0FTU0lHTjsKKwkJX19lbnRyeS0+bWFzdGVyX3ByZWYgPSBjb25mLT5tYXN0ZXJfcHJlZjsKKwkJX19lbnRyeS0+ZHVhbCA9IGNvbmYtPmR1YWw7CisJKSwKKworCVRQX3ByaW50aygKKwkJTE9DQUxfUFJfRk1UICBWSUZfUFJfRk1UCisJCSIsIG1hc3RlciBwcmVmZXJlbmNlOiAldSwgZHVhbDogJWQiLAorCQlMT0NBTF9QUl9BUkcsIFZJRl9QUl9BUkcsIF9fZW50cnktPm1hc3Rlcl9wcmVmLAorCQlfX2VudHJ5LT5kdWFsCisJKQorKTsKKworVFJBQ0VfRVZFTlQoZHJ2X3N0b3BfbmFuLAorCVRQX1BST1RPKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpLAorCisJVFBfQVJHUyhsb2NhbCwgc2RhdGEpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJTE9DQUxfRU5UUlkKKwkJVklGX0VOVFJZCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlMT0NBTF9BU1NJR047CisJCVZJRl9BU1NJR047CisJKSwKKworCVRQX3ByaW50aygKKwkJTE9DQUxfUFJfRk1UICBWSUZfUFJfRk1ULAorCQlMT0NBTF9QUl9BUkcsIFZJRl9QUl9BUkcKKwkpCispOworCitUUkFDRV9FVkVOVChkcnZfbmFuX2NoYW5nZV9jb25mLAorCVRQX1BST1RPKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCSBzdHJ1Y3QgY2ZnODAyMTFfbmFuX2NvbmYgKmNvbmYsCisJCSB1MzIgY2hhbmdlcyksCisKKwlUUF9BUkdTKGxvY2FsLCBzZGF0YSwgY29uZiwgY2hhbmdlcyksCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJTE9DQUxfRU5UUlkKKwkJVklGX0VOVFJZCisJCV9fZmllbGQodTgsIG1hc3Rlcl9wcmVmKQorCQlfX2ZpZWxkKHU4LCBkdWFsKQorCQlfX2ZpZWxkKHUzMiwgY2hhbmdlcykKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCUxPQ0FMX0FTU0lHTjsKKwkJVklGX0FTU0lHTjsKKwkJX19lbnRyeS0+bWFzdGVyX3ByZWYgPSBjb25mLT5tYXN0ZXJfcHJlZjsKKwkJX19lbnRyeS0+ZHVhbCA9IGNvbmYtPmR1YWw7CisJCV9fZW50cnktPmNoYW5nZXMgPSBjaGFuZ2VzOworCSksCisKKwlUUF9wcmludGsoCisJCUxPQ0FMX1BSX0ZNVCAgVklGX1BSX0ZNVAorCQkiLCBtYXN0ZXIgcHJlZmVyZW5jZTogJXUsIGR1YWw6ICVkLCBjaGFuZ2VzOiAweCV4IiwKKwkJTE9DQUxfUFJfQVJHLCBWSUZfUFJfQVJHLCBfX2VudHJ5LT5tYXN0ZXJfcHJlZiwKKwkJX19lbnRyeS0+ZHVhbCwgX19lbnRyeS0+Y2hhbmdlcworCSkKKyk7CisKK1RSQUNFX0VWRU5UKGRydl9hZGRfbmFuX2Z1bmMsCisJVFBfUFJPVE8oc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCSBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9uYW5fZnVuYyAqZnVuYyksCisKKwlUUF9BUkdTKGxvY2FsLCBzZGF0YSwgZnVuYyksCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJTE9DQUxfRU5UUlkKKwkJVklGX0VOVFJZCisJCV9fZmllbGQodTgsIHR5cGUpCisJCV9fZmllbGQodTgsIGluc3RfaWQpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlMT0NBTF9BU1NJR047CisJCVZJRl9BU1NJR047CisJCV9fZW50cnktPnR5cGUgPSBmdW5jLT50eXBlOworCQlfX2VudHJ5LT5pbnN0X2lkID0gZnVuYy0+aW5zdGFuY2VfaWQ7CisJKSwKKworCVRQX3ByaW50aygKKwkJTE9DQUxfUFJfRk1UICBWSUZfUFJfRk1UCisJCSIsIHR5cGU6ICV1LCBpbnN0X2lkOiAldSIsCisJCUxPQ0FMX1BSX0FSRywgVklGX1BSX0FSRywgX19lbnRyeS0+dHlwZSwgX19lbnRyeS0+aW5zdF9pZAorCSkKKyk7CisKK1RSQUNFX0VWRU5UKGRydl9kZWxfbmFuX2Z1bmMsCisJVFBfUFJPVE8oc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCSBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJIHU4IGluc3RhbmNlX2lkKSwKKworCVRQX0FSR1MobG9jYWwsIHNkYXRhLCBpbnN0YW5jZV9pZCksCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJTE9DQUxfRU5UUlkKKwkJVklGX0VOVFJZCisJCV9fZmllbGQodTgsIGluc3RhbmNlX2lkKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJTE9DQUxfQVNTSUdOOworCQlWSUZfQVNTSUdOOworCQlfX2VudHJ5LT5pbnN0YW5jZV9pZCA9IGluc3RhbmNlX2lkOworCSksCisKKwlUUF9wcmludGsoCisJCUxPQ0FMX1BSX0ZNVCAgVklGX1BSX0ZNVAorCQkiLCBpbnN0YW5jZV9pZDogJXUiLAorCQlMT0NBTF9QUl9BUkcsIFZJRl9QUl9BUkcsIF9fZW50cnktPmluc3RhbmNlX2lkCisJKQorKTsKKwogLyoKICAqIFRyYWNpbmcgZm9yIEFQSSBjYWxscyB0aGF0IGRyaXZlcnMgY2FsbC4KICAqLwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3R4LmMgYi9uZXQvbWFjODAyMTEvdHguYwppbmRleCA5MTQ2MWM0Li4xYzU2YWJjIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvdHguYworKysgYi9uZXQvbWFjODAyMTEvdHguYwpAQCAtMzY4LDcgKzM2OCw3IEBACiAJCXNrYiA9IHNrYl9kZXF1ZXVlKCZwcy0+YmNfYnVmKTsKIAkJaWYgKHNrYikgewogCQkJcHVyZ2VkKys7Ci0JCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlpZWVlODAyMTFfZnJlZV90eHNrYigmbG9jYWwtPmh3LCBza2IpOwogCQl9CiAJCXRvdGFsICs9IHNrYl9xdWV1ZV9sZW4oJnBzLT5iY19idWYpOwogCX0KQEAgLTQ1MSw3ICs0NTEsNyBAQAogCWlmIChza2JfcXVldWVfbGVuKCZwcy0+YmNfYnVmKSA+PSBBUF9NQVhfQkNfQlVGRkVSKSB7CiAJCXBzX2RiZyh0eC0+c2RhdGEsCiAJCSAgICAgICAiQkMgVFggYnVmZmVyIGZ1bGwgLSBkcm9wcGluZyB0aGUgb2xkZXN0IGZyYW1lXG4iKTsKLQkJZGV2X2tmcmVlX3NrYihza2JfZGVxdWV1ZSgmcHMtPmJjX2J1ZikpOworCQlpZWVlODAyMTFfZnJlZV90eHNrYigmdHgtPmxvY2FsLT5odywgc2tiX2RlcXVldWUoJnBzLT5iY19idWYpKTsKIAl9IGVsc2UKIAkJdHgtPmxvY2FsLT50b3RhbF9wc19idWZmZXJlZCsrOwogCkBAIC04NTMsOCArODUzLDcgQEAKIAl0aWQgPSAqcWMgJiBJRUVFODAyMTFfUU9TX0NUTF9USURfTUFTSzsKIAl0eC0+c3RhLT50eF9zdGF0cy5tc2R1W3RpZF0rKzsKIAotCWlmICghdHgtPnN0YS0+c3RhLnR4cVswXSkKLQkJaGRyLT5zZXFfY3RybCA9IGllZWU4MDIxMV90eF9uZXh0X3NlcSh0eC0+c3RhLCB0aWQpOworCWhkci0+c2VxX2N0cmwgPSBpZWVlODAyMTFfdHhfbmV4dF9zZXEodHgtPnN0YSwgdGlkKTsKIAogCXJldHVybiBUWF9DT05USU5VRTsKIH0KQEAgLTEzNDMsNyArMTM0Miw3IEBACiAJbG9jYWwgPSBjb250YWluZXJfb2YoZnEsIHN0cnVjdCBpZWVlODAyMTFfbG9jYWwsIGZxKTsKIAl0eHFpID0gY29udGFpbmVyX29mKHRpbiwgc3RydWN0IHR4cV9pbmZvLCB0aW4pOwogCWNwYXJhbXMgPSAmbG9jYWwtPmNwYXJhbXM7Ci0JY3N0YXRzID0gJmxvY2FsLT5jc3RhdHM7CisJY3N0YXRzID0gJnR4cWktPmNzdGF0czsKIAogCWlmIChmbG93ID09ICZ0eHFpLT5kZWZfZmxvdykKIAkJY3ZhcnMgPSAmdHhxaS0+ZGVmX2N2YXJzOwpAQCAtMTQwMyw2ICsxNDAyLDggQEAKIAlmcV90aW5faW5pdCgmdHhxaS0+dGluKTsKIAlmcV9mbG93X2luaXQoJnR4cWktPmRlZl9mbG93KTsKIAljb2RlbF92YXJzX2luaXQoJnR4cWktPmRlZl9jdmFycyk7CisJY29kZWxfc3RhdHNfaW5pdCgmdHhxaS0+Y3N0YXRzKTsKKwlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJnR4cWktPmZyYWdzKTsKIAogCXR4cWktPnR4cS52aWYgPSAmc2RhdGEtPnZpZjsKIApAQCAtMTQyNSw2ICsxNDI2LDcgQEAKIAlzdHJ1Y3QgZnFfdGluICp0aW4gPSAmdHhxaS0+dGluOwogCiAJZnFfdGluX3Jlc2V0KGZxLCB0aW4sIGZxX3NrYl9mcmVlX2Z1bmMpOworCWllZWU4MDIxMV9wdXJnZV90eF9xdWV1ZSgmbG9jYWwtPmh3LCAmdHhxaS0+ZnJhZ3MpOwogfQogCiBpbnQgaWVlZTgwMjExX3R4cV9zZXR1cF9mbG93cyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCkKQEAgLTE0MzIsNiArMTQzNCw4IEBACiAJc3RydWN0IGZxICpmcSA9ICZsb2NhbC0+ZnE7CiAJaW50IHJldDsKIAlpbnQgaTsKKwlib29sIHN1cHBfdmh0ID0gZmFsc2U7CisJZW51bSBubDgwMjExX2JhbmQgYmFuZDsKIAogCWlmICghbG9jYWwtPm9wcy0+d2FrZV90eF9xdWV1ZSkKIAkJcmV0dXJuIDA7CkBAIC0xNDQwLDggKzE0NDQsMjQgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJLyoKKwkgKiBJZiB0aGUgaGFyZHdhcmUgZG9lc24ndCBzdXBwb3J0IFZIVCwgaXQgaXMgc2FmZSB0byBsaW1pdCB0aGUgbWF4aW11bQorCSAqIHF1ZXVlIHNpemUuIDQgTWJ5dGVzIGlzIDY0IG1heC1zaXplIGFnZ3JlZ2F0ZXMgaW4gODAyLjExbi4KKwkgKi8KKwlmb3IgKGJhbmQgPSAwOyBiYW5kIDwgTlVNX05MODAyMTFfQkFORFM7IGJhbmQrKykgeworCQlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKKworCQlzYmFuZCA9IGxvY2FsLT5ody53aXBoeS0+YmFuZHNbYmFuZF07CisJCWlmICghc2JhbmQpCisJCQljb250aW51ZTsKKworCQlzdXBwX3ZodCA9IHN1cHBfdmh0IHx8IHNiYW5kLT52aHRfY2FwLnZodF9zdXBwb3J0ZWQ7CisJfQorCisJaWYgKCFzdXBwX3ZodCkKKwkJZnEtPm1lbW9yeV9saW1pdCA9IDQgPDwgMjA7IC8qIDQgTWJ5dGVzICovCisKIAljb2RlbF9wYXJhbXNfaW5pdCgmbG9jYWwtPmNwYXJhbXMpOwotCWNvZGVsX3N0YXRzX2luaXQoJmxvY2FsLT5jc3RhdHMpOwogCWxvY2FsLT5jcGFyYW1zLmludGVydmFsID0gTVMyVElNRSgxMDApOwogCWxvY2FsLT5jcGFyYW1zLnRhcmdldCA9IE1TMlRJTUUoMjApOwogCWxvY2FsLT5jcGFyYW1zLmVjbiA9IHRydWU7CkBAIC0xNDc2LDUwICsxNDk2LDQ2IEBACiAJc3Bpbl91bmxvY2tfYmgoJmZxLT5sb2NrKTsKIH0KIAotc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV90eF9kZXF1ZXVlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV90eHEgKnR4cSkKK3N0YXRpYyBib29sIGllZWU4MDIxMV9xdWV1ZV9za2Ioc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJc3RydWN0IHN0YV9pbmZvICpzdGEsCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IGh3X3RvX2xvY2FsKGh3KTsKLQlzdHJ1Y3QgdHhxX2luZm8gKnR4cWkgPSBjb250YWluZXJfb2YodHhxLCBzdHJ1Y3QgdHhxX2luZm8sIHR4cSk7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CiAJc3RydWN0IGZxICpmcSA9ICZsb2NhbC0+ZnE7Ci0Jc3RydWN0IGZxX3RpbiAqdGluID0gJnR4cWktPnRpbjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOworCXN0cnVjdCB0eHFfaW5mbyAqdHhxaTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqcHVic3RhOworCisJaWYgKCFsb2NhbC0+b3BzLT53YWtlX3R4X3F1ZXVlIHx8CisJICAgIHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9NT05JVE9SKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoc3RhICYmIHN0YS0+dXBsb2FkZWQpCisJCXB1YnN0YSA9ICZzdGEtPnN0YTsKKwllbHNlCisJCXB1YnN0YSA9IE5VTEw7CisKKwlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4pCisJCXNkYXRhID0gY29udGFpbmVyX29mKHNkYXRhLT5ic3MsCisJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhLCB1LmFwKTsKKworCXZpZiA9ICZzZGF0YS0+dmlmOworCXR4cWkgPSBpZWVlODAyMTFfZ2V0X3R4cShsb2NhbCwgdmlmLCBwdWJzdGEsIHNrYik7CisKKwlpZiAoIXR4cWkpCisJCXJldHVybiBmYWxzZTsKKworCWluZm8tPmNvbnRyb2wudmlmID0gdmlmOwogCiAJc3Bpbl9sb2NrX2JoKCZmcS0+bG9jayk7Ci0KLQlpZiAodGVzdF9iaXQoSUVFRTgwMjExX1RYUV9TVE9QLCAmdHhxaS0+ZmxhZ3MpKQotCQlnb3RvIG91dDsKLQotCXNrYiA9IGZxX3Rpbl9kZXF1ZXVlKGZxLCB0aW4sIGZxX3Rpbl9kZXF1ZXVlX2Z1bmMpOwotCWlmICghc2tiKQotCQlnb3RvIG91dDsKLQotCWllZWU4MDIxMV9zZXRfc2tiX3ZpZihza2IsIHR4cWkpOwotCi0JaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOwotCWlmICh0eHEtPnN0YSAmJiBpZWVlODAyMTFfaXNfZGF0YV9xb3MoaGRyLT5mcmFtZV9jb250cm9sKSkgewotCQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSA9IGNvbnRhaW5lcl9vZih0eHEtPnN0YSwgc3RydWN0IHN0YV9pbmZvLAotCQkJCQkJICAgIHN0YSk7Ci0JCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKLQotCQloZHItPnNlcV9jdHJsID0gaWVlZTgwMjExX3R4X25leHRfc2VxKHN0YSwgdHhxLT50aWQpOwotCQlpZiAodGVzdF9iaXQoSUVFRTgwMjExX1RYUV9BTVBEVSwgJnR4cWktPmZsYWdzKSkKLQkJCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9DVExfQU1QRFU7Ci0JCWVsc2UKLQkJCWluZm8tPmZsYWdzICY9IH5JRUVFODAyMTFfVFhfQ1RMX0FNUERVOwotCX0KLQotb3V0OgorCWllZWU4MDIxMV90eHFfZW5xdWV1ZShsb2NhbCwgdHhxaSwgc2tiKTsKIAlzcGluX3VubG9ja19iaCgmZnEtPmxvY2spOwogCi0JaWYgKHNrYiAmJiBza2JfaGFzX2ZyYWdfbGlzdChza2IpICYmCi0JICAgICFpZWVlODAyMTFfaHdfY2hlY2soJmxvY2FsLT5odywgVFhfRlJBR19MSVNUKSkKLQkJc2tiX2xpbmVhcml6ZShza2IpOworCWRydl93YWtlX3R4X3F1ZXVlKGxvY2FsLCB0eHFpKTsKIAotCXJldHVybiBza2I7CisJcmV0dXJuIHRydWU7CiB9Ci1FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV90eF9kZXF1ZXVlKTsKIAogc3RhdGljIGJvb2wgaWVlZTgwMjExX3R4X2ZyYWdzKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAogCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCkBAIC0xNTI4LDkgKzE1NDQsNyBAQAogCQkJICAgICAgIGJvb2wgdHhwZW5kaW5nKQogewogCXN0cnVjdCBpZWVlODAyMTFfdHhfY29udHJvbCBjb250cm9sID0ge307Ci0Jc3RydWN0IGZxICpmcSA9ICZsb2NhbC0+ZnE7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnRtcDsKLQlzdHJ1Y3QgdHhxX2luZm8gKnR4cWk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNrYl9xdWV1ZV93YWxrX3NhZmUoc2ticywgc2tiLCB0bXApIHsKQEAgLTE1NDUsMjEgKzE1NTksNiBAQAogCQl9CiAjZW5kaWYKIAotCQl0eHFpID0gaWVlZTgwMjExX2dldF90eHEobG9jYWwsIHZpZiwgc3RhLCBza2IpOwotCQlpZiAodHhxaSkgewotCQkJaW5mby0+Y29udHJvbC52aWYgPSB2aWY7Ci0KLQkJCV9fc2tiX3VubGluayhza2IsIHNrYnMpOwotCi0JCQlzcGluX2xvY2tfYmgoJmZxLT5sb2NrKTsKLQkJCWllZWU4MDIxMV90eHFfZW5xdWV1ZShsb2NhbCwgdHhxaSwgc2tiKTsKLQkJCXNwaW5fdW5sb2NrX2JoKCZmcS0+bG9jayk7Ci0KLQkJCWRydl93YWtlX3R4X3F1ZXVlKGxvY2FsLCB0eHFpKTsKLQotCQkJY29udGludWU7Ci0JCX0KLQogCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jYWwtPnF1ZXVlX3N0b3BfcmVhc29uX2xvY2ssIGZsYWdzKTsKIAkJaWYgKGxvY2FsLT5xdWV1ZV9zdG9wX3JlYXNvbnNbcV0gfHwKIAkJICAgICghdHhwZW5kaW5nICYmICFza2JfcXVldWVfZW1wdHkoJmxvY2FsLT5wZW5kaW5nW3FdKSkpIHsKQEAgLTE2NDMsNyArMTY0Miw3IEBACiAKIAlzd2l0Y2ggKHNkYXRhLT52aWYudHlwZSkgewogCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKLQkJaWYgKHNkYXRhLT51Lm1udHJfZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQUNUSVZFKSB7CisJCWlmIChzZGF0YS0+dS5tbnRyLmZsYWdzICYgTU9OSVRPUl9GTEFHX0FDVElWRSkgewogCQkJdmlmID0gJnNkYXRhLT52aWY7CiAJCQlicmVhazsKIAkJfQpAQCAtMTY4MCwxMCArMTY3OSwxMyBAQAogLyoKICAqIEludm9rZSBUWCBoYW5kbGVycywgcmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgbm9uLXplcm8gaWYgdGhlCiAgKiBmcmFtZSB3YXMgZHJvcHBlZCBvciBxdWV1ZWQuCisgKgorICogVGhlIGhhbmRsZXJzIGFyZSBzcGxpdCBpbnRvIGFuIGVhcmx5IGFuZCBsYXRlIHBhcnQuIFRoZSBsYXR0ZXIgaXMgZXZlcnl0aGluZworICogdGhhdCBjYW4gYmUgc2Vuc2l0aXZlIHRvIHJlb3JkZXJpbmcsIGFuZCB3aWxsIGJlIGRlZmVycmVkIHRvIGFmdGVyIHBhY2tldHMKKyAqIGFyZSBkZXF1ZXVlZCBmcm9tIHRoZSBpbnRlcm1lZGlhdGUgcXVldWVzICh3aGVuIHRoZXkgYXJlIGVuYWJsZWQpLgogICovCi1zdGF0aWMgaW50IGludm9rZV90eF9oYW5kbGVycyhzdHJ1Y3QgaWVlZTgwMjExX3R4X2RhdGEgKnR4KQorc3RhdGljIGludCBpbnZva2VfdHhfaGFuZGxlcnNfZWFybHkoc3RydWN0IGllZWU4MDIxMV90eF9kYXRhICp0eCkKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHR4LT5za2IpOwogCWllZWU4MDIxMV90eF9yZXN1bHQgcmVzID0gVFhfRFJPUDsKIAogI2RlZmluZSBDQUxMX1RYSCh0eGgpIFwKQEAgLTE3MDEsNiArMTcwMywzMSBAQAogCWlmICghaWVlZTgwMjExX2h3X2NoZWNrKCZ0eC0+bG9jYWwtPmh3LCBIQVNfUkFURV9DT05UUk9MKSkKIAkJQ0FMTF9UWEgoaWVlZTgwMjExX3R4X2hfcmF0ZV9jdHJsKTsKIAorIHR4aF9kb25lOgorCWlmICh1bmxpa2VseShyZXMgPT0gVFhfRFJPUCkpIHsKKwkJSTgwMl9ERUJVR19JTkModHgtPmxvY2FsLT50eF9oYW5kbGVyc19kcm9wKTsKKwkJaWYgKHR4LT5za2IpCisJCQlpZWVlODAyMTFfZnJlZV90eHNrYigmdHgtPmxvY2FsLT5odywgdHgtPnNrYik7CisJCWVsc2UKKwkJCWllZWU4MDIxMV9wdXJnZV90eF9xdWV1ZSgmdHgtPmxvY2FsLT5odywgJnR4LT5za2JzKTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSBpZiAodW5saWtlbHkocmVzID09IFRYX1FVRVVFRCkpIHsKKwkJSTgwMl9ERUJVR19JTkModHgtPmxvY2FsLT50eF9oYW5kbGVyc19xdWV1ZWQpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBMYXRlIGhhbmRsZXJzIGNhbiBiZSBjYWxsZWQgd2hpbGUgdGhlIHN0YSBsb2NrIGlzIGhlbGQuIEhhbmRsZXJzIHRoYXQgY2FuCisgKiBjYXVzZSBwYWNrZXRzIHRvIGJlIGdlbmVyYXRlZCB3aWxsIGNhdXNlIGRlYWRsb2NrIQorICovCitzdGF0aWMgaW50IGludm9rZV90eF9oYW5kbGVyc19sYXRlKHN0cnVjdCBpZWVlODAyMTFfdHhfZGF0YSAqdHgpCit7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQih0eC0+c2tiKTsKKwlpZWVlODAyMTFfdHhfcmVzdWx0IHJlcyA9IFRYX0NPTlRJTlVFOworCiAJaWYgKHVubGlrZWx5KGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0lOVEZMX1JFVFJBTlNNSVNTSU9OKSkgewogCQlfX3NrYl9xdWV1ZV90YWlsKCZ0eC0+c2ticywgdHgtPnNrYik7CiAJCXR4LT5za2IgPSBOVUxMOwpAQCAtMTczMyw2ICsxNzYwLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaW52b2tlX3R4X2hhbmRsZXJzKHN0cnVjdCBpZWVlODAyMTFfdHhfZGF0YSAqdHgpCit7CisJaW50IHIgPSBpbnZva2VfdHhfaGFuZGxlcnNfZWFybHkodHgpOworCisJaWYgKHIpCisJCXJldHVybiByOworCXJldHVybiBpbnZva2VfdHhfaGFuZGxlcnNfbGF0ZSh0eCk7Cit9CisKIGJvb2wgaWVlZTgwMjExX3R4X3ByZXBhcmVfc2tiKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgIGludCBiYW5kLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqKnN0YSkKQEAgLTE4MDcsNyArMTg0MywxMyBAQAogCQlpbmZvLT5od19xdWV1ZSA9CiAJCQlzZGF0YS0+dmlmLmh3X3F1ZXVlW3NrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpXTsKIAotCWlmICghaW52b2tlX3R4X2hhbmRsZXJzKCZ0eCkpCisJaWYgKGludm9rZV90eF9oYW5kbGVyc19lYXJseSgmdHgpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoaWVlZTgwMjExX3F1ZXVlX3NrYihsb2NhbCwgc2RhdGEsIHR4LnN0YSwgdHguc2tiKSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoIWludm9rZV90eF9oYW5kbGVyc19sYXRlKCZ0eCkpCiAJCXJlc3VsdCA9IF9faWVlZTgwMjExX3R4KGxvY2FsLCAmdHguc2ticywgbGVkX2xlbiwKIAkJCQkJdHguc3RhLCB0eHBlbmRpbmcpOwogCkBAIC0yMjYzLDE1ICsyMzA1LDkgQEAKIAljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CiAJCWlmIChzZGF0YS0+d2Rldi53aXBoeS0+ZmxhZ3MgJiBXSVBIWV9GTEFHX1NVUFBPUlRTX1RETFMpIHsKIAkJCXN0YSA9IHN0YV9pbmZvX2dldChzZGF0YSwgc2tiLT5kYXRhKTsKLQkJCWlmIChzdGEpIHsKLQkJCQlib29sIHRkbHNfcGVlciwgdGRsc19hdXRoOwotCi0JCQkJdGRsc19wZWVyID0gdGVzdF9zdGFfZmxhZyhzdGEsCi0JCQkJCQkJICBXTEFOX1NUQV9URExTX1BFRVIpOwotCQkJCXRkbHNfYXV0aCA9IHRlc3Rfc3RhX2ZsYWcoc3RhLAotCQkJCQkJV0xBTl9TVEFfVERMU19QRUVSX0FVVEgpOwotCi0JCQkJaWYgKHRkbHNfcGVlciAmJiB0ZGxzX2F1dGgpIHsKKwkJCWlmIChzdGEgJiYgdGVzdF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX1RETFNfUEVFUikpIHsKKwkJCQlpZiAodGVzdF9zdGFfZmxhZyhzdGEsCisJCQkJCQkgIFdMQU5fU1RBX1RETFNfUEVFUl9BVVRIKSkgewogCQkJCQkqc3RhX291dCA9IHN0YTsKIAkJCQkJcmV0dXJuIDA7CiAJCQkJfQpAQCAtMjI4Myw4ICsyMzE5LDcgQEAKIAkJCQkgKiBhZnRlciBhIFRETFMgc3RhIGlzIHJlbW92ZWQgZHVlIHRvIGJlaW5nCiAJCQkJICogdW5yZWFjaGFibGUuCiAJCQkJICovCi0JCQkJaWYgKHRkbHNfcGVlciAmJiAhdGRsc19hdXRoICYmCi0JCQkJICAgICFpZWVlODAyMTFfaXNfdGRsc19zZXR1cChza2IpKQorCQkJCWlmICghaWVlZTgwMjExX2lzX3RkbHNfc2V0dXAoc2tiKSkKIAkJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAKQEAgLTIzMzQsNyArMjM2OSw2IEBACiAJc3RydWN0IG1lc2hfcGF0aCBfX21heWJlX3VudXNlZCAqbXBwYXRoID0gTlVMTCwgKm1wYXRoID0gTlVMTDsKIAljb25zdCB1OCAqZW5jYXBzX2RhdGE7CiAJaW50IGVuY2Fwc19sZW4sIHNraXBfaGVhZGVyX2J5dGVzOwotCWludCBuaF9wb3MsIGhfcG9zOwogCWJvb2wgd21lX3N0YSA9IGZhbHNlLCBhdXRob3JpemVkID0gZmFsc2U7CiAJYm9vbCB0ZGxzX3BlZXI7CiAJYm9vbCBtdWx0aWNhc3Q7CkBAIC0yNjQwLDEzICsyNjc0LDcgQEAKIAkJZW5jYXBzX2xlbiA9IDA7CiAJfQogCi0JbmhfcG9zID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgLSBza2ItPmRhdGE7Ci0JaF9wb3MgPSBza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpIC0gc2tiLT5kYXRhOwotCiAJc2tiX3B1bGwoc2tiLCBza2lwX2hlYWRlcl9ieXRlcyk7Ci0JbmhfcG9zIC09IHNraXBfaGVhZGVyX2J5dGVzOwotCWhfcG9zIC09IHNraXBfaGVhZGVyX2J5dGVzOwotCiAJaGVhZF9uZWVkID0gaGRybGVuICsgZW5jYXBzX2xlbiArIG1lc2hoZHJsZW4gLSBza2JfaGVhZHJvb20oc2tiKTsKIAogCS8qCkBAIC0yNjcyLDE4ICsyNzAwLDEyIEBACiAJCX0KIAl9CiAKLQlpZiAoZW5jYXBzX2RhdGEpIHsKKwlpZiAoZW5jYXBzX2RhdGEpCiAJCW1lbWNweShza2JfcHVzaChza2IsIGVuY2Fwc19sZW4pLCBlbmNhcHNfZGF0YSwgZW5jYXBzX2xlbik7Ci0JCW5oX3BvcyArPSBlbmNhcHNfbGVuOwotCQloX3BvcyArPSBlbmNhcHNfbGVuOwotCX0KIAogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9NRVNICi0JaWYgKG1lc2hoZHJsZW4gPiAwKSB7CisJaWYgKG1lc2hoZHJsZW4gPiAwKQogCQltZW1jcHkoc2tiX3B1c2goc2tiLCBtZXNoaGRybGVuKSwgJm1lc2hfaGRyLCBtZXNoaGRybGVuKTsKLQkJbmhfcG9zICs9IG1lc2hoZHJsZW47Ci0JCWhfcG9zICs9IG1lc2hoZHJsZW47Ci0JfQogI2VuZGlmCiAKIAlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGZjKSkgewpAQCAtMjY5OSwxNSArMjcyMSw3IEBACiAJfSBlbHNlCiAJCW1lbWNweShza2JfcHVzaChza2IsIGhkcmxlbiksICZoZHIsIGhkcmxlbik7CiAKLQluaF9wb3MgKz0gaGRybGVuOwotCWhfcG9zICs9IGhkcmxlbjsKLQotCS8qIFVwZGF0ZSBza2IgcG9pbnRlcnMgdG8gdmFyaW91cyBoZWFkZXJzIHNpbmNlIHRoaXMgbW9kaWZpZWQgZnJhbWUKLQkgKiBpcyBnb2luZyB0byBnbyB0aHJvdWdoIExpbnV4IG5ldHdvcmtpbmcgY29kZSB0aGF0IG1heSBwb3RlbnRpYWxseQotCSAqIG5lZWQgdGhpbmdzIGxpa2UgcG9pbnRlciB0byBJUCBoZWFkZXIuICovCiAJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKLQlza2Jfc2V0X25ldHdvcmtfaGVhZGVyKHNrYiwgbmhfcG9zKTsKLQlza2Jfc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiLCBoX3Bvcyk7CiAKIAlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOwogCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKQEAgLTMxNzksOCArMzE5Myw3MSBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qCisgKiBDYW4gYmUgY2FsbGVkIHdoaWxlIHRoZSBzdGEgbG9jayBpcyBoZWxkLiBBbnl0aGluZyB0aGF0IGNhbiBjYXVzZSBwYWNrZXRzIHRvCisgKiBiZSBnZW5lcmF0ZWQgd2lsbCBjYXVzZSBkZWFkbG9jayEKKyAqLworc3RhdGljIHZvaWQgaWVlZTgwMjExX3htaXRfZmFzdF9maW5pc2goc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJICAgICAgIHN0cnVjdCBzdGFfaW5mbyAqc3RhLCB1OCBwbl9vZmZzLAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2tleSAqa2V5LAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHZvaWQgKilza2ItPmRhdGE7CisJdTggdGlkID0gSUVFRTgwMjExX05VTV9USURTOworCisJaWYgKGtleSkKKwkJaW5mby0+Y29udHJvbC5od19rZXkgPSAma2V5LT5jb25mOworCisJaWVlZTgwMjExX3R4X3N0YXRzKHNrYi0+ZGV2LCBza2ItPmxlbik7CisKKwlpZiAoaGRyLT5mcmFtZV9jb250cm9sICYgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBKSkgeworCQl0aWQgPSBza2ItPnByaW9yaXR5ICYgSUVFRTgwMjExX1FPU19DVExfVEFHMURfTUFTSzsKKwkJKmllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpID0gdGlkOworCQloZHItPnNlcV9jdHJsID0gaWVlZTgwMjExX3R4X25leHRfc2VxKHN0YSwgdGlkKTsKKwl9IGVsc2UgeworCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfQ1RMX0FTU0lHTl9TRVE7CisJCWhkci0+c2VxX2N0cmwgPSBjcHVfdG9fbGUxNihzZGF0YS0+c2VxdWVuY2VfbnVtYmVyKTsKKwkJc2RhdGEtPnNlcXVlbmNlX251bWJlciArPSAweDEwOworCX0KKworCWlmIChza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKQorCQlzdGEtPnR4X3N0YXRzLm1zZHVbdGlkXSArPQorCQkJRElWX1JPVU5EX1VQKHNrYi0+bGVuLCBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKTsKKwllbHNlCisJCXN0YS0+dHhfc3RhdHMubXNkdVt0aWRdKys7CisKKwlpbmZvLT5od19xdWV1ZSA9IHNkYXRhLT52aWYuaHdfcXVldWVbc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYildOworCisJLyogc3RhdGlzdGljcyBub3JtYWxseSBkb25lIGJ5IGllZWU4MDIxMV90eF9oX3N0YXRzIChidXQgdGhhdAorCSAqIGhhcyB0byBjb25zaWRlciBmcmFnbWVudGF0aW9uLCBzbyBpcyBtb3JlIGNvbXBsZXgpCisJICovCisJc3RhLT50eF9zdGF0cy5ieXRlc1tza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKV0gKz0gc2tiLT5sZW47CisJc3RhLT50eF9zdGF0cy5wYWNrZXRzW3NrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpXSsrOworCisJaWYgKHBuX29mZnMpIHsKKwkJdTY0IHBuOworCQl1OCAqY3J5cHRvX2hkciA9IHNrYi0+ZGF0YSArIHBuX29mZnM7CisKKwkJc3dpdGNoIChrZXktPmNvbmYuY2lwaGVyKSB7CisJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKKwkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QXzI1NjoKKwkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9HQ01QOgorCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0dDTVBfMjU2OgorCQkJcG4gPSBhdG9taWM2NF9pbmNfcmV0dXJuKCZrZXktPmNvbmYudHhfcG4pOworCQkJY3J5cHRvX2hkclswXSA9IHBuOworCQkJY3J5cHRvX2hkclsxXSA9IHBuID4+IDg7CisJCQljcnlwdG9faGRyWzRdID0gcG4gPj4gMTY7CisJCQljcnlwdG9faGRyWzVdID0gcG4gPj4gMjQ7CisJCQljcnlwdG9faGRyWzZdID0gcG4gPj4gMzI7CisJCQljcnlwdG9faGRyWzddID0gcG4gPj4gNDA7CisJCQlicmVhazsKKwkJfQorCX0KK30KKwogc3RhdGljIGJvb2wgaWVlZTgwMjExX3htaXRfZmFzdChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKLQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwKKwkJCQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwKIAkJCQlzdHJ1Y3QgaWVlZTgwMjExX2Zhc3RfdHggKmZhc3RfdHgsCiAJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKQEAgLTMyMzEsOCArMzMwOCw2IEBACiAJCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlpZWVlODAyMTFfdHhfc3RhdHMoZGV2LCBza2ItPmxlbiArIGV4dHJhX2hlYWQpOwotCiAJaWYgKChoZHItPmZyYW1lX2NvbnRyb2wgJiBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEEpKSAmJgogCSAgICBpZWVlODAyMTFfYW1zZHVfYWdncmVnYXRlKHNkYXRhLCBzdGEsIGZhc3RfdHgsIHNrYikpCiAJCXJldHVybiB0cnVlOwpAQCAtMzI2MSwyNCArMzMzNiw3IEBACiAJaW5mby0+ZmxhZ3MgPSBJRUVFODAyMTFfVFhfQ1RMX0ZJUlNUX0ZSQUdNRU5UIHwKIAkJICAgICAgSUVFRTgwMjExX1RYX0NUTF9ET05URlJBRyB8CiAJCSAgICAgICh0aWRfdHggPyBJRUVFODAyMTFfVFhfQ1RMX0FNUERVIDogMCk7Ci0KLQlpZiAoaGRyLT5mcmFtZV9jb250cm9sICYgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBKSkgewotCQkqaWVlZTgwMjExX2dldF9xb3NfY3RsKGhkcikgPSB0aWQ7Ci0JCWlmICghc3RhLT5zdGEudHhxWzBdKQotCQkJaGRyLT5zZXFfY3RybCA9IGllZWU4MDIxMV90eF9uZXh0X3NlcShzdGEsIHRpZCk7Ci0JfSBlbHNlIHsKLQkJaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX0NUTF9BU1NJR05fU0VROwotCQloZHItPnNlcV9jdHJsID0gY3B1X3RvX2xlMTYoc2RhdGEtPnNlcXVlbmNlX251bWJlcik7Ci0JCXNkYXRhLT5zZXF1ZW5jZV9udW1iZXIgKz0gMHgxMDsKLQl9Ci0KLQlpZiAoc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkKLQkJc3RhLT50eF9zdGF0cy5tc2R1W3RpZF0gKz0KLQkJCURJVl9ST1VORF9VUChza2ItPmxlbiwgc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSk7Ci0JZWxzZQotCQlzdGEtPnR4X3N0YXRzLm1zZHVbdGlkXSsrOwotCi0JaW5mby0+aHdfcXVldWUgPSBzZGF0YS0+dmlmLmh3X3F1ZXVlW3NrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpXTsKKwlpbmZvLT5jb250cm9sLmZsYWdzID0gSUVFRTgwMjExX1RYX0NUUkxfRkFTVF9YTUlUOwogCiAJX19za2JfcXVldWVfaGVhZF9pbml0KCZ0eC5za2JzKTsKIApAQCAtMzI4OCw5ICszMzQ2LDYgQEAKIAl0eC5zdGEgPSBzdGE7CiAJdHgua2V5ID0gZmFzdF90eC0+a2V5OwogCi0JaWYgKGZhc3RfdHgtPmtleSkKLQkJaW5mby0+Y29udHJvbC5od19rZXkgPSAmZmFzdF90eC0+a2V5LT5jb25mOwotCiAJaWYgKCFpZWVlODAyMTFfaHdfY2hlY2soJmxvY2FsLT5odywgSEFTX1JBVEVfQ09OVFJPTCkpIHsKIAkJdHguc2tiID0gc2tiOwogCQlyID0gaWVlZTgwMjExX3R4X2hfcmF0ZV9jdHJsKCZ0eCk7CkBAIC0zMzA0LDMxICszMzU5LDExIEBACiAJCX0KIAl9CiAKLQkvKiBzdGF0aXN0aWNzIG5vcm1hbGx5IGRvbmUgYnkgaWVlZTgwMjExX3R4X2hfc3RhdHMgKGJ1dCB0aGF0Ci0JICogaGFzIHRvIGNvbnNpZGVyIGZyYWdtZW50YXRpb24sIHNvIGlzIG1vcmUgY29tcGxleCkKLQkgKi8KLQlzdGEtPnR4X3N0YXRzLmJ5dGVzW3NrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpXSArPSBza2ItPmxlbjsKLQlzdGEtPnR4X3N0YXRzLnBhY2tldHNbc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYildKys7CisJaWYgKGllZWU4MDIxMV9xdWV1ZV9za2IobG9jYWwsIHNkYXRhLCBzdGEsIHNrYikpCisJCXJldHVybiB0cnVlOwogCi0JaWYgKGZhc3RfdHgtPnBuX29mZnMpIHsKLQkJdTY0IHBuOwotCQl1OCAqY3J5cHRvX2hkciA9IHNrYi0+ZGF0YSArIGZhc3RfdHgtPnBuX29mZnM7Ci0KLQkJc3dpdGNoIChmYXN0X3R4LT5rZXktPmNvbmYuY2lwaGVyKSB7Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QXzI1NjoKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9HQ01QOgotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0dDTVBfMjU2OgotCQkJcG4gPSBhdG9taWM2NF9pbmNfcmV0dXJuKCZmYXN0X3R4LT5rZXktPmNvbmYudHhfcG4pOwotCQkJY3J5cHRvX2hkclswXSA9IHBuOwotCQkJY3J5cHRvX2hkclsxXSA9IHBuID4+IDg7Ci0JCQljcnlwdG9faGRyWzRdID0gcG4gPj4gMTY7Ci0JCQljcnlwdG9faGRyWzVdID0gcG4gPj4gMjQ7Ci0JCQljcnlwdG9faGRyWzZdID0gcG4gPj4gMzI7Ci0JCQljcnlwdG9faGRyWzddID0gcG4gPj4gNDA7Ci0JCQlicmVhazsKLQkJfQotCX0KKwlpZWVlODAyMTFfeG1pdF9mYXN0X2ZpbmlzaChzZGF0YSwgc3RhLCBmYXN0X3R4LT5wbl9vZmZzLAorCQkJCSAgIGZhc3RfdHgtPmtleSwgc2tiKTsKIAogCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTikKIAkJc2RhdGEgPSBjb250YWluZXJfb2Yoc2RhdGEtPmJzcywKQEAgLTMzMzksNiArMzM3NCw5NCBAQAogCXJldHVybiB0cnVlOwogfQogCitzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX3R4X2RlcXVldWUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4cSAqdHhxKQoreworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gaHdfdG9fbG9jYWwoaHcpOworCXN0cnVjdCB0eHFfaW5mbyAqdHhxaSA9IGNvbnRhaW5lcl9vZih0eHEsIHN0cnVjdCB0eHFfaW5mbywgdHhxKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXN0cnVjdCBmcSAqZnEgPSAmbG9jYWwtPmZxOworCXN0cnVjdCBmcV90aW4gKnRpbiA9ICZ0eHFpLT50aW47CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOworCXN0cnVjdCBpZWVlODAyMTFfdHhfZGF0YSB0eDsKKwlpZWVlODAyMTFfdHhfcmVzdWx0IHI7CisKKwlzcGluX2xvY2tfYmgoJmZxLT5sb2NrKTsKKworCWlmICh0ZXN0X2JpdChJRUVFODAyMTFfVFhRX1NUT1AsICZ0eHFpLT5mbGFncykpCisJCWdvdG8gb3V0OworCisJLyogTWFrZSBzdXJlIGZyYWdtZW50cyBzdGF5IHRvZ2V0aGVyLiAqLworCXNrYiA9IF9fc2tiX2RlcXVldWUoJnR4cWktPmZyYWdzKTsKKwlpZiAoc2tiKQorCQlnb3RvIG91dDsKKworYmVnaW46CisJc2tiID0gZnFfdGluX2RlcXVldWUoZnEsIHRpbiwgZnFfdGluX2RlcXVldWVfZnVuYyk7CisJaWYgKCFza2IpCisJCWdvdG8gb3V0OworCisJaWVlZTgwMjExX3NldF9za2JfdmlmKHNrYiwgdHhxaSk7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CisJaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKworCW1lbXNldCgmdHgsIDAsIHNpemVvZih0eCkpOworCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmdHguc2ticyk7CisJdHgubG9jYWwgPSBsb2NhbDsKKwl0eC5za2IgPSBza2I7CisJdHguc2RhdGEgPSB2aWZfdG9fc2RhdGEoaW5mby0+Y29udHJvbC52aWYpOworCisJaWYgKHR4cS0+c3RhKQorCQl0eC5zdGEgPSBjb250YWluZXJfb2YodHhxLT5zdGEsIHN0cnVjdCBzdGFfaW5mbywgc3RhKTsKKworCS8qCisJICogVGhlIGtleSBjYW4gYmUgcmVtb3ZlZCB3aGlsZSB0aGUgcGFja2V0IHdhcyBxdWV1ZWQsIHNvIG5lZWQgdG8gY2FsbAorCSAqIHRoaXMgaGVyZSB0byBnZXQgdGhlIGN1cnJlbnQga2V5LgorCSAqLworCXIgPSBpZWVlODAyMTFfdHhfaF9zZWxlY3Rfa2V5KCZ0eCk7CisJaWYgKHIgIT0gVFhfQ09OVElOVUUpIHsKKwkJaWVlZTgwMjExX2ZyZWVfdHhza2IoJmxvY2FsLT5odywgc2tiKTsKKwkJZ290byBiZWdpbjsKKwl9CisKKwlpZiAoaW5mby0+Y29udHJvbC5mbGFncyAmIElFRUU4MDIxMV9UWF9DVFJMX0ZBU1RfWE1JVCkgeworCQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSA9IGNvbnRhaW5lcl9vZih0eHEtPnN0YSwgc3RydWN0IHN0YV9pbmZvLAorCQkJCQkJICAgIHN0YSk7CisJCXU4IHBuX29mZnMgPSAwOworCisJCWlmICh0eC5rZXkgJiYKKwkJICAgICh0eC5rZXktPmNvbmYuZmxhZ3MgJiBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVYpKQorCQkJcG5fb2ZmcyA9IGllZWU4MDIxMV9oZHJsZW4oaGRyLT5mcmFtZV9jb250cm9sKTsKKworCQlpZWVlODAyMTFfeG1pdF9mYXN0X2ZpbmlzaChzdGEtPnNkYXRhLCBzdGEsIHBuX29mZnMsCisJCQkJCSAgIHR4LmtleSwgc2tiKTsKKwl9IGVsc2UgeworCQlpZiAoaW52b2tlX3R4X2hhbmRsZXJzX2xhdGUoJnR4KSkKKwkJCWdvdG8gYmVnaW47CisKKwkJc2tiID0gX19za2JfZGVxdWV1ZSgmdHguc2ticyk7CisKKwkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnR4LnNrYnMpKQorCQkJc2tiX3F1ZXVlX3NwbGljZV90YWlsKCZ0eC5za2JzLCAmdHhxaS0+ZnJhZ3MpOworCX0KKworCWlmIChza2IgJiYgc2tiX2hhc19mcmFnX2xpc3Qoc2tiKSAmJgorCSAgICAhaWVlZTgwMjExX2h3X2NoZWNrKCZsb2NhbC0+aHcsIFRYX0ZSQUdfTElTVCkpIHsKKwkJaWYgKHNrYl9saW5lYXJpemUoc2tiKSkgeworCQkJaWVlZTgwMjExX2ZyZWVfdHhza2IoJmxvY2FsLT5odywgc2tiKTsKKwkJCWdvdG8gYmVnaW47CisJCX0KKwl9CisKK291dDoKKwlzcGluX3VubG9ja19iaCgmZnEtPmxvY2spOworCisJcmV0dXJuIHNrYjsKK30KK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX3R4X2RlcXVldWUpOworCiB2b2lkIF9faWVlZTgwMjExX3N1YmlmX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJICB1MzIgaW5mb19mbGFncykKQEAgLTMzNjMsNyArMzQ4Niw3IEBACiAJCWZhc3RfdHggPSByY3VfZGVyZWZlcmVuY2Uoc3RhLT5mYXN0X3R4KTsKIAogCQlpZiAoZmFzdF90eCAmJgotCQkgICAgaWVlZTgwMjExX3htaXRfZmFzdChzZGF0YSwgZGV2LCBzdGEsIGZhc3RfdHgsIHNrYikpCisJCSAgICBpZWVlODAyMTFfeG1pdF9mYXN0KHNkYXRhLCBzdGEsIGZhc3RfdHgsIHNrYikpCiAJCQlnb3RvIG91dDsKIAl9CiAKQEAgLTQyNzUsNyArNDM5OCw3IEBACiAJCQlzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKHNrYi0+ZGV2KTsKIAkJaWYgKCFpZWVlODAyMTFfdHhfcHJlcGFyZShzZGF0YSwgJnR4LCBOVUxMLCBza2IpKQogCQkJYnJlYWs7Ci0JCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCWllZWU4MDIxMV9mcmVlX3R4c2tiKGh3LCBza2IpOwogCX0KIAogCWluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CkBAIC00MzkwLDkgKzQ1MTMsNiBAQAogCWludCBhYyA9IGllZWU4MDJfMWRfdG9fYWNbdGlkICYgN107CiAKIAlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwotCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwotCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7Ci0KIAlza2Jfc2V0X3F1ZXVlX21hcHBpbmcoc2tiLCBhYyk7CiAJc2tiLT5wcmlvcml0eSA9IHRpZDsKIApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3V0aWwuYyBiL25ldC9tYWM4MDIxMS91dGlsLmMKaW5kZXggNDJiZjBiNi4uNTQ1Yzc5YSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3V0aWwuYworKysgYi9uZXQvbWFjODAyMTEvdXRpbC5jCkBAIC01OTgsNyArNTk4LDcgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzZGF0YSwgJmxvY2FsLT5pbnRlcmZhY2VzLCBsaXN0KSB7CiAJCXN3aXRjaCAoc2RhdGEtPnZpZi50eXBlKSB7CiAJCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKLQkJCWlmICghKHNkYXRhLT51Lm1udHJfZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQUNUSVZFKSkKKwkJCWlmICghKHNkYXRhLT51Lm1udHIuZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQUNUSVZFKSkKIAkJCQljb250aW51ZTsKIAkJCWJyZWFrOwogCQljYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46CkBAIC0xMjA5LDcgKzEyMDksOCBAQAogCX0KIAogCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUiAmJgotCSAgICBzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRSkgeworCSAgICBzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRSAmJgorCSAgICBzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTkFOKSB7CiAJCXNkYXRhLT52aWYuYnNzX2NvbmYucW9zID0gZW5hYmxlX3FvczsKIAkJaWYgKGJzc19ub3RpZnkpCiAJCQlpZWVlODAyMTFfYnNzX2luZm9fY2hhbmdlX25vdGlmeShzZGF0YSwKQEAgLTE3NDgsNiArMTc0OSw0NiBAQAogCW11dGV4X3VubG9jaygmbG9jYWwtPnN0YV9tdHgpOwogfQogCitzdGF0aWMgaW50IGllZWU4MDIxMV9yZWNvbmZpZ19uYW4oc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCit7CisJc3RydWN0IGNmZzgwMjExX25hbl9mdW5jICpmdW5jLCAqKmZ1bmNzOworCWludCByZXMsIGlkLCBpID0gMDsKKworCXJlcyA9IGRydl9zdGFydF9uYW4oc2RhdGEtPmxvY2FsLCBzZGF0YSwKKwkJCSAgICAmc2RhdGEtPnUubmFuLmNvbmYpOworCWlmIChXQVJOX09OKHJlcykpCisJCXJldHVybiByZXM7CisKKwlmdW5jcyA9IGt6YWxsb2MoKHNkYXRhLT5sb2NhbC0+aHcubWF4X25hbl9kZV9lbnRyaWVzICsgMSkgKgorCQkJc2l6ZW9mKCpmdW5jcyksIEdGUF9LRVJORUwpOworCWlmICghZnVuY3MpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogQWRkIGFsbCB0aGUgZnVuY3Rpb25zOgorCSAqIFRoaXMgaXMgYSBsaXR0bGUgYml0IHVnbHkuIFdlIG5lZWQgdG8gY2FsbCBhIHBvdGVudGlhbGx5IHNsZWVwaW5nCisJICogY2FsbGJhY2sgZm9yIGVhY2ggTkFOIGZ1bmN0aW9uLCBzbyB3ZSBjYW4ndCBob2xkIHRoZSBzcGlubG9jay4KKwkgKi8KKwlzcGluX2xvY2tfYmgoJnNkYXRhLT51Lm5hbi5mdW5jX2xvY2spOworCisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZzZGF0YS0+dS5uYW4uZnVuY3Rpb25faW5zdF9pZHMsIGZ1bmMsIGlkKQorCQlmdW5jc1tpKytdID0gZnVuYzsKKworCXNwaW5fdW5sb2NrX2JoKCZzZGF0YS0+dS5uYW4uZnVuY19sb2NrKTsKKworCWZvciAoaSA9IDA7IGZ1bmNzW2ldOyBpKyspIHsKKwkJcmVzID0gZHJ2X2FkZF9uYW5fZnVuYyhzZGF0YS0+bG9jYWwsIHNkYXRhLCBmdW5jc1tpXSk7CisJCWlmIChXQVJOX09OKHJlcykpCisJCQlpZWVlODAyMTFfbmFuX2Z1bmNfdGVybWluYXRlZCgmc2RhdGEtPnZpZiwKKwkJCQkJCSAgICAgIGZ1bmNzW2ldLT5pbnN0YW5jZV9pZCwKKwkJCQkJCSAgICAgIE5MODAyMTFfTkFOX0ZVTkNfVEVSTV9SRUFTT05fRVJST1IsCisJCQkJCQkgICAgICBHRlBfS0VSTkVMKTsKKwl9CisKKwlrZnJlZShmdW5jcyk7CisKKwlyZXR1cm4gMDsKK30KKwogaW50IGllZWU4MDIxMV9yZWNvbmZpZyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9ICZsb2NhbC0+aHc7CkBAIC0xOTcxLDYgKzIwMTIsMTMgQEAKIAkJCQlpZWVlODAyMTFfYnNzX2luZm9fY2hhbmdlX25vdGlmeShzZGF0YSwgY2hhbmdlZCk7CiAJCQl9CiAJCQlicmVhazsKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9OQU46CisJCQlyZXMgPSBpZWVlODAyMTFfcmVjb25maWdfbmFuKHNkYXRhKTsKKwkJCWlmIChyZXMgPCAwKSB7CisJCQkJaWVlZTgwMjExX2hhbmRsZV9yZWNvbmZpZ19mYWlsdXJlKGxvY2FsKTsKKwkJCQlyZXR1cm4gcmVzOworCQkJfQorCQkJYnJlYWs7CiAJCWNhc2UgTkw4MDIxMV9JRlRZUEVfV0RTOgogCQljYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46CiAJCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKQEAgLTI1NTUsNyArMjYwMyw2IEBACiAKIAkJaWYgKG5lZWRfYmFzaWMgJiYgYmFzaWNfcmF0ZXMgJiBCSVQoaSkpCiAJCQliYXNpYyA9IDB4ODA7Ci0JCXJhdGUgPSBzYmFuZC0+Yml0cmF0ZXNbaV0uYml0cmF0ZTsKIAkJcmF0ZSA9IERJVl9ST1VORF9VUChzYmFuZC0+Yml0cmF0ZXNbaV0uYml0cmF0ZSwKIAkJCQkgICAgNSAqICgxIDw8IHNoaWZ0KSk7CiAJCSpwb3MrKyA9IGJhc2ljIHwgKHU4KSByYXRlOwpAQCAtMzM5NCwxMSArMzQ0MSwxOCBAQAogCQkJICAgICB1bnNpZ25lZCBsb25nICpieXRlX2NudCkKIHsKIAlzdHJ1Y3QgdHhxX2luZm8gKnR4cWkgPSB0b190eHFfaW5mbyh0eHEpOworCXUzMiBmcmFnX2NudCA9IDAsIGZyYWdfYnl0ZXMgPSAwOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2JfcXVldWVfd2FsaygmdHhxaS0+ZnJhZ3MsIHNrYikgeworCQlmcmFnX2NudCsrOworCQlmcmFnX2J5dGVzICs9IHNrYi0+bGVuOworCX0KIAogCWlmIChmcmFtZV9jbnQpCi0JCSpmcmFtZV9jbnQgPSB0eHFpLT50aW4uYmFja2xvZ19wYWNrZXRzOworCQkqZnJhbWVfY250ID0gdHhxaS0+dGluLmJhY2tsb2dfcGFja2V0cyArIGZyYWdfY250OwogCiAJaWYgKGJ5dGVfY250KQotCQkqYnl0ZV9jbnQgPSB0eHFpLT50aW4uYmFja2xvZ19ieXRlczsKKwkJKmJ5dGVfY250ID0gdHhxaS0+dGluLmJhY2tsb2dfYnl0ZXMgKyBmcmFnX2J5dGVzOwogfQogRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfdHhxX2dldF9kZXB0aCk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTU0L2lmYWNlLmMgYi9uZXQvbWFjODAyMTU0L2lmYWNlLmMKaW5kZXggNzA3OWNkMy4uMDYwMTlkYiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjE1NC9pZmFjZS5jCisrKyBiL25ldC9tYWM4MDIxNTQvaWZhY2UuYwpAQCAtNjYzLDYgKzY2Myw3IEBACiAKIAkvKiBUT0RPIGNoZWNrIHRoaXMgKi8KIAlTRVRfTkVUREVWX0RFVihuZGV2LCAmbG9jYWwtPnBoeS0+ZGV2KTsKKwlkZXZfbmV0X3NldChuZGV2LCB3cGFuX3BoeV9uZXQobG9jYWwtPmh3LnBoeSkpOwogCXNkYXRhID0gbmV0ZGV2X3ByaXYobmRldik7CiAJbmRldi0+aWVlZTgwMjE1NF9wdHIgPSAmc2RhdGEtPndwYW5fZGV2OwogCW1lbWNweShzZGF0YS0+bmFtZSwgbmRldi0+bmFtZSwgSUZOQU1TSVopOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjE1NC9yeC5jIGIvbmV0L21hYzgwMjE1NC9yeC5jCmluZGV4IDQ0NmUxMzAuLjRkY2Y2ZTEgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxNTQvcnguYworKysgYi9uZXQvbWFjODAyMTU0L3J4LmMKQEAgLTEwMSwxMSArMTAxLDE2IEBACiAJc2RhdGEtPmRldi0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CiAKIAlzd2l0Y2ggKG1hY19jYihza2IpLT50eXBlKSB7CisJY2FzZSBJRUVFODAyMTU0X0ZDX1RZUEVfQkVBQ09OOgorCWNhc2UgSUVFRTgwMjE1NF9GQ19UWVBFX0FDSzoKKwljYXNlIElFRUU4MDIxNTRfRkNfVFlQRV9NQUNfQ01EOgorCQlnb3RvIGZhaWw7CisKIAljYXNlIElFRUU4MDIxNTRfRkNfVFlQRV9EQVRBOgogCQlyZXR1cm4gaWVlZTgwMjE1NF9kZWxpdmVyX3NrYihza2IpOwogCWRlZmF1bHQ6Ci0JCXByX3dhcm4oImllZWU4MDIxNTQ6IGJhZCBmcmFtZSByZWNlaXZlZCAodHlwZSA9ICVkKVxuIiwKLQkJCW1hY19jYihza2IpLT50eXBlKTsKKwkJcHJfd2Fybl9yYXRlbGltaXRlZCgiaWVlZTgwMjE1NDogYmFkIGZyYW1lIHJlY2VpdmVkICIKKwkJCQkgICAgIih0eXBlID0gJWQpXG4iLCBtYWNfY2Ioc2tiKS0+dHlwZSk7CiAJCWdvdG8gZmFpbDsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9tcGxzL2FmX21wbHMuYyBiL25ldC9tcGxzL2FmX21wbHMuYwppbmRleCA1YzE2MWU3Li4wZTQzMzRjIDEwMDY0NAotLS0gYS9uZXQvbXBscy9hZl9tcGxzLmMKKysrIGIvbmV0L21wbHMvYWZfbXBscy5jCkBAIC05NjEsOSArOTYxLDYgQEAKIAkJCQlSQ1VfSU5JVF9QT0lOVEVSKG5oLT5uaF9kZXYsIE5VTEwpOwogCQl9IGVuZGZvcl9uZXh0aG9wcyhydCk7CiAJfQotCi0KLQlyZXR1cm47CiB9CiAKIHN0YXRpYyB2b2lkIG1wbHNfaWZ1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgbmhfZmxhZ3MpCkBAIC05OTcsOCArOTk0LDYgQEAKIAogCQlBQ0NFU1NfT05DRShydC0+cnRfbmhuX2FsaXZlKSA9IGFsaXZlOwogCX0KLQotCXJldHVybjsKIH0KIAogc3RhdGljIGludCBtcGxzX2Rldl9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGV2ZW50LApkaWZmIC0tZ2l0IGEvbmV0L21wbHMvaW50ZXJuYWwuaCBiL25ldC9tcGxzL2ludGVybmFsLmgKaW5kZXggNzMyYTVjMS4uYmRmZWY2YyAxMDA2NDQKLS0tIGEvbmV0L21wbHMvaW50ZXJuYWwuaAorKysgYi9uZXQvbXBscy9pbnRlcm5hbC5oCkBAIC0xLDkgKzEsNiBAQAogI2lmbmRlZiBNUExTX0lOVEVSTkFMX0gKICNkZWZpbmUgTVBMU19JTlRFUk5BTF9ICi0KLXN0cnVjdCBtcGxzX3NoaW1faGRyIHsKLQlfX2JlMzIgbGFiZWxfc3RhY2tfZW50cnk7Ci19OworI2luY2x1ZGUgPG5ldC9tcGxzLmg+CiAKIHN0cnVjdCBtcGxzX2VudHJ5X2RlY29kZWQgewogCXUzMiBsYWJlbDsKQEAgLTkzLDExICs5MCw2IEBACiAKICNkZWZpbmUgZW5kZm9yX25leHRob3BzKHJ0KSB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IG1wbHNfc2hpbV9oZHIgKm1wbHNfaGRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JcmV0dXJuIChzdHJ1Y3QgbXBsc19zaGltX2hkciAqKXNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwotfQotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBtcGxzX3NoaW1faGRyIG1wbHNfZW50cnlfZW5jb2RlKHUzMiBsYWJlbCwgdW5zaWduZWQgdHRsLCB1bnNpZ25lZCB0YywgYm9vbCBib3MpCiB7CiAJc3RydWN0IG1wbHNfc2hpbV9oZHIgcmVzdWx0OwpkaWZmIC0tZ2l0IGEvbmV0L21wbHMvbXBsc19nc28uYyBiL25ldC9tcGxzL21wbHNfZ3NvLmMKaW5kZXggMjA1NWU1Ny4uYjRkYTZkOCAxMDA2NDQKLS0tIGEvbmV0L21wbHMvbXBsc19nc28uYworKysgYi9uZXQvbXBscy9tcGxzX2dzby5jCkBAIC0yMywzMiArMjMsNTAgQEAKIAkJCQkgICAgICAgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNlZ3MgPSBFUlJfUFRSKC1FSU5WQUwpOworCXUxNiBtYWNfb2Zmc2V0ID0gc2tiLT5tYWNfaGVhZGVyOwogCW5ldGRldl9mZWF0dXJlc190IG1wbHNfZmVhdHVyZXM7CisJdTE2IG1hY19sZW4gPSBza2ItPm1hY19sZW47CiAJX19iZTE2IG1wbHNfcHJvdG9jb2w7CisJdW5zaWduZWQgaW50IG1wbHNfaGxlbjsKKworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCW1wbHNfaGxlbiA9IHNrYl9pbm5lcl9uZXR3b3JrX2hlYWRlcihza2IpIC0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CisJaWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgbXBsc19obGVuKSkpCisJCWdvdG8gb3V0OwogCiAJLyogU2V0dXAgaW5uZXIgU0tCLiAqLwogCW1wbHNfcHJvdG9jb2wgPSBza2ItPnByb3RvY29sOwogCXNrYi0+cHJvdG9jb2wgPSBza2ItPmlubmVyX3Byb3RvY29sOwogCi0JLyogUHVzaCBiYWNrIHRoZSBtYWMgaGVhZGVyIHRoYXQgc2tiX21hY19nc29fc2VnbWVudCgpIGhhcyBwdWxsZWQuCi0JICogSXQgd2lsbCBiZSByZS1wdWxsZWQgYnkgdGhlIGNhbGwgdG8gc2tiX21hY19nc29fc2VnbWVudCgpIGJlbG93Ci0JICovCi0JX19za2JfcHVzaChza2IsIHNrYi0+bWFjX2xlbik7CisJX19za2JfcHVsbChza2IsIG1wbHNfaGxlbik7CisKKwlza2ItPm1hY19sZW4gPSAwOworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAKIAkvKiBTZWdtZW50IGlubmVyIHBhY2tldC4gKi8KIAltcGxzX2ZlYXR1cmVzID0gc2tiLT5kZXYtPm1wbHNfZmVhdHVyZXMgJiBmZWF0dXJlczsKIAlzZWdzID0gc2tiX21hY19nc29fc2VnbWVudChza2IsIG1wbHNfZmVhdHVyZXMpOworCWlmIChJU19FUlJfT1JfTlVMTChzZWdzKSkgeworCQlza2JfZ3NvX2Vycm9yX3Vud2luZChza2IsIG1wbHNfcHJvdG9jb2wsIG1wbHNfaGxlbiwgbWFjX29mZnNldCwKKwkJCQkgICAgIG1hY19sZW4pOworCQlnb3RvIG91dDsKKwl9CisJc2tiID0gc2VnczsKIAorCW1wbHNfaGxlbiArPSBtYWNfbGVuOworCWRvIHsKKwkJc2tiLT5tYWNfbGVuID0gbWFjX2xlbjsKKwkJc2tiLT5wcm90b2NvbCA9IG1wbHNfcHJvdG9jb2w7CiAKLQkvKiBSZXN0b3JlIG91dGVyIHByb3RvY29sLiAqLwotCXNrYi0+cHJvdG9jb2wgPSBtcGxzX3Byb3RvY29sOworCQlza2JfcmVzZXRfaW5uZXJfbmV0d29ya19oZWFkZXIoc2tiKTsKIAotCS8qIFJlLXB1bGwgdGhlIG1hYyBoZWFkZXIgdGhhdCB0aGUgY2FsbCB0byBza2JfbWFjX2dzb19zZWdtZW50KCkKLQkgKiBhYm92ZSBwdWxsZWQuICBJdCB3aWxsIGJlIHJlLXB1c2hlZCBhZnRlciByZXR1cm5pbmcKLQkgKiBza2JfbWFjX2dzb19zZWdtZW50KCksIGFuIGluZGlyZWN0IGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uLgotCSAqLwotCV9fc2tiX3B1bGwoc2tiLCBza2ItPmRhdGEgLSBza2JfbWFjX2hlYWRlcihza2IpKTsKKwkJX19za2JfcHVzaChza2IsIG1wbHNfaGxlbik7CiAKKwkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKKwkJc2tiX3NldF9uZXR3b3JrX2hlYWRlcihza2IsIG1hY19sZW4pOworCX0gd2hpbGUgKChza2IgPSBza2ItPm5leHQpKTsKKworb3V0OgogCXJldHVybiBzZWdzOwogfQogCmRpZmYgLS1naXQgYS9uZXQvbXBscy9tcGxzX2lwdHVubmVsLmMgYi9uZXQvbXBscy9tcGxzX2lwdHVubmVsLmMKaW5kZXggNjQ0YThkYS4uY2Y1MmNmMyAxMDA2NDQKLS0tIGEvbmV0L21wbHMvbXBsc19pcHR1bm5lbC5jCisrKyBiL25ldC9tcGxzL21wbHNfaXB0dW5uZWwuYwpAQCAtMzcsNyArMzcsNyBAQAogCXJldHVybiBlbi0+bGFiZWxzICogc2l6ZW9mKHN0cnVjdCBtcGxzX3NoaW1faGRyKTsKIH0KIAotc3RhdGljIGludCBtcGxzX291dHB1dChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgbXBsc194bWl0KHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IG1wbHNfaXB0dW5uZWxfZW5jYXAgKnR1bl9lbmNhcF9pbmZvOwogCXN0cnVjdCBtcGxzX3NoaW1faGRyICpoZHI7CkBAIC05MCw3ICs5MCwxMSBAQAogCWlmIChza2JfY293KHNrYiwgaGhfbGVuICsgbmV3X2hlYWRlcl9zaXplKSkKIAkJZ290byBkcm9wOwogCisJc2tiX3NldF9pbm5lcl9wcm90b2NvbChza2IsIHNrYi0+cHJvdG9jb2wpOworCXNrYl9yZXNldF9pbm5lcl9uZXR3b3JrX2hlYWRlcihza2IpOworCiAJc2tiX3B1c2goc2tiLCBuZXdfaGVhZGVyX3NpemUpOworCiAJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAKIAlza2ItPmRldiA9IG91dF9kZXY7CkBAIC0xMTUsNyArMTE5LDcgQEAKIAkJbmV0X2RiZ19yYXRlbGltaXRlZCgiJXM6IHBhY2tldCB0cmFuc21pc3Npb24gZmFpbGVkOiAlZFxuIiwKIAkJCQkgICAgX19mdW5jX18sIGVycik7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gTFdUVU5ORUxfWE1JVF9ET05FOwogCiBkcm9wOgogCWtmcmVlX3NrYihza2IpOwpAQCAtMTUzLDcgKzE1Nyw4IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJvdXQ7CiAJbmV3dHMtPnR5cGUgPSBMV1RVTk5FTF9FTkNBUF9NUExTOwotCW5ld3RzLT5mbGFncyB8PSBMV1RVTk5FTF9TVEFURV9PVVRQVVRfUkVESVJFQ1Q7CisJbmV3dHMtPmZsYWdzIHw9IExXVFVOTkVMX1NUQVRFX1hNSVRfUkVESVJFQ1Q7CisJbmV3dHMtPmhlYWRyb29tID0gbXBsc19lbmNhcF9zaXplKHR1bl9lbmNhcF9pbmZvKTsKIAogCSp0cyA9IG5ld3RzOwogCkBAIC0yMDksNyArMjE0LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBsd3R1bm5lbF9lbmNhcF9vcHMgbXBsc19pcHR1bl9vcHMgPSB7CiAJLmJ1aWxkX3N0YXRlID0gbXBsc19idWlsZF9zdGF0ZSwKLQkub3V0cHV0ID0gbXBsc19vdXRwdXQsCisJLnhtaXQgPSBtcGxzX3htaXQsCiAJLmZpbGxfZW5jYXAgPSBtcGxzX2ZpbGxfZW5jYXBfaW5mbywKIAkuZ2V0X2VuY2FwX3NpemUgPSBtcGxzX2VuY2FwX25sc2l6ZSwKIAkuY21wX2VuY2FwID0gbXBsc19lbmNhcF9jbXAsCmRpZmYgLS1naXQgYS9uZXQvbmNzaS9pbnRlcm5hbC5oIGIvbmV0L25jc2kvaW50ZXJuYWwuaAppbmRleCAzMzczOGMwLi4xMzI5MGE3IDEwMDY0NAotLS0gYS9uZXQvbmNzaS9pbnRlcm5hbC5oCisrKyBiL25ldC9uY3NpL2ludGVybmFsLmgKQEAgLTE3MCw2ICsxNzAsNyBAQAogCiAjZGVmaW5lIE5DU0lfUEFDS0FHRV9TSElGVAk1CiAjZGVmaW5lIE5DU0lfUEFDS0FHRV9JTkRFWChjKQkoKChjKSA+PiBOQ1NJX1BBQ0tBR0VfU0hJRlQpICYgMHg3KQorI2RlZmluZSBOQ1NJX1JFU0VSVkVEX0NIQU5ORUwJMHgxZgogI2RlZmluZSBOQ1NJX0NIQU5ORUxfSU5ERVgoYykJKChjKSAmICgoMSA8PCBOQ1NJX1BBQ0tBR0VfU0hJRlQpIC0gMSkpCiAjZGVmaW5lIE5DU0lfVE9fQ0hBTk5FTChwLCBjKQkoKChwKSA8PCBOQ1NJX1BBQ0tBR0VfU0hJRlQpIHwgKGMpKQogCkBAIC0xODYsOSArMTg3LDE1IEBACiAJc3RydWN0IG5jc2lfY2hhbm5lbF9tb2RlICAgIG1vZGVzW05DU0lfTU9ERV9NQVhdOwogCXN0cnVjdCBuY3NpX2NoYW5uZWxfZmlsdGVyICAqZmlsdGVyc1tOQ1NJX0ZJTFRFUl9NQVhdOwogCXN0cnVjdCBuY3NpX2NoYW5uZWxfc3RhdHMgICBzdGF0czsKLQlzdHJ1Y3QgdGltZXJfbGlzdCAgICAgICAgICAgdGltZXI7CS8qIExpbmsgbW9uaXRvciB0aW1lciAgKi8KLQlib29sICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDsJLyogVGltZXIgaXMgZW5hYmxlZCAgICAqLwotCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgICB0aW1lb3V0OwkvKiBUaW1lcyBvZiB0aW1lb3V0ICAgICovCisJc3RydWN0IHsKKwkJc3RydWN0IHRpbWVyX2xpc3QgICB0aW1lcjsKKwkJYm9vbCAgICAgICAgICAgICAgICBlbmFibGVkOworCQl1bnNpZ25lZCBpbnQgICAgICAgIHN0YXRlOworI2RlZmluZSBOQ1NJX0NIQU5ORUxfTU9OSVRPUl9TVEFSVAkwCisjZGVmaW5lIE5DU0lfQ0hBTk5FTF9NT05JVE9SX1JFVFJZCTEKKyNkZWZpbmUgTkNTSV9DSEFOTkVMX01PTklUT1JfV0FJVAkyCisjZGVmaW5lIE5DU0lfQ0hBTk5FTF9NT05JVE9SX1dBSVRfTUFYCTUKKwl9IG1vbml0b3I7CiAJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICAgIG5vZGU7CiAJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICAgIGxpbms7CiB9OwpAQCAtMjA2LDcgKzIxMyw4IEBACiBzdHJ1Y3QgbmNzaV9yZXF1ZXN0IHsKIAl1bnNpZ25lZCBjaGFyICAgICAgICBpZDsgICAgICAvKiBSZXF1ZXN0IElEIC0gMCB0byAyNTUgICAgICAgICAgICovCiAJYm9vbCAgICAgICAgICAgICAgICAgdXNlZDsgICAgLyogUmVxdWVzdCB0aGF0IGhhcyBiZWVuIGFzc2lnbmVkICAqLwotCWJvb2wgICAgICAgICAgICAgICAgIGRyaXZlbjsgIC8qIERyaXZlIHN0YXRlIG1hY2hpbmUgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgICAgICAgICBmbGFnczsgICAvKiBOQ1NJIHJlcXVlc3QgcHJvcGVydHkgICAgICAgICAgICovCisjZGVmaW5lIE5DU0lfUkVRX0ZMQUdfRVZFTlRfRFJJVkVOCTEKIAlzdHJ1Y3QgbmNzaV9kZXZfcHJpdiAqbmRwOyAgICAvKiBBc3NvY2lhdGVkIE5DU0kgZGV2aWNlICAgICAgICAgICovCiAJc3RydWN0IHNrX2J1ZmYgICAgICAgKmNtZDsgICAgLyogQXNzb2NpYXRlZCBOQ1NJIGNvbW1hbmQgcGFja2V0ICAqLwogCXN0cnVjdCBza19idWZmICAgICAgICpyc3A7ICAgIC8qIEFzc29jaWF0ZWQgTkNTSSByZXNwb25zZSBwYWNrZXQgKi8KQEAgLTI1OCw2ICsyNjYsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgICAgcGFja2FnZXM7ICAgICAgICAvKiBMaXN0IG9mIHBhY2thZ2VzICAgICAgICAgICAqLwogCXN0cnVjdCBuY3NpX3JlcXVlc3QgcmVxdWVzdHNbMjU2XTsgICAvKiBSZXF1ZXN0IHRhYmxlICAgICAgICAgICAgICAqLwogCXVuc2lnbmVkIGludCAgICAgICAgcmVxdWVzdF9pZDsgICAgICAvKiBMYXN0IHVzZWQgcmVxdWVzdCBJRCAgICAgICAqLworI2RlZmluZSBOQ1NJX1JFUV9TVEFSVF9JRFgJMQogCXVuc2lnbmVkIGludCAgICAgICAgcGVuZGluZ19yZXFfbnVtOyAvKiBOdW1iZXIgb2YgcGVuZGluZyByZXF1ZXN0cyAqLwogCXN0cnVjdCBuY3NpX3BhY2thZ2UgKmFjdGl2ZV9wYWNrYWdlOyAvKiBDdXJyZW50bHkgaGFuZGxlZCBwYWNrYWdlICAqLwogCXN0cnVjdCBuY3NpX2NoYW5uZWwgKmFjdGl2ZV9jaGFubmVsOyAvKiBDdXJyZW50bHkgaGFuZGxlZCBjaGFubmVsICAqLwpAQCAtMjc0LDcgKzI4Myw3IEBACiAJdW5zaWduZWQgY2hhciAgICAgICAgcGFja2FnZTsgICAgIC8qIERlc3RpbmF0aW9uIHBhY2thZ2UgSUQgICAgICAgICovCiAJdW5zaWduZWQgY2hhciAgICAgICAgY2hhbm5lbDsgICAgIC8qIERldGluYXRpb24gY2hhbm5lbCBJRCBvciAweDFmICovCiAJdW5zaWduZWQgc2hvcnQgICAgICAgcGF5bG9hZDsgICAgIC8qIENvbW1hbmQgcGFja2V0IHBheWxvYWQgbGVuZ3RoICovCi0JYm9vbCAgICAgICAgICAgICAgICAgZHJpdmVuOyAgICAgIC8qIERyaXZlIHRoZSBzdGF0ZSBtYWNoaW5lPyAgICAgICovCisJdW5zaWduZWQgaW50ICAgICAgICAgcmVxX2ZsYWdzOyAgIC8qIE5DU0kgcmVxdWVzdCBwcm9wZXJ0aWVzICAgICAgICovCiAJdW5pb24gewogCQl1bnNpZ25lZCBjaGFyICBieXRlc1sxNl07IC8qIENvbW1hbmQgcGFja2V0IHNwZWNpZmljIGRhdGEgICovCiAJCXVuc2lnbmVkIHNob3J0IHdvcmRzWzhdOwpAQCAtMzEzLDcgKzMyMiw4IEBACiAJCQkJICAgdW5zaWduZWQgY2hhciBpZCwKIAkJCQkgICBzdHJ1Y3QgbmNzaV9wYWNrYWdlICoqbnAsCiAJCQkJICAgc3RydWN0IG5jc2lfY2hhbm5lbCAqKm5jKTsKLXN0cnVjdCBuY3NpX3JlcXVlc3QgKm5jc2lfYWxsb2NfcmVxdWVzdChzdHJ1Y3QgbmNzaV9kZXZfcHJpdiAqbmRwLCBib29sIGRyaXZlbik7CitzdHJ1Y3QgbmNzaV9yZXF1ZXN0ICpuY3NpX2FsbG9jX3JlcXVlc3Qoc3RydWN0IG5jc2lfZGV2X3ByaXYgKm5kcCwKKwkJCQkJdW5zaWduZWQgaW50IHJlcV9mbGFncyk7CiB2b2lkIG5jc2lfZnJlZV9yZXF1ZXN0KHN0cnVjdCBuY3NpX3JlcXVlc3QgKm5yKTsKIHN0cnVjdCBuY3NpX2RldiAqbmNzaV9maW5kX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGludCBuY3NpX3Byb2Nlc3NfbmV4dF9jaGFubmVsKHN0cnVjdCBuY3NpX2Rldl9wcml2ICpuZHApOwpkaWZmIC0tZ2l0IGEvbmV0L25jc2kvbmNzaS1hZW4uYyBiL25ldC9uY3NpL25jc2ktYWVuLmMKaW5kZXggZDQ2MzQ2OC4uYjQxYTY2MSAxMDA2NDQKLS0tIGEvbmV0L25jc2kvbmNzaS1hZW4uYworKysgYi9uZXQvbmNzaS9uY3NpLWFlbi5jCkBAIC01Myw3ICs1Myw5IEBACiAJc3RydWN0IG5jc2lfYWVuX2xzY19wa3QgKmxzYzsKIAlzdHJ1Y3QgbmNzaV9jaGFubmVsICpuYzsKIAlzdHJ1Y3QgbmNzaV9jaGFubmVsX21vZGUgKm5jbTsKLQl1bnNpZ25lZCBsb25nIG9sZF9kYXRhOworCWJvb2wgY2hhaW5lZDsKKwlpbnQgc3RhdGU7CisJdW5zaWduZWQgbG9uZyBvbGRfZGF0YSwgZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogRmluZCB0aGUgTkNTSSBjaGFubmVsICovCkBAIC02MiwyMCArNjQsMjcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKiBVcGRhdGUgdGhlIGxpbmsgc3RhdHVzICovCi0JbmNtID0gJm5jLT5tb2Rlc1tOQ1NJX01PREVfTElOS107CiAJbHNjID0gKHN0cnVjdCBuY3NpX2Flbl9sc2NfcGt0ICopaDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZuYy0+bG9jaywgZmxhZ3MpOworCW5jbSA9ICZuYy0+bW9kZXNbTkNTSV9NT0RFX0xJTktdOwogCW9sZF9kYXRhID0gbmNtLT5kYXRhWzJdOwotCW5jbS0+ZGF0YVsyXSA9IG50b2hsKGxzYy0+c3RhdHVzKTsKKwlkYXRhID0gbnRvaGwobHNjLT5zdGF0dXMpOworCW5jbS0+ZGF0YVsyXSA9IGRhdGE7CiAJbmNtLT5kYXRhWzRdID0gbnRvaGwobHNjLT5vZW1fc3RhdHVzKTsKLQlpZiAoISgob2xkX2RhdGEgXiBuY20tPmRhdGFbMl0pICYgMHgxKSB8fAotCSAgICAhbGlzdF9lbXB0eSgmbmMtPmxpbmspKQorCisJY2hhaW5lZCA9ICFsaXN0X2VtcHR5KCZuYy0+bGluayk7CisJc3RhdGUgPSBuYy0+c3RhdGU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmMtPmxvY2ssIGZsYWdzKTsKKworCWlmICghKChvbGRfZGF0YSBeIGRhdGEpICYgMHgxKSB8fCBjaGFpbmVkKQogCQlyZXR1cm4gMDsKLQlpZiAoIShuYy0+c3RhdGUgPT0gTkNTSV9DSEFOTkVMX0lOQUNUSVZFICYmIChuY20tPmRhdGFbMl0gJiAweDEpKSAmJgotCSAgICAhKG5jLT5zdGF0ZSA9PSBOQ1NJX0NIQU5ORUxfQUNUSVZFICYmICEobmNtLT5kYXRhWzJdICYgMHgxKSkpCisJaWYgKCEoc3RhdGUgPT0gTkNTSV9DSEFOTkVMX0lOQUNUSVZFICYmIChkYXRhICYgMHgxKSkgJiYKKwkgICAgIShzdGF0ZSA9PSBOQ1NJX0NIQU5ORUxfQUNUSVZFICYmICEoZGF0YSAmIDB4MSkpKQogCQlyZXR1cm4gMDsKIAogCWlmICghKG5kcC0+ZmxhZ3MgJiBOQ1NJX0RFVl9IV0EpICYmCi0JICAgIG5jLT5zdGF0ZSA9PSBOQ1NJX0NIQU5ORUxfQUNUSVZFKQorCSAgICBzdGF0ZSA9PSBOQ1NJX0NIQU5ORUxfQUNUSVZFKQogCQluZHAtPmZsYWdzIHw9IE5DU0lfREVWX1JFU0hVRkZMRTsKIAogCW5jc2lfc3RvcF9jaGFubmVsX21vbml0b3IobmMpOwpAQCAtOTcsMTMgKzEwNiwyMSBAQAogCWlmICghbmMpCiAJCXJldHVybiAtRU5PREVWOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5jLT5sb2NrLCBmbGFncyk7CiAJaWYgKCFsaXN0X2VtcHR5KCZuYy0+bGluaykgfHwKLQkgICAgbmMtPnN0YXRlICE9IE5DU0lfQ0hBTk5FTF9BQ1RJVkUpCisJICAgIG5jLT5zdGF0ZSAhPSBOQ1NJX0NIQU5ORUxfQUNUSVZFKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5jLT5sb2NrLCBmbGFncyk7CiAJCXJldHVybiAwOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYy0+bG9jaywgZmxhZ3MpOwogCiAJbmNzaV9zdG9wX2NoYW5uZWxfbW9uaXRvcihuYyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm5jLT5sb2NrLCBmbGFncyk7CisJbmMtPnN0YXRlID0gTkNTSV9DSEFOTkVMX0lOVklTSUJMRTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYy0+bG9jaywgZmxhZ3MpOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm5kcC0+bG9jaywgZmxhZ3MpOwotCXhjaGcoJm5jLT5zdGF0ZSwgTkNTSV9DSEFOTkVMX0lOQUNUSVZFKTsKKwluYy0+c3RhdGUgPSBOQ1NJX0NIQU5ORUxfSU5BQ1RJVkU7CiAJbGlzdF9hZGRfdGFpbF9yY3UoJm5jLT5saW5rLCAmbmRwLT5jaGFubmVsX3F1ZXVlKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZHAtPmxvY2ssIGZsYWdzKTsKIApkaWZmIC0tZ2l0IGEvbmV0L25jc2kvbmNzaS1jbWQuYyBiL25ldC9uY3NpL25jc2ktY21kLmMKaW5kZXggMjEwNTdhOC4uZGI3MDgzYiAxMDA2NDQKLS0tIGEvbmV0L25jc2kvbmNzaS1jbWQuYworKysgYi9uZXQvbmNzaS9uY3NpLWNtZC5jCkBAIC0yNzIsNyArMjcyLDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBuY3NpX3JlcXVlc3QgKm5yOwogCi0JbnIgPSBuY3NpX2FsbG9jX3JlcXVlc3QobmRwLCBuY2EtPmRyaXZlbik7CisJbnIgPSBuY3NpX2FsbG9jX3JlcXVlc3QobmRwLCBuY2EtPnJlcV9mbGFncyk7CiAJaWYgKCFucikKIAkJcmV0dXJuIE5VTEw7CiAKZGlmZiAtLWdpdCBhL25ldC9uY3NpL25jc2ktbWFuYWdlLmMgYi9uZXQvbmNzaS9uY3NpLW1hbmFnZS5jCmluZGV4IGVmMDE3YjguLjVlNTA5ZTUgMTAwNjQ0Ci0tLSBhL25ldC9uY3NpL25jc2ktbWFuYWdlLmMKKysrIGIvbmV0L25jc2kvbmNzaS1tYW5hZ2UuYwpAQCAtMTMyLDYgKzEzMiw3IEBACiAJc3RydWN0IG5jc2lfZGV2ICpuZCA9ICZuZHAtPm5kZXY7CiAJc3RydWN0IG5jc2lfcGFja2FnZSAqbnA7CiAJc3RydWN0IG5jc2lfY2hhbm5lbCAqbmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCW5kLT5zdGF0ZSA9IG5jc2lfZGV2X3N0YXRlX2Z1bmN0aW9uYWw7CiAJaWYgKGZvcmNlX2Rvd24pIHsKQEAgLTE0MiwxNCArMTQzLDIxIEBACiAJbmQtPmxpbmtfdXAgPSAwOwogCU5DU0lfRk9SX0VBQ0hfUEFDS0FHRShuZHAsIG5wKSB7CiAJCU5DU0lfRk9SX0VBQ0hfQ0hBTk5FTChucCwgbmMpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZuYy0+bG9jaywgZmxhZ3MpOworCiAJCQlpZiAoIWxpc3RfZW1wdHkoJm5jLT5saW5rKSB8fAotCQkJICAgIG5jLT5zdGF0ZSAhPSBOQ1NJX0NIQU5ORUxfQUNUSVZFKQorCQkJICAgIG5jLT5zdGF0ZSAhPSBOQ1NJX0NIQU5ORUxfQUNUSVZFKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmMtPmxvY2ssIGZsYWdzKTsKIAkJCQljb250aW51ZTsKKwkJCX0KIAogCQkJaWYgKG5jLT5tb2Rlc1tOQ1NJX01PREVfTElOS10uZGF0YVsyXSAmIDB4MSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5jLT5sb2NrLCBmbGFncyk7CiAJCQkJbmQtPmxpbmtfdXAgPSAxOwogCQkJCWdvdG8gcmVwb3J0OwogCQkJfQorCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYy0+bG9jaywgZmxhZ3MpOwogCQl9CiAJfQogCkBAIC0xNjMsNDMgKzE3MSw1NSBAQAogCXN0cnVjdCBuY3NpX3BhY2thZ2UgKm5wID0gbmMtPnBhY2thZ2U7CiAJc3RydWN0IG5jc2lfZGV2X3ByaXYgKm5kcCA9IG5wLT5uZHA7CiAJc3RydWN0IG5jc2lfY21kX2FyZyBuY2E7Ci0JYm9vbCBlbmFibGVkOwotCXVuc2lnbmVkIGludCB0aW1lb3V0OworCWJvb2wgZW5hYmxlZCwgY2hhaW5lZDsKKwl1bnNpZ25lZCBpbnQgbW9uaXRvcl9zdGF0ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQ7CisJaW50IHN0YXRlLCByZXQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbmMtPmxvY2ssIGZsYWdzKTsKLQl0aW1lb3V0ID0gbmMtPnRpbWVvdXQ7Ci0JZW5hYmxlZCA9IG5jLT5lbmFibGVkOworCXN0YXRlID0gbmMtPnN0YXRlOworCWNoYWluZWQgPSAhbGlzdF9lbXB0eSgmbmMtPmxpbmspOworCWVuYWJsZWQgPSBuYy0+bW9uaXRvci5lbmFibGVkOworCW1vbml0b3Jfc3RhdGUgPSBuYy0+bW9uaXRvci5zdGF0ZTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYy0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKCFlbmFibGVkIHx8ICFsaXN0X2VtcHR5KCZuYy0+bGluaykpCisJaWYgKCFlbmFibGVkIHx8IGNoYWluZWQpCiAJCXJldHVybjsKLQlpZiAobmMtPnN0YXRlICE9IE5DU0lfQ0hBTk5FTF9JTkFDVElWRSAmJgotCSAgICBuYy0+c3RhdGUgIT0gTkNTSV9DSEFOTkVMX0FDVElWRSkKKwlpZiAoc3RhdGUgIT0gTkNTSV9DSEFOTkVMX0lOQUNUSVZFICYmCisJICAgIHN0YXRlICE9IE5DU0lfQ0hBTk5FTF9BQ1RJVkUpCiAJCXJldHVybjsKIAotCWlmICghKHRpbWVvdXQgJSAyKSkgeworCXN3aXRjaCAobW9uaXRvcl9zdGF0ZSkgeworCWNhc2UgTkNTSV9DSEFOTkVMX01PTklUT1JfU1RBUlQ6CisJY2FzZSBOQ1NJX0NIQU5ORUxfTU9OSVRPUl9SRVRSWToKIAkJbmNhLm5kcCA9IG5kcDsKIAkJbmNhLnBhY2thZ2UgPSBucC0+aWQ7CiAJCW5jYS5jaGFubmVsID0gbmMtPmlkOwogCQluY2EudHlwZSA9IE5DU0lfUEtUX0NNRF9HTFM7Ci0JCW5jYS5kcml2ZW4gPSBmYWxzZTsKKwkJbmNhLnJlcV9mbGFncyA9IDA7CiAJCXJldCA9IG5jc2lfeG1pdF9jbWQoJm5jYSk7CiAJCWlmIChyZXQpIHsKIAkJCW5ldGRldl9lcnIobmRwLT5uZGV2LmRldiwgIkVycm9yICVkIHNlbmRpbmcgR0xTXG4iLAogCQkJCSAgIHJldCk7CiAJCQlyZXR1cm47CiAJCX0KLQl9CiAKLQlpZiAodGltZW91dCArIDEgPj0gMykgeworCQlicmVhazsKKwljYXNlIE5DU0lfQ0hBTk5FTF9NT05JVE9SX1dBSVQgLi4uIE5DU0lfQ0hBTk5FTF9NT05JVE9SX1dBSVRfTUFYOgorCQlicmVhazsKKwlkZWZhdWx0OgogCQlpZiAoIShuZHAtPmZsYWdzICYgTkNTSV9ERVZfSFdBKSAmJgotCQkgICAgbmMtPnN0YXRlID09IE5DU0lfQ0hBTk5FTF9BQ1RJVkUpCisJCSAgICBzdGF0ZSA9PSBOQ1NJX0NIQU5ORUxfQUNUSVZFKSB7CiAJCQluY3NpX3JlcG9ydF9saW5rKG5kcCwgdHJ1ZSk7CisJCQluZHAtPmZsYWdzIHw9IE5DU0lfREVWX1JFU0hVRkZMRTsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZuYy0+bG9jaywgZmxhZ3MpOworCQluYy0+c3RhdGUgPSBOQ1NJX0NIQU5ORUxfSU5WSVNJQkxFOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYy0+bG9jaywgZmxhZ3MpOwogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZuZHAtPmxvY2ssIGZsYWdzKTsKLQkJeGNoZygmbmMtPnN0YXRlLCBOQ1NJX0NIQU5ORUxfSU5BQ1RJVkUpOworCQluYy0+c3RhdGUgPSBOQ1NJX0NIQU5ORUxfSU5BQ1RJVkU7CiAJCWxpc3RfYWRkX3RhaWxfcmN1KCZuYy0+bGluaywgJm5kcC0+Y2hhbm5lbF9xdWV1ZSk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5kcC0+bG9jaywgZmxhZ3MpOwogCQluY3NpX3Byb2Nlc3NfbmV4dF9jaGFubmVsKG5kcCk7CkBAIC0yMDcsMTAgKzIyNyw5IEBACiAJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm5jLT5sb2NrLCBmbGFncyk7Ci0JbmMtPnRpbWVvdXQgPSB0aW1lb3V0ICsgMTsKLQluYy0+ZW5hYmxlZCA9IHRydWU7CisJbmMtPm1vbml0b3Iuc3RhdGUrKzsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYy0+bG9jaywgZmxhZ3MpOwotCW1vZF90aW1lcigmbmMtPnRpbWVyLCBqaWZmaWVzICsgSFogKiAoMSA8PCAobmMtPnRpbWVvdXQgLyAyKSkpOworCW1vZF90aW1lcigmbmMtPm1vbml0b3IudGltZXIsIGppZmZpZXMgKyBIWik7CiB9CiAKIHZvaWQgbmNzaV9zdGFydF9jaGFubmVsX21vbml0b3Ioc3RydWN0IG5jc2lfY2hhbm5lbCAqbmMpCkBAIC0yMTgsMTIgKzIzNywxMiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbmMtPmxvY2ssIGZsYWdzKTsKLQlXQVJOX09OX09OQ0UobmMtPmVuYWJsZWQpOwotCW5jLT50aW1lb3V0ID0gMDsKLQluYy0+ZW5hYmxlZCA9IHRydWU7CisJV0FSTl9PTl9PTkNFKG5jLT5tb25pdG9yLmVuYWJsZWQpOworCW5jLT5tb25pdG9yLmVuYWJsZWQgPSB0cnVlOworCW5jLT5tb25pdG9yLnN0YXRlID0gTkNTSV9DSEFOTkVMX01PTklUT1JfU1RBUlQ7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmMtPmxvY2ssIGZsYWdzKTsKIAotCW1vZF90aW1lcigmbmMtPnRpbWVyLCBqaWZmaWVzICsgSFogKiAoMSA8PCAobmMtPnRpbWVvdXQgLyAyKSkpOworCW1vZF90aW1lcigmbmMtPm1vbml0b3IudGltZXIsIGppZmZpZXMgKyBIWik7CiB9CiAKIHZvaWQgbmNzaV9zdG9wX2NoYW5uZWxfbW9uaXRvcihzdHJ1Y3QgbmNzaV9jaGFubmVsICpuYykKQEAgLTIzMSwxNCArMjUwLDE0IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZuYy0+bG9jaywgZmxhZ3MpOwotCWlmICghbmMtPmVuYWJsZWQpIHsKKwlpZiAoIW5jLT5tb25pdG9yLmVuYWJsZWQpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmMtPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KLQluYy0+ZW5hYmxlZCA9IGZhbHNlOworCW5jLT5tb25pdG9yLmVuYWJsZWQgPSBmYWxzZTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYy0+bG9jaywgZmxhZ3MpOwogCi0JZGVsX3RpbWVyX3N5bmMoJm5jLT50aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJm5jLT5tb25pdG9yLnRpbWVyKTsKIH0KIAogc3RydWN0IG5jc2lfY2hhbm5lbCAqbmNzaV9maW5kX2NoYW5uZWwoc3RydWN0IG5jc2lfcGFja2FnZSAqbnAsCkBAIC0yNjcsOCArMjg2LDkgQEAKIAluYy0+aWQgPSBpZDsKIAluYy0+cGFja2FnZSA9IG5wOwogCW5jLT5zdGF0ZSA9IE5DU0lfQ0hBTk5FTF9JTkFDVElWRTsKLQluYy0+ZW5hYmxlZCA9IGZhbHNlOwotCXNldHVwX3RpbWVyKCZuYy0+dGltZXIsIG5jc2lfY2hhbm5lbF9tb25pdG9yLCAodW5zaWduZWQgbG9uZyluYyk7CisJbmMtPm1vbml0b3IuZW5hYmxlZCA9IGZhbHNlOworCXNldHVwX3RpbWVyKCZuYy0+bW9uaXRvci50aW1lciwKKwkJICAgIG5jc2lfY2hhbm5lbF9tb25pdG9yLCAodW5zaWduZWQgbG9uZyluYyk7CiAJc3Bpbl9sb2NrX2luaXQoJm5jLT5sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmbmMtPmxpbmspOwogCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5DU0lfQ0FQX01BWDsgaW5kZXgrKykKQEAgLTQwNSw3ICs0MjUsOCBAQAogICogYmUgc2FtZS4gT3RoZXJ3aXNlLCB0aGUgYm9ndXMgcmVzcG9uc2UgbWlnaHQgYmUgcmVwbGllZC4gU28KICAqIHRoZSBhdmFpbGFibGUgSURzIGFyZSBhbGxvY2F0ZWQgaW4gcm91bmQtcm9iaW4gZmFzaGlvbi4KICAqLwotc3RydWN0IG5jc2lfcmVxdWVzdCAqbmNzaV9hbGxvY19yZXF1ZXN0KHN0cnVjdCBuY3NpX2Rldl9wcml2ICpuZHAsIGJvb2wgZHJpdmVuKQorc3RydWN0IG5jc2lfcmVxdWVzdCAqbmNzaV9hbGxvY19yZXF1ZXN0KHN0cnVjdCBuY3NpX2Rldl9wcml2ICpuZHAsCisJCQkJCXVuc2lnbmVkIGludCByZXFfZmxhZ3MpCiB7CiAJc3RydWN0IG5jc2lfcmVxdWVzdCAqbnIgPSBOVUxMOwogCWludCBpLCBsaW1pdCA9IEFSUkFZX1NJWkUobmRwLT5yZXF1ZXN0cyk7CkBAIC00MTMsMzAgKzQzNCwzMSBAQAogCiAJLyogQ2hlY2sgaWYgdGhlcmUgaXMgb25lIGF2YWlsYWJsZSByZXF1ZXN0IHVudGlsIHRoZSBjZWlsaW5nICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm5kcC0+bG9jaywgZmxhZ3MpOwotCWZvciAoaSA9IG5kcC0+cmVxdWVzdF9pZDsgIW5yICYmIGkgPCBsaW1pdDsgaSsrKSB7CisJZm9yIChpID0gbmRwLT5yZXF1ZXN0X2lkOyBpIDwgbGltaXQ7IGkrKykgewogCQlpZiAobmRwLT5yZXF1ZXN0c1tpXS51c2VkKQogCQkJY29udGludWU7CiAKIAkJbnIgPSAmbmRwLT5yZXF1ZXN0c1tpXTsKIAkJbnItPnVzZWQgPSB0cnVlOwotCQluci0+ZHJpdmVuID0gZHJpdmVuOwotCQlpZiAoKytuZHAtPnJlcXVlc3RfaWQgPj0gbGltaXQpCi0JCQluZHAtPnJlcXVlc3RfaWQgPSAwOworCQluci0+ZmxhZ3MgPSByZXFfZmxhZ3M7CisJCW5kcC0+cmVxdWVzdF9pZCA9IGkgKyAxOworCQlnb3RvIGZvdW5kOwogCX0KIAogCS8qIEZhaWwgYmFjayB0byBjaGVjayBmcm9tIHRoZSBzdGFydGluZyBjdXJzb3IgKi8KLQlmb3IgKGkgPSAwOyAhbnIgJiYgaSA8IG5kcC0+cmVxdWVzdF9pZDsgaSsrKSB7CisJZm9yIChpID0gTkNTSV9SRVFfU1RBUlRfSURYOyBpIDwgbmRwLT5yZXF1ZXN0X2lkOyBpKyspIHsKIAkJaWYgKG5kcC0+cmVxdWVzdHNbaV0udXNlZCkKIAkJCWNvbnRpbnVlOwogCiAJCW5yID0gJm5kcC0+cmVxdWVzdHNbaV07CiAJCW5yLT51c2VkID0gdHJ1ZTsKLQkJbnItPmRyaXZlbiA9IGRyaXZlbjsKLQkJaWYgKCsrbmRwLT5yZXF1ZXN0X2lkID49IGxpbWl0KQotCQkJbmRwLT5yZXF1ZXN0X2lkID0gMDsKKwkJbnItPmZsYWdzID0gcmVxX2ZsYWdzOworCQluZHAtPnJlcXVlc3RfaWQgPSBpICsgMTsKKwkJZ290byBmb3VuZDsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmRwLT5sb2NrLCBmbGFncyk7CiAKK2ZvdW5kOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5kcC0+bG9jaywgZmxhZ3MpOwogCXJldHVybiBucjsKIH0KIApAQCAtNDU4LDcgKzQ4MCw3IEBACiAJbnItPmNtZCA9IE5VTEw7CiAJbnItPnJzcCA9IE5VTEw7CiAJbnItPnVzZWQgPSBmYWxzZTsKLQlkcml2ZW4gPSBuci0+ZHJpdmVuOworCWRyaXZlbiA9ICEhKG5yLT5mbGFncyAmIE5DU0lfUkVRX0ZMQUdfRVZFTlRfRFJJVkVOKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZHAtPmxvY2ssIGZsYWdzKTsKIAogCWlmIChkcml2ZW4gJiYgY21kICYmIC0tbmRwLT5wZW5kaW5nX3JlcV9udW0gPT0gMCkKQEAgLTUwOCwxMCArNTMwLDExIEBACiAJc3RydWN0IG5jc2lfcGFja2FnZSAqbnAgPSBuZHAtPmFjdGl2ZV9wYWNrYWdlOwogCXN0cnVjdCBuY3NpX2NoYW5uZWwgKm5jID0gbmRwLT5hY3RpdmVfY2hhbm5lbDsKIAlzdHJ1Y3QgbmNzaV9jbWRfYXJnIG5jYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQ7CiAKIAluY2EubmRwID0gbmRwOwotCW5jYS5kcml2ZW4gPSB0cnVlOworCW5jYS5yZXFfZmxhZ3MgPSBOQ1NJX1JFUV9GTEFHX0VWRU5UX0RSSVZFTjsKIAlzd2l0Y2ggKG5kLT5zdGF0ZSkgewogCWNhc2UgbmNzaV9kZXZfc3RhdGVfc3VzcGVuZDoKIAkJbmQtPnN0YXRlID0gbmNzaV9kZXZfc3RhdGVfc3VzcGVuZF9zZWxlY3Q7CkBAIC01MjcsNyArNTUwLDcgQEAKIAkJbmNhLnBhY2thZ2UgPSBucC0+aWQ7CiAJCWlmIChuZC0+c3RhdGUgPT0gbmNzaV9kZXZfc3RhdGVfc3VzcGVuZF9zZWxlY3QpIHsKIAkJCW5jYS50eXBlID0gTkNTSV9QS1RfQ01EX1NQOwotCQkJbmNhLmNoYW5uZWwgPSAweDFmOworCQkJbmNhLmNoYW5uZWwgPSBOQ1NJX1JFU0VSVkVEX0NIQU5ORUw7CiAJCQlpZiAobmRwLT5mbGFncyAmIE5DU0lfREVWX0hXQSkKIAkJCQluY2EuYnl0ZXNbMF0gPSAwOwogCQkJZWxzZQpAQCAtNTQ0LDcgKzU2Nyw3IEBACiAJCQluZC0+c3RhdGUgPSBuY3NpX2Rldl9zdGF0ZV9zdXNwZW5kX2Rlc2VsZWN0OwogCQl9IGVsc2UgaWYgKG5kLT5zdGF0ZSA9PSBuY3NpX2Rldl9zdGF0ZV9zdXNwZW5kX2Rlc2VsZWN0KSB7CiAJCQluY2EudHlwZSA9IE5DU0lfUEtUX0NNRF9EUDsKLQkJCW5jYS5jaGFubmVsID0gMHgxZjsKKwkJCW5jYS5jaGFubmVsID0gTkNTSV9SRVNFUlZFRF9DSEFOTkVMOwogCQkJbmQtPnN0YXRlID0gbmNzaV9kZXZfc3RhdGVfc3VzcGVuZF9kb25lOwogCQl9CiAKQEAgLTU1Niw3ICs1NzksOSBAQAogCiAJCWJyZWFrOwogCWNhc2UgbmNzaV9kZXZfc3RhdGVfc3VzcGVuZF9kb25lOgotCQl4Y2hnKCZuYy0+c3RhdGUsIE5DU0lfQ0hBTk5FTF9JTkFDVElWRSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZuYy0+bG9jaywgZmxhZ3MpOworCQluYy0+c3RhdGUgPSBOQ1NJX0NIQU5ORUxfSU5BQ1RJVkU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5jLT5sb2NrLCBmbGFncyk7CiAJCW5jc2lfcHJvY2Vzc19uZXh0X2NoYW5uZWwobmRwKTsKIAogCQlicmVhazsKQEAgLTU3NCwxMCArNTk5LDExIEBACiAJc3RydWN0IG5jc2lfY2hhbm5lbCAqbmMgPSBuZHAtPmFjdGl2ZV9jaGFubmVsOwogCXN0cnVjdCBuY3NpX2NtZF9hcmcgbmNhOwogCXVuc2lnbmVkIGNoYXIgaW5kZXg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OwogCiAJbmNhLm5kcCA9IG5kcDsKLQluY2EuZHJpdmVuID0gdHJ1ZTsKKwluY2EucmVxX2ZsYWdzID0gTkNTSV9SRVFfRkxBR19FVkVOVF9EUklWRU47CiAJc3dpdGNoIChuZC0+c3RhdGUpIHsKIAljYXNlIG5jc2lfZGV2X3N0YXRlX2NvbmZpZzoKIAljYXNlIG5jc2lfZGV2X3N0YXRlX2NvbmZpZ19zcDoKQEAgLTU5MCw3ICs2MTYsNyBAQAogCQllbHNlCiAJCQluY2EuYnl0ZXNbMF0gPSAxOwogCQluY2EucGFja2FnZSA9IG5wLT5pZDsKLQkJbmNhLmNoYW5uZWwgPSAweDFmOworCQluY2EuY2hhbm5lbCA9IE5DU0lfUkVTRVJWRURfQ0hBTk5FTDsKIAkJcmV0ID0gbmNzaV94bWl0X2NtZCgmbmNhKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gZXJyb3I7CkBAIC02NzUsMTAgKzcwMSwxMiBAQAogCQkJZ290byBlcnJvcjsKIAkJYnJlYWs7CiAJY2FzZSBuY3NpX2Rldl9zdGF0ZV9jb25maWdfZG9uZToKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm5jLT5sb2NrLCBmbGFncyk7CiAJCWlmIChuYy0+bW9kZXNbTkNTSV9NT0RFX0xJTktdLmRhdGFbMl0gJiAweDEpCi0JCQl4Y2hnKCZuYy0+c3RhdGUsIE5DU0lfQ0hBTk5FTF9BQ1RJVkUpOworCQkJbmMtPnN0YXRlID0gTkNTSV9DSEFOTkVMX0FDVElWRTsKIAkJZWxzZQotCQkJeGNoZygmbmMtPnN0YXRlLCBOQ1NJX0NIQU5ORUxfSU5BQ1RJVkUpOworCQkJbmMtPnN0YXRlID0gTkNTSV9DSEFOTkVMX0lOQUNUSVZFOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYy0+bG9jaywgZmxhZ3MpOwogCiAJCW5jc2lfc3RhcnRfY2hhbm5lbF9tb25pdG9yKG5jKTsKIAkJbmNzaV9wcm9jZXNzX25leHRfY2hhbm5lbChuZHApOwpAQCAtNzA3LDE4ICs3MzUsMjUgQEAKIAlmb3VuZCA9IE5VTEw7CiAJTkNTSV9GT1JfRUFDSF9QQUNLQUdFKG5kcCwgbnApIHsKIAkJTkNTSV9GT1JfRUFDSF9DSEFOTkVMKG5wLCBuYykgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJm5jLT5sb2NrLCBmbGFncyk7CisKIAkJCWlmICghbGlzdF9lbXB0eSgmbmMtPmxpbmspIHx8Ci0JCQkgICAgbmMtPnN0YXRlICE9IE5DU0lfQ0hBTk5FTF9JTkFDVElWRSkKKwkJCSAgICBuYy0+c3RhdGUgIT0gTkNTSV9DSEFOTkVMX0lOQUNUSVZFKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmMtPmxvY2ssIGZsYWdzKTsKIAkJCQljb250aW51ZTsKKwkJCX0KIAogCQkJaWYgKCFmb3VuZCkKIAkJCQlmb3VuZCA9IG5jOwogCiAJCQluY20gPSAmbmMtPm1vZGVzW05DU0lfTU9ERV9MSU5LXTsKIAkJCWlmIChuY20tPmRhdGFbMl0gJiAweDEpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYy0+bG9jaywgZmxhZ3MpOwogCQkJCWZvdW5kID0gbmM7CiAJCQkJZ290byBvdXQ7CiAJCQl9CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5jLT5sb2NrLCBmbGFncyk7CiAJCX0KIAl9CiAKQEAgLTc5Nyw3ICs4MzIsNyBAQAogCWludCByZXQ7CiAKIAluY2EubmRwID0gbmRwOwotCW5jYS5kcml2ZW4gPSB0cnVlOworCW5jYS5yZXFfZmxhZ3MgPSBOQ1NJX1JFUV9GTEFHX0VWRU5UX0RSSVZFTjsKIAlzd2l0Y2ggKG5kLT5zdGF0ZSkgewogCWNhc2UgbmNzaV9kZXZfc3RhdGVfcHJvYmU6CiAJCW5kLT5zdGF0ZSA9IG5jc2lfZGV2X3N0YXRlX3Byb2JlX2Rlc2VsZWN0OwpAQCAtODA3LDcgKzg0Miw3IEBACiAKIAkJLyogRGVzZWxlY3QgYWxsIHBvc3NpYmxlIHBhY2thZ2VzICovCiAJCW5jYS50eXBlID0gTkNTSV9QS1RfQ01EX0RQOwotCQluY2EuY2hhbm5lbCA9IDB4MWY7CisJCW5jYS5jaGFubmVsID0gTkNTSV9SRVNFUlZFRF9DSEFOTkVMOwogCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA4OyBpbmRleCsrKSB7CiAJCQluY2EucGFja2FnZSA9IGluZGV4OwogCQkJcmV0ID0gbmNzaV94bWl0X2NtZCgmbmNhKTsKQEAgLTgyMyw3ICs4NTgsNyBAQAogCQkvKiBTZWxlY3QgYWxsIHBvc3NpYmxlIHBhY2thZ2VzICovCiAJCW5jYS50eXBlID0gTkNTSV9QS1RfQ01EX1NQOwogCQluY2EuYnl0ZXNbMF0gPSAxOwotCQluY2EuY2hhbm5lbCA9IDB4MWY7CisJCW5jYS5jaGFubmVsID0gTkNTSV9SRVNFUlZFRF9DSEFOTkVMOwogCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA4OyBpbmRleCsrKSB7CiAJCQluY2EucGFja2FnZSA9IGluZGV4OwogCQkJcmV0ID0gbmNzaV94bWl0X2NtZCgmbmNhKTsKQEAgLTg3Niw3ICs5MTEsNyBAQAogCQluY2EudHlwZSA9IE5DU0lfUEtUX0NNRF9TUDsKIAkJbmNhLmJ5dGVzWzBdID0gMTsKIAkJbmNhLnBhY2thZ2UgPSBuZHAtPmFjdGl2ZV9wYWNrYWdlLT5pZDsKLQkJbmNhLmNoYW5uZWwgPSAweDFmOworCQluY2EuY2hhbm5lbCA9IE5DU0lfUkVTRVJWRURfQ0hBTk5FTDsKIAkJcmV0ID0gbmNzaV94bWl0X2NtZCgmbmNhKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gZXJyb3I7CkBAIC04ODQsMTIgKzkxOSwxMiBAQAogCQluZC0+c3RhdGUgPSBuY3NpX2Rldl9zdGF0ZV9wcm9iZV9jaXM7CiAJCWJyZWFrOwogCWNhc2UgbmNzaV9kZXZfc3RhdGVfcHJvYmVfY2lzOgotCQluZHAtPnBlbmRpbmdfcmVxX251bSA9IDMyOworCQluZHAtPnBlbmRpbmdfcmVxX251bSA9IE5DU0lfUkVTRVJWRURfQ0hBTk5FTDsKIAogCQkvKiBDbGVhciBpbml0aWFsIHN0YXRlICovCiAJCW5jYS50eXBlID0gTkNTSV9QS1RfQ01EX0NJUzsKIAkJbmNhLnBhY2thZ2UgPSBuZHAtPmFjdGl2ZV9wYWNrYWdlLT5pZDsKLQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgMHgyMDsgaW5kZXgrKykgeworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOQ1NJX1JFU0VSVkVEX0NIQU5ORUw7IGluZGV4KyspIHsKIAkJCW5jYS5jaGFubmVsID0gaW5kZXg7CiAJCQlyZXQgPSBuY3NpX3htaXRfY21kKCZuY2EpOwogCQkJaWYgKHJldCkKQEAgLTkzMyw3ICs5NjgsNyBAQAogCQkvKiBEZXNlbGVjdCB0aGUgYWN0aXZlIHBhY2thZ2UgKi8KIAkJbmNhLnR5cGUgPSBOQ1NJX1BLVF9DTURfRFA7CiAJCW5jYS5wYWNrYWdlID0gbmRwLT5hY3RpdmVfcGFja2FnZS0+aWQ7Ci0JCW5jYS5jaGFubmVsID0gMHgxZjsKKwkJbmNhLmNoYW5uZWwgPSBOQ1NJX1JFU0VSVkVEX0NIQU5ORUw7CiAJCXJldCA9IG5jc2lfeG1pdF9jbWQoJm5jYSk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGVycm9yOwpAQCAtOTg3LDExICsxMDIyLDE0IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCW9sZF9zdGF0ZSA9IHhjaGcoJm5jLT5zdGF0ZSwgTkNTSV9DSEFOTkVMX0lOVklTSUJMRSk7CiAJbGlzdF9kZWxfaW5pdCgmbmMtPmxpbmspOwotCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmRwLT5sb2NrLCBmbGFncyk7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbmMtPmxvY2ssIGZsYWdzKTsKKwlvbGRfc3RhdGUgPSBuYy0+c3RhdGU7CisJbmMtPnN0YXRlID0gTkNTSV9DSEFOTkVMX0lOVklTSUJMRTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYy0+bG9jaywgZmxhZ3MpOworCiAJbmRwLT5hY3RpdmVfY2hhbm5lbCA9IG5jOwogCW5kcC0+YWN0aXZlX3BhY2thZ2UgPSBuYy0+cGFja2FnZTsKIApAQCAtMTAwNiw3ICsxMDQ0LDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJbmV0ZGV2X2VycihuZHAtPm5kZXYuZGV2LCAiSW52YWxpZCBzdGF0ZSAweCV4IG9uICVkOiVkXG4iLAotCQkJICAgbmMtPnN0YXRlLCBuYy0+cGFja2FnZS0+aWQsIG5jLT5pZCk7CisJCQkgICBvbGRfc3RhdGUsIG5jLT5wYWNrYWdlLT5pZCwgbmMtPmlkKTsKIAkJbmNzaV9yZXBvcnRfbGluayhuZHAsIGZhbHNlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTA3MCw3ICsxMTA4LDcgQEAKIAkJcmV0dXJuIE5PVElGWV9PSzsKIAogCW5jYS5uZHAgPSBuZHA7Ci0JbmNhLmRyaXZlbiA9IGZhbHNlOworCW5jYS5yZXFfZmxhZ3MgPSAwOwogCW5jYS5wYWNrYWdlID0gbnAtPmlkOwogCW5jYS5jaGFubmVsID0gbmMtPmlkOwogCW5jYS5kd29yZHNbMF0gPSBuYy0+Y2Fwc1tOQ1NJX0NBUF9NQ10uY2FwOwpAQCAtMTExOCw3ICsxMTU2LDcgQEAKIAkvKiBJbml0aWFsaXplIHByaXZhdGUgTkNTSSBkZXZpY2UgKi8KIAlzcGluX2xvY2tfaW5pdCgmbmRwLT5sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmbmRwLT5wYWNrYWdlcyk7Ci0JbmRwLT5yZXF1ZXN0X2lkID0gMDsKKwluZHAtPnJlcXVlc3RfaWQgPSBOQ1NJX1JFUV9TVEFSVF9JRFg7CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobmRwLT5yZXF1ZXN0cyk7IGkrKykgewogCQluZHAtPnJlcXVlc3RzW2ldLmlkID0gaTsKIAkJbmRwLT5yZXF1ZXN0c1tpXS5uZHAgPSBuZHA7CkBAIC0xMTQ5LDkgKzExODcsNyBAQAogaW50IG5jc2lfc3RhcnRfZGV2KHN0cnVjdCBuY3NpX2RldiAqbmQpCiB7CiAJc3RydWN0IG5jc2lfZGV2X3ByaXYgKm5kcCA9IFRPX05DU0lfREVWX1BSSVYobmQpOwotCXN0cnVjdCBuY3NpX3BhY2thZ2UgKm5wOwotCXN0cnVjdCBuY3NpX2NoYW5uZWwgKm5jOwotCWludCBvbGRfc3RhdGUsIHJldDsKKwlpbnQgcmV0OwogCiAJaWYgKG5kLT5zdGF0ZSAhPSBuY3NpX2Rldl9zdGF0ZV9yZWdpc3RlcmVkICYmCiAJICAgIG5kLT5zdGF0ZSAhPSBuY3NpX2Rldl9zdGF0ZV9mdW5jdGlvbmFsKQpAQCAtMTE2MywxNSArMTE5OSw2IEBACiAJCXJldHVybiAwOwogCX0KIAotCS8qIFJlc2V0IGNoYW5uZWwncyBzdGF0ZSBhbmQgc3RhcnQgb3ZlciAqLwotCU5DU0lfRk9SX0VBQ0hfUEFDS0FHRShuZHAsIG5wKSB7Ci0JCU5DU0lfRk9SX0VBQ0hfQ0hBTk5FTChucCwgbmMpIHsKLQkJCW9sZF9zdGF0ZSA9IHhjaGcoJm5jLT5zdGF0ZSwgTkNTSV9DSEFOTkVMX0lOQUNUSVZFKTsKLQkJCVdBUk5fT05fT05DRSghbGlzdF9lbXB0eSgmbmMtPmxpbmspIHx8Ci0JCQkJICAgICBvbGRfc3RhdGUgPT0gTkNTSV9DSEFOTkVMX0lOVklTSUJMRSk7Ci0JCX0KLQl9Ci0KIAlpZiAobmRwLT5mbGFncyAmIE5DU0lfREVWX0hXQSkKIAkJcmV0ID0gbmNzaV9lbmFibGVfaHdhKG5kcCk7CiAJZWxzZQpAQCAtMTE4MSw2ICsxMjA4LDM1IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChuY3NpX3N0YXJ0X2Rldik7CiAKK3ZvaWQgbmNzaV9zdG9wX2RldihzdHJ1Y3QgbmNzaV9kZXYgKm5kKQoreworCXN0cnVjdCBuY3NpX2Rldl9wcml2ICpuZHAgPSBUT19OQ1NJX0RFVl9QUklWKG5kKTsKKwlzdHJ1Y3QgbmNzaV9wYWNrYWdlICpucDsKKwlzdHJ1Y3QgbmNzaV9jaGFubmVsICpuYzsKKwlib29sIGNoYWluZWQ7CisJaW50IG9sZF9zdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogU3RvcCB0aGUgY2hhbm5lbCBtb25pdG9yIGFuZCByZXNldCBjaGFubmVsJ3Mgc3RhdGUgKi8KKwlOQ1NJX0ZPUl9FQUNIX1BBQ0tBR0UobmRwLCBucCkgeworCQlOQ1NJX0ZPUl9FQUNIX0NIQU5ORUwobnAsIG5jKSB7CisJCQluY3NpX3N0b3BfY2hhbm5lbF9tb25pdG9yKG5jKTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJm5jLT5sb2NrLCBmbGFncyk7CisJCQljaGFpbmVkID0gIWxpc3RfZW1wdHkoJm5jLT5saW5rKTsKKwkJCW9sZF9zdGF0ZSA9IG5jLT5zdGF0ZTsKKwkJCW5jLT5zdGF0ZSA9IE5DU0lfQ0hBTk5FTF9JTkFDVElWRTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5jLT5sb2NrLCBmbGFncyk7CisKKwkJCVdBUk5fT05fT05DRShjaGFpbmVkIHx8CisJCQkJICAgICBvbGRfc3RhdGUgPT0gTkNTSV9DSEFOTkVMX0lOVklTSUJMRSk7CisJCX0KKwl9CisKKwluY3NpX3JlcG9ydF9saW5rKG5kcCwgdHJ1ZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuY3NpX3N0b3BfZGV2KTsKKwogdm9pZCBuY3NpX3VucmVnaXN0ZXJfZGV2KHN0cnVjdCBuY3NpX2RldiAqbmQpCiB7CiAJc3RydWN0IG5jc2lfZGV2X3ByaXYgKm5kcCA9IFRPX05DU0lfREVWX1BSSVYobmQpOwpkaWZmIC0tZ2l0IGEvbmV0L25jc2kvbmNzaS1yc3AuYyBiL25ldC9uY3NpL25jc2ktcnNwLmMKaW5kZXggYWY4NDM4OS4uMDg3ZGI3NyAxMDA2NDQKLS0tIGEvbmV0L25jc2kvbmNzaS1yc3AuYworKysgYi9uZXQvbmNzaS9uY3NpLXJzcC5jCkBAIC0zMTcsMTIgKzMxNywxMiBAQAogCW5jbS0+ZGF0YVszXSA9IG50b2hsKHJzcC0+b3RoZXIpOwogCW5jbS0+ZGF0YVs0XSA9IG50b2hsKHJzcC0+b2VtX3N0YXR1cyk7CiAKLQlpZiAobnItPmRyaXZlbikKKwlpZiAobnItPmZsYWdzICYgTkNTSV9SRVFfRkxBR19FVkVOVF9EUklWRU4pCiAJCXJldHVybiAwOwogCiAJLyogUmVzZXQgdGhlIGNoYW5uZWwgbW9uaXRvciBpZiBpdCBoYXMgYmVlbiBlbmFibGVkICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm5jLT5sb2NrLCBmbGFncyk7Ci0JbmMtPnRpbWVvdXQgPSAwOworCW5jLT5tb25pdG9yLnN0YXRlID0gTkNTSV9DSEFOTkVMX01PTklUT1JfU1RBUlQ7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmMtPmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9LY29uZmlnIGIvbmV0L25ldGZpbHRlci9LY29uZmlnCmluZGV4IDkyNjZjZWUuLmU4ZDU2ZDkgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvS2NvbmZpZworKysgYi9uZXQvbmV0ZmlsdGVyL0tjb25maWcKQEAgLTQ3NCw2ICs0NzQsMTIgQEAKIAkgIFRoaXMgb3B0aW9uIGFkZHMgdGhlICJtZXRhIiBleHByZXNzaW9uIHRoYXQgeW91IGNhbiB1c2UgdG8gbWF0Y2ggYW5kCiAJICB0byBzZXQgcGFja2V0IG1ldGFpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBwYWNrZXQgbWFyay4KIAorY29uZmlnIE5GVF9OVU1HRU4KKwl0cmlzdGF0ZSAiTmV0ZmlsdGVyIG5mX3RhYmxlcyBudW1iZXIgZ2VuZXJhdG9yIG1vZHVsZSIKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIHRoZSBudW1iZXIgZ2VuZXJhdG9yIGV4cHJlc3Npb24gdXNlZCB0byBwZXJmb3JtCisJICBpbmNyZW1lbnRhbCBjb3VudGluZyBhbmQgcmFuZG9tIG51bWJlcnMgYm91bmQgdG8gYSB1cHBlciBsaW1pdC4KKwogY29uZmlnIE5GVF9DVAogCWRlcGVuZHMgb24gTkZfQ09OTlRSQUNLCiAJdHJpc3RhdGUgIk5ldGZpbHRlciBuZl90YWJsZXMgY29ubnRyYWNrIG1vZHVsZSIKQEAgLTQ4MSwxMyArNDg3LDEzIEBACiAJICBUaGlzIG9wdGlvbiBhZGRzIHRoZSAibWV0YSIgZXhwcmVzc2lvbiB0aGF0IHlvdSBjYW4gdXNlIHRvIG1hdGNoCiAJICBjb25uZWN0aW9uIHRyYWNraW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIGZsb3cgc3RhdGUuCiAKLWNvbmZpZyBORlRfUkJUUkVFCitjb25maWcgTkZUX1NFVF9SQlRSRUUKIAl0cmlzdGF0ZSAiTmV0ZmlsdGVyIG5mX3RhYmxlcyByYnRyZWUgc2V0IG1vZHVsZSIKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBhZGRzIHRoZSAicmJ0cmVlIiBzZXQgdHlwZSAoUmVkIEJsYWNrIHRyZWUpIHRoYXQgaXMgdXNlZAogCSAgdG8gYnVpbGQgaW50ZXJ2YWwtYmFzZWQgc2V0cy4KIAotY29uZmlnIE5GVF9IQVNICitjb25maWcgTkZUX1NFVF9IQVNICiAJdHJpc3RhdGUgIk5ldGZpbHRlciBuZl90YWJsZXMgaGFzaCBzZXQgbW9kdWxlIgogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGFkZHMgdGhlICJoYXNoIiBzZXQgdHlwZSB0aGF0IGlzIHVzZWQgdG8gYnVpbGQgb25lLXdheQpAQCAtNTQyLDYgKzU0OCwxMiBAQAogCSAgVGhpcyBpcyByZXF1aXJlZCBpZiB5b3UgaW50ZW5kIHRvIHVzZSB0aGUgdXNlcnNwYWNlIHF1ZXVlaW5nCiAJICBpbmZyYXN0cnVjdHVyZSAoYWxzbyBrbm93biBhcyBORlFVRVVFKSBmcm9tIG5mdGFibGVzLgogCitjb25maWcgTkZUX1FVT1RBCisJdHJpc3RhdGUgIk5ldGZpbHRlciBuZl90YWJsZXMgcXVvdGEgbW9kdWxlIgorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgdGhlICJxdW90YSIgZXhwcmVzc2lvbiB0aGF0IHlvdSBjYW4gdXNlIHRvIG1hdGNoCisJICBlbmZvcmNlIGJ5dGVzIHF1b3Rhcy4KKwogY29uZmlnIE5GVF9SRUpFQ1QKIAlkZWZhdWx0IG0gaWYgTkVURklMVEVSX0FEVkFOQ0VEPW4KIAl0cmlzdGF0ZSAiTmV0ZmlsdGVyIG5mX3RhYmxlcyByZWplY3Qgc3VwcG9ydCIKQEAgLTU2Myw2ICs1NzUsMTIgQEAKIAkgIHhfdGFibGVzIG1hdGNoL3RhcmdldCBleHRlbnNpb25zIG92ZXIgdGhlIG5mX3RhYmxlcwogCSAgZnJhbWV3b3JrLgogCitjb25maWcgTkZUX0hBU0gKKwl0cmlzdGF0ZSAiTmV0ZmlsdGVyIG5mX3RhYmxlcyBoYXNoIG1vZHVsZSIKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIHRoZSAiaGFzaCIgZXhwcmVzc2lvbiB0aGF0IHlvdSBjYW4gdXNlIHRvIHBlcmZvcm0KKwkgIGEgaGFzaCBvcGVyYXRpb24gb24gcmVnaXN0ZXJzLgorCiBpZiBORl9UQUJMRVNfTkVUREVWCiAKIGNvbmZpZyBORl9EVVBfTkVUREVWCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL01ha2VmaWxlIGIvbmV0L25ldGZpbHRlci9NYWtlZmlsZQppbmRleCA2OTEzNDU0Li5jMjNjM2M4IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL01ha2VmaWxlCisrKyBiL25ldC9uZXRmaWx0ZXIvTWFrZWZpbGUKQEAgLTcxLDggKzcxLDkgQEAKIAogIyBuZl90YWJsZXMKIG5mX3RhYmxlcy1vYmpzICs9IG5mX3RhYmxlc19jb3JlLm8gbmZfdGFibGVzX2FwaS5vIG5mX3RhYmxlc190cmFjZS5vCi1uZl90YWJsZXMtb2JqcyArPSBuZnRfaW1tZWRpYXRlLm8gbmZ0X2NtcC5vIG5mdF9sb29rdXAubyBuZnRfZHluc2V0Lm8KK25mX3RhYmxlcy1vYmpzICs9IG5mdF9pbW1lZGlhdGUubyBuZnRfY21wLm8gbmZ0X3JhbmdlLm8KIG5mX3RhYmxlcy1vYmpzICs9IG5mdF9iaXR3aXNlLm8gbmZ0X2J5dGVvcmRlci5vIG5mdF9wYXlsb2FkLm8KK25mX3RhYmxlcy1vYmpzICs9IG5mdF9sb29rdXAubyBuZnRfZHluc2V0Lm8KIAogb2JqLSQoQ09ORklHX05GX1RBQkxFUykJCSs9IG5mX3RhYmxlcy5vCiBvYmotJChDT05GSUdfTkZfVEFCTEVTX0lORVQpCSs9IG5mX3RhYmxlc19pbmV0Lm8KQEAgLTgwLDE4ICs4MSwyMSBAQAogb2JqLSQoQ09ORklHX05GVF9DT01QQVQpCSs9IG5mdF9jb21wYXQubwogb2JqLSQoQ09ORklHX05GVF9FWFRIRFIpCSs9IG5mdF9leHRoZHIubwogb2JqLSQoQ09ORklHX05GVF9NRVRBKQkJKz0gbmZ0X21ldGEubworb2JqLSQoQ09ORklHX05GVF9OVU1HRU4pCSs9IG5mdF9udW1nZW4ubwogb2JqLSQoQ09ORklHX05GVF9DVCkJCSs9IG5mdF9jdC5vCiBvYmotJChDT05GSUdfTkZUX0xJTUlUKQkJKz0gbmZ0X2xpbWl0Lm8KIG9iai0kKENPTkZJR19ORlRfTkFUKQkJKz0gbmZ0X25hdC5vCiBvYmotJChDT05GSUdfTkZUX1FVRVVFKQkJKz0gbmZ0X3F1ZXVlLm8KK29iai0kKENPTkZJR19ORlRfUVVPVEEpCQkrPSBuZnRfcXVvdGEubwogb2JqLSQoQ09ORklHX05GVF9SRUpFQ1QpIAkrPSBuZnRfcmVqZWN0Lm8KIG9iai0kKENPTkZJR19ORlRfUkVKRUNUX0lORVQpCSs9IG5mdF9yZWplY3RfaW5ldC5vCi1vYmotJChDT05GSUdfTkZUX1JCVFJFRSkJKz0gbmZ0X3JidHJlZS5vCi1vYmotJChDT05GSUdfTkZUX0hBU0gpCQkrPSBuZnRfaGFzaC5vCitvYmotJChDT05GSUdfTkZUX1NFVF9SQlRSRUUpCSs9IG5mdF9zZXRfcmJ0cmVlLm8KK29iai0kKENPTkZJR19ORlRfU0VUX0hBU0gpCSs9IG5mdF9zZXRfaGFzaC5vCiBvYmotJChDT05GSUdfTkZUX0NPVU5URVIpCSs9IG5mdF9jb3VudGVyLm8KIG9iai0kKENPTkZJR19ORlRfTE9HKQkJKz0gbmZ0X2xvZy5vCiBvYmotJChDT05GSUdfTkZUX01BU1EpCQkrPSBuZnRfbWFzcS5vCiBvYmotJChDT05GSUdfTkZUX1JFRElSKQkJKz0gbmZ0X3JlZGlyLm8KK29iai0kKENPTkZJR19ORlRfSEFTSCkJCSs9IG5mdF9oYXNoLm8KIAogIyBuZl90YWJsZXMgbmV0ZGV2CiBvYmotJChDT05GSUdfTkZUX0RVUF9ORVRERVYpCSs9IG5mdF9kdXBfbmV0ZGV2Lm8KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvY29yZS5jIGIvbmV0L25ldGZpbHRlci9jb3JlLmMKaW5kZXggZjM5Mjc2ZC4uYzlkOTBlYiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9jb3JlLmMKKysrIGIvbmV0L25ldGZpbHRlci9jb3JlLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAKQEAgLTYxLDMzICs2Miw2MiBAQAogI2VuZGlmCiAKIHN0YXRpYyBERUZJTkVfTVVURVgobmZfaG9va19tdXRleCk7CisjZGVmaW5lIG5mX2VudHJ5X2RlcmVmZXJlbmNlKGUpIFwKKwlyY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKGUsIGxvY2tkZXBfaXNfaGVsZCgmbmZfaG9va19tdXRleCkpCiAKLXN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICpuZl9maW5kX2hvb2tfbGlzdChzdHJ1Y3QgbmV0ICpuZXQsCi0JCQkJCSAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqcmVnKQorc3RhdGljIHN0cnVjdCBuZl9ob29rX2VudHJ5ICpuZl9ob29rX2VudHJ5X2hlYWQoc3RydWN0IG5ldCAqbmV0LAorCQkJCQkJY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpyZWcpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaG9va19saXN0ID0gTlVMTDsKKwlzdHJ1Y3QgbmZfaG9va19lbnRyeSAqaG9va19oZWFkID0gTlVMTDsKIAogCWlmIChyZWctPnBmICE9IE5GUFJPVE9fTkVUREVWKQotCQlob29rX2xpc3QgPSAmbmV0LT5uZi5ob29rc1tyZWctPnBmXVtyZWctPmhvb2tudW1dOworCQlob29rX2hlYWQgPSBuZl9lbnRyeV9kZXJlZmVyZW5jZShuZXQtPm5mLmhvb2tzW3JlZy0+cGZdCisJCQkJCQkgW3JlZy0+aG9va251bV0pOwogCWVsc2UgaWYgKHJlZy0+aG9va251bSA9PSBORl9ORVRERVZfSU5HUkVTUykgewogI2lmZGVmIENPTkZJR19ORVRGSUxURVJfSU5HUkVTUwogCQlpZiAocmVnLT5kZXYgJiYgZGV2X25ldChyZWctPmRldikgPT0gbmV0KQotCQkJaG9va19saXN0ID0gJnJlZy0+ZGV2LT5uZl9ob29rc19pbmdyZXNzOworCQkJaG9va19oZWFkID0KKwkJCQluZl9lbnRyeV9kZXJlZmVyZW5jZSgKKwkJCQkJcmVnLT5kZXYtPm5mX2hvb2tzX2luZ3Jlc3MpOwogI2VuZGlmCiAJfQotCXJldHVybiBob29rX2xpc3Q7CisJcmV0dXJuIGhvb2tfaGVhZDsKIH0KIAotc3RydWN0IG5mX2hvb2tfZW50cnkgewotCWNvbnN0IHN0cnVjdCBuZl9ob29rX29wcwkqb3JpZ19vcHM7Ci0Jc3RydWN0IG5mX2hvb2tfb3BzCQlvcHM7Ci19OworLyogbXVzdCBob2xkIG5mX2hvb2tfbXV0ZXggKi8KK3N0YXRpYyB2b2lkIG5mX3NldF9ob29rc19oZWFkKHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpyZWcsCisJCQkgICAgICBzdHJ1Y3QgbmZfaG9va19lbnRyeSAqZW50cnkpCit7CisJc3dpdGNoIChyZWctPnBmKSB7CisJY2FzZSBORlBST1RPX05FVERFVjoKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSX0lOR1JFU1MKKwkJLyogV2UgYWxyZWFkeSBjaGVja2VkIGluIG5mX3JlZ2lzdGVyX25ldF9ob29rKCkgdGhhdCB0aGlzIGlzCisJCSAqIHVzZWQgZnJvbSBpbmdyZXNzLgorCQkgKi8KKwkJcmN1X2Fzc2lnbl9wb2ludGVyKHJlZy0+ZGV2LT5uZl9ob29rc19pbmdyZXNzLCBlbnRyeSk7CisjZW5kaWYKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKG5ldC0+bmYuaG9va3NbcmVnLT5wZl1bcmVnLT5ob29rbnVtXSwKKwkJCQkgICBlbnRyeSk7CisJCWJyZWFrOworCX0KK30KIAogaW50IG5mX3JlZ2lzdGVyX25ldF9ob29rKHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpyZWcpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaG9va19saXN0OworCXN0cnVjdCBuZl9ob29rX2VudHJ5ICpob29rc19lbnRyeTsKIAlzdHJ1Y3QgbmZfaG9va19lbnRyeSAqZW50cnk7Ci0Jc3RydWN0IG5mX2hvb2tfb3BzICplbGVtOworCisJaWYgKHJlZy0+cGYgPT0gTkZQUk9UT19ORVRERVYpIHsKKyNpZm5kZWYgQ09ORklHX05FVEZJTFRFUl9JTkdSRVNTCisJCWlmIChyZWctPmhvb2tudW0gPT0gTkZfTkVUREVWX0lOR1JFU1MpCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisjZW5kaWYKKwkJaWYgKHJlZy0+aG9va251bSAhPSBORl9ORVRERVZfSU5HUkVTUyB8fAorCQkgICAgIXJlZy0+ZGV2IHx8IGRldl9uZXQocmVnLT5kZXYpICE9IG5ldCkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KIAogCWVudHJ5ID0ga21hbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlbnRyeSkKQEAgLTk1LDE5ICsxMjUsMzAgQEAKIAogCWVudHJ5LT5vcmlnX29wcwk9IHJlZzsKIAllbnRyeS0+b3BzCT0gKnJlZzsKLQotCWhvb2tfbGlzdCA9IG5mX2ZpbmRfaG9va19saXN0KG5ldCwgcmVnKTsKLQlpZiAoIWhvb2tfbGlzdCkgewotCQlrZnJlZShlbnRyeSk7Ci0JCXJldHVybiAtRU5PRU5UOwotCX0KKwllbnRyeS0+bmV4dAk9IE5VTEw7CiAKIAltdXRleF9sb2NrKCZuZl9ob29rX211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVsZW0sIGhvb2tfbGlzdCwgbGlzdCkgewotCQlpZiAocmVnLT5wcmlvcml0eSA8IGVsZW0tPnByaW9yaXR5KQotCQkJYnJlYWs7CisJaG9va3NfZW50cnkgPSBuZl9ob29rX2VudHJ5X2hlYWQobmV0LCByZWcpOworCisJaWYgKGhvb2tzX2VudHJ5ICYmIGhvb2tzX2VudHJ5LT5vcmlnX29wcy0+cHJpb3JpdHkgPiByZWctPnByaW9yaXR5KSB7CisJCS8qIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgd2UgbmVlZCB0byBpbnNlcnQgYXQgdGhlIGhlYWQgKi8KKwkJZW50cnktPm5leHQgPSBob29rc19lbnRyeTsKKwkJaG9va3NfZW50cnkgPSBOVUxMOwogCX0KLQlsaXN0X2FkZF9yY3UoJmVudHJ5LT5vcHMubGlzdCwgZWxlbS0+bGlzdC5wcmV2KTsKKworCXdoaWxlIChob29rc19lbnRyeSAmJgorCQlyZWctPnByaW9yaXR5ID49IGhvb2tzX2VudHJ5LT5vcmlnX29wcy0+cHJpb3JpdHkgJiYKKwkJbmZfZW50cnlfZGVyZWZlcmVuY2UoaG9va3NfZW50cnktPm5leHQpKSB7CisJCWhvb2tzX2VudHJ5ID0gbmZfZW50cnlfZGVyZWZlcmVuY2UoaG9va3NfZW50cnktPm5leHQpOworCX0KKworCWlmIChob29rc19lbnRyeSkgeworCQllbnRyeS0+bmV4dCA9IG5mX2VudHJ5X2RlcmVmZXJlbmNlKGhvb2tzX2VudHJ5LT5uZXh0KTsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGhvb2tzX2VudHJ5LT5uZXh0LCBlbnRyeSk7CisJfSBlbHNlIHsKKwkJbmZfc2V0X2hvb2tzX2hlYWQobmV0LCByZWcsIGVudHJ5KTsKKwl9CisKIAltdXRleF91bmxvY2soJm5mX2hvb2tfbXV0ZXgpOwogI2lmZGVmIENPTkZJR19ORVRGSUxURVJfSU5HUkVTUwogCWlmIChyZWctPnBmID09IE5GUFJPVE9fTkVUREVWICYmIHJlZy0+aG9va251bSA9PSBORl9ORVRERVZfSU5HUkVTUykKQEAgLTEyMiwyNCArMTYzLDMzIEBACiAKIHZvaWQgbmZfdW5yZWdpc3Rlcl9uZXRfaG9vayhzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqcmVnKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmhvb2tfbGlzdDsKLQlzdHJ1Y3QgbmZfaG9va19lbnRyeSAqZW50cnk7Ci0Jc3RydWN0IG5mX2hvb2tfb3BzICplbGVtOwotCi0JaG9va19saXN0ID0gbmZfZmluZF9ob29rX2xpc3QobmV0LCByZWcpOwotCWlmICghaG9va19saXN0KQotCQlyZXR1cm47CisJc3RydWN0IG5mX2hvb2tfZW50cnkgKmhvb2tzX2VudHJ5OwogCiAJbXV0ZXhfbG9jaygmbmZfaG9va19tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShlbGVtLCBob29rX2xpc3QsIGxpc3QpIHsKLQkJZW50cnkgPSBjb250YWluZXJfb2YoZWxlbSwgc3RydWN0IG5mX2hvb2tfZW50cnksIG9wcyk7Ci0JCWlmIChlbnRyeS0+b3JpZ19vcHMgPT0gcmVnKSB7Ci0JCQlsaXN0X2RlbF9yY3UoJmVudHJ5LT5vcHMubGlzdCk7Ci0JCQlicmVhazsKLQkJfQorCWhvb2tzX2VudHJ5ID0gbmZfaG9va19lbnRyeV9oZWFkKG5ldCwgcmVnKTsKKwlpZiAoaG9va3NfZW50cnkgJiYgaG9va3NfZW50cnktPm9yaWdfb3BzID09IHJlZykgeworCQluZl9zZXRfaG9va3NfaGVhZChuZXQsIHJlZywKKwkJCQkgIG5mX2VudHJ5X2RlcmVmZXJlbmNlKGhvb2tzX2VudHJ5LT5uZXh0KSk7CisJCWdvdG8gdW5sb2NrOwogCX0KKwl3aGlsZSAoaG9va3NfZW50cnkgJiYgbmZfZW50cnlfZGVyZWZlcmVuY2UoaG9va3NfZW50cnktPm5leHQpKSB7CisJCXN0cnVjdCBuZl9ob29rX2VudHJ5ICpuZXh0ID0KKwkJCW5mX2VudHJ5X2RlcmVmZXJlbmNlKGhvb2tzX2VudHJ5LT5uZXh0KTsKKwkJc3RydWN0IG5mX2hvb2tfZW50cnkgKm5uZXh0OworCisJCWlmIChuZXh0LT5vcmlnX29wcyAhPSByZWcpIHsKKwkJCWhvb2tzX2VudHJ5ID0gbmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCW5uZXh0ID0gbmZfZW50cnlfZGVyZWZlcmVuY2UobmV4dC0+bmV4dCk7CisJCXJjdV9hc3NpZ25fcG9pbnRlcihob29rc19lbnRyeS0+bmV4dCwgbm5leHQpOworCQlob29rc19lbnRyeSA9IG5leHQ7CisJCWJyZWFrOworCX0KKwordW5sb2NrOgogCW11dGV4X3VubG9jaygmbmZfaG9va19tdXRleCk7Ci0JaWYgKCZlbGVtLT5saXN0ID09IGhvb2tfbGlzdCkgeworCWlmICghaG9va3NfZW50cnkpIHsKIAkJV0FSTigxLCAibmZfdW5yZWdpc3Rlcl9uZXRfaG9vazogaG9vayBub3QgZm91bmQhXG4iKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE1MSwxMCArMjAxLDEwIEBACiAJc3RhdGljX2tleV9zbG93X2RlYygmbmZfaG9va3NfbmVlZGVkW3JlZy0+cGZdW3JlZy0+aG9va251bV0pOwogI2VuZGlmCiAJc3luY2hyb25pemVfbmV0KCk7Ci0JbmZfcXVldWVfbmZfaG9va19kcm9wKG5ldCwgJmVudHJ5LT5vcHMpOworCW5mX3F1ZXVlX25mX2hvb2tfZHJvcChuZXQsIGhvb2tzX2VudHJ5KTsKIAkvKiBvdGhlciBjcHUgbWlnaHQgc3RpbGwgcHJvY2VzcyBuZnF1ZXVlIHZlcmRpY3QgdGhhdCB1c2VkIHJlZyAqLwogCXN5bmNocm9uaXplX25ldCgpOwotCWtmcmVlKGVudHJ5KTsKKwlrZnJlZShob29rc19lbnRyeSk7CiB9CiBFWFBPUlRfU1lNQk9MKG5mX3VucmVnaXN0ZXJfbmV0X2hvb2spOwogCkBAIC0xODgsMTkgKzIzOCwxNyBAQAogCiBzdGF0aWMgTElTVF9IRUFEKG5mX2hvb2tfbGlzdCk7CiAKLWludCBuZl9yZWdpc3Rlcl9ob29rKHN0cnVjdCBuZl9ob29rX29wcyAqcmVnKQorc3RhdGljIGludCBfbmZfcmVnaXN0ZXJfaG9vayhzdHJ1Y3QgbmZfaG9va19vcHMgKnJlZykKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQsICpsYXN0OwogCWludCByZXQ7CiAKLQlydG5sX2xvY2soKTsKIAlmb3JfZWFjaF9uZXQobmV0KSB7CiAJCXJldCA9IG5mX3JlZ2lzdGVyX25ldF9ob29rKG5ldCwgcmVnKTsKIAkJaWYgKHJldCAmJiByZXQgIT0gLUVOT0VOVCkKIAkJCWdvdG8gcm9sbGJhY2s7CiAJfQogCWxpc3RfYWRkX3RhaWwoJnJlZy0+bGlzdCwgJm5mX2hvb2tfbGlzdCk7Ci0JcnRubF91bmxvY2soKTsKIAogCXJldHVybiAwOwogcm9sbGJhY2s6CkBAIC0yMTAsMTkgKzI1OCwzNCBAQAogCQkJYnJlYWs7CiAJCW5mX3VucmVnaXN0ZXJfbmV0X2hvb2sobmV0LCByZWcpOwogCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgbmZfcmVnaXN0ZXJfaG9vayhzdHJ1Y3QgbmZfaG9va19vcHMgKnJlZykKK3sKKwlpbnQgcmV0OworCisJcnRubF9sb2NrKCk7CisJcmV0ID0gX25mX3JlZ2lzdGVyX2hvb2socmVnKTsKIAlydG5sX3VubG9jaygpOworCiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0wobmZfcmVnaXN0ZXJfaG9vayk7CiAKLXZvaWQgbmZfdW5yZWdpc3Rlcl9ob29rKHN0cnVjdCBuZl9ob29rX29wcyAqcmVnKQorc3RhdGljIHZvaWQgX25mX3VucmVnaXN0ZXJfaG9vayhzdHJ1Y3QgbmZfaG9va19vcHMgKnJlZykKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQ7CiAKLQlydG5sX2xvY2soKTsKIAlsaXN0X2RlbCgmcmVnLT5saXN0KTsKIAlmb3JfZWFjaF9uZXQobmV0KQogCQluZl91bnJlZ2lzdGVyX25ldF9ob29rKG5ldCwgcmVnKTsKK30KKwordm9pZCBuZl91bnJlZ2lzdGVyX2hvb2soc3RydWN0IG5mX2hvb2tfb3BzICpyZWcpCit7CisJcnRubF9sb2NrKCk7CisJX25mX3VucmVnaXN0ZXJfaG9vayhyZWcpOwogCXJ0bmxfdW5sb2NrKCk7CiB9CiBFWFBPUlRfU1lNQk9MKG5mX3VucmVnaXN0ZXJfaG9vayk7CkBAIC0yNDYsNiArMzA5LDI2IEBACiB9CiBFWFBPUlRfU1lNQk9MKG5mX3JlZ2lzdGVyX2hvb2tzKTsKIAorLyogQ2FsbGVyIE1VU1QgdGFrZSBydG5sX2xvY2soKSAqLworaW50IF9uZl9yZWdpc3Rlcl9ob29rcyhzdHJ1Y3QgbmZfaG9va19vcHMgKnJlZywgdW5zaWduZWQgaW50IG4pCit7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGVyciA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCWVyciA9IF9uZl9yZWdpc3Rlcl9ob29rKCZyZWdbaV0pOworCQlpZiAoZXJyKQorCQkJZ290byBlcnI7CisJfQorCXJldHVybiBlcnI7CisKK2VycjoKKwlpZiAoaSA+IDApCisJCV9uZl91bnJlZ2lzdGVyX2hvb2tzKHJlZywgaSk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0woX25mX3JlZ2lzdGVyX2hvb2tzKTsKKwogdm9pZCBuZl91bnJlZ2lzdGVyX2hvb2tzKHN0cnVjdCBuZl9ob29rX29wcyAqcmVnLCB1bnNpZ25lZCBpbnQgbikKIHsKIAl3aGlsZSAobi0tID4gMCkKQEAgLTI1MywxMCArMzM2LDE3IEBACiB9CiBFWFBPUlRfU1lNQk9MKG5mX3VucmVnaXN0ZXJfaG9va3MpOwogCi11bnNpZ25lZCBpbnQgbmZfaXRlcmF0ZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLAotCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKKy8qIENhbGxlciBNVVNUIHRha2UgcnRubF9sb2NrICovCit2b2lkIF9uZl91bnJlZ2lzdGVyX2hvb2tzKHN0cnVjdCBuZl9ob29rX29wcyAqcmVnLCB1bnNpZ25lZCBpbnQgbikKK3sKKwl3aGlsZSAobi0tID4gMCkKKwkJX25mX3VucmVnaXN0ZXJfaG9vaygmcmVnW25dKTsKK30KK0VYUE9SVF9TWU1CT0woX25mX3VucmVnaXN0ZXJfaG9va3MpOworCit1bnNpZ25lZCBpbnQgbmZfaXRlcmF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlLAotCQkJc3RydWN0IG5mX2hvb2tfb3BzICoqZWxlbXApCisJCQlzdHJ1Y3QgbmZfaG9va19lbnRyeSAqKmVudHJ5cCkKIHsKIAl1bnNpZ25lZCBpbnQgdmVyZGljdDsKIApAQCAtMjY0LDIwICszNTQsMjMgQEAKIAkgKiBUaGUgY2FsbGVyIG11c3Qgbm90IGJsb2NrIGJldHdlZW4gY2FsbHMgdG8gdGhpcwogCSAqIGZ1bmN0aW9uIGJlY2F1c2Ugb2YgcmlzayBvZiBjb250aW51aW5nIGZyb20gZGVsZXRlZCBlbGVtZW50LgogCSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWVfcmN1KCgqZWxlbXApLCBoZWFkLCBsaXN0KSB7Ci0JCWlmIChzdGF0ZS0+dGhyZXNoID4gKCplbGVtcCktPnByaW9yaXR5KQorCXdoaWxlICgqZW50cnlwKSB7CisJCWlmIChzdGF0ZS0+dGhyZXNoID4gKCplbnRyeXApLT5vcHMucHJpb3JpdHkpIHsKKwkJCSplbnRyeXAgPSByY3VfZGVyZWZlcmVuY2UoKCplbnRyeXApLT5uZXh0KTsKIAkJCWNvbnRpbnVlOworCQl9CiAKIAkJLyogT3B0aW1pemF0aW9uOiB3ZSBkb24ndCBuZWVkIHRvIGhvbGQgbW9kdWxlCiAJCSAgIHJlZmVyZW5jZSBoZXJlLCBzaW5jZSBmdW5jdGlvbiBjYW4ndCBzbGVlcC4gLS1SUiAqLwogcmVwZWF0OgotCQl2ZXJkaWN0ID0gKCplbGVtcCktPmhvb2soKCplbGVtcCktPnByaXYsIHNrYiwgc3RhdGUpOworCQl2ZXJkaWN0ID0gKCplbnRyeXApLT5vcHMuaG9vaygoKmVudHJ5cCktPm9wcy5wcml2LCBza2IsIHN0YXRlKTsKIAkJaWYgKHZlcmRpY3QgIT0gTkZfQUNDRVBUKSB7CiAjaWZkZWYgQ09ORklHX05FVEZJTFRFUl9ERUJVRwogCQkJaWYgKHVubGlrZWx5KCh2ZXJkaWN0ICYgTkZfVkVSRElDVF9NQVNLKQogCQkJCQkJCT4gTkZfTUFYX1ZFUkRJQ1QpKSB7CiAJCQkJTkZERUJVRygiRXZpbCByZXR1cm4gZnJvbSAlcCgldSkuXG4iLAotCQkJCQkoKmVsZW1wKS0+aG9vaywgc3RhdGUtPmhvb2spOworCQkJCQkoKmVudHJ5cCktPm9wcy5ob29rLCBzdGF0ZS0+aG9vayk7CisJCQkJKmVudHJ5cCA9IHJjdV9kZXJlZmVyZW5jZSgoKmVudHJ5cCktPm5leHQpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogI2VuZGlmCkBAIC0yODUsMjUgKzM3OCwyMyBAQAogCQkJCXJldHVybiB2ZXJkaWN0OwogCQkJZ290byByZXBlYXQ7CiAJCX0KKwkJKmVudHJ5cCA9IHJjdV9kZXJlZmVyZW5jZSgoKmVudHJ5cCktPm5leHQpOwogCX0KIAlyZXR1cm4gTkZfQUNDRVBUOwogfQogCiAKIC8qIFJldHVybnMgMSBpZiBva2ZuKCkgbmVlZHMgdG8gYmUgZXhlY3V0ZWQgYnkgdGhlIGNhbGxlciwKLSAqIC1FUEVSTSBmb3IgTkZfRFJPUCwgMCBvdGhlcndpc2UuICovCisgKiAtRVBFUk0gZm9yIE5GX0RST1AsIDAgb3RoZXJ3aXNlLiAgQ2FsbGVyIG11c3QgaG9sZCByY3VfcmVhZF9sb2NrLiAqLwogaW50IG5mX2hvb2tfc2xvdyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7Ci0Jc3RydWN0IG5mX2hvb2tfb3BzICplbGVtOworCXN0cnVjdCBuZl9ob29rX2VudHJ5ICplbnRyeTsKIAl1bnNpZ25lZCBpbnQgdmVyZGljdDsKIAlpbnQgcmV0ID0gMDsKIAotCS8qIFdlIG1heSBhbHJlYWR5IGhhdmUgdGhpcywgYnV0IHJlYWQtbG9ja3MgbmVzdCBhbnl3YXkgKi8KLQlyY3VfcmVhZF9sb2NrKCk7Ci0KLQllbGVtID0gbGlzdF9lbnRyeV9yY3Uoc3RhdGUtPmhvb2tfbGlzdCwgc3RydWN0IG5mX2hvb2tfb3BzLCBsaXN0KTsKKwllbnRyeSA9IHJjdV9kZXJlZmVyZW5jZShzdGF0ZS0+aG9va19lbnRyaWVzKTsKIG5leHRfaG9vazoKLQl2ZXJkaWN0ID0gbmZfaXRlcmF0ZShzdGF0ZS0+aG9va19saXN0LCBza2IsIHN0YXRlLCAmZWxlbSk7CisJdmVyZGljdCA9IG5mX2l0ZXJhdGUoc2tiLCBzdGF0ZSwgJmVudHJ5KTsKIAlpZiAodmVyZGljdCA9PSBORl9BQ0NFUFQgfHwgdmVyZGljdCA9PSBORl9TVE9QKSB7CiAJCXJldCA9IDE7CiAJfSBlbHNlIGlmICgodmVyZGljdCAmIE5GX1ZFUkRJQ1RfTUFTSykgPT0gTkZfRFJPUCkgewpAQCAtMzEyLDggKzQwMywxMCBAQAogCQlpZiAocmV0ID09IDApCiAJCQlyZXQgPSAtRVBFUk07CiAJfSBlbHNlIGlmICgodmVyZGljdCAmIE5GX1ZFUkRJQ1RfTUFTSykgPT0gTkZfUVVFVUUpIHsKLQkJaW50IGVyciA9IG5mX3F1ZXVlKHNrYiwgZWxlbSwgc3RhdGUsCi0JCQkJICAgdmVyZGljdCA+PiBORl9WRVJESUNUX1FCSVRTKTsKKwkJaW50IGVycjsKKworCQlSQ1VfSU5JVF9QT0lOVEVSKHN0YXRlLT5ob29rX2VudHJpZXMsIGVudHJ5KTsKKwkJZXJyID0gbmZfcXVldWUoc2tiLCBzdGF0ZSwgdmVyZGljdCA+PiBORl9WRVJESUNUX1FCSVRTKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCWlmIChlcnIgPT0gLUVTUkNIICYmCiAJCQkgICAodmVyZGljdCAmIE5GX1ZFUkRJQ1RfRkxBR19RVUVVRV9CWVBBU1MpKQpAQCAtMzIxLDcgKzQxNCw2IEBACiAJCQlrZnJlZV9za2Ioc2tiKTsKIAkJfQogCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChuZl9ob29rX3Nsb3cpOwpAQCAtNDQxLDcgKzUzMyw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShuZXQtPm5mLmhvb2tzKTsgaSsrKSB7CiAJCWZvciAoaCA9IDA7IGggPCBORl9NQVhfSE9PS1M7IGgrKykKLQkJCUlOSVRfTElTVF9IRUFEKCZuZXQtPm5mLmhvb2tzW2ldW2hdKTsKKwkJCVJDVV9JTklUX1BPSU5URVIobmV0LT5uZi5ob29rc1tpXVtoXSwgTlVMTCk7CiAJfQogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19uZmN0LmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbmZjdC5jCmluZGV4IGYwNGZkOGQuLmZjMjMwZDkgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19uZmN0LmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX25mY3QuYwpAQCAtMjgxLDEzICsyODEsMTAgQEAKIAloID0gbmZfY29ubnRyYWNrX2ZpbmRfZ2V0KGNwLT5pcHZzLT5uZXQsICZuZl9jdF96b25lX2RmbHQsICZ0dXBsZSk7CiAJaWYgKGgpIHsKIAkJY3QgPSBuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwotCQkvKiBTaG93IHdoYXQgaGFwcGVucyBpbnN0ZWFkIG9mIGNhbGxpbmcgbmZfY3Rfa2lsbCgpICovCi0JCWlmIChkZWxfdGltZXIoJmN0LT50aW1lb3V0KSkgewotCQkJSVBfVlNfREJHKDcsICIlczogY3Q9JXAsIGRlbGV0ZWQgY29ubnRyYWNrIHRpbWVyIGZvciB0dXBsZT0iCisJCWlmIChuZl9jdF9raWxsKGN0KSkgeworCQkJSVBfVlNfREJHKDcsICIlczogY3Q9JXAsIGRlbGV0ZWQgY29ubnRyYWNrIGZvciB0dXBsZT0iCiAJCQkJRk1UX1RVUExFICJcbiIsCiAJCQkJX19mdW5jX18sIGN0LCBBUkdfVFVQTEUoJnR1cGxlKSk7Ci0JCQlpZiAoY3QtPnRpbWVvdXQuZnVuY3Rpb24pCi0JCQkJY3QtPnRpbWVvdXQuZnVuY3Rpb24oY3QtPnRpbWVvdXQuZGF0YSk7CiAJCX0gZWxzZSB7CiAJCQlJUF9WU19EQkcoNywgIiVzOiBjdD0lcCwgbm8gY29ubnRyYWNrIHRpbWVyIGZvciB0dXBsZT0iCiAJCQkJRk1UX1RVUExFICJcbiIsCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMKaW5kZXggZGQyYzQzYS4uYmE2YTFkNCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYwpAQCAtNzIsMTIgKzcyLDI0IEBACiBzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqbmZfY29ubnRyYWNrX2hhc2ggX19yZWFkX21vc3RseTsKIEVYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19oYXNoKTsKIAorc3RydWN0IGNvbm50cmFja19nY193b3JrIHsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCWR3b3JrOworCXUzMgkJCWxhc3RfYnVja2V0OworCWJvb2wJCQlleGl0aW5nOworfTsKKwogc3RhdGljIF9fcmVhZF9tb3N0bHkgc3RydWN0IGttZW1fY2FjaGUgKm5mX2Nvbm50cmFja19jYWNoZXA7CiBzdGF0aWMgX19yZWFkX21vc3RseSBzcGlubG9ja190IG5mX2Nvbm50cmFja19sb2Nrc19hbGxfbG9jazsKLXN0YXRpYyBfX3JlYWRfbW9zdGx5IHNlcWNvdW50X3QgbmZfY29ubnRyYWNrX2dlbmVyYXRpb247CiBzdGF0aWMgX19yZWFkX21vc3RseSBERUZJTkVfU1BJTkxPQ0sobmZfY29ubnRyYWNrX2xvY2tzX2FsbF9sb2NrKTsKIHN0YXRpYyBfX3JlYWRfbW9zdGx5IGJvb2wgbmZfY29ubnRyYWNrX2xvY2tzX2FsbDsKIAorI2RlZmluZSBHQ19NQVhfQlVDS0VUU19ESVYJNjR1CisjZGVmaW5lIEdDX01BWF9CVUNLRVRTCQk4MTkydQorI2RlZmluZSBHQ19JTlRFUlZBTAkJKDUgKiBIWikKKyNkZWZpbmUgR0NfTUFYX0VWSUNUUwkJMjU2dQorCitzdGF0aWMgc3RydWN0IGNvbm50cmFja19nY193b3JrIGNvbm50cmFja19nY193b3JrOworCiB2b2lkIG5mX2Nvbm50cmFja19sb2NrKHNwaW5sb2NrX3QgKmxvY2spIF9fYWNxdWlyZXMobG9jaykKIHsKIAlzcGluX2xvY2sobG9jayk7CkBAIC0xNjQsNyArMTc2LDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19odGFibGVfc2l6ZSk7CiAKIHVuc2lnbmVkIGludCBuZl9jb25udHJhY2tfbWF4IF9fcmVhZF9tb3N0bHk7Ci1FWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfbWF4KTsKK3NlcWNvdW50X3QgbmZfY29ubnRyYWNrX2dlbmVyYXRpb24gX19yZWFkX21vc3RseTsKIAogREVGSU5FX1BFUl9DUFUoc3RydWN0IG5mX2Nvbm4sIG5mX2Nvbm50cmFja191bnRyYWNrZWQpOwogRVhQT1JUX1BFUl9DUFVfU1lNQk9MKG5mX2Nvbm50cmFja191bnRyYWNrZWQpOwpAQCAtMzY3LDEyICszNzksMTAgQEAKIGRlc3Ryb3lfY29ubnRyYWNrKHN0cnVjdCBuZl9jb25udHJhY2sgKm5mY3QpCiB7CiAJc3RydWN0IG5mX2Nvbm4gKmN0ID0gKHN0cnVjdCBuZl9jb25uICopbmZjdDsKLQlzdHJ1Y3QgbmV0ICpuZXQgPSBuZl9jdF9uZXQoY3QpOwogCXN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqbDRwcm90bzsKIAogCXByX2RlYnVnKCJkZXN0cm95X2Nvbm50cmFjayglcClcbiIsIGN0KTsKIAlORl9DVF9BU1NFUlQoYXRvbWljX3JlYWQoJm5mY3QtPnVzZSkgPT0gMCk7Ci0JTkZfQ1RfQVNTRVJUKCF0aW1lcl9wZW5kaW5nKCZjdC0+dGltZW91dCkpOwogCiAJaWYgKHVubGlrZWx5KG5mX2N0X2lzX3RlbXBsYXRlKGN0KSkpIHsKIAkJbmZfY3RfdG1wbF9mcmVlKGN0KTsKQEAgLTM5NSw3ICs0MDUsNiBAQAogCiAJbmZfY3RfZGVsX2Zyb21fZHlpbmdfb3JfdW5jb25maXJtZWRfbGlzdChjdCk7CiAKLQlORl9DVF9TVEFUX0lOQyhuZXQsIGRlbGV0ZSk7CiAJbG9jYWxfYmhfZW5hYmxlKCk7CiAKIAlpZiAoY3QtPm1hc3RlcikKQEAgLTQyNyw3ICs0MzYsNiBAQAogCiAJbmZfY3RfYWRkX3RvX2R5aW5nX2xpc3QoY3QpOwogCi0JTkZfQ1RfU1RBVF9JTkMobmV0LCBkZWxldGVfbGlzdCk7CiAJbG9jYWxfYmhfZW5hYmxlKCk7CiB9CiAKQEAgLTQzNSwzNSArNDQzLDMwIEBACiB7CiAJc3RydWN0IG5mX2Nvbm5fdHN0YW1wICp0c3RhbXA7CiAKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChJUFNfRFlJTkdfQklULCAmY3QtPnN0YXR1cykpCisJCXJldHVybiBmYWxzZTsKKwogCXRzdGFtcCA9IG5mX2Nvbm5fdHN0YW1wX2ZpbmQoY3QpOwogCWlmICh0c3RhbXAgJiYgdHN0YW1wLT5zdG9wID09IDApCiAJCXRzdGFtcC0+c3RvcCA9IGt0aW1lX2dldF9yZWFsX25zKCk7CiAKLQlpZiAobmZfY3RfaXNfZHlpbmcoY3QpKQotCQlnb3RvIGRlbGV0ZTsKLQogCWlmIChuZl9jb25udHJhY2tfZXZlbnRfcmVwb3J0KElQQ1RfREVTVFJPWSwgY3QsCiAJCQkJICAgIHBvcnRpZCwgcmVwb3J0KSA8IDApIHsKLQkJLyogZGVzdHJveSBldmVudCB3YXMgbm90IGRlbGl2ZXJlZCAqLworCQkvKiBkZXN0cm95IGV2ZW50IHdhcyBub3QgZGVsaXZlcmVkLiBuZl9jdF9wdXQgd2lsbAorCQkgKiBiZSBkb25lIGJ5IGV2ZW50IGNhY2hlIHdvcmtlciBvbiByZWRlbGl2ZXJ5LgorCQkgKi8KIAkJbmZfY3RfZGVsZXRlX2Zyb21fbGlzdHMoY3QpOwogCQluZl9jb25udHJhY2tfZWNhY2hlX2RlbGF5ZWRfd29yayhuZl9jdF9uZXQoY3QpKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAogCW5mX2Nvbm50cmFja19lY2FjaGVfd29yayhuZl9jdF9uZXQoY3QpKTsKLQlzZXRfYml0KElQU19EWUlOR19CSVQsICZjdC0+c3RhdHVzKTsKLSBkZWxldGU6CiAJbmZfY3RfZGVsZXRlX2Zyb21fbGlzdHMoY3QpOwogCW5mX2N0X3B1dChjdCk7CiAJcmV0dXJuIHRydWU7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChuZl9jdF9kZWxldGUpOwogCi1zdGF0aWMgdm9pZCBkZWF0aF9ieV90aW1lb3V0KHVuc2lnbmVkIGxvbmcgdWxfY29ubnRyYWNrKQotewotCW5mX2N0X2RlbGV0ZSgoc3RydWN0IG5mX2Nvbm4gKil1bF9jb25udHJhY2ssIDAsIDApOwotfQotCiBzdGF0aWMgaW5saW5lIGJvb2wKIG5mX2N0X2tleV9lcXVhbChzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmgsCiAJCWNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLApAQCAtNDgxLDIyICs0ODQsMTcgQEAKIAkgICAgICAgbmV0X2VxKG5ldCwgbmZfY3RfbmV0KGN0KSk7CiB9CiAKLS8qIG11c3QgYmUgY2FsbGVkIHdpdGggcmN1IHJlYWQgbG9jayBoZWxkICovCi12b2lkIG5mX2Nvbm50cmFja19nZXRfaHQoc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKipoYXNoLCB1bnNpZ25lZCBpbnQgKmhzaXplKQorLyogY2FsbGVyIG11c3QgaG9sZCByY3UgcmVhZGxvY2sgYW5kIG5vbmUgb2YgdGhlIG5mX2Nvbm50cmFja19sb2NrcyAqLworc3RhdGljIHZvaWQgbmZfY3RfZ2NfZXhwaXJlZChzdHJ1Y3QgbmZfY29ubiAqY3QpCiB7Ci0Jc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKmhwdHI7Ci0JdW5zaWduZWQgaW50IHNlcXVlbmNlLCBoc3o7CisJaWYgKCFhdG9taWNfaW5jX25vdF96ZXJvKCZjdC0+Y3RfZ2VuZXJhbC51c2UpKQorCQlyZXR1cm47CiAKLQlkbyB7Ci0JCXNlcXVlbmNlID0gcmVhZF9zZXFjb3VudF9iZWdpbigmbmZfY29ubnRyYWNrX2dlbmVyYXRpb24pOwotCQloc3ogPSBuZl9jb25udHJhY2tfaHRhYmxlX3NpemU7Ci0JCWhwdHIgPSBuZl9jb25udHJhY2tfaGFzaDsKLQl9IHdoaWxlIChyZWFkX3NlcWNvdW50X3JldHJ5KCZuZl9jb25udHJhY2tfZ2VuZXJhdGlvbiwgc2VxdWVuY2UpKTsKKwlpZiAobmZfY3Rfc2hvdWxkX2djKGN0KSkKKwkJbmZfY3Rfa2lsbChjdCk7CiAKLQkqaGFzaCA9IGhwdHI7Ci0JKmhzaXplID0gaHN6OworCW5mX2N0X3B1dChjdCk7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfZ2V0X2h0KTsKIAogLyoKICAqIFdhcm5pbmcgOgpAQCAtNTEwLDIxICs1MDgsMjYgQEAKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7CiAJc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKmN0X2hhc2g7CiAJc3RydWN0IGhsaXN0X251bGxzX25vZGUgKm47Ci0JdW5zaWduZWQgaW50IGJ1Y2tldCwgc2VxdWVuY2U7CisJdW5zaWduZWQgaW50IGJ1Y2tldCwgaHNpemU7CiAKIGJlZ2luOgotCWRvIHsKLQkJc2VxdWVuY2UgPSByZWFkX3NlcWNvdW50X2JlZ2luKCZuZl9jb25udHJhY2tfZ2VuZXJhdGlvbik7Ci0JCWJ1Y2tldCA9IHNjYWxlX2hhc2goaGFzaCk7Ci0JCWN0X2hhc2ggPSBuZl9jb25udHJhY2tfaGFzaDsKLQl9IHdoaWxlIChyZWFkX3NlcWNvdW50X3JldHJ5KCZuZl9jb25udHJhY2tfZ2VuZXJhdGlvbiwgc2VxdWVuY2UpKTsKKwluZl9jb25udHJhY2tfZ2V0X2h0KCZjdF9oYXNoLCAmaHNpemUpOworCWJ1Y2tldCA9IHJlY2lwcm9jYWxfc2NhbGUoaGFzaCwgaHNpemUpOwogCiAJaGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGgsIG4sICZjdF9oYXNoW2J1Y2tldF0sIGhubm9kZSkgewotCQlpZiAobmZfY3Rfa2V5X2VxdWFsKGgsIHR1cGxlLCB6b25lLCBuZXQpKSB7Ci0JCQlORl9DVF9TVEFUX0lOQ19BVE9NSUMobmV0LCBmb3VuZCk7Ci0JCQlyZXR1cm4gaDsKKwkJc3RydWN0IG5mX2Nvbm4gKmN0OworCisJCWN0ID0gbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhoKTsKKwkJaWYgKG5mX2N0X2lzX2V4cGlyZWQoY3QpKSB7CisJCQluZl9jdF9nY19leHBpcmVkKGN0KTsKKwkJCWNvbnRpbnVlOwogCQl9Ci0JCU5GX0NUX1NUQVRfSU5DX0FUT01JQyhuZXQsIHNlYXJjaGVkKTsKKworCQlpZiAobmZfY3RfaXNfZHlpbmcoY3QpKQorCQkJY29udGludWU7CisKKwkJaWYgKG5mX2N0X2tleV9lcXVhbChoLCB0dXBsZSwgem9uZSwgbmV0KSkKKwkJCXJldHVybiBoOwogCX0KIAkvKgogCSAqIGlmIHRoZSBudWxscyB2YWx1ZSB3ZSBnb3QgYXQgdGhlIGVuZCBvZiB0aGlzIGxvb2t1cCBpcwpAQCAtNjE4LDcgKzYyMSw2IEBACiAJCQkJICAgIHpvbmUsIG5ldCkpCiAJCQlnb3RvIG91dDsKIAotCWFkZF90aW1lcigmY3QtPnRpbWVvdXQpOwogCXNtcF93bWIoKTsKIAkvKiBUaGUgY2FsbGVyIGhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoaXMgb2JqZWN0ICovCiAJYXRvbWljX3NldCgmY3QtPmN0X2dlbmVyYWwudXNlLCAyKTsKQEAgLTc3MSw4ICs3NzMsNyBAQAogCS8qIFRpbWVyIHJlbGF0aXZlIHRvIGNvbmZpcm1hdGlvbiB0aW1lLCBub3Qgb3JpZ2luYWwKIAkgICBzZXR0aW5nIHRpbWUsIG90aGVyd2lzZSB3ZSdkIGdldCB0aW1lciB3cmFwIGluCiAJICAgd2VpcmQgZGVsYXkgY2FzZXMuICovCi0JY3QtPnRpbWVvdXQuZXhwaXJlcyArPSBqaWZmaWVzOwotCWFkZF90aW1lcigmY3QtPnRpbWVvdXQpOworCWN0LT50aW1lb3V0ICs9IG5mY3RfdGltZV9zdGFtcDsKIAlhdG9taWNfaW5jKCZjdC0+Y3RfZ2VuZXJhbC51c2UpOwogCWN0LT5zdGF0dXMgfD0gSVBTX0NPTkZJUk1FRDsKIApAQCAtNzkxLDcgKzc5Miw2IEBACiAJICovCiAJX19uZl9jb25udHJhY2tfaGFzaF9pbnNlcnQoY3QsIGhhc2gsIHJlcGx5X2hhc2gpOwogCW5mX2Nvbm50cmFja19kb3VibGVfdW5sb2NrKGhhc2gsIHJlcGx5X2hhc2gpOwotCU5GX0NUX1NUQVRfSU5DKG5ldCwgaW5zZXJ0KTsKIAlsb2NhbF9iaF9lbmFibGUoKTsKIAogCWhlbHAgPSBuZmN0X2hlbHAoY3QpOwpAQCAtODIzLDI5ICs4MjMsNDAgQEAKIAljb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3pvbmUgKnpvbmU7CiAJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICpoOwogCXN0cnVjdCBobGlzdF9udWxsc19oZWFkICpjdF9oYXNoOwotCXVuc2lnbmVkIGludCBoYXNoLCBzZXF1ZW5jZTsKKwl1bnNpZ25lZCBpbnQgaGFzaCwgaHNpemU7CiAJc3RydWN0IGhsaXN0X251bGxzX25vZGUgKm47CiAJc3RydWN0IG5mX2Nvbm4gKmN0OwogCiAJem9uZSA9IG5mX2N0X3pvbmUoaWdub3JlZF9jb25udHJhY2spOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWRvIHsKLQkJc2VxdWVuY2UgPSByZWFkX3NlcWNvdW50X2JlZ2luKCZuZl9jb25udHJhY2tfZ2VuZXJhdGlvbik7Ci0JCWhhc2ggPSBoYXNoX2Nvbm50cmFjayhuZXQsIHR1cGxlKTsKLQkJY3RfaGFzaCA9IG5mX2Nvbm50cmFja19oYXNoOwotCX0gd2hpbGUgKHJlYWRfc2VxY291bnRfcmV0cnkoJm5mX2Nvbm50cmFja19nZW5lcmF0aW9uLCBzZXF1ZW5jZSkpOworIGJlZ2luOgorCW5mX2Nvbm50cmFja19nZXRfaHQoJmN0X2hhc2gsICZoc2l6ZSk7CisJaGFzaCA9IF9faGFzaF9jb25udHJhY2sobmV0LCB0dXBsZSwgaHNpemUpOwogCiAJaGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGgsIG4sICZjdF9oYXNoW2hhc2hdLCBobm5vZGUpIHsKIAkJY3QgPSBuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwotCQlpZiAoY3QgIT0gaWdub3JlZF9jb25udHJhY2sgJiYKLQkJICAgIG5mX2N0X2tleV9lcXVhbChoLCB0dXBsZSwgem9uZSwgbmV0KSkgeworCisJCWlmIChjdCA9PSBpZ25vcmVkX2Nvbm50cmFjaykKKwkJCWNvbnRpbnVlOworCisJCWlmIChuZl9jdF9pc19leHBpcmVkKGN0KSkgeworCQkJbmZfY3RfZ2NfZXhwaXJlZChjdCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChuZl9jdF9rZXlfZXF1YWwoaCwgdHVwbGUsIHpvbmUsIG5ldCkpIHsKIAkJCU5GX0NUX1NUQVRfSU5DX0FUT01JQyhuZXQsIGZvdW5kKTsKIAkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJcmV0dXJuIDE7CiAJCX0KLQkJTkZfQ1RfU1RBVF9JTkNfQVRPTUlDKG5ldCwgc2VhcmNoZWQpOwogCX0KKworCWlmIChnZXRfbnVsbHNfdmFsdWUobikgIT0gaGFzaCkgeworCQlORl9DVF9TVEFUX0lOQ19BVE9NSUMobmV0LCBzZWFyY2hfcmVzdGFydCk7CisJCWdvdG8gYmVnaW47CisJfQorCiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlyZXR1cm4gMDsKQEAgLTg2Nyw2ICs4NzgsMTEgQEAKIAlobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UoaCwgbiwgaGVhZCwgaG5ub2RlKSB7CiAJCXRtcCA9IG5mX2N0X3R1cGxlaGFzaF90b19jdHJhY2soaCk7CiAKKwkJaWYgKG5mX2N0X2lzX2V4cGlyZWQodG1wKSkgeworCQkJbmZfY3RfZ2NfZXhwaXJlZCh0bXApOworCQkJY29udGludWU7CisJCX0KKwogCQlpZiAodGVzdF9iaXQoSVBTX0FTU1VSRURfQklULCAmdG1wLT5zdGF0dXMpIHx8CiAJCSAgICAhbmV0X2VxKG5mX2N0X25ldCh0bXApLCBuZXQpIHx8CiAJCSAgICBuZl9jdF9pc19keWluZyh0bXApKQpAQCAtODg0LDcgKzkwMCw2IEBACiAJCSAqLwogCQlpZiAobmV0X2VxKG5mX2N0X25ldCh0bXApLCBuZXQpICYmCiAJCSAgICBuZl9jdF9pc19jb25maXJtZWQodG1wKSAmJgotCQkgICAgZGVsX3RpbWVyKCZ0bXAtPnRpbWVvdXQpICYmCiAJCSAgICBuZl9jdF9kZWxldGUodG1wLCAwLCAwKSkKIAkJCWRyb3BzKys7CiAKQEAgLTkwMCwxNCArOTE1LDExIEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgTkZfQ1RfRVZJQ1RJT05fUkFOR0U7IGkrKykgewogCQlzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqY3RfaGFzaDsKLQkJdW5zaWduZWQgaGFzaCwgc2VxdWVuY2UsIGRyb3BzOworCQl1bnNpZ25lZCBpbnQgaGFzaCwgaHNpemUsIGRyb3BzOwogCiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJZG8gewotCQkJc2VxdWVuY2UgPSByZWFkX3NlcWNvdW50X2JlZ2luKCZuZl9jb25udHJhY2tfZ2VuZXJhdGlvbik7Ci0JCQloYXNoID0gc2NhbGVfaGFzaChfaGFzaCsrKTsKLQkJCWN0X2hhc2ggPSBuZl9jb25udHJhY2tfaGFzaDsKLQkJfSB3aGlsZSAocmVhZF9zZXFjb3VudF9yZXRyeSgmbmZfY29ubnRyYWNrX2dlbmVyYXRpb24sIHNlcXVlbmNlKSk7CisJCW5mX2Nvbm50cmFja19nZXRfaHQoJmN0X2hhc2gsICZoc2l6ZSk7CisJCWhhc2ggPSByZWNpcHJvY2FsX3NjYWxlKF9oYXNoKyssIGhzaXplKTsKIAogCQlkcm9wcyA9IGVhcmx5X2Ryb3BfbGlzdChuZXQsICZjdF9oYXNoW2hhc2hdKTsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC05MjEsNiArOTMzLDY5IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCitzdGF0aWMgdm9pZCBnY193b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXVuc2lnbmVkIGludCBpLCBnb2FsLCBidWNrZXRzID0gMCwgZXhwaXJlZF9jb3VudCA9IDA7CisJdW5zaWduZWQgbG9uZyBuZXh0X3J1biA9IEdDX0lOVEVSVkFMOworCXVuc2lnbmVkIGludCByYXRpbywgc2Nhbm5lZCA9IDA7CisJc3RydWN0IGNvbm50cmFja19nY193b3JrICpnY193b3JrOworCisJZ2Nfd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgY29ubnRyYWNrX2djX3dvcmssIGR3b3JrLndvcmspOworCisJZ29hbCA9IG1pbihuZl9jb25udHJhY2tfaHRhYmxlX3NpemUgLyBHQ19NQVhfQlVDS0VUU19ESVYsIEdDX01BWF9CVUNLRVRTKTsKKwlpID0gZ2Nfd29yay0+bGFzdF9idWNrZXQ7CisKKwlkbyB7CisJCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKKwkJc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKmN0X2hhc2g7CisJCXN0cnVjdCBobGlzdF9udWxsc19ub2RlICpuOworCQl1bnNpZ25lZCBpbnQgaGFzaHN6OworCQlzdHJ1Y3QgbmZfY29ubiAqdG1wOworCisJCWkrKzsKKwkJcmN1X3JlYWRfbG9jaygpOworCisJCW5mX2Nvbm50cmFja19nZXRfaHQoJmN0X2hhc2gsICZoYXNoc3opOworCQlpZiAoaSA+PSBoYXNoc3opCisJCQlpID0gMDsKKworCQlobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UoaCwgbiwgJmN0X2hhc2hbaV0sIGhubm9kZSkgeworCQkJdG1wID0gbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhoKTsKKworCQkJc2Nhbm5lZCsrOworCQkJaWYgKG5mX2N0X2lzX2V4cGlyZWQodG1wKSkgeworCQkJCW5mX2N0X2djX2V4cGlyZWQodG1wKTsKKwkJCQlleHBpcmVkX2NvdW50Kys7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQkvKiBjb3VsZCBjaGVjayBnZXRfbnVsbHNfdmFsdWUoKSBoZXJlIGFuZCByZXN0YXJ0IGlmIGN0CisJCSAqIHdhcyBtb3ZlZCB0byBhbm90aGVyIGNoYWluLiAgQnV0IGdpdmVuIGdjIGlzIGJlc3QtZWZmb3J0CisJCSAqIHdlIHdpbGwganVzdCBjb250aW51ZSB3aXRoIG5leHQgaGFzaCBzbG90LgorCQkgKi8KKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCWNvbmRfcmVzY2hlZF9yY3VfcXMoKTsKKwl9IHdoaWxlICgrK2J1Y2tldHMgPCBnb2FsICYmCisJCSBleHBpcmVkX2NvdW50IDwgR0NfTUFYX0VWSUNUUyk7CisKKwlpZiAoZ2Nfd29yay0+ZXhpdGluZykKKwkJcmV0dXJuOworCisJcmF0aW8gPSBzY2FubmVkID8gZXhwaXJlZF9jb3VudCAqIDEwMCAvIHNjYW5uZWQgOiAwOworCWlmIChyYXRpbyA+PSA5MCkKKwkJbmV4dF9ydW4gPSAwOworCisJZ2Nfd29yay0+bGFzdF9idWNrZXQgPSBpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZ2Nfd29yay0+ZHdvcmssIG5leHRfcnVuKTsKK30KKworc3RhdGljIHZvaWQgY29ubnRyYWNrX2djX3dvcmtfaW5pdChzdHJ1Y3QgY29ubnRyYWNrX2djX3dvcmsgKmdjX3dvcmspCit7CisJSU5JVF9ERUxBWUVEX1dPUksoJmdjX3dvcmstPmR3b3JrLCBnY193b3JrZXIpOworCWdjX3dvcmstPmV4aXRpbmcgPSBmYWxzZTsKK30KKwogc3RhdGljIHN0cnVjdCBuZl9jb25uICoKIF9fbmZfY29ubnRyYWNrX2FsbG9jKHN0cnVjdCBuZXQgKm5ldCwKIAkJICAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3pvbmUgKnpvbmUsCkBAIC05NTcsOCArMTAzMiw2IEBACiAJLyogc2F2ZSBoYXNoIGZvciByZXVzaW5nIHdoZW4gY29uZmlybWluZyAqLwogCSoodW5zaWduZWQgbG9uZyAqKSgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLmhubm9kZS5wcHJldikgPSBoYXNoOwogCWN0LT5zdGF0dXMgPSAwOwotCS8qIERvbid0IHNldCB0aW1lciB5ZXQ6IHdhaXQgZm9yIGNvbmZpcm1hdGlvbiAqLwotCXNldHVwX3RpbWVyKCZjdC0+dGltZW91dCwgZGVhdGhfYnlfdGltZW91dCwgKHVuc2lnbmVkIGxvbmcpY3QpOwogCXdyaXRlX3BuZXQoJmN0LT5jdF9uZXQsIG5ldCk7CiAJbWVtc2V0KCZjdC0+X19uZmN0X2luaXRfb2Zmc2V0WzBdLCAwLAogCSAgICAgICBvZmZzZXRvZihzdHJ1Y3QgbmZfY29ubiwgcHJvdG8pIC0KQEAgLTEwMzUsOSArMTEwOCw5IEBACiAJaWYgKElTX0VSUihjdCkpCiAJCXJldHVybiAoc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICopY3Q7CiAKLQlpZiAodG1wbCAmJiBuZmN0X3N5bnByb3h5KHRtcGwpKSB7Ci0JCW5mY3Rfc2VxYWRqX2V4dF9hZGQoY3QpOwotCQluZmN0X3N5bnByb3h5X2V4dF9hZGQoY3QpOworCWlmICghbmZfY3RfYWRkX3N5bnByb3h5KGN0LCB0bXBsKSkgeworCQluZl9jb25udHJhY2tfZnJlZShjdCk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCX0KIAogCXRpbWVvdXRfZXh0ID0gdG1wbCA/IG5mX2N0X3RpbWVvdXRfZmluZCh0bXBsKSA6IE5VTEw7CkBAIC0xMDk2LDEwICsxMTY5LDggQEAKIAkJfQogCQlzcGluX3VubG9jaygmbmZfY29ubnRyYWNrX2V4cGVjdF9sb2NrKTsKIAl9Ci0JaWYgKCFleHApIHsKKwlpZiAoIWV4cCkKIAkJX19uZl9jdF90cnlfYXNzaWduX2hlbHBlcihjdCwgdG1wbCwgR0ZQX0FUT01JQyk7Ci0JCU5GX0NUX1NUQVRfSU5DKG5ldCwgbmV3KTsKLQl9CiAKIAkvKiBOb3cgaXQgaXMgaW5zZXJ0ZWQgaW50byB0aGUgdW5jb25maXJtZWQgbGlzdCwgYnVtcCByZWZjb3VudCAqLwogCW5mX2Nvbm50cmFja19nZXQoJmN0LT5jdF9nZW5lcmFsKTsKQEAgLTEyMDQsNyArMTI3NSw3IEBACiAJCXNrYi0+bmZjdCA9IE5VTEw7CiAJfQogCi0JLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va19zbG93ICovCisJLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va190aHJlc2ggKi8KIAlsM3Byb3RvID0gX19uZl9jdF9sM3Byb3RvX2ZpbmQocGYpOwogCXJldCA9IGwzcHJvdG8tPmdldF9sNHByb3RvKHNrYiwgc2tiX25ldHdvcmtfb2Zmc2V0KHNrYiksCiAJCQkJICAgJmRhdGFvZmYsICZwcm90b251bSk7CkBAIC0xMzMyLDcgKzE0MDMsNiBAQAogCQkJICB1bnNpZ25lZCBsb25nIGV4dHJhX2ppZmZpZXMsCiAJCQkgIGludCBkb19hY2N0KQogewotCU5GX0NUX0FTU0VSVChjdC0+dGltZW91dC5kYXRhID09ICh1bnNpZ25lZCBsb25nKWN0KTsKIAlORl9DVF9BU1NFUlQoc2tiKTsKIAogCS8qIE9ubHkgdXBkYXRlIGlmIHRoaXMgaXMgbm90IGEgZml4ZWQgdGltZW91dCAqLwpAQCAtMTM0MCwzOSArMTQxMCwyNSBAQAogCQlnb3RvIGFjY3Q7CiAKIAkvKiBJZiBub3QgaW4gaGFzaCB0YWJsZSwgdGltZXIgd2lsbCBub3QgYmUgYWN0aXZlIHlldCAqLwotCWlmICghbmZfY3RfaXNfY29uZmlybWVkKGN0KSkgewotCQljdC0+dGltZW91dC5leHBpcmVzID0gZXh0cmFfamlmZmllczsKLQl9IGVsc2UgewotCQl1bnNpZ25lZCBsb25nIG5ld3RpbWUgPSBqaWZmaWVzICsgZXh0cmFfamlmZmllczsKKwlpZiAobmZfY3RfaXNfY29uZmlybWVkKGN0KSkKKwkJZXh0cmFfamlmZmllcyArPSBuZmN0X3RpbWVfc3RhbXA7CiAKLQkJLyogT25seSB1cGRhdGUgdGhlIHRpbWVvdXQgaWYgdGhlIG5ldyB0aW1lb3V0IGlzIGF0IGxlYXN0Ci0JCSAgIEhaIGppZmZpZXMgZnJvbSB0aGUgb2xkIHRpbWVvdXQuIE5lZWQgZGVsX3RpbWVyIGZvciByYWNlCi0JCSAgIGF2b2lkYW5jZSAobWF5IGFscmVhZHkgYmUgZHlpbmcpLiAqLwotCQlpZiAobmV3dGltZSAtIGN0LT50aW1lb3V0LmV4cGlyZXMgPj0gSFopCi0JCQltb2RfdGltZXJfcGVuZGluZygmY3QtPnRpbWVvdXQsIG5ld3RpbWUpOwotCX0KLQorCWN0LT50aW1lb3V0ID0gZXh0cmFfamlmZmllczsKIGFjY3Q6CiAJaWYgKGRvX2FjY3QpCiAJCW5mX2N0X2FjY3RfdXBkYXRlKGN0LCBjdGluZm8sIHNrYi0+bGVuKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKF9fbmZfY3RfcmVmcmVzaF9hY2N0KTsKIAotYm9vbCBfX25mX2N0X2tpbGxfYWNjdChzdHJ1Y3QgbmZfY29ubiAqY3QsCi0JCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJICAgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgICAgICBpbnQgZG9fYWNjdCkKK2Jvb2wgbmZfY3Rfa2lsbF9hY2N0KHN0cnVjdCBuZl9jb25uICpjdCwKKwkJICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKKwkJICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCWlmIChkb19hY2N0KQotCQluZl9jdF9hY2N0X3VwZGF0ZShjdCwgY3RpbmZvLCBza2ItPmxlbik7CisJbmZfY3RfYWNjdF91cGRhdGUoY3QsIGN0aW5mbywgc2tiLT5sZW4pOwogCi0JaWYgKGRlbF90aW1lcigmY3QtPnRpbWVvdXQpKSB7Ci0JCWN0LT50aW1lb3V0LmZ1bmN0aW9uKCh1bnNpZ25lZCBsb25nKWN0KTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gbmZfY3RfZGVsZXRlKGN0LCAwLCAwKTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKF9fbmZfY3Rfa2lsbF9hY2N0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X2tpbGxfYWNjdCk7CiAKICNpZiBJU19FTkFCTEVEKENPTkZJR19ORl9DVF9ORVRMSU5LKQogCkBAIC0xNTA1LDExICsxNTYxLDggQEAKIAogCXdoaWxlICgoY3QgPSBnZXRfbmV4dF9jb3Jwc2UobmV0LCBpdGVyLCBkYXRhLCAmYnVja2V0KSkgIT0gTlVMTCkgewogCQkvKiBUaW1lIHRvIHB1c2ggdXAgZGFpc2VzLi4uICovCi0JCWlmIChkZWxfdGltZXIoJmN0LT50aW1lb3V0KSkKLQkJCW5mX2N0X2RlbGV0ZShjdCwgcG9ydGlkLCByZXBvcnQpOwogCi0JCS8qIC4uLiBlbHNlIHRoZSB0aW1lciB3aWxsIGdldCBoaW0gc29vbi4gKi8KLQorCQluZl9jdF9kZWxldGUoY3QsIHBvcnRpZCwgcmVwb3J0KTsKIAkJbmZfY3RfcHV0KGN0KTsKIAkJY29uZF9yZXNjaGVkKCk7CiAJfQpAQCAtMTU0NSw2ICsxNTk4LDcgQEAKIAogdm9pZCBuZl9jb25udHJhY2tfY2xlYW51cF9zdGFydCh2b2lkKQogeworCWNvbm50cmFja19nY193b3JrLmV4aXRpbmcgPSB0cnVlOwogCVJDVV9JTklUX1BPSU5URVIoaXBfY3RfYXR0YWNoLCBOVUxMKTsKIH0KIApAQCAtMTU1NCw2ICsxNjA4LDcgQEAKIAl3aGlsZSAodW50cmFja19yZWZzKCkgPiAwKQogCQlzY2hlZHVsZSgpOwogCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZjb25udHJhY2tfZ2Nfd29yay5kd29yayk7CiAJbmZfY3RfZnJlZV9oYXNodGFibGUobmZfY29ubnRyYWNrX2hhc2gsIG5mX2Nvbm50cmFja19odGFibGVfc2l6ZSk7CiAKIAluZl9jb25udHJhY2tfcHJvdG9fZmluaSgpOwpAQCAtMTgyOCw2ICsxODgzLDEwIEBACiAJfQogCS8qICAtIGFuZCBsb29rIGl0IGxpa2UgYXMgYSBjb25maXJtZWQgY29ubmVjdGlvbiAqLwogCW5mX2N0X3VudHJhY2tlZF9zdGF0dXNfb3IoSVBTX0NPTkZJUk1FRCB8IElQU19VTlRSQUNLRUQpOworCisJY29ubnRyYWNrX2djX3dvcmtfaW5pdCgmY29ubnRyYWNrX2djX3dvcmspOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY29ubnRyYWNrX2djX3dvcmsuZHdvcmssIEdDX0lOVEVSVkFMKTsKKwogCXJldHVybiAwOwogCiBlcnJfcHJvdG86CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5jCmluZGV4IGQyODAxMWIuLmRhOWRmMmQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5jCkBAIC00OSw4ICs0OSwxMyBAQAogCiAJaGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnkoaCwgbiwgJnBjcHUtPmR5aW5nLCBobm5vZGUpIHsKIAkJc3RydWN0IG5mX2Nvbm4gKmN0ID0gbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhoKTsKKwkJc3RydWN0IG5mX2Nvbm50cmFja19lY2FjaGUgKmU7CiAKLQkJaWYgKG5mX2N0X2lzX2R5aW5nKGN0KSkKKwkJaWYgKCFuZl9jdF9pc19jb25maXJtZWQoY3QpKQorCQkJY29udGludWU7CisKKwkJZSA9IG5mX2N0X2VjYWNoZV9maW5kKGN0KTsKKwkJaWYgKCFlIHx8IGUtPnN0YXRlICE9IE5GQ1RfRUNBQ0hFX0RFU1RST1lfRkFJTCkKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChuZl9jb25udHJhY2tfZXZlbnQoSVBDVF9ERVNUUk9ZLCBjdCkpIHsKQEAgLTU4LDggKzYzLDcgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJLyogd2UndmUgZ290IHRoZSBldmVudCBkZWxpdmVyZWQsIG5vdyBpdCdzIGR5aW5nICovCi0JCXNldF9iaXQoSVBTX0RZSU5HX0JJVCwgJmN0LT5zdGF0dXMpOworCQllLT5zdGF0ZSA9IE5GQ1RfRUNBQ0hFX0RFU1RST1lfU0VOVDsKIAkJcmVmc1tldmljdGVkXSA9IGN0OwogCiAJCWlmICgrK2V2aWN0ZWQgPj0gQVJSQVlfU0laRShyZWZzKSkgewpAQCAtMTMwLDcgKzEzNCw3IEBACiAJaWYgKCFlKQogCQlnb3RvIG91dF91bmxvY2s7CiAKLQlpZiAobmZfY3RfaXNfY29uZmlybWVkKGN0KSAmJiAhbmZfY3RfaXNfZHlpbmcoY3QpKSB7CisJaWYgKG5mX2N0X2lzX2NvbmZpcm1lZChjdCkpIHsKIAkJc3RydWN0IG5mX2N0X2V2ZW50IGl0ZW0gPSB7CiAJCQkuY3QJPSBjdCwKIAkJCS5wb3J0aWQJPSBlLT5wb3J0aWQgPyBlLT5wb3J0aWQgOiBwb3J0aWQsCkBAIC0xNTAsMTEgKzE1NCwxMyBAQAogCQkJCSAqIHRyaWdnZXJlZCBieSBhIHByb2Nlc3MsIHdlIHN0b3JlIHRoZSBQT1JUSUQKIAkJCQkgKiB0byBpbmNsdWRlIGl0IGluIHRoZSByZXRyYW5zbWlzc2lvbi4KIAkJCQkgKi8KLQkJCQlpZiAoZXZlbnRtYXNrICYgKDEgPDwgSVBDVF9ERVNUUk9ZKSAmJgotCQkJCSAgICBlLT5wb3J0aWQgPT0gMCAmJiBwb3J0aWQgIT0gMCkKLQkJCQkJZS0+cG9ydGlkID0gcG9ydGlkOwotCQkJCWVsc2UKKwkJCQlpZiAoZXZlbnRtYXNrICYgKDEgPDwgSVBDVF9ERVNUUk9ZKSkgeworCQkJCQlpZiAoZS0+cG9ydGlkID09IDAgJiYgcG9ydGlkICE9IDApCisJCQkJCQllLT5wb3J0aWQgPSBwb3J0aWQ7CisJCQkJCWUtPnN0YXRlID0gTkZDVF9FQ0FDSEVfREVTVFJPWV9GQUlMOworCQkJCX0gZWxzZSB7CiAJCQkJCWUtPm1pc3NlZCB8PSBldmVudG1hc2s7CisJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQllLT5taXNzZWQgJj0gfm1pc3NlZDsKIAkJCX0KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0LmMKaW5kZXggOWUzNjkzMS4uZjhkYmFjZiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0LmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0LmMKQEAgLTU3NCw3ICs1NzQsNyBAQAogCWhlbHBlciA9IHJjdV9kZXJlZmVyZW5jZShuZmN0X2hlbHAoZXhwZWN0LT5tYXN0ZXIpLT5oZWxwZXIpOwogCWlmIChoZWxwZXIpIHsKIAkJc2VxX3ByaW50ZihzLCAiJXMlcyIsIGV4cGVjdC0+ZmxhZ3MgPyAiICIgOiAiIiwgaGVscGVyLT5uYW1lKTsKLQkJaWYgKGhlbHBlci0+ZXhwZWN0X3BvbGljeVtleHBlY3QtPmNsYXNzXS5uYW1lKQorCQlpZiAoaGVscGVyLT5leHBlY3RfcG9saWN5W2V4cGVjdC0+Y2xhc3NdLm5hbWVbMF0pCiAJCQlzZXFfcHJpbnRmKHMsICIvJXMiLAogCQkJCSAgIGhlbHBlci0+ZXhwZWN0X3BvbGljeVtleHBlY3QtPmNsYXNzXS5uYW1lKTsKIAl9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19mdHAuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jCmluZGV4IDQzMTQ3MDAuLmUzZWQyMDAgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jCkBAIC0yMzcsNyArMjM3LDcgQEAKIAl9CiAJZGVsaW0gPSBkYXRhWzBdOwogCWlmIChpc2RpZ2l0KGRlbGltKSB8fCBkZWxpbSA8IDMzIHx8IGRlbGltID4gMTI2IHx8IGRhdGFbMl0gIT0gZGVsaW0pIHsKLQkJcHJfZGVidWcoInRyeV9lcHJ0OiBpbnZhbGlkIGRlbGltaXR0ZXIuXG4iKTsKKwkJcHJfZGVidWcoInRyeV9lcHJ0OiBpbnZhbGlkIGRlbGltaXRlci5cbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTMwMSw4ICszMDEsNiBAQAogCXNpemVfdCBpID0gcGxlbjsKIAogCXByX2RlYnVnKCJmaW5kX3BhdHRlcm4gYCVzJzogZGxlbiA9ICVadVxuIiwgcGF0dGVybiwgZGxlbik7Ci0JaWYgKGRsZW4gPT0gMCkKLQkJcmV0dXJuIDA7CiAKIAlpZiAoZGxlbiA8PSBwbGVuKSB7CiAJCS8qIFNob3J0IHBhY2tldDogdHJ5IGZvciBwYXJ0aWFsPyAqLwpAQCAtMzExLDE5ICszMDksOCBAQAogCQllbHNlIHJldHVybiAwOwogCX0KIAotCWlmIChzdHJuY2FzZWNtcChkYXRhLCBwYXR0ZXJuLCBwbGVuKSAhPSAwKSB7Ci0jaWYgMAotCQlzaXplX3QgaTsKLQotCQlwcl9kZWJ1ZygiZnRwOiBzdHJpbmcgbWlzbWF0Y2hcbiIpOwotCQlmb3IgKGkgPSAwOyBpIDwgcGxlbjsgaSsrKSB7Ci0JCQlwcl9kZWJ1ZygiZnRwOmNoYXIgJXUgYCVjJygldSkgdnMgYCVjJygldSlcbiIsCi0JCQkJIGksIGRhdGFbaV0sIGRhdGFbaV0sCi0JCQkJIHBhdHRlcm5baV0sIHBhdHRlcm5baV0pOwotCQl9Ci0jZW5kaWYKKwlpZiAoc3RybmNhc2VjbXAoZGF0YSwgcGF0dGVybiwgcGxlbikgIT0gMCkKIAkJcmV0dXJuIDA7Ci0JfQogCiAJcHJfZGVidWcoIlBhdHRlcm4gbWF0Y2hlcyFcbiIpOwogCS8qIE5vdyB3ZSd2ZSBmb3VuZCB0aGUgY29uc3RhbnQgc3RyaW5nLCB0cnkgdG8gc2tpcApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19tYWluLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oMzIzX21haW4uYwppbmRleCBiYjc3YTk3Li5mNjVkOTM2MyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19tYWluLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19tYWluLmMKQEAgLTczNiw3ICs3MzYsNyBAQAogCWNvbnN0IHN0cnVjdCBuZl9hZmluZm8gKmFmaW5mbzsKIAlpbnQgcmV0ID0gMDsKIAotCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfc2xvdygpICovCisJLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va190aHJlc2ggKi8KIAlhZmluZm8gPSBuZl9nZXRfYWZpbmZvKGZhbWlseSk7CiAJaWYgKCFhZmluZm8pCiAJCXJldHVybiAwOwpAQCAtMTQ3Myw3ICsxNDczLDggQEAKIAkJCQkgInRpbWVvdXQgdG8gJXUgc2Vjb25kcyBmb3IiLAogCQkJCSBpbmZvLT50aW1lb3V0KTsKIAkJCW5mX2N0X2R1bXBfdHVwbGUoJmV4cC0+dHVwbGUpOwotCQkJbW9kX3RpbWVyKCZleHAtPnRpbWVvdXQsIGppZmZpZXMgKyBpbmZvLT50aW1lb3V0ICogSFopOworCQkJbW9kX3RpbWVyX3BlbmRpbmcoJmV4cC0+dGltZW91dCwKKwkJCQkJICBqaWZmaWVzICsgaW5mby0+dGltZW91dCAqIEhaKTsKIAkJfQogCQlzcGluX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2V4cGVjdF9sb2NrKTsKIAl9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5jCmluZGV4IGI5ODliODEuLjMzNmUyMTUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5jCkBAIC0xODksNyArMTg5LDYgQEAKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqaGVscGVyID0gTlVMTDsKIAlzdHJ1Y3QgbmZfY29ubl9oZWxwICpoZWxwOwogCXN0cnVjdCBuZXQgKm5ldCA9IG5mX2N0X25ldChjdCk7Ci0JaW50IHJldCA9IDA7CiAKIAkvKiBXZSBhbHJlYWR5IGdvdCBhIGhlbHBlciBleHBsaWNpdGx5IGF0dGFjaGVkLiBUaGUgZnVuY3Rpb24KIAkgKiBuZl9jb25udHJhY2tfYWx0ZXJfcmVwbHkgLSBpbiBjYXNlIE5BVCBpcyBpbiB1c2UgLSBhc2tzIGZvciBsb29raW5nCkBAIC0yMjMsMTUgKzIyMiwxMyBAQAogCWlmIChoZWxwZXIgPT0gTlVMTCkgewogCQlpZiAoaGVscCkKIAkJCVJDVV9JTklUX1BPSU5URVIoaGVscC0+aGVscGVyLCBOVUxMKTsKLQkJZ290byBvdXQ7CisJCXJldHVybiAwOwogCX0KIAogCWlmIChoZWxwID09IE5VTEwpIHsKIAkJaGVscCA9IG5mX2N0X2hlbHBlcl9leHRfYWRkKGN0LCBoZWxwZXIsIGZsYWdzKTsKLQkJaWYgKGhlbHAgPT0gTlVMTCkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gb3V0OwotCQl9CisJCWlmIChoZWxwID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKIAl9IGVsc2UgewogCQkvKiBXZSBvbmx5IGFsbG93IGhlbHBlciByZS1hc3NpZ25tZW50IG9mIHRoZSBzYW1lIHNvcnQgc2luY2UKIAkJICogd2UgY2Fubm90IHJlYWxsb2NhdGUgdGhlIGhlbHBlciBleHRlbnNpb24gYXJlYS4KQEAgLTI0MCwxMyArMjM3LDEzIEBACiAKIAkJaWYgKHRtcCAmJiB0bXAtPmhlbHAgIT0gaGVscGVyLT5oZWxwKSB7CiAJCQlSQ1VfSU5JVF9QT0lOVEVSKGhlbHAtPmhlbHBlciwgTlVMTCk7Ci0JCQlnb3RvIG91dDsKKwkJCXJldHVybiAwOwogCQl9CiAJfQogCiAJcmN1X2Fzc2lnbl9wb2ludGVyKGhlbHAtPmhlbHBlciwgaGVscGVyKTsKLW91dDoKLQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChfX25mX2N0X3RyeV9hc3NpZ25faGVscGVyKTsKIApAQCAtMzQ5LDcgKzM0Niw3IEBACiAJLyogQ2FsbGVkIGZyb20gdGhlIGhlbHBlciBmdW5jdGlvbiwgdGhpcyBjYWxsIG5ldmVyIGZhaWxzICovCiAJaGVscCA9IG5mY3RfaGVscChjdCk7CiAKLQkvKiByY3VfcmVhZF9sb2NrKCllZCBieSBuZl9ob29rX3Nsb3cgKi8KKwkvKiByY3VfcmVhZF9sb2NrKCllZCBieSBuZl9ob29rX3RocmVzaCAqLwogCWhlbHBlciA9IHJjdV9kZXJlZmVyZW5jZShoZWxwLT5oZWxwZXIpOwogCiAJbmZfbG9nX3BhY2tldChuZl9jdF9uZXQoY3QpLCBuZl9jdF9sM251bShjdCksIDAsIHNrYiwgTlVMTCwgTlVMTCwgTlVMTCwKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYwppbmRleCAwNTBiYjM0Li4yNzU0MDQ1IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jCkBAIC0xNDksMTAgKzE0OSw3IEBACiAKIHN0YXRpYyBpbnQgY3RuZXRsaW5rX2R1bXBfdGltZW91dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCiB7Ci0JbG9uZyB0aW1lb3V0ID0gKChsb25nKWN0LT50aW1lb3V0LmV4cGlyZXMgLSAobG9uZylqaWZmaWVzKSAvIEhaOwotCi0JaWYgKHRpbWVvdXQgPCAwKQotCQl0aW1lb3V0ID0gMDsKKwlsb25nIHRpbWVvdXQgPSBuZl9jdF9leHBpcmVzKGN0KSAvIEhaOwogCiAJaWYgKG5sYV9wdXRfYmUzMihza2IsIENUQV9USU1FT1VULCBodG9ubCh0aW1lb3V0KSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwpAQCAtODE4LDE0ICs4MTUsMjMgQEAKIAlzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqbjsKIAlzdHJ1Y3QgbmZnZW5tc2cgKm5mbXNnID0gbmxtc2dfZGF0YShjYi0+bmxoKTsKIAl1X2ludDhfdCBsM3Byb3RvID0gbmZtc2ctPm5mZ2VuX2ZhbWlseTsKLQlpbnQgcmVzOworCXN0cnVjdCBuZl9jb25uICpuZl9jdF9ldmljdFs4XTsKKwlpbnQgcmVzLCBpOwogCXNwaW5sb2NrX3QgKmxvY2twOwogCiAJbGFzdCA9IChzdHJ1Y3QgbmZfY29ubiAqKWNiLT5hcmdzWzFdOworCWkgPSAwOwogCiAJbG9jYWxfYmhfZGlzYWJsZSgpOwogCWZvciAoOyBjYi0+YXJnc1swXSA8IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZTsgY2ItPmFyZ3NbMF0rKykgewogcmVzdGFydDoKKwkJd2hpbGUgKGkpIHsKKwkJCWktLTsKKwkJCWlmIChuZl9jdF9zaG91bGRfZ2MobmZfY3RfZXZpY3RbaV0pKQorCQkJCW5mX2N0X2tpbGwobmZfY3RfZXZpY3RbaV0pOworCQkJbmZfY3RfcHV0KG5mX2N0X2V2aWN0W2ldKTsKKwkJfQorCiAJCWxvY2twID0gJm5mX2Nvbm50cmFja19sb2Nrc1tjYi0+YXJnc1swXSAlIENPTk5UUkFDS19MT0NLU107CiAJCW5mX2Nvbm50cmFja19sb2NrKGxvY2twKTsKIAkJaWYgKGNiLT5hcmdzWzBdID49IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZSkgewpAQCAtODM3LDYgKzg0MywxMyBAQAogCQkJaWYgKE5GX0NUX0RJUkVDVElPTihoKSAhPSBJUF9DVF9ESVJfT1JJR0lOQUwpCiAJCQkJY29udGludWU7CiAJCQljdCA9IG5mX2N0X3R1cGxlaGFzaF90b19jdHJhY2soaCk7CisJCQlpZiAobmZfY3RfaXNfZXhwaXJlZChjdCkpIHsKKwkJCQlpZiAoaSA8IEFSUkFZX1NJWkUobmZfY3RfZXZpY3QpICYmCisJCQkJICAgIGF0b21pY19pbmNfbm90X3plcm8oJmN0LT5jdF9nZW5lcmFsLnVzZSkpCisJCQkJCW5mX2N0X2V2aWN0W2krK10gPSBjdDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwogCQkJaWYgKCFuZXRfZXEobmV0LCBuZl9jdF9uZXQoY3QpKSkKIAkJCQljb250aW51ZTsKIApAQCAtODc4LDYgKzg5MSwxMyBAQAogCWlmIChsYXN0KQogCQluZl9jdF9wdXQobGFzdCk7CiAKKwl3aGlsZSAoaSkgeworCQlpLS07CisJCWlmIChuZl9jdF9zaG91bGRfZ2MobmZfY3RfZXZpY3RbaV0pKQorCQkJbmZfY3Rfa2lsbChuZl9jdF9ldmljdFtpXSk7CisJCW5mX2N0X3B1dChuZl9jdF9ldmljdFtpXSk7CisJfQorCiAJcmV0dXJuIHNrYi0+bGVuOwogfQogCkBAIC0xMTQ3LDkgKzExNjcsNyBAQAogCQl9CiAJfQogCi0JaWYgKGRlbF90aW1lcigmY3QtPnRpbWVvdXQpKQotCQluZl9jdF9kZWxldGUoY3QsIE5FVExJTktfQ0Ioc2tiKS5wb3J0aWQsIG5sbXNnX3JlcG9ydChubGgpKTsKLQorCW5mX2N0X2RlbGV0ZShjdCwgTkVUTElOS19DQihza2IpLnBvcnRpZCwgbmxtc2dfcmVwb3J0KG5saCkpOwogCW5mX2N0X3B1dChjdCk7CiAKIAlyZXR1cm4gMDsKQEAgLTE1MTcsMTEgKzE1MzUsMTAgQEAKIHsKIAl1X2ludDMyX3QgdGltZW91dCA9IG50b2hsKG5sYV9nZXRfYmUzMihjZGFbQ1RBX1RJTUVPVVRdKSk7CiAKLQlpZiAoIWRlbF90aW1lcigmY3QtPnRpbWVvdXQpKQotCQlyZXR1cm4gLUVUSU1FOworCWN0LT50aW1lb3V0ID0gbmZjdF90aW1lX3N0YW1wICsgdGltZW91dCAqIEhaOwogCi0JY3QtPnRpbWVvdXQuZXhwaXJlcyA9IGppZmZpZXMgKyB0aW1lb3V0ICogSFo7Ci0JYWRkX3RpbWVyKCZjdC0+dGltZW91dCk7CisJaWYgKHRlc3RfYml0KElQU19EWUlOR19CSVQsICZjdC0+c3RhdHVzKSkKKwkJcmV0dXJuIC1FVElNRTsKIAogCXJldHVybiAwOwogfQpAQCAtMTcxOSw5ICsxNzM2LDggQEAKIAogCWlmICghY2RhW0NUQV9USU1FT1VUXSkKIAkJZ290byBlcnIxOwotCWN0LT50aW1lb3V0LmV4cGlyZXMgPSBudG9obChubGFfZ2V0X2JlMzIoY2RhW0NUQV9USU1FT1VUXSkpOwogCi0JY3QtPnRpbWVvdXQuZXhwaXJlcyA9IGppZmZpZXMgKyBjdC0+dGltZW91dC5leHBpcmVzICogSFo7CisJY3QtPnRpbWVvdXQgPSBuZmN0X3RpbWVfc3RhbXAgKyBudG9obChubGFfZ2V0X2JlMzIoY2RhW0NUQV9USU1FT1VUXSkpICogSFo7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAgCWlmIChjZGFbQ1RBX0hFTFBdKSB7CkBAIC0xODk0LDYgKzE5MTAsOCBAQAogCiAJCQlpZiAoIWNkYVtDVEFfVFVQTEVfT1JJR10gfHwgIWNkYVtDVEFfVFVQTEVfUkVQTFldKQogCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKG90dXBsZS5kc3QucHJvdG9udW0gIT0gcnR1cGxlLmRzdC5wcm90b251bSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQkJY3QgPSBjdG5ldGxpbmtfY3JlYXRlX2Nvbm50cmFjayhuZXQsICZ6b25lLCBjZGEsICZvdHVwbGUsCiAJCQkJCQkJJnJ0dXBsZSwgdTMpOwpAQCAtMTk2NiwxMyArMTk4NCw5IEBACiAJbmZtc2ctPnZlcnNpb24gICAgICA9IE5GTkVUTElOS19WMDsKIAluZm1zZy0+cmVzX2lkCSAgICA9IGh0b25zKGNwdSk7CiAKLQlpZiAobmxhX3B1dF9iZTMyKHNrYiwgQ1RBX1NUQVRTX1NFQVJDSEVELCBodG9ubChzdC0+c2VhcmNoZWQpKSB8fAotCSAgICBubGFfcHV0X2JlMzIoc2tiLCBDVEFfU1RBVFNfRk9VTkQsIGh0b25sKHN0LT5mb3VuZCkpIHx8Ci0JICAgIG5sYV9wdXRfYmUzMihza2IsIENUQV9TVEFUU19ORVcsIGh0b25sKHN0LT5uZXcpKSB8fAorCWlmIChubGFfcHV0X2JlMzIoc2tiLCBDVEFfU1RBVFNfRk9VTkQsIGh0b25sKHN0LT5mb3VuZCkpIHx8CiAJICAgIG5sYV9wdXRfYmUzMihza2IsIENUQV9TVEFUU19JTlZBTElELCBodG9ubChzdC0+aW52YWxpZCkpIHx8CiAJICAgIG5sYV9wdXRfYmUzMihza2IsIENUQV9TVEFUU19JR05PUkUsIGh0b25sKHN0LT5pZ25vcmUpKSB8fAotCSAgICBubGFfcHV0X2JlMzIoc2tiLCBDVEFfU1RBVFNfREVMRVRFLCBodG9ubChzdC0+ZGVsZXRlKSkgfHwKLQkgICAgbmxhX3B1dF9iZTMyKHNrYiwgQ1RBX1NUQVRTX0RFTEVURV9MSVNULCBodG9ubChzdC0+ZGVsZXRlX2xpc3QpKSB8fAogCSAgICBubGFfcHV0X2JlMzIoc2tiLCBDVEFfU1RBVFNfSU5TRVJULCBodG9ubChzdC0+aW5zZXJ0KSkgfHwKIAkgICAgbmxhX3B1dF9iZTMyKHNrYiwgQ1RBX1NUQVRTX0lOU0VSVF9GQUlMRUQsCiAJCQkJaHRvbmwoc3QtPmluc2VydF9mYWlsZWQpKSB8fApAQCAtMjM2MiwxMiArMjM3Niw4IEBACiAJCXJldHVybiBQVFJfRVJSKGV4cCk7CiAKIAllcnIgPSBuZl9jdF9leHBlY3RfcmVsYXRlZF9yZXBvcnQoZXhwLCBwb3J0aWQsIHJlcG9ydCk7Ci0JaWYgKGVyciA8IDApIHsKLQkJbmZfY3RfZXhwZWN0X3B1dChleHApOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCXJldHVybiAwOworCW5mX2N0X2V4cGVjdF9wdXQoZXhwKTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBjdG5ldGxpbmtfZ2x1ZV9zZXFhZGooc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5mX2Nvbm4gKmN0LApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHB0cC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHB0cC5jCmluZGV4IDU1ODhjN2EuLmY2MGE0NzUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3BwdHAuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcHRwLmMKQEAgLTE1Nyw4ICsxNTcsNyBAQAogCQlwcl9kZWJ1Zygic2V0dGluZyB0aW1lb3V0IG9mIGNvbm50cmFjayAlcCB0byAwXG4iLCBzaWJsaW5nKTsKIAkJc2libGluZy0+cHJvdG8uZ3JlLnRpbWVvdXQJICA9IDA7CiAJCXNpYmxpbmctPnByb3RvLmdyZS5zdHJlYW1fdGltZW91dCA9IDA7Ci0JCWlmIChkZWxfdGltZXIoJnNpYmxpbmctPnRpbWVvdXQpKQotCQkJc2libGluZy0+dGltZW91dC5mdW5jdGlvbigodW5zaWduZWQgbG9uZylzaWJsaW5nKTsKKwkJbmZfY3Rfa2lsbChzaWJsaW5nKTsKIAkJbmZfY3RfcHV0KHNpYmxpbmcpOwogCQlyZXR1cm4gMTsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG8uYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvLmMKaW5kZXggYjY1ZDU4Ni4uOGQyYzdkOCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG8uYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90by5jCkBAIC0xNTksNTQgKzE1OSw2IEBACiAJICAgICAgIG5mX2N0X2wzbnVtKGkpID09IGw0cHJvdG8tPmwzcHJvdG87CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbmZfaXBfbmV0ICpuZl9jdF9sM3Byb3RvX25ldChzdHJ1Y3QgbmV0ICpuZXQsCi0JCQkJCSAgIHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqbDNwcm90bykKLXsKLQlpZiAobDNwcm90by0+bDNwcm90byA9PSBQRl9JTkVUKQotCQlyZXR1cm4gJm5ldC0+Y3QubmZfY3RfcHJvdG87Ci0JZWxzZQotCQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCBuZl9jdF9sM3Byb3RvX3JlZ2lzdGVyX3N5c2N0bChzdHJ1Y3QgbmV0ICpuZXQsCi0JCQkJCSBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKmwzcHJvdG8pCi17Ci0JaW50IGVyciA9IDA7Ci0Jc3RydWN0IG5mX2lwX25ldCAqaW4gPSBuZl9jdF9sM3Byb3RvX25ldChuZXQsIGwzcHJvdG8pOwotCS8qIG5mX2Nvbm50cmFja19sM3Byb3RvX2lwdjYgZG9lc24ndCBzdXBwb3J0IHN5c2N0bCAqLwotCWlmIChpbiA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQotI2lmIGRlZmluZWQoQ09ORklHX1NZU0NUTCkgJiYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUKQotCWlmIChpbi0+Y3RsX3RhYmxlICE9IE5VTEwpIHsKLQkJZXJyID0gbmZfY3RfcmVnaXN0ZXJfc3lzY3RsKG5ldCwKLQkJCQkJICAgICZpbi0+Y3RsX3RhYmxlX2hlYWRlciwKLQkJCQkJICAgIGwzcHJvdG8tPmN0bF90YWJsZV9wYXRoLAotCQkJCQkgICAgaW4tPmN0bF90YWJsZSk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlrZnJlZShpbi0+Y3RsX3RhYmxlKTsKLQkJCWluLT5jdGxfdGFibGUgPSBOVUxMOwotCQl9Ci0JfQotI2VuZGlmCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgbmZfY3RfbDNwcm90b191bnJlZ2lzdGVyX3N5c2N0bChzdHJ1Y3QgbmV0ICpuZXQsCi0JCQkJCSAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKmwzcHJvdG8pCi17Ci0Jc3RydWN0IG5mX2lwX25ldCAqaW4gPSBuZl9jdF9sM3Byb3RvX25ldChuZXQsIGwzcHJvdG8pOwotCi0JaWYgKGluID09IE5VTEwpCi0JCXJldHVybjsKLSNpZiBkZWZpbmVkKENPTkZJR19TWVNDVEwpICYmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCkKLQlpZiAoaW4tPmN0bF90YWJsZV9oZWFkZXIgIT0gTlVMTCkKLQkJbmZfY3RfdW5yZWdpc3Rlcl9zeXNjdGwoJmluLT5jdGxfdGFibGVfaGVhZGVyLAotCQkJCQkmaW4tPmN0bF90YWJsZSwKLQkJCQkJMCk7Ci0jZW5kaWYKLX0KLQogaW50IG5mX2N0X2wzcHJvdG9fcmVnaXN0ZXIoc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpwcm90bykKIHsKIAlpbnQgcmV0ID0gMDsKQEAgLTI0MSw3ICsxOTMsNyBAQAogaW50IG5mX2N0X2wzcHJvdG9fcGVybmV0X3JlZ2lzdGVyKHN0cnVjdCBuZXQgKm5ldCwKIAkJCQkgIHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqcHJvdG8pCiB7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldDsKIAogCWlmIChwcm90by0+aW5pdF9uZXQpIHsKIAkJcmV0ID0gcHJvdG8tPmluaXRfbmV0KG5ldCk7CkBAIC0yNDksNyArMjAxLDcgQEAKIAkJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0dXJuIG5mX2N0X2wzcHJvdG9fcmVnaXN0ZXJfc3lzY3RsKG5ldCwgcHJvdG8pOworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfbDNwcm90b19wZXJuZXRfcmVnaXN0ZXIpOwogCkBAIC0yNzIsOCArMjI0LDYgQEAKIHZvaWQgbmZfY3RfbDNwcm90b19wZXJuZXRfdW5yZWdpc3RlcihzdHJ1Y3QgbmV0ICpuZXQsCiAJCQkJICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKnByb3RvKQogewotCW5mX2N0X2wzcHJvdG9fdW5yZWdpc3Rlcl9zeXNjdGwobmV0LCBwcm90byk7Ci0KIAkvKiBSZW1vdmUgYWxsIGNvbnRyYWNrIGVudHJpZXMgZm9yIHRoaXMgcHJvdG9jb2wgKi8KIAluZl9jdF9pdGVyYXRlX2NsZWFudXAobmV0LCBraWxsX2wzcHJvdG8sIHByb3RvLCAwLCAwKTsKIH0KQEAgLTMxMiwyNiArMjYyLDYgQEAKIAkJCX0KIAkJfQogCX0KLSNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUCi0JaWYgKGw0cHJvdG8tPmwzcHJvdG8gIT0gQUZfSU5FVDYgJiYgcG4tPmN0bF9jb21wYXRfdGFibGUgIT0gTlVMTCkgewotCQlpZiAoZXJyIDwgMCkgewotCQkJbmZfY3Rfa2ZyZWVfY29tcGF0X3N5c2N0bF90YWJsZShwbik7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQllcnIgPSBuZl9jdF9yZWdpc3Rlcl9zeXNjdGwobmV0LAotCQkJCQkgICAgJnBuLT5jdGxfY29tcGF0X2hlYWRlciwKLQkJCQkJICAgICJuZXQvaXB2NC9uZXRmaWx0ZXIiLAotCQkJCQkgICAgcG4tPmN0bF9jb21wYXRfdGFibGUpOwotCQlpZiAoZXJyID09IDApCi0JCQlnb3RvIG91dDsKLQotCQluZl9jdF9rZnJlZV9jb21wYXRfc3lzY3RsX3RhYmxlKHBuKTsKLQkJbmZfY3RfdW5yZWdpc3Rlcl9zeXNjdGwoJnBuLT5jdGxfdGFibGVfaGVhZGVyLAotCQkJCQkmcG4tPmN0bF90YWJsZSwKLQkJCQkJcG4tPnVzZXJzKTsKLQl9Ci1vdXQ6Ci0jZW5kaWYgLyogQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCAqLwogI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KIAlyZXR1cm4gZXJyOwogfQpAQCAtMzQ2LDEzICsyNzYsNiBAQAogCQluZl9jdF91bnJlZ2lzdGVyX3N5c2N0bCgmcG4tPmN0bF90YWJsZV9oZWFkZXIsCiAJCQkJCSZwbi0+Y3RsX3RhYmxlLAogCQkJCQlwbi0+dXNlcnMpOwotCi0jaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVAotCWlmIChsNHByb3RvLT5sM3Byb3RvICE9IEFGX0lORVQ2ICYmIHBuLT5jdGxfY29tcGF0X2hlYWRlciAhPSBOVUxMKQotCQluZl9jdF91bnJlZ2lzdGVyX3N5c2N0bCgmcG4tPmN0bF9jb21wYXRfaGVhZGVyLAotCQkJCQkmcG4tPmN0bF9jb21wYXRfdGFibGUsCi0JCQkJCTApOwotI2VuZGlmIC8qIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQgKi8KICNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCiB9CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2RjY3AuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2RjY3AuYwppbmRleCAzOTlhMzhmLi5hNDViZWU1IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19kY2NwLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZGNjcC5jCkBAIC00MDIsNyArNDAyLDggQEAKIHsKIAlzdHJ1Y3QgZGNjcF9oZHIgX2hkciwgKmRoOwogCi0JZGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBkYXRhb2ZmLCBzaXplb2YoX2hkciksICZfaGRyKTsKKwkvKiBBY3R1YWxseSBvbmx5IG5lZWQgZmlyc3QgNCBieXRlcyB0byBnZXQgcG9ydHMuICovCisJZGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBkYXRhb2ZmLCA0LCAmX2hkcik7CiAJaWYgKGRoID09IE5VTEwpCiAJCXJldHVybiBmYWxzZTsKIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYy5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ2VuZXJpYy5jCmluZGV4IDg2ZGM3NTIuLmQ1ODY4YmEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2dlbmVyaWMuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19nZW5lcmljLmMKQEAgLTE1MSwxNyArMTUxLDYgQEAKIAl9LAogCXsgfQogfTsKLSNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUCi1zdGF0aWMgc3RydWN0IGN0bF90YWJsZSBnZW5lcmljX2NvbXBhdF9zeXNjdGxfdGFibGVbXSA9IHsKLQl7Ci0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfZ2VuZXJpY190aW1lb3V0IiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsgfQotfTsKLSNlbmRpZiAvKiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUICovCiAjZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLwogCiBzdGF0aWMgaW50IGdlbmVyaWNfa21lbWR1cF9zeXNjdGxfdGFibGUoc3RydWN0IG5mX3Byb3RvX25ldCAqcG4sCkBAIC0xNzksNDAgKzE2OCwxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGdlbmVyaWNfa21lbWR1cF9jb21wYXRfc3lzY3RsX3RhYmxlKHN0cnVjdCBuZl9wcm90b19uZXQgKnBuLAotCQkJCQkgICAgICAgc3RydWN0IG5mX2dlbmVyaWNfbmV0ICpnbikKLXsKLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0jaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVAotCXBuLT5jdGxfY29tcGF0X3RhYmxlID0ga21lbWR1cChnZW5lcmljX2NvbXBhdF9zeXNjdGxfdGFibGUsCi0JCQkJICAgICAgIHNpemVvZihnZW5lcmljX2NvbXBhdF9zeXNjdGxfdGFibGUpLAotCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKLQlpZiAoIXBuLT5jdGxfY29tcGF0X3RhYmxlKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBuLT5jdGxfY29tcGF0X3RhYmxlWzBdLmRhdGEgPSAmZ24tPnRpbWVvdXQ7Ci0jZW5kaWYKLSNlbmRpZgotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGdlbmVyaWNfaW5pdF9uZXQoc3RydWN0IG5ldCAqbmV0LCB1X2ludDE2X3QgcHJvdG8pCiB7Ci0JaW50IHJldDsKIAlzdHJ1Y3QgbmZfZ2VuZXJpY19uZXQgKmduID0gZ2VuZXJpY19wZXJuZXQobmV0KTsKIAlzdHJ1Y3QgbmZfcHJvdG9fbmV0ICpwbiA9ICZnbi0+cG47CiAKIAlnbi0+dGltZW91dCA9IG5mX2N0X2dlbmVyaWNfdGltZW91dDsKIAotCXJldCA9IGdlbmVyaWNfa21lbWR1cF9jb21wYXRfc3lzY3RsX3RhYmxlKHBuLCBnbik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBnZW5lcmljX2ttZW1kdXBfc3lzY3RsX3RhYmxlKHBuLCBnbik7Ci0JaWYgKHJldCA8IDApCi0JCW5mX2N0X2tmcmVlX2NvbXBhdF9zeXNjdGxfdGFibGUocG4pOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gZ2VuZXJpY19rbWVtZHVwX3N5c2N0bF90YWJsZShwbiwgZ24pOwogfQogCiBzdGF0aWMgc3RydWN0IG5mX3Byb3RvX25ldCAqZ2VuZXJpY19nZXRfbmV0X3Byb3RvKHN0cnVjdCBuZXQgKm5ldCkKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2dyZS5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ3JlLmMKaW5kZXggYTk2NDUxYS4uOWE3MTVmOCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ3JlLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ3JlLmMKQEAgLTE5MiwxNSArMTkyLDE1IEBACiBzdGF0aWMgYm9vbCBncmVfcGt0X3RvX3R1cGxlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBkYXRhb2ZmLAogCQkJICAgICBzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQogewotCWNvbnN0IHN0cnVjdCBncmVfaGRyX3BwdHAgKnBncmVoZHI7Ci0Jc3RydWN0IGdyZV9oZHJfcHB0cCBfcGdyZWhkcjsKKwljb25zdCBzdHJ1Y3QgcHB0cF9ncmVfaGVhZGVyICpwZ3JlaGRyOworCXN0cnVjdCBwcHRwX2dyZV9oZWFkZXIgX3BncmVoZHI7CiAJX19iZTE2IHNyY2tleTsKLQljb25zdCBzdHJ1Y3QgZ3JlX2hkciAqZ3JlaGRyOwotCXN0cnVjdCBncmVfaGRyIF9ncmVoZHI7CisJY29uc3Qgc3RydWN0IGdyZV9iYXNlX2hkciAqZ3JlaGRyOworCXN0cnVjdCBncmVfYmFzZV9oZHIgX2dyZWhkcjsKIAogCS8qIGZpcnN0IG9ubHkgZGVsaW5lYXJpemUgb2xkIFJGQzE3MDEgR1JFIGhlYWRlciAqLwogCWdyZWhkciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGRhdGFvZmYsIHNpemVvZihfZ3JlaGRyKSwgJl9ncmVoZHIpOwotCWlmICghZ3JlaGRyIHx8IGdyZWhkci0+dmVyc2lvbiAhPSBHUkVfVkVSU0lPTl9QUFRQKSB7CisJaWYgKCFncmVoZHIgfHwgKGdyZWhkci0+ZmxhZ3MgJiBHUkVfVkVSU0lPTikgIT0gR1JFX1ZFUlNJT05fMSkgewogCQkvKiB0cnkgdG8gYmVoYXZlIGxpa2UgIm5mX2Nvbm50cmFja19wcm90b19nZW5lcmljIiAqLwogCQl0dXBsZS0+c3JjLnUuYWxsID0gMDsKIAkJdHVwbGUtPmRzdC51LmFsbCA9IDA7CkBAIC0yMTIsOCArMjEyLDggQEAKIAlpZiAoIXBncmVoZHIpCiAJCXJldHVybiB0cnVlOwogCi0JaWYgKG50b2hzKGdyZWhkci0+cHJvdG9jb2wpICE9IEdSRV9QUk9UT0NPTF9QUFRQKSB7Ci0JCXByX2RlYnVnKCJHUkVfVkVSU0lPTl9QUFRQIGJ1dCB1bmtub3duIHByb3RvXG4iKTsKKwlpZiAoZ3JlaGRyLT5wcm90b2NvbCAhPSBHUkVfUFJPVE9fUFBQKSB7CisJCXByX2RlYnVnKCJVbnN1cHBvcnRlZCBHUkUgcHJvdG8oMHgleClcbiIsIG50b2hzKGdyZWhkci0+cHJvdG9jb2wpKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fc2N0cC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fc2N0cC5jCmluZGV4IDFkN2FiOTYuLjk4MmVhNjIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3NjdHAuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19zY3RwLmMKQEAgLTE2MSw4ICsxNjEsOCBAQAogCWNvbnN0IHN0cnVjdCBzY3RwaGRyICpocDsKIAlzdHJ1Y3Qgc2N0cGhkciBfaGRyOwogCi0JLyogQWN0dWFsbHkgb25seSBuZWVkIGZpcnN0IDggYnl0ZXMuICovCi0JaHAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBkYXRhb2ZmLCA4LCAmX2hkcik7CisJLyogQWN0dWFsbHkgb25seSBuZWVkIGZpcnN0IDQgYnl0ZXMgdG8gZ2V0IHBvcnRzLiAqLworCWhwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgZGF0YW9mZiwgNCwgJl9oZHIpOwogCWlmIChocCA9PSBOVUxMKQogCQlyZXR1cm4gZmFsc2U7CiAKQEAgLTcwNSw1NCArNzA1LDYgQEAKIAl9LAogCXsgfQogfTsKLQotI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQKLXN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIHNjdHBfY29tcGF0X3N5c2N0bF90YWJsZVtdID0gewotCXsKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19zY3RwX3RpbWVvdXRfY2xvc2VkIiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19zY3RwX3RpbWVvdXRfY29va2llX3dhaXQiLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3NjdHBfdGltZW91dF9jb29raWVfZWNob2VkIiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19zY3RwX3RpbWVvdXRfZXN0YWJsaXNoZWQiLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3NjdHBfdGltZW91dF9zaHV0ZG93bl9zZW50IiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19zY3RwX3RpbWVvdXRfc2h1dGRvd25fcmVjZCIsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfc2N0cF90aW1lb3V0X3NodXRkb3duX2Fja19zZW50IiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsgfQotfTsKLSNlbmRpZiAvKiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUICovCiAjZW5kaWYKIAogc3RhdGljIGludCBzY3RwX2ttZW1kdXBfc3lzY3RsX3RhYmxlKHN0cnVjdCBuZl9wcm90b19uZXQgKnBuLApAQCAtNzgxLDMyICs3MzMsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNjdHBfa21lbWR1cF9jb21wYXRfc3lzY3RsX3RhYmxlKHN0cnVjdCBuZl9wcm90b19uZXQgKnBuLAotCQkJCQkgICAgc3RydWN0IHNjdHBfbmV0ICpzbikKLXsKLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0jaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVAotCXBuLT5jdGxfY29tcGF0X3RhYmxlID0ga21lbWR1cChzY3RwX2NvbXBhdF9zeXNjdGxfdGFibGUsCi0JCQkJICAgICAgIHNpemVvZihzY3RwX2NvbXBhdF9zeXNjdGxfdGFibGUpLAotCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKLQlpZiAoIXBuLT5jdGxfY29tcGF0X3RhYmxlKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBuLT5jdGxfY29tcGF0X3RhYmxlWzBdLmRhdGEgPSAmc24tPnRpbWVvdXRzW1NDVFBfQ09OTlRSQUNLX0NMT1NFRF07Ci0JcG4tPmN0bF9jb21wYXRfdGFibGVbMV0uZGF0YSA9ICZzbi0+dGltZW91dHNbU0NUUF9DT05OVFJBQ0tfQ09PS0lFX1dBSVRdOwotCXBuLT5jdGxfY29tcGF0X3RhYmxlWzJdLmRhdGEgPSAmc24tPnRpbWVvdXRzW1NDVFBfQ09OTlRSQUNLX0NPT0tJRV9FQ0hPRURdOwotCXBuLT5jdGxfY29tcGF0X3RhYmxlWzNdLmRhdGEgPSAmc24tPnRpbWVvdXRzW1NDVFBfQ09OTlRSQUNLX0VTVEFCTElTSEVEXTsKLQlwbi0+Y3RsX2NvbXBhdF90YWJsZVs0XS5kYXRhID0gJnNuLT50aW1lb3V0c1tTQ1RQX0NPTk5UUkFDS19TSFVURE9XTl9TRU5UXTsKLQlwbi0+Y3RsX2NvbXBhdF90YWJsZVs1XS5kYXRhID0gJnNuLT50aW1lb3V0c1tTQ1RQX0NPTk5UUkFDS19TSFVURE9XTl9SRUNEXTsKLQlwbi0+Y3RsX2NvbXBhdF90YWJsZVs2XS5kYXRhID0gJnNuLT50aW1lb3V0c1tTQ1RQX0NPTk5UUkFDS19TSFVURE9XTl9BQ0tfU0VOVF07Ci0jZW5kaWYKLSNlbmRpZgotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IHNjdHBfaW5pdF9uZXQoc3RydWN0IG5ldCAqbmV0LCB1X2ludDE2X3QgcHJvdG8pCiB7Ci0JaW50IHJldDsKIAlzdHJ1Y3Qgc2N0cF9uZXQgKnNuID0gc2N0cF9wZXJuZXQobmV0KTsKIAlzdHJ1Y3QgbmZfcHJvdG9fbmV0ICpwbiA9ICZzbi0+cG47CiAKQEAgLTgxNywxOCArNzQ1LDcgQEAKIAkJCXNuLT50aW1lb3V0c1tpXSA9IHNjdHBfdGltZW91dHNbaV07CiAJfQogCi0JaWYgKHByb3RvID09IEFGX0lORVQpIHsKLQkJcmV0ID0gc2N0cF9rbWVtZHVwX2NvbXBhdF9zeXNjdGxfdGFibGUocG4sIHNuKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCi0JCXJldCA9IHNjdHBfa21lbWR1cF9zeXNjdGxfdGFibGUocG4sIHNuKTsKLQkJaWYgKHJldCA8IDApCi0JCQluZl9jdF9rZnJlZV9jb21wYXRfc3lzY3RsX3RhYmxlKHBuKTsKLQl9IGVsc2UKLQkJcmV0ID0gc2N0cF9rbWVtZHVwX3N5c2N0bF90YWJsZShwbiwgc24pOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gc2N0cF9rbWVtZHVwX3N5c2N0bF90YWJsZShwbiwgc24pOwogfQogCiBzdGF0aWMgc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvIG5mX2Nvbm50cmFja19sNHByb3RvX3NjdHA0IF9fcmVhZF9tb3N0bHkgPSB7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b190Y3AuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3RjcC5jCmluZGV4IDcwYzgzODEuLjY5ZjY4NzcgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3RjcC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3RjcC5jCkBAIC0yODIsOCArMjgyLDggQEAKIAljb25zdCBzdHJ1Y3QgdGNwaGRyICpocDsKIAlzdHJ1Y3QgdGNwaGRyIF9oZHI7CiAKLQkvKiBBY3R1YWxseSBvbmx5IG5lZWQgZmlyc3QgOCBieXRlcy4gKi8KLQlocCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGRhdGFvZmYsIDgsICZfaGRyKTsKKwkvKiBBY3R1YWxseSBvbmx5IG5lZWQgZmlyc3QgNCBieXRlcyB0byBnZXQgcG9ydHMuICovCisJaHAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBkYXRhb2ZmLCA0LCAmX2hkcik7CiAJaWYgKGhwID09IE5VTEwpCiAJCXJldHVybiBmYWxzZTsKIApAQCAtMTQ4MSw5MCArMTQ4MSw2IEBACiAJfSwKIAl7IH0KIH07Ci0KLSNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUCi1zdGF0aWMgc3RydWN0IGN0bF90YWJsZSB0Y3BfY29tcGF0X3N5c2N0bF90YWJsZVtdID0gewotCXsKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja190Y3BfdGltZW91dF9zeW5fc2VudCIsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX3RpbWVvdXRfc3luX3NlbnQyIiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja190Y3BfdGltZW91dF9zeW5fcmVjdiIsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX3RpbWVvdXRfZXN0YWJsaXNoZWQiLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF90aW1lb3V0X2Zpbl93YWl0IiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja190Y3BfdGltZW91dF9jbG9zZV93YWl0IiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja190Y3BfdGltZW91dF9sYXN0X2FjayIsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX3RpbWVvdXRfdGltZV93YWl0IiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja190Y3BfdGltZW91dF9jbG9zZSIsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX3RpbWVvdXRfbWF4X3JldHJhbnMiLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JewotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF9sb29zZSIsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAotCX0sCi0JewotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3RjcF9iZV9saWJlcmFsIiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfdGNwX21heF9yZXRyYW5zIiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCi0JfSwKLQl7IH0KLX07Ci0jZW5kaWYgLyogQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCAqLwogI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KIAogc3RhdGljIGludCB0Y3Bfa21lbWR1cF9zeXNjdGxfdGFibGUoc3RydWN0IG5mX3Byb3RvX25ldCAqcG4sCkBAIC0xNTk3LDM4ICsxNTEzLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0Y3Bfa21lbWR1cF9jb21wYXRfc3lzY3RsX3RhYmxlKHN0cnVjdCBuZl9wcm90b19uZXQgKnBuLAotCQkJCQkgICBzdHJ1Y3QgbmZfdGNwX25ldCAqdG4pCi17Ci0jaWZkZWYgQ09ORklHX1NZU0NUTAotI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQKLQlwbi0+Y3RsX2NvbXBhdF90YWJsZSA9IGttZW1kdXAodGNwX2NvbXBhdF9zeXNjdGxfdGFibGUsCi0JCQkJICAgICAgIHNpemVvZih0Y3BfY29tcGF0X3N5c2N0bF90YWJsZSksCi0JCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmICghcG4tPmN0bF9jb21wYXRfdGFibGUpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcG4tPmN0bF9jb21wYXRfdGFibGVbMF0uZGF0YSA9ICZ0bi0+dGltZW91dHNbVENQX0NPTk5UUkFDS19TWU5fU0VOVF07Ci0JcG4tPmN0bF9jb21wYXRfdGFibGVbMV0uZGF0YSA9ICZ0bi0+dGltZW91dHNbVENQX0NPTk5UUkFDS19TWU5fU0VOVDJdOwotCXBuLT5jdGxfY29tcGF0X3RhYmxlWzJdLmRhdGEgPSAmdG4tPnRpbWVvdXRzW1RDUF9DT05OVFJBQ0tfU1lOX1JFQ1ZdOwotCXBuLT5jdGxfY29tcGF0X3RhYmxlWzNdLmRhdGEgPSAmdG4tPnRpbWVvdXRzW1RDUF9DT05OVFJBQ0tfRVNUQUJMSVNIRURdOwotCXBuLT5jdGxfY29tcGF0X3RhYmxlWzRdLmRhdGEgPSAmdG4tPnRpbWVvdXRzW1RDUF9DT05OVFJBQ0tfRklOX1dBSVRdOwotCXBuLT5jdGxfY29tcGF0X3RhYmxlWzVdLmRhdGEgPSAmdG4tPnRpbWVvdXRzW1RDUF9DT05OVFJBQ0tfQ0xPU0VfV0FJVF07Ci0JcG4tPmN0bF9jb21wYXRfdGFibGVbNl0uZGF0YSA9ICZ0bi0+dGltZW91dHNbVENQX0NPTk5UUkFDS19MQVNUX0FDS107Ci0JcG4tPmN0bF9jb21wYXRfdGFibGVbN10uZGF0YSA9ICZ0bi0+dGltZW91dHNbVENQX0NPTk5UUkFDS19USU1FX1dBSVRdOwotCXBuLT5jdGxfY29tcGF0X3RhYmxlWzhdLmRhdGEgPSAmdG4tPnRpbWVvdXRzW1RDUF9DT05OVFJBQ0tfQ0xPU0VdOwotCXBuLT5jdGxfY29tcGF0X3RhYmxlWzldLmRhdGEgPSAmdG4tPnRpbWVvdXRzW1RDUF9DT05OVFJBQ0tfUkVUUkFOU107Ci0JcG4tPmN0bF9jb21wYXRfdGFibGVbMTBdLmRhdGEgPSAmdG4tPnRjcF9sb29zZTsKLQlwbi0+Y3RsX2NvbXBhdF90YWJsZVsxMV0uZGF0YSA9ICZ0bi0+dGNwX2JlX2xpYmVyYWw7Ci0JcG4tPmN0bF9jb21wYXRfdGFibGVbMTJdLmRhdGEgPSAmdG4tPnRjcF9tYXhfcmV0cmFuczsKLSNlbmRpZgotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgdGNwX2luaXRfbmV0KHN0cnVjdCBuZXQgKm5ldCwgdV9pbnQxNl90IHByb3RvKQogewotCWludCByZXQ7CiAJc3RydWN0IG5mX3RjcF9uZXQgKnRuID0gdGNwX3Blcm5ldChuZXQpOwogCXN0cnVjdCBuZl9wcm90b19uZXQgKnBuID0gJnRuLT5wbjsKIApAQCAtMTY0MywxOCArMTUyOSw3IEBACiAJCXRuLT50Y3BfbWF4X3JldHJhbnMgPSBuZl9jdF90Y3BfbWF4X3JldHJhbnM7CiAJfQogCi0JaWYgKHByb3RvID09IEFGX0lORVQpIHsKLQkJcmV0ID0gdGNwX2ttZW1kdXBfY29tcGF0X3N5c2N0bF90YWJsZShwbiwgdG4pOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJcmV0ID0gdGNwX2ttZW1kdXBfc3lzY3RsX3RhYmxlKHBuLCB0bik7Ci0JCWlmIChyZXQgPCAwKQotCQkJbmZfY3Rfa2ZyZWVfY29tcGF0X3N5c2N0bF90YWJsZShwbik7Ci0JfSBlbHNlCi0JCXJldCA9IHRjcF9rbWVtZHVwX3N5c2N0bF90YWJsZShwbiwgdG4pOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gdGNwX2ttZW1kdXBfc3lzY3RsX3RhYmxlKHBuLCB0bik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmZfcHJvdG9fbmV0ICp0Y3BfZ2V0X25ldF9wcm90byhzdHJ1Y3QgbmV0ICpuZXQpCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b191ZHAuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5jCmluZGV4IDRmZDA0MDUuLjIwZjM1ZWQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5jCkBAIC00NCw4ICs0NCw4IEBACiAJY29uc3Qgc3RydWN0IHVkcGhkciAqaHA7CiAJc3RydWN0IHVkcGhkciBfaGRyOwogCi0JLyogQWN0dWFsbHkgb25seSBuZWVkIGZpcnN0IDggYnl0ZXMuICovCi0JaHAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBkYXRhb2ZmLCBzaXplb2YoX2hkciksICZfaGRyKTsKKwkvKiBBY3R1YWxseSBvbmx5IG5lZWQgZmlyc3QgNCBieXRlcyB0byBnZXQgcG9ydHMuICovCisJaHAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBkYXRhb2ZmLCA0LCAmX2hkcik7CiAJaWYgKGhwID09IE5VTEwpCiAJCXJldHVybiBmYWxzZTsKIApAQCAtMjE4LDIzICsyMTgsNiBAQAogCX0sCiAJeyB9CiB9OwotI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQKLXN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIHVkcF9jb21wYXRfc3lzY3RsX3RhYmxlW10gPSB7Ci0JewotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX3VkcF90aW1lb3V0IiwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKLQl9LAotCXsKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja191ZHBfdGltZW91dF9zdHJlYW0iLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JeyB9Ci19OwotI2VuZGlmIC8qIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQgKi8KICNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCiAKIHN0YXRpYyBpbnQgdWRwX2ttZW1kdXBfc3lzY3RsX3RhYmxlKHN0cnVjdCBuZl9wcm90b19uZXQgKnBuLApAQCAtMjU0LDI3ICsyMzcsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHVkcF9rbWVtZHVwX2NvbXBhdF9zeXNjdGxfdGFibGUoc3RydWN0IG5mX3Byb3RvX25ldCAqcG4sCi0JCQkJCSAgIHN0cnVjdCBuZl91ZHBfbmV0ICp1bikKLXsKLSNpZmRlZiBDT05GSUdfU1lTQ1RMCi0jaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVAotCXBuLT5jdGxfY29tcGF0X3RhYmxlID0ga21lbWR1cCh1ZHBfY29tcGF0X3N5c2N0bF90YWJsZSwKLQkJCQkgICAgICAgc2l6ZW9mKHVkcF9jb21wYXRfc3lzY3RsX3RhYmxlKSwKLQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwbi0+Y3RsX2NvbXBhdF90YWJsZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwbi0+Y3RsX2NvbXBhdF90YWJsZVswXS5kYXRhID0gJnVuLT50aW1lb3V0c1tVRFBfQ1RfVU5SRVBMSUVEXTsKLQlwbi0+Y3RsX2NvbXBhdF90YWJsZVsxXS5kYXRhID0gJnVuLT50aW1lb3V0c1tVRFBfQ1RfUkVQTElFRF07Ci0jZW5kaWYKLSNlbmRpZgotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IHVkcF9pbml0X25ldChzdHJ1Y3QgbmV0ICpuZXQsIHVfaW50MTZfdCBwcm90bykKIHsKLQlpbnQgcmV0OwogCXN0cnVjdCBuZl91ZHBfbmV0ICp1biA9IHVkcF9wZXJuZXQobmV0KTsKIAlzdHJ1Y3QgbmZfcHJvdG9fbmV0ICpwbiA9ICZ1bi0+cG47CiAKQEAgLTI4NSwxOCArMjQ5LDcgQEAKIAkJCXVuLT50aW1lb3V0c1tpXSA9IHVkcF90aW1lb3V0c1tpXTsKIAl9CiAKLQlpZiAocHJvdG8gPT0gQUZfSU5FVCkgewotCQlyZXQgPSB1ZHBfa21lbWR1cF9jb21wYXRfc3lzY3RsX3RhYmxlKHBuLCB1bik7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQotCQlyZXQgPSB1ZHBfa21lbWR1cF9zeXNjdGxfdGFibGUocG4sIHVuKTsKLQkJaWYgKHJldCA8IDApCi0JCQluZl9jdF9rZnJlZV9jb21wYXRfc3lzY3RsX3RhYmxlKHBuKTsKLQl9IGVsc2UKLQkJcmV0ID0gdWRwX2ttZW1kdXBfc3lzY3RsX3RhYmxlKHBuLCB1bik7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiB1ZHBfa21lbWR1cF9zeXNjdGxfdGFibGUocG4sIHVuKTsKIH0KIAogc3RhdGljIHN0cnVjdCBuZl9wcm90b19uZXQgKnVkcF9nZXRfbmV0X3Byb3RvKHN0cnVjdCBuZXQgKm5ldCkKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcGxpdGUuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcGxpdGUuYwppbmRleCA5ZDY5MmY1YS4uMDI5MjA2ZSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fdWRwbGl0ZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcGxpdGUuYwpAQCAtNTQsNyArNTQsOCBAQAogCWNvbnN0IHN0cnVjdCB1ZHBoZHIgKmhwOwogCXN0cnVjdCB1ZHBoZHIgX2hkcjsKIAotCWhwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgZGF0YW9mZiwgc2l6ZW9mKF9oZHIpLCAmX2hkcik7CisJLyogQWN0dWFsbHkgb25seSBuZWVkIGZpcnN0IDQgYnl0ZXMgdG8gZ2V0IHBvcnRzLiAqLworCWhwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgZGF0YW9mZiwgNCwgJl9oZHIpOwogCWlmIChocCA9PSBOVUxMKQogCQlyZXR1cm4gZmFsc2U7CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NlcWFkai5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2VxYWRqLmMKaW5kZXggZGZmMGYwYy4uZWY3MDYzZSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2VxYWRqLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc2VxYWRqLmMKQEAgLTE2OSw3ICsxNjksNyBAQAogCXMzMiBzZXFvZmYsIGFja29mZjsKIAlzdHJ1Y3QgbmZfY29ubl9zZXFhZGogKnNlcWFkaiA9IG5mY3Rfc2VxYWRqKGN0KTsKIAlzdHJ1Y3QgbmZfY3Rfc2VxYWRqICp0aGlzX3dheSwgKm90aGVyX3dheTsKLQlpbnQgcmVzOworCWludCByZXMgPSAxOwogCiAJdGhpc193YXkgID0gJnNlcWFkai0+c2VxW2Rpcl07CiAJb3RoZXJfd2F5ID0gJnNlcWFkai0+c2VxWyFkaXJdOwpAQCAtMTg0LDI3ICsxODQsMzEgQEAKIAllbHNlCiAJCXNlcW9mZiA9IHRoaXNfd2F5LT5vZmZzZXRfYmVmb3JlOwogCisJbmV3c2VxID0gaHRvbmwobnRvaGwodGNwaC0+c2VxKSArIHNlcW9mZik7CisJaW5ldF9wcm90b19jc3VtX3JlcGxhY2U0KCZ0Y3BoLT5jaGVjaywgc2tiLCB0Y3BoLT5zZXEsIG5ld3NlcSwgZmFsc2UpOworCXByX2RlYnVnKCJBZGp1c3Rpbmcgc2VxdWVuY2UgbnVtYmVyIGZyb20gJXUtPiV1XG4iLAorCQkgbnRvaGwodGNwaC0+c2VxKSwgbnRvaGwobmV3c2VxKSk7CisJdGNwaC0+c2VxID0gbmV3c2VxOworCisJaWYgKCF0Y3BoLT5hY2spCisJCWdvdG8gb3V0OworCiAJaWYgKGFmdGVyKG50b2hsKHRjcGgtPmFja19zZXEpIC0gb3RoZXJfd2F5LT5vZmZzZXRfYmVmb3JlLAogCQkgIG90aGVyX3dheS0+Y29ycmVjdGlvbl9wb3MpKQogCQlhY2tvZmYgPSBvdGhlcl93YXktPm9mZnNldF9hZnRlcjsKIAllbHNlCiAJCWFja29mZiA9IG90aGVyX3dheS0+b2Zmc2V0X2JlZm9yZTsKIAotCW5ld3NlcSA9IGh0b25sKG50b2hsKHRjcGgtPnNlcSkgKyBzZXFvZmYpOwogCW5ld2FjayA9IGh0b25sKG50b2hsKHRjcGgtPmFja19zZXEpIC0gYWNrb2ZmKTsKLQotCWluZXRfcHJvdG9fY3N1bV9yZXBsYWNlNCgmdGNwaC0+Y2hlY2ssIHNrYiwgdGNwaC0+c2VxLCBuZXdzZXEsIGZhbHNlKTsKIAlpbmV0X3Byb3RvX2NzdW1fcmVwbGFjZTQoJnRjcGgtPmNoZWNrLCBza2IsIHRjcGgtPmFja19zZXEsIG5ld2FjaywKIAkJCQkgZmFsc2UpOwotCi0JcHJfZGVidWcoIkFkanVzdGluZyBzZXF1ZW5jZSBudW1iZXIgZnJvbSAldS0+JXUsIGFjayBmcm9tICV1LT4ldVxuIiwKKwlwcl9kZWJ1ZygiQWRqdXN0aW5nIGFjayBudW1iZXIgZnJvbSAldS0+JXUsIGFjayBmcm9tICV1LT4ldVxuIiwKIAkJIG50b2hsKHRjcGgtPnNlcSksIG50b2hsKG5ld3NlcSksIG50b2hsKHRjcGgtPmFja19zZXEpLAogCQkgbnRvaGwobmV3YWNrKSk7Ci0KLQl0Y3BoLT5zZXEgPSBuZXdzZXE7CiAJdGNwaC0+YWNrX3NlcSA9IG5ld2FjazsKIAogCXJlcyA9IG5mX2N0X3NhY2tfYWRqdXN0KHNrYiwgcHJvdG9mZiwgdGNwaCwgY3QsIGN0aW5mbyk7CitvdXQ6CiAJc3Bpbl91bmxvY2tfYmgoJmN0LT5sb2NrKTsKIAogCXJldHVybiByZXM7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zaXAuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NpcC5jCmluZGV4IDhkOWRiOWQuLjYyMWI4MWMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NpcC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NpcC5jCkBAIC04Myw5ICs4MywxMCBAQAogc3RhdGljIGludCBpc3dvcmRjKGNvbnN0IGNoYXIgYykKIHsKIAlpZiAoaXNhbG51bShjKSB8fCBjID09ICchJyB8fCBjID09ICciJyB8fCBjID09ICclJyB8fAotCSAgICAoYyA+PSAnKCcgJiYgYyA8PSAnLycpIHx8IGMgPT0gJzonIHx8IGMgPT0gJzwnIHx8IGMgPT0gJz4nIHx8CisJICAgIChjID49ICcoJyAmJiBjIDw9ICcrJykgfHwgYyA9PSAnOicgfHwgYyA9PSAnPCcgfHwgYyA9PSAnPicgfHwKIAkgICAgYyA9PSAnPycgfHwgKGMgPj0gJ1snICYmIGMgPD0gJ10nKSB8fCBjID09ICdfJyB8fCBjID09ICdgJyB8fAotCSAgICBjID09ICd7JyB8fCBjID09ICd9JyB8fCBjID09ICd+JykKKwkgICAgYyA9PSAneycgfHwgYyA9PSAnfScgfHwgYyA9PSAnficgfHwgKGMgPj0gJy0nICYmIGMgPD0gJy8nKSB8fAorCSAgICBjID09ICdcJycpCiAJCXJldHVybiAxOwogCXJldHVybiAwOwogfQpAQCAtMzI5LDEzICszMzAsMTIgQEAKIHN0YXRpYyBjb25zdCBjaGFyICpzaXBfc2tpcF93aGl0ZXNwYWNlKGNvbnN0IGNoYXIgKmRwdHIsIGNvbnN0IGNoYXIgKmxpbWl0KQogewogCWZvciAoOyBkcHRyIDwgbGltaXQ7IGRwdHIrKykgewotCQlpZiAoKmRwdHIgPT0gJyAnKQorCQlpZiAoKmRwdHIgPT0gJyAnIHx8ICpkcHRyID09ICdcdCcpCiAJCQljb250aW51ZTsKIAkJaWYgKCpkcHRyICE9ICdccicgJiYgKmRwdHIgIT0gJ1xuJykKIAkJCWJyZWFrOwogCQlkcHRyID0gc2lwX2ZvbGxvd19jb250aW51YXRpb24oZHB0ciwgbGltaXQpOwotCQlpZiAoZHB0ciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7CisJCWJyZWFrOwogCX0KIAlyZXR1cm4gZHB0cjsKIH0KQEAgLTEzODMsNyArMTM4Myw3IEBACiAJCXJldHVybiBORl9EUk9QOwogCX0KIAljc2VxID0gc2ltcGxlX3N0cnRvdWwoKmRwdHIgKyBtYXRjaG9mZiwgTlVMTCwgMTApOwotCWlmICghY3NlcSkgeworCWlmICghY3NlcSAmJiAqKCpkcHRyICsgbWF0Y2hvZmYpICE9ICcwJykgewogCQluZl9jdF9oZWxwZXJfbG9nKHNrYiwgY3QsICJjYW5ub3QgZ2V0IGNzZXEiKTsKIAkJcmV0dXJuIE5GX0RST1A7CiAJfQpAQCAtMTQ0Niw3ICsxNDQ2LDcgQEAKIAkJCXJldHVybiBORl9EUk9QOwogCQl9CiAJCWNzZXEgPSBzaW1wbGVfc3RydG91bCgqZHB0ciArIG1hdGNob2ZmLCBOVUxMLCAxMCk7Ci0JCWlmICghY3NlcSkgeworCQlpZiAoIWNzZXEgJiYgKigqZHB0ciArIG1hdGNob2ZmKSAhPSAnMCcpIHsKIAkJCW5mX2N0X2hlbHBlcl9sb2coc2tiLCBjdCwgImNhbm5vdCBnZXQgY3NlcSIpOwogCQkJcmV0dXJuIE5GX0RST1A7CiAJCX0KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUuYwppbmRleCA5NThhMTQ1Li41ZjQ0NmNkIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zdGFuZGFsb25lLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc3RhbmRhbG9uZS5jCkBAIC0yMDUsMTYgKzIwNSwyNSBAQAogCXN0cnVjdCBuZl9jb25uICpjdCA9IG5mX2N0X3R1cGxlaGFzaF90b19jdHJhY2soaGFzaCk7CiAJY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpsM3Byb3RvOwogCWNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqbDRwcm90bzsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzZXFfZmlsZV9uZXQocyk7CiAJaW50IHJldCA9IDA7CiAKIAlORl9DVF9BU1NFUlQoY3QpOwogCWlmICh1bmxpa2VseSghYXRvbWljX2luY19ub3RfemVybygmY3QtPmN0X2dlbmVyYWwudXNlKSkpCiAJCXJldHVybiAwOwogCisJaWYgKG5mX2N0X3Nob3VsZF9nYyhjdCkpIHsKKwkJbmZfY3Rfa2lsbChjdCk7CisJCWdvdG8gcmVsZWFzZTsKKwl9CisKIAkvKiB3ZSBvbmx5IHdhbnQgdG8gcHJpbnQgRElSX09SSUdJTkFMICovCiAJaWYgKE5GX0NUX0RJUkVDVElPTihoYXNoKSkKIAkJZ290byByZWxlYXNlOwogCisJaWYgKCFuZXRfZXEobmZfY3RfbmV0KGN0KSwgbmV0KSkKKwkJZ290byByZWxlYXNlOworCiAJbDNwcm90byA9IF9fbmZfY3RfbDNwcm90b19maW5kKG5mX2N0X2wzbnVtKGN0KSk7CiAJTkZfQ1RfQVNTRVJUKGwzcHJvdG8pOwogCWw0cHJvdG8gPSBfX25mX2N0X2w0cHJvdG9fZmluZChuZl9jdF9sM251bShjdCksIG5mX2N0X3Byb3RvbnVtKGN0KSk7CkBAIC0yMjQsOCArMjMzLDcgQEAKIAlzZXFfcHJpbnRmKHMsICIlLThzICV1ICUtOHMgJXUgJWxkICIsCiAJCSAgIGwzcHJvdG8tPm5hbWUsIG5mX2N0X2wzbnVtKGN0KSwKIAkJICAgbDRwcm90by0+bmFtZSwgbmZfY3RfcHJvdG9udW0oY3QpLAotCQkgICB0aW1lcl9wZW5kaW5nKCZjdC0+dGltZW91dCkKLQkJICAgPyAobG9uZykoY3QtPnRpbWVvdXQuZXhwaXJlcyAtIGppZmZpZXMpL0haIDogMCk7CisJCSAgIG5mX2N0X2V4cGlyZXMoY3QpICAvIEhaKTsKIAogCWlmIChsNHByb3RvLT5wcmludF9jb25udHJhY2spCiAJCWw0cHJvdG8tPnByaW50X2Nvbm50cmFjayhzLCBjdCk7CkBAIC0zNDksMTMgKzM1NywxMyBAQAogCXNlcV9wcmludGYoc2VxLCAiJTA4eCAgJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAiCiAJCQkiJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLAogCQkgICBucl9jb25udHJhY2tzLAotCQkgICBzdC0+c2VhcmNoZWQsCisJCSAgIDAsCiAJCSAgIHN0LT5mb3VuZCwKLQkJICAgc3QtPm5ldywKKwkJICAgMCwKIAkJICAgc3QtPmludmFsaWQsCiAJCSAgIHN0LT5pZ25vcmUsCi0JCSAgIHN0LT5kZWxldGUsCi0JCSAgIHN0LT5kZWxldGVfbGlzdCwKKwkJICAgMCwKKwkJICAgMCwKIAkJICAgc3QtPmluc2VydCwKIAkJICAgc3QtPmluc2VydF9mYWlsZWQsCiAJCSAgIHN0LT5kcm9wLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9pbnRlcm5hbHMuaCBiL25ldC9uZXRmaWx0ZXIvbmZfaW50ZXJuYWxzLmgKaW5kZXggMDY1NTIyNS4uZTBhZGI1OSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9pbnRlcm5hbHMuaAorKysgYi9uZXQvbmV0ZmlsdGVyL25mX2ludGVybmFscy5oCkBAIC0xMywxMyArMTMsMTMgQEAKIAogCiAvKiBjb3JlLmMgKi8KLXVuc2lnbmVkIGludCBuZl9pdGVyYXRlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQlzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUsIHN0cnVjdCBuZl9ob29rX29wcyAqKmVsZW1wKTsKK3Vuc2lnbmVkIGludCBuZl9pdGVyYXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSwKKwkJCXN0cnVjdCBuZl9ob29rX2VudHJ5ICoqZW50cnlwKTsKIAogLyogbmZfcXVldWUuYyAqLwotaW50IG5mX3F1ZXVlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZl9ob29rX29wcyAqZWxlbSwKLQkgICAgIHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSwgdW5zaWduZWQgaW50IHF1ZXVlbnVtKTsKLXZvaWQgbmZfcXVldWVfbmZfaG9va19kcm9wKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMpOworaW50IG5mX3F1ZXVlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSwKKwkgICAgIHVuc2lnbmVkIGludCBxdWV1ZW51bSk7Cit2b2lkIG5mX3F1ZXVlX25mX2hvb2tfZHJvcChzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBuZl9ob29rX2VudHJ5ICplbnRyeSk7CiBpbnQgX19pbml0IG5ldGZpbHRlcl9xdWV1ZV9pbml0KHZvaWQpOwogCiAvKiBuZl9sb2cuYyAqLwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9sb2cuYyBiL25ldC9uZXRmaWx0ZXIvbmZfbG9nLmMKaW5kZXggYWE1ODQ3YS4uM2RjYTkwZCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9sb2cuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2xvZy5jCkBAIC0zOSwxMiArMzksMTIgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBuZl9sb2dfc2V0KHN0cnVjdCBuZXQgKm5ldCwgdV9pbnQ4X3QgcGYsIGNvbnN0IHN0cnVjdCBuZl9sb2dnZXIgKmxvZ2dlcikKK2ludCBuZl9sb2dfc2V0KHN0cnVjdCBuZXQgKm5ldCwgdV9pbnQ4X3QgcGYsIGNvbnN0IHN0cnVjdCBuZl9sb2dnZXIgKmxvZ2dlcikKIHsKIAljb25zdCBzdHJ1Y3QgbmZfbG9nZ2VyICpsb2c7CiAKLQlpZiAocGYgPT0gTkZQUk9UT19VTlNQRUMpCi0JCXJldHVybjsKKwlpZiAocGYgPT0gTkZQUk9UT19VTlNQRUMgfHwgcGYgPj0gQVJSQVlfU0laRShuZXQtPm5mLm5mX2xvZ2dlcnMpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAltdXRleF9sb2NrKCZuZl9sb2dfbXV0ZXgpOwogCWxvZyA9IG5mdF9sb2dfZGVyZWZlcmVuY2UobmV0LT5uZi5uZl9sb2dnZXJzW3BmXSk7CkBAIC01Miw2ICs1Miw4IEBACiAJCXJjdV9hc3NpZ25fcG9pbnRlcihuZXQtPm5mLm5mX2xvZ2dlcnNbcGZdLCBsb2dnZXIpOwogCiAJbXV0ZXhfdW5sb2NrKCZuZl9sb2dfbXV0ZXgpOworCisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKG5mX2xvZ19zZXQpOwogCkBAIC00MjAsNyArNDIyLDcgQEAKIAljaGFyIGJ1ZltORkxPR0dFUl9OQU1FX0xFTl07CiAJaW50IHIgPSAwOwogCWludCB0aW5kZXggPSAodW5zaWduZWQgbG9uZyl0YWJsZS0+ZXh0cmExOwotCXN0cnVjdCBuZXQgKm5ldCA9IGN1cnJlbnQtPm5zcHJveHktPm5ldF9uczsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSB0YWJsZS0+ZXh0cmEyOwogCiAJaWYgKHdyaXRlKSB7CiAJCXN0cnVjdCBjdGxfdGFibGUgdG1wID0gKnRhYmxlOwpAQCAtNDc0LDcgKzQ3Niw2IEBACiAJCQkJIDMsICIlZCIsIGkpOwogCQkJbmZfbG9nX3N5c2N0bF90YWJsZVtpXS5wcm9jbmFtZQk9CiAJCQkJbmZfbG9nX3N5c2N0bF9mbmFtZXNbaV07Ci0JCQluZl9sb2dfc3lzY3RsX3RhYmxlW2ldLmRhdGEgPSBOVUxMOwogCQkJbmZfbG9nX3N5c2N0bF90YWJsZVtpXS5tYXhsZW4gPSBORkxPR0dFUl9OQU1FX0xFTjsKIAkJCW5mX2xvZ19zeXNjdGxfdGFibGVbaV0ubW9kZSA9IDA2NDQ7CiAJCQluZl9sb2dfc3lzY3RsX3RhYmxlW2ldLnByb2NfaGFuZGxlciA9CkBAIC00ODQsNiArNDg1LDkgQEAKIAkJfQogCX0KIAorCWZvciAoaSA9IE5GUFJPVE9fVU5TUEVDOyBpIDwgTkZQUk9UT19OVU1QUk9UTzsgaSsrKQorCQl0YWJsZVtpXS5leHRyYTIgPSBuZXQ7CisKIAluZXQtPm5mLm5mX2xvZ19kaXJfaGVhZGVyID0gcmVnaXN0ZXJfbmV0X3N5c2N0bChuZXQsCiAJCQkJCQkibmV0L25ldGZpbHRlci9uZl9sb2ciLAogCQkJCQkJdGFibGUpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9sb2dfY29tbW9uLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2xvZ19jb21tb24uYwppbmRleCBhNWFhNTk2Li4xMTlmZTFjIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2xvZ19jb21tb24uYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2xvZ19jb21tb24uYwpAQCAtNzcsNyArNzcsNyBAQAogCW5mX2xvZ19idWZfYWRkKG0sICJTUFQ9JXUgRFBUPSV1ICIsCiAJCSAgICAgICBudG9ocyh0aC0+c291cmNlKSwgbnRvaHModGgtPmRlc3QpKTsKIAkvKiBNYXggbGVuZ3RoOiAzMCAiU0VRPTQyOTQ5NjcyOTUgQUNLPTQyOTQ5NjcyOTUgIiAqLwotCWlmIChsb2dmbGFncyAmIFhUX0xPR19UQ1BTRVEpIHsKKwlpZiAobG9nZmxhZ3MgJiBORl9MT0dfVENQU0VRKSB7CiAJCW5mX2xvZ19idWZfYWRkKG0sICJTRVE9JXUgQUNLPSV1ICIsCiAJCQkgICAgICAgbnRvaGwodGgtPnNlcSksIG50b2hsKHRoLT5hY2tfc2VxKSk7CiAJfQpAQCAtMTA3LDcgKzEwNyw3IEBACiAJLyogTWF4IGxlbmd0aDogMTEgIlVSR1A9NjU1MzUgIiAqLwogCW5mX2xvZ19idWZfYWRkKG0sICJVUkdQPSV1ICIsIG50b2hzKHRoLT51cmdfcHRyKSk7CiAKLQlpZiAoKGxvZ2ZsYWdzICYgWFRfTE9HX1RDUE9QVCkgJiYgdGgtPmRvZmYqNCA+IHNpemVvZihzdHJ1Y3QgdGNwaGRyKSkgeworCWlmICgobG9nZmxhZ3MgJiBORl9MT0dfVENQT1BUKSAmJiB0aC0+ZG9mZio0ID4gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKSB7CiAJCXVfaW50OF90IF9vcHRbNjAgLSBzaXplb2Yoc3RydWN0IHRjcGhkcildOwogCQljb25zdCB1X2ludDhfdCAqb3A7CiAJCXVuc2lnbmVkIGludCBpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jIGIvbmV0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jCmluZGV4IGRlMzE4MTguLmJiYjhmM2QgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX25hdF9jb3JlLmMKQEAgLTQ0MSw3ICs0NDEsOCBAQAogCQkJY3QtPnN0YXR1cyB8PSBJUFNfRFNUX05BVDsKIAogCQlpZiAobmZjdF9oZWxwKGN0KSkKLQkJCW5mY3Rfc2VxYWRqX2V4dF9hZGQoY3QpOworCQkJaWYgKCFuZmN0X3NlcWFkal9leHRfYWRkKGN0KSkKKwkJCQlyZXR1cm4gTkZfRFJPUDsKIAl9CiAKIAlpZiAobWFuaXB0eXBlID09IE5GX05BVF9NQU5JUF9TUkMpIHsKQEAgLTU2NSwxNiArNTY2LDEwIEBACiAJICogRWxzZSwgd2hlbiB0aGUgY29ubnRyYWNrIGlzIGRlc3RveWVkLCBuZl9uYXRfY2xlYW51cF9jb25udHJhY2soKQogCSAqIHdpbGwgZGVsZXRlIGVudHJ5IGZyb20gYWxyZWFkeS1mcmVlZCB0YWJsZS4KIAkgKi8KLQlpZiAoIWRlbF90aW1lcigmY3QtPnRpbWVvdXQpKQotCQlyZXR1cm4gMTsKLQogCWN0LT5zdGF0dXMgJj0gfklQU19OQVRfRE9ORV9NQVNLOwotCiAJcmhhc2h0YWJsZV9yZW1vdmVfZmFzdCgmbmZfbmF0X2J5c291cmNlX3RhYmxlLCAmY3QtPm5hdF9ieXNvdXJjZSwKIAkJCSAgICAgICBuZl9uYXRfYnlzb3VyY2VfcGFyYW1zKTsKIAotCWFkZF90aW1lcigmY3QtPnRpbWVvdXQpOwotCiAJLyogZG9uJ3QgZGVsZXRlIGNvbm50cmFjay4gIEFsdGhvdWdoIHRoYXQgd291bGQgbWFrZSB0aGluZ3MgYSBsb3QKIAkgKiBzaW1wbGVyLCB3ZSdkIGVuZCB1cCBmbHVzaGluZyBhbGwgY29ubnRyYWNrcyBvbiBuYXQgcm1tb2QuCiAJICovCkBAIC04MDcsNyArODAyLDcgQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCXJldHVybiBuZl9uYXRfc2V0dXBfaW5mbyhjdCwgJnJhbmdlLCBtYW5pcCk7CisJcmV0dXJuIG5mX25hdF9zZXR1cF9pbmZvKGN0LCAmcmFuZ2UsIG1hbmlwKSA9PSBORl9EUk9QID8gLUVOT01FTSA6IDA7CiB9CiAjZWxzZQogc3RhdGljIGludApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9xdWV1ZS5jIGIvbmV0L25ldGZpbHRlci9uZl9xdWV1ZS5jCmluZGV4IGIxOWFkMjAuLjk2OTY0YTAgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfcXVldWUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX3F1ZXVlLmMKQEAgLTk2LDE0ICs5NiwxNCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobmZfcXVldWVfZW50cnlfZ2V0X3JlZnMpOwogCi12b2lkIG5mX3F1ZXVlX25mX2hvb2tfZHJvcChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBuZl9ob29rX29wcyAqb3BzKQordm9pZCBuZl9xdWV1ZV9uZl9ob29rX2Ryb3Aoc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgbmZfaG9va19lbnRyeSAqZW50cnkpCiB7CiAJY29uc3Qgc3RydWN0IG5mX3F1ZXVlX2hhbmRsZXIgKnFoOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCXFoID0gcmN1X2RlcmVmZXJlbmNlKG5ldC0+bmYucXVldWVfaGFuZGxlcik7CiAJaWYgKHFoKQotCQlxaC0+bmZfaG9va19kcm9wKG5ldCwgb3BzKTsKKwkJcWgtPm5mX2hvb2tfZHJvcChuZXQsIGVudHJ5KTsKIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KIApAQCAtMTEyLDcgKzExMiw2IEBACiAgKiB0aHJvdWdoIG5mX3JlaW5qZWN0KCkuCiAgKi8KIGludCBuZl9xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCSAgICAgc3RydWN0IG5mX2hvb2tfb3BzICplbGVtLAogCSAgICAgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlLAogCSAgICAgdW5zaWduZWQgaW50IHF1ZXVlbnVtKQogewpAQCAtMTQxLDcgKzE0MCw2IEBACiAKIAkqZW50cnkgPSAoc3RydWN0IG5mX3F1ZXVlX2VudHJ5KSB7CiAJCS5za2IJPSBza2IsCi0JCS5lbGVtCT0gZWxlbSwKIAkJLnN0YXRlCT0gKnN0YXRlLAogCQkuc2l6ZQk9IHNpemVvZigqZW50cnkpICsgYWZpbmZvLT5yb3V0ZV9rZXlfc2l6ZSwKIAl9OwpAQCAtMTY1LDExICsxNjMsMTUgQEAKIAogdm9pZCBuZl9yZWluamVjdChzdHJ1Y3QgbmZfcXVldWVfZW50cnkgKmVudHJ5LCB1bnNpZ25lZCBpbnQgdmVyZGljdCkKIHsKKwlzdHJ1Y3QgbmZfaG9va19lbnRyeSAqaG9va19lbnRyeTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZW50cnktPnNrYjsKLQlzdHJ1Y3QgbmZfaG9va19vcHMgKmVsZW0gPSBlbnRyeS0+ZWxlbTsKIAljb25zdCBzdHJ1Y3QgbmZfYWZpbmZvICphZmluZm87CisJc3RydWN0IG5mX2hvb2tfb3BzICplbGVtOwogCWludCBlcnI7CiAKKwlob29rX2VudHJ5ID0gcmN1X2RlcmVmZXJlbmNlKGVudHJ5LT5zdGF0ZS5ob29rX2VudHJpZXMpOworCWVsZW0gPSAmaG9va19lbnRyeS0+b3BzOworCiAJbmZfcXVldWVfZW50cnlfcmVsZWFzZV9yZWZzKGVudHJ5KTsKIAogCS8qIENvbnRpbnVlIHRyYXZlcnNhbCBpZmYgdXNlcnNwYWNlIHNhaWQgb2suLi4gKi8KQEAgLTE4Niw4ICsxODgsNyBAQAogCiAJaWYgKHZlcmRpY3QgPT0gTkZfQUNDRVBUKSB7CiAJbmV4dF9ob29rOgotCQl2ZXJkaWN0ID0gbmZfaXRlcmF0ZShlbnRyeS0+c3RhdGUuaG9va19saXN0LAotCQkJCSAgICAgc2tiLCAmZW50cnktPnN0YXRlLCAmZWxlbSk7CisJCXZlcmRpY3QgPSBuZl9pdGVyYXRlKHNrYiwgJmVudHJ5LT5zdGF0ZSwgJmhvb2tfZW50cnkpOwogCX0KIAogCXN3aXRjaCAodmVyZGljdCAmIE5GX1ZFUkRJQ1RfTUFTSykgewpAQCAtMTk4LDcgKzE5OSw4IEBACiAJCWxvY2FsX2JoX2VuYWJsZSgpOwogCQlicmVhazsKIAljYXNlIE5GX1FVRVVFOgotCQllcnIgPSBuZl9xdWV1ZShza2IsIGVsZW0sICZlbnRyeS0+c3RhdGUsCisJCVJDVV9JTklUX1BPSU5URVIoZW50cnktPnN0YXRlLmhvb2tfZW50cmllcywgaG9va19lbnRyeSk7CisJCWVyciA9IG5mX3F1ZXVlKHNrYiwgJmVudHJ5LT5zdGF0ZSwKIAkJCSAgICAgICB2ZXJkaWN0ID4+IE5GX1ZFUkRJQ1RfUUJJVFMpOwogCQlpZiAoZXJyIDwgMCkgewogCQkJaWYgKGVyciA9PSAtRVNSQ0ggJiYKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2FwaS5jIGIvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfYXBpLmMKaW5kZXggN2UxYzg3Ni4uYjcwZDNlYSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfYXBpLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfYXBpLmMKQEAgLTExOTYsNiArMTE5Niw4MyBAQAogCX0KIH0KIAorc3RydWN0IG5mdF9jaGFpbl9ob29rIHsKKwl1MzIJCQkJbnVtOworCXUzMgkJCQlwcmlvcml0eTsKKwljb25zdCBzdHJ1Y3QgbmZfY2hhaW5fdHlwZQkqdHlwZTsKKwlzdHJ1Y3QgbmV0X2RldmljZQkJKmRldjsKK307CisKK3N0YXRpYyBpbnQgbmZ0X2NoYWluX3BhcnNlX2hvb2soc3RydWN0IG5ldCAqbmV0LAorCQkJCWNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCBubGFbXSwKKwkJCQlzdHJ1Y3QgbmZ0X2FmX2luZm8gKmFmaSwKKwkJCQlzdHJ1Y3QgbmZ0X2NoYWluX2hvb2sgKmhvb2ssIGJvb2wgY3JlYXRlKQoreworCXN0cnVjdCBubGF0dHIgKmhhW05GVEFfSE9PS19NQVggKyAxXTsKKwljb25zdCBzdHJ1Y3QgbmZfY2hhaW5fdHlwZSAqdHlwZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBlcnI7CisKKwllcnIgPSBubGFfcGFyc2VfbmVzdGVkKGhhLCBORlRBX0hPT0tfTUFYLCBubGFbTkZUQV9DSEFJTl9IT09LXSwKKwkJCSAgICAgICBuZnRfaG9va19wb2xpY3kpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGhhW05GVEFfSE9PS19IT09LTlVNXSA9PSBOVUxMIHx8CisJICAgIGhhW05GVEFfSE9PS19QUklPUklUWV0gPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlob29rLT5udW0gPSBudG9obChubGFfZ2V0X2JlMzIoaGFbTkZUQV9IT09LX0hPT0tOVU1dKSk7CisJaWYgKGhvb2stPm51bSA+PSBhZmktPm5ob29rcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlob29rLT5wcmlvcml0eSA9IG50b2hsKG5sYV9nZXRfYmUzMihoYVtORlRBX0hPT0tfUFJJT1JJVFldKSk7CisKKwl0eXBlID0gY2hhaW5fdHlwZVthZmktPmZhbWlseV1bTkZUX0NIQUlOX1RfREVGQVVMVF07CisJaWYgKG5sYVtORlRBX0NIQUlOX1RZUEVdKSB7CisJCXR5cGUgPSBuZl90YWJsZXNfY2hhaW5fdHlwZV9sb29rdXAoYWZpLCBubGFbTkZUQV9DSEFJTl9UWVBFXSwKKwkJCQkJCSAgIGNyZWF0ZSk7CisJCWlmIChJU19FUlIodHlwZSkpCisJCQlyZXR1cm4gUFRSX0VSUih0eXBlKTsKKwl9CisJaWYgKCEodHlwZS0+aG9va19tYXNrICYgKDEgPDwgaG9vay0+bnVtKSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KHR5cGUtPm93bmVyKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlob29rLT50eXBlID0gdHlwZTsKKworCWhvb2stPmRldiA9IE5VTEw7CisJaWYgKGFmaS0+ZmxhZ3MgJiBORlRfQUZfTkVFRFNfREVWKSB7CisJCWNoYXIgaWZuYW1lW0lGTkFNU0laXTsKKworCQlpZiAoIWhhW05GVEFfSE9PS19ERVZdKSB7CisJCQltb2R1bGVfcHV0KHR5cGUtPm93bmVyKTsKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJfQorCisJCW5sYV9zdHJsY3B5KGlmbmFtZSwgaGFbTkZUQV9IT09LX0RFVl0sIElGTkFNU0laKTsKKwkJZGV2ID0gZGV2X2dldF9ieV9uYW1lKG5ldCwgaWZuYW1lKTsKKwkJaWYgKCFkZXYpIHsKKwkJCW1vZHVsZV9wdXQodHlwZS0+b3duZXIpOworCQkJcmV0dXJuIC1FTk9FTlQ7CisJCX0KKwkJaG9vay0+ZGV2ID0gZGV2OworCX0gZWxzZSBpZiAoaGFbTkZUQV9IT09LX0RFVl0pIHsKKwkJbW9kdWxlX3B1dCh0eXBlLT5vd25lcik7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbmZ0X2NoYWluX3JlbGVhc2VfaG9vayhzdHJ1Y3QgbmZ0X2NoYWluX2hvb2sgKmhvb2spCit7CisJbW9kdWxlX3B1dChob29rLT50eXBlLT5vd25lcik7CisJaWYgKGhvb2stPmRldiAhPSBOVUxMKQorCQlkZXZfcHV0KGhvb2stPmRldik7Cit9CisKIHN0YXRpYyBpbnQgbmZfdGFibGVzX25ld2NoYWluKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2sgKm5sc2ssCiAJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwKIAkJCSAgICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCBubGFbXSkKQEAgLTEyMDYsMTAgKzEyODMsOCBAQAogCXN0cnVjdCBuZnRfdGFibGUgKnRhYmxlOwogCXN0cnVjdCBuZnRfY2hhaW4gKmNoYWluOwogCXN0cnVjdCBuZnRfYmFzZV9jaGFpbiAqYmFzZWNoYWluID0gTlVMTDsKLQlzdHJ1Y3QgbmxhdHRyICpoYVtORlRBX0hPT0tfTUFYICsgMV07CiAJdTggZ2VubWFzayA9IG5mdF9nZW5tYXNrX25leHQobmV0KTsKIAlpbnQgZmFtaWx5ID0gbmZtc2ctPm5mZ2VuX2ZhbWlseTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKIAl1OCBwb2xpY3kgPSBORl9BQ0NFUFQ7CiAJdTY0IGhhbmRsZSA9IDA7CiAJdW5zaWduZWQgaW50IGk7CkBAIC0xMjczLDYgKzEzNDgsMzcgQEAKIAkJaWYgKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9SRVBMQUNFKQogCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCisJCWlmIChubGFbTkZUQV9DSEFJTl9IT09LXSkgeworCQkJc3RydWN0IG5mdF9iYXNlX2NoYWluICpiYXNlY2hhaW47CisJCQlzdHJ1Y3QgbmZ0X2NoYWluX2hvb2sgaG9vazsKKwkJCXN0cnVjdCBuZl9ob29rX29wcyAqb3BzOworCisJCQlpZiAoIShjaGFpbi0+ZmxhZ3MgJiBORlRfQkFTRV9DSEFJTikpCisJCQkJcmV0dXJuIC1FQlVTWTsKKworCQkJZXJyID0gbmZ0X2NoYWluX3BhcnNlX2hvb2sobmV0LCBubGEsIGFmaSwgJmhvb2ssCisJCQkJCQkgICBjcmVhdGUpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKworCQkJYmFzZWNoYWluID0gbmZ0X2Jhc2VfY2hhaW4oY2hhaW4pOworCQkJaWYgKGJhc2VjaGFpbi0+dHlwZSAhPSBob29rLnR5cGUpIHsKKwkJCQluZnRfY2hhaW5fcmVsZWFzZV9ob29rKCZob29rKTsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCisJCQlmb3IgKGkgPSAwOyBpIDwgYWZpLT5ub3BzOyBpKyspIHsKKwkJCQlvcHMgPSAmYmFzZWNoYWluLT5vcHNbaV07CisJCQkJaWYgKG9wcy0+aG9va251bSAhPSBob29rLm51bSB8fAorCQkJCSAgICBvcHMtPnByaW9yaXR5ICE9IGhvb2sucHJpb3JpdHkgfHwKKwkJCQkgICAgb3BzLT5kZXYgIT0gaG9vay5kZXYpIHsKKwkJCQkJbmZ0X2NoYWluX3JlbGVhc2VfaG9vaygmaG9vayk7CisJCQkJCXJldHVybiAtRUJVU1k7CisJCQkJfQorCQkJfQorCQkJbmZ0X2NoYWluX3JlbGVhc2VfaG9vaygmaG9vayk7CisJCX0KKwogCQlpZiAobmxhW05GVEFfQ0hBSU5fSEFORExFXSAmJiBuYW1lKSB7CiAJCQlzdHJ1Y3QgbmZ0X2NoYWluICpjaGFpbjI7CiAKQEAgLTEzMjAsMTAyICsxNDI2LDUzIEBACiAJCXJldHVybiAtRU9WRVJGTE9XOwogCiAJaWYgKG5sYVtORlRBX0NIQUlOX0hPT0tdKSB7Ci0JCWNvbnN0IHN0cnVjdCBuZl9jaGFpbl90eXBlICp0eXBlOworCQlzdHJ1Y3QgbmZ0X2NoYWluX2hvb2sgaG9vazsKIAkJc3RydWN0IG5mX2hvb2tfb3BzICpvcHM7CiAJCW5mX2hvb2tmbiAqaG9va2ZuOwotCQl1MzIgaG9va251bSwgcHJpb3JpdHk7CiAKLQkJdHlwZSA9IGNoYWluX3R5cGVbZmFtaWx5XVtORlRfQ0hBSU5fVF9ERUZBVUxUXTsKLQkJaWYgKG5sYVtORlRBX0NIQUlOX1RZUEVdKSB7Ci0JCQl0eXBlID0gbmZfdGFibGVzX2NoYWluX3R5cGVfbG9va3VwKGFmaSwKLQkJCQkJCQkgICBubGFbTkZUQV9DSEFJTl9UWVBFXSwKLQkJCQkJCQkgICBjcmVhdGUpOwotCQkJaWYgKElTX0VSUih0eXBlKSkKLQkJCQlyZXR1cm4gUFRSX0VSUih0eXBlKTsKLQkJfQotCi0JCWVyciA9IG5sYV9wYXJzZV9uZXN0ZWQoaGEsIE5GVEFfSE9PS19NQVgsIG5sYVtORlRBX0NIQUlOX0hPT0tdLAotCQkJCSAgICAgICBuZnRfaG9va19wb2xpY3kpOworCQllcnIgPSBuZnRfY2hhaW5fcGFyc2VfaG9vayhuZXQsIG5sYSwgYWZpLCAmaG9vaywgY3JlYXRlKTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwotCQlpZiAoaGFbTkZUQV9IT09LX0hPT0tOVU1dID09IE5VTEwgfHwKLQkJICAgIGhhW05GVEFfSE9PS19QUklPUklUWV0gPT0gTlVMTCkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWhvb2tudW0gPSBudG9obChubGFfZ2V0X2JlMzIoaGFbTkZUQV9IT09LX0hPT0tOVU1dKSk7Ci0JCWlmIChob29rbnVtID49IGFmaS0+bmhvb2tzKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXByaW9yaXR5ID0gbnRvaGwobmxhX2dldF9iZTMyKGhhW05GVEFfSE9PS19QUklPUklUWV0pKTsKLQotCQlpZiAoISh0eXBlLT5ob29rX21hc2sgJiAoMSA8PCBob29rbnVtKSkpCi0JCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JCWlmICghdHJ5X21vZHVsZV9nZXQodHlwZS0+b3duZXIpKQotCQkJcmV0dXJuIC1FTk9FTlQ7Ci0JCWhvb2tmbiA9IHR5cGUtPmhvb2tzW2hvb2tudW1dOwotCi0JCWlmIChhZmktPmZsYWdzICYgTkZUX0FGX05FRURTX0RFVikgewotCQkJY2hhciBpZm5hbWVbSUZOQU1TSVpdOwotCi0JCQlpZiAoIWhhW05GVEFfSE9PS19ERVZdKSB7Ci0JCQkJbW9kdWxlX3B1dCh0eXBlLT5vd25lcik7Ci0JCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCQkJfQotCi0JCQlubGFfc3RybGNweShpZm5hbWUsIGhhW05GVEFfSE9PS19ERVZdLCBJRk5BTVNJWik7Ci0JCQlkZXYgPSBkZXZfZ2V0X2J5X25hbWUobmV0LCBpZm5hbWUpOwotCQkJaWYgKCFkZXYpIHsKLQkJCQltb2R1bGVfcHV0KHR5cGUtPm93bmVyKTsKLQkJCQlyZXR1cm4gLUVOT0VOVDsKLQkJCX0KLQkJfSBlbHNlIGlmIChoYVtORlRBX0hPT0tfREVWXSkgewotCQkJbW9kdWxlX3B1dCh0eXBlLT5vd25lcik7Ci0JCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JCX0KIAogCQliYXNlY2hhaW4gPSBremFsbG9jKHNpemVvZigqYmFzZWNoYWluKSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChiYXNlY2hhaW4gPT0gTlVMTCkgewotCQkJbW9kdWxlX3B1dCh0eXBlLT5vd25lcik7Ci0JCQlpZiAoZGV2ICE9IE5VTEwpCi0JCQkJZGV2X3B1dChkZXYpOworCQkJbmZ0X2NoYWluX3JlbGVhc2VfaG9vaygmaG9vayk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCi0JCWlmIChkZXYgIT0gTlVMTCkKLQkJCXN0cm5jcHkoYmFzZWNoYWluLT5kZXZfbmFtZSwgZGV2LT5uYW1lLCBJRk5BTVNJWik7CisJCWlmIChob29rLmRldiAhPSBOVUxMKQorCQkJc3RybmNweShiYXNlY2hhaW4tPmRldl9uYW1lLCBob29rLmRldi0+bmFtZSwgSUZOQU1TSVopOwogCiAJCWlmIChubGFbTkZUQV9DSEFJTl9DT1VOVEVSU10pIHsKIAkJCXN0YXRzID0gbmZ0X3N0YXRzX2FsbG9jKG5sYVtORlRBX0NIQUlOX0NPVU5URVJTXSk7CiAJCQlpZiAoSVNfRVJSKHN0YXRzKSkgewotCQkJCW1vZHVsZV9wdXQodHlwZS0+b3duZXIpOworCQkJCW5mdF9jaGFpbl9yZWxlYXNlX2hvb2soJmhvb2spOwogCQkJCWtmcmVlKGJhc2VjaGFpbik7Ci0JCQkJaWYgKGRldiAhPSBOVUxMKQotCQkJCQlkZXZfcHV0KGRldik7CiAJCQkJcmV0dXJuIFBUUl9FUlIoc3RhdHMpOwogCQkJfQogCQkJYmFzZWNoYWluLT5zdGF0cyA9IHN0YXRzOwogCQl9IGVsc2UgewogCQkJc3RhdHMgPSBuZXRkZXZfYWxsb2NfcGNwdV9zdGF0cyhzdHJ1Y3QgbmZ0X3N0YXRzKTsKIAkJCWlmIChzdGF0cyA9PSBOVUxMKSB7Ci0JCQkJbW9kdWxlX3B1dCh0eXBlLT5vd25lcik7CisJCQkJbmZ0X2NoYWluX3JlbGVhc2VfaG9vaygmaG9vayk7CiAJCQkJa2ZyZWUoYmFzZWNoYWluKTsKLQkJCQlpZiAoZGV2ICE9IE5VTEwpCi0JCQkJCWRldl9wdXQoZGV2KTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KIAkJCXJjdV9hc3NpZ25fcG9pbnRlcihiYXNlY2hhaW4tPnN0YXRzLCBzdGF0cyk7CiAJCX0KIAotCQliYXNlY2hhaW4tPnR5cGUgPSB0eXBlOworCQlob29rZm4gPSBob29rLnR5cGUtPmhvb2tzW2hvb2subnVtXTsKKwkJYmFzZWNoYWluLT50eXBlID0gaG9vay50eXBlOwogCQljaGFpbiA9ICZiYXNlY2hhaW4tPmNoYWluOwogCiAJCWZvciAoaSA9IDA7IGkgPCBhZmktPm5vcHM7IGkrKykgewogCQkJb3BzID0gJmJhc2VjaGFpbi0+b3BzW2ldOwogCQkJb3BzLT5wZgkJPSBmYW1pbHk7Ci0JCQlvcHMtPmhvb2tudW0JPSBob29rbnVtOwotCQkJb3BzLT5wcmlvcml0eQk9IHByaW9yaXR5OworCQkJb3BzLT5ob29rbnVtCT0gaG9vay5udW07CisJCQlvcHMtPnByaW9yaXR5CT0gaG9vay5wcmlvcml0eTsKIAkJCW9wcy0+cHJpdgk9IGNoYWluOwogCQkJb3BzLT5ob29rCT0gYWZpLT5ob29rc1tvcHMtPmhvb2tudW1dOwotCQkJb3BzLT5kZXYJPSBkZXY7CisJCQlvcHMtPmRldgk9IGhvb2suZGV2OwogCQkJaWYgKGhvb2tmbikKIAkJCQlvcHMtPmhvb2sgPSBob29rZm47CiAJCQlpZiAoYWZpLT5ob29rX29wc19pbml0KQpAQCAtMzQyNiwxMiArMzQ4MywxMiBAQAogfQogCiBzdGF0aWMgaW50IG5mdF9hZGRfc2V0X2VsZW0oc3RydWN0IG5mdF9jdHggKmN0eCwgc3RydWN0IG5mdF9zZXQgKnNldCwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICphdHRyKQorCQkJICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKmF0dHIsIHUzMiBubG1zZ19mbGFncykKIHsKIAlzdHJ1Y3QgbmxhdHRyICpubGFbTkZUQV9TRVRfRUxFTV9NQVggKyAxXTsKIAlzdHJ1Y3QgbmZ0X2RhdGFfZGVzYyBkMSwgZDI7CiAJc3RydWN0IG5mdF9zZXRfZXh0X3RtcGwgdG1wbDsKLQlzdHJ1Y3QgbmZ0X3NldF9leHQgKmV4dDsKKwlzdHJ1Y3QgbmZ0X3NldF9leHQgKmV4dCwgKmV4dDI7CiAJc3RydWN0IG5mdF9zZXRfZWxlbSBlbGVtOwogCXN0cnVjdCBuZnRfc2V0X2JpbmRpbmcgKmJpbmRpbmc7CiAJc3RydWN0IG5mdF91c2VyZGF0YSAqdWRhdGE7CkBAIC0zNTU4LDkgKzM2MTUsMTkgQEAKIAkJZ290byBlcnI0OwogCiAJZXh0LT5nZW5tYXNrID0gbmZ0X2dlbm1hc2tfY3VyKGN0eC0+bmV0KSB8IE5GVF9TRVRfRUxFTV9CVVNZX01BU0s7Ci0JZXJyID0gc2V0LT5vcHMtPmluc2VydChjdHgtPm5ldCwgc2V0LCAmZWxlbSk7Ci0JaWYgKGVyciA8IDApCisJZXJyID0gc2V0LT5vcHMtPmluc2VydChjdHgtPm5ldCwgc2V0LCAmZWxlbSwgJmV4dDIpOworCWlmIChlcnIpIHsKKwkJaWYgKGVyciA9PSAtRUVYSVNUKSB7CisJCQlpZiAobmZ0X3NldF9leHRfZXhpc3RzKGV4dCwgTkZUX1NFVF9FWFRfREFUQSkgJiYKKwkJCSAgICBuZnRfc2V0X2V4dF9leGlzdHMoZXh0MiwgTkZUX1NFVF9FWFRfREFUQSkgJiYKKwkJCSAgICBtZW1jbXAobmZ0X3NldF9leHRfZGF0YShleHQpLAorCQkJCSAgIG5mdF9zZXRfZXh0X2RhdGEoZXh0MiksIHNldC0+ZGxlbikgIT0gMCkKKwkJCQllcnIgPSAtRUJVU1k7CisJCQllbHNlIGlmICghKG5sbXNnX2ZsYWdzICYgTkxNX0ZfRVhDTCkpCisJCQkJZXJyID0gMDsKKwkJfQogCQlnb3RvIGVycjU7CisJfQogCiAJbmZ0X3RyYW5zX2VsZW0odHJhbnMpID0gZWxlbTsKIAlsaXN0X2FkZF90YWlsKCZ0cmFucy0+bGlzdCwgJmN0eC0+bmV0LT5uZnQuY29tbWl0X2xpc3QpOwpAQCAtMzYxNiw3ICszNjgzLDcgQEAKIAkJICAgICFhdG9taWNfYWRkX3VubGVzcygmc2V0LT5uZWxlbXMsIDEsIHNldC0+c2l6ZSArIHNldC0+bmRlYWN0KSkKIAkJCXJldHVybiAtRU5GSUxFOwogCi0JCWVyciA9IG5mdF9hZGRfc2V0X2VsZW0oJmN0eCwgc2V0LCBhdHRyKTsKKwkJZXJyID0gbmZ0X2FkZF9zZXRfZWxlbSgmY3R4LCBzZXQsIGF0dHIsIG5saC0+bmxtc2dfZmxhZ3MpOwogCQlpZiAoZXJyIDwgMCkgewogCQkJYXRvbWljX2RlYygmc2V0LT5uZWxlbXMpOwogCQkJYnJlYWs7CkBAIC00MzQzLDYgKzQ0MTAsMzEgQEAKIH0KIAogLyoqCisgKgluZnRfcGFyc2VfdTMyX2NoZWNrIC0gZmV0Y2ggdTMyIGF0dHJpYnV0ZSBhbmQgY2hlY2sgZm9yIG1heGltdW0gdmFsdWUKKyAqCisgKglAYXR0cjogbmV0bGluayBhdHRyaWJ1dGUgdG8gZmV0Y2ggdmFsdWUgZnJvbQorICoJQG1heDogbWF4aW11bSB2YWx1ZSB0byBiZSBzdG9yZWQgaW4gZGVzdAorICoJQGRlc3Q6IHBvaW50ZXIgdG8gdGhlIHZhcmlhYmxlCisgKgorICoJUGFyc2UsIGNoZWNrIGFuZCBzdG9yZSBhIGdpdmVuIHUzMiBuZXRsaW5rIGF0dHJpYnV0ZSBpbnRvIHZhcmlhYmxlLgorICoJVGhpcyBmdW5jdGlvbiByZXR1cm5zIC1FUkFOR0UgaWYgdGhlIHZhbHVlIGdvZXMgb3ZlciBtYXhpbXVtIHZhbHVlLgorICoJT3RoZXJ3aXNlIGEgMCBpcyByZXR1cm5lZCBhbmQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBpcyBzdG9yZWQgaW4gdGhlCisgKglkZXN0aW5hdGlvbiB2YXJpYWJsZS4KKyAqLwordW5zaWduZWQgaW50IG5mdF9wYXJzZV91MzJfY2hlY2soY29uc3Qgc3RydWN0IG5sYXR0ciAqYXR0ciwgaW50IG1heCwgdTMyICpkZXN0KQoreworCWludCB2YWw7CisKKwl2YWwgPSBudG9obChubGFfZ2V0X2JlMzIoYXR0cikpOworCWlmICh2YWwgPiBtYXgpCisJCXJldHVybiAtRVJBTkdFOworCisJKmRlc3QgPSB2YWw7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZnRfcGFyc2VfdTMyX2NoZWNrKTsKKworLyoqCiAgKgluZnRfcGFyc2VfcmVnaXN0ZXIgLSBwYXJzZSBhIHJlZ2lzdGVyIHZhbHVlIGZyb20gYSBuZXRsaW5rIGF0dHJpYnV0ZQogICoKICAqCUBhdHRyOiBuZXRsaW5rIGF0dHJpYnV0ZQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfY29yZS5jIGIvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfY29yZS5jCmluZGV4IGZiOGI1ODkuLjBkZDVjNjkgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2NvcmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19jb3JlLmMKQEAgLTM0LDcgKzM0LDcgQEAKIAkudSA9IHsKIAkJLmxvZyA9IHsKIAkJCS5sZXZlbCA9IExPR0xFVkVMX1dBUk5JTkcsCi0JCQkubG9nZmxhZ3MgPSBORl9MT0dfTUFTSywKKwkJCS5sb2dmbGFncyA9IE5GX0xPR19ERUZBVUxUX01BU0ssCiAJICAgICAgICB9LAogCX0sCiB9OwpAQCAtOTMsMTIgKzkzLDE1IEBACiAKIAlpZiAocHJpdi0+YmFzZSA9PSBORlRfUEFZTE9BRF9ORVRXT1JLX0hFQURFUikKIAkJcHRyID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7Ci0JZWxzZQorCWVsc2UgeworCQlpZiAoIXBrdC0+dHByb3Rfc2V0KQorCQkJcmV0dXJuIGZhbHNlOwogCQlwdHIgPSBza2JfbmV0d29ya19oZWFkZXIoc2tiKSArIHBrdC0+eHQudGhvZmY7CisJfQogCiAJcHRyICs9IHByaXYtPm9mZnNldDsKIAotCWlmICh1bmxpa2VseShwdHIgKyBwcml2LT5sZW4gPj0gc2tiX3RhaWxfcG9pbnRlcihza2IpKSkKKwlpZiAodW5saWtlbHkocHRyICsgcHJpdi0+bGVuID4gc2tiX3RhaWxfcG9pbnRlcihza2IpKSkKIAkJcmV0dXJuIGZhbHNlOwogCiAJKmRlc3QgPSAwOwpAQCAtMjYwLDggKzI2MywxMyBAQAogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycjc7CiAKLQlyZXR1cm4gMDsKKwllcnIgPSBuZnRfcmFuZ2VfbW9kdWxlX2luaXQoKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnI4OwogCisJcmV0dXJuIDA7CitlcnI4OgorCW5mdF9keW5zZXRfbW9kdWxlX2V4aXQoKTsKIGVycjc6CiAJbmZ0X3BheWxvYWRfbW9kdWxlX2V4aXQoKTsKIGVycjY6CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19pbmV0LmMgYi9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19pbmV0LmMKaW5kZXggNmI1Zjc2Mi4uZjcxM2NjMiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfaW5ldC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2luZXQuYwpAQCAtODIsNyArODIsMTAgQEAKIHsKIAlpbnQgcmV0OwogCi0JbmZ0X3JlZ2lzdGVyX2NoYWluX3R5cGUoJmZpbHRlcl9pbmV0KTsKKwlyZXQgPSBuZnRfcmVnaXN0ZXJfY2hhaW5fdHlwZSgmZmlsdGVyX2luZXQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCiAJcmV0ID0gcmVnaXN0ZXJfcGVybmV0X3N1YnN5cygmbmZfdGFibGVzX2luZXRfbmV0X29wcyk7CiAJaWYgKHJldCA8IDApCiAJCW5mdF91bnJlZ2lzdGVyX2NoYWluX3R5cGUoJmZpbHRlcl9pbmV0KTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX25ldGRldi5jIGIvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfbmV0ZGV2LmMKaW5kZXggNWVlZmU0YS4uOWUyYWU0MiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfbmV0ZGV2LmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfbmV0ZGV2LmMKQEAgLTE1LDc5ICsxNSw2IEBACiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl90YWJsZXNfaXB2NC5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2lwdjYuaD4KIAotc3RhdGljIGlubGluZSB2b2lkCi1uZnRfbmV0ZGV2X3NldF9wa3RpbmZvX2lwdjQoc3RydWN0IG5mdF9wa3RpbmZvICpwa3QsCi0JCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCi17Ci0Jc3RydWN0IGlwaGRyICppcGgsIF9pcGg7Ci0JdTMyIGxlbiwgdGhvZmY7Ci0KLQluZnRfc2V0X3BrdGluZm8ocGt0LCBza2IsIHN0YXRlKTsKLQotCWlwaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNrYl9uZXR3b3JrX29mZnNldChza2IpLCBzaXplb2YoKmlwaCksCi0JCQkJICZfaXBoKTsKLQlpZiAoIWlwaCkKLQkJcmV0dXJuOwotCi0JaXBoID0gaXBfaGRyKHNrYik7Ci0JaWYgKGlwaC0+aWhsIDwgNSB8fCBpcGgtPnZlcnNpb24gIT0gNCkKLQkJcmV0dXJuOwotCi0JbGVuID0gbnRvaHMoaXBoLT50b3RfbGVuKTsKLQl0aG9mZiA9IGlwaC0+aWhsICogNDsKLQlpZiAoc2tiLT5sZW4gPCBsZW4pCi0JCXJldHVybjsKLQllbHNlIGlmIChsZW4gPCB0aG9mZikKLQkJcmV0dXJuOwotCi0JcGt0LT50cHJvdCA9IGlwaC0+cHJvdG9jb2w7Ci0JcGt0LT54dC50aG9mZiA9IHRob2ZmOwotCXBrdC0+eHQuZnJhZ29mZiA9IG50b2hzKGlwaC0+ZnJhZ19vZmYpICYgSVBfT0ZGU0VUOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9fbmZ0X25ldGRldl9zZXRfcGt0aW5mb19pcHY2KHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0LAotCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKLXsKLSNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQotCXN0cnVjdCBpcHY2aGRyICppcDZoLCBfaXA2aDsKLQl1bnNpZ25lZCBpbnQgdGhvZmYgPSAwOwotCXVuc2lnbmVkIHNob3J0IGZyYWdfb2ZmOwotCWludCBwcm90b2hkcjsKLQl1MzIgcGt0X2xlbjsKLQotCWlwNmggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2JfbmV0d29ya19vZmZzZXQoc2tiKSwgc2l6ZW9mKCppcDZoKSwKLQkJCQkgICZfaXA2aCk7Ci0JaWYgKCFpcDZoKQotCQlyZXR1cm47Ci0KLQlpZiAoaXA2aC0+dmVyc2lvbiAhPSA2KQotCQlyZXR1cm47Ci0KLQlwa3RfbGVuID0gbnRvaHMoaXA2aC0+cGF5bG9hZF9sZW4pOwotCWlmIChwa3RfbGVuICsgc2l6ZW9mKCppcDZoKSA+IHNrYi0+bGVuKQotCQlyZXR1cm47Ci0KLQlwcm90b2hkciA9IGlwdjZfZmluZF9oZHIocGt0LT5za2IsICZ0aG9mZiwgLTEsICZmcmFnX29mZiwgTlVMTCk7Ci0JaWYgKHByb3RvaGRyIDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLQlwa3QtPnRwcm90ID0gcHJvdG9oZHI7Ci0JcGt0LT54dC50aG9mZiA9IHRob2ZmOwotCXBrdC0+eHQuZnJhZ29mZiA9IGZyYWdfb2ZmOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBuZnRfbmV0ZGV2X3NldF9wa3RpbmZvX2lwdjYoc3RydWN0IG5mdF9wa3RpbmZvICpwa3QsCi0JCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkgICAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQotewotCW5mdF9zZXRfcGt0aW5mbyhwa3QsIHNrYiwgc3RhdGUpOwotCV9fbmZ0X25ldGRldl9zZXRfcGt0aW5mb19pcHY2KHBrdCwgc2tiLCBzdGF0ZSk7Ci19Ci0KIHN0YXRpYyB1bnNpZ25lZCBpbnQKIG5mdF9kb19jaGFpbl9uZXRkZXYodm9pZCAqcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKQEAgLTk2LDEzICsyMywxMyBAQAogCiAJc3dpdGNoIChza2ItPnByb3RvY29sKSB7CiAJY2FzZSBodG9ucyhFVEhfUF9JUCk6Ci0JCW5mdF9uZXRkZXZfc2V0X3BrdGluZm9faXB2NCgmcGt0LCBza2IsIHN0YXRlKTsKKwkJbmZ0X3NldF9wa3RpbmZvX2lwdjRfdmFsaWRhdGUoJnBrdCwgc2tiLCBzdGF0ZSk7CiAJCWJyZWFrOwogCWNhc2UgaHRvbnMoRVRIX1BfSVBWNik6Ci0JCW5mdF9uZXRkZXZfc2V0X3BrdGluZm9faXB2NigmcGt0LCBza2IsIHN0YXRlKTsKKwkJbmZ0X3NldF9wa3RpbmZvX2lwdjZfdmFsaWRhdGUoJnBrdCwgc2tiLCBzdGF0ZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCW5mdF9zZXRfcGt0aW5mbygmcGt0LCBza2IsIHN0YXRlKTsKKwkJbmZ0X3NldF9wa3RpbmZvX3Vuc3BlYygmcGt0LCBza2IsIHN0YXRlKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0yMjIsMTQgKzE0OSwyNSBAQAogewogCWludCByZXQ7CiAKLQluZnRfcmVnaXN0ZXJfY2hhaW5fdHlwZSgmbmZ0X2ZpbHRlcl9jaGFpbl9uZXRkZXYpOwotCXJldCA9IHJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJm5mX3RhYmxlc19uZXRkZXZfbmV0X29wcyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJbmZ0X3VucmVnaXN0ZXJfY2hhaW5fdHlwZSgmbmZ0X2ZpbHRlcl9jaGFpbl9uZXRkZXYpOworCXJldCA9IG5mdF9yZWdpc3Rlcl9jaGFpbl90eXBlKCZuZnRfZmlsdGVyX2NoYWluX25ldGRldik7CisJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKLQl9Ci0JcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZuZl90YWJsZXNfbmV0ZGV2X25vdGlmaWVyKTsKKworCXJldCA9IHJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJm5mX3RhYmxlc19uZXRkZXZfbmV0X29wcyk7CisJaWYgKHJldCkKKwkJZ290byBlcnIxOworCisJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZuZl90YWJsZXNfbmV0ZGV2X25vdGlmaWVyKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjI7CisKIAlyZXR1cm4gMDsKKworZXJyMjoKKwl1bnJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJm5mX3RhYmxlc19uZXRkZXZfbmV0X29wcyk7CitlcnIxOgorCW5mdF91bnJlZ2lzdGVyX2NoYWluX3R5cGUoJm5mdF9maWx0ZXJfY2hhaW5fbmV0ZGV2KTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbmZfdGFibGVzX25ldGRldl9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc190cmFjZS5jIGIvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfdHJhY2UuYwppbmRleCAzOWViMWNjLi5hYjY5NWY4IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc190cmFjZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX3RyYWNlLmMKQEAgLTExMywyMCArMTEzLDIyIEBACiAJCQkJICBjb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCkKIHsKIAljb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcGt0LT5za2I7Ci0JdW5zaWduZWQgaW50IGxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwKLQkJCQkgcGt0LT54dC50aG9mZiAtIHNrYl9uZXR3b3JrX29mZnNldChza2IpLAotCQkJCSBORlRfVFJBQ0VUWVBFX05FVFdPUktfSFNJWkUpOwogCWludCBvZmYgPSBza2JfbmV0d29ya19vZmZzZXQoc2tiKTsKKwl1bnNpZ25lZCBpbnQgbGVuLCBuaF9lbmQ7CiAKKwluaF9lbmQgPSBwa3QtPnRwcm90X3NldCA/IHBrdC0+eHQudGhvZmYgOiBza2ItPmxlbjsKKwlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIG5oX2VuZCAtIHNrYl9uZXR3b3JrX29mZnNldChza2IpLAorCQkgICAgTkZUX1RSQUNFVFlQRV9ORVRXT1JLX0hTSVpFKTsKIAlpZiAodHJhY2VfZmlsbF9oZWFkZXIobmxza2IsIE5GVEFfVFJBQ0VfTkVUV09SS19IRUFERVIsIHNrYiwgb2ZmLCBsZW4pKQogCQlyZXR1cm4gLTE7CiAKLQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHNrYi0+bGVuIC0gcGt0LT54dC50aG9mZiwKLQkJICAgIE5GVF9UUkFDRVRZUEVfVFJBTlNQT1JUX0hTSVpFKTsKLQotCWlmICh0cmFjZV9maWxsX2hlYWRlcihubHNrYiwgTkZUQV9UUkFDRV9UUkFOU1BPUlRfSEVBREVSLCBza2IsCi0JCQkgICAgICBwa3QtPnh0LnRob2ZmLCBsZW4pKQotCQlyZXR1cm4gLTE7CisJaWYgKHBrdC0+dHByb3Rfc2V0KSB7CisJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgc2tiLT5sZW4gLSBwa3QtPnh0LnRob2ZmLAorCQkJICAgIE5GVF9UUkFDRVRZUEVfVFJBTlNQT1JUX0hTSVpFKTsKKwkJaWYgKHRyYWNlX2ZpbGxfaGVhZGVyKG5sc2tiLCBORlRBX1RSQUNFX1RSQU5TUE9SVF9IRUFERVIsIHNrYiwKKwkJCQkgICAgICBwa3QtPnh0LnRob2ZmLCBsZW4pKQorCQkJcmV0dXJuIC0xOworCX0KIAogCWlmICghc2tiX21hY19oZWFkZXJfd2FzX3NldChza2IpKQogCQlyZXR1cm4gMDsKQEAgLTIzNyw3ICsyMzksNyBAQAogCQlicmVhazsKIAljYXNlIE5GVF9UUkFDRVRZUEVfUE9MSUNZOgogCQlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZUQV9UUkFDRV9QT0xJQ1ksCi0JCQkJIGluZm8tPmJhc2VjaGFpbi0+cG9saWN5KSkKKwkJCQkgaHRvbmwoaW5mby0+YmFzZWNoYWluLT5wb2xpY3kpKSkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19hY2N0LmMgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19hY2N0LmMKaW5kZXggMWI0ZGU0Yi4uZDQ0ZDg5YiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfYWNjdC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2FjY3QuYwpAQCAtMzI2LDE0ICszMjYsMTQgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCS8qIHdlIHdhbnQgdG8gYXZvaWQgcmFjZXMgd2l0aCBuZm5sX2FjY3RfZmluZF9nZXQuICovCi0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmN1ci0+cmVmY250KSkgeworCS8qIFdlIHdhbnQgdG8gYXZvaWQgcmFjZXMgd2l0aCBuZm5sX2FjY3RfcHV0LiBTbyBvbmx5IHdoZW4gdGhlIGN1cnJlbnQKKwkgKiByZWZjbnQgaXMgMSwgd2UgZGVjcmVhc2UgaXQgdG8gMC4KKwkgKi8KKwlpZiAoYXRvbWljX2NtcHhjaGcoJmN1ci0+cmVmY250LCAxLCAwKSA9PSAxKSB7CiAJCS8qIFdlIGFyZSBwcm90ZWN0ZWQgYnkgbmZubCBtdXRleC4gKi8KIAkJbGlzdF9kZWxfcmN1KCZjdXItPmhlYWQpOwogCQlrZnJlZV9yY3UoY3VyLCByY3VfaGVhZCk7CiAJfSBlbHNlIHsKLQkJLyogc3RpbGwgaW4gdXNlLCByZXN0b3JlIHJlZmVyZW5jZSBjb3VudGVyLiAqLwotCQlhdG9taWNfaW5jKCZjdXItPnJlZmNudCk7CiAJCXJldCA9IC1FQlVTWTsKIAl9CiAJcmV0dXJuIHJldDsKQEAgLTM0MywxMiArMzQzLDEyIEBACiAJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsCiAJCQkgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCiB7Ci0JY2hhciAqYWNjdF9uYW1lOwotCXN0cnVjdCBuZl9hY2N0ICpjdXI7CisJc3RydWN0IG5mX2FjY3QgKmN1ciwgKnRtcDsKIAlpbnQgcmV0ID0gLUVOT0VOVDsKKwljaGFyICphY2N0X25hbWU7CiAKIAlpZiAoIXRiW05GQUNDVF9OQU1FXSkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN1ciwgJm5ldC0+bmZubF9hY2N0X2xpc3QsIGhlYWQpCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjdXIsIHRtcCwgJm5ldC0+bmZubF9hY2N0X2xpc3QsIGhlYWQpCiAJCQluZm5sX2FjY3RfdHJ5X2RlbChjdXIpOwogCiAJCXJldHVybiAwOwpAQCAtNDQzLDcgKzQ0Myw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChuZm5sX2FjY3RfdXBkYXRlKTsKIAotc3RhdGljIHZvaWQgbmZubF9vdmVycXVvdGFfcmVwb3J0KHN0cnVjdCBuZl9hY2N0ICpuZmFjY3QpCitzdGF0aWMgdm9pZCBuZm5sX292ZXJxdW90YV9yZXBvcnQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgbmZfYWNjdCAqbmZhY2N0KQogewogCWludCByZXQ7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTQ1OCwxMSArNDU4LDEyIEBACiAJCWtmcmVlX3NrYihza2IpOwogCQlyZXR1cm47CiAJfQotCW5ldGxpbmtfYnJvYWRjYXN0KGluaXRfbmV0Lm5mbmwsIHNrYiwgMCwgTkZOTEdSUF9BQ0NUX1FVT1RBLAorCW5ldGxpbmtfYnJvYWRjYXN0KG5ldC0+bmZubCwgc2tiLCAwLCBORk5MR1JQX0FDQ1RfUVVPVEEsCiAJCQkgIEdGUF9BVE9NSUMpOwogfQogCi1pbnQgbmZubF9hY2N0X292ZXJxdW90YShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmZfYWNjdCAqbmZhY2N0KQoraW50IG5mbmxfYWNjdF9vdmVycXVvdGEoc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJc3RydWN0IG5mX2FjY3QgKm5mYWNjdCkKIHsKIAl1NjQgbm93OwogCXU2NCAqcXVvdGE7CkBAIC00ODAsNyArNDgxLDcgQEAKIAogCWlmIChub3cgPj0gKnF1b3RhICYmCiAJICAgICF0ZXN0X2FuZF9zZXRfYml0KE5GQUNDVF9PVkVSUVVPVEFfQklULCAmbmZhY2N0LT5mbGFncykpIHsKLQkJbmZubF9vdmVycXVvdGFfcmVwb3J0KG5mYWNjdCk7CisJCW5mbmxfb3ZlcnF1b3RhX3JlcG9ydChuZXQsIG5mYWNjdCk7CiAJfQogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2N0aGVscGVyLmMgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19jdGhlbHBlci5jCmluZGV4IGU5MjRlOTUuLjNiNzlmMzQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2N0aGVscGVyLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfY3RoZWxwZXIuYwpAQCAtNDMsNyArNDMsNyBAQAogCWlmIChoZWxwID09IE5VTEwpCiAJCXJldHVybiBORl9EUk9QOwogCi0JLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va19zbG93ICovCisJLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va190aHJlc2ggKi8KIAloZWxwZXIgPSByY3VfZGVyZWZlcmVuY2UoaGVscC0+aGVscGVyKTsKIAlpZiAoaGVscGVyID09IE5VTEwpCiAJCXJldHVybiBORl9EUk9QOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfY3R0aW1lb3V0LmMgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19jdHRpbWVvdXQuYwppbmRleCA0Y2RjZDk2Li4xMzllMDg2IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19jdHRpbWVvdXQuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19jdHRpbWVvdXQuYwpAQCAtOTgsMzEgKzk4LDI4IEBACiAJCWJyZWFrOwogCX0KIAotCWw0cHJvdG8gPSBuZl9jdF9sNHByb3RvX2ZpbmRfZ2V0KGwzbnVtLCBsNG51bSk7Ci0KLQkvKiBUaGlzIHByb3RvY29sIGlzIG5vdCBzdXBwb3J0dGVkLCBza2lwLiAqLwotCWlmIChsNHByb3RvLT5sNHByb3RvICE9IGw0bnVtKSB7Ci0JCXJldCA9IC1FT1BOT1RTVVBQOwotCQlnb3RvIGVycl9wcm90b19wdXQ7Ci0JfQotCiAJaWYgKG1hdGNoaW5nKSB7CiAJCWlmIChubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfUkVQTEFDRSkgewogCQkJLyogWW91IGNhbm5vdCByZXBsYWNlIG9uZSB0aW1lb3V0IHBvbGljeSBieSBhbm90aGVyIG9mCiAJCQkgKiBkaWZmZXJlbnQga2luZCwgc29ycnkuCiAJCQkgKi8KIAkJCWlmIChtYXRjaGluZy0+bDNudW0gIT0gbDNudW0gfHwKLQkJCSAgICBtYXRjaGluZy0+bDRwcm90by0+bDRwcm90byAhPSBsNG51bSkgewotCQkJCXJldCA9IC1FSU5WQUw7Ci0JCQkJZ290byBlcnJfcHJvdG9fcHV0OwotCQkJfQorCQkJICAgIG1hdGNoaW5nLT5sNHByb3RvLT5sNHByb3RvICE9IGw0bnVtKQorCQkJCXJldHVybiAtRUlOVkFMOwogCi0JCQlyZXQgPSBjdG5sX3RpbWVvdXRfcGFyc2VfcG9saWN5KCZtYXRjaGluZy0+ZGF0YSwKLQkJCQkJCQlsNHByb3RvLCBuZXQsCi0JCQkJCQkJY2RhW0NUQV9USU1FT1VUX0RBVEFdKTsKLQkJCXJldHVybiByZXQ7CisJCQlyZXR1cm4gY3RubF90aW1lb3V0X3BhcnNlX3BvbGljeSgmbWF0Y2hpbmctPmRhdGEsCisJCQkJCQkJIG1hdGNoaW5nLT5sNHByb3RvLCBuZXQsCisJCQkJCQkJIGNkYVtDVEFfVElNRU9VVF9EQVRBXSk7CiAJCX0KLQkJcmV0ID0gLUVCVVNZOworCisJCXJldHVybiAtRUJVU1k7CisJfQorCisJbDRwcm90byA9IG5mX2N0X2w0cHJvdG9fZmluZF9nZXQobDNudW0sIGw0bnVtKTsKKworCS8qIFRoaXMgcHJvdG9jb2wgaXMgbm90IHN1cHBvcnR0ZWQsIHNraXAuICovCisJaWYgKGw0cHJvdG8tPmw0cHJvdG8gIT0gbDRudW0pIHsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CiAJCWdvdG8gZXJyX3Byb3RvX3B1dDsKIAl9CiAKQEAgLTMwNSw3ICszMDIsMTYgQEAKIAljb25zdCBzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqbm47CiAJdW5zaWduZWQgaW50IGxhc3RfaHNpemU7CiAJc3BpbmxvY2tfdCAqbG9jazsKLQlpbnQgaTsKKwlpbnQgaSwgY3B1OworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQlzdHJ1Y3QgY3RfcGNwdSAqcGNwdSA9IHBlcl9jcHVfcHRyKG5ldC0+Y3QucGNwdV9saXN0cywgY3B1KTsKKworCQlzcGluX2xvY2tfYmgoJnBjcHUtPmxvY2spOworCQlobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeShoLCBubiwgJnBjcHUtPnVuY29uZmlybWVkLCBobm5vZGUpCisJCQl1bnRpbWVvdXQoaCwgdGltZW91dCk7CisJCXNwaW5fdW5sb2NrX2JoKCZwY3B1LT5sb2NrKTsKKwl9CiAKIAlsb2NhbF9iaF9kaXNhYmxlKCk7CiByZXN0YXJ0OgpAQCAtMzMwLDE2ICszMzYsMTYgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCS8qIHdlIHdhbnQgdG8gYXZvaWQgcmFjZXMgd2l0aCBuZl9jdF90aW1lb3V0X2ZpbmRfZ2V0LiAqLwotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZ0aW1lb3V0LT5yZWZjbnQpKSB7CisJLyogV2Ugd2FudCB0byBhdm9pZCByYWNlcyB3aXRoIGN0bmxfdGltZW91dF9wdXQuIFNvIG9ubHkgd2hlbiB0aGUKKwkgKiBjdXJyZW50IHJlZmNudCBpcyAxLCB3ZSBkZWNyZWFzZSBpdCB0byAwLgorCSAqLworCWlmIChhdG9taWNfY21weGNoZygmdGltZW91dC0+cmVmY250LCAxLCAwKSA9PSAxKSB7CiAJCS8qIFdlIGFyZSBwcm90ZWN0ZWQgYnkgbmZubCBtdXRleC4gKi8KIAkJbGlzdF9kZWxfcmN1KCZ0aW1lb3V0LT5oZWFkKTsKIAkJbmZfY3RfbDRwcm90b19wdXQodGltZW91dC0+bDRwcm90byk7CiAJCWN0bmxfdW50aW1lb3V0KG5ldCwgdGltZW91dCk7CiAJCWtmcmVlX3JjdSh0aW1lb3V0LCByY3VfaGVhZCk7CiAJfSBlbHNlIHsKLQkJLyogc3RpbGwgaW4gdXNlLCByZXN0b3JlIHJlZmVyZW5jZSBjb3VudGVyLiAqLwotCQlhdG9taWNfaW5jKCZ0aW1lb3V0LT5yZWZjbnQpOwogCQlyZXQgPSAtRUJVU1k7CiAJfQogCXJldHVybiByZXQ7CkBAIC0zNTAsMTIgKzM1NiwxMyBAQAogCQkJCSBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwKIAkJCQkgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IGNkYVtdKQogewotCXN0cnVjdCBjdG5sX3RpbWVvdXQgKmN1cjsKKwlzdHJ1Y3QgY3RubF90aW1lb3V0ICpjdXIsICp0bXA7CiAJaW50IHJldCA9IC1FTk9FTlQ7CiAJY2hhciAqbmFtZTsKIAogCWlmICghY2RhW0NUQV9USU1FT1VUX05BTUVdKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoY3VyLCAmbmV0LT5uZmN0X3RpbWVvdXRfbGlzdCwgaGVhZCkKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGN1ciwgdG1wLCAmbmV0LT5uZmN0X3RpbWVvdXRfbGlzdCwKKwkJCQkJIGhlYWQpCiAJCQljdG5sX3RpbWVvdXRfdHJ5X2RlbChuZXQsIGN1cik7CiAKIAkJcmV0dXJuIDA7CkBAIC01NDMsNyArNTUwLDkgQEAKIAogc3RhdGljIHZvaWQgY3RubF90aW1lb3V0X3B1dChzdHJ1Y3QgY3RubF90aW1lb3V0ICp0aW1lb3V0KQogewotCWF0b21pY19kZWMoJnRpbWVvdXQtPnJlZmNudCk7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnRpbWVvdXQtPnJlZmNudCkpCisJCWtmcmVlX3JjdSh0aW1lb3V0LCByY3VfaGVhZCk7CisKIAltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKIH0KICNlbmRpZiAvKiBDT05GSUdfTkZfQ09OTlRSQUNLX1RJTUVPVVQgKi8KQEAgLTU5MSw3ICs2MDAsOSBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjdXIsIHRtcCwgJm5ldC0+bmZjdF90aW1lb3V0X2xpc3QsIGhlYWQpIHsKIAkJbGlzdF9kZWxfcmN1KCZjdXItPmhlYWQpOwogCQluZl9jdF9sNHByb3RvX3B1dChjdXItPmw0cHJvdG8pOwotCQlrZnJlZV9yY3UoY3VyLCByY3VfaGVhZCk7CisKKwkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmN1ci0+cmVmY250KSkKKwkJCWtmcmVlX3JjdShjdXIsIHJjdV9oZWFkKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2xvZy5jIGIvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmMKaW5kZXggY2JjZmRmYi4uZWIwODZhMSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmMKQEAgLTQ0Miw3ICs0NDIsOSBAQAogCQkJaWYgKG5sYV9wdXRfYmUzMihpbnN0LT5za2IsIE5GVUxBX0lGSU5ERVhfUEhZU0lOREVWLAogCQkJCQkgaHRvbmwoaW5kZXYtPmlmaW5kZXgpKSB8fAogCQkJLyogdGhpcyBpcyB0aGUgYnJpZGdlIGdyb3VwICJiclgiICovCi0JCQkvKiByY3VfcmVhZF9sb2NrKCllZCBieSBuZl9ob29rX3Nsb3cgb3IgbmZfbG9nX3BhY2tldCAqLworCQkJLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va190aHJlc2ggb3IKKwkJCSAqIG5mX2xvZ19wYWNrZXQuCisJCQkgKi8KIAkJCSAgICBubGFfcHV0X2JlMzIoaW5zdC0+c2tiLCBORlVMQV9JRklOREVYX0lOREVWLAogCQkJCQkgaHRvbmwoYnJfcG9ydF9nZXRfcmN1KGluZGV2KS0+YnItPmRldi0+aWZpbmRleCkpKQogCQkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwpAQCAtNDc3LDcgKzQ3OSw5IEBACiAJCQlpZiAobmxhX3B1dF9iZTMyKGluc3QtPnNrYiwgTkZVTEFfSUZJTkRFWF9QSFlTT1VUREVWLAogCQkJCQkgaHRvbmwob3V0ZGV2LT5pZmluZGV4KSkgfHwKIAkJCS8qIHRoaXMgaXMgdGhlIGJyaWRnZSBncm91cCAiYnJYIiAqLwotCQkJLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va19zbG93IG9yIG5mX2xvZ19wYWNrZXQgKi8KKwkJCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfdGhyZXNoIG9yCisJCQkgKiBuZl9sb2dfcGFja2V0LgorCQkJICovCiAJCQkgICAgbmxhX3B1dF9iZTMyKGluc3QtPnNrYiwgTkZVTEFfSUZJTkRFWF9PVVRERVYsCiAJCQkJCSBodG9ubChicl9wb3J0X2dldF9yY3Uob3V0ZGV2KS0+YnItPmRldi0+aWZpbmRleCkpKQogCQkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwpAQCAtMTE0Nyw2ICsxMTUxLDcgQEAKIE1PRFVMRV9BTElBU19ORl9MT0dHRVIoQUZfSU5FVCwgMSk7CiBNT0RVTEVfQUxJQVNfTkZfTE9HR0VSKEFGX0lORVQ2LCAxKTsKIE1PRFVMRV9BTElBU19ORl9MT0dHRVIoQUZfQlJJREdFLCAxKTsKK01PRFVMRV9BTElBU19ORl9MT0dHRVIoMywgMSk7IC8qIE5GUFJPVE9fQVJQICovCiAKIG1vZHVsZV9pbml0KG5mbmV0bGlua19sb2dfaW5pdCk7CiBtb2R1bGVfZXhpdChuZm5ldGxpbmtfbG9nX2ZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuYyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlLmMKaW5kZXggNWQzNmEwOS4uYWY4MzJjNSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZS5jCkBAIC03NDAsNyArNzQwLDcgQEAKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBlbnRyeS0+c3RhdGUubmV0OwogCXN0cnVjdCBuZm5sX3F1ZXVlX25ldCAqcSA9IG5mbmxfcXVldWVfcGVybmV0KG5ldCk7CiAKLQkvKiByY3VfcmVhZF9sb2NrKCllZCBieSBuZl9ob29rX3Nsb3coKSAqLworCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfdGhyZXNoICovCiAJcXVldWUgPSBpbnN0YW5jZV9sb29rdXAocSwgcXVldWVudW0pOwogCWlmICghcXVldWUpCiAJCXJldHVybiAtRVNSQ0g7CkBAIC05MTcsMTIgKzkxNywxNCBAQAogCS5ub3RpZmllcl9jYWxsCT0gbmZxbmxfcmN2X2Rldl9ldmVudCwKIH07CiAKLXN0YXRpYyBpbnQgbmZfaG9va19jbXAoc3RydWN0IG5mX3F1ZXVlX2VudHJ5ICplbnRyeSwgdW5zaWduZWQgbG9uZyBvcHNfcHRyKQorc3RhdGljIGludCBuZl9ob29rX2NtcChzdHJ1Y3QgbmZfcXVldWVfZW50cnkgKmVudHJ5LCB1bnNpZ25lZCBsb25nIGVudHJ5X3B0cikKIHsKLQlyZXR1cm4gZW50cnktPmVsZW0gPT0gKHN0cnVjdCBuZl9ob29rX29wcyAqKW9wc19wdHI7CisJcmV0dXJuIHJjdV9hY2Nlc3NfcG9pbnRlcihlbnRyeS0+c3RhdGUuaG9va19lbnRyaWVzKSA9PQorCQkoc3RydWN0IG5mX2hvb2tfZW50cnkgKillbnRyeV9wdHI7CiB9CiAKLXN0YXRpYyB2b2lkIG5mcW5sX25mX2hvb2tfZHJvcChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBuZl9ob29rX29wcyAqaG9vaykKK3N0YXRpYyB2b2lkIG5mcW5sX25mX2hvb2tfZHJvcChzdHJ1Y3QgbmV0ICpuZXQsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfZW50cnkgKmhvb2spCiB7CiAJc3RydWN0IG5mbmxfcXVldWVfbmV0ICpxID0gbmZubF9xdWV1ZV9wZXJuZXQobmV0KTsKIAlpbnQgaTsKQEAgLTExNDUsMTAgKzExNDcsOCBAQAogCXN0cnVjdCBuZm5sX3F1ZXVlX25ldCAqcSA9IG5mbmxfcXVldWVfcGVybmV0KG5ldCk7CiAJaW50IGVycjsKIAotCXF1ZXVlID0gaW5zdGFuY2VfbG9va3VwKHEsIHF1ZXVlX251bSk7Ci0JaWYgKCFxdWV1ZSkKLQkJcXVldWUgPSB2ZXJkaWN0X2luc3RhbmNlX2xvb2t1cChxLCBxdWV1ZV9udW0sCi0JCQkJCQlORVRMSU5LX0NCKHNrYikucG9ydGlkKTsKKwlxdWV1ZSA9IHZlcmRpY3RfaW5zdGFuY2VfbG9va3VwKHEsIHF1ZXVlX251bSwKKwkJCQkJTkVUTElOS19DQihza2IpLnBvcnRpZCk7CiAJaWYgKElTX0VSUihxdWV1ZSkpCiAJCXJldHVybiBQVFJfRVJSKHF1ZXVlKTsKIApAQCAtMTUyNCw5ICsxNTI0LDE2IEBACiAJCWdvdG8gY2xlYW51cF9uZXRsaW5rX25vdGlmaWVyOwogCX0KIAotCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmbmZxbmxfZGV2X25vdGlmaWVyKTsKKwlzdGF0dXMgPSByZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJm5mcW5sX2Rldl9ub3RpZmllcik7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJcHJfZXJyKCJuZl9xdWV1ZTogZmFpbGVkIHRvIHJlZ2lzdGVyIG5ldGRldmljZSBub3RpZmllclxuIik7CisJCWdvdG8gY2xlYW51cF9uZXRsaW5rX3N1YnN5czsKKwl9CisKIAlyZXR1cm4gc3RhdHVzOwogCitjbGVhbnVwX25ldGxpbmtfc3Vic3lzOgorCW5mbmV0bGlua19zdWJzeXNfdW5yZWdpc3RlcigmbmZxbmxfc3Vic3lzKTsKIGNsZWFudXBfbmV0bGlua19ub3RpZmllcjoKIAluZXRsaW5rX3VucmVnaXN0ZXJfbm90aWZpZXIoJm5mcW5sX3J0bmxfbm90aWZpZXIpOwogCXVucmVnaXN0ZXJfcGVybmV0X3N1YnN5cygmbmZubF9xdWV1ZV9uZXRfb3BzKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X2JpdHdpc2UuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2JpdHdpc2UuYwppbmRleCBkNzFjYzE4Li4zMWMxNWVkIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9iaXR3aXNlLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfYml0d2lzZS5jCkBAIC01Miw2ICs1Miw3IEBACiB7CiAJc3RydWN0IG5mdF9iaXR3aXNlICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKIAlzdHJ1Y3QgbmZ0X2RhdGFfZGVzYyBkMSwgZDI7CisJdTMyIGxlbjsKIAlpbnQgZXJyOwogCiAJaWYgKHRiW05GVEFfQklUV0lTRV9TUkVHXSA9PSBOVUxMIHx8CkBAIC02MSw3ICs2MiwxMiBAQAogCSAgICB0YltORlRBX0JJVFdJU0VfWE9SXSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXByaXYtPmxlbiAgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9CSVRXSVNFX0xFTl0pKTsKKwllcnIgPSBuZnRfcGFyc2VfdTMyX2NoZWNrKHRiW05GVEFfQklUV0lTRV9MRU5dLCBVOF9NQVgsICZsZW4pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcHJpdi0+bGVuID0gbGVuOworCiAJcHJpdi0+c3JlZyA9IG5mdF9wYXJzZV9yZWdpc3Rlcih0YltORlRBX0JJVFdJU0VfU1JFR10pOwogCWVyciA9IG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9sb2FkKHByaXYtPnNyZWcsIHByaXYtPmxlbik7CiAJaWYgKGVyciA8IDApCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mdF9ieXRlb3JkZXIuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2J5dGVvcmRlci5jCmluZGV4IGI3OGMyOGIuLmVlNjNkOTggMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZ0X2J5dGVvcmRlci5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2J5dGVvcmRlci5jCkBAIC05OSw2ICs5OSw3IEBACiAJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSkKIHsKIAlzdHJ1Y3QgbmZ0X2J5dGVvcmRlciAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CisJdTMyIHNpemUsIGxlbjsKIAlpbnQgZXJyOwogCiAJaWYgKHRiW05GVEFfQllURU9SREVSX1NSRUddID09IE5VTEwgfHwKQEAgLTExNyw3ICsxMTgsMTIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcHJpdi0+c2l6ZSA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX0JZVEVPUkRFUl9TSVpFXSkpOworCWVyciA9IG5mdF9wYXJzZV91MzJfY2hlY2sodGJbTkZUQV9CWVRFT1JERVJfU0laRV0sIFU4X01BWCwgJnNpemUpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcHJpdi0+c2l6ZSA9IHNpemU7CisKIAlzd2l0Y2ggKHByaXYtPnNpemUpIHsKIAljYXNlIDI6CiAJY2FzZSA0OgpAQCAtMTI4LDcgKzEzNCwxMiBAQAogCX0KIAogCXByaXYtPnNyZWcgPSBuZnRfcGFyc2VfcmVnaXN0ZXIodGJbTkZUQV9CWVRFT1JERVJfU1JFR10pOwotCXByaXYtPmxlbiAgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9CWVRFT1JERVJfTEVOXSkpOworCWVyciA9IG5mdF9wYXJzZV91MzJfY2hlY2sodGJbTkZUQV9CWVRFT1JERVJfTEVOXSwgVThfTUFYLCAmbGVuKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXByaXYtPmxlbiA9IGxlbjsKKwogCWVyciA9IG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9sb2FkKHByaXYtPnNyZWcsIHByaXYtPmxlbik7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mdF9jbXAuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2NtcC5jCmluZGV4IGUyNWIzNWQuLjJlNTM3MzkgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZ0X2NtcC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2NtcC5jCkBAIC04NCw2ICs4NCw5IEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKKwlpZiAoZGVzYy5sZW4gPiBVOF9NQVgpCisJCXJldHVybiAtRVJBTkdFOworCiAJcHJpdi0+b3AgID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfQ01QX09QXSkpOwogCXByaXYtPmxlbiA9IGRlc2MubGVuOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfY3QuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2N0LmMKaW5kZXggNTFlMTgwZi4uZDdiMGQxNzEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZ0X2N0LmMKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfY3QuYwpAQCAtMTI4LDE1ICsxMjgsMTggQEAKIAkJbWVtY3B5KGRlc3QsICZjb3VudCwgc2l6ZW9mKGNvdW50KSk7CiAJCXJldHVybjsKIAl9CisJY2FzZSBORlRfQ1RfTDNQUk9UT0NPTDoKKwkJKmRlc3QgPSBuZl9jdF9sM251bShjdCk7CisJCXJldHVybjsKKwljYXNlIE5GVF9DVF9QUk9UT0NPTDoKKwkJKmRlc3QgPSBuZl9jdF9wcm90b251bShjdCk7CisJCXJldHVybjsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CiAKIAl0dXBsZSA9ICZjdC0+dHVwbGVoYXNoW3ByaXYtPmRpcl0udHVwbGU7CiAJc3dpdGNoIChwcml2LT5rZXkpIHsKLQljYXNlIE5GVF9DVF9MM1BST1RPQ09MOgotCQkqZGVzdCA9IG5mX2N0X2wzbnVtKGN0KTsKLQkJcmV0dXJuOwogCWNhc2UgTkZUX0NUX1NSQzoKIAkJbWVtY3B5KGRlc3QsIHR1cGxlLT5zcmMudTMuYWxsLAogCQkgICAgICAgbmZfY3RfbDNudW0oY3QpID09IE5GUFJPVE9fSVBWNCA/IDQgOiAxNik7CkBAIC0xNDUsOSArMTQ4LDYgQEAKIAkJbWVtY3B5KGRlc3QsIHR1cGxlLT5kc3QudTMuYWxsLAogCQkgICAgICAgbmZfY3RfbDNudW0oY3QpID09IE5GUFJPVE9fSVBWNCA/IDQgOiAxNik7CiAJCXJldHVybjsKLQljYXNlIE5GVF9DVF9QUk9UT0NPTDoKLQkJKmRlc3QgPSBuZl9jdF9wcm90b251bShjdCk7Ci0JCXJldHVybjsKIAljYXNlIE5GVF9DVF9QUk9UT19TUkM6CiAJCSpkZXN0ID0gKF9fZm9yY2UgX191MTYpdHVwbGUtPnNyYy51LmFsbDsKIAkJcmV0dXJuOwpAQCAtMjgzLDggKzI4Myw5IEBACiAKIAljYXNlIE5GVF9DVF9MM1BST1RPQ09MOgogCWNhc2UgTkZUX0NUX1BST1RPQ09MOgotCQlpZiAodGJbTkZUQV9DVF9ESVJFQ1RJT05dID09IE5VTEwpCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJLyogRm9yIGNvbXBhdGliaWxpdHksIGRvIG5vdCByZXBvcnQgZXJyb3IgaWYgTkZUQV9DVF9ESVJFQ1RJT04KKwkJICogYXR0cmlidXRlIGlzIHNwZWNpZmllZC4KKwkJICovCiAJCWxlbiA9IHNpemVvZih1OCk7CiAJCWJyZWFrOwogCWNhc2UgTkZUX0NUX1NSQzoKQEAgLTM2Myw2ICszNjQsOCBAQAogCXN3aXRjaCAocHJpdi0+a2V5KSB7CiAjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19NQVJLCiAJY2FzZSBORlRfQ1RfTUFSSzoKKwkJaWYgKHRiW05GVEFfQ1RfRElSRUNUSU9OXSkKKwkJCXJldHVybiAtRUlOVkFMOwogCQlsZW4gPSBGSUVMRF9TSVpFT0Yoc3RydWN0IG5mX2Nvbm4sIG1hcmspOwogCQlicmVhazsKICNlbmRpZgpAQCAtNDMyLDggKzQzNSw2IEBACiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCiAJc3dpdGNoIChwcml2LT5rZXkpIHsKLQljYXNlIE5GVF9DVF9MM1BST1RPQ09MOgotCWNhc2UgTkZUX0NUX1BST1RPQ09MOgogCWNhc2UgTkZUX0NUX1NSQzoKIAljYXNlIE5GVF9DVF9EU1Q6CiAJY2FzZSBORlRfQ1RfUFJPVE9fU1JDOgpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfZHluc2V0LmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9keW5zZXQuYwppbmRleCAwYWYyNjY5Li5lM2I4M2MzIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9keW5zZXQuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9keW5zZXQuYwpAQCAtMjIsNiArMjIsNyBAQAogCWVudW0gbmZ0X2R5bnNldF9vcHMJCW9wOjg7CiAJZW51bSBuZnRfcmVnaXN0ZXJzCQlzcmVnX2tleTo4OwogCWVudW0gbmZ0X3JlZ2lzdGVycwkJc3JlZ19kYXRhOjg7CisJYm9vbAkJCQlpbnZlcnQ7CiAJdTY0CQkJCXRpbWVvdXQ7CiAJc3RydWN0IG5mdF9leHByCQkJKmV4cHI7CiAJc3RydWN0IG5mdF9zZXRfYmluZGluZwkJYmluZGluZzsKQEAgLTgyLDEwICs4MywxNCBAQAogCiAJCWlmIChzZXhwciAhPSBOVUxMKQogCQkJc2V4cHItPm9wcy0+ZXZhbChzZXhwciwgcmVncywgcGt0KTsKKworCQlpZiAocHJpdi0+aW52ZXJ0KQorCQkJcmVncy0+dmVyZGljdC5jb2RlID0gTkZUX0JSRUFLOwogCQlyZXR1cm47CiAJfQogb3V0OgotCXJlZ3MtPnZlcmRpY3QuY29kZSA9IE5GVF9CUkVBSzsKKwlpZiAoIXByaXYtPmludmVydCkKKwkJcmVncy0+dmVyZGljdC5jb2RlID0gTkZUX0JSRUFLOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgbmZ0X2R5bnNldF9wb2xpY3lbTkZUQV9EWU5TRVRfTUFYICsgMV0gPSB7CkBAIC05Niw2ICsxMDEsNyBAQAogCVtORlRBX0RZTlNFVF9TUkVHX0RBVEFdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKIAlbTkZUQV9EWU5TRVRfVElNRU9VVF0JPSB7IC50eXBlID0gTkxBX1U2NCB9LAogCVtORlRBX0RZTlNFVF9FWFBSXQk9IHsgLnR5cGUgPSBOTEFfTkVTVEVEIH0sCisJW05GVEFfRFlOU0VUX0ZMQUdTXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiB9OwogCiBzdGF0aWMgaW50IG5mdF9keW5zZXRfaW5pdChjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LApAQCAtMTEzLDYgKzExOSwxNSBAQAogCSAgICB0YltORlRBX0RZTlNFVF9TUkVHX0tFWV0gPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAodGJbTkZUQV9EWU5TRVRfRkxBR1NdKSB7CisJCXUzMiBmbGFncyA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX0RZTlNFVF9GTEFHU10pKTsKKworCQlpZiAoZmxhZ3MgJiB+TkZUX0RZTlNFVF9GX0lOVikKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoZmxhZ3MgJiBORlRfRFlOU0VUX0ZfSU5WKQorCQkJcHJpdi0+aW52ZXJ0ID0gdHJ1ZTsKKwl9CisKIAlzZXQgPSBuZl90YWJsZXNfc2V0X2xvb2t1cChjdHgtPnRhYmxlLCB0YltORlRBX0RZTlNFVF9TRVRfTkFNRV0sCiAJCQkJICAgZ2VubWFzayk7CiAJaWYgKElTX0VSUihzZXQpKSB7CkBAIC0yMjAsNiArMjM1LDcgQEAKIHN0YXRpYyBpbnQgbmZ0X2R5bnNldF9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwcikKIHsKIAljb25zdCBzdHJ1Y3QgbmZ0X2R5bnNldCAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CisJdTMyIGZsYWdzID0gcHJpdi0+aW52ZXJ0ID8gTkZUX0RZTlNFVF9GX0lOViA6IDA7CiAKIAlpZiAobmZ0X2R1bXBfcmVnaXN0ZXIoc2tiLCBORlRBX0RZTlNFVF9TUkVHX0tFWSwgcHJpdi0+c3JlZ19rZXkpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKQEAgLTIzNSw2ICsyNTEsOCBAQAogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAlpZiAocHJpdi0+ZXhwciAmJiBuZnRfZXhwcl9kdW1wKHNrYiwgTkZUQV9EWU5TRVRfRVhQUiwgcHJpdi0+ZXhwcikpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCWlmIChubGFfcHV0X2JlMzIoc2tiLCBORlRBX0RZTlNFVF9GTEFHUywgaHRvbmwoZmxhZ3MpKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJcmV0dXJuIDA7CiAKIG5sYV9wdXRfZmFpbHVyZToKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X2V4dGhkci5jIGIvbmV0L25ldGZpbHRlci9uZnRfZXh0aGRyLmMKaW5kZXggYmE3YWVkMS4uYTg0Y2YzZCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfZXh0aGRyLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfZXh0aGRyLmMKQEAgLTU5LDYgKzU5LDcgQEAKIAkJCSAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCB0YltdKQogewogCXN0cnVjdCBuZnRfZXh0aGRyICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKwl1MzIgb2Zmc2V0LCBsZW4sIGVycjsKIAogCWlmICh0YltORlRBX0VYVEhEUl9EUkVHXSA9PSBOVUxMIHx8CiAJICAgIHRiW05GVEFfRVhUSERSX1RZUEVdID09IE5VTEwgfHwKQEAgLTY2LDkgKzY3LDE3IEBACiAJICAgIHRiW05GVEFfRVhUSERSX0xFTl0gPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwllcnIgPSBuZnRfcGFyc2VfdTMyX2NoZWNrKHRiW05GVEFfRVhUSERSX09GRlNFVF0sIFU4X01BWCwgJm9mZnNldCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBuZnRfcGFyc2VfdTMyX2NoZWNrKHRiW05GVEFfRVhUSERSX0xFTl0sIFU4X01BWCwgJmxlbik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKIAlwcml2LT50eXBlICAgPSBubGFfZ2V0X3U4KHRiW05GVEFfRVhUSERSX1RZUEVdKTsKLQlwcml2LT5vZmZzZXQgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9FWFRIRFJfT0ZGU0VUXSkpOwotCXByaXYtPmxlbiAgICA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX0VYVEhEUl9MRU5dKSk7CisJcHJpdi0+b2Zmc2V0ID0gb2Zmc2V0OworCXByaXYtPmxlbiAgICA9IGxlbjsKIAlwcml2LT5kcmVnICAgPSBuZnRfcGFyc2VfcmVnaXN0ZXIodGJbTkZUQV9FWFRIRFJfRFJFR10pOwogCiAJcmV0dXJuIG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9zdG9yZShjdHgsIHByaXYtPmRyZWcsIE5VTEwsCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mdF9oYXNoLmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9oYXNoLmMKaW5kZXggNTY0ZmE3OS4uMDk0NzNiNCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfaGFzaC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2hhc2guYwpAQCAtMSwzOTUgKzEsMTQ1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTQgUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgTGF1cmEgR2FyY2lhIDxuZXZvbGFAZ21haWwuY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogRGV2ZWxvcG1lbnQgb2YgdGhpcyBjb2RlIGZ1bmRlZCBieSBBc3Rhcm8gQUcgKGh0dHA6Ly93d3cuYXN0YXJvLmNvbS8pCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbG9nMi5oPgotI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L3JoYXNodGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfdGFibGVzLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl90YWJsZXMuaD4KLQotLyogV2UgdGFyZ2V0IGEgaGFzaCB0YWJsZSBzaXplIG9mIDQsIGVsZW1lbnQgaGludCBpcyA3NSUgb2YgZmluYWwgc2l6ZSAqLwotI2RlZmluZSBORlRfSEFTSF9FTEVNRU5UX0hJTlQgMworI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgogCiBzdHJ1Y3QgbmZ0X2hhc2ggewotCXN0cnVjdCByaGFzaHRhYmxlCQlodDsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrCQlnY193b3JrOworCWVudW0gbmZ0X3JlZ2lzdGVycyAgICAgIHNyZWc6ODsKKwllbnVtIG5mdF9yZWdpc3RlcnMgICAgICBkcmVnOjg7CisJdTgJCQlsZW47CisJdTMyCQkJbW9kdWx1czsKKwl1MzIJCQlzZWVkOworCXUzMgkJCW9mZnNldDsKIH07CiAKLXN0cnVjdCBuZnRfaGFzaF9lbGVtIHsKLQlzdHJ1Y3Qgcmhhc2hfaGVhZAkJbm9kZTsKLQlzdHJ1Y3QgbmZ0X3NldF9leHQJCWV4dDsKK3N0YXRpYyB2b2lkIG5mdF9oYXNoX2V2YWwoY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkJICBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MsCisJCQkgIGNvbnN0IHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0KQoreworCXN0cnVjdCBuZnRfaGFzaCAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CisJY29uc3Qgdm9pZCAqZGF0YSA9ICZyZWdzLT5kYXRhW3ByaXYtPnNyZWddOworCXUzMiBoOworCisJaCA9IHJlY2lwcm9jYWxfc2NhbGUoamhhc2goZGF0YSwgcHJpdi0+bGVuLCBwcml2LT5zZWVkKSwgcHJpdi0+bW9kdWx1cyk7CisJcmVncy0+ZGF0YVtwcml2LT5kcmVnXSA9IGggKyBwcml2LT5vZmZzZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBuZnRfaGFzaF9wb2xpY3lbTkZUQV9IQVNIX01BWCArIDFdID0geworCVtORlRBX0hBU0hfU1JFR10JPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtORlRBX0hBU0hfRFJFR10JPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtORlRBX0hBU0hfTEVOXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtORlRBX0hBU0hfTU9EVUxVU10JPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtORlRBX0hBU0hfU0VFRF0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAogfTsKIAotc3RydWN0IG5mdF9oYXNoX2NtcF9hcmcgewotCWNvbnN0IHN0cnVjdCBuZnRfc2V0CQkqc2V0OwotCWNvbnN0IHUzMgkJCSprZXk7Ci0JdTgJCQkJZ2VubWFzazsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgbmZ0X2hhc2hfcGFyYW1zOwotCi1zdGF0aWMgaW5saW5lIHUzMiBuZnRfaGFzaF9rZXkoY29uc3Qgdm9pZCAqZGF0YSwgdTMyIGxlbiwgdTMyIHNlZWQpCi17Ci0JY29uc3Qgc3RydWN0IG5mdF9oYXNoX2NtcF9hcmcgKmFyZyA9IGRhdGE7Ci0KLQlyZXR1cm4gamhhc2goYXJnLT5rZXksIGxlbiwgc2VlZCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIG5mdF9oYXNoX29iaihjb25zdCB2b2lkICpkYXRhLCB1MzIgbGVuLCB1MzIgc2VlZCkKLXsKLQljb25zdCBzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSAqaGUgPSBkYXRhOwotCi0JcmV0dXJuIGpoYXNoKG5mdF9zZXRfZXh0X2tleSgmaGUtPmV4dCksIGxlbiwgc2VlZCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG5mdF9oYXNoX2NtcChzdHJ1Y3Qgcmhhc2h0YWJsZV9jb21wYXJlX2FyZyAqYXJnLAotCQkJICAgICAgIGNvbnN0IHZvaWQgKnB0cikKLXsKLQljb25zdCBzdHJ1Y3QgbmZ0X2hhc2hfY21wX2FyZyAqeCA9IGFyZy0+a2V5OwotCWNvbnN0IHN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZSA9IHB0cjsKLQotCWlmIChtZW1jbXAobmZ0X3NldF9leHRfa2V5KCZoZS0+ZXh0KSwgeC0+a2V5LCB4LT5zZXQtPmtsZW4pKQotCQlyZXR1cm4gMTsKLQlpZiAobmZ0X3NldF9lbGVtX2V4cGlyZWQoJmhlLT5leHQpKQotCQlyZXR1cm4gMTsKLQlpZiAoIW5mdF9zZXRfZWxlbV9hY3RpdmUoJmhlLT5leHQsIHgtPmdlbm1hc2spKQotCQlyZXR1cm4gMTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGJvb2wgbmZ0X2hhc2hfbG9va3VwKGNvbnN0IHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKLQkJCSAgICBjb25zdCB1MzIgKmtleSwgY29uc3Qgc3RydWN0IG5mdF9zZXRfZXh0ICoqZXh0KQotewotCXN0cnVjdCBuZnRfaGFzaCAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOwotCWNvbnN0IHN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZTsKLQlzdHJ1Y3QgbmZ0X2hhc2hfY21wX2FyZyBhcmcgPSB7Ci0JCS5nZW5tYXNrID0gbmZ0X2dlbm1hc2tfY3VyKG5ldCksCi0JCS5zZXQJID0gc2V0LAotCQkua2V5CSA9IGtleSwKLQl9OwotCi0JaGUgPSByaGFzaHRhYmxlX2xvb2t1cF9mYXN0KCZwcml2LT5odCwgJmFyZywgbmZ0X2hhc2hfcGFyYW1zKTsKLQlpZiAoaGUgIT0gTlVMTCkKLQkJKmV4dCA9ICZoZS0+ZXh0OwotCi0JcmV0dXJuICEhaGU7Ci19Ci0KLXN0YXRpYyBib29sIG5mdF9oYXNoX3VwZGF0ZShzdHJ1Y3QgbmZ0X3NldCAqc2V0LCBjb25zdCB1MzIgKmtleSwKLQkJCSAgICB2b2lkICooKm5ldykoc3RydWN0IG5mdF9zZXQgKiwKLQkJCQkJIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqLAotCQkJCQkgc3RydWN0IG5mdF9yZWdzICpyZWdzKSwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCi0JCQkgICAgc3RydWN0IG5mdF9yZWdzICpyZWdzLAotCQkJICAgIGNvbnN0IHN0cnVjdCBuZnRfc2V0X2V4dCAqKmV4dCkKLXsKLQlzdHJ1Y3QgbmZ0X2hhc2ggKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKLQlzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSAqaGU7Ci0Jc3RydWN0IG5mdF9oYXNoX2NtcF9hcmcgYXJnID0gewotCQkuZ2VubWFzayA9IE5GVF9HRU5NQVNLX0FOWSwKLQkJLnNldAkgPSBzZXQsCi0JCS5rZXkJID0ga2V5LAotCX07Ci0KLQloZSA9IHJoYXNodGFibGVfbG9va3VwX2Zhc3QoJnByaXYtPmh0LCAmYXJnLCBuZnRfaGFzaF9wYXJhbXMpOwotCWlmIChoZSAhPSBOVUxMKQotCQlnb3RvIG91dDsKLQotCWhlID0gbmV3KHNldCwgZXhwciwgcmVncyk7Ci0JaWYgKGhlID09IE5VTEwpCi0JCWdvdG8gZXJyMTsKLQlpZiAocmhhc2h0YWJsZV9sb29rdXBfaW5zZXJ0X2tleSgmcHJpdi0+aHQsICZhcmcsICZoZS0+bm9kZSwKLQkJCQkJIG5mdF9oYXNoX3BhcmFtcykpCi0JCWdvdG8gZXJyMjsKLW91dDoKLQkqZXh0ID0gJmhlLT5leHQ7Ci0JcmV0dXJuIHRydWU7Ci0KLWVycjI6Ci0JbmZ0X3NldF9lbGVtX2Rlc3Ryb3koc2V0LCBoZSk7Ci1lcnIxOgotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGludCBuZnRfaGFzaF9pbnNlcnQoY29uc3Qgc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAotCQkJICAgY29uc3Qgc3RydWN0IG5mdF9zZXRfZWxlbSAqZWxlbSkKLXsKLQlzdHJ1Y3QgbmZ0X2hhc2ggKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKLQlzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSAqaGUgPSBlbGVtLT5wcml2OwotCXN0cnVjdCBuZnRfaGFzaF9jbXBfYXJnIGFyZyA9IHsKLQkJLmdlbm1hc2sgPSBuZnRfZ2VubWFza19uZXh0KG5ldCksCi0JCS5zZXQJID0gc2V0LAotCQkua2V5CSA9IGVsZW0tPmtleS52YWwuZGF0YSwKLQl9OwotCi0JcmV0dXJuIHJoYXNodGFibGVfbG9va3VwX2luc2VydF9rZXkoJnByaXYtPmh0LCAmYXJnLCAmaGUtPm5vZGUsCi0JCQkJCSAgICBuZnRfaGFzaF9wYXJhbXMpOwotfQotCi1zdGF0aWMgdm9pZCBuZnRfaGFzaF9hY3RpdmF0ZShjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtKQotewotCXN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZSA9IGVsZW0tPnByaXY7Ci0KLQluZnRfc2V0X2VsZW1fY2hhbmdlX2FjdGl2ZShuZXQsIHNldCwgJmhlLT5leHQpOwotCW5mdF9zZXRfZWxlbV9jbGVhcl9idXN5KCZoZS0+ZXh0KTsKLX0KLQotc3RhdGljIHZvaWQgKm5mdF9oYXNoX2RlYWN0aXZhdGUoY29uc3Qgc3RydWN0IG5ldCAqbmV0LAotCQkJCSBjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAotCQkJCSBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtKQotewotCXN0cnVjdCBuZnRfaGFzaCAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOwotCXN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZTsKLQlzdHJ1Y3QgbmZ0X2hhc2hfY21wX2FyZyBhcmcgPSB7Ci0JCS5nZW5tYXNrID0gbmZ0X2dlbm1hc2tfbmV4dChuZXQpLAotCQkuc2V0CSA9IHNldCwKLQkJLmtleQkgPSBlbGVtLT5rZXkudmFsLmRhdGEsCi0JfTsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQloZSA9IHJoYXNodGFibGVfbG9va3VwX2Zhc3QoJnByaXYtPmh0LCAmYXJnLCBuZnRfaGFzaF9wYXJhbXMpOwotCWlmIChoZSAhPSBOVUxMKSB7Ci0JCWlmICghbmZ0X3NldF9lbGVtX21hcmtfYnVzeSgmaGUtPmV4dCkgfHwKLQkJICAgICFuZnRfaXNfYWN0aXZlKG5ldCwgJmhlLT5leHQpKQotCQkJbmZ0X3NldF9lbGVtX2NoYW5nZV9hY3RpdmUobmV0LCBzZXQsICZoZS0+ZXh0KTsKLQkJZWxzZQotCQkJaGUgPSBOVUxMOwotCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCXJldHVybiBoZTsKLX0KLQotc3RhdGljIHZvaWQgbmZ0X2hhc2hfcmVtb3ZlKGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCi0JCQkgICAgY29uc3Qgc3RydWN0IG5mdF9zZXRfZWxlbSAqZWxlbSkKLXsKLQlzdHJ1Y3QgbmZ0X2hhc2ggKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKLQlzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSAqaGUgPSBlbGVtLT5wcml2OwotCi0Jcmhhc2h0YWJsZV9yZW1vdmVfZmFzdCgmcHJpdi0+aHQsICZoZS0+bm9kZSwgbmZ0X2hhc2hfcGFyYW1zKTsKLX0KLQotc3RhdGljIHZvaWQgbmZ0X2hhc2hfd2Fsayhjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LCBjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAotCQkJICBzdHJ1Y3QgbmZ0X3NldF9pdGVyICppdGVyKQotewotCXN0cnVjdCBuZnRfaGFzaCAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOwotCXN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZTsKLQlzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyIGh0aTsKLQlzdHJ1Y3QgbmZ0X3NldF9lbGVtIGVsZW07Ci0JaW50IGVycjsKLQotCWVyciA9IHJoYXNodGFibGVfd2Fsa19pbml0KCZwcml2LT5odCwgJmh0aSwgR0ZQX0tFUk5FTCk7Ci0JaXRlci0+ZXJyID0gZXJyOwotCWlmIChlcnIpCi0JCXJldHVybjsKLQotCWVyciA9IHJoYXNodGFibGVfd2Fsa19zdGFydCgmaHRpKTsKLQlpZiAoZXJyICYmIGVyciAhPSAtRUFHQUlOKSB7Ci0JCWl0ZXItPmVyciA9IGVycjsKLQkJZ290byBvdXQ7Ci0JfQotCi0Jd2hpbGUgKChoZSA9IHJoYXNodGFibGVfd2Fsa19uZXh0KCZodGkpKSkgewotCQlpZiAoSVNfRVJSKGhlKSkgewotCQkJZXJyID0gUFRSX0VSUihoZSk7Ci0JCQlpZiAoZXJyICE9IC1FQUdBSU4pIHsKLQkJCQlpdGVyLT5lcnIgPSBlcnI7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0KLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKGl0ZXItPmNvdW50IDwgaXRlci0+c2tpcCkKLQkJCWdvdG8gY29udDsKLQkJaWYgKG5mdF9zZXRfZWxlbV9leHBpcmVkKCZoZS0+ZXh0KSkKLQkJCWdvdG8gY29udDsKLQkJaWYgKCFuZnRfc2V0X2VsZW1fYWN0aXZlKCZoZS0+ZXh0LCBpdGVyLT5nZW5tYXNrKSkKLQkJCWdvdG8gY29udDsKLQotCQllbGVtLnByaXYgPSBoZTsKLQotCQlpdGVyLT5lcnIgPSBpdGVyLT5mbihjdHgsIHNldCwgaXRlciwgJmVsZW0pOwotCQlpZiAoaXRlci0+ZXJyIDwgMCkKLQkJCWdvdG8gb3V0OwotCi1jb250OgotCQlpdGVyLT5jb3VudCsrOwotCX0KLQotb3V0OgotCXJoYXNodGFibGVfd2Fsa19zdG9wKCZodGkpOwotCXJoYXNodGFibGVfd2Fsa19leGl0KCZodGkpOwotfQotCi1zdGF0aWMgdm9pZCBuZnRfaGFzaF9nYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IG5mdF9zZXQgKnNldDsKLQlzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSAqaGU7Ci0Jc3RydWN0IG5mdF9oYXNoICpwcml2OwotCXN0cnVjdCBuZnRfc2V0X2djX2JhdGNoICpnY2IgPSBOVUxMOwotCXN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgaHRpOwotCWludCBlcnI7Ci0KLQlwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBuZnRfaGFzaCwgZ2Nfd29yay53b3JrKTsKLQlzZXQgID0gbmZ0X3NldF9jb250YWluZXJfb2YocHJpdik7Ci0KLQllcnIgPSByaGFzaHRhYmxlX3dhbGtfaW5pdCgmcHJpdi0+aHQsICZodGksIEdGUF9LRVJORUwpOwotCWlmIChlcnIpCi0JCWdvdG8gc2NoZWR1bGU7Ci0KLQllcnIgPSByaGFzaHRhYmxlX3dhbGtfc3RhcnQoJmh0aSk7Ci0JaWYgKGVyciAmJiBlcnIgIT0gLUVBR0FJTikKLQkJZ290byBvdXQ7Ci0KLQl3aGlsZSAoKGhlID0gcmhhc2h0YWJsZV93YWxrX25leHQoJmh0aSkpKSB7Ci0JCWlmIChJU19FUlIoaGUpKSB7Ci0JCQlpZiAoUFRSX0VSUihoZSkgIT0gLUVBR0FJTikKLQkJCQlnb3RvIG91dDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKCFuZnRfc2V0X2VsZW1fZXhwaXJlZCgmaGUtPmV4dCkpCi0JCQljb250aW51ZTsKLQkJaWYgKG5mdF9zZXRfZWxlbV9tYXJrX2J1c3koJmhlLT5leHQpKQotCQkJY29udGludWU7Ci0KLQkJZ2NiID0gbmZ0X3NldF9nY19iYXRjaF9jaGVjayhzZXQsIGdjYiwgR0ZQX0FUT01JQyk7Ci0JCWlmIChnY2IgPT0gTlVMTCkKLQkJCWdvdG8gb3V0OwotCQlyaGFzaHRhYmxlX3JlbW92ZV9mYXN0KCZwcml2LT5odCwgJmhlLT5ub2RlLCBuZnRfaGFzaF9wYXJhbXMpOwotCQlhdG9taWNfZGVjKCZzZXQtPm5lbGVtcyk7Ci0JCW5mdF9zZXRfZ2NfYmF0Y2hfYWRkKGdjYiwgaGUpOwotCX0KLW91dDoKLQlyaGFzaHRhYmxlX3dhbGtfc3RvcCgmaHRpKTsKLQlyaGFzaHRhYmxlX3dhbGtfZXhpdCgmaHRpKTsKLQotCW5mdF9zZXRfZ2NfYmF0Y2hfY29tcGxldGUoZ2NiKTsKLXNjaGVkdWxlOgotCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fcG93ZXJfZWZmaWNpZW50X3dxLCAmcHJpdi0+Z2Nfd29yaywKLQkJCSAgIG5mdF9zZXRfZ2NfaW50ZXJ2YWwoc2V0KSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbmZ0X2hhc2hfcHJpdnNpemUoY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IG5sYVtdKQotewotCXJldHVybiBzaXplb2Yoc3RydWN0IG5mdF9oYXNoKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBuZnRfaGFzaF9wYXJhbXMgPSB7Ci0JLmhlYWRfb2Zmc2V0CQk9IG9mZnNldG9mKHN0cnVjdCBuZnRfaGFzaF9lbGVtLCBub2RlKSwKLQkuaGFzaGZuCQkJPSBuZnRfaGFzaF9rZXksCi0JLm9ial9oYXNoZm4JCT0gbmZ0X2hhc2hfb2JqLAotCS5vYmpfY21wZm4JCT0gbmZ0X2hhc2hfY21wLAotCS5hdXRvbWF0aWNfc2hyaW5raW5nCT0gdHJ1ZSwKLX07Ci0KLXN0YXRpYyBpbnQgbmZ0X2hhc2hfaW5pdChjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAotCQkJIGNvbnN0IHN0cnVjdCBuZnRfc2V0X2Rlc2MgKmRlc2MsCitzdGF0aWMgaW50IG5mdF9oYXNoX2luaXQoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKKwkJCSBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCiAJCQkgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCiB7Ci0Jc3RydWN0IG5mdF9oYXNoICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7Ci0Jc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHBhcmFtcyA9IG5mdF9oYXNoX3BhcmFtczsKLQlpbnQgZXJyOworCXN0cnVjdCBuZnRfaGFzaCAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CisJdTMyIGxlbjsKIAotCXBhcmFtcy5uZWxlbV9oaW50ID0gZGVzYy0+c2l6ZSA/OiBORlRfSEFTSF9FTEVNRU5UX0hJTlQ7Ci0JcGFyYW1zLmtleV9sZW4JICA9IHNldC0+a2xlbjsKKwlpZiAoIXRiW05GVEFfSEFTSF9TUkVHXSB8fAorCSAgICAhdGJbTkZUQV9IQVNIX0RSRUddIHx8CisJICAgICF0YltORlRBX0hBU0hfTEVOXSAgfHwKKwkgICAgIXRiW05GVEFfSEFTSF9TRUVEXSB8fAorCSAgICAhdGJbTkZUQV9IQVNIX01PRFVMVVNdKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCWVyciA9IHJoYXNodGFibGVfaW5pdCgmcHJpdi0+aHQsICZwYXJhbXMpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOworCWlmICh0YltORlRBX0hBU0hfT0ZGU0VUXSkKKwkJcHJpdi0+b2Zmc2V0ID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfSEFTSF9PRkZTRVRdKSk7CiAKLQlJTklUX0RFRkVSUkFCTEVfV09SSygmcHJpdi0+Z2Nfd29yaywgbmZ0X2hhc2hfZ2MpOwotCWlmIChzZXQtPmZsYWdzICYgTkZUX1NFVF9USU1FT1VUKQotCQlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX3Bvd2VyX2VmZmljaWVudF93cSwgJnByaXYtPmdjX3dvcmssCi0JCQkJICAgbmZ0X3NldF9nY19pbnRlcnZhbChzZXQpKTsKKwlwcml2LT5zcmVnID0gbmZ0X3BhcnNlX3JlZ2lzdGVyKHRiW05GVEFfSEFTSF9TUkVHXSk7CisJcHJpdi0+ZHJlZyA9IG5mdF9wYXJzZV9yZWdpc3Rlcih0YltORlRBX0hBU0hfRFJFR10pOworCisJbGVuID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfSEFTSF9MRU5dKSk7CisJaWYgKGxlbiA9PSAwIHx8IGxlbiA+IFU4X01BWCkKKwkJcmV0dXJuIC1FUkFOR0U7CisKKwlwcml2LT5sZW4gPSBsZW47CisKKwlwcml2LT5tb2R1bHVzID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfSEFTSF9NT0RVTFVTXSkpOworCWlmIChwcml2LT5tb2R1bHVzIDw9IDEpCisJCXJldHVybiAtRVJBTkdFOworCisJaWYgKHByaXYtPm9mZnNldCArIHByaXYtPm1vZHVsdXMgLSAxIDwgcHJpdi0+b2Zmc2V0KQorCQlyZXR1cm4gLUVPVkVSRkxPVzsKKworCXByaXYtPnNlZWQgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9IQVNIX1NFRURdKSk7CisKKwlyZXR1cm4gbmZ0X3ZhbGlkYXRlX3JlZ2lzdGVyX2xvYWQocHJpdi0+c3JlZywgbGVuKSAmJgorCSAgICAgICBuZnRfdmFsaWRhdGVfcmVnaXN0ZXJfc3RvcmUoY3R4LCBwcml2LT5kcmVnLCBOVUxMLAorCQkJCQkgICBORlRfREFUQV9WQUxVRSwgc2l6ZW9mKHUzMikpOworfQorCitzdGF0aWMgaW50IG5mdF9oYXNoX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIpCit7CisJY29uc3Qgc3RydWN0IG5mdF9oYXNoICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKworCWlmIChuZnRfZHVtcF9yZWdpc3Rlcihza2IsIE5GVEFfSEFTSF9TUkVHLCBwcml2LT5zcmVnKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJaWYgKG5mdF9kdW1wX3JlZ2lzdGVyKHNrYiwgTkZUQV9IQVNIX0RSRUcsIHByaXYtPmRyZWcpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZUQV9IQVNIX0xFTiwgaHRvbmwocHJpdi0+bGVuKSkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCWlmIChubGFfcHV0X2JlMzIoc2tiLCBORlRBX0hBU0hfTU9EVUxVUywgaHRvbmwocHJpdi0+bW9kdWx1cykpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZUQV9IQVNIX1NFRUQsIGh0b25sKHByaXYtPnNlZWQpKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJaWYgKHByaXYtPm9mZnNldCAhPSAwKQorCQlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZUQV9IQVNIX09GRlNFVCwgaHRvbmwocHJpdi0+b2Zmc2V0KSkpCisJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAlyZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorCXJldHVybiAtMTsKIH0KIAotc3RhdGljIHZvaWQgbmZ0X2hhc2hfZWxlbV9kZXN0cm95KHZvaWQgKnB0ciwgdm9pZCAqYXJnKQotewotCW5mdF9zZXRfZWxlbV9kZXN0cm95KChjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqKWFyZywgcHRyKTsKLX0KLQotc3RhdGljIHZvaWQgbmZ0X2hhc2hfZGVzdHJveShjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0KQotewotCXN0cnVjdCBuZnRfaGFzaCAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOwotCi0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwcml2LT5nY193b3JrKTsKLQlyaGFzaHRhYmxlX2ZyZWVfYW5kX2Rlc3Ryb3koJnByaXYtPmh0LCBuZnRfaGFzaF9lbGVtX2Rlc3Ryb3ksCi0JCQkJICAgICh2b2lkICopc2V0KTsKLX0KLQotc3RhdGljIGJvb2wgbmZ0X2hhc2hfZXN0aW1hdGUoY29uc3Qgc3RydWN0IG5mdF9zZXRfZGVzYyAqZGVzYywgdTMyIGZlYXR1cmVzLAotCQkJICAgICAgc3RydWN0IG5mdF9zZXRfZXN0aW1hdGUgKmVzdCkKLXsKLQl1bnNpZ25lZCBpbnQgZXNpemU7Ci0KLQllc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSk7Ci0JaWYgKGRlc2MtPnNpemUpIHsKLQkJZXN0LT5zaXplID0gc2l6ZW9mKHN0cnVjdCBuZnRfaGFzaCkgKwotCQkJICAgIHJvdW5kdXBfcG93X29mX3R3byhkZXNjLT5zaXplICogNCAvIDMpICoKLQkJCSAgICBzaXplb2Yoc3RydWN0IG5mdF9oYXNoX2VsZW0gKikgKwotCQkJICAgIGRlc2MtPnNpemUgKiBlc2l6ZTsKLQl9IGVsc2UgewotCQkvKiBSZXNpemluZyBoYXBwZW5zIHdoZW4gdGhlIGxvYWQgZHJvcHMgYmVsb3cgMzAlIG9yIGdvZXMKLQkJICogYWJvdmUgNzUlLiBUaGUgYXZlcmFnZSBvZiA1Mi41JSBsb2FkIChhcHByb3hpbWF0ZWQgYnkgNTAlKQotCQkgKiBpcyB1c2VkIGZvciB0aGUgc2l6ZSBlc3RpbWF0aW9uIG9mIHRoZSBoYXNoIGJ1Y2tldHMsCi0JCSAqIG1lYW5pbmcgd2UgY2FsY3VsYXRlIHR3byBidWNrZXRzIHBlciBlbGVtZW50LgotCQkgKi8KLQkJZXN0LT5zaXplID0gZXNpemUgKyAyICogc2l6ZW9mKHN0cnVjdCBuZnRfaGFzaF9lbGVtICopOwotCX0KLQotCWVzdC0+Y2xhc3MgPSBORlRfU0VUX0NMQVNTX09fMTsKLQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgc3RydWN0IG5mdF9zZXRfb3BzIG5mdF9oYXNoX29wcyBfX3JlYWRfbW9zdGx5ID0gewotCS5wcml2c2l6ZSAgICAgICA9IG5mdF9oYXNoX3ByaXZzaXplLAotCS5lbGVtc2l6ZQk9IG9mZnNldG9mKHN0cnVjdCBuZnRfaGFzaF9lbGVtLCBleHQpLAotCS5lc3RpbWF0ZQk9IG5mdF9oYXNoX2VzdGltYXRlLAorc3RhdGljIHN0cnVjdCBuZnRfZXhwcl90eXBlIG5mdF9oYXNoX3R5cGU7CitzdGF0aWMgY29uc3Qgc3RydWN0IG5mdF9leHByX29wcyBuZnRfaGFzaF9vcHMgPSB7CisJLnR5cGUJCT0gJm5mdF9oYXNoX3R5cGUsCisJLnNpemUJCT0gTkZUX0VYUFJfU0laRShzaXplb2Yoc3RydWN0IG5mdF9oYXNoKSksCisJLmV2YWwJCT0gbmZ0X2hhc2hfZXZhbCwKIAkuaW5pdAkJPSBuZnRfaGFzaF9pbml0LAotCS5kZXN0cm95CT0gbmZ0X2hhc2hfZGVzdHJveSwKLQkuaW5zZXJ0CQk9IG5mdF9oYXNoX2luc2VydCwKLQkuYWN0aXZhdGUJPSBuZnRfaGFzaF9hY3RpdmF0ZSwKLQkuZGVhY3RpdmF0ZQk9IG5mdF9oYXNoX2RlYWN0aXZhdGUsCi0JLnJlbW92ZQkJPSBuZnRfaGFzaF9yZW1vdmUsCi0JLmxvb2t1cAkJPSBuZnRfaGFzaF9sb29rdXAsCi0JLnVwZGF0ZQkJPSBuZnRfaGFzaF91cGRhdGUsCi0JLndhbGsJCT0gbmZ0X2hhc2hfd2FsaywKLQkuZmVhdHVyZXMJPSBORlRfU0VUX01BUCB8IE5GVF9TRVRfVElNRU9VVCwKKwkuZHVtcAkJPSBuZnRfaGFzaF9kdW1wLAorfTsKKworc3RhdGljIHN0cnVjdCBuZnRfZXhwcl90eXBlIG5mdF9oYXNoX3R5cGUgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZQkJPSAiaGFzaCIsCisJLm9wcwkJPSAmbmZ0X2hhc2hfb3BzLAorCS5wb2xpY3kJCT0gbmZ0X2hhc2hfcG9saWN5LAorCS5tYXhhdHRyCT0gTkZUQV9IQVNIX01BWCwKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBuZnRfaGFzaF9tb2R1bGVfaW5pdCh2b2lkKQogewotCXJldHVybiBuZnRfcmVnaXN0ZXJfc2V0KCZuZnRfaGFzaF9vcHMpOworCXJldHVybiBuZnRfcmVnaXN0ZXJfZXhwcigmbmZ0X2hhc2hfdHlwZSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBuZnRfaGFzaF9tb2R1bGVfZXhpdCh2b2lkKQogewotCW5mdF91bnJlZ2lzdGVyX3NldCgmbmZ0X2hhc2hfb3BzKTsKKwluZnRfdW5yZWdpc3Rlcl9leHByKCZuZnRfaGFzaF90eXBlKTsKIH0KIAogbW9kdWxlX2luaXQobmZ0X2hhc2hfbW9kdWxlX2luaXQpOwogbW9kdWxlX2V4aXQobmZ0X2hhc2hfbW9kdWxlX2V4aXQpOwogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4iKTsKLU1PRFVMRV9BTElBU19ORlRfU0VUKCk7CitNT0RVTEVfQVVUSE9SKCJMYXVyYSBHYXJjaWEgPG5ldm9sYUBnbWFpbC5jb20+Iik7CitNT0RVTEVfQUxJQVNfTkZUX0VYUFIoImhhc2giKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X2ltbWVkaWF0ZS5jIGIvbmV0L25ldGZpbHRlci9uZnRfaW1tZWRpYXRlLmMKaW5kZXggZGIzYjc0Ni4uZDE3MDE4ZiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfaW1tZWRpYXRlLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfaW1tZWRpYXRlLmMKQEAgLTUzLDYgKzUzLDEwIEBACiAJCQkgICAgdGJbTkZUQV9JTU1FRElBVEVfREFUQV0pOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOworCisJaWYgKGRlc2MubGVuID4gVThfTUFYKQorCQlyZXR1cm4gLUVSQU5HRTsKKwogCXByaXYtPmRsZW4gPSBkZXNjLmxlbjsKIAogCXByaXYtPmRyZWcgPSBuZnRfcGFyc2VfcmVnaXN0ZXIodGJbTkZUQV9JTU1FRElBVEVfRFJFR10pOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfbGltaXQuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2xpbWl0LmMKaW5kZXggMDcwYjk4OS4uYzZiYWY0MSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfbGltaXQuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9saW1pdC5jCkBAIC0xNDUsNyArMTQ1LDcgQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCXByaXYtPmNvc3QgPSBkaXZfdTY0KHByaXYtPmxpbWl0Lm5zZWNzLCBwcml2LT5saW1pdC5yYXRlKTsKKwlwcml2LT5jb3N0ID0gZGl2NjRfdTY0KHByaXYtPmxpbWl0Lm5zZWNzLCBwcml2LT5saW1pdC5yYXRlKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTcwLDcgKzE3MCw3IEBACiAJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCkKIHsKIAlzdHJ1Y3QgbmZ0X2xpbWl0ICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKLQl1NjQgY29zdCA9IGRpdl91NjQocHJpdi0+bnNlY3MgKiBwa3QtPnNrYi0+bGVuLCBwcml2LT5yYXRlKTsKKwl1NjQgY29zdCA9IGRpdjY0X3U2NChwcml2LT5uc2VjcyAqIHBrdC0+c2tiLT5sZW4sIHByaXYtPnJhdGUpOwogCiAJaWYgKG5mdF9saW1pdF9ldmFsKHByaXYsIGNvc3QpKQogCQlyZWdzLT52ZXJkaWN0LmNvZGUgPSBORlRfQlJFQUs7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mdF9sb2cuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2xvZy5jCmluZGV4IDI0YTczYmIuLjFiMDE0MDQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZ0X2xvZy5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2xvZy5jCkBAIC01OCw4ICs1OCwxMSBAQAogCWlmICh0YltORlRBX0xPR19MRVZFTF0gIT0gTlVMTCAmJgogCSAgICB0YltORlRBX0xPR19HUk9VUF0gIT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHRiW05GVEFfTE9HX0dST1VQXSAhPSBOVUxMKQorCWlmICh0YltORlRBX0xPR19HUk9VUF0gIT0gTlVMTCkgewogCQlsaS0+dHlwZSA9IE5GX0xPR19UWVBFX1VMT0c7CisJCWlmICh0YltORlRBX0xPR19GTEFHU10gIT0gTlVMTCkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KIAogCW5sYSA9IHRiW05GVEFfTE9HX1BSRUZJWF07CiAJaWYgKG5sYSAhPSBOVUxMKSB7CkBAIC04Nyw2ICs5MCwxMCBAQAogCQlpZiAodGJbTkZUQV9MT0dfRkxBR1NdICE9IE5VTEwpIHsKIAkJCWxpLT51LmxvZy5sb2dmbGFncyA9CiAJCQkJbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfTE9HX0ZMQUdTXSkpOworCQkJaWYgKGxpLT51LmxvZy5sb2dmbGFncyAmIH5ORl9MT0dfTUFTSykgeworCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJZ290byBlcnIxOworCQkJfQogCQl9CiAJCWJyZWFrOwogCWNhc2UgTkZfTE9HX1RZUEVfVUxPRzoKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X2xvb2t1cC5jIGIvbmV0L25ldGZpbHRlci9uZnRfbG9va3VwLmMKaW5kZXggZTE2NDMyNS4uODE2NmI2OSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfbG9va3VwLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfbG9va3VwLmMKQEAgLTQzLDcgKzQzLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmIChmb3VuZCAmJiBzZXQtPmZsYWdzICYgTkZUX1NFVF9NQVApCisJaWYgKHNldC0+ZmxhZ3MgJiBORlRfU0VUX01BUCkKIAkJbmZ0X2RhdGFfY29weSgmcmVncy0+ZGF0YVtwcml2LT5kcmVnXSwKIAkJCSAgICAgIG5mdF9zZXRfZXh0X2RhdGEoZXh0KSwgc2V0LT5kbGVuKTsKIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfbWV0YS5jIGIvbmV0L25ldGZpbHRlci9uZnRfbWV0YS5jCmluZGV4IDI4NjNmMzQuLjZjMWUwMjQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZ0X21ldGEuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9tZXRhLmMKQEAgLTUyLDYgKzUyLDggQEAKIAkJKmRlc3QgPSBwa3QtPnBmOwogCQlicmVhazsKIAljYXNlIE5GVF9NRVRBX0w0UFJPVE86CisJCWlmICghcGt0LT50cHJvdF9zZXQpCisJCQlnb3RvIGVycjsKIAkJKmRlc3QgPSBwa3QtPnRwcm90OwogCQlicmVhazsKIAljYXNlIE5GVF9NRVRBX1BSSU9SSVRZOgpAQCAtMjkxLDEwICsyOTMsMTYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG5mdF9tZXRhX2dldF9pbml0KTsKIAotc3RhdGljIGludCBuZnRfbWV0YV9zZXRfaW5pdF9wa3R0eXBlKGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgpCitpbnQgbmZ0X21ldGFfc2V0X3ZhbGlkYXRlKGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsCisJCQkgIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKKwkJCSAgY29uc3Qgc3RydWN0IG5mdF9kYXRhICoqZGF0YSkKIHsKKwlzdHJ1Y3QgbmZ0X21ldGEgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOwogCXVuc2lnbmVkIGludCBob29rczsKIAorCWlmIChwcml2LT5rZXkgIT0gTkZUX01FVEFfUEtUVFlQRSkKKwkJcmV0dXJuIDA7CisKIAlzd2l0Y2ggKGN0eC0+YWZpLT5mYW1pbHkpIHsKIAljYXNlIE5GUFJPVE9fQlJJREdFOgogCQlob29rcyA9IDEgPDwgTkZfQlJfUFJFX1JPVVRJTkc7CkBAIC0zMDgsNiArMzE2LDcgQEAKIAogCXJldHVybiBuZnRfY2hhaW5fdmFsaWRhdGVfaG9va3MoY3R4LT5jaGFpbiwgaG9va3MpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobmZ0X21ldGFfc2V0X3ZhbGlkYXRlKTsKIAogaW50IG5mdF9tZXRhX3NldF9pbml0KGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsCiAJCSAgICAgIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKQEAgLTMyNywxNSArMzM2LDE2IEBACiAJCWxlbiA9IHNpemVvZih1OCk7CiAJCWJyZWFrOwogCWNhc2UgTkZUX01FVEFfUEtUVFlQRToKLQkJZXJyID0gbmZ0X21ldGFfc2V0X2luaXRfcGt0dHlwZShjdHgpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKIAkJbGVuID0gc2l6ZW9mKHU4KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIAorCWVyciA9IG5mdF9tZXRhX3NldF92YWxpZGF0ZShjdHgsIGV4cHIsIE5VTEwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCiAJcHJpdi0+c3JlZyA9IG5mdF9wYXJzZV9yZWdpc3Rlcih0YltORlRBX01FVEFfU1JFR10pOwogCWVyciA9IG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9sb2FkKHByaXYtPnNyZWcsIGxlbik7CiAJaWYgKGVyciA8IDApCkBAIC00MDcsNiArNDE3LDcgQEAKIAkuaW5pdAkJPSBuZnRfbWV0YV9zZXRfaW5pdCwKIAkuZGVzdHJveQk9IG5mdF9tZXRhX3NldF9kZXN0cm95LAogCS5kdW1wCQk9IG5mdF9tZXRhX3NldF9kdW1wLAorCS52YWxpZGF0ZQk9IG5mdF9tZXRhX3NldF92YWxpZGF0ZSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHJfb3BzICoKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X251bWdlbi5jIGIvbmV0L25ldGZpbHRlci9uZnRfbnVtZ2VuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTViYzVhYgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZ0X251bWdlbi5jCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IExhdXJhIEdhcmNpYSA8bmV2b2xhQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdGljX2tleS5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfdGFibGVzLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl90YWJsZXNfY29yZS5oPgorCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHJuZF9zdGF0ZSwgbmZ0X251bWdlbl9wcmFuZG9tX3N0YXRlKTsKKworc3RydWN0IG5mdF9uZ19pbmMgeworCWVudW0gbmZ0X3JlZ2lzdGVycyAgICAgIGRyZWc6ODsKKwl1MzIJCQltb2R1bHVzOworCWF0b21pY190CQljb3VudGVyOworCXUzMgkJCW9mZnNldDsKK307CisKK3N0YXRpYyB2b2lkIG5mdF9uZ19pbmNfZXZhbChjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCisJCQkgICAgc3RydWN0IG5mdF9yZWdzICpyZWdzLAorCQkJICAgIGNvbnN0IHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0KQoreworCXN0cnVjdCBuZnRfbmdfaW5jICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKwl1MzIgbnZhbCwgb3ZhbDsKKworCWRvIHsKKwkJb3ZhbCA9IGF0b21pY19yZWFkKCZwcml2LT5jb3VudGVyKTsKKwkJbnZhbCA9IChvdmFsICsgMSA8IHByaXYtPm1vZHVsdXMpID8gb3ZhbCArIDEgOiAwOworCX0gd2hpbGUgKGF0b21pY19jbXB4Y2hnKCZwcml2LT5jb3VudGVyLCBvdmFsLCBudmFsKSAhPSBvdmFsKTsKKworCXJlZ3MtPmRhdGFbcHJpdi0+ZHJlZ10gPSBudmFsICsgcHJpdi0+b2Zmc2V0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgbmZ0X25nX3BvbGljeVtORlRBX05HX01BWCArIDFdID0geworCVtORlRBX05HX0RSRUddCQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW05GVEFfTkdfTU9EVUxVU10JPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtORlRBX05HX1RZUEVdCQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW05GVEFfTkdfT0ZGU0VUXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCit9OworCitzdGF0aWMgaW50IG5mdF9uZ19pbmNfaW5pdChjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LAorCQkJICAgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkJICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCit7CisJc3RydWN0IG5mdF9uZ19pbmMgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOworCisJaWYgKHRiW05GVEFfTkdfT0ZGU0VUXSkKKwkJcHJpdi0+b2Zmc2V0ID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfTkdfT0ZGU0VUXSkpOworCisJcHJpdi0+bW9kdWx1cyA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX05HX01PRFVMVVNdKSk7CisJaWYgKHByaXYtPm1vZHVsdXMgPT0gMCkKKwkJcmV0dXJuIC1FUkFOR0U7CisKKwlpZiAocHJpdi0+b2Zmc2V0ICsgcHJpdi0+bW9kdWx1cyAtIDEgPCBwcml2LT5vZmZzZXQpCisJCXJldHVybiAtRU9WRVJGTE9XOworCisJcHJpdi0+ZHJlZyA9IG5mdF9wYXJzZV9yZWdpc3Rlcih0YltORlRBX05HX0RSRUddKTsKKwlhdG9taWNfc2V0KCZwcml2LT5jb3VudGVyLCAwKTsKKworCXJldHVybiBuZnRfdmFsaWRhdGVfcmVnaXN0ZXJfc3RvcmUoY3R4LCBwcml2LT5kcmVnLCBOVUxMLAorCQkJCQkgICBORlRfREFUQV9WQUxVRSwgc2l6ZW9mKHUzMikpOworfQorCitzdGF0aWMgaW50IG5mdF9uZ19kdW1wKHN0cnVjdCBza19idWZmICpza2IsIGVudW0gbmZ0X3JlZ2lzdGVycyBkcmVnLAorCQkgICAgICAgdTMyIG1vZHVsdXMsIGVudW0gbmZ0X25nX3R5cGVzIHR5cGUsIHUzMiBvZmZzZXQpCit7CisJaWYgKG5mdF9kdW1wX3JlZ2lzdGVyKHNrYiwgTkZUQV9OR19EUkVHLCBkcmVnKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJaWYgKG5sYV9wdXRfYmUzMihza2IsIE5GVEFfTkdfTU9EVUxVUywgaHRvbmwobW9kdWx1cykpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZUQV9OR19UWVBFLCBodG9ubCh0eXBlKSkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCWlmIChubGFfcHV0X2JlMzIoc2tiLCBORlRBX05HX09GRlNFVCwgaHRvbmwob2Zmc2V0KSkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJcmV0dXJuIDA7CisKK25sYV9wdXRfZmFpbHVyZToKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgbmZ0X25nX2luY19kdW1wKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwcikKK3sKKwljb25zdCBzdHJ1Y3QgbmZ0X25nX2luYyAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CisKKwlyZXR1cm4gbmZ0X25nX2R1bXAoc2tiLCBwcml2LT5kcmVnLCBwcml2LT5tb2R1bHVzLCBORlRfTkdfSU5DUkVNRU5UQUwsCisJCQkgICBwcml2LT5vZmZzZXQpOworfQorCitzdHJ1Y3QgbmZ0X25nX3JhbmRvbSB7CisJZW51bSBuZnRfcmVnaXN0ZXJzICAgICAgZHJlZzo4OworCXUzMgkJCW1vZHVsdXM7CisJdTMyCQkJb2Zmc2V0OworfTsKKworc3RhdGljIHZvaWQgbmZ0X25nX3JhbmRvbV9ldmFsKGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKKwkJCSAgICAgICBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5mdF9wa3RpbmZvICpwa3QpCit7CisJc3RydWN0IG5mdF9uZ19yYW5kb20gKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOworCXN0cnVjdCBybmRfc3RhdGUgKnN0YXRlID0gdGhpc19jcHVfcHRyKCZuZnRfbnVtZ2VuX3ByYW5kb21fc3RhdGUpOworCXUzMiB2YWw7CisKKwl2YWwgPSByZWNpcHJvY2FsX3NjYWxlKHByYW5kb21fdTMyX3N0YXRlKHN0YXRlKSwgcHJpdi0+bW9kdWx1cyk7CisJcmVncy0+ZGF0YVtwcml2LT5kcmVnXSA9IHZhbCArIHByaXYtPm9mZnNldDsKK30KKworc3RhdGljIGludCBuZnRfbmdfcmFuZG9tX2luaXQoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCB0YltdKQoreworCXN0cnVjdCBuZnRfbmdfcmFuZG9tICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKworCWlmICh0YltORlRBX05HX09GRlNFVF0pCisJCXByaXYtPm9mZnNldCA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX05HX09GRlNFVF0pKTsKKworCXByaXYtPm1vZHVsdXMgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9OR19NT0RVTFVTXSkpOworCWlmIChwcml2LT5tb2R1bHVzID09IDApCisJCXJldHVybiAtRVJBTkdFOworCisJaWYgKHByaXYtPm9mZnNldCArIHByaXYtPm1vZHVsdXMgLSAxIDwgcHJpdi0+b2Zmc2V0KQorCQlyZXR1cm4gLUVPVkVSRkxPVzsKKworCXByYW5kb21faW5pdF9vbmNlKCZuZnRfbnVtZ2VuX3ByYW5kb21fc3RhdGUpOworCisJcHJpdi0+ZHJlZyA9IG5mdF9wYXJzZV9yZWdpc3Rlcih0YltORlRBX05HX0RSRUddKTsKKworCXJldHVybiBuZnRfdmFsaWRhdGVfcmVnaXN0ZXJfc3RvcmUoY3R4LCBwcml2LT5kcmVnLCBOVUxMLAorCQkJCQkgICBORlRfREFUQV9WQUxVRSwgc2l6ZW9mKHUzMikpOworfQorCitzdGF0aWMgaW50IG5mdF9uZ19yYW5kb21fZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIpCit7CisJY29uc3Qgc3RydWN0IG5mdF9uZ19yYW5kb20gKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOworCisJcmV0dXJuIG5mdF9uZ19kdW1wKHNrYiwgcHJpdi0+ZHJlZywgcHJpdi0+bW9kdWx1cywgTkZUX05HX1JBTkRPTSwKKwkJCSAgIHByaXYtPm9mZnNldCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZ0X2V4cHJfdHlwZSBuZnRfbmdfdHlwZTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHJfb3BzIG5mdF9uZ19pbmNfb3BzID0geworCS50eXBlCQk9ICZuZnRfbmdfdHlwZSwKKwkuc2l6ZQkJPSBORlRfRVhQUl9TSVpFKHNpemVvZihzdHJ1Y3QgbmZ0X25nX2luYykpLAorCS5ldmFsCQk9IG5mdF9uZ19pbmNfZXZhbCwKKwkuaW5pdAkJPSBuZnRfbmdfaW5jX2luaXQsCisJLmR1bXAJCT0gbmZ0X25nX2luY19kdW1wLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZnRfZXhwcl9vcHMgbmZ0X25nX3JhbmRvbV9vcHMgPSB7CisJLnR5cGUJCT0gJm5mdF9uZ190eXBlLAorCS5zaXplCQk9IE5GVF9FWFBSX1NJWkUoc2l6ZW9mKHN0cnVjdCBuZnRfbmdfcmFuZG9tKSksCisJLmV2YWwJCT0gbmZ0X25nX3JhbmRvbV9ldmFsLAorCS5pbml0CQk9IG5mdF9uZ19yYW5kb21faW5pdCwKKwkuZHVtcAkJPSBuZnRfbmdfcmFuZG9tX2R1bXAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5mdF9leHByX29wcyAqCituZnRfbmdfc2VsZWN0X29wcyhjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LCBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSkKK3sKKwl1MzIgdHlwZTsKKworCWlmICghdGJbTkZUQV9OR19EUkVHXQkgfHwKKwkgICAgIXRiW05GVEFfTkdfTU9EVUxVU10gfHwKKwkgICAgIXRiW05GVEFfTkdfVFlQRV0pCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJdHlwZSA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX05HX1RZUEVdKSk7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIE5GVF9OR19JTkNSRU1FTlRBTDoKKwkJcmV0dXJuICZuZnRfbmdfaW5jX29wczsKKwljYXNlIE5GVF9OR19SQU5ET006CisJCXJldHVybiAmbmZ0X25nX3JhbmRvbV9vcHM7CisJfQorCisJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZ0X2V4cHJfdHlwZSBuZnRfbmdfdHlwZSBfX3JlYWRfbW9zdGx5ID0geworCS5uYW1lCQk9ICJudW1nZW4iLAorCS5zZWxlY3Rfb3BzCT0gJm5mdF9uZ19zZWxlY3Rfb3BzLAorCS5wb2xpY3kJCT0gbmZ0X25nX3BvbGljeSwKKwkubWF4YXR0cgk9IE5GVEFfTkdfTUFYLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG5mdF9uZ19tb2R1bGVfaW5pdCh2b2lkKQoreworCXJldHVybiBuZnRfcmVnaXN0ZXJfZXhwcigmbmZ0X25nX3R5cGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbmZ0X25nX21vZHVsZV9leGl0KHZvaWQpCit7CisJbmZ0X3VucmVnaXN0ZXJfZXhwcigmbmZ0X25nX3R5cGUpOworfQorCittb2R1bGVfaW5pdChuZnRfbmdfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQobmZ0X25nX21vZHVsZV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTGF1cmEgR2FyY2lhIDxuZXZvbGFAZ21haWwuY29tPiIpOworTU9EVUxFX0FMSUFTX05GVF9FWFBSKCJudW1nZW4iKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X3BheWxvYWQuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X3BheWxvYWQuYwppbmRleCAxMmNkNGJmLi5iMmY4ODYxIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9wYXlsb2FkLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfcGF5bG9hZC5jCkBAIC05Miw2ICs5Miw4IEBACiAJCW9mZnNldCA9IHNrYl9uZXR3b3JrX29mZnNldChza2IpOwogCQlicmVhazsKIAljYXNlIE5GVF9QQVlMT0FEX1RSQU5TUE9SVF9IRUFERVI6CisJCWlmICghcGt0LT50cHJvdF9zZXQpCisJCQlnb3RvIGVycjsKIAkJb2Zmc2V0ID0gcGt0LT54dC50aG9mZjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTE4NCw2ICsxODYsOCBAQAogCQlvZmZzZXQgPSBza2JfbmV0d29ya19vZmZzZXQoc2tiKTsKIAkJYnJlYWs7CiAJY2FzZSBORlRfUEFZTE9BRF9UUkFOU1BPUlRfSEVBREVSOgorCQlpZiAoIXBrdC0+dHByb3Rfc2V0KQorCQkJZ290byBlcnI7CiAJCW9mZnNldCA9IHBrdC0+eHQudGhvZmY7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mdF9xdWV1ZS5jIGIvbmV0L25ldGZpbHRlci9uZnRfcXVldWUuYwppbmRleCA2MWQyMTZlLi4zOTNkMzU5IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9xdWV1ZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZ0X3F1ZXVlLmMKQEAgLTIyLDkgKzIyLDEwIEBACiBzdGF0aWMgdTMyIGpoYXNoX2luaXR2YWwgX19yZWFkX21vc3RseTsKIAogc3RydWN0IG5mdF9xdWV1ZSB7Ci0JdTE2CXF1ZXVlbnVtOwotCXUxNglxdWV1ZXNfdG90YWw7Ci0JdTE2CWZsYWdzOworCWVudW0gbmZ0X3JlZ2lzdGVycwlzcmVnX3FudW06ODsKKwl1MTYJCQlxdWV1ZW51bTsKKwl1MTYJCQlxdWV1ZXNfdG90YWw7CisJdTE2CQkJZmxhZ3M7CiB9OwogCiBzdGF0aWMgdm9pZCBuZnRfcXVldWVfZXZhbChjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCkBAIC01NCwyNyArNTUsNTEgQEAKIAlyZWdzLT52ZXJkaWN0LmNvZGUgPSByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIG5mdF9xdWV1ZV9zcmVnX2V2YWwoY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkJCXN0cnVjdCBuZnRfcmVncyAqcmVncywKKwkJCQljb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCkKK3sKKwlzdHJ1Y3QgbmZ0X3F1ZXVlICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKwl1MzIgcXVldWUsIHJldDsKKworCXF1ZXVlID0gcmVncy0+ZGF0YVtwcml2LT5zcmVnX3FudW1dOworCisJcmV0ID0gTkZfUVVFVUVfTlIocXVldWUpOworCWlmIChwcml2LT5mbGFncyAmIE5GVF9RVUVVRV9GTEFHX0JZUEFTUykKKwkJcmV0IHw9IE5GX1ZFUkRJQ1RfRkxBR19RVUVVRV9CWVBBU1M7CisKKwlyZWdzLT52ZXJkaWN0LmNvZGUgPSByZXQ7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBuZnRfcXVldWVfcG9saWN5W05GVEFfUVVFVUVfTUFYICsgMV0gPSB7CiAJW05GVEFfUVVFVUVfTlVNXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCiAJW05GVEFfUVVFVUVfVE9UQUxdCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKIAlbTkZUQV9RVUVVRV9GTEFHU10JPSB7IC50eXBlID0gTkxBX1UxNiB9LAorCVtORlRBX1FVRVVFX1NSRUdfUU5VTV0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAogfTsKIAogc3RhdGljIGludCBuZnRfcXVldWVfaW5pdChjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LAotCQkJICAgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAotCQkJICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCisJCQkgIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKKwkJCSAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCiB7CiAJc3RydWN0IG5mdF9xdWV1ZSAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CisJdTMyIG1heGlkOwogCi0JaWYgKHRiW05GVEFfUVVFVUVfTlVNXSA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWluaXRfaGFzaHJhbmRvbSgmamhhc2hfaW5pdHZhbCk7CiAJcHJpdi0+cXVldWVudW0gPSBudG9ocyhubGFfZ2V0X2JlMTYodGJbTkZUQV9RVUVVRV9OVU1dKSk7CiAKLQlpZiAodGJbTkZUQV9RVUVVRV9UT1RBTF0gIT0gTlVMTCkKKwlpZiAodGJbTkZUQV9RVUVVRV9UT1RBTF0pCiAJCXByaXYtPnF1ZXVlc190b3RhbCA9IG50b2hzKG5sYV9nZXRfYmUxNih0YltORlRBX1FVRVVFX1RPVEFMXSkpOwotCWlmICh0YltORlRBX1FVRVVFX0ZMQUdTXSAhPSBOVUxMKSB7CisJZWxzZQorCQlwcml2LT5xdWV1ZXNfdG90YWwgPSAxOworCisJaWYgKHByaXYtPnF1ZXVlc190b3RhbCA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1heGlkID0gcHJpdi0+cXVldWVzX3RvdGFsIC0gMSArIHByaXYtPnF1ZXVlbnVtOworCWlmIChtYXhpZCA+IFUxNl9NQVgpCisJCXJldHVybiAtRVJBTkdFOworCisJaWYgKHRiW05GVEFfUVVFVUVfRkxBR1NdKSB7CiAJCXByaXYtPmZsYWdzID0gbnRvaHMobmxhX2dldF9iZTE2KHRiW05GVEFfUVVFVUVfRkxBR1NdKSk7CiAJCWlmIChwcml2LT5mbGFncyAmIH5ORlRfUVVFVUVfRkxBR19NQVNLKQogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC04Miw2ICsxMDcsMjkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBuZnRfcXVldWVfc3JlZ19pbml0KGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCB0YltdKQoreworCXN0cnVjdCBuZnRfcXVldWUgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOworCWludCBlcnI7CisKKwlwcml2LT5zcmVnX3FudW0gPSBuZnRfcGFyc2VfcmVnaXN0ZXIodGJbTkZUQV9RVUVVRV9TUkVHX1FOVU1dKTsKKwllcnIgPSBuZnRfdmFsaWRhdGVfcmVnaXN0ZXJfbG9hZChwcml2LT5zcmVnX3FudW0sIHNpemVvZih1MzIpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmICh0YltORlRBX1FVRVVFX0ZMQUdTXSkgeworCQlwcml2LT5mbGFncyA9IG50b2hzKG5sYV9nZXRfYmUxNih0YltORlRBX1FVRVVFX0ZMQUdTXSkpOworCQlpZiAocHJpdi0+ZmxhZ3MgJiB+TkZUX1FVRVVFX0ZMQUdfTUFTSykKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAocHJpdi0+ZmxhZ3MgJiBORlRfUVVFVUVfRkxBR19DUFVfRkFOT1VUKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IG5mdF9xdWV1ZV9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwcikKIHsKIAljb25zdCBzdHJ1Y3QgbmZ0X3F1ZXVlICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKQEAgLTk3LDYgKzE0NSwyMSBAQAogCXJldHVybiAtMTsKIH0KIAorc3RhdGljIGludAorbmZ0X3F1ZXVlX3NyZWdfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIpCit7CisJY29uc3Qgc3RydWN0IG5mdF9xdWV1ZSAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CisKKwlpZiAobmZ0X2R1bXBfcmVnaXN0ZXIoc2tiLCBORlRBX1FVRVVFX1NSRUdfUU5VTSwgcHJpdi0+c3JlZ19xbnVtKSB8fAorCSAgICBubGFfcHV0X2JlMTYoc2tiLCBORlRBX1FVRVVFX0ZMQUdTLCBodG9ucyhwcml2LT5mbGFncykpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCXJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisJcmV0dXJuIC0xOworfQorCiBzdGF0aWMgc3RydWN0IG5mdF9leHByX3R5cGUgbmZ0X3F1ZXVlX3R5cGU7CiBzdGF0aWMgY29uc3Qgc3RydWN0IG5mdF9leHByX29wcyBuZnRfcXVldWVfb3BzID0gewogCS50eXBlCQk9ICZuZnRfcXVldWVfdHlwZSwKQEAgLTEwNiw5ICsxNjksMzUgQEAKIAkuZHVtcAkJPSBuZnRfcXVldWVfZHVtcCwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHJfb3BzIG5mdF9xdWV1ZV9zcmVnX29wcyA9IHsKKwkudHlwZQkJPSAmbmZ0X3F1ZXVlX3R5cGUsCisJLnNpemUJCT0gTkZUX0VYUFJfU0laRShzaXplb2Yoc3RydWN0IG5mdF9xdWV1ZSkpLAorCS5ldmFsCQk9IG5mdF9xdWV1ZV9zcmVnX2V2YWwsCisJLmluaXQJCT0gbmZ0X3F1ZXVlX3NyZWdfaW5pdCwKKwkuZHVtcAkJPSBuZnRfcXVldWVfc3JlZ19kdW1wLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZnRfZXhwcl9vcHMgKgorbmZ0X3F1ZXVlX3NlbGVjdF9vcHMoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKKwkJICAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSkKK3sKKwlpZiAodGJbTkZUQV9RVUVVRV9OVU1dICYmIHRiW05GVEFfUVVFVUVfU1JFR19RTlVNXSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlpbml0X2hhc2hyYW5kb20oJmpoYXNoX2luaXR2YWwpOworCisJaWYgKHRiW05GVEFfUVVFVUVfTlVNXSkKKwkJcmV0dXJuICZuZnRfcXVldWVfb3BzOworCisJaWYgKHRiW05GVEFfUVVFVUVfU1JFR19RTlVNXSkKKwkJcmV0dXJuICZuZnRfcXVldWVfc3JlZ19vcHM7CisKKwlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKK30KKwogc3RhdGljIHN0cnVjdCBuZnRfZXhwcl90eXBlIG5mdF9xdWV1ZV90eXBlIF9fcmVhZF9tb3N0bHkgPSB7CiAJLm5hbWUJCT0gInF1ZXVlIiwKLQkub3BzCQk9ICZuZnRfcXVldWVfb3BzLAorCS5zZWxlY3Rfb3BzCT0gJm5mdF9xdWV1ZV9zZWxlY3Rfb3BzLAogCS5wb2xpY3kJCT0gbmZ0X3F1ZXVlX3BvbGljeSwKIAkubWF4YXR0cgk9IE5GVEFfUVVFVUVfTUFYLAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X3F1b3RhLmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9xdW90YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMDEwNGMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9xdW90YS5jCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFBhYmxvIE5laXJhIEF5dXNvIDxwYWJsb0BuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX3RhYmxlcy5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfdGFibGVzLmg+CisKK3N0cnVjdCBuZnRfcXVvdGEgeworCXU2NAkJcXVvdGE7CisJYm9vbAkJaW52ZXJ0OworCWF0b21pYzY0X3QJcmVtYWluOworfTsKKworc3RhdGljIGlubGluZSBib29sIG5mdF9vdmVycXVvdGEoc3RydWN0IG5mdF9xdW90YSAqcHJpdiwKKwkJCQkgY29uc3Qgc3RydWN0IG5mdF9wa3RpbmZvICpwa3QpCit7CisJcmV0dXJuIGF0b21pYzY0X3N1Yl9yZXR1cm4ocGt0LT5za2ItPmxlbiwgJnByaXYtPnJlbWFpbikgPCAwOworfQorCitzdGF0aWMgdm9pZCBuZnRfcXVvdGFfZXZhbChjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCisJCQkgICBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MsCisJCQkgICBjb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCkKK3sKKwlzdHJ1Y3QgbmZ0X3F1b3RhICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKworCWlmIChuZnRfb3ZlcnF1b3RhKHByaXYsIHBrdCkgXiBwcml2LT5pbnZlcnQpCisJCXJlZ3MtPnZlcmRpY3QuY29kZSA9IE5GVF9CUkVBSzsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mdF9xdW90YV9wb2xpY3lbTkZUQV9RVU9UQV9NQVggKyAxXSA9IHsKKwlbTkZUQV9RVU9UQV9CWVRFU10JPSB7IC50eXBlID0gTkxBX1U2NCB9LAorCVtORlRBX1FVT1RBX0ZMQUdTXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCit9OworCitzdGF0aWMgaW50IG5mdF9xdW90YV9pbml0KGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsCisJCQkgIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKKwkJCSAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCit7CisJc3RydWN0IG5mdF9xdW90YSAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CisJdTMyIGZsYWdzID0gMDsKKwl1NjQgcXVvdGE7CisKKwlpZiAoIXRiW05GVEFfUVVPVEFfQllURVNdKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXF1b3RhID0gYmU2NF90b19jcHUobmxhX2dldF9iZTY0KHRiW05GVEFfUVVPVEFfQllURVNdKSk7CisJaWYgKHF1b3RhID4gUzY0X01BWCkKKwkJcmV0dXJuIC1FT1ZFUkZMT1c7CisKKwlpZiAodGJbTkZUQV9RVU9UQV9GTEFHU10pIHsKKwkJZmxhZ3MgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9RVU9UQV9GTEFHU10pKTsKKwkJaWYgKGZsYWdzICYgfk5GVF9RVU9UQV9GX0lOVikKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXByaXYtPnF1b3RhID0gcXVvdGE7CisJcHJpdi0+aW52ZXJ0ID0gKGZsYWdzICYgTkZUX1FVT1RBX0ZfSU5WKSA/IHRydWUgOiBmYWxzZTsKKwlhdG9taWM2NF9zZXQoJnByaXYtPnJlbWFpbiwgcXVvdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmZ0X3F1b3RhX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByKQoreworCWNvbnN0IHN0cnVjdCBuZnRfcXVvdGEgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOworCXUzMiBmbGFncyA9IHByaXYtPmludmVydCA/IE5GVF9RVU9UQV9GX0lOViA6IDA7CisKKwlpZiAobmxhX3B1dF9iZTY0KHNrYiwgTkZUQV9RVU9UQV9CWVRFUywgY3B1X3RvX2JlNjQocHJpdi0+cXVvdGEpLAorCQkJIE5GVEFfUVVPVEFfUEFEKSB8fAorCSAgICBubGFfcHV0X2JlMzIoc2tiLCBORlRBX1FVT1RBX0ZMQUdTLCBodG9ubChmbGFncykpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlyZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorCXJldHVybiAtMTsKK30KKworc3RhdGljIHN0cnVjdCBuZnRfZXhwcl90eXBlIG5mdF9xdW90YV90eXBlOworc3RhdGljIGNvbnN0IHN0cnVjdCBuZnRfZXhwcl9vcHMgbmZ0X3F1b3RhX29wcyA9IHsKKwkudHlwZQkJPSAmbmZ0X3F1b3RhX3R5cGUsCisJLnNpemUJCT0gTkZUX0VYUFJfU0laRShzaXplb2Yoc3RydWN0IG5mdF9xdW90YSkpLAorCS5ldmFsCQk9IG5mdF9xdW90YV9ldmFsLAorCS5pbml0CQk9IG5mdF9xdW90YV9pbml0LAorCS5kdW1wCQk9IG5mdF9xdW90YV9kdW1wLAorfTsKKworc3RhdGljIHN0cnVjdCBuZnRfZXhwcl90eXBlIG5mdF9xdW90YV90eXBlIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUJCT0gInF1b3RhIiwKKwkub3BzCQk9ICZuZnRfcXVvdGFfb3BzLAorCS5wb2xpY3kJCT0gbmZ0X3F1b3RhX3BvbGljeSwKKwkubWF4YXR0cgk9IE5GVEFfUVVPVEFfTUFYLAorCS5mbGFncwkJPSBORlRfRVhQUl9TVEFURUZVTCwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBuZnRfcXVvdGFfbW9kdWxlX2luaXQodm9pZCkKK3sKKyAgICAgICAgcmV0dXJuIG5mdF9yZWdpc3Rlcl9leHByKCZuZnRfcXVvdGFfdHlwZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBuZnRfcXVvdGFfbW9kdWxlX2V4aXQodm9pZCkKK3sKKyAgICAgICAgbmZ0X3VucmVnaXN0ZXJfZXhwcigmbmZ0X3F1b3RhX3R5cGUpOworfQorCittb2R1bGVfaW5pdChuZnRfcXVvdGFfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQobmZ0X3F1b3RhX21vZHVsZV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiUGFibG8gTmVpcmEgQXl1c28gPHBhYmxvQG5ldGZpbHRlci5vcmc+Iik7CitNT0RVTEVfQUxJQVNfTkZUX0VYUFIoInF1b3RhIik7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mdF9yYW5nZS5jIGIvbmV0L25ldGZpbHRlci9uZnRfcmFuZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmQ1MzU4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfcmFuZ2UuYwpAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBQYWJsbyBOZWlyYSBBeXVzbyA8cGFibG9AbmV0ZmlsdGVyLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl90YWJsZXMuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19jb3JlLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl90YWJsZXMuaD4KKworc3RydWN0IG5mdF9yYW5nZV9leHByIHsKKwlzdHJ1Y3QgbmZ0X2RhdGEJCWRhdGFfZnJvbTsKKwlzdHJ1Y3QgbmZ0X2RhdGEJCWRhdGFfdG87CisJZW51bSBuZnRfcmVnaXN0ZXJzCXNyZWc6ODsKKwl1OAkJCWxlbjsKKwllbnVtIG5mdF9yYW5nZV9vcHMJb3A6ODsKK307CisKK3N0YXRpYyB2b2lkIG5mdF9yYW5nZV9ldmFsKGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKKwkJCSBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MsCisJCQkgY29uc3Qgc3RydWN0IG5mdF9wa3RpbmZvICpwa3QpCit7CisJY29uc3Qgc3RydWN0IG5mdF9yYW5nZV9leHByICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKwlib29sIG1pc21hdGNoOworCWludCBkMSwgZDI7CisKKwlkMSA9IG1lbWNtcCgmcmVncy0+ZGF0YVtwcml2LT5zcmVnXSwgJnByaXYtPmRhdGFfZnJvbSwgcHJpdi0+bGVuKTsKKwlkMiA9IG1lbWNtcCgmcmVncy0+ZGF0YVtwcml2LT5zcmVnXSwgJnByaXYtPmRhdGFfdG8sIHByaXYtPmxlbik7CisJc3dpdGNoIChwcml2LT5vcCkgeworCWNhc2UgTkZUX1JBTkdFX0VROgorCQltaXNtYXRjaCA9IChkMSA8IDAgfHwgZDIgPiAwKTsKKwkJYnJlYWs7CisJY2FzZSBORlRfUkFOR0VfTkVROgorCQltaXNtYXRjaCA9IChkMSA+PSAwICYmIGQyIDw9IDApOworCQlicmVhazsKKwl9CisKKwlpZiAobWlzbWF0Y2gpCisJCXJlZ3MtPnZlcmRpY3QuY29kZSA9IE5GVF9CUkVBSzsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mdF9yYW5nZV9wb2xpY3lbTkZUQV9SQU5HRV9NQVggKyAxXSA9IHsKKwlbTkZUQV9SQU5HRV9TUkVHXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtORlRBX1JBTkdFX09QXQkJCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbTkZUQV9SQU5HRV9GUk9NX0RBVEFdCQk9IHsgLnR5cGUgPSBOTEFfTkVTVEVEIH0sCisJW05GVEFfUkFOR0VfVE9fREFUQV0JCT0geyAudHlwZSA9IE5MQV9ORVNURUQgfSwKK307CisKK3N0YXRpYyBpbnQgbmZ0X3JhbmdlX2luaXQoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkJY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCit7CisJc3RydWN0IG5mdF9yYW5nZV9leHByICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKwlzdHJ1Y3QgbmZ0X2RhdGFfZGVzYyBkZXNjX2Zyb20sIGRlc2NfdG87CisJaW50IGVycjsKKworCWVyciA9IG5mdF9kYXRhX2luaXQoTlVMTCwgJnByaXYtPmRhdGFfZnJvbSwgc2l6ZW9mKHByaXYtPmRhdGFfZnJvbSksCisJCQkgICAgJmRlc2NfZnJvbSwgdGJbTkZUQV9SQU5HRV9GUk9NX0RBVEFdKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IG5mdF9kYXRhX2luaXQoTlVMTCwgJnByaXYtPmRhdGFfdG8sIHNpemVvZihwcml2LT5kYXRhX3RvKSwKKwkJCSAgICAmZGVzY190bywgdGJbTkZUQV9SQU5HRV9UT19EQVRBXSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyMTsKKworCWlmIChkZXNjX2Zyb20ubGVuICE9IGRlc2NfdG8ubGVuKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyMjsKKwl9CisKKwlwcml2LT5zcmVnID0gbmZ0X3BhcnNlX3JlZ2lzdGVyKHRiW05GVEFfUkFOR0VfU1JFR10pOworCWVyciA9IG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9sb2FkKHByaXYtPnNyZWcsIGRlc2NfZnJvbS5sZW4pOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycjI7CisKKwlwcml2LT5vcCAgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9SQU5HRV9PUF0pKTsKKwlwcml2LT5sZW4gPSBkZXNjX2Zyb20ubGVuOworCXJldHVybiAwOworZXJyMjoKKwluZnRfZGF0YV91bmluaXQoJnByaXYtPmRhdGFfdG8sIGRlc2NfdG8udHlwZSk7CitlcnIxOgorCW5mdF9kYXRhX3VuaW5pdCgmcHJpdi0+ZGF0YV9mcm9tLCBkZXNjX2Zyb20udHlwZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBuZnRfcmFuZ2VfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIpCit7CisJY29uc3Qgc3RydWN0IG5mdF9yYW5nZV9leHByICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKworCWlmIChuZnRfZHVtcF9yZWdpc3Rlcihza2IsIE5GVEFfUkFOR0VfU1JFRywgcHJpdi0+c3JlZykpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCWlmIChubGFfcHV0X2JlMzIoc2tiLCBORlRBX1JBTkdFX09QLCBodG9ubChwcml2LT5vcCkpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWlmIChuZnRfZGF0YV9kdW1wKHNrYiwgTkZUQV9SQU5HRV9GUk9NX0RBVEEsICZwcml2LT5kYXRhX2Zyb20sCisJCQkgIE5GVF9EQVRBX1ZBTFVFLCBwcml2LT5sZW4pIDwgMCB8fAorCSAgICBuZnRfZGF0YV9kdW1wKHNrYiwgTkZUQV9SQU5HRV9UT19EQVRBLCAmcHJpdi0+ZGF0YV90bywKKwkJCSAgTkZUX0RBVEFfVkFMVUUsIHByaXYtPmxlbikgPCAwKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlyZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorCXJldHVybiAtMTsKK30KKworc3RhdGljIHN0cnVjdCBuZnRfZXhwcl90eXBlIG5mdF9yYW5nZV90eXBlOworc3RhdGljIGNvbnN0IHN0cnVjdCBuZnRfZXhwcl9vcHMgbmZ0X3JhbmdlX29wcyA9IHsKKwkudHlwZQkJPSAmbmZ0X3JhbmdlX3R5cGUsCisJLnNpemUJCT0gTkZUX0VYUFJfU0laRShzaXplb2Yoc3RydWN0IG5mdF9yYW5nZV9leHByKSksCisJLmV2YWwJCT0gbmZ0X3JhbmdlX2V2YWwsCisJLmluaXQJCT0gbmZ0X3JhbmdlX2luaXQsCisJLmR1bXAJCT0gbmZ0X3JhbmdlX2R1bXAsCit9OworCitzdGF0aWMgc3RydWN0IG5mdF9leHByX3R5cGUgbmZ0X3JhbmdlX3R5cGUgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZQkJPSAicmFuZ2UiLAorCS5vcHMJCT0gJm5mdF9yYW5nZV9vcHMsCisJLnBvbGljeQkJPSBuZnRfcmFuZ2VfcG9saWN5LAorCS5tYXhhdHRyCT0gTkZUQV9SQU5HRV9NQVgsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworaW50IF9faW5pdCBuZnRfcmFuZ2VfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gbmZ0X3JlZ2lzdGVyX2V4cHIoJm5mdF9yYW5nZV90eXBlKTsKK30KKwordm9pZCBuZnRfcmFuZ2VfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwluZnRfdW5yZWdpc3Rlcl9leHByKCZuZnRfcmFuZ2VfdHlwZSk7Cit9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mdF9yYnRyZWUuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X3JidHJlZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDczOTM2Li4wMDAwMDAwCi0tLSBhL25ldC9uZXRmaWx0ZXIvbmZ0X3JidHJlZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIERldmVsb3BtZW50IG9mIHRoaXMgY29kZSBmdW5kZWQgYnkgQXN0YXJvIEFHIChodHRwOi8vd3d3LmFzdGFyby5jb20vKQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl90YWJsZXMuaD4KLQotc3RhdGljIERFRklORV9TUElOTE9DSyhuZnRfcmJ0cmVlX2xvY2spOwotCi1zdHJ1Y3QgbmZ0X3JidHJlZSB7Ci0Jc3RydWN0IHJiX3Jvb3QJCXJvb3Q7Ci19OwotCi1zdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtIHsKLQlzdHJ1Y3QgcmJfbm9kZQkJbm9kZTsKLQlzdHJ1Y3QgbmZ0X3NldF9leHQJZXh0OwotfTsKLQotc3RhdGljIGJvb2wgbmZ0X3JidHJlZV9pbnRlcnZhbF9lbmQoY29uc3Qgc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqcmJlKQotewotCXJldHVybiBuZnRfc2V0X2V4dF9leGlzdHMoJnJiZS0+ZXh0LCBORlRfU0VUX0VYVF9GTEFHUykgJiYKLQkgICAgICAgKCpuZnRfc2V0X2V4dF9mbGFncygmcmJlLT5leHQpICYgTkZUX1NFVF9FTEVNX0lOVEVSVkFMX0VORCk7Ci19Ci0KLXN0YXRpYyBib29sIG5mdF9yYnRyZWVfZXF1YWwoY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwgY29uc3Qgdm9pZCAqdGhpcywKLQkJCSAgICAgY29uc3Qgc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqaW50ZXJ2YWwpCi17Ci0JcmV0dXJuIG1lbWNtcCh0aGlzLCBuZnRfc2V0X2V4dF9rZXkoJmludGVydmFsLT5leHQpLCBzZXQtPmtsZW4pID09IDA7Ci19Ci0KLXN0YXRpYyBib29sIG5mdF9yYnRyZWVfbG9va3VwKGNvbnN0IHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKLQkJCSAgICAgIGNvbnN0IHUzMiAqa2V5LCBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9leHQgKipleHQpCi17Ci0JY29uc3Qgc3RydWN0IG5mdF9yYnRyZWUgKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKLQljb25zdCBzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmUsICppbnRlcnZhbCA9IE5VTEw7Ci0JdTggZ2VubWFzayA9IG5mdF9nZW5tYXNrX2N1cihuZXQpOwotCWNvbnN0IHN0cnVjdCByYl9ub2RlICpwYXJlbnQ7Ci0JY29uc3Qgdm9pZCAqdGhpczsKLQlpbnQgZDsKLQotCXNwaW5fbG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKLQlwYXJlbnQgPSBwcml2LT5yb290LnJiX25vZGU7Ci0Jd2hpbGUgKHBhcmVudCAhPSBOVUxMKSB7Ci0JCXJiZSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IG5mdF9yYnRyZWVfZWxlbSwgbm9kZSk7Ci0KLQkJdGhpcyA9IG5mdF9zZXRfZXh0X2tleSgmcmJlLT5leHQpOwotCQlkID0gbWVtY21wKHRoaXMsIGtleSwgc2V0LT5rbGVuKTsKLQkJaWYgKGQgPCAwKSB7Ci0JCQlwYXJlbnQgPSBwYXJlbnQtPnJiX2xlZnQ7Ci0JCQkvKiBJbiBjYXNlIG9mIGFkamFjZW50IHJhbmdlcywgd2UgYWx3YXlzIHNlZSB0aGUgaGlnaAotCQkJICogcGFydCBvZiB0aGUgcmFuZ2UgaW4gZmlyc3QgcGxhY2UsIGJlZm9yZSB0aGUgbG93IG9uZS4KLQkJCSAqIFNvIGRvbid0IHVwZGF0ZSBpbnRlcnZhbCBpZiB0aGUga2V5cyBhcmUgZXF1YWwuCi0JCQkgKi8KLQkJCWlmIChpbnRlcnZhbCAmJiBuZnRfcmJ0cmVlX2VxdWFsKHNldCwgdGhpcywgaW50ZXJ2YWwpKQotCQkJCWNvbnRpbnVlOwotCQkJaW50ZXJ2YWwgPSByYmU7Ci0JCX0gZWxzZSBpZiAoZCA+IDApCi0JCQlwYXJlbnQgPSBwYXJlbnQtPnJiX3JpZ2h0OwotCQllbHNlIHsKLWZvdW5kOgotCQkJaWYgKCFuZnRfc2V0X2VsZW1fYWN0aXZlKCZyYmUtPmV4dCwgZ2VubWFzaykpIHsKLQkJCQlwYXJlbnQgPSBwYXJlbnQtPnJiX2xlZnQ7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAobmZ0X3JidHJlZV9pbnRlcnZhbF9lbmQocmJlKSkKLQkJCQlnb3RvIG91dDsKLQkJCXNwaW5fdW5sb2NrX2JoKCZuZnRfcmJ0cmVlX2xvY2spOwotCi0JCQkqZXh0ID0gJnJiZS0+ZXh0OwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlpZiAoc2V0LT5mbGFncyAmIE5GVF9TRVRfSU5URVJWQUwgJiYgaW50ZXJ2YWwgIT0gTlVMTCkgewotCQlyYmUgPSBpbnRlcnZhbDsKLQkJZ290byBmb3VuZDsKLQl9Ci1vdXQ6Ci0Jc3Bpbl91bmxvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW50IF9fbmZ0X3JidHJlZV9pbnNlcnQoY29uc3Qgc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAotCQkJICAgICAgIHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0gKm5ldykKLXsKLQlzdHJ1Y3QgbmZ0X3JidHJlZSAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOwotCXU4IGdlbm1hc2sgPSBuZnRfZ2VubWFza19uZXh0KG5ldCk7Ci0Jc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqcmJlOwotCXN0cnVjdCByYl9ub2RlICpwYXJlbnQsICoqcDsKLQlpbnQgZDsKLQotCXBhcmVudCA9IE5VTEw7Ci0JcCA9ICZwcml2LT5yb290LnJiX25vZGU7Ci0Jd2hpbGUgKCpwICE9IE5VTEwpIHsKLQkJcGFyZW50ID0gKnA7Ci0JCXJiZSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IG5mdF9yYnRyZWVfZWxlbSwgbm9kZSk7Ci0JCWQgPSBtZW1jbXAobmZ0X3NldF9leHRfa2V5KCZyYmUtPmV4dCksCi0JCQkgICBuZnRfc2V0X2V4dF9rZXkoJm5ldy0+ZXh0KSwKLQkJCSAgIHNldC0+a2xlbik7Ci0JCWlmIChkIDwgMCkKLQkJCXAgPSAmcGFyZW50LT5yYl9sZWZ0OwotCQllbHNlIGlmIChkID4gMCkKLQkJCXAgPSAmcGFyZW50LT5yYl9yaWdodDsKLQkJZWxzZSB7Ci0JCQlpZiAobmZ0X3NldF9lbGVtX2FjdGl2ZSgmcmJlLT5leHQsIGdlbm1hc2spKSB7Ci0JCQkJaWYgKG5mdF9yYnRyZWVfaW50ZXJ2YWxfZW5kKHJiZSkgJiYKLQkJCQkgICAgIW5mdF9yYnRyZWVfaW50ZXJ2YWxfZW5kKG5ldykpCi0JCQkJCXAgPSAmcGFyZW50LT5yYl9sZWZ0OwotCQkJCWVsc2UgaWYgKCFuZnRfcmJ0cmVlX2ludGVydmFsX2VuZChyYmUpICYmCi0JCQkJCSBuZnRfcmJ0cmVlX2ludGVydmFsX2VuZChuZXcpKQotCQkJCQlwID0gJnBhcmVudC0+cmJfcmlnaHQ7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gLUVFWElTVDsKLQkJCX0KLQkJfQotCX0KLQlyYl9saW5rX25vZGUoJm5ldy0+bm9kZSwgcGFyZW50LCBwKTsKLQlyYl9pbnNlcnRfY29sb3IoJm5ldy0+bm9kZSwgJnByaXYtPnJvb3QpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG5mdF9yYnRyZWVfaW5zZXJ0KGNvbnN0IHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKLQkJCSAgICAgY29uc3Qgc3RydWN0IG5mdF9zZXRfZWxlbSAqZWxlbSkKLXsKLQlzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmUgPSBlbGVtLT5wcml2OwotCWludCBlcnI7Ci0KLQlzcGluX2xvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7Ci0JZXJyID0gX19uZnRfcmJ0cmVlX2luc2VydChuZXQsIHNldCwgcmJlKTsKLQlzcGluX3VubG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyB2b2lkIG5mdF9yYnRyZWVfcmVtb3ZlKGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtKQotewotCXN0cnVjdCBuZnRfcmJ0cmVlICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7Ci0Jc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqcmJlID0gZWxlbS0+cHJpdjsKLQotCXNwaW5fbG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKLQlyYl9lcmFzZSgmcmJlLT5ub2RlLCAmcHJpdi0+cm9vdCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIG5mdF9yYnRyZWVfYWN0aXZhdGUoY29uc3Qgc3RydWN0IG5ldCAqbmV0LAotCQkJCWNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCi0JCQkJY29uc3Qgc3RydWN0IG5mdF9zZXRfZWxlbSAqZWxlbSkKLXsKLQlzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmUgPSBlbGVtLT5wcml2OwotCi0JbmZ0X3NldF9lbGVtX2NoYW5nZV9hY3RpdmUobmV0LCBzZXQsICZyYmUtPmV4dCk7Ci19Ci0KLXN0YXRpYyB2b2lkICpuZnRfcmJ0cmVlX2RlYWN0aXZhdGUoY29uc3Qgc3RydWN0IG5ldCAqbmV0LAotCQkJCSAgIGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCi0JCQkJICAgY29uc3Qgc3RydWN0IG5mdF9zZXRfZWxlbSAqZWxlbSkKLXsKLQljb25zdCBzdHJ1Y3QgbmZ0X3JidHJlZSAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOwotCWNvbnN0IHN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBwcml2LT5yb290LnJiX25vZGU7Ci0Jc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqcmJlLCAqdGhpcyA9IGVsZW0tPnByaXY7Ci0JdTggZ2VubWFzayA9IG5mdF9nZW5tYXNrX25leHQobmV0KTsKLQlpbnQgZDsKLQotCXdoaWxlIChwYXJlbnQgIT0gTlVMTCkgewotCQlyYmUgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0sIG5vZGUpOwotCi0JCWQgPSBtZW1jbXAobmZ0X3NldF9leHRfa2V5KCZyYmUtPmV4dCksICZlbGVtLT5rZXkudmFsLAotCQkJCQkgICBzZXQtPmtsZW4pOwotCQlpZiAoZCA8IDApCi0JCQlwYXJlbnQgPSBwYXJlbnQtPnJiX2xlZnQ7Ci0JCWVsc2UgaWYgKGQgPiAwKQotCQkJcGFyZW50ID0gcGFyZW50LT5yYl9yaWdodDsKLQkJZWxzZSB7Ci0JCQlpZiAoIW5mdF9zZXRfZWxlbV9hY3RpdmUoJnJiZS0+ZXh0LCBnZW5tYXNrKSkgewotCQkJCXBhcmVudCA9IHBhcmVudC0+cmJfbGVmdDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChuZnRfcmJ0cmVlX2ludGVydmFsX2VuZChyYmUpICYmCi0JCQkgICAgIW5mdF9yYnRyZWVfaW50ZXJ2YWxfZW5kKHRoaXMpKSB7Ci0JCQkJcGFyZW50ID0gcGFyZW50LT5yYl9sZWZ0OwotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIGlmICghbmZ0X3JidHJlZV9pbnRlcnZhbF9lbmQocmJlKSAmJgotCQkJCSAgIG5mdF9yYnRyZWVfaW50ZXJ2YWxfZW5kKHRoaXMpKSB7Ci0JCQkJcGFyZW50ID0gcGFyZW50LT5yYl9yaWdodDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCW5mdF9zZXRfZWxlbV9jaGFuZ2VfYWN0aXZlKG5ldCwgc2V0LCAmcmJlLT5leHQpOwotCQkJcmV0dXJuIHJiZTsKLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgbmZ0X3JidHJlZV93YWxrKGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsCi0JCQkgICAgY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKLQkJCSAgICBzdHJ1Y3QgbmZ0X3NldF9pdGVyICppdGVyKQotewotCWNvbnN0IHN0cnVjdCBuZnRfcmJ0cmVlICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7Ci0Jc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqcmJlOwotCXN0cnVjdCBuZnRfc2V0X2VsZW0gZWxlbTsKLQlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKLQotCXNwaW5fbG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKLQlmb3IgKG5vZGUgPSByYl9maXJzdCgmcHJpdi0+cm9vdCk7IG5vZGUgIT0gTlVMTDsgbm9kZSA9IHJiX25leHQobm9kZSkpIHsKLQkJcmJlID0gcmJfZW50cnkobm9kZSwgc3RydWN0IG5mdF9yYnRyZWVfZWxlbSwgbm9kZSk7Ci0KLQkJaWYgKGl0ZXItPmNvdW50IDwgaXRlci0+c2tpcCkKLQkJCWdvdG8gY29udDsKLQkJaWYgKCFuZnRfc2V0X2VsZW1fYWN0aXZlKCZyYmUtPmV4dCwgaXRlci0+Z2VubWFzaykpCi0JCQlnb3RvIGNvbnQ7Ci0KLQkJZWxlbS5wcml2ID0gcmJlOwotCi0JCWl0ZXItPmVyciA9IGl0ZXItPmZuKGN0eCwgc2V0LCBpdGVyLCAmZWxlbSk7Ci0JCWlmIChpdGVyLT5lcnIgPCAwKSB7Ci0JCQlzcGluX3VubG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKLQkJCXJldHVybjsKLQkJfQotY29udDoKLQkJaXRlci0+Y291bnQrKzsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbmZ0X3JidHJlZV9wcml2c2l6ZShjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgbmxhW10pCi17Ci0JcmV0dXJuIHNpemVvZihzdHJ1Y3QgbmZ0X3JidHJlZSk7Ci19Ci0KLXN0YXRpYyBpbnQgbmZ0X3JidHJlZV9pbml0KGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCi0JCQkgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9kZXNjICpkZXNjLAotCQkJICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IG5sYVtdKQotewotCXN0cnVjdCBuZnRfcmJ0cmVlICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7Ci0KLQlwcml2LT5yb290ID0gUkJfUk9PVDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbmZ0X3JidHJlZV9kZXN0cm95KGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQpCi17Ci0Jc3RydWN0IG5mdF9yYnRyZWUgKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKLQlzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmU7Ci0Jc3RydWN0IHJiX25vZGUgKm5vZGU7Ci0KLQl3aGlsZSAoKG5vZGUgPSBwcml2LT5yb290LnJiX25vZGUpICE9IE5VTEwpIHsKLQkJcmJfZXJhc2Uobm9kZSwgJnByaXYtPnJvb3QpOwotCQlyYmUgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtLCBub2RlKTsKLQkJbmZ0X3NldF9lbGVtX2Rlc3Ryb3koc2V0LCByYmUpOwotCX0KLX0KLQotc3RhdGljIGJvb2wgbmZ0X3JidHJlZV9lc3RpbWF0ZShjb25zdCBzdHJ1Y3QgbmZ0X3NldF9kZXNjICpkZXNjLCB1MzIgZmVhdHVyZXMsCi0JCQkJc3RydWN0IG5mdF9zZXRfZXN0aW1hdGUgKmVzdCkKLXsKLQl1bnNpZ25lZCBpbnQgbnNpemU7Ci0KLQluc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtKTsKLQlpZiAoZGVzYy0+c2l6ZSkKLQkJZXN0LT5zaXplID0gc2l6ZW9mKHN0cnVjdCBuZnRfcmJ0cmVlKSArIGRlc2MtPnNpemUgKiBuc2l6ZTsKLQllbHNlCi0JCWVzdC0+c2l6ZSA9IG5zaXplOwotCi0JZXN0LT5jbGFzcyA9IE5GVF9TRVRfQ0xBU1NfT19MT0dfTjsKLQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgc3RydWN0IG5mdF9zZXRfb3BzIG5mdF9yYnRyZWVfb3BzIF9fcmVhZF9tb3N0bHkgPSB7Ci0JLnByaXZzaXplCT0gbmZ0X3JidHJlZV9wcml2c2l6ZSwKLQkuZWxlbXNpemUJPSBvZmZzZXRvZihzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtLCBleHQpLAotCS5lc3RpbWF0ZQk9IG5mdF9yYnRyZWVfZXN0aW1hdGUsCi0JLmluaXQJCT0gbmZ0X3JidHJlZV9pbml0LAotCS5kZXN0cm95CT0gbmZ0X3JidHJlZV9kZXN0cm95LAotCS5pbnNlcnQJCT0gbmZ0X3JidHJlZV9pbnNlcnQsCi0JLnJlbW92ZQkJPSBuZnRfcmJ0cmVlX3JlbW92ZSwKLQkuZGVhY3RpdmF0ZQk9IG5mdF9yYnRyZWVfZGVhY3RpdmF0ZSwKLQkuYWN0aXZhdGUJPSBuZnRfcmJ0cmVlX2FjdGl2YXRlLAotCS5sb29rdXAJCT0gbmZ0X3JidHJlZV9sb29rdXAsCi0JLndhbGsJCT0gbmZ0X3JidHJlZV93YWxrLAotCS5mZWF0dXJlcwk9IE5GVF9TRVRfSU5URVJWQUwgfCBORlRfU0VUX01BUCwKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBuZnRfcmJ0cmVlX21vZHVsZV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIG5mdF9yZWdpc3Rlcl9zZXQoJm5mdF9yYnRyZWVfb3BzKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IG5mdF9yYnRyZWVfbW9kdWxlX2V4aXQodm9pZCkKLXsKLQluZnRfdW5yZWdpc3Rlcl9zZXQoJm5mdF9yYnRyZWVfb3BzKTsKLX0KLQotbW9kdWxlX2luaXQobmZ0X3JidHJlZV9tb2R1bGVfaW5pdCk7Ci1tb2R1bGVfZXhpdChuZnRfcmJ0cmVlX21vZHVsZV9leGl0KTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+Iik7Ci1NT0RVTEVfQUxJQVNfTkZUX1NFVCgpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfcmVqZWN0LmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9yZWplY3QuYwppbmRleCAwNTIyZmM5Li5jNjRkZTNmNyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfcmVqZWN0LmMKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfcmVqZWN0LmMKQEAgLTI2LDExICsyNiwyNyBAQAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKG5mdF9yZWplY3RfcG9saWN5KTsKIAoraW50IG5mdF9yZWplY3RfdmFsaWRhdGUoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKKwkJCWNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKKwkJCWNvbnN0IHN0cnVjdCBuZnRfZGF0YSAqKmRhdGEpCit7CisJcmV0dXJuIG5mdF9jaGFpbl92YWxpZGF0ZV9ob29rcyhjdHgtPmNoYWluLAorCQkJCQkoMSA8PCBORl9JTkVUX0xPQ0FMX0lOKSB8CisJCQkJCSgxIDw8IE5GX0lORVRfRk9SV0FSRCkgfAorCQkJCQkoMSA8PCBORl9JTkVUX0xPQ0FMX09VVCkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZ0X3JlamVjdF92YWxpZGF0ZSk7CisKIGludCBuZnRfcmVqZWN0X2luaXQoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKIAkJICAgIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKIAkJICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCB0YltdKQogewogCXN0cnVjdCBuZnRfcmVqZWN0ICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKwlpbnQgZXJyOworCisJZXJyID0gbmZ0X3JlamVjdF92YWxpZGF0ZShjdHgsIGV4cHIsIE5VTEwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOwogCiAJaWYgKHRiW05GVEFfUkVKRUNUX1RZUEVdID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfcmVqZWN0X2luZXQuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X3JlamVjdF9pbmV0LmMKaW5kZXggNzU5Y2E1Mi4uZTc5ZDljYSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfcmVqZWN0X2luZXQuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9yZWplY3RfaW5ldC5jCkBAIC02Niw3ICs2NiwxMSBAQAogCQkJCWNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCB0YltdKQogewogCXN0cnVjdCBuZnRfcmVqZWN0ICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKLQlpbnQgaWNtcF9jb2RlOworCWludCBpY21wX2NvZGUsIGVycjsKKworCWVyciA9IG5mdF9yZWplY3RfdmFsaWRhdGUoY3R4LCBleHByLCBOVUxMKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKIAogCWlmICh0YltORlRBX1JFSkVDVF9UWVBFXSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEyNCw2ICsxMjgsNyBAQAogCS5ldmFsCQk9IG5mdF9yZWplY3RfaW5ldF9ldmFsLAogCS5pbml0CQk9IG5mdF9yZWplY3RfaW5ldF9pbml0LAogCS5kdW1wCQk9IG5mdF9yZWplY3RfaW5ldF9kdW1wLAorCS52YWxpZGF0ZQk9IG5mdF9yZWplY3RfdmFsaWRhdGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IG5mdF9leHByX3R5cGUgbmZ0X3JlamVjdF9pbmV0X3R5cGUgX19yZWFkX21vc3RseSA9IHsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X3NldF9oYXNoLmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9zZXRfaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OTRjYjIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9zZXRfaGFzaC5jCkBAIC0wLDAgKzEsNDA0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTQgUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBEZXZlbG9wbWVudCBvZiB0aGlzIGNvZGUgZnVuZGVkIGJ5IEFzdGFybyBBRyAoaHR0cDovL3d3dy5hc3Rhcm8uY29tLykKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CisjaW5jbHVkZSA8bGludXgvamhhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvcmhhc2h0YWJsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl90YWJsZXMuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX3RhYmxlcy5oPgorCisvKiBXZSB0YXJnZXQgYSBoYXNoIHRhYmxlIHNpemUgb2YgNCwgZWxlbWVudCBoaW50IGlzIDc1JSBvZiBmaW5hbCBzaXplICovCisjZGVmaW5lIE5GVF9IQVNIX0VMRU1FTlRfSElOVCAzCisKK3N0cnVjdCBuZnRfaGFzaCB7CisJc3RydWN0IHJoYXNodGFibGUJCWh0OworCXN0cnVjdCBkZWxheWVkX3dvcmsJCWdjX3dvcms7Cit9OworCitzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSB7CisJc3RydWN0IHJoYXNoX2hlYWQJCW5vZGU7CisJc3RydWN0IG5mdF9zZXRfZXh0CQlleHQ7Cit9OworCitzdHJ1Y3QgbmZ0X2hhc2hfY21wX2FyZyB7CisJY29uc3Qgc3RydWN0IG5mdF9zZXQJCSpzZXQ7CisJY29uc3QgdTMyCQkJKmtleTsKKwl1OAkJCQlnZW5tYXNrOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBuZnRfaGFzaF9wYXJhbXM7CisKK3N0YXRpYyBpbmxpbmUgdTMyIG5mdF9oYXNoX2tleShjb25zdCB2b2lkICpkYXRhLCB1MzIgbGVuLCB1MzIgc2VlZCkKK3sKKwljb25zdCBzdHJ1Y3QgbmZ0X2hhc2hfY21wX2FyZyAqYXJnID0gZGF0YTsKKworCXJldHVybiBqaGFzaChhcmctPmtleSwgbGVuLCBzZWVkKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbmZ0X2hhc2hfb2JqKGNvbnN0IHZvaWQgKmRhdGEsIHUzMiBsZW4sIHUzMiBzZWVkKQoreworCWNvbnN0IHN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZSA9IGRhdGE7CisKKwlyZXR1cm4gamhhc2gobmZ0X3NldF9leHRfa2V5KCZoZS0+ZXh0KSwgbGVuLCBzZWVkKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbmZ0X2hhc2hfY21wKHN0cnVjdCByaGFzaHRhYmxlX2NvbXBhcmVfYXJnICphcmcsCisJCQkgICAgICAgY29uc3Qgdm9pZCAqcHRyKQoreworCWNvbnN0IHN0cnVjdCBuZnRfaGFzaF9jbXBfYXJnICp4ID0gYXJnLT5rZXk7CisJY29uc3Qgc3RydWN0IG5mdF9oYXNoX2VsZW0gKmhlID0gcHRyOworCisJaWYgKG1lbWNtcChuZnRfc2V0X2V4dF9rZXkoJmhlLT5leHQpLCB4LT5rZXksIHgtPnNldC0+a2xlbikpCisJCXJldHVybiAxOworCWlmIChuZnRfc2V0X2VsZW1fZXhwaXJlZCgmaGUtPmV4dCkpCisJCXJldHVybiAxOworCWlmICghbmZ0X3NldF9lbGVtX2FjdGl2ZSgmaGUtPmV4dCwgeC0+Z2VubWFzaykpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgYm9vbCBuZnRfaGFzaF9sb29rdXAoY29uc3Qgc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAorCQkJICAgIGNvbnN0IHUzMiAqa2V5LCBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9leHQgKipleHQpCit7CisJc3RydWN0IG5mdF9oYXNoICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7CisJY29uc3Qgc3RydWN0IG5mdF9oYXNoX2VsZW0gKmhlOworCXN0cnVjdCBuZnRfaGFzaF9jbXBfYXJnIGFyZyA9IHsKKwkJLmdlbm1hc2sgPSBuZnRfZ2VubWFza19jdXIobmV0KSwKKwkJLnNldAkgPSBzZXQsCisJCS5rZXkJID0ga2V5LAorCX07CisKKwloZSA9IHJoYXNodGFibGVfbG9va3VwX2Zhc3QoJnByaXYtPmh0LCAmYXJnLCBuZnRfaGFzaF9wYXJhbXMpOworCWlmIChoZSAhPSBOVUxMKQorCQkqZXh0ID0gJmhlLT5leHQ7CisKKwlyZXR1cm4gISFoZTsKK30KKworc3RhdGljIGJvb2wgbmZ0X2hhc2hfdXBkYXRlKHN0cnVjdCBuZnRfc2V0ICpzZXQsIGNvbnN0IHUzMiAqa2V5LAorCQkJICAgIHZvaWQgKigqbmV3KShzdHJ1Y3QgbmZ0X3NldCAqLAorCQkJCQkgY29uc3Qgc3RydWN0IG5mdF9leHByICosCisJCQkJCSBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MpLAorCQkJICAgIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKKwkJCSAgICBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MsCisJCQkgICAgY29uc3Qgc3RydWN0IG5mdF9zZXRfZXh0ICoqZXh0KQoreworCXN0cnVjdCBuZnRfaGFzaCAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOworCXN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZTsKKwlzdHJ1Y3QgbmZ0X2hhc2hfY21wX2FyZyBhcmcgPSB7CisJCS5nZW5tYXNrID0gTkZUX0dFTk1BU0tfQU5ZLAorCQkuc2V0CSA9IHNldCwKKwkJLmtleQkgPSBrZXksCisJfTsKKworCWhlID0gcmhhc2h0YWJsZV9sb29rdXBfZmFzdCgmcHJpdi0+aHQsICZhcmcsIG5mdF9oYXNoX3BhcmFtcyk7CisJaWYgKGhlICE9IE5VTEwpCisJCWdvdG8gb3V0OworCisJaGUgPSBuZXcoc2V0LCBleHByLCByZWdzKTsKKwlpZiAoaGUgPT0gTlVMTCkKKwkJZ290byBlcnIxOworCWlmIChyaGFzaHRhYmxlX2xvb2t1cF9pbnNlcnRfa2V5KCZwcml2LT5odCwgJmFyZywgJmhlLT5ub2RlLAorCQkJCQkgbmZ0X2hhc2hfcGFyYW1zKSkKKwkJZ290byBlcnIyOworb3V0OgorCSpleHQgPSAmaGUtPmV4dDsKKwlyZXR1cm4gdHJ1ZTsKKworZXJyMjoKKwluZnRfc2V0X2VsZW1fZGVzdHJveShzZXQsIGhlKTsKK2VycjE6CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50IG5mdF9oYXNoX2luc2VydChjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQkgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtLAorCQkJICAgc3RydWN0IG5mdF9zZXRfZXh0ICoqZXh0KQoreworCXN0cnVjdCBuZnRfaGFzaCAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOworCXN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZSA9IGVsZW0tPnByaXY7CisJc3RydWN0IG5mdF9oYXNoX2NtcF9hcmcgYXJnID0geworCQkuZ2VubWFzayA9IG5mdF9nZW5tYXNrX25leHQobmV0KSwKKwkJLnNldAkgPSBzZXQsCisJCS5rZXkJID0gZWxlbS0+a2V5LnZhbC5kYXRhLAorCX07CisJc3RydWN0IG5mdF9oYXNoX2VsZW0gKnByZXY7CisKKwlwcmV2ID0gcmhhc2h0YWJsZV9sb29rdXBfZ2V0X2luc2VydF9rZXkoJnByaXYtPmh0LCAmYXJnLCAmaGUtPm5vZGUsCisJCQkJCSAgICAgICBuZnRfaGFzaF9wYXJhbXMpOworCWlmIChJU19FUlIocHJldikpCisJCXJldHVybiBQVFJfRVJSKHByZXYpOworCWlmIChwcmV2KSB7CisJCSpleHQgPSAmcHJldi0+ZXh0OworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG5mdF9oYXNoX2FjdGl2YXRlKGNvbnN0IHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZnRfc2V0X2VsZW0gKmVsZW0pCit7CisJc3RydWN0IG5mdF9oYXNoX2VsZW0gKmhlID0gZWxlbS0+cHJpdjsKKworCW5mdF9zZXRfZWxlbV9jaGFuZ2VfYWN0aXZlKG5ldCwgc2V0LCAmaGUtPmV4dCk7CisJbmZ0X3NldF9lbGVtX2NsZWFyX2J1c3koJmhlLT5leHQpOworfQorCitzdGF0aWMgdm9pZCAqbmZ0X2hhc2hfZGVhY3RpdmF0ZShjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsCisJCQkJIGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQkJIGNvbnN0IHN0cnVjdCBuZnRfc2V0X2VsZW0gKmVsZW0pCit7CisJc3RydWN0IG5mdF9oYXNoICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7CisJc3RydWN0IG5mdF9oYXNoX2VsZW0gKmhlOworCXN0cnVjdCBuZnRfaGFzaF9jbXBfYXJnIGFyZyA9IHsKKwkJLmdlbm1hc2sgPSBuZnRfZ2VubWFza19uZXh0KG5ldCksCisJCS5zZXQJID0gc2V0LAorCQkua2V5CSA9IGVsZW0tPmtleS52YWwuZGF0YSwKKwl9OworCisJcmN1X3JlYWRfbG9jaygpOworCWhlID0gcmhhc2h0YWJsZV9sb29rdXBfZmFzdCgmcHJpdi0+aHQsICZhcmcsIG5mdF9oYXNoX3BhcmFtcyk7CisJaWYgKGhlICE9IE5VTEwpIHsKKwkJaWYgKCFuZnRfc2V0X2VsZW1fbWFya19idXN5KCZoZS0+ZXh0KSB8fAorCQkgICAgIW5mdF9pc19hY3RpdmUobmV0LCAmaGUtPmV4dCkpCisJCQluZnRfc2V0X2VsZW1fY2hhbmdlX2FjdGl2ZShuZXQsIHNldCwgJmhlLT5leHQpOworCQllbHNlCisJCQloZSA9IE5VTEw7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIGhlOworfQorCitzdGF0aWMgdm9pZCBuZnRfaGFzaF9yZW1vdmUoY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtKQoreworCXN0cnVjdCBuZnRfaGFzaCAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOworCXN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZSA9IGVsZW0tPnByaXY7CisKKwlyaGFzaHRhYmxlX3JlbW92ZV9mYXN0KCZwcml2LT5odCwgJmhlLT5ub2RlLCBuZnRfaGFzaF9wYXJhbXMpOworfQorCitzdGF0aWMgdm9pZCBuZnRfaGFzaF93YWxrKGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsIGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQkgIHN0cnVjdCBuZnRfc2V0X2l0ZXIgKml0ZXIpCit7CisJc3RydWN0IG5mdF9oYXNoICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7CisJc3RydWN0IG5mdF9oYXNoX2VsZW0gKmhlOworCXN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgaHRpOworCXN0cnVjdCBuZnRfc2V0X2VsZW0gZWxlbTsKKwlpbnQgZXJyOworCisJZXJyID0gcmhhc2h0YWJsZV93YWxrX2luaXQoJnByaXYtPmh0LCAmaHRpLCBHRlBfS0VSTkVMKTsKKwlpdGVyLT5lcnIgPSBlcnI7CisJaWYgKGVycikKKwkJcmV0dXJuOworCisJZXJyID0gcmhhc2h0YWJsZV93YWxrX3N0YXJ0KCZodGkpOworCWlmIChlcnIgJiYgZXJyICE9IC1FQUdBSU4pIHsKKwkJaXRlci0+ZXJyID0gZXJyOworCQlnb3RvIG91dDsKKwl9CisKKwl3aGlsZSAoKGhlID0gcmhhc2h0YWJsZV93YWxrX25leHQoJmh0aSkpKSB7CisJCWlmIChJU19FUlIoaGUpKSB7CisJCQllcnIgPSBQVFJfRVJSKGhlKTsKKwkJCWlmIChlcnIgIT0gLUVBR0FJTikgeworCQkJCWl0ZXItPmVyciA9IGVycjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoaXRlci0+Y291bnQgPCBpdGVyLT5za2lwKQorCQkJZ290byBjb250OworCQlpZiAobmZ0X3NldF9lbGVtX2V4cGlyZWQoJmhlLT5leHQpKQorCQkJZ290byBjb250OworCQlpZiAoIW5mdF9zZXRfZWxlbV9hY3RpdmUoJmhlLT5leHQsIGl0ZXItPmdlbm1hc2spKQorCQkJZ290byBjb250OworCisJCWVsZW0ucHJpdiA9IGhlOworCisJCWl0ZXItPmVyciA9IGl0ZXItPmZuKGN0eCwgc2V0LCBpdGVyLCAmZWxlbSk7CisJCWlmIChpdGVyLT5lcnIgPCAwKQorCQkJZ290byBvdXQ7CisKK2NvbnQ6CisJCWl0ZXItPmNvdW50Kys7CisJfQorCitvdXQ6CisJcmhhc2h0YWJsZV93YWxrX3N0b3AoJmh0aSk7CisJcmhhc2h0YWJsZV93YWxrX2V4aXQoJmh0aSk7Cit9CisKK3N0YXRpYyB2b2lkIG5mdF9oYXNoX2djKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgbmZ0X3NldCAqc2V0OworCXN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZTsKKwlzdHJ1Y3QgbmZ0X2hhc2ggKnByaXY7CisJc3RydWN0IG5mdF9zZXRfZ2NfYmF0Y2ggKmdjYiA9IE5VTEw7CisJc3RydWN0IHJoYXNodGFibGVfaXRlciBodGk7CisJaW50IGVycjsKKworCXByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG5mdF9oYXNoLCBnY193b3JrLndvcmspOworCXNldCAgPSBuZnRfc2V0X2NvbnRhaW5lcl9vZihwcml2KTsKKworCWVyciA9IHJoYXNodGFibGVfd2Fsa19pbml0KCZwcml2LT5odCwgJmh0aSwgR0ZQX0tFUk5FTCk7CisJaWYgKGVycikKKwkJZ290byBzY2hlZHVsZTsKKworCWVyciA9IHJoYXNodGFibGVfd2Fsa19zdGFydCgmaHRpKTsKKwlpZiAoZXJyICYmIGVyciAhPSAtRUFHQUlOKQorCQlnb3RvIG91dDsKKworCXdoaWxlICgoaGUgPSByaGFzaHRhYmxlX3dhbGtfbmV4dCgmaHRpKSkpIHsKKwkJaWYgKElTX0VSUihoZSkpIHsKKwkJCWlmIChQVFJfRVJSKGhlKSAhPSAtRUFHQUlOKQorCQkJCWdvdG8gb3V0OworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIW5mdF9zZXRfZWxlbV9leHBpcmVkKCZoZS0+ZXh0KSkKKwkJCWNvbnRpbnVlOworCQlpZiAobmZ0X3NldF9lbGVtX21hcmtfYnVzeSgmaGUtPmV4dCkpCisJCQljb250aW51ZTsKKworCQlnY2IgPSBuZnRfc2V0X2djX2JhdGNoX2NoZWNrKHNldCwgZ2NiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGdjYiA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJCXJoYXNodGFibGVfcmVtb3ZlX2Zhc3QoJnByaXYtPmh0LCAmaGUtPm5vZGUsIG5mdF9oYXNoX3BhcmFtcyk7CisJCWF0b21pY19kZWMoJnNldC0+bmVsZW1zKTsKKwkJbmZ0X3NldF9nY19iYXRjaF9hZGQoZ2NiLCBoZSk7CisJfQorb3V0OgorCXJoYXNodGFibGVfd2Fsa19zdG9wKCZodGkpOworCXJoYXNodGFibGVfd2Fsa19leGl0KCZodGkpOworCisJbmZ0X3NldF9nY19iYXRjaF9jb21wbGV0ZShnY2IpOworc2NoZWR1bGU6CisJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9wb3dlcl9lZmZpY2llbnRfd3EsICZwcml2LT5nY193b3JrLAorCQkJICAgbmZ0X3NldF9nY19pbnRlcnZhbChzZXQpKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBuZnRfaGFzaF9wcml2c2l6ZShjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgbmxhW10pCit7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgbmZ0X2hhc2gpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIG5mdF9oYXNoX3BhcmFtcyA9IHsKKwkuaGVhZF9vZmZzZXQJCT0gb2Zmc2V0b2Yoc3RydWN0IG5mdF9oYXNoX2VsZW0sIG5vZGUpLAorCS5oYXNoZm4JCQk9IG5mdF9oYXNoX2tleSwKKwkub2JqX2hhc2hmbgkJPSBuZnRfaGFzaF9vYmosCisJLm9ial9jbXBmbgkJPSBuZnRfaGFzaF9jbXAsCisJLmF1dG9tYXRpY19zaHJpbmtpbmcJPSB0cnVlLAorfTsKKworc3RhdGljIGludCBuZnRfaGFzaF9pbml0KGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQkgY29uc3Qgc3RydWN0IG5mdF9zZXRfZGVzYyAqZGVzYywKKwkJCSBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSkKK3sKKwlzdHJ1Y3QgbmZ0X2hhc2ggKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKKwlzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGFyYW1zID0gbmZ0X2hhc2hfcGFyYW1zOworCWludCBlcnI7CisKKwlwYXJhbXMubmVsZW1faGludCA9IGRlc2MtPnNpemUgPzogTkZUX0hBU0hfRUxFTUVOVF9ISU5UOworCXBhcmFtcy5rZXlfbGVuCSAgPSBzZXQtPmtsZW47CisKKwllcnIgPSByaGFzaHRhYmxlX2luaXQoJnByaXYtPmh0LCAmcGFyYW1zKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCUlOSVRfREVGRVJSQUJMRV9XT1JLKCZwcml2LT5nY193b3JrLCBuZnRfaGFzaF9nYyk7CisJaWYgKHNldC0+ZmxhZ3MgJiBORlRfU0VUX1RJTUVPVVQpCisJCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fcG93ZXJfZWZmaWNpZW50X3dxLCAmcHJpdi0+Z2Nfd29yaywKKwkJCQkgICBuZnRfc2V0X2djX2ludGVydmFsKHNldCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBuZnRfaGFzaF9lbGVtX2Rlc3Ryb3kodm9pZCAqcHRyLCB2b2lkICphcmcpCit7CisJbmZ0X3NldF9lbGVtX2Rlc3Ryb3koKGNvbnN0IHN0cnVjdCBuZnRfc2V0ICopYXJnLCBwdHIpOworfQorCitzdGF0aWMgdm9pZCBuZnRfaGFzaF9kZXN0cm95KGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQpCit7CisJc3RydWN0IG5mdF9oYXNoICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXYtPmdjX3dvcmspOworCXJoYXNodGFibGVfZnJlZV9hbmRfZGVzdHJveSgmcHJpdi0+aHQsIG5mdF9oYXNoX2VsZW1fZGVzdHJveSwKKwkJCQkgICAgKHZvaWQgKilzZXQpOworfQorCitzdGF0aWMgYm9vbCBuZnRfaGFzaF9lc3RpbWF0ZShjb25zdCBzdHJ1Y3QgbmZ0X3NldF9kZXNjICpkZXNjLCB1MzIgZmVhdHVyZXMsCisJCQkgICAgICBzdHJ1Y3QgbmZ0X3NldF9lc3RpbWF0ZSAqZXN0KQoreworCXVuc2lnbmVkIGludCBlc2l6ZTsKKworCWVzaXplID0gc2l6ZW9mKHN0cnVjdCBuZnRfaGFzaF9lbGVtKTsKKwlpZiAoZGVzYy0+c2l6ZSkgeworCQllc3QtPnNpemUgPSBzaXplb2Yoc3RydWN0IG5mdF9oYXNoKSArCisJCQkgICAgcm91bmR1cF9wb3dfb2ZfdHdvKGRlc2MtPnNpemUgKiA0IC8gMykgKgorCQkJICAgIHNpemVvZihzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSAqKSArCisJCQkgICAgZGVzYy0+c2l6ZSAqIGVzaXplOworCX0gZWxzZSB7CisJCS8qIFJlc2l6aW5nIGhhcHBlbnMgd2hlbiB0aGUgbG9hZCBkcm9wcyBiZWxvdyAzMCUgb3IgZ29lcworCQkgKiBhYm92ZSA3NSUuIFRoZSBhdmVyYWdlIG9mIDUyLjUlIGxvYWQgKGFwcHJveGltYXRlZCBieSA1MCUpCisJCSAqIGlzIHVzZWQgZm9yIHRoZSBzaXplIGVzdGltYXRpb24gb2YgdGhlIGhhc2ggYnVja2V0cywKKwkJICogbWVhbmluZyB3ZSBjYWxjdWxhdGUgdHdvIGJ1Y2tldHMgcGVyIGVsZW1lbnQuCisJCSAqLworCQllc3QtPnNpemUgPSBlc2l6ZSArIDIgKiBzaXplb2Yoc3RydWN0IG5mdF9oYXNoX2VsZW0gKik7CisJfQorCisJZXN0LT5jbGFzcyA9IE5GVF9TRVRfQ0xBU1NfT18xOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZ0X3NldF9vcHMgbmZ0X2hhc2hfb3BzIF9fcmVhZF9tb3N0bHkgPSB7CisJLnByaXZzaXplICAgICAgID0gbmZ0X2hhc2hfcHJpdnNpemUsCisJLmVsZW1zaXplCT0gb2Zmc2V0b2Yoc3RydWN0IG5mdF9oYXNoX2VsZW0sIGV4dCksCisJLmVzdGltYXRlCT0gbmZ0X2hhc2hfZXN0aW1hdGUsCisJLmluaXQJCT0gbmZ0X2hhc2hfaW5pdCwKKwkuZGVzdHJveQk9IG5mdF9oYXNoX2Rlc3Ryb3ksCisJLmluc2VydAkJPSBuZnRfaGFzaF9pbnNlcnQsCisJLmFjdGl2YXRlCT0gbmZ0X2hhc2hfYWN0aXZhdGUsCisJLmRlYWN0aXZhdGUJPSBuZnRfaGFzaF9kZWFjdGl2YXRlLAorCS5yZW1vdmUJCT0gbmZ0X2hhc2hfcmVtb3ZlLAorCS5sb29rdXAJCT0gbmZ0X2hhc2hfbG9va3VwLAorCS51cGRhdGUJCT0gbmZ0X2hhc2hfdXBkYXRlLAorCS53YWxrCQk9IG5mdF9oYXNoX3dhbGssCisJLmZlYXR1cmVzCT0gTkZUX1NFVF9NQVAgfCBORlRfU0VUX1RJTUVPVVQsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbmZ0X2hhc2hfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gbmZ0X3JlZ2lzdGVyX3NldCgmbmZ0X2hhc2hfb3BzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG5mdF9oYXNoX21vZHVsZV9leGl0KHZvaWQpCit7CisJbmZ0X3VucmVnaXN0ZXJfc2V0KCZuZnRfaGFzaF9vcHMpOworfQorCittb2R1bGVfaW5pdChuZnRfaGFzaF9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChuZnRfaGFzaF9tb2R1bGVfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlBhdHJpY2sgTWNIYXJkeSA8a2FiZXJAdHJhc2gubmV0PiIpOworTU9EVUxFX0FMSUFTX05GVF9TRVQoKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X3NldF9yYnRyZWUuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X3NldF9yYnRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGI1YmRhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfc2V0X3JidHJlZS5jCkBAIC0wLDAgKzEsMzIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBEZXZlbG9wbWVudCBvZiB0aGlzIGNvZGUgZnVuZGVkIGJ5IEFzdGFybyBBRyAoaHR0cDovL3d3dy5hc3Rhcm8uY29tLykKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX3RhYmxlcy5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfdGFibGVzLmg+CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobmZ0X3JidHJlZV9sb2NrKTsKKworc3RydWN0IG5mdF9yYnRyZWUgeworCXN0cnVjdCByYl9yb290CQlyb290OworfTsKKworc3RydWN0IG5mdF9yYnRyZWVfZWxlbSB7CisJc3RydWN0IHJiX25vZGUJCW5vZGU7CisJc3RydWN0IG5mdF9zZXRfZXh0CWV4dDsKK307CisKK3N0YXRpYyBib29sIG5mdF9yYnRyZWVfaW50ZXJ2YWxfZW5kKGNvbnN0IHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0gKnJiZSkKK3sKKwlyZXR1cm4gbmZ0X3NldF9leHRfZXhpc3RzKCZyYmUtPmV4dCwgTkZUX1NFVF9FWFRfRkxBR1MpICYmCisJICAgICAgICgqbmZ0X3NldF9leHRfZmxhZ3MoJnJiZS0+ZXh0KSAmIE5GVF9TRVRfRUxFTV9JTlRFUlZBTF9FTkQpOworfQorCitzdGF0aWMgYm9vbCBuZnRfcmJ0cmVlX2VxdWFsKGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsIGNvbnN0IHZvaWQgKnRoaXMsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0gKmludGVydmFsKQoreworCXJldHVybiBtZW1jbXAodGhpcywgbmZ0X3NldF9leHRfa2V5KCZpbnRlcnZhbC0+ZXh0KSwgc2V0LT5rbGVuKSA9PSAwOworfQorCitzdGF0aWMgYm9vbCBuZnRfcmJ0cmVlX2xvb2t1cChjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQkgICAgICBjb25zdCB1MzIgKmtleSwgY29uc3Qgc3RydWN0IG5mdF9zZXRfZXh0ICoqZXh0KQoreworCWNvbnN0IHN0cnVjdCBuZnRfcmJ0cmVlICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7CisJY29uc3Qgc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqcmJlLCAqaW50ZXJ2YWwgPSBOVUxMOworCXU4IGdlbm1hc2sgPSBuZnRfZ2VubWFza19jdXIobmV0KTsKKwljb25zdCBzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50OworCWNvbnN0IHZvaWQgKnRoaXM7CisJaW50IGQ7CisKKwlzcGluX2xvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7CisJcGFyZW50ID0gcHJpdi0+cm9vdC5yYl9ub2RlOworCXdoaWxlIChwYXJlbnQgIT0gTlVMTCkgeworCQlyYmUgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0sIG5vZGUpOworCisJCXRoaXMgPSBuZnRfc2V0X2V4dF9rZXkoJnJiZS0+ZXh0KTsKKwkJZCA9IG1lbWNtcCh0aGlzLCBrZXksIHNldC0+a2xlbik7CisJCWlmIChkIDwgMCkgeworCQkJcGFyZW50ID0gcGFyZW50LT5yYl9sZWZ0OworCQkJLyogSW4gY2FzZSBvZiBhZGphY2VudCByYW5nZXMsIHdlIGFsd2F5cyBzZWUgdGhlIGhpZ2gKKwkJCSAqIHBhcnQgb2YgdGhlIHJhbmdlIGluIGZpcnN0IHBsYWNlLCBiZWZvcmUgdGhlIGxvdyBvbmUuCisJCQkgKiBTbyBkb24ndCB1cGRhdGUgaW50ZXJ2YWwgaWYgdGhlIGtleXMgYXJlIGVxdWFsLgorCQkJICovCisJCQlpZiAoaW50ZXJ2YWwgJiYgbmZ0X3JidHJlZV9lcXVhbChzZXQsIHRoaXMsIGludGVydmFsKSkKKwkJCQljb250aW51ZTsKKwkJCWludGVydmFsID0gcmJlOworCQl9IGVsc2UgaWYgKGQgPiAwKQorCQkJcGFyZW50ID0gcGFyZW50LT5yYl9yaWdodDsKKwkJZWxzZSB7CisJCQlpZiAoIW5mdF9zZXRfZWxlbV9hY3RpdmUoJnJiZS0+ZXh0LCBnZW5tYXNrKSkgeworCQkJCXBhcmVudCA9IHBhcmVudC0+cmJfbGVmdDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChuZnRfcmJ0cmVlX2ludGVydmFsX2VuZChyYmUpKQorCQkJCWdvdG8gb3V0OworCQkJc3Bpbl91bmxvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7CisKKwkJCSpleHQgPSAmcmJlLT5leHQ7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKworCWlmIChzZXQtPmZsYWdzICYgTkZUX1NFVF9JTlRFUlZBTCAmJiBpbnRlcnZhbCAhPSBOVUxMICYmCisJICAgIG5mdF9zZXRfZWxlbV9hY3RpdmUoJmludGVydmFsLT5leHQsIGdlbm1hc2spICYmCisJICAgICFuZnRfcmJ0cmVlX2ludGVydmFsX2VuZChpbnRlcnZhbCkpIHsKKwkJc3Bpbl91bmxvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7CisJCSpleHQgPSAmaW50ZXJ2YWwtPmV4dDsKKwkJcmV0dXJuIHRydWU7CisJfQorb3V0OgorCXNwaW5fdW5sb2NrX2JoKCZuZnRfcmJ0cmVlX2xvY2spOworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludCBfX25mdF9yYnRyZWVfaW5zZXJ0KGNvbnN0IHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKKwkJCSAgICAgICBzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpuZXcsCisJCQkgICAgICAgc3RydWN0IG5mdF9zZXRfZXh0ICoqZXh0KQoreworCXN0cnVjdCBuZnRfcmJ0cmVlICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7CisJdTggZ2VubWFzayA9IG5mdF9nZW5tYXNrX25leHQobmV0KTsKKwlzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCwgKipwOworCWludCBkOworCisJcGFyZW50ID0gTlVMTDsKKwlwID0gJnByaXYtPnJvb3QucmJfbm9kZTsKKwl3aGlsZSAoKnAgIT0gTlVMTCkgeworCQlwYXJlbnQgPSAqcDsKKwkJcmJlID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtLCBub2RlKTsKKwkJZCA9IG1lbWNtcChuZnRfc2V0X2V4dF9rZXkoJnJiZS0+ZXh0KSwKKwkJCSAgIG5mdF9zZXRfZXh0X2tleSgmbmV3LT5leHQpLAorCQkJICAgc2V0LT5rbGVuKTsKKwkJaWYgKGQgPCAwKQorCQkJcCA9ICZwYXJlbnQtPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGQgPiAwKQorCQkJcCA9ICZwYXJlbnQtPnJiX3JpZ2h0OworCQllbHNlIHsKKwkJCWlmIChuZnRfc2V0X2VsZW1fYWN0aXZlKCZyYmUtPmV4dCwgZ2VubWFzaykpIHsKKwkJCQlpZiAobmZ0X3JidHJlZV9pbnRlcnZhbF9lbmQocmJlKSAmJgorCQkJCSAgICAhbmZ0X3JidHJlZV9pbnRlcnZhbF9lbmQobmV3KSkKKwkJCQkJcCA9ICZwYXJlbnQtPnJiX2xlZnQ7CisJCQkJZWxzZSBpZiAoIW5mdF9yYnRyZWVfaW50ZXJ2YWxfZW5kKHJiZSkgJiYKKwkJCQkJIG5mdF9yYnRyZWVfaW50ZXJ2YWxfZW5kKG5ldykpCisJCQkJCXAgPSAmcGFyZW50LT5yYl9yaWdodDsKKwkJCQllbHNlIHsKKwkJCQkJKmV4dCA9ICZyYmUtPmV4dDsKKwkJCQkJcmV0dXJuIC1FRVhJU1Q7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJiX2xpbmtfbm9kZSgmbmV3LT5ub2RlLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcigmbmV3LT5ub2RlLCAmcHJpdi0+cm9vdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmZ0X3JidHJlZV9pbnNlcnQoY29uc3Qgc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtLAorCQkJICAgICBzdHJ1Y3QgbmZ0X3NldF9leHQgKipleHQpCit7CisJc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqcmJlID0gZWxlbS0+cHJpdjsKKwlpbnQgZXJyOworCisJc3Bpbl9sb2NrX2JoKCZuZnRfcmJ0cmVlX2xvY2spOworCWVyciA9IF9fbmZ0X3JidHJlZV9pbnNlcnQobmV0LCBzZXQsIHJiZSwgZXh0KTsKKwlzcGluX3VubG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIG5mdF9yYnRyZWVfcmVtb3ZlKGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtKQoreworCXN0cnVjdCBuZnRfcmJ0cmVlICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7CisJc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqcmJlID0gZWxlbS0+cHJpdjsKKworCXNwaW5fbG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKKwlyYl9lcmFzZSgmcmJlLT5ub2RlLCAmcHJpdi0+cm9vdCk7CisJc3Bpbl91bmxvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIG5mdF9yYnRyZWVfYWN0aXZhdGUoY29uc3Qgc3RydWN0IG5ldCAqbmV0LAorCQkJCWNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQkJY29uc3Qgc3RydWN0IG5mdF9zZXRfZWxlbSAqZWxlbSkKK3sKKwlzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmUgPSBlbGVtLT5wcml2OworCisJbmZ0X3NldF9lbGVtX2NoYW5nZV9hY3RpdmUobmV0LCBzZXQsICZyYmUtPmV4dCk7Cit9CisKK3N0YXRpYyB2b2lkICpuZnRfcmJ0cmVlX2RlYWN0aXZhdGUoY29uc3Qgc3RydWN0IG5ldCAqbmV0LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQkJICAgY29uc3Qgc3RydWN0IG5mdF9zZXRfZWxlbSAqZWxlbSkKK3sKKwljb25zdCBzdHJ1Y3QgbmZ0X3JidHJlZSAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOworCWNvbnN0IHN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBwcml2LT5yb290LnJiX25vZGU7CisJc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqcmJlLCAqdGhpcyA9IGVsZW0tPnByaXY7CisJdTggZ2VubWFzayA9IG5mdF9nZW5tYXNrX25leHQobmV0KTsKKwlpbnQgZDsKKworCXdoaWxlIChwYXJlbnQgIT0gTlVMTCkgeworCQlyYmUgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0sIG5vZGUpOworCisJCWQgPSBtZW1jbXAobmZ0X3NldF9leHRfa2V5KCZyYmUtPmV4dCksICZlbGVtLT5rZXkudmFsLAorCQkJCQkgICBzZXQtPmtsZW4pOworCQlpZiAoZCA8IDApCisJCQlwYXJlbnQgPSBwYXJlbnQtPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGQgPiAwKQorCQkJcGFyZW50ID0gcGFyZW50LT5yYl9yaWdodDsKKwkJZWxzZSB7CisJCQlpZiAoIW5mdF9zZXRfZWxlbV9hY3RpdmUoJnJiZS0+ZXh0LCBnZW5tYXNrKSkgeworCQkJCXBhcmVudCA9IHBhcmVudC0+cmJfbGVmdDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChuZnRfcmJ0cmVlX2ludGVydmFsX2VuZChyYmUpICYmCisJCQkgICAgIW5mdF9yYnRyZWVfaW50ZXJ2YWxfZW5kKHRoaXMpKSB7CisJCQkJcGFyZW50ID0gcGFyZW50LT5yYl9sZWZ0OworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmICghbmZ0X3JidHJlZV9pbnRlcnZhbF9lbmQocmJlKSAmJgorCQkJCSAgIG5mdF9yYnRyZWVfaW50ZXJ2YWxfZW5kKHRoaXMpKSB7CisJCQkJcGFyZW50ID0gcGFyZW50LT5yYl9yaWdodDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCW5mdF9zZXRfZWxlbV9jaGFuZ2VfYWN0aXZlKG5ldCwgc2V0LCAmcmJlLT5leHQpOworCQkJcmV0dXJuIHJiZTsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgbmZ0X3JidHJlZV93YWxrKGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsCisJCQkgICAgY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKKwkJCSAgICBzdHJ1Y3QgbmZ0X3NldF9pdGVyICppdGVyKQoreworCWNvbnN0IHN0cnVjdCBuZnRfcmJ0cmVlICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7CisJc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqcmJlOworCXN0cnVjdCBuZnRfc2V0X2VsZW0gZWxlbTsKKwlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKKworCXNwaW5fbG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKKwlmb3IgKG5vZGUgPSByYl9maXJzdCgmcHJpdi0+cm9vdCk7IG5vZGUgIT0gTlVMTDsgbm9kZSA9IHJiX25leHQobm9kZSkpIHsKKwkJcmJlID0gcmJfZW50cnkobm9kZSwgc3RydWN0IG5mdF9yYnRyZWVfZWxlbSwgbm9kZSk7CisKKwkJaWYgKGl0ZXItPmNvdW50IDwgaXRlci0+c2tpcCkKKwkJCWdvdG8gY29udDsKKwkJaWYgKCFuZnRfc2V0X2VsZW1fYWN0aXZlKCZyYmUtPmV4dCwgaXRlci0+Z2VubWFzaykpCisJCQlnb3RvIGNvbnQ7CisKKwkJZWxlbS5wcml2ID0gcmJlOworCisJCWl0ZXItPmVyciA9IGl0ZXItPmZuKGN0eCwgc2V0LCBpdGVyLCAmZWxlbSk7CisJCWlmIChpdGVyLT5lcnIgPCAwKSB7CisJCQlzcGluX3VubG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKKwkJCXJldHVybjsKKwkJfQorY29udDoKKwkJaXRlci0+Y291bnQrKzsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmZ0X3JidHJlZV9wcml2c2l6ZShjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgbmxhW10pCit7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgbmZ0X3JidHJlZSk7Cit9CisKK3N0YXRpYyBpbnQgbmZ0X3JidHJlZV9pbml0KGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQkgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9kZXNjICpkZXNjLAorCQkJICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IG5sYVtdKQoreworCXN0cnVjdCBuZnRfcmJ0cmVlICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7CisKKwlwcml2LT5yb290ID0gUkJfUk9PVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbmZ0X3JidHJlZV9kZXN0cm95KGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQpCit7CisJc3RydWN0IG5mdF9yYnRyZWUgKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKKwlzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmU7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisKKwl3aGlsZSAoKG5vZGUgPSBwcml2LT5yb290LnJiX25vZGUpICE9IE5VTEwpIHsKKwkJcmJfZXJhc2Uobm9kZSwgJnByaXYtPnJvb3QpOworCQlyYmUgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtLCBub2RlKTsKKwkJbmZ0X3NldF9lbGVtX2Rlc3Ryb3koc2V0LCByYmUpOworCX0KK30KKworc3RhdGljIGJvb2wgbmZ0X3JidHJlZV9lc3RpbWF0ZShjb25zdCBzdHJ1Y3QgbmZ0X3NldF9kZXNjICpkZXNjLCB1MzIgZmVhdHVyZXMsCisJCQkJc3RydWN0IG5mdF9zZXRfZXN0aW1hdGUgKmVzdCkKK3sKKwl1bnNpZ25lZCBpbnQgbnNpemU7CisKKwluc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtKTsKKwlpZiAoZGVzYy0+c2l6ZSkKKwkJZXN0LT5zaXplID0gc2l6ZW9mKHN0cnVjdCBuZnRfcmJ0cmVlKSArIGRlc2MtPnNpemUgKiBuc2l6ZTsKKwllbHNlCisJCWVzdC0+c2l6ZSA9IG5zaXplOworCisJZXN0LT5jbGFzcyA9IE5GVF9TRVRfQ0xBU1NfT19MT0dfTjsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgc3RydWN0IG5mdF9zZXRfb3BzIG5mdF9yYnRyZWVfb3BzIF9fcmVhZF9tb3N0bHkgPSB7CisJLnByaXZzaXplCT0gbmZ0X3JidHJlZV9wcml2c2l6ZSwKKwkuZWxlbXNpemUJPSBvZmZzZXRvZihzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtLCBleHQpLAorCS5lc3RpbWF0ZQk9IG5mdF9yYnRyZWVfZXN0aW1hdGUsCisJLmluaXQJCT0gbmZ0X3JidHJlZV9pbml0LAorCS5kZXN0cm95CT0gbmZ0X3JidHJlZV9kZXN0cm95LAorCS5pbnNlcnQJCT0gbmZ0X3JidHJlZV9pbnNlcnQsCisJLnJlbW92ZQkJPSBuZnRfcmJ0cmVlX3JlbW92ZSwKKwkuZGVhY3RpdmF0ZQk9IG5mdF9yYnRyZWVfZGVhY3RpdmF0ZSwKKwkuYWN0aXZhdGUJPSBuZnRfcmJ0cmVlX2FjdGl2YXRlLAorCS5sb29rdXAJCT0gbmZ0X3JidHJlZV9sb29rdXAsCisJLndhbGsJCT0gbmZ0X3JidHJlZV93YWxrLAorCS5mZWF0dXJlcwk9IE5GVF9TRVRfSU5URVJWQUwgfCBORlRfU0VUX01BUCwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBuZnRfcmJ0cmVlX21vZHVsZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIG5mdF9yZWdpc3Rlcl9zZXQoJm5mdF9yYnRyZWVfb3BzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG5mdF9yYnRyZWVfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwluZnRfdW5yZWdpc3Rlcl9zZXQoJm5mdF9yYnRyZWVfb3BzKTsKK30KKworbW9kdWxlX2luaXQobmZ0X3JidHJlZV9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChuZnRfcmJ0cmVlX21vZHVsZV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+Iik7CitNT0RVTEVfQUxJQVNfTkZUX1NFVCgpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9SQVRFRVNULmMgYi9uZXQvbmV0ZmlsdGVyL3h0X1JBVEVFU1QuYwppbmRleCA1MTUxMzFmLi5kYmQ2YzRhIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X1JBVEVFU1QuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X1JBVEVFU1QuYwpAQCAtMjQsNyArMjQsNiBAQAogI2RlZmluZSBSQVRFRVNUX0hTSVpFCTE2CiBzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQgcmF0ZWVzdF9oYXNoW1JBVEVFU1RfSFNJWkVdIF9fcmVhZF9tb3N0bHk7CiBzdGF0aWMgdW5zaWduZWQgaW50IGpoYXNoX3JuZCBfX3JlYWRfbW9zdGx5Owotc3RhdGljIGJvb2wgcm5kX2luaXRlZCBfX3JlYWRfbW9zdGx5OwogCiBzdGF0aWMgdW5zaWduZWQgaW50IHh0X3JhdGVlc3RfaGFzaChjb25zdCBjaGFyICpuYW1lKQogewpAQCAtOTksMTAgKzk4LDcgQEAKIAl9IGNmZzsKIAlpbnQgcmV0OwogCi0JaWYgKHVubGlrZWx5KCFybmRfaW5pdGVkKSkgewotCQlnZXRfcmFuZG9tX2J5dGVzKCZqaGFzaF9ybmQsIHNpemVvZihqaGFzaF9ybmQpKTsKLQkJcm5kX2luaXRlZCA9IHRydWU7Ci0JfQorCW5ldF9nZXRfcmFuZG9tX29uY2UoJmpoYXNoX3JuZCwgc2l6ZW9mKGpoYXNoX3JuZCkpOwogCiAJZXN0ID0geHRfcmF0ZWVzdF9sb29rdXAoaW5mby0+bmFtZSk7CiAJaWYgKGVzdCkgewpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9UQ1BNU1MuYyBiL25ldC9uZXRmaWx0ZXIveHRfVENQTVNTLmMKaW5kZXggZTExODM5Ny4uODcyZGIyZCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9UQ1BNU1MuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X1RDUE1TUy5jCkBAIC0xMTAsMTggKzExMCwxNCBAQAogCWlmIChpbmZvLT5tc3MgPT0gWFRfVENQTVNTX0NMQU1QX1BNVFUpIHsKIAkJc3RydWN0IG5ldCAqbmV0ID0gcGFyLT5uZXQ7CiAJCXVuc2lnbmVkIGludCBpbl9tdHUgPSB0Y3Btc3NfcmV2ZXJzZV9tdHUobmV0LCBza2IsIGZhbWlseSk7CisJCXVuc2lnbmVkIGludCBtaW5fbXR1ID0gbWluKGRzdF9tdHUoc2tiX2RzdChza2IpKSwgaW5fbXR1KTsKIAotCQlpZiAoZHN0X210dShza2JfZHN0KHNrYikpIDw9IG1pbmxlbikgeworCQlpZiAobWluX210dSA8PSBtaW5sZW4pIHsKIAkJCW5ldF9lcnJfcmF0ZWxpbWl0ZWQoInVua25vd24gb3IgaW52YWxpZCBwYXRoLU1UVSAoJXUpXG4iLAotCQkJCQkgICAgZHN0X210dShza2JfZHN0KHNrYikpKTsKKwkJCQkJICAgIG1pbl9tdHUpOwogCQkJcmV0dXJuIC0xOwogCQl9Ci0JCWlmIChpbl9tdHUgPD0gbWlubGVuKSB7Ci0JCQluZXRfZXJyX3JhdGVsaW1pdGVkKCJ1bmtub3duIG9yIGludmFsaWQgcGF0aC1NVFUgKCV1KVxuIiwKLQkJCQkJICAgIGluX210dSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJbmV3bXNzID0gbWluKGRzdF9tdHUoc2tiX2RzdChza2IpKSwgaW5fbXR1KSAtIG1pbmxlbjsKKwkJbmV3bXNzID0gbWluX210dSAtIG1pbmxlbjsKIAl9IGVsc2UKIAkJbmV3bXNzID0gaW5mby0+bXNzOwogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X1RFRS5jIGIvbmV0L25ldGZpbHRlci94dF9URUUuYwppbmRleCA2ZTU3YTM5Li4wNDcxZGI0IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X1RFRS5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfVEVFLmMKQEAgLTg5LDYgKzg5LDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoaW5mby0+b2lmWzBdKSB7CisJCWludCByZXQ7CisKIAkJaWYgKGluZm8tPm9pZltzaXplb2YoaW5mby0+b2lmKS0xXSAhPSAnXDAnKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTEwMSw3ICsxMDMsMTEgQEAKIAkJcHJpdi0+bm90aWZpZXIubm90aWZpZXJfY2FsbCA9IHRlZV9uZXRkZXZfZXZlbnQ7CiAJCWluZm8tPnByaXYgICAgPSBwcml2OwogCi0JCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmcHJpdi0+bm90aWZpZXIpOworCQlyZXQgPSByZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJnByaXYtPm5vdGlmaWVyKTsKKwkJaWYgKHJldCkgeworCQkJa2ZyZWUocHJpdik7CisJCQlyZXR1cm4gcmV0OworCQl9CiAJfSBlbHNlCiAJCWluZm8tPnByaXYgPSBOVUxMOwogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X1RQUk9YWS5jIGIvbmV0L25ldGZpbHRlci94dF9UUFJPWFkuYwppbmRleCA3ZjQ0MTRkLi42NjNjNGMzIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X1RQUk9YWS5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfVFBST1hZLmMKQEAgLTEyNyw2ICsxMjcsOCBAQAogCQkJCQkJICAgIGRhZGRyLCBkcG9ydCwKIAkJCQkJCSAgICBpbi0+aWZpbmRleCk7CiAKKwkJCWlmIChzayAmJiAhYXRvbWljX2luY19ub3RfemVybygmc2stPnNrX3JlZmNudCkpCisJCQkJc2sgPSBOVUxMOwogCQkJLyogTk9URTogd2UgcmV0dXJuIGxpc3RlbmVycyBldmVuIGlmIGJvdW5kIHRvCiAJCQkgKiAwLjAuMC4wLCB0aG9zZSBhcmUgZmlsdGVyZWQgb3V0IGluCiAJCQkgKiB4dF9zb2NrZXQsIHNpbmNlIHh0X1RQUk9YWSBuZWVkcyAwIGJvdW5kCkBAIC0xOTUsNiArMTk3LDggQEAKIAkJCQkJCSAgIGRhZGRyLCBudG9ocyhkcG9ydCksCiAJCQkJCQkgICBpbi0+aWZpbmRleCk7CiAKKwkJCWlmIChzayAmJiAhYXRvbWljX2luY19ub3RfemVybygmc2stPnNrX3JlZmNudCkpCisJCQkJc2sgPSBOVUxMOwogCQkJLyogTk9URTogd2UgcmV0dXJuIGxpc3RlbmVycyBldmVuIGlmIGJvdW5kIHRvCiAJCQkgKiAwLjAuMC4wLCB0aG9zZSBhcmUgZmlsdGVyZWQgb3V0IGluCiAJCQkgKiB4dF9zb2NrZXQsIHNpbmNlIHh0X1RQUk9YWSBuZWVkcyAwIGJvdW5kCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5saW1pdC5jIGIvbmV0L25ldGZpbHRlci94dF9jb25ubGltaXQuYwppbmRleCA5OWJiYzgyLi5iNmRjMzIyIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5saW1pdC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfY29ubmxpbWl0LmMKQEAgLTM2NiwxNCArMzY2LDggQEAKIAl1bnNpZ25lZCBpbnQgaTsKIAlpbnQgcmV0OwogCi0JaWYgKHVubGlrZWx5KCFjb25ubGltaXRfcm5kKSkgewotCQl1X2ludDMyX3QgcmFuZDsKKwluZXRfZ2V0X3JhbmRvbV9vbmNlKCZjb25ubGltaXRfcm5kLCBzaXplb2YoY29ubmxpbWl0X3JuZCkpOwogCi0JCWRvIHsKLQkJCWdldF9yYW5kb21fYnl0ZXMoJnJhbmQsIHNpemVvZihyYW5kKSk7Ci0JCX0gd2hpbGUgKCFyYW5kKTsKLQkJY21weGNoZygmY29ubmxpbWl0X3JuZCwgMCwgcmFuZCk7Ci0JfQogCXJldCA9IG5mX2N0X2wzcHJvdG9fdHJ5X21vZHVsZV9nZXQocGFyLT5mYW1pbHkpOwogCWlmIChyZXQgPCAwKSB7CiAJCXByX2luZm8oImNhbm5vdCBsb2FkIGNvbm50cmFjayBzdXBwb3J0IGZvciAiCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5jIGIvbmV0L25ldGZpbHRlci94dF9jb25udHJhY2suYwppbmRleCAxODg0MDRiOS4uYTNiOGY2OSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9jb25udHJhY2suYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5jCkBAIC0yMzMsMTAgKzIzMyw4IEBACiAJCXJldHVybiBmYWxzZTsKIAogCWlmIChpbmZvLT5tYXRjaF9mbGFncyAmIFhUX0NPTk5UUkFDS19FWFBJUkVTKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZXhwaXJlcyA9IDA7CisJCXVuc2lnbmVkIGxvbmcgZXhwaXJlcyA9IG5mX2N0X2V4cGlyZXMoY3QpIC8gSFo7CiAKLQkJaWYgKHRpbWVyX3BlbmRpbmcoJmN0LT50aW1lb3V0KSkKLQkJCWV4cGlyZXMgPSAoY3QtPnRpbWVvdXQuZXhwaXJlcyAtIGppZmZpZXMpIC8gSFo7CiAJCWlmICgoZXhwaXJlcyA+PSBpbmZvLT5leHBpcmVzX21pbiAmJgogCQkgICAgZXhwaXJlcyA8PSBpbmZvLT5leHBpcmVzX21heCkgXgogCQkgICAgIShpbmZvLT5pbnZlcnRfZmxhZ3MgJiBYVF9DT05OVFJBQ0tfRVhQSVJFUykpCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2hhc2hsaW1pdC5jIGIvbmV0L25ldGZpbHRlci94dF9oYXNobGltaXQuYwppbmRleCAxNzg2OTY4Li4yZmFiMGM2IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X2hhc2hsaW1pdC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0LmMKQEAgLTU2LDYgKzU2LDcgQEAKIH0KIAogLyogbmVlZCB0byBkZWNsYXJlIHRoaXMgYXQgdGhlIHRvcCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGxfZmlsZV9vcHNfdjE7CiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkbF9maWxlX29wczsKIAogLyogaGFzaCB0YWJsZSBjcmFwICovCkBAIC04Niw4ICs4Nyw4IEBACiAJdW5zaWduZWQgbG9uZyBleHBpcmVzOwkJLyogcHJlY2FsY3VsYXRlZCBleHBpcnkgdGltZSAqLwogCXN0cnVjdCB7CiAJCXVuc2lnbmVkIGxvbmcgcHJldjsJLyogbGFzdCBtb2RpZmljYXRpb24gKi8KLQkJdV9pbnQzMl90IGNyZWRpdDsKLQkJdV9pbnQzMl90IGNyZWRpdF9jYXAsIGNvc3Q7CisJCXVfaW50NjRfdCBjcmVkaXQ7CisJCXVfaW50NjRfdCBjcmVkaXRfY2FwLCBjb3N0OwogCX0gcmF0ZWluZm87CiAJc3RydWN0IHJjdV9oZWFkIHJjdTsKIH07CkBAIC05OCw3ICs5OSw3IEBACiAJdV9pbnQ4X3QgZmFtaWx5OwogCWJvb2wgcm5kX2luaXRpYWxpemVkOwogCi0Jc3RydWN0IGhhc2hsaW1pdF9jZmcxIGNmZzsJLyogY29uZmlnICovCisJc3RydWN0IGhhc2hsaW1pdF9jZmcyIGNmZzsJLyogY29uZmlnICovCiAKIAkvKiB1c2VkIGludGVybmFsbHkgKi8KIAlzcGlubG9ja190IGxvY2s7CQkvKiBsb2NrIGZvciBsaXN0X2hlYWQgKi8KQEAgLTExNCw2ICsxMTUsMzAgQEAKIAlzdHJ1Y3QgaGxpc3RfaGVhZCBoYXNoWzBdOwkvKiBoYXNodGFibGUgaXRzZWxmICovCiB9OwogCitzdGF0aWMgaW50CitjZmdfY29weShzdHJ1Y3QgaGFzaGxpbWl0X2NmZzIgKnRvLCB2b2lkICpmcm9tLCBpbnQgcmV2aXNpb24pCit7CisJaWYgKHJldmlzaW9uID09IDEpIHsKKwkJc3RydWN0IGhhc2hsaW1pdF9jZmcxICpjZmcgPSAoc3RydWN0IGhhc2hsaW1pdF9jZmcxICopZnJvbTsKKworCQl0by0+bW9kZSA9IGNmZy0+bW9kZTsKKwkJdG8tPmF2ZyA9IGNmZy0+YXZnOworCQl0by0+YnVyc3QgPSBjZmctPmJ1cnN0OworCQl0by0+c2l6ZSA9IGNmZy0+c2l6ZTsKKwkJdG8tPm1heCA9IGNmZy0+bWF4OworCQl0by0+Z2NfaW50ZXJ2YWwgPSBjZmctPmdjX2ludGVydmFsOworCQl0by0+ZXhwaXJlID0gY2ZnLT5leHBpcmU7CisJCXRvLT5zcmNtYXNrID0gY2ZnLT5zcmNtYXNrOworCQl0by0+ZHN0bWFzayA9IGNmZy0+ZHN0bWFzazsKKwl9IGVsc2UgaWYgKHJldmlzaW9uID09IDIpIHsKKwkJbWVtY3B5KHRvLCBmcm9tLCBzaXplb2Yoc3RydWN0IGhhc2hsaW1pdF9jZmcyKSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBERUZJTkVfTVVURVgoaGFzaGxpbWl0X211dGV4KTsJLyogcHJvdGVjdHMgaHRhYmxlcyBsaXN0ICovCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmhhc2hsaW1pdF9jYWNoZXAgX19yZWFkX21vc3RseTsKIApAQCAtMjE1LDE2ICsyNDAsMTggQEAKIH0KIHN0YXRpYyB2b2lkIGh0YWJsZV9nYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCi1zdGF0aWMgaW50IGh0YWJsZV9jcmVhdGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgeHRfaGFzaGxpbWl0X210aW5mbzEgKm1pbmZvLAotCQkJIHVfaW50OF90IGZhbWlseSkKK3N0YXRpYyBpbnQgaHRhYmxlX2NyZWF0ZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBoYXNobGltaXRfY2ZnMiAqY2ZnLAorCQkJIGNvbnN0IGNoYXIgKm5hbWUsIHVfaW50OF90IGZhbWlseSwKKwkJCSBzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqKm91dF9oaW5mbywKKwkJCSBpbnQgcmV2aXNpb24pCiB7CiAJc3RydWN0IGhhc2hsaW1pdF9uZXQgKmhhc2hsaW1pdF9uZXQgPSBoYXNobGltaXRfcGVybmV0KG5ldCk7CiAJc3RydWN0IHh0X2hhc2hsaW1pdF9odGFibGUgKmhpbmZvOwotCXVuc2lnbmVkIGludCBzaXplOwotCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCBzaXplLCBpOworCWludCByZXQ7CiAKLQlpZiAobWluZm8tPmNmZy5zaXplKSB7Ci0JCXNpemUgPSBtaW5mby0+Y2ZnLnNpemU7CisJaWYgKGNmZy0+c2l6ZSkgeworCQlzaXplID0gY2ZnLT5zaXplOwogCX0gZWxzZSB7CiAJCXNpemUgPSAodG90YWxyYW1fcGFnZXMgPDwgUEFHRV9TSElGVCkgLyAxNjM4NCAvCiAJCSAgICAgICBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCk7CkBAIC0yMzgsMTAgKzI2NSwxNCBAQAogCSAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkgKiBzaXplKTsKIAlpZiAoaGluZm8gPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWluZm8tPmhpbmZvID0gaGluZm87CisJKm91dF9oaW5mbyA9IGhpbmZvOwogCiAJLyogY29weSBtYXRjaCBjb25maWcgaW50byBoYXNodGFibGUgY29uZmlnICovCi0JbWVtY3B5KCZoaW5mby0+Y2ZnLCAmbWluZm8tPmNmZywgc2l6ZW9mKGhpbmZvLT5jZmcpKTsKKwlyZXQgPSBjZmdfY29weSgmaGluZm8tPmNmZywgKHZvaWQgKiljZmcsIDIpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCWhpbmZvLT5jZmcuc2l6ZSA9IHNpemU7CiAJaWYgKGhpbmZvLT5jZmcubWF4ID09IDApCiAJCWhpbmZvLT5jZmcubWF4ID0gOCAqIGhpbmZvLT5jZmcuc2l6ZTsKQEAgLTI1NSwxNyArMjg2LDE4IEBACiAJaGluZm8tPmNvdW50ID0gMDsKIAloaW5mby0+ZmFtaWx5ID0gZmFtaWx5OwogCWhpbmZvLT5ybmRfaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQloaW5mby0+bmFtZSA9IGtzdHJkdXAobWluZm8tPm5hbWUsIEdGUF9LRVJORUwpOworCWhpbmZvLT5uYW1lID0ga3N0cmR1cChuYW1lLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWhpbmZvLT5uYW1lKSB7CiAJCXZmcmVlKGhpbmZvKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXNwaW5fbG9ja19pbml0KCZoaW5mby0+bG9jayk7CiAKLQloaW5mby0+cGRlID0gcHJvY19jcmVhdGVfZGF0YShtaW5mby0+bmFtZSwgMCwKKwloaW5mby0+cGRlID0gcHJvY19jcmVhdGVfZGF0YShuYW1lLCAwLAogCQkoZmFtaWx5ID09IE5GUFJPVE9fSVBWNCkgPwogCQloYXNobGltaXRfbmV0LT5pcHRfaGFzaGxpbWl0IDogaGFzaGxpbWl0X25ldC0+aXA2dF9oYXNobGltaXQsCi0JCSZkbF9maWxlX29wcywgaGluZm8pOworCQkocmV2aXNpb24gPT0gMSkgPyAmZGxfZmlsZV9vcHNfdjEgOiAmZGxfZmlsZV9vcHMsCisJCWhpbmZvKTsKIAlpZiAoaGluZm8tPnBkZSA9PSBOVUxMKSB7CiAJCWtmcmVlKGhpbmZvLT5uYW1lKTsKIAkJdmZyZWUoaGluZm8pOwpAQCAtMzk4LDcgKzQzMCw4IEBACiAgICAoc2xvd2VzdCB1c2Vyc3BhY2UgdG9vbCBhbGxvd3MpLCB3aGljaCBtZWFucwogICAgQ1JFRElUU19QRVJfSklGRlkqSFoqNjAqNjAqMjQgPCAyXjMyIGllLgogKi8KLSNkZWZpbmUgTUFYX0NQSiAoMHhGRkZGRkZGRiAvIChIWio2MCo2MCoyNCkpCisjZGVmaW5lIE1BWF9DUEpfdjEgKDB4RkZGRkZGRkYgLyAoSFoqNjAqNjAqMjQpKQorI2RlZmluZSBNQVhfQ1BKICgweEZGRkZGRkZGRkZGRkZGRkYgLyAoSFoqNjAqNjAqMjQpKQogCiAvKiBSZXBlYXRlZCBzaGlmdCBhbmQgb3IgZ2l2ZXMgdXMgYWxsIDFzLCBmaW5hbCBzaGlmdCBhbmQgYWRkIDEgZ2l2ZXMKICAqIHVzIHRoZSBwb3dlciBvZiAyIGJlbG93IHRoZSB0aGVvcmV0aWNhbCBtYXgsIHNvIEdDQyBzaW1wbHkgZG9lcyBhCkBAIC00MDgsOSArNDQxLDEyIEBACiAjZGVmaW5lIF9QT1cyX0JFTE9XOCh4KSAoX1BPVzJfQkVMT1c0KHgpfF9QT1cyX0JFTE9XNCgoeCk+PjQpKQogI2RlZmluZSBfUE9XMl9CRUxPVzE2KHgpIChfUE9XMl9CRUxPVzgoeCl8X1BPVzJfQkVMT1c4KCh4KT4+OCkpCiAjZGVmaW5lIF9QT1cyX0JFTE9XMzIoeCkgKF9QT1cyX0JFTE9XMTYoeCl8X1BPVzJfQkVMT1cxNigoeCk+PjE2KSkKKyNkZWZpbmUgX1BPVzJfQkVMT1c2NCh4KSAoX1BPVzJfQkVMT1czMih4KXxfUE9XMl9CRUxPVzMyKCh4KT4+MzIpKQogI2RlZmluZSBQT1cyX0JFTE9XMzIoeCkgKChfUE9XMl9CRUxPVzMyKHgpPj4xKSArIDEpCisjZGVmaW5lIFBPVzJfQkVMT1c2NCh4KSAoKF9QT1cyX0JFTE9XNjQoeCk+PjEpICsgMSkKIAotI2RlZmluZSBDUkVESVRTX1BFUl9KSUZGWSBQT1cyX0JFTE9XMzIoTUFYX0NQSikKKyNkZWZpbmUgQ1JFRElUU19QRVJfSklGRlkgUE9XMl9CRUxPVzY0KE1BWF9DUEopCisjZGVmaW5lIENSRURJVFNfUEVSX0pJRkZZX3YxIFBPVzJfQkVMT1czMihNQVhfQ1BKX3YxKQogCiAvKiBpbiBieXRlIG1vZGUsIHRoZSBsb3dlc3QgcG9zc2libGUgcmF0ZSBpcyBvbmUgcGFja2V0L3NlY29uZC4KICAqIGNyZWRpdF9jYXAgaXMgdXNlZCBhcyBhIGNvdW50ZXIgdGhhdCB0ZWxscyB1cyBob3cgbWFueSB0aW1lcyB3ZSBjYW4KQEAgLTQyNSwxNCArNDYxLDI1IEBACiB9CiAKIC8qIFByZWNpc2lvbiBzYXZlci4gKi8KLXN0YXRpYyB1MzIgdXNlcjJjcmVkaXRzKHUzMiB1c2VyKQorc3RhdGljIHU2NCB1c2VyMmNyZWRpdHModTY0IHVzZXIsIGludCByZXZpc2lvbikKIHsKLQkvKiBJZiBtdWx0aXBseWluZyB3b3VsZCBvdmVyZmxvdy4uLiAqLwotCWlmICh1c2VyID4gMHhGRkZGRkZGRiAvIChIWipDUkVESVRTX1BFUl9KSUZGWSkpCi0JCS8qIERpdmlkZSBmaXJzdC4gKi8KLQkJcmV0dXJuICh1c2VyIC8gWFRfSEFTSExJTUlUX1NDQUxFKSAqIEhaICogQ1JFRElUU19QRVJfSklGRlk7CisJaWYgKHJldmlzaW9uID09IDEpIHsKKwkJLyogSWYgbXVsdGlwbHlpbmcgd291bGQgb3ZlcmZsb3cuLi4gKi8KKwkJaWYgKHVzZXIgPiAweEZGRkZGRkZGIC8gKEhaKkNSRURJVFNfUEVSX0pJRkZZX3YxKSkKKwkJCS8qIERpdmlkZSBmaXJzdC4gKi8KKwkJCXJldHVybiBkaXY2NF91NjQodXNlciwgWFRfSEFTSExJTUlUX1NDQUxFKQorCQkJCSogSFogKiBDUkVESVRTX1BFUl9KSUZGWV92MTsKIAotCXJldHVybiAodXNlciAqIEhaICogQ1JFRElUU19QRVJfSklGRlkpIC8gWFRfSEFTSExJTUlUX1NDQUxFOworCQlyZXR1cm4gZGl2NjRfdTY0KHVzZXIgKiBIWiAqIENSRURJVFNfUEVSX0pJRkZZX3YxLAorCQkJCSBYVF9IQVNITElNSVRfU0NBTEUpOworCX0gZWxzZSB7CisJCWlmICh1c2VyID4gMHhGRkZGRkZGRkZGRkZGRkZGIC8gKEhaKkNSRURJVFNfUEVSX0pJRkZZKSkKKwkJCXJldHVybiBkaXY2NF91NjQodXNlciwgWFRfSEFTSExJTUlUX1NDQUxFX3YyKQorCQkJCSogSFogKiBDUkVESVRTX1BFUl9KSUZGWTsKKworCQlyZXR1cm4gZGl2NjRfdTY0KHVzZXIgKiBIWiAqIENSRURJVFNfUEVSX0pJRkZZLAorCQkJCSBYVF9IQVNITElNSVRfU0NBTEVfdjIpOworCX0KIH0KIAogc3RhdGljIHUzMiB1c2VyMmNyZWRpdHNfYnl0ZSh1MzIgdXNlcikKQEAgLTQ0MiwxMCArNDg5LDExIEBACiAJcmV0dXJuICh1MzIpICh1cyA+PiAzMik7CiB9CiAKLXN0YXRpYyB2b2lkIHJhdGVpbmZvX3JlY2FsYyhzdHJ1Y3QgZHN0aGFzaF9lbnQgKmRoLCB1bnNpZ25lZCBsb25nIG5vdywgdTMyIG1vZGUpCitzdGF0aWMgdm9pZCByYXRlaW5mb19yZWNhbGMoc3RydWN0IGRzdGhhc2hfZW50ICpkaCwgdW5zaWduZWQgbG9uZyBub3csCisJCQkgICAgdTMyIG1vZGUsIGludCByZXZpc2lvbikKIHsKIAl1bnNpZ25lZCBsb25nIGRlbHRhID0gbm93IC0gZGgtPnJhdGVpbmZvLnByZXY7Ci0JdTMyIGNhcDsKKwl1NjQgY2FwLCBjcGo7CiAKIAlpZiAoZGVsdGEgPT0gMCkKIAkJcmV0dXJuOwpAQCAtNDUzLDcgKzUwMSw3IEBACiAJZGgtPnJhdGVpbmZvLnByZXYgPSBub3c7CiAKIAlpZiAobW9kZSAmIFhUX0hBU0hMSU1JVF9CWVRFUykgewotCQl1MzIgdG1wID0gZGgtPnJhdGVpbmZvLmNyZWRpdDsKKwkJdTY0IHRtcCA9IGRoLT5yYXRlaW5mby5jcmVkaXQ7CiAJCWRoLT5yYXRlaW5mby5jcmVkaXQgKz0gQ1JFRElUU19QRVJfSklGRllfQllURVMgKiBkZWx0YTsKIAkJY2FwID0gQ1JFRElUU19QRVJfSklGRllfQllURVMgKiBIWjsKIAkJaWYgKHRtcCA+PSBkaC0+cmF0ZWluZm8uY3JlZGl0KSB7Lyogb3ZlcmZsb3cgKi8KQEAgLTQ2MSw3ICs1MDksOSBAQAogCQkJcmV0dXJuOwogCQl9CiAJfSBlbHNlIHsKLQkJZGgtPnJhdGVpbmZvLmNyZWRpdCArPSBkZWx0YSAqIENSRURJVFNfUEVSX0pJRkZZOworCQljcGogPSAocmV2aXNpb24gPT0gMSkgPworCQkJQ1JFRElUU19QRVJfSklGRllfdjEgOiBDUkVESVRTX1BFUl9KSUZGWTsKKwkJZGgtPnJhdGVpbmZvLmNyZWRpdCArPSBkZWx0YSAqIGNwajsKIAkJY2FwID0gZGgtPnJhdGVpbmZvLmNyZWRpdF9jYXA7CiAJfQogCWlmIChkaC0+cmF0ZWluZm8uY3JlZGl0ID4gY2FwKQpAQCAtNDY5LDcgKzUxOSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIHJhdGVpbmZvX2luaXQoc3RydWN0IGRzdGhhc2hfZW50ICpkaCwKLQkJCSAgc3RydWN0IHh0X2hhc2hsaW1pdF9odGFibGUgKmhpbmZvKQorCQkJICBzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaGluZm8sIGludCByZXZpc2lvbikKIHsKIAlkaC0+cmF0ZWluZm8ucHJldiA9IGppZmZpZXM7CiAJaWYgKGhpbmZvLT5jZmcubW9kZSAmIFhUX0hBU0hMSU1JVF9CWVRFUykgewpAQCAtNDc4LDggKzUyOCw4IEBACiAJCWRoLT5yYXRlaW5mby5jcmVkaXRfY2FwID0gaGluZm8tPmNmZy5idXJzdDsKIAl9IGVsc2UgewogCQlkaC0+cmF0ZWluZm8uY3JlZGl0ID0gdXNlcjJjcmVkaXRzKGhpbmZvLT5jZmcuYXZnICoKLQkJCQkJCSAgIGhpbmZvLT5jZmcuYnVyc3QpOwotCQlkaC0+cmF0ZWluZm8uY29zdCA9IHVzZXIyY3JlZGl0cyhoaW5mby0+Y2ZnLmF2Zyk7CisJCQkJCQkgICBoaW5mby0+Y2ZnLmJ1cnN0LCByZXZpc2lvbik7CisJCWRoLT5yYXRlaW5mby5jb3N0ID0gdXNlcjJjcmVkaXRzKGhpbmZvLT5jZmcuYXZnLCByZXZpc2lvbik7CiAJCWRoLT5yYXRlaW5mby5jcmVkaXRfY2FwID0gZGgtPnJhdGVpbmZvLmNyZWRpdDsKIAl9CiB9CkBAIC02MDMsMTUgKzY1MywxNSBAQAogfQogCiBzdGF0aWMgYm9vbAotaGFzaGxpbWl0X210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhcikKK2hhc2hsaW1pdF9tdF9jb21tb24oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyLAorCQkgICAgc3RydWN0IHh0X2hhc2hsaW1pdF9odGFibGUgKmhpbmZvLAorCQkgICAgY29uc3Qgc3RydWN0IGhhc2hsaW1pdF9jZmcyICpjZmcsIGludCByZXZpc2lvbikKIHsKLQljb25zdCBzdHJ1Y3QgeHRfaGFzaGxpbWl0X210aW5mbzEgKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKLQlzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaGluZm8gPSBpbmZvLT5oaW5mbzsKIAl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CiAJc3RydWN0IGRzdGhhc2hfZW50ICpkaDsKIAlzdHJ1Y3QgZHN0aGFzaF9kc3QgZHN0OwogCWJvb2wgcmFjZSA9IGZhbHNlOwotCXUzMiBjb3N0OworCXU2NCBjb3N0OwogCiAJaWYgKGhhc2hsaW1pdF9pbml0X2RzdChoaW5mbywgJmRzdCwgc2tiLCBwYXItPnRob2ZmKSA8IDApCiAJCWdvdG8gaG90ZHJvcDsKQEAgLTYyNiwxOCArNjc2LDE4IEBACiAJCX0gZWxzZSBpZiAocmFjZSkgewogCQkJLyogQWxyZWFkeSBnb3QgYW4gZW50cnksIHVwZGF0ZSBleHBpcmF0aW9uIHRpbWVvdXQgKi8KIAkJCWRoLT5leHBpcmVzID0gbm93ICsgbXNlY3NfdG9famlmZmllcyhoaW5mby0+Y2ZnLmV4cGlyZSk7Ci0JCQlyYXRlaW5mb19yZWNhbGMoZGgsIG5vdywgaGluZm8tPmNmZy5tb2RlKTsKKwkJCXJhdGVpbmZvX3JlY2FsYyhkaCwgbm93LCBoaW5mby0+Y2ZnLm1vZGUsIHJldmlzaW9uKTsKIAkJfSBlbHNlIHsKIAkJCWRoLT5leHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoaGluZm8tPmNmZy5leHBpcmUpOwotCQkJcmF0ZWluZm9faW5pdChkaCwgaGluZm8pOworCQkJcmF0ZWluZm9faW5pdChkaCwgaGluZm8sIHJldmlzaW9uKTsKIAkJfQogCX0gZWxzZSB7CiAJCS8qIHVwZGF0ZSBleHBpcmF0aW9uIHRpbWVvdXQgKi8KIAkJZGgtPmV4cGlyZXMgPSBub3cgKyBtc2Vjc190b19qaWZmaWVzKGhpbmZvLT5jZmcuZXhwaXJlKTsKLQkJcmF0ZWluZm9fcmVjYWxjKGRoLCBub3csIGhpbmZvLT5jZmcubW9kZSk7CisJCXJhdGVpbmZvX3JlY2FsYyhkaCwgbm93LCBoaW5mby0+Y2ZnLm1vZGUsIHJldmlzaW9uKTsKIAl9CiAKLQlpZiAoaW5mby0+Y2ZnLm1vZGUgJiBYVF9IQVNITElNSVRfQllURVMpCisJaWYgKGNmZy0+bW9kZSAmIFhUX0hBU0hMSU1JVF9CWVRFUykKIAkJY29zdCA9IGhhc2hsaW1pdF9ieXRlX2Nvc3Qoc2tiLT5sZW4sIGRoKTsKIAllbHNlCiAJCWNvc3QgPSBkaC0+cmF0ZWluZm8uY29zdDsKQEAgLTY0Nyw3MyArNjk3LDEzNiBAQAogCQlkaC0+cmF0ZWluZm8uY3JlZGl0IC09IGNvc3Q7CiAJCXNwaW5fdW5sb2NrKCZkaC0+bG9jayk7CiAJCXJjdV9yZWFkX3VubG9ja19iaCgpOwotCQlyZXR1cm4gIShpbmZvLT5jZmcubW9kZSAmIFhUX0hBU0hMSU1JVF9JTlZFUlQpOworCQlyZXR1cm4gIShjZmctPm1vZGUgJiBYVF9IQVNITElNSVRfSU5WRVJUKTsKIAl9CiAKIAlzcGluX3VubG9jaygmZGgtPmxvY2spOwogCXJjdV9yZWFkX3VubG9ja19iaCgpOwogCS8qIGRlZmF1bHQgbWF0Y2ggaXMgdW5kZXJsaW1pdCAtIHNvIG92ZXIgdGhlIGxpbWl0LCB3ZSBuZWVkIHRvIGludmVydCAqLwotCXJldHVybiBpbmZvLT5jZmcubW9kZSAmIFhUX0hBU0hMSU1JVF9JTlZFUlQ7CisJcmV0dXJuIGNmZy0+bW9kZSAmIFhUX0hBU0hMSU1JVF9JTlZFUlQ7CiAKICBob3Rkcm9wOgogCXBhci0+aG90ZHJvcCA9IHRydWU7CiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgaW50IGhhc2hsaW1pdF9tdF9jaGVjayhjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhcikKK3N0YXRpYyBib29sCitoYXNobGltaXRfbXRfdjEoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKQogewotCXN0cnVjdCBuZXQgKm5ldCA9IHBhci0+bmV0OwotCXN0cnVjdCB4dF9oYXNobGltaXRfbXRpbmZvMSAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9oYXNobGltaXRfbXRpbmZvMSAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOworCXN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlICpoaW5mbyA9IGluZm8tPmhpbmZvOworCXN0cnVjdCBoYXNobGltaXRfY2ZnMiBjZmcgPSB7fTsKIAlpbnQgcmV0OwogCi0JaWYgKGluZm8tPmNmZy5nY19pbnRlcnZhbCA9PSAwIHx8IGluZm8tPmNmZy5leHBpcmUgPT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGluZm8tPm5hbWVbc2l6ZW9mKGluZm8tPm5hbWUpLTFdICE9ICdcMCcpCisJcmV0ID0gY2ZnX2NvcHkoJmNmZywgKHZvaWQgKikmaW5mby0+Y2ZnLCAxKTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gaGFzaGxpbWl0X210X2NvbW1vbihza2IsIHBhciwgaGluZm8sICZjZmcsIDEpOworfQorCitzdGF0aWMgYm9vbAoraGFzaGxpbWl0X210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhcikKK3sKKwljb25zdCBzdHJ1Y3QgeHRfaGFzaGxpbWl0X210aW5mbzIgKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKKwlzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaGluZm8gPSBpbmZvLT5oaW5mbzsKKworCXJldHVybiBoYXNobGltaXRfbXRfY29tbW9uKHNrYiwgcGFyLCBoaW5mbywgJmluZm8tPmNmZywgMik7Cit9CisKK3N0YXRpYyBpbnQgaGFzaGxpbWl0X210X2NoZWNrX2NvbW1vbihjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhciwKKwkJCQkgICAgIHN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlICoqaGluZm8sCisJCQkJICAgICBzdHJ1Y3QgaGFzaGxpbWl0X2NmZzIgKmNmZywKKwkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCByZXZpc2lvbikKK3sKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBwYXItPm5ldDsKKwlpbnQgcmV0OworCisJaWYgKGNmZy0+Z2NfaW50ZXJ2YWwgPT0gMCB8fCBjZmctPmV4cGlyZSA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAocGFyLT5mYW1pbHkgPT0gTkZQUk9UT19JUFY0KSB7Ci0JCWlmIChpbmZvLT5jZmcuc3JjbWFzayA+IDMyIHx8IGluZm8tPmNmZy5kc3RtYXNrID4gMzIpCisJCWlmIChjZmctPnNyY21hc2sgPiAzMiB8fCBjZmctPmRzdG1hc2sgPiAzMikKIAkJCXJldHVybiAtRUlOVkFMOwogCX0gZWxzZSB7Ci0JCWlmIChpbmZvLT5jZmcuc3JjbWFzayA+IDEyOCB8fCBpbmZvLT5jZmcuZHN0bWFzayA+IDEyOCkKKwkJaWYgKGNmZy0+c3JjbWFzayA+IDEyOCB8fCBjZmctPmRzdG1hc2sgPiAxMjgpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoaW5mby0+Y2ZnLm1vZGUgJiB+WFRfSEFTSExJTUlUX0FMTCkgeworCWlmIChjZmctPm1vZGUgJiB+WFRfSEFTSExJTUlUX0FMTCkgewogCQlwcl9pbmZvKCJVbmtub3duIG1vZGUgbWFzayAlWCwga2VybmVsIHRvbyBvbGQ/XG4iLAotCQkJCQkJaW5mby0+Y2ZnLm1vZGUpOworCQkJCQkJY2ZnLT5tb2RlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogQ2hlY2sgZm9yIG92ZXJmbG93LiAqLwotCWlmIChpbmZvLT5jZmcubW9kZSAmIFhUX0hBU0hMSU1JVF9CWVRFUykgewotCQlpZiAodXNlcjJjcmVkaXRzX2J5dGUoaW5mby0+Y2ZnLmF2ZykgPT0gMCkgewotCQkJcHJfaW5mbygib3ZlcmZsb3csIHJhdGUgdG9vIGhpZ2g6ICV1XG4iLCBpbmZvLT5jZmcuYXZnKTsKKwlpZiAoY2ZnLT5tb2RlICYgWFRfSEFTSExJTUlUX0JZVEVTKSB7CisJCWlmICh1c2VyMmNyZWRpdHNfYnl0ZShjZmctPmF2ZykgPT0gMCkgeworCQkJcHJfaW5mbygib3ZlcmZsb3csIHJhdGUgdG9vIGhpZ2g6ICVsbHVcbiIsIGNmZy0+YXZnKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JfSBlbHNlIGlmIChpbmZvLT5jZmcuYnVyc3QgPT0gMCB8fAotCQkgICAgdXNlcjJjcmVkaXRzKGluZm8tPmNmZy5hdmcgKiBpbmZvLT5jZmcuYnVyc3QpIDwKLQkJICAgIHVzZXIyY3JlZGl0cyhpbmZvLT5jZmcuYXZnKSkgewotCQkJcHJfaW5mbygib3ZlcmZsb3csIHRyeSBsb3dlcjogJXUvJXVcbiIsCi0JCQkJaW5mby0+Y2ZnLmF2ZywgaW5mby0+Y2ZnLmJ1cnN0KTsKKwl9IGVsc2UgaWYgKGNmZy0+YnVyc3QgPT0gMCB8fAorCQkgICAgdXNlcjJjcmVkaXRzKGNmZy0+YXZnICogY2ZnLT5idXJzdCwgcmV2aXNpb24pIDwKKwkJICAgIHVzZXIyY3JlZGl0cyhjZmctPmF2ZywgcmV2aXNpb24pKSB7CisJCQlwcl9pbmZvKCJvdmVyZmxvdywgdHJ5IGxvd2VyOiAlbGx1LyVsbHVcbiIsCisJCQkJY2ZnLT5hdmcsIGNmZy0+YnVyc3QpOwogCQkJcmV0dXJuIC1FUkFOR0U7CiAJfQogCiAJbXV0ZXhfbG9jaygmaGFzaGxpbWl0X211dGV4KTsKLQlpbmZvLT5oaW5mbyA9IGh0YWJsZV9maW5kX2dldChuZXQsIGluZm8tPm5hbWUsIHBhci0+ZmFtaWx5KTsKLQlpZiAoaW5mby0+aGluZm8gPT0gTlVMTCkgewotCQlyZXQgPSBodGFibGVfY3JlYXRlKG5ldCwgaW5mbywgcGFyLT5mYW1pbHkpOworCSpoaW5mbyA9IGh0YWJsZV9maW5kX2dldChuZXQsIG5hbWUsIHBhci0+ZmFtaWx5KTsKKwlpZiAoKmhpbmZvID09IE5VTEwpIHsKKwkJcmV0ID0gaHRhYmxlX2NyZWF0ZShuZXQsIGNmZywgbmFtZSwgcGFyLT5mYW1pbHksCisJCQkJICAgIGhpbmZvLCByZXZpc2lvbik7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQltdXRleF91bmxvY2soJmhhc2hsaW1pdF9tdXRleCk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQogCW11dGV4X3VubG9jaygmaGFzaGxpbWl0X211dGV4KTsKKwogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGhhc2hsaW1pdF9tdF9jaGVja192MShjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhcikKK3sKKwlzdHJ1Y3QgeHRfaGFzaGxpbWl0X210aW5mbzEgKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKKwlzdHJ1Y3QgaGFzaGxpbWl0X2NmZzIgY2ZnID0ge307CisJaW50IHJldDsKKworCWlmIChpbmZvLT5uYW1lW3NpemVvZihpbmZvLT5uYW1lKSAtIDFdICE9ICdcMCcpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gY2ZnX2NvcHkoJmNmZywgKHZvaWQgKikmaW5mby0+Y2ZnLCAxKTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gaGFzaGxpbWl0X210X2NoZWNrX2NvbW1vbihwYXIsICZpbmZvLT5oaW5mbywKKwkJCQkJICZjZmcsIGluZm8tPm5hbWUsIDEpOworfQorCitzdGF0aWMgaW50IGhhc2hsaW1pdF9tdF9jaGVjayhjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhcikKK3sKKwlzdHJ1Y3QgeHRfaGFzaGxpbWl0X210aW5mbzIgKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKKworCWlmIChpbmZvLT5uYW1lW3NpemVvZihpbmZvLT5uYW1lKSAtIDFdICE9ICdcMCcpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGhhc2hsaW1pdF9tdF9jaGVja19jb21tb24ocGFyLCAmaW5mby0+aGluZm8sICZpbmZvLT5jZmcsCisJCQkJCSBpbmZvLT5uYW1lLCAyKTsKK30KKworc3RhdGljIHZvaWQgaGFzaGxpbWl0X210X2Rlc3Ryb3lfdjEoY29uc3Qgc3RydWN0IHh0X210ZHRvcl9wYXJhbSAqcGFyKQoreworCWNvbnN0IHN0cnVjdCB4dF9oYXNobGltaXRfbXRpbmZvMSAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOworCisJaHRhYmxlX3B1dChpbmZvLT5oaW5mbyk7Cit9CisKIHN0YXRpYyB2b2lkIGhhc2hsaW1pdF9tdF9kZXN0cm95KGNvbnN0IHN0cnVjdCB4dF9tdGR0b3JfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgeHRfaGFzaGxpbWl0X210aW5mbzEgKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfaGFzaGxpbWl0X210aW5mbzIgKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAogCWh0YWJsZV9wdXQoaW5mby0+aGluZm8pOwogfQpAQCAtNzIzLDggKzgzNiwxOCBAQAogCQkubmFtZSAgICAgICAgICAgPSAiaGFzaGxpbWl0IiwKIAkJLnJldmlzaW9uICAgICAgID0gMSwKIAkJLmZhbWlseSAgICAgICAgID0gTkZQUk9UT19JUFY0LAotCQkubWF0Y2ggICAgICAgICAgPSBoYXNobGltaXRfbXQsCisJCS5tYXRjaCAgICAgICAgICA9IGhhc2hsaW1pdF9tdF92MSwKIAkJLm1hdGNoc2l6ZSAgICAgID0gc2l6ZW9mKHN0cnVjdCB4dF9oYXNobGltaXRfbXRpbmZvMSksCisJCS5jaGVja2VudHJ5ICAgICA9IGhhc2hsaW1pdF9tdF9jaGVja192MSwKKwkJLmRlc3Ryb3kgICAgICAgID0gaGFzaGxpbWl0X210X2Rlc3Ryb3lfdjEsCisJCS5tZSAgICAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCX0sCisJeworCQkubmFtZSAgICAgICAgICAgPSAiaGFzaGxpbWl0IiwKKwkJLnJldmlzaW9uICAgICAgID0gMiwKKwkJLmZhbWlseSAgICAgICAgID0gTkZQUk9UT19JUFY0LAorCQkubWF0Y2ggICAgICAgICAgPSBoYXNobGltaXRfbXQsCisJCS5tYXRjaHNpemUgICAgICA9IHNpemVvZihzdHJ1Y3QgeHRfaGFzaGxpbWl0X210aW5mbzIpLAogCQkuY2hlY2tlbnRyeSAgICAgPSBoYXNobGltaXRfbXRfY2hlY2ssCiAJCS5kZXN0cm95ICAgICAgICA9IGhhc2hsaW1pdF9tdF9kZXN0cm95LAogCQkubWUgICAgICAgICAgICAgPSBUSElTX01PRFVMRSwKQEAgLTczNCw4ICs4NTcsMTggQEAKIAkJLm5hbWUgICAgICAgICAgID0gImhhc2hsaW1pdCIsCiAJCS5yZXZpc2lvbiAgICAgICA9IDEsCiAJCS5mYW1pbHkgICAgICAgICA9IE5GUFJPVE9fSVBWNiwKLQkJLm1hdGNoICAgICAgICAgID0gaGFzaGxpbWl0X210LAorCQkubWF0Y2ggICAgICAgICAgPSBoYXNobGltaXRfbXRfdjEsCiAJCS5tYXRjaHNpemUgICAgICA9IHNpemVvZihzdHJ1Y3QgeHRfaGFzaGxpbWl0X210aW5mbzEpLAorCQkuY2hlY2tlbnRyeSAgICAgPSBoYXNobGltaXRfbXRfY2hlY2tfdjEsCisJCS5kZXN0cm95ICAgICAgICA9IGhhc2hsaW1pdF9tdF9kZXN0cm95X3YxLAorCQkubWUgICAgICAgICAgICAgPSBUSElTX01PRFVMRSwKKwl9LAorCXsKKwkJLm5hbWUgICAgICAgICAgID0gImhhc2hsaW1pdCIsCisJCS5yZXZpc2lvbiAgICAgICA9IDIsCisJCS5mYW1pbHkgICAgICAgICA9IE5GUFJPVE9fSVBWNiwKKwkJLm1hdGNoICAgICAgICAgID0gaGFzaGxpbWl0X210LAorCQkubWF0Y2hzaXplICAgICAgPSBzaXplb2Yoc3RydWN0IHh0X2hhc2hsaW1pdF9tdGluZm8yKSwKIAkJLmNoZWNrZW50cnkgICAgID0gaGFzaGxpbWl0X210X2NoZWNrLAogCQkuZGVzdHJveSAgICAgICAgPSBoYXNobGltaXRfbXRfZGVzdHJveSwKIAkJLm1lICAgICAgICAgICAgID0gVEhJU19NT0RVTEUsCkBAIC03ODYsMTggKzkxOSwxMiBAQAogCXNwaW5fdW5sb2NrX2JoKCZodGFibGUtPmxvY2spOwogfQogCi1zdGF0aWMgaW50IGRsX3NlcV9yZWFsX3Nob3coc3RydWN0IGRzdGhhc2hfZW50ICplbnQsIHVfaW50OF90IGZhbWlseSwKLQkJCQkgICBzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCitzdGF0aWMgdm9pZCBkbF9zZXFfcHJpbnQoc3RydWN0IGRzdGhhc2hfZW50ICplbnQsIHVfaW50OF90IGZhbWlseSwKKwkJCSBzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCiB7Ci0JY29uc3Qgc3RydWN0IHh0X2hhc2hsaW1pdF9odGFibGUgKmh0ID0gcy0+cHJpdmF0ZTsKLQotCXNwaW5fbG9jaygmZW50LT5sb2NrKTsKLQkvKiByZWNhbGN1bGF0ZSB0byBzaG93IGFjY3VyYXRlIG51bWJlcnMgKi8KLQlyYXRlaW5mb19yZWNhbGMoZW50LCBqaWZmaWVzLCBodC0+Y2ZnLm1vZGUpOwotCiAJc3dpdGNoIChmYW1pbHkpIHsKIAljYXNlIE5GUFJPVE9fSVBWNDoKLQkJc2VxX3ByaW50ZihzLCAiJWxkICVwSTQ6JXUtPiVwSTQ6JXUgJXUgJXUgJXVcbiIsCisJCXNlcV9wcmludGYocywgIiVsZCAlcEk0OiV1LT4lcEk0OiV1ICVsbHUgJWxsdSAlbGx1XG4iLAogCQkJICAgKGxvbmcpKGVudC0+ZXhwaXJlcyAtIGppZmZpZXMpL0haLAogCQkJICAgJmVudC0+ZHN0LmlwLnNyYywKIAkJCSAgIG50b2hzKGVudC0+ZHN0LnNyY19wb3J0KSwKQEAgLTgwOCw3ICs5MzUsNyBAQAogCQlicmVhazsKICNpZiBJU19FTkFCTEVEKENPTkZJR19JUDZfTkZfSVBUQUJMRVMpCiAJY2FzZSBORlBST1RPX0lQVjY6Ci0JCXNlcV9wcmludGYocywgIiVsZCAlcEk2OiV1LT4lcEk2OiV1ICV1ICV1ICV1XG4iLAorCQlzZXFfcHJpbnRmKHMsICIlbGQgJXBJNjoldS0+JXBJNjoldSAlbGx1ICVsbHUgJWxsdVxuIiwKIAkJCSAgIChsb25nKShlbnQtPmV4cGlyZXMgLSBqaWZmaWVzKS9IWiwKIAkJCSAgICZlbnQtPmRzdC5pcDYuc3JjLAogCQkJICAgbnRvaHMoZW50LT5kc3Quc3JjX3BvcnQpLApAQCAtODIxLDEwICs5NDgsNTIgQEAKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9Cit9CisKK3N0YXRpYyBpbnQgZGxfc2VxX3JlYWxfc2hvd192MShzdHJ1Y3QgZHN0aGFzaF9lbnQgKmVudCwgdV9pbnQ4X3QgZmFtaWx5LAorCQkJICAgICAgIHN0cnVjdCBzZXFfZmlsZSAqcykKK3sKKwljb25zdCBzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaHQgPSBzLT5wcml2YXRlOworCisJc3Bpbl9sb2NrKCZlbnQtPmxvY2spOworCS8qIHJlY2FsY3VsYXRlIHRvIHNob3cgYWNjdXJhdGUgbnVtYmVycyAqLworCXJhdGVpbmZvX3JlY2FsYyhlbnQsIGppZmZpZXMsIGh0LT5jZmcubW9kZSwgMSk7CisKKwlkbF9zZXFfcHJpbnQoZW50LCBmYW1pbHksIHMpOworCiAJc3Bpbl91bmxvY2soJmVudC0+bG9jayk7CiAJcmV0dXJuIHNlcV9oYXNfb3ZlcmZsb3dlZChzKTsKIH0KIAorc3RhdGljIGludCBkbF9zZXFfcmVhbF9zaG93KHN0cnVjdCBkc3RoYXNoX2VudCAqZW50LCB1X2ludDhfdCBmYW1pbHksCisJCQkgICAgc3RydWN0IHNlcV9maWxlICpzKQoreworCWNvbnN0IHN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlICpodCA9IHMtPnByaXZhdGU7CisKKwlzcGluX2xvY2soJmVudC0+bG9jayk7CisJLyogcmVjYWxjdWxhdGUgdG8gc2hvdyBhY2N1cmF0ZSBudW1iZXJzICovCisJcmF0ZWluZm9fcmVjYWxjKGVudCwgamlmZmllcywgaHQtPmNmZy5tb2RlLCAyKTsKKworCWRsX3NlcV9wcmludChlbnQsIGZhbWlseSwgcyk7CisKKwlzcGluX3VubG9jaygmZW50LT5sb2NrKTsKKwlyZXR1cm4gc2VxX2hhc19vdmVyZmxvd2VkKHMpOworfQorCitzdGF0aWMgaW50IGRsX3NlcV9zaG93X3YxKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaHRhYmxlID0gcy0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgKmJ1Y2tldCA9ICh1bnNpZ25lZCBpbnQgKil2OworCXN0cnVjdCBkc3RoYXNoX2VudCAqZW50OworCisJaWYgKCFobGlzdF9lbXB0eSgmaHRhYmxlLT5oYXNoWypidWNrZXRdKSkgeworCQlobGlzdF9mb3JfZWFjaF9lbnRyeShlbnQsICZodGFibGUtPmhhc2hbKmJ1Y2tldF0sIG5vZGUpCisJCQlpZiAoZGxfc2VxX3JlYWxfc2hvd192MShlbnQsIGh0YWJsZS0+ZmFtaWx5LCBzKSkKKwkJCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGRsX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKIHsKIAlzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaHRhYmxlID0gcy0+cHJpdmF0ZTsKQEAgLTgzOSw2ICsxMDA4LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZGxfc2VxX29wc192MSA9IHsKKwkuc3RhcnQgPSBkbF9zZXFfc3RhcnQsCisJLm5leHQgID0gZGxfc2VxX25leHQsCisJLnN0b3AgID0gZGxfc2VxX3N0b3AsCisJLnNob3cgID0gZGxfc2VxX3Nob3dfdjEKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZGxfc2VxX29wcyA9IHsKIAkuc3RhcnQgPSBkbF9zZXFfc3RhcnQsCiAJLm5leHQgID0gZGxfc2VxX25leHQsCkBAIC04NDYsOSArMTAyMiw5IEBACiAJLnNob3cgID0gZGxfc2VxX3Nob3cKIH07CiAKLXN0YXRpYyBpbnQgZGxfcHJvY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQorc3RhdGljIGludCBkbF9wcm9jX29wZW5fdjEoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JaW50IHJldCA9IHNlcV9vcGVuKGZpbGUsICZkbF9zZXFfb3BzKTsKKwlpbnQgcmV0ID0gc2VxX29wZW4oZmlsZSwgJmRsX3NlcV9vcHNfdjEpOwogCiAJaWYgKCFyZXQpIHsKIAkJc3RydWN0IHNlcV9maWxlICpzZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKQEAgLTg1Nyw2ICsxMDMzLDI2IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBkbF9wcm9jX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJldCA9IHNlcV9vcGVuKGZpbGUsICZkbF9zZXFfb3BzKTsKKworCWlmICghcmV0KSB7CisJCXN0cnVjdCBzZXFfZmlsZSAqc2YgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwkJc2YtPnByaXZhdGUgPSBQREVfREFUQShpbm9kZSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRsX2ZpbGVfb3BzX3YxID0geworCS5vd25lciAgID0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgPSBkbF9wcm9jX29wZW5fdjEsCisJLnJlYWQgICAgPSBzZXFfcmVhZCwKKwkubGxzZWVrICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkbF9maWxlX29wcyA9IHsKIAkub3duZXIgICA9IFRISVNfTU9EVUxFLAogCS5vcGVuICAgID0gZGxfcHJvY19vcGVuLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9oZWxwZXIuYyBiL25ldC9uZXRmaWx0ZXIveHRfaGVscGVyLmMKaW5kZXggOWY0YWIwMC4uZjY3OWRkNCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9oZWxwZXIuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2hlbHBlci5jCkBAIC00MSw3ICs0MSw3IEBACiAJaWYgKCFtYXN0ZXJfaGVscCkKIAkJcmV0dXJuIHJldDsKIAotCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfc2xvdyAqLworCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfdGhyZXNoICovCiAJaGVscGVyID0gcmN1X2RlcmVmZXJlbmNlKG1hc3Rlcl9oZWxwLT5oZWxwZXIpOwogCWlmICghaGVscGVyKQogCQlyZXR1cm4gcmV0OwpAQCAtNjUsNyArNjUsNyBAQAogCQkJcGFyLT5mYW1pbHkpOwogCQlyZXR1cm4gcmV0OwogCX0KLQlpbmZvLT5uYW1lWzI5XSA9ICdcMCc7CisJaW5mby0+bmFtZVtzaXplb2YoaW5mby0+bmFtZSkgLSAxXSA9ICdcMCc7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfbmZhY2N0LmMgYi9uZXQvbmV0ZmlsdGVyL3h0X25mYWNjdC5jCmluZGV4IDMwNDhhN2UuLmNmMzI3NTkgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfbmZhY2N0LmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9uZmFjY3QuYwpAQCAtMjYsNyArMjYsNyBAQAogCiAJbmZubF9hY2N0X3VwZGF0ZShza2IsIGluZm8tPm5mYWNjdCk7CiAKLQlvdmVycXVvdGEgPSBuZm5sX2FjY3Rfb3ZlcnF1b3RhKHNrYiwgaW5mby0+bmZhY2N0KTsKKwlvdmVycXVvdGEgPSBuZm5sX2FjY3Rfb3ZlcnF1b3RhKHBhci0+bmV0LCBza2IsIGluZm8tPm5mYWNjdCk7CiAKIAlyZXR1cm4gb3ZlcnF1b3RhID09IE5GQUNDVF9VTkRFUlFVT1RBID8gZmFsc2UgOiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9waHlzZGV2LmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3BoeXNkZXYuYwppbmRleCBlNWYxODk4Li5iYjMzNTk4IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X3BoeXNkZXYuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3BoeXNkZXYuYwpAQCAtMTA3LDggKzEwNyw4IEBACiAJICAgICBpbmZvLT5pbnZlcnQgJiBYVF9QSFlTREVWX09QX0JSSURHRUQpICYmCiAJICAgIHBhci0+aG9va19tYXNrICYgKCgxIDw8IE5GX0lORVRfTE9DQUxfT1VUKSB8CiAJICAgICgxIDw8IE5GX0lORVRfRk9SV0FSRCkgfCAoMSA8PCBORl9JTkVUX1BPU1RfUk9VVElORykpKSB7Ci0JCXByX2luZm8oInVzaW5nIC0tcGh5c2Rldi1vdXQgYW5kIC0tcGh5c2Rldi1pcy1vdXQgYXJlIG9ubHkiCi0JCQkic3VwcG9ydGVkIGluIHRoZSBGT1JXQVJEIGFuZCBQT1NUUk9VVElORyBjaGFpbnMgd2l0aCIKKwkJcHJfaW5mbygidXNpbmcgLS1waHlzZGV2LW91dCBhbmQgLS1waHlzZGV2LWlzLW91dCBhcmUgb25seSAiCisJCQkic3VwcG9ydGVkIGluIHRoZSBGT1JXQVJEIGFuZCBQT1NUUk9VVElORyBjaGFpbnMgd2l0aCAiCiAJCQkiYnJpZGdlZCB0cmFmZmljLlxuIik7CiAJCWlmIChwYXItPmhvb2tfbWFzayAmICgxIDw8IE5GX0lORVRfTE9DQUxfT1VUKSkKIAkJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9yZWNlbnQuYyBiL25ldC9uZXRmaWx0ZXIveHRfcmVjZW50LmMKaW5kZXggZDcyNWEyNy4uZTNiN2EwOSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9yZWNlbnQuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3JlY2VudC5jCkBAIC0xMTAsNyArMTEwLDYgQEAKICNlbmRpZgogCiBzdGF0aWMgdV9pbnQzMl90IGhhc2hfcm5kIF9fcmVhZF9tb3N0bHk7Ci1zdGF0aWMgYm9vbCBoYXNoX3JuZF9pbml0ZWQgX19yZWFkX21vc3RseTsKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcmVjZW50X2VudHJ5X2hhc2g0KGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqYWRkcikKIHsKQEAgLTM0MCwxMCArMzM5LDggQEAKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAlzaXplX3Qgc3o7CiAKLQlpZiAodW5saWtlbHkoIWhhc2hfcm5kX2luaXRlZCkpIHsKLQkJZ2V0X3JhbmRvbV9ieXRlcygmaGFzaF9ybmQsIHNpemVvZihoYXNoX3JuZCkpOwotCQloYXNoX3JuZF9pbml0ZWQgPSB0cnVlOwotCX0KKwluZXRfZ2V0X3JhbmRvbV9vbmNlKCZoYXNoX3JuZCwgc2l6ZW9mKGhhc2hfcm5kKSk7CisKIAlpZiAoaW5mby0+Y2hlY2tfc2V0ICYgflhUX1JFQ0VOVF9WQUxJRF9GTEFHUykgewogCQlwcl9pbmZvKCJVbnN1cHBvcnRlZCB1c2VyIHNwYWNlIGZsYWdzICglMDh4KVxuIiwKIAkJCWluZm8tPmNoZWNrX3NldCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3NjdHAuYyBiL25ldC9uZXRmaWx0ZXIveHRfc2N0cC5jCmluZGV4IGVmMzZhNTYuLjRkZWRiOTYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfc2N0cC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfc2N0cC5jCkBAIC02OCw3ICs2OCw3IEBACiAJCQkgKytpLCBvZmZzZXQsIHNjaC0+dHlwZSwgaHRvbnMoc2NoLT5sZW5ndGgpLAogCQkJIHNjaC0+ZmxhZ3MpOwogI2VuZGlmCi0JCW9mZnNldCArPSBXT1JEX1JPVU5EKG50b2hzKHNjaC0+bGVuZ3RoKSk7CisJCW9mZnNldCArPSBTQ1RQX1BBRDQobnRvaHMoc2NoLT5sZW5ndGgpKTsKIAogCQlwcl9kZWJ1Zygic2tiLT5sZW46ICVkXHRvZmZzZXQ6ICVkXG4iLCBza2ItPmxlbiwgb2Zmc2V0KTsKIApkaWZmIC0tZ2l0IGEvbmV0L25ldGxpbmsvZGlhZy5jIGIvbmV0L25ldGxpbmsvZGlhZy5jCmluZGV4IDhkZDgzNmEuLmIyZjBlOTggMTAwNjQ0Ci0tLSBhL25ldC9uZXRsaW5rL2RpYWcuYworKysgYi9uZXQvbmV0bGluay9kaWFnLmMKQEAgLTYzLDQzICs2Myw3NCBAQAogc3RhdGljIGludCBfX25ldGxpbmtfZGlhZ19kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKIAkJCQlpbnQgcHJvdG9jb2wsIGludCBzX251bSkKIHsKKwlzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyICpodGkgPSAodm9pZCAqKWNiLT5hcmdzWzJdOwogCXN0cnVjdCBuZXRsaW5rX3RhYmxlICp0YmwgPSAmbmxfdGFibGVbcHJvdG9jb2xdOwotCXN0cnVjdCByaGFzaHRhYmxlICpodCA9ICZ0YmwtPmhhc2g7Ci0JY29uc3Qgc3RydWN0IGJ1Y2tldF90YWJsZSAqaHRibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UoaHQtPnRibCwgaHQpOwogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrYi0+c2spOwogCXN0cnVjdCBuZXRsaW5rX2RpYWdfcmVxICpyZXE7CiAJc3RydWN0IG5ldGxpbmtfc29jayAqbmxzazsKIAlzdHJ1Y3Qgc29jayAqc2s7Ci0JaW50IHJldCA9IDAsIG51bSA9IDAsIGk7CisJaW50IG51bSA9IDI7CisJaW50IHJldCA9IDA7CiAKIAlyZXEgPSBubG1zZ19kYXRhKGNiLT5ubGgpOwogCi0JZm9yIChpID0gMDsgaSA8IGh0YmwtPnNpemU7IGkrKykgewotCQlzdHJ1Y3Qgcmhhc2hfaGVhZCAqcG9zOworCWlmIChzX251bSA+IDEpCisJCWdvdG8gbWNfbGlzdDsKIAotCQlyaHRfZm9yX2VhY2hfZW50cnlfcmN1KG5sc2ssIHBvcywgaHRibCwgaSwgbm9kZSkgewotCQkJc2sgPSAoc3RydWN0IHNvY2sgKilubHNrOworCW51bS0tOwogCi0JCQlpZiAoIW5ldF9lcShzb2NrX25ldChzayksIG5ldCkpCi0JCQkJY29udGludWU7Ci0JCQlpZiAobnVtIDwgc19udW0pIHsKLQkJCQludW0rKzsKKwlpZiAoIWh0aSkgeworCQlodGkgPSBrbWFsbG9jKHNpemVvZigqaHRpKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaHRpKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJY2ItPmFyZ3NbMl0gPSAobG9uZylodGk7CisJfQorCisJaWYgKCFzX251bSkKKwkJcmhhc2h0YWJsZV93YWxrX2VudGVyKCZ0YmwtPmhhc2gsIGh0aSk7CisKKwlyZXQgPSByaGFzaHRhYmxlX3dhbGtfc3RhcnQoaHRpKTsKKwlpZiAocmV0ID09IC1FQUdBSU4pCisJCXJldCA9IDA7CisJaWYgKHJldCkKKwkJZ290byBzdG9wOworCisJd2hpbGUgKChubHNrID0gcmhhc2h0YWJsZV93YWxrX25leHQoaHRpKSkpIHsKKwkJaWYgKElTX0VSUihubHNrKSkgeworCQkJcmV0ID0gUFRSX0VSUihubHNrKTsKKwkJCWlmIChyZXQgPT0gLUVBR0FJTikgeworCQkJCXJldCA9IDA7CiAJCQkJY29udGludWU7CiAJCQl9CisJCQlicmVhazsKKwkJfQogCi0JCQlpZiAoc2tfZGlhZ19maWxsKHNrLCBza2IsIHJlcSwKLQkJCQkJIE5FVExJTktfQ0IoY2ItPnNrYikucG9ydGlkLAotCQkJCQkgY2ItPm5saC0+bmxtc2dfc2VxLAotCQkJCQkgTkxNX0ZfTVVMVEksCi0JCQkJCSBzb2NrX2lfaW5vKHNrKSkgPCAwKSB7Ci0JCQkJcmV0ID0gMTsKLQkJCQlnb3RvIGRvbmU7Ci0JCQl9CisJCXNrID0gKHN0cnVjdCBzb2NrICopbmxzazsKIAotCQkJbnVtKys7CisJCWlmICghbmV0X2VxKHNvY2tfbmV0KHNrKSwgbmV0KSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChza19kaWFnX2ZpbGwoc2ssIHNrYiwgcmVxLAorCQkJCSBORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZCwKKwkJCQkgY2ItPm5saC0+bmxtc2dfc2VxLAorCQkJCSBOTE1fRl9NVUxUSSwKKwkJCQkgc29ja19pX2lubyhzaykpIDwgMCkgeworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOwogCQl9CiAJfQogCitzdG9wOgorCXJoYXNodGFibGVfd2Fsa19zdG9wKGh0aSk7CisJaWYgKHJldCkKKwkJZ290byBkb25lOworCisJcmhhc2h0YWJsZV93YWxrX2V4aXQoaHRpKTsKKwludW0rKzsKKworbWNfbGlzdDoKKwlyZWFkX2xvY2soJm5sX3RhYmxlX2xvY2spOwogCXNrX2Zvcl9lYWNoX2JvdW5kKHNrLCAmdGJsLT5tY19saXN0KSB7CiAJCWlmIChza19oYXNoZWQoc2spKQogCQkJY29udGludWU7CkBAIC0xMTYsMTMgKzE0NywxNCBAQAogCQkJCSBOTE1fRl9NVUxUSSwKIAkJCQkgc29ja19pX2lubyhzaykpIDwgMCkgewogCQkJcmV0ID0gMTsKLQkJCWdvdG8gZG9uZTsKKwkJCWJyZWFrOwogCQl9CiAJCW51bSsrOwogCX0KKwlyZWFkX3VubG9jaygmbmxfdGFibGVfbG9jayk7CisKIGRvbmU6CiAJY2ItPmFyZ3NbMF0gPSBudW07Ci0JY2ItPmFyZ3NbMV0gPSBwcm90b2NvbDsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xMzEsMjAgKzE2MywyMCBAQAogewogCXN0cnVjdCBuZXRsaW5rX2RpYWdfcmVxICpyZXE7CiAJaW50IHNfbnVtID0gY2ItPmFyZ3NbMF07CisJaW50IGVyciA9IDA7CiAKIAlyZXEgPSBubG1zZ19kYXRhKGNiLT5ubGgpOwogCi0JcmN1X3JlYWRfbG9jaygpOwotCXJlYWRfbG9jaygmbmxfdGFibGVfbG9jayk7Ci0KIAlpZiAocmVxLT5zZGlhZ19wcm90b2NvbCA9PSBORElBR19QUk9UT19BTEwpIHsKIAkJaW50IGk7CiAKIAkJZm9yIChpID0gY2ItPmFyZ3NbMV07IGkgPCBNQVhfTElOS1M7IGkrKykgewotCQkJaWYgKF9fbmV0bGlua19kaWFnX2R1bXAoc2tiLCBjYiwgaSwgc19udW0pKQorCQkJZXJyID0gX19uZXRsaW5rX2RpYWdfZHVtcChza2IsIGNiLCBpLCBzX251bSk7CisJCQlpZiAoZXJyKQogCQkJCWJyZWFrOwogCQkJc19udW0gPSAwOwogCQl9CisJCWNiLT5hcmdzWzFdID0gaTsKIAl9IGVsc2UgewogCQlpZiAocmVxLT5zZGlhZ19wcm90b2NvbCA+PSBNQVhfTElOS1MpIHsKIAkJCXJlYWRfdW5sb2NrKCZubF90YWJsZV9sb2NrKTsKQEAgLTE1MiwxMyArMTg0LDIyIEBACiAJCQlyZXR1cm4gLUVOT0VOVDsKIAkJfQogCi0JCV9fbmV0bGlua19kaWFnX2R1bXAoc2tiLCBjYiwgcmVxLT5zZGlhZ19wcm90b2NvbCwgc19udW0pOworCQllcnIgPSBfX25ldGxpbmtfZGlhZ19kdW1wKHNrYiwgY2IsIHJlcS0+c2RpYWdfcHJvdG9jb2wsIHNfbnVtKTsKIAl9CiAKLQlyZWFkX3VubG9jaygmbmxfdGFibGVfbG9jayk7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIGVyciA8IDAgPyBlcnIgOiBza2ItPmxlbjsKK30KIAotCXJldHVybiBza2ItPmxlbjsKK3N0YXRpYyBpbnQgbmV0bGlua19kaWFnX2R1bXBfZG9uZShzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJc3RydWN0IHJoYXNodGFibGVfaXRlciAqaHRpID0gKHZvaWQgKiljYi0+YXJnc1syXTsKKworCWlmIChjYi0+YXJnc1swXSA9PSAxKQorCQlyaGFzaHRhYmxlX3dhbGtfZXhpdChodGkpOworCisJa2ZyZWUoaHRpKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG5ldGxpbmtfZGlhZ19oYW5kbGVyX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpoKQpAQCAtMTcyLDYgKzIxMyw3IEBACiAJaWYgKGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfRFVNUCkgewogCQlzdHJ1Y3QgbmV0bGlua19kdW1wX2NvbnRyb2wgYyA9IHsKIAkJCS5kdW1wID0gbmV0bGlua19kaWFnX2R1bXAsCisJCQkuZG9uZSA9IG5ldGxpbmtfZGlhZ19kdW1wX2RvbmUsCiAJCX07CiAJCXJldHVybiBuZXRsaW5rX2R1bXBfc3RhcnQobmV0LT5kaWFnX25sc2ssIHNrYiwgaCwgJmMpOwogCX0gZWxzZQpkaWZmIC0tZ2l0IGEvbmV0L25ldGxpbmsvZ2VuZXRsaW5rLmMgYi9uZXQvbmV0bGluay9nZW5ldGxpbmsuYwppbmRleCBhMDkxMzJhLi4yM2NjMTI2IDEwMDY0NAotLS0gYS9uZXQvbmV0bGluay9nZW5ldGxpbmsuYworKysgYi9uZXQvbmV0bGluay9nZW5ldGxpbmsuYwpAQCAtOTc3LDcgKzk3Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ2VubF9vcHMgZ2VubF9jdHJsX29wc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBnZW5sX29wcyBnZW5sX2N0cmxfb3BzW10gPSB7CiAJewogCQkuY21kCQk9IENUUkxfQ01EX0dFVEZBTUlMWSwKIAkJLmRvaXQJCT0gY3RybF9nZXRmYW1pbHksCkBAIC05ODYsNyArOTg2LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBnZW5sX211bHRpY2FzdF9ncm91cCBnZW5sX2N0cmxfZ3JvdXBzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdlbmxfbXVsdGljYXN0X2dyb3VwIGdlbmxfY3RybF9ncm91cHNbXSA9IHsKIAl7IC5uYW1lID0gIm5vdGlmeSIsIH0sCiB9OwogCmRpZmYgLS1naXQgYS9uZXQvb3BlbnZzd2l0Y2gvYWN0aW9ucy5jIGIvbmV0L29wZW52c3dpdGNoL2FjdGlvbnMuYwppbmRleCAxZWNiZDc3Li40ZTAzZjY0IDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvYWN0aW9ucy5jCisrKyBiL25ldC9vcGVudnN3aXRjaC9hY3Rpb25zLmMKQEAgLTcxLDYgKzcxLDggQEAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgb3ZzX2ZyYWdfZGF0YSwgb3ZzX2ZyYWdfZGF0YV9zdG9yYWdlKTsKIAogI2RlZmluZSBERUZFUlJFRF9BQ1RJT05fRklGT19TSVpFIDEwCisjZGVmaW5lIE9WU19SRUNVUlNJT05fTElNSVQgNQorI2RlZmluZSBPVlNfREVGRVJSRURfQUNUSU9OX1RIUkVTSE9MRCAoT1ZTX1JFQ1VSU0lPTl9MSU1JVCAtIDIpCiBzdHJ1Y3QgYWN0aW9uX2ZpZm8gewogCWludCBoZWFkOwogCWludCB0YWlsOwpAQCAtNzgsNyArODAsMTIgQEAKIAlzdHJ1Y3QgZGVmZXJyZWRfYWN0aW9uIGZpZm9bREVGRVJSRURfQUNUSU9OX0ZJRk9fU0laRV07CiB9OwogCitzdHJ1Y3QgcmVjaXJjX2tleXMgeworCXN0cnVjdCBzd19mbG93X2tleSBrZXlbT1ZTX0RFRkVSUkVEX0FDVElPTl9USFJFU0hPTERdOworfTsKKwogc3RhdGljIHN0cnVjdCBhY3Rpb25fZmlmbyBfX3BlcmNwdSAqYWN0aW9uX2ZpZm9zOworc3RhdGljIHN0cnVjdCByZWNpcmNfa2V5cyBfX3BlcmNwdSAqcmVjaXJjX2tleXM7CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBleGVjX2FjdGlvbnNfbGV2ZWwpOwogCiBzdGF0aWMgdm9pZCBhY3Rpb25fZmlmb19pbml0KHN0cnVjdCBhY3Rpb25fZmlmbyAqZmlmbykKQEAgLTE1Myw3ICsxNjAsNyBAQAogc3RhdGljIGludCBwdXNoX21wbHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksCiAJCSAgICAgY29uc3Qgc3RydWN0IG92c19hY3Rpb25fcHVzaF9tcGxzICptcGxzKQogewotCV9fYmUzMiAqbmV3X21wbHNfbHNlOworCXN0cnVjdCBtcGxzX3NoaW1faGRyICpuZXdfbXBsc19sc2U7CiAKIAkvKiBOZXR3b3JraW5nIHN0YWNrIGRvIG5vdCBhbGxvdyBzaW11bHRhbmVvdXMgVHVubmVsIGFuZCBNUExTIEdTTy4gKi8KIAlpZiAoc2tiLT5lbmNhcHN1bGF0aW9uKQpAQCAtMTYyLDE5ICsxNjksMjMgQEAKIAlpZiAoc2tiX2Nvd19oZWFkKHNrYiwgTVBMU19ITEVOKSA8IDApCiAJCXJldHVybiAtRU5PTUVNOwogCisJaWYgKCFza2ItPmlubmVyX3Byb3RvY29sKSB7CisJCXNrYl9zZXRfaW5uZXJfbmV0d29ya19oZWFkZXIoc2tiLCBza2ItPm1hY19sZW4pOworCQlza2Jfc2V0X2lubmVyX3Byb3RvY29sKHNrYiwgc2tiLT5wcm90b2NvbCk7CisJfQorCiAJc2tiX3B1c2goc2tiLCBNUExTX0hMRU4pOwogCW1lbW1vdmUoc2tiX21hY19oZWFkZXIoc2tiKSAtIE1QTFNfSExFTiwgc2tiX21hY19oZWFkZXIoc2tiKSwKIAkJc2tiLT5tYWNfbGVuKTsKIAlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworCXNrYl9zZXRfbmV0d29ya19oZWFkZXIoc2tiLCBza2ItPm1hY19sZW4pOwogCi0JbmV3X21wbHNfbHNlID0gKF9fYmUzMiAqKXNrYl9tcGxzX2hlYWRlcihza2IpOwotCSpuZXdfbXBsc19sc2UgPSBtcGxzLT5tcGxzX2xzZTsKKwluZXdfbXBsc19sc2UgPSBtcGxzX2hkcihza2IpOworCW5ld19tcGxzX2xzZS0+bGFiZWxfc3RhY2tfZW50cnkgPSBtcGxzLT5tcGxzX2xzZTsKIAogCXNrYl9wb3N0cHVzaF9yY3N1bShza2IsIG5ld19tcGxzX2xzZSwgTVBMU19ITEVOKTsKIAogCXVwZGF0ZV9ldGhlcnR5cGUoc2tiLCBldGhfaGRyKHNrYiksIG1wbHMtPm1wbHNfZXRoZXJ0eXBlKTsKLQlpZiAoIXNrYi0+aW5uZXJfcHJvdG9jb2wpCi0JCXNrYl9zZXRfaW5uZXJfcHJvdG9jb2woc2tiLCBza2ItPnByb3RvY29sKTsKIAlza2ItPnByb3RvY29sID0gbXBscy0+bXBsc19ldGhlcnR5cGU7CiAKIAlpbnZhbGlkYXRlX2Zsb3dfa2V5KGtleSk7CkBAIC0xOTEsMTggKzIwMiwxOSBAQAogCWlmICh1bmxpa2VseShlcnIpKQogCQlyZXR1cm4gZXJyOwogCi0Jc2tiX3Bvc3RwdWxsX3Jjc3VtKHNrYiwgc2tiX21wbHNfaGVhZGVyKHNrYiksIE1QTFNfSExFTik7CisJc2tiX3Bvc3RwdWxsX3Jjc3VtKHNrYiwgbXBsc19oZHIoc2tiKSwgTVBMU19ITEVOKTsKIAogCW1lbW1vdmUoc2tiX21hY19oZWFkZXIoc2tiKSArIE1QTFNfSExFTiwgc2tiX21hY19oZWFkZXIoc2tiKSwKIAkJc2tiLT5tYWNfbGVuKTsKIAogCV9fc2tiX3B1bGwoc2tiLCBNUExTX0hMRU4pOwogCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CisJc2tiX3NldF9uZXR3b3JrX2hlYWRlcihza2IsIHNrYi0+bWFjX2xlbik7CiAKLQkvKiBza2JfbXBsc19oZWFkZXIoKSBpcyB1c2VkIHRvIGxvY2F0ZSB0aGUgZXRoZXJ0eXBlCi0JICogZmllbGQgY29ycmVjdGx5IGluIHRoZSBwcmVzZW5jZSBvZiBWTEFOIHRhZ3MuCisJLyogbXBsc19oZHIoKSBpcyB1c2VkIHRvIGxvY2F0ZSB0aGUgZXRoZXJ0eXBlIGZpZWxkIGNvcnJlY3RseSBpbiB0aGUKKwkgKiBwcmVzZW5jZSBvZiBWTEFOIHRhZ3MuCiAJICovCi0JaGRyID0gKHN0cnVjdCBldGhoZHIgKikoc2tiX21wbHNfaGVhZGVyKHNrYikgLSBFVEhfSExFTik7CisJaGRyID0gKHN0cnVjdCBldGhoZHIgKikoKHZvaWQgKiltcGxzX2hkcihza2IpIC0gRVRIX0hMRU4pOwogCXVwZGF0ZV9ldGhlcnR5cGUoc2tiLCBoZHIsIGV0aGVydHlwZSk7CiAJaWYgKGV0aF9wX21wbHMoc2tiLT5wcm90b2NvbCkpCiAJCXNrYi0+cHJvdG9jb2wgPSBldGhlcnR5cGU7CkBAIC0yMTQsNyArMjI2LDcgQEAKIHN0YXRpYyBpbnQgc2V0X21wbHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHN3X2Zsb3dfa2V5ICpmbG93X2tleSwKIAkJICAgIGNvbnN0IF9fYmUzMiAqbXBsc19sc2UsIGNvbnN0IF9fYmUzMiAqbWFzaykKIHsKLQlfX2JlMzIgKnN0YWNrOworCXN0cnVjdCBtcGxzX3NoaW1faGRyICpzdGFjazsKIAlfX2JlMzIgbHNlOwogCWludCBlcnI7CiAKQEAgLTIyMiwxNiArMjM0LDE2IEBACiAJaWYgKHVubGlrZWx5KGVycikpCiAJCXJldHVybiBlcnI7CiAKLQlzdGFjayA9IChfX2JlMzIgKilza2JfbXBsc19oZWFkZXIoc2tiKTsKLQlsc2UgPSBPVlNfTUFTS0VEKCpzdGFjaywgKm1wbHNfbHNlLCAqbWFzayk7CisJc3RhY2sgPSBtcGxzX2hkcihza2IpOworCWxzZSA9IE9WU19NQVNLRUQoc3RhY2stPmxhYmVsX3N0YWNrX2VudHJ5LCAqbXBsc19sc2UsICptYXNrKTsKIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpIHsKLQkJX19iZTMyIGRpZmZbXSA9IHsgfigqc3RhY2spLCBsc2UgfTsKKwkJX19iZTMyIGRpZmZbXSA9IHsgfihzdGFjay0+bGFiZWxfc3RhY2tfZW50cnkpLCBsc2UgfTsKIAogCQlza2ItPmNzdW0gPSB+Y3N1bV9wYXJ0aWFsKChjaGFyICopZGlmZiwgc2l6ZW9mKGRpZmYpLAogCQkJCQkgIH5za2ItPmNzdW0pOwogCX0KIAotCSpzdGFjayA9IGxzZTsKKwlzdGFjay0+bGFiZWxfc3RhY2tfZW50cnkgPSBsc2U7CiAJZmxvd19rZXktPm1wbHMudG9wX2xzZSA9IGxzZTsKIAlyZXR1cm4gMDsKIH0KQEAgLTI0MSwyMCArMjUzLDI0IEBACiAJaW50IGVycjsKIAogCWVyciA9IHNrYl92bGFuX3BvcChza2IpOwotCWlmIChza2Jfdmxhbl90YWdfcHJlc2VudChza2IpKQorCWlmIChza2Jfdmxhbl90YWdfcHJlc2VudChza2IpKSB7CiAJCWludmFsaWRhdGVfZmxvd19rZXkoa2V5KTsKLQllbHNlCi0JCWtleS0+ZXRoLnRjaSA9IDA7CisJfSBlbHNlIHsKKwkJa2V5LT5ldGgudmxhbi50Y2kgPSAwOworCQlrZXktPmV0aC52bGFuLnRwaWQgPSAwOworCX0KIAlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IHB1c2hfdmxhbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSwKIAkJICAgICBjb25zdCBzdHJ1Y3Qgb3ZzX2FjdGlvbl9wdXNoX3ZsYW4gKnZsYW4pCiB7Ci0JaWYgKHNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikpCisJaWYgKHNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikpIHsKIAkJaW52YWxpZGF0ZV9mbG93X2tleShrZXkpOwotCWVsc2UKLQkJa2V5LT5ldGgudGNpID0gdmxhbi0+dmxhbl90Y2k7CisJfSBlbHNlIHsKKwkJa2V5LT5ldGgudmxhbi50Y2kgPSB2bGFuLT52bGFuX3RjaTsKKwkJa2V5LT5ldGgudmxhbi50cGlkID0gdmxhbi0+dmxhbl90cGlkOworCX0KIAlyZXR1cm4gc2tiX3ZsYW5fcHVzaChza2IsIHZsYW4tPnZsYW5fdHBpZCwKIAkJCSAgICAgbnRvaHModmxhbi0+dmxhbl90Y2kpICYgflZMQU5fVEFHX1BSRVNFTlQpOwogfQpAQCAtMTAxMSw2ICsxMDI3LDcgQEAKIAkJCSAgY29uc3Qgc3RydWN0IG5sYXR0ciAqYSwgaW50IHJlbSkKIHsKIAlzdHJ1Y3QgZGVmZXJyZWRfYWN0aW9uICpkYTsKKwlpbnQgbGV2ZWw7CiAKIAlpZiAoIWlzX2Zsb3dfa2V5X3ZhbGlkKGtleSkpIHsKIAkJaW50IGVycjsKQEAgLTEwMzQsNiArMTA1MSwxOCBAQAogCQkJcmV0dXJuIDA7CiAJfQogCisJbGV2ZWwgPSB0aGlzX2NwdV9yZWFkKGV4ZWNfYWN0aW9uc19sZXZlbCk7CisJaWYgKGxldmVsIDw9IE9WU19ERUZFUlJFRF9BQ1RJT05fVEhSRVNIT0xEKSB7CisJCXN0cnVjdCByZWNpcmNfa2V5cyAqcmtzID0gdGhpc19jcHVfcHRyKHJlY2lyY19rZXlzKTsKKwkJc3RydWN0IHN3X2Zsb3dfa2V5ICpyZWNpcmNfa2V5ID0gJnJrcy0+a2V5W2xldmVsIC0gMV07CisKKwkJKnJlY2lyY19rZXkgPSAqa2V5OworCQlyZWNpcmNfa2V5LT5yZWNpcmNfaWQgPSBubGFfZ2V0X3UzMihhKTsKKwkJb3ZzX2RwX3Byb2Nlc3NfcGFja2V0KHNrYiwgcmVjaXJjX2tleSk7CisKKwkJcmV0dXJuIDA7CisJfQorCiAJZGEgPSBhZGRfZGVmZXJyZWRfYWN0aW9ucyhza2IsIGtleSwgTlVMTCk7CiAJaWYgKGRhKSB7CiAJCWRhLT5wa3Rfa2V5LnJlY2lyY19pZCA9IG5sYV9nZXRfdTMyKGEpOwpAQCAtMTIwMCwxMSArMTIyOSwxMCBAQAogCQkJY29uc3Qgc3RydWN0IHN3X2Zsb3dfYWN0aW9ucyAqYWN0cywKIAkJCXN0cnVjdCBzd19mbG93X2tleSAqa2V5KQogewotCXN0YXRpYyBjb25zdCBpbnQgb3ZzX3JlY3Vyc2lvbl9saW1pdCA9IDU7CiAJaW50IGVyciwgbGV2ZWw7CiAKIAlsZXZlbCA9IF9fdGhpc19jcHVfaW5jX3JldHVybihleGVjX2FjdGlvbnNfbGV2ZWwpOwotCWlmICh1bmxpa2VseShsZXZlbCA+IG92c19yZWN1cnNpb25fbGltaXQpKSB7CisJaWYgKHVubGlrZWx5KGxldmVsID4gT1ZTX1JFQ1VSU0lPTl9MSU1JVCkpIHsKIAkJbmV0X2NyaXRfcmF0ZWxpbWl0ZWQoIm92czogcmVjdXJzaW9uIGxpbWl0IHJlYWNoZWQgb24gZGF0YXBhdGggJXMsIHByb2JhYmxlIGNvbmZpZ3VyYXRpb24gZXJyb3JcbiIsCiAJCQkJICAgICBvdnNfZHBfbmFtZShkcCkpOwogCQlrZnJlZV9za2Ioc2tiKTsKQEAgLTEyMjksMTAgKzEyNTcsMTcgQEAKIAlpZiAoIWFjdGlvbl9maWZvcykKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlyZWNpcmNfa2V5cyA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgcmVjaXJjX2tleXMpOworCWlmICghcmVjaXJjX2tleXMpIHsKKwkJZnJlZV9wZXJjcHUoYWN0aW9uX2ZpZm9zKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKIHZvaWQgYWN0aW9uX2ZpZm9zX2V4aXQodm9pZCkKIHsKIAlmcmVlX3BlcmNwdShhY3Rpb25fZmlmb3MpOworCWZyZWVfcGVyY3B1KHJlY2lyY19rZXlzKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYyBiL25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYwppbmRleCBjNjQ0Yzc4Li4zMTA0NWVmIDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMKKysrIGIvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jCkBAIC00MzMsNyArNDMzLDYgQEAKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKmw0cHJvdG87CiAJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSB0dXBsZTsKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7Ci0JZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CiAJc3RydWN0IG5mX2Nvbm4gKmN0OwogCXVuc2lnbmVkIGludCBkYXRhb2ZmOwogCXU4IHByb3RvbnVtOwpAQCAtNDU4LDEzICs0NTcsOCBAQAogCiAJY3QgPSBuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwogCi0JY3RpbmZvID0gb3ZzX2N0X2dldF9pbmZvKGgpOwotCWlmIChjdGluZm8gPT0gSVBfQ1RfTkVXKSB7Ci0JCS8qIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uICovCi0JCVdBUk5fT05DRSgxLCAib3ZzX2N0X2ZpbmRfZXhpc3Rpbmc6IG5ldyBwYWNrZXQgZm9yICVwXG4iLCBjdCk7Ci0JfQogCXNrYi0+bmZjdCA9ICZjdC0+Y3RfZ2VuZXJhbDsKLQlza2ItPm5mY3RpbmZvID0gY3RpbmZvOworCXNrYi0+bmZjdGluZm8gPSBvdnNfY3RfZ2V0X2luZm8oaCk7CiAJcmV0dXJuIGN0OwogfQogCkBAIC0xMzczLDcgKzEzNjcsNyBAQAogCWlmIChjdF9pbmZvLT5oZWxwZXIpCiAJCW1vZHVsZV9wdXQoY3RfaW5mby0+aGVscGVyLT5tZSk7CiAJaWYgKGN0X2luZm8tPmN0KQotCQluZl9jdF9wdXQoY3RfaW5mby0+Y3QpOworCQluZl9jdF90bXBsX2ZyZWUoY3RfaW5mby0+Y3QpOwogfQogCiB2b2lkIG92c19jdF9pbml0KHN0cnVjdCBuZXQgKm5ldCkKZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC9kYXRhcGF0aC5jIGIvbmV0L29wZW52c3dpdGNoL2RhdGFwYXRoLmMKaW5kZXggNTI0YzBmZC4uNGQ2N2VhOCAxMDA2NDQKLS0tIGEvbmV0L29wZW52c3dpdGNoL2RhdGFwYXRoLmMKKysrIGIvbmV0L29wZW52c3dpdGNoL2RhdGFwYXRoLmMKQEAgLTkyOCw3ICs5MjgsNiBAQAogCXN0cnVjdCBzd19mbG93X21hc2sgbWFzazsKIAlzdHJ1Y3Qgc2tfYnVmZiAqcmVwbHk7CiAJc3RydWN0IGRhdGFwYXRoICpkcDsKLQlzdHJ1Y3Qgc3dfZmxvd19rZXkga2V5OwogCXN0cnVjdCBzd19mbG93X2FjdGlvbnMgKmFjdHM7CiAJc3RydWN0IHN3X2Zsb3dfbWF0Y2ggbWF0Y2g7CiAJdTMyIHVmaWRfZmxhZ3MgPSBvdnNfbmxhX2dldF91ZmlkX2ZsYWdzKGFbT1ZTX0ZMT1dfQVRUUl9VRklEX0ZMQUdTXSk7CkBAIC05NTYsMjAgKzk1NSwyNCBAQAogCX0KIAogCS8qIEV4dHJhY3Qga2V5LiAqLwotCW92c19tYXRjaF9pbml0KCZtYXRjaCwgJmtleSwgJm1hc2spOworCW92c19tYXRjaF9pbml0KCZtYXRjaCwgJm5ld19mbG93LT5rZXksIGZhbHNlLCAmbWFzayk7CiAJZXJyb3IgPSBvdnNfbmxhX2dldF9tYXRjaChuZXQsICZtYXRjaCwgYVtPVlNfRkxPV19BVFRSX0tFWV0sCiAJCQkJICBhW09WU19GTE9XX0FUVFJfTUFTS10sIGxvZyk7CiAJaWYgKGVycm9yKQogCQlnb3RvIGVycl9rZnJlZV9mbG93OwogCi0Jb3ZzX2Zsb3dfbWFza19rZXkoJm5ld19mbG93LT5rZXksICZrZXksIHRydWUsICZtYXNrKTsKLQogCS8qIEV4dHJhY3QgZmxvdyBpZGVudGlmaWVyLiAqLwogCWVycm9yID0gb3ZzX25sYV9nZXRfaWRlbnRpZmllcigmbmV3X2Zsb3ctPmlkLCBhW09WU19GTE9XX0FUVFJfVUZJRF0sCi0JCQkJICAgICAgICZrZXksIGxvZyk7CisJCQkJICAgICAgICZuZXdfZmxvdy0+a2V5LCBsb2cpOwogCWlmIChlcnJvcikKIAkJZ290byBlcnJfa2ZyZWVfZmxvdzsKIAorCS8qIHVubWFza2VkIGtleSBpcyBuZWVkZWQgdG8gbWF0Y2ggd2hlbiB1ZmlkIGlzIG5vdCB1c2VkLiAqLworCWlmIChvdnNfaWRlbnRpZmllcl9pc19rZXkoJm5ld19mbG93LT5pZCkpCisJCW1hdGNoLmtleSA9IG5ld19mbG93LT5pZC51bm1hc2tlZF9rZXk7CisKKwlvdnNfZmxvd19tYXNrX2tleSgmbmV3X2Zsb3ctPmtleSwgJm5ld19mbG93LT5rZXksIHRydWUsICZtYXNrKTsKKwogCS8qIFZhbGlkYXRlIGFjdGlvbnMuICovCiAJZXJyb3IgPSBvdnNfbmxhX2NvcHlfYWN0aW9ucyhuZXQsIGFbT1ZTX0ZMT1dfQVRUUl9BQ1RJT05TXSwKIAkJCQkgICAgICZuZXdfZmxvdy0+a2V5LCAmYWN0cywgbG9nKTsKQEAgLTk5Niw3ICs5OTksNyBAQAogCWlmIChvdnNfaWRlbnRpZmllcl9pc191ZmlkKCZuZXdfZmxvdy0+aWQpKQogCQlmbG93ID0gb3ZzX2Zsb3dfdGJsX2xvb2t1cF91ZmlkKCZkcC0+dGFibGUsICZuZXdfZmxvdy0+aWQpOwogCWlmICghZmxvdykKLQkJZmxvdyA9IG92c19mbG93X3RibF9sb29rdXAoJmRwLT50YWJsZSwgJmtleSk7CisJCWZsb3cgPSBvdnNfZmxvd190YmxfbG9va3VwKCZkcC0+dGFibGUsICZuZXdfZmxvdy0+a2V5KTsKIAlpZiAobGlrZWx5KCFmbG93KSkgewogCQlyY3VfYXNzaWduX3BvaW50ZXIobmV3X2Zsb3ctPnNmX2FjdHMsIGFjdHMpOwogCkBAIC0xMTIxLDcgKzExMjQsNyBAQAogCiAJdWZpZF9wcmVzZW50ID0gb3ZzX25sYV9nZXRfdWZpZCgmc2ZpZCwgYVtPVlNfRkxPV19BVFRSX1VGSURdLCBsb2cpOwogCWlmIChhW09WU19GTE9XX0FUVFJfS0VZXSkgewotCQlvdnNfbWF0Y2hfaW5pdCgmbWF0Y2gsICZrZXksICZtYXNrKTsKKwkJb3ZzX21hdGNoX2luaXQoJm1hdGNoLCAma2V5LCB0cnVlLCAmbWFzayk7CiAJCWVycm9yID0gb3ZzX25sYV9nZXRfbWF0Y2gobmV0LCAmbWF0Y2gsIGFbT1ZTX0ZMT1dfQVRUUl9LRVldLAogCQkJCQkgIGFbT1ZTX0ZMT1dfQVRUUl9NQVNLXSwgbG9nKTsKIAl9IGVsc2UgaWYgKCF1ZmlkX3ByZXNlbnQpIHsKQEAgLTEyMzgsNyArMTI0MSw3IEBACiAKIAl1ZmlkX3ByZXNlbnQgPSBvdnNfbmxhX2dldF91ZmlkKCZ1ZmlkLCBhW09WU19GTE9XX0FUVFJfVUZJRF0sIGxvZyk7CiAJaWYgKGFbT1ZTX0ZMT1dfQVRUUl9LRVldKSB7Ci0JCW92c19tYXRjaF9pbml0KCZtYXRjaCwgJmtleSwgTlVMTCk7CisJCW92c19tYXRjaF9pbml0KCZtYXRjaCwgJmtleSwgdHJ1ZSwgTlVMTCk7CiAJCWVyciA9IG92c19ubGFfZ2V0X21hdGNoKG5ldCwgJm1hdGNoLCBhW09WU19GTE9XX0FUVFJfS0VZXSwgTlVMTCwKIAkJCQkJbG9nKTsKIAl9IGVsc2UgaWYgKCF1ZmlkX3ByZXNlbnQpIHsKQEAgLTEyOTcsNyArMTMwMCw3IEBACiAKIAl1ZmlkX3ByZXNlbnQgPSBvdnNfbmxhX2dldF91ZmlkKCZ1ZmlkLCBhW09WU19GTE9XX0FUVFJfVUZJRF0sIGxvZyk7CiAJaWYgKGFbT1ZTX0ZMT1dfQVRUUl9LRVldKSB7Ci0JCW92c19tYXRjaF9pbml0KCZtYXRjaCwgJmtleSwgTlVMTCk7CisJCW92c19tYXRjaF9pbml0KCZtYXRjaCwgJmtleSwgdHJ1ZSwgTlVMTCk7CiAJCWVyciA9IG92c19ubGFfZ2V0X21hdGNoKG5ldCwgJm1hdGNoLCBhW09WU19GTE9XX0FUVFJfS0VZXSwKIAkJCQkJTlVMTCwgbG9nKTsKIAkJaWYgKHVubGlrZWx5KGVycikpCkBAIC0yNDM3LDMgKzI0NDAsNyBAQAogCiBNT0RVTEVfREVTQ1JJUFRJT04oIk9wZW4gdlN3aXRjaCBzd2l0Y2hpbmcgZGF0YXBhdGgiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19HRU5MX0ZBTUlMWShPVlNfREFUQVBBVEhfRkFNSUxZKTsKK01PRFVMRV9BTElBU19HRU5MX0ZBTUlMWShPVlNfVlBPUlRfRkFNSUxZKTsKK01PRFVMRV9BTElBU19HRU5MX0ZBTUlMWShPVlNfRkxPV19GQU1JTFkpOworTU9EVUxFX0FMSUFTX0dFTkxfRkFNSUxZKE9WU19QQUNLRVRfRkFNSUxZKTsKZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC9mbG93LmMgYi9uZXQvb3BlbnZzd2l0Y2gvZmxvdy5jCmluZGV4IDBlYTEyOGUuLmM4YzgyZTEgMTAwNjQ0Ci0tLSBhL25ldC9vcGVudnN3aXRjaC9mbG93LmMKKysrIGIvbmV0L29wZW52c3dpdGNoL2Zsb3cuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CkBAIC03MiwzMiArNzMsMzMgQEAKIHsKIAlzdHJ1Y3QgZmxvd19zdGF0cyAqc3RhdHM7CiAJaW50IG5vZGUgPSBudW1hX25vZGVfaWQoKTsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCWludCBsZW4gPSBza2ItPmxlbiArIChza2Jfdmxhbl90YWdfcHJlc2VudChza2IpID8gVkxBTl9ITEVOIDogMCk7CiAKLQlzdGF0cyA9IHJjdV9kZXJlZmVyZW5jZShmbG93LT5zdGF0c1tub2RlXSk7CisJc3RhdHMgPSByY3VfZGVyZWZlcmVuY2UoZmxvdy0+c3RhdHNbY3B1XSk7CiAKLQkvKiBDaGVjayBpZiBhbHJlYWR5IGhhdmUgbm9kZS1zcGVjaWZpYyBzdGF0cy4gKi8KKwkvKiBDaGVjayBpZiBhbHJlYWR5IGhhdmUgQ1BVLXNwZWNpZmljIHN0YXRzLiAqLwogCWlmIChsaWtlbHkoc3RhdHMpKSB7CiAJCXNwaW5fbG9jaygmc3RhdHMtPmxvY2spOwogCQkvKiBNYXJrIGlmIHdlIHdyaXRlIG9uIHRoZSBwcmUtYWxsb2NhdGVkIHN0YXRzLiAqLwotCQlpZiAobm9kZSA9PSAwICYmIHVubGlrZWx5KGZsb3ctPnN0YXRzX2xhc3Rfd3JpdGVyICE9IG5vZGUpKQotCQkJZmxvdy0+c3RhdHNfbGFzdF93cml0ZXIgPSBub2RlOworCQlpZiAoY3B1ID09IDAgJiYgdW5saWtlbHkoZmxvdy0+c3RhdHNfbGFzdF93cml0ZXIgIT0gY3B1KSkKKwkJCWZsb3ctPnN0YXRzX2xhc3Rfd3JpdGVyID0gY3B1OwogCX0gZWxzZSB7CiAJCXN0YXRzID0gcmN1X2RlcmVmZXJlbmNlKGZsb3ctPnN0YXRzWzBdKTsgLyogUHJlLWFsbG9jYXRlZC4gKi8KIAkJc3Bpbl9sb2NrKCZzdGF0cy0+bG9jayk7CiAKLQkJLyogSWYgdGhlIGN1cnJlbnQgTlVNQS1ub2RlIGlzIHRoZSBvbmx5IHdyaXRlciBvbiB0aGUKKwkJLyogSWYgdGhlIGN1cnJlbnQgQ1BVIGlzIHRoZSBvbmx5IHdyaXRlciBvbiB0aGUKIAkJICogcHJlLWFsbG9jYXRlZCBzdGF0cyBrZWVwIHVzaW5nIHRoZW0uCiAJCSAqLwotCQlpZiAodW5saWtlbHkoZmxvdy0+c3RhdHNfbGFzdF93cml0ZXIgIT0gbm9kZSkpIHsKKwkJaWYgKHVubGlrZWx5KGZsb3ctPnN0YXRzX2xhc3Rfd3JpdGVyICE9IGNwdSkpIHsKIAkJCS8qIEEgcHJldmlvdXMgbG9ja2VyIG1heSBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIHRoZQotCQkJICogc3RhdHMsIHNvIHdlIG5lZWQgdG8gY2hlY2sgYWdhaW4uICBJZiBub2RlLXNwZWNpZmljCisJCQkgKiBzdGF0cywgc28gd2UgbmVlZCB0byBjaGVjayBhZ2Fpbi4gIElmIENQVS1zcGVjaWZpYwogCQkJICogc3RhdHMgd2VyZSBhbHJlYWR5IGFsbG9jYXRlZCwgd2UgdXBkYXRlIHRoZSBwcmUtCiAJCQkgKiBhbGxvY2F0ZWQgc3RhdHMgYXMgd2UgaGF2ZSBhbHJlYWR5IGxvY2tlZCB0aGVtLgogCQkJICovCi0JCQlpZiAobGlrZWx5KGZsb3ctPnN0YXRzX2xhc3Rfd3JpdGVyICE9IE5VTUFfTk9fTk9ERSkKLQkJCSAgICAmJiBsaWtlbHkoIXJjdV9hY2Nlc3NfcG9pbnRlcihmbG93LT5zdGF0c1tub2RlXSkpKSB7Ci0JCQkJLyogVHJ5IHRvIGFsbG9jYXRlIG5vZGUtc3BlY2lmaWMgc3RhdHMuICovCisJCQlpZiAobGlrZWx5KGZsb3ctPnN0YXRzX2xhc3Rfd3JpdGVyICE9IC0xKSAmJgorCQkJICAgIGxpa2VseSghcmN1X2FjY2Vzc19wb2ludGVyKGZsb3ctPnN0YXRzW2NwdV0pKSkgeworCQkJCS8qIFRyeSB0byBhbGxvY2F0ZSBDUFUtc3BlY2lmaWMgc3RhdHMuICovCiAJCQkJc3RydWN0IGZsb3dfc3RhdHMgKm5ld19zdGF0czsKIAogCQkJCW5ld19zdGF0cyA9CkBAIC0xMTQsMTIgKzExNiwxMiBAQAogCQkJCQluZXdfc3RhdHMtPnRjcF9mbGFncyA9IHRjcF9mbGFnczsKIAkJCQkJc3Bpbl9sb2NrX2luaXQoJm5ld19zdGF0cy0+bG9jayk7CiAKLQkJCQkJcmN1X2Fzc2lnbl9wb2ludGVyKGZsb3ctPnN0YXRzW25vZGVdLAorCQkJCQlyY3VfYXNzaWduX3BvaW50ZXIoZmxvdy0+c3RhdHNbY3B1XSwKIAkJCQkJCQkgICBuZXdfc3RhdHMpOwogCQkJCQlnb3RvIHVubG9jazsKIAkJCQl9CiAJCQl9Ci0JCQlmbG93LT5zdGF0c19sYXN0X3dyaXRlciA9IG5vZGU7CisJCQlmbG93LT5zdGF0c19sYXN0X3dyaXRlciA9IGNwdTsKIAkJfQogCX0KIApAQCAtMTM2LDE0ICsxMzgsMTUgQEAKIAkJCXN0cnVjdCBvdnNfZmxvd19zdGF0cyAqb3ZzX3N0YXRzLAogCQkJdW5zaWduZWQgbG9uZyAqdXNlZCwgX19iZTE2ICp0Y3BfZmxhZ3MpCiB7Ci0JaW50IG5vZGU7CisJaW50IGNwdTsKIAogCSp1c2VkID0gMDsKIAkqdGNwX2ZsYWdzID0gMDsKIAltZW1zZXQob3ZzX3N0YXRzLCAwLCBzaXplb2YoKm92c19zdGF0cykpOwogCi0JZm9yX2VhY2hfbm9kZShub2RlKSB7Ci0JCXN0cnVjdCBmbG93X3N0YXRzICpzdGF0cyA9IHJjdV9kZXJlZmVyZW5jZV9vdnNsKGZsb3ctPnN0YXRzW25vZGVdKTsKKwkvKiBXZSBvcGVuIGNvZGUgdGhpcyB0byBtYWtlIHN1cmUgY3B1IDAgaXMgYWx3YXlzIGNvbnNpZGVyZWQgKi8KKwlmb3IgKGNwdSA9IDA7IGNwdSA8IG5yX2NwdV9pZHM7IGNwdSA9IGNwdW1hc2tfbmV4dChjcHUsIGNwdV9wb3NzaWJsZV9tYXNrKSkgeworCQlzdHJ1Y3QgZmxvd19zdGF0cyAqc3RhdHMgPSByY3VfZGVyZWZlcmVuY2Vfb3ZzbChmbG93LT5zdGF0c1tjcHVdKTsKIAogCQlpZiAoc3RhdHMpIHsKIAkJCS8qIExvY2FsIENQVSBtYXkgd3JpdGUgb24gbm9uLWxvY2FsIHN0YXRzLCBzbyB3ZSBtdXN0CkBAIC0xNjMsMTAgKzE2NiwxMSBAQAogLyogQ2FsbGVkIHdpdGggb3ZzX211dGV4LiAqLwogdm9pZCBvdnNfZmxvd19zdGF0c19jbGVhcihzdHJ1Y3Qgc3dfZmxvdyAqZmxvdykKIHsKLQlpbnQgbm9kZTsKKwlpbnQgY3B1OwogCi0JZm9yX2VhY2hfbm9kZShub2RlKSB7Ci0JCXN0cnVjdCBmbG93X3N0YXRzICpzdGF0cyA9IG92c2xfZGVyZWZlcmVuY2UoZmxvdy0+c3RhdHNbbm9kZV0pOworCS8qIFdlIG9wZW4gY29kZSB0aGlzIHRvIG1ha2Ugc3VyZSBjcHUgMCBpcyBhbHdheXMgY29uc2lkZXJlZCAqLworCWZvciAoY3B1ID0gMDsgY3B1IDwgbnJfY3B1X2lkczsgY3B1ID0gY3B1bWFza19uZXh0KGNwdSwgY3B1X3Bvc3NpYmxlX21hc2spKSB7CisJCXN0cnVjdCBmbG93X3N0YXRzICpzdGF0cyA9IG92c2xfZGVyZWZlcmVuY2UoZmxvdy0+c3RhdHNbY3B1XSk7CiAKIAkJaWYgKHN0YXRzKSB7CiAJCQlzcGluX2xvY2tfYmgoJnN0YXRzLT5sb2NrKTsKQEAgLTMwMiwyNCArMzA2LDU3IEBACiAJCQkJICBzaXplb2Yoc3RydWN0IGljbXA2aGRyKSk7CiB9CiAKLXN0YXRpYyBpbnQgcGFyc2VfdmxhbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSkKKy8qKgorICogUGFyc2UgdmxhbiB0YWcgZnJvbSB2bGFuIGhlYWRlci4KKyAqIFJldHVybnMgRVJST1Igb24gbWVtb3J5IGVycm9yLgorICogUmV0dXJucyAwIGlmIGl0IGVuY291bnRlcnMgYSBub24tdmxhbiBvciBpbmNvbXBsZXRlIHBhY2tldC4KKyAqIFJldHVybnMgMSBhZnRlciBzdWNjZXNzZnVsbHkgcGFyc2luZyB2bGFuIHRhZy4KKyAqLworc3RhdGljIGludCBwYXJzZV92bGFuX3RhZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgdmxhbl9oZWFkICprZXlfdmgpCiB7Ci0Jc3RydWN0IHF0YWdfcHJlZml4IHsKLQkJX19iZTE2IGV0aF90eXBlOyAvKiBFVEhfUF84MDIxUSAqLwotCQlfX2JlMTYgdGNpOwotCX07Ci0Jc3RydWN0IHF0YWdfcHJlZml4ICpxcDsKKwlzdHJ1Y3Qgdmxhbl9oZWFkICp2aCA9IChzdHJ1Y3Qgdmxhbl9oZWFkICopc2tiLT5kYXRhOwogCi0JaWYgKHVubGlrZWx5KHNrYi0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBxdGFnX3ByZWZpeCkgKyBzaXplb2YoX19iZTE2KSkpCisJaWYgKGxpa2VseSghZXRoX3R5cGVfdmxhbih2aC0+dHBpZCkpKQogCQlyZXR1cm4gMDsKIAotCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgcXRhZ19wcmVmaXgpICsKLQkJCQkJIHNpemVvZihfX2JlMTYpKSkpCisJaWYgKHVubGlrZWx5KHNrYi0+bGVuIDwgc2l6ZW9mKHN0cnVjdCB2bGFuX2hlYWQpICsgc2l6ZW9mKF9fYmUxNikpKQorCQlyZXR1cm4gMDsKKworCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3Qgdmxhbl9oZWFkKSArCisJCQkJIHNpemVvZihfX2JlMTYpKSkpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcXAgPSAoc3RydWN0IHF0YWdfcHJlZml4ICopIHNrYi0+ZGF0YTsKLQlrZXktPmV0aC50Y2kgPSBxcC0+dGNpIHwgaHRvbnMoVkxBTl9UQUdfUFJFU0VOVCk7Ci0JX19za2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgcXRhZ19wcmVmaXgpKTsKKwl2aCA9IChzdHJ1Y3Qgdmxhbl9oZWFkICopc2tiLT5kYXRhOworCWtleV92aC0+dGNpID0gdmgtPnRjaSB8IGh0b25zKFZMQU5fVEFHX1BSRVNFTlQpOworCWtleV92aC0+dHBpZCA9IHZoLT50cGlkOworCisJX19za2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3Qgdmxhbl9oZWFkKSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfdmxhbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSkKK3sKKwlpbnQgcmVzOworCisJa2V5LT5ldGgudmxhbi50Y2kgPSAwOworCWtleS0+ZXRoLnZsYW4udHBpZCA9IDA7CisJa2V5LT5ldGguY3ZsYW4udGNpID0gMDsKKwlrZXktPmV0aC5jdmxhbi50cGlkID0gMDsKKworCWlmIChsaWtlbHkoc2tiX3ZsYW5fdGFnX3ByZXNlbnQoc2tiKSkpIHsKKwkJa2V5LT5ldGgudmxhbi50Y2kgPSBodG9ucyhza2ItPnZsYW5fdGNpKTsKKwkJa2V5LT5ldGgudmxhbi50cGlkID0gc2tiLT52bGFuX3Byb3RvOworCX0gZWxzZSB7CisJCS8qIFBhcnNlIG91dGVyIHZsYW4gdGFnIGluIHRoZSBub24tYWNjZWxlcmF0ZWQgY2FzZS4gKi8KKwkJcmVzID0gcGFyc2Vfdmxhbl90YWcoc2tiLCAma2V5LT5ldGgudmxhbik7CisJCWlmIChyZXMgPD0gMCkKKwkJCXJldHVybiByZXM7CisJfQorCisJLyogUGFyc2UgaW5uZXIgdmxhbiB0YWcuICovCisJcmVzID0gcGFyc2Vfdmxhbl90YWcoc2tiLCAma2V5LT5ldGguY3ZsYW4pOworCWlmIChyZXMgPD0gMCkKKwkJcmV0dXJuIHJlczsKIAogCXJldHVybiAwOwogfQpAQCAtNDgwLDEyICs1MTcsOCBAQAogCSAqIHVwZGF0ZSBza2ItPmNzdW0gaGVyZS4KIAkgKi8KIAotCWtleS0+ZXRoLnRjaSA9IDA7Ci0JaWYgKHNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikpCi0JCWtleS0+ZXRoLnRjaSA9IGh0b25zKHNrYi0+dmxhbl90Y2kpOwotCWVsc2UgaWYgKGV0aC0+aF9wcm90byA9PSBodG9ucyhFVEhfUF84MDIxUSkpCi0JCWlmICh1bmxpa2VseShwYXJzZV92bGFuKHNrYiwga2V5KSkpCi0JCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAodW5saWtlbHkocGFyc2Vfdmxhbihza2IsIGtleSkpKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCWtleS0+ZXRoLnR5cGUgPSBwYXJzZV9ldGhlcnR5cGUoc2tiKTsKIAlpZiAodW5saWtlbHkoa2V5LT5ldGgudHlwZSA9PSBodG9ucygwKSkpCkBAIC02MDAsMTIgKzYzMyw3IEBACiAJfSBlbHNlIGlmIChldGhfcF9tcGxzKGtleS0+ZXRoLnR5cGUpKSB7CiAJCXNpemVfdCBzdGFja19sZW4gPSBNUExTX0hMRU47CiAKLQkJLyogSW4gdGhlIHByZXNlbmNlIG9mIGFuIE1QTFMgbGFiZWwgc3RhY2sgdGhlIGVuZCBvZiB0aGUgTDIKLQkJICogaGVhZGVyIGFuZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBMMyBoZWFkZXIgZGlmZmVyLgotCQkgKgotCQkgKiBBZHZhbmNlIG5ldHdvcmtfaGVhZGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIEwzCi0JCSAqIGhlYWRlci4gbWFjX2xlbiBjb3JyZXNwb25kcyB0byB0aGUgZW5kIG9mIHRoZSBMMiBoZWFkZXIuCi0JCSAqLworCQlza2Jfc2V0X2lubmVyX25ldHdvcmtfaGVhZGVyKHNrYiwgc2tiLT5tYWNfbGVuKTsKIAkJd2hpbGUgKDEpIHsKIAkJCV9fYmUzMiBsc2U7CiAKQEAgLTYxMywxMiArNjQxLDEyIEBACiAJCQlpZiAodW5saWtlbHkoZXJyb3IpKQogCQkJCXJldHVybiAwOwogCi0JCQltZW1jcHkoJmxzZSwgc2tiX25ldHdvcmtfaGVhZGVyKHNrYiksIE1QTFNfSExFTik7CisJCQltZW1jcHkoJmxzZSwgc2tiX2lubmVyX25ldHdvcmtfaGVhZGVyKHNrYiksIE1QTFNfSExFTik7CiAKIAkJCWlmIChzdGFja19sZW4gPT0gTVBMU19ITEVOKQogCQkJCW1lbWNweSgma2V5LT5tcGxzLnRvcF9sc2UsICZsc2UsIE1QTFNfSExFTik7CiAKLQkJCXNrYl9zZXRfbmV0d29ya19oZWFkZXIoc2tiLCBza2ItPm1hY19sZW4gKyBzdGFja19sZW4pOworCQkJc2tiX3NldF9pbm5lcl9uZXR3b3JrX2hlYWRlcihza2IsIHNrYi0+bWFjX2xlbiArIHN0YWNrX2xlbik7CiAJCQlpZiAobHNlICYgaHRvbmwoTVBMU19MU19TX01BU0spKQogCQkJCWJyZWFrOwogCkBAIC03MzQsOCArNzYyLDYgQEAKIHsKIAlpbnQgZXJyOwogCi0JbWVtc2V0KGtleSwgMCwgT1ZTX1NXX0ZMT1dfS0VZX01FVEFEQVRBX1NJWkUpOwotCiAJLyogRXh0cmFjdCBtZXRhZGF0YSBmcm9tIG5ldGxpbmsgYXR0cmlidXRlcy4gKi8KIAllcnIgPSBvdnNfbmxhX2dldF9mbG93X21ldGFkYXRhKG5ldCwgYXR0ciwga2V5LCBsb2cpOwogCWlmIChlcnIpCmRpZmYgLS1naXQgYS9uZXQvb3BlbnZzd2l0Y2gvZmxvdy5oIGIvbmV0L29wZW52c3dpdGNoL2Zsb3cuaAppbmRleCAwMzM3OGU3Li5hZTc4M2Y1IDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvZmxvdy5oCisrKyBiL25ldC9vcGVudnN3aXRjaC9mbG93LmgKQEAgLTUwLDYgKzUwLDExIEBACiAJc3RydWN0IG1ldGFkYXRhX2RzdAkqdHVuX2RzdDsKIH07CiAKK3N0cnVjdCB2bGFuX2hlYWQgeworCV9fYmUxNiB0cGlkOyAvKiBWbGFuIHR5cGUuIEdlbmVyYWxseSA4MDIuMXEgb3IgODAyLjFhZC4qLworCV9fYmUxNiB0Y2k7ICAvKiAwIGlmIG5vIFZMQU4sIFZMQU5fVEFHX1BSRVNFTlQgc2V0IG90aGVyd2lzZS4gKi8KK307CisKICNkZWZpbmUgT1ZTX1NXX0ZMT1dfS0VZX01FVEFEQVRBX1NJWkUJCQlcCiAJKG9mZnNldG9mKHN0cnVjdCBzd19mbG93X2tleSwgcmVjaXJjX2lkKSArCVwKIAlGSUVMRF9TSVpFT0Yoc3RydWN0IHN3X2Zsb3dfa2V5LCByZWNpcmNfaWQpKQpAQCAtNjksNyArNzQsOCBAQAogCXN0cnVjdCB7CiAJCXU4ICAgICBzcmNbRVRIX0FMRU5dOwkvKiBFdGhlcm5ldCBzb3VyY2UgYWRkcmVzcy4gKi8KIAkJdTggICAgIGRzdFtFVEhfQUxFTl07CS8qIEV0aGVybmV0IGRlc3RpbmF0aW9uIGFkZHJlc3MuICovCi0JCV9fYmUxNiB0Y2k7CQkvKiAwIGlmIG5vIFZMQU4sIFZMQU5fVEFHX1BSRVNFTlQgc2V0IG90aGVyd2lzZS4gKi8KKwkJc3RydWN0IHZsYW5faGVhZCB2bGFuOworCQlzdHJ1Y3Qgdmxhbl9oZWFkIGN2bGFuOwogCQlfX2JlMTYgdHlwZTsJCS8qIEV0aGVybmV0IGZyYW1lIHR5cGUuICovCiAJfSBldGg7CiAJdW5pb24gewpAQCAtMTcyLDE0ICsxNzgsMTQgQEAKIAkJc3RydWN0IGhsaXN0X25vZGUgbm9kZVsyXTsKIAkJdTMyIGhhc2g7CiAJfSBmbG93X3RhYmxlLCB1ZmlkX3RhYmxlOwotCWludCBzdGF0c19sYXN0X3dyaXRlcjsJCS8qIE5VTUEtbm9kZSBpZCBvZiB0aGUgbGFzdCB3cml0ZXIgb24KKwlpbnQgc3RhdHNfbGFzdF93cml0ZXI7CQkvKiBDUFUgaWQgb2YgdGhlIGxhc3Qgd3JpdGVyIG9uCiAJCQkJCSAqICdzdGF0c1swXScuCiAJCQkJCSAqLwogCXN0cnVjdCBzd19mbG93X2tleSBrZXk7CiAJc3RydWN0IHN3X2Zsb3dfaWQgaWQ7CiAJc3RydWN0IHN3X2Zsb3dfbWFzayAqbWFzazsKIAlzdHJ1Y3Qgc3dfZmxvd19hY3Rpb25zIF9fcmN1ICpzZl9hY3RzOwotCXN0cnVjdCBmbG93X3N0YXRzIF9fcmN1ICpzdGF0c1tdOyAvKiBPbmUgZm9yIGVhY2ggTlVNQSBub2RlLiAgRmlyc3Qgb25lCisJc3RydWN0IGZsb3dfc3RhdHMgX19yY3UgKnN0YXRzW107IC8qIE9uZSBmb3IgZWFjaCBDUFUuICBGaXJzdCBvbmUKIAkJCQkJICAgKiBpcyBhbGxvY2F0ZWQgYXQgZmxvdyBjcmVhdGlvbiB0aW1lLAogCQkJCQkgICAqIHRoZSByZXN0IGFyZSBhbGxvY2F0ZWQgb24gZGVtYW5kCiAJCQkJCSAgICogd2hpbGUgaG9sZGluZyB0aGUgJ3N0YXRzWzBdLmxvY2snLgpkaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL2Zsb3dfbmV0bGluay5jIGIvbmV0L29wZW52c3dpdGNoL2Zsb3dfbmV0bGluay5jCmluZGV4IGM3OGE2YTEuLmFlMjVkZWQgMTAwNjQ0Ci0tLSBhL25ldC9vcGVudnN3aXRjaC9mbG93X25ldGxpbmsuYworKysgYi9uZXQvb3BlbnZzd2l0Y2gvZmxvd19uZXRsaW5rLmMKQEAgLTgwOCw2ICs4MDgsMTY3IEBACiAJCQkJICBpcF90dW5uZWxfaW5mb19hZih0dW5faW5mbykpOwogfQogCitzdGF0aWMgaW50IGVuY29kZV92bGFuX2Zyb21fbmxhdHRycyhzdHJ1Y3Qgc3dfZmxvd19tYXRjaCAqbWF0Y2gsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKmFbXSwKKwkJCQkgICAgYm9vbCBpc19tYXNrLCBib29sIGlubmVyKQoreworCV9fYmUxNiB0Y2kgPSAwOworCV9fYmUxNiB0cGlkID0gMDsKKworCWlmIChhW09WU19LRVlfQVRUUl9WTEFOXSkKKwkJdGNpID0gbmxhX2dldF9iZTE2KGFbT1ZTX0tFWV9BVFRSX1ZMQU5dKTsKKworCWlmIChhW09WU19LRVlfQVRUUl9FVEhFUlRZUEVdKQorCQl0cGlkID0gbmxhX2dldF9iZTE2KGFbT1ZTX0tFWV9BVFRSX0VUSEVSVFlQRV0pOworCisJaWYgKGxpa2VseSghaW5uZXIpKSB7CisJCVNXX0ZMT1dfS0VZX1BVVChtYXRjaCwgZXRoLnZsYW4udHBpZCwgdHBpZCwgaXNfbWFzayk7CisJCVNXX0ZMT1dfS0VZX1BVVChtYXRjaCwgZXRoLnZsYW4udGNpLCB0Y2ksIGlzX21hc2spOworCX0gZWxzZSB7CisJCVNXX0ZMT1dfS0VZX1BVVChtYXRjaCwgZXRoLmN2bGFuLnRwaWQsIHRwaWQsIGlzX21hc2spOworCQlTV19GTE9XX0tFWV9QVVQobWF0Y2gsIGV0aC5jdmxhbi50Y2ksIHRjaSwgaXNfbWFzayk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZhbGlkYXRlX3ZsYW5fZnJvbV9ubGF0dHJzKGNvbnN0IHN0cnVjdCBzd19mbG93X21hdGNoICptYXRjaCwKKwkJCQkgICAgICB1NjQga2V5X2F0dHJzLCBib29sIGlubmVyLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiphLCBib29sIGxvZykKK3sKKwlfX2JlMTYgdGNpID0gMDsKKworCWlmICghKChrZXlfYXR0cnMgJiAoMSA8PCBPVlNfS0VZX0FUVFJfRVRIRVJORVQpKSAmJgorCSAgICAgIChrZXlfYXR0cnMgJiAoMSA8PCBPVlNfS0VZX0FUVFJfRVRIRVJUWVBFKSkgJiYKKwkgICAgICAgZXRoX3R5cGVfdmxhbihubGFfZ2V0X2JlMTYoYVtPVlNfS0VZX0FUVFJfRVRIRVJUWVBFXSkpKSkgeworCQkvKiBOb3QgYSBWTEFOLiAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoISgoa2V5X2F0dHJzICYgKDEgPDwgT1ZTX0tFWV9BVFRSX1ZMQU4pKSAmJgorCSAgICAgIChrZXlfYXR0cnMgJiAoMSA8PCBPVlNfS0VZX0FUVFJfRU5DQVApKSkpIHsKKwkJT1ZTX05MRVJSKGxvZywgIkludmFsaWQgJXMgZnJhbWUiLCAoaW5uZXIpID8gIkMtVkxBTiIgOiAiVkxBTiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYVtPVlNfS0VZX0FUVFJfVkxBTl0pCisJCXRjaSA9IG5sYV9nZXRfYmUxNihhW09WU19LRVlfQVRUUl9WTEFOXSk7CisKKwlpZiAoISh0Y2kgJiBodG9ucyhWTEFOX1RBR19QUkVTRU5UKSkpIHsKKwkJaWYgKHRjaSkgeworCQkJT1ZTX05MRVJSKGxvZywgIiVzIFRDSSBkb2VzIG5vdCBoYXZlIFZMQU5fVEFHX1BSRVNFTlQgYml0IHNldC4iLAorCQkJCSAgKGlubmVyKSA/ICJDLVZMQU4iIDogIlZMQU4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9IGVsc2UgaWYgKG5sYV9sZW4oYVtPVlNfS0VZX0FUVFJfRU5DQVBdKSkgeworCQkJLyogQ29ybmVyIGNhc2UgZm9yIHRydW5jYXRlZCBWTEFOIGhlYWRlci4gKi8KKwkJCU9WU19OTEVSUihsb2csICJUcnVuY2F0ZWQgJXMgaGVhZGVyIGhhcyBub24temVybyBlbmNhcCBhdHRyaWJ1dGUuIiwKKwkJCQkgIChpbm5lcikgPyAiQy1WTEFOIiA6ICJWTEFOIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHZhbGlkYXRlX3ZsYW5fbWFza19mcm9tX25sYXR0cnMoY29uc3Qgc3RydWN0IHN3X2Zsb3dfbWF0Y2ggKm1hdGNoLAorCQkJCQkgICB1NjQga2V5X2F0dHJzLCBib29sIGlubmVyLAorCQkJCQkgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICoqYSwgYm9vbCBsb2cpCit7CisJX19iZTE2IHRjaSA9IDA7CisJX19iZTE2IHRwaWQgPSAwOworCWJvb2wgZW5jYXBfdmFsaWQgPSAhIShtYXRjaC0+a2V5LT5ldGgudmxhbi50Y2kgJgorCQkJICAgICAgaHRvbnMoVkxBTl9UQUdfUFJFU0VOVCkpOworCWJvb2wgaV9lbmNhcF92YWxpZCA9ICEhKG1hdGNoLT5rZXktPmV0aC5jdmxhbi50Y2kgJgorCQkJCWh0b25zKFZMQU5fVEFHX1BSRVNFTlQpKTsKKworCWlmICghKGtleV9hdHRycyAmICgxIDw8IE9WU19LRVlfQVRUUl9FTkNBUCkpKSB7CisJCS8qIE5vdCBhIFZMQU4uICovCisJCXJldHVybiAwOworCX0KKworCWlmICgoIWlubmVyICYmICFlbmNhcF92YWxpZCkgfHwgKGlubmVyICYmICFpX2VuY2FwX3ZhbGlkKSkgeworCQlPVlNfTkxFUlIobG9nLCAiRW5jYXAgbWFzayBhdHRyaWJ1dGUgaXMgc2V0IGZvciBub24tJXMgZnJhbWUuIiwKKwkJCSAgKGlubmVyKSA/ICJDLVZMQU4iIDogIlZMQU4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGFbT1ZTX0tFWV9BVFRSX1ZMQU5dKQorCQl0Y2kgPSBubGFfZ2V0X2JlMTYoYVtPVlNfS0VZX0FUVFJfVkxBTl0pOworCisJaWYgKGFbT1ZTX0tFWV9BVFRSX0VUSEVSVFlQRV0pCisJCXRwaWQgPSBubGFfZ2V0X2JlMTYoYVtPVlNfS0VZX0FUVFJfRVRIRVJUWVBFXSk7CisKKwlpZiAodHBpZCAhPSBodG9ucygweGZmZmYpKSB7CisJCU9WU19OTEVSUihsb2csICJNdXN0IGhhdmUgYW4gZXhhY3QgbWF0Y2ggb24gJXMgVFBJRCAobWFzaz0leCkuIiwKKwkJCSAgKGlubmVyKSA/ICJDLVZMQU4iIDogIlZMQU4iLCBudG9ocyh0cGlkKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoISh0Y2kgJiBodG9ucyhWTEFOX1RBR19QUkVTRU5UKSkpIHsKKwkJT1ZTX05MRVJSKGxvZywgIiVzIFRDSSBtYXNrIGRvZXMgbm90IGhhdmUgZXhhY3QgbWF0Y2ggZm9yIFZMQU5fVEFHX1BSRVNFTlQgYml0LiIsCisJCQkgIChpbm5lcikgPyAiQy1WTEFOIiA6ICJWTEFOIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9fcGFyc2Vfdmxhbl9mcm9tX25sYXR0cnMoc3RydWN0IHN3X2Zsb3dfbWF0Y2ggKm1hdGNoLAorCQkJCSAgICAgdTY0ICprZXlfYXR0cnMsIGJvb2wgaW5uZXIsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICoqYSwgYm9vbCBpc19tYXNrLAorCQkJCSAgICAgYm9vbCBsb2cpCit7CisJaW50IGVycjsKKwljb25zdCBzdHJ1Y3QgbmxhdHRyICplbmNhcDsKKworCWlmICghaXNfbWFzaykKKwkJZXJyID0gdmFsaWRhdGVfdmxhbl9mcm9tX25sYXR0cnMobWF0Y2gsICprZXlfYXR0cnMsIGlubmVyLAorCQkJCQkJIGEsIGxvZyk7CisJZWxzZQorCQllcnIgPSB2YWxpZGF0ZV92bGFuX21hc2tfZnJvbV9ubGF0dHJzKG1hdGNoLCAqa2V5X2F0dHJzLCBpbm5lciwKKwkJCQkJCSAgICAgIGEsIGxvZyk7CisJaWYgKGVyciA8PSAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gZW5jb2RlX3ZsYW5fZnJvbV9ubGF0dHJzKG1hdGNoLCBhLCBpc19tYXNrLCBpbm5lcik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCSprZXlfYXR0cnMgJj0gfigxIDw8IE9WU19LRVlfQVRUUl9FTkNBUCk7CisJKmtleV9hdHRycyAmPSB+KDEgPDwgT1ZTX0tFWV9BVFRSX1ZMQU4pOworCSprZXlfYXR0cnMgJj0gfigxIDw8IE9WU19LRVlfQVRUUl9FVEhFUlRZUEUpOworCisJZW5jYXAgPSBhW09WU19LRVlfQVRUUl9FTkNBUF07CisKKwlpZiAoIWlzX21hc2spCisJCWVyciA9IHBhcnNlX2Zsb3dfbmxhdHRycyhlbmNhcCwgYSwga2V5X2F0dHJzLCBsb2cpOworCWVsc2UKKwkJZXJyID0gcGFyc2VfZmxvd19tYXNrX25sYXR0cnMoZW5jYXAsIGEsIGtleV9hdHRycywgbG9nKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfdmxhbl9mcm9tX25sYXR0cnMoc3RydWN0IHN3X2Zsb3dfbWF0Y2ggKm1hdGNoLAorCQkJCSAgIHU2NCAqa2V5X2F0dHJzLCBjb25zdCBzdHJ1Y3QgbmxhdHRyICoqYSwKKwkJCQkgICBib29sIGlzX21hc2ssIGJvb2wgbG9nKQoreworCWludCBlcnI7CisJYm9vbCBlbmNhcF92YWxpZCA9IGZhbHNlOworCisJZXJyID0gX19wYXJzZV92bGFuX2Zyb21fbmxhdHRycyhtYXRjaCwga2V5X2F0dHJzLCBmYWxzZSwgYSwKKwkJCQkJaXNfbWFzaywgbG9nKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZW5jYXBfdmFsaWQgPSAhIShtYXRjaC0+a2V5LT5ldGgudmxhbi50Y2kgJiBodG9ucyhWTEFOX1RBR19QUkVTRU5UKSk7CisJaWYgKGVuY2FwX3ZhbGlkKSB7CisJCWVyciA9IF9fcGFyc2Vfdmxhbl9mcm9tX25sYXR0cnMobWF0Y2gsIGtleV9hdHRycywgdHJ1ZSwgYSwKKwkJCQkJCWlzX21hc2ssIGxvZyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IG1ldGFkYXRhX2Zyb21fbmxhdHRycyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzd19mbG93X21hdGNoICptYXRjaCwKIAkJCQkgdTY0ICphdHRycywgY29uc3Qgc3RydWN0IG5sYXR0ciAqKmEsCiAJCQkJIGJvb2wgaXNfbWFzaywgYm9vbCBsb2cpCkBAIC05MjMsMjAgKzEwODQsMTEgQEAKIAl9CiAKIAlpZiAoYXR0cnMgJiAoMSA8PCBPVlNfS0VZX0FUVFJfVkxBTikpIHsKLQkJX19iZTE2IHRjaTsKLQotCQl0Y2kgPSBubGFfZ2V0X2JlMTYoYVtPVlNfS0VZX0FUVFJfVkxBTl0pOwotCQlpZiAoISh0Y2kgJiBodG9ucyhWTEFOX1RBR19QUkVTRU5UKSkpIHsKLQkJCWlmIChpc19tYXNrKQotCQkJCU9WU19OTEVSUihsb2csICJWTEFOIFRDSSBtYXNrIGRvZXMgbm90IGhhdmUgZXhhY3QgbWF0Y2ggZm9yIFZMQU5fVEFHX1BSRVNFTlQgYml0LiIpOwotCQkJZWxzZQotCQkJCU9WU19OTEVSUihsb2csICJWTEFOIFRDSSBkb2VzIG5vdCBoYXZlIFZMQU5fVEFHX1BSRVNFTlQgYml0IHNldC4iKTsKLQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlTV19GTE9XX0tFWV9QVVQobWF0Y2gsIGV0aC50Y2ksIHRjaSwgaXNfbWFzayk7Ci0JCWF0dHJzICY9IH4oMSA8PCBPVlNfS0VZX0FUVFJfVkxBTik7CisJCS8qIFZMQU4gYXR0cmlidXRlIGlzIGFsd2F5cyBwYXJzZWQgYmVmb3JlIGdldHRpbmcgaGVyZSBzaW5jZSBpdAorCQkgKiBtYXkgb2NjdXIgbXVsdGlwbGUgdGltZXMuCisJCSAqLworCQlPVlNfTkxFUlIobG9nLCAiVkxBTiBhdHRyaWJ1dGUgdW5leHBlY3RlZC4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKGF0dHJzICYgKDEgPDwgT1ZTX0tFWV9BVFRSX0VUSEVSVFlQRSkpIHsKQEAgLTExODIsNDkgKzEzMzQsMTggQEAKIAkJICAgICAgYm9vbCBsb2cpCiB7CiAJY29uc3Qgc3RydWN0IG5sYXR0ciAqYVtPVlNfS0VZX0FUVFJfTUFYICsgMV07Ci0JY29uc3Qgc3RydWN0IG5sYXR0ciAqZW5jYXA7CiAJc3RydWN0IG5sYXR0ciAqbmV3bWFzayA9IE5VTEw7CiAJdTY0IGtleV9hdHRycyA9IDA7CiAJdTY0IG1hc2tfYXR0cnMgPSAwOwotCWJvb2wgZW5jYXBfdmFsaWQgPSBmYWxzZTsKIAlpbnQgZXJyOwogCiAJZXJyID0gcGFyc2VfZmxvd19ubGF0dHJzKG5sYV9rZXksIGEsICZrZXlfYXR0cnMsIGxvZyk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWlmICgoa2V5X2F0dHJzICYgKDEgPDwgT1ZTX0tFWV9BVFRSX0VUSEVSTkVUKSkgJiYKLQkgICAgKGtleV9hdHRycyAmICgxIDw8IE9WU19LRVlfQVRUUl9FVEhFUlRZUEUpKSAmJgotCSAgICAobmxhX2dldF9iZTE2KGFbT1ZTX0tFWV9BVFRSX0VUSEVSVFlQRV0pID09IGh0b25zKEVUSF9QXzgwMjFRKSkpIHsKLQkJX19iZTE2IHRjaTsKLQotCQlpZiAoISgoa2V5X2F0dHJzICYgKDEgPDwgT1ZTX0tFWV9BVFRSX1ZMQU4pKSAmJgotCQkgICAgICAoa2V5X2F0dHJzICYgKDEgPDwgT1ZTX0tFWV9BVFRSX0VOQ0FQKSkpKSB7Ci0JCQlPVlNfTkxFUlIobG9nLCAiSW52YWxpZCBWbGFuIGZyYW1lLiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlrZXlfYXR0cnMgJj0gfigxIDw8IE9WU19LRVlfQVRUUl9FVEhFUlRZUEUpOwotCQl0Y2kgPSBubGFfZ2V0X2JlMTYoYVtPVlNfS0VZX0FUVFJfVkxBTl0pOwotCQllbmNhcCA9IGFbT1ZTX0tFWV9BVFRSX0VOQ0FQXTsKLQkJa2V5X2F0dHJzICY9IH4oMSA8PCBPVlNfS0VZX0FUVFJfRU5DQVApOwotCQllbmNhcF92YWxpZCA9IHRydWU7Ci0KLQkJaWYgKHRjaSAmIGh0b25zKFZMQU5fVEFHX1BSRVNFTlQpKSB7Ci0JCQllcnIgPSBwYXJzZV9mbG93X25sYXR0cnMoZW5jYXAsIGEsICZrZXlfYXR0cnMsIGxvZyk7Ci0JCQlpZiAoZXJyKQotCQkJCXJldHVybiBlcnI7Ci0JCX0gZWxzZSBpZiAoIXRjaSkgewotCQkJLyogQ29ybmVyIGNhc2UgZm9yIHRydW5jYXRlZCA4MDIuMVEgaGVhZGVyLiAqLwotCQkJaWYgKG5sYV9sZW4oZW5jYXApKSB7Ci0JCQkJT1ZTX05MRVJSKGxvZywgIlRydW5jYXRlZCA4MDIuMVEgaGVhZGVyIGhhcyBub24temVybyBlbmNhcCBhdHRyaWJ1dGUuIik7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlPVlNfTkxFUlIobG9nLCAiRW5jYXAgYXR0ciBpcyBzZXQgZm9yIG5vbi1WTEFOIGZyYW1lIik7Ci0JCQlyZXR1cm4gIC1FSU5WQUw7Ci0JCX0KLQl9CisJZXJyID0gcGFyc2Vfdmxhbl9mcm9tX25sYXR0cnMobWF0Y2gsICZrZXlfYXR0cnMsIGEsIGZhbHNlLCBsb2cpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAllcnIgPSBvdnNfa2V5X2Zyb21fbmxhdHRycyhuZXQsIG1hdGNoLCBrZXlfYXR0cnMsIGEsIGZhbHNlLCBsb2cpOwogCWlmIChlcnIpCkBAIC0xMjY1LDQ2ICsxMzg2LDEyIEBACiAJCQlnb3RvIGZyZWVfbmV3bWFzazsKIAogCQkvKiBBbHdheXMgbWF0Y2ggb24gdGNpLiAqLwotCQlTV19GTE9XX0tFWV9QVVQobWF0Y2gsIGV0aC50Y2ksIGh0b25zKDB4ZmZmZiksIHRydWUpOworCQlTV19GTE9XX0tFWV9QVVQobWF0Y2gsIGV0aC52bGFuLnRjaSwgaHRvbnMoMHhmZmZmKSwgdHJ1ZSk7CisJCVNXX0ZMT1dfS0VZX1BVVChtYXRjaCwgZXRoLmN2bGFuLnRjaSwgaHRvbnMoMHhmZmZmKSwgdHJ1ZSk7CiAKLQkJaWYgKG1hc2tfYXR0cnMgJiAxIDw8IE9WU19LRVlfQVRUUl9FTkNBUCkgewotCQkJX19iZTE2IGV0aF90eXBlID0gMDsKLQkJCV9fYmUxNiB0Y2kgPSAwOwotCi0JCQlpZiAoIWVuY2FwX3ZhbGlkKSB7Ci0JCQkJT1ZTX05MRVJSKGxvZywgIkVuY2FwIG1hc2sgYXR0cmlidXRlIGlzIHNldCBmb3Igbm9uLVZMQU4gZnJhbWUuIik7Ci0JCQkJZXJyID0gLUVJTlZBTDsKLQkJCQlnb3RvIGZyZWVfbmV3bWFzazsKLQkJCX0KLQotCQkJbWFza19hdHRycyAmPSB+KDEgPDwgT1ZTX0tFWV9BVFRSX0VOQ0FQKTsKLQkJCWlmIChhW09WU19LRVlfQVRUUl9FVEhFUlRZUEVdKQotCQkJCWV0aF90eXBlID0gbmxhX2dldF9iZTE2KGFbT1ZTX0tFWV9BVFRSX0VUSEVSVFlQRV0pOwotCi0JCQlpZiAoZXRoX3R5cGUgPT0gaHRvbnMoMHhmZmZmKSkgewotCQkJCW1hc2tfYXR0cnMgJj0gfigxIDw8IE9WU19LRVlfQVRUUl9FVEhFUlRZUEUpOwotCQkJCWVuY2FwID0gYVtPVlNfS0VZX0FUVFJfRU5DQVBdOwotCQkJCWVyciA9IHBhcnNlX2Zsb3dfbWFza19ubGF0dHJzKGVuY2FwLCBhLAotCQkJCQkJCSAgICAgICZtYXNrX2F0dHJzLCBsb2cpOwotCQkJCWlmIChlcnIpCi0JCQkJCWdvdG8gZnJlZV9uZXdtYXNrOwotCQkJfSBlbHNlIHsKLQkJCQlPVlNfTkxFUlIobG9nLCAiVkxBTiBmcmFtZXMgbXVzdCBoYXZlIGFuIGV4YWN0IG1hdGNoIG9uIHRoZSBUUElEIChtYXNrPSV4KS4iLAotCQkJCQkgIG50b2hzKGV0aF90eXBlKSk7Ci0JCQkJZXJyID0gLUVJTlZBTDsKLQkJCQlnb3RvIGZyZWVfbmV3bWFzazsKLQkJCX0KLQotCQkJaWYgKGFbT1ZTX0tFWV9BVFRSX1ZMQU5dKQotCQkJCXRjaSA9IG5sYV9nZXRfYmUxNihhW09WU19LRVlfQVRUUl9WTEFOXSk7Ci0KLQkJCWlmICghKHRjaSAmIGh0b25zKFZMQU5fVEFHX1BSRVNFTlQpKSkgewotCQkJCU9WU19OTEVSUihsb2csICJWTEFOIHRhZyBwcmVzZW50IGJpdCBtdXN0IGhhdmUgYW4gZXhhY3QgbWF0Y2ggKHRjaV9tYXNrPSV4KS4iLAotCQkJCQkgIG50b2hzKHRjaSkpOwotCQkJCWVyciA9IC1FSU5WQUw7Ci0JCQkJZ290byBmcmVlX25ld21hc2s7Ci0JCQl9Ci0JCX0KKwkJZXJyID0gcGFyc2Vfdmxhbl9mcm9tX25sYXR0cnMobWF0Y2gsICZtYXNrX2F0dHJzLCBhLCB0cnVlLCBsb2cpOworCQlpZiAoZXJyKQorCQkJZ290byBmcmVlX25ld21hc2s7CiAKIAkJZXJyID0gb3ZzX2tleV9mcm9tX25sYXR0cnMobmV0LCBtYXRjaCwgbWFza19hdHRycywgYSwgdHJ1ZSwKIAkJCQkJICAgbG9nKTsKQEAgLTE0MTAsMTIgKzE0OTcsMjUgQEAKIAlyZXR1cm4gbWV0YWRhdGFfZnJvbV9ubGF0dHJzKG5ldCwgJm1hdGNoLCAmYXR0cnMsIGEsIGZhbHNlLCBsb2cpOwogfQogCitzdGF0aWMgaW50IG92c19ubGFfcHV0X3ZsYW4oc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHZsYW5faGVhZCAqdmgsCisJCQkgICAgYm9vbCBpc19tYXNrKQoreworCV9fYmUxNiBldGhfdHlwZSA9ICFpc19tYXNrID8gdmgtPnRwaWQgOiBodG9ucygweGZmZmYpOworCisJaWYgKG5sYV9wdXRfYmUxNihza2IsIE9WU19LRVlfQVRUUl9FVEhFUlRZUEUsIGV0aF90eXBlKSB8fAorCSAgICBubGFfcHV0X2JlMTYoc2tiLCBPVlNfS0VZX0FUVFJfVkxBTiwgdmgtPnRjaSkpCisJCXJldHVybiAtRU1TR1NJWkU7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgX19vdnNfbmxhX3B1dF9rZXkoY29uc3Qgc3RydWN0IHN3X2Zsb3dfa2V5ICpzd2tleSwKIAkJCSAgICAgY29uc3Qgc3RydWN0IHN3X2Zsb3dfa2V5ICpvdXRwdXQsIGJvb2wgaXNfbWFzaywKIAkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3Qgb3ZzX2tleV9ldGhlcm5ldCAqZXRoX2tleTsKLQlzdHJ1Y3QgbmxhdHRyICpubGEsICplbmNhcDsKKwlzdHJ1Y3QgbmxhdHRyICpubGE7CisJc3RydWN0IG5sYXR0ciAqZW5jYXAgPSBOVUxMOworCXN0cnVjdCBubGF0dHIgKmluX2VuY2FwID0gTlVMTDsKIAogCWlmIChubGFfcHV0X3UzMihza2IsIE9WU19LRVlfQVRUUl9SRUNJUkNfSUQsIG91dHB1dC0+cmVjaXJjX2lkKSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CkBAIC0xNDY0LDE3ICsxNTY0LDIxIEBACiAJZXRoZXJfYWRkcl9jb3B5KGV0aF9rZXktPmV0aF9zcmMsIG91dHB1dC0+ZXRoLnNyYyk7CiAJZXRoZXJfYWRkcl9jb3B5KGV0aF9rZXktPmV0aF9kc3QsIG91dHB1dC0+ZXRoLmRzdCk7CiAKLQlpZiAoc3drZXktPmV0aC50Y2kgfHwgc3drZXktPmV0aC50eXBlID09IGh0b25zKEVUSF9QXzgwMjFRKSkgewotCQlfX2JlMTYgZXRoX3R5cGU7Ci0JCWV0aF90eXBlID0gIWlzX21hc2sgPyBodG9ucyhFVEhfUF84MDIxUSkgOiBodG9ucygweGZmZmYpOwotCQlpZiAobmxhX3B1dF9iZTE2KHNrYiwgT1ZTX0tFWV9BVFRSX0VUSEVSVFlQRSwgZXRoX3R5cGUpIHx8Ci0JCSAgICBubGFfcHV0X2JlMTYoc2tiLCBPVlNfS0VZX0FUVFJfVkxBTiwgb3V0cHV0LT5ldGgudGNpKSkKKwlpZiAoc3drZXktPmV0aC52bGFuLnRjaSB8fCBldGhfdHlwZV92bGFuKHN3a2V5LT5ldGgudHlwZSkpIHsKKwkJaWYgKG92c19ubGFfcHV0X3ZsYW4oc2tiLCAmb3V0cHV0LT5ldGgudmxhbiwgaXNfbWFzaykpCiAJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAkJZW5jYXAgPSBubGFfbmVzdF9zdGFydChza2IsIE9WU19LRVlfQVRUUl9FTkNBUCk7Ci0JCWlmICghc3drZXktPmV0aC50Y2kpCisJCWlmICghc3drZXktPmV0aC52bGFuLnRjaSkKIAkJCWdvdG8gdW5lbmNhcDsKLQl9IGVsc2UKLQkJZW5jYXAgPSBOVUxMOworCisJCWlmIChzd2tleS0+ZXRoLmN2bGFuLnRjaSB8fCBldGhfdHlwZV92bGFuKHN3a2V5LT5ldGgudHlwZSkpIHsKKwkJCWlmIChvdnNfbmxhX3B1dF92bGFuKHNrYiwgJm91dHB1dC0+ZXRoLmN2bGFuLCBpc19tYXNrKSkKKwkJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwkJCWluX2VuY2FwID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBPVlNfS0VZX0FUVFJfRU5DQVApOworCQkJaWYgKCFzd2tleS0+ZXRoLmN2bGFuLnRjaSkKKwkJCQlnb3RvIHVuZW5jYXA7CisJCX0KKwl9CiAKIAlpZiAoc3drZXktPmV0aC50eXBlID09IGh0b25zKEVUSF9QXzgwMl8yKSkgewogCQkvKgpAQCAtMTQ5Myw2ICsxNTk3LDE0IEBACiAJaWYgKG5sYV9wdXRfYmUxNihza2IsIE9WU19LRVlfQVRUUl9FVEhFUlRZUEUsIG91dHB1dC0+ZXRoLnR5cGUpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAorCWlmIChldGhfdHlwZV92bGFuKHN3a2V5LT5ldGgudHlwZSkpIHsKKwkJLyogVGhlcmUgYXJlIDMgVkxBTiB0YWdzLCB3ZSBkb24ndCBrbm93IGFueXRoaW5nIGFib3V0IHRoZSByZXN0CisJCSAqIG9mIHRoZSBwYWNrZXQsIHNvIHRydW5jYXRlIGhlcmUuCisJCSAqLworCQlXQVJOX09OX09OQ0UoIShlbmNhcCAmJiBpbl9lbmNhcCkpOworCQlnb3RvIHVuZW5jYXA7CisJfQorCiAJaWYgKHN3a2V5LT5ldGgudHlwZSA9PSBodG9ucyhFVEhfUF9JUCkpIHsKIAkJc3RydWN0IG92c19rZXlfaXB2NCAqaXB2NF9rZXk7CiAKQEAgLTE2MTksNiArMTczMSw4IEBACiAJfQogCiB1bmVuY2FwOgorCWlmIChpbl9lbmNhcCkKKwkJbmxhX25lc3RfZW5kKHNrYiwgaW5fZW5jYXApOwogCWlmIChlbmNhcCkKIAkJbmxhX25lc3RfZW5kKHNrYiwgZW5jYXApOwogCkBAIC0xODgyLDEzICsxOTk2LDE1IEBACiAKIHZvaWQgb3ZzX21hdGNoX2luaXQoc3RydWN0IHN3X2Zsb3dfbWF0Y2ggKm1hdGNoLAogCQkgICAgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksCisJCSAgICBib29sIHJlc2V0X2tleSwKIAkJICAgIHN0cnVjdCBzd19mbG93X21hc2sgKm1hc2spCiB7CiAJbWVtc2V0KG1hdGNoLCAwLCBzaXplb2YoKm1hdGNoKSk7CiAJbWF0Y2gtPmtleSA9IGtleTsKIAltYXRjaC0+bWFzayA9IG1hc2s7CiAKLQltZW1zZXQoa2V5LCAwLCBzaXplb2YoKmtleSkpOworCWlmIChyZXNldF9rZXkpCisJCW1lbXNldChrZXksIDAsIHNpemVvZigqa2V5KSk7CiAKIAlpZiAobWFzaykgewogCQltZW1zZXQoJm1hc2stPmtleSwgMCwgc2l6ZW9mKG1hc2stPmtleSkpOwpAQCAtMTkzNSw3ICsyMDUxLDcgQEAKIAlzdHJ1Y3QgbmxhdHRyICphOwogCWludCBlcnIgPSAwLCBzdGFydCwgb3B0c190eXBlOwogCi0Jb3ZzX21hdGNoX2luaXQoJm1hdGNoLCAma2V5LCBOVUxMKTsKKwlvdnNfbWF0Y2hfaW5pdCgmbWF0Y2gsICZrZXksIHRydWUsIE5VTEwpOwogCW9wdHNfdHlwZSA9IGlwX3R1bl9mcm9tX25sYXR0cihubGFfZGF0YShhdHRyKSwgJm1hdGNoLCBmYWxzZSwgbG9nKTsKIAlpZiAob3B0c190eXBlIDwgMCkKIAkJcmV0dXJuIG9wdHNfdHlwZTsKQEAgLTIyODMsNyArMjM5OSw3IEBACiAKIAkJY2FzZSBPVlNfQUNUSU9OX0FUVFJfUFVTSF9WTEFOOgogCQkJdmxhbiA9IG5sYV9kYXRhKGEpOwotCQkJaWYgKHZsYW4tPnZsYW5fdHBpZCAhPSBodG9ucyhFVEhfUF84MDIxUSkpCisJCQlpZiAoIWV0aF90eXBlX3ZsYW4odmxhbi0+dmxhbl90cGlkKSkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCWlmICghKHZsYW4tPnZsYW5fdGNpICYgaHRvbnMoVkxBTl9UQUdfUFJFU0VOVCkpKQogCQkJCXJldHVybiAtRUlOVkFMOwpAQCAtMjM4OCw3ICsyNTA0LDcgQEAKIAogCSgqc2ZhKS0+b3JpZ19sZW4gPSBubGFfbGVuKGF0dHIpOwogCWVyciA9IF9fb3ZzX25sYV9jb3B5X2FjdGlvbnMobmV0LCBhdHRyLCBrZXksIDAsIHNmYSwga2V5LT5ldGgudHlwZSwKLQkJCQkgICAgIGtleS0+ZXRoLnRjaSwgbG9nKTsKKwkJCQkgICAgIGtleS0+ZXRoLnZsYW4udGNpLCBsb2cpOwogCWlmIChlcnIpCiAJCW92c19ubGFfZnJlZV9mbG93X2FjdGlvbnMoKnNmYSk7CiAKZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC9mbG93X25ldGxpbmsuaCBiL25ldC9vcGVudnN3aXRjaC9mbG93X25ldGxpbmsuaAppbmRleCA0N2RkMTQyLi40NWY5NzY5IDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvZmxvd19uZXRsaW5rLmgKKysrIGIvbmV0L29wZW52c3dpdGNoL2Zsb3dfbmV0bGluay5oCkBAIC00MSw3ICs0MSw4IEBACiBzaXplX3Qgb3ZzX2tleV9hdHRyX3NpemUodm9pZCk7CiAKIHZvaWQgb3ZzX21hdGNoX2luaXQoc3RydWN0IHN3X2Zsb3dfbWF0Y2ggKm1hdGNoLAotCQkgICAgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksIHN0cnVjdCBzd19mbG93X21hc2sgKm1hc2spOworCQkgICAgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksIGJvb2wgcmVzZXRfa2V5LAorCQkgICAgc3RydWN0IHN3X2Zsb3dfbWFzayAqbWFzayk7CiAKIGludCBvdnNfbmxhX3B1dF9rZXkoY29uc3Qgc3RydWN0IHN3X2Zsb3dfa2V5ICosIGNvbnN0IHN0cnVjdCBzd19mbG93X2tleSAqLAogCQkgICAgaW50IGF0dHIsIGJvb2wgaXNfbWFzaywgc3RydWN0IHNrX2J1ZmYgKik7CmRpZmYgLS1naXQgYS9uZXQvb3BlbnZzd2l0Y2gvZmxvd190YWJsZS5jIGIvbmV0L29wZW52c3dpdGNoL2Zsb3dfdGFibGUuYwppbmRleCBkMDczZmZmLi5lYTdhODA3IDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvZmxvd190YWJsZS5jCisrKyBiL25ldC9vcGVudnN3aXRjaC9mbG93X3RhYmxlLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgpAQCAtNzksMTcgKzgwLDEyIEBACiB7CiAJc3RydWN0IHN3X2Zsb3cgKmZsb3c7CiAJc3RydWN0IGZsb3dfc3RhdHMgKnN0YXRzOwotCWludCBub2RlOwogCi0JZmxvdyA9IGttZW1fY2FjaGVfYWxsb2MoZmxvd19jYWNoZSwgR0ZQX0tFUk5FTCk7CisJZmxvdyA9IGttZW1fY2FjaGVfemFsbG9jKGZsb3dfY2FjaGUsIEdGUF9LRVJORUwpOwogCWlmICghZmxvdykKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKLQlmbG93LT5zZl9hY3RzID0gTlVMTDsKLQlmbG93LT5tYXNrID0gTlVMTDsKLQlmbG93LT5pZC51bm1hc2tlZF9rZXkgPSBOVUxMOwotCWZsb3ctPmlkLnVmaWRfbGVuID0gMDsKLQlmbG93LT5zdGF0c19sYXN0X3dyaXRlciA9IE5VTUFfTk9fTk9ERTsKKwlmbG93LT5zdGF0c19sYXN0X3dyaXRlciA9IC0xOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBzdGF0IG5vZGUuICovCiAJc3RhdHMgPSBrbWVtX2NhY2hlX2FsbG9jX25vZGUoZmxvd19zdGF0c19jYWNoZSwKQEAgLTEwMiwxMCArOTgsNiBAQAogCiAJUkNVX0lOSVRfUE9JTlRFUihmbG93LT5zdGF0c1swXSwgc3RhdHMpOwogCi0JZm9yX2VhY2hfbm9kZShub2RlKQotCQlpZiAobm9kZSAhPSAwKQotCQkJUkNVX0lOSVRfUE9JTlRFUihmbG93LT5zdGF0c1tub2RlXSwgTlVMTCk7Ci0KIAlyZXR1cm4gZmxvdzsKIGVycjoKIAlrbWVtX2NhY2hlX2ZyZWUoZmxvd19jYWNoZSwgZmxvdyk7CkBAIC0xNDIsMTYgKzEzNCwxNyBAQAogCiBzdGF0aWMgdm9pZCBmbG93X2ZyZWUoc3RydWN0IHN3X2Zsb3cgKmZsb3cpCiB7Ci0JaW50IG5vZGU7CisJaW50IGNwdTsKIAogCWlmIChvdnNfaWRlbnRpZmllcl9pc19rZXkoJmZsb3ctPmlkKSkKIAkJa2ZyZWUoZmxvdy0+aWQudW5tYXNrZWRfa2V5KTsKIAlpZiAoZmxvdy0+c2ZfYWN0cykKIAkJb3ZzX25sYV9mcmVlX2Zsb3dfYWN0aW9ucygoc3RydWN0IHN3X2Zsb3dfYWN0aW9ucyBfX2ZvcmNlICopZmxvdy0+c2ZfYWN0cyk7Ci0JZm9yX2VhY2hfbm9kZShub2RlKQotCQlpZiAoZmxvdy0+c3RhdHNbbm9kZV0pCisJLyogV2Ugb3BlbiBjb2RlIHRoaXMgdG8gbWFrZSBzdXJlIGNwdSAwIGlzIGFsd2F5cyBjb25zaWRlcmVkICovCisJZm9yIChjcHUgPSAwOyBjcHUgPCBucl9jcHVfaWRzOyBjcHUgPSBjcHVtYXNrX25leHQoY3B1LCBjcHVfcG9zc2libGVfbWFzaykpCisJCWlmIChmbG93LT5zdGF0c1tjcHVdKQogCQkJa21lbV9jYWNoZV9mcmVlKGZsb3dfc3RhdHNfY2FjaGUsCi0JCQkJCShzdHJ1Y3QgZmxvd19zdGF0cyBfX2ZvcmNlICopZmxvdy0+c3RhdHNbbm9kZV0pOworCQkJCQkoc3RydWN0IGZsb3dfc3RhdHMgX19mb3JjZSAqKWZsb3ctPnN0YXRzW2NwdV0pOwogCWttZW1fY2FjaGVfZnJlZShmbG93X2NhY2hlLCBmbG93KTsKIH0KIApAQCAtNzU2LDcgKzc0OSw3IEBACiAJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3Qgc3dfZmxvd19rZXkpICUgc2l6ZW9mKGxvbmcpKTsKIAogCWZsb3dfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgic3dfZmxvdyIsIHNpemVvZihzdHJ1Y3Qgc3dfZmxvdykKLQkJCQkgICAgICAgKyAobnJfbm9kZV9pZHMKKwkJCQkgICAgICAgKyAobnJfY3B1X2lkcwogCQkJCQkgICogc2l6ZW9mKHN0cnVjdCBmbG93X3N0YXRzICopKSwKIAkJCQkgICAgICAgMCwgMCwgTlVMTCk7CiAJaWYgKGZsb3dfY2FjaGUgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC92cG9ydC1nZW5ldmUuYyBiL25ldC9vcGVudnN3aXRjaC92cG9ydC1nZW5ldmUuYwppbmRleCAxYTFmY2VjLi41YWFmM2JhIDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvdnBvcnQtZ2VuZXZlLmMKKysrIGIvbmV0L29wZW52c3dpdGNoL3Zwb3J0LWdlbmV2ZS5jCkBAIC05Myw3ICs5MywxNCBAQAogCQlyZXR1cm4gRVJSX0NBU1QoZGV2KTsKIAl9CiAKLQlkZXZfY2hhbmdlX2ZsYWdzKGRldiwgZGV2LT5mbGFncyB8IElGRl9VUCk7CisJZXJyID0gZGV2X2NoYW5nZV9mbGFncyhkZXYsIGRldi0+ZmxhZ3MgfCBJRkZfVVApOworCWlmIChlcnIgPCAwKSB7CisJCXJ0bmxfZGVsZXRlX2xpbmsoZGV2KTsKKwkJcnRubF91bmxvY2soKTsKKwkJb3ZzX3Zwb3J0X2ZyZWUodnBvcnQpOworCQlnb3RvIGVycm9yOworCX0KKwogCXJ0bmxfdW5sb2NrKCk7CiAJcmV0dXJuIHZwb3J0OwogZXJyb3I6CmRpZmYgLS1naXQgYS9uZXQvb3BlbnZzd2l0Y2gvdnBvcnQtZ3JlLmMgYi9uZXQvb3BlbnZzd2l0Y2gvdnBvcnQtZ3JlLmMKaW5kZXggN2Y4ODk3Zi4uMGU3MmQ5NSAxMDA2NDQKLS0tIGEvbmV0L29wZW52c3dpdGNoL3Zwb3J0LWdyZS5jCisrKyBiL25ldC9vcGVudnN3aXRjaC92cG9ydC1ncmUuYwpAQCAtNTQsNiArNTQsNyBAQAogCXN0cnVjdCBuZXQgKm5ldCA9IG92c19kcF9nZXRfbmV0KHBhcm1zLT5kcCk7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgdnBvcnQgKnZwb3J0OworCWludCBlcnI7CiAKIAl2cG9ydCA9IG92c192cG9ydF9hbGxvYygwLCAmb3ZzX2dyZV92cG9ydF9vcHMsIHBhcm1zKTsKIAlpZiAoSVNfRVJSKHZwb3J0KSkKQEAgLTY3LDkgKzY4LDE1IEBACiAJCXJldHVybiBFUlJfQ0FTVChkZXYpOwogCX0KIAotCWRldl9jaGFuZ2VfZmxhZ3MoZGV2LCBkZXYtPmZsYWdzIHwgSUZGX1VQKTsKLQlydG5sX3VubG9jaygpOworCWVyciA9IGRldl9jaGFuZ2VfZmxhZ3MoZGV2LCBkZXYtPmZsYWdzIHwgSUZGX1VQKTsKKwlpZiAoZXJyIDwgMCkgeworCQlydG5sX2RlbGV0ZV9saW5rKGRldik7CisJCXJ0bmxfdW5sb2NrKCk7CisJCW92c192cG9ydF9mcmVlKHZwb3J0KTsKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwl9CiAKKwlydG5sX3VubG9jaygpOwogCXJldHVybiB2cG9ydDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL3Zwb3J0LWludGVybmFsX2Rldi5jIGIvbmV0L29wZW52c3dpdGNoL3Zwb3J0LWludGVybmFsX2Rldi5jCmluZGV4IDQzNGUwNGMuLjk1YzM2MTQgMTAwNjQ0Ci0tLSBhL25ldC9vcGVudnN3aXRjaC92cG9ydC1pbnRlcm5hbF9kZXYuYworKysgYi9uZXQvb3BlbnZzd2l0Y2gvdnBvcnQtaW50ZXJuYWxfZGV2LmMKQEAgLTE0MCw3ICsxNDAsNyBAQAogCiBzdGF0aWMgdm9pZCBpbnRlcm5hbF9zZXRfcnhfaGVhZHJvb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19ocikKIHsKLQlkZXYtPm5lZWRlZF9oZWFkcm9vbSA9IG5ld19ocjsKKwlkZXYtPm5lZWRlZF9oZWFkcm9vbSA9IG5ld19ociA8IDAgPyAwIDogbmV3X2hyOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGludGVybmFsX2Rldl9uZXRkZXZfb3BzID0gewpkaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL3Zwb3J0LXZ4bGFuLmMgYi9uZXQvb3BlbnZzd2l0Y2gvdnBvcnQtdnhsYW4uYwppbmRleCA1ZWI3Njk0Li43ZWI5NTVlIDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvdnBvcnQtdnhsYW4uYworKysgYi9uZXQvb3BlbnZzd2l0Y2gvdnBvcnQtdnhsYW4uYwpAQCAtMTMwLDcgKzEzMCwxNCBAQAogCQlyZXR1cm4gRVJSX0NBU1QoZGV2KTsKIAl9CiAKLQlkZXZfY2hhbmdlX2ZsYWdzKGRldiwgZGV2LT5mbGFncyB8IElGRl9VUCk7CisJZXJyID0gZGV2X2NoYW5nZV9mbGFncyhkZXYsIGRldi0+ZmxhZ3MgfCBJRkZfVVApOworCWlmIChlcnIgPCAwKSB7CisJCXJ0bmxfZGVsZXRlX2xpbmsoZGV2KTsKKwkJcnRubF91bmxvY2soKTsKKwkJb3ZzX3Zwb3J0X2ZyZWUodnBvcnQpOworCQlnb3RvIGVycm9yOworCX0KKwogCXJ0bmxfdW5sb2NrKCk7CiAJcmV0dXJuIHZwb3J0OwogZXJyb3I6CmRpZmYgLS1naXQgYS9uZXQvb3BlbnZzd2l0Y2gvdnBvcnQuYyBiL25ldC9vcGVudnN3aXRjaC92cG9ydC5jCmluZGV4IDZiMjFmZDAuLjhmMTk4NDMgMTAwNjQ0Ci0tLSBhL25ldC9vcGVudnN3aXRjaC92cG9ydC5jCisrKyBiL25ldC9vcGVudnN3aXRjaC92cG9ydC5jCkBAIC00ODUsOSArNDg1LDE0IEBACiB7CiAJdW5zaWduZWQgaW50IGxlbmd0aCA9IHNrYi0+bGVuIC0gRVRIX0hMRU47CiAKLQlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF84MDIxUSkpCisJaWYgKHNrYl92bGFuX3RhZ2dlZChza2IpKQogCQlsZW5ndGggLT0gVkxBTl9ITEVOOwogCisJLyogRG9uJ3Qgc3VidHJhY3QgZm9yIG11bHRpcGxlIFZMQU4gdGFncy4gTW9zdCAoYWxsPykgZHJpdmVycyBhbGxvdworCSAqIChFVEhfTEVOICsgVkxBTl9ITEVOKSBpbiBhZGRpdGlvbiB0byB0aGUgbXR1IHZhbHVlLCBidXQgYWxtb3N0IG5vbmUKKwkgKiBhY2NvdW50IGZvciA4MDIuMWFkLiBlLmcuIGlzX3NrYl9mb3J3YXJkYWJsZSgpLgorCSAqLworCiAJcmV0dXJuIGxlbmd0aDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3Jkcy9pYi5oIGIvbmV0L3Jkcy9pYi5oCmluZGV4IDA0NmY3NTAuLjQ1YWM4ZTggMTAwNjQ0Ci0tLSBhL25ldC9yZHMvaWIuaAorKysgYi9uZXQvcmRzL2liLmgKQEAgLTMzMyw2ICszMzMsNyBAQAogdm9pZCByZHNfaWJfc3RhdGVfY2hhbmdlKHN0cnVjdCBzb2NrICpzayk7CiBpbnQgcmRzX2liX2xpc3Rlbl9pbml0KHZvaWQpOwogdm9pZCByZHNfaWJfbGlzdGVuX3N0b3Aodm9pZCk7CitfX3ByaW50ZigyLCAzKQogdm9pZCBfX3Jkc19pYl9jb25uX2Vycm9yKHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubiwgY29uc3QgY2hhciAqLCAuLi4pOwogaW50IHJkc19pYl9jbV9oYW5kbGVfY29ubmVjdChzdHJ1Y3QgcmRtYV9jbV9pZCAqY21faWQsCiAJCQkgICAgIHN0cnVjdCByZG1hX2NtX2V2ZW50ICpldmVudCk7CmRpZmYgLS1naXQgYS9uZXQvcmRzL3Jkcy5oIGIvbmV0L3Jkcy9yZHMuaAppbmRleCBiMmQxN2YwLi5mZDBiY2NiIDEwMDY0NAotLS0gYS9uZXQvcmRzL3Jkcy5oCisrKyBiL25ldC9yZHMvcmRzLmgKQEAgLTY4OCw2ICs2ODgsNyBAQAogI2RlZmluZSByZHNfY29ubl9lcnJvcihjb25uLCBmbXQuLi4pIFwKIAlfX3Jkc19jb25uX2Vycm9yKGNvbm4sIEtFUk5fV0FSTklORyAiUkRTOiAiIGZtdCkKIAorX19wcmludGYoMiwgMykKIHZvaWQgX19yZHNfY29ubl9wYXRoX2Vycm9yKHN0cnVjdCByZHNfY29ubl9wYXRoICpjcCwgY29uc3QgY2hhciAqLCAuLi4pOwogI2RlZmluZSByZHNfY29ubl9wYXRoX2Vycm9yKGNwLCBmbXQuLi4pIFwKIAlfX3Jkc19jb25uX3BhdGhfZXJyb3IoY3AsIEtFUk5fV0FSTklORyAiUkRTOiAiIGZtdCkKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9LY29uZmlnIGIvbmV0L3J4cnBjL0tjb25maWcKaW5kZXggNzg0YzUzMS4uODZmODg1MyAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL0tjb25maWcKKysrIGIvbmV0L3J4cnBjL0tjb25maWcKQEAgLTE5LDYgKzE5LDIwIEBACiAKIAkgIFNlZSBEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcnhycGMudHh0LgogCitjb25maWcgQUZfUlhSUENfSVBWNgorCWJvb2wgIklQdjYgc3VwcG9ydCBmb3IgUnhSUEMiCisJZGVwZW5kcyBvbiAoSVBWNiA9IG0gJiYgQUZfUlhSUEMgPSBtKSB8fCAoSVBWNiA9IHkgJiYgQUZfUlhSUEMpCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBhbGxvdyBBRl9SWFJQQyB0byB1c2UgSVBWNiBVRFAgYXMgd2VsbCBhcyBJUFY0IFVEUCBhcworCSAgaXRzIG5ldHdvcmsgdHJhbnNwb3J0LgorCitjb25maWcgQUZfUlhSUENfSU5KRUNUX0xPU1MKKwlib29sICJJbmplY3QgcGFja2V0IGxvc3MgaW50byBSeFJQQyBwYWNrZXQgc3RyZWFtIgorCWRlcGVuZHMgb24gQUZfUlhSUEMKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluamVjdCBwYWNrZXQgbG9zcyBieSBkaXNjYXJkaW5nIHNvbWUgcmVjZWl2ZWQgYW5kIHNvbWUKKwkgIHRyYW5zbWl0dGVkIHBhY2tldHMuCisKIAogY29uZmlnIEFGX1JYUlBDX0RFQlVHCiAJYm9vbCAiUnhSUEMgZHluYW1pYyBkZWJ1Z2dpbmciCmRpZmYgLS1naXQgYS9uZXQvcnhycGMvTWFrZWZpbGUgYi9uZXQvcnhycGMvTWFrZWZpbGUKaW5kZXggMTBmM2Y0OC4uOGZjNmVhMyAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL01ha2VmaWxlCisrKyBiL25ldC9yeHJwYy9NYWtlZmlsZQpAQCAtMjIsNiArMjIsNyBAQAogCXBlZXJfb2JqZWN0Lm8gXAogCXJlY3Ztc2cubyBcCiAJc2VjdXJpdHkubyBcCisJc2VuZG1zZy5vIFwKIAlza2J1ZmYubyBcCiAJdXRpbHMubwogCmRpZmYgLS1naXQgYS9uZXQvcnhycGMvYWZfcnhycGMuYyBiL25ldC9yeHJwYy9hZl9yeHJwYy5jCmluZGV4IDg4ZWZmYWQuLjQ0YzljMmIgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9hZl9yeHJwYy5jCisrKyBiL25ldC9yeHJwYy9hZl9yeHJwYy5jCkBAIC0xNiwxMiArMTYsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXktdHlwZS5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KKyNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwogI2luY2x1ZGUgImFyLWludGVybmFsLmgiCiAKIE1PRFVMRV9ERVNDUklQVElPTigiUnhSUEMgbmV0d29yayBwcm90b2NvbCIpOwpAQCAtNDMsNyArNDUsNyBAQAogYXRvbWljX3QgcnhycGNfZGVidWdfaWQ7CiAKIC8qIGNvdW50IG9mIHNrYnMgY3VycmVudGx5IGluIHVzZSAqLwotYXRvbWljX3QgcnhycGNfbl9za2JzOworYXRvbWljX3QgcnhycGNfbl90eF9za2JzLCByeHJwY19uX3J4X3NrYnM7CiAKIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpyeHJwY193b3JrcXVldWU7CiAKQEAgLTEwNCwxOSArMTA2LDI1IEBACiAJY2FzZSBBRl9JTkVUOgogCQlpZiAoc3J4LT50cmFuc3BvcnRfbGVuIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJX2RlYnVnKCJJTkVUOiAleCBAICVwSTQiLAotCQkgICAgICAgbnRvaHMoc3J4LT50cmFuc3BvcnQuc2luLnNpbl9wb3J0KSwKLQkJICAgICAgICZzcngtPnRyYW5zcG9ydC5zaW4uc2luX2FkZHIpOwogCQl0YWlsID0gb2Zmc2V0b2Yoc3RydWN0IHNvY2thZGRyX3J4cnBjLCB0cmFuc3BvcnQuc2luLl9fcGFkKTsKIAkJYnJlYWs7CiAKKyNpZmRlZiBDT05GSUdfQUZfUlhSUENfSVBWNgogCWNhc2UgQUZfSU5FVDY6CisJCWlmIChzcngtPnRyYW5zcG9ydF9sZW4gPCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJdGFpbCA9IG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl9yeHJwYywgdHJhbnNwb3J0KSArCisJCQlzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CisJCWJyZWFrOworI2VuZGlmCisKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKIAl9CiAKIAlpZiAodGFpbCA8IGxlbikKIAkJbWVtc2V0KCh2b2lkICopc3J4ICsgdGFpbCwgMCwgbGVuIC0gdGFpbCk7CisJX2RlYnVnKCJJTkVUOiAlcElTcCIsICZzcngtPnRyYW5zcG9ydCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyOCw3ICsxMzYsOCBAQAogCXN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqc3J4ID0gKHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqKXNhZGRyOwogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCByeHJwY19sb2NhbCAqbG9jYWw7Ci0Jc3RydWN0IHJ4cnBjX3NvY2sgKnJ4ID0gcnhycGNfc2soc2spLCAqcHJ4OworCXN0cnVjdCByeHJwY19zb2NrICpyeCA9IHJ4cnBjX3NrKHNrKTsKKwl1MTYgc2VydmljZV9pZCA9IHNyeC0+c3J4X3NlcnZpY2U7CiAJaW50IHJldDsKIAogCV9lbnRlcigiJXAsJXAsJWQiLCByeCwgc2FkZHIsIGxlbik7CkBAIC0xNTIsMTYgKzE2MSwxMyBAQAogCQlnb3RvIGVycm9yX3VubG9jazsKIAl9CiAKLQlpZiAocngtPnNyeC5zcnhfc2VydmljZSkgewotCQl3cml0ZV9sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkocHJ4LCAmbG9jYWwtPnNlcnZpY2VzLCBsaXN0ZW5fbGluaykgewotCQkJaWYgKHByeC0+c3J4LnNyeF9zZXJ2aWNlID09IHJ4LT5zcnguc3J4X3NlcnZpY2UpCi0JCQkJZ290byBzZXJ2aWNlX2luX3VzZTsKLQkJfQotCisJaWYgKHNlcnZpY2VfaWQpIHsKKwkJd3JpdGVfbG9jaygmbG9jYWwtPnNlcnZpY2VzX2xvY2spOworCQlpZiAocmN1X2FjY2Vzc19wb2ludGVyKGxvY2FsLT5zZXJ2aWNlKSkKKwkJCWdvdG8gc2VydmljZV9pbl91c2U7CiAJCXJ4LT5sb2NhbCA9IGxvY2FsOwotCQlsaXN0X2FkZF90YWlsKCZyeC0+bGlzdGVuX2xpbmssICZsb2NhbC0+c2VydmljZXMpOwotCQl3cml0ZV91bmxvY2tfYmgoJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGxvY2FsLT5zZXJ2aWNlLCByeCk7CisJCXdyaXRlX3VubG9jaygmbG9jYWwtPnNlcnZpY2VzX2xvY2spOwogCiAJCXJ4LT5zay5za19zdGF0ZSA9IFJYUlBDX1NFUlZFUl9CT1VORDsKIAl9IGVsc2UgewpAQCAtMTc0LDcgKzE4MCw3IEBACiAJcmV0dXJuIDA7CiAKIHNlcnZpY2VfaW5fdXNlOgotCXdyaXRlX3VubG9ja19iaCgmbG9jYWwtPnNlcnZpY2VzX2xvY2spOworCXdyaXRlX3VubG9jaygmbG9jYWwtPnNlcnZpY2VzX2xvY2spOwogCXJ4cnBjX3B1dF9sb2NhbChsb2NhbCk7CiAJcmV0ID0gLUVBRERSSU5VU0U7CiBlcnJvcl91bmxvY2s6CkBAIC0xOTEsNyArMTk3LDcgQEAKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3QgcnhycGNfc29jayAqcnggPSByeHJwY19zayhzayk7Ci0JdW5zaWduZWQgaW50IG1heDsKKwl1bnNpZ25lZCBpbnQgbWF4LCBvbGQ7CiAJaW50IHJldDsKIAogCV9lbnRlcigiJXAsJWQiLCByeCwgYmFja2xvZyk7CkBAIC0yMTAsOSArMjE2LDEzIEBACiAJCQliYWNrbG9nID0gbWF4OwogCQllbHNlIGlmIChiYWNrbG9nIDwgMCB8fCBiYWNrbG9nID4gbWF4KQogCQkJYnJlYWs7CisJCW9sZCA9IHNrLT5za19tYXhfYWNrX2JhY2tsb2c7CiAJCXNrLT5za19tYXhfYWNrX2JhY2tsb2cgPSBiYWNrbG9nOwotCQlyeC0+c2suc2tfc3RhdGUgPSBSWFJQQ19TRVJWRVJfTElTVEVOSU5HOwotCQlyZXQgPSAwOworCQlyZXQgPSByeHJwY19zZXJ2aWNlX3ByZWFsbG9jKHJ4LCBHRlBfS0VSTkVMKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJcngtPnNrLnNrX3N0YXRlID0gUlhSUENfU0VSVkVSX0xJU1RFTklORzsKKwkJZWxzZQorCQkJc2stPnNrX21heF9hY2tfYmFja2xvZyA9IG9sZDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVCVVNZOwpAQCAtMjMwLDYgKzI0MCw4IEBACiAgKiBAc3J4OiBUaGUgYWRkcmVzcyBvZiB0aGUgcGVlciB0byBjb250YWN0CiAgKiBAa2V5OiBUaGUgc2VjdXJpdHkgY29udGV4dCB0byB1c2UgKGRlZmF1bHRzIHRvIHNvY2tldCBzZXR0aW5nKQogICogQHVzZXJfY2FsbF9JRDogVGhlIElEIHRvIHVzZQorICogQGdmcDogVGhlIGFsbG9jYXRpb24gY29uc3RyYWludHMKKyAqIEBub3RpZnlfcng6IFdoZXJlIHRvIHNlbmQgbm90aWZpY2F0aW9ucyBpbnN0ZWFkIG9mIHNvY2tldCBxdWV1ZQogICoKICAqIEFsbG93IGEga2VybmVsIHNlcnZpY2UgdG8gYmVnaW4gYSBjYWxsIG9uIHRoZSBub21pbmF0ZWQgc29ja2V0LiAgVGhpcyBqdXN0CiAgKiBzZXRzIHVwIGFsbCB0aGUgaW50ZXJuYWwgdHJhY2tpbmcgc3RydWN0dXJlcyBhbmQgYWxsb2NhdGVzIGNvbm5lY3Rpb24gYW5kCkBAIC0yNDIsNyArMjU0LDggQEAKIAkJCQkJICAgc3RydWN0IHNvY2thZGRyX3J4cnBjICpzcngsCiAJCQkJCSAgIHN0cnVjdCBrZXkgKmtleSwKIAkJCQkJICAgdW5zaWduZWQgbG9uZyB1c2VyX2NhbGxfSUQsCi0JCQkJCSAgIGdmcF90IGdmcCkKKwkJCQkJICAgZ2ZwX3QgZ2ZwLAorCQkJCQkgICByeHJwY19ub3RpZnlfcnhfdCBub3RpZnlfcngpCiB7CiAJc3RydWN0IHJ4cnBjX2Nvbm5fcGFyYW1ldGVycyBjcDsKIAlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKQEAgLTI2OSw2ICsyODIsOCBAQAogCWNwLmV4Y2x1c2l2ZQkJPSBmYWxzZTsKIAljcC5zZXJ2aWNlX2lkCQk9IHNyeC0+c3J4X3NlcnZpY2U7CiAJY2FsbCA9IHJ4cnBjX25ld19jbGllbnRfY2FsbChyeCwgJmNwLCBzcngsIHVzZXJfY2FsbF9JRCwgZ2ZwKTsKKwlpZiAoIUlTX0VSUihjYWxsKSkKKwkJY2FsbC0+bm90aWZ5X3J4ID0gbm90aWZ5X3J4OwogCiAJcmVsZWFzZV9zb2NrKCZyeC0+c2spOwogCV9sZWF2ZSgiID0gJXAiLCBjYWxsKTsKQEAgLTI3OCw0MCArMjkzLDM5IEBACiAKIC8qKgogICogcnhycGNfa2VybmVsX2VuZF9jYWxsIC0gQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBlbmQgYSBjYWxsIGl0IHdhcyB1c2luZworICogQHNvY2s6IFRoZSBzb2NrZXQgdGhlIGNhbGwgaXMgb24KICAqIEBjYWxsOiBUaGUgY2FsbCB0byBlbmQKICAqCiAgKiBBbGxvdyBhIGtlcm5lbCBzZXJ2aWNlIHRvIGVuZCBhIGNhbGwgaXQgd2FzIHVzaW5nLiAgVGhlIGNhbGwgbXVzdCBiZQogICogY29tcGxldGUgYmVmb3JlIHRoaXMgaXMgY2FsbGVkICh0aGUgY2FsbCBzaG91bGQgYmUgYWJvcnRlZCBpZiBuZWNlc3NhcnkpLgogICovCi12b2lkIHJ4cnBjX2tlcm5lbF9lbmRfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3ZvaWQgcnhycGNfa2VybmVsX2VuZF9jYWxsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQogewogCV9lbnRlcigiJWR7JWR9IiwgY2FsbC0+ZGVidWdfaWQsIGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSkpOwotCXJ4cnBjX3JlbW92ZV91c2VyX0lEKGNhbGwtPnNvY2tldCwgY2FsbCk7Ci0JcnhycGNfcHV0X2NhbGwoY2FsbCk7CisJcnhycGNfcmVsZWFzZV9jYWxsKHJ4cnBjX3NrKHNvY2stPnNrKSwgY2FsbCk7CisJcnhycGNfcHV0X2NhbGwoY2FsbCwgcnhycGNfY2FsbF9wdXRfa2VybmVsKTsKIH0KIEVYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2VuZF9jYWxsKTsKIAogLyoqCi0gKiByeHJwY19rZXJuZWxfaW50ZXJjZXB0X3J4X21lc3NhZ2VzIC0gSW50ZXJjZXB0IHJlY2VpdmVkIFJ4UlBDIG1lc3NhZ2VzCisgKiByeHJwY19rZXJuZWxfbmV3X2NhbGxfbm90aWZpY2F0aW9uIC0gR2V0IG5vdGlmaWNhdGlvbnMgb2YgbmV3IGNhbGxzCiAgKiBAc29jazogVGhlIHNvY2tldCB0byBpbnRlcmNlcHQgcmVjZWl2ZWQgbWVzc2FnZXMgb24KLSAqIEBpbnRlcmNlcHRvcjogVGhlIGZ1bmN0aW9uIHRvIHBhc3MgdGhlIG1lc3NhZ2VzIHRvCisgKiBAbm90aWZ5X25ld19jYWxsOiBGdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBuZXcgY2FsbHMgYXBwZWFyCisgKiBAZGlzY2FyZF9uZXdfY2FsbDogRnVuY3Rpb24gdG8gZGlzY2FyZCBwcmVhbGxvY2F0ZWQgY2FsbHMKICAqCi0gKiBBbGxvdyBhIGtlcm5lbCBzZXJ2aWNlIHRvIGludGVyY2VwdCBtZXNzYWdlcyBoZWFkaW5nIGZvciB0aGUgUnggcXVldWUgb24gYW4KLSAqIFJ4UlBDIHNvY2tldC4gIFRoZXkgZ2V0IHBhc3NlZCB0byB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGluc3RlYWQuCi0gKiBAaW50ZXJjZXB0b3Igc2hvdWxkIGZyZWUgdGhlIHNvY2tldCBidWZmZXJzIGl0IGlzIGdpdmVuLiAgQGludGVyY2VwdG9yIGlzCi0gKiBjYWxsZWQgd2l0aCB0aGUgc29ja2V0IHJlY2VpdmUgcXVldWUgc3BpbmxvY2sgaGVsZCBhbmQgc29mdGlycXMgZGlzYWJsZWQgLQotICogdGhpcyBlbnN1cmVzIHRoYXQgdGhlIG1lc3NhZ2VzIHdpbGwgYmUgZGVsaXZlcmVkIGluIHRoZSByaWdodCBvcmRlci4KKyAqIEFsbG93IGEga2VybmVsIHNlcnZpY2UgdG8gYmUgZ2l2ZW4gbm90aWZpY2F0aW9ucyBhYm91dCBuZXcgY2FsbHMuCiAgKi8KLXZvaWQgcnhycGNfa2VybmVsX2ludGVyY2VwdF9yeF9tZXNzYWdlcyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJCQlyeHJwY19pbnRlcmNlcHRvcl90IGludGVyY2VwdG9yKQordm9pZCByeHJwY19rZXJuZWxfbmV3X2NhbGxfbm90aWZpY2F0aW9uKAorCXN0cnVjdCBzb2NrZXQgKnNvY2ssCisJcnhycGNfbm90aWZ5X25ld19jYWxsX3Qgbm90aWZ5X25ld19jYWxsLAorCXJ4cnBjX2Rpc2NhcmRfbmV3X2NhbGxfdCBkaXNjYXJkX25ld19jYWxsKQogewogCXN0cnVjdCByeHJwY19zb2NrICpyeCA9IHJ4cnBjX3NrKHNvY2stPnNrKTsKIAotCV9lbnRlcigiIik7Ci0JcngtPmludGVyY2VwdG9yID0gaW50ZXJjZXB0b3I7CisJcngtPm5vdGlmeV9uZXdfY2FsbCA9IG5vdGlmeV9uZXdfY2FsbDsKKwlyeC0+ZGlzY2FyZF9uZXdfY2FsbCA9IGRpc2NhcmRfbmV3X2NhbGw7CiB9Ci0KLUVYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2ludGVyY2VwdF9yeF9tZXNzYWdlcyk7CitFWFBPUlRfU1lNQk9MKHJ4cnBjX2tlcm5lbF9uZXdfY2FsbF9ub3RpZmljYXRpb24pOwogCiAvKgogICogY29ubmVjdCBhbiBSeFJQQyBzb2NrZXQKQEAgLTM5MSw2ICs0MDUsMjMgQEAKIAogCXN3aXRjaCAocngtPnNrLnNrX3N0YXRlKSB7CiAJY2FzZSBSWFJQQ19VTkJPVU5EOgorCQlyeC0+c3J4LnNyeF9mYW1pbHkgPSBBRl9SWFJQQzsKKwkJcngtPnNyeC5zcnhfc2VydmljZSA9IDA7CisJCXJ4LT5zcngudHJhbnNwb3J0X3R5cGUgPSBTT0NLX0RHUkFNOworCQlyeC0+c3J4LnRyYW5zcG9ydC5mYW1pbHkgPSByeC0+ZmFtaWx5OworCQlzd2l0Y2ggKHJ4LT5mYW1pbHkpIHsKKwkJY2FzZSBBRl9JTkVUOgorCQkJcngtPnNyeC50cmFuc3BvcnRfbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJCQlicmVhazsKKyNpZmRlZiBDT05GSUdfQUZfUlhSUENfSVBWNgorCQljYXNlIEFGX0lORVQ2OgorCQkJcngtPnNyeC50cmFuc3BvcnRfbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworCQkJYnJlYWs7CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FQUZOT1NVUFBPUlQ7CisJCQlnb3RvIGVycm9yX3VubG9jazsKKwkJfQogCQlsb2NhbCA9IHJ4cnBjX2xvb2t1cF9sb2NhbCgmcngtPnNyeCk7CiAJCWlmIChJU19FUlIobG9jYWwpKSB7CiAJCQlyZXQgPSBQVFJfRVJSKGxvY2FsKTsKQEAgLTUwNSwxNSArNTM2LDE2IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IHJ4cnBjX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCiAJCQkgICAgICAgcG9sbF90YWJsZSAqd2FpdCkKIHsKLQl1bnNpZ25lZCBpbnQgbWFzazsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgcnhycGNfc29jayAqcnggPSByeHJwY19zayhzayk7CisJdW5zaWduZWQgaW50IG1hc2s7CiAKIAlzb2NrX3BvbGxfd2FpdChmaWxlLCBza19zbGVlcChzayksIHdhaXQpOwogCW1hc2sgPSAwOwogCiAJLyogdGhlIHNvY2tldCBpcyByZWFkYWJsZSBpZiB0aGVyZSBhcmUgYW55IG1lc3NhZ2VzIHdhaXRpbmcgb24gdGhlIFJ4CiAJICogcXVldWUgKi8KLQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3JlY2VpdmVfcXVldWUpKQorCWlmICghbGlzdF9lbXB0eSgmcngtPnJlY3Ztc2dfcSkpCiAJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKIAogCS8qIHRoZSBzb2NrZXQgaXMgd3JpdGFibGUgaWYgdGhlcmUgaXMgc3BhY2UgdG8gYWRkIG5ldyBkYXRhIHRvIHRoZQpAQCAtNTQwLDcgKzU3Miw4IEBACiAJCXJldHVybiAtRUFGTk9TVVBQT1JUOwogCiAJLyogd2Ugc3VwcG9ydCB0cmFuc3BvcnQgcHJvdG9jb2wgVURQL1VEUDYgb25seSAqLwotCWlmIChwcm90b2NvbCAhPSBQRl9JTkVUKQorCWlmIChwcm90b2NvbCAhPSBQRl9JTkVUICYmCisJICAgIElTX0VOQUJMRUQoQ09ORklHX0FGX1JYUlBDX0lQVjYpICYmIHByb3RvY29sICE9IFBGX0lORVQ2KQogCQlyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKIAogCWlmIChzb2NrLT50eXBlICE9IFNPQ0tfREdSQU0pCkBAIC01NTQsNiArNTg3LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlzb2NrX2luaXRfZGF0YShzb2NrLCBzayk7CisJc29ja19zZXRfZmxhZyhzaywgU09DS19SQ1VfRlJFRSk7CiAJc2stPnNrX3N0YXRlCQk9IFJYUlBDX1VOQk9VTkQ7CiAJc2stPnNrX3dyaXRlX3NwYWNlCT0gcnhycGNfd3JpdGVfc3BhY2U7CiAJc2stPnNrX21heF9hY2tfYmFja2xvZwk9IDA7CkBAIC01NjMsOSArNTk3LDExIEBACiAJcngtPmZhbWlseSA9IHByb3RvY29sOwogCXJ4LT5jYWxscyA9IFJCX1JPT1Q7CiAKLQlJTklUX0xJU1RfSEVBRCgmcngtPmxpc3Rlbl9saW5rKTsKLQlJTklUX0xJU1RfSEVBRCgmcngtPnNlY3VyZXEpOwotCUlOSVRfTElTVF9IRUFEKCZyeC0+YWNjZXB0cSk7CisJc3Bpbl9sb2NrX2luaXQoJnJ4LT5pbmNvbWluZ19sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmcngtPnNvY2tfY2FsbHMpOworCUlOSVRfTElTVF9IRUFEKCZyeC0+dG9fYmVfYWNjZXB0ZWQpOworCUlOSVRfTElTVF9IRUFEKCZyeC0+cmVjdm1zZ19xKTsKKwlyd2xvY2tfaW5pdCgmcngtPnJlY3Ztc2dfbG9jayk7CiAJcndsb2NrX2luaXQoJnJ4LT5jYWxsX2xvY2spOwogCW1lbXNldCgmcngtPnNyeCwgMCwgc2l6ZW9mKHJ4LT5zcngpKTsKIApAQCAtNTc0LDYgKzYxMCwzOSBAQAogfQogCiAvKgorICogS2lsbCBhbGwgdGhlIGNhbGxzIG9uIGEgc29ja2V0IGFuZCBzaHV0IGl0IGRvd24uCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfc2h1dGRvd24oc3RydWN0IHNvY2tldCAqc29jaywgaW50IGZsYWdzKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCByeHJwY19zb2NrICpyeCA9IHJ4cnBjX3NrKHNrKTsKKwlpbnQgcmV0ID0gMDsKKworCV9lbnRlcigiJXAsJWQiLCBzaywgZmxhZ3MpOworCisJaWYgKGZsYWdzICE9IFNIVVRfUkRXUikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmIChzay0+c2tfc3RhdGUgPT0gUlhSUENfQ0xPU0UpCisJCXJldHVybiAtRVNIVVRET1dOOworCisJbG9ja19zb2NrKHNrKTsKKworCXNwaW5fbG9ja19iaCgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7CisJaWYgKHNrLT5za19zdGF0ZSA8IFJYUlBDX0NMT1NFKSB7CisJCXNrLT5za19zdGF0ZSA9IFJYUlBDX0NMT1NFOworCQlzay0+c2tfc2h1dGRvd24gPSBTSFVURE9XTl9NQVNLOworCX0gZWxzZSB7CisJCXJldCA9IC1FU0hVVERPV047CisJfQorCXNwaW5fdW5sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKworCXJ4cnBjX2Rpc2NhcmRfcHJlYWxsb2MocngpOworCisJcmVsZWFzZV9zb2NrKHNrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgogICogUnhSUEMgc29ja2V0IGRlc3RydWN0b3IKICAqLwogc3RhdGljIHZvaWQgcnhycGNfc29ja19kZXN0cnVjdG9yKHN0cnVjdCBzb2NrICpzaykKQEAgLTYwOSwxNSArNjc4LDE0IEBACiAJc2stPnNrX3N0YXRlID0gUlhSUENfQ0xPU0U7CiAJc3Bpbl91bmxvY2tfYmgoJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOwogCi0JQVNTRVJUQ01QKHJ4LT5saXN0ZW5fbGluay5uZXh0LCAhPSwgTElTVF9QT0lTT04xKTsKLQotCWlmICghbGlzdF9lbXB0eSgmcngtPmxpc3Rlbl9saW5rKSkgewotCQl3cml0ZV9sb2NrX2JoKCZyeC0+bG9jYWwtPnNlcnZpY2VzX2xvY2spOwotCQlsaXN0X2RlbCgmcngtPmxpc3Rlbl9saW5rKTsKLQkJd3JpdGVfdW5sb2NrX2JoKCZyeC0+bG9jYWwtPnNlcnZpY2VzX2xvY2spOworCWlmIChyeC0+bG9jYWwgJiYgcngtPmxvY2FsLT5zZXJ2aWNlID09IHJ4KSB7CisJCXdyaXRlX2xvY2soJnJ4LT5sb2NhbC0+c2VydmljZXNfbG9jayk7CisJCXJ4LT5sb2NhbC0+c2VydmljZSA9IE5VTEw7CisJCXdyaXRlX3VubG9jaygmcngtPmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKIAl9CiAKIAkvKiB0cnkgdG8gZmx1c2ggb3V0IHRoaXMgc29ja2V0ICovCisJcnhycGNfZGlzY2FyZF9wcmVhbGxvYyhyeCk7CiAJcnhycGNfcmVsZWFzZV9jYWxsc19vbl9zb2NrZXQocngpOwogCWZsdXNoX3dvcmtxdWV1ZShyeHJwY193b3JrcXVldWUpOwogCXJ4cnBjX3B1cmdlX3F1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CkBAIC02NjYsNyArNzM0LDcgQEAKIAkucG9sbAkJPSByeHJwY19wb2xsLAogCS5pb2N0bAkJPSBzb2NrX25vX2lvY3RsLAogCS5saXN0ZW4JCT0gcnhycGNfbGlzdGVuLAotCS5zaHV0ZG93bgk9IHNvY2tfbm9fc2h1dGRvd24sCisJLnNodXRkb3duCT0gcnhycGNfc2h1dGRvd24sCiAJLnNldHNvY2tvcHQJPSByeHJwY19zZXRzb2Nrb3B0LAogCS5nZXRzb2Nrb3B0CT0gc29ja19ub19nZXRzb2Nrb3B0LAogCS5zZW5kbXNnCT0gcnhycGNfc2VuZG1zZywKQEAgLTY5Nyw3ICs3NjUsMTMgQEAKIAogCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IHJ4cnBjX3NrYl9wcml2KSA+IEZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwgY2IpKTsKIAotCXJ4cnBjX2Vwb2NoID0gZ2V0X3NlY29uZHMoKTsKKwlnZXRfcmFuZG9tX2J5dGVzKCZyeHJwY19lcG9jaCwgc2l6ZW9mKHJ4cnBjX2Vwb2NoKSk7CisJcnhycGNfZXBvY2ggfD0gUlhSUENfUkFORE9NX0VQT0NIOworCWdldF9yYW5kb21fYnl0ZXMoJnJ4cnBjX2NsaWVudF9jb25uX2lkcy5jdXIsCisJCQkgc2l6ZW9mKHJ4cnBjX2NsaWVudF9jb25uX2lkcy5jdXIpKTsKKwlyeHJwY19jbGllbnRfY29ubl9pZHMuY3VyICY9IDB4M2ZmZmZmZmY7CisJaWYgKHJ4cnBjX2NsaWVudF9jb25uX2lkcy5jdXIgPT0gMCkKKwkJcnhycGNfY2xpZW50X2Nvbm5faWRzLmN1ciA9IDE7CiAKIAlyZXQgPSAtRU5PTUVNOwogCXJ4cnBjX2NhbGxfamFyID0ga21lbV9jYWNoZV9jcmVhdGUoCkBAIC03ODgsNyArODYyLDggQEAKIAlwcm90b191bnJlZ2lzdGVyKCZyeHJwY19wcm90byk7CiAJcnhycGNfZGVzdHJveV9hbGxfY2FsbHMoKTsKIAlyeHJwY19kZXN0cm95X2FsbF9jb25uZWN0aW9ucygpOwotCUFTU0VSVENNUChhdG9taWNfcmVhZCgmcnhycGNfbl9za2JzKSwgPT0sIDApOworCUFTU0VSVENNUChhdG9taWNfcmVhZCgmcnhycGNfbl90eF9za2JzKSwgPT0sIDApOworCUFTU0VSVENNUChhdG9taWNfcmVhZCgmcnhycGNfbl9yeF9za2JzKSwgPT0sIDApOwogCXJ4cnBjX2Rlc3Ryb3lfYWxsX2xvY2FscygpOwogCiAJcmVtb3ZlX3Byb2NfZW50cnkoInJ4cnBjX2Nvbm5zIiwgaW5pdF9uZXQucHJvY19uZXQpOwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLWludGVybmFsLmggYi9uZXQvcnhycGMvYXItaW50ZXJuYWwuaAppbmRleCAxYmI5ZTdhLi5kMzhkZmZkIDEwMDY0NAotLS0gYS9uZXQvcnhycGMvYXItaW50ZXJuYWwuaAorKysgYi9uZXQvcnhycGMvYXItaW50ZXJuYWwuaApAQCAtMzUsMTEgKzM1LDIzIEBACiAjZGVmaW5lIHJ4cnBjX3F1ZXVlX2RlbGF5ZWRfd29yayhXUyxEKQlcCiAJcXVldWVfZGVsYXllZF93b3JrKHJ4cnBjX3dvcmtxdWV1ZSwgKFdTKSwgKEQpKQogCi0jZGVmaW5lIHJ4cnBjX3F1ZXVlX2NhbGwoQ0FMTCkJcnhycGNfcXVldWVfd29yaygmKENBTEwpLT5wcm9jZXNzb3IpCi0KIHN0cnVjdCByeHJwY19jb25uZWN0aW9uOwogCiAvKgorICogTWFyayBhcHBsaWVkIHRvIHNvY2tldCBidWZmZXJzLgorICovCitlbnVtIHJ4cnBjX3NrYl9tYXJrIHsKKwlSWFJQQ19TS0JfTUFSS19EQVRBLAkJLyogZGF0YSBtZXNzYWdlICovCisJUlhSUENfU0tCX01BUktfRklOQUxfQUNLLAkvKiBmaW5hbCBBQ0sgcmVjZWl2ZWQgbWVzc2FnZSAqLworCVJYUlBDX1NLQl9NQVJLX0JVU1ksCQkvKiBzZXJ2ZXIgYnVzeSBtZXNzYWdlICovCisJUlhSUENfU0tCX01BUktfUkVNT1RFX0FCT1JULAkvKiByZW1vdGUgYWJvcnQgbWVzc2FnZSAqLworCVJYUlBDX1NLQl9NQVJLX0xPQ0FMX0FCT1JULAkvKiBsb2NhbCBhYm9ydCBtZXNzYWdlICovCisJUlhSUENfU0tCX01BUktfTkVUX0VSUk9SLAkvKiBuZXR3b3JrIGVycm9yIG1lc3NhZ2UgKi8KKwlSWFJQQ19TS0JfTUFSS19MT0NBTF9FUlJPUiwJLyogbG9jYWwgZXJyb3IgbWVzc2FnZSAqLworCVJYUlBDX1NLQl9NQVJLX05FV19DQUxMLAkvKiBsb2NhbCBlcnJvciBtZXNzYWdlICovCit9OworCisvKgogICogc2tfc3RhdGUgZm9yIFJ4UlBDIHNvY2tldHMKICAqLwogZW51bSB7CkBAIC01MiwxOSArNjQsNDQgQEAKIH07CiAKIC8qCisgKiBTZXJ2aWNlIGJhY2tsb2cgcHJlYWxsb2NhdGlvbi4KKyAqCisgKiBUaGlzIGNvbnRhaW5zIGNpcmN1bGFyIGJ1ZmZlcnMgb2YgcHJlYWxsb2NhdGVkIHBlZXJzLCBjb25uZWN0aW9ucyBhbmQgY2FsbHMKKyAqIGZvciBpbmNvbWluZyBzZXJ2aWNlIGNhbGxzIGFuZCB0aGVpciBoZWFkIGFuZCB0YWlsIHBvaW50ZXJzLiAgVGhpcyBhbGxvd3MKKyAqIGNhbGxzIHRvIGJlIHNldCB1cCBpbiB0aGUgZGF0YV9yZWFkeSBoYW5kbGVyLCB0aGVyZWJ5IGF2b2lkaW5nIHRoZSBuZWVkIHRvCisgKiBzaHVmZmxlIHBhY2tldHMgYXJvdW5kIHNvIG11Y2guCisgKi8KK3N0cnVjdCByeHJwY19iYWNrbG9nIHsKKwl1bnNpZ25lZCBzaG9ydAkJcGVlcl9iYWNrbG9nX2hlYWQ7CisJdW5zaWduZWQgc2hvcnQJCXBlZXJfYmFja2xvZ190YWlsOworCXVuc2lnbmVkIHNob3J0CQljb25uX2JhY2tsb2dfaGVhZDsKKwl1bnNpZ25lZCBzaG9ydAkJY29ubl9iYWNrbG9nX3RhaWw7CisJdW5zaWduZWQgc2hvcnQJCWNhbGxfYmFja2xvZ19oZWFkOworCXVuc2lnbmVkIHNob3J0CQljYWxsX2JhY2tsb2dfdGFpbDsKKyNkZWZpbmUgUlhSUENfQkFDS0xPR19NQVgJMzIKKwlzdHJ1Y3QgcnhycGNfcGVlcgkqcGVlcl9iYWNrbG9nW1JYUlBDX0JBQ0tMT0dfTUFYXTsKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbgkqY29ubl9iYWNrbG9nW1JYUlBDX0JBQ0tMT0dfTUFYXTsKKwlzdHJ1Y3QgcnhycGNfY2FsbAkqY2FsbF9iYWNrbG9nW1JYUlBDX0JBQ0tMT0dfTUFYXTsKK307CisKKy8qCiAgKiBSeFJQQyBzb2NrZXQgZGVmaW5pdGlvbgogICovCiBzdHJ1Y3QgcnhycGNfc29jayB7CiAJLyogV0FSTklORzogc2sgaGFzIHRvIGJlIHRoZSBmaXJzdCBtZW1iZXIgKi8KIAlzdHJ1Y3Qgc29jawkJc2s7Ci0JcnhycGNfaW50ZXJjZXB0b3JfdAlpbnRlcmNlcHRvcjsJLyoga2VybmVsIHNlcnZpY2UgUnggaW50ZXJjZXB0b3IgZnVuY3Rpb24gKi8KKwlyeHJwY19ub3RpZnlfbmV3X2NhbGxfdAlub3RpZnlfbmV3X2NhbGw7IC8qIEZ1bmMgdG8gbm90aWZ5IG9mIG5ldyBjYWxsICovCisJcnhycGNfZGlzY2FyZF9uZXdfY2FsbF90IGRpc2NhcmRfbmV3X2NhbGw7IC8qIEZ1bmMgdG8gZGlzY2FyZCBhIG5ldyBjYWxsICovCiAJc3RydWN0IHJ4cnBjX2xvY2FsCSpsb2NhbDsJCS8qIGxvY2FsIGVuZHBvaW50ICovCi0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0ZW5fbGluazsJLyogbGluayBpbiB0aGUgbG9jYWwgZW5kcG9pbnQncyBsaXN0ZW4gbGlzdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQJc2VjdXJlcTsJLyogY2FsbHMgYXdhaXRpbmcgY29ubmVjdGlvbiBzZWN1cml0eSBjbGVhcmFuY2UgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCWFjY2VwdHE7CS8qIGNhbGxzIGF3YWl0aW5nIGFjY2VwdGFuY2UgKi8KKwlzdHJ1Y3QgcnhycGNfYmFja2xvZwkqYmFja2xvZzsJLyogUHJlYWxsb2NhdGlvbiBmb3Igc2VydmljZXMgKi8KKwlzcGlubG9ja190CQlpbmNvbWluZ19sb2NrOwkvKiBJbmNvbWluZyBjYWxsIHZzIHNlcnZpY2Ugc2h1dGRvd24gbG9jayAqLworCXN0cnVjdCBsaXN0X2hlYWQJc29ja19jYWxsczsJLyogTGlzdCBvZiBjYWxscyBvd25lZCBieSB0aGlzIHNvY2tldCAqLworCXN0cnVjdCBsaXN0X2hlYWQJdG9fYmVfYWNjZXB0ZWQ7CS8qIGNhbGxzIGF3YWl0aW5nIGFjY2VwdGFuY2UgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXJlY3Ztc2dfcTsJLyogQ2FsbHMgYXdhaXRpbmcgcmVjdm1zZydzIGF0dGVudGlvbiAgKi8KKwlyd2xvY2tfdAkJcmVjdm1zZ19sb2NrOwkvKiBMb2NrIGZvciByZWN2bXNnX3EgKi8KIAlzdHJ1Y3Qga2V5CQkqa2V5OwkJLyogc2VjdXJpdHkgZm9yIHRoaXMgc29ja2V0ICovCiAJc3RydWN0IGtleQkJKnNlY3VyaXRpZXM7CS8qIGxpc3Qgb2Ygc2VydmVyIHNlY3VyaXR5IGRlc2NyaXB0b3JzICovCi0Jc3RydWN0IHJiX3Jvb3QJCWNhbGxzOwkJLyogb3V0c3RhbmRpbmcgY2FsbHMgb24gdGhpcyBzb2NrZXQgKi8KKwlzdHJ1Y3QgcmJfcm9vdAkJY2FsbHM7CQkvKiBVc2VyIElEIC0+IGNhbGwgbWFwcGluZyAqLwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogI2RlZmluZSBSWFJQQ19TT0NLX0NPTk5FQ1RFRAkJMAkvKiBjb25uZWN0X3NyeCBpcyBzZXQgKi8KIAlyd2xvY2tfdAkJY2FsbF9sb2NrOwkvKiBsb2NrIGZvciBjYWxscyAqLwpAQCAtMTAzLDEzICsxNDAsMTEgQEAKICAqIC0gbWF4IDQ4IGJ5dGVzIChzdHJ1Y3Qgc2tfYnVmZjo6Y2IpCiAgKi8KIHN0cnVjdCByeHJwY19za2JfcHJpdiB7Ci0Jc3RydWN0IHJ4cnBjX2NhbGwJKmNhbGw7CQkvKiBjYWxsIHdpdGggd2hpY2ggYXNzb2NpYXRlZCAqLwotCXVuc2lnbmVkIGxvbmcJCXJlc2VuZF9hdDsJLyogdGltZSBpbiBqaWZmaWVzIGF0IHdoaWNoIHRvIHJlc2VuZCAqLwogCXVuaW9uIHsKLQkJdW5zaWduZWQgaW50CW9mZnNldDsJCS8qIG9mZnNldCBpbnRvIGJ1ZmZlciBvZiBuZXh0IHJlYWQgKi8KKwkJdTgJCW5yX2p1bWJvOwkvKiBOdW1iZXIgb2YganVtYm8gc3VicGFja2V0cyAqLworCX07CisJdW5pb24gewogCQlpbnQJCXJlbWFpbjsJCS8qIGFtb3VudCBvZiBzcGFjZSByZW1haW5pbmcgZm9yIG5leHQgd3JpdGUgKi8KLQkJdTMyCQllcnJvcjsJCS8qIG5ldHdvcmsgZXJyb3IgY29kZSAqLwotCQlib29sCQluZWVkX3Jlc2VuZDsJLyogVCBpZiBuZWVkcyByZXNlbmRpbmcgKi8KIAl9OwogCiAJc3RydWN0IHJ4cnBjX2hvc3RfaGVhZGVyIGhkcjsJCS8qIFJ4UlBDIHBhY2tldCBoZWFkZXIgZnJvbSB0aGlzIHBhY2tldCAqLwpAQCAtMTE3LDEzICsxNTIsNiBAQAogCiAjZGVmaW5lIHJ4cnBjX3NrYihfX3NrYikgKChzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKikgJihfX3NrYiktPmNiKQogCi1lbnVtIHJ4cnBjX2NvbW1hbmQgewotCVJYUlBDX0NNRF9TRU5EX0RBVEEsCQkvKiBzZW5kIGRhdGEgbWVzc2FnZSAqLwotCVJYUlBDX0NNRF9TRU5EX0FCT1JULAkJLyogcmVxdWVzdCBhYm9ydCBnZW5lcmF0aW9uICovCi0JUlhSUENfQ01EX0FDQ0VQVCwJCS8qIFtzZXJ2ZXJdIGFjY2VwdCBpbmNvbWluZyBjYWxsICovCi0JUlhSUENfQ01EX1JFSkVDVF9CVVNZLAkJLyogW3NlcnZlcl0gcmVqZWN0IGEgY2FsbCBhcyBidXN5ICovCi19OwotCiAvKgogICogUnhSUEMgc2VjdXJpdHkgbW9kdWxlIGludGVyZmFjZQogICovCkBAIC0xNTAsNyArMTc4LDEyIEBACiAJCQkgICAgIHZvaWQgKik7CiAKIAkvKiB2ZXJpZnkgdGhlIHNlY3VyaXR5IG9uIGEgcmVjZWl2ZWQgcGFja2V0ICovCi0JaW50ICgqdmVyaWZ5X3BhY2tldCkoc3RydWN0IHJ4cnBjX2NhbGwgKiwgc3RydWN0IHNrX2J1ZmYgKiwgdTMyICopOworCWludCAoKnZlcmlmeV9wYWNrZXQpKHN0cnVjdCByeHJwY19jYWxsICosIHN0cnVjdCBza19idWZmICosCisJCQkgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCByeHJwY19zZXFfdCwgdTE2KTsKKworCS8qIExvY2F0ZSB0aGUgZGF0YSBpbiBhIHJlY2VpdmVkIHBhY2tldCB0aGF0IGhhcyBiZWVuIHZlcmlmaWVkLiAqLworCXZvaWQgKCpsb2NhdGVfZGF0YSkoc3RydWN0IHJ4cnBjX2NhbGwgKiwgc3RydWN0IHNrX2J1ZmYgKiwKKwkJCSAgICB1bnNpZ25lZCBpbnQgKiwgdW5zaWduZWQgaW50ICopOwogCiAJLyogaXNzdWUgYSBjaGFsbGVuZ2UgKi8KIAlpbnQgKCppc3N1ZV9jaGFsbGVuZ2UpKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICopOwpAQCAtMTgwLDkgKzIxMyw4IEBACiAJc3RydWN0IGxpc3RfaGVhZAlsaW5rOwogCXN0cnVjdCBzb2NrZXQJCSpzb2NrZXQ7CS8qIG15IFVEUCBzb2NrZXQgKi8KIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJcHJvY2Vzc29yOwotCXN0cnVjdCBsaXN0X2hlYWQJc2VydmljZXM7CS8qIHNlcnZpY2VzIGxpc3RlbmluZyBvbiB0aGlzIGVuZHBvaW50ICovCisJc3RydWN0IHJ4cnBjX3NvY2sgX19yY3UJKnNlcnZpY2U7CS8qIFNlcnZpY2UocykgbGlzdGVuaW5nIG9uIHRoaXMgZW5kcG9pbnQgKi8KIAlzdHJ1Y3Qgcndfc2VtYXBob3JlCWRlZnJhZ19zZW07CS8qIGNvbnRyb2wgcmUtZW5hYmxlbWVudCBvZiBJUCBERiBiaXQgKi8KLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkCWFjY2VwdF9xdWV1ZTsJLyogaW5jb21pbmcgY2FsbHMgYXdhaXRpbmcgYWNjZXB0YW5jZSAqLwogCXN0cnVjdCBza19idWZmX2hlYWQJcmVqZWN0X3F1ZXVlOwkvKiBwYWNrZXRzIGF3YWl0aW5nIHJlamVjdGlvbiAqLwogCXN0cnVjdCBza19idWZmX2hlYWQJZXZlbnRfcXVldWU7CS8qIGVuZHBvaW50IGV2ZW50IHBhY2tldHMgYXdhaXRpbmcgcHJvY2Vzc2luZyAqLwogCXN0cnVjdCByYl9yb290CQljbGllbnRfY29ubnM7CS8qIENsaWVudCBjb25uZWN0aW9ucyBieSBzb2NrZXQgcGFyYW1zICovCkBAIC0yMjAsMTAgKzI1MiwxMiBAQAogCiAJLyogY2FsY3VsYXRlZCBSVFQgY2FjaGUgKi8KICNkZWZpbmUgUlhSUENfUlRUX0NBQ0hFX1NJWkUgMzIKLQlzdXNlY29uZHNfdAkJcnR0OwkJLyogY3VycmVudCBSVFQgZXN0aW1hdGUgKGluIHVTKSAqLwotCXVuc2lnbmVkIGludAkJcnR0X3BvaW50OwkvKiBuZXh0IGVudHJ5IGF0IHdoaWNoIHRvIGluc2VydCAqLwotCXVuc2lnbmVkIGludAkJcnR0X3VzYWdlOwkvKiBhbW91bnQgb2YgY2FjaGUgYWN0dWFsbHkgdXNlZCAqLwotCXN1c2Vjb25kc190CQlydHRfY2FjaGVbUlhSUENfUlRUX0NBQ0hFX1NJWkVdOyAvKiBjYWxjdWxhdGVkIFJUVCBjYWNoZSAqLworCWt0aW1lX3QJCQlydHRfbGFzdF9yZXE7CS8qIFRpbWUgb2YgbGFzdCBSVFQgcmVxdWVzdCAqLworCXU2NAkJCXJ0dDsJCS8qIEN1cnJlbnQgUlRUIGVzdGltYXRlIChpbiBuUykgKi8KKwl1NjQJCQlydHRfc3VtOwkvKiBTdW0gb2YgY2FjaGUgY29udGVudHMgKi8KKwl1NjQJCQlydHRfY2FjaGVbUlhSUENfUlRUX0NBQ0hFX1NJWkVdOyAvKiBEZXRlcm1pbmVkIFJUVCBjYWNoZSAqLworCXU4CQkJcnR0X2N1cnNvcjsJLyogbmV4dCBlbnRyeSBhdCB3aGljaCB0byBpbnNlcnQgKi8KKwl1OAkJCXJ0dF91c2FnZTsJLyogYW1vdW50IG9mIGNhY2hlIGFjdHVhbGx5IHVzZWQgKi8KIH07CiAKIC8qCkBAIC0yNTUsNiArMjg5LDkgQEAKIAlSWFJQQ19DT05OX0hBU19JRFIsCQkvKiBIYXMgYSBjbGllbnQgY29ubiBJRCBhc3NpZ25lZCAqLwogCVJYUlBDX0NPTk5fSU5fU0VSVklDRV9DT05OUywJLyogQ29ubiBpcyBpbiBwZWVyLT5zZXJ2aWNlX2Nvbm5zICovCiAJUlhSUENfQ09OTl9JTl9DTElFTlRfQ09OTlMsCS8qIENvbm4gaXMgaW4gbG9jYWwtPmNsaWVudF9jb25ucyAqLworCVJYUlBDX0NPTk5fRVhQT1NFRCwJCS8qIENvbm4gaGFzIGV4dHJhIHJlZiBmb3IgZXhwb3N1cmUgKi8KKwlSWFJQQ19DT05OX0RPTlRfUkVVU0UsCQkvKiBEb24ndCByZXVzZSB0aGlzIGNvbm5lY3Rpb24gKi8KKwlSWFJQQ19DT05OX0NPVU5URUQsCQkvKiBDb3VudGVkIGJ5IHJ4cnBjX25yX2NsaWVudF9jb25ucyAqLwogfTsKIAogLyoKQEAgLTI2NSwxNyArMzAyLDI5IEBACiB9OwogCiAvKgorICogVGhlIGNvbm5lY3Rpb24gY2FjaGUgc3RhdGUuCisgKi8KK2VudW0gcnhycGNfY29ubl9jYWNoZV9zdGF0ZSB7CisJUlhSUENfQ09OTl9DTElFTlRfSU5BQ1RJVkUsCS8qIENvbm4gaXMgbm90IHlldCBsaXN0ZWQgKi8KKwlSWFJQQ19DT05OX0NMSUVOVF9XQUlUSU5HLAkvKiBDb25uIGlzIG9uIHdhaXQgbGlzdCwgd2FpdGluZyBmb3IgY2FwYWNpdHkgKi8KKwlSWFJQQ19DT05OX0NMSUVOVF9BQ1RJVkUsCS8qIENvbm4gaXMgb24gYWN0aXZlIGxpc3QsIGRvaW5nIGNhbGxzICovCisJUlhSUENfQ09OTl9DTElFTlRfQ1VMTEVELAkvKiBDb25uIGlzIGN1bGxlZCBhbmQgZGVsaXN0ZWQsIGRvaW5nIGNhbGxzICovCisJUlhSUENfQ09OTl9DTElFTlRfSURMRSwJCS8qIENvbm4gaXMgb24gaWRsZSBsaXN0LCBkb2luZyBtb3N0bHkgbm90aGluZyAqLworCVJYUlBDX0NPTk5fX05SX0NBQ0hFX1NUQVRFUworfTsKKworLyoKICAqIFRoZSBjb25uZWN0aW9uIHByb3RvY29sIHN0YXRlLgogICovCiBlbnVtIHJ4cnBjX2Nvbm5fcHJvdG9fc3RhdGUgewogCVJYUlBDX0NPTk5fVU5VU0VELAkJLyogQ29ubmVjdGlvbiBub3QgeWV0IGF0dGVtcHRlZCAqLwogCVJYUlBDX0NPTk5fQ0xJRU5ULAkJLyogQ2xpZW50IGNvbm5lY3Rpb24gKi8KKwlSWFJQQ19DT05OX1NFUlZJQ0VfUFJFQUxMT0MsCS8qIFNlcnZpY2UgY29ubmVjdGlvbiBwcmVhbGxvY2F0aW9uICovCiAJUlhSUENfQ09OTl9TRVJWSUNFX1VOU0VDVVJFRCwJLyogU2VydmljZSB1bnNlY3VyZWQgY29ubmVjdGlvbiAqLwogCVJYUlBDX0NPTk5fU0VSVklDRV9DSEFMTEVOR0lORywJLyogU2VydmljZSBjaGFsbGVuZ2luZyBmb3Igc2VjdXJpdHkgKi8KIAlSWFJQQ19DT05OX1NFUlZJQ0UsCQkvKiBTZXJ2aWNlIHNlY3VyZWQgY29ubmVjdGlvbiAqLwogCVJYUlBDX0NPTk5fUkVNT1RFTFlfQUJPUlRFRCwJLyogQ29ubiBhYm9ydGVkIGJ5IHBlZXIgKi8KIAlSWFJQQ19DT05OX0xPQ0FMTFlfQUJPUlRFRCwJLyogQ29ubiBhYm9ydGVkIGxvY2FsbHkgKi8KLQlSWFJQQ19DT05OX05FVFdPUktfRVJST1IsCS8qIENvbm4gdGVybWluYXRlZCBieSBuZXR3b3JrIGVycm9yICovCiAJUlhSUENfQ09OTl9fTlJfU1RBVEVTCiB9OwogCkBAIC0yODgsMjMgKzMzNywzMyBAQAogCXN0cnVjdCByeHJwY19jb25uX3Byb3RvCXByb3RvOwogCXN0cnVjdCByeHJwY19jb25uX3BhcmFtZXRlcnMgcGFyYW1zOwogCi0Jc3BpbmxvY2tfdAkJY2hhbm5lbF9sb2NrOworCWF0b21pY190CQl1c2FnZTsKKwlzdHJ1Y3QgcmN1X2hlYWQJCXJjdTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWNhY2hlX2xpbms7CiAKKwlzcGlubG9ja190CQljaGFubmVsX2xvY2s7CisJdW5zaWduZWQgY2hhcgkJYWN0aXZlX2NoYW5zOwkvKiBNYXNrIG9mIGFjdGl2ZSBjaGFubmVscyAqLworI2RlZmluZSBSWFJQQ19BQ1RJVkVfQ0hBTlNfTUFTSwkoKDEgPDwgUlhSUENfTUFYQ0FMTFMpIC0gMSkKKwlzdHJ1Y3QgbGlzdF9oZWFkCXdhaXRpbmdfY2FsbHM7CS8qIENhbGxzIHdhaXRpbmcgZm9yIGNoYW5uZWxzICovCiAJc3RydWN0IHJ4cnBjX2NoYW5uZWwgewogCQlzdHJ1Y3QgcnhycGNfY2FsbCBfX3JjdQkqY2FsbDsJCS8qIEFjdGl2ZSBjYWxsICovCiAJCXUzMgkJCWNhbGxfaWQ7CS8qIElEIG9mIGN1cnJlbnQgY2FsbCAqLwogCQl1MzIJCQljYWxsX2NvdW50ZXI7CS8qIENhbGwgSUQgY291bnRlciAqLwogCQl1MzIJCQlsYXN0X2NhbGw7CS8qIElEIG9mIGxhc3QgY2FsbCAqLwotCQl1MzIJCQlsYXN0X3Jlc3VsdDsJLyogUmVzdWx0IG9mIGxhc3QgY2FsbCAoMC9hYm9ydCkgKi8KKwkJdTgJCQlsYXN0X3R5cGU7CS8qIFR5cGUgb2YgbGFzdCBwYWNrZXQgKi8KKwkJdTE2CQkJbGFzdF9zZXJ2aWNlX2lkOworCQl1bmlvbiB7CisJCQl1MzIJCWxhc3Rfc2VxOworCQkJdTMyCQlsYXN0X2Fib3J0OworCQl9OwogCX0gY2hhbm5lbHNbUlhSUENfTUFYQ0FMTFNdOwotCXdhaXRfcXVldWVfaGVhZF90CWNoYW5uZWxfd3E7CS8qIHF1ZXVlIHRvIHdhaXQgZm9yIGNoYW5uZWwgdG8gYmVjb21lIGF2YWlsYWJsZSAqLwogCi0Jc3RydWN0IHJjdV9oZWFkCQlyY3U7CiAJc3RydWN0IHdvcmtfc3RydWN0CXByb2Nlc3NvcjsJLyogY29ubmVjdGlvbiBldmVudCBwcm9jZXNzb3IgKi8KIAl1bmlvbiB7CiAJCXN0cnVjdCByYl9ub2RlCWNsaWVudF9ub2RlOwkvKiBOb2RlIGluIGxvY2FsLT5jbGllbnRfY29ubnMgKi8KIAkJc3RydWN0IHJiX25vZGUJc2VydmljZV9ub2RlOwkvKiBOb2RlIGluIHBlZXItPnNlcnZpY2VfY29ubnMgKi8KIAl9OworCXN0cnVjdCBsaXN0X2hlYWQJcHJvY19saW5rOwkvKiBsaW5rIGluIHByb2NmcyBsaXN0ICovCiAJc3RydWN0IGxpc3RfaGVhZAlsaW5rOwkJLyogbGluayBpbiBtYXN0ZXIgY29ubmVjdGlvbiBsaXN0ICovCiAJc3RydWN0IHNrX2J1ZmZfaGVhZAlyeF9xdWV1ZTsJLyogcmVjZWl2ZWQgY29ubi1sZXZlbCBwYWNrZXRzICovCiAJY29uc3Qgc3RydWN0IHJ4cnBjX3NlY3VyaXR5ICpzZWN1cml0eTsJLyogYXBwbGllZCBzZWN1cml0eSBtb2R1bGUgKi8KQEAgLTMxMywyMSArMzcyLDE4IEBACiAJc3RydWN0IHJ4cnBjX2NyeXB0CWNzdW1faXY7CS8qIHBhY2tldCBjaGVja3N1bSBiYXNlICovCiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAJdW5zaWduZWQgbG9uZwkJZXZlbnRzOwotCXVuc2lnbmVkIGxvbmcJCXB1dF90aW1lOwkvKiBUaW1lIGF0IHdoaWNoIGxhc3QgcHV0ICovCisJdW5zaWduZWQgbG9uZwkJaWRsZV90aW1lc3RhbXA7CS8qIFRpbWUgYXQgd2hpY2ggbGFzdCBiZWNhbWUgaWRsZSAqLwogCXNwaW5sb2NrX3QJCXN0YXRlX2xvY2s7CS8qIHN0YXRlLWNoYW5nZSBsb2NrICovCi0JYXRvbWljX3QJCXVzYWdlOwotCWVudW0gcnhycGNfY29ubl9wcm90b19zdGF0ZSBzdGF0ZSA6IDg7CS8qIGN1cnJlbnQgc3RhdGUgb2YgY29ubmVjdGlvbiAqLworCWVudW0gcnhycGNfY29ubl9jYWNoZV9zdGF0ZSBjYWNoZV9zdGF0ZTsKKwllbnVtIHJ4cnBjX2Nvbm5fcHJvdG9fc3RhdGUgc3RhdGU7CS8qIGN1cnJlbnQgc3RhdGUgb2YgY29ubmVjdGlvbiAqLwogCXUzMgkJCWxvY2FsX2Fib3J0OwkvKiBsb2NhbCBhYm9ydCBjb2RlICovCiAJdTMyCQkJcmVtb3RlX2Fib3J0OwkvKiByZW1vdGUgYWJvcnQgY29kZSAqLwotCWludAkJCWVycm9yOwkJLyogbG9jYWwgZXJyb3IgaW5jdXJyZWQgKi8KIAlpbnQJCQlkZWJ1Z19pZDsJLyogZGVidWcgSUQgZm9yIHByaW50a3MgKi8KIAlhdG9taWNfdAkJc2VyaWFsOwkJLyogcGFja2V0IHNlcmlhbCBudW1iZXIgY291bnRlciAqLwotCWF0b21pY190CQloaV9zZXJpYWw7CS8qIGhpZ2hlc3Qgc2VyaWFsIG51bWJlciByZWNlaXZlZCAqLwotCWF0b21pY190CQlhdmFpbF9jaGFuczsJLyogbnVtYmVyIG9mIGNoYW5uZWxzIGF2YWlsYWJsZSAqLwotCXU4CQkJc2l6ZV9hbGlnbjsJLyogZGF0YSBzaXplIGFsaWdubWVudCAoZm9yIHNlY3VyaXR5KSAqLwotCXU4CQkJaGVhZGVyX3NpemU7CS8qIHJ4cnBjICsgc2VjdXJpdHkgaGVhZGVyIHNpemUgKi8KLQl1OAkJCXNlY3VyaXR5X3NpemU7CS8qIHNlY3VyaXR5IGhlYWRlciBzaXplICovCisJdW5zaWduZWQgaW50CQloaV9zZXJpYWw7CS8qIGhpZ2hlc3Qgc2VyaWFsIG51bWJlciByZWNlaXZlZCAqLwogCXUzMgkJCXNlY3VyaXR5X25vbmNlOwkvKiByZXNwb25zZSByZS11c2UgcHJldmVudGVyICovCisJdTgJCQlzaXplX2FsaWduOwkvKiBkYXRhIHNpemUgYWxpZ25tZW50IChmb3Igc2VjdXJpdHkpICovCisJdTgJCQlzZWN1cml0eV9zaXplOwkvKiBzZWN1cml0eSBoZWFkZXIgc2l6ZSAqLwogCXU4CQkJc2VjdXJpdHlfaXg7CS8qIHNlY3VyaXR5IHR5cGUgKi8KIAl1OAkJCW91dF9jbGllbnRmbGFnOwkvKiBSWFJQQ19DTElFTlRfSU5JVElBVEVEIGlmIHdlIGFyZSBjbGllbnQgKi8KIH07CkBAIC0zMzcsMzcgKzM5MywyMyBAQAogICovCiBlbnVtIHJ4cnBjX2NhbGxfZmxhZyB7CiAJUlhSUENfQ0FMTF9SRUxFQVNFRCwJCS8qIGNhbGwgaGFzIGJlZW4gcmVsZWFzZWQgLSBubyBtb3JlIG1lc3NhZ2UgdG8gdXNlcnNwYWNlICovCi0JUlhSUENfQ0FMTF9URVJNSU5BTF9NU0csCS8qIGNhbGwgaGFzIGdpdmVuIHRoZSBzb2NrZXQgaXRzIGZpbmFsIG1lc3NhZ2UgKi8KLQlSWFJQQ19DQUxMX1JDVkRfTEFTVCwJCS8qIGFsbCBwYWNrZXRzIHJlY2VpdmVkICovCi0JUlhSUENfQ0FMTF9SVU5fUlRJTUVSLAkJLyogVHggcmVzZW5kIHRpbWVyIHN0YXJ0ZWQgKi8KLQlSWFJQQ19DQUxMX1RYX1NPRlRfQUNLLAkJLyogc2VudCBzb21lIHNvZnQgQUNLcyAqLwotCVJYUlBDX0NBTExfUFJPQ19CVVNZLAkJLyogdGhlIHByb2Nlc3NvciBpcyBidXN5ICovCi0JUlhSUENfQ0FMTF9JTklUX0FDQ0VQVCwJCS8qIGFjY2VwdGFuY2Ugd2FzIGluaXRpYXRlZCAqLwogCVJYUlBDX0NBTExfSEFTX1VTRVJJRCwJCS8qIGhhcyBhIHVzZXIgSUQgYXR0YWNoZWQgKi8KLQlSWFJQQ19DQUxMX0VYUEVDVF9PT1MsCQkvKiBleHBlY3Qgb3V0IG9mIHNlcXVlbmNlIHBhY2tldHMgKi8KKwlSWFJQQ19DQUxMX0lTX1NFUlZJQ0UsCQkvKiBDYWxsIGlzIHNlcnZpY2UgY2FsbCAqLworCVJYUlBDX0NBTExfRVhQT1NFRCwJCS8qIFRoZSBjYWxsIHdhcyBleHBvc2VkIHRvIHRoZSB3b3JsZCAqLworCVJYUlBDX0NBTExfUlhfTEFTVCwJCS8qIFJlY2VpdmVkIHRoZSBsYXN0IHBhY2tldCAoYXQgcnh0eF90b3ApICovCisJUlhSUENfQ0FMTF9UWF9MQVNULAkJLyogTGFzdCBwYWNrZXQgaW4gVHggYnVmZmVyIChhdCByeHR4X3RvcCkgKi8KKwlSWFJQQ19DQUxMX1BJTkdJTkcsCQkvKiBQaW5nIGluIHByb2Nlc3MgKi8KKwlSWFJQQ19DQUxMX1JFVFJBTlNfVElNRU9VVCwJLyogUmV0cmFuc21pc3Npb24gZHVlIHRvIHRpbWVvdXQgb2NjdXJyZWQgKi8KIH07CiAKIC8qCiAgKiBFdmVudHMgdGhhdCBjYW4gYmUgcmFpc2VkIG9uIGEgY2FsbC4KICAqLwogZW51bSByeHJwY19jYWxsX2V2ZW50IHsKLQlSWFJQQ19DQUxMX0VWX1JDVkRfQUNLQUxMLAkvKiBBQ0tBTEwgb3IgcmVwbHkgcmVjZWl2ZWQgKi8KLQlSWFJQQ19DQUxMX0VWX1JDVkRfQlVTWSwJLyogYnVzeSBwYWNrZXQgcmVjZWl2ZWQgKi8KLQlSWFJQQ19DQUxMX0VWX1JDVkRfQUJPUlQsCS8qIGFib3J0IHBhY2tldCByZWNlaXZlZCAqLwotCVJYUlBDX0NBTExfRVZfUkNWRF9FUlJPUiwJLyogbmV0d29yayBlcnJvciByZWNlaXZlZCAqLwotCVJYUlBDX0NBTExfRVZfQUNLX0ZJTkFMLAkvKiBuZWVkIHRvIGdlbmVyYXRlIGZpbmFsIEFDSyAoYW5kIHJlbGVhc2UgY2FsbCkgKi8KIAlSWFJQQ19DQUxMX0VWX0FDSywJCS8qIG5lZWQgdG8gZ2VuZXJhdGUgQUNLICovCi0JUlhSUENfQ0FMTF9FVl9SRUpFQ1RfQlVTWSwJLyogbmVlZCB0byBnZW5lcmF0ZSBidXN5IG1lc3NhZ2UgKi8KIAlSWFJQQ19DQUxMX0VWX0FCT1JULAkJLyogbmVlZCB0byBnZW5lcmF0ZSBhYm9ydCAqLwotCVJYUlBDX0NBTExfRVZfQ09OTl9BQk9SVCwJLyogbG9jYWwgY29ubmVjdGlvbiBhYm9ydCBnZW5lcmF0ZWQgKi8KLQlSWFJQQ19DQUxMX0VWX1JFU0VORF9USU1FUiwJLyogVHggcmVzZW5kIHRpbWVyIGV4cGlyZWQgKi8KKwlSWFJQQ19DQUxMX0VWX1RJTUVSLAkJLyogVGltZXIgZXhwaXJlZCAqLwogCVJYUlBDX0NBTExfRVZfUkVTRU5ELAkJLyogVHggcmVzZW5kIHJlcXVpcmVkICovCi0JUlhSUENfQ0FMTF9FVl9EUkFJTl9SWF9PT1MsCS8qIGRyYWluIHRoZSBSeCBvdXQgb2Ygc2VxdWVuY2UgcXVldWUgKi8KLQlSWFJQQ19DQUxMX0VWX0xJRkVfVElNRVIsCS8qIGNhbGwncyBsaWZldGltZXIgcmFuIG91dCAqLwotCVJYUlBDX0NBTExfRVZfQUNDRVBURUQsCQkvKiBpbmNvbWluZyBjYWxsIGFjY2VwdGVkIGJ5IHVzZXJzcGFjZSBhcHAgKi8KLQlSWFJQQ19DQUxMX0VWX1NFQ1VSRUQsCQkvKiBpbmNvbWluZyBjYWxsJ3MgY29ubmVjdGlvbiBpcyBub3cgc2VjdXJlICovCi0JUlhSUENfQ0FMTF9FVl9QT1NUX0FDQ0VQVCwJLyogbmVlZCB0byBwb3N0IGFuICJhY2NlcHQ/IiBtZXNzYWdlIHRvIHRoZSBhcHAgKi8KLQlSWFJQQ19DQUxMX0VWX1JFTEVBU0UsCQkvKiBuZWVkIHRvIHJlbGVhc2UgdGhlIGNhbGwncyByZXNvdXJjZXMgKi8KIH07CiAKIC8qCkBAIC0zNzksMjAgKzQyMSwzOCBAQAogCVJYUlBDX0NBTExfQ0xJRU5UX1NFTkRfUkVRVUVTVCwJLyogLSBjbGllbnQgc2VuZGluZyByZXF1ZXN0IHBoYXNlICovCiAJUlhSUENfQ0FMTF9DTElFTlRfQVdBSVRfUkVQTFksCS8qIC0gY2xpZW50IGF3YWl0aW5nIHJlcGx5ICovCiAJUlhSUENfQ0FMTF9DTElFTlRfUkVDVl9SRVBMWSwJLyogLSBjbGllbnQgcmVjZWl2aW5nIHJlcGx5IHBoYXNlICovCi0JUlhSUENfQ0FMTF9DTElFTlRfRklOQUxfQUNLLAkvKiAtIGNsaWVudCBzZW5kaW5nIGZpbmFsIEFDSyBwaGFzZSAqLworCVJYUlBDX0NBTExfU0VSVkVSX1BSRUFMTE9DLAkvKiAtIHNlcnZpY2UgcHJlYWxsb2NhdGlvbiAqLwogCVJYUlBDX0NBTExfU0VSVkVSX1NFQ1VSSU5HLAkvKiAtIHNlcnZlciBzZWN1cmluZyByZXF1ZXN0IGNvbm5lY3Rpb24gKi8KIAlSWFJQQ19DQUxMX1NFUlZFUl9BQ0NFUFRJTkcsCS8qIC0gc2VydmVyIGFjY2VwdGluZyByZXF1ZXN0ICovCiAJUlhSUENfQ0FMTF9TRVJWRVJfUkVDVl9SRVFVRVNULAkvKiAtIHNlcnZlciByZWNlaXZpbmcgcmVxdWVzdCAqLwogCVJYUlBDX0NBTExfU0VSVkVSX0FDS19SRVFVRVNULAkvKiAtIHNlcnZlciBwZW5kaW5nIEFDSyBvZiByZXF1ZXN0ICovCiAJUlhSUENfQ0FMTF9TRVJWRVJfU0VORF9SRVBMWSwJLyogLSBzZXJ2ZXIgc2VuZGluZyByZXBseSAqLwogCVJYUlBDX0NBTExfU0VSVkVSX0FXQUlUX0FDSywJLyogLSBzZXJ2ZXIgYXdhaXRpbmcgZmluYWwgQUNLICovCi0JUlhSUENfQ0FMTF9DT01QTEVURSwJCS8qIC0gY2FsbCBjb21wbGV0ZWQgKi8KLQlSWFJQQ19DQUxMX1NFUlZFUl9CVVNZLAkJLyogLSBjYWxsIHJlamVjdGVkIGJ5IGJ1c3kgc2VydmVyICovCisJUlhSUENfQ0FMTF9DT01QTEVURSwJCS8qIC0gY2FsbCBjb21wbGV0ZSAqLworCU5SX19SWFJQQ19DQUxMX1NUQVRFUworfTsKKworLyoKKyAqIENhbGwgY29tcGxldGlvbiBjb25kaXRpb24gKHN0YXRlID09IFJYUlBDX0NBTExfQ09NUExFVEUpLgorICovCitlbnVtIHJ4cnBjX2NhbGxfY29tcGxldGlvbiB7CisJUlhSUENfQ0FMTF9TVUNDRUVERUQsCQkvKiAtIE5vcm1hbCB0ZXJtaW5hdGlvbiAqLwogCVJYUlBDX0NBTExfUkVNT1RFTFlfQUJPUlRFRCwJLyogLSBjYWxsIGFib3J0ZWQgYnkgcGVlciAqLwogCVJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVELAkvKiAtIGNhbGwgYWJvcnRlZCBsb2NhbGx5IG9uIGVycm9yIG9yIGNsb3NlICovCisJUlhSUENfQ0FMTF9MT0NBTF9FUlJPUiwJCS8qIC0gY2FsbCBmYWlsZWQgZHVlIHRvIGxvY2FsIGVycm9yICovCiAJUlhSUENfQ0FMTF9ORVRXT1JLX0VSUk9SLAkvKiAtIGNhbGwgdGVybWluYXRlZCBieSBuZXR3b3JrIGVycm9yICovCi0JUlhSUENfQ0FMTF9ERUFELAkJLyogLSBjYWxsIGlzIGRlYWQgKi8KLQlOUl9fUlhSUENfQ0FMTF9TVEFURVMKKwlOUl9fUlhSUENfQ0FMTF9DT01QTEVUSU9OUworfTsKKworLyoKKyAqIENhbGwgVHggY29uZ2VzdGlvbiBtYW5hZ2VtZW50IG1vZGVzLgorICovCitlbnVtIHJ4cnBjX2Nvbmdlc3RfbW9kZSB7CisJUlhSUENfQ0FMTF9TTE9XX1NUQVJULAorCVJYUlBDX0NBTExfQ09OR0VTVF9BVk9JREFOQ0UsCisJUlhSUENfQ0FMTF9QQUNLRVRfTE9TUywKKwlSWFJQQ19DQUxMX0ZBU1RfUkVUUkFOU01JVCwKKwlOUl9fUlhSUENfQ09OR0VTVF9NT0RFUwogfTsKIAogLyoKQEAgLTQwMiw5MSArNDYyLDMyOSBAQAogc3RydWN0IHJ4cnBjX2NhbGwgewogCXN0cnVjdCByY3VfaGVhZAkJcmN1OwogCXN0cnVjdCByeHJwY19jb25uZWN0aW9uCSpjb25uOwkJLyogY29ubmVjdGlvbiBjYXJyeWluZyBjYWxsICovCi0Jc3RydWN0IHJ4cnBjX3NvY2sJKnNvY2tldDsJLyogc29ja2V0IHJlc3BvbnNpYmxlICovCi0Jc3RydWN0IHRpbWVyX2xpc3QJbGlmZXRpbWVyOwkvKiBsaWZldGltZSByZW1haW5pbmcgb24gY2FsbCAqLwotCXN0cnVjdCB0aW1lcl9saXN0CWRlYWRzcGFuOwkvKiByZWFwIHRpbWVyIGZvciByZS1BQ0snaW5nLCBldGMgICovCi0Jc3RydWN0IHRpbWVyX2xpc3QJYWNrX3RpbWVyOwkvKiBBQ0sgZ2VuZXJhdGlvbiB0aW1lciAqLwotCXN0cnVjdCB0aW1lcl9saXN0CXJlc2VuZF90aW1lcjsJLyogVHggcmVzZW5kIHRpbWVyICovCi0Jc3RydWN0IHdvcmtfc3RydWN0CWRlc3Ryb3llcjsJLyogY2FsbCBkZXN0cm95ZXIgKi8KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJcHJvY2Vzc29yOwkvKiBwYWNrZXQgcHJvY2Vzc29yIGFuZCBBQ0sgZ2VuZXJhdG9yICovCisJc3RydWN0IHJ4cnBjX3BlZXIJKnBlZXI7CQkvKiBQZWVyIHJlY29yZCBmb3IgcmVtb3RlIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgcnhycGNfc29jayBfX3JjdQkqc29ja2V0OwkvKiBzb2NrZXQgcmVzcG9uc2libGUgKi8KKwlrdGltZV90CQkJYWNrX2F0OwkJLyogV2hlbiBkZWZlcnJlZCBBQ0sgbmVlZHMgdG8gaGFwcGVuICovCisJa3RpbWVfdAkJCXJlc2VuZF9hdDsJLyogV2hlbiBuZXh0IHJlc2VuZCBuZWVkcyB0byBoYXBwZW4gKi8KKwlrdGltZV90CQkJZXhwaXJlX2F0OwkvKiBXaGVuIHRoZSBjYWxsIHRpbWVzIG91dCAqLworCXN0cnVjdCB0aW1lcl9saXN0CXRpbWVyOwkJLyogQ29tYmluZWQgZXZlbnQgdGltZXIgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJcHJvY2Vzc29yOwkvKiBFdmVudCBwcm9jZXNzb3IgKi8KKwlyeHJwY19ub3RpZnlfcnhfdAlub3RpZnlfcng7CS8qIGtlcm5lbCBzZXJ2aWNlIFJ4IG5vdGlmaWNhdGlvbiBmdW5jdGlvbiAqLwogCXN0cnVjdCBsaXN0X2hlYWQJbGluazsJCS8qIGxpbmsgaW4gbWFzdGVyIGNhbGwgbGlzdCAqLworCXN0cnVjdCBsaXN0X2hlYWQJY2hhbl93YWl0X2xpbms7CS8qIExpbmsgaW4gY29ubi0+d2FpdGluZ19jYWxscyAqLwogCXN0cnVjdCBobGlzdF9ub2RlCWVycm9yX2xpbms7CS8qIGxpbmsgaW4gZXJyb3IgZGlzdHJpYnV0aW9uIGxpc3QgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCWFjY2VwdF9saW5rOwkvKiBjYWxscyBhd2FpdGluZyBhY2NlcHRhbmNlICovCi0Jc3RydWN0IHJiX25vZGUJCXNvY2tfbm9kZTsJLyogbm9kZSBpbiBzb2NrZXQgY2FsbCB0cmVlICovCi0Jc3RydWN0IHNrX2J1ZmZfaGVhZAlyeF9xdWV1ZTsJLyogcmVjZWl2ZWQgcGFja2V0cyAqLwotCXN0cnVjdCBza19idWZmX2hlYWQJcnhfb29zX3F1ZXVlOwkvKiBwYWNrZXRzIHJlY2VpdmVkIG91dCBvZiBzZXF1ZW5jZSAqLworCXN0cnVjdCBsaXN0X2hlYWQJYWNjZXB0X2xpbms7CS8qIExpbmsgaW4gcngtPmFjY2VwdHEgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXJlY3Ztc2dfbGluazsJLyogTGluayBpbiByeC0+cmVjdm1zZ19xICovCisJc3RydWN0IGxpc3RfaGVhZAlzb2NrX2xpbms7CS8qIExpbmsgaW4gcngtPnNvY2tfY2FsbHMgKi8KKwlzdHJ1Y3QgcmJfbm9kZQkJc29ja19ub2RlOwkvKiBOb2RlIGluIHJ4LT5jYWxscyAqLwogCXN0cnVjdCBza19idWZmCQkqdHhfcGVuZGluZzsJLyogVHggc29ja2V0IGJ1ZmZlciBiZWluZyBmaWxsZWQgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdAl0eF93YWl0cTsJLyogd2FpdCBmb3IgVHggd2luZG93IHNwYWNlIHRvIGJlY29tZSBhdmFpbGFibGUgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0cTsJCS8qIFdhaXQgcXVldWUgZm9yIGNoYW5uZWwgb3IgVHggKi8KIAlfX2JlMzIJCQljcnlwdG9fYnVmWzJdOwkvKiBUZW1wb3JhcnkgcGFja2V0IGNyeXB0byBidWZmZXIgKi8KIAl1bnNpZ25lZCBsb25nCQl1c2VyX2NhbGxfSUQ7CS8qIHVzZXItZGVmaW5lZCBjYWxsIElEICovCi0JdW5zaWduZWQgbG9uZwkJY3JlYXRpb25famlmOwkvKiB0aW1lIG9mIGNhbGwgY3JlYXRpb24gKi8KIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAl1bnNpZ25lZCBsb25nCQlldmVudHM7CiAJc3BpbmxvY2tfdAkJbG9jazsKIAlyd2xvY2tfdAkJc3RhdGVfbG9jazsJLyogbG9jayBmb3Igc3RhdGUgdHJhbnNpdGlvbiAqLwotCWF0b21pY190CQl1c2FnZTsKLQlhdG9taWNfdAkJc2VxdWVuY2U7CS8qIFR4IGRhdGEgcGFja2V0IHNlcXVlbmNlIGNvdW50ZXIgKi8KLQl1MzIJCQlsb2NhbF9hYm9ydDsJLyogbG9jYWwgYWJvcnQgY29kZSAqLwotCXUzMgkJCXJlbW90ZV9hYm9ydDsJLyogcmVtb3RlIGFib3J0IGNvZGUgKi8KLQlpbnQJCQllcnJvcl9yZXBvcnQ7CS8qIE5ldHdvcmsgZXJyb3IgKElDTVAvbG9jYWwgdHJhbnNwb3J0KSAqLworCXUzMgkJCWFib3J0X2NvZGU7CS8qIExvY2FsL3JlbW90ZSBhYm9ydCBjb2RlICovCiAJaW50CQkJZXJyb3I7CQkvKiBMb2NhbCBlcnJvciBpbmN1cnJlZCAqLwotCWVudW0gcnhycGNfY2FsbF9zdGF0ZQlzdGF0ZSA6IDg7CS8qIGN1cnJlbnQgc3RhdGUgb2YgY2FsbCAqLwotCWludAkJCWRlYnVnX2lkOwkvKiBkZWJ1ZyBJRCBmb3IgcHJpbnRrcyAqLwotCXU4CQkJY2hhbm5lbDsJLyogY29ubmVjdGlvbiBjaGFubmVsIG9jY3VwaWVkIGJ5IHRoaXMgY2FsbCAqLwotCi0JLyogdHJhbnNtaXNzaW9uLXBoYXNlIEFDSyBtYW5hZ2VtZW50ICovCi0JdTgJCQlhY2tzX2hlYWQ7CS8qIG9mZnNldCBpbnRvIHdpbmRvdyBvZiBmaXJzdCBlbnRyeSAqLwotCXU4CQkJYWNrc190YWlsOwkvKiBvZmZzZXQgaW50byB3aW5kb3cgb2YgbGFzdCBlbnRyeSAqLwotCXU4CQkJYWNrc193aW5zejsJLyogc2l6ZSBvZiB1bi1BQ0snZCB3aW5kb3cgKi8KLQl1OAkJCWFja3NfdW5hY2tlZDsJLyogbG93ZXN0IHVuYWNrZWQgcGFja2V0IGluIGxhc3QgQUNLIHJlY2VpdmVkICovCi0JaW50CQkJYWNrc19sYXRlc3Q7CS8qIHNlcmlhbCBudW1iZXIgb2YgbGF0ZXN0IEFDSyByZWNlaXZlZCAqLwotCXJ4cnBjX3NlcV90CQlhY2tzX2hhcmQ7CS8qIGhpZ2hlc3QgZGVmaW5pdGl2ZWx5IEFDSydkIG1zZyBzZXEgKi8KLQl1bnNpZ25lZCBsb25nCQkqYWNrc193aW5kb3c7CS8qIHNlbnQgcGFja2V0IHdpbmRvdwotCQkJCQkJICogLSBlbGVtZW50cyBhcmUgcG9pbnRlcnMgd2l0aCBMU0Igc2V0IGlmIEFDSydkCi0JCQkJCQkgKi8KLQotCS8qIHJlY2VpdmUtcGhhc2UgQUNLIG1hbmFnZW1lbnQgKi8KLQlyeHJwY19zZXFfdAkJcnhfZGF0YV9leHBlY3Q7CS8qIG5leHQgZGF0YSBzZXEgSUQgZXhwZWN0ZWQgdG8gYmUgcmVjZWl2ZWQgKi8KLQlyeHJwY19zZXFfdAkJcnhfZGF0YV9wb3N0OwkvKiBuZXh0IGRhdGEgc2VxIElEIGV4cGVjdGVkIHRvIGJlIHBvc3RlZCAqLwotCXJ4cnBjX3NlcV90CQlyeF9kYXRhX3JlY3Y7CS8qIGxhc3QgZGF0YSBzZXEgSUQgZW5jb3VudGVyZWQgYnkgcmVjdm1zZyAqLwotCXJ4cnBjX3NlcV90CQlyeF9kYXRhX2VhdGVuOwkvKiBsYXN0IGRhdGEgc2VxIElEIGNvbnN1bWVkIGJ5IHJlY3Ztc2cgKi8KLQlyeHJwY19zZXFfdAkJcnhfZmlyc3Rfb29zOwkvKiBmaXJzdCBwYWNrZXQgaW4gcnhfb29zX3F1ZXVlIChvciAwKSAqLwotCXJ4cnBjX3NlcV90CQlhY2tyX3dpbl90b3A7CS8qIHRvcCBvZiBBQ0sgd2luZG93IChyeF9kYXRhX2VhdGVuIGlzIGJvdHRvbSkgKi8KLQlyeHJwY19zZXFfdAkJYWNrcl9wcmV2X3NlcTsJLyogcHJldmlvdXMgc2VxdWVuY2UgbnVtYmVyIHJlY2VpdmVkICovCi0JdTgJCQlhY2tyX3JlYXNvbjsJLyogcmVhc29uIHRvIEFDSyAqLwotCXJ4cnBjX3NlcmlhbF90CQlhY2tyX3NlcmlhbDsJLyogc2VyaWFsIG9mIHBhY2tldCBiZWluZyBBQ0snZCAqLwotCWF0b21pY190CQlhY2tyX25vdF9pZGxlOwkvKiBudW1iZXIgb2YgcGFja2V0cyBpbiBSeCBxdWV1ZSAqLwotCi0JLyogcmVjZWl2ZWQgcGFja2V0IHJlY29yZHMsIDEgYml0IHBlciByZWNvcmQgKi8KLSNkZWZpbmUgUlhSUENfQUNLUl9XSU5ET1dfQVNaIERJVl9ST1VORF9VUChSWFJQQ19NQVhBQ0tTLCBCSVRTX1BFUl9MT05HKQotCXVuc2lnbmVkIGxvbmcJCWFja3Jfd2luZG93W1JYUlBDX0FDS1JfV0lORE9XX0FTWiArIDFdOwotCi0JdTgJCQlpbl9jbGllbnRmbGFnOwkvKiBDb3B5IG9mIGNvbm4tPmluX2NsaWVudGZsYWcgKi8KLQlzdHJ1Y3QgcnhycGNfbG9jYWwJKmxvY2FsOwkJLyogTG9jYWwgZW5kcG9pbnQuICovCisJZW51bSByeHJwY19jYWxsX3N0YXRlCXN0YXRlOwkJLyogY3VycmVudCBzdGF0ZSBvZiBjYWxsICovCisJZW51bSByeHJwY19jYWxsX2NvbXBsZXRpb24gY29tcGxldGlvbjsJLyogQ2FsbCBjb21wbGV0aW9uIGNvbmRpdGlvbiAqLworCWF0b21pY190CQl1c2FnZTsKKwl1MTYJCQlzZXJ2aWNlX2lkOwkvKiBzZXJ2aWNlIElEICovCisJdTgJCQlzZWN1cml0eV9peDsJLyogU2VjdXJpdHkgdHlwZSAqLwogCXUzMgkJCWNhbGxfaWQ7CS8qIGNhbGwgSUQgb24gY29ubmVjdGlvbiAgKi8KIAl1MzIJCQljaWQ7CQkvKiBjb25uZWN0aW9uIElEIHBsdXMgY2hhbm5lbCBpbmRleCAqLwotCXUzMgkJCWVwb2NoOwkJLyogZXBvY2ggb2YgdGhpcyBjb25uZWN0aW9uICovCi0JdTE2CQkJc2VydmljZV9pZDsJLyogc2VydmljZSBJRCAqLworCWludAkJCWRlYnVnX2lkOwkvKiBkZWJ1ZyBJRCBmb3IgcHJpbnRrcyAqLworCXVuc2lnbmVkIHNob3J0CQlyeF9wa3Rfb2Zmc2V0OwkvKiBDdXJyZW50IHJlY3Ztc2cgcGFja2V0IG9mZnNldCAqLworCXVuc2lnbmVkIHNob3J0CQlyeF9wa3RfbGVuOwkvKiBDdXJyZW50IHJlY3Ztc2cgcGFja2V0IGxlbiAqLworCisJLyogUngvVHggY2lyY3VsYXIgYnVmZmVyLCBkZXBlbmRpbmcgb24gcGhhc2UuCisJICoKKwkgKiBJbiB0aGUgUnggcGhhc2UsIHBhY2tldHMgYXJlIGFubm90YXRlZCB3aXRoIDAgb3IgdGhlIG51bWJlciBvZiB0aGUKKwkgKiBzZWdtZW50IG9mIGEganVtYm8gcGFja2V0IGVhY2ggYnVmZmVyIHJlZmVycyB0by4gIFRoZXJlIGNhbiBiZSB1cCB0bworCSAqIDQ3IHNlZ21lbnRzIGluIGEgbWF4aW11bS1zaXplIFVEUCBwYWNrZXQuCisJICoKKwkgKiBJbiB0aGUgVHggcGhhc2UsIHBhY2tldHMgYXJlIGFubm90YXRlZCB3aXRoIHdoaWNoIGJ1ZmZlcnMgaGF2ZSBiZWVuCisJICogYWNrZWQuCisJICovCisjZGVmaW5lIFJYUlBDX1JYVFhfQlVGRl9TSVpFCTY0CisjZGVmaW5lIFJYUlBDX1JYVFhfQlVGRl9NQVNLCShSWFJQQ19SWFRYX0JVRkZfU0laRSAtIDEpCisjZGVmaW5lIFJYUlBDX0lOSVRfUlhfV0lORE9XX1NJWkUgMzIKKwlzdHJ1Y3Qgc2tfYnVmZgkJKipyeHR4X2J1ZmZlcjsKKwl1OAkJCSpyeHR4X2Fubm90YXRpb25zOworI2RlZmluZSBSWFJQQ19UWF9BTk5PX0FDSwkwCisjZGVmaW5lIFJYUlBDX1RYX0FOTk9fVU5BQ0sJMQorI2RlZmluZSBSWFJQQ19UWF9BTk5PX05BSwkyCisjZGVmaW5lIFJYUlBDX1RYX0FOTk9fUkVUUkFOUwkzCisjZGVmaW5lIFJYUlBDX1RYX0FOTk9fTUFTSwkweDAzCisjZGVmaW5lIFJYUlBDX1RYX0FOTk9fTEFTVAkweDA0CisjZGVmaW5lIFJYUlBDX1RYX0FOTk9fUkVTRU5UCTB4MDgKKworI2RlZmluZSBSWFJQQ19SWF9BTk5PX0pVTUJPCTB4M2YJCS8qIEp1bWJvIHN1YnBhY2tldCBudW1iZXIgKyAxIGlmIG5vdCB6ZXJvICovCisjZGVmaW5lIFJYUlBDX1JYX0FOTk9fSkxBU1QJMHg0MAkJLyogU2V0IGlmIGxhc3QgZWxlbWVudCBvZiBhIGp1bWJvIHBhY2tldCAqLworI2RlZmluZSBSWFJQQ19SWF9BTk5PX1ZFUklGSUVECTB4ODAJCS8qIFNldCBpZiB2ZXJpZmllZCBhbmQgZGVjcnlwdGVkICovCisJcnhycGNfc2VxX3QJCXR4X2hhcmRfYWNrOwkvKiBEZWFkIHNsb3QgaW4gYnVmZmVyOyB0aGUgZmlyc3QgdHJhbnNtaXR0ZWQgYnV0CisJCQkJCQkgKiBub3QgaGFyZC1BQ0snZCBwYWNrZXQgZm9sbG93cyB0aGlzLgorCQkJCQkJICovCisJcnhycGNfc2VxX3QJCXR4X3RvcDsJCS8qIEhpZ2hlc3QgVHggc2xvdCBhbGxvY2F0ZWQuICovCisKKwkvKiBUQ1Atc3R5bGUgc2xvdy1zdGFydCBjb25nZXN0aW9uIGNvbnRyb2wgW1JGQzU2ODFdLiAgU2luY2UgdGhlIFNNU1MKKwkgKiBpcyBmaXhlZCwgd2Uga2VlcCB0aGVzZSBudW1iZXJzIGluIHRlcm1zIG9mIHNlZ21lbnRzIChpZS4gREFUQQorCSAqIHBhY2tldHMpIHJhdGhlciB0aGFuIGJ5dGVzLgorCSAqLworI2RlZmluZSBSWFJQQ19UWF9TTVNTCQlSWFJQQ19KVU1CT19EQVRBTEVOCisJdTgJCQljb25nX2N3bmQ7CS8qIENvbmdlc3Rpb24gd2luZG93IHNpemUgKi8KKwl1OAkJCWNvbmdfZXh0cmE7CS8qIEV4dHJhIHRvIHNlbmQgZm9yIGNvbmdlc3Rpb24gbWFuYWdlbWVudCAqLworCXU4CQkJY29uZ19zc3RocmVzaDsJLyogU2xvdy1zdGFydCB0aHJlc2hvbGQgKi8KKwllbnVtIHJ4cnBjX2Nvbmdlc3RfbW9kZQljb25nX21vZGU6ODsJLyogQ29uZ2VzdGlvbiBtYW5hZ2VtZW50IG1vZGUgKi8KKwl1OAkJCWNvbmdfZHVwX2Fja3M7CS8qIENvdW50IG9mIEFDS3Mgc2hvd2luZyBtaXNzaW5nIHBhY2tldHMgKi8KKwl1OAkJCWNvbmdfY3VtdWxfYWNrczsgLyogQ3VtdWxhdGl2ZSBBQ0sgY291bnQgKi8KKwlrdGltZV90CQkJY29uZ190c3RhbXA7CS8qIExhc3QgdGltZSBjd25kIHdhcyBjaGFuZ2VkICovCisKKwlyeHJwY19zZXFfdAkJcnhfaGFyZF9hY2s7CS8qIERlYWQgc2xvdCBpbiBidWZmZXI7IHRoZSBmaXJzdCByZWNlaXZlZCBidXQgbm90CisJCQkJCQkgKiBjb25zdW1lZCBwYWNrZXQgZm9sbG93cyB0aGlzLgorCQkJCQkJICovCisJcnhycGNfc2VxX3QJCXJ4X3RvcDsJCS8qIEhpZ2hlc3QgUnggc2xvdCBhbGxvY2F0ZWQuICovCisJcnhycGNfc2VxX3QJCXJ4X2V4cGVjdF9uZXh0OwkvKiBFeHBlY3RlZCBuZXh0IHBhY2tldCBzZXF1ZW5jZSBudW1iZXIgKi8KKwl1OAkJCXJ4X3dpbnNpemU7CS8qIFNpemUgb2YgUnggd2luZG93ICovCisJdTgJCQl0eF93aW5zaXplOwkvKiBNYXhpbXVtIHNpemUgb2YgVHggd2luZG93ICovCisJYm9vbAkJCXR4X3BoYXNlOwkvKiBUIGlmIHRyYW5zbWlzc2lvbiBwaGFzZSwgRiBpZiByZWNlaXZlIHBoYXNlICovCisJdTgJCQlucl9qdW1ib19iYWQ7CS8qIE51bWJlciBvZiBqdW1ibyBkdXBzL2V4Y2VlZHMtd2luZG93cyAqLworCisJLyogcmVjZWl2ZS1waGFzZSBBQ0sgbWFuYWdlbWVudCAqLworCXU4CQkJYWNrcl9yZWFzb247CS8qIHJlYXNvbiB0byBBQ0sgKi8KKwl1MTYJCQlhY2tyX3NrZXc7CS8qIHNrZXcgb24gcGFja2V0IGJlaW5nIEFDSydkICovCisJcnhycGNfc2VyaWFsX3QJCWFja3Jfc2VyaWFsOwkvKiBzZXJpYWwgb2YgcGFja2V0IGJlaW5nIEFDSydkICovCisJcnhycGNfc2VxX3QJCWFja3JfcHJldl9zZXE7CS8qIHByZXZpb3VzIHNlcXVlbmNlIG51bWJlciByZWNlaXZlZCAqLworCXJ4cnBjX3NlcV90CQlhY2tyX2NvbnN1bWVkOwkvKiBIaWdoZXN0IHBhY2tldCBzaG93biBjb25zdW1lZCAqLworCXJ4cnBjX3NlcV90CQlhY2tyX3NlZW47CS8qIEhpZ2hlc3QgcGFja2V0IHNob3duIHNlZW4gKi8KKwlyeHJwY19zZXJpYWxfdAkJYWNrcl9waW5nOwkvKiBMYXN0IHBpbmcgc2VudCAqLworCWt0aW1lX3QJCQlhY2tyX3BpbmdfdGltZTsJLyogVGltZSBsYXN0IHBpbmcgc2VudCAqLworCisJLyogdHJhbnNtaXNzaW9uLXBoYXNlIEFDSyBtYW5hZ2VtZW50ICovCisJa3RpbWVfdAkJCWFja3NfbGF0ZXN0X3RzOwkvKiBUaW1lc3RhbXAgb2YgbGF0ZXN0IEFDSyByZWNlaXZlZCAqLworCXJ4cnBjX3NlcmlhbF90CQlhY2tzX2xhdGVzdDsJLyogc2VyaWFsIG51bWJlciBvZiBsYXRlc3QgQUNLIHJlY2VpdmVkICovCisJcnhycGNfc2VxX3QJCWFja3NfbG93ZXN0X25hazsgLyogTG93ZXN0IE5BQ0sgaW4gdGhlIGJ1ZmZlciAob3IgPT10eF9oYXJkX2FjaykgKi8KIH07CiAKIC8qCi0gKiBsb2NhbGx5IGFib3J0IGFuIFJ4UlBDIGNhbGwKKyAqIFN1bW1hcnkgb2YgYSBuZXcgQUNLIGFuZCB0aGUgY2hhbmdlcyBpdCBtYWRlIHRvIHRoZSBUeCBidWZmZXIgcGFja2V0IHN0YXRlcy4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIHJ4cnBjX2Fib3J0X2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHUzMiBhYm9ydF9jb2RlKQotewotCXdyaXRlX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKLQkJY2FsbC0+bG9jYWxfYWJvcnQgPSBhYm9ydF9jb2RlOwotCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEOwotCQlzZXRfYml0KFJYUlBDX0NBTExfRVZfQUJPUlQsICZjYWxsLT5ldmVudHMpOwotCX0KLQl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotfQorc3RydWN0IHJ4cnBjX2Fja19zdW1tYXJ5IHsKKwl1OAkJCWFja19yZWFzb247CisJdTgJCQlucl9hY2tzOwkJLyogTnVtYmVyIG9mIEFDS3MgaW4gcGFja2V0ICovCisJdTgJCQlucl9uYWNrczsJCS8qIE51bWJlciBvZiBOQUNLcyBpbiBwYWNrZXQgKi8KKwl1OAkJCW5yX25ld19hY2tzOwkJLyogTnVtYmVyIG9mIG5ldyBBQ0tzIGluIHBhY2tldCAqLworCXU4CQkJbnJfbmV3X25hY2tzOwkJLyogTnVtYmVyIG9mIG5ldyBOQUNLcyBpbiBwYWNrZXQgKi8KKwl1OAkJCW5yX3JvdF9uZXdfYWNrczsJLyogTnVtYmVyIG9mIHJvdGF0ZWQgbmV3IEFDS3MgKi8KKwlib29sCQkJbmV3X2xvd19uYWNrOwkJLyogVCBpZiBuZXcgbG93IE5BQ0sgZm91bmQgKi8KKwlib29sCQkJcmV0cmFuc190aW1lbzsJCS8qIFQgaWYgcmVUeCBkdWUgdG8gdGltZW91dCBoYXBwZW5lZCAqLworCXU4CQkJZmxpZ2h0X3NpemU7CQkvKiBOdW1iZXIgb2YgdW5yZWNlaXZlZCB0cmFuc21pc3Npb25zICovCisJLyogUGxhY2UgdG8gc3Rhc2ggdmFsdWVzIGZvciB0cmFjaW5nICovCisJZW51bSByeHJwY19jb25nZXN0X21vZGUJbW9kZTo4OworCXU4CQkJY3duZDsKKwl1OAkJCXNzdGhyZXNoOworCXU4CQkJZHVwX2Fja3M7CisJdTgJCQljdW11bGF0aXZlX2Fja3M7Cit9OworCitlbnVtIHJ4cnBjX3NrYl90cmFjZSB7CisJcnhycGNfc2tiX3J4X2NsZWFuZWQsCisJcnhycGNfc2tiX3J4X2ZyZWVkLAorCXJ4cnBjX3NrYl9yeF9nb3QsCisJcnhycGNfc2tiX3J4X2xvc3QsCisJcnhycGNfc2tiX3J4X3JlY2VpdmVkLAorCXJ4cnBjX3NrYl9yeF9yb3RhdGVkLAorCXJ4cnBjX3NrYl9yeF9wdXJnZWQsCisJcnhycGNfc2tiX3J4X3NlZW4sCisJcnhycGNfc2tiX3R4X2NsZWFuZWQsCisJcnhycGNfc2tiX3R4X2ZyZWVkLAorCXJ4cnBjX3NrYl90eF9nb3QsCisJcnhycGNfc2tiX3R4X25ldywKKwlyeHJwY19za2JfdHhfcm90YXRlZCwKKwlyeHJwY19za2JfdHhfc2VlbiwKKwlyeHJwY19za2JfX25yX3RyYWNlCit9OworCitleHRlcm4gY29uc3QgY2hhciByeHJwY19za2JfdHJhY2VzW3J4cnBjX3NrYl9fbnJfdHJhY2VdWzddOworCitlbnVtIHJ4cnBjX2Nvbm5fdHJhY2UgeworCXJ4cnBjX2Nvbm5fbmV3X2NsaWVudCwKKwlyeHJwY19jb25uX25ld19zZXJ2aWNlLAorCXJ4cnBjX2Nvbm5fcXVldWVkLAorCXJ4cnBjX2Nvbm5fc2VlbiwKKwlyeHJwY19jb25uX2dvdCwKKwlyeHJwY19jb25uX3B1dF9jbGllbnQsCisJcnhycGNfY29ubl9wdXRfc2VydmljZSwKKwlyeHJwY19jb25uX19ucl90cmFjZQorfTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgcnhycGNfY29ubl90cmFjZXNbcnhycGNfY29ubl9fbnJfdHJhY2VdWzRdOworCitlbnVtIHJ4cnBjX2NsaWVudF90cmFjZSB7CisJcnhycGNfY2xpZW50X2FjdGl2YXRlX2NoYW5zLAorCXJ4cnBjX2NsaWVudF9hbGxvYywKKwlyeHJwY19jbGllbnRfY2hhbl9hY3RpdmF0ZSwKKwlyeHJwY19jbGllbnRfY2hhbl9kaXNjb25uZWN0LAorCXJ4cnBjX2NsaWVudF9jaGFuX3Bhc3MsCisJcnhycGNfY2xpZW50X2NoYW5fdW5zdGFydGVkLAorCXJ4cnBjX2NsaWVudF9jbGVhbnVwLAorCXJ4cnBjX2NsaWVudF9jb3VudCwKKwlyeHJwY19jbGllbnRfZGlzY2FyZCwKKwlyeHJwY19jbGllbnRfZHVwbGljYXRlLAorCXJ4cnBjX2NsaWVudF9leHBvc2VkLAorCXJ4cnBjX2NsaWVudF9yZXBsYWNlLAorCXJ4cnBjX2NsaWVudF90b19hY3RpdmUsCisJcnhycGNfY2xpZW50X3RvX2N1bGxlZCwKKwlyeHJwY19jbGllbnRfdG9faWRsZSwKKwlyeHJwY19jbGllbnRfdG9faW5hY3RpdmUsCisJcnhycGNfY2xpZW50X3RvX3dhaXRpbmcsCisJcnhycGNfY2xpZW50X3VuY291bnQsCisJcnhycGNfY2xpZW50X19ucl90cmFjZQorfTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgcnhycGNfY2xpZW50X3RyYWNlc1tyeHJwY19jbGllbnRfX25yX3RyYWNlXVs3XTsKK2V4dGVybiBjb25zdCBjaGFyIHJ4cnBjX2Nvbm5fY2FjaGVfc3RhdGVzW1JYUlBDX0NPTk5fX05SX0NBQ0hFX1NUQVRFU11bNV07CisKK2VudW0gcnhycGNfY2FsbF90cmFjZSB7CisJcnhycGNfY2FsbF9uZXdfY2xpZW50LAorCXJ4cnBjX2NhbGxfbmV3X3NlcnZpY2UsCisJcnhycGNfY2FsbF9xdWV1ZWQsCisJcnhycGNfY2FsbF9xdWV1ZWRfcmVmLAorCXJ4cnBjX2NhbGxfc2VlbiwKKwlyeHJwY19jYWxsX2Nvbm5lY3RlZCwKKwlyeHJwY19jYWxsX3JlbGVhc2UsCisJcnhycGNfY2FsbF9nb3QsCisJcnhycGNfY2FsbF9nb3RfdXNlcmlkLAorCXJ4cnBjX2NhbGxfZ290X2tlcm5lbCwKKwlyeHJwY19jYWxsX3B1dCwKKwlyeHJwY19jYWxsX3B1dF91c2VyaWQsCisJcnhycGNfY2FsbF9wdXRfa2VybmVsLAorCXJ4cnBjX2NhbGxfcHV0X25vcXVldWUsCisJcnhycGNfY2FsbF9lcnJvciwKKwlyeHJwY19jYWxsX19ucl90cmFjZQorfTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgcnhycGNfY2FsbF90cmFjZXNbcnhycGNfY2FsbF9fbnJfdHJhY2VdWzRdOworCitlbnVtIHJ4cnBjX3RyYW5zbWl0X3RyYWNlIHsKKwlyeHJwY190cmFuc21pdF93YWl0LAorCXJ4cnBjX3RyYW5zbWl0X3F1ZXVlLAorCXJ4cnBjX3RyYW5zbWl0X3F1ZXVlX2xhc3QsCisJcnhycGNfdHJhbnNtaXRfcm90YXRlLAorCXJ4cnBjX3RyYW5zbWl0X3JvdGF0ZV9sYXN0LAorCXJ4cnBjX3RyYW5zbWl0X2F3YWl0X3JlcGx5LAorCXJ4cnBjX3RyYW5zbWl0X2VuZCwKKwlyeHJwY190cmFuc21pdF9fbnJfdHJhY2UKK307CisKK2V4dGVybiBjb25zdCBjaGFyIHJ4cnBjX3RyYW5zbWl0X3RyYWNlc1tyeHJwY190cmFuc21pdF9fbnJfdHJhY2VdWzRdOworCitlbnVtIHJ4cnBjX3JlY2VpdmVfdHJhY2UgeworCXJ4cnBjX3JlY2VpdmVfaW5jb21pbmcsCisJcnhycGNfcmVjZWl2ZV9xdWV1ZSwKKwlyeHJwY19yZWNlaXZlX3F1ZXVlX2xhc3QsCisJcnhycGNfcmVjZWl2ZV9mcm9udCwKKwlyeHJwY19yZWNlaXZlX3JvdGF0ZSwKKwlyeHJwY19yZWNlaXZlX2VuZCwKKwlyeHJwY19yZWNlaXZlX19ucl90cmFjZQorfTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgcnhycGNfcmVjZWl2ZV90cmFjZXNbcnhycGNfcmVjZWl2ZV9fbnJfdHJhY2VdWzRdOworCitlbnVtIHJ4cnBjX3JlY3Ztc2dfdHJhY2UgeworCXJ4cnBjX3JlY3Ztc2dfZW50ZXIsCisJcnhycGNfcmVjdm1zZ193YWl0LAorCXJ4cnBjX3JlY3Ztc2dfZGVxdWV1ZSwKKwlyeHJwY19yZWN2bXNnX2hvbGUsCisJcnhycGNfcmVjdm1zZ19uZXh0LAorCXJ4cnBjX3JlY3Ztc2dfY29udCwKKwlyeHJwY19yZWN2bXNnX2Z1bGwsCisJcnhycGNfcmVjdm1zZ19kYXRhX3JldHVybiwKKwlyeHJwY19yZWN2bXNnX3Rlcm1pbmFsLAorCXJ4cnBjX3JlY3Ztc2dfdG9fYmVfYWNjZXB0ZWQsCisJcnhycGNfcmVjdm1zZ19yZXR1cm4sCisJcnhycGNfcmVjdm1zZ19fbnJfdHJhY2UKK307CisKK2V4dGVybiBjb25zdCBjaGFyIHJ4cnBjX3JlY3Ztc2dfdHJhY2VzW3J4cnBjX3JlY3Ztc2dfX25yX3RyYWNlXVs1XTsKKworZW51bSByeHJwY19ydHRfdHhfdHJhY2UgeworCXJ4cnBjX3J0dF90eF9waW5nLAorCXJ4cnBjX3J0dF90eF9kYXRhLAorCXJ4cnBjX3J0dF90eF9fbnJfdHJhY2UKK307CisKK2V4dGVybiBjb25zdCBjaGFyIHJ4cnBjX3J0dF90eF90cmFjZXNbcnhycGNfcnR0X3R4X19ucl90cmFjZV1bNV07CisKK2VudW0gcnhycGNfcnR0X3J4X3RyYWNlIHsKKwlyeHJwY19ydHRfcnhfcGluZ19yZXNwb25zZSwKKwlyeHJwY19ydHRfcnhfcmVxdWVzdGVkX2FjaywKKwlyeHJwY19ydHRfcnhfX25yX3RyYWNlCit9OworCitleHRlcm4gY29uc3QgY2hhciByeHJwY19ydHRfcnhfdHJhY2VzW3J4cnBjX3J0dF9yeF9fbnJfdHJhY2VdWzVdOworCitlbnVtIHJ4cnBjX3RpbWVyX3RyYWNlIHsKKwlyeHJwY190aW1lcl9iZWdpbiwKKwlyeHJwY190aW1lcl9pbml0X2Zvcl9yZXBseSwKKwlyeHJwY190aW1lcl9leHBpcmVkLAorCXJ4cnBjX3RpbWVyX3NldF9mb3JfYWNrLAorCXJ4cnBjX3RpbWVyX3NldF9mb3JfcmVzZW5kLAorCXJ4cnBjX3RpbWVyX3NldF9mb3Jfc2VuZCwKKwlyeHJwY190aW1lcl9fbnJfdHJhY2UKK307CisKK2V4dGVybiBjb25zdCBjaGFyIHJ4cnBjX3RpbWVyX3RyYWNlc1tyeHJwY190aW1lcl9fbnJfdHJhY2VdWzhdOworCitlbnVtIHJ4cnBjX3Byb3Bvc2VfYWNrX3RyYWNlIHsKKwlyeHJwY19wcm9wb3NlX2Fja19jbGllbnRfdHhfZW5kLAorCXJ4cnBjX3Byb3Bvc2VfYWNrX2lucHV0X2RhdGEsCisJcnhycGNfcHJvcG9zZV9hY2tfcGluZ19mb3JfbG9zdF9hY2ssCisJcnhycGNfcHJvcG9zZV9hY2tfcGluZ19mb3JfbG9zdF9yZXBseSwKKwlyeHJwY19wcm9wb3NlX2Fja19waW5nX2Zvcl9wYXJhbXMsCisJcnhycGNfcHJvcG9zZV9hY2tfcmVzcG9uZF90b19hY2ssCisJcnhycGNfcHJvcG9zZV9hY2tfcmVzcG9uZF90b19waW5nLAorCXJ4cnBjX3Byb3Bvc2VfYWNrX3JldHJ5X3R4LAorCXJ4cnBjX3Byb3Bvc2VfYWNrX3JvdGF0ZV9yeCwKKwlyeHJwY19wcm9wb3NlX2Fja190ZXJtaW5hbF9hY2ssCisJcnhycGNfcHJvcG9zZV9hY2tfX25yX3RyYWNlCit9OworCitlbnVtIHJ4cnBjX3Byb3Bvc2VfYWNrX291dGNvbWUgeworCXJ4cnBjX3Byb3Bvc2VfYWNrX3VzZSwKKwlyeHJwY19wcm9wb3NlX2Fja191cGRhdGUsCisJcnhycGNfcHJvcG9zZV9hY2tfc3Vic3VtZSwKKwlyeHJwY19wcm9wb3NlX2Fja19fbnJfb3V0Y29tZXMKK307CisKK2V4dGVybiBjb25zdCBjaGFyIHJ4cnBjX3Byb3Bvc2VfYWNrX3RyYWNlc1tyeHJwY19wcm9wb3NlX2Fja19fbnJfdHJhY2VdWzhdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IHJ4cnBjX3Byb3Bvc2VfYWNrX291dGNvbWVzW3J4cnBjX3Byb3Bvc2VfYWNrX19ucl9vdXRjb21lc107CisKK2VudW0gcnhycGNfY29uZ2VzdF9jaGFuZ2UgeworCXJ4cnBjX2NvbmdfYmVnaW5fcmV0cmFuc21pc3Npb24sCisJcnhycGNfY29uZ19jbGVhcmVkX25hY2tzLAorCXJ4cnBjX2NvbmdfbmV3X2xvd19uYWNrLAorCXJ4cnBjX2Nvbmdfbm9fY2hhbmdlLAorCXJ4cnBjX2NvbmdfcHJvZ3Jlc3MsCisJcnhycGNfY29uZ19yZXRyYW5zbWl0X2FnYWluLAorCXJ4cnBjX2NvbmdfcnR0X3dpbmRvd19lbmQsCisJcnhycGNfY29uZ19zYXdfbmFjaywKKwlyeHJwY19jb25nZXN0X19ucl9jaGFuZ2UKK307CisKK2V4dGVybiBjb25zdCBjaGFyIHJ4cnBjX2Nvbmdlc3RfbW9kZXNbTlJfX1JYUlBDX0NPTkdFU1RfTU9ERVNdWzEwXTsKK2V4dGVybiBjb25zdCBjaGFyIHJ4cnBjX2Nvbmdlc3RfY2hhbmdlc1tyeHJwY19jb25nZXN0X19ucl9jaGFuZ2VdWzldOworCitleHRlcm4gY29uc3QgY2hhciAqY29uc3QgcnhycGNfcGt0c1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgY29uc3QgcnhycGNfYWNrX25hbWVzW1JYUlBDX0FDS19fSU5WQUxJRCArIDFdWzRdOworCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3J4cnBjLmg+CiAKIC8qCiAgKiBhZl9yeHJwYy5jCiAgKi8KLWV4dGVybiBhdG9taWNfdCByeHJwY19uX3NrYnM7CitleHRlcm4gYXRvbWljX3QgcnhycGNfbl90eF9za2JzLCByeHJwY19uX3J4X3NrYnM7CiBleHRlcm4gdTMyIHJ4cnBjX2Vwb2NoOwogZXh0ZXJuIGF0b21pY190IHJ4cnBjX2RlYnVnX2lkOwogZXh0ZXJuIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpyeHJwY193b3JrcXVldWU7CkBAIC00OTQsNzAgKzc5MiwxNzggQEAKIC8qCiAgKiBjYWxsX2FjY2VwdC5jCiAgKi8KK2ludCByeHJwY19zZXJ2aWNlX3ByZWFsbG9jKHN0cnVjdCByeHJwY19zb2NrICosIGdmcF90KTsKK3ZvaWQgcnhycGNfZGlzY2FyZF9wcmVhbGxvYyhzdHJ1Y3QgcnhycGNfc29jayAqKTsKK3N0cnVjdCByeHJwY19jYWxsICpyeHJwY19uZXdfaW5jb21pbmdfY2FsbChzdHJ1Y3QgcnhycGNfbG9jYWwgKiwKKwkJCQkJICAgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKiwKKwkJCQkJICAgc3RydWN0IHNrX2J1ZmYgKik7CiB2b2lkIHJ4cnBjX2FjY2VwdF9pbmNvbWluZ19jYWxscyhzdHJ1Y3QgcnhycGNfbG9jYWwgKik7Ci1zdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfYWNjZXB0X2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKiwgdW5zaWduZWQgbG9uZyk7CitzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfYWNjZXB0X2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKiwgdW5zaWduZWQgbG9uZywKKwkJCQkgICAgIHJ4cnBjX25vdGlmeV9yeF90KTsKIGludCByeHJwY19yZWplY3RfY2FsbChzdHJ1Y3QgcnhycGNfc29jayAqKTsKIAogLyoKICAqIGNhbGxfZXZlbnQuYwogICovCi12b2lkIF9fcnhycGNfcHJvcG9zZV9BQ0soc3RydWN0IHJ4cnBjX2NhbGwgKiwgdTgsIHUzMiwgYm9vbCk7Ci12b2lkIHJ4cnBjX3Byb3Bvc2VfQUNLKHN0cnVjdCByeHJwY19jYWxsICosIHU4LCB1MzIsIGJvb2wpOwordm9pZCByeHJwY19zZXRfdGltZXIoc3RydWN0IHJ4cnBjX2NhbGwgKiwgZW51bSByeHJwY190aW1lcl90cmFjZSwga3RpbWVfdCk7Cit2b2lkIHJ4cnBjX3Byb3Bvc2VfQUNLKHN0cnVjdCByeHJwY19jYWxsICosIHU4LCB1MTYsIHUzMiwgYm9vbCwgYm9vbCwKKwkJICAgICAgIGVudW0gcnhycGNfcHJvcG9zZV9hY2tfdHJhY2UpOwogdm9pZCByeHJwY19wcm9jZXNzX2NhbGwoc3RydWN0IHdvcmtfc3RydWN0ICopOwogCiAvKgogICogY2FsbF9vYmplY3QuYwogICovCitleHRlcm4gY29uc3QgY2hhciAqY29uc3QgcnhycGNfY2FsbF9zdGF0ZXNbXTsKK2V4dGVybiBjb25zdCBjaGFyICpjb25zdCByeHJwY19jYWxsX2NvbXBsZXRpb25zW107CiBleHRlcm4gdW5zaWduZWQgaW50IHJ4cnBjX21heF9jYWxsX2xpZmV0aW1lOwotZXh0ZXJuIHVuc2lnbmVkIGludCByeHJwY19kZWFkX2NhbGxfZXhwaXJ5OwogZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpyeHJwY19jYWxsX2phcjsKIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHJ4cnBjX2NhbGxzOwogZXh0ZXJuIHJ3bG9ja190IHJ4cnBjX2NhbGxfbG9jazsKIAogc3RydWN0IHJ4cnBjX2NhbGwgKnJ4cnBjX2ZpbmRfY2FsbF9ieV91c2VyX0lEKHN0cnVjdCByeHJwY19zb2NrICosIHVuc2lnbmVkIGxvbmcpOworc3RydWN0IHJ4cnBjX2NhbGwgKnJ4cnBjX2FsbG9jX2NhbGwoZ2ZwX3QpOwogc3RydWN0IHJ4cnBjX2NhbGwgKnJ4cnBjX25ld19jbGllbnRfY2FsbChzdHJ1Y3QgcnhycGNfc29jayAqLAogCQkJCQkgc3RydWN0IHJ4cnBjX2Nvbm5fcGFyYW1ldGVycyAqLAogCQkJCQkgc3RydWN0IHNvY2thZGRyX3J4cnBjICosCiAJCQkJCSB1bnNpZ25lZCBsb25nLCBnZnBfdCk7Ci1zdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfaW5jb21pbmdfY2FsbChzdHJ1Y3QgcnhycGNfc29jayAqLAotCQkJCSAgICAgICBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqLAotCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqKTsKLXZvaWQgcnhycGNfcmVsZWFzZV9jYWxsKHN0cnVjdCByeHJwY19jYWxsICopOwordm9pZCByeHJwY19pbmNvbWluZ19jYWxsKHN0cnVjdCByeHJwY19zb2NrICosIHN0cnVjdCByeHJwY19jYWxsICosCisJCQkgc3RydWN0IHNrX2J1ZmYgKik7Cit2b2lkIHJ4cnBjX3JlbGVhc2VfY2FsbChzdHJ1Y3QgcnhycGNfc29jayAqLCBzdHJ1Y3QgcnhycGNfY2FsbCAqKTsKIHZvaWQgcnhycGNfcmVsZWFzZV9jYWxsc19vbl9zb2NrZXQoc3RydWN0IHJ4cnBjX3NvY2sgKik7Ci12b2lkIF9fcnhycGNfcHV0X2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKik7Citib29sIF9fcnhycGNfcXVldWVfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqKTsKK2Jvb2wgcnhycGNfcXVldWVfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqKTsKK3ZvaWQgcnhycGNfc2VlX2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKik7Cit2b2lkIHJ4cnBjX2dldF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICosIGVudW0gcnhycGNfY2FsbF90cmFjZSk7Cit2b2lkIHJ4cnBjX3B1dF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICosIGVudW0gcnhycGNfY2FsbF90cmFjZSk7Cit2b2lkIHJ4cnBjX2NsZWFudXBfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqKTsKIHZvaWQgX19leGl0IHJ4cnBjX2Rlc3Ryb3lfYWxsX2NhbGxzKHZvaWQpOwogCitzdGF0aWMgaW5saW5lIGJvb2wgcnhycGNfaXNfc2VydmljZV9jYWxsKGNvbnN0IHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCXJldHVybiB0ZXN0X2JpdChSWFJQQ19DQUxMX0lTX1NFUlZJQ0UsICZjYWxsLT5mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCByeHJwY19pc19jbGllbnRfY2FsbChjb25zdCBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwlyZXR1cm4gIXJ4cnBjX2lzX3NlcnZpY2VfY2FsbChjYWxsKTsKK30KKworLyoKKyAqIFRyYW5zaXRpb24gYSBjYWxsIHRvIHRoZSBjb21wbGV0ZSBzdGF0ZS4KKyAqLworc3RhdGljIGlubGluZSBib29sIF9fcnhycGNfc2V0X2NhbGxfY29tcGxldGlvbihzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkJICAgICAgIGVudW0gcnhycGNfY2FsbF9jb21wbGV0aW9uIGNvbXBsLAorCQkJCQkgICAgICAgdTMyIGFib3J0X2NvZGUsCisJCQkJCSAgICAgICBpbnQgZXJyb3IpCit7CisJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSkgeworCQljYWxsLT5hYm9ydF9jb2RlID0gYWJvcnRfY29kZTsKKwkJY2FsbC0+ZXJyb3IgPSBlcnJvcjsKKwkJY2FsbC0+Y29tcGxldGlvbiA9IGNvbXBsLAorCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfQ09NUExFVEU7CisJCXdha2VfdXAoJmNhbGwtPndhaXRxKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSBib29sIHJ4cnBjX3NldF9jYWxsX2NvbXBsZXRpb24oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkJCSAgICAgZW51bSByeHJwY19jYWxsX2NvbXBsZXRpb24gY29tcGwsCisJCQkJCSAgICAgdTMyIGFib3J0X2NvZGUsCisJCQkJCSAgICAgaW50IGVycm9yKQoreworCWJvb2wgcmV0OworCisJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJcmV0ID0gX19yeHJwY19zZXRfY2FsbF9jb21wbGV0aW9uKGNhbGwsIGNvbXBsLCBhYm9ydF9jb2RlLCBlcnJvcik7CisJd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUmVjb3JkIHRoYXQgYSBjYWxsIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBfX3J4cnBjX2NhbGxfY29tcGxldGVkKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCXJldHVybiBfX3J4cnBjX3NldF9jYWxsX2NvbXBsZXRpb24oY2FsbCwgUlhSUENfQ0FMTF9TVUNDRUVERUQsIDAsIDApOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgcnhycGNfY2FsbF9jb21wbGV0ZWQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJYm9vbCByZXQ7CisKKwl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwlyZXQgPSBfX3J4cnBjX2NhbGxfY29tcGxldGVkKGNhbGwpOworCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJlY29yZCB0aGF0IGEgY2FsbCBpcyBsb2NhbGx5IGFib3J0ZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBfX3J4cnBjX2Fib3J0X2NhbGwoY29uc3QgY2hhciAqd2h5LCBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkgICAgICByeHJwY19zZXFfdCBzZXEsCisJCQkJICAgICAgdTMyIGFib3J0X2NvZGUsIGludCBlcnJvcikKK3sKKwl0cmFjZV9yeHJwY19hYm9ydCh3aHksIGNhbGwtPmNpZCwgY2FsbC0+Y2FsbF9pZCwgc2VxLAorCQkJICBhYm9ydF9jb2RlLCBlcnJvcik7CisJcmV0dXJuIF9fcnhycGNfc2V0X2NhbGxfY29tcGxldGlvbihjYWxsLCBSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRCwKKwkJCQkJICAgYWJvcnRfY29kZSwgZXJyb3IpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgcnhycGNfYWJvcnRfY2FsbChjb25zdCBjaGFyICp3aHksIHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJCSAgICByeHJwY19zZXFfdCBzZXEsIHUzMiBhYm9ydF9jb2RlLCBpbnQgZXJyb3IpCit7CisJYm9vbCByZXQ7CisKKwl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwlyZXQgPSBfX3J4cnBjX2Fib3J0X2NhbGwod2h5LCBjYWxsLCBzZXEsIGFib3J0X2NvZGUsIGVycm9yKTsKKwl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKIC8qCiAgKiBjb25uX2NsaWVudC5jCiAgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgcnhycGNfbWF4X2NsaWVudF9jb25uZWN0aW9uczsKK2V4dGVybiB1bnNpZ25lZCBpbnQgcnhycGNfcmVhcF9jbGllbnRfY29ubmVjdGlvbnM7CitleHRlcm4gdW5zaWduZWQgaW50IHJ4cnBjX2Nvbm5faWRsZV9jbGllbnRfZXhwaXJ5OworZXh0ZXJuIHVuc2lnbmVkIGludCByeHJwY19jb25uX2lkbGVfY2xpZW50X2Zhc3RfZXhwaXJ5OwogZXh0ZXJuIHN0cnVjdCBpZHIgcnhycGNfY2xpZW50X2Nvbm5faWRzOwogCiB2b2lkIHJ4cnBjX2Rlc3Ryb3lfY2xpZW50X2Nvbm5faWRzKHZvaWQpOwogaW50IHJ4cnBjX2Nvbm5lY3RfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqLCBzdHJ1Y3QgcnhycGNfY29ubl9wYXJhbWV0ZXJzICosCiAJCSAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKiwgZ2ZwX3QpOwotdm9pZCByeHJwY191bnB1Ymxpc2hfY2xpZW50X2Nvbm4oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKik7Cit2b2lkIHJ4cnBjX2V4cG9zZV9jbGllbnRfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqKTsKK3ZvaWQgcnhycGNfZGlzY29ubmVjdF9jbGllbnRfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqKTsKK3ZvaWQgcnhycGNfcHV0X2NsaWVudF9jb25uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICopOwordm9pZCBfX2V4aXQgcnhycGNfZGVzdHJveV9hbGxfY2xpZW50X2Nvbm5lY3Rpb25zKHZvaWQpOwogCiAvKgogICogY29ubl9ldmVudC5jCiAgKi8KIHZvaWQgcnhycGNfcHJvY2Vzc19jb25uZWN0aW9uKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKLXZvaWQgcnhycGNfcmVqZWN0X3BhY2tldChzdHJ1Y3QgcnhycGNfbG9jYWwgKiwgc3RydWN0IHNrX2J1ZmYgKik7Ci12b2lkIHJ4cnBjX3JlamVjdF9wYWNrZXRzKHN0cnVjdCByeHJwY19sb2NhbCAqKTsKIAogLyoKICAqIGNvbm5fb2JqZWN0LmMKICAqLwogZXh0ZXJuIHVuc2lnbmVkIGludCByeHJwY19jb25uZWN0aW9uX2V4cGlyeTsKIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHJ4cnBjX2Nvbm5lY3Rpb25zOworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgcnhycGNfY29ubmVjdGlvbl9wcm9jX2xpc3Q7CiBleHRlcm4gcndsb2NrX3QgcnhycGNfY29ubmVjdGlvbl9sb2NrOwogCiBpbnQgcnhycGNfZXh0cmFjdF9hZGRyX2Zyb21fc2tiKHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKIHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpyeHJwY19hbGxvY19jb25uZWN0aW9uKGdmcF90KTsKIHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpyeHJwY19maW5kX2Nvbm5lY3Rpb25fcmN1KHN0cnVjdCByeHJwY19sb2NhbCAqLAogCQkJCQkJICAgc3RydWN0IHNrX2J1ZmYgKik7Ci12b2lkIF9fcnhycGNfZGlzY29ubmVjdF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICopOwordm9pZCBfX3J4cnBjX2Rpc2Nvbm5lY3RfY2FsbChzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqLCBzdHJ1Y3QgcnhycGNfY2FsbCAqKTsKIHZvaWQgcnhycGNfZGlzY29ubmVjdF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICopOwotdm9pZCByeHJwY19wdXRfY29ubmVjdGlvbihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqKTsKK3ZvaWQgcnhycGNfa2lsbF9jb25uZWN0aW9uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICopOworYm9vbCByeHJwY19xdWV1ZV9jb25uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICopOwordm9pZCByeHJwY19zZWVfY29ubmVjdGlvbihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqKTsKK3ZvaWQgcnhycGNfZ2V0X2Nvbm5lY3Rpb24oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKik7CitzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqcnhycGNfZ2V0X2Nvbm5lY3Rpb25fbWF5YmUoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKik7Cit2b2lkIHJ4cnBjX3B1dF9zZXJ2aWNlX2Nvbm4oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKik7CiB2b2lkIF9fZXhpdCByeHJwY19kZXN0cm95X2FsbF9jb25uZWN0aW9ucyh2b2lkKTsKIAogc3RhdGljIGlubGluZSBib29sIHJ4cnBjX2Nvbm5faXNfY2xpZW50KGNvbnN0IHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKQpAQCAtNTcwLDI0ICs5NzYsMTUgQEAKIAlyZXR1cm4gIXJ4cnBjX2Nvbm5faXNfY2xpZW50KGNvbm4pOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcnhycGNfZ2V0X2Nvbm5lY3Rpb24oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCitzdGF0aWMgaW5saW5lIHZvaWQgcnhycGNfcHV0X2Nvbm5lY3Rpb24oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCiB7Ci0JYXRvbWljX2luYygmY29ubi0+dXNhZ2UpOwotfQorCWlmICghY29ubikKKwkJcmV0dXJuOwogCi1zdGF0aWMgaW5saW5lCi1zdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqcnhycGNfZ2V0X2Nvbm5lY3Rpb25fbWF5YmUoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCi17Ci0JcmV0dXJuIGF0b21pY19pbmNfbm90X3plcm8oJmNvbm4tPnVzYWdlKSA/IGNvbm4gOiBOVUxMOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgcnhycGNfcXVldWVfY29ubihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKLXsKLQlpZiAoIXJ4cnBjX2dldF9jb25uZWN0aW9uX21heWJlKGNvbm4pKQotCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKCFyeHJwY19xdWV1ZV93b3JrKCZjb25uLT5wcm9jZXNzb3IpKQotCQlyeHJwY19wdXRfY29ubmVjdGlvbihjb25uKTsKLQlyZXR1cm4gdHJ1ZTsKKwlpZiAocnhycGNfY29ubl9pc19jbGllbnQoY29ubikpCisJCXJ4cnBjX3B1dF9jbGllbnRfY29ubihjb25uKTsKKwllbHNlCisJCXJ4cnBjX3B1dF9zZXJ2aWNlX2Nvbm4oY29ubik7CiB9CiAKIC8qCkBAIC01OTUsMTcgKzk5MiwxNCBAQAogICovCiBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqcnhycGNfZmluZF9zZXJ2aWNlX2Nvbm5fcmN1KHN0cnVjdCByeHJwY19wZWVyICosCiAJCQkJCQkgICAgIHN0cnVjdCBza19idWZmICopOwotc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKnJ4cnBjX2luY29taW5nX2Nvbm5lY3Rpb24oc3RydWN0IHJ4cnBjX2xvY2FsICosCi0JCQkJCQkgICBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKiwKLQkJCQkJCSAgIHN0cnVjdCBza19idWZmICopOworc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKnJ4cnBjX3ByZWFsbG9jX3NlcnZpY2VfY29ubmVjdGlvbihnZnBfdCk7Cit2b2lkIHJ4cnBjX25ld19pbmNvbWluZ19jb25uZWN0aW9uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICosIHN0cnVjdCBza19idWZmICopOwogdm9pZCByeHJwY191bnB1Ymxpc2hfc2VydmljZV9jb25uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICopOwogCiAvKgogICogaW5wdXQuYwogICovCiB2b2lkIHJ4cnBjX2RhdGFfcmVhZHkoc3RydWN0IHNvY2sgKik7Ci1pbnQgcnhycGNfcXVldWVfcmN2X3NrYihzdHJ1Y3QgcnhycGNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sLCBib29sKTsKLXZvaWQgcnhycGNfZmFzdF9wcm9jZXNzX3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKIAogLyoKICAqIGluc2VjdXJlLmMKQEAgLTY2NywyNSArMTA2MSwyNCBAQAogZXh0ZXJuIHVuc2lnbmVkIGludCByeHJwY19yeF93aW5kb3dfc2l6ZTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgcnhycGNfcnhfbXR1OwogZXh0ZXJuIHVuc2lnbmVkIGludCByeHJwY19yeF9qdW1ib19tYXg7CitleHRlcm4gdW5zaWduZWQgaW50IHJ4cnBjX3Jlc2VuZF90aW1lb3V0OwogCi1leHRlcm4gY29uc3QgY2hhciAqY29uc3QgcnhycGNfcGt0c1tdOwogZXh0ZXJuIGNvbnN0IHM4IHJ4cnBjX2Fja19wcmlvcml0eVtdOwogCi1leHRlcm4gY29uc3QgY2hhciAqcnhycGNfYWNrcyh1OCByZWFzb24pOwotCiAvKgogICogb3V0cHV0LmMKICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCByeHJwY19yZXNlbmRfdGltZW91dDsKLQotaW50IHJ4cnBjX3NlbmRfZGF0YV9wYWNrZXQoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKiwgc3RydWN0IHNrX2J1ZmYgKik7Ci1pbnQgcnhycGNfZG9fc2VuZG1zZyhzdHJ1Y3QgcnhycGNfc29jayAqLCBzdHJ1Y3QgbXNnaGRyICosIHNpemVfdCk7CitpbnQgcnhycGNfc2VuZF9jYWxsX3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqLCB1OCk7CitpbnQgcnhycGNfc2VuZF9kYXRhX3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sKTsKK3ZvaWQgcnhycGNfcmVqZWN0X3BhY2tldHMoc3RydWN0IHJ4cnBjX2xvY2FsICopOwogCiAvKgogICogcGVlcl9ldmVudC5jCiAgKi8KIHZvaWQgcnhycGNfZXJyb3JfcmVwb3J0KHN0cnVjdCBzb2NrICopOwogdm9pZCByeHJwY19wZWVyX2Vycm9yX2Rpc3RyaWJ1dG9yKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKK3ZvaWQgcnhycGNfcGVlcl9hZGRfcnR0KHN0cnVjdCByeHJwY19jYWxsICosIGVudW0gcnhycGNfcnR0X3J4X3RyYWNlLAorCQkJcnhycGNfc2VyaWFsX3QsIHJ4cnBjX3NlcmlhbF90LCBrdGltZV90LCBrdGltZV90KTsKIAogLyoKICAqIHBlZXJfb2JqZWN0LmMKQEAgLTY5NSwxMCArMTA4OCwxMyBAQAogc3RydWN0IHJ4cnBjX3BlZXIgKnJ4cnBjX2xvb2t1cF9wZWVyKHN0cnVjdCByeHJwY19sb2NhbCAqLAogCQkJCSAgICAgc3RydWN0IHNvY2thZGRyX3J4cnBjICosIGdmcF90KTsKIHN0cnVjdCByeHJwY19wZWVyICpyeHJwY19hbGxvY19wZWVyKHN0cnVjdCByeHJwY19sb2NhbCAqLCBnZnBfdCk7CitzdHJ1Y3QgcnhycGNfcGVlciAqcnhycGNfbG9va3VwX2luY29taW5nX3BlZXIoc3RydWN0IHJ4cnBjX2xvY2FsICosCisJCQkJCSAgICAgIHN0cnVjdCByeHJwY19wZWVyICopOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgcnhycGNfZ2V0X3BlZXIoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIpCitzdGF0aWMgaW5saW5lIHN0cnVjdCByeHJwY19wZWVyICpyeHJwY19nZXRfcGVlcihzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcikKIHsKIAlhdG9taWNfaW5jKCZwZWVyLT51c2FnZSk7CisJcmV0dXJuIHBlZXI7CiB9CiAKIHN0YXRpYyBpbmxpbmUKQEAgLTcxNywxNCArMTExMywxMyBAQAogLyoKICAqIHByb2MuYwogICovCi1leHRlcm4gY29uc3QgY2hhciAqY29uc3QgcnhycGNfY2FsbF9zdGF0ZXNbXTsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJ4cnBjX2NhbGxfc2VxX2ZvcHM7CiBleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByeHJwY19jb25uZWN0aW9uX3NlcV9mb3BzOwogCiAvKgogICogcmVjdm1zZy5jCiAgKi8KLXZvaWQgcnhycGNfcmVtb3ZlX3VzZXJfSUQoc3RydWN0IHJ4cnBjX3NvY2sgKiwgc3RydWN0IHJ4cnBjX2NhbGwgKik7Cit2b2lkIHJ4cnBjX25vdGlmeV9zb2NrZXQoc3RydWN0IHJ4cnBjX2NhbGwgKik7CiBpbnQgcnhycGNfcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICosIHN0cnVjdCBtc2doZHIgKiwgc2l6ZV90LCBpbnQpOwogCiAvKgpAQCAtNzQzLDkgKzExMzgsMjEgQEAKIGludCByeHJwY19pbml0X3NlcnZlcl9jb25uX3NlY3VyaXR5KHN0cnVjdCByeHJwY19jb25uZWN0aW9uICopOwogCiAvKgorICogc2VuZG1zZy5jCisgKi8KK2ludCByeHJwY19kb19zZW5kbXNnKHN0cnVjdCByeHJwY19zb2NrICosIHN0cnVjdCBtc2doZHIgKiwgc2l6ZV90KTsKKworLyoKICAqIHNrYnVmZi5jCiAgKi8KK3ZvaWQgcnhycGNfa2VybmVsX2RhdGFfY29uc3VtZWQoc3RydWN0IHJ4cnBjX2NhbGwgKiwgc3RydWN0IHNrX2J1ZmYgKik7CiB2b2lkIHJ4cnBjX3BhY2tldF9kZXN0cnVjdG9yKHN0cnVjdCBza19idWZmICopOwordm9pZCByeHJwY19uZXdfc2tiKHN0cnVjdCBza19idWZmICosIGVudW0gcnhycGNfc2tiX3RyYWNlKTsKK3ZvaWQgcnhycGNfc2VlX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqLCBlbnVtIHJ4cnBjX3NrYl90cmFjZSk7Cit2b2lkIHJ4cnBjX2dldF9za2Ioc3RydWN0IHNrX2J1ZmYgKiwgZW51bSByeHJwY19za2JfdHJhY2UpOwordm9pZCByeHJwY19mcmVlX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqLCBlbnVtIHJ4cnBjX3NrYl90cmFjZSk7Cit2b2lkIHJ4cnBjX2xvc2Vfc2tiKHN0cnVjdCBza19idWZmICosIGVudW0gcnhycGNfc2tiX3RyYWNlKTsKK3ZvaWQgcnhycGNfcHVyZ2VfcXVldWUoc3RydWN0IHNrX2J1ZmZfaGVhZCAqKTsKIAogLyoKICAqIHN5c2N0bC5jCkBAIC03NjMsNiArMTE3MCwyMyBAQAogICovCiBpbnQgcnhycGNfZXh0cmFjdF9hZGRyX2Zyb21fc2tiKHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKIAorc3RhdGljIGlubGluZSBib29sIGJlZm9yZSh1MzIgc2VxMSwgdTMyIHNlcTIpCit7CisgICAgICAgIHJldHVybiAoczMyKShzZXExIC0gc2VxMikgPCAwOworfQorc3RhdGljIGlubGluZSBib29sIGJlZm9yZV9lcSh1MzIgc2VxMSwgdTMyIHNlcTIpCit7CisgICAgICAgIHJldHVybiAoczMyKShzZXExIC0gc2VxMikgPD0gMDsKK30KK3N0YXRpYyBpbmxpbmUgYm9vbCBhZnRlcih1MzIgc2VxMSwgdTMyIHNlcTIpCit7CisgICAgICAgIHJldHVybiAoczMyKShzZXExIC0gc2VxMikgPiAwOworfQorc3RhdGljIGlubGluZSBib29sIGFmdGVyX2VxKHUzMiBzZXExLCB1MzIgc2VxMikKK3sKKyAgICAgICAgcmV0dXJuIChzMzIpKHNlcTEgLSBzZXEyKSA+PSAwOworfQorCiAvKgogICogZGVidWcgdHJhY2luZwogICovCkBAIC04NDUsMTEgKzEyNjksMTIgQEAKIAogI2RlZmluZSBBU1NFUlRDTVAoWCwgT1AsIFkpCQkJCQkJXAogZG8gewkJCQkJCQkJCVwKLQl1bnNpZ25lZCBsb25nIF94ID0gKHVuc2lnbmVkIGxvbmcpKFgpOwkJCQlcCi0JdW5zaWduZWQgbG9uZyBfeSA9ICh1bnNpZ25lZCBsb25nKShZKTsJCQkJXAorCV9fdHlwZW9mX18oWCkgX3ggPSAoWCk7CQkJCQkJXAorCV9fdHlwZW9mX18oWSkgX3kgPSAoX190eXBlb2ZfXyhYKSkoWSk7CQkJCVwKIAlpZiAodW5saWtlbHkoIShfeCBPUCBfeSkpKSB7CQkJCQlcCi0JCXByX2VycigiQXNzZXJ0aW9uIGZhaWxlZCAtICVsdSgweCVseCkgJXMgJWx1KDB4JWx4KSBpcyBmYWxzZVxuIiwJCQlcCi0JCSAgICAgICBfeCwgX3gsICNPUCwgX3ksIF95KTsJCQkJXAorCQlwcl9lcnIoIkFzc2VydGlvbiBmYWlsZWQgLSAlbHUoMHglbHgpICVzICVsdSgweCVseCkgaXMgZmFsc2VcbiIsIFwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKV94LCAodW5zaWduZWQgbG9uZylfeCwgI09QLAlcCisJCSAgICAgICAodW5zaWduZWQgbG9uZylfeSwgKHVuc2lnbmVkIGxvbmcpX3kpOwkJXAogCQlCVUcoKTsJCQkJCQkJXAogCX0JCQkJCQkJCVwKIH0gd2hpbGUgKDApCkBAIC04NjQsMTEgKzEyODksMTIgQEAKIAogI2RlZmluZSBBU1NFUlRJRkNNUChDLCBYLCBPUCwgWSkJCQkJCVwKIGRvIHsJCQkJCQkJCQlcCi0JdW5zaWduZWQgbG9uZyBfeCA9ICh1bnNpZ25lZCBsb25nKShYKTsJCQkJXAotCXVuc2lnbmVkIGxvbmcgX3kgPSAodW5zaWduZWQgbG9uZykoWSk7CQkJCVwKKwlfX3R5cGVvZl9fKFgpIF94ID0gKFgpOwkJCQkJCVwKKwlfX3R5cGVvZl9fKFkpIF95ID0gKF9fdHlwZW9mX18oWCkpKFkpOwkJCQlcCiAJaWYgKHVubGlrZWx5KChDKSAmJiAhKF94IE9QIF95KSkpIHsJCQkJXAogCQlwcl9lcnIoIkFzc2VydGlvbiBmYWlsZWQgLSAlbHUoMHglbHgpICVzICVsdSgweCVseCkgaXMgZmFsc2VcbiIsIFwKLQkJICAgICAgIF94LCBfeCwgI09QLCBfeSwgX3kpOwkJCQlcCisJCSAgICAgICAodW5zaWduZWQgbG9uZylfeCwgKHVuc2lnbmVkIGxvbmcpX3gsICNPUCwJXAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpX3ksICh1bnNpZ25lZCBsb25nKV95KTsJCVwKIAkJQlVHKCk7CQkJCQkJCVwKIAl9CQkJCQkJCQlcCiB9IHdoaWxlICgwKQpAQCAtODkyLDU0ICsxMzE4LDMgQEAKIH0gd2hpbGUgKDApCiAKICNlbmRpZiAvKiBfX0tERUJVR0FMTCAqLwotCi0vKgotICogc29ja2V0IGJ1ZmZlciBhY2NvdW50aW5nIC8gbGVhayBmaW5kaW5nCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3J4cnBjX25ld19za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3QgY2hhciAqZm4pCi17Ci0JLy9fbmV0KCJuZXcgc2tiICVwICVzIFslZF0iLCBza2IsIGZuLCBhdG9taWNfcmVhZCgmcnhycGNfbl9za2JzKSk7Ci0JLy9hdG9taWNfaW5jKCZyeHJwY19uX3NrYnMpOwotfQotCi0jZGVmaW5lIHJ4cnBjX25ld19za2Ioc2tiKSBfX3J4cnBjX25ld19za2IoKHNrYiksIF9fZnVuY19fKQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19yeHJwY19raWxsX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBjaGFyICpmbikKLXsKLQkvL19uZXQoImtpbGwgc2tiICVwICVzIFslZF0iLCBza2IsIGZuLCBhdG9taWNfcmVhZCgmcnhycGNfbl9za2JzKSk7Ci0JLy9hdG9taWNfZGVjKCZyeHJwY19uX3NrYnMpOwotfQotCi0jZGVmaW5lIHJ4cnBjX2tpbGxfc2tiKHNrYikgX19yeHJwY19raWxsX3NrYigoc2tiKSwgX19mdW5jX18pCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3J4cnBjX2ZyZWVfc2tiKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IGNoYXIgKmZuKQotewotCWlmIChza2IpIHsKLQkJQ0hFQ0tfU0xBQl9PS0FZKCZza2ItPnVzZXJzKTsKLQkJLy9fbmV0KCJmcmVlIHNrYiAlcCAlcyBbJWRdIiwKLQkJLy8gICAgIHNrYiwgZm4sIGF0b21pY19yZWFkKCZyeHJwY19uX3NrYnMpKTsKLQkJLy9hdG9taWNfZGVjKCZyeHJwY19uX3NrYnMpOwotCQlrZnJlZV9za2Ioc2tiKTsKLQl9Ci19Ci0KLSNkZWZpbmUgcnhycGNfZnJlZV9za2Ioc2tiKSBfX3J4cnBjX2ZyZWVfc2tiKChza2IpLCBfX2Z1bmNfXykKLQotc3RhdGljIGlubGluZSB2b2lkIHJ4cnBjX3B1cmdlX3F1ZXVlKHN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKChsaXN0KSkpICE9IE5VTEwpCi0JCXJ4cnBjX2ZyZWVfc2tiKHNrYik7Ci19Ci0KLSNkZWZpbmUgcnhycGNfZ2V0X2NhbGwoQ0FMTCkJCQkJXAotZG8gewkJCQkJCQlcCi0JQ0hFQ0tfU0xBQl9PS0FZKCYoQ0FMTCktPnVzYWdlKTsJCVwKLQlpZiAoYXRvbWljX2luY19yZXR1cm4oJihDQUxMKS0+dXNhZ2UpID09IDEpCVwKLQkJQlVHKCk7CQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIHJ4cnBjX3B1dF9jYWxsKENBTEwpCQkJCVwKLWRvIHsJCQkJCQkJXAotCV9fcnhycGNfcHV0X2NhbGwoQ0FMTCk7CQkJCVwKLX0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9uZXQvcnhycGMvY2FsbF9hY2NlcHQuYyBiL25ldC9yeHJwYy9jYWxsX2FjY2VwdC5jCmluZGV4IDBiMjgzMjEuLjNjYWMyMzEgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9jYWxsX2FjY2VwdC5jCisrKyBiL25ldC9yeHJwYy9jYWxsX2FjY2VwdC5jCkBAIC0yMCwyNjQgKzIwLDQwOSBAQAogI2luY2x1ZGUgPGxpbnV4L2luNi5oPgogI2luY2x1ZGUgPGxpbnV4L2ljbXAuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9jaXJjX2J1Zi5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L2FmX3J4cnBjLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSAiYXItaW50ZXJuYWwuaCIKIAogLyoKLSAqIGdlbmVyYXRlIGEgY29ubmVjdGlvbi1sZXZlbCBhYm9ydAorICogUHJlYWxsb2NhdGUgYSBzaW5nbGUgc2VydmljZSBjYWxsLCBjb25uZWN0aW9uIGFuZCBwZWVyIGFuZCwgaWYgcG9zc2libGUsCisgKiBnaXZlIHRoZW0gYSB1c2VyIElEIGFuZCBhdHRhY2ggdGhlIHVzZXIncyBzaWRlIG9mIHRoZSBJRCB0byB0aGVtLgogICovCi1zdGF0aWMgaW50IHJ4cnBjX2J1c3koc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCwgc3RydWN0IHNvY2thZGRyX3J4cnBjICpzcngsCi0JCSAgICAgIHN0cnVjdCByeHJwY193aXJlX2hlYWRlciAqd2hkcikKK3N0YXRpYyBpbnQgcnhycGNfc2VydmljZV9wcmVhbGxvY19vbmUoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAorCQkJCSAgICAgIHN0cnVjdCByeHJwY19iYWNrbG9nICpiLAorCQkJCSAgICAgIHJ4cnBjX25vdGlmeV9yeF90IG5vdGlmeV9yeCwKKwkJCQkgICAgICByeHJwY191c2VyX2F0dGFjaF9jYWxsX3QgdXNlcl9hdHRhY2hfY2FsbCwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCwgZ2ZwX3QgZ2ZwKQogewotCXN0cnVjdCBtc2doZHIgbXNnOwotCXN0cnVjdCBrdmVjIGlvdlsxXTsKLQlzaXplX3QgbGVuOwotCWludCByZXQ7CisJY29uc3Qgdm9pZCAqaGVyZSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKwlpbnQgbWF4LCB0bXA7CisJdW5zaWduZWQgaW50IHNpemUgPSBSWFJQQ19CQUNLTE9HX01BWDsKKwl1bnNpZ25lZCBpbnQgaGVhZCwgdGFpbCwgY2FsbF9oZWFkLCBjYWxsX3RhaWw7CiAKLQlfZW50ZXIoIiVkLCwiLCBsb2NhbC0+ZGVidWdfaWQpOworCW1heCA9IHJ4LT5zay5za19tYXhfYWNrX2JhY2tsb2c7CisJdG1wID0gcngtPnNrLnNrX2Fja19iYWNrbG9nOworCWlmICh0bXAgPj0gbWF4KSB7CisJCV9sZWF2ZSgiID0gLUVOT0JVRlMgW2Z1bGwgJXVdIiwgbWF4KTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKwltYXggLT0gdG1wOwogCi0Jd2hkci0+dHlwZQk9IFJYUlBDX1BBQ0tFVF9UWVBFX0JVU1k7Ci0Jd2hkci0+c2VyaWFsCT0gaHRvbmwoMSk7CisJLyogV2UgZG9uJ3QgbmVlZCBtb3JlIGNvbm5zIGFuZCBwZWVycyB0aGFuIHdlIGhhdmUgY2FsbHMsIGJ1dCBvbiB0aGUKKwkgKiBvdGhlciBoYW5kLCB3ZSBzaG91bGRuJ3QgZXZlciB1c2UgbW9yZSBwZWVycyB0aGFuIGNvbm5zIG9yIGNvbm5zCisJICogdGhhbiBjYWxscy4KKwkgKi8KKwljYWxsX2hlYWQgPSBiLT5jYWxsX2JhY2tsb2dfaGVhZDsKKwljYWxsX3RhaWwgPSBSRUFEX09OQ0UoYi0+Y2FsbF9iYWNrbG9nX3RhaWwpOworCXRtcCA9IENJUkNfQ05UKGNhbGxfaGVhZCwgY2FsbF90YWlsLCBzaXplKTsKKwlpZiAodG1wID49IG1heCkgeworCQlfbGVhdmUoIiA9IC1FTk9CVUZTIFtlbm91Z2ggJXVdIiwgdG1wKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKwltYXggPSB0bXAgKyAxOwogCi0JbXNnLm1zZ19uYW1lCT0gJnNyeC0+dHJhbnNwb3J0LnNpbjsKLQltc2cubXNnX25hbWVsZW4JPSBzaXplb2Yoc3J4LT50cmFuc3BvcnQuc2luKTsKLQltc2cubXNnX2NvbnRyb2wJPSBOVUxMOwotCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7Ci0JbXNnLm1zZ19mbGFncwk9IDA7Ci0KLQlpb3ZbMF0uaW92X2Jhc2UJPSB3aGRyOwotCWlvdlswXS5pb3ZfbGVuCT0gc2l6ZW9mKCp3aGRyKTsKLQotCWxlbiA9IGlvdlswXS5pb3ZfbGVuOwotCi0JX3Byb3RvKCJUeCBCVVNZICUlMSIpOwotCi0JcmV0ID0ga2VybmVsX3NlbmRtc2cobG9jYWwtPnNvY2tldCwgJm1zZywgaW92LCAxLCBsZW4pOwotCWlmIChyZXQgPCAwKSB7Ci0JCV9sZWF2ZSgiID0gLUVBR0FJTiBbc2VuZG1zZyBmYWlsZWQ6ICVkXSIsIHJldCk7Ci0JCXJldHVybiAtRUFHQUlOOworCWhlYWQgPSBiLT5wZWVyX2JhY2tsb2dfaGVhZDsKKwl0YWlsID0gUkVBRF9PTkNFKGItPnBlZXJfYmFja2xvZ190YWlsKTsKKwlpZiAoQ0lSQ19DTlQoaGVhZCwgdGFpbCwgc2l6ZSkgPCBtYXgpIHsKKwkJc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIgPSByeHJwY19hbGxvY19wZWVyKHJ4LT5sb2NhbCwgZ2ZwKTsKKwkJaWYgKCFwZWVyKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWItPnBlZXJfYmFja2xvZ1toZWFkXSA9IHBlZXI7CisJCXNtcF9zdG9yZV9yZWxlYXNlKCZiLT5wZWVyX2JhY2tsb2dfaGVhZCwKKwkJCQkgIChoZWFkICsgMSkgJiAoc2l6ZSAtIDEpKTsKIAl9CiAKLQlfbGVhdmUoIiA9IDAiKTsKKwloZWFkID0gYi0+Y29ubl9iYWNrbG9nX2hlYWQ7CisJdGFpbCA9IFJFQURfT05DRShiLT5jb25uX2JhY2tsb2dfdGFpbCk7CisJaWYgKENJUkNfQ05UKGhlYWQsIHRhaWwsIHNpemUpIDwgbWF4KSB7CisJCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOworCisJCWNvbm4gPSByeHJwY19wcmVhbGxvY19zZXJ2aWNlX2Nvbm5lY3Rpb24oZ2ZwKTsKKwkJaWYgKCFjb25uKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWItPmNvbm5fYmFja2xvZ1toZWFkXSA9IGNvbm47CisJCXNtcF9zdG9yZV9yZWxlYXNlKCZiLT5jb25uX2JhY2tsb2dfaGVhZCwKKwkJCQkgIChoZWFkICsgMSkgJiAoc2l6ZSAtIDEpKTsKKworCQl0cmFjZV9yeHJwY19jb25uKGNvbm4sIHJ4cnBjX2Nvbm5fbmV3X3NlcnZpY2UsCisJCQkJIGF0b21pY19yZWFkKCZjb25uLT51c2FnZSksIGhlcmUpOworCX0KKworCS8qIE5vdyBpdCBnZXRzIGNvbXBsaWNhdGVkLCBiZWNhdXNlIGNhbGxzIGdldCByZWdpc3RlcmVkIHdpdGggdGhlCisJICogc29ja2V0IGhlcmUsIHBhcnRpY3VsYXJseSBpZiBhIHVzZXIgSUQgaXMgcHJlYXNzaWduZWQgYnkgdGhlIHVzZXIuCisJICovCisJY2FsbCA9IHJ4cnBjX2FsbG9jX2NhbGwoZ2ZwKTsKKwlpZiAoIWNhbGwpCisJCXJldHVybiAtRU5PTUVNOworCWNhbGwtPmZsYWdzIHw9ICgxIDw8IFJYUlBDX0NBTExfSVNfU0VSVklDRSk7CisJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX1NFUlZFUl9QUkVBTExPQzsKKworCXRyYWNlX3J4cnBjX2NhbGwoY2FsbCwgcnhycGNfY2FsbF9uZXdfc2VydmljZSwKKwkJCSBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpLAorCQkJIGhlcmUsIChjb25zdCB2b2lkICopdXNlcl9jYWxsX0lEKTsKKworCXdyaXRlX2xvY2soJnJ4LT5jYWxsX2xvY2spOworCWlmICh1c2VyX2F0dGFjaF9jYWxsKSB7CisJCXN0cnVjdCByeHJwY19jYWxsICp4Y2FsbDsKKwkJc3RydWN0IHJiX25vZGUgKnBhcmVudCwgKipwcDsKKworCQkvKiBDaGVjayB0aGUgdXNlciBJRCBpc24ndCBhbHJlYWR5IGluIHVzZSAqLworCQlwcCA9ICZyeC0+Y2FsbHMucmJfbm9kZTsKKwkJcGFyZW50ID0gTlVMTDsKKwkJd2hpbGUgKCpwcCkgeworCQkJcGFyZW50ID0gKnBwOworCQkJeGNhbGwgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCByeHJwY19jYWxsLCBzb2NrX25vZGUpOworCQkJaWYgKHVzZXJfY2FsbF9JRCA8IGNhbGwtPnVzZXJfY2FsbF9JRCkKKwkJCQlwcCA9ICYoKnBwKS0+cmJfbGVmdDsKKwkJCWVsc2UgaWYgKHVzZXJfY2FsbF9JRCA+IGNhbGwtPnVzZXJfY2FsbF9JRCkKKwkJCQlwcCA9ICYoKnBwKS0+cmJfcmlnaHQ7CisJCQllbHNlCisJCQkJZ290byBpZF9pbl91c2U7CisJCX0KKworCQljYWxsLT51c2VyX2NhbGxfSUQgPSB1c2VyX2NhbGxfSUQ7CisJCWNhbGwtPm5vdGlmeV9yeCA9IG5vdGlmeV9yeDsKKwkJcnhycGNfZ2V0X2NhbGwoY2FsbCwgcnhycGNfY2FsbF9nb3Rfa2VybmVsKTsKKwkJdXNlcl9hdHRhY2hfY2FsbChjYWxsLCB1c2VyX2NhbGxfSUQpOworCQlyeHJwY19nZXRfY2FsbChjYWxsLCByeHJwY19jYWxsX2dvdF91c2VyaWQpOworCQlyYl9saW5rX25vZGUoJmNhbGwtPnNvY2tfbm9kZSwgcGFyZW50LCBwcCk7CisJCXJiX2luc2VydF9jb2xvcigmY2FsbC0+c29ja19ub2RlLCAmcngtPmNhbGxzKTsKKwkJc2V0X2JpdChSWFJQQ19DQUxMX0hBU19VU0VSSUQsICZjYWxsLT5mbGFncyk7CisJfQorCisJbGlzdF9hZGQoJmNhbGwtPnNvY2tfbGluaywgJnJ4LT5zb2NrX2NhbGxzKTsKKworCXdyaXRlX3VubG9jaygmcngtPmNhbGxfbG9jayk7CisKKwl3cml0ZV9sb2NrKCZyeHJwY19jYWxsX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJmNhbGwtPmxpbmssICZyeHJwY19jYWxscyk7CisJd3JpdGVfdW5sb2NrKCZyeHJwY19jYWxsX2xvY2spOworCisJYi0+Y2FsbF9iYWNrbG9nW2NhbGxfaGVhZF0gPSBjYWxsOworCXNtcF9zdG9yZV9yZWxlYXNlKCZiLT5jYWxsX2JhY2tsb2dfaGVhZCwgKGNhbGxfaGVhZCArIDEpICYgKHNpemUgLSAxKSk7CisJX2xlYXZlKCIgPSAwIFslZCAtPiAlbHhdIiwgY2FsbC0+ZGVidWdfaWQsIHVzZXJfY2FsbF9JRCk7CisJcmV0dXJuIDA7CisKK2lkX2luX3VzZToKKwl3cml0ZV91bmxvY2soJnJ4LT5jYWxsX2xvY2spOworCXJ4cnBjX2NsZWFudXBfY2FsbChjYWxsKTsKKwlfbGVhdmUoIiA9IC1FQkFEU0xUIik7CisJcmV0dXJuIC1FQkFEU0xUOworfQorCisvKgorICogUHJlYWxsb2NhdGUgc3VmZmljaWVudCBzZXJ2aWNlIGNvbm5lY3Rpb25zLCBjYWxscyBhbmQgcGVlcnMgdG8gY292ZXIgdGhlCisgKiBlbnRpcmUgYmFja2xvZyBvZiBhIHNvY2tldC4gIFdoZW4gYSBuZXcgY2FsbCBjb21lcyBpbiwgaWYgd2UgZG9uJ3QgaGF2ZQorICogc3VmZmljaWVudCBvZiBlYWNoIGF2YWlsYWJsZSwgdGhlIGNhbGwgZ2V0cyByZWplY3RlZCBhcyBidXN5IG9yIGlnbm9yZWQuCisgKgorICogVGhlIGJhY2tsb2cgaXMgcmVwbGVuaXNoZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgYWNjZXB0ZWQgb3IgcmVqZWN0ZWQuCisgKi8KK2ludCByeHJwY19zZXJ2aWNlX3ByZWFsbG9jKHN0cnVjdCByeHJwY19zb2NrICpyeCwgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCByeHJwY19iYWNrbG9nICpiID0gcngtPmJhY2tsb2c7CisKKwlpZiAoIWIpIHsKKwkJYiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByeHJwY19iYWNrbG9nKSwgZ2ZwKTsKKwkJaWYgKCFiKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXJ4LT5iYWNrbG9nID0gYjsKKwl9CisKKwlpZiAocngtPmRpc2NhcmRfbmV3X2NhbGwpCisJCXJldHVybiAwOworCisJd2hpbGUgKHJ4cnBjX3NlcnZpY2VfcHJlYWxsb2Nfb25lKHJ4LCBiLCBOVUxMLCBOVUxMLCAwLCBnZnApID09IDApCisJCTsKKwogCXJldHVybiAwOwogfQogCiAvKgotICogYWNjZXB0IGFuIGluY29taW5nIGNhbGwgdGhhdCBuZWVkcyBwZWVyLCB0cmFuc3BvcnQgYW5kL29yIGNvbm5lY3Rpb24gc2V0dGluZwotICogdXAKKyAqIERpc2NhcmQgdGhlIHByZWFsbG9jYXRpb24gb24gYSBzZXJ2aWNlLgogICovCi1zdGF0aWMgaW50IHJ4cnBjX2FjY2VwdF9pbmNvbWluZ19jYWxsKHN0cnVjdCByeHJwY19sb2NhbCAqbG9jYWwsCi0JCQkJICAgICAgc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAotCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgICAgc3RydWN0IHNvY2thZGRyX3J4cnBjICpzcngpCit2b2lkIHJ4cnBjX2Rpc2NhcmRfcHJlYWxsb2Moc3RydWN0IHJ4cnBjX3NvY2sgKnJ4KQogewotCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOwotCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AsICpuc3A7CisJc3RydWN0IHJ4cnBjX2JhY2tsb2cgKmIgPSByeC0+YmFja2xvZzsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IFJYUlBDX0JBQ0tMT0dfTUFYLCBoZWFkLCB0YWlsOworCisJaWYgKCFiKQorCQlyZXR1cm47CisJcngtPmJhY2tsb2cgPSBOVUxMOworCisJLyogTWFrZSBzdXJlIHRoYXQgdGhlcmUgYXJlbid0IGFueSBpbmNvbWluZyBjYWxscyBpbiBwcm9ncmVzcyBiZWZvcmUgd2UKKwkgKiBjbGVhciB0aGUgcHJlYWxsb2NhdGlvbiBidWZmZXJzLgorCSAqLworCXNwaW5fbG9ja19iaCgmcngtPmluY29taW5nX2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZyeC0+aW5jb21pbmdfbG9jayk7CisKKwloZWFkID0gYi0+cGVlcl9iYWNrbG9nX2hlYWQ7CisJdGFpbCA9IGItPnBlZXJfYmFja2xvZ190YWlsOworCXdoaWxlIChDSVJDX0NOVChoZWFkLCB0YWlsLCBzaXplKSA+IDApIHsKKwkJc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIgPSBiLT5wZWVyX2JhY2tsb2dbdGFpbF07CisJCWtmcmVlKHBlZXIpOworCQl0YWlsID0gKHRhaWwgKyAxKSAmIChzaXplIC0gMSk7CisJfQorCisJaGVhZCA9IGItPmNvbm5fYmFja2xvZ19oZWFkOworCXRhaWwgPSBiLT5jb25uX2JhY2tsb2dfdGFpbDsKKwl3aGlsZSAoQ0lSQ19DTlQoaGVhZCwgdGFpbCwgc2l6ZSkgPiAwKSB7CisJCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uID0gYi0+Y29ubl9iYWNrbG9nW3RhaWxdOworCQl3cml0ZV9sb2NrKCZyeHJwY19jb25uZWN0aW9uX2xvY2spOworCQlsaXN0X2RlbCgmY29ubi0+bGluayk7CisJCWxpc3RfZGVsKCZjb25uLT5wcm9jX2xpbmspOworCQl3cml0ZV91bmxvY2soJnJ4cnBjX2Nvbm5lY3Rpb25fbG9jayk7CisJCWtmcmVlKGNvbm4pOworCQl0YWlsID0gKHRhaWwgKyAxKSAmIChzaXplIC0gMSk7CisJfQorCisJaGVhZCA9IGItPmNhbGxfYmFja2xvZ19oZWFkOworCXRhaWwgPSBiLT5jYWxsX2JhY2tsb2dfdGFpbDsKKwl3aGlsZSAoQ0lSQ19DTlQoaGVhZCwgdGFpbCwgc2l6ZSkgPiAwKSB7CisJCXN0cnVjdCByeHJwY19jYWxsICpjYWxsID0gYi0+Y2FsbF9iYWNrbG9nW3RhaWxdOworCQlpZiAocngtPmRpc2NhcmRfbmV3X2NhbGwpIHsKKwkJCV9kZWJ1ZygiZGlzY2FyZCAlbHgiLCBjYWxsLT51c2VyX2NhbGxfSUQpOworCQkJcngtPmRpc2NhcmRfbmV3X2NhbGwoY2FsbCwgY2FsbC0+dXNlcl9jYWxsX0lEKTsKKwkJCXJ4cnBjX3B1dF9jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfcHV0X2tlcm5lbCk7CisJCX0KKwkJcnhycGNfY2FsbF9jb21wbGV0ZWQoY2FsbCk7CisJCXJ4cnBjX3JlbGVhc2VfY2FsbChyeCwgY2FsbCk7CisJCXJ4cnBjX3B1dF9jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfcHV0KTsKKwkJdGFpbCA9ICh0YWlsICsgMSkgJiAoc2l6ZSAtIDEpOworCX0KKworCWtmcmVlKGIpOworfQorCisvKgorICogQWxsb2NhdGUgYSBuZXcgaW5jb21pbmcgY2FsbCBmcm9tIHRoZSBwcmVhbGxvYyBwb29sLCBhbG9uZyB3aXRoIGEgY29ubmVjdGlvbgorICogYW5kIGEgcGVlciBhcyBuZWNlc3NhcnkuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfYWxsb2NfaW5jb21pbmdfY2FsbChzdHJ1Y3QgcnhycGNfc29jayAqcngsCisJCQkJCQkgICAgc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCwKKwkJCQkJCSAgICBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKKwkJCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByeHJwY19iYWNrbG9nICpiID0gcngtPmJhY2tsb2c7CisJc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIsICp4cGVlcjsKIAlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqbm90aWZpY2F0aW9uOwotCWludCByZXQ7CisJdW5zaWduZWQgc2hvcnQgY2FsbF9oZWFkLCBjb25uX2hlYWQsIHBlZXJfaGVhZDsKKwl1bnNpZ25lZCBzaG9ydCBjYWxsX3RhaWwsIGNvbm5fdGFpbCwgcGVlcl90YWlsOworCXVuc2lnbmVkIHNob3J0IGNhbGxfY291bnQsIGNvbm5fY291bnQ7CisKKwkvKiAjY2FsbHMgPj0gI2Nvbm5zID49ICNwZWVycyBtdXN0IGhvbGQgdHJ1ZS4gKi8KKwljYWxsX2hlYWQgPSBzbXBfbG9hZF9hY3F1aXJlKCZiLT5jYWxsX2JhY2tsb2dfaGVhZCk7CisJY2FsbF90YWlsID0gYi0+Y2FsbF9iYWNrbG9nX3RhaWw7CisJY2FsbF9jb3VudCA9IENJUkNfQ05UKGNhbGxfaGVhZCwgY2FsbF90YWlsLCBSWFJQQ19CQUNLTE9HX01BWCk7CisJY29ubl9oZWFkID0gc21wX2xvYWRfYWNxdWlyZSgmYi0+Y29ubl9iYWNrbG9nX2hlYWQpOworCWNvbm5fdGFpbCA9IGItPmNvbm5fYmFja2xvZ190YWlsOworCWNvbm5fY291bnQgPSBDSVJDX0NOVChjb25uX2hlYWQsIGNvbm5fdGFpbCwgUlhSUENfQkFDS0xPR19NQVgpOworCUFTU0VSVENNUChjb25uX2NvdW50LCA+PSwgY2FsbF9jb3VudCk7CisJcGVlcl9oZWFkID0gc21wX2xvYWRfYWNxdWlyZSgmYi0+cGVlcl9iYWNrbG9nX2hlYWQpOworCXBlZXJfdGFpbCA9IGItPnBlZXJfYmFja2xvZ190YWlsOworCUFTU0VSVENNUChDSVJDX0NOVChwZWVyX2hlYWQsIHBlZXJfdGFpbCwgUlhSUENfQkFDS0xPR19NQVgpLCA+PSwKKwkJICBjb25uX2NvdW50KTsKKworCWlmIChjYWxsX2NvdW50ID09IDApCisJCXJldHVybiBOVUxMOworCisJaWYgKCFjb25uKSB7CisJCS8qIE5vIGNvbm5lY3Rpb24uICBXZSdyZSBnb2luZyB0byBuZWVkIGEgcGVlciB0byBzdGFydCBvZmYKKwkJICogd2l0aC4gIElmIG9uZSBkb2Vzbid0IHlldCBleGlzdCwgdXNlIGEgc3BhcmUgZnJvbSB0aGUKKwkJICogcHJlYWxsb2NhdGlvbiBzZXQuICBXZSBkdW1wIHRoZSBhZGRyZXNzIGludG8gdGhlIHNwYXJlIGluCisJCSAqIGFudGljaXBhdGlvbiAtIGFuZCB0byBzYXZlIG9uIHN0YWNrIHNwYWNlLgorCQkgKi8KKwkJeHBlZXIgPSBiLT5wZWVyX2JhY2tsb2dbcGVlcl90YWlsXTsKKwkJaWYgKHJ4cnBjX2V4dHJhY3RfYWRkcl9mcm9tX3NrYigmeHBlZXItPnNyeCwgc2tiKSA8IDApCisJCQlyZXR1cm4gTlVMTDsKKworCQlwZWVyID0gcnhycGNfbG9va3VwX2luY29taW5nX3BlZXIobG9jYWwsIHhwZWVyKTsKKwkJaWYgKHBlZXIgPT0geHBlZXIpIHsKKwkJCWItPnBlZXJfYmFja2xvZ1twZWVyX3RhaWxdID0gTlVMTDsKKwkJCXNtcF9zdG9yZV9yZWxlYXNlKCZiLT5wZWVyX2JhY2tsb2dfdGFpbCwKKwkJCQkJICAocGVlcl90YWlsICsgMSkgJgorCQkJCQkgIChSWFJQQ19CQUNLTE9HX01BWCAtIDEpKTsKKwkJfQorCisJCS8qIE5vdyBhbGxvY2F0ZSBhbmQgc2V0IHVwIHRoZSBjb25uZWN0aW9uICovCisJCWNvbm4gPSBiLT5jb25uX2JhY2tsb2dbY29ubl90YWlsXTsKKwkJYi0+Y29ubl9iYWNrbG9nW2Nvbm5fdGFpbF0gPSBOVUxMOworCQlzbXBfc3RvcmVfcmVsZWFzZSgmYi0+Y29ubl9iYWNrbG9nX3RhaWwsCisJCQkJICAoY29ubl90YWlsICsgMSkgJiAoUlhSUENfQkFDS0xPR19NQVggLSAxKSk7CisJCXJ4cnBjX2dldF9sb2NhbChsb2NhbCk7CisJCWNvbm4tPnBhcmFtcy5sb2NhbCA9IGxvY2FsOworCQljb25uLT5wYXJhbXMucGVlciA9IHBlZXI7CisJCXJ4cnBjX3NlZV9jb25uZWN0aW9uKGNvbm4pOworCQlyeHJwY19uZXdfaW5jb21pbmdfY29ubmVjdGlvbihjb25uLCBza2IpOworCX0gZWxzZSB7CisJCXJ4cnBjX2dldF9jb25uZWN0aW9uKGNvbm4pOworCX0KKworCS8qIEFuZCBub3cgd2UgY2FuIGFsbG9jYXRlIGFuZCBzZXQgdXAgYSBuZXcgY2FsbCAqLworCWNhbGwgPSBiLT5jYWxsX2JhY2tsb2dbY2FsbF90YWlsXTsKKwliLT5jYWxsX2JhY2tsb2dbY2FsbF90YWlsXSA9IE5VTEw7CisJc21wX3N0b3JlX3JlbGVhc2UoJmItPmNhbGxfYmFja2xvZ190YWlsLAorCQkJICAoY2FsbF90YWlsICsgMSkgJiAoUlhSUENfQkFDS0xPR19NQVggLSAxKSk7CisKKwlyeHJwY19zZWVfY2FsbChjYWxsKTsKKwljYWxsLT5jb25uID0gY29ubjsKKwljYWxsLT5wZWVyID0gcnhycGNfZ2V0X3BlZXIoY29ubi0+cGFyYW1zLnBlZXIpOworCXJldHVybiBjYWxsOworfQorCisvKgorICogU2V0IHVwIGEgbmV3IGluY29taW5nIGNhbGwuICBDYWxsZWQgaW4gQkggY29udGV4dCB3aXRoIHRoZSBSQ1UgcmVhZCBsb2NrCisgKiBoZWxkLgorICoKKyAqIElmIHRoaXMgaXMgZm9yIGEga2VybmVsIHNlcnZpY2UsIHdoZW4gd2UgYWxsb2NhdGUgdGhlIGNhbGwsIGl0IHdpbGwgaGF2ZQorICogdGhyZWUgcmVmcyBvbiBpdDogKDEpIHRoZSBrZXJuZWwgc2VydmljZSwgKDIpIHRoZSB1c2VyX2NhbGxfSUQgdHJlZSwgKDMpIHRoZQorICogcmV0YWluZXIgcmVmIG9idGFpbmVkIGZyb20gdGhlIGJhY2tsb2cgYnVmZmVyLiAgUHJlYWxsb2MgY2FsbHMgZm9yIHVzZXJzcGFjZQorICogc2VydmljZXMgb25seSBoYXZlIHRoZSByZWYgZnJvbSB0aGUgYmFja2xvZyBidWZmZXIuICBXZSB3YW50IHRvIHBhc3MgdGhpcworICogcmVmIHRvIG5vbi1CSCBjb250ZXh0IHRvIGRpc3Bvc2Ugb2YuCisgKgorICogSWYgd2Ugd2FudCB0byByZXBvcnQgYW4gZXJyb3IsIHdlIG1hcmsgdGhlIHNrYiB3aXRoIHRoZSBwYWNrZXQgdHlwZSBhbmQKKyAqIGFib3J0IGNvZGUgYW5kIHJldHVybiBOVUxMLgorICovCitzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfbmV3X2luY29taW5nX2NhbGwoc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCwKKwkJCQkJICAgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCA9IHJ4cnBjX3NrYihza2IpOworCXN0cnVjdCByeHJwY19zb2NrICpyeDsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKwl1MTYgc2VydmljZV9pZCA9IHNwLT5oZHIuc2VydmljZUlkOwogCiAJX2VudGVyKCIiKTsKIAotCXNwID0gcnhycGNfc2tiKHNrYik7CisJLyogR2V0IHRoZSBzb2NrZXQgcHJvdmlkaW5nIHRoZSBzZXJ2aWNlICovCisJcnggPSByY3VfZGVyZWZlcmVuY2UobG9jYWwtPnNlcnZpY2UpOworCWlmIChzZXJ2aWNlX2lkID09IHJ4LT5zcnguc3J4X3NlcnZpY2UpCisJCWdvdG8gZm91bmRfc2VydmljZTsKIAotCS8qIGdldCBhIG5vdGlmaWNhdGlvbiBtZXNzYWdlIHRvIHNlbmQgdG8gdGhlIHNlcnZlciBhcHAgKi8KLQlub3RpZmljYXRpb24gPSBhbGxvY19za2IoMCwgR0ZQX05PRlMpOwotCWlmICghbm90aWZpY2F0aW9uKSB7Ci0JCV9kZWJ1Zygibm8gbWVtb3J5Iik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3Jfbm9mcmVlOwotCX0KLQlyeHJwY19uZXdfc2tiKG5vdGlmaWNhdGlvbik7Ci0Jbm90aWZpY2F0aW9uLT5tYXJrID0gUlhSUENfU0tCX01BUktfTkVXX0NBTEw7Ci0KLQljb25uID0gcnhycGNfaW5jb21pbmdfY29ubmVjdGlvbihsb2NhbCwgc3J4LCBza2IpOwotCWlmIChJU19FUlIoY29ubikpIHsKLQkJX2RlYnVnKCJubyBjb25uIik7Ci0JCXJldCA9IFBUUl9FUlIoY29ubik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCi0JY2FsbCA9IHJ4cnBjX2luY29taW5nX2NhbGwocngsIGNvbm4sIHNrYik7Ci0JcnhycGNfcHV0X2Nvbm5lY3Rpb24oY29ubik7Ci0JaWYgKElTX0VSUihjYWxsKSkgewotCQlfZGVidWcoIm5vIGNhbGwiKTsKLQkJcmV0ID0gUFRSX0VSUihjYWxsKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQkvKiBhdHRhY2ggdGhlIGNhbGwgdG8gdGhlIHNvY2tldCAqLwotCXJlYWRfbG9ja19iaCgmbG9jYWwtPnNlcnZpY2VzX2xvY2spOwotCWlmIChyeC0+c2suc2tfc3RhdGUgPT0gUlhSUENfQ0xPU0UpCi0JCWdvdG8gaW52YWxpZF9zZXJ2aWNlOwotCi0Jd3JpdGVfbG9jaygmcngtPmNhbGxfbG9jayk7Ci0JaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfSU5JVF9BQ0NFUFQsICZjYWxsLT5mbGFncykpIHsKLQkJcnhycGNfZ2V0X2NhbGwoY2FsbCk7Ci0KLQkJc3Bpbl9sb2NrKCZjYWxsLT5jb25uLT5zdGF0ZV9sb2NrKTsKLQkJaWYgKHNwLT5oZHIuc2VjdXJpdHlJbmRleCA+IDAgJiYKLQkJICAgIGNhbGwtPmNvbm4tPnN0YXRlID09IFJYUlBDX0NPTk5fU0VSVklDRV9VTlNFQ1VSRUQpIHsKLQkJCV9kZWJ1ZygiYXdhaXQgY29ubiBzZWMiKTsKLQkJCWxpc3RfYWRkX3RhaWwoJmNhbGwtPmFjY2VwdF9saW5rLCAmcngtPnNlY3VyZXEpOwotCQkJY2FsbC0+Y29ubi0+c3RhdGUgPSBSWFJQQ19DT05OX1NFUlZJQ0VfQ0hBTExFTkdJTkc7Ci0JCQlzZXRfYml0KFJYUlBDX0NPTk5fRVZfQ0hBTExFTkdFLCAmY2FsbC0+Y29ubi0+ZXZlbnRzKTsKLQkJCXJ4cnBjX3F1ZXVlX2Nvbm4oY2FsbC0+Y29ubik7Ci0JCX0gZWxzZSB7Ci0JCQlfZGVidWcoImNvbm4gcmVhZHkiKTsKLQkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9TRVJWRVJfQUNDRVBUSU5HOwotCQkJbGlzdF9hZGRfdGFpbCgmY2FsbC0+YWNjZXB0X2xpbmssICZyeC0+YWNjZXB0cSk7Ci0JCQlyeHJwY19nZXRfY2FsbChjYWxsKTsKLQkJCW5zcCA9IHJ4cnBjX3NrYihub3RpZmljYXRpb24pOwotCQkJbnNwLT5jYWxsID0gY2FsbDsKLQotCQkJQVNTRVJUQ01QKGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSksID49LCAzKTsKLQotCQkJX2RlYnVnKCJub3RpZnkiKTsKLQkJCXNwaW5fbG9jaygmY2FsbC0+bG9jayk7Ci0JCQlyZXQgPSByeHJwY19xdWV1ZV9yY3Zfc2tiKGNhbGwsIG5vdGlmaWNhdGlvbiwgdHJ1ZSwKLQkJCQkJCSAgZmFsc2UpOwotCQkJc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCQkJbm90aWZpY2F0aW9uID0gTlVMTDsKLQkJCUJVR19PTihyZXQgPCAwKTsKLQkJfQotCQlzcGluX3VubG9jaygmY2FsbC0+Y29ubi0+c3RhdGVfbG9jayk7Ci0KLQkJX2RlYnVnKCJxdWV1ZWQiKTsKLQl9Ci0Jd3JpdGVfdW5sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKLQotCV9kZWJ1ZygicHJvY2VzcyIpOwotCXJ4cnBjX2Zhc3RfcHJvY2Vzc19wYWNrZXQoY2FsbCwgc2tiKTsKLQotCV9kZWJ1ZygiZG9uZSIpOwotCXJlYWRfdW5sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7Ci0JcnhycGNfZnJlZV9za2Iobm90aWZpY2F0aW9uKTsKLQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLQlfbGVhdmUoIiA9IDAiKTsKLQlyZXR1cm4gMDsKLQotaW52YWxpZF9zZXJ2aWNlOgotCV9kZWJ1ZygiaW52YWxpZCIpOwotCXJlYWRfdW5sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7Ci0KLQlyZWFkX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCWlmICghdGVzdF9iaXQoUlhSUENfQ0FMTF9SRUxFQVNFRCwgJmNhbGwtPmZsYWdzKSAmJgotCSAgICAhdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX0VWX1JFTEVBU0UsICZjYWxsLT5ldmVudHMpKSB7Ci0JCXJ4cnBjX2dldF9jYWxsKGNhbGwpOwotCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOwotCX0KLQlyZWFkX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0JcmV0ID0gLUVDT05OUkVGVVNFRDsKLWVycm9yOgotCXJ4cnBjX2ZyZWVfc2tiKG5vdGlmaWNhdGlvbik7Ci1lcnJvcl9ub2ZyZWU6Ci0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIGFjY2VwdCBpbmNvbWluZyBjYWxscyB0aGF0IG5lZWQgcGVlciwgdHJhbnNwb3J0IGFuZC9vciBjb25uZWN0aW9uIHNldHRpbmcgdXAKLSAqIC0gdGhlIHBhY2tldHMgd2UgZ2V0IGFyZSBhbGwgaW5jb21pbmcgY2xpZW50IERBVEEgcGFja2V0cyB0aGF0IGhhdmUgc2VxID09IDEKLSAqLwotdm9pZCByeHJwY19hY2NlcHRfaW5jb21pbmdfY2FsbHMoc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCkKLXsKLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOwotCXN0cnVjdCBzb2NrYWRkcl9yeHJwYyBzcng7Ci0Jc3RydWN0IHJ4cnBjX3NvY2sgKnJ4OwotCXN0cnVjdCByeHJwY193aXJlX2hlYWRlciB3aGRyOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0JaW50IHJldDsKLQotCV9lbnRlcigiJWQiLCBsb2NhbC0+ZGVidWdfaWQpOwotCi0Jc2tiID0gc2tiX2RlcXVldWUoJmxvY2FsLT5hY2NlcHRfcXVldWUpOwotCWlmICghc2tiKSB7Ci0JCV9sZWF2ZSgiXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCV9uZXQoImluY29taW5nIGNhbGwgc2tiICVwIiwgc2tiKTsKLQotCXNwID0gcnhycGNfc2tiKHNrYik7Ci0KLQkvKiBTZXQgdXAgYSByZXNwb25zZSBwYWNrZXQgaGVhZGVyIGluIGNhc2Ugd2UgbmVlZCBpdCAqLwotCXdoZHIuZXBvY2gJPSBodG9ubChzcC0+aGRyLmVwb2NoKTsKLQl3aGRyLmNpZAk9IGh0b25sKHNwLT5oZHIuY2lkKTsKLQl3aGRyLmNhbGxOdW1iZXIJPSBodG9ubChzcC0+aGRyLmNhbGxOdW1iZXIpOwotCXdoZHIuc2VxCT0gaHRvbmwoc3AtPmhkci5zZXEpOwotCXdoZHIuc2VyaWFsCT0gMDsKLQl3aGRyLmZsYWdzCT0gMDsKLQl3aGRyLnR5cGUJPSAwOwotCXdoZHIudXNlclN0YXR1cwk9IDA7Ci0Jd2hkci5zZWN1cml0eUluZGV4ID0gc3AtPmhkci5zZWN1cml0eUluZGV4OwotCXdoZHIuX3JzdmQJPSAwOwotCXdoZHIuc2VydmljZUlkCT0gaHRvbnMoc3AtPmhkci5zZXJ2aWNlSWQpOwotCi0JaWYgKHJ4cnBjX2V4dHJhY3RfYWRkcl9mcm9tX3NrYigmc3J4LCBza2IpIDwgMCkKLQkJZ290byBkcm9wOwotCi0JLyogZ2V0IHRoZSBzb2NrZXQgcHJvdmlkaW5nIHRoZSBzZXJ2aWNlICovCi0JcmVhZF9sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShyeCwgJmxvY2FsLT5zZXJ2aWNlcywgbGlzdGVuX2xpbmspIHsKLQkJaWYgKHJ4LT5zcnguc3J4X3NlcnZpY2UgPT0gc3AtPmhkci5zZXJ2aWNlSWQgJiYKLQkJICAgIHJ4LT5zay5za19zdGF0ZSAhPSBSWFJQQ19DTE9TRSkKLQkJCWdvdG8gZm91bmRfc2VydmljZTsKLQl9Ci0JcmVhZF91bmxvY2tfYmgoJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKLQlnb3RvIGludmFsaWRfc2VydmljZTsKKwl0cmFjZV9yeHJwY19hYm9ydCgiSU5WIiwgc3AtPmhkci5jaWQsIHNwLT5oZHIuY2FsbE51bWJlciwgc3AtPmhkci5zZXEsCisJCQkgIFJYX0lOVkFMSURfT1BFUkFUSU9OLCBFT1BOT1RTVVBQKTsKKwlza2ItPm1hcmsgPSBSWFJQQ19TS0JfTUFSS19MT0NBTF9BQk9SVDsKKwlza2ItPnByaW9yaXR5ID0gUlhfSU5WQUxJRF9PUEVSQVRJT047CisJX2xlYXZlKCIgPSBOVUxMIFtzZXJ2aWNlXSIpOworCXJldHVybiBOVUxMOwogCiBmb3VuZF9zZXJ2aWNlOgotCV9kZWJ1ZygiZm91bmQgc2VydmljZSAlaGQiLCByeC0+c3J4LnNyeF9zZXJ2aWNlKTsKLQlpZiAoc2tfYWNjZXB0cV9pc19mdWxsKCZyeC0+c2spKQotCQlnb3RvIGJhY2tsb2dfZnVsbDsKLQlza19hY2NlcHRxX2FkZGVkKCZyeC0+c2spOwotCXNvY2tfaG9sZCgmcngtPnNrKTsKLQlyZWFkX3VubG9ja19iaCgmbG9jYWwtPnNlcnZpY2VzX2xvY2spOworCXNwaW5fbG9jaygmcngtPmluY29taW5nX2xvY2spOworCWlmIChyeC0+c2suc2tfc3RhdGUgPT0gUlhSUENfQ0xPU0UpIHsKKwkJdHJhY2VfcnhycGNfYWJvcnQoIkNMUyIsIHNwLT5oZHIuY2lkLCBzcC0+aGRyLmNhbGxOdW1iZXIsCisJCQkJICBzcC0+aGRyLnNlcSwgUlhfSU5WQUxJRF9PUEVSQVRJT04sIEVTSFVURE9XTik7CisJCXNrYi0+bWFyayA9IFJYUlBDX1NLQl9NQVJLX0xPQ0FMX0FCT1JUOworCQlza2ItPnByaW9yaXR5ID0gUlhfSU5WQUxJRF9PUEVSQVRJT047CisJCV9sZWF2ZSgiID0gTlVMTCBbY2xvc2VdIik7CisJCWNhbGwgPSBOVUxMOworCQlnb3RvIG91dDsKKwl9CiAKLQlyZXQgPSByeHJwY19hY2NlcHRfaW5jb21pbmdfY2FsbChsb2NhbCwgcngsIHNrYiwgJnNyeCk7Ci0JaWYgKHJldCA8IDApCi0JCXNrX2FjY2VwdHFfcmVtb3ZlZCgmcngtPnNrKTsKLQlzb2NrX3B1dCgmcngtPnNrKTsKLQlzd2l0Y2ggKHJldCkgewotCWNhc2UgLUVDT05OUkVTRVQ6IC8qIG9sZCBjYWxscyBhcmUgaWdub3JlZCAqLwotCWNhc2UgLUVDT05OQUJPUlRFRDogLyogYWJvcnRlZCBjYWxscyBhcmUgcmVhYm9ydGVkIG9yIGlnbm9yZWQgKi8KLQljYXNlIDA6Ci0JCXJldHVybjsKLQljYXNlIC1FQ09OTlJFRlVTRUQ6Ci0JCWdvdG8gaW52YWxpZF9zZXJ2aWNlOwotCWNhc2UgLUVCVVNZOgotCQlnb3RvIGJ1c3k7Ci0JY2FzZSAtRUtFWVJFSkVDVEVEOgotCQlnb3RvIHNlY3VyaXR5X21pc21hdGNoOworCWNhbGwgPSByeHJwY19hbGxvY19pbmNvbWluZ19jYWxsKHJ4LCBsb2NhbCwgY29ubiwgc2tiKTsKKwlpZiAoIWNhbGwpIHsKKwkJc2tiLT5tYXJrID0gUlhSUENfU0tCX01BUktfQlVTWTsKKwkJX2xlYXZlKCIgPSBOVUxMIFtidXN5XSIpOworCQljYWxsID0gTlVMTDsKKwkJZ290byBvdXQ7CisJfQorCisJdHJhY2VfcnhycGNfcmVjZWl2ZShjYWxsLCByeHJwY19yZWNlaXZlX2luY29taW5nLAorCQkJICAgIHNwLT5oZHIuc2VyaWFsLCBzcC0+aGRyLnNlcSk7CisKKwkvKiBNYWtlIHRoZSBjYWxsIGxpdmUuICovCisJcnhycGNfaW5jb21pbmdfY2FsbChyeCwgY2FsbCwgc2tiKTsKKwljb25uID0gY2FsbC0+Y29ubjsKKworCWlmIChyeC0+bm90aWZ5X25ld19jYWxsKQorCQlyeC0+bm90aWZ5X25ld19jYWxsKCZyeC0+c2ssIGNhbGwsIGNhbGwtPnVzZXJfY2FsbF9JRCk7CisJZWxzZQorCQlza19hY2NlcHRxX2FkZGVkKCZyeC0+c2spOworCisJc3Bpbl9sb2NrKCZjb25uLT5zdGF0ZV9sb2NrKTsKKwlzd2l0Y2ggKGNvbm4tPnN0YXRlKSB7CisJY2FzZSBSWFJQQ19DT05OX1NFUlZJQ0VfVU5TRUNVUkVEOgorCQljb25uLT5zdGF0ZSA9IFJYUlBDX0NPTk5fU0VSVklDRV9DSEFMTEVOR0lORzsKKwkJc2V0X2JpdChSWFJQQ19DT05OX0VWX0NIQUxMRU5HRSwgJmNhbGwtPmNvbm4tPmV2ZW50cyk7CisJCXJ4cnBjX3F1ZXVlX2Nvbm4oY2FsbC0+Y29ubik7CisJCWJyZWFrOworCisJY2FzZSBSWFJQQ19DT05OX1NFUlZJQ0U6CisJCXdyaXRlX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCQlpZiAocngtPmRpc2NhcmRfbmV3X2NhbGwpCisJCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfU0VSVkVSX1JFQ1ZfUkVRVUVTVDsKKwkJZWxzZQorCQkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0NFUFRJTkc7CisJCXdyaXRlX3VubG9jaygmY2FsbC0+c3RhdGVfbG9jayk7CisJCWJyZWFrOworCisJY2FzZSBSWFJQQ19DT05OX1JFTU9URUxZX0FCT1JURUQ6CisJCXJ4cnBjX3NldF9jYWxsX2NvbXBsZXRpb24oY2FsbCwgUlhSUENfQ0FMTF9SRU1PVEVMWV9BQk9SVEVELAorCQkJCQkgIGNvbm4tPnJlbW90ZV9hYm9ydCwgRUNPTk5BQk9SVEVEKTsKKwkJYnJlYWs7CisJY2FzZSBSWFJQQ19DT05OX0xPQ0FMTFlfQUJPUlRFRDoKKwkJcnhycGNfYWJvcnRfY2FsbCgiQ09OIiwgY2FsbCwgc3AtPmhkci5zZXEsCisJCQkJIGNvbm4tPmxvY2FsX2Fib3J0LCBFQ09OTkFCT1JURUQpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CisJc3Bpbl91bmxvY2soJmNvbm4tPnN0YXRlX2xvY2spOwogCi1iYWNrbG9nX2Z1bGw6Ci0JcmVhZF91bmxvY2tfYmgoJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKLWJ1c3k6Ci0JcnhycGNfYnVzeShsb2NhbCwgJnNyeCwgJndoZHIpOwotCXJ4cnBjX2ZyZWVfc2tiKHNrYik7Ci0JcmV0dXJuOworCWlmIChjYWxsLT5zdGF0ZSA9PSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0NFUFRJTkcpCisJCXJ4cnBjX25vdGlmeV9zb2NrZXQoY2FsbCk7CiAKLWRyb3A6Ci0JcnhycGNfZnJlZV9za2Ioc2tiKTsKLQlyZXR1cm47CisJLyogV2UgaGF2ZSB0byBkaXNjYXJkIHRoZSBwcmVhbGxvYyBxdWV1ZSdzIHJlZiBoZXJlIGFuZCByZWx5IG9uIGEKKwkgKiBjb21iaW5hdGlvbiBvZiB0aGUgUkNVIHJlYWQgbG9jayBhbmQgcmVmcyBoZWxkIGVpdGhlciBieSB0aGUgc29ja2V0CisJICogKHJlY3Ztc2cgcXVldWUsIHRvLWJlLWFjY2VwdGVkIHF1ZXVlIG9yIHVzZXIgSUQgdHJlZSkgb3IgdGhlIGtlcm5lbAorCSAqIHNlcnZpY2UgdG8gcHJldmVudCB0aGUgY2FsbCBmcm9tIGJlaW5nIGRlYWxsb2NhdGVkIHRvbyBlYXJseS4KKwkgKi8KKwlyeHJwY19wdXRfY2FsbChjYWxsLCByeHJwY19jYWxsX3B1dCk7CiAKLWludmFsaWRfc2VydmljZToKLQlza2ItPnByaW9yaXR5ID0gUlhfSU5WQUxJRF9PUEVSQVRJT047Ci0JcnhycGNfcmVqZWN0X3BhY2tldChsb2NhbCwgc2tiKTsKLQlyZXR1cm47Ci0KLQkvKiBjYW4ndCBjaGFuZ2UgY29ubmVjdGlvbiBzZWN1cml0eSB0eXBlIG1pZC1mbG93ICovCi1zZWN1cml0eV9taXNtYXRjaDoKLQlza2ItPnByaW9yaXR5ID0gUlhfUFJPVE9DT0xfRVJST1I7Ci0JcnhycGNfcmVqZWN0X3BhY2tldChsb2NhbCwgc2tiKTsKLQlyZXR1cm47CisJX2xlYXZlKCIgPSAlcHslZH0iLCBjYWxsLCBjYWxsLT5kZWJ1Z19pZCk7CitvdXQ6CisJc3Bpbl91bmxvY2soJnJ4LT5pbmNvbWluZ19sb2NrKTsKKwlyZXR1cm4gY2FsbDsKIH0KIAogLyoKQEAgLTI4NSw3ICs0MzAsOCBAQAogICogLSBhc3NpZ24gdGhlIHVzZXIgY2FsbCBJRCB0byB0aGUgY2FsbCBhdCB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlCiAgKi8KIHN0cnVjdCByeHJwY19jYWxsICpyeHJwY19hY2NlcHRfY2FsbChzdHJ1Y3QgcnhycGNfc29jayAqcngsCi0JCQkJICAgICB1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCkKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgdXNlcl9jYWxsX0lELAorCQkJCSAgICAgcnhycGNfbm90aWZ5X3J4X3Qgbm90aWZ5X3J4KQogewogCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwogCXN0cnVjdCByYl9ub2RlICpwYXJlbnQsICoqcHA7CkBAIC0yOTcsMTIgKzQ0MywxMyBAQAogCiAJd3JpdGVfbG9jaygmcngtPmNhbGxfbG9jayk7CiAKLQlyZXQgPSAtRU5PREFUQTsKLQlpZiAobGlzdF9lbXB0eSgmcngtPmFjY2VwdHEpKQotCQlnb3RvIG91dDsKKwlpZiAobGlzdF9lbXB0eSgmcngtPnRvX2JlX2FjY2VwdGVkKSkgeworCQl3cml0ZV91bmxvY2soJnJ4LT5jYWxsX2xvY2spOworCQlrbGVhdmUoIiA9IC1FTk9EQVRBIFtlbXB0eV0iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RBVEEpOworCX0KIAogCS8qIGNoZWNrIHRoZSB1c2VyIElEIGlzbid0IGFscmVhZHkgaW4gdXNlICovCi0JcmV0ID0gLUVCQURTTFQ7CiAJcHAgPSAmcngtPmNhbGxzLnJiX25vZGU7CiAJcGFyZW50ID0gTlVMTDsKIAl3aGlsZSAoKnBwKSB7CkBAIC0zMTQsNjIgKzQ2MSw1OSBAQAogCQllbHNlIGlmICh1c2VyX2NhbGxfSUQgPiBjYWxsLT51c2VyX2NhbGxfSUQpCiAJCQlwcCA9ICYoKnBwKS0+cmJfcmlnaHQ7CiAJCWVsc2UKLQkJCWdvdG8gb3V0OworCQkJZ290byBpZF9pbl91c2U7CiAJfQogCi0JLyogZGVxdWV1ZSB0aGUgZmlyc3QgY2FsbCBhbmQgY2hlY2sgaXQncyBzdGlsbCB2YWxpZCAqLwotCWNhbGwgPSBsaXN0X2VudHJ5KHJ4LT5hY2NlcHRxLm5leHQsIHN0cnVjdCByeHJwY19jYWxsLCBhY2NlcHRfbGluayk7CisJLyogRGVxdWV1ZSB0aGUgZmlyc3QgY2FsbCBhbmQgY2hlY2sgaXQncyBzdGlsbCB2YWxpZC4gIFdlIGdhaW4KKwkgKiByZXNwb25zaWJpbGl0eSBmb3IgdGhlIHF1ZXVlJ3MgcmVmZXJlbmNlLgorCSAqLworCWNhbGwgPSBsaXN0X2VudHJ5KHJ4LT50b19iZV9hY2NlcHRlZC5uZXh0LAorCQkJICBzdHJ1Y3QgcnhycGNfY2FsbCwgYWNjZXB0X2xpbmspOwogCWxpc3RfZGVsX2luaXQoJmNhbGwtPmFjY2VwdF9saW5rKTsKIAlza19hY2NlcHRxX3JlbW92ZWQoJnJ4LT5zayk7CisJcnhycGNfc2VlX2NhbGwoY2FsbCk7CiAKIAl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKIAlzd2l0Y2ggKGNhbGwtPnN0YXRlKSB7CiAJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0NFUFRJTkc6CiAJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9TRVJWRVJfUkVDVl9SRVFVRVNUOwogCQlicmVhazsKLQljYXNlIFJYUlBDX0NBTExfUkVNT1RFTFlfQUJPUlRFRDoKLQljYXNlIFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEOgotCQlyZXQgPSAtRUNPTk5BQk9SVEVEOworCWNhc2UgUlhSUENfQ0FMTF9DT01QTEVURToKKwkJcmV0ID0gY2FsbC0+ZXJyb3I7CiAJCWdvdG8gb3V0X3JlbGVhc2U7Ci0JY2FzZSBSWFJQQ19DQUxMX05FVFdPUktfRVJST1I6Ci0JCXJldCA9IGNhbGwtPmNvbm4tPmVycm9yOwotCQlnb3RvIG91dF9yZWxlYXNlOwotCWNhc2UgUlhSUENfQ0FMTF9ERUFEOgotCQlyZXQgPSAtRVRJTUU7Ci0JCWdvdG8gb3V0X2Rpc2NhcmQ7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJfQogCiAJLyogZm9ybWFsaXNlIHRoZSBhY2NlcHRhbmNlICovCisJY2FsbC0+bm90aWZ5X3J4ID0gbm90aWZ5X3J4OwogCWNhbGwtPnVzZXJfY2FsbF9JRCA9IHVzZXJfY2FsbF9JRDsKKwlyeHJwY19nZXRfY2FsbChjYWxsLCByeHJwY19jYWxsX2dvdF91c2VyaWQpOwogCXJiX2xpbmtfbm9kZSgmY2FsbC0+c29ja19ub2RlLCBwYXJlbnQsIHBwKTsKIAlyYl9pbnNlcnRfY29sb3IoJmNhbGwtPnNvY2tfbm9kZSwgJnJ4LT5jYWxscyk7CiAJaWYgKHRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9IQVNfVVNFUklELCAmY2FsbC0+ZmxhZ3MpKQogCQlCVUcoKTsKLQlpZiAodGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX0VWX0FDQ0VQVEVELCAmY2FsbC0+ZXZlbnRzKSkKLQkJQlVHKCk7Ci0JcnhycGNfcXVldWVfY2FsbChjYWxsKTsKIAotCXJ4cnBjX2dldF9jYWxsKGNhbGwpOwogCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CiAJd3JpdGVfdW5sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKKwlyeHJwY19ub3RpZnlfc29ja2V0KGNhbGwpOworCXJ4cnBjX3NlcnZpY2VfcHJlYWxsb2MocngsIEdGUF9LRVJORUwpOwogCV9sZWF2ZSgiID0gJXB7JWR9IiwgY2FsbCwgY2FsbC0+ZGVidWdfaWQpOwogCXJldHVybiBjYWxsOwogCi0JLyogaWYgdGhlIGNhbGwgaXMgYWxyZWFkeSBkeWluZyBvciBkZWFkLCB0aGVuIHdlIGxlYXZlIHRoZSBzb2NrZXQncyByZWYKLQkgKiBvbiBpdCB0byBiZSByZWxlYXNlZCBieSByeHJwY19kZWFkX2NhbGxfZXhwaXJlZCgpIGFzIGluZHVjZWQgYnkKLQkgKiByeHJwY19yZWxlYXNlX2NhbGwoKSAqLwogb3V0X3JlbGVhc2U6CiAJX2RlYnVnKCJyZWxlYXNlICVwIiwgY2FsbCk7Ci0JaWYgKCF0ZXN0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0VELCAmY2FsbC0+ZmxhZ3MpICYmCi0JICAgICF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfRVZfUkVMRUFTRSwgJmNhbGwtPmV2ZW50cykpCi0JCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7Ci1vdXRfZGlzY2FyZDoKIAl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCV9kZWJ1ZygiZGlzY2FyZCAlcCIsIGNhbGwpOwotb3V0OgogCXdyaXRlX3VubG9jaygmcngtPmNhbGxfbG9jayk7CisJcnhycGNfcmVsZWFzZV9jYWxsKHJ4LCBjYWxsKTsKKwlyeHJwY19wdXRfY2FsbChjYWxsLCByeHJwY19jYWxsX3B1dCk7CisJZ290byBvdXQ7CisKK2lkX2luX3VzZToKKwlyZXQgPSAtRUJBRFNMVDsKKwl3cml0ZV91bmxvY2soJnJ4LT5jYWxsX2xvY2spOworb3V0OgorCXJ4cnBjX3NlcnZpY2VfcHJlYWxsb2MocngsIEdGUF9LRVJORUwpOwogCV9sZWF2ZSgiID0gJWQiLCByZXQpOwogCXJldHVybiBFUlJfUFRSKHJldCk7CiB9CkBAIC0zODEsNiArNTI1LDcgQEAKIGludCByeHJwY19yZWplY3RfY2FsbChzdHJ1Y3QgcnhycGNfc29jayAqcngpCiB7CiAJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7CisJYm9vbCBhYm9ydCA9IGZhbHNlOwogCWludCByZXQ7CiAKIAlfZW50ZXIoIiIpOwpAQCAtMzg5LDg4ICs1MzQsNzMgQEAKIAogCXdyaXRlX2xvY2soJnJ4LT5jYWxsX2xvY2spOwogCi0JcmV0ID0gLUVOT0RBVEE7Ci0JaWYgKGxpc3RfZW1wdHkoJnJ4LT5hY2NlcHRxKSkKLQkJZ290byBvdXQ7CisJaWYgKGxpc3RfZW1wdHkoJnJ4LT50b19iZV9hY2NlcHRlZCkpIHsKKwkJd3JpdGVfdW5sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKKwkJcmV0dXJuIC1FTk9EQVRBOworCX0KIAotCS8qIGRlcXVldWUgdGhlIGZpcnN0IGNhbGwgYW5kIGNoZWNrIGl0J3Mgc3RpbGwgdmFsaWQgKi8KLQljYWxsID0gbGlzdF9lbnRyeShyeC0+YWNjZXB0cS5uZXh0LCBzdHJ1Y3QgcnhycGNfY2FsbCwgYWNjZXB0X2xpbmspOworCS8qIERlcXVldWUgdGhlIGZpcnN0IGNhbGwgYW5kIGNoZWNrIGl0J3Mgc3RpbGwgdmFsaWQuICBXZSBnYWluCisJICogcmVzcG9uc2liaWxpdHkgZm9yIHRoZSBxdWV1ZSdzIHJlZmVyZW5jZS4KKwkgKi8KKwljYWxsID0gbGlzdF9lbnRyeShyeC0+dG9fYmVfYWNjZXB0ZWQubmV4dCwKKwkJCSAgc3RydWN0IHJ4cnBjX2NhbGwsIGFjY2VwdF9saW5rKTsKIAlsaXN0X2RlbF9pbml0KCZjYWxsLT5hY2NlcHRfbGluayk7CiAJc2tfYWNjZXB0cV9yZW1vdmVkKCZyeC0+c2spOworCXJ4cnBjX3NlZV9jYWxsKGNhbGwpOwogCiAJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CiAJc3dpdGNoIChjYWxsLT5zdGF0ZSkgewogCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfQUNDRVBUSU5HOgotCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfU0VSVkVSX0JVU1k7Ci0JCWlmICh0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfRVZfUkVKRUNUX0JVU1ksICZjYWxsLT5ldmVudHMpKQotCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQkJcmV0ID0gMDsKLQkJZ290byBvdXRfcmVsZWFzZTsKLQljYXNlIFJYUlBDX0NBTExfUkVNT1RFTFlfQUJPUlRFRDoKLQljYXNlIFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEOgotCQlyZXQgPSAtRUNPTk5BQk9SVEVEOwotCQlnb3RvIG91dF9yZWxlYXNlOwotCWNhc2UgUlhSUENfQ0FMTF9ORVRXT1JLX0VSUk9SOgotCQlyZXQgPSBjYWxsLT5jb25uLT5lcnJvcjsKLQkJZ290byBvdXRfcmVsZWFzZTsKLQljYXNlIFJYUlBDX0NBTExfREVBRDoKLQkJcmV0ID0gLUVUSU1FOworCQlfX3J4cnBjX2Fib3J0X2NhbGwoIlJFSiIsIGNhbGwsIDEsIFJYX1VTRVJfQUJPUlQsIEVDT05OQUJPUlRFRCk7CisJCWFib3J0ID0gdHJ1ZTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBSWFJQQ19DQUxMX0NPTVBMRVRFOgorCQlyZXQgPSBjYWxsLT5lcnJvcjsKIAkJZ290byBvdXRfZGlzY2FyZDsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CiAKLQkvKiBpZiB0aGUgY2FsbCBpcyBhbHJlYWR5IGR5aW5nIG9yIGRlYWQsIHRoZW4gd2UgbGVhdmUgdGhlIHNvY2tldCdzIHJlZgotCSAqIG9uIGl0IHRvIGJlIHJlbGVhc2VkIGJ5IHJ4cnBjX2RlYWRfY2FsbF9leHBpcmVkKCkgYXMgaW5kdWNlZCBieQotCSAqIHJ4cnBjX3JlbGVhc2VfY2FsbCgpICovCi1vdXRfcmVsZWFzZToKLQlfZGVidWcoInJlbGVhc2UgJXAiLCBjYWxsKTsKLQlpZiAoIXRlc3RfYml0KFJYUlBDX0NBTExfUkVMRUFTRUQsICZjYWxsLT5mbGFncykgJiYKLQkgICAgIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FVl9SRUxFQVNFLCAmY2FsbC0+ZXZlbnRzKSkKLQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKIG91dF9kaXNjYXJkOgogCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JX2RlYnVnKCJkaXNjYXJkICVwIiwgY2FsbCk7Ci1vdXQ6CiAJd3JpdGVfdW5sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKKwlpZiAoYWJvcnQpIHsKKwkJcnhycGNfc2VuZF9jYWxsX3BhY2tldChjYWxsLCBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVCk7CisJCXJ4cnBjX3JlbGVhc2VfY2FsbChyeCwgY2FsbCk7CisJCXJ4cnBjX3B1dF9jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfcHV0KTsKKwl9CisJcnhycGNfc2VydmljZV9wcmVhbGxvYyhyeCwgR0ZQX0tFUk5FTCk7CiAJX2xlYXZlKCIgPSAlZCIsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KIAotLyoqCi0gKiByeHJwY19rZXJuZWxfYWNjZXB0X2NhbGwgLSBBbGxvdyBhIGtlcm5lbCBzZXJ2aWNlIHRvIGFjY2VwdCBhbiBpbmNvbWluZyBjYWxsCi0gKiBAc29jazogVGhlIHNvY2tldCBvbiB3aGljaCB0aGUgaW1wZW5kaW5nIGNhbGwgaXMgd2FpdGluZwotICogQHVzZXJfY2FsbF9JRDogVGhlIHRhZyB0byBhdHRhY2ggdG8gdGhlIGNhbGwKKy8qCisgKiByeHJwY19rZXJuZWxfY2hhcmdlX2FjY2VwdCAtIENoYXJnZSB1cCBzb2NrZXQgd2l0aCBwcmVhbGxvY2F0ZWQgY2FsbHMKKyAqIEBzb2NrOiBUaGUgc29ja2V0IG9uIHdoaWNoIHRvIHByZWFsbG9jYXRlCisgKiBAbm90aWZ5X3J4OiBFdmVudCBub3RpZmljYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBjYWxsCisgKiBAdXNlcl9hdHRhY2hfY2FsbDogRnVuYyB0byBhdHRhY2ggY2FsbCB0byB1c2VyX2NhbGxfSUQKKyAqIEB1c2VyX2NhbGxfSUQ6IFRoZSB0YWcgdG8gYXR0YWNoIHRvIHRoZSBwcmVhbGxvY2F0ZWQgY2FsbAorICogQGdmcDogVGhlIGFsbG9jYXRpb24gY29uZGl0aW9ucy4KICAqCi0gKiBBbGxvdyBhIGtlcm5lbCBzZXJ2aWNlIHRvIGFjY2VwdCBhbiBpbmNvbWluZyBjYWxsLCBhc3N1bWluZyB0aGUgaW5jb21pbmcKLSAqIGNhbGwgaXMgc3RpbGwgdmFsaWQuCi0gKi8KLXN0cnVjdCByeHJwY19jYWxsICpyeHJwY19rZXJuZWxfYWNjZXB0X2NhbGwoc3RydWN0IHNvY2tldCAqc29jaywKLQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgdXNlcl9jYWxsX0lEKQotewotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwotCi0JX2VudGVyKCIsJWx4IiwgdXNlcl9jYWxsX0lEKTsKLQljYWxsID0gcnhycGNfYWNjZXB0X2NhbGwocnhycGNfc2soc29jay0+c2spLCB1c2VyX2NhbGxfSUQpOwotCV9sZWF2ZSgiID0gJXAiLCBjYWxsKTsKLQlyZXR1cm4gY2FsbDsKLX0KLUVYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2FjY2VwdF9jYWxsKTsKLQotLyoqCi0gKiByeHJwY19rZXJuZWxfcmVqZWN0X2NhbGwgLSBBbGxvdyBhIGtlcm5lbCBzZXJ2aWNlIHRvIHJlamVjdCBhbiBpbmNvbWluZyBjYWxsCi0gKiBAc29jazogVGhlIHNvY2tldCBvbiB3aGljaCB0aGUgaW1wZW5kaW5nIGNhbGwgaXMgd2FpdGluZworICogQ2hhcmdlIHVwIHRoZSBzb2NrZXQgd2l0aCBwcmVhbGxvY2F0ZWQgY2FsbHMsIGVhY2ggd2l0aCBhIHVzZXIgSUQuICBBCisgKiBmdW5jdGlvbiBzaG91bGQgYmUgcHJvdmlkZWQgdG8gZWZmZWN0IHRoZSBhdHRhY2htZW50IGZyb20gdGhlIHVzZXIncyBzaWRlLgorICogVGhlIHVzZXIgaXMgZ2l2ZW4gYSByZWYgdG8gaG9sZCBvbiB0aGUgY2FsbC4KICAqCi0gKiBBbGxvdyBhIGtlcm5lbCBzZXJ2aWNlIHRvIHJlamVjdCBhbiBpbmNvbWluZyBjYWxsIHdpdGggYSBCVVNZIG1lc3NhZ2UsCi0gKiBhc3N1bWluZyB0aGUgaW5jb21pbmcgY2FsbCBpcyBzdGlsbCB2YWxpZC4KKyAqIE5vdGUgdGhhdCB0aGUgY2FsbCBtYXkgYmUgY29tZSBjb25uZWN0ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KICAqLwotaW50IHJ4cnBjX2tlcm5lbF9yZWplY3RfY2FsbChzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoraW50IHJ4cnBjX2tlcm5lbF9jaGFyZ2VfYWNjZXB0KHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgICAgICAgcnhycGNfbm90aWZ5X3J4X3Qgbm90aWZ5X3J4LAorCQkJICAgICAgIHJ4cnBjX3VzZXJfYXR0YWNoX2NhbGxfdCB1c2VyX2F0dGFjaF9jYWxsLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdXNlcl9jYWxsX0lELCBnZnBfdCBnZnApCiB7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgcnhycGNfc29jayAqcnggPSByeHJwY19zayhzb2NrLT5zayk7CisJc3RydWN0IHJ4cnBjX2JhY2tsb2cgKmIgPSByeC0+YmFja2xvZzsKIAotCV9lbnRlcigiIik7Ci0JcmV0ID0gcnhycGNfcmVqZWN0X2NhbGwocnhycGNfc2soc29jay0+c2spKTsKLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OworCWlmIChzb2NrLT5zay0+c2tfc3RhdGUgPT0gUlhSUENfQ0xPU0UpCisJCXJldHVybiAtRVNIVVRET1dOOworCisJcmV0dXJuIHJ4cnBjX3NlcnZpY2VfcHJlYWxsb2Nfb25lKHJ4LCBiLCBub3RpZnlfcngsCisJCQkJCSAgdXNlcl9hdHRhY2hfY2FsbCwgdXNlcl9jYWxsX0lELAorCQkJCQkgIGdmcCk7CiB9Ci1FWFBPUlRfU1lNQk9MKHJ4cnBjX2tlcm5lbF9yZWplY3RfY2FsbCk7CitFWFBPUlRfU1lNQk9MKHJ4cnBjX2tlcm5lbF9jaGFyZ2VfYWNjZXB0KTsKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9jYWxsX2V2ZW50LmMgYi9uZXQvcnhycGMvY2FsbF9ldmVudC5jCmluZGV4IGZjMzJhYTUuLjRmMDA0NzYgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9jYWxsX2V2ZW50LmMKKysrIGIvbmV0L3J4cnBjL2NhbGxfZXZlbnQuYwpAQCAtMjIsMTI3NCArMjIsMzUxIEBACiAjaW5jbHVkZSAiYXItaW50ZXJuYWwuaCIKIAogLyoKKyAqIFNldCB0aGUgdGltZXIKKyAqLwordm9pZCByeHJwY19zZXRfdGltZXIoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIGVudW0gcnhycGNfdGltZXJfdHJhY2Ugd2h5LAorCQkgICAgIGt0aW1lX3Qgbm93KQoreworCXVuc2lnbmVkIGxvbmcgdF9qLCBub3dfaiA9IGppZmZpZXM7CisJa3RpbWVfdCB0OworCWJvb2wgcXVldWUgPSBmYWxzZTsKKworCXJlYWRfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisKKwlpZiAoY2FsbC0+c3RhdGUgPCBSWFJQQ19DQUxMX0NPTVBMRVRFKSB7CisJCXQgPSBjYWxsLT5leHBpcmVfYXQ7CisJCWlmICgha3RpbWVfYWZ0ZXIodCwgbm93KSkKKwkJCWdvdG8gb3V0OworCisJCWlmICgha3RpbWVfYWZ0ZXIoY2FsbC0+cmVzZW5kX2F0LCBub3cpKSB7CisJCQljYWxsLT5yZXNlbmRfYXQgPSBjYWxsLT5leHBpcmVfYXQ7CisJCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FVl9SRVNFTkQsICZjYWxsLT5ldmVudHMpKQorCQkJCXF1ZXVlID0gdHJ1ZTsKKwkJfSBlbHNlIGlmIChrdGltZV9iZWZvcmUoY2FsbC0+cmVzZW5kX2F0LCB0KSkgeworCQkJdCA9IGNhbGwtPnJlc2VuZF9hdDsKKwkJfQorCisJCWlmICgha3RpbWVfYWZ0ZXIoY2FsbC0+YWNrX2F0LCBub3cpKSB7CisJCQljYWxsLT5hY2tfYXQgPSBjYWxsLT5leHBpcmVfYXQ7CisJCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FVl9BQ0ssICZjYWxsLT5ldmVudHMpKQorCQkJCXF1ZXVlID0gdHJ1ZTsKKwkJfSBlbHNlIGlmIChrdGltZV9iZWZvcmUoY2FsbC0+YWNrX2F0LCB0KSkgeworCQkJdCA9IGNhbGwtPmFja19hdDsKKwkJfQorCisJCXRfaiA9IG5zZWNzX3RvX2ppZmZpZXMoa3RpbWVfdG9fbnMoa3RpbWVfc3ViKHQsIG5vdykpKTsKKwkJdF9qICs9IGppZmZpZXM7CisKKwkJLyogV2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY2FsY3VsYXRlZCBqaWZmaWVzIHZhbHVlIGZhbGxzCisJCSAqIGF0IG9yIGFmdGVyIHRoZSBuc2VjIHZhbHVlLCBvciB3ZSBtYXkgbG9vcCBjZWFzZWxlc3NseQorCQkgKiBiZWNhdXNlIHRoZSB0aW1lciB0aW1lcyBvdXQsIGJ1dCB3ZSBoYXZlbid0IHJlYWNoZWQgdGhlIG5zZWMKKwkJICogdGltZW91dCB5ZXQuCisJCSAqLworCQl0X2orKzsKKworCQlpZiAoY2FsbC0+dGltZXIuZXhwaXJlcyAhPSB0X2ogfHwgIXRpbWVyX3BlbmRpbmcoJmNhbGwtPnRpbWVyKSkgeworCQkJbW9kX3RpbWVyKCZjYWxsLT50aW1lciwgdF9qKTsKKwkJCXRyYWNlX3J4cnBjX3RpbWVyKGNhbGwsIHdoeSwgbm93LCBub3dfaik7CisJCX0KKworCQlpZiAocXVldWUpCisJCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOworCX0KKworb3V0OgorCXJlYWRfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKK30KKworLyoKICAqIHByb3Bvc2UgYW4gQUNLIGJlIHNlbnQKICAqLwotdm9pZCBfX3J4cnBjX3Byb3Bvc2VfQUNLKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCB1OCBhY2tfcmVhc29uLAotCQkJIHUzMiBzZXJpYWwsIGJvb2wgaW1tZWRpYXRlKQorc3RhdGljIHZvaWQgX19yeHJwY19wcm9wb3NlX0FDSyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgdTggYWNrX3JlYXNvbiwKKwkJCQl1MTYgc2tldywgdTMyIHNlcmlhbCwgYm9vbCBpbW1lZGlhdGUsCisJCQkJYm9vbCBiYWNrZ3JvdW5kLAorCQkJCWVudW0gcnhycGNfcHJvcG9zZV9hY2tfdHJhY2Ugd2h5KQogewotCXVuc2lnbmVkIGxvbmcgZXhwaXJ5OworCWVudW0gcnhycGNfcHJvcG9zZV9hY2tfb3V0Y29tZSBvdXRjb21lID0gcnhycGNfcHJvcG9zZV9hY2tfdXNlOworCXVuc2lnbmVkIGludCBleHBpcnkgPSByeHJwY19zb2Z0X2Fja19kZWxheTsKKwlrdGltZV90IG5vdywgYWNrX2F0OwogCXM4IHByaW9yID0gcnhycGNfYWNrX3ByaW9yaXR5W2Fja19yZWFzb25dOwogCi0JQVNTRVJUQ01QKHByaW9yLCA+LCAwKTsKLQotCV9lbnRlcigieyVkfSwlcywlJSV4LCV1IiwKLQkgICAgICAgY2FsbC0+ZGVidWdfaWQsIHJ4cnBjX2Fja3MoYWNrX3JlYXNvbiksIHNlcmlhbCwgaW1tZWRpYXRlKTsKLQotCWlmIChwcmlvciA8IHJ4cnBjX2Fja19wcmlvcml0eVtjYWxsLT5hY2tyX3JlYXNvbl0pIHsKLQkJaWYgKGltbWVkaWF0ZSkKLQkJCWdvdG8gY2FuY2VsX3RpbWVyOwotCQlyZXR1cm47Ci0JfQotCi0JLyogdXBkYXRlIERFTEFZLCBJRExFLCBSRVFVRVNURUQgYW5kIFBJTkdfUkVTUE9OU0UgQUNLIHNlcmlhbAotCSAqIG51bWJlcnMgKi8KLQlpZiAocHJpb3IgPT0gcnhycGNfYWNrX3ByaW9yaXR5W2NhbGwtPmFja3JfcmVhc29uXSkgewotCQlpZiAocHJpb3IgPD0gNCkKKwkvKiBVcGRhdGUgREVMQVksIElETEUsIFJFUVVFU1RFRCBhbmQgUElOR19SRVNQT05TRSBBQ0sgc2VyaWFsCisJICogbnVtYmVycywgYnV0IHdlIGRvbid0IGFsdGVyIHRoZSB0aW1lb3V0LgorCSAqLworCV9kZWJ1ZygicHJpb3IgJXUgJXUgdnMgJXUgJXUiLAorCSAgICAgICBhY2tfcmVhc29uLCBwcmlvciwKKwkgICAgICAgY2FsbC0+YWNrcl9yZWFzb24sIHJ4cnBjX2Fja19wcmlvcml0eVtjYWxsLT5hY2tyX3JlYXNvbl0pOworCWlmIChhY2tfcmVhc29uID09IGNhbGwtPmFja3JfcmVhc29uKSB7CisJCWlmIChSWFJQQ19BQ0tfVVBEQVRFQUJMRSAmICgxIDw8IGFja19yZWFzb24pKSB7CisJCQlvdXRjb21lID0gcnhycGNfcHJvcG9zZV9hY2tfdXBkYXRlOwogCQkJY2FsbC0+YWNrcl9zZXJpYWwgPSBzZXJpYWw7Ci0JCWlmIChpbW1lZGlhdGUpCi0JCQlnb3RvIGNhbmNlbF90aW1lcjsKLQkJcmV0dXJuOworCQkJY2FsbC0+YWNrcl9za2V3ID0gc2tldzsKKwkJfQorCQlpZiAoIWltbWVkaWF0ZSkKKwkJCWdvdG8gdHJhY2U7CisJfSBlbHNlIGlmIChwcmlvciA+IHJ4cnBjX2Fja19wcmlvcml0eVtjYWxsLT5hY2tyX3JlYXNvbl0pIHsKKwkJY2FsbC0+YWNrcl9yZWFzb24gPSBhY2tfcmVhc29uOworCQljYWxsLT5hY2tyX3NlcmlhbCA9IHNlcmlhbDsKKwkJY2FsbC0+YWNrcl9za2V3ID0gc2tldzsKKwl9IGVsc2UgeworCQlvdXRjb21lID0gcnhycGNfcHJvcG9zZV9hY2tfc3Vic3VtZTsKIAl9CiAKLQljYWxsLT5hY2tyX3JlYXNvbiA9IGFja19yZWFzb247Ci0JY2FsbC0+YWNrcl9zZXJpYWwgPSBzZXJpYWw7Ci0KIAlzd2l0Y2ggKGFja19yZWFzb24pIHsKLQljYXNlIFJYUlBDX0FDS19ERUxBWToKLQkJX2RlYnVnKCJydW4gZGVsYXkgdGltZXIiKTsKLQkJZXhwaXJ5ID0gcnhycGNfc29mdF9hY2tfZGVsYXk7Ci0JCWdvdG8gcnVuX3RpbWVyOwotCi0JY2FzZSBSWFJQQ19BQ0tfSURMRToKLQkJaWYgKCFpbW1lZGlhdGUpIHsKLQkJCV9kZWJ1ZygicnVuIGRlZmVyIHRpbWVyIik7Ci0JCQlleHBpcnkgPSByeHJwY19pZGxlX2Fja19kZWxheTsKLQkJCWdvdG8gcnVuX3RpbWVyOwotCQl9Ci0JCWdvdG8gY2FuY2VsX3RpbWVyOwotCiAJY2FzZSBSWFJQQ19BQ0tfUkVRVUVTVEVEOgotCQlleHBpcnkgPSByeHJwY19yZXF1ZXN0ZWRfYWNrX2RlbGF5OwotCQlpZiAoIWV4cGlyeSkKLQkJCWdvdG8gY2FuY2VsX3RpbWVyOwotCQlpZiAoIWltbWVkaWF0ZSB8fCBzZXJpYWwgPT0gMSkgewotCQkJX2RlYnVnKCJydW4gZGVmZXIgdGltZXIiKTsKLQkJCWdvdG8gcnVuX3RpbWVyOwotCQl9CisJCWlmIChyeHJwY19yZXF1ZXN0ZWRfYWNrX2RlbGF5IDwgZXhwaXJ5KQorCQkJZXhwaXJ5ID0gcnhycGNfcmVxdWVzdGVkX2Fja19kZWxheTsKKwkJaWYgKHNlcmlhbCA9PSAxKQorCQkJaW1tZWRpYXRlID0gZmFsc2U7CisJCWJyZWFrOworCisJY2FzZSBSWFJQQ19BQ0tfREVMQVk6CisJCWlmIChyeHJwY19zb2Z0X2Fja19kZWxheSA8IGV4cGlyeSkKKwkJCWV4cGlyeSA9IHJ4cnBjX3NvZnRfYWNrX2RlbGF5OworCQlicmVhazsKKworCWNhc2UgUlhSUENfQUNLX1BJTkc6CisJY2FzZSBSWFJQQ19BQ0tfSURMRToKKwkJaWYgKHJ4cnBjX2lkbGVfYWNrX2RlbGF5IDwgZXhwaXJ5KQorCQkJZXhwaXJ5ID0gcnhycGNfaWRsZV9hY2tfZGVsYXk7CisJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJX2RlYnVnKCJpbW1lZGlhdGUgQUNLIik7Ci0JCWdvdG8gY2FuY2VsX3RpbWVyOworCQlpbW1lZGlhdGUgPSB0cnVlOworCQlicmVhazsKIAl9CiAKLXJ1bl90aW1lcjoKLQlleHBpcnkgKz0gamlmZmllczsKLQlpZiAoIXRpbWVyX3BlbmRpbmcoJmNhbGwtPmFja190aW1lcikgfHwKLQkgICAgdGltZV9hZnRlcihjYWxsLT5hY2tfdGltZXIuZXhwaXJlcywgZXhwaXJ5KSkKLQkJbW9kX3RpbWVyKCZjYWxsLT5hY2tfdGltZXIsIGV4cGlyeSk7Ci0JcmV0dXJuOworCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX0VWX0FDSywgJmNhbGwtPmV2ZW50cykpIHsKKwkJX2RlYnVnKCJhbHJlYWR5IHNjaGVkdWxlZCIpOworCX0gZWxzZSBpZiAoaW1tZWRpYXRlIHx8IGV4cGlyeSA9PSAwKSB7CisJCV9kZWJ1ZygiaW1tZWRpYXRlIEFDSyAlbHgiLCBjYWxsLT5ldmVudHMpOworCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FVl9BQ0ssICZjYWxsLT5ldmVudHMpICYmCisJCSAgICBiYWNrZ3JvdW5kKQorCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwl9IGVsc2UgeworCQlub3cgPSBrdGltZV9nZXRfcmVhbCgpOworCQlhY2tfYXQgPSBrdGltZV9hZGRfbXMobm93LCBleHBpcnkpOworCQlpZiAoa3RpbWVfYmVmb3JlKGFja19hdCwgY2FsbC0+YWNrX2F0KSkgeworCQkJY2FsbC0+YWNrX2F0ID0gYWNrX2F0OworCQkJcnhycGNfc2V0X3RpbWVyKGNhbGwsIHJ4cnBjX3RpbWVyX3NldF9mb3JfYWNrLCBub3cpOworCQl9CisJfQogCi1jYW5jZWxfdGltZXI6Ci0JX2RlYnVnKCJjYW5jZWwgdGltZXIgJSUldSIsIHNlcmlhbCk7Ci0JdHJ5X3RvX2RlbF90aW1lcl9zeW5jKCZjYWxsLT5hY2tfdGltZXIpOwotCXJlYWRfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JaWYgKGNhbGwtPnN0YXRlIDw9IFJYUlBDX0NBTExfQ09NUExFVEUgJiYKLQkgICAgIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FVl9BQ0ssICZjYWxsLT5ldmVudHMpKQotCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOwotCXJlYWRfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKK3RyYWNlOgorCXRyYWNlX3J4cnBjX3Byb3Bvc2VfYWNrKGNhbGwsIHdoeSwgYWNrX3JlYXNvbiwgc2VyaWFsLCBpbW1lZGlhdGUsCisJCQkJYmFja2dyb3VuZCwgb3V0Y29tZSk7CiB9CiAKIC8qCiAgKiBwcm9wb3NlIGFuIEFDSyBiZSBzZW50LCBsb2NraW5nIHRoZSBjYWxsIHN0cnVjdHVyZQogICovCiB2b2lkIHJ4cnBjX3Byb3Bvc2VfQUNLKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCB1OCBhY2tfcmVhc29uLAotCQkgICAgICAgdTMyIHNlcmlhbCwgYm9vbCBpbW1lZGlhdGUpCisJCSAgICAgICB1MTYgc2tldywgdTMyIHNlcmlhbCwgYm9vbCBpbW1lZGlhdGUsIGJvb2wgYmFja2dyb3VuZCwKKwkJICAgICAgIGVudW0gcnhycGNfcHJvcG9zZV9hY2tfdHJhY2Ugd2h5KQogewotCXM4IHByaW9yID0gcnhycGNfYWNrX3ByaW9yaXR5W2Fja19yZWFzb25dOwotCi0JaWYgKHByaW9yID4gcnhycGNfYWNrX3ByaW9yaXR5W2NhbGwtPmFja3JfcmVhc29uXSkgewotCQlzcGluX2xvY2tfYmgoJmNhbGwtPmxvY2spOwotCQlfX3J4cnBjX3Byb3Bvc2VfQUNLKGNhbGwsIGFja19yZWFzb24sIHNlcmlhbCwgaW1tZWRpYXRlKTsKLQkJc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmxvY2spOwotCX0KKwlzcGluX2xvY2tfYmgoJmNhbGwtPmxvY2spOworCV9fcnhycGNfcHJvcG9zZV9BQ0soY2FsbCwgYWNrX3JlYXNvbiwgc2tldywgc2VyaWFsLAorCQkJICAgIGltbWVkaWF0ZSwgYmFja2dyb3VuZCwgd2h5KTsKKwlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7CiB9CiAKIC8qCi0gKiBzZXQgdGhlIHJlc2VuZCB0aW1lcgorICogSGFuZGxlIGNvbmdlc3Rpb24gYmVpbmcgZGV0ZWN0ZWQgYnkgdGhlIHJldHJhbnNtaXQgdGltZW91dC4KICAqLwotc3RhdGljIHZvaWQgcnhycGNfc2V0X3Jlc2VuZChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgdTggcmVzZW5kLAotCQkJICAgICB1bnNpZ25lZCBsb25nIHJlc2VuZF9hdCkKK3N0YXRpYyB2b2lkIHJ4cnBjX2Nvbmdlc3Rpb25fdGltZW91dChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKIHsKLQlyZWFkX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCWlmIChjYWxsLT5zdGF0ZSA+PSBSWFJQQ19DQUxMX0NPTVBMRVRFKQotCQlyZXNlbmQgPSAwOwotCi0JaWYgKHJlc2VuZCAmIDEpIHsKLQkJX2RlYnVnKCJTRVQgUkVTRU5EIik7Ci0JCXNldF9iaXQoUlhSUENfQ0FMTF9FVl9SRVNFTkQsICZjYWxsLT5ldmVudHMpOwotCX0KLQotCWlmIChyZXNlbmQgJiAyKSB7Ci0JCV9kZWJ1ZygiTU9ESUZZIFJFU0VORCBUSU1FUiIpOwotCQlzZXRfYml0KFJYUlBDX0NBTExfUlVOX1JUSU1FUiwgJmNhbGwtPmZsYWdzKTsKLQkJbW9kX3RpbWVyKCZjYWxsLT5yZXNlbmRfdGltZXIsIHJlc2VuZF9hdCk7Ci0JfSBlbHNlIHsKLQkJX2RlYnVnKCJLSUxMIFJFU0VORCBUSU1FUiIpOwotCQlkZWxfdGltZXJfc3luYygmY2FsbC0+cmVzZW5kX3RpbWVyKTsKLQkJY2xlYXJfYml0KFJYUlBDX0NBTExfRVZfUkVTRU5EX1RJTUVSLCAmY2FsbC0+ZXZlbnRzKTsKLQkJY2xlYXJfYml0KFJYUlBDX0NBTExfUlVOX1JUSU1FUiwgJmNhbGwtPmZsYWdzKTsKLQl9Ci0JcmVhZF91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCXNldF9iaXQoUlhSUENfQ0FMTF9SRVRSQU5TX1RJTUVPVVQsICZjYWxsLT5mbGFncyk7CiB9CiAKIC8qCi0gKiByZXNlbmQgcGFja2V0cworICogUGVyZm9ybSByZXRyYW5zbWlzc2lvbiBvZiBOQUsnZCBhbmQgdW5hY2snZCBwYWNrZXRzLgogICovCi1zdGF0aWMgdm9pZCByeHJwY19yZXNlbmQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCitzdGF0aWMgdm9pZCByeHJwY19yZXNlbmQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIGt0aW1lX3Qgbm93KQogewotCXN0cnVjdCByeHJwY193aXJlX2hlYWRlciAqd2hkcjsKIAlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOwotCXN0cnVjdCBza19idWZmICp0eGI7Ci0JdW5zaWduZWQgbG9uZyAqcF90eGIsIHJlc2VuZF9hdDsKLQlib29sIHN0b3A7Ci0JaW50IGxvb3A7Ci0JdTggcmVzZW5kOworCXN0cnVjdCBza19idWZmICpza2I7CisJcnhycGNfc2VxX3QgY3Vyc29yLCBzZXEsIHRvcDsKKwlrdGltZV90IG1heF9hZ2UsIG9sZGVzdCwgYWNrX3RzOworCWludCBpeDsKKwl1OCBhbm5vdGF0aW9uLCBhbm5vX3R5cGUsIHJldHJhbnMgPSAwLCB1bmFja2VkID0gMDsKIAotCV9lbnRlcigieyVkLCVkLCVkLCVkfSwiLAotCSAgICAgICBjYWxsLT5hY2tzX2hhcmQsIGNhbGwtPmFja3NfdW5hY2tlZCwKLQkgICAgICAgYXRvbWljX3JlYWQoJmNhbGwtPnNlcXVlbmNlKSwKLQkgICAgICAgQ0lSQ19DTlQoY2FsbC0+YWNrc19oZWFkLCBjYWxsLT5hY2tzX3RhaWwsIGNhbGwtPmFja3Nfd2luc3opKTsKKwlfZW50ZXIoInslZCwlZH0iLCBjYWxsLT50eF9oYXJkX2FjaywgY2FsbC0+dHhfdG9wKTsKIAotCXN0b3AgPSBmYWxzZTsKLQlyZXNlbmQgPSAwOwotCXJlc2VuZF9hdCA9IDA7CisJbWF4X2FnZSA9IGt0aW1lX3N1Yl9tcyhub3csIHJ4cnBjX3Jlc2VuZF90aW1lb3V0KTsKIAotCWZvciAobG9vcCA9IGNhbGwtPmFja3NfdGFpbDsKLQkgICAgIGxvb3AgIT0gY2FsbC0+YWNrc19oZWFkIHx8IHN0b3A7Ci0JICAgICBsb29wID0gKGxvb3AgKyAxKSAmICAoY2FsbC0+YWNrc193aW5zeiAtIDEpCi0JICAgICApIHsKLQkJcF90eGIgPSBjYWxsLT5hY2tzX3dpbmRvdyArIGxvb3A7Ci0JCXNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpOwotCQlpZiAoKnBfdHhiICYgMSkKKwlzcGluX2xvY2tfYmgoJmNhbGwtPmxvY2spOworCisJY3Vyc29yID0gY2FsbC0+dHhfaGFyZF9hY2s7CisJdG9wID0gY2FsbC0+dHhfdG9wOworCUFTU0VSVChiZWZvcmVfZXEoY3Vyc29yLCB0b3ApKTsKKwlpZiAoY3Vyc29yID09IHRvcCkKKwkJZ290byBvdXRfdW5sb2NrOworCisJLyogU2NhbiB0aGUgcGFja2V0IGxpc3Qgd2l0aG91dCBkcm9wcGluZyB0aGUgbG9jayBhbmQgZGVjaWRlIHdoaWNoIG9mCisJICogdGhlIHBhY2tldHMgaW4gdGhlIFR4IGJ1ZmZlciB3ZSdyZSBnb2luZyB0byByZXNlbmQgYW5kIHdoYXQgdGhlIG5ldworCSAqIHJlc2VuZCB0aW1lb3V0IHdpbGwgYmUuCisJICovCisJb2xkZXN0ID0gbm93OworCWZvciAoc2VxID0gY3Vyc29yICsgMTsgYmVmb3JlX2VxKHNlcSwgdG9wKTsgc2VxKyspIHsKKwkJaXggPSBzZXEgJiBSWFJQQ19SWFRYX0JVRkZfTUFTSzsKKwkJYW5ub3RhdGlvbiA9IGNhbGwtPnJ4dHhfYW5ub3RhdGlvbnNbaXhdOworCQlhbm5vX3R5cGUgPSBhbm5vdGF0aW9uICYgUlhSUENfVFhfQU5OT19NQVNLOworCQlhbm5vdGF0aW9uICY9IH5SWFJQQ19UWF9BTk5PX01BU0s7CisJCWlmIChhbm5vX3R5cGUgPT0gUlhSUENfVFhfQU5OT19BQ0spCiAJCQljb250aW51ZTsKIAotCQl0eGIgPSAoc3RydWN0IHNrX2J1ZmYgKikgKnBfdHhiOwotCQlzcCA9IHJ4cnBjX3NrYih0eGIpOworCQlza2IgPSBjYWxsLT5yeHR4X2J1ZmZlcltpeF07CisJCXJ4cnBjX3NlZV9za2Ioc2tiLCByeHJwY19za2JfdHhfc2Vlbik7CisJCXNwID0gcnhycGNfc2tiKHNrYik7CiAKLQkJaWYgKHNwLT5uZWVkX3Jlc2VuZCkgewotCQkJc3AtPm5lZWRfcmVzZW5kID0gZmFsc2U7Ci0KLQkJCS8qIGVhY2ggVHggcGFja2V0IGhhcyBhIG5ldyBzZXJpYWwgbnVtYmVyICovCi0JCQlzcC0+aGRyLnNlcmlhbCA9IGF0b21pY19pbmNfcmV0dXJuKCZjYWxsLT5jb25uLT5zZXJpYWwpOwotCi0JCQl3aGRyID0gKHN0cnVjdCByeHJwY193aXJlX2hlYWRlciAqKXR4Yi0+aGVhZDsKLQkJCXdoZHItPnNlcmlhbCA9IGh0b25sKHNwLT5oZHIuc2VyaWFsKTsKLQotCQkJX3Byb3RvKCJUeCBEQVRBICUlJXUgeyAjJWQgfSIsCi0JCQkgICAgICAgc3AtPmhkci5zZXJpYWwsIHNwLT5oZHIuc2VxKTsKLQkJCWlmIChyeHJwY19zZW5kX2RhdGFfcGFja2V0KGNhbGwtPmNvbm4sIHR4YikgPCAwKSB7Ci0JCQkJc3RvcCA9IHRydWU7Ci0JCQkJc3AtPnJlc2VuZF9hdCA9IGppZmZpZXMgKyAzOwotCQkJfSBlbHNlIHsKLQkJCQlzcC0+cmVzZW5kX2F0ID0KLQkJCQkJamlmZmllcyArIHJ4cnBjX3Jlc2VuZF90aW1lb3V0OworCQlpZiAoYW5ub190eXBlID09IFJYUlBDX1RYX0FOTk9fVU5BQ0spIHsKKwkJCWlmIChrdGltZV9hZnRlcihza2ItPnRzdGFtcCwgbWF4X2FnZSkpIHsKKwkJCQlpZiAoa3RpbWVfYmVmb3JlKHNrYi0+dHN0YW1wLCBvbGRlc3QpKQorCQkJCQlvbGRlc3QgPSBza2ItPnRzdGFtcDsKKwkJCQljb250aW51ZTsKIAkJCX0KKwkJCWlmICghKGFubm90YXRpb24gJiBSWFJQQ19UWF9BTk5PX1JFU0VOVCkpCisJCQkJdW5hY2tlZCsrOwogCQl9CiAKLQkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcyArIDEsIHNwLT5yZXNlbmRfYXQpKSB7Ci0JCQlzcC0+bmVlZF9yZXNlbmQgPSB0cnVlOwotCQkJcmVzZW5kIHw9IDE7Ci0JCX0gZWxzZSBpZiAocmVzZW5kICYgMikgewotCQkJaWYgKHRpbWVfYmVmb3JlKHNwLT5yZXNlbmRfYXQsIHJlc2VuZF9hdCkpCi0JCQkJcmVzZW5kX2F0ID0gc3AtPnJlc2VuZF9hdDsKLQkJfSBlbHNlIHsKLQkJCXJlc2VuZF9hdCA9IHNwLT5yZXNlbmRfYXQ7Ci0JCQlyZXNlbmQgfD0gMjsKLQkJfQorCQkvKiBPa2F5LCB3ZSBuZWVkIHRvIHJldHJhbnNtaXQgYSBwYWNrZXQuICovCisJCWNhbGwtPnJ4dHhfYW5ub3RhdGlvbnNbaXhdID0gUlhSUENfVFhfQU5OT19SRVRSQU5TIHwgYW5ub3RhdGlvbjsKKwkJcmV0cmFucysrOworCQl0cmFjZV9yeHJwY19yZXRyYW5zbWl0KGNhbGwsIHNlcSwgYW5ub3RhdGlvbiB8IGFubm9fdHlwZSwKKwkJCQkgICAgICAga3RpbWVfdG9fbnMoa3RpbWVfc3ViKHNrYi0+dHN0YW1wLCBtYXhfYWdlKSkpOwogCX0KIAotCXJ4cnBjX3NldF9yZXNlbmQoY2FsbCwgcmVzZW5kLCByZXNlbmRfYXQpOworCWNhbGwtPnJlc2VuZF9hdCA9IGt0aW1lX2FkZF9tcyhvbGRlc3QsIHJ4cnBjX3Jlc2VuZF90aW1lb3V0KTsKKworCWlmICh1bmFja2VkKQorCQlyeHJwY19jb25nZXN0aW9uX3RpbWVvdXQoY2FsbCk7CisKKwkvKiBJZiB0aGVyZSB3YXMgbm90aGluZyB0aGF0IG5lZWRlZCByZXRyYW5zbWlzc2lvbiB0aGVuIGl0J3MgbGlrZWx5CisJICogdGhhdCBhbiBBQ0sgZ290IGxvc3Qgc29tZXdoZXJlLiAgU2VuZCBhIHBpbmcgdG8gZmluZCBvdXQgaW5zdGVhZCBvZgorCSAqIHJldHJhbnNtaXR0aW5nIGRhdGEuCisJICovCisJaWYgKCFyZXRyYW5zKSB7CisJCXJ4cnBjX3NldF90aW1lcihjYWxsLCByeHJwY190aW1lcl9zZXRfZm9yX3Jlc2VuZCwgbm93KTsKKwkJc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmxvY2spOworCQlhY2tfdHMgPSBrdGltZV9zdWIobm93LCBjYWxsLT5hY2tzX2xhdGVzdF90cyk7CisJCWlmIChrdGltZV90b19ucyhhY2tfdHMpIDwgY2FsbC0+cGVlci0+cnR0KQorCQkJZ290byBvdXQ7CisJCXJ4cnBjX3Byb3Bvc2VfQUNLKGNhbGwsIFJYUlBDX0FDS19QSU5HLCAwLCAwLCB0cnVlLCBmYWxzZSwKKwkJCQkgIHJ4cnBjX3Byb3Bvc2VfYWNrX3BpbmdfZm9yX2xvc3RfYWNrKTsKKwkJcnhycGNfc2VuZF9jYWxsX3BhY2tldChjYWxsLCBSWFJQQ19QQUNLRVRfVFlQRV9BQ0spOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBOb3cgZ28gdGhyb3VnaCB0aGUgVHggd2luZG93IGFuZCBwZXJmb3JtIHRoZSByZXRyYW5zbWlzc2lvbnMuICBXZQorCSAqIGhhdmUgdG8gZHJvcCB0aGUgbG9jayBmb3IgZWFjaCBzZW5kLiAgSWYgYW4gQUNLIGNvbWVzIGluIHdoaWxzdCB0aGUKKwkgKiBsb2NrIGlzIGRyb3BwZWQsIGl0IG1heSBjbGVhciBzb21lIG9mIHRoZSByZXRyYW5zbWlzc2lvbiBtYXJrZXJzIGZvcgorCSAqIHBhY2tldHMgdGhhdCBpdCBzb2Z0LUFDS3MuCisJICovCisJZm9yIChzZXEgPSBjdXJzb3IgKyAxOyBiZWZvcmVfZXEoc2VxLCB0b3ApOyBzZXErKykgeworCQlpeCA9IHNlcSAmIFJYUlBDX1JYVFhfQlVGRl9NQVNLOworCQlhbm5vdGF0aW9uID0gY2FsbC0+cnh0eF9hbm5vdGF0aW9uc1tpeF07CisJCWFubm9fdHlwZSA9IGFubm90YXRpb24gJiBSWFJQQ19UWF9BTk5PX01BU0s7CisJCWlmIChhbm5vX3R5cGUgIT0gUlhSUENfVFhfQU5OT19SRVRSQU5TKQorCQkJY29udGludWU7CisKKwkJc2tiID0gY2FsbC0+cnh0eF9idWZmZXJbaXhdOworCQlyeHJwY19nZXRfc2tiKHNrYiwgcnhycGNfc2tiX3R4X2dvdCk7CisJCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKworCQlpZiAocnhycGNfc2VuZF9kYXRhX3BhY2tldChjYWxsLCBza2IsIHRydWUpIDwgMCkgeworCQkJcnhycGNfZnJlZV9za2Ioc2tiLCByeHJwY19za2JfdHhfZnJlZWQpOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKHJ4cnBjX2lzX2NsaWVudF9jYWxsKGNhbGwpKQorCQkJcnhycGNfZXhwb3NlX2NsaWVudF9jYWxsKGNhbGwpOworCisJCXJ4cnBjX2ZyZWVfc2tiKHNrYiwgcnhycGNfc2tiX3R4X2ZyZWVkKTsKKwkJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKworCQkvKiBXZSBuZWVkIHRvIGNsZWFyIHRoZSByZXRyYW5zbWl0IHN0YXRlLCBidXQgdGhlcmUgYXJlIHR3bworCQkgKiB0aGluZ3Mgd2UgbmVlZCB0byBiZSBhd2FyZSBvZjogQSBuZXcgQUNLL05BSyBtaWdodCBoYXZlIGJlZW4KKwkJICogcmVjZWl2ZWQgYW5kIHRoZSBwYWNrZXQgbWlnaHQgaGF2ZSBiZWVuIGhhcmQtQUNLJ2QgKGluIHdoaWNoCisJCSAqIGNhc2UgaXQgd2lsbCBubyBsb25nZXIgYmUgaW4gdGhlIGJ1ZmZlcikuCisJCSAqLworCQlpZiAoYWZ0ZXIoc2VxLCBjYWxsLT50eF9oYXJkX2FjaykpIHsKKwkJCWFubm90YXRpb24gPSBjYWxsLT5yeHR4X2Fubm90YXRpb25zW2l4XTsKKwkJCWFubm9fdHlwZSA9IGFubm90YXRpb24gJiBSWFJQQ19UWF9BTk5PX01BU0s7CisJCQlpZiAoYW5ub190eXBlID09IFJYUlBDX1RYX0FOTk9fUkVUUkFOUyB8fAorCQkJICAgIGFubm9fdHlwZSA9PSBSWFJQQ19UWF9BTk5PX05BSykgeworCQkJCWFubm90YXRpb24gJj0gflJYUlBDX1RYX0FOTk9fTUFTSzsKKwkJCQlhbm5vdGF0aW9uIHw9IFJYUlBDX1RYX0FOTk9fVU5BQ0s7CisJCQl9CisJCQlhbm5vdGF0aW9uIHw9IFJYUlBDX1RYX0FOTk9fUkVTRU5UOworCQkJY2FsbC0+cnh0eF9hbm5vdGF0aW9uc1tpeF0gPSBhbm5vdGF0aW9uOworCQl9CisKKwkJaWYgKGFmdGVyKGNhbGwtPnR4X2hhcmRfYWNrLCBzZXEpKQorCQkJc2VxID0gY2FsbC0+dHhfaGFyZF9hY2s7CisJfQorCitvdXRfdW5sb2NrOgorCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKK291dDoKIAlfbGVhdmUoIiIpOwogfQogCiAvKgotICogaGFuZGxlIHJlc2VuZCB0aW1lciBleHBpcnkKLSAqLwotc3RhdGljIHZvaWQgcnhycGNfcmVzZW5kX3RpbWVyKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQotewotCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7Ci0Jc3RydWN0IHNrX2J1ZmYgKnR4YjsKLQl1bnNpZ25lZCBsb25nICpwX3R4YiwgcmVzZW5kX2F0OwotCWludCBsb29wOwotCXU4IHJlc2VuZDsKLQotCV9lbnRlcigiJWQsJWQsJWQiLAotCSAgICAgICBjYWxsLT5hY2tzX3RhaWwsIGNhbGwtPmFja3NfdW5hY2tlZCwgY2FsbC0+YWNrc19oZWFkKTsKLQotCWlmIChjYWxsLT5zdGF0ZSA+PSBSWFJQQ19DQUxMX0NPTVBMRVRFKQotCQlyZXR1cm47Ci0KLQlyZXNlbmQgPSAwOwotCXJlc2VuZF9hdCA9IDA7Ci0KLQlmb3IgKGxvb3AgPSBjYWxsLT5hY2tzX3VuYWNrZWQ7Ci0JICAgICBsb29wICE9IGNhbGwtPmFja3NfaGVhZDsKLQkgICAgIGxvb3AgPSAobG9vcCArIDEpICYgIChjYWxsLT5hY2tzX3dpbnN6IC0gMSkKLQkgICAgICkgewotCQlwX3R4YiA9IGNhbGwtPmFja3Nfd2luZG93ICsgbG9vcDsKLQkJc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCk7Ci0JCXR4YiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSAoKnBfdHhiICYgfjEpOwotCQlzcCA9IHJ4cnBjX3NrYih0eGIpOwotCi0JCUFTU0VSVCghKCpwX3R4YiAmIDEpKTsKLQotCQlpZiAoc3AtPm5lZWRfcmVzZW5kKSB7Ci0JCQk7Ci0JCX0gZWxzZSBpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzICsgMSwgc3AtPnJlc2VuZF9hdCkpIHsKLQkJCXNwLT5uZWVkX3Jlc2VuZCA9IHRydWU7Ci0JCQlyZXNlbmQgfD0gMTsKLQkJfSBlbHNlIGlmIChyZXNlbmQgJiAyKSB7Ci0JCQlpZiAodGltZV9iZWZvcmUoc3AtPnJlc2VuZF9hdCwgcmVzZW5kX2F0KSkKLQkJCQlyZXNlbmRfYXQgPSBzcC0+cmVzZW5kX2F0OwotCQl9IGVsc2UgewotCQkJcmVzZW5kX2F0ID0gc3AtPnJlc2VuZF9hdDsKLQkJCXJlc2VuZCB8PSAyOwotCQl9Ci0JfQotCi0JcnhycGNfc2V0X3Jlc2VuZChjYWxsLCByZXNlbmQsIHJlc2VuZF9hdCk7Ci0JX2xlYXZlKCIiKTsKLX0KLQotLyoKLSAqIHByb2Nlc3Mgc29mdCBBQ0tzIG9mIG91ciB0cmFuc21pdHRlZCBwYWNrZXRzCi0gKiAtIHRoZXNlIGluZGljYXRlIHBhY2tldHMgdGhlIHBlZXIgaGFzIG9yIGhhcyBub3QgcmVjZWl2ZWQsIGJ1dCBoYXNuJ3QgeWV0Ci0gKiAgIGdpdmVuIHRvIHRoZSBjb25zdW1lciwgYW5kIHNvIGNhbiBzdGlsbCBiZSBkaXNjYXJkZWQgYW5kIHJlLXJlcXVlc3RlZAotICovCi1zdGF0aWMgaW50IHJ4cnBjX3Byb2Nlc3Nfc29mdF9BQ0tzKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkJCSAgIHN0cnVjdCByeHJwY19hY2twYWNrZXQgKmFjaywKLQkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7Ci0Jc3RydWN0IHNrX2J1ZmYgKnR4YjsKLQl1bnNpZ25lZCBsb25nICpwX3R4YiwgcmVzZW5kX2F0OwotCWludCBsb29wOwotCXU4IHNhY2tzW1JYUlBDX01BWEFDS1NdLCByZXNlbmQ7Ci0KLQlfZW50ZXIoInslZCwlZH0seyVkfSwiLAotCSAgICAgICBjYWxsLT5hY2tzX2hhcmQsCi0JICAgICAgIENJUkNfQ05UKGNhbGwtPmFja3NfaGVhZCwgY2FsbC0+YWNrc190YWlsLCBjYWxsLT5hY2tzX3dpbnN6KSwKLQkgICAgICAgYWNrLT5uQWNrcyk7Ci0KLQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIDAsIHNhY2tzLCBhY2stPm5BY2tzKSA8IDApCi0JCWdvdG8gcHJvdG9jb2xfZXJyb3I7Ci0KLQlyZXNlbmQgPSAwOwotCXJlc2VuZF9hdCA9IDA7Ci0JZm9yIChsb29wID0gMDsgbG9vcCA8IGFjay0+bkFja3M7IGxvb3ArKykgewotCQlwX3R4YiA9IGNhbGwtPmFja3Nfd2luZG93OwotCQlwX3R4YiArPSAoY2FsbC0+YWNrc190YWlsICsgbG9vcCkgJiAoY2FsbC0+YWNrc193aW5zeiAtIDEpOwotCQlzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKTsKLQkJdHhiID0gKHN0cnVjdCBza19idWZmICopICgqcF90eGIgJiB+MSk7Ci0JCXNwID0gcnhycGNfc2tiKHR4Yik7Ci0KLQkJc3dpdGNoIChzYWNrc1tsb29wXSkgewotCQljYXNlIFJYUlBDX0FDS19UWVBFX0FDSzoKLQkJCXNwLT5uZWVkX3Jlc2VuZCA9IGZhbHNlOwotCQkJKnBfdHhiIHw9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSBSWFJQQ19BQ0tfVFlQRV9OQUNLOgotCQkJc3AtPm5lZWRfcmVzZW5kID0gdHJ1ZTsKLQkJCSpwX3R4YiAmPSB+MTsKLQkJCXJlc2VuZCA9IDE7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCV9kZWJ1ZygiVW5zdXBwb3J0ZWQgQUNLIHR5cGUgJWQiLCBzYWNrc1tsb29wXSk7Ci0JCQlnb3RvIHByb3RvY29sX2Vycm9yOwotCQl9Ci0JfQotCi0Jc21wX21iKCk7Ci0JY2FsbC0+YWNrc191bmFja2VkID0gKGNhbGwtPmFja3NfdGFpbCArIGxvb3ApICYgKGNhbGwtPmFja3Nfd2luc3ogLSAxKTsKLQotCS8qIGFueXRoaW5nIG5vdCBleHBsaWNpdGx5IEFDSydkIGlzIGltcGxpY2l0bHkgTkFDSydkLCBidXQgbWF5IGp1c3Qgbm90Ci0JICogaGF2ZSBiZWVuIHJlY2VpdmVkIG9yIHByb2Nlc3NlZCB5ZXQgYnkgdGhlIGZhciBlbmQgKi8KLQlmb3IgKGxvb3AgPSBjYWxsLT5hY2tzX3VuYWNrZWQ7Ci0JICAgICBsb29wICE9IGNhbGwtPmFja3NfaGVhZDsKLQkgICAgIGxvb3AgPSAobG9vcCArIDEpICYgIChjYWxsLT5hY2tzX3dpbnN6IC0gMSkKLQkgICAgICkgewotCQlwX3R4YiA9IGNhbGwtPmFja3Nfd2luZG93ICsgbG9vcDsKLQkJc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCk7Ci0JCXR4YiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSAoKnBfdHhiICYgfjEpOwotCQlzcCA9IHJ4cnBjX3NrYih0eGIpOwotCi0JCWlmICgqcF90eGIgJiAxKSB7Ci0JCQkvKiBwYWNrZXQgbXVzdCBoYXZlIGJlZW4gZGlzY2FyZGVkICovCi0JCQlzcC0+bmVlZF9yZXNlbmQgPSB0cnVlOwotCQkJKnBfdHhiICY9IH4xOwotCQkJcmVzZW5kIHw9IDE7Ci0JCX0gZWxzZSBpZiAoc3AtPm5lZWRfcmVzZW5kKSB7Ci0JCQk7Ci0JCX0gZWxzZSBpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzICsgMSwgc3AtPnJlc2VuZF9hdCkpIHsKLQkJCXNwLT5uZWVkX3Jlc2VuZCA9IHRydWU7Ci0JCQlyZXNlbmQgfD0gMTsKLQkJfSBlbHNlIGlmIChyZXNlbmQgJiAyKSB7Ci0JCQlpZiAodGltZV9iZWZvcmUoc3AtPnJlc2VuZF9hdCwgcmVzZW5kX2F0KSkKLQkJCQlyZXNlbmRfYXQgPSBzcC0+cmVzZW5kX2F0OwotCQl9IGVsc2UgewotCQkJcmVzZW5kX2F0ID0gc3AtPnJlc2VuZF9hdDsKLQkJCXJlc2VuZCB8PSAyOwotCQl9Ci0JfQotCi0JcnhycGNfc2V0X3Jlc2VuZChjYWxsLCByZXNlbmQsIHJlc2VuZF9hdCk7Ci0JX2xlYXZlKCIgPSAwIik7Ci0JcmV0dXJuIDA7Ci0KLXByb3RvY29sX2Vycm9yOgotCV9sZWF2ZSgiID0gLUVQUk9UTyIpOwotCXJldHVybiAtRVBST1RPOwotfQotCi0vKgotICogZGlzY2FyZCBoYXJkLUFDSydkIHBhY2tldHMgZnJvbSB0aGUgVHggd2luZG93Ci0gKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX3JvdGF0ZV90eF93aW5kb3coc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHUzMiBoYXJkKQotewotCXVuc2lnbmVkIGxvbmcgX3NrYjsKLQlpbnQgdGFpbCA9IGNhbGwtPmFja3NfdGFpbCwgb2xkX3RhaWw7Ci0JaW50IHdpbiA9IENJUkNfQ05UKGNhbGwtPmFja3NfaGVhZCwgdGFpbCwgY2FsbC0+YWNrc193aW5zeik7Ci0KLQlfZW50ZXIoInsldSwldX0sJXUiLCBjYWxsLT5hY2tzX2hhcmQsIHdpbiwgaGFyZCk7Ci0KLQlBU1NFUlRDTVAoaGFyZCAtIGNhbGwtPmFja3NfaGFyZCwgPD0sIHdpbik7Ci0KLQl3aGlsZSAoY2FsbC0+YWNrc19oYXJkIDwgaGFyZCkgewotCQlzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKTsKLQkJX3NrYiA9IGNhbGwtPmFja3Nfd2luZG93W3RhaWxdICYgfjE7Ci0JCXJ4cnBjX2ZyZWVfc2tiKChzdHJ1Y3Qgc2tfYnVmZiAqKSBfc2tiKTsKLQkJb2xkX3RhaWwgPSB0YWlsOwotCQl0YWlsID0gKHRhaWwgKyAxKSAmIChjYWxsLT5hY2tzX3dpbnN6IC0gMSk7Ci0JCWNhbGwtPmFja3NfdGFpbCA9IHRhaWw7Ci0JCWlmIChjYWxsLT5hY2tzX3VuYWNrZWQgPT0gb2xkX3RhaWwpCi0JCQljYWxsLT5hY2tzX3VuYWNrZWQgPSB0YWlsOwotCQljYWxsLT5hY2tzX2hhcmQrKzsKLQl9Ci0KLQl3YWtlX3VwKCZjYWxsLT50eF93YWl0cSk7Ci19Ci0KLS8qCi0gKiBjbGVhciB0aGUgVHggd2luZG93IGluIHRoZSBldmVudCBvZiBhIGZhaWx1cmUKLSAqLwotc3RhdGljIHZvaWQgcnhycGNfY2xlYXJfdHhfd2luZG93KHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQotewotCXJ4cnBjX3JvdGF0ZV90eF93aW5kb3coY2FsbCwgYXRvbWljX3JlYWQoJmNhbGwtPnNlcXVlbmNlKSk7Ci19Ci0KLS8qCi0gKiBkcmFpbiB0aGUgb3V0IG9mIHNlcXVlbmNlIHJlY2VpdmVkIHBhY2tldCBxdWV1ZSBpbnRvIHRoZSBwYWNrZXQgUnggcXVldWUKLSAqLwotc3RhdGljIGludCByeHJwY19kcmFpbl9yeF9vb3NfcXVldWUoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCi17Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCWJvb2wgdGVybWluYWw7Ci0JaW50IHJldDsKLQotCV9lbnRlcigieyVkLCVkfSIsIGNhbGwtPnJ4X2RhdGFfcG9zdCwgY2FsbC0+cnhfZmlyc3Rfb29zKTsKLQotCXNwaW5fbG9ja19iaCgmY2FsbC0+bG9jayk7Ci0KLQlyZXQgPSAtRUNPTk5SRVNFVDsKLQlpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9SRUxFQVNFRCwgJmNhbGwtPmZsYWdzKSkKLQkJZ290byBzb2NrZXRfdW5hdmFpbGFibGU7Ci0KLQlza2IgPSBza2JfZGVxdWV1ZSgmY2FsbC0+cnhfb29zX3F1ZXVlKTsKLQlpZiAoc2tiKSB7Ci0JCXNwID0gcnhycGNfc2tiKHNrYik7Ci0KLQkJX2RlYnVnKCJkcmFpbiBPT1MgcGFja2V0ICVkIFslZF0iLAotCQkgICAgICAgc3AtPmhkci5zZXEsIGNhbGwtPnJ4X2ZpcnN0X29vcyk7Ci0KLQkJaWYgKHNwLT5oZHIuc2VxICE9IGNhbGwtPnJ4X2ZpcnN0X29vcykgewotCQkJc2tiX3F1ZXVlX2hlYWQoJmNhbGwtPnJ4X29vc19xdWV1ZSwgc2tiKTsKLQkJCWNhbGwtPnJ4X2ZpcnN0X29vcyA9IHJ4cnBjX3NrYihza2IpLT5oZHIuc2VxOwotCQkJX2RlYnVnKCJyZXF1ZXVlICVwIHsldX0iLCBza2IsIGNhbGwtPnJ4X2ZpcnN0X29vcyk7Ci0JCX0gZWxzZSB7Ci0JCQlza2ItPm1hcmsgPSBSWFJQQ19TS0JfTUFSS19EQVRBOwotCQkJdGVybWluYWwgPSAoKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVCkgJiYKLQkJCQkhKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19DTElFTlRfSU5JVElBVEVEKSk7Ci0JCQlyZXQgPSByeHJwY19xdWV1ZV9yY3Zfc2tiKGNhbGwsIHNrYiwgdHJ1ZSwgdGVybWluYWwpOwotCQkJQlVHX09OKHJldCA8IDApOwotCQkJX2RlYnVnKCJkcmFpbiAjJXUiLCBjYWxsLT5yeF9kYXRhX3Bvc3QpOwotCQkJY2FsbC0+cnhfZGF0YV9wb3N0Kys7Ci0KLQkJCS8qIGZpbmQgb3V0IHdoYXQgdGhlIG5leHQgcGFja2V0IGlzICovCi0JCQlza2IgPSBza2JfcGVlaygmY2FsbC0+cnhfb29zX3F1ZXVlKTsKLQkJCWlmIChza2IpCi0JCQkJY2FsbC0+cnhfZmlyc3Rfb29zID0gcnhycGNfc2tiKHNrYiktPmhkci5zZXE7Ci0JCQllbHNlCi0JCQkJY2FsbC0+cnhfZmlyc3Rfb29zID0gMDsKLQkJCV9kZWJ1ZygicGVlayAlcCB7JXV9Iiwgc2tiLCBjYWxsLT5yeF9maXJzdF9vb3MpOwotCQl9Ci0JfQotCi0JcmV0ID0gMDsKLXNvY2tldF91bmF2YWlsYWJsZToKLQlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7Ci0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIGluc2VydCBhbiBvdXQgb2Ygc2VxdWVuY2UgcGFja2V0IGludG8gdGhlIGJ1ZmZlcgotICovCi1zdGF0aWMgdm9pZCByeHJwY19pbnNlcnRfb29zX3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwLCAqcHNwOwotCXN0cnVjdCBza19idWZmICpwOwotCXUzMiBzZXE7Ci0KLQlzcCA9IHJ4cnBjX3NrYihza2IpOwotCXNlcSA9IHNwLT5oZHIuc2VxOwotCV9lbnRlcigiLCx7JXV9Iiwgc2VxKTsKLQotCXNrYi0+ZGVzdHJ1Y3RvciA9IHJ4cnBjX3BhY2tldF9kZXN0cnVjdG9yOwotCUFTU0VSVENNUChzcC0+Y2FsbCwgPT0sIE5VTEwpOwotCXNwLT5jYWxsID0gY2FsbDsKLQlyeHJwY19nZXRfY2FsbChjYWxsKTsKLQotCS8qIGluc2VydCBpbnRvIHRoZSBidWZmZXIgaW4gc2VxdWVuY2Ugb3JkZXIgKi8KLQlzcGluX2xvY2tfYmgoJmNhbGwtPmxvY2spOwotCi0Jc2tiX3F1ZXVlX3dhbGsoJmNhbGwtPnJ4X29vc19xdWV1ZSwgcCkgewotCQlwc3AgPSByeHJwY19za2IocCk7Ci0JCWlmIChwc3AtPmhkci5zZXEgPiBzZXEpIHsKLQkJCV9kZWJ1ZygiaW5zZXJ0IG9vcyAjJXUgYmVmb3JlICMldSIsIHNlcSwgcHNwLT5oZHIuc2VxKTsKLQkJCXNrYl9pbnNlcnQocCwgc2tiLCAmY2FsbC0+cnhfb29zX3F1ZXVlKTsKLQkJCWdvdG8gaW5zZXJ0ZWQ7Ci0JCX0KLQl9Ci0KLQlfZGVidWcoImFwcGVuZCBvb3MgIyV1Iiwgc2VxKTsKLQlza2JfcXVldWVfdGFpbCgmY2FsbC0+cnhfb29zX3F1ZXVlLCBza2IpOwotaW5zZXJ0ZWQ6Ci0KLQkvKiB3ZSBtaWdodCBub3cgaGF2ZSBhIG5ldyBmcm9udCB0byB0aGUgcXVldWUgKi8KLQlpZiAoY2FsbC0+cnhfZmlyc3Rfb29zID09IDAgfHwgc2VxIDwgY2FsbC0+cnhfZmlyc3Rfb29zKQotCQljYWxsLT5yeF9maXJzdF9vb3MgPSBzZXE7Ci0KLQlyZWFkX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOwotCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfQ09NUExFVEUgJiYKLQkgICAgY2FsbC0+cnhfZGF0YV9wb3N0ID09IGNhbGwtPnJ4X2ZpcnN0X29vcykgewotCQlfZGVidWcoImRyYWluIHJ4IG9vcyBub3ciKTsKLQkJc2V0X2JpdChSWFJQQ19DQUxMX0VWX0RSQUlOX1JYX09PUywgJmNhbGwtPmV2ZW50cyk7Ci0JfQotCXJlYWRfdW5sb2NrKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQotCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKLQlfbGVhdmUoIiBbc3RvcmVkICMldV0iLCBjYWxsLT5yeF9maXJzdF9vb3MpOwotfQotCi0vKgotICogY2xlYXIgdGhlIFR4IHdpbmRvdyBvbiBmaW5hbCBBQ0sgcmVjZXB0aW9uCi0gKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX3phcF90eF93aW5kb3coc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCi17Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXVuc2lnbmVkIGxvbmcgX3NrYiwgKmFja3Nfd2luZG93OwotCXU4IHdpbnN6ID0gY2FsbC0+YWNrc193aW5zejsKLQlpbnQgdGFpbDsKLQotCWFja3Nfd2luZG93ID0gY2FsbC0+YWNrc193aW5kb3c7Ci0JY2FsbC0+YWNrc193aW5kb3cgPSBOVUxMOwotCi0Jd2hpbGUgKENJUkNfQ05UKGNhbGwtPmFja3NfaGVhZCwgY2FsbC0+YWNrc190YWlsLCB3aW5zeikgPiAwKSB7Ci0JCXRhaWwgPSBjYWxsLT5hY2tzX3RhaWw7Ci0JCXNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpOwotCQlfc2tiID0gYWNrc193aW5kb3dbdGFpbF0gJiB+MTsKLQkJc21wX21iKCk7Ci0JCWNhbGwtPmFja3NfdGFpbCA9IChjYWxsLT5hY2tzX3RhaWwgKyAxKSAmICh3aW5zeiAtIDEpOwotCi0JCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSBfc2tiOwotCQlzcCA9IHJ4cnBjX3NrYihza2IpOwotCQlfZGVidWcoIisrKyBjbGVhciBUeCAldSIsIHNwLT5oZHIuc2VxKTsKLQkJcnhycGNfZnJlZV9za2Ioc2tiKTsKLQl9Ci0KLQlrZnJlZShhY2tzX3dpbmRvdyk7Ci19Ci0KLS8qCi0gKiBwcm9jZXNzIHRoZSBleHRyYSBpbmZvcm1hdGlvbiB0aGF0IG1heSBiZSBhcHBlbmRlZCB0byBhbiBBQ0sgcGFja2V0Ci0gKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX2V4dHJhY3RfYWNraW5mbyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgIHVuc2lnbmVkIGludCBsYXRlc3QsIGludCBuQWNrcykKLXsKLQlzdHJ1Y3QgcnhycGNfYWNraW5mbyBhY2tpbmZvOwotCXN0cnVjdCByeHJwY19wZWVyICpwZWVyOwotCXVuc2lnbmVkIGludCBtdHU7Ci0KLQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIG5BY2tzICsgMywgJmFja2luZm8sIHNpemVvZihhY2tpbmZvKSkgPCAwKSB7Ci0JCV9sZWF2ZSgiIFtubyBhY2tpbmZvXSIpOwotCQlyZXR1cm47Ci0JfQotCi0JX3Byb3RvKCJSeCBBQ0sgJSUldSBJbmZvIHsgcng9JXUgbWF4PSV1IHJ3aW49JXUgam09JXUgfSIsCi0JICAgICAgIGxhdGVzdCwKLQkgICAgICAgbnRvaGwoYWNraW5mby5yeE1UVSksIG50b2hsKGFja2luZm8ubWF4TVRVKSwKLQkgICAgICAgbnRvaGwoYWNraW5mby5yd2luZCksIG50b2hsKGFja2luZm8uanVtYm9fbWF4KSk7Ci0KLQltdHUgPSBtaW4obnRvaGwoYWNraW5mby5yeE1UVSksIG50b2hsKGFja2luZm8ubWF4TVRVKSk7Ci0KLQlwZWVyID0gY2FsbC0+Y29ubi0+cGFyYW1zLnBlZXI7Ci0JaWYgKG10dSA8IHBlZXItPm1heGRhdGEpIHsKLQkJc3Bpbl9sb2NrX2JoKCZwZWVyLT5sb2NrKTsKLQkJcGVlci0+bWF4ZGF0YSA9IG10dTsKLQkJcGVlci0+bXR1ID0gbXR1ICsgcGVlci0+aGRyc2l6ZTsKLQkJc3Bpbl91bmxvY2tfYmgoJnBlZXItPmxvY2spOwotCQlfbmV0KCJOZXQgTVRVICV1IChtYXhkYXRhICV1KSIsIHBlZXItPm10dSwgcGVlci0+bWF4ZGF0YSk7Ci0JfQotfQotCi0vKgotICogcHJvY2VzcyBwYWNrZXRzIGluIHRoZSByZWNlcHRpb24gcXVldWUKLSAqLwotc3RhdGljIGludCByeHJwY19wcm9jZXNzX3J4X3F1ZXVlKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkJCSAgdTMyICpfYWJvcnRfY29kZSkKLXsKLQlzdHJ1Y3QgcnhycGNfYWNrcGFja2V0IGFjazsKLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0JYm9vbCBwb3N0X0FDSzsKLQlpbnQgbGF0ZXN0OwotCXUzMiBoYXJkLCB0eDsKLQotCV9lbnRlcigiIik7Ci0KLXByb2Nlc3NfZnVydGhlcjoKLQlza2IgPSBza2JfZGVxdWV1ZSgmY2FsbC0+cnhfcXVldWUpOwotCWlmICghc2tiKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCV9uZXQoImRlZmVycmVkIHNrYiAlcCIsIHNrYik7Ci0KLQlzcCA9IHJ4cnBjX3NrYihza2IpOwotCi0JX2RlYnVnKCJwcm9jZXNzICVzIFtzdCAlZF0iLCByeHJwY19wa3RzW3NwLT5oZHIudHlwZV0sIGNhbGwtPnN0YXRlKTsKLQotCXBvc3RfQUNLID0gZmFsc2U7Ci0KLQlzd2l0Y2ggKHNwLT5oZHIudHlwZSkgewotCQkvKiBkYXRhIHBhY2tldHMgdGhhdCB3aW5kIHVwIGhlcmUgaGF2ZSBiZWVuIHJlY2VpdmVkIG91dCBvZgotCQkgKiBvcmRlciwgbmVlZCBzZWN1cml0eSBwcm9jZXNzaW5nIG9yIGFyZSBqdW1ibyBwYWNrZXRzICovCi0JY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9EQVRBOgotCQlfcHJvdG8oIk9PU1EgREFUQSAlJSV1IHsgIyV1IH0iLCBzcC0+aGRyLnNlcmlhbCwgc3AtPmhkci5zZXEpOwotCi0JCS8qIHNlY3VyZWQgcGFja2V0cyBtdXN0IGJlIHZlcmlmaWVkIGFuZCBwb3NzaWJseSBkZWNyeXB0ZWQgKi8KLQkJaWYgKGNhbGwtPmNvbm4tPnNlY3VyaXR5LT52ZXJpZnlfcGFja2V0KGNhbGwsIHNrYiwKLQkJCQkJCQlfYWJvcnRfY29kZSkgPCAwKQotCQkJZ290byBwcm90b2NvbF9lcnJvcjsKLQotCQlyeHJwY19pbnNlcnRfb29zX3BhY2tldChjYWxsLCBza2IpOwotCQlnb3RvIHByb2Nlc3NfZnVydGhlcjsKLQotCQkvKiBwYXJ0aWFsIEFDSyB0byBwcm9jZXNzICovCi0JY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9BQ0s6Ci0JCWlmIChza2JfY29weV9iaXRzKHNrYiwgMCwgJmFjaywgc2l6ZW9mKGFjaykpIDwgMCkgewotCQkJX2RlYnVnKCJleHRyYWN0aW9uIGZhaWx1cmUiKTsKLQkJCWdvdG8gcHJvdG9jb2xfZXJyb3I7Ci0JCX0KLQkJaWYgKCFza2JfcHVsbChza2IsIHNpemVvZihhY2spKSkKLQkJCUJVRygpOwotCi0JCWxhdGVzdCA9IHNwLT5oZHIuc2VyaWFsOwotCQloYXJkID0gbnRvaGwoYWNrLmZpcnN0UGFja2V0KTsKLQkJdHggPSBhdG9taWNfcmVhZCgmY2FsbC0+c2VxdWVuY2UpOwotCi0JCV9wcm90bygiUnggQUNLICUlJXUgeyBtPSVodSBmPSMldSBwPSMldSBzPSUlJXUgcj0lcyBuPSV1IH0iLAotCQkgICAgICAgbGF0ZXN0LAotCQkgICAgICAgbnRvaHMoYWNrLm1heFNrZXcpLAotCQkgICAgICAgaGFyZCwKLQkJICAgICAgIG50b2hsKGFjay5wcmV2aW91c1BhY2tldCksCi0JCSAgICAgICBudG9obChhY2suc2VyaWFsKSwKLQkJICAgICAgIHJ4cnBjX2Fja3MoYWNrLnJlYXNvbiksCi0JCSAgICAgICBhY2subkFja3MpOwotCi0JCXJ4cnBjX2V4dHJhY3RfYWNraW5mbyhjYWxsLCBza2IsIGxhdGVzdCwgYWNrLm5BY2tzKTsKLQotCQlpZiAoYWNrLnJlYXNvbiA9PSBSWFJQQ19BQ0tfUElORykgewotCQkJX3Byb3RvKCJSeCBBQ0sgJSUldSBQSU5HIFJlcXVlc3QiLCBsYXRlc3QpOwotCQkJcnhycGNfcHJvcG9zZV9BQ0soY2FsbCwgUlhSUENfQUNLX1BJTkdfUkVTUE9OU0UsCi0JCQkJCSAgc3AtPmhkci5zZXJpYWwsIHRydWUpOwotCQl9Ci0KLQkJLyogZGlzY2FyZCBhbnkgb3V0LW9mLW9yZGVyIG9yIGR1cGxpY2F0ZSBBQ0tzICovCi0JCWlmIChsYXRlc3QgLSBjYWxsLT5hY2tzX2xhdGVzdCA8PSAwKSB7Ci0JCQlfZGVidWcoImRpc2NhcmQgQUNLICVkIDw9ICVkIiwKLQkJCSAgICAgICBsYXRlc3QsIGNhbGwtPmFja3NfbGF0ZXN0KTsKLQkJCWdvdG8gZGlzY2FyZDsKLQkJfQotCQljYWxsLT5hY2tzX2xhdGVzdCA9IGxhdGVzdDsKLQotCQlpZiAoY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9DTElFTlRfU0VORF9SRVFVRVNUICYmCi0JCSAgICBjYWxsLT5zdGF0ZSAhPSBSWFJQQ19DQUxMX0NMSUVOVF9BV0FJVF9SRVBMWSAmJgotCQkgICAgY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9TRVJWRVJfU0VORF9SRVBMWSAmJgotCQkgICAgY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9TRVJWRVJfQVdBSVRfQUNLKQotCQkJZ290byBkaXNjYXJkOwotCi0JCV9kZWJ1ZygiVHg9JWQgSD0ldSBTPSVkIiwgdHgsIGNhbGwtPmFja3NfaGFyZCwgY2FsbC0+c3RhdGUpOwotCi0JCWlmIChoYXJkID4gMCkgewotCQkJaWYgKGhhcmQgLSAxID4gdHgpIHsKLQkJCQlfZGVidWcoImhhcmQtQUNLJ2QgcGFja2V0ICVkIG5vdCB0cmFuc21pdHRlZCIKLQkJCQkgICAgICAgIiAoJWQgdG9wKSIsCi0JCQkJICAgICAgIGhhcmQgLSAxLCB0eCk7Ci0JCQkJZ290byBwcm90b2NvbF9lcnJvcjsKLQkJCX0KLQotCQkJaWYgKChjYWxsLT5zdGF0ZSA9PSBSWFJQQ19DQUxMX0NMSUVOVF9BV0FJVF9SRVBMWSB8fAotCQkJICAgICBjYWxsLT5zdGF0ZSA9PSBSWFJQQ19DQUxMX1NFUlZFUl9BV0FJVF9BQ0spICYmCi0JCQkgICAgaGFyZCA+IHR4KSB7Ci0JCQkJY2FsbC0+YWNrc19oYXJkID0gdHg7Ci0JCQkJZ290byBhbGxfYWNrZWQ7Ci0JCQl9Ci0KLQkJCXNtcF9ybWIoKTsKLQkJCXJ4cnBjX3JvdGF0ZV90eF93aW5kb3coY2FsbCwgaGFyZCAtIDEpOwotCQl9Ci0KLQkJaWYgKGFjay5uQWNrcyA+IDApIHsKLQkJCWlmIChoYXJkIC0gMSArIGFjay5uQWNrcyA+IHR4KSB7Ci0JCQkJX2RlYnVnKCJzb2Z0LUFDSydkIHBhY2tldCAlZCslZCBub3QiCi0JCQkJICAgICAgICIgdHJhbnNtaXR0ZWQgKCVkIHRvcCkiLAotCQkJCSAgICAgICBoYXJkIC0gMSwgYWNrLm5BY2tzLCB0eCk7Ci0JCQkJZ290byBwcm90b2NvbF9lcnJvcjsKLQkJCX0KLQotCQkJaWYgKHJ4cnBjX3Byb2Nlc3Nfc29mdF9BQ0tzKGNhbGwsICZhY2ssIHNrYikgPCAwKQotCQkJCWdvdG8gcHJvdG9jb2xfZXJyb3I7Ci0JCX0KLQkJZ290byBkaXNjYXJkOwotCi0JCS8qIGNvbXBsZXRlIEFDSyB0byBwcm9jZXNzICovCi0JY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9BQ0tBTEw6Ci0JCWdvdG8gYWxsX2Fja2VkOwotCi0JCS8qIGFib3J0IGFuZCBidXN5IGFyZSBoYW5kbGVkIGVsc2V3aGVyZSAqLwotCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQlVTWToKLQljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0FCT1JUOgotCQlCVUcoKTsKLQotCQkvKiBjb25uZWN0aW9uIGxldmVsIGV2ZW50cyAtIGFsc28gaGFuZGxlZCBlbHNld2hlcmUgKi8KLQljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0NIQUxMRU5HRToKLQljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX1JFU1BPTlNFOgotCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfREVCVUc6Ci0JCUJVRygpOwotCX0KLQotCS8qIGlmIHdlJ3ZlIGhhZCBhIGhhcmQgQUNLIHRoYXQgY292ZXJzIGFsbCB0aGUgcGFja2V0cyB3ZSd2ZSBzZW50LCB0aGVuCi0JICogdGhhdCBlbmRzIHRoYXQgcGhhc2Ugb2YgdGhlIG9wZXJhdGlvbiAqLwotYWxsX2Fja2VkOgotCXdyaXRlX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCV9kZWJ1ZygiYWNrIGFsbCAlZCIsIGNhbGwtPnN0YXRlKTsKLQotCXN3aXRjaCAoY2FsbC0+c3RhdGUpIHsKLQljYXNlIFJYUlBDX0NBTExfQ0xJRU5UX0FXQUlUX1JFUExZOgotCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfQ0xJRU5UX1JFQ1ZfUkVQTFk7Ci0JCWJyZWFrOwotCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfQVdBSVRfQUNLOgotCQlfZGVidWcoInNydiBjb21wbGV0ZSIpOwotCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfQ09NUExFVEU7Ci0JCXBvc3RfQUNLID0gdHJ1ZTsKLQkJYnJlYWs7Ci0JY2FzZSBSWFJQQ19DQUxMX0NMSUVOVF9TRU5EX1JFUVVFU1Q6Ci0JY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9SRUNWX1JFUVVFU1Q6Ci0JCWdvdG8gcHJvdG9jb2xfZXJyb3JfdW5sb2NrOyAvKiBjYW4ndCBvY2N1ciB5ZXQgKi8KLQlkZWZhdWx0OgotCQl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCQlnb3RvIGRpc2NhcmQ7IC8qIGFzc3VtZSBwYWNrZXQgbGVmdCBvdmVyIGZyb20gZWFybGllciBwaGFzZSAqLwotCX0KLQotCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0KLQkvKiBpZiBhbGwgdGhlIHBhY2tldHMgd2Ugc2VudCBhcmUgaGFyZC1BQ0snZCwgdGhlbiB3ZSBjYW4gZGlzY2FyZAotCSAqIHdoYXRldmVyIHdlJ3ZlIGdvdCBsZWZ0ICovCi0JX2RlYnVnKCJjbGVhciBUeCAlZCIsCi0JICAgICAgIENJUkNfQ05UKGNhbGwtPmFja3NfaGVhZCwgY2FsbC0+YWNrc190YWlsLCBjYWxsLT5hY2tzX3dpbnN6KSk7Ci0KLQlkZWxfdGltZXJfc3luYygmY2FsbC0+cmVzZW5kX3RpbWVyKTsKLQljbGVhcl9iaXQoUlhSUENfQ0FMTF9SVU5fUlRJTUVSLCAmY2FsbC0+ZmxhZ3MpOwotCWNsZWFyX2JpdChSWFJQQ19DQUxMX0VWX1JFU0VORF9USU1FUiwgJmNhbGwtPmV2ZW50cyk7Ci0KLQlpZiAoY2FsbC0+YWNrc193aW5kb3cpCi0JCXJ4cnBjX3phcF90eF93aW5kb3coY2FsbCk7Ci0KLQlpZiAocG9zdF9BQ0spIHsKLQkJLyogcG9zdCB0aGUgZmluYWwgQUNLIG1lc3NhZ2UgZm9yIHVzZXJzcGFjZSB0byBwaWNrIHVwICovCi0JCV9kZWJ1ZygicG9zdCBBQ0siKTsKLQkJc2tiLT5tYXJrID0gUlhSUENfU0tCX01BUktfRklOQUxfQUNLOwotCQlzcC0+Y2FsbCA9IGNhbGw7Ci0JCXJ4cnBjX2dldF9jYWxsKGNhbGwpOwotCQlzcGluX2xvY2tfYmgoJmNhbGwtPmxvY2spOwotCQlpZiAocnhycGNfcXVldWVfcmN2X3NrYihjYWxsLCBza2IsIHRydWUsIHRydWUpIDwgMCkKLQkJCUJVRygpOwotCQlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7Ci0JCWdvdG8gcHJvY2Vzc19mdXJ0aGVyOwotCX0KLQotZGlzY2FyZDoKLQlyeHJwY19mcmVlX3NrYihza2IpOwotCWdvdG8gcHJvY2Vzc19mdXJ0aGVyOwotCi1wcm90b2NvbF9lcnJvcl91bmxvY2s6Ci0Jd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLXByb3RvY29sX2Vycm9yOgotCXJ4cnBjX2ZyZWVfc2tiKHNrYik7Ci0JX2xlYXZlKCIgPSAtRVBST1RPIik7Ci0JcmV0dXJuIC1FUFJPVE87Ci19Ci0KLS8qCi0gKiBwb3N0IGEgbWVzc2FnZSB0byB0aGUgc29ja2V0IFJ4IHF1ZXVlIGZvciByZWN2bXNnKCkgdG8gcGljayB1cAotICovCi1zdGF0aWMgaW50IHJ4cnBjX3Bvc3RfbWVzc2FnZShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgdTMyIG1hcmssIHUzMiBlcnJvciwKLQkJCSAgICAgIGJvb2wgZmF0YWwpCi17Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCWludCByZXQ7Ci0KLQlfZW50ZXIoInslZCwlbHh9LCV1LCV1LCVkIiwKLQkgICAgICAgY2FsbC0+ZGVidWdfaWQsIGNhbGwtPmZsYWdzLCBtYXJrLCBlcnJvciwgZmF0YWwpOwotCi0JLyogcmVtb3ZlIHRpbWVycyBhbmQgdGhpbmdzIGZvciBmYXRhbCBtZXNzYWdlcyAqLwotCWlmIChmYXRhbCkgewotCQlkZWxfdGltZXJfc3luYygmY2FsbC0+cmVzZW5kX3RpbWVyKTsKLQkJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja190aW1lcik7Ci0JCWNsZWFyX2JpdChSWFJQQ19DQUxMX1JVTl9SVElNRVIsICZjYWxsLT5mbGFncyk7Ci0JfQotCi0JaWYgKG1hcmsgIT0gUlhSUENfU0tCX01BUktfTkVXX0NBTEwgJiYKLQkgICAgIXRlc3RfYml0KFJYUlBDX0NBTExfSEFTX1VTRVJJRCwgJmNhbGwtPmZsYWdzKSkgewotCQlfbGVhdmUoIltubyB1c2VyaWRdIik7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICghdGVzdF9iaXQoUlhSUENfQ0FMTF9URVJNSU5BTF9NU0csICZjYWxsLT5mbGFncykpIHsKLQkJc2tiID0gYWxsb2Nfc2tiKDAsIEdGUF9OT0ZTKTsKLQkJaWYgKCFza2IpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQlyeHJwY19uZXdfc2tiKHNrYik7Ci0KLQkJc2tiLT5tYXJrID0gbWFyazsKLQotCQlzcCA9IHJ4cnBjX3NrYihza2IpOwotCQltZW1zZXQoc3AsIDAsIHNpemVvZigqc3ApKTsKLQkJc3AtPmVycm9yID0gZXJyb3I7Ci0JCXNwLT5jYWxsID0gY2FsbDsKLQkJcnhycGNfZ2V0X2NhbGwoY2FsbCk7Ci0KLQkJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKLQkJcmV0ID0gcnhycGNfcXVldWVfcmN2X3NrYihjYWxsLCBza2IsIHRydWUsIGZhdGFsKTsKLQkJc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmxvY2spOwotCQlCVUdfT04ocmV0IDwgMCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBoYW5kbGUgYmFja2dyb3VuZCBwcm9jZXNzaW5nIG9mIGluY29taW5nIGNhbGwgcGFja2V0cyBhbmQgQUNLIC8gYWJvcnQKLSAqIGdlbmVyYXRpb24KKyAqIEhhbmRsZSByZXRyYW5zbWlzc2lvbiBhbmQgZGVmZXJyZWQgQUNLL2Fib3J0IGdlbmVyYXRpb24uCiAgKi8KIHZvaWQgcnhycGNfcHJvY2Vzc19jYWxsKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcnhycGNfY2FsbCwgcHJvY2Vzc29yKTsKLQlzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIgd2hkcjsKLQlzdHJ1Y3QgcnhycGNfYWNrcGFja2V0IGFjazsKLQlzdHJ1Y3QgcnhycGNfYWNraW5mbyBhY2tpbmZvOwotCXN0cnVjdCBtc2doZHIgbXNnOwotCXN0cnVjdCBrdmVjIGlvdls1XTsKLQllbnVtIHJ4cnBjX2NhbGxfZXZlbnQgZ2VuYml0OwotCXVuc2lnbmVkIGxvbmcgYml0czsKLQlfX2JlMzIgZGF0YSwgcGFkOwotCXNpemVfdCBsZW47Ci0JaW50IGxvb3AsIG5iaXQsIGlvYywgcmV0LCBtdHU7Ci0JdTMyIHNlcmlhbCwgYWJvcnRfY29kZSA9IFJYX1BST1RPQ09MX0VSUk9SOwotCXU4ICphY2tzID0gTlVMTDsKKwlrdGltZV90IG5vdzsKKworCXJ4cnBjX3NlZV9jYWxsKGNhbGwpOwogCiAJLy9wcmludGsoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotCV9lbnRlcigieyVkLCVzLCVseH0gWyVsdV0iLAotCSAgICAgICBjYWxsLT5kZWJ1Z19pZCwgcnhycGNfY2FsbF9zdGF0ZXNbY2FsbC0+c3RhdGVdLCBjYWxsLT5ldmVudHMsCi0JICAgICAgIChqaWZmaWVzIC0gY2FsbC0+Y3JlYXRpb25famlmKSAvIChIWiAvIDEwKSk7CisJX2VudGVyKCJ7JWQsJXMsJWx4fSIsCisJICAgICAgIGNhbGwtPmRlYnVnX2lkLCByeHJwY19jYWxsX3N0YXRlc1tjYWxsLT5zdGF0ZV0sIGNhbGwtPmV2ZW50cyk7CiAKLQlpZiAodGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX1BST0NfQlVTWSwgJmNhbGwtPmZsYWdzKSkgewotCQlfZGVidWcoIlhYWFhYWFhYWFhYWFggUlVOTklORyBPTiBNVUxUSVBMRSBDUFVTIFhYWFhYWFhYWFhYWFgiKTsKLQkJcmV0dXJuOworcmVjaGVja19zdGF0ZToKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJYUlBDX0NBTExfRVZfQUJPUlQsICZjYWxsLT5ldmVudHMpKSB7CisJCXJ4cnBjX3NlbmRfY2FsbF9wYWNrZXQoY2FsbCwgUlhSUENfUEFDS0VUX1RZUEVfQUJPUlQpOworCQlnb3RvIHJlY2hlY2tfc3RhdGU7CiAJfQogCi0JLyogdGhlcmUncyBhIGdvb2QgY2hhbmNlIHdlJ3JlIGdvaW5nIHRvIGhhdmUgdG8gc2VuZCBhIG1lc3NhZ2UsIHNvIHNldAotCSAqIG9uZSB1cCBpbiBhZHZhbmNlICovCi0JbXNnLm1zZ19uYW1lCT0gJmNhbGwtPmNvbm4tPnBhcmFtcy5wZWVyLT5zcngudHJhbnNwb3J0OwotCW1zZy5tc2dfbmFtZWxlbgk9IGNhbGwtPmNvbm4tPnBhcmFtcy5wZWVyLT5zcngudHJhbnNwb3J0X2xlbjsKLQltc2cubXNnX2NvbnRyb2wJPSBOVUxMOwotCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7Ci0JbXNnLm1zZ19mbGFncwk9IDA7Ci0KLQl3aGRyLmVwb2NoCT0gaHRvbmwoY2FsbC0+Y29ubi0+cHJvdG8uZXBvY2gpOwotCXdoZHIuY2lkCT0gaHRvbmwoY2FsbC0+Y2lkKTsKLQl3aGRyLmNhbGxOdW1iZXIJPSBodG9ubChjYWxsLT5jYWxsX2lkKTsKLQl3aGRyLnNlcQk9IDA7Ci0Jd2hkci50eXBlCT0gUlhSUENfUEFDS0VUX1RZUEVfQUNLOwotCXdoZHIuZmxhZ3MJPSBjYWxsLT5jb25uLT5vdXRfY2xpZW50ZmxhZzsKLQl3aGRyLnVzZXJTdGF0dXMJPSAwOwotCXdoZHIuc2VjdXJpdHlJbmRleCA9IGNhbGwtPmNvbm4tPnNlY3VyaXR5X2l4OwotCXdoZHIuX3JzdmQJPSAwOwotCXdoZHIuc2VydmljZUlkCT0gaHRvbnMoY2FsbC0+c2VydmljZV9pZCk7Ci0KLQltZW1zZXQoaW92LCAwLCBzaXplb2YoaW92KSk7Ci0JaW92WzBdLmlvdl9iYXNlCT0gJndoZHI7Ci0JaW92WzBdLmlvdl9sZW4JPSBzaXplb2Yod2hkcik7Ci0KLQkvKiBkZWFsIHdpdGggZXZlbnRzIG9mIGEgZmluYWwgbmF0dXJlICovCi0JaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfRVZfUkNWRF9FUlJPUiwgJmNhbGwtPmV2ZW50cykpIHsKLQkJZW51bSByeHJwY19za2JfbWFyayBtYXJrOwotCQlpbnQgZXJyb3I7Ci0KLQkJY2xlYXJfYml0KFJYUlBDX0NBTExfRVZfQ09OTl9BQk9SVCwgJmNhbGwtPmV2ZW50cyk7Ci0JCWNsZWFyX2JpdChSWFJQQ19DQUxMX0VWX1JFSkVDVF9CVVNZLCAmY2FsbC0+ZXZlbnRzKTsKLQkJY2xlYXJfYml0KFJYUlBDX0NBTExfRVZfQUJPUlQsICZjYWxsLT5ldmVudHMpOwotCi0JCWVycm9yID0gY2FsbC0+ZXJyb3JfcmVwb3J0OwotCQlpZiAoZXJyb3IgPCBSWFJQQ19MT0NBTF9FUlJPUl9PRkZTRVQpIHsKLQkJCW1hcmsgPSBSWFJQQ19TS0JfTUFSS19ORVRfRVJST1I7Ci0JCQlfZGVidWcoInBvc3QgbmV0IGVycm9yICVkIiwgZXJyb3IpOwotCQl9IGVsc2UgewotCQkJbWFyayA9IFJYUlBDX1NLQl9NQVJLX0xPQ0FMX0VSUk9SOwotCQkJZXJyb3IgLT0gUlhSUENfTE9DQUxfRVJST1JfT0ZGU0VUOwotCQkJX2RlYnVnKCJwb3N0IG5ldCBsb2NhbCBlcnJvciAlZCIsIGVycm9yKTsKLQkJfQotCi0JCWlmIChyeHJwY19wb3N0X21lc3NhZ2UoY2FsbCwgbWFyaywgZXJyb3IsIHRydWUpIDwgMCkKLQkJCWdvdG8gbm9fbWVtOwotCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9FVl9SQ1ZEX0VSUk9SLCAmY2FsbC0+ZXZlbnRzKTsKLQkJZ290byBraWxsX0FDS3M7CisJaWYgKGNhbGwtPnN0YXRlID09IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKKwkJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPnRpbWVyKTsKKwkJZ290byBvdXRfcHV0OwogCX0KIAotCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX0VWX0NPTk5fQUJPUlQsICZjYWxsLT5ldmVudHMpKSB7Ci0JCUFTU0VSVENNUChjYWxsLT5zdGF0ZSwgPiwgUlhSUENfQ0FMTF9DT01QTEVURSk7Ci0KLQkJY2xlYXJfYml0KFJYUlBDX0NBTExfRVZfUkVKRUNUX0JVU1ksICZjYWxsLT5ldmVudHMpOwotCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9FVl9BQk9SVCwgJmNhbGwtPmV2ZW50cyk7Ci0KLQkJX2RlYnVnKCJwb3N0IGNvbm4gYWJvcnQiKTsKLQotCQlpZiAocnhycGNfcG9zdF9tZXNzYWdlKGNhbGwsIFJYUlBDX1NLQl9NQVJLX0xPQ0FMX0VSUk9SLAotCQkJCSAgICAgICBjYWxsLT5jb25uLT5lcnJvciwgdHJ1ZSkgPCAwKQotCQkJZ290byBub19tZW07Ci0JCWNsZWFyX2JpdChSWFJQQ19DQUxMX0VWX0NPTk5fQUJPUlQsICZjYWxsLT5ldmVudHMpOwotCQlnb3RvIGtpbGxfQUNLczsKKwlub3cgPSBrdGltZV9nZXRfcmVhbCgpOworCWlmIChrdGltZV9iZWZvcmUoY2FsbC0+ZXhwaXJlX2F0LCBub3cpKSB7CisJCXJ4cnBjX2Fib3J0X2NhbGwoIkVYUCIsIGNhbGwsIDAsIFJYX0NBTExfVElNRU9VVCwgRVRJTUUpOworCQlzZXRfYml0KFJYUlBDX0NBTExfRVZfQUJPUlQsICZjYWxsLT5ldmVudHMpOworCQlnb3RvIHJlY2hlY2tfc3RhdGU7CiAJfQogCi0JaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfRVZfUkVKRUNUX0JVU1ksICZjYWxsLT5ldmVudHMpKSB7Ci0JCXdoZHIudHlwZSA9IFJYUlBDX1BBQ0tFVF9UWVBFX0JVU1k7Ci0JCWdlbmJpdCA9IFJYUlBDX0NBTExfRVZfUkVKRUNUX0JVU1k7Ci0JCWdvdG8gc2VuZF9tZXNzYWdlOwotCX0KLQotCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX0VWX0FCT1JULCAmY2FsbC0+ZXZlbnRzKSkgewotCQlBU1NFUlRDTVAoY2FsbC0+c3RhdGUsID4sIFJYUlBDX0NBTExfQ09NUExFVEUpOwotCi0JCWlmIChyeHJwY19wb3N0X21lc3NhZ2UoY2FsbCwgUlhSUENfU0tCX01BUktfTE9DQUxfRVJST1IsCi0JCQkJICAgICAgIEVDT05OQUJPUlRFRCwgdHJ1ZSkgPCAwKQotCQkJZ290byBub19tZW07Ci0JCXdoZHIudHlwZSA9IFJYUlBDX1BBQ0tFVF9UWVBFX0FCT1JUOwotCQlkYXRhID0gaHRvbmwoY2FsbC0+bG9jYWxfYWJvcnQpOwotCQlpb3ZbMV0uaW92X2Jhc2UgPSAmZGF0YTsKLQkJaW92WzFdLmlvdl9sZW4gPSBzaXplb2YoZGF0YSk7Ci0JCWdlbmJpdCA9IFJYUlBDX0NBTExfRVZfQUJPUlQ7Ci0JCWdvdG8gc2VuZF9tZXNzYWdlOwotCX0KLQotCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX0VWX0FDS19GSU5BTCwgJmNhbGwtPmV2ZW50cykpIHsKLQkJZ2VuYml0ID0gUlhSUENfQ0FMTF9FVl9BQ0tfRklOQUw7Ci0KLQkJYWNrLmJ1ZmZlclNwYWNlCT0gaHRvbnMoOCk7Ci0JCWFjay5tYXhTa2V3CT0gMDsKLQkJYWNrLnNlcmlhbAk9IDA7Ci0JCWFjay5yZWFzb24JPSBSWFJQQ19BQ0tfSURMRTsKLQkJYWNrLm5BY2tzCT0gMDsKLQkJY2FsbC0+YWNrcl9yZWFzb24gPSAwOwotCi0JCXNwaW5fbG9ja19iaCgmY2FsbC0+bG9jayk7Ci0JCWFjay5zZXJpYWwJPSBodG9ubChjYWxsLT5hY2tyX3NlcmlhbCk7Ci0JCWFjay5wcmV2aW91c1BhY2tldCA9IGh0b25sKGNhbGwtPmFja3JfcHJldl9zZXEpOwotCQlhY2suZmlyc3RQYWNrZXQJPSBodG9ubChjYWxsLT5yeF9kYXRhX2VhdGVuICsgMSk7Ci0JCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKLQotCQlwYWQgPSAwOwotCi0JCWlvdlsxXS5pb3ZfYmFzZSA9ICZhY2s7Ci0JCWlvdlsxXS5pb3ZfbGVuCT0gc2l6ZW9mKGFjayk7Ci0JCWlvdlsyXS5pb3ZfYmFzZSA9ICZwYWQ7Ci0JCWlvdlsyXS5pb3ZfbGVuCT0gMzsKLQkJaW92WzNdLmlvdl9iYXNlID0gJmFja2luZm87Ci0JCWlvdlszXS5pb3ZfbGVuCT0gc2l6ZW9mKGFja2luZm8pOwotCQlnb3RvIHNlbmRfQUNLOwotCX0KLQotCWlmIChjYWxsLT5ldmVudHMgJiAoKDEgPDwgUlhSUENfQ0FMTF9FVl9SQ1ZEX0JVU1kpIHwKLQkJCSAgICAoMSA8PCBSWFJQQ19DQUxMX0VWX1JDVkRfQUJPUlQpKQotCSAgICApIHsKLQkJdTMyIG1hcms7Ci0KLQkJaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfRVZfUkNWRF9BQk9SVCwgJmNhbGwtPmV2ZW50cykpCi0JCQltYXJrID0gUlhSUENfU0tCX01BUktfUkVNT1RFX0FCT1JUOwotCQllbHNlCi0JCQltYXJrID0gUlhSUENfU0tCX01BUktfQlVTWTsKLQotCQlfZGVidWcoInBvc3QgYWJvcnQvYnVzeSIpOwotCQlyeHJwY19jbGVhcl90eF93aW5kb3coY2FsbCk7Ci0JCWlmIChyeHJwY19wb3N0X21lc3NhZ2UoY2FsbCwgbWFyaywgRUNPTk5BQk9SVEVELCB0cnVlKSA8IDApCi0JCQlnb3RvIG5vX21lbTsKLQotCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9FVl9SQ1ZEX0JVU1ksICZjYWxsLT5ldmVudHMpOwotCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9FVl9SQ1ZEX0FCT1JULCAmY2FsbC0+ZXZlbnRzKTsKLQkJZ290byBraWxsX0FDS3M7Ci0JfQotCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSWFJQQ19DQUxMX0VWX1JDVkRfQUNLQUxMLCAmY2FsbC0+ZXZlbnRzKSkgewotCQlfZGVidWcoImRvIGltcGxpY2l0IGFja2FsbCIpOwotCQlyeHJwY19jbGVhcl90eF93aW5kb3coY2FsbCk7Ci0JfQotCi0JaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfRVZfTElGRV9USU1FUiwgJmNhbGwtPmV2ZW50cykpIHsKLQkJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JCWlmIChjYWxsLT5zdGF0ZSA8PSBSWFJQQ19DQUxMX0NPTVBMRVRFKSB7Ci0JCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEOwotCQkJY2FsbC0+bG9jYWxfYWJvcnQgPSBSWF9DQUxMX1RJTUVPVVQ7Ci0JCQlzZXRfYml0KFJYUlBDX0NBTExfRVZfQUJPUlQsICZjYWxsLT5ldmVudHMpOwotCQl9Ci0JCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0KLQkJX2RlYnVnKCJwb3N0IHRpbWVvdXQiKTsKLQkJaWYgKHJ4cnBjX3Bvc3RfbWVzc2FnZShjYWxsLCBSWFJQQ19TS0JfTUFSS19MT0NBTF9FUlJPUiwKLQkJCQkgICAgICAgRVRJTUUsIHRydWUpIDwgMCkKLQkJCWdvdG8gbm9fbWVtOwotCi0JCWNsZWFyX2JpdChSWFJQQ19DQUxMX0VWX0xJRkVfVElNRVIsICZjYWxsLT5ldmVudHMpOwotCQlnb3RvIGtpbGxfQUNLczsKLQl9Ci0KLQkvKiBkZWFsIHdpdGggYXNzb3J0ZWQgaW5ib3VuZCBtZXNzYWdlcyAqLwotCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZjYWxsLT5yeF9xdWV1ZSkpIHsKLQkJc3dpdGNoIChyeHJwY19wcm9jZXNzX3J4X3F1ZXVlKGNhbGwsICZhYm9ydF9jb2RlKSkgewotCQljYXNlIDA6Ci0JCWNhc2UgLUVBR0FJTjoKLQkJCWJyZWFrOwotCQljYXNlIC1FTk9NRU06Ci0JCQlnb3RvIG5vX21lbTsKLQkJY2FzZSAtRUtFWUVYUElSRUQ6Ci0JCWNhc2UgLUVLRVlSRUpFQ1RFRDoKLQkJY2FzZSAtRVBST1RPOgotCQkJcnhycGNfYWJvcnRfY2FsbChjYWxsLCBhYm9ydF9jb2RlKTsKLQkJCWdvdG8ga2lsbF9BQ0tzOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUlhSUENfQ0FMTF9FVl9BQ0ssICZjYWxsLT5ldmVudHMpKSB7CisJCWNhbGwtPmFja19hdCA9IGNhbGwtPmV4cGlyZV9hdDsKKwkJaWYgKGNhbGwtPmFja3JfcmVhc29uKSB7CisJCQlyeHJwY19zZW5kX2NhbGxfcGFja2V0KGNhbGwsIFJYUlBDX1BBQ0tFVF9UWVBFX0FDSyk7CisJCQlnb3RvIHJlY2hlY2tfc3RhdGU7CiAJCX0KIAl9CiAKLQkvKiBoYW5kbGUgcmVzZW5kaW5nICovCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSWFJQQ19DQUxMX0VWX1JFU0VORF9USU1FUiwgJmNhbGwtPmV2ZW50cykpCi0JCXJ4cnBjX3Jlc2VuZF90aW1lcihjYWxsKTsKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJYUlBDX0NBTExfRVZfUkVTRU5ELCAmY2FsbC0+ZXZlbnRzKSkKLQkJcnhycGNfcmVzZW5kKGNhbGwpOwotCi0JLyogY29uc2lkZXIgc2VuZGluZyBhbiBvcmRpbmFyeSBBQ0sgKi8KLQlpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9FVl9BQ0ssICZjYWxsLT5ldmVudHMpKSB7Ci0JCV9kZWJ1Zygic2VuZCBBQ0s6IHdpbmRvdzogJWQgLSAlZCB7ICVseCB9IiwKLQkJICAgICAgIGNhbGwtPnJ4X2RhdGFfZWF0ZW4sIGNhbGwtPmFja3Jfd2luX3RvcCwKLQkJICAgICAgIGNhbGwtPmFja3Jfd2luZG93WzBdKTsKLQotCQlpZiAoY2FsbC0+c3RhdGUgPiBSWFJQQ19DQUxMX1NFUlZFUl9BQ0tfUkVRVUVTVCAmJgotCQkgICAgY2FsbC0+YWNrcl9yZWFzb24gIT0gUlhSUENfQUNLX1BJTkdfUkVTUE9OU0UpIHsKLQkJCS8qIEFDSyBieSBzZW5kaW5nIHJlcGx5IERBVEEgcGFja2V0IGluIHRoaXMgc3RhdGUgKi8KLQkJCWNsZWFyX2JpdChSWFJQQ19DQUxMX0VWX0FDSywgJmNhbGwtPmV2ZW50cyk7Ci0JCQlnb3RvIG1heWJlX3Jlc2NoZWR1bGU7Ci0JCX0KLQotCQlnZW5iaXQgPSBSWFJQQ19DQUxMX0VWX0FDSzsKLQotCQlhY2tzID0ga3phbGxvYyhjYWxsLT5hY2tyX3dpbl90b3AgLSBjYWxsLT5yeF9kYXRhX2VhdGVuLAotCQkJICAgICAgIEdGUF9OT0ZTKTsKLQkJaWYgKCFhY2tzKQotCQkJZ290byBub19tZW07Ci0KLQkJLy9oZHIuZmxhZ3MJPSBSWFJQQ19TTE9XX1NUQVJUX09LOwotCQlhY2suYnVmZmVyU3BhY2UJPSBodG9ucyg4KTsKLQkJYWNrLm1heFNrZXcJPSAwOwotCi0JCXNwaW5fbG9ja19iaCgmY2FsbC0+bG9jayk7Ci0JCWFjay5yZWFzb24JPSBjYWxsLT5hY2tyX3JlYXNvbjsKLQkJYWNrLnNlcmlhbAk9IGh0b25sKGNhbGwtPmFja3Jfc2VyaWFsKTsKLQkJYWNrLnByZXZpb3VzUGFja2V0ID0gaHRvbmwoY2FsbC0+YWNrcl9wcmV2X3NlcSk7Ci0JCWFjay5maXJzdFBhY2tldCA9IGh0b25sKGNhbGwtPnJ4X2RhdGFfZWF0ZW4gKyAxKTsKLQotCQlhY2subkFja3MgPSAwOwotCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgUlhSUENfQUNLUl9XSU5ET1dfQVNaOyBsb29wKyspIHsKLQkJCW5iaXQgPSBsb29wICogQklUU19QRVJfTE9ORzsKLQkJCWZvciAoYml0cyA9IGNhbGwtPmFja3Jfd2luZG93W2xvb3BdOyBiaXRzOyBiaXRzID4+PSAxCi0JCQkgICAgICkgewotCQkJCV9kZWJ1ZygiLSBsPSVkIG49JWQgYj0lbHgiLCBsb29wLCBuYml0LCBiaXRzKTsKLQkJCQlpZiAoYml0cyAmIDEpIHsKLQkJCQkJYWNrc1tuYml0XSA9IFJYUlBDX0FDS19UWVBFX0FDSzsKLQkJCQkJYWNrLm5BY2tzID0gbmJpdCArIDE7Ci0JCQkJfQotCQkJCW5iaXQrKzsKLQkJCX0KLQkJfQotCQljYWxsLT5hY2tyX3JlYXNvbiA9IDA7Ci0JCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKLQotCQlwYWQgPSAwOwotCi0JCWlvdlsxXS5pb3ZfYmFzZSA9ICZhY2s7Ci0JCWlvdlsxXS5pb3ZfbGVuCT0gc2l6ZW9mKGFjayk7Ci0JCWlvdlsyXS5pb3ZfYmFzZSA9IGFja3M7Ci0JCWlvdlsyXS5pb3ZfbGVuCT0gYWNrLm5BY2tzOwotCQlpb3ZbM10uaW92X2Jhc2UgPSAmcGFkOwotCQlpb3ZbM10uaW92X2xlbgk9IDM7Ci0JCWlvdls0XS5pb3ZfYmFzZSA9ICZhY2tpbmZvOwotCQlpb3ZbNF0uaW92X2xlbgk9IHNpemVvZihhY2tpbmZvKTsKLQotCQlzd2l0Y2ggKGFjay5yZWFzb24pIHsKLQkJY2FzZSBSWFJQQ19BQ0tfUkVRVUVTVEVEOgotCQljYXNlIFJYUlBDX0FDS19EVVBMSUNBVEU6Ci0JCWNhc2UgUlhSUENfQUNLX09VVF9PRl9TRVFVRU5DRToKLQkJY2FzZSBSWFJQQ19BQ0tfRVhDRUVEU19XSU5ET1c6Ci0JCWNhc2UgUlhSUENfQUNLX05PU1BBQ0U6Ci0JCWNhc2UgUlhSUENfQUNLX1BJTkc6Ci0JCWNhc2UgUlhSUENfQUNLX1BJTkdfUkVTUE9OU0U6Ci0JCQlnb3RvIHNlbmRfQUNLX3dpdGhfc2tldzsKLQkJY2FzZSBSWFJQQ19BQ0tfREVMQVk6Ci0JCWNhc2UgUlhSUENfQUNLX0lETEU6Ci0JCQlnb3RvIHNlbmRfQUNLOwotCQl9CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSWFJQQ19DQUxMX0VWX1JFU0VORCwgJmNhbGwtPmV2ZW50cykpIHsKKwkJcnhycGNfcmVzZW5kKGNhbGwsIG5vdyk7CisJCWdvdG8gcmVjaGVja19zdGF0ZTsKIAl9CiAKLQkvKiBoYW5kbGUgY29tcGxldGlvbiBvZiBzZWN1cml0eSBuZWdvdGlhdGlvbnMgb24gYW4gaW5jb21pbmcKLQkgKiBjb25uZWN0aW9uICovCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSWFJQQ19DQUxMX0VWX1NFQ1VSRUQsICZjYWxsLT5ldmVudHMpKSB7Ci0JCV9kZWJ1Zygic2VjdXJlZCIpOwotCQlzcGluX2xvY2tfYmgoJmNhbGwtPmxvY2spOwotCi0JCWlmIChjYWxsLT5zdGF0ZSA9PSBSWFJQQ19DQUxMX1NFUlZFUl9TRUNVUklORykgewotCQkJX2RlYnVnKCJzZWN1cmluZyIpOwotCQkJd3JpdGVfbG9jaygmY2FsbC0+c29ja2V0LT5jYWxsX2xvY2spOwotCQkJaWYgKCF0ZXN0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0VELCAmY2FsbC0+ZmxhZ3MpICYmCi0JCQkgICAgIXRlc3RfYml0KFJYUlBDX0NBTExfRVZfUkVMRUFTRSwgJmNhbGwtPmV2ZW50cykpIHsKLQkJCQlfZGVidWcoIm5vdCByZWxlYXNlZCIpOwotCQkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9TRVJWRVJfQUNDRVBUSU5HOwotCQkJCWxpc3RfbW92ZV90YWlsKCZjYWxsLT5hY2NlcHRfbGluaywKLQkJCQkJICAgICAgICZjYWxsLT5zb2NrZXQtPmFjY2VwdHEpOwotCQkJfQotCQkJd3JpdGVfdW5sb2NrKCZjYWxsLT5zb2NrZXQtPmNhbGxfbG9jayk7Ci0JCQlyZWFkX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOwotCQkJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSkKLQkJCQlzZXRfYml0KFJYUlBDX0NBTExfRVZfUE9TVF9BQ0NFUFQsICZjYWxsLT5ldmVudHMpOwotCQkJcmVhZF91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOwotCQl9Ci0KLQkJc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmxvY2spOwotCQlpZiAoIXRlc3RfYml0KFJYUlBDX0NBTExfRVZfUE9TVF9BQ0NFUFQsICZjYWxsLT5ldmVudHMpKQotCQkJZ290byBtYXliZV9yZXNjaGVkdWxlOwotCX0KLQotCS8qIHBvc3QgYSBub3RpZmljYXRpb24gb2YgYW4gYWNjZXB0YWJsZSBjb25uZWN0aW9uIHRvIHRoZSBhcHAgKi8KLQlpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9FVl9QT1NUX0FDQ0VQVCwgJmNhbGwtPmV2ZW50cykpIHsKLQkJX2RlYnVnKCJwb3N0IGFjY2VwdCIpOwotCQlpZiAocnhycGNfcG9zdF9tZXNzYWdlKGNhbGwsIFJYUlBDX1NLQl9NQVJLX05FV19DQUxMLAotCQkJCSAgICAgICAwLCBmYWxzZSkgPCAwKQotCQkJZ290byBub19tZW07Ci0JCWNsZWFyX2JpdChSWFJQQ19DQUxMX0VWX1BPU1RfQUNDRVBULCAmY2FsbC0+ZXZlbnRzKTsKLQkJZ290byBtYXliZV9yZXNjaGVkdWxlOwotCX0KLQotCS8qIGhhbmRsZSBpbmNvbWluZyBjYWxsIGFjY2VwdGFuY2UgKi8KLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJYUlBDX0NBTExfRVZfQUNDRVBURUQsICZjYWxsLT5ldmVudHMpKSB7Ci0JCV9kZWJ1ZygiYWNjZXB0ZWQiKTsKLQkJQVNTRVJUQ01QKGNhbGwtPnJ4X2RhdGFfcG9zdCwgPT0sIDApOwotCQljYWxsLT5yeF9kYXRhX3Bvc3QgPSAxOwotCQlyZWFkX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCQlpZiAoY2FsbC0+c3RhdGUgPCBSWFJQQ19DQUxMX0NPTVBMRVRFKQotCQkJc2V0X2JpdChSWFJQQ19DQUxMX0VWX0RSQUlOX1JYX09PUywgJmNhbGwtPmV2ZW50cyk7Ci0JCXJlYWRfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQl9Ci0KLQkvKiBkcmFpbiB0aGUgb3V0IG9mIHNlcXVlbmNlIHJlY2VpdmVkIHBhY2tldCBxdWV1ZSBpbnRvIHRoZSBwYWNrZXQgUngKLQkgKiBxdWV1ZSAqLwotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUlhSUENfQ0FMTF9FVl9EUkFJTl9SWF9PT1MsICZjYWxsLT5ldmVudHMpKSB7Ci0JCXdoaWxlIChjYWxsLT5yeF9kYXRhX3Bvc3QgPT0gY2FsbC0+cnhfZmlyc3Rfb29zKQotCQkJaWYgKHJ4cnBjX2RyYWluX3J4X29vc19xdWV1ZShjYWxsKSA8IDApCi0JCQkJYnJlYWs7Ci0JCWdvdG8gbWF5YmVfcmVzY2hlZHVsZTsKLQl9Ci0KLQlpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9FVl9SRUxFQVNFLCAmY2FsbC0+ZXZlbnRzKSkgewotCQlyeHJwY19yZWxlYXNlX2NhbGwoY2FsbCk7Ci0JCWNsZWFyX2JpdChSWFJQQ19DQUxMX0VWX1JFTEVBU0UsICZjYWxsLT5ldmVudHMpOwotCX0KKwlyeHJwY19zZXRfdGltZXIoY2FsbCwgcnhycGNfdGltZXJfc2V0X2Zvcl9yZXNlbmQsIG5vdyk7CiAKIAkvKiBvdGhlciBldmVudHMgbWF5IGhhdmUgYmVlbiByYWlzZWQgc2luY2Ugd2Ugc3RhcnRlZCBjaGVja2luZyAqLwotCWdvdG8gbWF5YmVfcmVzY2hlZHVsZTsKLQotc2VuZF9BQ0tfd2l0aF9za2V3OgotCWFjay5tYXhTa2V3ID0gaHRvbnMoYXRvbWljX3JlYWQoJmNhbGwtPmNvbm4tPmhpX3NlcmlhbCkgLQotCQkJICAgIG50b2hsKGFjay5zZXJpYWwpKTsKLXNlbmRfQUNLOgotCW10dSA9IGNhbGwtPmNvbm4tPnBhcmFtcy5wZWVyLT5pZl9tdHU7Ci0JbXR1IC09IGNhbGwtPmNvbm4tPnBhcmFtcy5wZWVyLT5oZHJzaXplOwotCWFja2luZm8ubWF4TVRVCT0gaHRvbmwobXR1KTsKLQlhY2tpbmZvLnJ3aW5kCT0gaHRvbmwocnhycGNfcnhfd2luZG93X3NpemUpOwotCi0JLyogcGVybWl0IHRoZSBwZWVyIHRvIHNlbmQgdXMganVtYm8gcGFja2V0cyBpZiBpdCB3YW50cyB0byAqLwotCWFja2luZm8ucnhNVFUJPSBodG9ubChyeHJwY19yeF9tdHUpOwotCWFja2luZm8uanVtYm9fbWF4ID0gaHRvbmwocnhycGNfcnhfanVtYm9fbWF4KTsKLQotCXNlcmlhbCA9IGF0b21pY19pbmNfcmV0dXJuKCZjYWxsLT5jb25uLT5zZXJpYWwpOwotCXdoZHIuc2VyaWFsID0gaHRvbmwoc2VyaWFsKTsKLQlfcHJvdG8oIlR4IEFDSyAlJSV1IHsgbT0laHUgZj0jJXUgcD0jJXUgcz0lJSV1IHI9JXMgbj0ldSB9IiwKLQkgICAgICAgc2VyaWFsLAotCSAgICAgICBudG9ocyhhY2subWF4U2tldyksCi0JICAgICAgIG50b2hsKGFjay5maXJzdFBhY2tldCksCi0JICAgICAgIG50b2hsKGFjay5wcmV2aW91c1BhY2tldCksCi0JICAgICAgIG50b2hsKGFjay5zZXJpYWwpLAotCSAgICAgICByeHJwY19hY2tzKGFjay5yZWFzb24pLAotCSAgICAgICBhY2subkFja3MpOwotCi0JZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja190aW1lcik7Ci0JaWYgKGFjay5uQWNrcyA+IDApCi0JCXNldF9iaXQoUlhSUENfQ0FMTF9UWF9TT0ZUX0FDSywgJmNhbGwtPmZsYWdzKTsKLQlnb3RvIHNlbmRfbWVzc2FnZV8yOwotCi1zZW5kX21lc3NhZ2U6Ci0JX2RlYnVnKCJzZW5kIG1lc3NhZ2UiKTsKLQotCXNlcmlhbCA9IGF0b21pY19pbmNfcmV0dXJuKCZjYWxsLT5jb25uLT5zZXJpYWwpOwotCXdoZHIuc2VyaWFsID0gaHRvbmwoc2VyaWFsKTsKLQlfcHJvdG8oIlR4ICVzICUlJXUiLCByeHJwY19wa3RzW3doZHIudHlwZV0sIHNlcmlhbCk7Ci1zZW5kX21lc3NhZ2VfMjoKLQotCWxlbiA9IGlvdlswXS5pb3ZfbGVuOwotCWlvYyA9IDE7Ci0JaWYgKGlvdls0XS5pb3ZfbGVuKSB7Ci0JCWlvYyA9IDU7Ci0JCWxlbiArPSBpb3ZbNF0uaW92X2xlbjsKLQkJbGVuICs9IGlvdlszXS5pb3ZfbGVuOwotCQlsZW4gKz0gaW92WzJdLmlvdl9sZW47Ci0JCWxlbiArPSBpb3ZbMV0uaW92X2xlbjsKLQl9IGVsc2UgaWYgKGlvdlszXS5pb3ZfbGVuKSB7Ci0JCWlvYyA9IDQ7Ci0JCWxlbiArPSBpb3ZbM10uaW92X2xlbjsKLQkJbGVuICs9IGlvdlsyXS5pb3ZfbGVuOwotCQlsZW4gKz0gaW92WzFdLmlvdl9sZW47Ci0JfSBlbHNlIGlmIChpb3ZbMl0uaW92X2xlbikgewotCQlpb2MgPSAzOwotCQlsZW4gKz0gaW92WzJdLmlvdl9sZW47Ci0JCWxlbiArPSBpb3ZbMV0uaW92X2xlbjsKLQl9IGVsc2UgaWYgKGlvdlsxXS5pb3ZfbGVuKSB7Ci0JCWlvYyA9IDI7Ci0JCWxlbiArPSBpb3ZbMV0uaW92X2xlbjsKKwlpZiAoY2FsbC0+ZXZlbnRzICYmIGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSkgeworCQlfX3J4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7CisJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IGtlcm5lbF9zZW5kbXNnKGNhbGwtPmNvbm4tPnBhcmFtcy5sb2NhbC0+c29ja2V0LAotCQkJICAgICAmbXNnLCBpb3YsIGlvYywgbGVuKTsKLQlpZiAocmV0IDwgMCkgewotCQlfZGVidWcoInNlbmRtc2cgZmFpbGVkOiAlZCIsIHJldCk7Ci0JCXJlYWRfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfREVBRCkKLQkJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7Ci0JCXJlYWRfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlzd2l0Y2ggKGdlbmJpdCkgewotCWNhc2UgUlhSUENfQ0FMTF9FVl9BQk9SVDoKLQkJY2xlYXJfYml0KGdlbmJpdCwgJmNhbGwtPmV2ZW50cyk7Ci0JCWNsZWFyX2JpdChSWFJQQ19DQUxMX0VWX1JDVkRfQUJPUlQsICZjYWxsLT5ldmVudHMpOwotCQlnb3RvIGtpbGxfQUNLczsKLQotCWNhc2UgUlhSUENfQ0FMTF9FVl9BQ0tfRklOQUw6Ci0JCXdyaXRlX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCQlpZiAoY2FsbC0+c3RhdGUgPT0gUlhSUENfQ0FMTF9DTElFTlRfRklOQUxfQUNLKQotCQkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX0NPTVBMRVRFOwotCQl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCQlnb3RvIGtpbGxfQUNLczsKLQotCWRlZmF1bHQ6Ci0JCWNsZWFyX2JpdChnZW5iaXQsICZjYWxsLT5ldmVudHMpOwotCQlzd2l0Y2ggKGNhbGwtPnN0YXRlKSB7Ci0JCWNhc2UgUlhSUENfQ0FMTF9DTElFTlRfQVdBSVRfUkVQTFk6Ci0JCWNhc2UgUlhSUENfQ0FMTF9DTElFTlRfUkVDVl9SRVBMWToKLQkJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9SRUNWX1JFUVVFU1Q6Ci0JCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfQUNLX1JFUVVFU1Q6Ci0JCQlfZGVidWcoInN0YXJ0IEFDSyB0aW1lciIpOwotCQkJcnhycGNfcHJvcG9zZV9BQ0soY2FsbCwgUlhSUENfQUNLX0RFTEFZLAotCQkJCQkgIGNhbGwtPmFja3Jfc2VyaWFsLCBmYWxzZSk7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCQlnb3RvIG1heWJlX3Jlc2NoZWR1bGU7Ci0JfQotCi1raWxsX0FDS3M6Ci0JZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja190aW1lcik7Ci0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSWFJQQ19DQUxMX0VWX0FDS19GSU5BTCwgJmNhbGwtPmV2ZW50cykpCi0JCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotCWNsZWFyX2JpdChSWFJQQ19DQUxMX0VWX0FDSywgJmNhbGwtPmV2ZW50cyk7Ci0KLW1heWJlX3Jlc2NoZWR1bGU6Ci0JaWYgKGNhbGwtPmV2ZW50cyB8fCAhc2tiX3F1ZXVlX2VtcHR5KCZjYWxsLT5yeF9xdWV1ZSkpIHsKLQkJcmVhZF9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQkJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9ERUFEKQotCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQkJcmVhZF91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCX0KLQotCS8qIGRvbid0IGxlYXZlIGFib3J0ZWQgY29ubmVjdGlvbnMgb24gdGhlIGFjY2VwdCBxdWV1ZSAqLwotCWlmIChjYWxsLT5zdGF0ZSA+PSBSWFJQQ19DQUxMX0NPTVBMRVRFICYmCi0JICAgICFsaXN0X2VtcHR5KCZjYWxsLT5hY2NlcHRfbGluaykpIHsKLQkJX2RlYnVnKCJYIHVubGlua2luZyBvbmNlLXBlbmRpbmcgY2FsbCAlcCB7IGU9JWx4IGY9JWx4IGM9JXggfSIsCi0JCSAgICAgICBjYWxsLCBjYWxsLT5ldmVudHMsIGNhbGwtPmZsYWdzLCBjYWxsLT5jb25uLT5wcm90by5jaWQpOwotCi0JCXJlYWRfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JCWlmICghdGVzdF9iaXQoUlhSUENfQ0FMTF9SRUxFQVNFRCwgJmNhbGwtPmZsYWdzKSAmJgotCQkgICAgIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FVl9SRUxFQVNFLCAmY2FsbC0+ZXZlbnRzKSkKLQkJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7Ci0JCXJlYWRfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQl9Ci0KLWVycm9yOgotCWNsZWFyX2JpdChSWFJQQ19DQUxMX1BST0NfQlVTWSwgJmNhbGwtPmZsYWdzKTsKLQlrZnJlZShhY2tzKTsKLQotCS8qIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0d28gQ1BVcyBib3RoIHByb2Nlc3NpbmcgdGhlIHdvcmsgaXRlbSBmb3Igb25lCi0JICogY2FsbCBhdCB0aGUgc2FtZSB0aW1lLCB3ZSB1c2UgYSBmbGFnIHRvIG5vdGUgd2hlbiBpdCdzIGJ1c3k7IGhvd2V2ZXIKLQkgKiB0aGlzIG1lYW5zIHRoZXJlJ3MgYSByYWNlIGJldHdlZW4gY2xlYXJpbmcgdGhlIGZsYWcgYW5kIHNldHRpbmcgdGhlCi0JICogd29yayBwZW5kaW5nIGJpdCBhbmQgdGhlIHdvcmsgaXRlbSBiZWluZyBwcm9jZXNzZWQgYWdhaW4gKi8KLQlpZiAoY2FsbC0+ZXZlbnRzICYmICF3b3JrX3BlbmRpbmcoJmNhbGwtPnByb2Nlc3NvcikpIHsKLQkJX2RlYnVnKCJqdW1wc3RhcnQgJXgiLCBjYWxsLT5jb25uLT5wcm90by5jaWQpOwotCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOwotCX0KLQorb3V0X3B1dDoKKwlyeHJwY19wdXRfY2FsbChjYWxsLCByeHJwY19jYWxsX3B1dCk7CitvdXQ6CiAJX2xlYXZlKCIiKTsKLQlyZXR1cm47Ci0KLW5vX21lbToKLQlfZGVidWcoIm91dCBvZiBtZW1vcnkiKTsKLQlnb3RvIG1heWJlX3Jlc2NoZWR1bGU7CiB9CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvY2FsbF9vYmplY3QuYyBiL25ldC9yeHJwYy9jYWxsX29iamVjdC5jCmluZGV4IDkxMjg3YzkuLjM2NGI0MmQgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9jYWxsX29iamVjdC5jCisrKyBiL25ldC9yeHJwYy9jYWxsX29iamVjdC5jCkBAIC0xOSwyMyArMTksMTMgQEAKICNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KICNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgogCi0vKgotICogTWF4aW11bSBsaWZldGltZSBvZiBhIGNhbGwgKGluIGppZmZpZXMpLgotICovCi11bnNpZ25lZCBpbnQgcnhycGNfbWF4X2NhbGxfbGlmZXRpbWUgPSA2MCAqIEhaOwotCi0vKgotICogVGltZSB0aWxsIGRlYWQgY2FsbCBleHBpcmVzIGFmdGVyIGxhc3QgdXNlIChpbiBqaWZmaWVzKS4KLSAqLwotdW5zaWduZWQgaW50IHJ4cnBjX2RlYWRfY2FsbF9leHBpcnkgPSAyICogSFo7Ci0KIGNvbnN0IGNoYXIgKmNvbnN0IHJ4cnBjX2NhbGxfc3RhdGVzW05SX19SWFJQQ19DQUxMX1NUQVRFU10gPSB7Ci0JW1JYUlBDX0NBTExfVU5JTklUSUFMSVNFRF0JCT0gIlVuaW5pdCIsCisJW1JYUlBDX0NBTExfVU5JTklUSUFMSVNFRF0JCT0gIlVuaW5pdCAgIiwKIAlbUlhSUENfQ0FMTF9DTElFTlRfQVdBSVRfQ09OTl0JCT0gIkNsV3RDb25uIiwKIAlbUlhSUENfQ0FMTF9DTElFTlRfU0VORF9SRVFVRVNUXQk9ICJDbFNuZFJlcSIsCiAJW1JYUlBDX0NBTExfQ0xJRU5UX0FXQUlUX1JFUExZXQkJPSAiQ2xBd3RScGwiLAogCVtSWFJQQ19DQUxMX0NMSUVOVF9SRUNWX1JFUExZXQkJPSAiQ2xSY3ZScGwiLAotCVtSWFJQQ19DQUxMX0NMSUVOVF9GSU5BTF9BQ0tdCQk9ICJDbEZubEFDSyIsCisJW1JYUlBDX0NBTExfU0VSVkVSX1BSRUFMTE9DXQkJPSAiU3ZQcmVhbGMiLAogCVtSWFJQQ19DQUxMX1NFUlZFUl9TRUNVUklOR10JCT0gIlN2U2VjdXJlIiwKIAlbUlhSUENfQ0FMTF9TRVJWRVJfQUNDRVBUSU5HXQkJPSAiU3ZBY2NlcHQiLAogCVtSWFJQQ19DQUxMX1NFUlZFUl9SRUNWX1JFUVVFU1RdCT0gIlN2UmN2UmVxIiwKQEAgLTQzLDIyICszMyw0NyBAQAogCVtSWFJQQ19DQUxMX1NFUlZFUl9TRU5EX1JFUExZXQkJPSAiU3ZTbmRScGwiLAogCVtSWFJQQ19DQUxMX1NFUlZFUl9BV0FJVF9BQ0tdCQk9ICJTdkF3dEFDSyIsCiAJW1JYUlBDX0NBTExfQ09NUExFVEVdCQkJPSAiQ29tcGxldGUiLAotCVtSWFJQQ19DQUxMX1NFUlZFUl9CVVNZXQkJPSAiU3ZCdXN5ICAiLAorfTsKKworY29uc3QgY2hhciAqY29uc3QgcnhycGNfY2FsbF9jb21wbGV0aW9uc1tOUl9fUlhSUENfQ0FMTF9DT01QTEVUSU9OU10gPSB7CisJW1JYUlBDX0NBTExfU1VDQ0VFREVEXQkJCT0gIkNvbXBsZXRlIiwKIAlbUlhSUENfQ0FMTF9SRU1PVEVMWV9BQk9SVEVEXQkJPSAiUm10QWJvcnQiLAogCVtSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRF0JCT0gIkxvY0Fib3J0IiwKKwlbUlhSUENfQ0FMTF9MT0NBTF9FUlJPUl0JCT0gIkxvY0Vycm9yIiwKIAlbUlhSUENfQ0FMTF9ORVRXT1JLX0VSUk9SXQkJPSAiTmV0RXJyb3IiLAotCVtSWFJQQ19DQUxMX0RFQURdCQkJPSAiRGVhZCAgICAiLAorfTsKKworY29uc3QgY2hhciByeHJwY19jYWxsX3RyYWNlc1tyeHJwY19jYWxsX19ucl90cmFjZV1bNF0gPSB7CisJW3J4cnBjX2NhbGxfbmV3X2NsaWVudF0JCT0gIk5XYyIsCisJW3J4cnBjX2NhbGxfbmV3X3NlcnZpY2VdCT0gIk5XcyIsCisJW3J4cnBjX2NhbGxfcXVldWVkXQkJPSAiUVVFIiwKKwlbcnhycGNfY2FsbF9xdWV1ZWRfcmVmXQkJPSAiUVVSIiwKKwlbcnhycGNfY2FsbF9jb25uZWN0ZWRdCQk9ICJDT04iLAorCVtyeHJwY19jYWxsX3JlbGVhc2VdCQk9ICJSTFMiLAorCVtyeHJwY19jYWxsX3NlZW5dCQk9ICJTRUUiLAorCVtyeHJwY19jYWxsX2dvdF0JCT0gIkdPVCIsCisJW3J4cnBjX2NhbGxfZ290X3VzZXJpZF0JCT0gIkd1cyIsCisJW3J4cnBjX2NhbGxfZ290X2tlcm5lbF0JCT0gIkdrZSIsCisJW3J4cnBjX2NhbGxfcHV0XQkJPSAiUFVUIiwKKwlbcnhycGNfY2FsbF9wdXRfdXNlcmlkXQkJPSAiUHVzIiwKKwlbcnhycGNfY2FsbF9wdXRfa2VybmVsXQkJPSAiUGtlIiwKKwlbcnhycGNfY2FsbF9wdXRfbm9xdWV1ZV0JPSAiUE5RIiwKKwlbcnhycGNfY2FsbF9lcnJvcl0JCT0gIipFKiIsCiB9OwogCiBzdHJ1Y3Qga21lbV9jYWNoZSAqcnhycGNfY2FsbF9qYXI7CiBMSVNUX0hFQUQocnhycGNfY2FsbHMpOwogREVGSU5FX1JXTE9DSyhyeHJwY19jYWxsX2xvY2spOwogCi1zdGF0aWMgdm9pZCByeHJwY19kZXN0cm95X2NhbGwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLXN0YXRpYyB2b2lkIHJ4cnBjX2NhbGxfbGlmZV9leHBpcmVkKHVuc2lnbmVkIGxvbmcgX2NhbGwpOwotc3RhdGljIHZvaWQgcnhycGNfZGVhZF9jYWxsX2V4cGlyZWQodW5zaWduZWQgbG9uZyBfY2FsbCk7Ci1zdGF0aWMgdm9pZCByeHJwY19hY2tfdGltZV9leHBpcmVkKHVuc2lnbmVkIGxvbmcgX2NhbGwpOwotc3RhdGljIHZvaWQgcnhycGNfcmVzZW5kX3RpbWVfZXhwaXJlZCh1bnNpZ25lZCBsb25nIF9jYWxsKTsKK3N0YXRpYyB2b2lkIHJ4cnBjX2NhbGxfdGltZXJfZXhwaXJlZCh1bnNpZ25lZCBsb25nIF9jYWxsKQoreworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsID0gKHN0cnVjdCByeHJwY19jYWxsICopX2NhbGw7CisKKwlfZW50ZXIoIiVkIiwgY2FsbC0+ZGVidWdfaWQpOworCisJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSkKKwkJcnhycGNfc2V0X3RpbWVyKGNhbGwsIHJ4cnBjX3RpbWVyX2V4cGlyZWQsIGt0aW1lX2dldF9yZWFsKCkpOworfQogCiAvKgogICogZmluZCBhbiBleHRhbnQgc2VydmVyIGNhbGwKQEAgLTkxLDcgKzEwNiw3IEBACiAJcmV0dXJuIE5VTEw7CiAKIGZvdW5kX2V4dGFudF9jYWxsOgotCXJ4cnBjX2dldF9jYWxsKGNhbGwpOworCXJ4cnBjX2dldF9jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfZ290KTsKIAlyZWFkX3VubG9jaygmcngtPmNhbGxfbG9jayk7CiAJX2xlYXZlKCIgPSAlcCBbJWRdIiwgY2FsbCwgYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKSk7CiAJcmV0dXJuIGNhbGw7CkBAIC0xMDAsNyArMTE1LDcgQEAKIC8qCiAgKiBhbGxvY2F0ZSBhIG5ldyBjYWxsCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfYWxsb2NfY2FsbChnZnBfdCBnZnApCitzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfYWxsb2NfY2FsbChnZnBfdCBnZnApCiB7CiAJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7CiAKQEAgLTEwOCwyOSArMTIzLDI1IEBACiAJaWYgKCFjYWxsKQogCQlyZXR1cm4gTlVMTDsKIAotCWNhbGwtPmFja3Nfd2luc3ogPSAxNjsKLQljYWxsLT5hY2tzX3dpbmRvdyA9IGttYWxsb2MoY2FsbC0+YWNrc193aW5zeiAqIHNpemVvZih1bnNpZ25lZCBsb25nKSwKKwljYWxsLT5yeHR4X2J1ZmZlciA9IGtjYWxsb2MoUlhSUENfUlhUWF9CVUZGX1NJWkUsCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2tfYnVmZiAqKSwKIAkJCQkgICAgZ2ZwKTsKLQlpZiAoIWNhbGwtPmFja3Nfd2luZG93KSB7Ci0JCWttZW1fY2FjaGVfZnJlZShyeHJwY19jYWxsX2phciwgY2FsbCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKwlpZiAoIWNhbGwtPnJ4dHhfYnVmZmVyKQorCQlnb3RvIG5vbWVtOwogCi0Jc2V0dXBfdGltZXIoJmNhbGwtPmxpZmV0aW1lciwgJnJ4cnBjX2NhbGxfbGlmZV9leHBpcmVkLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpIGNhbGwpOwotCXNldHVwX3RpbWVyKCZjYWxsLT5kZWFkc3BhbiwgJnJ4cnBjX2RlYWRfY2FsbF9leHBpcmVkLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpIGNhbGwpOwotCXNldHVwX3RpbWVyKCZjYWxsLT5hY2tfdGltZXIsICZyeHJwY19hY2tfdGltZV9leHBpcmVkLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpIGNhbGwpOwotCXNldHVwX3RpbWVyKCZjYWxsLT5yZXNlbmRfdGltZXIsICZyeHJwY19yZXNlbmRfdGltZV9leHBpcmVkLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpIGNhbGwpOwotCUlOSVRfV09SSygmY2FsbC0+ZGVzdHJveWVyLCAmcnhycGNfZGVzdHJveV9jYWxsKTsKKwljYWxsLT5yeHR4X2Fubm90YXRpb25zID0ga2NhbGxvYyhSWFJQQ19SWFRYX0JVRkZfU0laRSwgc2l6ZW9mKHU4KSwgZ2ZwKTsKKwlpZiAoIWNhbGwtPnJ4dHhfYW5ub3RhdGlvbnMpCisJCWdvdG8gbm9tZW1fMjsKKworCXNldHVwX3RpbWVyKCZjYWxsLT50aW1lciwgcnhycGNfY2FsbF90aW1lcl9leHBpcmVkLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpY2FsbCk7CiAJSU5JVF9XT1JLKCZjYWxsLT5wcm9jZXNzb3IsICZyeHJwY19wcm9jZXNzX2NhbGwpOwogCUlOSVRfTElTVF9IRUFEKCZjYWxsLT5saW5rKTsKKwlJTklUX0xJU1RfSEVBRCgmY2FsbC0+Y2hhbl93YWl0X2xpbmspOwogCUlOSVRfTElTVF9IRUFEKCZjYWxsLT5hY2NlcHRfbGluayk7Ci0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmY2FsbC0+cnhfcXVldWUpOwotCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNhbGwtPnJ4X29vc19xdWV1ZSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmY2FsbC0+dHhfd2FpdHEpOworCUlOSVRfTElTVF9IRUFEKCZjYWxsLT5yZWN2bXNnX2xpbmspOworCUlOSVRfTElTVF9IRUFEKCZjYWxsLT5zb2NrX2xpbmspOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhbGwtPndhaXRxKTsKIAlzcGluX2xvY2tfaW5pdCgmY2FsbC0+bG9jayk7CiAJcndsb2NrX2luaXQoJmNhbGwtPnN0YXRlX2xvY2spOwogCWF0b21pY19zZXQoJmNhbGwtPnVzYWdlLCAxKTsKQEAgLTEzOCw3MCArMTQ5LDY1IEBACiAKIAltZW1zZXQoJmNhbGwtPnNvY2tfbm9kZSwgMHhlZCwgc2l6ZW9mKGNhbGwtPnNvY2tfbm9kZSkpOwogCi0JY2FsbC0+cnhfZGF0YV9leHBlY3QgPSAxOwotCWNhbGwtPnJ4X2RhdGFfZWF0ZW4gPSAwOwotCWNhbGwtPnJ4X2ZpcnN0X29vcyA9IDA7Ci0JY2FsbC0+YWNrcl93aW5fdG9wID0gY2FsbC0+cnhfZGF0YV9lYXRlbiArIDEgKyByeHJwY19yeF93aW5kb3dfc2l6ZTsKLQljYWxsLT5jcmVhdGlvbl9qaWYgPSBqaWZmaWVzOworCS8qIExlYXZlIHNwYWNlIGluIHRoZSByaW5nIHRvIGhhbmRsZSBhIG1heGVkLW91dCBqdW1ibyBwYWNrZXQgKi8KKwljYWxsLT5yeF93aW5zaXplID0gcnhycGNfcnhfd2luZG93X3NpemU7CisJY2FsbC0+dHhfd2luc2l6ZSA9IDE2OworCWNhbGwtPnJ4X2V4cGVjdF9uZXh0ID0gMTsKKworCWlmIChSWFJQQ19UWF9TTVNTID4gMjE5MCkKKwkJY2FsbC0+Y29uZ19jd25kID0gMjsKKwllbHNlIGlmIChSWFJQQ19UWF9TTVNTID4gMTA5NSkKKwkJY2FsbC0+Y29uZ19jd25kID0gMzsKKwllbHNlCisJCWNhbGwtPmNvbmdfY3duZCA9IDQ7CisJY2FsbC0+Y29uZ19zc3RocmVzaCA9IFJYUlBDX1JYVFhfQlVGRl9TSVpFIC0gMTsKIAlyZXR1cm4gY2FsbDsKKworbm9tZW1fMjoKKwlrZnJlZShjYWxsLT5yeHR4X2J1ZmZlcik7Citub21lbToKKwlrbWVtX2NhY2hlX2ZyZWUocnhycGNfY2FsbF9qYXIsIGNhbGwpOworCXJldHVybiBOVUxMOwogfQogCiAvKgogICogQWxsb2NhdGUgYSBuZXcgY2xpZW50IGNhbGwuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfYWxsb2NfY2xpZW50X2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAotCQkJCQkJICBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKnNyeCwKK3N0YXRpYyBzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfYWxsb2NfY2xpZW50X2NhbGwoc3RydWN0IHNvY2thZGRyX3J4cnBjICpzcngsCiAJCQkJCQkgIGdmcF90IGdmcCkKIHsKIAlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKwlrdGltZV90IG5vdzsKIAogCV9lbnRlcigiIik7CiAKLQlBU1NFUlQocngtPmxvY2FsICE9IE5VTEwpOwotCiAJY2FsbCA9IHJ4cnBjX2FsbG9jX2NhbGwoZ2ZwKTsKIAlpZiAoIWNhbGwpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9DTElFTlRfQVdBSVRfQ09OTjsKLQotCXNvY2tfaG9sZCgmcngtPnNrKTsKLQljYWxsLT5zb2NrZXQgPSByeDsKLQljYWxsLT5yeF9kYXRhX3Bvc3QgPSAxOwotCi0JY2FsbC0+bG9jYWwgPSByeC0+bG9jYWw7CiAJY2FsbC0+c2VydmljZV9pZCA9IHNyeC0+c3J4X3NlcnZpY2U7Ci0JY2FsbC0+aW5fY2xpZW50ZmxhZyA9IDA7CisJY2FsbC0+dHhfcGhhc2UgPSB0cnVlOworCW5vdyA9IGt0aW1lX2dldF9yZWFsKCk7CisJY2FsbC0+YWNrc19sYXRlc3RfdHMgPSBub3c7CisJY2FsbC0+Y29uZ190c3RhbXAgPSBub3c7CiAKIAlfbGVhdmUoIiA9ICVwIiwgY2FsbCk7CiAJcmV0dXJuIGNhbGw7CiB9CiAKIC8qCi0gKiBCZWdpbiBjbGllbnQgY2FsbC4KKyAqIEluaXRpYXRlIHRoZSBjYWxsIGFjay9yZXNlbmQvZXhwaXJ5IHRpbWVyLgogICovCi1zdGF0aWMgaW50IHJ4cnBjX2JlZ2luX2NsaWVudF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkJCSAgIHN0cnVjdCByeHJwY19jb25uX3BhcmFtZXRlcnMgKmNwLAotCQkJCSAgIHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqc3J4LAotCQkJCSAgIGdmcF90IGdmcCkKK3N0YXRpYyB2b2lkIHJ4cnBjX3N0YXJ0X2NhbGxfdGltZXIoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCiB7Ci0JaW50IHJldDsKKwlrdGltZV90IG5vdyA9IGt0aW1lX2dldF9yZWFsKCksIGV4cGlyZV9hdDsKIAotCS8qIFNldCB1cCBvciBnZXQgYSBjb25uZWN0aW9uIHJlY29yZCBhbmQgc2V0IHRoZSBwcm90b2NvbCBwYXJhbWV0ZXJzLAotCSAqIGluY2x1ZGluZyBjaGFubmVsIG51bWJlciBhbmQgY2FsbCBJRC4KLQkgKi8KLQlyZXQgPSByeHJwY19jb25uZWN0X2NhbGwoY2FsbCwgY3AsIHNyeCwgZ2ZwKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9DTElFTlRfU0VORF9SRVFVRVNUOwotCi0Jc3Bpbl9sb2NrKCZjYWxsLT5jb25uLT5wYXJhbXMucGVlci0+bG9jayk7Ci0JaGxpc3RfYWRkX2hlYWQoJmNhbGwtPmVycm9yX2xpbmssICZjYWxsLT5jb25uLT5wYXJhbXMucGVlci0+ZXJyb3JfdGFyZ2V0cyk7Ci0Jc3Bpbl91bmxvY2soJmNhbGwtPmNvbm4tPnBhcmFtcy5wZWVyLT5sb2NrKTsKLQotCWNhbGwtPmxpZmV0aW1lci5leHBpcmVzID0gamlmZmllcyArIHJ4cnBjX21heF9jYWxsX2xpZmV0aW1lOwotCWFkZF90aW1lcigmY2FsbC0+bGlmZXRpbWVyKTsKLQlyZXR1cm4gMDsKKwlleHBpcmVfYXQgPSBrdGltZV9hZGRfbXMobm93LCByeHJwY19tYXhfY2FsbF9saWZldGltZSk7CisJY2FsbC0+ZXhwaXJlX2F0ID0gZXhwaXJlX2F0OworCWNhbGwtPmFja19hdCA9IGV4cGlyZV9hdDsKKwljYWxsLT5yZXNlbmRfYXQgPSBleHBpcmVfYXQ7CisJY2FsbC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBMT05HX01BWCAvIDI7CisJcnhycGNfc2V0X3RpbWVyKGNhbGwsIHJ4cnBjX3RpbWVyX2JlZ2luLCBub3cpOwogfQogCiAvKgpAQCAtMjE2LDIwICsyMjIsMjEgQEAKIHsKIAlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgKnhjYWxsOwogCXN0cnVjdCByYl9ub2RlICpwYXJlbnQsICoqcHA7CisJY29uc3Qgdm9pZCAqaGVyZSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKIAlpbnQgcmV0OwogCiAJX2VudGVyKCIlcCwlbHgiLCByeCwgdXNlcl9jYWxsX0lEKTsKIAotCWNhbGwgPSByeHJwY19hbGxvY19jbGllbnRfY2FsbChyeCwgc3J4LCBnZnApOworCWNhbGwgPSByeHJwY19hbGxvY19jbGllbnRfY2FsbChzcngsIGdmcCk7CiAJaWYgKElTX0VSUihjYWxsKSkgewogCQlfbGVhdmUoIiA9ICVsZCIsIFBUUl9FUlIoY2FsbCkpOwogCQlyZXR1cm4gY2FsbDsKIAl9CiAKLQkvKiBQdWJsaXNoIHRoZSBjYWxsLCBldmVuIHRob3VnaCBpdCBpcyBpbmNvbXBsZXRlbHkgc2V0IHVwIGFzIHlldCAqLwotCWNhbGwtPnVzZXJfY2FsbF9JRCA9IHVzZXJfY2FsbF9JRDsKLQlfX3NldF9iaXQoUlhSUENfQ0FMTF9IQVNfVVNFUklELCAmY2FsbC0+ZmxhZ3MpOworCXRyYWNlX3J4cnBjX2NhbGwoY2FsbCwgcnhycGNfY2FsbF9uZXdfY2xpZW50LCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpLAorCQkJIGhlcmUsIChjb25zdCB2b2lkICopdXNlcl9jYWxsX0lEKTsKIAorCS8qIFB1Ymxpc2ggdGhlIGNhbGwsIGV2ZW4gdGhvdWdoIGl0IGlzIGluY29tcGxldGVseSBzZXQgdXAgYXMgeWV0ICovCiAJd3JpdGVfbG9jaygmcngtPmNhbGxfbG9jayk7CiAKIAlwcCA9ICZyeC0+Y2FsbHMucmJfbm9kZTsKQEAgLTI0MywzNzIgKzI1MCwyODUgQEAKIAkJZWxzZSBpZiAodXNlcl9jYWxsX0lEID4geGNhbGwtPnVzZXJfY2FsbF9JRCkKIAkJCXBwID0gJigqcHApLT5yYl9yaWdodDsKIAkJZWxzZQotCQkJZ290byBmb3VuZF91c2VyX0lEX25vd19wcmVzZW50OworCQkJZ290byBlcnJvcl9kdXBfdXNlcl9JRDsKIAl9CiAKLQlyeHJwY19nZXRfY2FsbChjYWxsKTsKLQorCXJjdV9hc3NpZ25fcG9pbnRlcihjYWxsLT5zb2NrZXQsIHJ4KTsKKwljYWxsLT51c2VyX2NhbGxfSUQgPSB1c2VyX2NhbGxfSUQ7CisJX19zZXRfYml0KFJYUlBDX0NBTExfSEFTX1VTRVJJRCwgJmNhbGwtPmZsYWdzKTsKKwlyeHJwY19nZXRfY2FsbChjYWxsLCByeHJwY19jYWxsX2dvdF91c2VyaWQpOwogCXJiX2xpbmtfbm9kZSgmY2FsbC0+c29ja19ub2RlLCBwYXJlbnQsIHBwKTsKIAlyYl9pbnNlcnRfY29sb3IoJmNhbGwtPnNvY2tfbm9kZSwgJnJ4LT5jYWxscyk7CisJbGlzdF9hZGQoJmNhbGwtPnNvY2tfbGluaywgJnJ4LT5zb2NrX2NhbGxzKTsKKwogCXdyaXRlX3VubG9jaygmcngtPmNhbGxfbG9jayk7CiAKLQl3cml0ZV9sb2NrX2JoKCZyeHJwY19jYWxsX2xvY2spOworCXdyaXRlX2xvY2soJnJ4cnBjX2NhbGxfbG9jayk7CiAJbGlzdF9hZGRfdGFpbCgmY2FsbC0+bGluaywgJnJ4cnBjX2NhbGxzKTsKLQl3cml0ZV91bmxvY2tfYmgoJnJ4cnBjX2NhbGxfbG9jayk7CisJd3JpdGVfdW5sb2NrKCZyeHJwY19jYWxsX2xvY2spOwogCi0JcmV0ID0gcnhycGNfYmVnaW5fY2xpZW50X2NhbGwoY2FsbCwgY3AsIHNyeCwgZ2ZwKTsKKwkvKiBTZXQgdXAgb3IgZ2V0IGEgY29ubmVjdGlvbiByZWNvcmQgYW5kIHNldCB0aGUgcHJvdG9jb2wgcGFyYW1ldGVycywKKwkgKiBpbmNsdWRpbmcgY2hhbm5lbCBudW1iZXIgYW5kIGNhbGwgSUQuCisJICovCisJcmV0ID0gcnhycGNfY29ubmVjdF9jYWxsKGNhbGwsIGNwLCBzcngsIGdmcCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3I7CiAKKwl0cmFjZV9yeHJwY19jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfY29ubmVjdGVkLCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpLAorCQkJIGhlcmUsIEVSUl9QVFIocmV0KSk7CisKKwlzcGluX2xvY2tfYmgoJmNhbGwtPmNvbm4tPnBhcmFtcy5wZWVyLT5sb2NrKTsKKwlobGlzdF9hZGRfaGVhZCgmY2FsbC0+ZXJyb3JfbGluaywKKwkJICAgICAgICZjYWxsLT5jb25uLT5wYXJhbXMucGVlci0+ZXJyb3JfdGFyZ2V0cyk7CisJc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmNvbm4tPnBhcmFtcy5wZWVyLT5sb2NrKTsKKworCXJ4cnBjX3N0YXJ0X2NhbGxfdGltZXIoY2FsbCk7CisKIAlfbmV0KCJDQUxMIG5ldyAlZCBvbiBDT05OICVkIiwgY2FsbC0+ZGVidWdfaWQsIGNhbGwtPmNvbm4tPmRlYnVnX2lkKTsKIAogCV9sZWF2ZSgiID0gJXAgW25ld10iLCBjYWxsKTsKIAlyZXR1cm4gY2FsbDsKIAotZXJyb3I6Ci0Jd3JpdGVfbG9jaygmcngtPmNhbGxfbG9jayk7Ci0JcmJfZXJhc2UoJmNhbGwtPnNvY2tfbm9kZSwgJnJ4LT5jYWxscyk7Ci0Jd3JpdGVfdW5sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKLQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLQotCXdyaXRlX2xvY2tfYmgoJnJ4cnBjX2NhbGxfbG9jayk7Ci0JbGlzdF9kZWxfaW5pdCgmY2FsbC0+bGluayk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZyeHJwY19jYWxsX2xvY2spOwotCi0JY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX0RFQUQ7Ci0JcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIEVSUl9QVFIocmV0KTsKLQogCS8qIFdlIHVuZXhwZWN0ZWRseSBmb3VuZCB0aGUgdXNlciBJRCBpbiB0aGUgbGlzdCBhZnRlciB0YWtpbmcKIAkgKiB0aGUgY2FsbF9sb2NrLiAgVGhpcyBzaG91bGRuJ3QgaGFwcGVuIHVubGVzcyB0aGUgdXNlciByYWNlcwogCSAqIHdpdGggaXRzZWxmIGFuZCB0cmllcyB0byBhZGQgdGhlIHNhbWUgdXNlciBJRCB0d2ljZSBhdCB0aGUKIAkgKiBzYW1lIHRpbWUgaW4gZGlmZmVyZW50IHRocmVhZHMuCiAJICovCi1mb3VuZF91c2VyX0lEX25vd19wcmVzZW50OgorZXJyb3JfZHVwX3VzZXJfSUQ6CiAJd3JpdGVfdW5sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKLQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfREVBRDsKLQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLQlfbGVhdmUoIiA9IC1FRVhJU1QgWyVwXSIsIGNhbGwpOwotCXJldHVybiBFUlJfUFRSKC1FRVhJU1QpOworCXJldCA9IC1FRVhJU1Q7CisKK2Vycm9yOgorCV9fcnhycGNfc2V0X2NhbGxfY29tcGxldGlvbihjYWxsLCBSWFJQQ19DQUxMX0xPQ0FMX0VSUk9SLAorCQkJCSAgICBSWF9DQUxMX0RFQUQsIHJldCk7CisJdHJhY2VfcnhycGNfY2FsbChjYWxsLCByeHJwY19jYWxsX2Vycm9yLCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpLAorCQkJIGhlcmUsIEVSUl9QVFIocmV0KSk7CisJcnhycGNfcmVsZWFzZV9jYWxsKHJ4LCBjYWxsKTsKKwlyeHJwY19wdXRfY2FsbChjYWxsLCByeHJwY19jYWxsX3B1dCk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKIH0KIAogLyoKLSAqIHNldCB1cCBhbiBpbmNvbWluZyBjYWxsCi0gKiAtIGNhbGxlZCBpbiBwcm9jZXNzIGNvbnRleHQgd2l0aCBJUlFzIGVuYWJsZWQKKyAqIFNldCB1cCBhbiBpbmNvbWluZyBjYWxsLiAgY2FsbC0+Y29ubiBwb2ludHMgdG8gdGhlIGNvbm5lY3Rpb24uCisgKiBUaGlzIGlzIGNhbGxlZCBpbiBCSCBjb250ZXh0IGFuZCBpc24ndCBhbGxvd2VkIHRvIGZhaWwuCiAgKi8KLXN0cnVjdCByeHJwY19jYWxsICpyeHJwY19pbmNvbWluZ19jYWxsKHN0cnVjdCByeHJwY19zb2NrICpyeCwKLQkJCQkgICAgICAgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCi0JCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit2b2lkIHJ4cnBjX2luY29taW5nX2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAorCQkJIHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJIHN0cnVjdCBza19idWZmICpza2IpCiB7CisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4gPSBjYWxsLT5jb25uOwogCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgKmNhbmRpZGF0ZTsKLQl1MzIgY2FsbF9pZCwgY2hhbjsKKwl1MzIgY2hhbjsKIAotCV9lbnRlcigiLCVkIiwgY29ubi0+ZGVidWdfaWQpOworCV9lbnRlcigiLCVkIiwgY2FsbC0+Y29ubi0+ZGVidWdfaWQpOwogCi0JQVNTRVJUKHJ4ICE9IE5VTEwpOworCXJjdV9hc3NpZ25fcG9pbnRlcihjYWxsLT5zb2NrZXQsIHJ4KTsKKwljYWxsLT5jYWxsX2lkCQk9IHNwLT5oZHIuY2FsbE51bWJlcjsKKwljYWxsLT5zZXJ2aWNlX2lkCT0gc3AtPmhkci5zZXJ2aWNlSWQ7CisJY2FsbC0+Y2lkCQk9IHNwLT5oZHIuY2lkOworCWNhbGwtPnN0YXRlCQk9IFJYUlBDX0NBTExfU0VSVkVSX0FDQ0VQVElORzsKKwlpZiAoc3AtPmhkci5zZWN1cml0eUluZGV4ID4gMCkKKwkJY2FsbC0+c3RhdGUJPSBSWFJQQ19DQUxMX1NFUlZFUl9TRUNVUklORzsKKwljYWxsLT5jb25nX3RzdGFtcAk9IHNrYi0+dHN0YW1wOwogCi0JY2FuZGlkYXRlID0gcnhycGNfYWxsb2NfY2FsbChHRlBfTk9JTyk7Ci0JaWYgKCFjYW5kaWRhdGUpCi0JCXJldHVybiBFUlJfUFRSKC1FQlVTWSk7Ci0KLQljaGFuID0gc3AtPmhkci5jaWQgJiBSWFJQQ19DSEFOTkVMTUFTSzsKLQljYW5kaWRhdGUtPnNvY2tldAk9IHJ4OwotCWNhbmRpZGF0ZS0+Y29ubgkJPSBjb25uOwotCWNhbmRpZGF0ZS0+Y2lkCQk9IHNwLT5oZHIuY2lkOwotCWNhbmRpZGF0ZS0+Y2FsbF9pZAk9IHNwLT5oZHIuY2FsbE51bWJlcjsKLQljYW5kaWRhdGUtPmNoYW5uZWwJPSBjaGFuOwotCWNhbmRpZGF0ZS0+cnhfZGF0YV9wb3N0CT0gMDsKLQljYW5kaWRhdGUtPnN0YXRlCT0gUlhSUENfQ0FMTF9TRVJWRVJfQUNDRVBUSU5HOwotCWlmIChjb25uLT5zZWN1cml0eV9peCA+IDApCi0JCWNhbmRpZGF0ZS0+c3RhdGUgPSBSWFJQQ19DQUxMX1NFUlZFUl9TRUNVUklORzsKLQotCXNwaW5fbG9jaygmY29ubi0+Y2hhbm5lbF9sb2NrKTsKLQotCS8qIHNldCB0aGUgY2hhbm5lbCBmb3IgdGhpcyBjYWxsICovCi0JY2FsbCA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoY29ubi0+Y2hhbm5lbHNbY2hhbl0uY2FsbCwKLQkJCQkJIGxvY2tkZXBfaXNfaGVsZCgmY29ubi0+Y2hhbm5lbF9sb2NrKSk7Ci0KLQlfZGVidWcoImNoYW5uZWxbJXVdIGlzICVwIiwgY2FuZGlkYXRlLT5jaGFubmVsLCBjYWxsKTsKLQlpZiAoY2FsbCAmJiBjYWxsLT5jYWxsX2lkID09IHNwLT5oZHIuY2FsbE51bWJlcikgewotCQkvKiBhbHJlYWR5IHNldDsgbXVzdCd2ZSBiZWVuIGEgZHVwbGljYXRlIHBhY2tldCAqLwotCQlfZGVidWcoImV4dGFudCBjYWxsIFslZF0iLCBjYWxsLT5zdGF0ZSk7Ci0JCUFTU0VSVENNUChjYWxsLT5jb25uLCA9PSwgY29ubik7Ci0KLQkJcmVhZF9sb2NrKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQkJc3dpdGNoIChjYWxsLT5zdGF0ZSkgewotCQljYXNlIFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEOgotCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfRVZfQUJPUlQsICZjYWxsLT5ldmVudHMpKQotCQkJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7Ci0JCWNhc2UgUlhSUENfQ0FMTF9SRU1PVEVMWV9BQk9SVEVEOgotCQkJcmVhZF91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOwotCQkJZ290byBhYm9ydGVkX2NhbGw7Ci0JCWRlZmF1bHQ6Ci0JCQlyeHJwY19nZXRfY2FsbChjYWxsKTsKLQkJCXJlYWRfdW5sb2NrKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQkJCWdvdG8gZXh0YW50X2NhbGw7Ci0JCX0KLQl9Ci0KLQlpZiAoY2FsbCkgewotCQkvKiBpdCBzZWVtcyB0aGUgY2hhbm5lbCBpcyBzdGlsbCBpbiB1c2UgZnJvbSB0aGUgcHJldmlvdXMgY2FsbAotCQkgKiAtIGRpdGNoIHRoZSBvbGQgYmluZGluZyBpZiBpdHMgY2FsbCBpcyBub3cgY29tcGxldGUgKi8KLQkJX2RlYnVnKCJDQUxMOiAldSB7ICVzIH0iLAotCQkgICAgICAgY2FsbC0+ZGVidWdfaWQsIHJ4cnBjX2NhbGxfc3RhdGVzW2NhbGwtPnN0YXRlXSk7Ci0KLQkJaWYgKGNhbGwtPnN0YXRlID49IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKLQkJCV9fcnhycGNfZGlzY29ubmVjdF9jYWxsKGNhbGwpOwotCQl9IGVsc2UgewotCQkJc3Bpbl91bmxvY2soJmNvbm4tPmNoYW5uZWxfbG9jayk7Ci0JCQlrbWVtX2NhY2hlX2ZyZWUocnhycGNfY2FsbF9qYXIsIGNhbmRpZGF0ZSk7Ci0JCQlfbGVhdmUoIiA9IC1FQlVTWSIpOwotCQkJcmV0dXJuIEVSUl9QVFIoLUVCVVNZKTsKLQkJfQotCX0KLQotCS8qIGNoZWNrIHRoZSBjYWxsIG51bWJlciBpc24ndCBkdXBsaWNhdGUgKi8KLQlfZGVidWcoImNoZWNrIGR1cCIpOwotCWNhbGxfaWQgPSBzcC0+aGRyLmNhbGxOdW1iZXI7Ci0KLQkvKiBXZSBqdXN0IGlnbm9yZSBjYWxscyBwcmlvciB0byB0aGUgY3VycmVudCBjYWxsIElELiAgVGVybWluYXRlZCBjYWxscwotCSAqIGFyZSBoYW5kbGVkIHZpYSB0aGUgY29ubmVjdGlvbi4KKwkvKiBTZXQgdGhlIGNoYW5uZWwgZm9yIHRoaXMgY2FsbC4gIFdlIGRvbid0IGdldCBjaGFubmVsX2xvY2sgYXMgd2UncmUKKwkgKiBvbmx5IGRlZmVuZGluZyBhZ2FpbnN0IHRoZSBkYXRhX3JlYWR5IGhhbmRsZXIgKHdoaWNoIHdlJ3JlIGNhbGxlZAorCSAqIGZyb20pIGFuZCB0aGUgUkVTUE9OU0UgcGFja2V0IHBhcnNlciAod2hpY2ggaXMgb25seSByZWFsbHkKKwkgKiBpbnRlcmVzdGVkIGluIGNhbGxfY291bnRlciBhbmQgY2FuIGNvcGUgd2l0aCBhIGRpc2FncmVlbWVudCB3aXRoIHRoZQorCSAqIGNhbGwgcG9pbnRlcikuCiAJICovCi0JaWYgKGNhbGxfaWQgPD0gY29ubi0+Y2hhbm5lbHNbY2hhbl0uY2FsbF9jb3VudGVyKQotCQlnb3RvIG9sZF9jYWxsOyAvKiBUT0RPOiBKdXN0IGRyb3AgcGFja2V0ICovCi0KLQkvKiBtYWtlIHRoZSBjYWxsIGF2YWlsYWJsZSAqLwotCV9kZWJ1ZygibmV3IGNhbGwiKTsKLQljYWxsID0gY2FuZGlkYXRlOwotCWNhbmRpZGF0ZSA9IE5VTEw7Ci0JY29ubi0+Y2hhbm5lbHNbY2hhbl0uY2FsbF9jb3VudGVyID0gY2FsbF9pZDsKKwljaGFuID0gc3AtPmhkci5jaWQgJiBSWFJQQ19DSEFOTkVMTUFTSzsKKwljb25uLT5jaGFubmVsc1tjaGFuXS5jYWxsX2NvdW50ZXIgPSBjYWxsLT5jYWxsX2lkOworCWNvbm4tPmNoYW5uZWxzW2NoYW5dLmNhbGxfaWQgPSBjYWxsLT5jYWxsX2lkOwogCXJjdV9hc3NpZ25fcG9pbnRlcihjb25uLT5jaGFubmVsc1tjaGFuXS5jYWxsLCBjYWxsKTsKLQlzb2NrX2hvbGQoJnJ4LT5zayk7Ci0JcnhycGNfZ2V0X2Nvbm5lY3Rpb24oY29ubik7Ci0Jc3Bpbl91bmxvY2soJmNvbm4tPmNoYW5uZWxfbG9jayk7CiAKIAlzcGluX2xvY2soJmNvbm4tPnBhcmFtcy5wZWVyLT5sb2NrKTsKIAlobGlzdF9hZGRfaGVhZCgmY2FsbC0+ZXJyb3JfbGluaywgJmNvbm4tPnBhcmFtcy5wZWVyLT5lcnJvcl90YXJnZXRzKTsKIAlzcGluX3VubG9jaygmY29ubi0+cGFyYW1zLnBlZXItPmxvY2spOwogCi0Jd3JpdGVfbG9ja19iaCgmcnhycGNfY2FsbF9sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZjYWxsLT5saW5rLCAmcnhycGNfY2FsbHMpOwotCXdyaXRlX3VubG9ja19iaCgmcnhycGNfY2FsbF9sb2NrKTsKLQotCWNhbGwtPmxvY2FsID0gY29ubi0+cGFyYW1zLmxvY2FsOwotCWNhbGwtPmVwb2NoID0gY29ubi0+cHJvdG8uZXBvY2g7Ci0JY2FsbC0+c2VydmljZV9pZCA9IGNvbm4tPnBhcmFtcy5zZXJ2aWNlX2lkOwotCWNhbGwtPmluX2NsaWVudGZsYWcgPSBSWFJQQ19DTElFTlRfSU5JVElBVEVEOwotCiAJX25ldCgiQ0FMTCBpbmNvbWluZyAlZCBvbiBDT05OICVkIiwgY2FsbC0+ZGVidWdfaWQsIGNhbGwtPmNvbm4tPmRlYnVnX2lkKTsKIAotCWNhbGwtPmxpZmV0aW1lci5leHBpcmVzID0gamlmZmllcyArIHJ4cnBjX21heF9jYWxsX2xpZmV0aW1lOwotCWFkZF90aW1lcigmY2FsbC0+bGlmZXRpbWVyKTsKLQlfbGVhdmUoIiA9ICVwIHslZH0gW25ld10iLCBjYWxsLCBjYWxsLT5kZWJ1Z19pZCk7Ci0JcmV0dXJuIGNhbGw7Ci0KLWV4dGFudF9jYWxsOgotCXNwaW5fdW5sb2NrKCZjb25uLT5jaGFubmVsX2xvY2spOwotCWttZW1fY2FjaGVfZnJlZShyeHJwY19jYWxsX2phciwgY2FuZGlkYXRlKTsKLQlfbGVhdmUoIiA9ICVwIHslZH0gW2V4dGFudF0iLCBjYWxsLCBjYWxsID8gY2FsbC0+ZGVidWdfaWQgOiAtMSk7Ci0JcmV0dXJuIGNhbGw7Ci0KLWFib3J0ZWRfY2FsbDoKLQlzcGluX3VubG9jaygmY29ubi0+Y2hhbm5lbF9sb2NrKTsKLQlrbWVtX2NhY2hlX2ZyZWUocnhycGNfY2FsbF9qYXIsIGNhbmRpZGF0ZSk7Ci0JX2xlYXZlKCIgPSAtRUNPTk5BQk9SVEVEIik7Ci0JcmV0dXJuIEVSUl9QVFIoLUVDT05OQUJPUlRFRCk7Ci0KLW9sZF9jYWxsOgotCXNwaW5fdW5sb2NrKCZjb25uLT5jaGFubmVsX2xvY2spOwotCWttZW1fY2FjaGVfZnJlZShyeHJwY19jYWxsX2phciwgY2FuZGlkYXRlKTsKLQlfbGVhdmUoIiA9IC1FQ09OTlJFU0VUIFtvbGRdIik7Ci0JcmV0dXJuIEVSUl9QVFIoLUVDT05OUkVTRVQpOworCXJ4cnBjX3N0YXJ0X2NhbGxfdGltZXIoY2FsbCk7CisJX2xlYXZlKCIiKTsKIH0KIAogLyoKLSAqIGRldGFjaCBhIGNhbGwgZnJvbSBhIHNvY2tldCBhbmQgc2V0IHVwIGZvciByZWxlYXNlCisgKiBRdWV1ZSBhIGNhbGwncyB3b3JrIHByb2Nlc3NvciwgZ2V0dGluZyBhIHJlZiB0byBwYXNzIHRvIHRoZSB3b3JrIHF1ZXVlLgogICovCi12b2lkIHJ4cnBjX3JlbGVhc2VfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK2Jvb2wgcnhycGNfcXVldWVfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKIHsKLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiA9IGNhbGwtPmNvbm47Ci0Jc3RydWN0IHJ4cnBjX3NvY2sgKnJ4ID0gY2FsbC0+c29ja2V0OworCWNvbnN0IHZvaWQgKmhlcmUgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7CisJaW50IG4gPSBfX2F0b21pY19hZGRfdW5sZXNzKCZjYWxsLT51c2FnZSwgMSwgMCk7CisJaWYgKG4gPT0gMCkKKwkJcmV0dXJuIGZhbHNlOworCWlmIChyeHJwY19xdWV1ZV93b3JrKCZjYWxsLT5wcm9jZXNzb3IpKQorCQl0cmFjZV9yeHJwY19jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfcXVldWVkLCBuICsgMSwgaGVyZSwgTlVMTCk7CisJZWxzZQorCQlyeHJwY19wdXRfY2FsbChjYWxsLCByeHJwY19jYWxsX3B1dF9ub3F1ZXVlKTsKKwlyZXR1cm4gdHJ1ZTsKK30KIAotCV9lbnRlcigieyVkLCVkLCVkLCVkfSIsCi0JICAgICAgIGNhbGwtPmRlYnVnX2lkLCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpLAotCSAgICAgICBhdG9taWNfcmVhZCgmY2FsbC0+YWNrcl9ub3RfaWRsZSksCi0JICAgICAgIGNhbGwtPnJ4X2ZpcnN0X29vcyk7CisvKgorICogUXVldWUgYSBjYWxsJ3Mgd29yayBwcm9jZXNzb3IsIHBhc3NpbmcgdGhlIGNhbGxlcnMgcmVmIHRvIHRoZSB3b3JrIHF1ZXVlLgorICovCitib29sIF9fcnhycGNfcXVldWVfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwljb25zdCB2b2lkICpoZXJlID0gX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOworCWludCBuID0gYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKTsKKwlBU1NFUlRDTVAobiwgPj0sIDEpOworCWlmIChyeHJwY19xdWV1ZV93b3JrKCZjYWxsLT5wcm9jZXNzb3IpKQorCQl0cmFjZV9yeHJwY19jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfcXVldWVkX3JlZiwgbiwgaGVyZSwgTlVMTCk7CisJZWxzZQorCQlyeHJwY19wdXRfY2FsbChjYWxsLCByeHJwY19jYWxsX3B1dF9ub3F1ZXVlKTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIE5vdGUgdGhlIHJlLWVtZXJnZW5jZSBvZiBhIGNhbGwuCisgKi8KK3ZvaWQgcnhycGNfc2VlX2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJY29uc3Qgdm9pZCAqaGVyZSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKwlpZiAoY2FsbCkgeworCQlpbnQgbiA9IGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSk7CisKKwkJdHJhY2VfcnhycGNfY2FsbChjYWxsLCByeHJwY19jYWxsX3NlZW4sIG4sIGhlcmUsIE5VTEwpOworCX0KK30KKworLyoKKyAqIE5vdGUgdGhlIGFkZGl0aW9uIG9mIGEgcmVmIG9uIGEgY2FsbC4KKyAqLwordm9pZCByeHJwY19nZXRfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgZW51bSByeHJwY19jYWxsX3RyYWNlIG9wKQoreworCWNvbnN0IHZvaWQgKmhlcmUgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7CisJaW50IG4gPSBhdG9taWNfaW5jX3JldHVybigmY2FsbC0+dXNhZ2UpOworCisJdHJhY2VfcnhycGNfY2FsbChjYWxsLCBvcCwgbiwgaGVyZSwgTlVMTCk7Cit9CisKKy8qCisgKiBEZXRhY2ggYSBjYWxsIGZyb20gaXRzIG93bmluZyBzb2NrZXQuCisgKi8KK3ZvaWQgcnhycGNfcmVsZWFzZV9jYWxsKHN0cnVjdCByeHJwY19zb2NrICpyeCwgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJY29uc3Qgdm9pZCAqaGVyZSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiA9IGNhbGwtPmNvbm47CisJYm9vbCBwdXQgPSBmYWxzZTsKKwlpbnQgaTsKKworCV9lbnRlcigieyVkLCVkfSIsIGNhbGwtPmRlYnVnX2lkLCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpKTsKKworCXRyYWNlX3J4cnBjX2NhbGwoY2FsbCwgcnhycGNfY2FsbF9yZWxlYXNlLCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpLAorCQkJIGhlcmUsIChjb25zdCB2b2lkICopY2FsbC0+ZmxhZ3MpOworCisJQVNTRVJUQ01QKGNhbGwtPnN0YXRlLCA9PSwgUlhSUENfQ0FMTF9DT01QTEVURSk7CiAKIAlzcGluX2xvY2tfYmgoJmNhbGwtPmxvY2spOwogCWlmICh0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfUkVMRUFTRUQsICZjYWxsLT5mbGFncykpCiAJCUJVRygpOwogCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKIAotCS8qIGRpc3NvY2lhdGUgZnJvbSB0aGUgc29ja2V0Ci0JICogLSB0aGUgc29ja2V0J3MgcmVmIG9uIHRoZSBjYWxsIGlzIHBhc3NlZCB0byB0aGUgZGVhdGggdGltZXIKLQkgKi8KLQlfZGVidWcoIlJFTEVBU0UgQ0FMTCAlcCAoJWQgQ09OTiAlcCkiLCBjYWxsLCBjYWxsLT5kZWJ1Z19pZCwgY29ubik7CisJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPnRpbWVyKTsKIAotCXNwaW5fbG9jaygmY29ubi0+cGFyYW1zLnBlZXItPmxvY2spOwotCWhsaXN0X2RlbF9pbml0KCZjYWxsLT5lcnJvcl9saW5rKTsKLQlzcGluX3VubG9jaygmY29ubi0+cGFyYW1zLnBlZXItPmxvY2spOworCS8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgYW55IG1vcmUgbm90aWZpY2F0aW9ucyAqLworCXdyaXRlX2xvY2tfYmgoJnJ4LT5yZWN2bXNnX2xvY2spOwogCi0Jd3JpdGVfbG9ja19iaCgmcngtPmNhbGxfbG9jayk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZjYWxsLT5hY2NlcHRfbGluaykpIHsKKwlpZiAoIWxpc3RfZW1wdHkoJmNhbGwtPnJlY3Ztc2dfbGluaykpIHsKIAkJX2RlYnVnKCJ1bmxpbmtpbmcgb25jZS1wZW5kaW5nIGNhbGwgJXAgeyBlPSVseCBmPSVseCB9IiwKIAkJICAgICAgIGNhbGwsIGNhbGwtPmV2ZW50cywgY2FsbC0+ZmxhZ3MpOwotCQlBU1NFUlQoIXRlc3RfYml0KFJYUlBDX0NBTExfSEFTX1VTRVJJRCwgJmNhbGwtPmZsYWdzKSk7Ci0JCWxpc3RfZGVsX2luaXQoJmNhbGwtPmFjY2VwdF9saW5rKTsKLQkJc2tfYWNjZXB0cV9yZW1vdmVkKCZyeC0+c2spOwotCX0gZWxzZSBpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9IQVNfVVNFUklELCAmY2FsbC0+ZmxhZ3MpKSB7CisJCWxpc3RfZGVsKCZjYWxsLT5yZWN2bXNnX2xpbmspOworCQlwdXQgPSB0cnVlOworCX0KKworCS8qIGxpc3RfZW1wdHkoKSBtdXN0IHJldHVybiBmYWxzZSBpbiByeHJwY19ub3RpZnlfc29ja2V0KCkgKi8KKwljYWxsLT5yZWN2bXNnX2xpbmsubmV4dCA9IE5VTEw7CisJY2FsbC0+cmVjdm1zZ19saW5rLnByZXYgPSBOVUxMOworCisJd3JpdGVfdW5sb2NrX2JoKCZyeC0+cmVjdm1zZ19sb2NrKTsKKwlpZiAocHV0KQorCQlyeHJwY19wdXRfY2FsbChjYWxsLCByeHJwY19jYWxsX3B1dCk7CisKKwl3cml0ZV9sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUlhSUENfQ0FMTF9IQVNfVVNFUklELCAmY2FsbC0+ZmxhZ3MpKSB7CiAJCXJiX2VyYXNlKCZjYWxsLT5zb2NrX25vZGUsICZyeC0+Y2FsbHMpOwogCQltZW1zZXQoJmNhbGwtPnNvY2tfbm9kZSwgMHhkZCwgc2l6ZW9mKGNhbGwtPnNvY2tfbm9kZSkpOwotCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9IQVNfVVNFUklELCAmY2FsbC0+ZmxhZ3MpOwotCX0KLQl3cml0ZV91bmxvY2tfYmgoJnJ4LT5jYWxsX2xvY2spOwotCi0JLyogZnJlZSB1cCB0aGUgY2hhbm5lbCBmb3IgcmV1c2UgKi8KLQl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQotCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfQ09NUExFVEUgJiYKLQkgICAgY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9DTElFTlRfRklOQUxfQUNLKSB7Ci0JCV9kZWJ1ZygiKysrIEFCT1JUSU5HIFNUQVRFICVkICsrK1xuIiwgY2FsbC0+c3RhdGUpOwotCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEOwotCQljYWxsLT5sb2NhbF9hYm9ydCA9IFJYX0NBTExfREVBRDsKLQl9Ci0Jd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQotCXJ4cnBjX2Rpc2Nvbm5lY3RfY2FsbChjYWxsKTsKLQotCS8qIGNsZWFuIHVwIHRoZSBSeCBxdWV1ZSAqLwotCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZjYWxsLT5yeF9xdWV1ZSkgfHwKLQkgICAgIXNrYl9xdWV1ZV9lbXB0eSgmY2FsbC0+cnhfb29zX3F1ZXVlKSkgewotCQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOwotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCi0JCV9kZWJ1ZygicHVyZ2UgUnggcXVldWVzIik7Ci0KLQkJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKLQkJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmY2FsbC0+cnhfcXVldWUpKSB8fAotCQkgICAgICAgKHNrYiA9IHNrYl9kZXF1ZXVlKCZjYWxsLT5yeF9vb3NfcXVldWUpKSkgewotCQkJc3AgPSByeHJwY19za2Ioc2tiKTsKLQkJCWlmIChzcC0+Y2FsbCkgewotCQkJCUFTU0VSVENNUChzcC0+Y2FsbCwgPT0sIGNhbGwpOwotCQkJCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotCQkJCXNwLT5jYWxsID0gTlVMTDsKLQkJCX0KLQkJCXNrYi0+ZGVzdHJ1Y3RvciA9IE5VTEw7Ci0JCQlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7Ci0KLQkJCV9kZWJ1ZygiLSB6YXAgJXMgJSUldSAjJXUiLAotCQkJICAgICAgIHJ4cnBjX3BrdHNbc3AtPmhkci50eXBlXSwKLQkJCSAgICAgICBzcC0+aGRyLnNlcmlhbCwgc3AtPmhkci5zZXEpOwotCQkJcnhycGNfZnJlZV9za2Ioc2tiKTsKLQkJCXNwaW5fbG9ja19iaCgmY2FsbC0+bG9jayk7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmxvY2spOwotCi0JCUFTU0VSVENNUChjYWxsLT5zdGF0ZSwgIT0sIFJYUlBDX0NBTExfQ09NUExFVEUpOworCQlyeHJwY19wdXRfY2FsbChjYWxsLCByeHJwY19jYWxsX3B1dF91c2VyaWQpOwogCX0KIAotCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5yZXNlbmRfdGltZXIpOwotCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5hY2tfdGltZXIpOwotCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5saWZldGltZXIpOwotCWNhbGwtPmRlYWRzcGFuLmV4cGlyZXMgPSBqaWZmaWVzICsgcnhycGNfZGVhZF9jYWxsX2V4cGlyeTsKLQlhZGRfdGltZXIoJmNhbGwtPmRlYWRzcGFuKTsKKwlsaXN0X2RlbCgmY2FsbC0+c29ja19saW5rKTsKKwl3cml0ZV91bmxvY2soJnJ4LT5jYWxsX2xvY2spOworCisJX2RlYnVnKCJSRUxFQVNFIENBTEwgJXAgKCVkIENPTk4gJXApIiwgY2FsbCwgY2FsbC0+ZGVidWdfaWQsIGNvbm4pOworCisJaWYgKGNvbm4pCisJCXJ4cnBjX2Rpc2Nvbm5lY3RfY2FsbChjYWxsKTsKKworCWZvciAoaSA9IDA7IGkgPCBSWFJQQ19SWFRYX0JVRkZfU0laRTsgaSsrKSB7CisJCXJ4cnBjX2ZyZWVfc2tiKGNhbGwtPnJ4dHhfYnVmZmVyW2ldLAorCQkJICAgICAgIChjYWxsLT50eF9waGFzZSA/IHJ4cnBjX3NrYl90eF9jbGVhbmVkIDoKKwkJCQlyeHJwY19za2JfcnhfY2xlYW5lZCkpOworCQljYWxsLT5yeHR4X2J1ZmZlcltpXSA9IE5VTEw7CisJfQogCiAJX2xlYXZlKCIiKTsKIH0KIAogLyoKLSAqIGhhbmRsZSBhIGRlYWQgY2FsbCBiZWluZyByZWFkeSBmb3IgcmVhcGluZwotICovCi1zdGF0aWMgdm9pZCByeHJwY19kZWFkX2NhbGxfZXhwaXJlZCh1bnNpZ25lZCBsb25nIF9jYWxsKQotewotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsID0gKHN0cnVjdCByeHJwY19jYWxsICopIF9jYWxsOwotCi0JX2VudGVyKCJ7JWR9IiwgY2FsbC0+ZGVidWdfaWQpOwotCi0Jd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX0RFQUQ7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLX0KLQotLyoKLSAqIG1hcmsgYSBjYWxsIGFzIHRvIGJlIHJlbGVhc2VkLCBhYm9ydGluZyBpdCBpZiBpdCdzIHN0aWxsIGluIHByb2dyZXNzCi0gKiAtIGNhbGxlZCB3aXRoIHNvZnRpcnFzIGRpc2FibGVkCi0gKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX21hcmtfY2FsbF9yZWxlYXNlZChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKLXsKLQlib29sIHNjaGVkOwotCi0Jd3JpdGVfbG9jaygmY2FsbC0+c3RhdGVfbG9jayk7Ci0JaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9ERUFEKSB7Ci0JCXNjaGVkID0gZmFsc2U7Ci0JCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKLQkJCV9kZWJ1ZygiYWJvcnQgY2FsbCAlcCIsIGNhbGwpOwotCQkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRDsKLQkJCWNhbGwtPmxvY2FsX2Fib3J0ID0gUlhfQ0FMTF9ERUFEOwotCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfRVZfQUJPUlQsICZjYWxsLT5ldmVudHMpKQotCQkJCXNjaGVkID0gdHJ1ZTsKLQkJfQotCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FVl9SRUxFQVNFLCAmY2FsbC0+ZXZlbnRzKSkKLQkJCXNjaGVkID0gdHJ1ZTsKLQkJaWYgKHNjaGVkKQotCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQl9Ci0Jd3JpdGVfdW5sb2NrKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLX0KLQotLyoKICAqIHJlbGVhc2UgYWxsIHRoZSBjYWxscyBhc3NvY2lhdGVkIHdpdGggYSBzb2NrZXQKICAqLwogdm9pZCByeHJwY19yZWxlYXNlX2NhbGxzX29uX3NvY2tldChzdHJ1Y3QgcnhycGNfc29jayAqcngpCiB7CiAJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7Ci0Jc3RydWN0IHJiX25vZGUgKnA7CiAKIAlfZW50ZXIoIiVwIiwgcngpOwogCi0JcmVhZF9sb2NrX2JoKCZyeC0+Y2FsbF9sb2NrKTsKLQotCS8qIG1hcmsgYWxsIHRoZSBjYWxscyBhcyBubyBsb25nZXIgd2FudGluZyBpbmNvbWluZyBwYWNrZXRzICovCi0JZm9yIChwID0gcmJfZmlyc3QoJnJ4LT5jYWxscyk7IHA7IHAgPSByYl9uZXh0KHApKSB7Ci0JCWNhbGwgPSByYl9lbnRyeShwLCBzdHJ1Y3QgcnhycGNfY2FsbCwgc29ja19ub2RlKTsKLQkJcnhycGNfbWFya19jYWxsX3JlbGVhc2VkKGNhbGwpOworCXdoaWxlICghbGlzdF9lbXB0eSgmcngtPnRvX2JlX2FjY2VwdGVkKSkgeworCQljYWxsID0gbGlzdF9lbnRyeShyeC0+dG9fYmVfYWNjZXB0ZWQubmV4dCwKKwkJCQkgIHN0cnVjdCByeHJwY19jYWxsLCBhY2NlcHRfbGluayk7CisJCWxpc3RfZGVsKCZjYWxsLT5hY2NlcHRfbGluayk7CisJCXJ4cnBjX2Fib3J0X2NhbGwoIlNLUiIsIGNhbGwsIDAsIFJYX0NBTExfREVBRCwgRUNPTk5SRVNFVCk7CisJCXJ4cnBjX3B1dF9jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfcHV0KTsKIAl9CiAKLQkvKiBraWxsIHRoZSBub3QteWV0LWFjY2VwdGVkIGluY29taW5nIGNhbGxzICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjYWxsLCAmcngtPnNlY3VyZXEsIGFjY2VwdF9saW5rKSB7Ci0JCXJ4cnBjX21hcmtfY2FsbF9yZWxlYXNlZChjYWxsKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnJ4LT5zb2NrX2NhbGxzKSkgeworCQljYWxsID0gbGlzdF9lbnRyeShyeC0+c29ja19jYWxscy5uZXh0LAorCQkJCSAgc3RydWN0IHJ4cnBjX2NhbGwsIHNvY2tfbGluayk7CisJCXJ4cnBjX2dldF9jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfZ290KTsKKwkJcnhycGNfYWJvcnRfY2FsbCgiU0tUIiwgY2FsbCwgMCwgUlhfQ0FMTF9ERUFELCBFQ09OTlJFU0VUKTsKKwkJcnhycGNfc2VuZF9jYWxsX3BhY2tldChjYWxsLCBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVCk7CisJCXJ4cnBjX3JlbGVhc2VfY2FsbChyeCwgY2FsbCk7CisJCXJ4cnBjX3B1dF9jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfcHV0KTsKIAl9CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhbGwsICZyeC0+YWNjZXB0cSwgYWNjZXB0X2xpbmspIHsKLQkJcnhycGNfbWFya19jYWxsX3JlbGVhc2VkKGNhbGwpOwotCX0KLQotCXJlYWRfdW5sb2NrX2JoKCZyeC0+Y2FsbF9sb2NrKTsKIAlfbGVhdmUoIiIpOwogfQogCiAvKgogICogcmVsZWFzZSBhIGNhbGwKICAqLwotdm9pZCBfX3J4cnBjX3B1dF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQordm9pZCByeHJwY19wdXRfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgZW51bSByeHJwY19jYWxsX3RyYWNlIG9wKQogeworCWNvbnN0IHZvaWQgKmhlcmUgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7CisJaW50IG47CisKIAlBU1NFUlQoY2FsbCAhPSBOVUxMKTsKIAotCV9lbnRlcigiJXB7dT0lZH0iLCBjYWxsLCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpKTsKLQotCUFTU0VSVENNUChhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpLCA+LCAwKTsKLQotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjYWxsLT51c2FnZSkpIHsKKwluID0gYXRvbWljX2RlY19yZXR1cm4oJmNhbGwtPnVzYWdlKTsKKwl0cmFjZV9yeHJwY19jYWxsKGNhbGwsIG9wLCBuLCBoZXJlLCBOVUxMKTsKKwlBU1NFUlRDTVAobiwgPj0sIDApOworCWlmIChuID09IDApIHsKIAkJX2RlYnVnKCJjYWxsICVkIGRlYWQiLCBjYWxsLT5kZWJ1Z19pZCk7Ci0JCUFTU0VSVENNUChjYWxsLT5zdGF0ZSwgPT0sIFJYUlBDX0NBTExfREVBRCk7Ci0JCXJ4cnBjX3F1ZXVlX3dvcmsoJmNhbGwtPmRlc3Ryb3llcik7CisJCUFTU0VSVENNUChjYWxsLT5zdGF0ZSwgPT0sIFJYUlBDX0NBTExfQ09NUExFVEUpOworCisJCXdyaXRlX2xvY2soJnJ4cnBjX2NhbGxfbG9jayk7CisJCWxpc3RfZGVsX2luaXQoJmNhbGwtPmxpbmspOworCQl3cml0ZV91bmxvY2soJnJ4cnBjX2NhbGxfbG9jayk7CisKKwkJcnhycGNfY2xlYW51cF9jYWxsKGNhbGwpOwogCX0KLQlfbGVhdmUoIiIpOwogfQogCiAvKgpAQCAtNjE4LDE4NyArNTM4LDcwIEBACiB7CiAJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwgPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3QgcnhycGNfY2FsbCwgcmN1KTsKIAotCXJ4cnBjX3B1cmdlX3F1ZXVlKCZjYWxsLT5yeF9xdWV1ZSk7CisJcnhycGNfcHV0X3BlZXIoY2FsbC0+cGVlcik7CisJa2ZyZWUoY2FsbC0+cnh0eF9idWZmZXIpOworCWtmcmVlKGNhbGwtPnJ4dHhfYW5ub3RhdGlvbnMpOwogCWttZW1fY2FjaGVfZnJlZShyeHJwY19jYWxsX2phciwgY2FsbCk7CiB9CiAKIC8qCiAgKiBjbGVhbiB1cCBhIGNhbGwKICAqLwotc3RhdGljIHZvaWQgcnhycGNfY2xlYW51cF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQordm9pZCByeHJwY19jbGVhbnVwX2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCiB7Ci0JX25ldCgiREVTVFJPWSBDQUxMICVkIiwgY2FsbC0+ZGVidWdfaWQpOworCWludCBpOwogCi0JQVNTRVJUKGNhbGwtPnNvY2tldCk7CisJX25ldCgiREVTVFJPWSBDQUxMICVkIiwgY2FsbC0+ZGVidWdfaWQpOwogCiAJbWVtc2V0KCZjYWxsLT5zb2NrX25vZGUsIDB4Y2QsIHNpemVvZihjYWxsLT5zb2NrX25vZGUpKTsKIAotCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5saWZldGltZXIpOwotCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5kZWFkc3Bhbik7Ci0JZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja190aW1lcik7Ci0JZGVsX3RpbWVyX3N5bmMoJmNhbGwtPnJlc2VuZF90aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPnRpbWVyKTsKIAorCUFTU0VSVENNUChjYWxsLT5zdGF0ZSwgPT0sIFJYUlBDX0NBTExfQ09NUExFVEUpOwogCUFTU0VSVCh0ZXN0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0VELCAmY2FsbC0+ZmxhZ3MpKTsKLQlBU1NFUlRDTVAoY2FsbC0+ZXZlbnRzLCA9PSwgMCk7Ci0JaWYgKHdvcmtfcGVuZGluZygmY2FsbC0+cHJvY2Vzc29yKSkgewotCQlfZGVidWcoImRlZmVyIGRlc3Ryb3kiKTsKLQkJcnhycGNfcXVldWVfd29yaygmY2FsbC0+ZGVzdHJveWVyKTsKLQkJcmV0dXJuOwotCX0KLQogCUFTU0VSVENNUChjYWxsLT5jb25uLCA9PSwgTlVMTCk7CiAKLQlpZiAoY2FsbC0+YWNrc193aW5kb3cpIHsKLQkJX2RlYnVnKCJraWxsIFR4IHdpbmRvdyAlZCIsCi0JCSAgICAgICBDSVJDX0NOVChjYWxsLT5hY2tzX2hlYWQsIGNhbGwtPmFja3NfdGFpbCwKLQkJCQljYWxsLT5hY2tzX3dpbnN6KSk7Ci0JCXNtcF9tYigpOwotCQl3aGlsZSAoQ0lSQ19DTlQoY2FsbC0+YWNrc19oZWFkLCBjYWxsLT5hY2tzX3RhaWwsCi0JCQkJY2FsbC0+YWNrc193aW5zeikgPiAwKSB7Ci0JCQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOwotCQkJdW5zaWduZWQgbG9uZyBfc2tiOworCS8qIENsZWFuIHVwIHRoZSBSeC9UeCBidWZmZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhSUENfUlhUWF9CVUZGX1NJWkU7IGkrKykKKwkJcnhycGNfZnJlZV9za2IoY2FsbC0+cnh0eF9idWZmZXJbaV0sCisJCQkgICAgICAgKGNhbGwtPnR4X3BoYXNlID8gcnhycGNfc2tiX3R4X2NsZWFuZWQgOgorCQkJCXJ4cnBjX3NrYl9yeF9jbGVhbmVkKSk7CiAKLQkJCV9za2IgPSBjYWxsLT5hY2tzX3dpbmRvd1tjYWxsLT5hY2tzX3RhaWxdICYgfjE7Ci0JCQlzcCA9IHJ4cnBjX3NrYigoc3RydWN0IHNrX2J1ZmYgKilfc2tiKTsKLQkJCV9kZWJ1ZygiKysrIGNsZWFyIFR4ICV1Iiwgc3AtPmhkci5zZXEpOwotCQkJcnhycGNfZnJlZV9za2IoKHN0cnVjdCBza19idWZmICopX3NrYik7Ci0JCQljYWxsLT5hY2tzX3RhaWwgPQotCQkJCShjYWxsLT5hY2tzX3RhaWwgKyAxKSAmIChjYWxsLT5hY2tzX3dpbnN6IC0gMSk7Ci0JCX0KKwlyeHJwY19mcmVlX3NrYihjYWxsLT50eF9wZW5kaW5nLCByeHJwY19za2JfdHhfY2xlYW5lZCk7CiAKLQkJa2ZyZWUoY2FsbC0+YWNrc193aW5kb3cpOwotCX0KLQotCXJ4cnBjX2ZyZWVfc2tiKGNhbGwtPnR4X3BlbmRpbmcpOwotCi0JcnhycGNfcHVyZ2VfcXVldWUoJmNhbGwtPnJ4X3F1ZXVlKTsKLQlBU1NFUlQoc2tiX3F1ZXVlX2VtcHR5KCZjYWxsLT5yeF9vb3NfcXVldWUpKTsKLQlzb2NrX3B1dCgmY2FsbC0+c29ja2V0LT5zayk7CiAJY2FsbF9yY3UoJmNhbGwtPnJjdSwgcnhycGNfcmN1X2Rlc3Ryb3lfY2FsbCk7CiB9CiAKIC8qCi0gKiBkZXN0cm95IGEgY2FsbAotICovCi1zdGF0aWMgdm9pZCByeHJwY19kZXN0cm95X2NhbGwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByeHJwY19jYWxsLCBkZXN0cm95ZXIpOwotCi0JX2VudGVyKCIlcHslZCwlZCwlcH0iLAotCSAgICAgICBjYWxsLCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpLCBjYWxsLT5jaGFubmVsLCBjYWxsLT5jb25uKTsKLQotCUFTU0VSVENNUChjYWxsLT5zdGF0ZSwgPT0sIFJYUlBDX0NBTExfREVBRCk7Ci0KLQl3cml0ZV9sb2NrX2JoKCZyeHJwY19jYWxsX2xvY2spOwotCWxpc3RfZGVsX2luaXQoJmNhbGwtPmxpbmspOwotCXdyaXRlX3VubG9ja19iaCgmcnhycGNfY2FsbF9sb2NrKTsKLQotCXJ4cnBjX2NsZWFudXBfY2FsbChjYWxsKTsKLQlfbGVhdmUoIiIpOwotfQotCi0vKgotICogcHJlZW1wdGl2ZWx5IGRlc3Ryb3kgYWxsIHRoZSBjYWxsIHJlY29yZHMgZnJvbSBhIHRyYW5zcG9ydCBlbmRwb2ludCByYXRoZXIKLSAqIHRoYW4gd2FpdGluZyBmb3IgdGhlbSB0byB0aW1lIG91dAorICogTWFrZSBzdXJlIHRoYXQgYWxsIGNhbGxzIGFyZSBnb25lLgogICovCiB2b2lkIF9fZXhpdCByeHJwY19kZXN0cm95X2FsbF9jYWxscyh2b2lkKQogewogCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwogCiAJX2VudGVyKCIiKTsKLQl3cml0ZV9sb2NrX2JoKCZyeHJwY19jYWxsX2xvY2spOworCisJaWYgKGxpc3RfZW1wdHkoJnJ4cnBjX2NhbGxzKSkKKwkJcmV0dXJuOworCisJd3JpdGVfbG9jaygmcnhycGNfY2FsbF9sb2NrKTsKIAogCXdoaWxlICghbGlzdF9lbXB0eSgmcnhycGNfY2FsbHMpKSB7CiAJCWNhbGwgPSBsaXN0X2VudHJ5KHJ4cnBjX2NhbGxzLm5leHQsIHN0cnVjdCByeHJwY19jYWxsLCBsaW5rKTsKIAkJX2RlYnVnKCJaYXBwaW5nIGNhbGwgJXAiLCBjYWxsKTsKIAorCQlyeHJwY19zZWVfY2FsbChjYWxsKTsKIAkJbGlzdF9kZWxfaW5pdCgmY2FsbC0+bGluayk7CiAKLQkJc3dpdGNoIChhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpKSB7Ci0JCWNhc2UgMDoKLQkJCUFTU0VSVENNUChjYWxsLT5zdGF0ZSwgPT0sIFJYUlBDX0NBTExfREVBRCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJaWYgKGRlbF90aW1lcl9zeW5jKCZjYWxsLT5kZWFkc3BhbikgIT0gMCAmJgotCQkJICAgIGNhbGwtPnN0YXRlICE9IFJYUlBDX0NBTExfREVBRCkKLQkJCQlyeHJwY19kZWFkX2NhbGxfZXhwaXJlZCgodW5zaWduZWQgbG9uZykgY2FsbCk7Ci0JCQlpZiAoY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9ERUFEKQotCQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJfZXJyKCJDYWxsICVwIHN0aWxsIGluIHVzZSAoJWQsJWQsJXMsJWx4LCVseCkhXG4iLAotCQkJICAgICAgIGNhbGwsIGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSksCi0JCQkgICAgICAgYXRvbWljX3JlYWQoJmNhbGwtPmFja3Jfbm90X2lkbGUpLAotCQkJICAgICAgIHJ4cnBjX2NhbGxfc3RhdGVzW2NhbGwtPnN0YXRlXSwKLQkJCSAgICAgICBjYWxsLT5mbGFncywgY2FsbC0+ZXZlbnRzKTsKLQkJCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZjYWxsLT5yeF9xdWV1ZSkpCi0JCQkJcHJfZXJyKCJSeCBxdWV1ZSBvY2N1cGllZFxuIik7Ci0JCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmY2FsbC0+cnhfb29zX3F1ZXVlKSkKLQkJCQlwcl9lcnIoIk9PUyBxdWV1ZSBvY2N1cGllZFxuIik7Ci0JCQlicmVhazsKLQkJfQorCQlwcl9lcnIoIkNhbGwgJXAgc3RpbGwgaW4gdXNlICglZCwlcywlbHgsJWx4KSFcbiIsCisJCSAgICAgICBjYWxsLCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpLAorCQkgICAgICAgcnhycGNfY2FsbF9zdGF0ZXNbY2FsbC0+c3RhdGVdLAorCQkgICAgICAgY2FsbC0+ZmxhZ3MsIGNhbGwtPmV2ZW50cyk7CiAKLQkJd3JpdGVfdW5sb2NrX2JoKCZyeHJwY19jYWxsX2xvY2spOworCQl3cml0ZV91bmxvY2soJnJ4cnBjX2NhbGxfbG9jayk7CiAJCWNvbmRfcmVzY2hlZCgpOwotCQl3cml0ZV9sb2NrX2JoKCZyeHJwY19jYWxsX2xvY2spOworCQl3cml0ZV9sb2NrKCZyeHJwY19jYWxsX2xvY2spOwogCX0KIAotCXdyaXRlX3VubG9ja19iaCgmcnhycGNfY2FsbF9sb2NrKTsKLQlfbGVhdmUoIiIpOwotfQotCi0vKgotICogaGFuZGxlIGNhbGwgbGlmZXRpbWUgYmVpbmcgZXhjZWVkZWQKLSAqLwotc3RhdGljIHZvaWQgcnhycGNfY2FsbF9saWZlX2V4cGlyZWQodW5zaWduZWQgbG9uZyBfY2FsbCkKLXsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCA9IChzdHJ1Y3QgcnhycGNfY2FsbCAqKSBfY2FsbDsKLQotCWlmIChjYWxsLT5zdGF0ZSA+PSBSWFJQQ19DQUxMX0NPTVBMRVRFKQotCQlyZXR1cm47Ci0KLQlfZW50ZXIoInslZH0iLCBjYWxsLT5kZWJ1Z19pZCk7Ci0JcmVhZF9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQlpZiAoY2FsbC0+c3RhdGUgPCBSWFJQQ19DQUxMX0NPTVBMRVRFKSB7Ci0JCXNldF9iaXQoUlhSUENfQ0FMTF9FVl9MSUZFX1RJTUVSLCAmY2FsbC0+ZXZlbnRzKTsKLQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQl9Ci0JcmVhZF91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotfQotCi0vKgotICogaGFuZGxlIHJlc2VuZCB0aW1lciBleHBpcnkKLSAqIC0gbWF5IG5vdCB0YWtlIGNhbGwtPnN0YXRlX2xvY2sgYXMgdGhpcyBjYW4gZGVhZGxvY2sgYWdhaW5zdCBkZWxfdGltZXJfc3luYygpCi0gKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX3Jlc2VuZF90aW1lX2V4cGlyZWQodW5zaWduZWQgbG9uZyBfY2FsbCkKLXsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCA9IChzdHJ1Y3QgcnhycGNfY2FsbCAqKSBfY2FsbDsKLQotCV9lbnRlcigieyVkfSIsIGNhbGwtPmRlYnVnX2lkKTsKLQotCWlmIChjYWxsLT5zdGF0ZSA+PSBSWFJQQ19DQUxMX0NPTVBMRVRFKQotCQlyZXR1cm47Ci0KLQljbGVhcl9iaXQoUlhSUENfQ0FMTF9SVU5fUlRJTUVSLCAmY2FsbC0+ZmxhZ3MpOwotCWlmICghdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX0VWX1JFU0VORF9USU1FUiwgJmNhbGwtPmV2ZW50cykpCi0JCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7Ci19Ci0KLS8qCi0gKiBoYW5kbGUgQUNLIHRpbWVyIGV4cGlyeQotICovCi1zdGF0aWMgdm9pZCByeHJwY19hY2tfdGltZV9leHBpcmVkKHVuc2lnbmVkIGxvbmcgX2NhbGwpCi17Ci0Jc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwgPSAoc3RydWN0IHJ4cnBjX2NhbGwgKikgX2NhbGw7Ci0KLQlfZW50ZXIoInslZH0iLCBjYWxsLT5kZWJ1Z19pZCk7Ci0KLQlpZiAoY2FsbC0+c3RhdGUgPj0gUlhSUENfQ0FMTF9DT01QTEVURSkKLQkJcmV0dXJuOwotCi0JcmVhZF9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQlpZiAoY2FsbC0+c3RhdGUgPCBSWFJQQ19DQUxMX0NPTVBMRVRFICYmCi0JICAgICF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfRVZfQUNLLCAmY2FsbC0+ZXZlbnRzKSkKLQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQlyZWFkX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJd3JpdGVfdW5sb2NrKCZyeHJwY19jYWxsX2xvY2spOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2Nvbm5fY2xpZW50LmMgYi9uZXQvcnhycGMvY29ubl9jbGllbnQuYwppbmRleCA5ZTkxZjI3Li42MGVmOTYwIDEwMDY0NAotLS0gYS9uZXQvcnhycGMvY29ubl9jbGllbnQuYworKysgYi9uZXQvcnhycGMvY29ubl9jbGllbnQuYwpAQCAtNyw2ICs3LDY4IEBACiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQogICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCiAgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCisgKiBDbGllbnQgY29ubmVjdGlvbnMgbmVlZCB0byBiZSBjYWNoZWQgZm9yIGEgbGl0dGxlIHdoaWxlIGFmdGVyIHRoZXkndmUgbWFkZSBhCisgKiBjYWxsIHNvIGFzIHRvIGhhbmRsZSByZXRyYW5zbWl0dGVkIERBVEEgcGFja2V0cyBpbiBjYXNlIHRoZSBzZXJ2ZXIgZGlkbid0CisgKiByZWNlaXZlIHRoZSBmaW5hbCBBQ0sgb3IgdGVybWluYXRpbmcgQUJPUlQgd2Ugc2VudCBpdC4KKyAqCisgKiBDbGllbnQgY29ubmVjdGlvbnMgY2FuIGJlIGluIG9uZSBvZiBhIG51bWJlciBvZiBjYWNoZSBzdGF0ZXM6CisgKgorICogICgxKSBJTkFDVElWRSAtIFRoZSBjb25uZWN0aW9uIGlzIG5vdCBoZWxkIGluIGFueSBsaXN0IGFuZCBtYXkgbm90IGhhdmUgYmVlbgorICogICAgICBleHBvc2VkIHRvIHRoZSB3b3JsZC4gIElmIGl0IGhhcyBiZWVuIHByZXZpb3VzbHkgZXhwb3NlZCwgaXQgd2FzCisgKiAgICAgIGRpc2NhcmRlZCBmcm9tIHRoZSBpZGxlIGxpc3QgYWZ0ZXIgZXhwaXJpbmcuCisgKgorICogICgyKSBXQUlUSU5HIC0gVGhlIGNvbm5lY3Rpb24gaXMgd2FpdGluZyBmb3IgdGhlIG51bWJlciBvZiBjbGllbnQgY29ubnMgdG8KKyAqICAgICAgZHJvcCBiZWxvdyB0aGUgbWF4aW11bSBjYXBhY2l0eS4gIENhbGxzIG1heSBiZSBpbiBwcm9ncmVzcyB1cG9uIGl0IGZyb20KKyAqICAgICAgd2hlbiBpdCB3YXMgYWN0aXZlIGFuZCBnb3QgY3VsbGVkLgorICoKKyAqCVRoZSBjb25uZWN0aW9uIGlzIG9uIHRoZSByeHJwY193YWl0aW5nX2NsaWVudF9jb25ucyBsaXN0IHdoaWNoIGlzIGtlcHQKKyAqCWluIHRvLWJlLWdyYW50ZWQgb3JkZXIuICBDdWxsZWQgY29ubnMgd2l0aCB3YWl0ZXJzIGdvIHRvIHRoZSBiYWNrIG9mCisgKgl0aGUgcXVldWUganVzdCBsaWtlIG5ldyBjb25ucy4KKyAqCisgKiAgKDMpIEFDVElWRSAtIFRoZSBjb25uZWN0aW9uIGhhcyBhdCBsZWFzdCBvbmUgY2FsbCBpbiBwcm9ncmVzcyB1cG9uIGl0LCBpdAorICogICAgICBtYXkgZnJlZWx5IGdyYW50IGF2YWlsYWJsZSBjaGFubmVscyB0byBuZXcgY2FsbHMgYW5kIGNhbGxzIG1heSBiZQorICogICAgICB3YWl0aW5nIG9uIGl0IGZvciBjaGFubmVscyB0byBiZWNvbWUgYXZhaWxhYmxlLgorICoKKyAqCVRoZSBjb25uZWN0aW9uIGlzIG9uIHRoZSByeHJwY19hY3RpdmVfY2xpZW50X2Nvbm5zIGxpc3Qgd2hpY2ggaXMga2VwdAorICoJaW4gYWN0aXZhdGlvbiBvcmRlciBmb3IgY3VsbGluZyBwdXJwb3Nlcy4KKyAqCisgKglyeHJwY19ucl9hY3RpdmVfY2xpZW50X2Nvbm5zIGlzIGhlbGQgaW5jcmVtZW50ZWQgYWxzby4KKyAqCisgKiAgKDQpIENVTExFRCAtIFRoZSBjb25uZWN0aW9uIGdvdCBzdW1tYXJpbHkgY3VsbGVkIHRvIHRyeSBhbmQgZnJlZSB1cAorICogICAgICBjYXBhY2l0eS4gIENhbGxzIGN1cnJlbnRseSBpbiBwcm9ncmVzcyBvbiB0aGUgY29ubmVjdGlvbiBhcmUgYWxsb3dlZCB0bworICogICAgICBjb250aW51ZSwgYnV0IG5ldyBjYWxscyB3aWxsIGhhdmUgdG8gd2FpdC4gIFRoZXJlIGNhbiBiZSBubyB3YWl0ZXJzIGluCisgKiAgICAgIHRoaXMgc3RhdGUgLSB0aGUgY29ubiB3b3VsZCBoYXZlIHRvIGdvIHRvIHRoZSBXQUlUSU5HIHN0YXRlIGluc3RlYWQuCisgKgorICogICg1KSBJRExFIC0gVGhlIGNvbm5lY3Rpb24gaGFzIG5vIGNhbGxzIGluIHByb2dyZXNzIHVwb24gaXQgYW5kIG11c3QgaGF2ZQorICogICAgICBiZWVuIGV4cG9zZWQgdG8gdGhlIHdvcmxkIChpZS4gdGhlIEVYUE9TRUQgZmxhZyBtdXN0IGJlIHNldCkuICBXaGVuIGl0CisgKiAgICAgIGV4cGlyZXMsIHRoZSBFWFBPU0VEIGZsYWcgaXMgY2xlYXJlZCBhbmQgdGhlIGNvbm5lY3Rpb24gdHJhbnNpdGlvbnMgdG8KKyAqICAgICAgdGhlIElOQUNUSVZFIHN0YXRlLgorICoKKyAqCVRoZSBjb25uZWN0aW9uIGlzIG9uIHRoZSByeHJwY19pZGxlX2NsaWVudF9jb25ucyBsaXN0IHdoaWNoIGlzIGtlcHQgaW4KKyAqCW9yZGVyIG9mIGhvdyBzb29uIHRoZXknbGwgZXhwaXJlLgorICoKKyAqIFRoZXJlIGFyZSBmbGFncyBvZiByZWxldmFuY2UgdG8gdGhlIGNhY2hlOgorICoKKyAqICAoMSkgRVhQT1NFRCAtIFRoZSBjb25uZWN0aW9uIElEIGdvdCBleHBvc2VkIHRvIHRoZSB3b3JsZC4gIElmIHRoaXMgZmxhZyBpcworICogICAgICBzZXQsIGFuIGV4dHJhIHJlZiBpcyBhZGRlZCB0byB0aGUgY29ubmVjdGlvbiBwcmV2ZW50aW5nIGl0IGZyb20gYmVpbmcKKyAqICAgICAgcmVhcGVkIHdoZW4gaXQgaGFzIG5vIGNhbGxzIG91dHN0YW5kaW5nLiAgVGhpcyBmbGFnIGlzIGNsZWFyZWQgYW5kIHRoZQorICogICAgICByZWYgZHJvcHBlZCB3aGVuIGEgY29ubiBpcyBkaXNjYXJkZWQgZnJvbSB0aGUgaWRsZSBsaXN0LgorICoKKyAqICAgICAgVGhpcyBhbGxvd3MgdXMgdG8gbW92ZSB0ZXJtaW5hbCBjYWxsIHN0YXRlIHJldHJhbnNtaXNzaW9uIHRvIHRoZQorICogICAgICBjb25uZWN0aW9uIGFuZCB0byBkaXNjYXJkIHRoZSBjYWxsIGltbWVkaWF0ZWx5IHdlIHRoaW5rIGl0IGlzIGRvbmUKKyAqICAgICAgd2l0aC4gIEl0IGFsc28gZ2l2ZSB1cyBhIGNoYW5jZSB0byByZXVzZSB0aGUgY29ubmVjdGlvbi4KKyAqCisgKiAgKDIpIERPTlRfUkVVU0UgLSBUaGUgY29ubmVjdGlvbiBzaG91bGQgYmUgZGlzY2FyZGVkIGFzIHNvb24gYXMgcG9zc2libGUgYW5kCisgKiAgICAgIHNob3VsZCBub3QgYmUgcmV1c2VkLiAgVGhpcyBpcyBzZXQgd2hlbiBhbiBleGNsdXNpdmUgY29ubmVjdGlvbiBpcyB1c2VkCisgKiAgICAgIG9yIGEgY2FsbCBJRCBjb3VudGVyIG92ZXJmbG93cy4KKyAqCisgKiBUaGUgY2FjaGluZyBzdGF0ZSBtYXkgb25seSBiZSBjaGFuZ2VkIGlmIHRoZSBjYWNoZSBsb2NrIGlzIGhlbGQuCisgKgorICogVGhlcmUgYXJlIHR3byBpZGxlIGNsaWVudCBjb25uZWN0aW9uIGV4cGlyeSBkdXJhdGlvbnMuICBJZiB0aGUgdG90YWwgbnVtYmVyCisgKiBvZiBjb25uZWN0aW9ucyBpcyBiZWxvdyB0aGUgcmVhcCB0aHJlc2hvbGQsIHdlIHVzZSB0aGUgbm9ybWFsIGR1cmF0aW9uOyBpZgorICogaXQncyBhYm92ZSwgd2UgdXNlIHRoZSBmYXN0IGR1cmF0aW9uLgogICovCiAKICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKQEAgLTE2LDI3ICs3OCw1MCBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSAiYXItaW50ZXJuYWwuaCIKIAorX19yZWFkX21vc3RseSB1bnNpZ25lZCBpbnQgcnhycGNfbWF4X2NsaWVudF9jb25uZWN0aW9ucyA9IDEwMDA7CitfX3JlYWRfbW9zdGx5IHVuc2lnbmVkIGludCByeHJwY19yZWFwX2NsaWVudF9jb25uZWN0aW9ucyA9IDkwMDsKK19fcmVhZF9tb3N0bHkgdW5zaWduZWQgaW50IHJ4cnBjX2Nvbm5faWRsZV9jbGllbnRfZXhwaXJ5ID0gMiAqIDYwICogSFo7CitfX3JlYWRfbW9zdGx5IHVuc2lnbmVkIGludCByeHJwY19jb25uX2lkbGVfY2xpZW50X2Zhc3RfZXhwaXJ5ID0gMiAqIEhaOworCitzdGF0aWMgdW5zaWduZWQgaW50IHJ4cnBjX25yX2NsaWVudF9jb25uczsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcnhycGNfbnJfYWN0aXZlX2NsaWVudF9jb25uczsKK3N0YXRpYyBfX3JlYWRfbW9zdGx5IGJvb2wgcnhycGNfa2lsbF9hbGxfY2xpZW50X2Nvbm5zOworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJ4cnBjX2NsaWVudF9jb25uX2NhY2hlX2xvY2spOworc3RhdGljIERFRklORV9TUElOTE9DSyhyeHJwY19jbGllbnRfY29ubl9kaXNjYXJkX211dGV4KTsKK3N0YXRpYyBMSVNUX0hFQUQocnhycGNfd2FpdGluZ19jbGllbnRfY29ubnMpOworc3RhdGljIExJU1RfSEVBRChyeHJwY19hY3RpdmVfY2xpZW50X2Nvbm5zKTsKK3N0YXRpYyBMSVNUX0hFQUQocnhycGNfaWRsZV9jbGllbnRfY29ubnMpOworCiAvKgogICogV2UgdXNlIG1hY2hpbmUtdW5pcXVlIElEcyBmb3Igb3VyIGNsaWVudCBjb25uZWN0aW9ucy4KICAqLwogREVGSU5FX0lEUihyeHJwY19jbGllbnRfY29ubl9pZHMpOwogc3RhdGljIERFRklORV9TUElOTE9DSyhyeHJwY19jb25uX2lkX2xvY2spOwogCitzdGF0aWMgdm9pZCByeHJwY19jdWxsX2FjdGl2ZV9jbGllbnRfY29ubnModm9pZCk7CitzdGF0aWMgdm9pZCByeHJwY19kaXNjYXJkX2V4cGlyZWRfY2xpZW50X2Nvbm5zKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKKworc3RhdGljIERFQ0xBUkVfREVMQVlFRF9XT1JLKHJ4cnBjX2NsaWVudF9jb25uX3JlYXAsCisJCQkgICAgcnhycGNfZGlzY2FyZF9leHBpcmVkX2NsaWVudF9jb25ucyk7CisKK2NvbnN0IGNoYXIgcnhycGNfY29ubl9jYWNoZV9zdGF0ZXNbUlhSUENfQ09OTl9fTlJfQ0FDSEVfU1RBVEVTXVs1XSA9IHsKKwlbUlhSUENfQ09OTl9DTElFTlRfSU5BQ1RJVkVdCT0gIkluYWMiLAorCVtSWFJQQ19DT05OX0NMSUVOVF9XQUlUSU5HXQk9ICJXYWl0IiwKKwlbUlhSUENfQ09OTl9DTElFTlRfQUNUSVZFXQk9ICJBY3R2IiwKKwlbUlhSUENfQ09OTl9DTElFTlRfQ1VMTEVEXQk9ICJDdWxsIiwKKwlbUlhSUENfQ09OTl9DTElFTlRfSURMRV0JPSAiSWRsZSIsCit9OworCiAvKgogICogR2V0IGEgY29ubmVjdGlvbiBJRCBhbmQgZXBvY2ggZm9yIGEgY2xpZW50IGNvbm5lY3Rpb24gZnJvbSB0aGUgZ2xvYmFsIHBvb2wuCiAgKiBUaGUgY29ubmVjdGlvbiBzdHJ1Y3QgcG9pbnRlciBpcyB0aGVuIHJlY29yZGVkIGluIHRoZSBpZHIgcmFkaXggdHJlZS4gIFRoZQotICogZXBvY2ggaXMgY2hhbmdlZCBpZiB0aGlzIHdyYXBzLgotICoKLSAqIFRPRE86IFRoZSBJRFIgdHJlZSBnZXRzIHZlcnkgZXhwZW5zaXZlIG9uIG1lbW9yeSBpZiB0aGUgY29ubmVjdGlvbiBJRHMgYXJlCi0gKiB3aWRlbHkgc2NhdHRlcmVkIHRocm91Z2hvdXQgdGhlIG51bWJlciBzcGFjZSwgc28gd2Ugc2hhbGwgbmVlZCB0byByZXRpcmUKLSAqIGNvbm5lY3Rpb25zIHRoYXQgaGF2ZSwgc2F5LCBhbiBJRCBtb3JlIHRoYW4gZm91ciB0aW1lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YKLSAqIGNsaWVudCBjb25ucyBhd2F5IGZyb20gdGhlIGN1cnJlbnQgYWxsb2NhdGlvbiBwb2ludCB0byB0cnkgYW5kIGtlZXAgdGhlIElEcwotICogY29uY2VudHJhdGVkLiAgV2Ugd2lsbCBhbHNvIG5lZWQgdG8gcmV0aXJlIGNvbm5lY3Rpb25zIGZyb20gYW4gb2xkIGVwb2NoLgorICogZXBvY2ggZG9lc24ndCBjaGFuZ2UgdW50aWwgdGhlIGNsaWVudCBpcyByZWJvb3RlZCAob3IsIGF0IGxlYXN0LCB1bmxlc3MgdGhlCisgKiBtb2R1bGUgaXMgdW5sb2FkZWQpLgogICovCiBzdGF0aWMgaW50IHJ4cnBjX2dldF9jbGllbnRfY29ubmVjdGlvbl9pZChzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKIAkJCQkJICBnZnBfdCBnZnApCiB7Ci0JdTMyIGVwb2NoOwogCWludCBpZDsKIAogCV9lbnRlcigiIik7CkBAIC00NCwzNCArMTI5LDE4IEBACiAJaWRyX3ByZWxvYWQoZ2ZwKTsKIAlzcGluX2xvY2soJnJ4cnBjX2Nvbm5faWRfbG9jayk7CiAKLQllcG9jaCA9IHJ4cnBjX2Vwb2NoOwotCi0JLyogV2UgY291bGQgdXNlIGlkcl9hbGxvY19jeWNsaWMoKSBoZXJlLCBidXQgd2UgcmVhbGx5IG5lZWQgdG8ga25vdwotCSAqIHdoZW4gdGhlIHRoaW5nIHdyYXBzIHNvIHRoYXQgd2UgY2FuIGFkdmFuY2UgdGhlIGVwb2NoLgotCSAqLwotCWlmIChyeHJwY19jbGllbnRfY29ubl9pZHMuY3VyID09IDApCi0JCXJ4cnBjX2NsaWVudF9jb25uX2lkcy5jdXIgPSAxOwotCWlkID0gaWRyX2FsbG9jKCZyeHJwY19jbGllbnRfY29ubl9pZHMsIGNvbm4sCi0JCSAgICAgICByeHJwY19jbGllbnRfY29ubl9pZHMuY3VyLCAweDQwMDAwMDAwLCBHRlBfTk9XQUlUKTsKLQlpZiAoaWQgPCAwKSB7Ci0JCWlmIChpZCAhPSAtRU5PU1BDKQotCQkJZ290byBlcnJvcjsKLQkJaWQgPSBpZHJfYWxsb2MoJnJ4cnBjX2NsaWVudF9jb25uX2lkcywgY29ubiwKLQkJCSAgICAgICAxLCAweDQwMDAwMDAwLCBHRlBfTk9XQUlUKTsKLQkJaWYgKGlkIDwgMCkKLQkJCWdvdG8gZXJyb3I7Ci0JCWVwb2NoKys7Ci0JCXJ4cnBjX2Vwb2NoID0gZXBvY2g7Ci0JfQotCXJ4cnBjX2NsaWVudF9jb25uX2lkcy5jdXIgPSBpZCArIDE7CisJaWQgPSBpZHJfYWxsb2NfY3ljbGljKCZyeHJwY19jbGllbnRfY29ubl9pZHMsIGNvbm4sCisJCQkgICAgICAxLCAweDQwMDAwMDAwLCBHRlBfTk9XQUlUKTsKKwlpZiAoaWQgPCAwKQorCQlnb3RvIGVycm9yOwogCiAJc3Bpbl91bmxvY2soJnJ4cnBjX2Nvbm5faWRfbG9jayk7CiAJaWRyX3ByZWxvYWRfZW5kKCk7CiAKLQljb25uLT5wcm90by5lcG9jaCA9IGVwb2NoOworCWNvbm4tPnByb3RvLmVwb2NoID0gcnhycGNfZXBvY2g7CiAJY29ubi0+cHJvdG8uY2lkID0gaWQgPDwgUlhSUENfQ0lEU0hJRlQ7CiAJc2V0X2JpdChSWFJQQ19DT05OX0hBU19JRFIsICZjb25uLT5mbGFncyk7Ci0JX2xlYXZlKCIgW0NJRCAleDoleF0iLCBlcG9jaCwgY29ubi0+cHJvdG8uY2lkKTsKKwlfbGVhdmUoIiBbQ0lEICV4XSIsIGNvbm4tPnByb3RvLmNpZCk7CiAJcmV0dXJuIDA7CiAKIGVycm9yOgpAQCAtMTE0LDggKzE4Myw3IEBACiB9CiAKIC8qCi0gKiBBbGxvY2F0ZSBhIGNsaWVudCBjb25uZWN0aW9uLiAgVGhlIGNhbGxlciBtdXN0IHRha2UgY2FyZSB0byBjbGVhciBhbnkKLSAqIHBhZGRpbmcgYnl0ZXMgaW4gKmNwLgorICogQWxsb2NhdGUgYSBjbGllbnQgY29ubmVjdGlvbi4KICAqLwogc3RhdGljIHN0cnVjdCByeHJwY19jb25uZWN0aW9uICoKIHJ4cnBjX2FsbG9jX2NsaWVudF9jb25uZWN0aW9uKHN0cnVjdCByeHJwY19jb25uX3BhcmFtZXRlcnMgKmNwLCBnZnBfdCBnZnApCkBAIC0xMzEsNiArMTk5LDEwIEBACiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCX0KIAorCWF0b21pY19zZXQoJmNvbm4tPnVzYWdlLCAxKTsKKwlpZiAoY3AtPmV4Y2x1c2l2ZSkKKwkJX19zZXRfYml0KFJYUlBDX0NPTk5fRE9OVF9SRVVTRSwgJmNvbm4tPmZsYWdzKTsKKwogCWNvbm4tPnBhcmFtcwkJPSAqY3A7CiAJY29ubi0+b3V0X2NsaWVudGZsYWcJPSBSWFJQQ19DTElFTlRfSU5JVElBVEVEOwogCWNvbm4tPnN0YXRlCQk9IFJYUlBDX0NPTk5fQ0xJRU5UOwpAQCAtMTQ4LDcgKzIyMCw3IEBACiAJCWdvdG8gZXJyb3JfMjsKIAogCXdyaXRlX2xvY2soJnJ4cnBjX2Nvbm5lY3Rpb25fbG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgmY29ubi0+bGluaywgJnJ4cnBjX2Nvbm5lY3Rpb25zKTsKKwlsaXN0X2FkZF90YWlsKCZjb25uLT5wcm9jX2xpbmssICZyeHJwY19jb25uZWN0aW9uX3Byb2NfbGlzdCk7CiAJd3JpdGVfdW5sb2NrKCZyeHJwY19jb25uZWN0aW9uX2xvY2spOwogCiAJLyogV2Ugc3RlYWwgdGhlIGNhbGxlcidzIHBlZXIgcmVmLiAqLwpAQCAtMTU2LDYgKzIyOCw5IEBACiAJcnhycGNfZ2V0X2xvY2FsKGNvbm4tPnBhcmFtcy5sb2NhbCk7CiAJa2V5X2dldChjb25uLT5wYXJhbXMua2V5KTsKIAorCXRyYWNlX3J4cnBjX2Nvbm4oY29ubiwgcnhycGNfY29ubl9uZXdfY2xpZW50LCBhdG9taWNfcmVhZCgmY29ubi0+dXNhZ2UpLAorCQkJIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CisJdHJhY2VfcnhycGNfY2xpZW50KGNvbm4sIC0xLCByeHJwY19jbGllbnRfYWxsb2MpOwogCV9sZWF2ZSgiID0gJXAiLCBjb25uKTsKIAlyZXR1cm4gY29ubjsKIApAQCAtMTcwLDMyICsyNDUsNjggQEAKIH0KIAogLyoKLSAqIGZpbmQgYSBjb25uZWN0aW9uIGZvciBhIGNhbGwKLSAqIC0gY2FsbGVkIGluIHByb2Nlc3MgY29udGV4dCB3aXRoIElSUXMgZW5hYmxlZAorICogRGV0ZXJtaW5lIGlmIGEgY29ubmVjdGlvbiBtYXkgYmUgcmV1c2VkLgogICovCi1pbnQgcnhycGNfY29ubmVjdF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkgICAgICAgc3RydWN0IHJ4cnBjX2Nvbm5fcGFyYW1ldGVycyAqY3AsCi0JCSAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKnNyeCwKLQkJICAgICAgIGdmcF90IGdmcCkKK3N0YXRpYyBib29sIHJ4cnBjX21heV9yZXVzZV9jb25uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKQoreworCWludCBpZF9jdXJzb3IsIGlkLCBkaXN0YW5jZSwgbGltaXQ7CisKKwlpZiAodGVzdF9iaXQoUlhSUENfQ09OTl9ET05UX1JFVVNFLCAmY29ubi0+ZmxhZ3MpKQorCQlnb3RvIGRvbnRfcmV1c2U7CisKKwlpZiAoY29ubi0+cHJvdG8uZXBvY2ggIT0gcnhycGNfZXBvY2gpCisJCWdvdG8gbWFya19kb250X3JldXNlOworCisJLyogVGhlIElEUiB0cmVlIGdldHMgdmVyeSBleHBlbnNpdmUgb24gbWVtb3J5IGlmIHRoZSBjb25uZWN0aW9uIElEcyBhcmUKKwkgKiB3aWRlbHkgc2NhdHRlcmVkIHRocm91Z2hvdXQgdGhlIG51bWJlciBzcGFjZSwgc28gd2Ugc2hhbGwgd2FudCB0bworCSAqIGtpbGwgb2ZmIGNvbm5lY3Rpb25zIHRoYXQsIHNheSwgaGF2ZSBhbiBJRCBtb3JlIHRoYW4gYWJvdXQgZm91cgorCSAqIHRpbWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjbGllbnQgY29ubnMgYXdheSBmcm9tIHRoZSBjdXJyZW50CisJICogYWxsb2NhdGlvbiBwb2ludCB0byB0cnkgYW5kIGtlZXAgdGhlIElEcyBjb25jZW50cmF0ZWQuCisJICovCisJaWRfY3Vyc29yID0gUkVBRF9PTkNFKHJ4cnBjX2NsaWVudF9jb25uX2lkcy5jdXIpOworCWlkID0gY29ubi0+cHJvdG8uY2lkID4+IFJYUlBDX0NJRFNISUZUOworCWRpc3RhbmNlID0gaWQgLSBpZF9jdXJzb3I7CisJaWYgKGRpc3RhbmNlIDwgMCkKKwkJZGlzdGFuY2UgPSAtZGlzdGFuY2U7CisJbGltaXQgPSByb3VuZF91cChyeHJwY19tYXhfY2xpZW50X2Nvbm5lY3Rpb25zLCBJRFJfU0laRSkgKiA0OworCWlmIChkaXN0YW5jZSA+IGxpbWl0KQorCQlnb3RvIG1hcmtfZG9udF9yZXVzZTsKKworCXJldHVybiB0cnVlOworCittYXJrX2RvbnRfcmV1c2U6CisJc2V0X2JpdChSWFJQQ19DT05OX0RPTlRfUkVVU0UsICZjb25uLT5mbGFncyk7Citkb250X3JldXNlOgorCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIENyZWF0ZSBvciBmaW5kIGEgY2xpZW50IGNvbm5lY3Rpb24gdG8gdXNlIGZvciBhIGNhbGwuCisgKgorICogSWYgd2UgcmV0dXJuIHdpdGggYSBjb25uZWN0aW9uLCB0aGUgY2FsbCB3aWxsIGJlIG9uIGl0cyB3YWl0aW5nIGxpc3QuICBJdCdzCisgKiBsZWZ0IHRvIHRoZSBjYWxsZXIgdG8gYXNzaWduIGEgY2hhbm5lbCBhbmQgd2FrZSB1cCB0aGUgY2FsbC4KKyAqLworc3RhdGljIGludCByeHJwY19nZXRfY2xpZW50X2Nvbm4oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkJIHN0cnVjdCByeHJwY19jb25uX3BhcmFtZXRlcnMgKmNwLAorCQkJCSBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKnNyeCwKKwkJCQkgZ2ZwX3QgZ2ZwKQogewogCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLCAqY2FuZGlkYXRlID0gTlVMTDsKIAlzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsID0gY3AtPmxvY2FsOwogCXN0cnVjdCByYl9ub2RlICpwLCAqKnBwLCAqcGFyZW50OwogCWxvbmcgZGlmZjsKLQlpbnQgY2hhbjsKLQotCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7CisJaW50IHJldCA9IC1FTk9NRU07CiAKIAlfZW50ZXIoInslZCwlbHh9LCIsIGNhbGwtPmRlYnVnX2lkLCBjYWxsLT51c2VyX2NhbGxfSUQpOwogCiAJY3AtPnBlZXIgPSByeHJwY19sb29rdXBfcGVlcihjcC0+bG9jYWwsIHNyeCwgZ2ZwKTsKIAlpZiAoIWNwLT5wZWVyKQotCQlyZXR1cm4gLUVOT01FTTsKKwkJZ290byBlcnJvcjsKIAorCS8qIElmIHRoZSBjb25uZWN0aW9uIGlzIG5vdCBtZWFudCB0byBiZSBleGNsdXNpdmUsIHNlYXJjaCB0aGUgYXZhaWxhYmxlCisJICogY29ubmVjdGlvbnMgdG8gc2VlIGlmIHRoZSBjb25uZWN0aW9uIHdlIHdhbnQgdG8gdXNlIGFscmVhZHkgZXhpc3RzLgorCSAqLwogCWlmICghY3AtPmV4Y2x1c2l2ZSkgewotCQkvKiBTZWFyY2ggZm9yIGEgZXhpc3RpbmcgY2xpZW50IGNvbm5lY3Rpb24gdW5sZXNzIHRoaXMgaXMgZ29pbmcKLQkJICogdG8gYmUgYSBjb25uZWN0aW9uIHRoYXQncyB1c2VkIGV4Y2x1c2l2ZWx5IGZvciBhIHNpbmdsZSBjYWxsLgotCQkgKi8KIAkJX2RlYnVnKCJzZWFyY2ggMSIpOwogCQlzcGluX2xvY2soJmxvY2FsLT5jbGllbnRfY29ubnNfbG9jayk7CiAJCXAgPSBsb2NhbC0+Y2xpZW50X2Nvbm5zLnJiX25vZGU7CkBAIC0yMDYsMzkgKzMxNyw1NiBAQAogCQkJZGlmZiA9IChjbXAocGVlcikgPzoKIAkJCQljbXAoa2V5KSA/OgogCQkJCWNtcChzZWN1cml0eV9sZXZlbCkpOwotCQkJaWYgKGRpZmYgPCAwKQorI3VuZGVmIGNtcAorCQkJaWYgKGRpZmYgPCAwKSB7CiAJCQkJcCA9IHAtPnJiX2xlZnQ7Ci0JCQllbHNlIGlmIChkaWZmID4gMCkKKwkJCX0gZWxzZSBpZiAoZGlmZiA+IDApIHsKIAkJCQlwID0gcC0+cmJfcmlnaHQ7Ci0JCQllbHNlCi0JCQkJZ290byBmb3VuZF9leHRhbnRfY29ubjsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHJ4cnBjX21heV9yZXVzZV9jb25uKGNvbm4pICYmCisJCQkJICAgIHJ4cnBjX2dldF9jb25uZWN0aW9uX21heWJlKGNvbm4pKQorCQkJCQlnb3RvIGZvdW5kX2V4dGFudF9jb25uOworCQkJCS8qIFRoZSBjb25uZWN0aW9uIG5lZWRzIHJlcGxhY2luZy4gIEl0J3MgYmV0dGVyCisJCQkJICogdG8gZWZmZWN0IHRoYXQgd2hlbiB3ZSBoYXZlIHNvbWV0aGluZyB0bworCQkJCSAqIHJlcGxhY2UgaXQgd2l0aCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8KKwkJCQkgKiByZWJhbGFuY2UgdGhlIHRyZWUgdHdpY2UuCisJCQkJICovCisJCQkJYnJlYWs7CisJCQl9CiAJCX0KIAkJc3Bpbl91bmxvY2soJmxvY2FsLT5jbGllbnRfY29ubnNfbG9jayk7CiAJfQogCi0JLyogV2UgZGlkbid0IGZpbmQgYSBjb25uZWN0aW9uIG9yIHdlIHdhbnQgYW4gZXhjbHVzaXZlIG9uZS4gKi8KLQlfZGVidWcoImdldCBuZXcgY29ubiIpOworCS8qIFRoZXJlIHdhc24ndCBhIGNvbm5lY3Rpb24geWV0IG9yIHdlIG5lZWQgYW4gZXhjbHVzaXZlIGNvbm5lY3Rpb24uCisJICogV2UgbmVlZCB0byBjcmVhdGUgYSBjYW5kaWRhdGUgYW5kIHRoZW4gcG90ZW50aWFsbHkgcmVkbyB0aGUgc2VhcmNoCisJICogaW4gY2FzZSB3ZSdyZSByYWNpbmcgd2l0aCBhbm90aGVyIHRocmVhZCBhbHNvIHRyeWluZyB0byBjb25uZWN0IG9uIGEKKwkgKiBzaGFyZWFibGUgY29ubmVjdGlvbi4KKwkgKi8KKwlfZGVidWcoIm5ldyBjb25uIik7CiAJY2FuZGlkYXRlID0gcnhycGNfYWxsb2NfY2xpZW50X2Nvbm5lY3Rpb24oY3AsIGdmcCk7Ci0JaWYgKCFjYW5kaWRhdGUpIHsKLQkJX2xlYXZlKCIgPSAtRU5PTUVNIik7Ci0JCXJldHVybiAtRU5PTUVNOworCWlmIChJU19FUlIoY2FuZGlkYXRlKSkgeworCQlyZXQgPSBQVFJfRVJSKGNhbmRpZGF0ZSk7CisJCWdvdG8gZXJyb3JfcGVlcjsKIAl9CiAKKwkvKiBBZGQgdGhlIGNhbGwgdG8gdGhlIG5ldyBjb25uZWN0aW9uJ3Mgd2FpdGluZyBsaXN0IGluIGNhc2Ugd2UncmUKKwkgKiBnb2luZyB0byBoYXZlIHRvIHdhaXQgZm9yIHRoZSBjb25uZWN0aW9uIHRvIGNvbWUgbGl2ZS4gIEl0J3Mgb3VyCisJICogY29ubmVjdGlvbiwgc28gd2Ugd2FudCBmaXJzdCBkaWJzIG9uIHRoZSBjaGFubmVsIHNsb3RzLiAgV2Ugd291bGQKKwkgKiBub3JtYWxseSBoYXZlIHRvIHRha2UgY2hhbm5lbF9sb2NrIGJ1dCB3ZSBkbyB0aGlzIGJlZm9yZSBhbnlvbmUgZWxzZQorCSAqIGNhbiBzZWUgdGhlIGNvbm5lY3Rpb24uCisJICovCisJbGlzdF9hZGRfdGFpbCgmY2FsbC0+Y2hhbl93YWl0X2xpbmssICZjYW5kaWRhdGUtPndhaXRpbmdfY2FsbHMpOworCiAJaWYgKGNwLT5leGNsdXNpdmUpIHsKLQkJLyogQXNzaWduIHRoZSBjYWxsIG9uIGFuIGV4Y2x1c2l2ZSBjb25uZWN0aW9uIHRvIGNoYW5uZWwgMCBhbmQKLQkJICogZG9uJ3QgYWRkIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBlbmRwb2ludCdzIHNoYXJlYWJsZSBjb25uCi0JCSAqIGxvb2t1cCB0cmVlLgotCQkgKi8KLQkJX2RlYnVnKCJleGNsdXNpdmUgY2hhbiAwIik7Ci0JCWNvbm4gPSBjYW5kaWRhdGU7Ci0JCWF0b21pY19zZXQoJmNvbm4tPmF2YWlsX2NoYW5zLCBSWFJQQ19NQVhDQUxMUyAtIDEpOwotCQlzcGluX2xvY2soJmNvbm4tPmNoYW5uZWxfbG9jayk7Ci0JCWNoYW4gPSAwOwotCQlnb3RvIGZvdW5kX2NoYW5uZWw7CisJCWNhbGwtPmNvbm4gPSBjYW5kaWRhdGU7CisJCWNhbGwtPnNlY3VyaXR5X2l4ID0gY2FuZGlkYXRlLT5zZWN1cml0eV9peDsKKwkJX2xlYXZlKCIgPSAwIFtleGNsdXNpdmUgJWRdIiwgY2FuZGlkYXRlLT5kZWJ1Z19pZCk7CisJCXJldHVybiAwOwogCX0KIAotCS8qIFdlIG5lZWQgdG8gcmVkbyB0aGUgc2VhcmNoIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGFkZCBhIG5ldyBjb25uZWN0aW9uCi0JICogbGVzdCB3ZSByYWNlIHdpdGggc29tZW9uZSBlbHNlIGFkZGluZyBhIGNvbmZsaWN0aW5nIGluc3RhbmNlLgorCS8qIFB1Ymxpc2ggdGhlIG5ldyBjb25uZWN0aW9uIGZvciB1c2Vyc3BhY2UgdG8gZmluZC4gIFdlIG5lZWQgdG8gcmVkbworCSAqIHRoZSBzZWFyY2ggYmVmb3JlIGRvaW5nIHRoaXMgbGVzdCB3ZSByYWNlIHdpdGggc29tZW9uZSBlbHNlIGFkZGluZyBhCisJICogY29uZmxpY3RpbmcgaW5zdGFuY2UuCiAJICovCiAJX2RlYnVnKCJzZWFyY2ggMiIpOwogCXNwaW5fbG9jaygmbG9jYWwtPmNsaWVudF9jb25uc19sb2NrKTsKQEAgLTI0OSwxMjQgKzM3Nyw3MTEgQEAKIAkJcGFyZW50ID0gKnBwOwogCQljb25uID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwgY2xpZW50X25vZGUpOwogCisjZGVmaW5lIGNtcChYKSAoKGxvbmcpY29ubi0+cGFyYW1zLlggLSAobG9uZyljYW5kaWRhdGUtPnBhcmFtcy5YKQogCQlkaWZmID0gKGNtcChwZWVyKSA/OgogCQkJY21wKGtleSkgPzoKIAkJCWNtcChzZWN1cml0eV9sZXZlbCkpOwotCQlpZiAoZGlmZiA8IDApCisjdW5kZWYgY21wCisJCWlmIChkaWZmIDwgMCkgewogCQkJcHAgPSAmKCpwcCktPnJiX2xlZnQ7Ci0JCWVsc2UgaWYgKGRpZmYgPiAwKQorCQl9IGVsc2UgaWYgKGRpZmYgPiAwKSB7CiAJCQlwcCA9ICYoKnBwKS0+cmJfcmlnaHQ7Ci0JCWVsc2UKLQkJCWdvdG8gZm91bmRfZXh0YW50X2Nvbm47CisJCX0gZWxzZSB7CisJCQlpZiAocnhycGNfbWF5X3JldXNlX2Nvbm4oY29ubikgJiYKKwkJCSAgICByeHJwY19nZXRfY29ubmVjdGlvbl9tYXliZShjb25uKSkKKwkJCQlnb3RvIGZvdW5kX2V4dGFudF9jb25uOworCQkJLyogVGhlIG9sZCBjb25uZWN0aW9uIGlzIGZyb20gYW4gb3V0ZGF0ZWQgZXBvY2guICovCisJCQlfZGVidWcoInJlcGxhY2UgY29ubiIpOworCQkJY2xlYXJfYml0KFJYUlBDX0NPTk5fSU5fQ0xJRU5UX0NPTk5TLCAmY29ubi0+ZmxhZ3MpOworCQkJcmJfcmVwbGFjZV9ub2RlKCZjb25uLT5jbGllbnRfbm9kZSwKKwkJCQkJJmNhbmRpZGF0ZS0+Y2xpZW50X25vZGUsCisJCQkJCSZsb2NhbC0+Y2xpZW50X2Nvbm5zKTsKKwkJCXRyYWNlX3J4cnBjX2NsaWVudChjb25uLCAtMSwgcnhycGNfY2xpZW50X3JlcGxhY2UpOworCQkJZ290byBjYW5kaWRhdGVfcHVibGlzaGVkOworCQl9CiAJfQogCi0JLyogVGhlIHNlY29uZCBzZWFyY2ggYWxzbyBmYWlsZWQ7IHNpbXBseSBhZGQgdGhlIG5ldyBjb25uZWN0aW9uIHdpdGgKLQkgKiB0aGUgbmV3IGNhbGwgaW4gY2hhbm5lbCAwLiAgTm90ZSB0aGF0IHdlIG5lZWQgdG8gdGFrZSB0aGUgY2hhbm5lbAotCSAqIGxvY2sgYmVmb3JlIGRyb3BwaW5nIHRoZSBjbGllbnQgY29ubiBsb2NrLgotCSAqLwogCV9kZWJ1ZygibmV3IGNvbm4iKTsKLQlzZXRfYml0KFJYUlBDX0NPTk5fSU5fQ0xJRU5UX0NPTk5TLCAmY2FuZGlkYXRlLT5mbGFncyk7CiAJcmJfbGlua19ub2RlKCZjYW5kaWRhdGUtPmNsaWVudF9ub2RlLCBwYXJlbnQsIHBwKTsKIAlyYl9pbnNlcnRfY29sb3IoJmNhbmRpZGF0ZS0+Y2xpZW50X25vZGUsICZsb2NhbC0+Y2xpZW50X2Nvbm5zKTsKLWF0dGFjaGVkOgotCWNvbm4gPSBjYW5kaWRhdGU7Ci0JY2FuZGlkYXRlID0gTlVMTDsKIAotCWF0b21pY19zZXQoJmNvbm4tPmF2YWlsX2NoYW5zLCBSWFJQQ19NQVhDQUxMUyAtIDEpOwotCXNwaW5fbG9jaygmY29ubi0+Y2hhbm5lbF9sb2NrKTsKK2NhbmRpZGF0ZV9wdWJsaXNoZWQ6CisJc2V0X2JpdChSWFJQQ19DT05OX0lOX0NMSUVOVF9DT05OUywgJmNhbmRpZGF0ZS0+ZmxhZ3MpOworCWNhbGwtPmNvbm4gPSBjYW5kaWRhdGU7CisJY2FsbC0+c2VjdXJpdHlfaXggPSBjYW5kaWRhdGUtPnNlY3VyaXR5X2l4OwogCXNwaW5fdW5sb2NrKCZsb2NhbC0+Y2xpZW50X2Nvbm5zX2xvY2spOwotCWNoYW4gPSAwOwotCi1mb3VuZF9jaGFubmVsOgotCV9kZWJ1ZygiZm91bmQgY2hhbiIpOwotCWNhbGwtPmNvbm4JPSBjb25uOwotCWNhbGwtPmNoYW5uZWwJPSBjaGFuOwotCWNhbGwtPmVwb2NoCT0gY29ubi0+cHJvdG8uZXBvY2g7Ci0JY2FsbC0+Y2lkCT0gY29ubi0+cHJvdG8uY2lkIHwgY2hhbjsKLQljYWxsLT5jYWxsX2lkCT0gKytjb25uLT5jaGFubmVsc1tjaGFuXS5jYWxsX2NvdW50ZXI7Ci0JY29ubi0+Y2hhbm5lbHNbY2hhbl0uY2FsbF9pZCA9IGNhbGwtPmNhbGxfaWQ7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGNvbm4tPmNoYW5uZWxzW2NoYW5dLmNhbGwsIGNhbGwpOwotCi0JX25ldCgiQ09OTkVDVCBjYWxsICVkIG9uIGNvbm4gJWQiLCBjYWxsLT5kZWJ1Z19pZCwgY29ubi0+ZGVidWdfaWQpOwotCi0Jc3Bpbl91bmxvY2soJmNvbm4tPmNoYW5uZWxfbG9jayk7Ci0JcnhycGNfcHV0X3BlZXIoY3AtPnBlZXIpOwotCWNwLT5wZWVyID0gTlVMTDsKLQlfbGVhdmUoIiA9ICVwIHt1PSVkfSIsIGNvbm4sIGF0b21pY19yZWFkKCZjb25uLT51c2FnZSkpOworCV9sZWF2ZSgiID0gMCBbbmV3ICVkXSIsIGNhbmRpZGF0ZS0+ZGVidWdfaWQpOwogCXJldHVybiAwOwogCi0JLyogV2UgZm91bmQgYSBwb3RlbnRpYWxseSBzdWl0YWJsZSBjb25uZWN0aW9uIGFscmVhZHkgaW4gZXhpc3RlbmNlLiAgSWYKLQkgKiB3ZSBjYW4gcmV1c2UgaXQgKGllLiBpdHMgdXNhZ2UgY291bnQgaGFzbid0IGJlZW4gcmVkdWNlZCB0byAwIGJ5IHRoZQotCSAqIHJlYXBlciksIGRpc2NhcmQgYW55IGNhbmRpZGF0ZSB3ZSBtYXkgaGF2ZSBhbGxvY2F0ZWQsIGFuZCB0cnkgdG8gZ2V0Ci0JICogYSBjaGFubmVsIG9uIHRoaXMgb25lLCBvdGhlcndpc2Ugd2UgaGF2ZSB0byByZXBsYWNlIGl0LgorCS8qIFdlIGNvbWUgaGVyZSBpZiB3ZSBmb3VuZCBhIHN1aXRhYmxlIGNvbm5lY3Rpb24gYWxyZWFkeSBpbiBleGlzdGVuY2UuCisJICogRGlzY2FyZCBhbnkgY2FuZGlkYXRlIHdlIG1heSBoYXZlIGFsbG9jYXRlZCwgYW5kIHRyeSB0byBnZXQgYQorCSAqIGNoYW5uZWwgb24gdGhpcyBvbmUuCiAJICovCiBmb3VuZF9leHRhbnRfY29ubjoKIAlfZGVidWcoImZvdW5kIGNvbm4iKTsKLQlpZiAoIXJ4cnBjX2dldF9jb25uZWN0aW9uX21heWJlKGNvbm4pKSB7Ci0JCXNldF9iaXQoUlhSUENfQ09OTl9JTl9DTElFTlRfQ09OTlMsICZjYW5kaWRhdGUtPmZsYWdzKTsKLQkJcmJfcmVwbGFjZV9ub2RlKCZjb25uLT5jbGllbnRfbm9kZSwKLQkJCQkmY2FuZGlkYXRlLT5jbGllbnRfbm9kZSwKLQkJCQkmbG9jYWwtPmNsaWVudF9jb25ucyk7Ci0JCWNsZWFyX2JpdChSWFJQQ19DT05OX0lOX0NMSUVOVF9DT05OUywgJmNvbm4tPmZsYWdzKTsKLQkJZ290byBhdHRhY2hlZDsKLQl9Ci0KIAlzcGluX3VubG9jaygmbG9jYWwtPmNsaWVudF9jb25uc19sb2NrKTsKIAotCXJ4cnBjX3B1dF9jb25uZWN0aW9uKGNhbmRpZGF0ZSk7Ci0KLQlpZiAoIWF0b21pY19hZGRfdW5sZXNzKCZjb25uLT5hdmFpbF9jaGFucywgLTEsIDApKSB7Ci0JCWlmICghZ2ZwZmxhZ3NfYWxsb3dfYmxvY2tpbmcoZ2ZwKSkgewotCQkJcnhycGNfcHV0X2Nvbm5lY3Rpb24oY29ubik7Ci0JCQlfbGVhdmUoIiA9IC1FQUdBSU4iKTsKLQkJCXJldHVybiAtRUFHQUlOOwotCQl9Ci0KLQkJYWRkX3dhaXRfcXVldWUoJmNvbm4tPmNoYW5uZWxfd3EsICZteXNlbGYpOwotCQlmb3IgKDs7KSB7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJaWYgKGF0b21pY19hZGRfdW5sZXNzKCZjb25uLT5hdmFpbF9jaGFucywgLTEsIDApKQotCQkJCWJyZWFrOwotCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJCWdvdG8gaW50ZXJydXB0ZWQ7Ci0JCQlzY2hlZHVsZSgpOwotCQl9Ci0JCXJlbW92ZV93YWl0X3F1ZXVlKCZjb25uLT5jaGFubmVsX3dxLCAmbXlzZWxmKTsKLQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCWlmIChjYW5kaWRhdGUpIHsKKwkJdHJhY2VfcnhycGNfY2xpZW50KGNhbmRpZGF0ZSwgLTEsIHJ4cnBjX2NsaWVudF9kdXBsaWNhdGUpOworCQlyeHJwY19wdXRfY29ubmVjdGlvbihjYW5kaWRhdGUpOworCQljYW5kaWRhdGUgPSBOVUxMOwogCX0KIAotCS8qIFRoZSBjb25uZWN0aW9uIGFsbGVnZWRseSBub3cgaGFzIGEgZnJlZSBjaGFubmVsIGFuZCB3ZSBjYW4gbm93Ci0JICogYXR0YWNoIHRoZSBjYWxsIHRvIGl0LgotCSAqLwogCXNwaW5fbG9jaygmY29ubi0+Y2hhbm5lbF9sb2NrKTsKKwljYWxsLT5jb25uID0gY29ubjsKKwljYWxsLT5zZWN1cml0eV9peCA9IGNvbm4tPnNlY3VyaXR5X2l4OworCWxpc3RfYWRkKCZjYWxsLT5jaGFuX3dhaXRfbGluaywgJmNvbm4tPndhaXRpbmdfY2FsbHMpOworCXNwaW5fdW5sb2NrKCZjb25uLT5jaGFubmVsX2xvY2spOworCV9sZWF2ZSgiID0gMCBbZXh0YW50ICVkXSIsIGNvbm4tPmRlYnVnX2lkKTsKKwlyZXR1cm4gMDsKIAotCWZvciAoY2hhbiA9IDA7IGNoYW4gPCBSWFJQQ19NQVhDQUxMUzsgY2hhbisrKQotCQlpZiAoIWNvbm4tPmNoYW5uZWxzW2NoYW5dLmNhbGwpCi0JCQlnb3RvIGZvdW5kX2NoYW5uZWw7Ci0JQlVHKCk7Ci0KLWludGVycnVwdGVkOgotCXJlbW92ZV93YWl0X3F1ZXVlKCZjb25uLT5jaGFubmVsX3dxLCAmbXlzZWxmKTsKLQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JcnhycGNfcHV0X2Nvbm5lY3Rpb24oY29ubik7CitlcnJvcl9wZWVyOgogCXJ4cnBjX3B1dF9wZWVyKGNwLT5wZWVyKTsKIAljcC0+cGVlciA9IE5VTEw7Ci0JX2xlYXZlKCIgPSAtRVJFU1RBUlRTWVMiKTsKLQlyZXR1cm4gLUVSRVNUQVJUU1lTOworZXJyb3I6CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKLSAqIFJlbW92ZSBhIGNsaWVudCBjb25uZWN0aW9uIGZyb20gdGhlIGxvY2FsIGVuZHBvaW50J3MgdHJlZSwgdGhlcmVieSByZW1vdmluZwotICogaXQgYXMgYSB0YXJnZXQgZm9yIHJldXNlIGZvciBuZXcgY2xpZW50IGNhbGxzLgorICogQWN0aXZhdGUgYSBjb25uZWN0aW9uLgogICovCi12b2lkIHJ4cnBjX3VucHVibGlzaF9jbGllbnRfY29ubihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKK3N0YXRpYyB2b2lkIHJ4cnBjX2FjdGl2YXRlX2Nvbm4oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCiB7Ci0Jc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCA9IGNvbm4tPnBhcmFtcy5sb2NhbDsKKwl0cmFjZV9yeHJwY19jbGllbnQoY29ubiwgLTEsIHJ4cnBjX2NsaWVudF90b19hY3RpdmUpOworCWNvbm4tPmNhY2hlX3N0YXRlID0gUlhSUENfQ09OTl9DTElFTlRfQUNUSVZFOworCXJ4cnBjX25yX2FjdGl2ZV9jbGllbnRfY29ubnMrKzsKKwlsaXN0X21vdmVfdGFpbCgmY29ubi0+Y2FjaGVfbGluaywgJnJ4cnBjX2FjdGl2ZV9jbGllbnRfY29ubnMpOworfQogCi0Jc3Bpbl9sb2NrKCZsb2NhbC0+Y2xpZW50X2Nvbm5zX2xvY2spOwotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUlhSUENfQ09OTl9JTl9DTElFTlRfQ09OTlMsICZjb25uLT5mbGFncykpCi0JCXJiX2VyYXNlKCZjb25uLT5jbGllbnRfbm9kZSwgJmxvY2FsLT5jbGllbnRfY29ubnMpOwotCXNwaW5fdW5sb2NrKCZsb2NhbC0+Y2xpZW50X2Nvbm5zX2xvY2spOworLyoKKyAqIEF0dGVtcHQgdG8gYW5pbWF0ZSBhIGNvbm5lY3Rpb24gZm9yIGEgbmV3IGNhbGwuCisgKgorICogSWYgaXQncyBub3QgZXhjbHVzaXZlLCB0aGUgY29ubmVjdGlvbiBpcyBpbiB0aGUgZW5kcG9pbnQgdHJlZSwgYW5kIHdlJ3JlIGluCisgKiB0aGUgY29ubidzIGxpc3Qgb2YgdGhvc2Ugd2FpdGluZyB0byBncmFiIGEgY2hhbm5lbC4gIFRoZXJlIGlzLCBob3dldmVyLCBhCisgKiBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGxpdmUgY29ubmVjdGlvbnMgYWxsb3dlZCBhdCBhbnkgb25lIHRpbWUsIHNvIHdlIG1heQorICogaGF2ZSB0byB3YWl0IGZvciBjYXBhY2l0eSB0byBiZWNvbWUgYXZhaWxhYmxlLgorICoKKyAqIE5vdGUgdGhhdCBhIGNvbm5lY3Rpb24gb24gdGhlIHdhaXRpbmcgcXVldWUgbWlnaHQgKmFsc28qIGhhdmUgYWN0aXZlCisgKiBjaGFubmVscyBpZiBpdCBoYXMgYmVlbiBjdWxsZWQgdG8gbWFrZSBzcGFjZSBhbmQgdGhlbiByZS1yZXF1ZXN0ZWQgYnkgYSBuZXcKKyAqIGNhbGwuCisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX2FuaW1hdGVfY2xpZW50X2Nvbm4oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJdW5zaWduZWQgaW50IG5yX2Nvbm5zOworCisJX2VudGVyKCIlZCwlZCIsIGNvbm4tPmRlYnVnX2lkLCBjb25uLT5jYWNoZV9zdGF0ZSk7CisKKwlpZiAoY29ubi0+Y2FjaGVfc3RhdGUgPT0gUlhSUENfQ09OTl9DTElFTlRfQUNUSVZFKQorCQlnb3RvIG91dDsKKworCXNwaW5fbG9jaygmcnhycGNfY2xpZW50X2Nvbm5fY2FjaGVfbG9jayk7CisKKwlucl9jb25ucyA9IHJ4cnBjX25yX2NsaWVudF9jb25uczsKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ09OTl9DT1VOVEVELCAmY29ubi0+ZmxhZ3MpKSB7CisJCXRyYWNlX3J4cnBjX2NsaWVudChjb25uLCAtMSwgcnhycGNfY2xpZW50X2NvdW50KTsKKwkJcnhycGNfbnJfY2xpZW50X2Nvbm5zID0gbnJfY29ubnMgKyAxOworCX0KKworCXN3aXRjaCAoY29ubi0+Y2FjaGVfc3RhdGUpIHsKKwljYXNlIFJYUlBDX0NPTk5fQ0xJRU5UX0FDVElWRToKKwljYXNlIFJYUlBDX0NPTk5fQ0xJRU5UX1dBSVRJTkc6CisJCWJyZWFrOworCisJY2FzZSBSWFJQQ19DT05OX0NMSUVOVF9JTkFDVElWRToKKwljYXNlIFJYUlBDX0NPTk5fQ0xJRU5UX0NVTExFRDoKKwljYXNlIFJYUlBDX0NPTk5fQ0xJRU5UX0lETEU6CisJCWlmIChucl9jb25ucyA+PSByeHJwY19tYXhfY2xpZW50X2Nvbm5lY3Rpb25zKQorCQkJZ290byB3YWl0X2Zvcl9jYXBhY2l0eTsKKwkJZ290byBhY3RpdmF0ZV9jb25uOworCisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCitvdXRfdW5sb2NrOgorCXNwaW5fdW5sb2NrKCZyeHJwY19jbGllbnRfY29ubl9jYWNoZV9sb2NrKTsKK291dDoKKwlfbGVhdmUoIiBbJWRdIiwgY29ubi0+Y2FjaGVfc3RhdGUpOworCXJldHVybjsKKworYWN0aXZhdGVfY29ubjoKKwlfZGVidWcoImFjdGl2YXRlIik7CisJcnhycGNfYWN0aXZhdGVfY29ubihjb25uKTsKKwlnb3RvIG91dF91bmxvY2s7CisKK3dhaXRfZm9yX2NhcGFjaXR5OgorCV9kZWJ1Zygid2FpdCIpOworCXRyYWNlX3J4cnBjX2NsaWVudChjb25uLCAtMSwgcnhycGNfY2xpZW50X3RvX3dhaXRpbmcpOworCWNvbm4tPmNhY2hlX3N0YXRlID0gUlhSUENfQ09OTl9DTElFTlRfV0FJVElORzsKKwlsaXN0X21vdmVfdGFpbCgmY29ubi0+Y2FjaGVfbGluaywgJnJ4cnBjX3dhaXRpbmdfY2xpZW50X2Nvbm5zKTsKKwlnb3RvIG91dF91bmxvY2s7Cit9CisKKy8qCisgKiBEZWFjdGl2YXRlIGEgY2hhbm5lbC4KKyAqLworc3RhdGljIHZvaWQgcnhycGNfZGVhY3RpdmF0ZV9vbmVfY2hhbm5lbChzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKKwkJCQkJIHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCXN0cnVjdCByeHJwY19jaGFubmVsICpjaGFuID0gJmNvbm4tPmNoYW5uZWxzW2NoYW5uZWxdOworCisJcmN1X2Fzc2lnbl9wb2ludGVyKGNoYW4tPmNhbGwsIE5VTEwpOworCWNvbm4tPmFjdGl2ZV9jaGFucyAmPSB+KDEgPDwgY2hhbm5lbCk7Cit9CisKKy8qCisgKiBBc3NpZ24gYSBjaGFubmVsIHRvIHRoZSBjYWxsIGF0IHRoZSBmcm9udCBvZiB0aGUgcXVldWUgYW5kIHdha2UgdGhlIGNhbGwgdXAuCisgKiBXZSBkb24ndCBpbmNyZW1lbnQgdGhlIGNhbGxOdW1iZXIgY291bnRlciB1bnRpbCB0aGlzIG51bWJlciBoYXMgYmVlbiBleHBvc2VkCisgKiB0byB0aGUgd29ybGQuCisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX2FjdGl2YXRlX29uZV9jaGFubmVsKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgcnhycGNfY2hhbm5lbCAqY2hhbiA9ICZjb25uLT5jaGFubmVsc1tjaGFubmVsXTsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCA9IGxpc3RfZW50cnkoY29ubi0+d2FpdGluZ19jYWxscy5uZXh0LAorCQkJCQkgICAgIHN0cnVjdCByeHJwY19jYWxsLCBjaGFuX3dhaXRfbGluayk7CisJdTMyIGNhbGxfaWQgPSBjaGFuLT5jYWxsX2NvdW50ZXIgKyAxOworCisJdHJhY2VfcnhycGNfY2xpZW50KGNvbm4sIGNoYW5uZWwsIHJ4cnBjX2NsaWVudF9jaGFuX2FjdGl2YXRlKTsKKworCXdyaXRlX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9DTElFTlRfU0VORF9SRVFVRVNUOworCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisKKwlyeHJwY19zZWVfY2FsbChjYWxsKTsKKwlsaXN0X2RlbF9pbml0KCZjYWxsLT5jaGFuX3dhaXRfbGluayk7CisJY29ubi0+YWN0aXZlX2NoYW5zIHw9IDEgPDwgY2hhbm5lbDsKKwljYWxsLT5wZWVyCT0gcnhycGNfZ2V0X3BlZXIoY29ubi0+cGFyYW1zLnBlZXIpOworCWNhbGwtPmNpZAk9IGNvbm4tPnByb3RvLmNpZCB8IGNoYW5uZWw7CisJY2FsbC0+Y2FsbF9pZAk9IGNhbGxfaWQ7CisKKwlfbmV0KCJDT05ORUNUIGNhbGwgJTA4eDolMDh4IGFzIGNhbGwgJWQgb24gY29ubiAlZCIsCisJICAgICBjYWxsLT5jaWQsIGNhbGwtPmNhbGxfaWQsIGNhbGwtPmRlYnVnX2lkLCBjb25uLT5kZWJ1Z19pZCk7CisKKwkvKiBQYWlyZWQgd2l0aCB0aGUgcmVhZCBiYXJyaWVyIGluIHJ4cnBjX3dhaXRfZm9yX2NoYW5uZWwoKS4gIFRoaXMKKwkgKiBvcmRlcnMgY2lkIGFuZCBlcG9jaCBpbiB0aGUgY29ubmVjdGlvbiB3cnQgdG8gY2FsbF9pZCB3aXRob3V0IHRoZQorCSAqIG5lZWQgdG8gdGFrZSB0aGUgY2hhbm5lbF9sb2NrLgorCSAqCisJICogV2UgcHJvdmlzaW9uYWxseSBhc3NpZ24gYSBjYWxsTnVtYmVyIGF0IHRoaXMgcG9pbnQsIGJ1dCB3ZSBkb24ndAorCSAqIGNvbmZpcm0gaXQgdW50aWwgdGhlIGNhbGwgaXMgYWJvdXQgdG8gYmUgZXhwb3NlZC4KKwkgKgorCSAqIFRPRE86IFBhaXIgd2l0aCBhIGJhcnJpZXIgaW4gdGhlIGRhdGFfcmVhZHkgaGFuZGxlciB3aGVuIHRoYXQgbG9va3MKKwkgKiBhdCB0aGUgY2FsbCBJRCB0aHJvdWdoIGEgY29ubmVjdGlvbiBjaGFubmVsLgorCSAqLworCXNtcF93bWIoKTsKKwljaGFuLT5jYWxsX2lkCT0gY2FsbF9pZDsKKwlyY3VfYXNzaWduX3BvaW50ZXIoY2hhbi0+Y2FsbCwgY2FsbCk7CisJd2FrZV91cCgmY2FsbC0+d2FpdHEpOworfQorCisvKgorICogQXNzaWduIGNoYW5uZWxzIGFuZCBjYWxsTnVtYmVycyB0byB3YWl0aW5nIGNhbGxzIHdpdGggY2hhbm5lbF9sb2NrCisgKiBoZWxkIGJ5IGNhbGxlci4KKyAqLworc3RhdGljIHZvaWQgcnhycGNfYWN0aXZhdGVfY2hhbm5lbHNfbG9ja2VkKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKQoreworCXU4IGF2YWlsLCBtYXNrOworCisJc3dpdGNoIChjb25uLT5jYWNoZV9zdGF0ZSkgeworCWNhc2UgUlhSUENfQ09OTl9DTElFTlRfQUNUSVZFOgorCQltYXNrID0gUlhSUENfQUNUSVZFX0NIQU5TX01BU0s7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmNvbm4tPndhaXRpbmdfY2FsbHMpICYmCisJICAgICAgIChhdmFpbCA9IH5jb25uLT5hY3RpdmVfY2hhbnMsCisJCWF2YWlsICY9IG1hc2ssCisJCWF2YWlsICE9IDApKQorCQlyeHJwY19hY3RpdmF0ZV9vbmVfY2hhbm5lbChjb25uLCBfX2ZmcyhhdmFpbCkpOworfQorCisvKgorICogQXNzaWduIGNoYW5uZWxzIGFuZCBjYWxsTnVtYmVycyB0byB3YWl0aW5nIGNhbGxzLgorICovCitzdGF0aWMgdm9pZCByeHJwY19hY3RpdmF0ZV9jaGFubmVscyhzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKK3sKKwlfZW50ZXIoIiVkIiwgY29ubi0+ZGVidWdfaWQpOworCisJdHJhY2VfcnhycGNfY2xpZW50KGNvbm4sIC0xLCByeHJwY19jbGllbnRfYWN0aXZhdGVfY2hhbnMpOworCisJaWYgKGNvbm4tPmFjdGl2ZV9jaGFucyA9PSBSWFJQQ19BQ1RJVkVfQ0hBTlNfTUFTSykKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrKCZjb25uLT5jaGFubmVsX2xvY2spOworCXJ4cnBjX2FjdGl2YXRlX2NoYW5uZWxzX2xvY2tlZChjb25uKTsKKwlzcGluX3VubG9jaygmY29ubi0+Y2hhbm5lbF9sb2NrKTsKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogV2FpdCBmb3IgYSBjYWxsTnVtYmVyIGFuZCBhIGNoYW5uZWwgdG8gYmUgZ3JhbnRlZCB0byBhIGNhbGwuCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfd2FpdF9mb3JfY2hhbm5lbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgZ2ZwX3QgZ2ZwKQoreworCWludCByZXQgPSAwOworCisJX2VudGVyKCIlZCIsIGNhbGwtPmRlYnVnX2lkKTsKKworCWlmICghY2FsbC0+Y2FsbF9pZCkgeworCQlERUNMQVJFX1dBSVRRVUVVRShteXNlbGYsIGN1cnJlbnQpOworCisJCWlmICghZ2ZwZmxhZ3NfYWxsb3dfYmxvY2tpbmcoZ2ZwKSkgeworCQkJcmV0ID0gLUVBR0FJTjsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJYWRkX3dhaXRfcXVldWVfZXhjbHVzaXZlKCZjYWxsLT53YWl0cSwgJm15c2VsZik7CisJCWZvciAoOzspIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlpZiAoY2FsbC0+Y2FsbF9pZCkKKwkJCQlicmVhazsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNjaGVkdWxlKCk7CisJCX0KKwkJcmVtb3ZlX3dhaXRfcXVldWUoJmNhbGwtPndhaXRxLCAmbXlzZWxmKTsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCX0KKworCS8qIFBhaXJlZCB3aXRoIHRoZSB3cml0ZSBiYXJyaWVyIGluIHJ4cnBjX2FjdGl2YXRlX29uZV9jaGFubmVsKCkuICovCisJc21wX3JtYigpOworCitvdXQ6CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGZpbmQgYSBjb25uZWN0aW9uIGZvciBhIGNhbGwKKyAqIC0gY2FsbGVkIGluIHByb2Nlc3MgY29udGV4dCB3aXRoIElSUXMgZW5hYmxlZAorICovCitpbnQgcnhycGNfY29ubmVjdF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkgICAgICAgc3RydWN0IHJ4cnBjX2Nvbm5fcGFyYW1ldGVycyAqY3AsCisJCSAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKnNyeCwKKwkJICAgICAgIGdmcF90IGdmcCkKK3sKKwlpbnQgcmV0OworCisJX2VudGVyKCJ7JWQsJWx4fSwiLCBjYWxsLT5kZWJ1Z19pZCwgY2FsbC0+dXNlcl9jYWxsX0lEKTsKKworCXJ4cnBjX2Rpc2NhcmRfZXhwaXJlZF9jbGllbnRfY29ubnMoTlVMTCk7CisJcnhycGNfY3VsbF9hY3RpdmVfY2xpZW50X2Nvbm5zKCk7CisKKwlyZXQgPSByeHJwY19nZXRfY2xpZW50X2Nvbm4oY2FsbCwgY3AsIHNyeCwgZ2ZwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJ4cnBjX2FuaW1hdGVfY2xpZW50X2Nvbm4oY2FsbC0+Y29ubik7CisJcnhycGNfYWN0aXZhdGVfY2hhbm5lbHMoY2FsbC0+Y29ubik7CisKKwlyZXQgPSByeHJwY193YWl0X2Zvcl9jaGFubmVsKGNhbGwsIGdmcCk7CisJaWYgKHJldCA8IDApCisJCXJ4cnBjX2Rpc2Nvbm5lY3RfY2xpZW50X2NhbGwoY2FsbCk7CisKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogTm90ZSB0aGF0IGEgY29ubmVjdGlvbiBpcyBhYm91dCB0byBiZSBleHBvc2VkIHRvIHRoZSB3b3JsZC4gIE9uY2UgaXQgaXMKKyAqIGV4cG9zZWQsIHdlIG1haW50YWluIGFuIGV4dHJhIHJlZiBvbiBpdCB0aGF0IHN0b3BzIGl0IGZyb20gYmVpbmcgc3VtbWFyaWx5CisgKiBkaXNjYXJkZWQgYmVmb3JlIGl0J3MgKGEpIGhhZCBhIGNoYW5jZSB0byBkZWFsIHdpdGggcmV0cmFuc21pc3Npb24gYW5kIChiKQorICogaGFkIGEgY2hhbmNlIGF0IHJlLXVzZSAodGhlIHBlci1jb25uZWN0aW9uIHNlY3VyaXR5IG5lZ290aWF0aW9uIGlzCisgKiBleHBlbnNpdmUpLgorICovCitzdGF0aWMgdm9pZCByeHJwY19leHBvc2VfY2xpZW50X2Nvbm4oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkJICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ09OTl9FWFBPU0VELCAmY29ubi0+ZmxhZ3MpKSB7CisJCXRyYWNlX3J4cnBjX2NsaWVudChjb25uLCBjaGFubmVsLCByeHJwY19jbGllbnRfZXhwb3NlZCk7CisJCXJ4cnBjX2dldF9jb25uZWN0aW9uKGNvbm4pOworCX0KK30KKworLyoKKyAqIE5vdGUgdGhhdCBhIGNhbGwsIGFuZCB0aHVzIGEgY29ubmVjdGlvbiwgaXMgYWJvdXQgdG8gYmUgZXhwb3NlZCB0byB0aGUKKyAqIHdvcmxkLgorICovCit2b2lkIHJ4cnBjX2V4cG9zZV9jbGllbnRfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbCA9IGNhbGwtPmNpZCAmIFJYUlBDX0NIQU5ORUxNQVNLOworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uID0gY2FsbC0+Y29ubjsKKwlzdHJ1Y3QgcnhycGNfY2hhbm5lbCAqY2hhbiA9ICZjb25uLT5jaGFubmVsc1tjaGFubmVsXTsKKworCWlmICghdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX0VYUE9TRUQsICZjYWxsLT5mbGFncykpIHsKKwkJLyogTWFyayB0aGUgY2FsbCBJRCBhcyBiZWluZyB1c2VkLiAgSWYgdGhlIGNhbGxOdW1iZXIgY291bnRlcgorCQkgKiBleGNlZWRzIH4yIGJpbGxpb24sIHdlIGtpbGwgdGhlIGNvbm5lY3Rpb24gYWZ0ZXIgaXRzCisJCSAqIG91dHN0YW5kaW5nIGNhbGxzIGhhdmUgZmluaXNoZWQgc28gdGhhdCB0aGUgY291bnRlciBkb2Vzbid0CisJCSAqIHdyYXAuCisJCSAqLworCQljaGFuLT5jYWxsX2NvdW50ZXIrKzsKKwkJaWYgKGNoYW4tPmNhbGxfY291bnRlciA+PSBJTlRfTUFYKQorCQkJc2V0X2JpdChSWFJQQ19DT05OX0RPTlRfUkVVU0UsICZjb25uLT5mbGFncyk7CisJCXJ4cnBjX2V4cG9zZV9jbGllbnRfY29ubihjb25uLCBjaGFubmVsKTsKKwl9Cit9CisKKy8qCisgKiBEaXNjb25uZWN0IGEgY2xpZW50IGNhbGwuCisgKi8KK3ZvaWQgcnhycGNfZGlzY29ubmVjdF9jbGllbnRfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbCA9IGNhbGwtPmNpZCAmIFJYUlBDX0NIQU5ORUxNQVNLOworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uID0gY2FsbC0+Y29ubjsKKwlzdHJ1Y3QgcnhycGNfY2hhbm5lbCAqY2hhbiA9ICZjb25uLT5jaGFubmVsc1tjaGFubmVsXTsKKworCXRyYWNlX3J4cnBjX2NsaWVudChjb25uLCBjaGFubmVsLCByeHJwY19jbGllbnRfY2hhbl9kaXNjb25uZWN0KTsKKwljYWxsLT5jb25uID0gTlVMTDsKKworCXNwaW5fbG9jaygmY29ubi0+Y2hhbm5lbF9sb2NrKTsKKworCS8qIENhbGxzIHRoYXQgaGF2ZSBuZXZlciBhY3R1YWxseSBiZWVuIGFzc2lnbmVkIGEgY2hhbm5lbCBjYW4gc2ltcGx5IGJlCisJICogZGlzY2FyZGVkLiAgSWYgdGhlIGNvbm4gZGlkbid0IGdldCB1c2VkIGVpdGhlciwgaXQgd2lsbCBmb2xsb3cKKwkgKiBpbW1lZGlhdGVseSB1bmxlc3Mgc29tZW9uZSBlbHNlIGdyYWJzIGl0IGluIHRoZSBtZWFudGltZS4KKwkgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmNhbGwtPmNoYW5fd2FpdF9saW5rKSkgeworCQlfZGVidWcoImNhbGwgaXMgd2FpdGluZyIpOworCQlBU1NFUlRDTVAoY2FsbC0+Y2FsbF9pZCwgPT0sIDApOworCQlBU1NFUlQoIXRlc3RfYml0KFJYUlBDX0NBTExfRVhQT1NFRCwgJmNhbGwtPmZsYWdzKSk7CisJCWxpc3RfZGVsX2luaXQoJmNhbGwtPmNoYW5fd2FpdF9saW5rKTsKKworCQl0cmFjZV9yeHJwY19jbGllbnQoY29ubiwgY2hhbm5lbCwgcnhycGNfY2xpZW50X2NoYW5fdW5zdGFydGVkKTsKKworCQkvKiBXZSBtdXN0IGRlYWN0aXZhdGUgb3IgaWRsZSB0aGUgY29ubmVjdGlvbiBpZiBpdCdzIG5vdworCQkgKiB3YWl0aW5nIGZvciBub3RoaW5nLgorCQkgKi8KKwkJc3Bpbl9sb2NrKCZyeHJwY19jbGllbnRfY29ubl9jYWNoZV9sb2NrKTsKKwkJaWYgKGNvbm4tPmNhY2hlX3N0YXRlID09IFJYUlBDX0NPTk5fQ0xJRU5UX1dBSVRJTkcgJiYKKwkJICAgIGxpc3RfZW1wdHkoJmNvbm4tPndhaXRpbmdfY2FsbHMpICYmCisJCSAgICAhY29ubi0+YWN0aXZlX2NoYW5zKQorCQkJZ290byBpZGxlX2Nvbm5lY3Rpb247CisJCWdvdG8gb3V0OworCX0KKworCUFTU0VSVENNUChyY3VfYWNjZXNzX3BvaW50ZXIoY2hhbi0+Y2FsbCksID09LCBjYWxsKTsKKworCS8qIElmIGEgY2xpZW50IGNhbGwgd2FzIGV4cG9zZWQgdG8gdGhlIHdvcmxkLCB3ZSBzYXZlIHRoZSByZXN1bHQgZm9yCisJICogcmV0cmFuc21pc3Npb24uCisJICoKKwkgKiBXZSB1c2UgYSBiYXJyaWVyIGhlcmUgc28gdGhhdCB0aGUgY2FsbCBudW1iZXIgYW5kIGFib3J0IGNvZGUgY2FuIGJlCisJICogcmVhZCB3aXRob3V0IG5lZWRpbmcgdG8gdGFrZSBhIGxvY2suCisJICoKKwkgKiBUT0RPOiBNYWtlIHRoZSBpbmNvbWluZyBwYWNrZXQgaGFuZGxlciBjaGVjayB0aGlzIGFuZCBoYW5kbGUKKwkgKiB0ZXJtaW5hbCByZXRyYW5zbWlzc2lvbiB3aXRob3V0IHJlcXVpcmluZyBhY2Nlc3MgdG8gdGhlIGNhbGwuCisJICovCisJaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfRVhQT1NFRCwgJmNhbGwtPmZsYWdzKSkgeworCQlfZGVidWcoImV4cG9zZWQgJXUsJXUiLCBjYWxsLT5jYWxsX2lkLCBjYWxsLT5hYm9ydF9jb2RlKTsKKwkJX19yeHJwY19kaXNjb25uZWN0X2NhbGwoY29ubiwgY2FsbCk7CisJfQorCisJLyogU2VlIGlmIHdlIGNhbiBwYXNzIHRoZSBjaGFubmVsIGRpcmVjdGx5IHRvIGFub3RoZXIgY2FsbC4gKi8KKwlpZiAoY29ubi0+Y2FjaGVfc3RhdGUgPT0gUlhSUENfQ09OTl9DTElFTlRfQUNUSVZFICYmCisJICAgICFsaXN0X2VtcHR5KCZjb25uLT53YWl0aW5nX2NhbGxzKSkgeworCQl0cmFjZV9yeHJwY19jbGllbnQoY29ubiwgY2hhbm5lbCwgcnhycGNfY2xpZW50X2NoYW5fcGFzcyk7CisJCXJ4cnBjX2FjdGl2YXRlX29uZV9jaGFubmVsKGNvbm4sIGNoYW5uZWwpOworCQlnb3RvIG91dF8yOworCX0KKworCS8qIFRoaW5ncyBhcmUgbW9yZSBjb21wbGV4IGFuZCB3ZSBuZWVkIHRoZSBjYWNoZSBsb2NrLiAgV2UgbWlnaHQgYmUKKwkgKiBhYmxlIHRvIHNpbXBseSBpZGxlIHRoZSBjb25uIG9yIGl0IG1pZ2h0IG5vdyBiZSBsdXJraW5nIG9uIHRoZSB3YWl0CisJICogbGlzdC4gIEl0IG1pZ2h0IGV2ZW4gZ2V0IG1vdmVkIGJhY2sgdG8gdGhlIGFjdGl2ZSBsaXN0IHdoaWxzdCB3ZSdyZQorCSAqIHdhaXRpbmcgZm9yIHRoZSBsb2NrLgorCSAqLworCXNwaW5fbG9jaygmcnhycGNfY2xpZW50X2Nvbm5fY2FjaGVfbG9jayk7CisKKwlzd2l0Y2ggKGNvbm4tPmNhY2hlX3N0YXRlKSB7CisJY2FzZSBSWFJQQ19DT05OX0NMSUVOVF9BQ1RJVkU6CisJCWlmIChsaXN0X2VtcHR5KCZjb25uLT53YWl0aW5nX2NhbGxzKSkgeworCQkJcnhycGNfZGVhY3RpdmF0ZV9vbmVfY2hhbm5lbChjb25uLCBjaGFubmVsKTsKKwkJCWlmICghY29ubi0+YWN0aXZlX2NoYW5zKSB7CisJCQkJcnhycGNfbnJfYWN0aXZlX2NsaWVudF9jb25ucy0tOworCQkJCWdvdG8gaWRsZV9jb25uZWN0aW9uOworCQkJfQorCQkJZ290byBvdXQ7CisJCX0KKworCQl0cmFjZV9yeHJwY19jbGllbnQoY29ubiwgY2hhbm5lbCwgcnhycGNfY2xpZW50X2NoYW5fcGFzcyk7CisJCXJ4cnBjX2FjdGl2YXRlX29uZV9jaGFubmVsKGNvbm4sIGNoYW5uZWwpOworCQlnb3RvIG91dDsKKworCWNhc2UgUlhSUENfQ09OTl9DTElFTlRfQ1VMTEVEOgorCQlyeHJwY19kZWFjdGl2YXRlX29uZV9jaGFubmVsKGNvbm4sIGNoYW5uZWwpOworCQlBU1NFUlQobGlzdF9lbXB0eSgmY29ubi0+d2FpdGluZ19jYWxscykpOworCQlpZiAoIWNvbm4tPmFjdGl2ZV9jaGFucykKKwkJCWdvdG8gaWRsZV9jb25uZWN0aW9uOworCQlnb3RvIG91dDsKKworCWNhc2UgUlhSUENfQ09OTl9DTElFTlRfV0FJVElORzoKKwkJcnhycGNfZGVhY3RpdmF0ZV9vbmVfY2hhbm5lbChjb25uLCBjaGFubmVsKTsKKwkJZ290byBvdXQ7CisKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKK291dDoKKwlzcGluX3VubG9jaygmcnhycGNfY2xpZW50X2Nvbm5fY2FjaGVfbG9jayk7CitvdXRfMjoKKwlzcGluX3VubG9jaygmY29ubi0+Y2hhbm5lbF9sb2NrKTsKKwlyeHJwY19wdXRfY29ubmVjdGlvbihjb25uKTsKKwlfbGVhdmUoIiIpOworCXJldHVybjsKKworaWRsZV9jb25uZWN0aW9uOgorCS8qIEFzIG5vIGNoYW5uZWxzIHJlbWFpbiBhY3RpdmUsIHRoZSBjb25uZWN0aW9uIGdldHMgZGVhY3RpdmF0ZWQKKwkgKiBpbW1lZGlhdGVseSBvciBtb3ZlZCB0byB0aGUgaWRsZSBsaXN0IGZvciBhIHNob3J0IHdoaWxlLgorCSAqLworCWlmICh0ZXN0X2JpdChSWFJQQ19DT05OX0VYUE9TRUQsICZjb25uLT5mbGFncykpIHsKKwkJdHJhY2VfcnhycGNfY2xpZW50KGNvbm4sIGNoYW5uZWwsIHJ4cnBjX2NsaWVudF90b19pZGxlKTsKKwkJY29ubi0+aWRsZV90aW1lc3RhbXAgPSBqaWZmaWVzOworCQljb25uLT5jYWNoZV9zdGF0ZSA9IFJYUlBDX0NPTk5fQ0xJRU5UX0lETEU7CisJCWxpc3RfbW92ZV90YWlsKCZjb25uLT5jYWNoZV9saW5rLCAmcnhycGNfaWRsZV9jbGllbnRfY29ubnMpOworCQlpZiAocnhycGNfaWRsZV9jbGllbnRfY29ubnMubmV4dCA9PSAmY29ubi0+Y2FjaGVfbGluayAmJgorCQkgICAgIXJ4cnBjX2tpbGxfYWxsX2NsaWVudF9jb25ucykKKwkJCXF1ZXVlX2RlbGF5ZWRfd29yayhyeHJwY193b3JrcXVldWUsCisJCQkJCSAgICZyeHJwY19jbGllbnRfY29ubl9yZWFwLAorCQkJCQkgICByeHJwY19jb25uX2lkbGVfY2xpZW50X2V4cGlyeSk7CisJfSBlbHNlIHsKKwkJdHJhY2VfcnhycGNfY2xpZW50KGNvbm4sIGNoYW5uZWwsIHJ4cnBjX2NsaWVudF90b19pbmFjdGl2ZSk7CisJCWNvbm4tPmNhY2hlX3N0YXRlID0gUlhSUENfQ09OTl9DTElFTlRfSU5BQ1RJVkU7CisJCWxpc3RfZGVsX2luaXQoJmNvbm4tPmNhY2hlX2xpbmspOworCX0KKwlnb3RvIG91dDsKK30KKworLyoKKyAqIENsZWFuIHVwIGEgZGVhZCBjbGllbnQgY29ubmVjdGlvbi4KKyAqLworc3RhdGljIHN0cnVjdCByeHJwY19jb25uZWN0aW9uICoKK3J4cnBjX3B1dF9vbmVfY2xpZW50X2Nvbm4oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKm5leHQgPSBOVUxMOworCXN0cnVjdCByeHJwY19sb2NhbCAqbG9jYWwgPSBjb25uLT5wYXJhbXMubG9jYWw7CisJdW5zaWduZWQgaW50IG5yX2Nvbm5zOworCisJdHJhY2VfcnhycGNfY2xpZW50KGNvbm4sIC0xLCByeHJwY19jbGllbnRfY2xlYW51cCk7CisKKwlpZiAodGVzdF9iaXQoUlhSUENfQ09OTl9JTl9DTElFTlRfQ09OTlMsICZjb25uLT5mbGFncykpIHsKKwkJc3Bpbl9sb2NrKCZsb2NhbC0+Y2xpZW50X2Nvbm5zX2xvY2spOworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJYUlBDX0NPTk5fSU5fQ0xJRU5UX0NPTk5TLAorCQkJCSAgICAgICAmY29ubi0+ZmxhZ3MpKQorCQkJcmJfZXJhc2UoJmNvbm4tPmNsaWVudF9ub2RlLCAmbG9jYWwtPmNsaWVudF9jb25ucyk7CisJCXNwaW5fdW5sb2NrKCZsb2NhbC0+Y2xpZW50X2Nvbm5zX2xvY2spOworCX0KIAogCXJ4cnBjX3B1dF9jbGllbnRfY29ubmVjdGlvbl9pZChjb25uKTsKKworCUFTU0VSVENNUChjb25uLT5jYWNoZV9zdGF0ZSwgPT0sIFJYUlBDX0NPTk5fQ0xJRU5UX0lOQUNUSVZFKTsKKworCWlmICh0ZXN0X2JpdChSWFJQQ19DT05OX0NPVU5URUQsICZjb25uLT5mbGFncykpIHsKKwkJdHJhY2VfcnhycGNfY2xpZW50KGNvbm4sIC0xLCByeHJwY19jbGllbnRfdW5jb3VudCk7CisJCXNwaW5fbG9jaygmcnhycGNfY2xpZW50X2Nvbm5fY2FjaGVfbG9jayk7CisJCW5yX2Nvbm5zID0gLS1yeHJwY19ucl9jbGllbnRfY29ubnM7CisKKwkJaWYgKG5yX2Nvbm5zIDwgcnhycGNfbWF4X2NsaWVudF9jb25uZWN0aW9ucyAmJgorCQkgICAgIWxpc3RfZW1wdHkoJnJ4cnBjX3dhaXRpbmdfY2xpZW50X2Nvbm5zKSkgeworCQkJbmV4dCA9IGxpc3RfZW50cnkocnhycGNfd2FpdGluZ19jbGllbnRfY29ubnMubmV4dCwKKwkJCQkJICBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwgY2FjaGVfbGluayk7CisJCQlyeHJwY19nZXRfY29ubmVjdGlvbihuZXh0KTsKKwkJCXJ4cnBjX2FjdGl2YXRlX2Nvbm4obmV4dCk7CisJCX0KKworCQlzcGluX3VubG9jaygmcnhycGNfY2xpZW50X2Nvbm5fY2FjaGVfbG9jayk7CisJfQorCisJcnhycGNfa2lsbF9jb25uZWN0aW9uKGNvbm4pOworCWlmIChuZXh0KQorCQlyeHJwY19hY3RpdmF0ZV9jaGFubmVscyhuZXh0KTsKKworCS8qIFdlIG5lZWQgdG8gZ2V0IHJpZCBvZiB0aGUgdGVtcG9yYXJ5IHJlZiB3ZSB0b29rIHVwb24gbmV4dCwgYnV0IHdlCisJICogY2FuJ3QgY2FsbCByeHJwY19wdXRfY29ubmVjdGlvbigpIHJlY3Vyc2l2ZWx5LgorCSAqLworCXJldHVybiBuZXh0OworfQorCisvKgorICogQ2xlYW4gdXAgYSBkZWFkIGNsaWVudCBjb25uZWN0aW9ucy4KKyAqLwordm9pZCByeHJwY19wdXRfY2xpZW50X2Nvbm4oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJY29uc3Qgdm9pZCAqaGVyZSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKwlpbnQgbjsKKworCWRvIHsKKwkJbiA9IGF0b21pY19kZWNfcmV0dXJuKCZjb25uLT51c2FnZSk7CisJCXRyYWNlX3J4cnBjX2Nvbm4oY29ubiwgcnhycGNfY29ubl9wdXRfY2xpZW50LCBuLCBoZXJlKTsKKwkJaWYgKG4gPiAwKQorCQkJcmV0dXJuOworCQlBU1NFUlRDTVAobiwgPj0sIDApOworCisJCWNvbm4gPSByeHJwY19wdXRfb25lX2NsaWVudF9jb25uKGNvbm4pOworCX0gd2hpbGUgKGNvbm4pOworfQorCisvKgorICogS2lsbCB0aGUgbG9uZ2VzdC1hY3RpdmUgY2xpZW50IGNvbm5lY3Rpb25zIHRvIG1ha2Ugcm9vbSBmb3IgbmV3IG9uZXMuCisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX2N1bGxfYWN0aXZlX2NsaWVudF9jb25ucyh2b2lkKQoreworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOworCXVuc2lnbmVkIGludCBucl9jb25ucyA9IHJ4cnBjX25yX2NsaWVudF9jb25uczsKKwl1bnNpZ25lZCBpbnQgbnJfYWN0aXZlLCBsaW1pdDsKKworCV9lbnRlcigiIik7CisKKwlBU1NFUlRDTVAobnJfY29ubnMsID49LCAwKTsKKwlpZiAobnJfY29ubnMgPCByeHJwY19tYXhfY2xpZW50X2Nvbm5lY3Rpb25zKSB7CisJCV9sZWF2ZSgiIFtva10iKTsKKwkJcmV0dXJuOworCX0KKwlsaW1pdCA9IHJ4cnBjX3JlYXBfY2xpZW50X2Nvbm5lY3Rpb25zOworCisJc3Bpbl9sb2NrKCZyeHJwY19jbGllbnRfY29ubl9jYWNoZV9sb2NrKTsKKwlucl9hY3RpdmUgPSByeHJwY19ucl9hY3RpdmVfY2xpZW50X2Nvbm5zOworCisJd2hpbGUgKG5yX2FjdGl2ZSA+IGxpbWl0KSB7CisJCUFTU0VSVCghbGlzdF9lbXB0eSgmcnhycGNfYWN0aXZlX2NsaWVudF9jb25ucykpOworCQljb25uID0gbGlzdF9lbnRyeShyeHJwY19hY3RpdmVfY2xpZW50X2Nvbm5zLm5leHQsCisJCQkJICBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwgY2FjaGVfbGluayk7CisJCUFTU0VSVENNUChjb25uLT5jYWNoZV9zdGF0ZSwgPT0sIFJYUlBDX0NPTk5fQ0xJRU5UX0FDVElWRSk7CisKKwkJaWYgKGxpc3RfZW1wdHkoJmNvbm4tPndhaXRpbmdfY2FsbHMpKSB7CisJCQl0cmFjZV9yeHJwY19jbGllbnQoY29ubiwgLTEsIHJ4cnBjX2NsaWVudF90b19jdWxsZWQpOworCQkJY29ubi0+Y2FjaGVfc3RhdGUgPSBSWFJQQ19DT05OX0NMSUVOVF9DVUxMRUQ7CisJCQlsaXN0X2RlbF9pbml0KCZjb25uLT5jYWNoZV9saW5rKTsKKwkJfSBlbHNlIHsKKwkJCXRyYWNlX3J4cnBjX2NsaWVudChjb25uLCAtMSwgcnhycGNfY2xpZW50X3RvX3dhaXRpbmcpOworCQkJY29ubi0+Y2FjaGVfc3RhdGUgPSBSWFJQQ19DT05OX0NMSUVOVF9XQUlUSU5HOworCQkJbGlzdF9tb3ZlX3RhaWwoJmNvbm4tPmNhY2hlX2xpbmssCisJCQkJICAgICAgICZyeHJwY193YWl0aW5nX2NsaWVudF9jb25ucyk7CisJCX0KKworCQlucl9hY3RpdmUtLTsKKwl9CisKKwlyeHJwY19ucl9hY3RpdmVfY2xpZW50X2Nvbm5zID0gbnJfYWN0aXZlOworCXNwaW5fdW5sb2NrKCZyeHJwY19jbGllbnRfY29ubl9jYWNoZV9sb2NrKTsKKwlBU1NFUlRDTVAobnJfYWN0aXZlLCA+PSwgMCk7CisJX2xlYXZlKCIgW2N1bGxlZF0iKTsKK30KKworLyoKKyAqIERpc2NhcmQgZXhwaXJlZCBjbGllbnQgY29ubmVjdGlvbnMgZnJvbSB0aGUgaWRsZSBsaXN0LiAgRWFjaCBjb25uIGluIHRoZQorICogaWRsZSBsaXN0IGhhcyBiZWVuIGV4cG9zZWQgYW5kIGhvbGRzIGFuIGV4dHJhIHJlZiBiZWNhdXNlIG9mIHRoYXQuCisgKgorICogVGhpcyBtYXkgYmUgY2FsbGVkIGZyb20gY29ubiBzZXR1cCBvciBmcm9tIGEgd29yayBpdGVtIHNvIGNhbm5vdCBiZQorICogY29uc2lkZXJlZCBub24tcmVlbnRyYW50LgorICovCitzdGF0aWMgdm9pZCByeHJwY19kaXNjYXJkX2V4cGlyZWRfY2xpZW50X2Nvbm5zKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKKwl1bnNpZ25lZCBsb25nIGV4cGlyeSwgY29ubl9leHBpcmVzX2F0LCBub3c7CisJdW5zaWduZWQgaW50IG5yX2Nvbm5zOworCWJvb2wgZGlkX2Rpc2NhcmQgPSBmYWxzZTsKKworCV9lbnRlcigiJWMiLCB3b3JrID8gJ3cnIDogJ24nKTsKKworCWlmIChsaXN0X2VtcHR5KCZyeHJwY19pZGxlX2NsaWVudF9jb25ucykpIHsKKwkJX2xlYXZlKCIgW2VtcHR5XSIpOworCQlyZXR1cm47CisJfQorCisJLyogRG9uJ3QgZG91YmxlIHVwIG9uIHRoZSBkaXNjYXJkaW5nICovCisJaWYgKCFzcGluX3RyeWxvY2soJnJ4cnBjX2NsaWVudF9jb25uX2Rpc2NhcmRfbXV0ZXgpKSB7CisJCV9sZWF2ZSgiIFthbHJlYWR5XSIpOworCQlyZXR1cm47CisJfQorCisJLyogV2Uga2VlcCBhbiBlc3RpbWF0ZSBvZiB3aGF0IHRoZSBudW1iZXIgb2YgY29ubnMgb3VnaHQgdG8gYmUgYWZ0ZXIKKwkgKiB3ZSd2ZSBkaXNjYXJkZWQgc29tZSBzbyB0aGF0IHdlIGRvbid0IG92ZXJkbyB0aGUgZGlzY2FyZGluZy4KKwkgKi8KKwlucl9jb25ucyA9IHJ4cnBjX25yX2NsaWVudF9jb25uczsKKworbmV4dDoKKwlzcGluX2xvY2soJnJ4cnBjX2NsaWVudF9jb25uX2NhY2hlX2xvY2spOworCisJaWYgKGxpc3RfZW1wdHkoJnJ4cnBjX2lkbGVfY2xpZW50X2Nvbm5zKSkKKwkJZ290byBvdXQ7CisKKwljb25uID0gbGlzdF9lbnRyeShyeHJwY19pZGxlX2NsaWVudF9jb25ucy5uZXh0LAorCQkJICBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwgY2FjaGVfbGluayk7CisJQVNTRVJUKHRlc3RfYml0KFJYUlBDX0NPTk5fRVhQT1NFRCwgJmNvbm4tPmZsYWdzKSk7CisKKwlpZiAoIXJ4cnBjX2tpbGxfYWxsX2NsaWVudF9jb25ucykgeworCQkvKiBJZiB0aGUgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGlzIG92ZXIgdGhlIHJlYXAgbGltaXQsIHdlCisJCSAqIGV4cGVkaXRlIGRpc2NhcmQgYnkgcmVkdWNpbmcgdGhlIGV4cGlyeSB0aW1lb3V0LiAgV2UgbXVzdCwKKwkJICogaG93ZXZlciwgaGF2ZSBhdCBsZWFzdCBhIHNob3J0IGdyYWNlIHBlcmlvZCB0byBiZSBhYmxlIHRvIGRvCisJCSAqIGZpbmFsLUFDSyBvciBBQk9SVCByZXRyYW5zbWlzc2lvbi4KKwkJICovCisJCWV4cGlyeSA9IHJ4cnBjX2Nvbm5faWRsZV9jbGllbnRfZXhwaXJ5OworCQlpZiAobnJfY29ubnMgPiByeHJwY19yZWFwX2NsaWVudF9jb25uZWN0aW9ucykKKwkJCWV4cGlyeSA9IHJ4cnBjX2Nvbm5faWRsZV9jbGllbnRfZmFzdF9leHBpcnk7CisKKwkJY29ubl9leHBpcmVzX2F0ID0gY29ubi0+aWRsZV90aW1lc3RhbXAgKyBleHBpcnk7CisKKwkJbm93ID0gUkVBRF9PTkNFKGppZmZpZXMpOworCQlpZiAodGltZV9hZnRlcihjb25uX2V4cGlyZXNfYXQsIG5vdykpCisJCQlnb3RvIG5vdF95ZXRfZXhwaXJlZDsKKwl9CisKKwl0cmFjZV9yeHJwY19jbGllbnQoY29ubiwgLTEsIHJ4cnBjX2NsaWVudF9kaXNjYXJkKTsKKwlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChSWFJQQ19DT05OX0VYUE9TRUQsICZjb25uLT5mbGFncykpCisJCUJVRygpOworCWNvbm4tPmNhY2hlX3N0YXRlID0gUlhSUENfQ09OTl9DTElFTlRfSU5BQ1RJVkU7CisJbGlzdF9kZWxfaW5pdCgmY29ubi0+Y2FjaGVfbGluayk7CisKKwlzcGluX3VubG9jaygmcnhycGNfY2xpZW50X2Nvbm5fY2FjaGVfbG9jayk7CisKKwkvKiBXaGVuIHdlIGNsZWFyZWQgdGhlIEVYUE9TRUQgZmxhZywgd2UgdG9vayBvbiByZXNwb25zaWJpbGl0eSBmb3IgdGhlCisJICogcmVmZXJlbmNlIHRoYXQgdGhhdCBoYWQgb24gdGhlIHVzYWdlIGNvdW50LiAgV2UgZGVhbCB3aXRoIHRoYXQgaGVyZS4KKwkgKiBJZiBzb21lb25lIHJlLXNldHMgdGhlIGZsYWcgYW5kIHJlLWdldHMgdGhlIHJlZiwgdGhhdCdzIGZpbmUuCisJICovCisJcnhycGNfcHV0X2Nvbm5lY3Rpb24oY29ubik7CisJZGlkX2Rpc2NhcmQgPSB0cnVlOworCW5yX2Nvbm5zLS07CisJZ290byBuZXh0OworCitub3RfeWV0X2V4cGlyZWQ6CisJLyogVGhlIGNvbm5lY3Rpb24gYXQgdGhlIGZyb250IG9mIHRoZSBxdWV1ZSBoYXNuJ3QgeWV0IGV4cGlyZWQsIHNvCisJICogc2NoZWR1bGUgdGhlIHdvcmsgaXRlbSBmb3IgdGhhdCBwb2ludCBpZiB3ZSBkaXNjYXJkZWQgc29tZXRoaW5nLgorCSAqCisJICogV2UgZG9uJ3Qgd29ycnkgaWYgdGhlIHdvcmsgaXRlbSBpcyBhbHJlYWR5IHNjaGVkdWxlZCAtIGl0IGNhbiBsb29rCisJICogYWZ0ZXIgcmVzY2hlZHVsaW5nIGl0c2VsZiBhdCBhIGxhdGVyIHRpbWUuICBXZSBjb3VsZCBjYW5jZWwgaXQsIGJ1dAorCSAqIHRoZW4gdGhpbmdzIGdldCBtZXNzaWVyLgorCSAqLworCV9kZWJ1Zygibm90IHlldCIpOworCWlmICghcnhycGNfa2lsbF9hbGxfY2xpZW50X2Nvbm5zKQorCQlxdWV1ZV9kZWxheWVkX3dvcmsocnhycGNfd29ya3F1ZXVlLAorCQkJCSAgICZyeHJwY19jbGllbnRfY29ubl9yZWFwLAorCQkJCSAgIGNvbm5fZXhwaXJlc19hdCAtIG5vdyk7CisKK291dDoKKwlzcGluX3VubG9jaygmcnhycGNfY2xpZW50X2Nvbm5fY2FjaGVfbG9jayk7CisJc3Bpbl91bmxvY2soJnJ4cnBjX2NsaWVudF9jb25uX2Rpc2NhcmRfbXV0ZXgpOworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBQcmVlbXB0aXZlbHkgZGVzdHJveSBhbGwgdGhlIGNsaWVudCBjb25uZWN0aW9uIHJlY29yZHMgcmF0aGVyIHRoYW4gd2FpdGluZworICogZm9yIHRoZW0gdG8gdGltZSBvdXQKKyAqLwordm9pZCBfX2V4aXQgcnhycGNfZGVzdHJveV9hbGxfY2xpZW50X2Nvbm5lY3Rpb25zKHZvaWQpCit7CisJX2VudGVyKCIiKTsKKworCXNwaW5fbG9jaygmcnhycGNfY2xpZW50X2Nvbm5fY2FjaGVfbG9jayk7CisJcnhycGNfa2lsbF9hbGxfY2xpZW50X2Nvbm5zID0gdHJ1ZTsKKwlzcGluX3VubG9jaygmcnhycGNfY2xpZW50X2Nvbm5fY2FjaGVfbG9jayk7CisKKwljYW5jZWxfZGVsYXllZF93b3JrKCZyeHJwY19jbGllbnRfY29ubl9yZWFwKTsKKworCWlmICghcXVldWVfZGVsYXllZF93b3JrKHJ4cnBjX3dvcmtxdWV1ZSwgJnJ4cnBjX2NsaWVudF9jb25uX3JlYXAsIDApKQorCQlfZGVidWcoImRlc3Ryb3k6IHF1ZXVlIGZhaWxlZCIpOworCisJX2xlYXZlKCIiKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9jb25uX2V2ZW50LmMgYi9uZXQvcnhycGMvY29ubl9ldmVudC5jCmluZGV4IGNlZTBmMzUuLjNmOWQ4ZDcgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9jb25uX2V2ZW50LmMKKysrIGIvbmV0L3J4cnBjL2Nvbm5fZXZlbnQuYwpAQCAtMTUsMjAgKzE1LDEyOCBAQAogI2luY2x1ZGUgPGxpbnV4L25ldC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L2VycnF1ZXVlLmg+Ci0jaW5jbHVkZSA8bGludXgvdWRwLmg+Ci0jaW5jbHVkZSA8bGludXgvaW4uaD4KLSNpbmNsdWRlIDxsaW51eC9pbjYuaD4KLSNpbmNsdWRlIDxsaW51eC9pY21wLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgogCiAvKgorICogUmV0cmFuc21pdCB0ZXJtaW5hbCBBQ0sgb3IgQUJPUlQgb2YgdGhlIHByZXZpb3VzIGNhbGwuCisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX2Nvbm5fcmV0cmFuc21pdF9jYWxsKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKKwlzdHJ1Y3QgcnhycGNfY2hhbm5lbCAqY2hhbjsKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlzdHJ1Y3Qga3ZlYyBpb3Y7CisJc3RydWN0IHsKKwkJc3RydWN0IHJ4cnBjX3dpcmVfaGVhZGVyIHdoZHI7CisJCXVuaW9uIHsKKwkJCXN0cnVjdCB7CisJCQkJX19iZTMyIGNvZGU7CisJCQl9IGFib3J0OworCQkJc3RydWN0IHsKKwkJCQlzdHJ1Y3QgcnhycGNfYWNrcGFja2V0IGFjazsKKwkJCQl1OCBwYWRkaW5nWzNdOworCQkJCXN0cnVjdCByeHJwY19hY2tpbmZvIGluZm87CisJCQl9OworCQl9OworCX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgcGt0OworCXNpemVfdCBsZW47CisJdTMyIHNlcmlhbCwgbXR1LCBjYWxsX2lkOworCisJX2VudGVyKCIlZCIsIGNvbm4tPmRlYnVnX2lkKTsKKworCWNoYW4gPSAmY29ubi0+Y2hhbm5lbHNbc3AtPmhkci5jaWQgJiBSWFJQQ19DSEFOTkVMTUFTS107CisKKwkvKiBJZiB0aGUgbGFzdCBjYWxsIGdvdCBtb3ZlZCBvbiB3aGlsc3Qgd2Ugd2VyZSB3YWl0aW5nIHRvIHJ1biwganVzdAorCSAqIGlnbm9yZSB0aGlzIHBhY2tldC4KKwkgKi8KKwljYWxsX2lkID0gUkVBRF9PTkNFKGNoYW4tPmxhc3RfY2FsbCk7CisJLyogU3luYyB3aXRoIF9fcnhycGNfZGlzY29ubmVjdF9jYWxsKCkgKi8KKwlzbXBfcm1iKCk7CisJaWYgKGNhbGxfaWQgIT0gc3AtPmhkci5jYWxsTnVtYmVyKQorCQlyZXR1cm47CisKKwltc2cubXNnX25hbWUJPSAmY29ubi0+cGFyYW1zLnBlZXItPnNyeC50cmFuc3BvcnQ7CisJbXNnLm1zZ19uYW1lbGVuCT0gY29ubi0+cGFyYW1zLnBlZXItPnNyeC50cmFuc3BvcnRfbGVuOworCW1zZy5tc2dfY29udHJvbAk9IE5VTEw7CisJbXNnLm1zZ19jb250cm9sbGVuID0gMDsKKwltc2cubXNnX2ZsYWdzCT0gMDsKKworCXBrdC53aGRyLmVwb2NoCQk9IGh0b25sKHNwLT5oZHIuZXBvY2gpOworCXBrdC53aGRyLmNpZAkJPSBodG9ubChzcC0+aGRyLmNpZCk7CisJcGt0LndoZHIuY2FsbE51bWJlcgk9IGh0b25sKHNwLT5oZHIuY2FsbE51bWJlcik7CisJcGt0LndoZHIuc2VxCQk9IDA7CisJcGt0LndoZHIudHlwZQkJPSBjaGFuLT5sYXN0X3R5cGU7CisJcGt0LndoZHIuZmxhZ3MJCT0gY29ubi0+b3V0X2NsaWVudGZsYWc7CisJcGt0LndoZHIudXNlclN0YXR1cwk9IDA7CisJcGt0LndoZHIuc2VjdXJpdHlJbmRleAk9IGNvbm4tPnNlY3VyaXR5X2l4OworCXBrdC53aGRyLl9yc3ZkCQk9IDA7CisJcGt0LndoZHIuc2VydmljZUlkCT0gaHRvbnMoY2hhbi0+bGFzdF9zZXJ2aWNlX2lkKTsKKworCWxlbiA9IHNpemVvZihwa3Qud2hkcik7CisJc3dpdGNoIChjaGFuLT5sYXN0X3R5cGUpIHsKKwljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0FCT1JUOgorCQlwa3QuYWJvcnQuY29kZQk9IGh0b25sKGNoYW4tPmxhc3RfYWJvcnQpOworCQlsZW4gKz0gc2l6ZW9mKHBrdC5hYm9ydCk7CisJCWJyZWFrOworCisJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9BQ0s6CisJCW10dSA9IGNvbm4tPnBhcmFtcy5wZWVyLT5pZl9tdHU7CisJCW10dSAtPSBjb25uLT5wYXJhbXMucGVlci0+aGRyc2l6ZTsKKwkJcGt0LmFjay5idWZmZXJTcGFjZQk9IDA7CisJCXBrdC5hY2subWF4U2tldwkJPSBodG9ucyhza2ItPnByaW9yaXR5KTsKKwkJcGt0LmFjay5maXJzdFBhY2tldAk9IGh0b25sKGNoYW4tPmxhc3Rfc2VxKTsKKwkJcGt0LmFjay5wcmV2aW91c1BhY2tldAk9IGh0b25sKGNoYW4tPmxhc3Rfc2VxIC0gMSk7CisJCXBrdC5hY2suc2VyaWFsCQk9IGh0b25sKHNwLT5oZHIuc2VyaWFsKTsKKwkJcGt0LmFjay5yZWFzb24JCT0gUlhSUENfQUNLX0RVUExJQ0FURTsKKwkJcGt0LmFjay5uQWNrcwkJPSAwOworCQlwa3QuaW5mby5yeE1UVQkJPSBodG9ubChyeHJwY19yeF9tdHUpOworCQlwa3QuaW5mby5tYXhNVFUJCT0gaHRvbmwobXR1KTsKKwkJcGt0LmluZm8ucndpbmQJCT0gaHRvbmwocnhycGNfcnhfd2luZG93X3NpemUpOworCQlwa3QuaW5mby5qdW1ib19tYXgJPSBodG9ubChyeHJwY19yeF9qdW1ib19tYXgpOworCQlwa3Qud2hkci5mbGFncwkJfD0gUlhSUENfU0xPV19TVEFSVF9PSzsKKwkJbGVuICs9IHNpemVvZihwa3QuYWNrKSArIHNpemVvZihwa3QuaW5mbyk7CisJCWJyZWFrOworCX0KKworCS8qIFJlc3luYyB3aXRoIF9fcnhycGNfZGlzY29ubmVjdF9jYWxsKCkgYW5kIGNoZWNrIHRoYXQgdGhlIGxhc3QgY2FsbAorCSAqIGRpZG4ndCBnZXQgYWR2YW5jZWQgd2hpbHN0IHdlIHdlcmUgZmlsbGluZyBvdXQgdGhlIHBhY2tldHMuCisJICovCisJc21wX3JtYigpOworCWlmIChSRUFEX09OQ0UoY2hhbi0+bGFzdF9jYWxsKSAhPSBjYWxsX2lkKQorCQlyZXR1cm47CisKKwlpb3YuaW92X2Jhc2UJPSAmcGt0OworCWlvdi5pb3ZfbGVuCT0gbGVuOworCisJc2VyaWFsID0gYXRvbWljX2luY19yZXR1cm4oJmNvbm4tPnNlcmlhbCk7CisJcGt0LndoZHIuc2VyaWFsID0gaHRvbmwoc2VyaWFsKTsKKworCXN3aXRjaCAoY2hhbi0+bGFzdF90eXBlKSB7CisJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVDoKKwkJX3Byb3RvKCJUeCBBQk9SVCAlJSV1IHsgJWQgfSBbcmVdIiwgc2VyaWFsLCBjb25uLT5sb2NhbF9hYm9ydCk7CisJCWJyZWFrOworCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQUNLOgorCQl0cmFjZV9yeHJwY190eF9hY2soTlVMTCwgc2VyaWFsLCBjaGFuLT5sYXN0X3NlcSwgMCwKKwkJCQkgICBSWFJQQ19BQ0tfRFVQTElDQVRFLCAwKTsKKwkJX3Byb3RvKCJUeCBBQ0sgJSUldSBbcmVdIiwgc2VyaWFsKTsKKwkJYnJlYWs7CisJfQorCisJa2VybmVsX3NlbmRtc2coY29ubi0+cGFyYW1zLmxvY2FsLT5zb2NrZXQsICZtc2csICZpb3YsIDEsIGxlbik7CisJX2xlYXZlKCIiKTsKKwlyZXR1cm47Cit9CisKKy8qCiAgKiBwYXNzIGEgY29ubmVjdGlvbi1sZXZlbCBhYm9ydCBvbnRvIGFsbCBjYWxscyBvbiB0aGF0IGNvbm5lY3Rpb24KICAqLwotc3RhdGljIHZvaWQgcnhycGNfYWJvcnRfY2FsbHMoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sIGludCBzdGF0ZSwKLQkJCSAgICAgIHUzMiBhYm9ydF9jb2RlKQorc3RhdGljIHZvaWQgcnhycGNfYWJvcnRfY2FsbHMoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkgICAgICBlbnVtIHJ4cnBjX2NhbGxfY29tcGxldGlvbiBjb21wbCwKKwkJCSAgICAgIHUzMiBhYm9ydF9jb2RlLCBpbnQgZXJyb3IpCiB7CiAJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7CiAJaW50IGk7CkBAIC00MSwxOSArMTQ5LDE1IEBACiAJCWNhbGwgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKAogCQkJY29ubi0+Y2hhbm5lbHNbaV0uY2FsbCwKIAkJCWxvY2tkZXBfaXNfaGVsZCgmY29ubi0+Y2hhbm5lbF9sb2NrKSk7Ci0JCXdyaXRlX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCQlpZiAoY2FsbC0+c3RhdGUgPD0gUlhSUENfQ0FMTF9DT01QTEVURSkgewotCQkJY2FsbC0+c3RhdGUgPSBzdGF0ZTsKLQkJCWlmIChzdGF0ZSA9PSBSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRCkgewotCQkJCWNhbGwtPmxvY2FsX2Fib3J0ID0gY29ubi0+bG9jYWxfYWJvcnQ7Ci0JCQkJc2V0X2JpdChSWFJQQ19DQUxMX0VWX0NPTk5fQUJPUlQsICZjYWxsLT5ldmVudHMpOwotCQkJfSBlbHNlIHsKLQkJCQljYWxsLT5yZW1vdGVfYWJvcnQgPSBjb25uLT5yZW1vdGVfYWJvcnQ7Ci0JCQkJc2V0X2JpdChSWFJQQ19DQUxMX0VWX1JDVkRfQUJPUlQsICZjYWxsLT5ldmVudHMpOwotCQkJfQotCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwkJaWYgKGNhbGwpIHsKKwkJCWlmIChjb21wbCA9PSBSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRCkKKwkJCQl0cmFjZV9yeHJwY19hYm9ydCgiQ09OIiwgY2FsbC0+Y2lkLAorCQkJCQkJICBjYWxsLT5jYWxsX2lkLCAwLAorCQkJCQkJICBhYm9ydF9jb2RlLCBlcnJvcik7CisJCQlpZiAocnhycGNfc2V0X2NhbGxfY29tcGxldGlvbihjYWxsLCBjb21wbCwKKwkJCQkJCSAgICAgIGFib3J0X2NvZGUsIGVycm9yKSkKKwkJCQlyeHJwY19ub3RpZnlfc29ja2V0KGNhbGwpOwogCQl9Ci0JCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CiAJfQogCiAJc3Bpbl91bmxvY2soJmNvbm4tPmNoYW5uZWxfbG9jayk7CkBAIC03OCwxNyArMTgyLDE2IEBACiAKIAkvKiBnZW5lcmF0ZSBhIGNvbm5lY3Rpb24tbGV2ZWwgYWJvcnQgKi8KIAlzcGluX2xvY2tfYmgoJmNvbm4tPnN0YXRlX2xvY2spOwotCWlmIChjb25uLT5zdGF0ZSA8IFJYUlBDX0NPTk5fUkVNT1RFTFlfQUJPUlRFRCkgewotCQljb25uLT5zdGF0ZSA9IFJYUlBDX0NPTk5fTE9DQUxMWV9BQk9SVEVEOwotCQljb25uLT5lcnJvciA9IGVycm9yOwotCQlzcGluX3VubG9ja19iaCgmY29ubi0+c3RhdGVfbG9jayk7Ci0JfSBlbHNlIHsKKwlpZiAoY29ubi0+c3RhdGUgPj0gUlhSUENfQ09OTl9SRU1PVEVMWV9BQk9SVEVEKSB7CiAJCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5zdGF0ZV9sb2NrKTsKIAkJX2xlYXZlKCIgPSAwIFthbHJlYWR5IGRlYWRdIik7CiAJCXJldHVybiAwOwogCX0KIAotCXJ4cnBjX2Fib3J0X2NhbGxzKGNvbm4sIFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVELCBhYm9ydF9jb2RlKTsKKwljb25uLT5zdGF0ZSA9IFJYUlBDX0NPTk5fTE9DQUxMWV9BQk9SVEVEOworCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5zdGF0ZV9sb2NrKTsKKworCXJ4cnBjX2Fib3J0X2NhbGxzKGNvbm4sIFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVELCBhYm9ydF9jb2RlLCBlcnJvcik7CiAKIAltc2cubXNnX25hbWUJPSAmY29ubi0+cGFyYW1zLnBlZXItPnNyeC50cmFuc3BvcnQ7CiAJbXNnLm1zZ19uYW1lbGVuCT0gY29ubi0+cGFyYW1zLnBlZXItPnNyeC50cmFuc3BvcnRfbGVuOwpAQCAtMTMyLDE3ICsyMzUsMTggQEAKIAogLyoKICAqIG1hcmsgYSBjYWxsIGFzIGJlaW5nIG9uIGEgbm93LXNlY3VyZWQgY2hhbm5lbAotICogLSBtdXN0IGJlIGNhbGxlZCB3aXRoIHNvZnRpcnFzIGRpc2FibGVkCisgKiAtIG11c3QgYmUgY2FsbGVkIHdpdGggQkgncyBkaXNhYmxlZC4KICAqLwogc3RhdGljIHZvaWQgcnhycGNfY2FsbF9pc19zZWN1cmUoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCiB7CiAJX2VudGVyKCIlcCIsIGNhbGwpOwogCWlmIChjYWxsKSB7Ci0JCXJlYWRfbG9jaygmY2FsbC0+c3RhdGVfbG9jayk7Ci0JCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfQ09NUExFVEUgJiYKLQkJICAgICF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfRVZfU0VDVVJFRCwgJmNhbGwtPmV2ZW50cykpCi0JCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOwotCQlyZWFkX3VubG9jaygmY2FsbC0+c3RhdGVfbG9jayk7CisJCXdyaXRlX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCQlpZiAoY2FsbC0+c3RhdGUgPT0gUlhSUENfQ0FMTF9TRVJWRVJfU0VDVVJJTkcpIHsKKwkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9TRVJWRVJfQUNDRVBUSU5HOworCQkJcnhycGNfbm90aWZ5X3NvY2tldChjYWxsKTsKKwkJfQorCQl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwogCX0KIH0KIApAQCAtMTU5LDIyICsyNjMsMjggQEAKIAlpbnQgbG9vcCwgcmV0OwogCiAJaWYgKGNvbm4tPnN0YXRlID49IFJYUlBDX0NPTk5fUkVNT1RFTFlfQUJPUlRFRCkgewotCQlrbGVhdmUoIiA9IC1FQ09OTkFCT1JURUQgWyV1XSIsIGNvbm4tPnN0YXRlKTsKKwkJX2xlYXZlKCIgPSAtRUNPTk5BQk9SVEVEIFsldV0iLCBjb25uLT5zdGF0ZSk7CiAJCXJldHVybiAtRUNPTk5BQk9SVEVEOwogCX0KIAogCV9lbnRlcigieyVkfSx7JXUsJSUldX0sIiwgY29ubi0+ZGVidWdfaWQsIHNwLT5oZHIudHlwZSwgc3AtPmhkci5zZXJpYWwpOwogCiAJc3dpdGNoIChzcC0+aGRyLnR5cGUpIHsKKwljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0RBVEE6CisJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9BQ0s6CisJCXJ4cnBjX2Nvbm5fcmV0cmFuc21pdF9jYWxsKGNvbm4sIHNrYik7CisJCXJldHVybiAwOworCiAJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVDoKLQkJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCAmd3RtcCwgc2l6ZW9mKHd0bXApKSA8IDApCisJCWlmIChza2JfY29weV9iaXRzKHNrYiwgc2l6ZW9mKHN0cnVjdCByeHJwY193aXJlX2hlYWRlciksCisJCQkJICAmd3RtcCwgc2l6ZW9mKHd0bXApKSA8IDApCiAJCQlyZXR1cm4gLUVQUk9UTzsKIAkJYWJvcnRfY29kZSA9IG50b2hsKHd0bXApOwogCQlfcHJvdG8oIlJ4IEFCT1JUICUlJXUgeyBhYz0lZCB9Iiwgc3AtPmhkci5zZXJpYWwsIGFib3J0X2NvZGUpOwogCiAJCWNvbm4tPnN0YXRlID0gUlhSUENfQ09OTl9SRU1PVEVMWV9BQk9SVEVEOwogCQlyeHJwY19hYm9ydF9jYWxscyhjb25uLCBSWFJQQ19DQUxMX1JFTU9URUxZX0FCT1JURUQsCi0JCQkJICBhYm9ydF9jb2RlKTsKKwkJCQkgIGFib3J0X2NvZGUsIEVDT05OQUJPUlRFRCk7CiAJCXJldHVybiAtRUNPTk5BQk9SVEVEOwogCiAJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9DSEFMTEVOR0U6CkBAIC0xOTksMTQgKzMwOSwxNiBAQAogCiAJCWlmIChjb25uLT5zdGF0ZSA9PSBSWFJQQ19DT05OX1NFUlZJQ0VfQ0hBTExFTkdJTkcpIHsKIAkJCWNvbm4tPnN0YXRlID0gUlhSUENfQ09OTl9TRVJWSUNFOworCQkJc3Bpbl91bmxvY2soJmNvbm4tPnN0YXRlX2xvY2spOwogCQkJZm9yIChsb29wID0gMDsgbG9vcCA8IFJYUlBDX01BWENBTExTOyBsb29wKyspCiAJCQkJcnhycGNfY2FsbF9pc19zZWN1cmUoCiAJCQkJCXJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoCiAJCQkJCQljb25uLT5jaGFubmVsc1tsb29wXS5jYWxsLAogCQkJCQkJbG9ja2RlcF9pc19oZWxkKCZjb25uLT5jaGFubmVsX2xvY2spKSk7CisJCX0gZWxzZSB7CisJCQlzcGluX3VubG9jaygmY29ubi0+c3RhdGVfbG9jayk7CiAJCX0KIAotCQlzcGluX3VubG9jaygmY29ubi0+c3RhdGVfbG9jayk7CiAJCXNwaW5fdW5sb2NrKCZjb25uLT5jaGFubmVsX2xvY2spOwogCQlyZXR1cm4gMDsKIApAQCAtMjY5LDcgKzM4MSw3IEBACiAJdTMyIGFib3J0X2NvZGUgPSBSWF9QUk9UT0NPTF9FUlJPUjsKIAlpbnQgcmV0OwogCi0JX2VudGVyKCJ7JWR9IiwgY29ubi0+ZGVidWdfaWQpOworCXJ4cnBjX3NlZV9jb25uZWN0aW9uKGNvbm4pOwogCiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSWFJQQ19DT05OX0VWX0NIQUxMRU5HRSwgJmNvbm4tPmV2ZW50cykpCiAJCXJ4cnBjX3NlY3VyZV9jb25uZWN0aW9uKGNvbm4pOwpAQCAtMjc3LDYgKzM4OSw3IEBACiAJLyogZ28gdGhyb3VnaCB0aGUgY29ubi1sZXZlbCBldmVudCBwYWNrZXRzLCByZWxlYXNpbmcgdGhlIHJlZiBvbiB0aGlzCiAJICogY29ubmVjdGlvbiB0aGF0IGVhY2ggb25lIGhhcyB3aGVuIHdlJ3ZlIGZpbmlzaGVkIHdpdGggaXQgKi8KIAl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZjb25uLT5yeF9xdWV1ZSkpKSB7CisJCXJ4cnBjX3NlZV9za2Ioc2tiLCByeHJwY19za2Jfcnhfc2Vlbik7CiAJCXJldCA9IHJ4cnBjX3Byb2Nlc3NfZXZlbnQoY29ubiwgc2tiLCAmYWJvcnRfY29kZSk7CiAJCXN3aXRjaCAocmV0KSB7CiAJCWNhc2UgLUVQUk9UTzoKQEAgLTI4Nyw3ICs0MDAsNyBAQAogCQkJZ290byByZXF1ZXVlX2FuZF9sZWF2ZTsKIAkJY2FzZSAtRUNPTk5BQk9SVEVEOgogCQlkZWZhdWx0OgotCQkJcnhycGNfZnJlZV9za2Ioc2tiKTsKKwkJCXJ4cnBjX2ZyZWVfc2tiKHNrYiwgcnhycGNfc2tiX3J4X2ZyZWVkKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMzA0LDkxICs0MTcsNyBAQAogcHJvdG9jb2xfZXJyb3I6CiAJaWYgKHJ4cnBjX2Fib3J0X2Nvbm5lY3Rpb24oY29ubiwgLXJldCwgYWJvcnRfY29kZSkgPCAwKQogCQlnb3RvIHJlcXVldWVfYW5kX2xlYXZlOwotCXJ4cnBjX2ZyZWVfc2tiKHNrYik7CisJcnhycGNfZnJlZV9za2Ioc2tiLCByeHJwY19za2JfcnhfZnJlZWQpOwogCV9sZWF2ZSgiIFtFUFJPVE9dIik7CiAJZ290byBvdXQ7CiB9Ci0KLS8qCi0gKiBwdXQgYSBwYWNrZXQgdXAgZm9yIHRyYW5zcG9ydC1sZXZlbCBhYm9ydAotICovCi12b2lkIHJ4cnBjX3JlamVjdF9wYWNrZXQoc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlDSEVDS19TTEFCX09LQVkoJmxvY2FsLT51c2FnZSk7Ci0KLQlza2JfcXVldWVfdGFpbCgmbG9jYWwtPnJlamVjdF9xdWV1ZSwgc2tiKTsKLQlyeHJwY19xdWV1ZV9sb2NhbChsb2NhbCk7Ci19Ci0KLS8qCi0gKiByZWplY3QgcGFja2V0cyB0aHJvdWdoIHRoZSBsb2NhbCBlbmRwb2ludAotICovCi12b2lkIHJ4cnBjX3JlamVjdF9wYWNrZXRzKHN0cnVjdCByeHJwY19sb2NhbCAqbG9jYWwpCi17Ci0JdW5pb24gewotCQlzdHJ1Y3Qgc29ja2FkZHIgc2E7Ci0JCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47Ci0JfSBzYTsKLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOwotCXN0cnVjdCByeHJwY193aXJlX2hlYWRlciB3aGRyOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IG1zZ2hkciBtc2c7Ci0Jc3RydWN0IGt2ZWMgaW92WzJdOwotCXNpemVfdCBzaXplOwotCV9fYmUzMiBjb2RlOwotCi0JX2VudGVyKCIlZCIsIGxvY2FsLT5kZWJ1Z19pZCk7Ci0KLQlpb3ZbMF0uaW92X2Jhc2UgPSAmd2hkcjsKLQlpb3ZbMF0uaW92X2xlbiA9IHNpemVvZih3aGRyKTsKLQlpb3ZbMV0uaW92X2Jhc2UgPSAmY29kZTsKLQlpb3ZbMV0uaW92X2xlbiA9IHNpemVvZihjb2RlKTsKLQlzaXplID0gc2l6ZW9mKHdoZHIpICsgc2l6ZW9mKGNvZGUpOwotCi0JbXNnLm1zZ19uYW1lID0gJnNhOwotCW1zZy5tc2dfY29udHJvbCA9IE5VTEw7Ci0JbXNnLm1zZ19jb250cm9sbGVuID0gMDsKLQltc2cubXNnX2ZsYWdzID0gMDsKLQotCW1lbXNldCgmc2EsIDAsIHNpemVvZihzYSkpOwotCXNhLnNhLnNhX2ZhbWlseSA9IGxvY2FsLT5zcngudHJhbnNwb3J0LmZhbWlseTsKLQlzd2l0Y2ggKHNhLnNhLnNhX2ZhbWlseSkgewotCWNhc2UgQUZfSU5FVDoKLQkJbXNnLm1zZ19uYW1lbGVuID0gc2l6ZW9mKHNhLnNpbik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCW1zZy5tc2dfbmFtZWxlbiA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCW1lbXNldCgmd2hkciwgMCwgc2l6ZW9mKHdoZHIpKTsKLQl3aGRyLnR5cGUgPSBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVDsKLQotCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmxvY2FsLT5yZWplY3RfcXVldWUpKSkgewotCQlzcCA9IHJ4cnBjX3NrYihza2IpOwotCQlzd2l0Y2ggKHNhLnNhLnNhX2ZhbWlseSkgewotCQljYXNlIEFGX0lORVQ6Ci0JCQlzYS5zaW4uc2luX3BvcnQgPSB1ZHBfaGRyKHNrYiktPnNvdXJjZTsKLQkJCXNhLnNpbi5zaW5fYWRkci5zX2FkZHIgPSBpcF9oZHIoc2tiKS0+c2FkZHI7Ci0JCQljb2RlID0gaHRvbmwoc2tiLT5wcmlvcml0eSk7Ci0KLQkJCXdoZHIuZXBvY2gJPSBodG9ubChzcC0+aGRyLmVwb2NoKTsKLQkJCXdoZHIuY2lkCT0gaHRvbmwoc3AtPmhkci5jaWQpOwotCQkJd2hkci5jYWxsTnVtYmVyCT0gaHRvbmwoc3AtPmhkci5jYWxsTnVtYmVyKTsKLQkJCXdoZHIuc2VydmljZUlkCT0gaHRvbnMoc3AtPmhkci5zZXJ2aWNlSWQpOwotCQkJd2hkci5mbGFncwk9IHNwLT5oZHIuZmxhZ3M7Ci0JCQl3aGRyLmZsYWdzCV49IFJYUlBDX0NMSUVOVF9JTklUSUFURUQ7Ci0JCQl3aGRyLmZsYWdzCSY9IFJYUlBDX0NMSUVOVF9JTklUSUFURUQ7Ci0KLQkJCWtlcm5lbF9zZW5kbXNnKGxvY2FsLT5zb2NrZXQsICZtc2csIGlvdiwgMiwgc2l6ZSk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQotCQlyeHJwY19mcmVlX3NrYihza2IpOwotCX0KLQotCV9sZWF2ZSgiIik7Ci19CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvY29ubl9vYmplY3QuYyBiL25ldC9yeHJwYy9jb25uX29iamVjdC5jCmluZGV4IDg5NmQ4NDQuLmUxZTgzYWYgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9jb25uX29iamVjdC5jCisrKyBiL25ldC9yeHJwYy9jb25uX29iamVjdC5jCkBAIC0xLDYgKzEsNiBAQAotLyogUnhSUEMgdmlydHVhbCBjb25uZWN0aW9uIGhhbmRsZXIKKy8qIFJ4UlBDIHZpcnR1YWwgY29ubmVjdGlvbiBoYW5kbGVyLCBjb21tb24gYml0cy4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDE2IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0xNSw4ICsxNSw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L25ldC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPG5ldC9zb2NrLmg+Ci0jaW5jbHVkZSA8bmV0L2FmX3J4cnBjLmg+CiAjaW5jbHVkZSAiYXItaW50ZXJuYWwuaCIKIAogLyoKQEAgLTI3LDkgKzI1LDEyIEBACiBzdGF0aWMgdm9pZCByeHJwY19jb25uZWN0aW9uX3JlYXBlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiBMSVNUX0hFQUQocnhycGNfY29ubmVjdGlvbnMpOworTElTVF9IRUFEKHJ4cnBjX2Nvbm5lY3Rpb25fcHJvY19saXN0KTsKIERFRklORV9SV0xPQ0socnhycGNfY29ubmVjdGlvbl9sb2NrKTsKIHN0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyhyeHJwY19jb25uZWN0aW9uX3JlYXAsIHJ4cnBjX2Nvbm5lY3Rpb25fcmVhcGVyKTsKIAorc3RhdGljIHZvaWQgcnhycGNfZGVzdHJveV9jb25uZWN0aW9uKHN0cnVjdCByY3VfaGVhZCAqKTsKKwogLyoKICAqIGFsbG9jYXRlIGEgbmV3IGNvbm5lY3Rpb24KICAqLwpAQCAtNDEsMjEgKzQyLDE4IEBACiAKIAljb25uID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24pLCBnZnApOwogCWlmIChjb25uKSB7CisJCUlOSVRfTElTVF9IRUFEKCZjb25uLT5jYWNoZV9saW5rKTsKIAkJc3Bpbl9sb2NrX2luaXQoJmNvbm4tPmNoYW5uZWxfbG9jayk7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNvbm4tPmNoYW5uZWxfd3EpOworCQlJTklUX0xJU1RfSEVBRCgmY29ubi0+d2FpdGluZ19jYWxscyk7CiAJCUlOSVRfV09SSygmY29ubi0+cHJvY2Vzc29yLCAmcnhycGNfcHJvY2Vzc19jb25uZWN0aW9uKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmNvbm4tPnByb2NfbGluayk7CiAJCUlOSVRfTElTVF9IRUFEKCZjb25uLT5saW5rKTsKIAkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmY29ubi0+cnhfcXVldWUpOwogCQljb25uLT5zZWN1cml0eSA9ICZyeHJwY19ub19zZWN1cml0eTsKIAkJc3Bpbl9sb2NrX2luaXQoJmNvbm4tPnN0YXRlX2xvY2spOwotCQkvKiBXZSBtYWludGFpbiBhbiBleHRyYSByZWYgb24gdGhlIGNvbm5lY3Rpb24gd2hpbHN0IGl0IGlzCi0JCSAqIG9uIHRoZSByeHJwY19jb25uZWN0aW9ucyBsaXN0LgotCQkgKi8KLQkJYXRvbWljX3NldCgmY29ubi0+dXNhZ2UsIDIpOwogCQljb25uLT5kZWJ1Z19pZCA9IGF0b21pY19pbmNfcmV0dXJuKCZyeHJwY19kZWJ1Z19pZCk7Ci0JCWF0b21pY19zZXQoJmNvbm4tPmF2YWlsX2NoYW5zLCBSWFJQQ19NQVhDQUxMUyk7CiAJCWNvbm4tPnNpemVfYWxpZ24gPSA0OwotCQljb25uLT5oZWFkZXJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIpOworCQljb25uLT5pZGxlX3RpbWVzdGFtcCA9IGppZmZpZXM7CiAJfQogCiAJX2xlYXZlKCIgPSAlcHslZH0iLCBjb25uLCBjb25uID8gY29ubi0+ZGVidWdfaWQgOiAwKTsKQEAgLTEzNSw2ICsxMzMsMTYgQEAKIAkJCSAgICBzcngudHJhbnNwb3J0LnNpbi5zaW5fYWRkci5zX2FkZHIpCiAJCQkJZ290byBub3RfZm91bmQ7CiAJCQlicmVhazsKKyNpZmRlZiBDT05GSUdfQUZfUlhSUENfSVBWNgorCQljYXNlIEFGX0lORVQ2OgorCQkJaWYgKHBlZXItPnNyeC50cmFuc3BvcnQuc2luNi5zaW42X3BvcnQgIT0KKwkJCSAgICBzcngudHJhbnNwb3J0LnNpbjYuc2luNl9wb3J0IHx8CisJCQkgICAgbWVtY21wKCZwZWVyLT5zcngudHJhbnNwb3J0LnNpbjYuc2luNl9hZGRyLAorCQkJCSAgICZzcngudHJhbnNwb3J0LnNpbjYuc2luNl9hZGRyLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKSAhPSAwKQorCQkJCWdvdG8gbm90X2ZvdW5kOworCQkJYnJlYWs7CisjZW5kaWYKIAkJZGVmYXVsdDoKIAkJCUJVRygpOwogCQl9CkBAIC0xNTMsMjUgKzE2MSwzMiBAQAogICogdGVybWluYXRlcy4gIFRoZSBjYWxsZXIgbXVzdCBob2xkIHRoZSBjaGFubmVsX2xvY2sgYW5kIG11c3QgcmVsZWFzZSB0aGUKICAqIGNhbGwncyByZWYgb24gdGhlIGNvbm5lY3Rpb24uCiAgKi8KLXZvaWQgX19yeHJwY19kaXNjb25uZWN0X2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit2b2lkIF9fcnhycGNfZGlzY29ubmVjdF9jYWxsKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLAorCQkJICAgICBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKIHsKLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiA9IGNhbGwtPmNvbm47Ci0Jc3RydWN0IHJ4cnBjX2NoYW5uZWwgKmNoYW4gPSAmY29ubi0+Y2hhbm5lbHNbY2FsbC0+Y2hhbm5lbF07CisJc3RydWN0IHJ4cnBjX2NoYW5uZWwgKmNoYW4gPQorCQkmY29ubi0+Y2hhbm5lbHNbY2FsbC0+Y2lkICYgUlhSUENfQ0hBTk5FTE1BU0tdOwogCi0JX2VudGVyKCIlZCwlZCIsIGNvbm4tPmRlYnVnX2lkLCBjYWxsLT5jaGFubmVsKTsKKwlfZW50ZXIoIiVkLCV4IiwgY29ubi0+ZGVidWdfaWQsIGNhbGwtPmNpZCk7CiAKIAlpZiAocmN1X2FjY2Vzc19wb2ludGVyKGNoYW4tPmNhbGwpID09IGNhbGwpIHsKIAkJLyogU2F2ZSB0aGUgcmVzdWx0IG9mIHRoZSBjYWxsIHNvIHRoYXQgd2UgY2FuIHJlcGVhdCBpdCBpZiBuZWNlc3NhcnkKIAkJICogdGhyb3VnaCB0aGUgY2hhbm5lbCwgd2hpbHN0IGRpc3Bvc2luZyBvZiB0aGUgYWN0dWFsIGNhbGwgcmVjb3JkLgogCQkgKi8KLQkJY2hhbi0+bGFzdF9yZXN1bHQgPSBjYWxsLT5sb2NhbF9hYm9ydDsKKwkJY2hhbi0+bGFzdF9zZXJ2aWNlX2lkID0gY2FsbC0+c2VydmljZV9pZDsKKwkJaWYgKGNhbGwtPmFib3J0X2NvZGUpIHsKKwkJCWNoYW4tPmxhc3RfYWJvcnQgPSBjYWxsLT5hYm9ydF9jb2RlOworCQkJY2hhbi0+bGFzdF90eXBlID0gUlhSUENfUEFDS0VUX1RZUEVfQUJPUlQ7CisJCX0gZWxzZSB7CisJCQljaGFuLT5sYXN0X3NlcSA9IGNhbGwtPnJ4X2hhcmRfYWNrOworCQkJY2hhbi0+bGFzdF90eXBlID0gUlhSUENfUEFDS0VUX1RZUEVfQUNLOworCQl9CisJCS8qIFN5bmMgd2l0aCByeHJwY19jb25uX3JldHJhbnNtaXQoKS4gKi8KIAkJc21wX3dtYigpOwogCQljaGFuLT5sYXN0X2NhbGwgPSBjaGFuLT5jYWxsX2lkOwogCQljaGFuLT5jYWxsX2lkID0gY2hhbi0+Y2FsbF9jb3VudGVyOwogCiAJCXJjdV9hc3NpZ25fcG9pbnRlcihjaGFuLT5jYWxsLCBOVUxMKTsKLQkJYXRvbWljX2luYygmY29ubi0+YXZhaWxfY2hhbnMpOwotCQl3YWtlX3VwKCZjb25uLT5jaGFubmVsX3dxKTsKIAl9CiAKIAlfbGVhdmUoIiIpOwpAQCAtMTg1LDM0ICsyMDAsMTIyIEBACiB7CiAJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4gPSBjYWxsLT5jb25uOwogCisJc3Bpbl9sb2NrX2JoKCZjb25uLT5wYXJhbXMucGVlci0+bG9jayk7CisJaGxpc3RfZGVsX2luaXQoJmNhbGwtPmVycm9yX2xpbmspOworCXNwaW5fdW5sb2NrX2JoKCZjb25uLT5wYXJhbXMucGVlci0+bG9jayk7CisKKwlpZiAocnhycGNfaXNfY2xpZW50X2NhbGwoY2FsbCkpCisJCXJldHVybiByeHJwY19kaXNjb25uZWN0X2NsaWVudF9jYWxsKGNhbGwpOworCiAJc3Bpbl9sb2NrKCZjb25uLT5jaGFubmVsX2xvY2spOwotCV9fcnhycGNfZGlzY29ubmVjdF9jYWxsKGNhbGwpOworCV9fcnhycGNfZGlzY29ubmVjdF9jYWxsKGNvbm4sIGNhbGwpOwogCXNwaW5fdW5sb2NrKCZjb25uLT5jaGFubmVsX2xvY2spOwogCiAJY2FsbC0+Y29ubiA9IE5VTEw7CisJY29ubi0+aWRsZV90aW1lc3RhbXAgPSBqaWZmaWVzOwogCXJ4cnBjX3B1dF9jb25uZWN0aW9uKGNvbm4pOwogfQogCiAvKgotICogcmVsZWFzZSBhIHZpcnR1YWwgY29ubmVjdGlvbgorICogS2lsbCBvZmYgYSBjb25uZWN0aW9uLgogICovCi12b2lkIHJ4cnBjX3B1dF9jb25uZWN0aW9uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKQordm9pZCByeHJwY19raWxsX2Nvbm5lY3Rpb24oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCiB7Ci0JaWYgKCFjb25uKQotCQlyZXR1cm47CisJQVNTRVJUKCFyY3VfYWNjZXNzX3BvaW50ZXIoY29ubi0+Y2hhbm5lbHNbMF0uY2FsbCkgJiYKKwkgICAgICAgIXJjdV9hY2Nlc3NfcG9pbnRlcihjb25uLT5jaGFubmVsc1sxXS5jYWxsKSAmJgorCSAgICAgICAhcmN1X2FjY2Vzc19wb2ludGVyKGNvbm4tPmNoYW5uZWxzWzJdLmNhbGwpICYmCisJICAgICAgICFyY3VfYWNjZXNzX3BvaW50ZXIoY29ubi0+Y2hhbm5lbHNbM10uY2FsbCkpOworCUFTU0VSVChsaXN0X2VtcHR5KCZjb25uLT5jYWNoZV9saW5rKSk7CiAKLQlfZW50ZXIoIiVwe3U9JWQsZD0lZH0iLAotCSAgICAgICBjb25uLCBhdG9taWNfcmVhZCgmY29ubi0+dXNhZ2UpLCBjb25uLT5kZWJ1Z19pZCk7CisJd3JpdGVfbG9jaygmcnhycGNfY29ubmVjdGlvbl9sb2NrKTsKKwlsaXN0X2RlbF9pbml0KCZjb25uLT5wcm9jX2xpbmspOworCXdyaXRlX3VubG9jaygmcnhycGNfY29ubmVjdGlvbl9sb2NrKTsKIAotCUFTU0VSVENNUChhdG9taWNfcmVhZCgmY29ubi0+dXNhZ2UpLCA+LCAxKTsKKwkvKiBEcmFpbiB0aGUgUnggcXVldWUuICBOb3RlIHRoYXQgZXZlbiB0aG91Z2ggd2UndmUgdW5wdWJsaXNoZWQsIGFuCisJICogaW5jb21pbmcgcGFja2V0IGNvdWxkIHN0aWxsIGJlIGJlaW5nIGFkZGVkIHRvIG91ciBSeCBxdWV1ZSwgc28gd2UKKwkgKiB3aWxsIG5lZWQgdG8gZHJhaW4gaXQgYWdhaW4gaW4gdGhlIFJDVSBjbGVhbnVwIGhhbmRsZXIuCisJICovCisJcnhycGNfcHVyZ2VfcXVldWUoJmNvbm4tPnJ4X3F1ZXVlKTsKIAotCWNvbm4tPnB1dF90aW1lID0ga3RpbWVfZ2V0X3NlY29uZHMoKTsKLQlpZiAoYXRvbWljX2RlY19yZXR1cm4oJmNvbm4tPnVzYWdlKSA9PSAxKSB7Ci0JCV9kZWJ1Zygiem9tYmllIik7Ci0JCXJ4cnBjX3F1ZXVlX2RlbGF5ZWRfd29yaygmcnhycGNfY29ubmVjdGlvbl9yZWFwLCAwKTsKKwkvKiBMZWF2ZSBmaW5hbCBkZXN0cnVjdGlvbiB0byBSQ1UuICBUaGUgY29ubmVjdGlvbiBwcm9jZXNzb3Igd29yayBpdGVtCisJICogbXVzdCBjYXJyeSBhIHJlZiBvbiB0aGUgY29ubmVjdGlvbiB0byBwcmV2ZW50IHVzIGdldHRpbmcgaGVyZSB3aGlsc3QKKwkgKiBpdCBpcyBxdWV1ZWQgb3IgcnVubmluZy4KKwkgKi8KKwljYWxsX3JjdSgmY29ubi0+cmN1LCByeHJwY19kZXN0cm95X2Nvbm5lY3Rpb24pOworfQorCisvKgorICogUXVldWUgYSBjb25uZWN0aW9uJ3Mgd29yayBwcm9jZXNzb3IsIGdldHRpbmcgYSByZWYgdG8gcGFzcyB0byB0aGUgd29yaworICogcXVldWUuCisgKi8KK2Jvb2wgcnhycGNfcXVldWVfY29ubihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKK3sKKwljb25zdCB2b2lkICpoZXJlID0gX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOworCWludCBuID0gX19hdG9taWNfYWRkX3VubGVzcygmY29ubi0+dXNhZ2UsIDEsIDApOworCWlmIChuID09IDApCisJCXJldHVybiBmYWxzZTsKKwlpZiAocnhycGNfcXVldWVfd29yaygmY29ubi0+cHJvY2Vzc29yKSkKKwkJdHJhY2VfcnhycGNfY29ubihjb25uLCByeHJwY19jb25uX3F1ZXVlZCwgbiArIDEsIGhlcmUpOworCWVsc2UKKwkJcnhycGNfcHV0X2Nvbm5lY3Rpb24oY29ubik7CisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBOb3RlIHRoZSByZS1lbWVyZ2VuY2Ugb2YgYSBjb25uZWN0aW9uLgorICovCit2b2lkIHJ4cnBjX3NlZV9jb25uZWN0aW9uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKQoreworCWNvbnN0IHZvaWQgKmhlcmUgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7CisJaWYgKGNvbm4pIHsKKwkJaW50IG4gPSBhdG9taWNfcmVhZCgmY29ubi0+dXNhZ2UpOworCisJCXRyYWNlX3J4cnBjX2Nvbm4oY29ubiwgcnhycGNfY29ubl9zZWVuLCBuLCBoZXJlKTsKIAl9Cit9CiAKLQlfbGVhdmUoIiIpOworLyoKKyAqIEdldCBhIHJlZiBvbiBhIGNvbm5lY3Rpb24uCisgKi8KK3ZvaWQgcnhycGNfZ2V0X2Nvbm5lY3Rpb24oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJY29uc3Qgdm9pZCAqaGVyZSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKwlpbnQgbiA9IGF0b21pY19pbmNfcmV0dXJuKCZjb25uLT51c2FnZSk7CisKKwl0cmFjZV9yeHJwY19jb25uKGNvbm4sIHJ4cnBjX2Nvbm5fZ290LCBuLCBoZXJlKTsKK30KKworLyoKKyAqIFRyeSB0byBnZXQgYSByZWYgb24gYSBjb25uZWN0aW9uLgorICovCitzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqCityeHJwY19nZXRfY29ubmVjdGlvbl9tYXliZShzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKK3sKKwljb25zdCB2b2lkICpoZXJlID0gX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOworCisJaWYgKGNvbm4pIHsKKwkJaW50IG4gPSBfX2F0b21pY19hZGRfdW5sZXNzKCZjb25uLT51c2FnZSwgMSwgMCk7CisJCWlmIChuID4gMCkKKwkJCXRyYWNlX3J4cnBjX2Nvbm4oY29ubiwgcnhycGNfY29ubl9nb3QsIG4gKyAxLCBoZXJlKTsKKwkJZWxzZQorCQkJY29ubiA9IE5VTEw7CisJfQorCXJldHVybiBjb25uOworfQorCisvKgorICogUmVsZWFzZSBhIHNlcnZpY2UgY29ubmVjdGlvbgorICovCit2b2lkIHJ4cnBjX3B1dF9zZXJ2aWNlX2Nvbm4oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJY29uc3Qgdm9pZCAqaGVyZSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKwlpbnQgbjsKKworCW4gPSBhdG9taWNfZGVjX3JldHVybigmY29ubi0+dXNhZ2UpOworCXRyYWNlX3J4cnBjX2Nvbm4oY29ubiwgcnhycGNfY29ubl9wdXRfc2VydmljZSwgbiwgaGVyZSk7CisJQVNTRVJUQ01QKG4sID49LCAwKTsKKwlpZiAobiA9PSAwKQorCQlyeHJwY19xdWV1ZV9kZWxheWVkX3dvcmsoJnJ4cnBjX2Nvbm5lY3Rpb25fcmVhcCwgMCk7CiB9CiAKIC8qCkBAIC0yNDIsMTkgKzM0NSwxOSBAQAogfQogCiAvKgotICogcmVhcCBkZWFkIGNvbm5lY3Rpb25zCisgKiByZWFwIGRlYWQgc2VydmljZSBjb25uZWN0aW9ucwogICovCiBzdGF0aWMgdm9pZCByeHJwY19jb25uZWN0aW9uX3JlYXBlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sICpfcDsKLQl1bnNpZ25lZCBsb25nIHJlYXBfb2xkZXJfdGhhbiwgZWFybGllc3QsIHB1dF90aW1lLCBub3c7CisJdW5zaWduZWQgbG9uZyByZWFwX29sZGVyX3RoYW4sIGVhcmxpZXN0LCBpZGxlX3RpbWVzdGFtcCwgbm93OwogCiAJTElTVF9IRUFEKGdyYXZleWFyZCk7CiAKIAlfZW50ZXIoIiIpOwogCi0Jbm93ID0ga3RpbWVfZ2V0X3NlY29uZHMoKTsKLQlyZWFwX29sZGVyX3RoYW4gPSAgbm93IC0gcnhycGNfY29ubmVjdGlvbl9leHBpcnk7CisJbm93ID0gamlmZmllczsKKwlyZWFwX29sZGVyX3RoYW4gPSBub3cgLSByeHJwY19jb25uZWN0aW9uX2V4cGlyeSAqIEhaOwogCWVhcmxpZXN0ID0gVUxPTkdfTUFYOwogCiAJd3JpdGVfbG9jaygmcnhycGNfY29ubmVjdGlvbl9sb2NrKTsKQEAgLTI2MiwxMSArMzY1LDE3IEBACiAJCUFTU0VSVENNUChhdG9taWNfcmVhZCgmY29ubi0+dXNhZ2UpLCA+LCAwKTsKIAkJaWYgKGxpa2VseShhdG9taWNfcmVhZCgmY29ubi0+dXNhZ2UpID4gMSkpCiAJCQljb250aW51ZTsKKwkJaWYgKGNvbm4tPnN0YXRlID09IFJYUlBDX0NPTk5fU0VSVklDRV9QUkVBTExPQykKKwkJCWNvbnRpbnVlOwogCi0JCXB1dF90aW1lID0gUkVBRF9PTkNFKGNvbm4tPnB1dF90aW1lKTsKLQkJaWYgKHRpbWVfYWZ0ZXIocHV0X3RpbWUsIHJlYXBfb2xkZXJfdGhhbikpIHsKLQkJCWlmICh0aW1lX2JlZm9yZShwdXRfdGltZSwgZWFybGllc3QpKQotCQkJCWVhcmxpZXN0ID0gcHV0X3RpbWU7CisJCWlkbGVfdGltZXN0YW1wID0gUkVBRF9PTkNFKGNvbm4tPmlkbGVfdGltZXN0YW1wKTsKKwkJX2RlYnVnKCJyZWFwIENPTk4gJWQgeyB1PSVkLHQ9JWxkIH0iLAorCQkgICAgICAgY29ubi0+ZGVidWdfaWQsIGF0b21pY19yZWFkKCZjb25uLT51c2FnZSksCisJCSAgICAgICAobG9uZylyZWFwX29sZGVyX3RoYW4gLSAobG9uZylpZGxlX3RpbWVzdGFtcCk7CisKKwkJaWYgKHRpbWVfYWZ0ZXIoaWRsZV90aW1lc3RhbXAsIHJlYXBfb2xkZXJfdGhhbikpIHsKKwkJCWlmICh0aW1lX2JlZm9yZShpZGxlX3RpbWVzdGFtcCwgZWFybGllc3QpKQorCQkJCWVhcmxpZXN0ID0gaWRsZV90aW1lc3RhbXA7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC0yNzcsNyArMzg2LDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChyeHJwY19jb25uX2lzX2NsaWVudChjb25uKSkKLQkJCXJ4cnBjX3VucHVibGlzaF9jbGllbnRfY29ubihjb25uKTsKKwkJCUJVRygpOwogCQllbHNlCiAJCQlyeHJwY191bnB1Ymxpc2hfc2VydmljZV9jb25uKGNvbm4pOwogCkBAIC0yODcsOSArMzk2LDkgQEAKIAogCWlmIChlYXJsaWVzdCAhPSBVTE9OR19NQVgpIHsKIAkJX2RlYnVnKCJyZXNjaGVkdWxlIHJlYXBlciAlbGQiLCAobG9uZykgZWFybGllc3QgLSBub3cpOwotCQlBU1NFUlRDTVAoZWFybGllc3QsID4sIG5vdyk7CisJCUFTU0VSVCh0aW1lX2FmdGVyKGVhcmxpZXN0LCBub3cpKTsKIAkJcnhycGNfcXVldWVfZGVsYXllZF93b3JrKCZyeHJwY19jb25uZWN0aW9uX3JlYXAsCi0JCQkJCSAoZWFybGllc3QgLSBub3cpICogSFopOworCQkJCQkgZWFybGllc3QgLSBub3cpOwogCX0KIAogCXdoaWxlICghbGlzdF9lbXB0eSgmZ3JhdmV5YXJkKSkgewpAQCAtMjk4LDE2ICs0MDcsMTUgQEAKIAkJbGlzdF9kZWxfaW5pdCgmY29ubi0+bGluayk7CiAKIAkJQVNTRVJUQ01QKGF0b21pY19yZWFkKCZjb25uLT51c2FnZSksID09LCAwKTsKLQkJc2tiX3F1ZXVlX3B1cmdlKCZjb25uLT5yeF9xdWV1ZSk7Ci0JCWNhbGxfcmN1KCZjb25uLT5yY3UsIHJ4cnBjX2Rlc3Ryb3lfY29ubmVjdGlvbik7CisJCXJ4cnBjX2tpbGxfY29ubmVjdGlvbihjb25uKTsKIAl9CiAKIAlfbGVhdmUoIiIpOwogfQogCiAvKgotICogcHJlZW1wdGl2ZWx5IGRlc3Ryb3kgYWxsIHRoZSBjb25uZWN0aW9uIHJlY29yZHMgcmF0aGVyIHRoYW4gd2FpdGluZyBmb3IgdGhlbQotICogdG8gdGltZSBvdXQKKyAqIHByZWVtcHRpdmVseSBkZXN0cm95IGFsbCB0aGUgc2VydmljZSBjb25uZWN0aW9uIHJlY29yZHMgcmF0aGVyIHRoYW4KKyAqIHdhaXRpbmcgZm9yIHRoZW0gdG8gdGltZSBvdXQKICAqLwogdm9pZCBfX2V4aXQgcnhycGNfZGVzdHJveV9hbGxfY29ubmVjdGlvbnModm9pZCkKIHsKQEAgLTMxNiw2ICs0MjQsOCBAQAogCiAJX2VudGVyKCIiKTsKIAorCXJ4cnBjX2Rlc3Ryb3lfYWxsX2NsaWVudF9jb25uZWN0aW9ucygpOworCiAJcnhycGNfY29ubmVjdGlvbl9leHBpcnkgPSAwOwogCWNhbmNlbF9kZWxheWVkX3dvcmsoJnJ4cnBjX2Nvbm5lY3Rpb25fcmVhcCk7CiAJcnhycGNfcXVldWVfZGVsYXllZF93b3JrKCZyeHJwY19jb25uZWN0aW9uX3JlYXAsIDApOwpAQCAtMzMwLDYgKzQ0MCw4IEBACiAJd3JpdGVfdW5sb2NrKCZyeHJwY19jb25uZWN0aW9uX2xvY2spOwogCUJVR19PTihsZWFrKTsKIAorCUFTU0VSVChsaXN0X2VtcHR5KCZyeHJwY19jb25uZWN0aW9uX3Byb2NfbGlzdCkpOworCiAJLyogTWFrZSBzdXJlIHRoZSBsb2NhbCBhbmQgcGVlciByZWNvcmRzIHBpbm5lZCBieSBhbnkgZHlpbmcgY29ubmVjdGlvbnMKIAkgKiBhcmUgcmVsZWFzZWQuCiAJICovCmRpZmYgLS1naXQgYS9uZXQvcnhycGMvY29ubl9zZXJ2aWNlLmMgYi9uZXQvcnhycGMvY29ubl9zZXJ2aWNlLmMKaW5kZXggZmQ5MDI3Yy4uZWVmNTUxZiAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL2Nvbm5fc2VydmljZS5jCisrKyBiL25ldC9yeHJwYy9jb25uX3NlcnZpY2UuYwpAQCAtNjUsOSArNjUsOCBAQAogICogSW5zZXJ0IGEgc2VydmljZSBjb25uZWN0aW9uIGludG8gYSBwZWVyJ3MgdHJlZSwgdGhlcmVieSBtYWtpbmcgaXQgYSB0YXJnZXQKICAqIGZvciBpbmNvbWluZyBwYWNrZXRzLgogICovCi1zdGF0aWMgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKgotcnhycGNfcHVibGlzaF9zZXJ2aWNlX2Nvbm4oc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIsCi0JCQkgICBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKK3N0YXRpYyB2b2lkIHJ4cnBjX3B1Ymxpc2hfc2VydmljZV9jb25uKHN0cnVjdCByeHJwY19wZWVyICpwZWVyLAorCQkJCSAgICAgICBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKIHsKIAlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY3Vyc29yID0gTlVMTDsKIAlzdHJ1Y3QgcnhycGNfY29ubl9wcm90byBrID0gY29ubi0+cHJvdG87CkBAIC05Niw3ICs5NSw3IEBACiAJc2V0X2JpdChSWFJQQ19DT05OX0lOX1NFUlZJQ0VfQ09OTlMsICZjb25uLT5mbGFncyk7CiAJd3JpdGVfc2VxdW5sb2NrX2JoKCZwZWVyLT5zZXJ2aWNlX2Nvbm5fbG9jayk7CiAJX2xlYXZlKCIgPSAlZCBbbmV3XSIsIGNvbm4tPmRlYnVnX2lkKTsKLQlyZXR1cm4gY29ubjsKKwlyZXR1cm47CiAKIGZvdW5kX2V4dGFudF9jb25uOgogCWlmIChhdG9taWNfcmVhZCgmY3Vyc29yLT51c2FnZSkgPT0gMCkKQEAgLTExOSwxMDAgKzExOCw1OCBAQAogfQogCiAvKgotICogZ2V0IGEgcmVjb3JkIG9mIGFuIGluY29taW5nIGNvbm5lY3Rpb24KKyAqIFByZWFsbG9jYXRlIGEgc2VydmljZSBjb25uZWN0aW9uLiAgVGhlIGNvbm5lY3Rpb24gaXMgcGxhY2VkIG9uIHRoZSBwcm9jIGFuZAorICogcmVhcCBsaXN0cyBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gZ2V0IHRoZSBsb2NrIGZyb20gQkggY29udGV4dC4KICAqLwotc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKnJ4cnBjX2luY29taW5nX2Nvbm5lY3Rpb24oc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCwKLQkJCQkJCSAgIHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqc3J4LAotCQkJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0cnVjdCByeHJwY19jb25uZWN0aW9uICpyeHJwY19wcmVhbGxvY19zZXJ2aWNlX2Nvbm5lY3Rpb24oZ2ZwX3QgZ2ZwKQogewotCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uID0gcnhycGNfYWxsb2NfY29ubmVjdGlvbihnZnApOworCisJaWYgKGNvbm4pIHsKKwkJLyogV2UgbWFpbnRhaW4gYW4gZXh0cmEgcmVmIG9uIHRoZSBjb25uZWN0aW9uIHdoaWxzdCBpdCBpcyBvbgorCQkgKiB0aGUgcnhycGNfY29ubmVjdGlvbnMgbGlzdC4KKwkJICovCisJCWNvbm4tPnN0YXRlID0gUlhSUENfQ09OTl9TRVJWSUNFX1BSRUFMTE9DOworCQlhdG9taWNfc2V0KCZjb25uLT51c2FnZSwgMik7CisKKwkJd3JpdGVfbG9jaygmcnhycGNfY29ubmVjdGlvbl9sb2NrKTsKKwkJbGlzdF9hZGRfdGFpbCgmY29ubi0+bGluaywgJnJ4cnBjX2Nvbm5lY3Rpb25zKTsKKwkJbGlzdF9hZGRfdGFpbCgmY29ubi0+cHJvY19saW5rLCAmcnhycGNfY29ubmVjdGlvbl9wcm9jX2xpc3QpOworCQl3cml0ZV91bmxvY2soJnJ4cnBjX2Nvbm5lY3Rpb25fbG9jayk7CisKKwkJdHJhY2VfcnhycGNfY29ubihjb25uLCByeHJwY19jb25uX25ld19zZXJ2aWNlLAorCQkJCSBhdG9taWNfcmVhZCgmY29ubi0+dXNhZ2UpLAorCQkJCSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCX0KKworCXJldHVybiBjb25uOworfQorCisvKgorICogU2V0IHVwIGFuIGluY29taW5nIGNvbm5lY3Rpb24uICBUaGlzIGlzIGNhbGxlZCBpbiBCSCBjb250ZXh0IHdpdGggdGhlIFJDVQorICogcmVhZCBsb2NrIGhlbGQuCisgKi8KK3ZvaWQgcnhycGNfbmV3X2luY29taW5nX2Nvbm5lY3Rpb24oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKIAlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwID0gcnhycGNfc2tiKHNrYik7Ci0Jc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXI7Ci0JY29uc3QgY2hhciAqbmV3ID0gIm9sZCI7CiAKIAlfZW50ZXIoIiIpOwogCi0JcGVlciA9IHJ4cnBjX2xvb2t1cF9wZWVyKGxvY2FsLCBzcngsIEdGUF9OT0lPKTsKLQlpZiAoIXBlZXIpIHsKLQkJX2RlYnVnKCJubyBwZWVyIik7Ci0JCXJldHVybiBFUlJfUFRSKC1FQlVTWSk7Ci0JfQotCi0JQVNTRVJUKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19DTElFTlRfSU5JVElBVEVEKTsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQlwZWVyID0gcnhycGNfbG9va3VwX3BlZXJfcmN1KGxvY2FsLCBzcngpOwotCWlmIChwZWVyKSB7Ci0JCWNvbm4gPSByeHJwY19maW5kX3NlcnZpY2VfY29ubl9yY3UocGVlciwgc2tiKTsKLQkJaWYgKGNvbm4pIHsKLQkJCWlmIChzcC0+aGRyLnNlY3VyaXR5SW5kZXggIT0gY29ubi0+c2VjdXJpdHlfaXgpCi0JCQkJZ290byBzZWN1cml0eV9taXNtYXRjaF9yY3U7Ci0JCQlpZiAocnhycGNfZ2V0X2Nvbm5lY3Rpb25fbWF5YmUoY29ubikpCi0JCQkJZ290byBmb3VuZF9leHRhbnRfY29ubmVjdGlvbl9yY3U7Ci0KLQkJCS8qIFRoZSBjb25uIGhhcyBleHBpcmVkIGJ1dCB3ZSBjYW4ndCByZW1vdmUgaXQgd2l0aG91dAotCQkJICogdGhlIGFwcHJvcHJpYXRlIGxvY2ssIHNvIHdlIGF0dGVtcHQgdG8gcmVwbGFjZSBpdAotCQkJICogd2hlbiB3ZSBoYXZlIGEgbmV3IGNhbmRpZGF0ZS4KLQkJCSAqLwotCQl9Ci0KLQkJaWYgKCFyeHJwY19nZXRfcGVlcl9tYXliZShwZWVyKSkKLQkJCXBlZXIgPSBOVUxMOwotCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCWlmICghcGVlcikgewotCQlwZWVyID0gcnhycGNfbG9va3VwX3BlZXIobG9jYWwsIHNyeCwgR0ZQX05PSU8pOwotCQlpZiAoIXBlZXIpCi0JCQlnb3RvIGVub21lbTsKLQl9Ci0KLQkvKiBXZSBkb24ndCBoYXZlIGEgbWF0Y2hpbmcgcmVjb3JkIHlldC4gKi8KLQljb25uID0gcnhycGNfYWxsb2NfY29ubmVjdGlvbihHRlBfTk9JTyk7Ci0JaWYgKCFjb25uKQotCQlnb3RvIGVub21lbV9wZWVyOwotCiAJY29ubi0+cHJvdG8uZXBvY2gJPSBzcC0+aGRyLmVwb2NoOwogCWNvbm4tPnByb3RvLmNpZAkJPSBzcC0+aGRyLmNpZCAmIFJYUlBDX0NJRE1BU0s7Ci0JY29ubi0+cGFyYW1zLmxvY2FsCT0gbG9jYWw7Ci0JY29ubi0+cGFyYW1zLnBlZXIJPSBwZWVyOwogCWNvbm4tPnBhcmFtcy5zZXJ2aWNlX2lkCT0gc3AtPmhkci5zZXJ2aWNlSWQ7CiAJY29ubi0+c2VjdXJpdHlfaXgJPSBzcC0+aGRyLnNlY3VyaXR5SW5kZXg7CiAJY29ubi0+b3V0X2NsaWVudGZsYWcJPSAwOwotCWNvbm4tPnN0YXRlCQk9IFJYUlBDX0NPTk5fU0VSVklDRTsKLQlpZiAoY29ubi0+cGFyYW1zLnNlcnZpY2VfaWQpCisJaWYgKGNvbm4tPnNlY3VyaXR5X2l4KQogCQljb25uLT5zdGF0ZQk9IFJYUlBDX0NPTk5fU0VSVklDRV9VTlNFQ1VSRUQ7Ci0KLQlyeHJwY19nZXRfbG9jYWwobG9jYWwpOwotCi0Jd3JpdGVfbG9jaygmcnhycGNfY29ubmVjdGlvbl9sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZjb25uLT5saW5rLCAmcnhycGNfY29ubmVjdGlvbnMpOwotCXdyaXRlX3VubG9jaygmcnhycGNfY29ubmVjdGlvbl9sb2NrKTsKKwllbHNlCisJCWNvbm4tPnN0YXRlCT0gUlhSUENfQ09OTl9TRVJWSUNFOwogCiAJLyogTWFrZSB0aGUgY29ubmVjdGlvbiBhIHRhcmdldCBmb3IgaW5jb21pbmcgcGFja2V0cy4gKi8KLQlyeHJwY19wdWJsaXNoX3NlcnZpY2VfY29ubihwZWVyLCBjb25uKTsKKwlyeHJwY19wdWJsaXNoX3NlcnZpY2VfY29ubihjb25uLT5wYXJhbXMucGVlciwgY29ubik7CiAKLQluZXcgPSAibmV3IjsKLQotc3VjY2VzczoKLQlfbmV0KCJDT05ORUNUSU9OICVzICVkIHsleH0iLCBuZXcsIGNvbm4tPmRlYnVnX2lkLCBjb25uLT5wcm90by5jaWQpOwotCV9sZWF2ZSgiID0gJXAge3U9JWR9IiwgY29ubiwgYXRvbWljX3JlYWQoJmNvbm4tPnVzYWdlKSk7Ci0JcmV0dXJuIGNvbm47Ci0KLWZvdW5kX2V4dGFudF9jb25uZWN0aW9uX3JjdToKLQlyY3VfcmVhZF91bmxvY2soKTsKLQlnb3RvIHN1Y2Nlc3M7Ci0KLXNlY3VyaXR5X21pc21hdGNoX3JjdToKLQlyY3VfcmVhZF91bmxvY2soKTsKLQlfbGVhdmUoIiA9IC1FS0VZUkVKRUNURUQiKTsKLQlyZXR1cm4gRVJSX1BUUigtRUtFWVJFSkVDVEVEKTsKLQotZW5vbWVtX3BlZXI6Ci0JcnhycGNfcHV0X3BlZXIocGVlcik7Ci1lbm9tZW06Ci0JX2xlYXZlKCIgPSAtRU5PTUVNIik7Ci0JcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJX25ldCgiQ09OTkVDVElPTiBuZXcgJWQgeyV4fSIsIGNvbm4tPmRlYnVnX2lkLCBjb25uLT5wcm90by5jaWQpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2lucHV0LmMgYi9uZXQvcnhycGMvaW5wdXQuYwppbmRleCA5OTFhMjBkLi4zYWQ5Zjc1IDEwMDY0NAotLS0gYS9uZXQvcnhycGMvaW5wdXQuYworKysgYi9uZXQvcnhycGMvaW5wdXQuYwpAQCAtMSw2ICsxLDYgQEAKIC8qIFJ4UlBDIHBhY2tldCByZWNlcHRpb24KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDE2IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0yNyw1NjEgKzI3LDkyOCBAQAogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSAiYXItaW50ZXJuYWwuaCIKIAotLyoKLSAqIHF1ZXVlIGEgcGFja2V0IGZvciByZWN2bXNnIHRvIHBhc3MgdG8gdXNlcnNwYWNlCi0gKiAtIHRoZSBjYWxsZXIgbXVzdCBob2xkIGEgbG9jayBvbiBjYWxsLT5sb2NrCi0gKiAtIG11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgKHNrX2ZpbHRlcigpIGRpc2FibGVzIEJIJ3MpCi0gKiAtIGVhdHMgdGhlIHBhY2tldCB3aGV0aGVyIHN1Y2Nlc3NmdWwgb3Igbm90Ci0gKiAtIHRoZXJlIG11c3QgYmUganVzdCBvbmUgcmVmZXJlbmNlIHRvIHRoZSBwYWNrZXQsIHdoaWNoIHRoZSBjYWxsZXIgcGFzc2VzIHRvCi0gKiAgIHRoaXMgZnVuY3Rpb24KLSAqLwotaW50IHJ4cnBjX3F1ZXVlX3Jjdl9za2Ioc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQlib29sIGZvcmNlLCBib29sIHRlcm1pbmFsKQorc3RhdGljIHZvaWQgcnhycGNfcHJvdG9fYWJvcnQoY29uc3QgY2hhciAqd2h5LAorCQkJICAgICAgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHJ4cnBjX3NlcV90IHNlcSkKIHsKLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOwotCXN0cnVjdCByeHJwY19zb2NrICpyeCA9IGNhbGwtPnNvY2tldDsKLQlzdHJ1Y3Qgc29jayAqc2s7Ci0JaW50IHJldDsKLQotCV9lbnRlcigiLCwlZCwlZCIsIGZvcmNlLCB0ZXJtaW5hbCk7Ci0KLQlBU1NFUlQoIWlycXNfZGlzYWJsZWQoKSk7Ci0KLQlzcCA9IHJ4cnBjX3NrYihza2IpOwotCUFTU0VSVENNUChzcC0+Y2FsbCwgPT0sIGNhbGwpOwotCi0JLyogaWYgd2UndmUgYWxyZWFkeSBwb3N0ZWQgdGhlIHRlcm1pbmFsIG1lc3NhZ2UgZm9yIGEgY2FsbCwgdGhlbiB3ZQotCSAqIGRvbid0IHBvc3QgYW55IG1vcmUgKi8KLQlpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9URVJNSU5BTF9NU0csICZjYWxsLT5mbGFncykpIHsKLQkJX2RlYnVnKCJhbHJlYWR5IHRlcm1pbmF0ZWQiKTsKLQkJQVNTRVJUQ01QKGNhbGwtPnN0YXRlLCA+PSwgUlhSUENfQ0FMTF9DT01QTEVURSk7Ci0JCXNrYi0+ZGVzdHJ1Y3RvciA9IE5VTEw7Ci0JCXNwLT5jYWxsID0gTlVMTDsKLQkJcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0JCXJ4cnBjX2ZyZWVfc2tiKHNrYik7Ci0JCXJldHVybiAwOworCWlmIChyeHJwY19hYm9ydF9jYWxsKHdoeSwgY2FsbCwgc2VxLCBSWF9QUk9UT0NPTF9FUlJPUiwgRUJBRE1TRykpIHsKKwkJc2V0X2JpdChSWFJQQ19DQUxMX0VWX0FCT1JULCAmY2FsbC0+ZXZlbnRzKTsKKwkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKIAl9Ci0KLQlzayA9ICZyeC0+c2s7Ci0KLQlpZiAoIWZvcmNlKSB7Ci0JCS8qIGNhc3Qgc2tiLT5yY3ZidWYgdG8gdW5zaWduZWQuLi4gIEl0J3MgcG9pbnRsZXNzLCBidXQKLQkJICogcmVkdWNlcyBudW1iZXIgb2Ygd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgd2l0aCAtVwotCQkgKiAtLUFOSyAqLwotLy8JCXJldCA9IC1FTk9CVUZTOwotLy8JCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpICsgc2tiLT50cnVlc2l6ZSA+PQotLy8JCSAgICAodW5zaWduZWQgaW50KSBzay0+c2tfcmN2YnVmKQotLy8JCQlnb3RvIG91dDsKLQotCQlyZXQgPSBza19maWx0ZXIoc2ssIHNrYik7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBvdXQ7Ci0JfQotCi0Jc3Bpbl9sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKLQlpZiAoIXRlc3RfYml0KFJYUlBDX0NBTExfVEVSTUlOQUxfTVNHLCAmY2FsbC0+ZmxhZ3MpICYmCi0JICAgICF0ZXN0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0VELCAmY2FsbC0+ZmxhZ3MpICYmCi0JICAgIGNhbGwtPnNvY2tldC0+c2suc2tfc3RhdGUgIT0gUlhSUENfQ0xPU0UpIHsKLQkJc2tiLT5kZXN0cnVjdG9yID0gcnhycGNfcGFja2V0X2Rlc3RydWN0b3I7Ci0JCXNrYi0+ZGV2ID0gTlVMTDsKLQkJc2tiLT5zayA9IHNrOwotCQlhdG9taWNfYWRkKHNrYi0+dHJ1ZXNpemUsICZzay0+c2tfcm1lbV9hbGxvYyk7Ci0KLQkJaWYgKHRlcm1pbmFsKSB7Ci0JCQlfZGVidWcoIjw8PDwgVEVSTUlOQUwgTUVTU0FHRSA+Pj4+Iik7Ci0JCQlzZXRfYml0KFJYUlBDX0NBTExfVEVSTUlOQUxfTVNHLCAmY2FsbC0+ZmxhZ3MpOwotCQl9Ci0KLQkJLyogYWxsb3cgaW50ZXJjZXB0aW9uIGJ5IGEga2VybmVsIHNlcnZpY2UgKi8KLQkJaWYgKHJ4LT5pbnRlcmNlcHRvcikgewotCQkJcngtPmludGVyY2VwdG9yKHNrLCBjYWxsLT51c2VyX2NhbGxfSUQsIHNrYik7Ci0JCQlzcGluX3VubG9ja19iaCgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7Ci0JCX0gZWxzZSB7Ci0JCQlfbmV0KCJwb3N0IHNrYiAlcCIsIHNrYik7Ci0JCQlfX3NrYl9xdWV1ZV90YWlsKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKLQkJCXNwaW5fdW5sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKLQotCQkJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpCi0JCQkJc2stPnNrX2RhdGFfcmVhZHkoc2spOwotCQl9Ci0JCXNrYiA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJc3Bpbl91bmxvY2tfYmgoJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOwotCX0KLQlyZXQgPSAwOwotCi1vdXQ6Ci0JLyogcmVsZWFzZSB0aGUgc29ja2V0IGJ1ZmZlciAqLwotCWlmIChza2IpIHsKLQkJc2tiLT5kZXN0cnVjdG9yID0gTlVMTDsKLQkJc3AtPmNhbGwgPSBOVUxMOwotCQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLQkJcnhycGNfZnJlZV9za2Ioc2tiKTsKLQl9Ci0KLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwogfQogCiAvKgotICogcHJvY2VzcyBhIERBVEEgcGFja2V0LCBwb3N0aW5nIHRoZSBwYWNrZXQgdG8gdGhlIGFwcHJvcHJpYXRlIHF1ZXVlCi0gKiAtIGVhdHMgdGhlIHBhY2tldCBpZiBzdWNjZXNzZnVsCisgKiBEbyBUQ1Atc3R5bGUgY29uZ2VzdGlvbiBtYW5hZ2VtZW50IFtSRkMgNTY4MV0uCiAgKi8KLXN0YXRpYyBpbnQgcnhycGNfZmFzdF9wcm9jZXNzX2RhdGEoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCi0JCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIHNlcSkKK3N0YXRpYyB2b2lkIHJ4cnBjX2Nvbmdlc3Rpb25fbWFuYWdlbWVudChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJc3RydWN0IHJ4cnBjX2Fja19zdW1tYXJ5ICpzdW1tYXJ5LAorCQkJCQlyeHJwY19zZXJpYWxfdCBhY2tlZF9zZXJpYWwpCiB7Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKLQlib29sIHRlcm1pbmFsOwotCWludCByZXQsIGFja2JpdCwgYWNrOworCWVudW0gcnhycGNfY29uZ2VzdF9jaGFuZ2UgY2hhbmdlID0gcnhycGNfY29uZ19ub19jaGFuZ2U7CisJdW5zaWduZWQgaW50IGN1bXVsYXRpdmVfYWNrcyA9IGNhbGwtPmNvbmdfY3VtdWxfYWNrczsKKwl1bnNpZ25lZCBpbnQgY3duZCA9IGNhbGwtPmNvbmdfY3duZDsKKwlib29sIHJlc2VuZCA9IGZhbHNlOwogCi0JX2VudGVyKCJ7JXUsJXV9LCx7JXV9IiwgY2FsbC0+cnhfZGF0YV9wb3N0LCBjYWxsLT5yeF9maXJzdF9vb3MsIHNlcSk7CisJc3VtbWFyeS0+ZmxpZ2h0X3NpemUgPQorCQkoY2FsbC0+dHhfdG9wIC0gY2FsbC0+dHhfaGFyZF9hY2spIC0gc3VtbWFyeS0+bnJfYWNrczsKIAotCXNwID0gcnhycGNfc2tiKHNrYik7Ci0JQVNTRVJUQ01QKHNwLT5jYWxsLCA9PSwgTlVMTCk7Ci0KLQlzcGluX2xvY2soJmNhbGwtPmxvY2spOwotCi0JaWYgKGNhbGwtPnN0YXRlID4gUlhSUENfQ0FMTF9DT01QTEVURSkKLQkJZ290byBkaXNjYXJkOwotCi0JQVNTRVJUQ01QKGNhbGwtPnJ4X2RhdGFfZXhwZWN0LCA+PSwgY2FsbC0+cnhfZGF0YV9wb3N0KTsKLQlBU1NFUlRDTVAoY2FsbC0+cnhfZGF0YV9wb3N0LCA+PSwgY2FsbC0+cnhfZGF0YV9yZWN2KTsKLQlBU1NFUlRDTVAoY2FsbC0+cnhfZGF0YV9yZWN2LCA+PSwgY2FsbC0+cnhfZGF0YV9lYXRlbik7Ci0KLQlpZiAoc2VxIDwgY2FsbC0+cnhfZGF0YV9wb3N0KSB7Ci0JCV9kZWJ1ZygiZHVwICMldSBbLSV1XSIsIHNlcSwgY2FsbC0+cnhfZGF0YV9wb3N0KTsKLQkJYWNrID0gUlhSUENfQUNLX0RVUExJQ0FURTsKLQkJcmV0ID0gLUVOT0JVRlM7Ci0JCWdvdG8gZGlzY2FyZF9hbmRfYWNrOwotCX0KLQotCS8qIHdlIG1heSBhbHJlYWR5IGhhdmUgdGhlIHBhY2tldCBpbiB0aGUgb3V0IG9mIHNlcXVlbmNlIHF1ZXVlICovCi0JYWNrYml0ID0gc2VxIC0gKGNhbGwtPnJ4X2RhdGFfZWF0ZW4gKyAxKTsKLQlBU1NFUlRDTVAoYWNrYml0LCA+PSwgMCk7Ci0JaWYgKF9fdGVzdF9hbmRfc2V0X2JpdChhY2tiaXQsIGNhbGwtPmFja3Jfd2luZG93KSkgewotCQlfZGVidWcoImR1cCBvb3MgIyV1IFsldSwldV0iLAotCQkgICAgICAgc2VxLCBjYWxsLT5yeF9kYXRhX2VhdGVuLCBjYWxsLT5yeF9kYXRhX3Bvc3QpOwotCQlhY2sgPSBSWFJQQ19BQ0tfRFVQTElDQVRFOwotCQlnb3RvIGRpc2NhcmRfYW5kX2FjazsKLQl9Ci0KLQlpZiAoc2VxID49IGNhbGwtPmFja3Jfd2luX3RvcCkgewotCQlfZGVidWcoImV4Y2VlZCAjJXUgWyV1XSIsIHNlcSwgY2FsbC0+YWNrcl93aW5fdG9wKTsKLQkJX19jbGVhcl9iaXQoYWNrYml0LCBjYWxsLT5hY2tyX3dpbmRvdyk7Ci0JCWFjayA9IFJYUlBDX0FDS19FWENFRURTX1dJTkRPVzsKLQkJZ290byBkaXNjYXJkX2FuZF9hY2s7Ci0JfQotCi0JaWYgKHNlcSA9PSBjYWxsLT5yeF9kYXRhX2V4cGVjdCkgewotCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9FWFBFQ1RfT09TLCAmY2FsbC0+ZmxhZ3MpOwotCQljYWxsLT5yeF9kYXRhX2V4cGVjdCsrOwotCX0gZWxzZSBpZiAoc2VxID4gY2FsbC0+cnhfZGF0YV9leHBlY3QpIHsKLQkJX2RlYnVnKCJvb3MgIyV1IFsldV0iLCBzZXEsIGNhbGwtPnJ4X2RhdGFfZXhwZWN0KTsKLQkJY2FsbC0+cnhfZGF0YV9leHBlY3QgPSBzZXEgKyAxOwotCQlpZiAodGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX0VYUEVDVF9PT1MsICZjYWxsLT5mbGFncykpIHsKLQkJCWFjayA9IFJYUlBDX0FDS19PVVRfT0ZfU0VRVUVOQ0U7Ci0JCQlnb3RvIGVucXVldWVfYW5kX2FjazsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJYUlBDX0NBTExfUkVUUkFOU19USU1FT1VULCAmY2FsbC0+ZmxhZ3MpKSB7CisJCXN1bW1hcnktPnJldHJhbnNfdGltZW8gPSB0cnVlOworCQljYWxsLT5jb25nX3NzdGhyZXNoID0gbWF4X3QodW5zaWduZWQgaW50LAorCQkJCQkgICAgc3VtbWFyeS0+ZmxpZ2h0X3NpemUgLyAyLCAyKTsKKwkJY3duZCA9IDE7CisJCWlmIChjd25kID49IGNhbGwtPmNvbmdfc3N0aHJlc2ggJiYKKwkJICAgIGNhbGwtPmNvbmdfbW9kZSA9PSBSWFJQQ19DQUxMX1NMT1dfU1RBUlQpIHsKKwkJCWNhbGwtPmNvbmdfbW9kZSA9IFJYUlBDX0NBTExfQ09OR0VTVF9BVk9JREFOQ0U7CisJCQljYWxsLT5jb25nX3RzdGFtcCA9IHNrYi0+dHN0YW1wOworCQkJY3VtdWxhdGl2ZV9hY2tzID0gMDsKIAkJfQotCQlnb3RvIGVucXVldWVfcGFja2V0OwogCX0KIAotCWlmIChzZXEgIT0gY2FsbC0+cnhfZGF0YV9wb3N0KSB7Ci0JCV9kZWJ1ZygiYWhlYWQgIyV1IFsldV0iLCBzZXEsIGNhbGwtPnJ4X2RhdGFfcG9zdCk7Ci0JCWdvdG8gZW5xdWV1ZV9wYWNrZXQ7Ci0JfQorCWN1bXVsYXRpdmVfYWNrcyArPSBzdW1tYXJ5LT5ucl9uZXdfYWNrczsKKwljdW11bGF0aXZlX2Fja3MgKz0gc3VtbWFyeS0+bnJfcm90X25ld19hY2tzOworCWlmIChjdW11bGF0aXZlX2Fja3MgPiAyNTUpCisJCWN1bXVsYXRpdmVfYWNrcyA9IDI1NTsKIAotCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX1JDVkRfTEFTVCwgJmNhbGwtPmZsYWdzKSkKLQkJZ290byBwcm90b2NvbF9lcnJvcjsKKwlzdW1tYXJ5LT5tb2RlID0gY2FsbC0+Y29uZ19tb2RlOworCXN1bW1hcnktPmN3bmQgPSBjYWxsLT5jb25nX2N3bmQ7CisJc3VtbWFyeS0+c3N0aHJlc2ggPSBjYWxsLT5jb25nX3NzdGhyZXNoOworCXN1bW1hcnktPmN1bXVsYXRpdmVfYWNrcyA9IGN1bXVsYXRpdmVfYWNrczsKKwlzdW1tYXJ5LT5kdXBfYWNrcyA9IGNhbGwtPmNvbmdfZHVwX2Fja3M7CiAKLQkvKiBpZiB0aGUgcGFja2V0IG5lZWQgc2VjdXJpdHkgdGhpbmdzIGRvaW5nIHRvIGl0LCB0aGVuIGl0IGdvZXMgZG93bgotCSAqIHRoZSBzbG93IHBhdGggKi8KLQlpZiAoY2FsbC0+Y29ubi0+c2VjdXJpdHlfaXgpCi0JCWdvdG8gZW5xdWV1ZV9wYWNrZXQ7Ci0KLQlzcC0+Y2FsbCA9IGNhbGw7Ci0JcnhycGNfZ2V0X2NhbGwoY2FsbCk7Ci0JdGVybWluYWwgPSAoKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVCkgJiYKLQkJICAgICEoc3AtPmhkci5mbGFncyAmIFJYUlBDX0NMSUVOVF9JTklUSUFURUQpKTsKLQlyZXQgPSByeHJwY19xdWV1ZV9yY3Zfc2tiKGNhbGwsIHNrYiwgZmFsc2UsIHRlcm1pbmFsKTsKLQlpZiAocmV0IDwgMCkgewotCQlpZiAocmV0ID09IC1FTk9NRU0gfHwgcmV0ID09IC1FTk9CVUZTKSB7Ci0JCQlfX2NsZWFyX2JpdChhY2tiaXQsIGNhbGwtPmFja3Jfd2luZG93KTsKLQkJCWFjayA9IFJYUlBDX0FDS19OT1NQQUNFOwotCQkJZ290byBkaXNjYXJkX2FuZF9hY2s7CisJc3dpdGNoIChjYWxsLT5jb25nX21vZGUpIHsKKwljYXNlIFJYUlBDX0NBTExfU0xPV19TVEFSVDoKKwkJaWYgKHN1bW1hcnktPm5yX25hY2tzID4gMCkKKwkJCWdvdG8gcGFja2V0X2xvc3NfZGV0ZWN0ZWQ7CisJCWlmIChzdW1tYXJ5LT5jdW11bGF0aXZlX2Fja3MgPiAwKQorCQkJY3duZCArPSAxOworCQlpZiAoY3duZCA+PSBjYWxsLT5jb25nX3NzdGhyZXNoKSB7CisJCQljYWxsLT5jb25nX21vZGUgPSBSWFJQQ19DQUxMX0NPTkdFU1RfQVZPSURBTkNFOworCQkJY2FsbC0+Y29uZ190c3RhbXAgPSBza2ItPnRzdGFtcDsKIAkJfQogCQlnb3RvIG91dDsKKworCWNhc2UgUlhSUENfQ0FMTF9DT05HRVNUX0FWT0lEQU5DRToKKwkJaWYgKHN1bW1hcnktPm5yX25hY2tzID4gMCkKKwkJCWdvdG8gcGFja2V0X2xvc3NfZGV0ZWN0ZWQ7CisKKwkJLyogV2UgYW5hbHlzZSB0aGUgbnVtYmVyIG9mIHBhY2tldHMgdGhhdCBnZXQgQUNLJ2QgcGVyIFJUVAorCQkgKiBwZXJpb2QgYW5kIGluY3JlYXNlIHRoZSB3aW5kb3cgaWYgd2UgbWFuYWdlZCB0byBmaWxsIGl0LgorCQkgKi8KKwkJaWYgKGNhbGwtPnBlZXItPnJ0dF91c2FnZSA9PSAwKQorCQkJZ290byBvdXQ7CisJCWlmIChrdGltZV9iZWZvcmUoc2tiLT50c3RhbXAsCisJCQkJIGt0aW1lX2FkZF9ucyhjYWxsLT5jb25nX3RzdGFtcCwKKwkJCQkJICAgICAgY2FsbC0+cGVlci0+cnR0KSkpCisJCQlnb3RvIG91dF9ub19jbGVhcl9jYTsKKwkJY2hhbmdlID0gcnhycGNfY29uZ19ydHRfd2luZG93X2VuZDsKKwkJY2FsbC0+Y29uZ190c3RhbXAgPSBza2ItPnRzdGFtcDsKKwkJaWYgKGN1bXVsYXRpdmVfYWNrcyA+PSBjd25kKQorCQkJY3duZCsrOworCQlnb3RvIG91dDsKKworCWNhc2UgUlhSUENfQ0FMTF9QQUNLRVRfTE9TUzoKKwkJaWYgKHN1bW1hcnktPm5yX25hY2tzID09IDApCisJCQlnb3RvIHJlc3VtZV9ub3JtYWxpdHk7CisKKwkJaWYgKHN1bW1hcnktPm5ld19sb3dfbmFjaykgeworCQkJY2hhbmdlID0gcnhycGNfY29uZ19uZXdfbG93X25hY2s7CisJCQljYWxsLT5jb25nX2R1cF9hY2tzID0gMTsKKwkJCWlmIChjYWxsLT5jb25nX2V4dHJhID4gMSkKKwkJCQljYWxsLT5jb25nX2V4dHJhID0gMTsKKwkJCWdvdG8gc2VuZF9leHRyYV9kYXRhOworCQl9CisKKwkJY2FsbC0+Y29uZ19kdXBfYWNrcysrOworCQlpZiAoY2FsbC0+Y29uZ19kdXBfYWNrcyA8IDMpCisJCQlnb3RvIHNlbmRfZXh0cmFfZGF0YTsKKworCQljaGFuZ2UgPSByeHJwY19jb25nX2JlZ2luX3JldHJhbnNtaXNzaW9uOworCQljYWxsLT5jb25nX21vZGUgPSBSWFJQQ19DQUxMX0ZBU1RfUkVUUkFOU01JVDsKKwkJY2FsbC0+Y29uZ19zc3RocmVzaCA9IG1heF90KHVuc2lnbmVkIGludCwKKwkJCQkJICAgIHN1bW1hcnktPmZsaWdodF9zaXplIC8gMiwgMik7CisJCWN3bmQgPSBjYWxsLT5jb25nX3NzdGhyZXNoICsgMzsKKwkJY2FsbC0+Y29uZ19leHRyYSA9IDA7CisJCWNhbGwtPmNvbmdfZHVwX2Fja3MgPSAwOworCQlyZXNlbmQgPSB0cnVlOworCQlnb3RvIG91dDsKKworCWNhc2UgUlhSUENfQ0FMTF9GQVNUX1JFVFJBTlNNSVQ6CisJCWlmICghc3VtbWFyeS0+bmV3X2xvd19uYWNrKSB7CisJCQlpZiAoc3VtbWFyeS0+bnJfbmV3X2Fja3MgPT0gMCkKKwkJCQljd25kICs9IDE7CisJCQljYWxsLT5jb25nX2R1cF9hY2tzKys7CisJCQlpZiAoY2FsbC0+Y29uZ19kdXBfYWNrcyA9PSAyKSB7CisJCQkJY2hhbmdlID0gcnhycGNfY29uZ19yZXRyYW5zbWl0X2FnYWluOworCQkJCWNhbGwtPmNvbmdfZHVwX2Fja3MgPSAwOworCQkJCXJlc2VuZCA9IHRydWU7CisJCQl9CisJCX0gZWxzZSB7CisJCQljaGFuZ2UgPSByeHJwY19jb25nX3Byb2dyZXNzOworCQkJY3duZCA9IGNhbGwtPmNvbmdfc3N0aHJlc2g7CisJCQlpZiAoc3VtbWFyeS0+bnJfbmFja3MgPT0gMCkKKwkJCQlnb3RvIHJlc3VtZV9ub3JtYWxpdHk7CisJCX0KKwkJZ290byBvdXQ7CisKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJZ290byBvdXQ7CiAJfQogCi0Jc2tiID0gTlVMTDsKLQotCV9kZWJ1ZygicG9zdCAjJXUiLCBzZXEpOwotCUFTU0VSVENNUChjYWxsLT5yeF9kYXRhX3Bvc3QsID09LCBzZXEpOwotCWNhbGwtPnJ4X2RhdGFfcG9zdCsrOwotCi0JaWYgKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVCkKLQkJc2V0X2JpdChSWFJQQ19DQUxMX1JDVkRfTEFTVCwgJmNhbGwtPmZsYWdzKTsKLQotCS8qIGlmIHdlJ3ZlIHJlYWNoZWQgYW4gb3V0IG9mIHNlcXVlbmNlIHBhY2tldCB0aGVuIHdlIG5lZWQgdG8gZHJhaW4KLQkgKiB0aGF0IHF1ZXVlIGludG8gdGhlIHNvY2tldCBSeCBxdWV1ZSBub3cgKi8KLQlpZiAoY2FsbC0+cnhfZGF0YV9wb3N0ID09IGNhbGwtPnJ4X2ZpcnN0X29vcykgewotCQlfZGVidWcoImRyYWluIHJ4IG9vcyBub3ciKTsKLQkJcmVhZF9sb2NrKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQkJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSAmJgotCQkgICAgIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FVl9EUkFJTl9SWF9PT1MsICZjYWxsLT5ldmVudHMpKQotCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQkJcmVhZF91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOwotCX0KLQotCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKLQlhdG9taWNfaW5jKCZjYWxsLT5hY2tyX25vdF9pZGxlKTsKLQlyeHJwY19wcm9wb3NlX0FDSyhjYWxsLCBSWFJQQ19BQ0tfREVMQVksIHNwLT5oZHIuc2VyaWFsLCBmYWxzZSk7Ci0JX2xlYXZlKCIgPSAwIFtwb3N0ZWRdIik7Ci0JcmV0dXJuIDA7Ci0KLXByb3RvY29sX2Vycm9yOgotCXJldCA9IC1FQkFETVNHOworcmVzdW1lX25vcm1hbGl0eToKKwljaGFuZ2UgPSByeHJwY19jb25nX2NsZWFyZWRfbmFja3M7CisJY2FsbC0+Y29uZ19kdXBfYWNrcyA9IDA7CisJY2FsbC0+Y29uZ19leHRyYSA9IDA7CisJY2FsbC0+Y29uZ190c3RhbXAgPSBza2ItPnRzdGFtcDsKKwlpZiAoY3duZCA8IGNhbGwtPmNvbmdfc3N0aHJlc2gpCisJCWNhbGwtPmNvbmdfbW9kZSA9IFJYUlBDX0NBTExfU0xPV19TVEFSVDsKKwllbHNlCisJCWNhbGwtPmNvbmdfbW9kZSA9IFJYUlBDX0NBTExfQ09OR0VTVF9BVk9JREFOQ0U7CiBvdXQ6Ci0Jc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci0KLWRpc2NhcmRfYW5kX2FjazoKLQlfZGVidWcoImRpc2NhcmQgYW5kIEFDSyBwYWNrZXQgJXAiLCBza2IpOwotCV9fcnhycGNfcHJvcG9zZV9BQ0soY2FsbCwgYWNrLCBzcC0+aGRyLnNlcmlhbCwgdHJ1ZSk7Ci1kaXNjYXJkOgotCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKLQlyeHJwY19mcmVlX3NrYihza2IpOwotCV9sZWF2ZSgiID0gMCBbZGlzY2FyZGVkXSIpOwotCXJldHVybiAwOwotCi1lbnF1ZXVlX2FuZF9hY2s6Ci0JX19yeHJwY19wcm9wb3NlX0FDSyhjYWxsLCBhY2ssIHNwLT5oZHIuc2VyaWFsLCB0cnVlKTsKLWVucXVldWVfcGFja2V0OgotCV9uZXQoImRlZmVyIHNrYiAlcCIsIHNrYik7Ci0Jc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCXNrYl9xdWV1ZV90YWlsKCZjYWxsLT5yeF9xdWV1ZSwgc2tiKTsKLQlhdG9taWNfaW5jKCZjYWxsLT5hY2tyX25vdF9pZGxlKTsKLQlyZWFkX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOwotCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfREVBRCkKKwljdW11bGF0aXZlX2Fja3MgPSAwOworb3V0X25vX2NsZWFyX2NhOgorCWlmIChjd25kID49IFJYUlBDX1JYVFhfQlVGRl9TSVpFIC0gMSkKKwkJY3duZCA9IFJYUlBDX1JYVFhfQlVGRl9TSVpFIC0gMTsKKwljYWxsLT5jb25nX2N3bmQgPSBjd25kOworCWNhbGwtPmNvbmdfY3VtdWxfYWNrcyA9IGN1bXVsYXRpdmVfYWNrczsKKwl0cmFjZV9yeHJwY19jb25nZXN0KGNhbGwsIHN1bW1hcnksIGFja2VkX3NlcmlhbCwgY2hhbmdlKTsKKwlpZiAocmVzZW5kICYmICF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfRVZfUkVTRU5ELCAmY2FsbC0+ZXZlbnRzKSkKIAkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQlyZWFkX3VubG9jaygmY2FsbC0+c3RhdGVfbG9jayk7Ci0JX2xlYXZlKCIgPSAwIFtxdWV1ZWRdIik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuOworCitwYWNrZXRfbG9zc19kZXRlY3RlZDoKKwljaGFuZ2UgPSByeHJwY19jb25nX3Nhd19uYWNrOworCWNhbGwtPmNvbmdfbW9kZSA9IFJYUlBDX0NBTExfUEFDS0VUX0xPU1M7CisJY2FsbC0+Y29uZ19kdXBfYWNrcyA9IDA7CisJZ290byBzZW5kX2V4dHJhX2RhdGE7CisKK3NlbmRfZXh0cmFfZGF0YToKKwkvKiBTZW5kIHNvbWUgcHJldmlvdXNseSB1bnNlbnQgREFUQSBpZiB3ZSBoYXZlIHNvbWUgdG8gYWR2YW5jZSB0aGUgQUNLCisJICogc3RhdGUuCisJICovCisJaWYgKGNhbGwtPnJ4dHhfYW5ub3RhdGlvbnNbY2FsbC0+dHhfdG9wICYgUlhSUENfUlhUWF9CVUZGX01BU0tdICYKKwkgICAgUlhSUENfVFhfQU5OT19MQVNUIHx8CisJICAgIHN1bW1hcnktPm5yX2Fja3MgIT0gY2FsbC0+dHhfdG9wIC0gY2FsbC0+dHhfaGFyZF9hY2spIHsKKwkJY2FsbC0+Y29uZ19leHRyYSsrOworCQl3YWtlX3VwKCZjYWxsLT53YWl0cSk7CisJfQorCWdvdG8gb3V0X25vX2NsZWFyX2NhOwogfQogCiAvKgotICogYXNzdW1lIGFuIGltcGxpY2l0IEFDS0FMTCBvZiB0aGUgdHJhbnNtaXNzaW9uIHBoYXNlIG9mIGEgY2xpZW50IHNvY2tldCB1cG9uCi0gKiByZWNlcHRpb24gb2YgdGhlIGZpcnN0IHJlcGx5IHBhY2tldAorICogUGluZyB0aGUgb3RoZXIgZW5kIHRvIGZpbGwgb3VyIFJUVCBjYWNoZSBhbmQgdG8gcmV0cmlldmUgdGhlIHJ3aW5kCisgKiBhbmQgTVRVIHBhcmFtZXRlcnMuCiAgKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX2Fzc3VtZV9pbXBsaWNpdF9hY2thbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHUzMiBzZXJpYWwpCitzdGF0aWMgdm9pZCByeHJwY19zZW5kX3Bpbmcoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgaW50IHNrZXcpCiB7Ci0Jd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCA9IHJ4cnBjX3NrYihza2IpOworCWt0aW1lX3Qgbm93ID0gc2tiLT50c3RhbXA7CisKKwlpZiAoY2FsbC0+cGVlci0+cnR0X3VzYWdlIDwgMyB8fAorCSAgICBrdGltZV9iZWZvcmUoa3RpbWVfYWRkX21zKGNhbGwtPnBlZXItPnJ0dF9sYXN0X3JlcSwgMTAwMCksIG5vdykpCisJCXJ4cnBjX3Byb3Bvc2VfQUNLKGNhbGwsIFJYUlBDX0FDS19QSU5HLCBza2V3LCBzcC0+aGRyLnNlcmlhbCwKKwkJCQkgIHRydWUsIHRydWUsCisJCQkJICByeHJwY19wcm9wb3NlX2Fja19waW5nX2Zvcl9wYXJhbXMpOworfQorCisvKgorICogQXBwbHkgYSBoYXJkIEFDSyBieSBhZHZhbmNpbmcgdGhlIFR4IHdpbmRvdy4KKyAqLworc3RhdGljIHZvaWQgcnhycGNfcm90YXRlX3R4X3dpbmRvdyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgcnhycGNfc2VxX3QgdG8sCisJCQkJICAgc3RydWN0IHJ4cnBjX2Fja19zdW1tYXJ5ICpzdW1tYXJ5KQoreworCXN0cnVjdCBza19idWZmICpza2IsICpsaXN0ID0gTlVMTDsKKwlpbnQgaXg7CisJdTggYW5ub3RhdGlvbjsKKworCWlmIChjYWxsLT5hY2tzX2xvd2VzdF9uYWsgPT0gY2FsbC0+dHhfaGFyZF9hY2spIHsKKwkJY2FsbC0+YWNrc19sb3dlc3RfbmFrID0gdG87CisJfSBlbHNlIGlmIChiZWZvcmVfZXEoY2FsbC0+YWNrc19sb3dlc3RfbmFrLCB0bykpIHsKKwkJc3VtbWFyeS0+bmV3X2xvd19uYWNrID0gdHJ1ZTsKKwkJY2FsbC0+YWNrc19sb3dlc3RfbmFrID0gdG87CisJfQorCisJc3Bpbl9sb2NrKCZjYWxsLT5sb2NrKTsKKworCXdoaWxlIChiZWZvcmUoY2FsbC0+dHhfaGFyZF9hY2ssIHRvKSkgeworCQljYWxsLT50eF9oYXJkX2FjaysrOworCQlpeCA9IGNhbGwtPnR4X2hhcmRfYWNrICYgUlhSUENfUlhUWF9CVUZGX01BU0s7CisJCXNrYiA9IGNhbGwtPnJ4dHhfYnVmZmVyW2l4XTsKKwkJYW5ub3RhdGlvbiA9IGNhbGwtPnJ4dHhfYW5ub3RhdGlvbnNbaXhdOworCQlyeHJwY19zZWVfc2tiKHNrYiwgcnhycGNfc2tiX3R4X3JvdGF0ZWQpOworCQljYWxsLT5yeHR4X2J1ZmZlcltpeF0gPSBOVUxMOworCQljYWxsLT5yeHR4X2Fubm90YXRpb25zW2l4XSA9IDA7CisJCXNrYi0+bmV4dCA9IGxpc3Q7CisJCWxpc3QgPSBza2I7CisKKwkJaWYgKGFubm90YXRpb24gJiBSWFJQQ19UWF9BTk5PX0xBU1QpCisJCQlzZXRfYml0KFJYUlBDX0NBTExfVFhfTEFTVCwgJmNhbGwtPmZsYWdzKTsKKwkJaWYgKChhbm5vdGF0aW9uICYgUlhSUENfVFhfQU5OT19NQVNLKSAhPSBSWFJQQ19UWF9BTk5PX0FDSykKKwkJCXN1bW1hcnktPm5yX3JvdF9uZXdfYWNrcysrOworCX0KKworCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKKworCXRyYWNlX3J4cnBjX3RyYW5zbWl0KGNhbGwsICh0ZXN0X2JpdChSWFJQQ19DQUxMX1RYX0xBU1QsICZjYWxsLT5mbGFncykgPworCQkJCSAgICByeHJwY190cmFuc21pdF9yb3RhdGVfbGFzdCA6CisJCQkJICAgIHJ4cnBjX3RyYW5zbWl0X3JvdGF0ZSkpOworCXdha2VfdXAoJmNhbGwtPndhaXRxKTsKKworCXdoaWxlIChsaXN0KSB7CisJCXNrYiA9IGxpc3Q7CisJCWxpc3QgPSBza2ItPm5leHQ7CisJCXNrYi0+bmV4dCA9IE5VTEw7CisJCXJ4cnBjX2ZyZWVfc2tiKHNrYiwgcnhycGNfc2tiX3R4X2ZyZWVkKTsKKwl9Cit9CisKKy8qCisgKiBFbmQgdGhlIHRyYW5zbWlzc2lvbiBwaGFzZSBvZiBhIGNhbGwuCisgKgorICogVGhpcyBvY2N1cnMgd2hlbiB3ZSBnZXQgYW4gQUNLQUxMIHBhY2tldCwgdGhlIGZpcnN0IERBVEEgcGFja2V0IG9mIGEgcmVwbHksCisgKiBvciBhIGZpbmFsIEFDSyBwYWNrZXQuCisgKi8KK3N0YXRpYyBib29sIHJ4cnBjX2VuZF90eF9waGFzZShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgYm9vbCByZXBseV9iZWd1biwKKwkJCSAgICAgICBjb25zdCBjaGFyICphYm9ydF93aHkpCit7CisKKwlBU1NFUlQodGVzdF9iaXQoUlhSUENfQ0FMTF9UWF9MQVNULCAmY2FsbC0+ZmxhZ3MpKTsKKworCXdyaXRlX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOwogCiAJc3dpdGNoIChjYWxsLT5zdGF0ZSkgeworCWNhc2UgUlhSUENfQ0FMTF9DTElFTlRfU0VORF9SRVFVRVNUOgogCWNhc2UgUlhSUENfQ0FMTF9DTElFTlRfQVdBSVRfUkVQTFk6Ci0JCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9DTElFTlRfUkVDVl9SRVBMWTsKLQkJY2FsbC0+YWNrc19sYXRlc3QgPSBzZXJpYWw7CisJCWlmIChyZXBseV9iZWd1bikKKwkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9DTElFTlRfUkVDVl9SRVBMWTsKKwkJZWxzZQorCQkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX0NMSUVOVF9BV0FJVF9SRVBMWTsKKwkJYnJlYWs7CiAKLQkJX2RlYnVnKCJpbXBsaWNpdCBBQ0tBTEwgJSUldSIsIGNhbGwtPmFja3NfbGF0ZXN0KTsKLQkJc2V0X2JpdChSWFJQQ19DQUxMX0VWX1JDVkRfQUNLQUxMLCAmY2FsbC0+ZXZlbnRzKTsKLQkJd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQotCQlpZiAodHJ5X3RvX2RlbF90aW1lcl9zeW5jKCZjYWxsLT5yZXNlbmRfdGltZXIpID49IDApIHsKLQkJCWNsZWFyX2JpdChSWFJQQ19DQUxMX0VWX1JFU0VORF9USU1FUiwgJmNhbGwtPmV2ZW50cyk7Ci0JCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9FVl9SRVNFTkQsICZjYWxsLT5ldmVudHMpOwotCQkJY2xlYXJfYml0KFJYUlBDX0NBTExfUlVOX1JUSU1FUiwgJmNhbGwtPmZsYWdzKTsKLQkJfQorCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfQVdBSVRfQUNLOgorCQlfX3J4cnBjX2NhbGxfY29tcGxldGVkKGNhbGwpOworCQlyeHJwY19ub3RpZnlfc29ja2V0KGNhbGwpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JCWJyZWFrOworCQlnb3RvIGJhZF9zdGF0ZTsKKwl9CisKKwl3cml0ZV91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCWlmIChjYWxsLT5zdGF0ZSA9PSBSWFJQQ19DQUxMX0NMSUVOVF9BV0FJVF9SRVBMWSkgeworCQlyeHJwY19wcm9wb3NlX0FDSyhjYWxsLCBSWFJQQ19BQ0tfSURMRSwgMCwgMCwgZmFsc2UsIHRydWUsCisJCQkJICByeHJwY19wcm9wb3NlX2Fja19jbGllbnRfdHhfZW5kKTsKKwkJdHJhY2VfcnhycGNfdHJhbnNtaXQoY2FsbCwgcnhycGNfdHJhbnNtaXRfYXdhaXRfcmVwbHkpOworCX0gZWxzZSB7CisJCXRyYWNlX3J4cnBjX3RyYW5zbWl0KGNhbGwsIHJ4cnBjX3RyYW5zbWl0X2VuZCk7CisJfQorCV9sZWF2ZSgiID0gb2siKTsKKwlyZXR1cm4gdHJ1ZTsKKworYmFkX3N0YXRlOgorCXdyaXRlX3VubG9jaygmY2FsbC0+c3RhdGVfbG9jayk7CisJa2RlYnVnKCJlbmRfdHggJXMiLCByeHJwY19jYWxsX3N0YXRlc1tjYWxsLT5zdGF0ZV0pOworCXJ4cnBjX3Byb3RvX2Fib3J0KGFib3J0X3doeSwgY2FsbCwgY2FsbC0+dHhfdG9wKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qCisgKiBCZWdpbiB0aGUgcmVwbHkgcmVjZXB0aW9uIHBoYXNlIG9mIGEgY2FsbC4KKyAqLworc3RhdGljIGJvb2wgcnhycGNfcmVjZWl2aW5nX3JlcGx5KHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCXN0cnVjdCByeHJwY19hY2tfc3VtbWFyeSBzdW1tYXJ5ID0geyAwIH07CisJcnhycGNfc2VxX3QgdG9wID0gUkVBRF9PTkNFKGNhbGwtPnR4X3RvcCk7CisKKwlpZiAoY2FsbC0+YWNrcl9yZWFzb24pIHsKKwkJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKwkJY2FsbC0+YWNrcl9yZWFzb24gPSAwOworCQljYWxsLT5yZXNlbmRfYXQgPSBjYWxsLT5leHBpcmVfYXQ7CisJCWNhbGwtPmFja19hdCA9IGNhbGwtPmV4cGlyZV9hdDsKKwkJc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmxvY2spOworCQlyeHJwY19zZXRfdGltZXIoY2FsbCwgcnhycGNfdGltZXJfaW5pdF9mb3JfcmVwbHksCisJCQkJa3RpbWVfZ2V0X3JlYWwoKSk7CisJfQorCisJaWYgKCF0ZXN0X2JpdChSWFJQQ19DQUxMX1RYX0xBU1QsICZjYWxsLT5mbGFncykpCisJCXJ4cnBjX3JvdGF0ZV90eF93aW5kb3coY2FsbCwgdG9wLCAmc3VtbWFyeSk7CisJaWYgKCF0ZXN0X2JpdChSWFJQQ19DQUxMX1RYX0xBU1QsICZjYWxsLT5mbGFncykpIHsKKwkJcnhycGNfcHJvdG9fYWJvcnQoIlRYTCIsIGNhbGwsIHRvcCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKCFyeHJwY19lbmRfdHhfcGhhc2UoY2FsbCwgdHJ1ZSwgIkVURCIpKQorCQlyZXR1cm4gZmFsc2U7CisJY2FsbC0+dHhfcGhhc2UgPSBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIFNjYW4gYSBqdW1ibyBwYWNrZXQgdG8gdmFsaWRhdGUgaXRzIHN0cnVjdHVyZSBhbmQgdG8gd29yayBvdXQgaG93IG1hbnkKKyAqIHN1YnBhY2tldHMgaXQgY29udGFpbnMuCisgKgorICogQSBqdW1ibyBwYWNrZXQgaXMgYSBjb2xsZWN0aW9uIG9mIGNvbnNlY3V0aXZlIHBhY2tldHMgZ2x1ZWQgdG9nZXRoZXIgd2l0aAorICogbGl0dGxlIGhlYWRlcnMgYmV0d2VlbiB0aGF0IGluZGljYXRlIGhvdyB0byBjaGFuZ2UgdGhlIGluaXRpYWwgaGVhZGVyIGZvcgorICogZWFjaCBzdWJwYWNrZXQuCisgKgorICogUlhSUENfSlVNQk9fUEFDS0VUIG11c3QgYmUgc2V0IG9uIGFsbCBidXQgdGhlIGxhc3Qgc3VicGFja2V0IC0gYW5kIGFsbCBidXQKKyAqIHRoZSBsYXN0IGFyZSBSWFJQQ19KVU1CT19EQVRBTEVOIGluIHNpemUuICBUaGUgbGFzdCBzdWJwYWNrZXQgbWF5IGJlIG9mIGFueQorICogc2l6ZS4KKyAqLworc3RhdGljIGJvb2wgcnhycGNfdmFsaWRhdGVfanVtYm8oc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwID0gcnhycGNfc2tiKHNrYik7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IHNpemVvZihzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIpOworCXVuc2lnbmVkIGludCBsZW4gPSBza2ItPmxlbjsKKwlpbnQgbnJfanVtYm8gPSAxOworCXU4IGZsYWdzID0gc3AtPmhkci5mbGFnczsKKworCWRvIHsKKwkJbnJfanVtYm8rKzsKKwkJaWYgKGxlbiAtIG9mZnNldCA8IFJYUlBDX0pVTUJPX1NVQlBLVExFTikKKwkJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisJCWlmIChmbGFncyAmIFJYUlBDX0xBU1RfUEFDS0VUKQorCQkJZ290byBwcm90b2NvbF9lcnJvcjsKKwkJb2Zmc2V0ICs9IFJYUlBDX0pVTUJPX0RBVEFMRU47CisJCWlmIChza2JfY29weV9iaXRzKHNrYiwgb2Zmc2V0LCAmZmxhZ3MsIDEpIDwgMCkKKwkJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisJCW9mZnNldCArPSBzaXplb2Yoc3RydWN0IHJ4cnBjX2p1bWJvX2hlYWRlcik7CisJfSB3aGlsZSAoZmxhZ3MgJiBSWFJQQ19KVU1CT19QQUNLRVQpOworCisJc3AtPm5yX2p1bWJvID0gbnJfanVtYm87CisJcmV0dXJuIHRydWU7CisKK3Byb3RvY29sX2Vycm9yOgorCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIEhhbmRsZSByZWNlcHRpb24gb2YgYSBkdXBsaWNhdGUgcGFja2V0LgorICoKKyAqIFdlIGhhdmUgdG8gdGFrZSBjYXJlIHRvIGF2b2lkIGFuIGF0dGFjayBoZXJlIHdoZXJlYnkgd2UncmUgZ2l2ZW4gYSBzZXJpZXMgb2YKKyAqIGp1bWJvZ3JhbXMsIGVhY2ggd2l0aCBhIHNlcXVlbmNlIG51bWJlciBvbmUgYmVmb3JlIHRoZSBwcmVjZWRpbmcgb25lIGFuZAorICogZmlsbGVkIHVwIHRvIG1heGltdW0gVURQIHNpemUuICBJZiB0aGV5IG5ldmVyIHNlbmQgdXMgdGhlIGZpcnN0IHBhY2tldCBpbgorICogdGhlIHNlcXVlbmNlLCB0aGV5IGNhbiBjYXVzZSB1cyB0byBoYXZlIHRvIGhvbGQgb24gdG8gYXJvdW5kIDJNaUIgb2Yga2VybmVsCisgKiBzcGFjZSB1bnRpbCB0aGUgY2FsbCB0aW1lcyBvdXQuCisgKgorICogV2UgbGltaXQgdGhlIHNwYWNlIHVzYWdlIGJ5IG9ubHkgYWNjZXB0aW5nIHRocmVlIGR1cGxpY2F0ZSBqdW1ibyBwYWNrZXRzIHBlcgorICogY2FsbC4gIEFmdGVyIHRoYXQsIHdlIHRlbGwgdGhlIG90aGVyIHNpZGUgd2UncmUgbm8gbG9uZ2VyIGFjY2VwdGluZyBqdW1ib3MKKyAqICh0aGF0IGluZm9ybWF0aW9uIGlzIGVuY29kZWQgaW4gdGhlIEFDSyBwYWNrZXQpLgorICovCitzdGF0aWMgdm9pZCByeHJwY19pbnB1dF9kdXBfZGF0YShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgcnhycGNfc2VxX3Qgc2VxLAorCQkJCSB1OCBhbm5vdGF0aW9uLCBib29sICpfanVtYm9fYmFkKQoreworCS8qIERpc2NhcmQgbm9ybWFsIHBhY2tldHMgdGhhdCBhcmUgZHVwbGljYXRlcy4gKi8KKwlpZiAoYW5ub3RhdGlvbiA9PSAwKQorCQlyZXR1cm47CisKKwkvKiBTa2lwIGp1bWJvIHN1YnBhY2tldHMgdGhhdCBhcmUgZHVwbGljYXRlcy4gIFdoZW4gd2UndmUgaGFkIHRocmVlIG9yCisJICogbW9yZSBwYXJ0aWFsbHkgZHVwbGljYXRlIGp1bWJvIHBhY2tldHMsIHdlIHJlZnVzZSB0byB0YWtlIGFueSBtb3JlCisJICoganVtYm9zIGZvciB0aGlzIGNhbGwuCisJICovCisJaWYgKCEqX2p1bWJvX2JhZCkgeworCQljYWxsLT5ucl9qdW1ib19iYWQrKzsKKwkJKl9qdW1ib19iYWQgPSB0cnVlOwogCX0KIH0KIAogLyoKLSAqIHBvc3QgYW4gaW5jb21pbmcgcGFja2V0IHRvIHRoZSBub21pbmF0ZWQgY2FsbCB0byBkZWFsIHdpdGgKLSAqIC0gbXVzdCBnZXQgcmlkIG9mIHRoZSBza19idWZmLCBlaXRoZXIgYnkgZnJlZWluZyBpdCBvciBieSBxdWV1aW5nIGl0CisgKiBQcm9jZXNzIGEgREFUQSBwYWNrZXQsIGFkZGluZyB0aGUgcGFja2V0IHRvIHRoZSBSeCByaW5nLgogICovCi12b2lkIHJ4cnBjX2Zhc3RfcHJvY2Vzc19wYWNrZXQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgdm9pZCByeHJwY19pbnB1dF9kYXRhKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICB1MTYgc2tldykKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwID0gcnhycGNfc2tiKHNrYik7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IHNpemVvZihzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIpOworCXVuc2lnbmVkIGludCBpeDsKKwlyeHJwY19zZXJpYWxfdCBzZXJpYWwgPSBzcC0+aGRyLnNlcmlhbCwgYWNrX3NlcmlhbCA9IDA7CisJcnhycGNfc2VxX3Qgc2VxID0gc3AtPmhkci5zZXEsIGhhcmRfYWNrOworCWJvb2wgaW1tZWRpYXRlX2FjayA9IGZhbHNlLCBqdW1ib19iYWQgPSBmYWxzZSwgcXVldWVkOworCXUxNiBsZW47CisJdTggYWNrID0gMCwgZmxhZ3MsIGFubm90YXRpb24gPSAwOworCisJX2VudGVyKCJ7JXUsJXV9LHsldSwldX0iLAorCSAgICAgICBjYWxsLT5yeF9oYXJkX2FjaywgY2FsbC0+cnhfdG9wLCBza2ItPmxlbiwgc2VxKTsKKworCV9wcm90bygiUnggREFUQSAlJSV1IHsgIyV1IGY9JTAyeCB9IiwKKwkgICAgICAgc3AtPmhkci5zZXJpYWwsIHNlcSwgc3AtPmhkci5mbGFncyk7CisKKwlpZiAoY2FsbC0+c3RhdGUgPj0gUlhSUENfQ0FMTF9DT01QTEVURSkKKwkJcmV0dXJuOworCisJLyogUmVjZWl2ZWQgZGF0YSBpbXBsaWNpdGx5IEFDS3MgYWxsIG9mIHRoZSByZXF1ZXN0IHBhY2tldHMgd2Ugc2VudAorCSAqIHdoZW4gd2UncmUgYWN0aW5nIGFzIGEgY2xpZW50LgorCSAqLworCWlmICgoY2FsbC0+c3RhdGUgPT0gUlhSUENfQ0FMTF9DTElFTlRfU0VORF9SRVFVRVNUIHx8CisJICAgICBjYWxsLT5zdGF0ZSA9PSBSWFJQQ19DQUxMX0NMSUVOVF9BV0FJVF9SRVBMWSkgJiYKKwkgICAgIXJ4cnBjX3JlY2VpdmluZ19yZXBseShjYWxsKSkKKwkJcmV0dXJuOworCisJY2FsbC0+YWNrcl9wcmV2X3NlcSA9IHNlcTsKKworCWhhcmRfYWNrID0gUkVBRF9PTkNFKGNhbGwtPnJ4X2hhcmRfYWNrKTsKKwlpZiAoYWZ0ZXIoc2VxLCBoYXJkX2FjayArIGNhbGwtPnJ4X3dpbnNpemUpKSB7CisJCWFjayA9IFJYUlBDX0FDS19FWENFRURTX1dJTkRPVzsKKwkJYWNrX3NlcmlhbCA9IHNlcmlhbDsKKwkJZ290byBhY2s7CisJfQorCisJZmxhZ3MgPSBzcC0+aGRyLmZsYWdzOworCWlmIChmbGFncyAmIFJYUlBDX0pVTUJPX1BBQ0tFVCkgeworCQlpZiAoY2FsbC0+bnJfanVtYm9fYmFkID4gMykgeworCQkJYWNrID0gUlhSUENfQUNLX05PU1BBQ0U7CisJCQlhY2tfc2VyaWFsID0gc2VyaWFsOworCQkJZ290byBhY2s7CisJCX0KKwkJYW5ub3RhdGlvbiA9IDE7CisJfQorCituZXh0X3N1YnBhY2tldDoKKwlxdWV1ZWQgPSBmYWxzZTsKKwlpeCA9IHNlcSAmIFJYUlBDX1JYVFhfQlVGRl9NQVNLOworCWxlbiA9IHNrYi0+bGVuOworCWlmIChmbGFncyAmIFJYUlBDX0pVTUJPX1BBQ0tFVCkKKwkJbGVuID0gUlhSUENfSlVNQk9fREFUQUxFTjsKKworCWlmIChmbGFncyAmIFJYUlBDX0xBU1RfUEFDS0VUKSB7CisJCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX1JYX0xBU1QsICZjYWxsLT5mbGFncykgJiYKKwkJICAgIHNlcSAhPSBjYWxsLT5yeF90b3ApCisJCQlyZXR1cm4gcnhycGNfcHJvdG9fYWJvcnQoIkxTTiIsIGNhbGwsIHNlcSk7CisJfSBlbHNlIHsKKwkJaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfUlhfTEFTVCwgJmNhbGwtPmZsYWdzKSAmJgorCQkgICAgYWZ0ZXJfZXEoc2VxLCBjYWxsLT5yeF90b3ApKQorCQkJcmV0dXJuIHJ4cnBjX3Byb3RvX2Fib3J0KCJMU0EiLCBjYWxsLCBzZXEpOworCX0KKworCWlmIChiZWZvcmVfZXEoc2VxLCBoYXJkX2FjaykpIHsKKwkJYWNrID0gUlhSUENfQUNLX0RVUExJQ0FURTsKKwkJYWNrX3NlcmlhbCA9IHNlcmlhbDsKKwkJZ290byBza2lwOworCX0KKworCWlmIChmbGFncyAmIFJYUlBDX1JFUVVFU1RfQUNLICYmICFhY2spIHsKKwkJYWNrID0gUlhSUENfQUNLX1JFUVVFU1RFRDsKKwkJYWNrX3NlcmlhbCA9IHNlcmlhbDsKKwl9CisKKwlpZiAoY2FsbC0+cnh0eF9idWZmZXJbaXhdKSB7CisJCXJ4cnBjX2lucHV0X2R1cF9kYXRhKGNhbGwsIHNlcSwgYW5ub3RhdGlvbiwgJmp1bWJvX2JhZCk7CisJCWlmIChhY2sgIT0gUlhSUENfQUNLX0RVUExJQ0FURSkgeworCQkJYWNrID0gUlhSUENfQUNLX0RVUExJQ0FURTsKKwkJCWFja19zZXJpYWwgPSBzZXJpYWw7CisJCX0KKwkJaW1tZWRpYXRlX2FjayA9IHRydWU7CisJCWdvdG8gc2tpcDsKKwl9CisKKwkvKiBRdWV1ZSB0aGUgcGFja2V0LiAgV2UgdXNlIGEgY291cGxlIG9mIG1lbW9yeSBiYXJyaWVycyBoZXJlIGFzIG5lZWQKKwkgKiB0byBtYWtlIHN1cmUgdGhhdCByeF90b3AgaXMgcGVyY2VpdmVkIHRvIGJlIHNldCBhZnRlciB0aGUgYnVmZmVyCisJICogcG9pbnRlciBhbmQgdGhhdCB0aGUgYnVmZmVyIHBvaW50ZXIgaXMgc2V0IGFmdGVyIHRoZSBhbm5vdGF0aW9uIGFuZAorCSAqIHRoZSBza2IgZGF0YS4KKwkgKgorCSAqIEJhcnJpZXJzIGFnYWluc3QgcnhycGNfcmVjdm1zZ19kYXRhKCkgYW5kIHJ4cnBjX3JvdGF0ZV9yeF93aW5kb3coKQorCSAqIGFuZCBhbHNvIHJ4cnBjX2ZpbGxfb3V0X2FjaygpLgorCSAqLworCXJ4cnBjX2dldF9za2Ioc2tiLCByeHJwY19za2JfcnhfZ290KTsKKwljYWxsLT5yeHR4X2Fubm90YXRpb25zW2l4XSA9IGFubm90YXRpb247CisJc21wX3dtYigpOworCWNhbGwtPnJ4dHhfYnVmZmVyW2l4XSA9IHNrYjsKKwlpZiAoYWZ0ZXIoc2VxLCBjYWxsLT5yeF90b3ApKSB7CisJCXNtcF9zdG9yZV9yZWxlYXNlKCZjYWxsLT5yeF90b3AsIHNlcSk7CisJfSBlbHNlIGlmIChiZWZvcmUoc2VxLCBjYWxsLT5yeF90b3ApKSB7CisJCS8qIFNlbmQgYW4gaW1tZWRpYXRlIEFDSyBpZiB3ZSBmaWxsIGluIGEgaG9sZSAqLworCQlpZiAoIWFjaykgeworCQkJYWNrID0gUlhSUENfQUNLX0RFTEFZOworCQkJYWNrX3NlcmlhbCA9IHNlcmlhbDsKKwkJfQorCQlpbW1lZGlhdGVfYWNrID0gdHJ1ZTsKKwl9CisJaWYgKGZsYWdzICYgUlhSUENfTEFTVF9QQUNLRVQpIHsKKwkJc2V0X2JpdChSWFJQQ19DQUxMX1JYX0xBU1QsICZjYWxsLT5mbGFncyk7CisJCXRyYWNlX3J4cnBjX3JlY2VpdmUoY2FsbCwgcnhycGNfcmVjZWl2ZV9xdWV1ZV9sYXN0LCBzZXJpYWwsIHNlcSk7CisJfSBlbHNlIHsKKwkJdHJhY2VfcnhycGNfcmVjZWl2ZShjYWxsLCByeHJwY19yZWNlaXZlX3F1ZXVlLCBzZXJpYWwsIHNlcSk7CisJfQorCXF1ZXVlZCA9IHRydWU7CisKKwlpZiAoYWZ0ZXJfZXEoc2VxLCBjYWxsLT5yeF9leHBlY3RfbmV4dCkpIHsKKwkJaWYgKGFmdGVyKHNlcSwgY2FsbC0+cnhfZXhwZWN0X25leHQpKSB7CisJCQlfbmV0KCJPT1MgJXUgPiAldSIsIHNlcSwgY2FsbC0+cnhfZXhwZWN0X25leHQpOworCQkJYWNrID0gUlhSUENfQUNLX09VVF9PRl9TRVFVRU5DRTsKKwkJCWFja19zZXJpYWwgPSBzZXJpYWw7CisJCX0KKwkJY2FsbC0+cnhfZXhwZWN0X25leHQgPSBzZXEgKyAxOworCX0KKworc2tpcDoKKwlvZmZzZXQgKz0gbGVuOworCWlmIChmbGFncyAmIFJYUlBDX0pVTUJPX1BBQ0tFVCkgeworCQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIG9mZnNldCwgJmZsYWdzLCAxKSA8IDApCisJCQlyZXR1cm4gcnhycGNfcHJvdG9fYWJvcnQoIlhKRiIsIGNhbGwsIHNlcSk7CisJCW9mZnNldCArPSBzaXplb2Yoc3RydWN0IHJ4cnBjX2p1bWJvX2hlYWRlcik7CisJCXNlcSsrOworCQlzZXJpYWwrKzsKKwkJYW5ub3RhdGlvbisrOworCQlpZiAoZmxhZ3MgJiBSWFJQQ19KVU1CT19QQUNLRVQpCisJCQlhbm5vdGF0aW9uIHw9IFJYUlBDX1JYX0FOTk9fSkxBU1Q7CisJCWlmIChhZnRlcihzZXEsIGhhcmRfYWNrICsgY2FsbC0+cnhfd2luc2l6ZSkpIHsKKwkJCWFjayA9IFJYUlBDX0FDS19FWENFRURTX1dJTkRPVzsKKwkJCWFja19zZXJpYWwgPSBzZXJpYWw7CisJCQlpZiAoIWp1bWJvX2JhZCkgeworCQkJCWNhbGwtPm5yX2p1bWJvX2JhZCsrOworCQkJCWp1bWJvX2JhZCA9IHRydWU7CisJCQl9CisJCQlnb3RvIGFjazsKKwkJfQorCisJCV9wcm90bygiUnggREFUQSBKdW1ibyAlJSV1Iiwgc2VyaWFsKTsKKwkJZ290byBuZXh0X3N1YnBhY2tldDsKKwl9CisKKwlpZiAocXVldWVkICYmIGZsYWdzICYgUlhSUENfTEFTVF9QQUNLRVQgJiYgIWFjaykgeworCQlhY2sgPSBSWFJQQ19BQ0tfREVMQVk7CisJCWFja19zZXJpYWwgPSBzZXJpYWw7CisJfQorCithY2s6CisJaWYgKGFjaykKKwkJcnhycGNfcHJvcG9zZV9BQ0soY2FsbCwgYWNrLCBza2V3LCBhY2tfc2VyaWFsLAorCQkJCSAgaW1tZWRpYXRlX2FjaywgdHJ1ZSwKKwkJCQkgIHJ4cnBjX3Byb3Bvc2VfYWNrX2lucHV0X2RhdGEpOworCisJaWYgKHNwLT5oZHIuc2VxID09IFJFQURfT05DRShjYWxsLT5yeF9oYXJkX2FjaykgKyAxKQorCQlyeHJwY19ub3RpZnlfc29ja2V0KGNhbGwpOworCV9sZWF2ZSgiIFtxdWV1ZWRdIik7Cit9CisKKy8qCisgKiBQcm9jZXNzIGEgcmVxdWVzdGVkIEFDSy4KKyAqLworc3RhdGljIHZvaWQgcnhycGNfaW5wdXRfcmVxdWVzdGVkX2FjayhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkgICAgICBrdGltZV90IHJlc3BfdGltZSwKKwkJCQkgICAgICByeHJwY19zZXJpYWxfdCBvcmlnX3NlcmlhbCwKKwkJCQkgICAgICByeHJwY19zZXJpYWxfdCBhY2tfc2VyaWFsKQoreworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlrdGltZV90IHNlbnRfYXQ7CisJaW50IGl4OworCisJZm9yIChpeCA9IDA7IGl4IDwgUlhSUENfUlhUWF9CVUZGX1NJWkU7IGl4KyspIHsKKwkJc2tiID0gY2FsbC0+cnh0eF9idWZmZXJbaXhdOworCQlpZiAoIXNrYikKKwkJCWNvbnRpbnVlOworCisJCXNwID0gcnhycGNfc2tiKHNrYik7CisJCWlmIChzcC0+aGRyLnNlcmlhbCAhPSBvcmlnX3NlcmlhbCkKKwkJCWNvbnRpbnVlOworCQlzbXBfcm1iKCk7CisJCXNlbnRfYXQgPSBza2ItPnRzdGFtcDsKKwkJZ290byBmb3VuZDsKKwl9CisJcmV0dXJuOworCitmb3VuZDoKKwlyeHJwY19wZWVyX2FkZF9ydHQoY2FsbCwgcnhycGNfcnR0X3J4X3JlcXVlc3RlZF9hY2ssCisJCQkgICBvcmlnX3NlcmlhbCwgYWNrX3NlcmlhbCwgc2VudF9hdCwgcmVzcF90aW1lKTsKK30KKworLyoKKyAqIFByb2Nlc3MgYSBwaW5nIHJlc3BvbnNlLgorICovCitzdGF0aWMgdm9pZCByeHJwY19pbnB1dF9waW5nX3Jlc3BvbnNlKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJCSAgICAgIGt0aW1lX3QgcmVzcF90aW1lLAorCQkJCSAgICAgIHJ4cnBjX3NlcmlhbF90IG9yaWdfc2VyaWFsLAorCQkJCSAgICAgIHJ4cnBjX3NlcmlhbF90IGFja19zZXJpYWwpCit7CisJcnhycGNfc2VyaWFsX3QgcGluZ19zZXJpYWw7CisJa3RpbWVfdCBwaW5nX3RpbWU7CisKKwlwaW5nX3RpbWUgPSBjYWxsLT5hY2tyX3BpbmdfdGltZTsKKwlzbXBfcm1iKCk7CisJcGluZ19zZXJpYWwgPSBjYWxsLT5hY2tyX3Bpbmc7CisKKwlpZiAoIXRlc3RfYml0KFJYUlBDX0NBTExfUElOR0lORywgJmNhbGwtPmZsYWdzKSB8fAorCSAgICBiZWZvcmUob3JpZ19zZXJpYWwsIHBpbmdfc2VyaWFsKSkKKwkJcmV0dXJuOworCWNsZWFyX2JpdChSWFJQQ19DQUxMX1BJTkdJTkcsICZjYWxsLT5mbGFncyk7CisJaWYgKGFmdGVyKG9yaWdfc2VyaWFsLCBwaW5nX3NlcmlhbCkpCisJCXJldHVybjsKKworCXJ4cnBjX3BlZXJfYWRkX3J0dChjYWxsLCByeHJwY19ydHRfcnhfcGluZ19yZXNwb25zZSwKKwkJCSAgIG9yaWdfc2VyaWFsLCBhY2tfc2VyaWFsLCBwaW5nX3RpbWUsIHJlc3BfdGltZSk7Cit9CisKKy8qCisgKiBQcm9jZXNzIHRoZSBleHRyYSBpbmZvcm1hdGlvbiB0aGF0IG1heSBiZSBhcHBlbmRlZCB0byBhbiBBQ0sgcGFja2V0CisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX2lucHV0X2Fja2luZm8oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJc3RydWN0IHJ4cnBjX2Fja2luZm8gKmFja2luZm8pCit7CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCA9IHJ4cnBjX3NrYihza2IpOworCXN0cnVjdCByeHJwY19wZWVyICpwZWVyOworCXVuc2lnbmVkIGludCBtdHU7CisJdTMyIHJ3aW5kID0gbnRvaGwoYWNraW5mby0+cndpbmQpOworCisJX3Byb3RvKCJSeCBBQ0sgJSUldSBJbmZvIHsgcng9JXUgbWF4PSV1IHJ3aW49JXUgam09JXUgfSIsCisJICAgICAgIHNwLT5oZHIuc2VyaWFsLAorCSAgICAgICBudG9obChhY2tpbmZvLT5yeE1UVSksIG50b2hsKGFja2luZm8tPm1heE1UVSksCisJICAgICAgIHJ3aW5kLCBudG9obChhY2tpbmZvLT5qdW1ib19tYXgpKTsKKworCWlmIChyd2luZCA+IFJYUlBDX1JYVFhfQlVGRl9TSVpFIC0gMSkKKwkJcndpbmQgPSBSWFJQQ19SWFRYX0JVRkZfU0laRSAtIDE7CisJY2FsbC0+dHhfd2luc2l6ZSA9IHJ3aW5kOworCWlmIChjYWxsLT5jb25nX3NzdGhyZXNoID4gcndpbmQpCisJCWNhbGwtPmNvbmdfc3N0aHJlc2ggPSByd2luZDsKKworCW10dSA9IG1pbihudG9obChhY2tpbmZvLT5yeE1UVSksIG50b2hsKGFja2luZm8tPm1heE1UVSkpOworCisJcGVlciA9IGNhbGwtPnBlZXI7CisJaWYgKG10dSA8IHBlZXItPm1heGRhdGEpIHsKKwkJc3Bpbl9sb2NrX2JoKCZwZWVyLT5sb2NrKTsKKwkJcGVlci0+bWF4ZGF0YSA9IG10dTsKKwkJcGVlci0+bXR1ID0gbXR1ICsgcGVlci0+aGRyc2l6ZTsKKwkJc3Bpbl91bmxvY2tfYmgoJnBlZXItPmxvY2spOworCQlfbmV0KCJOZXQgTVRVICV1IChtYXhkYXRhICV1KSIsIHBlZXItPm10dSwgcGVlci0+bWF4ZGF0YSk7CisJfQorfQorCisvKgorICogUHJvY2VzcyBpbmRpdmlkdWFsIHNvZnQgQUNLcy4KKyAqCisgKiBFYWNoIEFDSyBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gb25lIHBhY2tldCBhbmQgY2FuIGJlIGVpdGhlciBhbiBBQ0sgb3IKKyAqIGEgTkFLLiAgSWYgd2UgZ2V0IGZpbmQgYW4gZXhwbGljaXRseSBOQUsnZCBwYWNrZXQgd2UgcmVzZW5kIGltbWVkaWF0ZWx5OworICogcGFja2V0cyB0aGF0IGxpZSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgQUNLIGxpc3QgYXJlIHNjaGVkdWxlZCBmb3IgcmVzZW5kIGJ5CisgKiB0aGUgdGltZXIgb24gdGhlIGJhc2lzIHRoYXQgdGhlIHBlZXIgbWlnaHQganVzdCBub3QgaGF2ZSBwcm9jZXNzZWQgdGhlbSBhdAorICogdGhlIHRpbWUgdGhlIEFDSyB3YXMgc2VudC4KKyAqLworc3RhdGljIHZvaWQgcnhycGNfaW5wdXRfc29mdF9hY2tzKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCB1OCAqYWNrcywKKwkJCQkgIHJ4cnBjX3NlcV90IHNlcSwgaW50IG5yX2Fja3MsCisJCQkJICBzdHJ1Y3QgcnhycGNfYWNrX3N1bW1hcnkgKnN1bW1hcnkpCit7CisJaW50IGl4OworCXU4IGFubm90YXRpb24sIGFubm9fdHlwZTsKKworCWZvciAoOyBucl9hY2tzID4gMDsgbnJfYWNrcy0tLCBzZXErKykgeworCQlpeCA9IHNlcSAmIFJYUlBDX1JYVFhfQlVGRl9NQVNLOworCQlhbm5vdGF0aW9uID0gY2FsbC0+cnh0eF9hbm5vdGF0aW9uc1tpeF07CisJCWFubm9fdHlwZSA9IGFubm90YXRpb24gJiBSWFJQQ19UWF9BTk5PX01BU0s7CisJCWFubm90YXRpb24gJj0gflJYUlBDX1RYX0FOTk9fTUFTSzsKKwkJc3dpdGNoICgqYWNrcysrKSB7CisJCWNhc2UgUlhSUENfQUNLX1RZUEVfQUNLOgorCQkJc3VtbWFyeS0+bnJfYWNrcysrOworCQkJaWYgKGFubm9fdHlwZSA9PSBSWFJQQ19UWF9BTk5PX0FDSykKKwkJCQljb250aW51ZTsKKwkJCXN1bW1hcnktPm5yX25ld19hY2tzKys7CisJCQljYWxsLT5yeHR4X2Fubm90YXRpb25zW2l4XSA9CisJCQkJUlhSUENfVFhfQU5OT19BQ0sgfCBhbm5vdGF0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgUlhSUENfQUNLX1RZUEVfTkFDSzoKKwkJCWlmICghc3VtbWFyeS0+bnJfbmFja3MgJiYKKwkJCSAgICBjYWxsLT5hY2tzX2xvd2VzdF9uYWsgIT0gc2VxKSB7CisJCQkJY2FsbC0+YWNrc19sb3dlc3RfbmFrID0gc2VxOworCQkJCXN1bW1hcnktPm5ld19sb3dfbmFjayA9IHRydWU7CisJCQl9CisJCQlzdW1tYXJ5LT5ucl9uYWNrcysrOworCQkJaWYgKGFubm9fdHlwZSA9PSBSWFJQQ19UWF9BTk5PX05BSykKKwkJCQljb250aW51ZTsKKwkJCXN1bW1hcnktPm5yX25ld19uYWNrcysrOworCQkJaWYgKGFubm9fdHlwZSA9PSBSWFJQQ19UWF9BTk5PX1JFVFJBTlMpCisJCQkJY29udGludWU7CisJCQljYWxsLT5yeHR4X2Fubm90YXRpb25zW2l4XSA9CisJCQkJUlhSUENfVFhfQU5OT19OQUsgfCBhbm5vdGF0aW9uOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gcnhycGNfcHJvdG9fYWJvcnQoIlNGVCIsIGNhbGwsIDApOworCQl9CisJfQorfQorCisvKgorICogUHJvY2VzcyBhbiBBQ0sgcGFja2V0LgorICoKKyAqIGFjay5maXJzdFBhY2tldCBpcyB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBmaXJzdCBzb2Z0LUFDSydkL05BSydkIHBhY2tldAorICogaW4gdGhlIEFDSyBhcnJheS4gIEFueXRoaW5nIGJlZm9yZSB0aGF0IGlzIGhhcmQtQUNLJ2QgYW5kIG1heSBiZSBkaXNjYXJkZWQuCisgKgorICogQSBoYXJkLUFDSyBtZWFucyB0aGF0IGEgcGFja2V0IGhhcyBiZWVuIHByb2Nlc3NlZCBhbmQgbWF5IGJlIGRpc2NhcmRlZDsgYQorICogc29mdC1BQ0sgbWVhbnMgdGhhdCB0aGUgcGFja2V0IG1heSBiZSBkaXNjYXJkZWQgYW5kIHJldHJhbnNtaXNzaW9uCisgKiByZXF1ZXN0ZWQuICBBIHBoYXNlIGlzIGNvbXBsZXRlIHdoZW4gYWxsIHBhY2tldHMgYXJlIGhhcmQtQUNLJ2QuCisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX2lucHV0X2FjayhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICB1MTYgc2tldykKK3sKKwlzdHJ1Y3QgcnhycGNfYWNrX3N1bW1hcnkgc3VtbWFyeSA9IHsgMCB9OworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKKwl1bmlvbiB7CisJCXN0cnVjdCByeHJwY19hY2twYWNrZXQgYWNrOworCQlzdHJ1Y3QgcnhycGNfYWNraW5mbyBpbmZvOworCQl1OCBhY2tzW1JYUlBDX01BWEFDS1NdOworCX0gYnVmOworCXJ4cnBjX3NlcmlhbF90IGFja2VkX3NlcmlhbDsKKwlyeHJwY19zZXFfdCBmaXJzdF9zb2Z0X2FjaywgaGFyZF9hY2s7CisJaW50IG5yX2Fja3MsIG9mZnNldCwgaW9mZnNldDsKKworCV9lbnRlcigiIik7CisKKwlvZmZzZXQgPSBzaXplb2Yoc3RydWN0IHJ4cnBjX3dpcmVfaGVhZGVyKTsKKwlpZiAoc2tiX2NvcHlfYml0cyhza2IsIG9mZnNldCwgJmJ1Zi5hY2ssIHNpemVvZihidWYuYWNrKSkgPCAwKSB7CisJCV9kZWJ1ZygiZXh0cmFjdGlvbiBmYWlsdXJlIik7CisJCXJldHVybiByeHJwY19wcm90b19hYm9ydCgiWEFLIiwgY2FsbCwgMCk7CisJfQorCW9mZnNldCArPSBzaXplb2YoYnVmLmFjayk7CisKKwlhY2tlZF9zZXJpYWwgPSBudG9obChidWYuYWNrLnNlcmlhbCk7CisJZmlyc3Rfc29mdF9hY2sgPSBudG9obChidWYuYWNrLmZpcnN0UGFja2V0KTsKKwloYXJkX2FjayA9IGZpcnN0X3NvZnRfYWNrIC0gMTsKKwlucl9hY2tzID0gYnVmLmFjay5uQWNrczsKKwlzdW1tYXJ5LmFja19yZWFzb24gPSAoYnVmLmFjay5yZWFzb24gPCBSWFJQQ19BQ0tfX0lOVkFMSUQgPworCQkJICAgICAgYnVmLmFjay5yZWFzb24gOiBSWFJQQ19BQ0tfX0lOVkFMSUQpOworCisJdHJhY2VfcnhycGNfcnhfYWNrKGNhbGwsIGZpcnN0X3NvZnRfYWNrLCBzdW1tYXJ5LmFja19yZWFzb24sIG5yX2Fja3MpOworCisJX3Byb3RvKCJSeCBBQ0sgJSUldSB7IG09JWh1IGY9IyV1IHA9IyV1IHM9JSUldSByPSVzIG49JXUgfSIsCisJICAgICAgIHNwLT5oZHIuc2VyaWFsLAorCSAgICAgICBudG9ocyhidWYuYWNrLm1heFNrZXcpLAorCSAgICAgICBmaXJzdF9zb2Z0X2FjaywKKwkgICAgICAgbnRvaGwoYnVmLmFjay5wcmV2aW91c1BhY2tldCksCisJICAgICAgIGFja2VkX3NlcmlhbCwKKwkgICAgICAgcnhycGNfYWNrX25hbWVzW3N1bW1hcnkuYWNrX3JlYXNvbl0sCisJICAgICAgIGJ1Zi5hY2subkFja3MpOworCisJaWYgKGJ1Zi5hY2sucmVhc29uID09IFJYUlBDX0FDS19QSU5HX1JFU1BPTlNFKQorCQlyeHJwY19pbnB1dF9waW5nX3Jlc3BvbnNlKGNhbGwsIHNrYi0+dHN0YW1wLCBhY2tlZF9zZXJpYWwsCisJCQkJCSAgc3AtPmhkci5zZXJpYWwpOworCWlmIChidWYuYWNrLnJlYXNvbiA9PSBSWFJQQ19BQ0tfUkVRVUVTVEVEKQorCQlyeHJwY19pbnB1dF9yZXF1ZXN0ZWRfYWNrKGNhbGwsIHNrYi0+dHN0YW1wLCBhY2tlZF9zZXJpYWwsCisJCQkJCSAgc3AtPmhkci5zZXJpYWwpOworCisJaWYgKGJ1Zi5hY2sucmVhc29uID09IFJYUlBDX0FDS19QSU5HKSB7CisJCV9wcm90bygiUnggQUNLICUlJXUgUElORyBSZXF1ZXN0Iiwgc3AtPmhkci5zZXJpYWwpOworCQlyeHJwY19wcm9wb3NlX0FDSyhjYWxsLCBSWFJQQ19BQ0tfUElOR19SRVNQT05TRSwKKwkJCQkgIHNrZXcsIHNwLT5oZHIuc2VyaWFsLCB0cnVlLCB0cnVlLAorCQkJCSAgcnhycGNfcHJvcG9zZV9hY2tfcmVzcG9uZF90b19waW5nKTsKKwl9IGVsc2UgaWYgKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19SRVFVRVNUX0FDSykgeworCQlyeHJwY19wcm9wb3NlX0FDSyhjYWxsLCBSWFJQQ19BQ0tfUkVRVUVTVEVELAorCQkJCSAgc2tldywgc3AtPmhkci5zZXJpYWwsIHRydWUsIHRydWUsCisJCQkJICByeHJwY19wcm9wb3NlX2Fja19yZXNwb25kX3RvX2Fjayk7CisJfQorCisJaW9mZnNldCA9IG9mZnNldCArIG5yX2Fja3MgKyAzOworCWlmIChza2ItPmxlbiA+PSBpb2Zmc2V0ICsgc2l6ZW9mKGJ1Zi5pbmZvKSkgeworCQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIGlvZmZzZXQsICZidWYuaW5mbywgc2l6ZW9mKGJ1Zi5pbmZvKSkgPCAwKQorCQkJcmV0dXJuIHJ4cnBjX3Byb3RvX2Fib3J0KCJYQUkiLCBjYWxsLCAwKTsKKwkJcnhycGNfaW5wdXRfYWNraW5mbyhjYWxsLCBza2IsICZidWYuaW5mbyk7CisJfQorCisJaWYgKGZpcnN0X3NvZnRfYWNrID09IDApCisJCXJldHVybiByeHJwY19wcm90b19hYm9ydCgiQUswIiwgY2FsbCwgMCk7CisKKwkvKiBJZ25vcmUgQUNLcyB1bmxlc3Mgd2UgYXJlIG9yIGhhdmUganVzdCBiZWVuIHRyYW5zbWl0dGluZy4gKi8KKwlzd2l0Y2ggKGNhbGwtPnN0YXRlKSB7CisJY2FzZSBSWFJQQ19DQUxMX0NMSUVOVF9TRU5EX1JFUVVFU1Q6CisJY2FzZSBSWFJQQ19DQUxMX0NMSUVOVF9BV0FJVF9SRVBMWToKKwljYXNlIFJYUlBDX0NBTExfU0VSVkVSX1NFTkRfUkVQTFk6CisJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9BV0FJVF9BQ0s6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisKKwkvKiBEaXNjYXJkIGFueSBvdXQtb2Ytb3JkZXIgb3IgZHVwbGljYXRlIEFDS3MuICovCisJaWYgKGJlZm9yZV9lcShzcC0+aGRyLnNlcmlhbCwgY2FsbC0+YWNrc19sYXRlc3QpKSB7CisJCV9kZWJ1ZygiZGlzY2FyZCBBQ0sgJWQgPD0gJWQiLAorCQkgICAgICAgc3AtPmhkci5zZXJpYWwsIGNhbGwtPmFja3NfbGF0ZXN0KTsKKwkJcmV0dXJuOworCX0KKwljYWxsLT5hY2tzX2xhdGVzdF90cyA9IHNrYi0+dHN0YW1wOworCWNhbGwtPmFja3NfbGF0ZXN0ID0gc3AtPmhkci5zZXJpYWw7CisKKwlpZiAoYmVmb3JlKGhhcmRfYWNrLCBjYWxsLT50eF9oYXJkX2FjaykgfHwKKwkgICAgYWZ0ZXIoaGFyZF9hY2ssIGNhbGwtPnR4X3RvcCkpCisJCXJldHVybiByeHJwY19wcm90b19hYm9ydCgiQUtXIiwgY2FsbCwgMCk7CisJaWYgKG5yX2Fja3MgPiBjYWxsLT50eF90b3AgLSBoYXJkX2FjaykKKwkJcmV0dXJuIHJ4cnBjX3Byb3RvX2Fib3J0KCJBS04iLCBjYWxsLCAwKTsKKworCWlmIChhZnRlcihoYXJkX2FjaywgY2FsbC0+dHhfaGFyZF9hY2spKQorCQlyeHJwY19yb3RhdGVfdHhfd2luZG93KGNhbGwsIGhhcmRfYWNrLCAmc3VtbWFyeSk7CisKKwlpZiAobnJfYWNrcyA+IDApIHsKKwkJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCBvZmZzZXQsIGJ1Zi5hY2tzLCBucl9hY2tzKSA8IDApCisJCQlyZXR1cm4gcnhycGNfcHJvdG9fYWJvcnQoIlhTQSIsIGNhbGwsIDApOworCQlyeHJwY19pbnB1dF9zb2Z0X2Fja3MoY2FsbCwgYnVmLmFja3MsIGZpcnN0X3NvZnRfYWNrLCBucl9hY2tzLAorCQkJCSAgICAgICZzdW1tYXJ5KTsKKwl9CisKKwlpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9UWF9MQVNULCAmY2FsbC0+ZmxhZ3MpKSB7CisJCXJ4cnBjX2VuZF90eF9waGFzZShjYWxsLCBmYWxzZSwgIkVUQSIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGNhbGwtPnJ4dHhfYW5ub3RhdGlvbnNbY2FsbC0+dHhfdG9wICYgUlhSUENfUlhUWF9CVUZGX01BU0tdICYKKwkgICAgUlhSUENfVFhfQU5OT19MQVNUICYmCisJICAgIHN1bW1hcnkubnJfYWNrcyA9PSBjYWxsLT50eF90b3AgLSBoYXJkX2FjaykKKwkJcnhycGNfcHJvcG9zZV9BQ0soY2FsbCwgUlhSUENfQUNLX1BJTkcsIHNrZXcsIHNwLT5oZHIuc2VyaWFsLAorCQkJCSAgZmFsc2UsIHRydWUsCisJCQkJICByeHJwY19wcm9wb3NlX2Fja19waW5nX2Zvcl9sb3N0X3JlcGx5KTsKKworCXJldHVybiByeHJwY19jb25nZXN0aW9uX21hbmFnZW1lbnQoY2FsbCwgc2tiLCAmc3VtbWFyeSwgYWNrZWRfc2VyaWFsKTsKK30KKworLyoKKyAqIFByb2Nlc3MgYW4gQUNLQUxMIHBhY2tldC4KKyAqLworc3RhdGljIHZvaWQgcnhycGNfaW5wdXRfYWNrYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByeHJwY19hY2tfc3VtbWFyeSBzdW1tYXJ5ID0geyAwIH07CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCA9IHJ4cnBjX3NrYihza2IpOworCisJX3Byb3RvKCJSeCBBQ0tBTEwgJSUldSIsIHNwLT5oZHIuc2VyaWFsKTsKKworCXJ4cnBjX3JvdGF0ZV90eF93aW5kb3coY2FsbCwgY2FsbC0+dHhfdG9wLCAmc3VtbWFyeSk7CisJaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfVFhfTEFTVCwgJmNhbGwtPmZsYWdzKSkKKwkJcnhycGNfZW5kX3R4X3BoYXNlKGNhbGwsIGZhbHNlLCAiRVRMIik7Cit9CisKKy8qCisgKiBQcm9jZXNzIGFuIEFCT1JUIHBhY2tldC4KKyAqLworc3RhdGljIHZvaWQgcnhycGNfaW5wdXRfYWJvcnQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCA9IHJ4cnBjX3NrYihza2IpOwogCV9fYmUzMiB3dG1wOwotCXUzMiBoaV9zZXJpYWwsIGFib3J0X2NvZGU7CisJdTMyIGFib3J0X2NvZGUgPSBSWF9DQUxMX0RFQUQ7CisKKwlfZW50ZXIoIiIpOworCisJaWYgKHNrYi0+bGVuID49IDQgJiYKKwkgICAgc2tiX2NvcHlfYml0cyhza2IsIHNpemVvZihzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIpLAorCQkJICAmd3RtcCwgc2l6ZW9mKHd0bXApKSA+PSAwKQorCQlhYm9ydF9jb2RlID0gbnRvaGwod3RtcCk7CisKKwlfcHJvdG8oIlJ4IEFCT1JUICUlJXUgeyAleCB9Iiwgc3AtPmhkci5zZXJpYWwsIGFib3J0X2NvZGUpOworCisJaWYgKHJ4cnBjX3NldF9jYWxsX2NvbXBsZXRpb24oY2FsbCwgUlhSUENfQ0FMTF9SRU1PVEVMWV9BQk9SVEVELAorCQkJCSAgICAgIGFib3J0X2NvZGUsIEVDT05OQUJPUlRFRCkpCisJCXJ4cnBjX25vdGlmeV9zb2NrZXQoY2FsbCk7Cit9CisKKy8qCisgKiBQcm9jZXNzIGFuIGluY29taW5nIGNhbGwgcGFja2V0LgorICovCitzdGF0aWMgdm9pZCByeHJwY19pbnB1dF9jYWxsX3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IHNrZXcpCit7CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCA9IHJ4cnBjX3NrYihza2IpOwogCiAJX2VudGVyKCIlcCwlcCIsIGNhbGwsIHNrYik7CiAKLQlBU1NFUlQoIWlycXNfZGlzYWJsZWQoKSk7Ci0KLSNpZiAwIC8vIElOSkVDVCBSWCBFUlJPUgotCWlmIChzcC0+aGRyLnR5cGUgPT0gUlhSUENfUEFDS0VUX1RZUEVfREFUQSkgewotCQlzdGF0aWMgaW50IHNraXAgPSAwOwotCQlpZiAoKytza2lwID09IDMpIHsKLQkJCXByaW50aygiRFJPUFBFRCAzUkQgUEFDS0VUISEhISEhISEhISEhIVxuIik7Ci0JCQlza2lwID0gMDsKLQkJCWdvdG8gZnJlZV9wYWNrZXQ7Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCS8qIHRyYWNrIHRoZSBsYXRlc3Qgc2VyaWFsIG51bWJlciBvbiB0aGlzIGNvbm5lY3Rpb24gZm9yIEFDSyBwYWNrZXQKLQkgKiBpbmZvcm1hdGlvbiAqLwotCWhpX3NlcmlhbCA9IGF0b21pY19yZWFkKCZjYWxsLT5jb25uLT5oaV9zZXJpYWwpOwotCXdoaWxlIChzcC0+aGRyLnNlcmlhbCA+IGhpX3NlcmlhbCkKLQkJaGlfc2VyaWFsID0gYXRvbWljX2NtcHhjaGcoJmNhbGwtPmNvbm4tPmhpX3NlcmlhbCwgaGlfc2VyaWFsLAotCQkJCQkgICBzcC0+aGRyLnNlcmlhbCk7Ci0KLQkvKiByZXF1ZXN0IEFDSyBnZW5lcmF0aW9uIGZvciBhbnkgQUNLIG9yIERBVEEgcGFja2V0IHRoYXQgcmVxdWVzdHMKLQkgKiBpdCAqLwotCWlmIChzcC0+aGRyLmZsYWdzICYgUlhSUENfUkVRVUVTVF9BQ0spIHsKLQkJX3Byb3RvKCJBQ0sgUmVxdWVzdGVkIG9uICUlJXUiLCBzcC0+aGRyLnNlcmlhbCk7Ci0JCXJ4cnBjX3Byb3Bvc2VfQUNLKGNhbGwsIFJYUlBDX0FDS19SRVFVRVNURUQsIHNwLT5oZHIuc2VyaWFsLCBmYWxzZSk7Ci0JfQotCiAJc3dpdGNoIChzcC0+aGRyLnR5cGUpIHsKLQljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0FCT1JUOgotCQlfZGVidWcoImFib3J0Iik7CisJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9EQVRBOgorCQlyeHJwY19pbnB1dF9kYXRhKGNhbGwsIHNrYiwgc2tldyk7CisJCWJyZWFrOwogCi0JCWlmIChza2JfY29weV9iaXRzKHNrYiwgMCwgJnd0bXAsIHNpemVvZih3dG1wKSkgPCAwKQotCQkJZ290byBwcm90b2NvbF9lcnJvcjsKLQotCQlhYm9ydF9jb2RlID0gbnRvaGwod3RtcCk7Ci0JCV9wcm90bygiUnggQUJPUlQgJSUldSB7ICV4IH0iLCBzcC0+aGRyLnNlcmlhbCwgYWJvcnRfY29kZSk7Ci0KLQkJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKLQkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9SRU1PVEVMWV9BQk9SVEVEOwotCQkJY2FsbC0+cmVtb3RlX2Fib3J0ID0gYWJvcnRfY29kZTsKLQkJCXNldF9iaXQoUlhSUENfQ0FMTF9FVl9SQ1ZEX0FCT1JULCAmY2FsbC0+ZXZlbnRzKTsKLQkJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7Ci0JCX0KLQkJZ290byBmcmVlX3BhY2tldF91bmxvY2s7CisJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9BQ0s6CisJCXJ4cnBjX2lucHV0X2FjayhjYWxsLCBza2IsIHNrZXcpOworCQlicmVhazsKIAogCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQlVTWToKIAkJX3Byb3RvKCJSeCBCVVNZICUlJXUiLCBzcC0+aGRyLnNlcmlhbCk7CiAKLQkJaWYgKHJ4cnBjX2Nvbm5faXNfc2VydmljZShjYWxsLT5jb25uKSkKLQkJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisJCS8qIEp1c3QgaWdub3JlIEJVU1kgcGFja2V0cyBmcm9tIHRoZSBzZXJ2ZXI7IHRoZSByZXRyeSBhbmQKKwkJICogbGlmZXNwYW4gdGltZXJzIHdpbGwgdGFrZSBjYXJlIG9mIGJ1c2luZXNzLiAgQlVTWSBwYWNrZXRzCisJCSAqIGZyb20gdGhlIGNsaWVudCBkb24ndCBtYWtlIHNlbnNlLgorCQkgKi8KKwkJYnJlYWs7CiAKLQkJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JCXN3aXRjaCAoY2FsbC0+c3RhdGUpIHsKLQkJY2FzZSBSWFJQQ19DQUxMX0NMSUVOVF9TRU5EX1JFUVVFU1Q6Ci0JCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfU0VSVkVSX0JVU1k7Ci0JCQlzZXRfYml0KFJYUlBDX0NBTExfRVZfUkNWRF9CVVNZLCAmY2FsbC0+ZXZlbnRzKTsKLQkJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7Ci0JCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfQlVTWToKLQkJCWdvdG8gZnJlZV9wYWNrZXRfdW5sb2NrOwotCQlkZWZhdWx0OgotCQkJZ290byBwcm90b2NvbF9lcnJvcl9sb2NrZWQ7Ci0JCX0KKwljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0FCT1JUOgorCQlyeHJwY19pbnB1dF9hYm9ydChjYWxsLCBza2IpOworCQlicmVhazsKKworCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQUNLQUxMOgorCQlyeHJwY19pbnB1dF9hY2thbGwoY2FsbCwgc2tiKTsKKwkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQlfcHJvdG8oIlJ4ICVzICUlJXUiLCByeHJwY19wa3RzW3NwLT5oZHIudHlwZV0sIHNwLT5oZHIuc2VyaWFsKTsKLQkJZ290byBwcm90b2NvbF9lcnJvcjsKLQotCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfREFUQToKLQkJX3Byb3RvKCJSeCBEQVRBICUlJXUgeyAjJXUgfSIsIHNwLT5oZHIuc2VyaWFsLCBzcC0+aGRyLnNlcSk7Ci0KLQkJaWYgKHNwLT5oZHIuc2VxID09IDApCi0JCQlnb3RvIHByb3RvY29sX2Vycm9yOwotCi0JCWNhbGwtPmFja3JfcHJldl9zZXEgPSBzcC0+aGRyLnNlcTsKLQotCQkvKiByZWNlaXZlZCBkYXRhIGltcGxpY2l0bHkgQUNLcyBhbGwgb2YgdGhlIHJlcXVlc3QgcGFja2V0cyB3ZQotCQkgKiBzZW50IHdoZW4gd2UncmUgYWN0aW5nIGFzIGEgY2xpZW50ICovCi0JCWlmIChjYWxsLT5zdGF0ZSA9PSBSWFJQQ19DQUxMX0NMSUVOVF9BV0FJVF9SRVBMWSkKLQkJCXJ4cnBjX2Fzc3VtZV9pbXBsaWNpdF9hY2thbGwoY2FsbCwgc3AtPmhkci5zZXJpYWwpOwotCi0JCXN3aXRjaCAocnhycGNfZmFzdF9wcm9jZXNzX2RhdGEoY2FsbCwgc2tiLCBzcC0+aGRyLnNlcSkpIHsKLQkJY2FzZSAwOgotCQkJc2tiID0gTlVMTDsKLQkJCWdvdG8gZG9uZTsKLQotCQlkZWZhdWx0OgotCQkJQlVHKCk7Ci0KLQkJCS8qIGRhdGEgcGFja2V0IHJlY2VpdmVkIGJleW9uZCB0aGUgbGFzdCBwYWNrZXQgKi8KLQkJY2FzZSAtRUJBRE1TRzoKLQkJCWdvdG8gcHJvdG9jb2xfZXJyb3I7Ci0JCX0KLQotCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQUNLQUxMOgotCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQUNLOgotCQkvKiBBQ0sgcHJvY2Vzc2luZyBpcyBkb25lIGluIHByb2Nlc3MgY29udGV4dCAqLwotCQlyZWFkX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCQlpZiAoY2FsbC0+c3RhdGUgPCBSWFJQQ19DQUxMX0RFQUQpIHsKLQkJCXNrYl9xdWV1ZV90YWlsKCZjYWxsLT5yeF9xdWV1ZSwgc2tiKTsKLQkJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7Ci0JCQlza2IgPSBOVUxMOwotCQl9Ci0JCXJlYWRfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQkJZ290byBmcmVlX3BhY2tldDsKLQl9Ci0KLXByb3RvY29sX2Vycm9yOgotCV9kZWJ1ZygicHJvdG9jb2wgZXJyb3IiKTsKLQl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLXByb3RvY29sX2Vycm9yX2xvY2tlZDoKLQlpZiAoY2FsbC0+c3RhdGUgPD0gUlhSUENfQ0FMTF9DT01QTEVURSkgewotCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEOwotCQljYWxsLT5sb2NhbF9hYm9ydCA9IFJYX1BST1RPQ09MX0VSUk9SOwotCQlzZXRfYml0KFJYUlBDX0NBTExfRVZfQUJPUlQsICZjYWxsLT5ldmVudHMpOwotCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOwotCX0KLWZyZWVfcGFja2V0X3VubG9jazoKLQl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotZnJlZV9wYWNrZXQ6Ci0JcnhycGNfZnJlZV9za2Ioc2tiKTsKLWRvbmU6Ci0JX2xlYXZlKCIiKTsKLX0KLQotLyoKLSAqIHNwbGl0IHVwIGEganVtYm8gZGF0YSBwYWNrZXQKLSAqLwotc3RhdGljIHZvaWQgcnhycGNfcHJvY2Vzc19qdW1ib19wYWNrZXQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCi0JCQkJICAgICAgIHN0cnVjdCBza19idWZmICpqdW1ibykKLXsKLQlzdHJ1Y3QgcnhycGNfanVtYm9faGVhZGVyIGpoZHI7Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcGFydDsKLQotCV9lbnRlcigiLHsldSwldX0iLCBqdW1iby0+ZGF0YV9sZW4sIGp1bWJvLT5sZW4pOwotCi0Jc3AgPSByeHJwY19za2IoanVtYm8pOwotCi0JZG8gewotCQlzcC0+aGRyLmZsYWdzICY9IH5SWFJQQ19KVU1CT19QQUNLRVQ7Ci0KLQkJLyogbWFrZSBhIGNsb25lIHRvIHJlcHJlc2VudCB0aGUgZmlyc3Qgc3VicGFja2V0IGluIHdoYXQncyBsZWZ0Ci0JCSAqIG9mIHRoZSBqdW1ibyBwYWNrZXQgKi8KLQkJcGFydCA9IHNrYl9jbG9uZShqdW1ibywgR0ZQX0FUT01JQyk7Ci0JCWlmICghcGFydCkgewotCQkJLyogc2ltcGx5IGRpdGNoIHRoZSB0YWlsIGluIHRoZSBldmVudCBvZiBFTk9NRU0gKi8KLQkJCXBza2JfdHJpbShqdW1ibywgUlhSUENfSlVNQk9fREFUQUxFTik7Ci0JCQlicmVhazsKLQkJfQotCQlyeHJwY19uZXdfc2tiKHBhcnQpOwotCi0JCXBza2JfdHJpbShwYXJ0LCBSWFJQQ19KVU1CT19EQVRBTEVOKTsKLQotCQlpZiAoIXBza2JfcHVsbChqdW1ibywgUlhSUENfSlVNQk9fREFUQUxFTikpCi0JCQlnb3RvIHByb3RvY29sX2Vycm9yOwotCi0JCWlmIChza2JfY29weV9iaXRzKGp1bWJvLCAwLCAmamhkciwgc2l6ZW9mKGpoZHIpKSA8IDApCi0JCQlnb3RvIHByb3RvY29sX2Vycm9yOwotCQlpZiAoIXBza2JfcHVsbChqdW1ibywgc2l6ZW9mKGpoZHIpKSkKLQkJCUJVRygpOwotCi0JCXNwLT5oZHIuc2VxCSs9IDE7Ci0JCXNwLT5oZHIuc2VyaWFsCSs9IDE7Ci0JCXNwLT5oZHIuZmxhZ3MJPSBqaGRyLmZsYWdzOwotCQlzcC0+aGRyLl9yc3ZkCT0gbnRvaHMoamhkci5fcnN2ZCk7Ci0KLQkJX3Byb3RvKCJSeCBEQVRBIEp1bWJvICUlJXUiLCBzcC0+aGRyLnNlcmlhbCAtIDEpOwotCi0JCXJ4cnBjX2Zhc3RfcHJvY2Vzc19wYWNrZXQoY2FsbCwgcGFydCk7Ci0JCXBhcnQgPSBOVUxMOwotCi0JfSB3aGlsZSAoc3AtPmhkci5mbGFncyAmIFJYUlBDX0pVTUJPX1BBQ0tFVCk7Ci0KLQlyeHJwY19mYXN0X3Byb2Nlc3NfcGFja2V0KGNhbGwsIGp1bWJvKTsKLQlfbGVhdmUoIiIpOwotCXJldHVybjsKLQotcHJvdG9jb2xfZXJyb3I6Ci0JX2RlYnVnKCJwcm90b2NvbCBlcnJvciIpOwotCXJ4cnBjX2ZyZWVfc2tiKHBhcnQpOwotCXJ4cnBjX2ZyZWVfc2tiKGp1bWJvKTsKLQl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQlpZiAoY2FsbC0+c3RhdGUgPD0gUlhSUENfQ0FMTF9DT01QTEVURSkgewotCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEOwotCQljYWxsLT5sb2NhbF9hYm9ydCA9IFJYX1BST1RPQ09MX0VSUk9SOwotCQlzZXRfYml0KFJYUlBDX0NBTExfRVZfQUJPUlQsICZjYWxsLT5ldmVudHMpOwotCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOwotCX0KLQl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCV9sZWF2ZSgiIik7Ci19Ci0KLS8qCi0gKiBwb3N0IGFuIGluY29taW5nIHBhY2tldCB0byB0aGUgYXBwcm9wcmlhdGUgY2FsbC9zb2NrZXQgdG8gZGVhbCB3aXRoCi0gKiAtIG11c3QgZ2V0IHJpZCBvZiB0aGUgc2tfYnVmZiwgZWl0aGVyIGJ5IGZyZWVpbmcgaXQgb3IgYnkgcXVldWluZyBpdAotICovCi1zdGF0aWMgdm9pZCByeHJwY19wb3N0X3BhY2tldF90b19jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKLQotCV9lbnRlcigiJXAsJXAiLCBjYWxsLCBza2IpOwotCi0Jc3AgPSByeHJwY19za2Ioc2tiKTsKLQotCV9kZWJ1ZygiZXh0YW50IGNhbGwgWyVkXSIsIGNhbGwtPnN0YXRlKTsKLQotCXJlYWRfbG9jaygmY2FsbC0+c3RhdGVfbG9jayk7Ci0Jc3dpdGNoIChjYWxsLT5zdGF0ZSkgewotCWNhc2UgUlhSUENfQ0FMTF9MT0NBTExZX0FCT1JURUQ6Ci0JCWlmICghdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX0VWX0FCT1JULCAmY2FsbC0+ZXZlbnRzKSkgewotCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQkJCWdvdG8gZnJlZV91bmxvY2s7Ci0JCX0KLQljYXNlIFJYUlBDX0NBTExfUkVNT1RFTFlfQUJPUlRFRDoKLQljYXNlIFJYUlBDX0NBTExfTkVUV09SS19FUlJPUjoKLQljYXNlIFJYUlBDX0NBTExfREVBRDoKLQkJZ290byBkZWFkX2NhbGw7Ci0JY2FzZSBSWFJQQ19DQUxMX0NPTVBMRVRFOgotCWNhc2UgUlhSUENfQ0FMTF9DTElFTlRfRklOQUxfQUNLOgotCQkvKiBjb21wbGV0ZSBzZXJ2ZXIgY2FsbCAqLwotCQlpZiAocnhycGNfY29ubl9pc19zZXJ2aWNlKGNhbGwtPmNvbm4pKQotCQkJZ290byBkZWFkX2NhbGw7Ci0JCS8qIHJlc2VuZCBsYXN0IHBhY2tldCBvZiBhIGNvbXBsZXRlZCBjYWxsICovCi0JCV9kZWJ1ZygiZmluYWwgYWNrIGFnYWluIik7Ci0JCXJ4cnBjX2dldF9jYWxsKGNhbGwpOwotCQlzZXRfYml0KFJYUlBDX0NBTExfRVZfQUNLX0ZJTkFMLCAmY2FsbC0+ZXZlbnRzKTsKLQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQkJZ290byBmcmVlX3VubG9jazsKLQlkZWZhdWx0OgogCQlicmVhazsKIAl9CiAKLQlyZWFkX3VubG9jaygmY2FsbC0+c3RhdGVfbG9jayk7Ci0JcnhycGNfZ2V0X2NhbGwoY2FsbCk7Ci0KLQlpZiAoc3AtPmhkci50eXBlID09IFJYUlBDX1BBQ0tFVF9UWVBFX0RBVEEgJiYKLQkgICAgc3AtPmhkci5mbGFncyAmIFJYUlBDX0pVTUJPX1BBQ0tFVCkKLQkJcnhycGNfcHJvY2Vzc19qdW1ib19wYWNrZXQoY2FsbCwgc2tiKTsKLQllbHNlCi0JCXJ4cnBjX2Zhc3RfcHJvY2Vzc19wYWNrZXQoY2FsbCwgc2tiKTsKLQotCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotCWdvdG8gZG9uZTsKLQotZGVhZF9jYWxsOgotCWlmIChzcC0+aGRyLnR5cGUgIT0gUlhSUENfUEFDS0VUX1RZUEVfQUJPUlQpIHsKLQkJc2tiLT5wcmlvcml0eSA9IFJYX0NBTExfREVBRDsKLQkJcnhycGNfcmVqZWN0X3BhY2tldChjYWxsLT5jb25uLT5wYXJhbXMubG9jYWwsIHNrYik7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLWZyZWVfdW5sb2NrOgotCXJ4cnBjX2ZyZWVfc2tiKHNrYik7Ci11bmxvY2s6Ci0JcmVhZF91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOwotZG9uZToKIAlfbGVhdmUoIiIpOwogfQogCiAvKgogICogcG9zdCBjb25uZWN0aW9uLWxldmVsIGV2ZW50cyB0byB0aGUgY29ubmVjdGlvbgotICogLSB0aGlzIGluY2x1ZGVzIGNoYWxsZW5nZXMsIHJlc3BvbnNlcyBhbmQgc29tZSBhYm9ydHMKKyAqIC0gdGhpcyBpbmNsdWRlcyBjaGFsbGVuZ2VzLCByZXNwb25zZXMsIHNvbWUgYWJvcnRzIGFuZCBjYWxsIHRlcm1pbmFsIHBhY2tldAorICogICByZXRyYW5zbWlzc2lvbi4KICAqLwotc3RhdGljIGJvb2wgcnhycGNfcG9zdF9wYWNrZXRfdG9fY29ubihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKK3N0YXRpYyB2b2lkIHJ4cnBjX3Bvc3RfcGFja2V0X3RvX2Nvbm4oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCiAJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlfZW50ZXIoIiVwLCVwIiwgY29ubiwgc2tiKTsKIAogCXNrYl9xdWV1ZV90YWlsKCZjb25uLT5yeF9xdWV1ZSwgc2tiKTsKLQlyZXR1cm4gcnhycGNfcXVldWVfY29ubihjb25uKTsKKwlyeHJwY19xdWV1ZV9jb25uKGNvbm4pOwogfQogCiAvKgpAQCAtNTk4LDYgKzk2NSwxNyBAQAogfQogCiAvKgorICogcHV0IGEgcGFja2V0IHVwIGZvciB0cmFuc3BvcnQtbGV2ZWwgYWJvcnQKKyAqLworc3RhdGljIHZvaWQgcnhycGNfcmVqZWN0X3BhY2tldChzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUNIRUNLX1NMQUJfT0tBWSgmbG9jYWwtPnVzYWdlKTsKKworCXNrYl9xdWV1ZV90YWlsKCZsb2NhbC0+cmVqZWN0X3F1ZXVlLCBza2IpOworCXJ4cnBjX3F1ZXVlX2xvY2FsKGxvY2FsKTsKK30KKworLyoKICAqIEV4dHJhY3QgdGhlIHdpcmUgaGVhZGVyIGZyb20gYSBwYWNrZXQgYW5kIHRyYW5zbGF0ZSB0aGUgYnl0ZSBvcmRlci4KICAqLwogc3RhdGljIG5vaW5saW5lCkBAIC02MDgsOCArOTg2LDYgQEAKIAkvKiBkaWcgb3V0IHRoZSBSeFJQQyBjb25uZWN0aW9uIGRldGFpbHMgKi8KIAlpZiAoc2tiX2NvcHlfYml0cyhza2IsIDAsICZ3aGRyLCBzaXplb2Yod2hkcikpIDwgMCkKIAkJcmV0dXJuIC1FQkFETVNHOwotCWlmICghcHNrYl9wdWxsKHNrYiwgc2l6ZW9mKHdoZHIpKSkKLQkJQlVHKCk7CiAKIAltZW1zZXQoc3AsIDAsIHNpemVvZigqc3ApKTsKIAlzcC0+aGRyLmVwb2NoCQk9IG50b2hsKHdoZHIuZXBvY2gpOwpAQCAtNjM0LDE5ICsxMDEwLDIyIEBACiAgKiBzaHV0IGRvd24gYW5kIHRoZSBsb2NhbCBlbmRwb2ludCBmcm9tIGdvaW5nIGF3YXksIHRodXMgc2tfdXNlcl9kYXRhIHdpbGwgbm90CiAgKiBiZSBjbGVhcmVkIHVudGlsIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KICAqLwotdm9pZCByeHJwY19kYXRhX3JlYWR5KHN0cnVjdCBzb2NrICpzaykKK3ZvaWQgcnhycGNfZGF0YV9yZWFkeShzdHJ1Y3Qgc29jayAqdWRwX3NrKQogewogCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCByeHJwY19jaGFubmVsICpjaGFuOworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwogCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7Ci0Jc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCA9IHNrLT5za191c2VyX2RhdGE7CisJc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCA9IHVkcF9zay0+c2tfdXNlcl9kYXRhOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0JaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbDsKKwlpbnQgcmV0LCBza2V3OwogCi0JX2VudGVyKCIlcCIsIHNrKTsKKwlfZW50ZXIoIiVwIiwgdWRwX3NrKTsKIAogCUFTU0VSVCghaXJxc19kaXNhYmxlZCgpKTsKIAotCXNrYiA9IHNrYl9yZWN2X2RhdGFncmFtKHNrLCAwLCAxLCAmcmV0KTsKKwlza2IgPSBza2JfcmVjdl9kYXRhZ3JhbSh1ZHBfc2ssIDAsIDEsICZyZXQpOwogCWlmICghc2tiKSB7CiAJCWlmIChyZXQgPT0gLUVBR0FJTikKIAkJCXJldHVybjsKQEAgLTY1NCwxMyArMTAzMywxMyBAQAogCQlyZXR1cm47CiAJfQogCi0JcnhycGNfbmV3X3NrYihza2IpOworCXJ4cnBjX25ld19za2Ioc2tiLCByeHJwY19za2JfcnhfcmVjZWl2ZWQpOwogCiAJX25ldCgicmVjdiBza2IgJXAiLCBza2IpOwogCiAJLyogd2UnbGwgcHJvYmFibHkgbmVlZCB0byBjaGVja3N1bSBpdCAoZGlkbid0IGNhbGwgc29ja19yZWN2bXNnKSAqLwogCWlmIChza2JfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkgewotCQlyeHJwY19mcmVlX3NrYihza2IpOworCQlyeHJwY19mcmVlX3NrYihza2IsIHJ4cnBjX3NrYl9yeF9mcmVlZCk7CiAJCV9fVURQX0lOQ19TVEFUUygmaW5pdF9uZXQsIFVEUF9NSUJfSU5FUlJPUlMsIDApOwogCQlfbGVhdmUoIiBbQ1NVTSBmYWlsZWRdIik7CiAJCXJldHVybjsKQEAgLTY3NCwxMyArMTA1MywyMSBAQAogCXNrYl9vcnBoYW4oc2tiKTsKIAlzcCA9IHJ4cnBjX3NrYihza2IpOwogCi0JX25ldCgiUnggVURQIHBhY2tldCBmcm9tICUwOHg6JTA0aHUiLAotCSAgICAgbnRvaGwoaXBfaGRyKHNrYiktPnNhZGRyKSwgbnRvaHModWRwX2hkcihza2IpLT5zb3VyY2UpKTsKLQogCS8qIGRpZyBvdXQgdGhlIFJ4UlBDIGNvbm5lY3Rpb24gZGV0YWlscyAqLwogCWlmIChyeHJwY19leHRyYWN0X2hlYWRlcihzcCwgc2tiKSA8IDApCiAJCWdvdG8gYmFkX21lc3NhZ2U7CiAKKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfQUZfUlhSUENfSU5KRUNUX0xPU1MpKSB7CisJCXN0YXRpYyBpbnQgbG9zZTsKKwkJaWYgKChsb3NlKysgJiA3KSA9PSA3KSB7CisJCQl0cmFjZV9yeHJwY19yeF9sb3NlKHNwKTsKKwkJCXJ4cnBjX2xvc2Vfc2tiKHNrYiwgcnhycGNfc2tiX3J4X2xvc3QpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJdHJhY2VfcnhycGNfcnhfcGFja2V0KHNwKTsKKwogCV9uZXQoIlJ4IFJ4UlBDICVzIGVwPSV4IGNhbGw9JXg6JXgiLAogCSAgICAgc3AtPmhkci5mbGFncyAmIFJYUlBDX0NMSUVOVF9JTklUSUFURUQgPyAiVG9TZXJ2ZXIiIDogIlRvQ2xpZW50IiwKIAkgICAgIHNwLT5oZHIuZXBvY2gsIHNwLT5oZHIuY2lkLCBzcC0+aGRyLmNhbGxOdW1iZXIpOwpAQCAtNjkxLDcwICsxMDc4LDEyNSBAQAogCQlnb3RvIGJhZF9tZXNzYWdlOwogCX0KIAotCWlmIChzcC0+aGRyLnR5cGUgPT0gUlhSUENfUEFDS0VUX1RZUEVfVkVSU0lPTikgeworCXN3aXRjaCAoc3AtPmhkci50eXBlKSB7CisJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9WRVJTSU9OOgogCQlyeHJwY19wb3N0X3BhY2tldF90b19sb2NhbChsb2NhbCwgc2tiKTsKIAkJZ290byBvdXQ7Ci0JfQogCi0JaWYgKHNwLT5oZHIudHlwZSA9PSBSWFJQQ19QQUNLRVRfVFlQRV9EQVRBICYmCi0JICAgIChzcC0+aGRyLmNhbGxOdW1iZXIgPT0gMCB8fCBzcC0+aGRyLnNlcSA9PSAwKSkKLQkJZ290byBiYWRfbWVzc2FnZTsKKwljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0JVU1k6CisJCWlmIChzcC0+aGRyLmZsYWdzICYgUlhSUENfQ0xJRU5UX0lOSVRJQVRFRCkKKwkJCWdvdG8gZGlzY2FyZDsKKworCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfREFUQToKKwkJaWYgKHNwLT5oZHIuY2FsbE51bWJlciA9PSAwKQorCQkJZ290byBiYWRfbWVzc2FnZTsKKwkJaWYgKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19KVU1CT19QQUNLRVQgJiYKKwkJICAgICFyeHJwY192YWxpZGF0ZV9qdW1ibyhza2IpKQorCQkJZ290byBiYWRfbWVzc2FnZTsKKwkJYnJlYWs7CisJfQogCiAJcmN1X3JlYWRfbG9jaygpOwogCi1yZXRyeV9maW5kX2Nvbm46CiAJY29ubiA9IHJ4cnBjX2ZpbmRfY29ubmVjdGlvbl9yY3UobG9jYWwsIHNrYik7Ci0JaWYgKCFjb25uKQotCQlnb3RvIGNhbnRfcm91dGVfY2FsbDsKKwlpZiAoY29ubikgeworCQlpZiAoc3AtPmhkci5zZWN1cml0eUluZGV4ICE9IGNvbm4tPnNlY3VyaXR5X2l4KQorCQkJZ290byB3cm9uZ19zZWN1cml0eTsKIAotCWlmIChzcC0+aGRyLmNhbGxOdW1iZXIgPT0gMCkgewotCQkvKiBDb25uZWN0aW9uLWxldmVsIHBhY2tldCAqLwotCQlfZGVidWcoIkNPTk4gJXAgeyVkfSIsIGNvbm4sIGNvbm4tPmRlYnVnX2lkKTsKLQkJaWYgKCFyeHJwY19wb3N0X3BhY2tldF90b19jb25uKGNvbm4sIHNrYikpCi0JCQlnb3RvIHJldHJ5X2ZpbmRfY29ubjsKLQl9IGVsc2UgewotCQkvKiBDYWxsLWJvdW5kIHBhY2tldHMgYXJlIHJvdXRlZCBieSBjb25uZWN0aW9uIGNoYW5uZWwuICovCi0JCXVuc2lnbmVkIGludCBjaGFubmVsID0gc3AtPmhkci5jaWQgJiBSWFJQQ19DSEFOTkVMTUFTSzsKLQkJc3RydWN0IHJ4cnBjX2NoYW5uZWwgKmNoYW4gPSAmY29ubi0+Y2hhbm5lbHNbY2hhbm5lbF07Ci0JCXN0cnVjdCByeHJwY19jYWxsICpjYWxsID0gcmN1X2RlcmVmZXJlbmNlKGNoYW4tPmNhbGwpOwotCi0JCWlmICghY2FsbCB8fCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpID09IDApCi0JCQlnb3RvIGNhbnRfcm91dGVfY2FsbDsKLQotCQlyeHJwY19wb3N0X3BhY2tldF90b19jYWxsKGNhbGwsIHNrYik7Ci0JfQotCi0JcmN1X3JlYWRfdW5sb2NrKCk7Ci1vdXQ6Ci0JcmV0dXJuOwotCi1jYW50X3JvdXRlX2NhbGw6Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQlfZGVidWcoImNhbid0IHJvdXRlIGNhbGwiKTsKLQlpZiAoc3AtPmhkci5mbGFncyAmIFJYUlBDX0NMSUVOVF9JTklUSUFURUQgJiYKLQkgICAgc3AtPmhkci50eXBlID09IFJYUlBDX1BBQ0tFVF9UWVBFX0RBVEEpIHsKLQkJaWYgKHNwLT5oZHIuc2VxID09IDEpIHsKLQkJCV9kZWJ1ZygiZmlyc3QgcGFja2V0Iik7Ci0JCQlza2JfcXVldWVfdGFpbCgmbG9jYWwtPmFjY2VwdF9xdWV1ZSwgc2tiKTsKLQkJCXJ4cnBjX3F1ZXVlX3dvcmsoJmxvY2FsLT5wcm9jZXNzb3IpOwotCQkJX2xlYXZlKCIgW2luY29taW5nXSIpOwotCQkJcmV0dXJuOworCQlpZiAoc3AtPmhkci5jYWxsTnVtYmVyID09IDApIHsKKwkJCS8qIENvbm5lY3Rpb24tbGV2ZWwgcGFja2V0ICovCisJCQlfZGVidWcoIkNPTk4gJXAgeyVkfSIsIGNvbm4sIGNvbm4tPmRlYnVnX2lkKTsKKwkJCXJ4cnBjX3Bvc3RfcGFja2V0X3RvX2Nvbm4oY29ubiwgc2tiKTsKKwkJCWdvdG8gb3V0X3VubG9jazsKIAkJfQotCQlza2ItPnByaW9yaXR5ID0gUlhfSU5WQUxJRF9PUEVSQVRJT047CisKKwkJLyogTm90ZSB0aGUgc2VyaWFsIG51bWJlciBza2V3IGhlcmUgKi8KKwkJc2tldyA9IChpbnQpc3AtPmhkci5zZXJpYWwgLSAoaW50KWNvbm4tPmhpX3NlcmlhbDsKKwkJaWYgKHNrZXcgPj0gMCkgeworCQkJaWYgKHNrZXcgPiAwKQorCQkJCWNvbm4tPmhpX3NlcmlhbCA9IHNwLT5oZHIuc2VyaWFsOworCQl9IGVsc2UgeworCQkJc2tldyA9IC1za2V3OworCQkJc2tldyA9IG1pbihza2V3LCA2NTUzNSk7CisJCX0KKworCQkvKiBDYWxsLWJvdW5kIHBhY2tldHMgYXJlIHJvdXRlZCBieSBjb25uZWN0aW9uIGNoYW5uZWwuICovCisJCWNoYW5uZWwgPSBzcC0+aGRyLmNpZCAmIFJYUlBDX0NIQU5ORUxNQVNLOworCQljaGFuID0gJmNvbm4tPmNoYW5uZWxzW2NoYW5uZWxdOworCisJCS8qIElnbm9yZSByZWFsbHkgb2xkIGNhbGxzICovCisJCWlmIChzcC0+aGRyLmNhbGxOdW1iZXIgPCBjaGFuLT5sYXN0X2NhbGwpCisJCQlnb3RvIGRpc2NhcmRfdW5sb2NrOworCisJCWlmIChzcC0+aGRyLmNhbGxOdW1iZXIgPT0gY2hhbi0+bGFzdF9jYWxsKSB7CisJCQkvKiBGb3IgdGhlIHByZXZpb3VzIHNlcnZpY2UgY2FsbCwgaWYgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgd2UKKwkJCSAqIGRpc2NhcmQgYWxsIGZ1cnRoZXIgcGFja2V0cy4KKwkJCSAqLworCQkJaWYgKHJ4cnBjX2Nvbm5faXNfc2VydmljZShjb25uKSAmJgorCQkJICAgIChjaGFuLT5sYXN0X3R5cGUgPT0gUlhSUENfUEFDS0VUX1RZUEVfQUNLIHx8CisJCQkgICAgIHNwLT5oZHIudHlwZSA9PSBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVCkpCisJCQkJZ290byBkaXNjYXJkX3VubG9jazsKKworCQkJLyogQnV0IG90aGVyd2lzZSB3ZSBuZWVkIHRvIHJldHJhbnNtaXQgdGhlIGZpbmFsIHBhY2tldCBmcm9tCisJCQkgKiBkYXRhIGNhY2hlZCBpbiB0aGUgY29ubmVjdGlvbiByZWNvcmQuCisJCQkgKi8KKwkJCXJ4cnBjX3Bvc3RfcGFja2V0X3RvX2Nvbm4oY29ubiwgc2tiKTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCisJCWNhbGwgPSByY3VfZGVyZWZlcmVuY2UoY2hhbi0+Y2FsbCk7CiAJfSBlbHNlIHsKLQkJc2tiLT5wcmlvcml0eSA9IFJYX0NBTExfREVBRDsKKwkJc2tldyA9IDA7CisJCWNhbGwgPSBOVUxMOwogCX0KIAotCWlmIChzcC0+aGRyLnR5cGUgIT0gUlhSUENfUEFDS0VUX1RZUEVfQUJPUlQpIHsKLQkJX2RlYnVnKCJyZWplY3QgdHlwZSAlZCIsc3AtPmhkci50eXBlKTsKLQkJcnhycGNfcmVqZWN0X3BhY2tldChsb2NhbCwgc2tiKTsKKwlpZiAoIWNhbGwgfHwgYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKSA9PSAwKSB7CisJCWlmICghKHNwLT5oZHIudHlwZSAmIFJYUlBDX0NMSUVOVF9JTklUSUFURUQpIHx8CisJCSAgICBzcC0+aGRyLmNhbGxOdW1iZXIgPT0gMCB8fAorCQkgICAgc3AtPmhkci50eXBlICE9IFJYUlBDX1BBQ0tFVF9UWVBFX0RBVEEpCisJCQlnb3RvIGJhZF9tZXNzYWdlX3VubG9jazsKKwkJaWYgKHNwLT5oZHIuc2VxICE9IDEpCisJCQlnb3RvIGRpc2NhcmRfdW5sb2NrOworCQljYWxsID0gcnhycGNfbmV3X2luY29taW5nX2NhbGwobG9jYWwsIGNvbm4sIHNrYik7CisJCWlmICghY2FsbCkgeworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQlnb3RvIHJlamVjdF9wYWNrZXQ7CisJCX0KKwkJcnhycGNfc2VuZF9waW5nKGNhbGwsIHNrYiwgc2tldyk7CiAJfQotCV9sZWF2ZSgiIFtubyBjYWxsXSIpOworCisJcnhycGNfaW5wdXRfY2FsbF9wYWNrZXQoY2FsbCwgc2tiLCBza2V3KTsKKwlnb3RvIGRpc2NhcmRfdW5sb2NrOworCitkaXNjYXJkX3VubG9jazoKKwlyY3VfcmVhZF91bmxvY2soKTsKK2Rpc2NhcmQ6CisJcnhycGNfZnJlZV9za2Ioc2tiLCByeHJwY19za2JfcnhfZnJlZWQpOworb3V0OgorCXRyYWNlX3J4cnBjX3J4X2RvbmUoMCwgMCk7CiAJcmV0dXJuOwogCitvdXRfdW5sb2NrOgorCXJjdV9yZWFkX3VubG9jaygpOworCWdvdG8gb3V0OworCit3cm9uZ19zZWN1cml0eToKKwlyY3VfcmVhZF91bmxvY2soKTsKKwl0cmFjZV9yeHJwY19hYm9ydCgiU0VDIiwgc3AtPmhkci5jaWQsIHNwLT5oZHIuY2FsbE51bWJlciwgc3AtPmhkci5zZXEsCisJCQkgIFJYS0FESU5DT05TSVNURU5DWSwgRUJBRE1TRyk7CisJc2tiLT5wcmlvcml0eSA9IFJYS0FESU5DT05TSVNURU5DWTsKKwlnb3RvIHBvc3RfYWJvcnQ7CisKK2JhZF9tZXNzYWdlX3VubG9jazoKKwlyY3VfcmVhZF91bmxvY2soKTsKIGJhZF9tZXNzYWdlOgorCXRyYWNlX3J4cnBjX2Fib3J0KCJCQUQiLCBzcC0+aGRyLmNpZCwgc3AtPmhkci5jYWxsTnVtYmVyLCBzcC0+aGRyLnNlcSwKKwkJCSAgUlhfUFJPVE9DT0xfRVJST1IsIEVCQURNU0cpOwogCXNrYi0+cHJpb3JpdHkgPSBSWF9QUk9UT0NPTF9FUlJPUjsKK3Bvc3RfYWJvcnQ6CisJc2tiLT5tYXJrID0gUlhSUENfU0tCX01BUktfTE9DQUxfQUJPUlQ7CityZWplY3RfcGFja2V0OgorCXRyYWNlX3J4cnBjX3J4X2RvbmUoc2tiLT5tYXJrLCBza2ItPnByaW9yaXR5KTsKIAlyeHJwY19yZWplY3RfcGFja2V0KGxvY2FsLCBza2IpOwogCV9sZWF2ZSgiIFtiYWRtc2ddIik7CiB9CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvaW5zZWN1cmUuYyBiL25ldC9yeHJwYy9pbnNlY3VyZS5jCmluZGV4IGMyMWFkMjEuLjdkNDM3NWUgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9pbnNlY3VyZS5jCisrKyBiL25ldC9yeHJwYy9pbnNlY3VyZS5jCkBAIC0yMywzMSArMjMsMzYgQEAKIH0KIAogc3RhdGljIGludCBub25lX3NlY3VyZV9wYWNrZXQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCi0JCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgICBzaXplX3QgZGF0YV9zaXplLAotCQkJICAgICAgIHZvaWQgKnNlY2hkcikKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICBzaXplX3QgZGF0YV9zaXplLAorCQkJICAgICAgdm9pZCAqc2VjaGRyKQogewogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG5vbmVfdmVyaWZ5X3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICAgIHUzMiAqX2Fib3J0X2NvZGUpCitzdGF0aWMgaW50IG5vbmVfdmVyaWZ5X3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW4sCisJCQkgICAgICByeHJwY19zZXFfdCBzZXEsIHUxNiBleHBlY3RlZF9ja3N1bSkKIHsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgbm9uZV9sb2NhdGVfZGF0YShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgdW5zaWduZWQgaW50ICpfb2Zmc2V0LCB1bnNpZ25lZCBpbnQgKl9sZW4pCit7Cit9CisKIHN0YXRpYyBpbnQgbm9uZV9yZXNwb25kX3RvX2NoYWxsZW5nZShzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKLQkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICAgIHUzMiAqX2Fib3J0X2NvZGUpCisJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgdTMyICpfYWJvcnRfY29kZSkKIHsKIAkqX2Fib3J0X2NvZGUgPSBSWF9QUk9UT0NPTF9FUlJPUjsKIAlyZXR1cm4gLUVQUk9UTzsKIH0KIAogc3RhdGljIGludCBub25lX3ZlcmlmeV9yZXNwb25zZShzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKLQkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgdTMyICpfYWJvcnRfY29kZSkKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCXUzMiAqX2Fib3J0X2NvZGUpCiB7CiAJKl9hYm9ydF9jb2RlID0gUlhfUFJPVE9DT0xfRVJST1I7CiAJcmV0dXJuIC1FUFJPVE87CkBAIC03OCw2ICs4Myw3IEBACiAJLnByaW1lX3BhY2tldF9zZWN1cml0eQkJPSBub25lX3ByaW1lX3BhY2tldF9zZWN1cml0eSwKIAkuc2VjdXJlX3BhY2tldAkJCT0gbm9uZV9zZWN1cmVfcGFja2V0LAogCS52ZXJpZnlfcGFja2V0CQkJPSBub25lX3ZlcmlmeV9wYWNrZXQsCisJLmxvY2F0ZV9kYXRhCQkJPSBub25lX2xvY2F0ZV9kYXRhLAogCS5yZXNwb25kX3RvX2NoYWxsZW5nZQkJPSBub25lX3Jlc3BvbmRfdG9fY2hhbGxlbmdlLAogCS52ZXJpZnlfcmVzcG9uc2UJCT0gbm9uZV92ZXJpZnlfcmVzcG9uc2UsCiAJLmNsZWFyCQkJCT0gbm9uZV9jbGVhciwKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9sb2NhbF9ldmVudC5jIGIvbmV0L3J4cnBjL2xvY2FsX2V2ZW50LmMKaW5kZXggMzFhM2Y4Ni4uNTQwZDM5NSAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL2xvY2FsX2V2ZW50LmMKKysrIGIvbmV0L3J4cnBjL2xvY2FsX2V2ZW50LmMKQEAgLTE1LDggKzE1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvdWRwLmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC9hZl9yeHJwYy5oPgogI2luY2x1ZGUgPGdlbmVyYXRlZC91dHNyZWxlYXNlLmg+CkBAIC0zMyw3ICszMSw3IEBACiB7CiAJc3RydWN0IHJ4cnBjX3dpcmVfaGVhZGVyIHdoZHI7CiAJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCA9IHJ4cnBjX3NrYihza2IpOwotCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisJc3RydWN0IHNvY2thZGRyX3J4cnBjIHNyeDsKIAlzdHJ1Y3QgbXNnaGRyIG1zZzsKIAlzdHJ1Y3Qga3ZlYyBpb3ZbMl07CiAJc2l6ZV90IGxlbjsKQEAgLTQxLDEyICszOSwxMSBAQAogCiAJX2VudGVyKCIiKTsKIAotCXNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQlzaW4uc2luX3BvcnQgPSB1ZHBfaGRyKHNrYiktPnNvdXJjZTsKLQlzaW4uc2luX2FkZHIuc19hZGRyID0gaXBfaGRyKHNrYiktPnNhZGRyOworCWlmIChyeHJwY19leHRyYWN0X2FkZHJfZnJvbV9za2IoJnNyeCwgc2tiKSA8IDApCisJCXJldHVybjsKIAotCW1zZy5tc2dfbmFtZQk9ICZzaW47Ci0JbXNnLm1zZ19uYW1lbGVuCT0gc2l6ZW9mKHNpbik7CisJbXNnLm1zZ19uYW1lCT0gJnNyeC50cmFuc3BvcnQ7CisJbXNnLm1zZ19uYW1lbGVuCT0gc3J4LnRyYW5zcG9ydF9sZW47CiAJbXNnLm1zZ19jb250cm9sCT0gTlVMTDsKIAltc2cubXNnX2NvbnRyb2xsZW4gPSAwOwogCW1zZy5tc2dfZmxhZ3MJPSAwOwpAQCAtOTMsMTEgKzkwLDEzIEBACiAJaWYgKHNrYikgewogCQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwID0gcnhycGNfc2tiKHNrYik7CiAKKwkJcnhycGNfc2VlX3NrYihza2IsIHJ4cnBjX3NrYl9yeF9zZWVuKTsKIAkJX2RlYnVnKCJ7JWR9LHsldX0iLCBsb2NhbC0+ZGVidWdfaWQsIHNwLT5oZHIudHlwZSk7CiAKIAkJc3dpdGNoIChzcC0+aGRyLnR5cGUpIHsKIAkJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9WRVJTSU9OOgotCQkJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCAmdiwgMSkgPCAwKQorCQkJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCBzaXplb2Yoc3RydWN0IHJ4cnBjX3dpcmVfaGVhZGVyKSwKKwkJCQkJICAmdiwgMSkgPCAwKQogCQkJCXJldHVybjsKIAkJCV9wcm90bygiUnggVkVSU0lPTiB7ICUwMnggfSIsIHYpOwogCQkJaWYgKHYgPT0gMCkKQEAgLTEwOSw3ICsxMDgsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlyeHJwY19mcmVlX3NrYihza2IpOworCQlyeHJwY19mcmVlX3NrYihza2IsIHJ4cnBjX3NrYl9yeF9mcmVlZCk7CiAJfQogCiAJX2xlYXZlKCIiKTsKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9sb2NhbF9vYmplY3QuYyBiL25ldC9yeHJwYy9sb2NhbF9vYmplY3QuYwppbmRleCBhNzUzNzk2Li5mZjQ4NjRkNSAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL2xvY2FsX29iamVjdC5jCisrKyBiL25ldC9yeHJwYy9sb2NhbF9vYmplY3QuYwpAQCAtNTgsNiArNTgsMTcgQEAKIAkJCW1lbWNtcCgmbG9jYWwtPnNyeC50cmFuc3BvcnQuc2luLnNpbl9hZGRyLAogCQkJICAgICAgICZzcngtPnRyYW5zcG9ydC5zaW4uc2luX2FkZHIsCiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisjaWZkZWYgQ09ORklHX0FGX1JYUlBDX0lQVjYKKwljYXNlIEFGX0lORVQ2OgorCQkvKiBJZiB0aGUgY2hvaWNlIG9mIFVEUDYgcG9ydCBpcyBsZWZ0IHVwIHRvIHRoZSB0cmFuc3BvcnQsIHRoZW4KKwkJICogdGhlIGVuZHBvaW50IHJlY29yZCBkb2Vzbid0IG1hdGNoLgorCQkgKi8KKwkJcmV0dXJuICgodTE2IF9fZm9yY2UpbG9jYWwtPnNyeC50cmFuc3BvcnQuc2luNi5zaW42X3BvcnQgLQorCQkJKHUxNiBfX2ZvcmNlKXNyeC0+dHJhbnNwb3J0LnNpbjYuc2luNl9wb3J0KSA/OgorCQkJbWVtY21wKCZsb2NhbC0+c3J4LnRyYW5zcG9ydC5zaW42LnNpbjZfYWRkciwKKwkJCSAgICAgICAmc3J4LT50cmFuc3BvcnQuc2luNi5zaW42X2FkZHIsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworI2VuZGlmCiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJfQpAQCAtNzUsOSArODYsNyBAQAogCQlhdG9taWNfc2V0KCZsb2NhbC0+dXNhZ2UsIDEpOwogCQlJTklUX0xJU1RfSEVBRCgmbG9jYWwtPmxpbmspOwogCQlJTklUX1dPUksoJmxvY2FsLT5wcm9jZXNzb3IsIHJ4cnBjX2xvY2FsX3Byb2Nlc3Nvcik7Ci0JCUlOSVRfTElTVF9IRUFEKCZsb2NhbC0+c2VydmljZXMpOwogCQlpbml0X3J3c2VtKCZsb2NhbC0+ZGVmcmFnX3NlbSk7Ci0JCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmxvY2FsLT5hY2NlcHRfcXVldWUpOwogCQlza2JfcXVldWVfaGVhZF9pbml0KCZsb2NhbC0+cmVqZWN0X3F1ZXVlKTsKIAkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbG9jYWwtPmV2ZW50X3F1ZXVlKTsKIAkJbG9jYWwtPmNsaWVudF9jb25ucyA9IFJCX1JPT1Q7CkBAIC0xMDEsMTEgKzExMCwxMiBAQAogCXN0cnVjdCBzb2NrICpzb2NrOwogCWludCByZXQsIG9wdDsKIAotCV9lbnRlcigiJXB7JWR9IiwgbG9jYWwsIGxvY2FsLT5zcngudHJhbnNwb3J0X3R5cGUpOworCV9lbnRlcigiJXB7JWQsJWR9IiwKKwkgICAgICAgbG9jYWwsIGxvY2FsLT5zcngudHJhbnNwb3J0X3R5cGUsIGxvY2FsLT5zcngudHJhbnNwb3J0LmZhbWlseSk7CiAKIAkvKiBjcmVhdGUgYSBzb2NrZXQgdG8gcmVwcmVzZW50IHRoZSBsb2NhbCBlbmRwb2ludCAqLwotCXJldCA9IHNvY2tfY3JlYXRlX2tlcm4oJmluaXRfbmV0LCBQRl9JTkVULCBsb2NhbC0+c3J4LnRyYW5zcG9ydF90eXBlLAotCQkJICAgICAgIElQUFJPVE9fVURQLCAmbG9jYWwtPnNvY2tldCk7CisJcmV0ID0gc29ja19jcmVhdGVfa2VybigmaW5pdF9uZXQsIGxvY2FsLT5zcngudHJhbnNwb3J0LmZhbWlseSwKKwkJCSAgICAgICBsb2NhbC0+c3J4LnRyYW5zcG9ydF90eXBlLCAwLCAmbG9jYWwtPnNvY2tldCk7CiAJaWYgKHJldCA8IDApIHsKIAkJX2xlYXZlKCIgPSAlZCBbc29ja2V0XSIsIHJldCk7CiAJCXJldHVybiByZXQ7CkBAIC0xNzAsMTggKzE4MCw4IEBACiAJbG9uZyBkaWZmOwogCWludCByZXQ7CiAKLQlpZiAoc3J4LT50cmFuc3BvcnQuZmFtaWx5ID09IEFGX0lORVQpIHsKLQkJX2VudGVyKCJ7JWQsJXUsJXBJNCslaHV9IiwKLQkJICAgICAgIHNyeC0+dHJhbnNwb3J0X3R5cGUsCi0JCSAgICAgICBzcngtPnRyYW5zcG9ydC5mYW1pbHksCi0JCSAgICAgICAmc3J4LT50cmFuc3BvcnQuc2luLnNpbl9hZGRyLAotCQkgICAgICAgbnRvaHMoc3J4LT50cmFuc3BvcnQuc2luLnNpbl9wb3J0KSk7Ci0JfSBlbHNlIHsKLQkJX2VudGVyKCJ7JWQsJXV9IiwKLQkJICAgICAgIHNyeC0+dHJhbnNwb3J0X3R5cGUsCi0JCSAgICAgICBzcngtPnRyYW5zcG9ydC5mYW1pbHkpOwotCQlyZXR1cm4gRVJSX1BUUigtRUFGTk9TVVBQT1JUKTsKLQl9CisJX2VudGVyKCJ7JWQsJWQsJXBJU3B9IiwKKwkgICAgICAgc3J4LT50cmFuc3BvcnRfdHlwZSwgc3J4LT50cmFuc3BvcnQuZmFtaWx5LCAmc3J4LT50cmFuc3BvcnQpOwogCiAJbXV0ZXhfbG9jaygmcnhycGNfbG9jYWxfbXV0ZXgpOwogCkBAIC0yMzQsMTMgKzIzNCw4IEBACiBmb3VuZDoKIAltdXRleF91bmxvY2soJnJ4cnBjX2xvY2FsX211dGV4KTsKIAotCV9uZXQoIkxPQ0FMICVzICVkIHslZCwldSwlcEk0KyVodX0iLAotCSAgICAgYWdlLAotCSAgICAgbG9jYWwtPmRlYnVnX2lkLAotCSAgICAgbG9jYWwtPnNyeC50cmFuc3BvcnRfdHlwZSwKLQkgICAgIGxvY2FsLT5zcngudHJhbnNwb3J0LmZhbWlseSwKLQkgICAgICZsb2NhbC0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX2FkZHIsCi0JICAgICBudG9ocyhsb2NhbC0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX3BvcnQpKTsKKwlfbmV0KCJMT0NBTCAlcyAlZCB7JXBJU3B9IiwKKwkgICAgIGFnZSwgbG9jYWwtPmRlYnVnX2lkLCAmbG9jYWwtPnNyeC50cmFuc3BvcnQpOwogCiAJX2xlYXZlKCIgPSAlcCIsIGxvY2FsKTsKIAlyZXR1cm4gbG9jYWw7CkBAIC0yOTYsNyArMjkxLDcgQEAKIAltdXRleF91bmxvY2soJnJ4cnBjX2xvY2FsX211dGV4KTsKIAogCUFTU0VSVChSQl9FTVBUWV9ST09UKCZsb2NhbC0+Y2xpZW50X2Nvbm5zKSk7Ci0JQVNTRVJUKGxpc3RfZW1wdHkoJmxvY2FsLT5zZXJ2aWNlcykpOworCUFTU0VSVCghbG9jYWwtPnNlcnZpY2UpOwogCiAJaWYgKHNvY2tldCkgewogCQlsb2NhbC0+c29ja2V0ID0gTlVMTDsKQEAgLTMwOCw3ICszMDMsNiBAQAogCS8qIEF0IHRoaXMgcG9pbnQsIHRoZXJlIHNob3VsZCBiZSBubyBtb3JlIHBhY2tldHMgY29taW5nIGluIHRvIHRoZQogCSAqIGxvY2FsIGVuZHBvaW50LgogCSAqLwotCXJ4cnBjX3B1cmdlX3F1ZXVlKCZsb2NhbC0+YWNjZXB0X3F1ZXVlKTsKIAlyeHJwY19wdXJnZV9xdWV1ZSgmbG9jYWwtPnJlamVjdF9xdWV1ZSk7CiAJcnhycGNfcHVyZ2VfcXVldWUoJmxvY2FsLT5ldmVudF9xdWV1ZSk7CiAKQEAgLTMzMiwxMSArMzI2LDYgQEAKIAkJaWYgKGF0b21pY19yZWFkKCZsb2NhbC0+dXNhZ2UpID09IDApCiAJCQlyZXR1cm4gcnhycGNfbG9jYWxfZGVzdHJveWVyKGxvY2FsKTsKIAotCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmbG9jYWwtPmFjY2VwdF9xdWV1ZSkpIHsKLQkJCXJ4cnBjX2FjY2VwdF9pbmNvbWluZ19jYWxscyhsb2NhbCk7Ci0JCQlhZ2FpbiA9IHRydWU7Ci0JCX0KLQogCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmbG9jYWwtPnJlamVjdF9xdWV1ZSkpIHsKIAkJCXJ4cnBjX3JlamVjdF9wYWNrZXRzKGxvY2FsKTsKIAkJCWFnYWluID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9taXNjLmMgYi9uZXQvcnhycGMvbWlzYy5jCmluZGV4IGJkYzVlNDIuLjlkMWM3MjEgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9taXNjLmMKKysrIGIvbmV0L3J4cnBjL21pc2MuYwpAQCAtMjEsMjggKzIxLDMzIEBACiB1bnNpZ25lZCBpbnQgcnhycGNfbWF4X2JhY2tsb2cgX19yZWFkX21vc3RseSA9IDEwOwogCiAvKgorICogTWF4aW11bSBsaWZldGltZSBvZiBhIGNhbGwgKGluIG14KS4KKyAqLwordW5zaWduZWQgaW50IHJ4cnBjX21heF9jYWxsX2xpZmV0aW1lID0gNjAgKiAxMDAwOworCisvKgogICogSG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgc2NoZWR1bGluZyBBQ0sgZ2VuZXJhdGlvbiBhZnRlciBzZWVpbmcgYQotICogcGFja2V0IHdpdGggUlhSUENfUkVRVUVTVF9BQ0sgc2V0IChpbiBqaWZmaWVzKS4KKyAqIHBhY2tldCB3aXRoIFJYUlBDX1JFUVVFU1RfQUNLIHNldCAoaW4gbXMpLgogICovCiB1bnNpZ25lZCBpbnQgcnhycGNfcmVxdWVzdGVkX2Fja19kZWxheSA9IDE7CiAKIC8qCi0gKiBIb3cgbG9uZyB0byB3YWl0IGJlZm9yZSBzY2hlZHVsaW5nIGFuIEFDSyB3aXRoIHN1YnR5cGUgREVMQVkgKGluIGppZmZpZXMpLgorICogSG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgc2NoZWR1bGluZyBhbiBBQ0sgd2l0aCBzdWJ0eXBlIERFTEFZIChpbiBtcykuCiAgKgogICogV2UgdXNlIHRoaXMgd2hlbiB3ZSd2ZSByZWNlaXZlZCBuZXcgZGF0YSBwYWNrZXRzLiAgSWYgdGhvc2UgcGFja2V0cyBhcmVuJ3QKICAqIGFsbCBjb25zdW1lZCB3aXRoaW4gdGhpcyB0aW1lIHdlIHdpbGwgc2VuZCBhIERFTEFZIEFDSyBpZiBhbiBBQ0sgd2FzIG5vdAogICogcmVxdWVzdGVkIHRvIGxldCB0aGUgc2VuZGVyIGtub3cgaXQgZG9lc24ndCBuZWVkIHRvIHJlc2VuZC4KICAqLwotdW5zaWduZWQgaW50IHJ4cnBjX3NvZnRfYWNrX2RlbGF5ID0gMSAqIEhaOwordW5zaWduZWQgaW50IHJ4cnBjX3NvZnRfYWNrX2RlbGF5ID0gMSAqIDEwMDA7CiAKIC8qCi0gKiBIb3cgbG9uZyB0byB3YWl0IGJlZm9yZSBzY2hlZHVsaW5nIGFuIEFDSyB3aXRoIHN1YnR5cGUgSURMRSAoaW4gamlmZmllcykuCisgKiBIb3cgbG9uZyB0byB3YWl0IGJlZm9yZSBzY2hlZHVsaW5nIGFuIEFDSyB3aXRoIHN1YnR5cGUgSURMRSAoaW4gbXMpLgogICoKICAqIFdlIHVzZSB0aGlzIHdoZW4gd2UndmUgY29uc3VtZWQgc29tZSBwcmV2aW91c2x5IHNvZnQtQUNLJ2QgcGFja2V0cyB3aGVuCiAgKiBmdXJ0aGVyIHBhY2tldHMgYXJlbid0IGltbWVkaWF0ZWx5IHJlY2VpdmVkIHRvIGRlY2lkZSB3aGVuIHRvIHNlbmQgYW4gSURMRQogICogQUNLIGxldCB0aGUgb3RoZXIgZW5kIGtub3cgdGhhdCBpdCBjYW4gZnJlZSB1cCBpdHMgVHggYnVmZmVyIHNwYWNlLgogICovCi11bnNpZ25lZCBpbnQgcnhycGNfaWRsZV9hY2tfZGVsYXkgPSAwLjUgKiBIWjsKK3Vuc2lnbmVkIGludCByeHJwY19pZGxlX2Fja19kZWxheSA9IDAuNSAqIDEwMDA7CiAKIC8qCiAgKiBSZWNlaXZlIHdpbmRvdyBzaXplIGluIHBhY2tldHMuICBUaGlzIGluZGljYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YKQEAgLTUwLDcgKzU1LDEwIEBACiAgKiBsaW1pdCBpcyBoaXQsIHdlIHNob3VsZCBnZW5lcmF0ZSBhbiBFWENFRURTX1dJTkRPVyBBQ0sgYW5kIGRpc2NhcmQgZnVydGhlcgogICogcGFja2V0cy4KICAqLwotdW5zaWduZWQgaW50IHJ4cnBjX3J4X3dpbmRvd19zaXplID0gMzI7Cit1bnNpZ25lZCBpbnQgcnhycGNfcnhfd2luZG93X3NpemUgPSBSWFJQQ19JTklUX1JYX1dJTkRPV19TSVpFOworI2lmIChSWFJQQ19SWFRYX0JVRkZfU0laRSAtIDEpIDwgUlhSUENfSU5JVF9SWF9XSU5ET1dfU0laRQorI2Vycm9yIE5lZWQgdG8gcmVkdWNlIFJYUlBDX0lOSVRfUlhfV0lORE9XX1NJWkUKKyNlbmRpZgogCiAvKgogICogTWF4aW11bSBSeCBNVFUgc2l6ZS4gIFRoaXMgaW5kaWNhdGVzIHRvIHRoZSBzZW5kZXIgdGhlIHNpemUgb2YganVtYm8gcGFja2V0CkBAIC02NCw2ICs3MiwxMSBAQAogICovCiB1bnNpZ25lZCBpbnQgcnhycGNfcnhfanVtYm9fbWF4ID0gNDsKIAorLyoKKyAqIFRpbWUgdGlsbCBwYWNrZXQgcmVzZW5kIChpbiBtaWxsaXNlY29uZHMpLgorICovCit1bnNpZ25lZCBpbnQgcnhycGNfcmVzZW5kX3RpbWVvdXQgPSA0ICogMTAwMDsKKwogY29uc3QgY2hhciAqY29uc3QgcnhycGNfcGt0c1tdID0gewogCSI/MDAiLAogCSJEQVRBIiwgIkFDSyIsICJCVVNZIiwgIkFCT1JUIiwgIkFDS0FMTCIsICJDSEFMTCIsICJSRVNQIiwgIkRFQlVHIiwKQEAgLTc1LDIxICs4OCwxNTIgQEAKIAlbUlhSUENfQUNLX0RFTEFZXQkJPSAxLAogCVtSWFJQQ19BQ0tfUkVRVUVTVEVEXQkJPSAyLAogCVtSWFJQQ19BQ0tfSURMRV0JCT0gMywKLQlbUlhSUENfQUNLX1BJTkdfUkVTUE9OU0VdCT0gNCwKLQlbUlhSUENfQUNLX0RVUExJQ0FURV0JCT0gNSwKLQlbUlhSUENfQUNLX09VVF9PRl9TRVFVRU5DRV0JPSA2LAotCVtSWFJQQ19BQ0tfRVhDRUVEU19XSU5ET1ddCT0gNywKLQlbUlhSUENfQUNLX05PU1BBQ0VdCQk9IDgsCisJW1JYUlBDX0FDS19EVVBMSUNBVEVdCQk9IDQsCisJW1JYUlBDX0FDS19PVVRfT0ZfU0VRVUVOQ0VdCT0gNSwKKwlbUlhSUENfQUNLX0VYQ0VFRFNfV0lORE9XXQk9IDYsCisJW1JYUlBDX0FDS19OT1NQQUNFXQkJPSA3LAorCVtSWFJQQ19BQ0tfUElOR19SRVNQT05TRV0JPSA4LAorCVtSWFJQQ19BQ0tfUElOR10JCT0gOSwKIH07CiAKLWNvbnN0IGNoYXIgKnJ4cnBjX2Fja3ModTggcmVhc29uKQotewotCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzdHJbXSA9IHsKLQkJIi0tLSIsICJSRVEiLCAiRFVQIiwgIk9PUyIsICJXSU4iLCAiTUVNIiwgIlBORyIsICJQTlIiLCAiRExZIiwKLQkJIklETCIsICItPy0iCi0JfTsKK2NvbnN0IGNoYXIgY29uc3QgcnhycGNfYWNrX25hbWVzW1JYUlBDX0FDS19fSU5WQUxJRCArIDFdWzRdID0geworCSItLS0iLCAiUkVRIiwgIkRVUCIsICJPT1MiLCAiV0lOIiwgIk1FTSIsICJQTkciLCAiUE5SIiwgIkRMWSIsCisJIklETCIsICItPy0iCit9OwogCi0JaWYgKHJlYXNvbiA+PSBBUlJBWV9TSVpFKHN0cikpCi0JCXJlYXNvbiA9IEFSUkFZX1NJWkUoc3RyKSAtIDE7Ci0JcmV0dXJuIHN0cltyZWFzb25dOwotfQorY29uc3QgY2hhciByeHJwY19za2JfdHJhY2VzW3J4cnBjX3NrYl9fbnJfdHJhY2VdWzddID0geworCVtyeHJwY19za2JfcnhfY2xlYW5lZF0JCT0gIlJ4IENMTiIsCisJW3J4cnBjX3NrYl9yeF9mcmVlZF0JCT0gIlJ4IEZSRSIsCisJW3J4cnBjX3NrYl9yeF9nb3RdCQk9ICJSeCBHT1QiLAorCVtyeHJwY19za2JfcnhfbG9zdF0JCT0gIlJ4ICpMKiIsCisJW3J4cnBjX3NrYl9yeF9yZWNlaXZlZF0JCT0gIlJ4IFJDViIsCisJW3J4cnBjX3NrYl9yeF9wdXJnZWRdCQk9ICJSeCBQVVIiLAorCVtyeHJwY19za2Jfcnhfcm90YXRlZF0JCT0gIlJ4IFJPVCIsCisJW3J4cnBjX3NrYl9yeF9zZWVuXQkJPSAiUnggU0VFIiwKKwlbcnhycGNfc2tiX3R4X2NsZWFuZWRdCQk9ICJUeCBDTE4iLAorCVtyeHJwY19za2JfdHhfZnJlZWRdCQk9ICJUeCBGUkUiLAorCVtyeHJwY19za2JfdHhfZ290XQkJPSAiVHggR09UIiwKKwlbcnhycGNfc2tiX3R4X25ld10JCT0gIlR4IE5FVyIsCisJW3J4cnBjX3NrYl90eF9yb3RhdGVkXQkJPSAiVHggUk9UIiwKKwlbcnhycGNfc2tiX3R4X3NlZW5dCQk9ICJUeCBTRUUiLAorfTsKKworY29uc3QgY2hhciByeHJwY19jb25uX3RyYWNlc1tyeHJwY19jb25uX19ucl90cmFjZV1bNF0gPSB7CisJW3J4cnBjX2Nvbm5fbmV3X2NsaWVudF0JCT0gIk5XYyIsCisJW3J4cnBjX2Nvbm5fbmV3X3NlcnZpY2VdCT0gIk5XcyIsCisJW3J4cnBjX2Nvbm5fcXVldWVkXQkJPSAiUVVFIiwKKwlbcnhycGNfY29ubl9zZWVuXQkJPSAiU0VFIiwKKwlbcnhycGNfY29ubl9nb3RdCQk9ICJHT1QiLAorCVtyeHJwY19jb25uX3B1dF9jbGllbnRdCQk9ICJQVGMiLAorCVtyeHJwY19jb25uX3B1dF9zZXJ2aWNlXQk9ICJQVHMiLAorfTsKKworY29uc3QgY2hhciByeHJwY19jbGllbnRfdHJhY2VzW3J4cnBjX2NsaWVudF9fbnJfdHJhY2VdWzddID0geworCVtyeHJwY19jbGllbnRfYWN0aXZhdGVfY2hhbnNdCT0gIkFjdGl2YSIsCisJW3J4cnBjX2NsaWVudF9hbGxvY10JCT0gIkFsbG9jICIsCisJW3J4cnBjX2NsaWVudF9jaGFuX2FjdGl2YXRlXQk9ICJDaEFjdHYiLAorCVtyeHJwY19jbGllbnRfY2hhbl9kaXNjb25uZWN0XQk9ICJDaERpc2MiLAorCVtyeHJwY19jbGllbnRfY2hhbl9wYXNzXQk9ICJDaFBhc3MiLAorCVtyeHJwY19jbGllbnRfY2hhbl91bnN0YXJ0ZWRdCT0gIkNoVW5zdCIsCisJW3J4cnBjX2NsaWVudF9jbGVhbnVwXQkJPSAiQ2xlYW4gIiwKKwlbcnhycGNfY2xpZW50X2NvdW50XQkJPSAiQ291bnQgIiwKKwlbcnhycGNfY2xpZW50X2Rpc2NhcmRdCQk9ICJEaXNjYXIiLAorCVtyeHJwY19jbGllbnRfZHVwbGljYXRlXQk9ICJEdXBsaWMiLAorCVtyeHJwY19jbGllbnRfZXhwb3NlZF0JCT0gIkV4cG9zZSIsCisJW3J4cnBjX2NsaWVudF9yZXBsYWNlXQkJPSAiUmVwbGFjIiwKKwlbcnhycGNfY2xpZW50X3RvX2FjdGl2ZV0JPSAiLT5BY3R2IiwKKwlbcnhycGNfY2xpZW50X3RvX2N1bGxlZF0JPSAiLT5DdWxsIiwKKwlbcnhycGNfY2xpZW50X3RvX2lkbGVdCQk9ICItPklkbGUiLAorCVtyeHJwY19jbGllbnRfdG9faW5hY3RpdmVdCT0gIi0+SW5hYyIsCisJW3J4cnBjX2NsaWVudF90b193YWl0aW5nXQk9ICItPldhaXQiLAorCVtyeHJwY19jbGllbnRfdW5jb3VudF0JCT0gIlVuY291biIsCit9OworCitjb25zdCBjaGFyIHJ4cnBjX3RyYW5zbWl0X3RyYWNlc1tyeHJwY190cmFuc21pdF9fbnJfdHJhY2VdWzRdID0geworCVtyeHJwY190cmFuc21pdF93YWl0XQkJPSAiV0FJIiwKKwlbcnhycGNfdHJhbnNtaXRfcXVldWVdCQk9ICJRVUUiLAorCVtyeHJwY190cmFuc21pdF9xdWV1ZV9sYXN0XQk9ICJRTFMiLAorCVtyeHJwY190cmFuc21pdF9yb3RhdGVdCQk9ICJST1QiLAorCVtyeHJwY190cmFuc21pdF9yb3RhdGVfbGFzdF0JPSAiUkxTIiwKKwlbcnhycGNfdHJhbnNtaXRfYXdhaXRfcmVwbHldCT0gIkFXUiIsCisJW3J4cnBjX3RyYW5zbWl0X2VuZF0JCT0gIkVORCIsCit9OworCitjb25zdCBjaGFyIHJ4cnBjX3JlY2VpdmVfdHJhY2VzW3J4cnBjX3JlY2VpdmVfX25yX3RyYWNlXVs0XSA9IHsKKwlbcnhycGNfcmVjZWl2ZV9pbmNvbWluZ10JPSAiSU5DIiwKKwlbcnhycGNfcmVjZWl2ZV9xdWV1ZV0JCT0gIlFVRSIsCisJW3J4cnBjX3JlY2VpdmVfcXVldWVfbGFzdF0JPSAiUUxTIiwKKwlbcnhycGNfcmVjZWl2ZV9mcm9udF0JCT0gIkZSTiIsCisJW3J4cnBjX3JlY2VpdmVfcm90YXRlXQkJPSAiUk9UIiwKKwlbcnhycGNfcmVjZWl2ZV9lbmRdCQk9ICJFTkQiLAorfTsKKworY29uc3QgY2hhciByeHJwY19yZWN2bXNnX3RyYWNlc1tyeHJwY19yZWN2bXNnX19ucl90cmFjZV1bNV0gPSB7CisJW3J4cnBjX3JlY3Ztc2dfZW50ZXJdCQk9ICJFTlRSIiwKKwlbcnhycGNfcmVjdm1zZ193YWl0XQkJPSAiV0FJVCIsCisJW3J4cnBjX3JlY3Ztc2dfZGVxdWV1ZV0JCT0gIkRFUVUiLAorCVtyeHJwY19yZWN2bXNnX2hvbGVdCQk9ICJIT0xFIiwKKwlbcnhycGNfcmVjdm1zZ19uZXh0XQkJPSAiTkVYVCIsCisJW3J4cnBjX3JlY3Ztc2dfY29udF0JCT0gIkNPTlQiLAorCVtyeHJwY19yZWN2bXNnX2Z1bGxdCQk9ICJGVUxMIiwKKwlbcnhycGNfcmVjdm1zZ19kYXRhX3JldHVybl0JPSAiREFUQSIsCisJW3J4cnBjX3JlY3Ztc2dfdGVybWluYWxdCT0gIlRFUk0iLAorCVtyeHJwY19yZWN2bXNnX3RvX2JlX2FjY2VwdGVkXQk9ICJUQkFDIiwKKwlbcnhycGNfcmVjdm1zZ19yZXR1cm5dCQk9ICJSRVROIiwKK307CisKK2NvbnN0IGNoYXIgcnhycGNfcnR0X3R4X3RyYWNlc1tyeHJwY19ydHRfdHhfX25yX3RyYWNlXVs1XSA9IHsKKwlbcnhycGNfcnR0X3R4X3BpbmddCQk9ICJQSU5HIiwKKwlbcnhycGNfcnR0X3R4X2RhdGFdCQk9ICJEQVRBIiwKK307CisKK2NvbnN0IGNoYXIgcnhycGNfcnR0X3J4X3RyYWNlc1tyeHJwY19ydHRfcnhfX25yX3RyYWNlXVs1XSA9IHsKKwlbcnhycGNfcnR0X3J4X3BpbmdfcmVzcG9uc2VdCT0gIlBPTkciLAorCVtyeHJwY19ydHRfcnhfcmVxdWVzdGVkX2Fja10JPSAiUkFDSyIsCit9OworCitjb25zdCBjaGFyIHJ4cnBjX3RpbWVyX3RyYWNlc1tyeHJwY190aW1lcl9fbnJfdHJhY2VdWzhdID0geworCVtyeHJwY190aW1lcl9iZWdpbl0JCQk9ICJCZWdpbiAiLAorCVtyeHJwY190aW1lcl9leHBpcmVkXQkJCT0gIipFWFBSKiIsCisJW3J4cnBjX3RpbWVyX2luaXRfZm9yX3JlcGx5XQkJPSAiSW5pUnBsIiwKKwlbcnhycGNfdGltZXJfc2V0X2Zvcl9hY2tdCQk9ICJTZXRBY2siLAorCVtyeHJwY190aW1lcl9zZXRfZm9yX3NlbmRdCQk9ICJTZXRUeCAiLAorCVtyeHJwY190aW1lcl9zZXRfZm9yX3Jlc2VuZF0JCT0gIlNldFJUeCIsCit9OworCitjb25zdCBjaGFyIHJ4cnBjX3Byb3Bvc2VfYWNrX3RyYWNlc1tyeHJwY19wcm9wb3NlX2Fja19fbnJfdHJhY2VdWzhdID0geworCVtyeHJwY19wcm9wb3NlX2Fja19jbGllbnRfdHhfZW5kXQk9ICJDbFR4RW5kIiwKKwlbcnhycGNfcHJvcG9zZV9hY2tfaW5wdXRfZGF0YV0JCT0gIkRhdGFJbiAiLAorCVtyeHJwY19wcm9wb3NlX2Fja19waW5nX2Zvcl9sb3N0X2Fja10JPSAiTG9zdEFjayIsCisJW3J4cnBjX3Byb3Bvc2VfYWNrX3BpbmdfZm9yX2xvc3RfcmVwbHldCT0gIkxvc3RScGwiLAorCVtyeHJwY19wcm9wb3NlX2Fja19waW5nX2Zvcl9wYXJhbXNdCT0gIlBhcmFtcyAiLAorCVtyeHJwY19wcm9wb3NlX2Fja19yZXNwb25kX3RvX2Fja10JPSAiUnNwMkFjayIsCisJW3J4cnBjX3Byb3Bvc2VfYWNrX3Jlc3BvbmRfdG9fcGluZ10JPSAiUnNwMlBuZyIsCisJW3J4cnBjX3Byb3Bvc2VfYWNrX3JldHJ5X3R4XQkJPSAiUmV0cnlUeCIsCisJW3J4cnBjX3Byb3Bvc2VfYWNrX3JvdGF0ZV9yeF0JCT0gIlJ4QWNrICAiLAorCVtyeHJwY19wcm9wb3NlX2Fja190ZXJtaW5hbF9hY2tdCT0gIkNsVGVybSAiLAorfTsKKworY29uc3QgY2hhciAqY29uc3QgcnhycGNfcHJvcG9zZV9hY2tfb3V0Y29tZXNbcnhycGNfcHJvcG9zZV9hY2tfX25yX291dGNvbWVzXSA9IHsKKwlbcnhycGNfcHJvcG9zZV9hY2tfdXNlXQkJCT0gIiIsCisJW3J4cnBjX3Byb3Bvc2VfYWNrX3VwZGF0ZV0JCT0gIiBVcGRhdGUiLAorCVtyeHJwY19wcm9wb3NlX2Fja19zdWJzdW1lXQkJPSAiIFN1YnN1bWUiLAorfTsKKworY29uc3QgY2hhciByeHJwY19jb25nZXN0X21vZGVzW05SX19SWFJQQ19DT05HRVNUX01PREVTXVsxMF0gPSB7CisJW1JYUlBDX0NBTExfU0xPV19TVEFSVF0JCT0gIlNsb3dTdGFydCIsCisJW1JYUlBDX0NBTExfQ09OR0VTVF9BVk9JREFOQ0VdCT0gIkNvbmdBdm9pZCIsCisJW1JYUlBDX0NBTExfUEFDS0VUX0xPU1NdCT0gIlBrdExvc3MgICIsCisJW1JYUlBDX0NBTExfRkFTVF9SRVRSQU5TTUlUXQk9ICJGYXN0UmVUeCAiLAorfTsKKworY29uc3QgY2hhciByeHJwY19jb25nZXN0X2NoYW5nZXNbcnhycGNfY29uZ2VzdF9fbnJfY2hhbmdlXVs5XSA9IHsKKwlbcnhycGNfY29uZ19iZWdpbl9yZXRyYW5zbWlzc2lvbl0JPSAiIFJldHJhbnMiLAorCVtyeHJwY19jb25nX2NsZWFyZWRfbmFja3NdCQk9ICIgQ2xlYXJlZCIsCisJW3J4cnBjX2NvbmdfbmV3X2xvd19uYWNrXQkJPSAiIE5ld0xvd04iLAorCVtyeHJwY19jb25nX25vX2NoYW5nZV0JCQk9ICIiLAorCVtyeHJwY19jb25nX3Byb2dyZXNzXQkJCT0gIiBQcm9ncmVzIiwKKwlbcnhycGNfY29uZ19yZXRyYW5zbWl0X2FnYWluXQkJPSAiIFJlVHhBZ24iLAorCVtyeHJwY19jb25nX3J0dF93aW5kb3dfZW5kXQkJPSAiIFJ0dFdpbkUiLAorCVtyeHJwY19jb25nX3Nhd19uYWNrXQkJCT0gIiBTYXdOYWNrIiwKK307CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvb3V0cHV0LmMgYi9uZXQvcnhycGMvb3V0cHV0LmMKaW5kZXggZjRiZGEwNi4uMGQ0N2RiOCAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL291dHB1dC5jCisrKyBiL25ldC9yeHJwYy9vdXRwdXQuYwpAQCAtMTQsMzM2ICsxNCwzMjYgQEAKICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9jaXJjX2J1Zi5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L2FmX3J4cnBjLmg+CiAjaW5jbHVkZSAiYXItaW50ZXJuYWwuaCIKIAotLyoKLSAqIFRpbWUgdGlsbCBwYWNrZXQgcmVzZW5kIChpbiBqaWZmaWVzKS4KLSAqLwotdW5zaWduZWQgaW50IHJ4cnBjX3Jlc2VuZF90aW1lb3V0ID0gNCAqIEhaOwotCi1zdGF0aWMgaW50IHJ4cnBjX3NlbmRfZGF0YShzdHJ1Y3QgcnhycGNfc29jayAqcngsCi0JCQkgICBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCSAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbik7CitzdHJ1Y3QgcnhycGNfcGt0X2J1ZmZlciB7CisJc3RydWN0IHJ4cnBjX3dpcmVfaGVhZGVyIHdoZHI7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHJ4cnBjX2Fja3BhY2tldCBhY2s7CisJCQl1OCBhY2tzWzI1NV07CisJCQl1OCBwYWRbM107CisJCX07CisJCV9fYmUzMiBhYm9ydF9jb2RlOworCX07CisJc3RydWN0IHJ4cnBjX2Fja2luZm8gYWNraW5mbzsKK307CiAKIC8qCi0gKiBleHRyYWN0IGNvbnRyb2wgbWVzc2FnZXMgZnJvbSB0aGUgc2VuZG1zZygpIGNvbnRyb2wgYnVmZmVyCisgKiBGaWxsIG91dCBhbiBBQ0sgcGFja2V0LgogICovCi1zdGF0aWMgaW50IHJ4cnBjX3NlbmRtc2dfY21zZyhzdHJ1Y3QgbXNnaGRyICptc2csCi0JCQkgICAgICB1bnNpZ25lZCBsb25nICp1c2VyX2NhbGxfSUQsCi0JCQkgICAgICBlbnVtIHJ4cnBjX2NvbW1hbmQgKmNvbW1hbmQsCi0JCQkgICAgICB1MzIgKmFib3J0X2NvZGUsCi0JCQkgICAgICBib29sICpfZXhjbHVzaXZlKQorc3RhdGljIHNpemVfdCByeHJwY19maWxsX291dF9hY2soc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkJIHN0cnVjdCByeHJwY19wa3RfYnVmZmVyICpwa3QsCisJCQkJIHJ4cnBjX3NlcV90ICpfaGFyZF9hY2ssCisJCQkJIHJ4cnBjX3NlcV90ICpfdG9wKQogewotCXN0cnVjdCBjbXNnaGRyICpjbXNnOwotCWJvb2wgZ290X3VzZXJfSUQgPSBmYWxzZTsKLQlpbnQgbGVuOworCXJ4cnBjX3NlcmlhbF90IHNlcmlhbDsKKwlyeHJwY19zZXFfdCBoYXJkX2FjaywgdG9wLCBzZXE7CisJaW50IGl4OworCXUzMiBtdHUsIGptYXg7CisJdTggKmFja3AgPSBwa3QtPmFja3M7CiAKLQkqY29tbWFuZCA9IFJYUlBDX0NNRF9TRU5EX0RBVEE7CisJLyogQmFycmllciBhZ2FpbnN0IHJ4cnBjX2lucHV0X2RhdGEoKS4gKi8KKwlzZXJpYWwgPSBjYWxsLT5hY2tyX3NlcmlhbDsKKwloYXJkX2FjayA9IFJFQURfT05DRShjYWxsLT5yeF9oYXJkX2Fjayk7CisJdG9wID0gc21wX2xvYWRfYWNxdWlyZSgmY2FsbC0+cnhfdG9wKTsKKwkqX2hhcmRfYWNrID0gaGFyZF9hY2s7CisJKl90b3AgPSB0b3A7CiAKLQlpZiAobXNnLT5tc2dfY29udHJvbGxlbiA9PSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlwa3QtPmFjay5idWZmZXJTcGFjZQk9IGh0b25zKDgpOworCXBrdC0+YWNrLm1heFNrZXcJPSBodG9ucyhjYWxsLT5hY2tyX3NrZXcpOworCXBrdC0+YWNrLmZpcnN0UGFja2V0CT0gaHRvbmwoaGFyZF9hY2sgKyAxKTsKKwlwa3QtPmFjay5wcmV2aW91c1BhY2tldAk9IGh0b25sKGNhbGwtPmFja3JfcHJldl9zZXEpOworCXBrdC0+YWNrLnNlcmlhbAkJPSBodG9ubChzZXJpYWwpOworCXBrdC0+YWNrLnJlYXNvbgkJPSBjYWxsLT5hY2tyX3JlYXNvbjsKKwlwa3QtPmFjay5uQWNrcwkJPSB0b3AgLSBoYXJkX2FjazsKIAotCWZvcl9lYWNoX2Ntc2doZHIoY21zZywgbXNnKSB7Ci0JCWlmICghQ01TR19PSyhtc2csIGNtc2cpKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHBrdC0+YWNrLnJlYXNvbiA9PSBSWFJQQ19BQ0tfUElORykKKwkJcGt0LT53aGRyLmZsYWdzIHw9IFJYUlBDX1JFUVVFU1RfQUNLOwogCi0JCWxlbiA9IGNtc2ctPmNtc2dfbGVuIC0gQ01TR19BTElHTihzaXplb2Yoc3RydWN0IGNtc2doZHIpKTsKLQkJX2RlYnVnKCJDTVNHICVkLCAlZCwgJWQiLAotCQkgICAgICAgY21zZy0+Y21zZ19sZXZlbCwgY21zZy0+Y21zZ190eXBlLCBsZW4pOworCWlmIChhZnRlcih0b3AsIGhhcmRfYWNrKSkgeworCQlzZXEgPSBoYXJkX2FjayArIDE7CisJCWRvIHsKKwkJCWl4ID0gc2VxICYgUlhSUENfUlhUWF9CVUZGX01BU0s7CisJCQlpZiAoY2FsbC0+cnh0eF9idWZmZXJbaXhdKQorCQkJCSphY2twKysgPSBSWFJQQ19BQ0tfVFlQRV9BQ0s7CisJCQllbHNlCisJCQkJKmFja3ArKyA9IFJYUlBDX0FDS19UWVBFX05BQ0s7CisJCQlzZXErKzsKKwkJfSB3aGlsZSAoYmVmb3JlX2VxKHNlcSwgdG9wKSk7CisJfQogCi0JCWlmIChjbXNnLT5jbXNnX2xldmVsICE9IFNPTF9SWFJQQykKLQkJCWNvbnRpbnVlOworCW10dSA9IGNhbGwtPmNvbm4tPnBhcmFtcy5wZWVyLT5pZl9tdHU7CisJbXR1IC09IGNhbGwtPmNvbm4tPnBhcmFtcy5wZWVyLT5oZHJzaXplOworCWptYXggPSAoY2FsbC0+bnJfanVtYm9fYmFkID4gMykgPyAxIDogcnhycGNfcnhfanVtYm9fbWF4OworCXBrdC0+YWNraW5mby5yeE1UVQk9IGh0b25sKHJ4cnBjX3J4X210dSk7CisJcGt0LT5hY2tpbmZvLm1heE1UVQk9IGh0b25sKG10dSk7CisJcGt0LT5hY2tpbmZvLnJ3aW5kCT0gaHRvbmwoY2FsbC0+cnhfd2luc2l6ZSk7CisJcGt0LT5hY2tpbmZvLmp1bWJvX21heAk9IGh0b25sKGptYXgpOwogCi0JCXN3aXRjaCAoY21zZy0+Y21zZ190eXBlKSB7Ci0JCWNhc2UgUlhSUENfVVNFUl9DQUxMX0lEOgotCQkJaWYgKG1zZy0+bXNnX2ZsYWdzICYgTVNHX0NNU0dfQ09NUEFUKSB7Ci0JCQkJaWYgKGxlbiAhPSBzaXplb2YodTMyKSkKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJKnVzZXJfY2FsbF9JRCA9ICoodTMyICopIENNU0dfREFUQShjbXNnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGxlbiAhPSBzaXplb2YodW5zaWduZWQgbG9uZykpCi0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCSp1c2VyX2NhbGxfSUQgPSAqKHVuc2lnbmVkIGxvbmcgKikKLQkJCQkJQ01TR19EQVRBKGNtc2cpOwotCQkJfQotCQkJX2RlYnVnKCJVc2VyIENhbGwgSUQgJWx4IiwgKnVzZXJfY2FsbF9JRCk7Ci0JCQlnb3RfdXNlcl9JRCA9IHRydWU7Ci0JCQlicmVhazsKKwkqYWNrcCsrID0gMDsKKwkqYWNrcCsrID0gMDsKKwkqYWNrcCsrID0gMDsKKwlyZXR1cm4gdG9wIC0gaGFyZF9hY2sgKyAzOworfQogCi0JCWNhc2UgUlhSUENfQUJPUlQ6Ci0JCQlpZiAoKmNvbW1hbmQgIT0gUlhSUENfQ01EX1NFTkRfREFUQSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCSpjb21tYW5kID0gUlhSUENfQ01EX1NFTkRfQUJPUlQ7Ci0JCQlpZiAobGVuICE9IHNpemVvZigqYWJvcnRfY29kZSkpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkqYWJvcnRfY29kZSA9ICoodW5zaWduZWQgaW50ICopIENNU0dfREFUQShjbXNnKTsKLQkJCV9kZWJ1ZygiQWJvcnQgJXgiLCAqYWJvcnRfY29kZSk7Ci0JCQlpZiAoKmFib3J0X2NvZGUgPT0gMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWJyZWFrOworLyoKKyAqIFNlbmQgYW4gQUNLIG9yIEFCT1JUIGNhbGwgcGFja2V0LgorICovCitpbnQgcnhycGNfc2VuZF9jYWxsX3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgdTggdHlwZSkKK3sKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiA9IE5VTEw7CisJc3RydWN0IHJ4cnBjX3BrdF9idWZmZXIgKnBrdDsKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlzdHJ1Y3Qga3ZlYyBpb3ZbMl07CisJcnhycGNfc2VyaWFsX3Qgc2VyaWFsOworCXJ4cnBjX3NlcV90IGhhcmRfYWNrLCB0b3A7CisJc2l6ZV90IGxlbiwgbjsKKwlib29sIHBpbmcgPSBmYWxzZTsKKwlpbnQgaW9jLCByZXQ7CisJdTMyIGFib3J0X2NvZGU7CiAKLQkJY2FzZSBSWFJQQ19BQ0NFUFQ6Ci0JCQlpZiAoKmNvbW1hbmQgIT0gUlhSUENfQ01EX1NFTkRfREFUQSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCSpjb21tYW5kID0gUlhSUENfQ01EX0FDQ0VQVDsKLQkJCWlmIChsZW4gIT0gMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWJyZWFrOworCV9lbnRlcigiJXUsJXMiLCBjYWxsLT5kZWJ1Z19pZCwgcnhycGNfcGt0c1t0eXBlXSk7CiAKLQkJY2FzZSBSWFJQQ19FWENMVVNJVkVfQ0FMTDoKLQkJCSpfZXhjbHVzaXZlID0gdHJ1ZTsKLQkJCWlmIChsZW4gIT0gMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7CisJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKwlpZiAoY2FsbC0+Y29ubikKKwkJY29ubiA9IHJ4cnBjX2dldF9jb25uZWN0aW9uX21heWJlKGNhbGwtPmNvbm4pOworCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKwlpZiAoIWNvbm4pCisJCXJldHVybiAtRUNPTk5SRVNFVDsKKworCXBrdCA9IGt6YWxsb2Moc2l6ZW9mKCpwa3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBrdCkgeworCQlyeHJwY19wdXRfY29ubmVjdGlvbihjb25uKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbXNnLm1zZ19uYW1lCT0gJmNhbGwtPnBlZXItPnNyeC50cmFuc3BvcnQ7CisJbXNnLm1zZ19uYW1lbGVuCT0gY2FsbC0+cGVlci0+c3J4LnRyYW5zcG9ydF9sZW47CisJbXNnLm1zZ19jb250cm9sCT0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCW1zZy5tc2dfZmxhZ3MJPSAwOworCisJcGt0LT53aGRyLmVwb2NoCQk9IGh0b25sKGNvbm4tPnByb3RvLmVwb2NoKTsKKwlwa3QtPndoZHIuY2lkCQk9IGh0b25sKGNhbGwtPmNpZCk7CisJcGt0LT53aGRyLmNhbGxOdW1iZXIJPSBodG9ubChjYWxsLT5jYWxsX2lkKTsKKwlwa3QtPndoZHIuc2VxCQk9IDA7CisJcGt0LT53aGRyLnR5cGUJCT0gdHlwZTsKKwlwa3QtPndoZHIuZmxhZ3MJCT0gY29ubi0+b3V0X2NsaWVudGZsYWc7CisJcGt0LT53aGRyLnVzZXJTdGF0dXMJPSAwOworCXBrdC0+d2hkci5zZWN1cml0eUluZGV4CT0gY2FsbC0+c2VjdXJpdHlfaXg7CisJcGt0LT53aGRyLl9yc3ZkCQk9IDA7CisJcGt0LT53aGRyLnNlcnZpY2VJZAk9IGh0b25zKGNhbGwtPnNlcnZpY2VfaWQpOworCisJaW92WzBdLmlvdl9iYXNlCT0gcGt0OworCWlvdlswXS5pb3ZfbGVuCT0gc2l6ZW9mKHBrdC0+d2hkcik7CisJbGVuID0gc2l6ZW9mKHBrdC0+d2hkcik7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0FDSzoKKwkJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKwkJaWYgKCFjYWxsLT5hY2tyX3JlYXNvbikgeworCQkJc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmxvY2spOworCQkJcmV0ID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJCXBpbmcgPSAoY2FsbC0+YWNrcl9yZWFzb24gPT0gUlhSUENfQUNLX1BJTkcpOworCQluID0gcnhycGNfZmlsbF9vdXRfYWNrKGNhbGwsIHBrdCwgJmhhcmRfYWNrLCAmdG9wKTsKKwkJY2FsbC0+YWNrcl9yZWFzb24gPSAwOworCisJCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKworCisJCXBrdC0+d2hkci5mbGFncyB8PSBSWFJQQ19TTE9XX1NUQVJUX09LOworCisJCWlvdlswXS5pb3ZfbGVuICs9IHNpemVvZihwa3QtPmFjaykgKyBuOworCQlpb3ZbMV0uaW92X2Jhc2UgPSAmcGt0LT5hY2tpbmZvOworCQlpb3ZbMV0uaW92X2xlbgk9IHNpemVvZihwa3QtPmFja2luZm8pOworCQlsZW4gKz0gc2l6ZW9mKHBrdC0+YWNrKSArIG4gKyBzaXplb2YocGt0LT5hY2tpbmZvKTsKKwkJaW9jID0gMjsKKwkJYnJlYWs7CisKKwljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0FCT1JUOgorCQlhYm9ydF9jb2RlID0gY2FsbC0+YWJvcnRfY29kZTsKKwkJcGt0LT5hYm9ydF9jb2RlID0gaHRvbmwoYWJvcnRfY29kZSk7CisJCWlvdlswXS5pb3ZfbGVuICs9IHNpemVvZihwa3QtPmFib3J0X2NvZGUpOworCQlsZW4gKz0gc2l6ZW9mKHBrdC0+YWJvcnRfY29kZSk7CisJCWlvYyA9IDE7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldCA9IC1FTk9BTk87CisJCWdvdG8gb3V0OworCX0KKworCXNlcmlhbCA9IGF0b21pY19pbmNfcmV0dXJuKCZjb25uLT5zZXJpYWwpOworCXBrdC0+d2hkci5zZXJpYWwgPSBodG9ubChzZXJpYWwpOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQUNLOgorCQl0cmFjZV9yeHJwY190eF9hY2soY2FsbCwgc2VyaWFsLAorCQkJCSAgIG50b2hsKHBrdC0+YWNrLmZpcnN0UGFja2V0KSwKKwkJCQkgICBudG9obChwa3QtPmFjay5zZXJpYWwpLAorCQkJCSAgIHBrdC0+YWNrLnJlYXNvbiwgcGt0LT5hY2subkFja3MpOworCQlicmVhazsKKwl9CisKKwlpZiAocGluZykgeworCQljYWxsLT5hY2tyX3BpbmcgPSBzZXJpYWw7CisJCXNtcF93bWIoKTsKKwkJLyogV2UgbmVlZCB0byBzdGljayBhIHRpbWUgaW4gYmVmb3JlIHdlIHNlbmQgdGhlIHBhY2tldCBpbiBjYXNlCisJCSAqIHRoZSByZXBseSBnZXRzIGJhY2sgYmVmb3JlIGtlcm5lbF9zZW5kbXNnKCkgY29tcGxldGVzIC0gYnV0CisJCSAqIGFza2luZyBVRFAgdG8gc2VuZCB0aGUgcGFja2V0IGNhbiB0YWtlIGEgcmVsYXRpdmVseSBsb25nCisJCSAqIHRpbWUsIHNvIHdlIHVwZGF0ZSB0aGUgdGltZSBhZnRlciwgb24gdGhlIGFzc3VtcHRpb24gdGhhdAorCQkgKiB0aGUgcGFja2V0IHRyYW5zbWlzc2lvbiBpcyBtb3JlIGxpa2VseSB0byBoYXBwZW4gdG93YXJkcyB0aGUKKwkJICogZW5kIG9mIHRoZSBrZXJuZWxfc2VuZG1zZygpIGNhbGwuCisJCSAqLworCQljYWxsLT5hY2tyX3BpbmdfdGltZSA9IGt0aW1lX2dldF9yZWFsKCk7CisJCXNldF9iaXQoUlhSUENfQ0FMTF9QSU5HSU5HLCAmY2FsbC0+ZmxhZ3MpOworCQl0cmFjZV9yeHJwY19ydHRfdHgoY2FsbCwgcnhycGNfcnR0X3R4X3BpbmcsIHNlcmlhbCk7CisJfQorCXJldCA9IGtlcm5lbF9zZW5kbXNnKGNvbm4tPnBhcmFtcy5sb2NhbC0+c29ja2V0LAorCQkJICAgICAmbXNnLCBpb3YsIGlvYywgbGVuKTsKKwlpZiAocGluZykKKwkJY2FsbC0+YWNrcl9waW5nX3RpbWUgPSBrdGltZV9nZXRfcmVhbCgpOworCisJaWYgKHR5cGUgPT0gUlhSUENfUEFDS0VUX1RZUEVfQUNLICYmCisJICAgIGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSkgeworCQlpZiAocmV0IDwgMCkgeworCQkJY2xlYXJfYml0KFJYUlBDX0NBTExfUElOR0lORywgJmNhbGwtPmZsYWdzKTsKKwkJCXJ4cnBjX3Byb3Bvc2VfQUNLKGNhbGwsIHBrdC0+YWNrLnJlYXNvbiwKKwkJCQkJICBudG9ocyhwa3QtPmFjay5tYXhTa2V3KSwKKwkJCQkJICBudG9obChwa3QtPmFjay5zZXJpYWwpLAorCQkJCQkgIHRydWUsIHRydWUsCisJCQkJCSAgcnhycGNfcHJvcG9zZV9hY2tfcmV0cnlfdHgpOworCQl9IGVsc2UgeworCQkJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKwkJCWlmIChhZnRlcihoYXJkX2FjaywgY2FsbC0+YWNrcl9jb25zdW1lZCkpCisJCQkJY2FsbC0+YWNrcl9jb25zdW1lZCA9IGhhcmRfYWNrOworCQkJaWYgKGFmdGVyKHRvcCwgY2FsbC0+YWNrcl9zZWVuKSkKKwkJCQljYWxsLT5hY2tyX3NlZW4gPSB0b3A7CisJCQlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7CiAJCX0KIAl9CiAKLQlpZiAoIWdvdF91c2VyX0lEKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlfbGVhdmUoIiA9IDAiKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIGFib3J0IGEgY2FsbCwgc2VuZGluZyBhbiBBQk9SVCBwYWNrZXQgdG8gdGhlIHBlZXIKLSAqLwotc3RhdGljIHZvaWQgcnhycGNfc2VuZF9hYm9ydChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgdTMyIGFib3J0X2NvZGUpCi17Ci0Jd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0KLQlpZiAoY2FsbC0+c3RhdGUgPD0gUlhSUENfQ0FMTF9DT01QTEVURSkgewotCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEOwotCQljYWxsLT5sb2NhbF9hYm9ydCA9IGFib3J0X2NvZGU7Ci0JCXNldF9iaXQoUlhSUENfQ0FMTF9FVl9BQk9SVCwgJmNhbGwtPmV2ZW50cyk7Ci0JCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5yZXNlbmRfdGltZXIpOwotCQlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrX3RpbWVyKTsKLQkJY2xlYXJfYml0KFJYUlBDX0NBTExfRVZfUkVTRU5EX1RJTUVSLCAmY2FsbC0+ZXZlbnRzKTsKLQkJY2xlYXJfYml0KFJYUlBDX0NBTExfRVZfQUNLLCAmY2FsbC0+ZXZlbnRzKTsKLQkJY2xlYXJfYml0KFJYUlBDX0NBTExfUlVOX1JUSU1FUiwgJmNhbGwtPmZsYWdzKTsKLQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQl9Ci0KLQl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotfQotCi0vKgotICogQ3JlYXRlIGEgbmV3IGNsaWVudCBjYWxsIGZvciBzZW5kbXNnKCkuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcnhycGNfY2FsbCAqCi1yeHJwY19uZXdfY2xpZW50X2NhbGxfZm9yX3NlbmRtc2coc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LCBzdHJ1Y3QgbXNnaGRyICptc2csCi0JCQkJICB1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCwgYm9vbCBleGNsdXNpdmUpCi17Ci0Jc3RydWN0IHJ4cnBjX2Nvbm5fcGFyYW1ldGVycyBjcDsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKLQlzdHJ1Y3Qga2V5ICprZXk7Ci0KLQlERUNMQVJFX1NPQ0tBRERSKHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqLCBzcngsIG1zZy0+bXNnX25hbWUpOwotCi0JX2VudGVyKCIiKTsKLQotCWlmICghbXNnLT5tc2dfbmFtZSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVERVNUQUREUlJFUSk7Ci0KLQlrZXkgPSByeC0+a2V5OwotCWlmIChrZXkgJiYgIXJ4LT5rZXktPnBheWxvYWQuZGF0YVswXSkKLQkJa2V5ID0gTlVMTDsKLQotCW1lbXNldCgmY3AsIDAsIHNpemVvZihjcCkpOwotCWNwLmxvY2FsCQk9IHJ4LT5sb2NhbDsKLQljcC5rZXkJCQk9IHJ4LT5rZXk7Ci0JY3Auc2VjdXJpdHlfbGV2ZWwJPSByeC0+bWluX3NlY19sZXZlbDsKLQljcC5leGNsdXNpdmUJCT0gcngtPmV4Y2x1c2l2ZSB8IGV4Y2x1c2l2ZTsKLQljcC5zZXJ2aWNlX2lkCQk9IHNyeC0+c3J4X3NlcnZpY2U7Ci0JY2FsbCA9IHJ4cnBjX25ld19jbGllbnRfY2FsbChyeCwgJmNwLCBzcngsIHVzZXJfY2FsbF9JRCwgR0ZQX0tFUk5FTCk7Ci0KLQlfbGVhdmUoIiA9ICVwXG4iLCBjYWxsKTsKLQlyZXR1cm4gY2FsbDsKLX0KLQotLyoKLSAqIHNlbmQgYSBtZXNzYWdlIGZvcm1pbmcgcGFydCBvZiBhIGNsaWVudCBjYWxsIHRocm91Z2ggYW4gUnhSUEMgc29ja2V0Ci0gKiAtIGNhbGxlciBob2xkcyB0aGUgc29ja2V0IGxvY2tlZAotICogLSB0aGUgc29ja2V0IG1heSBiZSBlaXRoZXIgYSBjbGllbnQgc29ja2V0IG9yIGEgc2VydmVyIHNvY2tldAotICovCi1pbnQgcnhycGNfZG9fc2VuZG1zZyhzdHJ1Y3QgcnhycGNfc29jayAqcngsIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKLXsKLQllbnVtIHJ4cnBjX2NvbW1hbmQgY21kOwotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwotCXVuc2lnbmVkIGxvbmcgdXNlcl9jYWxsX0lEID0gMDsKLQlib29sIGV4Y2x1c2l2ZSA9IGZhbHNlOwotCXUzMiBhYm9ydF9jb2RlID0gMDsKLQlpbnQgcmV0OwotCi0JX2VudGVyKCIiKTsKLQotCXJldCA9IHJ4cnBjX3NlbmRtc2dfY21zZyhtc2csICZ1c2VyX2NhbGxfSUQsICZjbWQsICZhYm9ydF9jb2RlLAotCQkJCSAmZXhjbHVzaXZlKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWlmIChjbWQgPT0gUlhSUENfQ01EX0FDQ0VQVCkgewotCQlpZiAocngtPnNrLnNrX3N0YXRlICE9IFJYUlBDX1NFUlZFUl9MSVNURU5JTkcpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJY2FsbCA9IHJ4cnBjX2FjY2VwdF9jYWxsKHJ4LCB1c2VyX2NhbGxfSUQpOwotCQlpZiAoSVNfRVJSKGNhbGwpKQotCQkJcmV0dXJuIFBUUl9FUlIoY2FsbCk7Ci0JCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQljYWxsID0gcnhycGNfZmluZF9jYWxsX2J5X3VzZXJfSUQocngsIHVzZXJfY2FsbF9JRCk7Ci0JaWYgKCFjYWxsKSB7Ci0JCWlmIChjbWQgIT0gUlhSUENfQ01EX1NFTkRfREFUQSkKLQkJCXJldHVybiAtRUJBRFNMVDsKLQkJY2FsbCA9IHJ4cnBjX25ld19jbGllbnRfY2FsbF9mb3Jfc2VuZG1zZyhyeCwgbXNnLCB1c2VyX2NhbGxfSUQsCi0JCQkJCQkJIGV4Y2x1c2l2ZSk7Ci0JCWlmIChJU19FUlIoY2FsbCkpCi0JCQlyZXR1cm4gUFRSX0VSUihjYWxsKTsKLQl9Ci0KLQlfZGVidWcoIkNBTEwgJWQgVVNSICVseCBTVCAlZCBvbiBDT05OICVwIiwKLQkgICAgICAgY2FsbC0+ZGVidWdfaWQsIGNhbGwtPnVzZXJfY2FsbF9JRCwgY2FsbC0+c3RhdGUsIGNhbGwtPmNvbm4pOwotCi0JaWYgKGNhbGwtPnN0YXRlID49IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKLQkJLyogaXQncyB0b28gbGF0ZSBmb3IgdGhpcyBjYWxsICovCi0JCXJldCA9IC1FQ09OTlJFU0VUOwotCX0gZWxzZSBpZiAoY21kID09IFJYUlBDX0NNRF9TRU5EX0FCT1JUKSB7Ci0JCXJ4cnBjX3NlbmRfYWJvcnQoY2FsbCwgYWJvcnRfY29kZSk7Ci0JCXJldCA9IDA7Ci0JfSBlbHNlIGlmIChjbWQgIT0gUlhSUENfQ01EX1NFTkRfREFUQSkgewotCQlyZXQgPSAtRUlOVkFMOwotCX0gZWxzZSBpZiAoIWNhbGwtPmluX2NsaWVudGZsYWcgJiYKLQkJICAgY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9DTElFTlRfU0VORF9SRVFVRVNUKSB7Ci0JCS8qIHJlcXVlc3QgcGhhc2UgY29tcGxldGUgZm9yIHRoaXMgY2xpZW50IGNhbGwgKi8KLQkJcmV0ID0gLUVQUk9UTzsKLQl9IGVsc2UgaWYgKGNhbGwtPmluX2NsaWVudGZsYWcgJiYKLQkJICAgY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9TRVJWRVJfQUNLX1JFUVVFU1QgJiYKLQkJICAgY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9TRVJWRVJfU0VORF9SRVBMWSkgewotCQkvKiBSZXBseSBwaGFzZSBub3QgYmVndW4gb3Igbm90IGNvbXBsZXRlIGZvciBzZXJ2aWNlIGNhbGwuICovCi0JCXJldCA9IC1FUFJPVE87Ci0JfSBlbHNlIHsKLQkJcmV0ID0gcnhycGNfc2VuZF9kYXRhKHJ4LCBjYWxsLCBtc2csIGxlbik7Ci0JfQotCi0JcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0JX2xlYXZlKCIgPSAlZCIsIHJldCk7CitvdXQ6CisJcnhycGNfcHV0X2Nvbm5lY3Rpb24oY29ubik7CisJa2ZyZWUocGt0KTsKIAlyZXR1cm4gcmV0OwogfQogCi0vKioKLSAqIHJ4cnBjX2tlcm5lbF9zZW5kX2RhdGEgLSBBbGxvdyBhIGtlcm5lbCBzZXJ2aWNlIHRvIHNlbmQgZGF0YSBvbiBhIGNhbGwKLSAqIEBjYWxsOiBUaGUgY2FsbCB0byBzZW5kIGRhdGEgdGhyb3VnaAotICogQG1zZzogVGhlIGRhdGEgdG8gc2VuZAotICogQGxlbjogVGhlIGFtb3VudCBvZiBkYXRhIHRvIHNlbmQKLSAqCi0gKiBBbGxvdyBhIGtlcm5lbCBzZXJ2aWNlIHRvIHNlbmQgZGF0YSBvbiBhIGNhbGwuICBUaGUgY2FsbCBtdXN0IGJlIGluIGFuIHN0YXRlCi0gKiBhcHByb3ByaWF0ZSB0byBzZW5kaW5nIGRhdGEuICBObyBjb250cm9sIGRhdGEgc2hvdWxkIGJlIHN1cHBsaWVkIGluIEBtc2csCi0gKiBub3Igc2hvdWxkIGFuIGFkZHJlc3MgYmUgc3VwcGxpZWQuICBNU0dfTU9SRSBzaG91bGQgYmUgZmxhZ2dlZCBpZiB0aGVyZSdzCi0gKiBtb3JlIGRhdGEgdG8gY29tZSwgb3RoZXJ3aXNlIHRoaXMgZGF0YSB3aWxsIGVuZCB0aGUgdHJhbnNtaXNzaW9uIHBoYXNlLgotICovCi1pbnQgcnhycGNfa2VybmVsX3NlbmRfZGF0YShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgc3RydWN0IG1zZ2hkciAqbXNnLAotCQkJICAgc2l6ZV90IGxlbikKLXsKLQlpbnQgcmV0OwotCi0JX2VudGVyKCJ7JWQsJXN9LCIsIGNhbGwtPmRlYnVnX2lkLCByeHJwY19jYWxsX3N0YXRlc1tjYWxsLT5zdGF0ZV0pOwotCi0JQVNTRVJUQ01QKG1zZy0+bXNnX25hbWUsID09LCBOVUxMKTsKLQlBU1NFUlRDTVAobXNnLT5tc2dfY29udHJvbCwgPT0sIE5VTEwpOwotCi0JbG9ja19zb2NrKCZjYWxsLT5zb2NrZXQtPnNrKTsKLQotCV9kZWJ1ZygiQ0FMTCAlZCBVU1IgJWx4IFNUICVkIG9uIENPTk4gJXAiLAotCSAgICAgICBjYWxsLT5kZWJ1Z19pZCwgY2FsbC0+dXNlcl9jYWxsX0lELCBjYWxsLT5zdGF0ZSwgY2FsbC0+Y29ubik7Ci0KLQlpZiAoY2FsbC0+c3RhdGUgPj0gUlhSUENfQ0FMTF9DT01QTEVURSkgewotCQlyZXQgPSAtRVNIVVRET1dOOyAvKiBpdCdzIHRvbyBsYXRlIGZvciB0aGlzIGNhbGwgKi8KLQl9IGVsc2UgaWYgKGNhbGwtPnN0YXRlICE9IFJYUlBDX0NBTExfQ0xJRU5UX1NFTkRfUkVRVUVTVCAmJgotCQkgICBjYWxsLT5zdGF0ZSAhPSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0tfUkVRVUVTVCAmJgotCQkgICBjYWxsLT5zdGF0ZSAhPSBSWFJQQ19DQUxMX1NFUlZFUl9TRU5EX1JFUExZKSB7Ci0JCXJldCA9IC1FUFJPVE87IC8qIHJlcXVlc3QgcGhhc2UgY29tcGxldGUgZm9yIHRoaXMgY2xpZW50IGNhbGwgKi8KLQl9IGVsc2UgewotCQlyZXQgPSByeHJwY19zZW5kX2RhdGEoY2FsbC0+c29ja2V0LCBjYWxsLCBtc2csIGxlbik7Ci0JfQotCi0JcmVsZWFzZV9zb2NrKCZjYWxsLT5zb2NrZXQtPnNrKTsKLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1FWFBPUlRfU1lNQk9MKHJ4cnBjX2tlcm5lbF9zZW5kX2RhdGEpOwotCi0vKioKLSAqIHJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsIC0gQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBhYm9ydCBhIGNhbGwKLSAqIEBjYWxsOiBUaGUgY2FsbCB0byBiZSBhYm9ydGVkCi0gKiBAYWJvcnRfY29kZTogVGhlIGFib3J0IGNvZGUgdG8gc3RpY2sgaW50byB0aGUgQUJPUlQgcGFja2V0Ci0gKgotICogQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBhYm9ydCBhIGNhbGwsIGlmIGl0J3Mgc3RpbGwgaW4gYW4gYWJvcnRhYmxlIHN0YXRlLgotICovCi12b2lkIHJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCB1MzIgYWJvcnRfY29kZSkKLXsKLQlfZW50ZXIoInslZH0sJWQiLCBjYWxsLT5kZWJ1Z19pZCwgYWJvcnRfY29kZSk7Ci0KLQlsb2NrX3NvY2soJmNhbGwtPnNvY2tldC0+c2spOwotCi0JX2RlYnVnKCJDQUxMICVkIFVTUiAlbHggU1QgJWQgb24gQ09OTiAlcCIsCi0JICAgICAgIGNhbGwtPmRlYnVnX2lkLCBjYWxsLT51c2VyX2NhbGxfSUQsIGNhbGwtPnN0YXRlLCBjYWxsLT5jb25uKTsKLQotCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfQ09NUExFVEUpCi0JCXJ4cnBjX3NlbmRfYWJvcnQoY2FsbCwgYWJvcnRfY29kZSk7Ci0KLQlyZWxlYXNlX3NvY2soJmNhbGwtPnNvY2tldC0+c2spOwotCV9sZWF2ZSgiIik7Ci19Ci0KLUVYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2Fib3J0X2NhbGwpOwotCiAvKgogICogc2VuZCBhIHBhY2tldCB0aHJvdWdoIHRoZSB0cmFuc3BvcnQgZW5kcG9pbnQKICAqLwotaW50IHJ4cnBjX3NlbmRfZGF0YV9wYWNrZXQoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sIHN0cnVjdCBza19idWZmICpza2IpCitpbnQgcnhycGNfc2VuZF9kYXRhX3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgIGJvb2wgcmV0cmFucykKIHsKLQlzdHJ1Y3Qga3ZlYyBpb3ZbMV07CisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4gPSBjYWxsLT5jb25uOworCXN0cnVjdCByeHJwY193aXJlX2hlYWRlciB3aGRyOworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKIAlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlzdHJ1Y3Qga3ZlYyBpb3ZbMl07CisJcnhycGNfc2VyaWFsX3Qgc2VyaWFsOworCXNpemVfdCBsZW47CisJYm9vbCBsb3N0ID0gZmFsc2U7CiAJaW50IHJldCwgb3B0OwogCiAJX2VudGVyKCIseyVkfSIsIHNrYi0+bGVuKTsKIAotCWlvdlswXS5pb3ZfYmFzZSA9IHNrYi0+aGVhZDsKLQlpb3ZbMF0uaW92X2xlbiA9IHNrYi0+bGVuOworCS8qIEVhY2ggdHJhbnNtaXNzaW9uIG9mIGEgVHggcGFja2V0IG5lZWRzIGEgbmV3IHNlcmlhbCBudW1iZXIgKi8KKwlzZXJpYWwgPSBhdG9taWNfaW5jX3JldHVybigmY29ubi0+c2VyaWFsKTsKIAotCW1zZy5tc2dfbmFtZSA9ICZjb25uLT5wYXJhbXMucGVlci0+c3J4LnRyYW5zcG9ydDsKLQltc2cubXNnX25hbWVsZW4gPSBjb25uLT5wYXJhbXMucGVlci0+c3J4LnRyYW5zcG9ydF9sZW47CisJd2hkci5lcG9jaAk9IGh0b25sKGNvbm4tPnByb3RvLmVwb2NoKTsKKwl3aGRyLmNpZAk9IGh0b25sKGNhbGwtPmNpZCk7CisJd2hkci5jYWxsTnVtYmVyCT0gaHRvbmwoY2FsbC0+Y2FsbF9pZCk7CisJd2hkci5zZXEJPSBodG9ubChzcC0+aGRyLnNlcSk7CisJd2hkci5zZXJpYWwJPSBodG9ubChzZXJpYWwpOworCXdoZHIudHlwZQk9IFJYUlBDX1BBQ0tFVF9UWVBFX0RBVEE7CisJd2hkci5mbGFncwk9IHNwLT5oZHIuZmxhZ3M7CisJd2hkci51c2VyU3RhdHVzCT0gMDsKKwl3aGRyLnNlY3VyaXR5SW5kZXggPSBjYWxsLT5zZWN1cml0eV9peDsKKwl3aGRyLl9yc3ZkCT0gaHRvbnMoc3AtPmhkci5fcnN2ZCk7CisJd2hkci5zZXJ2aWNlSWQJPSBodG9ucyhjYWxsLT5zZXJ2aWNlX2lkKTsKKworCWlvdlswXS5pb3ZfYmFzZSA9ICZ3aGRyOworCWlvdlswXS5pb3ZfbGVuID0gc2l6ZW9mKHdoZHIpOworCWlvdlsxXS5pb3ZfYmFzZSA9IHNrYi0+aGVhZDsKKwlpb3ZbMV0uaW92X2xlbiA9IHNrYi0+bGVuOworCWxlbiA9IGlvdlswXS5pb3ZfbGVuICsgaW92WzFdLmlvdl9sZW47CisKKwltc2cubXNnX25hbWUgPSAmY2FsbC0+cGVlci0+c3J4LnRyYW5zcG9ydDsKKwltc2cubXNnX25hbWVsZW4gPSBjYWxsLT5wZWVyLT5zcngudHJhbnNwb3J0X2xlbjsKIAltc2cubXNnX2NvbnRyb2wgPSBOVUxMOwogCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7CiAJbXNnLm1zZ19mbGFncyA9IDA7CiAKKwkvKiBJZiBvdXIgUlRUIGNhY2hlIG5lZWRzIHdvcmtpbmcgb24sIHJlcXVlc3QgYW4gQUNLLiAgQWxzbyByZXF1ZXN0CisJICogQUNLcyBpZiBhIERBVEEgcGFja2V0IGFwcGVhcnMgdG8gaGF2ZSBiZWVuIGxvc3QuCisJICovCisJaWYgKHJldHJhbnMgfHwKKwkgICAgY2FsbC0+Y29uZ19tb2RlID09IFJYUlBDX0NBTExfU0xPV19TVEFSVCB8fAorCSAgICAoY2FsbC0+cGVlci0+cnR0X3VzYWdlIDwgMyAmJiBzcC0+aGRyLnNlcSAmIDEpIHx8CisJICAgIGt0aW1lX2JlZm9yZShrdGltZV9hZGRfbXMoY2FsbC0+cGVlci0+cnR0X2xhc3RfcmVxLCAxMDAwKSwKKwkJCSBrdGltZV9nZXRfcmVhbCgpKSkKKwkJd2hkci5mbGFncyB8PSBSWFJQQ19SRVFVRVNUX0FDSzsKKworCWlmIChJU19FTkFCTEVEKENPTkZJR19BRl9SWFJQQ19JTkpFQ1RfTE9TUykpIHsKKwkJc3RhdGljIGludCBsb3NlOworCQlpZiAoKGxvc2UrKyAmIDcpID09IDcpIHsKKwkJCXJldCA9IDA7CisJCQlsb3N0ID0gdHJ1ZTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCV9wcm90bygiVHggREFUQSAlJSV1IHsgIyV1IH0iLCBzZXJpYWwsIHNwLT5oZHIuc2VxKTsKKwogCS8qIHNlbmQgdGhlIHBhY2tldCB3aXRoIHRoZSBkb24ndCBmcmFnbWVudCBiaXQgc2V0IGlmIHdlIGN1cnJlbnRseQogCSAqIHRoaW5rIGl0J3Mgc21hbGwgZW5vdWdoICovCi0JaWYgKHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCByeHJwY193aXJlX2hlYWRlcikgPCBjb25uLT5wYXJhbXMucGVlci0+bWF4ZGF0YSkgewotCQlkb3duX3JlYWQoJmNvbm4tPnBhcmFtcy5sb2NhbC0+ZGVmcmFnX3NlbSk7Ci0JCS8qIHNlbmQgdGhlIHBhY2tldCBieSBVRFAKLQkJICogLSByZXR1cm5zIC1FTVNHU0laRSBpZiBVRFAgd291bGQgaGF2ZSB0byBmcmFnbWVudCB0aGUgcGFja2V0Ci0JCSAqICAgdG8gZ28gb3V0IG9mIHRoZSBpbnRlcmZhY2UKLQkJICogICAtIGluIHdoaWNoIGNhc2UsIHdlJ2xsIGhhdmUgcHJvY2Vzc2VkIHRoZSBJQ01QIGVycm9yCi0JCSAqICAgICBtZXNzYWdlIGFuZCB1cGRhdGUgdGhlIHBlZXIgcmVjb3JkCi0JCSAqLwotCQlyZXQgPSBrZXJuZWxfc2VuZG1zZyhjb25uLT5wYXJhbXMubG9jYWwtPnNvY2tldCwgJm1zZywgaW92LCAxLAotCQkJCSAgICAgaW92WzBdLmlvdl9sZW4pOworCWlmIChpb3ZbMV0uaW92X2xlbiA+PSBjYWxsLT5wZWVyLT5tYXhkYXRhKQorCQlnb3RvIHNlbmRfZnJhZ21lbnRhYmxlOwogCi0JCXVwX3JlYWQoJmNvbm4tPnBhcmFtcy5sb2NhbC0+ZGVmcmFnX3NlbSk7Ci0JCWlmIChyZXQgPT0gLUVNU0dTSVpFKQotCQkJZ290byBzZW5kX2ZyYWdtZW50YWJsZTsKKwlkb3duX3JlYWQoJmNvbm4tPnBhcmFtcy5sb2NhbC0+ZGVmcmFnX3NlbSk7CisJLyogc2VuZCB0aGUgcGFja2V0IGJ5IFVEUAorCSAqIC0gcmV0dXJucyAtRU1TR1NJWkUgaWYgVURQIHdvdWxkIGhhdmUgdG8gZnJhZ21lbnQgdGhlIHBhY2tldAorCSAqICAgdG8gZ28gb3V0IG9mIHRoZSBpbnRlcmZhY2UKKwkgKiAgIC0gaW4gd2hpY2ggY2FzZSwgd2UnbGwgaGF2ZSBwcm9jZXNzZWQgdGhlIElDTVAgZXJyb3IKKwkgKiAgICAgbWVzc2FnZSBhbmQgdXBkYXRlIHRoZSBwZWVyIHJlY29yZAorCSAqLworCXJldCA9IGtlcm5lbF9zZW5kbXNnKGNvbm4tPnBhcmFtcy5sb2NhbC0+c29ja2V0LCAmbXNnLCBpb3YsIDIsIGxlbik7CiAKLQkJX2xlYXZlKCIgPSAlZCBbJXVdIiwgcmV0LCBjb25uLT5wYXJhbXMucGVlci0+bWF4ZGF0YSk7Ci0JCXJldHVybiByZXQ7CisJdXBfcmVhZCgmY29ubi0+cGFyYW1zLmxvY2FsLT5kZWZyYWdfc2VtKTsKKwlpZiAocmV0ID09IC1FTVNHU0laRSkKKwkJZ290byBzZW5kX2ZyYWdtZW50YWJsZTsKKworZG9uZToKKwl0cmFjZV9yeHJwY190eF9kYXRhKGNhbGwsIHNwLT5oZHIuc2VxLCBzZXJpYWwsIHdoZHIuZmxhZ3MsCisJCQkgICAgcmV0cmFucywgbG9zdCk7CisJaWYgKHJldCA+PSAwKSB7CisJCWt0aW1lX3Qgbm93ID0ga3RpbWVfZ2V0X3JlYWwoKTsKKwkJc2tiLT50c3RhbXAgPSBub3c7CisJCXNtcF93bWIoKTsKKwkJc3AtPmhkci5zZXJpYWwgPSBzZXJpYWw7CisJCWlmICh3aGRyLmZsYWdzICYgUlhSUENfUkVRVUVTVF9BQ0spIHsKKwkJCWNhbGwtPnBlZXItPnJ0dF9sYXN0X3JlcSA9IG5vdzsKKwkJCXRyYWNlX3J4cnBjX3J0dF90eChjYWxsLCByeHJwY19ydHRfdHhfZGF0YSwgc2VyaWFsKTsKKwkJfQogCX0KKwlfbGVhdmUoIiA9ICVkIFsldV0iLCByZXQsIGNhbGwtPnBlZXItPm1heGRhdGEpOworCXJldHVybiByZXQ7CiAKIHNlbmRfZnJhZ21lbnRhYmxlOgogCS8qIGF0dGVtcHQgdG8gc2VuZCB0aGlzIG1lc3NhZ2Ugd2l0aCBmcmFnbWVudGF0aW9uIGVuYWJsZWQgKi8KQEAgLTM1OCw4ICszNDgsOCBAQAogCQkJCQlTT0xfSVAsIElQX01UVV9ESVNDT1ZFUiwKIAkJCQkJKGNoYXIgKikmb3B0LCBzaXplb2Yob3B0KSk7CiAJCWlmIChyZXQgPT0gMCkgewotCQkJcmV0ID0ga2VybmVsX3NlbmRtc2coY29ubi0+cGFyYW1zLmxvY2FsLT5zb2NrZXQsICZtc2csIGlvdiwgMSwKLQkJCQkJICAgICBpb3ZbMF0uaW92X2xlbik7CisJCQlyZXQgPSBrZXJuZWxfc2VuZG1zZyhjb25uLT5wYXJhbXMubG9jYWwtPnNvY2tldCwgJm1zZywKKwkJCQkJICAgICBpb3YsIDIsIGxlbik7CiAKIAkJCW9wdCA9IElQX1BNVFVESVNDX0RPOwogCQkJa2VybmVsX3NldHNvY2tvcHQoY29ubi0+cGFyYW1zLmxvY2FsLT5zb2NrZXQsIFNPTF9JUCwKQEAgLTM2NywzNTUgKzM1Nyw4MiBAQAogCQkJCQkgIChjaGFyICopJm9wdCwgc2l6ZW9mKG9wdCkpOwogCQl9CiAJCWJyZWFrOworCisjaWZkZWYgQ09ORklHX0FGX1JYUlBDX0lQVjYKKwljYXNlIEFGX0lORVQ2OgorCQlvcHQgPSBJUFY2X1BNVFVESVNDX0RPTlQ7CisJCXJldCA9IGtlcm5lbF9zZXRzb2Nrb3B0KGNvbm4tPnBhcmFtcy5sb2NhbC0+c29ja2V0LAorCQkJCQlTT0xfSVBWNiwgSVBWNl9NVFVfRElTQ09WRVIsCisJCQkJCShjaGFyICopJm9wdCwgc2l6ZW9mKG9wdCkpOworCQlpZiAocmV0ID09IDApIHsKKwkJCXJldCA9IGtlcm5lbF9zZW5kbXNnKGNvbm4tPnBhcmFtcy5sb2NhbC0+c29ja2V0LCAmbXNnLAorCQkJCQkgICAgIGlvdiwgMSwgaW92WzBdLmlvdl9sZW4pOworCisJCQlvcHQgPSBJUFY2X1BNVFVESVNDX0RPOworCQkJa2VybmVsX3NldHNvY2tvcHQoY29ubi0+cGFyYW1zLmxvY2FsLT5zb2NrZXQsCisJCQkJCSAgU09MX0lQVjYsIElQVjZfTVRVX0RJU0NPVkVSLAorCQkJCQkgIChjaGFyICopJm9wdCwgc2l6ZW9mKG9wdCkpOworCQl9CisJCWJyZWFrOworI2VuZGlmCiAJfQogCiAJdXBfd3JpdGUoJmNvbm4tPnBhcmFtcy5sb2NhbC0+ZGVmcmFnX3NlbSk7Ci0JX2xlYXZlKCIgPSAlZCBbZnJhZyAldV0iLCByZXQsIGNvbm4tPnBhcmFtcy5wZWVyLT5tYXhkYXRhKTsKLQlyZXR1cm4gcmV0OworCWdvdG8gZG9uZTsKIH0KIAogLyoKLSAqIHdhaXQgZm9yIHNwYWNlIHRvIGFwcGVhciBpbiB0aGUgdHJhbnNtaXQvQUNLIHdpbmRvdwotICogLSBjYWxsZXIgaG9sZHMgdGhlIHNvY2tldCBsb2NrZWQKKyAqIHJlamVjdCBwYWNrZXRzIHRocm91Z2ggdGhlIGxvY2FsIGVuZHBvaW50CiAgKi8KLXN0YXRpYyBpbnQgcnhycGNfd2FpdF9mb3JfdHhfd2luZG93KHN0cnVjdCByeHJwY19zb2NrICpyeCwKLQkJCQkgICAgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCi0JCQkJICAgIGxvbmcgKnRpbWVvKQordm9pZCByeHJwY19yZWplY3RfcGFja2V0cyhzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsKQogewotCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7Ci0JaW50IHJldDsKKwlzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgc3J4OworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CisJc3RydWN0IHJ4cnBjX3dpcmVfaGVhZGVyIHdoZHI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlzdHJ1Y3Qga3ZlYyBpb3ZbMl07CisJc2l6ZV90IHNpemU7CisJX19iZTMyIGNvZGU7CiAKLQlfZW50ZXIoIix7JWR9LCVsZCIsCi0JICAgICAgIENJUkNfU1BBQ0UoY2FsbC0+YWNrc19oZWFkLCBBQ0NFU1NfT05DRShjYWxsLT5hY2tzX3RhaWwpLAotCQkJICBjYWxsLT5hY2tzX3dpbnN6KSwKLQkgICAgICAgKnRpbWVvKTsKKwlfZW50ZXIoIiVkIiwgbG9jYWwtPmRlYnVnX2lkKTsKIAotCWFkZF93YWl0X3F1ZXVlKCZjYWxsLT50eF93YWl0cSwgJm15c2VsZik7CisJaW92WzBdLmlvdl9iYXNlID0gJndoZHI7CisJaW92WzBdLmlvdl9sZW4gPSBzaXplb2Yod2hkcik7CisJaW92WzFdLmlvdl9iYXNlID0gJmNvZGU7CisJaW92WzFdLmlvdl9sZW4gPSBzaXplb2YoY29kZSk7CisJc2l6ZSA9IHNpemVvZih3aGRyKSArIHNpemVvZihjb2RlKTsKIAotCWZvciAoOzspIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJcmV0ID0gMDsKLQkJaWYgKENJUkNfU1BBQ0UoY2FsbC0+YWNrc19oZWFkLCBBQ0NFU1NfT05DRShjYWxsLT5hY2tzX3RhaWwpLAotCQkJICAgICAgIGNhbGwtPmFja3Nfd2luc3opID4gMCkKLQkJCWJyZWFrOwotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCXJldCA9IHNvY2tfaW50cl9lcnJubygqdGltZW8pOwotCQkJYnJlYWs7CisJbXNnLm1zZ19uYW1lID0gJnNyeC50cmFuc3BvcnQ7CisJbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCW1zZy5tc2dfZmxhZ3MgPSAwOworCisJbWVtc2V0KCZ3aGRyLCAwLCBzaXplb2Yod2hkcikpOworCXdoZHIudHlwZSA9IFJYUlBDX1BBQ0tFVF9UWVBFX0FCT1JUOworCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmbG9jYWwtPnJlamVjdF9xdWV1ZSkpKSB7CisJCXJ4cnBjX3NlZV9za2Ioc2tiLCByeHJwY19za2Jfcnhfc2Vlbik7CisJCXNwID0gcnhycGNfc2tiKHNrYik7CisKKwkJaWYgKHJ4cnBjX2V4dHJhY3RfYWRkcl9mcm9tX3NrYigmc3J4LCBza2IpID09IDApIHsKKwkJCW1zZy5tc2dfbmFtZWxlbiA9IHNyeC50cmFuc3BvcnRfbGVuOworCisJCQljb2RlID0gaHRvbmwoc2tiLT5wcmlvcml0eSk7CisKKwkJCXdoZHIuZXBvY2gJPSBodG9ubChzcC0+aGRyLmVwb2NoKTsKKwkJCXdoZHIuY2lkCT0gaHRvbmwoc3AtPmhkci5jaWQpOworCQkJd2hkci5jYWxsTnVtYmVyCT0gaHRvbmwoc3AtPmhkci5jYWxsTnVtYmVyKTsKKwkJCXdoZHIuc2VydmljZUlkCT0gaHRvbnMoc3AtPmhkci5zZXJ2aWNlSWQpOworCQkJd2hkci5mbGFncwk9IHNwLT5oZHIuZmxhZ3M7CisJCQl3aGRyLmZsYWdzCV49IFJYUlBDX0NMSUVOVF9JTklUSUFURUQ7CisJCQl3aGRyLmZsYWdzCSY9IFJYUlBDX0NMSUVOVF9JTklUSUFURUQ7CisKKwkJCWtlcm5lbF9zZW5kbXNnKGxvY2FsLT5zb2NrZXQsICZtc2csIGlvdiwgMiwgc2l6ZSk7CiAJCX0KIAotCQlyZWxlYXNlX3NvY2soJnJ4LT5zayk7Ci0JCSp0aW1lbyA9IHNjaGVkdWxlX3RpbWVvdXQoKnRpbWVvKTsKLQkJbG9ja19zb2NrKCZyeC0+c2spOwotCX0KLQotCXJlbW92ZV93YWl0X3F1ZXVlKCZjYWxsLT50eF93YWl0cSwgJm15c2VsZik7Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogYXR0ZW1wdCB0byBzY2hlZHVsZSBhbiBpbnN0YW50IFR4IHJlc2VuZAotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcnhycGNfaW5zdGFudF9yZXNlbmQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCi17Ci0JcmVhZF9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQlpZiAodHJ5X3RvX2RlbF90aW1lcl9zeW5jKCZjYWxsLT5yZXNlbmRfdGltZXIpID49IDApIHsKLQkJY2xlYXJfYml0KFJYUlBDX0NBTExfUlVOX1JUSU1FUiwgJmNhbGwtPmZsYWdzKTsKLQkJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSAmJgotCQkgICAgIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FVl9SRVNFTkRfVElNRVIsICZjYWxsLT5ldmVudHMpKQotCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQl9Ci0JcmVhZF91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotfQotCi0vKgotICogcXVldWUgYSBwYWNrZXQgZm9yIHRyYW5zbWlzc2lvbiwgc2V0IHRoZSByZXNlbmQgdGltZXIgYW5kIGF0dGVtcHQKLSAqIHRvIHNlbmQgdGhlIHBhY2tldCBpbW1lZGlhdGVseQotICovCi1zdGF0aWMgdm9pZCByeHJwY19xdWV1ZV9wYWNrZXQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgICAgYm9vbCBsYXN0KQotewotCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKLQlpbnQgcmV0OwotCi0JX25ldCgicXVldWUgc2tiICVwIFslZF0iLCBza2IsIGNhbGwtPmFja3NfaGVhZCk7Ci0KLQlBU1NFUlQoY2FsbC0+YWNrc193aW5kb3cgIT0gTlVMTCk7Ci0JY2FsbC0+YWNrc193aW5kb3dbY2FsbC0+YWNrc19oZWFkXSA9ICh1bnNpZ25lZCBsb25nKSBza2I7Ci0Jc21wX3dtYigpOwotCWNhbGwtPmFja3NfaGVhZCA9IChjYWxsLT5hY2tzX2hlYWQgKyAxKSAmIChjYWxsLT5hY2tzX3dpbnN6IC0gMSk7Ci0KLQlpZiAobGFzdCB8fCBjYWxsLT5zdGF0ZSA9PSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0tfUkVRVUVTVCkgewotCQlfZGVidWcoIl9fX19fX19fYXdhaXRpbmcgcmVwbHkvQUNLX19fX19fX19fXyIpOwotCQl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQkJc3dpdGNoIChjYWxsLT5zdGF0ZSkgewotCQljYXNlIFJYUlBDX0NBTExfQ0xJRU5UX1NFTkRfUkVRVUVTVDoKLQkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9DTElFTlRfQVdBSVRfUkVQTFk7Ci0JCQlicmVhazsKLQkJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0tfUkVRVUVTVDoKLQkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9TRVJWRVJfU0VORF9SRVBMWTsKLQkJCWlmICghbGFzdCkKLQkJCQlicmVhazsKLQkJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9TRU5EX1JFUExZOgotCQkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX1NFUlZFUl9BV0FJVF9BQ0s7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JfQotCi0JX3Byb3RvKCJUeCBEQVRBICUlJXUgeyAjJXUgfSIsIHNwLT5oZHIuc2VyaWFsLCBzcC0+aGRyLnNlcSk7Ci0KLQlzcC0+bmVlZF9yZXNlbmQgPSBmYWxzZTsKLQlzcC0+cmVzZW5kX2F0ID0gamlmZmllcyArIHJ4cnBjX3Jlc2VuZF90aW1lb3V0OwotCWlmICghdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX1JVTl9SVElNRVIsICZjYWxsLT5mbGFncykpIHsKLQkJX2RlYnVnKCJydW4gdGltZXIiKTsKLQkJY2FsbC0+cmVzZW5kX3RpbWVyLmV4cGlyZXMgPSBzcC0+cmVzZW5kX2F0OwotCQlhZGRfdGltZXIoJmNhbGwtPnJlc2VuZF90aW1lcik7Ci0JfQotCi0JLyogYXR0ZW1wdCB0byBjYW5jZWwgdGhlIHJ4LUFDSyB0aW1lciwgZGVmZXJyaW5nIHJlcGx5IHRyYW5zbWlzc2lvbiBpZgotCSAqIHdlJ3JlIEFDSydpbmcgdGhlIHJlcXVlc3QgcGhhc2Ugb2YgYW4gaW5jb21pbmcgY2FsbCAqLwotCXJldCA9IC1FQUdBSU47Ci0JaWYgKHRyeV90b19kZWxfdGltZXJfc3luYygmY2FsbC0+YWNrX3RpbWVyKSA+PSAwKSB7Ci0JCS8qIHRoZSBwYWNrZXQgbWF5IGJlIGZyZWVkIGJ5IHJ4cnBjX3Byb2Nlc3NfY2FsbCgpIGJlZm9yZSB0aGlzCi0JCSAqIHJldHVybnMgKi8KLQkJcmV0ID0gcnhycGNfc2VuZF9kYXRhX3BhY2tldChjYWxsLT5jb25uLCBza2IpOwotCQlfbmV0KCJzZW50IHNrYiAlcCIsIHNrYik7Ci0JfSBlbHNlIHsKLQkJX2RlYnVnKCJmYWlsZWQgdG8gZGVsZXRlIEFDSyB0aW1lciIpOwotCX0KLQotCWlmIChyZXQgPCAwKSB7Ci0JCV9kZWJ1ZygibmVlZCBpbnN0YW50IHJlc2VuZCAlZCIsIHJldCk7Ci0JCXNwLT5uZWVkX3Jlc2VuZCA9IHRydWU7Ci0JCXJ4cnBjX2luc3RhbnRfcmVzZW5kKGNhbGwpOworCQlyeHJwY19mcmVlX3NrYihza2IsIHJ4cnBjX3NrYl9yeF9mcmVlZCk7CiAJfQogCiAJX2xlYXZlKCIiKTsKIH0KLQotLyoKLSAqIENvbnZlcnQgYSBob3N0LWVuZGlhbiBoZWFkZXIgaW50byBhIG5ldHdvcmstZW5kaWFuIGhlYWRlci4KLSAqLwotc3RhdGljIHZvaWQgcnhycGNfaW5zZXJ0X2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCByeHJwY193aXJlX2hlYWRlciB3aGRyOwotCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKLQotCXdoZHIuZXBvY2gJPSBodG9ubChzcC0+aGRyLmVwb2NoKTsKLQl3aGRyLmNpZAk9IGh0b25sKHNwLT5oZHIuY2lkKTsKLQl3aGRyLmNhbGxOdW1iZXIJPSBodG9ubChzcC0+aGRyLmNhbGxOdW1iZXIpOwotCXdoZHIuc2VxCT0gaHRvbmwoc3AtPmhkci5zZXEpOwotCXdoZHIuc2VyaWFsCT0gaHRvbmwoc3AtPmhkci5zZXJpYWwpOwotCXdoZHIudHlwZQk9IHNwLT5oZHIudHlwZTsKLQl3aGRyLmZsYWdzCT0gc3AtPmhkci5mbGFnczsKLQl3aGRyLnVzZXJTdGF0dXMJPSBzcC0+aGRyLnVzZXJTdGF0dXM7Ci0Jd2hkci5zZWN1cml0eUluZGV4ID0gc3AtPmhkci5zZWN1cml0eUluZGV4OwotCXdoZHIuX3JzdmQJPSBodG9ucyhzcC0+aGRyLl9yc3ZkKTsKLQl3aGRyLnNlcnZpY2VJZAk9IGh0b25zKHNwLT5oZHIuc2VydmljZUlkKTsKLQotCW1lbWNweShza2ItPmhlYWQsICZ3aGRyLCBzaXplb2Yod2hkcikpOwotfQotCi0vKgotICogc2VuZCBkYXRhIHRocm91Z2ggYSBzb2NrZXQKLSAqIC0gbXVzdCBiZSBjYWxsZWQgaW4gcHJvY2VzcyBjb250ZXh0Ci0gKiAtIGNhbGxlciBob2xkcyB0aGUgc29ja2V0IGxvY2tlZAotICovCi1zdGF0aWMgaW50IHJ4cnBjX3NlbmRfZGF0YShzdHJ1Y3QgcnhycGNfc29jayAqcngsCi0JCQkgICBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCSAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IHNvY2sgKnNrID0gJnJ4LT5zazsKLQlsb25nIHRpbWVvOwotCWJvb2wgbW9yZTsKLQlpbnQgcmV0LCBjb3BpZWQ7Ci0KLQl0aW1lbyA9IHNvY2tfc25kdGltZW8oc2ssIG1zZy0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlUKTsKLQotCS8qIHRoaXMgc2hvdWxkIGJlIGluIHBvbGwgKi8KLQlza19jbGVhcl9iaXQoU09DS1dRX0FTWU5DX05PU1BBQ0UsIHNrKTsKLQotCWlmIChzay0+c2tfZXJyIHx8IChzay0+c2tfc2h1dGRvd24gJiBTRU5EX1NIVVRET1dOKSkKLQkJcmV0dXJuIC1FUElQRTsKLQotCW1vcmUgPSBtc2ctPm1zZ19mbGFncyAmIE1TR19NT1JFOwotCi0Jc2tiID0gY2FsbC0+dHhfcGVuZGluZzsKLQljYWxsLT50eF9wZW5kaW5nID0gTlVMTDsKLQotCWNvcGllZCA9IDA7Ci0JZG8gewotCQlpZiAoIXNrYikgewotCQkJc2l6ZV90IHNpemUsIGNodW5rLCBtYXgsIHNwYWNlOwotCi0JCQlfZGVidWcoImFsbG9jIik7Ci0KLQkJCWlmIChDSVJDX1NQQUNFKGNhbGwtPmFja3NfaGVhZCwKLQkJCQkgICAgICAgQUNDRVNTX09OQ0UoY2FsbC0+YWNrc190YWlsKSwKLQkJCQkgICAgICAgY2FsbC0+YWNrc193aW5zeikgPD0gMCkgewotCQkJCXJldCA9IC1FQUdBSU47Ci0JCQkJaWYgKG1zZy0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlUKQotCQkJCQlnb3RvIG1heWJlX2Vycm9yOwotCQkJCXJldCA9IHJ4cnBjX3dhaXRfZm9yX3R4X3dpbmRvdyhyeCwgY2FsbCwKLQkJCQkJCQkgICAgICAgJnRpbWVvKTsKLQkJCQlpZiAocmV0IDwgMCkKLQkJCQkJZ290byBtYXliZV9lcnJvcjsKLQkJCX0KLQotCQkJbWF4ID0gY2FsbC0+Y29ubi0+cGFyYW1zLnBlZXItPm1heGRhdGE7Ci0JCQltYXggLT0gY2FsbC0+Y29ubi0+c2VjdXJpdHlfc2l6ZTsKLQkJCW1heCAmPSB+KGNhbGwtPmNvbm4tPnNpemVfYWxpZ24gLSAxVUwpOwotCi0JCQljaHVuayA9IG1heDsKLQkJCWlmIChjaHVuayA+IG1zZ19kYXRhX2xlZnQobXNnKSAmJiAhbW9yZSkKLQkJCQljaHVuayA9IG1zZ19kYXRhX2xlZnQobXNnKTsKLQotCQkJc3BhY2UgPSBjaHVuayArIGNhbGwtPmNvbm4tPnNpemVfYWxpZ247Ci0JCQlzcGFjZSAmPSB+KGNhbGwtPmNvbm4tPnNpemVfYWxpZ24gLSAxVUwpOwotCi0JCQlzaXplID0gc3BhY2UgKyBjYWxsLT5jb25uLT5oZWFkZXJfc2l6ZTsKLQotCQkJX2RlYnVnKCJTSVpFOiAlenUvJXp1LyV6dSIsIGNodW5rLCBzcGFjZSwgc2l6ZSk7Ci0KLQkJCS8qIGNyZWF0ZSBhIGJ1ZmZlciB0aGF0IHdlIGNhbiByZXRhaW4gdW50aWwgaXQncyBBQ0snZCAqLwotCQkJc2tiID0gc29ja19hbGxvY19zZW5kX3NrYigKLQkJCQlzaywgc2l6ZSwgbXNnLT5tc2dfZmxhZ3MgJiBNU0dfRE9OVFdBSVQsICZyZXQpOwotCQkJaWYgKCFza2IpCi0JCQkJZ290byBtYXliZV9lcnJvcjsKLQotCQkJcnhycGNfbmV3X3NrYihza2IpOwotCi0JCQlfZGVidWcoIkFMTE9DIFNFTkQgJXAiLCBza2IpOwotCi0JCQlBU1NFUlRDTVAoc2tiLT5tYXJrLCA9PSwgMCk7Ci0KLQkJCV9kZWJ1ZygiSFM6ICV1IiwgY2FsbC0+Y29ubi0+aGVhZGVyX3NpemUpOwotCQkJc2tiX3Jlc2VydmUoc2tiLCBjYWxsLT5jb25uLT5oZWFkZXJfc2l6ZSk7Ci0JCQlza2ItPmxlbiArPSBjYWxsLT5jb25uLT5oZWFkZXJfc2l6ZTsKLQotCQkJc3AgPSByeHJwY19za2Ioc2tiKTsKLQkJCXNwLT5yZW1haW4gPSBjaHVuazsKLQkJCWlmIChzcC0+cmVtYWluID4gc2tiX3RhaWxyb29tKHNrYikpCi0JCQkJc3AtPnJlbWFpbiA9IHNrYl90YWlscm9vbShza2IpOwotCi0JCQlfbmV0KCJza2I6IGhyICVkLCB0ciAlZCwgaGwgJWQsIHJtICVkIiwKLQkJCSAgICAgICBza2JfaGVhZHJvb20oc2tiKSwKLQkJCSAgICAgICBza2JfdGFpbHJvb20oc2tiKSwKLQkJCSAgICAgICBza2JfaGVhZGxlbihza2IpLAotCQkJICAgICAgIHNwLT5yZW1haW4pOwotCi0JCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwotCQl9Ci0KLQkJX2RlYnVnKCJhcHBlbmQiKTsKLQkJc3AgPSByeHJwY19za2Ioc2tiKTsKLQotCQkvKiBhcHBlbmQgbmV4dCBzZWdtZW50IG9mIGRhdGEgdG8gdGhlIGN1cnJlbnQgYnVmZmVyICovCi0JCWlmIChtc2dfZGF0YV9sZWZ0KG1zZykgPiAwKSB7Ci0JCQlpbnQgY29weSA9IHNrYl90YWlscm9vbShza2IpOwotCQkJQVNTRVJUQ01QKGNvcHksID4sIDApOwotCQkJaWYgKGNvcHkgPiBtc2dfZGF0YV9sZWZ0KG1zZykpCi0JCQkJY29weSA9IG1zZ19kYXRhX2xlZnQobXNnKTsKLQkJCWlmIChjb3B5ID4gc3AtPnJlbWFpbikKLQkJCQljb3B5ID0gc3AtPnJlbWFpbjsKLQotCQkJX2RlYnVnKCJhZGQiKTsKLQkJCXJldCA9IHNrYl9hZGRfZGF0YShza2IsICZtc2ctPm1zZ19pdGVyLCBjb3B5KTsKLQkJCV9kZWJ1ZygiYWRkZWQiKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCWdvdG8gZWZhdWx0OwotCQkJc3AtPnJlbWFpbiAtPSBjb3B5OwotCQkJc2tiLT5tYXJrICs9IGNvcHk7Ci0JCQljb3BpZWQgKz0gY29weTsKLQkJfQotCi0JCS8qIGNoZWNrIGZvciB0aGUgZmFyIHNpZGUgYWJvcnRpbmcgdGhlIGNhbGwgb3IgYSBuZXR3b3JrIGVycm9yCi0JCSAqIG9jY3VycmluZyAqLwotCQlpZiAoY2FsbC0+c3RhdGUgPiBSWFJQQ19DQUxMX0NPTVBMRVRFKQotCQkJZ290byBjYWxsX2Fib3J0ZWQ7Ci0KLQkJLyogYWRkIHRoZSBwYWNrZXQgdG8gdGhlIHNlbmQgcXVldWUgaWYgaXQncyBub3cgZnVsbCAqLwotCQlpZiAoc3AtPnJlbWFpbiA8PSAwIHx8Ci0JCSAgICAobXNnX2RhdGFfbGVmdChtc2cpID09IDAgJiYgIW1vcmUpKSB7Ci0JCQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiA9IGNhbGwtPmNvbm47Ci0JCQl1aW50MzJfdCBzZXE7Ci0JCQlzaXplX3QgcGFkOwotCi0JCQkvKiBwYWQgb3V0IGlmIHdlJ3JlIHVzaW5nIHNlY3VyaXR5ICovCi0JCQlpZiAoY29ubi0+c2VjdXJpdHlfaXgpIHsKLQkJCQlwYWQgPSBjb25uLT5zZWN1cml0eV9zaXplICsgc2tiLT5tYXJrOwotCQkJCXBhZCA9IGNvbm4tPnNpemVfYWxpZ24gLSBwYWQ7Ci0JCQkJcGFkICY9IGNvbm4tPnNpemVfYWxpZ24gLSAxOwotCQkJCV9kZWJ1ZygicGFkICV6dSIsIHBhZCk7Ci0JCQkJaWYgKHBhZCkKLQkJCQkJbWVtc2V0KHNrYl9wdXQoc2tiLCBwYWQpLCAwLCBwYWQpOwotCQkJfQotCi0JCQlzZXEgPSBhdG9taWNfaW5jX3JldHVybigmY2FsbC0+c2VxdWVuY2UpOwotCi0JCQlzcC0+aGRyLmVwb2NoCT0gY29ubi0+cHJvdG8uZXBvY2g7Ci0JCQlzcC0+aGRyLmNpZAk9IGNhbGwtPmNpZDsKLQkJCXNwLT5oZHIuY2FsbE51bWJlciA9IGNhbGwtPmNhbGxfaWQ7Ci0JCQlzcC0+aGRyLnNlcQk9IHNlcTsKLQkJCXNwLT5oZHIuc2VyaWFsCT0gYXRvbWljX2luY19yZXR1cm4oJmNvbm4tPnNlcmlhbCk7Ci0JCQlzcC0+aGRyLnR5cGUJPSBSWFJQQ19QQUNLRVRfVFlQRV9EQVRBOwotCQkJc3AtPmhkci51c2VyU3RhdHVzID0gMDsKLQkJCXNwLT5oZHIuc2VjdXJpdHlJbmRleCA9IGNvbm4tPnNlY3VyaXR5X2l4OwotCQkJc3AtPmhkci5fcnN2ZAk9IDA7Ci0JCQlzcC0+aGRyLnNlcnZpY2VJZCA9IGNhbGwtPnNlcnZpY2VfaWQ7Ci0KLQkJCXNwLT5oZHIuZmxhZ3MgPSBjb25uLT5vdXRfY2xpZW50ZmxhZzsKLQkJCWlmIChtc2dfZGF0YV9sZWZ0KG1zZykgPT0gMCAmJiAhbW9yZSkKLQkJCQlzcC0+aGRyLmZsYWdzIHw9IFJYUlBDX0xBU1RfUEFDS0VUOwotCQkJZWxzZSBpZiAoQ0lSQ19TUEFDRShjYWxsLT5hY2tzX2hlYWQsCi0JCQkJCSAgICBBQ0NFU1NfT05DRShjYWxsLT5hY2tzX3RhaWwpLAotCQkJCQkgICAgY2FsbC0+YWNrc193aW5zeikgPiAxKQotCQkJCXNwLT5oZHIuZmxhZ3MgfD0gUlhSUENfTU9SRV9QQUNLRVRTOwotCQkJaWYgKG1vcmUgJiYgc2VxICYgMSkKLQkJCQlzcC0+aGRyLmZsYWdzIHw9IFJYUlBDX1JFUVVFU1RfQUNLOwotCi0JCQlyZXQgPSBjb25uLT5zZWN1cml0eS0+c2VjdXJlX3BhY2tldCgKLQkJCQljYWxsLCBza2IsIHNrYi0+bWFyaywKLQkJCQlza2ItPmhlYWQgKyBzaXplb2Yoc3RydWN0IHJ4cnBjX3dpcmVfaGVhZGVyKSk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlnb3RvIG91dDsKLQotCQkJcnhycGNfaW5zZXJ0X2hlYWRlcihza2IpOwotCQkJcnhycGNfcXVldWVfcGFja2V0KGNhbGwsIHNrYiwgIW1zZ19kYXRhX2xlZnQobXNnKSAmJiAhbW9yZSk7Ci0JCQlza2IgPSBOVUxMOwotCQl9Ci0JfSB3aGlsZSAobXNnX2RhdGFfbGVmdChtc2cpID4gMCk7Ci0KLXN1Y2Nlc3M6Ci0JcmV0ID0gY29waWVkOwotb3V0OgotCWNhbGwtPnR4X3BlbmRpbmcgPSBza2I7Ci0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLQotY2FsbF9hYm9ydGVkOgotCXJ4cnBjX2ZyZWVfc2tiKHNrYik7Ci0JaWYgKGNhbGwtPnN0YXRlID09IFJYUlBDX0NBTExfTkVUV09SS19FUlJPUikKLQkJcmV0ID0gY2FsbC0+ZXJyb3JfcmVwb3J0IDwgUlhSUENfTE9DQUxfRVJST1JfT0ZGU0VUID8KLQkJCWNhbGwtPmVycm9yX3JlcG9ydCA6Ci0JCQljYWxsLT5lcnJvcl9yZXBvcnQgLSBSWFJQQ19MT0NBTF9FUlJPUl9PRkZTRVQ7Ci0JZWxzZQotCQlyZXQgPSAtRUNPTk5BQk9SVEVEOwotCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci0KLW1heWJlX2Vycm9yOgotCWlmIChjb3BpZWQpCi0JCWdvdG8gc3VjY2VzczsKLQlnb3RvIG91dDsKLQotZWZhdWx0OgotCXJldCA9IC1FRkFVTFQ7Ci0JZ290byBvdXQ7Ci19CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvcGVlcl9ldmVudC5jIGIvbmV0L3J4cnBjL3BlZXJfZXZlbnQuYwppbmRleCA4OTQwNjc0Li5iZjEzYjg0IDEwMDY0NAotLS0gYS9uZXQvcnhycGMvcGVlcl9ldmVudC5jCisrKyBiL25ldC9yeHJwYy9wZWVyX2V2ZW50LmMKQEAgLTY2LDYgKzY2LDMyIEBACiAJCX0KIAkJYnJlYWs7CiAKKyNpZmRlZiBDT05GSUdfQUZfUlhSUENfSVBWNgorCWNhc2UgQUZfSU5FVDY6CisJCXNyeC50cmFuc3BvcnQuc2luNi5zaW42X3BvcnQgPSBzZXJyLT5wb3J0OworCQlzcngudHJhbnNwb3J0X2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKwkJc3dpdGNoIChzZXJyLT5lZS5lZV9vcmlnaW4pIHsKKwkJY2FzZSBTT19FRV9PUklHSU5fSUNNUDY6CisJCQlfbmV0KCJSeCBJQ01QNiIpOworCQkJbWVtY3B5KCZzcngudHJhbnNwb3J0LnNpbjYuc2luNl9hZGRyLAorCQkJICAgICAgIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpICsgc2Vyci0+YWRkcl9vZmZzZXQsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQkJYnJlYWs7CisJCWNhc2UgU09fRUVfT1JJR0lOX0lDTVA6CisJCQlfbmV0KCJSeCBJQ01QIG9uIHY2IHNvY2siKTsKKwkJCW1lbWNweShzcngudHJhbnNwb3J0LnNpbjYuc2luNl9hZGRyLnM2X2FkZHIgKyAxMiwKKwkJCSAgICAgICBza2JfbmV0d29ya19oZWFkZXIoc2tiKSArIHNlcnItPmFkZHJfb2Zmc2V0LAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQltZW1jcHkoJnNyeC50cmFuc3BvcnQuc2luNi5zaW42X2FkZHIsCisJCQkgICAgICAgJmlwdjZfaGRyKHNrYiktPnNhZGRyLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworI2VuZGlmCisKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC0xMjksMjIgKzE1NSwyMSBAQAogCQlfbGVhdmUoIlVEUCBzb2NrZXQgZXJycXVldWUgZW1wdHkiKTsKIAkJcmV0dXJuOwogCX0KKwlyeHJwY19uZXdfc2tiKHNrYiwgcnhycGNfc2tiX3J4X3JlY2VpdmVkKTsKIAlzZXJyID0gU0tCX0VYVF9FUlIoc2tiKTsKIAlpZiAoIXNrYi0+bGVuICYmIHNlcnItPmVlLmVlX29yaWdpbiA9PSBTT19FRV9PUklHSU5fVElNRVNUQU1QSU5HKSB7CiAJCV9sZWF2ZSgiVURQIGVtcHR5IG1lc3NhZ2UiKTsKLQkJa2ZyZWVfc2tiKHNrYik7CisJCXJ4cnBjX2ZyZWVfc2tiKHNrYiwgcnhycGNfc2tiX3J4X2ZyZWVkKTsKIAkJcmV0dXJuOwogCX0KIAotCXJ4cnBjX25ld19za2Ioc2tiKTsKLQogCXJjdV9yZWFkX2xvY2soKTsKIAlwZWVyID0gcnhycGNfbG9va3VwX3BlZXJfaWNtcF9yY3UobG9jYWwsIHNrYik7CiAJaWYgKHBlZXIgJiYgIXJ4cnBjX2dldF9wZWVyX21heWJlKHBlZXIpKQogCQlwZWVyID0gTlVMTDsKIAlpZiAoIXBlZXIpIHsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCXJ4cnBjX2ZyZWVfc2tiKHNrYik7CisJCXJ4cnBjX2ZyZWVfc2tiKHNrYiwgcnhycGNfc2tiX3J4X2ZyZWVkKTsKIAkJX2xlYXZlKCIgW25vIHBlZXJdIik7CiAJCXJldHVybjsKIAl9CkBAIC0xNTQsNyArMTc5LDcgQEAKIAkgICAgIHNlcnItPmVlLmVlX2NvZGUgPT0gSUNNUF9GUkFHX05FRURFRCkpIHsKIAkJcnhycGNfYWRqdXN0X210dShwZWVyLCBzZXJyKTsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCXJ4cnBjX2ZyZWVfc2tiKHNrYik7CisJCXJ4cnBjX2ZyZWVfc2tiKHNrYiwgcnhycGNfc2tiX3J4X2ZyZWVkKTsKIAkJcnhycGNfcHV0X3BlZXIocGVlcik7CiAJCV9sZWF2ZSgiIFtNVFUgdXBkYXRlXSIpOwogCQlyZXR1cm47CkBAIC0xNjIsNyArMTg3LDcgQEAKIAogCXJ4cnBjX3N0b3JlX2Vycm9yKHBlZXIsIHNlcnIpOwogCXJjdV9yZWFkX3VubG9jaygpOwotCXJ4cnBjX2ZyZWVfc2tiKHNrYik7CisJcnhycGNfZnJlZV9za2Ioc2tiLCByeHJwY19za2JfcnhfZnJlZWQpOwogCiAJLyogVGhlIHJlZiB3ZSBvYnRhaW5lZCBpcyBwYXNzZWQgb2ZmIHRvIHRoZSB3b3JrIGl0ZW0gKi8KIAlyeHJwY19xdWV1ZV93b3JrKCZwZWVyLT5lcnJvcl9kaXN0cmlidXRvcik7CkBAIC0yNDgsMTMgKzI3MywyMCBAQAogCXN0cnVjdCByeHJwY19wZWVyICpwZWVyID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByeHJwY19wZWVyLCBlcnJvcl9kaXN0cmlidXRvcik7CiAJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7Ci0JaW50IGVycm9yX3JlcG9ydDsKKwllbnVtIHJ4cnBjX2NhbGxfY29tcGxldGlvbiBjb21wbDsKKwlpbnQgZXJyb3I7CiAKIAlfZW50ZXIoIiIpOwogCi0JZXJyb3JfcmVwb3J0ID0gUkVBRF9PTkNFKHBlZXItPmVycm9yX3JlcG9ydCk7CisJZXJyb3IgPSBSRUFEX09OQ0UocGVlci0+ZXJyb3JfcmVwb3J0KTsKKwlpZiAoZXJyb3IgPCBSWFJQQ19MT0NBTF9FUlJPUl9PRkZTRVQpIHsKKwkJY29tcGwgPSBSWFJQQ19DQUxMX05FVFdPUktfRVJST1I7CisJfSBlbHNlIHsKKwkJY29tcGwgPSBSWFJQQ19DQUxMX0xPQ0FMX0VSUk9SOworCQllcnJvciAtPSBSWFJQQ19MT0NBTF9FUlJPUl9PRkZTRVQ7CisJfQogCi0JX2RlYnVnKCJJU1NVRSBFUlJPUiAlZCIsIGVycm9yX3JlcG9ydCk7CisJX2RlYnVnKCJJU1NVRSBFUlJPUiAlcyAlZCIsIHJ4cnBjX2NhbGxfY29tcGxldGlvbnNbY29tcGxdLCBlcnJvcik7CiAKIAlzcGluX2xvY2tfYmgoJnBlZXItPmxvY2spOwogCkBAIC0yNjIsMTYgKzI5NCwxMCBAQAogCQljYWxsID0gaGxpc3RfZW50cnkocGVlci0+ZXJyb3JfdGFyZ2V0cy5maXJzdCwKIAkJCQkgICBzdHJ1Y3QgcnhycGNfY2FsbCwgZXJyb3JfbGluayk7CiAJCWhsaXN0X2RlbF9pbml0KCZjYWxsLT5lcnJvcl9saW5rKTsKKwkJcnhycGNfc2VlX2NhbGwoY2FsbCk7CiAKLQkJd3JpdGVfbG9jaygmY2FsbC0+c3RhdGVfbG9jayk7Ci0JCWlmIChjYWxsLT5zdGF0ZSAhPSBSWFJQQ19DQUxMX0NPTVBMRVRFICYmCi0JCSAgICBjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfTkVUV09SS19FUlJPUikgewotCQkJY2FsbC0+ZXJyb3JfcmVwb3J0ID0gZXJyb3JfcmVwb3J0OwotCQkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX05FVFdPUktfRVJST1I7Ci0JCQlzZXRfYml0KFJYUlBDX0NBTExfRVZfUkNWRF9FUlJPUiwgJmNhbGwtPmV2ZW50cyk7Ci0JCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOwotCQl9Ci0JCXdyaXRlX3VubG9jaygmY2FsbC0+c3RhdGVfbG9jayk7CisJCWlmIChyeHJwY19zZXRfY2FsbF9jb21wbGV0aW9uKGNhbGwsIGNvbXBsLCAwLCBlcnJvcikpCisJCQlyeHJwY19ub3RpZnlfc29ja2V0KGNhbGwpOwogCX0KIAogCXNwaW5fdW5sb2NrX2JoKCZwZWVyLT5sb2NrKTsKQEAgLTI3OSwzICszMDUsNDQgQEAKIAlyeHJwY19wdXRfcGVlcihwZWVyKTsKIAlfbGVhdmUoIiIpOwogfQorCisvKgorICogQWRkIFJUVCBpbmZvcm1hdGlvbiB0byBjYWNoZS4gIFRoaXMgaXMgY2FsbGVkIGluIHNvZnRpcnEgbW9kZSBhbmQgaGFzCisgKiBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBwZWVyIFJUVCBkYXRhLgorICovCit2b2lkIHJ4cnBjX3BlZXJfYWRkX3J0dChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgZW51bSByeHJwY19ydHRfcnhfdHJhY2Ugd2h5LAorCQkJcnhycGNfc2VyaWFsX3Qgc2VuZF9zZXJpYWwsIHJ4cnBjX3NlcmlhbF90IHJlc3Bfc2VyaWFsLAorCQkJa3RpbWVfdCBzZW5kX3RpbWUsIGt0aW1lX3QgcmVzcF90aW1lKQoreworCXN0cnVjdCByeHJwY19wZWVyICpwZWVyID0gY2FsbC0+cGVlcjsKKwlzNjQgcnR0OworCXU2NCBzdW0gPSBwZWVyLT5ydHRfc3VtLCBhdmc7CisJdTggY3Vyc29yID0gcGVlci0+cnR0X2N1cnNvciwgdXNhZ2UgPSBwZWVyLT5ydHRfdXNhZ2U7CisKKwlydHQgPSBrdGltZV90b19ucyhrdGltZV9zdWIocmVzcF90aW1lLCBzZW5kX3RpbWUpKTsKKwlpZiAocnR0IDwgMCkKKwkJcmV0dXJuOworCisJLyogUmVwbGFjZSB0aGUgb2xkZXN0IGRhdHVtIGluIHRoZSBSVFQgYnVmZmVyICovCisJc3VtIC09IHBlZXItPnJ0dF9jYWNoZVtjdXJzb3JdOworCXN1bSArPSBydHQ7CisJcGVlci0+cnR0X2NhY2hlW2N1cnNvcl0gPSBydHQ7CisJcGVlci0+cnR0X2N1cnNvciA9IChjdXJzb3IgKyAxKSAmIChSWFJQQ19SVFRfQ0FDSEVfU0laRSAtIDEpOworCXBlZXItPnJ0dF9zdW0gPSBzdW07CisJaWYgKHVzYWdlIDwgUlhSUENfUlRUX0NBQ0hFX1NJWkUpIHsKKwkJdXNhZ2UrKzsKKwkJcGVlci0+cnR0X3VzYWdlID0gdXNhZ2U7CisJfQorCisJLyogTm93IHJlY2FsY3VsYXRlIHRoZSBhdmVyYWdlICovCisJaWYgKHVzYWdlID09IFJYUlBDX1JUVF9DQUNIRV9TSVpFKSB7CisJCWF2ZyA9IHN1bSAvIFJYUlBDX1JUVF9DQUNIRV9TSVpFOworCX0gZWxzZSB7CisJCWF2ZyA9IHN1bTsKKwkJZG9fZGl2KGF2ZywgdXNhZ2UpOworCX0KKworCXBlZXItPnJ0dCA9IGF2ZzsKKwl0cmFjZV9yeHJwY19ydHRfcngoY2FsbCwgd2h5LCBzZW5kX3NlcmlhbCwgcmVzcF9zZXJpYWwsIHJ0dCwKKwkJCSAgIHVzYWdlLCBhdmcpOworfQpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL3BlZXJfb2JqZWN0LmMgYi9uZXQvcnhycGMvcGVlcl9vYmplY3QuYwppbmRleCA1MzhlOTgzLi45NDFiNzI0IDEwMDY0NAotLS0gYS9uZXQvcnhycGMvcGVlcl9vYmplY3QuYworKysgYi9uZXQvcnhycGMvcGVlcl9vYmplY3QuYwpAQCAtMTYsMTIgKzE2LDE0IEBACiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvdWRwLmg+CiAjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaGFzaHRhYmxlLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KKyNpbmNsdWRlIDxuZXQvaXA2X3JvdXRlLmg+CiAjaW5jbHVkZSAiYXItaW50ZXJuYWwuaCIKIAogc3RhdGljIERFRklORV9IQVNIVEFCTEUocnhycGNfcGVlcl9oYXNoLCAxMCk7CkBAIC01MCw2ICs1MiwxMyBAQAogCQlzaXplID0gc2l6ZW9mKHNyeC0+dHJhbnNwb3J0LnNpbi5zaW5fYWRkcik7CiAJCXAgPSAodTE2ICopJnNyeC0+dHJhbnNwb3J0LnNpbi5zaW5fYWRkcjsKIAkJYnJlYWs7CisjaWZkZWYgQ09ORklHX0FGX1JYUlBDX0lQVjYKKwljYXNlIEFGX0lORVQ2OgorCQloYXNoX2tleSArPSAodTE2IF9fZm9yY2Upc3J4LT50cmFuc3BvcnQuc2luLnNpbl9wb3J0OworCQlzaXplID0gc2l6ZW9mKHNyeC0+dHJhbnNwb3J0LnNpbjYuc2luNl9hZGRyKTsKKwkJcCA9ICh1MTYgKikmc3J4LT50cmFuc3BvcnQuc2luNi5zaW42X2FkZHI7CisJCWJyZWFrOworI2VuZGlmCiAJZGVmYXVsdDoKIAkJV0FSTigxLCAiQUZfUlhSUEM6IFVuc3VwcG9ydGVkIHRyYW5zcG9ydCBhZGRyZXNzIGZhbWlseVxuIik7CiAJCXJldHVybiAwOwpAQCAtOTMsNiArMTAyLDE0IEBACiAJCQltZW1jbXAoJnBlZXItPnNyeC50cmFuc3BvcnQuc2luLnNpbl9hZGRyLAogCQkJICAgICAgICZzcngtPnRyYW5zcG9ydC5zaW4uc2luX2FkZHIsCiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisjaWZkZWYgQ09ORklHX0FGX1JYUlBDX0lQVjYKKwljYXNlIEFGX0lORVQ2OgorCQlyZXR1cm4gKCh1MTYgX19mb3JjZSlwZWVyLT5zcngudHJhbnNwb3J0LnNpbjYuc2luNl9wb3J0IC0KKwkJCSh1MTYgX19mb3JjZSlzcngtPnRyYW5zcG9ydC5zaW42LnNpbjZfcG9ydCkgPzoKKwkJCW1lbWNtcCgmcGVlci0+c3J4LnRyYW5zcG9ydC5zaW42LnNpbjZfYWRkciwKKwkJCSAgICAgICAmc3J4LT50cmFuc3BvcnQuc2luNi5zaW42X2FkZHIsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworI2VuZGlmCiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJfQpAQCAtMTMwLDE3ICsxNDcsNyBAQAogCiAJcGVlciA9IF9fcnhycGNfbG9va3VwX3BlZXJfcmN1KGxvY2FsLCBzcngsIGhhc2hfa2V5KTsKIAlpZiAocGVlcikgewotCQlzd2l0Y2ggKHNyeC0+dHJhbnNwb3J0LmZhbWlseSkgewotCQljYXNlIEFGX0lORVQ6Ci0JCQlfbmV0KCJQRUVSICVkIHslZCwldSwlcEk0KyVodX0iLAotCQkJICAgICBwZWVyLT5kZWJ1Z19pZCwKLQkJCSAgICAgcGVlci0+c3J4LnRyYW5zcG9ydF90eXBlLAotCQkJICAgICBwZWVyLT5zcngudHJhbnNwb3J0LmZhbWlseSwKLQkJCSAgICAgJnBlZXItPnNyeC50cmFuc3BvcnQuc2luLnNpbl9hZGRyLAotCQkJICAgICBudG9ocyhwZWVyLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fcG9ydCkpOwotCQkJYnJlYWs7Ci0JCX0KLQorCQlfbmV0KCJQRUVSICVkIHslcElTcH0iLCBwZWVyLT5kZWJ1Z19pZCwgJnBlZXItPnNyeC50cmFuc3BvcnQpOwogCQlfbGVhdmUoIiA9ICVwIHt1PSVkfSIsIHBlZXIsIGF0b21pY19yZWFkKCZwZWVyLT51c2FnZSkpOwogCX0KIAlyZXR1cm4gcGVlcjsKQEAgLTE1MiwyMiArMTU5LDUzIEBACiAgKi8KIHN0YXRpYyB2b2lkIHJ4cnBjX2Fzc2Vzc19NVFVfc2l6ZShzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcikKIHsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CiAJc3RydWN0IHJ0YWJsZSAqcnQ7Ci0Jc3RydWN0IGZsb3dpNCBmbDQ7CisJc3RydWN0IGZsb3dpIGZsOworCXN0cnVjdCBmbG93aTQgKmZsNCA9ICZmbC51LmlwNDsKKyNpZmRlZiBDT05GSUdfQUZfUlhSUENfSVBWNgorCXN0cnVjdCBmbG93aTYgKmZsNiA9ICZmbC51LmlwNjsKKyNlbmRpZgogCiAJcGVlci0+aWZfbXR1ID0gMTUwMDsKIAotCXJ0ID0gaXBfcm91dGVfb3V0cHV0X3BvcnRzKCZpbml0X25ldCwgJmZsNCwgTlVMTCwKLQkJCQkgICBwZWVyLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fYWRkci5zX2FkZHIsIDAsCi0JCQkJICAgaHRvbnMoNzAwMCksIGh0b25zKDcwMDEpLAotCQkJCSAgIElQUFJPVE9fVURQLCAwLCAwKTsKLQlpZiAoSVNfRVJSKHJ0KSkgewotCQlfbGVhdmUoIiBbcm91dGUgZXJyICVsZF0iLCBQVFJfRVJSKHJ0KSk7Ci0JCXJldHVybjsKKwltZW1zZXQoJmZsLCAwLCBzaXplb2YoZmwpKTsKKwlzd2l0Y2ggKHBlZXItPnNyeC50cmFuc3BvcnQuZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQlydCA9IGlwX3JvdXRlX291dHB1dF9wb3J0cygKKwkJCSZpbml0X25ldCwgZmw0LCBOVUxMLAorCQkJcGVlci0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX2FkZHIuc19hZGRyLCAwLAorCQkJaHRvbnMoNzAwMCksIGh0b25zKDcwMDEpLCBJUFBST1RPX1VEUCwgMCwgMCk7CisJCWlmIChJU19FUlIocnQpKSB7CisJCQlfbGVhdmUoIiBbcm91dGUgZXJyICVsZF0iLCBQVFJfRVJSKHJ0KSk7CisJCQlyZXR1cm47CisJCX0KKwkJZHN0ID0gJnJ0LT5kc3Q7CisJCWJyZWFrOworCisjaWZkZWYgQ09ORklHX0FGX1JYUlBDX0lQVjYKKwljYXNlIEFGX0lORVQ2OgorCQlmbDYtPmZsb3dpNl9paWYgPSBMT09QQkFDS19JRklOREVYOworCQlmbDYtPmZsb3dpNl9zY29wZSA9IFJUX1NDT1BFX1VOSVZFUlNFOworCQlmbDYtPmZsb3dpNl9wcm90byA9IElQUFJPVE9fVURQOworCQltZW1jcHkoJmZsNi0+ZGFkZHIsICZwZWVyLT5zcngudHJhbnNwb3J0LnNpbjYuc2luNl9hZGRyLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQlmbDYtPmZsNl9kcG9ydCA9IGh0b25zKDcwMDEpOworCQlmbDYtPmZsNl9zcG9ydCA9IGh0b25zKDcwMDApOworCQlkc3QgPSBpcDZfcm91dGVfb3V0cHV0KCZpbml0X25ldCwgTlVMTCwgZmw2KTsKKwkJaWYgKElTX0VSUihkc3QpKSB7CisJCQlfbGVhdmUoIiBbcm91dGUgZXJyICVsZF0iLCBQVFJfRVJSKGRzdCkpOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworI2VuZGlmCisKKwlkZWZhdWx0OgorCQlCVUcoKTsKIAl9CiAKLQlwZWVyLT5pZl9tdHUgPSBkc3RfbXR1KCZydC0+ZHN0KTsKLQlkc3RfcmVsZWFzZSgmcnQtPmRzdCk7CisJcGVlci0+aWZfbXR1ID0gZHN0X210dShkc3QpOworCWRzdF9yZWxlYXNlKGRzdCk7CiAKIAlfbGVhdmUoIiBbaWZfbXR1ICV1XSIsIHBlZXItPmlmX210dSk7CiB9CkBAIC0xOTksNiArMjM3LDQxIEBACiB9CiAKIC8qCisgKiBJbml0aWFsaXNlIHBlZXIgcmVjb3JkLgorICovCitzdGF0aWMgdm9pZCByeHJwY19pbml0X3BlZXIoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIsIHVuc2lnbmVkIGxvbmcgaGFzaF9rZXkpCit7CisJcGVlci0+aGFzaF9rZXkgPSBoYXNoX2tleTsKKwlyeHJwY19hc3Nlc3NfTVRVX3NpemUocGVlcik7CisJcGVlci0+bXR1ID0gcGVlci0+aWZfbXR1OworCXBlZXItPnJ0dF9sYXN0X3JlcSA9IGt0aW1lX2dldF9yZWFsKCk7CisKKwlzd2l0Y2ggKHBlZXItPnNyeC50cmFuc3BvcnQuZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQlwZWVyLT5oZHJzaXplID0gc2l6ZW9mKHN0cnVjdCBpcGhkcik7CisJCWJyZWFrOworI2lmZGVmIENPTkZJR19BRl9SWFJQQ19JUFY2CisJY2FzZSBBRl9JTkVUNjoKKwkJcGVlci0+aGRyc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXB2Nmhkcik7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCisJc3dpdGNoIChwZWVyLT5zcngudHJhbnNwb3J0X3R5cGUpIHsKKwljYXNlIFNPQ0tfREdSQU06CisJCXBlZXItPmhkcnNpemUgKz0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlwZWVyLT5oZHJzaXplICs9IHNpemVvZihzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIpOworCXBlZXItPm1heGRhdGEgPSBwZWVyLT5tdHUgLSBwZWVyLT5oZHJzaXplOworfQorCisvKgogICogU2V0IHVwIGEgbmV3IHBlZXIuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgcnhycGNfcGVlciAqcnhycGNfY3JlYXRlX3BlZXIoc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCwKQEAgLTIxMiwyOCArMjg1LDggQEAKIAogCXBlZXIgPSByeHJwY19hbGxvY19wZWVyKGxvY2FsLCBnZnApOwogCWlmIChwZWVyKSB7Ci0JCXBlZXItPmhhc2hfa2V5ID0gaGFzaF9rZXk7CiAJCW1lbWNweSgmcGVlci0+c3J4LCBzcngsIHNpemVvZigqc3J4KSk7Ci0KLQkJcnhycGNfYXNzZXNzX01UVV9zaXplKHBlZXIpOwotCQlwZWVyLT5tdHUgPSBwZWVyLT5pZl9tdHU7Ci0KLQkJaWYgKHNyeC0+dHJhbnNwb3J0LmZhbWlseSA9PSBBRl9JTkVUKSB7Ci0JCQlwZWVyLT5oZHJzaXplID0gc2l6ZW9mKHN0cnVjdCBpcGhkcik7Ci0JCQlzd2l0Y2ggKHNyeC0+dHJhbnNwb3J0X3R5cGUpIHsKLQkJCWNhc2UgU09DS19ER1JBTToKLQkJCQlwZWVyLT5oZHJzaXplICs9IHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJQlVHKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlCVUcoKTsKLQkJfQotCi0JCXBlZXItPmhkcnNpemUgKz0gc2l6ZW9mKHN0cnVjdCByeHJwY193aXJlX2hlYWRlcik7Ci0JCXBlZXItPm1heGRhdGEgPSBwZWVyLT5tdHUgLSBwZWVyLT5oZHJzaXplOworCQlyeHJwY19pbml0X3BlZXIocGVlciwgaGFzaF9rZXkpOwogCX0KIAogCV9sZWF2ZSgiID0gJXAiLCBwZWVyKTsKQEAgLTI0MSw2ICsyOTQsMzUgQEAKIH0KIAogLyoKKyAqIFNldCB1cCBhIG5ldyBpbmNvbWluZyBwZWVyLiAgVGhlIGFkZHJlc3MgaXMgcHJlc3RvcmVkIGluIHRoZSBwcmVhbGxvY2F0ZWQKKyAqIHBlZXIuCisgKi8KK3N0cnVjdCByeHJwY19wZWVyICpyeHJwY19sb29rdXBfaW5jb21pbmdfcGVlcihzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsLAorCQkJCQkgICAgICBzdHJ1Y3QgcnhycGNfcGVlciAqcHJlYWxsb2MpCit7CisJc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXI7CisJdW5zaWduZWQgbG9uZyBoYXNoX2tleTsKKworCWhhc2hfa2V5ID0gcnhycGNfcGVlcl9oYXNoX2tleShsb2NhbCwgJnByZWFsbG9jLT5zcngpOworCXByZWFsbG9jLT5sb2NhbCA9IGxvY2FsOworCXJ4cnBjX2luaXRfcGVlcihwcmVhbGxvYywgaGFzaF9rZXkpOworCisJc3Bpbl9sb2NrKCZyeHJwY19wZWVyX2hhc2hfbG9jayk7CisKKwkvKiBOZWVkIHRvIGNoZWNrIHRoYXQgd2UgYXJlbid0IHJhY2luZyB3aXRoIHNvbWVvbmUgZWxzZSAqLworCXBlZXIgPSBfX3J4cnBjX2xvb2t1cF9wZWVyX3JjdShsb2NhbCwgJnByZWFsbG9jLT5zcngsIGhhc2hfa2V5KTsKKwlpZiAocGVlciAmJiAhcnhycGNfZ2V0X3BlZXJfbWF5YmUocGVlcikpCisJCXBlZXIgPSBOVUxMOworCWlmICghcGVlcikgeworCQlwZWVyID0gcHJlYWxsb2M7CisJCWhhc2hfYWRkX3JjdShyeHJwY19wZWVyX2hhc2gsICZwZWVyLT5oYXNoX2xpbmssIGhhc2hfa2V5KTsKKwl9CisKKwlzcGluX3VubG9jaygmcnhycGNfcGVlcl9oYXNoX2xvY2spOworCXJldHVybiBwZWVyOworfQorCisvKgogICogb2J0YWluIGEgcmVtb3RlIHRyYW5zcG9ydCBlbmRwb2ludCBmb3IgdGhlIHNwZWNpZmllZCBhZGRyZXNzCiAgKi8KIHN0cnVjdCByeHJwY19wZWVyICpyeHJwY19sb29rdXBfcGVlcihzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsLApAQCAtMjQ5LDExICszMzEsNyBAQAogCXN0cnVjdCByeHJwY19wZWVyICpwZWVyLCAqY2FuZGlkYXRlOwogCXVuc2lnbmVkIGxvbmcgaGFzaF9rZXkgPSByeHJwY19wZWVyX2hhc2hfa2V5KGxvY2FsLCBzcngpOwogCi0JX2VudGVyKCJ7JWQsJWQsJXBJNCslaHV9IiwKLQkgICAgICAgc3J4LT50cmFuc3BvcnRfdHlwZSwKLQkgICAgICAgc3J4LT50cmFuc3BvcnRfbGVuLAotCSAgICAgICAmc3J4LT50cmFuc3BvcnQuc2luLnNpbl9hZGRyLAotCSAgICAgICBudG9ocyhzcngtPnRyYW5zcG9ydC5zaW4uc2luX3BvcnQpKTsKKwlfZW50ZXIoInslcElTcH0iLCAmc3J4LT50cmFuc3BvcnQpOwogCiAJLyogc2VhcmNoIHRoZSBwZWVyIGxpc3QgZmlyc3QgKi8KIAlyY3VfcmVhZF9sb2NrKCk7CkBAIC0yNzIsNyArMzUwLDcgQEAKIAkJCXJldHVybiBOVUxMOwogCQl9CiAKLQkJc3Bpbl9sb2NrKCZyeHJwY19wZWVyX2hhc2hfbG9jayk7CisJCXNwaW5fbG9ja19iaCgmcnhycGNfcGVlcl9oYXNoX2xvY2spOwogCiAJCS8qIE5lZWQgdG8gY2hlY2sgdGhhdCB3ZSBhcmVuJ3QgcmFjaW5nIHdpdGggc29tZW9uZSBlbHNlICovCiAJCXBlZXIgPSBfX3J4cnBjX2xvb2t1cF9wZWVyX3JjdShsb2NhbCwgc3J4LCBoYXNoX2tleSk7CkBAIC0yODIsNyArMzYwLDcgQEAKIAkJCWhhc2hfYWRkX3JjdShyeHJwY19wZWVyX2hhc2gsCiAJCQkJICAgICAmY2FuZGlkYXRlLT5oYXNoX2xpbmssIGhhc2hfa2V5KTsKIAotCQlzcGluX3VubG9jaygmcnhycGNfcGVlcl9oYXNoX2xvY2spOworCQlzcGluX3VubG9ja19iaCgmcnhycGNfcGVlcl9oYXNoX2xvY2spOwogCiAJCWlmIChwZWVyKQogCQkJa2ZyZWUoY2FuZGlkYXRlKTsKQEAgLTI5MCwxMSArMzY4LDcgQEAKIAkJCXBlZXIgPSBjYW5kaWRhdGU7CiAJfQogCi0JX25ldCgiUEVFUiAlZCB7JWQsJXBJNCslaHV9IiwKLQkgICAgIHBlZXItPmRlYnVnX2lkLAotCSAgICAgcGVlci0+c3J4LnRyYW5zcG9ydF90eXBlLAotCSAgICAgJnBlZXItPnNyeC50cmFuc3BvcnQuc2luLnNpbl9hZGRyLAotCSAgICAgbnRvaHMocGVlci0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX3BvcnQpKTsKKwlfbmV0KCJQRUVSICVkIHslcElTcH0iLCBwZWVyLT5kZWJ1Z19pZCwgJnBlZXItPnNyeC50cmFuc3BvcnQpOwogCiAJX2xlYXZlKCIgPSAlcCB7dT0lZH0iLCBwZWVyLCBhdG9taWNfcmVhZCgmcGVlci0+dXNhZ2UpKTsKIAlyZXR1cm4gcGVlcjsKQEAgLTMwNyw5ICszODEsMjQgQEAKIHsKIAlBU1NFUlQoaGxpc3RfZW1wdHkoJnBlZXItPmVycm9yX3RhcmdldHMpKTsKIAotCXNwaW5fbG9jaygmcnhycGNfcGVlcl9oYXNoX2xvY2spOworCXNwaW5fbG9ja19iaCgmcnhycGNfcGVlcl9oYXNoX2xvY2spOwogCWhhc2hfZGVsX3JjdSgmcGVlci0+aGFzaF9saW5rKTsKLQlzcGluX3VubG9jaygmcnhycGNfcGVlcl9oYXNoX2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZyeHJwY19wZWVyX2hhc2hfbG9jayk7CiAKIAlrZnJlZV9yY3UocGVlciwgcmN1KTsKIH0KKworLyoqCisgKiByeHJwY19rZXJuZWxfZ2V0X3BlZXIgLSBHZXQgdGhlIHBlZXIgYWRkcmVzcyBvZiBhIGNhbGwKKyAqIEBzb2NrOiBUaGUgc29ja2V0IG9uIHdoaWNoIHRoZSBjYWxsIGlzIGluIHByb2dyZXNzLgorICogQGNhbGw6IFRoZSBjYWxsIHRvIHF1ZXJ5CisgKiBAX3NyeDogV2hlcmUgdG8gcGxhY2UgdGhlIHJlc3VsdAorICoKKyAqIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIHBlZXIgaW4gYSBjYWxsLgorICovCit2b2lkIHJ4cnBjX2tlcm5lbF9nZXRfcGVlcihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCSAgIHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqX3NyeCkKK3sKKwkqX3NyeCA9IGNhbGwtPnBlZXItPnNyeDsKK30KK0VYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2dldF9wZWVyKTsKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9wcm9jLmMgYi9uZXQvcnhycGMvcHJvYy5jCmluZGV4IGNlZDVmMDcuLjY1Y2Q5ODAgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9wcm9jLmMKKysrIGIvbmV0L3J4cnBjL3Byb2MuYwpAQCAtMTcsMTIgKzE3LDEyIEBACiBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgcnhycGNfY29ubl9zdGF0ZXNbUlhSUENfQ09OTl9fTlJfU1RBVEVTXSA9IHsKIAlbUlhSUENfQ09OTl9VTlVTRURdCQkJPSAiVW51c2VkICAiLAogCVtSWFJQQ19DT05OX0NMSUVOVF0JCQk9ICJDbGllbnQgICIsCisJW1JYUlBDX0NPTk5fU0VSVklDRV9QUkVBTExPQ10JCT0gIlN2UHJlYWxjIiwKIAlbUlhSUENfQ09OTl9TRVJWSUNFX1VOU0VDVVJFRF0JCT0gIlN2VW5zZWMgIiwKIAlbUlhSUENfQ09OTl9TRVJWSUNFX0NIQUxMRU5HSU5HXQk9ICJTdkNoYWxsICIsCiAJW1JYUlBDX0NPTk5fU0VSVklDRV0JCQk9ICJTdlNlY3VyZSIsCiAJW1JYUlBDX0NPTk5fUkVNT1RFTFlfQUJPUlRFRF0JCT0gIlJtdEFib3J0IiwKIAlbUlhSUENfQ09OTl9MT0NBTExZX0FCT1JURURdCQk9ICJMb2NBYm9ydCIsCi0JW1JYUlBDX0NPTk5fTkVUV09SS19FUlJPUl0JCT0gIk5ldEVycm9yIiwKIH07CiAKIC8qCkBAIC0zMCw2ICszMCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkICpyeHJwY19jYWxsX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpfcG9zKQogeworCXJjdV9yZWFkX2xvY2soKTsKIAlyZWFkX2xvY2soJnJ4cnBjX2NhbGxfbG9jayk7CiAJcmV0dXJuIHNlcV9saXN0X3N0YXJ0X2hlYWQoJnJ4cnBjX2NhbGxzLCAqX3Bvcyk7CiB9CkBAIC00MiwxNyArNDMsMjEgQEAKIHN0YXRpYyB2b2lkIHJ4cnBjX2NhbGxfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiB7CiAJcmVhZF91bmxvY2soJnJ4cnBjX2NhbGxfbG9jayk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKIHN0YXRpYyBpbnQgcnhycGNfY2FsbF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKKwlzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsOworCXN0cnVjdCByeHJwY19zb2NrICpyeDsKKwlzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcjsKIAlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKLQljaGFyIGxidWZmWzQgKyA0ICsgNCArIDQgKyA1ICsgMV0sIHJidWZmWzQgKyA0ICsgNCArIDQgKyA1ICsgMV07CisJY2hhciBsYnVmZls1MF0sIHJidWZmWzUwXTsKIAogCWlmICh2ID09ICZyeHJwY19jYWxscykgewogCQlzZXFfcHV0cyhzZXEsCi0JCQkgIlByb3RvIExvY2FsICAgICAgICAgICAgICAgICAgUmVtb3RlICAgICAgICAgICAgICAgICIKKwkJCSAiUHJvdG8gTG9jYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCisJCQkgIiBSZW1vdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKIAkJCSAiIFN2SUQgQ29ubklEICAgQ2FsbElEICAgRW5kIFVzZSBTdGF0ZSAgICBBYm9ydCAgICIKIAkJCSAiIFVzZXJJRFxuIik7CiAJCXJldHVybiAwOwpAQCAtNjAsMzAgKzY1LDM1IEBACiAKIAljYWxsID0gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgcnhycGNfY2FsbCwgbGluayk7CiAKLQlzcHJpbnRmKGxidWZmLCAiJXBJNDoldSIsCi0JCSZjYWxsLT5sb2NhbC0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX2FkZHIsCi0JCW50b2hzKGNhbGwtPmxvY2FsLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fcG9ydCkpOworCXJ4ID0gcmN1X2RlcmVmZXJlbmNlKGNhbGwtPnNvY2tldCk7CisJaWYgKHJ4KSB7CisJCWxvY2FsID0gUkVBRF9PTkNFKHJ4LT5sb2NhbCk7CisJCWlmIChsb2NhbCkKKwkJCXNwcmludGYobGJ1ZmYsICIlcElTcGMiLCAmbG9jYWwtPnNyeC50cmFuc3BvcnQpOworCQllbHNlCisJCQlzdHJjcHkobGJ1ZmYsICJub19sb2NhbCIpOworCX0gZWxzZSB7CisJCXN0cmNweShsYnVmZiwgIm5vX3NvY2tldCIpOworCX0KIAotCWNvbm4gPSBjYWxsLT5jb25uOwotCWlmIChjb25uKQotCQlzcHJpbnRmKHJidWZmLCAiJXBJNDoldSIsCi0JCQkmY29ubi0+cGFyYW1zLnBlZXItPnNyeC50cmFuc3BvcnQuc2luLnNpbl9hZGRyLAotCQkJbnRvaHMoY29ubi0+cGFyYW1zLnBlZXItPnNyeC50cmFuc3BvcnQuc2luLnNpbl9wb3J0KSk7CisJcGVlciA9IGNhbGwtPnBlZXI7CisJaWYgKHBlZXIpCisJCXNwcmludGYocmJ1ZmYsICIlcElTcGMiLCAmcGVlci0+c3J4LnRyYW5zcG9ydCk7CiAJZWxzZQogCQlzdHJjcHkocmJ1ZmYsICJub19jb25uZWN0aW9uIik7CiAKIAlzZXFfcHJpbnRmKHNlcSwKLQkJICAgIlVEUCAgICUtMjIuMjJzICUtMjIuMjJzICU0eCAlMDh4ICUwOHggJXMgJTN1IgorCQkgICAiVURQICAgJS00Ny40N3MgJS00Ny40N3MgJTR4ICUwOHggJTA4eCAlcyAlM3UiCiAJCSAgICIgJS04LjhzICUwOHggJWx4XG4iLAogCQkgICBsYnVmZiwKIAkJICAgcmJ1ZmYsCiAJCSAgIGNhbGwtPnNlcnZpY2VfaWQsCiAJCSAgIGNhbGwtPmNpZCwKIAkJICAgY2FsbC0+Y2FsbF9pZCwKLQkJICAgY2FsbC0+aW5fY2xpZW50ZmxhZyA/ICJTdmMiIDogIkNsdCIsCisJCSAgIHJ4cnBjX2lzX3NlcnZpY2VfY2FsbChjYWxsKSA/ICJTdmMiIDogIkNsdCIsCiAJCSAgIGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSksCiAJCSAgIHJ4cnBjX2NhbGxfc3RhdGVzW2NhbGwtPnN0YXRlXSwKLQkJICAgY2FsbC0+cmVtb3RlX2Fib3J0ID86IGNhbGwtPmxvY2FsX2Fib3J0LAorCQkgICBjYWxsLT5hYm9ydF9jb2RlLAogCQkgICBjYWxsLT51c2VyX2NhbGxfSUQpOwogCiAJcmV0dXJuIDA7CkBAIC0xMTUsMTMgKzEyNSwxMyBAQAogc3RhdGljIHZvaWQgKnJ4cnBjX2Nvbm5lY3Rpb25fc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKl9wb3MpCiB7CiAJcmVhZF9sb2NrKCZyeHJwY19jb25uZWN0aW9uX2xvY2spOwotCXJldHVybiBzZXFfbGlzdF9zdGFydF9oZWFkKCZyeHJwY19jb25uZWN0aW9ucywgKl9wb3MpOworCXJldHVybiBzZXFfbGlzdF9zdGFydF9oZWFkKCZyeHJwY19jb25uZWN0aW9uX3Byb2NfbGlzdCwgKl9wb3MpOwogfQogCiBzdGF0aWMgdm9pZCAqcnhycGNfY29ubmVjdGlvbl9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwKIAkJCQkgICAgICAgbG9mZl90ICpwb3MpCiB7Ci0JcmV0dXJuIHNlcV9saXN0X25leHQodiwgJnJ4cnBjX2Nvbm5lY3Rpb25zLCBwb3MpOworCXJldHVybiBzZXFfbGlzdF9uZXh0KHYsICZyeHJwY19jb25uZWN0aW9uX3Byb2NfbGlzdCwgcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgcnhycGNfY29ubmVjdGlvbl9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKQEAgLTEzMiwyOSArMTQyLDMxIEBACiBzdGF0aWMgaW50IHJ4cnBjX2Nvbm5lY3Rpb25fc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiB7CiAJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm47Ci0JY2hhciBsYnVmZls0ICsgNCArIDQgKyA0ICsgNSArIDFdLCByYnVmZls0ICsgNCArIDQgKyA0ICsgNSArIDFdOworCWNoYXIgbGJ1ZmZbNTBdLCByYnVmZls1MF07CiAKLQlpZiAodiA9PSAmcnhycGNfY29ubmVjdGlvbnMpIHsKKwlpZiAodiA9PSAmcnhycGNfY29ubmVjdGlvbl9wcm9jX2xpc3QpIHsKIAkJc2VxX3B1dHMoc2VxLAotCQkJICJQcm90byBMb2NhbCAgICAgICAgICAgICAgICAgIFJlbW90ZSAgICAgICAgICAgICAgICAiCisJCQkgIlByb3RvIExvY2FsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgorCQkJICIgUmVtb3RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCiAJCQkgIiBTdklEIENvbm5JRCAgIEVuZCBVc2UgU3RhdGUgICAgS2V5ICAgICAiCiAJCQkgIiBTZXJpYWwgICBJU2VyaWFsXG4iCiAJCQkgKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JY29ubiA9IGxpc3RfZW50cnkodiwgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24sIGxpbmspOworCWNvbm4gPSBsaXN0X2VudHJ5KHYsIHN0cnVjdCByeHJwY19jb25uZWN0aW9uLCBwcm9jX2xpbmspOworCWlmIChjb25uLT5zdGF0ZSA9PSBSWFJQQ19DT05OX1NFUlZJQ0VfUFJFQUxMT0MpIHsKKwkJc3RyY3B5KGxidWZmLCAibm9fbG9jYWwiKTsKKwkJc3RyY3B5KHJidWZmLCAibm9fY29ubmVjdGlvbiIpOworCQlnb3RvIHByaW50OworCX0KIAotCXNwcmludGYobGJ1ZmYsICIlcEk0OiV1IiwKLQkJJmNvbm4tPnBhcmFtcy5sb2NhbC0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX2FkZHIsCi0JCW50b2hzKGNvbm4tPnBhcmFtcy5sb2NhbC0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX3BvcnQpKTsKKwlzcHJpbnRmKGxidWZmLCAiJXBJU3BjIiwgJmNvbm4tPnBhcmFtcy5sb2NhbC0+c3J4LnRyYW5zcG9ydCk7CiAKLQlzcHJpbnRmKHJidWZmLCAiJXBJNDoldSIsCi0JCSZjb25uLT5wYXJhbXMucGVlci0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX2FkZHIsCi0JCW50b2hzKGNvbm4tPnBhcmFtcy5wZWVyLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fcG9ydCkpOwotCisJc3ByaW50ZihyYnVmZiwgIiVwSVNwYyIsICZjb25uLT5wYXJhbXMucGVlci0+c3J4LnRyYW5zcG9ydCk7CitwcmludDoKIAlzZXFfcHJpbnRmKHNlcSwKLQkJICAgIlVEUCAgICUtMjIuMjJzICUtMjIuMjJzICU0eCAlMDh4ICVzICUzdSIKKwkJICAgIlVEUCAgICUtNDcuNDdzICUtNDcuNDdzICU0eCAlMDh4ICVzICUzdSIKIAkJICAgIiAlcyAlMDh4ICUwOHggJTA4eFxuIiwKIAkJICAgbGJ1ZmYsCiAJCSAgIHJidWZmLApAQCAtMTY1LDcgKzE3Nyw3IEBACiAJCSAgIHJ4cnBjX2Nvbm5fc3RhdGVzW2Nvbm4tPnN0YXRlXSwKIAkJICAga2V5X3NlcmlhbChjb25uLT5wYXJhbXMua2V5KSwKIAkJICAgYXRvbWljX3JlYWQoJmNvbm4tPnNlcmlhbCksCi0JCSAgIGF0b21pY19yZWFkKCZjb25uLT5oaV9zZXJpYWwpKTsKKwkJICAgY29ubi0+aGlfc2VyaWFsKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL3JlY3Ztc2cuYyBiL25ldC9yeHJwYy9yZWN2bXNnLmMKaW5kZXggYTNmYTJlZC4uZjA1ZWEwYSAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL3JlY3Ztc2cuYworKysgYi9uZXQvcnhycGMvcmVjdm1zZy5jCkBAIC0xOSw0MTggKzE5LDY0NSBAQAogI2luY2x1ZGUgImFyLWludGVybmFsLmgiCiAKIC8qCi0gKiByZW1vdmFsIGEgY2FsbCdzIHVzZXIgSUQgZnJvbSB0aGUgc29ja2V0IHRyZWUgdG8gbWFrZSB0aGUgdXNlciBJRCBhdmFpbGFibGUKLSAqIGFnYWluIGFuZCBzbyB0aGF0IGl0IHdvbid0IGJlIHNlZW4gYWdhaW4gaW4gYXNzb2NpYXRpb24gd2l0aCB0aGF0IGNhbGwKKyAqIFBvc3QgYSBjYWxsIGZvciBhdHRlbnRpb24gYnkgdGhlIHNvY2tldCBvciBrZXJuZWwgc2VydmljZS4gIEZ1cnRoZXIKKyAqIG5vdGlmaWNhdGlvbnMgYXJlIHN1cHByZXNzZWQgYnkgcHV0dGluZyByZWN2bXNnX2xpbmsgb24gYSBkdW1teSBxdWV1ZS4KICAqLwotdm9pZCByeHJwY19yZW1vdmVfdXNlcl9JRChzdHJ1Y3QgcnhycGNfc29jayAqcngsIHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQordm9pZCByeHJwY19ub3RpZnlfc29ja2V0KHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQogewotCV9kZWJ1ZygiUkVMRUFTRSBDQUxMICVkIiwgY2FsbC0+ZGVidWdfaWQpOworCXN0cnVjdCByeHJwY19zb2NrICpyeDsKKwlzdHJ1Y3Qgc29jayAqc2s7CiAKLQlpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9IQVNfVVNFUklELCAmY2FsbC0+ZmxhZ3MpKSB7Ci0JCXdyaXRlX2xvY2tfYmgoJnJ4LT5jYWxsX2xvY2spOwotCQlyYl9lcmFzZSgmY2FsbC0+c29ja19ub2RlLCAmY2FsbC0+c29ja2V0LT5jYWxscyk7Ci0JCWNsZWFyX2JpdChSWFJQQ19DQUxMX0hBU19VU0VSSUQsICZjYWxsLT5mbGFncyk7Ci0JCXdyaXRlX3VubG9ja19iaCgmcngtPmNhbGxfbG9jayk7CisJX2VudGVyKCIlZCIsIGNhbGwtPmRlYnVnX2lkKTsKKworCWlmICghbGlzdF9lbXB0eSgmY2FsbC0+cmVjdm1zZ19saW5rKSkKKwkJcmV0dXJuOworCisJcmN1X3JlYWRfbG9jaygpOworCisJcnggPSByY3VfZGVyZWZlcmVuY2UoY2FsbC0+c29ja2V0KTsKKwlzayA9ICZyeC0+c2s7CisJaWYgKHJ4ICYmIHNrLT5za19zdGF0ZSA8IFJYUlBDX0NMT1NFKSB7CisJCWlmIChjYWxsLT5ub3RpZnlfcngpIHsKKwkJCWNhbGwtPm5vdGlmeV9yeChzaywgY2FsbCwgY2FsbC0+dXNlcl9jYWxsX0lEKTsKKwkJfSBlbHNlIHsKKwkJCXdyaXRlX2xvY2tfYmgoJnJ4LT5yZWN2bXNnX2xvY2spOworCQkJaWYgKGxpc3RfZW1wdHkoJmNhbGwtPnJlY3Ztc2dfbGluaykpIHsKKwkJCQlyeHJwY19nZXRfY2FsbChjYWxsLCByeHJwY19jYWxsX2dvdCk7CisJCQkJbGlzdF9hZGRfdGFpbCgmY2FsbC0+cmVjdm1zZ19saW5rLCAmcngtPnJlY3Ztc2dfcSk7CisJCQl9CisJCQl3cml0ZV91bmxvY2tfYmgoJnJ4LT5yZWN2bXNnX2xvY2spOworCisJCQlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkgeworCQkJCV9kZWJ1ZygiY2FsbCAlcHMiLCBzay0+c2tfZGF0YV9yZWFkeSk7CisJCQkJc2stPnNrX2RhdGFfcmVhZHkoc2spOworCQkJfQorCQl9CiAJfQogCi0JcmVhZF9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQlpZiAoIXRlc3RfYml0KFJYUlBDX0NBTExfUkVMRUFTRUQsICZjYWxsLT5mbGFncykgJiYKLQkgICAgIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FVl9SRUxFQVNFLCAmY2FsbC0+ZXZlbnRzKSkKLQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQlyZWFkX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJX2xlYXZlKCIiKTsKIH0KIAogLyoKLSAqIHJlY2VpdmUgYSBtZXNzYWdlIGZyb20gYW4gUnhSUEMgc29ja2V0CisgKiBQYXNzIGEgY2FsbCB0ZXJtaW5hdGluZyBtZXNzYWdlIHRvIHVzZXJzcGFjZS4KKyAqLworc3RhdGljIGludCByeHJwY19yZWN2bXNnX3Rlcm0oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBtc2doZHIgKm1zZykKK3sKKwl1MzIgdG1wID0gMDsKKwlpbnQgcmV0OworCisJc3dpdGNoIChjYWxsLT5jb21wbGV0aW9uKSB7CisJY2FzZSBSWFJQQ19DQUxMX1NVQ0NFRURFRDoKKwkJcmV0ID0gMDsKKwkJaWYgKHJ4cnBjX2lzX3NlcnZpY2VfY2FsbChjYWxsKSkKKwkJCXJldCA9IHB1dF9jbXNnKG1zZywgU09MX1JYUlBDLCBSWFJQQ19BQ0ssIDAsICZ0bXApOworCQlicmVhazsKKwljYXNlIFJYUlBDX0NBTExfUkVNT1RFTFlfQUJPUlRFRDoKKwkJdG1wID0gY2FsbC0+YWJvcnRfY29kZTsKKwkJcmV0ID0gcHV0X2Ntc2cobXNnLCBTT0xfUlhSUEMsIFJYUlBDX0FCT1JULCA0LCAmdG1wKTsKKwkJYnJlYWs7CisJY2FzZSBSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRDoKKwkJdG1wID0gY2FsbC0+YWJvcnRfY29kZTsKKwkJcmV0ID0gcHV0X2Ntc2cobXNnLCBTT0xfUlhSUEMsIFJYUlBDX0FCT1JULCA0LCAmdG1wKTsKKwkJYnJlYWs7CisJY2FzZSBSWFJQQ19DQUxMX05FVFdPUktfRVJST1I6CisJCXRtcCA9IGNhbGwtPmVycm9yOworCQlyZXQgPSBwdXRfY21zZyhtc2csIFNPTF9SWFJQQywgUlhSUENfTkVUX0VSUk9SLCA0LCAmdG1wKTsKKwkJYnJlYWs7CisJY2FzZSBSWFJQQ19DQUxMX0xPQ0FMX0VSUk9SOgorCQl0bXAgPSBjYWxsLT5lcnJvcjsKKwkJcmV0ID0gcHV0X2Ntc2cobXNnLCBTT0xfUlhSUEMsIFJYUlBDX0xPQ0FMX0VSUk9SLCA0LCAmdG1wKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCJJbnZhbGlkIHRlcm1pbmFsIGNhbGwgc3RhdGUgJXVcbiIsIGNhbGwtPnN0YXRlKTsKKwkJQlVHKCk7CisJCWJyZWFrOworCX0KKworCXRyYWNlX3J4cnBjX3JlY3Ztc2coY2FsbCwgcnhycGNfcmVjdm1zZ190ZXJtaW5hbCwgY2FsbC0+cnhfaGFyZF9hY2ssCisJCQkgICAgY2FsbC0+cnhfcGt0X29mZnNldCwgY2FsbC0+cnhfcGt0X2xlbiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUGFzcyBiYWNrIG5vdGlmaWNhdGlvbiBvZiBhIG5ldyBjYWxsLiAgVGhlIGNhbGwgaXMgYWRkZWQgdG8gdGhlCisgKiB0by1iZS1hY2NlcHRlZCBsaXN0LiAgVGhpcyBtZWFucyB0aGF0IHRoZSBuZXh0IGNhbGwgdG8gYmUgYWNjZXB0ZWQgbWlnaHQgbm90CisgKiBiZSB0aGUgbGFzdCBjYWxsIHNlZW4gYXdhaXRpbmcgYWNjZXB0YW5jZSwgYnV0IHVubGVzcyB3ZSBsZWF2ZSB0aGlzIG9uIHRoZQorICogZnJvbnQgb2YgdGhlIHF1ZXVlIGFuZCBibG9jayBhbGwgb3RoZXIgbWVzc2FnZXMgdW50aWwgc29tZW9uZSBnaXZlcyB1cyBhCisgKiB1c2VyX0lEIGZvciBpdCwgdGhlcmUncyBub3QgYSBsb3Qgd2UgY2FuIGRvLgorICovCitzdGF0aWMgaW50IHJ4cnBjX3JlY3Ztc2dfbmV3X2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAorCQkJCSAgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkJICBzdHJ1Y3QgbXNnaGRyICptc2csIGludCBmbGFncykKK3sKKwlpbnQgdG1wID0gMCwgcmV0OworCisJcmV0ID0gcHV0X2Ntc2cobXNnLCBTT0xfUlhSUEMsIFJYUlBDX05FV19DQUxMLCAwLCAmdG1wKTsKKworCWlmIChyZXQgPT0gMCAmJiAhKGZsYWdzICYgTVNHX1BFRUspKSB7CisJCV9kZWJ1ZygidG8gYmUgYWNjZXB0ZWQiKTsKKwkJd3JpdGVfbG9ja19iaCgmcngtPnJlY3Ztc2dfbG9jayk7CisJCWxpc3RfZGVsX2luaXQoJmNhbGwtPnJlY3Ztc2dfbGluayk7CisJCXdyaXRlX3VubG9ja19iaCgmcngtPnJlY3Ztc2dfbG9jayk7CisKKwkJcnhycGNfZ2V0X2NhbGwoY2FsbCwgcnhycGNfY2FsbF9nb3QpOworCQl3cml0ZV9sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKKwkJbGlzdF9hZGRfdGFpbCgmY2FsbC0+YWNjZXB0X2xpbmssICZyeC0+dG9fYmVfYWNjZXB0ZWQpOworCQl3cml0ZV91bmxvY2soJnJ4LT5jYWxsX2xvY2spOworCX0KKworCXRyYWNlX3J4cnBjX3JlY3Ztc2coY2FsbCwgcnhycGNfcmVjdm1zZ190b19iZV9hY2NlcHRlZCwgMSwgMCwgMCwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRW5kIHRoZSBwYWNrZXQgcmVjZXB0aW9uIHBoYXNlLgorICovCitzdGF0aWMgdm9pZCByeHJwY19lbmRfcnhfcGhhc2Uoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHJ4cnBjX3NlcmlhbF90IHNlcmlhbCkKK3sKKwlfZW50ZXIoIiVkLCVzIiwgY2FsbC0+ZGVidWdfaWQsIHJ4cnBjX2NhbGxfc3RhdGVzW2NhbGwtPnN0YXRlXSk7CisKKwl0cmFjZV9yeHJwY19yZWNlaXZlKGNhbGwsIHJ4cnBjX3JlY2VpdmVfZW5kLCAwLCBjYWxsLT5yeF90b3ApOworCUFTU0VSVENNUChjYWxsLT5yeF9oYXJkX2FjaywgPT0sIGNhbGwtPnJ4X3RvcCk7CisKKwlpZiAoY2FsbC0+c3RhdGUgPT0gUlhSUENfQ0FMTF9DTElFTlRfUkVDVl9SRVBMWSkgeworCQlyeHJwY19wcm9wb3NlX0FDSyhjYWxsLCBSWFJQQ19BQ0tfSURMRSwgMCwgc2VyaWFsLCB0cnVlLCBmYWxzZSwKKwkJCQkgIHJ4cnBjX3Byb3Bvc2VfYWNrX3Rlcm1pbmFsX2Fjayk7CisJCXJ4cnBjX3NlbmRfY2FsbF9wYWNrZXQoY2FsbCwgUlhSUENfUEFDS0VUX1RZUEVfQUNLKTsKKwl9CisKKwl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKworCXN3aXRjaCAoY2FsbC0+c3RhdGUpIHsKKwljYXNlIFJYUlBDX0NBTExfQ0xJRU5UX1JFQ1ZfUkVQTFk6CisJCV9fcnhycGNfY2FsbF9jb21wbGV0ZWQoY2FsbCk7CisJCWJyZWFrOworCisJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9SRUNWX1JFUVVFU1Q6CisJCWNhbGwtPnR4X3BoYXNlID0gdHJ1ZTsKKwkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0tfUkVRVUVTVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKK30KKworLyoKKyAqIERpc2NhcmQgYSBwYWNrZXQgd2UndmUgdXNlZCB1cCBhbmQgYWR2YW5jZSB0aGUgUnggd2luZG93IGJ5IG9uZS4KKyAqLworc3RhdGljIHZvaWQgcnhycGNfcm90YXRlX3J4X3dpbmRvdyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCBza19idWZmICpza2I7CisJcnhycGNfc2VyaWFsX3Qgc2VyaWFsOworCXJ4cnBjX3NlcV90IGhhcmRfYWNrLCB0b3A7CisJdTggZmxhZ3M7CisJaW50IGl4OworCisJX2VudGVyKCIlZCIsIGNhbGwtPmRlYnVnX2lkKTsKKworCWhhcmRfYWNrID0gY2FsbC0+cnhfaGFyZF9hY2s7CisJdG9wID0gc21wX2xvYWRfYWNxdWlyZSgmY2FsbC0+cnhfdG9wKTsKKwlBU1NFUlQoYmVmb3JlKGhhcmRfYWNrLCB0b3ApKTsKKworCWhhcmRfYWNrKys7CisJaXggPSBoYXJkX2FjayAmIFJYUlBDX1JYVFhfQlVGRl9NQVNLOworCXNrYiA9IGNhbGwtPnJ4dHhfYnVmZmVyW2l4XTsKKwlyeHJwY19zZWVfc2tiKHNrYiwgcnhycGNfc2tiX3J4X3JvdGF0ZWQpOworCXNwID0gcnhycGNfc2tiKHNrYik7CisJZmxhZ3MgPSBzcC0+aGRyLmZsYWdzOworCXNlcmlhbCA9IHNwLT5oZHIuc2VyaWFsOworCWlmIChjYWxsLT5yeHR4X2Fubm90YXRpb25zW2l4XSAmIFJYUlBDX1JYX0FOTk9fSlVNQk8pCisJCXNlcmlhbCArPSAoY2FsbC0+cnh0eF9hbm5vdGF0aW9uc1tpeF0gJiBSWFJQQ19SWF9BTk5PX0pVTUJPKSAtIDE7CisKKwljYWxsLT5yeHR4X2J1ZmZlcltpeF0gPSBOVUxMOworCWNhbGwtPnJ4dHhfYW5ub3RhdGlvbnNbaXhdID0gMDsKKwkvKiBCYXJyaWVyIGFnYWluc3QgcnhycGNfaW5wdXRfZGF0YSgpLiAqLworCXNtcF9zdG9yZV9yZWxlYXNlKCZjYWxsLT5yeF9oYXJkX2FjaywgaGFyZF9hY2spOworCisJcnhycGNfZnJlZV9za2Ioc2tiLCByeHJwY19za2JfcnhfZnJlZWQpOworCisJX2RlYnVnKCIldSwldSwlMDJ4IiwgaGFyZF9hY2ssIHRvcCwgZmxhZ3MpOworCXRyYWNlX3J4cnBjX3JlY2VpdmUoY2FsbCwgcnhycGNfcmVjZWl2ZV9yb3RhdGUsIHNlcmlhbCwgaGFyZF9hY2spOworCWlmIChmbGFncyAmIFJYUlBDX0xBU1RfUEFDS0VUKSB7CisJCXJ4cnBjX2VuZF9yeF9waGFzZShjYWxsLCBzZXJpYWwpOworCX0gZWxzZSB7CisJCS8qIENoZWNrIHRvIHNlZSBpZiB0aGVyZSdzIGFuIEFDSyB0aGF0IG5lZWRzIHNlbmRpbmcuICovCisJCWlmIChhZnRlcl9lcShoYXJkX2FjaywgY2FsbC0+YWNrcl9jb25zdW1lZCArIDIpIHx8CisJCSAgICBhZnRlcl9lcSh0b3AsIGNhbGwtPmFja3Jfc2VlbiArIDIpIHx8CisJCSAgICAoaGFyZF9hY2sgPT0gdG9wICYmIGFmdGVyKGhhcmRfYWNrLCBjYWxsLT5hY2tyX2NvbnN1bWVkKSkpCisJCQlyeHJwY19wcm9wb3NlX0FDSyhjYWxsLCBSWFJQQ19BQ0tfREVMQVksIDAsIHNlcmlhbCwKKwkJCQkJICB0cnVlLCBmYWxzZSwKKwkJCQkJICByeHJwY19wcm9wb3NlX2Fja19yb3RhdGVfcngpOworCQlpZiAoY2FsbC0+YWNrcl9yZWFzb24pCisJCQlyeHJwY19zZW5kX2NhbGxfcGFja2V0KGNhbGwsIFJYUlBDX1BBQ0tFVF9UWVBFX0FDSyk7CisJfQorfQorCisvKgorICogRGVjcnlwdCBhbmQgdmVyaWZ5IGEgKHN1YilwYWNrZXQuICBUaGUgcGFja2V0J3MgbGVuZ3RoIG1heSBiZSBjaGFuZ2VkIGR1ZSB0bworICogcGFkZGluZywgYnV0IGlmIHRoaXMgaXMgdGhlIGNhc2UsIHRoZSBwYWNrZXQgbGVuZ3RoIHdpbGwgYmUgcmVzaWRlbnQgaW4gdGhlCisgKiBzb2NrZXQgYnVmZmVyLiAgTm90ZSB0aGF0IHdlIGNhbid0IG1vZGlmeSB0aGUgbWFzdGVyIHNrYiBpbmZvIGFzIHRoZSBza2IgbWF5CisgKiBiZSB0aGUgaG9tZSB0byBtdWx0aXBsZSBzdWJwYWNrZXRzLgorICovCitzdGF0aWMgaW50IHJ4cnBjX3ZlcmlmeV9wYWNrZXQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgdTggYW5ub3RhdGlvbiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKKwlyeHJwY19zZXFfdCBzZXEgPSBzcC0+aGRyLnNlcTsKKwl1MTYgY2tzdW0gPSBzcC0+aGRyLmNrc3VtOworCisJX2VudGVyKCIiKTsKKworCS8qIEZvciBhbGwgYnV0IHRoZSBoZWFkIGp1bWJvIHN1YnBhY2tldCwgdGhlIHNlY3VyaXR5IGNoZWNrc3VtIGlzIGluIGEKKwkgKiBqdW1ibyBoZWFkZXIgaW1tZWRpYXRlbHkgcHJpb3IgdG8gdGhlIGRhdGEuCisJICovCisJaWYgKChhbm5vdGF0aW9uICYgUlhSUENfUlhfQU5OT19KVU1CTykgPiAxKSB7CisJCV9fYmUxNiB0bXA7CisJCWlmIChza2JfY29weV9iaXRzKHNrYiwgb2Zmc2V0IC0gMiwgJnRtcCwgMikgPCAwKQorCQkJQlVHKCk7CisJCWNrc3VtID0gbnRvaHModG1wKTsKKwkJc2VxICs9IChhbm5vdGF0aW9uICYgUlhSUENfUlhfQU5OT19KVU1CTykgLSAxOworCX0KKworCXJldHVybiBjYWxsLT5jb25uLT5zZWN1cml0eS0+dmVyaWZ5X3BhY2tldChjYWxsLCBza2IsIG9mZnNldCwgbGVuLAorCQkJCQkJICAgc2VxLCBja3N1bSk7Cit9CisKKy8qCisgKiBMb2NhdGUgdGhlIGRhdGEgd2l0aGluIGEgcGFja2V0LiAgVGhpcyBpcyBjb21wbGljYXRlZCBieToKKyAqCisgKiAoMSkgQW4gc2tiIG1heSBjb250YWluIGEganVtYm8gcGFja2V0IC0gc28gd2UgaGF2ZSB0byBmaW5kIHRoZSBhcHByb3ByaWF0ZQorICogICAgIHN1YnBhY2tldC4KKyAqCisgKiAoMikgVGhlIChzdWIpcGFja2V0cyBtYXkgYmUgZW5jcnlwdGVkIGFuZCwgaWYgc28sIHRoZSBlbmNyeXB0ZWQgcG9ydGlvbgorICogICAgIGNvbnRhaW5zIGFuIGV4dHJhIGhlYWRlciB3aGljaCBpbmNsdWRlcyB0aGUgdHJ1ZSBsZW5ndGggb2YgdGhlIGRhdGEsCisgKiAgICAgZXhjbHVkaW5nIGFueSBlbmNyeXB0ZWQgcGFkZGluZy4KKyAqLworc3RhdGljIGludCByeHJwY19sb2NhdGVfZGF0YShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgdTggKl9hbm5vdGF0aW9uLAorCQkJICAgICB1bnNpZ25lZCBpbnQgKl9vZmZzZXQsIHVuc2lnbmVkIGludCAqX2xlbikKK3sKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCByeHJwY193aXJlX2hlYWRlcik7CisJdW5zaWduZWQgaW50IGxlbiA9ICpfbGVuOworCWludCByZXQ7CisJdTggYW5ub3RhdGlvbiA9ICpfYW5ub3RhdGlvbjsKKworCS8qIExvY2F0ZSB0aGUgc3VicGFja2V0ICovCisJbGVuID0gc2tiLT5sZW4gLSBvZmZzZXQ7CisJaWYgKChhbm5vdGF0aW9uICYgUlhSUENfUlhfQU5OT19KVU1CTykgPiAwKSB7CisJCW9mZnNldCArPSAoKChhbm5vdGF0aW9uICYgUlhSUENfUlhfQU5OT19KVU1CTykgLSAxKSAqCisJCQkgICBSWFJQQ19KVU1CT19TVUJQS1RMRU4pOworCQlsZW4gPSAoYW5ub3RhdGlvbiAmIFJYUlBDX1JYX0FOTk9fSkxBU1QpID8KKwkJCXNrYi0+bGVuIC0gb2Zmc2V0IDogUlhSUENfSlVNQk9fU1VCUEtUTEVOOworCX0KKworCWlmICghKGFubm90YXRpb24gJiBSWFJQQ19SWF9BTk5PX1ZFUklGSUVEKSkgeworCQlyZXQgPSByeHJwY192ZXJpZnlfcGFja2V0KGNhbGwsIHNrYiwgYW5ub3RhdGlvbiwgb2Zmc2V0LCBsZW4pOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCSpfYW5ub3RhdGlvbiB8PSBSWFJQQ19SWF9BTk5PX1ZFUklGSUVEOworCX0KKworCSpfb2Zmc2V0ID0gb2Zmc2V0OworCSpfbGVuID0gbGVuOworCWNhbGwtPmNvbm4tPnNlY3VyaXR5LT5sb2NhdGVfZGF0YShjYWxsLCBza2IsIF9vZmZzZXQsIF9sZW4pOworCXJldHVybiAwOworfQorCisvKgorICogRGVsaXZlciBtZXNzYWdlcyB0byBhIGNhbGwuICBUaGlzIGtlZXBzIHByb2Nlc3NpbmcgcGFja2V0cyB1bnRpbCB0aGUgYnVmZmVyCisgKiBpcyBmaWxsZWQgYW5kIHdlIGZpbmQgZWl0aGVyIG1vcmUgREFUQSAocmV0dXJucyAwKSBvciB0aGUgZW5kIG9mIHRoZSBEQVRBCisgKiAocmV0dXJucyAxKS4gIElmIG1vcmUgcGFja2V0cyBhcmUgcmVxdWlyZWQsIGl0IHJldHVybnMgLUVBR0FJTi4KKyAqLworc3RhdGljIGludCByeHJwY19yZWN2bXNnX2RhdGEoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkgICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBpb3ZfaXRlciAqaXRlciwKKwkJCSAgICAgIHNpemVfdCBsZW4sIGludCBmbGFncywgc2l6ZV90ICpfb2Zmc2V0KQoreworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlyeHJwY19zZXFfdCBoYXJkX2FjaywgdG9wLCBzZXE7CisJc2l6ZV90IHJlbWFpbjsKKwlib29sIGxhc3Q7CisJdW5zaWduZWQgaW50IHJ4X3BrdF9vZmZzZXQsIHJ4X3BrdF9sZW47CisJaW50IGl4LCBjb3B5LCByZXQgPSAtRUFHQUlOLCByZXQyOworCisJcnhfcGt0X29mZnNldCA9IGNhbGwtPnJ4X3BrdF9vZmZzZXQ7CisJcnhfcGt0X2xlbiA9IGNhbGwtPnJ4X3BrdF9sZW47CisKKwlpZiAoY2FsbC0+c3RhdGUgPj0gUlhSUENfQ0FMTF9TRVJWRVJfQUNLX1JFUVVFU1QpIHsKKwkJc2VxID0gY2FsbC0+cnhfaGFyZF9hY2s7CisJCXJldCA9IDE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBCYXJyaWVycyBhZ2FpbnN0IHJ4cnBjX2lucHV0X2RhdGEoKS4gKi8KKwloYXJkX2FjayA9IGNhbGwtPnJ4X2hhcmRfYWNrOworCXRvcCA9IHNtcF9sb2FkX2FjcXVpcmUoJmNhbGwtPnJ4X3RvcCk7CisJZm9yIChzZXEgPSBoYXJkX2FjayArIDE7IGJlZm9yZV9lcShzZXEsIHRvcCk7IHNlcSsrKSB7CisJCWl4ID0gc2VxICYgUlhSUENfUlhUWF9CVUZGX01BU0s7CisJCXNrYiA9IGNhbGwtPnJ4dHhfYnVmZmVyW2l4XTsKKwkJaWYgKCFza2IpIHsKKwkJCXRyYWNlX3J4cnBjX3JlY3Ztc2coY2FsbCwgcnhycGNfcmVjdm1zZ19ob2xlLCBzZXEsCisJCQkJCSAgICByeF9wa3Rfb2Zmc2V0LCByeF9wa3RfbGVuLCAwKTsKKwkJCWJyZWFrOworCQl9CisJCXNtcF9ybWIoKTsKKwkJcnhycGNfc2VlX3NrYihza2IsIHJ4cnBjX3NrYl9yeF9zZWVuKTsKKwkJc3AgPSByeHJwY19za2Ioc2tiKTsKKworCQlpZiAoIShmbGFncyAmIE1TR19QRUVLKSkKKwkJCXRyYWNlX3J4cnBjX3JlY2VpdmUoY2FsbCwgcnhycGNfcmVjZWl2ZV9mcm9udCwKKwkJCQkJICAgIHNwLT5oZHIuc2VyaWFsLCBzZXEpOworCisJCWlmIChtc2cpCisJCQlzb2NrX3JlY3ZfdGltZXN0YW1wKG1zZywgc29jay0+c2ssIHNrYik7CisKKwkJaWYgKHJ4X3BrdF9vZmZzZXQgPT0gMCkgeworCQkJcmV0MiA9IHJ4cnBjX2xvY2F0ZV9kYXRhKGNhbGwsIHNrYiwKKwkJCQkJCSAmY2FsbC0+cnh0eF9hbm5vdGF0aW9uc1tpeF0sCisJCQkJCQkgJnJ4X3BrdF9vZmZzZXQsICZyeF9wa3RfbGVuKTsKKwkJCXRyYWNlX3J4cnBjX3JlY3Ztc2coY2FsbCwgcnhycGNfcmVjdm1zZ19uZXh0LCBzZXEsCisJCQkJCSAgICByeF9wa3Rfb2Zmc2V0LCByeF9wa3RfbGVuLCByZXQyKTsKKwkJCWlmIChyZXQyIDwgMCkgeworCQkJCXJldCA9IHJldDI7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQl0cmFjZV9yeHJwY19yZWN2bXNnKGNhbGwsIHJ4cnBjX3JlY3Ztc2dfY29udCwgc2VxLAorCQkJCQkgICAgcnhfcGt0X29mZnNldCwgcnhfcGt0X2xlbiwgMCk7CisJCX0KKworCQkvKiBXZSBoYXZlIHRvIGhhbmRsZSBzaG9ydCwgZW1wdHkgYW5kIHVzZWQtdXAgREFUQSBwYWNrZXRzLiAqLworCQlyZW1haW4gPSBsZW4gLSAqX29mZnNldDsKKwkJY29weSA9IHJ4X3BrdF9sZW47CisJCWlmIChjb3B5ID4gcmVtYWluKQorCQkJY29weSA9IHJlbWFpbjsKKwkJaWYgKGNvcHkgPiAwKSB7CisJCQlyZXQyID0gc2tiX2NvcHlfZGF0YWdyYW1faXRlcihza2IsIHJ4X3BrdF9vZmZzZXQsIGl0ZXIsCisJCQkJCQkgICAgICBjb3B5KTsKKwkJCWlmIChyZXQyIDwgMCkgeworCQkJCXJldCA9IHJldDI7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCS8qIGhhbmRsZSBwaWVjZW1lYWwgY29uc3VtcHRpb24gb2YgZGF0YSBwYWNrZXRzICovCisJCQlyeF9wa3Rfb2Zmc2V0ICs9IGNvcHk7CisJCQlyeF9wa3RfbGVuIC09IGNvcHk7CisJCQkqX29mZnNldCArPSBjb3B5OworCQl9CisKKwkJaWYgKHJ4X3BrdF9sZW4gPiAwKSB7CisJCQl0cmFjZV9yeHJwY19yZWN2bXNnKGNhbGwsIHJ4cnBjX3JlY3Ztc2dfZnVsbCwgc2VxLAorCQkJCQkgICAgcnhfcGt0X29mZnNldCwgcnhfcGt0X2xlbiwgMCk7CisJCQlBU1NFUlRDTVAoKl9vZmZzZXQsID09LCBsZW4pOworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogVGhlIHdob2xlIHBhY2tldCBoYXMgYmVlbiB0cmFuc2ZlcnJlZC4gKi8KKwkJbGFzdCA9IHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVDsKKwkJaWYgKCEoZmxhZ3MgJiBNU0dfUEVFSykpCisJCQlyeHJwY19yb3RhdGVfcnhfd2luZG93KGNhbGwpOworCQlyeF9wa3Rfb2Zmc2V0ID0gMDsKKwkJcnhfcGt0X2xlbiA9IDA7CisKKwkJaWYgKGxhc3QpIHsKKwkJCUFTU0VSVENNUChzZXEsID09LCBSRUFEX09OQ0UoY2FsbC0+cnhfdG9wKSk7CisJCQlyZXQgPSAxOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKK291dDoKKwlpZiAoIShmbGFncyAmIE1TR19QRUVLKSkgeworCQljYWxsLT5yeF9wa3Rfb2Zmc2V0ID0gcnhfcGt0X29mZnNldDsKKwkJY2FsbC0+cnhfcGt0X2xlbiA9IHJ4X3BrdF9sZW47CisJfQorZG9uZToKKwl0cmFjZV9yeHJwY19yZWN2bXNnKGNhbGwsIHJ4cnBjX3JlY3Ztc2dfZGF0YV9yZXR1cm4sIHNlcSwKKwkJCSAgICByeF9wa3Rfb2Zmc2V0LCByeF9wa3RfbGVuLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZWNlaXZlIGEgbWVzc2FnZSBmcm9tIGFuIFJ4UlBDIHNvY2tldAogICogLSB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwgYWJvdXQgdHdvIG9yIG1vcmUgdGhyZWFkcyBjYWxsaW5nIHJlY3Ztc2cKICAqICAgc2ltdWx0YW5lb3VzbHkKICAqLwogaW50IHJ4cnBjX3JlY3Ztc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLAogCQkgIGludCBmbGFncykKIHsKLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOwotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsID0gTlVMTCwgKmNvbnRpbnVlX2NhbGwgPSBOVUxMOworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwogCXN0cnVjdCByeHJwY19zb2NrICpyeCA9IHJ4cnBjX3NrKHNvY2stPnNrKTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJc2l6ZV90IGNvcGllZCA9IDA7CiAJbG9uZyB0aW1lbzsKLQlpbnQgY29weSwgcmV0LCB1bGxlbiwgb2Zmc2V0LCBjb3BpZWQgPSAwOwotCXUzMiBhYm9ydF9jb2RlOworCWludCByZXQ7CiAKIAlERUZJTkVfV0FJVCh3YWl0KTsKIAotCV9lbnRlcigiLCwsJXp1LCVkIiwgbGVuLCBmbGFncyk7CisJdHJhY2VfcnhycGNfcmVjdm1zZyhOVUxMLCByeHJwY19yZWN2bXNnX2VudGVyLCAwLCAwLCAwLCAwKTsKIAogCWlmIChmbGFncyAmIChNU0dfT09CIHwgTVNHX1RSVU5DKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JdWxsZW4gPSBtc2ctPm1zZ19mbGFncyAmIE1TR19DTVNHX0NPTVBBVCA/IDQgOiBzaXplb2YodW5zaWduZWQgbG9uZyk7Ci0KIAl0aW1lbyA9IHNvY2tfcmN2dGltZW8oJnJ4LT5zaywgZmxhZ3MgJiBNU0dfRE9OVFdBSVQpOwotCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19NT1JFOwogCit0cnlfYWdhaW46CiAJbG9ja19zb2NrKCZyeC0+c2spOwogCi0JZm9yICg7OykgewotCQkvKiByZXR1cm4gaW1tZWRpYXRlbHkgaWYgYSBjbGllbnQgc29ja2V0IGhhcyBubyBvdXRzdGFuZGluZwotCQkgKiBjYWxscyAqLwotCQlpZiAoUkJfRU1QVFlfUk9PVCgmcngtPmNhbGxzKSkgewotCQkJaWYgKGNvcGllZCkKLQkJCQlnb3RvIG91dDsKLQkJCWlmIChyeC0+c2suc2tfc3RhdGUgIT0gUlhSUENfU0VSVkVSX0xJU1RFTklORykgewotCQkJCXJlbGVhc2Vfc29jaygmcngtPnNrKTsKLQkJCQlpZiAoY29udGludWVfY2FsbCkKLQkJCQkJcnhycGNfcHV0X2NhbGwoY29udGludWVfY2FsbCk7Ci0JCQkJcmV0dXJuIC1FTk9EQVRBOwotCQkJfQotCQl9Ci0KLQkJLyogZ2V0IHRoZSBuZXh0IG1lc3NhZ2Ugb24gdGhlIFJ4IHF1ZXVlICovCi0JCXNrYiA9IHNrYl9wZWVrKCZyeC0+c2suc2tfcmVjZWl2ZV9xdWV1ZSk7Ci0JCWlmICghc2tiKSB7Ci0JCQkvKiBub3RoaW5nIHJlbWFpbnMgb24gdGhlIHF1ZXVlICovCi0JCQlpZiAoY29waWVkICYmCi0JCQkgICAgKGZsYWdzICYgTVNHX1BFRUsgfHwgdGltZW8gPT0gMCkpCi0JCQkJZ290byBvdXQ7Ci0KLQkJCS8qIHdhaXQgZm9yIGEgbWVzc2FnZSB0byB0dXJuIHVwICovCi0JCQlyZWxlYXNlX3NvY2soJnJ4LT5zayk7Ci0JCQlwcmVwYXJlX3RvX3dhaXRfZXhjbHVzaXZlKHNrX3NsZWVwKCZyeC0+c2spLCAmd2FpdCwKLQkJCQkJCSAgVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCXJldCA9IHNvY2tfZXJyb3IoJnJ4LT5zayk7Ci0JCQlpZiAocmV0KQotCQkJCWdvdG8gd2FpdF9lcnJvcjsKLQotCQkJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmcngtPnNrLnNrX3JlY2VpdmVfcXVldWUpKSB7Ci0JCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJCQlnb3RvIHdhaXRfaW50ZXJydXB0ZWQ7Ci0JCQkJdGltZW8gPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvKTsKLQkJCX0KLQkJCWZpbmlzaF93YWl0KHNrX3NsZWVwKCZyeC0+c2spLCAmd2FpdCk7Ci0JCQlsb2NrX3NvY2soJnJ4LT5zayk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JcGVla19uZXh0X3BhY2tldDoKLQkJc3AgPSByeHJwY19za2Ioc2tiKTsKLQkJY2FsbCA9IHNwLT5jYWxsOwotCQlBU1NFUlQoY2FsbCAhPSBOVUxMKTsKLQotCQlfZGVidWcoIm5leHQgcGt0ICVzIiwgcnhycGNfcGt0c1tzcC0+aGRyLnR5cGVdKTsKLQotCQkvKiBtYWtlIHN1cmUgd2Ugd2FpdCBmb3IgdGhlIHN0YXRlIHRvIGJlIHVwZGF0ZWQgaW4gdGhpcyBjYWxsICovCi0JCXNwaW5fbG9ja19iaCgmY2FsbC0+bG9jayk7Ci0JCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKLQotCQlpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9SRUxFQVNFRCwgJmNhbGwtPmZsYWdzKSkgewotCQkJX2RlYnVnKCJwYWNrZXQgZnJvbSByZWxlYXNlZCBjYWxsIik7Ci0JCQlpZiAoc2tiX2RlcXVldWUoJnJ4LT5zay5za19yZWNlaXZlX3F1ZXVlKSAhPSBza2IpCi0JCQkJQlVHKCk7Ci0JCQlyeHJwY19mcmVlX3NrYihza2IpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBkZXRlcm1pbmUgd2hldGhlciB0byBjb250aW51ZSBsYXN0IGRhdGEgcmVjZWl2ZSAqLwotCQlpZiAoY29udGludWVfY2FsbCkgewotCQkJX2RlYnVnKCJtYXliZSBjb250Iik7Ci0JCQlpZiAoY2FsbCAhPSBjb250aW51ZV9jYWxsIHx8Ci0JCQkgICAgc2tiLT5tYXJrICE9IFJYUlBDX1NLQl9NQVJLX0RBVEEpIHsKLQkJCQlyZWxlYXNlX3NvY2soJnJ4LT5zayk7Ci0JCQkJcnhycGNfcHV0X2NhbGwoY29udGludWVfY2FsbCk7Ci0JCQkJX2xlYXZlKCIgPSAlZCBbbm9uY29udF0iLCBjb3BpZWQpOwotCQkJCXJldHVybiBjb3BpZWQ7Ci0JCQl9Ci0JCX0KLQotCQlyeHJwY19nZXRfY2FsbChjYWxsKTsKLQotCQkvKiBjb3B5IHRoZSBwZWVyIGFkZHJlc3MgYW5kIHRpbWVzdGFtcCAqLwotCQlpZiAoIWNvbnRpbnVlX2NhbGwpIHsKLQkJCWlmIChtc2ctPm1zZ19uYW1lKSB7Ci0JCQkJc2l6ZV90IGxlbiA9Ci0JCQkJCXNpemVvZihjYWxsLT5jb25uLT5wYXJhbXMucGVlci0+c3J4KTsKLQkJCQltZW1jcHkobXNnLT5tc2dfbmFtZSwKLQkJCQkgICAgICAgJmNhbGwtPmNvbm4tPnBhcmFtcy5wZWVyLT5zcngsIGxlbik7Ci0JCQkJbXNnLT5tc2dfbmFtZWxlbiA9IGxlbjsKLQkJCX0KLQkJCXNvY2tfcmVjdl90aW1lc3RhbXAobXNnLCAmcngtPnNrLCBza2IpOwotCQl9Ci0KLQkJLyogcmVjZWl2ZSB0aGUgbWVzc2FnZSAqLwotCQlpZiAoc2tiLT5tYXJrICE9IFJYUlBDX1NLQl9NQVJLX0RBVEEpCi0JCQlnb3RvIHJlY2VpdmVfbm9uX2RhdGFfbWVzc2FnZTsKLQotCQlfZGVidWcoInJlY3Ztc2cgREFUQSAjJXUgeyAlZCwgJWQgfSIsCi0JCSAgICAgICBzcC0+aGRyLnNlcSwgc2tiLT5sZW4sIHNwLT5vZmZzZXQpOwotCi0JCWlmICghY29udGludWVfY2FsbCkgewotCQkJLyogb25seSBzZXQgdGhlIGNvbnRyb2wgZGF0YSBvbmNlIHBlciByZWN2bXNnKCkgKi8KLQkJCXJldCA9IHB1dF9jbXNnKG1zZywgU09MX1JYUlBDLCBSWFJQQ19VU0VSX0NBTExfSUQsCi0JCQkJICAgICAgIHVsbGVuLCAmY2FsbC0+dXNlcl9jYWxsX0lEKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCWdvdG8gY29weV9lcnJvcjsKLQkJCUFTU0VSVCh0ZXN0X2JpdChSWFJQQ19DQUxMX0hBU19VU0VSSUQsICZjYWxsLT5mbGFncykpOwotCQl9Ci0KLQkJQVNTRVJUQ01QKHNwLT5oZHIuc2VxLCA+PSwgY2FsbC0+cnhfZGF0YV9yZWN2KTsKLQkJQVNTRVJUQ01QKHNwLT5oZHIuc2VxLCA8PSwgY2FsbC0+cnhfZGF0YV9yZWN2ICsgMSk7Ci0JCWNhbGwtPnJ4X2RhdGFfcmVjdiA9IHNwLT5oZHIuc2VxOwotCi0JCUFTU0VSVENNUChzcC0+aGRyLnNlcSwgPiwgY2FsbC0+cnhfZGF0YV9lYXRlbik7Ci0KLQkJb2Zmc2V0ID0gc3AtPm9mZnNldDsKLQkJY29weSA9IHNrYi0+bGVuIC0gb2Zmc2V0OwotCQlpZiAoY29weSA+IGxlbiAtIGNvcGllZCkKLQkJCWNvcHkgPSBsZW4gLSBjb3BpZWQ7Ci0KLQkJcmV0ID0gc2tiX2NvcHlfZGF0YWdyYW1fbXNnKHNrYiwgb2Zmc2V0LCBtc2csIGNvcHkpOwotCi0JCWlmIChyZXQgPCAwKQotCQkJZ290byBjb3B5X2Vycm9yOwotCi0JCS8qIGhhbmRsZSBwaWVjZW1lYWwgY29uc3VtcHRpb24gb2YgZGF0YSBwYWNrZXRzICovCi0JCV9kZWJ1ZygiY29waWVkICVkKyVkIiwgY29weSwgY29waWVkKTsKLQotCQlvZmZzZXQgKz0gY29weTsKLQkJY29waWVkICs9IGNvcHk7Ci0KLQkJaWYgKCEoZmxhZ3MgJiBNU0dfUEVFSykpCi0JCQlzcC0+b2Zmc2V0ID0gb2Zmc2V0OwotCi0JCWlmIChzcC0+b2Zmc2V0IDwgc2tiLT5sZW4pIHsKLQkJCV9kZWJ1ZygiYnVmZmVyIGZ1bGwiKTsKLQkJCUFTU0VSVENNUChjb3BpZWQsID09LCBsZW4pOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiB3ZSB0cmFuc2ZlcnJlZCB0aGUgd2hvbGUgZGF0YSBwYWNrZXQgKi8KLQkJaWYgKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVCkgewotCQkJX2RlYnVnKCJsYXN0Iik7Ci0JCQlpZiAocnhycGNfY29ubl9pc19jbGllbnQoY2FsbC0+Y29ubikpIHsKLQkJCQkgLyogbGFzdCBieXRlIG9mIHJlcGx5IHJlY2VpdmVkICovCi0JCQkJcmV0ID0gY29waWVkOwotCQkJCWdvdG8gdGVybWluYWxfbWVzc2FnZTsKLQkJCX0KLQotCQkJLyogbGFzdCBiaXQgb2YgcmVxdWVzdCByZWNlaXZlZCAqLwotCQkJaWYgKCEoZmxhZ3MgJiBNU0dfUEVFSykpIHsKLQkJCQlfZGVidWcoImVhdCBwYWNrZXQiKTsKLQkJCQlpZiAoc2tiX2RlcXVldWUoJnJ4LT5zay5za19yZWNlaXZlX3F1ZXVlKSAhPQotCQkJCSAgICBza2IpCi0JCQkJCUJVRygpOwotCQkJCXJ4cnBjX2ZyZWVfc2tiKHNrYik7Ci0JCQl9Ci0JCQltc2ctPm1zZ19mbGFncyAmPSB+TVNHX01PUkU7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIG1vdmUgb24gdG8gdGhlIG5leHQgZGF0YSBtZXNzYWdlICovCi0JCV9kZWJ1ZygibmV4dCIpOwotCQlpZiAoIWNvbnRpbnVlX2NhbGwpCi0JCQljb250aW51ZV9jYWxsID0gc3AtPmNhbGw7Ci0JCWVsc2UKLQkJCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotCQljYWxsID0gTlVMTDsKLQotCQlpZiAoZmxhZ3MgJiBNU0dfUEVFSykgewotCQkJX2RlYnVnKCJwZWVrIG5leHQiKTsKLQkJCXNrYiA9IHNrYi0+bmV4dDsKLQkJCWlmIChza2IgPT0gKHN0cnVjdCBza19idWZmICopICZyeC0+c2suc2tfcmVjZWl2ZV9xdWV1ZSkKLQkJCQlicmVhazsKLQkJCWdvdG8gcGVla19uZXh0X3BhY2tldDsKLQkJfQotCi0JCV9kZWJ1ZygiZWF0IHBhY2tldCIpOwotCQlpZiAoc2tiX2RlcXVldWUoJnJ4LT5zay5za19yZWNlaXZlX3F1ZXVlKSAhPSBza2IpCi0JCQlCVUcoKTsKLQkJcnhycGNfZnJlZV9za2Ioc2tiKTsKKwkvKiBSZXR1cm4gaW1tZWRpYXRlbHkgaWYgYSBjbGllbnQgc29ja2V0IGhhcyBubyBvdXRzdGFuZGluZyBjYWxscyAqLworCWlmIChSQl9FTVBUWV9ST09UKCZyeC0+Y2FsbHMpICYmCisJICAgIGxpc3RfZW1wdHkoJnJ4LT5yZWN2bXNnX3EpICYmCisJICAgIHJ4LT5zay5za19zdGF0ZSAhPSBSWFJQQ19TRVJWRVJfTElTVEVOSU5HKSB7CisJCXJlbGVhc2Vfc29jaygmcngtPnNrKTsKKwkJcmV0dXJuIC1FTk9EQVRBOwogCX0KIAotCS8qIGVuZCBvZiBub24tdGVybWluYWwgZGF0YSBwYWNrZXQgcmVjZXB0aW9uIGZvciB0aGUgbW9tZW50ICovCi0JX2RlYnVnKCJlbmQgcmN2IGRhdGEiKTsKLW91dDoKLQlyZWxlYXNlX3NvY2soJnJ4LT5zayk7Ci0JaWYgKGNhbGwpCi0JCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotCWlmIChjb250aW51ZV9jYWxsKQotCQlyeHJwY19wdXRfY2FsbChjb250aW51ZV9jYWxsKTsKLQlfbGVhdmUoIiA9ICVkIFtkYXRhXSIsIGNvcGllZCk7Ci0JcmV0dXJuIGNvcGllZDsKLQotCS8qIGhhbmRsZSBub24tREFUQSBtZXNzYWdlcyBzdWNoIGFzIGFib3J0cywgaW5jb21pbmcgY29ubmVjdGlvbnMgYW5kCi0JICogZmluYWwgQUNLcyAqLwotcmVjZWl2ZV9ub25fZGF0YV9tZXNzYWdlOgotCV9kZWJ1Zygibm9uLWRhdGEiKTsKLQotCWlmIChza2ItPm1hcmsgPT0gUlhSUENfU0tCX01BUktfTkVXX0NBTEwpIHsKLQkJX2RlYnVnKCJSRUNWIE5FVyBDQUxMIik7Ci0JCXJldCA9IHB1dF9jbXNnKG1zZywgU09MX1JYUlBDLCBSWFJQQ19ORVdfQ0FMTCwgMCwgJmFib3J0X2NvZGUpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gY29weV9lcnJvcjsKLQkJaWYgKCEoZmxhZ3MgJiBNU0dfUEVFSykpIHsKLQkJCWlmIChza2JfZGVxdWV1ZSgmcngtPnNrLnNrX3JlY2VpdmVfcXVldWUpICE9IHNrYikKLQkJCQlCVUcoKTsKLQkJCXJ4cnBjX2ZyZWVfc2tiKHNrYik7CisJaWYgKGxpc3RfZW1wdHkoJnJ4LT5yZWN2bXNnX3EpKSB7CisJCXJldCA9IC1FV09VTERCTE9DSzsKKwkJaWYgKHRpbWVvID09IDApIHsKKwkJCWNhbGwgPSBOVUxMOworCQkJZ290byBlcnJvcl9ub19jYWxsOwogCQl9Ci0JCWdvdG8gb3V0OworCisJCXJlbGVhc2Vfc29jaygmcngtPnNrKTsKKworCQkvKiBXYWl0IGZvciBzb21ldGhpbmcgdG8gaGFwcGVuICovCisJCXByZXBhcmVfdG9fd2FpdF9leGNsdXNpdmUoc2tfc2xlZXAoJnJ4LT5zayksICZ3YWl0LAorCQkJCQkgIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXJldCA9IHNvY2tfZXJyb3IoJnJ4LT5zayk7CisJCWlmIChyZXQpCisJCQlnb3RvIHdhaXRfZXJyb3I7CisKKwkJaWYgKGxpc3RfZW1wdHkoJnJ4LT5yZWN2bXNnX3EpKSB7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJZ290byB3YWl0X2ludGVycnVwdGVkOworCQkJdHJhY2VfcnhycGNfcmVjdm1zZyhOVUxMLCByeHJwY19yZWN2bXNnX3dhaXQsCisJCQkJCSAgICAwLCAwLCAwLCAwKTsKKwkJCXRpbWVvID0gc2NoZWR1bGVfdGltZW91dCh0aW1lbyk7CisJCX0KKwkJZmluaXNoX3dhaXQoc2tfc2xlZXAoJnJ4LT5zayksICZ3YWl0KTsKKwkJZ290byB0cnlfYWdhaW47CiAJfQogCi0JcmV0ID0gcHV0X2Ntc2cobXNnLCBTT0xfUlhSUEMsIFJYUlBDX1VTRVJfQ0FMTF9JRCwKLQkJICAgICAgIHVsbGVuLCAmY2FsbC0+dXNlcl9jYWxsX0lEKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBjb3B5X2Vycm9yOwotCUFTU0VSVCh0ZXN0X2JpdChSWFJQQ19DQUxMX0hBU19VU0VSSUQsICZjYWxsLT5mbGFncykpOworCS8qIEZpbmQgdGhlIG5leHQgY2FsbCBhbmQgZGVxdWV1ZSBpdCBpZiB3ZSdyZSBub3QganVzdCBwZWVraW5nLiAgSWYgd2UKKwkgKiBkbyBkZXF1ZXVlIGl0LCB0aGF0IGNvbWVzIHdpdGggYSByZWYgdGhhdCB3ZSB3aWxsIG5lZWQgdG8gcmVsZWFzZS4KKwkgKi8KKwl3cml0ZV9sb2NrX2JoKCZyeC0+cmVjdm1zZ19sb2NrKTsKKwlsID0gcngtPnJlY3Ztc2dfcS5uZXh0OworCWNhbGwgPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCByeHJwY19jYWxsLCByZWN2bXNnX2xpbmspOworCWlmICghKGZsYWdzICYgTVNHX1BFRUspKQorCQlsaXN0X2RlbF9pbml0KCZjYWxsLT5yZWN2bXNnX2xpbmspOworCWVsc2UKKwkJcnhycGNfZ2V0X2NhbGwoY2FsbCwgcnhycGNfY2FsbF9nb3QpOworCXdyaXRlX3VubG9ja19iaCgmcngtPnJlY3Ztc2dfbG9jayk7CiAKLQlzd2l0Y2ggKHNrYi0+bWFyaykgewotCWNhc2UgUlhSUENfU0tCX01BUktfREFUQToKKwl0cmFjZV9yeHJwY19yZWN2bXNnKGNhbGwsIHJ4cnBjX3JlY3Ztc2dfZGVxdWV1ZSwgMCwgMCwgMCwgMCk7CisKKwlpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9SRUxFQVNFRCwgJmNhbGwtPmZsYWdzKSkKIAkJQlVHKCk7Ci0JY2FzZSBSWFJQQ19TS0JfTUFSS19GSU5BTF9BQ0s6Ci0JCXJldCA9IHB1dF9jbXNnKG1zZywgU09MX1JYUlBDLCBSWFJQQ19BQ0ssIDAsICZhYm9ydF9jb2RlKTsKKworCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX0hBU19VU0VSSUQsICZjYWxsLT5mbGFncykpIHsKKwkJaWYgKGZsYWdzICYgTVNHX0NNU0dfQ09NUEFUKSB7CisJCQl1bnNpZ25lZCBpbnQgaWQzMiA9IGNhbGwtPnVzZXJfY2FsbF9JRDsKKworCQkJcmV0ID0gcHV0X2Ntc2cobXNnLCBTT0xfUlhSUEMsIFJYUlBDX1VTRVJfQ0FMTF9JRCwKKwkJCQkgICAgICAgc2l6ZW9mKHVuc2lnbmVkIGludCksICZpZDMyKTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IHB1dF9jbXNnKG1zZywgU09MX1JYUlBDLCBSWFJQQ19VU0VSX0NBTExfSUQsCisJCQkJICAgICAgIHNpemVvZih1bnNpZ25lZCBsb25nKSwKKwkJCQkgICAgICAgJmNhbGwtPnVzZXJfY2FsbF9JRCk7CisJCX0KKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycm9yOworCX0KKworCWlmIChtc2ctPm1zZ19uYW1lKSB7CisJCXNpemVfdCBsZW4gPSBzaXplb2YoY2FsbC0+Y29ubi0+cGFyYW1zLnBlZXItPnNyeCk7CisJCW1lbWNweShtc2ctPm1zZ19uYW1lLCAmY2FsbC0+Y29ubi0+cGFyYW1zLnBlZXItPnNyeCwgbGVuKTsKKwkJbXNnLT5tc2dfbmFtZWxlbiA9IGxlbjsKKwl9CisKKwlzd2l0Y2ggKGNhbGwtPnN0YXRlKSB7CisJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0NFUFRJTkc6CisJCXJldCA9IHJ4cnBjX3JlY3Ztc2dfbmV3X2NhbGwocngsIGNhbGwsIG1zZywgZmxhZ3MpOwogCQlicmVhazsKLQljYXNlIFJYUlBDX1NLQl9NQVJLX0JVU1k6Ci0JCXJldCA9IHB1dF9jbXNnKG1zZywgU09MX1JYUlBDLCBSWFJQQ19CVVNZLCAwLCAmYWJvcnRfY29kZSk7Ci0JCWJyZWFrOwotCWNhc2UgUlhSUENfU0tCX01BUktfUkVNT1RFX0FCT1JUOgotCQlhYm9ydF9jb2RlID0gY2FsbC0+cmVtb3RlX2Fib3J0OwotCQlyZXQgPSBwdXRfY21zZyhtc2csIFNPTF9SWFJQQywgUlhSUENfQUJPUlQsIDQsICZhYm9ydF9jb2RlKTsKLQkJYnJlYWs7Ci0JY2FzZSBSWFJQQ19TS0JfTUFSS19MT0NBTF9BQk9SVDoKLQkJYWJvcnRfY29kZSA9IGNhbGwtPmxvY2FsX2Fib3J0OwotCQlyZXQgPSBwdXRfY21zZyhtc2csIFNPTF9SWFJQQywgUlhSUENfQUJPUlQsIDQsICZhYm9ydF9jb2RlKTsKLQkJYnJlYWs7Ci0JY2FzZSBSWFJQQ19TS0JfTUFSS19ORVRfRVJST1I6Ci0JCV9kZWJ1ZygiUkVDViBORVQgRVJST1IgJWQiLCBzcC0+ZXJyb3IpOwotCQlhYm9ydF9jb2RlID0gc3AtPmVycm9yOwotCQlyZXQgPSBwdXRfY21zZyhtc2csIFNPTF9SWFJQQywgUlhSUENfTkVUX0VSUk9SLCA0LCAmYWJvcnRfY29kZSk7Ci0JCWJyZWFrOwotCWNhc2UgUlhSUENfU0tCX01BUktfTE9DQUxfRVJST1I6Ci0JCV9kZWJ1ZygiUkVDViBMT0NBTCBFUlJPUiAlZCIsIHNwLT5lcnJvcik7Ci0JCWFib3J0X2NvZGUgPSBzcC0+ZXJyb3I7Ci0JCXJldCA9IHB1dF9jbXNnKG1zZywgU09MX1JYUlBDLCBSWFJQQ19MT0NBTF9FUlJPUiwgNCwKLQkJCSAgICAgICAmYWJvcnRfY29kZSk7CisJY2FzZSBSWFJQQ19DQUxMX0NMSUVOVF9SRUNWX1JFUExZOgorCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfUkVDVl9SRVFVRVNUOgorCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfQUNLX1JFUVVFU1Q6CisJCXJldCA9IHJ4cnBjX3JlY3Ztc2dfZGF0YShzb2NrLCBjYWxsLCBtc2csICZtc2ctPm1zZ19pdGVyLCBsZW4sCisJCQkJCSBmbGFncywgJmNvcGllZCk7CisJCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJCXJldCA9IDA7CisKKwkJaWYgKGFmdGVyKGNhbGwtPnJ4X3RvcCwgY2FsbC0+cnhfaGFyZF9hY2spICYmCisJCSAgICBjYWxsLT5yeHR4X2J1ZmZlclsoY2FsbC0+cnhfaGFyZF9hY2sgKyAxKSAmIFJYUlBDX1JYVFhfQlVGRl9NQVNLXSkKKwkJCXJ4cnBjX25vdGlmeV9zb2NrZXQoY2FsbCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByX2VycigiVW5rbm93biBwYWNrZXQgbWFyayAldVxuIiwgc2tiLT5tYXJrKTsKLQkJQlVHKCk7CisJCXJldCA9IDA7CiAJCWJyZWFrOwogCX0KIAogCWlmIChyZXQgPCAwKQotCQlnb3RvIGNvcHlfZXJyb3I7CisJCWdvdG8gZXJyb3I7CiAKLXRlcm1pbmFsX21lc3NhZ2U6Ci0JX2RlYnVnKCJ0ZXJtaW5hbCIpOwotCW1zZy0+bXNnX2ZsYWdzICY9IH5NU0dfTU9SRTsKLQltc2ctPm1zZ19mbGFncyB8PSBNU0dfRU9SOwotCi0JaWYgKCEoZmxhZ3MgJiBNU0dfUEVFSykpIHsKLQkJX25ldCgiZnJlZSB0ZXJtaW5hbCBza2IgJXAiLCBza2IpOwotCQlpZiAoc2tiX2RlcXVldWUoJnJ4LT5zay5za19yZWNlaXZlX3F1ZXVlKSAhPSBza2IpCi0JCQlCVUcoKTsKLQkJcnhycGNfZnJlZV9za2Ioc2tiKTsKLQkJcnhycGNfcmVtb3ZlX3VzZXJfSUQocngsIGNhbGwpOworCWlmIChjYWxsLT5zdGF0ZSA9PSBSWFJQQ19DQUxMX0NPTVBMRVRFKSB7CisJCXJldCA9IHJ4cnBjX3JlY3Ztc2dfdGVybShjYWxsLCBtc2cpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWlmICghKGZsYWdzICYgTVNHX1BFRUspKQorCQkJcnhycGNfcmVsZWFzZV9jYWxsKHJ4LCBjYWxsKTsKKwkJbXNnLT5tc2dfZmxhZ3MgfD0gTVNHX0VPUjsKKwkJcmV0ID0gMTsKIAl9CiAKLQlyZWxlYXNlX3NvY2soJnJ4LT5zayk7Ci0JcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0JaWYgKGNvbnRpbnVlX2NhbGwpCi0JCXJ4cnBjX3B1dF9jYWxsKGNvbnRpbnVlX2NhbGwpOwotCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCXJldHVybiByZXQ7CisJaWYgKHJldCA9PSAwKQorCQltc2ctPm1zZ19mbGFncyB8PSBNU0dfTU9SRTsKKwllbHNlCisJCW1zZy0+bXNnX2ZsYWdzICY9IH5NU0dfTU9SRTsKKwlyZXQgPSBjb3BpZWQ7CiAKLWNvcHlfZXJyb3I6Ci0JX2RlYnVnKCJjb3B5IGVycm9yIik7CitlcnJvcjoKKwlyeHJwY19wdXRfY2FsbChjYWxsLCByeHJwY19jYWxsX3B1dCk7CitlcnJvcl9ub19jYWxsOgogCXJlbGVhc2Vfc29jaygmcngtPnNrKTsKLQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLQlpZiAoY29udGludWVfY2FsbCkKLQkJcnhycGNfcHV0X2NhbGwoY29udGludWVfY2FsbCk7Ci0JX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJdHJhY2VfcnhycGNfcmVjdm1zZyhjYWxsLCByeHJwY19yZWN2bXNnX3JldHVybiwgMCwgMCwgMCwgcmV0KTsKIAlyZXR1cm4gcmV0OwogCiB3YWl0X2ludGVycnVwdGVkOgogCXJldCA9IHNvY2tfaW50cl9lcnJubyh0aW1lbyk7CiB3YWl0X2Vycm9yOgogCWZpbmlzaF93YWl0KHNrX3NsZWVwKCZyeC0+c2spLCAmd2FpdCk7Ci0JaWYgKGNvbnRpbnVlX2NhbGwpCi0JCXJ4cnBjX3B1dF9jYWxsKGNvbnRpbnVlX2NhbGwpOwotCWlmIChjb3BpZWQpCi0JCWNvcGllZCA9IHJldDsKLQlfbGVhdmUoIiA9ICVkIFt3YWl0ZmFpbCAlZF0iLCBjb3BpZWQsIHJldCk7Ci0JcmV0dXJuIGNvcGllZDsKLQorCWNhbGwgPSBOVUxMOworCWdvdG8gZXJyb3Jfbm9fY2FsbDsKIH0KIAogLyoqCi0gKiByeHJwY19rZXJuZWxfZGF0YV9kZWxpdmVyZWQgLSBSZWNvcmQgZGVsaXZlcnkgb2YgZGF0YSBtZXNzYWdlCi0gKiBAc2tiOiBNZXNzYWdlIGhvbGRpbmcgZGF0YQorICogcnhycGNfa2VybmVsX3JlY3ZfZGF0YSAtIEFsbG93IGEga2VybmVsIHNlcnZpY2UgdG8gcmVjZWl2ZSBkYXRhL2luZm8KKyAqIEBzb2NrOiBUaGUgc29ja2V0IHRoYXQgdGhlIGNhbGwgZXhpc3RzIG9uCisgKiBAY2FsbDogVGhlIGNhbGwgdG8gc2VuZCBkYXRhIHRocm91Z2gKKyAqIEBidWY6IFRoZSBidWZmZXIgdG8gcmVjZWl2ZSBpbnRvCisgKiBAc2l6ZTogVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciwgaW5jbHVkaW5nIGRhdGEgYWxyZWFkeSByZWFkCisgKiBAX29mZnNldDogVGhlIHJ1bm5pbmcgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlci4KKyAqIEB3YW50X21vcmU6IFRydWUgaWYgbW9yZSBkYXRhIGlzIGV4cGVjdGVkIHRvIGJlIHJlYWQKKyAqIEBfYWJvcnQ6IFdoZXJlIHRoZSBhYm9ydCBjb2RlIGlzIHN0b3JlZCBpZiAtRUNPTk5BQk9SVEVEIGlzIHJldHVybmVkCiAgKgotICogUmVjb3JkIHRoZSBkZWxpdmVyeSBvZiBhIGRhdGEgbWVzc2FnZS4gIFRoaXMgcGVybWl0cyBSeFJQQyB0byBrZWVwIGl0cwotICogdHJhY2tpbmcgY29ycmVjdC4gIFRoZSBzb2NrZXQgYnVmZmVyIHdpbGwgYmUgZGVsZXRlZC4KLSAqLwotdm9pZCByeHJwY19rZXJuZWxfZGF0YV9kZWxpdmVyZWQoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwID0gcnhycGNfc2tiKHNrYik7Ci0Jc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwgPSBzcC0+Y2FsbDsKLQotCUFTU0VSVENNUChzcC0+aGRyLnNlcSwgPj0sIGNhbGwtPnJ4X2RhdGFfcmVjdik7Ci0JQVNTRVJUQ01QKHNwLT5oZHIuc2VxLCA8PSwgY2FsbC0+cnhfZGF0YV9yZWN2ICsgMSk7Ci0JY2FsbC0+cnhfZGF0YV9yZWN2ID0gc3AtPmhkci5zZXE7Ci0KLQlBU1NFUlRDTVAoc3AtPmhkci5zZXEsID4sIGNhbGwtPnJ4X2RhdGFfZWF0ZW4pOwotCXJ4cnBjX2ZyZWVfc2tiKHNrYik7Ci19Ci0KLUVYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2RhdGFfZGVsaXZlcmVkKTsKLQotLyoqCi0gKiByeHJwY19rZXJuZWxfaXNfZGF0YV9sYXN0IC0gRGV0ZXJtaW5lIGlmIGRhdGEgbWVzc2FnZSBpcyBsYXN0IG9uZQotICogQHNrYjogTWVzc2FnZSBob2xkaW5nIGRhdGEKKyAqIEFsbG93IGEga2VybmVsIHNlcnZpY2UgdG8gcmVjZWl2ZSBkYXRhIGFuZCBwaWNrIHVwIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICogc3RhdGUgb2YgYSBjYWxsLiAgUmV0dXJucyAwIGlmIGdvdCB3aGF0IHdhcyBhc2tlZCBmb3IgYW5kIHRoZXJlJ3MgbW9yZQorICogYXZhaWxhYmxlLCAxIGlmIHdlIGdvdCB3aGF0IHdhcyBhc2tlZCBmb3IgYW5kIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGRhdGEKKyAqIGFuZCAtRUFHQUlOIGlmIHdlIG5lZWQgbW9yZSBkYXRhLgogICoKLSAqIERldGVybWluZSBpZiBkYXRhIG1lc3NhZ2UgaXMgbGFzdCBvbmUgZm9yIHRoZSBwYXJlbnQgY2FsbC4KLSAqLwotYm9vbCByeHJwY19rZXJuZWxfaXNfZGF0YV9sYXN0KHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCA9IHJ4cnBjX3NrYihza2IpOwotCi0JQVNTRVJUQ01QKHNrYi0+bWFyaywgPT0sIFJYUlBDX1NLQl9NQVJLX0RBVEEpOwotCi0JcmV0dXJuIHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVDsKLX0KLQotRVhQT1JUX1NZTUJPTChyeHJwY19rZXJuZWxfaXNfZGF0YV9sYXN0KTsKLQotLyoqCi0gKiByeHJwY19rZXJuZWxfZ2V0X2Fib3J0X2NvZGUgLSBHZXQgdGhlIGFib3J0IGNvZGUgZnJvbSBhbiBSeFJQQyBhYm9ydCBtZXNzYWdlCi0gKiBAc2tiOiBNZXNzYWdlIGluZGljYXRpbmcgYW4gYWJvcnQKKyAqIE5vdGUgdGhhdCB3ZSBtYXkgcmV0dXJuIC1FQUdBSU4gdG8gZHJhaW4gZW1wdHkgcGFja2V0cyBhdCB0aGUgZW5kIG9mIHRoZQorICogZGF0YSwgZXZlbiBpZiB3ZSd2ZSBhbHJlYWR5IGNvcGllZCBvdmVyIHRoZSByZXF1ZXN0ZWQgZGF0YS4KICAqCi0gKiBHZXQgdGhlIGFib3J0IGNvZGUgZnJvbSBhbiBSeFJQQyBhYm9ydCBtZXNzYWdlLgorICogVGhpcyBmdW5jdGlvbiBhZGRzIHRoZSBhbW91bnQgaXQgdHJhbnNmZXJzIHRvICpfb2Zmc2V0LCBzbyB0aGlzIHNob3VsZCBiZQorICogcHJlY2xlYXJlZCBhcyBhcHByb3ByaWF0ZS4gIE5vdGUgdGhhdCB0aGUgYW1vdW50IHJlbWFpbmluZyBpbiB0aGUgYnVmZmVyIGlzCisgKiB0YWtlbiB0byBiZSBzaXplIC0gKl9vZmZzZXQuCisgKgorICogKl9hYm9ydCBzaG91bGQgYWxzbyBiZSBpbml0aWFsaXNlZCB0byAwLgogICovCi11MzIgcnhycGNfa2VybmVsX2dldF9hYm9ydF9jb2RlKHN0cnVjdCBza19idWZmICpza2IpCitpbnQgcnhycGNfa2VybmVsX3JlY3ZfZGF0YShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCSAgIHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUsIHNpemVfdCAqX29mZnNldCwKKwkJCSAgIGJvb2wgd2FudF9tb3JlLCB1MzIgKl9hYm9ydCkKIHsKLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwID0gcnhycGNfc2tiKHNrYik7CisJc3RydWN0IGlvdl9pdGVyIGl0ZXI7CisJc3RydWN0IGt2ZWMgaW92OworCWludCByZXQ7CiAKLQlzd2l0Y2ggKHNrYi0+bWFyaykgewotCWNhc2UgUlhSUENfU0tCX01BUktfUkVNT1RFX0FCT1JUOgotCQlyZXR1cm4gc3AtPmNhbGwtPnJlbW90ZV9hYm9ydDsKLQljYXNlIFJYUlBDX1NLQl9NQVJLX0xPQ0FMX0FCT1JUOgotCQlyZXR1cm4gc3AtPmNhbGwtPmxvY2FsX2Fib3J0OworCV9lbnRlcigieyVkLCVzfSwlenUvJXp1LCVkIiwKKwkgICAgICAgY2FsbC0+ZGVidWdfaWQsIHJ4cnBjX2NhbGxfc3RhdGVzW2NhbGwtPnN0YXRlXSwKKwkgICAgICAgKl9vZmZzZXQsIHNpemUsIHdhbnRfbW9yZSk7CisKKwlBU1NFUlRDTVAoKl9vZmZzZXQsIDw9LCBzaXplKTsKKwlBU1NFUlRDTVAoY2FsbC0+c3RhdGUsICE9LCBSWFJQQ19DQUxMX1NFUlZFUl9BQ0NFUFRJTkcpOworCisJaW92Lmlvdl9iYXNlID0gYnVmICsgKl9vZmZzZXQ7CisJaW92Lmlvdl9sZW4gPSBzaXplIC0gKl9vZmZzZXQ7CisJaW92X2l0ZXJfa3ZlYygmaXRlciwgSVRFUl9LVkVDIHwgUkVBRCwgJmlvdiwgMSwgc2l6ZSAtICpfb2Zmc2V0KTsKKworCWxvY2tfc29jayhzb2NrLT5zayk7CisKKwlzd2l0Y2ggKGNhbGwtPnN0YXRlKSB7CisJY2FzZSBSWFJQQ19DQUxMX0NMSUVOVF9SRUNWX1JFUExZOgorCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfUkVDVl9SRVFVRVNUOgorCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfQUNLX1JFUVVFU1Q6CisJCXJldCA9IHJ4cnBjX3JlY3Ztc2dfZGF0YShzb2NrLCBjYWxsLCBOVUxMLCAmaXRlciwgc2l6ZSwgMCwKKwkJCQkJIF9vZmZzZXQpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCisJCS8qIFdlIGNhbiBvbmx5IHJlYWNoIGhlcmUgd2l0aCBhIHBhcnRpYWxseSBmdWxsIGJ1ZmZlciBpZiB3ZQorCQkgKiBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZGF0YS4gIFdlIG11c3Qgb3RoZXJ3aXNlIGhhdmUgYQorCQkgKiBmdWxsIGJ1ZmZlciBvciBoYXZlIGJlZW4gZ2l2ZW4gLUVBR0FJTi4KKwkJICovCisJCWlmIChyZXQgPT0gMSkgeworCQkJaWYgKCpfb2Zmc2V0IDwgc2l6ZSkKKwkJCQlnb3RvIHNob3J0X2RhdGE7CisJCQlpZiAoIXdhbnRfbW9yZSkKKwkJCQlnb3RvIHJlYWRfcGhhc2VfY29tcGxldGU7CisJCQlyZXQgPSAwOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoIXdhbnRfbW9yZSkKKwkJCWdvdG8gZXhjZXNzX2RhdGE7CisJCWdvdG8gb3V0OworCisJY2FzZSBSWFJQQ19DQUxMX0NPTVBMRVRFOgorCQlnb3RvIGNhbGxfY29tcGxldGU7CisKIAlkZWZhdWx0OgotCQlCVUcoKTsKKwkJcmV0ID0gLUVJTlBST0dSRVNTOworCQlnb3RvIG91dDsKIAl9CisKK3JlYWRfcGhhc2VfY29tcGxldGU6CisJcmV0ID0gMTsKK291dDoKKwlyZWxlYXNlX3NvY2soc29jay0+c2spOworCV9sZWF2ZSgiID0gJWQgWyV6dSwlZF0iLCByZXQsICpfb2Zmc2V0LCAqX2Fib3J0KTsKKwlyZXR1cm4gcmV0OworCitzaG9ydF9kYXRhOgorCXJldCA9IC1FQkFETVNHOworCWdvdG8gb3V0OworZXhjZXNzX2RhdGE6CisJcmV0ID0gLUVNU0dTSVpFOworCWdvdG8gb3V0OworY2FsbF9jb21wbGV0ZToKKwkqX2Fib3J0ID0gY2FsbC0+YWJvcnRfY29kZTsKKwlyZXQgPSBjYWxsLT5lcnJvcjsKKwlpZiAoY2FsbC0+Y29tcGxldGlvbiA9PSBSWFJQQ19DQUxMX1NVQ0NFRURFRCkgeworCQlyZXQgPSAxOworCQlpZiAoc2l6ZSA+IDApCisJCQlyZXQgPSAtRUNPTk5SRVNFVDsKKwl9CisJZ290byBvdXQ7CiB9Ci0KLUVYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2dldF9hYm9ydF9jb2RlKTsKLQotLyoqCi0gKiByeHJwY19rZXJuZWxfZ2V0X2Vycm9yIC0gR2V0IHRoZSBlcnJvciBudW1iZXIgZnJvbSBhbiBSeFJQQyBlcnJvciBtZXNzYWdlCi0gKiBAc2tiOiBNZXNzYWdlIGluZGljYXRpbmcgYW4gZXJyb3IKLSAqCi0gKiBHZXQgdGhlIGVycm9yIG51bWJlciBmcm9tIGFuIFJ4UlBDIGVycm9yIG1lc3NhZ2UuCi0gKi8KLWludCByeHJwY19rZXJuZWxfZ2V0X2Vycm9yX251bWJlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKLQotCXJldHVybiBzcC0+ZXJyb3I7Ci19Ci0KLUVYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2dldF9lcnJvcl9udW1iZXIpOworRVhQT1JUX1NZTUJPTChyeHJwY19rZXJuZWxfcmVjdl9kYXRhKTsKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9yeGthZC5jIGIvbmV0L3J4cnBjL3J4a2FkLmMKaW5kZXggNjNhZmE5ZS4uNjI3YWJlZCAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL3J4a2FkLmMKKysrIGIvbmV0L3J4cnBjL3J4a2FkLmMKQEAgLTgwLDEyICs4MCwxMCBAQAogCWNhc2UgUlhSUENfU0VDVVJJVFlfQVVUSDoKIAkJY29ubi0+c2l6ZV9hbGlnbiA9IDg7CiAJCWNvbm4tPnNlY3VyaXR5X3NpemUgPSBzaXplb2Yoc3RydWN0IHJ4a2FkX2xldmVsMV9oZHIpOwotCQljb25uLT5oZWFkZXJfc2l6ZSArPSBzaXplb2Yoc3RydWN0IHJ4a2FkX2xldmVsMV9oZHIpOwogCQlicmVhazsKIAljYXNlIFJYUlBDX1NFQ1VSSVRZX0VOQ1JZUFQ6CiAJCWNvbm4tPnNpemVfYWxpZ24gPSA4OwogCQljb25uLT5zZWN1cml0eV9zaXplID0gc2l6ZW9mKHN0cnVjdCByeGthZF9sZXZlbDJfaGRyKTsKLQkJY29ubi0+aGVhZGVyX3NpemUgKz0gc2l6ZW9mKHN0cnVjdCByeGthZF9sZXZlbDJfaGRyKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVLRVlSRUpFQ1RFRDsKQEAgLTE2MSw3ICsxNTksNyBAQAogCiAJX2VudGVyKCIiKTsKIAotCWNoZWNrID0gc3AtPmhkci5zZXEgXiBzcC0+aGRyLmNhbGxOdW1iZXI7CisJY2hlY2sgPSBzcC0+aGRyLnNlcSBeIGNhbGwtPmNhbGxfaWQ7CiAJZGF0YV9zaXplIHw9ICh1MzIpY2hlY2sgPDwgMTY7CiAKIAloZHIuZGF0YV9zaXplID0gaHRvbmwoZGF0YV9zaXplKTsKQEAgLTIwNSw3ICsyMDMsNyBAQAogCiAJX2VudGVyKCIiKTsKIAotCWNoZWNrID0gc3AtPmhkci5zZXEgXiBzcC0+aGRyLmNhbGxOdW1iZXI7CisJY2hlY2sgPSBzcC0+aGRyLnNlcSBeIGNhbGwtPmNhbGxfaWQ7CiAKIAlyeGtoZHIuZGF0YV9zaXplID0gaHRvbmwoZGF0YV9zaXplIHwgKHUzMiljaGVjayA8PCAxNik7CiAJcnhraGRyLmNoZWNrc3VtID0gMDsKQEAgLTI3NSw5ICsyNzMsOSBAQAogCW1lbWNweSgmaXYsIGNhbGwtPmNvbm4tPmNzdW1faXYueCwgc2l6ZW9mKGl2KSk7CiAKIAkvKiBjYWxjdWxhdGUgdGhlIHNlY3VyaXR5IGNoZWNrc3VtICovCi0JeCA9IGNhbGwtPmNoYW5uZWwgPDwgKDMyIC0gUlhSUENfQ0lEU0hJRlQpOworCXggPSAoY2FsbC0+Y2lkICYgUlhSUENfQ0hBTk5FTE1BU0spIDw8ICgzMiAtIFJYUlBDX0NJRFNISUZUKTsKIAl4IHw9IHNwLT5oZHIuc2VxICYgMHgzZmZmZmZmZjsKLQljYWxsLT5jcnlwdG9fYnVmWzBdID0gaHRvbmwoc3AtPmhkci5jYWxsTnVtYmVyKTsKKwljYWxsLT5jcnlwdG9fYnVmWzBdID0gaHRvbmwoY2FsbC0+Y2FsbF9pZCk7CiAJY2FsbC0+Y3J5cHRvX2J1ZlsxXSA9IGh0b25sKHgpOwogCiAJc2dfaW5pdF9vbmUoJnNnLCBjYWxsLT5jcnlwdG9fYnVmLCA4KTsKQEAgLTMxNiwxMiArMzE0LDExIEBACiAvKgogICogZGVjcnlwdCBwYXJ0aWFsIGVuY3J5cHRpb24gb24gYSBwYWNrZXQgKGxldmVsIDEgc2VjdXJpdHkpCiAgKi8KLXN0YXRpYyBpbnQgcnhrYWRfdmVyaWZ5X3BhY2tldF9hdXRoKGNvbnN0IHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICB1MzIgKl9hYm9ydF9jb2RlKQorc3RhdGljIGludCByeGthZF92ZXJpZnlfcGFja2V0XzEoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW4sCisJCQkJIHJ4cnBjX3NlcV90IHNlcSkKIHsKIAlzdHJ1Y3QgcnhrYWRfbGV2ZWwxX2hkciBzZWNoZHI7Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKIAlTS0NJUEhFUl9SRVFVRVNUX09OX1NUQUNLKHJlcSwgY2FsbC0+Y29ubi0+Y2lwaGVyKTsKIAlzdHJ1Y3QgcnhycGNfY3J5cHQgaXY7CiAJc3RydWN0IHNjYXR0ZXJsaXN0IHNnWzE2XTsKQEAgLTMzMiwxNSArMzI5LDIwIEBACiAKIAlfZW50ZXIoIiIpOwogCi0Jc3AgPSByeHJwY19za2Ioc2tiKTsKKwlpZiAobGVuIDwgOCkgeworCQlyeHJwY19hYm9ydF9jYWxsKCJWMUgiLCBjYWxsLCBzZXEsIFJYS0FEU0VBTEVESU5DT04sIEVQUk9UTyk7CisJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisJfQogCi0JLyogd2Ugd2FudCB0byBkZWNyeXB0IHRoZSBza2J1ZmYgaW4tcGxhY2UgKi8KKwkvKiBEZWNyeXB0IHRoZSBza2J1ZmYgaW4tcGxhY2UuICBUT0RPOiBXZSByZWFsbHkgd2FudCB0byBkZWNyeXB0CisJICogZGlyZWN0bHkgaW50byB0aGUgdGFyZ2V0IGJ1ZmZlci4KKwkgKi8KIAluc2cgPSBza2JfY293X2RhdGEoc2tiLCAwLCAmdHJhaWxlcik7CiAJaWYgKG5zZyA8IDAgfHwgbnNnID4gMTYpCiAJCWdvdG8gbm9tZW07CiAKIAlzZ19pbml0X3RhYmxlKHNnLCBuc2cpOwotCXNrYl90b19zZ3ZlYyhza2IsIHNnLCAwLCA4KTsKKwlza2JfdG9fc2d2ZWMoc2tiLCBzZywgb2Zmc2V0LCA4KTsKIAogCS8qIHN0YXJ0IHRoZSBkZWNyeXB0aW9uIGFmcmVzaCAqLwogCW1lbXNldCgmaXYsIDAsIHNpemVvZihpdikpOwpAQCAtMzUxLDM1ICszNTMsMzUgQEAKIAljcnlwdG9fc2tjaXBoZXJfZGVjcnlwdChyZXEpOwogCXNrY2lwaGVyX3JlcXVlc3RfemVybyhyZXEpOwogCi0JLyogcmVtb3ZlIHRoZSBkZWNyeXB0ZWQgcGFja2V0IGxlbmd0aCAqLwotCWlmIChza2JfY29weV9iaXRzKHNrYiwgMCwgJnNlY2hkciwgc2l6ZW9mKHNlY2hkcikpIDwgMCkKLQkJZ290byBkYXRhbGVuX2Vycm9yOwotCWlmICghc2tiX3B1bGwoc2tiLCBzaXplb2Yoc2VjaGRyKSkpCi0JCUJVRygpOworCS8qIEV4dHJhY3QgdGhlIGRlY3J5cHRlZCBwYWNrZXQgbGVuZ3RoICovCisJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCBvZmZzZXQsICZzZWNoZHIsIHNpemVvZihzZWNoZHIpKSA8IDApIHsKKwkJcnhycGNfYWJvcnRfY2FsbCgiWFYxIiwgY2FsbCwgc2VxLCBSWEtBRERBVEFMRU4sIEVQUk9UTyk7CisJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisJfQorCW9mZnNldCArPSBzaXplb2Yoc2VjaGRyKTsKKwlsZW4gLT0gc2l6ZW9mKHNlY2hkcik7CiAKIAlidWYgPSBudG9obChzZWNoZHIuZGF0YV9zaXplKTsKIAlkYXRhX3NpemUgPSBidWYgJiAweGZmZmY7CiAKIAljaGVjayA9IGJ1ZiA+PiAxNjsKLQljaGVjayBePSBzcC0+aGRyLnNlcSBeIHNwLT5oZHIuY2FsbE51bWJlcjsKKwljaGVjayBePSBzZXEgXiBjYWxsLT5jYWxsX2lkOwogCWNoZWNrICY9IDB4ZmZmZjsKIAlpZiAoY2hlY2sgIT0gMCkgewotCQkqX2Fib3J0X2NvZGUgPSBSWEtBRFNFQUxFRElOQ09OOworCQlyeHJwY19hYm9ydF9jYWxsKCJWMUMiLCBjYWxsLCBzZXEsIFJYS0FEU0VBTEVESU5DT04sIEVQUk9UTyk7CiAJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CiAJfQogCi0JLyogc2hvcnRlbiB0aGUgcGFja2V0IHRvIHJlbW92ZSB0aGUgcGFkZGluZyAqLwotCWlmIChkYXRhX3NpemUgPiBza2ItPmxlbikKLQkJZ290byBkYXRhbGVuX2Vycm9yOwotCWVsc2UgaWYgKGRhdGFfc2l6ZSA8IHNrYi0+bGVuKQotCQlza2ItPmxlbiA9IGRhdGFfc2l6ZTsKKwlpZiAoZGF0YV9zaXplID4gbGVuKSB7CisJCXJ4cnBjX2Fib3J0X2NhbGwoIlYxTCIsIGNhbGwsIHNlcSwgUlhLQUREQVRBTEVOLCBFUFJPVE8pOworCQlnb3RvIHByb3RvY29sX2Vycm9yOworCX0KIAogCV9sZWF2ZSgiID0gMCBbZGxlbj0leF0iLCBkYXRhX3NpemUpOwogCXJldHVybiAwOwogCi1kYXRhbGVuX2Vycm9yOgotCSpfYWJvcnRfY29kZSA9IFJYS0FEREFUQUxFTjsKIHByb3RvY29sX2Vycm9yOgorCXJ4cnBjX3NlbmRfY2FsbF9wYWNrZXQoY2FsbCwgUlhSUENfUEFDS0VUX1RZUEVfQUJPUlQpOwogCV9sZWF2ZSgiID0gLUVQUk9UTyIpOwogCXJldHVybiAtRVBST1RPOwogCkBAIC0zOTEsMTMgKzM5MywxMiBAQAogLyoKICAqIHdob2xseSBkZWNyeXB0IGEgcGFja2V0IChsZXZlbCAyIHNlY3VyaXR5KQogICovCi1zdGF0aWMgaW50IHJ4a2FkX3ZlcmlmeV9wYWNrZXRfZW5jcnlwdChjb25zdCBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgICAgdTMyICpfYWJvcnRfY29kZSkKK3N0YXRpYyBpbnQgcnhrYWRfdmVyaWZ5X3BhY2tldF8yKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuLAorCQkJCSByeHJwY19zZXFfdCBzZXEpCiB7CiAJY29uc3Qgc3RydWN0IHJ4cnBjX2tleV90b2tlbiAqdG9rZW47CiAJc3RydWN0IHJ4a2FkX2xldmVsMl9oZHIgc2VjaGRyOwotCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CiAJU0tDSVBIRVJfUkVRVUVTVF9PTl9TVEFDSyhyZXEsIGNhbGwtPmNvbm4tPmNpcGhlcik7CiAJc3RydWN0IHJ4cnBjX2NyeXB0IGl2OwogCXN0cnVjdCBzY2F0dGVybGlzdCBfc2dbNF0sICpzZzsKQEAgLTQwOCw5ICs0MDksMTQgQEAKIAogCV9lbnRlcigiLHslZH0iLCBza2ItPmxlbik7CiAKLQlzcCA9IHJ4cnBjX3NrYihza2IpOworCWlmIChsZW4gPCA4KSB7CisJCXJ4cnBjX2Fib3J0X2NhbGwoIlYySCIsIGNhbGwsIHNlcSwgUlhLQURTRUFMRURJTkNPTiwgRVBST1RPKTsKKwkJZ290byBwcm90b2NvbF9lcnJvcjsKKwl9CiAKLQkvKiB3ZSB3YW50IHRvIGRlY3J5cHQgdGhlIHNrYnVmZiBpbi1wbGFjZSAqLworCS8qIERlY3J5cHQgdGhlIHNrYnVmZiBpbi1wbGFjZS4gIFRPRE86IFdlIHJlYWxseSB3YW50IHRvIGRlY3J5cHQKKwkgKiBkaXJlY3RseSBpbnRvIHRoZSB0YXJnZXQgYnVmZmVyLgorCSAqLwogCW5zZyA9IHNrYl9jb3dfZGF0YShza2IsIDAsICZ0cmFpbGVyKTsKIAlpZiAobnNnIDwgMCkKIAkJZ290byBub21lbTsKQEAgLTQyMyw3ICs0MjksNyBAQAogCX0KIAogCXNnX2luaXRfdGFibGUoc2csIG5zZyk7Ci0Jc2tiX3RvX3NndmVjKHNrYiwgc2csIDAsIHNrYi0+bGVuKTsKKwlza2JfdG9fc2d2ZWMoc2tiLCBzZywgb2Zmc2V0LCBsZW4pOwogCiAJLyogZGVjcnlwdCBmcm9tIHRoZSBzZXNzaW9uIGtleSAqLwogCXRva2VuID0gY2FsbC0+Y29ubi0+cGFyYW1zLmtleS0+cGF5bG9hZC5kYXRhWzBdOwpAQCAtNDMxLDQxICs0MzcsNDEgQEAKIAogCXNrY2lwaGVyX3JlcXVlc3Rfc2V0X3RmbShyZXEsIGNhbGwtPmNvbm4tPmNpcGhlcik7CiAJc2tjaXBoZXJfcmVxdWVzdF9zZXRfY2FsbGJhY2socmVxLCAwLCBOVUxMLCBOVUxMKTsKLQlza2NpcGhlcl9yZXF1ZXN0X3NldF9jcnlwdChyZXEsIHNnLCBzZywgc2tiLT5sZW4sIGl2LngpOworCXNrY2lwaGVyX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgc2csIHNnLCBsZW4sIGl2LngpOwogCWNyeXB0b19za2NpcGhlcl9kZWNyeXB0KHJlcSk7CiAJc2tjaXBoZXJfcmVxdWVzdF96ZXJvKHJlcSk7CiAJaWYgKHNnICE9IF9zZykKIAkJa2ZyZWUoc2cpOwogCi0JLyogcmVtb3ZlIHRoZSBkZWNyeXB0ZWQgcGFja2V0IGxlbmd0aCAqLwotCWlmIChza2JfY29weV9iaXRzKHNrYiwgMCwgJnNlY2hkciwgc2l6ZW9mKHNlY2hkcikpIDwgMCkKLQkJZ290byBkYXRhbGVuX2Vycm9yOwotCWlmICghc2tiX3B1bGwoc2tiLCBzaXplb2Yoc2VjaGRyKSkpCi0JCUJVRygpOworCS8qIEV4dHJhY3QgdGhlIGRlY3J5cHRlZCBwYWNrZXQgbGVuZ3RoICovCisJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCBvZmZzZXQsICZzZWNoZHIsIHNpemVvZihzZWNoZHIpKSA8IDApIHsKKwkJcnhycGNfYWJvcnRfY2FsbCgiWFYyIiwgY2FsbCwgc2VxLCBSWEtBRERBVEFMRU4sIEVQUk9UTyk7CisJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisJfQorCW9mZnNldCArPSBzaXplb2Yoc2VjaGRyKTsKKwlsZW4gLT0gc2l6ZW9mKHNlY2hkcik7CiAKIAlidWYgPSBudG9obChzZWNoZHIuZGF0YV9zaXplKTsKIAlkYXRhX3NpemUgPSBidWYgJiAweGZmZmY7CiAKIAljaGVjayA9IGJ1ZiA+PiAxNjsKLQljaGVjayBePSBzcC0+aGRyLnNlcSBeIHNwLT5oZHIuY2FsbE51bWJlcjsKKwljaGVjayBePSBzZXEgXiBjYWxsLT5jYWxsX2lkOwogCWNoZWNrICY9IDB4ZmZmZjsKIAlpZiAoY2hlY2sgIT0gMCkgewotCQkqX2Fib3J0X2NvZGUgPSBSWEtBRFNFQUxFRElOQ09OOworCQlyeHJwY19hYm9ydF9jYWxsKCJWMkMiLCBjYWxsLCBzZXEsIFJYS0FEU0VBTEVESU5DT04sIEVQUk9UTyk7CiAJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CiAJfQogCi0JLyogc2hvcnRlbiB0aGUgcGFja2V0IHRvIHJlbW92ZSB0aGUgcGFkZGluZyAqLwotCWlmIChkYXRhX3NpemUgPiBza2ItPmxlbikKLQkJZ290byBkYXRhbGVuX2Vycm9yOwotCWVsc2UgaWYgKGRhdGFfc2l6ZSA8IHNrYi0+bGVuKQotCQlza2ItPmxlbiA9IGRhdGFfc2l6ZTsKKwlpZiAoZGF0YV9zaXplID4gbGVuKSB7CisJCXJ4cnBjX2Fib3J0X2NhbGwoIlYyTCIsIGNhbGwsIHNlcSwgUlhLQUREQVRBTEVOLCBFUFJPVE8pOworCQlnb3RvIHByb3RvY29sX2Vycm9yOworCX0KIAogCV9sZWF2ZSgiID0gMCBbZGxlbj0leF0iLCBkYXRhX3NpemUpOwogCXJldHVybiAwOwogCi1kYXRhbGVuX2Vycm9yOgotCSpfYWJvcnRfY29kZSA9IFJYS0FEREFUQUxFTjsKIHByb3RvY29sX2Vycm9yOgorCXJ4cnBjX3NlbmRfY2FsbF9wYWNrZXQoY2FsbCwgUlhSUENfUEFDS0VUX1RZUEVfQUJPUlQpOwogCV9sZWF2ZSgiID0gLUVQUk9UTyIpOwogCXJldHVybiAtRVBST1RPOwogCkBAIC00NzUsNDAgKzQ4MSwzMSBAQAogfQogCiAvKgotICogdmVyaWZ5IHRoZSBzZWN1cml0eSBvbiBhIHJlY2VpdmVkIHBhY2tldAorICogVmVyaWZ5IHRoZSBzZWN1cml0eSBvbiBhIHJlY2VpdmVkIHBhY2tldCBvciBzdWJwYWNrZXQgKGlmIHBhcnQgb2YgYQorICoganVtYm8gcGFja2V0KS4KICAqLwotc3RhdGljIGludCByeGthZF92ZXJpZnlfcGFja2V0KHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgICAgdTMyICpfYWJvcnRfY29kZSkKK3N0YXRpYyBpbnQgcnhrYWRfdmVyaWZ5X3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuLAorCQkJICAgICAgIHJ4cnBjX3NlcV90IHNlcSwgdTE2IGV4cGVjdGVkX2Nrc3VtKQogewogCVNLQ0lQSEVSX1JFUVVFU1RfT05fU1RBQ0socmVxLCBjYWxsLT5jb25uLT5jaXBoZXIpOwotCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CiAJc3RydWN0IHJ4cnBjX2NyeXB0IGl2OwogCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKIAl1MTYgY2tzdW07CiAJdTMyIHgsIHk7Ci0JaW50IHJldDsKLQotCXNwID0gcnhycGNfc2tiKHNrYik7CiAKIAlfZW50ZXIoInslZHsleH19LHsjJXV9IiwKLQkgICAgICAgY2FsbC0+ZGVidWdfaWQsIGtleV9zZXJpYWwoY2FsbC0+Y29ubi0+cGFyYW1zLmtleSksIHNwLT5oZHIuc2VxKTsKKwkgICAgICAgY2FsbC0+ZGVidWdfaWQsIGtleV9zZXJpYWwoY2FsbC0+Y29ubi0+cGFyYW1zLmtleSksIHNlcSk7CiAKIAlpZiAoIWNhbGwtPmNvbm4tPmNpcGhlcikKIAkJcmV0dXJuIDA7CiAKLQlpZiAoc3AtPmhkci5zZWN1cml0eUluZGV4ICE9IFJYUlBDX1NFQ1VSSVRZX1JYS0FEKSB7Ci0JCSpfYWJvcnRfY29kZSA9IFJYS0FESU5DT05TSVNURU5DWTsKLQkJX2xlYXZlKCIgPSAtRVBST1RPIFtub3QgcnhrYWRdIik7Ci0JCXJldHVybiAtRVBST1RPOwotCX0KLQogCS8qIGNvbnRpbnVlIGVuY3J5cHRpbmcgZnJvbSB3aGVyZSB3ZSBsZWZ0IG9mZiAqLwogCW1lbWNweSgmaXYsIGNhbGwtPmNvbm4tPmNzdW1faXYueCwgc2l6ZW9mKGl2KSk7CiAKIAkvKiB2YWxpZGF0ZSB0aGUgc2VjdXJpdHkgY2hlY2tzdW0gKi8KLQl4ID0gY2FsbC0+Y2hhbm5lbCA8PCAoMzIgLSBSWFJQQ19DSURTSElGVCk7Ci0JeCB8PSBzcC0+aGRyLnNlcSAmIDB4M2ZmZmZmZmY7CisJeCA9IChjYWxsLT5jaWQgJiBSWFJQQ19DSEFOTkVMTUFTSykgPDwgKDMyIC0gUlhSUENfQ0lEU0hJRlQpOworCXggfD0gc2VxICYgMHgzZmZmZmZmZjsKIAljYWxsLT5jcnlwdG9fYnVmWzBdID0gaHRvbmwoY2FsbC0+Y2FsbF9pZCk7CiAJY2FsbC0+Y3J5cHRvX2J1ZlsxXSA9IGh0b25sKHgpOwogCkBAIC01MjQsMjkgKzUyMSw2OSBAQAogCWlmIChja3N1bSA9PSAwKQogCQlja3N1bSA9IDE7IC8qIHplcm8gY2hlY2tzdW1zIGFyZSBub3QgcGVybWl0dGVkICovCiAKLQlpZiAoc3AtPmhkci5ja3N1bSAhPSBja3N1bSkgewotCQkqX2Fib3J0X2NvZGUgPSBSWEtBRFNFQUxFRElOQ09OOworCWlmIChja3N1bSAhPSBleHBlY3RlZF9ja3N1bSkgeworCQlyeHJwY19hYm9ydF9jYWxsKCJWQ0siLCBjYWxsLCBzZXEsIFJYS0FEU0VBTEVESU5DT04sIEVQUk9UTyk7CisJCXJ4cnBjX3NlbmRfY2FsbF9wYWNrZXQoY2FsbCwgUlhSUENfUEFDS0VUX1RZUEVfQUJPUlQpOwogCQlfbGVhdmUoIiA9IC1FUFJPVE8gW2NzdW0gZmFpbGVkXSIpOwogCQlyZXR1cm4gLUVQUk9UTzsKIAl9CiAKIAlzd2l0Y2ggKGNhbGwtPmNvbm4tPnBhcmFtcy5zZWN1cml0eV9sZXZlbCkgewogCWNhc2UgUlhSUENfU0VDVVJJVFlfUExBSU46Ci0JCXJldCA9IDA7Ci0JCWJyZWFrOworCQlyZXR1cm4gMDsKIAljYXNlIFJYUlBDX1NFQ1VSSVRZX0FVVEg6Ci0JCXJldCA9IHJ4a2FkX3ZlcmlmeV9wYWNrZXRfYXV0aChjYWxsLCBza2IsIF9hYm9ydF9jb2RlKTsKLQkJYnJlYWs7CisJCXJldHVybiByeGthZF92ZXJpZnlfcGFja2V0XzEoY2FsbCwgc2tiLCBvZmZzZXQsIGxlbiwgc2VxKTsKIAljYXNlIFJYUlBDX1NFQ1VSSVRZX0VOQ1JZUFQ6Ci0JCXJldCA9IHJ4a2FkX3ZlcmlmeV9wYWNrZXRfZW5jcnlwdChjYWxsLCBza2IsIF9hYm9ydF9jb2RlKTsKLQkJYnJlYWs7CisJCXJldHVybiByeGthZF92ZXJpZnlfcGFja2V0XzIoY2FsbCwgc2tiLCBvZmZzZXQsIGxlbiwgc2VxKTsKIAlkZWZhdWx0OgotCQlyZXQgPSAtRU5PQU5POwotCQlicmVhazsKKwkJcmV0dXJuIC1FTk9BTk87CiAJfQorfQogCi0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKKy8qCisgKiBMb2NhdGUgdGhlIGRhdGEgY29udGFpbmVkIGluIGEgcGFja2V0IHRoYXQgd2FzIHBhcnRpYWxseSBlbmNyeXB0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIHJ4a2FkX2xvY2F0ZV9kYXRhXzEoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJdW5zaWduZWQgaW50ICpfb2Zmc2V0LCB1bnNpZ25lZCBpbnQgKl9sZW4pCit7CisJc3RydWN0IHJ4a2FkX2xldmVsMV9oZHIgc2VjaGRyOworCisJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAqX29mZnNldCwgJnNlY2hkciwgc2l6ZW9mKHNlY2hkcikpIDwgMCkKKwkJQlVHKCk7CisJKl9vZmZzZXQgKz0gc2l6ZW9mKHNlY2hkcik7CisJKl9sZW4gPSBudG9obChzZWNoZHIuZGF0YV9zaXplKSAmIDB4ZmZmZjsKK30KKworLyoKKyAqIExvY2F0ZSB0aGUgZGF0YSBjb250YWluZWQgaW4gYSBwYWNrZXQgdGhhdCB3YXMgY29tcGxldGVseSBlbmNyeXB0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIHJ4a2FkX2xvY2F0ZV9kYXRhXzIoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJdW5zaWduZWQgaW50ICpfb2Zmc2V0LCB1bnNpZ25lZCBpbnQgKl9sZW4pCit7CisJc3RydWN0IHJ4a2FkX2xldmVsMl9oZHIgc2VjaGRyOworCisJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAqX29mZnNldCwgJnNlY2hkciwgc2l6ZW9mKHNlY2hkcikpIDwgMCkKKwkJQlVHKCk7CisJKl9vZmZzZXQgKz0gc2l6ZW9mKHNlY2hkcik7CisJKl9sZW4gPSBudG9obChzZWNoZHIuZGF0YV9zaXplKSAmIDB4ZmZmZjsKK30KKworLyoKKyAqIExvY2F0ZSB0aGUgZGF0YSBjb250YWluZWQgaW4gYW4gYWxyZWFkeSBkZWNyeXB0ZWQgcGFja2V0LgorICovCitzdGF0aWMgdm9pZCByeGthZF9sb2NhdGVfZGF0YShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqX29mZnNldCwgdW5zaWduZWQgaW50ICpfbGVuKQoreworCXN3aXRjaCAoY2FsbC0+Y29ubi0+cGFyYW1zLnNlY3VyaXR5X2xldmVsKSB7CisJY2FzZSBSWFJQQ19TRUNVUklUWV9BVVRIOgorCQlyeGthZF9sb2NhdGVfZGF0YV8xKGNhbGwsIHNrYiwgX29mZnNldCwgX2xlbik7CisJCXJldHVybjsKKwljYXNlIFJYUlBDX1NFQ1VSSVRZX0VOQ1JZUFQ6CisJCXJ4a2FkX2xvY2F0ZV9kYXRhXzIoY2FsbCwgc2tiLCBfb2Zmc2V0LCBfbGVuKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CiB9CiAKIC8qCkBAIC03MTYsNyArNzUzLDcgQEAKIAlzdHJ1Y3QgcnhrYWRfY2hhbGxlbmdlIGNoYWxsZW5nZTsKIAlzdHJ1Y3QgcnhrYWRfcmVzcG9uc2UgcmVzcAogCQlfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7IC8qIG11c3QgYmUgYWxpZ25lZCBmb3IgY3J5cHRvICovCi0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwID0gcnhycGNfc2tiKHNrYik7CiAJdTMyIHZlcnNpb24sIG5vbmNlLCBtaW5fbGV2ZWwsIGFib3J0X2NvZGU7CiAJaW50IHJldDsKIApAQCAtNzM0LDggKzc3MSw4IEBACiAJfQogCiAJYWJvcnRfY29kZSA9IFJYS0FEUEFDS0VUU0hPUlQ7Ci0Jc3AgPSByeHJwY19za2Ioc2tiKTsKLQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIDAsICZjaGFsbGVuZ2UsIHNpemVvZihjaGFsbGVuZ2UpKSA8IDApCisJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCBzaXplb2Yoc3RydWN0IHJ4cnBjX3dpcmVfaGVhZGVyKSwKKwkJCSAgJmNoYWxsZW5nZSwgc2l6ZW9mKGNoYWxsZW5nZSkpIDwgMCkKIAkJZ290byBwcm90b2NvbF9lcnJvcjsKIAogCXZlcnNpb24gPSBudG9obChjaGFsbGVuZ2UudmVyc2lvbik7CkBAIC05ODEsNyArMTAxOCw3IEBACiB7CiAJc3RydWN0IHJ4a2FkX3Jlc3BvbnNlIHJlc3BvbnNlCiAJCV9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsgLyogbXVzdCBiZSBhbGlnbmVkIGZvciBjcnlwdG8gKi8KLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKIAlzdHJ1Y3QgcnhycGNfY3J5cHQgc2Vzc2lvbl9rZXk7CiAJdGltZV90IGV4cGlyeTsKIAl2b2lkICp0aWNrZXQ7CkBAIC05OTIsNyArMTAyOSw4IEBACiAJX2VudGVyKCJ7JWQsJXh9IiwgY29ubi0+ZGVidWdfaWQsIGtleV9zZXJpYWwoY29ubi0+c2VydmVyX2tleSkpOwogCiAJYWJvcnRfY29kZSA9IFJYS0FEUEFDS0VUU0hPUlQ7Ci0JaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCAmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpIDwgMCkKKwlpZiAoc2tiX2NvcHlfYml0cyhza2IsIHNpemVvZihzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIpLAorCQkJICAmcmVzcG9uc2UsIHNpemVvZihyZXNwb25zZSkpIDwgMCkKIAkJZ290byBwcm90b2NvbF9lcnJvcjsKIAlpZiAoIXBza2JfcHVsbChza2IsIHNpemVvZihyZXNwb25zZSkpKQogCQlCVUcoKTsKQEAgLTEwMDAsNyArMTAzOCw2IEBACiAJdmVyc2lvbiA9IG50b2hsKHJlc3BvbnNlLnZlcnNpb24pOwogCXRpY2tldF9sZW4gPSBudG9obChyZXNwb25zZS50aWNrZXRfbGVuKTsKIAlrdm5vID0gbnRvaGwocmVzcG9uc2Uua3Zubyk7Ci0Jc3AgPSByeHJwY19za2Ioc2tiKTsKIAlfcHJvdG8oIlJ4IFJFU1BPTlNFICUlJXUgeyB2PSV1IGt2PSV1IHRsPSV1IH0iLAogCSAgICAgICBzcC0+aGRyLnNlcmlhbCwgdmVyc2lvbiwga3ZubywgdGlja2V0X2xlbik7CiAKQEAgLTEwMjIsNyArMTA1OSw4IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJYWJvcnRfY29kZSA9IFJYS0FEUEFDS0VUU0hPUlQ7Ci0JaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCB0aWNrZXQsIHRpY2tldF9sZW4pIDwgMCkKKwlpZiAoc2tiX2NvcHlfYml0cyhza2IsIHNpemVvZihzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIpLAorCQkJICB0aWNrZXQsIHRpY2tldF9sZW4pIDwgMCkKIAkJZ290byBwcm90b2NvbF9lcnJvcl9mcmVlOwogCiAJcmV0ID0gcnhrYWRfZGVjcnlwdF90aWNrZXQoY29ubiwgdGlja2V0LCB0aWNrZXRfbGVuLCAmc2Vzc2lvbl9rZXksCkBAIC0xMTQ3LDYgKzExODUsNyBAQAogCS5wcmltZV9wYWNrZXRfc2VjdXJpdHkJCT0gcnhrYWRfcHJpbWVfcGFja2V0X3NlY3VyaXR5LAogCS5zZWN1cmVfcGFja2V0CQkJPSByeGthZF9zZWN1cmVfcGFja2V0LAogCS52ZXJpZnlfcGFja2V0CQkJPSByeGthZF92ZXJpZnlfcGFja2V0LAorCS5sb2NhdGVfZGF0YQkJCT0gcnhrYWRfbG9jYXRlX2RhdGEsCiAJLmlzc3VlX2NoYWxsZW5nZQkJPSByeGthZF9pc3N1ZV9jaGFsbGVuZ2UsCiAJLnJlc3BvbmRfdG9fY2hhbGxlbmdlCQk9IHJ4a2FkX3Jlc3BvbmRfdG9fY2hhbGxlbmdlLAogCS52ZXJpZnlfcmVzcG9uc2UJCT0gcnhrYWRfdmVyaWZ5X3Jlc3BvbnNlLApkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL3NlY3VyaXR5LmMgYi9uZXQvcnhycGMvc2VjdXJpdHkuYwppbmRleCA4MTRkMjg1Li43ZDkyMWU1IDEwMDY0NAotLS0gYS9uZXQvcnhycGMvc2VjdXJpdHkuYworKysgYi9uZXQvcnhycGMvc2VjdXJpdHkuYwpAQCAtMTMwLDIwICsxMzAsMjAgQEAKIAl9CiAKIAkvKiBmaW5kIHRoZSBzZXJ2aWNlICovCi0JcmVhZF9sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShyeCwgJmxvY2FsLT5zZXJ2aWNlcywgbGlzdGVuX2xpbmspIHsKLQkJaWYgKHJ4LT5zcnguc3J4X3NlcnZpY2UgPT0gY29ubi0+cGFyYW1zLnNlcnZpY2VfaWQpCi0JCQlnb3RvIGZvdW5kX3NlcnZpY2U7Ci0JfQorCXJlYWRfbG9jaygmbG9jYWwtPnNlcnZpY2VzX2xvY2spOworCXJ4ID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChsb2NhbC0+c2VydmljZSwKKwkJCQkgICAgICAgbG9ja2RlcF9pc19oZWxkKCZsb2NhbC0+c2VydmljZXNfbG9jaykpOworCWlmIChyeCAmJiByeC0+c3J4LnNyeF9zZXJ2aWNlID09IGNvbm4tPnBhcmFtcy5zZXJ2aWNlX2lkKQorCQlnb3RvIGZvdW5kX3NlcnZpY2U7CiAKIAkvKiB0aGUgc2VydmljZSBhcHBlYXJzIHRvIGhhdmUgZGllZCAqLwotCXJlYWRfdW5sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7CisJcmVhZF91bmxvY2soJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKIAlfbGVhdmUoIiA9IC1FTk9FTlQiKTsKIAlyZXR1cm4gLUVOT0VOVDsKIAogZm91bmRfc2VydmljZToKIAlpZiAoIXJ4LT5zZWN1cml0aWVzKSB7Ci0JCXJlYWRfdW5sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7CisJCXJlYWRfdW5sb2NrKCZsb2NhbC0+c2VydmljZXNfbG9jayk7CiAJCV9sZWF2ZSgiID0gLUVOT0tFWSIpOwogCQlyZXR1cm4gLUVOT0tFWTsKIAl9CkBAIC0xNTIsMTMgKzE1MiwxMyBAQAogCWtyZWYgPSBrZXlyaW5nX3NlYXJjaChtYWtlX2tleV9yZWYocngtPnNlY3VyaXRpZXMsIDFVTCksCiAJCQkgICAgICAma2V5X3R5cGVfcnhycGNfcywga2Rlc2MpOwogCWlmIChJU19FUlIoa3JlZikpIHsKLQkJcmVhZF91bmxvY2tfYmgoJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKKwkJcmVhZF91bmxvY2soJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKIAkJX2xlYXZlKCIgPSAlbGQgW3NlYXJjaF0iLCBQVFJfRVJSKGtyZWYpKTsKIAkJcmV0dXJuIFBUUl9FUlIoa3JlZik7CiAJfQogCiAJa2V5ID0ga2V5X3JlZl90b19wdHIoa3JlZik7Ci0JcmVhZF91bmxvY2tfYmgoJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKKwlyZWFkX3VubG9jaygmbG9jYWwtPnNlcnZpY2VzX2xvY2spOwogCiAJY29ubi0+c2VydmVyX2tleSA9IGtleTsKIAljb25uLT5zZWN1cml0eSA9IHNlYzsKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9zZW5kbXNnLmMgYi9uZXQvcnhycGMvc2VuZG1zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMjI1NDMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvcnhycGMvc2VuZG1zZy5jCkBAIC0wLDAgKzEsNjA2IEBACisvKiBBRl9SWFJQQyBzZW5kbXNnKCkgaW1wbGVtZW50YXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDE2IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2FmX3J4cnBjLmg+CisjaW5jbHVkZSAiYXItaW50ZXJuYWwuaCIKKworZW51bSByeHJwY19jb21tYW5kIHsKKwlSWFJQQ19DTURfU0VORF9EQVRBLAkJLyogc2VuZCBkYXRhIG1lc3NhZ2UgKi8KKwlSWFJQQ19DTURfU0VORF9BQk9SVCwJCS8qIHJlcXVlc3QgYWJvcnQgZ2VuZXJhdGlvbiAqLworCVJYUlBDX0NNRF9BQ0NFUFQsCQkvKiBbc2VydmVyXSBhY2NlcHQgaW5jb21pbmcgY2FsbCAqLworCVJYUlBDX0NNRF9SRUpFQ1RfQlVTWSwJCS8qIFtzZXJ2ZXJdIHJlamVjdCBhIGNhbGwgYXMgYnVzeSAqLworfTsKKworLyoKKyAqIHdhaXQgZm9yIHNwYWNlIHRvIGFwcGVhciBpbiB0aGUgdHJhbnNtaXQvQUNLIHdpbmRvdworICogLSBjYWxsZXIgaG9sZHMgdGhlIHNvY2tldCBsb2NrZWQKKyAqLworc3RhdGljIGludCByeHJwY193YWl0X2Zvcl90eF93aW5kb3coc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAorCQkJCSAgICBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkgICAgbG9uZyAqdGltZW8pCit7CisJREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKKwlpbnQgcmV0OworCisJX2VudGVyKCIseyV1LCV1LCV1fSIsCisJICAgICAgIGNhbGwtPnR4X2hhcmRfYWNrLCBjYWxsLT50eF90b3AsIGNhbGwtPnR4X3dpbnNpemUpOworCisJYWRkX3dhaXRfcXVldWUoJmNhbGwtPndhaXRxLCAmbXlzZWxmKTsKKworCWZvciAoOzspIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJcmV0ID0gMDsKKwkJaWYgKGNhbGwtPnR4X3RvcCAtIGNhbGwtPnR4X2hhcmRfYWNrIDwKKwkJICAgIG1pbl90KHVuc2lnbmVkIGludCwgY2FsbC0+dHhfd2luc2l6ZSwKKwkJCSAgY2FsbC0+Y29uZ19jd25kICsgY2FsbC0+Y29uZ19leHRyYSkpCisJCQlicmVhazsKKwkJaWYgKGNhbGwtPnN0YXRlID49IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKKwkJCXJldCA9IC1jYWxsLT5lcnJvcjsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0ID0gc29ja19pbnRyX2Vycm5vKCp0aW1lbyk7CisJCQlicmVhazsKKwkJfQorCisJCXRyYWNlX3J4cnBjX3RyYW5zbWl0KGNhbGwsIHJ4cnBjX3RyYW5zbWl0X3dhaXQpOworCQlyZWxlYXNlX3NvY2soJnJ4LT5zayk7CisJCSp0aW1lbyA9IHNjaGVkdWxlX3RpbWVvdXQoKnRpbWVvKTsKKwkJbG9ja19zb2NrKCZyeC0+c2spOworCX0KKworCXJlbW92ZV93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwgJm15c2VsZik7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogU2NoZWR1bGUgYW4gaW5zdGFudCBUeCByZXNlbmQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByeHJwY19pbnN0YW50X3Jlc2VuZChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgaW50IGl4KQoreworCXNwaW5fbG9ja19iaCgmY2FsbC0+bG9jayk7CisKKwlpZiAoY2FsbC0+c3RhdGUgPCBSWFJQQ19DQUxMX0NPTVBMRVRFKSB7CisJCWNhbGwtPnJ4dHhfYW5ub3RhdGlvbnNbaXhdID0gUlhSUENfVFhfQU5OT19SRVRSQU5TOworCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FVl9SRVNFTkQsICZjYWxsLT5ldmVudHMpKQorCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwl9CisKKwlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7Cit9CisKKy8qCisgKiBRdWV1ZSBhIERBVEEgcGFja2V0IGZvciB0cmFuc21pc3Npb24sIHNldCB0aGUgcmVzZW5kIHRpbWVvdXQgYW5kIHNlbmQgdGhlCisgKiBwYWNrZXQgaW1tZWRpYXRlbHkKKyAqLworc3RhdGljIHZvaWQgcnhycGNfcXVldWVfcGFja2V0KHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIGJvb2wgbGFzdCkKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwID0gcnhycGNfc2tiKHNrYik7CisJcnhycGNfc2VxX3Qgc2VxID0gc3AtPmhkci5zZXE7CisJaW50IHJldCwgaXg7CisJdTggYW5ub3RhdGlvbiA9IFJYUlBDX1RYX0FOTk9fVU5BQ0s7CisKKwlfbmV0KCJxdWV1ZSBza2IgJXAgWyVkXSIsIHNrYiwgc2VxKTsKKworCUFTU0VSVENNUChzZXEsID09LCBjYWxsLT50eF90b3AgKyAxKTsKKworCWlmIChsYXN0KQorCQlhbm5vdGF0aW9uIHw9IFJYUlBDX1RYX0FOTk9fTEFTVDsKKworCS8qIFdlIGhhdmUgdG8gc2V0IHRoZSB0aW1lc3RhbXAgYmVmb3JlIHF1ZXVlaW5nIGFzIHRoZSByZXRyYW5zbWl0CisJICogYWxnb3JpdGhtIGNhbiBzZWUgdGhlIHBhY2tldCBhcyBzb29uIGFzIHdlIHF1ZXVlIGl0LgorCSAqLworCXNrYi0+dHN0YW1wID0ga3RpbWVfZ2V0X3JlYWwoKTsKKworCWl4ID0gc2VxICYgUlhSUENfUlhUWF9CVUZGX01BU0s7CisJcnhycGNfZ2V0X3NrYihza2IsIHJ4cnBjX3NrYl90eF9nb3QpOworCWNhbGwtPnJ4dHhfYW5ub3RhdGlvbnNbaXhdID0gYW5ub3RhdGlvbjsKKwlzbXBfd21iKCk7CisJY2FsbC0+cnh0eF9idWZmZXJbaXhdID0gc2tiOworCWNhbGwtPnR4X3RvcCA9IHNlcTsKKwlpZiAobGFzdCkKKwkJdHJhY2VfcnhycGNfdHJhbnNtaXQoY2FsbCwgcnhycGNfdHJhbnNtaXRfcXVldWVfbGFzdCk7CisJZWxzZQorCQl0cmFjZV9yeHJwY190cmFuc21pdChjYWxsLCByeHJwY190cmFuc21pdF9xdWV1ZSk7CisKKwlpZiAobGFzdCB8fCBjYWxsLT5zdGF0ZSA9PSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0tfUkVRVUVTVCkgeworCQlfZGVidWcoIl9fX19fX19fYXdhaXRpbmcgcmVwbHkvQUNLX19fX19fX19fXyIpOworCQl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwkJc3dpdGNoIChjYWxsLT5zdGF0ZSkgeworCQljYXNlIFJYUlBDX0NBTExfQ0xJRU5UX1NFTkRfUkVRVUVTVDoKKwkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9DTElFTlRfQVdBSVRfUkVQTFk7CisJCQlicmVhazsKKwkJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0tfUkVRVUVTVDoKKwkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9TRVJWRVJfU0VORF9SRVBMWTsKKwkJCWlmICghbGFzdCkKKwkJCQlicmVhazsKKwkJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9TRU5EX1JFUExZOgorCQkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX1NFUlZFUl9BV0FJVF9BQ0s7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJfQorCisJaWYgKHNlcSA9PSAxICYmIHJ4cnBjX2lzX2NsaWVudF9jYWxsKGNhbGwpKQorCQlyeHJwY19leHBvc2VfY2xpZW50X2NhbGwoY2FsbCk7CisKKwlyZXQgPSByeHJwY19zZW5kX2RhdGFfcGFja2V0KGNhbGwsIHNrYiwgZmFsc2UpOworCWlmIChyZXQgPCAwKSB7CisJCV9kZWJ1ZygibmVlZCBpbnN0YW50IHJlc2VuZCAlZCIsIHJldCk7CisJCXJ4cnBjX2luc3RhbnRfcmVzZW5kKGNhbGwsIGl4KTsKKwl9IGVsc2UgeworCQlrdGltZV90IG5vdyA9IGt0aW1lX2dldF9yZWFsKCksIHJlc2VuZF9hdDsKKworCQlyZXNlbmRfYXQgPSBrdGltZV9hZGRfbXMobm93LCByeHJwY19yZXNlbmRfdGltZW91dCk7CisKKwkJaWYgKGt0aW1lX2JlZm9yZShyZXNlbmRfYXQsIGNhbGwtPnJlc2VuZF9hdCkpIHsKKwkJCWNhbGwtPnJlc2VuZF9hdCA9IHJlc2VuZF9hdDsKKwkJCXJ4cnBjX3NldF90aW1lcihjYWxsLCByeHJwY190aW1lcl9zZXRfZm9yX3NlbmQsIG5vdyk7CisJCX0KKwl9CisKKwlyeHJwY19mcmVlX3NrYihza2IsIHJ4cnBjX3NrYl90eF9mcmVlZCk7CisJX2xlYXZlKCIiKTsKK30KKworLyoKKyAqIHNlbmQgZGF0YSB0aHJvdWdoIGEgc29ja2V0CisgKiAtIG11c3QgYmUgY2FsbGVkIGluIHByb2Nlc3MgY29udGV4dAorICogLSBjYWxsZXIgaG9sZHMgdGhlIHNvY2tldCBsb2NrZWQKKyAqLworc3RhdGljIGludCByeHJwY19zZW5kX2RhdGEoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAorCQkJICAgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBzb2NrICpzayA9ICZyeC0+c2s7CisJbG9uZyB0aW1lbzsKKwlib29sIG1vcmU7CisJaW50IHJldCwgY29waWVkOworCisJdGltZW8gPSBzb2NrX3NuZHRpbWVvKHNrLCBtc2ctPm1zZ19mbGFncyAmIE1TR19ET05UV0FJVCk7CisKKwkvKiB0aGlzIHNob3VsZCBiZSBpbiBwb2xsICovCisJc2tfY2xlYXJfYml0KFNPQ0tXUV9BU1lOQ19OT1NQQUNFLCBzayk7CisKKwlpZiAoc2stPnNrX2VyciB8fCAoc2stPnNrX3NodXRkb3duICYgU0VORF9TSFVURE9XTikpCisJCXJldHVybiAtRVBJUEU7CisKKwltb3JlID0gbXNnLT5tc2dfZmxhZ3MgJiBNU0dfTU9SRTsKKworCXNrYiA9IGNhbGwtPnR4X3BlbmRpbmc7CisJY2FsbC0+dHhfcGVuZGluZyA9IE5VTEw7CisJcnhycGNfc2VlX3NrYihza2IsIHJ4cnBjX3NrYl90eF9zZWVuKTsKKworCWNvcGllZCA9IDA7CisJZG8geworCQkvKiBDaGVjayB0byBzZWUgaWYgdGhlcmUncyBhIHBpbmcgQUNLIHRvIHJlcGx5IHRvLiAqLworCQlpZiAoY2FsbC0+YWNrcl9yZWFzb24gPT0gUlhSUENfQUNLX1BJTkdfUkVTUE9OU0UpCisJCQlyeHJwY19zZW5kX2NhbGxfcGFja2V0KGNhbGwsIFJYUlBDX1BBQ0tFVF9UWVBFX0FDSyk7CisKKwkJaWYgKCFza2IpIHsKKwkJCXNpemVfdCBzaXplLCBjaHVuaywgbWF4LCBzcGFjZTsKKworCQkJX2RlYnVnKCJhbGxvYyIpOworCisJCQlpZiAoY2FsbC0+dHhfdG9wIC0gY2FsbC0+dHhfaGFyZF9hY2sgPj0KKwkJCSAgICBtaW5fdCh1bnNpZ25lZCBpbnQsIGNhbGwtPnR4X3dpbnNpemUsCisJCQkJICBjYWxsLT5jb25nX2N3bmQgKyBjYWxsLT5jb25nX2V4dHJhKSkgeworCQkJCXJldCA9IC1FQUdBSU47CisJCQkJaWYgKG1zZy0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlUKQorCQkJCQlnb3RvIG1heWJlX2Vycm9yOworCQkJCXJldCA9IHJ4cnBjX3dhaXRfZm9yX3R4X3dpbmRvdyhyeCwgY2FsbCwKKwkJCQkJCQkgICAgICAgJnRpbWVvKTsKKwkJCQlpZiAocmV0IDwgMCkKKwkJCQkJZ290byBtYXliZV9lcnJvcjsKKwkJCX0KKworCQkJbWF4ID0gUlhSUENfSlVNQk9fREFUQUxFTjsKKwkJCW1heCAtPSBjYWxsLT5jb25uLT5zZWN1cml0eV9zaXplOworCQkJbWF4ICY9IH4oY2FsbC0+Y29ubi0+c2l6ZV9hbGlnbiAtIDFVTCk7CisKKwkJCWNodW5rID0gbWF4OworCQkJaWYgKGNodW5rID4gbXNnX2RhdGFfbGVmdChtc2cpICYmICFtb3JlKQorCQkJCWNodW5rID0gbXNnX2RhdGFfbGVmdChtc2cpOworCisJCQlzcGFjZSA9IGNodW5rICsgY2FsbC0+Y29ubi0+c2l6ZV9hbGlnbjsKKwkJCXNwYWNlICY9IH4oY2FsbC0+Y29ubi0+c2l6ZV9hbGlnbiAtIDFVTCk7CisKKwkJCXNpemUgPSBzcGFjZSArIGNhbGwtPmNvbm4tPnNlY3VyaXR5X3NpemU7CisKKwkJCV9kZWJ1ZygiU0laRTogJXp1LyV6dS8lenUiLCBjaHVuaywgc3BhY2UsIHNpemUpOworCisJCQkvKiBjcmVhdGUgYSBidWZmZXIgdGhhdCB3ZSBjYW4gcmV0YWluIHVudGlsIGl0J3MgQUNLJ2QgKi8KKwkJCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2IoCisJCQkJc2ssIHNpemUsIG1zZy0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlULCAmcmV0KTsKKwkJCWlmICghc2tiKQorCQkJCWdvdG8gbWF5YmVfZXJyb3I7CisKKwkJCXJ4cnBjX25ld19za2Ioc2tiLCByeHJwY19za2JfdHhfbmV3KTsKKworCQkJX2RlYnVnKCJBTExPQyBTRU5EICVwIiwgc2tiKTsKKworCQkJQVNTRVJUQ01QKHNrYi0+bWFyaywgPT0sIDApOworCisJCQlfZGVidWcoIkhTOiAldSIsIGNhbGwtPmNvbm4tPnNlY3VyaXR5X3NpemUpOworCQkJc2tiX3Jlc2VydmUoc2tiLCBjYWxsLT5jb25uLT5zZWN1cml0eV9zaXplKTsKKwkJCXNrYi0+bGVuICs9IGNhbGwtPmNvbm4tPnNlY3VyaXR5X3NpemU7CisKKwkJCXNwID0gcnhycGNfc2tiKHNrYik7CisJCQlzcC0+cmVtYWluID0gY2h1bms7CisJCQlpZiAoc3AtPnJlbWFpbiA+IHNrYl90YWlscm9vbShza2IpKQorCQkJCXNwLT5yZW1haW4gPSBza2JfdGFpbHJvb20oc2tiKTsKKworCQkJX25ldCgic2tiOiBociAlZCwgdHIgJWQsIGhsICVkLCBybSAlZCIsCisJCQkgICAgICAgc2tiX2hlYWRyb29tKHNrYiksCisJCQkgICAgICAgc2tiX3RhaWxyb29tKHNrYiksCisJCQkgICAgICAgc2tiX2hlYWRsZW4oc2tiKSwKKwkJCSAgICAgICBzcC0+cmVtYWluKTsKKworCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJfQorCisJCV9kZWJ1ZygiYXBwZW5kIik7CisJCXNwID0gcnhycGNfc2tiKHNrYik7CisKKwkJLyogYXBwZW5kIG5leHQgc2VnbWVudCBvZiBkYXRhIHRvIHRoZSBjdXJyZW50IGJ1ZmZlciAqLworCQlpZiAobXNnX2RhdGFfbGVmdChtc2cpID4gMCkgeworCQkJaW50IGNvcHkgPSBza2JfdGFpbHJvb20oc2tiKTsKKwkJCUFTU0VSVENNUChjb3B5LCA+LCAwKTsKKwkJCWlmIChjb3B5ID4gbXNnX2RhdGFfbGVmdChtc2cpKQorCQkJCWNvcHkgPSBtc2dfZGF0YV9sZWZ0KG1zZyk7CisJCQlpZiAoY29weSA+IHNwLT5yZW1haW4pCisJCQkJY29weSA9IHNwLT5yZW1haW47CisKKwkJCV9kZWJ1ZygiYWRkIik7CisJCQlyZXQgPSBza2JfYWRkX2RhdGEoc2tiLCAmbXNnLT5tc2dfaXRlciwgY29weSk7CisJCQlfZGVidWcoImFkZGVkIik7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIGVmYXVsdDsKKwkJCXNwLT5yZW1haW4gLT0gY29weTsKKwkJCXNrYi0+bWFyayArPSBjb3B5OworCQkJY29waWVkICs9IGNvcHk7CisJCX0KKworCQkvKiBjaGVjayBmb3IgdGhlIGZhciBzaWRlIGFib3J0aW5nIHRoZSBjYWxsIG9yIGEgbmV0d29yayBlcnJvcgorCQkgKiBvY2N1cnJpbmcgKi8KKwkJaWYgKGNhbGwtPnN0YXRlID09IFJYUlBDX0NBTExfQ09NUExFVEUpCisJCQlnb3RvIGNhbGxfdGVybWluYXRlZDsKKworCQkvKiBhZGQgdGhlIHBhY2tldCB0byB0aGUgc2VuZCBxdWV1ZSBpZiBpdCdzIG5vdyBmdWxsICovCisJCWlmIChzcC0+cmVtYWluIDw9IDAgfHwKKwkJICAgIChtc2dfZGF0YV9sZWZ0KG1zZykgPT0gMCAmJiAhbW9yZSkpIHsKKwkJCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uID0gY2FsbC0+Y29ubjsKKwkJCXVpbnQzMl90IHNlcTsKKwkJCXNpemVfdCBwYWQ7CisKKwkJCS8qIHBhZCBvdXQgaWYgd2UncmUgdXNpbmcgc2VjdXJpdHkgKi8KKwkJCWlmIChjb25uLT5zZWN1cml0eV9peCkgeworCQkJCXBhZCA9IGNvbm4tPnNlY3VyaXR5X3NpemUgKyBza2ItPm1hcms7CisJCQkJcGFkID0gY29ubi0+c2l6ZV9hbGlnbiAtIHBhZDsKKwkJCQlwYWQgJj0gY29ubi0+c2l6ZV9hbGlnbiAtIDE7CisJCQkJX2RlYnVnKCJwYWQgJXp1IiwgcGFkKTsKKwkJCQlpZiAocGFkKQorCQkJCQltZW1zZXQoc2tiX3B1dChza2IsIHBhZCksIDAsIHBhZCk7CisJCQl9CisKKwkJCXNlcSA9IGNhbGwtPnR4X3RvcCArIDE7CisKKwkJCXNwLT5oZHIuc2VxCT0gc2VxOworCQkJc3AtPmhkci5fcnN2ZAk9IDA7CisJCQlzcC0+aGRyLmZsYWdzCT0gY29ubi0+b3V0X2NsaWVudGZsYWc7CisKKwkJCWlmIChtc2dfZGF0YV9sZWZ0KG1zZykgPT0gMCAmJiAhbW9yZSkKKwkJCQlzcC0+aGRyLmZsYWdzIHw9IFJYUlBDX0xBU1RfUEFDS0VUOworCQkJZWxzZSBpZiAoY2FsbC0+dHhfdG9wIC0gY2FsbC0+dHhfaGFyZF9hY2sgPAorCQkJCSBjYWxsLT50eF93aW5zaXplKQorCQkJCXNwLT5oZHIuZmxhZ3MgfD0gUlhSUENfTU9SRV9QQUNLRVRTOworCisJCQlyZXQgPSBjb25uLT5zZWN1cml0eS0+c2VjdXJlX3BhY2tldCgKKwkJCQljYWxsLCBza2IsIHNrYi0+bWFyaywgc2tiLT5oZWFkKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8gb3V0OworCisJCQlyeHJwY19xdWV1ZV9wYWNrZXQoY2FsbCwgc2tiLCAhbXNnX2RhdGFfbGVmdChtc2cpICYmICFtb3JlKTsKKwkJCXNrYiA9IE5VTEw7CisJCX0KKwl9IHdoaWxlIChtc2dfZGF0YV9sZWZ0KG1zZykgPiAwKTsKKworc3VjY2VzczoKKwlyZXQgPSBjb3BpZWQ7CitvdXQ6CisJY2FsbC0+dHhfcGVuZGluZyA9IHNrYjsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworCitjYWxsX3Rlcm1pbmF0ZWQ6CisJcnhycGNfZnJlZV9za2Ioc2tiLCByeHJwY19za2JfdHhfZnJlZWQpOworCV9sZWF2ZSgiID0gJWQiLCAtY2FsbC0+ZXJyb3IpOworCXJldHVybiAtY2FsbC0+ZXJyb3I7CisKK21heWJlX2Vycm9yOgorCWlmIChjb3BpZWQpCisJCWdvdG8gc3VjY2VzczsKKwlnb3RvIG91dDsKKworZWZhdWx0OgorCXJldCA9IC1FRkFVTFQ7CisJZ290byBvdXQ7Cit9CisKKy8qCisgKiBleHRyYWN0IGNvbnRyb2wgbWVzc2FnZXMgZnJvbSB0aGUgc2VuZG1zZygpIGNvbnRyb2wgYnVmZmVyCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfc2VuZG1zZ19jbXNnKHN0cnVjdCBtc2doZHIgKm1zZywKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKnVzZXJfY2FsbF9JRCwKKwkJCSAgICAgIGVudW0gcnhycGNfY29tbWFuZCAqY29tbWFuZCwKKwkJCSAgICAgIHUzMiAqYWJvcnRfY29kZSwKKwkJCSAgICAgIGJvb2wgKl9leGNsdXNpdmUpCit7CisJc3RydWN0IGNtc2doZHIgKmNtc2c7CisJYm9vbCBnb3RfdXNlcl9JRCA9IGZhbHNlOworCWludCBsZW47CisKKwkqY29tbWFuZCA9IFJYUlBDX0NNRF9TRU5EX0RBVEE7CisKKwlpZiAobXNnLT5tc2dfY29udHJvbGxlbiA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvcl9lYWNoX2Ntc2doZHIoY21zZywgbXNnKSB7CisJCWlmICghQ01TR19PSyhtc2csIGNtc2cpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbGVuID0gY21zZy0+Y21zZ19sZW4gLSBDTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgY21zZ2hkcikpOworCQlfZGVidWcoIkNNU0cgJWQsICVkLCAlZCIsCisJCSAgICAgICBjbXNnLT5jbXNnX2xldmVsLCBjbXNnLT5jbXNnX3R5cGUsIGxlbik7CisKKwkJaWYgKGNtc2ctPmNtc2dfbGV2ZWwgIT0gU09MX1JYUlBDKQorCQkJY29udGludWU7CisKKwkJc3dpdGNoIChjbXNnLT5jbXNnX3R5cGUpIHsKKwkJY2FzZSBSWFJQQ19VU0VSX0NBTExfSUQ6CisJCQlpZiAobXNnLT5tc2dfZmxhZ3MgJiBNU0dfQ01TR19DT01QQVQpIHsKKwkJCQlpZiAobGVuICE9IHNpemVvZih1MzIpKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkqdXNlcl9jYWxsX0lEID0gKih1MzIgKikgQ01TR19EQVRBKGNtc2cpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAobGVuICE9IHNpemVvZih1bnNpZ25lZCBsb25nKSkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJKnVzZXJfY2FsbF9JRCA9ICoodW5zaWduZWQgbG9uZyAqKQorCQkJCQlDTVNHX0RBVEEoY21zZyk7CisJCQl9CisJCQlfZGVidWcoIlVzZXIgQ2FsbCBJRCAlbHgiLCAqdXNlcl9jYWxsX0lEKTsKKwkJCWdvdF91c2VyX0lEID0gdHJ1ZTsKKwkJCWJyZWFrOworCisJCWNhc2UgUlhSUENfQUJPUlQ6CisJCQlpZiAoKmNvbW1hbmQgIT0gUlhSUENfQ01EX1NFTkRfREFUQSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCSpjb21tYW5kID0gUlhSUENfQ01EX1NFTkRfQUJPUlQ7CisJCQlpZiAobGVuICE9IHNpemVvZigqYWJvcnRfY29kZSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkqYWJvcnRfY29kZSA9ICoodW5zaWduZWQgaW50ICopIENNU0dfREFUQShjbXNnKTsKKwkJCV9kZWJ1ZygiQWJvcnQgJXgiLCAqYWJvcnRfY29kZSk7CisJCQlpZiAoKmFib3J0X2NvZGUgPT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCisJCWNhc2UgUlhSUENfQUNDRVBUOgorCQkJaWYgKCpjb21tYW5kICE9IFJYUlBDX0NNRF9TRU5EX0RBVEEpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkqY29tbWFuZCA9IFJYUlBDX0NNRF9BQ0NFUFQ7CisJCQlpZiAobGVuICE9IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKworCQljYXNlIFJYUlBDX0VYQ0xVU0lWRV9DQUxMOgorCQkJKl9leGNsdXNpdmUgPSB0cnVlOworCQkJaWYgKGxlbiAhPSAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCWlmICghZ290X3VzZXJfSUQpCisJCXJldHVybiAtRUlOVkFMOworCV9sZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworfQorCisvKgorICogQ3JlYXRlIGEgbmV3IGNsaWVudCBjYWxsIGZvciBzZW5kbXNnKCkuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcnhycGNfY2FsbCAqCityeHJwY19uZXdfY2xpZW50X2NhbGxfZm9yX3NlbmRtc2coc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCQkJICB1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCwgYm9vbCBleGNsdXNpdmUpCit7CisJc3RydWN0IHJ4cnBjX2Nvbm5fcGFyYW1ldGVycyBjcDsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKwlzdHJ1Y3Qga2V5ICprZXk7CisKKwlERUNMQVJFX1NPQ0tBRERSKHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqLCBzcngsIG1zZy0+bXNnX25hbWUpOworCisJX2VudGVyKCIiKTsKKworCWlmICghbXNnLT5tc2dfbmFtZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVERVNUQUREUlJFUSk7CisKKwlrZXkgPSByeC0+a2V5OworCWlmIChrZXkgJiYgIXJ4LT5rZXktPnBheWxvYWQuZGF0YVswXSkKKwkJa2V5ID0gTlVMTDsKKworCW1lbXNldCgmY3AsIDAsIHNpemVvZihjcCkpOworCWNwLmxvY2FsCQk9IHJ4LT5sb2NhbDsKKwljcC5rZXkJCQk9IHJ4LT5rZXk7CisJY3Auc2VjdXJpdHlfbGV2ZWwJPSByeC0+bWluX3NlY19sZXZlbDsKKwljcC5leGNsdXNpdmUJCT0gcngtPmV4Y2x1c2l2ZSB8IGV4Y2x1c2l2ZTsKKwljcC5zZXJ2aWNlX2lkCQk9IHNyeC0+c3J4X3NlcnZpY2U7CisJY2FsbCA9IHJ4cnBjX25ld19jbGllbnRfY2FsbChyeCwgJmNwLCBzcngsIHVzZXJfY2FsbF9JRCwgR0ZQX0tFUk5FTCk7CisKKwlfbGVhdmUoIiA9ICVwXG4iLCBjYWxsKTsKKwlyZXR1cm4gY2FsbDsKK30KKworLyoKKyAqIHNlbmQgYSBtZXNzYWdlIGZvcm1pbmcgcGFydCBvZiBhIGNsaWVudCBjYWxsIHRocm91Z2ggYW4gUnhSUEMgc29ja2V0CisgKiAtIGNhbGxlciBob2xkcyB0aGUgc29ja2V0IGxvY2tlZAorICogLSB0aGUgc29ja2V0IG1heSBiZSBlaXRoZXIgYSBjbGllbnQgc29ja2V0IG9yIGEgc2VydmVyIHNvY2tldAorICovCitpbnQgcnhycGNfZG9fc2VuZG1zZyhzdHJ1Y3QgcnhycGNfc29jayAqcngsIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3sKKwllbnVtIHJ4cnBjX2NvbW1hbmQgY21kOworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCXVuc2lnbmVkIGxvbmcgdXNlcl9jYWxsX0lEID0gMDsKKwlib29sIGV4Y2x1c2l2ZSA9IGZhbHNlOworCXUzMiBhYm9ydF9jb2RlID0gMDsKKwlpbnQgcmV0OworCisJX2VudGVyKCIiKTsKKworCXJldCA9IHJ4cnBjX3NlbmRtc2dfY21zZyhtc2csICZ1c2VyX2NhbGxfSUQsICZjbWQsICZhYm9ydF9jb2RlLAorCQkJCSAmZXhjbHVzaXZlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChjbWQgPT0gUlhSUENfQ01EX0FDQ0VQVCkgeworCQlpZiAocngtPnNrLnNrX3N0YXRlICE9IFJYUlBDX1NFUlZFUl9MSVNURU5JTkcpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY2FsbCA9IHJ4cnBjX2FjY2VwdF9jYWxsKHJ4LCB1c2VyX2NhbGxfSUQsIE5VTEwpOworCQlpZiAoSVNfRVJSKGNhbGwpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2FsbCk7CisJCXJ4cnBjX3B1dF9jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfcHV0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FsbCA9IHJ4cnBjX2ZpbmRfY2FsbF9ieV91c2VyX0lEKHJ4LCB1c2VyX2NhbGxfSUQpOworCWlmICghY2FsbCkgeworCQlpZiAoY21kICE9IFJYUlBDX0NNRF9TRU5EX0RBVEEpCisJCQlyZXR1cm4gLUVCQURTTFQ7CisJCWNhbGwgPSByeHJwY19uZXdfY2xpZW50X2NhbGxfZm9yX3NlbmRtc2cocngsIG1zZywgdXNlcl9jYWxsX0lELAorCQkJCQkJCSBleGNsdXNpdmUpOworCQlpZiAoSVNfRVJSKGNhbGwpKQorCQkJcmV0dXJuIFBUUl9FUlIoY2FsbCk7CisJfQorCisJX2RlYnVnKCJDQUxMICVkIFVTUiAlbHggU1QgJWQgb24gQ09OTiAlcCIsCisJICAgICAgIGNhbGwtPmRlYnVnX2lkLCBjYWxsLT51c2VyX2NhbGxfSUQsIGNhbGwtPnN0YXRlLCBjYWxsLT5jb25uKTsKKworCWlmIChjYWxsLT5zdGF0ZSA+PSBSWFJQQ19DQUxMX0NPTVBMRVRFKSB7CisJCS8qIGl0J3MgdG9vIGxhdGUgZm9yIHRoaXMgY2FsbCAqLworCQlyZXQgPSAtRVNIVVRET1dOOworCX0gZWxzZSBpZiAoY21kID09IFJYUlBDX0NNRF9TRU5EX0FCT1JUKSB7CisJCXJldCA9IDA7CisJCWlmIChyeHJwY19hYm9ydF9jYWxsKCJDTUQiLCBjYWxsLCAwLCBhYm9ydF9jb2RlLCBFQ09OTkFCT1JURUQpKQorCQkJcmV0ID0gcnhycGNfc2VuZF9jYWxsX3BhY2tldChjYWxsLAorCQkJCQkJICAgICBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVCk7CisJfSBlbHNlIGlmIChjbWQgIT0gUlhSUENfQ01EX1NFTkRfREFUQSkgeworCQlyZXQgPSAtRUlOVkFMOworCX0gZWxzZSBpZiAocnhycGNfaXNfY2xpZW50X2NhbGwoY2FsbCkgJiYKKwkJICAgY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9DTElFTlRfU0VORF9SRVFVRVNUKSB7CisJCS8qIHJlcXVlc3QgcGhhc2UgY29tcGxldGUgZm9yIHRoaXMgY2xpZW50IGNhbGwgKi8KKwkJcmV0ID0gLUVQUk9UTzsKKwl9IGVsc2UgaWYgKHJ4cnBjX2lzX3NlcnZpY2VfY2FsbChjYWxsKSAmJgorCQkgICBjYWxsLT5zdGF0ZSAhPSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0tfUkVRVUVTVCAmJgorCQkgICBjYWxsLT5zdGF0ZSAhPSBSWFJQQ19DQUxMX1NFUlZFUl9TRU5EX1JFUExZKSB7CisJCS8qIFJlcGx5IHBoYXNlIG5vdCBiZWd1biBvciBub3QgY29tcGxldGUgZm9yIHNlcnZpY2UgY2FsbC4gKi8KKwkJcmV0ID0gLUVQUk9UTzsKKwl9IGVsc2UgeworCQlyZXQgPSByeHJwY19zZW5kX2RhdGEocngsIGNhbGwsIG1zZywgbGVuKTsKKwl9CisKKwlyeHJwY19wdXRfY2FsbChjYWxsLCByeHJwY19jYWxsX3B1dCk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiByeHJwY19rZXJuZWxfc2VuZF9kYXRhIC0gQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBzZW5kIGRhdGEgb24gYSBjYWxsCisgKiBAc29jazogVGhlIHNvY2tldCB0aGUgY2FsbCBpcyBvbgorICogQGNhbGw6IFRoZSBjYWxsIHRvIHNlbmQgZGF0YSB0aHJvdWdoCisgKiBAbXNnOiBUaGUgZGF0YSB0byBzZW5kCisgKiBAbGVuOiBUaGUgYW1vdW50IG9mIGRhdGEgdG8gc2VuZAorICoKKyAqIEFsbG93IGEga2VybmVsIHNlcnZpY2UgdG8gc2VuZCBkYXRhIG9uIGEgY2FsbC4gIFRoZSBjYWxsIG11c3QgYmUgaW4gYW4gc3RhdGUKKyAqIGFwcHJvcHJpYXRlIHRvIHNlbmRpbmcgZGF0YS4gIE5vIGNvbnRyb2wgZGF0YSBzaG91bGQgYmUgc3VwcGxpZWQgaW4gQG1zZywKKyAqIG5vciBzaG91bGQgYW4gYWRkcmVzcyBiZSBzdXBwbGllZC4gIE1TR19NT1JFIHNob3VsZCBiZSBmbGFnZ2VkIGlmIHRoZXJlJ3MKKyAqIG1vcmUgZGF0YSB0byBjb21lLCBvdGhlcndpc2UgdGhpcyBkYXRhIHdpbGwgZW5kIHRoZSB0cmFuc21pc3Npb24gcGhhc2UuCisgKi8KK2ludCByeHJwY19rZXJuZWxfc2VuZF9kYXRhKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQoreworCWludCByZXQ7CisKKwlfZW50ZXIoInslZCwlc30sIiwgY2FsbC0+ZGVidWdfaWQsIHJ4cnBjX2NhbGxfc3RhdGVzW2NhbGwtPnN0YXRlXSk7CisKKwlBU1NFUlRDTVAobXNnLT5tc2dfbmFtZSwgPT0sIE5VTEwpOworCUFTU0VSVENNUChtc2ctPm1zZ19jb250cm9sLCA9PSwgTlVMTCk7CisKKwlsb2NrX3NvY2soc29jay0+c2spOworCisJX2RlYnVnKCJDQUxMICVkIFVTUiAlbHggU1QgJWQgb24gQ09OTiAlcCIsCisJICAgICAgIGNhbGwtPmRlYnVnX2lkLCBjYWxsLT51c2VyX2NhbGxfSUQsIGNhbGwtPnN0YXRlLCBjYWxsLT5jb25uKTsKKworCWlmIChjYWxsLT5zdGF0ZSA+PSBSWFJQQ19DQUxMX0NPTVBMRVRFKSB7CisJCXJldCA9IC1FU0hVVERPV047IC8qIGl0J3MgdG9vIGxhdGUgZm9yIHRoaXMgY2FsbCAqLworCX0gZWxzZSBpZiAoY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9DTElFTlRfU0VORF9SRVFVRVNUICYmCisJCSAgIGNhbGwtPnN0YXRlICE9IFJYUlBDX0NBTExfU0VSVkVSX0FDS19SRVFVRVNUICYmCisJCSAgIGNhbGwtPnN0YXRlICE9IFJYUlBDX0NBTExfU0VSVkVSX1NFTkRfUkVQTFkpIHsKKwkJcmV0ID0gLUVQUk9UTzsgLyogcmVxdWVzdCBwaGFzZSBjb21wbGV0ZSBmb3IgdGhpcyBjbGllbnQgY2FsbCAqLworCX0gZWxzZSB7CisJCXJldCA9IHJ4cnBjX3NlbmRfZGF0YShyeHJwY19zayhzb2NrLT5zayksIGNhbGwsIG1zZywgbGVuKTsKKwl9CisKKwlyZWxlYXNlX3NvY2soc29jay0+c2spOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHJ4cnBjX2tlcm5lbF9zZW5kX2RhdGEpOworCisvKioKKyAqIHJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsIC0gQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBhYm9ydCBhIGNhbGwKKyAqIEBzb2NrOiBUaGUgc29ja2V0IHRoZSBjYWxsIGlzIG9uCisgKiBAY2FsbDogVGhlIGNhbGwgdG8gYmUgYWJvcnRlZAorICogQGFib3J0X2NvZGU6IFRoZSBhYm9ydCBjb2RlIHRvIHN0aWNrIGludG8gdGhlIEFCT1JUIHBhY2tldAorICogQGVycm9yOiBMb2NhbCBlcnJvciB2YWx1ZQorICogQHdoeTogMy1jaGFyIHN0cmluZyBpbmRpY2F0aW5nIHdoeS4KKyAqCisgKiBBbGxvdyBhIGtlcm5lbCBzZXJ2aWNlIHRvIGFib3J0IGEgY2FsbCwgaWYgaXQncyBzdGlsbCBpbiBhbiBhYm9ydGFibGUgc3RhdGUuCisgKi8KK3ZvaWQgcnhycGNfa2VybmVsX2Fib3J0X2NhbGwoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkgICAgIHUzMiBhYm9ydF9jb2RlLCBpbnQgZXJyb3IsIGNvbnN0IGNoYXIgKndoeSkKK3sKKwlfZW50ZXIoInslZH0sJWQsJWQsJXMiLCBjYWxsLT5kZWJ1Z19pZCwgYWJvcnRfY29kZSwgZXJyb3IsIHdoeSk7CisKKwlsb2NrX3NvY2soc29jay0+c2spOworCisJaWYgKHJ4cnBjX2Fib3J0X2NhbGwod2h5LCBjYWxsLCAwLCBhYm9ydF9jb2RlLCBlcnJvcikpCisJCXJ4cnBjX3NlbmRfY2FsbF9wYWNrZXQoY2FsbCwgUlhSUENfUEFDS0VUX1RZUEVfQUJPUlQpOworCisJcmVsZWFzZV9zb2NrKHNvY2stPnNrKTsKKwlfbGVhdmUoIiIpOworfQorCitFWFBPUlRfU1lNQk9MKHJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsKTsKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9za2J1ZmYuYyBiL25ldC9yeHJwYy9za2J1ZmYuYwppbmRleCBlZWUwY2ZkOS4uNjdiMDJjNCAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL3NrYnVmZi5jCisrKyBiL25ldC9yeHJwYy9za2J1ZmYuYwpAQCAtMTgsMTIxICsxOCw4MiBAQAogI2luY2x1ZGUgPG5ldC9hZl9yeHJwYy5oPgogI2luY2x1ZGUgImFyLWludGVybmFsLmgiCiAKKyNkZWZpbmUgc2VsZWN0X3NrYl9jb3VudChvcCkgKG9wID49IHJ4cnBjX3NrYl90eF9jbGVhbmVkID8gJnJ4cnBjX25fdHhfc2ticyA6ICZyeHJwY19uX3J4X3NrYnMpCisKIC8qCi0gKiBzZXQgdXAgZm9yIHRoZSBBQ0sgYXQgdGhlIGVuZCBvZiB0aGUgcmVjZWl2ZSBwaGFzZSB3aGVuIHdlIGRpc2NhcmQgdGhlIGZpbmFsCi0gKiByZWNlaXZlIHBoYXNlIGRhdGEgcGFja2V0Ci0gKiAtIGNhbGxlZCB3aXRoIHNvZnRpcnFzIGRpc2FibGVkCisgKiBOb3RlIHRoZSBhbGxvY2F0aW9uIG9yIHJlY2VwdGlvbiBvZiBhIHNvY2tldCBidWZmZXIuCiAgKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX3JlcXVlc3RfZmluYWxfQUNLKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQordm9pZCByeHJwY19uZXdfc2tiKHN0cnVjdCBza19idWZmICpza2IsIGVudW0gcnhycGNfc2tiX3RyYWNlIG9wKQogewotCS8qIHRoZSBjYWxsIG1heSBiZSBhYm9ydGVkIGJlZm9yZSB3ZSBoYXZlIGEgY2hhbmNlIHRvIEFDSyBpdCAqLwotCXdyaXRlX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOwotCi0Jc3dpdGNoIChjYWxsLT5zdGF0ZSkgewotCWNhc2UgUlhSUENfQ0FMTF9DTElFTlRfUkVDVl9SRVBMWToKLQkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX0NMSUVOVF9GSU5BTF9BQ0s7Ci0JCV9kZWJ1ZygicmVxdWVzdCBmaW5hbCBBQ0siKTsKLQotCQkvKiBnZXQgYW4gZXh0cmEgcmVmIG9uIHRoZSBjYWxsIGZvciB0aGUgZmluYWwtQUNLIGdlbmVyYXRvciB0bwotCQkgKiByZWxlYXNlICovCi0JCXJ4cnBjX2dldF9jYWxsKGNhbGwpOwotCQlzZXRfYml0KFJYUlBDX0NBTExfRVZfQUNLX0ZJTkFMLCAmY2FsbC0+ZXZlbnRzKTsKLQkJaWYgKHRyeV90b19kZWxfdGltZXJfc3luYygmY2FsbC0+YWNrX3RpbWVyKSA+PSAwKQotCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFJYUlBDX0NBTExfU0VSVkVSX1JFQ1ZfUkVRVUVTVDoKLQkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0tfUkVRVUVTVDsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQl3cml0ZV91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCWNvbnN0IHZvaWQgKmhlcmUgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7CisJaW50IG4gPSBhdG9taWNfaW5jX3JldHVybihzZWxlY3Rfc2tiX2NvdW50KG9wKSk7CisJdHJhY2VfcnhycGNfc2tiKHNrYiwgb3AsIGF0b21pY19yZWFkKCZza2ItPnVzZXJzKSwgbiwgaGVyZSk7CiB9CiAKIC8qCi0gKiBkcm9wIHRoZSBib3R0b20gQUNLIG9mZiBvZiB0aGUgY2FsbCBBQ0sgd2luZG93IGFuZCBhZHZhbmNlIHRoZSB3aW5kb3cKKyAqIE5vdGUgdGhlIHJlLWVtZXJnZW5jZSBvZiBhIHNvY2tldCBidWZmZXIgZnJvbSBhIHF1ZXVlIG9yIGJ1ZmZlci4KICAqLwotc3RhdGljIHZvaWQgcnhycGNfaGFyZF9BQ0tfZGF0YShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwKQordm9pZCByeHJwY19zZWVfc2tiKHN0cnVjdCBza19idWZmICpza2IsIGVudW0gcnhycGNfc2tiX3RyYWNlIG9wKQogewotCWludCBsb29wOwotCXUzMiBzZXE7Ci0KLQlzcGluX2xvY2tfYmgoJmNhbGwtPmxvY2spOwotCi0JX2RlYnVnKCJoYXJkIEFDSyAjJXUiLCBzcC0+aGRyLnNlcSk7Ci0KLQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgUlhSUENfQUNLUl9XSU5ET1dfQVNaOyBsb29wKyspIHsKLQkJY2FsbC0+YWNrcl93aW5kb3dbbG9vcF0gPj49IDE7Ci0JCWNhbGwtPmFja3Jfd2luZG93W2xvb3BdIHw9Ci0JCQljYWxsLT5hY2tyX3dpbmRvd1tsb29wICsgMV0gPDwgKEJJVFNfUEVSX0xPTkcgLSAxKTsKKwljb25zdCB2b2lkICpoZXJlID0gX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOworCWlmIChza2IpIHsKKwkJaW50IG4gPSBhdG9taWNfcmVhZChzZWxlY3Rfc2tiX2NvdW50KG9wKSk7CisJCXRyYWNlX3J4cnBjX3NrYihza2IsIG9wLCBhdG9taWNfcmVhZCgmc2tiLT51c2VycyksIG4sIGhlcmUpOwogCX0KLQotCXNlcSA9IHNwLT5oZHIuc2VxOwotCUFTU0VSVENNUChzZXEsID09LCBjYWxsLT5yeF9kYXRhX2VhdGVuICsgMSk7Ci0JY2FsbC0+cnhfZGF0YV9lYXRlbiA9IHNlcTsKLQotCWlmIChjYWxsLT5hY2tyX3dpbl90b3AgPCBVSU5UX01BWCkKLQkJY2FsbC0+YWNrcl93aW5fdG9wKys7Ci0KLQlBU1NFUlRJRkNNUChjYWxsLT5zdGF0ZSA8PSBSWFJQQ19DQUxMX0NPTVBMRVRFLAotCQkgICAgY2FsbC0+cnhfZGF0YV9wb3N0LCA+PSwgY2FsbC0+cnhfZGF0YV9yZWN2KTsKLQlBU1NFUlRJRkNNUChjYWxsLT5zdGF0ZSA8PSBSWFJQQ19DQUxMX0NPTVBMRVRFLAotCQkgICAgY2FsbC0+cnhfZGF0YV9yZWN2LCA+PSwgY2FsbC0+cnhfZGF0YV9lYXRlbik7Ci0KLQlpZiAoc3AtPmhkci5mbGFncyAmIFJYUlBDX0xBU1RfUEFDS0VUKSB7Ci0JCXJ4cnBjX3JlcXVlc3RfZmluYWxfQUNLKGNhbGwpOwotCX0gZWxzZSBpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmY2FsbC0+YWNrcl9ub3RfaWRsZSkgJiYKLQkJICAgdGVzdF9hbmRfY2xlYXJfYml0KFJYUlBDX0NBTExfVFhfU09GVF9BQ0ssICZjYWxsLT5mbGFncykpIHsKLQkJLyogV2UgcHJldmlvdXNseSBzb2Z0LUFDSydkIHNvbWUgcmVjZWl2ZWQgcGFja2V0cyB0aGF0IGhhdmUgbm93Ci0JCSAqIGJlZW4gY29uc3VtZWQsIHNvIHNlbmQgYSBoYXJkLUFDSyBpZiBubyBtb3JlIHBhY2tldHMgYXJlCi0JCSAqIGltbWVkaWF0ZWx5IGZvcnRoY29taW5nIHRvIGFsbG93IHRoZSB0cmFuc21pdHRlciB0byBmcmVlIHVwCi0JCSAqIGl0cyBUeCBidWZmZXJhZ2UuCi0JCSAqLwotCQlfZGVidWcoInNlbmQgUnggaWRsZSBBQ0siKTsKLQkJX19yeHJwY19wcm9wb3NlX0FDSyhjYWxsLCBSWFJQQ19BQ0tfSURMRSwgc3AtPmhkci5zZXJpYWwsCi0JCQkJICAgIGZhbHNlKTsKLQl9Ci0KLQlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7CiB9CiAKIC8qCi0gKiBkZXN0cm95IGEgcGFja2V0IHRoYXQgaGFzIGFuIFJ4UlBDIGNvbnRyb2wgYnVmZmVyCi0gKiAtIGFkdmFuY2UgdGhlIGhhcmQtQUNLIHN0YXRlIG9mIHRoZSBwYXJlbnQgY2FsbCAoZG9uZSBoZXJlIGluIGNhc2Ugc29tZXRoaW5nCi0gKiAgIGluIHRoZSBrZXJuZWwgYnlwYXNzZXMgcmVjdm1zZygpIGFuZCBzdGVhbHMgdGhlIHBhY2tldCBkaXJlY3RseSBvZmYgb2YgdGhlCi0gKiAgIHNvY2tldCByZWNlaXZlIHF1ZXVlKQorICogTm90ZSB0aGUgYWRkaXRpb24gb2YgYSByZWYgb24gYSBzb2NrZXQgYnVmZmVyLgogICovCi12b2lkIHJ4cnBjX3BhY2tldF9kZXN0cnVjdG9yKHN0cnVjdCBza19idWZmICpza2IpCit2b2lkIHJ4cnBjX2dldF9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgZW51bSByeHJwY19za2JfdHJhY2Ugb3ApCiB7Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCA9IHJ4cnBjX3NrYihza2IpOwotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsID0gc3AtPmNhbGw7CisJY29uc3Qgdm9pZCAqaGVyZSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKwlpbnQgbiA9IGF0b21pY19pbmNfcmV0dXJuKHNlbGVjdF9za2JfY291bnQob3ApKTsKKwl0cmFjZV9yeHJwY19za2Ioc2tiLCBvcCwgYXRvbWljX3JlYWQoJnNrYi0+dXNlcnMpLCBuLCBoZXJlKTsKKwlza2JfZ2V0KHNrYik7Cit9CiAKLQlfZW50ZXIoIiVweyVwfSIsIHNrYiwgY2FsbCk7Ci0KLQlpZiAoY2FsbCkgewotCQkvKiBzZW5kIHRoZSBmaW5hbCBBQ0sgb24gYSBjbGllbnQgY2FsbCAqLwotCQlpZiAoc3AtPmhkci50eXBlID09IFJYUlBDX1BBQ0tFVF9UWVBFX0RBVEEpCi0JCQlyeHJwY19oYXJkX0FDS19kYXRhKGNhbGwsIHNwKTsKLQkJcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0JCXNwLT5jYWxsID0gTlVMTDsKKy8qCisgKiBOb3RlIHRoZSBkZXN0cnVjdGlvbiBvZiBhIHNvY2tldCBidWZmZXIuCisgKi8KK3ZvaWQgcnhycGNfZnJlZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgZW51bSByeHJwY19za2JfdHJhY2Ugb3ApCit7CisJY29uc3Qgdm9pZCAqaGVyZSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKwlpZiAoc2tiKSB7CisJCWludCBuOworCQlDSEVDS19TTEFCX09LQVkoJnNrYi0+dXNlcnMpOworCQluID0gYXRvbWljX2RlY19yZXR1cm4oc2VsZWN0X3NrYl9jb3VudChvcCkpOworCQl0cmFjZV9yeHJwY19za2Ioc2tiLCBvcCwgYXRvbWljX3JlYWQoJnNrYi0+dXNlcnMpLCBuLCBoZXJlKTsKKwkJa2ZyZWVfc2tiKHNrYik7CiAJfQotCi0JaWYgKHNrYi0+c2spCi0JCXNvY2tfcmZyZWUoc2tiKTsKLQlfbGVhdmUoIiIpOwogfQogCi0vKioKLSAqIHJ4cnBjX2tlcm5lbF9mcmVlX3NrYiAtIEZyZWUgYW4gUnhSUEMgc29ja2V0IGJ1ZmZlcgotICogQHNrYjogVGhlIHNvY2tldCBidWZmZXIgdG8gYmUgZnJlZWQKLSAqCi0gKiBMZXQgUnhSUEMgZnJlZSBpdHMgb3duIHNvY2tldCBidWZmZXIsIHBlcm1pdHRpbmcgaXQgdG8gbWFpbnRhaW4gZGVidWcKLSAqIGFjY291bnRpbmcuCisvKgorICogTm90ZSB0aGUgaW5qZWN0ZWQgbG9zcyBvZiBhIHNvY2tldCBidWZmZXIuCiAgKi8KLXZvaWQgcnhycGNfa2VybmVsX2ZyZWVfc2tiKHN0cnVjdCBza19idWZmICpza2IpCit2b2lkIHJ4cnBjX2xvc2Vfc2tiKHN0cnVjdCBza19idWZmICpza2IsIGVudW0gcnhycGNfc2tiX3RyYWNlIG9wKQogewotCXJ4cnBjX2ZyZWVfc2tiKHNrYik7CisJY29uc3Qgdm9pZCAqaGVyZSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKwlpZiAoc2tiKSB7CisJCWludCBuOworCQlDSEVDS19TTEFCX09LQVkoJnNrYi0+dXNlcnMpOworCQluID0gYXRvbWljX2RlY19yZXR1cm4oc2VsZWN0X3NrYl9jb3VudChvcCkpOworCQl0cmFjZV9yeHJwY19za2Ioc2tiLCBvcCwgYXRvbWljX3JlYWQoJnNrYi0+dXNlcnMpLCBuLCBoZXJlKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJfQogfQotRVhQT1JUX1NZTUJPTChyeHJwY19rZXJuZWxfZnJlZV9za2IpOworCisvKgorICogQ2xlYXIgYSBxdWV1ZSBvZiBzb2NrZXQgYnVmZmVycy4KKyAqLwordm9pZCByeHJwY19wdXJnZV9xdWV1ZShzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0KQoreworCWNvbnN0IHZvaWQgKmhlcmUgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKChsaXN0KSkpICE9IE5VTEwpIHsKKwkJaW50IG4gPSBhdG9taWNfZGVjX3JldHVybihzZWxlY3Rfc2tiX2NvdW50KHJ4cnBjX3NrYl9yeF9wdXJnZWQpKTsKKwkJdHJhY2VfcnhycGNfc2tiKHNrYiwgcnhycGNfc2tiX3J4X3B1cmdlZCwKKwkJCQlhdG9taWNfcmVhZCgmc2tiLT51c2VycyksIG4sIGhlcmUpOworCQlrZnJlZV9za2Ioc2tiKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvc3lzY3RsLmMgYi9uZXQvcnhycGMvc3lzY3RsLmMKaW5kZXggMDNhZDA4Ny4uMzRjNzA2ZCAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL3N5c2N0bC5jCisrKyBiL25ldC9yeHJwYy9zeXNjdGwuYwpAQCAtMjAsNyArMjAsNyBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBmb3VyID0gNDsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdGhpcnR5dHdvID0gMzI7CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5fNjU1MzUgPSA2NTUzNTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbl9tYXhfYWNrcyA9IFJYUlBDX01BWEFDS1M7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5fbWF4X2Fja3MgPSBSWFJQQ19SWFRYX0JVRkZfU0laRSAtIDE7CiAKIC8qCiAgKiBSeFJQQyBvcGVyYXRpbmcgcGFyYW1ldGVycy4KQEAgLTM1LDcgKzM1LDcgQEAKIAkJLmRhdGEJCT0gJnJ4cnBjX3JlcXVlc3RlZF9hY2tfZGVsYXksCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCiAJCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX21zX2ppZmZpZXMsCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAogCQkuZXh0cmExCQk9ICh2b2lkICopJnplcm8sCiAJfSwKIAl7CkBAIC00Myw3ICs0Myw3IEBACiAJCS5kYXRhCQk9ICZyeHJwY19zb2Z0X2Fja19kZWxheSwKIAkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKIAkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfbXNfamlmZmllcywKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCiAJCS5leHRyYTEJCT0gKHZvaWQgKikmb25lLAogCX0sCiAJewpAQCAtNTEsNyArNTEsNyBAQAogCQkuZGF0YQkJPSAmcnhycGNfaWRsZV9hY2tfZGVsYXksCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCiAJCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX21zX2ppZmZpZXMsCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAogCQkuZXh0cmExCQk9ICh2b2lkICopJm9uZSwKIAl9LAogCXsKQEAgLTU5LDYgKzU5LDIyIEBACiAJCS5kYXRhCQk9ICZyeHJwY19yZXNlbmRfdGltZW91dCwKIAkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKIAkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCisJCS5leHRyYTEJCT0gKHZvaWQgKikmb25lLAorCX0sCisJeworCQkucHJvY25hbWUJPSAiaWRsZV9jb25uX2V4cGlyeSIsCisJCS5kYXRhCQk9ICZyeHJwY19jb25uX2lkbGVfY2xpZW50X2V4cGlyeSwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfbXNfamlmZmllcywKKwkJLmV4dHJhMQkJPSAodm9pZCAqKSZvbmUsCisJfSwKKwl7CisJCS5wcm9jbmFtZQk9ICJpZGxlX2Nvbm5fZmFzdF9leHBpcnkiLAorCQkuZGF0YQkJPSAmcnhycGNfY29ubl9pZGxlX2NsaWVudF9mYXN0X2V4cGlyeSwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKIAkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfbXNfamlmZmllcywKIAkJLmV4dHJhMQkJPSAodm9pZCAqKSZvbmUsCiAJfSwKQEAgLTY5LDMwICs4NSwyOSBAQAogCQkuZGF0YQkJPSAmcnhycGNfbWF4X2NhbGxfbGlmZXRpbWUsCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCiAJCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JCS5leHRyYTEJCT0gKHZvaWQgKikmb25lLAotCX0sCi0JewotCQkucHJvY25hbWUJPSAiZGVhZF9jYWxsX2V4cGlyeSIsCi0JCS5kYXRhCQk9ICZyeHJwY19kZWFkX2NhbGxfZXhwaXJ5LAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19qaWZmaWVzLAotCQkuZXh0cmExCQk9ICh2b2lkICopJm9uZSwKLQl9LAotCi0JLyogVmFsdWVzIG1lYXN1cmVkIGluIHNlY29uZHMgKi8KLQl7Ci0JCS5wcm9jbmFtZQk9ICJjb25uZWN0aW9uX2V4cGlyeSIsCi0JCS5kYXRhCQk9ICZyeHJwY19jb25uZWN0aW9uX2V4cGlyeSwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYywKIAkJLmV4dHJhMQkJPSAodm9pZCAqKSZvbmUsCiAJfSwKIAogCS8qIE5vbi10aW1lIHZhbHVlcyAqLwogCXsKKwkJLnByb2NuYW1lCT0gIm1heF9jbGllbnRfY29ubnMiLAorCQkuZGF0YQkJPSAmcnhycGNfbWF4X2NsaWVudF9jb25uZWN0aW9ucywKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuZXh0cmExCQk9ICh2b2lkICopJnJ4cnBjX3JlYXBfY2xpZW50X2Nvbm5lY3Rpb25zLAorCX0sCisJeworCQkucHJvY25hbWUJPSAicmVhcF9jbGllbnRfY29ubnMiLAorCQkuZGF0YQkJPSAmcnhycGNfcmVhcF9jbGllbnRfY29ubmVjdGlvbnMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLmV4dHJhMQkJPSAodm9pZCAqKSZvbmUsCisJCS5leHRyYTIJCT0gKHZvaWQgKikmcnhycGNfbWF4X2NsaWVudF9jb25uZWN0aW9ucywKKwl9LAorCXsKIAkJLnByb2NuYW1lCT0gIm1heF9iYWNrbG9nIiwKIAkJLmRhdGEJCT0gJnJ4cnBjX21heF9iYWNrbG9nLAogCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLApkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL3V0aWxzLmMgYi9uZXQvcnhycGMvdXRpbHMuYwppbmRleCBiODg5MTRkLi5mZjdhZjcxIDEwMDY0NAotLS0gYS9uZXQvcnhycGMvdXRpbHMuYworKysgYi9uZXQvcnhycGMvdXRpbHMuYwpAQCAtMzAsNiArMzAsNyBAQAogCQlzcngtPnRyYW5zcG9ydC5zaW4uc2luX2FkZHIuc19hZGRyID0gaXBfaGRyKHNrYiktPnNhZGRyOwogCQlyZXR1cm4gMDsKIAorI2lmZGVmIENPTkZJR19BRl9SWFJQQ19JUFY2CiAJY2FzZSBFVEhfUF9JUFY2OgogCQlzcngtPnRyYW5zcG9ydF90eXBlID0gU09DS19ER1JBTTsKIAkJc3J4LT50cmFuc3BvcnRfbGVuID0gc2l6ZW9mKHNyeC0+dHJhbnNwb3J0LnNpbjYpOwpAQCAtMzcsNiArMzgsNyBAQAogCQlzcngtPnRyYW5zcG9ydC5zaW42LnNpbjZfcG9ydCA9IHVkcF9oZHIoc2tiKS0+c291cmNlOwogCQlzcngtPnRyYW5zcG9ydC5zaW42LnNpbjZfYWRkciA9IGlwdjZfaGRyKHNrYiktPnNhZGRyOwogCQlyZXR1cm4gMDsKKyNlbmRpZgogCiAJZGVmYXVsdDoKIAkJcHJfd2Fybl9yYXRlbGltaXRlZCgiQUZfUlhSUEM6IFVua25vd24gZXRoIHByb3RvY29sICV1XG4iLApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL0tjb25maWcgYi9uZXQvc2NoZWQvS2NvbmZpZwppbmRleCBjY2Y5MzFiLi44Nzk1NmE3IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvS2NvbmZpZworKysgYi9uZXQvc2NoZWQvS2NvbmZpZwpAQCAtNzQ5LDYgKzc0OSwxNyBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFjdF9jb25ubWFyay4KIAorY29uZmlnIE5FVF9BQ1RfU0tCTU9ECisgICAgICAgIHRyaXN0YXRlICJza2IgZGF0YSBtb2RpZmljYXRpb24gYWN0aW9uIgorICAgICAgICBkZXBlbmRzIG9uIE5FVF9DTFNfQUNUCisgICAgICAgIC0tLWhlbHAtLS0KKyAgICAgICAgIFNheSBZIGhlcmUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIG9mIHNrYiBkYXRhCisKKyAgICAgICAgIElmIHVuc3VyZSwgc2F5IE4uCisKKyAgICAgICAgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKyAgICAgICAgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhY3Rfc2tibW9kLgorCiBjb25maWcgTkVUX0FDVF9JRkUKICAgICAgICAgdHJpc3RhdGUgIkludGVyLUZFIGFjdGlvbiBiYXNlZCBvbiBJRVRGIEZvckNFUyBJbnRlckZFIExGQiIKICAgICAgICAgZGVwZW5kcyBvbiBORVRfQ0xTX0FDVApAQCAtNzYxLDYgKzc3MiwxNyBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFjdF9pZmUuCiAKK2NvbmZpZyBORVRfQUNUX1RVTk5FTF9LRVkKKyAgICAgICAgdHJpc3RhdGUgIklQIHR1bm5lbCBtZXRhZGF0YSBtYW5pcHVsYXRpb24iCisgICAgICAgIGRlcGVuZHMgb24gTkVUX0NMU19BQ1QKKyAgICAgICAgLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSB0byBzZXQvcmVsZWFzZSBpcCB0dW5uZWwgbWV0YWRhdGEuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhY3RfdHVubmVsX2tleS4KKwogY29uZmlnIE5FVF9JRkVfU0tCTUFSSwogICAgICAgICB0cmlzdGF0ZSAiU3VwcG9ydCB0byBlbmNvZGluZyBkZWNvZGluZyBza2IgbWFyayBvbiBJRkUgYWN0aW9uIgogICAgICAgICBkZXBlbmRzIG9uIE5FVF9BQ1RfSUZFCkBAIC03NzEsNiArNzkzLDExIEBACiAgICAgICAgIGRlcGVuZHMgb24gTkVUX0FDVF9JRkUKICAgICAgICAgLS0taGVscC0tLQogCitjb25maWcgTkVUX0lGRV9TS0JUQ0lOREVYCisgICAgICAgIHRyaXN0YXRlICJTdXBwb3J0IHRvIGVuY29kaW5nIGRlY29kaW5nIHNrYiB0Y2luZGV4IG9uIElGRSBhY3Rpb24iCisgICAgICAgIGRlcGVuZHMgb24gTkVUX0FDVF9JRkUKKyAgICAgICAgLS0taGVscC0tLQorCiBjb25maWcgTkVUX0NMU19JTkQKIAlib29sICJJbmNvbWluZyBkZXZpY2UgY2xhc3NpZmljYXRpb24iCiAJZGVwZW5kcyBvbiBORVRfQ0xTX1UzMiB8fCBORVRfQ0xTX0ZXCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvTWFrZWZpbGUgYi9uZXQvc2NoZWQvTWFrZWZpbGUKaW5kZXggYWUwODhhNS4uNGJkZGEzNiAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL01ha2VmaWxlCisrKyBiL25ldC9zY2hlZC9NYWtlZmlsZQpAQCAtMTksOSArMTksMTIgQEAKIG9iai0kKENPTkZJR19ORVRfQUNUX1ZMQU4pCSs9IGFjdF92bGFuLm8KIG9iai0kKENPTkZJR19ORVRfQUNUX0JQRikJKz0gYWN0X2JwZi5vCiBvYmotJChDT05GSUdfTkVUX0FDVF9DT05OTUFSSykJKz0gYWN0X2Nvbm5tYXJrLm8KK29iai0kKENPTkZJR19ORVRfQUNUX1NLQk1PRCkJKz0gYWN0X3NrYm1vZC5vCiBvYmotJChDT05GSUdfTkVUX0FDVF9JRkUpCSs9IGFjdF9pZmUubwogb2JqLSQoQ09ORklHX05FVF9JRkVfU0tCTUFSSykJKz0gYWN0X21ldGFfbWFyay5vCiBvYmotJChDT05GSUdfTkVUX0lGRV9TS0JQUklPKQkrPSBhY3RfbWV0YV9za2JwcmlvLm8KK29iai0kKENPTkZJR19ORVRfSUZFX1NLQlRDSU5ERVgpCSs9IGFjdF9tZXRhX3NrYnRjaW5kZXgubworb2JqLSQoQ09ORklHX05FVF9BQ1RfVFVOTkVMX0tFWSkrPSBhY3RfdHVubmVsX2tleS5vCiBvYmotJChDT05GSUdfTkVUX1NDSF9GSUZPKQkrPSBzY2hfZmlmby5vCiBvYmotJChDT05GSUdfTkVUX1NDSF9DQlEpCSs9IHNjaF9jYnEubwogb2JqLSQoQ09ORklHX05FVF9TQ0hfSFRCKQkrPSBzY2hfaHRiLm8KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfYXBpLmMgYi9uZXQvc2NoZWQvYWN0X2FwaS5jCmluZGV4IGU0YTVmMjYuLmM5MTAyMTcgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfYXBpLmMKKysrIGIvbmV0L3NjaGVkL2FjdF9hcGkuYwpAQCAtNjQsNyArNjQsNiBAQAogCQlpZiAocC0+dGNmYV9iaW5kY250IDw9IDAgJiYgcC0+dGNmYV9yZWZjbnQgPD0gMCkgewogCQkJaWYgKHAtPm9wcy0+Y2xlYW51cCkKIAkJCQlwLT5vcHMtPmNsZWFudXAocCwgYmluZCk7Ci0JCQlsaXN0X2RlbCgmcC0+bGlzdCk7CiAJCQl0Y2ZfaGFzaF9kZXN0cm95KHAtPmhpbmZvLCBwKTsKIAkJCXJldCA9IEFDVF9QX0RFTEVURUQ7CiAJCX0KQEAgLTQyMSwxOCArNDIwLDE5IEBACiAJcmV0dXJuIHJlczsKIH0KIAotaW50IHRjZl9hY3Rpb25fZXhlYyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbGlzdF9oZWFkICphY3Rpb25zLAotCQkgICAgc3RydWN0IHRjZl9yZXN1bHQgKnJlcykKK2ludCB0Y2ZfYWN0aW9uX2V4ZWMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjX2FjdGlvbiAqKmFjdGlvbnMsCisJCSAgICBpbnQgbnJfYWN0aW9ucywgc3RydWN0IHRjZl9yZXN1bHQgKnJlcykKIHsKLQljb25zdCBzdHJ1Y3QgdGNfYWN0aW9uICphOwotCWludCByZXQgPSAtMTsKKwlpbnQgcmV0ID0gLTEsIGk7CiAKIAlpZiAoc2tiLT50Y192ZXJkICYgVENfTkNMUykgewogCQlza2ItPnRjX3ZlcmQgPSBDTFJfVENfTkNMUyhza2ItPnRjX3ZlcmQpOwogCQlyZXQgPSBUQ19BQ1RfT0s7CiAJCWdvdG8gZXhlY19kb25lOwogCX0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGEsIGFjdGlvbnMsIGxpc3QpIHsKKwlmb3IgKGkgPSAwOyBpIDwgbnJfYWN0aW9uczsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCB0Y19hY3Rpb24gKmEgPSBhY3Rpb25zW2ldOworCiByZXBlYXQ6CiAJCXJldCA9IGEtPm9wcy0+YWN0KHNrYiwgYSwgcmVzKTsKIAkJaWYgKHJldCA9PSBUQ19BQ1RfUkVQRUFUKQpAQCAtNTkyLDkgKzU5MiwxOSBAQAogCXJldHVybiBFUlJfUFRSKGVycik7CiB9CiAKLWludCB0Y2ZfYWN0aW9uX2luaXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgbmxhdHRyICpubGEsCi0JCQkJICBzdHJ1Y3QgbmxhdHRyICplc3QsIGNoYXIgKm5hbWUsIGludCBvdnIsCi0JCQkJICBpbnQgYmluZCwgc3RydWN0IGxpc3RfaGVhZCAqYWN0aW9ucykKK3N0YXRpYyB2b2lkIGNsZWFudXBfYShzdHJ1Y3QgbGlzdF9oZWFkICphY3Rpb25zLCBpbnQgb3ZyKQoreworCXN0cnVjdCB0Y19hY3Rpb24gKmE7CisKKwlpZiAoIW92cikKKwkJcmV0dXJuOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShhLCBhY3Rpb25zLCBsaXN0KQorCQlhLT50Y2ZhX3JlZmNudC0tOworfQorCitpbnQgdGNmX2FjdGlvbl9pbml0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IG5sYXR0ciAqbmxhLCBzdHJ1Y3QgbmxhdHRyICplc3QsCisJCSAgICBjaGFyICpuYW1lLCBpbnQgb3ZyLCBpbnQgYmluZCwgc3RydWN0IGxpc3RfaGVhZCAqYWN0aW9ucykKIHsKIAlzdHJ1Y3QgbmxhdHRyICp0YltUQ0FfQUNUX01BWF9QUklPICsgMV07CiAJc3RydWN0IHRjX2FjdGlvbiAqYWN0OwpAQCAtNjEyLDggKzYyMiwxNSBAQAogCQkJZ290byBlcnI7CiAJCX0KIAkJYWN0LT5vcmRlciA9IGk7CisJCWlmIChvdnIpCisJCQlhY3QtPnRjZmFfcmVmY250Kys7CiAJCWxpc3RfYWRkX3RhaWwoJmFjdC0+bGlzdCwgYWN0aW9ucyk7CiAJfQorCisJLyogUmVtb3ZlIHRoZSB0ZW1wIHJlZmNudCB3aGljaCB3YXMgbmVjZXNzYXJ5IHRvIHByb3RlY3QgYWdhaW5zdAorCSAqIGRlc3Ryb3lpbmcgYW4gZXhpc3RpbmcgYWN0aW9uIHdoaWNoIHdhcyBiZWluZyByZXBsYWNlZAorCSAqLworCWNsZWFudXBfYShhY3Rpb25zLCBvdnIpOwogCXJldHVybiAwOwogCiBlcnI6CkBAIC03NTQsMTYgKzc3MSw2IEBACiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KIAotc3RhdGljIHZvaWQgY2xlYW51cF9hKHN0cnVjdCBsaXN0X2hlYWQgKmFjdGlvbnMpCi17Ci0Jc3RydWN0IHRjX2FjdGlvbiAqYSwgKnRtcDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhLCB0bXAsIGFjdGlvbnMsIGxpc3QpIHsKLQkJbGlzdF9kZWwoJmEtPmxpc3QpOwotCQlrZnJlZShhKTsKLQl9Ci19Ci0KIHN0YXRpYyBpbnQgdGNhX2FjdGlvbl9mbHVzaChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBubGF0dHIgKm5sYSwKIAkJCSAgICBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHUzMiBwb3J0aWQpCiB7CkBAIC04OTMsNiArOTAwLDggQEAKIAkJCWdvdG8gZXJyOwogCQl9CiAJCWFjdC0+b3JkZXIgPSBpOworCQlpZiAoZXZlbnQgPT0gUlRNX0dFVEFDVElPTikKKwkJCWFjdC0+dGNmYV9yZWZjbnQrKzsKIAkJbGlzdF9hZGRfdGFpbCgmYWN0LT5saXN0LCAmYWN0aW9ucyk7CiAJfQogCkBAIC05MDUsNyArOTE0LDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiBlcnI6Ci0JY2xlYW51cF9hKCZhY3Rpb25zKTsKKwl0Y2ZfYWN0aW9uX2Rlc3Ryb3koJmFjdGlvbnMsIDApOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTkzMywyNCArOTQyLDE3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludAotdGNmX2FjdGlvbl9hZGQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgbmxhdHRyICpubGEsIHN0cnVjdCBubG1zZ2hkciAqbiwKLQkgICAgICAgdTMyIHBvcnRpZCwgaW50IG92cikKK3N0YXRpYyBpbnQgdGNmX2FjdGlvbl9hZGQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgbmxhdHRyICpubGEsCisJCQkgIHN0cnVjdCBubG1zZ2hkciAqbiwgdTMyIHBvcnRpZCwgaW50IG92cikKIHsKIAlpbnQgcmV0ID0gMDsKIAlMSVNUX0hFQUQoYWN0aW9ucyk7CiAKIAlyZXQgPSB0Y2ZfYWN0aW9uX2luaXQobmV0LCBubGEsIE5VTEwsIE5VTEwsIG92ciwgMCwgJmFjdGlvbnMpOwogCWlmIChyZXQpCi0JCWdvdG8gZG9uZTsKKwkJcmV0dXJuIHJldDsKIAotCS8qIGR1bXAgdGhlbiBmcmVlIGFsbCB0aGUgYWN0aW9ucyBhZnRlciB1cGRhdGU7IGluc2VydGVkIHBvbGljeQotCSAqIHN0YXlzIGludGFjdAotCSAqLwotCXJldCA9IHRjZl9hZGRfbm90aWZ5KG5ldCwgbiwgJmFjdGlvbnMsIHBvcnRpZCk7Ci0JY2xlYW51cF9hKCZhY3Rpb25zKTsKLWRvbmU6Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gdGNmX2FkZF9ub3RpZnkobmV0LCBuLCAmYWN0aW9ucywgcG9ydGlkKTsKIH0KIAogc3RhdGljIGludCB0Y19jdGxfYWN0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbikKQEAgLTEwMDQsOCArMTAwNiw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBubGF0dHIgKgotZmluZF9kdW1wX2tpbmQoY29uc3Qgc3RydWN0IG5sbXNnaGRyICpuKQorc3RhdGljIHN0cnVjdCBubGF0dHIgKmZpbmRfZHVtcF9raW5kKGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbikKIHsKIAlzdHJ1Y3QgbmxhdHRyICp0YjEsICp0YjJbVENBX0FDVF9NQVggKyAxXTsKIAlzdHJ1Y3QgbmxhdHRyICp0YltUQ0FfQUNUX01BWF9QUklPICsgMV07CkBAIC0xMDMyLDggKzEwMzMsNyBAQAogCXJldHVybiBraW5kOwogfQogCi1zdGF0aWMgaW50Ci10Y19kdW1wX2FjdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCitzdGF0aWMgaW50IHRjX2R1bXBfYWN0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChza2ItPnNrKTsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfYnBmLmMgYi9uZXQvc2NoZWQvYWN0X2JwZi5jCmluZGV4IGJmYTg3MDcuLjFkMzk2MDAgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfYnBmLmMKKysrIGIvbmV0L3NjaGVkL2FjdF9icGYuYwpAQCAtMzksMTMgKzM5LDEwIEBACiBzdGF0aWMgaW50IHRjZl9icGYoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHRjX2FjdGlvbiAqYWN0LAogCQkgICBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQogeworCWJvb2wgYXRfaW5ncmVzcyA9IHNrYl9hdF90Y19pbmdyZXNzKHNrYik7CiAJc3RydWN0IHRjZl9icGYgKnByb2cgPSB0b19icGYoYWN0KTsKIAlzdHJ1Y3QgYnBmX3Byb2cgKmZpbHRlcjsKIAlpbnQgYWN0aW9uLCBmaWx0ZXJfcmVzOwotCWJvb2wgYXRfaW5ncmVzcyA9IEdfVENfQVQoc2tiLT50Y192ZXJkKSAmIEFUX0lOR1JFU1M7Ci0KLQlpZiAodW5saWtlbHkoIXNrYl9tYWNfaGVhZGVyX3dhc19zZXQoc2tiKSkpCi0JCXJldHVybiBUQ19BQ1RfVU5TUEVDOwogCiAJdGNmX2xhc3R1c2VfdXBkYXRlKCZwcm9nLT50Y2ZfdG0pOwogCWJzdGF0c19jcHVfdXBkYXRlKHRoaXNfY3B1X3B0cihwcm9nLT5jb21tb24uY3B1X2JzdGF0cyksIHNrYik7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X2NzdW0uYyBiL25ldC9zY2hlZC9hY3RfY3N1bS5jCmluZGV4IGI1ZGJmNjMuLmUwZGVmY2UgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfY3N1bS5jCisrKyBiL25ldC9zY2hlZC9hY3RfY3N1bS5jCkBAIC0xMTYsOCArMTE2LDggQEAKIAkJcmV0dXJuICh2b2lkICopKHNrYl9uZXR3b3JrX2hlYWRlcihza2IpICsgaWhsKTsKIH0KIAotc3RhdGljIGludCB0Y2ZfY3N1bV9pcHY0X2ljbXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgIHVuc2lnbmVkIGludCBpaGwsIHVuc2lnbmVkIGludCBpcGwpCitzdGF0aWMgaW50IHRjZl9jc3VtX2lwdjRfaWNtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgaWhsLAorCQkJICAgICAgdW5zaWduZWQgaW50IGlwbCkKIHsKIAlzdHJ1Y3QgaWNtcGhkciAqaWNtcGg7CiAKQEAgLTE1Miw4ICsxNTIsOCBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IHRjZl9jc3VtX2lwdjZfaWNtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICAgdW5zaWduZWQgaW50IGlobCwgdW5zaWduZWQgaW50IGlwbCkKK3N0YXRpYyBpbnQgdGNmX2NzdW1faXB2Nl9pY21wKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBpaGwsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgaXBsKQogewogCXN0cnVjdCBpY21wNmhkciAqaWNtcDZoOwogCWNvbnN0IHN0cnVjdCBpcHY2aGRyICppcDZoOwpAQCAtMTc0LDggKzE3NCw4IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgdGNmX2NzdW1faXB2NF90Y3Aoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgdW5zaWduZWQgaW50IGlobCwgdW5zaWduZWQgaW50IGlwbCkKK3N0YXRpYyBpbnQgdGNmX2NzdW1faXB2NF90Y3Aoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGlobCwKKwkJCSAgICAgdW5zaWduZWQgaW50IGlwbCkKIHsKIAlzdHJ1Y3QgdGNwaGRyICp0Y3BoOwogCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoOwpAQCAtMTk1LDggKzE5NSw4IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgdGNmX2NzdW1faXB2Nl90Y3Aoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgdW5zaWduZWQgaW50IGlobCwgdW5zaWduZWQgaW50IGlwbCkKK3N0YXRpYyBpbnQgdGNmX2NzdW1faXB2Nl90Y3Aoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGlobCwKKwkJCSAgICAgdW5zaWduZWQgaW50IGlwbCkKIHsKIAlzdHJ1Y3QgdGNwaGRyICp0Y3BoOwogCWNvbnN0IHN0cnVjdCBpcHY2aGRyICppcDZoOwpAQCAtMjE3LDggKzIxNyw4IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgdGNmX2NzdW1faXB2NF91ZHAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgdW5zaWduZWQgaW50IGlobCwgdW5zaWduZWQgaW50IGlwbCwgaW50IHVkcGxpdGUpCitzdGF0aWMgaW50IHRjZl9jc3VtX2lwdjRfdWRwKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBpaGwsCisJCQkgICAgIHVuc2lnbmVkIGludCBpcGwsIGludCB1ZHBsaXRlKQogewogCXN0cnVjdCB1ZHBoZHIgKnVkcGg7CiAJY29uc3Qgc3RydWN0IGlwaGRyICppcGg7CkBAIC0yNzAsOCArMjcwLDggQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCB0Y2ZfY3N1bV9pcHY2X3VkcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICB1bnNpZ25lZCBpbnQgaWhsLCB1bnNpZ25lZCBpbnQgaXBsLCBpbnQgdWRwbGl0ZSkKK3N0YXRpYyBpbnQgdGNmX2NzdW1faXB2Nl91ZHAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGlobCwKKwkJCSAgICAgdW5zaWduZWQgaW50IGlwbCwgaW50IHVkcGxpdGUpCiB7CiAJc3RydWN0IHVkcGhkciAqdWRwaDsKIAljb25zdCBzdHJ1Y3QgaXB2NmhkciAqaXA2aDsKQEAgLTM4MCw4ICszODAsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHRjZl9jc3VtX2lwdjZfaG9wb3B0cyhzdHJ1Y3QgaXB2Nl9vcHRfaGRyICppcDZ4aCwKLQkJCQkgdW5zaWduZWQgaW50IGl4aGwsIHVuc2lnbmVkIGludCAqcGwpCitzdGF0aWMgaW50IHRjZl9jc3VtX2lwdjZfaG9wb3B0cyhzdHJ1Y3QgaXB2Nl9vcHRfaGRyICppcDZ4aCwgdW5zaWduZWQgaW50IGl4aGwsCisJCQkJIHVuc2lnbmVkIGludCAqcGwpCiB7CiAJaW50IG9mZiwgbGVuLCBvcHRsZW47CiAJdW5zaWduZWQgY2hhciAqeGggPSAodm9pZCAqKWlwNnhoOwpAQCAtNDk0LDggKzQ5NCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdGNmX2NzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgIGNvbnN0IHN0cnVjdCB0Y19hY3Rpb24gKmEsIHN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpCitzdGF0aWMgaW50IHRjZl9jc3VtKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB0Y19hY3Rpb24gKmEsCisJCSAgICBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQogewogCXN0cnVjdCB0Y2ZfY3N1bSAqcCA9IHRvX3RjZl9jc3VtKGEpOwogCWludCBhY3Rpb247CkBAIC01MzEsOCArNTMxLDggQEAKIAlyZXR1cm4gVENfQUNUX1NIT1Q7CiB9CiAKLXN0YXRpYyBpbnQgdGNmX2NzdW1fZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJIHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kLCBpbnQgcmVmKQorc3RhdGljIGludCB0Y2ZfY3N1bV9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kLAorCQkJIGludCByZWYpCiB7CiAJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgdGNmX2NzdW0gKnAgPSB0b190Y2ZfY3N1bShhKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfZ2FjdC5jIGIvbmV0L3NjaGVkL2FjdF9nYWN0LmMKaW5kZXggZTI0YTQwOS4uZTBhYTMwZiAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2FjdF9nYWN0LmMKKysrIGIvbmV0L3NjaGVkL2FjdF9nYWN0LmMKQEAgLTE1Niw3ICsxNTYsOCBAQAogCWludCBhY3Rpb24gPSBSRUFEX09OQ0UoZ2FjdC0+dGNmX2FjdGlvbik7CiAJc3RydWN0IHRjZl90ICp0bSA9ICZnYWN0LT50Y2ZfdG07CiAKLQlfYnN0YXRzX2NwdV91cGRhdGUodGhpc19jcHVfcHRyKGdhY3QtPmNvbW1vbi5jcHVfYnN0YXRzKSwgYnl0ZXMsIHBhY2tldHMpOworCV9ic3RhdHNfY3B1X3VwZGF0ZSh0aGlzX2NwdV9wdHIoZ2FjdC0+Y29tbW9uLmNwdV9ic3RhdHMpLCBieXRlcywKKwkJCSAgIHBhY2tldHMpOwogCWlmIChhY3Rpb24gPT0gVENfQUNUX1NIT1QpCiAJCXRoaXNfY3B1X3B0cihnYWN0LT5jb21tb24uY3B1X3FzdGF0cyktPmRyb3BzICs9IHBhY2tldHM7CiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfaWZlLmMgYi9uZXQvc2NoZWQvYWN0X2lmZS5jCmluZGV4IDE0MWEwNmUuLjk1YzQ2M2MgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfaWZlLmMKKysrIGIvbmV0L3NjaGVkL2FjdF9pZmUuYwpAQCAtNTMsNyArNTMsNyBAQAogCXUzMiAqdGx2ID0gKHUzMiAqKShza2JkYXRhKTsKIAl1MTYgdG90bGVuID0gbmxhX3RvdGFsX3NpemUoZGxlbik7CS8qYWxpZ25tZW50ICsgaGRyICovCiAJY2hhciAqZHB0ciA9IChjaGFyICopdGx2ICsgTkxBX0hEUkxFTjsKLQl1MzIgaHRsdiA9IGF0dHJ0eXBlIDw8IDE2IHwgdG90bGVuOworCXUzMiBodGx2ID0gYXR0cnR5cGUgPDwgMTYgfCAoZGxlbiArIE5MQV9IRFJMRU4pOwogCiAJKnRsdiA9IGh0b25sKGh0bHYpOwogCW1lbXNldChkcHRyLCAwLCB0b3RsZW4gLSBOTEFfSERSTEVOKTsKQEAgLTYzLDYgKzYzLDIzIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpZmVfdGx2X21ldGFfZW5jb2RlKTsKIAoraW50IGlmZV9lbmNvZGVfbWV0YV91MTYodTE2IG1ldGF2YWwsIHZvaWQgKnNrYmRhdGEsIHN0cnVjdCB0Y2ZfbWV0YV9pbmZvICptaSkKK3sKKwl1MTYgZWRhdGEgPSAwOworCisJaWYgKG1pLT5tZXRhdmFsKQorCQllZGF0YSA9ICoodTE2ICopbWktPm1ldGF2YWw7CisJZWxzZSBpZiAobWV0YXZhbCkKKwkJZWRhdGEgPSBtZXRhdmFsOworCisJaWYgKCFlZGF0YSkgLyogd2lsbCBub3QgZW5jb2RlICovCisJCXJldHVybiAwOworCisJZWRhdGEgPSBodG9ucyhlZGF0YSk7CisJcmV0dXJuIGlmZV90bHZfbWV0YV9lbmNvZGUoc2tiZGF0YSwgbWktPm1ldGFpZCwgMiwgJmVkYXRhKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlmZV9lbmNvZGVfbWV0YV91MTYpOworCiBpbnQgaWZlX2dldF9tZXRhX3UzMihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNmX21ldGFfaW5mbyAqbWkpCiB7CiAJaWYgKG1pLT5tZXRhdmFsKQpAQCAtODEsNiArOTgsMTUgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlmZV9jaGVja19tZXRhX3UzMik7CiAKK2ludCBpZmVfY2hlY2tfbWV0YV91MTYodTE2IG1ldGF2YWwsIHN0cnVjdCB0Y2ZfbWV0YV9pbmZvICptaSkKK3sKKwlpZiAobWV0YXZhbCB8fCBtaS0+bWV0YXZhbCkKKwkJcmV0dXJuIDg7IC8qIFQrTCsoVikgPT0gMisyKygyKzJieXRlcGFkKSAqLworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpZmVfY2hlY2tfbWV0YV91MTYpOworCiBpbnQgaWZlX2VuY29kZV9tZXRhX3UzMih1MzIgbWV0YXZhbCwgdm9pZCAqc2tiZGF0YSwgc3RydWN0IHRjZl9tZXRhX2luZm8gKm1pKQogewogCXUzMiBlZGF0YSA9IG1ldGF2YWw7CkBAIC0xMzUsNyArMTYxLDcgQEAKIAogaW50IGlmZV92YWxpZGF0ZV9tZXRhX3UzMih2b2lkICp2YWwsIGludCBsZW4pCiB7Ci0JaWYgKGxlbiA9PSA0KQorCWlmIChsZW4gPT0gc2l6ZW9mKHUzMikpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNDQsOCArMTcwLDggQEAKIAogaW50IGlmZV92YWxpZGF0ZV9tZXRhX3UxNih2b2lkICp2YWwsIGludCBsZW4pCiB7Ci0JLyogbGVuZ3RoIHdpbGwgaW5jbHVkZSBwYWRkaW5nICovCi0JaWYgKGxlbiA9PSBOTEFfQUxJR04oMikpCisJLyogbGVuZ3RoIHdpbGwgbm90IGluY2x1ZGUgcGFkZGluZyAqLworCWlmIChsZW4gPT0gc2l6ZW9mKHUxNikpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIC1FSU5WQUw7CkBAIC02MjcsNyArNjUzLDcgQEAKIAlzdHJ1Y3QgdGNmX2lmZV9pbmZvICppZmUgPSB0b19pZmUoYSk7CiAJaW50IGFjdGlvbiA9IGlmZS0+dGNmX2FjdGlvbjsKIAlzdHJ1Y3QgaWZlaGVhZHIgKmlmZWhkciA9IChzdHJ1Y3QgaWZlaGVhZHIgKilza2ItPmRhdGE7Ci0JdTE2IGlmZWhkcmxuID0gaWZlaGRyLT5tZXRhbGVuOworCWludCBpZmVoZHJsbiA9IChpbnQpaWZlaGRyLT5tZXRhbGVuOwogCXN0cnVjdCBtZXRhX3RsdmhkciAqdGx2ID0gKHN0cnVjdCBtZXRhX3RsdmhkciAqKShpZmVoZHItPnRsdl9kYXRhKTsKIAogCXNwaW5fbG9jaygmaWZlLT50Y2ZfbG9jayk7CkBAIC02NTIsMTIgKzY3OCwxNCBAQAogCQl1OCAqdGx2ZGF0YSA9ICh1OCAqKXRsdjsKIAkJdTE2IG10eXBlID0gdGx2LT50eXBlOwogCQl1MTYgbWxlbiA9IHRsdi0+bGVuOworCQl1MTYgYWxlbjsKIAogCQltdHlwZSA9IG50b2hzKG10eXBlKTsKIAkJbWxlbiA9IG50b2hzKG1sZW4pOworCQlhbGVuID0gTkxBX0FMSUdOKG1sZW4pOwogCi0JCWlmIChmaW5kX2RlY29kZV9tZXRhaWQoc2tiLCBpZmUsIG10eXBlLCAobWxlbiAtIDQpLAotCQkJCSAgICAgICAodm9pZCAqKSh0bHZkYXRhICsgNCkpKSB7CisJCWlmIChmaW5kX2RlY29kZV9tZXRhaWQoc2tiLCBpZmUsIG10eXBlLCAobWxlbiAtIE5MQV9IRFJMRU4pLAorCQkJCSAgICAgICAodm9pZCAqKSh0bHZkYXRhICsgTkxBX0hEUkxFTikpKSB7CiAJCQkvKiBhYnVzZSBvdmVybGltaXRzIHRvIGNvdW50IHdoZW4gd2UgcmVjZWl2ZSBtZXRhZGF0YQogCQkJICogYnV0IGRvbnQgaGF2ZSBhbiBvcHMgZm9yIGl0CiAJCQkgKi8KQEAgLTY2Niw4ICs2OTQsOCBAQAogCQkJaWZlLT50Y2ZfcXN0YXRzLm92ZXJsaW1pdHMrKzsKIAkJfQogCi0JCXRsdmRhdGEgKz0gbWxlbjsKLQkJaWZlaGRybG4gLT0gbWxlbjsKKwkJdGx2ZGF0YSArPSBhbGVuOworCQlpZmVoZHJsbiAtPSBhbGVuOwogCQl0bHYgPSAoc3RydWN0IG1ldGFfdGx2aGRyICopdGx2ZGF0YTsKIAl9CiAKQEAgLTczOCw4ICs3NjYsNiBAQAogCQlyZXR1cm4gVENfQUNUX1NIT1Q7CiAJfQogCi0JaWV0aGggPSBldGhfaGRyKHNrYik7Ci0KIAllcnIgPSBza2JfY293X2hlYWQoc2tiLCBoZHJtKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewogCQlpZmUtPnRjZl9xc3RhdHMuZHJvcHMrKzsKQEAgLTc1MCw2ICs3NzYsNyBAQAogCWlmICghKGF0ICYgQVRfRUdSRVNTKSkKIAkJc2tiX3B1c2goc2tiLCBza2ItPmRldi0+aGFyZF9oZWFkZXJfbGVuKTsKIAorCWlldGhoID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7CiAJX19za2JfcHVzaChza2IsIGhkcm0pOwogCW1lbWNweShza2ItPmRhdGEsIGlldGhoLCBza2ItPm1hY19sZW4pOwogCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X21ldGFfc2tidGNpbmRleC5jIGIvbmV0L3NjaGVkL2FjdF9tZXRhX3NrYnRjaW5kZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjM1Nzc0Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjaGVkL2FjdF9tZXRhX3NrYnRjaW5kZXguYwpAQCAtMCwwICsxLDc5IEBACisvKgorICogbmV0L3NjaGVkL2FjdF9tZXRhX3RjX2luZGV4LmMgSUZFIHNrYi0+dGNfaW5kZXggbWV0YWRhdGEgbW9kdWxlCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogY29weXJpZ2h0IEphbWFsIEhhZGkgU2FsaW0gKDIwMTYpCisgKgorKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC90Y19hY3QvdGNfaWZlLmg+CisjaW5jbHVkZSA8bmV0L3RjX2FjdC90Y19pZmUuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKworc3RhdGljIGludCBza2J0Y2luZGV4X2VuY29kZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB2b2lkICpza2JkYXRhLAorCQkJICAgICBzdHJ1Y3QgdGNmX21ldGFfaW5mbyAqZSkKK3sKKwl1MzIgaWZldGNfaW5kZXggPSBza2ItPnRjX2luZGV4OworCisJcmV0dXJuIGlmZV9lbmNvZGVfbWV0YV91MTYoaWZldGNfaW5kZXgsIHNrYmRhdGEsIGUpOworfQorCitzdGF0aWMgaW50IHNrYnRjaW5kZXhfZGVjb2RlKHN0cnVjdCBza19idWZmICpza2IsIHZvaWQgKmRhdGEsIHUxNiBsZW4pCit7CisJdTE2IGlmZXRjX2luZGV4ID0gKih1MTYgKilkYXRhOworCisJc2tiLT50Y19pbmRleCA9IG50b2hzKGlmZXRjX2luZGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBza2J0Y2luZGV4X2NoZWNrKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y2ZfbWV0YV9pbmZvICplKQoreworCXJldHVybiBpZmVfY2hlY2tfbWV0YV91MTYoc2tiLT50Y19pbmRleCwgZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGNmX21ldGFfb3BzIGlmZV9za2J0Y2luZGV4X29wcyA9IHsKKwkubWV0YWlkID0gSUZFX01FVEFfVENJTkRFWCwKKwkubWV0YXR5cGUgPSBOTEFfVTE2LAorCS5uYW1lID0gInRjX2luZGV4IiwKKwkuc3lub3BzaXMgPSAic2tiIHRjX2luZGV4IDE2IGJpdCBtZXRhZGF0YSIsCisJLmNoZWNrX3ByZXNlbmNlID0gc2tidGNpbmRleF9jaGVjaywKKwkuZW5jb2RlID0gc2tidGNpbmRleF9lbmNvZGUsCisJLmRlY29kZSA9IHNrYnRjaW5kZXhfZGVjb2RlLAorCS5nZXQgPSBpZmVfZ2V0X21ldGFfdTE2LAorCS5hbGxvYyA9IGlmZV9hbGxvY19tZXRhX3UxNiwKKwkucmVsZWFzZSA9IGlmZV9yZWxlYXNlX21ldGFfZ2VuLAorCS52YWxpZGF0ZSA9IGlmZV92YWxpZGF0ZV9tZXRhX3UxNiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlmZXRjX2luZGV4X2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX2lmZV9vcCgmaWZlX3NrYnRjaW5kZXhfb3BzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGlmZXRjX2luZGV4X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9pZmVfb3AoJmlmZV9za2J0Y2luZGV4X29wcyk7Cit9CisKK21vZHVsZV9pbml0KGlmZXRjX2luZGV4X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGlmZXRjX2luZGV4X2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0FVVEhPUigiSmFtYWwgSGFkaSBTYWxpbSgyMDE2KSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlci1GRSBza2IgdGNfaW5kZXggbWV0YWRhdGEgbW9kdWxlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfSUZFX01FVEEoSUZFX01FVEFfU0tCVENJTkRFWCk7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X21pcnJlZC5jIGIvbmV0L3NjaGVkL2FjdF9taXJyZWQuYwppbmRleCA2MDM4Yzg1Li42NjdkYzM4IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvYWN0X21pcnJlZC5jCisrKyBiL25ldC9zY2hlZC9hY3RfbWlycmVkLmMKQEAgLTIwNCw3ICsyMDQsMTUgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgaW50IHRjZl9taXJyZWRfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphLCBpbnQgYmluZCwgaW50IHJlZikKK3N0YXRpYyB2b2lkIHRjZl9zdGF0c191cGRhdGUoc3RydWN0IHRjX2FjdGlvbiAqYSwgdTY0IGJ5dGVzLCB1MzIgcGFja2V0cywKKwkJCSAgICAgdTY0IGxhc3R1c2UpCit7CisJdGNmX2xhc3R1c2VfdXBkYXRlKCZhLT50Y2ZhX3RtKTsKKwlfYnN0YXRzX2NwdV91cGRhdGUodGhpc19jcHVfcHRyKGEtPmNwdV9ic3RhdHMpLCBieXRlcywgcGFja2V0cyk7Cit9CisKK3N0YXRpYyBpbnQgdGNmX21pcnJlZF9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kLAorCQkJICAgaW50IHJlZikKIHsKIAl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCXN0cnVjdCB0Y2ZfbWlycmVkICptID0gdG9fbWlycmVkKGEpOwpAQCAtMjgwLDYgKzI4OCw3IEBACiAJLnR5cGUJCT0JVENBX0FDVF9NSVJSRUQsCiAJLm93bmVyCQk9CVRISVNfTU9EVUxFLAogCS5hY3QJCT0JdGNmX21pcnJlZCwKKwkuc3RhdHNfdXBkYXRlCT0JdGNmX3N0YXRzX3VwZGF0ZSwKIAkuZHVtcAkJPQl0Y2ZfbWlycmVkX2R1bXAsCiAJLmNsZWFudXAJPQl0Y2ZfbWlycmVkX3JlbGVhc2UsCiAJLmluaXQJCT0JdGNmX21pcnJlZF9pbml0LApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2FjdF9wb2xpY2UuYyBiL25ldC9zY2hlZC9hY3RfcG9saWNlLmMKaW5kZXggYjNjN2U5Ny4uZDFiZDI0OCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2FjdF9wb2xpY2UuYworKysgYi9uZXQvc2NoZWQvYWN0X3BvbGljZS5jCkBAIC02Myw0OSArNjMsOCBAQAogCQkJCSBjb25zdCBzdHJ1Y3QgdGNfYWN0aW9uX29wcyAqb3BzKQogewogCXN0cnVjdCB0Y19hY3Rpb25fbmV0ICp0biA9IG5ldF9nZW5lcmljKG5ldCwgcG9saWNlX25ldF9pZCk7Ci0Jc3RydWN0IHRjZl9oYXNoaW5mbyAqaGluZm8gPSB0bi0+aGluZm87Ci0JaW50IGVyciA9IDAsIGluZGV4ID0gLTEsIGkgPSAwLCBzX2kgPSAwLCBuX2kgPSAwOwotCXN0cnVjdCBubGF0dHIgKm5lc3Q7CiAKLQlzcGluX2xvY2tfYmgoJmhpbmZvLT5sb2NrKTsKLQotCXNfaSA9IGNiLT5hcmdzWzBdOwotCi0JZm9yIChpID0gMDsgaSA8IChQT0xfVEFCX01BU0sgKyAxKTsgaSsrKSB7Ci0JCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwotCQlzdHJ1Y3QgdGNfYWN0aW9uICpwOwotCi0JCWhlYWQgPSAmaGluZm8tPmh0YWJbdGNmX2hhc2goaSwgUE9MX1RBQl9NQVNLKV07Ci0KLQkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHAsIGhlYWQsIHRjZmFfaGVhZCkgewotCQkJaW5kZXgrKzsKLQkJCWlmIChpbmRleCA8IHNfaSkKLQkJCQljb250aW51ZTsKLQkJCW5lc3QgPSBubGFfbmVzdF9zdGFydChza2IsIGluZGV4KTsKLQkJCWlmIChuZXN0ID09IE5VTEwpCi0JCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7Ci0JCQlpZiAodHlwZSA9PSBSVE1fREVMQUNUSU9OKQotCQkJCWVyciA9IHRjZl9hY3Rpb25fZHVtcF8xKHNrYiwgcCwgMCwgMSk7Ci0JCQllbHNlCi0JCQkJZXJyID0gdGNmX2FjdGlvbl9kdW1wXzEoc2tiLCBwLCAwLCAwKTsKLQkJCWlmIChlcnIgPCAwKSB7Ci0JCQkJaW5kZXgtLTsKLQkJCQlubGFfbmVzdF9jYW5jZWwoc2tiLCBuZXN0KTsKLQkJCQlnb3RvIGRvbmU7Ci0JCQl9Ci0JCQlubGFfbmVzdF9lbmQoc2tiLCBuZXN0KTsKLQkJCW5faSsrOwotCQl9Ci0JfQotZG9uZToKLQlzcGluX3VubG9ja19iaCgmaGluZm8tPmxvY2spOwotCWlmIChuX2kpCi0JCWNiLT5hcmdzWzBdICs9IG5faTsKLQlyZXR1cm4gbl9pOwotCi1ubGFfcHV0X2ZhaWx1cmU6Ci0JbmxhX25lc3RfY2FuY2VsKHNrYiwgbmVzdCk7Ci0JZ290byBkb25lOworCXJldHVybiB0Y2ZfZ2VuZXJpY193YWxrZXIodG4sIHNrYiwgY2IsIHR5cGUsIG9wcyk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBwb2xpY2VfcG9saWN5W1RDQV9QT0xJQ0VfTUFYICsgMV0gPSB7CkBAIC0xMjUsNiArODQsNyBAQAogCXN0cnVjdCB0Y2ZfcG9saWNlICpwb2xpY2U7CiAJc3RydWN0IHFkaXNjX3JhdGVfdGFibGUgKlJfdGFiID0gTlVMTCwgKlBfdGFiID0gTlVMTDsKIAlzdHJ1Y3QgdGNfYWN0aW9uX25ldCAqdG4gPSBuZXRfZ2VuZXJpYyhuZXQsIHBvbGljZV9uZXRfaWQpOworCWJvb2wgZXhpc3RzID0gZmFsc2U7CiAJaW50IHNpemU7CiAKIAlpZiAobmxhID09IE5VTEwpCkBAIC0xMzksMjQgKzk5LDI0IEBACiAJc2l6ZSA9IG5sYV9sZW4odGJbVENBX1BPTElDRV9UQkZdKTsKIAlpZiAoc2l6ZSAhPSBzaXplb2YoKnBhcm0pICYmIHNpemUgIT0gc2l6ZW9mKHN0cnVjdCB0Y19wb2xpY2VfY29tcGF0KSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JcGFybSA9IG5sYV9kYXRhKHRiW1RDQV9QT0xJQ0VfVEJGXSk7CiAKLQlpZiAocGFybS0+aW5kZXgpIHsKLQkJaWYgKHRjZl9oYXNoX2NoZWNrKHRuLCBwYXJtLT5pbmRleCwgYSwgYmluZCkpIHsKLQkJCWlmIChvdnIpCi0JCQkJZ290byBvdmVycmlkZTsKLQkJCS8qIG5vdCByZXBsYWNpbmcgKi8KLQkJCXJldHVybiAtRUVYSVNUOwotCQl9Ci0JfSBlbHNlIHsKKwlwYXJtID0gbmxhX2RhdGEodGJbVENBX1BPTElDRV9UQkZdKTsKKwlleGlzdHMgPSB0Y2ZfaGFzaF9jaGVjayh0biwgcGFybS0+aW5kZXgsIGEsIGJpbmQpOworCWlmIChleGlzdHMgJiYgYmluZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWV4aXN0cykgewogCQlyZXQgPSB0Y2ZfaGFzaF9jcmVhdGUodG4sIHBhcm0tPmluZGV4LCBOVUxMLCBhLAogCQkJCSAgICAgICZhY3RfcG9saWNlX29wcywgYmluZCwgZmFsc2UpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAkJcmV0ID0gQUNUX1BfQ1JFQVRFRDsKKwl9IGVsc2UgeworCQl0Y2ZfaGFzaF9yZWxlYXNlKCphLCBiaW5kKTsKKwkJaWYgKCFvdnIpCisJCQlyZXR1cm4gLUVFWElTVDsKIAl9CiAKLW92ZXJyaWRlOgogCXBvbGljZSA9IHRvX3BvbGljZSgqYSk7CiAJaWYgKHBhcm0tPnJhdGUucmF0ZSkgewogCQllcnIgPSAtRU5PTUVNOwpAQCAtMjg5LDYgKzI0OSw4IEBACiAJCQlwb2xpY2UtPnRjZnBfdF9jID0gbm93OwogCQkJcG9saWNlLT50Y2ZwX3Rva3MgPSB0b2tzOwogCQkJcG9saWNlLT50Y2ZwX3B0b2tzID0gcHRva3M7CisJCQlpZiAocG9saWNlLT50Y2ZwX3Jlc3VsdCA9PSBUQ19BQ1RfU0hPVCkKKwkJCQlwb2xpY2UtPnRjZl9xc3RhdHMuZHJvcHMrKzsKIAkJCXNwaW5fdW5sb2NrKCZwb2xpY2UtPnRjZl9sb2NrKTsKIAkJCXJldHVybiBwb2xpY2UtPnRjZnBfcmVzdWx0OwogCQl9CkBAIC0zMDEsOCArMjYzLDggQEAKIAlyZXR1cm4gcG9saWNlLT50Y2ZfYWN0aW9uOwogfQogCi1zdGF0aWMgaW50Ci10Y2ZfYWN0X3BvbGljZV9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kLCBpbnQgcmVmKQorc3RhdGljIGludCB0Y2ZfYWN0X3BvbGljZV9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsCisJCQkgICAgICAgaW50IGJpbmQsIGludCByZWYpCiB7CiAJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgdGNmX3BvbGljZSAqcG9saWNlID0gdG9fcG9saWNlKGEpOwpAQCAtMzg3LDE0ICszNDksMTIgQEAKIAkuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdGNfYWN0aW9uX25ldCksCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdAotcG9saWNlX2luaXRfbW9kdWxlKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBwb2xpY2VfaW5pdF9tb2R1bGUodm9pZCkKIHsKIAlyZXR1cm4gdGNmX3JlZ2lzdGVyX2FjdGlvbigmYWN0X3BvbGljZV9vcHMsICZwb2xpY2VfbmV0X29wcyk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdAotcG9saWNlX2NsZWFudXBfbW9kdWxlKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgcG9saWNlX2NsZWFudXBfbW9kdWxlKHZvaWQpCiB7CiAJdGNmX3VucmVnaXN0ZXJfYWN0aW9uKCZhY3RfcG9saWNlX29wcywgJnBvbGljZV9uZXRfb3BzKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3Rfc2tibW9kLmMgYi9uZXQvc2NoZWQvYWN0X3NrYm1vZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZDk2MzgKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2NoZWQvYWN0X3NrYm1vZC5jCkBAIC0wLDAgKzEsMzAxIEBACisvKgorICogbmV0L3NjaGVkL2FjdF9za2Jtb2QuYyAgc2tiIGRhdGEgbW9kaWZpZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgSmFtYWwgSGFkaSBTYWxpbSA8amhzQG1vamF0YXR1LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KKworI2luY2x1ZGUgPGxpbnV4L3RjX2FjdC90Y19za2Jtb2QuaD4KKyNpbmNsdWRlIDxuZXQvdGNfYWN0L3RjX3NrYm1vZC5oPgorCisjZGVmaW5lIFNLQk1PRF9UQUJfTUFTSyAgICAgMTUKKworc3RhdGljIGludCBza2Jtb2RfbmV0X2lkOworc3RhdGljIHN0cnVjdCB0Y19hY3Rpb25fb3BzIGFjdF9za2Jtb2Rfb3BzOworCisjZGVmaW5lIE1BWF9FRElUX0xFTiBFVEhfSExFTgorc3RhdGljIGludCB0Y2Zfc2tibW9kX3J1bihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgdGNfYWN0aW9uICphLAorCQkJICBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQoreworCXN0cnVjdCB0Y2Zfc2tibW9kICpkID0gdG9fc2tibW9kKGEpOworCWludCBhY3Rpb247CisJc3RydWN0IHRjZl9za2Jtb2RfcGFyYW1zICpwOworCXU2NCBmbGFnczsKKwlpbnQgZXJyOworCisJdGNmX2xhc3R1c2VfdXBkYXRlKCZkLT50Y2ZfdG0pOworCWJzdGF0c19jcHVfdXBkYXRlKHRoaXNfY3B1X3B0cihkLT5jb21tb24uY3B1X2JzdGF0cyksIHNrYik7CisKKwkvKiBYWFg6IGlmIHlvdSBhcmUgZ29pbmcgdG8gZWRpdCBtb3JlIGZpZWxkcyBiZXlvbmQgZXRoZXJuZXQgaGVhZGVyCisJICogKGV4YW1wbGUgd2hlbiB5b3UgYWRkIElQIGhlYWRlciByZXBsYWNlbWVudCBvciB2bGFuIHN3YXApCisJICogdGhlbiBNQVhfRURJVF9MRU4gbmVlZHMgdG8gY2hhbmdlIGFwcHJvcHJpYXRlbHkKKwkqLworCWVyciA9IHNrYl9lbnN1cmVfd3JpdGFibGUoc2tiLCBNQVhfRURJVF9MRU4pOworCWlmICh1bmxpa2VseShlcnIpKSB7IC8qIGJlc3QgcG9saWN5IGlzIHRvIGRyb3Agb24gdGhlIGZsb29yICovCisJCXFzdGF0c19vdmVybGltaXRfaW5jKHRoaXNfY3B1X3B0cihkLT5jb21tb24uY3B1X3FzdGF0cykpOworCQlyZXR1cm4gVENfQUNUX1NIT1Q7CisJfQorCisJcmN1X3JlYWRfbG9jaygpOworCWFjdGlvbiA9IFJFQURfT05DRShkLT50Y2ZfYWN0aW9uKTsKKwlpZiAodW5saWtlbHkoYWN0aW9uID09IFRDX0FDVF9TSE9UKSkgeworCQlxc3RhdHNfb3ZlcmxpbWl0X2luYyh0aGlzX2NwdV9wdHIoZC0+Y29tbW9uLmNwdV9xc3RhdHMpKTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybiBhY3Rpb247CisJfQorCisJcCA9IHJjdV9kZXJlZmVyZW5jZShkLT5za2Jtb2RfcCk7CisJZmxhZ3MgPSBwLT5mbGFnczsKKwlpZiAoZmxhZ3MgJiBTS0JNT0RfRl9ETUFDKQorCQlldGhlcl9hZGRyX2NvcHkoZXRoX2hkcihza2IpLT5oX2Rlc3QsIHAtPmV0aF9kc3QpOworCWlmIChmbGFncyAmIFNLQk1PRF9GX1NNQUMpCisJCWV0aGVyX2FkZHJfY29weShldGhfaGRyKHNrYiktPmhfc291cmNlLCBwLT5ldGhfc3JjKTsKKwlpZiAoZmxhZ3MgJiBTS0JNT0RfRl9FVFlQRSkKKwkJZXRoX2hkcihza2IpLT5oX3Byb3RvID0gcC0+ZXRoX3R5cGU7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlpZiAoZmxhZ3MgJiBTS0JNT0RfRl9TV0FQTUFDKSB7CisJCXUxNiB0bXBhZGRyW0VUSF9BTEVOIC8gMl07IC8qIGV0aGVyX2FkZHJfY29weSgpIHJlcXVpcmVtZW50ICovCisJCS8qWFhYOiBJIGFtIHN1cmUgd2UgY2FuIGNvbWUgdXAgd2l0aCBtb3JlIGVmZmljaWVudCBzd2FwcGluZyovCisJCWV0aGVyX2FkZHJfY29weSgodTggKil0bXBhZGRyLCBldGhfaGRyKHNrYiktPmhfZGVzdCk7CisJCWV0aGVyX2FkZHJfY29weShldGhfaGRyKHNrYiktPmhfZGVzdCwgZXRoX2hkcihza2IpLT5oX3NvdXJjZSk7CisJCWV0aGVyX2FkZHJfY29weShldGhfaGRyKHNrYiktPmhfc291cmNlLCAodTggKil0bXBhZGRyKTsKKwl9CisKKwlyZXR1cm4gYWN0aW9uOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgc2tibW9kX3BvbGljeVtUQ0FfU0tCTU9EX01BWCArIDFdID0geworCVtUQ0FfU0tCTU9EX1BBUk1TXQkJPSB7IC5sZW4gPSBzaXplb2Yoc3RydWN0IHRjX3NrYm1vZCkgfSwKKwlbVENBX1NLQk1PRF9ETUFDXQkJPSB7IC5sZW4gPSBFVEhfQUxFTiB9LAorCVtUQ0FfU0tCTU9EX1NNQUNdCQk9IHsgLmxlbiA9IEVUSF9BTEVOIH0sCisJW1RDQV9TS0JNT0RfRVRZUEVdCQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCit9OworCitzdGF0aWMgaW50IHRjZl9za2Jtb2RfaW5pdChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBubGF0dHIgKm5sYSwKKwkJCSAgIHN0cnVjdCBubGF0dHIgKmVzdCwgc3RydWN0IHRjX2FjdGlvbiAqKmEsCisJCQkgICBpbnQgb3ZyLCBpbnQgYmluZCkKK3sKKwlzdHJ1Y3QgdGNfYWN0aW9uX25ldCAqdG4gPSBuZXRfZ2VuZXJpYyhuZXQsIHNrYm1vZF9uZXRfaWQpOworCXN0cnVjdCBubGF0dHIgKnRiW1RDQV9TS0JNT0RfTUFYICsgMV07CisJc3RydWN0IHRjZl9za2Jtb2RfcGFyYW1zICpwLCAqcF9vbGQ7CisJc3RydWN0IHRjX3NrYm1vZCAqcGFybTsKKwlzdHJ1Y3QgdGNmX3NrYm1vZCAqZDsKKwlib29sIGV4aXN0cyA9IGZhbHNlOworCXU4ICpkYWRkciA9IE5VTEw7CisJdTggKnNhZGRyID0gTlVMTDsKKwl1MTYgZXRoX3R5cGUgPSAwOworCXUzMiBsZmxhZ3MgPSAwOworCWludCByZXQgPSAwLCBlcnI7CisKKwlpZiAoIW5sYSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSBubGFfcGFyc2VfbmVzdGVkKHRiLCBUQ0FfU0tCTU9EX01BWCwgbmxhLCBza2Jtb2RfcG9saWN5KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmICghdGJbVENBX1NLQk1PRF9QQVJNU10pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRiW1RDQV9TS0JNT0RfRE1BQ10pIHsKKwkJZGFkZHIgPSBubGFfZGF0YSh0YltUQ0FfU0tCTU9EX0RNQUNdKTsKKwkJbGZsYWdzIHw9IFNLQk1PRF9GX0RNQUM7CisJfQorCisJaWYgKHRiW1RDQV9TS0JNT0RfU01BQ10pIHsKKwkJc2FkZHIgPSBubGFfZGF0YSh0YltUQ0FfU0tCTU9EX1NNQUNdKTsKKwkJbGZsYWdzIHw9IFNLQk1PRF9GX1NNQUM7CisJfQorCisJaWYgKHRiW1RDQV9TS0JNT0RfRVRZUEVdKSB7CisJCWV0aF90eXBlID0gbmxhX2dldF91MTYodGJbVENBX1NLQk1PRF9FVFlQRV0pOworCQlsZmxhZ3MgfD0gU0tCTU9EX0ZfRVRZUEU7CisJfQorCisJcGFybSA9IG5sYV9kYXRhKHRiW1RDQV9TS0JNT0RfUEFSTVNdKTsKKwlpZiAocGFybS0+ZmxhZ3MgJiBTS0JNT0RfRl9TV0FQTUFDKQorCQlsZmxhZ3MgPSBTS0JNT0RfRl9TV0FQTUFDOworCisJZXhpc3RzID0gdGNmX2hhc2hfY2hlY2sodG4sIHBhcm0tPmluZGV4LCBhLCBiaW5kKTsKKwlpZiAoZXhpc3RzICYmIGJpbmQpCisJCXJldHVybiAwOworCisJaWYgKCFsZmxhZ3MpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFleGlzdHMpIHsKKwkJcmV0ID0gdGNmX2hhc2hfY3JlYXRlKHRuLCBwYXJtLT5pbmRleCwgZXN0LCBhLAorCQkJCSAgICAgICZhY3Rfc2tibW9kX29wcywgYmluZCwgdHJ1ZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IEFDVF9QX0NSRUFURUQ7CisJfSBlbHNlIHsKKwkJdGNmX2hhc2hfcmVsZWFzZSgqYSwgYmluZCk7CisJCWlmICghb3ZyKQorCQkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCisJZCA9IHRvX3NrYm1vZCgqYSk7CisKKwlBU1NFUlRfUlROTCgpOworCXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGNmX3NrYm1vZF9wYXJhbXMpLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIXApKSB7CisJCWlmIChvdnIpCisJCQl0Y2ZfaGFzaF9yZWxlYXNlKCphLCBiaW5kKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcC0+ZmxhZ3MgPSBsZmxhZ3M7CisJZC0+dGNmX2FjdGlvbiA9IHBhcm0tPmFjdGlvbjsKKworCXBfb2xkID0gcnRubF9kZXJlZmVyZW5jZShkLT5za2Jtb2RfcCk7CisKKwlpZiAob3ZyKQorCQlzcGluX2xvY2tfYmgoJmQtPnRjZl9sb2NrKTsKKworCWlmIChsZmxhZ3MgJiBTS0JNT0RfRl9ETUFDKQorCQlldGhlcl9hZGRyX2NvcHkocC0+ZXRoX2RzdCwgZGFkZHIpOworCWlmIChsZmxhZ3MgJiBTS0JNT0RfRl9TTUFDKQorCQlldGhlcl9hZGRyX2NvcHkocC0+ZXRoX3NyYywgc2FkZHIpOworCWlmIChsZmxhZ3MgJiBTS0JNT0RfRl9FVFlQRSkKKwkJcC0+ZXRoX3R5cGUgPSBodG9ucyhldGhfdHlwZSk7CisKKwlyY3VfYXNzaWduX3BvaW50ZXIoZC0+c2tibW9kX3AsIHApOworCWlmIChvdnIpCisJCXNwaW5fdW5sb2NrX2JoKCZkLT50Y2ZfbG9jayk7CisKKwlpZiAocF9vbGQpCisJCWtmcmVlX3JjdShwX29sZCwgcmN1KTsKKworCWlmIChyZXQgPT0gQUNUX1BfQ1JFQVRFRCkKKwkJdGNmX2hhc2hfaW5zZXJ0KHRuLCAqYSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdGNmX3NrYm1vZF9jbGVhbnVwKHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kKQoreworCXN0cnVjdCB0Y2Zfc2tibW9kICpkID0gdG9fc2tibW9kKGEpOworCXN0cnVjdCB0Y2Zfc2tibW9kX3BhcmFtcyAgKnA7CisKKwlwID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChkLT5za2Jtb2RfcCwgMSk7CisJa2ZyZWVfcmN1KHAsIHJjdSk7Cit9CisKK3N0YXRpYyBpbnQgdGNmX3NrYm1vZF9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsCisJCQkgICBpbnQgYmluZCwgaW50IHJlZikKK3sKKwlzdHJ1Y3QgdGNmX3NrYm1vZCAqZCA9IHRvX3NrYm1vZChhKTsKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOworCXN0cnVjdCB0Y2Zfc2tibW9kX3BhcmFtcyAgKnAgPSBydG5sX2RlcmVmZXJlbmNlKGQtPnNrYm1vZF9wKTsKKwlzdHJ1Y3QgdGNfc2tibW9kIG9wdCA9IHsKKwkJLmluZGV4ICAgPSBkLT50Y2ZfaW5kZXgsCisJCS5yZWZjbnQgID0gZC0+dGNmX3JlZmNudCAtIHJlZiwKKwkJLmJpbmRjbnQgPSBkLT50Y2ZfYmluZGNudCAtIGJpbmQsCisJCS5hY3Rpb24gID0gZC0+dGNmX2FjdGlvbiwKKwl9OworCXN0cnVjdCB0Y2ZfdCB0OworCisJb3B0LmZsYWdzICA9IHAtPmZsYWdzOworCWlmIChubGFfcHV0KHNrYiwgVENBX1NLQk1PRF9QQVJNUywgc2l6ZW9mKG9wdCksICZvcHQpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlpZiAoKHAtPmZsYWdzICYgU0tCTU9EX0ZfRE1BQykgJiYKKwkgICAgbmxhX3B1dChza2IsIFRDQV9TS0JNT0RfRE1BQywgRVRIX0FMRU4sIHAtPmV0aF9kc3QpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlpZiAoKHAtPmZsYWdzICYgU0tCTU9EX0ZfU01BQykgJiYKKwkgICAgbmxhX3B1dChza2IsIFRDQV9TS0JNT0RfU01BQywgRVRIX0FMRU4sIHAtPmV0aF9zcmMpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlpZiAoKHAtPmZsYWdzICYgU0tCTU9EX0ZfRVRZUEUpICYmCisJICAgIG5sYV9wdXRfdTE2KHNrYiwgVENBX1NLQk1PRF9FVFlQRSwgbnRvaHMocC0+ZXRoX3R5cGUpKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwl0Y2ZfdG1fZHVtcCgmdCwgJmQtPnRjZl90bSk7CisJaWYgKG5sYV9wdXRfNjRiaXQoc2tiLCBUQ0FfU0tCTU9EX1RNLCBzaXplb2YodCksICZ0LCBUQ0FfU0tCTU9EX1BBRCkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJcmV0dXJuIHNrYi0+bGVuOworbmxhX3B1dF9mYWlsdXJlOgorCXJjdV9yZWFkX3VubG9jaygpOworCW5sbXNnX3RyaW0oc2tiLCBiKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgdGNmX3NrYm1vZF93YWxrZXIoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsIGludCB0eXBlLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgdGNfYWN0aW9uX29wcyAqb3BzKQoreworCXN0cnVjdCB0Y19hY3Rpb25fbmV0ICp0biA9IG5ldF9nZW5lcmljKG5ldCwgc2tibW9kX25ldF9pZCk7CisKKwlyZXR1cm4gdGNmX2dlbmVyaWNfd2Fsa2VyKHRuLCBza2IsIGNiLCB0eXBlLCBvcHMpOworfQorCitzdGF0aWMgaW50IHRjZl9za2Jtb2Rfc2VhcmNoKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHRjX2FjdGlvbiAqKmEsIHUzMiBpbmRleCkKK3sKKwlzdHJ1Y3QgdGNfYWN0aW9uX25ldCAqdG4gPSBuZXRfZ2VuZXJpYyhuZXQsIHNrYm1vZF9uZXRfaWQpOworCisJcmV0dXJuIHRjZl9oYXNoX3NlYXJjaCh0biwgYSwgaW5kZXgpOworfQorCitzdGF0aWMgc3RydWN0IHRjX2FjdGlvbl9vcHMgYWN0X3NrYm1vZF9vcHMgPSB7CisJLmtpbmQJCT0JInNrYm1vZCIsCisJLnR5cGUJCT0JVENBX0FDVF9TS0JNT0QsCisJLm93bmVyCQk9CVRISVNfTU9EVUxFLAorCS5hY3QJCT0JdGNmX3NrYm1vZF9ydW4sCisJLmR1bXAJCT0JdGNmX3NrYm1vZF9kdW1wLAorCS5pbml0CQk9CXRjZl9za2Jtb2RfaW5pdCwKKwkuY2xlYW51cAk9CXRjZl9za2Jtb2RfY2xlYW51cCwKKwkud2FsawkJPQl0Y2Zfc2tibW9kX3dhbGtlciwKKwkubG9va3VwCQk9CXRjZl9za2Jtb2Rfc2VhcmNoLAorCS5zaXplCQk9CXNpemVvZihzdHJ1Y3QgdGNmX3NrYm1vZCksCit9OworCitzdGF0aWMgX19uZXRfaW5pdCBpbnQgc2tibW9kX2luaXRfbmV0KHN0cnVjdCBuZXQgKm5ldCkKK3sKKwlzdHJ1Y3QgdGNfYWN0aW9uX25ldCAqdG4gPSBuZXRfZ2VuZXJpYyhuZXQsIHNrYm1vZF9uZXRfaWQpOworCisJcmV0dXJuIHRjX2FjdGlvbl9uZXRfaW5pdCh0biwgJmFjdF9za2Jtb2Rfb3BzLCBTS0JNT0RfVEFCX01BU0spOworfQorCitzdGF0aWMgdm9pZCBfX25ldF9leGl0IHNrYm1vZF9leGl0X25ldChzdHJ1Y3QgbmV0ICpuZXQpCit7CisJc3RydWN0IHRjX2FjdGlvbl9uZXQgKnRuID0gbmV0X2dlbmVyaWMobmV0LCBza2Jtb2RfbmV0X2lkKTsKKworCXRjX2FjdGlvbl9uZXRfZXhpdCh0bik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGVybmV0X29wZXJhdGlvbnMgc2tibW9kX25ldF9vcHMgPSB7CisJLmluaXQgPSBza2Jtb2RfaW5pdF9uZXQsCisJLmV4aXQgPSBza2Jtb2RfZXhpdF9uZXQsCisJLmlkICAgPSAmc2tibW9kX25ldF9pZCwKKwkuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdGNfYWN0aW9uX25ldCksCit9OworCitNT0RVTEVfQVVUSE9SKCJKYW1hbCBIYWRpIFNhbGltLCA8amhzQG1vamF0YXR1LmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0tCIGRhdGEgbW9kLWluZyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IF9faW5pdCBza2Jtb2RfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gdGNmX3JlZ2lzdGVyX2FjdGlvbigmYWN0X3NrYm1vZF9vcHMsICZza2Jtb2RfbmV0X29wcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBza2Jtb2RfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl0Y2ZfdW5yZWdpc3Rlcl9hY3Rpb24oJmFjdF9za2Jtb2Rfb3BzLCAmc2tibW9kX25ldF9vcHMpOworfQorCittb2R1bGVfaW5pdChza2Jtb2RfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoc2tibW9kX2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfdHVubmVsX2tleS5jIGIvbmV0L3NjaGVkL2FjdF90dW5uZWxfa2V5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY0N2JkZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY2hlZC9hY3RfdHVubmVsX2tleS5jCkBAIC0wLDAgKzEsMzQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2LCBBbWlyIFZhZGFpIDxhbWlyQHZhZGFpLm1lPgorICogQ29weXJpZ2h0IChjKSAyMDE2LCBNZWxsYW5veCBUZWNobm9sb2dpZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgorI2luY2x1ZGUgPG5ldC9kc3QuaD4KKyNpbmNsdWRlIDxuZXQvZHN0X21ldGFkYXRhLmg+CisKKyNpbmNsdWRlIDxsaW51eC90Y19hY3QvdGNfdHVubmVsX2tleS5oPgorI2luY2x1ZGUgPG5ldC90Y19hY3QvdGNfdHVubmVsX2tleS5oPgorCisjZGVmaW5lIFRVTk5FTF9LRVlfVEFCX01BU0sgICAgIDE1CisKK3N0YXRpYyBpbnQgdHVubmVsX2tleV9uZXRfaWQ7CitzdGF0aWMgc3RydWN0IHRjX2FjdGlvbl9vcHMgYWN0X3R1bm5lbF9rZXlfb3BzOworCitzdGF0aWMgaW50IHR1bm5lbF9rZXlfYWN0KHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB0Y19hY3Rpb24gKmEsCisJCQkgIHN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpCit7CisJc3RydWN0IHRjZl90dW5uZWxfa2V5ICp0ID0gdG9fdHVubmVsX2tleShhKTsKKwlzdHJ1Y3QgdGNmX3R1bm5lbF9rZXlfcGFyYW1zICpwYXJhbXM7CisJaW50IGFjdGlvbjsKKworCXJjdV9yZWFkX2xvY2soKTsKKworCXBhcmFtcyA9IHJjdV9kZXJlZmVyZW5jZSh0LT5wYXJhbXMpOworCisJdGNmX2xhc3R1c2VfdXBkYXRlKCZ0LT50Y2ZfdG0pOworCWJzdGF0c19jcHVfdXBkYXRlKHRoaXNfY3B1X3B0cih0LT5jb21tb24uY3B1X2JzdGF0cyksIHNrYik7CisJYWN0aW9uID0gcGFyYW1zLT5hY3Rpb247CisKKwlzd2l0Y2ggKHBhcmFtcy0+dGNmdF9hY3Rpb24pIHsKKwljYXNlIFRDQV9UVU5ORUxfS0VZX0FDVF9SRUxFQVNFOgorCQlza2JfZHN0X2Ryb3Aoc2tiKTsKKwkJYnJlYWs7CisJY2FzZSBUQ0FfVFVOTkVMX0tFWV9BQ1RfU0VUOgorCQlza2JfZHN0X2Ryb3Aoc2tiKTsKKwkJc2tiX2RzdF9zZXQoc2tiLCBkc3RfY2xvbmUoJnBhcmFtcy0+dGNmdF9lbmNfbWV0YWRhdGEtPmRzdCkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlXQVJOX09OQ0UoMSwgIkJhZCB0dW5uZWxfa2V5IGFjdGlvbiAlZC5cbiIsCisJCQkgIHBhcmFtcy0+dGNmdF9hY3Rpb24pOworCQlicmVhazsKKwl9CisKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiBhY3Rpb247Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSB0dW5uZWxfa2V5X3BvbGljeVtUQ0FfVFVOTkVMX0tFWV9NQVggKyAxXSA9IHsKKwlbVENBX1RVTk5FTF9LRVlfUEFSTVNdCSAgICA9IHsgLmxlbiA9IHNpemVvZihzdHJ1Y3QgdGNfdHVubmVsX2tleSkgfSwKKwlbVENBX1RVTk5FTF9LRVlfRU5DX0lQVjRfU1JDXSA9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW1RDQV9UVU5ORUxfS0VZX0VOQ19JUFY0X0RTVF0gPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtUQ0FfVFVOTkVMX0tFWV9FTkNfSVBWNl9TUkNdID0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikgfSwKKwlbVENBX1RVTk5FTF9LRVlfRU5DX0lQVjZfRFNUXSA9IHsgLmxlbiA9IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpIH0sCisJW1RDQV9UVU5ORUxfS0VZX0VOQ19LRVlfSURdICAgPSB7IC50eXBlID0gTkxBX1UzMiB9LAorfTsKKworc3RhdGljIGludCB0dW5uZWxfa2V5X2luaXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgbmxhdHRyICpubGEsCisJCQkgICBzdHJ1Y3QgbmxhdHRyICplc3QsIHN0cnVjdCB0Y19hY3Rpb24gKiphLAorCQkJICAgaW50IG92ciwgaW50IGJpbmQpCit7CisJc3RydWN0IHRjX2FjdGlvbl9uZXQgKnRuID0gbmV0X2dlbmVyaWMobmV0LCB0dW5uZWxfa2V5X25ldF9pZCk7CisJc3RydWN0IG5sYXR0ciAqdGJbVENBX1RVTk5FTF9LRVlfTUFYICsgMV07CisJc3RydWN0IHRjZl90dW5uZWxfa2V5X3BhcmFtcyAqcGFyYW1zX29sZDsKKwlzdHJ1Y3QgdGNmX3R1bm5lbF9rZXlfcGFyYW1zICpwYXJhbXNfbmV3OworCXN0cnVjdCBtZXRhZGF0YV9kc3QgKm1ldGFkYXRhID0gTlVMTDsKKwlzdHJ1Y3QgdGNfdHVubmVsX2tleSAqcGFybTsKKwlzdHJ1Y3QgdGNmX3R1bm5lbF9rZXkgKnQ7CisJYm9vbCBleGlzdHMgPSBmYWxzZTsKKwlfX2JlNjQga2V5X2lkOworCWludCByZXQgPSAwOworCWludCBlcnI7CisKKwlpZiAoIW5sYSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSBubGFfcGFyc2VfbmVzdGVkKHRiLCBUQ0FfVFVOTkVMX0tFWV9NQVgsIG5sYSwgdHVubmVsX2tleV9wb2xpY3kpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKCF0YltUQ0FfVFVOTkVMX0tFWV9QQVJNU10pCisJCXJldHVybiAtRUlOVkFMOworCisJcGFybSA9IG5sYV9kYXRhKHRiW1RDQV9UVU5ORUxfS0VZX1BBUk1TXSk7CisJZXhpc3RzID0gdGNmX2hhc2hfY2hlY2sodG4sIHBhcm0tPmluZGV4LCBhLCBiaW5kKTsKKwlpZiAoZXhpc3RzICYmIGJpbmQpCisJCXJldHVybiAwOworCisJc3dpdGNoIChwYXJtLT50X2FjdGlvbikgeworCWNhc2UgVENBX1RVTk5FTF9LRVlfQUNUX1JFTEVBU0U6CisJCWJyZWFrOworCWNhc2UgVENBX1RVTk5FTF9LRVlfQUNUX1NFVDoKKwkJaWYgKCF0YltUQ0FfVFVOTkVMX0tFWV9FTkNfS0VZX0lEXSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCisJCWtleV9pZCA9IGtleTMyX3RvX3R1bm5lbF9pZChubGFfZ2V0X2JlMzIodGJbVENBX1RVTk5FTF9LRVlfRU5DX0tFWV9JRF0pKTsKKworCQlpZiAodGJbVENBX1RVTk5FTF9LRVlfRU5DX0lQVjRfU1JDXSAmJgorCQkgICAgdGJbVENBX1RVTk5FTF9LRVlfRU5DX0lQVjRfRFNUXSkgeworCQkJX19iZTMyIHNhZGRyOworCQkJX19iZTMyIGRhZGRyOworCisJCQlzYWRkciA9IG5sYV9nZXRfaW5fYWRkcih0YltUQ0FfVFVOTkVMX0tFWV9FTkNfSVBWNF9TUkNdKTsKKwkJCWRhZGRyID0gbmxhX2dldF9pbl9hZGRyKHRiW1RDQV9UVU5ORUxfS0VZX0VOQ19JUFY0X0RTVF0pOworCisJCQltZXRhZGF0YSA9IF9faXBfdHVuX3NldF9kc3Qoc2FkZHIsIGRhZGRyLCAwLCAwLAorCQkJCQkJICAgIFRVTk5FTF9LRVksIGtleV9pZCwgMCk7CisJCX0gZWxzZSBpZiAodGJbVENBX1RVTk5FTF9LRVlfRU5DX0lQVjZfU1JDXSAmJgorCQkJICAgdGJbVENBX1RVTk5FTF9LRVlfRU5DX0lQVjZfRFNUXSkgeworCQkJc3RydWN0IGluNl9hZGRyIHNhZGRyOworCQkJc3RydWN0IGluNl9hZGRyIGRhZGRyOworCisJCQlzYWRkciA9IG5sYV9nZXRfaW42X2FkZHIodGJbVENBX1RVTk5FTF9LRVlfRU5DX0lQVjZfU1JDXSk7CisJCQlkYWRkciA9IG5sYV9nZXRfaW42X2FkZHIodGJbVENBX1RVTk5FTF9LRVlfRU5DX0lQVjZfRFNUXSk7CisKKwkJCW1ldGFkYXRhID0gX19pcHY2X3R1bl9zZXRfZHN0KCZzYWRkciwgJmRhZGRyLCAwLCAwLCAwLAorCQkJCQkJICAgICAgVFVOTkVMX0tFWSwga2V5X2lkLCAwKTsKKwkJfQorCisJCWlmICghbWV0YWRhdGEpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKworCQltZXRhZGF0YS0+dS50dW5faW5mby5tb2RlIHw9IElQX1RVTk5FTF9JTkZPX1RYOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIGVycl9vdXQ7CisJfQorCisJaWYgKCFleGlzdHMpIHsKKwkJcmV0ID0gdGNmX2hhc2hfY3JlYXRlKHRuLCBwYXJtLT5pbmRleCwgZXN0LCBhLAorCQkJCSAgICAgICZhY3RfdHVubmVsX2tleV9vcHMsIGJpbmQsIHRydWUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBBQ1RfUF9DUkVBVEVEOworCX0gZWxzZSB7CisJCXRjZl9oYXNoX3JlbGVhc2UoKmEsIGJpbmQpOworCQlpZiAoIW92cikKKwkJCXJldHVybiAtRUVYSVNUOworCX0KKworCXQgPSB0b190dW5uZWxfa2V5KCphKTsKKworCUFTU0VSVF9SVE5MKCk7CisJcGFyYW1zX25ldyA9IGt6YWxsb2Moc2l6ZW9mKCpwYXJhbXNfbmV3KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFwYXJhbXNfbmV3KSkgeworCQlpZiAocmV0ID09IEFDVF9QX0NSRUFURUQpCisJCQl0Y2ZfaGFzaF9yZWxlYXNlKCphLCBiaW5kKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcGFyYW1zX29sZCA9IHJ0bmxfZGVyZWZlcmVuY2UodC0+cGFyYW1zKTsKKworCXBhcmFtc19uZXctPmFjdGlvbiA9IHBhcm0tPmFjdGlvbjsKKwlwYXJhbXNfbmV3LT50Y2Z0X2FjdGlvbiA9IHBhcm0tPnRfYWN0aW9uOworCXBhcmFtc19uZXctPnRjZnRfZW5jX21ldGFkYXRhID0gbWV0YWRhdGE7CisKKwlyY3VfYXNzaWduX3BvaW50ZXIodC0+cGFyYW1zLCBwYXJhbXNfbmV3KTsKKworCWlmIChwYXJhbXNfb2xkKQorCQlrZnJlZV9yY3UocGFyYW1zX29sZCwgcmN1KTsKKworCWlmIChyZXQgPT0gQUNUX1BfQ1JFQVRFRCkKKwkJdGNmX2hhc2hfaW5zZXJ0KHRuLCAqYSk7CisKKwlyZXR1cm4gcmV0OworCitlcnJfb3V0OgorCWlmIChleGlzdHMpCisJCXRjZl9oYXNoX3JlbGVhc2UoKmEsIGJpbmQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHR1bm5lbF9rZXlfcmVsZWFzZShzdHJ1Y3QgdGNfYWN0aW9uICphLCBpbnQgYmluZCkKK3sKKwlzdHJ1Y3QgdGNmX3R1bm5lbF9rZXkgKnQgPSB0b190dW5uZWxfa2V5KGEpOworCXN0cnVjdCB0Y2ZfdHVubmVsX2tleV9wYXJhbXMgKnBhcmFtczsKKworCXBhcmFtcyA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQodC0+cGFyYW1zLCAxKTsKKworCWlmIChwYXJhbXMtPnRjZnRfYWN0aW9uID09IFRDQV9UVU5ORUxfS0VZX0FDVF9TRVQpCisJCWRzdF9yZWxlYXNlKCZwYXJhbXMtPnRjZnRfZW5jX21ldGFkYXRhLT5kc3QpOworCisJa2ZyZWVfcmN1KHBhcmFtcywgcmN1KTsKK30KKworc3RhdGljIGludCB0dW5uZWxfa2V5X2R1bXBfYWRkcmVzc2VzKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgaXBfdHVubmVsX2luZm8gKmluZm8pCit7CisJdW5zaWduZWQgc2hvcnQgZmFtaWx5ID0gaXBfdHVubmVsX2luZm9fYWYoaW5mbyk7CisKKwlpZiAoZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJX19iZTMyIHNhZGRyID0gaW5mby0+a2V5LnUuaXB2NC5zcmM7CisJCV9fYmUzMiBkYWRkciA9IGluZm8tPmtleS51LmlwdjQuZHN0OworCisJCWlmICghbmxhX3B1dF9pbl9hZGRyKHNrYiwgVENBX1RVTk5FTF9LRVlfRU5DX0lQVjRfU1JDLCBzYWRkcikgJiYKKwkJICAgICFubGFfcHV0X2luX2FkZHIoc2tiLCBUQ0FfVFVOTkVMX0tFWV9FTkNfSVBWNF9EU1QsIGRhZGRyKSkKKwkJCXJldHVybiAwOworCX0KKworCWlmIChmYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkcjYgPSAmaW5mby0+a2V5LnUuaXB2Ni5zcmM7CisJCWNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZGFkZHI2ID0gJmluZm8tPmtleS51LmlwdjYuZHN0OworCisJCWlmICghbmxhX3B1dF9pbjZfYWRkcihza2IsCisJCQkJICAgICAgVENBX1RVTk5FTF9LRVlfRU5DX0lQVjZfU1JDLCBzYWRkcjYpICYmCisJCSAgICAhbmxhX3B1dF9pbjZfYWRkcihza2IsCisJCQkJICAgICAgVENBX1RVTk5FTF9LRVlfRU5DX0lQVjZfRFNULCBkYWRkcjYpKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdHVubmVsX2tleV9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsCisJCQkgICBpbnQgYmluZCwgaW50IHJlZikKK3sKKwl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOworCXN0cnVjdCB0Y2ZfdHVubmVsX2tleSAqdCA9IHRvX3R1bm5lbF9rZXkoYSk7CisJc3RydWN0IHRjZl90dW5uZWxfa2V5X3BhcmFtcyAqcGFyYW1zOworCXN0cnVjdCB0Y190dW5uZWxfa2V5IG9wdCA9IHsKKwkJLmluZGV4ICAgID0gdC0+dGNmX2luZGV4LAorCQkucmVmY250ICAgPSB0LT50Y2ZfcmVmY250IC0gcmVmLAorCQkuYmluZGNudCAgPSB0LT50Y2ZfYmluZGNudCAtIGJpbmQsCisJfTsKKwlzdHJ1Y3QgdGNmX3QgdG07CisKKwlwYXJhbXMgPSBydG5sX2RlcmVmZXJlbmNlKHQtPnBhcmFtcyk7CisKKwlvcHQudF9hY3Rpb24gPSBwYXJhbXMtPnRjZnRfYWN0aW9uOworCW9wdC5hY3Rpb24gPSBwYXJhbXMtPmFjdGlvbjsKKworCWlmIChubGFfcHV0KHNrYiwgVENBX1RVTk5FTF9LRVlfUEFSTVMsIHNpemVvZihvcHQpLCAmb3B0KSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlpZiAocGFyYW1zLT50Y2Z0X2FjdGlvbiA9PSBUQ0FfVFVOTkVMX0tFWV9BQ1RfU0VUKSB7CisJCXN0cnVjdCBpcF90dW5uZWxfa2V5ICprZXkgPQorCQkJJnBhcmFtcy0+dGNmdF9lbmNfbWV0YWRhdGEtPnUudHVuX2luZm8ua2V5OworCQlfX2JlMzIga2V5X2lkID0gdHVubmVsX2lkX3RvX2tleTMyKGtleS0+dHVuX2lkKTsKKworCQlpZiAobmxhX3B1dF9iZTMyKHNrYiwgVENBX1RVTk5FTF9LRVlfRU5DX0tFWV9JRCwga2V5X2lkKSB8fAorCQkgICAgdHVubmVsX2tleV9kdW1wX2FkZHJlc3Nlcyhza2IsCisJCQkJCSAgICAgICZwYXJhbXMtPnRjZnRfZW5jX21ldGFkYXRhLT51LnR1bl9pbmZvKSkKKwkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCX0KKworCXRjZl90bV9kdW1wKCZ0bSwgJnQtPnRjZl90bSk7CisJaWYgKG5sYV9wdXRfNjRiaXQoc2tiLCBUQ0FfVFVOTkVMX0tFWV9UTSwgc2l6ZW9mKHRtKSwKKwkJCSAgJnRtLCBUQ0FfVFVOTkVMX0tFWV9QQUQpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCXJldHVybiBza2ItPmxlbjsKKworbmxhX3B1dF9mYWlsdXJlOgorCW5sbXNnX3RyaW0oc2tiLCBiKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgdHVubmVsX2tleV93YWxrZXIoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsIGludCB0eXBlLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgdGNfYWN0aW9uX29wcyAqb3BzKQoreworCXN0cnVjdCB0Y19hY3Rpb25fbmV0ICp0biA9IG5ldF9nZW5lcmljKG5ldCwgdHVubmVsX2tleV9uZXRfaWQpOworCisJcmV0dXJuIHRjZl9nZW5lcmljX3dhbGtlcih0biwgc2tiLCBjYiwgdHlwZSwgb3BzKTsKK30KKworc3RhdGljIGludCB0dW5uZWxfa2V5X3NlYXJjaChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB0Y19hY3Rpb24gKiphLCB1MzIgaW5kZXgpCit7CisJc3RydWN0IHRjX2FjdGlvbl9uZXQgKnRuID0gbmV0X2dlbmVyaWMobmV0LCB0dW5uZWxfa2V5X25ldF9pZCk7CisKKwlyZXR1cm4gdGNmX2hhc2hfc2VhcmNoKHRuLCBhLCBpbmRleCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGNfYWN0aW9uX29wcyBhY3RfdHVubmVsX2tleV9vcHMgPSB7CisJLmtpbmQJCT0JInR1bm5lbF9rZXkiLAorCS50eXBlCQk9CVRDQV9BQ1RfVFVOTkVMX0tFWSwKKwkub3duZXIJCT0JVEhJU19NT0RVTEUsCisJLmFjdAkJPQl0dW5uZWxfa2V5X2FjdCwKKwkuZHVtcAkJPQl0dW5uZWxfa2V5X2R1bXAsCisJLmluaXQJCT0JdHVubmVsX2tleV9pbml0LAorCS5jbGVhbnVwCT0JdHVubmVsX2tleV9yZWxlYXNlLAorCS53YWxrCQk9CXR1bm5lbF9rZXlfd2Fsa2VyLAorCS5sb29rdXAJCT0JdHVubmVsX2tleV9zZWFyY2gsCisJLnNpemUJCT0Jc2l6ZW9mKHN0cnVjdCB0Y2ZfdHVubmVsX2tleSksCit9OworCitzdGF0aWMgX19uZXRfaW5pdCBpbnQgdHVubmVsX2tleV9pbml0X25ldChzdHJ1Y3QgbmV0ICpuZXQpCit7CisJc3RydWN0IHRjX2FjdGlvbl9uZXQgKnRuID0gbmV0X2dlbmVyaWMobmV0LCB0dW5uZWxfa2V5X25ldF9pZCk7CisKKwlyZXR1cm4gdGNfYWN0aW9uX25ldF9pbml0KHRuLCAmYWN0X3R1bm5lbF9rZXlfb3BzLCBUVU5ORUxfS0VZX1RBQl9NQVNLKTsKK30KKworc3RhdGljIHZvaWQgX19uZXRfZXhpdCB0dW5uZWxfa2V5X2V4aXRfbmV0KHN0cnVjdCBuZXQgKm5ldCkKK3sKKwlzdHJ1Y3QgdGNfYWN0aW9uX25ldCAqdG4gPSBuZXRfZ2VuZXJpYyhuZXQsIHR1bm5lbF9rZXlfbmV0X2lkKTsKKworCXRjX2FjdGlvbl9uZXRfZXhpdCh0bik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGVybmV0X29wZXJhdGlvbnMgdHVubmVsX2tleV9uZXRfb3BzID0geworCS5pbml0ID0gdHVubmVsX2tleV9pbml0X25ldCwKKwkuZXhpdCA9IHR1bm5lbF9rZXlfZXhpdF9uZXQsCisJLmlkICAgPSAmdHVubmVsX2tleV9uZXRfaWQsCisJLnNpemUgPSBzaXplb2Yoc3RydWN0IHRjX2FjdGlvbl9uZXQpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdHVubmVsX2tleV9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiB0Y2ZfcmVnaXN0ZXJfYWN0aW9uKCZhY3RfdHVubmVsX2tleV9vcHMsICZ0dW5uZWxfa2V5X25ldF9vcHMpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdHVubmVsX2tleV9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXRjZl91bnJlZ2lzdGVyX2FjdGlvbigmYWN0X3R1bm5lbF9rZXlfb3BzLCAmdHVubmVsX2tleV9uZXRfb3BzKTsKK30KKworbW9kdWxlX2luaXQodHVubmVsX2tleV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdCh0dW5uZWxfa2V5X2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0FVVEhPUigiQW1pciBWYWRhaSA8YW1pckB2YWRhaS5tZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXAgdHVubmVsIG1hbmlwdWxhdGlvbiBhY3Rpb25zIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X3ZsYW4uYyBiL25ldC9zY2hlZC9hY3Rfdmxhbi5jCmluZGV4IDY5MTQwOWQuLmI1N2ZjYmMgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3Rfdmxhbi5jCisrKyBiL25ldC9zY2hlZC9hY3Rfdmxhbi5jCkBAIC0zMCwxMiArMzAsMTkgQEAKIAlzdHJ1Y3QgdGNmX3ZsYW4gKnYgPSB0b192bGFuKGEpOwogCWludCBhY3Rpb247CiAJaW50IGVycjsKKwl1MTYgdGNpOwogCiAJc3Bpbl9sb2NrKCZ2LT50Y2ZfbG9jayk7CiAJdGNmX2xhc3R1c2VfdXBkYXRlKCZ2LT50Y2ZfdG0pOwogCWJzdGF0c191cGRhdGUoJnYtPnRjZl9ic3RhdHMsIHNrYik7CiAJYWN0aW9uID0gdi0+dGNmX2FjdGlvbjsKIAorCS8qIEVuc3VyZSAnZGF0YScgcG9pbnRzIGF0IG1hY19oZWFkZXIgcHJpb3IgY2FsbGluZyB2bGFuIG1hbmlwdWxhdGluZworCSAqIGZ1bmN0aW9ucy4KKwkgKi8KKwlpZiAoc2tiX2F0X3RjX2luZ3Jlc3Moc2tiKSkKKwkJc2tiX3B1c2hfcmNzdW0oc2tiLCBza2ItPm1hY19sZW4pOworCiAJc3dpdGNoICh2LT50Y2Z2X2FjdGlvbikgewogCWNhc2UgVENBX1ZMQU5fQUNUX1BPUDoKIAkJZXJyID0gc2tiX3ZsYW5fcG9wKHNrYik7CkBAIC00MywxMCArNTAsMzUgQEAKIAkJCWdvdG8gZHJvcDsKIAkJYnJlYWs7CiAJY2FzZSBUQ0FfVkxBTl9BQ1RfUFVTSDoKLQkJZXJyID0gc2tiX3ZsYW5fcHVzaChza2IsIHYtPnRjZnZfcHVzaF9wcm90bywgdi0+dGNmdl9wdXNoX3ZpZCk7CisJCWVyciA9IHNrYl92bGFuX3B1c2goc2tiLCB2LT50Y2Z2X3B1c2hfcHJvdG8sIHYtPnRjZnZfcHVzaF92aWQgfAorCQkJCSAgICAodi0+dGNmdl9wdXNoX3ByaW8gPDwgVkxBTl9QUklPX1NISUZUKSk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGRyb3A7CiAJCWJyZWFrOworCWNhc2UgVENBX1ZMQU5fQUNUX01PRElGWToKKwkJLyogTm8tb3AgaWYgbm8gdmxhbiB0YWcgKGVpdGhlciBody1hY2NlbCBvciBpbi1wYXlsb2FkKSAqLworCQlpZiAoIXNrYl92bGFuX3RhZ2dlZChza2IpKQorCQkJZ290byB1bmxvY2s7CisJCS8qIGV4dHJhY3QgZXhpc3RpbmcgdGFnIChhbmQgZ3VhcmFudGVlIG5vIGh3LWFjY2VsIHRhZykgKi8KKwkJaWYgKHNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikpIHsKKwkJCXRjaSA9IHNrYl92bGFuX3RhZ19nZXQoc2tiKTsKKwkJCXNrYi0+dmxhbl90Y2kgPSAwOworCQl9IGVsc2UgeworCQkJLyogaW4tcGF5bG9hZCB2bGFuIHRhZywgcG9wIGl0ICovCisJCQllcnIgPSBfX3NrYl92bGFuX3BvcChza2IsICZ0Y2kpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIGRyb3A7CisJCX0KKwkJLyogcmVwbGFjZSB0aGUgdmlkICovCisJCXRjaSA9ICh0Y2kgJiB+VkxBTl9WSURfTUFTSykgfCB2LT50Y2Z2X3B1c2hfdmlkOworCQkvKiByZXBsYWNlIHByaW8gYml0cywgaWYgdGNmdl9wdXNoX3ByaW8gc3BlY2lmaWVkICovCisJCWlmICh2LT50Y2Z2X3B1c2hfcHJpbykgeworCQkJdGNpICY9IH5WTEFOX1BSSU9fTUFTSzsKKwkJCXRjaSB8PSB2LT50Y2Z2X3B1c2hfcHJpbyA8PCBWTEFOX1BSSU9fU0hJRlQ7CisJCX0KKwkJLyogcHV0IHVwZGF0ZWQgdGNpIGFzIGh3YWNjZWwgdGFnICovCisJCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCB2LT50Y2Z2X3B1c2hfcHJvdG8sIHRjaSk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVRygpOwogCX0KQEAgLTU3LDYgKzg5LDkgQEAKIAlhY3Rpb24gPSBUQ19BQ1RfU0hPVDsKIAl2LT50Y2ZfcXN0YXRzLmRyb3BzKys7CiB1bmxvY2s6CisJaWYgKHNrYl9hdF90Y19pbmdyZXNzKHNrYikpCisJCXNrYl9wdWxsX3Jjc3VtKHNrYiwgc2tiLT5tYWNfbGVuKTsKKwogCXNwaW5fdW5sb2NrKCZ2LT50Y2ZfbG9jayk7CiAJcmV0dXJuIGFjdGlvbjsKIH0KQEAgLTY1LDYgKzEwMCw3IEBACiAJW1RDQV9WTEFOX1BBUk1TXQkJPSB7IC5sZW4gPSBzaXplb2Yoc3RydWN0IHRjX3ZsYW4pIH0sCiAJW1RDQV9WTEFOX1BVU0hfVkxBTl9JRF0JCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKIAlbVENBX1ZMQU5fUFVTSF9WTEFOX1BST1RPQ09MXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCisJW1RDQV9WTEFOX1BVU0hfVkxBTl9QUklPUklUWV0JPSB7IC50eXBlID0gTkxBX1U4IH0sCiB9OwogCiBzdGF0aWMgaW50IHRjZl92bGFuX2luaXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgbmxhdHRyICpubGEsCkBAIC03OCw2ICsxMTQsNyBAQAogCWludCBhY3Rpb247CiAJX19iZTE2IHB1c2hfdmlkID0gMDsKIAlfX2JlMTYgcHVzaF9wcm90byA9IDA7CisJdTggcHVzaF9wcmlvID0gMDsKIAlib29sIGV4aXN0cyA9IGZhbHNlOwogCWludCByZXQgPSAwLCBlcnI7CiAKQEAgLTk5LDYgKzEzNiw3IEBACiAJY2FzZSBUQ0FfVkxBTl9BQ1RfUE9QOgogCQlicmVhazsKIAljYXNlIFRDQV9WTEFOX0FDVF9QVVNIOgorCWNhc2UgVENBX1ZMQU5fQUNUX01PRElGWToKIAkJaWYgKCF0YltUQ0FfVkxBTl9QVVNIX1ZMQU5fSURdKSB7CiAJCQlpZiAoZXhpc3RzKQogCQkJCXRjZl9oYXNoX3JlbGVhc2UoKmEsIGJpbmQpOwpAQCAtMTIzLDYgKzE2MSw5IEBACiAJCX0gZWxzZSB7CiAJCQlwdXNoX3Byb3RvID0gaHRvbnMoRVRIX1BfODAyMVEpOwogCQl9CisKKwkJaWYgKHRiW1RDQV9WTEFOX1BVU0hfVkxBTl9QUklPUklUWV0pCisJCQlwdXNoX3ByaW8gPSBubGFfZ2V0X3U4KHRiW1RDQV9WTEFOX1BVU0hfVkxBTl9QUklPUklUWV0pOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlpZiAoZXhpc3RzKQpAQCAtMTUwLDYgKzE5MSw3IEBACiAKIAl2LT50Y2Z2X2FjdGlvbiA9IGFjdGlvbjsKIAl2LT50Y2Z2X3B1c2hfdmlkID0gcHVzaF92aWQ7CisJdi0+dGNmdl9wdXNoX3ByaW8gPSBwdXNoX3ByaW87CiAJdi0+dGNmdl9wdXNoX3Byb3RvID0gcHVzaF9wcm90bzsKIAogCXYtPnRjZl9hY3Rpb24gPSBwYXJtLT5hY3Rpb247CkBAIC0xNzgsMTAgKzIyMCwxMyBAQAogCWlmIChubGFfcHV0KHNrYiwgVENBX1ZMQU5fUEFSTVMsIHNpemVvZihvcHQpLCAmb3B0KSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKLQlpZiAodi0+dGNmdl9hY3Rpb24gPT0gVENBX1ZMQU5fQUNUX1BVU0ggJiYKKwlpZiAoKHYtPnRjZnZfYWN0aW9uID09IFRDQV9WTEFOX0FDVF9QVVNIIHx8CisJICAgICB2LT50Y2Z2X2FjdGlvbiA9PSBUQ0FfVkxBTl9BQ1RfTU9ESUZZKSAmJgogCSAgICAobmxhX3B1dF91MTYoc2tiLCBUQ0FfVkxBTl9QVVNIX1ZMQU5fSUQsIHYtPnRjZnZfcHVzaF92aWQpIHx8CiAJICAgICBubGFfcHV0X2JlMTYoc2tiLCBUQ0FfVkxBTl9QVVNIX1ZMQU5fUFJPVE9DT0wsCi0JCQkgIHYtPnRjZnZfcHVzaF9wcm90bykpKQorCQkJICB2LT50Y2Z2X3B1c2hfcHJvdG8pIHx8CisJICAgICAobmxhX3B1dF91OChza2IsIFRDQV9WTEFOX1BVU0hfVkxBTl9QUklPUklUWSwKKwkJCQkJICAgICAgdi0+dGNmdl9wdXNoX3ByaW8pKSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCiAJdGNmX3RtX2R1bXAoJnQsICZ2LT50Y2ZfdG0pOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19hcGkuYyBiL25ldC9zY2hlZC9jbHNfYXBpLmMKaW5kZXggODQzYTcxNi4uMTFkYTdkYSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19hcGkuYworKysgYi9uZXQvc2NoZWQvY2xzX2FwaS5jCkBAIC0zNDQsMTMgKzM0NCwxNSBAQAogCQkJaWYgKGVyciA9PSAwKSB7CiAJCQkJc3RydWN0IHRjZl9wcm90byAqbmV4dCA9IHJ0bmxfZGVyZWZlcmVuY2UodHAtPm5leHQpOwogCi0JCQkJdGZpbHRlcl9ub3RpZnkobmV0LCBza2IsIG4sIHRwLCBmaCwgUlRNX0RFTFRGSUxURVIpOworCQkJCXRmaWx0ZXJfbm90aWZ5KG5ldCwgc2tiLCBuLCB0cCwgZmgsCisJCQkJCSAgICAgICBSVE1fREVMVEZJTFRFUik7CiAJCQkJaWYgKHRjZl9kZXN0cm95KHRwLCBmYWxzZSkpCiAJCQkJCVJDVV9JTklUX1BPSU5URVIoKmJhY2ssIG5leHQpOwogCQkJfQogCQkJZ290byBlcnJvdXQ7CiAJCWNhc2UgUlRNX0dFVFRGSUxURVI6Ci0JCQllcnIgPSB0ZmlsdGVyX25vdGlmeShuZXQsIHNrYiwgbiwgdHAsIGZoLCBSVE1fTkVXVEZJTFRFUik7CisJCQllcnIgPSB0ZmlsdGVyX25vdGlmeShuZXQsIHNrYiwgbiwgdHAsIGZoLAorCQkJCQkgICAgIFJUTV9ORVdURklMVEVSKTsKIAkJCWdvdG8gZXJyb3V0OwogCQlkZWZhdWx0OgogCQkJZXJyID0gLUVJTlZBTDsKQEAgLTQ0OCw3ICs0NTAsOCBAQAogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KGEtPnNrYi0+c2spOwogCiAJcmV0dXJuIHRjZl9maWxsX25vZGUobmV0LCBhLT5za2IsIHRwLCBuLCBORVRMSU5LX0NCKGEtPmNiLT5za2IpLnBvcnRpZCwKLQkJCSAgICAgYS0+Y2ItPm5saC0+bmxtc2dfc2VxLCBOTE1fRl9NVUxUSSwgUlRNX05FV1RGSUxURVIpOworCQkJICAgICBhLT5jYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLAorCQkJICAgICBSVE1fTkVXVEZJTFRFUik7CiB9CiAKIC8qIGNhbGxlZCB3aXRoIFJUTkwgKi8KQEAgLTU0MSwzNiArNTQ0LDQ0IEBACiB2b2lkIHRjZl9leHRzX2Rlc3Ryb3koc3RydWN0IHRjZl9leHRzICpleHRzKQogewogI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAotCXRjZl9hY3Rpb25fZGVzdHJveSgmZXh0cy0+YWN0aW9ucywgVENBX0FDVF9VTkJJTkQpOwotCUlOSVRfTElTVF9IRUFEKCZleHRzLT5hY3Rpb25zKTsKKwlMSVNUX0hFQUQoYWN0aW9ucyk7CisKKwl0Y2ZfZXh0c190b19saXN0KGV4dHMsICZhY3Rpb25zKTsKKwl0Y2ZfYWN0aW9uX2Rlc3Ryb3koJmFjdGlvbnMsIFRDQV9BQ1RfVU5CSU5EKTsKKwlrZnJlZShleHRzLT5hY3Rpb25zKTsKKwlleHRzLT5ucl9hY3Rpb25zID0gMDsKICNlbmRpZgogfQogRVhQT1JUX1NZTUJPTCh0Y2ZfZXh0c19kZXN0cm95KTsKIAogaW50IHRjZl9leHRzX3ZhbGlkYXRlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHRjZl9wcm90byAqdHAsIHN0cnVjdCBubGF0dHIgKip0YiwKLQkJICBzdHJ1Y3QgbmxhdHRyICpyYXRlX3Rsdiwgc3RydWN0IHRjZl9leHRzICpleHRzLCBib29sIG92cikKKwkJICAgICAgc3RydWN0IG5sYXR0ciAqcmF0ZV90bHYsIHN0cnVjdCB0Y2ZfZXh0cyAqZXh0cywgYm9vbCBvdnIpCiB7CiAjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCiAJewogCQlzdHJ1Y3QgdGNfYWN0aW9uICphY3Q7CiAKLQkJSU5JVF9MSVNUX0hFQUQoJmV4dHMtPmFjdGlvbnMpOwogCQlpZiAoZXh0cy0+cG9saWNlICYmIHRiW2V4dHMtPnBvbGljZV0pIHsKIAkJCWFjdCA9IHRjZl9hY3Rpb25faW5pdF8xKG5ldCwgdGJbZXh0cy0+cG9saWNlXSwgcmF0ZV90bHYsCi0JCQkJCQkicG9saWNlIiwgb3ZyLAotCQkJCQkJVENBX0FDVF9CSU5EKTsKKwkJCQkJCSJwb2xpY2UiLCBvdnIsIFRDQV9BQ1RfQklORCk7CiAJCQlpZiAoSVNfRVJSKGFjdCkpCiAJCQkJcmV0dXJuIFBUUl9FUlIoYWN0KTsKIAogCQkJYWN0LT50eXBlID0gZXh0cy0+dHlwZSA9IFRDQV9PTERfQ09NUEFUOwotCQkJbGlzdF9hZGQoJmFjdC0+bGlzdCwgJmV4dHMtPmFjdGlvbnMpOworCQkJZXh0cy0+YWN0aW9uc1swXSA9IGFjdDsKKwkJCWV4dHMtPm5yX2FjdGlvbnMgPSAxOwogCQl9IGVsc2UgaWYgKGV4dHMtPmFjdGlvbiAmJiB0YltleHRzLT5hY3Rpb25dKSB7Ci0JCQlpbnQgZXJyOworCQkJTElTVF9IRUFEKGFjdGlvbnMpOworCQkJaW50IGVyciwgaSA9IDA7CisKIAkJCWVyciA9IHRjZl9hY3Rpb25faW5pdChuZXQsIHRiW2V4dHMtPmFjdGlvbl0sIHJhdGVfdGx2LAotCQkJCQkgICAgICBOVUxMLCBvdnIsCi0JCQkJCSAgICAgIFRDQV9BQ1RfQklORCwgJmV4dHMtPmFjdGlvbnMpOworCQkJCQkgICAgICBOVUxMLCBvdnIsIFRDQV9BQ1RfQklORCwKKwkJCQkJICAgICAgJmFjdGlvbnMpOwogCQkJaWYgKGVycikKIAkJCQlyZXR1cm4gZXJyOworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShhY3QsICZhY3Rpb25zLCBsaXN0KQorCQkJCWV4dHMtPmFjdGlvbnNbaSsrXSA9IGFjdDsKKwkJCWV4dHMtPm5yX2FjdGlvbnMgPSBpOwogCQl9CiAJfQogI2Vsc2UKQEAgLTU4NywzNyArNTk4LDQ5IEBACiAJCSAgICAgc3RydWN0IHRjZl9leHRzICpzcmMpCiB7CiAjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCi0JTElTVF9IRUFEKHRtcCk7CisJc3RydWN0IHRjZl9leHRzIG9sZCA9ICpkc3Q7CisKIAl0Y2ZfdHJlZV9sb2NrKHRwKTsKLQlsaXN0X3NwbGljZV9pbml0KCZkc3QtPmFjdGlvbnMsICZ0bXApOwotCWxpc3Rfc3BsaWNlKCZzcmMtPmFjdGlvbnMsICZkc3QtPmFjdGlvbnMpOworCWRzdC0+bnJfYWN0aW9ucyA9IHNyYy0+bnJfYWN0aW9uczsKKwlkc3QtPmFjdGlvbnMgPSBzcmMtPmFjdGlvbnM7CiAJZHN0LT50eXBlID0gc3JjLT50eXBlOwogCXRjZl90cmVlX3VubG9jayh0cCk7Ci0JdGNmX2FjdGlvbl9kZXN0cm95KCZ0bXAsIFRDQV9BQ1RfVU5CSU5EKTsKKworCXRjZl9leHRzX2Rlc3Ryb3koJm9sZCk7CiAjZW5kaWYKIH0KIEVYUE9SVF9TWU1CT0wodGNmX2V4dHNfY2hhbmdlKTsKIAotI2RlZmluZSB0Y2ZfZXh0c19maXJzdF9hY3QoZXh0KQkJCQkJXAotCWxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmKGV4dHMpLT5hY3Rpb25zLAkJXAotCQkJCSBzdHJ1Y3QgdGNfYWN0aW9uLCBsaXN0KQorI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAorc3RhdGljIHN0cnVjdCB0Y19hY3Rpb24gKnRjZl9leHRzX2ZpcnN0X2FjdChzdHJ1Y3QgdGNmX2V4dHMgKmV4dHMpCit7CisJaWYgKGV4dHMtPm5yX2FjdGlvbnMgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisJZWxzZQorCQlyZXR1cm4gZXh0cy0+YWN0aW9uc1swXTsKK30KKyNlbmRpZgogCiBpbnQgdGNmX2V4dHNfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNmX2V4dHMgKmV4dHMpCiB7CiAjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCiAJc3RydWN0IG5sYXR0ciAqbmVzdDsKIAotCWlmIChleHRzLT5hY3Rpb24gJiYgIWxpc3RfZW1wdHkoJmV4dHMtPmFjdGlvbnMpKSB7CisJaWYgKGV4dHMtPmFjdGlvbiAmJiBleHRzLT5ucl9hY3Rpb25zKSB7CiAJCS8qCiAJCSAqIGFnYWluIGZvciBiYWNrd2FyZCBjb21wYXRpYmxlIG1vZGUgLSB3ZSB3YW50CiAJCSAqIHRvIHdvcmsgd2l0aCBib3RoIG9sZCBhbmQgbmV3IG1vZGVzIG9mIGVudGVyaW5nCiAJCSAqIHRjIGRhdGEgZXZlbiBpZiBpcHJvdXRlMiAgd2FzIG5ld2VyIC0gamhzCiAJCSAqLwogCQlpZiAoZXh0cy0+dHlwZSAhPSBUQ0FfT0xEX0NPTVBBVCkgeworCQkJTElTVF9IRUFEKGFjdGlvbnMpOworCiAJCQluZXN0ID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBleHRzLT5hY3Rpb24pOwogCQkJaWYgKG5lc3QgPT0gTlVMTCkKIAkJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKLQkJCWlmICh0Y2ZfYWN0aW9uX2R1bXAoc2tiLCAmZXh0cy0+YWN0aW9ucywgMCwgMCkgPCAwKQorCisJCQl0Y2ZfZXh0c190b19saXN0KGV4dHMsICZhY3Rpb25zKTsKKwkJCWlmICh0Y2ZfYWN0aW9uX2R1bXAoc2tiLCAmYWN0aW9ucywgMCwgMCkgPCAwKQogCQkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCQkJbmxhX25lc3RfZW5kKHNrYiwgbmVzdCk7CiAJCX0gZWxzZSBpZiAoZXh0cy0+cG9saWNlKSB7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX2Jhc2ljLmMgYi9uZXQvc2NoZWQvY2xzX2Jhc2ljLmMKaW5kZXggMGI4YzNhYy4uZWIyMTliNyAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19iYXNpYy5jCisrKyBiL25ldC9zY2hlZC9jbHNfYmFzaWMuYwpAQCAtMTM4LDEwICsxMzgsMTIgQEAKIAlzdHJ1Y3QgdGNmX2V4dHMgZTsKIAlzdHJ1Y3QgdGNmX2VtYXRjaF90cmVlIHQ7CiAKLQl0Y2ZfZXh0c19pbml0KCZlLCBUQ0FfQkFTSUNfQUNULCBUQ0FfQkFTSUNfUE9MSUNFKTsKLQllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgZXN0LCAmZSwgb3ZyKTsKKwllcnIgPSB0Y2ZfZXh0c19pbml0KCZlLCBUQ0FfQkFTSUNfQUNULCBUQ0FfQkFTSUNfUE9MSUNFKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKKwllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgZXN0LCAmZSwgb3ZyKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSB0Y2ZfZW1fdHJlZV92YWxpZGF0ZSh0cCwgdGJbVENBX0JBU0lDX0VNQVRDSEVTXSwgJnQpOwogCWlmIChlcnIgPCAwKQpAQCAtMTg5LDcgKzE5MSwxMCBAQAogCWlmICghZm5ldykKIAkJcmV0dXJuIC1FTk9CVUZTOwogCi0JdGNmX2V4dHNfaW5pdCgmZm5ldy0+ZXh0cywgVENBX0JBU0lDX0FDVCwgVENBX0JBU0lDX1BPTElDRSk7CisJZXJyID0gdGNmX2V4dHNfaW5pdCgmZm5ldy0+ZXh0cywgVENBX0JBU0lDX0FDVCwgVENBX0JBU0lDX1BPTElDRSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3V0OworCiAJZXJyID0gLUVJTlZBTDsKIAlpZiAoaGFuZGxlKSB7CiAJCWZuZXctPmhhbmRsZSA9IGhhbmRsZTsKQEAgLTIyNiw2ICsyMzEsNyBAQAogCiAJcmV0dXJuIDA7CiBlcnJvdXQ6CisJdGNmX2V4dHNfZGVzdHJveSgmZm5ldy0+ZXh0cyk7CiAJa2ZyZWUoZm5ldyk7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfYnBmLmMgYi9uZXQvc2NoZWQvY2xzX2JwZi5jCmluZGV4IGMzMDAyYzIuLmJiMWQ1YTQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfYnBmLmMKKysrIGIvbmV0L3NjaGVkL2Nsc19icGYuYwpAQCAtMjcsNiArMjcsOCBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJUQyBCUEYgYmFzZWQgY2xhc3NpZmllciIpOwogCiAjZGVmaW5lIENMU19CUEZfTkFNRV9MRU4JMjU2CisjZGVmaW5lIENMU19CUEZfU1VQUE9SVEVEX0dFTl9GTEFHUwkJXAorCShUQ0FfQ0xTX0ZMQUdTX1NLSVBfSFcgfCBUQ0FfQ0xTX0ZMQUdTX1NLSVBfU1cpCiAKIHN0cnVjdCBjbHNfYnBmX2hlYWQgewogCXN0cnVjdCBsaXN0X2hlYWQgcGxpc3Q7CkBAIC0zOSw2ICs0MSw4IEBACiAJc3RydWN0IGxpc3RfaGVhZCBsaW5rOwogCXN0cnVjdCB0Y2ZfcmVzdWx0IHJlczsKIAlib29sIGV4dHNfaW50ZWdyYXRlZDsKKwlib29sIG9mZmxvYWRlZDsKKwl1MzIgZ2VuX2ZsYWdzOwogCXN0cnVjdCB0Y2ZfZXh0cyBleHRzOwogCXUzMiBoYW5kbGU7CiAJdW5pb24gewpAQCAtNTQsOCArNTgsMTAgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBicGZfcG9saWN5W1RDQV9CUEZfTUFYICsgMV0gPSB7CiAJW1RDQV9CUEZfQ0xBU1NJRF0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAogCVtUQ0FfQlBGX0ZMQUdTXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtUQ0FfQlBGX0ZMQUdTX0dFTl0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAogCVtUQ0FfQlBGX0ZEXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAotCVtUQ0FfQlBGX05BTUVdCQk9IHsgLnR5cGUgPSBOTEFfTlVMX1NUUklORywgLmxlbiA9IENMU19CUEZfTkFNRV9MRU4gfSwKKwlbVENBX0JQRl9OQU1FXQkJPSB7IC50eXBlID0gTkxBX05VTF9TVFJJTkcsCisJCQkJICAgIC5sZW4gPSBDTFNfQlBGX05BTUVfTEVOIH0sCiAJW1RDQV9CUEZfT1BTX0xFTl0JPSB7IC50eXBlID0gTkxBX1UxNiB9LAogCVtUQ0FfQlBGX09QU10JCT0geyAudHlwZSA9IE5MQV9CSU5BUlksCiAJCQkJICAgIC5sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2tfZmlsdGVyKSAqIEJQRl9NQVhJTlNOUyB9LApAQCAtODMsOSArODksNiBAQAogCXN0cnVjdCBjbHNfYnBmX3Byb2cgKnByb2c7CiAJaW50IHJldCA9IC0xOwogCi0JaWYgKHVubGlrZWx5KCFza2JfbWFjX2hlYWRlcl93YXNfc2V0KHNrYikpKQotCQlyZXR1cm4gLTE7Ci0KIAkvKiBOZWVkZWQgaGVyZSBmb3IgYWNjZXNzaW5nIG1hcHMuICovCiAJcmN1X3JlYWRfbG9jaygpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHByb2csICZoZWFkLT5wbGlzdCwgbGluaykgewpAQCAtOTMsNyArOTYsOSBAQAogCiAJCXFkaXNjX3NrYl9jYihza2IpLT50Y19jbGFzc2lkID0gcHJvZy0+cmVzLmNsYXNzaWQ7CiAKLQkJaWYgKGF0X2luZ3Jlc3MpIHsKKwkJaWYgKHRjX3NraXBfc3cocHJvZy0+Z2VuX2ZsYWdzKSkgeworCQkJZmlsdGVyX3JlcyA9IHByb2ctPmV4dHNfaW50ZWdyYXRlZCA/IFRDX0FDVF9VTlNQRUMgOiAwOworCQl9IGVsc2UgaWYgKGF0X2luZ3Jlc3MpIHsKIAkJCS8qIEl0IGlzIHNhZmUgdG8gcHVzaC9wdWxsIGV2ZW4gaWYgc2tiX3NoYXJlZCgpICovCiAJCQlfX3NrYl9wdXNoKHNrYiwgc2tiLT5tYWNfbGVuKTsKIAkJCWJwZl9jb21wdXRlX2RhdGFfZW5kKHNrYik7CkBAIC0xNDAsNiArMTQ1LDkxIEBACiAJcmV0dXJuICFwcm9nLT5icGZfb3BzOwogfQogCitzdGF0aWMgaW50IGNsc19icGZfb2ZmbG9hZF9jbWQoc3RydWN0IHRjZl9wcm90byAqdHAsIHN0cnVjdCBjbHNfYnBmX3Byb2cgKnByb2csCisJCQkgICAgICAgZW51bSB0Y19jbHNicGZfY29tbWFuZCBjbWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHRwLT5xLT5kZXZfcXVldWUtPmRldjsKKwlzdHJ1Y3QgdGNfY2xzX2JwZl9vZmZsb2FkIGJwZl9vZmZsb2FkID0ge307CisJc3RydWN0IHRjX3RvX25ldGRldiBvZmZsb2FkOworCisJb2ZmbG9hZC50eXBlID0gVENfU0VUVVBfQ0xTQlBGOworCW9mZmxvYWQuY2xzX2JwZiA9ICZicGZfb2ZmbG9hZDsKKworCWJwZl9vZmZsb2FkLmNvbW1hbmQgPSBjbWQ7CisJYnBmX29mZmxvYWQuZXh0cyA9ICZwcm9nLT5leHRzOworCWJwZl9vZmZsb2FkLnByb2cgPSBwcm9nLT5maWx0ZXI7CisJYnBmX29mZmxvYWQubmFtZSA9IHByb2ctPmJwZl9uYW1lOworCWJwZl9vZmZsb2FkLmV4dHNfaW50ZWdyYXRlZCA9IHByb2ctPmV4dHNfaW50ZWdyYXRlZDsKKwlicGZfb2ZmbG9hZC5nZW5fZmxhZ3MgPSBwcm9nLT5nZW5fZmxhZ3M7CisKKwlyZXR1cm4gZGV2LT5uZXRkZXZfb3BzLT5uZG9fc2V0dXBfdGMoZGV2LCB0cC0+cS0+aGFuZGxlLAorCQkJCQkgICAgIHRwLT5wcm90b2NvbCwgJm9mZmxvYWQpOworfQorCitzdGF0aWMgaW50IGNsc19icGZfb2ZmbG9hZChzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgc3RydWN0IGNsc19icGZfcHJvZyAqcHJvZywKKwkJCSAgIHN0cnVjdCBjbHNfYnBmX3Byb2cgKm9sZHByb2cpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHRwLT5xLT5kZXZfcXVldWUtPmRldjsKKwlzdHJ1Y3QgY2xzX2JwZl9wcm9nICpvYmogPSBwcm9nOworCWVudW0gdGNfY2xzYnBmX2NvbW1hbmQgY21kOworCWJvb2wgc2tpcF9zdzsKKwlpbnQgcmV0OworCisJc2tpcF9zdyA9IHRjX3NraXBfc3cocHJvZy0+Z2VuX2ZsYWdzKSB8fAorCQkob2xkcHJvZyAmJiB0Y19za2lwX3N3KG9sZHByb2ctPmdlbl9mbGFncykpOworCisJaWYgKG9sZHByb2cgJiYgb2xkcHJvZy0+b2ZmbG9hZGVkKSB7CisJCWlmICh0Y19zaG91bGRfb2ZmbG9hZChkZXYsIHRwLCBwcm9nLT5nZW5fZmxhZ3MpKSB7CisJCQljbWQgPSBUQ19DTFNCUEZfUkVQTEFDRTsKKwkJfSBlbHNlIGlmICghdGNfc2tpcF9zdyhwcm9nLT5nZW5fZmxhZ3MpKSB7CisJCQlvYmogPSBvbGRwcm9nOworCQkJY21kID0gVENfQ0xTQlBGX0RFU1RST1k7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghdGNfc2hvdWxkX29mZmxvYWQoZGV2LCB0cCwgcHJvZy0+Z2VuX2ZsYWdzKSkKKwkJCXJldHVybiBza2lwX3N3ID8gLUVJTlZBTCA6IDA7CisJCWNtZCA9IFRDX0NMU0JQRl9BREQ7CisJfQorCisJcmV0ID0gY2xzX2JwZl9vZmZsb2FkX2NtZCh0cCwgb2JqLCBjbWQpOworCWlmIChyZXQpCisJCXJldHVybiBza2lwX3N3ID8gcmV0IDogMDsKKworCW9iai0+b2ZmbG9hZGVkID0gdHJ1ZTsKKwlpZiAob2xkcHJvZykKKwkJb2xkcHJvZy0+b2ZmbG9hZGVkID0gZmFsc2U7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2xzX2JwZl9zdG9wX29mZmxvYWQoc3RydWN0IHRjZl9wcm90byAqdHAsCisJCQkJIHN0cnVjdCBjbHNfYnBmX3Byb2cgKnByb2cpCit7CisJaW50IGVycjsKKworCWlmICghcHJvZy0+b2ZmbG9hZGVkKQorCQlyZXR1cm47CisKKwllcnIgPSBjbHNfYnBmX29mZmxvYWRfY21kKHRwLCBwcm9nLCBUQ19DTFNCUEZfREVTVFJPWSk7CisJaWYgKGVycikgeworCQlwcl9lcnIoIlN0b3BwaW5nIGhhcmR3YXJlIG9mZmxvYWQgZmFpbGVkOiAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuOworCX0KKworCXByb2ctPm9mZmxvYWRlZCA9IGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBjbHNfYnBmX29mZmxvYWRfdXBkYXRlX3N0YXRzKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLAorCQkJCQkgc3RydWN0IGNsc19icGZfcHJvZyAqcHJvZykKK3sKKwlpZiAoIXByb2ctPm9mZmxvYWRlZCkKKwkJcmV0dXJuOworCisJY2xzX2JwZl9vZmZsb2FkX2NtZCh0cCwgcHJvZywgVENfQ0xTQlBGX1NUQVRTKTsKK30KKwogc3RhdGljIGludCBjbHNfYnBmX2luaXQoc3RydWN0IHRjZl9wcm90byAqdHApCiB7CiAJc3RydWN0IGNsc19icGZfaGVhZCAqaGVhZDsKQEAgLTE3OSw2ICsyNjksNyBAQAogewogCXN0cnVjdCBjbHNfYnBmX3Byb2cgKnByb2cgPSAoc3RydWN0IGNsc19icGZfcHJvZyAqKSBhcmc7CiAKKwljbHNfYnBmX3N0b3Bfb2ZmbG9hZCh0cCwgcHJvZyk7CiAJbGlzdF9kZWxfcmN1KCZwcm9nLT5saW5rKTsKIAl0Y2ZfdW5iaW5kX2ZpbHRlcih0cCwgJnByb2ctPnJlcyk7CiAJY2FsbF9yY3UoJnByb2ctPnJjdSwgX19jbHNfYnBmX2RlbGV0ZV9wcm9nKTsKQEAgLTE5NSw2ICsyODYsNyBAQAogCQlyZXR1cm4gZmFsc2U7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHJvZywgdG1wLCAmaGVhZC0+cGxpc3QsIGxpbmspIHsKKwkJY2xzX2JwZl9zdG9wX29mZmxvYWQodHAsIHByb2cpOwogCQlsaXN0X2RlbF9yY3UoJnByb2ctPmxpbmspOwogCQl0Y2ZfdW5iaW5kX2ZpbHRlcih0cCwgJnByb2ctPnJlcyk7CiAJCWNhbGxfcmN1KCZwcm9nLT5yY3UsIF9fY2xzX2JwZl9kZWxldGVfcHJvZyk7CkBAIC0zMDQsNiArMzk2LDcgQEAKIHsKIAlib29sIGlzX2JwZiwgaXNfZWJwZiwgaGF2ZV9leHRzID0gZmFsc2U7CiAJc3RydWN0IHRjZl9leHRzIGV4dHM7CisJdTMyIGdlbl9mbGFncyA9IDA7CiAJaW50IHJldDsKIAogCWlzX2JwZiA9IHRiW1RDQV9CUEZfT1BTX0xFTl0gJiYgdGJbVENBX0JQRl9PUFNdOwpAQCAtMzExLDMwICs0MDQsMzkgQEAKIAlpZiAoKCFpc19icGYgJiYgIWlzX2VicGYpIHx8IChpc19icGYgJiYgaXNfZWJwZikpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JdGNmX2V4dHNfaW5pdCgmZXh0cywgVENBX0JQRl9BQ1QsIFRDQV9CUEZfUE9MSUNFKTsKLQlyZXQgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgZXN0LCAmZXh0cywgb3ZyKTsKKwlyZXQgPSB0Y2ZfZXh0c19pbml0KCZleHRzLCBUQ0FfQlBGX0FDVCwgVENBX0JQRl9QT0xJQ0UpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OworCXJldCA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCBlc3QsICZleHRzLCBvdnIpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm91dDsKIAogCWlmICh0YltUQ0FfQlBGX0ZMQUdTXSkgewogCQl1MzIgYnBmX2ZsYWdzID0gbmxhX2dldF91MzIodGJbVENBX0JQRl9GTEFHU10pOwogCiAJCWlmIChicGZfZmxhZ3MgJiB+VENBX0JQRl9GTEFHX0FDVF9ESVJFQ1QpIHsKLQkJCXRjZl9leHRzX2Rlc3Ryb3koJmV4dHMpOwotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJvdXQ7CiAJCX0KIAogCQloYXZlX2V4dHMgPSBicGZfZmxhZ3MgJiBUQ0FfQlBGX0ZMQUdfQUNUX0RJUkVDVDsKIAl9CisJaWYgKHRiW1RDQV9CUEZfRkxBR1NfR0VOXSkgeworCQlnZW5fZmxhZ3MgPSBubGFfZ2V0X3UzMih0YltUQ0FfQlBGX0ZMQUdTX0dFTl0pOworCQlpZiAoZ2VuX2ZsYWdzICYgfkNMU19CUEZfU1VQUE9SVEVEX0dFTl9GTEFHUyB8fAorCQkgICAgIXRjX2ZsYWdzX3ZhbGlkKGdlbl9mbGFncykpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycm91dDsKKwkJfQorCX0KIAogCXByb2ctPmV4dHNfaW50ZWdyYXRlZCA9IGhhdmVfZXh0czsKKwlwcm9nLT5nZW5fZmxhZ3MgPSBnZW5fZmxhZ3M7CiAKIAlyZXQgPSBpc19icGYgPyBjbHNfYnBmX3Byb2dfZnJvbV9vcHModGIsIHByb2cpIDoKIAkJICAgICAgIGNsc19icGZfcHJvZ19mcm9tX2VmZCh0YiwgcHJvZywgdHApOwotCWlmIChyZXQgPCAwKSB7Ci0JCXRjZl9leHRzX2Rlc3Ryb3koJmV4dHMpOwotCQlyZXR1cm4gcmV0OwotCX0KKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvdXQ7CiAKIAlpZiAodGJbVENBX0JQRl9DTEFTU0lEXSkgewogCQlwcm9nLT5yZXMuY2xhc3NpZCA9IG5sYV9nZXRfdTMyKHRiW1RDQV9CUEZfQ0xBU1NJRF0pOwpAQCAtMzQzLDYgKzQ0NSwxMCBAQAogCiAJdGNmX2V4dHNfY2hhbmdlKHRwLCAmcHJvZy0+ZXh0cywgJmV4dHMpOwogCXJldHVybiAwOworCitlcnJvdXQ6CisJdGNmX2V4dHNfZGVzdHJveSgmZXh0cyk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHUzMiBjbHNfYnBmX2dyYWJfbmV3X2hhbmRsZShzdHJ1Y3QgdGNmX3Byb3RvICp0cCwKQEAgLTM4OCw3ICs0OTQsOSBAQAogCWlmICghcHJvZykKIAkJcmV0dXJuIC1FTk9CVUZTOwogCi0JdGNmX2V4dHNfaW5pdCgmcHJvZy0+ZXh0cywgVENBX0JQRl9BQ1QsIFRDQV9CUEZfUE9MSUNFKTsKKwlyZXQgPSB0Y2ZfZXh0c19pbml0KCZwcm9nLT5leHRzLCBUQ0FfQlBGX0FDVCwgVENBX0JQRl9QT0xJQ0UpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm91dDsKIAogCWlmIChvbGRwcm9nKSB7CiAJCWlmIChoYW5kbGUgJiYgb2xkcHJvZy0+aGFuZGxlICE9IGhhbmRsZSkgewpAQCAtNDA2LDEwICs1MTQsMTcgQEAKIAkJZ290byBlcnJvdXQ7CiAJfQogCi0JcmV0ID0gY2xzX2JwZl9tb2RpZnlfZXhpc3RpbmcobmV0LCB0cCwgcHJvZywgYmFzZSwgdGIsIHRjYVtUQ0FfUkFURV0sIG92cik7CisJcmV0ID0gY2xzX2JwZl9tb2RpZnlfZXhpc3RpbmcobmV0LCB0cCwgcHJvZywgYmFzZSwgdGIsIHRjYVtUQ0FfUkFURV0sCisJCQkJICAgICAgb3ZyKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJvdXQ7CiAKKwlyZXQgPSBjbHNfYnBmX29mZmxvYWQodHAsIHByb2csIG9sZHByb2cpOworCWlmIChyZXQpIHsKKwkJY2xzX2JwZl9kZWxldGVfcHJvZyh0cCwgcHJvZyk7CisJCXJldHVybiByZXQ7CisJfQorCiAJaWYgKG9sZHByb2cpIHsKIAkJbGlzdF9yZXBsYWNlX3JjdSgmb2xkcHJvZy0+bGluaywgJnByb2ctPmxpbmspOwogCQl0Y2ZfdW5iaW5kX2ZpbHRlcih0cCwgJm9sZHByb2ctPnJlcyk7CkBAIC00MjAsOSArNTM1LDEwIEBACiAKIAkqYXJnID0gKHVuc2lnbmVkIGxvbmcpIHByb2c7CiAJcmV0dXJuIDA7Ci1lcnJvdXQ6Ci0Ja2ZyZWUocHJvZyk7CiAKK2Vycm91dDoKKwl0Y2ZfZXh0c19kZXN0cm95KCZwcm9nLT5leHRzKTsKKwlrZnJlZShwcm9nKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC00NzAsNiArNTg2LDggQEAKIAogCXRtLT50Y21faGFuZGxlID0gcHJvZy0+aGFuZGxlOwogCisJY2xzX2JwZl9vZmZsb2FkX3VwZGF0ZV9zdGF0cyh0cCwgcHJvZyk7CisKIAluZXN0ID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBUQ0FfT1BUSU9OUyk7CiAJaWYgKG5lc3QgPT0gTlVMTCkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CkBAIC00OTIsNiArNjEwLDkgQEAKIAkJYnBmX2ZsYWdzIHw9IFRDQV9CUEZfRkxBR19BQ1RfRElSRUNUOwogCWlmIChicGZfZmxhZ3MgJiYgbmxhX3B1dF91MzIoc2tiLCBUQ0FfQlBGX0ZMQUdTLCBicGZfZmxhZ3MpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlpZiAocHJvZy0+Z2VuX2ZsYWdzICYmCisJICAgIG5sYV9wdXRfdTMyKHNrYiwgVENBX0JQRl9GTEFHU19HRU4sIHByb2ctPmdlbl9mbGFncykpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCiAJbmxhX25lc3RfZW5kKHNrYiwgbmVzdCk7CiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfY2dyb3VwLmMgYi9uZXQvc2NoZWQvY2xzX2Nncm91cC5jCmluZGV4IDRjODViZDMuLjg1MjMzYzQ3IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX2Nncm91cC5jCisrKyBiL25ldC9zY2hlZC9jbHNfY2dyb3VwLmMKQEAgLTkzLDcgKzkzLDkgQEAKIAlpZiAoIW5ldykKIAkJcmV0dXJuIC1FTk9CVUZTOwogCi0JdGNmX2V4dHNfaW5pdCgmbmV3LT5leHRzLCBUQ0FfQ0dST1VQX0FDVCwgVENBX0NHUk9VUF9QT0xJQ0UpOworCWVyciA9IHRjZl9leHRzX2luaXQoJm5ldy0+ZXh0cywgVENBX0NHUk9VUF9BQ1QsIFRDQV9DR1JPVVBfUE9MSUNFKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvdXQ7CiAJbmV3LT5oYW5kbGUgPSBoYW5kbGU7CiAJbmV3LT50cCA9IHRwOwogCWVyciA9IG5sYV9wYXJzZV9uZXN0ZWQodGIsIFRDQV9DR1JPVVBfTUFYLCB0Y2FbVENBX09QVElPTlNdLApAQCAtMTAxLDEwICsxMDMsMTQgQEAKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnJvdXQ7CiAKLQl0Y2ZfZXh0c19pbml0KCZlLCBUQ0FfQ0dST1VQX0FDVCwgVENBX0NHUk9VUF9QT0xJQ0UpOwotCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCB0Y2FbVENBX1JBVEVdLCAmZSwgb3ZyKTsKKwllcnIgPSB0Y2ZfZXh0c19pbml0KCZlLCBUQ0FfQ0dST1VQX0FDVCwgVENBX0NHUk9VUF9QT0xJQ0UpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycm91dDsKKwllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgdGNhW1RDQV9SQVRFXSwgJmUsIG92cik7CisJaWYgKGVyciA8IDApIHsKKwkJdGNmX2V4dHNfZGVzdHJveSgmZSk7CisJCWdvdG8gZXJyb3V0OworCX0KIAogCWVyciA9IHRjZl9lbV90cmVlX3ZhbGlkYXRlKHRwLCB0YltUQ0FfQ0dST1VQX0VNQVRDSEVTXSwgJnQpOwogCWlmIChlcnIgPCAwKSB7CkBAIC0xMjAsNiArMTI2LDcgQEAKIAkJY2FsbF9yY3UoJmhlYWQtPnJjdSwgY2xzX2Nncm91cF9kZXN0cm95X3JjdSk7CiAJcmV0dXJuIDA7CiBlcnJvdXQ6CisJdGNmX2V4dHNfZGVzdHJveSgmbmV3LT5leHRzKTsKIAlrZnJlZShuZXcpOwogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX2Zsb3cuYyBiL25ldC9zY2hlZC9jbHNfZmxvdy5jCmluZGV4IGZiZmVjNmEuLmUzOTY3MjMgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfZmxvdy5jCisrKyBiL25ldC9zY2hlZC9jbHNfZmxvdy5jCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAjaW5jbHVkZSA8bmV0L2Zsb3dfZGlzc2VjdG9yLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTkZfQ09OTlRSQUNLKQogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CiAjZW5kaWYKIApAQCAtODcsMTIgKzg3LDE0IEBACiAJcmV0dXJuIGFkZHJfZm9sZChza2JfZHN0KHNrYikpIF4gKF9fZm9yY2UgdTE2KSB0Y19za2JfcHJvdG9jb2woc2tiKTsKIH0KIAotc3RhdGljIHUzMiBmbG93X2dldF9wcm90byhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgZmxvd19rZXlzICpmbG93KQorc3RhdGljIHUzMiBmbG93X2dldF9wcm90byhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICBjb25zdCBzdHJ1Y3QgZmxvd19rZXlzICpmbG93KQogewogCXJldHVybiBmbG93LT5iYXNpYy5pcF9wcm90bzsKIH0KIAotc3RhdGljIHUzMiBmbG93X2dldF9wcm90b19zcmMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IGZsb3dfa2V5cyAqZmxvdykKK3N0YXRpYyB1MzIgZmxvd19nZXRfcHJvdG9fc3JjKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgZmxvd19rZXlzICpmbG93KQogewogCWlmIChmbG93LT5wb3J0cy5wb3J0cykKIAkJcmV0dXJuIG50b2hzKGZsb3ctPnBvcnRzLnNyYyk7CkBAIC0xMDAsNyArMTAyLDggQEAKIAlyZXR1cm4gYWRkcl9mb2xkKHNrYi0+c2spOwogfQogCi1zdGF0aWMgdTMyIGZsb3dfZ2V0X3Byb3RvX2RzdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgZmxvd19rZXlzICpmbG93KQorc3RhdGljIHUzMiBmbG93X2dldF9wcm90b19kc3QoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBmbG93X2tleXMgKmZsb3cpCiB7CiAJaWYgKGZsb3ctPnBvcnRzLnBvcnRzKQogCQlyZXR1cm4gbnRvaHMoZmxvdy0+cG9ydHMuZHN0KTsKQEAgLTEyNSwxNCArMTI4LDE0IEBACiAKIHN0YXRpYyB1MzIgZmxvd19nZXRfbmZjdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19ORl9DT05OVFJBQ0spCiAJcmV0dXJuIGFkZHJfZm9sZChza2ItPm5mY3QpOwogI2Vsc2UKIAlyZXR1cm4gMDsKICNlbmRpZgogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX05GX0NPTk5UUkFDSykKICNkZWZpbmUgQ1RUVVBMRShza2IsIG1lbWJlcikJCQkJCQlcCiAoewkJCQkJCQkJCVwKIAllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsJCQkJCVwKQEAgLTE0OSw3ICsxNTIsOCBAQAogfSkKICNlbmRpZgogCi1zdGF0aWMgdTMyIGZsb3dfZ2V0X25mY3Rfc3JjKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBmbG93X2tleXMgKmZsb3cpCitzdGF0aWMgdTMyIGZsb3dfZ2V0X25mY3Rfc3JjKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBmbG93X2tleXMgKmZsb3cpCiB7CiAJc3dpdGNoICh0Y19za2JfcHJvdG9jb2woc2tiKSkgewogCWNhc2UgaHRvbnMoRVRIX1BfSVApOgpAQCAtMTYxLDcgKzE2NSw4IEBACiAJcmV0dXJuIGZsb3dfZ2V0X3NyYyhza2IsIGZsb3cpOwogfQogCi1zdGF0aWMgdTMyIGZsb3dfZ2V0X25mY3RfZHN0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBmbG93X2tleXMgKmZsb3cpCitzdGF0aWMgdTMyIGZsb3dfZ2V0X25mY3RfZHN0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBmbG93X2tleXMgKmZsb3cpCiB7CiAJc3dpdGNoICh0Y19za2JfcHJvdG9jb2woc2tiKSkgewogCWNhc2UgaHRvbnMoRVRIX1BfSVApOgpAQCAtMTczLDE0ICsxNzgsMTYgQEAKIAlyZXR1cm4gZmxvd19nZXRfZHN0KHNrYiwgZmxvdyk7CiB9CiAKLXN0YXRpYyB1MzIgZmxvd19nZXRfbmZjdF9wcm90b19zcmMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IGZsb3dfa2V5cyAqZmxvdykKK3N0YXRpYyB1MzIgZmxvd19nZXRfbmZjdF9wcm90b19zcmMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgZmxvd19rZXlzICpmbG93KQogewogCXJldHVybiBudG9ocyhDVFRVUExFKHNrYiwgc3JjLnUuYWxsKSk7CiBmYWxsYmFjazoKIAlyZXR1cm4gZmxvd19nZXRfcHJvdG9fc3JjKHNrYiwgZmxvdyk7CiB9CiAKLXN0YXRpYyB1MzIgZmxvd19nZXRfbmZjdF9wcm90b19kc3QoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IGZsb3dfa2V5cyAqZmxvdykKK3N0YXRpYyB1MzIgZmxvd19nZXRfbmZjdF9wcm90b19kc3QoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgZmxvd19rZXlzICpmbG93KQogewogCXJldHVybiBudG9ocyhDVFRVUExFKHNrYiwgZHN0LnUuYWxsKSk7CiBmYWxsYmFjazoKQEAgLTQxOCwxMCArNDI1LDEyIEBACiAJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCi0JdGNmX2V4dHNfaW5pdCgmZSwgVENBX0ZMT1dfQUNULCBUQ0FfRkxPV19QT0xJQ0UpOworCWVyciA9IHRjZl9leHRzX2luaXQoJmUsIFRDQV9GTE9XX0FDVCwgVENBX0ZMT1dfUE9MSUNFKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnIxOwogCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCB0Y2FbVENBX1JBVEVdLCAmZSwgb3ZyKTsKIAlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKKwkJZ290byBlcnIxOwogCiAJZXJyID0gdGNmX2VtX3RyZWVfdmFsaWRhdGUodHAsIHRiW1RDQV9GTE9XX0VNQVRDSEVTXSwgJnQpOwogCWlmIChlcnIgPCAwKQpAQCAtNDMyLDEzICs0NDEsMTUgQEAKIAlpZiAoIWZuZXcpCiAJCWdvdG8gZXJyMjsKIAotCXRjZl9leHRzX2luaXQoJmZuZXctPmV4dHMsIFRDQV9GTE9XX0FDVCwgVENBX0ZMT1dfUE9MSUNFKTsKKwllcnIgPSB0Y2ZfZXh0c19pbml0KCZmbmV3LT5leHRzLCBUQ0FfRkxPV19BQ1QsIFRDQV9GTE9XX1BPTElDRSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyMzsKIAogCWZvbGQgPSAoc3RydWN0IGZsb3dfZmlsdGVyICopKmFyZzsKIAlpZiAoZm9sZCkgewogCQllcnIgPSAtRUlOVkFMOwogCQlpZiAoZm9sZC0+aGFuZGxlICE9IGhhbmRsZSAmJiBoYW5kbGUpCi0JCQlnb3RvIGVycjI7CisJCQlnb3RvIGVycjM7CiAKIAkJLyogQ29weSBmb2xkIGludG8gZm5ldyAqLwogCQlmbmV3LT50cCA9IGZvbGQtPnRwOwpAQCAtNDU4LDMxICs0NjksMzEgQEAKIAkJaWYgKHRiW1RDQV9GTE9XX01PREVdKQogCQkJbW9kZSA9IG5sYV9nZXRfdTMyKHRiW1RDQV9GTE9XX01PREVdKTsKIAkJaWYgKG1vZGUgIT0gRkxPV19NT0RFX0hBU0ggJiYgbmtleXMgPiAxKQotCQkJZ290byBlcnIyOworCQkJZ290byBlcnIzOwogCiAJCWlmIChtb2RlID09IEZMT1dfTU9ERV9IQVNIKQogCQkJcGVydHVyYl9wZXJpb2QgPSBmb2xkLT5wZXJ0dXJiX3BlcmlvZDsKIAkJaWYgKHRiW1RDQV9GTE9XX1BFUlRVUkJdKSB7CiAJCQlpZiAobW9kZSAhPSBGTE9XX01PREVfSEFTSCkKLQkJCQlnb3RvIGVycjI7CisJCQkJZ290byBlcnIzOwogCQkJcGVydHVyYl9wZXJpb2QgPSBubGFfZ2V0X3UzMih0YltUQ0FfRkxPV19QRVJUVVJCXSkgKiBIWjsKIAkJfQogCX0gZWxzZSB7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWlmICghaGFuZGxlKQotCQkJZ290byBlcnIyOworCQkJZ290byBlcnIzOwogCQlpZiAoIXRiW1RDQV9GTE9XX0tFWVNdKQotCQkJZ290byBlcnIyOworCQkJZ290byBlcnIzOwogCiAJCW1vZGUgPSBGTE9XX01PREVfTUFQOwogCQlpZiAodGJbVENBX0ZMT1dfTU9ERV0pCiAJCQltb2RlID0gbmxhX2dldF91MzIodGJbVENBX0ZMT1dfTU9ERV0pOwogCQlpZiAobW9kZSAhPSBGTE9XX01PREVfSEFTSCAmJiBua2V5cyA+IDEpCi0JCQlnb3RvIGVycjI7CisJCQlnb3RvIGVycjM7CiAKIAkJaWYgKHRiW1RDQV9GTE9XX1BFUlRVUkJdKSB7CiAJCQlpZiAobW9kZSAhPSBGTE9XX01PREVfSEFTSCkKLQkJCQlnb3RvIGVycjI7CisJCQkJZ290byBlcnIzOwogCQkJcGVydHVyYl9wZXJpb2QgPSBubGFfZ2V0X3UzMih0YltUQ0FfRkxPV19QRVJUVVJCXSkgKiBIWjsKIAkJfQogCkBAIC01NDIsNiArNTUzLDggQEAKIAkJY2FsbF9yY3UoJmZvbGQtPnJjdSwgZmxvd19kZXN0cm95X2ZpbHRlcik7CiAJcmV0dXJuIDA7CiAKK2VycjM6CisJdGNmX2V4dHNfZGVzdHJveSgmZm5ldy0+ZXh0cyk7CiBlcnIyOgogCXRjZl9lbV90cmVlX2Rlc3Ryb3koJnQpOwogCWtmcmVlKGZuZXcpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19mbG93ZXIuYyBiL25ldC9zY2hlZC9jbHNfZmxvd2VyLmMKaW5kZXggNTA2MDgwMS4uZjZmNDBmYiAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19mbG93ZXIuYworKysgYi9uZXQvc2NoZWQvY2xzX2Zsb3dlci5jCkBAIC0yMywxNyArMjMsMjYgQEAKICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxuZXQvZmxvd19kaXNzZWN0b3IuaD4KIAorI2luY2x1ZGUgPG5ldC9kc3QuaD4KKyNpbmNsdWRlIDxuZXQvZHN0X21ldGFkYXRhLmg+CisKIHN0cnVjdCBmbF9mbG93X2tleSB7CiAJaW50CWluZGV2X2lmaW5kZXg7CiAJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9jb250cm9sIGNvbnRyb2w7CisJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9jb250cm9sIGVuY19jb250cm9sOwogCXN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfYmFzaWMgYmFzaWM7CiAJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9ldGhfYWRkcnMgZXRoOwotCXN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfYWRkcnMgaXBhZGRyczsKKwlzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X3ZsYW4gdmxhbjsKIAl1bmlvbiB7CiAJCXN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfaXB2NF9hZGRycyBpcHY0OwogCQlzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X2lwdjZfYWRkcnMgaXB2NjsKIAl9OwogCXN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfcG9ydHMgdHA7CisJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9rZXlpZCBlbmNfa2V5X2lkOworCXVuaW9uIHsKKwkJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9pcHY0X2FkZHJzIGVuY19pcHY0OworCQlzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X2lwdjZfYWRkcnMgZW5jX2lwdjY7CisJfTsKIH0gX19hbGlnbmVkKEJJVFNfUEVSX0xPTkcgLyA4KTsgLyogRW5zdXJlIHRoYXQgd2UgY2FuIGRvIGNvbXBhcmlzb25zIGFzIGxvbmdzLiAqLwogCiBzdHJ1Y3QgZmxfZmxvd19tYXNrX3JhbmdlIHsKQEAgLTEyMywxMSArMTMyLDMxIEBACiAJc3RydWN0IGNsc19mbF9maWx0ZXIgKmY7CiAJc3RydWN0IGZsX2Zsb3dfa2V5IHNrYl9rZXk7CiAJc3RydWN0IGZsX2Zsb3dfa2V5IHNrYl9ta2V5OworCXN0cnVjdCBpcF90dW5uZWxfaW5mbyAqaW5mbzsKIAogCWlmICghYXRvbWljX3JlYWQoJmhlYWQtPmh0Lm5lbGVtcykpCiAJCXJldHVybiAtMTsKIAogCWZsX2NsZWFyX21hc2tlZF9yYW5nZSgmc2tiX2tleSwgJmhlYWQtPm1hc2spOworCisJaW5mbyA9IHNrYl90dW5uZWxfaW5mbyhza2IpOworCWlmIChpbmZvKSB7CisJCXN0cnVjdCBpcF90dW5uZWxfa2V5ICprZXkgPSAmaW5mby0+a2V5OworCisJCXN3aXRjaCAoaXBfdHVubmVsX2luZm9fYWYoaW5mbykpIHsKKwkJY2FzZSBBRl9JTkVUOgorCQkJc2tiX2tleS5lbmNfaXB2NC5zcmMgPSBrZXktPnUuaXB2NC5zcmM7CisJCQlza2Jfa2V5LmVuY19pcHY0LmRzdCA9IGtleS0+dS5pcHY0LmRzdDsKKwkJCWJyZWFrOworCQljYXNlIEFGX0lORVQ2OgorCQkJc2tiX2tleS5lbmNfaXB2Ni5zcmMgPSBrZXktPnUuaXB2Ni5zcmM7CisJCQlza2Jfa2V5LmVuY19pcHY2LmRzdCA9IGtleS0+dS5pcHY2LmRzdDsKKwkJCWJyZWFrOworCQl9CisKKwkJc2tiX2tleS5lbmNfa2V5X2lkLmtleWlkID0gdHVubmVsX2lkX3RvX2tleTMyKGtleS0+dHVuX2lkKTsKKwl9CisKIAlza2Jfa2V5LmluZGV2X2lmaW5kZXggPSBza2ItPnNrYl9paWY7CiAJLyogc2tiX2Zsb3dfZGlzc2VjdCgpIGRvZXMgbm90IHNldCBuX3Byb3RvIGluIGNhc2UgYW4gdW5rbm93biBwcm90b2NvbCwKIAkgKiBzbyBkbyBpdCByYXRoZXIgaGVyZS4KQEAgLTIxMiw3ICsyNDEsOCBAQAogCXRjLnR5cGUgPSBUQ19TRVRVUF9DTFNGTE9XRVI7CiAJdGMuY2xzX2Zsb3dlciA9ICZvZmZsb2FkOwogCi0JZXJyID0gZGV2LT5uZXRkZXZfb3BzLT5uZG9fc2V0dXBfdGMoZGV2LCB0cC0+cS0+aGFuZGxlLCB0cC0+cHJvdG9jb2wsICZ0Yyk7CisJZXJyID0gZGV2LT5uZXRkZXZfb3BzLT5uZG9fc2V0dXBfdGMoZGV2LCB0cC0+cS0+aGFuZGxlLCB0cC0+cHJvdG9jb2wsCisJCQkJCSAgICAmdGMpOwogCiAJaWYgKHRjX3NraXBfc3coZmxhZ3MpKQogCQlyZXR1cm4gZXJyOwpAQCAtMjkzLDYgKzMyMywyMiBAQAogCVtUQ0FfRkxPV0VSX0tFWV9UQ1BfRFNUXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCiAJW1RDQV9GTE9XRVJfS0VZX1VEUF9TUkNdCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKIAlbVENBX0ZMT1dFUl9LRVlfVURQX0RTVF0JPSB7IC50eXBlID0gTkxBX1UxNiB9LAorCVtUQ0FfRkxPV0VSX0tFWV9WTEFOX0lEXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCisJW1RDQV9GTE9XRVJfS0VZX1ZMQU5fUFJJT10JPSB7IC50eXBlID0gTkxBX1U4IH0sCisJW1RDQV9GTE9XRVJfS0VZX1ZMQU5fRVRIX1RZUEVdCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKKwlbVENBX0ZMT1dFUl9LRVlfRU5DX0tFWV9JRF0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNF9TUkNdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjRfU1JDX01BU0tdID0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjRfRFNUXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW1RDQV9GTE9XRVJfS0VZX0VOQ19JUFY0X0RTVF9NQVNLXSA9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW1RDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X1NSQ10JPSB7IC5sZW4gPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSB9LAorCVtUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNl9TUkNfTUFTS10gPSB7IC5sZW4gPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSB9LAorCVtUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNl9EU1RdCT0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikgfSwKKwlbVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjZfRFNUX01BU0tdID0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikgfSwKKwlbVENBX0ZMT1dFUl9LRVlfVENQX1NSQ19NQVNLXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCisJW1RDQV9GTE9XRVJfS0VZX1RDUF9EU1RfTUFTS10JPSB7IC50eXBlID0gTkxBX1UxNiB9LAorCVtUQ0FfRkxPV0VSX0tFWV9VRFBfU1JDX01BU0tdCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKKwlbVENBX0ZMT1dFUl9LRVlfVURQX0RTVF9NQVNLXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCiB9OwogCiBzdGF0aWMgdm9pZCBmbF9zZXRfa2V5X3ZhbChzdHJ1Y3QgbmxhdHRyICoqdGIsCkBAIC0zMDgsOSArMzU0LDI5IEBACiAJCW1lbWNweShtYXNrLCBubGFfZGF0YSh0YlttYXNrX3R5cGVdKSwgbGVuKTsKIH0KIAorc3RhdGljIHZvaWQgZmxfc2V0X2tleV92bGFuKHN0cnVjdCBubGF0dHIgKip0YiwKKwkJCSAgICBzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X3ZsYW4gKmtleV92YWwsCisJCQkgICAgc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV92bGFuICprZXlfbWFzaykKK3sKKyNkZWZpbmUgVkxBTl9QUklPUklUWV9NQVNLCTB4NworCisJaWYgKHRiW1RDQV9GTE9XRVJfS0VZX1ZMQU5fSURdKSB7CisJCWtleV92YWwtPnZsYW5faWQgPQorCQkJbmxhX2dldF91MTYodGJbVENBX0ZMT1dFUl9LRVlfVkxBTl9JRF0pICYgVkxBTl9WSURfTUFTSzsKKwkJa2V5X21hc2stPnZsYW5faWQgPSBWTEFOX1ZJRF9NQVNLOworCX0KKwlpZiAodGJbVENBX0ZMT1dFUl9LRVlfVkxBTl9QUklPXSkgeworCQlrZXlfdmFsLT52bGFuX3ByaW9yaXR5ID0KKwkJCW5sYV9nZXRfdTgodGJbVENBX0ZMT1dFUl9LRVlfVkxBTl9QUklPXSkgJgorCQkJVkxBTl9QUklPUklUWV9NQVNLOworCQlrZXlfbWFzay0+dmxhbl9wcmlvcml0eSA9IFZMQU5fUFJJT1JJVFlfTUFTSzsKKwl9Cit9CisKIHN0YXRpYyBpbnQgZmxfc2V0X2tleShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBubGF0dHIgKip0YiwKIAkJICAgICAgc3RydWN0IGZsX2Zsb3dfa2V5ICprZXksIHN0cnVjdCBmbF9mbG93X2tleSAqbWFzaykKIHsKKwlfX2JlMTYgZXRoZXJ0eXBlOwogI2lmZGVmIENPTkZJR19ORVRfQ0xTX0lORAogCWlmICh0YltUQ0FfRkxPV0VSX0lOREVWXSkgewogCQlpbnQgZXJyID0gdGNmX2NoYW5nZV9pbmRldihuZXQsIHRiW1RDQV9GTE9XRVJfSU5ERVZdKTsKQEAgLTMyOCw5ICszOTQsMjAgQEAKIAkJICAgICAgIG1hc2stPmV0aC5zcmMsIFRDQV9GTE9XRVJfS0VZX0VUSF9TUkNfTUFTSywKIAkJICAgICAgIHNpemVvZihrZXktPmV0aC5zcmMpKTsKIAotCWZsX3NldF9rZXlfdmFsKHRiLCAma2V5LT5iYXNpYy5uX3Byb3RvLCBUQ0FfRkxPV0VSX0tFWV9FVEhfVFlQRSwKLQkJICAgICAgICZtYXNrLT5iYXNpYy5uX3Byb3RvLCBUQ0FfRkxPV0VSX1VOU1BFQywKLQkJICAgICAgIHNpemVvZihrZXktPmJhc2ljLm5fcHJvdG8pKTsKKwlpZiAodGJbVENBX0ZMT1dFUl9LRVlfRVRIX1RZUEVdKSB7CisJCWV0aGVydHlwZSA9IG5sYV9nZXRfYmUxNih0YltUQ0FfRkxPV0VSX0tFWV9FVEhfVFlQRV0pOworCisJCWlmIChldGhlcnR5cGUgPT0gaHRvbnMoRVRIX1BfODAyMVEpKSB7CisJCQlmbF9zZXRfa2V5X3ZsYW4odGIsICZrZXktPnZsYW4sICZtYXNrLT52bGFuKTsKKwkJCWZsX3NldF9rZXlfdmFsKHRiLCAma2V5LT5iYXNpYy5uX3Byb3RvLAorCQkJCSAgICAgICBUQ0FfRkxPV0VSX0tFWV9WTEFOX0VUSF9UWVBFLAorCQkJCSAgICAgICAmbWFzay0+YmFzaWMubl9wcm90bywgVENBX0ZMT1dFUl9VTlNQRUMsCisJCQkJICAgICAgIHNpemVvZihrZXktPmJhc2ljLm5fcHJvdG8pKTsKKwkJfSBlbHNlIHsKKwkJCWtleS0+YmFzaWMubl9wcm90byA9IGV0aGVydHlwZTsKKwkJCW1hc2stPmJhc2ljLm5fcHJvdG8gPSBjcHVfdG9fYmUxNih+MCk7CisJCX0KKwl9CiAKIAlpZiAoa2V5LT5iYXNpYy5uX3Byb3RvID09IGh0b25zKEVUSF9QX0lQKSB8fAogCSAgICBrZXktPmJhc2ljLm5fcHJvdG8gPT0gaHRvbnMoRVRIX1BfSVBWNikpIHsKQEAgLTM1OSwyMCArNDM2LDU0IEBACiAKIAlpZiAoa2V5LT5iYXNpYy5pcF9wcm90byA9PSBJUFBST1RPX1RDUCkgewogCQlmbF9zZXRfa2V5X3ZhbCh0YiwgJmtleS0+dHAuc3JjLCBUQ0FfRkxPV0VSX0tFWV9UQ1BfU1JDLAotCQkJICAgICAgICZtYXNrLT50cC5zcmMsIFRDQV9GTE9XRVJfVU5TUEVDLAorCQkJICAgICAgICZtYXNrLT50cC5zcmMsIFRDQV9GTE9XRVJfS0VZX1RDUF9TUkNfTUFTSywKIAkJCSAgICAgICBzaXplb2Yoa2V5LT50cC5zcmMpKTsKIAkJZmxfc2V0X2tleV92YWwodGIsICZrZXktPnRwLmRzdCwgVENBX0ZMT1dFUl9LRVlfVENQX0RTVCwKLQkJCSAgICAgICAmbWFzay0+dHAuZHN0LCBUQ0FfRkxPV0VSX1VOU1BFQywKKwkJCSAgICAgICAmbWFzay0+dHAuZHN0LCBUQ0FfRkxPV0VSX0tFWV9UQ1BfRFNUX01BU0ssCiAJCQkgICAgICAgc2l6ZW9mKGtleS0+dHAuZHN0KSk7CiAJfSBlbHNlIGlmIChrZXktPmJhc2ljLmlwX3Byb3RvID09IElQUFJPVE9fVURQKSB7CiAJCWZsX3NldF9rZXlfdmFsKHRiLCAma2V5LT50cC5zcmMsIFRDQV9GTE9XRVJfS0VZX1VEUF9TUkMsCi0JCQkgICAgICAgJm1hc2stPnRwLnNyYywgVENBX0ZMT1dFUl9VTlNQRUMsCisJCQkgICAgICAgJm1hc2stPnRwLnNyYywgVENBX0ZMT1dFUl9LRVlfVURQX1NSQ19NQVNLLAogCQkJICAgICAgIHNpemVvZihrZXktPnRwLnNyYykpOwogCQlmbF9zZXRfa2V5X3ZhbCh0YiwgJmtleS0+dHAuZHN0LCBUQ0FfRkxPV0VSX0tFWV9VRFBfRFNULAotCQkJICAgICAgICZtYXNrLT50cC5kc3QsIFRDQV9GTE9XRVJfVU5TUEVDLAorCQkJICAgICAgICZtYXNrLT50cC5kc3QsIFRDQV9GTE9XRVJfS0VZX1VEUF9EU1RfTUFTSywKIAkJCSAgICAgICBzaXplb2Yoa2V5LT50cC5kc3QpKTsKIAl9CiAKKwlpZiAodGJbVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjRfU1JDXSB8fAorCSAgICB0YltUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNF9EU1RdKSB7CisJCWtleS0+ZW5jX2NvbnRyb2wuYWRkcl90eXBlID0gRkxPV19ESVNTRUNUT1JfS0VZX0lQVjRfQUREUlM7CisJCWZsX3NldF9rZXlfdmFsKHRiLCAma2V5LT5lbmNfaXB2NC5zcmMsCisJCQkgICAgICAgVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjRfU1JDLAorCQkJICAgICAgICZtYXNrLT5lbmNfaXB2NC5zcmMsCisJCQkgICAgICAgVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjRfU1JDX01BU0ssCisJCQkgICAgICAgc2l6ZW9mKGtleS0+ZW5jX2lwdjQuc3JjKSk7CisJCWZsX3NldF9rZXlfdmFsKHRiLCAma2V5LT5lbmNfaXB2NC5kc3QsCisJCQkgICAgICAgVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjRfRFNULAorCQkJICAgICAgICZtYXNrLT5lbmNfaXB2NC5kc3QsCisJCQkgICAgICAgVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjRfRFNUX01BU0ssCisJCQkgICAgICAgc2l6ZW9mKGtleS0+ZW5jX2lwdjQuZHN0KSk7CisJfQorCisJaWYgKHRiW1RDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X1NSQ10gfHwKKwkgICAgdGJbVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjZfRFNUXSkgeworCQlrZXktPmVuY19jb250cm9sLmFkZHJfdHlwZSA9IEZMT1dfRElTU0VDVE9SX0tFWV9JUFY2X0FERFJTOworCQlmbF9zZXRfa2V5X3ZhbCh0YiwgJmtleS0+ZW5jX2lwdjYuc3JjLAorCQkJICAgICAgIFRDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X1NSQywKKwkJCSAgICAgICAmbWFzay0+ZW5jX2lwdjYuc3JjLAorCQkJICAgICAgIFRDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X1NSQ19NQVNLLAorCQkJICAgICAgIHNpemVvZihrZXktPmVuY19pcHY2LnNyYykpOworCQlmbF9zZXRfa2V5X3ZhbCh0YiwgJmtleS0+ZW5jX2lwdjYuZHN0LAorCQkJICAgICAgIFRDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X0RTVCwKKwkJCSAgICAgICAmbWFzay0+ZW5jX2lwdjYuZHN0LAorCQkJICAgICAgIFRDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X0RTVF9NQVNLLAorCQkJICAgICAgIHNpemVvZihrZXktPmVuY19pcHY2LmRzdCkpOworCX0KKworCWZsX3NldF9rZXlfdmFsKHRiLCAma2V5LT5lbmNfa2V5X2lkLmtleWlkLCBUQ0FfRkxPV0VSX0tFWV9FTkNfS0VZX0lELAorCQkgICAgICAgJm1hc2stPmVuY19rZXlfaWQua2V5aWQsIFRDQV9GTE9XRVJfVU5TUEVDLAorCQkgICAgICAgc2l6ZW9mKGtleS0+ZW5jX2tleV9pZC5rZXlpZCkpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQwNCwxMiArNTE1LDEwIEBACiAKICNkZWZpbmUgRkxfS0VZX01FTUJFUl9PRkZTRVQobWVtYmVyKSBvZmZzZXRvZihzdHJ1Y3QgZmxfZmxvd19rZXksIG1lbWJlcikKICNkZWZpbmUgRkxfS0VZX01FTUJFUl9TSVpFKG1lbWJlcikgKHNpemVvZigoKHN0cnVjdCBmbF9mbG93X2tleSAqKSAwKS0+bWVtYmVyKSkKLSNkZWZpbmUgRkxfS0VZX01FTUJFUl9FTkRfT0ZGU0VUKG1lbWJlcikJCQkJCVwKLQkoRkxfS0VZX01FTUJFUl9PRkZTRVQobWVtYmVyKSArIEZMX0tFWV9NRU1CRVJfU0laRShtZW1iZXIpKQogCi0jZGVmaW5lIEZMX0tFWV9JTl9SQU5HRShtYXNrLCBtZW1iZXIpCQkJCQkJXAotICAgICAgICAoRkxfS0VZX01FTUJFUl9PRkZTRVQobWVtYmVyKSA8PSAobWFzayktPnJhbmdlLmVuZCAmJgkJCVwKLSAgICAgICAgIEZMX0tFWV9NRU1CRVJfRU5EX09GRlNFVChtZW1iZXIpID49IChtYXNrKS0+cmFuZ2Uuc3RhcnQpCisjZGVmaW5lIEZMX0tFWV9JU19NQVNLRUQobWFzaywgbWVtYmVyKQkJCQkJCVwKKwltZW1jaHJfaW52KCgoY2hhciAqKW1hc2spICsgRkxfS0VZX01FTUJFUl9PRkZTRVQobWVtYmVyKSwJCVwKKwkJICAgMCwgRkxfS0VZX01FTUJFUl9TSVpFKG1lbWJlcikpCQkJCVwKIAogI2RlZmluZSBGTF9LRVlfU0VUKGtleXMsIGNudCwgaWQsIG1lbWJlcikJCQkJCVwKIAlkbyB7CQkJCQkJCQkJXApAQCAtNDE4LDkgKzUyNyw5IEBACiAJCWNudCsrOwkJCQkJCQkJXAogCX0gd2hpbGUoMCk7CiAKLSNkZWZpbmUgRkxfS0VZX1NFVF9JRl9JTl9SQU5HRShtYXNrLCBrZXlzLCBjbnQsIGlkLCBtZW1iZXIpCQkJXAorI2RlZmluZSBGTF9LRVlfU0VUX0lGX01BU0tFRChtYXNrLCBrZXlzLCBjbnQsIGlkLCBtZW1iZXIpCQkJXAogCWRvIHsJCQkJCQkJCQlcCi0JCWlmIChGTF9LRVlfSU5fUkFOR0UobWFzaywgbWVtYmVyKSkJCQkJXAorCQlpZiAoRkxfS0VZX0lTX01BU0tFRChtYXNrLCBtZW1iZXIpKQkJCQlcCiAJCQlGTF9LRVlfU0VUKGtleXMsIGNudCwgaWQsIG1lbWJlcik7CQkJXAogCX0gd2hpbGUoMCk7CiAKQEAgLTQzMiwxNCArNTQxLDE2IEBACiAKIAlGTF9LRVlfU0VUKGtleXMsIGNudCwgRkxPV19ESVNTRUNUT1JfS0VZX0NPTlRST0wsIGNvbnRyb2wpOwogCUZMX0tFWV9TRVQoa2V5cywgY250LCBGTE9XX0RJU1NFQ1RPUl9LRVlfQkFTSUMsIGJhc2ljKTsKLQlGTF9LRVlfU0VUX0lGX0lOX1JBTkdFKG1hc2ssIGtleXMsIGNudCwKLQkJCSAgICAgICBGTE9XX0RJU1NFQ1RPUl9LRVlfRVRIX0FERFJTLCBldGgpOwotCUZMX0tFWV9TRVRfSUZfSU5fUkFOR0UobWFzaywga2V5cywgY250LAotCQkJICAgICAgIEZMT1dfRElTU0VDVE9SX0tFWV9JUFY0X0FERFJTLCBpcHY0KTsKLQlGTF9LRVlfU0VUX0lGX0lOX1JBTkdFKG1hc2ssIGtleXMsIGNudCwKLQkJCSAgICAgICBGTE9XX0RJU1NFQ1RPUl9LRVlfSVBWNl9BRERSUywgaXB2Nik7Ci0JRkxfS0VZX1NFVF9JRl9JTl9SQU5HRShtYXNrLCBrZXlzLCBjbnQsCi0JCQkgICAgICAgRkxPV19ESVNTRUNUT1JfS0VZX1BPUlRTLCB0cCk7CisJRkxfS0VZX1NFVF9JRl9NQVNLRUQoJm1hc2stPmtleSwga2V5cywgY250LAorCQkJICAgICBGTE9XX0RJU1NFQ1RPUl9LRVlfRVRIX0FERFJTLCBldGgpOworCUZMX0tFWV9TRVRfSUZfTUFTS0VEKCZtYXNrLT5rZXksIGtleXMsIGNudCwKKwkJCSAgICAgRkxPV19ESVNTRUNUT1JfS0VZX0lQVjRfQUREUlMsIGlwdjQpOworCUZMX0tFWV9TRVRfSUZfTUFTS0VEKCZtYXNrLT5rZXksIGtleXMsIGNudCwKKwkJCSAgICAgRkxPV19ESVNTRUNUT1JfS0VZX0lQVjZfQUREUlMsIGlwdjYpOworCUZMX0tFWV9TRVRfSUZfTUFTS0VEKCZtYXNrLT5rZXksIGtleXMsIGNudCwKKwkJCSAgICAgRkxPV19ESVNTRUNUT1JfS0VZX1BPUlRTLCB0cCk7CisJRkxfS0VZX1NFVF9JRl9NQVNLRUQoJm1hc2stPmtleSwga2V5cywgY250LAorCQkJICAgICBGTE9XX0RJU1NFQ1RPUl9LRVlfVkxBTiwgdmxhbik7CiAKIAlza2JfZmxvd19kaXNzZWN0b3JfaW5pdCgmaGVhZC0+ZGlzc2VjdG9yLCBrZXlzLCBjbnQpOwogfQpAQCAtNDc4LDEwICs1ODksMTIgQEAKIAlzdHJ1Y3QgdGNmX2V4dHMgZTsKIAlpbnQgZXJyOwogCi0JdGNmX2V4dHNfaW5pdCgmZSwgVENBX0ZMT1dFUl9BQ1QsIDApOwotCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCBlc3QsICZlLCBvdnIpOworCWVyciA9IHRjZl9leHRzX2luaXQoJmUsIFRDQV9GTE9XRVJfQUNULCAwKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKKwllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgZXN0LCAmZSwgb3ZyKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvdXQ7CiAKIAlpZiAodGJbVENBX0ZMT1dFUl9DTEFTU0lEXSkgewogCQlmLT5yZXMuY2xhc3NpZCA9IG5sYV9nZXRfdTMyKHRiW1RDQV9GTE9XRVJfQ0xBU1NJRF0pOwpAQCAtNTUwLDcgKzY2Myw5IEBACiAJaWYgKCFmbmV3KQogCQlyZXR1cm4gLUVOT0JVRlM7CiAKLQl0Y2ZfZXh0c19pbml0KCZmbmV3LT5leHRzLCBUQ0FfRkxPV0VSX0FDVCwgMCk7CisJZXJyID0gdGNmX2V4dHNfaW5pdCgmZm5ldy0+ZXh0cywgVENBX0ZMT1dFUl9BQ1QsIDApOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm91dDsKIAogCWlmICghaGFuZGxlKSB7CiAJCWhhbmRsZSA9IGZsX2dyYWJfbmV3X2hhbmRsZSh0cCwgaGVhZCk7CkBAIC02MTQsNiArNzI5LDcgQEAKIAlyZXR1cm4gMDsKIAogZXJyb3V0OgorCXRjZl9leHRzX2Rlc3Ryb3koJmZuZXctPmV4dHMpOwogCWtmcmVlKGZuZXcpOwogCXJldHVybiBlcnI7CiB9CkBAIC02NjgsNiArNzg0LDI5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZmxfZHVtcF9rZXlfdmxhbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgIHN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfdmxhbiAqdmxhbl9rZXksCisJCQkgICAgc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV92bGFuICp2bGFuX21hc2spCit7CisJaW50IGVycjsKKworCWlmICghbWVtY2hyX2ludih2bGFuX21hc2ssIDAsIHNpemVvZigqdmxhbl9tYXNrKSkpCisJCXJldHVybiAwOworCWlmICh2bGFuX21hc2stPnZsYW5faWQpIHsKKwkJZXJyID0gbmxhX3B1dF91MTYoc2tiLCBUQ0FfRkxPV0VSX0tFWV9WTEFOX0lELAorCQkJCSAgdmxhbl9rZXktPnZsYW5faWQpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisJaWYgKHZsYW5fbWFzay0+dmxhbl9wcmlvcml0eSkgeworCQllcnIgPSBubGFfcHV0X3U4KHNrYiwgVENBX0ZMT1dFUl9LRVlfVkxBTl9QUklPLAorCQkJCSB2bGFuX2tleS0+dmxhbl9wcmlvcml0eSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBmbF9kdW1wKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgZmgsCiAJCSAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y21zZyAqdCkKIHsKQEAgLTcxMiw2ICs4NTEsMTAgQEAKIAkJCSAgICAmbWFzay0+YmFzaWMubl9wcm90bywgVENBX0ZMT1dFUl9VTlNQRUMsCiAJCQkgICAgc2l6ZW9mKGtleS0+YmFzaWMubl9wcm90bykpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWlmIChmbF9kdW1wX2tleV92bGFuKHNrYiwgJmtleS0+dmxhbiwgJm1hc2stPnZsYW4pKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwogCWlmICgoa2V5LT5iYXNpYy5uX3Byb3RvID09IGh0b25zKEVUSF9QX0lQKSB8fAogCSAgICAga2V5LT5iYXNpYy5uX3Byb3RvID09IGh0b25zKEVUSF9QX0lQVjYpKSAmJgogCSAgICBmbF9kdW1wX2tleV92YWwoc2tiLCAma2V5LT5iYXNpYy5pcF9wcm90bywgVENBX0ZMT1dFUl9LRVlfSVBfUFJPVE8sCkBAIC03MzgsMjEgKzg4MSw0OCBAQAogCiAJaWYgKGtleS0+YmFzaWMuaXBfcHJvdG8gPT0gSVBQUk9UT19UQ1AgJiYKIAkgICAgKGZsX2R1bXBfa2V5X3ZhbChza2IsICZrZXktPnRwLnNyYywgVENBX0ZMT1dFUl9LRVlfVENQX1NSQywKLQkJCSAgICAgJm1hc2stPnRwLnNyYywgVENBX0ZMT1dFUl9VTlNQRUMsCisJCQkgICAgICZtYXNrLT50cC5zcmMsIFRDQV9GTE9XRVJfS0VZX1RDUF9TUkNfTUFTSywKIAkJCSAgICAgc2l6ZW9mKGtleS0+dHAuc3JjKSkgfHwKIAkgICAgIGZsX2R1bXBfa2V5X3ZhbChza2IsICZrZXktPnRwLmRzdCwgVENBX0ZMT1dFUl9LRVlfVENQX0RTVCwKLQkJCSAgICAgJm1hc2stPnRwLmRzdCwgVENBX0ZMT1dFUl9VTlNQRUMsCisJCQkgICAgICZtYXNrLT50cC5kc3QsIFRDQV9GTE9XRVJfS0VZX1RDUF9EU1RfTUFTSywKIAkJCSAgICAgc2l6ZW9mKGtleS0+dHAuZHN0KSkpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAllbHNlIGlmIChrZXktPmJhc2ljLmlwX3Byb3RvID09IElQUFJPVE9fVURQICYmCiAJCSAoZmxfZHVtcF9rZXlfdmFsKHNrYiwgJmtleS0+dHAuc3JjLCBUQ0FfRkxPV0VSX0tFWV9VRFBfU1JDLAotCQkJCSAgJm1hc2stPnRwLnNyYywgVENBX0ZMT1dFUl9VTlNQRUMsCisJCQkJICAmbWFzay0+dHAuc3JjLCBUQ0FfRkxPV0VSX0tFWV9VRFBfU1JDX01BU0ssCiAJCQkJICBzaXplb2Yoa2V5LT50cC5zcmMpKSB8fAogCQkgIGZsX2R1bXBfa2V5X3ZhbChza2IsICZrZXktPnRwLmRzdCwgVENBX0ZMT1dFUl9LRVlfVURQX0RTVCwKLQkJCQkgICZtYXNrLT50cC5kc3QsIFRDQV9GTE9XRVJfVU5TUEVDLAorCQkJCSAgJm1hc2stPnRwLmRzdCwgVENBX0ZMT1dFUl9LRVlfVURQX0RTVF9NQVNLLAogCQkJCSAgc2l6ZW9mKGtleS0+dHAuZHN0KSkpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAorCWlmIChrZXktPmVuY19jb250cm9sLmFkZHJfdHlwZSA9PSBGTE9XX0RJU1NFQ1RPUl9LRVlfSVBWNF9BRERSUyAmJgorCSAgICAoZmxfZHVtcF9rZXlfdmFsKHNrYiwgJmtleS0+ZW5jX2lwdjQuc3JjLAorCQkJICAgIFRDQV9GTE9XRVJfS0VZX0VOQ19JUFY0X1NSQywgJm1hc2stPmVuY19pcHY0LnNyYywKKwkJCSAgICBUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNF9TUkNfTUFTSywKKwkJCSAgICBzaXplb2Yoa2V5LT5lbmNfaXB2NC5zcmMpKSB8fAorCSAgICAgZmxfZHVtcF9rZXlfdmFsKHNrYiwgJmtleS0+ZW5jX2lwdjQuZHN0LAorCQkJICAgICBUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNF9EU1QsICZtYXNrLT5lbmNfaXB2NC5kc3QsCisJCQkgICAgIFRDQV9GTE9XRVJfS0VZX0VOQ19JUFY0X0RTVF9NQVNLLAorCQkJICAgICBzaXplb2Yoa2V5LT5lbmNfaXB2NC5kc3QpKSkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCWVsc2UgaWYgKGtleS0+ZW5jX2NvbnRyb2wuYWRkcl90eXBlID09IEZMT1dfRElTU0VDVE9SX0tFWV9JUFY2X0FERFJTICYmCisJCSAoZmxfZHVtcF9rZXlfdmFsKHNrYiwgJmtleS0+ZW5jX2lwdjYuc3JjLAorCQkJICAgIFRDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X1NSQywgJm1hc2stPmVuY19pcHY2LnNyYywKKwkJCSAgICBUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNl9TUkNfTUFTSywKKwkJCSAgICBzaXplb2Yoa2V5LT5lbmNfaXB2Ni5zcmMpKSB8fAorCQkgZmxfZHVtcF9rZXlfdmFsKHNrYiwgJmtleS0+ZW5jX2lwdjYuZHN0LAorCQkJCSBUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNl9EU1QsCisJCQkJICZtYXNrLT5lbmNfaXB2Ni5kc3QsCisJCQkJIFRDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X0RTVF9NQVNLLAorCQkJICAgIHNpemVvZihrZXktPmVuY19pcHY2LmRzdCkpKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlpZiAoZmxfZHVtcF9rZXlfdmFsKHNrYiwgJmtleS0+ZW5jX2tleV9pZCwgVENBX0ZMT1dFUl9LRVlfRU5DX0tFWV9JRCwKKwkJCSAgICAmbWFzay0+ZW5jX2tleV9pZCwgVENBX0ZMT1dFUl9VTlNQRUMsCisJCQkgICAgc2l6ZW9mKGtleS0+ZW5jX2tleV9pZCkpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwogCW5sYV9wdXRfdTMyKHNrYiwgVENBX0ZMT1dFUl9GTEFHUywgZi0+ZmxhZ3MpOwogCiAJaWYgKHRjZl9leHRzX2R1bXAoc2tiLCAmZi0+ZXh0cykpCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX2Z3LmMgYi9uZXQvc2NoZWQvY2xzX2Z3LmMKaW5kZXggZjIzYTNiNi4uOWRjNjNkNSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19mdy5jCisrKyBiL25ldC9zY2hlZC9jbHNfZncuYwpAQCAtNTcsNyArNTcsNyBAQAogfQogCiBzdGF0aWMgaW50IGZ3X2NsYXNzaWZ5KHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLAotCQkJICBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQorCQkgICAgICAgc3RydWN0IHRjZl9yZXN1bHQgKnJlcykKIHsKIAlzdHJ1Y3QgZndfaGVhZCAqaGVhZCA9IHJjdV9kZXJlZmVyZW5jZV9iaCh0cC0+cm9vdCk7CiAJc3RydWN0IGZ3X2ZpbHRlciAqZjsKQEAgLTE4OCwxNyArMTg4LDIwIEBACiAKIHN0YXRpYyBpbnQKIGZ3X2NoYW5nZV9hdHRycyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCBzdHJ1Y3QgZndfZmlsdGVyICpmLAotCXN0cnVjdCBubGF0dHIgKip0Yiwgc3RydWN0IG5sYXR0ciAqKnRjYSwgdW5zaWduZWQgbG9uZyBiYXNlLCBib29sIG92cikKKwkJc3RydWN0IG5sYXR0ciAqKnRiLCBzdHJ1Y3QgbmxhdHRyICoqdGNhLCB1bnNpZ25lZCBsb25nIGJhc2UsCisJCWJvb2wgb3ZyKQogewogCXN0cnVjdCBmd19oZWFkICpoZWFkID0gcnRubF9kZXJlZmVyZW5jZSh0cC0+cm9vdCk7CiAJc3RydWN0IHRjZl9leHRzIGU7CiAJdTMyIG1hc2s7CiAJaW50IGVycjsKIAotCXRjZl9leHRzX2luaXQoJmUsIFRDQV9GV19BQ1QsIFRDQV9GV19QT0xJQ0UpOwotCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCB0Y2FbVENBX1JBVEVdLCAmZSwgb3ZyKTsKKwllcnIgPSB0Y2ZfZXh0c19pbml0KCZlLCBUQ0FfRldfQUNULCBUQ0FfRldfUE9MSUNFKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKKwllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgdGNhW1RDQV9SQVRFXSwgJmUsIG92cik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3V0OwogCiAJaWYgKHRiW1RDQV9GV19DTEFTU0lEXSkgewogCQlmLT5yZXMuY2xhc3NpZCA9IG5sYV9nZXRfdTMyKHRiW1RDQV9GV19DTEFTU0lEXSk7CkBAIC0yMzUsOSArMjM4LDggQEAKIAogc3RhdGljIGludCBmd19jaGFuZ2Uoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLAogCQkgICAgIHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCB1bnNpZ25lZCBsb25nIGJhc2UsCi0JCSAgICAgdTMyIGhhbmRsZSwKLQkJICAgICBzdHJ1Y3QgbmxhdHRyICoqdGNhLAotCQkgICAgIHVuc2lnbmVkIGxvbmcgKmFyZywgYm9vbCBvdnIpCisJCSAgICAgdTMyIGhhbmRsZSwgc3RydWN0IG5sYXR0ciAqKnRjYSwgdW5zaWduZWQgbG9uZyAqYXJnLAorCQkgICAgIGJvb2wgb3ZyKQogewogCXN0cnVjdCBmd19oZWFkICpoZWFkID0gcnRubF9kZXJlZmVyZW5jZSh0cC0+cm9vdCk7CiAJc3RydWN0IGZ3X2ZpbHRlciAqZiA9IChzdHJ1Y3QgZndfZmlsdGVyICopICphcmc7CkBAIC0yNzAsMTAgKzI3MiwxNSBAQAogI2VuZGlmIC8qIENPTkZJR19ORVRfQ0xTX0lORCAqLwogCQlmbmV3LT50cCA9IGYtPnRwOwogCi0JCXRjZl9leHRzX2luaXQoJmZuZXctPmV4dHMsIFRDQV9GV19BQ1QsIFRDQV9GV19QT0xJQ0UpOworCQllcnIgPSB0Y2ZfZXh0c19pbml0KCZmbmV3LT5leHRzLCBUQ0FfRldfQUNULCBUQ0FfRldfUE9MSUNFKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWtmcmVlKGZuZXcpOworCQkJcmV0dXJuIGVycjsKKwkJfQogCiAJCWVyciA9IGZ3X2NoYW5nZV9hdHRycyhuZXQsIHRwLCBmbmV3LCB0YiwgdGNhLCBiYXNlLCBvdnIpOwogCQlpZiAoZXJyIDwgMCkgeworCQkJdGNmX2V4dHNfZGVzdHJveSgmZm5ldy0+ZXh0cyk7CiAJCQlrZnJlZShmbmV3KTsKIAkJCXJldHVybiBlcnI7CiAJCX0KQEAgLTMxMyw3ICszMjAsOSBAQAogCWlmIChmID09IE5VTEwpCiAJCXJldHVybiAtRU5PQlVGUzsKIAotCXRjZl9leHRzX2luaXQoJmYtPmV4dHMsIFRDQV9GV19BQ1QsIFRDQV9GV19QT0xJQ0UpOworCWVyciA9IHRjZl9leHRzX2luaXQoJmYtPmV4dHMsIFRDQV9GV19BQ1QsIFRDQV9GV19QT0xJQ0UpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm91dDsKIAlmLT5pZCA9IGhhbmRsZTsKIAlmLT50cCA9IHRwOwogCkBAIC0zMjgsNiArMzM3LDcgQEAKIAlyZXR1cm4gMDsKIAogZXJyb3V0OgorCXRjZl9leHRzX2Rlc3Ryb3koJmYtPmV4dHMpOwogCWtmcmVlKGYpOwogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX3JvdXRlLmMgYi9uZXQvc2NoZWQvY2xzX3JvdXRlLmMKaW5kZXggMDhhM2IwYS4uNDU1ZmM4ZiAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19yb3V0ZS5jCisrKyBiL25ldC9zY2hlZC9jbHNfcm91dGUuYwpAQCAtMjY4LDggKzI2OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkCi1yb3V0ZTRfZGVsZXRlX2ZpbHRlcihzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCitzdGF0aWMgdm9pZCByb3V0ZTRfZGVsZXRlX2ZpbHRlcihzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCiB7CiAJc3RydWN0IHJvdXRlNF9maWx0ZXIgKmYgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IHJvdXRlNF9maWx0ZXIsIHJjdSk7CiAKQEAgLTM4MywxNyArMzgyLDE5IEBACiAJCQkgICAgc3RydWN0IG5sYXR0ciAqKnRiLCBzdHJ1Y3QgbmxhdHRyICplc3QsIGludCBuZXcsCiAJCQkgICAgYm9vbCBvdnIpCiB7Ci0JaW50IGVycjsKIAl1MzIgaWQgPSAwLCB0byA9IDAsIG5oYW5kbGUgPSAweDgwMDA7CiAJc3RydWN0IHJvdXRlNF9maWx0ZXIgKmZwOwogCXVuc2lnbmVkIGludCBoMTsKIAlzdHJ1Y3Qgcm91dGU0X2J1Y2tldCAqYjsKIAlzdHJ1Y3QgdGNmX2V4dHMgZTsKKwlpbnQgZXJyOwogCi0JdGNmX2V4dHNfaW5pdCgmZSwgVENBX1JPVVRFNF9BQ1QsIFRDQV9ST1VURTRfUE9MSUNFKTsKLQllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgZXN0LCAmZSwgb3ZyKTsKKwllcnIgPSB0Y2ZfZXh0c19pbml0KCZlLCBUQ0FfUk9VVEU0X0FDVCwgVENBX1JPVVRFNF9QT0xJQ0UpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOworCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCBlc3QsICZlLCBvdnIpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm91dDsKIAogCWVyciA9IC1FSU5WQUw7CiAJaWYgKHRiW1RDQV9ST1VURTRfVE9dKSB7CkBAIC00NzIsMTAgKzQ3Myw4IEBACiB9CiAKIHN0YXRpYyBpbnQgcm91dGU0X2NoYW5nZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICppbl9za2IsCi0JCSAgICAgICBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdW5zaWduZWQgbG9uZyBiYXNlLAotCQkgICAgICAgdTMyIGhhbmRsZSwKLQkJICAgICAgIHN0cnVjdCBubGF0dHIgKip0Y2EsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nICphcmcsIGJvb2wgb3ZyKQorCQkJIHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCB1bnNpZ25lZCBsb25nIGJhc2UsIHUzMiBoYW5kbGUsCisJCQkgc3RydWN0IG5sYXR0ciAqKnRjYSwgdW5zaWduZWQgbG9uZyAqYXJnLCBib29sIG92cikKIHsKIAlzdHJ1Y3Qgcm91dGU0X2hlYWQgKmhlYWQgPSBydG5sX2RlcmVmZXJlbmNlKHRwLT5yb290KTsKIAlzdHJ1Y3Qgcm91dGU0X2ZpbHRlciBfX3JjdSAqKmZwOwpAQCAtNTAzLDcgKzUwMiwxMCBAQAogCWlmICghZikKIAkJZ290byBlcnJvdXQ7CiAKLQl0Y2ZfZXh0c19pbml0KCZmLT5leHRzLCBUQ0FfUk9VVEU0X0FDVCwgVENBX1JPVVRFNF9QT0xJQ0UpOworCWVyciA9IHRjZl9leHRzX2luaXQoJmYtPmV4dHMsIFRDQV9ST1VURTRfQUNULCBUQ0FfUk9VVEU0X1BPTElDRSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3V0OworCiAJaWYgKGZvbGQpIHsKIAkJZi0+aWQgPSBmb2xkLT5pZDsKIAkJZi0+aWlmID0gZm9sZC0+aWlmOwpAQCAtNTU3LDYgKzU1OSw4IEBACiAJcmV0dXJuIDA7CiAKIGVycm91dDoKKwlpZiAoZikKKwkJdGNmX2V4dHNfZGVzdHJveSgmZi0+ZXh0cyk7CiAJa2ZyZWUoZik7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfcnN2cC5oIGIvbmV0L3NjaGVkL2Nsc19yc3ZwLmgKaW5kZXggZjljOWZjMC4uNGYwNWExOSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19yc3ZwLmgKKysrIGIvbmV0L3NjaGVkL2Nsc19yc3ZwLmgKQEAgLTQ4NywxMCArNDg3LDEyIEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQl0Y2ZfZXh0c19pbml0KCZlLCBUQ0FfUlNWUF9BQ1QsIFRDQV9SU1ZQX1BPTElDRSk7Ci0JZXJyID0gdGNmX2V4dHNfdmFsaWRhdGUobmV0LCB0cCwgdGIsIHRjYVtUQ0FfUkFURV0sICZlLCBvdnIpOworCWVyciA9IHRjZl9leHRzX2luaXQoJmUsIFRDQV9SU1ZQX0FDVCwgVENBX1JTVlBfUE9MSUNFKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKKwllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgdGNhW1RDQV9SQVRFXSwgJmUsIG92cik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3V0MjsKIAogCWYgPSAoc3RydWN0IHJzdnBfZmlsdGVyICopKmFyZzsKIAlpZiAoZikgewpAQCAtNTA2LDcgKzUwOCwxMSBAQAogCQkJZ290byBlcnJvdXQyOwogCQl9CiAKLQkJdGNmX2V4dHNfaW5pdCgmbi0+ZXh0cywgVENBX1JTVlBfQUNULCBUQ0FfUlNWUF9QT0xJQ0UpOworCQllcnIgPSB0Y2ZfZXh0c19pbml0KCZuLT5leHRzLCBUQ0FfUlNWUF9BQ1QsIFRDQV9SU1ZQX1BPTElDRSk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlrZnJlZShuKTsKKwkJCWdvdG8gZXJyb3V0MjsKKwkJfQogCiAJCWlmICh0YltUQ0FfUlNWUF9DTEFTU0lEXSkgewogCQkJbi0+cmVzLmNsYXNzaWQgPSBubGFfZ2V0X3UzMih0YltUQ0FfUlNWUF9DTEFTU0lEXSk7CkBAIC01MzAsNyArNTM2LDkgQEAKIAlpZiAoZiA9PSBOVUxMKQogCQlnb3RvIGVycm91dDI7CiAKLQl0Y2ZfZXh0c19pbml0KCZmLT5leHRzLCBUQ0FfUlNWUF9BQ1QsIFRDQV9SU1ZQX1BPTElDRSk7CisJZXJyID0gdGNmX2V4dHNfaW5pdCgmZi0+ZXh0cywgVENBX1JTVlBfQUNULCBUQ0FfUlNWUF9QT0xJQ0UpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm91dDsKIAloMiA9IDE2OwogCWlmICh0YltUQ0FfUlNWUF9TUkNdKSB7CiAJCW1lbWNweShmLT5zcmMsIG5sYV9kYXRhKHRiW1RDQV9SU1ZQX1NSQ10pLCBzaXplb2YoZi0+c3JjKSk7CkBAIC02MjcsNiArNjM1LDcgQEAKIAlnb3RvIGluc2VydDsKIAogZXJyb3V0OgorCXRjZl9leHRzX2Rlc3Ryb3koJmYtPmV4dHMpOwogCWtmcmVlKGYpOwogZXJyb3V0MjoKIAl0Y2ZfZXh0c19kZXN0cm95KCZlKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfdGNpbmRleC5jIGIvbmV0L3NjaGVkL2Nsc190Y2luZGV4LmMKaW5kZXggOTQ0YzhmZi4uOTYxNDRiZCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc190Y2luZGV4LmMKKysrIGIvbmV0L3NjaGVkL2Nsc190Y2luZGV4LmMKQEAgLTUwLDE0ICs1MCwxMyBAQAogCXN0cnVjdCByY3VfaGVhZCByY3U7CiB9OwogCi1zdGF0aWMgaW5saW5lIGludAotdGNpbmRleF9maWx0ZXJfaXNfc2V0KHN0cnVjdCB0Y2luZGV4X2ZpbHRlcl9yZXN1bHQgKnIpCitzdGF0aWMgaW5saW5lIGludCB0Y2luZGV4X2ZpbHRlcl9pc19zZXQoc3RydWN0IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdCAqcikKIHsKIAlyZXR1cm4gdGNmX2V4dHNfaXNfcHJlZGljYXRpdmUoJnItPmV4dHMpIHx8IHItPnJlcy5jbGFzc2lkOwogfQogCi1zdGF0aWMgc3RydWN0IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdCAqCi10Y2luZGV4X2xvb2t1cChzdHJ1Y3QgdGNpbmRleF9kYXRhICpwLCB1MTYga2V5KQorc3RhdGljIHN0cnVjdCB0Y2luZGV4X2ZpbHRlcl9yZXN1bHQgKnRjaW5kZXhfbG9va3VwKHN0cnVjdCB0Y2luZGV4X2RhdGEgKnAsCisJCQkJCQkgICAgdTE2IGtleSkKIHsKIAlpZiAocC0+cGVyZmVjdCkgewogCQlzdHJ1Y3QgdGNpbmRleF9maWx0ZXJfcmVzdWx0ICpmID0gcC0+cGVyZmVjdCArIGtleTsKQEAgLTE0NCw3ICsxNDMsOCBAQAogCiBzdGF0aWMgdm9pZCB0Y2luZGV4X2Rlc3Ryb3lfZmV4dHMoc3RydWN0IHJjdV9oZWFkICpoZWFkKQogewotCXN0cnVjdCB0Y2luZGV4X2ZpbHRlciAqZiA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgdGNpbmRleF9maWx0ZXIsIHJjdSk7CisJc3RydWN0IHRjaW5kZXhfZmlsdGVyICpmID0gY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCB0Y2luZGV4X2ZpbHRlciwKKwkJCQkJCXJjdSk7CiAKIAl0Y2ZfZXh0c19kZXN0cm95KCZmLT5yZXN1bHQuZXh0cyk7CiAJa2ZyZWUoZik7CkBAIC0yMTksMTAgKzIxOSwxMCBAQAogCVtUQ0FfVENJTkRFWF9DTEFTU0lEXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAogfTsKIAotc3RhdGljIHZvaWQgdGNpbmRleF9maWx0ZXJfcmVzdWx0X2luaXQoc3RydWN0IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdCAqcikKK3N0YXRpYyBpbnQgdGNpbmRleF9maWx0ZXJfcmVzdWx0X2luaXQoc3RydWN0IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdCAqcikKIHsKIAltZW1zZXQociwgMCwgc2l6ZW9mKCpyKSk7Ci0JdGNmX2V4dHNfaW5pdCgmci0+ZXh0cywgVENBX1RDSU5ERVhfQUNULCBUQ0FfVENJTkRFWF9QT0xJQ0UpOworCXJldHVybiB0Y2ZfZXh0c19pbml0KCZyLT5leHRzLCBUQ0FfVENJTkRFWF9BQ1QsIFRDQV9UQ0lOREVYX1BPTElDRSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fdGNpbmRleF9wYXJ0aWFsX2Rlc3Ryb3koc3RydWN0IHJjdV9oZWFkICpoZWFkKQpAQCAtMjMzLDIzICsyMzMsNTcgQEAKIAlrZnJlZShwKTsKIH0KIAorc3RhdGljIHZvaWQgdGNpbmRleF9mcmVlX3BlcmZlY3RfaGFzaChzdHJ1Y3QgdGNpbmRleF9kYXRhICpjcCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjcC0+aGFzaDsgaSsrKQorCQl0Y2ZfZXh0c19kZXN0cm95KCZjcC0+cGVyZmVjdFtpXS5leHRzKTsKKwlrZnJlZShjcC0+cGVyZmVjdCk7Cit9CisKK3N0YXRpYyBpbnQgdGNpbmRleF9hbGxvY19wZXJmZWN0X2hhc2goc3RydWN0IHRjaW5kZXhfZGF0YSAqY3ApCit7CisJaW50IGksIGVyciA9IDA7CisKKwljcC0+cGVyZmVjdCA9IGtjYWxsb2MoY3AtPmhhc2gsIHNpemVvZihzdHJ1Y3QgdGNpbmRleF9maWx0ZXJfcmVzdWx0KSwKKwkJCSAgICAgIEdGUF9LRVJORUwpOworCWlmICghY3AtPnBlcmZlY3QpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IGNwLT5oYXNoOyBpKyspIHsKKwkJZXJyID0gdGNmX2V4dHNfaW5pdCgmY3AtPnBlcmZlY3RbaV0uZXh0cywKKwkJCQkgICAgVENBX1RDSU5ERVhfQUNULCBUQ0FfVENJTkRFWF9QT0xJQ0UpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXJyb3V0OworCX0KKworCXJldHVybiAwOworCitlcnJvdXQ6CisJdGNpbmRleF9mcmVlX3BlcmZlY3RfaGFzaChjcCk7CisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIGludAogdGNpbmRleF9zZXRfcGFybXMoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdW5zaWduZWQgbG9uZyBiYXNlLAogCQkgIHUzMiBoYW5kbGUsIHN0cnVjdCB0Y2luZGV4X2RhdGEgKnAsCiAJCSAgc3RydWN0IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdCAqciwgc3RydWN0IG5sYXR0ciAqKnRiLAogCQkgIHN0cnVjdCBubGF0dHIgKmVzdCwgYm9vbCBvdnIpCiB7Ci0JaW50IGVyciwgYmFsbG9jID0gMDsKIAlzdHJ1Y3QgdGNpbmRleF9maWx0ZXJfcmVzdWx0IG5ld19maWx0ZXJfcmVzdWx0LCAqb2xkX3IgPSByOwogCXN0cnVjdCB0Y2luZGV4X2ZpbHRlcl9yZXN1bHQgY3I7Ci0Jc3RydWN0IHRjaW5kZXhfZGF0YSAqY3AsICpvbGRwOworCXN0cnVjdCB0Y2luZGV4X2RhdGEgKmNwID0gTlVMTCwgKm9sZHA7CiAJc3RydWN0IHRjaW5kZXhfZmlsdGVyICpmID0gTlVMTDsgLyogbWFrZSBnY2MgYmVoYXZlICovCisJaW50IGVyciwgYmFsbG9jID0gMDsKIAlzdHJ1Y3QgdGNmX2V4dHMgZTsKIAotCXRjZl9leHRzX2luaXQoJmUsIFRDQV9UQ0lOREVYX0FDVCwgVENBX1RDSU5ERVhfUE9MSUNFKTsKLQllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgZXN0LCAmZSwgb3ZyKTsKKwllcnIgPSB0Y2ZfZXh0c19pbml0KCZlLCBUQ0FfVENJTkRFWF9BQ1QsIFRDQV9UQ0lOREVYX1BPTElDRSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CisJZXJyID0gdGNmX2V4dHNfdmFsaWRhdGUobmV0LCB0cCwgdGIsIGVzdCwgJmUsIG92cik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3V0OwogCiAJZXJyID0gLUVOT01FTTsKIAkvKiB0Y2luZGV4X2RhdGEgYXR0cmlidXRlcyBtdXN0IGxvb2sgYXRvbWljIHRvIGNsYXNzaWZpZXIvbG9va3VwIHNvCkBAIC0yNzAsMTkgKzMwNCwyMCBAQAogCWlmIChwLT5wZXJmZWN0KSB7CiAJCWludCBpOwogCi0JCWNwLT5wZXJmZWN0ID0ga21lbWR1cChwLT5wZXJmZWN0LAotCQkJCSAgICAgIHNpemVvZigqcikgKiBjcC0+aGFzaCwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghY3AtPnBlcmZlY3QpCisJCWlmICh0Y2luZGV4X2FsbG9jX3BlcmZlY3RfaGFzaChjcCkgPCAwKQogCQkJZ290byBlcnJvdXQ7CiAJCWZvciAoaSA9IDA7IGkgPCBjcC0+aGFzaDsgaSsrKQotCQkJdGNmX2V4dHNfaW5pdCgmY3AtPnBlcmZlY3RbaV0uZXh0cywKLQkJCQkgICAgICBUQ0FfVENJTkRFWF9BQ1QsIFRDQV9UQ0lOREVYX1BPTElDRSk7CisJCQljcC0+cGVyZmVjdFtpXS5yZXMgPSBwLT5wZXJmZWN0W2ldLnJlczsKIAkJYmFsbG9jID0gMTsKIAl9CiAJY3AtPmggPSBwLT5oOwogCi0JdGNpbmRleF9maWx0ZXJfcmVzdWx0X2luaXQoJm5ld19maWx0ZXJfcmVzdWx0KTsKLQl0Y2luZGV4X2ZpbHRlcl9yZXN1bHRfaW5pdCgmY3IpOworCWVyciA9IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdF9pbml0KCZuZXdfZmlsdGVyX3Jlc3VsdCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3V0MTsKKwllcnIgPSB0Y2luZGV4X2ZpbHRlcl9yZXN1bHRfaW5pdCgmY3IpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm91dDE7CiAJaWYgKG9sZF9yKQogCQljci5yZXMgPSByLT5yZXM7CiAKQEAgLTMzOCwxNSArMzczLDggQEAKIAllcnIgPSAtRU5PTUVNOwogCWlmICghY3AtPnBlcmZlY3QgJiYgIWNwLT5oKSB7CiAJCWlmICh2YWxpZF9wZXJmZWN0X2hhc2goY3ApKSB7Ci0JCQlpbnQgaTsKLQotCQkJY3AtPnBlcmZlY3QgPSBrY2FsbG9jKGNwLT5oYXNoLCBzaXplb2YoKnIpLCBHRlBfS0VSTkVMKTsKLQkJCWlmICghY3AtPnBlcmZlY3QpCisJCQlpZiAodGNpbmRleF9hbGxvY19wZXJmZWN0X2hhc2goY3ApIDwgMCkKIAkJCQlnb3RvIGVycm91dF9hbGxvYzsKLQkJCWZvciAoaSA9IDA7IGkgPCBjcC0+aGFzaDsgaSsrKQotCQkJCXRjZl9leHRzX2luaXQoJmNwLT5wZXJmZWN0W2ldLmV4dHMsCi0JCQkJCSAgICAgIFRDQV9UQ0lOREVYX0FDVCwKLQkJCQkJICAgICAgVENBX1RDSU5ERVhfUE9MSUNFKTsKIAkJCWJhbGxvYyA9IDE7CiAJCX0gZWxzZSB7CiAJCQlzdHJ1Y3QgdGNpbmRleF9maWx0ZXIgX19yY3UgKipoYXNoOwpAQCAtMzczLDggKzQwMSwxMiBAQAogCQlpZiAoIWYpCiAJCQlnb3RvIGVycm91dF9hbGxvYzsKIAkJZi0+a2V5ID0gaGFuZGxlOwotCQl0Y2luZGV4X2ZpbHRlcl9yZXN1bHRfaW5pdCgmZi0+cmVzdWx0KTsKIAkJZi0+bmV4dCA9IE5VTEw7CisJCWVyciA9IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdF9pbml0KCZmLT5yZXN1bHQpOworCQlpZiAoZXJyIDwgMCkgeworCQkJa2ZyZWUoZik7CisJCQlnb3RvIGVycm91dF9hbGxvYzsKKwkJfQogCX0KIAogCWlmICh0YltUQ0FfVENJTkRFWF9DTEFTU0lEXSkgewpAQCAtMzg3LDggKzQxOSwxMyBAQAogCWVsc2UKIAkJdGNmX2V4dHNfY2hhbmdlKHRwLCAmY3IuZXh0cywgJmUpOwogCi0JaWYgKG9sZF9yICYmIG9sZF9yICE9IHIpCi0JCXRjaW5kZXhfZmlsdGVyX3Jlc3VsdF9pbml0KG9sZF9yKTsKKwlpZiAob2xkX3IgJiYgb2xkX3IgIT0gcikgeworCQllcnIgPSB0Y2luZGV4X2ZpbHRlcl9yZXN1bHRfaW5pdChvbGRfcik7CisJCWlmIChlcnIgPCAwKSB7CisJCQlrZnJlZShmKTsKKwkJCWdvdG8gZXJyb3V0X2FsbG9jOworCQl9CisJfQogCiAJb2xkcCA9IHA7CiAJci0+cmVzID0gY3IucmVzOwpAQCAtNDE1LDkgKzQ1MiwxMiBAQAogCiBlcnJvdXRfYWxsb2M6CiAJaWYgKGJhbGxvYyA9PSAxKQotCQlrZnJlZShjcC0+cGVyZmVjdCk7CisJCXRjaW5kZXhfZnJlZV9wZXJmZWN0X2hhc2goY3ApOwogCWVsc2UgaWYgKGJhbGxvYyA9PSAyKQogCQlrZnJlZShjcC0+aCk7CitlcnJvdXQxOgorCXRjZl9leHRzX2Rlc3Ryb3koJmNyLmV4dHMpOworCXRjZl9leHRzX2Rlc3Ryb3koJm5ld19maWx0ZXJfcmVzdWx0LmV4dHMpOwogZXJyb3V0OgogCWtmcmVlKGNwKTsKIAl0Y2ZfZXh0c19kZXN0cm95KCZlKTsKQEAgLTUxMCw3ICs1NTAsNyBAQAogCiAKIHN0YXRpYyBpbnQgdGNpbmRleF9kdW1wKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgZmgsCi0gICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjbXNnICp0KQorCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjbXNnICp0KQogewogCXN0cnVjdCB0Y2luZGV4X2RhdGEgKnAgPSBydG5sX2RlcmVmZXJlbmNlKHRwLT5yb290KTsKIAlzdHJ1Y3QgdGNpbmRleF9maWx0ZXJfcmVzdWx0ICpyID0gKHN0cnVjdCB0Y2luZGV4X2ZpbHRlcl9yZXN1bHQgKikgZmg7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX3UzMi5jIGIvbmV0L3NjaGVkL2Nsc191MzIuYwppbmRleCBmZmU1OTNlLi5hZTgzYzNhZSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc191MzIuYworKysgYi9uZXQvc2NoZWQvY2xzX3UzMi5jCkBAIC0xMDQsNyArMTA0LDggQEAKIAlyZXR1cm4gaDsKIH0KIAotc3RhdGljIGludCB1MzJfY2xhc3NpZnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHRjZl9wcm90byAqdHAsIHN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpCitzdGF0aWMgaW50IHUzMl9jbGFzc2lmeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwKKwkJCXN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpCiB7CiAJc3RydWN0IHsKIAkJc3RydWN0IHRjX3Vfa25vZGUgKmtub2RlOwpAQCAtMjU2LDggKzI1Nyw3IEBACiAJcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgc3RydWN0IHRjX3VfaG5vZGUgKgotdTMyX2xvb2t1cF9odChzdHJ1Y3QgdGNfdV9jb21tb24gKnRwX2MsIHUzMiBoYW5kbGUpCitzdGF0aWMgc3RydWN0IHRjX3VfaG5vZGUgKnUzMl9sb29rdXBfaHQoc3RydWN0IHRjX3VfY29tbW9uICp0cF9jLCB1MzIgaGFuZGxlKQogewogCXN0cnVjdCB0Y191X2hub2RlICpodDsKIApAQCAtMjcwLDggKzI3MCw3IEBACiAJcmV0dXJuIGh0OwogfQogCi1zdGF0aWMgc3RydWN0IHRjX3Vfa25vZGUgKgotdTMyX2xvb2t1cF9rZXkoc3RydWN0IHRjX3VfaG5vZGUgKmh0LCB1MzIgaGFuZGxlKQorc3RhdGljIHN0cnVjdCB0Y191X2tub2RlICp1MzJfbG9va3VwX2tleShzdHJ1Y3QgdGNfdV9obm9kZSAqaHQsIHUzMiBoYW5kbGUpCiB7CiAJdW5zaWduZWQgaW50IHNlbDsKIAlzdHJ1Y3QgdGNfdV9rbm9kZSAqbiA9IE5VTEw7CkBAIC0zNjAsOCArMzU5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB1MzJfZGVzdHJveV9rZXkoc3RydWN0IHRjZl9wcm90byAqdHAsCi0JCQkgICBzdHJ1Y3QgdGNfdV9rbm9kZSAqbiwKK3N0YXRpYyBpbnQgdTMyX2Rlc3Ryb3lfa2V5KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCBzdHJ1Y3QgdGNfdV9rbm9kZSAqbiwKIAkJCSAgIGJvb2wgZnJlZV9wZikKIHsKIAl0Y2ZfZXh0c19kZXN0cm95KCZuLT5leHRzKTsKQEAgLTQ0OCw5ICs0NDYsOCBAQAogCX0KIH0KIAotc3RhdGljIGludCB1MzJfcmVwbGFjZV9od19obm9kZShzdHJ1Y3QgdGNmX3Byb3RvICp0cCwKLQkJCQkgc3RydWN0IHRjX3VfaG5vZGUgKmgsCi0JCQkJIHUzMiBmbGFncykKK3N0YXRpYyBpbnQgdTMyX3JlcGxhY2VfaHdfaG5vZGUoc3RydWN0IHRjZl9wcm90byAqdHAsIHN0cnVjdCB0Y191X2hub2RlICpoLAorCQkJCXUzMiBmbGFncykKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdHAtPnEtPmRldl9xdWV1ZS0+ZGV2OwogCXN0cnVjdCB0Y19jbHNfdTMyX29mZmxvYWQgdTMyX29mZmxvYWQgPSB7MH07CkBAIC00OTYsOSArNDkzLDggQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgdTMyX3JlcGxhY2VfaHdfa25vZGUoc3RydWN0IHRjZl9wcm90byAqdHAsCi0JCQkJIHN0cnVjdCB0Y191X2tub2RlICpuLAotCQkJCSB1MzIgZmxhZ3MpCitzdGF0aWMgaW50IHUzMl9yZXBsYWNlX2h3X2tub2RlKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCBzdHJ1Y3QgdGNfdV9rbm9kZSAqbiwKKwkJCQl1MzIgZmxhZ3MpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHRwLT5xLT5kZXZfcXVldWUtPmRldjsKIAlzdHJ1Y3QgdGNfY2xzX3UzMl9vZmZsb2FkIHUzMl9vZmZsb2FkID0gezB9OwpAQCAtNzA5LDEzICs3MDUsMTUgQEAKIAkJCSBzdHJ1Y3QgdGNfdV9rbm9kZSAqbiwgc3RydWN0IG5sYXR0ciAqKnRiLAogCQkJIHN0cnVjdCBubGF0dHIgKmVzdCwgYm9vbCBvdnIpCiB7Ci0JaW50IGVycjsKIAlzdHJ1Y3QgdGNmX2V4dHMgZTsKKwlpbnQgZXJyOwogCi0JdGNmX2V4dHNfaW5pdCgmZSwgVENBX1UzMl9BQ1QsIFRDQV9VMzJfUE9MSUNFKTsKLQllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgZXN0LCAmZSwgb3ZyKTsKKwllcnIgPSB0Y2ZfZXh0c19pbml0KCZlLCBUQ0FfVTMyX0FDVCwgVENBX1UzMl9QT0xJQ0UpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOworCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCBlc3QsICZlLCBvdnIpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm91dDsKIAogCWVyciA9IC1FSU5WQUw7CiAJaWYgKHRiW1RDQV9VMzJfTElOS10pIHsKQEAgLTc2MSw4ICs3NTksNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIHUzMl9yZXBsYWNlX2tub2RlKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLAotCQkJICAgICAgc3RydWN0IHRjX3VfY29tbW9uICp0cF9jLAorc3RhdGljIHZvaWQgdTMyX3JlcGxhY2Vfa25vZGUoc3RydWN0IHRjZl9wcm90byAqdHAsIHN0cnVjdCB0Y191X2NvbW1vbiAqdHBfYywKIAkJCSAgICAgIHN0cnVjdCB0Y191X2tub2RlICpuKQogewogCXN0cnVjdCB0Y191X2tub2RlIF9fcmN1ICoqaW5zOwpAQCAtODMzLDE1ICs4MzAsMTcgQEAKIAluZXctPnRwID0gdHA7CiAJbWVtY3B5KCZuZXctPnNlbCwgcywgc2l6ZW9mKCpzKSArIHMtPm5rZXlzKnNpemVvZihzdHJ1Y3QgdGNfdTMyX2tleSkpOwogCi0JdGNmX2V4dHNfaW5pdCgmbmV3LT5leHRzLCBUQ0FfVTMyX0FDVCwgVENBX1UzMl9QT0xJQ0UpOworCWlmICh0Y2ZfZXh0c19pbml0KCZuZXctPmV4dHMsIFRDQV9VMzJfQUNULCBUQ0FfVTMyX1BPTElDRSkpIHsKKwkJa2ZyZWUobmV3KTsKKwkJcmV0dXJuIE5VTEw7CisJfQogCiAJcmV0dXJuIG5ldzsKIH0KIAogc3RhdGljIGludCB1MzJfY2hhbmdlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwKIAkJICAgICAgc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgYmFzZSwgdTMyIGhhbmRsZSwKLQkJICAgICAgc3RydWN0IG5sYXR0ciAqKnRjYSwKLQkJICAgICAgdW5zaWduZWQgbG9uZyAqYXJnLCBib29sIG92cikKKwkJICAgICAgc3RydWN0IG5sYXR0ciAqKnRjYSwgdW5zaWduZWQgbG9uZyAqYXJnLCBib29sIG92cikKIHsKIAlzdHJ1Y3QgdGNfdV9jb21tb24gKnRwX2MgPSB0cC0+ZGF0YTsKIAlzdHJ1Y3QgdGNfdV9obm9kZSAqaHQ7CkBAIC05ODUsOSArOTg0LDEyIEBACiAJbi0+aGFuZGxlID0gaGFuZGxlOwogCW4tPmZzaGlmdCA9IHMtPmhtYXNrID8gZmZzKG50b2hsKHMtPmhtYXNrKSkgLSAxIDogMDsKIAluLT5mbGFncyA9IGZsYWdzOwotCXRjZl9leHRzX2luaXQoJm4tPmV4dHMsIFRDQV9VMzJfQUNULCBUQ0FfVTMyX1BPTElDRSk7CiAJbi0+dHAgPSB0cDsKIAorCWVyciA9IHRjZl9leHRzX2luaXQoJm4tPmV4dHMsIFRDQV9VMzJfQUNULCBUQ0FfVTMyX1BPTElDRSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3V0OworCiAjaWZkZWYgQ09ORklHX0NMU19VMzJfTUFSSwogCW4tPnBjcHVfc3VjY2VzcyA9IGFsbG9jX3BlcmNwdSh1MzIpOwogCWlmICghbi0+cGNwdV9zdWNjZXNzKSB7CkBAIC0xMDI4LDkgKzEwMzAsMTAgQEAKIGVycmh3OgogI2lmZGVmIENPTkZJR19DTFNfVTMyX01BUksKIAlmcmVlX3BlcmNwdShuLT5wY3B1X3N1Y2Nlc3MpOwotZXJyb3V0OgogI2VuZGlmCiAKK2Vycm91dDoKKwl0Y2ZfZXh0c19kZXN0cm95KCZuLT5leHRzKTsKICNpZmRlZiBDT05GSUdfQ0xTX1UzMl9QRVJGCiAJZnJlZV9wZXJjcHUobi0+cGYpOwogI2VuZGlmCkBAIC0xMDc5LDcgKzEwODIsNyBAQAogfQogCiBzdGF0aWMgaW50IHUzMl9kdW1wKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgZmgsCi0JCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjbXNnICp0KQorCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjbXNnICp0KQogewogCXN0cnVjdCB0Y191X2tub2RlICpuID0gKHN0cnVjdCB0Y191X2tub2RlICopZmg7CiAJc3RydWN0IHRjX3VfaG5vZGUgKmh0X3VwLCAqaHRfZG93bjsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfYXBpLmMgYi9uZXQvc2NoZWQvc2NoX2FwaS5jCmluZGV4IDEyZWJkZTguLjIwNmRjMjQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfYXBpLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9hcGkuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9sb2NrZGVwLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2hhc2h0YWJsZS5oPgogCiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgpAQCAtMjU5LDM3ICsyNjAsNDAgQEAKIHsKIAlzdHJ1Y3QgUWRpc2MgKnE7CiAKKwlpZiAoIXFkaXNjX2Rldihyb290KSkKKwkJcmV0dXJuIChyb290LT5oYW5kbGUgPT0gaGFuZGxlID8gcm9vdCA6IE5VTEwpOworCiAJaWYgKCEocm9vdC0+ZmxhZ3MgJiBUQ1FfRl9CVUlMVElOKSAmJgogCSAgICByb290LT5oYW5kbGUgPT0gaGFuZGxlKQogCQlyZXR1cm4gcm9vdDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHEsICZyb290LT5saXN0LCBsaXN0KSB7CisJaGFzaF9mb3JfZWFjaF9wb3NzaWJsZV9yY3UocWRpc2NfZGV2KHJvb3QpLT5xZGlzY19oYXNoLCBxLCBoYXNoLCBoYW5kbGUpIHsKIAkJaWYgKHEtPmhhbmRsZSA9PSBoYW5kbGUpCiAJCQlyZXR1cm4gcTsKIAl9CiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgcWRpc2NfbGlzdF9hZGQoc3RydWN0IFFkaXNjICpxKQordm9pZCBxZGlzY19oYXNoX2FkZChzdHJ1Y3QgUWRpc2MgKnEpCiB7CiAJaWYgKChxLT5wYXJlbnQgIT0gVENfSF9ST09UKSAmJiAhKHEtPmZsYWdzICYgVENRX0ZfSU5HUkVTUykpIHsKIAkJc3RydWN0IFFkaXNjICpyb290ID0gcWRpc2NfZGV2KHEpLT5xZGlzYzsKIAogCQlXQVJOX09OX09OQ0Uocm9vdCA9PSAmbm9vcF9xZGlzYyk7CiAJCUFTU0VSVF9SVE5MKCk7Ci0JCWxpc3RfYWRkX3RhaWxfcmN1KCZxLT5saXN0LCAmcm9vdC0+bGlzdCk7CisJCWhhc2hfYWRkX3JjdShxZGlzY19kZXYocSktPnFkaXNjX2hhc2gsICZxLT5oYXNoLCBxLT5oYW5kbGUpOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wocWRpc2NfbGlzdF9hZGQpOworRVhQT1JUX1NZTUJPTChxZGlzY19oYXNoX2FkZCk7CiAKLXZvaWQgcWRpc2NfbGlzdF9kZWwoc3RydWN0IFFkaXNjICpxKQordm9pZCBxZGlzY19oYXNoX2RlbChzdHJ1Y3QgUWRpc2MgKnEpCiB7CiAJaWYgKChxLT5wYXJlbnQgIT0gVENfSF9ST09UKSAmJiAhKHEtPmZsYWdzICYgVENRX0ZfSU5HUkVTUykpIHsKIAkJQVNTRVJUX1JUTkwoKTsKLQkJbGlzdF9kZWxfcmN1KCZxLT5saXN0KTsKKwkJaGFzaF9kZWxfcmN1KCZxLT5oYXNoKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKHFkaXNjX2xpc3RfZGVsKTsKK0VYUE9SVF9TWU1CT0wocWRpc2NfaGFzaF9kZWwpOwogCiBzdHJ1Y3QgUWRpc2MgKnFkaXNjX2xvb2t1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgaGFuZGxlKQogewpAQCAtMzg1LDcgKzM4OSw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcWRpc2NfcmF0ZV90YWJsZSAqcWRpc2NfcnRhYl9saXN0OwogCi1zdHJ1Y3QgcWRpc2NfcmF0ZV90YWJsZSAqcWRpc2NfZ2V0X3J0YWIoc3RydWN0IHRjX3JhdGVzcGVjICpyLCBzdHJ1Y3QgbmxhdHRyICp0YWIpCitzdHJ1Y3QgcWRpc2NfcmF0ZV90YWJsZSAqcWRpc2NfZ2V0X3J0YWIoc3RydWN0IHRjX3JhdGVzcGVjICpyLAorCQkJCQlzdHJ1Y3QgbmxhdHRyICp0YWIpCiB7CiAJc3RydWN0IHFkaXNjX3JhdGVfdGFibGUgKnJ0YWI7CiAKQEAgLTUzNyw3ICs1NDIsOCBAQAogCXJldHVybiAtMTsKIH0KIAotdm9pZCBfX3FkaXNjX2NhbGN1bGF0ZV9wa3RfbGVuKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBxZGlzY19zaXplX3RhYmxlICpzdGFiKQordm9pZCBfX3FkaXNjX2NhbGN1bGF0ZV9wa3RfbGVuKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IHFkaXNjX3NpemVfdGFibGUgKnN0YWIpCiB7CiAJaW50IHBrdF9sZW4sIHNsb3Q7CiAKQEAgLTg4NCwxMCArODkwLDEwIEBACiAgICBQYXJhbWV0ZXJzIGFyZSBwYXNzZWQgdmlhIG9wdC4KICAqLwogCi1zdGF0aWMgc3RydWN0IFFkaXNjICoKLXFkaXNjX2NyZWF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICpkZXZfcXVldWUsCi0JICAgICBzdHJ1Y3QgUWRpc2MgKnAsIHUzMiBwYXJlbnQsIHUzMiBoYW5kbGUsCi0JICAgICBzdHJ1Y3QgbmxhdHRyICoqdGNhLCBpbnQgKmVycnApCitzdGF0aWMgc3RydWN0IFFkaXNjICpxZGlzY19jcmVhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBuZXRkZXZfcXVldWUgKmRldl9xdWV1ZSwKKwkJCQkgIHN0cnVjdCBRZGlzYyAqcCwgdTMyIHBhcmVudCwgdTMyIGhhbmRsZSwKKwkJCQkgIHN0cnVjdCBubGF0dHIgKip0Y2EsIGludCAqZXJycCkKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCBubGF0dHIgKmtpbmQgPSB0Y2FbVENBX0tJTkRdOwpAQCAtOTk4LDcgKzEwMDQsNyBAQAogCQkJCWdvdG8gZXJyX291dDQ7CiAJCX0KIAotCQlxZGlzY19saXN0X2FkZChzY2gpOworCQlxZGlzY19oYXNoX2FkZChzY2gpOwogCiAJCXJldHVybiBzY2g7CiAJfQpAQCAtMTA2OSw3ICsxMDc1LDggQEAKIAlpbnQJCQlkZXB0aDsKIH07CiAKLXN0YXRpYyBpbnQgY2hlY2tfbG9vcF9mbihzdHJ1Y3QgUWRpc2MgKnEsIHVuc2lnbmVkIGxvbmcgY2wsIHN0cnVjdCBxZGlzY193YWxrZXIgKncpOworc3RhdGljIGludCBjaGVja19sb29wX2ZuKHN0cnVjdCBRZGlzYyAqcSwgdW5zaWduZWQgbG9uZyBjbCwKKwkJCSBzdHJ1Y3QgcWRpc2Nfd2Fsa2VyICp3KTsKIAogc3RhdGljIGludCBjaGVja19sb29wKHN0cnVjdCBRZGlzYyAqcSwgc3RydWN0IFFkaXNjICpwLCBpbnQgZGVwdGgpCiB7CkBAIC0xNDMxLDEwICsxNDM4LDExIEBACiAKIHN0YXRpYyBpbnQgdGNfZHVtcF9xZGlzY19yb290KHN0cnVjdCBRZGlzYyAqcm9vdCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKLQkJCSAgICAgIGludCAqcV9pZHhfcCwgaW50IHNfcV9pZHgpCisJCQkgICAgICBpbnQgKnFfaWR4X3AsIGludCBzX3FfaWR4LCBib29sIHJlY3VyKQogewogCWludCByZXQgPSAwLCBxX2lkeCA9ICpxX2lkeF9wOwogCXN0cnVjdCBRZGlzYyAqcTsKKwlpbnQgYjsKIAogCWlmICghcm9vdCkKIAkJcmV0dXJuIDA7CkBAIC0xNDQ1LDE4ICsxNDUzLDMwIEBACiAJfSBlbHNlIHsKIAkJaWYgKCF0Y19xZGlzY19kdW1wX2lnbm9yZShxKSAmJgogCQkgICAgdGNfZmlsbF9xZGlzYyhza2IsIHEsIHEtPnBhcmVudCwgTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQsCi0JCQkJICBjYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLCBSVE1fTkVXUURJU0MpIDw9IDApCisJCQkJICBjYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLAorCQkJCSAgUlRNX05FV1FESVNDKSA8PSAwKQogCQkJZ290byBkb25lOwogCQlxX2lkeCsrOwogCX0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHEsICZyb290LT5saXN0LCBsaXN0KSB7CisKKwkvKiBJZiBkdW1waW5nIHNpbmdsZXRvbnMsIHRoZXJlIGlzIG5vIHFkaXNjX2Rldihyb290KSBhbmQgdGhlIHNpbmdsZXRvbgorCSAqIGl0c2VsZiBoYXMgYWxyZWFkeSBiZWVuIGR1bXBlZC4KKwkgKgorCSAqIElmIHdlJ3ZlIGFscmVhZHkgZHVtcGVkIHRoZSB0b3AtbGV2ZWwgKGluZ3Jlc3MpIHFkaXNjIGFib3ZlIGFuZCB0aGUgZ2xvYmFsCisJICogcWRpc2MgaGFzaHRhYmxlLCB3ZSBkb24ndCB3YW50IHRvIGhpdCBpdCBhZ2FpbgorCSAqLworCWlmICghcWRpc2NfZGV2KHJvb3QpIHx8ICFyZWN1cikKKwkJZ290byBvdXQ7CisKKwloYXNoX2Zvcl9lYWNoKHFkaXNjX2Rldihyb290KS0+cWRpc2NfaGFzaCwgYiwgcSwgaGFzaCkgewogCQlpZiAocV9pZHggPCBzX3FfaWR4KSB7CiAJCQlxX2lkeCsrOwogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKCF0Y19xZGlzY19kdW1wX2lnbm9yZShxKSAmJgogCQkgICAgdGNfZmlsbF9xZGlzYyhza2IsIHEsIHEtPnBhcmVudCwgTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQsCi0JCQkJICBjYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLCBSVE1fTkVXUURJU0MpIDw9IDApCisJCQkJICBjYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLAorCQkJCSAgUlRNX05FV1FESVNDKSA8PSAwKQogCQkJZ290byBkb25lOwogCQlxX2lkeCsrOwogCX0KQEAgLTE0OTAsMTMgKzE1MTAsMTQgQEAKIAkJCXNfcV9pZHggPSAwOwogCQlxX2lkeCA9IDA7CiAKLQkJaWYgKHRjX2R1bXBfcWRpc2Nfcm9vdChkZXYtPnFkaXNjLCBza2IsIGNiLCAmcV9pZHgsIHNfcV9pZHgpIDwgMCkKKwkJaWYgKHRjX2R1bXBfcWRpc2Nfcm9vdChkZXYtPnFkaXNjLCBza2IsIGNiLCAmcV9pZHgsIHNfcV9pZHgsCisJCQkJICAgICAgIHRydWUpIDwgMCkKIAkJCWdvdG8gZG9uZTsKIAogCQlkZXZfcXVldWUgPSBkZXZfaW5ncmVzc19xdWV1ZShkZXYpOwogCQlpZiAoZGV2X3F1ZXVlICYmCiAJCSAgICB0Y19kdW1wX3FkaXNjX3Jvb3QoZGV2X3F1ZXVlLT5xZGlzY19zbGVlcGluZywgc2tiLCBjYiwKLQkJCQkgICAgICAgJnFfaWR4LCBzX3FfaWR4KSA8IDApCisJCQkJICAgICAgICZxX2lkeCwgc19xX2lkeCwgZmFsc2UpIDwgMCkKIAkJCWdvdG8gZG9uZTsKIAogY29udDoKQEAgLTE2MjUsNyArMTY0Niw4IEBACiAJCQlpZiAoY29wcy0+ZGVsZXRlKQogCQkJCWVyciA9IGNvcHMtPmRlbGV0ZShxLCBjbCk7CiAJCQlpZiAoZXJyID09IDApCi0JCQkJdGNsYXNzX25vdGlmeShuZXQsIHNrYiwgbiwgcSwgY2wsIFJUTV9ERUxUQ0xBU1MpOworCQkJCXRjbGFzc19ub3RpZnkobmV0LCBza2IsIG4sIHEsIGNsLAorCQkJCQkgICAgICBSVE1fREVMVENMQVNTKTsKIAkJCWdvdG8gb3V0OwogCQljYXNlIFJUTV9HRVRUQ0xBU1M6CiAJCQllcnIgPSB0Y2xhc3Nfbm90aWZ5KG5ldCwgc2tiLCBuLCBxLCBjbCwgUlRNX05FV1RDTEFTUyk7CkBAIC0xNzIzLDEyICsxNzQ1LDE0IEBACiAJc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sJKmNiOwogfTsKIAotc3RhdGljIGludCBxZGlzY19jbGFzc19kdW1wKHN0cnVjdCBRZGlzYyAqcSwgdW5zaWduZWQgbG9uZyBjbCwgc3RydWN0IHFkaXNjX3dhbGtlciAqYXJnKQorc3RhdGljIGludCBxZGlzY19jbGFzc19kdW1wKHN0cnVjdCBRZGlzYyAqcSwgdW5zaWduZWQgbG9uZyBjbCwKKwkJCSAgICBzdHJ1Y3QgcWRpc2Nfd2Fsa2VyICphcmcpCiB7CiAJc3RydWN0IHFkaXNjX2R1bXBfYXJncyAqYSA9IChzdHJ1Y3QgcWRpc2NfZHVtcF9hcmdzICopYXJnOwogCiAJcmV0dXJuIHRjX2ZpbGxfdGNsYXNzKGEtPnNrYiwgcSwgY2wsIE5FVExJTktfQ0IoYS0+Y2ItPnNrYikucG9ydGlkLAotCQkJICAgICAgYS0+Y2ItPm5saC0+bmxtc2dfc2VxLCBOTE1fRl9NVUxUSSwgUlRNX05FV1RDTEFTUyk7CisJCQkgICAgICBhLT5jYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLAorCQkJICAgICAgUlRNX05FV1RDTEFTUyk7CiB9CiAKIHN0YXRpYyBpbnQgdGNfZHVtcF90Y2xhc3NfcWRpc2Moc3RydWN0IFFkaXNjICpxLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtMTc2NSw2ICsxNzg5LDcgQEAKIAkJCSAgICAgICBpbnQgKnRfcCwgaW50IHNfdCkKIHsKIAlzdHJ1Y3QgUWRpc2MgKnE7CisJaW50IGI7CiAKIAlpZiAoIXJvb3QpCiAJCXJldHVybiAwOwpAQCAtMTc3Miw3ICsxNzk3LDEwIEBACiAJaWYgKHRjX2R1bXBfdGNsYXNzX3FkaXNjKHJvb3QsIHNrYiwgdGNtLCBjYiwgdF9wLCBzX3QpIDwgMCkKIAkJcmV0dXJuIC0xOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShxLCAmcm9vdC0+bGlzdCwgbGlzdCkgeworCWlmICghcWRpc2NfZGV2KHJvb3QpKQorCQlyZXR1cm4gMDsKKworCWhhc2hfZm9yX2VhY2gocWRpc2NfZGV2KHJvb3QpLT5xZGlzY19oYXNoLCBiLCBxLCBoYXNoKSB7CiAJCWlmICh0Y19kdW1wX3RjbGFzc19xZGlzYyhxLCBza2IsIHRjbSwgY2IsIHRfcCwgc190KSA8IDApCiAJCQlyZXR1cm4gLTE7CiAJfQpAQCAtMTk1NywxMCArMTk4NSwxMiBAQAogCiAJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9ORVdRRElTQywgdGNfbW9kaWZ5X3FkaXNjLCBOVUxMLCBOVUxMKTsKIAlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0RFTFFESVNDLCB0Y19nZXRfcWRpc2MsIE5VTEwsIE5VTEwpOwotCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fR0VUUURJU0MsIHRjX2dldF9xZGlzYywgdGNfZHVtcF9xZGlzYywgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9HRVRRRElTQywgdGNfZ2V0X3FkaXNjLCB0Y19kdW1wX3FkaXNjLAorCQkgICAgICBOVUxMKTsKIAlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX05FV1RDTEFTUywgdGNfY3RsX3RjbGFzcywgTlVMTCwgTlVMTCk7CiAJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9ERUxUQ0xBU1MsIHRjX2N0bF90Y2xhc3MsIE5VTEwsIE5VTEwpOwotCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fR0VUVENMQVNTLCB0Y19jdGxfdGNsYXNzLCB0Y19kdW1wX3RjbGFzcywgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9HRVRUQ0xBU1MsIHRjX2N0bF90Y2xhc3MsIHRjX2R1bXBfdGNsYXNzLAorCQkgICAgICBOVUxMKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9jb2RlbC5jIGIvbmV0L3NjaGVkL3NjaF9jb2RlbC5jCmluZGV4IDQwMDJkZjMuLjViZmE3OWUgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfY29kZWwuYworKysgYi9uZXQvc2NoZWQvc2NoX2NvZGVsLmMKQEAgLTY5LDcgKzY5LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqZGVxdWV1ZV9mdW5jKHN0cnVjdCBjb2RlbF92YXJzICp2YXJzLCB2b2lkICpjdHgpCiB7CiAJc3RydWN0IFFkaXNjICpzY2ggPSBjdHg7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IF9fc2tiX2RlcXVldWUoJnNjaC0+cSk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IF9fcWRpc2NfZGVxdWV1ZV9oZWFkKCZzY2gtPnEpOwogCiAJaWYgKHNrYikKIAkJc2NoLT5xc3RhdHMuYmFja2xvZyAtPSBxZGlzY19wa3RfbGVuKHNrYik7CkBAIC0xNzIsNyArMTcyLDcgQEAKIAogCXFsZW4gPSBzY2gtPnEucWxlbjsKIAl3aGlsZSAoc2NoLT5xLnFsZW4gPiBzY2gtPmxpbWl0KSB7Ci0JCXN0cnVjdCBza19idWZmICpza2IgPSBfX3NrYl9kZXF1ZXVlKCZzY2gtPnEpOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gX19xZGlzY19kZXF1ZXVlX2hlYWQoJnNjaC0+cSk7CiAKIAkJZHJvcHBlZCArPSBxZGlzY19wa3RfbGVuKHNrYik7CiAJCXFkaXNjX3FzdGF0c19iYWNrbG9nX2RlYyhzY2gsIHNrYik7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2ZpZm8uYyBiL25ldC9zY2hlZC9zY2hfZmlmby5jCmluZGV4IGJhZWVkNmEuLjFlMzcyNDcgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfZmlmby5jCisrKyBiL25ldC9zY2hlZC9zY2hfZmlmby5jCkBAIC0zMSw3ICszMSw3IEBACiBzdGF0aWMgaW50IHBmaWZvX2VucXVldWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFFkaXNjICpzY2gsCiAJCQkgc3RydWN0IHNrX2J1ZmYgKip0b19mcmVlKQogewotCWlmIChsaWtlbHkoc2tiX3F1ZXVlX2xlbigmc2NoLT5xKSA8IHNjaC0+bGltaXQpKQorCWlmIChsaWtlbHkoc2NoLT5xLnFsZW4gPCBzY2gtPmxpbWl0KSkKIAkJcmV0dXJuIHFkaXNjX2VucXVldWVfdGFpbChza2IsIHNjaCk7CiAKIAlyZXR1cm4gcWRpc2NfZHJvcChza2IsIHNjaCwgdG9fZnJlZSk7CkBAIC00Miw3ICs0Miw3IEBACiB7CiAJdW5zaWduZWQgaW50IHByZXZfYmFja2xvZzsKIAotCWlmIChsaWtlbHkoc2tiX3F1ZXVlX2xlbigmc2NoLT5xKSA8IHNjaC0+bGltaXQpKQorCWlmIChsaWtlbHkoc2NoLT5xLnFsZW4gPCBzY2gtPmxpbWl0KSkKIAkJcmV0dXJuIHFkaXNjX2VucXVldWVfdGFpbChza2IsIHNjaCk7CiAKIAlwcmV2X2JhY2tsb2cgPSBzY2gtPnFzdGF0cy5iYWNrbG9nOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9mcS5jIGIvbmV0L3NjaGVkL3NjaF9mcS5jCmluZGV4IGU1NDU4YjkuLjE4ZTc1MjQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfZnEuYworKysgYi9uZXQvc2NoZWQvc2NoX2ZxLmMKQEAgLTg2LDYgKzg2LDcgQEAKIAogCXN0cnVjdCByYl9yb290CWRlbGF5ZWQ7CS8qIGZvciByYXRlIGxpbWl0ZWQgZmxvd3MgKi8KIAl1NjQJCXRpbWVfbmV4dF9kZWxheWVkX2Zsb3c7CisJdW5zaWduZWQgbG9uZwl1bnRocm90dGxlX2xhdGVuY3lfbnM7CiAKIAlzdHJ1Y3QgZnFfZmxvdwlpbnRlcm5hbDsJLyogZm9yIG5vbiBjbGFzc2lmaWVkIG9yIGhpZ2ggcHJpbyBwYWNrZXRzICovCiAJdTMyCQlxdWFudHVtOwpAQCAtOTQsNiArOTUsNyBAQAogCXUzMgkJZmxvd19tYXhfcmF0ZTsJLyogb3B0aW9uYWwgbWF4IHJhdGUgcGVyIGZsb3cgKi8KIAl1MzIJCWZsb3dfcGxpbWl0OwkvKiBtYXggcGFja2V0cyBwZXIgZmxvdyAqLwogCXUzMgkJb3JwaGFuX21hc2s7CS8qIG1hc2sgZm9yIG9ycGhhbmVkIHNrYiAqLworCXUzMgkJbG93X3JhdGVfdGhyZXNob2xkOwogCXN0cnVjdCByYl9yb290CSpmcV9yb290OwogCXU4CQlyYXRlX2VuYWJsZTsKIAl1OAkJZnFfdHJlZXNfbG9nOwpAQCAtNDA3LDExICs0MDksMTkgQEAKIAogc3RhdGljIHZvaWQgZnFfY2hlY2tfdGhyb3R0bGVkKHN0cnVjdCBmcV9zY2hlZF9kYXRhICpxLCB1NjQgbm93KQogeworCXVuc2lnbmVkIGxvbmcgc2FtcGxlOwogCXN0cnVjdCByYl9ub2RlICpwOwogCiAJaWYgKHEtPnRpbWVfbmV4dF9kZWxheWVkX2Zsb3cgPiBub3cpCiAJCXJldHVybjsKIAorCS8qIFVwZGF0ZSB1bnRocm90dGxlIGxhdGVuY3kgRVdNQS4KKwkgKiBUaGlzIGlzIGNoZWFwIGFuZCBjYW4gaGVscCBkaWFnbm9zaW5nIHRpbWVyL2xhdGVuY3kgcHJvYmxlbXMuCisJICovCisJc2FtcGxlID0gKHVuc2lnbmVkIGxvbmcpKG5vdyAtIHEtPnRpbWVfbmV4dF9kZWxheWVkX2Zsb3cpOworCXEtPnVudGhyb3R0bGVfbGF0ZW5jeV9ucyAtPSBxLT51bnRocm90dGxlX2xhdGVuY3lfbnMgPj4gMzsKKwlxLT51bnRocm90dGxlX2xhdGVuY3lfbnMgKz0gc2FtcGxlID4+IDM7CisKIAlxLT50aW1lX25leHRfZGVsYXllZF9mbG93ID0gfjBVTEw7CiAJd2hpbGUgKChwID0gcmJfZmlyc3QoJnEtPmRlbGF5ZWQpKSAhPSBOVUxMKSB7CiAJCXN0cnVjdCBmcV9mbG93ICpmID0gY29udGFpbmVyX29mKHAsIHN0cnVjdCBmcV9mbG93LCByYXRlX25vZGUpOwpAQCAtNDMzLDcgKzQ0Myw3IEBACiAJc3RydWN0IGZxX2Zsb3dfaGVhZCAqaGVhZDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBmcV9mbG93ICpmOwotCXUzMiByYXRlOworCXUzMiByYXRlLCBwbGVuOwogCiAJc2tiID0gZnFfZGVxdWV1ZV9oZWFkKHNjaCwgJnEtPmludGVybmFsKTsKIAlpZiAoc2tiKQpAQCAtNDgyLDcgKzQ5Miw3IEBACiAJcHJlZmV0Y2goJnNrYi0+ZW5kKTsKIAlmLT5jcmVkaXQgLT0gcWRpc2NfcGt0X2xlbihza2IpOwogCi0JaWYgKGYtPmNyZWRpdCA+IDAgfHwgIXEtPnJhdGVfZW5hYmxlKQorCWlmICghcS0+cmF0ZV9lbmFibGUpCiAJCWdvdG8gb3V0OwogCiAJLyogRG8gbm90IHBhY2UgbG9jYWxseSBnZW5lcmF0ZWQgYWNrIHBhY2tldHMgKi8KQEAgLTQ5Myw4ICs1MDMsMTUgQEAKIAlpZiAoc2tiLT5zaykKIAkJcmF0ZSA9IG1pbihza2ItPnNrLT5za19wYWNpbmdfcmF0ZSwgcmF0ZSk7CiAKKwlpZiAocmF0ZSA8PSBxLT5sb3dfcmF0ZV90aHJlc2hvbGQpIHsKKwkJZi0+Y3JlZGl0ID0gMDsKKwkJcGxlbiA9IHFkaXNjX3BrdF9sZW4oc2tiKTsKKwl9IGVsc2UgeworCQlwbGVuID0gbWF4KHFkaXNjX3BrdF9sZW4oc2tiKSwgcS0+cXVhbnR1bSk7CisJCWlmIChmLT5jcmVkaXQgPiAwKQorCQkJZ290byBvdXQ7CisJfQogCWlmIChyYXRlICE9IH4wVSkgewotCQl1MzIgcGxlbiA9IG1heChxZGlzY19wa3RfbGVuKHNrYiksIHEtPnF1YW50dW0pOwogCQl1NjQgbGVuID0gKHU2NClwbGVuICogTlNFQ19QRVJfU0VDOwogCiAJCWlmIChsaWtlbHkocmF0ZSkpCkBAIC01MDcsNyArNTI0LDEyIEBACiAJCQlsZW4gPSBOU0VDX1BFUl9TRUM7CiAJCQlxLT5zdGF0X3BrdHNfdG9vX2xvbmcrKzsKIAkJfQotCisJCS8qIEFjY291bnQgZm9yIHNjaGVkdWxlL3RpbWVycyBkcmlmdHMuCisJCSAqIGYtPnRpbWVfbmV4dF9wYWNrZXQgd2FzIHNldCB3aGVuIHByaW9yIHBhY2tldCB3YXMgc2VudCwKKwkJICogYW5kIGN1cnJlbnQgdGltZSAoQG5vdykgY2FuIGJlIHRvbyBsYXRlIGJ5IHRlbnMgb2YgdXMuCisJCSAqLworCQlpZiAoZi0+dGltZV9uZXh0X3BhY2tldCkKKwkJCWxlbiAtPSBtaW4obGVuLzIsIG5vdyAtIGYtPnRpbWVfbmV4dF9wYWNrZXQpOwogCQlmLT50aW1lX25leHRfcGFja2V0ID0gbm93ICsgbGVuOwogCX0KIG91dDoKQEAgLTY2Miw2ICs2ODQsNyBAQAogCVtUQ0FfRlFfRkxPV19NQVhfUkFURV0JCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKIAlbVENBX0ZRX0JVQ0tFVFNfTE9HXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAogCVtUQ0FfRlFfRkxPV19SRUZJTExfREVMQVldCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbVENBX0ZRX0xPV19SQVRFX1RIUkVTSE9MRF0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAogfTsKIAogc3RhdGljIGludCBmcV9jaGFuZ2Uoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBubGF0dHIgKm9wdCkKQEAgLTcxNiw2ICs3MzksMTAgQEAKIAlpZiAodGJbVENBX0ZRX0ZMT1dfTUFYX1JBVEVdKQogCQlxLT5mbG93X21heF9yYXRlID0gbmxhX2dldF91MzIodGJbVENBX0ZRX0ZMT1dfTUFYX1JBVEVdKTsKIAorCWlmICh0YltUQ0FfRlFfTE9XX1JBVEVfVEhSRVNIT0xEXSkKKwkJcS0+bG93X3JhdGVfdGhyZXNob2xkID0KKwkJCW5sYV9nZXRfdTMyKHRiW1RDQV9GUV9MT1dfUkFURV9USFJFU0hPTERdKTsKKwogCWlmICh0YltUQ0FfRlFfUkFURV9FTkFCTEVdKSB7CiAJCXUzMiBlbmFibGUgPSBubGFfZ2V0X3UzMih0YltUQ0FfRlFfUkFURV9FTkFCTEVdKTsKIApAQCAtNzc0LDYgKzgwMSw3IEBACiAJcS0+aW5pdGlhbF9xdWFudHVtCT0gMTAgKiBwc2NoZWRfbXR1KHFkaXNjX2RldihzY2gpKTsKIAlxLT5mbG93X3JlZmlsbF9kZWxheQk9IG1zZWNzX3RvX2ppZmZpZXMoNDApOwogCXEtPmZsb3dfbWF4X3JhdGUJPSB+MFU7CisJcS0+dGltZV9uZXh0X2RlbGF5ZWRfZmxvdyA9IH4wVUxMOwogCXEtPnJhdGVfZW5hYmxlCQk9IDE7CiAJcS0+bmV3X2Zsb3dzLmZpcnN0CT0gTlVMTDsKIAlxLT5vbGRfZmxvd3MuZmlyc3QJPSBOVUxMOwpAQCAtNzgxLDYgKzgwOSw3IEBACiAJcS0+ZnFfcm9vdAkJPSBOVUxMOwogCXEtPmZxX3RyZWVzX2xvZwkJPSBpbG9nMigxMDI0KTsKIAlxLT5vcnBoYW5fbWFzawkJPSAxMDI0IC0gMTsKKwlxLT5sb3dfcmF0ZV90aHJlc2hvbGQJPSA1NTAwMDAgLyA4OwogCXFkaXNjX3dhdGNoZG9nX2luaXQoJnEtPndhdGNoZG9nLCBzY2gpOwogCiAJaWYgKG9wdCkKQEAgLTgxMSw2ICs4NDAsOCBAQAogCSAgICBubGFfcHV0X3UzMihza2IsIFRDQV9GUV9GTE9XX1JFRklMTF9ERUxBWSwKIAkJCWppZmZpZXNfdG9fdXNlY3MocS0+Zmxvd19yZWZpbGxfZGVsYXkpKSB8fAogCSAgICBubGFfcHV0X3UzMihza2IsIFRDQV9GUV9PUlBIQU5fTUFTSywgcS0+b3JwaGFuX21hc2spIHx8CisJICAgIG5sYV9wdXRfdTMyKHNrYiwgVENBX0ZRX0xPV19SQVRFX1RIUkVTSE9MRCwKKwkJCXEtPmxvd19yYXRlX3RocmVzaG9sZCkgfHwKIAkgICAgbmxhX3B1dF91MzIoc2tiLCBUQ0FfRlFfQlVDS0VUU19MT0csIHEtPmZxX3RyZWVzX2xvZykpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCkBAIC04MjMsMjAgKzg1NCwyNCBAQAogc3RhdGljIGludCBmcV9kdW1wX3N0YXRzKHN0cnVjdCBRZGlzYyAqc2NoLCBzdHJ1Y3QgZ25ldF9kdW1wICpkKQogewogCXN0cnVjdCBmcV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOwotCXU2NCBub3cgPSBrdGltZV9nZXRfbnMoKTsKLQlzdHJ1Y3QgdGNfZnFfcWRfc3RhdHMgc3QgPSB7Ci0JCS5nY19mbG93cwkJPSBxLT5zdGF0X2djX2Zsb3dzLAotCQkuaGlnaHByaW9fcGFja2V0cwk9IHEtPnN0YXRfaW50ZXJuYWxfcGFja2V0cywKLQkJLnRjcF9yZXRyYW5zCQk9IHEtPnN0YXRfdGNwX3JldHJhbnMsCi0JCS50aHJvdHRsZWQJCT0gcS0+c3RhdF90aHJvdHRsZWQsCi0JCS5mbG93c19wbGltaXQJCT0gcS0+c3RhdF9mbG93c19wbGltaXQsCi0JCS5wa3RzX3Rvb19sb25nCQk9IHEtPnN0YXRfcGt0c190b29fbG9uZywKLQkJLmFsbG9jYXRpb25fZXJyb3JzCT0gcS0+c3RhdF9hbGxvY2F0aW9uX2Vycm9ycywKLQkJLmZsb3dzCQkJPSBxLT5mbG93cywKLQkJLmluYWN0aXZlX2Zsb3dzCQk9IHEtPmluYWN0aXZlX2Zsb3dzLAotCQkudGhyb3R0bGVkX2Zsb3dzCT0gcS0+dGhyb3R0bGVkX2Zsb3dzLAotCQkudGltZV9uZXh0X2RlbGF5ZWRfZmxvdwk9IHEtPnRpbWVfbmV4dF9kZWxheWVkX2Zsb3cgLSBub3csCi0JfTsKKwlzdHJ1Y3QgdGNfZnFfcWRfc3RhdHMgc3Q7CisKKwlzY2hfdHJlZV9sb2NrKHNjaCk7CisKKwlzdC5nY19mbG93cwkJICA9IHEtPnN0YXRfZ2NfZmxvd3M7CisJc3QuaGlnaHByaW9fcGFja2V0cwkgID0gcS0+c3RhdF9pbnRlcm5hbF9wYWNrZXRzOworCXN0LnRjcF9yZXRyYW5zCQkgID0gcS0+c3RhdF90Y3BfcmV0cmFuczsKKwlzdC50aHJvdHRsZWQJCSAgPSBxLT5zdGF0X3Rocm90dGxlZDsKKwlzdC5mbG93c19wbGltaXQJCSAgPSBxLT5zdGF0X2Zsb3dzX3BsaW1pdDsKKwlzdC5wa3RzX3Rvb19sb25nCSAgPSBxLT5zdGF0X3BrdHNfdG9vX2xvbmc7CisJc3QuYWxsb2NhdGlvbl9lcnJvcnMJICA9IHEtPnN0YXRfYWxsb2NhdGlvbl9lcnJvcnM7CisJc3QudGltZV9uZXh0X2RlbGF5ZWRfZmxvdyA9IHEtPnRpbWVfbmV4dF9kZWxheWVkX2Zsb3cgLSBrdGltZV9nZXRfbnMoKTsKKwlzdC5mbG93cwkJICA9IHEtPmZsb3dzOworCXN0LmluYWN0aXZlX2Zsb3dzCSAgPSBxLT5pbmFjdGl2ZV9mbG93czsKKwlzdC50aHJvdHRsZWRfZmxvd3MJICA9IHEtPnRocm90dGxlZF9mbG93czsKKwlzdC51bnRocm90dGxlX2xhdGVuY3lfbnMgID0gbWluX3QodW5zaWduZWQgbG9uZywKKwkJCQkJICBxLT51bnRocm90dGxlX2xhdGVuY3lfbnMsIH4wVSk7CisJc2NoX3RyZWVfdW5sb2NrKHNjaCk7CiAKIAlyZXR1cm4gZ25ldF9zdGF0c19jb3B5X2FwcChkLCAmc3QsIHNpemVvZihzdCkpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9nZW5lcmljLmMgYi9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYwppbmRleCBlOTViNjdjLi42Y2ZiNmU5IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYworKysgYi9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYwpAQCAtNDIzLDcgKzQyMyw2IEBACiAJLmRlcXVldWUJPQlub29wX2RlcXVldWUsCiAJLmZsYWdzCQk9CVRDUV9GX0JVSUxUSU4sCiAJLm9wcwkJPQkmbm9vcF9xZGlzY19vcHMsCi0JLmxpc3QJCT0JTElTVF9IRUFEX0lOSVQobm9vcF9xZGlzYy5saXN0KSwKIAkucS5sb2NrCQk9CV9fU1BJTl9MT0NLX1VOTE9DS0VEKG5vb3BfcWRpc2MucS5sb2NrKSwKIAkuZGV2X3F1ZXVlCT0JJm5vb3BfbmV0ZGV2X3F1ZXVlLAogCS5ydW5uaW5nCT0JU0VRQ05UX1pFUk8obm9vcF9xZGlzYy5ydW5uaW5nKSwKQEAgLTQ2Nyw3ICs0NjYsNyBAQAogICovCiBzdHJ1Y3QgcGZpZm9fZmFzdF9wcml2IHsKIAl1MzIgYml0bWFwOwotCXN0cnVjdCBza19idWZmX2hlYWQgcVtQRklGT19GQVNUX0JBTkRTXTsKKwlzdHJ1Y3QgcWRpc2Nfc2tiX2hlYWQgcVtQRklGT19GQVNUX0JBTkRTXTsKIH07CiAKIC8qCkBAIC00NzgsNyArNDc3LDcgQEAKICAqLwogc3RhdGljIGNvbnN0IGludCBiaXRtYXAyYmFuZFtdID0gey0xLCAwLCAxLCAwLCAyLCAwLCAxLCAwfTsKIAotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpiYW5kMmxpc3Qoc3RydWN0IHBmaWZvX2Zhc3RfcHJpdiAqcHJpdiwKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHFkaXNjX3NrYl9oZWFkICpiYW5kMmxpc3Qoc3RydWN0IHBmaWZvX2Zhc3RfcHJpdiAqcHJpdiwKIAkJCQkJICAgICBpbnQgYmFuZCkKIHsKIAlyZXR1cm4gcHJpdi0+cSArIGJhbmQ7CkBAIC00ODcsMTAgKzQ4NiwxMCBAQAogc3RhdGljIGludCBwZmlmb19mYXN0X2VucXVldWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFFkaXNjICpxZGlzYywKIAkJCSAgICAgIHN0cnVjdCBza19idWZmICoqdG9fZnJlZSkKIHsKLQlpZiAoc2tiX3F1ZXVlX2xlbigmcWRpc2MtPnEpIDwgcWRpc2NfZGV2KHFkaXNjKS0+dHhfcXVldWVfbGVuKSB7CisJaWYgKHFkaXNjLT5xLnFsZW4gPCBxZGlzY19kZXYocWRpc2MpLT50eF9xdWV1ZV9sZW4pIHsKIAkJaW50IGJhbmQgPSBwcmlvMmJhbmRbc2tiLT5wcmlvcml0eSAmIFRDX1BSSU9fTUFYXTsKIAkJc3RydWN0IHBmaWZvX2Zhc3RfcHJpdiAqcHJpdiA9IHFkaXNjX3ByaXYocWRpc2MpOwotCQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0ID0gYmFuZDJsaXN0KHByaXYsIGJhbmQpOworCQlzdHJ1Y3QgcWRpc2Nfc2tiX2hlYWQgKmxpc3QgPSBiYW5kMmxpc3QocHJpdiwgYmFuZCk7CiAKIAkJcHJpdi0+Yml0bWFwIHw9ICgxIDw8IGJhbmQpOwogCQlxZGlzYy0+cS5xbGVuKys7CkBAIC01MDYsMTEgKzUwNSwxNiBAQAogCWludCBiYW5kID0gYml0bWFwMmJhbmRbcHJpdi0+Yml0bWFwXTsKIAogCWlmIChsaWtlbHkoYmFuZCA+PSAwKSkgewotCQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0ID0gYmFuZDJsaXN0KHByaXYsIGJhbmQpOwotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gX19xZGlzY19kZXF1ZXVlX2hlYWQocWRpc2MsIGxpc3QpOworCQlzdHJ1Y3QgcWRpc2Nfc2tiX2hlYWQgKnFoID0gYmFuZDJsaXN0KHByaXYsIGJhbmQpOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gX19xZGlzY19kZXF1ZXVlX2hlYWQocWgpOworCisJCWlmIChsaWtlbHkoc2tiICE9IE5VTEwpKSB7CisJCQlxZGlzY19xc3RhdHNfYmFja2xvZ19kZWMocWRpc2MsIHNrYik7CisJCQlxZGlzY19ic3RhdHNfdXBkYXRlKHFkaXNjLCBza2IpOworCQl9CiAKIAkJcWRpc2MtPnEucWxlbi0tOwotCQlpZiAoc2tiX3F1ZXVlX2VtcHR5KGxpc3QpKQorCQlpZiAocWgtPnFsZW4gPT0gMCkKIAkJCXByaXYtPmJpdG1hcCAmPSB+KDEgPDwgYmFuZCk7CiAKIAkJcmV0dXJuIHNrYjsKQEAgLTUyNSw5ICs1MjksOSBAQAogCWludCBiYW5kID0gYml0bWFwMmJhbmRbcHJpdi0+Yml0bWFwXTsKIAogCWlmIChiYW5kID49IDApIHsKLQkJc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCA9IGJhbmQybGlzdChwcml2LCBiYW5kKTsKKwkJc3RydWN0IHFkaXNjX3NrYl9oZWFkICpxaCA9IGJhbmQybGlzdChwcml2LCBiYW5kKTsKIAotCQlyZXR1cm4gc2tiX3BlZWsobGlzdCk7CisJCXJldHVybiBxaC0+aGVhZDsKIAl9CiAKIAlyZXR1cm4gTlVMTDsKQEAgLTU2NSw3ICs1NjksNyBAQAogCXN0cnVjdCBwZmlmb19mYXN0X3ByaXYgKnByaXYgPSBxZGlzY19wcml2KHFkaXNjKTsKIAogCWZvciAocHJpbyA9IDA7IHByaW8gPCBQRklGT19GQVNUX0JBTkRTOyBwcmlvKyspCi0JCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdChiYW5kMmxpc3QocHJpdiwgcHJpbykpOworCQlxZGlzY19za2JfaGVhZF9pbml0KGJhbmQybGlzdChwcml2LCBwcmlvKSk7CiAKIAkvKiBDYW4gYnktcGFzcyB0aGUgcXVldWUgZGlzY2lwbGluZSAqLwogCXFkaXNjLT5mbGFncyB8PSBUQ1FfRl9DQU5fQllQQVNTOwpAQCAtNjEzLDggKzYxNyw4IEBACiAJCXNjaCA9IChzdHJ1Y3QgUWRpc2MgKikgUURJU0NfQUxJR04oKHVuc2lnbmVkIGxvbmcpIHApOwogCQlzY2gtPnBhZGRlZCA9IChjaGFyICopIHNjaCAtIChjaGFyICopIHA7CiAJfQotCUlOSVRfTElTVF9IRUFEKCZzY2gtPmxpc3QpOwotCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnNjaC0+cSk7CisJcWRpc2Nfc2tiX2hlYWRfaW5pdCgmc2NoLT5xKTsKKwlzcGluX2xvY2tfaW5pdCgmc2NoLT5xLmxvY2spOwogCiAJc3Bpbl9sb2NrX2luaXQoJnNjaC0+YnVzeWxvY2spOwogCWxvY2tkZXBfc2V0X2NsYXNzKCZzY2gtPmJ1c3lsb2NrLApAQCAtNjQzLDE4ICs2NDcsMTkgQEAKIAlzdHJ1Y3QgUWRpc2MgKnNjaDsKIAogCWlmICghdHJ5X21vZHVsZV9nZXQob3BzLT5vd25lcikpCi0JCWdvdG8gZXJyb3V0OworCQlyZXR1cm4gTlVMTDsKIAogCXNjaCA9IHFkaXNjX2FsbG9jKGRldl9xdWV1ZSwgb3BzKTsKLQlpZiAoSVNfRVJSKHNjaCkpCi0JCWdvdG8gZXJyb3V0OworCWlmIChJU19FUlIoc2NoKSkgeworCQltb2R1bGVfcHV0KG9wcy0+b3duZXIpOworCQlyZXR1cm4gTlVMTDsKKwl9CiAJc2NoLT5wYXJlbnQgPSBwYXJlbnRpZDsKIAogCWlmICghb3BzLT5pbml0IHx8IG9wcy0+aW5pdChzY2gsIE5VTEwpID09IDApCiAJCXJldHVybiBzY2g7CiAKIAlxZGlzY19kZXN0cm95KHNjaCk7Ci1lcnJvdXQ6CiAJcmV0dXJuIE5VTEw7CiB9CiBFWFBPUlRfU1lNQk9MKHFkaXNjX2NyZWF0ZV9kZmx0KTsKQEAgLTcwMCw3ICs3MDUsNyBAQAogCQlyZXR1cm47CiAKICNpZmRlZiBDT05GSUdfTkVUX1NDSEVECi0JcWRpc2NfbGlzdF9kZWwocWRpc2MpOworCXFkaXNjX2hhc2hfZGVsKHFkaXNjKTsKIAogCXFkaXNjX3B1dF9zdGFiKHJ0bmxfZGVyZWZlcmVuY2UocWRpc2MtPnN0YWIpKTsKICNlbmRpZgpAQCAtNzg4LDYgKzc5MywxMCBAQAogCQkJcWRpc2MtPm9wcy0+YXR0YWNoKHFkaXNjKTsKIAkJfQogCX0KKyNpZmRlZiBDT05GSUdfTkVUX1NDSEVECisJaWYgKGRldi0+cWRpc2MpCisJCXFkaXNjX2hhc2hfYWRkKGRldi0+cWRpc2MpOworI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIHRyYW5zaXRpb25fb25lX3FkaXNjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2hmc2MuYyBiL25ldC9zY2hlZC9zY2hfaGZzYy5jCmluZGV4IDNkZGM3YmQuLjAwMGYxZDMgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfaGZzYy5jCisrKyBiL25ldC9zY2hlZC9zY2hfaGZzYy5jCkBAIC0xNDIsOCArMTQyLDYgQEAKIAkJCQkJICAgbGluay1zaGFyaW5nLCBtYXgobXlmLCBjZm1pbikgKi8KIAl1NjQJY2xfbXlmOwkJCS8qIG15IGZpdC10aW1lIChjYWxjdWxhdGVkIGZyb20gdGhpcwogCQkJCQkgICBjbGFzcydzIG93biB1cHBlcmxpbWl0IGN1cnZlKSAqLwotCXU2NAljbF9teWZhZGo7CQkvKiBteSBmaXQtdGltZSBhZGp1c3RtZW50ICh0byBjYW5jZWwKLQkJCQkJICAgaGlzdG9yeSBkZXBlbmRlbmNlKSAqLwogCXU2NAljbF9jZm1pbjsJCS8qIGVhcmxpZXN0IGNoaWxkcmVuJ3MgZml0LXRpbWUgKHVzZWQKIAkJCQkJICAgd2l0aCBjbF9teWYgdG8gb2J0YWluIGNsX2YpICovCiAJdTY0CWNsX2N2dG1pbjsJCS8qIG1pbmltYWwgdmlydHVhbCB0aW1lIGFtb25nIHRoZQpAQCAtMTUxLDExICsxNDksOCBAQAogCQkJCQkgICAobW9ub3RvbmljIHdpdGhpbiBhIHBlcmlvZCkgKi8KIAl1NjQJY2xfdnRhZGo7CQkvKiBpbnRyYS1wZXJpb2QgY3VtdWxhdGl2ZSB2dAogCQkJCQkgICBhZGp1c3RtZW50ICovCi0JdTY0CWNsX3Z0b2ZmOwkJLyogaW50ZXItcGVyaW9kIGN1bXVsYXRpdmUgdnQgb2Zmc2V0ICovCi0JdTY0CWNsX2N2dG1heDsJCS8qIG1heCBjaGlsZCdzIHZ0IGluIHRoZSBsYXN0IHBlcmlvZCAqLwotCXU2NAljbF9jdnRvZmY7CQkvKiBjdW11bGF0aXZlIGN2dG1heCBvZiBhbGwgcGVyaW9kcyAqLwotCXU2NAljbF9wY3Z0b2ZmOwkJLyogcGFyZW50J3MgY3Z0b2ZmIGF0IGluaXRpYWxpemF0aW9uCi0JCQkJCSAgIHRpbWUgKi8KKwl1NjQJY2xfY3Z0b2ZmOwkJLyogbGFyZ2VzdCB2aXJ0dWFsIHRpbWUgc2VlbiBhbW9uZworCQkJCQkgICB0aGUgY2hpbGRyZW4gKi8KIAogCXN0cnVjdCBpbnRlcm5hbF9zYyBjbF9yc2M7CS8qIGludGVybmFsIHJlYWwtdGltZSBzZXJ2aWNlIGN1cnZlICovCiAJc3RydWN0IGludGVybmFsX3NjIGNsX2ZzYzsJLyogaW50ZXJuYWwgZmFpciBzZXJ2aWNlIGN1cnZlICovCkBAIC03MDEsMjggKzY5NiwxNiBAQAogCQkJfSBlbHNlIHsKIAkJCQkvKgogCQkJCSAqIGZpcnN0IGNoaWxkIGZvciBhIG5ldyBwYXJlbnQgYmFja2xvZyBwZXJpb2QuCi0JCQkJICogYWRkIHBhcmVudCdzIGN2dG1heCB0byBjdnRvZmYgdG8gbWFrZSBhIG5ldwotCQkJCSAqIHZ0ICh2dG9mZiArIHZ0KSBsYXJnZXIgdGhhbiB0aGUgdnQgaW4gdGhlCi0JCQkJICogbGFzdCBwZXJpb2QgZm9yIGFsbCBjaGlsZHJlbi4KKwkJCQkgKiBpbml0aWFsaXplIGNsX3Z0IHRvIHRoZSBoaWdoZXN0IHZhbHVlIHNlZW4KKwkJCQkgKiBhbW9uZyB0aGUgc2libGluZ3MuIHRoaXMgaXMgYW5hbG9nb3VzIHRvCisJCQkJICogd2hhdCBjdXJfdGltZSB3b3VsZCBwcm92aWRlIGluIHJlYWx0aW1lIGNhc2UuCiAJCQkJICovCi0JCQkJdnQgPSBjbC0+Y2xfcGFyZW50LT5jbF9jdnRtYXg7Ci0JCQkJY2wtPmNsX3BhcmVudC0+Y2xfY3Z0b2ZmICs9IHZ0OwotCQkJCWNsLT5jbF9wYXJlbnQtPmNsX2N2dG1heCA9IDA7CisJCQkJY2wtPmNsX3Z0ID0gY2wtPmNsX3BhcmVudC0+Y2xfY3Z0b2ZmOwogCQkJCWNsLT5jbF9wYXJlbnQtPmNsX2N2dG1pbiA9IDA7Ci0JCQkJY2wtPmNsX3Z0ID0gMDsKIAkJCX0KIAotCQkJY2wtPmNsX3Z0b2ZmID0gY2wtPmNsX3BhcmVudC0+Y2xfY3Z0b2ZmIC0KLQkJCQkJCQljbC0+Y2xfcGN2dG9mZjsKLQogCQkJLyogdXBkYXRlIHRoZSB2aXJ0dWFsIGN1cnZlICovCi0JCQl2dCA9IGNsLT5jbF92dCArIGNsLT5jbF92dG9mZjsKLQkJCXJ0c2NfbWluKCZjbC0+Y2xfdmlydHVhbCwgJmNsLT5jbF9mc2MsIHZ0LAotCQkJCQkJICAgICAgY2wtPmNsX3RvdGFsKTsKLQkJCWlmIChjbC0+Y2xfdmlydHVhbC54ID09IHZ0KSB7Ci0JCQkJY2wtPmNsX3ZpcnR1YWwueCAtPSBjbC0+Y2xfdnRvZmY7Ci0JCQkJY2wtPmNsX3Z0b2ZmID0gMDsKLQkJCX0KKwkJCXJ0c2NfbWluKCZjbC0+Y2xfdmlydHVhbCwgJmNsLT5jbF9mc2MsIGNsLT5jbF92dCwgY2wtPmNsX3RvdGFsKTsKIAkJCWNsLT5jbF92dGFkaiA9IDA7CiAKIAkJCWNsLT5jbF92dHBlcmlvZCsrOyAgLyogaW5jcmVtZW50IHZ0IHBlcmlvZCAqLwpAQCAtNzQ1LDcgKzcyOCw2IEBACiAJCQkJLyogY29tcHV0ZSBteWYgKi8KIAkJCQljbC0+Y2xfbXlmID0gcnRzY195MngoJmNsLT5jbF91bGltaXQsCiAJCQkJCQkgICAgICBjbC0+Y2xfdG90YWwpOwotCQkJCWNsLT5jbF9teWZhZGogPSAwOwogCQkJfQogCQl9CiAKQEAgLTc3OSw4ICs3NjEsNyBAQAogCQkJZ29fcGFzc2l2ZSA9IDA7CiAKIAkJLyogdXBkYXRlIHZ0ICovCi0JCWNsLT5jbF92dCA9IHJ0c2NfeTJ4KCZjbC0+Y2xfdmlydHVhbCwgY2wtPmNsX3RvdGFsKQotCQkJICAgIC0gY2wtPmNsX3Z0b2ZmICsgY2wtPmNsX3Z0YWRqOworCQljbC0+Y2xfdnQgPSBydHNjX3kyeCgmY2wtPmNsX3ZpcnR1YWwsIGNsLT5jbF90b3RhbCkgKyBjbC0+Y2xfdnRhZGo7CiAKIAkJLyoKIAkJICogaWYgdnQgb2YgdGhlIGNsYXNzIGlzIHNtYWxsZXIgdGhhbiBjdnRtaW4sCkBAIC03OTUsOSArNzc2LDkgQEAKIAkJaWYgKGdvX3Bhc3NpdmUpIHsKIAkJCS8qIG5vIG1vcmUgYWN0aXZlIGNoaWxkLCBnb2luZyBwYXNzaXZlICovCiAKLQkJCS8qIHVwZGF0ZSBjdnRtYXggb2YgdGhlIHBhcmVudCBjbGFzcyAqLwotCQkJaWYgKGNsLT5jbF92dCA+IGNsLT5jbF9wYXJlbnQtPmNsX2N2dG1heCkKLQkJCQljbC0+Y2xfcGFyZW50LT5jbF9jdnRtYXggPSBjbC0+Y2xfdnQ7CisJCQkvKiB1cGRhdGUgY3Z0b2ZmIG9mIHRoZSBwYXJlbnQgY2xhc3MgKi8KKwkJCWlmIChjbC0+Y2xfdnQgPiBjbC0+Y2xfcGFyZW50LT5jbF9jdnRvZmYpCisJCQkJY2wtPmNsX3BhcmVudC0+Y2xfY3Z0b2ZmID0gY2wtPmNsX3Z0OwogCiAJCQkvKiByZW1vdmUgdGhpcyBjbGFzcyBmcm9tIHRoZSB2dCB0cmVlICovCiAJCQl2dHRyZWVfcmVtb3ZlKGNsKTsKQEAgLTgxMyw5ICs3OTQsMTAgQEAKIAogCQkvKiB1cGRhdGUgZiAqLwogCQlpZiAoY2wtPmNsX2ZsYWdzICYgSEZTQ19VU0MpIHsKKwkJCWNsLT5jbF9teWYgPSBydHNjX3kyeCgmY2wtPmNsX3VsaW1pdCwgY2wtPmNsX3RvdGFsKTsKKyNpZiAwCiAJCQljbC0+Y2xfbXlmID0gY2wtPmNsX215ZmFkaiArIHJ0c2NfeTJ4KCZjbC0+Y2xfdWxpbWl0LAogCQkJCQkJCSAgICAgIGNsLT5jbF90b3RhbCk7Ci0jaWYgMAogCQkJLyoKIAkJCSAqIFRoaXMgY29kZSBjYXVzZXMgY2xhc3NlcyB0byBzdGF5IHdheSB1bmRlciB0aGVpcgogCQkJICogbGltaXQgd2hlbiBtdWx0aXBsZSBjbGFzc2VzIGFyZSB1c2VkIGF0IGdpZ2FiaXQKQEAgLTk0MCw3ICs5MjIsNyBAQAogaGZzY19jaGFuZ2VfZnNjKHN0cnVjdCBoZnNjX2NsYXNzICpjbCwgc3RydWN0IHRjX3NlcnZpY2VfY3VydmUgKmZzYykKIHsKIAlzYzJpc2MoZnNjLCAmY2wtPmNsX2ZzYyk7Ci0JcnRzY19pbml0KCZjbC0+Y2xfdmlydHVhbCwgJmNsLT5jbF9mc2MsIGNsLT5jbF92dG9mZiArIGNsLT5jbF92dCwgY2wtPmNsX3RvdGFsKTsKKwlydHNjX2luaXQoJmNsLT5jbF92aXJ0dWFsLCAmY2wtPmNsX2ZzYywgY2wtPmNsX3Z0LCBjbC0+Y2xfdG90YWwpOwogCWNsLT5jbF9mbGFncyB8PSBIRlNDX0ZTQzsKIH0KIApAQCAtMTA5NCw3ICsxMDc2LDYgQEAKIAlpZiAocGFyZW50LT5sZXZlbCA9PSAwKQogCQloZnNjX3B1cmdlX3F1ZXVlKHNjaCwgcGFyZW50KTsKIAloZnNjX2FkanVzdF9sZXZlbHMocGFyZW50KTsKLQljbC0+Y2xfcGN2dG9mZiA9IHBhcmVudC0+Y2xfY3Z0b2ZmOwogCXNjaF90cmVlX3VubG9jayhzY2gpOwogCiAJcWRpc2NfY2xhc3NfaGFzaF9ncm93KHNjaCwgJnEtPmNsaGFzaCk7CkBAIC0xNDgyLDE2ICsxNDYzLDEyIEBACiAJY2wtPmNsX2UgICAgICAgICAgICA9IDA7CiAJY2wtPmNsX3Z0ICAgICAgICAgICA9IDA7CiAJY2wtPmNsX3Z0YWRqICAgICAgICA9IDA7Ci0JY2wtPmNsX3Z0b2ZmICAgICAgICA9IDA7CiAJY2wtPmNsX2N2dG1pbiAgICAgICA9IDA7Ci0JY2wtPmNsX2N2dG1heCAgICAgICA9IDA7CiAJY2wtPmNsX2N2dG9mZiAgICAgICA9IDA7Ci0JY2wtPmNsX3BjdnRvZmYgICAgICA9IDA7CiAJY2wtPmNsX3Z0cGVyaW9kICAgICA9IDA7CiAJY2wtPmNsX3BhcmVudHBlcmlvZCA9IDA7CiAJY2wtPmNsX2YgICAgICAgICAgICA9IDA7CiAJY2wtPmNsX215ZiAgICAgICAgICA9IDA7Ci0JY2wtPmNsX215ZmFkaiAgICAgICA9IDA7CiAJY2wtPmNsX2NmbWluICAgICAgICA9IDA7CiAJY2wtPmNsX25hY3RpdmUgICAgICA9IDA7CiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfaHRiLmMgYi9uZXQvc2NoZWQvc2NoX2h0Yi5jCmluZGV4IDUzZGJmYTEuLmM3OThkMGQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfaHRiLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9odGIuYwpAQCAtMTYyLDcgKzE2Miw3IEBACiAJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CiAKIAkvKiBub24gc2hhcGVkIHNrYnM7IGxldCB0aGVtIGdvIGRpcmVjdGx5IHRocnUgKi8KLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkCWRpcmVjdF9xdWV1ZTsKKwlzdHJ1Y3QgcWRpc2Nfc2tiX2hlYWQJZGlyZWN0X3F1ZXVlOwogCWxvbmcJCQlkaXJlY3RfcGt0czsKIAogCXN0cnVjdCBxZGlzY193YXRjaGRvZwl3YXRjaGRvZzsKQEAgLTU3MCw2ICs1NzAsMjIgQEAKIAlsaXN0X2RlbF9pbml0KCZjbC0+dW4ubGVhZi5kcm9wX2xpc3QpOwogfQogCitzdGF0aWMgdm9pZCBodGJfZW5xdWV1ZV90YWlsKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBRZGlzYyAqc2NoLAorCQkJICAgICBzdHJ1Y3QgcWRpc2Nfc2tiX2hlYWQgKnFoKQoreworCXN0cnVjdCBza19idWZmICpsYXN0ID0gcWgtPnRhaWw7CisKKwlpZiAobGFzdCkgeworCQlza2ItPm5leHQgPSBOVUxMOworCQlsYXN0LT5uZXh0ID0gc2tiOworCQlxaC0+dGFpbCA9IHNrYjsKKwl9IGVsc2UgeworCQlxaC0+dGFpbCA9IHNrYjsKKwkJcWgtPmhlYWQgPSBza2I7CisJfQorCXFoLT5xbGVuKys7Cit9CisKIHN0YXRpYyBpbnQgaHRiX2VucXVldWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFFkaXNjICpzY2gsCiAJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqKnRvX2ZyZWUpCiB7CkBAIC01ODAsNyArNTk2LDcgQEAKIAlpZiAoY2wgPT0gSFRCX0RJUkVDVCkgewogCQkvKiBlbnF1ZXVlIHRvIGhlbHBlciBxdWV1ZSAqLwogCQlpZiAocS0+ZGlyZWN0X3F1ZXVlLnFsZW4gPCBxLT5kaXJlY3RfcWxlbikgewotCQkJX19za2JfcXVldWVfdGFpbCgmcS0+ZGlyZWN0X3F1ZXVlLCBza2IpOworCQkJaHRiX2VucXVldWVfdGFpbChza2IsIHNjaCwgJnEtPmRpcmVjdF9xdWV1ZSk7CiAJCQlxLT5kaXJlY3RfcGt0cysrOwogCQl9IGVsc2UgewogCQkJcmV0dXJuIHFkaXNjX2Ryb3Aoc2tiLCBzY2gsIHRvX2ZyZWUpOwpAQCAtODg4LDcgKzkwNCw3IEBACiAJdW5zaWduZWQgbG9uZyBzdGFydF9hdDsKIAogCS8qIHRyeSB0byBkZXF1ZXVlIGRpcmVjdCBwYWNrZXRzIGFzIGhpZ2ggcHJpbyAoISkgdG8gbWluaW1pemUgY3B1IHdvcmsgKi8KLQlza2IgPSBfX3NrYl9kZXF1ZXVlKCZxLT5kaXJlY3RfcXVldWUpOworCXNrYiA9IF9fcWRpc2NfZGVxdWV1ZV9oZWFkKCZxLT5kaXJlY3RfcXVldWUpOwogCWlmIChza2IgIT0gTlVMTCkgewogb2s6CiAJCXFkaXNjX2JzdGF0c191cGRhdGUoc2NoLCBza2IpOwpAQCAtMTAxOSw3ICsxMDM1LDcgQEAKIAogCXFkaXNjX3dhdGNoZG9nX2luaXQoJnEtPndhdGNoZG9nLCBzY2gpOwogCUlOSVRfV09SSygmcS0+d29yaywgaHRiX3dvcmtfZnVuYyk7Ci0JX19za2JfcXVldWVfaGVhZF9pbml0KCZxLT5kaXJlY3RfcXVldWUpOworCXFkaXNjX3NrYl9oZWFkX2luaXQoJnEtPmRpcmVjdF9xdWV1ZSk7CiAKIAlpZiAodGJbVENBX0hUQl9ESVJFQ1RfUUxFTl0pCiAJCXEtPmRpcmVjdF9xbGVuID0gbmxhX2dldF91MzIodGJbVENBX0hUQl9ESVJFQ1RfUUxFTl0pOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9tcS5jIGIvbmV0L3NjaGVkL3NjaF9tcS5jCmluZGV4IGI5NDM5ODIuLjJiYzhkN2YgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfbXEuYworKysgYi9uZXQvc2NoZWQvc2NoX21xLmMKQEAgLTg4LDcgKzg4LDcgQEAKIAkJCXFkaXNjX2Rlc3Ryb3kob2xkKTsKICNpZmRlZiBDT05GSUdfTkVUX1NDSEVECiAJCWlmIChudHggPCBkZXYtPnJlYWxfbnVtX3R4X3F1ZXVlcykKLQkJCXFkaXNjX2xpc3RfYWRkKHFkaXNjKTsKKwkJCXFkaXNjX2hhc2hfYWRkKHFkaXNjKTsKICNlbmRpZgogCiAJfQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9tcXByaW8uYyBiL25ldC9zY2hlZC9zY2hfbXFwcmlvLmMKaW5kZXggNTQ5YzY2My4uYjVjNTAyYyAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9tcXByaW8uYworKysgYi9uZXQvc2NoZWQvc2NoX21xcHJpby5jCkBAIC0xODIsNyArMTgyLDcgQEAKIAkJaWYgKG9sZCkKIAkJCXFkaXNjX2Rlc3Ryb3kob2xkKTsKIAkJaWYgKG50eCA8IGRldi0+cmVhbF9udW1fdHhfcXVldWVzKQotCQkJcWRpc2NfbGlzdF9hZGQocWRpc2MpOworCQkJcWRpc2NfaGFzaF9hZGQocWRpc2MpOwogCX0KIAlrZnJlZShwcml2LT5xZGlzY3MpOwogCXByaXYtPnFkaXNjcyA9IE5VTEw7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX25ldGVtLmMgYi9uZXQvc2NoZWQvc2NoX25ldGVtLmMKaW5kZXggYWFhZjAyMS4uOWY3YjM4MCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9uZXRlbS5jCisrKyBiL25ldC9zY2hlZC9zY2hfbmV0ZW0uYwpAQCAtNDEzLDYgKzQxMywxNiBAQAogCXJldHVybiBzZWdzOwogfQogCitzdGF0aWMgdm9pZCBuZXRlbV9lbnF1ZXVlX3NrYl9oZWFkKHN0cnVjdCBxZGlzY19za2JfaGVhZCAqcWgsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc2tiLT5uZXh0ID0gcWgtPmhlYWQ7CisKKwlpZiAoIXFoLT5oZWFkKQorCQlxaC0+dGFpbCA9IHNrYjsKKwlxaC0+aGVhZCA9IHNrYjsKKwlxaC0+cWxlbisrOworfQorCiAvKgogICogSW5zZXJ0IG9uZSBza2IgaW50byBxZGlzYy4KICAqIE5vdGU6IHBhcmVudCBkZXBlbmRzIG9uIHJldHVybiB2YWx1ZSB0byBhY2NvdW50IGZvciBxdWV1ZSBsZW5ndGguCkBAIC01MDIsNyArNTEyLDcgQEAKIAkJCTE8PChwcmFuZG9tX3UzMigpICUgOCk7CiAJfQogCi0JaWYgKHVubGlrZWx5KHNrYl9xdWV1ZV9sZW4oJnNjaC0+cSkgPj0gc2NoLT5saW1pdCkpCisJaWYgKHVubGlrZWx5KHNjaC0+cS5xbGVuID49IHNjaC0+bGltaXQpKQogCQlyZXR1cm4gcWRpc2NfZHJvcChza2IsIHNjaCwgdG9fZnJlZSk7CiAKIAlxZGlzY19xc3RhdHNfYmFja2xvZ19pbmMoc2NoLCBza2IpOwpAQCAtNTIyLDggKzUzMiw4IEBACiAJCWlmIChxLT5yYXRlKSB7CiAJCQlzdHJ1Y3Qgc2tfYnVmZiAqbGFzdDsKIAotCQkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnNjaC0+cSkpCi0JCQkJbGFzdCA9IHNrYl9wZWVrX3RhaWwoJnNjaC0+cSk7CisJCQlpZiAoc2NoLT5xLnFsZW4pCisJCQkJbGFzdCA9IHNjaC0+cS50YWlsOwogCQkJZWxzZQogCQkJCWxhc3QgPSBuZXRlbV9yYl90b19za2IocmJfbGFzdCgmcS0+dF9yb290KSk7CiAJCQlpZiAobGFzdCkgewpAQCAtNTUyLDcgKzU2Miw3IEBACiAJCWNiLT50aW1lX3RvX3NlbmQgPSBwc2NoZWRfZ2V0X3RpbWUoKTsKIAkJcS0+Y291bnRlciA9IDA7CiAKLQkJX19za2JfcXVldWVfaGVhZCgmc2NoLT5xLCBza2IpOworCQluZXRlbV9lbnF1ZXVlX3NrYl9oZWFkKCZzY2gtPnEsIHNrYik7CiAJCXNjaC0+cXN0YXRzLnJlcXVldWVzKys7CiAJfQogCkBAIC01ODcsNyArNTk3LDcgQEAKIAlzdHJ1Y3QgcmJfbm9kZSAqcDsKIAogdGZpZm9fZGVxdWV1ZToKLQlza2IgPSBfX3NrYl9kZXF1ZXVlKCZzY2gtPnEpOworCXNrYiA9IF9fcWRpc2NfZGVxdWV1ZV9oZWFkKCZzY2gtPnEpOwogCWlmIChza2IpIHsKIAkJcWRpc2NfcXN0YXRzX2JhY2tsb2dfZGVjKHNjaCwgc2tiKTsKIGRlbGl2ZXI6CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX3BpZS5jIGIvbmV0L3NjaGVkL3NjaF9waWUuYwppbmRleCBhNTcwYjBiLi41YzNhOTlkIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX3BpZS5jCisrKyBiL25ldC9zY2hlZC9zY2hfcGllLmMKQEAgLTIzMSw3ICsyMzEsNyBAQAogCS8qIERyb3AgZXhjZXNzIHBhY2tldHMgaWYgbmV3IGxpbWl0IGlzIGxvd2VyICovCiAJcWxlbiA9IHNjaC0+cS5xbGVuOwogCXdoaWxlIChzY2gtPnEucWxlbiA+IHNjaC0+bGltaXQpIHsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IF9fc2tiX2RlcXVldWUoJnNjaC0+cSk7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBfX3FkaXNjX2RlcXVldWVfaGVhZCgmc2NoLT5xKTsKIAogCQlkcm9wcGVkICs9IHFkaXNjX3BrdF9sZW4oc2tiKTsKIAkJcWRpc2NfcXN0YXRzX2JhY2tsb2dfZGVjKHNjaCwgc2tiKTsKQEAgLTUxMSw3ICs1MTEsNyBAQAogc3RhdGljIHN0cnVjdCBza19idWZmICpwaWVfcWRpc2NfZGVxdWV1ZShzdHJ1Y3QgUWRpc2MgKnNjaCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXNrYiA9IF9fcWRpc2NfZGVxdWV1ZV9oZWFkKHNjaCwgJnNjaC0+cSk7CisJc2tiID0gcWRpc2NfZGVxdWV1ZV9oZWFkKHNjaCk7CiAKIAlpZiAoIXNrYikKIAkJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX3FmcS5jIGIvbmV0L3NjaGVkL3NjaF9xZnEuYwppbmRleCBmMjdmZmVlLi5jYTA1MTZlIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX3FmcS5jCisrKyBiL25ldC9zY2hlZC9zY2hfcWZxLmMKQEAgLTExNTMsNiArMTE1Myw3IEBACiAJaWYgKCFza2IpCiAJCXJldHVybiBOVUxMOwogCisJcWRpc2NfcXN0YXRzX2JhY2tsb2dfZGVjKHNjaCwgc2tiKTsKIAlzY2gtPnEucWxlbi0tOwogCXFkaXNjX2JzdGF0c191cGRhdGUoc2NoLCBza2IpOwogCkBAIC0xMjU2LDYgKzEyNTcsNyBAQAogCX0KIAogCWJzdGF0c191cGRhdGUoJmNsLT5ic3RhdHMsIHNrYik7CisJcWRpc2NfcXN0YXRzX2JhY2tsb2dfaW5jKHNjaCwgc2tiKTsKIAkrK3NjaC0+cS5xbGVuOwogCiAJYWdnID0gY2wtPmFnZzsKQEAgLTE0NzYsNiArMTQ3OCw3IEBACiAJCQlxZGlzY19yZXNldChjbC0+cWRpc2MpOwogCQl9CiAJfQorCXNjaC0+cXN0YXRzLmJhY2tsb2cgPSAwOwogCXNjaC0+cS5xbGVuID0gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9zZmIuYyBiL25ldC9zY2hlZC9zY2hfc2ZiLmMKaW5kZXggYWRkM2NjNy4uMjBhMzUwYiAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9zZmIuYworKysgYi9uZXQvc2NoZWQvc2NoX3NmYi5jCkBAIC00MDAsNiArNDAwLDcgQEAKIGVucXVldWU6CiAJcmV0ID0gcWRpc2NfZW5xdWV1ZShza2IsIGNoaWxkLCB0b19mcmVlKTsKIAlpZiAobGlrZWx5KHJldCA9PSBORVRfWE1JVF9TVUNDRVNTKSkgeworCQlxZGlzY19xc3RhdHNfYmFja2xvZ19pbmMoc2NoLCBza2IpOwogCQlzY2gtPnEucWxlbisrOwogCQlpbmNyZW1lbnRfcWxlbihza2IsIHEpOwogCX0gZWxzZSBpZiAobmV0X3htaXRfZHJvcF9jb3VudChyZXQpKSB7CkBAIC00MjgsNiArNDI5LDcgQEAKIAogCWlmIChza2IpIHsKIAkJcWRpc2NfYnN0YXRzX3VwZGF0ZShzY2gsIHNrYik7CisJCXFkaXNjX3FzdGF0c19iYWNrbG9nX2RlYyhzY2gsIHNrYik7CiAJCXNjaC0+cS5xbGVuLS07CiAJCWRlY3JlbWVudF9xbGVuKHNrYiwgcSk7CiAJfQpAQCAtNDUwLDYgKzQ1Miw3IEBACiAJc3RydWN0IHNmYl9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOwogCiAJcWRpc2NfcmVzZXQocS0+cWRpc2MpOworCXNjaC0+cXN0YXRzLmJhY2tsb2cgPSAwOwogCXNjaC0+cS5xbGVuID0gMDsKIAlxLT5zbG90ID0gMDsKIAlxLT5kb3VibGVfYnVmZmVyaW5nID0gZmFsc2U7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9hc3NvY2lvbGEuYyBiL25ldC9zY3RwL2Fzc29jaW9sYS5jCmluZGV4IDFjMjMwNjAuLmYxMGQzMzkgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2Fzc29jaW9sYS5jCisrKyBiL25ldC9zY3RwL2Fzc29jaW9sYS5jCkBAIC0xNDA4LDcgKzE0MDgsNyBAQAogCQkJCXRyYW5zcG9ydHMpIHsKIAkJaWYgKHQtPnBtdHVfcGVuZGluZyAmJiB0LT5kc3QpIHsKIAkJCXNjdHBfdHJhbnNwb3J0X3VwZGF0ZV9wbXR1KHNrLCB0LAotCQkJCQkJICAgV09SRF9UUlVOQyhkc3RfbXR1KHQtPmRzdCkpKTsKKwkJCQkJCSAgIFNDVFBfVFJVTkM0KGRzdF9tdHUodC0+ZHN0KSkpOwogCQkJdC0+cG10dV9wZW5kaW5nID0gMDsKIAkJfQogCQlpZiAoIXBtdHUgfHwgKHQtPnBhdGhtdHUgPCBwbXR1KSkKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2F1dGguYyBiL25ldC9zY3RwL2F1dGguYwppbmRleCA5MTJlYjE2Li5mOTlkNDg1IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9hdXRoLmMKKysrIGIvbmV0L3NjdHAvYXV0aC5jCkBAIC00OCw3ICs0OCw3IEBACiAJCS8qIGlkIDIgaXMgcmVzZXJ2ZWQgYXMgd2VsbCAqLwogCQkuaG1hY19pZCA9IFNDVFBfQVVUSF9ITUFDX0lEX1JFU0VSVkVEXzIsCiAJfSwKLSNpZiBkZWZpbmVkIChDT05GSUdfQ1JZUFRPX1NIQTI1NikgfHwgZGVmaW5lZCAoQ09ORklHX0NSWVBUT19TSEEyNTZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0NSWVBUT19TSEEyNTYpCiAJewogCQkuaG1hY19pZCA9IFNDVFBfQVVUSF9ITUFDX0lEX1NIQTI1NiwKIAkJLmhtYWNfbmFtZSA9ICJobWFjKHNoYTI1NikiLApkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvY2h1bmsuYyBiL25ldC9zY3RwL2NodW5rLmMKaW5kZXggYTU1ZTU0Ny4uN2ExY2RmNCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvY2h1bmsuYworKysgYi9uZXQvc2N0cC9jaHVuay5jCkBAIC03MCw2ICs3MCwxOSBAQAogCXJldHVybiBtc2c7CiB9CiAKK3ZvaWQgc2N0cF9kYXRhbXNnX2ZyZWUoc3RydWN0IHNjdHBfZGF0YW1zZyAqbXNnKQoreworCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuazsKKworCS8qIFRoaXMgZG9lc24ndCBoYXZlIHRvIGJlIGEgX3NhZmUgdmFpcmFudCBiZWNhdXNlCisJICogc2N0cF9jaHVua19mcmVlKCkgb25seSBkcm9wcyB0aGUgcmVmcy4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNodW5rLCAmbXNnLT5jaHVua3MsIGZyYWdfbGlzdCkKKwkJc2N0cF9jaHVua19mcmVlKGNodW5rKTsKKworCXNjdHBfZGF0YW1zZ19wdXQobXNnKTsKK30KKwogLyogRmluYWwgZGVzdHJ1Y3RydWN0aW9uIG9mIGRhdGFtc2cgbWVtb3J5LiAqLwogc3RhdGljIHZvaWQgc2N0cF9kYXRhbXNnX2Rlc3Ryb3koc3RydWN0IHNjdHBfZGF0YW1zZyAqbXNnKQogewpAQCAtMTc5LDEyICsxOTIsMTggQEAKIAkJCSBtc2csIG1zZy0+ZXhwaXJlc19hdCwgamlmZmllcyk7CiAJfQogCisJaWYgKGFzb2MtPnBlZXIucHJzY3RwX2NhcGFibGUgJiYKKwkgICAgU0NUUF9QUl9UVExfRU5BQkxFRChzaW5mby0+c2luZm9fZmxhZ3MpKQorCQltc2ctPmV4cGlyZXNfYXQgPQorCQkJamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoc2luZm8tPnNpbmZvX3RpbWV0b2xpdmUpOworCiAJLyogVGhpcyBpcyB0aGUgYmlnZ2VzdCBwb3NzaWJsZSBEQVRBIGNodW5rIHRoYXQgY2FuIGZpdCBpbnRvCiAJICogdGhlIHBhY2tldAogCSAqLwotCW1heF9kYXRhID0gKGFzb2MtPnBhdGhtdHUgLQotCQlzY3RwX3NrKGFzb2MtPmJhc2Uuc2spLT5wZi0+YWYtPm5ldF9oZWFkZXJfbGVuIC0KLQkJc2l6ZW9mKHN0cnVjdCBzY3RwaGRyKSAtIHNpemVvZihzdHJ1Y3Qgc2N0cF9kYXRhX2NodW5rKSkgJiB+MzsKKwltYXhfZGF0YSA9IGFzb2MtPnBhdGhtdHUgLQorCQkgICBzY3RwX3NrKGFzb2MtPmJhc2Uuc2spLT5wZi0+YWYtPm5ldF9oZWFkZXJfbGVuIC0KKwkJICAgc2l6ZW9mKHN0cnVjdCBzY3RwaGRyKSAtIHNpemVvZihzdHJ1Y3Qgc2N0cF9kYXRhX2NodW5rKTsKKwltYXhfZGF0YSA9IFNDVFBfVFJVTkM0KG1heF9kYXRhKTsKIAogCW1heCA9IGFzb2MtPmZyYWdfcG9pbnQ7CiAJLyogSWYgdGhlIHRoZSBwZWVyIHJlcXVlc3RlZCB0aGF0IHdlIGF1dGhlbnRpY2F0ZSBEQVRBIGNodW5rcwpAQCAtMTk1LDggKzIxNCw4IEBACiAJCXN0cnVjdCBzY3RwX2htYWMgKmhtYWNfZGVzYyA9IHNjdHBfYXV0aF9hc29jX2dldF9obWFjKGFzb2MpOwogCiAJCWlmIChobWFjX2Rlc2MpCi0JCQltYXhfZGF0YSAtPSBXT1JEX1JPVU5EKHNpemVvZihzY3RwX2F1dGhfY2h1bmtfdCkgKwotCQkJCQkgICAgaG1hY19kZXNjLT5obWFjX2xlbik7CisJCQltYXhfZGF0YSAtPSBTQ1RQX1BBRDQoc2l6ZW9mKHNjdHBfYXV0aF9jaHVua190KSArCisJCQkJCSAgICAgIGhtYWNfZGVzYy0+aG1hY19sZW4pOwogCX0KIAogCS8qIE5vdywgY2hlY2sgaWYgd2UgbmVlZCB0byByZWR1Y2Ugb3VyIG1heCAqLwpAQCAtMjE2LDcgKzIzNSw3IEBACiAJICAgIGFzb2MtPm91dHF1ZXVlLm91dF9xbGVuID09IDAgJiYKIAkgICAgbGlzdF9lbXB0eSgmYXNvYy0+b3V0cXVldWUucmV0cmFuc21pdCkgJiYKIAkgICAgbXNnX2xlbiA+IG1heCkKLQkJbWF4X2RhdGEgLT0gV09SRF9ST1VORChzaXplb2Yoc2N0cF9zYWNrX2NodW5rX3QpKTsKKwkJbWF4X2RhdGEgLT0gU0NUUF9QQUQ0KHNpemVvZihzY3RwX3NhY2tfY2h1bmtfdCkpOwogCiAJLyogRW5jb3VyYWdlIENvb2tpZS1FQ0hPIGJ1bmRsaW5nLiAqLwogCWlmIChhc29jLT5zdGF0ZSA8IFNDVFBfU1RBVEVfQ09PS0lFX0VDSE9FRCkKQEAgLTMzNSw3ICszNTQsNyBAQAogLyogQ2hlY2sgd2hldGhlciB0aGlzIG1lc3NhZ2UgaGFzIGV4cGlyZWQuICovCiBpbnQgc2N0cF9jaHVua19hYmFuZG9uZWQoc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rKQogewotCWlmICghY2h1bmstPmFzb2MtPnByc2N0cF9lbmFibGUgfHwKKwlpZiAoIWNodW5rLT5hc29jLT5wZWVyLnByc2N0cF9jYXBhYmxlIHx8CiAJICAgICFTQ1RQX1BSX1BPTElDWShjaHVuay0+c2luZm8uc2luZm9fZmxhZ3MpKSB7CiAJCXN0cnVjdCBzY3RwX2RhdGFtc2cgKm1zZyA9IGNodW5rLT5tc2c7CiAKQEAgLTM0OSwxNCArMzY4LDE0IEBACiAJfQogCiAJaWYgKFNDVFBfUFJfVFRMX0VOQUJMRUQoY2h1bmstPnNpbmZvLnNpbmZvX2ZsYWdzKSAmJgotCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIGNodW5rLT5wcnNjdHBfcGFyYW0pKSB7CisJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgY2h1bmstPm1zZy0+ZXhwaXJlc19hdCkpIHsKIAkJaWYgKGNodW5rLT5zZW50X2NvdW50KQogCQkJY2h1bmstPmFzb2MtPmFiYW5kb25lZF9zZW50W1NDVFBfUFJfSU5ERVgoVFRMKV0rKzsKIAkJZWxzZQogCQkJY2h1bmstPmFzb2MtPmFiYW5kb25lZF91bnNlbnRbU0NUUF9QUl9JTkRFWChUVEwpXSsrOwogCQlyZXR1cm4gMTsKIAl9IGVsc2UgaWYgKFNDVFBfUFJfUlRYX0VOQUJMRUQoY2h1bmstPnNpbmZvLnNpbmZvX2ZsYWdzKSAmJgotCQkgICBjaHVuay0+c2VudF9jb3VudCA+IGNodW5rLT5wcnNjdHBfcGFyYW0pIHsKKwkJICAgY2h1bmstPnNlbnRfY291bnQgPiBjaHVuay0+c2luZm8uc2luZm9fdGltZXRvbGl2ZSkgewogCQljaHVuay0+YXNvYy0+YWJhbmRvbmVkX3NlbnRbU0NUUF9QUl9JTkRFWChSVFgpXSsrOwogCQlyZXR1cm4gMTsKIAl9CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9pbnB1dC5jIGIvbmV0L3NjdHAvaW5wdXQuYwppbmRleCBjMTgyZGI3Li5hMmVhMWQxIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9pbnB1dC5jCisrKyBiL25ldC9zY3RwL2lucHV0LmMKQEAgLTExOSw3ICsxMTksMTMgQEAKIAkJICAgICAgIHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikpCiAJCWdvdG8gZGlzY2FyZF9pdDsKIAotCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3Qgc2N0cGhkcikpKQorCS8qIElmIHRoZSBwYWNrZXQgaXMgZnJhZ21lbnRlZCBhbmQgd2UgbmVlZCB0byBkbyBjcmMgY2hlY2tpbmcsCisJICogaXQncyBiZXR0ZXIgdG8ganVzdCBsaW5lYXJpemUgaXQgb3RoZXJ3aXNlIGNyYyBjb21wdXRpbmcKKwkgKiB0YWtlcyBsb25nZXIuCisJICovCisJaWYgKCghKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUgJiBTS0JfR1NPX1NDVFApICYmCisJICAgICBza2JfbGluZWFyaXplKHNrYikpIHx8CisJICAgICFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBzY3RwaGRyKSkpCiAJCWdvdG8gZGlzY2FyZF9pdDsKIAogCS8qIFB1bGwgdXAgdGhlIElQIGhlYWRlci4gKi8KQEAgLTU5OSw3ICs2MDUsNyBAQAogCQkvKiBQTVRVIGRpc2NvdmVyeSAoUkZDMTE5MSkgKi8KIAkJaWYgKElDTVBfRlJBR19ORUVERUQgPT0gY29kZSkgewogCQkJc2N0cF9pY21wX2ZyYWdfbmVlZGVkKHNrLCBhc29jLCB0cmFuc3BvcnQsCi0JCQkJCSAgICAgIFdPUkRfVFJVTkMoaW5mbykpOworCQkJCQkgICAgICBTQ1RQX1RSVU5DNChpbmZvKSk7CiAJCQlnb3RvIG91dF91bmxvY2s7CiAJCX0gZWxzZSB7CiAJCQlpZiAoSUNNUF9QUk9UX1VOUkVBQ0ggPT0gY29kZSkgewpAQCAtNjY3LDcgKzY3Myw3IEBACiAJCWlmIChudG9ocyhjaC0+bGVuZ3RoKSA8IHNpemVvZihzY3RwX2NodW5raGRyX3QpKQogCQkJYnJlYWs7CiAKLQkJY2hfZW5kID0gb2Zmc2V0ICsgV09SRF9ST1VORChudG9ocyhjaC0+bGVuZ3RoKSk7CisJCWNoX2VuZCA9IG9mZnNldCArIFNDVFBfUEFENChudG9ocyhjaC0+bGVuZ3RoKSk7CiAJCWlmIChjaF9lbmQgPiBza2ItPmxlbikKIAkJCWJyZWFrOwogCkBAIC03OTAsMjcgKzc5NiwzNCBAQAogc3RhdGljIGlubGluZSBpbnQgc2N0cF9oYXNoX2NtcChzdHJ1Y3Qgcmhhc2h0YWJsZV9jb21wYXJlX2FyZyAqYXJnLAogCQkJCWNvbnN0IHZvaWQgKnB0cikKIHsKKwlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnQgPSAoc3RydWN0IHNjdHBfdHJhbnNwb3J0ICopcHRyOwogCWNvbnN0IHN0cnVjdCBzY3RwX2hhc2hfY21wX2FyZyAqeCA9IGFyZy0+a2V5OwotCWNvbnN0IHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdCA9IHB0cjsKLQlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYyA9IHQtPmFzb2M7Ci0JY29uc3Qgc3RydWN0IG5ldCAqbmV0ID0geC0+bmV0OworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOworCWludCBlcnIgPSAxOwogCiAJaWYgKCFzY3RwX2NtcF9hZGRyX2V4YWN0KCZ0LT5pcGFkZHIsIHgtPnBhZGRyKSkKLQkJcmV0dXJuIDE7Ci0JaWYgKCFuZXRfZXEoc29ja19uZXQoYXNvYy0+YmFzZS5zayksIG5ldCkpCi0JCXJldHVybiAxOworCQlyZXR1cm4gZXJyOworCWlmICghc2N0cF90cmFuc3BvcnRfaG9sZCh0KSkKKwkJcmV0dXJuIGVycjsKKworCWFzb2MgPSB0LT5hc29jOworCWlmICghbmV0X2VxKHNvY2tfbmV0KGFzb2MtPmJhc2Uuc2spLCB4LT5uZXQpKQorCQlnb3RvIG91dDsKIAlpZiAoeC0+ZXApIHsKIAkJaWYgKHgtPmVwICE9IGFzb2MtPmVwKQotCQkJcmV0dXJuIDE7CisJCQlnb3RvIG91dDsKIAl9IGVsc2UgewogCQlpZiAoeC0+bGFkZHItPnY0LnNpbl9wb3J0ICE9IGh0b25zKGFzb2MtPmJhc2UuYmluZF9hZGRyLnBvcnQpKQotCQkJcmV0dXJuIDE7CisJCQlnb3RvIG91dDsKIAkJaWYgKCFzY3RwX2JpbmRfYWRkcl9tYXRjaCgmYXNvYy0+YmFzZS5iaW5kX2FkZHIsCiAJCQkJCSAgeC0+bGFkZHIsIHNjdHBfc2soYXNvYy0+YmFzZS5zaykpKQotCQkJcmV0dXJuIDE7CisJCQlnb3RvIG91dDsKIAl9CiAKLQlyZXR1cm4gMDsKKwllcnIgPSAwOworb3V0OgorCXNjdHBfdHJhbnNwb3J0X3B1dCh0KTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW5saW5lIHUzMiBzY3RwX2hhc2hfb2JqKGNvbnN0IHZvaWQgKmRhdGEsIHUzMiBsZW4sIHUzMiBzZWVkKQpAQCAtMTExNSw3ICsxMTI4LDcgQEAKIAkJaWYgKG50b2hzKGNoLT5sZW5ndGgpIDwgc2l6ZW9mKHNjdHBfY2h1bmtoZHJfdCkpCiAJCQlicmVhazsKIAotCQljaF9lbmQgPSAoKF9fdTggKiljaCkgKyBXT1JEX1JPVU5EKG50b2hzKGNoLT5sZW5ndGgpKTsKKwkJY2hfZW5kID0gKChfX3U4ICopY2gpICsgU0NUUF9QQUQ0KG50b2hzKGNoLT5sZW5ndGgpKTsKIAkJaWYgKGNoX2VuZCA+IHNrYl90YWlsX3BvaW50ZXIoc2tiKSkKIAkJCWJyZWFrOwogCkBAIC0xMTc3LDkgKzExOTAsNiBAQAogCWlmICgoc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSAmIFNLQl9HU09fU0NUUCkgPT0gU0tCX0dTT19TQ1RQKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmIChza2JfbGluZWFyaXplKHNrYikpCi0JCXJldHVybiBOVUxMOwotCiAJY2ggPSAoc2N0cF9jaHVua2hkcl90ICopIHNrYi0+ZGF0YTsKIAogCS8qIFRoZSBjb2RlIGJlbG93IHdpbGwgYXR0ZW1wdCB0byB3YWxrIHRoZSBjaHVuayBhbmQgZXh0cmFjdApAQCAtMTE4Nyw3ICsxMTk3LDcgQEAKIAkgKiB0aGF0IHRoZSBjaHVuayBsZW5ndGggZG9lc24ndCBjYXVzZSBvdmVyZmxvdy4gIE90aGVyd2lzZSwgd2UnbGwKIAkgKiB3YWxrIG9mZiB0aGUgZW5kLgogCSAqLwotCWlmIChXT1JEX1JPVU5EKG50b2hzKGNoLT5sZW5ndGgpKSA+IHNrYi0+bGVuKQorCWlmIChTQ1RQX1BBRDQobnRvaHMoY2gtPmxlbmd0aCkpID4gc2tiLT5sZW4pCiAJCXJldHVybiBOVUxMOwogCiAJLyogSWYgdGhpcyBpcyBJTklUL0lOSVQtQUNLIGxvb2sgaW5zaWRlIHRoZSBjaHVuayB0b28uICovCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9pbnF1ZXVlLmMgYi9uZXQvc2N0cC9pbnF1ZXVlLmMKaW5kZXggYzMwZGRiMC4uZjczMWRlMyAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvaW5xdWV1ZS5jCisrKyBiL25ldC9zY3RwL2lucXVldWUuYwpAQCAtMTcwLDE5ICsxNzAsNiBAQAogCiAJCWNodW5rID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHNjdHBfY2h1bmssIGxpc3QpOwogCi0JCS8qIExpbmVhcml6ZSBpZiBpdCdzIG5vdCBHU08gKi8KLQkJaWYgKChza2Jfc2hpbmZvKGNodW5rLT5za2IpLT5nc29fdHlwZSAmIFNLQl9HU09fU0NUUCkgIT0gU0tCX0dTT19TQ1RQICYmCi0JCSAgICBza2JfaXNfbm9ubGluZWFyKGNodW5rLT5za2IpKSB7Ci0JCQlpZiAoc2tiX2xpbmVhcml6ZShjaHVuay0+c2tiKSkgewotCQkJCV9fU0NUUF9JTkNfU1RBVFMoZGV2X25ldChjaHVuay0+c2tiLT5kZXYpLCBTQ1RQX01JQl9JTl9QS1RfRElTQ0FSRFMpOwotCQkJCXNjdHBfY2h1bmtfZnJlZShjaHVuayk7Ci0JCQkJZ290byBuZXh0X2NodW5rOwotCQkJfQotCi0JCQkvKiBVcGRhdGUgc2N0cF9oZHIgYXMgaXQgcHJvYmFibHkgY2hhbmdlZCAqLwotCQkJY2h1bmstPnNjdHBfaGRyID0gc2N0cF9oZHIoY2h1bmstPnNrYik7Ci0JCX0KLQogCQlpZiAoKHNrYl9zaGluZm8oY2h1bmstPnNrYiktPmdzb190eXBlICYgU0tCX0dTT19TQ1RQKSA9PSBTS0JfR1NPX1NDVFApIHsKIAkJCS8qIEdTTy1tYXJrZWQgc2ticyBidXQgd2l0aG91dCBmcmFncywgaGFuZGxlCiAJCQkgKiB0aGVtIG5vcm1hbGx5CkBAIC0yMjYsNyArMjEzLDcgQEAKIAl9CiAKIAljaHVuay0+Y2h1bmtfaGRyID0gY2g7Ci0JY2h1bmstPmNodW5rX2VuZCA9ICgoX191OCAqKWNoKSArIFdPUkRfUk9VTkQobnRvaHMoY2gtPmxlbmd0aCkpOworCWNodW5rLT5jaHVua19lbmQgPSAoKF9fdTggKiljaCkgKyBTQ1RQX1BBRDQobnRvaHMoY2gtPmxlbmd0aCkpOwogCXNrYl9wdWxsKGNodW5rLT5za2IsIHNpemVvZihzY3RwX2NodW5raGRyX3QpKTsKIAljaHVuay0+c3ViaC52ID0gTlVMTDsgLyogU3ViaGVhZGVyIGlzIG5vIGxvbmdlciB2YWxpZC4gICovCiAKZGlmZiAtLWdpdCBhL25ldC9zY3RwL291dHB1dC5jIGIvbmV0L3NjdHAvb3V0cHV0LmMKaW5kZXggMWYxNjgyYi4uMmE1YzE4OSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvb3V0cHV0LmMKKysrIGIvbmV0L3NjdHAvb3V0cHV0LmMKQEAgLTE4MCw3ICsxODAsNiBAQAogCQkJCSAgICAgICBpbnQgb25lX3BhY2tldCwgZ2ZwX3QgZ2ZwKQogewogCXNjdHBfeG1pdF90IHJldHZhbDsKLQlpbnQgZXJyb3IgPSAwOwogCiAJcHJfZGVidWcoIiVzOiBwYWNrZXQ6JXAgc2l6ZTolWnUgY2h1bms6JXAgc2l6ZTolZFxuIiwgX19mdW5jX18sCiAJCSBwYWNrZXQsIHBhY2tldC0+c2l6ZSwgY2h1bmssIGNodW5rLT5za2IgPyBjaHVuay0+c2tiLT5sZW4gOiAtMSk7CkBAIC0xODgsNiArMTg3LDggQEAKIAlzd2l0Y2ggKChyZXR2YWwgPSAoc2N0cF9wYWNrZXRfYXBwZW5kX2NodW5rKHBhY2tldCwgY2h1bmspKSkpIHsKIAljYXNlIFNDVFBfWE1JVF9QTVRVX0ZVTEw6CiAJCWlmICghcGFja2V0LT5oYXNfY29va2llX2VjaG8pIHsKKwkJCWludCBlcnJvciA9IDA7CisKIAkJCWVycm9yID0gc2N0cF9wYWNrZXRfdHJhbnNtaXQocGFja2V0LCBnZnApOwogCQkJaWYgKGVycm9yIDwgMCkKIAkJCQljaHVuay0+c2tiLT5zay0+c2tfZXJyID0gLWVycm9yOwpAQCAtMjk2LDcgKzI5Nyw3IEBACiAJCQkJCSAgICAgIHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaykKIHsKIAlzY3RwX3htaXRfdCByZXR2YWwgPSBTQ1RQX1hNSVRfT0s7Ci0JX191MTYgY2h1bmtfbGVuID0gV09SRF9ST1VORChudG9ocyhjaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGgpKTsKKwlfX3UxNiBjaHVua19sZW4gPSBTQ1RQX1BBRDQobnRvaHMoY2h1bmstPmNodW5rX2hkci0+bGVuZ3RoKSk7CiAKIAkvKiBDaGVjayB0byBzZWUgaWYgdGhpcyBjaHVuayB3aWxsIGZpdCBpbnRvIHRoZSBwYWNrZXQgKi8KIAlyZXR2YWwgPSBzY3RwX3BhY2tldF93aWxsX2ZpdChwYWNrZXQsIGNodW5rLCBjaHVua19sZW4pOwpAQCAtNDQxLDE0ICs0NDIsMTQgQEAKIAkJCSAqIHRpbWUuIEFwcGxpY2F0aW9uIG1heSBub3RpY2UgdGhpcyBlcnJvci4KIAkJCSAqLwogCQkJcHJfZXJyX29uY2UoIlRyeWluZyB0byBHU08gYnV0IHVuZGVybHlpbmcgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBpdC4iKTsKLQkJCWdvdG8gbm9tZW07CisJCQlnb3RvIGVycjsKIAkJfQogCX0gZWxzZSB7CiAJCXBrdF9zaXplID0gcGFja2V0LT5zaXplOwogCX0KIAloZWFkID0gYWxsb2Nfc2tiKHBrdF9zaXplICsgTUFYX0hFQURFUiwgZ2ZwKTsKIAlpZiAoIWhlYWQpCi0JCWdvdG8gbm9tZW07CisJCWdvdG8gZXJyOwogCWlmIChnc28pIHsKIAkJTkFQSV9HUk9fQ0IoaGVhZCktPmxhc3QgPSBoZWFkOwogCQlza2Jfc2hpbmZvKGhlYWQpLT5nc29fdHlwZSA9IHNrLT5za19nc29fdHlwZTsKQEAgLTQ2OSw4ICs0NzAsMTIgQEAKIAkJfQogCX0KIAlkc3QgPSBkc3RfY2xvbmUodHAtPmRzdCk7Ci0JaWYgKCFkc3QpCi0JCWdvdG8gbm9fcm91dGU7CisJaWYgKCFkc3QpIHsKKwkJaWYgKGFzb2MpCisJCQlJUF9JTkNfU1RBVFMoc29ja19uZXQoYXNvYy0+YmFzZS5zayksCisJCQkJICAgICBJUFNUQVRTX01JQl9PVVROT1JPVVRFUyk7CisJCWdvdG8gbm9kc3Q7CisJfQogCXNrYl9kc3Rfc2V0KGhlYWQsIGRzdCk7CiAKIAkvKiBCdWlsZCB0aGUgU0NUUCBoZWFkZXIuICAqLwpAQCAtNTAzLDcgKzUwOCw3IEBACiAJCWlmIChnc28pIHsKIAkJCXBrdF9zaXplID0gcGFja2V0LT5vdmVyaGVhZDsKIAkJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2h1bmssICZwYWNrZXQtPmNodW5rX2xpc3QsIGxpc3QpIHsKLQkJCQlpbnQgcGFkZGVkID0gV09SRF9ST1VORChjaHVuay0+c2tiLT5sZW4pOworCQkJCWludCBwYWRkZWQgPSBTQ1RQX1BBRDQoY2h1bmstPnNrYi0+bGVuKTsKIAogCQkJCWlmIChwa3Rfc2l6ZSArIHBhZGRlZCA+IHRwLT5wYXRobXR1KQogCQkJCQlicmVhazsKQEAgLTUzMyw3ICs1MzgsNyBAQAogCQkgKiBpbmNsdWRlZCBpbiB0aGUgY2h1bmsgbGVuZ3RoIGZpZWxkLiAgVGhlIHNlbmRlciBzaG91bGQKIAkJICogbmV2ZXIgcGFkIHdpdGggbW9yZSB0aGFuIDMgYnl0ZXMuCiAJCSAqCi0JCSAqIFtUaGlzIHdob2xlIGNvbW1lbnQgZXhwbGFpbnMgV09SRF9ST1VORCgpIGJlbG93Ll0KKwkJICogW1RoaXMgd2hvbGUgY29tbWVudCBleHBsYWlucyBTQ1RQX1BBRDQoKSBiZWxvdy5dCiAJCSAqLwogCiAJCXBrdF9zaXplIC09IHBhY2tldC0+b3ZlcmhlYWQ7CkBAIC01NTUsNyArNTYwLDcgQEAKIAkJCQloYXNfZGF0YSA9IDE7CiAJCQl9CiAKLQkJCXBhZGRpbmcgPSBXT1JEX1JPVU5EKGNodW5rLT5za2ItPmxlbikgLSBjaHVuay0+c2tiLT5sZW47CisJCQlwYWRkaW5nID0gU0NUUF9QQUQ0KGNodW5rLT5za2ItPmxlbikgLSBjaHVuay0+c2tiLT5sZW47CiAJCQlpZiAocGFkZGluZykKIAkJCQltZW1zZXQoc2tiX3B1dChjaHVuay0+c2tiLCBwYWRkaW5nKSwgMCwgcGFkZGluZyk7CiAKQEAgLTU4Miw3ICs1ODcsNyBAQAogCQkJICogYWNrbm93bGVkZ2VkIG9yIGhhdmUgZmFpbGVkLgogCQkJICogUmUtcXVldWUgYXV0aCBjaHVua3MgaWYgbmVlZGVkLgogCQkJICovCi0JCQlwa3Rfc2l6ZSAtPSBXT1JEX1JPVU5EKGNodW5rLT5za2ItPmxlbik7CisJCQlwa3Rfc2l6ZSAtPSBTQ1RQX1BBRDQoY2h1bmstPnNrYi0+bGVuKTsKIAogCQkJaWYgKCFzY3RwX2NodW5rX2lzX2RhdGEoY2h1bmspICYmIGNodW5rICE9IHBhY2tldC0+YXV0aCkKIAkJCQlzY3RwX2NodW5rX2ZyZWUoY2h1bmspOwpAQCAtNjIxLDggKzYyNiwxMCBAQAogCQlpZiAoIWdzbykKIAkJCWJyZWFrOwogCi0JCWlmIChza2JfZ3JvX3JlY2VpdmUoJmhlYWQsIG5za2IpKQorCQlpZiAoc2tiX2dyb19yZWNlaXZlKCZoZWFkLCBuc2tiKSkgeworCQkJa2ZyZWVfc2tiKG5za2IpOwogCQkJZ290byBub21lbTsKKwkJfQogCQluc2tiID0gTlVMTDsKIAkJaWYgKFdBUk5fT05fT05DRShza2Jfc2hpbmZvKGhlYWQpLT5nc29fc2VncyA+PQogCQkJCSBzay0+c2tfZ3NvX21heF9zZWdzKSkKQEAgLTcxNiwxOCArNzIzLDEzIEBACiAJfQogCWhlYWQtPmlnbm9yZV9kZiA9IHBhY2tldC0+aXBmcmFnb2s7CiAJdHAtPmFmX3NwZWNpZmljLT5zY3RwX3htaXQoaGVhZCwgdHApOworCWdvdG8gb3V0OwogCi1vdXQ6Ci0Jc2N0cF9wYWNrZXRfcmVzZXQocGFja2V0KTsKLQlyZXR1cm4gZXJyOwotbm9fcm91dGU6Ci0Ja2ZyZWVfc2tiKGhlYWQpOwotCWlmIChuc2tiICE9IGhlYWQpCi0JCWtmcmVlX3NrYihuc2tiKTsKK25vbWVtOgorCWlmIChwYWNrZXQtPmF1dGggJiYgbGlzdF9lbXB0eSgmcGFja2V0LT5hdXRoLT5saXN0KSkKKwkJc2N0cF9jaHVua19mcmVlKHBhY2tldC0+YXV0aCk7CiAKLQlpZiAoYXNvYykKLQkJSVBfSU5DX1NUQVRTKHNvY2tfbmV0KGFzb2MtPmJhc2Uuc2spLCBJUFNUQVRTX01JQl9PVVROT1JPVVRFUyk7Ci0KK25vZHN0OgogCS8qIEZJWE1FOiBSZXR1cm5pbmcgdGhlICdlcnInIHdpbGwgZWZmZWN0IGFsbCB0aGUgYXNzb2NpYXRpb25zCiAJICogYXNzb2NpYXRlZCB3aXRoIGEgc29ja2V0LCBhbHRob3VnaCBvbmx5IG9uZSBvZiB0aGUgcGF0aHMgb2YgdGhlCiAJICogYXNzb2NpYXRpb24gaXMgdW5yZWFjaGFibGUuCkBAIC03MzYsMjIgKzczOCwxOCBAQAogCSAqIHJlcXVpcmVkLgogCSAqLwogCSAvKiBlcnIgPSAtRUhPU1RVTlJFQUNIOyAqLwotZXJyOgotCS8qIENvbnRyb2wgY2h1bmtzIGFyZSB1bnJlbGlhYmxlIHNvIGp1c3QgZHJvcCB0aGVtLiAgREFUQSBjaHVua3MKLQkgKiB3aWxsIGdldCByZXNlbnQgb3IgZHJvcHBlZCBsYXRlci4KLQkgKi8KKwlrZnJlZV9za2IoaGVhZCk7CiAKK2VycjoKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2h1bmssIHRtcCwgJnBhY2tldC0+Y2h1bmtfbGlzdCwgbGlzdCkgewogCQlsaXN0X2RlbF9pbml0KCZjaHVuay0+bGlzdCk7CiAJCWlmICghc2N0cF9jaHVua19pc19kYXRhKGNodW5rKSkKIAkJCXNjdHBfY2h1bmtfZnJlZShjaHVuayk7CiAJfQotCWdvdG8gb3V0Owotbm9tZW06Ci0JaWYgKHBhY2tldC0+YXV0aCAmJiBsaXN0X2VtcHR5KCZwYWNrZXQtPmF1dGgtPmxpc3QpKQotCQlzY3RwX2NodW5rX2ZyZWUocGFja2V0LT5hdXRoKTsKLQllcnIgPSAtRU5PTUVNOwotCWdvdG8gZXJyOworCitvdXQ6CisJc2N0cF9wYWNrZXRfcmVzZXQocGFja2V0KTsKKwlyZXR1cm4gZXJyOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTg3OCw3ICs4NzYsNyBAQAogCQkJCQlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCiAJCQkJCXUxNiBjaHVua19sZW4pCiB7Ci0Jc2l6ZV90IHBzaXplLCBwbXR1OworCXNpemVfdCBwc2l6ZSwgcG10dSwgbWF4c2l6ZTsKIAlzY3RwX3htaXRfdCByZXR2YWwgPSBTQ1RQX1hNSVRfT0s7CiAKIAlwc2l6ZSA9IHBhY2tldC0+c2l6ZTsKQEAgLTkwNiw2ICs5MDQsMTcgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAKKwkJLyogU2ltaWxhcmx5LCBpZiB0aGlzIGNodW5rIHdhcyBidWlsdCBiZWZvcmUgYSBQTVRVCisJCSAqIHJlZHVjdGlvbiwgd2UgaGF2ZSB0byBmcmFnbWVudCBpdCBhdCBJUCBsZXZlbCBub3cuIFNvCisJCSAqIGlmIHRoZSBwYWNrZXQgYWxyZWFkeSBjb250YWlucyBzb21ldGhpbmcsIHdlIG5lZWQgdG8KKwkJICogZmx1c2guCisJCSAqLworCQltYXhzaXplID0gcG10dSAtIHBhY2tldC0+b3ZlcmhlYWQ7CisJCWlmIChwYWNrZXQtPmF1dGgpCisJCQltYXhzaXplIC09IFNDVFBfUEFENChwYWNrZXQtPmF1dGgtPnNrYi0+bGVuKTsKKwkJaWYgKGNodW5rX2xlbiA+IG1heHNpemUpCisJCQlyZXR2YWwgPSBTQ1RQX1hNSVRfUE1UVV9GVUxMOworCiAJCS8qIEl0IGlzIGFsc28gb2theSB0byBmcmFnbWVudCBpZiB0aGUgY2h1bmsgd2UgYXJlCiAJCSAqIGFkZGluZyBpcyBhIGNvbnRyb2wgY2h1bmssIGJ1dCBvbmx5IGlmIGN1cnJlbnQgcGFja2V0CiAJCSAqIGlzIG5vdCBhIEdTTyBvbmUgb3RoZXJ3aXNlIGl0IGNhdXNlcyBmcmFnbWVudGF0aW9uIG9mCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9vdXRxdWV1ZS5jIGIvbmV0L3NjdHAvb3V0cXVldWUuYwppbmRleCA3MmU1NGE0Li41ODI1ODUzIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9vdXRxdWV1ZS5jCisrKyBiL25ldC9zY3RwL291dHF1ZXVlLmMKQEAgLTY4LDcgKzY4LDcgQEAKIAogc3RhdGljIHZvaWQgc2N0cF9nZW5lcmF0ZV9md2R0c24oc3RydWN0IHNjdHBfb3V0cSAqcSwgX191MzIgc2Fja19jdHNuKTsKIAotc3RhdGljIGludCBzY3RwX291dHFfZmx1c2goc3RydWN0IHNjdHBfb3V0cSAqcSwgaW50IHJ0eF90aW1lb3V0LCBnZnBfdCBnZnApOworc3RhdGljIHZvaWQgc2N0cF9vdXRxX2ZsdXNoKHN0cnVjdCBzY3RwX291dHEgKnEsIGludCBydHhfdGltZW91dCwgZ2ZwX3QgZ2ZwKTsKIAogLyogQWRkIGRhdGEgdG8gdGhlIGZyb250IG9mIHRoZSBxdWV1ZS4gKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBzY3RwX291dHFfaGVhZF9kYXRhKHN0cnVjdCBzY3RwX291dHEgKnEsCkBAIC0yODUsMTAgKzI4NSw5IEBACiB9CiAKIC8qIFB1dCBhIG5ldyBjaHVuayBpbiBhbiBzY3RwX291dHEuICAqLwotaW50IHNjdHBfb3V0cV90YWlsKHN0cnVjdCBzY3RwX291dHEgKnEsIHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywgZ2ZwX3QgZ2ZwKQordm9pZCBzY3RwX291dHFfdGFpbChzdHJ1Y3Qgc2N0cF9vdXRxICpxLCBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssIGdmcF90IGdmcCkKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChxLT5hc29jLT5iYXNlLnNrKTsKLQlpbnQgZXJyb3IgPSAwOwogCiAJcHJfZGVidWcoIiVzOiBvdXRxOiVwLCBjaHVuazolcFslc11cbiIsIF9fZnVuY19fLCBxLCBjaHVuaywKIAkJIGNodW5rICYmIGNodW5rLT5jaHVua19oZHIgPwpAQCAtMjk5LDU0ICsyOTgsMjYgQEAKIAkgKiBpbW1lZGlhdGVseS4KIAkgKi8KIAlpZiAoc2N0cF9jaHVua19pc19kYXRhKGNodW5rKSkgewotCQkvKiBJcyBpdCBPSyB0byBxdWV1ZSBkYXRhIGNodW5rcz8gICovCi0JCS8qIEZyb20gOS4gVGVybWluYXRpb24gb2YgQXNzb2NpYXRpb24KLQkJICoKLQkJICogV2hlbiBlaXRoZXIgZW5kcG9pbnQgcGVyZm9ybXMgYSBzaHV0ZG93biwgdGhlCi0JCSAqIGFzc29jaWF0aW9uIG9uIGVhY2ggcGVlciB3aWxsIHN0b3AgYWNjZXB0aW5nIG5ldwotCQkgKiBkYXRhIGZyb20gaXRzIHVzZXIgYW5kIG9ubHkgZGVsaXZlciBkYXRhIGluIHF1ZXVlCi0JCSAqIGF0IHRoZSB0aW1lIG9mIHNlbmRpbmcgb3IgcmVjZWl2aW5nIHRoZSBTSFVURE9XTgotCQkgKiBjaHVuay4KLQkJICovCi0JCXN3aXRjaCAocS0+YXNvYy0+c3RhdGUpIHsKLQkJY2FzZSBTQ1RQX1NUQVRFX0NMT1NFRDoKLQkJY2FzZSBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkRJTkc6Ci0JCWNhc2UgU0NUUF9TVEFURV9TSFVURE9XTl9TRU5UOgotCQljYXNlIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDRUlWRUQ6Ci0JCWNhc2UgU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVDoKLQkJCS8qIENhbm5vdCBzZW5kIGFmdGVyIHRyYW5zcG9ydCBlbmRwb2ludCBzaHV0ZG93biAqLwotCQkJZXJyb3IgPSAtRVNIVVRET1dOOwotCQkJYnJlYWs7CisJCXByX2RlYnVnKCIlczogb3V0cXVldWVpbmc6IG91dHE6JXAsIGNodW5rOiVwWyVzXSlcbiIsCisJCQkgX19mdW5jX18sIHEsIGNodW5rLCBjaHVuayAmJiBjaHVuay0+Y2h1bmtfaGRyID8KKwkJCSBzY3RwX2NuYW1lKFNDVFBfU1RfQ0hVTksoY2h1bmstPmNodW5rX2hkci0+dHlwZSkpIDoKKwkJCSAiaWxsZWdhbCBjaHVuayIpOwogCi0JCWRlZmF1bHQ6Ci0JCQlwcl9kZWJ1ZygiJXM6IG91dHF1ZXVlaW5nOiBvdXRxOiVwLCBjaHVuazolcFslc10pXG4iLAotCQkJCSBfX2Z1bmNfXywgcSwgY2h1bmssIGNodW5rICYmIGNodW5rLT5jaHVua19oZHIgPwotCQkJCSBzY3RwX2NuYW1lKFNDVFBfU1RfQ0hVTksoY2h1bmstPmNodW5rX2hkci0+dHlwZSkpIDoKLQkJCQkgImlsbGVnYWwgY2h1bmsiKTsKLQotCQkJc2N0cF9jaHVua19ob2xkKGNodW5rKTsKLQkJCXNjdHBfb3V0cV90YWlsX2RhdGEocSwgY2h1bmspOwotCQkJaWYgKGNodW5rLT5hc29jLT5wcnNjdHBfZW5hYmxlICYmCi0JCQkgICAgU0NUUF9QUl9QUklPX0VOQUJMRUQoY2h1bmstPnNpbmZvLnNpbmZvX2ZsYWdzKSkKLQkJCQljaHVuay0+YXNvYy0+c2VudF9jbnRfcmVtb3ZhYmxlKys7Ci0JCQlpZiAoY2h1bmstPmNodW5rX2hkci0+ZmxhZ3MgJiBTQ1RQX0RBVEFfVU5PUkRFUkVEKQotCQkJCVNDVFBfSU5DX1NUQVRTKG5ldCwgU0NUUF9NSUJfT1VUVU5PUkRFUkNIVU5LUyk7Ci0JCQllbHNlCi0JCQkJU0NUUF9JTkNfU1RBVFMobmV0LCBTQ1RQX01JQl9PVVRPUkRFUkNIVU5LUyk7Ci0JCQlicmVhazsKLQkJfQorCQlzY3RwX291dHFfdGFpbF9kYXRhKHEsIGNodW5rKTsKKwkJaWYgKGNodW5rLT5hc29jLT5wZWVyLnByc2N0cF9jYXBhYmxlICYmCisJCSAgICBTQ1RQX1BSX1BSSU9fRU5BQkxFRChjaHVuay0+c2luZm8uc2luZm9fZmxhZ3MpKQorCQkJY2h1bmstPmFzb2MtPnNlbnRfY250X3JlbW92YWJsZSsrOworCQlpZiAoY2h1bmstPmNodW5rX2hkci0+ZmxhZ3MgJiBTQ1RQX0RBVEFfVU5PUkRFUkVEKQorCQkJU0NUUF9JTkNfU1RBVFMobmV0LCBTQ1RQX01JQl9PVVRVTk9SREVSQ0hVTktTKTsKKwkJZWxzZQorCQkJU0NUUF9JTkNfU1RBVFMobmV0LCBTQ1RQX01JQl9PVVRPUkRFUkNIVU5LUyk7CiAJfSBlbHNlIHsKIAkJbGlzdF9hZGRfdGFpbCgmY2h1bmstPmxpc3QsICZxLT5jb250cm9sX2NodW5rX2xpc3QpOwogCQlTQ1RQX0lOQ19TVEFUUyhuZXQsIFNDVFBfTUlCX09VVENUUkxDSFVOS1MpOwogCX0KIAotCWlmIChlcnJvciA8IDApCi0JCXJldHVybiBlcnJvcjsKLQogCWlmICghcS0+Y29yaykKLQkJZXJyb3IgPSBzY3RwX291dHFfZmx1c2gocSwgMCwgZ2ZwKTsKLQotCXJldHVybiBlcnJvcjsKKwkJc2N0cF9vdXRxX2ZsdXNoKHEsIDAsIGdmcCk7CiB9CiAKIC8qIEluc2VydCBhIGNodW5rIGludG8gdGhlIHNvcnRlZCBsaXN0IGJhc2VkIG9uIHRoZSBUU05zLiAgVGhlIHJldHJhbnNtaXQgbGlzdApAQCAtMzgzLDcgKzM1NCw3IEBACiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2hrLCB0ZW1wLCBxdWV1ZSwgdHJhbnNtaXR0ZWRfbGlzdCkgewogCQlpZiAoIVNDVFBfUFJfUFJJT19FTkFCTEVEKGNoay0+c2luZm8uc2luZm9fZmxhZ3MpIHx8Ci0JCSAgICBjaGstPnByc2N0cF9wYXJhbSA8PSBzaW5mby0+c2luZm9fdGltZXRvbGl2ZSkKKwkJICAgIGNoay0+c2luZm8uc2luZm9fdGltZXRvbGl2ZSA8PSBzaW5mby0+c2luZm9fdGltZXRvbGl2ZSkKIAkJCWNvbnRpbnVlOwogCiAJCWxpc3RfZGVsX2luaXQoJmNoay0+dHJhbnNtaXR0ZWRfbGlzdCk7CkBAIC00MTgsNyArMzg5LDcgQEAKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjaGssIHRlbXAsIHF1ZXVlLCBsaXN0KSB7CiAJCWlmICghU0NUUF9QUl9QUklPX0VOQUJMRUQoY2hrLT5zaW5mby5zaW5mb19mbGFncykgfHwKLQkJICAgIGNoay0+cHJzY3RwX3BhcmFtIDw9IHNpbmZvLT5zaW5mb190aW1ldG9saXZlKQorCQkgICAgY2hrLT5zaW5mby5zaW5mb190aW1ldG9saXZlIDw9IHNpbmZvLT5zaW5mb190aW1ldG9saXZlKQogCQkJY29udGludWU7CiAKIAkJbGlzdF9kZWxfaW5pdCgmY2hrLT5saXN0KTsKQEAgLTQ0Miw3ICs0MTMsNyBAQAogewogCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0OwogCi0JaWYgKCFhc29jLT5wcnNjdHBfZW5hYmxlIHx8ICFhc29jLT5zZW50X2NudF9yZW1vdmFibGUpCisJaWYgKCFhc29jLT5wZWVyLnByc2N0cF9jYXBhYmxlIHx8ICFhc29jLT5zZW50X2NudF9yZW1vdmFibGUpCiAJCXJldHVybjsKIAogCW1zZ19sZW4gPSBzY3RwX3Byc2N0cF9wcnVuZV9zZW50KGFzb2MsIHNpbmZvLApAQCAtNTU5LDcgKzUzMCw2IEBACiAJCSAgICAgc2N0cF9yZXRyYW5zbWl0X3JlYXNvbl90IHJlYXNvbikKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChxLT5hc29jLT5iYXNlLnNrKTsKLQlpbnQgZXJyb3IgPSAwOwogCiAJc3dpdGNoIChyZWFzb24pIHsKIAljYXNlIFNDVFBfUlRYUl9UM19SVFg6CkBAIC02MDMsMTAgKzU3Myw3IEBACiAJICogd2lsbCBiZSBmbHVzaGVkIGF0IHRoZSBlbmQuCiAJICovCiAJaWYgKHJlYXNvbiAhPSBTQ1RQX1JUWFJfRkFTVF9SVFgpCi0JCWVycm9yID0gc2N0cF9vdXRxX2ZsdXNoKHEsIC8qIHJ0eF90aW1lb3V0ICovIDEsIEdGUF9BVE9NSUMpOwotCi0JaWYgKGVycm9yKQotCQlxLT5hc29jLT5iYXNlLnNrLT5za19lcnIgPSAtZXJyb3I7CisJCXNjdHBfb3V0cV9mbHVzaChxLCAvKiBydHhfdGltZW91dCAqLyAxLCBHRlBfQVRPTUlDKTsKIH0KIAogLyoKQEAgLTc3OCwxMiArNzQ1LDEyIEBACiB9CiAKIC8qIENvcmsgdGhlIG91dHF1ZXVlIHNvIHF1ZXVlZCBjaHVua3MgYXJlIHJlYWxseSBxdWV1ZWQuICovCi1pbnQgc2N0cF9vdXRxX3VuY29yayhzdHJ1Y3Qgc2N0cF9vdXRxICpxLCBnZnBfdCBnZnApCit2b2lkIHNjdHBfb3V0cV91bmNvcmsoc3RydWN0IHNjdHBfb3V0cSAqcSwgZ2ZwX3QgZ2ZwKQogewogCWlmIChxLT5jb3JrKQogCQlxLT5jb3JrID0gMDsKIAotCXJldHVybiBzY3RwX291dHFfZmx1c2gocSwgMCwgZ2ZwKTsKKwlzY3RwX291dHFfZmx1c2gocSwgMCwgZ2ZwKTsKIH0KIAogCkBAIC03OTYsNyArNzYzLDcgQEAKICAqIGxvY2tpbmcgY29uY2VybnMgbXVzdCBiZSBtYWRlLiAgVG9kYXkgd2UgdXNlIHRoZSBzb2NrIGxvY2sgdG8gcHJvdGVjdAogICogdGhpcyBmdW5jdGlvbi4KICAqLwotc3RhdGljIGludCBzY3RwX291dHFfZmx1c2goc3RydWN0IHNjdHBfb3V0cSAqcSwgaW50IHJ0eF90aW1lb3V0LCBnZnBfdCBnZnApCitzdGF0aWMgdm9pZCBzY3RwX291dHFfZmx1c2goc3RydWN0IHNjdHBfb3V0cSAqcSwgaW50IHJ0eF90aW1lb3V0LCBnZnBfdCBnZnApCiB7CiAJc3RydWN0IHNjdHBfcGFja2V0ICpwYWNrZXQ7CiAJc3RydWN0IHNjdHBfcGFja2V0IHNpbmdsZXRvbjsKQEAgLTkxOSw4ICs4ODYsMTAgQEAKIAkJCXNjdHBfcGFja2V0X2NvbmZpZygmc2luZ2xldG9uLCB2dGFnLCAwKTsKIAkJCXNjdHBfcGFja2V0X2FwcGVuZF9jaHVuaygmc2luZ2xldG9uLCBjaHVuayk7CiAJCQllcnJvciA9IHNjdHBfcGFja2V0X3RyYW5zbWl0KCZzaW5nbGV0b24sIGdmcCk7Ci0JCQlpZiAoZXJyb3IgPCAwKQotCQkJCXJldHVybiBlcnJvcjsKKwkJCWlmIChlcnJvciA8IDApIHsKKwkJCQlhc29jLT5iYXNlLnNrLT5za19lcnIgPSAtZXJyb3I7CisJCQkJcmV0dXJuOworCQkJfQogCQkJYnJlYWs7CiAKIAkJY2FzZSBTQ1RQX0NJRF9BQk9SVDoKQEAgLTEwMTgsNiArOTg3LDggQEAKIAkJcmV0cmFuOgogCQkJZXJyb3IgPSBzY3RwX291dHFfZmx1c2hfcnR4KHEsIHBhY2tldCwKIAkJCQkJCSAgICBydHhfdGltZW91dCwgJnN0YXJ0X3RpbWVyKTsKKwkJCWlmIChlcnJvciA8IDApCisJCQkJYXNvYy0+YmFzZS5zay0+c2tfZXJyID0gLWVycm9yOwogCiAJCQlpZiAoc3RhcnRfdGltZXIpIHsKIAkJCQlzY3RwX3RyYW5zcG9ydF9yZXNldF90M19ydHgodHJhbnNwb3J0KTsKQEAgLTEwNTUsNyArMTAyNiw3IEBACiAKIAkJCQkvKiBNYXJrIGFzIGZhaWxlZCBzZW5kLiAqLwogCQkJCXNjdHBfY2h1bmtfZmFpbChjaHVuaywgU0NUUF9FUlJPUl9JTlZfU1RSTSk7Ci0JCQkJaWYgKGFzb2MtPnByc2N0cF9lbmFibGUgJiYKKwkJCQlpZiAoYXNvYy0+cGVlci5wcnNjdHBfY2FwYWJsZSAmJgogCQkJCSAgICBTQ1RQX1BSX1BSSU9fRU5BQkxFRChjaHVuay0+c2luZm8uc2luZm9fZmxhZ3MpKQogCQkJCQlhc29jLT5zZW50X2NudF9yZW1vdmFibGUtLTsKIAkJCQlzY3RwX2NodW5rX2ZyZWUoY2h1bmspOwpAQCAtMTE5MiwxNCArMTE2MywxNSBAQAogCQkJCQkJICAgICAgc3RydWN0IHNjdHBfdHJhbnNwb3J0LAogCQkJCQkJICAgICAgc2VuZF9yZWFkeSk7CiAJCXBhY2tldCA9ICZ0LT5wYWNrZXQ7Ci0JCWlmICghc2N0cF9wYWNrZXRfZW1wdHkocGFja2V0KSkKKwkJaWYgKCFzY3RwX3BhY2tldF9lbXB0eShwYWNrZXQpKSB7CiAJCQllcnJvciA9IHNjdHBfcGFja2V0X3RyYW5zbWl0KHBhY2tldCwgZ2ZwKTsKKwkJCWlmIChlcnJvciA8IDApCisJCQkJYXNvYy0+YmFzZS5zay0+c2tfZXJyID0gLWVycm9yOworCQl9CiAKIAkJLyogQ2xlYXIgdGhlIGJ1cnN0IGxpbWl0ZWQgc3RhdGUsIGlmIGFueSAqLwogCQlzY3RwX3RyYW5zcG9ydF9idXJzdF9yZXNldCh0KTsKIAl9Ci0KLQlyZXR1cm4gZXJyb3I7CiB9CiAKIC8qIFVwZGF0ZSB1bmFja19kYXRhIGJhc2VkIG9uIHRoZSBpbmNvbWluZyBTQUNLIGNodW5rICovCkBAIC0xMzQ3LDcgKzEzMTksNyBAQAogCQl0c24gPSBudG9obCh0Y2h1bmstPnN1YmguZGF0YV9oZHItPnRzbik7CiAJCWlmIChUU05fbHRlKHRzbiwgY3RzbikpIHsKIAkJCWxpc3RfZGVsX2luaXQoJnRjaHVuay0+dHJhbnNtaXR0ZWRfbGlzdCk7Ci0JCQlpZiAoYXNvYy0+cHJzY3RwX2VuYWJsZSAmJgorCQkJaWYgKGFzb2MtPnBlZXIucHJzY3RwX2NhcGFibGUgJiYKIAkJCSAgICBTQ1RQX1BSX1BSSU9fRU5BQkxFRChjaHVuay0+c2luZm8uc2luZm9fZmxhZ3MpKQogCQkJCWFzb2MtPnNlbnRfY250X3JlbW92YWJsZS0tOwogCQkJc2N0cF9jaHVua19mcmVlKHRjaHVuayk7CkBAIC0xNzQ3LDcgKzE3MTksNyBAQAogewogCWludCBpOwogCXNjdHBfc2Fja192YXJpYWJsZV90ICpmcmFnczsKLQlfX3UxNiBnYXA7CisJX191MTYgdHNuX29mZnNldCwgYmxvY2tzOwogCV9fdTMyIGN0c24gPSBudG9obChzYWNrLT5jdW1fdHNuX2Fjayk7CiAKIAlpZiAoVFNOX2x0ZSh0c24sIGN0c24pKQpAQCAtMTc2NiwxMCArMTczOCwxMSBAQAogCSAqLwogCiAJZnJhZ3MgPSBzYWNrLT52YXJpYWJsZTsKLQlnYXAgPSB0c24gLSBjdHNuOwotCWZvciAoaSA9IDA7IGkgPCBudG9ocyhzYWNrLT5udW1fZ2FwX2Fja19ibG9ja3MpOyArK2kpIHsKLQkJaWYgKFRTTl9sdGUobnRvaHMoZnJhZ3NbaV0uZ2FiLnN0YXJ0KSwgZ2FwKSAmJgotCQkgICAgVFNOX2x0ZShnYXAsIG50b2hzKGZyYWdzW2ldLmdhYi5lbmQpKSkKKwlibG9ja3MgPSBudG9ocyhzYWNrLT5udW1fZ2FwX2Fja19ibG9ja3MpOworCXRzbl9vZmZzZXQgPSB0c24gLSBjdHNuOworCWZvciAoaSA9IDA7IGkgPCBibG9ja3M7ICsraSkgeworCQlpZiAodHNuX29mZnNldCA+PSBudG9ocyhmcmFnc1tpXS5nYWIuc3RhcnQpICYmCisJCSAgICB0c25fb2Zmc2V0IDw9IG50b2hzKGZyYWdzW2ldLmdhYi5lbmQpKQogCQkJZ290byBwYXNzOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvcHJvYy5jIGIvbmV0L3NjdHAvcHJvYy5jCmluZGV4IDRjYjVhZWQuLjIwNjM3N2YgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3Byb2MuYworKysgYi9uZXQvc2N0cC9wcm9jLmMKQEAgLTczLDEzICs3MywxNyBAQAogLyogRGlzcGxheSBzY3RwIHNubXAgbWliIHN0YXRpc3RpY3MoL3Byb2MvbmV0L3NjdHAvc25tcCkuICovCiBzdGF0aWMgaW50IHNjdHBfc25tcF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKKwl1bnNpZ25lZCBsb25nIGJ1ZmZbU0NUUF9NSUJfTUFYXTsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzZXEtPnByaXZhdGU7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBzY3RwX3NubXBfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKKwltZW1zZXQoYnVmZiwgMCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogU0NUUF9NSUJfTUFYKTsKKworCXNubXBfZ2V0X2NwdV9maWVsZF9iYXRjaChidWZmLCBzY3RwX3NubXBfbGlzdCwKKwkJCQkgbmV0LT5zY3RwLnNjdHBfc3RhdGlzdGljcyk7CisJZm9yIChpID0gMDsgc2N0cF9zbm1wX2xpc3RbaV0ubmFtZTsgaSsrKQogCQlzZXFfcHJpbnRmKHNlcSwgIiUtMzJzXHQlbGRcbiIsIHNjdHBfc25tcF9saXN0W2ldLm5hbWUsCi0JCQkgICBzbm1wX2ZvbGRfZmllbGQobmV0LT5zY3RwLnNjdHBfc3RhdGlzdGljcywKLQkJCQkgICAgICBzY3RwX3NubXBfbGlzdFtpXS5lbnRyeSkpOworCQkJCQkJYnVmZltpXSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI5Myw2ICsyOTcsNyBAQAogCQlyZXR1cm4gRVJSX1BUUihlcnIpOwogCX0KIAorCWl0ZXItPnN0YXJ0X2ZhaWwgPSAwOwogCXJldHVybiBzY3RwX3RyYW5zcG9ydF9nZXRfaWR4KHNlcV9maWxlX25ldChzZXEpLCAmaXRlci0+aHRpLCAqcG9zKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc2N0cF9kaWFnLmMgYi9uZXQvc2N0cC9zY3RwX2RpYWcuYwppbmRleCBmNjllZGNmLi4wNDg5NTRlIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zY3RwX2RpYWcuYworKysgYi9uZXQvc2N0cC9zY3RwX2RpYWcuYwpAQCAtMTMsNiArMTMsNyBAQAogewogCXVuaW9uIHNjdHBfYWRkciBsYWRkciwgcGFkZHI7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0OworCXN0cnVjdCB0aW1lcl9saXN0ICp0M19ydHggPSAmYXNvYy0+cGVlci5wcmltYXJ5X3BhdGgtPlQzX3J0eF90aW1lcjsKIAogCWxhZGRyID0gbGlzdF9lbnRyeShhc29jLT5iYXNlLmJpbmRfYWRkci5hZGRyZXNzX2xpc3QubmV4dCwKIAkJCSAgIHN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5LCBsaXN0KS0+YTsKQEAgLTQwLDEwICs0MSwxNSBAQAogCX0KIAogCXItPmlkaWFnX3N0YXRlID0gYXNvYy0+c3RhdGU7Ci0Jci0+aWRpYWdfdGltZXIgPSBTQ1RQX0VWRU5UX1RJTUVPVVRfVDNfUlRYOwotCXItPmlkaWFnX3JldHJhbnMgPSBhc29jLT5ydHhfZGF0YV9jaHVua3M7Ci0Jci0+aWRpYWdfZXhwaXJlcyA9IGppZmZpZXNfdG9fbXNlY3MoCi0JCWFzb2MtPnRpbWVvdXRzW1NDVFBfRVZFTlRfVElNRU9VVF9UM19SVFhdIC0gamlmZmllcyk7CisJaWYgKHRpbWVyX3BlbmRpbmcodDNfcnR4KSkgeworCQlyLT5pZGlhZ190aW1lciA9IFNDVFBfRVZFTlRfVElNRU9VVF9UM19SVFg7CisJCXItPmlkaWFnX3JldHJhbnMgPSBhc29jLT5ydHhfZGF0YV9jaHVua3M7CisJCXItPmlkaWFnX2V4cGlyZXMgPSBqaWZmaWVzX3RvX21zZWNzKHQzX3J0eC0+ZXhwaXJlcyAtIGppZmZpZXMpOworCX0gZWxzZSB7CisJCXItPmlkaWFnX3RpbWVyID0gMDsKKwkJci0+aWRpYWdfcmV0cmFucyA9IDA7CisJCXItPmlkaWFnX2V4cGlyZXMgPSAwOworCX0KIH0KIAogc3RhdGljIGludCBpbmV0X2RpYWdfbXNnX3NjdHBsYWRkcnNfZmlsbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtMTAwLDcgKzEwNiw4IEBACiAJCQkgICAgICAgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnJlcSwKIAkJCSAgICAgICBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnVzZXJfbnMsCiAJCQkgICAgICAgaW50IHBvcnRpZCwgdTMyIHNlcSwgdTE2IG5sbXNnX2ZsYWdzLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqdW5saCkKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKnVubGgsCisJCQkgICAgICAgYm9vbCBuZXRfYWRtaW4pCiB7CiAJc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwID0gc2N0cF9zayhzayktPmVwOwogCXN0cnVjdCBsaXN0X2hlYWQgKmFkZHJfbGlzdDsKQEAgLTEyNyw3ICsxMzQsNyBAQAogCQlyLT5pZGlhZ19yZXRyYW5zID0gMDsKIAl9CiAKLQlpZiAoaW5ldF9kaWFnX21zZ19hdHRyc19maWxsKHNrLCBza2IsIHIsIGV4dCwgdXNlcl9ucykpCisJaWYgKGluZXRfZGlhZ19tc2dfYXR0cnNfZmlsbChzaywgc2tiLCByLCBleHQsIHVzZXJfbnMsIG5ldF9hZG1pbikpCiAJCWdvdG8gZXJyb3V0OwogCiAJaWYgKGV4dCAmICgxIDw8IChJTkVUX0RJQUdfU0tNRU1JTkZPIC0gMSkpKSB7CkBAIC0xOTcsNiArMjA0LDcgQEAKIAlzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2I7CiAJY29uc3Qgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnI7CiAJY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGg7CisJYm9vbCBuZXRfYWRtaW47CiB9OwogCiBzdGF0aWMgc2l6ZV90IGluZXRfYXNzb2NfYXR0cl9zaXplKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKQpAQCAtMjEzLDYgKzIyMSw3IEBACiAJCSsgbmxhX3RvdGFsX3NpemUoMSkgLyogSU5FVF9ESUFHX1NIVVRET1dOICovCiAJCSsgbmxhX3RvdGFsX3NpemUoMSkgLyogSU5FVF9ESUFHX1RPUyAqLwogCQkrIG5sYV90b3RhbF9zaXplKDEpIC8qIElORVRfRElBR19UQ0xBU1MgKi8KKwkJKyBubGFfdG90YWxfc2l6ZSg0KSAvKiBJTkVUX0RJQUdfTUFSSyAqLwogCQkrIG5sYV90b3RhbF9zaXplKGFkZHJsZW4gKiBhc29jLT5wZWVyLnRyYW5zcG9ydF9jb3VudCkKIAkJKyBubGFfdG90YWxfc2l6ZShhZGRybGVuICogYWRkcmNudCkKIAkJKyBubGFfdG90YWxfc2l6ZShzaXplb2Yoc3RydWN0IGluZXRfZGlhZ19tZW1pbmZvKSkKQEAgLTI1MCw3ICsyNTksOCBAQAogCWVyciA9IGluZXRfc2N0cF9kaWFnX2ZpbGwoc2ssIGFzc29jLCByZXAsIHJlcSwKIAkJCQkgIHNrX3VzZXJfbnMoTkVUTElOS19DQihpbl9za2IpLnNrKSwKIAkJCQkgIE5FVExJTktfQ0IoaW5fc2tiKS5wb3J0aWQsCi0JCQkJICBubGgtPm5sbXNnX3NlcSwgMCwgbmxoKTsKKwkJCQkgIG5saC0+bmxtc2dfc2VxLCAwLCBubGgsCisJCQkJICBjb21tcC0+bmV0X2FkbWluKTsKIAlyZWxlYXNlX3NvY2soc2spOwogCWlmIChlcnIgPCAwKSB7CiAJCVdBUk5fT04oZXJyID09IC1FTVNHU0laRSk7CkBAIC0yNjYsMjggKzI3NiwxNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgc2N0cF90c3BfZHVtcChzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRzcCwgdm9pZCAqcCkKK3N0YXRpYyBpbnQgc2N0cF9zb2NrX2R1bXAoc3RydWN0IHNvY2sgKnNrLCB2b2lkICpwKQogewotCXN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCA9IHRzcC0+YXNvYy0+ZXA7CisJc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwID0gc2N0cF9zayhzayktPmVwOwogCXN0cnVjdCBzY3RwX2NvbW1fcGFyYW0gKmNvbW1wID0gcDsKLQlzdHJ1Y3Qgc29jayAqc2sgPSBlcC0+YmFzZS5zazsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gY29tbXAtPnNrYjsKIAlzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IgPSBjb21tcC0+Y2I7CiAJY29uc3Qgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnIgPSBjb21tcC0+cjsKLQlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNzb2MgPQotCQlsaXN0X2VudHJ5KGVwLT5hc29jcy5uZXh0LCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiwgYXNvY3MpOworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc3NvYzsKIAlpbnQgZXJyID0gMDsKIAotCS8qIGZpbmQgdGhlIGVwIG9ubHkgb25jZSB0aHJvdWdoIHRoZSB0cmFuc3BvcnRzIGJ5IHRoaXMgY29uZGl0aW9uICovCi0JaWYgKHRzcC0+YXNvYyAhPSBhc3NvYykKLQkJZ290byBvdXQ7Ci0KLQlpZiAoci0+c2RpYWdfZmFtaWx5ICE9IEFGX1VOU1BFQyAmJiBzay0+c2tfZmFtaWx5ICE9IHItPnNkaWFnX2ZhbWlseSkKLQkJZ290byBvdXQ7Ci0KIAlsb2NrX3NvY2soc2spOwotCWlmIChzayAhPSBhc3NvYy0+YmFzZS5zaykKLQkJZ290byByZWxlYXNlOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoYXNzb2MsICZlcC0+YXNvY3MsIGFzb2NzKSB7CiAJCWlmIChjYi0+YXJnc1s0XSA8IGNiLT5hcmdzWzFdKQogCQkJZ290byBuZXh0OwpAQCAtMzA0LDkgKzMwMywxMCBAQAogCQkJCQlza191c2VyX25zKE5FVExJTktfQ0IoY2ItPnNrYikuc2spLAogCQkJCQlORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZCwKIAkJCQkJY2ItPm5saC0+bmxtc2dfc2VxLAotCQkJCQlOTE1fRl9NVUxUSSwgY2ItPm5saCkgPCAwKSB7CisJCQkJCU5MTV9GX01VTFRJLCBjYi0+bmxoLAorCQkJCQljb21tcC0+bmV0X2FkbWluKSA8IDApIHsKIAkJCWNiLT5hcmdzWzNdID0gMTsKLQkJCWVyciA9IDI7CisJCQllcnIgPSAxOwogCQkJZ290byByZWxlYXNlOwogCQl9CiAJCWNiLT5hcmdzWzNdID0gMTsKQEAgLTMxNCw4ICszMTQsOSBAQAogCQlpZiAoaW5ldF9zY3RwX2RpYWdfZmlsbChzaywgYXNzb2MsIHNrYiwgciwKIAkJCQkJc2tfdXNlcl9ucyhORVRMSU5LX0NCKGNiLT5za2IpLnNrKSwKIAkJCQkJTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQsCi0JCQkJCWNiLT5ubGgtPm5sbXNnX3NlcSwgMCwgY2ItPm5saCkgPCAwKSB7Ci0JCQllcnIgPSAyOworCQkJCQljYi0+bmxoLT5ubG1zZ19zZXEsIDAsIGNiLT5ubGgsCisJCQkJCWNvbW1wLT5uZXRfYWRtaW4pIDwgMCkgeworCQkJZXJyID0gMTsKIAkJCWdvdG8gcmVsZWFzZTsKIAkJfQogbmV4dDoKQEAgLTMyNywxMCArMzI4LDM1IEBACiAJY2ItPmFyZ3NbNF0gPSAwOwogcmVsZWFzZToKIAlyZWxlYXNlX3NvY2soc2spOworCXNvY2tfcHV0KHNrKTsKIAlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNjdHBfZ2V0X3NvY2soc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0c3AsIHZvaWQgKnApCit7CisJc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwID0gdHNwLT5hc29jLT5lcDsKKwlzdHJ1Y3Qgc2N0cF9jb21tX3BhcmFtICpjb21tcCA9IHA7CisJc3RydWN0IHNvY2sgKnNrID0gZXAtPmJhc2Uuc2s7CisJc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiID0gY29tbXAtPmNiOworCWNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyID0gY29tbXAtPnI7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzc29jID0KKwkJbGlzdF9lbnRyeShlcC0+YXNvY3MubmV4dCwgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24sIGFzb2NzKTsKKworCS8qIGZpbmQgdGhlIGVwIG9ubHkgb25jZSB0aHJvdWdoIHRoZSB0cmFuc3BvcnRzIGJ5IHRoaXMgY29uZGl0aW9uICovCisJaWYgKHRzcC0+YXNvYyAhPSBhc3NvYykKKwkJZ290byBvdXQ7CisKKwlpZiAoci0+c2RpYWdfZmFtaWx5ICE9IEFGX1VOU1BFQyAmJiBzay0+c2tfZmFtaWx5ICE9IHItPnNkaWFnX2ZhbWlseSkKKwkJZ290byBvdXQ7CisKKwlzb2NrX2hvbGQoc2spOworCWNiLT5hcmdzWzVdID0gKGxvbmcpc2s7CisKKwlyZXR1cm4gMTsKKwogb3V0OgogCWNiLT5hcmdzWzJdKys7Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzY3RwX2VwX2R1bXAoc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLCB2b2lkICpwKQpAQCAtMzUwLDcgKzM3Niw3IEBACiAJaWYgKGNiLT5hcmdzWzRdIDwgY2ItPmFyZ3NbMV0pCiAJCWdvdG8gbmV4dDsKIAotCWlmICgoci0+aWRpYWdfc3RhdGVzICYgflRDUEZfTElTVEVOKSAmJiAhbGlzdF9lbXB0eSgmZXAtPmFzb2NzKSkKKwlpZiAoIShyLT5pZGlhZ19zdGF0ZXMgJiBUQ1BGX0xJU1RFTikgJiYgIWxpc3RfZW1wdHkoJmVwLT5hc29jcykpCiAJCWdvdG8gbmV4dDsKIAogCWlmIChyLT5zZGlhZ19mYW1pbHkgIT0gQUZfVU5TUEVDICYmCkBAIC0zNjksNyArMzk1LDcgQEAKIAkJCQlza191c2VyX25zKE5FVExJTktfQ0IoY2ItPnNrYikuc2spLAogCQkJCU5FVExJTktfQ0IoY2ItPnNrYikucG9ydGlkLAogCQkJCWNiLT5ubGgtPm5sbXNnX3NlcSwgTkxNX0ZfTVVMVEksCi0JCQkJY2ItPm5saCkgPCAwKSB7CisJCQkJY2ItPm5saCwgY29tbXAtPm5ldF9hZG1pbikgPCAwKSB7CiAJCWVyciA9IDI7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTQwNiw2ICs0MzIsNyBAQAogCQkuc2tiID0gaW5fc2tiLAogCQkuciA9IHJlcSwKIAkJLm5saCA9IG5saCwKKwkJLm5ldF9hZG1pbiA9IG5ldGxpbmtfbmV0X2NhcGFibGUoaW5fc2tiLCBDQVBfTkVUX0FETUlOKSwKIAl9OwogCiAJaWYgKHJlcS0+c2RpYWdfZmFtaWx5ID09IEFGX0lORVQpIHsKQEAgLTQxOCwxMSArNDQ1LDEzIEBACiAJCXBhZGRyLnY0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOwogCX0gZWxzZSB7CiAJCWxhZGRyLnY2LnNpbjZfcG9ydCA9IHJlcS0+aWQuaWRpYWdfc3BvcnQ7Ci0JCW1lbWNweSgmbGFkZHIudjYuc2luNl9hZGRyLCByZXEtPmlkLmlkaWFnX3NyYywgNjQpOworCQltZW1jcHkoJmxhZGRyLnY2LnNpbjZfYWRkciwgcmVxLT5pZC5pZGlhZ19zcmMsCisJCSAgICAgICBzaXplb2YobGFkZHIudjYuc2luNl9hZGRyKSk7CiAJCWxhZGRyLnY2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CiAKIAkJcGFkZHIudjYuc2luNl9wb3J0ID0gcmVxLT5pZC5pZGlhZ19kcG9ydDsKLQkJbWVtY3B5KCZwYWRkci52Ni5zaW42X2FkZHIsIHJlcS0+aWQuaWRpYWdfZHN0LCA2NCk7CisJCW1lbWNweSgmcGFkZHIudjYuc2luNl9hZGRyLCByZXEtPmlkLmlkaWFnX2RzdCwKKwkJICAgICAgIHNpemVvZihwYWRkci52Ni5zaW42X2FkZHIpKTsKIAkJcGFkZHIudjYuc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKIAl9CiAKQEAgLTQzOSw2ICs0NjgsNyBAQAogCQkuc2tiID0gc2tiLAogCQkuY2IgPSBjYiwKIAkJLnIgPSByLAorCQkubmV0X2FkbWluID0gbmV0bGlua19uZXRfY2FwYWJsZShjYi0+c2tiLCBDQVBfTkVUX0FETUlOKSwKIAl9OwogCiAJLyogZXBzIGhhc2h0YWJsZSBkdW1wcwpAQCAtNDY0LDEwICs0OTQsMTggQEAKIAkgKiAyIDogdG8gcmVjb3JkIHRoZSB0cmFuc3BvcnQgcG9zIG9mIHRoaXMgdGltZSdzIHRyYXZlcnNhbAogCSAqIDMgOiB0byBtYXJrIGlmIHdlIGhhdmUgZHVtcGVkIHRoZSBlcCBpbmZvIG9mIHRoZSBjdXJyZW50IGFzb2MKIAkgKiA0IDogdG8gd29yayBhcyBhIHRlbXBvcmFyeSB2YXJpYWJsZSB0byB0cmF2ZXJzYWwgbGlzdAorCSAqIDUgOiB0byBzYXZlIHRoZSBzayB3ZSBnZXQgZnJvbSB0cmF2ZWxzaW5nIHRoZSB0c3AgbGlzdC4KIAkgKi8KLQlpZiAoIShpZGlhZ19zdGF0ZXMgJiB+VENQRl9MSVNURU4pKQorCWlmICghKGlkaWFnX3N0YXRlcyAmIH4oVENQRl9MSVNURU4gfCBUQ1BGX0NMT1NFKSkpCiAJCWdvdG8gZG9uZTsKLQlzY3RwX2Zvcl9lYWNoX3RyYW5zcG9ydChzY3RwX3RzcF9kdW1wLCBuZXQsIGNiLT5hcmdzWzJdLCAmY29tbXApOworCituZXh0OgorCWNiLT5hcmdzWzVdID0gMDsKKwlzY3RwX2Zvcl9lYWNoX3RyYW5zcG9ydChzY3RwX2dldF9zb2NrLCBuZXQsIGNiLT5hcmdzWzJdLCAmY29tbXApOworCisJaWYgKGNiLT5hcmdzWzVdICYmICFzY3RwX3NvY2tfZHVtcCgoc3RydWN0IHNvY2sgKiljYi0+YXJnc1s1XSwgJmNvbW1wKSkKKwkJZ290byBuZXh0OworCiBkb25lOgogCWNiLT5hcmdzWzFdID0gY2ItPmFyZ3NbNF07CiAJY2ItPmFyZ3NbNF0gPSAwOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc21fbWFrZV9jaHVuay5jIGIvbmV0L3NjdHAvc21fbWFrZV9jaHVuay5jCmluZGV4IDhjNzdiODcuLjllOTY5MGIgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NtX21ha2VfY2h1bmsuYworKysgYi9uZXQvc2N0cC9zbV9tYWtlX2NodW5rLmMKQEAgLTI1Myw3ICsyNTMsNyBAQAogCW51bV90eXBlcyA9IHNwLT5wZi0+c3VwcG9ydGVkX2FkZHJzKHNwLCB0eXBlcyk7CiAKIAljaHVua3NpemUgPSBzaXplb2YoaW5pdCkgKyBhZGRyc19sZW47Ci0JY2h1bmtzaXplICs9IFdPUkRfUk9VTkQoU0NUUF9TQVRfTEVOKG51bV90eXBlcykpOworCWNodW5rc2l6ZSArPSBTQ1RQX1BBRDQoU0NUUF9TQVRfTEVOKG51bV90eXBlcykpOwogCWNodW5rc2l6ZSArPSBzaXplb2YoZWNhcF9wYXJhbSk7CiAKIAlpZiAoYXNvYy0+cHJzY3RwX2VuYWJsZSkKQEAgLTI4MywxNCArMjgzLDE0IEBACiAJCS8qIEFkZCBITUFDUyBwYXJhbWV0ZXIgbGVuZ3RoIGlmIGFueSB3ZXJlIGRlZmluZWQgKi8KIAkJYXV0aF9obWFjcyA9IChzY3RwX3BhcmFtaGRyX3QgKilhc29jLT5jLmF1dGhfaG1hY3M7CiAJCWlmIChhdXRoX2htYWNzLT5sZW5ndGgpCi0JCQljaHVua3NpemUgKz0gV09SRF9ST1VORChudG9ocyhhdXRoX2htYWNzLT5sZW5ndGgpKTsKKwkJCWNodW5rc2l6ZSArPSBTQ1RQX1BBRDQobnRvaHMoYXV0aF9obWFjcy0+bGVuZ3RoKSk7CiAJCWVsc2UKIAkJCWF1dGhfaG1hY3MgPSBOVUxMOwogCiAJCS8qIEFkZCBDSFVOS1MgcGFyYW1ldGVyIGxlbmd0aCAqLwogCQlhdXRoX2NodW5rcyA9IChzY3RwX3BhcmFtaGRyX3QgKilhc29jLT5jLmF1dGhfY2h1bmtzOwogCQlpZiAoYXV0aF9jaHVua3MtPmxlbmd0aCkKLQkJCWNodW5rc2l6ZSArPSBXT1JEX1JPVU5EKG50b2hzKGF1dGhfY2h1bmtzLT5sZW5ndGgpKTsKKwkJCWNodW5rc2l6ZSArPSBTQ1RQX1BBRDQobnRvaHMoYXV0aF9jaHVua3MtPmxlbmd0aCkpOwogCQllbHNlCiAJCQlhdXRoX2NodW5rcyA9IE5VTEw7CiAKQEAgLTMwMCw4ICszMDAsOCBAQAogCiAJLyogSWYgd2UgaGF2ZSBhbnkgZXh0ZW5zaW9ucyB0byByZXBvcnQsIGFjY291bnQgZm9yIHRoYXQgKi8KIAlpZiAobnVtX2V4dCkKLQkJY2h1bmtzaXplICs9IFdPUkRfUk9VTkQoc2l6ZW9mKHNjdHBfc3VwcG9ydGVkX2V4dF9wYXJhbV90KSArCi0JCQkJCW51bV9leHQpOworCQljaHVua3NpemUgKz0gU0NUUF9QQUQ0KHNpemVvZihzY3RwX3N1cHBvcnRlZF9leHRfcGFyYW1fdCkgKworCQkJCSAgICAgICBudW1fZXh0KTsKIAogCS8qIFJGQyAyOTYwIDMuMy4yIEluaXRpYXRpb24gKElOSVQpICgxKQogCSAqCkBAIC00NDMsMTMgKzQ0MywxMyBAQAogCiAJCWF1dGhfaG1hY3MgPSAoc2N0cF9wYXJhbWhkcl90ICopYXNvYy0+Yy5hdXRoX2htYWNzOwogCQlpZiAoYXV0aF9obWFjcy0+bGVuZ3RoKQotCQkJY2h1bmtzaXplICs9IFdPUkRfUk9VTkQobnRvaHMoYXV0aF9obWFjcy0+bGVuZ3RoKSk7CisJCQljaHVua3NpemUgKz0gU0NUUF9QQUQ0KG50b2hzKGF1dGhfaG1hY3MtPmxlbmd0aCkpOwogCQllbHNlCiAJCQlhdXRoX2htYWNzID0gTlVMTDsKIAogCQlhdXRoX2NodW5rcyA9IChzY3RwX3BhcmFtaGRyX3QgKilhc29jLT5jLmF1dGhfY2h1bmtzOwogCQlpZiAoYXV0aF9jaHVua3MtPmxlbmd0aCkKLQkJCWNodW5rc2l6ZSArPSBXT1JEX1JPVU5EKG50b2hzKGF1dGhfY2h1bmtzLT5sZW5ndGgpKTsKKwkJCWNodW5rc2l6ZSArPSBTQ1RQX1BBRDQobnRvaHMoYXV0aF9jaHVua3MtPmxlbmd0aCkpOwogCQllbHNlCiAJCQlhdXRoX2NodW5rcyA9IE5VTEw7CiAKQEAgLTQ1OCw4ICs0NTgsOCBAQAogCX0KIAogCWlmIChudW1fZXh0KQotCQljaHVua3NpemUgKz0gV09SRF9ST1VORChzaXplb2Yoc2N0cF9zdXBwb3J0ZWRfZXh0X3BhcmFtX3QpICsKLQkJCQkJbnVtX2V4dCk7CisJCWNodW5rc2l6ZSArPSBTQ1RQX1BBRDQoc2l6ZW9mKHNjdHBfc3VwcG9ydGVkX2V4dF9wYXJhbV90KSArCisJCQkJICAgICAgIG51bV9leHQpOwogCiAJLyogTm93IGFsbG9jYXRlIGFuZCBmaWxsIG91dCB0aGUgY2h1bmsuICAqLwogCXJldHZhbCA9IHNjdHBfbWFrZV9jb250cm9sKGFzb2MsIFNDVFBfQ0lEX0lOSVRfQUNLLCAwLCBjaHVua3NpemUsIGdmcCk7CkBAIC03MDYsMjAgKzcwNiw2IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIHZvaWQgc2N0cF9zZXRfcHJzY3RwX3BvbGljeShzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCi0JCQkJICAgY29uc3Qgc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqc2luZm8pCi17Ci0JaWYgKCFjaHVuay0+YXNvYy0+cHJzY3RwX2VuYWJsZSkKLQkJcmV0dXJuOwotCi0JaWYgKFNDVFBfUFJfVFRMX0VOQUJMRUQoc2luZm8tPnNpbmZvX2ZsYWdzKSkKLQkJY2h1bmstPnByc2N0cF9wYXJhbSA9Ci0JCQlqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhzaW5mby0+c2luZm9fdGltZXRvbGl2ZSk7Ci0JZWxzZSBpZiAoU0NUUF9QUl9SVFhfRU5BQkxFRChzaW5mby0+c2luZm9fZmxhZ3MpIHx8Ci0JCSBTQ1RQX1BSX1BSSU9fRU5BQkxFRChzaW5mby0+c2luZm9fZmxhZ3MpKQotCQljaHVuay0+cHJzY3RwX3BhcmFtID0gc2luZm8tPnNpbmZvX3RpbWV0b2xpdmU7Ci19Ci0KIC8qIE1ha2UgYSBEQVRBIGNodW5rIGZvciB0aGUgZ2l2ZW4gYXNzb2NpYXRpb24gZnJvbSB0aGUgcHJvdmlkZWQKICAqIHBhcmFtZXRlcnMuICBIb3dldmVyLCBkbyBub3QgcG9wdWxhdGUgdGhlIGRhdGEgcGF5bG9hZC4KICAqLwpAQCAtNzUzLDcgKzczOSw2IEBACiAKIAlyZXR2YWwtPnN1YmguZGF0YV9oZHIgPSBzY3RwX2FkZHRvX2NodW5rKHJldHZhbCwgc2l6ZW9mKGRwKSwgJmRwKTsKIAltZW1jcHkoJnJldHZhbC0+c2luZm8sIHNpbmZvLCBzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOwotCXNjdHBfc2V0X3Byc2N0cF9wb2xpY3kocmV0dmFsLCBzaW5mbyk7CiAKIG5vZGF0YToKIAlyZXR1cm4gcmV0dmFsOwpAQCAtMTM5MCw3ICsxMzc1LDcgQEAKIAlzdHJ1Y3Qgc29jayAqc2s7CiAKIAkvKiBObyBuZWVkIHRvIGFsbG9jYXRlIExMIGhlcmUsIGFzIHRoaXMgaXMgb25seSBhIGNodW5rLiAqLwotCXNrYiA9IGFsbG9jX3NrYihXT1JEX1JPVU5EKHNpemVvZihzY3RwX2NodW5raGRyX3QpICsgcGF5bGVuKSwgZ2ZwKTsKKwlza2IgPSBhbGxvY19za2IoU0NUUF9QQUQ0KHNpemVvZihzY3RwX2NodW5raGRyX3QpICsgcGF5bGVuKSwgZ2ZwKTsKIAlpZiAoIXNrYikKIAkJZ290byBub2RhdGE7CiAKQEAgLTE0ODIsNyArMTQ2Nyw3IEBACiAJdm9pZCAqdGFyZ2V0OwogCXZvaWQgKnBhZGRpbmc7CiAJaW50IGNodW5rbGVuID0gbnRvaHMoY2h1bmstPmNodW5rX2hkci0+bGVuZ3RoKTsKLQlpbnQgcGFkbGVuID0gV09SRF9ST1VORChjaHVua2xlbikgLSBjaHVua2xlbjsKKwlpbnQgcGFkbGVuID0gU0NUUF9QQUQ0KGNodW5rbGVuKSAtIGNodW5rbGVuOwogCiAJcGFkZGluZyA9IHNrYl9wdXQoY2h1bmstPnNrYiwgcGFkbGVuKTsKIAl0YXJnZXQgPSBza2JfcHV0KGNodW5rLT5za2IsIGxlbik7CkBAIC0xOTAwLDcgKzE4ODUsNyBAQAogCXN0cnVjdCBfX3NjdHBfbWlzc2luZyByZXBvcnQ7CiAJX191MTYgbGVuOwogCi0JbGVuID0gV09SRF9ST1VORChzaXplb2YocmVwb3J0KSk7CisJbGVuID0gU0NUUF9QQUQ0KHNpemVvZihyZXBvcnQpKTsKIAogCS8qIE1ha2UgYW4gRVJST1IgY2h1bmssIHByZXBhcmluZyBlbm91Z2ggcm9vbSBmb3IKIAkgKiByZXR1cm5pbmcgbXVsdGlwbGUgdW5rbm93biBwYXJhbWV0ZXJzLgpAQCAtMjA5OCw5ICsyMDgzLDkgQEAKIAogCQlpZiAoKmVycnApIHsKIAkJCWlmICghc2N0cF9pbml0X2NhdXNlX2ZpeGVkKCplcnJwLCBTQ1RQX0VSUk9SX1VOS05PV05fUEFSQU0sCi0JCQkJCVdPUkRfUk9VTkQobnRvaHMocGFyYW0ucC0+bGVuZ3RoKSkpKQorCQkJCQlTQ1RQX1BBRDQobnRvaHMocGFyYW0ucC0+bGVuZ3RoKSkpKQogCQkJCXNjdHBfYWRkdG9fY2h1bmtfZml4ZWQoKmVycnAsCi0JCQkJCQlXT1JEX1JPVU5EKG50b2hzKHBhcmFtLnAtPmxlbmd0aCkpLAorCQkJCQkJU0NUUF9QQUQ0KG50b2hzKHBhcmFtLnAtPmxlbmd0aCkpLAogCQkJCQkJcGFyYW0udik7CiAJCX0gZWxzZSB7CiAJCQkvKiBJZiB0aGVyZSBpcyBubyBtZW1vcnkgZm9yIGdlbmVyYXRpbmcgdGhlIEVSUk9SCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zbV9zaWRlZWZmZWN0LmMgYi9uZXQvc2N0cC9zbV9zaWRlZWZmZWN0LmMKaW5kZXggMTJkNDUxOS4uYzM0NWJmMSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc21fc2lkZWVmZmVjdC5jCisrKyBiL25ldC9zY3RwL3NtX3NpZGVlZmZlY3QuYwpAQCAtMTAyMCwxOSArMTAyMCwxMyBAQAogICogVGhpcyB3YXkgdGhlIHdob2xlIG1lc3NhZ2UgaXMgcXVldWVkIHVwIGFuZCBidW5kbGluZyBpZgogICogZW5jb3VyYWdlZCBmb3Igc21hbGwgZnJhZ21lbnRzLgogICovCi1zdGF0aWMgaW50IHNjdHBfY21kX3NlbmRfbXNnKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAotCQkJCXN0cnVjdCBzY3RwX2RhdGFtc2cgKm1zZywgZ2ZwX3QgZ2ZwKQorc3RhdGljIHZvaWQgc2N0cF9jbWRfc2VuZF9tc2coc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkgICAgICBzdHJ1Y3Qgc2N0cF9kYXRhbXNnICptc2csIGdmcF90IGdmcCkKIHsKIAlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bms7Ci0JaW50IGVycm9yID0gMDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2h1bmssICZtc2ctPmNodW5rcywgZnJhZ19saXN0KSB7Ci0JCWVycm9yID0gc2N0cF9vdXRxX3RhaWwoJmFzb2MtPm91dHF1ZXVlLCBjaHVuaywgZ2ZwKTsKLQkJaWYgKGVycm9yKQotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGVycm9yOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2h1bmssICZtc2ctPmNodW5rcywgZnJhZ19saXN0KQorCQlzY3RwX291dHFfdGFpbCgmYXNvYy0+b3V0cXVldWUsIGNodW5rLCBnZnApOwogfQogCiAKQEAgLTE0MjcsOCArMTQyMSw3IEBACiAJCQkJbG9jYWxfY29yayA9IDE7CiAJCQl9CiAJCQkvKiBTZW5kIGEgY2h1bmsgdG8gb3VyIHBlZXIuICAqLwotCQkJZXJyb3IgPSBzY3RwX291dHFfdGFpbCgmYXNvYy0+b3V0cXVldWUsIGNtZC0+b2JqLmNodW5rLAotCQkJCQkgICAgICAgZ2ZwKTsKKwkJCXNjdHBfb3V0cV90YWlsKCZhc29jLT5vdXRxdWV1ZSwgY21kLT5vYmouY2h1bmssIGdmcCk7CiAJCQlicmVhazsKIAogCQljYXNlIFNDVFBfQ01EX1NFTkRfUEtUOgpAQCAtMTY4Miw3ICsxNjc1LDcgQEAKIAkJY2FzZSBTQ1RQX0NNRF9GT1JDRV9QUklNX1JFVFJBTjoKIAkJCXQgPSBhc29jLT5wZWVyLnJldHJhbl9wYXRoOwogCQkJYXNvYy0+cGVlci5yZXRyYW5fcGF0aCA9IGFzb2MtPnBlZXIucHJpbWFyeV9wYXRoOwotCQkJZXJyb3IgPSBzY3RwX291dHFfdW5jb3JrKCZhc29jLT5vdXRxdWV1ZSwgZ2ZwKTsKKwkJCXNjdHBfb3V0cV91bmNvcmsoJmFzb2MtPm91dHF1ZXVlLCBnZnApOwogCQkJbG9jYWxfY29yayA9IDA7CiAJCQlhc29jLT5wZWVyLnJldHJhbl9wYXRoID0gdDsKIAkJCWJyZWFrOwpAQCAtMTcwOSw3ICsxNzAyLDcgQEAKIAkJCQlzY3RwX291dHFfY29yaygmYXNvYy0+b3V0cXVldWUpOwogCQkJCWxvY2FsX2NvcmsgPSAxOwogCQkJfQotCQkJZXJyb3IgPSBzY3RwX2NtZF9zZW5kX21zZyhhc29jLCBjbWQtPm9iai5tc2csIGdmcCk7CisJCQlzY3RwX2NtZF9zZW5kX21zZyhhc29jLCBjbWQtPm9iai5tc2csIGdmcCk7CiAJCQlicmVhazsKIAkJY2FzZSBTQ1RQX0NNRF9TRU5EX05FWFRfQVNDT05GOgogCQkJc2N0cF9jbWRfc2VuZF9hc2NvbmYoYXNvYyk7CkBAIC0xNzM5LDkgKzE3MzIsOSBAQAogCSAqLwogCWlmIChhc29jICYmIFNDVFBfRVZFTlRfVF9DSFVOSyA9PSBldmVudF90eXBlICYmIGNodW5rKSB7CiAJCWlmIChjaHVuay0+ZW5kX29mX3BhY2tldCB8fCBjaHVuay0+c2luZ2xldG9uKQotCQkJZXJyb3IgPSBzY3RwX291dHFfdW5jb3JrKCZhc29jLT5vdXRxdWV1ZSwgZ2ZwKTsKKwkJCXNjdHBfb3V0cV91bmNvcmsoJmFzb2MtPm91dHF1ZXVlLCBnZnApOwogCX0gZWxzZSBpZiAobG9jYWxfY29yaykKLQkJZXJyb3IgPSBzY3RwX291dHFfdW5jb3JrKCZhc29jLT5vdXRxdWV1ZSwgZ2ZwKTsKKwkJc2N0cF9vdXRxX3VuY29yaygmYXNvYy0+b3V0cXVldWUsIGdmcCk7CiAKIAlpZiAoc3AtPmRhdGFfcmVhZHlfc2lnbmFsbGVkKQogCQlzcC0+ZGF0YV9yZWFkeV9zaWduYWxsZWQgPSAwOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc21fc3RhdGVmdW5zLmMgYi9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYwppbmRleCBkODhiYjJiLi4wMjZlM2JjIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYworKysgYi9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYwpAQCAtMzQ1NCw3ICszNDU0LDcgQEAKIAkJfQogCiAJCS8qIFJlcG9ydCB2aW9sYXRpb24gaWYgY2h1bmsgbGVuIG92ZXJmbG93cyAqLwotCQljaF9lbmQgPSAoKF9fdTggKiljaCkgKyBXT1JEX1JPVU5EKG50b2hzKGNoLT5sZW5ndGgpKTsKKwkJY2hfZW5kID0gKChfX3U4ICopY2gpICsgU0NUUF9QQUQ0KG50b2hzKGNoLT5sZW5ndGgpKTsKIAkJaWYgKGNoX2VuZCA+IHNrYl90YWlsX3BvaW50ZXIoc2tiKSkKIAkJCXJldHVybiBzY3RwX3NmX3Zpb2xhdGlvbl9jaHVua2xlbihuZXQsIGVwLCBhc29jLCB0eXBlLCBhcmcsCiAJCQkJCQkgIGNvbW1hbmRzKTsKQEAgLTQxODUsNyArNDE4NSw3IEBACiAJCWhkciA9IHVua19jaHVuay0+Y2h1bmtfaGRyOwogCQllcnJfY2h1bmsgPSBzY3RwX21ha2Vfb3BfZXJyb3IoYXNvYywgdW5rX2NodW5rLAogCQkJCQkgICAgICAgU0NUUF9FUlJPUl9VTktOT1dOX0NIVU5LLCBoZHIsCi0JCQkJCSAgICAgICBXT1JEX1JPVU5EKG50b2hzKGhkci0+bGVuZ3RoKSksCisJCQkJCSAgICAgICBTQ1RQX1BBRDQobnRvaHMoaGRyLT5sZW5ndGgpKSwKIAkJCQkJICAgICAgIDApOwogCQlpZiAoZXJyX2NodW5rKSB7CiAJCQlzY3RwX2FkZF9jbWRfc2YoY29tbWFuZHMsIFNDVFBfQ01EX1JFUExZLApAQCAtNDIwMyw3ICs0MjAzLDcgQEAKIAkJaGRyID0gdW5rX2NodW5rLT5jaHVua19oZHI7CiAJCWVycl9jaHVuayA9IHNjdHBfbWFrZV9vcF9lcnJvcihhc29jLCB1bmtfY2h1bmssCiAJCQkJCSAgICAgICBTQ1RQX0VSUk9SX1VOS05PV05fQ0hVTkssIGhkciwKLQkJCQkJICAgICAgIFdPUkRfUk9VTkQobnRvaHMoaGRyLT5sZW5ndGgpKSwKKwkJCQkJICAgICAgIFNDVFBfUEFENChudG9ocyhoZHItPmxlbmd0aCkpLAogCQkJCQkgICAgICAgMCk7CiAJCWlmIChlcnJfY2h1bmspIHsKIAkJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfUkVQTFksCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zb2NrZXQuYyBiL25ldC9zY3RwL3NvY2tldC5jCmluZGV4IDlmYzQxN2EuLmZiMDJjNzAgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NvY2tldC5jCisrKyBiL25ldC9zY3RwL3NvY2tldC5jCkBAIC0xOTU4LDYgKzE5NTgsOCBAQAogCiAJLyogTm93IHNlbmQgdGhlIChwb3NzaWJseSkgZnJhZ21lbnRlZCBtZXNzYWdlLiAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2h1bmssICZkYXRhbXNnLT5jaHVua3MsIGZyYWdfbGlzdCkgeworCQlzY3RwX2NodW5rX2hvbGQoY2h1bmspOworCiAJCS8qIERvIGFjY291bnRpbmcgZm9yIHRoZSB3cml0ZSBzcGFjZS4gICovCiAJCXNjdHBfc2V0X293bmVyX3coY2h1bmspOwogCkBAIC0xOTcwLDEzICsxOTcyLDE1IEBACiAJICogYnJlYWtzLgogCSAqLwogCWVyciA9IHNjdHBfcHJpbWl0aXZlX1NFTkQobmV0LCBhc29jLCBkYXRhbXNnKTsKLQlzY3RwX2RhdGFtc2dfcHV0KGRhdGFtc2cpOwogCS8qIERpZCB0aGUgbG93ZXIgbGF5ZXIgYWNjZXB0IHRoZSBjaHVuaz8gKi8KLQlpZiAoZXJyKQorCWlmIChlcnIpIHsKKwkJc2N0cF9kYXRhbXNnX2ZyZWUoZGF0YW1zZyk7CiAJCWdvdG8gb3V0X2ZyZWU7CisJfQogCiAJcHJfZGVidWcoIiVzOiB3ZSBzZW50IHByaW1pdGl2ZWx5XG4iLCBfX2Z1bmNfXyk7CiAKKwlzY3RwX2RhdGFtc2dfcHV0KGRhdGFtc2cpOwogCWVyciA9IG1zZ19sZW47CiAKIAlpZiAodW5saWtlbHkod2FpdF9jb25uZWN0KSkgewpAQCAtNDQ2OSwxNyArNDQ3MywyMSBAQAogCQkJCSAgY29uc3QgdW5pb24gc2N0cF9hZGRyICpwYWRkciwgdm9pZCAqcCkKIHsKIAlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydDsKLQlpbnQgZXJyID0gMDsKKwlpbnQgZXJyID0gLUVOT0VOVDsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAl0cmFuc3BvcnQgPSBzY3RwX2FkZHJzX2xvb2t1cF90cmFuc3BvcnQobmV0LCBsYWRkciwgcGFkZHIpOwogCWlmICghdHJhbnNwb3J0IHx8ICFzY3RwX3RyYW5zcG9ydF9ob2xkKHRyYW5zcG9ydCkpCiAJCWdvdG8gb3V0OwotCWVyciA9IGNiKHRyYW5zcG9ydCwgcCk7CisKKwlzY3RwX2Fzc29jaWF0aW9uX2hvbGQodHJhbnNwb3J0LT5hc29jKTsKIAlzY3RwX3RyYW5zcG9ydF9wdXQodHJhbnNwb3J0KTsKIAotb3V0OgogCXJjdV9yZWFkX3VubG9jaygpOworCWVyciA9IGNiKHRyYW5zcG9ydCwgcCk7CisJc2N0cF9hc3NvY2lhdGlvbl9wdXQodHJhbnNwb3J0LT5hc29jKTsKKworb3V0OgogCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzY3RwX3RyYW5zcG9ydF9sb29rdXBfcHJvY2Vzcyk7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC90cmFuc3BvcnQuYyBiL25ldC9zY3RwL3RyYW5zcG9ydC5jCmluZGV4IDgxYjg2NjcuLmNlNTRkY2UgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3RyYW5zcG9ydC5jCisrKyBiL25ldC9zY3RwL3RyYW5zcG9ydC5jCkBAIC0yMzMsNyArMjMzLDcgQEAKIAl9CiAKIAlpZiAodHJhbnNwb3J0LT5kc3QpIHsKLQkJdHJhbnNwb3J0LT5wYXRobXR1ID0gV09SRF9UUlVOQyhkc3RfbXR1KHRyYW5zcG9ydC0+ZHN0KSk7CisJCXRyYW5zcG9ydC0+cGF0aG10dSA9IFNDVFBfVFJVTkM0KGRzdF9tdHUodHJhbnNwb3J0LT5kc3QpKTsKIAl9IGVsc2UKIAkJdHJhbnNwb3J0LT5wYXRobXR1ID0gU0NUUF9ERUZBVUxUX01BWFNFR01FTlQ7CiB9CkBAIC0yODcsNyArMjg3LDcgQEAKIAkJcmV0dXJuOwogCX0KIAlpZiAodHJhbnNwb3J0LT5kc3QpIHsKLQkJdHJhbnNwb3J0LT5wYXRobXR1ID0gV09SRF9UUlVOQyhkc3RfbXR1KHRyYW5zcG9ydC0+ZHN0KSk7CisJCXRyYW5zcG9ydC0+cGF0aG10dSA9IFNDVFBfVFJVTkM0KGRzdF9tdHUodHJhbnNwb3J0LT5kc3QpKTsKIAogCQkvKiBJbml0aWFsaXplIHNrLT5za19yY3Zfc2FkZHIsIGlmIHRoZSB0cmFuc3BvcnQgaXMgdGhlCiAJCSAqIGFzc29jaWF0aW9uJ3MgYWN0aXZlIHBhdGggZm9yIGdldHNvY2tuYW1lKCkuCmRpZmYgLS1naXQgYS9uZXQvc2N0cC91bHBldmVudC5jIGIvbmV0L3NjdHAvdWxwZXZlbnQuYwppbmRleCAxYmM0ZjcxLi5iZWEwMDA1IDEwMDY0NAotLS0gYS9uZXQvc2N0cC91bHBldmVudC5jCisrKyBiL25ldC9zY3RwL3VscGV2ZW50LmMKQEAgLTM4Myw3ICszODMsNyBAQAogCiAJY2ggPSAoc2N0cF9lcnJoZHJfdCAqKShjaHVuay0+c2tiLT5kYXRhKTsKIAljYXVzZSA9IGNoLT5jYXVzZTsKLQllbGVuID0gV09SRF9ST1VORChudG9ocyhjaC0+bGVuZ3RoKSkgLSBzaXplb2Yoc2N0cF9lcnJoZHJfdCk7CisJZWxlbiA9IFNDVFBfUEFENChudG9ocyhjaC0+bGVuZ3RoKSkgLSBzaXplb2Yoc2N0cF9lcnJoZHJfdCk7CiAKIAkvKiBQdWxsIG9mZiB0aGUgRVJST1IgaGVhZGVyLiAgKi8KIAlza2JfcHVsbChjaHVuay0+c2tiLCBzaXplb2Yoc2N0cF9lcnJoZHJfdCkpOwpAQCAtNjg4LDcgKzY4OCw3IEBACiAJICogTVVTVCBpZ25vcmUgdGhlIHBhZGRpbmcgYnl0ZXMuCiAJICovCiAJbGVuID0gbnRvaHMoY2h1bmstPmNodW5rX2hkci0+bGVuZ3RoKTsKLQlwYWRkaW5nID0gV09SRF9ST1VORChsZW4pIC0gbGVuOworCXBhZGRpbmcgPSBTQ1RQX1BBRDQobGVuKSAtIGxlbjsKIAogCS8qIEZpeHVwIGNsb25lZCBza2Igd2l0aCBqdXN0IHRoaXMgY2h1bmtzIGRhdGEuICAqLwogCXNrYl90cmltKHNrYiwgY2h1bmstPmNodW5rX2VuZCAtIHBhZGRpbmcgLSBza2ItPmRhdGEpOwpAQCAtNzAyLDE0ICs3MDIsMTQgQEAKIAkgKi8KIAlzY3RwX3VscGV2ZW50X2luaXQoZXZlbnQsIDAsIHNrYi0+bGVuICsgc2l6ZW9mKHN0cnVjdCBza19idWZmKSk7CiAKLQlzY3RwX3VscGV2ZW50X3JlY2VpdmVfZGF0YShldmVudCwgYXNvYyk7Ci0KIAkvKiBBbmQgaG9sZCB0aGUgY2h1bmsgYXMgd2UgbmVlZCBpdCBmb3IgZ2V0dGluZyB0aGUgSVAgaGVhZGVycwogCSAqIGxhdGVyIGluIHJlY3Ztc2cKIAkgKi8KIAlzY3RwX2NodW5rX2hvbGQoY2h1bmspOwogCWV2ZW50LT5jaHVuayA9IGNodW5rOwogCisJc2N0cF91bHBldmVudF9yZWNlaXZlX2RhdGEoZXZlbnQsIGFzb2MpOworCiAJZXZlbnQtPnN0cmVhbSA9IG50b2hzKGNodW5rLT5zdWJoLmRhdGFfaGRyLT5zdHJlYW0pOwogCWV2ZW50LT5zc24gPSBudG9ocyhjaHVuay0+c3ViaC5kYXRhX2hkci0+c3NuKTsKIAlldmVudC0+cHBpZCA9IGNodW5rLT5zdWJoLmRhdGFfaGRyLT5wcGlkOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvdWxwcXVldWUuYyBiL25ldC9zY3RwL3VscHF1ZXVlLmMKaW5kZXggODc3ZTU1MC4uODRkMGZkYSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvdWxwcXVldWUuYworKysgYi9uZXQvc2N0cC91bHBxdWV1ZS5jCkBAIC0xNDAsMTEgKzE0MCw4IEBACiAJCSAqIHdlIGNhbiBnbyBhaGVhZCBhbmQgY2xlYXIgb3V0IHRoZSBsb2JieSBpbiBvbmUgc2hvdAogCQkgKi8KIAkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnNwLT5wZF9sb2JieSkpIHsKLQkJCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CiAJCQlza2JfcXVldWVfc3BsaWNlX3RhaWxfaW5pdCgmc3AtPnBkX2xvYmJ5LAogCQkJCQkJICAgJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKLQkJCWxpc3QgPSAoc3RydWN0IGxpc3RfaGVhZCAqKSZzY3RwX3NrKHNrKS0+cGRfbG9iYnk7Ci0JCQlJTklUX0xJU1RfSEVBRChsaXN0KTsKIAkJCXJldHVybiAxOwogCQl9CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL25ldC9zdHJwYXJzZXIvS2NvbmZpZyBiL25ldC9zdHJwYXJzZXIvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2ZmM2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3N0cnBhcnNlci9LY29uZmlnCkBAIC0wLDAgKzEsNCBAQAorCitjb25maWcgU1RSRUFNX1BBUlNFUgorCXRyaXN0YXRlCisJZGVmYXVsdCBuCmRpZmYgLS1naXQgYS9uZXQvc3RycGFyc2VyL01ha2VmaWxlIGIvbmV0L3N0cnBhcnNlci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NThhMTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3N0cnBhcnNlci9NYWtlZmlsZQpAQCAtMCwwICsxIEBACitvYmotJChDT05GSUdfU1RSRUFNX1BBUlNFUikgKz0gc3RycGFyc2VyLm8KZGlmZiAtLWdpdCBhL25ldC9zdHJwYXJzZXIvc3RycGFyc2VyLmMgYi9uZXQvc3RycGFyc2VyL3N0cnBhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNzU0OWIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc3RycGFyc2VyL3N0cnBhcnNlci5jCkBAIC0wLDAgKzEsNTEwIEBACisvKgorICogU3RyZWFtIFBhcnNlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBUb20gSGVyYmVydCA8dG9tQGhlcmJlcnRsYW5kLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9icGYuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2VycnF1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bmV0L3N0cnBhcnNlci5oPgorI2luY2x1ZGUgPG5ldC9uZXRucy9nZW5lcmljLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpzdHJwX3dxOworCitzdHJ1Y3QgX3N0cnBfcnhfbXNnIHsKKwkvKiBJbnRlcm5hbCBjYiBzdHJ1Y3R1cmUuIHN0cnVjdCBzdHJwX3J4X21zZyBtdXN0IGJlIGZpcnN0IGZvciBwYXNzaW5nCisJICogdG8gdXBwZXIgbGF5ZXIuCisJICovCisJc3RydWN0IHN0cnBfcnhfbXNnIHN0cnA7CisJaW50IGFjY3VtX2xlbjsKKwlpbnQgZWFybHlfZWF0ZW47Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBfc3RycF9yeF9tc2cgKl9zdHJwX3J4X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAoc3RydWN0IF9zdHJwX3J4X21zZyAqKSgodm9pZCAqKXNrYi0+Y2IgKworCQlvZmZzZXRvZihzdHJ1Y3QgcWRpc2Nfc2tiX2NiLCBkYXRhKSk7Cit9CisKKy8qIExvd2VyIGxvY2sgaGVsZCAqLworc3RhdGljIHZvaWQgc3RycF9hYm9ydF9yeF9zdHJwKHN0cnVjdCBzdHJwYXJzZXIgKnN0cnAsIGludCBlcnIpCit7CisJc3RydWN0IHNvY2sgKmNzayA9IHN0cnAtPnNrOworCisJLyogVW5yZWNvdmVyYWJsZSBlcnJvciBpbiByZWNlaXZlICovCisKKwlkZWxfdGltZXIoJnN0cnAtPnJ4X21zZ190aW1lcik7CisKKwlpZiAoc3RycC0+cnhfc3RvcHBlZCkKKwkJcmV0dXJuOworCisJc3RycC0+cnhfc3RvcHBlZCA9IDE7CisKKwkvKiBSZXBvcnQgYW4gZXJyb3Igb24gdGhlIGxvd2VyIHNvY2tldCAqLworCWNzay0+c2tfZXJyID0gZXJyOworCWNzay0+c2tfZXJyb3JfcmVwb3J0KGNzayk7Cit9CisKK3N0YXRpYyB2b2lkIHN0cnBfc3RhcnRfcnhfdGltZXIoc3RydWN0IHN0cnBhcnNlciAqc3RycCkKK3sKKwlpZiAoc3RycC0+c2stPnNrX3JjdnRpbWVvKQorCQltb2RfdGltZXIoJnN0cnAtPnJ4X21zZ190aW1lciwgc3RycC0+c2stPnNrX3JjdnRpbWVvKTsKK30KKworLyogTG93ZXIgbG9jayBoZWxkICovCitzdGF0aWMgdm9pZCBzdHJwX3BhcnNlcl9lcnIoc3RydWN0IHN0cnBhcnNlciAqc3RycCwgaW50IGVyciwKKwkJCSAgICByZWFkX2Rlc2NyaXB0b3JfdCAqZGVzYykKK3sKKwlkZXNjLT5lcnJvciA9IGVycjsKKwlrZnJlZV9za2Ioc3RycC0+cnhfc2tiX2hlYWQpOworCXN0cnAtPnJ4X3NrYl9oZWFkID0gTlVMTDsKKwlzdHJwLT5jYi5hYm9ydF9wYXJzZXIoc3RycCwgZXJyKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc3RycF9wZWVrX2xlbihzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwKQoreworCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBzdHJwLT5zay0+c2tfc29ja2V0OworCisJcmV0dXJuIHNvY2stPm9wcy0+cGVla19sZW4oc29jayk7Cit9CisKKy8qIExvd2VyIHNvY2tldCBsb2NrIGhlbGQgKi8KK3N0YXRpYyBpbnQgc3RycF9yZWN2KHJlYWRfZGVzY3JpcHRvcl90ICpkZXNjLCBzdHJ1Y3Qgc2tfYnVmZiAqb3JpZ19za2IsCisJCSAgICAgdW5zaWduZWQgaW50IG9yaWdfb2Zmc2V0LCBzaXplX3Qgb3JpZ19sZW4pCit7CisJc3RydWN0IHN0cnBhcnNlciAqc3RycCA9IChzdHJ1Y3Qgc3RycGFyc2VyICopZGVzYy0+YXJnLmRhdGE7CisJc3RydWN0IF9zdHJwX3J4X21zZyAqcnhtOworCXN0cnVjdCBza19idWZmICpoZWFkLCAqc2tiOworCXNpemVfdCBlYXRlbiA9IDAsIGNhbmRfbGVuOworCXNzaXplX3QgZXh0cmE7CisJaW50IGVycjsKKwlib29sIGNsb25lZF9vcmlnID0gZmFsc2U7CisKKwlpZiAoc3RycC0+cnhfcGF1c2VkKQorCQlyZXR1cm4gMDsKKworCWhlYWQgPSBzdHJwLT5yeF9za2JfaGVhZDsKKwlpZiAoaGVhZCkgeworCQkvKiBNZXNzYWdlIGFscmVhZHkgaW4gcHJvZ3Jlc3MgKi8KKworCQlyeG0gPSBfc3RycF9yeF9tc2coaGVhZCk7CisJCWlmICh1bmxpa2VseShyeG0tPmVhcmx5X2VhdGVuKSkgeworCQkJLyogQWxyZWFkeSBzb21lIG51bWJlciBvZiBieXRlcyBvbiB0aGUgcmVjZWl2ZSBzb2NrCisJCQkgKiBkYXRhIHNhdmVkIGluIHJ4X3NrYl9oZWFkLCBqdXN0IGluZGljYXRlIHRoZXkKKwkJCSAqIGFyZSBjb25zdW1lZC4KKwkJCSAqLworCQkJZWF0ZW4gPSBvcmlnX2xlbiA8PSByeG0tPmVhcmx5X2VhdGVuID8KKwkJCQlvcmlnX2xlbiA6IHJ4bS0+ZWFybHlfZWF0ZW47CisJCQlyeG0tPmVhcmx5X2VhdGVuIC09IGVhdGVuOworCisJCQlyZXR1cm4gZWF0ZW47CisJCX0KKworCQlpZiAodW5saWtlbHkob3JpZ19vZmZzZXQpKSB7CisJCQkvKiBHZXR0aW5nIGRhdGEgd2l0aCBhIG5vbi16ZXJvIG9mZnNldCB3aGVuIGEgbWVzc2FnZSBpcworCQkJICogaW4gcHJvZ3Jlc3MgaXMgbm90IGV4cGVjdGVkLiBJZiBpdCBkb2VzIGhhcHBlbiwgd2UKKwkJCSAqIG5lZWQgdG8gY2xvbmUgYW5kIHB1bGwgc2luY2Ugd2UgY2FuJ3QgZGVhbCB3aXRoCisJCQkgKiBvZmZzZXRzIGluIHRoZSBza2JzIGZvciBhIG1lc3NhZ2UgZXhwZWN0IGluIHRoZSBoZWFkLgorCQkJICovCisJCQlvcmlnX3NrYiA9IHNrYl9jbG9uZShvcmlnX3NrYiwgR0ZQX0FUT01JQyk7CisJCQlpZiAoIW9yaWdfc2tiKSB7CisJCQkJU1RSUF9TVEFUU19JTkNSKHN0cnAtPnN0YXRzLnJ4X21lbV9mYWlsKTsKKwkJCQlkZXNjLT5lcnJvciA9IC1FTk9NRU07CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAoIXBza2JfcHVsbChvcmlnX3NrYiwgb3JpZ19vZmZzZXQpKSB7CisJCQkJU1RSUF9TVEFUU19JTkNSKHN0cnAtPnN0YXRzLnJ4X21lbV9mYWlsKTsKKwkJCQlrZnJlZV9za2Iob3JpZ19za2IpOworCQkJCWRlc2MtPmVycm9yID0gLUVOT01FTTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWNsb25lZF9vcmlnID0gdHJ1ZTsKKwkJCW9yaWdfb2Zmc2V0ID0gMDsKKwkJfQorCisJCWlmICghc3RycC0+cnhfc2tiX25leHRwKSB7CisJCQkvKiBXZSBhcmUgZ29pbmcgdG8gYXBwZW5kIHRvIHRoZSBmcmFnc19saXN0IG9mIGhlYWQuCisJCQkgKiBOZWVkIHRvIHVuc2hhcmUgdGhlIGZyYWdfbGlzdC4KKwkJCSAqLworCQkJZXJyID0gc2tiX3VuY2xvbmUoaGVhZCwgR0ZQX0FUT01JQyk7CisJCQlpZiAoZXJyKSB7CisJCQkJU1RSUF9TVEFUU19JTkNSKHN0cnAtPnN0YXRzLnJ4X21lbV9mYWlsKTsKKwkJCQlkZXNjLT5lcnJvciA9IGVycjsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJaWYgKHVubGlrZWx5KHNrYl9zaGluZm8oaGVhZCktPmZyYWdfbGlzdCkpIHsKKwkJCQkvKiBXZSBjYW4ndCBhcHBlbmQgdG8gYW4gc2tfYnVmZiB0aGF0IGFscmVhZHkKKwkJCQkgKiBoYXMgYSBmcmFnX2xpc3QuIFdlIGNyZWF0ZSBhIG5ldyBoZWFkLCBwb2ludAorCQkJCSAqIHRoZSBmcmFnX2xpc3Qgb2YgdGhhdCB0byB0aGUgb2xkIGhlYWQsIGFuZAorCQkJCSAqIHRoZW4gYXJlIGFibGUgdG8gdXNlIHRoZSBvbGQgaGVhZC0+bmV4dCBmb3IKKwkJCQkgKiBhcHBlbmRpbmcgdG8gdGhlIG1lc3NhZ2UuCisJCQkJICovCisJCQkJaWYgKFdBUk5fT04oaGVhZC0+bmV4dCkpIHsKKwkJCQkJZGVzYy0+ZXJyb3IgPSAtRUlOVkFMOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisKKwkJCQlza2IgPSBhbGxvY19za2IoMCwgR0ZQX0FUT01JQyk7CisJCQkJaWYgKCFza2IpIHsKKwkJCQkJU1RSUF9TVEFUU19JTkNSKHN0cnAtPnN0YXRzLnJ4X21lbV9mYWlsKTsKKwkJCQkJZGVzYy0+ZXJyb3IgPSAtRU5PTUVNOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJc2tiLT5sZW4gPSBoZWFkLT5sZW47CisJCQkJc2tiLT5kYXRhX2xlbiA9IGhlYWQtPmxlbjsKKwkJCQlza2ItPnRydWVzaXplID0gaGVhZC0+dHJ1ZXNpemU7CisJCQkJKl9zdHJwX3J4X21zZyhza2IpID0gKl9zdHJwX3J4X21zZyhoZWFkKTsKKwkJCQlzdHJwLT5yeF9za2JfbmV4dHAgPSAmaGVhZC0+bmV4dDsKKwkJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCA9IGhlYWQ7CisJCQkJc3RycC0+cnhfc2tiX2hlYWQgPSBza2I7CisJCQkJaGVhZCA9IHNrYjsKKwkJCX0gZWxzZSB7CisJCQkJc3RycC0+cnhfc2tiX25leHRwID0KKwkJCQkgICAgJnNrYl9zaGluZm8oaGVhZCktPmZyYWdfbGlzdDsKKwkJCX0KKwkJfQorCX0KKworCXdoaWxlIChlYXRlbiA8IG9yaWdfbGVuKSB7CisJCS8qIEFsd2F5cyBjbG9uZSBzaW5jZSB3ZSB3aWxsIGNvbnN1bWUgc29tZXRoaW5nICovCisJCXNrYiA9IHNrYl9jbG9uZShvcmlnX3NrYiwgR0ZQX0FUT01JQyk7CisJCWlmICghc2tiKSB7CisJCQlTVFJQX1NUQVRTX0lOQ1Ioc3RycC0+c3RhdHMucnhfbWVtX2ZhaWwpOworCQkJZGVzYy0+ZXJyb3IgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKworCQljYW5kX2xlbiA9IG9yaWdfbGVuIC0gZWF0ZW47CisKKwkJaGVhZCA9IHN0cnAtPnJ4X3NrYl9oZWFkOworCQlpZiAoIWhlYWQpIHsKKwkJCWhlYWQgPSBza2I7CisJCQlzdHJwLT5yeF9za2JfaGVhZCA9IGhlYWQ7CisJCQkvKiBXaWxsIHNldCByeF9za2JfbmV4dHAgb24gbmV4dCBwYWNrZXQgaWYgbmVlZGVkICovCisJCQlzdHJwLT5yeF9za2JfbmV4dHAgPSBOVUxMOworCQkJcnhtID0gX3N0cnBfcnhfbXNnKGhlYWQpOworCQkJbWVtc2V0KHJ4bSwgMCwgc2l6ZW9mKCpyeG0pKTsKKwkJCXJ4bS0+c3RycC5vZmZzZXQgPSBvcmlnX29mZnNldCArIGVhdGVuOworCQl9IGVsc2UgeworCQkJLyogVW5jbG9uZSBzaW5jZSB3ZSBtYXkgYmUgYXBwZW5kaW5nIHRvIGFuIHNrYiB0aGF0IHdlCisJCQkgKiBhbHJlYWR5IHNoYXJlIGEgZnJhZ19saXN0IHdpdGguCisJCQkgKi8KKwkJCWVyciA9IHNrYl91bmNsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJCQlpZiAoZXJyKSB7CisJCQkJU1RSUF9TVEFUU19JTkNSKHN0cnAtPnN0YXRzLnJ4X21lbV9mYWlsKTsKKwkJCQlkZXNjLT5lcnJvciA9IGVycjsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcnhtID0gX3N0cnBfcnhfbXNnKGhlYWQpOworCQkJKnN0cnAtPnJ4X3NrYl9uZXh0cCA9IHNrYjsKKwkJCXN0cnAtPnJ4X3NrYl9uZXh0cCA9ICZza2ItPm5leHQ7CisJCQloZWFkLT5kYXRhX2xlbiArPSBza2ItPmxlbjsKKwkJCWhlYWQtPmxlbiArPSBza2ItPmxlbjsKKwkJCWhlYWQtPnRydWVzaXplICs9IHNrYi0+dHJ1ZXNpemU7CisJCX0KKworCQlpZiAoIXJ4bS0+c3RycC5mdWxsX2xlbikgeworCQkJc3NpemVfdCBsZW47CisKKwkJCWxlbiA9ICgqc3RycC0+Y2IucGFyc2VfbXNnKShzdHJwLCBoZWFkKTsKKworCQkJaWYgKCFsZW4pIHsKKwkJCQkvKiBOZWVkIG1vcmUgaGVhZGVyIHRvIGRldGVybWluZSBsZW5ndGggKi8KKwkJCQlpZiAoIXJ4bS0+YWNjdW1fbGVuKSB7CisJCQkJCS8qIFN0YXJ0IFJYIHRpbWVyIGZvciBuZXcgbWVzc2FnZSAqLworCQkJCQlzdHJwX3N0YXJ0X3J4X3RpbWVyKHN0cnApOworCQkJCX0KKwkJCQlyeG0tPmFjY3VtX2xlbiArPSBjYW5kX2xlbjsKKwkJCQllYXRlbiArPSBjYW5kX2xlbjsKKwkJCQlTVFJQX1NUQVRTX0lOQ1Ioc3RycC0+c3RhdHMucnhfbmVlZF9tb3JlX2hkcik7CisJCQkJV0FSTl9PTihlYXRlbiAhPSBvcmlnX2xlbik7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKGxlbiA8IDApIHsKKwkJCQlpZiAobGVuID09IC1FU1RSUElQRSAmJiByeG0tPmFjY3VtX2xlbikgeworCQkJCQlsZW4gPSAtRU5PREFUQTsKKwkJCQkJc3RycC0+cnhfdW5yZWNvdl9pbnRyID0gMTsKKwkJCQl9IGVsc2UgeworCQkJCQlzdHJwLT5yeF9pbnRlcnJ1cHRlZCA9IDE7CisJCQkJfQorCQkJCXN0cnBfcGFyc2VyX2VycihzdHJwLCBlcnIsIGRlc2MpOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChsZW4gPiBzdHJwLT5zay0+c2tfcmN2YnVmKSB7CisJCQkJLyogTWVzc2FnZSBsZW5ndGggZXhjZWVkcyBtYXhpbXVtIGFsbG93ZWQgKi8KKwkJCQlTVFJQX1NUQVRTX0lOQ1Ioc3RycC0+c3RhdHMucnhfbXNnX3Rvb19iaWcpOworCQkJCXN0cnBfcGFyc2VyX2VycihzdHJwLCAtRU1TR1NJWkUsIGRlc2MpOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChsZW4gPD0gKHNzaXplX3QpaGVhZC0+bGVuIC0KKwkJCQkJICBza2ItPmxlbiAtIHJ4bS0+c3RycC5vZmZzZXQpIHsKKwkJCQkvKiBMZW5ndGggbXVzdCBiZSBpbnRvIG5ldyBza2IgKGFuZCBhbHNvCisJCQkJICogZ3JlYXRlciB0aGFuIHplcm8pCisJCQkJICovCisJCQkJU1RSUF9TVEFUU19JTkNSKHN0cnAtPnN0YXRzLnJ4X2JhZF9oZHJfbGVuKTsKKwkJCQlzdHJwX3BhcnNlcl9lcnIoc3RycCwgLUVQUk9UTywgZGVzYyk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXJ4bS0+c3RycC5mdWxsX2xlbiA9IGxlbjsKKwkJfQorCisJCWV4dHJhID0gKHNzaXplX3QpKHJ4bS0+YWNjdW1fbGVuICsgY2FuZF9sZW4pIC0KKwkJCXJ4bS0+c3RycC5mdWxsX2xlbjsKKworCQlpZiAoZXh0cmEgPCAwKSB7CisJCQkvKiBNZXNzYWdlIG5vdCBjb21wbGV0ZSB5ZXQuICovCisJCQlpZiAocnhtLT5zdHJwLmZ1bGxfbGVuIC0gcnhtLT5hY2N1bV9sZW4gPgorCQkJICAgIHN0cnBfcGVla19sZW4oc3RycCkpIHsKKwkJCQkvKiBEb24ndCBoYXZlIHRoZSB3aG9sZSBtZXNzYWdlcyBpbiB0aGUgc29ja2V0CisJCQkJICogYnVmZmVyLiBTZXQgc3RycC0+cnhfbmVlZF9ieXRlcyB0byB3YWl0IGZvcgorCQkJCSAqIHRoZSByZXN0IG9mIHRoZSBtZXNzYWdlLiBBbHNvLCBzZXQgImVhcmx5CisJCQkJICogZWF0ZW4iIHNpbmNlIHdlJ3ZlIGFscmVhZHkgYnVmZmVyZWQgdGhlIHNrYgorCQkJCSAqIGJ1dCBkb24ndCBjb25zdW1lIHlldCBwZXIgc3RycF9yZWFkX3NvY2suCisJCQkJICovCisKKwkJCQlpZiAoIXJ4bS0+YWNjdW1fbGVuKSB7CisJCQkJCS8qIFN0YXJ0IFJYIHRpbWVyIGZvciBuZXcgbWVzc2FnZSAqLworCQkJCQlzdHJwX3N0YXJ0X3J4X3RpbWVyKHN0cnApOworCQkJCX0KKworCQkJCXN0cnAtPnJ4X25lZWRfYnl0ZXMgPSByeG0tPnN0cnAuZnVsbF9sZW4gLQorCQkJCQkJICAgICAgIHJ4bS0+YWNjdW1fbGVuOworCQkJCXJ4bS0+YWNjdW1fbGVuICs9IGNhbmRfbGVuOworCQkJCXJ4bS0+ZWFybHlfZWF0ZW4gPSBjYW5kX2xlbjsKKwkJCQlTVFJQX1NUQVRTX0FERChzdHJwLT5zdGF0cy5yeF9ieXRlcywgY2FuZF9sZW4pOworCQkJCWRlc2MtPmNvdW50ID0gMDsgLyogU3RvcCByZWFkaW5nIHNvY2tldCAqLworCQkJCWJyZWFrOworCQkJfQorCQkJcnhtLT5hY2N1bV9sZW4gKz0gY2FuZF9sZW47CisJCQllYXRlbiArPSBjYW5kX2xlbjsKKwkJCVdBUk5fT04oZWF0ZW4gIT0gb3JpZ19sZW4pOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBQb3NpdGl2ZSBleHRyYSBpbmRpY2F0ZXMgb3JlIGJ5dGVzIHRoYW4gbmVlZGVkIGZvciB0aGUKKwkJICogbWVzc2FnZQorCQkgKi8KKworCQlXQVJOX09OKGV4dHJhID4gY2FuZF9sZW4pOworCisJCWVhdGVuICs9IChjYW5kX2xlbiAtIGV4dHJhKTsKKworCQkvKiBIdXJyYXksIHdlIGhhdmUgYSBuZXcgbWVzc2FnZSEgKi8KKwkJZGVsX3RpbWVyKCZzdHJwLT5yeF9tc2dfdGltZXIpOworCQlzdHJwLT5yeF9za2JfaGVhZCA9IE5VTEw7CisJCVNUUlBfU1RBVFNfSU5DUihzdHJwLT5zdGF0cy5yeF9tc2dzKTsKKworCQkvKiBHaXZlIHNrYiB0byB1cHBlciBsYXllciAqLworCQlzdHJwLT5jYi5yY3ZfbXNnKHN0cnAsIGhlYWQpOworCisJCWlmICh1bmxpa2VseShzdHJwLT5yeF9wYXVzZWQpKSB7CisJCQkvKiBVcHBlciBsYXllciBwYXVzZWQgc3RycCAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoY2xvbmVkX29yaWcpCisJCWtmcmVlX3NrYihvcmlnX3NrYik7CisKKwlTVFJQX1NUQVRTX0FERChzdHJwLT5zdGF0cy5yeF9ieXRlcywgZWF0ZW4pOworCisJcmV0dXJuIGVhdGVuOworfQorCitzdGF0aWMgaW50IGRlZmF1bHRfcmVhZF9zb2NrX2RvbmUoc3RydWN0IHN0cnBhcnNlciAqc3RycCwgaW50IGVycikKK3sKKwlyZXR1cm4gZXJyOworfQorCisvKiBDYWxsZWQgd2l0aCBsb2NrIGhlbGQgb24gbG93ZXIgc29ja2V0ICovCitzdGF0aWMgaW50IHN0cnBfcmVhZF9zb2NrKHN0cnVjdCBzdHJwYXJzZXIgKnN0cnApCit7CisJc3RydWN0IHNvY2tldCAqc29jayA9IHN0cnAtPnNrLT5za19zb2NrZXQ7CisJcmVhZF9kZXNjcmlwdG9yX3QgZGVzYzsKKworCWRlc2MuYXJnLmRhdGEgPSBzdHJwOworCWRlc2MuZXJyb3IgPSAwOworCWRlc2MuY291bnQgPSAxOyAvKiBnaXZlIG1vcmUgdGhhbiBvbmUgc2tiIHBlciBjYWxsICovCisKKwkvKiBzayBzaG91bGQgYmUgbG9ja2VkIGhlcmUsIHNvIG9rYXkgdG8gZG8gcmVhZF9zb2NrICovCisJc29jay0+b3BzLT5yZWFkX3NvY2soc3RycC0+c2ssICZkZXNjLCBzdHJwX3JlY3YpOworCisJZGVzYy5lcnJvciA9IHN0cnAtPmNiLnJlYWRfc29ja19kb25lKHN0cnAsIGRlc2MuZXJyb3IpOworCisJcmV0dXJuIGRlc2MuZXJyb3I7Cit9CisKKy8qIExvd2VyIHNvY2sgbG9jayBoZWxkICovCit2b2lkIHN0cnBfZGF0YV9yZWFkeShzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwKQoreworCWlmICh1bmxpa2VseShzdHJwLT5yeF9zdG9wcGVkKSkKKwkJcmV0dXJuOworCisJLyogVGhpcyBjaGVjayBpcyBuZWVkZWQgdG8gc3luY2hyb25pemUgd2l0aCBkb19zdHJwX3J4X3dvcmsuCisJICogZG9fc3RycF9yeF93b3JrIGFjcXVpcmVzIGEgcHJvY2VzcyBsb2NrIChsb2NrX3NvY2spIHdoZXJlYXMKKwkgKiB0aGUgbG9jayBoZWxkIGhlcmUgaXMgYmhfbG9ja19zb2NrLiBUaGUgdHdvIGxvY2tzIGNhbiBiZQorCSAqIGhlbGQgYnkgZGlmZmVyZW50IHRocmVhZHMgYXQgdGhlIHNhbWUgdGltZSwgYnV0IGJoX2xvY2tfc29jaworCSAqIGFsbG93cyBhIHRocmVhZCBpbiBCSCBjb250ZXh0IHRvIHNhZmVseSBjaGVjayBpZiB0aGUgcHJvY2VzcworCSAqIGxvY2sgaXMgaGVsZC4gSW4gdGhpcyBjYXNlLCBpZiB0aGUgbG9jayBpcyBoZWxkLCBxdWV1ZSB3b3JrLgorCSAqLworCWlmIChzb2NrX293bmVkX2J5X3VzZXIoc3RycC0+c2spKSB7CisJCXF1ZXVlX3dvcmsoc3RycF93cSwgJnN0cnAtPnJ4X3dvcmspOworCQlyZXR1cm47CisJfQorCisJaWYgKHN0cnAtPnJ4X3BhdXNlZCkKKwkJcmV0dXJuOworCisJaWYgKHN0cnAtPnJ4X25lZWRfYnl0ZXMpIHsKKwkJaWYgKHN0cnBfcGVla19sZW4oc3RycCkgPj0gc3RycC0+cnhfbmVlZF9ieXRlcykKKwkJCXN0cnAtPnJ4X25lZWRfYnl0ZXMgPSAwOworCQllbHNlCisJCQlyZXR1cm47CisJfQorCisJaWYgKHN0cnBfcmVhZF9zb2NrKHN0cnApID09IC1FTk9NRU0pCisJCXF1ZXVlX3dvcmsoc3RycF93cSwgJnN0cnAtPnJ4X3dvcmspOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3RycF9kYXRhX3JlYWR5KTsKKworc3RhdGljIHZvaWQgZG9fc3RycF9yeF93b3JrKHN0cnVjdCBzdHJwYXJzZXIgKnN0cnApCit7CisJcmVhZF9kZXNjcmlwdG9yX3QgcmRfZGVzYzsKKwlzdHJ1Y3Qgc29jayAqY3NrID0gc3RycC0+c2s7CisKKwkvKiBXZSBuZWVkIHRoZSByZWFkIGxvY2sgdG8gc3luY2hyb25pemUgd2l0aCBzdHJwX2RhdGFfcmVhZHkuIFdlCisJICogbmVlZCB0aGUgc29ja2V0IGxvY2sgZm9yIGNhbGxpbmcgc3RycF9yZWFkX3NvY2suCisJICovCisJbG9ja19zb2NrKGNzayk7CisKKwlpZiAodW5saWtlbHkoc3RycC0+cnhfc3RvcHBlZCkpCisJCWdvdG8gb3V0OworCisJaWYgKHN0cnAtPnJ4X3BhdXNlZCkKKwkJZ290byBvdXQ7CisKKwlyZF9kZXNjLmFyZy5kYXRhID0gc3RycDsKKworCWlmIChzdHJwX3JlYWRfc29jayhzdHJwKSA9PSAtRU5PTUVNKQorCQlxdWV1ZV93b3JrKHN0cnBfd3EsICZzdHJwLT5yeF93b3JrKTsKKworb3V0OgorCXJlbGVhc2Vfc29jayhjc2spOworfQorCitzdGF0aWMgdm9pZCBzdHJwX3J4X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3KQoreworCWRvX3N0cnBfcnhfd29yayhjb250YWluZXJfb2Yodywgc3RydWN0IHN0cnBhcnNlciwgcnhfd29yaykpOworfQorCitzdGF0aWMgdm9pZCBzdHJwX3J4X21zZ190aW1lb3V0KHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzdHJwYXJzZXIgKnN0cnAgPSAoc3RydWN0IHN0cnBhcnNlciAqKWFyZzsKKworCS8qIE1lc3NhZ2UgYXNzZW1ibHkgdGltZWQgb3V0ICovCisJU1RSUF9TVEFUU19JTkNSKHN0cnAtPnN0YXRzLnJ4X21zZ190aW1lb3V0cyk7CisJbG9ja19zb2NrKHN0cnAtPnNrKTsKKwlzdHJwLT5jYi5hYm9ydF9wYXJzZXIoc3RycCwgRVRJTUVET1VUKTsKKwlyZWxlYXNlX3NvY2soc3RycC0+c2spOworfQorCitpbnQgc3RycF9pbml0KHN0cnVjdCBzdHJwYXJzZXIgKnN0cnAsIHN0cnVjdCBzb2NrICpjc2ssCisJICAgICAgc3RydWN0IHN0cnBfY2FsbGJhY2tzICpjYikKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gY3NrLT5za19zb2NrZXQ7CisKKwlpZiAoIWNiIHx8ICFjYi0+cmN2X21zZyB8fCAhY2ItPnBhcnNlX21zZykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXNvY2stPm9wcy0+cmVhZF9zb2NrIHx8ICFzb2NrLT5vcHMtPnBlZWtfbGVuKQorCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKKworCW1lbXNldChzdHJwLCAwLCBzaXplb2YoKnN0cnApKTsKKworCXN0cnAtPnNrID0gY3NrOworCisJc2V0dXBfdGltZXIoJnN0cnAtPnJ4X21zZ190aW1lciwgc3RycF9yeF9tc2dfdGltZW91dCwKKwkJICAgICh1bnNpZ25lZCBsb25nKXN0cnApOworCisJSU5JVF9XT1JLKCZzdHJwLT5yeF93b3JrLCBzdHJwX3J4X3dvcmspOworCisJc3RycC0+Y2IucmN2X21zZyA9IGNiLT5yY3ZfbXNnOworCXN0cnAtPmNiLnBhcnNlX21zZyA9IGNiLT5wYXJzZV9tc2c7CisJc3RycC0+Y2IucmVhZF9zb2NrX2RvbmUgPSBjYi0+cmVhZF9zb2NrX2RvbmUgPyA6IGRlZmF1bHRfcmVhZF9zb2NrX2RvbmU7CisJc3RycC0+Y2IuYWJvcnRfcGFyc2VyID0gY2ItPmFib3J0X3BhcnNlciA/IDogc3RycF9hYm9ydF9yeF9zdHJwOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzdHJwX2luaXQpOworCit2b2lkIHN0cnBfdW5wYXVzZShzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwKQoreworCXN0cnAtPnJ4X3BhdXNlZCA9IDA7CisKKwkvKiBTeW5jIHNldHRpbmcgcnhfcGF1c2VkIHdpdGggUlggd29yayAqLworCXNtcF9tYigpOworCisJcXVldWVfd29yayhzdHJwX3dxLCAmc3RycC0+cnhfd29yayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzdHJwX3VucGF1c2UpOworCisvKiBzdHJwIG11c3QgYWxyZWFkeSBiZSBzdG9wcGVkIHNvIHRoYXQgc3RycF9yZWN2IHdpbGwgbm8gbG9uZ2VyIGJlIGNhbGxlZC4KKyAqIE5vdGUgdGhhdCBzdHJwX2RvbmUgaXMgbm90IGNhbGxlZCB3aXRoIHRoZSBsb3dlciBzb2NrZXQgaGVsZC4KKyAqLwordm9pZCBzdHJwX2RvbmUoc3RydWN0IHN0cnBhcnNlciAqc3RycCkKK3sKKwlXQVJOX09OKCFzdHJwLT5yeF9zdG9wcGVkKTsKKworCWRlbF90aW1lcl9zeW5jKCZzdHJwLT5yeF9tc2dfdGltZXIpOworCWNhbmNlbF93b3JrX3N5bmMoJnN0cnAtPnJ4X3dvcmspOworCisJaWYgKHN0cnAtPnJ4X3NrYl9oZWFkKSB7CisJCWtmcmVlX3NrYihzdHJwLT5yeF9za2JfaGVhZCk7CisJCXN0cnAtPnJ4X3NrYl9oZWFkID0gTlVMTDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzdHJwX2RvbmUpOworCit2b2lkIHN0cnBfc3RvcChzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwKQoreworCXN0cnAtPnJ4X3N0b3BwZWQgPSAxOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3RycF9zdG9wKTsKKwordm9pZCBzdHJwX2NoZWNrX3JjdihzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwKQoreworCXF1ZXVlX3dvcmsoc3RycF93cSwgJnN0cnAtPnJ4X3dvcmspOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3RycF9jaGVja19yY3YpOworCitzdGF0aWMgaW50IF9faW5pdCBzdHJwX21vZF9pbml0KHZvaWQpCit7CisJc3RycF93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJrc3RycCIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzdHJwX21vZF9leGl0KHZvaWQpCit7Cit9Cittb2R1bGVfaW5pdChzdHJwX21vZF9pbml0KTsKK21vZHVsZV9leGl0KHN0cnBfbW9kX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9zdmNhdXRoX2dzcy5jIGIvbmV0L3N1bnJwYy9hdXRoX2dzcy9zdmNhdXRoX2dzcy5jCmluZGV4IDFkMjgxODEuLmQ4NTgyMDIgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvYXV0aF9nc3Mvc3ZjYXV0aF9nc3MuYworKysgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL3N2Y2F1dGhfZ3NzLmMKQEAgLTU2OSw5ICs1NjksMTAgQEAKIAlzdHJ1Y3QgcnNjICpmb3VuZDsKIAogCW1lbXNldCgmcnNjaSwgMCwgc2l6ZW9mKHJzY2kpKTsKLQlyc2NpLmhhbmRsZS5kYXRhID0gaGFuZGxlLT5kYXRhOwotCXJzY2kuaGFuZGxlLmxlbiA9IGhhbmRsZS0+bGVuOworCWlmIChkdXBfdG9fbmV0b2JqKCZyc2NpLmhhbmRsZSwgaGFuZGxlLT5kYXRhLCBoYW5kbGUtPmxlbikpCisJCXJldHVybiBOVUxMOwogCWZvdW5kID0gcnNjX2xvb2t1cChjZCwgJnJzY2kpOworCXJzY19mcmVlKCZyc2NpKTsKIAlpZiAoIWZvdW5kKQogCQlyZXR1cm4gTlVMTDsKIAlpZiAoY2FjaGVfY2hlY2soY2QsICZmb3VuZC0+aCwgTlVMTCkpCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2NsbnQuYyBiL25ldC9zdW5ycGMvY2xudC5jCmluZGV4IDdmNzlmYjcuLjY2ZjIzYjMgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvY2xudC5jCisrKyBiL25ldC9zdW5ycGMvY2xudC5jCkBAIC00NTMsNyArNDUzLDcgQEAKIAlzdHJ1Y3QgcnBjX3hwcnRfc3dpdGNoICp4cHM7CiAKIAlpZiAoYXJncy0+YmNfeHBydCAmJiBhcmdzLT5iY194cHJ0LT54cHRfYmNfeHBzKSB7Ci0JCVdBUk5fT04oYXJncy0+cHJvdG9jb2wgIT0gWFBSVF9UUkFOU1BPUlRfQkNfVENQKTsKKwkJV0FSTl9PTl9PTkNFKCEoYXJncy0+cHJvdG9jb2wgJiBYUFJUX1RSQU5TUE9SVF9CQykpOwogCQl4cHMgPSBhcmdzLT5iY194cHJ0LT54cHRfYmNfeHBzOwogCQl4cHJ0X3N3aXRjaF9nZXQoeHBzKTsKIAl9IGVsc2UgewpAQCAtNTIwLDcgKzUyMCw3IEBACiAJY2hhciBzZXJ2ZXJuYW1lWzQ4XTsKIAogCWlmIChhcmdzLT5iY194cHJ0KSB7Ci0JCVdBUk5fT04oYXJncy0+cHJvdG9jb2wgIT0gWFBSVF9UUkFOU1BPUlRfQkNfVENQKTsKKwkJV0FSTl9PTl9PTkNFKCEoYXJncy0+cHJvdG9jb2wgJiBYUFJUX1RSQU5TUE9SVF9CQykpOwogCQl4cHJ0ID0gYXJncy0+YmNfeHBydC0+eHB0X2JjX3hwcnQ7CiAJCWlmICh4cHJ0KSB7CiAJCQl4cHJ0X2dldCh4cHJ0KTsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMveHBydHJkbWEvdmVyYnMuYyBiL25ldC9zdW5ycGMveHBydHJkbWEvdmVyYnMuYwppbmRleCA1MzZkMGJlLi43OTljY2U2IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3hwcnRyZG1hL3ZlcmJzLmMKKysrIGIvbmV0L3N1bnJwYy94cHJ0cmRtYS92ZXJicy5jCkBAIC01MSw2ICs1MSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL2FkZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjX3JkbWEuaD4KICNpbmNsdWRlIDxhc20vYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+IC8qIHRyeV9tb2R1bGVfZ2V0KCkvbW9kdWxlX3B1dCgpICovCiAKQEAgLTkyMyw3ICs5MjQsNyBAQAogCX0KIAogCUlOSVRfTElTVF9IRUFEKCZidWYtPnJiX3JlY3ZfYnVmcyk7Ci0JZm9yIChpID0gMDsgaSA8IGJ1Zi0+cmJfbWF4X3JlcXVlc3RzOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgYnVmLT5yYl9tYXhfcmVxdWVzdHMgKyBSUENSRE1BX01BWF9CQ19SRVFVRVNUUzsgaSsrKSB7CiAJCXN0cnVjdCBycGNyZG1hX3JlcCAqcmVwOwogCiAJCXJlcCA9IHJwY3JkbWFfY3JlYXRlX3JlcChyX3hwcnQpOwpAQCAtMTAxOCw2ICsxMDE5LDcgQEAKIAkJcmVwID0gcnBjcmRtYV9idWZmZXJfZ2V0X3JlcF9sb2NrZWQoYnVmKTsKIAkJcnBjcmRtYV9kZXN0cm95X3JlcChpYSwgcmVwKTsKIAl9CisJYnVmLT5yYl9zZW5kX2NvdW50ID0gMDsKIAogCXNwaW5fbG9jaygmYnVmLT5yYl9yZXFzbG9jayk7CiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZidWYtPnJiX2FsbHJlcXMpKSB7CkBAIC0xMDMyLDYgKzEwMzQsNyBAQAogCQlzcGluX2xvY2soJmJ1Zi0+cmJfcmVxc2xvY2spOwogCX0KIAlzcGluX3VubG9jaygmYnVmLT5yYl9yZXFzbG9jayk7CisJYnVmLT5yYl9yZWN2X2NvdW50ID0gMDsKIAogCXJwY3JkbWFfZGVzdHJveV9tcnMoYnVmKTsKIH0KQEAgLTEwNzQsOCArMTA3NywyNyBAQAogCXNwaW5fdW5sb2NrKCZidWYtPnJiX213bG9jayk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcnBjcmRtYV9yZXAgKgorcnBjcmRtYV9idWZmZXJfZ2V0X3JlcChzdHJ1Y3QgcnBjcmRtYV9idWZmZXIgKmJ1ZmZlcnMpCit7CisJLyogSWYgYW4gUlBDIHByZXZpb3VzbHkgY29tcGxldGVkIHdpdGhvdXQgYSByZXBseSAoc2F5LCBhCisJICogY3JlZGVudGlhbCBwcm9ibGVtIG9yIGEgc29mdCB0aW1lb3V0IG9jY3VycykgdGhlbiBob2xkIG9mZgorCSAqIG9uIHN1cHBseWluZyBtb3JlIFJlY2VpdmUgYnVmZmVycyB1bnRpbCB0aGUgbnVtYmVyIG9mIG5ldworCSAqIHBlbmRpbmcgUlBDcyBjYXRjaGVzIHVwIHRvIHRoZSBudW1iZXIgb2YgcG9zdGVkIFJlY2VpdmVzLgorCSAqLworCWlmICh1bmxpa2VseShidWZmZXJzLT5yYl9zZW5kX2NvdW50IDwgYnVmZmVycy0+cmJfcmVjdl9jb3VudCkpCisJCXJldHVybiBOVUxMOworCisJaWYgKHVubGlrZWx5KGxpc3RfZW1wdHkoJmJ1ZmZlcnMtPnJiX3JlY3ZfYnVmcykpKQorCQlyZXR1cm4gTlVMTDsKKwlidWZmZXJzLT5yYl9yZWN2X2NvdW50Kys7CisJcmV0dXJuIHJwY3JkbWFfYnVmZmVyX2dldF9yZXBfbG9ja2VkKGJ1ZmZlcnMpOworfQorCiAvKgogICogR2V0IGEgc2V0IG9mIHJlcXVlc3QvcmVwbHkgYnVmZmVycy4KKyAqCisgKiBSZXBseSBidWZmZXIgKGlmIGF2YWlsYWJsZSkgaXMgYXR0YWNoZWQgdG8gc2VuZCBidWZmZXIgdXBvbiByZXR1cm4uCiAgKi8KIHN0cnVjdCBycGNyZG1hX3JlcSAqCiBycGNyZG1hX2J1ZmZlcl9nZXQoc3RydWN0IHJwY3JkbWFfYnVmZmVyICpidWZmZXJzKQpAQCAtMTA4NSwyMSArMTEwNywxNSBAQAogCXNwaW5fbG9jaygmYnVmZmVycy0+cmJfbG9jayk7CiAJaWYgKGxpc3RfZW1wdHkoJmJ1ZmZlcnMtPnJiX3NlbmRfYnVmcykpCiAJCWdvdG8gb3V0X3JlcWJ1ZjsKKwlidWZmZXJzLT5yYl9zZW5kX2NvdW50Kys7CiAJcmVxID0gcnBjcmRtYV9idWZmZXJfZ2V0X3JlcV9sb2NrZWQoYnVmZmVycyk7Ci0JaWYgKGxpc3RfZW1wdHkoJmJ1ZmZlcnMtPnJiX3JlY3ZfYnVmcykpCi0JCWdvdG8gb3V0X3JlcGJ1ZjsKLQlyZXEtPnJsX3JlcGx5ID0gcnBjcmRtYV9idWZmZXJfZ2V0X3JlcF9sb2NrZWQoYnVmZmVycyk7CisJcmVxLT5ybF9yZXBseSA9IHJwY3JkbWFfYnVmZmVyX2dldF9yZXAoYnVmZmVycyk7CiAJc3Bpbl91bmxvY2soJmJ1ZmZlcnMtPnJiX2xvY2spOwogCXJldHVybiByZXE7CiAKIG91dF9yZXFidWY6CiAJc3Bpbl91bmxvY2soJmJ1ZmZlcnMtPnJiX2xvY2spOwotCXByX3dhcm4oInJwY3JkbWE6IG91dCBvZiByZXF1ZXN0IGJ1ZmZlcnMgKCVwKVxuIiwgYnVmZmVycyk7Ci0JcmV0dXJuIE5VTEw7Ci1vdXRfcmVwYnVmOgotCWxpc3RfYWRkKCZyZXEtPnJsX2ZyZWUsICZidWZmZXJzLT5yYl9zZW5kX2J1ZnMpOwotCXNwaW5fdW5sb2NrKCZidWZmZXJzLT5yYl9sb2NrKTsKLQlwcl93YXJuKCJycGNyZG1hOiBvdXQgb2YgcmVwbHkgYnVmZmVycyAoJXApXG4iLCBidWZmZXJzKTsKKwlwcl93YXJuKCJSUEM6ICAgICAgICVzOiBvdXQgb2YgcmVxdWVzdCBidWZmZXJzXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTExMTcsOSArMTEzMywxMiBAQAogCXJlcS0+cmxfcmVwbHkgPSBOVUxMOwogCiAJc3Bpbl9sb2NrKCZidWZmZXJzLT5yYl9sb2NrKTsKKwlidWZmZXJzLT5yYl9zZW5kX2NvdW50LS07CiAJbGlzdF9hZGRfdGFpbCgmcmVxLT5ybF9mcmVlLCAmYnVmZmVycy0+cmJfc2VuZF9idWZzKTsKLQlpZiAocmVwKQorCWlmIChyZXApIHsKKwkJYnVmZmVycy0+cmJfcmVjdl9jb3VudC0tOwogCQlsaXN0X2FkZF90YWlsKCZyZXAtPnJyX2xpc3QsICZidWZmZXJzLT5yYl9yZWN2X2J1ZnMpOworCX0KIAlzcGluX3VubG9jaygmYnVmZmVycy0+cmJfbG9jayk7CiB9CiAKQEAgLTExMzMsOCArMTE1Miw3IEBACiAJc3RydWN0IHJwY3JkbWFfYnVmZmVyICpidWZmZXJzID0gcmVxLT5ybF9idWZmZXI7CiAKIAlzcGluX2xvY2soJmJ1ZmZlcnMtPnJiX2xvY2spOwotCWlmICghbGlzdF9lbXB0eSgmYnVmZmVycy0+cmJfcmVjdl9idWZzKSkKLQkJcmVxLT5ybF9yZXBseSA9IHJwY3JkbWFfYnVmZmVyX2dldF9yZXBfbG9ja2VkKGJ1ZmZlcnMpOworCXJlcS0+cmxfcmVwbHkgPSBycGNyZG1hX2J1ZmZlcl9nZXRfcmVwKGJ1ZmZlcnMpOwogCXNwaW5fdW5sb2NrKCZidWZmZXJzLT5yYl9sb2NrKTsKIH0KIApAQCAtMTE0OCw2ICsxMTY2LDcgQEAKIAlzdHJ1Y3QgcnBjcmRtYV9idWZmZXIgKmJ1ZmZlcnMgPSAmcmVwLT5ycl9yeHBydC0+cnhfYnVmOwogCiAJc3Bpbl9sb2NrKCZidWZmZXJzLT5yYl9sb2NrKTsKKwlidWZmZXJzLT5yYl9yZWN2X2NvdW50LS07CiAJbGlzdF9hZGRfdGFpbCgmcmVwLT5ycl9saXN0LCAmYnVmZmVycy0+cmJfcmVjdl9idWZzKTsKIAlzcGluX3VubG9jaygmYnVmZmVycy0+cmJfbG9jayk7CiB9CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3hwcnRyZG1hL3hwcnRfcmRtYS5oIGIvbmV0L3N1bnJwYy94cHJ0cmRtYS94cHJ0X3JkbWEuaAppbmRleCA2NzBmYWQ1Li5hNzFiMGY1IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3hwcnRyZG1hL3hwcnRfcmRtYS5oCisrKyBiL25ldC9zdW5ycGMveHBydHJkbWEveHBydF9yZG1hLmgKQEAgLTMyMSw2ICszMjEsNyBAQAogCWNoYXIJCQkqcmJfcG9vbDsKIAogCXNwaW5sb2NrX3QJCXJiX2xvY2s7CS8qIHByb3RlY3QgYnVmIGxpc3RzICovCisJaW50CQkJcmJfc2VuZF9jb3VudCwgcmJfcmVjdl9jb3VudDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXJiX3NlbmRfYnVmczsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXJiX3JlY3ZfYnVmczsKIAl1MzIJCQlyYl9tYXhfcmVxdWVzdHM7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3hwcnRzb2NrLmMgYi9uZXQvc3VucnBjL3hwcnRzb2NrLmMKaW5kZXggOGVkZTNiYy4uYmYxNjg4MyAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy94cHJ0c29jay5jCisrKyBiL25ldC9zdW5ycGMveHBydHNvY2suYwpAQCAtMTA3NCw3ICsxMDc0LDcgQEAKIAkJc2tiID0gc2tiX3JlY3ZfZGF0YWdyYW0oc2ssIDAsIDEsICZlcnIpOwogCQlpZiAoc2tiICE9IE5VTEwpIHsKIAkJCXhzX3VkcF9kYXRhX3JlYWRfc2tiKCZ0cmFuc3BvcnQtPnhwcnQsIHNrLCBza2IpOwotCQkJc2tiX2ZyZWVfZGF0YWdyYW0oc2ssIHNrYik7CisJCQlza2JfZnJlZV9kYXRhZ3JhbV9sb2NrZWQoc2ssIHNrYik7CiAJCQljb250aW51ZTsKIAkJfQogCQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChYUFJUX1NPQ0tfREFUQV9SRUFEWSwgJnRyYW5zcG9ydC0+c29ja19zdGF0ZSkpCmRpZmYgLS1naXQgYS9uZXQvc3dpdGNoZGV2L3N3aXRjaGRldi5jIGIvbmV0L3N3aXRjaGRldi9zd2l0Y2hkZXYuYwppbmRleCBhNWZjOWRkLi4wMmJlYjM1IDEwMDY0NAotLS0gYS9uZXQvc3dpdGNoZGV2L3N3aXRjaGRldi5jCisrKyBiL25ldC9zd2l0Y2hkZXYvc3dpdGNoZGV2LmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+Ci0jaW5jbHVkZSA8bmV0L2lwX2ZpYi5oPgogI2luY2x1ZGUgPG5ldC9zd2l0Y2hkZXYuaD4KIAogLyoqCkBAIC0zNDQsOCArMzQzLDYgQEAKIAlzd2l0Y2ggKG9iai0+aWQpIHsKIAljYXNlIFNXSVRDSERFVl9PQkpfSURfUE9SVF9WTEFOOgogCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfdmxhbik7Ci0JY2FzZSBTV0lUQ0hERVZfT0JKX0lEX0lQVjRfRklCOgotCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBzd2l0Y2hkZXZfb2JqX2lwdjRfZmliKTsKIAljYXNlIFNXSVRDSERFVl9PQkpfSURfUE9SVF9GREI6CiAJCXJldHVybiBzaXplb2Yoc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9mZGIpOwogCWNhc2UgU1dJVENIREVWX09CSl9JRF9QT1JUX01EQjoKQEAgLTEwNDIsNyArMTAzOSw3IEBACiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJc3RydWN0IG5kbXNnICpuZG07CiAKLQlpZiAoZHVtcC0+aWR4IDwgZHVtcC0+Y2ItPmFyZ3NbMF0pCisJaWYgKGR1bXAtPmlkeCA8IGR1bXAtPmNiLT5hcmdzWzJdKQogCQlnb3RvIHNraXA7CiAKIAlubGggPSBubG1zZ19wdXQoZHVtcC0+c2tiLCBwb3J0aWQsIHNlcSwgUlRNX05FV05FSUdILApAQCAtMTA4OSw3ICsxMDg2LDcgQEAKICAqLwogaW50IHN3aXRjaGRldl9wb3J0X2ZkYl9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKIAkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpmaWx0ZXJfZGV2LCBpbnQgaWR4KQorCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpmaWx0ZXJfZGV2LCBpbnQgKmlkeCkKIHsKIAlzdHJ1Y3Qgc3dpdGNoZGV2X2ZkYl9kdW1wIGR1bXAgPSB7CiAJCS5mZGIub2JqLm9yaWdfZGV2ID0gZGV2LApAQCAtMTA5NywyMDcgKzEwOTQsMjcgQEAKIAkJLmRldiA9IGRldiwKIAkJLnNrYiA9IHNrYiwKIAkJLmNiID0gY2IsCi0JCS5pZHggPSBpZHgsCisJCS5pZHggPSAqaWR4LAogCX07CiAJaW50IGVycjsKIAogCWVyciA9IHN3aXRjaGRldl9wb3J0X29ial9kdW1wKGRldiwgJmR1bXAuZmRiLm9iaiwKIAkJCQkgICAgICBzd2l0Y2hkZXZfcG9ydF9mZGJfZHVtcF9jYik7Ci0JY2ItPmFyZ3NbMV0gPSBlcnI7Ci0JcmV0dXJuIGR1bXAuaWR4OworCSppZHggPSBkdW1wLmlkeDsKKwlyZXR1cm4gZXJyOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc3dpdGNoZGV2X3BvcnRfZmRiX2R1bXApOwogCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnN3aXRjaGRldl9nZXRfbG93ZXN0X2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCWNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb3BzICpvcHMgPSBkZXYtPnN3aXRjaGRldl9vcHM7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmxvd2VyX2RldjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcG9ydF9kZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKLQotCS8qIFJlY3VzaXZlbHkgc2VhcmNoIGRvd24gdW50aWwgd2UgZmluZCBhIHN3IHBvcnQgZGV2LgotCSAqIChBIHN3IHBvcnQgZGV2IHN1cHBvcnRzIHN3aXRjaGRldl9wb3J0X2F0dHJfZ2V0KS4KLQkgKi8KLQotCWlmIChvcHMgJiYgb3BzLT5zd2l0Y2hkZXZfcG9ydF9hdHRyX2dldCkKLQkJcmV0dXJuIGRldjsKLQotCW5ldGRldl9mb3JfZWFjaF9sb3dlcl9kZXYoZGV2LCBsb3dlcl9kZXYsIGl0ZXIpIHsKLQkJcG9ydF9kZXYgPSBzd2l0Y2hkZXZfZ2V0X2xvd2VzdF9kZXYobG93ZXJfZGV2KTsKLQkJaWYgKHBvcnRfZGV2KQotCQkJcmV0dXJuIHBvcnRfZGV2OwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnN3aXRjaGRldl9nZXRfZGV2X2J5X25ocyhzdHJ1Y3QgZmliX2luZm8gKmZpKQotewotCXN0cnVjdCBzd2l0Y2hkZXZfYXR0ciBhdHRyID0gewotCQkuaWQgPSBTV0lUQ0hERVZfQVRUUl9JRF9QT1JUX1BBUkVOVF9JRCwKLQl9OwotCXN0cnVjdCBzd2l0Y2hkZXZfYXR0ciBwcmV2X2F0dHI7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7Ci0JaW50IG5oc2VsOwotCi0JQVNTRVJUX1JUTkwoKTsKLQotCS8qIEZvciB0aGlzIHJvdXRlLCBhbGwgbmV4dGhvcCBkZXZzIG11c3QgYmUgb24gdGhlIHNhbWUgc3dpdGNoLiAqLwotCi0JZm9yIChuaHNlbCA9IDA7IG5oc2VsIDwgZmktPmZpYl9uaHM7IG5oc2VsKyspIHsKLQkJY29uc3Qgc3RydWN0IGZpYl9uaCAqbmggPSAmZmktPmZpYl9uaFtuaHNlbF07Ci0KLQkJaWYgKCFuaC0+bmhfZGV2KQotCQkJcmV0dXJuIE5VTEw7Ci0KLQkJZGV2ID0gc3dpdGNoZGV2X2dldF9sb3dlc3RfZGV2KG5oLT5uaF9kZXYpOwotCQlpZiAoIWRldikKLQkJCXJldHVybiBOVUxMOwotCi0JCWF0dHIub3JpZ19kZXYgPSBkZXY7Ci0JCWlmIChzd2l0Y2hkZXZfcG9ydF9hdHRyX2dldChkZXYsICZhdHRyKSkKLQkJCXJldHVybiBOVUxMOwotCi0JCWlmIChuaHNlbCA+IDAgJiYKLQkJICAgICFuZXRkZXZfcGh5c19pdGVtX2lkX3NhbWUoJnByZXZfYXR0ci51LnBwaWQsICZhdHRyLnUucHBpZCkpCi0JCQkJcmV0dXJuIE5VTEw7Ci0KLQkJcHJldl9hdHRyID0gYXR0cjsKLQl9Ci0KLQlyZXR1cm4gZGV2OwotfQotCi0vKioKLSAqCXN3aXRjaGRldl9maWJfaXB2NF9hZGQgLSBBZGQvbW9kaWZ5IHN3aXRjaCBJUHY0IHJvdXRlIGVudHJ5Ci0gKgotICoJQGRzdDogcm91dGUncyBJUHY0IGRlc3RpbmF0aW9uIGFkZHJlc3MKLSAqCUBkc3RfbGVuOiBkZXN0aW5hdGlvbiBhZGRyZXNzIGxlbmd0aCAocHJlZml4IGxlbmd0aCkKLSAqCUBmaTogcm91dGUgRklCIGluZm8gc3RydWN0dXJlCi0gKglAdG9zOiByb3V0ZSBUT1MKLSAqCUB0eXBlOiByb3V0ZSB0eXBlCi0gKglAbmxmbGFnczogbmV0bGluayBmbGFncyBwYXNzZWQgaW4gKE5MTV9GXyopCi0gKglAdGJfaWQ6IHJvdXRlIHRhYmxlIElECi0gKgotICoJQWRkL21vZGlmeSBzd2l0Y2ggSVB2NCByb3V0ZSBlbnRyeS4KLSAqLwotaW50IHN3aXRjaGRldl9maWJfaXB2NF9hZGQodTMyIGRzdCwgaW50IGRzdF9sZW4sIHN0cnVjdCBmaWJfaW5mbyAqZmksCi0JCQkgICB1OCB0b3MsIHU4IHR5cGUsIHUzMiBubGZsYWdzLCB1MzIgdGJfaWQpCi17Ci0Jc3RydWN0IHN3aXRjaGRldl9vYmpfaXB2NF9maWIgaXB2NF9maWIgPSB7Ci0JCS5vYmouaWQgPSBTV0lUQ0hERVZfT0JKX0lEX0lQVjRfRklCLAotCQkuZHN0ID0gZHN0LAotCQkuZHN0X2xlbiA9IGRzdF9sZW4sCi0JCS5maSA9IGZpLAotCQkudG9zID0gdG9zLAotCQkudHlwZSA9IHR5cGUsCi0JCS5ubGZsYWdzID0gbmxmbGFncywKLQkJLnRiX2lkID0gdGJfaWQsCi0JfTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotCWludCBlcnIgPSAwOwotCi0JLyogRG9uJ3Qgb2ZmbG9hZCByb3V0ZSBpZiB1c2luZyBjdXN0b20gaXAgcnVsZXMgb3IgaWYKLQkgKiBJUHY0IEZJQiBvZmZsb2FkaW5nIGhhcyBiZWVuIGRpc2FibGVkIGNvbXBsZXRlbHkuCi0JICovCi0KLSNpZmRlZiBDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTCi0JaWYgKGZpLT5maWJfbmV0LT5pcHY0LmZpYl9oYXNfY3VzdG9tX3J1bGVzKQotCQlyZXR1cm4gMDsKLSNlbmRpZgotCi0JaWYgKGZpLT5maWJfbmV0LT5pcHY0LmZpYl9vZmZsb2FkX2Rpc2FibGVkKQotCQlyZXR1cm4gMDsKLQotCWRldiA9IHN3aXRjaGRldl9nZXRfZGV2X2J5X25ocyhmaSk7Ci0JaWYgKCFkZXYpCi0JCXJldHVybiAwOwotCi0JaXB2NF9maWIub2JqLm9yaWdfZGV2ID0gZGV2OwotCWVyciA9IHN3aXRjaGRldl9wb3J0X29ial9hZGQoZGV2LCAmaXB2NF9maWIub2JqKTsKLQlpZiAoIWVycikKLQkJZmktPmZpYl9mbGFncyB8PSBSVE5IX0ZfT0ZGTE9BRDsKLQotCXJldHVybiBlcnIgPT0gLUVPUE5PVFNVUFAgPyAwIDogZXJyOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc3dpdGNoZGV2X2ZpYl9pcHY0X2FkZCk7Ci0KLS8qKgotICoJc3dpdGNoZGV2X2ZpYl9pcHY0X2RlbCAtIERlbGV0ZSBJUHY0IHJvdXRlIGVudHJ5IGZyb20gc3dpdGNoCi0gKgotICoJQGRzdDogcm91dGUncyBJUHY0IGRlc3RpbmF0aW9uIGFkZHJlc3MKLSAqCUBkc3RfbGVuOiBkZXN0aW5hdGlvbiBhZGRyZXNzIGxlbmd0aCAocHJlZml4IGxlbmd0aCkKLSAqCUBmaTogcm91dGUgRklCIGluZm8gc3RydWN0dXJlCi0gKglAdG9zOiByb3V0ZSBUT1MKLSAqCUB0eXBlOiByb3V0ZSB0eXBlCi0gKglAdGJfaWQ6IHJvdXRlIHRhYmxlIElECi0gKgotICoJRGVsZXRlIElQdjQgcm91dGUgZW50cnkgZnJvbSBzd2l0Y2ggZGV2aWNlLgotICovCi1pbnQgc3dpdGNoZGV2X2ZpYl9pcHY0X2RlbCh1MzIgZHN0LCBpbnQgZHN0X2xlbiwgc3RydWN0IGZpYl9pbmZvICpmaSwKLQkJCSAgIHU4IHRvcywgdTggdHlwZSwgdTMyIHRiX2lkKQotewotCXN0cnVjdCBzd2l0Y2hkZXZfb2JqX2lwdjRfZmliIGlwdjRfZmliID0gewotCQkub2JqLmlkID0gU1dJVENIREVWX09CSl9JRF9JUFY0X0ZJQiwKLQkJLmRzdCA9IGRzdCwKLQkJLmRzdF9sZW4gPSBkc3RfbGVuLAotCQkuZmkgPSBmaSwKLQkJLnRvcyA9IHRvcywKLQkJLnR5cGUgPSB0eXBlLAotCQkubmxmbGFncyA9IDAsCi0JCS50Yl9pZCA9IHRiX2lkLAotCX07Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQlpbnQgZXJyID0gMDsKLQotCWlmICghKGZpLT5maWJfZmxhZ3MgJiBSVE5IX0ZfT0ZGTE9BRCkpCi0JCXJldHVybiAwOwotCi0JZGV2ID0gc3dpdGNoZGV2X2dldF9kZXZfYnlfbmhzKGZpKTsKLQlpZiAoIWRldikKLQkJcmV0dXJuIDA7Ci0KLQlpcHY0X2ZpYi5vYmoub3JpZ19kZXYgPSBkZXY7Ci0JZXJyID0gc3dpdGNoZGV2X3BvcnRfb2JqX2RlbChkZXYsICZpcHY0X2ZpYi5vYmopOwotCWlmICghZXJyKQotCQlmaS0+ZmliX2ZsYWdzICY9IH5SVE5IX0ZfT0ZGTE9BRDsKLQotCXJldHVybiBlcnIgPT0gLUVPUE5PVFNVUFAgPyAwIDogZXJyOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc3dpdGNoZGV2X2ZpYl9pcHY0X2RlbCk7Ci0KLS8qKgotICoJc3dpdGNoZGV2X2ZpYl9pcHY0X2Fib3J0IC0gQWJvcnQgYW4gSVB2NCBGSUIgb3BlcmF0aW9uCi0gKgotICoJQGZpOiByb3V0ZSBGSUIgaW5mbyBzdHJ1Y3R1cmUKLSAqLwotdm9pZCBzd2l0Y2hkZXZfZmliX2lwdjRfYWJvcnQoc3RydWN0IGZpYl9pbmZvICpmaSkKLXsKLQkvKiBUaGVyZSB3YXMgYSBwcm9ibGVtIGluc3RhbGxpbmcgdGhpcyByb3V0ZSB0byB0aGUgb2ZmbG9hZAotCSAqIGRldmljZS4gIEZvciBub3csIHVudGlsIHdlIGNvbWUgdXAgd2l0aCBtb3JlIHJlZmluZWQKLQkgKiBwb2xpY3kgaGFuZGxpbmcsIGFicnVwdGx5IGVuZCBJUHY0IGZpYiBvZmZsb2FkaW5nIGZvcgotCSAqIGZvciBlbnRpcmUgbmV0IGJ5IGZsdXNoaW5nIG9mZmxvYWQgZGV2aWNlKHMpIG9mIGFsbAotCSAqIElQdjQgcm91dGVzLCBhbmQgbWFyayBJUHY0IGZpYiBvZmZsb2FkaW5nIGJyb2tlbiBmcm9tCi0JICogdGhpcyBwb2ludCBmb3J3YXJkLgotCSAqLwotCi0JZmliX2ZsdXNoX2V4dGVybmFsKGZpLT5maWJfbmV0KTsKLQlmaS0+ZmliX25ldC0+aXB2NC5maWJfb2ZmbG9hZF9kaXNhYmxlZCA9IHRydWU7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzd2l0Y2hkZXZfZmliX2lwdjRfYWJvcnQpOwotCiBib29sIHN3aXRjaGRldl9wb3J0X3NhbWVfcGFyZW50X2lkKHN0cnVjdCBuZXRfZGV2aWNlICphLAogCQkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICpiKQogewogCXN0cnVjdCBzd2l0Y2hkZXZfYXR0ciBhX2F0dHIgPSB7CiAJCS5vcmlnX2RldiA9IGEsCiAJCS5pZCA9IFNXSVRDSERFVl9BVFRSX0lEX1BPUlRfUEFSRU5UX0lELAotCQkuZmxhZ3MgPSBTV0lUQ0hERVZfRl9OT19SRUNVUlNFLAogCX07CiAJc3RydWN0IHN3aXRjaGRldl9hdHRyIGJfYXR0ciA9IHsKIAkJLm9yaWdfZGV2ID0gYiwKIAkJLmlkID0gU1dJVENIREVWX0FUVFJfSURfUE9SVF9QQVJFTlRfSUQsCi0JCS5mbGFncyA9IFNXSVRDSERFVl9GX05PX1JFQ1VSU0UsCiAJfTsKIAogCWlmIChzd2l0Y2hkZXZfcG9ydF9hdHRyX2dldChhLCAmYV9hdHRyKSB8fApAQCAtMTMwNiw4OSArMTEyMyw0IEBACiAKIAlyZXR1cm4gbmV0ZGV2X3BoeXNfaXRlbV9pZF9zYW1lKCZhX2F0dHIudS5wcGlkLCAmYl9hdHRyLnUucHBpZCk7CiB9Ci0KLXN0YXRpYyB1MzIgc3dpdGNoZGV2X3BvcnRfZndkX21hcmtfZ2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpncm91cF9kZXYpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmxvd2VyX2RldjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOwotCi0JbmV0ZGV2X2Zvcl9lYWNoX2xvd2VyX2Rldihncm91cF9kZXYsIGxvd2VyX2RldiwgaXRlcikgewotCQlpZiAobG93ZXJfZGV2ID09IGRldikKLQkJCWNvbnRpbnVlOwotCQlpZiAoc3dpdGNoZGV2X3BvcnRfc2FtZV9wYXJlbnRfaWQoZGV2LCBsb3dlcl9kZXYpKQotCQkJcmV0dXJuIGxvd2VyX2Rldi0+b2ZmbG9hZF9md2RfbWFyazsKLQkJcmV0dXJuIHN3aXRjaGRldl9wb3J0X2Z3ZF9tYXJrX2dldChkZXYsIGxvd2VyX2Rldik7Ci0JfQotCi0JcmV0dXJuIGRldi0+aWZpbmRleDsKLX0KIEVYUE9SVF9TWU1CT0xfR1BMKHN3aXRjaGRldl9wb3J0X3NhbWVfcGFyZW50X2lkKTsKLQotc3RhdGljIHZvaWQgc3dpdGNoZGV2X3BvcnRfZndkX21hcmtfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmdyb3VwX2RldiwKLQkJCQkJICB1MzIgb2xkX21hcmssIHUzMiAqcmVzZXRfbWFyaykKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbG93ZXJfZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXI7Ci0KLQluZXRkZXZfZm9yX2VhY2hfbG93ZXJfZGV2KGdyb3VwX2RldiwgbG93ZXJfZGV2LCBpdGVyKSB7Ci0JCWlmIChsb3dlcl9kZXYtPm9mZmxvYWRfZndkX21hcmsgPT0gb2xkX21hcmspIHsKLQkJCWlmICghKnJlc2V0X21hcmspCi0JCQkJKnJlc2V0X21hcmsgPSBsb3dlcl9kZXYtPmlmaW5kZXg7Ci0JCQlsb3dlcl9kZXYtPm9mZmxvYWRfZndkX21hcmsgPSAqcmVzZXRfbWFyazsKLQkJfQotCQlzd2l0Y2hkZXZfcG9ydF9md2RfbWFya19yZXNldChsb3dlcl9kZXYsIG9sZF9tYXJrLCByZXNldF9tYXJrKTsKLQl9Ci19Ci0KLS8qKgotICoJc3dpdGNoZGV2X3BvcnRfZndkX21hcmtfc2V0IC0gU2V0IHBvcnQgb2ZmbG9hZCBmb3J3YXJkaW5nIG1hcmsKLSAqCi0gKglAZGV2OiBwb3J0IGRldmljZQotICoJQGdyb3VwX2RldjogY29udGFpbmluZyBkZXZpY2UKLSAqCUBqb2luaW5nOiB0cnVlIGlmIGRldiBpcyBqb2luaW5nIGdyb3VwOyBmYWxzZSBpZiBsZWF2aW5nIGdyb3VwCi0gKgotICoJQW4gdW5ncm91cGVkIHBvcnQncyBvZmZsb2FkIG1hcmsgaXMganVzdCBpdHMgaWZpbmRleC4gIEEgZ3JvdXBlZAotICoJcG9ydCdzIChtZW1iZXIgb2YgYSBicmlkZ2UsIGZvciBleGFtcGxlKSBvZmZsb2FkIG1hcmsgaXMgdGhlIGlmaW5kZXgKLSAqCW9mIG9uZSBvZiB0aGUgcG9ydHMgaW4gdGhlIGdyb3VwIHdpdGggdGhlIHNhbWUgcGFyZW50IChzd2l0Y2gpIElELgotICoJUG9ydHMgb24gdGhlIHNhbWUgZGV2aWNlIGluIHRoZSBzYW1lIGdyb3VwIHdpbGwgaGF2ZSB0aGUgc2FtZSBtYXJrLgotICoKLSAqCUV4YW1wbGU6Ci0gKgotICoJCWJyMAkJaWZpbmRleD05Ci0gKgkJICBzdzFwMQkJaWZpbmRleD0yCW1hcms9MgotICoJCSAgc3cxcDIJCWlmaW5kZXg9MwltYXJrPTIKLSAqCQkgIHN3MnAxCQlpZmluZGV4PTQJbWFyaz01Ci0gKgkJICBzdzJwMgkJaWZpbmRleD01CW1hcms9NQotICoKLSAqCUlmIHN3MnAyIGxlYXZlcyB0aGUgYnJpZGdlLCB3ZSdsbCBoYXZlOgotICoKLSAqCQlicjAJCWlmaW5kZXg9OQotICoJCSAgc3cxcDEJCWlmaW5kZXg9MgltYXJrPTIKLSAqCQkgIHN3MXAyCQlpZmluZGV4PTMJbWFyaz0yCi0gKgkJICBzdzJwMQkJaWZpbmRleD00CW1hcms9NAotICoJCXN3MnAyCQlpZmluZGV4PTUJbWFyaz01Ci0gKi8KLXZvaWQgc3dpdGNoZGV2X3BvcnRfZndkX21hcmtfc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpncm91cF9kZXYsCi0JCQkJIGJvb2wgam9pbmluZykKLXsKLQl1MzIgbWFyayA9IGRldi0+aWZpbmRleDsKLQl1MzIgcmVzZXRfbWFyayA9IDA7Ci0KLQlpZiAoZ3JvdXBfZGV2KSB7Ci0JCUFTU0VSVF9SVE5MKCk7Ci0JCWlmIChqb2luaW5nKQotCQkJbWFyayA9IHN3aXRjaGRldl9wb3J0X2Z3ZF9tYXJrX2dldChkZXYsIGdyb3VwX2Rldik7Ci0JCWVsc2UgaWYgKGRldi0+b2ZmbG9hZF9md2RfbWFyayA9PSBtYXJrKQotCQkJLyogT2hvaCwgdGhpcyBwb3J0IHdhcyB0aGUgbWFyayByZWZlcmVuY2UgcG9ydCwKLQkJCSAqIGJ1dCBpdCdzIGxlYXZpbmcgdGhlIGdyb3VwLCBzbyByZXNldCB0aGUKLQkJCSAqIG1hcmsgZm9yIHRoZSByZW1haW5pbmcgcG9ydHMgaW4gdGhlIGdyb3VwLgotCQkJICovCi0JCQlzd2l0Y2hkZXZfcG9ydF9md2RfbWFya19yZXNldChncm91cF9kZXYsIG1hcmssCi0JCQkJCQkgICAgICAmcmVzZXRfbWFyayk7Ci0JfQotCi0JZGV2LT5vZmZsb2FkX2Z3ZF9tYXJrID0gbWFyazsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHN3aXRjaGRldl9wb3J0X2Z3ZF9tYXJrX3NldCk7CmRpZmYgLS1naXQgYS9uZXQvc3lzY3RsX25ldC5jIGIvbmV0L3N5c2N0bF9uZXQuYwppbmRleCA0NmE3MWM3Li45MTk5ODEzIDEwMDY0NAotLS0gYS9uZXQvc3lzY3RsX25ldC5jCisrKyBiL25ldC9zeXNjdGxfbmV0LmMKQEAgLTI3LDkgKzI3LDkgQEAKICNlbmRpZgogCiBzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9zZXQgKgotbmV0X2N0bF9oZWFkZXJfbG9va3VwKHN0cnVjdCBjdGxfdGFibGVfcm9vdCAqcm9vdCwgc3RydWN0IG5zcHJveHkgKm5hbWVzcGFjZXMpCituZXRfY3RsX2hlYWRlcl9sb29rdXAoc3RydWN0IGN0bF90YWJsZV9yb290ICpyb290KQogewotCXJldHVybiAmbmFtZXNwYWNlcy0+bmV0X25zLT5zeXNjdGxzOworCXJldHVybiAmY3VycmVudC0+bnNwcm94eS0+bmV0X25zLT5zeXNjdGxzOwogfQogCiBzdGF0aWMgaW50IGlzX3NlZW4oc3RydWN0IGN0bF90YWJsZV9zZXQgKnNldCkKQEAgLTQyLDI2ICs0MiwzNyBAQAogCQkJICAgICAgIHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKQogewogCXN0cnVjdCBuZXQgKm5ldCA9IGNvbnRhaW5lcl9vZihoZWFkLT5zZXQsIHN0cnVjdCBuZXQsIHN5c2N0bHMpOwotCWt1aWRfdCByb290X3VpZCA9IG1ha2Vfa3VpZChuZXQtPnVzZXJfbnMsIDApOwotCWtnaWRfdCByb290X2dpZCA9IG1ha2Vfa2dpZChuZXQtPnVzZXJfbnMsIDApOwogCiAJLyogQWxsb3cgbmV0d29yayBhZG1pbmlzdHJhdG9yIHRvIGhhdmUgc2FtZSBhY2Nlc3MgYXMgcm9vdC4gKi8KLQlpZiAobnNfY2FwYWJsZV9ub2F1ZGl0KG5ldC0+dXNlcl9ucywgQ0FQX05FVF9BRE1JTikgfHwKLQkgICAgdWlkX2VxKHJvb3RfdWlkLCBjdXJyZW50X2V1aWQoKSkpIHsKKwlpZiAobnNfY2FwYWJsZV9ub2F1ZGl0KG5ldC0+dXNlcl9ucywgQ0FQX05FVF9BRE1JTikpIHsKIAkJaW50IG1vZGUgPSAodGFibGUtPm1vZGUgPj4gNikgJiA3OwogCQlyZXR1cm4gKG1vZGUgPDwgNikgfCAobW9kZSA8PCAzKSB8IG1vZGU7CiAJfQotCS8qIEFsbG93IG5ldG5zIHJvb3QgZ3JvdXAgdG8gaGF2ZSB0aGUgc2FtZSBhY2Nlc3MgYXMgdGhlIHJvb3QgZ3JvdXAgKi8KLQlpZiAoaW5fZWdyb3VwX3Aocm9vdF9naWQpKSB7Ci0JCWludCBtb2RlID0gKHRhYmxlLT5tb2RlID4+IDMpICYgNzsKLQkJcmV0dXJuIChtb2RlIDw8IDMpIHwgbW9kZTsKLQl9CisKIAlyZXR1cm4gdGFibGUtPm1vZGU7CiB9CiAKK3N0YXRpYyB2b2lkIG5ldF9jdGxfc2V0X293bmVyc2hpcChzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqaGVhZCwKKwkJCQkgIHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLAorCQkJCSAga3VpZF90ICp1aWQsIGtnaWRfdCAqZ2lkKQoreworCXN0cnVjdCBuZXQgKm5ldCA9IGNvbnRhaW5lcl9vZihoZWFkLT5zZXQsIHN0cnVjdCBuZXQsIHN5c2N0bHMpOworCWt1aWRfdCBuc19yb290X3VpZDsKKwlrZ2lkX3QgbnNfcm9vdF9naWQ7CisKKwluc19yb290X3VpZCA9IG1ha2Vfa3VpZChuZXQtPnVzZXJfbnMsIDApOworCWlmICh1aWRfdmFsaWQobnNfcm9vdF91aWQpKQorCQkqdWlkID0gbnNfcm9vdF91aWQ7CisKKwluc19yb290X2dpZCA9IG1ha2Vfa2dpZChuZXQtPnVzZXJfbnMsIDApOworCWlmIChnaWRfdmFsaWQobnNfcm9vdF9naWQpKQorCQkqZ2lkID0gbnNfcm9vdF9naWQ7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX3Jvb3QgbmV0X3N5c2N0bF9yb290ID0gewogCS5sb29rdXAgPSBuZXRfY3RsX2hlYWRlcl9sb29rdXAsCiAJLnBlcm1pc3Npb25zID0gbmV0X2N0bF9wZXJtaXNzaW9ucywKKwkuc2V0X293bmVyc2hpcCA9IG5ldF9jdGxfc2V0X293bmVyc2hpcCwKIH07CiAKIHN0YXRpYyBpbnQgX19uZXRfaW5pdCBzeXNjdGxfbmV0X2luaXQoc3RydWN0IG5ldCAqbmV0KQpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvYmNhc3QuYyBiL25ldC90aXBjL2JjYXN0LmMKaW5kZXggYWU0NjliMy4uNzUzZjc3NCAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvYmNhc3QuYworKysgYi9uZXQvdGlwYy9iY2FzdC5jCkBAIC0yNjksMTggKzI2OSwxOSBAQAogICoKICAqIFJDVSBpcyBsb2NrZWQsIG5vIG90aGVyIGxvY2tzIHNldAogICovCi12b2lkIHRpcGNfYmNhc3Rfc3luY19yY3Yoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGlwY19saW5rICpsLAotCQkJIHN0cnVjdCB0aXBjX21zZyAqaGRyKQoraW50IHRpcGNfYmNhc3Rfc3luY19yY3Yoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGlwY19saW5rICpsLAorCQkJc3RydWN0IHRpcGNfbXNnICpoZHIpCiB7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCAqaW5wdXRxID0gJnRpcGNfYmNfYmFzZShuZXQpLT5pbnB1dHE7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCB4bWl0cTsKKwlpbnQgcmMgPSAwOwogCiAJX19za2JfcXVldWVfaGVhZF9pbml0KCZ4bWl0cSk7CiAKIAl0aXBjX2JjYXN0X2xvY2sobmV0KTsKIAlpZiAobXNnX3R5cGUoaGRyKSA9PSBTVEFURV9NU0cpIHsKIAkJdGlwY19saW5rX2JjX2Fja19yY3YobCwgbXNnX2JjYXN0X2FjayhoZHIpLCAmeG1pdHEpOwotCQl0aXBjX2xpbmtfYmNfc3luY19yY3YobCwgaGRyLCAmeG1pdHEpOworCQlyYyA9IHRpcGNfbGlua19iY19zeW5jX3JjdihsLCBoZHIsICZ4bWl0cSk7CiAJfSBlbHNlIHsKIAkJdGlwY19saW5rX2JjX2luaXRfcmN2KGwsIGhkcik7CiAJfQpAQCAtMjkxLDYgKzI5Miw3IEBACiAJLyogQW55IHNvY2tldCB3YWtldXAgbWVzc2FnZXMgPyAqLwogCWlmICghc2tiX3F1ZXVlX2VtcHR5KGlucHV0cSkpCiAJCXRpcGNfc2tfcmN2KG5ldCwgaW5wdXRxKTsKKwlyZXR1cm4gcmM7CiB9CiAKIC8qIHRpcGNfYmNhc3RfYWRkX3BlZXIgLSBhZGQgYSBwZWVyIG5vZGUgdG8gYnJvYWRjYXN0IGxpbmsgYW5kIGJlYXJlcgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvYmNhc3QuaCBiL25ldC90aXBjL2JjYXN0LmgKaW5kZXggZDVlNzliMy4uNWZmZTM0NCAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvYmNhc3QuaAorKysgYi9uZXQvdGlwYy9iY2FzdC5oCkBAIC01Niw4ICs1Niw4IEBACiBpbnQgdGlwY19iY2FzdF94bWl0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCk7CiBpbnQgdGlwY19iY2FzdF9yY3Yoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGlwY19saW5rICpsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHZvaWQgdGlwY19iY2FzdF9hY2tfcmN2KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHRpcGNfbGluayAqbCwgdTMyIGFja2VkKTsKLXZvaWQgdGlwY19iY2FzdF9zeW5jX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB0aXBjX2xpbmsgKmwsCi0JCQkgc3RydWN0IHRpcGNfbXNnICpoZHIpOworaW50IHRpcGNfYmNhc3Rfc3luY19yY3Yoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGlwY19saW5rICpsLAorCQkJc3RydWN0IHRpcGNfbXNnICpoZHIpOwogaW50IHRpcGNfbmxfYWRkX2JjX2xpbmsoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGlwY19ubF9tc2cgKm1zZyk7CiBpbnQgdGlwY19ubF9iY19saW5rX3NldChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBubGF0dHIgKmF0dHJzW10pOwogaW50IHRpcGNfYmNsaW5rX3Jlc2V0X3N0YXRzKHN0cnVjdCBuZXQgKm5ldCk7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9iZWFyZXIuYyBiL25ldC90aXBjL2JlYXJlci5jCmluZGV4IDY1YjFiYmYuLjk3NWRiZWIgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2JlYXJlci5jCisrKyBiL25ldC90aXBjL2JlYXJlci5jCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSAibW9uaXRvci5oIgogI2luY2x1ZGUgImJjYXN0LmgiCiAjaW5jbHVkZSAibmV0bGluay5oIgorI2luY2x1ZGUgInVkcF9tZWRpYS5oIgogCiAjZGVmaW5lIE1BWF9BRERSX1NUUiA2MAogCkBAIC01Niw2ICs1NywxMyBAQAogCU5VTEwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgdGlwY19iZWFyZXIgKmJlYXJlcl9nZXQoc3RydWN0IG5ldCAqbmV0LCBpbnQgYmVhcmVyX2lkKQoreworCXN0cnVjdCB0aXBjX25ldCAqdG4gPSB0aXBjX25ldChuZXQpOworCisJcmV0dXJuIHJjdV9kZXJlZmVyZW5jZV9ydG5sKHRuLT5iZWFyZXJfbGlzdFtiZWFyZXJfaWRdKTsKK30KKwogc3RhdGljIHZvaWQgYmVhcmVyX2Rpc2FibGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGlwY19iZWFyZXIgKmIpOwogCiAvKioKQEAgLTMyMyw2ICszMzEsNyBAQAogCWItPmRvbWFpbiA9IGRpc2NfZG9tYWluOwogCWItPm5ldF9wbGFuZSA9IGJlYXJlcl9pZCArICdBJzsKIAliLT5wcmlvcml0eSA9IHByaW9yaXR5OworCXRlc3RfYW5kX3NldF9iaXRfbG9jaygwLCAmYi0+dXApOwogCiAJcmVzID0gdGlwY19kaXNjX2NyZWF0ZShuZXQsIGIsICZiLT5iY2FzdF9hZGRyLCAmc2tiKTsKIAlpZiAocmVzKSB7CkBAIC0zNjAsMTUgKzM2OSwyNCBAQAogICovCiB2b2lkIHRpcGNfYmVhcmVyX3Jlc2V0X2FsbChzdHJ1Y3QgbmV0ICpuZXQpCiB7Ci0Jc3RydWN0IHRpcGNfbmV0ICp0biA9IHRpcGNfbmV0KG5ldCk7CiAJc3RydWN0IHRpcGNfYmVhcmVyICpiOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9CRUFSRVJTOyBpKyspIHsKLQkJYiA9IHJjdV9kZXJlZmVyZW5jZV9ydG5sKHRuLT5iZWFyZXJfbGlzdFtpXSk7CisJCWIgPSBiZWFyZXJfZ2V0KG5ldCwgaSk7CisJCWlmIChiKQorCQkJY2xlYXJfYml0X3VubG9jaygwLCAmYi0+dXApOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0JFQVJFUlM7IGkrKykgeworCQliID0gYmVhcmVyX2dldChuZXQsIGkpOwogCQlpZiAoYikKIAkJCXRpcGNfcmVzZXRfYmVhcmVyKG5ldCwgYik7CiAJfQorCWZvciAoaSA9IDA7IGkgPCBNQVhfQkVBUkVSUzsgaSsrKSB7CisJCWIgPSBiZWFyZXJfZ2V0KG5ldCwgaSk7CisJCWlmIChiKQorCQkJdGVzdF9hbmRfc2V0X2JpdF9sb2NrKDAsICZiLT51cCk7CisJfQogfQogCiAvKioKQEAgLTM4Miw4ICs0MDAsOSBAQAogCWludCBiZWFyZXJfaWQgPSBiLT5pZGVudGl0eTsKIAogCXByX2luZm8oIkRpc2FibGluZyBiZWFyZXIgPCVzPlxuIiwgYi0+bmFtZSk7Ci0JYi0+bWVkaWEtPmRpc2FibGVfbWVkaWEoYik7CisJY2xlYXJfYml0X3VubG9jaygwLCAmYi0+dXApOwogCXRpcGNfbm9kZV9kZWxldGVfbGlua3MobmV0LCBiZWFyZXJfaWQpOworCWItPm1lZGlhLT5kaXNhYmxlX21lZGlhKGIpOwogCVJDVV9JTklUX1BPSU5URVIoYi0+bWVkaWFfcHRyLCBOVUxMKTsKIAlpZiAoYi0+bGlua19yZXEpCiAJCXRpcGNfZGlzY19kZWxldGUoYi0+bGlua19yZXEpOwpAQCAtNDQwLDIyICs0NTksMTYgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCWludCBkZWx0YTsKLQl2b2lkICp0aXBjX3B0cjsKIAogCWRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKXJjdV9kZXJlZmVyZW5jZV9ydG5sKGItPm1lZGlhX3B0cik7CiAJaWYgKCFkZXYpCiAJCXJldHVybiAwOwogCi0JLyogU2VuZCBSRVNFVCBtZXNzYWdlIGV2ZW4gaWYgYmVhcmVyIGlzIGRldGFjaGVkIGZyb20gZGV2aWNlICovCi0JdGlwY19wdHIgPSByY3VfZGVyZWZlcmVuY2VfcnRubChkZXYtPnRpcGNfcHRyKTsKLQlpZiAodW5saWtlbHkoIXRpcGNfcHRyICYmICFtc2dfaXNfcmVzZXQoYnVmX21zZyhza2IpKSkpCi0JCWdvdG8gZHJvcDsKLQotCWRlbHRhID0gZGV2LT5oYXJkX2hlYWRlcl9sZW4gLSBza2JfaGVhZHJvb20oc2tiKTsKLQlpZiAoKGRlbHRhID4gMCkgJiYKLQkgICAgcHNrYl9leHBhbmRfaGVhZChza2IsIFNLQl9EQVRBX0FMSUdOKGRlbHRhKSwgMCwgR0ZQX0FUT01JQykpCi0JCWdvdG8gZHJvcDsKLQorCWRlbHRhID0gU0tCX0RBVEFfQUxJR04oZGV2LT5oYXJkX2hlYWRlcl9sZW4gLSBza2JfaGVhZHJvb20oc2tiKSk7CisJaWYgKChkZWx0YSA+IDApICYmIHBza2JfZXhwYW5kX2hlYWQoc2tiLCBkZWx0YSwgMCwgR0ZQX0FUT01JQykpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAwOworCX0KIAlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAlza2ItPmRldiA9IGRldjsKIAlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfVElQQyk7CkBAIC00NjMsOSArNDc2LDYgQEAKIAkJCWRldi0+ZGV2X2FkZHIsIHNrYi0+bGVuKTsKIAlkZXZfcXVldWVfeG1pdChza2IpOwogCXJldHVybiAwOwotZHJvcDoKLQlrZnJlZV9za2Ioc2tiKTsKLQlyZXR1cm4gMDsKIH0KIAogaW50IHRpcGNfYmVhcmVyX210dShzdHJ1Y3QgbmV0ICpuZXQsIHUzMiBiZWFyZXJfaWQpCkBAIC00ODcsMTIgKzQ5NywxMiBAQAogCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICpkZXN0KQogewotCXN0cnVjdCB0aXBjX25ldCAqdG4gPSB0aXBjX25ldChuZXQpOworCXN0cnVjdCB0aXBjX21zZyAqaGRyID0gYnVmX21zZyhza2IpOwogCXN0cnVjdCB0aXBjX2JlYXJlciAqYjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQliID0gcmN1X2RlcmVmZXJlbmNlX3J0bmwodG4tPmJlYXJlcl9saXN0W2JlYXJlcl9pZF0pOwotCWlmIChsaWtlbHkoYikpCisJYiA9IGJlYXJlcl9nZXQobmV0LCBiZWFyZXJfaWQpOworCWlmIChsaWtlbHkoYiAmJiAodGVzdF9iaXQoMCwgJmItPnVwKSB8fCBtc2dfaXNfcmVzZXQoaGRyKSkpKQogCQliLT5tZWRpYS0+c2VuZF9tc2cobmV0LCBza2IsIGIsIGRlc3QpOwogCWVsc2UKIAkJa2ZyZWVfc2tiKHNrYik7CkBAIC01MDUsNyArNTE1LDYgQEAKIAkJICAgICAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqeG1pdHEsCiAJCSAgICAgIHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmRzdCkKIHsKLQlzdHJ1Y3QgdGlwY19uZXQgKnRuID0gbmV0X2dlbmVyaWMobmV0LCB0aXBjX25ldF9pZCk7CiAJc3RydWN0IHRpcGNfYmVhcmVyICpiOwogCXN0cnVjdCBza19idWZmICpza2IsICp0bXA7CiAKQEAgLTUxMywxMiArNTIyLDE1IEBACiAJCXJldHVybjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQliID0gcmN1X2RlcmVmZXJlbmNlX3J0bmwodG4tPmJlYXJlcl9saXN0W2JlYXJlcl9pZF0pOworCWIgPSBiZWFyZXJfZ2V0KG5ldCwgYmVhcmVyX2lkKTsKIAlpZiAodW5saWtlbHkoIWIpKQogCQlfX3NrYl9xdWV1ZV9wdXJnZSh4bWl0cSk7CiAJc2tiX3F1ZXVlX3dhbGtfc2FmZSh4bWl0cSwgc2tiLCB0bXApIHsKIAkJX19za2JfZGVxdWV1ZSh4bWl0cSk7Ci0JCWItPm1lZGlhLT5zZW5kX21zZyhuZXQsIHNrYiwgYiwgZHN0KTsKKwkJaWYgKGxpa2VseSh0ZXN0X2JpdCgwLCAmYi0+dXApIHx8IG1zZ19pc19yZXNldChidWZfbXNnKHNrYikpKSkKKwkJCWItPm1lZGlhLT5zZW5kX21zZyhuZXQsIHNrYiwgYiwgZHN0KTsKKwkJZWxzZQorCQkJa2ZyZWVfc2tiKHNrYik7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwogfQpAQCAtNTM1LDggKzU0Nyw4IEBACiAJc3RydWN0IHRpcGNfbXNnICpoZHI7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JYiA9IHJjdV9kZXJlZmVyZW5jZV9ydG5sKHRuLT5iZWFyZXJfbGlzdFtiZWFyZXJfaWRdKTsKLQlpZiAodW5saWtlbHkoIWIpKQorCWIgPSBiZWFyZXJfZ2V0KG5ldCwgYmVhcmVyX2lkKTsKKwlpZiAodW5saWtlbHkoIWIgfHwgIXRlc3RfYml0KDAsICZiLT51cCkpKQogCQlfX3NrYl9xdWV1ZV9wdXJnZSh4bWl0cSk7CiAJc2tiX3F1ZXVlX3dhbGtfc2FmZSh4bWl0cSwgc2tiLCB0bXApIHsKIAkJaGRyID0gYnVmX21zZyhza2IpOwpAQCAtNTY2LDcgKzU3OCw4IEBACiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJYiA9IHJjdV9kZXJlZmVyZW5jZV9ydG5sKGRldi0+dGlwY19wdHIpOwotCWlmIChsaWtlbHkoYiAmJiAoc2tiLT5wa3RfdHlwZSA8PSBQQUNLRVRfQlJPQURDQVNUKSkpIHsKKwlpZiAobGlrZWx5KGIgJiYgdGVzdF9iaXQoMCwgJmItPnVwKSAmJgorCQkgICAoc2tiLT5wa3RfdHlwZSA8PSBQQUNLRVRfQlJPQURDQVNUKSkpIHsKIAkJc2tiLT5uZXh0ID0gTlVMTDsKIAkJdGlwY19yY3YoZGV2X25ldChkZXYpLCBza2IsIGIpOwogCQlyY3VfcmVhZF91bmxvY2soKTsKQEAgLTU5MSwxOCArNjA0LDkgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmV0ZGV2X25vdGlmaWVyX2luZm9fdG9fZGV2KHB0cik7CiAJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChkZXYpOwotCXN0cnVjdCB0aXBjX25ldCAqdG4gPSB0aXBjX25ldChuZXQpOwogCXN0cnVjdCB0aXBjX2JlYXJlciAqYjsKLQlpbnQgaTsKIAogCWIgPSBydG5sX2RlcmVmZXJlbmNlKGRldi0+dGlwY19wdHIpOwotCWlmICghYikgewotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0JFQVJFUlM7IGIgPSBOVUxMLCBpKyspIHsKLQkJCWIgPSBydG5sX2RlcmVmZXJlbmNlKHRuLT5iZWFyZXJfbGlzdFtpXSk7Ci0JCQlpZiAoYiAmJiAoYi0+bWVkaWFfcHRyID09IGRldikpCi0JCQkJYnJlYWs7Ci0JCX0KLQl9CiAJaWYgKCFiKQogCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAKQEAgLTYxMywxMSArNjE3LDEwIEBACiAJCWlmIChuZXRpZl9jYXJyaWVyX29rKGRldikpCiAJCQlicmVhazsKIAljYXNlIE5FVERFVl9VUDoKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKGRldi0+dGlwY19wdHIsIGIpOworCQl0ZXN0X2FuZF9zZXRfYml0X2xvY2soMCwgJmItPnVwKTsKIAkJYnJlYWs7CiAJY2FzZSBORVRERVZfR09JTkdfRE9XTjoKLQkJUkNVX0lOSVRfUE9JTlRFUihkZXYtPnRpcGNfcHRyLCBOVUxMKTsKLQkJc3luY2hyb25pemVfbmV0KCk7CisJCWNsZWFyX2JpdF91bmxvY2soMCwgJmItPnVwKTsKIAkJdGlwY19yZXNldF9iZWFyZXIobmV0LCBiKTsKIAkJYnJlYWs7CiAJY2FzZSBORVRERVZfQ0hBTkdFTVRVOgpAQCAtNzA5LDYgKzcxMiwxNCBAQAogCQlnb3RvIHByb3BfbXNnX2Z1bGw7CiAKIAlubGFfbmVzdF9lbmQobXNnLT5za2IsIHByb3ApOworCisjaWZkZWYgQ09ORklHX1RJUENfTUVESUFfVURQCisJaWYgKGJlYXJlci0+bWVkaWEtPnR5cGVfaWQgPT0gVElQQ19NRURJQV9UWVBFX1VEUCkgeworCQlpZiAodGlwY191ZHBfbmxfYWRkX2JlYXJlcl9kYXRhKG1zZywgYmVhcmVyKSkKKwkJCWdvdG8gYXR0cl9tc2dfZnVsbDsKKwl9CisjZW5kaWYKKwogCW5sYV9uZXN0X2VuZChtc2ctPnNrYiwgYXR0cnMpOwogCWdlbmxtc2dfZW5kKG1zZy0+c2tiLCBoZHIpOwogCkBAIC04OTUsNiArOTA2LDQ5IEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCB0aXBjX25sX2JlYXJlcl9hZGQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3sKKwlpbnQgZXJyOworCWNoYXIgKm5hbWU7CisJc3RydWN0IHRpcGNfYmVhcmVyICpiOworCXN0cnVjdCBubGF0dHIgKmF0dHJzW1RJUENfTkxBX0JFQVJFUl9NQVggKyAxXTsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChza2ItPnNrKTsKKworCWlmICghaW5mby0+YXR0cnNbVElQQ19OTEFfQkVBUkVSXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSBubGFfcGFyc2VfbmVzdGVkKGF0dHJzLCBUSVBDX05MQV9CRUFSRVJfTUFYLAorCQkJICAgICAgIGluZm8tPmF0dHJzW1RJUENfTkxBX0JFQVJFUl0sCisJCQkgICAgICAgdGlwY19ubF9iZWFyZXJfcG9saWN5KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKCFhdHRyc1tUSVBDX05MQV9CRUFSRVJfTkFNRV0pCisJCXJldHVybiAtRUlOVkFMOworCW5hbWUgPSBubGFfZGF0YShhdHRyc1tUSVBDX05MQV9CRUFSRVJfTkFNRV0pOworCisJcnRubF9sb2NrKCk7CisJYiA9IHRpcGNfYmVhcmVyX2ZpbmQobmV0LCBuYW1lKTsKKwlpZiAoIWIpIHsKKwkJcnRubF91bmxvY2soKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisjaWZkZWYgQ09ORklHX1RJUENfTUVESUFfVURQCisJaWYgKGF0dHJzW1RJUENfTkxBX0JFQVJFUl9VRFBfT1BUU10pIHsKKwkJZXJyID0gdGlwY191ZHBfbmxfYmVhcmVyX2FkZChiLAorCQkJCQkgICAgIGF0dHJzW1RJUENfTkxBX0JFQVJFUl9VRFBfT1BUU10pOworCQlpZiAoZXJyKSB7CisJCQlydG5sX3VubG9jaygpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKyNlbmRpZgorCXJ0bmxfdW5sb2NrKCk7CisKKwlyZXR1cm4gMDsKK30KKwogaW50IHRpcGNfbmxfYmVhcmVyX3NldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogewogCWludCBlcnI7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9iZWFyZXIuaCBiL25ldC90aXBjL2JlYXJlci5oCmluZGV4IDQzNzU3ZjEuLjc4ODkyZTJmIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9iZWFyZXIuaAorKysgYi9uZXQvdGlwYy9iZWFyZXIuaApAQCAtMTUwLDYgKzE1MCw3IEBACiAJdTMyIGlkZW50aXR5OwogCXN0cnVjdCB0aXBjX2xpbmtfcmVxICpsaW5rX3JlcTsKIAljaGFyIG5ldF9wbGFuZTsKKwl1bnNpZ25lZCBsb25nIHVwOwogfTsKIAogc3RydWN0IHRpcGNfYmVhcmVyX25hbWVzIHsKQEAgLTE4MCw2ICsxODEsNyBAQAogaW50IHRpcGNfbmxfYmVhcmVyX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKTsKIGludCB0aXBjX25sX2JlYXJlcl9nZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7CiBpbnQgdGlwY19ubF9iZWFyZXJfc2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pOworaW50IHRpcGNfbmxfYmVhcmVyX2FkZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTsKIAogaW50IHRpcGNfbmxfbWVkaWFfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOwogaW50IHRpcGNfbmxfbWVkaWFfZ2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbGluay5jIGIvbmV0L3RpcGMvbGluay5jCmluZGV4IDg3N2Q5NGYuLmIzNmUxNmMgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2xpbmsuYworKysgYi9uZXQvdGlwYy9saW5rLmMKQEAgLTE4MSw3ICsxODEsMTAgQEAKIAl1MTYgYWNrZWQ7CiAJc3RydWN0IHRpcGNfbGluayAqYmNfcmN2bGluazsKIAlzdHJ1Y3QgdGlwY19saW5rICpiY19zbmRsaW5rOwotCWludCBuYWNrX3N0YXRlOworCXVuc2lnbmVkIGxvbmcgcHJldl9yZXRyOworCXUxNiBwcmV2X2Zyb207CisJdTE2IHByZXZfdG87CisJdTggbmFja19zdGF0ZTsKIAlib29sIGJjX3BlZXJfaXNfdXA7CiAKIAkvKiBTdGF0aXN0aWNzICovCkBAIC0yMDIsNiArMjA1LDggQEAKIAlCQ19OQUNLX1NORF9TVVBQUkVTUywKIH07CiAKKyNkZWZpbmUgVElQQ19CQ19SRVRSX0xJTUlUIDEwICAgLyogW21zXSAqLworCiAvKgogICogSW50ZXJ2YWwgYmV0d2VlbiBOQUNLcyB3aGVuIHBhY2tldHMgYXJyaXZlIG91dCBvZiBvcmRlcgogICovCkBAIC0yMzcsOCArMjQyLDggQEAKIAkJCQkgICAgICB1MTYgcmN2Z2FwLCBpbnQgdG9sZXJhbmNlLCBpbnQgcHJpb3JpdHksCiAJCQkJICAgICAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqeG1pdHEpOwogc3RhdGljIHZvaWQgbGlua19wcmludChzdHJ1Y3QgdGlwY19saW5rICpsLCBjb25zdCBjaGFyICpzdHIpOwotc3RhdGljIHZvaWQgdGlwY19saW5rX2J1aWxkX25hY2tfbXNnKHN0cnVjdCB0aXBjX2xpbmsgKmwsCi0JCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICp4bWl0cSk7CitzdGF0aWMgaW50IHRpcGNfbGlua19idWlsZF9uYWNrX21zZyhzdHJ1Y3QgdGlwY19saW5rICpsLAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICp4bWl0cSk7CiBzdGF0aWMgdm9pZCB0aXBjX2xpbmtfYnVpbGRfYmNfaW5pdF9tc2coc3RydWN0IHRpcGNfbGluayAqbCwKIAkJCQkJc3RydWN0IHNrX2J1ZmZfaGVhZCAqeG1pdHEpOwogc3RhdGljIGJvb2wgdGlwY19saW5rX3JlbGVhc2VfcGt0cyhzdHJ1Y3QgdGlwY19saW5rICpsLCB1MTYgdG8pOwpAQCAtMzY3LDYgKzM3MiwxOCBAQAogCXJldHVybiBsLT5hY2tlcnM7CiB9CiAKK3UxNiBsaW5rX2JjX3Jjdl9nYXAoc3RydWN0IHRpcGNfbGluayAqbCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2tiX3BlZWsoJmwtPmRlZmVyZHEpOworCXUxNiBnYXAgPSAwOworCisJaWYgKG1vcmUobC0+c25kX254dCwgbC0+cmN2X254dCkpCisJCWdhcCA9IGwtPnNuZF9ueHQgLSBsLT5yY3Zfbnh0OworCWlmIChza2IpCisJCWdhcCA9IGJ1Zl9zZXFubyhza2IpIC0gbC0+cmN2X254dDsKKwlyZXR1cm4gZ2FwOworfQorCiB2b2lkIHRpcGNfbGlua19zZXRfbXR1KHN0cnVjdCB0aXBjX2xpbmsgKmwsIGludCBtdHUpCiB7CiAJbC0+bXR1ID0gbXR1OwpAQCAtODA3LDcgKzgyNCw3IEBACiAKIAlza2JfcXVldWVfd2Fsa19zYWZlKCZsLT53YWtldXBxLCBza2IsIHRtcCkgewogCQlpbXAgPSBUSVBDX1NLQl9DQihza2IpLT5jaGFpbl9pbXA7Ci0JCWxpbSA9IGwtPndpbmRvdyArIGwtPmJhY2tsb2dbaW1wXS5saW1pdDsKKwkJbGltID0gbC0+YmFja2xvZ1tpbXBdLmxpbWl0OwogCQlwbmRbaW1wXSArPSBUSVBDX1NLQl9DQihza2IpLT5jaGFpbl9zejsKIAkJaWYgKChwbmRbaW1wXSArIGwtPmJhY2tsb2dbaW1wXS5sZW4pID49IGxpbSkKIAkJCWJyZWFrOwpAQCAtODczLDkgKzg5MCwxMSBAQAogCXN0cnVjdCBza19idWZmICpza2IsICpfc2tiLCAqYnNrYjsKIAogCS8qIE1hdGNoIG1zZyBpbXBvcnRhbmNlIGFnYWluc3QgdGhpcyBhbmQgYWxsIGhpZ2hlciBiYWNrbG9nIGxpbWl0czogKi8KLQlmb3IgKGkgPSBpbXA7IGkgPD0gVElQQ19TWVNURU1fSU1QT1JUQU5DRTsgaSsrKSB7Ci0JCWlmICh1bmxpa2VseShsLT5iYWNrbG9nW2ldLmxlbiA+PSBsLT5iYWNrbG9nW2ldLmxpbWl0KSkKLQkJCXJldHVybiBsaW5rX3NjaGVkdWxlX3VzZXIobCwgbGlzdCk7CisJaWYgKCFza2JfcXVldWVfZW1wdHkoYmFja2xvZ3EpKSB7CisJCWZvciAoaSA9IGltcDsgaSA8PSBUSVBDX1NZU1RFTV9JTVBPUlRBTkNFOyBpKyspIHsKKwkJCWlmICh1bmxpa2VseShsLT5iYWNrbG9nW2ldLmxlbiA+PSBsLT5iYWNrbG9nW2ldLmxpbWl0KSkKKwkJCQlyZXR1cm4gbGlua19zY2hlZHVsZV91c2VyKGwsIGxpc3QpOworCQl9CiAJfQogCWlmICh1bmxpa2VseShtc2dfc2l6ZShoZHIpID4gbXR1KSkgewogCQlza2JfcXVldWVfcHVyZ2UobGlzdCk7CkBAIC0xMTMzLDcgKzExNTIsMTAgQEAKIAkJaWYgKCgobC0+cmN2X254dCBeIHRpcGNfb3duX2FkZHIobC0+bmV0KSkgJiAweGYpICE9IDB4ZikKIAkJCXJldHVybiAwOwogCQlsLT5yY3ZfdW5hY2tlZCA9IDA7Ci0JCXJldHVybiBUSVBDX0xJTktfU05EX0JDX0FDSzsKKworCQkvKiBVc2Ugc25kX254dCB0byBzdG9yZSBwZWVyJ3Mgc25kX254dCBpbiBicm9hZGNhc3QgcmN2IGxpbmsgKi8KKwkJbC0+c25kX254dCA9IGwtPnJjdl9ueHQ7CisJCXJldHVybiBUSVBDX0xJTktfU05EX1NUQVRFOwogCX0KIAogCS8qIFVuaWNhc3QgQUNLICovCkBAIC0xMTYyLDE3ICsxMTg0LDI2IEBACiB9CiAKIC8qIHRpcGNfbGlua19idWlsZF9uYWNrX21zZzogcHJlcGFyZSBsaW5rIG5hY2sgbWVzc2FnZSBmb3IgdHJhbnNtaXNzaW9uCisgKiBOb3RlIHRoYXQgc2VuZGluZyBvZiBicm9hZGNhc3QgTkFDSyBpcyBjb29yZGluYXRlZCBhbW9uZyBub2RlcywgdG8KKyAqIHJlZHVjZSB0aGUgcmlzayBvZiBOQUNLIHN0b3JtcyB0b3dhcmRzIHRoZSBzZW5kZXIKICAqLwotc3RhdGljIHZvaWQgdGlwY19saW5rX2J1aWxkX25hY2tfbXNnKHN0cnVjdCB0aXBjX2xpbmsgKmwsCi0JCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICp4bWl0cSkKK3N0YXRpYyBpbnQgdGlwY19saW5rX2J1aWxkX25hY2tfbXNnKHN0cnVjdCB0aXBjX2xpbmsgKmwsCisJCQkJICAgIHN0cnVjdCBza19idWZmX2hlYWQgKnhtaXRxKQogewogCXUzMiBkZWZfY250ID0gKytsLT5zdGF0cy5kZWZlcnJlZF9yZWN2OworCWludCBtYXRjaDEsIG1hdGNoMjsKIAotCWlmIChsaW5rX2lzX2JjX3JjdmxpbmsobCkpCi0JCXJldHVybjsKKwlpZiAobGlua19pc19iY19yY3ZsaW5rKGwpKSB7CisJCW1hdGNoMSA9IGRlZl9jbnQgJiAweGY7CisJCW1hdGNoMiA9IHRpcGNfb3duX2FkZHIobC0+bmV0KSAmIDB4ZjsKKwkJaWYgKG1hdGNoMSA9PSBtYXRjaDIpCisJCQlyZXR1cm4gVElQQ19MSU5LX1NORF9TVEFURTsKKwkJcmV0dXJuIDA7CisJfQogCiAJaWYgKChza2JfcXVldWVfbGVuKCZsLT5kZWZlcmRxKSA9PSAxKSB8fCAhKGRlZl9jbnQgJSBUSVBDX05BQ0tfSU5UVikpCiAJCXRpcGNfbGlua19idWlsZF9wcm90b19tc2cobCwgU1RBVEVfTVNHLCAwLCAwLCAwLCAwLCB4bWl0cSk7CisJcmV0dXJuIDA7CiB9CiAKIC8qIHRpcGNfbGlua19yY3YgLSBwcm9jZXNzIFRJUEMgcGFja2V0cy9tZXNzYWdlcyBhcnJpdmluZyBmcm9tIG9mZi1ub2RlCkBAIC0xMjIzLDcgKzEyNTQsNyBAQAogCQkvKiBEZWZlciBkZWxpdmVyeSBpZiBzZXF1ZW5jZSBnYXAgKi8KIAkJaWYgKHVubGlrZWx5KHNlcW5vICE9IHJjdl9ueHQpKSB7CiAJCQlfX3RpcGNfc2tiX3F1ZXVlX3NvcnRlZChkZWZxLCBzZXFubywgc2tiKTsKLQkJCXRpcGNfbGlua19idWlsZF9uYWNrX21zZyhsLCB4bWl0cSk7CisJCQlyYyB8PSB0aXBjX2xpbmtfYnVpbGRfbmFja19tc2cobCwgeG1pdHEpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMTIzNCw3ICsxMjY1LDcgQEAKIAkJCXJjIHw9IHRpcGNfbGlua19pbnB1dChsLCBza2IsIGwtPmlucHV0cSk7CiAJCWlmICh1bmxpa2VseSgrK2wtPnJjdl91bmFja2VkID49IFRJUENfTUlOX0xJTktfV0lOKSkKIAkJCXJjIHw9IHRpcGNfbGlua19idWlsZF9zdGF0ZV9tc2cobCwgeG1pdHEpOwotCQlpZiAodW5saWtlbHkocmMgJiB+VElQQ19MSU5LX1NORF9CQ19BQ0spKQorCQlpZiAodW5saWtlbHkocmMgJiB+VElQQ19MSU5LX1NORF9TVEFURSkpCiAJCQlicmVhazsKIAl9IHdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZShkZWZxKSkpOwogCkBAIC0xMjQ4LDEwICsxMjc5LDExIEBACiAJCQkJICAgICAgdTE2IHJjdmdhcCwgaW50IHRvbGVyYW5jZSwgaW50IHByaW9yaXR5LAogCQkJCSAgICAgIHN0cnVjdCBza19idWZmX2hlYWQgKnhtaXRxKQogeworCXN0cnVjdCB0aXBjX2xpbmsgKmJjbCA9IGwtPmJjX3Jjdmxpbms7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgdGlwY19tc2cgKmhkcjsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpkZnEgPSAmbC0+ZGVmZXJkcTsKLQlib29sIG5vZGVfdXAgPSBsaW5rX2lzX3VwKGwtPmJjX3JjdmxpbmspOworCWJvb2wgbm9kZV91cCA9IGxpbmtfaXNfdXAoYmNsKTsKIAlzdHJ1Y3QgdGlwY19tb25fc3RhdGUgKm1zdGF0ZSA9ICZsLT5tb25fc3RhdGU7CiAJaW50IGRsZW4gPSAwOwogCXZvaWQgKmRhdGE7CkBAIC0xMjc5LDcgKzEzMTEsNyBAQAogCW1zZ19zZXRfbmV0X3BsYW5lKGhkciwgbC0+bmV0X3BsYW5lKTsKIAltc2dfc2V0X25leHRfc2VudChoZHIsIGwtPnNuZF9ueHQpOwogCW1zZ19zZXRfYWNrKGhkciwgbC0+cmN2X254dCAtIDEpOwotCW1zZ19zZXRfYmNhc3RfYWNrKGhkciwgbC0+YmNfcmN2bGluay0+cmN2X254dCAtIDEpOworCW1zZ19zZXRfYmNhc3RfYWNrKGhkciwgYmNsLT5yY3Zfbnh0IC0gMSk7CiAJbXNnX3NldF9sYXN0X2JjYXN0KGhkciwgbC0+YmNfc25kbGluay0+c25kX254dCAtIDEpOwogCW1zZ19zZXRfbGlua190b2xlcmFuY2UoaGRyLCB0b2xlcmFuY2UpOwogCW1zZ19zZXRfbGlua3ByaW8oaGRyLCBwcmlvcml0eSk7CkBAIC0xMjg5LDYgKzEzMjEsNyBAQAogCiAJaWYgKG10eXAgPT0gU1RBVEVfTVNHKSB7CiAJCW1zZ19zZXRfc2VxX2dhcChoZHIsIHJjdmdhcCk7CisJCW1zZ19zZXRfYmNfZ2FwKGhkciwgbGlua19iY19yY3ZfZ2FwKGJjbCkpOwogCQltc2dfc2V0X3Byb2JlKGhkciwgcHJvYmUpOwogCQl0aXBjX21vbl9wcmVwKGwtPm5ldCwgZGF0YSwgJmRsZW4sIG1zdGF0ZSwgbC0+YmVhcmVyX2lkKTsKIAkJbXNnX3NldF9zaXplKGhkciwgSU5UX0hfU0laRSArIGRsZW4pOwpAQCAtMTU3MSw1MSArMTYwNCwxMDcgQEAKIAkJbC0+cmN2X254dCA9IHBlZXJzX3NuZF9ueHQ7CiB9CiAKKy8qIGxpbmtfYmNfcmV0ciBldmFsKCktIGNoZWNrIGlmIHRoZSBpbmRpY2F0ZWQgcmFuZ2UgY2FuIGJlIHJldHJhbnNtaXR0ZWQgbm93CisgKiAtIEFkanVzdCBwZXJtaXR0ZWQgcmFuZ2UgaWYgdGhlcmUgaXMgb3ZlcmxhcCB3aXRoIHByZXZpb3VzIHJldHJhbnNtaXNzaW9uCisgKi8KK3N0YXRpYyBib29sIGxpbmtfYmNfcmV0cl9ldmFsKHN0cnVjdCB0aXBjX2xpbmsgKmwsIHUxNiAqZnJvbSwgdTE2ICp0bykKK3sKKwl1bnNpZ25lZCBsb25nIGVsYXBzZWQgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBsLT5wcmV2X3JldHIpOworCisJaWYgKGxlc3MoKnRvLCAqZnJvbSkpCisJCXJldHVybiBmYWxzZTsKKworCS8qIE5ldyByZXRyYW5zbWlzc2lvbiByZXF1ZXN0ICovCisJaWYgKChlbGFwc2VkID4gVElQQ19CQ19SRVRSX0xJTUlUKSB8fAorCSAgICBsZXNzKCp0bywgbC0+cHJldl9mcm9tKSB8fCBtb3JlKCpmcm9tLCBsLT5wcmV2X3RvKSkgeworCQlsLT5wcmV2X2Zyb20gPSAqZnJvbTsKKwkJbC0+cHJldl90byA9ICp0bzsKKwkJbC0+cHJldl9yZXRyID0gamlmZmllczsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyogSW5zaWRlIHJhbmdlIG9mIHByZXZpb3VzIHJldHJhbnNtaXQgKi8KKwlpZiAoIWxlc3MoKmZyb20sIGwtPnByZXZfZnJvbSkgJiYgIW1vcmUoKnRvLCBsLT5wcmV2X3RvKSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogRnVsbHkgb3IgcGFydGlhbGx5IG91dHNpZGUgcHJldmlvdXMgcmFuZ2UgPT4gZXhjbHVkZSBvdmVybGFwICovCisJaWYgKGxlc3MoKmZyb20sIGwtPnByZXZfZnJvbSkpIHsKKwkJKnRvID0gbC0+cHJldl9mcm9tIC0gMTsKKwkJbC0+cHJldl9mcm9tID0gKmZyb207CisJfQorCWlmIChtb3JlKCp0bywgbC0+cHJldl90bykpIHsKKwkJKmZyb20gPSBsLT5wcmV2X3RvICsgMTsKKwkJbC0+cHJldl90byA9ICp0bzsKKwl9CisJbC0+cHJldl9yZXRyID0gamlmZmllczsKKwlyZXR1cm4gdHJ1ZTsKK30KKwogLyogdGlwY19saW5rX2JjX3N5bmNfcmN2IC0gdXBkYXRlIHJjdiBsaW5rIGFjY29yZGluZyB0byBwZWVyJ3Mgc2VuZCBzdGF0ZQogICovCi12b2lkIHRpcGNfbGlua19iY19zeW5jX3JjdihzdHJ1Y3QgdGlwY19saW5rICpsLCBzdHJ1Y3QgdGlwY19tc2cgKmhkciwKLQkJCSAgIHN0cnVjdCBza19idWZmX2hlYWQgKnhtaXRxKQoraW50IHRpcGNfbGlua19iY19zeW5jX3JjdihzdHJ1Y3QgdGlwY19saW5rICpsLCBzdHJ1Y3QgdGlwY19tc2cgKmhkciwKKwkJCSAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqeG1pdHEpCiB7CisJc3RydWN0IHRpcGNfbGluayAqc25kX2wgPSBsLT5iY19zbmRsaW5rOwogCXUxNiBwZWVyc19zbmRfbnh0ID0gbXNnX2JjX3NuZF9ueHQoaGRyKTsKKwl1MTYgZnJvbSA9IG1zZ19iY2FzdF9hY2soaGRyKSArIDE7CisJdTE2IHRvID0gZnJvbSArIG1zZ19iY19nYXAoaGRyKSAtIDE7CisJaW50IHJjID0gMDsKIAogCWlmICghbGlua19pc191cChsKSkKLQkJcmV0dXJuOworCQlyZXR1cm4gcmM7CiAKIAlpZiAoIW1zZ19wZWVyX25vZGVfaXNfdXAoaGRyKSkKLQkJcmV0dXJuOworCQlyZXR1cm4gcmM7CiAKIAkvKiBPcGVuIHdoZW4gcGVlciBhY2tvd2xlZGdlcyBvdXIgYmNhc3QgaW5pdCBtc2cgKHBrdCAjMSkgKi8KIAlpZiAobXNnX2FjayhoZHIpKQogCQlsLT5iY19wZWVyX2lzX3VwID0gdHJ1ZTsKIAogCWlmICghbC0+YmNfcGVlcl9pc191cCkKLQkJcmV0dXJuOworCQlyZXR1cm4gcmM7CisKKwlsLT5zdGF0cy5yZWN2X25hY2tzKys7CiAKIAkvKiBJZ25vcmUgaWYgcGVlcnNfc25kX254dCBnb2VzIGJleW9uZCByZWNlaXZlIHdpbmRvdyAqLwogCWlmIChtb3JlKHBlZXJzX3NuZF9ueHQsIGwtPnJjdl9ueHQgKyBsLT53aW5kb3cpKQotCQlyZXR1cm47CisJCXJldHVybiByYzsKKworCWlmIChsaW5rX2JjX3JldHJfZXZhbChzbmRfbCwgJmZyb20sICZ0bykpCisJCXJjID0gdGlwY19saW5rX3JldHJhbnMoc25kX2wsIGZyb20sIHRvLCB4bWl0cSk7CisKKwlsLT5zbmRfbnh0ID0gcGVlcnNfc25kX254dDsKKwlpZiAobGlua19iY19yY3ZfZ2FwKGwpKQorCQlyYyB8PSBUSVBDX0xJTktfU05EX1NUQVRFOworCisJLyogUmV0dXJuIG5vdyBpZiBzZW5kZXIgc3VwcG9ydHMgbmFjayB2aWEgU1RBVEUgbWVzc2FnZXMgKi8KKwlpZiAobC0+cGVlcl9jYXBzICYgVElQQ19CQ0FTVF9TVEFURV9OQUNLKQorCQlyZXR1cm4gcmM7CisKKwkvKiBPdGhlcndpc2UsIGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlICovCiAKIAlpZiAoIW1vcmUocGVlcnNfc25kX254dCwgbC0+cmN2X254dCkpIHsKIAkJbC0+bmFja19zdGF0ZSA9IEJDX05BQ0tfU05EX0NPTkRJVElPTkFMOwotCQlyZXR1cm47CisJCXJldHVybiAwOwogCX0KIAogCS8qIERvbid0IE5BQ0sgaWYgb25lIHdhcyByZWNlbnRseSBzZW50IG9yIHBlZWtlZCAqLwogCWlmIChsLT5uYWNrX3N0YXRlID09IEJDX05BQ0tfU05EX1NVUFBSRVNTKSB7CiAJCWwtPm5hY2tfc3RhdGUgPSBCQ19OQUNLX1NORF9VTkNPTkRJVElPTkFMOwotCQlyZXR1cm47CisJCXJldHVybiAwOwogCX0KIAogCS8qIENvbmRpdGlvbmFsbHkgZGVsYXkgTkFDSyBzZW5kaW5nIHVudGlsIG5leHQgc3luY2ggcmN2ICovCiAJaWYgKGwtPm5hY2tfc3RhdGUgPT0gQkNfTkFDS19TTkRfQ09ORElUSU9OQUwpIHsKIAkJbC0+bmFja19zdGF0ZSA9IEJDX05BQ0tfU05EX1VOQ09ORElUSU9OQUw7CiAJCWlmICgocGVlcnNfc25kX254dCAtIGwtPnJjdl9ueHQpIDwgVElQQ19NSU5fTElOS19XSU4pCi0JCQlyZXR1cm47CisJCQlyZXR1cm4gMDsKIAl9CiAKIAkvKiBTZW5kIE5BQ0sgbm93IGJ1dCBzdXBwcmVzcyBuZXh0IG9uZSAqLwogCXRpcGNfbGlua19idWlsZF9iY19wcm90b19tc2cobCwgdHJ1ZSwgcGVlcnNfc25kX254dCwgeG1pdHEpOwogCWwtPm5hY2tfc3RhdGUgPSBCQ19OQUNLX1NORF9TVVBQUkVTUzsKKwlyZXR1cm4gMDsKIH0KIAogdm9pZCB0aXBjX2xpbmtfYmNfYWNrX3JjdihzdHJ1Y3QgdGlwY19saW5rICpsLCB1MTYgYWNrZWQsCkBAIC0xNjUyLDYgKzE3NDEsOCBAQAogfQogCiAvKiB0aXBjX2xpbmtfYmNfbmFja19yY3YoKTogcmVjZWl2ZSBicm9hZGNhc3QgbmFjayBtZXNzYWdlCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGhlcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBzaW5jZQorICogbm8gQkNBU1RfUFJPVE9DT0wvU1RBVEUgbWVzc2FnZXMgb2NjdXIgZnJvbSBUSVBDIHYyLjUuCiAgKi8KIGludCB0aXBjX2xpbmtfYmNfbmFja19yY3Yoc3RydWN0IHRpcGNfbGluayAqbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqeG1pdHEpCkBAIC0xNjkyLDEwICsxNzgzLDEwIEBACiAJaW50IG1heF9idWxrID0gVElQQ19NQVhfUFVCTElDQVRJT05TIC8gKGwtPm10dSAvIElURU1fU0laRSk7CiAKIAlsLT53aW5kb3cgPSB3aW47Ci0JbC0+YmFja2xvZ1tUSVBDX0xPV19JTVBPUlRBTkNFXS5saW1pdCAgICAgID0gd2luIC8gMjsKLQlsLT5iYWNrbG9nW1RJUENfTUVESVVNX0lNUE9SVEFOQ0VdLmxpbWl0ICAgPSB3aW47Ci0JbC0+YmFja2xvZ1tUSVBDX0hJR0hfSU1QT1JUQU5DRV0ubGltaXQgICAgID0gd2luIC8gMiAqIDM7Ci0JbC0+YmFja2xvZ1tUSVBDX0NSSVRJQ0FMX0lNUE9SVEFOQ0VdLmxpbWl0ID0gd2luICogMjsKKwlsLT5iYWNrbG9nW1RJUENfTE9XX0lNUE9SVEFOQ0VdLmxpbWl0ICAgICAgPSBtYXhfdCh1MTYsIDUwLCB3aW4pOworCWwtPmJhY2tsb2dbVElQQ19NRURJVU1fSU1QT1JUQU5DRV0ubGltaXQgICA9IG1heF90KHUxNiwgMTAwLCB3aW4gKiAyKTsKKwlsLT5iYWNrbG9nW1RJUENfSElHSF9JTVBPUlRBTkNFXS5saW1pdCAgICAgPSBtYXhfdCh1MTYsIDE1MCwgd2luICogMyk7CisJbC0+YmFja2xvZ1tUSVBDX0NSSVRJQ0FMX0lNUE9SVEFOQ0VdLmxpbWl0ID0gbWF4X3QodTE2LCAyMDAsIHdpbiAqIDQpOwogCWwtPmJhY2tsb2dbVElQQ19TWVNURU1fSU1QT1JUQU5DRV0ubGltaXQgICA9IG1heF9idWxrOwogfQogCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9saW5rLmggYi9uZXQvdGlwYy9saW5rLmgKaW5kZXggZDdlOWQ0Mi4uZDFiZDE3OCAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbGluay5oCisrKyBiL25ldC90aXBjL2xpbmsuaApAQCAtNjMsNyArNjMsNyBAQAogZW51bSB7CiAJVElQQ19MSU5LX1VQX0VWVCAgICAgICA9IDEsCiAJVElQQ19MSU5LX0RPV05fRVZUICAgICA9ICgxIDw8IDEpLAotCVRJUENfTElOS19TTkRfQkNfQUNLICAgPSAoMSA8PCAyKQorCVRJUENfTElOS19TTkRfU1RBVEUgICAgPSAoMSA8PCAyKQogfTsKIAogLyogU3RhcnRpbmcgdmFsdWUgZm9yIG1heGltdW0gcGFja2V0IHNpemUgbmVnb3RpYXRpb24gb24gdW5pY2FzdCBsaW5rcwpAQCAtMTM4LDggKzEzOCw4IEBACiB2b2lkIHRpcGNfbGlua19idWlsZF9iY19zeW5jX21zZyhzdHJ1Y3QgdGlwY19saW5rICpsLAogCQkJCSBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICp4bWl0cSk7CiB2b2lkIHRpcGNfbGlua19iY19pbml0X3JjdihzdHJ1Y3QgdGlwY19saW5rICpsLCBzdHJ1Y3QgdGlwY19tc2cgKmhkcik7Ci12b2lkIHRpcGNfbGlua19iY19zeW5jX3JjdihzdHJ1Y3QgdGlwY19saW5rICpsLCAgIHN0cnVjdCB0aXBjX21zZyAqaGRyLAotCQkJICAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqeG1pdHEpOworaW50IHRpcGNfbGlua19iY19zeW5jX3JjdihzdHJ1Y3QgdGlwY19saW5rICpsLCAgIHN0cnVjdCB0aXBjX21zZyAqaGRyLAorCQkJICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICp4bWl0cSk7CiBpbnQgdGlwY19saW5rX2JjX25hY2tfcmN2KHN0cnVjdCB0aXBjX2xpbmsgKmwsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgIHN0cnVjdCBza19idWZmX2hlYWQgKnhtaXRxKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbW9uaXRvci5jIGIvbmV0L3RpcGMvbW9uaXRvci5jCmluZGV4IGI2MmNhYTEuLmVkOTdhNTggMTAwNjQ0Ci0tLSBhL25ldC90aXBjL21vbml0b3IuYworKysgYi9uZXQvdGlwYy9tb25pdG9yLmMKQEAgLTcyOCwxMiArNzI4LDEzIEBACiAJCQkgICAgIHUzMiBiZWFyZXJfaWQsIHUzMiAqcHJldl9ub2RlKQogewogCXN0cnVjdCB0aXBjX21vbml0b3IgKm1vbiA9IHRpcGNfbW9uaXRvcihuZXQsIGJlYXJlcl9pZCk7Ci0Jc3RydWN0IHRpcGNfcGVlciAqcGVlciA9IG1vbi0+c2VsZjsKKwlzdHJ1Y3QgdGlwY19wZWVyICpwZWVyOwogCiAJaWYgKCFtb24pCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcmVhZF9sb2NrX2JoKCZtb24tPmxvY2spOworCXBlZXIgPSBtb24tPnNlbGY7CiAJZG8gewogCQlpZiAoKnByZXZfbm9kZSkgewogCQkJaWYgKHBlZXItPmFkZHIgPT0gKnByZXZfbm9kZSkKZGlmZiAtLWdpdCBhL25ldC90aXBjL21zZy5oIGIvbmV0L3RpcGMvbXNnLmgKaW5kZXggN2NmNTJmYi4uYzM4MzJjZCAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbXNnLmgKKysrIGIvbmV0L3RpcGMvbXNnLmgKQEAgLTcxOSw2ICs3MTksMTYgQEAKIAlyZXR1cm4gKGNoYXIgKikmbS0+aGRyW1RJUENfTUVESUFfSU5GT19PRkZTRVRdOwogfQogCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfYmNfZ2FwKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gbXNnX2JpdHMobSwgOCwgMCwgMHgzZmYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNnX3NldF9iY19nYXAoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikKK3sKKwltc2dfc2V0X2JpdHMobSwgOCwgMCwgMHgzZmYsIG4pOworfQorCiAvKgogICogV29yZCA5CiAgKi8KZGlmZiAtLWdpdCBhL25ldC90aXBjL25hbWVfZGlzdHIuYyBiL25ldC90aXBjL25hbWVfZGlzdHIuYwppbmRleCA2YjYyNmE2Li5hMDRmZTliIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9uYW1lX2Rpc3RyLmMKKysrIGIvbmV0L3RpcGMvbmFtZV9kaXN0ci5jCkBAIC02Miw2ICs2Miw4IEBACiAKIC8qKgogICogbmFtZWRfcHJlcGFyZV9idWYgLSBhbGxvY2F0ZSAmIGluaXRpYWxpemUgYSBwdWJsaWNhdGlvbiBtZXNzYWdlCisgKgorICogVGhlIGJ1ZmZlciByZXR1cm5lZCBpcyBvZiBzaXplIElOVF9IX1NJWkUgKyBwYXlsb2FkIHNpemUKICAqLwogc3RhdGljIHN0cnVjdCBza19idWZmICpuYW1lZF9wcmVwYXJlX2J1ZihzdHJ1Y3QgbmV0ICpuZXQsIHUzMiB0eXBlLCB1MzIgc2l6ZSwKIAkJCQkJIHUzMiBkZXN0KQpAQCAtMTQxLDkgKzE0Myw5IEBACiAJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsOwogCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwogCXN0cnVjdCBkaXN0cl9pdGVtICppdGVtID0gTlVMTDsKLQl1aW50IG1zZ19kc3ogPSAodGlwY19ub2RlX2dldF9tdHUobmV0LCBkbm9kZSwgMCkgLyBJVEVNX1NJWkUpICoKLQkJCUlURU1fU0laRTsKLQl1aW50IG1zZ19yZW0gPSBtc2dfZHN6OworCXUzMiBtc2dfZHN6ID0gKCh0aXBjX25vZGVfZ2V0X210dShuZXQsIGRub2RlLCAwKSAtIElOVF9IX1NJWkUpIC8KKwkJCUlURU1fU0laRSkgKiBJVEVNX1NJWkU7CisJdTMyIG1zZ19yZW0gPSBtc2dfZHN6OwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwdWJsLCBwbHMsIGxvY2FsX2xpc3QpIHsKIAkJLyogUHJlcGFyZSBuZXh0IGJ1ZmZlcjogKi8KZGlmZiAtLWdpdCBhL25ldC90aXBjL25ldC5oIGIvbmV0L3RpcGMvbmV0LmgKaW5kZXggNzdhN2ExMS4uYzdjMjU0OSAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbmV0LmgKKysrIGIvbmV0L3RpcGMvbmV0LmgKQEAgLTM5LDYgKzM5LDggQEAKIAogI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KIAorZXh0ZXJuIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IHRpcGNfbmxfbmV0X3BvbGljeVtdOworCiBpbnQgdGlwY19uZXRfc3RhcnQoc3RydWN0IG5ldCAqbmV0LCB1MzIgYWRkcik7CiAKIHZvaWQgdGlwY19uZXRfc3RvcChzdHJ1Y3QgbmV0ICpuZXQpOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbmV0bGluay5jIGIvbmV0L3RpcGMvbmV0bGluay5jCmluZGV4IGE4NGRhZWMuLjMyMDAwNTkgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL25ldGxpbmsuYworKysgYi9uZXQvdGlwYy9uZXRsaW5rLmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlICJsaW5rLmgiCiAjaW5jbHVkZSAibm9kZS5oIgogI2luY2x1ZGUgIm5ldC5oIgorI2luY2x1ZGUgInVkcF9tZWRpYS5oIgogI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IHRpcGNfbmxfcG9saWN5W1RJUENfTkxBX01BWCArIDFdID0gewpAQCAtMTYxLDYgKzE2MiwxMSBAQAogCQkucG9saWN5ID0gdGlwY19ubF9wb2xpY3ksCiAJfSwKIAl7CisJCS5jbWQJPSBUSVBDX05MX0JFQVJFUl9BREQsCisJCS5kb2l0CT0gdGlwY19ubF9iZWFyZXJfYWRkLAorCQkucG9saWN5ID0gdGlwY19ubF9wb2xpY3ksCisJfSwKKwl7CiAJCS5jbWQJPSBUSVBDX05MX0JFQVJFUl9TRVQsCiAJCS5kb2l0CT0gdGlwY19ubF9iZWFyZXJfc2V0LAogCQkucG9saWN5ID0gdGlwY19ubF9wb2xpY3ksCkBAIC0yMzgsNiArMjQ0LDE4IEBACiAJCS5kdW1waXQJPSB0aXBjX25sX25vZGVfZHVtcF9tb25pdG9yX3BlZXIsCiAJCS5wb2xpY3kgPSB0aXBjX25sX3BvbGljeSwKIAl9LAorCXsKKwkJLmNtZAk9IFRJUENfTkxfUEVFUl9SRU1PVkUsCisJCS5kb2l0CT0gdGlwY19ubF9wZWVyX3JtLAorCQkucG9saWN5ID0gdGlwY19ubF9wb2xpY3ksCisJfSwKKyNpZmRlZiBDT05GSUdfVElQQ19NRURJQV9VRFAKKwl7CisJCS5jbWQJPSBUSVBDX05MX1VEUF9HRVRfUkVNT1RFSVAsCisJCS5kdW1waXQJPSB0aXBjX3VkcF9ubF9kdW1wX3JlbW90ZWlwLAorCQkucG9saWN5ID0gdGlwY19ubF9wb2xpY3ksCisJfSwKKyNlbmRpZgogfTsKIAogaW50IHRpcGNfbmxtc2dfcGFyc2UoY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBubGF0dHIgKioqYXR0cikKZGlmZiAtLWdpdCBhL25ldC90aXBjL25vZGUuYyBiL25ldC90aXBjL25vZGUuYwppbmRleCAyMTk3NDE5Li43ZWYxNGUyIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9ub2RlLmMKKysrIGIvbmV0L3RpcGMvbm9kZS5jCkBAIC0xMjYyLDYgKzEyNjIsMzQgQEAKIAlrZnJlZV9za2Ioc2tiKTsKIH0KIAorc3RhdGljIHZvaWQgdGlwY19ub2RlX2JjX3N5bmNfcmN2KHN0cnVjdCB0aXBjX25vZGUgKm4sIHN0cnVjdCB0aXBjX21zZyAqaGRyLAorCQkJCSAgaW50IGJlYXJlcl9pZCwgc3RydWN0IHNrX2J1ZmZfaGVhZCAqeG1pdHEpCit7CisJc3RydWN0IHRpcGNfbGluayAqdWNsOworCWludCByYzsKKworCXJjID0gdGlwY19iY2FzdF9zeW5jX3JjdihuLT5uZXQsIG4tPmJjX2VudHJ5LmxpbmssIGhkcik7CisKKwlpZiAocmMgJiBUSVBDX0xJTktfRE9XTl9FVlQpIHsKKwkJdGlwY19iZWFyZXJfcmVzZXRfYWxsKG4tPm5ldCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIShyYyAmIFRJUENfTElOS19TTkRfU1RBVEUpKQorCQlyZXR1cm47CisKKwkvKiBJZiBwcm9iZSBtZXNzYWdlLCBhIFNUQVRFIHJlc3BvbnNlIHdpbGwgYmUgc2VudCBhbnl3YXkgKi8KKwlpZiAobXNnX3Byb2JlKGhkcikpCisJCXJldHVybjsKKworCS8qIFByb2R1Y2UgYSBTVEFURSBtZXNzYWdlIGNhcnJ5aW5nIGJyb2FkY2FzdCBOQUNLICovCisJdGlwY19ub2RlX3JlYWRfbG9jayhuKTsKKwl1Y2wgPSBuLT5saW5rc1tiZWFyZXJfaWRdLmxpbms7CisJaWYgKHVjbCkKKwkJdGlwY19saW5rX2J1aWxkX3N0YXRlX21zZyh1Y2wsIHhtaXRxKTsKKwl0aXBjX25vZGVfcmVhZF91bmxvY2sobik7Cit9CisKIC8qKgogICogdGlwY19ub2RlX2JjX3JjdiAtIHByb2Nlc3MgVElQQyBicm9hZGNhc3QgcGFja2V0IGFycml2aW5nIGZyb20gb2ZmLW5vZGUKICAqIEBuZXQ6IHRoZSBhcHBsaWNhYmxlIG5ldCBuYW1lc3BhY2UKQEAgLTEyOTgsNyArMTMyNiw3IEBACiAJcmMgPSB0aXBjX2JjYXN0X3JjdihuZXQsIGJlLT5saW5rLCBza2IpOwogCiAJLyogQnJvYWRjYXN0IEFDS3MgYXJlIHNlbnQgb24gYSB1bmljYXN0IGxpbmsgKi8KLQlpZiAocmMgJiBUSVBDX0xJTktfU05EX0JDX0FDSykgeworCWlmIChyYyAmIFRJUENfTElOS19TTkRfU1RBVEUpIHsKIAkJdGlwY19ub2RlX3JlYWRfbG9jayhuKTsKIAkJdGlwY19saW5rX2J1aWxkX3N0YXRlX21zZyhsZS0+bGluaywgJnhtaXRxKTsKIAkJdGlwY19ub2RlX3JlYWRfdW5sb2NrKG4pOwpAQCAtMTUwNSw3ICsxNTMzLDcgQEAKIAogCS8qIEVuc3VyZSBicm9hZGNhc3QgcmVjZXB0aW9uIGlzIGluIHN5bmNoIHdpdGggcGVlcidzIHNlbmQgc3RhdGUgKi8KIAlpZiAodW5saWtlbHkodXNyID09IExJTktfUFJPVE9DT0wpKQotCQl0aXBjX2JjYXN0X3N5bmNfcmN2KG5ldCwgbi0+YmNfZW50cnkubGluaywgaGRyKTsKKwkJdGlwY19ub2RlX2JjX3N5bmNfcmN2KG4sIGhkciwgYmVhcmVyX2lkLCAmeG1pdHEpOwogCWVsc2UgaWYgKHVubGlrZWx5KHRpcGNfbGlua19hY2tlZChuLT5iY19lbnRyeS5saW5rKSAhPSBiY19hY2spKQogCQl0aXBjX2JjYXN0X2Fja19yY3YobmV0LCBuLT5iY19lbnRyeS5saW5rLCBiY19hY2spOwogCkBAIC0xNTUzLDYgKzE1ODEsNjkgQEAKIAlrZnJlZV9za2Ioc2tiKTsKIH0KIAoraW50IHRpcGNfbmxfcGVlcl9ybShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrYi0+c2spOworCXN0cnVjdCB0aXBjX25ldCAqdG4gPSBuZXRfZ2VuZXJpYyhuZXQsIHRpcGNfbmV0X2lkKTsKKwlzdHJ1Y3QgbmxhdHRyICphdHRyc1tUSVBDX05MQV9ORVRfTUFYICsgMV07CisJc3RydWN0IHRpcGNfbm9kZSAqcGVlcjsKKwl1MzIgYWRkcjsKKwlpbnQgZXJyOworCWludCBpOworCisJLyogV2UgaWRlbnRpZnkgdGhlIHBlZXIgYnkgaXRzIG5ldCAqLworCWlmICghaW5mby0+YXR0cnNbVElQQ19OTEFfTkVUXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSBubGFfcGFyc2VfbmVzdGVkKGF0dHJzLCBUSVBDX05MQV9ORVRfTUFYLAorCQkJICAgICAgIGluZm8tPmF0dHJzW1RJUENfTkxBX05FVF0sCisJCQkgICAgICAgdGlwY19ubF9uZXRfcG9saWN5KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKCFhdHRyc1tUSVBDX05MQV9ORVRfQUREUl0pCisJCXJldHVybiAtRUlOVkFMOworCisJYWRkciA9IG5sYV9nZXRfdTMyKGF0dHJzW1RJUENfTkxBX05FVF9BRERSXSk7CisKKwlpZiAoaW5fb3duX25vZGUobmV0LCBhZGRyKSkKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKworCXNwaW5fbG9ja19iaCgmdG4tPm5vZGVfbGlzdF9sb2NrKTsKKwlwZWVyID0gdGlwY19ub2RlX2ZpbmQobmV0LCBhZGRyKTsKKwlpZiAoIXBlZXIpIHsKKwkJc3Bpbl91bmxvY2tfYmgoJnRuLT5ub2RlX2xpc3RfbG9jayk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJdGlwY19ub2RlX3dyaXRlX2xvY2socGVlcik7CisJaWYgKHBlZXItPnN0YXRlICE9IFNFTEZfRE9XTl9QRUVSX0RPV04gJiYKKwkgICAgcGVlci0+c3RhdGUgIT0gU0VMRl9ET1dOX1BFRVJfTEVBVklORykgeworCQl0aXBjX25vZGVfd3JpdGVfdW5sb2NrKHBlZXIpOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0JFQVJFUlM7IGkrKykgeworCQlzdHJ1Y3QgdGlwY19saW5rX2VudHJ5ICpsZSA9ICZwZWVyLT5saW5rc1tpXTsKKworCQlpZiAobGUtPmxpbmspIHsKKwkJCWtmcmVlKGxlLT5saW5rKTsKKwkJCWxlLT5saW5rID0gTlVMTDsKKwkJCXBlZXItPmxpbmtfY250LS07CisJCX0KKwl9CisJdGlwY19ub2RlX3dyaXRlX3VubG9jayhwZWVyKTsKKwl0aXBjX25vZGVfZGVsZXRlKHBlZXIpOworCisJZXJyID0gMDsKK2Vycl9vdXQ6CisJdGlwY19ub2RlX3B1dChwZWVyKTsKKwlzcGluX3VubG9ja19iaCgmdG4tPm5vZGVfbGlzdF9sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKIGludCB0aXBjX25sX25vZGVfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCiB7CiAJaW50IGVycjsKZGlmZiAtLWdpdCBhL25ldC90aXBjL25vZGUuaCBiL25ldC90aXBjL25vZGUuaAppbmRleCBkNjlmZGZjLi4zOWVmNTRjIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9ub2RlLmgKKysrIGIvbmV0L3RpcGMvbm9kZS5oCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIG5ldC90aXBjL25vZGUuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIG5vZGUgbWFuYWdlbWVudCByb3V0aW5lcwogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA2LCAyMDE0LTIwMTUsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgMjAxNC0yMDE2LCBFcmljc3NvbiBBQgogICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwLTIwMTQsIFdpbmQgUml2ZXIgU3lzdGVtcwogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCkBAIC00NSwxMSArNDUsMTQgQEAKIC8qIE9wdGlvbmFsIGNhcGFiaWxpdGllcyBzdXBwb3J0ZWQgYnkgdGhpcyBjb2RlIHZlcnNpb24KICAqLwogZW51bSB7Ci0JVElQQ19CQ0FTVF9TWU5DSCAgID0gKDEgPDwgMSksCi0JVElQQ19CTE9DS19GTE9XQ1RMID0gKDIgPDwgMSkKKwlUSVBDX0JDQVNUX1NZTkNIICAgICAgPSAoMSA8PCAxKSwKKwlUSVBDX0JDQVNUX1NUQVRFX05BQ0sgPSAoMSA8PCAyKSwKKwlUSVBDX0JMT0NLX0ZMT1dDVEwgICAgPSAoMSA8PCAzKQogfTsKIAotI2RlZmluZSBUSVBDX05PREVfQ0FQQUJJTElUSUVTIChUSVBDX0JDQVNUX1NZTkNIIHwgVElQQ19CTE9DS19GTE9XQ1RMKQorI2RlZmluZSBUSVBDX05PREVfQ0FQQUJJTElUSUVTIChUSVBDX0JDQVNUX1NZTkNIIHwgXAorCQkJCVRJUENfQkNBU1RfU1RBVEVfTkFDSyB8IFwKKwkJCQlUSVBDX0JMT0NLX0ZMT1dDVEwpCiAjZGVmaW5lIElOVkFMSURfQkVBUkVSX0lEIC0xCiAKIHZvaWQgdGlwY19ub2RlX3N0b3Aoc3RydWN0IG5ldCAqbmV0KTsKQEAgLTc3LDYgKzgwLDcgQEAKIGludCB0aXBjX25sX25vZGVfcmVzZXRfbGlua19zdGF0cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTsKIGludCB0aXBjX25sX25vZGVfZ2V0X2xpbmsoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7CiBpbnQgdGlwY19ubF9ub2RlX3NldF9saW5rKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pOworaW50IHRpcGNfbmxfcGVlcl9ybShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTsKIAogaW50IHRpcGNfbmxfbm9kZV9zZXRfbW9uaXRvcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTsKIGludCB0aXBjX25sX25vZGVfZ2V0X21vbml0b3Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9zb2NrZXQuYyBiL25ldC90aXBjL3NvY2tldC5jCmluZGV4IGM0OWI4ZGYuLmY5ZjVmM2MgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL3NvY2tldC5jCisrKyBiL25ldC90aXBjL3NvY2tldC5jCkBAIC0yMTgwLDcgKzIxODAsOCBAQAogCQkJCQkgICAgICBUSVBDX0NPTk5fTVNHLCBTSE9SVF9IX1NJWkUsCiAJCQkJCSAgICAgIDAsIGRub2RlLCBvbm9kZSwgZHBvcnQsIG9wb3J0LAogCQkJCQkgICAgICBUSVBDX0NPTk5fU0hVVERPV04pOwotCQkJdGlwY19ub2RlX3htaXRfc2tiKG5ldCwgc2tiLCBkbm9kZSwgdHNrLT5wb3J0aWQpOworCQkJaWYgKHNrYikKKwkJCQl0aXBjX25vZGVfeG1pdF9za2IobmV0LCBza2IsIGRub2RlLCB0c2stPnBvcnRpZCk7CiAJCX0KIAkJdHNrLT5jb25uZWN0ZWQgPSAwOwogCQlzb2NrLT5zdGF0ZSA9IFNTX0RJU0NPTk5FQ1RJTkc7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy91ZHBfbWVkaWEuYyBiL25ldC90aXBjL3VkcF9tZWRpYS5jCmluZGV4IGIwMTZjMDEuLmQ4MGNkM2YgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL3VkcF9tZWRpYS5jCisrKyBiL25ldC90aXBjL3VkcF9tZWRpYS5jCkBAIC00OSw2ICs0OSw3IEBACiAjaW5jbHVkZSAiY29yZS5oIgogI2luY2x1ZGUgImJlYXJlci5oIgogI2luY2x1ZGUgIm5ldGxpbmsuaCIKKyNpbmNsdWRlICJtc2cuaCIKIAogLyogSUFOQSBhc3NpZ25lZCBVRFAgcG9ydCAqLwogI2RlZmluZSBVRFBfUE9SVF9ERUZBVUxUCTYxMTgKQEAgLTcwLDYgKzcxLDEzIEBACiAJfTsKIH07CiAKKy8qIHN0cnVjdCB1ZHBfcmVwbGljYXN0IC0gY29udGFpbmVyIGZvciBVRFAgcmVtb3RlIGFkZHJlc3NlcyAqLworc3RydWN0IHVkcF9yZXBsaWNhc3QgeworCXN0cnVjdCB1ZHBfbWVkaWFfYWRkciBhZGRyOworCXN0cnVjdCByY3VfaGVhZCByY3U7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKwogLyoqCiAgKiBzdHJ1Y3QgdWRwX2JlYXJlciAtIGlwL3VkcCBiZWFyZXIgZGF0YSBzdHJ1Y3R1cmUKICAqIEBiZWFyZXI6CWFzc29jaWF0ZWQgZ2VuZXJpYyB0aXBjIGJlYXJlcgpAQCAtODIsOCArOTAsMjAgQEAKIAlzdHJ1Y3Qgc29ja2V0ICp1YnNvY2s7CiAJdTMyIGlmaW5kZXg7CiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3RydWN0IHVkcF9yZXBsaWNhc3QgcmNhc3Q7CiB9OwogCitzdGF0aWMgaW50IHRpcGNfdWRwX2lzX21jYXN0X2FkZHIoc3RydWN0IHVkcF9tZWRpYV9hZGRyICphZGRyKQoreworCWlmIChudG9ocyhhZGRyLT5wcm90bykgPT0gRVRIX1BfSVApCisJCXJldHVybiBpcHY0X2lzX211bHRpY2FzdChhZGRyLT5pcHY0LnNfYWRkcik7CisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKKwllbHNlCisJCXJldHVybiBpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZhZGRyLT5pcHY2KTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCiAvKiB1ZHBfbWVkaWFfYWRkcl9zZXQgLSBjb252ZXJ0IGEgaXAvdWRwIGFkZHJlc3MgdG8gYSBUSVBDIG1lZGlhIGFkZHJlc3MgKi8KIHN0YXRpYyB2b2lkIHRpcGNfdWRwX21lZGlhX2FkZHJfc2V0KHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmFkZHIsCiAJCQkJICAgIHN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqdWEpCkBAIC05MSwxNSArMTExLDkgQEAKIAltZW1zZXQoYWRkciwgMCwgc2l6ZW9mKHN0cnVjdCB0aXBjX21lZGlhX2FkZHIpKTsKIAlhZGRyLT5tZWRpYV9pZCA9IFRJUENfTUVESUFfVFlQRV9VRFA7CiAJbWVtY3B5KGFkZHItPnZhbHVlLCB1YSwgc2l6ZW9mKHN0cnVjdCB1ZHBfbWVkaWFfYWRkcikpOwotCWlmIChudG9ocyh1YS0+cHJvdG8pID09IEVUSF9QX0lQKSB7Ci0JCWlmIChpcHY0X2lzX211bHRpY2FzdCh1YS0+aXB2NC5zX2FkZHIpKQotCQkJYWRkci0+YnJvYWRjYXN0ID0gMTsKLQl9IGVsc2UgaWYgKG50b2hzKHVhLT5wcm90bykgPT0gRVRIX1BfSVBWNikgewotCQlpZiAoaXB2Nl9hZGRyX3R5cGUoJnVhLT5pcHY2KSAmIElQVjZfQUREUl9NVUxUSUNBU1QpCi0JCQlhZGRyLT5icm9hZGNhc3QgPSAxOwotCX0gZWxzZSB7Ci0JCXByX2VycigiSW52YWxpZCBVRFAgbWVkaWEgYWRkcmVzc1xuIik7Ci0JfQorCisJaWYgKHRpcGNfdWRwX2lzX21jYXN0X2FkZHIodWEpKQorCQlhZGRyLT5icm9hZGNhc3QgPSAxOwogfQogCiAvKiB0aXBjX3VkcF9hZGRyMnN0ciAtIGNvbnZlcnQgaXAvdWRwIGFkZHJlc3MgdG8gc3RyaW5nICovCkBAIC0xNDAsMjggKzE1NCwxMyBAQAogfQogCiAvKiB0aXBjX3NlbmRfbXNnIC0gZW5xdWV1ZSBhIHNlbmQgcmVxdWVzdCAqLwotc3RhdGljIGludCB0aXBjX3VkcF9zZW5kX21zZyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgIHN0cnVjdCB0aXBjX2JlYXJlciAqYiwKLQkJCSAgICAgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqZGVzdCkKK3N0YXRpYyBpbnQgdGlwY191ZHBfeG1pdChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgc3RydWN0IHVkcF9iZWFyZXIgKnViLCBzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKnNyYywKKwkJCSBzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKmRzdCkKIHsKIAlpbnQgdHRsLCBlcnIgPSAwOwotCXN0cnVjdCB1ZHBfYmVhcmVyICp1YjsKLQlzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKmRzdCA9IChzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKikmZGVzdC0+dmFsdWU7Ci0Jc3RydWN0IHVkcF9tZWRpYV9hZGRyICpzcmMgPSAoc3RydWN0IHVkcF9tZWRpYV9hZGRyICopJmItPmFkZHIudmFsdWU7CiAJc3RydWN0IHJ0YWJsZSAqcnQ7CiAKLQlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCBVRFBfTUlOX0hFQURST09NKSB7Ci0JCWVyciA9IHBza2JfZXhwYW5kX2hlYWQoc2tiLCBVRFBfTUlOX0hFQURST09NLCAwLCBHRlBfQVRPTUlDKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gdHhfZXJyb3I7Ci0JfQotCi0Jc2tiX3NldF9pbm5lcl9wcm90b2NvbChza2IsIGh0b25zKEVUSF9QX1RJUEMpKTsKLQl1YiA9IHJjdV9kZXJlZmVyZW5jZV9ydG5sKGItPm1lZGlhX3B0cik7Ci0JaWYgKCF1YikgewotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIHR4X2Vycm9yOwotCX0KIAlpZiAoZHN0LT5wcm90byA9PSBodG9ucyhFVEhfUF9JUCkpIHsKIAkJc3RydWN0IGZsb3dpNCBmbCA9IHsKIAkJCS5kYWRkciA9IGRzdC0+aXB2NC5zX2FkZHIsCkBAIC0yMDcsMjkgKzIwNiwxNzggQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IHRpcGNfdWRwX3NlbmRfbXNnKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgc3RydWN0IHRpcGNfYmVhcmVyICpiLAorCQkJICAgICBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphZGRyKQoreworCXN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqc3JjID0gKHN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqKSZiLT5hZGRyLnZhbHVlOworCXN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqZHN0ID0gKHN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqKSZhZGRyLT52YWx1ZTsKKwlzdHJ1Y3QgdWRwX3JlcGxpY2FzdCAqcmNhc3Q7CisJc3RydWN0IHVkcF9iZWFyZXIgKnViOworCWludCBlcnIgPSAwOworCisJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgVURQX01JTl9IRUFEUk9PTSkgeworCQllcnIgPSBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgVURQX01JTl9IRUFEUk9PTSwgMCwgR0ZQX0FUT01JQyk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwl9CisKKwlza2Jfc2V0X2lubmVyX3Byb3RvY29sKHNrYiwgaHRvbnMoRVRIX1BfVElQQykpOworCXViID0gcmN1X2RlcmVmZXJlbmNlX3J0bmwoYi0+bWVkaWFfcHRyKTsKKwlpZiAoIXViKSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghYWRkci0+YnJvYWRjYXN0IHx8IGxpc3RfZW1wdHkoJnViLT5yY2FzdC5saXN0KSkKKwkJcmV0dXJuIHRpcGNfdWRwX3htaXQobmV0LCBza2IsIHViLCBzcmMsIGRzdCk7CisKKwkvKiBSZXBsaWNhc3QsIHNlbmQgYW4gc2tiIHRvIGVhY2ggY29uZmlndXJlZCBJUCBhZGRyZXNzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocmNhc3QsICZ1Yi0+cmNhc3QubGlzdCwgbGlzdCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqX3NrYjsKKworCQlfc2tiID0gcHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7CisJCWlmICghX3NrYikgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZXJyID0gdGlwY191ZHBfeG1pdChuZXQsIF9za2IsIHViLCBzcmMsICZyY2FzdC0+YWRkcik7CisJCWlmIChlcnIpIHsKKwkJCWtmcmVlX3NrYihfc2tiKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWVyciA9IDA7CitvdXQ6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJvb2wgdGlwY191ZHBfaXNfa25vd25fcGVlcihzdHJ1Y3QgdGlwY19iZWFyZXIgKmIsCisJCQkJICAgc3RydWN0IHVkcF9tZWRpYV9hZGRyICphZGRyKQoreworCXN0cnVjdCB1ZHBfcmVwbGljYXN0ICpyY2FzdCwgKnRtcDsKKwlzdHJ1Y3QgdWRwX2JlYXJlciAqdWI7CisKKwl1YiA9IHJjdV9kZXJlZmVyZW5jZV9ydG5sKGItPm1lZGlhX3B0cik7CisJaWYgKCF1YikgeworCQlwcl9lcnJfcmF0ZWxpbWl0ZWQoIlVEUCBiZWFyZXIgaW5zdGFuY2Ugbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyY2FzdCwgdG1wLCAmdWItPnJjYXN0Lmxpc3QsIGxpc3QpIHsKKwkJaWYgKCFtZW1jbXAoJnJjYXN0LT5hZGRyLCBhZGRyLCBzaXplb2Yoc3RydWN0IHVkcF9tZWRpYV9hZGRyKSkpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgdGlwY191ZHBfcmNhc3RfYWRkKHN0cnVjdCB0aXBjX2JlYXJlciAqYiwKKwkJCSAgICAgIHN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqYWRkcikKK3sKKwlzdHJ1Y3QgdWRwX3JlcGxpY2FzdCAqcmNhc3Q7CisJc3RydWN0IHVkcF9iZWFyZXIgKnViOworCisJdWIgPSByY3VfZGVyZWZlcmVuY2VfcnRubChiLT5tZWRpYV9wdHIpOworCWlmICghdWIpCisJCXJldHVybiAtRU5PREVWOworCisJcmNhc3QgPSBrbWFsbG9jKHNpemVvZigqcmNhc3QpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXJjYXN0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbWNweSgmcmNhc3QtPmFkZHIsIGFkZHIsIHNpemVvZihzdHJ1Y3QgdWRwX21lZGlhX2FkZHIpKTsKKworCWlmIChudG9ocyhhZGRyLT5wcm90bykgPT0gRVRIX1BfSVApCisJCXByX2luZm8oIk5ldyByZXBsaWNhc3QgcGVlcjogJXBJNFxuIiwgJnJjYXN0LT5hZGRyLmlwdjQpOworI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCisJZWxzZSBpZiAobnRvaHMoYWRkci0+cHJvdG8pID09IEVUSF9QX0lQVjYpCisJCXByX2luZm8oIk5ldyByZXBsaWNhc3QgcGVlcjogJXBJNlxuIiwgJnJjYXN0LT5hZGRyLmlwdjYpOworI2VuZGlmCisKKwlsaXN0X2FkZF9yY3UoJnJjYXN0LT5saXN0LCAmdWItPnJjYXN0Lmxpc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRpcGNfdWRwX3JjYXN0X2Rpc2Moc3RydWN0IHRpcGNfYmVhcmVyICpiLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCB1ZHBfbWVkaWFfYWRkciBzcmMgPSB7MH07CisJc3RydWN0IHVkcF9tZWRpYV9hZGRyICpkc3Q7CisKKwlkc3QgPSAoc3RydWN0IHVkcF9tZWRpYV9hZGRyICopJmItPmJjYXN0X2FkZHIudmFsdWU7CisJaWYgKHRpcGNfdWRwX2lzX21jYXN0X2FkZHIoZHN0KSkKKwkJcmV0dXJuIDA7CisKKwlzcmMucG9ydCA9IHVkcF9oZHIoc2tiKS0+c291cmNlOworCisJaWYgKGlwX2hkcihza2IpLT52ZXJzaW9uID09IDQpIHsKKwkJc3RydWN0IGlwaGRyICppcGhkciA9IGlwX2hkcihza2IpOworCisJCXNyYy5wcm90byA9IGh0b25zKEVUSF9QX0lQKTsKKwkJc3JjLmlwdjQuc19hZGRyID0gaXBoZHItPnNhZGRyOworCQlpZiAoaXB2NF9pc19tdWx0aWNhc3QoaXBoZHItPmRhZGRyKSkKKwkJCXJldHVybiAwOworI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCisJfSBlbHNlIGlmIChpcF9oZHIoc2tiKS0+dmVyc2lvbiA9PSA2KSB7CisJCXN0cnVjdCBpcHY2aGRyICppcGhkciA9IGlwdjZfaGRyKHNrYik7CisKKwkJc3JjLnByb3RvID0gaHRvbnMoRVRIX1BfSVBWNik7CisJCXNyYy5pcHY2ID0gaXBoZHItPnNhZGRyOworCQlpZiAoaXB2Nl9hZGRyX2lzX211bHRpY2FzdCgmaXBoZHItPmRhZGRyKSkKKwkJCXJldHVybiAwOworI2VuZGlmCisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGxpa2VseSh0aXBjX3VkcF9pc19rbm93bl9wZWVyKGIsICZzcmMpKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gdGlwY191ZHBfcmNhc3RfYWRkKGIsICZzcmMpOworfQorCiAvKiB0aXBjX3VkcF9yZWN2IC0gcmVhZCBkYXRhIGZyb20gYmVhcmVyIHNvY2tldCAqLwogc3RhdGljIGludCB0aXBjX3VkcF9yZWN2KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgdWRwX2JlYXJlciAqdWI7CiAJc3RydWN0IHRpcGNfYmVhcmVyICpiOworCXN0cnVjdCB0aXBjX21zZyAqaGRyOworCWludCBlcnI7CiAKIAl1YiA9IHJjdV9kZXJlZmVyZW5jZV9za191c2VyX2RhdGEoc2spOwogCWlmICghdWIpIHsKIAkJcHJfZXJyX3JhdGVsaW1pdGVkKCJGYWlsZWQgdG8gZ2V0IFVEUCBiZWFyZXIgcmVmZXJlbmNlIik7Ci0JCWtmcmVlX3NrYihza2IpOwotCQlyZXR1cm4gMDsKKwkJZ290byBvdXQ7CiAJfQotCiAJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHVkcGhkcikpOworCWhkciA9IGJ1Zl9tc2coc2tiKTsKKwogCXJjdV9yZWFkX2xvY2soKTsKIAliID0gcmN1X2RlcmVmZXJlbmNlX3J0bmwodWItPmJlYXJlcik7CisJaWYgKCFiKQorCQlnb3RvIHJjdV9vdXQ7CiAKLQlpZiAoYikgeworCWlmIChiICYmIHRlc3RfYml0KDAsICZiLT51cCkpIHsKIAkJdGlwY19yY3Yoc29ja19uZXQoc2spLCBza2IsIGIpOwogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuIDA7CiAJfQorCisJaWYgKHVubGlrZWx5KG1zZ191c2VyKGhkcikgPT0gTElOS19DT05GSUcpKSB7CisJCWVyciA9IHRpcGNfdWRwX3JjYXN0X2Rpc2MoYiwgc2tiKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gcmN1X291dDsKKwl9CisKKwl0aXBjX3Jjdihzb2NrX25ldChzayksIHNrYiwgYik7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIDA7CisKK3JjdV9vdXQ6CisJcmN1X3JlYWRfdW5sb2NrKCk7CitvdXQ6CiAJa2ZyZWVfc2tiKHNrYik7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNDEsMTUgKzM4OSwxMSBAQAogCXN0cnVjdCBzb2NrICpzayA9IHViLT51YnNvY2stPnNrOwogCiAJaWYgKG50b2hzKHJlbW90ZS0+cHJvdG8pID09IEVUSF9QX0lQKSB7Ci0JCWlmICghaXB2NF9pc19tdWx0aWNhc3QocmVtb3RlLT5pcHY0LnNfYWRkcikpCi0JCQlyZXR1cm4gMDsKIAkJbXJlcW4uaW1yX211bHRpYWRkciA9IHJlbW90ZS0+aXB2NDsKIAkJbXJlcW4uaW1yX2lmaW5kZXggPSB1Yi0+aWZpbmRleDsKIAkJZXJyID0gaXBfbWNfam9pbl9ncm91cChzaywgJm1yZXFuKTsKICNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCX0gZWxzZSB7Ci0JCWlmICghaXB2Nl9hZGRyX2lzX211bHRpY2FzdCgmcmVtb3RlLT5pcHY2KSkKLQkJCXJldHVybiAwOwogCQllcnIgPSBpcHY2X3N0dWItPmlwdjZfc29ja19tY19qb2luKHNrLCB1Yi0+aWZpbmRleCwKIAkJCQkJCSAgICZyZW1vdGUtPmlwdjYpOwogI2VuZGlmCkBAIC0yNTcsNzUgKzQwMSwyMzQgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0vKioKLSAqIHBhcnNlX29wdGlvbnMgLSBidWlsZCBsb2NhbC9yZW1vdGUgYWRkcmVzc2VzIGZyb20gY29uZmlndXJhdGlvbgotICogQGF0dHJzOgluZXRsaW5rIGNvbmZpZyBkYXRhCi0gKiBAdWI6CQlVRFAgYmVhcmVyIGluc3RhbmNlCi0gKiBAbG9jYWw6CWxvY2FsIGJlYXJlciBJUCBhZGRyZXNzL3BvcnQKLSAqIEByZW1vdGU6CXBlZXIgb3IgbXVsdGljYXN0IElQL3BvcnQKLSAqLwotc3RhdGljIGludCBwYXJzZV9vcHRpb25zKHN0cnVjdCBubGF0dHIgKmF0dHJzW10sIHN0cnVjdCB1ZHBfYmVhcmVyICp1YiwKLQkJCSBzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKmxvY2FsLAotCQkJIHN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqcmVtb3RlKQorc3RhdGljIGludCBfX3RpcGNfbmxfYWRkX3VkcF9hZGRyKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICBzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKmFkZHIsIGludCBubGFfdCkKIHsKLQlzdHJ1Y3QgbmxhdHRyICpvcHRzW1RJUENfTkxBX1VEUF9NQVggKyAxXTsKLQlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzYV9sb2NhbCwgc2FfcmVtb3RlOworCWlmIChudG9ocyhhZGRyLT5wcm90bykgPT0gRVRIX1BfSVApIHsKKwkJc3RydWN0IHNvY2thZGRyX2luIGlwNDsKIAotCWlmICghYXR0cnNbVElQQ19OTEFfQkVBUkVSX1VEUF9PUFRTXSkKLQkJZ290byBlcnI7Ci0JaWYgKG5sYV9wYXJzZV9uZXN0ZWQob3B0cywgVElQQ19OTEFfVURQX01BWCwKLQkJCSAgICAgYXR0cnNbVElQQ19OTEFfQkVBUkVSX1VEUF9PUFRTXSwKLQkJCSAgICAgdGlwY19ubF91ZHBfcG9saWN5KSkKLQkJZ290byBlcnI7Ci0JaWYgKG9wdHNbVElQQ19OTEFfVURQX0xPQ0FMXSAmJiBvcHRzW1RJUENfTkxBX1VEUF9SRU1PVEVdKSB7Ci0JCW5sYV9tZW1jcHkoJnNhX2xvY2FsLCBvcHRzW1RJUENfTkxBX1VEUF9MT0NBTF0sCi0JCQkgICBzaXplb2Yoc2FfbG9jYWwpKTsKLQkJbmxhX21lbWNweSgmc2FfcmVtb3RlLCBvcHRzW1RJUENfTkxBX1VEUF9SRU1PVEVdLAotCQkJICAgc2l6ZW9mKHNhX3JlbW90ZSkpOworCQlpcDQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCWlwNC5zaW5fcG9ydCA9IGFkZHItPnBvcnQ7CisJCWlwNC5zaW5fYWRkci5zX2FkZHIgPSBhZGRyLT5pcHY0LnNfYWRkcjsKKwkJaWYgKG5sYV9wdXQoc2tiLCBubGFfdCwgc2l6ZW9mKGlwNCksICZpcDQpKQorCQkJcmV0dXJuIC1FTVNHU0laRTsKKworI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCisJfSBlbHNlIGlmIChudG9ocyhhZGRyLT5wcm90bykgPT0gRVRIX1BfSVBWNikgeworCQlzdHJ1Y3Qgc29ja2FkZHJfaW42IGlwNjsKKworCQlpcDYuc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKwkJaXA2LnNpbjZfcG9ydCAgPSBhZGRyLT5wb3J0OworCQltZW1jcHkoJmlwNi5zaW42X2FkZHIsICZhZGRyLT5pcHY2LCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisJCWlmIChubGFfcHV0KHNrYiwgbmxhX3QsIHNpemVvZihpcDYpLCAmaXA2KSkKKwkJCXJldHVybiAtRU1TR1NJWkU7CisjZW5kaWYKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHRpcGNfdWRwX25sX2R1bXBfcmVtb3RlaXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCXUzMiBiaWQgPSBjYi0+YXJnc1swXTsKKwl1MzIgc2tpcF9jbnQgPSBjYi0+YXJnc1sxXTsKKwl1MzIgcG9ydGlkID0gTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQ7CisJc3RydWN0IHVkcF9yZXBsaWNhc3QgKnJjYXN0LCAqdG1wOworCXN0cnVjdCB0aXBjX2JlYXJlciAqYjsKKwlzdHJ1Y3QgdWRwX2JlYXJlciAqdWI7CisJdm9pZCAqaGRyOworCWludCBlcnI7CisJaW50IGk7CisKKwlpZiAoIWJpZCAmJiAhc2tpcF9jbnQpIHsKKwkJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2tiLT5zayk7CisJCXN0cnVjdCBubGF0dHIgKmJhdHRyc1tUSVBDX05MQV9CRUFSRVJfTUFYICsgMV07CisJCXN0cnVjdCBubGF0dHIgKiphdHRyczsKKwkJY2hhciAqYm5hbWU7CisKKwkJZXJyID0gdGlwY19ubG1zZ19wYXJzZShjYi0+bmxoLCAmYXR0cnMpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQlpZiAoIWF0dHJzW1RJUENfTkxBX0JFQVJFUl0pCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQllcnIgPSBubGFfcGFyc2VfbmVzdGVkKGJhdHRycywgVElQQ19OTEFfQkVBUkVSX01BWCwKKwkJCQkgICAgICAgYXR0cnNbVElQQ19OTEFfQkVBUkVSXSwKKwkJCQkgICAgICAgdGlwY19ubF9iZWFyZXJfcG9saWN5KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJaWYgKCFiYXR0cnNbVElQQ19OTEFfQkVBUkVSX05BTUVdKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJYm5hbWUgPSBubGFfZGF0YShiYXR0cnNbVElQQ19OTEFfQkVBUkVSX05BTUVdKTsKKworCQlydG5sX2xvY2soKTsKKwkJYiA9IHRpcGNfYmVhcmVyX2ZpbmQobmV0LCBibmFtZSk7CisJCWlmICghYikgeworCQkJcnRubF91bmxvY2soKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJpZCA9IGItPmlkZW50aXR5OwogCX0gZWxzZSB7Ci1lcnI6Ci0JCXByX2VycigiSW52YWxpZCBVRFAgYmVhcmVyIGNvbmZpZ3VyYXRpb24iKTsKKwkJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2tiLT5zayk7CisJCXN0cnVjdCB0aXBjX25ldCAqdG4gPSBuZXRfZ2VuZXJpYyhuZXQsIHRpcGNfbmV0X2lkKTsKKworCQlydG5sX2xvY2soKTsKKwkJYiA9IHJ0bmxfZGVyZWZlcmVuY2UodG4tPmJlYXJlcl9saXN0W2JpZF0pOworCQlpZiAoIWIpIHsKKwkJCXJ0bmxfdW5sb2NrKCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCXViID0gcmN1X2RlcmVmZXJlbmNlX3J0bmwoYi0+bWVkaWFfcHRyKTsKKwlpZiAoIXViKSB7CisJCXJ0bmxfdW5sb2NrKCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoKHNhX2xvY2FsLnNzX2ZhbWlseSAmIHNhX3JlbW90ZS5zc19mYW1pbHkpID09IEFGX0lORVQpIHsKLQkJc3RydWN0IHNvY2thZGRyX2luICppcDQ7CiAKLQkJaXA0ID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZzYV9sb2NhbDsKLQkJbG9jYWwtPnByb3RvID0gaHRvbnMoRVRIX1BfSVApOwotCQlsb2NhbC0+cG9ydCA9IGlwNC0+c2luX3BvcnQ7Ci0JCWxvY2FsLT5pcHY0LnNfYWRkciA9IGlwNC0+c2luX2FkZHIuc19hZGRyOworCWkgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyY2FzdCwgdG1wLCAmdWItPnJjYXN0Lmxpc3QsIGxpc3QpIHsKKwkJaWYgKGkgPCBza2lwX2NudCkKKwkJCWdvdG8gY291bnQ7CiAKLQkJaXA0ID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZzYV9yZW1vdGU7Ci0JCXJlbW90ZS0+cHJvdG8gPSBodG9ucyhFVEhfUF9JUCk7Ci0JCXJlbW90ZS0+cG9ydCA9IGlwNC0+c2luX3BvcnQ7Ci0JCXJlbW90ZS0+aXB2NC5zX2FkZHIgPSBpcDQtPnNpbl9hZGRyLnNfYWRkcjsKKwkJaGRyID0gZ2VubG1zZ19wdXQoc2tiLCBwb3J0aWQsIGNiLT5ubGgtPm5sbXNnX3NlcSwKKwkJCQkgICZ0aXBjX2dlbmxfZmFtaWx5LCBOTE1fRl9NVUxUSSwKKwkJCQkgIFRJUENfTkxfQkVBUkVSX0dFVCk7CisJCWlmICghaGRyKQorCQkJZ290byBkb25lOworCisJCWVyciA9IF9fdGlwY19ubF9hZGRfdWRwX2FkZHIoc2tiLCAmcmNhc3QtPmFkZHIsCisJCQkJCSAgICAgVElQQ19OTEFfVURQX1JFTU9URSk7CisJCWlmIChlcnIpIHsKKwkJCWdlbmxtc2dfY2FuY2VsKHNrYiwgaGRyKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlnZW5sbXNnX2VuZChza2IsIGhkcik7Citjb3VudDoKKwkJaSsrOworCX0KK2RvbmU6CisJcnRubF91bmxvY2soKTsKKwljYi0+YXJnc1swXSA9IGJpZDsKKwljYi0+YXJnc1sxXSA9IGk7CisKKwlyZXR1cm4gc2tiLT5sZW47Cit9CisKK2ludCB0aXBjX3VkcF9ubF9hZGRfYmVhcmVyX2RhdGEoc3RydWN0IHRpcGNfbmxfbXNnICptc2csIHN0cnVjdCB0aXBjX2JlYXJlciAqYikKK3sKKwlzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKnNyYyA9IChzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKikmYi0+YWRkci52YWx1ZTsKKwlzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKmRzdDsKKwlzdHJ1Y3QgdWRwX2JlYXJlciAqdWI7CisJc3RydWN0IG5sYXR0ciAqbmVzdDsKKworCXViID0gcmN1X2RlcmVmZXJlbmNlX3J0bmwoYi0+bWVkaWFfcHRyKTsKKwlpZiAoIXViKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW5lc3QgPSBubGFfbmVzdF9zdGFydChtc2ctPnNrYiwgVElQQ19OTEFfQkVBUkVSX1VEUF9PUFRTKTsKKwlpZiAoIW5lc3QpCisJCWdvdG8gbXNnX2Z1bGw7CisKKwlpZiAoX190aXBjX25sX2FkZF91ZHBfYWRkcihtc2ctPnNrYiwgc3JjLCBUSVBDX05MQV9VRFBfTE9DQUwpKQorCQlnb3RvIG1zZ19mdWxsOworCisJZHN0ID0gKHN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqKSZiLT5iY2FzdF9hZGRyLnZhbHVlOworCWlmIChfX3RpcGNfbmxfYWRkX3VkcF9hZGRyKG1zZy0+c2tiLCBkc3QsIFRJUENfTkxBX1VEUF9SRU1PVEUpKQorCQlnb3RvIG1zZ19mdWxsOworCisJaWYgKCFsaXN0X2VtcHR5KCZ1Yi0+cmNhc3QubGlzdCkpIHsKKwkJaWYgKG5sYV9wdXRfZmxhZyhtc2ctPnNrYiwgVElQQ19OTEFfVURQX01VTFRJX1JFTU9URUlQKSkKKwkJCWdvdG8gbXNnX2Z1bGw7CisJfQorCisJbmxhX25lc3RfZW5kKG1zZy0+c2tiLCBuZXN0KTsKKwlyZXR1cm4gMDsKK21zZ19mdWxsOgorCW5sYV9uZXN0X2NhbmNlbChtc2ctPnNrYiwgbmVzdCk7CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKworLyoqCisgKiB0aXBjX3BhcnNlX3VkcF9hZGRyIC0gYnVpbGQgdWRwIG1lZGlhIGFkZHJlc3MgZnJvbSBuZXRsaW5rIGRhdGEKKyAqIEBubGF0dHI6CW5ldGxpbmsgYXR0cmlidXRlIGNvbnRhaW5pbmcgc29ja2FkZHIgc3RvcmFnZSBhbGlnbmVkIGFkZHJlc3MKKyAqIEBhZGRyOgl0aXBjIG1lZGlhIGFkZHJlc3MgdG8gZmlsbCB3aXRoIGFkZHJlc3MsIHBvcnQgYW5kIHByb3RvY29sIHR5cGUKKyAqIEBzY29wZV9pZDoJSVB2NiBzY29wZSBpZCBwb2ludGVyLCBub3QgTlVMTCBpbmRpY2F0ZXMgaXQncyByZXF1aXJlZAorICovCisKK3N0YXRpYyBpbnQgdGlwY19wYXJzZV91ZHBfYWRkcihzdHJ1Y3QgbmxhdHRyICpubGEsIHN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqYWRkciwKKwkJCSAgICAgICB1MzIgKnNjb3BlX2lkKQoreworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNhOworCisJbmxhX21lbWNweSgmc2EsIG5sYSwgc2l6ZW9mKHNhKSk7CisJaWYgKHNhLnNzX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiAqaXA0ID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZzYTsKKworCQlhZGRyLT5wcm90byA9IGh0b25zKEVUSF9QX0lQKTsKKwkJYWRkci0+cG9ydCA9IGlwNC0+c2luX3BvcnQ7CisJCWFkZHItPmlwdjQuc19hZGRyID0gaXA0LT5zaW5fYWRkci5zX2FkZHI7CiAJCXJldHVybiAwOwogCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKLQl9IGVsc2UgaWYgKChzYV9sb2NhbC5zc19mYW1pbHkgJiBzYV9yZW1vdGUuc3NfZmFtaWx5KSA9PSBBRl9JTkVUNikgewotCQlpbnQgYXR5cGU7Ci0JCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmlwNjsKKwl9IGVsc2UgaWYgKHNhLnNzX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICppcDYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSZzYTsKIAotCQlpcDYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSZzYV9sb2NhbDsKLQkJYXR5cGUgPSBpcHY2X2FkZHJfdHlwZSgmaXA2LT5zaW42X2FkZHIpOwotCQlpZiAoX19pcHY2X2FkZHJfbmVlZHNfc2NvcGVfaWQoYXR5cGUpICYmICFpcDYtPnNpbjZfc2NvcGVfaWQpCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJYWRkci0+cHJvdG8gPSBodG9ucyhFVEhfUF9JUFY2KTsKKwkJYWRkci0+cG9ydCA9IGlwNi0+c2luNl9wb3J0OworCQltZW1jcHkoJmFkZHItPmlwdjYsICZpcDYtPnNpbjZfYWRkciwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOwogCi0JCWxvY2FsLT5wcm90byA9IGh0b25zKEVUSF9QX0lQVjYpOwotCQlsb2NhbC0+cG9ydCA9IGlwNi0+c2luNl9wb3J0OwotCQltZW1jcHkoJmxvY2FsLT5pcHY2LCAmaXA2LT5zaW42X2FkZHIsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKLQkJdWItPmlmaW5kZXggPSBpcDYtPnNpbjZfc2NvcGVfaWQ7CisJCS8qIFNjb3BlIElEIGlzIG9ubHkgaW50ZXJlc3RpbmcgZm9yIGxvY2FsIGFkZHJlc3NlcyAqLworCQlpZiAoc2NvcGVfaWQpIHsKKwkJCWludCBhdHlwZTsKIAotCQlpcDYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSZzYV9yZW1vdGU7Ci0JCXJlbW90ZS0+cHJvdG8gPSBodG9ucyhFVEhfUF9JUFY2KTsKLQkJcmVtb3RlLT5wb3J0ID0gaXA2LT5zaW42X3BvcnQ7Ci0JCW1lbWNweSgmcmVtb3RlLT5pcHY2LCAmaXA2LT5zaW42X2FkZHIsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJCWF0eXBlID0gaXB2Nl9hZGRyX3R5cGUoJmlwNi0+c2luNl9hZGRyKTsKKwkJCWlmIChfX2lwdjZfYWRkcl9uZWVkc19zY29wZV9pZChhdHlwZSkgJiYKKwkJCSAgICAhaXA2LT5zaW42X3Njb3BlX2lkKSB7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCSpzY29wZV9pZCA9IGlwNi0+c2luNl9zY29wZV9pZCA/IDogMDsKKwkJfQorCiAJCXJldHVybiAwOwogI2VuZGlmCiAJfQogCXJldHVybiAtRUFERFJOT1RBVkFJTDsKIH0KIAoraW50IHRpcGNfdWRwX25sX2JlYXJlcl9hZGQoc3RydWN0IHRpcGNfYmVhcmVyICpiLCBzdHJ1Y3QgbmxhdHRyICphdHRyKQoreworCWludCBlcnI7CisJc3RydWN0IHVkcF9tZWRpYV9hZGRyIGFkZHIgPSB7MH07CisJc3RydWN0IG5sYXR0ciAqb3B0c1tUSVBDX05MQV9VRFBfTUFYICsgMV07CisJc3RydWN0IHVkcF9tZWRpYV9hZGRyICpkc3Q7CisKKwlpZiAobmxhX3BhcnNlX25lc3RlZChvcHRzLCBUSVBDX05MQV9VRFBfTUFYLCBhdHRyLCB0aXBjX25sX3VkcF9wb2xpY3kpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghb3B0c1tUSVBDX05MQV9VRFBfUkVNT1RFXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSB0aXBjX3BhcnNlX3VkcF9hZGRyKG9wdHNbVElQQ19OTEFfVURQX1JFTU9URV0sICZhZGRyLCBOVUxMKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZHN0ID0gKHN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqKSZiLT5iY2FzdF9hZGRyLnZhbHVlOworCWlmICh0aXBjX3VkcF9pc19tY2FzdF9hZGRyKGRzdCkpIHsKKwkJcHJfZXJyKCJDYW4ndCBhZGQgcmVtb3RlIGlwIHRvIFRJUEMgVURQIG11bHRpY2FzdCBiZWFyZXJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodGlwY191ZHBfaXNfa25vd25fcGVlcihiLCAmYWRkcikpCisJCXJldHVybiAwOworCisJcmV0dXJuIHRpcGNfdWRwX3JjYXN0X2FkZChiLCAmYWRkcik7Cit9CisKIC8qKgogICogdGlwY191ZHBfZW5hYmxlIC0gY2FsbGJhY2sgdG8gY3JlYXRlIGEgbmV3IHVkcCBiZWFyZXIgaW5zdGFuY2UKICAqIEBuZXQ6CW5ldHdvcmsgbmFtZXNwYWNlCkBAIC0zNDAsMTggKzY0MywzOCBAQAogewogCWludCBlcnIgPSAtRUlOVkFMOwogCXN0cnVjdCB1ZHBfYmVhcmVyICp1YjsKLQlzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKnJlbW90ZTsKKwlzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgcmVtb3RlID0gezB9OwogCXN0cnVjdCB1ZHBfbWVkaWFfYWRkciBsb2NhbCA9IHswfTsKIAlzdHJ1Y3QgdWRwX3BvcnRfY2ZnIHVkcF9jb25mID0gezB9OwogCXN0cnVjdCB1ZHBfdHVubmVsX3NvY2tfY2ZnIHR1bmNmZyA9IHtOVUxMfTsKKwlzdHJ1Y3QgbmxhdHRyICpvcHRzW1RJUENfTkxBX1VEUF9NQVggKyAxXTsKIAogCXViID0ga3phbGxvYyhzaXplb2YoKnViKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCF1YikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlyZW1vdGUgPSAoc3RydWN0IHVkcF9tZWRpYV9hZGRyICopJmItPmJjYXN0X2FkZHIudmFsdWU7Ci0JbWVtc2V0KHJlbW90ZSwgMCwgc2l6ZW9mKHN0cnVjdCB1ZHBfbWVkaWFfYWRkcikpOwotCWVyciA9IHBhcnNlX29wdGlvbnMoYXR0cnMsIHViLCAmbG9jYWwsIHJlbW90ZSk7CisJSU5JVF9MSVNUX0hFQUQoJnViLT5yY2FzdC5saXN0KTsKKworCWlmICghYXR0cnNbVElQQ19OTEFfQkVBUkVSX1VEUF9PUFRTXSkKKwkJZ290byBlcnI7CisKKwlpZiAobmxhX3BhcnNlX25lc3RlZChvcHRzLCBUSVBDX05MQV9VRFBfTUFYLAorCQkJICAgICBhdHRyc1tUSVBDX05MQV9CRUFSRVJfVURQX09QVFNdLAorCQkJICAgICB0aXBjX25sX3VkcF9wb2xpY3kpKQorCQlnb3RvIGVycjsKKworCWlmICghb3B0c1tUSVBDX05MQV9VRFBfTE9DQUxdIHx8ICFvcHRzW1RJUENfTkxBX1VEUF9SRU1PVEVdKSB7CisJCXByX2VycigiSW52YWxpZCBVRFAgYmVhcmVyIGNvbmZpZ3VyYXRpb24iKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJZXJyID0gdGlwY19wYXJzZV91ZHBfYWRkcihvcHRzW1RJUENfTkxBX1VEUF9MT0NBTF0sICZsb2NhbCwKKwkJCQkgICZ1Yi0+aWZpbmRleCk7CisJaWYgKGVycikKKwkJZ290byBlcnI7CisKKwllcnIgPSB0aXBjX3BhcnNlX3VkcF9hZGRyKG9wdHNbVElQQ19OTEFfVURQX1JFTU9URV0sICZyZW1vdGUsIE5VTEwpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyOwogCkBAIC0zOTYsMTAgKzcxOSwyMiBAQAogCXR1bmNmZy5lbmNhcF9kZXN0cm95ID0gTlVMTDsKIAlzZXR1cF91ZHBfdHVubmVsX3NvY2sobmV0LCB1Yi0+dWJzb2NrLCAmdHVuY2ZnKTsKIAotCWlmIChlbmFibGVfbWNhc3QodWIsIHJlbW90ZSkpCisJLyoqCisJICogVGhlIGJjYXN0IG1lZGlhIGFkZHJlc3MgcG9ydCBpcyB1c2VkIGZvciBhbGwgcGVlcnMgYW5kIHRoZSBpcAorCSAqIGlzIHVzZWQgaWYgaXQncyBhIG11bHRpY2FzdCBhZGRyZXNzLgorCSAqLworCW1lbWNweSgmYi0+YmNhc3RfYWRkci52YWx1ZSwgJnJlbW90ZSwgc2l6ZW9mKHJlbW90ZSkpOworCWlmICh0aXBjX3VkcF9pc19tY2FzdF9hZGRyKCZyZW1vdGUpKQorCQllcnIgPSBlbmFibGVfbWNhc3QodWIsICZyZW1vdGUpOworCWVsc2UKKwkJZXJyID0gdGlwY191ZHBfcmNhc3RfYWRkKGIsICZyZW1vdGUpOworCWlmIChlcnIpCiAJCWdvdG8gZXJyOworCiAJcmV0dXJuIDA7CiBlcnI6CisJaWYgKHViLT51YnNvY2spCisJCXVkcF90dW5uZWxfc29ja19yZWxlYXNlKHViLT51YnNvY2spOwogCWtmcmVlKHViKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtNDA4LDYgKzc0MywxMiBAQAogc3RhdGljIHZvaWQgY2xlYW51cF9iZWFyZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCB1ZHBfYmVhcmVyICp1YiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdWRwX2JlYXJlciwgd29yayk7CisJc3RydWN0IHVkcF9yZXBsaWNhc3QgKnJjYXN0LCAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJjYXN0LCB0bXAsICZ1Yi0+cmNhc3QubGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbF9yY3UoJnJjYXN0LT5saXN0KTsKKwkJa2ZyZWVfcmN1KHJjYXN0LCByY3UpOworCX0KIAogCWlmICh1Yi0+dWJzb2NrKQogCQl1ZHBfdHVubmVsX3NvY2tfcmVsZWFzZSh1Yi0+dWJzb2NrKTsKZGlmZiAtLWdpdCBhL25ldC90aXBjL3VkcF9tZWRpYS5oIGIvbmV0L3RpcGMvdWRwX21lZGlhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgxYmJhZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC90aXBjL3VkcF9tZWRpYS5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBuZXQvdGlwYy91ZHBfbWVkaWEuaDogSW5jbHVkZSBmaWxlIGZvciBVRFAgYmVhcmVyIG1lZGlhCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTIwMDYsIDIwMTMtMjAxNiwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMC0yMDExLCBXaW5kIFJpdmVyIFN5c3RlbXMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZmRlZiBDT05GSUdfVElQQ19NRURJQV9VRFAKKyNpZm5kZWYgX1RJUENfVURQX01FRElBX0gKKyNkZWZpbmUgX1RJUENfVURQX01FRElBX0gKKworaW50IHRpcGNfdWRwX25sX2JlYXJlcl9hZGQoc3RydWN0IHRpcGNfYmVhcmVyICpiLCBzdHJ1Y3QgbmxhdHRyICphdHRyKTsKK2ludCB0aXBjX3VkcF9ubF9hZGRfYmVhcmVyX2RhdGEoc3RydWN0IHRpcGNfbmxfbXNnICptc2csIHN0cnVjdCB0aXBjX2JlYXJlciAqYik7CitpbnQgdGlwY191ZHBfbmxfZHVtcF9yZW1vdGVpcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOworCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3VuaXgvYWZfdW5peC5jIGIvbmV0L3VuaXgvYWZfdW5peC5jCmluZGV4IGYxZGZmZTguLjgzMDk2ODcgMTAwNjQ0Ci0tLSBhL25ldC91bml4L2FmX3VuaXguYworKysgYi9uZXQvdW5peC9hZl91bml4LmMKQEAgLTY2MSwxMSArNjYxLDExIEBACiB7CiAJc3RydWN0IHVuaXhfc29jayAqdSA9IHVuaXhfc2soc2spOwogCi0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdS0+cmVhZGxvY2spKQorCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnUtPmlvbG9jaykpCiAJCXJldHVybiAtRUlOVFI7CiAKIAlzay0+c2tfcGVla19vZmYgPSB2YWw7Ci0JbXV0ZXhfdW5sb2NrKCZ1LT5yZWFkbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZ1LT5pb2xvY2spOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03NzksNyArNzc5LDggQEAKIAlzcGluX2xvY2tfaW5pdCgmdS0+bG9jayk7CiAJYXRvbWljX2xvbmdfc2V0KCZ1LT5pbmZsaWdodCwgMCk7CiAJSU5JVF9MSVNUX0hFQUQoJnUtPmxpbmspOwotCW11dGV4X2luaXQoJnUtPnJlYWRsb2NrKTsgLyogc2luZ2xlIHRhc2sgcmVhZGluZyBsb2NrICovCisJbXV0ZXhfaW5pdCgmdS0+aW9sb2NrKTsgLyogc2luZ2xlIHRhc2sgcmVhZGluZyBsb2NrICovCisJbXV0ZXhfaW5pdCgmdS0+YmluZGxvY2spOyAvKiBzaW5nbGUgdGFzayBiaW5kaW5nIGxvY2sgKi8KIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ1LT5wZWVyX3dhaXQpOwogCWluaXRfd2FpdHF1ZXVlX2Z1bmNfZW50cnkoJnUtPnBlZXJfd2FrZSwgdW5peF9kZ3JhbV9wZWVyX3dha2VfcmVsYXkpOwogCXVuaXhfaW5zZXJ0X3NvY2tldCh1bml4X3NvY2tldHNfdW5ib3VuZChzayksIHNrKTsKQEAgLTg0OCw3ICs4NDksNyBAQAogCWludCBlcnI7CiAJdW5zaWduZWQgaW50IHJldHJpZXMgPSAwOwogCi0JZXJyID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ1LT5yZWFkbG9jayk7CisJZXJyID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ1LT5iaW5kbG9jayk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtODk1LDcgKzg5Niw3IEBACiAJc3Bpbl91bmxvY2soJnVuaXhfdGFibGVfbG9jayk7CiAJZXJyID0gMDsKIAotb3V0OgltdXRleF91bmxvY2soJnUtPnJlYWRsb2NrKTsKK291dDoJbXV0ZXhfdW5sb2NrKCZ1LT5iaW5kbG9jayk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtOTU0LDIwICs5NTUsMzIgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGludCB1bml4X21rbm9kKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3Qgc3RydWN0IHBhdGggKnBhdGgsIHVtb2RlX3QgbW9kZSwKLQkJICAgICAgc3RydWN0IHBhdGggKnJlcykKK3N0YXRpYyBpbnQgdW5peF9ta25vZChjb25zdCBjaGFyICpzdW5fcGF0aCwgdW1vZGVfdCBtb2RlLCBzdHJ1Y3QgcGF0aCAqcmVzKQogewotCWludCBlcnI7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBwYXRoIHBhdGg7CisJaW50IGVyciA9IDA7CisJLyoKKwkgKiBHZXQgdGhlIHBhcmVudCBkaXJlY3RvcnksIGNhbGN1bGF0ZSB0aGUgaGFzaCBmb3IgbGFzdAorCSAqIGNvbXBvbmVudC4KKwkgKi8KKwlkZW50cnkgPSBrZXJuX3BhdGhfY3JlYXRlKEFUX0ZEQ1dELCBzdW5fcGF0aCwgJnBhdGgsIDApOworCWVyciA9IFBUUl9FUlIoZGVudHJ5KTsKKwlpZiAoSVNfRVJSKGRlbnRyeSkpCisJCXJldHVybiBlcnI7CiAKLQllcnIgPSBzZWN1cml0eV9wYXRoX21rbm9kKHBhdGgsIGRlbnRyeSwgbW9kZSwgMCk7CisJLyoKKwkgKiBBbGwgcmlnaHQsIGxldCdzIGNyZWF0ZSBpdC4KKwkgKi8KKwllcnIgPSBzZWN1cml0eV9wYXRoX21rbm9kKCZwYXRoLCBkZW50cnksIG1vZGUsIDApOwogCWlmICghZXJyKSB7Ci0JCWVyciA9IHZmc19ta25vZChkX2lub2RlKHBhdGgtPmRlbnRyeSksIGRlbnRyeSwgbW9kZSwgMCk7CisJCWVyciA9IHZmc19ta25vZChkX2lub2RlKHBhdGguZGVudHJ5KSwgZGVudHJ5LCBtb2RlLCAwKTsKIAkJaWYgKCFlcnIpIHsKLQkJCXJlcy0+bW50ID0gbW50Z2V0KHBhdGgtPm1udCk7CisJCQlyZXMtPm1udCA9IG1udGdldChwYXRoLm1udCk7CiAJCQlyZXMtPmRlbnRyeSA9IGRnZXQoZGVudHJ5KTsKIAkJfQogCX0KLQorCWRvbmVfcGF0aF9jcmVhdGUoJnBhdGgsIGRlbnRyeSk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtOTc4LDEyICs5OTEsMTAgQEAKIAlzdHJ1Y3QgdW5peF9zb2NrICp1ID0gdW5peF9zayhzayk7CiAJc3RydWN0IHNvY2thZGRyX3VuICpzdW5hZGRyID0gKHN0cnVjdCBzb2NrYWRkcl91biAqKXVhZGRyOwogCWNoYXIgKnN1bl9wYXRoID0gc3VuYWRkci0+c3VuX3BhdGg7Ci0JaW50IGVyciwgbmFtZV9lcnI7CisJaW50IGVycjsKIAl1bnNpZ25lZCBpbnQgaGFzaDsKIAlzdHJ1Y3QgdW5peF9hZGRyZXNzICphZGRyOwogCXN0cnVjdCBobGlzdF9oZWFkICpsaXN0OwotCXN0cnVjdCBwYXRoIHBhdGg7Ci0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5OwogCiAJZXJyID0gLUVJTlZBTDsKIAlpZiAoc3VuYWRkci0+c3VuX2ZhbWlseSAhPSBBRl9VTklYKQpAQCAtOTk5LDM0ICsxMDEwLDE0IEBACiAJCWdvdG8gb3V0OwogCWFkZHJfbGVuID0gZXJyOwogCi0JbmFtZV9lcnIgPSAwOwotCWRlbnRyeSA9IE5VTEw7Ci0JaWYgKHN1bl9wYXRoWzBdKSB7Ci0JCS8qIEdldCB0aGUgcGFyZW50IGRpcmVjdG9yeSwgY2FsY3VsYXRlIHRoZSBoYXNoIGZvciBsYXN0Ci0JCSAqIGNvbXBvbmVudC4KLQkJICovCi0JCWRlbnRyeSA9IGtlcm5fcGF0aF9jcmVhdGUoQVRfRkRDV0QsIHN1bl9wYXRoLCAmcGF0aCwgMCk7Ci0KLQkJaWYgKElTX0VSUihkZW50cnkpKSB7Ci0JCQkvKiBkZWxheSByZXBvcnQgdW50aWwgYWZ0ZXIgJ2FscmVhZHkgYm91bmQnIGNoZWNrICovCi0JCQluYW1lX2VyciA9IFBUUl9FUlIoZGVudHJ5KTsKLQkJCWRlbnRyeSA9IE5VTEw7Ci0JCX0KLQl9Ci0KLQllcnIgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnUtPnJlYWRsb2NrKTsKKwllcnIgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnUtPmJpbmRsb2NrKTsKIAlpZiAoZXJyKQotCQlnb3RvIG91dF9wYXRoOworCQlnb3RvIG91dDsKIAogCWVyciA9IC1FSU5WQUw7CiAJaWYgKHUtPmFkZHIpCiAJCWdvdG8gb3V0X3VwOwogCi0JaWYgKG5hbWVfZXJyKSB7Ci0JCWVyciA9IG5hbWVfZXJyID09IC1FRVhJU1QgPyAtRUFERFJJTlVTRSA6IG5hbWVfZXJyOwotCQlnb3RvIG91dF91cDsKLQl9Ci0KIAllcnIgPSAtRU5PTUVNOwogCWFkZHIgPSBrbWFsbG9jKHNpemVvZigqYWRkcikrYWRkcl9sZW4sIEdGUF9LRVJORUwpOwogCWlmICghYWRkcikKQEAgLTEwMzcsMTEgKzEwMjgsMTEgQEAKIAlhZGRyLT5oYXNoID0gaGFzaCBeIHNrLT5za190eXBlOwogCWF0b21pY19zZXQoJmFkZHItPnJlZmNudCwgMSk7CiAKLQlpZiAoZGVudHJ5KSB7Ci0JCXN0cnVjdCBwYXRoIHVfcGF0aDsKKwlpZiAoc3VuX3BhdGhbMF0pIHsKKwkJc3RydWN0IHBhdGggcGF0aDsKIAkJdW1vZGVfdCBtb2RlID0gU19JRlNPQ0sgfAogCQkgICAgICAgKFNPQ0tfSU5PREUoc29jayktPmlfbW9kZSAmIH5jdXJyZW50X3VtYXNrKCkpOwotCQllcnIgPSB1bml4X21rbm9kKGRlbnRyeSwgJnBhdGgsIG1vZGUsICZ1X3BhdGgpOworCQllcnIgPSB1bml4X21rbm9kKHN1bl9wYXRoLCBtb2RlLCAmcGF0aCk7CiAJCWlmIChlcnIpIHsKIAkJCWlmIChlcnIgPT0gLUVFWElTVCkKIAkJCQllcnIgPSAtRUFERFJJTlVTRTsKQEAgLTEwNDksOSArMTA0MCw5IEBACiAJCQlnb3RvIG91dF91cDsKIAkJfQogCQlhZGRyLT5oYXNoID0gVU5JWF9IQVNIX1NJWkU7Ci0JCWhhc2ggPSBkX3JlYWxfaW5vZGUoZGVudHJ5KS0+aV9pbm8gJiAoVU5JWF9IQVNIX1NJWkUgLSAxKTsKKwkJaGFzaCA9IGRfcmVhbF9pbm9kZShwYXRoLmRlbnRyeSktPmlfaW5vICYgKFVOSVhfSEFTSF9TSVpFIC0gMSk7CiAJCXNwaW5fbG9jaygmdW5peF90YWJsZV9sb2NrKTsKLQkJdS0+cGF0aCA9IHVfcGF0aDsKKwkJdS0+cGF0aCA9IHBhdGg7CiAJCWxpc3QgPSAmdW5peF9zb2NrZXRfdGFibGVbaGFzaF07CiAJfSBlbHNlIHsKIAkJc3Bpbl9sb2NrKCZ1bml4X3RhYmxlX2xvY2spOwpAQCAtMTA3MywxMSArMTA2NCw3IEBACiBvdXRfdW5sb2NrOgogCXNwaW5fdW5sb2NrKCZ1bml4X3RhYmxlX2xvY2spOwogb3V0X3VwOgotCW11dGV4X3VubG9jaygmdS0+cmVhZGxvY2spOwotb3V0X3BhdGg6Ci0JaWYgKGRlbnRyeSkKLQkJZG9uZV9wYXRoX2NyZWF0ZSgmcGF0aCwgZGVudHJ5KTsKLQorCW11dGV4X3VubG9jaygmdS0+YmluZGxvY2spOwogb3V0OgogCXJldHVybiBlcnI7CiB9CkBAIC0xOTY5LDE3ICsxOTU2LDE3IEBACiAJaWYgKGZhbHNlKSB7CiBhbGxvY19za2I6CiAJCXVuaXhfc3RhdGVfdW5sb2NrKG90aGVyKTsKLQkJbXV0ZXhfdW5sb2NrKCZ1bml4X3NrKG90aGVyKS0+cmVhZGxvY2spOworCQltdXRleF91bmxvY2soJnVuaXhfc2sob3RoZXIpLT5pb2xvY2spOwogCQluZXdza2IgPSBzb2NrX2FsbG9jX3NlbmRfcHNrYihzaywgMCwgMCwgZmxhZ3MgJiBNU0dfRE9OVFdBSVQsCiAJCQkJCSAgICAgICZlcnIsIDApOwogCQlpZiAoIW5ld3NrYikKIAkJCWdvdG8gZXJyOwogCX0KIAotCS8qIHdlIG11c3QgYWNxdWlyZSByZWFkbG9jayBhcyB3ZSBtb2RpZnkgYWxyZWFkeSBwcmVzZW50CisJLyogd2UgbXVzdCBhY3F1aXJlIGlvbG9jayBhcyB3ZSBtb2RpZnkgYWxyZWFkeSBwcmVzZW50CiAJICogc2ticyBpbiB0aGUgc2tfcmVjZWl2ZV9xdWV1ZSBhbmQgbWVzcyB3aXRoIHNrYi0+bGVuCiAJICovCi0JZXJyID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ1bml4X3NrKG90aGVyKS0+cmVhZGxvY2spOworCWVyciA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdW5peF9zayhvdGhlciktPmlvbG9jayk7CiAJaWYgKGVycikgewogCQllcnIgPSBmbGFncyAmIE1TR19ET05UV0FJVCA/IC1FQUdBSU4gOiAtRVJFU1RBUlRTWVM7CiAJCWdvdG8gZXJyOwpAQCAtMjA0Niw3ICsyMDMzLDcgQEAKIAl9CiAKIAl1bml4X3N0YXRlX3VubG9jayhvdGhlcik7Ci0JbXV0ZXhfdW5sb2NrKCZ1bml4X3NrKG90aGVyKS0+cmVhZGxvY2spOworCW11dGV4X3VubG9jaygmdW5peF9zayhvdGhlciktPmlvbG9jayk7CiAKIAlvdGhlci0+c2tfZGF0YV9yZWFkeShvdGhlcik7CiAJc2NtX2Rlc3Ryb3koJnNjbSk7CkBAIC0yMDU1LDcgKzIwNDIsNyBAQAogZXJyX3N0YXRlX3VubG9jazoKIAl1bml4X3N0YXRlX3VubG9jayhvdGhlcik7CiBlcnJfdW5sb2NrOgotCW11dGV4X3VubG9jaygmdW5peF9zayhvdGhlciktPnJlYWRsb2NrKTsKKwltdXRleF91bmxvY2soJnVuaXhfc2sob3RoZXIpLT5pb2xvY2spOwogZXJyOgogCWtmcmVlX3NrYihuZXdza2IpOwogCWlmIChzZW5kX3NpZ3BpcGUgJiYgIShmbGFncyAmIE1TR19OT1NJR05BTCkpCkBAIC0yMTIzLDcgKzIxMTAsNyBAQAogCXRpbWVvID0gc29ja19yY3Z0aW1lbyhzaywgZmxhZ3MgJiBNU0dfRE9OVFdBSVQpOwogCiAJZG8gewotCQltdXRleF9sb2NrKCZ1LT5yZWFkbG9jayk7CisJCW11dGV4X2xvY2soJnUtPmlvbG9jayk7CiAKIAkJc2tpcCA9IHNrX3BlZWtfb2Zmc2V0KHNrLCBmbGFncyk7CiAJCXNrYiA9IF9fc2tiX3RyeV9yZWN2X2RhdGFncmFtKHNrLCBmbGFncywgJnBlZWtlZCwgJnNraXAsICZlcnIsCkBAIC0yMTMxLDE0ICsyMTE4LDE0IEBACiAJCWlmIChza2IpCiAJCQlicmVhazsKIAotCQltdXRleF91bmxvY2soJnUtPnJlYWRsb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZ1LT5pb2xvY2spOwogCiAJCWlmIChlcnIgIT0gLUVBR0FJTikKIAkJCWJyZWFrOwogCX0gd2hpbGUgKHRpbWVvICYmCiAJCSAhX19za2Jfd2FpdF9mb3JfbW9yZV9wYWNrZXRzKHNrLCAmZXJyLCAmdGltZW8sIGxhc3QpKTsKIAotCWlmICghc2tiKSB7IC8qIGltcGxpZXMgcmVhZGxvY2sgdW5sb2NrZWQgKi8KKwlpZiAoIXNrYikgeyAvKiBpbXBsaWVzIGlvbG9jayB1bmxvY2tlZCAqLwogCQl1bml4X3N0YXRlX2xvY2soc2spOwogCQkvKiBTaWduYWwgRU9GIG9uIGRpc2Nvbm5lY3RlZCBub24tYmxvY2tpbmcgU0VRUEFDS0VUIHNvY2tldC4gKi8KIAkJaWYgKHNrLT5za190eXBlID09IFNPQ0tfU0VRUEFDS0VUICYmIGVyciA9PSAtRUFHQUlOICYmCkBAIC0yMjAzLDcgKzIxOTAsNyBAQAogCiBvdXRfZnJlZToKIAlza2JfZnJlZV9kYXRhZ3JhbShzaywgc2tiKTsKLQltdXRleF91bmxvY2soJnUtPnJlYWRsb2NrKTsKKwltdXRleF91bmxvY2soJnUtPmlvbG9jayk7CiBvdXQ6CiAJcmV0dXJuIGVycjsKIH0KQEAgLTIyOTgsNyArMjI4NSw3IEBACiAJLyogTG9jayB0aGUgc29ja2V0IHRvIHByZXZlbnQgcXVldWUgZGlzb3JkZXJpbmcKIAkgKiB3aGlsZSBzbGVlcHMgaW4gbWVtY3B5X3RvbXNnCiAJICovCi0JbXV0ZXhfbG9jaygmdS0+cmVhZGxvY2spOworCW11dGV4X2xvY2soJnUtPmlvbG9jayk7CiAKIAlpZiAoZmxhZ3MgJiBNU0dfUEVFSykKIAkJc2tpcCA9IHNrX3BlZWtfb2Zmc2V0KHNrLCBmbGFncyk7CkBAIC0yMzQwLDcgKzIzMjcsNyBAQAogCQkJCWJyZWFrOwogCQkJfQogCi0JCQltdXRleF91bmxvY2soJnUtPnJlYWRsb2NrKTsKKwkJCW11dGV4X3VubG9jaygmdS0+aW9sb2NrKTsKIAogCQkJdGltZW8gPSB1bml4X3N0cmVhbV9kYXRhX3dhaXQoc2ssIHRpbWVvLCBsYXN0LAogCQkJCQkJICAgICAgbGFzdF9sZW4pOwpAQCAtMjM1MSw3ICsyMzM4LDcgQEAKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAotCQkJbXV0ZXhfbG9jaygmdS0+cmVhZGxvY2spOworCQkJbXV0ZXhfbG9jaygmdS0+aW9sb2NrKTsKIAkJCWdvdG8gcmVkbzsKIHVubG9jazoKIAkJCXVuaXhfc3RhdGVfdW5sb2NrKHNrKTsKQEAgLTI0NTQsNyArMjQ0MSw3IEBACiAJCX0KIAl9IHdoaWxlIChzaXplKTsKIAotCW11dGV4X3VubG9jaygmdS0+cmVhZGxvY2spOworCW11dGV4X3VubG9jaygmdS0+aW9sb2NrKTsKIAlpZiAoc3RhdGUtPm1zZykKIAkJc2NtX3JlY3Yoc29jaywgc3RhdGUtPm1zZywgJnNjbSwgZmxhZ3MpOwogCWVsc2UKQEAgLTI0OTUsOSArMjQ4Miw5IEBACiAJaW50IHJldDsKIAlzdHJ1Y3QgdW5peF9zb2NrICp1ID0gdW5peF9zayhzayk7CiAKLQltdXRleF91bmxvY2soJnUtPnJlYWRsb2NrKTsKKwltdXRleF91bmxvY2soJnUtPmlvbG9jayk7CiAJcmV0ID0gc3BsaWNlX3RvX3BpcGUocGlwZSwgc3BkKTsKLQltdXRleF9sb2NrKCZ1LT5yZWFkbG9jayk7CisJbXV0ZXhfbG9jaygmdS0+aW9sb2NrKTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9uZXQvdm13X3Zzb2NrL2FmX3Zzb2NrLmMgYi9uZXQvdm13X3Zzb2NrL2FmX3Zzb2NrLmMKaW5kZXggMTdkYmJlNi4uOGEzOThiMyAxMDA2NDQKLS0tIGEvbmV0L3Ztd192c29jay9hZl92c29jay5jCisrKyBiL25ldC92bXdfdnNvY2svYWZfdnNvY2suYwpAQCAtNDY1LDYgKzQ2NSw4IEBACiAKIAlpZiAodnNvY2tfaXNfcGVuZGluZyhzaykpIHsKIAkJdnNvY2tfcmVtb3ZlX3BlbmRpbmcobGlzdGVuZXIsIHNrKTsKKworCQlsaXN0ZW5lci0+c2tfYWNrX2JhY2tsb2ctLTsKIAl9IGVsc2UgaWYgKCF2c2stPnJlamVjdGVkKSB7CiAJCS8qIFdlIGFyZSBub3Qgb24gdGhlIHBlbmRpbmcgbGlzdCBhbmQgYWNjZXB0KCkgZGlkIG5vdCByZWplY3QKIAkJICogdXMsIHNvIHdlIG11c3QgaGF2ZSBiZWVuIGFjY2VwdGVkIGJ5IG91ciB1c2VyIHByb2Nlc3MuICBXZQpAQCAtNDc1LDggKzQ3Nyw2IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWxpc3RlbmVyLT5za19hY2tfYmFja2xvZy0tOwotCiAJLyogV2UgbmVlZCB0byByZW1vdmUgb3Vyc2VsZiBmcm9tIHRoZSBnbG9iYWwgY29ubmVjdGVkIHNvY2tldHMgbGlzdCBzbwogCSAqIGluY29taW5nIHBhY2tldHMgY2FuJ3QgZmluZCB0aGlzIHNvY2tldCwgYW5kIHRvIHJlZHVjZSB0aGUgcmVmZXJlbmNlCiAJICogY291bnQuCkBAIC0yMDEwLDUgKzIwMTAsNSBAQAogCiBNT0RVTEVfQVVUSE9SKCJWTXdhcmUsIEluYy4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiVk13YXJlIFZpcnR1YWwgU29ja2V0IEZhbWlseSIpOwotTU9EVUxFX1ZFUlNJT04oIjEuMC4xLjAtayIpOworTU9EVUxFX1ZFUlNJT04oIjEuMC4yLjAtayIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvbmV0L3Ztd192c29jay92aXJ0aW9fdHJhbnNwb3J0LmMgYi9uZXQvdm13X3Zzb2NrL3ZpcnRpb190cmFuc3BvcnQuYwppbmRleCA2OTlkZmFiLi45MzZkN2VlIDEwMDY0NAotLS0gYS9uZXQvdm13X3Zzb2NrL3ZpcnRpb190cmFuc3BvcnQuYworKysgYi9uZXQvdm13X3Zzb2NrL3ZpcnRpb190cmFuc3BvcnQuYwpAQCAtODcsOSArODcsNiBAQAogCiAJdnEgPSB2c29jay0+dnFzW1ZTT0NLX1ZRX1RYXTsKIAotCS8qIEF2b2lkIHVubmVjZXNzYXJ5IGludGVycnVwdHMgd2hpbGUgd2UncmUgcHJvY2Vzc2luZyB0aGUgcmluZyAqLwotCXZpcnRxdWV1ZV9kaXNhYmxlX2NiKHZxKTsKLQogCWZvciAoOzspIHsKIAkJc3RydWN0IHZpcnRpb192c29ja19wa3QgKnBrdDsKIAkJc3RydWN0IHNjYXR0ZXJsaXN0IGhkciwgYnVmLCAqc2dzWzJdOwpAQCAtOTksNyArOTYsNiBAQAogCQlzcGluX2xvY2tfYmgoJnZzb2NrLT5zZW5kX3BrdF9saXN0X2xvY2spOwogCQlpZiAobGlzdF9lbXB0eSgmdnNvY2stPnNlbmRfcGt0X2xpc3QpKSB7CiAJCQlzcGluX3VubG9ja19iaCgmdnNvY2stPnNlbmRfcGt0X2xpc3RfbG9jayk7Ci0JCQl2aXJ0cXVldWVfZW5hYmxlX2NiKHZxKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTExOCwxMyArMTE0LDEzIEBACiAJCX0KIAogCQlyZXQgPSB2aXJ0cXVldWVfYWRkX3Nncyh2cSwgc2dzLCBvdXRfc2csIGluX3NnLCBwa3QsIEdGUF9LRVJORUwpOworCQkvKiBVc3VhbGx5IHRoaXMgbWVhbnMgdGhhdCB0aGVyZSBpcyBubyBtb3JlIHNwYWNlIGF2YWlsYWJsZSBpbgorCQkgKiB0aGUgdnEKKwkJICovCiAJCWlmIChyZXQgPCAwKSB7CiAJCQlzcGluX2xvY2tfYmgoJnZzb2NrLT5zZW5kX3BrdF9saXN0X2xvY2spOwogCQkJbGlzdF9hZGQoJnBrdC0+bGlzdCwgJnZzb2NrLT5zZW5kX3BrdF9saXN0KTsKIAkJCXNwaW5fdW5sb2NrX2JoKCZ2c29jay0+c2VuZF9wa3RfbGlzdF9sb2NrKTsKLQotCQkJaWYgKCF2aXJ0cXVldWVfZW5hYmxlX2NiKHZxKSAmJiByZXQgPT0gLUVOT1NQQykKLQkJCQljb250aW51ZTsgLyogcmV0cnkgbm93IHRoYXQgd2UgaGF2ZSBtb3JlIHNwYWNlICovCiAJCQlicmVhazsKIAkJfQogCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvY2hhbi5jIGIvbmV0L3dpcmVsZXNzL2NoYW4uYwppbmRleCBiMGUxMWI2Li41NDk3ZDAyMiAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL2NoYW4uYworKysgYi9uZXQvd2lyZWxlc3MvY2hhbi5jCkBAIC0zNzIsNiArMzcyLDcgQEAKIAljYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9XRFM6CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfTkFOOgogCQlicmVhazsKIAljYXNlIE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVEOgogCWNhc2UgTlVNX05MODAyMTFfSUZUWVBFUzoKQEAgLTUxMyw2ICs1MTQsNyBAQAogCQlyID0gY2ZnODAyMTFfZ2V0X2NoYW5zX2Rmc19hdmFpbGFibGUod2lwaHksCiAJCQkJCQkgICAgIGNoYW5kZWYtPmNlbnRlcl9mcmVxMiwKIAkJCQkJCSAgICAgd2lkdGgpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlXQVJOX09OKGNoYW5kZWYtPmNlbnRlcl9mcmVxMik7CiAJCWJyZWFrOwpAQCAtOTQ1LDYgKzk0Nyw3IEBACiAJY2FzZSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfV0RTOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRToKKwljYXNlIE5MODAyMTFfSUZUWVBFX05BTjoKIAkJLyogdGhlc2UgaW50ZXJmYWNlIHR5cGVzIGRvbid0IHJlYWxseSBoYXZlIGEgY2hhbm5lbCAqLwogCQlyZXR1cm47CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRDoKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9jb3JlLmMgYi9uZXQvd2lyZWxlc3MvY29yZS5jCmluZGV4IDc2NDVlOTcuLjgyMDFlNmQgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9jb3JlLmMKKysrIGIvbmV0L3dpcmVsZXNzL2NvcmUuYwpAQCAtMjI1LDYgKzIyNSwyMyBAQAogCX0KIH0KIAordm9pZCBjZmc4MDIxMV9zdG9wX25hbihzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCisJCSAgICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KQoreworCUFTU0VSVF9SVE5MKCk7CisKKwlpZiAoV0FSTl9PTih3ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTkFOKSkKKwkJcmV0dXJuOworCisJaWYgKCF3ZGV2LT5uYW5fc3RhcnRlZCkKKwkJcmV0dXJuOworCisJcmRldl9zdG9wX25hbihyZGV2LCB3ZGV2KTsKKwl3ZGV2LT5uYW5fc3RhcnRlZCA9IGZhbHNlOworCisJcmRldi0+b3BlbmNvdW50LS07Cit9CisKIHZvaWQgY2ZnODAyMTFfc2h1dGRvd25fYWxsX2ludGVyZmFjZXMoc3RydWN0IHdpcGh5ICp3aXBoeSkKIHsKIAlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdpcGh5KTsKQEAgLTI0Miw2ICsyNTksOSBAQAogCQljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0U6CiAJCQljZmc4MDIxMV9zdG9wX3AycF9kZXZpY2UocmRldiwgd2Rldik7CiAJCQlicmVhazsKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9OQU46CisJCQljZmc4MDIxMV9zdG9wX25hbihyZGV2LCB3ZGV2KTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJYnJlYWs7CiAJCX0KQEAgLTUzNyw2ICs1NTcsMTEgQEAKIAkJCQkgICAgYy0+bGltaXRzW2pdLm1heCA+IDEpKQogCQkJCXJldHVybiAtRUlOVkFMOwogCisJCQkvKiBPbmx5IGEgc2luZ2xlIE5BTiBjYW4gYmUgYWxsb3dlZCAqLworCQkJaWYgKFdBUk5fT04odHlwZXMgJiBCSVQoTkw4MDIxMV9JRlRZUEVfTkFOKSAmJgorCQkJCSAgICBjLT5saW1pdHNbal0ubWF4ID4gMSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKIAkJCWNudCArPSBjLT5saW1pdHNbal0ubWF4OwogCQkJLyoKIAkJCSAqIERvbid0IGFkdmVydGlzZSBhbiB1bnN1cHBvcnRlZCB0eXBlCkBAIC01NzksNiArNjA0LDExIEBACiAJCSAgICAgIXJkZXYtPm9wcy0+dGRsc19jYW5jZWxfY2hhbm5lbF9zd2l0Y2gpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAoV0FSTl9PTigod2lwaHktPmludGVyZmFjZV9tb2RlcyAmIEJJVChOTDgwMjExX0lGVFlQRV9OQU4pKSAmJgorCQkgICAgKCFyZGV2LT5vcHMtPnN0YXJ0X25hbiB8fCAhcmRldi0+b3BzLT5zdG9wX25hbiB8fAorCQkgICAgICFyZGV2LT5vcHMtPmFkZF9uYW5fZnVuYyB8fCAhcmRldi0+b3BzLT5kZWxfbmFuX2Z1bmMpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAkvKgogCSAqIGlmIGEgd2lwaHkgaGFzIHVuc3VwcG9ydGVkIG1vZGVzIGZvciByZWd1bGF0b3J5IGNoYW5uZWwgZW5mb3JjZW1lbnQsCiAJICogb3B0LW91dCBvZiBlbmZvcmNlbWVudCBjaGVja2luZwpAQCAtNTg5LDYgKzYxOSw3IEBACiAJCQkJICAgICAgIEJJVChOTDgwMjExX0lGVFlQRV9QMlBfR08pIHwKIAkJCQkgICAgICAgQklUKE5MODAyMTFfSUZUWVBFX0FESE9DKSB8CiAJCQkJICAgICAgIEJJVChOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFKSB8CisJCQkJICAgICAgIEJJVChOTDgwMjExX0lGVFlQRV9OQU4pIHwKIAkJCQkgICAgICAgQklUKE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4pIHwKIAkJCQkgICAgICAgQklUKE5MODAyMTFfSUZUWVBFX01PTklUT1IpKSkKIAkJd2lwaHktPnJlZ3VsYXRvcnlfZmxhZ3MgfD0gUkVHVUxBVE9SWV9JR05PUkVfU1RBTEVfS0lDS09GRjsKQEAgLTkwNiw2ICs5MzcsOCBAQAogCWlmIChXQVJOX09OKHdkZXYtPm5ldGRldikpCiAJCXJldHVybjsKIAorCW5sODAyMTFfbm90aWZ5X2lmYWNlKHJkZXYsIHdkZXYsIE5MODAyMTFfQ01EX0RFTF9JTlRFUkZBQ0UpOworCiAJbGlzdF9kZWxfcmN1KCZ3ZGV2LT5saXN0KTsKIAlyZGV2LT5kZXZsaXN0X2dlbmVyYXRpb24rKzsKIApAQCAtOTE0LDYgKzk0Nyw5IEBACiAJCWNmZzgwMjExX21sbWVfcHVyZ2VfcmVnaXN0cmF0aW9ucyh3ZGV2KTsKIAkJY2ZnODAyMTFfc3RvcF9wMnBfZGV2aWNlKHJkZXYsIHdkZXYpOwogCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX05BTjoKKwkJY2ZnODAyMTFfc3RvcF9uYW4ocmRldiwgd2Rldik7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVdBUk5fT05fT05DRSgxKTsKIAkJYnJlYWs7CkBAIC05NzcsNiArMTAxMyw3IEBACiAJCS8qIG11c3QgYmUgaGFuZGxlZCBieSBtYWM4MDIxMS9kcml2ZXIsIGhhcyBubyBBUElzICovCiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRToKKwljYXNlIE5MODAyMTFfSUZUWVBFX05BTjoKIAkJLyogY2Fubm90IGhhcHBlbiwgaGFzIG5vIG5ldGRldiAqLwogCQlicmVhazsKIAljYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46CkBAIC0xMDc5LDYgKzExMTYsOCBAQAogCQkgICAgIHdkZXYtPmlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UIHx8CiAJCSAgICAgd2Rldi0+aWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSAmJiAhd2Rldi0+dXNlXzRhZGRyKQogCQkJZGV2LT5wcml2X2ZsYWdzIHw9IElGRl9ET05UX0JSSURHRTsKKworCQlubDgwMjExX25vdGlmeV9pZmFjZShyZGV2LCB3ZGV2LCBOTDgwMjExX0NNRF9ORVdfSU5URVJGQUNFKTsKIAkJYnJlYWs7CiAJY2FzZSBORVRERVZfR09JTkdfRE9XTjoKIAkJY2ZnODAyMTFfbGVhdmUocmRldiwgd2Rldik7CkBAIC0xMTU3LDYgKzExOTYsOCBAQAogCQkgKiByZW1vdmUgYW5kIGNsZWFuIGl0IHVwLgogCQkgKi8KIAkJaWYgKCFsaXN0X2VtcHR5KCZ3ZGV2LT5saXN0KSkgeworCQkJbmw4MDIxMV9ub3RpZnlfaWZhY2UocmRldiwgd2RldiwKKwkJCQkJICAgICBOTDgwMjExX0NNRF9ERUxfSU5URVJGQUNFKTsKIAkJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmRldi5rb2JqLCAicGh5ODAyMTEiKTsKIAkJCWxpc3RfZGVsX3JjdSgmd2Rldi0+bGlzdCk7CiAJCQlyZGV2LT5kZXZsaXN0X2dlbmVyYXRpb24rKzsKQEAgLTEyNDYsNyArMTI4Nyw3IEBACiAJaWYgKGVycikKIAkJZ290byBvdXRfZmFpbF9yZWc7CiAKLQljZmc4MDIxMV93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJjZmc4MDIxMSIpOworCWNmZzgwMjExX3dxID0gYWxsb2Nfb3JkZXJlZF93b3JrcXVldWUoImNmZzgwMjExIiwgV1FfTUVNX1JFQ0xBSU0pOwogCWlmICghY2ZnODAyMTFfd3EpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXRfZmFpbF93cTsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9jb3JlLmggYi9uZXQvd2lyZWxlc3MvY29yZS5oCmluZGV4IGVlZTkxNDQuLjA4ZDJlOTQgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9jb3JlLmgKKysrIGIvbmV0L3dpcmVsZXNzL2NvcmUuaApAQCAtMjQ5LDkgKzI0OSw5IEBACiB9OwogCiBzdHJ1Y3QgY2ZnODAyMTFfY2FjaGVkX2tleXMgewotCXN0cnVjdCBrZXlfcGFyYW1zIHBhcmFtc1s2XTsKLQl1OCBkYXRhWzZdW1dMQU5fTUFYX0tFWV9MRU5dOwotCWludCBkZWYsIGRlZm1nbXQ7CisJc3RydWN0IGtleV9wYXJhbXMgcGFyYW1zW0NGRzgwMjExX01BWF9XRVBfS0VZU107CisJdTggZGF0YVtDRkc4MDIxMV9NQVhfV0VQX0tFWVNdW1dMQU5fS0VZX0xFTl9XRVAxMDRdOworCWludCBkZWY7CiB9OwogCiBlbnVtIGNmZzgwMjExX2NoYW5fbW9kZSB7CkBAIC00ODgsNiArNDg4LDkgQEAKIHZvaWQgY2ZnODAyMTFfc3RvcF9wMnBfZGV2aWNlKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKIAkJCSAgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpOwogCit2b2lkIGNmZzgwMjExX3N0b3BfbmFuKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKKwkJICAgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpOworCiAjZGVmaW5lIENGRzgwMjExX01BWF9OVU1fRElGRkVSRU5UX0NIQU5ORUxTIDEwCiAKICNpZmRlZiBDT05GSUdfQ0ZHODAyMTFfREVWRUxPUEVSX1dBUk5JTkdTCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvaWJzcy5jIGIvbmV0L3dpcmVsZXNzL2lic3MuYwppbmRleCA0YTRkZGE1Li4zNjRmOTAwIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvaWJzcy5jCisrKyBiL25ldC93aXJlbGVzcy9pYnNzLmMKQEAgLTQzLDcgKzQzLDggQEAKIAljZmc4MDIxMV9ob2xkX2Jzcyhic3NfZnJvbV9wdWIoYnNzKSk7CiAJd2Rldi0+Y3VycmVudF9ic3MgPSBic3NfZnJvbV9wdWIoYnNzKTsKIAotCWNmZzgwMjExX3VwbG9hZF9jb25uZWN0X2tleXMod2Rldik7CisJaWYgKCEod2Rldi0+d2lwaHktPmZsYWdzICYgV0lQSFlfRkxBR19IQVNfU1RBVElDX1dFUCkpCisJCWNmZzgwMjExX3VwbG9hZF9jb25uZWN0X2tleXMod2Rldik7CiAKIAlubDgwMjExX3NlbmRfaWJzc19ic3NpZCh3aXBoeV90b19yZGV2KHdkZXYtPndpcGh5KSwgZGV2LCBic3NpZCwKIAkJCQlHRlBfS0VSTkVMKTsKQEAgLTExNCw2ICsxMTUsOSBAQAogCQl9CiAJfQogCisJaWYgKFdBUk5fT04oY29ubmtleXMgJiYgY29ubmtleXMtPmRlZiA8IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmIChXQVJOX09OKHdkZXYtPmNvbm5lY3Rfa2V5cykpCiAJCWt6ZnJlZSh3ZGV2LT5jb25uZWN0X2tleXMpOwogCXdkZXYtPmNvbm5lY3Rfa2V5cyA9IGNvbm5rZXlzOwpAQCAtMjg0LDE4ICsyODgsMTYgQEAKIAlpZiAoIW5ldGlmX3J1bm5pbmcod2Rldi0+bmV0ZGV2KSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAod2Rldi0+d2V4dC5rZXlzKSB7CisJaWYgKHdkZXYtPndleHQua2V5cykKIAkJd2Rldi0+d2V4dC5rZXlzLT5kZWYgPSB3ZGV2LT53ZXh0LmRlZmF1bHRfa2V5OwotCQl3ZGV2LT53ZXh0LmtleXMtPmRlZm1nbXQgPSB3ZGV2LT53ZXh0LmRlZmF1bHRfbWdtdF9rZXk7Ci0JfQogCiAJd2Rldi0+d2V4dC5pYnNzLnByaXZhY3kgPSB3ZGV2LT53ZXh0LmRlZmF1bHRfa2V5ICE9IC0xOwogCi0JaWYgKHdkZXYtPndleHQua2V5cykgeworCWlmICh3ZGV2LT53ZXh0LmtleXMgJiYgd2Rldi0+d2V4dC5rZXlzLT5kZWYgIT0gLTEpIHsKIAkJY2sgPSBrbWVtZHVwKHdkZXYtPndleHQua2V5cywgc2l6ZW9mKCpjayksIEdGUF9LRVJORUwpOwogCQlpZiAoIWNrKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCBDRkc4MDIxMV9NQVhfV0VQX0tFWVM7IGkrKykKIAkJCWNrLT5wYXJhbXNbaV0ua2V5ID0gY2stPmRhdGFbaV07CiAJfQogCWVyciA9IF9fY2ZnODAyMTFfam9pbl9pYnNzKHJkZXYsIHdkZXYtPm5ldGRldiwKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9tbG1lLmMgYi9uZXQvd2lyZWxlc3MvbWxtZS5jCmluZGV4IGMyODRkODguLmNiYjQ4ZTIgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9tbG1lLmMKKysrIGIvbmV0L3dpcmVsZXNzL21sbWUuYwpAQCAtMjIyLDcgKzIyMiw3IEBACiAJQVNTRVJUX1dERVZfTE9DSyh3ZGV2KTsKIAogCWlmIChhdXRoX3R5cGUgPT0gTkw4MDIxMV9BVVRIVFlQRV9TSEFSRURfS0VZKQotCQlpZiAoIWtleSB8fCAha2V5X2xlbiB8fCBrZXlfaWR4IDwgMCB8fCBrZXlfaWR4ID4gNCkKKwkJaWYgKCFrZXkgfHwgIWtleV9sZW4gfHwga2V5X2lkeCA8IDAgfHwga2V5X2lkeCA+IDMpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICh3ZGV2LT5jdXJyZW50X2JzcyAmJgpAQCAtNjM0LDYgKzYzNCw3IEBACiAJCQkgKiBmYWxsIHRocm91Z2gsIFAyUCBkZXZpY2Ugb25seSBzdXBwb3J0cwogCQkJICogcHVibGljIGFjdGlvbiBmcmFtZXMKIAkJCSAqLworCQljYXNlIE5MODAyMTFfSUZUWVBFX05BTjoKIAkJZGVmYXVsdDoKIAkJCWVyciA9IC1FT1BOT1RTVVBQOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jIGIvbmV0L3dpcmVsZXNzL25sODAyMTEuYwppbmRleCA0NjQxN2Y5Li5jNTEwODEwIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jCisrKyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmMKQEAgLTU2LDYgKzU2LDcgQEAKIAlOTDgwMjExX01DR1JQX1JFR1VMQVRPUlksCiAJTkw4MDIxMV9NQ0dSUF9NTE1FLAogCU5MODAyMTFfTUNHUlBfVkVORE9SLAorCU5MODAyMTFfTUNHUlBfTkFOLAogCU5MODAyMTFfTUNHUlBfVEVTVE1PREUgLyoga2VlcCBsYXN0IC0gaWZkZWYhICovCiB9OwogCkBAIC02NSw2ICs2Niw3IEBACiAJW05MODAyMTFfTUNHUlBfUkVHVUxBVE9SWV0gPSB7IC5uYW1lID0gTkw4MDIxMV9NVUxUSUNBU1RfR1JPVVBfUkVHIH0sCiAJW05MODAyMTFfTUNHUlBfTUxNRV0gPSB7IC5uYW1lID0gTkw4MDIxMV9NVUxUSUNBU1RfR1JPVVBfTUxNRSB9LAogCVtOTDgwMjExX01DR1JQX1ZFTkRPUl0gPSB7IC5uYW1lID0gTkw4MDIxMV9NVUxUSUNBU1RfR1JPVVBfVkVORE9SIH0sCisJW05MODAyMTFfTUNHUlBfTkFOXSA9IHsgLm5hbWUgPSBOTDgwMjExX01VTFRJQ0FTVF9HUk9VUF9OQU4gfSwKICNpZmRlZiBDT05GSUdfTkw4MDIxMV9URVNUTU9ERQogCVtOTDgwMjExX01DR1JQX1RFU1RNT0RFXSA9IHsgLm5hbWUgPSBOTDgwMjExX01VTFRJQ0FTVF9HUk9VUF9URVNUTU9ERSB9CiAjZW5kaWYKQEAgLTQwOSw2ICs0MTEsOSBAQAogCQkubGVuID0gVkhUX01VTUlNT19HUk9VUFNfREFUQV9MRU4KIAl9LAogCVtOTDgwMjExX0FUVFJfTVVfTUlNT19GT0xMT1dfTUFDX0FERFJdID0geyAubGVuID0gRVRIX0FMRU4gfSwKKwlbTkw4MDIxMV9BVFRSX05BTl9NQVNURVJfUFJFRl0gPSB7IC50eXBlID0gTkxBX1U4IH0sCisJW05MODAyMTFfQVRUUl9OQU5fRFVBTF0gPSB7IC50eXBlID0gTkxBX1U4IH0sCisJW05MODAyMTFfQVRUUl9OQU5fRlVOQ10gPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAogfTsKIAogLyogcG9saWN5IGZvciB0aGUga2V5IGF0dHJpYnV0ZXMgKi8KQEAgLTUwMiw2ICs1MDcsMzkgQEAKIAl9LAogfTsKIAorLyogcG9saWN5IGZvciBOQU4gZnVuY3Rpb24gYXR0cmlidXRlcyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5CitubDgwMjExX25hbl9mdW5jX3BvbGljeVtOTDgwMjExX05BTl9GVU5DX0FUVFJfTUFYICsgMV0gPSB7CisJW05MODAyMTFfTkFOX0ZVTkNfVFlQRV0gPSB7IC50eXBlID0gTkxBX1U4IH0sCisJW05MODAyMTFfTkFOX0ZVTkNfU0VSVklDRV9JRF0gPSB7IC50eXBlID0gTkxBX0JJTkFSWSwKKwkJCQkgICAgLmxlbiA9IE5MODAyMTFfTkFOX0ZVTkNfU0VSVklDRV9JRF9MRU4gfSwKKwlbTkw4MDIxMV9OQU5fRlVOQ19QVUJMSVNIX1RZUEVdID0geyAudHlwZSA9IE5MQV9VOCB9LAorCVtOTDgwMjExX05BTl9GVU5DX1BVQkxJU0hfQkNBU1RdID0geyAudHlwZSA9IE5MQV9GTEFHIH0sCisJW05MODAyMTFfTkFOX0ZVTkNfU1VCU0NSSUJFX0FDVElWRV0gPSB7IC50eXBlID0gTkxBX0ZMQUcgfSwKKwlbTkw4MDIxMV9OQU5fRlVOQ19GT0xMT1dfVVBfSURdID0geyAudHlwZSA9IE5MQV9VOCB9LAorCVtOTDgwMjExX05BTl9GVU5DX0ZPTExPV19VUF9SRVFfSURdID0geyAudHlwZSA9IE5MQV9VOCB9LAorCVtOTDgwMjExX05BTl9GVU5DX0ZPTExPV19VUF9ERVNUXSA9IHsgLmxlbiA9IEVUSF9BTEVOIH0sCisJW05MODAyMTFfTkFOX0ZVTkNfQ0xPU0VfUkFOR0VdID0geyAudHlwZSA9IE5MQV9GTEFHIH0sCisJW05MODAyMTFfTkFOX0ZVTkNfVFRMXSA9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW05MODAyMTFfTkFOX0ZVTkNfU0VSVklDRV9JTkZPXSA9IHsgLnR5cGUgPSBOTEFfQklOQVJZLAorCQkJLmxlbiA9IE5MODAyMTFfTkFOX0ZVTkNfU0VSVklDRV9TUEVDX0lORk9fTUFYX0xFTiB9LAorCVtOTDgwMjExX05BTl9GVU5DX1NSRl0gPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAorCVtOTDgwMjExX05BTl9GVU5DX1JYX01BVENIX0ZJTFRFUl0gPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAorCVtOTDgwMjExX05BTl9GVU5DX1RYX01BVENIX0ZJTFRFUl0gPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAorCVtOTDgwMjExX05BTl9GVU5DX0lOU1RBTkNFX0lEXSA9IHsgLnR5cGUgPSBOTEFfVTggfSwKKwlbTkw4MDIxMV9OQU5fRlVOQ19URVJNX1JFQVNPTl0gPSB7IC50eXBlID0gTkxBX1U4IH0sCit9OworCisvKiBwb2xpY3kgZm9yIFNlcnZpY2UgUmVzcG9uc2UgRmlsdGVyIGF0dHJpYnV0ZXMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeQorbmw4MDIxMV9uYW5fc3JmX3BvbGljeVtOTDgwMjExX05BTl9TUkZfQVRUUl9NQVggKyAxXSA9IHsKKwlbTkw4MDIxMV9OQU5fU1JGX0lOQ0xVREVdID0geyAudHlwZSA9IE5MQV9GTEFHIH0sCisJW05MODAyMTFfTkFOX1NSRl9CRl0gPSB7IC50eXBlID0gTkxBX0JJTkFSWSwKKwkJCQkgLmxlbiA9ICBOTDgwMjExX05BTl9GVU5DX1NSRl9NQVhfTEVOIH0sCisJW05MODAyMTFfTkFOX1NSRl9CRl9JRFhdID0geyAudHlwZSA9IE5MQV9VOCB9LAorCVtOTDgwMjExX05BTl9TUkZfTUFDX0FERFJTXSA9IHsgLnR5cGUgPSBOTEFfTkVTVEVEIH0sCit9OworCiBzdGF0aWMgaW50IG5sODAyMTFfcHJlcGFyZV93ZGV2X2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgICAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKIAkJCQkgICAgIHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqKnJkZXYsCkBAIC04NDgsMTMgKzg4NiwyMSBAQAogCXN0cnVjdCBubGF0dHIgKmtleTsKIAlzdHJ1Y3QgY2ZnODAyMTFfY2FjaGVkX2tleXMgKnJlc3VsdDsKIAlpbnQgcmVtLCBlcnIsIGRlZiA9IDA7CisJYm9vbCBoYXZlX2tleSA9IGZhbHNlOworCisJbmxhX2Zvcl9lYWNoX25lc3RlZChrZXksIGtleXMsIHJlbSkgeworCQloYXZlX2tleSA9IHRydWU7CisJCWJyZWFrOworCX0KKworCWlmICghaGF2ZV9rZXkpCisJCXJldHVybiBOVUxMOwogCiAJcmVzdWx0ID0ga3phbGxvYyhzaXplb2YoKnJlc3VsdCksIEdGUF9LRVJORUwpOwogCWlmICghcmVzdWx0KQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCXJlc3VsdC0+ZGVmID0gLTE7Ci0JcmVzdWx0LT5kZWZtZ210ID0gLTE7CiAKIAlubGFfZm9yX2VhY2hfbmVzdGVkKGtleSwga2V5cywgcmVtKSB7CiAJCW1lbXNldCgmcGFyc2UsIDAsIHNpemVvZihwYXJzZSkpOwpAQCAtODY2LDcgKzkxMiw3IEBACiAJCWVyciA9IC1FSU5WQUw7CiAJCWlmICghcGFyc2UucC5rZXkpCiAJCQlnb3RvIGVycm9yOwotCQlpZiAocGFyc2UuaWR4IDwgMCB8fCBwYXJzZS5pZHggPiA0KQorCQlpZiAocGFyc2UuaWR4IDwgMCB8fCBwYXJzZS5pZHggPiAzKQogCQkJZ290byBlcnJvcjsKIAkJaWYgKHBhcnNlLmRlZikgewogCQkJaWYgKGRlZikKQEAgLTg4MSwxNiArOTI3LDI0IEBACiAJCQkJCQkgICAgIHBhcnNlLmlkeCwgZmFsc2UsIE5VTEwpOwogCQlpZiAoZXJyKQogCQkJZ290byBlcnJvcjsKKwkJaWYgKHBhcnNlLnAuY2lwaGVyICE9IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwICYmCisJCSAgICBwYXJzZS5wLmNpcGhlciAhPSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIGVycm9yOworCQl9CiAJCXJlc3VsdC0+cGFyYW1zW3BhcnNlLmlkeF0uY2lwaGVyID0gcGFyc2UucC5jaXBoZXI7CiAJCXJlc3VsdC0+cGFyYW1zW3BhcnNlLmlkeF0ua2V5X2xlbiA9IHBhcnNlLnAua2V5X2xlbjsKIAkJcmVzdWx0LT5wYXJhbXNbcGFyc2UuaWR4XS5rZXkgPSByZXN1bHQtPmRhdGFbcGFyc2UuaWR4XTsKIAkJbWVtY3B5KHJlc3VsdC0+ZGF0YVtwYXJzZS5pZHhdLCBwYXJzZS5wLmtleSwgcGFyc2UucC5rZXlfbGVuKTsKIAotCQlpZiAocGFyc2UucC5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgfHwKLQkJICAgIHBhcnNlLnAuY2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkgewotCQkJaWYgKG5vX2h0KQotCQkJCSpub19odCA9IHRydWU7Ci0JCX0KKwkJLyogbXVzdCBiZSBXRVAga2V5IGlmIHdlIGdvdCBoZXJlICovCisJCWlmIChub19odCkKKwkJCSpub19odCA9IHRydWU7CisJfQorCisJaWYgKHJlc3VsdC0+ZGVmIDwgMCkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOwogCX0KIAogCXJldHVybiByZXN1bHQ7CkBAIC05MTgsNiArOTcyLDcgQEAKIAljYXNlIE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVEOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfT0NCOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKKwljYXNlIE5MODAyMTFfSUZUWVBFX05BTjoKIAljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0U6CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9XRFM6CiAJY2FzZSBOVU1fTkw4MDIxMV9JRlRZUEVTOgpAQCAtMjUyNSwxMCArMjU4MCwzNSBAQAogCWludCBpZl9pZHggPSAwOwogCWludCB3cF9zdGFydCA9IGNiLT5hcmdzWzBdOwogCWludCBpZl9zdGFydCA9IGNiLT5hcmdzWzFdOworCWludCBmaWx0ZXJfd2lwaHkgPSAtMTsKIAlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXY7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldjsKIAogCXJ0bmxfbG9jaygpOworCWlmICghY2ItPmFyZ3NbMl0pIHsKKwkJc3RydWN0IG5sODAyMTFfZHVtcF93aXBoeV9zdGF0ZSBzdGF0ZSA9IHsKKwkJCS5maWx0ZXJfd2lwaHkgPSAtMSwKKwkJfTsKKwkJaW50IHJldDsKKworCQlyZXQgPSBubDgwMjExX2R1bXBfd2lwaHlfcGFyc2Uoc2tiLCBjYiwgJnN0YXRlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJZmlsdGVyX3dpcGh5ID0gc3RhdGUuZmlsdGVyX3dpcGh5OworCisJCS8qCisJCSAqIGlmIGZpbHRlcmluZywgc2V0IGNiLT5hcmdzWzJdIHRvICsxIHNpbmNlIDAgaXMgdGhlIGRlZmF1bHQKKwkJICogdmFsdWUgbmVlZGVkIHRvIGRldGVybWluZSB0aGF0IHBhcnNpbmcgaXMgbmVjZXNzYXJ5LgorCQkgKi8KKwkJaWYgKGZpbHRlcl93aXBoeSA+PSAwKQorCQkJY2ItPmFyZ3NbMl0gPSBmaWx0ZXJfd2lwaHkgKyAxOworCQllbHNlCisJCQljYi0+YXJnc1syXSA9IC0xOworCX0gZWxzZSBpZiAoY2ItPmFyZ3NbMl0gPiAwKSB7CisJCWZpbHRlcl93aXBoeSA9IGNiLT5hcmdzWzJdIC0gMTsKKwl9CisKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJkZXYsICZjZmc4MDIxMV9yZGV2X2xpc3QsIGxpc3QpIHsKIAkJaWYgKCFuZXRfZXEod2lwaHlfbmV0KCZyZGV2LT53aXBoeSksIHNvY2tfbmV0KHNrYi0+c2spKSkKIAkJCWNvbnRpbnVlOwpAQCAtMjUzNiw2ICsyNjE2LDEwIEBACiAJCQl3cF9pZHgrKzsKIAkJCWNvbnRpbnVlOwogCQl9CisKKwkJaWYgKGZpbHRlcl93aXBoeSA+PSAwICYmIGZpbHRlcl93aXBoeSAhPSByZGV2LT53aXBoeV9pZHgpCisJCQljb250aW51ZTsKKwogCQlpZl9pZHggPSAwOwogCiAJCWxpc3RfZm9yX2VhY2hfZW50cnkod2RldiwgJnJkZXYtPndpcGh5LndkZXZfbGlzdCwgbGlzdCkgewpAQCAtMjc1MSw3ICsyODM1LDcgQEAKIAlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSBpbmZvLT51c2VyX3B0clswXTsKIAlzdHJ1Y3QgdmlmX3BhcmFtcyBwYXJhbXM7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCAqZXZlbnQ7CisJc3RydWN0IHNrX2J1ZmYgKm1zZzsKIAlpbnQgZXJyOwogCWVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSA9IE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVEOwogCXUzMiBmbGFnczsKQEAgLTI3NzQsNyArMjg1OCw3IEBACiAJICAgICEocmRldi0+d2lwaHkuaW50ZXJmYWNlX21vZGVzICYgKDEgPDwgdHlwZSkpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlpZiAoKHR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRSB8fAorCWlmICgodHlwZSA9PSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFIHx8IHR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTkFOIHx8CiAJICAgICByZGV2LT53aXBoeS5mZWF0dXJlcyAmIE5MODAyMTFfRkVBVFVSRV9NQUNfT05fQ1JFQVRFKSAmJgogCSAgICBpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTUFDXSkgewogCQlubGFfbWVtY3B5KHBhcmFtcy5tYWNhZGRyLCBpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTUFDXSwKQEAgLTI4MzAsOSArMjkxNCwxMCBAQAogCQkgICAgICAgd2Rldi0+bWVzaF9pZF91cF9sZW4pOwogCQl3ZGV2X3VubG9jayh3ZGV2KTsKIAkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9OQU46CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFOgogCQkvKgotCQkgKiBQMlAgRGV2aWNlIGRvZXNuJ3QgaGF2ZSBhIG5ldGRldiwgc28gZG9lc24ndCBnbworCQkgKiBQMlAgRGV2aWNlIGFuZCBOQU4gZG8gbm90IGhhdmUgYSBuZXRkZXYsIHNvIGRvbid0IGdvCiAJCSAqIHRocm91Z2ggdGhlIG5ldGRldiBub3RpZmllciBhbmQgbXVzdCBiZSBhZGRlZCBoZXJlCiAJCSAqLwogCQltdXRleF9pbml0KCZ3ZGV2LT5tdHgpOwpAQCAtMjg1NSwyMCArMjk0MCwxNSBAQAogCQlyZXR1cm4gLUVOT0JVRlM7CiAJfQogCi0JZXZlbnQgPSBubG1zZ19uZXcoTkxNU0dfREVGQVVMVF9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoZXZlbnQpIHsKLQkJaWYgKG5sODAyMTFfc2VuZF9pZmFjZShldmVudCwgMCwgMCwgMCwKLQkJCQkgICAgICAgcmRldiwgd2RldiwgZmFsc2UpIDwgMCkgewotCQkJbmxtc2dfZnJlZShldmVudCk7Ci0JCQlnb3RvIG91dDsKLQkJfQorCS8qCisJICogRm9yIHdkZXZzIHdoaWNoIGhhdmUgbm8gYXNzb2NpYXRlZCBuZXRkZXYgb2JqZWN0IChlLmcuIG9mIHR5cGUKKwkgKiBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFKSwgZW1pdCB0aGUgTkVXX0lOVEVSRkFDRSBldmVudCBoZXJlLgorCSAqIEZvciBhbGwgb3RoZXIgdHlwZXMsIHRoZSBldmVudCB3aWxsIGJlIGdlbmVyYXRlZCBmcm9tIHRoZQorCSAqIG5ldGRldiBub3RpZmllcgorCSAqLworCWlmICghd2Rldi0+bmV0ZGV2KQorCQlubDgwMjExX25vdGlmeV9pZmFjZShyZGV2LCB3ZGV2LCBOTDgwMjExX0NNRF9ORVdfSU5URVJGQUNFKTsKIAotCQlnZW5sbXNnX211bHRpY2FzdF9uZXRucygmbmw4MDIxMV9mYW0sIHdpcGh5X25ldCgmcmRldi0+d2lwaHkpLAotCQkJCQlldmVudCwgMCwgTkw4MDIxMV9NQ0dSUF9DT05GSUcsCi0JCQkJCUdGUF9LRVJORUwpOwotCX0KLQotb3V0OgogCXJldHVybiBnZW5sbXNnX3JlcGx5KG1zZywgaW5mbyk7CiB9CiAKQEAgLTI4NzYsMTggKzI5NTYsMTAgQEAKIHsKIAlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSBpbmZvLT51c2VyX3B0clswXTsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gaW5mby0+dXNlcl9wdHJbMV07Ci0Jc3RydWN0IHNrX2J1ZmYgKm1zZzsKLQlpbnQgc3RhdHVzOwogCiAJaWYgKCFyZGV2LT5vcHMtPmRlbF92aXJ0dWFsX2ludGYpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCW1zZyA9IG5sbXNnX25ldyhOTE1TR19ERUZBVUxUX1NJWkUsIEdGUF9LRVJORUwpOwotCWlmIChtc2cgJiYgbmw4MDIxMV9zZW5kX2lmYWNlKG1zZywgMCwgMCwgMCwgcmRldiwgd2RldiwgdHJ1ZSkgPCAwKSB7Ci0JCW5sbXNnX2ZyZWUobXNnKTsKLQkJbXNnID0gTlVMTDsKLQl9Ci0KIAkvKgogCSAqIElmIHdlIHJlbW92ZSBhIHdpcmVsZXNzIGRldmljZSB3aXRob3V0IGEgbmV0ZGV2IHRoZW4gY2xlYXIKIAkgKiB1c2VyX3B0clsxXSBzbyB0aGF0IG5sODAyMTFfcG9zdF9kb2l0IHdvbid0IGRlcmVmZXJlbmNlIGl0CkBAIC0yODk4LDE1ICsyOTcwLDcgQEAKIAlpZiAoIXdkZXYtPm5ldGRldikKIAkJaW5mby0+dXNlcl9wdHJbMV0gPSBOVUxMOwogCi0Jc3RhdHVzID0gcmRldl9kZWxfdmlydHVhbF9pbnRmKHJkZXYsIHdkZXYpOwotCWlmIChzdGF0dXMgPj0gMCAmJiBtc2cpCi0JCWdlbmxtc2dfbXVsdGljYXN0X25ldG5zKCZubDgwMjExX2ZhbSwgd2lwaHlfbmV0KCZyZGV2LT53aXBoeSksCi0JCQkJCW1zZywgMCwgTkw4MDIxMV9NQ0dSUF9DT05GSUcsCi0JCQkJCUdGUF9LRVJORUwpOwotCWVsc2UKLQkJbmxtc2dfZnJlZShtc2cpOwotCi0JcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gcmRldl9kZWxfdmlydHVhbF9pbnRmKHJkZXYsIHdkZXYpOwogfQogCiBzdGF0aWMgaW50IG5sODAyMTFfc2V0X25vYWNrX21hcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQpAQCAtMzMxNiw2ICszMzgwLDI5MSBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyB1MzIgcmF0ZXNldF90b19tYXNrKHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAorCQkJICAgdTggKnJhdGVzLCB1OCByYXRlc19sZW4pCit7CisJdTggaTsKKwl1MzIgbWFzayA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmF0ZXNfbGVuOyBpKyspIHsKKwkJaW50IHJhdGUgPSAocmF0ZXNbaV0gJiAweDdmKSAqIDU7CisJCWludCByaWR4OworCisJCWZvciAocmlkeCA9IDA7IHJpZHggPCBzYmFuZC0+bl9iaXRyYXRlczsgcmlkeCsrKSB7CisJCQlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnNyYXRlID0KKwkJCQkmc2JhbmQtPmJpdHJhdGVzW3JpZHhdOworCQkJaWYgKHJhdGUgPT0gc3JhdGUtPmJpdHJhdGUpIHsKKwkJCQltYXNrIHw9IDEgPDwgcmlkeDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAocmlkeCA9PSBzYmFuZC0+bl9iaXRyYXRlcykKKwkJCXJldHVybiAwOyAvKiByYXRlIG5vdCBmb3VuZCAqLworCX0KKworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgYm9vbCBodF9yYXRlc2V0X3RvX21hc2soc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCisJCQkgICAgICAgdTggKnJhdGVzLCB1OCByYXRlc19sZW4sCisJCQkgICAgICAgdTggbWNzW0lFRUU4MDIxMV9IVF9NQ1NfTUFTS19MRU5dKQoreworCXU4IGk7CisKKwltZW1zZXQobWNzLCAwLCBJRUVFODAyMTFfSFRfTUNTX01BU0tfTEVOKTsKKworCWZvciAoaSA9IDA7IGkgPCByYXRlc19sZW47IGkrKykgeworCQlpbnQgcmlkeCwgcmJpdDsKKworCQlyaWR4ID0gcmF0ZXNbaV0gLyA4OworCQlyYml0ID0gQklUKHJhdGVzW2ldICUgOCk7CisKKwkJLyogY2hlY2sgdmFsaWRpdHkgKi8KKwkJaWYgKChyaWR4IDwgMCkgfHwgKHJpZHggPj0gSUVFRTgwMjExX0hUX01DU19NQVNLX0xFTikpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJLyogY2hlY2sgYXZhaWxhYmlsaXR5ICovCisJCWlmIChzYmFuZC0+aHRfY2FwLm1jcy5yeF9tYXNrW3JpZHhdICYgcmJpdCkKKwkJCW1jc1tyaWR4XSB8PSByYml0OworCQllbHNlCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB1MTYgdmh0X21jc19tYXBfdG9fbWNzX21hc2sodTggdmh0X21jc19tYXApCit7CisJdTE2IG1jc19tYXNrID0gMDsKKworCXN3aXRjaCAodmh0X21jc19tYXApIHsKKwljYXNlIElFRUU4MDIxMV9WSFRfTUNTX05PVF9TVVBQT1JURUQ6CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX1ZIVF9NQ1NfU1VQUE9SVF8wXzc6CisJCW1jc19tYXNrID0gMHgwMEZGOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9WSFRfTUNTX1NVUFBPUlRfMF84OgorCQltY3NfbWFzayA9IDB4MDFGRjsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfVkhUX01DU19TVVBQT1JUXzBfOToKKwkJbWNzX21hc2sgPSAweDAzRkY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBtY3NfbWFzazsKK30KKworc3RhdGljIHZvaWQgdmh0X2J1aWxkX21jc19tYXNrKHUxNiB2aHRfbWNzX21hcCwKKwkJCSAgICAgICB1MTYgdmh0X21jc19tYXNrW05MODAyMTFfVkhUX05TU19NQVhdKQoreworCXU4IG5zczsKKworCWZvciAobnNzID0gMDsgbnNzIDwgTkw4MDIxMV9WSFRfTlNTX01BWDsgbnNzKyspIHsKKwkJdmh0X21jc19tYXNrW25zc10gPSB2aHRfbWNzX21hcF90b19tY3NfbWFzayh2aHRfbWNzX21hcCAmIDB4MDMpOworCQl2aHRfbWNzX21hcCA+Pj0gMjsKKwl9Cit9CisKK3N0YXRpYyBib29sIHZodF9zZXRfbWNzX21hc2soc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCisJCQkgICAgIHN0cnVjdCBubDgwMjExX3R4cmF0ZV92aHQgKnR4cmF0ZSwKKwkJCSAgICAgdTE2IG1jc1tOTDgwMjExX1ZIVF9OU1NfTUFYXSkKK3sKKwl1MTYgdHhfbWNzX21hcCA9IGxlMTZfdG9fY3B1KHNiYW5kLT52aHRfY2FwLnZodF9tY3MudHhfbWNzX21hcCk7CisJdTE2IHR4X21jc19tYXNrW05MODAyMTFfVkhUX05TU19NQVhdID0ge307CisJdTggaTsKKworCWlmICghc2JhbmQtPnZodF9jYXAudmh0X3N1cHBvcnRlZCkKKwkJcmV0dXJuIGZhbHNlOworCisJbWVtc2V0KG1jcywgMCwgc2l6ZW9mKHUxNikgKiBOTDgwMjExX1ZIVF9OU1NfTUFYKTsKKworCS8qIEJ1aWxkIHZodF9tY3NfbWFzayBmcm9tIFZIVCBjYXBhYmlsaXRpZXMgKi8KKwl2aHRfYnVpbGRfbWNzX21hc2sodHhfbWNzX21hcCwgdHhfbWNzX21hc2spOworCisJZm9yIChpID0gMDsgaSA8IE5MODAyMTFfVkhUX05TU19NQVg7IGkrKykgeworCQlpZiAoKHR4X21jc19tYXNrW2ldICYgdHhyYXRlLT5tY3NbaV0pID09IHR4cmF0ZS0+bWNzW2ldKQorCQkJbWNzW2ldID0gdHhyYXRlLT5tY3NbaV07CisJCWVsc2UKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5sODAyMTFfdHhhdHRyX3BvbGljeVtOTDgwMjExX1RYUkFURV9NQVggKyAxXSA9IHsKKwlbTkw4MDIxMV9UWFJBVEVfTEVHQUNZXSA9IHsgLnR5cGUgPSBOTEFfQklOQVJZLAorCQkJCSAgICAubGVuID0gTkw4MDIxMV9NQVhfU1VQUF9SQVRFUyB9LAorCVtOTDgwMjExX1RYUkFURV9IVF0gPSB7IC50eXBlID0gTkxBX0JJTkFSWSwKKwkJCQkubGVuID0gTkw4MDIxMV9NQVhfU1VQUF9IVF9SQVRFUyB9LAorCVtOTDgwMjExX1RYUkFURV9WSFRdID0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCBubDgwMjExX3R4cmF0ZV92aHQpfSwKKwlbTkw4MDIxMV9UWFJBVEVfR0ldID0geyAudHlwZSA9IE5MQV9VOCB9LAorfTsKKworc3RhdGljIGludCBubDgwMjExX3BhcnNlX3R4X2JpdHJhdGVfbWFzayhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvLAorCQkJCQkgc3RydWN0IGNmZzgwMjExX2JpdHJhdGVfbWFzayAqbWFzaykKK3sKKwlzdHJ1Y3QgbmxhdHRyICp0YltOTDgwMjExX1RYUkFURV9NQVggKyAxXTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSBpbmZvLT51c2VyX3B0clswXTsKKwlpbnQgcmVtLCBpOworCXN0cnVjdCBubGF0dHIgKnR4X3JhdGVzOworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOworCXUxNiB2aHRfdHhfbWNzX21hcDsKKworCW1lbXNldChtYXNrLCAwLCBzaXplb2YoKm1hc2spKTsKKwkvKiBEZWZhdWx0IHRvIGFsbCByYXRlcyBlbmFibGVkICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9OTDgwMjExX0JBTkRTOyBpKyspIHsKKwkJc2JhbmQgPSByZGV2LT53aXBoeS5iYW5kc1tpXTsKKworCQlpZiAoIXNiYW5kKQorCQkJY29udGludWU7CisKKwkJbWFzay0+Y29udHJvbFtpXS5sZWdhY3kgPSAoMSA8PCBzYmFuZC0+bl9iaXRyYXRlcykgLSAxOworCQltZW1jcHkobWFzay0+Y29udHJvbFtpXS5odF9tY3MsCisJCSAgICAgICBzYmFuZC0+aHRfY2FwLm1jcy5yeF9tYXNrLAorCQkgICAgICAgc2l6ZW9mKG1hc2stPmNvbnRyb2xbaV0uaHRfbWNzKSk7CisKKwkJaWYgKCFzYmFuZC0+dmh0X2NhcC52aHRfc3VwcG9ydGVkKQorCQkJY29udGludWU7CisKKwkJdmh0X3R4X21jc19tYXAgPSBsZTE2X3RvX2NwdShzYmFuZC0+dmh0X2NhcC52aHRfbWNzLnR4X21jc19tYXApOworCQl2aHRfYnVpbGRfbWNzX21hc2sodmh0X3R4X21jc19tYXAsIG1hc2stPmNvbnRyb2xbaV0udmh0X21jcyk7CisJfQorCisJLyogaWYgbm8gcmF0ZXMgYXJlIGdpdmVuIHNldCBpdCBiYWNrIHRvIHRoZSBkZWZhdWx0cyAqLworCWlmICghaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1RYX1JBVEVTXSkKKwkJZ290byBvdXQ7CisKKwkvKiBUaGUgbmVzdGVkIGF0dHJpYnV0ZSB1c2VzIGVudW0gbmw4MDIxMV9iYW5kIGFzIHRoZSBpbmRleC4gVGhpcyBtYXBzCisJICogZGlyZWN0bHkgdG8gdGhlIGVudW0gbmw4MDIxMV9iYW5kIHZhbHVlcyB1c2VkIGluIGNmZzgwMjExLgorCSAqLworCUJVSUxEX0JVR19PTihOTDgwMjExX01BWF9TVVBQX0hUX1JBVEVTID4gSUVFRTgwMjExX0hUX01DU19NQVNLX0xFTiAqIDgpOworCW5sYV9mb3JfZWFjaF9uZXN0ZWQodHhfcmF0ZXMsIGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9UWF9SQVRFU10sIHJlbSkgeworCQllbnVtIG5sODAyMTFfYmFuZCBiYW5kID0gbmxhX3R5cGUodHhfcmF0ZXMpOworCQlpbnQgZXJyOworCisJCWlmIChiYW5kIDwgMCB8fCBiYW5kID49IE5VTV9OTDgwMjExX0JBTkRTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXNiYW5kID0gcmRldi0+d2lwaHkuYmFuZHNbYmFuZF07CisJCWlmIChzYmFuZCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWVyciA9IG5sYV9wYXJzZSh0YiwgTkw4MDIxMV9UWFJBVEVfTUFYLCBubGFfZGF0YSh0eF9yYXRlcyksCisJCQkJbmxhX2xlbih0eF9yYXRlcyksIG5sODAyMTFfdHhhdHRyX3BvbGljeSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQlpZiAodGJbTkw4MDIxMV9UWFJBVEVfTEVHQUNZXSkgeworCQkJbWFzay0+Y29udHJvbFtiYW5kXS5sZWdhY3kgPSByYXRlc2V0X3RvX21hc2soCisJCQkJc2JhbmQsCisJCQkJbmxhX2RhdGEodGJbTkw4MDIxMV9UWFJBVEVfTEVHQUNZXSksCisJCQkJbmxhX2xlbih0YltOTDgwMjExX1RYUkFURV9MRUdBQ1ldKSk7CisJCQlpZiAoKG1hc2stPmNvbnRyb2xbYmFuZF0ubGVnYWN5ID09IDApICYmCisJCQkgICAgbmxhX2xlbih0YltOTDgwMjExX1RYUkFURV9MRUdBQ1ldKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAodGJbTkw4MDIxMV9UWFJBVEVfSFRdKSB7CisJCQlpZiAoIWh0X3JhdGVzZXRfdG9fbWFzaygKKwkJCQkJc2JhbmQsCisJCQkJCW5sYV9kYXRhKHRiW05MODAyMTFfVFhSQVRFX0hUXSksCisJCQkJCW5sYV9sZW4odGJbTkw4MDIxMV9UWFJBVEVfSFRdKSwKKwkJCQkJbWFzay0+Y29udHJvbFtiYW5kXS5odF9tY3MpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmICh0YltOTDgwMjExX1RYUkFURV9WSFRdKSB7CisJCQlpZiAoIXZodF9zZXRfbWNzX21hc2soCisJCQkJCXNiYW5kLAorCQkJCQlubGFfZGF0YSh0YltOTDgwMjExX1RYUkFURV9WSFRdKSwKKwkJCQkJbWFzay0+Y29udHJvbFtiYW5kXS52aHRfbWNzKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAodGJbTkw4MDIxMV9UWFJBVEVfR0ldKSB7CisJCQltYXNrLT5jb250cm9sW2JhbmRdLmdpID0KKwkJCQlubGFfZ2V0X3U4KHRiW05MODAyMTFfVFhSQVRFX0dJXSk7CisJCQlpZiAobWFzay0+Y29udHJvbFtiYW5kXS5naSA+IE5MODAyMTFfVFhSQVRFX0ZPUkNFX0xHSSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChtYXNrLT5jb250cm9sW2JhbmRdLmxlZ2FjeSA9PSAwKSB7CisJCQkvKiBkb24ndCBhbGxvdyBlbXB0eSBsZWdhY3kgcmF0ZXMgaWYgSFQgb3IgVkhUCisJCQkgKiBhcmUgbm90IGV2ZW4gc3VwcG9ydGVkLgorCQkJICovCisJCQlpZiAoIShyZGV2LT53aXBoeS5iYW5kc1tiYW5kXS0+aHRfY2FwLmh0X3N1cHBvcnRlZCB8fAorCQkJICAgICAgcmRldi0+d2lwaHkuYmFuZHNbYmFuZF0tPnZodF9jYXAudmh0X3N1cHBvcnRlZCkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBJRUVFODAyMTFfSFRfTUNTX01BU0tfTEVOOyBpKyspCisJCQkJaWYgKG1hc2stPmNvbnRyb2xbYmFuZF0uaHRfbWNzW2ldKQorCQkJCQlnb3RvIG91dDsKKworCQkJZm9yIChpID0gMDsgaSA8IE5MODAyMTFfVkhUX05TU19NQVg7IGkrKykKKwkJCQlpZiAobWFzay0+Y29udHJvbFtiYW5kXS52aHRfbWNzW2ldKQorCQkJCQlnb3RvIG91dDsKKworCQkJLyogbGVnYWN5IGFuZCBtY3MgcmF0ZXMgbWF5IG5vdCBiZSBib3RoIGVtcHR5ICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworb3V0OgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZhbGlkYXRlX2JlYWNvbl90eF9yYXRlKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKKwkJCQkgICBlbnVtIG5sODAyMTFfYmFuZCBiYW5kLAorCQkJCSAgIHN0cnVjdCBjZmc4MDIxMV9iaXRyYXRlX21hc2sgKmJlYWNvbl9yYXRlKQoreworCXUzMiBjb3VudF9odCwgY291bnRfdmh0LCBpOworCXUzMiByYXRlID0gYmVhY29uX3JhdGUtPmNvbnRyb2xbYmFuZF0ubGVnYWN5OworCisJLyogQWxsb3cgb25seSBvbmUgcmF0ZSAqLworCWlmIChod2VpZ2h0MzIocmF0ZSkgPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNvdW50X2h0ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgSUVFRTgwMjExX0hUX01DU19NQVNLX0xFTjsgaSsrKSB7CisJCWlmIChod2VpZ2h0OChiZWFjb25fcmF0ZS0+Y29udHJvbFtiYW5kXS5odF9tY3NbaV0pID4gMSkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSBpZiAoYmVhY29uX3JhdGUtPmNvbnRyb2xbYmFuZF0uaHRfbWNzW2ldKSB7CisJCQljb3VudF9odCsrOworCQkJaWYgKGNvdW50X2h0ID4gMSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoY291bnRfaHQgJiYgcmF0ZSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNvdW50X3ZodCA9IDA7CisJZm9yIChpID0gMDsgaSA8IE5MODAyMTFfVkhUX05TU19NQVg7IGkrKykgeworCQlpZiAoaHdlaWdodDE2KGJlYWNvbl9yYXRlLT5jb250cm9sW2JhbmRdLnZodF9tY3NbaV0pID4gMSkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSBpZiAoYmVhY29uX3JhdGUtPmNvbnRyb2xbYmFuZF0udmh0X21jc1tpXSkgeworCQkJY291bnRfdmh0Kys7CisJCQlpZiAoY291bnRfdmh0ID4gMSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoY291bnRfdmh0ICYmIHJhdGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKGNvdW50X2h0ICYmIGNvdW50X3ZodCkgfHwgKCFyYXRlICYmICFjb3VudF9odCAmJiAhY291bnRfdmh0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocmF0ZSAmJgorCSAgICAhd2lwaHlfZXh0X2ZlYXR1cmVfaXNzZXQoJnJkZXYtPndpcGh5LAorCQkJCSAgICAgTkw4MDIxMV9FWFRfRkVBVFVSRV9CRUFDT05fUkFURV9MRUdBQ1kpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY291bnRfaHQgJiYKKwkgICAgIXdpcGh5X2V4dF9mZWF0dXJlX2lzc2V0KCZyZGV2LT53aXBoeSwKKwkJCQkgICAgIE5MODAyMTFfRVhUX0ZFQVRVUkVfQkVBQ09OX1JBVEVfSFQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY291bnRfdmh0ICYmCisJICAgICF3aXBoeV9leHRfZmVhdHVyZV9pc3NldCgmcmRldi0+d2lwaHksCisJCQkJICAgICBOTDgwMjExX0VYVF9GRUFUVVJFX0JFQUNPTl9SQVRFX1ZIVCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgbmw4MDIxMV9wYXJzZV9iZWFjb24oc3RydWN0IG5sYXR0ciAqYXR0cnNbXSwKIAkJCQlzdHJ1Y3QgY2ZnODAyMTFfYmVhY29uX2RhdGEgKmJjbikKIHsKQEAgLTM1NDUsNiArMzg5NCwxNyBAQAogCQkJCQkgICB3ZGV2LT5pZnR5cGUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfVFhfUkFURVNdKSB7CisJCWVyciA9IG5sODAyMTFfcGFyc2VfdHhfYml0cmF0ZV9tYXNrKGluZm8sICZwYXJhbXMuYmVhY29uX3JhdGUpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQllcnIgPSB2YWxpZGF0ZV9iZWFjb25fdHhfcmF0ZShyZGV2LCBwYXJhbXMuY2hhbmRlZi5jaGFuLT5iYW5kLAorCQkJCQkgICAgICAmcGFyYW1zLmJlYWNvbl9yYXRlKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCiAJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9TTVBTX01PREVdKSB7CiAJCXBhcmFtcy5zbXBzX21vZGUgPQogCQkJbmxhX2dldF91OChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfU01QU19NT0RFXSk7CkBAIC01Mzc0LDEyICs1NzM0LDI1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgbmw4MDIxMV9jaGVja19wb3dlcl9tb2RlKGNvbnN0IHN0cnVjdCBubGF0dHIgKm5sYSwKKwkJCQkgICAgZW51bSBubDgwMjExX21lc2hfcG93ZXJfbW9kZSBtaW4sCisJCQkJICAgIGVudW0gbmw4MDIxMV9tZXNoX3Bvd2VyX21vZGUgbWF4LAorCQkJCSAgICBlbnVtIG5sODAyMTFfbWVzaF9wb3dlcl9tb2RlICpvdXQpCit7CisJdTMyIHZhbCA9IG5sYV9nZXRfdTMyKG5sYSk7CisJaWYgKHZhbCA8IG1pbiB8fCB2YWwgPiBtYXgpCisJCXJldHVybiAtRUlOVkFMOworCSpvdXQgPSB2YWw7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgbmw4MDIxMV9wYXJzZV9tZXNoX2NvbmZpZyhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvLAogCQkJCSAgICAgc3RydWN0IG1lc2hfY29uZmlnICpjZmcsCiAJCQkJICAgICB1MzIgKm1hc2tfb3V0KQogewogCXN0cnVjdCBubGF0dHIgKnRiW05MODAyMTFfTUVTSENPTkZfQVRUUl9NQVggKyAxXTsKIAl1MzIgbWFzayA9IDA7CisJdTE2IGh0X29wbW9kZTsKIAogI2RlZmluZSBGSUxMX0lOX01FU0hfUEFSQU1fSUZfU0VUKHRiLCBjZmcsIHBhcmFtLCBtaW4sIG1heCwgbWFzaywgYXR0ciwgZm4pIFwKIGRvIHsJCQkJCQkJCQkgICAgXApAQCAtNTQ3MSw5ICs1ODQ0LDM2IEBACiAJRklMTF9JTl9NRVNIX1BBUkFNX0lGX1NFVCh0YiwgY2ZnLCByc3NpX3RocmVzaG9sZCwgLTI1NSwgMCwKIAkJCQkgIG1hc2ssIE5MODAyMTFfTUVTSENPTkZfUlNTSV9USFJFU0hPTEQsCiAJCQkJICBubDgwMjExX2NoZWNrX3MzMik7Ci0JRklMTF9JTl9NRVNIX1BBUkFNX0lGX1NFVCh0YiwgY2ZnLCBodF9vcG1vZGUsIDAsIDE2LAotCQkJCSAgbWFzaywgTkw4MDIxMV9NRVNIQ09ORl9IVF9PUE1PREUsCi0JCQkJICBubDgwMjExX2NoZWNrX3UxNik7CisJLyoKKwkgKiBDaGVjayBIVCBvcGVyYXRpb24gbW9kZSBiYXNlZCBvbgorCSAqIElFRUUgODAyLjExIDIwMTIgOC40LjIuNTkgSFQgT3BlcmF0aW9uIGVsZW1lbnQuCisJICovCisJaWYgKHRiW05MODAyMTFfTUVTSENPTkZfSFRfT1BNT0RFXSkgeworCQlodF9vcG1vZGUgPSBubGFfZ2V0X3UxNih0YltOTDgwMjExX01FU0hDT05GX0hUX09QTU9ERV0pOworCisJCWlmIChodF9vcG1vZGUgJiB+KElFRUU4MDIxMV9IVF9PUF9NT0RFX1BST1RFQ1RJT04gfAorCQkJCSAgSUVFRTgwMjExX0hUX09QX01PREVfTk9OX0dGX1NUQV9QUlNOVCB8CisJCQkJICBJRUVFODAyMTFfSFRfT1BfTU9ERV9OT05fSFRfU1RBX1BSU05UKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmICgoaHRfb3Btb2RlICYgSUVFRTgwMjExX0hUX09QX01PREVfTk9OX0dGX1NUQV9QUlNOVCkgJiYKKwkJICAgIChodF9vcG1vZGUgJiBJRUVFODAyMTFfSFRfT1BfTU9ERV9OT05fSFRfU1RBX1BSU05UKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXN3aXRjaCAoaHRfb3Btb2RlICYgSUVFRTgwMjExX0hUX09QX01PREVfUFJPVEVDVElPTikgeworCQljYXNlIElFRUU4MDIxMV9IVF9PUF9NT0RFX1BST1RFQ1RJT05fTk9ORToKKwkJY2FzZSBJRUVFODAyMTFfSFRfT1BfTU9ERV9QUk9URUNUSU9OXzIwTUhaOgorCQkJaWYgKGh0X29wbW9kZSAmIElFRUU4MDIxMV9IVF9PUF9NT0RFX05PTl9IVF9TVEFfUFJTTlQpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJY2FzZSBJRUVFODAyMTFfSFRfT1BfTU9ERV9QUk9URUNUSU9OX05PTk1FTUJFUjoKKwkJY2FzZSBJRUVFODAyMTFfSFRfT1BfTU9ERV9QUk9URUNUSU9OX05PTkhUX01JWEVEOgorCQkJaWYgKCEoaHRfb3Btb2RlICYgSUVFRTgwMjExX0hUX09QX01PREVfTk9OX0hUX1NUQV9QUlNOVCkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQljZmctPmh0X29wbW9kZSA9IGh0X29wbW9kZTsKKwl9CiAJRklMTF9JTl9NRVNIX1BBUkFNX0lGX1NFVCh0YiwgY2ZnLCBkb3QxMU1lc2hIV01QYWN0aXZlUGF0aFRvUm9vdFRpbWVvdXQsCiAJCQkJICAxLCA2NTUzNSwgbWFzaywKIAkJCQkgIE5MODAyMTFfTUVTSENPTkZfSFdNUF9QQVRIX1RPX1JPT1RfVElNRU9VVCwKQEAgLTU0OTAsNyArNTg5MCw3IEBACiAJCQkJICBOTDgwMjExX01FU0hfUE9XRVJfQUNUSVZFLAogCQkJCSAgTkw4MDIxMV9NRVNIX1BPV0VSX01BWCwKIAkJCQkgIG1hc2ssIE5MODAyMTFfTUVTSENPTkZfUE9XRVJfTU9ERSwKLQkJCQkgIG5sODAyMTFfY2hlY2tfdTMyKTsKKwkJCQkgIG5sODAyMTFfY2hlY2tfcG93ZXJfbW9kZSk7CiAJRklMTF9JTl9NRVNIX1BBUkFNX0lGX1NFVCh0YiwgY2ZnLCBkb3QxMU1lc2hBd2FrZVdpbmRvd0R1cmF0aW9uLAogCQkJCSAgMCwgNjU1MzUsIG1hc2ssCiAJCQkJICBOTDgwMjExX01FU0hDT05GX0FXQUtFX1dJTkRPVywgbmw4MDIxMV9jaGVja191MTYpOwpAQCAtNjA3NCw2ICs2NDc0LDkgQEAKIAogCXdpcGh5ID0gJnJkZXYtPndpcGh5OwogCisJaWYgKHdkZXYtPmlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9OQU4pCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwogCWlmICghcmRldi0+b3BzLT5zY2FuKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKQEAgLTY5NTAsNyArNzM1Myw3IEBACiAKIAkJcGFyYW1zLm5fY291bnRlcl9vZmZzZXRzX3ByZXNwID0gbGVuIC8gc2l6ZW9mKHUxNik7CiAJCWlmIChyZGV2LT53aXBoeS5tYXhfbnVtX2NzYV9jb3VudGVycyAmJgotCQkgICAgKHBhcmFtcy5uX2NvdW50ZXJfb2Zmc2V0c19iZWFjb24gPgorCQkgICAgKHBhcmFtcy5uX2NvdW50ZXJfb2Zmc2V0c19wcmVzcCA+CiAJCSAgICAgcmRldi0+d2lwaHkubWF4X251bV9jc2FfY291bnRlcnMpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTczNDAsNyArNzc0Myw3IEBACiAJCSAgICAoa2V5LnAuY2lwaGVyICE9IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCB8fAogCQkgICAgIGtleS5wLmtleV9sZW4gIT0gV0xBTl9LRVlfTEVOX1dFUDEwNCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKGtleS5pZHggPiA0KQorCQlpZiAoa2V5LmlkeCA+IDMpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9IGVsc2UgewogCQlrZXkucC5rZXlfbGVuID0gMDsKQEAgLTc3NDUsMTIgKzgxNDgsMTMgQEAKIAogCWlic3MuYmVhY29uX2ludGVydmFsID0gMTAwOwogCi0JaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9CRUFDT05fSU5URVJWQUxdKSB7CisJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9CRUFDT05fSU5URVJWQUxdKQogCQlpYnNzLmJlYWNvbl9pbnRlcnZhbCA9CiAJCQlubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfQkVBQ09OX0lOVEVSVkFMXSk7Ci0JCWlmIChpYnNzLmJlYWNvbl9pbnRlcnZhbCA8IDEgfHwgaWJzcy5iZWFjb25faW50ZXJ2YWwgPiAxMDAwMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KKworCWVyciA9IGNmZzgwMjExX3ZhbGlkYXRlX2JlYWNvbl9pbnQocmRldiwgaWJzcy5iZWFjb25faW50ZXJ2YWwpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlpZiAoIXJkZXYtPm9wcy0+am9pbl9pYnNzKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CkBAIC03OTU3LDYgKzgzNjEsOCBAQAogCX0KIAogCWRhdGEgPSBubGFfbmVzdF9zdGFydChza2IsIGF0dHIpOworCWlmICghZGF0YSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKIAkoKHZvaWQgKiopc2tiLT5jYilbMF0gPSByZGV2OwogCSgodm9pZCAqKilza2ItPmNiKVsxXSA9IGhkcjsKQEAgLTg1NzQsMjM4ICs4OTgwLDIxIEBACiAJcmV0dXJuIHJkZXZfY2FuY2VsX3JlbWFpbl9vbl9jaGFubmVsKHJkZXYsIHdkZXYsIGNvb2tpZSk7CiB9CiAKLXN0YXRpYyB1MzIgcmF0ZXNldF90b19tYXNrKHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAotCQkJICAgdTggKnJhdGVzLCB1OCByYXRlc19sZW4pCi17Ci0JdTggaTsKLQl1MzIgbWFzayA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcmF0ZXNfbGVuOyBpKyspIHsKLQkJaW50IHJhdGUgPSAocmF0ZXNbaV0gJiAweDdmKSAqIDU7Ci0JCWludCByaWR4OwotCi0JCWZvciAocmlkeCA9IDA7IHJpZHggPCBzYmFuZC0+bl9iaXRyYXRlczsgcmlkeCsrKSB7Ci0JCQlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnNyYXRlID0KLQkJCQkmc2JhbmQtPmJpdHJhdGVzW3JpZHhdOwotCQkJaWYgKHJhdGUgPT0gc3JhdGUtPmJpdHJhdGUpIHsKLQkJCQltYXNrIHw9IDEgPDwgcmlkeDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAocmlkeCA9PSBzYmFuZC0+bl9iaXRyYXRlcykKLQkJCXJldHVybiAwOyAvKiByYXRlIG5vdCBmb3VuZCAqLwotCX0KLQotCXJldHVybiBtYXNrOwotfQotCi1zdGF0aWMgYm9vbCBodF9yYXRlc2V0X3RvX21hc2soc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCi0JCQkgICAgICAgdTggKnJhdGVzLCB1OCByYXRlc19sZW4sCi0JCQkgICAgICAgdTggbWNzW0lFRUU4MDIxMV9IVF9NQ1NfTUFTS19MRU5dKQotewotCXU4IGk7Ci0KLQltZW1zZXQobWNzLCAwLCBJRUVFODAyMTFfSFRfTUNTX01BU0tfTEVOKTsKLQotCWZvciAoaSA9IDA7IGkgPCByYXRlc19sZW47IGkrKykgewotCQlpbnQgcmlkeCwgcmJpdDsKLQotCQlyaWR4ID0gcmF0ZXNbaV0gLyA4OwotCQlyYml0ID0gQklUKHJhdGVzW2ldICUgOCk7Ci0KLQkJLyogY2hlY2sgdmFsaWRpdHkgKi8KLQkJaWYgKChyaWR4IDwgMCkgfHwgKHJpZHggPj0gSUVFRTgwMjExX0hUX01DU19NQVNLX0xFTikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLyogY2hlY2sgYXZhaWxhYmlsaXR5ICovCi0JCWlmIChzYmFuZC0+aHRfY2FwLm1jcy5yeF9tYXNrW3JpZHhdICYgcmJpdCkKLQkJCW1jc1tyaWR4XSB8PSByYml0OwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB1MTYgdmh0X21jc19tYXBfdG9fbWNzX21hc2sodTggdmh0X21jc19tYXApCi17Ci0JdTE2IG1jc19tYXNrID0gMDsKLQotCXN3aXRjaCAodmh0X21jc19tYXApIHsKLQljYXNlIElFRUU4MDIxMV9WSFRfTUNTX05PVF9TVVBQT1JURUQ6Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX1ZIVF9NQ1NfU1VQUE9SVF8wXzc6Ci0JCW1jc19tYXNrID0gMHgwMEZGOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9WSFRfTUNTX1NVUFBPUlRfMF84OgotCQltY3NfbWFzayA9IDB4MDFGRjsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfVkhUX01DU19TVVBQT1JUXzBfOToKLQkJbWNzX21hc2sgPSAweDAzRkY7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBtY3NfbWFzazsKLX0KLQotc3RhdGljIHZvaWQgdmh0X2J1aWxkX21jc19tYXNrKHUxNiB2aHRfbWNzX21hcCwKLQkJCSAgICAgICB1MTYgdmh0X21jc19tYXNrW05MODAyMTFfVkhUX05TU19NQVhdKQotewotCXU4IG5zczsKLQotCWZvciAobnNzID0gMDsgbnNzIDwgTkw4MDIxMV9WSFRfTlNTX01BWDsgbnNzKyspIHsKLQkJdmh0X21jc19tYXNrW25zc10gPSB2aHRfbWNzX21hcF90b19tY3NfbWFzayh2aHRfbWNzX21hcCAmIDB4MDMpOwotCQl2aHRfbWNzX21hcCA+Pj0gMjsKLQl9Ci19Ci0KLXN0YXRpYyBib29sIHZodF9zZXRfbWNzX21hc2soc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCi0JCQkgICAgIHN0cnVjdCBubDgwMjExX3R4cmF0ZV92aHQgKnR4cmF0ZSwKLQkJCSAgICAgdTE2IG1jc1tOTDgwMjExX1ZIVF9OU1NfTUFYXSkKLXsKLQl1MTYgdHhfbWNzX21hcCA9IGxlMTZfdG9fY3B1KHNiYW5kLT52aHRfY2FwLnZodF9tY3MudHhfbWNzX21hcCk7Ci0JdTE2IHR4X21jc19tYXNrW05MODAyMTFfVkhUX05TU19NQVhdID0ge307Ci0JdTggaTsKLQotCWlmICghc2JhbmQtPnZodF9jYXAudmh0X3N1cHBvcnRlZCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JbWVtc2V0KG1jcywgMCwgc2l6ZW9mKHUxNikgKiBOTDgwMjExX1ZIVF9OU1NfTUFYKTsKLQotCS8qIEJ1aWxkIHZodF9tY3NfbWFzayBmcm9tIFZIVCBjYXBhYmlsaXRpZXMgKi8KLQl2aHRfYnVpbGRfbWNzX21hc2sodHhfbWNzX21hcCwgdHhfbWNzX21hc2spOwotCi0JZm9yIChpID0gMDsgaSA8IE5MODAyMTFfVkhUX05TU19NQVg7IGkrKykgewotCQlpZiAoKHR4X21jc19tYXNrW2ldICYgdHhyYXRlLT5tY3NbaV0pID09IHR4cmF0ZS0+bWNzW2ldKQotCQkJbWNzW2ldID0gdHhyYXRlLT5tY3NbaV07Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5sODAyMTFfdHhhdHRyX3BvbGljeVtOTDgwMjExX1RYUkFURV9NQVggKyAxXSA9IHsKLQlbTkw4MDIxMV9UWFJBVEVfTEVHQUNZXSA9IHsgLnR5cGUgPSBOTEFfQklOQVJZLAotCQkJCSAgICAubGVuID0gTkw4MDIxMV9NQVhfU1VQUF9SQVRFUyB9LAotCVtOTDgwMjExX1RYUkFURV9IVF0gPSB7IC50eXBlID0gTkxBX0JJTkFSWSwKLQkJCQkubGVuID0gTkw4MDIxMV9NQVhfU1VQUF9IVF9SQVRFUyB9LAotCVtOTDgwMjExX1RYUkFURV9WSFRdID0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCBubDgwMjExX3R4cmF0ZV92aHQpfSwKLQlbTkw4MDIxMV9UWFJBVEVfR0ldID0geyAudHlwZSA9IE5MQV9VOCB9LAotfTsKLQogc3RhdGljIGludCBubDgwMjExX3NldF90eF9iaXRyYXRlX21hc2soc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgICAgICAgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgbmxhdHRyICp0YltOTDgwMjExX1RYUkFURV9NQVggKyAxXTsKLQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSBpbmZvLT51c2VyX3B0clswXTsKIAlzdHJ1Y3QgY2ZnODAyMTFfYml0cmF0ZV9tYXNrIG1hc2s7Ci0JaW50IHJlbSwgaTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSBpbmZvLT51c2VyX3B0clswXTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaW5mby0+dXNlcl9wdHJbMV07Ci0Jc3RydWN0IG5sYXR0ciAqdHhfcmF0ZXM7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7Ci0JdTE2IHZodF90eF9tY3NfbWFwOworCWludCBlcnI7CiAKIAlpZiAoIXJkZXYtPm9wcy0+c2V0X2JpdHJhdGVfbWFzaykKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JbWVtc2V0KCZtYXNrLCAwLCBzaXplb2YobWFzaykpOwotCS8qIERlZmF1bHQgdG8gYWxsIHJhdGVzIGVuYWJsZWQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX05MODAyMTFfQkFORFM7IGkrKykgewotCQlzYmFuZCA9IHJkZXYtPndpcGh5LmJhbmRzW2ldOworCWVyciA9IG5sODAyMTFfcGFyc2VfdHhfYml0cmF0ZV9tYXNrKGluZm8sICZtYXNrKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCi0JCWlmICghc2JhbmQpCi0JCQljb250aW51ZTsKLQotCQltYXNrLmNvbnRyb2xbaV0ubGVnYWN5ID0gKDEgPDwgc2JhbmQtPm5fYml0cmF0ZXMpIC0gMTsKLQkJbWVtY3B5KG1hc2suY29udHJvbFtpXS5odF9tY3MsCi0JCSAgICAgICBzYmFuZC0+aHRfY2FwLm1jcy5yeF9tYXNrLAotCQkgICAgICAgc2l6ZW9mKG1hc2suY29udHJvbFtpXS5odF9tY3MpKTsKLQotCQlpZiAoIXNiYW5kLT52aHRfY2FwLnZodF9zdXBwb3J0ZWQpCi0JCQljb250aW51ZTsKLQotCQl2aHRfdHhfbWNzX21hcCA9IGxlMTZfdG9fY3B1KHNiYW5kLT52aHRfY2FwLnZodF9tY3MudHhfbWNzX21hcCk7Ci0JCXZodF9idWlsZF9tY3NfbWFzayh2aHRfdHhfbWNzX21hcCwgbWFzay5jb250cm9sW2ldLnZodF9tY3MpOwotCX0KLQotCS8qIGlmIG5vIHJhdGVzIGFyZSBnaXZlbiBzZXQgaXQgYmFjayB0byB0aGUgZGVmYXVsdHMgKi8KLQlpZiAoIWluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9UWF9SQVRFU10pCi0JCWdvdG8gb3V0OwotCi0JLyoKLQkgKiBUaGUgbmVzdGVkIGF0dHJpYnV0ZSB1c2VzIGVudW0gbmw4MDIxMV9iYW5kIGFzIHRoZSBpbmRleC4gVGhpcyBtYXBzCi0JICogZGlyZWN0bHkgdG8gdGhlIGVudW0gbmw4MDIxMV9iYW5kIHZhbHVlcyB1c2VkIGluIGNmZzgwMjExLgotCSAqLwotCUJVSUxEX0JVR19PTihOTDgwMjExX01BWF9TVVBQX0hUX1JBVEVTID4gSUVFRTgwMjExX0hUX01DU19NQVNLX0xFTiAqIDgpOwotCW5sYV9mb3JfZWFjaF9uZXN0ZWQodHhfcmF0ZXMsIGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9UWF9SQVRFU10sIHJlbSkgewotCQllbnVtIG5sODAyMTFfYmFuZCBiYW5kID0gbmxhX3R5cGUodHhfcmF0ZXMpOwotCQlpbnQgZXJyOwotCi0JCWlmIChiYW5kIDwgMCB8fCBiYW5kID49IE5VTV9OTDgwMjExX0JBTkRTKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXNiYW5kID0gcmRldi0+d2lwaHkuYmFuZHNbYmFuZF07Ci0JCWlmIChzYmFuZCA9PSBOVUxMKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWVyciA9IG5sYV9wYXJzZSh0YiwgTkw4MDIxMV9UWFJBVEVfTUFYLCBubGFfZGF0YSh0eF9yYXRlcyksCi0JCQkJbmxhX2xlbih0eF9yYXRlcyksIG5sODAyMTFfdHhhdHRyX3BvbGljeSk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCQlpZiAodGJbTkw4MDIxMV9UWFJBVEVfTEVHQUNZXSkgewotCQkJbWFzay5jb250cm9sW2JhbmRdLmxlZ2FjeSA9IHJhdGVzZXRfdG9fbWFzaygKLQkJCQlzYmFuZCwKLQkJCQlubGFfZGF0YSh0YltOTDgwMjExX1RYUkFURV9MRUdBQ1ldKSwKLQkJCQlubGFfbGVuKHRiW05MODAyMTFfVFhSQVRFX0xFR0FDWV0pKTsKLQkJCWlmICgobWFzay5jb250cm9sW2JhbmRdLmxlZ2FjeSA9PSAwKSAmJgotCQkJICAgIG5sYV9sZW4odGJbTkw4MDIxMV9UWFJBVEVfTEVHQUNZXSkpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJaWYgKHRiW05MODAyMTFfVFhSQVRFX0hUXSkgewotCQkJaWYgKCFodF9yYXRlc2V0X3RvX21hc2soCi0JCQkJCXNiYW5kLAotCQkJCQlubGFfZGF0YSh0YltOTDgwMjExX1RYUkFURV9IVF0pLAotCQkJCQlubGFfbGVuKHRiW05MODAyMTFfVFhSQVRFX0hUXSksCi0JCQkJCW1hc2suY29udHJvbFtiYW5kXS5odF9tY3MpKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWlmICh0YltOTDgwMjExX1RYUkFURV9WSFRdKSB7Ci0JCQlpZiAoIXZodF9zZXRfbWNzX21hc2soCi0JCQkJCXNiYW5kLAotCQkJCQlubGFfZGF0YSh0YltOTDgwMjExX1RYUkFURV9WSFRdKSwKLQkJCQkJbWFzay5jb250cm9sW2JhbmRdLnZodF9tY3MpKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWlmICh0YltOTDgwMjExX1RYUkFURV9HSV0pIHsKLQkJCW1hc2suY29udHJvbFtiYW5kXS5naSA9Ci0JCQkJbmxhX2dldF91OCh0YltOTDgwMjExX1RYUkFURV9HSV0pOwotCQkJaWYgKG1hc2suY29udHJvbFtiYW5kXS5naSA+IE5MODAyMTFfVFhSQVRFX0ZPUkNFX0xHSSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWlmIChtYXNrLmNvbnRyb2xbYmFuZF0ubGVnYWN5ID09IDApIHsKLQkJCS8qIGRvbid0IGFsbG93IGVtcHR5IGxlZ2FjeSByYXRlcyBpZiBIVCBvciBWSFQKLQkJCSAqIGFyZSBub3QgZXZlbiBzdXBwb3J0ZWQuCi0JCQkgKi8KLQkJCWlmICghKHJkZXYtPndpcGh5LmJhbmRzW2JhbmRdLT5odF9jYXAuaHRfc3VwcG9ydGVkIHx8Ci0JCQkgICAgICByZGV2LT53aXBoeS5iYW5kc1tiYW5kXS0+dmh0X2NhcC52aHRfc3VwcG9ydGVkKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJZm9yIChpID0gMDsgaSA8IElFRUU4MDIxMV9IVF9NQ1NfTUFTS19MRU47IGkrKykKLQkJCQlpZiAobWFzay5jb250cm9sW2JhbmRdLmh0X21jc1tpXSkKLQkJCQkJZ290byBvdXQ7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCBOTDgwMjExX1ZIVF9OU1NfTUFYOyBpKyspCi0JCQkJaWYgKG1hc2suY29udHJvbFtiYW5kXS52aHRfbWNzW2ldKQotCQkJCQlnb3RvIG91dDsKLQotCQkJLyogbGVnYWN5IGFuZCBtY3MgcmF0ZXMgbWF5IG5vdCBiZSBib3RoIGVtcHR5ICovCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQotb3V0OgogCXJldHVybiByZGV2X3NldF9iaXRyYXRlX21hc2socmRldiwgZGV2LCBOVUxMLCAmbWFzayk7CiB9CiAKQEAgLTg4MzEsNiArOTAyMCw3IEBACiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFOgogCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX05BTjoKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQpAQCAtODg3Niw2ICs5MDY2LDcgQEAKIAljYXNlIE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQ6CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086CiAJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfTkFOOgogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CkBAIC04OTkyLDYgKzkxODMsNyBAQAogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0dPOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRToKIAkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9OQU46CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KQEAgLTkyMjQsOSArOTQxNiwxMCBAQAogCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfQkVBQ09OX0lOVEVSVkFMXSkgewogCQlzZXR1cC5iZWFjb25faW50ZXJ2YWwgPQogCQkJbmxhX2dldF91MzIoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0JFQUNPTl9JTlRFUlZBTF0pOwotCQlpZiAoc2V0dXAuYmVhY29uX2ludGVydmFsIDwgMTAgfHwKLQkJICAgIHNldHVwLmJlYWNvbl9pbnRlcnZhbCA+IDEwMDAwKQotCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJZXJyID0gY2ZnODAyMTFfdmFsaWRhdGVfYmVhY29uX2ludChyZGV2LCBzZXR1cC5iZWFjb25faW50ZXJ2YWwpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAl9CiAKIAlpZiAoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0RUSU1fUEVSSU9EXSkgewpAQCAtOTI3Miw2ICs5NDY1LDE3IEBACiAJCQlyZXR1cm4gZXJyOwogCX0KIAorCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfVFhfUkFURVNdKSB7CisJCWVyciA9IG5sODAyMTFfcGFyc2VfdHhfYml0cmF0ZV9tYXNrKGluZm8sICZzZXR1cC5iZWFjb25fcmF0ZSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCWVyciA9IHZhbGlkYXRlX2JlYWNvbl90eF9yYXRlKHJkZXYsIHNldHVwLmNoYW5kZWYuY2hhbi0+YmFuZCwKKwkJCQkJICAgICAgJnNldHVwLmJlYWNvbl9yYXRlKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCiAJcmV0dXJuIGNmZzgwMjExX2pvaW5fbWVzaChyZGV2LCBkZXYsICZzZXR1cCwgJmNmZyk7CiB9CiAKQEAgLTkzODUsMTggKzk1ODksMjcgQEAKIAlpZiAoIWZyZXFzKQogCQlyZXR1cm4gLUVOT0JVRlM7CiAKLQlmb3IgKGkgPSAwOyBpIDwgcmVxLT5uX2NoYW5uZWxzOyBpKyspCi0JCW5sYV9wdXRfdTMyKG1zZywgaSwgcmVxLT5jaGFubmVsc1tpXS0+Y2VudGVyX2ZyZXEpOworCWZvciAoaSA9IDA7IGkgPCByZXEtPm5fY2hhbm5lbHM7IGkrKykgeworCQlpZiAobmxhX3B1dF91MzIobXNnLCBpLCByZXEtPmNoYW5uZWxzW2ldLT5jZW50ZXJfZnJlcSkpCisJCQlyZXR1cm4gLUVOT0JVRlM7CisJfQogCiAJbmxhX25lc3RfZW5kKG1zZywgZnJlcXMpOwogCiAJaWYgKHJlcS0+bl9tYXRjaF9zZXRzKSB7CiAJCW1hdGNoZXMgPSBubGFfbmVzdF9zdGFydChtc2csIE5MODAyMTFfQVRUUl9TQ0hFRF9TQ0FOX01BVENIKTsKKwkJaWYgKCFtYXRjaGVzKQorCQkJcmV0dXJuIC1FTk9CVUZTOworCiAJCWZvciAoaSA9IDA7IGkgPCByZXEtPm5fbWF0Y2hfc2V0czsgaSsrKSB7CiAJCQltYXRjaCA9IG5sYV9uZXN0X3N0YXJ0KG1zZywgaSk7Ci0JCQlubGFfcHV0KG1zZywgTkw4MDIxMV9TQ0hFRF9TQ0FOX01BVENIX0FUVFJfU1NJRCwKLQkJCQlyZXEtPm1hdGNoX3NldHNbaV0uc3NpZC5zc2lkX2xlbiwKLQkJCQlyZXEtPm1hdGNoX3NldHNbaV0uc3NpZC5zc2lkKTsKKwkJCWlmICghbWF0Y2gpCisJCQkJcmV0dXJuIC1FTk9CVUZTOworCisJCQlpZiAobmxhX3B1dChtc2csIE5MODAyMTFfU0NIRURfU0NBTl9NQVRDSF9BVFRSX1NTSUQsCisJCQkJICAgIHJlcS0+bWF0Y2hfc2V0c1tpXS5zc2lkLnNzaWRfbGVuLAorCQkJCSAgICByZXEtPm1hdGNoX3NldHNbaV0uc3NpZC5zc2lkKSkKKwkJCQlyZXR1cm4gLUVOT0JVRlM7CiAJCQlubGFfbmVzdF9lbmQobXNnLCBtYXRjaCk7CiAJCX0KIAkJbmxhX25lc3RfZW5kKG1zZywgbWF0Y2hlcyk7CkBAIC05NDA4LDYgKzk2MjEsOSBAQAogCiAJZm9yIChpID0gMDsgaSA8IHJlcS0+bl9zY2FuX3BsYW5zOyBpKyspIHsKIAkJc2Nhbl9wbGFuID0gbmxhX25lc3Rfc3RhcnQobXNnLCBpICsgMSk7CisJCWlmICghc2Nhbl9wbGFuKQorCQkJcmV0dXJuIC1FTk9CVUZTOworCiAJCWlmICghc2Nhbl9wbGFuIHx8CiAJCSAgICBubGFfcHV0X3UzMihtc2csIE5MODAyMTFfU0NIRURfU0NBTl9QTEFOX0lOVEVSVkFMLAogCQkJCXJlcS0+c2Nhbl9wbGFuc1tpXS5pbnRlcnZhbCkgfHwKQEAgLTEwMzM0LDYgKzEwNTUwLDU0OSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG5sODAyMTFfc3RhcnRfbmFuKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gaW5mby0+dXNlcl9wdHJbMF07CisJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGluZm8tPnVzZXJfcHRyWzFdOworCXN0cnVjdCBjZmc4MDIxMV9uYW5fY29uZiBjb25mID0ge307CisJaW50IGVycjsKKworCWlmICh3ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTkFOKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAod2Rldi0+bmFuX3N0YXJ0ZWQpCisJCXJldHVybiAtRUVYSVNUOworCisJaWYgKHJma2lsbF9ibG9ja2VkKHJkZXYtPnJma2lsbCkpCisJCXJldHVybiAtRVJGS0lMTDsKKworCWlmICghaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX05BTl9NQVNURVJfUFJFRl0pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTkFOX0RVQUxdKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNvbmYubWFzdGVyX3ByZWYgPQorCQlubGFfZ2V0X3U4KGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9OQU5fTUFTVEVSX1BSRUZdKTsKKwlpZiAoIWNvbmYubWFzdGVyX3ByZWYpCisJCXJldHVybiAtRUlOVkFMOworCisJY29uZi5kdWFsID0gbmxhX2dldF91OChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTkFOX0RVQUxdKTsKKworCWVyciA9IHJkZXZfc3RhcnRfbmFuKHJkZXYsIHdkZXYsICZjb25mKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJd2Rldi0+bmFuX3N0YXJ0ZWQgPSB0cnVlOworCXJkZXYtPm9wZW5jb3VudCsrOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmw4MDIxMV9zdG9wX25hbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IGluZm8tPnVzZXJfcHRyWzBdOworCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBpbmZvLT51c2VyX3B0clsxXTsKKworCWlmICh3ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTkFOKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwljZmc4MDIxMV9zdG9wX25hbihyZGV2LCB3ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZhbGlkYXRlX25hbl9maWx0ZXIoc3RydWN0IG5sYXR0ciAqZmlsdGVyX2F0dHIpCit7CisJc3RydWN0IG5sYXR0ciAqYXR0cjsKKwlpbnQgbGVuID0gMCwgbl9lbnRyaWVzID0gMCwgcmVtOworCisJbmxhX2Zvcl9lYWNoX25lc3RlZChhdHRyLCBmaWx0ZXJfYXR0ciwgcmVtKSB7CisJCWxlbiArPSBubGFfbGVuKGF0dHIpOworCQluX2VudHJpZXMrKzsKKwl9CisKKwlpZiAobGVuID49IFU4X01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gbl9lbnRyaWVzOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9uYW5fZmlsdGVyKHN0cnVjdCBubGF0dHIgKmF0dHJfZmlsdGVyLAorCQkJICAgICBzdHJ1Y3QgY2ZnODAyMTFfbmFuX2Z1bmMgKmZ1bmMsCisJCQkgICAgIGJvb2wgdHgpCit7CisJc3RydWN0IG5sYXR0ciAqYXR0cjsKKwlpbnQgbl9lbnRyaWVzLCByZW0sIGk7CisJc3RydWN0IGNmZzgwMjExX25hbl9mdW5jX2ZpbHRlciAqZmlsdGVyOworCisJbl9lbnRyaWVzID0gdmFsaWRhdGVfbmFuX2ZpbHRlcihhdHRyX2ZpbHRlcik7CisJaWYgKG5fZW50cmllcyA8IDApCisJCXJldHVybiBuX2VudHJpZXM7CisKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKCpmdW5jLT5yeF9maWx0ZXJzKSAhPSBzaXplb2YoKmZ1bmMtPnR4X2ZpbHRlcnMpKTsKKworCWZpbHRlciA9IGtjYWxsb2Mobl9lbnRyaWVzLCBzaXplb2YoKmZ1bmMtPnJ4X2ZpbHRlcnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZpbHRlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpID0gMDsKKwlubGFfZm9yX2VhY2hfbmVzdGVkKGF0dHIsIGF0dHJfZmlsdGVyLCByZW0pIHsKKwkJZmlsdGVyW2ldLmZpbHRlciA9IGttZW1kdXAobmxhX2RhdGEoYXR0ciksIG5sYV9sZW4oYXR0ciksCisJCQkJCSAgIEdGUF9LRVJORUwpOworCQlmaWx0ZXJbaV0ubGVuID0gbmxhX2xlbihhdHRyKTsKKwkJaSsrOworCX0KKwlpZiAodHgpIHsKKwkJZnVuYy0+bnVtX3R4X2ZpbHRlcnMgPSBuX2VudHJpZXM7CisJCWZ1bmMtPnR4X2ZpbHRlcnMgPSBmaWx0ZXI7CisJfSBlbHNlIHsKKwkJZnVuYy0+bnVtX3J4X2ZpbHRlcnMgPSBuX2VudHJpZXM7CisJCWZ1bmMtPnJ4X2ZpbHRlcnMgPSBmaWx0ZXI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmw4MDIxMV9uYW5fYWRkX2Z1bmMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQlzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IGluZm8tPnVzZXJfcHRyWzBdOworCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBpbmZvLT51c2VyX3B0clsxXTsKKwlzdHJ1Y3QgbmxhdHRyICp0YltOVU1fTkw4MDIxMV9OQU5fRlVOQ19BVFRSXSwgKmZ1bmNfYXR0cjsKKwlzdHJ1Y3QgY2ZnODAyMTFfbmFuX2Z1bmMgKmZ1bmM7CisJc3RydWN0IHNrX2J1ZmYgKm1zZyA9IE5VTEw7CisJdm9pZCAqaGRyID0gTlVMTDsKKwlpbnQgZXJyID0gMDsKKworCWlmICh3ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTkFOKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoIXdkZXYtPm5hbl9zdGFydGVkKQorCQlyZXR1cm4gLUVOT1RDT05OOworCisJaWYgKCFpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTkFOX0ZVTkNdKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh3ZGV2LT5vd25lcl9ubHBvcnRpZCAmJgorCSAgICB3ZGV2LT5vd25lcl9ubHBvcnRpZCAhPSBpbmZvLT5zbmRfcG9ydGlkKQorCQlyZXR1cm4gLUVOT1RDT05OOworCisJZXJyID0gbmxhX3BhcnNlKHRiLCBOTDgwMjExX05BTl9GVU5DX0FUVFJfTUFYLAorCQkJbmxhX2RhdGEoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX05BTl9GVU5DXSksCisJCQlubGFfbGVuKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9OQU5fRlVOQ10pLAorCQkJbmw4MDIxMV9uYW5fZnVuY19wb2xpY3kpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlmdW5jID0ga3phbGxvYyhzaXplb2YoKmZ1bmMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZ1bmMpCisJCXJldHVybiAtRU5PTUVNOworCisJZnVuYy0+Y29va2llID0gd2Rldi0+d2lwaHktPmNvb2tpZV9jb3VudGVyKys7CisKKwlpZiAoIXRiW05MODAyMTFfTkFOX0ZVTkNfVFlQRV0gfHwKKwkgICAgbmxhX2dldF91OCh0YltOTDgwMjExX05BTl9GVU5DX1RZUEVdKSA+IE5MODAyMTFfTkFOX0ZVTkNfTUFYX1RZUEUpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisKKwlmdW5jLT50eXBlID0gbmxhX2dldF91OCh0YltOTDgwMjExX05BTl9GVU5DX1RZUEVdKTsKKworCWlmICghdGJbTkw4MDIxMV9OQU5fRlVOQ19TRVJWSUNFX0lEXSkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1jcHkoZnVuYy0+c2VydmljZV9pZCwgbmxhX2RhdGEodGJbTkw4MDIxMV9OQU5fRlVOQ19TRVJWSUNFX0lEXSksCisJICAgICAgIHNpemVvZihmdW5jLT5zZXJ2aWNlX2lkKSk7CisKKwlmdW5jLT5jbG9zZV9yYW5nZSA9CisJCW5sYV9nZXRfZmxhZyh0YltOTDgwMjExX05BTl9GVU5DX0NMT1NFX1JBTkdFXSk7CisKKwlpZiAodGJbTkw4MDIxMV9OQU5fRlVOQ19TRVJWSUNFX0lORk9dKSB7CisJCWZ1bmMtPnNlcnZfc3BlY19pbmZvX2xlbiA9CisJCQlubGFfbGVuKHRiW05MODAyMTFfTkFOX0ZVTkNfU0VSVklDRV9JTkZPXSk7CisJCWZ1bmMtPnNlcnZfc3BlY19pbmZvID0KKwkJCWttZW1kdXAobmxhX2RhdGEodGJbTkw4MDIxMV9OQU5fRlVOQ19TRVJWSUNFX0lORk9dKSwKKwkJCQlmdW5jLT5zZXJ2X3NwZWNfaW5mb19sZW4sCisJCQkJR0ZQX0tFUk5FTCk7CisJCWlmICghZnVuYy0+c2Vydl9zcGVjX2luZm8pIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmICh0YltOTDgwMjExX05BTl9GVU5DX1RUTF0pCisJCWZ1bmMtPnR0bCA9IG5sYV9nZXRfdTMyKHRiW05MODAyMTFfTkFOX0ZVTkNfVFRMXSk7CisKKwlzd2l0Y2ggKGZ1bmMtPnR5cGUpIHsKKwljYXNlIE5MODAyMTFfTkFOX0ZVTkNfUFVCTElTSDoKKwkJaWYgKCF0YltOTDgwMjExX05BTl9GVU5DX1BVQkxJU0hfVFlQRV0pIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWZ1bmMtPnB1Ymxpc2hfdHlwZSA9CisJCQlubGFfZ2V0X3U4KHRiW05MODAyMTFfTkFOX0ZVTkNfUFVCTElTSF9UWVBFXSk7CisJCWZ1bmMtPnB1Ymxpc2hfYmNhc3QgPQorCQkJbmxhX2dldF9mbGFnKHRiW05MODAyMTFfTkFOX0ZVTkNfUFVCTElTSF9CQ0FTVF0pOworCisJCWlmICgoIShmdW5jLT5wdWJsaXNoX3R5cGUgJiBOTDgwMjExX05BTl9TT0xJQ0lURURfUFVCTElTSCkpICYmCisJCQlmdW5jLT5wdWJsaXNoX2JjYXN0KSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX05BTl9GVU5DX1NVQlNDUklCRToKKwkJZnVuYy0+c3Vic2NyaWJlX2FjdGl2ZSA9CisJCQlubGFfZ2V0X2ZsYWcodGJbTkw4MDIxMV9OQU5fRlVOQ19TVUJTQ1JJQkVfQUNUSVZFXSk7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9OQU5fRlVOQ19GT0xMT1dfVVA6CisJCWlmICghdGJbTkw4MDIxMV9OQU5fRlVOQ19GT0xMT1dfVVBfSURdIHx8CisJCSAgICAhdGJbTkw4MDIxMV9OQU5fRlVOQ19GT0xMT1dfVVBfUkVRX0lEXSkgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZnVuYy0+Zm9sbG93dXBfaWQgPQorCQkJbmxhX2dldF91OCh0YltOTDgwMjExX05BTl9GVU5DX0ZPTExPV19VUF9JRF0pOworCQlmdW5jLT5mb2xsb3d1cF9yZXFpZCA9CisJCQlubGFfZ2V0X3U4KHRiW05MODAyMTFfTkFOX0ZVTkNfRk9MTE9XX1VQX1JFUV9JRF0pOworCQltZW1jcHkoZnVuYy0+Zm9sbG93dXBfZGVzdC5hZGRyLAorCQkgICAgICAgbmxhX2RhdGEodGJbTkw4MDIxMV9OQU5fRlVOQ19GT0xMT1dfVVBfREVTVF0pLAorCQkgICAgICAgc2l6ZW9mKGZ1bmMtPmZvbGxvd3VwX2Rlc3QuYWRkcikpOworCQlpZiAoZnVuYy0+dHRsKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHRiW05MODAyMTFfTkFOX0ZVTkNfU1JGXSkgeworCQlzdHJ1Y3QgbmxhdHRyICpzcmZfdGJbTlVNX05MODAyMTFfTkFOX1NSRl9BVFRSXTsKKworCQllcnIgPSBubGFfcGFyc2Uoc3JmX3RiLCBOTDgwMjExX05BTl9TUkZfQVRUUl9NQVgsCisJCQkJbmxhX2RhdGEodGJbTkw4MDIxMV9OQU5fRlVOQ19TUkZdKSwKKwkJCQlubGFfbGVuKHRiW05MODAyMTFfTkFOX0ZVTkNfU1JGXSksIE5VTEwpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisKKwkJZnVuYy0+c3JmX2luY2x1ZGUgPQorCQkJbmxhX2dldF9mbGFnKHNyZl90YltOTDgwMjExX05BTl9TUkZfSU5DTFVERV0pOworCisJCWlmIChzcmZfdGJbTkw4MDIxMV9OQU5fU1JGX0JGXSkgeworCQkJaWYgKHNyZl90YltOTDgwMjExX05BTl9TUkZfTUFDX0FERFJTXSB8fAorCQkJICAgICFzcmZfdGJbTkw4MDIxMV9OQU5fU1JGX0JGX0lEWF0pIHsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlmdW5jLT5zcmZfYmZfbGVuID0KKwkJCQlubGFfbGVuKHNyZl90YltOTDgwMjExX05BTl9TUkZfQkZdKTsKKwkJCWZ1bmMtPnNyZl9iZiA9CisJCQkJa21lbWR1cChubGFfZGF0YShzcmZfdGJbTkw4MDIxMV9OQU5fU1JGX0JGXSksCisJCQkJCWZ1bmMtPnNyZl9iZl9sZW4sIEdGUF9LRVJORUwpOworCQkJaWYgKCFmdW5jLT5zcmZfYmYpIHsKKwkJCQllcnIgPSAtRU5PTUVNOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlmdW5jLT5zcmZfYmZfaWR4ID0KKwkJCQlubGFfZ2V0X3U4KHNyZl90YltOTDgwMjExX05BTl9TUkZfQkZfSURYXSk7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgbmxhdHRyICphdHRyLCAqbWFjX2F0dHIgPQorCQkJCXNyZl90YltOTDgwMjExX05BTl9TUkZfTUFDX0FERFJTXTsKKwkJCWludCBuX2VudHJpZXMsIHJlbSwgaSA9IDA7CisKKwkJCWlmICghbWFjX2F0dHIpIHsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQluX2VudHJpZXMgPSB2YWxpZGF0ZV9hY2xfbWFjX2FkZHJzKG1hY19hdHRyKTsKKwkJCWlmIChuX2VudHJpZXMgPD0gMCkgeworCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCWZ1bmMtPnNyZl9udW1fbWFjcyA9IG5fZW50cmllczsKKwkJCWZ1bmMtPnNyZl9tYWNzID0KKwkJCQlremFsbG9jKHNpemVvZigqZnVuYy0+c3JmX21hY3MpICogbl9lbnRyaWVzLAorCQkJCQlHRlBfS0VSTkVMKTsKKwkJCWlmICghZnVuYy0+c3JmX21hY3MpIHsKKwkJCQllcnIgPSAtRU5PTUVNOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlubGFfZm9yX2VhY2hfbmVzdGVkKGF0dHIsIG1hY19hdHRyLCByZW0pCisJCQkJbWVtY3B5KGZ1bmMtPnNyZl9tYWNzW2krK10uYWRkciwgbmxhX2RhdGEoYXR0ciksCisJCQkJICAgICAgIHNpemVvZigqZnVuYy0+c3JmX21hY3MpKTsKKwkJfQorCX0KKworCWlmICh0YltOTDgwMjExX05BTl9GVU5DX1RYX01BVENIX0ZJTFRFUl0pIHsKKwkJZXJyID0gaGFuZGxlX25hbl9maWx0ZXIodGJbTkw4MDIxMV9OQU5fRlVOQ19UWF9NQVRDSF9GSUxURVJdLAorCQkJCQlmdW5jLCB0cnVlKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0KKworCWlmICh0YltOTDgwMjExX05BTl9GVU5DX1JYX01BVENIX0ZJTFRFUl0pIHsKKwkJZXJyID0gaGFuZGxlX25hbl9maWx0ZXIodGJbTkw4MDIxMV9OQU5fRlVOQ19SWF9NQVRDSF9GSUxURVJdLAorCQkJCQlmdW5jLCBmYWxzZSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwl9CisKKwltc2cgPSBubG1zZ19uZXcoTkxNU0dfREVGQVVMVF9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zZykgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwloZHIgPSBubDgwMjExaGRyX3B1dChtc2csIGluZm8tPnNuZF9wb3J0aWQsIGluZm8tPnNuZF9zZXEsIDAsCisJCQkgICAgIE5MODAyMTFfQ01EX0FERF9OQU5fRlVOQ1RJT04pOworCS8qIFRoaXMgY2FuJ3QgcmVhbGx5IGhhcHBlbiAtIHdlIGp1c3QgYWxsb2NhdGVkIDRLQiAqLworCWlmIChXQVJOX09OKCFoZHIpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IHJkZXZfYWRkX25hbl9mdW5jKHJkZXYsIHdkZXYsIGZ1bmMpOworb3V0OgorCWlmIChlcnIgPCAwKSB7CisJCWNmZzgwMjExX2ZyZWVfbmFuX2Z1bmMoZnVuYyk7CisJCW5sbXNnX2ZyZWUobXNnKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBwcm9wYWdhdGUgdGhlIGluc3RhbmNlIGlkIGFuZCBjb29raWUgdG8gdXNlcnNwYWNlICAqLworCWlmIChubGFfcHV0X3U2NF82NGJpdChtc2csIE5MODAyMTFfQVRUUl9DT09LSUUsIGZ1bmMtPmNvb2tpZSwKKwkJCSAgICAgIE5MODAyMTFfQVRUUl9QQUQpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWZ1bmNfYXR0ciA9IG5sYV9uZXN0X3N0YXJ0KG1zZywgTkw4MDIxMV9BVFRSX05BTl9GVU5DKTsKKwlpZiAoIWZ1bmNfYXR0cikKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlpZiAobmxhX3B1dF91OChtc2csIE5MODAyMTFfTkFOX0ZVTkNfSU5TVEFOQ0VfSUQsCisJCSAgICAgICBmdW5jLT5pbnN0YW5jZV9pZCkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJbmxhX25lc3RfZW5kKG1zZywgZnVuY19hdHRyKTsKKworCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKKwlyZXR1cm4gZ2VubG1zZ19yZXBseShtc2csIGluZm8pOworCitubGFfcHV0X2ZhaWx1cmU6CisJbmxtc2dfZnJlZShtc2cpOworCXJldHVybiAtRU5PQlVGUzsKK30KKworc3RhdGljIGludCBubDgwMjExX25hbl9kZWxfZnVuYyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gaW5mby0+dXNlcl9wdHJbMF07CisJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGluZm8tPnVzZXJfcHRyWzFdOworCXU2NCBjb29raWU7CisKKwlpZiAod2Rldi0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX05BTikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKCF3ZGV2LT5uYW5fc3RhcnRlZCkKKwkJcmV0dXJuIC1FTk9UQ09OTjsKKworCWlmICghaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0NPT0tJRV0pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHdkZXYtPm93bmVyX25scG9ydGlkICYmCisJICAgIHdkZXYtPm93bmVyX25scG9ydGlkICE9IGluZm8tPnNuZF9wb3J0aWQpCisJCXJldHVybiAtRU5PVENPTk47CisKKwljb29raWUgPSBubGFfZ2V0X3U2NChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfQ09PS0lFXSk7CisKKwlyZGV2X2RlbF9uYW5fZnVuYyhyZGV2LCB3ZGV2LCBjb29raWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmw4MDIxMV9uYW5fY2hhbmdlX2NvbmZpZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSBpbmZvLT51c2VyX3B0clswXTsKKwlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gaW5mby0+dXNlcl9wdHJbMV07CisJc3RydWN0IGNmZzgwMjExX25hbl9jb25mIGNvbmYgPSB7fTsKKwl1MzIgY2hhbmdlZCA9IDA7CisKKwlpZiAod2Rldi0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX05BTikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKCF3ZGV2LT5uYW5fc3RhcnRlZCkKKwkJcmV0dXJuIC1FTk9UQ09OTjsKKworCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTkFOX01BU1RFUl9QUkVGXSkgeworCQljb25mLm1hc3Rlcl9wcmVmID0KKwkJCW5sYV9nZXRfdTgoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX05BTl9NQVNURVJfUFJFRl0pOworCQlpZiAoY29uZi5tYXN0ZXJfcHJlZiA8PSAxIHx8IGNvbmYubWFzdGVyX3ByZWYgPT0gMjU1KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJY2hhbmdlZCB8PSBDRkc4MDIxMV9OQU5fQ09ORl9DSEFOR0VEX1BSRUY7CisJfQorCisJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9OQU5fRFVBTF0pIHsKKwkJY29uZi5kdWFsID0gbmxhX2dldF91OChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTkFOX0RVQUxdKTsKKwkJY2hhbmdlZCB8PSBDRkc4MDIxMV9OQU5fQ09ORl9DSEFOR0VEX0RVQUw7CisJfQorCisJaWYgKCFjaGFuZ2VkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiByZGV2X25hbl9jaGFuZ2VfY29uZihyZGV2LCB3ZGV2LCAmY29uZiwgY2hhbmdlZCk7Cit9CisKK3ZvaWQgY2ZnODAyMTFfbmFuX21hdGNoKHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQlzdHJ1Y3QgY2ZnODAyMTFfbmFuX21hdGNoX3BhcmFtcyAqbWF0Y2gsIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2Rldi0+d2lwaHk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3aXBoeSk7CisJc3RydWN0IG5sYXR0ciAqbWF0Y2hfYXR0ciwgKmxvY2FsX2Z1bmNfYXR0ciwgKnBlZXJfZnVuY19hdHRyOworCXN0cnVjdCBza19idWZmICptc2c7CisJdm9pZCAqaGRyOworCisJaWYgKFdBUk5fT04oIW1hdGNoLT5pbnN0X2lkIHx8ICFtYXRjaC0+cGVlcl9pbnN0X2lkIHx8ICFtYXRjaC0+YWRkcikpCisJCXJldHVybjsKKworCW1zZyA9IG5sbXNnX25ldyhOTE1TR19ERUZBVUxUX1NJWkUsIGdmcCk7CisJaWYgKCFtc2cpCisJCXJldHVybjsKKworCWhkciA9IG5sODAyMTFoZHJfcHV0KG1zZywgMCwgMCwgMCwgTkw4MDIxMV9DTURfTkFOX01BVENIKTsKKwlpZiAoIWhkcikgeworCQlubG1zZ19mcmVlKG1zZyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAobmxhX3B1dF91MzIobXNnLCBOTDgwMjExX0FUVFJfV0lQSFksIHJkZXYtPndpcGh5X2lkeCkgfHwKKwkgICAgKHdkZXYtPm5ldGRldiAmJiBubGFfcHV0X3UzMihtc2csIE5MODAyMTFfQVRUUl9JRklOREVYLAorCQkJCQkgd2Rldi0+bmV0ZGV2LT5pZmluZGV4KSkgfHwKKwkgICAgbmxhX3B1dF91NjRfNjRiaXQobXNnLCBOTDgwMjExX0FUVFJfV0RFViwgd2Rldl9pZCh3ZGV2KSwKKwkJCSAgICAgIE5MODAyMTFfQVRUUl9QQUQpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWlmIChubGFfcHV0X3U2NF82NGJpdChtc2csIE5MODAyMTFfQVRUUl9DT09LSUUsIG1hdGNoLT5jb29raWUsCisJCQkgICAgICBOTDgwMjExX0FUVFJfUEFEKSB8fAorCSAgICBubGFfcHV0KG1zZywgTkw4MDIxMV9BVFRSX01BQywgRVRIX0FMRU4sIG1hdGNoLT5hZGRyKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwltYXRjaF9hdHRyID0gbmxhX25lc3Rfc3RhcnQobXNnLCBOTDgwMjExX0FUVFJfTkFOX01BVENIKTsKKwlpZiAoIW1hdGNoX2F0dHIpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJbG9jYWxfZnVuY19hdHRyID0gbmxhX25lc3Rfc3RhcnQobXNnLCBOTDgwMjExX05BTl9NQVRDSF9GVU5DX0xPQ0FMKTsKKwlpZiAoIWxvY2FsX2Z1bmNfYXR0cikKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlpZiAobmxhX3B1dF91OChtc2csIE5MODAyMTFfTkFOX0ZVTkNfSU5TVEFOQ0VfSUQsIG1hdGNoLT5pbnN0X2lkKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlubGFfbmVzdF9lbmQobXNnLCBsb2NhbF9mdW5jX2F0dHIpOworCisJcGVlcl9mdW5jX2F0dHIgPSBubGFfbmVzdF9zdGFydChtc2csIE5MODAyMTFfTkFOX01BVENIX0ZVTkNfUEVFUik7CisJaWYgKCFwZWVyX2Z1bmNfYXR0cikKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlpZiAobmxhX3B1dF91OChtc2csIE5MODAyMTFfTkFOX0ZVTkNfVFlQRSwgbWF0Y2gtPnR5cGUpIHx8CisJICAgIG5sYV9wdXRfdTgobXNnLCBOTDgwMjExX05BTl9GVU5DX0lOU1RBTkNFX0lELCBtYXRjaC0+cGVlcl9pbnN0X2lkKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlpZiAobWF0Y2gtPmluZm8gJiYgbWF0Y2gtPmluZm9fbGVuICYmCisJICAgIG5sYV9wdXQobXNnLCBOTDgwMjExX05BTl9GVU5DX1NFUlZJQ0VfSU5GTywgbWF0Y2gtPmluZm9fbGVuLAorCQkgICAgbWF0Y2gtPmluZm8pKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCW5sYV9uZXN0X2VuZChtc2csIHBlZXJfZnVuY19hdHRyKTsKKwlubGFfbmVzdF9lbmQobXNnLCBtYXRjaF9hdHRyKTsKKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CisKKwlpZiAoIXdkZXYtPm93bmVyX25scG9ydGlkKQorCQlnZW5sbXNnX211bHRpY2FzdF9uZXRucygmbmw4MDIxMV9mYW0sIHdpcGh5X25ldCgmcmRldi0+d2lwaHkpLAorCQkJCQltc2csIDAsIE5MODAyMTFfTUNHUlBfTkFOLCBnZnApOworCWVsc2UKKwkJZ2VubG1zZ191bmljYXN0KHdpcGh5X25ldCgmcmRldi0+d2lwaHkpLCBtc2csCisJCQkJd2Rldi0+b3duZXJfbmxwb3J0aWQpOworCisJcmV0dXJuOworCitubGFfcHV0X2ZhaWx1cmU6CisJbmxtc2dfZnJlZShtc2cpOworfQorRVhQT1JUX1NZTUJPTChjZmc4MDIxMV9uYW5fbWF0Y2gpOworCit2b2lkIGNmZzgwMjExX25hbl9mdW5jX3Rlcm1pbmF0ZWQoc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkgIHU4IGluc3RfaWQsCisJCQkJICBlbnVtIG5sODAyMTFfbmFuX2Z1bmNfdGVybV9yZWFzb24gcmVhc29uLAorCQkJCSAgdTY0IGNvb2tpZSwgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCB3aXBoeSAqd2lwaHkgPSB3ZGV2LT53aXBoeTsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdpcGh5KTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOworCXN0cnVjdCBubGF0dHIgKmZ1bmNfYXR0cjsKKwl2b2lkICpoZHI7CisKKwlpZiAoV0FSTl9PTighaW5zdF9pZCkpCisJCXJldHVybjsKKworCW1zZyA9IG5sbXNnX25ldyhOTE1TR19ERUZBVUxUX1NJWkUsIGdmcCk7CisJaWYgKCFtc2cpCisJCXJldHVybjsKKworCWhkciA9IG5sODAyMTFoZHJfcHV0KG1zZywgMCwgMCwgMCwgTkw4MDIxMV9DTURfREVMX05BTl9GVU5DVElPTik7CisJaWYgKCFoZHIpIHsKKwkJbmxtc2dfZnJlZShtc2cpOworCQlyZXR1cm47CisJfQorCisJaWYgKG5sYV9wdXRfdTMyKG1zZywgTkw4MDIxMV9BVFRSX1dJUEhZLCByZGV2LT53aXBoeV9pZHgpIHx8CisJICAgICh3ZGV2LT5uZXRkZXYgJiYgbmxhX3B1dF91MzIobXNnLCBOTDgwMjExX0FUVFJfSUZJTkRFWCwKKwkJCQkJIHdkZXYtPm5ldGRldi0+aWZpbmRleCkpIHx8CisJICAgIG5sYV9wdXRfdTY0XzY0Yml0KG1zZywgTkw4MDIxMV9BVFRSX1dERVYsIHdkZXZfaWQod2RldiksCisJCQkgICAgICBOTDgwMjExX0FUVFJfUEFEKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlpZiAobmxhX3B1dF91NjRfNjRiaXQobXNnLCBOTDgwMjExX0FUVFJfQ09PS0lFLCBjb29raWUsCisJCQkgICAgICBOTDgwMjExX0FUVFJfUEFEKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlmdW5jX2F0dHIgPSBubGFfbmVzdF9zdGFydChtc2csIE5MODAyMTFfQVRUUl9OQU5fRlVOQyk7CisJaWYgKCFmdW5jX2F0dHIpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJaWYgKG5sYV9wdXRfdTgobXNnLCBOTDgwMjExX05BTl9GVU5DX0lOU1RBTkNFX0lELCBpbnN0X2lkKSB8fAorCSAgICBubGFfcHV0X3U4KG1zZywgTkw4MDIxMV9OQU5fRlVOQ19URVJNX1JFQVNPTiwgcmVhc29uKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlubGFfbmVzdF9lbmQobXNnLCBmdW5jX2F0dHIpOworCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKKworCWlmICghd2Rldi0+b3duZXJfbmxwb3J0aWQpCisJCWdlbmxtc2dfbXVsdGljYXN0X25ldG5zKCZubDgwMjExX2ZhbSwgd2lwaHlfbmV0KCZyZGV2LT53aXBoeSksCisJCQkJCW1zZywgMCwgTkw4MDIxMV9NQ0dSUF9OQU4sIGdmcCk7CisJZWxzZQorCQlnZW5sbXNnX3VuaWNhc3Qod2lwaHlfbmV0KCZyZGV2LT53aXBoeSksIG1zZywKKwkJCQl3ZGV2LT5vd25lcl9ubHBvcnRpZCk7CisKKwlyZXR1cm47CisKK25sYV9wdXRfZmFpbHVyZToKKwlubG1zZ19mcmVlKG1zZyk7Cit9CitFWFBPUlRfU1lNQk9MKGNmZzgwMjExX25hbl9mdW5jX3Rlcm1pbmF0ZWQpOworCiBzdGF0aWMgaW50IG5sODAyMTFfZ2V0X3Byb3RvY29sX2ZlYXR1cmVzKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJCSBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogewpAQCAtMTEwMzUsNyArMTE3OTQsMTQgQEAKIAogCQkJZGV2X2hvbGQoZGV2KTsKIAkJfSBlbHNlIGlmIChvcHMtPmludGVybmFsX2ZsYWdzICYgTkw4MDIxMV9GTEFHX0NIRUNLX05FVERFVl9VUCkgewotCQkJaWYgKCF3ZGV2LT5wMnBfc3RhcnRlZCkgeworCQkJaWYgKHdkZXYtPmlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFICYmCisJCQkgICAgIXdkZXYtPnAycF9zdGFydGVkKSB7CisJCQkJaWYgKHJ0bmwpCisJCQkJCXJ0bmxfdW5sb2NrKCk7CisJCQkJcmV0dXJuIC1FTkVURE9XTjsKKwkJCX0KKwkJCWlmICh3ZGV2LT5pZnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTkFOICYmCisJCQkgICAgIXdkZXYtPm5hbl9zdGFydGVkKSB7CiAJCQkJaWYgKHJ0bmwpCiAJCQkJCXJ0bmxfdW5sb2NrKCk7CiAJCQkJcmV0dXJuIC1FTkVURE9XTjsKQEAgLTExNjY5LDYgKzEyNDM1LDQ2IEBACiAJCQkJICBOTDgwMjExX0ZMQUdfTkVFRF9SVE5MLAogCX0sCiAJeworCQkuY21kID0gTkw4MDIxMV9DTURfU1RBUlRfTkFOLAorCQkuZG9pdCA9IG5sODAyMTFfc3RhcnRfbmFuLAorCQkucG9saWN5ID0gbmw4MDIxMV9wb2xpY3ksCisJCS5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwKKwkJLmludGVybmFsX2ZsYWdzID0gTkw4MDIxMV9GTEFHX05FRURfV0RFViB8CisJCQkJICBOTDgwMjExX0ZMQUdfTkVFRF9SVE5MLAorCX0sCisJeworCQkuY21kID0gTkw4MDIxMV9DTURfU1RPUF9OQU4sCisJCS5kb2l0ID0gbmw4MDIxMV9zdG9wX25hbiwKKwkJLnBvbGljeSA9IG5sODAyMTFfcG9saWN5LAorCQkuZmxhZ3MgPSBHRU5MX0FETUlOX1BFUk0sCisJCS5pbnRlcm5hbF9mbGFncyA9IE5MODAyMTFfRkxBR19ORUVEX1dERVZfVVAgfAorCQkJCSAgTkw4MDIxMV9GTEFHX05FRURfUlROTCwKKwl9LAorCXsKKwkJLmNtZCA9IE5MODAyMTFfQ01EX0FERF9OQU5fRlVOQ1RJT04sCisJCS5kb2l0ID0gbmw4MDIxMV9uYW5fYWRkX2Z1bmMsCisJCS5wb2xpY3kgPSBubDgwMjExX3BvbGljeSwKKwkJLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLAorCQkuaW50ZXJuYWxfZmxhZ3MgPSBOTDgwMjExX0ZMQUdfTkVFRF9XREVWX1VQIHwKKwkJCQkgIE5MODAyMTFfRkxBR19ORUVEX1JUTkwsCisJfSwKKwl7CisJCS5jbWQgPSBOTDgwMjExX0NNRF9ERUxfTkFOX0ZVTkNUSU9OLAorCQkuZG9pdCA9IG5sODAyMTFfbmFuX2RlbF9mdW5jLAorCQkucG9saWN5ID0gbmw4MDIxMV9wb2xpY3ksCisJCS5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwKKwkJLmludGVybmFsX2ZsYWdzID0gTkw4MDIxMV9GTEFHX05FRURfV0RFVl9VUCB8CisJCQkJICBOTDgwMjExX0ZMQUdfTkVFRF9SVE5MLAorCX0sCisJeworCQkuY21kID0gTkw4MDIxMV9DTURfQ0hBTkdFX05BTl9DT05GSUcsCisJCS5kb2l0ID0gbmw4MDIxMV9uYW5fY2hhbmdlX2NvbmZpZywKKwkJLnBvbGljeSA9IG5sODAyMTFfcG9saWN5LAorCQkuZmxhZ3MgPSBHRU5MX0FETUlOX1BFUk0sCisJCS5pbnRlcm5hbF9mbGFncyA9IE5MODAyMTFfRkxBR19ORUVEX1dERVZfVVAgfAorCQkJCSAgTkw4MDIxMV9GTEFHX05FRURfUlROTCwKKwl9LAorCXsKIAkJLmNtZCA9IE5MODAyMTFfQ01EX1NFVF9NQ0FTVF9SQVRFLAogCQkuZG9pdCA9IG5sODAyMTFfc2V0X21jYXN0X3JhdGUsCiAJCS5wb2xpY3kgPSBubDgwMjExX3BvbGljeSwKQEAgLTExODE5LDYgKzEyNjI1LDI5IEBACiAJCQkJTkw4MDIxMV9NQ0dSUF9DT05GSUcsIEdGUF9LRVJORUwpOwogfQogCit2b2lkIG5sODAyMTFfbm90aWZ5X2lmYWNlKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKKwkJCQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCWVudW0gbmw4MDIxMV9jb21tYW5kcyBjbWQpCit7CisJc3RydWN0IHNrX2J1ZmYgKm1zZzsKKworCVdBUk5fT04oY21kICE9IE5MODAyMTFfQ01EX05FV19JTlRFUkZBQ0UgJiYKKwkJY21kICE9IE5MODAyMTFfQ01EX0RFTF9JTlRFUkZBQ0UpOworCisJbXNnID0gbmxtc2dfbmV3KE5MTVNHX0RFRkFVTFRfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtc2cpCisJCXJldHVybjsKKworCWlmIChubDgwMjExX3NlbmRfaWZhY2UobXNnLCAwLCAwLCAwLCByZGV2LCB3ZGV2LAorCQkJICAgICAgIGNtZCA9PSBOTDgwMjExX0NNRF9ERUxfSU5URVJGQUNFKSA8IDApIHsKKwkJbmxtc2dfZnJlZShtc2cpOworCQlyZXR1cm47CisJfQorCisJZ2VubG1zZ19tdWx0aWNhc3RfbmV0bnMoJm5sODAyMTFfZmFtLCB3aXBoeV9uZXQoJnJkZXYtPndpcGh5KSwgbXNnLCAwLAorCQkJCU5MODAyMTFfTUNHUlBfQ09ORklHLCBHRlBfS0VSTkVMKTsKK30KKwogc3RhdGljIGludCBubDgwMjExX2FkZF9zY2FuX3JlcShzdHJ1Y3Qgc2tfYnVmZiAqbXNnLAogCQkJCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldikKIHsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9ubDgwMjExLmggYi9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5oCmluZGV4IGE2M2Y0MDIuLjdlMzgyMWQgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9ubDgwMjExLmgKKysrIGIvbmV0L3dpcmVsZXNzL25sODAyMTEuaApAQCAtNyw2ICs3LDkgQEAKIHZvaWQgbmw4MDIxMV9leGl0KHZvaWQpOwogdm9pZCBubDgwMjExX25vdGlmeV93aXBoeShzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCiAJCQkgIGVudW0gbmw4MDIxMV9jb21tYW5kcyBjbWQpOwordm9pZCBubDgwMjExX25vdGlmeV9pZmFjZShzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCisJCQkgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkgIGVudW0gbmw4MDIxMV9jb21tYW5kcyBjbWQpOwogdm9pZCBubDgwMjExX3NlbmRfc2Nhbl9zdGFydChzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCiAJCQkgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpOwogc3RydWN0IHNrX2J1ZmYgKm5sODAyMTFfYnVpbGRfc2Nhbl9tc2coc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LApkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3JkZXYtb3BzLmggYi9uZXQvd2lyZWxlc3MvcmRldi1vcHMuaAppbmRleCA4NWZmMzBiLi4xMWNmODNjIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvcmRldi1vcHMuaAorKysgYi9uZXQvd2lyZWxlc3MvcmRldi1vcHMuaApAQCAtODg3LDYgKzg4Nyw2NCBAQAogCXRyYWNlX3JkZXZfcmV0dXJuX3ZvaWQoJnJkZXYtPndpcGh5KTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgcmRldl9zdGFydF9uYW4oc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAorCQkJCSBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCSBzdHJ1Y3QgY2ZnODAyMTFfbmFuX2NvbmYgKmNvbmYpCit7CisJaW50IHJldDsKKworCXRyYWNlX3JkZXZfc3RhcnRfbmFuKCZyZGV2LT53aXBoeSwgd2RldiwgY29uZik7CisJcmV0ID0gcmRldi0+b3BzLT5zdGFydF9uYW4oJnJkZXYtPndpcGh5LCB3ZGV2LCBjb25mKTsKKwl0cmFjZV9yZGV2X3JldHVybl9pbnQoJnJkZXYtPndpcGh5LCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZGV2X3N0b3BfbmFuKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKKwkJCQkgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldikKK3sKKwl0cmFjZV9yZGV2X3N0b3BfbmFuKCZyZGV2LT53aXBoeSwgd2Rldik7CisJcmRldi0+b3BzLT5zdG9wX25hbigmcmRldi0+d2lwaHksIHdkZXYpOworCXRyYWNlX3JkZXZfcmV0dXJuX3ZvaWQoJnJkZXYtPndpcGh5KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3JkZXZfYWRkX25hbl9mdW5jKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKKwkJICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkgIHN0cnVjdCBjZmc4MDIxMV9uYW5fZnVuYyAqbmFuX2Z1bmMpCit7CisJaW50IHJldDsKKworCXRyYWNlX3JkZXZfYWRkX25hbl9mdW5jKCZyZGV2LT53aXBoeSwgd2RldiwgbmFuX2Z1bmMpOworCXJldCA9IHJkZXYtPm9wcy0+YWRkX25hbl9mdW5jKCZyZGV2LT53aXBoeSwgd2RldiwgbmFuX2Z1bmMpOworCXRyYWNlX3JkZXZfcmV0dXJuX2ludCgmcmRldi0+d2lwaHksIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJkZXZfZGVsX25hbl9mdW5jKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKKwkJCQkgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwgdTY0IGNvb2tpZSkKK3sKKwl0cmFjZV9yZGV2X2RlbF9uYW5fZnVuYygmcmRldi0+d2lwaHksIHdkZXYsIGNvb2tpZSk7CisJcmRldi0+b3BzLT5kZWxfbmFuX2Z1bmMoJnJkZXYtPndpcGh5LCB3ZGV2LCBjb29raWUpOworCXRyYWNlX3JkZXZfcmV0dXJuX3ZvaWQoJnJkZXYtPndpcGh5KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3JkZXZfbmFuX2NoYW5nZV9jb25mKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKKwkJICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkgICAgIHN0cnVjdCBjZmc4MDIxMV9uYW5fY29uZiAqY29uZiwgdTMyIGNoYW5nZXMpCit7CisJaW50IHJldDsKKworCXRyYWNlX3JkZXZfbmFuX2NoYW5nZV9jb25mKCZyZGV2LT53aXBoeSwgd2RldiwgY29uZiwgY2hhbmdlcyk7CisJaWYgKHJkZXYtPm9wcy0+bmFuX2NoYW5nZV9jb25mKQorCQlyZXQgPSByZGV2LT5vcHMtPm5hbl9jaGFuZ2VfY29uZigmcmRldi0+d2lwaHksIHdkZXYsIGNvbmYsCisJCQkJCQkgY2hhbmdlcyk7CisJZWxzZQorCQlyZXQgPSAtRU5PVFNVUFA7CisJdHJhY2VfcmRldl9yZXR1cm5faW50KCZyZGV2LT53aXBoeSwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW5saW5lIGludCByZGV2X3NldF9tYWNfYWNsKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKIAkJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgIHN0cnVjdCBjZmc4MDIxMV9hY2xfZGF0YSAqcGFyYW1zKQpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3NjYW4uYyBiL25ldC93aXJlbGVzcy9zY2FuLmMKaW5kZXggMDM1OGUxMi4uYjViZDU4ZCAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3NjYW4uYworKysgYi9uZXQvd2lyZWxlc3Mvc2Nhbi5jCkBAIC0zNTIsNTIgKzM1Miw0OCBAQAogCV9fY2ZnODAyMTFfYnNzX2V4cGlyZShyZGV2LCBqaWZmaWVzIC0gSUVFRTgwMjExX1NDQU5fUkVTVUxUX0VYUElSRSk7CiB9CiAKLWNvbnN0IHU4ICpjZmc4MDIxMV9maW5kX2llKHU4IGVpZCwgY29uc3QgdTggKmllcywgaW50IGxlbikKK2NvbnN0IHU4ICpjZmc4MDIxMV9maW5kX2llX21hdGNoKHU4IGVpZCwgY29uc3QgdTggKmllcywgaW50IGxlbiwKKwkJCQkgY29uc3QgdTggKm1hdGNoLCBpbnQgbWF0Y2hfbGVuLAorCQkJCSBpbnQgbWF0Y2hfb2Zmc2V0KQogewotCXdoaWxlIChsZW4gPiAyICYmIGllc1swXSAhPSBlaWQpIHsKKwkvKiBtYXRjaF9vZmZzZXQgY2FuJ3QgYmUgc21hbGxlciB0aGFuIDIsIHVubGVzcyBtYXRjaF9sZW4gaXMKKwkgKiB6ZXJvLCBpbiB3aGljaCBjYXNlIG1hdGNoX29mZnNldCBtdXN0IGJlIHplcm8gYXMgd2VsbC4KKwkgKi8KKwlpZiAoV0FSTl9PTigobWF0Y2hfbGVuICYmIG1hdGNoX29mZnNldCA8IDIpIHx8CisJCSAgICAoIW1hdGNoX2xlbiAmJiBtYXRjaF9vZmZzZXQpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwl3aGlsZSAobGVuID49IDIgJiYgbGVuID49IGllc1sxXSArIDIpIHsKKwkJaWYgKChpZXNbMF0gPT0gZWlkKSAmJgorCQkgICAgKGllc1sxXSArIDIgPj0gbWF0Y2hfb2Zmc2V0ICsgbWF0Y2hfbGVuKSAmJgorCQkgICAgIW1lbWNtcChpZXMgKyBtYXRjaF9vZmZzZXQsIG1hdGNoLCBtYXRjaF9sZW4pKQorCQkJcmV0dXJuIGllczsKKwogCQlsZW4gLT0gaWVzWzFdICsgMjsKIAkJaWVzICs9IGllc1sxXSArIDI7CiAJfQotCWlmIChsZW4gPCAyKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobGVuIDwgMiArIGllc1sxXSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGllczsKKworCXJldHVybiBOVUxMOwogfQotRVhQT1JUX1NZTUJPTChjZmc4MDIxMV9maW5kX2llKTsKK0VYUE9SVF9TWU1CT0woY2ZnODAyMTFfZmluZF9pZV9tYXRjaCk7CiAKIGNvbnN0IHU4ICpjZmc4MDIxMV9maW5kX3ZlbmRvcl9pZSh1bnNpZ25lZCBpbnQgb3VpLCBpbnQgb3VpX3R5cGUsCiAJCQkJICBjb25zdCB1OCAqaWVzLCBpbnQgbGVuKQogewotCXN0cnVjdCBpZWVlODAyMTFfdmVuZG9yX2llICppZTsKLQljb25zdCB1OCAqcG9zID0gaWVzLCAqZW5kID0gaWVzICsgbGVuOwotCWludCBpZV9vdWk7CisJY29uc3QgdTggKmllOworCXU4IG1hdGNoW10gPSB7IG91aSA+PiAxNiwgb3VpID4+IDgsIG91aSwgb3VpX3R5cGUgfTsKKwlpbnQgbWF0Y2hfbGVuID0gKG91aV90eXBlIDwgMCkgPyAzIDogc2l6ZW9mKG1hdGNoKTsKIAogCWlmIChXQVJOX09OKG91aV90eXBlID4gMHhmZikpCiAJCXJldHVybiBOVUxMOwogCi0Jd2hpbGUgKHBvcyA8IGVuZCkgewotCQlwb3MgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQywgcG9zLAotCQkJCSAgICAgICBlbmQgLSBwb3MpOwotCQlpZiAoIXBvcykKLQkJCXJldHVybiBOVUxMOworCWllID0gY2ZnODAyMTFfZmluZF9pZV9tYXRjaChXTEFOX0VJRF9WRU5ET1JfU1BFQ0lGSUMsIGllcywgbGVuLAorCQkJCSAgICBtYXRjaCwgbWF0Y2hfbGVuLCAyKTsKIAotCQlpZSA9IChzdHJ1Y3QgaWVlZTgwMjExX3ZlbmRvcl9pZSAqKXBvczsKKwlpZiAoaWUgJiYgKGllWzFdIDwgNCkpCisJCXJldHVybiBOVUxMOwogCi0JCS8qIG1ha2Ugc3VyZSB3ZSBjYW4gYWNjZXNzIGllLT5sZW4gKi8KLQkJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfdmVuZG9yX2llLCBsZW4pICE9IDEpOwotCi0JCWlmIChpZS0+bGVuIDwgc2l6ZW9mKCppZSkpCi0JCQlnb3RvIGNvbnQ7Ci0KLQkJaWVfb3VpID0gaWUtPm91aVswXSA8PCAxNiB8IGllLT5vdWlbMV0gPDwgOCB8IGllLT5vdWlbMl07Ci0JCWlmIChpZV9vdWkgPT0gb3VpICYmCi0JCSAgICAob3VpX3R5cGUgPCAwIHx8IGllLT5vdWlfdHlwZSA9PSBvdWlfdHlwZSkpCi0JCQlyZXR1cm4gcG9zOwotY29udDoKLQkJcG9zICs9IDIgKyBpZS0+bGVuOwotCX0KLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gaWU7CiB9CiBFWFBPUlRfU1lNQk9MKGNmZzgwMjExX2ZpbmRfdmVuZG9yX2llKTsKIApkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3NtZS5jIGIvbmV0L3dpcmVsZXNzL3NtZS5jCmluZGV4IGFkZDY4MjQuLmE3N2RiMzMgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9zbWUuYworKysgYi9uZXQvd2lyZWxlc3Mvc21lLmMKQEAgLTcyNiw3ICs3MjYsOCBAQAogCiAJd2Rldi0+Y3VycmVudF9ic3MgPSBic3NfZnJvbV9wdWIoYnNzKTsKIAotCWNmZzgwMjExX3VwbG9hZF9jb25uZWN0X2tleXMod2Rldik7CisJaWYgKCEod2Rldi0+d2lwaHktPmZsYWdzICYgV0lQSFlfRkxBR19IQVNfU1RBVElDX1dFUCkpCisJCWNmZzgwMjExX3VwbG9hZF9jb25uZWN0X2tleXMod2Rldik7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJY291bnRyeV9pZSA9IGllZWU4MDIxMV9ic3NfZ2V0X2llKGJzcywgV0xBTl9FSURfQ09VTlRSWSk7CkBAIC0xMDQzLDYgKzEwNDQsMTIgQEAKIAkJCQljb25uZWN0LT5jcnlwdG8uY2lwaGVyc19wYWlyd2lzZVswXSA9IGNpcGhlcjsKIAkJCX0KIAkJfQorCisJCWNvbm5lY3QtPmNyeXB0by53ZXBfa2V5cyA9IGNvbm5rZXlzLT5wYXJhbXM7CisJCWNvbm5lY3QtPmNyeXB0by53ZXBfdHhfa2V5ID0gY29ubmtleXMtPmRlZjsKKwl9IGVsc2UgeworCQlpZiAoV0FSTl9PTihjb25ua2V5cykpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAl3ZGV2LT5jb25uZWN0X2tleXMgPSBjb25ua2V5czsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9zeXNmcy5jIGIvbmV0L3dpcmVsZXNzL3N5c2ZzLmMKaW5kZXggZTQ2NDY5Yi4uMDA4MmY0YiAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3N5c2ZzLmMKKysrIGIvbmV0L3dpcmVsZXNzL3N5c2ZzLmMKQEAgLTU3LDcgKzU3LDcgQEAKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiJXBNXG4iLCB3aXBoeS0+cGVybV9hZGRyKTsKIAogCWZvciAoaSA9IDA7IGkgPCB3aXBoeS0+bl9hZGRyZXNzZXM7IGkrKykKLQkJYnVmICs9IHNwcmludGYoYnVmLCAiJXBNXG4iLCAmd2lwaHktPmFkZHJlc3Nlc1tpXS5hZGRyKTsKKwkJYnVmICs9IHNwcmludGYoYnVmLCAiJXBNXG4iLCB3aXBoeS0+YWRkcmVzc2VzW2ldLmFkZHIpOwogCiAJcmV0dXJuIGJ1ZiAtIHN0YXJ0OwogfQpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3RyYWNlLmggYi9uZXQvd2lyZWxlc3MvdHJhY2UuaAppbmRleCA3MmI1MjU1Li5hM2QwYTkxYiAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3RyYWNlLmgKKysrIGIvbmV0L3dpcmVsZXNzL3RyYWNlLmgKQEAgLTE4ODksNiArMTg4OSw5NiBAQAogCVRQX0FSR1Mod2lwaHksIHdkZXYpCiApOwogCitUUkFDRV9FVkVOVChyZGV2X3N0YXJ0X25hbiwKKwlUUF9QUk9UTyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkgc3RydWN0IGNmZzgwMjExX25hbl9jb25mICpjb25mKSwKKwlUUF9BUkdTKHdpcGh5LCB3ZGV2LCBjb25mKSwKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlXSVBIWV9FTlRSWQorCQlXREVWX0VOVFJZCisJCV9fZmllbGQodTgsIG1hc3Rlcl9wcmVmKQorCQlfX2ZpZWxkKHU4LCBkdWFsKTsKKwkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlXSVBIWV9BU1NJR047CisJCVdERVZfQVNTSUdOOworCQlfX2VudHJ5LT5tYXN0ZXJfcHJlZiA9IGNvbmYtPm1hc3Rlcl9wcmVmOworCQlfX2VudHJ5LT5kdWFsID0gY29uZi0+ZHVhbDsKKwkpLAorCVRQX3ByaW50ayhXSVBIWV9QUl9GTVQgIiwgIiBXREVWX1BSX0ZNVAorCQkgICIsIG1hc3RlciBwcmVmZXJlbmNlOiAldSwgZHVhbDogJWQiLAorCQkgIFdJUEhZX1BSX0FSRywgV0RFVl9QUl9BUkcsIF9fZW50cnktPm1hc3Rlcl9wcmVmLAorCQkgIF9fZW50cnktPmR1YWwpCispOworCitUUkFDRV9FVkVOVChyZGV2X25hbl9jaGFuZ2VfY29uZiwKKwlUUF9QUk9UTyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkgc3RydWN0IGNmZzgwMjExX25hbl9jb25mICpjb25mLCB1MzIgY2hhbmdlcyksCisJVFBfQVJHUyh3aXBoeSwgd2RldiwgY29uZiwgY2hhbmdlcyksCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJV0lQSFlfRU5UUlkKKwkJV0RFVl9FTlRSWQorCQlfX2ZpZWxkKHU4LCBtYXN0ZXJfcHJlZikKKwkJX19maWVsZCh1OCwgZHVhbCk7CisJCV9fZmllbGQodTMyLCBjaGFuZ2VzKTsKKwkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlXSVBIWV9BU1NJR047CisJCVdERVZfQVNTSUdOOworCQlfX2VudHJ5LT5tYXN0ZXJfcHJlZiA9IGNvbmYtPm1hc3Rlcl9wcmVmOworCQlfX2VudHJ5LT5kdWFsID0gY29uZi0+ZHVhbDsKKwkJX19lbnRyeS0+Y2hhbmdlcyA9IGNoYW5nZXM7CisJKSwKKwlUUF9wcmludGsoV0lQSFlfUFJfRk1UICIsICIgV0RFVl9QUl9GTVQKKwkJICAiLCBtYXN0ZXIgcHJlZmVyZW5jZTogJXUsIGR1YWw6ICVkLCBjaGFuZ2VzOiAleCIsCisJCSAgV0lQSFlfUFJfQVJHLCBXREVWX1BSX0FSRywgX19lbnRyeS0+bWFzdGVyX3ByZWYsCisJCSAgX19lbnRyeS0+ZHVhbCwgX19lbnRyeS0+Y2hhbmdlcykKKyk7CisKK0RFRklORV9FVkVOVCh3aXBoeV93ZGV2X2V2dCwgcmRldl9zdG9wX25hbiwKKwlUUF9QUk9UTyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KSwKKwlUUF9BUkdTKHdpcGh5LCB3ZGV2KQorKTsKKworVFJBQ0VfRVZFTlQocmRldl9hZGRfbmFuX2Z1bmMsCisJVFBfUFJPVE8oc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9uYW5fZnVuYyAqZnVuYyksCisJVFBfQVJHUyh3aXBoeSwgd2RldiwgZnVuYyksCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJV0lQSFlfRU5UUlkKKwkJV0RFVl9FTlRSWQorCQlfX2ZpZWxkKHU4LCBmdW5jX3R5cGUpCisJCV9fZmllbGQodTY0LCBjb29raWUpCisJKSwKKwlUUF9mYXN0X2Fzc2lnbigKKwkJV0lQSFlfQVNTSUdOOworCQlXREVWX0FTU0lHTjsKKwkJX19lbnRyeS0+ZnVuY190eXBlID0gZnVuYy0+dHlwZTsKKwkJX19lbnRyeS0+Y29va2llID0gZnVuYy0+Y29va2llCisJKSwKKwlUUF9wcmludGsoV0lQSFlfUFJfRk1UICIsICIgV0RFVl9QUl9GTVQgIiwgdHlwZT0ldSwgY29va2llPSVsbHUiLAorCQkgIFdJUEhZX1BSX0FSRywgV0RFVl9QUl9BUkcsIF9fZW50cnktPmZ1bmNfdHlwZSwKKwkJICBfX2VudHJ5LT5jb29raWUpCispOworCitUUkFDRV9FVkVOVChyZGV2X2RlbF9uYW5fZnVuYywKKwlUUF9QUk9UTyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkgdTY0IGNvb2tpZSksCisJVFBfQVJHUyh3aXBoeSwgd2RldiwgY29va2llKSwKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlXSVBIWV9FTlRSWQorCQlXREVWX0VOVFJZCisJCV9fZmllbGQodTY0LCBjb29raWUpCisJKSwKKwlUUF9mYXN0X2Fzc2lnbigKKwkJV0lQSFlfQVNTSUdOOworCQlXREVWX0FTU0lHTjsKKwkJX19lbnRyeS0+Y29va2llID0gY29va2llOworCSksCisJVFBfcHJpbnRrKFdJUEhZX1BSX0ZNVCAiLCAiIFdERVZfUFJfRk1UICIsIGNvb2tpZT0lbGx1IiwKKwkJICBXSVBIWV9QUl9BUkcsIFdERVZfUFJfQVJHLCBfX2VudHJ5LT5jb29raWUpCispOworCiBUUkFDRV9FVkVOVChyZGV2X3NldF9tYWNfYWNsLAogCVRQX1BST1RPKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAJCSBzdHJ1Y3QgY2ZnODAyMTFfYWNsX2RhdGEgKnBhcmFtcyksCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvdXRpbC5jIGIvbmV0L3dpcmVsZXNzL3V0aWwuYwppbmRleCBiN2QxNTkyLi44ZWRjZTIyIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvdXRpbC5jCisrKyBiL25ldC93aXJlbGVzcy91dGlsLmMKQEAgLTIxOCw3ICsyMTgsNyBAQAogCQkJCSAgIHN0cnVjdCBrZXlfcGFyYW1zICpwYXJhbXMsIGludCBrZXlfaWR4LAogCQkJCSAgIGJvb2wgcGFpcndpc2UsIGNvbnN0IHU4ICptYWNfYWRkcikKIHsKLQlpZiAoa2V5X2lkeCA+IDUpCisJaWYgKGtleV9pZHggPCAwIHx8IGtleV9pZHggPiA1KQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICghcGFpcndpc2UgJiYgbWFjX2FkZHIgJiYgIShyZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfSUJTU19SU04pKQpAQCAtMjQ5LDcgKzI0OSwxMyBAQAogCQkvKiBEaXNhbGxvdyBCSVAgKGdyb3VwLW9ubHkpIGNpcGhlciBhcyBwYWlyd2lzZSBjaXBoZXIgKi8KIAkJaWYgKHBhaXJ3aXNlKQogCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChrZXlfaWR4IDwgNCkKKwkJCXJldHVybiAtRUlOVkFMOwogCQlicmVhazsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgorCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgorCQlpZiAoa2V5X2lkeCA+IDMpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CkBAIC05MDYsNyArOTEyLDcgQEAKIAlpZiAoIXdkZXYtPmNvbm5lY3Rfa2V5cykKIAkJcmV0dXJuOwogCi0JZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBDRkc4MDIxMV9NQVhfV0VQX0tFWVM7IGkrKykgewogCQlpZiAoIXdkZXYtPmNvbm5lY3Rfa2V5cy0+cGFyYW1zW2ldLmNpcGhlcikKIAkJCWNvbnRpbnVlOwogCQlpZiAocmRldl9hZGRfa2V5KHJkZXYsIGRldiwgaSwgZmFsc2UsIE5VTEwsCkBAIC05MTksOSArOTI1LDYgQEAKIAkJCQluZXRkZXZfZXJyKGRldiwgImZhaWxlZCB0byBzZXQgZGVma2V5ICVkXG4iLCBpKTsKIAkJCQljb250aW51ZTsKIAkJCX0KLQkJaWYgKHdkZXYtPmNvbm5lY3Rfa2V5cy0+ZGVmbWdtdCA9PSBpKQotCQkJaWYgKHJkZXZfc2V0X2RlZmF1bHRfbWdtdF9rZXkocmRldiwgZGV2LCBpKSkKLQkJCQluZXRkZXZfZXJyKGRldiwgImZhaWxlZCB0byBzZXQgbWd0ZGVmICVkXG4iLCBpKTsKIAl9CiAKIAlremZyZWUod2Rldi0+Y29ubmVjdF9rZXlzKTsKQEAgLTEwMDUsOCArMTAwOCw5IEBACiAJaWYgKG90eXBlID09IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4pCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCS8qIGNhbm5vdCBjaGFuZ2UgaW50byBQMlAgZGV2aWNlIHR5cGUgKi8KLQlpZiAobnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRSkKKwkvKiBjYW5ub3QgY2hhbmdlIGludG8gUDJQIGRldmljZSBvciBOQU4gKi8KKwlpZiAobnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRSB8fAorCSAgICBudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9OQU4pCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCWlmICghcmRldi0+b3BzLT5jaGFuZ2VfdmlydHVhbF9pbnRmIHx8CkBAIC0xMDg1LDYgKzEwODksNyBAQAogCQkJLyogbm90IGhhcHBlbmluZyAqLwogCQkJYnJlYWs7CiAJCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRToKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9OQU46CiAJCQlXQVJOX09OKDEpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTE1NTksNyArMTU2NCw3IEBACiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldjsKIAlpbnQgcmVzID0gMDsKIAotCWlmICghYmVhY29uX2ludCkKKwlpZiAoYmVhY29uX2ludCA8IDEwIHx8IGJlYWNvbl9pbnQgPiAxMDAwMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHdkZXYsICZyZGV2LT53aXBoeS53ZGV2X2xpc3QsIGxpc3QpIHsKQEAgLTE3NTcsNiArMTc2MiwyOCBAQAogfQogRVhQT1JUX1NZTUJPTChjZmc4MDIxMV9nZXRfc3RhdGlvbik7CiAKK3ZvaWQgY2ZnODAyMTFfZnJlZV9uYW5fZnVuYyhzdHJ1Y3QgY2ZnODAyMTFfbmFuX2Z1bmMgKmYpCit7CisJaW50IGk7CisKKwlpZiAoIWYpCisJCXJldHVybjsKKworCWtmcmVlKGYtPnNlcnZfc3BlY19pbmZvKTsKKwlrZnJlZShmLT5zcmZfYmYpOworCWtmcmVlKGYtPnNyZl9tYWNzKTsKKwlmb3IgKGkgPSAwOyBpIDwgZi0+bnVtX3J4X2ZpbHRlcnM7IGkrKykKKwkJa2ZyZWUoZi0+cnhfZmlsdGVyc1tpXS5maWx0ZXIpOworCisJZm9yIChpID0gMDsgaSA8IGYtPm51bV90eF9maWx0ZXJzOyBpKyspCisJCWtmcmVlKGYtPnR4X2ZpbHRlcnNbaV0uZmlsdGVyKTsKKworCWtmcmVlKGYtPnJ4X2ZpbHRlcnMpOworCWtmcmVlKGYtPnR4X2ZpbHRlcnMpOworCWtmcmVlKGYpOworfQorRVhQT1JUX1NZTUJPTChjZmc4MDIxMV9mcmVlX25hbl9mdW5jKTsKKwogLyogU2VlIElFRUUgODAyLjFIIGZvciBMTEMvU05BUCBlbmNhcHN1bGF0aW9uL2RlY2Fwc3VsYXRpb24gKi8KIC8qIEV0aGVybmV0LUlJIHNuYXAgaGVhZGVyIChSRkMxMDQyIGZvciBtb3N0IEV0aGVyVHlwZXMpICovCiBjb25zdCB1bnNpZ25lZCBjaGFyIHJmYzEwNDJfaGVhZGVyW10gX19hbGlnbmVkKDIpID0KZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy93ZXh0LWNvbXBhdC5jIGIvbmV0L3dpcmVsZXNzL3dleHQtY29tcGF0LmMKaW5kZXggOWYyNzIyMS4uYTIyMDE1NiAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3dleHQtY29tcGF0LmMKKysrIGIvbmV0L3dpcmVsZXNzL3dleHQtY29tcGF0LmMKQEAgLTQwNiwxMiArNDA2LDE2IEBACiAJaWYgKHBhaXJ3aXNlICYmICFhZGRyKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCS8qCisJICogSW4gbWFueSBjYXNlcyB3ZSB3b24ndCBhY3R1YWxseSBuZWVkIHRoaXMsIGJ1dCBpdCdzIGJldHRlcgorCSAqIHRvIGRvIGl0IGZpcnN0IGluIGNhc2UgdGhlIGFsbG9jYXRpb24gZmFpbHMuIERvbid0IHVzZSB3ZXh0LgorCSAqLwogCWlmICghd2Rldi0+d2V4dC5rZXlzKSB7CiAJCXdkZXYtPndleHQua2V5cyA9IGt6YWxsb2Moc2l6ZW9mKCp3ZGV2LT53ZXh0LmtleXMpLAotCQkJCQkgICAgICBHRlBfS0VSTkVMKTsKKwkJCQkJICBHRlBfS0VSTkVMKTsKIAkJaWYgKCF3ZGV2LT53ZXh0LmtleXMpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJZm9yIChpID0gMDsgaSA8IENGRzgwMjExX01BWF9XRVBfS0VZUzsgaSsrKQogCQkJd2Rldi0+d2V4dC5rZXlzLT5wYXJhbXNbaV0ua2V5ID0KIAkJCQl3ZGV2LT53ZXh0LmtleXMtPmRhdGFbaV07CiAJfQpAQCAtNDYwLDcgKzQ2NCw3IEBACiAJCWlmIChlcnIgPT0gLUVOT0VOVCkKIAkJCWVyciA9IDA7CiAJCWlmICghZXJyKSB7Ci0JCQlpZiAoIWFkZHIpIHsKKwkJCWlmICghYWRkciAmJiBpZHggPCA0KSB7CiAJCQkJbWVtc2V0KHdkZXYtPndleHQua2V5cy0+ZGF0YVtpZHhdLCAwLAogCQkJCSAgICAgICBzaXplb2Yod2Rldi0+d2V4dC5rZXlzLT5kYXRhW2lkeF0pKTsKIAkJCQl3ZGV2LT53ZXh0LmtleXMtPnBhcmFtc1tpZHhdLmtleV9sZW4gPSAwOwpAQCAtNDg3LDEwICs0OTEsMTkgQEAKIAllcnIgPSAwOwogCWlmICh3ZGV2LT5jdXJyZW50X2JzcykKIAkJZXJyID0gcmRldl9hZGRfa2V5KHJkZXYsIGRldiwgaWR4LCBwYWlyd2lzZSwgYWRkciwgcGFyYW1zKTsKKwllbHNlIGlmIChwYXJhbXMtPmNpcGhlciAhPSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCAmJgorCQkgcGFyYW1zLT5jaXBoZXIgIT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KQorCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JaWYgKCFhZGRyKSB7CisJLyoKKwkgKiBXZSBvbmx5IG5lZWQgdG8gc3RvcmUgV0VQIGtleXMsIHNpbmNlIHRoZXkncmUgdGhlIG9ubHkga2V5cyB0aGF0CisJICogY2FuIGJlIGJlIHNldCBiZWZvcmUgYSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIGFuZCBwZXJzaXN0IGFmdGVyCisJICogZGlzY29ubmVjdGluZy4KKwkgKi8KKwlpZiAoIWFkZHIgJiYgKHBhcmFtcy0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwIHx8CisJCSAgICAgIHBhcmFtcy0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkpIHsKIAkJd2Rldi0+d2V4dC5rZXlzLT5wYXJhbXNbaWR4XSA9ICpwYXJhbXM7CiAJCW1lbWNweSh3ZGV2LT53ZXh0LmtleXMtPmRhdGFbaWR4XSwKIAkJCXBhcmFtcy0+a2V5LCBwYXJhbXMtPmtleV9sZW4pOwpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3dleHQtY29yZS5jIGIvbmV0L3dpcmVsZXNzL3dleHQtY29yZS5jCmluZGV4IGRiYjI3MzhlLi42MjUwYjFjIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvd2V4dC1jb3JlLmMKKysrIGIvbmV0L3dpcmVsZXNzL3dleHQtY29yZS5jCkBAIC05NTgsMjkgKzk1OCw4IEBACiAJCQlyZXR1cm4gcHJpdmF0ZShkZXYsIGl3ciwgY21kLCBpbmZvLCBoYW5kbGVyKTsKIAl9CiAJLyogT2xkIGRyaXZlciBBUEkgOiBjYWxsIGRyaXZlciBpb2N0bCBoYW5kbGVyICovCi0JaWYgKGRldi0+bmV0ZGV2X29wcy0+bmRvX2RvX2lvY3RsKSB7Ci0jaWZkZWYgQ09ORklHX0NPTVBBVAotCQlpZiAoaW5mby0+ZmxhZ3MgJiBJV19SRVFVRVNUX0ZMQUdfQ09NUEFUKSB7Ci0JCQlpbnQgcmV0ID0gMDsKLQkJCXN0cnVjdCBpd3JlcSBpd3JfbGNsOwotCQkJc3RydWN0IGNvbXBhdF9pd19wb2ludCAqaXdwX2NvbXBhdCA9ICh2b2lkICopICZpd3ItPnUuZGF0YTsKLQotCQkJbWVtY3B5KCZpd3JfbGNsLCBpd3IsIHNpemVvZihzdHJ1Y3QgaXdyZXEpKTsKLQkJCWl3cl9sY2wudS5kYXRhLnBvaW50ZXIgPSBjb21wYXRfcHRyKGl3cF9jb21wYXQtPnBvaW50ZXIpOwotCQkJaXdyX2xjbC51LmRhdGEubGVuZ3RoID0gaXdwX2NvbXBhdC0+bGVuZ3RoOwotCQkJaXdyX2xjbC51LmRhdGEuZmxhZ3MgPSBpd3BfY29tcGF0LT5mbGFnczsKLQotCQkJcmV0ID0gZGV2LT5uZXRkZXZfb3BzLT5uZG9fZG9faW9jdGwoZGV2LCAodm9pZCAqKSAmaXdyX2xjbCwgY21kKTsKLQotCQkJaXdwX2NvbXBhdC0+cG9pbnRlciA9IHB0cl90b19jb21wYXQoaXdyX2xjbC51LmRhdGEucG9pbnRlcik7Ci0JCQlpd3BfY29tcGF0LT5sZW5ndGggPSBpd3JfbGNsLnUuZGF0YS5sZW5ndGg7Ci0JCQlpd3BfY29tcGF0LT5mbGFncyA9IGl3cl9sY2wudS5kYXRhLmZsYWdzOwotCi0JCQlyZXR1cm4gcmV0OwotCQl9IGVsc2UKLSNlbmRpZgotCQkJcmV0dXJuIGRldi0+bmV0ZGV2X29wcy0+bmRvX2RvX2lvY3RsKGRldiwgaWZyLCBjbWQpOwotCX0KKwlpZiAoZGV2LT5uZXRkZXZfb3BzLT5uZG9fZG9faW9jdGwpCisJCXJldHVybiBkZXYtPm5ldGRldl9vcHMtPm5kb19kb19pb2N0bChkZXYsIGlmciwgY21kKTsKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy93ZXh0LXNtZS5jIGIvbmV0L3dpcmVsZXNzL3dleHQtc21lLmMKaW5kZXggYTRlOGFmMy4uOTk1MTYzOCAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3dleHQtc21lLmMKKysrIGIvbmV0L3dpcmVsZXNzL3dleHQtc21lLmMKQEAgLTM1LDcgKzM1LDYgQEAKIAogCWlmICh3ZGV2LT53ZXh0LmtleXMpIHsKIAkJd2Rldi0+d2V4dC5rZXlzLT5kZWYgPSB3ZGV2LT53ZXh0LmRlZmF1bHRfa2V5OwotCQl3ZGV2LT53ZXh0LmtleXMtPmRlZm1nbXQgPSB3ZGV2LT53ZXh0LmRlZmF1bHRfbWdtdF9rZXk7CiAJCWlmICh3ZGV2LT53ZXh0LmRlZmF1bHRfa2V5ICE9IC0xKQogCQkJd2Rldi0+d2V4dC5jb25uZWN0LnByaXZhY3kgPSB0cnVlOwogCX0KQEAgLTQzLDExICs0MiwxMSBAQAogCWlmICghd2Rldi0+d2V4dC5jb25uZWN0LnNzaWRfbGVuKQogCQlyZXR1cm4gMDsKIAotCWlmICh3ZGV2LT53ZXh0LmtleXMpIHsKKwlpZiAod2Rldi0+d2V4dC5rZXlzICYmIHdkZXYtPndleHQua2V5cy0+ZGVmICE9IC0xKSB7CiAJCWNrID0ga21lbWR1cCh3ZGV2LT53ZXh0LmtleXMsIHNpemVvZigqY2spLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFjaykKIAkJCXJldHVybiAtRU5PTUVNOwotCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlmb3IgKGkgPSAwOyBpIDwgQ0ZHODAyMTFfTUFYX1dFUF9LRVlTOyBpKyspCiAJCQljay0+cGFyYW1zW2ldLmtleSA9IGNrLT5kYXRhW2ldOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L3gyNS9hZl94MjUuYyBiL25ldC94MjUvYWZfeDI1LmMKaW5kZXggYTc1MGYzMy4uZjgzYjc0ZCAxMDA2NDQKLS0tIGEvbmV0L3gyNS9hZl94MjUuYworKysgYi9uZXQveDI1L2FmX3gyNS5jCkBAIC0xNTAwLDEyICsxNTAwLDggQEAKIAkJCWdvdG8gb3V0X2R0ZWZhY19yZWxlYXNlOwogCQlpZiAoZHRlZmFjcy5jYWxsaW5nX2xlbiA+IFgyNV9NQVhfQUVfTEVOKQogCQkJZ290byBvdXRfZHRlZmFjX3JlbGVhc2U7Ci0JCWlmIChkdGVmYWNzLmNhbGxpbmdfYWUgPT0gTlVMTCkKLQkJCWdvdG8gb3V0X2R0ZWZhY19yZWxlYXNlOwogCQlpZiAoZHRlZmFjcy5jYWxsZWRfbGVuID4gWDI1X01BWF9BRV9MRU4pCiAJCQlnb3RvIG91dF9kdGVmYWNfcmVsZWFzZTsKLQkJaWYgKGR0ZWZhY3MuY2FsbGVkX2FlID09IE5VTEwpCi0JCQlnb3RvIG91dF9kdGVmYWNfcmVsZWFzZTsKIAkJeDI1LT5kdGVfZmFjaWxpdGllcyA9IGR0ZWZhY3M7CiAJCXJjID0gMDsKIG91dF9kdGVmYWNfcmVsZWFzZToKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fYWxnby5jIGIvbmV0L3hmcm0veGZybV9hbGdvLmMKaW5kZXggMjUwZTU2Ny4uNDRhYzg1ZiAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9hbGdvLmMKKysrIGIvbmV0L3hmcm0veGZybV9hbGdvLmMKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPG5ldC94ZnJtLmg+Ci0jaWYgZGVmaW5lZChDT05GSUdfSU5FVF9FU1ApIHx8IGRlZmluZWQoQ09ORklHX0lORVRfRVNQX01PRFVMRSkgfHwgZGVmaW5lZChDT05GSUdfSU5FVDZfRVNQKSB8fCBkZWZpbmVkKENPTkZJR19JTkVUNl9FU1BfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lORVRfRVNQKSB8fCBJU19FTkFCTEVEKENPTkZJR19JTkVUNl9FU1ApCiAjaW5jbHVkZSA8bmV0L2VzcC5oPgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1faW5wdXQuYyBiL25ldC94ZnJtL3hmcm1faW5wdXQuYwppbmRleCAxYzRhZDQ3Li42ZTNmMDI1IDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX2lucHV0LmMKKysrIGIvbmV0L3hmcm0veGZybV9pbnB1dC5jCkBAIC0yMDcsMTUgKzIwNywxNSBAQAogCWZhbWlseSA9IFhGUk1fU1BJX1NLQl9DQihza2IpLT5mYW1pbHk7CiAKIAkvKiBpZiB0dW5uZWwgaXMgcHJlc2VudCBvdmVycmlkZSBza2ItPm1hcmsgdmFsdWUgd2l0aCB0dW5uZWwgaV9rZXkgKi8KLQlpZiAoWEZSTV9UVU5ORUxfU0tCX0NCKHNrYiktPnR1bm5lbC5pcDQpIHsKLQkJc3dpdGNoIChmYW1pbHkpIHsKLQkJY2FzZSBBRl9JTkVUOgorCXN3aXRjaCAoZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQlpZiAoWEZSTV9UVU5ORUxfU0tCX0NCKHNrYiktPnR1bm5lbC5pcDQpCiAJCQltYXJrID0gYmUzMl90b19jcHUoWEZSTV9UVU5ORUxfU0tCX0NCKHNrYiktPnR1bm5lbC5pcDQtPnBhcm1zLmlfa2V5KTsKLQkJCWJyZWFrOwotCQljYXNlIEFGX0lORVQ2OgorCQlicmVhazsKKwljYXNlIEFGX0lORVQ2OgorCQlpZiAoWEZSTV9UVU5ORUxfU0tCX0NCKHNrYiktPnR1bm5lbC5pcDYpCiAJCQltYXJrID0gYmUzMl90b19jcHUoWEZSTV9UVU5ORUxfU0tCX0NCKHNrYiktPnR1bm5lbC5pcDYtPnBhcm1zLmlfa2V5KTsKLQkJCWJyZWFrOwotCQl9CisJCWJyZWFrOwogCX0KIAogCS8qIEFsbG9jYXRlIG5ldyBzZWNwYXRoIG9yIENPVyBleGlzdGluZyBvbmUuICovCmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX3BvbGljeS5jIGIvbmV0L3hmcm0veGZybV9wb2xpY3kuYwppbmRleCBiNWU2NjViLi5mZDY5ODY2IDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3BvbGljeS5jCisrKyBiL25ldC94ZnJtL3hmcm1fcG9saWN5LmMKQEAgLTQ5LDYgKzQ5LDcgQEAKIAkJCQkJCV9fcmVhZF9tb3N0bHk7CiAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqeGZybV9kc3RfY2FjaGUgX19yZWFkX21vc3RseTsKK3N0YXRpYyBfX3JlYWRfbW9zdGx5IHNlcWNvdW50X3QgeGZybV9wb2xpY3lfaGFzaF9nZW5lcmF0aW9uOwogCiBzdGF0aWMgdm9pZCB4ZnJtX2luaXRfcG10dShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpOwogc3RhdGljIGludCBzdGFsZV9idW5kbGUoc3RydWN0IGRzdF9lbnRyeSAqZHN0KTsKQEAgLTU5LDYgKzYwLDExIEBACiBzdGF0aWMgc3RydWN0IHhmcm1fcG9saWN5ICpfX3hmcm1fcG9saWN5X3VubGluayhzdHJ1Y3QgeGZybV9wb2xpY3kgKnBvbCwKIAkJCQkJCWludCBkaXIpOwogCitzdGF0aWMgaW5saW5lIGJvb2wgeGZybV9wb2xfaG9sZF9yY3Uoc3RydWN0IHhmcm1fcG9saWN5ICpwb2xpY3kpCit7CisJcmV0dXJuIGF0b21pY19pbmNfbm90X3plcm8oJnBvbGljeS0+cmVmY250KTsKK30KKwogc3RhdGljIGlubGluZSBib29sCiBfX3hmcm00X3NlbGVjdG9yX21hdGNoKGNvbnN0IHN0cnVjdCB4ZnJtX3NlbGVjdG9yICpzZWwsIGNvbnN0IHN0cnVjdCBmbG93aSAqZmwpCiB7CkBAIC0zODUsOSArMzkxLDExIEBACiAJX19nZXRfaGFzaF90aHJlc2gobmV0LCBmYW1pbHksIGRpciwgJmRiaXRzLCAmc2JpdHMpOwogCWhhc2ggPSBfX3NlbF9oYXNoKHNlbCwgZmFtaWx5LCBobWFzaywgZGJpdHMsIHNiaXRzKTsKIAotCXJldHVybiAoaGFzaCA9PSBobWFzayArIDEgPwotCQkmbmV0LT54ZnJtLnBvbGljeV9pbmV4YWN0W2Rpcl0gOgotCQluZXQtPnhmcm0ucG9saWN5X2J5ZHN0W2Rpcl0udGFibGUgKyBoYXNoKTsKKwlpZiAoaGFzaCA9PSBobWFzayArIDEpCisJCXJldHVybiAmbmV0LT54ZnJtLnBvbGljeV9pbmV4YWN0W2Rpcl07CisKKwlyZXR1cm4gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKG5ldC0+eGZybS5wb2xpY3lfYnlkc3RbZGlyXS50YWJsZSwKKwkJICAgICBsb2NrZGVwX2lzX2hlbGQoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKSkgKyBoYXNoOwogfQogCiBzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQgKnBvbGljeV9oYXNoX2RpcmVjdChzdHJ1Y3QgbmV0ICpuZXQsCkBAIC00MDMsNyArNDExLDggQEAKIAlfX2dldF9oYXNoX3RocmVzaChuZXQsIGZhbWlseSwgZGlyLCAmZGJpdHMsICZzYml0cyk7CiAJaGFzaCA9IF9fYWRkcl9oYXNoKGRhZGRyLCBzYWRkciwgZmFtaWx5LCBobWFzaywgZGJpdHMsIHNiaXRzKTsKIAotCXJldHVybiBuZXQtPnhmcm0ucG9saWN5X2J5ZHN0W2Rpcl0udGFibGUgKyBoYXNoOworCXJldHVybiByY3VfZGVyZWZlcmVuY2VfY2hlY2sobmV0LT54ZnJtLnBvbGljeV9ieWRzdFtkaXJdLnRhYmxlLAorCQkgICAgIGxvY2tkZXBfaXNfaGVsZCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spKSArIGhhc2g7CiB9CiAKIHN0YXRpYyB2b2lkIHhmcm1fZHN0X2hhc2hfdHJhbnNmZXIoc3RydWN0IG5ldCAqbmV0LApAQCAtNDI2LDE0ICs0MzUsMTQgQEAKIAkJaCA9IF9fYWRkcl9oYXNoKCZwb2wtPnNlbGVjdG9yLmRhZGRyLCAmcG9sLT5zZWxlY3Rvci5zYWRkciwKIAkJCQlwb2wtPmZhbWlseSwgbmhhc2htYXNrLCBkYml0cywgc2JpdHMpOwogCQlpZiAoIWVudHJ5MCkgewotCQkJaGxpc3RfZGVsKCZwb2wtPmJ5ZHN0KTsKLQkJCWhsaXN0X2FkZF9oZWFkKCZwb2wtPmJ5ZHN0LCBuZHN0dGFibGUraCk7CisJCQlobGlzdF9kZWxfcmN1KCZwb2wtPmJ5ZHN0KTsKKwkJCWhsaXN0X2FkZF9oZWFkX3JjdSgmcG9sLT5ieWRzdCwgbmRzdHRhYmxlICsgaCk7CiAJCQloMCA9IGg7CiAJCX0gZWxzZSB7CiAJCQlpZiAoaCAhPSBoMCkKIAkJCQljb250aW51ZTsKLQkJCWhsaXN0X2RlbCgmcG9sLT5ieWRzdCk7Ci0JCQlobGlzdF9hZGRfYmVoaW5kKCZwb2wtPmJ5ZHN0LCBlbnRyeTApOworCQkJaGxpc3RfZGVsX3JjdSgmcG9sLT5ieWRzdCk7CisJCQlobGlzdF9hZGRfYmVoaW5kX3JjdSgmcG9sLT5ieWRzdCwgZW50cnkwKTsKIAkJfQogCQllbnRyeTAgPSAmcG9sLT5ieWRzdDsKIAl9CkBAIC00NjgsMjIgKzQ3NywzMiBAQAogCXVuc2lnbmVkIGludCBobWFzayA9IG5ldC0+eGZybS5wb2xpY3lfYnlkc3RbZGlyXS5obWFzazsKIAl1bnNpZ25lZCBpbnQgbmhhc2htYXNrID0geGZybV9uZXdfaGFzaF9tYXNrKGhtYXNrKTsKIAl1bnNpZ25lZCBpbnQgbnNpemUgPSAobmhhc2htYXNrICsgMSkgKiBzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpOwotCXN0cnVjdCBobGlzdF9oZWFkICpvZHN0ID0gbmV0LT54ZnJtLnBvbGljeV9ieWRzdFtkaXJdLnRhYmxlOwogCXN0cnVjdCBobGlzdF9oZWFkICpuZHN0ID0geGZybV9oYXNoX2FsbG9jKG5zaXplKTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqb2RzdDsKIAlpbnQgaTsKIAogCWlmICghbmRzdCkKIAkJcmV0dXJuOwogCi0Jd3JpdGVfbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXNwaW5fbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXdyaXRlX3NlcWNvdW50X2JlZ2luKCZ4ZnJtX3BvbGljeV9oYXNoX2dlbmVyYXRpb24pOworCisJb2RzdCA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQobmV0LT54ZnJtLnBvbGljeV9ieWRzdFtkaXJdLnRhYmxlLAorCQkJCWxvY2tkZXBfaXNfaGVsZCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spKTsKKworCW9kc3QgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKG5ldC0+eGZybS5wb2xpY3lfYnlkc3RbZGlyXS50YWJsZSwKKwkJCQlsb2NrZGVwX2lzX2hlbGQoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKSk7CiAKIAlmb3IgKGkgPSBobWFzazsgaSA+PSAwOyBpLS0pCiAJCXhmcm1fZHN0X2hhc2hfdHJhbnNmZXIobmV0LCBvZHN0ICsgaSwgbmRzdCwgbmhhc2htYXNrLCBkaXIpOwogCi0JbmV0LT54ZnJtLnBvbGljeV9ieWRzdFtkaXJdLnRhYmxlID0gbmRzdDsKKwlyY3VfYXNzaWduX3BvaW50ZXIobmV0LT54ZnJtLnBvbGljeV9ieWRzdFtkaXJdLnRhYmxlLCBuZHN0KTsKIAluZXQtPnhmcm0ucG9saWN5X2J5ZHN0W2Rpcl0uaG1hc2sgPSBuaGFzaG1hc2s7CiAKLQl3cml0ZV91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwl3cml0ZV9zZXFjb3VudF9lbmQoJnhmcm1fcG9saWN5X2hhc2hfZ2VuZXJhdGlvbik7CisJc3Bpbl91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKworCXN5bmNocm9uaXplX3JjdSgpOwogCiAJeGZybV9oYXNoX2ZyZWUob2RzdCwgKGhtYXNrICsgMSkgKiBzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpKTsKIH0KQEAgLTUwMCw3ICs1MTksNyBAQAogCWlmICghbmlkeCkKIAkJcmV0dXJuOwogCi0Jd3JpdGVfbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXNwaW5fbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCiAJZm9yIChpID0gaG1hc2s7IGkgPj0gMDsgaS0tKQogCQl4ZnJtX2lkeF9oYXNoX3RyYW5zZmVyKG9pZHggKyBpLCBuaWR4LCBuaGFzaG1hc2spOwpAQCAtNTA4LDcgKzUyNyw3IEBACiAJbmV0LT54ZnJtLnBvbGljeV9ieWlkeCA9IG5pZHg7CiAJbmV0LT54ZnJtLnBvbGljeV9pZHhfaG1hc2sgPSBuaGFzaG1hc2s7CiAKLQl3cml0ZV91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCiAJeGZybV9oYXNoX2ZyZWUob2lkeCwgKGhtYXNrICsgMSkgKiBzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpKTsKIH0KQEAgLTU0MSw3ICs1NjAsNiBAQAogCiB2b2lkIHhmcm1fc3BkX2dldGluZm8oc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgeGZybWtfc3BkaW5mbyAqc2kpCiB7Ci0JcmVhZF9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAJc2ktPmluY250ID0gbmV0LT54ZnJtLnBvbGljeV9jb3VudFtYRlJNX1BPTElDWV9JTl07CiAJc2ktPm91dGNudCA9IG5ldC0+eGZybS5wb2xpY3lfY291bnRbWEZSTV9QT0xJQ1lfT1VUXTsKIAlzaS0+ZndkY250ID0gbmV0LT54ZnJtLnBvbGljeV9jb3VudFtYRlJNX1BPTElDWV9GV0RdOwpAQCAtNTUwLDcgKzU2OCw2IEBACiAJc2ktPmZ3ZHNjbnQgPSBuZXQtPnhmcm0ucG9saWN5X2NvdW50W1hGUk1fUE9MSUNZX0ZXRCtYRlJNX1BPTElDWV9NQVhdOwogCXNpLT5zcGRoY250ID0gbmV0LT54ZnJtLnBvbGljeV9pZHhfaG1hc2s7CiAJc2ktPnNwZGhtY250ID0geGZybV9wb2xpY3lfaGFzaG1heDsKLQlyZWFkX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogfQogRVhQT1JUX1NZTUJPTCh4ZnJtX3NwZF9nZXRpbmZvKTsKIApAQCAtNjAwLDcgKzYxNyw3IEBACiAJCXJiaXRzNiA9IG5ldC0+eGZybS5wb2xpY3lfaHRocmVzaC5yYml0czY7CiAJfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmbmV0LT54ZnJtLnBvbGljeV9odGhyZXNoLmxvY2ssIHNlcSkpOwogCi0Jd3JpdGVfbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXNwaW5fbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCiAJLyogcmVzZXQgdGhlIGJ5ZHN0IGFuZCBpbmV4YWN0IHRhYmxlIGluIGFsbCBkaXJlY3Rpb25zICovCiAJZm9yIChkaXIgPSAwOyBkaXIgPCBYRlJNX1BPTElDWV9NQVg7IGRpcisrKSB7CkBAIC02MjYsNiArNjQzLDEwIEBACiAKIAkvKiByZS1pbnNlcnQgYWxsIHBvbGljaWVzIGJ5IG9yZGVyIG9mIGNyZWF0aW9uICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKHBvbGljeSwgJm5ldC0+eGZybS5wb2xpY3lfYWxsLCB3YWxrLmFsbCkgeworCQlpZiAoeGZybV9wb2xpY3lfaWQyZGlyKHBvbGljeS0+aW5kZXgpID49IFhGUk1fUE9MSUNZX01BWCkgeworCQkJLyogc2tpcCBzb2NrZXQgcG9saWNpZXMgKi8KKwkJCWNvbnRpbnVlOworCQl9CiAJCW5ld3BvcyA9IE5VTEw7CiAJCWNoYWluID0gcG9saWN5X2hhc2hfYnlzZWwobmV0LCAmcG9saWN5LT5zZWxlY3RvciwKIAkJCQkJICBwb2xpY3ktPmZhbWlseSwKQEAgLTY0Miw3ICs2NjMsNyBAQAogCQkJaGxpc3RfYWRkX2hlYWQoJnBvbGljeS0+Ynlkc3QsIGNoYWluKTsKIAl9CiAKLQl3cml0ZV91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCiAJbXV0ZXhfdW5sb2NrKCZoYXNoX3Jlc2l6ZV9tdXRleCk7CiB9CkBAIC03NTMsNyArNzc0LDcgQEAKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqY2hhaW47CiAJc3RydWN0IGhsaXN0X25vZGUgKm5ld3BvczsKIAotCXdyaXRlX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAljaGFpbiA9IHBvbGljeV9oYXNoX2J5c2VsKG5ldCwgJnBvbGljeS0+c2VsZWN0b3IsIHBvbGljeS0+ZmFtaWx5LCBkaXIpOwogCWRlbHBvbCA9IE5VTEw7CiAJbmV3cG9zID0gTlVMTDsKQEAgLTc2NCw3ICs3ODUsNyBAQAogCQkgICAgeGZybV9zZWNfY3R4X21hdGNoKHBvbC0+c2VjdXJpdHksIHBvbGljeS0+c2VjdXJpdHkpICYmCiAJCSAgICAhV0FSTl9PTihkZWxwb2wpKSB7CiAJCQlpZiAoZXhjbCkgewotCQkJCXdyaXRlX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCQkJCXNwaW5fdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAJCQkJcmV0dXJuIC1FRVhJU1Q7CiAJCQl9CiAJCQlkZWxwb2wgPSBwb2w7CkBAIC04MDAsNyArODIxLDcgQEAKIAlwb2xpY3ktPmN1cmxmdC51c2VfdGltZSA9IDA7CiAJaWYgKCFtb2RfdGltZXIoJnBvbGljeS0+dGltZXIsIGppZmZpZXMgKyBIWikpCiAJCXhmcm1fcG9sX2hvbGQocG9saWN5KTsKLQl3cml0ZV91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCiAJaWYgKGRlbHBvbCkKIAkJeGZybV9wb2xpY3lfa2lsbChkZWxwb2wpOwpAQCAtODIwLDcgKzg0MSw3IEBACiAJc3RydWN0IGhsaXN0X2hlYWQgKmNoYWluOwogCiAJKmVyciA9IDA7Ci0Jd3JpdGVfbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXNwaW5fbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCWNoYWluID0gcG9saWN5X2hhc2hfYnlzZWwobmV0LCBzZWwsIHNlbC0+ZmFtaWx5LCBkaXIpOwogCXJldCA9IE5VTEw7CiAJaGxpc3RfZm9yX2VhY2hfZW50cnkocG9sLCBjaGFpbiwgYnlkc3QpIHsKQEAgLTgzMyw3ICs4NTQsNyBAQAogCQkJCSplcnIgPSBzZWN1cml0eV94ZnJtX3BvbGljeV9kZWxldGUoCiAJCQkJCQkJCXBvbC0+c2VjdXJpdHkpOwogCQkJCWlmICgqZXJyKSB7Ci0JCQkJCXdyaXRlX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCQkJCQlzcGluX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCQkJCQlyZXR1cm4gcG9sOwogCQkJCX0KIAkJCQlfX3hmcm1fcG9saWN5X3VubGluayhwb2wsIGRpcik7CkBAIC04NDIsNyArODYzLDcgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQotCXdyaXRlX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAKIAlpZiAocmV0ICYmIGRlbGV0ZSkKIAkJeGZybV9wb2xpY3lfa2lsbChyZXQpOwpAQCAtODYxLDcgKzg4Miw3IEBACiAJCXJldHVybiBOVUxMOwogCiAJKmVyciA9IDA7Ci0Jd3JpdGVfbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXNwaW5fbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCWNoYWluID0gbmV0LT54ZnJtLnBvbGljeV9ieWlkeCArIGlkeF9oYXNoKG5ldCwgaWQpOwogCXJldCA9IE5VTEw7CiAJaGxpc3RfZm9yX2VhY2hfZW50cnkocG9sLCBjaGFpbiwgYnlpZHgpIHsKQEAgLTg3Miw3ICs4OTMsNyBAQAogCQkJCSplcnIgPSBzZWN1cml0eV94ZnJtX3BvbGljeV9kZWxldGUoCiAJCQkJCQkJCXBvbC0+c2VjdXJpdHkpOwogCQkJCWlmICgqZXJyKSB7Ci0JCQkJCXdyaXRlX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCQkJCQlzcGluX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCQkJCQlyZXR1cm4gcG9sOwogCQkJCX0KIAkJCQlfX3hmcm1fcG9saWN5X3VubGluayhwb2wsIGRpcik7CkBAIC04ODEsNyArOTAyLDcgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQotCXdyaXRlX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAKIAlpZiAocmV0ICYmIGRlbGV0ZSkKIAkJeGZybV9wb2xpY3lfa2lsbChyZXQpOwpAQCAtOTM5LDcgKzk2MCw3IEBACiB7CiAJaW50IGRpciwgZXJyID0gMCwgY250ID0gMDsKIAotCXdyaXRlX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAogCWVyciA9IHhmcm1fcG9saWN5X2ZsdXNoX3NlY2N0eF9jaGVjayhuZXQsIHR5cGUsIHRhc2tfdmFsaWQpOwogCWlmIChlcnIpCkBAIC05NTUsMTQgKzk3NiwxNCBAQAogCQkJaWYgKHBvbC0+dHlwZSAhPSB0eXBlKQogCQkJCWNvbnRpbnVlOwogCQkJX194ZnJtX3BvbGljeV91bmxpbmsocG9sLCBkaXIpOwotCQkJd3JpdGVfdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisJCQlzcGluX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCQkJY250Kys7CiAKIAkJCXhmcm1fYXVkaXRfcG9saWN5X2RlbGV0ZShwb2wsIDEsIHRhc2tfdmFsaWQpOwogCiAJCQl4ZnJtX3BvbGljeV9raWxsKHBvbCk7CiAKLQkJCXdyaXRlX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwkJCXNwaW5fbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCQkJZ290byBhZ2FpbjE7CiAJCX0KIApAQCAtOTc0LDEzICs5OTUsMTMgQEAKIAkJCQlpZiAocG9sLT50eXBlICE9IHR5cGUpCiAJCQkJCWNvbnRpbnVlOwogCQkJCV9feGZybV9wb2xpY3lfdW5saW5rKHBvbCwgZGlyKTsKLQkJCQl3cml0ZV91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwkJCQlzcGluX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCQkJCWNudCsrOwogCiAJCQkJeGZybV9hdWRpdF9wb2xpY3lfZGVsZXRlKHBvbCwgMSwgdGFza192YWxpZCk7CiAJCQkJeGZybV9wb2xpY3lfa2lsbChwb2wpOwogCi0JCQkJd3JpdGVfbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCQkJCXNwaW5fbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCQkJCWdvdG8gYWdhaW4yOwogCQkJfQogCQl9CkBAIC05ODksNyArMTAxMCw3IEBACiAJaWYgKCFjbnQpCiAJCWVyciA9IC1FU1JDSDsKIG91dDoKLQl3cml0ZV91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MKHhmcm1fcG9saWN5X2ZsdXNoKTsKQEAgLTEwMDksNyArMTAzMCw3IEBACiAJaWYgKGxpc3RfZW1wdHkoJndhbGstPndhbGsuYWxsKSAmJiB3YWxrLT5zZXEgIT0gMCkKIAkJcmV0dXJuIDA7CiAKLQl3cml0ZV9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAJaWYgKGxpc3RfZW1wdHkoJndhbGstPndhbGsuYWxsKSkKIAkJeCA9IGxpc3RfZmlyc3RfZW50cnkoJm5ldC0+eGZybS5wb2xpY3lfYWxsLCBzdHJ1Y3QgeGZybV9wb2xpY3lfd2Fsa19lbnRyeSwgYWxsKTsKIAllbHNlCkBAIC0xMDM3LDcgKzEwNTgsNyBAQAogCX0KIAlsaXN0X2RlbF9pbml0KCZ3YWxrLT53YWxrLmFsbCk7CiBvdXQ6Ci0Jd3JpdGVfdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiBFWFBPUlRfU1lNQk9MKHhmcm1fcG9saWN5X3dhbGspOwpAQCAtMTA1Niw5ICsxMDc3LDkgQEAKIAlpZiAobGlzdF9lbXB0eSgmd2Fsay0+d2Fsay5hbGwpKQogCQlyZXR1cm47CiAKLQl3cml0ZV9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7IC8qRklYTUUgd2hlcmUgaXMgbmV0PyAqLworCXNwaW5fbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOyAvKkZJWE1FIHdoZXJlIGlzIG5ldD8gKi8KIAlsaXN0X2RlbCgmd2Fsay0+d2Fsay5hbGwpOwotCXdyaXRlX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MKHhmcm1fcG9saWN5X3dhbGtfZG9uZSk7CiAKQEAgLTEwOTYsMTcgKzExMTcsMjQgQEAKIAlzdHJ1Y3QgeGZybV9wb2xpY3kgKnBvbCwgKnJldDsKIAljb25zdCB4ZnJtX2FkZHJlc3NfdCAqZGFkZHIsICpzYWRkcjsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqY2hhaW47Ci0JdTMyIHByaW9yaXR5ID0gfjBVOworCXVuc2lnbmVkIGludCBzZXF1ZW5jZTsKKwl1MzIgcHJpb3JpdHk7CiAKIAlkYWRkciA9IHhmcm1fZmxvd2lfZGFkZHIoZmwsIGZhbWlseSk7CiAJc2FkZHIgPSB4ZnJtX2Zsb3dpX3NhZGRyKGZsLCBmYW1pbHkpOwogCWlmICh1bmxpa2VseSghZGFkZHIgfHwgIXNhZGRyKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlyZWFkX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKLQljaGFpbiA9IHBvbGljeV9oYXNoX2RpcmVjdChuZXQsIGRhZGRyLCBzYWRkciwgZmFtaWx5LCBkaXIpOworCXJjdV9yZWFkX2xvY2soKTsKKyByZXRyeToKKwlkbyB7CisJCXNlcXVlbmNlID0gcmVhZF9zZXFjb3VudF9iZWdpbigmeGZybV9wb2xpY3lfaGFzaF9nZW5lcmF0aW9uKTsKKwkJY2hhaW4gPSBwb2xpY3lfaGFzaF9kaXJlY3QobmV0LCBkYWRkciwgc2FkZHIsIGZhbWlseSwgZGlyKTsKKwl9IHdoaWxlIChyZWFkX3NlcWNvdW50X3JldHJ5KCZ4ZnJtX3BvbGljeV9oYXNoX2dlbmVyYXRpb24sIHNlcXVlbmNlKSk7CisKKwlwcmlvcml0eSA9IH4wVTsKIAlyZXQgPSBOVUxMOwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvbCwgY2hhaW4sIGJ5ZHN0KSB7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHBvbCwgY2hhaW4sIGJ5ZHN0KSB7CiAJCWVyciA9IHhmcm1fcG9saWN5X21hdGNoKHBvbCwgZmwsIHR5cGUsIGZhbWlseSwgZGlyKTsKIAkJaWYgKGVycikgewogCQkJaWYgKGVyciA9PSAtRVNSQ0gpCkBAIC0xMTIyLDcgKzExNTAsNyBAQAogCQl9CiAJfQogCWNoYWluID0gJm5ldC0+eGZybS5wb2xpY3lfaW5leGFjdFtkaXJdOwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvbCwgY2hhaW4sIGJ5ZHN0KSB7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHBvbCwgY2hhaW4sIGJ5ZHN0KSB7CiAJCWlmICgocG9sLT5wcmlvcml0eSA+PSBwcmlvcml0eSkgJiYgcmV0KQogCQkJYnJlYWs7CiAKQEAgLTExNDAsOSArMTE2OCwxMyBAQAogCQl9CiAJfQogCi0JeGZybV9wb2xfaG9sZChyZXQpOworCWlmIChyZWFkX3NlcWNvdW50X3JldHJ5KCZ4ZnJtX3BvbGljeV9oYXNoX2dlbmVyYXRpb24sIHNlcXVlbmNlKSkKKwkJZ290byByZXRyeTsKKworCWlmIChyZXQgJiYgIXhmcm1fcG9sX2hvbGRfcmN1KHJldCkpCisJCWdvdG8gcmV0cnk7CiBmYWlsOgotCXJlYWRfdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTIxOSwxMCArMTI1MSw5IEBACiAJCQkJCQkgY29uc3Qgc3RydWN0IGZsb3dpICpmbCkKIHsKIAlzdHJ1Y3QgeGZybV9wb2xpY3kgKnBvbDsKLQlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JcmVhZF9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisgYWdhaW46CiAJcG9sID0gcmN1X2RlcmVmZXJlbmNlKHNrLT5za19wb2xpY3lbZGlyXSk7CiAJaWYgKHBvbCAhPSBOVUxMKSB7CiAJCWJvb2wgbWF0Y2ggPSB4ZnJtX3NlbGVjdG9yX21hdGNoKCZwb2wtPnNlbGVjdG9yLCBmbCwKQEAgLTEyMzcsOCArMTI2OCw4IEBACiAJCQllcnIgPSBzZWN1cml0eV94ZnJtX3BvbGljeV9sb29rdXAocG9sLT5zZWN1cml0eSwKIAkJCQkJCSAgICAgIGZsLT5mbG93aV9zZWNpZCwKIAkJCQkJCSAgICAgIHBvbGljeV90b19mbG93X2RpcihkaXIpKTsKLQkJCWlmICghZXJyKQotCQkJCXhmcm1fcG9sX2hvbGQocG9sKTsKKwkJCWlmICghZXJyICYmICF4ZnJtX3BvbF9ob2xkX3JjdShwb2wpKQorCQkJCWdvdG8gYWdhaW47CiAJCQllbHNlIGlmIChlcnIgPT0gLUVTUkNIKQogCQkJCXBvbCA9IE5VTEw7CiAJCQllbHNlCkBAIC0xMjQ3LDcgKzEyNzgsNiBAQAogCQkJcG9sID0gTlVMTDsKIAl9CiBvdXQ6Ci0JcmVhZF91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gcG9sOwogfQpAQCAtMTI3MSw3ICsxMzAxLDcgQEAKIAogCS8qIFNvY2tldCBwb2xpY2llcyBhcmUgbm90IGhhc2hlZC4gKi8KIAlpZiAoIWhsaXN0X3VuaGFzaGVkKCZwb2wtPmJ5ZHN0KSkgewotCQlobGlzdF9kZWwoJnBvbC0+Ynlkc3QpOworCQlobGlzdF9kZWxfcmN1KCZwb2wtPmJ5ZHN0KTsKIAkJaGxpc3RfZGVsKCZwb2wtPmJ5aWR4KTsKIAl9CiAKQEAgLTEyOTUsOSArMTMyNSw5IEBACiB7CiAJc3RydWN0IG5ldCAqbmV0ID0geHBfbmV0KHBvbCk7CiAKLQl3cml0ZV9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAJcG9sID0gX194ZnJtX3BvbGljeV91bmxpbmsocG9sLCBkaXIpOwotCXdyaXRlX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAJaWYgKHBvbCkgewogCQl4ZnJtX3BvbGljeV9raWxsKHBvbCk7CiAJCXJldHVybiAwOwpAQCAtMTMxNiw3ICsxMzQ2LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAjZW5kaWYKIAotCXdyaXRlX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAlvbGRfcG9sID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChzay0+c2tfcG9saWN5W2Rpcl0sCiAJCQkJbG9ja2RlcF9pc19oZWxkKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jaykpOwogCWlmIChwb2wpIHsKQEAgLTEzMzQsNyArMTM2NCw3IEBACiAJCSAqLwogCQl4ZnJtX3NrX3BvbGljeV91bmxpbmsob2xkX3BvbCwgZGlyKTsKIAl9Ci0Jd3JpdGVfdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAogCWlmIChvbGRfcG9sKSB7CiAJCXhmcm1fcG9saWN5X2tpbGwob2xkX3BvbCk7CkBAIC0xMzY0LDkgKzEzOTQsOSBAQAogCQluZXdwLT50eXBlID0gb2xkLT50eXBlOwogCQltZW1jcHkobmV3cC0+eGZybV92ZWMsIG9sZC0+eGZybV92ZWMsCiAJCSAgICAgICBuZXdwLT54ZnJtX25yKnNpemVvZihzdHJ1Y3QgeGZybV90bXBsKSk7Ci0JCXdyaXRlX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwkJc3Bpbl9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAJCXhmcm1fc2tfcG9saWN5X2xpbmsobmV3cCwgZGlyKTsKLQkJd3JpdGVfdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAJCXhmcm1fcG9sX3B1dChuZXdwKTsKIAl9CiAJcmV0dXJuIG5ld3A7CkBAIC0zMDQ4LDcgKzMwNzgsNyBAQAogCiAJLyogSW5pdGlhbGl6ZSB0aGUgcGVyLW5ldCBsb2NrcyBoZXJlICovCiAJc3Bpbl9sb2NrX2luaXQoJm5ldC0+eGZybS54ZnJtX3N0YXRlX2xvY2spOwotCXJ3bG9ja19pbml0KCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAltdXRleF9pbml0KCZuZXQtPnhmcm0ueGZybV9jZmdfbXV0ZXgpOwogCiAJcmV0dXJuIDA7CkBAIC0zMDgyLDYgKzMxMTIsNyBAQAogdm9pZCBfX2luaXQgeGZybV9pbml0KHZvaWQpCiB7CiAJcmVnaXN0ZXJfcGVybmV0X3N1YnN5cygmeGZybV9uZXRfb3BzKTsKKwlzZXFjb3VudF9pbml0KCZ4ZnJtX3BvbGljeV9oYXNoX2dlbmVyYXRpb24pOwogCXhmcm1faW5wdXRfaW5pdCgpOwogfQogCkBAIC0zMTc5LDcgKzMyMTAsNyBAQAogCXN0cnVjdCBobGlzdF9oZWFkICpjaGFpbjsKIAl1MzIgcHJpb3JpdHkgPSB+MFU7CiAKLQlyZWFkX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsgLypGSVhNRSovCisJc3Bpbl9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAJY2hhaW4gPSBwb2xpY3lfaGFzaF9kaXJlY3QobmV0LCAmc2VsLT5kYWRkciwgJnNlbC0+c2FkZHIsIHNlbC0+ZmFtaWx5LCBkaXIpOwogCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvbCwgY2hhaW4sIGJ5ZHN0KSB7CiAJCWlmICh4ZnJtX21pZ3JhdGVfc2VsZWN0b3JfbWF0Y2goc2VsLCAmcG9sLT5zZWxlY3RvcikgJiYKQEAgLTMyMDMsNyArMzIzNCw3IEBACiAKIAl4ZnJtX3BvbF9ob2xkKHJldCk7CiAKLQlyZWFkX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9wcm9jLmMgYi9uZXQveGZybS94ZnJtX3Byb2MuYwppbmRleCA5YzRmYmQ4Li5iYTJiNTM5IDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3Byb2MuYworKysgYi9uZXQveGZybS94ZnJtX3Byb2MuYwpAQCAtNTAsMTIgKzUwLDE4IEBACiAKIHN0YXRpYyBpbnQgeGZybV9zdGF0aXN0aWNzX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogeworCXVuc2lnbmVkIGxvbmcgYnVmZltMSU5VWF9NSUJfWEZSTU1BWF07CiAJc3RydWN0IG5ldCAqbmV0ID0gc2VxLT5wcml2YXRlOwogCWludCBpOworCisJbWVtc2V0KGJ1ZmYsIDAsIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIExJTlVYX01JQl9YRlJNTUFYKTsKKworCXNubXBfZ2V0X2NwdV9maWVsZF9iYXRjaChidWZmLCB4ZnJtX21pYl9saXN0LAorCQkJCSBuZXQtPm1pYi54ZnJtX3N0YXRpc3RpY3MpOwogCWZvciAoaSA9IDA7IHhmcm1fbWliX2xpc3RbaV0ubmFtZTsgaSsrKQogCQlzZXFfcHJpbnRmKHNlcSwgIiUtMjRzXHQlbHVcbiIsIHhmcm1fbWliX2xpc3RbaV0ubmFtZSwKLQkJCSAgIHNubXBfZm9sZF9maWVsZChuZXQtPm1pYi54ZnJtX3N0YXRpc3RpY3MsCi0JCQkJCSAgIHhmcm1fbWliX2xpc3RbaV0uZW50cnkpKTsKKwkJCQkJCWJ1ZmZbaV0pOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fcmVwbGF5LmMgYi9uZXQveGZybS94ZnJtX3JlcGxheS5jCmluZGV4IDRmZDcyNWEuLmNkYzJlMmUgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fcmVwbGF5LmMKKysrIGIvbmV0L3hmcm0veGZybV9yZXBsYXkuYwpAQCAtNTU4LDcgKzU1OCw3IEBACiAJCXgtPnJlcGwtPm5vdGlmeSh4LCBYRlJNX1JFUExBWV9VUERBVEUpOwogfQogCi1zdGF0aWMgc3RydWN0IHhmcm1fcmVwbGF5IHhmcm1fcmVwbGF5X2xlZ2FjeSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeGZybV9yZXBsYXkgeGZybV9yZXBsYXlfbGVnYWN5ID0gewogCS5hZHZhbmNlCT0geGZybV9yZXBsYXlfYWR2YW5jZSwKIAkuY2hlY2sJCT0geGZybV9yZXBsYXlfY2hlY2ssCiAJLnJlY2hlY2sJPSB4ZnJtX3JlcGxheV9jaGVjaywKQEAgLTU2Niw3ICs1NjYsNyBAQAogCS5vdmVyZmxvdwk9IHhmcm1fcmVwbGF5X292ZXJmbG93LAogfTsKIAotc3RhdGljIHN0cnVjdCB4ZnJtX3JlcGxheSB4ZnJtX3JlcGxheV9ibXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHhmcm1fcmVwbGF5IHhmcm1fcmVwbGF5X2JtcCA9IHsKIAkuYWR2YW5jZQk9IHhmcm1fcmVwbGF5X2FkdmFuY2VfYm1wLAogCS5jaGVjawkJPSB4ZnJtX3JlcGxheV9jaGVja19ibXAsCiAJLnJlY2hlY2sJPSB4ZnJtX3JlcGxheV9jaGVja19ibXAsCkBAIC01NzQsNyArNTc0LDcgQEAKIAkub3ZlcmZsb3cJPSB4ZnJtX3JlcGxheV9vdmVyZmxvd19ibXAsCiB9OwogCi1zdGF0aWMgc3RydWN0IHhmcm1fcmVwbGF5IHhmcm1fcmVwbGF5X2VzbiA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeGZybV9yZXBsYXkgeGZybV9yZXBsYXlfZXNuID0gewogCS5hZHZhbmNlCT0geGZybV9yZXBsYXlfYWR2YW5jZV9lc24sCiAJLmNoZWNrCQk9IHhmcm1fcmVwbGF5X2NoZWNrX2VzbiwKIAkucmVjaGVjawk9IHhmcm1fcmVwbGF5X3JlY2hlY2tfZXNuLApkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9zdGF0ZS5jIGIvbmV0L3hmcm0veGZybV9zdGF0ZS5jCmluZGV4IDk4OTVhOGMuLjQxOWJmNWQgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fc3RhdGUuYworKysgYi9uZXQveGZybS94ZnJtX3N0YXRlLmMKQEAgLTI4LDYgKzI4LDExIEBACiAKICNpbmNsdWRlICJ4ZnJtX2hhc2guaCIKIAorI2RlZmluZSB4ZnJtX3N0YXRlX2RlcmVmX3Byb3QodGFibGUsIG5ldCkgXAorCXJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoKHRhYmxlKSwgbG9ja2RlcF9pc19oZWxkKCYobmV0KS0+eGZybS54ZnJtX3N0YXRlX2xvY2spKQorCitzdGF0aWMgdm9pZCB4ZnJtX3N0YXRlX2djX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKwogLyogRWFjaCB4ZnJtX3N0YXRlIG1heSBiZSBsaW5rZWQgdG8gdHdvIHRhYmxlczoKIAogICAgMS4gSGFzaCB0YWJsZSBieSAoc3BpLGRhZGRyLGFoL2VzcCkgdG8gZmluZCBTQSBieSBTUEkuIChpbnB1dCxjdGwpCkBAIC0zNiw2ICs0MSwxNSBAQAogICovCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgeGZybV9zdGF0ZV9oYXNobWF4IF9fcmVhZF9tb3N0bHkgPSAxICogMTAyNCAqIDEwMjQ7CitzdGF0aWMgX19yZWFkX21vc3RseSBzZXFjb3VudF90IHhmcm1fc3RhdGVfaGFzaF9nZW5lcmF0aW9uID0gU0VRQ05UX1pFUk8oeGZybV9zdGF0ZV9oYXNoX2dlbmVyYXRpb24pOworCitzdGF0aWMgREVDTEFSRV9XT1JLKHhmcm1fc3RhdGVfZ2Nfd29yaywgeGZybV9zdGF0ZV9nY190YXNrKTsKK3N0YXRpYyBITElTVF9IRUFEKHhmcm1fc3RhdGVfZ2NfbGlzdCk7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCB4ZnJtX3N0YXRlX2hvbGRfcmN1KHN0cnVjdCB4ZnJtX3N0YXRlIF9fcmN1ICp4KQoreworCXJldHVybiBhdG9taWNfaW5jX25vdF96ZXJvKCZ4LT5yZWZjbnQpOworfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB4ZnJtX2RzdF9oYXNoKHN0cnVjdCBuZXQgKm5ldCwKIAkJCQkJIGNvbnN0IHhmcm1fYWRkcmVzc190ICpkYWRkciwKQEAgLTc2LDE4ICs5MCwxOCBAQAogCQloID0gX194ZnJtX2RzdF9oYXNoKCZ4LT5pZC5kYWRkciwgJngtPnByb3BzLnNhZGRyLAogCQkJCSAgICB4LT5wcm9wcy5yZXFpZCwgeC0+cHJvcHMuZmFtaWx5LAogCQkJCSAgICBuaGFzaG1hc2spOwotCQlobGlzdF9hZGRfaGVhZCgmeC0+Ynlkc3QsIG5kc3R0YWJsZStoKTsKKwkJaGxpc3RfYWRkX2hlYWRfcmN1KCZ4LT5ieWRzdCwgbmRzdHRhYmxlICsgaCk7CiAKIAkJaCA9IF9feGZybV9zcmNfaGFzaCgmeC0+aWQuZGFkZHIsICZ4LT5wcm9wcy5zYWRkciwKIAkJCQkgICAgeC0+cHJvcHMuZmFtaWx5LAogCQkJCSAgICBuaGFzaG1hc2spOwotCQlobGlzdF9hZGRfaGVhZCgmeC0+YnlzcmMsIG5zcmN0YWJsZStoKTsKKwkJaGxpc3RfYWRkX2hlYWRfcmN1KCZ4LT5ieXNyYywgbnNyY3RhYmxlICsgaCk7CiAKIAkJaWYgKHgtPmlkLnNwaSkgewogCQkJaCA9IF9feGZybV9zcGlfaGFzaCgmeC0+aWQuZGFkZHIsIHgtPmlkLnNwaSwKIAkJCQkJICAgIHgtPmlkLnByb3RvLCB4LT5wcm9wcy5mYW1pbHksCiAJCQkJCSAgICBuaGFzaG1hc2spOwotCQkJaGxpc3RfYWRkX2hlYWQoJngtPmJ5c3BpLCBuc3BpdGFibGUraCk7CisJCQlobGlzdF9hZGRfaGVhZF9yY3UoJngtPmJ5c3BpLCBuc3BpdGFibGUgKyBoKTsKIAkJfQogCX0KIH0KQEAgLTEyMiwyNSArMTM2LDI5IEBACiAJfQogCiAJc3Bpbl9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9zdGF0ZV9sb2NrKTsKKwl3cml0ZV9zZXFjb3VudF9iZWdpbigmeGZybV9zdGF0ZV9oYXNoX2dlbmVyYXRpb24pOwogCiAJbmhhc2htYXNrID0gKG5zaXplIC8gc2l6ZW9mKHN0cnVjdCBobGlzdF9oZWFkKSkgLSAxVTsKKwlvZHN0ID0geGZybV9zdGF0ZV9kZXJlZl9wcm90KG5ldC0+eGZybS5zdGF0ZV9ieWRzdCwgbmV0KTsKIAlmb3IgKGkgPSBuZXQtPnhmcm0uc3RhdGVfaG1hc2s7IGkgPj0gMDsgaS0tKQotCQl4ZnJtX2hhc2hfdHJhbnNmZXIobmV0LT54ZnJtLnN0YXRlX2J5ZHN0K2ksIG5kc3QsIG5zcmMsIG5zcGksCi0JCQkJICAgbmhhc2htYXNrKTsKKwkJeGZybV9oYXNoX3RyYW5zZmVyKG9kc3QgKyBpLCBuZHN0LCBuc3JjLCBuc3BpLCBuaGFzaG1hc2spOwogCi0Jb2RzdCA9IG5ldC0+eGZybS5zdGF0ZV9ieWRzdDsKLQlvc3JjID0gbmV0LT54ZnJtLnN0YXRlX2J5c3JjOwotCW9zcGkgPSBuZXQtPnhmcm0uc3RhdGVfYnlzcGk7CisJb3NyYyA9IHhmcm1fc3RhdGVfZGVyZWZfcHJvdChuZXQtPnhmcm0uc3RhdGVfYnlzcmMsIG5ldCk7CisJb3NwaSA9IHhmcm1fc3RhdGVfZGVyZWZfcHJvdChuZXQtPnhmcm0uc3RhdGVfYnlzcGksIG5ldCk7CiAJb2hhc2htYXNrID0gbmV0LT54ZnJtLnN0YXRlX2htYXNrOwogCi0JbmV0LT54ZnJtLnN0YXRlX2J5ZHN0ID0gbmRzdDsKLQluZXQtPnhmcm0uc3RhdGVfYnlzcmMgPSBuc3JjOwotCW5ldC0+eGZybS5zdGF0ZV9ieXNwaSA9IG5zcGk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5ldC0+eGZybS5zdGF0ZV9ieWRzdCwgbmRzdCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5ldC0+eGZybS5zdGF0ZV9ieXNyYywgbnNyYyk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5ldC0+eGZybS5zdGF0ZV9ieXNwaSwgbnNwaSk7CiAJbmV0LT54ZnJtLnN0YXRlX2htYXNrID0gbmhhc2htYXNrOwogCisJd3JpdGVfc2VxY291bnRfZW5kKCZ4ZnJtX3N0YXRlX2hhc2hfZ2VuZXJhdGlvbik7CiAJc3Bpbl91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3N0YXRlX2xvY2spOwogCiAJb3NpemUgPSAob2hhc2htYXNrICsgMSkgKiBzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpOworCisJc3luY2hyb25pemVfcmN1KCk7CisKIAl4ZnJtX2hhc2hfZnJlZShvZHN0LCBvc2l6ZSk7CiAJeGZybV9oYXNoX2ZyZWUob3NyYywgb3NpemUpOwogCXhmcm1faGFzaF9mcmVlKG9zcGksIG9zaXplKTsKQEAgLTMzMiw2ICszNTAsNyBAQAogewogCXRhc2tsZXRfaHJ0aW1lcl9jYW5jZWwoJngtPm10aW1lcik7CiAJZGVsX3RpbWVyX3N5bmMoJngtPnJ0aW1lcik7CisJa2ZyZWUoeC0+YWVhZCk7CiAJa2ZyZWUoeC0+YWFsZyk7CiAJa2ZyZWUoeC0+ZWFsZyk7CiAJa2ZyZWUoeC0+Y2FsZyk7CkBAIC0zNTUsMTUgKzM3NCwxNiBAQAogCiBzdGF0aWMgdm9pZCB4ZnJtX3N0YXRlX2djX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBuZXQgKm5ldCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbmV0LCB4ZnJtLnN0YXRlX2djX3dvcmspOwogCXN0cnVjdCB4ZnJtX3N0YXRlICp4OwogCXN0cnVjdCBobGlzdF9ub2RlICp0bXA7CiAJc3RydWN0IGhsaXN0X2hlYWQgZ2NfbGlzdDsKIAogCXNwaW5fbG9ja19iaCgmeGZybV9zdGF0ZV9nY19sb2NrKTsKLQlobGlzdF9tb3ZlX2xpc3QoJm5ldC0+eGZybS5zdGF0ZV9nY19saXN0LCAmZ2NfbGlzdCk7CisJaGxpc3RfbW92ZV9saXN0KCZ4ZnJtX3N0YXRlX2djX2xpc3QsICZnY19saXN0KTsKIAlzcGluX3VubG9ja19iaCgmeGZybV9zdGF0ZV9nY19sb2NrKTsKIAorCXN5bmNocm9uaXplX3JjdSgpOworCiAJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh4LCB0bXAsICZnY19saXN0LCBnY2xpc3QpCiAJCXhmcm1fc3RhdGVfZ2NfZGVzdHJveSh4KTsKIH0KQEAgLTUwMCwxNCArNTIwLDEyIEBACiAKIHZvaWQgX194ZnJtX3N0YXRlX2Rlc3Ryb3koc3RydWN0IHhmcm1fc3RhdGUgKngpCiB7Ci0Jc3RydWN0IG5ldCAqbmV0ID0geHNfbmV0KHgpOwotCiAJV0FSTl9PTih4LT5rbS5zdGF0ZSAhPSBYRlJNX1NUQVRFX0RFQUQpOwogCiAJc3Bpbl9sb2NrX2JoKCZ4ZnJtX3N0YXRlX2djX2xvY2spOwotCWhsaXN0X2FkZF9oZWFkKCZ4LT5nY2xpc3QsICZuZXQtPnhmcm0uc3RhdGVfZ2NfbGlzdCk7CisJaGxpc3RfYWRkX2hlYWQoJngtPmdjbGlzdCwgJnhmcm1fc3RhdGVfZ2NfbGlzdCk7CiAJc3Bpbl91bmxvY2tfYmgoJnhmcm1fc3RhdGVfZ2NfbG9jayk7Ci0Jc2NoZWR1bGVfd29yaygmbmV0LT54ZnJtLnN0YXRlX2djX3dvcmspOworCXNjaGVkdWxlX3dvcmsoJnhmcm1fc3RhdGVfZ2Nfd29yayk7CiB9CiBFWFBPUlRfU1lNQk9MKF9feGZybV9zdGF0ZV9kZXN0cm95KTsKIApAQCAtNTIwLDEwICs1MzgsMTAgQEAKIAkJeC0+a20uc3RhdGUgPSBYRlJNX1NUQVRFX0RFQUQ7CiAJCXNwaW5fbG9jaygmbmV0LT54ZnJtLnhmcm1fc3RhdGVfbG9jayk7CiAJCWxpc3RfZGVsKCZ4LT5rbS5hbGwpOwotCQlobGlzdF9kZWwoJngtPmJ5ZHN0KTsKLQkJaGxpc3RfZGVsKCZ4LT5ieXNyYyk7CisJCWhsaXN0X2RlbF9yY3UoJngtPmJ5ZHN0KTsKKwkJaGxpc3RfZGVsX3JjdSgmeC0+YnlzcmMpOwogCQlpZiAoeC0+aWQuc3BpKQotCQkJaGxpc3RfZGVsKCZ4LT5ieXNwaSk7CisJCQlobGlzdF9kZWxfcmN1KCZ4LT5ieXNwaSk7CiAJCW5ldC0+eGZybS5zdGF0ZV9udW0tLTsKIAkJc3Bpbl91bmxvY2soJm5ldC0+eGZybS54ZnJtX3N0YXRlX2xvY2spOwogCkBAIC02NTksNyArNjc3LDcgQEAKIAl1bnNpZ25lZCBpbnQgaCA9IHhmcm1fc3BpX2hhc2gobmV0LCBkYWRkciwgc3BpLCBwcm90bywgZmFtaWx5KTsKIAlzdHJ1Y3QgeGZybV9zdGF0ZSAqeDsKIAotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHgsIG5ldC0+eGZybS5zdGF0ZV9ieXNwaStoLCBieXNwaSkgeworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh4LCBuZXQtPnhmcm0uc3RhdGVfYnlzcGkgKyBoLCBieXNwaSkgewogCQlpZiAoeC0+cHJvcHMuZmFtaWx5ICE9IGZhbWlseSB8fAogCQkgICAgeC0+aWQuc3BpICAgICAgICE9IHNwaSB8fAogCQkgICAgeC0+aWQucHJvdG8gICAgICE9IHByb3RvIHx8CkBAIC02NjgsNyArNjg2LDggQEAKIAogCQlpZiAoKG1hcmsgJiB4LT5tYXJrLm0pICE9IHgtPm1hcmsudikKIAkJCWNvbnRpbnVlOwotCQl4ZnJtX3N0YXRlX2hvbGQoeCk7CisJCWlmICgheGZybV9zdGF0ZV9ob2xkX3JjdSh4KSkKKwkJCWNvbnRpbnVlOwogCQlyZXR1cm4geDsKIAl9CiAKQEAgLTY4Myw3ICs3MDIsNyBAQAogCXVuc2lnbmVkIGludCBoID0geGZybV9zcmNfaGFzaChuZXQsIGRhZGRyLCBzYWRkciwgZmFtaWx5KTsKIAlzdHJ1Y3QgeGZybV9zdGF0ZSAqeDsKIAotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHgsIG5ldC0+eGZybS5zdGF0ZV9ieXNyYytoLCBieXNyYykgeworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh4LCBuZXQtPnhmcm0uc3RhdGVfYnlzcmMgKyBoLCBieXNyYykgewogCQlpZiAoeC0+cHJvcHMuZmFtaWx5ICE9IGZhbWlseSB8fAogCQkgICAgeC0+aWQucHJvdG8gICAgICE9IHByb3RvIHx8CiAJCSAgICAheGZybV9hZGRyX2VxdWFsKCZ4LT5pZC5kYWRkciwgZGFkZHIsIGZhbWlseSkgfHwKQEAgLTY5Miw3ICs3MTEsOCBAQAogCiAJCWlmICgobWFyayAmIHgtPm1hcmsubSkgIT0geC0+bWFyay52KQogCQkJY29udGludWU7Ci0JCXhmcm1fc3RhdGVfaG9sZCh4KTsKKwkJaWYgKCF4ZnJtX3N0YXRlX2hvbGRfcmN1KHgpKQorCQkJY29udGludWU7CiAJCXJldHVybiB4OwogCX0KIApAQCAtNzc1LDEzICs3OTUsMTYgQEAKIAlzdHJ1Y3QgeGZybV9zdGF0ZSAqYmVzdCA9IE5VTEw7CiAJdTMyIG1hcmsgPSBwb2wtPm1hcmsudiAmIHBvbC0+bWFyay5tOwogCXVuc2lnbmVkIHNob3J0IGVuY2FwX2ZhbWlseSA9IHRtcGwtPmVuY2FwX2ZhbWlseTsKKwl1bnNpZ25lZCBpbnQgc2VxdWVuY2U7CiAJc3RydWN0IGttX2V2ZW50IGM7CiAKIAl0b19wdXQgPSBOVUxMOwogCi0Jc3Bpbl9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9zdGF0ZV9sb2NrKTsKKwlzZXF1ZW5jZSA9IHJlYWRfc2VxY291bnRfYmVnaW4oJnhmcm1fc3RhdGVfaGFzaF9nZW5lcmF0aW9uKTsKKworCXJjdV9yZWFkX2xvY2soKTsKIAloID0geGZybV9kc3RfaGFzaChuZXQsIGRhZGRyLCBzYWRkciwgdG1wbC0+cmVxaWQsIGVuY2FwX2ZhbWlseSk7Ci0JaGxpc3RfZm9yX2VhY2hfZW50cnkoeCwgbmV0LT54ZnJtLnN0YXRlX2J5ZHN0K2gsIGJ5ZHN0KSB7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHgsIG5ldC0+eGZybS5zdGF0ZV9ieWRzdCArIGgsIGJ5ZHN0KSB7CiAJCWlmICh4LT5wcm9wcy5mYW1pbHkgPT0gZW5jYXBfZmFtaWx5ICYmCiAJCSAgICB4LT5wcm9wcy5yZXFpZCA9PSB0bXBsLT5yZXFpZCAmJgogCQkgICAgKG1hcmsgJiB4LT5tYXJrLm0pID09IHgtPm1hcmsudiAmJgpAQCAtNzk3LDcgKzgyMCw3IEBACiAJCWdvdG8gZm91bmQ7CiAKIAloX3dpbGRjYXJkID0geGZybV9kc3RfaGFzaChuZXQsIGRhZGRyLCAmc2FkZHJfd2lsZGNhcmQsIHRtcGwtPnJlcWlkLCBlbmNhcF9mYW1pbHkpOwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHgsIG5ldC0+eGZybS5zdGF0ZV9ieWRzdCtoX3dpbGRjYXJkLCBieWRzdCkgeworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh4LCBuZXQtPnhmcm0uc3RhdGVfYnlkc3QgKyBoX3dpbGRjYXJkLCBieWRzdCkgewogCQlpZiAoeC0+cHJvcHMuZmFtaWx5ID09IGVuY2FwX2ZhbWlseSAmJgogCQkgICAgeC0+cHJvcHMucmVxaWQgPT0gdG1wbC0+cmVxaWQgJiYKIAkJICAgIChtYXJrICYgeC0+bWFyay5tKSA9PSB4LT5tYXJrLnYgJiYKQEAgLTg1MCwxOSArODczLDIxIEBACiAJCX0KIAogCQlpZiAoa21fcXVlcnkoeCwgdG1wbCwgcG9sKSA9PSAwKSB7CisJCQlzcGluX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3N0YXRlX2xvY2spOwogCQkJeC0+a20uc3RhdGUgPSBYRlJNX1NUQVRFX0FDUTsKIAkJCWxpc3RfYWRkKCZ4LT5rbS5hbGwsICZuZXQtPnhmcm0uc3RhdGVfYWxsKTsKLQkJCWhsaXN0X2FkZF9oZWFkKCZ4LT5ieWRzdCwgbmV0LT54ZnJtLnN0YXRlX2J5ZHN0K2gpOworCQkJaGxpc3RfYWRkX2hlYWRfcmN1KCZ4LT5ieWRzdCwgbmV0LT54ZnJtLnN0YXRlX2J5ZHN0ICsgaCk7CiAJCQloID0geGZybV9zcmNfaGFzaChuZXQsIGRhZGRyLCBzYWRkciwgZW5jYXBfZmFtaWx5KTsKLQkJCWhsaXN0X2FkZF9oZWFkKCZ4LT5ieXNyYywgbmV0LT54ZnJtLnN0YXRlX2J5c3JjK2gpOworCQkJaGxpc3RfYWRkX2hlYWRfcmN1KCZ4LT5ieXNyYywgbmV0LT54ZnJtLnN0YXRlX2J5c3JjICsgaCk7CiAJCQlpZiAoeC0+aWQuc3BpKSB7CiAJCQkJaCA9IHhmcm1fc3BpX2hhc2gobmV0LCAmeC0+aWQuZGFkZHIsIHgtPmlkLnNwaSwgeC0+aWQucHJvdG8sIGVuY2FwX2ZhbWlseSk7Ci0JCQkJaGxpc3RfYWRkX2hlYWQoJngtPmJ5c3BpLCBuZXQtPnhmcm0uc3RhdGVfYnlzcGkraCk7CisJCQkJaGxpc3RfYWRkX2hlYWRfcmN1KCZ4LT5ieXNwaSwgbmV0LT54ZnJtLnN0YXRlX2J5c3BpICsgaCk7CiAJCQl9CiAJCQl4LT5sZnQuaGFyZF9hZGRfZXhwaXJlc19zZWNvbmRzID0gbmV0LT54ZnJtLnN5c2N0bF9hY3FfZXhwaXJlczsKIAkJCXRhc2tsZXRfaHJ0aW1lcl9zdGFydCgmeC0+bXRpbWVyLCBrdGltZV9zZXQobmV0LT54ZnJtLnN5c2N0bF9hY3FfZXhwaXJlcywgMCksIEhSVElNRVJfTU9ERV9SRUwpOwogCQkJbmV0LT54ZnJtLnN0YXRlX251bSsrOwogCQkJeGZybV9oYXNoX2dyb3dfY2hlY2sobmV0LCB4LT5ieWRzdC5uZXh0ICE9IE5VTEwpOworCQkJc3Bpbl91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3N0YXRlX2xvY2spOwogCQl9IGVsc2UgewogCQkJeC0+a20uc3RhdGUgPSBYRlJNX1NUQVRFX0RFQUQ7CiAJCQl0b19wdXQgPSB4OwpAQCAtODcxLDEzICs4OTYsMjYgQEAKIAkJfQogCX0KIG91dDoKLQlpZiAoeCkKLQkJeGZybV9zdGF0ZV9ob2xkKHgpOwotCWVsc2UKKwlpZiAoeCkgeworCQlpZiAoIXhmcm1fc3RhdGVfaG9sZF9yY3UoeCkpIHsKKwkJCSplcnIgPSAtRUFHQUlOOworCQkJeCA9IE5VTEw7CisJCX0KKwl9IGVsc2UgewogCQkqZXJyID0gYWNxdWlyZV9pbl9wcm9ncmVzcyA/IC1FQUdBSU4gOiBlcnJvcjsKLQlzcGluX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fc3RhdGVfbG9jayk7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOwogCWlmICh0b19wdXQpCiAJCXhmcm1fc3RhdGVfcHV0KHRvX3B1dCk7CisKKwlpZiAocmVhZF9zZXFjb3VudF9yZXRyeSgmeGZybV9zdGF0ZV9oYXNoX2dlbmVyYXRpb24sIHNlcXVlbmNlKSkgeworCQkqZXJyID0gLUVBR0FJTjsKKwkJaWYgKHgpIHsKKwkJCXhmcm1fc3RhdGVfcHV0KHgpOworCQkJeCA9IE5VTEw7CisJCX0KKwl9CisKIAlyZXR1cm4geDsKIH0KIApAQCAtOTQ1LDE2ICs5ODMsMTYgQEAKIAogCWggPSB4ZnJtX2RzdF9oYXNoKG5ldCwgJngtPmlkLmRhZGRyLCAmeC0+cHJvcHMuc2FkZHIsCiAJCQkgIHgtPnByb3BzLnJlcWlkLCB4LT5wcm9wcy5mYW1pbHkpOwotCWhsaXN0X2FkZF9oZWFkKCZ4LT5ieWRzdCwgbmV0LT54ZnJtLnN0YXRlX2J5ZHN0K2gpOworCWhsaXN0X2FkZF9oZWFkX3JjdSgmeC0+Ynlkc3QsIG5ldC0+eGZybS5zdGF0ZV9ieWRzdCArIGgpOwogCiAJaCA9IHhmcm1fc3JjX2hhc2gobmV0LCAmeC0+aWQuZGFkZHIsICZ4LT5wcm9wcy5zYWRkciwgeC0+cHJvcHMuZmFtaWx5KTsKLQlobGlzdF9hZGRfaGVhZCgmeC0+YnlzcmMsIG5ldC0+eGZybS5zdGF0ZV9ieXNyYytoKTsKKwlobGlzdF9hZGRfaGVhZF9yY3UoJngtPmJ5c3JjLCBuZXQtPnhmcm0uc3RhdGVfYnlzcmMgKyBoKTsKIAogCWlmICh4LT5pZC5zcGkpIHsKIAkJaCA9IHhmcm1fc3BpX2hhc2gobmV0LCAmeC0+aWQuZGFkZHIsIHgtPmlkLnNwaSwgeC0+aWQucHJvdG8sCiAJCQkJICB4LT5wcm9wcy5mYW1pbHkpOwogCi0JCWhsaXN0X2FkZF9oZWFkKCZ4LT5ieXNwaSwgbmV0LT54ZnJtLnN0YXRlX2J5c3BpK2gpOworCQlobGlzdF9hZGRfaGVhZF9yY3UoJngtPmJ5c3BpLCBuZXQtPnhmcm0uc3RhdGVfYnlzcGkgKyBoKTsKIAl9CiAKIAl0YXNrbGV0X2hydGltZXJfc3RhcnQoJngtPm10aW1lciwga3RpbWVfc2V0KDEsIDApLCBIUlRJTUVSX01PREVfUkVMKTsKQEAgLTEwNjMsOSArMTEwMSw5IEBACiAJCXhmcm1fc3RhdGVfaG9sZCh4KTsKIAkJdGFza2xldF9ocnRpbWVyX3N0YXJ0KCZ4LT5tdGltZXIsIGt0aW1lX3NldChuZXQtPnhmcm0uc3lzY3RsX2FjcV9leHBpcmVzLCAwKSwgSFJUSU1FUl9NT0RFX1JFTCk7CiAJCWxpc3RfYWRkKCZ4LT5rbS5hbGwsICZuZXQtPnhmcm0uc3RhdGVfYWxsKTsKLQkJaGxpc3RfYWRkX2hlYWQoJngtPmJ5ZHN0LCBuZXQtPnhmcm0uc3RhdGVfYnlkc3QraCk7CisJCWhsaXN0X2FkZF9oZWFkX3JjdSgmeC0+Ynlkc3QsIG5ldC0+eGZybS5zdGF0ZV9ieWRzdCArIGgpOwogCQloID0geGZybV9zcmNfaGFzaChuZXQsIGRhZGRyLCBzYWRkciwgZmFtaWx5KTsKLQkJaGxpc3RfYWRkX2hlYWQoJngtPmJ5c3JjLCBuZXQtPnhmcm0uc3RhdGVfYnlzcmMraCk7CisJCWhsaXN0X2FkZF9oZWFkX3JjdSgmeC0+YnlzcmMsIG5ldC0+eGZybS5zdGF0ZV9ieXNyYyArIGgpOwogCiAJCW5ldC0+eGZybS5zdGF0ZV9udW0rKzsKIApAQCAtMTM5NCw5ICsxNDMyLDkgQEAKIHsKIAlzdHJ1Y3QgeGZybV9zdGF0ZSAqeDsKIAotCXNwaW5fbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fc3RhdGVfbG9jayk7CisJcmN1X3JlYWRfbG9jaygpOwogCXggPSBfX3hmcm1fc3RhdGVfbG9va3VwKG5ldCwgbWFyaywgZGFkZHIsIHNwaSwgcHJvdG8sIGZhbWlseSk7Ci0Jc3Bpbl91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3N0YXRlX2xvY2spOworCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiB4OwogfQogRVhQT1JUX1NZTUJPTCh4ZnJtX3N0YXRlX2xvb2t1cCk7CkBAIC0xNTgxLDcgKzE2MTksNyBAQAogCWlmICh4LT5pZC5zcGkpIHsKIAkJc3Bpbl9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9zdGF0ZV9sb2NrKTsKIAkJaCA9IHhmcm1fc3BpX2hhc2gobmV0LCAmeC0+aWQuZGFkZHIsIHgtPmlkLnNwaSwgeC0+aWQucHJvdG8sIHgtPnByb3BzLmZhbWlseSk7Ci0JCWhsaXN0X2FkZF9oZWFkKCZ4LT5ieXNwaSwgbmV0LT54ZnJtLnN0YXRlX2J5c3BpK2gpOworCQlobGlzdF9hZGRfaGVhZF9yY3UoJngtPmJ5c3BpLCBuZXQtPnhmcm0uc3RhdGVfYnlzcGkgKyBoKTsKIAkJc3Bpbl91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3N0YXRlX2xvY2spOwogCiAJCWVyciA9IDA7CkBAIC0yMDk5LDggKzIxMzcsNiBAQAogCiAJbmV0LT54ZnJtLnN0YXRlX251bSA9IDA7CiAJSU5JVF9XT1JLKCZuZXQtPnhmcm0uc3RhdGVfaGFzaF93b3JrLCB4ZnJtX2hhc2hfcmVzaXplKTsKLQlJTklUX0hMSVNUX0hFQUQoJm5ldC0+eGZybS5zdGF0ZV9nY19saXN0KTsKLQlJTklUX1dPUksoJm5ldC0+eGZybS5zdGF0ZV9nY193b3JrLCB4ZnJtX3N0YXRlX2djX3Rhc2spOwogCXNwaW5fbG9ja19pbml0KCZuZXQtPnhmcm0ueGZybV9zdGF0ZV9sb2NrKTsKIAlyZXR1cm4gMDsKIApAQCAtMjExOCw3ICsyMTU0LDcgQEAKIAogCWZsdXNoX3dvcmsoJm5ldC0+eGZybS5zdGF0ZV9oYXNoX3dvcmspOwogCXhmcm1fc3RhdGVfZmx1c2gobmV0LCBJUFNFQ19QUk9UT19BTlksIGZhbHNlKTsKLQlmbHVzaF93b3JrKCZuZXQtPnhmcm0uc3RhdGVfZ2Nfd29yayk7CisJZmx1c2hfd29yaygmeGZybV9zdGF0ZV9nY193b3JrKTsKIAogCVdBUk5fT04oIWxpc3RfZW1wdHkoJm5ldC0+eGZybS5zdGF0ZV9hbGwpKTsKIApkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9zeXNjdGwuYyBiL25ldC94ZnJtL3hmcm1fc3lzY3RsLmMKaW5kZXggMDVhNmUzZC4uMzVhN2U3OSAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9zeXNjdGwuYworKysgYi9uZXQveGZybS94ZnJtX3N5c2N0bC5jCkBAIC0xNywxMyArMTcsMTMgQEAKIAkJLnByb2NuYW1lCT0gInhmcm1fYWV2ZW50X2V0aW1lIiwKIAkJLm1heGxlbgkJPSBzaXplb2YodTMyKSwKIAkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG91aW50dmVjCiAJfSwKIAl7CiAJCS5wcm9jbmFtZQk9ICJ4ZnJtX2FldmVudF9yc2VxdGgiLAogCQkubWF4bGVuCQk9IHNpemVvZih1MzIpLAogCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYworCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb3VpbnR2ZWMKIAl9LAogCXsKIAkJLnByb2NuYW1lCT0gInhmcm1fbGFydmFsX2Ryb3AiLApkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV91c2VyLmMgYi9uZXQveGZybS94ZnJtX3VzZXIuYwppbmRleCBkNTE2ODQ1Li4wODg5MjA5IDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3VzZXIuYworKysgYi9uZXQveGZybS94ZnJtX3VzZXIuYwpAQCAtNTgxLDkgKzU4MSwxMiBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXJyb3I7CiAKLQlpZiAoYXR0cnNbWEZSTUFfU0VDX0NUWF0gJiYKLQkgICAgc2VjdXJpdHlfeGZybV9zdGF0ZV9hbGxvYyh4LCBubGFfZGF0YShhdHRyc1tYRlJNQV9TRUNfQ1RYXSkpKQotCQlnb3RvIGVycm9yOworCWlmIChhdHRyc1tYRlJNQV9TRUNfQ1RYXSkgeworCQllcnIgPSBzZWN1cml0eV94ZnJtX3N0YXRlX2FsbG9jKHgsCisJCQkJCQlubGFfZGF0YShhdHRyc1tYRlJNQV9TRUNfQ1RYXSkpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJvcjsKKwl9CiAKIAlpZiAoKGVyciA9IHhmcm1fYWxsb2NfcmVwbGF5X3N0YXRlX2VzbigmeC0+cmVwbGF5X2VzbiwgJngtPnByZXBsYXlfZXNuLAogCQkJCQkgICAgICAgYXR0cnNbWEZSTUFfUkVQTEFZX0VTTl9WQUxdKSkpCkBAIC04OTYsNyArODk5LDggQEAKIAlzdHJ1Y3Qgc29jayAqc2sgPSBjYi0+c2tiLT5zazsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7CiAKLQl4ZnJtX3N0YXRlX3dhbGtfZG9uZSh3YWxrLCBuZXQpOworCWlmIChjYi0+YXJnc1swXSkKKwkJeGZybV9zdGF0ZV93YWxrX2RvbmUod2FsaywgbmV0KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTIxLDggKzkyNSw2IEBACiAJCXU4IHByb3RvID0gMDsKIAkJaW50IGVycjsKIAotCQljYi0+YXJnc1swXSA9IDE7Ci0KIAkJZXJyID0gbmxtc2dfcGFyc2UoY2ItPm5saCwgMCwgYXR0cnMsIFhGUk1BX01BWCwKIAkJCQkgIHhmcm1hX3BvbGljeSk7CiAJCWlmIChlcnIgPCAwKQpAQCAtOTM5LDYgKzk0MSw3IEBACiAJCQlwcm90byA9IG5sYV9nZXRfdTgoYXR0cnNbWEZSTUFfUFJPVE9dKTsKIAogCQl4ZnJtX3N0YXRlX3dhbGtfaW5pdCh3YWxrLCBwcm90bywgZmlsdGVyKTsKKwkJY2ItPmFyZ3NbMF0gPSAxOwogCX0KIAogCSh2b2lkKSB4ZnJtX3N0YXRlX3dhbGsobmV0LCB3YWxrLCBkdW1wX29uZV9zdGF0ZSwgJmluZm8pOwpAQCAtMjA1MSw5ICsyMDU0LDYgQEAKIAlpZiAodXAtPmhhcmQpIHsKIAkJeGZybV9wb2xpY3lfZGVsZXRlKHhwLCBwLT5kaXIpOwogCQl4ZnJtX2F1ZGl0X3BvbGljeV9kZWxldGUoeHAsIDEsIHRydWUpOwotCX0gZWxzZSB7Ci0JCS8vIHJlc2V0IHRoZSB0aW1lcnMgaGVyZT8KLQkJV0FSTigxLCAiRG9uJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggc29mdCBwb2xpY3kgZXhwaXJlXG4iKTsKIAl9CiAJa21fcG9saWN5X2V4cGlyZWQoeHAsIHAtPmRpciwgdXAtPmhhcmQsIG5saC0+bmxtc2dfcGlkKTsKIApAQCAtMjExNyw3ICsyMTE3LDcgQEAKIAogCWVyciA9IHZlcmlmeV9uZXdwb2xpY3lfaW5mbygmdWEtPnBvbGljeSk7CiAJaWYgKGVycikKLQkJZ290byBiYWRfcG9saWN5OworCQlnb3RvIGZyZWVfc3RhdGU7CiAKIAkvKiAgIGJ1aWxkIGFuIFhQICovCiAJeHAgPSB4ZnJtX3BvbGljeV9jb25zdHJ1Y3QobmV0LCAmdWEtPnBvbGljeSwgYXR0cnMsICZlcnIpOwpAQCAtMjE0OSw4ICsyMTQ5LDYgQEAKIAogCXJldHVybiAwOwogCi1iYWRfcG9saWN5OgotCVdBUk4oMSwgIkJBRCBwb2xpY3kgcGFzc2VkXG4iKTsKIGZyZWVfc3RhdGU6CiAJa2ZyZWUoeCk7CiBub21lbToKZGlmZiAtLWdpdCBhL3NhbXBsZXMvYnBmL01ha2VmaWxlIGIvc2FtcGxlcy9icGYvTWFrZWZpbGUKaW5kZXggOTBlYmY3ZC4uMTJiNzMwNCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9icGYvTWFrZWZpbGUKKysrIGIvc2FtcGxlcy9icGYvTWFrZWZpbGUKQEAgLTI0LDYgKzI0LDkgQEAKIGhvc3Rwcm9ncy15ICs9IHRlc3RfY2dycDJfYXJyYXlfcGluCiBob3N0cHJvZ3MteSArPSB4ZHAxCiBob3N0cHJvZ3MteSArPSB4ZHAyCitob3N0cHJvZ3MteSArPSB0ZXN0X2N1cnJlbnRfdGFza191bmRlcl9jZ3JvdXAKK2hvc3Rwcm9ncy15ICs9IHRyYWNlX2V2ZW50Citob3N0cHJvZ3MteSArPSBzYW1wbGVpcAogCiB0ZXN0X3ZlcmlmaWVyLW9ianMgOj0gdGVzdF92ZXJpZmllci5vIGxpYmJwZi5vCiB0ZXN0X21hcHMtb2JqcyA6PSB0ZXN0X21hcHMubyBsaWJicGYubwpAQCAtNDksNiArNTIsMTAgQEAKIHhkcDEtb2JqcyA6PSBicGZfbG9hZC5vIGxpYmJwZi5vIHhkcDFfdXNlci5vCiAjIHJldXNlIHhkcDEgc291cmNlIGludGVudGlvbmFsbHkKIHhkcDItb2JqcyA6PSBicGZfbG9hZC5vIGxpYmJwZi5vIHhkcDFfdXNlci5vCit0ZXN0X2N1cnJlbnRfdGFza191bmRlcl9jZ3JvdXAtb2JqcyA6PSBicGZfbG9hZC5vIGxpYmJwZi5vIFwKKwkJCQkgICAgICAgdGVzdF9jdXJyZW50X3Rhc2tfdW5kZXJfY2dyb3VwX3VzZXIubwordHJhY2VfZXZlbnQtb2JqcyA6PSBicGZfbG9hZC5vIGxpYmJwZi5vIHRyYWNlX2V2ZW50X3VzZXIubworc2FtcGxlaXAtb2JqcyA6PSBicGZfbG9hZC5vIGxpYmJwZi5vIHNhbXBsZWlwX3VzZXIubwogCiAjIFRlbGwga2J1aWxkIHRvIGFsd2F5cyBidWlsZCB0aGUgcHJvZ3JhbXMKIGFsd2F5cyA6PSAkKGhvc3Rwcm9ncy15KQpAQCAtNjQsNiArNzEsNyBAQAogYWx3YXlzICs9IHRlc3RfcHJvYmVfd3JpdGVfdXNlcl9rZXJuLm8KIGFsd2F5cyArPSB0cmFjZV9vdXRwdXRfa2Vybi5vCiBhbHdheXMgKz0gdGNicGYxX2tlcm4ubworYWx3YXlzICs9IHRjYnBmMl9rZXJuLm8KIGFsd2F5cyArPSBsYXRoaXN0X2tlcm4ubwogYWx3YXlzICs9IG9mZndha2V0aW1lX2tlcm4ubwogYWx3YXlzICs9IHNwaW50ZXN0X2tlcm4ubwpAQCAtNzQsNiArODIsOSBAQAogYWx3YXlzICs9IHRlc3RfY2dycDJfdGNfa2Vybi5vCiBhbHdheXMgKz0geGRwMV9rZXJuLm8KIGFsd2F5cyArPSB4ZHAyX2tlcm4ubworYWx3YXlzICs9IHRlc3RfY3VycmVudF90YXNrX3VuZGVyX2Nncm91cF9rZXJuLm8KK2Fsd2F5cyArPSB0cmFjZV9ldmVudF9rZXJuLm8KK2Fsd2F5cyArPSBzYW1wbGVpcF9rZXJuLm8KIAogSE9TVENGTEFHUyArPSAtSSQob2JqdHJlZSkvdXNyL2luY2x1ZGUKIApAQCAtOTcsNiArMTA4LDkgQEAKIEhPU1RMT0FETElCRVNfdGVzdF9vdmVyaGVhZCArPSAtbGVsZiAtbHJ0CiBIT1NUTE9BRExJQkVTX3hkcDEgKz0gLWxlbGYKIEhPU1RMT0FETElCRVNfeGRwMiArPSAtbGVsZgorSE9TVExPQURMSUJFU190ZXN0X2N1cnJlbnRfdGFza191bmRlcl9jZ3JvdXAgKz0gLWxlbGYKK0hPU1RMT0FETElCRVNfdHJhY2VfZXZlbnQgKz0gLWxlbGYKK0hPU1RMT0FETElCRVNfc2FtcGxlaXAgKz0gLWxlbGYKIAogIyBBbGxvd3MgcG9pbnRpbmcgTExDL0NMQU5HIHRvIGEgTExWTSBiYWNrZW5kIHdpdGggYnBmIHN1cHBvcnQsIHJlZGVmaW5lIG9uIGNtZGxpbmU6CiAjICBtYWtlIHNhbXBsZXMvYnBmLyBMTEM9fi9naXQvbGx2bS9idWlsZC9iaW4vbGxjIENMQU5HPX4vZ2l0L2xsdm0vYnVpbGQvYmluL2NsYW5nCmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi9icGZfaGVscGVycy5oIGIvc2FtcGxlcy9icGYvYnBmX2hlbHBlcnMuaAppbmRleCAyMTdjOGQ1MDcuLjkwZjQ0YmQgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvYnBmL2JwZl9oZWxwZXJzLmgKKysrIGIvc2FtcGxlcy9icGYvYnBmX2hlbHBlcnMuaApAQCAtMzcsMTIgKzM3LDI2IEBACiAJKHZvaWQgKikgQlBGX0ZVTkNfY2xvbmVfcmVkaXJlY3Q7CiBzdGF0aWMgaW50ICgqYnBmX3JlZGlyZWN0KShpbnQgaWZpbmRleCwgaW50IGZsYWdzKSA9CiAJKHZvaWQgKikgQlBGX0ZVTkNfcmVkaXJlY3Q7Ci1zdGF0aWMgaW50ICgqYnBmX3BlcmZfZXZlbnRfb3V0cHV0KSh2b2lkICpjdHgsIHZvaWQgKm1hcCwgaW50IGluZGV4LCB2b2lkICpkYXRhLCBpbnQgc2l6ZSkgPQorc3RhdGljIGludCAoKmJwZl9wZXJmX2V2ZW50X291dHB1dCkodm9pZCAqY3R4LCB2b2lkICptYXAsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBmbGFncywgdm9pZCAqZGF0YSwKKwkJCQkgICAgaW50IHNpemUpID0KIAkodm9pZCAqKSBCUEZfRlVOQ19wZXJmX2V2ZW50X291dHB1dDsKIHN0YXRpYyBpbnQgKCpicGZfZ2V0X3N0YWNraWQpKHZvaWQgKmN0eCwgdm9pZCAqbWFwLCBpbnQgZmxhZ3MpID0KIAkodm9pZCAqKSBCUEZfRlVOQ19nZXRfc3RhY2tpZDsKIHN0YXRpYyBpbnQgKCpicGZfcHJvYmVfd3JpdGVfdXNlcikodm9pZCAqZHN0LCB2b2lkICpzcmMsIGludCBzaXplKSA9CiAJKHZvaWQgKikgQlBGX0ZVTkNfcHJvYmVfd3JpdGVfdXNlcjsKK3N0YXRpYyBpbnQgKCpicGZfY3VycmVudF90YXNrX3VuZGVyX2Nncm91cCkodm9pZCAqbWFwLCBpbnQgaW5kZXgpID0KKwkodm9pZCAqKSBCUEZfRlVOQ19jdXJyZW50X3Rhc2tfdW5kZXJfY2dyb3VwOworc3RhdGljIGludCAoKmJwZl9za2JfZ2V0X3R1bm5lbF9rZXkpKHZvaWQgKmN0eCwgdm9pZCAqa2V5LCBpbnQgc2l6ZSwgaW50IGZsYWdzKSA9CisJKHZvaWQgKikgQlBGX0ZVTkNfc2tiX2dldF90dW5uZWxfa2V5Oworc3RhdGljIGludCAoKmJwZl9za2Jfc2V0X3R1bm5lbF9rZXkpKHZvaWQgKmN0eCwgdm9pZCAqa2V5LCBpbnQgc2l6ZSwgaW50IGZsYWdzKSA9CisJKHZvaWQgKikgQlBGX0ZVTkNfc2tiX3NldF90dW5uZWxfa2V5Oworc3RhdGljIGludCAoKmJwZl9za2JfZ2V0X3R1bm5lbF9vcHQpKHZvaWQgKmN0eCwgdm9pZCAqbWQsIGludCBzaXplKSA9CisJKHZvaWQgKikgQlBGX0ZVTkNfc2tiX2dldF90dW5uZWxfb3B0Oworc3RhdGljIGludCAoKmJwZl9za2Jfc2V0X3R1bm5lbF9vcHQpKHZvaWQgKmN0eCwgdm9pZCAqbWQsIGludCBzaXplKSA9CisJKHZvaWQgKikgQlBGX0ZVTkNfc2tiX3NldF90dW5uZWxfb3B0Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyAoKmJwZl9nZXRfcHJhbmRvbV91MzIpKHZvaWQpID0KKwkodm9pZCAqKSBCUEZfRlVOQ19nZXRfcHJhbmRvbV91MzI7CiAKIC8qIGxsdm0gYnVpbHRpbiBmdW5jdGlvbnMgdGhhdCBlQlBGIEMgcHJvZ3JhbSBtYXkgdXNlIHRvCiAgKiBlbWl0IEJQRl9MRF9BQlMgYW5kIEJQRl9MRF9JTkQgaW5zdHJ1Y3Rpb25zCkBAIC03Miw4ICs4Niw4IEBACiAJKHZvaWQgKikgQlBGX0ZVTkNfbDNfY3N1bV9yZXBsYWNlOwogc3RhdGljIGludCAoKmJwZl9sNF9jc3VtX3JlcGxhY2UpKHZvaWQgKmN0eCwgaW50IG9mZiwgaW50IGZyb20sIGludCB0bywgaW50IGZsYWdzKSA9CiAJKHZvaWQgKikgQlBGX0ZVTkNfbDRfY3N1bV9yZXBsYWNlOwotc3RhdGljIGludCAoKmJwZl9za2JfaW5fY2dyb3VwKSh2b2lkICpjdHgsIHZvaWQgKm1hcCwgaW50IGluZGV4KSA9Ci0JKHZvaWQgKikgQlBGX0ZVTkNfc2tiX2luX2Nncm91cDsKK3N0YXRpYyBpbnQgKCpicGZfc2tiX3VuZGVyX2Nncm91cCkodm9pZCAqY3R4LCB2b2lkICptYXAsIGludCBpbmRleCkgPQorCSh2b2lkICopIEJQRl9GVU5DX3NrYl91bmRlcl9jZ3JvdXA7CiAKICNpZiBkZWZpbmVkKF9feDg2XzY0X18pCiAKZGlmZiAtLWdpdCBhL3NhbXBsZXMvYnBmL2JwZl9sb2FkLmMgYi9zYW1wbGVzL2JwZi9icGZfbG9hZC5jCmluZGV4IDBjZmRhMjMuLjk3OTEzZTEgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvYnBmL2JwZl9sb2FkLmMKKysrIGIvc2FtcGxlcy9icGYvYnBmX2xvYWQuYwpAQCAtNTEsNiArNTEsNyBAQAogCWJvb2wgaXNfa3JldHByb2JlID0gc3RybmNtcChldmVudCwgImtyZXRwcm9iZS8iLCAxMCkgPT0gMDsKIAlib29sIGlzX3RyYWNlcG9pbnQgPSBzdHJuY21wKGV2ZW50LCAidHJhY2Vwb2ludC8iLCAxMSkgPT0gMDsKIAlib29sIGlzX3hkcCA9IHN0cm5jbXAoZXZlbnQsICJ4ZHAiLCAzKSA9PSAwOworCWJvb2wgaXNfcGVyZl9ldmVudCA9IHN0cm5jbXAoZXZlbnQsICJwZXJmX2V2ZW50IiwgMTApID09IDA7CiAJZW51bSBicGZfcHJvZ190eXBlIHByb2dfdHlwZTsKIAljaGFyIGJ1ZlsyNTZdOwogCWludCBmZCwgZWZkLCBlcnIsIGlkOwpAQCAtNjksNiArNzAsOCBAQAogCQlwcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1RSQUNFUE9JTlQ7CiAJfSBlbHNlIGlmIChpc194ZHApIHsKIAkJcHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9YRFA7CisJfSBlbHNlIGlmIChpc19wZXJmX2V2ZW50KSB7CisJCXByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfUEVSRl9FVkVOVDsKIAl9IGVsc2UgewogCQlwcmludGYoIlVua25vd24gZXZlbnQgJyVzJ1xuIiwgZXZlbnQpOwogCQlyZXR1cm4gLTE7CkBAIC04Miw3ICs4NSw3IEBACiAKIAlwcm9nX2ZkW3Byb2dfY250KytdID0gZmQ7CiAKLQlpZiAoaXNfeGRwKQorCWlmIChpc194ZHAgfHwgaXNfcGVyZl9ldmVudCkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoaXNfc29ja2V0KSB7CkBAIC0zMjYsNiArMzI5LDcgQEAKIAkJCSAgICBtZW1jbXAoc2huYW1lX3Byb2csICJrcmV0cHJvYmUvIiwgMTApID09IDAgfHwKIAkJCSAgICBtZW1jbXAoc2huYW1lX3Byb2csICJ0cmFjZXBvaW50LyIsIDExKSA9PSAwIHx8CiAJCQkgICAgbWVtY21wKHNobmFtZV9wcm9nLCAieGRwIiwgMykgPT0gMCB8fAorCQkJICAgIG1lbWNtcChzaG5hbWVfcHJvZywgInBlcmZfZXZlbnQiLCAxMCkgPT0gMCB8fAogCQkJICAgIG1lbWNtcChzaG5hbWVfcHJvZywgInNvY2tldCIsIDYpID09IDApCiAJCQkJbG9hZF9hbmRfYXR0YWNoKHNobmFtZV9wcm9nLCBpbnNucywgZGF0YV9wcm9nLT5kX3NpemUpOwogCQl9CkBAIC0zNDQsNiArMzQ4LDcgQEAKIAkJICAgIG1lbWNtcChzaG5hbWUsICJrcmV0cHJvYmUvIiwgMTApID09IDAgfHwKIAkJICAgIG1lbWNtcChzaG5hbWUsICJ0cmFjZXBvaW50LyIsIDExKSA9PSAwIHx8CiAJCSAgICBtZW1jbXAoc2huYW1lLCAieGRwIiwgMykgPT0gMCB8fAorCQkgICAgbWVtY21wKHNobmFtZSwgInBlcmZfZXZlbnQiLCAxMCkgPT0gMCB8fAogCQkgICAgbWVtY21wKHNobmFtZSwgInNvY2tldCIsIDYpID09IDApCiAJCQlsb2FkX2FuZF9hdHRhY2goc2huYW1lLCBkYXRhLT5kX2J1ZiwgZGF0YS0+ZF9zaXplKTsKIAl9CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi9saWJicGYuaCBiL3NhbXBsZXMvYnBmL2xpYmJwZi5oCmluZGV4IDM2NDU4MmIuLmFjNmVkYjYgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvYnBmL2xpYmJwZi5oCisrKyBiL3NhbXBsZXMvYnBmL2xpYmJwZi5oCkBAIC04NSw2ICs4NSwxNCBAQAogCQkub2ZmICAgPSAwLAkJCQkJXAogCQkuaW1tICAgPSBJTU0gfSkKIAorI2RlZmluZSBCUEZfTU9WMzJfSU1NKERTVCwgSU1NKQkJCQkJXAorCSgoc3RydWN0IGJwZl9pbnNuKSB7CQkJCQlcCisJCS5jb2RlICA9IEJQRl9BTFUgfCBCUEZfTU9WIHwgQlBGX0ssCQlcCisJCS5kc3RfcmVnID0gRFNULAkJCQkJXAorCQkuc3JjX3JlZyA9IDAsCQkJCQlcCisJCS5vZmYgICA9IDAsCQkJCQlcCisJCS5pbW0gICA9IElNTSB9KQorCiAvKiBCUEZfTERfSU1NNjQgbWFjcm8gZW5jb2RlcyBzaW5nbGUgJ2xvYWQgNjQtYml0IGltbWVkaWF0ZScgaW5zbiAqLwogI2RlZmluZSBCUEZfTERfSU1NNjQoRFNULCBJTU0pCQkJCQlcCiAJQlBGX0xEX0lNTTY0X1JBVyhEU1QsIDAsIElNTSkKZGlmZiAtLWdpdCBhL3NhbXBsZXMvYnBmL3NhbXBsZWlwX2tlcm4uYyBiL3NhbXBsZXMvYnBmL3NhbXBsZWlwX2tlcm4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzRhNjgxCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9icGYvc2FtcGxlaXBfa2Vybi5jCkBAIC0wLDAgKzEsMzggQEAKKy8qIENvcHlyaWdodCAyMDE2IE5ldGZsaXgsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvYnBmLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9icGZfcGVyZl9ldmVudC5oPgorI2luY2x1ZGUgImJwZl9oZWxwZXJzLmgiCisKKyNkZWZpbmUgTUFYX0lQUwkJODE5MgorCitzdHJ1Y3QgYnBmX21hcF9kZWYgU0VDKCJtYXBzIikgaXBfbWFwID0geworCS50eXBlID0gQlBGX01BUF9UWVBFX0hBU0gsCisJLmtleV9zaXplID0gc2l6ZW9mKHU2NCksCisJLnZhbHVlX3NpemUgPSBzaXplb2YodTMyKSwKKwkubWF4X2VudHJpZXMgPSBNQVhfSVBTLAorfTsKKworU0VDKCJwZXJmX2V2ZW50IikKK2ludCBkb19zYW1wbGUoc3RydWN0IGJwZl9wZXJmX2V2ZW50X2RhdGEgKmN0eCkKK3sKKwl1NjQgaXA7CisJdTMyICp2YWx1ZSwgaW5pdF92YWwgPSAxOworCisJaXAgPSBjdHgtPnJlZ3MuaXA7CisJdmFsdWUgPSBicGZfbWFwX2xvb2t1cF9lbGVtKCZpcF9tYXAsICZpcCk7CisJaWYgKHZhbHVlKQorCQkqdmFsdWUgKz0gMTsKKwllbHNlCisJCS8qIEUyQklHIG5vdCB0ZXN0ZWQgZm9yIHRoaXMgZXhhbXBsZSBvbmx5ICovCisJCWJwZl9tYXBfdXBkYXRlX2VsZW0oJmlwX21hcCwgJmlwLCAmaW5pdF92YWwsIEJQRl9OT0VYSVNUKTsKKworCXJldHVybiAwOworfQorY2hhciBfbGljZW5zZVtdIFNFQygibGljZW5zZSIpID0gIkdQTCI7CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi9zYW1wbGVpcF91c2VyLmMgYi9zYW1wbGVzL2JwZi9zYW1wbGVpcF91c2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYwYTZiZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvYnBmL3NhbXBsZWlwX3VzZXIuYwpAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqIHNhbXBsZWlwOiBzYW1wbGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciBhbmQgZnJlcXVlbmN5IGNvdW50IGluIGEgQlBGIG1hcC4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNiBOZXRmbGl4LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9icGYuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlICJsaWJicGYuaCIKKyNpbmNsdWRlICJicGZfbG9hZC5oIgorCisjZGVmaW5lIERFRkFVTFRfRlJFUQk5OQorI2RlZmluZSBERUZBVUxUX1NFQ1MJNQorI2RlZmluZSBNQVhfSVBTCQk4MTkyCisjZGVmaW5lIFBBR0VfT0ZGU0VUCTB4ZmZmZjg4MDAwMDAwMDAwMAorCitzdGF0aWMgaW50IG5yX2NwdXM7CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisJcHJpbnRmKCJVU0FHRTogc2FtcGxlaXAgWy1GIGZyZXFdIFtkdXJhdGlvbl1cbiIpOworCXByaW50ZigiICAgICAgIC1GIGZyZXEgICAgIyBzYW1wbGUgZnJlcXVlbmN5IChIZXJ0eiksIGRlZmF1bHQgOTlcbiIpOworCXByaW50ZigiICAgICAgIGR1cmF0aW9uICAgIyBzYW1wbGluZyBkdXJhdGlvbiAoc2Vjb25kcyksIGRlZmF1bHQgNVxuIik7Cit9CisKK3N0YXRpYyBpbnQgc2FtcGxpbmdfc3RhcnQoaW50ICpwbXVfZmQsIGludCBmcmVxKQoreworCWludCBpOworCisJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciBwZV9zYW1wbGVfYXR0ciA9IHsKKwkJLnR5cGUgPSBQRVJGX1RZUEVfU09GVFdBUkUsCisJCS5mcmVxID0gMSwKKwkJLnNhbXBsZV9wZXJpb2QgPSBmcmVxLAorCQkuY29uZmlnID0gUEVSRl9DT1VOVF9TV19DUFVfQ0xPQ0ssCisJCS5pbmhlcml0ID0gMSwKKwl9OworCisJZm9yIChpID0gMDsgaSA8IG5yX2NwdXM7IGkrKykgeworCQlwbXVfZmRbaV0gPSBwZXJmX2V2ZW50X29wZW4oJnBlX3NhbXBsZV9hdHRyLCAtMSAvKiBwaWQgKi8sIGksCisJCQkJCSAgICAtMSAvKiBncm91cF9mZCAqLywgMCAvKiBmbGFncyAqLyk7CisJCWlmIChwbXVfZmRbaV0gPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBJbml0aWFsaXppbmcgcGVyZiBzYW1wbGluZ1xuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlhc3NlcnQoaW9jdGwocG11X2ZkW2ldLCBQRVJGX0VWRU5UX0lPQ19TRVRfQlBGLAorCQkJICAgICBwcm9nX2ZkWzBdKSA9PSAwKTsKKwkJYXNzZXJ0KGlvY3RsKHBtdV9mZFtpXSwgUEVSRl9FVkVOVF9JT0NfRU5BQkxFLCAwKSA9PSAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2FtcGxpbmdfZW5kKGludCAqcG11X2ZkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5yX2NwdXM7IGkrKykKKwkJY2xvc2UocG11X2ZkW2ldKTsKK30KKworc3RydWN0IGlwY291bnQgeworCV9fdTY0IGlwOworCV9fdTMyIGNvdW50OworfTsKKworLyogdXNlZCBmb3Igc29ydGluZyAqLworc3RydWN0IGlwY291bnQgY291bnRzW01BWF9JUFNdOworCitzdGF0aWMgaW50IGNvdW50X2NtcChjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCit7CisJcmV0dXJuICgoc3RydWN0IGlwY291bnQgKilwMSktPmNvdW50IC0gKChzdHJ1Y3QgaXBjb3VudCAqKXAyKS0+Y291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2lwX21hcChpbnQgZmQpCit7CisJc3RydWN0IGtzeW0gKnN5bTsKKwlfX3U2NCBrZXksIG5leHRfa2V5OworCV9fdTMyIHZhbHVlOworCWludCBpLCBtYXg7CisKKwlwcmludGYoIiUtMTlzICUtMzJzICVzXG4iLCAiQUREUiIsICJLU1lNIiwgIkNPVU5UIik7CisKKwkvKiBmZXRjaCBJUHMgYW5kIGNvdW50cyAqLworCWtleSA9IDAsIGkgPSAwOworCXdoaWxlIChicGZfZ2V0X25leHRfa2V5KGZkLCAma2V5LCAmbmV4dF9rZXkpID09IDApIHsKKwkJYnBmX2xvb2t1cF9lbGVtKGZkLCAmbmV4dF9rZXksICZ2YWx1ZSk7CisJCWNvdW50c1tpXS5pcCA9IG5leHRfa2V5OworCQljb3VudHNbaSsrXS5jb3VudCA9IHZhbHVlOworCQlrZXkgPSBuZXh0X2tleTsKKwl9CisJbWF4ID0gaTsKKworCS8qIHNvcnQgYW5kIHByaW50ICovCisJcXNvcnQoY291bnRzLCBtYXgsIHNpemVvZihzdHJ1Y3QgaXBjb3VudCksIGNvdW50X2NtcCk7CisJZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKSB7CisJCWlmIChjb3VudHNbaV0uaXAgPiBQQUdFX09GRlNFVCkgeworCQkJc3ltID0ga3N5bV9zZWFyY2goY291bnRzW2ldLmlwKTsKKwkJCXByaW50ZigiMHglLTE3bGx4ICUtMzJzICV1XG4iLCBjb3VudHNbaV0uaXAsIHN5bS0+bmFtZSwKKwkJCSAgICAgICBjb3VudHNbaV0uY291bnQpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCIweCUtMTdsbHggJS0zMnMgJXVcbiIsIGNvdW50c1tpXS5pcCwgIih1c2VyKSIsCisJCQkgICAgICAgY291bnRzW2ldLmNvdW50KTsKKwkJfQorCX0KKworCWlmIChtYXggPT0gTUFYX0lQUykgeworCQlwcmludGYoIldBUk5JTkc6IElQIGhhc2ggd2FzIGZ1bGwgKG1heCAlZCBlbnRyaWVzKTsgIiwgbWF4KTsKKwkJcHJpbnRmKCJtYXkgaGF2ZSBkcm9wcGVkIHNhbXBsZXNcbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgaW50X2V4aXQoaW50IHNpZykKK3sKKwlwcmludGYoIlxuIik7CisJcHJpbnRfaXBfbWFwKG1hcF9mZFswXSk7CisJZXhpdCgwKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgZmlsZW5hbWVbMjU2XTsKKwlpbnQgKnBtdV9mZCwgb3B0LCBmcmVxID0gREVGQVVMVF9GUkVRLCBzZWNzID0gREVGQVVMVF9TRUNTOworCisJLyogcHJvY2VzcyBhcmd1bWVudHMgKi8KKwl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiRjpoIikpICE9IC0xKSB7CisJCXN3aXRjaCAob3B0KSB7CisJCWNhc2UgJ0YnOgorCQkJZnJlcSA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdoJzoKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlpZiAoYXJnYyAtIG9wdGluZCA9PSAxKQorCQlzZWNzID0gYXRvaShhcmd2W29wdGluZF0pOworCWlmIChmcmVxID09IDAgfHwgc2VjcyA9PSAwKSB7CisJCXVzYWdlKCk7CisJCXJldHVybiAxOworCX0KKworCS8qIGluaXRpYWxpemUga2VybmVsIHN5bWJvbCB0cmFuc2xhdGlvbiAqLworCWlmIChsb2FkX2thbGxzeW1zKCkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogbG9hZGluZyAvcHJvYy9rYWxsc3ltc1xuIik7CisJCXJldHVybiAyOworCX0KKworCS8qIGNyZWF0ZSBwZXJmIEZEcyBmb3IgZWFjaCBDUFUgKi8KKwlucl9jcHVzID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfQ09ORik7CisJcG11X2ZkID0gbWFsbG9jKG5yX2NwdXMgKiBzaXplb2YoaW50KSk7CisJaWYgKHBtdV9mZCA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IG1hbGxvYyBvZiBwbXVfZmRcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBsb2FkIEJQRiBwcm9ncmFtICovCisJc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICIlc19rZXJuLm8iLCBhcmd2WzBdKTsKKwlpZiAobG9hZF9icGZfZmlsZShmaWxlbmFtZSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogbG9hZGluZyBCUEYgcHJvZ3JhbSAoZXJybm8gJWQpOlxuIiwKKwkJCWVycm5vKTsKKwkJaWYgKHN0cmNtcChicGZfbG9nX2J1ZiwgIiIpID09IDApCisJCQlmcHJpbnRmKHN0ZGVyciwgIlRyeTogdWxpbWl0IC1sIHVubGltaXRlZFxuIik7CisJCWVsc2UKKwkJCWZwcmludGYoc3RkZXJyLCAiJXMiLCBicGZfbG9nX2J1Zik7CisJCXJldHVybiAxOworCX0KKwlzaWduYWwoU0lHSU5ULCBpbnRfZXhpdCk7CisKKwkvKiBkbyBzYW1wbGluZyAqLworCXByaW50ZigiU2FtcGxpbmcgYXQgJWQgSGVydHogZm9yICVkIHNlY29uZHMuIEN0cmwtQyBhbHNvIGVuZHMuXG4iLAorCSAgICAgICBmcmVxLCBzZWNzKTsKKwlpZiAoc2FtcGxpbmdfc3RhcnQocG11X2ZkLCBmcmVxKSAhPSAwKQorCQlyZXR1cm4gMTsKKwlzbGVlcChzZWNzKTsKKwlzYW1wbGluZ19lbmQocG11X2ZkKTsKKwlmcmVlKHBtdV9mZCk7CisKKwkvKiBvdXRwdXQgc2FtcGxlIGNvdW50cyAqLworCXByaW50X2lwX21hcChtYXBfZmRbMF0pOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi9zb2NrZXgyX2tlcm4uYyBiL3NhbXBsZXMvYnBmL3NvY2tleDJfa2Vybi5jCmluZGV4IGJhMGUxNzcuLjQ0ZTU4NDYgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvYnBmL3NvY2tleDJfa2Vybi5jCisrKyBiL3NhbXBsZXMvYnBmL3NvY2tleDJfa2Vybi5jCkBAIC0xNCw3ICsxNCw3IEBACiAJX19iZTE2IGhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG87CiB9OwogCi1zdHJ1Y3QgZmxvd19rZXlzIHsKK3N0cnVjdCBicGZfZmxvd19rZXlzIHsKIAlfX2JlMzIgc3JjOwogCV9fYmUzMiBkc3Q7CiAJdW5pb24gewpAQCAtNTksNyArNTksNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIF9fdTY0IHBhcnNlX2lwKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYiwgX191NjQgbmhvZmYsIF9fdTY0ICppcF9wcm90bywKLQkJCSAgICAgc3RydWN0IGZsb3dfa2V5cyAqZmxvdykKKwkJCSAgICAgc3RydWN0IGJwZl9mbG93X2tleXMgKmZsb3cpCiB7CiAJX191NjQgdmVybGVuOwogCkBAIC04Myw3ICs4Myw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgX191NjQgcGFyc2VfaXB2NihzdHJ1Y3QgX19za19idWZmICpza2IsIF9fdTY0IG5ob2ZmLCBfX3U2NCAqaXBfcHJvdG8sCi0JCQkgICAgICAgc3RydWN0IGZsb3dfa2V5cyAqZmxvdykKKwkJCSAgICAgICBzdHJ1Y3QgYnBmX2Zsb3dfa2V5cyAqZmxvdykKIHsKIAkqaXBfcHJvdG8gPSBsb2FkX2J5dGUoc2tiLAogCQkJICAgICAgbmhvZmYgKyBvZmZzZXRvZihzdHJ1Y3QgaXB2NmhkciwgbmV4dGhkcikpOwpAQCAtOTYsNyArOTYsNyBAQAogCXJldHVybiBuaG9mZjsKIH0KIAotc3RhdGljIGlubGluZSBib29sIGZsb3dfZGlzc2VjdG9yKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYiwgc3RydWN0IGZsb3dfa2V5cyAqZmxvdykKK3N0YXRpYyBpbmxpbmUgYm9vbCBmbG93X2Rpc3NlY3RvcihzdHJ1Y3QgX19za19idWZmICpza2IsIHN0cnVjdCBicGZfZmxvd19rZXlzICpmbG93KQogewogCV9fdTY0IG5ob2ZmID0gRVRIX0hMRU47CiAJX191NjQgaXBfcHJvdG87CkBAIC0xOTgsNyArMTk4LDcgQEAKIFNFQygic29ja2V0MiIpCiBpbnQgYnBmX3Byb2cyKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgZmxvd19rZXlzIGZsb3c7CisJc3RydWN0IGJwZl9mbG93X2tleXMgZmxvdzsKIAlzdHJ1Y3QgcGFpciAqdmFsdWU7CiAJdTMyIGtleTsKIApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9icGYvc29ja2V4M19rZXJuLmMgYi9zYW1wbGVzL2JwZi9zb2NrZXgzX2tlcm4uYwppbmRleCA0MWFlMmZkLi45NTkwN2Y4IDEwMDY0NAotLS0gYS9zYW1wbGVzL2JwZi9zb2NrZXgzX2tlcm4uYworKysgYi9zYW1wbGVzL2JwZi9zb2NrZXgzX2tlcm4uYwpAQCAtNjEsNyArNjEsNyBAQAogCV9fYmUxNiBoX3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvOwogfTsKIAotc3RydWN0IGZsb3dfa2V5cyB7CitzdHJ1Y3QgYnBmX2Zsb3dfa2V5cyB7CiAJX19iZTMyIHNyYzsKIAlfX2JlMzIgZHN0OwogCXVuaW9uIHsKQEAgLTg4LDcgKzg4LDcgQEAKIH0KIAogc3RydWN0IGdsb2JhbHMgewotCXN0cnVjdCBmbG93X2tleXMgZmxvdzsKKwlzdHJ1Y3QgYnBmX2Zsb3dfa2V5cyBmbG93OwogfTsKIAogc3RydWN0IGJwZl9tYXBfZGVmIFNFQygibWFwcyIpIHBlcmNwdV9tYXAgPSB7CkBAIC0xMTQsMTQgKzExNCwxNCBAQAogCiBzdHJ1Y3QgYnBmX21hcF9kZWYgU0VDKCJtYXBzIikgaGFzaF9tYXAgPSB7CiAJLnR5cGUgPSBCUEZfTUFQX1RZUEVfSEFTSCwKLQkua2V5X3NpemUgPSBzaXplb2Yoc3RydWN0IGZsb3dfa2V5cyksCisJLmtleV9zaXplID0gc2l6ZW9mKHN0cnVjdCBicGZfZmxvd19rZXlzKSwKIAkudmFsdWVfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcGFpciksCiAJLm1heF9lbnRyaWVzID0gMTAyNCwKIH07CiAKIHN0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0cyhzdHJ1Y3QgX19za19idWZmICpza2IsIHN0cnVjdCBnbG9iYWxzICpnKQogewotCXN0cnVjdCBmbG93X2tleXMga2V5ID0gZy0+ZmxvdzsKKwlzdHJ1Y3QgYnBmX2Zsb3dfa2V5cyBrZXkgPSBnLT5mbG93OwogCXN0cnVjdCBwYWlyICp2YWx1ZTsKIAogCXZhbHVlID0gYnBmX21hcF9sb29rdXBfZWxlbSgmaGFzaF9tYXAsICZrZXkpOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9icGYvc29ja2V4M191c2VyLmMgYi9zYW1wbGVzL2JwZi9zb2NrZXgzX3VzZXIuYwppbmRleCBkNDE4NGFiLi4zZmNmZDhjIDEwMDY0NAotLS0gYS9zYW1wbGVzL2JwZi9zb2NrZXgzX3VzZXIuYworKysgYi9zYW1wbGVzL2JwZi9zb2NrZXgzX3VzZXIuYwpAQCAtNyw3ICs3LDcgQEAKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KICNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KIAotc3RydWN0IGZsb3dfa2V5cyB7CitzdHJ1Y3QgYnBmX2Zsb3dfa2V5cyB7CiAJX19iZTMyIHNyYzsKIAlfX2JlMzIgZHN0OwogCXVuaW9uIHsKQEAgLTQ5LDcgKzQ5LDcgQEAKIAkodm9pZCkgZjsKIAogCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJc3RydWN0IGZsb3dfa2V5cyBrZXkgPSB7fSwgbmV4dF9rZXk7CisJCXN0cnVjdCBicGZfZmxvd19rZXlzIGtleSA9IHt9LCBuZXh0X2tleTsKIAkJc3RydWN0IHBhaXIgdmFsdWU7CiAKIAkJc2xlZXAoMSk7CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi90Y2JwZjJfa2Vybi5jIGIvc2FtcGxlcy9icGYvdGNicGYyX2tlcm4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzAzYmI4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9icGYvdGNicGYyX2tlcm4uYwpAQCAtMCwwICsxLDM4MSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE2IFZNd2FyZQorICogQ29weXJpZ2h0IChjKSAyMDE2IEZhY2Vib29rCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPHVhcGkvbGludXgvYnBmLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvaWZfcGFja2V0Lmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9pcC5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvaXB2Ni5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvaW4uaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L3RjcC5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvZmlsdGVyLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9wa3RfY2xzLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlICJicGZfaGVscGVycy5oIgorCisjZGVmaW5lIF9odG9ubCBfX2J1aWx0aW5fYnN3YXAzMgorI2RlZmluZSBFUlJPUihyZXQpIGRvIHtcCisJCWNoYXIgZm10W10gPSAiRVJST1IgbGluZTolZCByZXQ6JWRcbiI7XAorCQlicGZfdHJhY2VfcHJpbnRrKGZtdCwgc2l6ZW9mKGZtdCksIF9fTElORV9fLCByZXQpOyBcCisJfSB3aGlsZSgwKQorCitzdHJ1Y3QgZ2VuZXZlX29wdCB7CisJX19iZTE2CW9wdF9jbGFzczsKKwl1OAl0eXBlOworCXU4CWxlbmd0aDo1OworCXU4CXIzOjE7CisJdTgJcjI6MTsKKwl1OAlyMToxOworCXU4CW9wdF9kYXRhWzhdOyAvKiBoYXJkLWNvZGVkIHRvIDggYnl0ZSAqLworfTsKKworc3RydWN0IHZ4bGFuX21ldGFkYXRhIHsKKwl1MzIgICAgIGdicDsKK307CisKK1NFQygiZ3JlX3NldF90dW5uZWwiKQoraW50IF9ncmVfc2V0X3R1bm5lbChzdHJ1Y3QgX19za19idWZmICpza2IpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYnBmX3R1bm5lbF9rZXkga2V5OworCisJX19idWlsdGluX21lbXNldCgma2V5LCAweDAsIHNpemVvZihrZXkpKTsKKwlrZXkucmVtb3RlX2lwdjQgPSAweGFjMTAwMTY0OyAvKiAxNzIuMTYuMS4xMDAgKi8KKwlrZXkudHVubmVsX2lkID0gMjsKKwlrZXkudHVubmVsX3RvcyA9IDA7CisJa2V5LnR1bm5lbF90dGwgPSA2NDsKKworCXJldCA9IGJwZl9za2Jfc2V0X3R1bm5lbF9rZXkoc2tiLCAma2V5LCBzaXplb2Yoa2V5KSwgQlBGX0ZfWkVST19DU1VNX1RYKTsKKwlpZiAocmV0IDwgMCkgeworCQlFUlJPUihyZXQpOworCQlyZXR1cm4gVENfQUNUX1NIT1Q7CisJfQorCisJcmV0dXJuIFRDX0FDVF9PSzsKK30KKworU0VDKCJncmVfZ2V0X3R1bm5lbCIpCitpbnQgX2dyZV9nZXRfdHVubmVsKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBicGZfdHVubmVsX2tleSBrZXk7CisJY2hhciBmbXRbXSA9ICJrZXkgJWQgcmVtb3RlIGlwIDB4JXhcbiI7CisKKwlyZXQgPSBicGZfc2tiX2dldF90dW5uZWxfa2V5KHNrYiwgJmtleSwgc2l6ZW9mKGtleSksIDApOworCWlmIChyZXQgPCAwKSB7CisJCUVSUk9SKHJldCk7CisJCXJldHVybiBUQ19BQ1RfU0hPVDsKKwl9CisKKwlicGZfdHJhY2VfcHJpbnRrKGZtdCwgc2l6ZW9mKGZtdCksIGtleS50dW5uZWxfaWQsIGtleS5yZW1vdGVfaXB2NCk7CisJcmV0dXJuIFRDX0FDVF9PSzsKK30KKworU0VDKCJ2eGxhbl9zZXRfdHVubmVsIikKK2ludCBfdnhsYW5fc2V0X3R1bm5lbChzdHJ1Y3QgX19za19idWZmICpza2IpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYnBmX3R1bm5lbF9rZXkga2V5OworCXN0cnVjdCB2eGxhbl9tZXRhZGF0YSBtZDsKKworCV9fYnVpbHRpbl9tZW1zZXQoJmtleSwgMHgwLCBzaXplb2Yoa2V5KSk7CisJa2V5LnJlbW90ZV9pcHY0ID0gMHhhYzEwMDE2NDsgLyogMTcyLjE2LjEuMTAwICovCisJa2V5LnR1bm5lbF9pZCA9IDI7CisJa2V5LnR1bm5lbF90b3MgPSAwOworCWtleS50dW5uZWxfdHRsID0gNjQ7CisKKwlyZXQgPSBicGZfc2tiX3NldF90dW5uZWxfa2V5KHNrYiwgJmtleSwgc2l6ZW9mKGtleSksIEJQRl9GX1pFUk9fQ1NVTV9UWCk7CisJaWYgKHJldCA8IDApIHsKKwkJRVJST1IocmV0KTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCW1kLmdicCA9IDB4ODAwRkY7IC8qIFNldCBWWExBTiBHcm91cCBQb2xpY3kgZXh0ZW5zaW9uICovCisJcmV0ID0gYnBmX3NrYl9zZXRfdHVubmVsX29wdChza2IsICZtZCwgc2l6ZW9mKG1kKSk7CisJaWYgKHJldCA8IDApIHsKKwkJRVJST1IocmV0KTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCXJldHVybiBUQ19BQ1RfT0s7Cit9CisKK1NFQygidnhsYW5fZ2V0X3R1bm5lbCIpCitpbnQgX3Z4bGFuX2dldF90dW5uZWwoc3RydWN0IF9fc2tfYnVmZiAqc2tiKQoreworCWludCByZXQ7CisJc3RydWN0IGJwZl90dW5uZWxfa2V5IGtleTsKKwlzdHJ1Y3QgdnhsYW5fbWV0YWRhdGEgbWQ7CisJY2hhciBmbXRbXSA9ICJrZXkgJWQgcmVtb3RlIGlwIDB4JXggdnhsYW4gZ2JwIDB4JXhcbiI7CisKKwlyZXQgPSBicGZfc2tiX2dldF90dW5uZWxfa2V5KHNrYiwgJmtleSwgc2l6ZW9mKGtleSksIDApOworCWlmIChyZXQgPCAwKSB7CisJCUVSUk9SKHJldCk7CisJCXJldHVybiBUQ19BQ1RfU0hPVDsKKwl9CisKKwlyZXQgPSBicGZfc2tiX2dldF90dW5uZWxfb3B0KHNrYiwgJm1kLCBzaXplb2YobWQpKTsKKwlpZiAocmV0IDwgMCkgeworCQlFUlJPUihyZXQpOworCQlyZXR1cm4gVENfQUNUX1NIT1Q7CisJfQorCisJYnBmX3RyYWNlX3ByaW50ayhmbXQsIHNpemVvZihmbXQpLAorCQkJa2V5LnR1bm5lbF9pZCwga2V5LnJlbW90ZV9pcHY0LCBtZC5nYnApOworCisJcmV0dXJuIFRDX0FDVF9PSzsKK30KKworU0VDKCJnZW5ldmVfc2V0X3R1bm5lbCIpCitpbnQgX2dlbmV2ZV9zZXRfdHVubmVsKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmV0LCByZXQyOworCXN0cnVjdCBicGZfdHVubmVsX2tleSBrZXk7CisJc3RydWN0IGdlbmV2ZV9vcHQgZ29wdDsKKworCV9fYnVpbHRpbl9tZW1zZXQoJmtleSwgMHgwLCBzaXplb2Yoa2V5KSk7CisJa2V5LnJlbW90ZV9pcHY0ID0gMHhhYzEwMDE2NDsgLyogMTcyLjE2LjEuMTAwICovCisJa2V5LnR1bm5lbF9pZCA9IDI7CisJa2V5LnR1bm5lbF90b3MgPSAwOworCWtleS50dW5uZWxfdHRsID0gNjQ7CisKKwlfX2J1aWx0aW5fbWVtc2V0KCZnb3B0LCAweDAsIHNpemVvZihnb3B0KSk7CisJZ29wdC5vcHRfY2xhc3MgPSAweDEwMjsgLyogT3BlbiBWaXJ0dWFsIE5ldHdvcmtpbmcgKE9WTikgKi8KKwlnb3B0LnR5cGUgPSAweDA4OworCWdvcHQucjEgPSAxOworCWdvcHQucjIgPSAwOworCWdvcHQucjMgPSAxOworCWdvcHQubGVuZ3RoID0gMjsgLyogNC1ieXRlIG11bHRpcGxlICovCisJKihpbnQgKikgJmdvcHQub3B0X2RhdGEgPSAweGRlYWRiZWVmOworCisJcmV0ID0gYnBmX3NrYl9zZXRfdHVubmVsX2tleShza2IsICZrZXksIHNpemVvZihrZXkpLCBCUEZfRl9aRVJPX0NTVU1fVFgpOworCWlmIChyZXQgPCAwKSB7CisJCUVSUk9SKHJldCk7CisJCXJldHVybiBUQ19BQ1RfU0hPVDsKKwl9CisKKwlyZXQgPSBicGZfc2tiX3NldF90dW5uZWxfb3B0KHNrYiwgJmdvcHQsIHNpemVvZihnb3B0KSk7CisJaWYgKHJldCA8IDApIHsKKwkJRVJST1IocmV0KTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCXJldHVybiBUQ19BQ1RfT0s7Cit9CisKK1NFQygiZ2VuZXZlX2dldF90dW5uZWwiKQoraW50IF9nZW5ldmVfZ2V0X3R1bm5lbChzdHJ1Y3QgX19za19idWZmICpza2IpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYnBmX3R1bm5lbF9rZXkga2V5OworCXN0cnVjdCBnZW5ldmVfb3B0IGdvcHQ7CisJY2hhciBmbXRbXSA9ICJrZXkgJWQgcmVtb3RlIGlwIDB4JXggZ2VuZXZlIGNsYXNzIDB4JXhcbiI7CisKKwlyZXQgPSBicGZfc2tiX2dldF90dW5uZWxfa2V5KHNrYiwgJmtleSwgc2l6ZW9mKGtleSksIDApOworCWlmIChyZXQgPCAwKSB7CisJCUVSUk9SKHJldCk7CisJCXJldHVybiBUQ19BQ1RfU0hPVDsKKwl9CisKKwlyZXQgPSBicGZfc2tiX2dldF90dW5uZWxfb3B0KHNrYiwgJmdvcHQsIHNpemVvZihnb3B0KSk7CisJaWYgKHJldCA8IDApIHsKKwkJRVJST1IocmV0KTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCWJwZl90cmFjZV9wcmludGsoZm10LCBzaXplb2YoZm10KSwKKwkJCWtleS50dW5uZWxfaWQsIGtleS5yZW1vdGVfaXB2NCwgZ29wdC5vcHRfY2xhc3MpOworCXJldHVybiBUQ19BQ1RfT0s7Cit9CisKK1NFQygiaXBpcF9zZXRfdHVubmVsIikKK2ludCBfaXBpcF9zZXRfdHVubmVsKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgYnBmX3R1bm5lbF9rZXkga2V5ID0ge307CisJdm9pZCAqZGF0YSA9ICh2b2lkICopKGxvbmcpc2tiLT5kYXRhOworCXN0cnVjdCBpcGhkciAqaXBoID0gZGF0YTsKKwlzdHJ1Y3QgdGNwaGRyICp0Y3AgPSBkYXRhICsgc2l6ZW9mKCppcGgpOworCXZvaWQgKmRhdGFfZW5kID0gKHZvaWQgKikobG9uZylza2ItPmRhdGFfZW5kOworCWludCByZXQ7CisKKwkvKiBzaW5nbGUgbGVuZ3RoIGNoZWNrICovCisJaWYgKGRhdGEgKyBzaXplb2YoKmlwaCkgKyBzaXplb2YoKnRjcCkgPiBkYXRhX2VuZCkgeworCQlFUlJPUigxKTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCWtleS50dW5uZWxfdHRsID0gNjQ7CisJaWYgKGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19JQ01QKSB7CisJCWtleS5yZW1vdGVfaXB2NCA9IDB4YWMxMDAxNjQ7IC8qIDE3Mi4xNi4xLjEwMCAqLworCX0gZWxzZSB7CisJCWlmIChpcGgtPnByb3RvY29sICE9IElQUFJPVE9fVENQIHx8IGlwaC0+aWhsICE9IDUpCisJCQlyZXR1cm4gVENfQUNUX1NIT1Q7CisKKwkJaWYgKHRjcC0+ZGVzdCA9PSBodG9ucyg1MjAwKSkKKwkJCWtleS5yZW1vdGVfaXB2NCA9IDB4YWMxMDAxNjQ7IC8qIDE3Mi4xNi4xLjEwMCAqLworCQllbHNlIGlmICh0Y3AtPmRlc3QgPT0gaHRvbnMoNTIwMSkpCisJCQlrZXkucmVtb3RlX2lwdjQgPSAweGFjMTAwMTY1OyAvKiAxNzIuMTYuMS4xMDEgKi8KKwkJZWxzZQorCQkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCXJldCA9IGJwZl9za2Jfc2V0X3R1bm5lbF9rZXkoc2tiLCAma2V5LCBzaXplb2Yoa2V5KSwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJRVJST1IocmV0KTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCXJldHVybiBUQ19BQ1RfT0s7Cit9CisKK1NFQygiaXBpcF9nZXRfdHVubmVsIikKK2ludCBfaXBpcF9nZXRfdHVubmVsKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBicGZfdHVubmVsX2tleSBrZXk7CisJY2hhciBmbXRbXSA9ICJyZW1vdGUgaXAgMHgleFxuIjsKKworCXJldCA9IGJwZl9za2JfZ2V0X3R1bm5lbF9rZXkoc2tiLCAma2V5LCBzaXplb2Yoa2V5KSwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJRVJST1IocmV0KTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCWJwZl90cmFjZV9wcmludGsoZm10LCBzaXplb2YoZm10KSwga2V5LnJlbW90ZV9pcHY0KTsKKwlyZXR1cm4gVENfQUNUX09LOworfQorCitTRUMoImlwaXA2X3NldF90dW5uZWwiKQoraW50IF9pcGlwNl9zZXRfdHVubmVsKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgYnBmX3R1bm5lbF9rZXkga2V5ID0ge307CisJdm9pZCAqZGF0YSA9ICh2b2lkICopKGxvbmcpc2tiLT5kYXRhOworCXN0cnVjdCBpcGhkciAqaXBoID0gZGF0YTsKKwlzdHJ1Y3QgdGNwaGRyICp0Y3AgPSBkYXRhICsgc2l6ZW9mKCppcGgpOworCXZvaWQgKmRhdGFfZW5kID0gKHZvaWQgKikobG9uZylza2ItPmRhdGFfZW5kOworCWludCByZXQ7CisKKwkvKiBzaW5nbGUgbGVuZ3RoIGNoZWNrICovCisJaWYgKGRhdGEgKyBzaXplb2YoKmlwaCkgKyBzaXplb2YoKnRjcCkgPiBkYXRhX2VuZCkgeworCQlFUlJPUigxKTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCWtleS5yZW1vdGVfaXB2NlswXSA9IF9odG9ubCgweDI0MDFkYjAwKTsKKwlrZXkudHVubmVsX3R0bCA9IDY0OworCisJaWYgKGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19JQ01QKSB7CisJCWtleS5yZW1vdGVfaXB2NlszXSA9IF9odG9ubCgxKTsKKwl9IGVsc2UgeworCQlpZiAoaXBoLT5wcm90b2NvbCAhPSBJUFBST1RPX1RDUCB8fCBpcGgtPmlobCAhPSA1KSB7CisJCQlFUlJPUihpcGgtPnByb3RvY29sKTsKKwkJCXJldHVybiBUQ19BQ1RfU0hPVDsKKwkJfQorCisJCWlmICh0Y3AtPmRlc3QgPT0gaHRvbnMoNTIwMCkpIHsKKwkJCWtleS5yZW1vdGVfaXB2NlszXSA9IF9odG9ubCgxKTsKKwkJfSBlbHNlIGlmICh0Y3AtPmRlc3QgPT0gaHRvbnMoNTIwMSkpIHsKKwkJCWtleS5yZW1vdGVfaXB2NlszXSA9IF9odG9ubCgyKTsKKwkJfSBlbHNlIHsKKwkJCUVSUk9SKHRjcC0+ZGVzdCk7CisJCQlyZXR1cm4gVENfQUNUX1NIT1Q7CisJCX0KKwl9CisKKwlyZXQgPSBicGZfc2tiX3NldF90dW5uZWxfa2V5KHNrYiwgJmtleSwgc2l6ZW9mKGtleSksIEJQRl9GX1RVTklORk9fSVBWNik7CisJaWYgKHJldCA8IDApIHsKKwkJRVJST1IocmV0KTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCXJldHVybiBUQ19BQ1RfT0s7Cit9CisKK1NFQygiaXBpcDZfZ2V0X3R1bm5lbCIpCitpbnQgX2lwaXA2X2dldF90dW5uZWwoc3RydWN0IF9fc2tfYnVmZiAqc2tiKQoreworCWludCByZXQ7CisJc3RydWN0IGJwZl90dW5uZWxfa2V5IGtleTsKKwljaGFyIGZtdFtdID0gInJlbW90ZSBpcDYgJXg6OiV4XG4iOworCisJcmV0ID0gYnBmX3NrYl9nZXRfdHVubmVsX2tleShza2IsICZrZXksIHNpemVvZihrZXkpLCBCUEZfRl9UVU5JTkZPX0lQVjYpOworCWlmIChyZXQgPCAwKSB7CisJCUVSUk9SKHJldCk7CisJCXJldHVybiBUQ19BQ1RfU0hPVDsKKwl9CisKKwlicGZfdHJhY2VfcHJpbnRrKGZtdCwgc2l6ZW9mKGZtdCksIF9odG9ubChrZXkucmVtb3RlX2lwdjZbMF0pLAorCQkJIF9odG9ubChrZXkucmVtb3RlX2lwdjZbM10pKTsKKwlyZXR1cm4gVENfQUNUX09LOworfQorCitTRUMoImlwNmlwNl9zZXRfdHVubmVsIikKK2ludCBfaXA2aXA2X3NldF90dW5uZWwoc3RydWN0IF9fc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBicGZfdHVubmVsX2tleSBrZXkgPSB7fTsKKwl2b2lkICpkYXRhID0gKHZvaWQgKikobG9uZylza2ItPmRhdGE7CisJc3RydWN0IGlwdjZoZHIgKmlwaCA9IGRhdGE7CisJc3RydWN0IHRjcGhkciAqdGNwID0gZGF0YSArIHNpemVvZigqaXBoKTsKKwl2b2lkICpkYXRhX2VuZCA9ICh2b2lkICopKGxvbmcpc2tiLT5kYXRhX2VuZDsKKwlpbnQgcmV0OworCisJLyogc2luZ2xlIGxlbmd0aCBjaGVjayAqLworCWlmIChkYXRhICsgc2l6ZW9mKCppcGgpICsgc2l6ZW9mKCp0Y3ApID4gZGF0YV9lbmQpIHsKKwkJRVJST1IoMSk7CisJCXJldHVybiBUQ19BQ1RfU0hPVDsKKwl9CisKKwlrZXkucmVtb3RlX2lwdjZbMF0gPSBfaHRvbmwoMHgyNDAxZGIwMCk7CisJa2V5LnR1bm5lbF90dGwgPSA2NDsKKworCWlmIChpcGgtPm5leHRoZHIgPT0gTkVYVEhEUl9JQ01QKSB7CisJCWtleS5yZW1vdGVfaXB2NlszXSA9IF9odG9ubCgxKTsKKwl9IGVsc2UgeworCQlpZiAoaXBoLT5uZXh0aGRyICE9IE5FWFRIRFJfVENQKSB7CisJCQlFUlJPUihpcGgtPm5leHRoZHIpOworCQkJcmV0dXJuIFRDX0FDVF9TSE9UOworCQl9CisKKwkJaWYgKHRjcC0+ZGVzdCA9PSBodG9ucyg1MjAwKSkgeworCQkJa2V5LnJlbW90ZV9pcHY2WzNdID0gX2h0b25sKDEpOworCQl9IGVsc2UgaWYgKHRjcC0+ZGVzdCA9PSBodG9ucyg1MjAxKSkgeworCQkJa2V5LnJlbW90ZV9pcHY2WzNdID0gX2h0b25sKDIpOworCQl9IGVsc2UgeworCQkJRVJST1IodGNwLT5kZXN0KTsKKwkJCXJldHVybiBUQ19BQ1RfU0hPVDsKKwkJfQorCX0KKworCXJldCA9IGJwZl9za2Jfc2V0X3R1bm5lbF9rZXkoc2tiLCAma2V5LCBzaXplb2Yoa2V5KSwgQlBGX0ZfVFVOSU5GT19JUFY2KTsKKwlpZiAocmV0IDwgMCkgeworCQlFUlJPUihyZXQpOworCQlyZXR1cm4gVENfQUNUX1NIT1Q7CisJfQorCisJcmV0dXJuIFRDX0FDVF9PSzsKK30KKworU0VDKCJpcDZpcDZfZ2V0X3R1bm5lbCIpCitpbnQgX2lwNmlwNl9nZXRfdHVubmVsKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBicGZfdHVubmVsX2tleSBrZXk7CisJY2hhciBmbXRbXSA9ICJyZW1vdGUgaXA2ICV4OjoleFxuIjsKKworCXJldCA9IGJwZl9za2JfZ2V0X3R1bm5lbF9rZXkoc2tiLCAma2V5LCBzaXplb2Yoa2V5KSwgQlBGX0ZfVFVOSU5GT19JUFY2KTsKKwlpZiAocmV0IDwgMCkgeworCQlFUlJPUihyZXQpOworCQlyZXR1cm4gVENfQUNUX1NIT1Q7CisJfQorCisJYnBmX3RyYWNlX3ByaW50ayhmbXQsIHNpemVvZihmbXQpLCBfaHRvbmwoa2V5LnJlbW90ZV9pcHY2WzBdKSwKKwkJCSBfaHRvbmwoa2V5LnJlbW90ZV9pcHY2WzNdKSk7CisJcmV0dXJuIFRDX0FDVF9PSzsKK30KKworCitjaGFyIF9saWNlbnNlW10gU0VDKCJsaWNlbnNlIikgPSAiR1BMIjsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvYnBmL3Rlc3RfY2dycDJfdGNfa2Vybi5jIGIvc2FtcGxlcy9icGYvdGVzdF9jZ3JwMl90Y19rZXJuLmMKaW5kZXggMjczMmMzNy4uMTBmZjczNCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9icGYvdGVzdF9jZ3JwMl90Y19rZXJuLmMKKysrIGIvc2FtcGxlcy9icGYvdGVzdF9jZ3JwMl90Y19rZXJuLmMKQEAgLTU3LDcgKzU3LDcgQEAKIAkJYnBmX3RyYWNlX3ByaW50ayhkb250X2NhcmVfbXNnLCBzaXplb2YoZG9udF9jYXJlX21zZyksCiAJCQkJIGV0aC0+aF9wcm90bywgaXA2aC0+bmV4dGhkcik7CiAJCXJldHVybiBUQ19BQ1RfT0s7Ci0JfSBlbHNlIGlmIChicGZfc2tiX2luX2Nncm91cChza2IsICZ0ZXN0X2NncnAyX2FycmF5X3BpbiwgMCkgIT0gMSkgeworCX0gZWxzZSBpZiAoYnBmX3NrYl91bmRlcl9jZ3JvdXAoc2tiLCAmdGVzdF9jZ3JwMl9hcnJheV9waW4sIDApICE9IDEpIHsKIAkJYnBmX3RyYWNlX3ByaW50ayhwYXNzX21zZywgc2l6ZW9mKHBhc3NfbXNnKSk7CiAJCXJldHVybiBUQ19BQ1RfT0s7CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvYnBmL3Rlc3RfY3VycmVudF90YXNrX3VuZGVyX2Nncm91cF9rZXJuLmMgYi9zYW1wbGVzL2JwZi90ZXN0X2N1cnJlbnRfdGFza191bmRlcl9jZ3JvdXBfa2Vybi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YjI4ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2JwZi90ZXN0X2N1cnJlbnRfdGFza191bmRlcl9jZ3JvdXBfa2Vybi5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNiBTYXJndW4gRGhpbGxvbiA8c2FyZ3VuQHNhcmd1bi5tZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L2JwZi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlICJicGZfaGVscGVycy5oIgorI2luY2x1ZGUgPHVhcGkvbGludXgvdXRzbmFtZS5oPgorCitzdHJ1Y3QgYnBmX21hcF9kZWYgU0VDKCJtYXBzIikgY2dyb3VwX21hcCA9IHsKKwkudHlwZQkJCT0gQlBGX01BUF9UWVBFX0NHUk9VUF9BUlJBWSwKKwkua2V5X3NpemUJCT0gc2l6ZW9mKHUzMiksCisJLnZhbHVlX3NpemUJCT0gc2l6ZW9mKHUzMiksCisJLm1heF9lbnRyaWVzCT0gMSwKK307CisKK3N0cnVjdCBicGZfbWFwX2RlZiBTRUMoIm1hcHMiKSBwZXJmX21hcCA9IHsKKwkudHlwZQkJCT0gQlBGX01BUF9UWVBFX0FSUkFZLAorCS5rZXlfc2l6ZQkJPSBzaXplb2YodTMyKSwKKwkudmFsdWVfc2l6ZQkJPSBzaXplb2YodTY0KSwKKwkubWF4X2VudHJpZXMJPSAxLAorfTsKKworLyogV3JpdGVzIHRoZSBsYXN0IFBJRCB0aGF0IGNhbGxlZCBzeW5jIHRvIGEgbWFwIGF0IGluZGV4IDAgKi8KK1NFQygia3Byb2JlL3N5c19zeW5jIikKK2ludCBicGZfcHJvZzEoc3RydWN0IHB0X3JlZ3MgKmN0eCkKK3sKKwl1NjQgcGlkID0gYnBmX2dldF9jdXJyZW50X3BpZF90Z2lkKCk7CisJaW50IGlkeCA9IDA7CisKKwlpZiAoIWJwZl9jdXJyZW50X3Rhc2tfdW5kZXJfY2dyb3VwKCZjZ3JvdXBfbWFwLCAwKSkKKwkJcmV0dXJuIDA7CisKKwlicGZfbWFwX3VwZGF0ZV9lbGVtKCZwZXJmX21hcCwgJmlkeCwgJnBpZCwgQlBGX0FOWSk7CisJcmV0dXJuIDA7Cit9CisKK2NoYXIgX2xpY2Vuc2VbXSBTRUMoImxpY2Vuc2UiKSA9ICJHUEwiOwordTMyIF92ZXJzaW9uIFNFQygidmVyc2lvbiIpID0gTElOVVhfVkVSU0lPTl9DT0RFOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9icGYvdGVzdF9jdXJyZW50X3Rhc2tfdW5kZXJfY2dyb3VwX3VzZXIuYyBiL3NhbXBsZXMvYnBmL3Rlc3RfY3VycmVudF90YXNrX3VuZGVyX2Nncm91cF91c2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBiMGJjZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvYnBmL3Rlc3RfY3VycmVudF90YXNrX3VuZGVyX2Nncm91cF91c2VyLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNiBTYXJndW4gRGhpbGxvbiA8c2FyZ3VuQHNhcmd1bi5tZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGxpbnV4L2JwZi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgImxpYmJwZi5oIgorI2luY2x1ZGUgImJwZl9sb2FkLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2JwZi5oPgorI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KKworI2RlZmluZSBDR1JPVVBfTU9VTlRfUEFUSAkiL21udCIKKyNkZWZpbmUgQ0dST1VQX1BBVEgJCSIvbW50L215LWNncm91cCIKKworI2RlZmluZSBjbGVhbl9lcnJubygpIChlcnJubyA9PSAwID8gIk5vbmUiIDogc3RyZXJyb3IoZXJybm8pKQorI2RlZmluZSBsb2dfZXJyKE1TRywgLi4uKSBmcHJpbnRmKHN0ZGVyciwgIiglczolZDogZXJybm86ICVzKSAiIE1TRyAiXG4iLCBcCisJX19GSUxFX18sIF9fTElORV9fLCBjbGVhbl9lcnJubygpLCAjI19fVkFfQVJHU19fKQorCitzdGF0aWMgaW50IGpvaW5fY2dyb3VwKGNoYXIgKnBhdGgpCit7CisJaW50IGZkLCByYyA9IDA7CisJcGlkX3QgcGlkID0gZ2V0cGlkKCk7CisJY2hhciBjZ3JvdXBfcGF0aFtQQVRIX01BWCArIDFdOworCisJc25wcmludGYoY2dyb3VwX3BhdGgsIHNpemVvZihjZ3JvdXBfcGF0aCksICIlcy9jZ3JvdXAucHJvY3MiLCBwYXRoKTsKKworCWZkID0gb3BlbihjZ3JvdXBfcGF0aCwgT19XUk9OTFkpOworCWlmIChmZCA8IDApIHsKKwkJbG9nX2VycigiT3BlbmluZyBDZ3JvdXAiKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGRwcmludGYoZmQsICIlZFxuIiwgcGlkKSA8IDApIHsKKwkJbG9nX2VycigiSm9pbmluZyBDZ3JvdXAiKTsKKwkJcmMgPSAxOworCX0KKwljbG9zZShmZCk7CisJcmV0dXJuIHJjOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciBmaWxlbmFtZVsyNTZdOworCWludCBjZzIsIGlkeCA9IDA7CisJcGlkX3QgcmVtb3RlX3BpZCwgbG9jYWxfcGlkID0gZ2V0cGlkKCk7CisKKwlzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIiVzX2tlcm4ubyIsIGFyZ3ZbMF0pOworCWlmIChsb2FkX2JwZl9maWxlKGZpbGVuYW1lKSkgeworCQlwcmludGYoIiVzIiwgYnBmX2xvZ19idWYpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIFRoaXMgaXMgdG8gYXZvaWQgaW50ZXJmZXJpbmcgd2l0aCBleGlzdGluZyBjZ3JvdXBzLiBVbmZvcnR1bmF0ZWx5LAorCSAqIG1vc3QgcGVvcGxlIGRvbid0IGhhdmUgY2dyb3VwdjIgZW5hYmxlZCBhdCB0aGlzIHBvaW50IGluIHRpbWUuCisJICogSXQncyBlYXNpZXIgdG8gY3JlYXRlIG91ciBvd24gbW91bnQgbmFtZXNwYWNlIGFuZCBtYW5hZ2UgaXQKKwkgKiBvdXJzZWx2ZXMuCisJICovCisJaWYgKHVuc2hhcmUoQ0xPTkVfTkVXTlMpKSB7CisJCWxvZ19lcnIoInVuc2hhcmUiKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKG1vdW50KCJub25lIiwgIi8iLCBOVUxMLCBNU19SRUMgfCBNU19QUklWQVRFLCBOVUxMKSkgeworCQlsb2dfZXJyKCJtb3VudCBmYWtlcm9vdCIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAobW91bnQoIm5vbmUiLCBDR1JPVVBfTU9VTlRfUEFUSCwgImNncm91cDIiLCAwLCBOVUxMKSkgeworCQlsb2dfZXJyKCJtb3VudCBjZ3JvdXAyIik7CisJCXJldHVybiAxOworCX0KKworCWlmIChta2RpcihDR1JPVVBfUEFUSCwgMDc3NykgJiYgZXJybm8gIT0gRUVYSVNUKSB7CisJCWxvZ19lcnIoIm1rZGlyIGNncm91cCIpOworCQlyZXR1cm4gMTsKKwl9CisKKwljZzIgPSBvcGVuKENHUk9VUF9QQVRILCBPX1JET05MWSk7CisJaWYgKGNnMiA8IDApIHsKKwkJbG9nX2Vycigib3BlbmluZyB0YXJnZXQgY2dyb3VwIik7CisJCWdvdG8gY2xlYW51cF9jZ3JvdXBfZXJyOworCX0KKworCWlmIChicGZfdXBkYXRlX2VsZW0obWFwX2ZkWzBdLCAmaWR4LCAmY2cyLCBCUEZfQU5ZKSkgeworCQlsb2dfZXJyKCJBZGRpbmcgdGFyZ2V0IGNncm91cCB0byBtYXAiKTsKKwkJZ290byBjbGVhbnVwX2Nncm91cF9lcnI7CisJfQorCWlmIChqb2luX2Nncm91cCgiL21udC9teS1jZ3JvdXAiKSkgeworCQlsb2dfZXJyKCJMZWF2aW5nIHRhcmdldCBjZ3JvdXAiKTsKKwkJZ290byBjbGVhbnVwX2Nncm91cF9lcnI7CisJfQorCisJLyoKKwkgKiBUaGUgaW5zdGFsbGVkIGhlbHBlciBwcm9ncmFtIGNhdGNoZWQgdGhlIHN5bmMgY2FsbCwgYW5kIHNob3VsZAorCSAqIHdyaXRlIGl0IHRvIHRoZSBtYXAuCisJICovCisKKwlzeW5jKCk7CisJYnBmX2xvb2t1cF9lbGVtKG1hcF9mZFsxXSwgJmlkeCwgJnJlbW90ZV9waWQpOworCisJaWYgKGxvY2FsX3BpZCAhPSByZW1vdGVfcGlkKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIkJQRiBIZWxwZXIgZGlkbid0IHdyaXRlIGNvcnJlY3QgUElEIHRvIG1hcCwgYnV0OiAlZFxuIiwKKwkJCXJlbW90ZV9waWQpOworCQlnb3RvIGxlYXZlX2Nncm91cF9lcnI7CisJfQorCisJLyogVmVyaWZ5IHRoZSBuZWdhdGl2ZSBzY2VuYXJpbzsgbGVhdmUgdGhlIGNncm91cCAqLworCWlmIChqb2luX2Nncm91cChDR1JPVVBfTU9VTlRfUEFUSCkpCisJCWdvdG8gbGVhdmVfY2dyb3VwX2VycjsKKworCXJlbW90ZV9waWQgPSAwOworCWJwZl91cGRhdGVfZWxlbShtYXBfZmRbMV0sICZpZHgsICZyZW1vdGVfcGlkLCBCUEZfQU5ZKTsKKworCXN5bmMoKTsKKwlicGZfbG9va3VwX2VsZW0obWFwX2ZkWzFdLCAmaWR4LCAmcmVtb3RlX3BpZCk7CisKKwlpZiAobG9jYWxfcGlkID09IHJlbW90ZV9waWQpIHsKKwkJZnByaW50ZihzdGRlcnIsICJCUEYgY2dyb3VwIG5lZ2F0aXZlIHRlc3QgZGlkIG5vdCB3b3JrXG4iKTsKKwkJZ290byBjbGVhbnVwX2Nncm91cF9lcnI7CisJfQorCisJcm1kaXIoQ0dST1VQX1BBVEgpOworCXJldHVybiAwOworCisJLyogRXJyb3IgY29uZGl0aW9uLCBjbGVhbnVwICovCitsZWF2ZV9jZ3JvdXBfZXJyOgorCWpvaW5fY2dyb3VwKENHUk9VUF9NT1VOVF9QQVRIKTsKK2NsZWFudXBfY2dyb3VwX2VycjoKKwlybWRpcihDR1JPVVBfUEFUSCk7CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi90ZXN0X2lwaXAuc2ggYi9zYW1wbGVzL2JwZi90ZXN0X2lwaXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTk2OTI1NAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvYnBmL3Rlc3RfaXBpcC5zaApAQCAtMCwwICsxLDE3OCBAQAorIyEvYmluL2Jhc2gKKworZnVuY3Rpb24gY29uZmlnX2RldmljZSB7CisJaXAgbmV0bnMgYWRkIGF0X25zMAorCWlwIG5ldG5zIGFkZCBhdF9uczEKKwlpcCBuZXRucyBhZGQgYXRfbnMyCisJaXAgbGluayBhZGQgdmV0aDAgdHlwZSB2ZXRoIHBlZXIgbmFtZSB2ZXRoMGIKKwlpcCBsaW5rIGFkZCB2ZXRoMSB0eXBlIHZldGggcGVlciBuYW1lIHZldGgxYgorCWlwIGxpbmsgYWRkIHZldGgyIHR5cGUgdmV0aCBwZWVyIG5hbWUgdmV0aDJiCisJaXAgbGluayBzZXQgdmV0aDBiIHVwCisJaXAgbGluayBzZXQgdmV0aDFiIHVwCisJaXAgbGluayBzZXQgdmV0aDJiIHVwCisJaXAgbGluayBzZXQgZGV2IHZldGgwYiBtdHUgMTUwMAorCWlwIGxpbmsgc2V0IGRldiB2ZXRoMWIgbXR1IDE1MDAKKwlpcCBsaW5rIHNldCBkZXYgdmV0aDJiIG10dSAxNTAwCisJaXAgbGluayBzZXQgdmV0aDAgbmV0bnMgYXRfbnMwCisJaXAgbGluayBzZXQgdmV0aDEgbmV0bnMgYXRfbnMxCisJaXAgbGluayBzZXQgdmV0aDIgbmV0bnMgYXRfbnMyCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgaXAgYWRkciBhZGQgMTcyLjE2LjEuMTAwLzI0IGRldiB2ZXRoMAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIGlwIGFkZHIgYWRkIDI0MDE6ZGIwMDo6MS82NCBkZXYgdmV0aDAgbm9kYWQKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcCBsaW5rIHNldCBkZXYgdmV0aDAgdXAKKwlpcCBuZXRucyBleGVjIGF0X25zMSBpcCBhZGRyIGFkZCAxNzIuMTYuMS4xMDEvMjQgZGV2IHZldGgxCisJaXAgbmV0bnMgZXhlYyBhdF9uczEgaXAgYWRkciBhZGQgMjQwMTpkYjAwOjoyLzY0IGRldiB2ZXRoMSBub2RhZAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMxIGlwIGxpbmsgc2V0IGRldiB2ZXRoMSB1cAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMyIGlwIGFkZHIgYWRkIDE3Mi4xNi4xLjIwMC8yNCBkZXYgdmV0aDIKKwlpcCBuZXRucyBleGVjIGF0X25zMiBpcCBhZGRyIGFkZCAyNDAxOmRiMDA6OjMvNjQgZGV2IHZldGgyIG5vZGFkCisJaXAgbmV0bnMgZXhlYyBhdF9uczIgaXAgbGluayBzZXQgZGV2IHZldGgyIHVwCisJaXAgbGluayBhZGQgYnIwIHR5cGUgYnJpZGdlCisJaXAgbGluayBzZXQgYnIwIHVwCisJaXAgbGluayBzZXQgZGV2IGJyMCBtdHUgMTUwMAorCWlwIGxpbmsgc2V0IHZldGgwYiBtYXN0ZXIgYnIwCisJaXAgbGluayBzZXQgdmV0aDFiIG1hc3RlciBicjAKKwlpcCBsaW5rIHNldCB2ZXRoMmIgbWFzdGVyIGJyMAorfQorCitmdW5jdGlvbiBhZGRfaXBpcF90dW5uZWwgeworCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIFwKKwkJaXAgbGluayBhZGQgZGV2ICRERVZfTlMgdHlwZSBpcGlwIGxvY2FsIDE3Mi4xNi4xLjEwMCByZW1vdGUgMTcyLjE2LjEuMjAwCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgaXAgbGluayBzZXQgZGV2ICRERVZfTlMgdXAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcCBhZGRyIGFkZCBkZXYgJERFVl9OUyAxMC4xLjEuMTAwLzI0CisJaXAgbmV0bnMgZXhlYyBhdF9uczEgXAorCQlpcCBsaW5rIGFkZCBkZXYgJERFVl9OUyB0eXBlIGlwaXAgbG9jYWwgMTcyLjE2LjEuMTAxIHJlbW90ZSAxNzIuMTYuMS4yMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMSBpcCBsaW5rIHNldCBkZXYgJERFVl9OUyB1cAorCSMgc2FtZSBpbm5lciBJUCBhZGRyZXNzIGluIGF0X25zMCBhbmQgYXRfbnMxCisJaXAgbmV0bnMgZXhlYyBhdF9uczEgaXAgYWRkciBhZGQgZGV2ICRERVZfTlMgMTAuMS4xLjEwMC8yNAorCisJaXAgbmV0bnMgZXhlYyBhdF9uczIgaXAgbGluayBhZGQgZGV2ICRERVYgdHlwZSBpcGlwIGV4dGVybmFsCisJaXAgbmV0bnMgZXhlYyBhdF9uczIgaXAgbGluayBzZXQgZGV2ICRERVYgdXAKKwlpcCBuZXRucyBleGVjIGF0X25zMiBpcCBhZGRyIGFkZCBkZXYgJERFViAxMC4xLjEuMjAwLzI0Cit9CisKK2Z1bmN0aW9uIGFkZF9pcGlwNl90dW5uZWwgeworCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIFwKKwkJaXAgbGluayBhZGQgZGV2ICRERVZfTlMgdHlwZSBpcDZ0bmwgbW9kZSBpcGlwNiBsb2NhbCAyNDAxOmRiMDA6OjEvNjQgcmVtb3RlIDI0MDE6ZGIwMDo6My82NAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIGlwIGxpbmsgc2V0IGRldiAkREVWX05TIHVwCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgaXAgYWRkciBhZGQgZGV2ICRERVZfTlMgMTAuMS4xLjEwMC8yNAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMxIFwKKwkJaXAgbGluayBhZGQgZGV2ICRERVZfTlMgdHlwZSBpcDZ0bmwgbW9kZSBpcGlwNiBsb2NhbCAyNDAxOmRiMDA6OjIvNjQgcmVtb3RlIDI0MDE6ZGIwMDo6My82NAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMxIGlwIGxpbmsgc2V0IGRldiAkREVWX05TIHVwCisJIyBzYW1lIGlubmVyIElQIGFkZHJlc3MgaW4gYXRfbnMwIGFuZCBhdF9uczEKKwlpcCBuZXRucyBleGVjIGF0X25zMSBpcCBhZGRyIGFkZCBkZXYgJERFVl9OUyAxMC4xLjEuMTAwLzI0CisKKwlpcCBuZXRucyBleGVjIGF0X25zMiBpcCBsaW5rIGFkZCBkZXYgJERFViB0eXBlIGlwNnRubCBtb2RlIGlwaXA2IGV4dGVybmFsCisJaXAgbmV0bnMgZXhlYyBhdF9uczIgaXAgbGluayBzZXQgZGV2ICRERVYgdXAKKwlpcCBuZXRucyBleGVjIGF0X25zMiBpcCBhZGRyIGFkZCBkZXYgJERFViAxMC4xLjEuMjAwLzI0Cit9CisKK2Z1bmN0aW9uIGFkZF9pcDZpcDZfdHVubmVsIHsKKwlpcCBuZXRucyBleGVjIGF0X25zMCBcCisJCWlwIGxpbmsgYWRkIGRldiAkREVWX05TIHR5cGUgaXA2dG5sIG1vZGUgaXA2aXA2IGxvY2FsIDI0MDE6ZGIwMDo6MS82NCByZW1vdGUgMjQwMTpkYjAwOjozLzY0CisJaXAgbmV0bnMgZXhlYyBhdF9uczAgaXAgbGluayBzZXQgZGV2ICRERVZfTlMgdXAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcCBhZGRyIGFkZCBkZXYgJERFVl9OUyAyNjAxOjY0Njo6MS82NAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMxIFwKKwkJaXAgbGluayBhZGQgZGV2ICRERVZfTlMgdHlwZSBpcDZ0bmwgbW9kZSBpcDZpcDYgbG9jYWwgMjQwMTpkYjAwOjoyLzY0IHJlbW90ZSAyNDAxOmRiMDA6OjMvNjQKKwlpcCBuZXRucyBleGVjIGF0X25zMSBpcCBsaW5rIHNldCBkZXYgJERFVl9OUyB1cAorCSMgc2FtZSBpbm5lciBJUCBhZGRyZXNzIGluIGF0X25zMCBhbmQgYXRfbnMxCisJaXAgbmV0bnMgZXhlYyBhdF9uczEgaXAgYWRkciBhZGQgZGV2ICRERVZfTlMgMjYwMTo2NDY6OjEvNjQKKworCWlwIG5ldG5zIGV4ZWMgYXRfbnMyIGlwIGxpbmsgYWRkIGRldiAkREVWIHR5cGUgaXA2dG5sIG1vZGUgaXA2aXA2IGV4dGVybmFsCisJaXAgbmV0bnMgZXhlYyBhdF9uczIgaXAgbGluayBzZXQgZGV2ICRERVYgdXAKKwlpcCBuZXRucyBleGVjIGF0X25zMiBpcCBhZGRyIGFkZCBkZXYgJERFViAyNjAxOjY0Njo6Mi82NAorfQorCitmdW5jdGlvbiBhdHRhY2hfYnBmIHsKKwlERVY9JDEKKwlTRVRfVFVOTkVMPSQyCisJR0VUX1RVTk5FTD0kMworCWlwIG5ldG5zIGV4ZWMgYXRfbnMyIHRjIHFkaXNjIGFkZCBkZXYgJERFViBjbHNhY3QKKwlpcCBuZXRucyBleGVjIGF0X25zMiB0YyBmaWx0ZXIgYWRkIGRldiAkREVWIGVncmVzcyBicGYgZGEgb2JqIHRjYnBmMl9rZXJuLm8gc2VjICRTRVRfVFVOTkVMCisJaXAgbmV0bnMgZXhlYyBhdF9uczIgdGMgZmlsdGVyIGFkZCBkZXYgJERFViBpbmdyZXNzIGJwZiBkYSBvYmogdGNicGYyX2tlcm4ubyBzZWMgJEdFVF9UVU5ORUwKK30KKworZnVuY3Rpb24gdGVzdF9pcGlwIHsKKwlERVZfTlM9aXBpcF9zdGQKKwlERVY9aXBpcF9icGYKKwljb25maWdfZGV2aWNlCisjCXRjcGR1bXAgLW5laSBicjAgJgorCWNhdCAvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nL3RyYWNlX3BpcGUgJgorCisJYWRkX2lwaXBfdHVubmVsCisJYXR0YWNoX2JwZiAkREVWIGlwaXBfc2V0X3R1bm5lbCBpcGlwX2dldF90dW5uZWwKKworCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIHBpbmcgLWMgMSAxMC4xLjEuMjAwCisJaXAgbmV0bnMgZXhlYyBhdF9uczIgcGluZyAtYyAxIDEwLjEuMS4xMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcGVyZiAtc0QgLXAgNTIwMCA+IC9kZXYvbnVsbAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMxIGlwZXJmIC1zRCAtcCA1MjAxID4gL2Rldi9udWxsCisJc2xlZXAgMC4yCisJIyB0Y3AgY2hlY2sgX3NhbWVfIElQIG92ZXIgZGlmZmVyZW50IHR1bm5lbHMKKwlpcCBuZXRucyBleGVjIGF0X25zMiBpcGVyZiAtYyAxMC4xLjEuMTAwIC1uIDVrIC1wIDUyMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMiBpcGVyZiAtYyAxMC4xLjEuMTAwIC1uIDVrIC1wIDUyMDEKKwljbGVhbnVwCit9CisKKyMgSVB2NCBvdmVyIElQdjYgdHVubmVsCitmdW5jdGlvbiB0ZXN0X2lwaXA2IHsKKwlERVZfTlM9aXBpcF9zdGQKKwlERVY9aXBpcF9icGYKKwljb25maWdfZGV2aWNlCisjCXRjcGR1bXAgLW5laSBicjAgJgorCWNhdCAvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nL3RyYWNlX3BpcGUgJgorCisJYWRkX2lwaXA2X3R1bm5lbAorCWF0dGFjaF9icGYgJERFViBpcGlwNl9zZXRfdHVubmVsIGlwaXA2X2dldF90dW5uZWwKKworCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIHBpbmcgLWMgMSAxMC4xLjEuMjAwCisJaXAgbmV0bnMgZXhlYyBhdF9uczIgcGluZyAtYyAxIDEwLjEuMS4xMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcGVyZiAtc0QgLXAgNTIwMCA+IC9kZXYvbnVsbAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMxIGlwZXJmIC1zRCAtcCA1MjAxID4gL2Rldi9udWxsCisJc2xlZXAgMC4yCisJIyB0Y3AgY2hlY2sgX3NhbWVfIElQIG92ZXIgZGlmZmVyZW50IHR1bm5lbHMKKwlpcCBuZXRucyBleGVjIGF0X25zMiBpcGVyZiAtYyAxMC4xLjEuMTAwIC1uIDVrIC1wIDUyMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMiBpcGVyZiAtYyAxMC4xLjEuMTAwIC1uIDVrIC1wIDUyMDEKKwljbGVhbnVwCit9CisKKyMgSVB2NiBvdmVyIElQdjYgdHVubmVsCitmdW5jdGlvbiB0ZXN0X2lwNmlwNiB7CisJREVWX05TPWlwaXBfc3RkCisJREVWPWlwaXBfYnBmCisJY29uZmlnX2RldmljZQorIwl0Y3BkdW1wIC1uZWkgYnIwICYKKwljYXQgL3N5cy9rZXJuZWwvZGVidWcvdHJhY2luZy90cmFjZV9waXBlICYKKworCWFkZF9pcDZpcDZfdHVubmVsCisJYXR0YWNoX2JwZiAkREVWIGlwNmlwNl9zZXRfdHVubmVsIGlwNmlwNl9nZXRfdHVubmVsCisKKwlpcCBuZXRucyBleGVjIGF0X25zMCBwaW5nIC02IC1jIDEgMjYwMTo2NDY6OjIKKwlpcCBuZXRucyBleGVjIGF0X25zMiBwaW5nIC02IC1jIDEgMjYwMTo2NDY6OjEKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcGVyZiAtNnNEIC1wIDUyMDAgPiAvZGV2L251bGwKKwlpcCBuZXRucyBleGVjIGF0X25zMSBpcGVyZiAtNnNEIC1wIDUyMDEgPiAvZGV2L251bGwKKwlzbGVlcCAwLjIKKwkjIHRjcCBjaGVjayBfc2FtZV8gSVAgb3ZlciBkaWZmZXJlbnQgdHVubmVscworCWlwIG5ldG5zIGV4ZWMgYXRfbnMyIGlwZXJmIC02YyAyNjAxOjY0Njo6MSAtbiA1ayAtcCA1MjAwCisJaXAgbmV0bnMgZXhlYyBhdF9uczIgaXBlcmYgLTZjIDI2MDE6NjQ2OjoxIC1uIDVrIC1wIDUyMDEKKwljbGVhbnVwCit9CisKK2Z1bmN0aW9uIGNsZWFudXAgeworCXNldCArZXgKKwlwa2lsbCBpcGVyZgorCWlwIG5ldG5zIGRlbGV0ZSBhdF9uczAKKwlpcCBuZXRucyBkZWxldGUgYXRfbnMxCisJaXAgbmV0bnMgZGVsZXRlIGF0X25zMgorCWlwIGxpbmsgZGVsIHZldGgwCisJaXAgbGluayBkZWwgdmV0aDEKKwlpcCBsaW5rIGRlbCB2ZXRoMgorCWlwIGxpbmsgZGVsIGJyMAorCXBraWxsIHRjcGR1bXAKKwlwa2lsbCBjYXQKKwlzZXQgLWV4Cit9CisKK2NsZWFudXAKK2VjaG8gIlRlc3RpbmcgSVAgdHVubmVscy4uLiIKK3Rlc3RfaXBpcAordGVzdF9pcGlwNgordGVzdF9pcDZpcDYKK2VjaG8gIioqKiBQQVNTICoqKiIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvYnBmL3Rlc3RfbWFwcy5jIGIvc2FtcGxlcy9icGYvdGVzdF9tYXBzLmMKaW5kZXggNDdiZjA4NS4uY2NlMmI1OSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9icGYvdGVzdF9tYXBzLmMKKysrIGIvc2FtcGxlcy9icGYvdGVzdF9tYXBzLmMKQEAgLTY4LDcgKzY4LDE2IEBACiAJYXNzZXJ0KGJwZl91cGRhdGVfZWxlbShtYXBfZmQsICZrZXksICZ2YWx1ZSwgQlBGX05PRVhJU1QpID09IC0xICYmCiAJICAgICAgIGVycm5vID09IEUyQklHKTsKIAorCS8qIHVwZGF0ZSBleGlzdGluZyBlbGVtZW50LCB0aG91Z2h0IHRoZSBtYXAgaXMgZnVsbCAqLworCWtleSA9IDE7CisJYXNzZXJ0KGJwZl91cGRhdGVfZWxlbShtYXBfZmQsICZrZXksICZ2YWx1ZSwgQlBGX0VYSVNUKSA9PSAwKTsKKwlrZXkgPSAyOworCWFzc2VydChicGZfdXBkYXRlX2VsZW0obWFwX2ZkLCAma2V5LCAmdmFsdWUsIEJQRl9BTlkpID09IDApOworCWtleSA9IDE7CisJYXNzZXJ0KGJwZl91cGRhdGVfZWxlbShtYXBfZmQsICZrZXksICZ2YWx1ZSwgQlBGX0FOWSkgPT0gMCk7CisKIAkvKiBjaGVjayB0aGF0IGtleSA9IDAgZG9lc24ndCBleGlzdCAqLworCWtleSA9IDA7CiAJYXNzZXJ0KGJwZl9kZWxldGVfZWxlbShtYXBfZmQsICZrZXkpID09IC0xICYmIGVycm5vID09IEVOT0VOVCk7CiAKIAkvKiBpdGVyYXRlIG92ZXIgdHdvIGVsZW1lbnRzICovCkBAIC00MTMsMTAgKzQyMiwxMiBAQAogCiAJZm9yIChpID0gZm47IGkgPCBNQVBfU0laRTsgaSArPSBUQVNLUykgewogCQlrZXkgPSB2YWx1ZSA9IGk7Ci0JCWlmIChkb191cGRhdGUpCisJCWlmIChkb191cGRhdGUpIHsKIAkJCWFzc2VydChicGZfdXBkYXRlX2VsZW0obWFwX2ZkLCAma2V5LCAmdmFsdWUsIEJQRl9OT0VYSVNUKSA9PSAwKTsKLQkJZWxzZQorCQkJYXNzZXJ0KGJwZl91cGRhdGVfZWxlbShtYXBfZmQsICZrZXksICZ2YWx1ZSwgQlBGX0VYSVNUKSA9PSAwKTsKKwkJfSBlbHNlIHsKIAkJCWFzc2VydChicGZfZGVsZXRlX2VsZW0obWFwX2ZkLCAma2V5KSA9PSAwKTsKKwkJfQogCX0KIH0KIApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9icGYvdGVzdF90dW5uZWxfYnBmLnNoIGIvc2FtcGxlcy9icGYvdGVzdF90dW5uZWxfYnBmLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFmZjYzNGYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2JwZi90ZXN0X3R1bm5lbF9icGYuc2gKQEAgLTAsMCArMSwxNjcgQEAKKyMhL2Jpbi9iYXNoCisjIEluIE5hbWVzcGFjZSAwIChhdF9uczApIHVzaW5nIG5hdGl2ZSB0dW5uZWwKKyMgT3ZlcmxheSBJUDogMTAuMS4xLjEwMAorIyBsb2NhbCAxOTIuMTYuMS4xMDAgcmVtb3RlIDE5Mi4xNi4xLjIwMAorIyB2ZXRoMCBJUDogMTcyLjE2LjEuMTAwLCB0dW5uZWwgZGV2IDx0eXBlPjAwCisKKyMgT3V0IG9mIE5hbWVzcGFjZSB1c2luZyBCUEYgc2V0L2dldCBvbiBsd3R1bm5lbAorIyBPdmVybGF5IElQOiAxMC4xLjEuMjAwCisjIGxvY2FsIDE3Mi4xNi4xLjIwMCByZW1vdGUgMTcyLjE2LjEuMTAwCisjIHZldGgxIElQOiAxNzIuMTYuMS4yMDAsIHR1bm5lbCBkZXYgPHR5cGU+MTEKKworZnVuY3Rpb24gY29uZmlnX2RldmljZSB7CisJaXAgbmV0bnMgYWRkIGF0X25zMAorCWlwIGxpbmsgYWRkIHZldGgwIHR5cGUgdmV0aCBwZWVyIG5hbWUgdmV0aDEKKwlpcCBsaW5rIHNldCB2ZXRoMCBuZXRucyBhdF9uczAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcCBhZGRyIGFkZCAxNzIuMTYuMS4xMDAvMjQgZGV2IHZldGgwCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgaXAgbGluayBzZXQgZGV2IHZldGgwIHVwCisJaXAgbGluayBzZXQgZGV2IHZldGgxIHVwIG10dSAxNTAwCisJaXAgYWRkciBhZGQgZGV2IHZldGgxIDE3Mi4xNi4xLjIwMC8yNAorfQorCitmdW5jdGlvbiBhZGRfZ3JlX3R1bm5lbCB7CisJIyBpbiBuYW1lc3BhY2UKKwlpcCBuZXRucyBleGVjIGF0X25zMCBcCisJCWlwIGxpbmsgYWRkIGRldiAkREVWX05TIHR5cGUgJFRZUEUga2V5IDIgbG9jYWwgMTcyLjE2LjEuMTAwIHJlbW90ZSAxNzIuMTYuMS4yMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcCBsaW5rIHNldCBkZXYgJERFVl9OUyB1cAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIGlwIGFkZHIgYWRkIGRldiAkREVWX05TIDEwLjEuMS4xMDAvMjQKKworCSMgb3V0IG9mIG5hbWVzcGFjZQorCWlwIGxpbmsgYWRkIGRldiAkREVWIHR5cGUgJFRZUEUga2V5IDIgZXh0ZXJuYWwKKwlpcCBsaW5rIHNldCBkZXYgJERFViB1cAorCWlwIGFkZHIgYWRkIGRldiAkREVWIDEwLjEuMS4yMDAvMjQKK30KKworZnVuY3Rpb24gYWRkX3Z4bGFuX3R1bm5lbCB7CisJIyBTZXQgc3RhdGljIEFSUCBlbnRyeSBoZXJlIGJlY2F1c2UgaXB0YWJsZXMgc2V0LW1hcmsgd29ya3MKKwkjIG9uIEwzIHBhY2tldCwgYXMgYSByZXN1bHQgbm90IGFwcGx5aW5nIHRvIEFSUCBwYWNrZXRzLAorCSMgY2F1c2luZyBlcnJvcnMgYXQgZ2V0X3R1bm5lbF97a2V5L29wdH0uCisKKwkjIGluIG5hbWVzcGFjZQorCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIFwKKwkJaXAgbGluayBhZGQgZGV2ICRERVZfTlMgdHlwZSAkVFlQRSBpZCAyIGRzdHBvcnQgNDc4OSBnYnAgcmVtb3RlIDE3Mi4xNi4xLjIwMAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIGlwIGxpbmsgc2V0IGRldiAkREVWX05TIGFkZHJlc3MgNTI6NTQ6MDA6ZDk6MDE6MDAgdXAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcCBhZGRyIGFkZCBkZXYgJERFVl9OUyAxMC4xLjEuMTAwLzI0CisJaXAgbmV0bnMgZXhlYyBhdF9uczAgYXJwIC1zIDEwLjEuMS4yMDAgNTI6NTQ6MDA6ZDk6MDI6MDAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcHRhYmxlcyAtQSBPVVRQVVQgLWogTUFSSyAtLXNldC1tYXJrIDB4ODAwRkYKKworCSMgb3V0IG9mIG5hbWVzcGFjZQorCWlwIGxpbmsgYWRkIGRldiAkREVWIHR5cGUgJFRZUEUgZXh0ZXJuYWwgZ2JwIGRzdHBvcnQgNDc4OQorCWlwIGxpbmsgc2V0IGRldiAkREVWIGFkZHJlc3MgNTI6NTQ6MDA6ZDk6MDI6MDAgdXAKKwlpcCBhZGRyIGFkZCBkZXYgJERFViAxMC4xLjEuMjAwLzI0CisJYXJwIC1zIDEwLjEuMS4xMDAgNTI6NTQ6MDA6ZDk6MDE6MDAKK30KKworZnVuY3Rpb24gYWRkX2dlbmV2ZV90dW5uZWwgeworCSMgaW4gbmFtZXNwYWNlCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgXAorCQlpcCBsaW5rIGFkZCBkZXYgJERFVl9OUyB0eXBlICRUWVBFIGlkIDIgZHN0cG9ydCA2MDgxIHJlbW90ZSAxNzIuMTYuMS4yMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcCBsaW5rIHNldCBkZXYgJERFVl9OUyB1cAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIGlwIGFkZHIgYWRkIGRldiAkREVWX05TIDEwLjEuMS4xMDAvMjQKKworCSMgb3V0IG9mIG5hbWVzcGFjZQorCWlwIGxpbmsgYWRkIGRldiAkREVWIHR5cGUgJFRZUEUgZHN0cG9ydCA2MDgxIGV4dGVybmFsCisJaXAgbGluayBzZXQgZGV2ICRERVYgdXAKKwlpcCBhZGRyIGFkZCBkZXYgJERFViAxMC4xLjEuMjAwLzI0Cit9CisKK2Z1bmN0aW9uIGFkZF9pcGlwX3R1bm5lbCB7CisJIyBpbiBuYW1lc3BhY2UKKwlpcCBuZXRucyBleGVjIGF0X25zMCBcCisJCWlwIGxpbmsgYWRkIGRldiAkREVWX05TIHR5cGUgJFRZUEUgbG9jYWwgMTcyLjE2LjEuMTAwIHJlbW90ZSAxNzIuMTYuMS4yMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcCBsaW5rIHNldCBkZXYgJERFVl9OUyB1cAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIGlwIGFkZHIgYWRkIGRldiAkREVWX05TIDEwLjEuMS4xMDAvMjQKKworCSMgb3V0IG9mIG5hbWVzcGFjZQorCWlwIGxpbmsgYWRkIGRldiAkREVWIHR5cGUgJFRZUEUgZXh0ZXJuYWwKKwlpcCBsaW5rIHNldCBkZXYgJERFViB1cAorCWlwIGFkZHIgYWRkIGRldiAkREVWIDEwLjEuMS4yMDAvMjQKK30KKworZnVuY3Rpb24gYXR0YWNoX2JwZiB7CisJREVWPSQxCisJU0VUX1RVTk5FTD0kMgorCUdFVF9UVU5ORUw9JDMKKwl0YyBxZGlzYyBhZGQgZGV2ICRERVYgY2xzYWN0CisJdGMgZmlsdGVyIGFkZCBkZXYgJERFViBlZ3Jlc3MgYnBmIGRhIG9iaiB0Y2JwZjJfa2Vybi5vIHNlYyAkU0VUX1RVTk5FTAorCXRjIGZpbHRlciBhZGQgZGV2ICRERVYgaW5ncmVzcyBicGYgZGEgb2JqIHRjYnBmMl9rZXJuLm8gc2VjICRHRVRfVFVOTkVMCit9CisKK2Z1bmN0aW9uIHRlc3RfZ3JlIHsKKwlUWVBFPWdyZXRhcAorCURFVl9OUz1ncmV0YXAwMAorCURFVj1ncmV0YXAxMQorCWNvbmZpZ19kZXZpY2UKKwlhZGRfZ3JlX3R1bm5lbAorCWF0dGFjaF9icGYgJERFViBncmVfc2V0X3R1bm5lbCBncmVfZ2V0X3R1bm5lbAorCXBpbmcgLWMgMSAxMC4xLjEuMTAwCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgcGluZyAtYyAxIDEwLjEuMS4yMDAKKwljbGVhbnVwCit9CisKK2Z1bmN0aW9uIHRlc3RfdnhsYW4geworCVRZUEU9dnhsYW4KKwlERVZfTlM9dnhsYW4wMAorCURFVj12eGxhbjExCisJY29uZmlnX2RldmljZQorCWFkZF92eGxhbl90dW5uZWwKKwlhdHRhY2hfYnBmICRERVYgdnhsYW5fc2V0X3R1bm5lbCB2eGxhbl9nZXRfdHVubmVsCisJcGluZyAtYyAxIDEwLjEuMS4xMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBwaW5nIC1jIDEgMTAuMS4xLjIwMAorCWNsZWFudXAKK30KKworZnVuY3Rpb24gdGVzdF9nZW5ldmUgeworCVRZUEU9Z2VuZXZlCisJREVWX05TPWdlbmV2ZTAwCisJREVWPWdlbmV2ZTExCisJY29uZmlnX2RldmljZQorCWFkZF9nZW5ldmVfdHVubmVsCisJYXR0YWNoX2JwZiAkREVWIGdlbmV2ZV9zZXRfdHVubmVsIGdlbmV2ZV9nZXRfdHVubmVsCisJcGluZyAtYyAxIDEwLjEuMS4xMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBwaW5nIC1jIDEgMTAuMS4xLjIwMAorCWNsZWFudXAKK30KKworZnVuY3Rpb24gdGVzdF9pcGlwIHsKKwlUWVBFPWlwaXAKKwlERVZfTlM9aXBpcDAwCisJREVWPWlwaXAxMQorCWNvbmZpZ19kZXZpY2UKKwl0Y3BkdW1wIC1uZWkgdmV0aDEgJgorCWNhdCAvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nL3RyYWNlX3BpcGUgJgorCWFkZF9pcGlwX3R1bm5lbAorCWV0aHRvb2wgLUsgdmV0aDEgZ3NvIG9mZiBncm8gb2ZmIHJ4IG9mZiB0eCBvZmYKKwlpcCBsaW5rIHNldCBkZXYgdmV0aDEgbXR1IDE1MDAKKwlhdHRhY2hfYnBmICRERVYgaXBpcF9zZXRfdHVubmVsIGlwaXBfZ2V0X3R1bm5lbAorCXBpbmcgLWMgMSAxMC4xLjEuMTAwCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgcGluZyAtYyAxIDEwLjEuMS4yMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcGVyZiAtc0QgLXAgNTIwMCA+IC9kZXYvbnVsbAorCXNsZWVwIDAuMgorCWlwZXJmIC1jIDEwLjEuMS4xMDAgLW4gNWsgLXAgNTIwMAorCWNsZWFudXAKK30KKworZnVuY3Rpb24gY2xlYW51cCB7CisJc2V0ICtleAorCXBraWxsIGlwZXJmCisJaXAgbmV0bnMgZGVsZXRlIGF0X25zMAorCWlwIGxpbmsgZGVsIHZldGgxCisJaXAgbGluayBkZWwgaXBpcDExCisJaXAgbGluayBkZWwgZ3JldGFwMTEKKwlpcCBsaW5rIGRlbCBnZW5ldmUxMQorCXBraWxsIHRjcGR1bXAKKwlwa2lsbCBjYXQKKwlzZXQgLWV4Cit9CisKK2NsZWFudXAKK2VjaG8gIlRlc3RpbmcgR1JFIHR1bm5lbC4uLiIKK3Rlc3RfZ3JlCitlY2hvICJUZXN0aW5nIFZYTEFOIHR1bm5lbC4uLiIKK3Rlc3RfdnhsYW4KK2VjaG8gIlRlc3RpbmcgR0VORVZFIHR1bm5lbC4uLiIKK3Rlc3RfZ2VuZXZlCitlY2hvICJUZXN0aW5nIElQSVAgdHVubmVsLi4uIgordGVzdF9pcGlwCitlY2hvICIqKiogUEFTUyAqKioiCmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi90ZXN0X3ZlcmlmaWVyLmMgYi9zYW1wbGVzL2JwZi90ZXN0X3ZlcmlmaWVyLmMKaW5kZXggZmUyZmNlYy4uMzY5ZmZhYSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9icGYvdGVzdF92ZXJpZmllci5jCisrKyBiL3NhbXBsZXMvYnBmL3Rlc3RfdmVyaWZpZXIuYwpAQCAtMjksNiArMjksNyBAQAogCXN0cnVjdCBicGZfaW5zbglpbnNuc1tNQVhfSU5TTlNdOwogCWludCBmaXh1cFtNQVhfRklYVVBTXTsKIAlpbnQgcHJvZ19hcnJheV9maXh1cFtNQVhfRklYVVBTXTsKKwlpbnQgdGVzdF92YWxfbWFwX2ZpeHVwW01BWF9GSVhVUFNdOwogCWNvbnN0IGNoYXIgKmVycnN0cjsKIAljb25zdCBjaGFyICplcnJzdHJfdW5wcml2OwogCWVudW0gewpAQCAtMzksNiArNDAsMTkgQEAKIAllbnVtIGJwZl9wcm9nX3R5cGUgcHJvZ190eXBlOwogfTsKIAorLyogTm90ZSB3ZSB3YW50IHRoaXMgdG8gYmUgNjQgYml0IGFsaWduZWQgc28gdGhhdCB0aGUgZW5kIG9mIG91ciBhcnJheSBpcworICogYWN0dWFsbHkgdGhlIGVuZCBvZiB0aGUgc3RydWN0dXJlLgorICovCisjZGVmaW5lIE1BWF9FTlRSSUVTIDExCitzdHJ1Y3QgdGVzdF92YWwgeworCXVuc2lnbmVkIGluZGV4OworCWludCBmb29bTUFYX0VOVFJJRVNdOworfTsKKworc3RydWN0IG90aGVyX3ZhbCB7CisJdW5zaWduZWQgaW50IGFjdGlvblszMl07Cit9OworCiBzdGF0aWMgc3RydWN0IGJwZl90ZXN0IHRlc3RzW10gPSB7CiAJewogCQkiYWRkK3N1YittdWwiLApAQCAtMjkxLDYgKzMwNSwyOSBAQAogCQkucmVzdWx0ID0gUkVKRUNULAogCX0sCiAJeworCQkiaW52YWxpZCBhcmd1bWVudCByZWdpc3RlciIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX2dldF9jZ3JvdXBfY2xhc3NpZCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19nZXRfY2dyb3VwX2NsYXNzaWQpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkuZXJyc3RyID0gIlIxICFyZWFkX29rIiwKKwkJLnJlc3VsdCA9IFJFSkVDVCwKKwkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLAorCX0sCisJeworCQkibm9uLWludmFsaWQgYXJndW1lbnQgcmVnaXN0ZXIiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfQUxVNjRfUkVHKEJQRl9NT1YsIEJQRl9SRUdfNiwgQlBGX1JFR18xKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX2dldF9jZ3JvdXBfY2xhc3NpZCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9NT1YsIEJQRl9SRUdfMSwgQlBGX1JFR182KSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX2dldF9jZ3JvdXBfY2xhc3NpZCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5yZXN1bHQgPSBBQ0NFUFQsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKIAkJImNoZWNrIHZhbGlkIHNwaWxsL2ZpbGwiLAogCQkuaW5zbnMgPSB7CiAJCQkvKiBzcGlsbCBSMShjdHgpIGludG8gc3RhY2sgKi8KQEAgLTEyMTAsNiArMTI0Nyw1NCBAQAogCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCiAJfSwKIAl7CisJCSJyYXdfc3RhY2s6IHNrYl9sb2FkX2J5dGVzLCBuZWdhdGl2ZSBsZW4iLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMiwgNCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9NT1YsIEJQRl9SRUdfNiwgQlBGX1JFR18xMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfNiwgLTgpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzMsIEJQRl9SRUdfNiksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNCwgLTgpLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfc2tiX2xvYWRfYnl0ZXMpLAorCQkJQlBGX0xEWF9NRU0oQlBGX0RXLCBCUEZfUkVHXzAsIEJQRl9SRUdfNiwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5yZXN1bHQgPSBSRUpFQ1QsCisJCS5lcnJzdHIgPSAiaW52YWxpZCBzdGFjayB0eXBlIFIzIiwKKwkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLAorCX0sCisJeworCQkicmF3X3N0YWNrOiBza2JfbG9hZF9ieXRlcywgbmVnYXRpdmUgbGVuIDIiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMiwgNCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9NT1YsIEJQRl9SRUdfNiwgQlBGX1JFR18xMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfNiwgLTgpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzMsIEJQRl9SRUdfNiksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNCwgfjApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfc2tiX2xvYWRfYnl0ZXMpLAorCQkJQlBGX0xEWF9NRU0oQlBGX0RXLCBCUEZfUkVHXzAsIEJQRl9SRUdfNiwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5yZXN1bHQgPSBSRUpFQ1QsCisJCS5lcnJzdHIgPSAiaW52YWxpZCBzdGFjayB0eXBlIFIzIiwKKwkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLAorCX0sCisJeworCQkicmF3X3N0YWNrOiBza2JfbG9hZF9ieXRlcywgemVybyBsZW4iLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMiwgNCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9NT1YsIEJQRl9SRUdfNiwgQlBGX1JFR18xMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfNiwgLTgpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzMsIEJQRl9SRUdfNiksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNCwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19za2JfbG9hZF9ieXRlcyksCisJCQlCUEZfTERYX01FTShCUEZfRFcsIEJQRl9SRUdfMCwgQlBGX1JFR182LCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLnJlc3VsdCA9IFJFSkVDVCwKKwkJLmVycnN0ciA9ICJpbnZhbGlkIHN0YWNrIHR5cGUgUjMiLAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCisJfSwKKwl7CiAJCSJyYXdfc3RhY2s6IHNrYl9sb2FkX2J5dGVzLCBubyBpbml0IiwKIAkJLmluc25zID0gewogCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzIsIDQpLApAQCAtMTQ0OSw3ICsxNTM0LDcgQEAKIAkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLAogCX0sCiAJewotCQkicGt0OiB0ZXN0MSIsCisJCSJkaXJlY3QgcGFja2V0IGFjY2VzczogdGVzdDEiLAogCQkuaW5zbnMgPSB7CiAJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsCiAJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKQEAgLTE0NjYsNyArMTU1MSw3IEBACiAJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKIAl9LAogCXsKLQkJInBrdDogdGVzdDIiLAorCQkiZGlyZWN0IHBhY2tldCBhY2Nlc3M6IHRlc3QyIiwKIAkJLmluc25zID0gewogCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDEpLAogCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfNCwgQlBGX1JFR18xLApAQCAtMTQ5OSw3ICsxNTg0LDcgQEAKIAkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLAogCX0sCiAJewotCQkicGt0OiB0ZXN0MyIsCisJCSJkaXJlY3QgcGFja2V0IGFjY2VzczogdGVzdDMiLAogCQkuaW5zbnMgPSB7CiAJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsCiAJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKQEAgLTE1MTEsNyArMTU5Niw3IEBACiAJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NPQ0tFVF9GSUxURVIsCiAJfSwKIAl7Ci0JCSJwa3Q6IHRlc3Q0IiwKKwkJImRpcmVjdCBwYWNrZXQgYWNjZXNzOiB0ZXN0NCAod3JpdGUpIiwKIAkJLmluc25zID0gewogCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMiwgQlBGX1JFR18xLAogCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhKSksCkBAIC0xNTI0LDEwICsxNjA5LDc4MCBAQAogCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAogCQkJQlBGX0VYSVRfSU5TTigpLAogCQl9LAotCQkuZXJyc3RyID0gImNhbm5vdCB3cml0ZSIsCisJCS5yZXN1bHQgPSBBQ0NFUFQsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJImRpcmVjdCBwYWNrZXQgYWNjZXNzOiB0ZXN0NSAocGt0X2VuZCA+PSByZWcsIGdvb2QgYWNjZXNzKSIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzIsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YSkpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMywgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhX2VuZCkpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzAsIEJQRl9SRUdfMiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMCwgOCksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdFLCBCUEZfUkVHXzMsIEJQRl9SRUdfMCwgMiksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfTERYX01FTShCUEZfQiwgQlBGX1JFR18wLCBCUEZfUkVHXzIsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkucmVzdWx0ID0gQUNDRVBULAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCisJfSwKKwl7CisJCSJkaXJlY3QgcGFja2V0IGFjY2VzczogdGVzdDYgKHBrdF9lbmQgPj0gcmVnLCBiYWQgYWNjZXNzKSIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzIsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YSkpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMywgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhX2VuZCkpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzAsIEJQRl9SRUdfMiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMCwgOCksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdFLCBCUEZfUkVHXzMsIEJQRl9SRUdfMCwgMyksCisJCQlCUEZfTERYX01FTShCUEZfQiwgQlBGX1JFR18wLCBCUEZfUkVHXzIsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkuZXJyc3RyID0gImludmFsaWQgYWNjZXNzIHRvIHBhY2tldCIsCiAJCS5yZXN1bHQgPSBSRUpFQ1QsCiAJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKIAl9LAorCXsKKwkJImRpcmVjdCBwYWNrZXQgYWNjZXNzOiB0ZXN0NyAocGt0X2VuZCA+PSByZWcsIGJvdGggYWNjZXNzZXMpIiwKKwkJLmluc25zID0geworCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMiwgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhKSksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18zLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGFfZW5kKSksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMCwgQlBGX1JFR18yKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18wLCA4KSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR0UsIEJQRl9SRUdfMywgQlBGX1JFR18wLCAzKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9CLCBCUEZfUkVHXzAsIEJQRl9SRUdfMiwgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfTERYX01FTShCUEZfQiwgQlBGX1JFR18wLCBCUEZfUkVHXzIsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkuZXJyc3RyID0gImludmFsaWQgYWNjZXNzIHRvIHBhY2tldCIsCisJCS5yZXN1bHQgPSBSRUpFQ1QsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJImRpcmVjdCBwYWNrZXQgYWNjZXNzOiB0ZXN0OCAoZG91YmxlIHRlc3QsIHZhcmlhbnQgMSkiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzMsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YV9lbmQpKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18wLCBCUEZfUkVHXzIpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzAsIDgpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHRSwgQlBGX1JFR18zLCBCUEZfUkVHXzAsIDQpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHVCwgQlBGX1JFR18wLCBCUEZfUkVHXzMsIDEpLAorCQkJQlBGX0xEWF9NRU0oQlBGX0IsIEJQRl9SRUdfMCwgQlBGX1JFR18yLCAwKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9CLCBCUEZfUkVHXzAsIEJQRl9SRUdfMiwgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5yZXN1bHQgPSBBQ0NFUFQsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJImRpcmVjdCBwYWNrZXQgYWNjZXNzOiB0ZXN0OSAoZG91YmxlIHRlc3QsIHZhcmlhbnQgMikiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzMsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YV9lbmQpKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18wLCBCUEZfUkVHXzIpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzAsIDgpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHRSwgQlBGX1JFR18zLCBCUEZfUkVHXzAsIDIpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHVCwgQlBGX1JFR18wLCBCUEZfUkVHXzMsIDEpLAorCQkJQlBGX0xEWF9NRU0oQlBGX0IsIEJQRl9SRUdfMCwgQlBGX1JFR18yLCAwKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9CLCBCUEZfUkVHXzAsIEJQRl9SRUdfMiwgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5yZXN1bHQgPSBBQ0NFUFQsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJImRpcmVjdCBwYWNrZXQgYWNjZXNzOiB0ZXN0MTAgKHdyaXRlIGludmFsaWQpIiwKKwkJLmluc25zID0geworCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMiwgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhKSksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18zLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGFfZW5kKSksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMCwgQlBGX1JFR18yKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18wLCA4KSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR1QsIEJQRl9SRUdfMCwgQlBGX1JFR18zLCAyKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9TVFhfTUVNKEJQRl9CLCBCUEZfUkVHXzIsIEJQRl9SRUdfMiwgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5lcnJzdHIgPSAiaW52YWxpZCBhY2Nlc3MgdG8gcGFja2V0IiwKKwkJLnJlc3VsdCA9IFJFSkVDVCwKKwkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLAorCX0sCisJeworCQkiaGVscGVyIGFjY2VzcyB0byBwYWNrZXQ6IHRlc3QxLCB2YWxpZCBwYWNrZXRfcHRyIHJhbmdlIiwKKwkJLmluc25zID0geworCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMiwgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgeGRwX21kLCBkYXRhKSksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18zLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCB4ZHBfbWQsIGRhdGFfZW5kKSksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMSwgQlBGX1JFR18yKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18xLCA4KSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR1QsIEJQRl9SRUdfMSwgQlBGX1JFR18zLCA1KSwKKwkJCUJQRl9MRF9NQVBfRkQoQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18zLCBCUEZfUkVHXzIpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzQsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfbWFwX3VwZGF0ZV9lbGVtKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLmZpeHVwID0gezV9LAorCQkucmVzdWx0X3VucHJpdiA9IEFDQ0VQVCwKKwkJLnJlc3VsdCA9IEFDQ0VQVCwKKwkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfWERQLAorCX0sCisJeworCQkiaGVscGVyIGFjY2VzcyB0byBwYWNrZXQ6IHRlc3QyLCB1bmNoZWNrZWQgcGFja2V0X3B0ciIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzIsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IHhkcF9tZCwgZGF0YSkpLAorCQkJQlBGX0xEX01BUF9GRChCUEZfUkVHXzEsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfbWFwX2xvb2t1cF9lbGVtKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLmZpeHVwID0gezF9LAorCQkucmVzdWx0ID0gUkVKRUNULAorCQkuZXJyc3RyID0gImludmFsaWQgYWNjZXNzIHRvIHBhY2tldCIsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1hEUCwKKwl9LAorCXsKKwkJImhlbHBlciBhY2Nlc3MgdG8gcGFja2V0OiB0ZXN0MywgdmFyaWFibGUgYWRkIiwKKwkJLmluc25zID0geworCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMiwgQlBGX1JFR18xLAorCQkJCQlvZmZzZXRvZihzdHJ1Y3QgeGRwX21kLCBkYXRhKSksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18zLCBCUEZfUkVHXzEsCisJCQkJCW9mZnNldG9mKHN0cnVjdCB4ZHBfbWQsIGRhdGFfZW5kKSksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfNCwgQlBGX1JFR18yKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR180LCA4KSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR1QsIEJQRl9SRUdfNCwgQlBGX1JFR18zLCAxMCksCisJCQlCUEZfTERYX01FTShCUEZfQiwgQlBGX1JFR181LCBCUEZfUkVHXzIsIDApLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzQsIEJQRl9SRUdfMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIEJQRl9SRUdfNCwgQlBGX1JFR181KSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR181LCBCUEZfUkVHXzQpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzUsIDgpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHVCwgQlBGX1JFR181LCBCUEZfUkVHXzMsIDQpLAorCQkJQlBGX0xEX01BUF9GRChCUEZfUkVHXzEsIDApLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzIsIEJQRl9SRUdfNCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19tYXBfbG9va3VwX2VsZW0pLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkuZml4dXAgPSB7MTF9LAorCQkucmVzdWx0ID0gQUNDRVBULAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9YRFAsCisJfSwKKwl7CisJCSJoZWxwZXIgYWNjZXNzIHRvIHBhY2tldDogdGVzdDQsIHBhY2tldF9wdHIgd2l0aCBiYWQgcmFuZ2UiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCB4ZHBfbWQsIGRhdGEpKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzMsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IHhkcF9tZCwgZGF0YV9lbmQpKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR180LCBCUEZfUkVHXzIpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzQsIDQpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHVCwgQlBGX1JFR180LCBCUEZfUkVHXzMsIDIpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0xEX01BUF9GRChCUEZfUkVHXzEsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfbWFwX2xvb2t1cF9lbGVtKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLmZpeHVwID0gezd9LAorCQkucmVzdWx0ID0gUkVKRUNULAorCQkuZXJyc3RyID0gImludmFsaWQgYWNjZXNzIHRvIHBhY2tldCIsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1hEUCwKKwl9LAorCXsKKwkJImhlbHBlciBhY2Nlc3MgdG8gcGFja2V0OiB0ZXN0NSwgcGFja2V0X3B0ciB3aXRoIHRvbyBzaG9ydCByYW5nZSIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzIsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IHhkcF9tZCwgZGF0YSkpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMywgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgeGRwX21kLCBkYXRhX2VuZCkpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzIsIDEpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzQsIEJQRl9SRUdfMiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfNCwgNyksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdULCBCUEZfUkVHXzQsIEJQRl9SRUdfMywgMyksCisJCQlCUEZfTERfTUFQX0ZEKEJQRl9SRUdfMSwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19tYXBfbG9va3VwX2VsZW0pLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkuZml4dXAgPSB7Nn0sCisJCS5yZXN1bHQgPSBSRUpFQ1QsCisJCS5lcnJzdHIgPSAiaW52YWxpZCBhY2Nlc3MgdG8gcGFja2V0IiwKKwkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfWERQLAorCX0sCisJeworCQkiaGVscGVyIGFjY2VzcyB0byBwYWNrZXQ6IHRlc3Q2LCBjbHMgdmFsaWQgcGFja2V0X3B0ciByYW5nZSIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzIsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YSkpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMywgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhX2VuZCkpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzEsIEJQRl9SRUdfMiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMSwgOCksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdULCBCUEZfUkVHXzEsIEJQRl9SRUdfMywgNSksCisJCQlCUEZfTERfTUFQX0ZEKEJQRl9SRUdfMSwgMCksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMywgQlBGX1JFR18yKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR180LCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX21hcF91cGRhdGVfZWxlbSksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5maXh1cCA9IHs1fSwKKwkJLnJlc3VsdCA9IEFDQ0VQVCwKKwkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLAorCX0sCisJeworCQkiaGVscGVyIGFjY2VzcyB0byBwYWNrZXQ6IHRlc3Q3LCBjbHMgdW5jaGVja2VkIHBhY2tldF9wdHIiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKKwkJCUJQRl9MRF9NQVBfRkQoQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX21hcF9sb29rdXBfZWxlbSksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5maXh1cCA9IHsxfSwKKwkJLnJlc3VsdCA9IFJFSkVDVCwKKwkJLmVycnN0ciA9ICJpbnZhbGlkIGFjY2VzcyB0byBwYWNrZXQiLAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCisJfSwKKwl7CisJCSJoZWxwZXIgYWNjZXNzIHRvIHBhY2tldDogdGVzdDgsIGNscyB2YXJpYWJsZSBhZGQiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsCisJCQkJCW9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzMsIEJQRl9SRUdfMSwKKwkJCQkJb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YV9lbmQpKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR180LCBCUEZfUkVHXzIpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzQsIDgpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHVCwgQlBGX1JFR180LCBCUEZfUkVHXzMsIDEwKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9CLCBCUEZfUkVHXzUsIEJQRl9SRUdfMiwgMCksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfNCwgQlBGX1JFR18yKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgQlBGX1JFR180LCBCUEZfUkVHXzUpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzUsIEJQRl9SRUdfNCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfNSwgOCksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdULCBCUEZfUkVHXzUsIEJQRl9SRUdfMywgNCksCisJCQlCUEZfTERfTUFQX0ZEKEJQRl9SRUdfMSwgMCksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMiwgQlBGX1JFR180KSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX21hcF9sb29rdXBfZWxlbSksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5maXh1cCA9IHsxMX0sCisJCS5yZXN1bHQgPSBBQ0NFUFQsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJImhlbHBlciBhY2Nlc3MgdG8gcGFja2V0OiB0ZXN0OSwgY2xzIHBhY2tldF9wdHIgd2l0aCBiYWQgcmFuZ2UiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzMsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YV9lbmQpKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR180LCBCUEZfUkVHXzIpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzQsIDQpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHVCwgQlBGX1JFR180LCBCUEZfUkVHXzMsIDIpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0xEX01BUF9GRChCUEZfUkVHXzEsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfbWFwX2xvb2t1cF9lbGVtKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLmZpeHVwID0gezd9LAorCQkucmVzdWx0ID0gUkVKRUNULAorCQkuZXJyc3RyID0gImludmFsaWQgYWNjZXNzIHRvIHBhY2tldCIsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJImhlbHBlciBhY2Nlc3MgdG8gcGFja2V0OiB0ZXN0MTAsIGNscyBwYWNrZXRfcHRyIHdpdGggdG9vIHNob3J0IHJhbmdlIiwKKwkJLmluc25zID0geworCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMiwgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhKSksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18zLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGFfZW5kKSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMiwgMSksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfNCwgQlBGX1JFR18yKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR180LCA3KSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR1QsIEJQRl9SRUdfNCwgQlBGX1JFR18zLCAzKSwKKwkJCUJQRl9MRF9NQVBfRkQoQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX21hcF9sb29rdXBfZWxlbSksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5maXh1cCA9IHs2fSwKKwkJLnJlc3VsdCA9IFJFSkVDVCwKKwkJLmVycnN0ciA9ICJpbnZhbGlkIGFjY2VzcyB0byBwYWNrZXQiLAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCisJfSwKKwl7CisJCSJoZWxwZXIgYWNjZXNzIHRvIHBhY2tldDogdGVzdDExLCBjbHMgdW5zdWl0YWJsZSBoZWxwZXIgMSIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzYsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YSkpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfNywgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhX2VuZCkpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzYsIDEpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzMsIEJQRl9SRUdfNiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMywgNyksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdULCBCUEZfUkVHXzMsIEJQRl9SRUdfNywgNCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMiwgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNCwgNDIpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzUsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfc2tiX3N0b3JlX2J5dGVzKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLnJlc3VsdCA9IFJFSkVDVCwKKwkJLmVycnN0ciA9ICJoZWxwZXIgYWNjZXNzIHRvIHRoZSBwYWNrZXQiLAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCisJfSwKKwl7CisJCSJoZWxwZXIgYWNjZXNzIHRvIHBhY2tldDogdGVzdDEyLCBjbHMgdW5zdWl0YWJsZSBoZWxwZXIgMiIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzYsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YSkpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfNywgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhX2VuZCkpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzMsIEJQRl9SRUdfNiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfNiwgOCksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdULCBCUEZfUkVHXzYsIEJQRl9SRUdfNywgMyksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMiwgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNCwgNCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19za2JfbG9hZF9ieXRlcyksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5yZXN1bHQgPSBSRUpFQ1QsCisJCS5lcnJzdHIgPSAiaGVscGVyIGFjY2VzcyB0byB0aGUgcGFja2V0IiwKKwkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLAorCX0sCisJeworCQkiaGVscGVyIGFjY2VzcyB0byBwYWNrZXQ6IHRlc3QxMywgY2xzIGhlbHBlciBvayIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzYsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YSkpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfNywgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhX2VuZCkpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzYsIDEpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzEsIEJQRl9SRUdfNiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMSwgNyksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdULCBCUEZfUkVHXzEsIEJQRl9SRUdfNywgNiksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMSwgQlBGX1JFR182KSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18yLCA0KSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18zLCAwKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR180LCAwKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR181LCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX2NzdW1fZGlmZiksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5yZXN1bHQgPSBBQ0NFUFQsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJImhlbHBlciBhY2Nlc3MgdG8gcGFja2V0OiB0ZXN0MTQsIGNscyBoZWxwZXIgZmFpbCBzdWIiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR182LCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzcsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YV9lbmQpKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR182LCAxKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18xLCBCUEZfUkVHXzYpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzEsIDcpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHVCwgQlBGX1JFR18xLCBCUEZfUkVHXzcsIDYpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfU1VCLCBCUEZfUkVHXzEsIDQpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzIsIDQpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzMsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzQsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzUsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfY3N1bV9kaWZmKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLnJlc3VsdCA9IFJFSkVDVCwKKwkJLmVycnN0ciA9ICJ0eXBlPWludiBleHBlY3RlZD1mcCIsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJImhlbHBlciBhY2Nlc3MgdG8gcGFja2V0OiB0ZXN0MTUsIGNscyBoZWxwZXIgZmFpbCByYW5nZSAxIiwKKwkJLmluc25zID0geworCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfNiwgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhKSksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR183LCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGFfZW5kKSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfNiwgMSksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMSwgQlBGX1JFR182KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18xLCA3KSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR1QsIEJQRl9SRUdfMSwgQlBGX1JFR183LCA2KSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18xLCBCUEZfUkVHXzYpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzIsIDgpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzMsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzQsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzUsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfY3N1bV9kaWZmKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLnJlc3VsdCA9IFJFSkVDVCwKKwkJLmVycnN0ciA9ICJpbnZhbGlkIGFjY2VzcyB0byBwYWNrZXQiLAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCisJfSwKKwl7CisJCSJoZWxwZXIgYWNjZXNzIHRvIHBhY2tldDogdGVzdDE2LCBjbHMgaGVscGVyIGZhaWwgcmFuZ2UgMiIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzYsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YSkpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfNywgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhX2VuZCkpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzYsIDEpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzEsIEJQRl9SRUdfNiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMSwgNyksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdULCBCUEZfUkVHXzEsIEJQRl9SRUdfNywgNiksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMSwgQlBGX1JFR182KSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18yLCAtOSksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMywgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNCwgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNSwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19jc3VtX2RpZmYpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkucmVzdWx0ID0gUkVKRUNULAorCQkuZXJyc3RyID0gImludmFsaWQgYWNjZXNzIHRvIHBhY2tldCIsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJImhlbHBlciBhY2Nlc3MgdG8gcGFja2V0OiB0ZXN0MTcsIGNscyBoZWxwZXIgZmFpbCByYW5nZSAzIiwKKwkJLmluc25zID0geworCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfNiwgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhKSksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR183LCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGFfZW5kKSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfNiwgMSksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMSwgQlBGX1JFR182KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18xLCA3KSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR1QsIEJQRl9SRUdfMSwgQlBGX1JFR183LCA2KSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18xLCBCUEZfUkVHXzYpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzIsIH4wKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18zLCAwKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR180LCAwKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR181LCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX2NzdW1fZGlmZiksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5yZXN1bHQgPSBSRUpFQ1QsCisJCS5lcnJzdHIgPSAiaW52YWxpZCBhY2Nlc3MgdG8gcGFja2V0IiwKKwkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLAorCX0sCisJeworCQkiaGVscGVyIGFjY2VzcyB0byBwYWNrZXQ6IHRlc3QxOCwgY2xzIGhlbHBlciBmYWlsIHJhbmdlIHplcm8iLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR182LCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzcsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YV9lbmQpKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR182LCAxKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18xLCBCUEZfUkVHXzYpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzEsIDcpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHVCwgQlBGX1JFR18xLCBCUEZfUkVHXzcsIDYpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzEsIEJQRl9SRUdfNiksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMiwgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMywgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNCwgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNSwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19jc3VtX2RpZmYpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkucmVzdWx0ID0gUkVKRUNULAorCQkuZXJyc3RyID0gImludmFsaWQgYWNjZXNzIHRvIHBhY2tldCIsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJImhlbHBlciBhY2Nlc3MgdG8gcGFja2V0OiB0ZXN0MTksIHBrdCBlbmQgYXMgaW5wdXQiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR182LCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzcsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YV9lbmQpKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR182LCAxKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18xLCBCUEZfUkVHXzYpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzEsIDcpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHVCwgQlBGX1JFR18xLCBCUEZfUkVHXzcsIDYpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzEsIEJQRl9SRUdfNyksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMiwgNCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMywgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNCwgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNSwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19jc3VtX2RpZmYpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkucmVzdWx0ID0gUkVKRUNULAorCQkuZXJyc3RyID0gIlIxIHR5cGU9cGt0X2VuZCBleHBlY3RlZD1mcCIsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJImhlbHBlciBhY2Nlc3MgdG8gcGFja2V0OiB0ZXN0MjAsIHdyb25nIHJlZyIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzYsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YSkpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfNywgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhX2VuZCkpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzYsIDEpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzEsIEJQRl9SRUdfNiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMSwgNyksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdULCBCUEZfUkVHXzEsIEJQRl9SRUdfNywgNiksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMiwgNCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMywgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNCwgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNSwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19jc3VtX2RpZmYpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkucmVzdWx0ID0gUkVKRUNULAorCQkuZXJyc3RyID0gImludmFsaWQgYWNjZXNzIHRvIHBhY2tldCIsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJInZhbGlkIG1hcCBhY2Nlc3MgaW50byBhbiBhcnJheSB3aXRoIGEgY29uc3RhbnQiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfU1RfTUVNKEJQRl9EVywgQlBGX1JFR18xMCwgLTgsIDApLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzIsIEJQRl9SRUdfMTApLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzIsIC04KSwKKwkJCUJQRl9MRF9NQVBfRkQoQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX21hcF9sb29rdXBfZWxlbSksCisJCQlCUEZfSk1QX0lNTShCUEZfSkVRLCBCUEZfUkVHXzAsIDAsIDEpLAorCQkJQlBGX1NUX01FTShCUEZfRFcsIEJQRl9SRUdfMCwgMCwgb2Zmc2V0b2Yoc3RydWN0IHRlc3RfdmFsLCBmb28pKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLnRlc3RfdmFsX21hcF9maXh1cCA9IHszfSwKKwkJLmVycnN0cl91bnByaXYgPSAiUjAgbGVha3MgYWRkciIsCisJCS5yZXN1bHRfdW5wcml2ID0gUkVKRUNULAorCQkucmVzdWx0ID0gQUNDRVBULAorCX0sCisJeworCQkidmFsaWQgbWFwIGFjY2VzcyBpbnRvIGFuIGFycmF5IHdpdGggYSByZWdpc3RlciIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9TVF9NRU0oQlBGX0RXLCBCUEZfUkVHXzEwLCAtOCwgMCksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMiwgQlBGX1JFR18xMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMiwgLTgpLAorCQkJQlBGX0xEX01BUF9GRChCUEZfUkVHXzEsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfbWFwX2xvb2t1cF9lbGVtKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KRVEsIEJQRl9SRUdfMCwgMCwgNCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMSwgNCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9MU0gsIEJQRl9SRUdfMSwgMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIEJQRl9SRUdfMCwgQlBGX1JFR18xKSwKKwkJCUJQRl9TVF9NRU0oQlBGX0RXLCBCUEZfUkVHXzAsIDAsIG9mZnNldG9mKHN0cnVjdCB0ZXN0X3ZhbCwgZm9vKSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS50ZXN0X3ZhbF9tYXBfZml4dXAgPSB7M30sCisJCS5lcnJzdHJfdW5wcml2ID0gIlIwIGxlYWtzIGFkZHIiLAorCQkucmVzdWx0X3VucHJpdiA9IFJFSkVDVCwKKwkJLnJlc3VsdCA9IEFDQ0VQVCwKKwl9LAorCXsKKwkJInZhbGlkIG1hcCBhY2Nlc3MgaW50byBhbiBhcnJheSB3aXRoIGEgdmFyaWFibGUiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfU1RfTUVNKEJQRl9EVywgQlBGX1JFR18xMCwgLTgsIDApLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzIsIEJQRl9SRUdfMTApLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzIsIC04KSwKKwkJCUJQRl9MRF9NQVBfRkQoQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX21hcF9sb29rdXBfZWxlbSksCisJCQlCUEZfSk1QX0lNTShCUEZfSkVRLCBCUEZfUkVHXzAsIDAsIDUpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMSwgQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KR0UsIEJQRl9SRUdfMSwgTUFYX0VOVFJJRVMsIDMpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTFNILCBCUEZfUkVHXzEsIDIpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBCUEZfUkVHXzAsIEJQRl9SRUdfMSksCisJCQlCUEZfU1RfTUVNKEJQRl9EVywgQlBGX1JFR18wLCAwLCBvZmZzZXRvZihzdHJ1Y3QgdGVzdF92YWwsIGZvbykpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkudGVzdF92YWxfbWFwX2ZpeHVwID0gezN9LAorCQkuZXJyc3RyX3VucHJpdiA9ICJSMCBsZWFrcyBhZGRyIiwKKwkJLnJlc3VsdF91bnByaXYgPSBSRUpFQ1QsCisJCS5yZXN1bHQgPSBBQ0NFUFQsCisJfSwKKwl7CisJCSJ2YWxpZCBtYXAgYWNjZXNzIGludG8gYW4gYXJyYXkgd2l0aCBhIHNpZ25lZCB2YXJpYWJsZSIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9TVF9NRU0oQlBGX0RXLCBCUEZfUkVHXzEwLCAtOCwgMCksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMiwgQlBGX1JFR18xMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMiwgLTgpLAorCQkJQlBGX0xEX01BUF9GRChCUEZfUkVHXzEsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfbWFwX2xvb2t1cF9lbGVtKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KRVEsIEJQRl9SRUdfMCwgMCwgOSksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18xLCBCUEZfUkVHXzAsIDApLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pTR1QsIEJQRl9SRUdfMSwgMHhmZmZmZmZmZiwgMSksCisJCQlCUEZfTU9WMzJfSU1NKEJQRl9SRUdfMSwgMCksCisJCQlCUEZfTU9WMzJfSU1NKEJQRl9SRUdfMiwgTUFYX0VOVFJJRVMpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pTR1QsIEJQRl9SRUdfMiwgQlBGX1JFR18xLCAxKSwKKwkJCUJQRl9NT1YzMl9JTU0oQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX0xTSCwgQlBGX1JFR18xLCAyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgQlBGX1JFR18wLCBCUEZfUkVHXzEpLAorCQkJQlBGX1NUX01FTShCUEZfRFcsIEJQRl9SRUdfMCwgMCwgb2Zmc2V0b2Yoc3RydWN0IHRlc3RfdmFsLCBmb28pKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLnRlc3RfdmFsX21hcF9maXh1cCA9IHszfSwKKwkJLmVycnN0cl91bnByaXYgPSAiUjAgbGVha3MgYWRkciIsCisJCS5yZXN1bHRfdW5wcml2ID0gUkVKRUNULAorCQkucmVzdWx0ID0gQUNDRVBULAorCX0sCisJeworCQkiaW52YWxpZCBtYXAgYWNjZXNzIGludG8gYW4gYXJyYXkgd2l0aCBhIGNvbnN0YW50IiwKKwkJLmluc25zID0geworCQkJQlBGX1NUX01FTShCUEZfRFcsIEJQRl9SRUdfMTAsIC04LCAwKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18yLCBCUEZfUkVHXzEwKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18yLCAtOCksCisJCQlCUEZfTERfTUFQX0ZEKEJQRl9SRUdfMSwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19tYXBfbG9va3VwX2VsZW0pLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgQlBGX1JFR18wLCAwLCAxKSwKKwkJCUJQRl9TVF9NRU0oQlBGX0RXLCBCUEZfUkVHXzAsIChNQVhfRU5UUklFUyArIDEpIDw8IDIsCisJCQkJICAgb2Zmc2V0b2Yoc3RydWN0IHRlc3RfdmFsLCBmb28pKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLnRlc3RfdmFsX21hcF9maXh1cCA9IHszfSwKKwkJLmVycnN0ciA9ICJpbnZhbGlkIGFjY2VzcyB0byBtYXAgdmFsdWUsIHZhbHVlX3NpemU9NDggb2ZmPTQ4IHNpemU9OCIsCisJCS5yZXN1bHQgPSBSRUpFQ1QsCisJfSwKKwl7CisJCSJpbnZhbGlkIG1hcCBhY2Nlc3MgaW50byBhbiBhcnJheSB3aXRoIGEgcmVnaXN0ZXIiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfU1RfTUVNKEJQRl9EVywgQlBGX1JFR18xMCwgLTgsIDApLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzIsIEJQRl9SRUdfMTApLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzIsIC04KSwKKwkJCUJQRl9MRF9NQVBfRkQoQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX21hcF9sb29rdXBfZWxlbSksCisJCQlCUEZfSk1QX0lNTShCUEZfSkVRLCBCUEZfUkVHXzAsIDAsIDQpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzEsIE1BWF9FTlRSSUVTICsgMSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9MU0gsIEJQRl9SRUdfMSwgMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIEJQRl9SRUdfMCwgQlBGX1JFR18xKSwKKwkJCUJQRl9TVF9NRU0oQlBGX0RXLCBCUEZfUkVHXzAsIDAsIG9mZnNldG9mKHN0cnVjdCB0ZXN0X3ZhbCwgZm9vKSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS50ZXN0X3ZhbF9tYXBfZml4dXAgPSB7M30sCisJCS5lcnJzdHIgPSAiUjAgbWluIHZhbHVlIGlzIG91dHNpZGUgb2YgdGhlIGFycmF5IHJhbmdlIiwKKwkJLnJlc3VsdCA9IFJFSkVDVCwKKwl9LAorCXsKKwkJImludmFsaWQgbWFwIGFjY2VzcyBpbnRvIGFuIGFycmF5IHdpdGggYSB2YXJpYWJsZSIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9TVF9NRU0oQlBGX0RXLCBCUEZfUkVHXzEwLCAtOCwgMCksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMiwgQlBGX1JFR18xMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMiwgLTgpLAorCQkJQlBGX0xEX01BUF9GRChCUEZfUkVHXzEsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfbWFwX2xvb2t1cF9lbGVtKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KRVEsIEJQRl9SRUdfMCwgMCwgNCksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18xLCBCUEZfUkVHXzAsIDApLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTFNILCBCUEZfUkVHXzEsIDIpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBCUEZfUkVHXzAsIEJQRl9SRUdfMSksCisJCQlCUEZfU1RfTUVNKEJQRl9EVywgQlBGX1JFR18wLCAwLCBvZmZzZXRvZihzdHJ1Y3QgdGVzdF92YWwsIGZvbykpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkudGVzdF92YWxfbWFwX2ZpeHVwID0gezN9LAorCQkuZXJyc3RyID0gIlIwIG1pbiB2YWx1ZSBpcyBuZWdhdGl2ZSwgZWl0aGVyIHVzZSB1bnNpZ25lZCBpbmRleCBvciBkbyBhIGlmIChpbmRleCA+PTApIGNoZWNrLiIsCisJCS5yZXN1bHQgPSBSRUpFQ1QsCisJfSwKKwl7CisJCSJpbnZhbGlkIG1hcCBhY2Nlc3MgaW50byBhbiBhcnJheSB3aXRoIG5vIGZsb29yIGNoZWNrIiwKKwkJLmluc25zID0geworCQkJQlBGX1NUX01FTShCUEZfRFcsIEJQRl9SRUdfMTAsIC04LCAwKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18yLCBCUEZfUkVHXzEwKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18yLCAtOCksCisJCQlCUEZfTERfTUFQX0ZEKEJQRl9SRUdfMSwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19tYXBfbG9va3VwX2VsZW0pLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgQlBGX1JFR18wLCAwLCA3KSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzEsIEJQRl9SRUdfMCwgMCksCisJCQlCUEZfTU9WMzJfSU1NKEJQRl9SRUdfMiwgTUFYX0VOVFJJRVMpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pTR1QsIEJQRl9SRUdfMiwgQlBGX1JFR18xLCAxKSwKKwkJCUJQRl9NT1YzMl9JTU0oQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX0xTSCwgQlBGX1JFR18xLCAyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgQlBGX1JFR18wLCBCUEZfUkVHXzEpLAorCQkJQlBGX1NUX01FTShCUEZfRFcsIEJQRl9SRUdfMCwgMCwgb2Zmc2V0b2Yoc3RydWN0IHRlc3RfdmFsLCBmb28pKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLnRlc3RfdmFsX21hcF9maXh1cCA9IHszfSwKKwkJLmVycnN0ciA9ICJSMCBtaW4gdmFsdWUgaXMgbmVnYXRpdmUsIGVpdGhlciB1c2UgdW5zaWduZWQgaW5kZXggb3IgZG8gYSBpZiAoaW5kZXggPj0wKSBjaGVjay4iLAorCQkucmVzdWx0ID0gUkVKRUNULAorCX0sCisJeworCQkiaW52YWxpZCBtYXAgYWNjZXNzIGludG8gYW4gYXJyYXkgd2l0aCBhIGludmFsaWQgbWF4IGNoZWNrIiwKKwkJLmluc25zID0geworCQkJQlBGX1NUX01FTShCUEZfRFcsIEJQRl9SRUdfMTAsIC04LCAwKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18yLCBCUEZfUkVHXzEwKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18yLCAtOCksCisJCQlCUEZfTERfTUFQX0ZEKEJQRl9SRUdfMSwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19tYXBfbG9va3VwX2VsZW0pLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgQlBGX1JFR18wLCAwLCA3KSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzEsIEJQRl9SRUdfMCwgMCksCisJCQlCUEZfTU9WMzJfSU1NKEJQRl9SRUdfMiwgTUFYX0VOVFJJRVMgKyAxKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR1QsIEJQRl9SRUdfMiwgQlBGX1JFR18xLCAxKSwKKwkJCUJQRl9NT1YzMl9JTU0oQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX0xTSCwgQlBGX1JFR18xLCAyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgQlBGX1JFR18wLCBCUEZfUkVHXzEpLAorCQkJQlBGX1NUX01FTShCUEZfRFcsIEJQRl9SRUdfMCwgMCwgb2Zmc2V0b2Yoc3RydWN0IHRlc3RfdmFsLCBmb28pKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLnRlc3RfdmFsX21hcF9maXh1cCA9IHszfSwKKwkJLmVycnN0ciA9ICJpbnZhbGlkIGFjY2VzcyB0byBtYXAgdmFsdWUsIHZhbHVlX3NpemU9NDggb2ZmPTQ0IHNpemU9OCIsCisJCS5yZXN1bHQgPSBSRUpFQ1QsCisJfSwKKwl7CisJCSJpbnZhbGlkIG1hcCBhY2Nlc3MgaW50byBhbiBhcnJheSB3aXRoIGEgaW52YWxpZCBtYXggY2hlY2siLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfU1RfTUVNKEJQRl9EVywgQlBGX1JFR18xMCwgLTgsIDApLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzIsIEJQRl9SRUdfMTApLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzIsIC04KSwKKwkJCUJQRl9MRF9NQVBfRkQoQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX21hcF9sb29rdXBfZWxlbSksCisJCQlCUEZfSk1QX0lNTShCUEZfSkVRLCBCUEZfUkVHXzAsIDAsIDEwKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR184LCBCUEZfUkVHXzApLAorCQkJQlBGX1NUX01FTShCUEZfRFcsIEJQRl9SRUdfMTAsIC04LCAwKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18yLCBCUEZfUkVHXzEwKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18yLCAtOCksCisJCQlCUEZfTERfTUFQX0ZEKEJQRl9SRUdfMSwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19tYXBfbG9va3VwX2VsZW0pLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgQlBGX1JFR18wLCAwLCAyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgQlBGX1JFR18wLCBCUEZfUkVHXzgpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMCwgQlBGX1JFR18wLCBvZmZzZXRvZihzdHJ1Y3QgdGVzdF92YWwsIGZvbykpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkudGVzdF92YWxfbWFwX2ZpeHVwID0gezMsIDExfSwKKwkJLmVycnN0ciA9ICJSMCBtaW4gdmFsdWUgaXMgbmVnYXRpdmUsIGVpdGhlciB1c2UgdW5zaWduZWQgaW5kZXggb3IgZG8gYSBpZiAoaW5kZXggPj0wKSBjaGVjay4iLAorCQkucmVzdWx0ID0gUkVKRUNULAorCX0sCiB9OwogCiBzdGF0aWMgaW50IHByb2JlX2ZpbHRlcl9sZW5ndGgoc3RydWN0IGJwZl9pbnNuICpmcCkKQEAgLTE1NDEsMTIgKzIzOTYsMTIgQEAKIAlyZXR1cm4gbGVuICsgMTsKIH0KIAotc3RhdGljIGludCBjcmVhdGVfbWFwKHZvaWQpCitzdGF0aWMgaW50IGNyZWF0ZV9tYXAoc2l6ZV90IHZhbF9zaXplLCBpbnQgbnVtKQogewogCWludCBtYXBfZmQ7CiAKIAltYXBfZmQgPSBicGZfY3JlYXRlX21hcChCUEZfTUFQX1RZUEVfSEFTSCwKLQkJCQlzaXplb2YobG9uZyBsb25nKSwgc2l6ZW9mKGxvbmcgbG9uZyksIDEwMjQsIDApOworCQkJCXNpemVvZihsb25nIGxvbmcpLCB2YWxfc2l6ZSwgbnVtLCAwKTsKIAlpZiAobWFwX2ZkIDwgMCkKIAkJcHJpbnRmKCJmYWlsZWQgdG8gY3JlYXRlIG1hcCAnJXMnXG4iLCBzdHJlcnJvcihlcnJubykpOwogCkBAIC0xNTc2LDEyICsyNDMxLDEzIEBACiAJCWludCBwcm9nX2xlbiA9IHByb2JlX2ZpbHRlcl9sZW5ndGgocHJvZyk7CiAJCWludCAqZml4dXAgPSB0ZXN0c1tpXS5maXh1cDsKIAkJaW50ICpwcm9nX2FycmF5X2ZpeHVwID0gdGVzdHNbaV0ucHJvZ19hcnJheV9maXh1cDsKKwkJaW50ICp0ZXN0X3ZhbF9tYXBfZml4dXAgPSB0ZXN0c1tpXS50ZXN0X3ZhbF9tYXBfZml4dXA7CiAJCWludCBleHBlY3RlZF9yZXN1bHQ7CiAJCWNvbnN0IGNoYXIgKmV4cGVjdGVkX2VycnN0cjsKLQkJaW50IG1hcF9mZCA9IC0xLCBwcm9nX2FycmF5X2ZkID0gLTE7CisJCWludCBtYXBfZmQgPSAtMSwgcHJvZ19hcnJheV9mZCA9IC0xLCB0ZXN0X3ZhbF9tYXBfZmQgPSAtMTsKIAogCQlpZiAoKmZpeHVwKSB7Ci0JCQltYXBfZmQgPSBjcmVhdGVfbWFwKCk7CisJCQltYXBfZmQgPSBjcmVhdGVfbWFwKHNpemVvZihsb25nIGxvbmcpLCAxMDI0KTsKIAogCQkJZG8gewogCQkJCXByb2dbKmZpeHVwXS5pbW0gPSBtYXBfZmQ7CkBAIC0xNTk2LDYgKzI0NTIsMTggQEAKIAkJCQlwcm9nX2FycmF5X2ZpeHVwKys7CiAJCQl9IHdoaWxlICgqcHJvZ19hcnJheV9maXh1cCk7CiAJCX0KKwkJaWYgKCp0ZXN0X3ZhbF9tYXBfZml4dXApIHsKKwkJCS8qIFVucHJpdmlsZWdlZCBjYW4ndCBjcmVhdGUgYSBoYXNoIG1hcC4qLworCQkJaWYgKHVucHJpdikKKwkJCQljb250aW51ZTsKKwkJCXRlc3RfdmFsX21hcF9mZCA9IGNyZWF0ZV9tYXAoc2l6ZW9mKHN0cnVjdCB0ZXN0X3ZhbCksCisJCQkJCQkgICAgIDI1Nik7CisJCQlkbyB7CisJCQkJcHJvZ1sqdGVzdF92YWxfbWFwX2ZpeHVwXS5pbW0gPSB0ZXN0X3ZhbF9tYXBfZmQ7CisJCQkJdGVzdF92YWxfbWFwX2ZpeHVwKys7CisJCQl9IHdoaWxlICgqdGVzdF92YWxfbWFwX2ZpeHVwKTsKKwkJfQorCiAJCXByaW50ZigiIyVkICVzICIsIGksIHRlc3RzW2ldLmRlc2NyKTsKIAogCQlwcm9nX2ZkID0gYnBmX3Byb2dfbG9hZChwcm9nX3R5cGUgPzogQlBGX1BST0dfVFlQRV9TT0NLRVRfRklMVEVSLApAQCAtMTY0Miw2ICsyNTEwLDggQEAKIAkJCWNsb3NlKG1hcF9mZCk7CiAJCWlmIChwcm9nX2FycmF5X2ZkID49IDApCiAJCQljbG9zZShwcm9nX2FycmF5X2ZkKTsKKwkJaWYgKHRlc3RfdmFsX21hcF9mZCA+PSAwKQorCQkJY2xvc2UodGVzdF92YWxfbWFwX2ZkKTsKIAkJY2xvc2UocHJvZ19mZCk7CiAKIAl9CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi90cmFjZV9ldmVudF9rZXJuLmMgYi9zYW1wbGVzL2JwZi90cmFjZV9ldmVudF9rZXJuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFhOGVkMwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvYnBmL3RyYWNlX2V2ZW50X2tlcm4uYwpAQCAtMCwwICsxLDY1IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTYgRmFjZWJvb2sKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvYnBmLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9icGZfcGVyZl9ldmVudC5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvcGVyZl9ldmVudC5oPgorI2luY2x1ZGUgImJwZl9oZWxwZXJzLmgiCisKK3N0cnVjdCBrZXlfdCB7CisJY2hhciBjb21tW1RBU0tfQ09NTV9MRU5dOworCXUzMiBrZXJuc3RhY2s7CisJdTMyIHVzZXJzdGFjazsKK307CisKK3N0cnVjdCBicGZfbWFwX2RlZiBTRUMoIm1hcHMiKSBjb3VudHMgPSB7CisJLnR5cGUgPSBCUEZfTUFQX1RZUEVfSEFTSCwKKwkua2V5X3NpemUgPSBzaXplb2Yoc3RydWN0IGtleV90KSwKKwkudmFsdWVfc2l6ZSA9IHNpemVvZih1NjQpLAorCS5tYXhfZW50cmllcyA9IDEwMDAwLAorfTsKKworc3RydWN0IGJwZl9tYXBfZGVmIFNFQygibWFwcyIpIHN0YWNrbWFwID0geworCS50eXBlID0gQlBGX01BUF9UWVBFX1NUQUNLX1RSQUNFLAorCS5rZXlfc2l6ZSA9IHNpemVvZih1MzIpLAorCS52YWx1ZV9zaXplID0gUEVSRl9NQVhfU1RBQ0tfREVQVEggKiBzaXplb2YodTY0KSwKKwkubWF4X2VudHJpZXMgPSAxMDAwMCwKK307CisKKyNkZWZpbmUgS0VSTl9TVEFDS0lEX0ZMQUdTICgwIHwgQlBGX0ZfRkFTVF9TVEFDS19DTVApCisjZGVmaW5lIFVTRVJfU1RBQ0tJRF9GTEFHUyAoMCB8IEJQRl9GX0ZBU1RfU1RBQ0tfQ01QIHwgQlBGX0ZfVVNFUl9TVEFDSykKKworU0VDKCJwZXJmX2V2ZW50IikKK2ludCBicGZfcHJvZzEoc3RydWN0IGJwZl9wZXJmX2V2ZW50X2RhdGEgKmN0eCkKK3sKKwljaGFyIGZtdFtdID0gIkNQVS0lZCBwZXJpb2QgJWxsZCBpcCAlbGx4IjsKKwl1MzIgY3B1ID0gYnBmX2dldF9zbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IGtleV90IGtleTsKKwl1NjQgKnZhbCwgb25lID0gMTsKKworCWlmIChjdHgtPnNhbXBsZV9wZXJpb2QgPCAxMDAwMCkKKwkJLyogaWdub3JlIHdhcm11cCAqLworCQlyZXR1cm4gMDsKKwlicGZfZ2V0X2N1cnJlbnRfY29tbSgma2V5LmNvbW0sIHNpemVvZihrZXkuY29tbSkpOworCWtleS5rZXJuc3RhY2sgPSBicGZfZ2V0X3N0YWNraWQoY3R4LCAmc3RhY2ttYXAsIEtFUk5fU1RBQ0tJRF9GTEFHUyk7CisJa2V5LnVzZXJzdGFjayA9IGJwZl9nZXRfc3RhY2tpZChjdHgsICZzdGFja21hcCwgVVNFUl9TVEFDS0lEX0ZMQUdTKTsKKwlpZiAoKGludClrZXkua2VybnN0YWNrIDwgMCAmJiAoaW50KWtleS51c2Vyc3RhY2sgPCAwKSB7CisJCWJwZl90cmFjZV9wcmludGsoZm10LCBzaXplb2YoZm10KSwgY3B1LCBjdHgtPnNhbXBsZV9wZXJpb2QsCisJCQkJIGN0eC0+cmVncy5pcCk7CisJCXJldHVybiAwOworCX0KKworCXZhbCA9IGJwZl9tYXBfbG9va3VwX2VsZW0oJmNvdW50cywgJmtleSk7CisJaWYgKHZhbCkKKwkJKCp2YWwpKys7CisJZWxzZQorCQlicGZfbWFwX3VwZGF0ZV9lbGVtKCZjb3VudHMsICZrZXksICZvbmUsIEJQRl9OT0VYSVNUKTsKKwlyZXR1cm4gMDsKK30KKworY2hhciBfbGljZW5zZVtdIFNFQygibGljZW5zZSIpID0gIkdQTCI7CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi90cmFjZV9ldmVudF91c2VyLmMgYi9zYW1wbGVzL2JwZi90cmFjZV9ldmVudF91c2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWExMzBkMzEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2JwZi90cmFjZV9ldmVudF91c2VyLmMKQEAgLTAsMCArMSwyMTMgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNiBGYWNlYm9vaworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHBvbGwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CisjaW5jbHVkZSA8bGludXgvYnBmLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlICJsaWJicGYuaCIKKyNpbmNsdWRlICJicGZfbG9hZC5oIgorCisjZGVmaW5lIFNBTVBMRV9GUkVRIDUwCisKK3N0YXRpYyBib29sIHN5c19yZWFkX3NlZW4sIHN5c193cml0ZV9zZWVuOworCitzdGF0aWMgdm9pZCBwcmludF9rc3ltKF9fdTY0IGFkZHIpCit7CisJc3RydWN0IGtzeW0gKnN5bTsKKworCWlmICghYWRkcikKKwkJcmV0dXJuOworCXN5bSA9IGtzeW1fc2VhcmNoKGFkZHIpOworCXByaW50ZigiJXM7Iiwgc3ltLT5uYW1lKTsKKwlpZiAoIXN0cmNtcChzeW0tPm5hbWUsICJzeXNfcmVhZCIpKQorCQlzeXNfcmVhZF9zZWVuID0gdHJ1ZTsKKwllbHNlIGlmICghc3RyY21wKHN5bS0+bmFtZSwgInN5c193cml0ZSIpKQorCQlzeXNfd3JpdGVfc2VlbiA9IHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2FkZHIoX191NjQgYWRkcikKK3sKKwlpZiAoIWFkZHIpCisJCXJldHVybjsKKwlwcmludGYoIiVsbHg7IiwgYWRkcik7Cit9CisKKyNkZWZpbmUgVEFTS19DT01NX0xFTiAxNgorCitzdHJ1Y3Qga2V5X3QgeworCWNoYXIgY29tbVtUQVNLX0NPTU1fTEVOXTsKKwlfX3UzMiBrZXJuc3RhY2s7CisJX191MzIgdXNlcnN0YWNrOworfTsKKworc3RhdGljIHZvaWQgcHJpbnRfc3RhY2soc3RydWN0IGtleV90ICprZXksIF9fdTY0IGNvdW50KQoreworCV9fdTY0IGlwW1BFUkZfTUFYX1NUQUNLX0RFUFRIXSA9IHt9OworCXN0YXRpYyBib29sIHdhcm5lZDsKKwlpbnQgaTsKKworCXByaW50ZigiJTNsbGQgJXM7IiwgY291bnQsIGtleS0+Y29tbSk7CisJaWYgKGJwZl9sb29rdXBfZWxlbShtYXBfZmRbMV0sICZrZXktPmtlcm5zdGFjaywgaXApICE9IDApIHsKKwkJcHJpbnRmKCItLS07Iik7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gUEVSRl9NQVhfU1RBQ0tfREVQVEggLSAxOyBpID49IDA7IGktLSkKKwkJCXByaW50X2tzeW0oaXBbaV0pOworCX0KKwlwcmludGYoIi07Iik7CisJaWYgKGJwZl9sb29rdXBfZWxlbShtYXBfZmRbMV0sICZrZXktPnVzZXJzdGFjaywgaXApICE9IDApIHsKKwkJcHJpbnRmKCItLS07Iik7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gUEVSRl9NQVhfU1RBQ0tfREVQVEggLSAxOyBpID49IDA7IGktLSkKKwkJCXByaW50X2FkZHIoaXBbaV0pOworCX0KKwlwcmludGYoIlxuIik7CisKKwlpZiAoa2V5LT5rZXJuc3RhY2sgPT0gLUVFWElTVCAmJiAhd2FybmVkKSB7CisJCXByaW50Zigic3RhY2ttYXAgY29sbGlzaW9ucyBzZWVuLiBDb25zaWRlciBpbmNyZWFzaW5nIHNpemVcbiIpOworCQl3YXJuZWQgPSB0cnVlOworCX0gZWxzZSBpZiAoKGludClrZXktPmtlcm5zdGFjayA8IDAgJiYgKGludClrZXktPnVzZXJzdGFjayA8IDApIHsKKwkJcHJpbnRmKCJlcnIgc3RhY2tpZCAlZCAlZFxuIiwga2V5LT5rZXJuc3RhY2ssIGtleS0+dXNlcnN0YWNrKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGludF9leGl0KGludCBzaWcpCit7CisJa2lsbCgwLCBTSUdLSUxMKTsKKwlleGl0KDApOworfQorCitzdGF0aWMgdm9pZCBwcmludF9zdGFja3Modm9pZCkKK3sKKwlzdHJ1Y3Qga2V5X3Qga2V5ID0ge30sIG5leHRfa2V5OworCV9fdTY0IHZhbHVlOworCV9fdTMyIHN0YWNraWQgPSAwLCBuZXh0X2lkOworCWludCBmZCA9IG1hcF9mZFswXSwgc3RhY2tfbWFwID0gbWFwX2ZkWzFdOworCisJc3lzX3JlYWRfc2VlbiA9IHN5c193cml0ZV9zZWVuID0gZmFsc2U7CisJd2hpbGUgKGJwZl9nZXRfbmV4dF9rZXkoZmQsICZrZXksICZuZXh0X2tleSkgPT0gMCkgeworCQlicGZfbG9va3VwX2VsZW0oZmQsICZuZXh0X2tleSwgJnZhbHVlKTsKKwkJcHJpbnRfc3RhY2soJm5leHRfa2V5LCB2YWx1ZSk7CisJCWJwZl9kZWxldGVfZWxlbShmZCwgJm5leHRfa2V5KTsKKwkJa2V5ID0gbmV4dF9rZXk7CisJfQorCisJaWYgKCFzeXNfcmVhZF9zZWVuIHx8ICFzeXNfd3JpdGVfc2VlbikgeworCQlwcmludGYoIkJVRyBrZXJuZWwgc3RhY2sgZG9lc24ndCBjb250YWluIHN5c19yZWFkKCkgYW5kIHN5c193cml0ZSgpXG4iKTsKKwkJaW50X2V4aXQoMCk7CisJfQorCisJLyogY2xlYXIgc3RhY2sgbWFwICovCisJd2hpbGUgKGJwZl9nZXRfbmV4dF9rZXkoc3RhY2tfbWFwLCAmc3RhY2tpZCwgJm5leHRfaWQpID09IDApIHsKKwkJYnBmX2RlbGV0ZV9lbGVtKHN0YWNrX21hcCwgJm5leHRfaWQpOworCQlzdGFja2lkID0gbmV4dF9pZDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfcGVyZl9ldmVudF9hbGxfY3B1KHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIpCit7CisJaW50IG5yX2NwdXMgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19DT05GKTsKKwlpbnQgKnBtdV9mZCA9IG1hbGxvYyhucl9jcHVzICogc2l6ZW9mKGludCkpOworCWludCBpOworCisJLyogb3BlbiBwZXJmX2V2ZW50IG9uIGFsbCBjcHVzICovCisJZm9yIChpID0gMDsgaSA8IG5yX2NwdXM7IGkrKykgeworCQlwbXVfZmRbaV0gPSBwZXJmX2V2ZW50X29wZW4oYXR0ciwgLTEsIGksIC0xLCAwKTsKKwkJaWYgKHBtdV9mZFtpXSA8IDApIHsKKwkJCXByaW50ZigicGVyZl9ldmVudF9vcGVuIGZhaWxlZFxuIik7CisJCQlnb3RvIGFsbF9jcHVfZXJyOworCQl9CisJCWFzc2VydChpb2N0bChwbXVfZmRbaV0sIFBFUkZfRVZFTlRfSU9DX1NFVF9CUEYsIHByb2dfZmRbMF0pID09IDApOworCQlhc3NlcnQoaW9jdGwocG11X2ZkW2ldLCBQRVJGX0VWRU5UX0lPQ19FTkFCTEUsIDApID09IDApOworCX0KKwlzeXN0ZW0oImRkIGlmPS9kZXYvemVybyBvZj0vZGV2L251bGwgY291bnQ9NTAwMGsiKTsKKwlwcmludF9zdGFja3MoKTsKK2FsbF9jcHVfZXJyOgorCWZvciAoaS0tOyBpID49IDA7IGktLSkKKwkJY2xvc2UocG11X2ZkW2ldKTsKKwlmcmVlKHBtdV9mZCk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfcGVyZl9ldmVudF90YXNrKHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIpCit7CisJaW50IHBtdV9mZDsKKworCS8qIG9wZW4gdGFzayBib3VuZCBldmVudCAqLworCXBtdV9mZCA9IHBlcmZfZXZlbnRfb3BlbihhdHRyLCAwLCAtMSwgLTEsIDApOworCWlmIChwbXVfZmQgPCAwKSB7CisJCXByaW50ZigicGVyZl9ldmVudF9vcGVuIGZhaWxlZFxuIik7CisJCXJldHVybjsKKwl9CisJYXNzZXJ0KGlvY3RsKHBtdV9mZCwgUEVSRl9FVkVOVF9JT0NfU0VUX0JQRiwgcHJvZ19mZFswXSkgPT0gMCk7CisJYXNzZXJ0KGlvY3RsKHBtdV9mZCwgUEVSRl9FVkVOVF9JT0NfRU5BQkxFLCAwKSA9PSAwKTsKKwlzeXN0ZW0oImRkIGlmPS9kZXYvemVybyBvZj0vZGV2L251bGwgY291bnQ9NTAwMGsiKTsKKwlwcmludF9zdGFja3MoKTsKKwljbG9zZShwbXVfZmQpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2JwZl9wZXJmX2V2ZW50KHZvaWQpCit7CisJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciBhdHRyX3R5cGVfaHcgPSB7CisJCS5zYW1wbGVfZnJlcSA9IFNBTVBMRV9GUkVRLAorCQkuZnJlcSA9IDEsCisJCS50eXBlID0gUEVSRl9UWVBFX0hBUkRXQVJFLAorCQkuY29uZmlnID0gUEVSRl9DT1VOVF9IV19DUFVfQ1lDTEVTLAorCQkuaW5oZXJpdCA9IDEsCisJfTsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIGF0dHJfdHlwZV9zdyA9IHsKKwkJLnNhbXBsZV9mcmVxID0gU0FNUExFX0ZSRVEsCisJCS5mcmVxID0gMSwKKwkJLnR5cGUgPSBQRVJGX1RZUEVfU09GVFdBUkUsCisJCS5jb25maWcgPSBQRVJGX0NPVU5UX1NXX0NQVV9DTE9DSywKKwkJLmluaGVyaXQgPSAxLAorCX07CisKKwl0ZXN0X3BlcmZfZXZlbnRfYWxsX2NwdSgmYXR0cl90eXBlX2h3KTsKKwl0ZXN0X3BlcmZfZXZlbnRfdGFzaygmYXR0cl90eXBlX2h3KTsKKwl0ZXN0X3BlcmZfZXZlbnRfYWxsX2NwdSgmYXR0cl90eXBlX3N3KTsKKwl0ZXN0X3BlcmZfZXZlbnRfdGFzaygmYXR0cl90eXBlX3N3KTsKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHJsaW1pdCByID0ge1JMSU1fSU5GSU5JVFksIFJMSU1fSU5GSU5JVFl9OworCWNoYXIgZmlsZW5hbWVbMjU2XTsKKworCXNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXNfa2Vybi5vIiwgYXJndlswXSk7CisJc2V0cmxpbWl0KFJMSU1JVF9NRU1MT0NLLCAmcik7CisKKwlzaWduYWwoU0lHSU5ULCBpbnRfZXhpdCk7CisKKwlpZiAobG9hZF9rYWxsc3ltcygpKSB7CisJCXByaW50ZigiZmFpbGVkIHRvIHByb2Nlc3MgL3Byb2Mva2FsbHN5bXNcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAobG9hZF9icGZfZmlsZShmaWxlbmFtZSkpIHsKKwkJcHJpbnRmKCIlcyIsIGJwZl9sb2dfYnVmKTsKKwkJcmV0dXJuIDI7CisJfQorCisJaWYgKGZvcmsoKSA9PSAwKSB7CisJCXJlYWRfdHJhY2VfcGlwZSgpOworCQlyZXR1cm4gMDsKKwl9CisJdGVzdF9icGZfcGVyZl9ldmVudCgpOworCisJaW50X2V4aXQoMCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi90cmFjZXg1X2tlcm4uYyBiL3NhbXBsZXMvYnBmL3RyYWNleDVfa2Vybi5jCmluZGV4IGY5NWYyMzIuLmZkMTJkNzEgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvYnBmL3RyYWNleDVfa2Vybi5jCisrKyBiL3NhbXBsZXMvYnBmL3RyYWNleDVfa2Vybi5jCkBAIC0xOSwyMCArMTksMTggQEAKIAkubWF4X2VudHJpZXMgPSAxMDI0LAogfTsKIAotU0VDKCJrcHJvYmUvc2VjY29tcF9waGFzZTEiKQorU0VDKCJrcHJvYmUvX19zZWNjb21wX2ZpbHRlciIpCiBpbnQgYnBmX3Byb2cxKHN0cnVjdCBwdF9yZWdzICpjdHgpCiB7Ci0Jc3RydWN0IHNlY2NvbXBfZGF0YSBzZDsKLQotCWJwZl9wcm9iZV9yZWFkKCZzZCwgc2l6ZW9mKHNkKSwgKHZvaWQgKilQVF9SRUdTX1BBUk0xKGN0eCkpOworCWludCBzY19uciA9IChpbnQpUFRfUkVHU19QQVJNMShjdHgpOwogCiAJLyogZGlzcGF0Y2ggaW50byBuZXh0IEJQRiBwcm9ncmFtIGRlcGVuZGluZyBvbiBzeXNjYWxsIG51bWJlciAqLwotCWJwZl90YWlsX2NhbGwoY3R4LCAmcHJvZ3MsIHNkLm5yKTsKKwlicGZfdGFpbF9jYWxsKGN0eCwgJnByb2dzLCBzY19ucik7CiAKIAkvKiBmYWxsIHRocm91Z2ggLT4gdW5rbm93biBzeXNjYWxsICovCi0JaWYgKHNkLm5yID49IF9fTlJfZ2V0dWlkICYmIHNkLm5yIDw9IF9fTlJfZ2V0c2lkKSB7CisJaWYgKHNjX25yID49IF9fTlJfZ2V0dWlkICYmIHNjX25yIDw9IF9fTlJfZ2V0c2lkKSB7CiAJCWNoYXIgZm10W10gPSAic3lzY2FsbD0lZCAob25lIG9mIGdldC9zZXQgdWlkL3BpZC9naWQpXG4iOwotCQlicGZfdHJhY2VfcHJpbnRrKGZtdCwgc2l6ZW9mKGZtdCksIHNkLm5yKTsKKwkJYnBmX3RyYWNlX3ByaW50ayhmbXQsIHNpemVvZihmbXQpLCBzY19ucik7CiAJfQogCXJldHVybiAwOwogfQpAQCAtNDIsNyArNDAsNyBAQAogewogCXN0cnVjdCBzZWNjb21wX2RhdGEgc2Q7CiAKLQlicGZfcHJvYmVfcmVhZCgmc2QsIHNpemVvZihzZCksICh2b2lkICopUFRfUkVHU19QQVJNMShjdHgpKTsKKwlicGZfcHJvYmVfcmVhZCgmc2QsIHNpemVvZihzZCksICh2b2lkICopUFRfUkVHU19QQVJNMihjdHgpKTsKIAlpZiAoc2QuYXJnc1syXSA9PSA1MTIpIHsKIAkJY2hhciBmbXRbXSA9ICJ3cml0ZShmZD0lZCwgYnVmPSVwLCBzaXplPSVkKVxuIjsKIAkJYnBmX3RyYWNlX3ByaW50ayhmbXQsIHNpemVvZihmbXQpLApAQCAtNTUsNyArNTMsNyBAQAogewogCXN0cnVjdCBzZWNjb21wX2RhdGEgc2Q7CiAKLQlicGZfcHJvYmVfcmVhZCgmc2QsIHNpemVvZihzZCksICh2b2lkICopUFRfUkVHU19QQVJNMShjdHgpKTsKKwlicGZfcHJvYmVfcmVhZCgmc2QsIHNpemVvZihzZCksICh2b2lkICopUFRfUkVHU19QQVJNMihjdHgpKTsKIAlpZiAoc2QuYXJnc1syXSA+IDEyOCAmJiBzZC5hcmdzWzJdIDw9IDEwMjQpIHsKIAkJY2hhciBmbXRbXSA9ICJyZWFkKGZkPSVkLCBidWY9JXAsIHNpemU9JWQpXG4iOwogCQlicGZfdHJhY2VfcHJpbnRrKGZtdCwgc2l6ZW9mKGZtdCksCmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi90cmFjZXg1X3VzZXIuYyBiL3NhbXBsZXMvYnBmL3RyYWNleDVfdXNlci5jCmluZGV4IGEwNGRkM2MuLjM2YjU5MjUgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvYnBmL3RyYWNleDVfdXNlci5jCisrKyBiL3NhbXBsZXMvYnBmL3RyYWNleDVfdXNlci5jCkBAIC02LDYgKzYsNyBAQAogI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgogI2luY2x1ZGUgImxpYmJwZi5oIgogI2luY2x1ZGUgImJwZl9sb2FkLmgiCisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiAKIC8qIGluc3RhbGwgZmFrZSBzZWNjb21wIHByb2dyYW0gdG8gZW5hYmxlIHNlY2NvbXAgY29kZSBwYXRoIGluc2lkZSB0aGUga2VybmVsLAogICogc28gdGhhdCBvdXIga3Byb2JlIGF0dGFjaGVkIHRvIHNlY2NvbXBfcGhhc2UxKCkgY2FuIGJlIHRyaWdnZXJlZApAQCAtMjcsOCArMjgsMTAgQEAKIHsKIAlGSUxFICpmOwogCWNoYXIgZmlsZW5hbWVbMjU2XTsKKwlzdHJ1Y3QgcmxpbWl0IHIgPSB7UkxJTV9JTkZJTklUWSwgUkxJTV9JTkZJTklUWX07CiAKIAlzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIiVzX2tlcm4ubyIsIGFyZ3ZbMF0pOworCXNldHJsaW1pdChSTElNSVRfTUVNTE9DSywgJnIpOwogCiAJaWYgKGxvYWRfYnBmX2ZpbGUoZmlsZW5hbWUpKSB7CiAJCXByaW50ZigiJXMiLCBicGZfbG9nX2J1Zik7CmRpZmYgLS1naXQgYS9zYW1wbGVzL3JwbXNnL3JwbXNnX2NsaWVudF9zYW1wbGUuYyBiL3NhbXBsZXMvcnBtc2cvcnBtc2dfY2xpZW50X3NhbXBsZS5jCmluZGV4IGQwZTI0OWM5Li5mMTYxZGZkIDEwMDY0NAotLS0gYS9zYW1wbGVzL3JwbXNnL3JwbXNnX2NsaWVudF9zYW1wbGUuYworKysgYi9zYW1wbGVzL3JwbXNnL3JwbXNnX2NsaWVudF9zYW1wbGUuYwpAQCAtMjQsMzggKzI0LDUyIEBACiAjZGVmaW5lIE1TRwkJImhlbGxvIHdvcmxkISIKICNkZWZpbmUgTVNHX0xJTUlUCTEwMAogCi1zdGF0aWMgdm9pZCBycG1zZ19zYW1wbGVfY2Ioc3RydWN0IHJwbXNnX2NoYW5uZWwgKnJwZGV2LCB2b2lkICpkYXRhLCBpbnQgbGVuLAorc3RydWN0IGluc3RhbmNlX2RhdGEgeworCWludCByeF9jb3VudDsKK307CisKK3N0YXRpYyBpbnQgcnBtc2dfc2FtcGxlX2NiKHN0cnVjdCBycG1zZ19kZXZpY2UgKnJwZGV2LCB2b2lkICpkYXRhLCBpbnQgbGVuLAogCQkJCQkJdm9pZCAqcHJpdiwgdTMyIHNyYykKIHsKIAlpbnQgcmV0OwotCXN0YXRpYyBpbnQgcnhfY291bnQ7CisJc3RydWN0IGluc3RhbmNlX2RhdGEgKmlkYXRhID0gZGV2X2dldF9kcnZkYXRhKCZycGRldi0+ZGV2KTsKIAotCWRldl9pbmZvKCZycGRldi0+ZGV2LCAiaW5jb21pbmcgbXNnICVkIChzcmM6IDB4JXgpXG4iLCArK3J4X2NvdW50LCBzcmMpOworCWRldl9pbmZvKCZycGRldi0+ZGV2LCAiaW5jb21pbmcgbXNnICVkIChzcmM6IDB4JXgpXG4iLAorCQkgKytpZGF0YS0+cnhfY291bnQsIHNyYyk7CiAKIAlwcmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCBfX2Z1bmNfXywgRFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsCiAJCSAgICAgICBkYXRhLCBsZW4sICB0cnVlKTsKIAogCS8qIHNhbXBsZXMgc2hvdWxkIG5vdCBsaXZlIGZvcmV2ZXIgKi8KLQlpZiAocnhfY291bnQgPj0gTVNHX0xJTUlUKSB7CisJaWYgKGlkYXRhLT5yeF9jb3VudCA+PSBNU0dfTElNSVQpIHsKIAkJZGV2X2luZm8oJnJwZGV2LT5kZXYsICJnb29kYnllIVxuIik7Ci0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAJfQogCiAJLyogc2VuZCBhIG5ldyBtZXNzYWdlIG5vdyAqLwotCXJldCA9IHJwbXNnX3NlbmQocnBkZXYsIE1TRywgc3RybGVuKE1TRykpOworCXJldCA9IHJwbXNnX3NlbmQocnBkZXYtPmVwdCwgTVNHLCBzdHJsZW4oTVNHKSk7CiAJaWYgKHJldCkKIAkJZGV2X2VycigmcnBkZXYtPmRldiwgInJwbXNnX3NlbmQgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJwbXNnX3NhbXBsZV9wcm9iZShzdHJ1Y3QgcnBtc2dfY2hhbm5lbCAqcnBkZXYpCitzdGF0aWMgaW50IHJwbXNnX3NhbXBsZV9wcm9iZShzdHJ1Y3QgcnBtc2dfZGV2aWNlICpycGRldikKIHsKIAlpbnQgcmV0OworCXN0cnVjdCBpbnN0YW5jZV9kYXRhICppZGF0YTsKIAogCWRldl9pbmZvKCZycGRldi0+ZGV2LCAibmV3IGNoYW5uZWw6IDB4JXggLT4gMHgleCFcbiIsCiAJCQkJCXJwZGV2LT5zcmMsIHJwZGV2LT5kc3QpOwogCisJaWRhdGEgPSBkZXZtX2t6YWxsb2MoJnJwZGV2LT5kZXYsIHNpemVvZigqaWRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmcnBkZXYtPmRldiwgaWRhdGEpOworCiAJLyogc2VuZCBhIG1lc3NhZ2UgdG8gb3VyIHJlbW90ZSBwcm9jZXNzb3IgKi8KLQlyZXQgPSBycG1zZ19zZW5kKHJwZGV2LCBNU0csIHN0cmxlbihNU0cpKTsKKwlyZXQgPSBycG1zZ19zZW5kKHJwZGV2LT5lcHQsIE1TRywgc3RybGVuKE1TRykpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcnBkZXYtPmRldiwgInJwbXNnX3NlbmQgZmFpbGVkOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKQEAgLTY0LDcgKzc4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcnBtc2dfc2FtcGxlX3JlbW92ZShzdHJ1Y3QgcnBtc2dfY2hhbm5lbCAqcnBkZXYpCitzdGF0aWMgdm9pZCBycG1zZ19zYW1wbGVfcmVtb3ZlKHN0cnVjdCBycG1zZ19kZXZpY2UgKnJwZGV2KQogewogCWRldl9pbmZvKCZycGRldi0+ZGV2LCAicnBtc2cgc2FtcGxlIGNsaWVudCBkcml2ZXIgaXMgcmVtb3ZlZFxuIik7CiB9CmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLnVic2FuIGIvc2NyaXB0cy9NYWtlZmlsZS51YnNhbgppbmRleCA4YWI2ODY3Li5kZDc3OWM0IDEwMDY0NAotLS0gYS9zY3JpcHRzL01ha2VmaWxlLnVic2FuCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUudWJzYW4KQEAgLTMsNyArMyw2IEBACiAgICAgICBDRkxBR1NfVUJTQU4gKz0gJChjYWxsIGNjLW9wdGlvbiwgLWZzYW5pdGl6ZT1pbnRlZ2VyLWRpdmlkZS1ieS16ZXJvKQogICAgICAgQ0ZMQUdTX1VCU0FOICs9ICQoY2FsbCBjYy1vcHRpb24sIC1mc2FuaXRpemU9dW5yZWFjaGFibGUpCiAgICAgICBDRkxBR1NfVUJTQU4gKz0gJChjYWxsIGNjLW9wdGlvbiwgLWZzYW5pdGl6ZT12bGEtYm91bmQpCi0gICAgICBDRkxBR1NfVUJTQU4gKz0gJChjYWxsIGNjLW9wdGlvbiwgLWZzYW5pdGl6ZT1udWxsKQogICAgICAgQ0ZMQUdTX1VCU0FOICs9ICQoY2FsbCBjYy1vcHRpb24sIC1mc2FuaXRpemU9c2lnbmVkLWludGVnZXItb3ZlcmZsb3cpCiAgICAgICBDRkxBR1NfVUJTQU4gKz0gJChjYWxsIGNjLW9wdGlvbiwgLWZzYW5pdGl6ZT1ib3VuZHMpCiAgICAgICBDRkxBR1NfVUJTQU4gKz0gJChjYWxsIGNjLW9wdGlvbiwgLWZzYW5pdGl6ZT1vYmplY3Qtc2l6ZSkKQEAgLTE0LDQgKzEzLDggQEAKIGlmZGVmIENPTkZJR19VQlNBTl9BTElHTk1FTlQKICAgICAgIENGTEFHU19VQlNBTiArPSAkKGNhbGwgY2Mtb3B0aW9uLCAtZnNhbml0aXplPWFsaWdubWVudCkKIGVuZGlmCisKK2lmZGVmIENPTkZJR19VQlNBTl9OVUxMCisgICAgICBDRkxBR1NfVUJTQU4gKz0gJChjYWxsIGNjLW9wdGlvbiwgLWZzYW5pdGl6ZT1udWxsKQorZW5kaWYKIGVuZGlmCmRpZmYgLS1naXQgYS9zY3JpcHRzL2NoZWNra2NvbmZpZ3N5bWJvbHMucHkgYi9zY3JpcHRzL2NoZWNra2NvbmZpZ3N5bWJvbHMucHkKaW5kZXggZGY2NDNmNi4uYTMyZTRkYSAxMDA3NTUKLS0tIGEvc2NyaXB0cy9jaGVja2tjb25maWdzeW1ib2xzLnB5CisrKyBiL3NjcmlwdHMvY2hlY2trY29uZmlnc3ltYm9scy5weQpAQCAtMSw5OCArMSw5OSBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMgorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwogCiAiIiJGaW5kIEtjb25maWcgc3ltYm9scyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ1dCBub3QgZGVmaW5lZC4iIiIKIAotIyAoYykgMjAxNC0yMDE1IFZhbGVudGluIFJvdGhiZXJnIDx2YWxlbnRpbnJvdGhiZXJnQGdtYWlsLmNvbT4KKyMgKGMpIDIwMTQtMjAxNiBWYWxlbnRpbiBSb3RoYmVyZyA8dmFsZW50aW5yb3RoYmVyZ0BnbWFpbC5jb20+CiAjIChjKSAyMDE0IFN0ZWZhbiBIZW5nZWxlaW4gPHN0ZWZhbi5oZW5nZWxlaW5AZmF1LmRlPgogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgTGljZW5zZSB2ZXJzaW9uIDIKIAogCitpbXBvcnQgYXJncGFyc2UKIGltcG9ydCBkaWZmbGliCiBpbXBvcnQgb3MKIGltcG9ydCByZQogaW1wb3J0IHNpZ25hbAoraW1wb3J0IHN1YnByb2Nlc3MKIGltcG9ydCBzeXMKIGZyb20gbXVsdGlwcm9jZXNzaW5nIGltcG9ydCBQb29sLCBjcHVfY291bnQKLWZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgotZnJvbSBzdWJwcm9jZXNzIGltcG9ydCBQb3BlbiwgUElQRSwgU1RET1VUCiAKIAogIyByZWdleCBleHByZXNzaW9ucwogT1BFUkFUT1JTID0gciImfFwofFwpfFx8fFwhIgotRkVBVFVSRSA9IHIiKD86XHcqW0EtWjAtOV1cdyopezIsfSIKLURFRiA9IHIiXlxzKig/Om1lbnUpeywxfWNvbmZpZ1xzKygiICsgRkVBVFVSRSArIHIiKVxzKiIKLUVYUFIgPSByIig/OiIgKyBPUEVSQVRPUlMgKyByInxcc3wiICsgRkVBVFVSRSArIHIiKSsiCitTWU1CT0wgPSByIig/Olx3KltBLVowLTldXHcqKXsyLH0iCitERUYgPSByIl5ccyooPzptZW51KXssMX1jb25maWdccysoIiArIFNZTUJPTCArIHIiKVxzKiIKK0VYUFIgPSByIig/OiIgKyBPUEVSQVRPUlMgKyByInxcc3wiICsgU1lNQk9MICsgciIpKyIKIERFRkFVTFQgPSByImRlZmF1bHRccysuKj8oPzppZlxzLispeywxfSIKIFNUTVQgPSByIl5ccyooPzppZnxzZWxlY3R8ZGVwZW5kc1xzK29ufCg/OiIgKyBERUZBVUxUICsgciIpKVxzKyIgKyBFWFBSCi1TT1VSQ0VfRkVBVFVSRSA9IHIiKD86XFd8XGIpK1tEXXssMX1DT05GSUdfKCIgKyBGRUFUVVJFICsgciIpIgorU09VUkNFX1NZTUJPTCA9IHIiKD86XFd8XGIpK1tEXXssMX1DT05GSUdfKCIgKyBTWU1CT0wgKyByIikiCiAKICMgcmVnZXggb2JqZWN0cwogUkVHRVhfRklMRV9LQ09ORklHID0gcmUuY29tcGlsZShyIi4qS2NvbmZpZ1tcLlx3K1wtXSokIikKLVJFR0VYX0ZFQVRVUkUgPSByZS5jb21waWxlKHInKD8hXEIpJyArIEZFQVRVUkUgKyByJyg/IVxCKScpCi1SRUdFWF9TT1VSQ0VfRkVBVFVSRSA9IHJlLmNvbXBpbGUoU09VUkNFX0ZFQVRVUkUpCitSRUdFWF9TWU1CT0wgPSByZS5jb21waWxlKHInKD8hXEIpJyArIFNZTUJPTCArIHInKD8hXEIpJykKK1JFR0VYX1NPVVJDRV9TWU1CT0wgPSByZS5jb21waWxlKFNPVVJDRV9TWU1CT0wpCiBSRUdFWF9LQ09ORklHX0RFRiA9IHJlLmNvbXBpbGUoREVGKQogUkVHRVhfS0NPTkZJR19FWFBSID0gcmUuY29tcGlsZShFWFBSKQogUkVHRVhfS0NPTkZJR19TVE1UID0gcmUuY29tcGlsZShTVE1UKQogUkVHRVhfS0NPTkZJR19IRUxQID0gcmUuY29tcGlsZShyIl5ccysoaGVscHwtLS1oZWxwLS0tKVxzKiQiKQotUkVHRVhfRklMVEVSX0ZFQVRVUkVTID0gcmUuY29tcGlsZShyIltBLVphLXowLTldJCIpCitSRUdFWF9GSUxURVJfU1lNQk9MUyA9IHJlLmNvbXBpbGUociJbQS1aYS16MC05XSQiKQogUkVHRVhfTlVNRVJJQyA9IHJlLmNvbXBpbGUociIwW3hYXVswLTlhLWZBLUZdK3xbMC05XSsiKQogUkVHRVhfUVVPVEVTID0gcmUuY29tcGlsZSgiKFwiKC4qPylcIikiKQogCiAKIGRlZiBwYXJzZV9vcHRpb25zKCk6CiAgICAgIiIiVGhlIHVzZXIgaW50ZXJmYWNlIG9mIHRoaXMgbW9kdWxlLiIiIgotICAgIHVzYWdlID0gIiVwcm9nIFtvcHRpb25zXVxuXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICJSdW4gdGhpcyB0b29sIHRvIGRldGVjdCBLY29uZmlnIHN5bWJvbHMgdGhhdCBhcmUgcmVmZXJlbmNlZCBidXQgIiBcCi0gICAgICAgICAgICAibm90IGRlZmluZWQgaW5cbktjb25maWcuICBUaGUgb3V0cHV0IG9mIHRoaXMgdG9vbCBoYXMgdGhlICIgICAgICAgXAotICAgICAgICAgICAgImZvcm1hdCBcJ1VuZGVmaW5lZCBzeW1ib2xcXHRGaWxlIGxpc3RcJ1xuXG4iICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICJJZiBubyBvcHRpb24gaXMgc3BlY2lmaWVkLCAlcHJvZyB3aWxsIGRlZmF1bHQgdG8gY2hlY2sgeW91clxuIiAgICBcCi0gICAgICAgICAgICAiY3VycmVudCB0cmVlLiAgUGxlYXNlIG5vdGUgdGhhdCBzcGVjaWZ5aW5nIGNvbW1pdHMgd2lsbCAiICAgICAgICAgXAotICAgICAgICAgICAgIlwnZ2l0IHJlc2V0IC0taGFyZFwnXG55b3VyIGN1cnJlbnQgdHJlZSEgIFlvdSBtYXkgc2F2ZSAiICAgICAgICAgIFwKLSAgICAgICAgICAgICJ1bmNvbW1pdHRlZCBjaGFuZ2VzIHRvIGF2b2lkIGxvc2luZyBkYXRhLiIKKyAgICB1c2FnZSA9ICJSdW4gdGhpcyB0b29sIHRvIGRldGVjdCBLY29uZmlnIHN5bWJvbHMgdGhhdCBhcmUgcmVmZXJlbmNlZCBidXQgIiBcCisgICAgICAgICAgICAibm90IGRlZmluZWQgaW4gS2NvbmZpZy4gIElmIG5vIG9wdGlvbiBpcyBzcGVjaWZpZWQsICIgICAgICAgICAgICAgXAorICAgICAgICAgICAgImNoZWNra2NvbmZpZ3N5bWJvbHMgZGVmYXVsdHMgdG8gY2hlY2sgeW91ciBjdXJyZW50IHRyZWUuICAiICAgICAgIFwKKyAgICAgICAgICAgICJQbGVhc2Ugbm90ZSB0aGF0IHNwZWNpZnlpbmcgY29tbWl0cyB3aWxsICdnaXQgcmVzZXQgLS1oYXJkXCcgIiAgICBcCisgICAgICAgICAgICAieW91ciBjdXJyZW50IHRyZWUhICBZb3UgbWF5IHNhdmUgdW5jb21taXR0ZWQgY2hhbmdlcyB0byBhdm9pZCAiICAgXAorICAgICAgICAgICAgImxvc2luZyBkYXRhLiIKIAotICAgIHBhcnNlciA9IE9wdGlvblBhcnNlcih1c2FnZT11c2FnZSkKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj11c2FnZSkKIAotICAgIHBhcnNlci5hZGRfb3B0aW9uKCctYycsICctLWNvbW1pdCcsIGRlc3Q9J2NvbW1pdCcsIGFjdGlvbj0nc3RvcmUnLAotICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgaGVscD0iQ2hlY2sgaWYgdGhlIHNwZWNpZmllZCBjb21taXQgKGhhc2gpIGludHJvZHVjZXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZGVmaW5lZCBLY29uZmlnIHN5bWJvbHMuIikKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctYycsICctLWNvbW1pdCcsIGRlc3Q9J2NvbW1pdCcsIGFjdGlvbj0nc3RvcmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9ImNoZWNrIGlmIHRoZSBzcGVjaWZpZWQgY29tbWl0IChoYXNoKSBpbnRyb2R1Y2VzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZGVmaW5lZCBLY29uZmlnIHN5bWJvbHMiKQogCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oJy1kJywgJy0tZGlmZicsIGRlc3Q9J2RpZmYnLCBhY3Rpb249J3N0b3JlJywKLSAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSIiLAotICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkRpZmYgdW5kZWZpbmVkIHN5bWJvbHMgYmV0d2VlbiB0d28gY29tbWl0cy4gIFRoZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXQgZm9ybWF0IGJhc2VzIG9uIEdpdCBsb2cncyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiXCdjb21tbWl0MS4uY29tbWl0MlwnLiIpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLWQnLCAnLS1kaWZmJywgZGVzdD0nZGlmZicsIGFjdGlvbj0nc3RvcmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9ImRpZmYgdW5kZWZpbmVkIHN5bWJvbHMgYmV0d2VlbiB0d28gY29tbWl0cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoZS5nLiwgLWQgY29tbW1pdDEuLmNvbW1pdDIpIikKIAotICAgIHBhcnNlci5hZGRfb3B0aW9uKCctZicsICctLWZpbmQnLCBkZXN0PSdmaW5kJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PUZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkZpbmQgYW5kIHNob3cgY29tbWl0cyB0aGF0IG1heSBjYXVzZSBzeW1ib2xzIHRvIGJlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaXNzaW5nLiAgUmVxdWlyZWQgdG8gcnVuIHdpdGggLS1kaWZmLiIpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLWYnLCAnLS1maW5kJywgZGVzdD0nZmluZCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iZmluZCBhbmQgc2hvdyBjb21taXRzIHRoYXQgbWF5IGNhdXNlIHN5bWJvbHMgdG8gYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWlzc2luZyAocmVxdWlyZWQgdG8gcnVuIHdpdGggLS1kaWZmKSIpCiAKLSAgICBwYXJzZXIuYWRkX29wdGlvbignLWknLCAnLS1pZ25vcmUnLCBkZXN0PSdpZ25vcmUnLCBhY3Rpb249J3N0b3JlJywKLSAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSIiLAotICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Iklnbm9yZSBmaWxlcyBtYXRjaGluZyB0aGlzIHBhdHRlcm4uICBOb3RlIHRoYXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBwYXR0ZXJuIG5lZWRzIHRvIGJlIGEgUHl0aG9uIHJlZ2V4LiAgVG8gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgImlnbm9yZSBkZWZjb25maWdzLCBzcGVjaWZ5IC1pICcuKmRlZmNvbmZpZycuIikKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctaScsICctLWlnbm9yZScsIGRlc3Q9J2lnbm9yZScsIGFjdGlvbj0nc3RvcmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Imlnbm9yZSBmaWxlcyBtYXRjaGluZyB0aGlzIFB5dGhvbiByZWdleCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoZS5nLiwgLWkgJy4qZGVmY29uZmlnJykiKQogCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oJy1zJywgJy0tc2ltJywgZGVzdD0nc2ltJywgYWN0aW9uPSdzdG9yZScsIGRlZmF1bHQ9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgaGVscD0iUHJpbnQgYSBsaXN0IG9mIG1heGltdW0gMTAgc3RyaW5nLXNpbWlsYXIgc3ltYm9scy4iKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1zJywgJy0tc2ltJywgZGVzdD0nc2ltJywgYWN0aW9uPSdzdG9yZScsIGRlZmF1bHQ9IiIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJwcmludCBhIGxpc3Qgb2YgbWF4LiAxMCBzdHJpbmctc2ltaWxhciBzeW1ib2xzIikKIAotICAgIHBhcnNlci5hZGRfb3B0aW9uKCcnLCAnLS1mb3JjZScsIGRlc3Q9J2ZvcmNlJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PUZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlJlc2V0IGN1cnJlbnQgR2l0IHRyZWUgZXZlbiB3aGVuIGl0J3MgZGlydHkuIikKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWZvcmNlJywgZGVzdD0nZm9yY2UnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InJlc2V0IGN1cnJlbnQgR2l0IHRyZWUgZXZlbiB3aGVuIGl0J3MgZGlydHkiKQogCi0gICAgKG9wdHMsIF8pID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tbm8tY29sb3InLCBkZXN0PSdjb2xvcicsIGFjdGlvbj0nc3RvcmVfZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iZG9uJ3QgcHJpbnQgY29sb3JlZCBvdXRwdXQgKGRlZmF1bHQgd2hlbiBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0dGluZyB0byBhIHRlcm1pbmFsKSIpCiAKLSAgICBpZiBvcHRzLmNvbW1pdCBhbmQgb3B0cy5kaWZmOgorICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisKKyAgICBpZiBhcmdzLmNvbW1pdCBhbmQgYXJncy5kaWZmOgogICAgICAgICBzeXMuZXhpdCgiUGxlYXNlIHNwZWNpZnkgb25seSBvbmUgb3B0aW9uIGF0IG9uY2UuIikKIAotICAgIGlmIG9wdHMuZGlmZiBhbmQgbm90IHJlLm1hdGNoKHIiXltcd1wtXC5dK1wuXC5bXHdcLVwuXSskIiwgb3B0cy5kaWZmKToKKyAgICBpZiBhcmdzLmRpZmYgYW5kIG5vdCByZS5tYXRjaChyIl5bXHdcLVwuXStcLlwuW1x3XC1cLl0rJCIsIGFyZ3MuZGlmZik6CiAgICAgICAgIHN5cy5leGl0KCJQbGVhc2Ugc3BlY2lmeSB2YWxpZCBpbnB1dCBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDogIgogICAgICAgICAgICAgICAgICAiXCdjb21taXQxLi5jb21taXQyXCciKQogCi0gICAgaWYgb3B0cy5jb21taXQgb3Igb3B0cy5kaWZmOgotICAgICAgICBpZiBub3Qgb3B0cy5mb3JjZSBhbmQgdHJlZV9pc19kaXJ0eSgpOgorICAgIGlmIGFyZ3MuY29tbWl0IG9yIGFyZ3MuZGlmZjoKKyAgICAgICAgaWYgbm90IGFyZ3MuZm9yY2UgYW5kIHRyZWVfaXNfZGlydHkoKToKICAgICAgICAgICAgIHN5cy5leGl0KCJUaGUgY3VycmVudCBHaXQgdHJlZSBpcyBkaXJ0eSAoc2VlICdnaXQgc3RhdHVzJykuICAiCiAgICAgICAgICAgICAgICAgICAgICAiUnVubmluZyB0aGlzIHNjcmlwdCBtYXlcbmRlbGV0ZSBpbXBvcnRhbnQgZGF0YSBzaW5jZSBpdCAiCiAgICAgICAgICAgICAgICAgICAgICAiY2FsbHMgJ2dpdCByZXNldCAtLWhhcmQnIGZvciBzb21lIHBlcmZvcm1hbmNlXG5yZWFzb25zLiAiCkBAIC0xMDAsMTM4ICsxMDEsMTQ4IEBACiAgICAgICAgICAgICAgICAgICAgICAiJy0tZm9yY2UnIGlmIHlvdVxud2FudCB0byBpZ25vcmUgdGhpcyB3YXJuaW5nIGFuZCAiCiAgICAgICAgICAgICAgICAgICAgICAiY29udGludWUuIikKIAotICAgIGlmIG9wdHMuY29tbWl0OgotICAgICAgICBvcHRzLmZpbmQgPSBGYWxzZQorICAgIGlmIGFyZ3MuY29tbWl0OgorICAgICAgICBhcmdzLmZpbmQgPSBGYWxzZQogCi0gICAgaWYgb3B0cy5pZ25vcmU6CisgICAgaWYgYXJncy5pZ25vcmU6CiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHJlLm1hdGNoKG9wdHMuaWdub3JlLCAidGhpcy9pcy9qdXN0L2EvdGVzdC5jIikKKyAgICAgICAgICAgIHJlLm1hdGNoKGFyZ3MuaWdub3JlLCAidGhpcy9pcy9qdXN0L2EvdGVzdC5jIikKICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgc3lzLmV4aXQoIlBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgUHl0aG9uIHJlZ2V4LiIpCiAKLSAgICByZXR1cm4gb3B0cworICAgIHJldHVybiBhcmdzCiAKIAogZGVmIG1haW4oKToKICAgICAiIiJNYWluIGZ1bmN0aW9uIG9mIHRoaXMgbW9kdWxlLiIiIgotICAgIG9wdHMgPSBwYXJzZV9vcHRpb25zKCkKKyAgICBhcmdzID0gcGFyc2Vfb3B0aW9ucygpCiAKLSAgICBpZiBvcHRzLnNpbSBhbmQgbm90IG9wdHMuY29tbWl0IGFuZCBub3Qgb3B0cy5kaWZmOgotICAgICAgICBzaW1zID0gZmluZF9zaW1zKG9wdHMuc2ltLCBvcHRzLmlnbm9yZSkKKyAgICBnbG9iYWwgQ09MT1IKKyAgICBDT0xPUiA9IGFyZ3MuY29sb3IgYW5kIHN5cy5zdGRvdXQuaXNhdHR5KCkKKworICAgIGlmIGFyZ3Muc2ltIGFuZCBub3QgYXJncy5jb21taXQgYW5kIG5vdCBhcmdzLmRpZmY6CisgICAgICAgIHNpbXMgPSBmaW5kX3NpbXMoYXJncy5zaW0sIGFyZ3MuaWdub3JlKQogICAgICAgICBpZiBzaW1zOgotICAgICAgICAgICAgcHJpbnQgIiVzOiAlcyIgJSAoeWVsKCJTaW1pbGFyIHN5bWJvbHMiKSwgJywgJy5qb2luKHNpbXMpKQorICAgICAgICAgICAgcHJpbnQoIiVzOiAlcyIgJSAoeWVsKCJTaW1pbGFyIHN5bWJvbHMiKSwgJywgJy5qb2luKHNpbXMpKSkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHByaW50ICIlczogbm8gc2ltaWxhciBzeW1ib2xzIGZvdW5kIiAlIHllbCgiU2ltaWxhciBzeW1ib2xzIikKKyAgICAgICAgICAgIHByaW50KCIlczogbm8gc2ltaWxhciBzeW1ib2xzIGZvdW5kIiAlIHllbCgiU2ltaWxhciBzeW1ib2xzIikpCiAgICAgICAgIHN5cy5leGl0KDApCiAKICAgICAjIGRpY3Rpb25hcnkgb2YgKHVuKWRlZmluZWQgc3ltYm9scwogICAgIGRlZmluZWQgPSB7fQogICAgIHVuZGVmaW5lZCA9IHt9CiAKLSAgICBpZiBvcHRzLmNvbW1pdCBvciBvcHRzLmRpZmY6CisgICAgaWYgYXJncy5jb21taXQgb3IgYXJncy5kaWZmOgogICAgICAgICBoZWFkID0gZ2V0X2hlYWQoKQogCiAgICAgICAgICMgZ2V0IGNvbW1pdCByYW5nZQogICAgICAgICBjb21taXRfYSA9IE5vbmUKICAgICAgICAgY29tbWl0X2IgPSBOb25lCi0gICAgICAgIGlmIG9wdHMuY29tbWl0OgotICAgICAgICAgICAgY29tbWl0X2EgPSBvcHRzLmNvbW1pdCArICJ+IgotICAgICAgICAgICAgY29tbWl0X2IgPSBvcHRzLmNvbW1pdAotICAgICAgICBlbGlmIG9wdHMuZGlmZjoKLSAgICAgICAgICAgIHNwbGl0ID0gb3B0cy5kaWZmLnNwbGl0KCIuLiIpCisgICAgICAgIGlmIGFyZ3MuY29tbWl0OgorICAgICAgICAgICAgY29tbWl0X2EgPSBhcmdzLmNvbW1pdCArICJ+IgorICAgICAgICAgICAgY29tbWl0X2IgPSBhcmdzLmNvbW1pdAorICAgICAgICBlbGlmIGFyZ3MuZGlmZjoKKyAgICAgICAgICAgIHNwbGl0ID0gYXJncy5kaWZmLnNwbGl0KCIuLiIpCiAgICAgICAgICAgICBjb21taXRfYSA9IHNwbGl0WzBdCiAgICAgICAgICAgICBjb21taXRfYiA9IHNwbGl0WzFdCiAgICAgICAgICAgICB1bmRlZmluZWRfYSA9IHt9CiAgICAgICAgICAgICB1bmRlZmluZWRfYiA9IHt9CiAKICAgICAgICAgIyBnZXQgdW5kZWZpbmVkIGl0ZW1zIGJlZm9yZSB0aGUgY29tbWl0Ci0gICAgICAgIGV4ZWN1dGUoImdpdCByZXNldCAtLWhhcmQgJXMiICUgY29tbWl0X2EpCi0gICAgICAgIHVuZGVmaW5lZF9hLCBfID0gY2hlY2tfc3ltYm9scyhvcHRzLmlnbm9yZSkKKyAgICAgICAgcmVzZXQoY29tbWl0X2EpCisgICAgICAgIHVuZGVmaW5lZF9hLCBfID0gY2hlY2tfc3ltYm9scyhhcmdzLmlnbm9yZSkKIAogICAgICAgICAjIGdldCB1bmRlZmluZWQgaXRlbXMgZm9yIHRoZSBjb21taXQKLSAgICAgICAgZXhlY3V0ZSgiZ2l0IHJlc2V0IC0taGFyZCAlcyIgJSBjb21taXRfYikKLSAgICAgICAgdW5kZWZpbmVkX2IsIGRlZmluZWQgPSBjaGVja19zeW1ib2xzKG9wdHMuaWdub3JlKQorICAgICAgICByZXNldChjb21taXRfYikKKyAgICAgICAgdW5kZWZpbmVkX2IsIGRlZmluZWQgPSBjaGVja19zeW1ib2xzKGFyZ3MuaWdub3JlKQogCiAgICAgICAgICMgcmVwb3J0IGNhc2VzIHRoYXQgYXJlIHByZXNlbnQgZm9yIHRoZSBjb21taXQgYnV0IG5vdCBiZWZvcmUKLSAgICAgICAgZm9yIGZlYXR1cmUgaW4gc29ydGVkKHVuZGVmaW5lZF9iKToKLSAgICAgICAgICAgICMgZmVhdHVyZSBoYXMgbm90IGJlZW4gdW5kZWZpbmVkIGJlZm9yZQotICAgICAgICAgICAgaWYgbm90IGZlYXR1cmUgaW4gdW5kZWZpbmVkX2E6Ci0gICAgICAgICAgICAgICAgZmlsZXMgPSBzb3J0ZWQodW5kZWZpbmVkX2IuZ2V0KGZlYXR1cmUpKQotICAgICAgICAgICAgICAgIHVuZGVmaW5lZFtmZWF0dXJlXSA9IGZpbGVzCi0gICAgICAgICAgICAjIGNoZWNrIGlmIHRoZXJlIGFyZSBuZXcgZmlsZXMgdGhhdCByZWZlcmVuY2UgdGhlIHVuZGVmaW5lZCBmZWF0dXJlCisgICAgICAgIGZvciBzeW1ib2wgaW4gc29ydGVkKHVuZGVmaW5lZF9iKToKKyAgICAgICAgICAgICMgc3ltYm9sIGhhcyBub3QgYmVlbiB1bmRlZmluZWQgYmVmb3JlCisgICAgICAgICAgICBpZiBzeW1ib2wgbm90IGluIHVuZGVmaW5lZF9hOgorICAgICAgICAgICAgICAgIGZpbGVzID0gc29ydGVkKHVuZGVmaW5lZF9iLmdldChzeW1ib2wpKQorICAgICAgICAgICAgICAgIHVuZGVmaW5lZFtzeW1ib2xdID0gZmlsZXMKKyAgICAgICAgICAgICMgY2hlY2sgaWYgdGhlcmUgYXJlIG5ldyBmaWxlcyB0aGF0IHJlZmVyZW5jZSB0aGUgdW5kZWZpbmVkIHN5bWJvbAogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBmaWxlcyA9IHNvcnRlZCh1bmRlZmluZWRfYi5nZXQoZmVhdHVyZSkgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZF9hLmdldChmZWF0dXJlKSkKKyAgICAgICAgICAgICAgICBmaWxlcyA9IHNvcnRlZCh1bmRlZmluZWRfYi5nZXQoc3ltYm9sKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkX2EuZ2V0KHN5bWJvbCkpCiAgICAgICAgICAgICAgICAgaWYgZmlsZXM6Ci0gICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZFtmZWF0dXJlXSA9IGZpbGVzCisgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZFtzeW1ib2xdID0gZmlsZXMKIAogICAgICAgICAjIHJlc2V0IHRvIGhlYWQKLSAgICAgICAgZXhlY3V0ZSgiZ2l0IHJlc2V0IC0taGFyZCAlcyIgJSBoZWFkKQorICAgICAgICByZXNldChoZWFkKQogCiAgICAgIyBkZWZhdWx0IHRvIGNoZWNrIHRoZSBlbnRpcmUgdHJlZQogICAgIGVsc2U6Ci0gICAgICAgIHVuZGVmaW5lZCwgZGVmaW5lZCA9IGNoZWNrX3N5bWJvbHMob3B0cy5pZ25vcmUpCisgICAgICAgIHVuZGVmaW5lZCwgZGVmaW5lZCA9IGNoZWNrX3N5bWJvbHMoYXJncy5pZ25vcmUpCiAKICAgICAjIG5vdyBwcmludCB0aGUgb3V0cHV0Ci0gICAgZm9yIGZlYXR1cmUgaW4gc29ydGVkKHVuZGVmaW5lZCk6Ci0gICAgICAgIHByaW50IHJlZChmZWF0dXJlKQorICAgIGZvciBzeW1ib2wgaW4gc29ydGVkKHVuZGVmaW5lZCk6CisgICAgICAgIHByaW50KHJlZChzeW1ib2wpKQogCi0gICAgICAgIGZpbGVzID0gc29ydGVkKHVuZGVmaW5lZC5nZXQoZmVhdHVyZSkpCi0gICAgICAgIHByaW50ICIlczogJXMiICUgKHllbCgiUmVmZXJlbmNpbmcgZmlsZXMiKSwgIiwgIi5qb2luKGZpbGVzKSkKKyAgICAgICAgZmlsZXMgPSBzb3J0ZWQodW5kZWZpbmVkLmdldChzeW1ib2wpKQorICAgICAgICBwcmludCgiJXM6ICVzIiAlICh5ZWwoIlJlZmVyZW5jaW5nIGZpbGVzIiksICIsICIuam9pbihmaWxlcykpKQogCi0gICAgICAgIHNpbXMgPSBmaW5kX3NpbXMoZmVhdHVyZSwgb3B0cy5pZ25vcmUsIGRlZmluZWQpCisgICAgICAgIHNpbXMgPSBmaW5kX3NpbXMoc3ltYm9sLCBhcmdzLmlnbm9yZSwgZGVmaW5lZCkKICAgICAgICAgc2ltc19vdXQgPSB5ZWwoIlNpbWlsYXIgc3ltYm9scyIpCiAgICAgICAgIGlmIHNpbXM6Ci0gICAgICAgICAgICBwcmludCAiJXM6ICVzIiAlIChzaW1zX291dCwgJywgJy5qb2luKHNpbXMpKQorICAgICAgICAgICAgcHJpbnQoIiVzOiAlcyIgJSAoc2ltc19vdXQsICcsICcuam9pbihzaW1zKSkpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcmludCAiJXM6ICVzIiAlIChzaW1zX291dCwgIm5vIHNpbWlsYXIgc3ltYm9scyBmb3VuZCIpCisgICAgICAgICAgICBwcmludCgiJXM6ICVzIiAlIChzaW1zX291dCwgIm5vIHNpbWlsYXIgc3ltYm9scyBmb3VuZCIpKQogCi0gICAgICAgIGlmIG9wdHMuZmluZDoKLSAgICAgICAgICAgIHByaW50ICIlczoiICUgeWVsKCJDb21taXRzIGNoYW5naW5nIHN5bWJvbCIpCi0gICAgICAgICAgICBjb21taXRzID0gZmluZF9jb21taXRzKGZlYXR1cmUsIG9wdHMuZGlmZikKKyAgICAgICAgaWYgYXJncy5maW5kOgorICAgICAgICAgICAgcHJpbnQoIiVzOiIgJSB5ZWwoIkNvbW1pdHMgY2hhbmdpbmcgc3ltYm9sIikpCisgICAgICAgICAgICBjb21taXRzID0gZmluZF9jb21taXRzKHN5bWJvbCwgYXJncy5kaWZmKQogICAgICAgICAgICAgaWYgY29tbWl0czoKICAgICAgICAgICAgICAgICBmb3IgY29tbWl0IGluIGNvbW1pdHM6CiAgICAgICAgICAgICAgICAgICAgIGNvbW1pdCA9IGNvbW1pdC5zcGxpdCgiICIsIDEpCi0gICAgICAgICAgICAgICAgICAgIHByaW50ICJcdC0gJXMgKFwiJXNcIikiICUgKHllbChjb21taXRbMF0pLCBjb21taXRbMV0pCisgICAgICAgICAgICAgICAgICAgIHByaW50KCJcdC0gJXMgKFwiJXNcIikiICUgKHllbChjb21taXRbMF0pLCBjb21taXRbMV0pKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBwcmludCAiXHQtIG5vIGNvbW1pdCBmb3VuZCIKLSAgICAgICAgcHJpbnQgICMgIG5ldyBsaW5lCisgICAgICAgICAgICAgICAgcHJpbnQoIlx0LSBubyBjb21taXQgZm91bmQiKQorICAgICAgICBwcmludCgpICAjIG5ldyBsaW5lCisKKworZGVmIHJlc2V0KGNvbW1pdCk6CisgICAgIiIiUmVzZXQgY3VycmVudCBnaXQgdHJlZSB0byAlY29tbWl0LiIiIgorICAgIGV4ZWN1dGUoWyJnaXQiLCAicmVzZXQiLCAiLS1oYXJkIiwgY29tbWl0XSkKIAogCiBkZWYgeWVsKHN0cmluZyk6CiAgICAgIiIiCiAgICAgQ29sb3IgJXN0cmluZyB5ZWxsb3cuCiAgICAgIiIiCi0gICAgcmV0dXJuICJcMDMzWzMzbSVzXDAzM1swbSIgJSBzdHJpbmcKKyAgICByZXR1cm4gIlwwMzNbMzNtJXNcMDMzWzBtIiAlIHN0cmluZyBpZiBDT0xPUiBlbHNlIHN0cmluZwogCiAKIGRlZiByZWQoc3RyaW5nKToKICAgICAiIiIKICAgICBDb2xvciAlc3RyaW5nIHJlZC4KICAgICAiIiIKLSAgICByZXR1cm4gIlwwMzNbMzFtJXNcMDMzWzBtIiAlIHN0cmluZworICAgIHJldHVybiAiXDAzM1szMW0lc1wwMzNbMG0iICUgc3RyaW5nIGlmIENPTE9SIGVsc2Ugc3RyaW5nCiAKIAogZGVmIGV4ZWN1dGUoY21kKToKICAgICAiIiJFeGVjdXRlICVjbWQgYW5kIHJldHVybiBzdGRvdXQuICBFeGl0IGluIGNhc2Ugb2YgZXJyb3IuIiIiCi0gICAgcG9wID0gUG9wZW4oY21kLCBzdGRvdXQ9UElQRSwgc3RkZXJyPVNURE9VVCwgc2hlbGw9VHJ1ZSkKLSAgICAoc3Rkb3V0LCBfKSA9IHBvcC5jb21tdW5pY2F0ZSgpICAjIHdhaXQgdW50aWwgZmluaXNoZWQKLSAgICBpZiBwb3AucmV0dXJuY29kZSAhPSAwOgotICAgICAgICBzeXMuZXhpdChzdGRvdXQpCisgICAgdHJ5OgorICAgICAgICBzdGRvdXQgPSBzdWJwcm9jZXNzLmNoZWNrX291dHB1dChjbWQsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCwgc2hlbGw9RmFsc2UpCisgICAgICAgIHN0ZG91dCA9IHN0ZG91dC5kZWNvZGUoZXJyb3JzPSdyZXBsYWNlJykKKyAgICBleGNlcHQgc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IgYXMgZmFpbDoKKyAgICAgICAgZXhpdChmYWlsKQogICAgIHJldHVybiBzdGRvdXQKIAogCiBkZWYgZmluZF9jb21taXRzKHN5bWJvbCwgZGlmZik6CiAgICAgIiIiRmluZCBjb21taXRzIGNoYW5naW5nICVzeW1ib2wgaW4gdGhlIGdpdmVuIHJhbmdlIG9mICVkaWZmLiIiIgotICAgIGNvbW1pdHMgPSBleGVjdXRlKCJnaXQgbG9nIC0tcHJldHR5PW9uZWxpbmUgLS1hYmJyZXYtY29tbWl0IC1HICVzICVzIgotICAgICAgICAgICAgICAgICAgICAgICUgKHN5bWJvbCwgZGlmZikpCisgICAgY29tbWl0cyA9IGV4ZWN1dGUoWyJnaXQiLCAibG9nIiwgIi0tcHJldHR5PW9uZWxpbmUiLAorICAgICAgICAgICAgICAgICAgICAgICAiLS1hYmJyZXYtY29tbWl0IiwgIi1HIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sLCBkaWZmXSkKICAgICByZXR1cm4gW3ggZm9yIHggaW4gY29tbWl0cy5zcGxpdCgiXG4iKSBpZiB4XQogCiAKIGRlZiB0cmVlX2lzX2RpcnR5KCk6CiAgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIGN1cnJlbnQgd29ya2luZyB0cmVlIGlzIGRpcnR5IChpLmUuLCBpZiBhbnkgZmlsZSBoYXMKICAgICBiZWVuIGFkZGVkLCBkZWxldGVkLCBtb2RpZmllZCwgcmVuYW1lZCBvciBjb3BpZWQgYnV0IG5vdCBjb21taXR0ZWQpLiIiIgotICAgIHN0ZG91dCA9IGV4ZWN1dGUoImdpdCBzdGF0dXMgLS1wb3JjZWxhaW4iKQorICAgIHN0ZG91dCA9IGV4ZWN1dGUoWyJnaXQiLCAic3RhdHVzIiwgIi0tcG9yY2VsYWluIl0pCiAgICAgZm9yIGxpbmUgaW4gc3Rkb3V0OgogICAgICAgICBpZiByZS5maW5kYWxsKHIiW1VSTUFEQ117MX0iLCBsaW5lWzoyXSk6CiAgICAgICAgICAgICByZXR1cm4gVHJ1ZQpAQCAtMjQwLDEzICsyNTEsMTMgQEAKIAogZGVmIGdldF9oZWFkKCk6CiAgICAgIiIiUmV0dXJuIGNvbW1pdCBoYXNoIG9mIGN1cnJlbnQgSEVBRC4iIiIKLSAgICBzdGRvdXQgPSBleGVjdXRlKCJnaXQgcmV2LXBhcnNlIEhFQUQiKQorICAgIHN0ZG91dCA9IGV4ZWN1dGUoWyJnaXQiLCAicmV2LXBhcnNlIiwgIkhFQUQiXSkKICAgICByZXR1cm4gc3Rkb3V0LnN0cmlwKCdcbicpCiAKIAogZGVmIHBhcnRpdGlvbihsc3QsIHNpemUpOgogICAgICIiIlBhcnRpdGlvbiBsaXN0IEBsc3QgaW50byBldmVuaS1zaXplZCBsaXN0cyBvZiBzaXplIEBzaXplLiIiIgotICAgIHJldHVybiBbbHN0W2k6OnNpemVdIGZvciBpIGluIHhyYW5nZShzaXplKV0KKyAgICByZXR1cm4gW2xzdFtpOjpzaXplXSBmb3IgaSBpbiByYW5nZShzaXplKV0KIAogCiBkZWYgaW5pdF93b3JrZXIoKToKQEAgLTI1NCw3ICsyNjUsNyBAQAogICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0lOVCwgc2lnbmFsLlNJR19JR04pCiAKIAotZGVmIGZpbmRfc2ltcyhzeW1ib2wsIGlnbm9yZSwgZGVmaW5lZCA9IFtdKToKK2RlZiBmaW5kX3NpbXMoc3ltYm9sLCBpZ25vcmUsIGRlZmluZWQ9W10pOgogICAgICIiIlJldHVybiBhIGxpc3Qgb2YgbWF4LiB0ZW4gS2NvbmZpZyBzeW1ib2xzIHRoYXQgYXJlIHN0cmluZy1zaW1pbGFyIHRvCiAgICAgQHN5bWJvbC4iIiIKICAgICBpZiBkZWZpbmVkOgpAQCAtMjc5LDcgKzI5MCw3IEBACiBkZWYgZ2V0X2ZpbGVzKCk6CiAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZ2l0IGRpcmVjdG9yeS4iIiIKICAgICAjIHVzZSAnZ2l0IGxzLWZpbGVzJyB0byBnZXQgdGhlIHdvcmtsaXN0Ci0gICAgc3Rkb3V0ID0gZXhlY3V0ZSgiZ2l0IGxzLWZpbGVzIikKKyAgICBzdGRvdXQgPSBleGVjdXRlKFsiZ2l0IiwgImxzLWZpbGVzIl0pCiAgICAgaWYgbGVuKHN0ZG91dCkgPiAwIGFuZCBzdGRvdXRbLTFdID09ICJcbiI6CiAgICAgICAgIHN0ZG91dCA9IHN0ZG91dFs6LTFdCiAKQEAgLTMxMSw4ICszMjIsOCBAQAogICAgIGNoZWNrX3N5bWJvbHMoKSBpbiBvcmRlciB0byBwcm9wZXJseSB0ZXJtaW5hdGUgcnVubmluZyB3b3JrZXIgcHJvY2Vzc2VzLiIiIgogICAgIHNvdXJjZV9maWxlcyA9IFtdCiAgICAga2NvbmZpZ19maWxlcyA9IFtdCi0gICAgZGVmaW5lZF9mZWF0dXJlcyA9IFtdCi0gICAgcmVmZXJlbmNlZF9mZWF0dXJlcyA9IGRpY3QoKSAgIyB7ZmlsZTogW2ZlYXR1cmVzXX0KKyAgICBkZWZpbmVkX3N5bWJvbHMgPSBbXQorICAgIHJlZmVyZW5jZWRfc3ltYm9scyA9IGRpY3QoKSAgIyB7ZmlsZTogW3N5bWJvbHNdfQogCiAgICAgZm9yIGdpdGZpbGUgaW4gZ2V0X2ZpbGVzKCk6CiAgICAgICAgIGlmIFJFR0VYX0ZJTEVfS0NPTkZJRy5tYXRjaChnaXRmaWxlKToKQEAgLTMyNiw3NiArMzM3LDc1IEBACiAgICAgIyBwYXJzZSBzb3VyY2UgZmlsZXMKICAgICBhcmdsaXN0ID0gcGFydGl0aW9uKHNvdXJjZV9maWxlcywgY3B1X2NvdW50KCkpCiAgICAgZm9yIHJlcyBpbiBwb29sLm1hcChwYXJzZV9zb3VyY2VfZmlsZXMsIGFyZ2xpc3QpOgotICAgICAgICByZWZlcmVuY2VkX2ZlYXR1cmVzLnVwZGF0ZShyZXMpCi0KKyAgICAgICAgcmVmZXJlbmNlZF9zeW1ib2xzLnVwZGF0ZShyZXMpCiAKICAgICAjIHBhcnNlIGtjb25maWcgZmlsZXMKICAgICBhcmdsaXN0ID0gW10KICAgICBmb3IgcGFydCBpbiBwYXJ0aXRpb24oa2NvbmZpZ19maWxlcywgY3B1X2NvdW50KCkpOgogICAgICAgICBhcmdsaXN0LmFwcGVuZCgocGFydCwgaWdub3JlKSkKICAgICBmb3IgcmVzIGluIHBvb2wubWFwKHBhcnNlX2tjb25maWdfZmlsZXMsIGFyZ2xpc3QpOgotICAgICAgICBkZWZpbmVkX2ZlYXR1cmVzLmV4dGVuZChyZXNbMF0pCi0gICAgICAgIHJlZmVyZW5jZWRfZmVhdHVyZXMudXBkYXRlKHJlc1sxXSkKLSAgICBkZWZpbmVkX2ZlYXR1cmVzID0gc2V0KGRlZmluZWRfZmVhdHVyZXMpCisgICAgICAgIGRlZmluZWRfc3ltYm9scy5leHRlbmQocmVzWzBdKQorICAgICAgICByZWZlcmVuY2VkX3N5bWJvbHMudXBkYXRlKHJlc1sxXSkKKyAgICBkZWZpbmVkX3N5bWJvbHMgPSBzZXQoZGVmaW5lZF9zeW1ib2xzKQogCi0gICAgIyBpbnZlcnNlIG1hcHBpbmcgb2YgcmVmZXJlbmNlZF9mZWF0dXJlcyB0byBkaWN0KGZlYXR1cmU6IFtmaWxlc10pCisgICAgIyBpbnZlcnNlIG1hcHBpbmcgb2YgcmVmZXJlbmNlZF9zeW1ib2xzIHRvIGRpY3Qoc3ltYm9sOiBbZmlsZXNdKQogICAgIGludl9tYXAgPSBkaWN0KCkKLSAgICBmb3IgX2ZpbGUsIGZlYXR1cmVzIGluIHJlZmVyZW5jZWRfZmVhdHVyZXMuaXRlcml0ZW1zKCk6Ci0gICAgICAgIGZvciBmZWF0dXJlIGluIGZlYXR1cmVzOgotICAgICAgICAgICAgaW52X21hcFtmZWF0dXJlXSA9IGludl9tYXAuZ2V0KGZlYXR1cmUsIHNldCgpKQotICAgICAgICAgICAgaW52X21hcFtmZWF0dXJlXS5hZGQoX2ZpbGUpCi0gICAgcmVmZXJlbmNlZF9mZWF0dXJlcyA9IGludl9tYXAKKyAgICBmb3IgX2ZpbGUsIHN5bWJvbHMgaW4gcmVmZXJlbmNlZF9zeW1ib2xzLml0ZW1zKCk6CisgICAgICAgIGZvciBzeW1ib2wgaW4gc3ltYm9sczoKKyAgICAgICAgICAgIGludl9tYXBbc3ltYm9sXSA9IGludl9tYXAuZ2V0KHN5bWJvbCwgc2V0KCkpCisgICAgICAgICAgICBpbnZfbWFwW3N5bWJvbF0uYWRkKF9maWxlKQorICAgIHJlZmVyZW5jZWRfc3ltYm9scyA9IGludl9tYXAKIAotICAgIHVuZGVmaW5lZCA9IHt9ICAjIHtmZWF0dXJlOiBbZmlsZXNdfQotICAgIGZvciBmZWF0dXJlIGluIHNvcnRlZChyZWZlcmVuY2VkX2ZlYXR1cmVzKToKKyAgICB1bmRlZmluZWQgPSB7fSAgIyB7c3ltYm9sOiBbZmlsZXNdfQorICAgIGZvciBzeW1ib2wgaW4gc29ydGVkKHJlZmVyZW5jZWRfc3ltYm9scyk6CiAgICAgICAgICMgZmlsdGVyIHNvbWUgZmFsc2UgcG9zaXRpdmVzCi0gICAgICAgIGlmIGZlYXR1cmUgPT0gIkZPTyIgb3IgZmVhdHVyZSA9PSAiQkFSIiBvciBcCi0gICAgICAgICAgICAgICAgZmVhdHVyZSA9PSAiRk9PX0JBUiIgb3IgZmVhdHVyZSA9PSAiWFhYIjoKKyAgICAgICAgaWYgc3ltYm9sID09ICJGT08iIG9yIHN5bWJvbCA9PSAiQkFSIiBvciBcCisgICAgICAgICAgICAgICAgc3ltYm9sID09ICJGT09fQkFSIiBvciBzeW1ib2wgPT0gIlhYWCI6CiAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICBpZiBmZWF0dXJlIG5vdCBpbiBkZWZpbmVkX2ZlYXR1cmVzOgotICAgICAgICAgICAgaWYgZmVhdHVyZS5lbmRzd2l0aCgiX01PRFVMRSIpOgorICAgICAgICBpZiBzeW1ib2wgbm90IGluIGRlZmluZWRfc3ltYm9sczoKKyAgICAgICAgICAgIGlmIHN5bWJvbC5lbmRzd2l0aCgiX01PRFVMRSIpOgogICAgICAgICAgICAgICAgICMgYXZvaWQgZmFsc2UgcG9zaXRpdmVzIGZvciBrZXJuZWwgbW9kdWxlcwotICAgICAgICAgICAgICAgIGlmIGZlYXR1cmVbOi1sZW4oIl9NT0RVTEUiKV0gaW4gZGVmaW5lZF9mZWF0dXJlczoKKyAgICAgICAgICAgICAgICBpZiBzeW1ib2xbOi1sZW4oIl9NT0RVTEUiKV0gaW4gZGVmaW5lZF9zeW1ib2xzOgogICAgICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgdW5kZWZpbmVkW2ZlYXR1cmVdID0gcmVmZXJlbmNlZF9mZWF0dXJlcy5nZXQoZmVhdHVyZSkKLSAgICByZXR1cm4gdW5kZWZpbmVkLCBkZWZpbmVkX2ZlYXR1cmVzCisgICAgICAgICAgICB1bmRlZmluZWRbc3ltYm9sXSA9IHJlZmVyZW5jZWRfc3ltYm9scy5nZXQoc3ltYm9sKQorICAgIHJldHVybiB1bmRlZmluZWQsIGRlZmluZWRfc3ltYm9scwogCiAKIGRlZiBwYXJzZV9zb3VyY2VfZmlsZXMoc291cmNlX2ZpbGVzKToKICAgICAiIiJQYXJzZSBlYWNoIHNvdXJjZSBmaWxlIGluIEBzb3VyY2VfZmlsZXMgYW5kIHJldHVybiBkaWN0aW9uYXJ5IHdpdGggc291cmNlCiAgICAgZmlsZXMgYXMga2V5cyBhbmQgbGlzdHMgb2YgcmVmZXJlbmNlcyBLY29uZmlnIHN5bWJvbHMgYXMgdmFsdWVzLiIiIgotICAgIHJlZmVyZW5jZWRfZmVhdHVyZXMgPSBkaWN0KCkKKyAgICByZWZlcmVuY2VkX3N5bWJvbHMgPSBkaWN0KCkKICAgICBmb3Igc2ZpbGUgaW4gc291cmNlX2ZpbGVzOgotICAgICAgICByZWZlcmVuY2VkX2ZlYXR1cmVzW3NmaWxlXSA9IHBhcnNlX3NvdXJjZV9maWxlKHNmaWxlKQotICAgIHJldHVybiByZWZlcmVuY2VkX2ZlYXR1cmVzCisgICAgICAgIHJlZmVyZW5jZWRfc3ltYm9sc1tzZmlsZV0gPSBwYXJzZV9zb3VyY2VfZmlsZShzZmlsZSkKKyAgICByZXR1cm4gcmVmZXJlbmNlZF9zeW1ib2xzCiAKIAogZGVmIHBhcnNlX3NvdXJjZV9maWxlKHNmaWxlKToKLSAgICAiIiJQYXJzZSBAc2ZpbGUgYW5kIHJldHVybiBhIGxpc3Qgb2YgcmVmZXJlbmNlZCBLY29uZmlnIGZlYXR1cmVzLiIiIgorICAgICIiIlBhcnNlIEBzZmlsZSBhbmQgcmV0dXJuIGEgbGlzdCBvZiByZWZlcmVuY2VkIEtjb25maWcgc3ltYm9scy4iIiIKICAgICBsaW5lcyA9IFtdCiAgICAgcmVmZXJlbmNlcyA9IFtdCiAKICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2ZpbGUpOgogICAgICAgICByZXR1cm4gcmVmZXJlbmNlcwogCi0gICAgd2l0aCBvcGVuKHNmaWxlLCAiciIpIGFzIHN0cmVhbToKKyAgICB3aXRoIG9wZW4oc2ZpbGUsICJyIiwgZW5jb2Rpbmc9J3V0Zi04JywgZXJyb3JzPSdyZXBsYWNlJykgYXMgc3RyZWFtOgogICAgICAgICBsaW5lcyA9IHN0cmVhbS5yZWFkbGluZXMoKQogCiAgICAgZm9yIGxpbmUgaW4gbGluZXM6Ci0gICAgICAgIGlmIG5vdCAiQ09ORklHXyIgaW4gbGluZToKKyAgICAgICAgaWYgIkNPTkZJR18iIG5vdCBpbiBsaW5lOgogICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgZmVhdHVyZXMgPSBSRUdFWF9TT1VSQ0VfRkVBVFVSRS5maW5kYWxsKGxpbmUpCi0gICAgICAgIGZvciBmZWF0dXJlIGluIGZlYXR1cmVzOgotICAgICAgICAgICAgaWYgbm90IFJFR0VYX0ZJTFRFUl9GRUFUVVJFUy5zZWFyY2goZmVhdHVyZSk6CisgICAgICAgIHN5bWJvbHMgPSBSRUdFWF9TT1VSQ0VfU1lNQk9MLmZpbmRhbGwobGluZSkKKyAgICAgICAgZm9yIHN5bWJvbCBpbiBzeW1ib2xzOgorICAgICAgICAgICAgaWYgbm90IFJFR0VYX0ZJTFRFUl9TWU1CT0xTLnNlYXJjaChzeW1ib2wpOgogICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICByZWZlcmVuY2VzLmFwcGVuZChmZWF0dXJlKQorICAgICAgICAgICAgcmVmZXJlbmNlcy5hcHBlbmQoc3ltYm9sKQogCiAgICAgcmV0dXJuIHJlZmVyZW5jZXMKIAogCi1kZWYgZ2V0X2ZlYXR1cmVzX2luX2xpbmUobGluZSk6Ci0gICAgIiIiUmV0dXJuIG1lbnRpb25lZCBLY29uZmlnIGZlYXR1cmVzIGluIEBsaW5lLiIiIgotICAgIHJldHVybiBSRUdFWF9GRUFUVVJFLmZpbmRhbGwobGluZSkKK2RlZiBnZXRfc3ltYm9sc19pbl9saW5lKGxpbmUpOgorICAgICIiIlJldHVybiBtZW50aW9uZWQgS2NvbmZpZyBzeW1ib2xzIGluIEBsaW5lLiIiIgorICAgIHJldHVybiBSRUdFWF9TWU1CT0wuZmluZGFsbChsaW5lKQogCiAKIGRlZiBwYXJzZV9rY29uZmlnX2ZpbGVzKGFyZ3MpOgpAQCAtNDA0LDIxICs0MTQsMjEgQEAKICAgICBwYXR0ZXJuLiIiIgogICAgIGtjb25maWdfZmlsZXMgPSBhcmdzWzBdCiAgICAgaWdub3JlID0gYXJnc1sxXQotICAgIGRlZmluZWRfZmVhdHVyZXMgPSBbXQotICAgIHJlZmVyZW5jZWRfZmVhdHVyZXMgPSBkaWN0KCkKKyAgICBkZWZpbmVkX3N5bWJvbHMgPSBbXQorICAgIHJlZmVyZW5jZWRfc3ltYm9scyA9IGRpY3QoKQogCiAgICAgZm9yIGtmaWxlIGluIGtjb25maWdfZmlsZXM6CiAgICAgICAgIGRlZmluZWQsIHJlZmVyZW5jZXMgPSBwYXJzZV9rY29uZmlnX2ZpbGUoa2ZpbGUpCi0gICAgICAgIGRlZmluZWRfZmVhdHVyZXMuZXh0ZW5kKGRlZmluZWQpCisgICAgICAgIGRlZmluZWRfc3ltYm9scy5leHRlbmQoZGVmaW5lZCkKICAgICAgICAgaWYgaWdub3JlIGFuZCByZS5tYXRjaChpZ25vcmUsIGtmaWxlKToKICAgICAgICAgICAgICMgZG8gbm90IGNvbGxlY3QgcmVmZXJlbmNlcyBmb3IgZmlsZXMgdGhhdCBtYXRjaCB0aGUgaWdub3JlIHBhdHRlcm4KICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIHJlZmVyZW5jZWRfZmVhdHVyZXNba2ZpbGVdID0gcmVmZXJlbmNlcwotICAgIHJldHVybiAoZGVmaW5lZF9mZWF0dXJlcywgcmVmZXJlbmNlZF9mZWF0dXJlcykKKyAgICAgICAgcmVmZXJlbmNlZF9zeW1ib2xzW2tmaWxlXSA9IHJlZmVyZW5jZXMKKyAgICByZXR1cm4gKGRlZmluZWRfc3ltYm9scywgcmVmZXJlbmNlZF9zeW1ib2xzKQogCiAKIGRlZiBwYXJzZV9rY29uZmlnX2ZpbGUoa2ZpbGUpOgotICAgICIiIlBhcnNlIEBrZmlsZSBhbmQgdXBkYXRlIGZlYXR1cmUgZGVmaW5pdGlvbnMgYW5kIHJlZmVyZW5jZXMuIiIiCisgICAgIiIiUGFyc2UgQGtmaWxlIGFuZCB1cGRhdGUgc3ltYm9sIGRlZmluaXRpb25zIGFuZCByZWZlcmVuY2VzLiIiIgogICAgIGxpbmVzID0gW10KICAgICBkZWZpbmVkID0gW10KICAgICByZWZlcmVuY2VzID0gW10KQEAgLTQyNyw3ICs0MzcsNyBAQAogICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhrZmlsZSk6CiAgICAgICAgIHJldHVybiBkZWZpbmVkLCByZWZlcmVuY2VzCiAKLSAgICB3aXRoIG9wZW4oa2ZpbGUsICJyIikgYXMgc3RyZWFtOgorICAgIHdpdGggb3BlbihrZmlsZSwgInIiLCBlbmNvZGluZz0ndXRmLTgnLCBlcnJvcnM9J3JlcGxhY2UnKSBhcyBzdHJlYW06CiAgICAgICAgIGxpbmVzID0gc3RyZWFtLnJlYWRsaW5lcygpCiAKICAgICBmb3IgaSBpbiByYW5nZShsZW4obGluZXMpKToKQEAgLTQzNiw4ICs0NDYsOCBAQAogICAgICAgICBsaW5lID0gbGluZS5zcGxpdCgiIyIpWzBdICAjIGlnbm9yZSBjb21tZW50cwogCiAgICAgICAgIGlmIFJFR0VYX0tDT05GSUdfREVGLm1hdGNoKGxpbmUpOgotICAgICAgICAgICAgZmVhdHVyZV9kZWYgPSBSRUdFWF9LQ09ORklHX0RFRi5maW5kYWxsKGxpbmUpCi0gICAgICAgICAgICBkZWZpbmVkLmFwcGVuZChmZWF0dXJlX2RlZlswXSkKKyAgICAgICAgICAgIHN5bWJvbF9kZWYgPSBSRUdFWF9LQ09ORklHX0RFRi5maW5kYWxsKGxpbmUpCisgICAgICAgICAgICBkZWZpbmVkLmFwcGVuZChzeW1ib2xfZGVmWzBdKQogICAgICAgICAgICAgc2tpcCA9IEZhbHNlCiAgICAgICAgIGVsaWYgUkVHRVhfS0NPTkZJR19IRUxQLm1hdGNoKGxpbmUpOgogICAgICAgICAgICAgc2tpcCA9IFRydWUKQEAgLTQ0NiwxOCArNDU2LDE4IEBACiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGVsaWYgUkVHRVhfS0NPTkZJR19TVE1ULm1hdGNoKGxpbmUpOgogICAgICAgICAgICAgbGluZSA9IFJFR0VYX1FVT1RFUy5zdWIoIiIsIGxpbmUpCi0gICAgICAgICAgICBmZWF0dXJlcyA9IGdldF9mZWF0dXJlc19pbl9saW5lKGxpbmUpCisgICAgICAgICAgICBzeW1ib2xzID0gZ2V0X3N5bWJvbHNfaW5fbGluZShsaW5lKQogICAgICAgICAgICAgIyBtdWx0aS1saW5lIHN0YXRlbWVudHMKICAgICAgICAgICAgIHdoaWxlIGxpbmUuZW5kc3dpdGgoIlxcIik6CiAgICAgICAgICAgICAgICAgaSArPSAxCiAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVzW2ldCiAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoJ1xuJykKLSAgICAgICAgICAgICAgICBmZWF0dXJlcy5leHRlbmQoZ2V0X2ZlYXR1cmVzX2luX2xpbmUobGluZSkpCi0gICAgICAgICAgICBmb3IgZmVhdHVyZSBpbiBzZXQoZmVhdHVyZXMpOgotICAgICAgICAgICAgICAgIGlmIFJFR0VYX05VTUVSSUMubWF0Y2goZmVhdHVyZSk6CisgICAgICAgICAgICAgICAgc3ltYm9scy5leHRlbmQoZ2V0X3N5bWJvbHNfaW5fbGluZShsaW5lKSkKKyAgICAgICAgICAgIGZvciBzeW1ib2wgaW4gc2V0KHN5bWJvbHMpOgorICAgICAgICAgICAgICAgIGlmIFJFR0VYX05VTUVSSUMubWF0Y2goc3ltYm9sKToKICAgICAgICAgICAgICAgICAgICAgIyBpZ25vcmUgbnVtZXJpYyB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgICAgICByZWZlcmVuY2VzLmFwcGVuZChmZWF0dXJlKQorICAgICAgICAgICAgICAgIHJlZmVyZW5jZXMuYXBwZW5kKHN5bWJvbCkKIAogICAgIHJldHVybiBkZWZpbmVkLCByZWZlcmVuY2VzCiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvY2hlY2twYXRjaC5wbCBiL3NjcmlwdHMvY2hlY2twYXRjaC5wbAppbmRleCA0ZGUzY2M0Li4yMDZhNmIzIDEwMDc1NQotLS0gYS9zY3JpcHRzL2NoZWNrcGF0Y2gucGwKKysrIGIvc2NyaXB0cy9jaGVja3BhdGNoLnBsCkBAIC0zNTcwLDE1ICszNTcwLDYgQEAKIAkJCX0KIAkJfQogCi0jIGNoZWNrIGZvciB1c2VzIG9mIERFRklORV9QQ0lfREVWSUNFX1RBQkxFCi0JCWlmICgkbGluZSA9fiAvXGJERUZJTkVfUENJX0RFVklDRV9UQUJMRVxzKlwoXHMqKFx3KylccypcKVxzKj0vKSB7Ci0JCQlpZiAoV0FSTigiREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUiLAotCQkJCSAiUHJlZmVyIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG92ZXIgZGVwcmVjYXRlZCBERUZJTkVfUENJX0RFVklDRV9UQUJMRVxuIiAuICRoZXJlY3VycikgJiYKLQkJCSAgICAkZml4KSB7Ci0JCQkJJGZpeGVkWyRmaXhsaW5lbnJdID1+IHMvXGIoPzpzdGF0aWNccyt8KURFRklORV9QQ0lfREVWSUNFX1RBQkxFXHMqXChccyooXHcrKVxzKlwpXHMqPVxzKi9zdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgJDFcW1xdID0gLzsKLQkJCX0KLQkJfQotCiAjIGNoZWNrIGZvciBuZXcgdHlwZWRlZnMsIG9ubHkgZnVuY3Rpb24gcGFyYW1ldGVycyBhbmQgc3BhcnNlIGFubm90YXRpb25zCiAjIG1ha2Ugc2Vuc2UuCiAJCWlmICgkbGluZSA9fiAvXGJ0eXBlZGVmXHMvICYmCmRpZmYgLS1naXQgYS9zY3JpcHRzL2ZhZGRyMmxpbmUgYi9zY3JpcHRzL2ZhZGRyMmxpbmUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDUwYjMzMgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZmFkZHIybGluZQpAQCAtMCwwICsxLDE3NyBAQAorIyEvYmluL2Jhc2gKKyMKKyMgVHJhbnNsYXRlIHN0YWNrIGR1bXAgZnVuY3Rpb24gb2Zmc2V0cy4KKyMKKyMgYWRkcjJsaW5lIGRvZXNuJ3Qgd29yayB3aXRoIEtBU0xSIGFkZHJlc3Nlcy4gIFRoaXMgd29ya3Mgc2ltaWxhcmx5IHRvCisjIGFkZHIybGluZSwgYnV0IGluc3RlYWQgdGFrZXMgdGhlICdmdW5jKzB4MTIzJyBmb3JtYXQgYXMgaW5wdXQ6CisjCisjICAgJCAuL3NjcmlwdHMvZmFkZHIybGluZSB+L2svdm1saW51eCBtZW1pbmZvX3Byb2Nfc2hvdysweDUvMHg1NjgKKyMgICBtZW1pbmZvX3Byb2Nfc2hvdysweDUvMHg1Njg6CisjICAgbWVtaW5mb19wcm9jX3Nob3cgYXQgZnMvcHJvYy9tZW1pbmZvLmM6MjcKKyMKKyMgSWYgdGhlIGFkZHJlc3MgaXMgcGFydCBvZiBhbiBpbmxpbmVkIGZ1bmN0aW9uLCB0aGUgZnVsbCBpbmxpbmUgY2FsbCBjaGFpbiBpcworIyBwcmludGVkOgorIworIyAgICQgLi9zY3JpcHRzL2ZhZGRyMmxpbmUgfi9rL3ZtbGludXggbmF0aXZlX3dyaXRlX21zcisweDYvMHgyNworIyAgIG5hdGl2ZV93cml0ZV9tc3IrMHg2LzB4Mjc6CisjICAgYXJjaF9zdGF0aWNfYnJhbmNoIGF0IGFyY2gveDg2L2luY2x1ZGUvYXNtL21zci5oOjEyMQorIyAgICAoaW5saW5lZCBieSkgc3RhdGljX2tleV9mYWxzZSBhdCBpbmNsdWRlL2xpbnV4L2p1bXBfbGFiZWwuaDoxMjUKKyMgICAgKGlubGluZWQgYnkpIG5hdGl2ZV93cml0ZV9tc3IgYXQgYXJjaC94ODYvaW5jbHVkZS9hc20vbXNyLmg6MTI1CisjCisjIFRoZSBmdW5jdGlvbiBzaXplIGFmdGVyIHRoZSAnLycgaW4gdGhlIGlucHV0IGlzIG9wdGlvbmFsLCBidXQgcmVjb21tZW5kZWQuCisjIEl0J3MgdXNlZCB0byBoZWxwIGRpc2FtYmlndWF0ZSBhbnkgZHVwbGljYXRlIHN5bWJvbCBuYW1lcywgd2hpY2ggY2FuIG9jY3VyCisjIHJhcmVseS4gIElmIHRoZSBzaXplIGlzIG9taXR0ZWQgZm9yIGEgZHVwbGljYXRlIHN5bWJvbCB0aGVuIGl0J3MgcG9zc2libGUgZm9yCisjIG11bHRpcGxlIGNvZGUgc2l0ZXMgdG8gYmUgcHJpbnRlZDoKKyMKKyMgICAkIC4vc2NyaXB0cy9mYWRkcjJsaW5lIH4vay92bWxpbnV4IHJhd19pb2N0bCsweDUKKyMgICByYXdfaW9jdGwrMHg1LzB4MjA6CisjICAgcmF3X2lvY3RsIGF0IGRyaXZlcnMvY2hhci9yYXcuYzoxMjIKKyMKKyMgICByYXdfaW9jdGwrMHg1LzB4YjE6CisjICAgcmF3X2lvY3RsIGF0IG5ldC9pcHY0L3Jhdy5jOjg3NgorIworIyBNdWx0aXBsZSBhZGRyZXNzZXMgY2FuIGJlIHNwZWNpZmllZCBvbiBhIHNpbmdsZSBjb21tYW5kIGxpbmU6CisjCisjICAgJCAuL3NjcmlwdHMvZmFkZHIybGluZSB+L2svdm1saW51eCB0eXBlX3Nob3crMHgxMC80NSBmcmVlX3Jlc2VydmVkX2FyZWErMHg5MAorIyAgIHR5cGVfc2hvdysweDEwLzB4MmQ6CisjICAgdHlwZV9zaG93IGF0IGRyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2JhY2tsaWdodC5jOjIxMworIworIyAgIGZyZWVfcmVzZXJ2ZWRfYXJlYSsweDkwLzB4MTIzOgorIyAgIGZyZWVfcmVzZXJ2ZWRfYXJlYSBhdCBtbS9wYWdlX2FsbG9jLmM6NjQyOSAoZGlzY3JpbWluYXRvciAyKQorCisKK3NldCAtbyBlcnJleGl0CitzZXQgLW8gbm91bnNldAorCitjb21tYW5kIC12IGF3ayA+L2Rldi9udWxsIDI+JjEgfHwgZGllICJhd2sgaXNuJ3QgaW5zdGFsbGVkIgorY29tbWFuZCAtdiByZWFkZWxmID4vZGV2L251bGwgMj4mMSB8fCBkaWUgInJlYWRlbGYgaXNuJ3QgaW5zdGFsbGVkIgorY29tbWFuZCAtdiBhZGRyMmxpbmUgPi9kZXYvbnVsbCAyPiYxIHx8IGRpZSAiYWRkcjJsaW5lIGlzbid0IGluc3RhbGxlZCIKKwordXNhZ2UoKSB7CisJZWNobyAidXNhZ2U6IGZhZGRyMmxpbmUgPG9iamVjdCBmaWxlPiA8ZnVuYytvZmZzZXQ+IDxmdW5jK29mZnNldD4uLi4iID4mMgorCWV4aXQgMQorfQorCit3YXJuKCkgeworCWVjaG8gIiQxIiA+JjIKK30KKworZGllKCkgeworCWVjaG8gIkVSUk9SOiAkMSIgPiYyCisJZXhpdCAxCit9CisKKyMgVHJ5IHRvIGZpZ3VyZSBvdXQgdGhlIHNvdXJjZSBkaXJlY3RvcnkgcHJlZml4IHNvIHdlIGNhbiByZW1vdmUgaXQgZnJvbSB0aGUKKyMgYWRkcjJsaW5lIG91dHB1dC4gIEhBQ0sgQUxFUlQ6IFRoaXMgYXNzdW1lcyB0aGF0IHN0YXJ0X2tlcm5lbCgpIGlzIGluCisjIGtlcm5lbC9pbml0LmMhICBUaGlzIG9ubHkgd29ya3MgZm9yIHZtbGludXguICBPdGhlcndpc2UgaXQgZmFsbHMgYmFjayB0bworIyBwcmludGluZyB0aGUgYWJzb2x1dGUgcGF0aC4KK2ZpbmRfZGlyX3ByZWZpeCgpIHsKKwlsb2NhbCBvYmpmaWxlPSQxCisKKwlsb2NhbCBzdGFydF9rZXJuZWxfYWRkcj0kKHJlYWRlbGYgLXNXICRvYmpmaWxlIHwgYXdrICckOCA9PSAic3RhcnRfa2VybmVsIiB7cHJpbnRmICIweCVzIiwgJDJ9JykKKwlbWyAteiAkc3RhcnRfa2VybmVsX2FkZHIgXV0gJiYgcmV0dXJuCisKKwlsb2NhbCBmaWxlX2xpbmU9JChhZGRyMmxpbmUgLWUgJG9iamZpbGUgJHN0YXJ0X2tlcm5lbF9hZGRyKQorCVtbIC16ICRmaWxlX2xpbmUgXV0gJiYgcmV0dXJuCisKKwlsb2NhbCBwcmVmaXg9JHtmaWxlX2xpbmUlaW5pdC9tYWluLmM6Kn0KKwlpZiBbWyAteiAkcHJlZml4IF1dIHx8IFtbICRwcmVmaXggPSAkZmlsZV9saW5lIF1dOyB0aGVuCisJCXJldHVybgorCWZpCisKKwlESVJfUFJFRklYPSRwcmVmaXgKKwlyZXR1cm4gMAorfQorCitfX2ZhZGRyMmxpbmUoKSB7CisJbG9jYWwgb2JqZmlsZT0kMQorCWxvY2FsIGZ1bmNfYWRkcj0kMgorCWxvY2FsIGRpcl9wcmVmaXg9JDMKKwlsb2NhbCBwcmludF93YXJuaW5ncz0kNAorCisJbG9jYWwgZnVuYz0ke2Z1bmNfYWRkciUrKn0KKwlsb2NhbCBvZmZzZXQ9JHtmdW5jX2FkZHIjKit9CisJb2Zmc2V0PSR7b2Zmc2V0JS8qfQorCWxvY2FsIHNpemU9CisJW1sgJGZ1bmNfYWRkciA9fiAiLyIgXV0gJiYgc2l6ZT0ke2Z1bmNfYWRkciMqL30KKworCWlmIFtbIC16ICRmdW5jIF1dIHx8IFtbIC16ICRvZmZzZXQgXV0gfHwgW1sgJGZ1bmMgPSAkZnVuY19hZGRyIF1dOyB0aGVuCisJCXdhcm4gImJhZCBmdW5jK29mZnNldCAkZnVuY19hZGRyIgorCQlET05FPTEKKwkJcmV0dXJuCisJZmkKKworCSMgR28gdGhyb3VnaCBlYWNoIG9mIHRoZSBvYmplY3QncyBzeW1ib2xzIHdoaWNoIG1hdGNoIHRoZSBmdW5jIG5hbWUuCisJIyBJbiByYXJlIGNhc2VzIHRoZXJlIG1pZ2h0IGJlIGR1cGxpY2F0ZXMuCisJd2hpbGUgcmVhZCBzeW1ib2w7IGRvCisJCWxvY2FsIGZpZWxkcz0oJHN5bWJvbCkKKwkJbG9jYWwgc3ltX2Jhc2U9MHgke2ZpZWxkc1sxXX0KKwkJbG9jYWwgc3ltX3NpemU9JHtmaWVsZHNbMl19CisJCWxvY2FsIHN5bV90eXBlPSR7ZmllbGRzWzNdfQorCisJCSMgY2FsY3VsYXRlIHRoZSBhZGRyZXNzCisJCWxvY2FsIGFkZHI9JCgoJHN5bV9iYXNlICsgJG9mZnNldCkpCisJCWlmIFtbIC16ICRhZGRyIF1dIHx8IFtbICRhZGRyID0gMCBdXTsgdGhlbgorCQkJd2FybiAiYmFkIGFkZHJlc3M6ICRzeW1fYmFzZSArICRvZmZzZXQiCisJCQlET05FPTEKKwkJCXJldHVybgorCQlmaQorCQlsb2NhbCBoZXhhZGRyPTB4JChwcmludGYgJXggJGFkZHIpCisKKwkJIyB3ZWVkIG91dCBub24tZnVuY3Rpb24gc3ltYm9scworCQlpZiBbWyAkc3ltX3R5cGUgIT0gIkZVTkMiIF1dOyB0aGVuCisJCQlbWyAkcHJpbnRfd2FybmluZ3MgPSAxIF1dICYmCisJCQkJZWNobyAic2tpcHBpbmcgJGZ1bmMgYWRkcmVzcyBhdCAkaGV4YWRkciBkdWUgdG8gbm9uLWZ1bmN0aW9uIHN5bWJvbCIKKwkJCWNvbnRpbnVlCisJCWZpCisKKwkJIyBpZiB0aGUgdXNlciBwcm92aWRlZCBhIHNpemUsIG1ha2Ugc3VyZSBpdCBtYXRjaGVzIHRoZSBzeW1ib2wncyBzaXplCisJCWlmIFtbIC1uICRzaXplIF1dICYmIFtbICRzaXplIC1uZSAkc3ltX3NpemUgXV07IHRoZW4KKwkJCVtbICRwcmludF93YXJuaW5ncyA9IDEgXV0gJiYKKwkJCQllY2hvICJza2lwcGluZyAkZnVuYyBhZGRyZXNzIGF0ICRoZXhhZGRyIGR1ZSB0byBzaXplIG1pc21hdGNoICgkc2l6ZSAhPSAkc3ltX3NpemUpIgorCQkJY29udGludWU7CisJCWZpCisKKwkJIyBtYWtlIHN1cmUgdGhlIHByb3ZpZGVkIG9mZnNldCBpcyB3aXRoaW4gdGhlIHN5bWJvbCdzIHJhbmdlCisJCWlmIFtbICRvZmZzZXQgLWd0ICRzeW1fc2l6ZSBdXTsgdGhlbgorCQkJW1sgJHByaW50X3dhcm5pbmdzID0gMSBdXSAmJgorCQkJCWVjaG8gInNraXBwaW5nICRmdW5jIGFkZHJlc3MgYXQgJGhleGFkZHIgZHVlIHRvIHNpemUgbWlzbWF0Y2ggKCRvZmZzZXQgPiAkc3ltX3NpemUpIgorCQkJY29udGludWUKKwkJZmkKKworCQkjIHNlcGFyYXRlIG11bHRpcGxlIGVudHJpZXMgd2l0aCBhIGJsYW5rIGxpbmUKKwkJW1sgJEZJUlNUID0gMCBdXSAmJiBlY2hvCisJCUZJUlNUPTAKKworCQlsb2NhbCBoZXhzaXplPTB4JChwcmludGYgJXggJHN5bV9zaXplKQorCQllY2hvICIkZnVuYyskb2Zmc2V0LyRoZXhzaXplOiIKKwkJYWRkcjJsaW5lIC1mcGllICRvYmpmaWxlICRoZXhhZGRyIHwgc2VkICJzOyAkZGlyX3ByZWZpeFwoXC4vXCkqOyA7IgorCQlET05FPTEKKworCWRvbmUgPCA8KHJlYWRlbGYgLXNXICRvYmpmaWxlIHwgYXdrIC12IGY9JGZ1bmMgJyQ4ID09IGYge3ByaW50fScpCit9CisKK1tbICQjIC1sdCAyIF1dICYmIHVzYWdlCisKK29iamZpbGU9JDEKK1tbICEgLWYgJG9iamZpbGUgXV0gJiYgZGllICJjYW4ndCBmaW5kIG9iamZpbGUgJG9iamZpbGUiCitzaGlmdAorCitESVJfUFJFRklYPXN1cGVyY2FsaWZyYWdpbGlzdGljZXhwaWFsaWRvY2lvdXMKK2ZpbmRfZGlyX3ByZWZpeCAkb2JqZmlsZQorCitGSVJTVD0xCit3aGlsZSBbWyAkIyAtZ3QgMCBdXTsgZG8KKwlmdW5jX2FkZHI9JDEKKwlzaGlmdAorCisJIyBwcmludCBhbnkgbWF0Y2hlcyBmb3VuZAorCURPTkU9MAorCV9fZmFkZHIybGluZSAkb2JqZmlsZSAkZnVuY19hZGRyICRESVJfUFJFRklYIDAKKworCSMgaWYgbm8gbWF0Y2ggd2FzIGZvdW5kLCBwcmludCB3YXJuaW5ncworCWlmIFtbICRET05FID0gMCBdXTsgdGhlbgorCQlfX2ZhZGRyMmxpbmUgJG9iamZpbGUgJGZ1bmNfYWRkciAkRElSX1BSRUZJWCAxCisJCXdhcm4gIm5vIG1hdGNoIGZvciAkZnVuY19hZGRyIgorCWZpCitkb25lCmRpZmYgLS1naXQgYS9zY3JpcHRzL2dldF9tYWludGFpbmVyLnBsIGIvc2NyaXB0cy9nZXRfbWFpbnRhaW5lci5wbAppbmRleCA0OWEwMGQ1Li5hZWQ0NTExIDEwMDc1NQotLS0gYS9zY3JpcHRzL2dldF9tYWludGFpbmVyLnBsCisrKyBiL3NjcmlwdHMvZ2V0X21haW50YWluZXIucGwKQEAgLTIxMzYsOSArMjEzNiwxMSBAQAogCiAgICAgbXkgJGNtZCA9ICRWQ1NfY21kc3siZmlsZV9leGlzdHNfY21kIn07CiAgICAgJGNtZCA9fiBzLyhcJFx3KykvJDEvZWVnOwkJIyBpbnRlcnBvbGF0ZSAkY21kCi0KKyAgICAkY21kIC49ICIgMj4mMSI7CiAgICAgJGV4aXN0cyA9ICZ7JFZDU19jbWRzeyJleGVjdXRlX2NtZCJ9fSgkY21kKTsKIAorICAgIHJldHVybiAwIGlmICgkPyAhPSAwKTsKKwogICAgIHJldHVybiAkZXhpc3RzOwogfQogCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tlcm5lbC1kb2MgYi9zY3JpcHRzL2tlcm5lbC1kb2MKaW5kZXggNGYyZTkwNC4uOTM3MjFmMyAxMDA3NTUKLS0tIGEvc2NyaXB0cy9rZXJuZWwtZG9jCisrKyBiL3NjcmlwdHMva2VybmVsLWRvYwpAQCAtMjEyLDYgKzIxMiw3IEBACiBteSAkdHlwZV9jb25zdGFudCA9ICdcJShbLV9cd10rKSc7CiBteSAkdHlwZV9mdW5jID0gJyhcdyspXChcKSc7CiBteSAkdHlwZV9wYXJhbSA9ICdcQChcdyspJzsKK215ICR0eXBlX2ZwX3BhcmFtID0gJ1xAKFx3KylcKFwpJzsgICMgU3BlY2lhbCBSU1QgaGFuZGxpbmcgZm9yIGZ1bmMgcHRyIHBhcmFtcwogbXkgJHR5cGVfc3RydWN0ID0gJ1wmKChzdHJ1Y3RccyopKltfXHddKyknOwogbXkgJHR5cGVfc3RydWN0X3htbCA9ICdcXCZhbXA7KChzdHJ1Y3RccyopKltfXHddKyknOwogbXkgJHR5cGVfZW52ID0gJyhcJFx3KyknOwpAQCAtMjkyLDYgKzI5Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICMgTm90ZTogbmVlZCB0byBlc2NhcGUgKCkgdG8gYXZvaWQgZnVuYyBtYXRjaGluZyBsYXRlcgogICAgICAgICAgICAgICAgICAgICAgICBbJHR5cGVfbWVtYmVyX2Z1bmMsICJcXDpjXFw6dHlwZVxcOmBcJDFcJDJcXFxcKFxcXFwpIDxcJDE+YCJdLAogICAgICAgICAgICAgICAgICAgICAgICBbJHR5cGVfbWVtYmVyLCAiXFw6Y1xcOnR5cGVcXDpgXCQxXCQyIDxcJDE+YCJdLAorCQkgICAgICAgWyR0eXBlX2ZwX3BhcmFtLCAiKipcJDFcXFxcKFxcXFwpKioiXSwKICAgICAgICAgICAgICAgICAgICAgICAgWyR0eXBlX2Z1bmMsICJcXDpjXFw6ZnVuY1xcOmBcJDEoKWAiXSwKICAgICAgICAgICAgICAgICAgICAgICAgWyR0eXBlX3N0cnVjdF9mdWxsLCAiXFw6Y1xcOnR5cGVcXDpgXCQxIFwkMiA8XCQyPmAiXSwKICAgICAgICAgICAgICAgICAgICAgICAgWyR0eXBlX2VudW1fZnVsbCwgIlxcOmNcXDp0eXBlXFw6YFwkMSBcJDIgPFwkMj5gIl0sCkBAIC00MTIsNyArNDE0LDcgQEAKIG15ICRkb2NfZGVjbCA9ICRkb2NfY29tIC4gJyhcdyspJzsKICMgQHBhcmFtcyBhbmQgYSBzdHJpY3RseSBsaW1pdGVkIHNldCBvZiBzdXBwb3J0ZWQgc2VjdGlvbiBuYW1lcwogbXkgJGRvY19zZWN0ID0gJGRvY19jb20gLiAKLSAgICAnXHMqKFxAXHcrfGRlc2NyaXB0aW9ufGNvbnRleHR8cmV0dXJucz98bm90ZXM/fGV4YW1wbGVzPylccyo6KC4qKSc7CisgICAgJ1xzKihcQFsuXHddK3xcQFwuXC5cLnxkZXNjcmlwdGlvbnxjb250ZXh0fHJldHVybnM/fG5vdGVzP3xleGFtcGxlcz8pXHMqOiguKiknOwogbXkgJGRvY19jb250ZW50ID0gJGRvY19jb21fYm9keSAuICcoLiopJzsKIG15ICRkb2NfYmxvY2sgPSAkZG9jX2NvbSAuICdET0M6XHMqKC4qKT8nOwogbXkgJGRvY19pbmxpbmVfc3RhcnQgPSAnXlxzKi9cKlwqXHMqJCc7CkBAIC0xODMxLDEzICsxODMzLDIyIEBACiAgICAgbXkgJWFyZ3MgPSAleyRfWzBdfTsKICAgICBteSAoJHBhcmFtZXRlciwgJHNlY3Rpb24pOwogICAgIG15ICRvbGRwcmVmaXggPSAkbGluZXByZWZpeDsKLSAgICBteSAkc3RhcnQ7CisgICAgbXkgJHN0YXJ0ID0gIiI7CiAKLSAgICBwcmludCAiLi4gYzpmdW5jdGlvbjo6ICI7Ci0gICAgaWYgKCRhcmdzeydmdW5jdGlvbnR5cGUnfSBuZSAiIikgewotCSRzdGFydCA9ICRhcmdzeydmdW5jdGlvbnR5cGUnfSAuICIgIiAuICRhcmdzeydmdW5jdGlvbid9IC4gIiAoIjsKKyAgICBpZiAoJGFyZ3N7J3R5cGVkZWYnfSkgeworCXByaW50ICIuLiBjOnR5cGU6OiAiLiAkYXJnc3snZnVuY3Rpb24nfSAuICJcblxuIjsKKwlwcmludF9saW5lbm8oJGRlY2xhcmF0aW9uX3N0YXJ0X2xpbmUpOworCXByaW50ICIgICAqKlR5cGVkZWYqKjogIjsKKwkkbGluZXByZWZpeCA9ICIiOworCW91dHB1dF9oaWdobGlnaHRfcnN0KCRhcmdzeydwdXJwb3NlJ30pOworCSRzdGFydCA9ICJcblxuKipTeW50YXgqKlxuXG4gIGBgIjsKICAgICB9IGVsc2UgewotCSRzdGFydCA9ICRhcmdzeydmdW5jdGlvbid9IC4gIiAoIjsKKwlwcmludCAiLi4gYzpmdW5jdGlvbjo6ICI7CisgICAgfQorICAgIGlmICgkYXJnc3snZnVuY3Rpb250eXBlJ30gbmUgIiIpIHsKKwkkc3RhcnQgLj0gJGFyZ3N7J2Z1bmN0aW9udHlwZSd9IC4gIiAiIC4gJGFyZ3N7J2Z1bmN0aW9uJ30gLiAiICgiOworICAgIH0gZWxzZSB7CisJJHN0YXJ0IC49ICRhcmdzeydmdW5jdGlvbid9IC4gIiAoIjsKICAgICB9CiAgICAgcHJpbnQgJHN0YXJ0OwogCkBAIC0xODQ5LDkgKzE4NjAsNiBAQAogCSRjb3VudCsrOwogCSR0eXBlID0gJGFyZ3N7J3BhcmFtZXRlcnR5cGVzJ317JHBhcmFtZXRlcn07CiAKLQkjIFJTVCBkb2Vzbid0IGxpa2UgYWRkcmVzc19zcGFjZSB0YWdzIGF0IGZ1bmN0aW9uIHByb3RvdHlwZXMKLQkkdHlwZSA9fiBzL19fKHVzZXJ8a2VybmVsfGlvbWVtfHBlcmNwdXxwbWVtfHJjdSlccyovLzsKLQogCWlmICgkdHlwZSA9fiBtLyhbXlwoXSpcKFwqKVxzKlwpXHMqXCgoW15cKV0qKVwpLykgewogCSAgICAjIHBvaW50ZXItdG8tZnVuY3Rpb24KIAkgICAgcHJpbnQgJDEgLiAkcGFyYW1ldGVyIC4gIikgKCIgLiAkMjsKQEAgLTE4NTksMTEgKzE4NjcsMTUgQEAKIAkgICAgcHJpbnQgJHR5cGUgLiAiICIgLiAkcGFyYW1ldGVyOwogCX0KICAgICB9Ci0gICAgcHJpbnQgIilcblxuIjsKLSAgICBwcmludF9saW5lbm8oJGRlY2xhcmF0aW9uX3N0YXJ0X2xpbmUpOwotICAgICRsaW5lcHJlZml4ID0gIiAgICI7Ci0gICAgb3V0cHV0X2hpZ2hsaWdodF9yc3QoJGFyZ3N7J3B1cnBvc2UnfSk7Ci0gICAgcHJpbnQgIlxuIjsKKyAgICBpZiAoJGFyZ3N7J3R5cGVkZWYnfSkgeworCXByaW50ICIpO2BgXG5cbiI7CisgICAgfSBlbHNlIHsKKwlwcmludCAiKVxuXG4iOworCXByaW50X2xpbmVubygkZGVjbGFyYXRpb25fc3RhcnRfbGluZSk7CisJJGxpbmVwcmVmaXggPSAiICAgIjsKKwlvdXRwdXRfaGlnaGxpZ2h0X3JzdCgkYXJnc3sncHVycG9zZSd9KTsKKwlwcmludCAiXG4iOworICAgIH0KIAogICAgIHByaW50ICIqKlBhcmFtZXRlcnMqKlxuXG4iOwogICAgICRsaW5lcHJlZml4ID0gIiAgIjsKQEAgLTIwMDMsNyArMjAxNSw3IEBACiAJKCRhcmdzeydwYXJhbWV0ZXJkZXNjcyd9eyRwYXJhbWV0ZXJfbmFtZX0gbmUgJHVuZGVzY3JpYmVkKSB8fCBuZXh0OwogCSR0eXBlID0gJGFyZ3N7J3BhcmFtZXRlcnR5cGVzJ317JHBhcmFtZXRlcn07CiAgICAgICAgIHByaW50X2xpbmVubygkcGFyYW1ldGVyZGVzY19zdGFydF9saW5lc3skcGFyYW1ldGVyX25hbWV9KTsKLQlwcmludCAiYGAkdHlwZSAkcGFyYW1ldGVyYGBcbiI7CisJcHJpbnQgImBgIiAuICRwYXJhbWV0ZXIgLiAiYGBcbiI7CiAJb3V0cHV0X2hpZ2hsaWdodF9yc3QoJGFyZ3N7J3BhcmFtZXRlcmRlc2NzJ317JHBhcmFtZXRlcl9uYW1lfSk7CiAJcHJpbnQgIlxuIjsKICAgICB9CkBAIC0yMTkzLDcgKzIyMDUsOSBAQAogICAgICR4ID1+IHNAL1wqLio/XCovQEBnb3M7CSMgc3RyaXAgY29tbWVudHMuCiAKICAgICAjIFBhcnNlIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAgICBpZiAoJHggPX4gL3R5cGVkZWZccysoXHcrKVxzKlwoXCpccyooXHdcUyspXHMqXClccypcKCguKilcKTsvKSB7CisgICAgaWYgKCR4ID1+IC90eXBlZGVmXHMrKFx3KylccypcKFwqXHMqKFx3XFMrKVxzKlwpXHMqXCgoLiopXCk7LyB8fAorCSR4ID1+IC90eXBlZGVmXHMrKFx3KylccyooXHdcUyspXHMqXHMqXCgoLiopXCk7LykgeworCiAJIyBGdW5jdGlvbiB0eXBlZGVmcwogCSRyZXR1cm5fdHlwZSA9ICQxOwogCSRkZWNsYXJhdGlvbl9uYW1lID0gJDI7CkBAIC0yMjA0LDYgKzIyMTgsNyBAQAogCW91dHB1dF9kZWNsYXJhdGlvbigkZGVjbGFyYXRpb25fbmFtZSwKIAkJCSAgICdmdW5jdGlvbicsCiAJCQkgICB7J2Z1bmN0aW9uJyA9PiAkZGVjbGFyYXRpb25fbmFtZSwKKwkJCSAgICAndHlwZWRlZicgPT4gMSwKIAkJCSAgICAnbW9kdWxlJyA9PiAkbW9kdWxlbmFtZSwKIAkJCSAgICAnZnVuY3Rpb250eXBlJyA9PiAkcmV0dXJuX3R5cGUsCiAJCQkgICAgJ3BhcmFtZXRlcmxpc3QnID0+IFxAcGFyYW1ldGVybGlzdCwKQEAgLTIzMzgsNiArMjM1Myw3IEBACiAKIAlpZiAoJHR5cGUgZXEgIiIgJiYgJHBhcmFtID1+IC9cLlwuXC4kLykKIAl7CisJICAgICRwYXJhbSA9ICIuLi4iOwogCSAgICBpZiAoIWRlZmluZWQgJHBhcmFtZXRlcmRlc2NzeyRwYXJhbX0gfHwgJHBhcmFtZXRlcmRlc2NzeyRwYXJhbX0gZXEgIiIpIHsKIAkJJHBhcmFtZXRlcmRlc2NzeyRwYXJhbX0gPSAidmFyaWFibGUgYXJndW1lbnRzIjsKIAkgICAgfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wYWNrYWdlL2J1aWxkZGViIGIvc2NyaXB0cy9wYWNrYWdlL2J1aWxkZGViCmluZGV4IGUxYzA5ZTIuLjhlYTlmZDIgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvcGFja2FnZS9idWlsZGRlYgorKysgYi9zY3JpcHRzL3BhY2thZ2UvYnVpbGRkZWIKQEAgLTMzMiw3ICszMzIsOSBAQAogCShjZCAkb2JqdHJlZTsgZmluZCB0b29scy9vYmp0b29sIC10eXBlIGYgLWV4ZWN1dGFibGUpID4+ICIkb2JqdHJlZS9kZWJpYW4vaGRyb2JqZmlsZXMiCiBmaQogKGNkICRvYmp0cmVlOyBmaW5kIGFyY2gvJFNSQ0FSQ0gvaW5jbHVkZSBNb2R1bGUuc3ltdmVycyBpbmNsdWRlIHNjcmlwdHMgLXR5cGUgZikgPj4gIiRvYmp0cmVlL2RlYmlhbi9oZHJvYmpmaWxlcyIKLShjZCAkb2JqdHJlZTsgZmluZCBzY3JpcHRzL2djYy1wbHVnaW5zIC1uYW1lIFwqLnNvIC1vIC1uYW1lIGdjYy1jb21tb24uaCkgPj4gIiRvYmp0cmVlL2RlYmlhbi9oZHJvYmpmaWxlcyIKK2lmIGdyZXAgLXEgJ15DT05GSUdfR0NDX1BMVUdJTlM9eScgJEtDT05GSUdfQ09ORklHIDsgdGhlbgorCShjZCAkb2JqdHJlZTsgZmluZCBzY3JpcHRzL2djYy1wbHVnaW5zIC1uYW1lIFwqLnNvIC1vIC1uYW1lIGdjYy1jb21tb24uaCkgPj4gIiRvYmp0cmVlL2RlYmlhbi9oZHJvYmpmaWxlcyIKK2ZpCiBkZXN0ZGlyPSRrZXJuZWxfaGVhZGVyc19kaXIvdXNyL3NyYy9saW51eC1oZWFkZXJzLSR2ZXJzaW9uCiBta2RpciAtcCAiJGRlc3RkaXIiCiAoY2QgJHNyY3RyZWU7IHRhciAtYyAtZiAtIC1UIC0pIDwgIiRvYmp0cmVlL2RlYmlhbi9oZHJzcmNmaWxlcyIgfCAoY2QgJGRlc3RkaXI7IHRhciAteGYgLSkKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcmVjb3JkbWNvdW50LmMgYi9zY3JpcHRzL3JlY29yZG1jb3VudC5jCmluZGV4IDQyMzk2YTcuLmE2OGYwMzEgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvcmVjb3JkbWNvdW50LmMKKysrIGIvc2NyaXB0cy9yZWNvcmRtY291bnQuYwpAQCAtMzYzLDYgKzM2Myw3IEBACiAJCXN0cmNtcCgiLnNjaGVkLnRleHQiLCAgICB0eHRuYW1lKSA9PSAwIHx8CiAJCXN0cmNtcCgiLnNwaW5sb2NrLnRleHQiLCB0eHRuYW1lKSA9PSAwIHx8CiAJCXN0cmNtcCgiLmlycWVudHJ5LnRleHQiLCB0eHRuYW1lKSA9PSAwIHx8CisJCXN0cmNtcCgiLnNvZnRpcnFlbnRyeS50ZXh0IiwgdHh0bmFtZSkgPT0gMCB8fAogCQlzdHJjbXAoIi5rcHJvYmVzLnRleHQiLCB0eHRuYW1lKSA9PSAwIHx8CiAJCXN0cmNtcCgiLnRleHQudW5saWtlbHkiLCB0eHRuYW1lKSA9PSAwOwogfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9yZWNvcmRtY291bnQucGwgYi9zY3JpcHRzL3JlY29yZG1jb3VudC5wbAppbmRleCA5NmUyNDg2Li4yZDQ4MDExIDEwMDc1NQotLS0gYS9zY3JpcHRzL3JlY29yZG1jb3VudC5wbAorKysgYi9zY3JpcHRzL3JlY29yZG1jb3VudC5wbApAQCAtMTM0LDYgKzEzNCw3IEBACiAgICAgICIuc2NoZWQudGV4dCIgPT4gMSwKICAgICAgIi5zcGlubG9jay50ZXh0IiA9PiAxLAogICAgICAiLmlycWVudHJ5LnRleHQiID0+IDEsCisgICAgICIuc29mdGlycWVudHJ5LnRleHQiID0+IDEsCiAgICAgICIua3Byb2Jlcy50ZXh0IiA9PiAxLAogICAgICAiLnRleHQudW5saWtlbHkiID0+IDEsCiApOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90YWdzLnNoIGIvc2NyaXB0cy90YWdzLnNoCmluZGV4IGVkN2VlZjIuLmIzNzc1YTkgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvdGFncy5zaAorKysgYi9zY3JpcHRzL3RhZ3Muc2gKQEAgLTIwNiw3ICsyMDYsNiBAQAogCScvXDxERUZJTkVfUEVSX0NQVV9TSEFSRURfQUxJR05FRChbXixdKiwgKlwoW1s6YWxudW06XV9dKlwpL1wxL3YvJwogCScvXDxERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChcKFtbOmFsbnVtOl1fXSpcKS9cMS92LycKIAknL1w8REVDTEFSRV9cKFRBU0tMRVRcfFdPUktcfERFTEFZRURfV09SS1wpKFwoW1s6YWxudW06XV9dKlwpL1wyL3YvJwotCScvXDxERUZJTkVfUENJX0RFVklDRV9UQUJMRShcKFtbOmFsbnVtOl1fXSpcKS9cMS92LycKIAknL1woXlxzXClPRkZTRVQoXChbWzphbG51bTpdX10qXCkvXDIvdi8nCiAJJy9cKF5cc1wpREVGSU5FKFwoW1s6YWxudW06XV9dKlwpL1wyL3YvJwogCScvXDxERUZJTkVfSEFTSFRBQkxFKFwoW1s6YWxudW06XV9dKlwpL1wxL3YvJwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy90cmFjaW5nL2Z0cmFjZS1iaXNlY3Quc2ggYi9zY3JpcHRzL3RyYWNpbmcvZnRyYWNlLWJpc2VjdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ZmY4YWM1Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy90cmFjaW5nL2Z0cmFjZS1iaXNlY3Quc2gKQEAgLTAsMCArMSwxMTUgQEAKKyMhL2Jpbi9iYXNoCisjCisjIEhlcmUncyBob3cgdG8gdXNlIHRoaXM6CisjCisjIFRoaXMgc2NyaXB0IGlzIHVzZWQgdG8gaGVscCBmaW5kIGZ1bmN0aW9ucyB0aGF0IGFyZSBiZWluZyB0cmFjZWQgYnkgZnVuY3Rpb24KKyMgdHJhY2VyIG9yIGZ1bmN0aW9uIGdyYXBoIHRyYWNpbmcgdGhhdCBjYXVzZXMgdGhlIG1hY2hpbmUgdG8gcmVib290LCBoYW5nLCBvcgorIyBjcmFzaC4gSGVyZSdzIHRoZSBzdGVwcyB0byB0YWtlLgorIworIyBGaXJzdCwgZGV0ZXJtaW5lIGlmIGZ1bmN0aW9uIHRyYWNpbmcgaXMgd29ya2luZyB3aXRoIGEgc2luZ2xlIGZ1bmN0aW9uOgorIworIyAgIChub3RlLCBpZiB0aGlzIGlzIGEgcHJvYmxlbSB3aXRoIGZ1bmN0aW9uX2dyYXBoIHRyYWNpbmcsIHRoZW4gc2ltcGx5CisjICAgIHJlcGxhY2UgImZ1bmN0aW9uIiB3aXRoICJmdW5jdGlvbl9ncmFwaCIgaW4gdGhlIGZvbGxvd2luZyBzdGVwcykuCisjCisjICAjIGNkIC9zeXMva2VybmVsL2RlYnVnL3RyYWNpbmcKKyMgICMgZWNobyBzY2hlZHVsZSA+IHNldF9mdHJhY2VfZmlsdGVyCisjICAjIGVjaG8gZnVuY3Rpb24gPiBjdXJyZW50X3RyYWNlcgorIworIyBJZiB0aGlzIHdvcmtzLCB0aGVuIHdlIGtub3cgdGhhdCBzb21ldGhpbmcgaXMgYmVpbmcgdHJhY2VkIHRoYXQgc2hvdWxkbid0IGJlLgorIworIyAgIyBlY2hvIG5vcCA+IGN1cnJlbnRfdHJhY2VyCisjCisjICAjIGNhdCBhdmFpbGFibGVfZmlsdGVyX2Z1bmN0aW9ucyA+IH4vZnVsbC1maWxlCisjICAjIGZ0cmFjZS1iaXNlY3Qgfi9mdWxsLWZpbGUgfi90ZXN0LWZpbGUgfi9ub24tdGVzdC1maWxlCisjICAjIGNhdCB+L3Rlc3QtZmlsZSA+IHNldF9mdHJhY2VfZmlsdGVyCisjCisjICoqKiBOb3RlICoqKiB0aGlzIHdpbGwgdGFrZSBzZXZlcmFsIG1pbnV0ZXMuIFNldHRpbmcgbXVsdGlwbGUgZnVuY3Rpb25zIGlzCisjIGFuIE8obl4yKSBvcGVyYXRpb24sIGFuZCB3ZSBhcmUgZGVhbGluZyB3aXRoIHRob3VzYW5kcyBvZiBmdW5jdGlvbnMuIFNvIGdvCisjIGhhdmUgIGNvZmZlZSwgdGFsayB3aXRoIHlvdXIgY293b3JrZXJzLCByZWFkIGZhY2Vib29rLiBBbmQgZXZlbnR1YWxseSwgdGhpcworIyBvcGVyYXRpb24gd2lsbCBlbmQuCisjCisjICAjIGVjaG8gZnVuY3Rpb24gPiBjdXJyZW50X3RyYWNlcgorIworIyBJZiBpdCBjcmFzaGVzLCB3ZSBrbm93IHRoYXQgfi90ZXN0LWZpbGUgaGFzIGEgYmFkIGZ1bmN0aW9uLgorIworIyAgIFJlYm9vdCBiYWNrIHRvIHRlc3Qga2VybmVsLgorIworIyAgICAgIyBjZCAvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nCisjICAgICAjIG12IH4vdGVzdC1maWxlIH4vZnVsbC1maWxlCisjCisjIElmIGl0IGRpZG4ndCBjcmFzaC4KKyMKKyMgICAgICMgZWNobyBub3AgPiBjdXJyZW50X3RyYWNlcgorIyAgICAgIyBtdiB+L25vbi10ZXN0LWZpbGUgfi9mdWxsLWZpbGUKKyMKKyMgR2V0IHJpZCBvZiB0aGUgb3RoZXIgdGVzdCBmaWxlIGZyb20gcHJldmlvdXMgcnVuIChvciBzYXZlIHRoZW0gb2ZmIHNvbWV3aGVyZSkuCisjICAjIHJtIC1mIH4vdGVzdC1maWxlIH4vbm9uLXRlc3QtZmlsZQorIworIyBBbmQgc3RhcnQgYWdhaW46CisjCisjICAjIGZ0cmFjZS1iaXNlY3Qgfi9mdWxsLWZpbGUgfi90ZXN0LWZpbGUgfi9ub24tdGVzdC1maWxlCisjCisjIFRoZSBnb29kIHRoaW5nIGlzLCBiZWNhdXNlIHRoaXMgY3V0cyB0aGUgbnVtYmVyIG9mIGZ1bmN0aW9ucyBpbiB+L3Rlc3QtZmlsZQorIyBieSBoYWxmLCB0aGUgY2F0IG9mIGl0IGludG8gc2V0X2Z0cmFjZV9maWx0ZXIgdGFrZXMgaGFsZiBhcyBsb25nIGVhY2gKKyMgaXRlcmF0aW9uLCBzbyBkb24ndCB0YWxrIHNvIG11Y2ggYXQgdGhlIHdhdGVyIGNvb2xlciB0aGUgc2Vjb25kIHRpbWUuCisjCisjIEV2ZW50dWFsbHksIGlmIHlvdSBkaWQgdGhpcyBjb3JyZWN0bHksIHlvdSB3aWxsIGdldCBkb3duIHRvIHRoZSBwcm9ibGVtCisjIGZ1bmN0aW9uLCBhbmQgYWxsIHdlIG5lZWQgdG8gZG8gaXMgdG8gbm90cmFjZSBpdC4KKyMKKyMgVGhlIHdheSB0byBmaWd1cmUgb3V0IGlmIHRoZSBwcm9ibGVtIGZ1bmN0aW9uIGlzIGJhZCwganVzdCBkbzoKKyMKKyMgICMgZWNobyA8cHJvYmxlbS1mdW5jdGlvbj4gPiBzZXRfZnRyYWNlX25vdHJhY2UKKyMgICMgZWNobyA+IHNldF9mdHJhY2VfZmlsdGVyCisjICAjIGVjaG8gZnVuY3Rpb24gPiBjdXJyZW50X3RyYWNlcgorIworIyBBbmQgaWYgaXQgZG9lc24ndCBjcmFzaCwgd2UgYXJlIGRvbmUuCisjCisjIElmIGl0IGRvZXMgY3Jhc2gsIGRvIHRoaXMgYWdhaW4gKHRoZXJlJ3MgbW9yZSB0aGFuIG9uZSBwcm9ibGVtIGZ1bmN0aW9uKQorIyBidXQgeW91IG5lZWQgdG8gZWNobyB0aGUgcHJvYmxlbSBmdW5jdGlvbihzKSBpbnRvIHNldF9mdHJhY2Vfbm90cmFjZSBiZWZvcmUKKyMgZW5hYmxpbmcgZnVuY3Rpb24gdHJhY2luZyBpbiB0aGUgYWJvdmUgc3RlcHMuIE9yIGlmIHlvdSBjYW4gY29tcGlsZSB0aGUKKyMga2VybmVsLCBhbm5vdGF0ZSB0aGUgcHJvYmxlbSBmdW5jdGlvbnMgd2l0aCAibm90cmFjZSIgYW5kIHN0YXJ0IGFnYWluLgorIworCisKK2lmIFsgJCMgLW5lIDMgXTsgdGhlbgorICBlY2hvICd1c2FnZTogZnRyYWNlLWJpc2VjdCBmdWxsLWZpbGUgdGVzdC1maWxlICBub24tdGVzdC1maWxlJworICBleGl0CitmaQorCitmdWxsPSQxCit0ZXN0PSQyCitub250ZXN0PSQzCisKK3g9YGNhdCAkZnVsbCB8IHdjIC1sYAoraWYgWyAkeCAtZXEgMSBdOyB0aGVuCisJZWNobyAiVGhlcmUncyBvbmx5IG9uZSBmdW5jdGlvbiBsZWZ0LCBtdXN0IGJlIHRoZSBiYWQgb25lIgorCWNhdCAkZnVsbAorCWV4aXQgMAorZmkKKworbGV0IHg9JHgvMgorbGV0IHk9JHgrMQorCitpZiBbICEgLWYgJGZ1bGwgXTsgdGhlbgorCWVjaG8gIiRmdWxsIGRvZXMgbm90IGV4aXN0IgorCWV4aXQgMQorZmkKKworaWYgWyAtZiAkdGVzdCBdOyB0aGVuCisJZWNobyAtbiAiJHRlc3QgZXhpc3RzLCBkZWxldGUgaXQ/IFt5L05dIgorCXJlYWQgYQorCWlmIFsgIiRhIiAhPSAieSIgLWEgIiRhIiAhPSAiWSIgXTsgdGhlbgorCQlleGl0IDEKKwlmaQorZmkKKworaWYgWyAtZiAkbm9udGVzdCBdOyB0aGVuCisJZWNobyAtbiAiJG5vbnRlc3QgZXhpc3RzLCBkZWxldGUgaXQ/IFt5L05dIgorCXJlYWQgYQorCWlmIFsgIiRhIiAhPSAieSIgLWEgIiRhIiAhPSAiWSIgXTsgdGhlbgorCQlleGl0IDEKKwlmaQorZmkKKworc2VkIC1uZSAiMSwke3h9cCIgJGZ1bGwgPiAkdGVzdAorc2VkIC1uZSAiJHksXCRwIiAkZnVsbCA+ICRub250ZXN0CmRpZmYgLS1naXQgYS9zY3JpcHRzL3Zlcl9saW51eCBiL3NjcmlwdHMvdmVyX2xpbnV4CmluZGV4IDBkOGJkMjkuLjQzMGIyMDEgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvdmVyX2xpbnV4CisrKyBiL3NjcmlwdHMvdmVyX2xpbnV4CkBAIC0xLDE5MyArMSw4OSBAQAotIyEvYmluL3NoCisjIS9iaW4vYXdrIC1mCiAjIEJlZm9yZSBydW5uaW5nIHRoaXMgc2NyaXB0IHBsZWFzZSBlbnN1cmUgdGhhdCB5b3VyIFBBVEggaXMKICMgdHlwaWNhbCBhcyB5b3UgdXNlIGZvciBjb21waWxhdGlvbi9pbnN0YWxsYXRpb24uIEkgdXNlCiAjIC9iaW4gL3NiaW4gL3Vzci9iaW4gL3Vzci9zYmluIC91c3IvbG9jYWwvYmluLCBidXQgaXQgbWF5CiAjIGRpZmZlciBvbiB5b3VyIHN5c3RlbS4KLSMKLWVjaG8gJ0lmIHNvbWUgZmllbGRzIGFyZSBlbXB0eSBvciBsb29rIHVudXN1YWwgeW91IG1heSBoYXZlIGFuIG9sZCB2ZXJzaW9uLicKLWVjaG8gJ0NvbXBhcmUgdG8gdGhlIGN1cnJlbnQgbWluaW1hbCByZXF1aXJlbWVudHMgaW4gRG9jdW1lbnRhdGlvbi9DaGFuZ2VzLicKLWVjaG8gJyAnCiAKLXVuYW1lIC1hCi1lY2hvICcgJworQkVHSU4geworCXVzYWdlID0gIklmIHNvbWUgZmllbGRzIGFyZSBlbXB0eSBvciBsb29rIHVudXN1YWwgeW91IG1heSBoYXZlIGFuIG9sZCB2ZXJzaW9uLlxuIgorCXVzYWdlID0gdXNhZ2UgIkNvbXBhcmUgdG8gdGhlIGN1cnJlbnQgbWluaW1hbCByZXF1aXJlbWVudHMgaW4gRG9jdW1lbnRhdGlvbi9DaGFuZ2VzLlxuIgorCXByaW50IHVzYWdlCiAKLWdjYyAtZHVtcHZlcnNpb24gMj4mMSB8Ci1hd2sgJy9bMC05XSsoWy5dP1swLTldKykrLyAmJiAhL25vdCBmb3VuZCQvewotCW1hdGNoKCQwLCAvWzAtOV0rKFsuXT9bMC05XSspKy8pCi0JcHJpbnRmKCJHTlUgQ1x0XHRcdCVzXG4iLAotCXN1YnN0cigkMCxSU1RBUlQsUkxFTkdUSCkpCi19JworCXN5c3RlbSgidW5hbWUgLWEiKQorCXByaW50ZigiXG4iKQogCi1tYWtlIC0tdmVyc2lvbiAyPiYxIHwKLWF3ayAnL0dOVSBNYWtlL3sKLQltYXRjaCgkMCwgL1swLTldKyhbLl0/WzAtOV0rKSsvKQotCXByaW50ZigiR05VIE1ha2VcdFx0JXNcbiIsCi0Jc3Vic3RyKCQwLFJTVEFSVCxSTEVOR1RIKSkKLX0nCisJcHJpbnR2ZXJzaW9uKCJHTlUgQyIsIHZlcnNpb24oImdjYyAtZHVtcHZlcnNpb24gMj4mMSIpKQorCXByaW50dmVyc2lvbigiR05VIE1ha2UiLCB2ZXJzaW9uKCJtYWtlIC0tdmVyc2lvbiAyPiYxIikpCisJcHJpbnR2ZXJzaW9uKCJCaW51dGlscyIsIHZlcnNpb24oImxkIC12IDI+JjEiKSkKKwlwcmludHZlcnNpb24oIlV0aWwtbGludXgiLCB2ZXJzaW9uKCJtb3VudCAtLXZlcnNpb24gMj4mMSIpKQorCXByaW50dmVyc2lvbigiTW91bnQiLCB2ZXJzaW9uKCJtb3VudCAtLXZlcnNpb24gMj4mMSIpKQorCXByaW50dmVyc2lvbigiTW9kdWxlLWluaXQtdG9vbHMiLCB2ZXJzaW9uKCJkZXBtb2QgLVYgIDI+JjEiKSkKKwlwcmludHZlcnNpb24oIkUyZnNwcm9ncyIsIHZlcnNpb24oInR1bmUyZnMgMj4mMSIpKQorCXByaW50dmVyc2lvbigiSmZzdXRpbHMiLCB2ZXJzaW9uKCJmc2NrLmpmcyAtViAyPiYxIikpCisJcHJpbnR2ZXJzaW9uKCJSZWlzZXJmc3Byb2dzIiwgdmVyc2lvbigicmVpc2VyZnNjayAtViAyPiYxIikpCisJcHJpbnR2ZXJzaW9uKCJSZWlzZXI0ZnNwcm9ncyIsIHZlcnNpb24oImZzY2sucmVpc2VyNCAtViAyPiYxIikpCisJcHJpbnR2ZXJzaW9uKCJYZnNwcm9ncyIsIHZlcnNpb24oInhmc19kYiAtViAyPiYxIikpCisJcHJpbnR2ZXJzaW9uKCJQY21jaWF1dGlscyIsIHZlcnNpb24oInBjY2FyZGN0bCAtViAyPiYxIikpCisJcHJpbnR2ZXJzaW9uKCJQY21jaWEtY3MiLCB2ZXJzaW9uKCJjYXJkbWdyIC1WIDI+JjEiKSkKKwlwcmludHZlcnNpb24oIlF1b3RhLXRvb2xzIiwgdmVyc2lvbigicXVvdGEgLVYgMj4mMSIpKQorCXByaW50dmVyc2lvbigiUFBQIiwgdmVyc2lvbigicHBwZCAtLXZlcnNpb24gMj4mMSIpKQorCXByaW50dmVyc2lvbigiSXNkbjRrLXV0aWxzIiwgdmVyc2lvbigiaXNkbmN0cmwgMj4mMSIpKQorCXByaW50dmVyc2lvbigiTmZzLXV0aWxzIiwgdmVyc2lvbigic2hvd21vdW50IC0tdmVyc2lvbiAyPiYxIikpCiAKLWxkIC12IDI+JjEgfAotYXdrICcvWzAtOV0rKFsuXT9bMC05XSspKy8gJiYgIS9ub3QgZm91bmQkL3sKLQltYXRjaCgkMCwgL1swLTldKyhbLl0/WzAtOV0rKSsvKQotCXByaW50ZigiQmludXRpbHNcdFx0JXNcbiIsCi0Jc3Vic3RyKCQwLFJTVEFSVCxSTEVOR1RIKSkKLX0nCi0KLW1vdW50IC0tdmVyc2lvbiAyPiYxIHwKLWF3ayAnL1swLTldKyhbLl0/WzAtOV0rKSsvICYmICEvbm90IGZvdW5kJC97Ci0JbWF0Y2goJDAsIC9bMC05XSsoWy5dP1swLTldKykrLykKLQkkMCA9IHN1YnN0cigkMCxSU1RBUlQsUkxFTkdUSCkKLQlwcmludGYoIlV0aWwtbGludXhcdFx0JXNcbk1vdW50XHRcdFx0JXNcbiIsJDAsJDApCi19JwotCi1kZXBtb2QgLVYgIDI+JjEgfAotYXdrICcvWzAtOV0rKFsuXT9bMC05XSspKy8gJiYgIS9ub3QgZm91bmQkL3sKLQltYXRjaCgkMCwgL1swLTldKyhbLl0/WzAtOV0rKSsvKQotCXByaW50ZigiTW9kdWxlLWluaXQtdG9vbHNcdCVzXG4iLAotCXN1YnN0cigkMCxSU1RBUlQsUkxFTkdUSCkpCi19JwotCi10dW5lMmZzIDI+JjEgfAotYXdrICcvXnR1bmUyZnMvewotCW1hdGNoKCQwLCAvWzAtOV0rKFsuXT9bMC05XSspKy8pCi0JcHJpbnRmKCJFMmZzcHJvZ3NcdFx0JXNcbiIsCi0Jc3Vic3RyKCQwLFJTVEFSVCxSTEVOR1RIKSkKLX0nCi0KLWZzY2suamZzIC1WIDI+JjEgfAotYXdrICcvdmVyc2lvbi97Ci0JbWF0Y2goJDAsIC9bMC05XSsoWy5dP1swLTldKykrLykKLQlwcmludGYoIkpmc3V0aWxzXHRcdCVzXG4iLAotCXN1YnN0cigkMCxSU1RBUlQsUkxFTkdUSCkpCi19JwotCi1yZWlzZXJmc2NrIC1WIDI+JjEgfAotYXdrICcvXnJlaXNlcmZzY2svewotCW1hdGNoKCQwLCAvWzAtOV0rKFsuXT9bMC05XSspKy8pCi0JcHJpbnRmKCJSZWlzZXJmc3Byb2dzXHRcdCVzXG4iLAotCXN1YnN0cigkMCxSU1RBUlQsUkxFTkdUSCkpCi19JwotCi1mc2NrLnJlaXNlcjQgLVYgMj4mMSB8IGdyZXAgXmZzY2sucmVpc2VyNCB8IGF3ayBcCi0nTlI9PTF7cHJpbnQgInJlaXNlcjRwcm9ncyAgICAgICAgICAiLCAkMn0nCi0KLXhmc19kYiAtViAyPiYxIHwKLWF3ayAnL3ZlcnNpb24vewotCW1hdGNoKCQwLCAvWzAtOV0rKFsuXT9bMC05XSspKy8pCi0JcHJpbnRmKCJYZnNwcm9nc1x0XHQlc1xuIiwKLQlzdWJzdHIoJDAsUlNUQVJULFJMRU5HVEgpKQotfScKLQotcGNjYXJkY3RsIC1WIDI+JjEgfAotYXdrICcvcGNtY2lhdXRpbHMvewotCW1hdGNoKCQwLCAvWzAtOV0rKFsuXT9bMC05XSspKy8pCi0JcHJpbnRmKCJQY21jaWF1dGlsc1x0XHQlc1xuIiwKLQlzdWJzdHIoJDAsUlNUQVJULFJMRU5HVEgpKQotfScKLQotY2FyZG1nciAtViAyPiYxfCBncmVwIHZlcnNpb24gfCBhd2sgXAotJ05SPT0xe3ByaW50ICJwY21jaWEtY3MgICAgICAgICAgICAgIiwgJDN9JwotCi1xdW90YSAtViAyPiYxIHwKLWF3ayAnL3ZlcnNpb24vewotCW1hdGNoKCQwLCAvWzAtOV0rKFsuXT9bMC05XSspKy8pCi0JcHJpbnRmKCJRdW90YS10b29sc1x0XHQlc1xuIiwKLQlzdWJzdHIoJDAsUlNUQVJULFJMRU5HVEgpKQotfScKLQotcHBwZCAtLXZlcnNpb24gMj4mMSB8Ci1hd2sgJy92ZXJzaW9uL3sKLQltYXRjaCgkMCwgL1swLTldKyhbLl0/WzAtOV0rKSsvKQotCXByaW50ZigiUFBQXHRcdFx0JXNcbiIsCi0Jc3Vic3RyKCQwLFJTVEFSVCxSTEVOR1RIKSkKLX0nCi0KLWlzZG5jdHJsIDI+JjEgfCBncmVwIHZlcnNpb24gfCBhd2sgXAotJ05SPT0xe3ByaW50ICJpc2RuNGstdXRpbHMgICAgICAgICAgIiwgJE5GfScKLQotc2hvd21vdW50IC0tdmVyc2lvbiAyPiYxIHwgZ3JlcCBuZnMtdXRpbHMgfCBhd2sgXAotJ05SPT0xe3ByaW50ICJuZnMtdXRpbHMgICAgICAgICAgICAgIiwgJE5GfScKLQotdGVzdCAtciAvcHJvYy9zZWxmL21hcHMgJiYKLXNlZCAnCi0JLy4qbGliYy1cKC4qXClcLnNvJC8hZAotCXMvL0xpbnV4IEMgTGlicmFyeVx0XHRcMS8KLQlxCi0nIC9wcm9jL3NlbGYvbWFwcwotCi1sZGQgLS12ZXJzaW9uIDI+JjEgfAotYXdrICcvXmxkZC97Ci0JbWF0Y2goJDAsIC9bMC05XSsoWy5dP1swLTldKykrLykKLQlwcmludGYoIkR5bmFtaWMgbGlua2VyIChsZGQpXHQlc1xuIiwKLQlzdWJzdHIoJDAsUlNUQVJULFJMRU5HVEgpKQotfScKLQotbGliY3BwPWBsZGNvbmZpZyAtcCAyPi9kZXYvbnVsbCB8Ci0JYXdrICcvKGxpYmd8c3RkYylbK10rXC5zby8gewotCXByaW50ICRORgotCWV4aXQKKwlpZiAoc3lzdGVtKCJ0ZXN0IC1yIC9wcm9jL3NlbGYvbWFwcyIpID09IDApIHsKKwkJd2hpbGUgKGdldGxpbmUgPCIvcHJvYy9zZWxmL21hcHMiID4gMCkgeworCQkJbiA9IHNwbGl0KCQwLCBwcm9jbWFwcywgIi8iKQorCQkJaWYgKC9saWJjLipzbyQvICYmIG1hdGNoKHByb2NtYXBzW25dLCAvWzAtOV0rKFsuXT9bMC05XSspKy8pKSB7CisJCQkJdmVyID0gc3Vic3RyKHByb2NtYXBzW25dLCBSU1RBUlQsIFJMRU5HVEgpCisJCQkJcHJpbnR2ZXJzaW9uKCJMaW51eCBDIExpYnJhcnkiLCB2ZXIpCisJCQkJYnJlYWsKKwkJCX0KKwkJfQogCX0KLSdgCi10ZXN0IC1yICIkbGliY3BwIiAmJgotbHMgLWwgJGxpYmNwcCB8Ci1zZWQgJwotCXMhLipzb1wuISEKLQlzIV4hTGludXggQysrIExpYnJhcnlcdCEKLScKLXBzIC0tdmVyc2lvbiAyPiYxIHwKLWF3ayAnL3ZlcnNpb24vewotCW1hdGNoKCQwLCAvWzAtOV0rKFsuXT9bMC05XSspKy8pCi0JcHJpbnRmKCJQcm9jcHNcdFx0XHQlc1xuIiwKLQlzdWJzdHIoJDAsUlNUQVJULFJMRU5HVEgpKQotfScKIAotaWZjb25maWcgLS12ZXJzaW9uIDI+JjEgfAotYXdrICcvdG9vbHMvewotCW1hdGNoKCQwLCAvWzAtOV0rKFsuXT9bMC05XSspKy8pCi0JcHJpbnRmKCJOZXQtdG9vbHNcdFx0JXNcbiIsCi0Jc3Vic3RyKCQwLFJTVEFSVCxSTEVOR1RIKSkKLX0nCisJcHJpbnR2ZXJzaW9uKCJEeW5hbWljIGxpbmtlciAobGRkKSIsIHZlcnNpb24oImxkZCAtLXZlcnNpb24gMj4mMSIpKQogCi1sb2Fka2V5cyAtViAyPiYxIHwKLWF3ayAnL1swLTldKyhbLl0/WzAtOV0rKSsvICYmICEvbm90IGZvdW5kJC97Ci0JbWF0Y2goJDAsIC9bMC05XSsoWy5dP1swLTldKykrLykKLQkkMCA9IHN1YnN0cigkMCxSU1RBUlQsUkxFTkdUSCkKLQlwcmludGYoIktiZFx0XHRcdCVzXG5Db25zb2xlLXRvb2xzXHRcdCVzXG4iLCQwLCQwKQotfScKKwl3aGlsZSAoImxkY29uZmlnIC1wIDI+L2Rldi9udWxsIiB8IGdldGxpbmUgPiAwKSB7CisJCWlmICgvKGxpYmd8c3RkYylbK10rXC5zby8pIHsKKwkJCWxpYmNwcCA9ICRORgorCQkJYnJlYWsKKwkJfQorCX0KKwlpZiAoc3lzdGVtKCJ0ZXN0IC1yICIgbGliY3BwKSA9PSAwKQorCQlwcmludHZlcnNpb24oIkxpbnV4IEMrKyBMaWJyYXJ5IiwgdmVyc2lvbigicmVhZGxpbmsgIiBsaWJjcHApKQogCi1vcHJvZmlsZWQgLS12ZXJzaW9uIDI+JjEgfCBhd2sgXAotJyhOUj09MSAmJiAoJDIgPT0gIm9wcm9maWxlIikpIHtwcmludCAib3Byb2ZpbGUgICAgICAgICAgICAgICIsICQzfScKKwlwcmludHZlcnNpb24oIlByb2NwcyIsIHZlcnNpb24oInBzIC0tdmVyc2lvbiAyPiYxIikpCisJcHJpbnR2ZXJzaW9uKCJOZXQtdG9vbHMiLCB2ZXJzaW9uKCJpZmNvbmZpZyAtLXZlcnNpb24gMj4mMSIpKQorCXByaW50dmVyc2lvbigiS2JkIiwgdmVyc2lvbigibG9hZGtleXMgLVYgMj4mMSIpKQorCXByaW50dmVyc2lvbigiQ29uc29sZS10b29scyIsIHZlcnNpb24oImxvYWRrZXlzIC1WIDI+JjEiKSkKKwlwcmludHZlcnNpb24oIk9wcm9maWxlIiwgdmVyc2lvbigib3Byb2ZpbGVkIC0tdmVyc2lvbiAyPiYxIikpCisJcHJpbnR2ZXJzaW9uKCJTaC11dGlscyIsIHZlcnNpb24oImV4cHIgLS12IDI+JjEiKSkKKwlwcmludHZlcnNpb24oIlVkZXYiLCB2ZXJzaW9uKCJ1ZGV2YWRtIC0tdmVyc2lvbiAyPiYxIikpCisJcHJpbnR2ZXJzaW9uKCJXaXJlbGVzcy10b29scyIsIHZlcnNpb24oIml3Y29uZmlnIC0tdmVyc2lvbiAyPiYxIikpCiAKLWV4cHIgLS12IDI+JjEgfAotYXdrICcvXmV4cHIvewotCW1hdGNoKCQwLCAvWzAtOV0rKFsuXT9bMC05XSspKy8pCi0JcHJpbnRmKCJTaC11dGlsc1x0XHQlc1xuIiwKLQlzdWJzdHIoJDAsUlNUQVJULFJMRU5HVEgpKQotfScKLQotdWRldmFkbSAtLXZlcnNpb24gMj4mMSB8Ci1hd2sgJy9bMC05XSsoWy5dP1swLTldKykrLyAmJiAhL25vdCBmb3VuZCQvewotCW1hdGNoKCQwLCAvWzAtOV0rKFsuXT9bMC05XSspKy8pCi0JcHJpbnRmKCJVZGV2XHRcdFx0JXNcbiIsCi0Jc3Vic3RyKCQwLFJTVEFSVCxSTEVOR1RIKSkKLX0nCi0KLWl3Y29uZmlnIC0tdmVyc2lvbiAyPiYxIHwKLWF3ayAnL3ZlcnNpb24vewotCW1hdGNoKCQwLCAvWzAtOV0rKFsuXT9bMC05XSspKy8pCi0JcHJpbnRmKCJXaXJlbGVzcy10b29sc1x0XHQlc1xuIiwKLQlzdWJzdHIoJDAsUlNUQVJULFJMRU5HVEgpKQotfScKLQotdGVzdCAtZSAvcHJvYy9tb2R1bGVzICYmCi1zb3J0IC9wcm9jL21vZHVsZXMgfAotc2VkICcKLQlzLyAuKi8vCi0JSAotJHsKLQlnCi0Jcy9eXG4vTW9kdWxlcyBMb2FkZWRcdFx0LwotCXkvXG4vIC8KLQlxCisJaWYgKHN5c3RlbSgidGVzdCAtciAvcHJvYy9tb2R1bGVzIikgPT0gMCkgeworCQl3aGlsZSAoInNvcnQgL3Byb2MvbW9kdWxlcyIgfCBnZXRsaW5lID4gMCkgeworCQkJbW9kcyA9IG1vZHMgc2VwICQxCisJCQlzZXAgPSAiICIKKwkJfQorCQlwcmludHZlcnNpb24oIk1vZHVsZXMgTG9hZGVkIiwgbW9kcykKKwl9CiB9Ci0JZAotJworCitmdW5jdGlvbiB2ZXJzaW9uKGNtZCwgICAgdmVyKSB7CisJd2hpbGUgKGNtZCB8IGdldGxpbmUgPiAwKSB7CisJCWlmICghL3Zlcl9saW51eC8gJiYgbWF0Y2goJDAsIC9bMC05XSsoWy5dP1swLTldKykrLykpIHsKKwkJCXZlciA9IHN1YnN0cigkMCwgUlNUQVJULCBSTEVOR1RIKQorCQkJYnJlYWsKKwkJfQorCX0KKwljbG9zZShjbWQpCisJcmV0dXJuIHZlcgorfQorCitmdW5jdGlvbiBwcmludHZlcnNpb24obmFtZSwgdmFsdWUsICBvZm10KSB7CisJaWYgKHZhbHVlICE9ICIiKSB7CisJCW9mbXQgPSAiJS0yMHNcdCVzXG4iCisJCXByaW50ZihvZm10LCBuYW1lLCB2YWx1ZSkKKwl9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9LY29uZmlnIGIvc2VjdXJpdHkvS2NvbmZpZwppbmRleCBkZjI4ZjJiLi4xMThmNDU0IDEwMDY0NAotLS0gYS9zZWN1cml0eS9LY29uZmlnCisrKyBiL3NlY3VyaXR5L0tjb25maWcKQEAgLTEzNiw2ICsxMzYsNyBAQAogY29uZmlnIEhBUkRFTkVEX1VTRVJDT1BZCiAJYm9vbCAiSGFyZGVuIG1lbW9yeSBjb3BpZXMgYmV0d2VlbiBrZXJuZWwgYW5kIHVzZXJzcGFjZSIKIAlkZXBlbmRzIG9uIEhBVkVfQVJDSF9IQVJERU5FRF9VU0VSQ09QWQorCWRlcGVuZHMgb24gSEFWRV9IQVJERU5FRF9VU0VSQ09QWV9BTExPQ0FUT1IKIAlzZWxlY3QgQlVHCiAJaGVscAogCSAgVGhpcyBvcHRpb24gY2hlY2tzIGZvciBvYnZpb3VzbHkgd3JvbmcgbWVtb3J5IHJlZ2lvbnMgd2hlbgpAQCAtMTQ2LDYgKzE0NywxNyBAQAogCSAgb3IgYXJlIHBhcnQgb2YgdGhlIGtlcm5lbCB0ZXh0LiBUaGlzIGtpbGxzIGVudGlyZSBjbGFzc2VzCiAJICBvZiBoZWFwIG92ZXJmbG93IGV4cGxvaXRzIGFuZCBzaW1pbGFyIGtlcm5lbCBtZW1vcnkgZXhwb3N1cmVzLgogCitjb25maWcgSEFSREVORURfVVNFUkNPUFlfUEFHRVNQQU4KKwlib29sICJSZWZ1c2UgdG8gY29weSBhbGxvY2F0aW9ucyB0aGF0IHNwYW4gbXVsdGlwbGUgcGFnZXMiCisJZGVwZW5kcyBvbiBIQVJERU5FRF9VU0VSQ09QWQorCWRlcGVuZHMgb24gRVhQRVJUCisJaGVscAorCSAgV2hlbiBhIG11bHRpLXBhZ2UgYWxsb2NhdGlvbiBpcyBkb25lIHdpdGhvdXQgX19HRlBfQ09NUCwKKwkgIGhhcmRlbmVkIHVzZXJjb3B5IHdpbGwgcmVqZWN0IGF0dGVtcHRzIHRvIGNvcHkgaXQuIFRoZXJlIGFyZSwKKwkgIGhvd2V2ZXIsIHNldmVyYWwgY2FzZXMgb2YgdGhpcyBpbiB0aGUga2VybmVsIHRoYXQgaGF2ZSBub3QgYWxsCisJICBiZWVuIHJlbW92ZWQuIFRoaXMgY29uZmlnIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb25seSB3aGlsZQorCSAgdHJ5aW5nIHRvIGZpbmQgc3VjaCB1c2Vycy4KKwogc291cmNlIHNlY3VyaXR5L3NlbGludXgvS2NvbmZpZwogc291cmNlIHNlY3VyaXR5L3NtYWNrL0tjb25maWcKIHNvdXJjZSBzZWN1cml0eS90b21veW8vS2NvbmZpZwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy9lbmNyeXB0ZWQta2V5cy9lbmNyeXB0ZWQuYyBiL3NlY3VyaXR5L2tleXMvZW5jcnlwdGVkLWtleXMvZW5jcnlwdGVkLmMKaW5kZXggNWFkYmZjMy4uMTdhMDYxMCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkva2V5cy9lbmNyeXB0ZWQta2V5cy9lbmNyeXB0ZWQuYworKysgYi9zZWN1cml0eS9rZXlzL2VuY3J5cHRlZC1rZXlzL2VuY3J5cHRlZC5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2Flcy5oPgogI2luY2x1ZGUgPGNyeXB0by9oYXNoLmg+CiAjaW5jbHVkZSA8Y3J5cHRvL3NoYS5oPgogI2luY2x1ZGUgPGNyeXB0by9za2NpcGhlci5oPgpAQCAtNDc4LDYgKzQ3OSw3IEBACiAJc3RydWN0IGNyeXB0b19za2NpcGhlciAqdGZtOwogCXN0cnVjdCBza2NpcGhlcl9yZXF1ZXN0ICpyZXE7CiAJdW5zaWduZWQgaW50IGVuY3J5cHRlZF9kYXRhbGVuOworCXU4IGl2W0FFU19CTE9DS19TSVpFXTsKIAl1bnNpZ25lZCBpbnQgcGFkbGVuOwogCWNoYXIgcGFkWzE2XTsKIAlpbnQgcmV0OwpAQCAtNTAwLDggKzUwMiw4IEBACiAJc2dfaW5pdF90YWJsZShzZ19vdXQsIDEpOwogCXNnX3NldF9idWYoc2dfb3V0LCBlcGF5bG9hZC0+ZW5jcnlwdGVkX2RhdGEsIGVuY3J5cHRlZF9kYXRhbGVuKTsKIAotCXNrY2lwaGVyX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgc2dfaW4sIHNnX291dCwgZW5jcnlwdGVkX2RhdGFsZW4sCi0JCQkJICAgZXBheWxvYWQtPml2KTsKKwltZW1jcHkoaXYsIGVwYXlsb2FkLT5pdiwgc2l6ZW9mKGl2KSk7CisJc2tjaXBoZXJfcmVxdWVzdF9zZXRfY3J5cHQocmVxLCBzZ19pbiwgc2dfb3V0LCBlbmNyeXB0ZWRfZGF0YWxlbiwgaXYpOwogCXJldCA9IGNyeXB0b19za2NpcGhlcl9lbmNyeXB0KHJlcSk7CiAJdGZtID0gY3J5cHRvX3NrY2lwaGVyX3JlcXRmbShyZXEpOwogCXNrY2lwaGVyX3JlcXVlc3RfZnJlZShyZXEpOwpAQCAtNTgxLDYgKzU4Myw3IEBACiAJc3RydWN0IGNyeXB0b19za2NpcGhlciAqdGZtOwogCXN0cnVjdCBza2NpcGhlcl9yZXF1ZXN0ICpyZXE7CiAJdW5zaWduZWQgaW50IGVuY3J5cHRlZF9kYXRhbGVuOworCXU4IGl2W0FFU19CTE9DS19TSVpFXTsKIAljaGFyIHBhZFsxNl07CiAJaW50IHJldDsKIApAQCAtNTk5LDggKzYwMiw4IEBACiAJCSAgIGVwYXlsb2FkLT5kZWNyeXB0ZWRfZGF0YWxlbik7CiAJc2dfc2V0X2J1Zigmc2dfb3V0WzFdLCBwYWQsIHNpemVvZiBwYWQpOwogCi0Jc2tjaXBoZXJfcmVxdWVzdF9zZXRfY3J5cHQocmVxLCBzZ19pbiwgc2dfb3V0LCBlbmNyeXB0ZWRfZGF0YWxlbiwKLQkJCQkgICBlcGF5bG9hZC0+aXYpOworCW1lbWNweShpdiwgZXBheWxvYWQtPml2LCBzaXplb2YoaXYpKTsKKwlza2NpcGhlcl9yZXF1ZXN0X3NldF9jcnlwdChyZXEsIHNnX2luLCBzZ19vdXQsIGVuY3J5cHRlZF9kYXRhbGVuLCBpdik7CiAJcmV0ID0gY3J5cHRvX3NrY2lwaGVyX2RlY3J5cHQocmVxKTsKIAl0Zm0gPSBjcnlwdG9fc2tjaXBoZXJfcmVxdGZtKHJlcSk7CiAJc2tjaXBoZXJfcmVxdWVzdF9mcmVlKHJlcSk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9sc21fYXVkaXQuYyBiL3NlY3VyaXR5L2xzbV9hdWRpdC5jCmluZGV4IGNjY2JmMzAuLjM3ZjA0ZGEgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2xzbV9hdWRpdC5jCisrKyBiL3NlY3VyaXR5L2xzbV9hdWRpdC5jCkBAIC05OSw3ICs5OSw3IEBACiAJfQogCXJldHVybiByZXQ7CiB9Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIC8qKgogICogaXB2Nl9za2JfdG9fYXVkaXRkYXRhIDogZmlsbCBhdWRpdGRhdGEgZnJvbSBza2IKICAqIEBza2IgOiB0aGUgc2tiCkBAIC0yMjAsNyArMjIwLDcgQEAKIAkgKi8KIAlCVUlMRF9CVUdfT04oc2l6ZW9mKGEtPnUpID4gc2l6ZW9mKHZvaWQgKikqMik7CiAKLQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIHBpZD0lZCBjb21tPSIsIHRhc2tfcGlkX25yKGN1cnJlbnQpKTsKKwlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIHBpZD0lZCBjb21tPSIsIHRhc2tfdGdpZF9ucihjdXJyZW50KSk7CiAJYXVkaXRfbG9nX3VudHJ1c3RlZHN0cmluZyhhYiwgbWVtY3B5KGNvbW0sIGN1cnJlbnQtPmNvbW0sIHNpemVvZihjb21tKSkpOwogCiAJc3dpdGNoIChhLT50eXBlKSB7CkBAIC0yNDUsNiArMjQ1LDE5IEBACiAJCX0KIAkJYnJlYWs7CiAJfQorCWNhc2UgTFNNX0FVRElUX0RBVEFfRklMRTogeworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJCWF1ZGl0X2xvZ19kX3BhdGgoYWIsICIgcGF0aD0iLCAmYS0+dS5maWxlLT5mX3BhdGgpOworCisJCWlub2RlID0gZmlsZV9pbm9kZShhLT51LmZpbGUpOworCQlpZiAoaW5vZGUpIHsKKwkJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgZGV2PSIpOworCQkJYXVkaXRfbG9nX3VudHJ1c3RlZHN0cmluZyhhYiwgaW5vZGUtPmlfc2ItPnNfaWQpOworCQkJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiBpbm89JWx1IiwgaW5vZGUtPmlfaW5vKTsKKwkJfQorCQlicmVhazsKKwl9CiAJY2FzZSBMU01fQVVESVRfREFUQV9JT0NUTF9PUDogewogCQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCkBAIC0yNTcsNyArMjcwLDcgQEAKIAkJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgaW5vPSVsdSIsIGlub2RlLT5pX2lubyk7CiAJCX0KIAotCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIGlvY3RsY21kPSVoeCIsIGEtPnUub3AtPmNtZCk7CisJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgaW9jdGxjbWQ9MHglaHgiLCBhLT51Lm9wLT5jbWQpOwogCQlicmVhazsKIAl9CiAJY2FzZSBMU01fQVVESVRfREFUQV9ERU5UUlk6IHsKQEAgLTI5NCw3ICszMDcsNyBAQAogCWNhc2UgTFNNX0FVRElUX0RBVEFfVEFTSzogewogCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGEtPnUudHNrOwogCQlpZiAodHNrKSB7Ci0JCQlwaWRfdCBwaWQgPSB0YXNrX3BpZF9ucih0c2spOworCQkJcGlkX3QgcGlkID0gdGFza190Z2lkX25yKHRzayk7CiAJCQlpZiAocGlkKSB7CiAJCQkJY2hhciBjb21tW3NpemVvZih0c2stPmNvbW0pXTsKIAkJCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIG9waWQ9JWQgb2NvbW09IiwgcGlkKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlY3VyaXR5LmMgYi9zZWN1cml0eS9zZWN1cml0eS5jCmluZGV4IDQ4MzhlN2YuLmY4MjUzMDQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlY3VyaXR5LmMKKysrIGIvc2VjdXJpdHkvc2VjdXJpdHkuYwpAQCAtMzY0LDYgKzM2NCwxNSBAQAogfQogRVhQT1JUX1NZTUJPTChzZWN1cml0eV9kZW50cnlfaW5pdF9zZWN1cml0eSk7CiAKK2ludCBzZWN1cml0eV9kZW50cnlfY3JlYXRlX2ZpbGVzX2FzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisJCQkJICAgIHN0cnVjdCBxc3RyICpuYW1lLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgY3JlZCAqb2xkLCBzdHJ1Y3QgY3JlZCAqbmV3KQoreworCXJldHVybiBjYWxsX2ludF9ob29rKGRlbnRyeV9jcmVhdGVfZmlsZXNfYXMsIDAsIGRlbnRyeSwgbW9kZSwKKwkJCQluYW1lLCBvbGQsIG5ldyk7Cit9CitFWFBPUlRfU1lNQk9MKHNlY3VyaXR5X2RlbnRyeV9jcmVhdGVfZmlsZXNfYXMpOworCiBpbnQgc2VjdXJpdHlfaW5vZGVfaW5pdF9zZWN1cml0eShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaW5vZGUgKmRpciwKIAkJCQkgY29uc3Qgc3RydWN0IHFzdHIgKnFzdHIsCiAJCQkJIGNvbnN0IGluaXR4YXR0cnMgaW5pdHhhdHRycywgdm9pZCAqZnNfZGF0YSkKQEAgLTc0OCw2ICs3NTcsMTggQEAKIAljYWxsX3ZvaWRfaG9vayhpbm9kZV9nZXRzZWNpZCwgaW5vZGUsIHNlY2lkKTsKIH0KIAoraW50IHNlY3VyaXR5X2lub2RlX2NvcHlfdXAoc3RydWN0IGRlbnRyeSAqc3JjLCBzdHJ1Y3QgY3JlZCAqKm5ldykKK3sKKwlyZXR1cm4gY2FsbF9pbnRfaG9vayhpbm9kZV9jb3B5X3VwLCAwLCBzcmMsIG5ldyk7Cit9CitFWFBPUlRfU1lNQk9MKHNlY3VyaXR5X2lub2RlX2NvcHlfdXApOworCitpbnQgc2VjdXJpdHlfaW5vZGVfY29weV91cF94YXR0cihjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiBjYWxsX2ludF9ob29rKGlub2RlX2NvcHlfdXBfeGF0dHIsIC1FT1BOT1RTVVBQLCBuYW1lKTsKK30KK0VYUE9SVF9TWU1CT0woc2VjdXJpdHlfaW5vZGVfY29weV91cF94YXR0cik7CisKIGludCBzZWN1cml0eV9maWxlX3Blcm1pc3Npb24oc3RydWN0IGZpbGUgKmZpbGUsIGludCBtYXNrKQogewogCWludCByZXQ7CkBAIC0xNjIzLDYgKzE2NDQsOCBAQAogCQlMSVNUX0hFQURfSU5JVChzZWN1cml0eV9ob29rX2hlYWRzLnNiX3BhcnNlX29wdHNfc3RyKSwKIAkuZGVudHJ5X2luaXRfc2VjdXJpdHkgPQogCQlMSVNUX0hFQURfSU5JVChzZWN1cml0eV9ob29rX2hlYWRzLmRlbnRyeV9pbml0X3NlY3VyaXR5KSwKKwkuZGVudHJ5X2NyZWF0ZV9maWxlc19hcyA9CisJCUxJU1RfSEVBRF9JTklUKHNlY3VyaXR5X2hvb2tfaGVhZHMuZGVudHJ5X2NyZWF0ZV9maWxlc19hcyksCiAjaWZkZWYgQ09ORklHX1NFQ1VSSVRZX1BBVEgKIAkucGF0aF91bmxpbmsgPQlMSVNUX0hFQURfSU5JVChzZWN1cml0eV9ob29rX2hlYWRzLnBhdGhfdW5saW5rKSwKIAkucGF0aF9ta2RpciA9CUxJU1RfSEVBRF9JTklUKHNlY3VyaXR5X2hvb2tfaGVhZHMucGF0aF9ta2RpciksCkBAIC0xNjg0LDYgKzE3MDcsMTAgQEAKIAkJTElTVF9IRUFEX0lOSVQoc2VjdXJpdHlfaG9va19oZWFkcy5pbm9kZV9saXN0c2VjdXJpdHkpLAogCS5pbm9kZV9nZXRzZWNpZCA9CiAJCUxJU1RfSEVBRF9JTklUKHNlY3VyaXR5X2hvb2tfaGVhZHMuaW5vZGVfZ2V0c2VjaWQpLAorCS5pbm9kZV9jb3B5X3VwID0KKwkJTElTVF9IRUFEX0lOSVQoc2VjdXJpdHlfaG9va19oZWFkcy5pbm9kZV9jb3B5X3VwKSwKKwkuaW5vZGVfY29weV91cF94YXR0ciA9CisJCUxJU1RfSEVBRF9JTklUKHNlY3VyaXR5X2hvb2tfaGVhZHMuaW5vZGVfY29weV91cF94YXR0ciksCiAJLmZpbGVfcGVybWlzc2lvbiA9CiAJCUxJU1RfSEVBRF9JTklUKHNlY3VyaXR5X2hvb2tfaGVhZHMuZmlsZV9wZXJtaXNzaW9uKSwKIAkuZmlsZV9hbGxvY19zZWN1cml0eSA9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L0tjb25maWcgYi9zZWN1cml0eS9zZWxpbnV4L0tjb25maWcKaW5kZXggODY5MWU5Mi4uZWE3ZTNlZiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9LY29uZmlnCisrKyBiL3NlY3VyaXR5L3NlbGludXgvS2NvbmZpZwpAQCAtOTMsNDEgKzkzLDMgQEAKIAkgIHZpYSAvc2VsaW51eC9jaGVja3JlcXByb3QgaWYgYXV0aG9yaXplZCBieSBwb2xpY3kuCiAKIAkgIElmIHlvdSBhcmUgdW5zdXJlIGhvdyB0byBhbnN3ZXIgdGhpcyBxdWVzdGlvbiwgYW5zd2VyIDAuCi0KLWNvbmZpZyBTRUNVUklUWV9TRUxJTlVYX1BPTElDWURCX1ZFUlNJT05fTUFYCi0JYm9vbCAiTlNBIFNFTGludXggbWF4aW11bSBzdXBwb3J0ZWQgcG9saWN5IGZvcm1hdCB2ZXJzaW9uIgotCWRlcGVuZHMgb24gU0VDVVJJVFlfU0VMSU5VWAotCWRlZmF1bHQgbgotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIG1heGltdW0gcG9saWN5IGZvcm1hdCB2ZXJzaW9uIHN1cHBvcnRlZAotCSAgYnkgU0VMaW51eCB0byBiZSBzZXQgdG8gYSBwYXJ0aWN1bGFyIHZhbHVlLiAgVGhpcyB2YWx1ZSBpcyByZXBvcnRlZAotCSAgdG8gdXNlcnNwYWNlIHZpYSAvc2VsaW51eC9wb2xpY3l2ZXJzIGFuZCB1c2VkIGF0IHBvbGljeSBsb2FkIHRpbWUuCi0JICBJdCBjYW4gYmUgYWRqdXN0ZWQgZG93bndhcmQgdG8gc3VwcG9ydCBsZWdhY3kgdXNlcmxhbmQgKGluaXQpIHRoYXQKLQkgIGRvZXMgbm90IGNvcnJlY3RseSBoYW5kbGUga2VybmVscyB0aGF0IHN1cHBvcnQgbmV3ZXIgcG9saWN5IHZlcnNpb25zLgotCi0JICBFeGFtcGxlczoKLQkgIEZvciB0aGUgRmVkb3JhIENvcmUgMyBvciA0IExpbnV4IGRpc3RyaWJ1dGlvbnMsIGVuYWJsZSB0aGlzIG9wdGlvbgotCSAgYW5kIHNldCB0aGUgdmFsdWUgdmlhIHRoZSBuZXh0IG9wdGlvbi4gRm9yIEZlZG9yYSBDb3JlIDUgYW5kIGxhdGVyLAotCSAgZG8gbm90IGVuYWJsZSB0aGlzIG9wdGlvbi4KLQotCSAgSWYgeW91IGFyZSB1bnN1cmUgaG93IHRvIGFuc3dlciB0aGlzIHF1ZXN0aW9uLCBhbnN3ZXIgTi4KLQotY29uZmlnIFNFQ1VSSVRZX1NFTElOVVhfUE9MSUNZREJfVkVSU0lPTl9NQVhfVkFMVUUKLQlpbnQgIk5TQSBTRUxpbnV4IG1heGltdW0gc3VwcG9ydGVkIHBvbGljeSBmb3JtYXQgdmVyc2lvbiB2YWx1ZSIKLQlkZXBlbmRzIG9uIFNFQ1VSSVRZX1NFTElOVVhfUE9MSUNZREJfVkVSU0lPTl9NQVgKLQlyYW5nZSAxNSAyMwotCWRlZmF1bHQgMTkKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBzZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIG1heGltdW0gcG9saWN5IGZvcm1hdCB2ZXJzaW9uCi0JICBzdXBwb3J0ZWQgYnkgU0VMaW51eC4KLQotCSAgRXhhbXBsZXM6Ci0JICBGb3IgRmVkb3JhIENvcmUgMywgdXNlIDE4LgotCSAgRm9yIEZlZG9yYSBDb3JlIDQsIHVzZSAxOS4KLQotCSAgSWYgeW91IGFyZSB1bnN1cmUgaG93IHRvIGFuc3dlciB0aGlzIHF1ZXN0aW9uLCBsb29rIGZvciB0aGUKLQkgIHBvbGljeSBmb3JtYXQgdmVyc2lvbiBzdXBwb3J0ZWQgYnkgeW91ciBwb2xpY3kgdG9vbGNoYWluLCBieQotCSAgcnVubmluZyAnY2hlY2twb2xpY3kgLVYnLiBPciBsb29rIGF0IHdoYXQgcG9saWN5IHlvdSBoYXZlCi0JICBpbnN0YWxsZWQgdW5kZXIgL2V0Yy9zZWxpbnV4LyRTRUxJTlVYVFlQRS9wb2xpY3ksIHdoZXJlCi0JICBTRUxJTlVYVFlQRSBpcyBkZWZpbmVkIGluIHlvdXIgL2V0Yy9zZWxpbnV4L2NvbmZpZy4KLQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jIGIvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCmluZGV4IDEzMTg1YTYuLjIyMDVlYTIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKQEAgLTE3NjEsOCArMTc2MSw4IEBACiB7CiAJc3RydWN0IGNvbW1vbl9hdWRpdF9kYXRhIGFkOwogCi0JYWQudHlwZSA9IExTTV9BVURJVF9EQVRBX1BBVEg7Ci0JYWQudS5wYXRoID0gZmlsZS0+Zl9wYXRoOworCWFkLnR5cGUgPSBMU01fQVVESVRfREFUQV9GSUxFOworCWFkLnUuZmlsZSA9IGZpbGU7CiAJcmV0dXJuIGlub2RlX2hhc19wZXJtKGNyZWQsIGZpbGVfaW5vZGUoZmlsZSksIGF2LCAmYWQpOwogfQogCkBAIC0xNzg0LDggKzE3ODQsOCBAQAogCXUzMiBzaWQgPSBjcmVkX3NpZChjcmVkKTsKIAlpbnQgcmM7CiAKLQlhZC50eXBlID0gTFNNX0FVRElUX0RBVEFfUEFUSDsKLQlhZC51LnBhdGggPSBmaWxlLT5mX3BhdGg7CisJYWQudHlwZSA9IExTTV9BVURJVF9EQVRBX0ZJTEU7CisJYWQudS5maWxlID0gZmlsZTsKIAogCWlmIChzaWQgIT0gZnNlYy0+c2lkKSB7CiAJCXJjID0gYXZjX2hhc19wZXJtKHNpZCwgZnNlYy0+c2lkLApAQCAtMTgwOCwxMyArMTgwOCwxMyBAQAogLyoKICAqIERldGVybWluZSB0aGUgbGFiZWwgZm9yIGFuIGlub2RlIHRoYXQgbWlnaHQgYmUgdW5pb25lZC4KICAqLwotc3RhdGljIGludCBzZWxpbnV4X2RldGVybWluZV9pbm9kZV9sYWJlbChzdHJ1Y3QgaW5vZGUgKmRpciwKLQkJCQkJIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lLAotCQkJCQkgdTE2IHRjbGFzcywKLQkJCQkJIHUzMiAqX25ld19pc2lkKQorc3RhdGljIGludAorc2VsaW51eF9kZXRlcm1pbmVfaW5vZGVfbGFiZWwoY29uc3Qgc3RydWN0IHRhc2tfc2VjdXJpdHlfc3RydWN0ICp0c2VjLAorCQkJCSBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCQkgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUsIHUxNiB0Y2xhc3MsCisJCQkJIHUzMiAqX25ld19pc2lkKQogewogCWNvbnN0IHN0cnVjdCBzdXBlcmJsb2NrX3NlY3VyaXR5X3N0cnVjdCAqc2JzZWMgPSBkaXItPmlfc2ItPnNfc2VjdXJpdHk7Ci0JY29uc3Qgc3RydWN0IHRhc2tfc2VjdXJpdHlfc3RydWN0ICp0c2VjID0gY3VycmVudF9zZWN1cml0eSgpOwogCiAJaWYgKChzYnNlYy0+ZmxhZ3MgJiBTRV9TQklOSVRJQUxJWkVEKSAmJgogCSAgICAoc2JzZWMtPmJlaGF2aW9yID09IFNFQ1VSSVRZX0ZTX1VTRV9NTlRQT0lOVCkpIHsKQEAgLTE4NTcsOCArMTg1Nyw4IEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlyYyA9IHNlbGludXhfZGV0ZXJtaW5lX2lub2RlX2xhYmVsKGRpciwgJmRlbnRyeS0+ZF9uYW1lLCB0Y2xhc3MsCi0JCQkJCSAgICZuZXdzaWQpOworCXJjID0gc2VsaW51eF9kZXRlcm1pbmVfaW5vZGVfbGFiZWwoY3VycmVudF9zZWN1cml0eSgpLCBkaXIsCisJCQkJCSAgICZkZW50cnktPmRfbmFtZSwgdGNsYXNzLCAmbmV3c2lkKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIApAQCAtMjM2NSw4ICsyMzY1LDggQEAKIAkJCW5ld190c2VjLT5zaWQgPSBvbGRfdHNlYy0+c2lkOwogCX0KIAotCWFkLnR5cGUgPSBMU01fQVVESVRfREFUQV9QQVRIOwotCWFkLnUucGF0aCA9IGJwcm0tPmZpbGUtPmZfcGF0aDsKKwlhZC50eXBlID0gTFNNX0FVRElUX0RBVEFfRklMRTsKKwlhZC51LmZpbGUgPSBicHJtLT5maWxlOwogCiAJaWYgKG5ld190c2VjLT5zaWQgPT0gb2xkX3RzZWMtPnNpZCkgewogCQlyYyA9IGF2Y19oYXNfcGVybShvbGRfdHNlYy0+c2lkLCBpc2VjLT5zaWQsCkBAIC0yODM4LDcgKzI4MzgsOCBAQAogCXUzMiBuZXdzaWQ7CiAJaW50IHJjOwogCi0JcmMgPSBzZWxpbnV4X2RldGVybWluZV9pbm9kZV9sYWJlbChkX2lub2RlKGRlbnRyeS0+ZF9wYXJlbnQpLCBuYW1lLAorCXJjID0gc2VsaW51eF9kZXRlcm1pbmVfaW5vZGVfbGFiZWwoY3VycmVudF9zZWN1cml0eSgpLAorCQkJCQkgICBkX2lub2RlKGRlbnRyeS0+ZF9wYXJlbnQpLCBuYW1lLAogCQkJCQkgICBpbm9kZV9tb2RlX3RvX3NlY3VyaXR5X2NsYXNzKG1vZGUpLAogCQkJCQkgICAmbmV3c2lkKTsKIAlpZiAocmMpCkBAIC0yODQ3LDYgKzI4NDgsMjcgQEAKIAlyZXR1cm4gc2VjdXJpdHlfc2lkX3RvX2NvbnRleHQobmV3c2lkLCAoY2hhciAqKiljdHgsIGN0eGxlbik7CiB9CiAKK3N0YXRpYyBpbnQgc2VsaW51eF9kZW50cnlfY3JlYXRlX2ZpbGVzX2FzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisJCQkJCSAgc3RydWN0IHFzdHIgKm5hbWUsCisJCQkJCSAgY29uc3Qgc3RydWN0IGNyZWQgKm9sZCwKKwkJCQkJICBzdHJ1Y3QgY3JlZCAqbmV3KQoreworCXUzMiBuZXdzaWQ7CisJaW50IHJjOworCXN0cnVjdCB0YXNrX3NlY3VyaXR5X3N0cnVjdCAqdHNlYzsKKworCXJjID0gc2VsaW51eF9kZXRlcm1pbmVfaW5vZGVfbGFiZWwob2xkLT5zZWN1cml0eSwKKwkJCQkJICAgZF9pbm9kZShkZW50cnktPmRfcGFyZW50KSwgbmFtZSwKKwkJCQkJICAgaW5vZGVfbW9kZV90b19zZWN1cml0eV9jbGFzcyhtb2RlKSwKKwkJCQkJICAgJm5ld3NpZCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwl0c2VjID0gbmV3LT5zZWN1cml0eTsKKwl0c2VjLT5jcmVhdGVfc2lkID0gbmV3c2lkOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHNlbGludXhfaW5vZGVfaW5pdF9zZWN1cml0eShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaW5vZGUgKmRpciwKIAkJCQkgICAgICAgY29uc3Qgc3RydWN0IHFzdHIgKnFzdHIsCiAJCQkJICAgICAgIGNvbnN0IGNoYXIgKipuYW1lLApAQCAtMjg2Myw3ICsyODg1LDcgQEAKIAlzaWQgPSB0c2VjLT5zaWQ7CiAJbmV3c2lkID0gdHNlYy0+Y3JlYXRlX3NpZDsKIAotCXJjID0gc2VsaW51eF9kZXRlcm1pbmVfaW5vZGVfbGFiZWwoCisJcmMgPSBzZWxpbnV4X2RldGVybWluZV9pbm9kZV9sYWJlbChjdXJyZW50X3NlY3VyaXR5KCksCiAJCWRpciwgcXN0ciwKIAkJaW5vZGVfbW9kZV90b19zZWN1cml0eV9jbGFzcyhpbm9kZS0+aV9tb2RlKSwKIAkJJm5ld3NpZCk7CkBAIC0zMjkzLDYgKzMzMTUsNDEgQEAKIAkqc2VjaWQgPSBpc2VjLT5zaWQ7CiB9CiAKK3N0YXRpYyBpbnQgc2VsaW51eF9pbm9kZV9jb3B5X3VwKHN0cnVjdCBkZW50cnkgKnNyYywgc3RydWN0IGNyZWQgKipuZXcpCit7CisJdTMyIHNpZDsKKwlzdHJ1Y3QgdGFza19zZWN1cml0eV9zdHJ1Y3QgKnRzZWM7CisJc3RydWN0IGNyZWQgKm5ld19jcmVkcyA9ICpuZXc7CisKKwlpZiAobmV3X2NyZWRzID09IE5VTEwpIHsKKwkJbmV3X2NyZWRzID0gcHJlcGFyZV9jcmVkcygpOworCQlpZiAoIW5ld19jcmVkcykKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCXRzZWMgPSBuZXdfY3JlZHMtPnNlY3VyaXR5OworCS8qIEdldCBsYWJlbCBmcm9tIG92ZXJsYXkgaW5vZGUgYW5kIHNldCBpdCBpbiBjcmVhdGVfc2lkICovCisJc2VsaW51eF9pbm9kZV9nZXRzZWNpZChkX2lub2RlKHNyYyksICZzaWQpOworCXRzZWMtPmNyZWF0ZV9zaWQgPSBzaWQ7CisJKm5ldyA9IG5ld19jcmVkczsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZWxpbnV4X2lub2RlX2NvcHlfdXBfeGF0dHIoY29uc3QgY2hhciAqbmFtZSkKK3sKKwkvKiBUaGUgY29weV91cCBob29rIGFib3ZlIHNldHMgdGhlIGluaXRpYWwgY29udGV4dCBvbiBhbiBpbm9kZSwgYnV0IHdlCisJICogZG9uJ3QgdGhlbiB3YW50IHRvIG92ZXJ3cml0ZSBpdCBieSBibGluZGx5IGNvcHlpbmcgYWxsIHRoZSBsb3dlcgorCSAqIHhhdHRycyB1cC4gIEluc3RlYWQsIHdlIGhhdmUgdG8gZmlsdGVyIG91dCBTRUxpbnV4LXJlbGF0ZWQgeGF0dHJzLgorCSAqLworCWlmIChzdHJjbXAobmFtZSwgWEFUVFJfTkFNRV9TRUxJTlVYKSA9PSAwKQorCQlyZXR1cm4gMTsgLyogRGlzY2FyZCAqLworCS8qCisJICogQW55IG90aGVyIGF0dHJpYnV0ZSBhcGFydCBmcm9tIFNFTElOVVggaXMgbm90IGNsYWltZWQsIHN1cHBvcnRlZAorCSAqIGJ5IHNlbGludXguCisJICovCisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCiAvKiBmaWxlIHNlY3VyaXR5IG9wZXJhdGlvbnMgKi8KIAogc3RhdGljIGludCBzZWxpbnV4X3JldmFsaWRhdGVfZmlsZV9wZXJtaXNzaW9uKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgbWFzaykKQEAgLTM3NzYsOCArMzgzMyw4IEBACiAKIAkvKiBmaW5pdF9tb2R1bGUgKi8KIAotCWFkLnR5cGUgPSBMU01fQVVESVRfREFUQV9QQVRIOwotCWFkLnUucGF0aCA9IGZpbGUtPmZfcGF0aDsKKwlhZC50eXBlID0gTFNNX0FVRElUX0RBVEFfRklMRTsKKwlhZC51LmZpbGUgPSBmaWxlOwogCiAJZnNlYyA9IGZpbGUtPmZfc2VjdXJpdHk7CiAJaWYgKHNpZCAhPSBmc2VjLT5zaWQpIHsKQEAgLTM5ODQsNyArNDA0MSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAKIC8qIFJldHVybnMgZXJyb3Igb25seSBpZiB1bmFibGUgdG8gcGFyc2UgYWRkcmVzc2VzICovCiBzdGF0aWMgaW50IHNlbGludXhfcGFyc2Vfc2tiX2lwdjYoc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTQwNzUsNyArNDEzMiw3IEBACiAJCQkJICAgICAgICZhZC0+dS5uZXQtPnY0aW5mby5kYWRkcik7CiAJCWdvdG8gb2theTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJY2FzZSBQRl9JTkVUNjoKIAkJcmV0ID0gc2VsaW51eF9wYXJzZV9za2JfaXB2Nihza2IsIGFkLCBwcm90byk7CiAJCWlmIChyZXQpCkBAIC01MDI5LDcgKzUwODYsNyBAQAogCXJldHVybiBzZWxpbnV4X2lwX2ZvcndhcmQoc2tiLCBzdGF0ZS0+aW4sIFBGX0lORVQpOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2VsaW51eF9pcHY2X2ZvcndhcmQodm9pZCAqcHJpdiwKIAkJCQkJIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJCSBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCkBAIC01MDg3LDcgKzUxNDQsNyBAQAogCXJldHVybiBzZWxpbnV4X2lwX291dHB1dChza2IsIFBGX0lORVQpOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2VsaW51eF9pcHY2X291dHB1dCh2b2lkICpwcml2LAogCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQljb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCkBAIC01MjczLDcgKzUzMzAsNyBAQAogCXJldHVybiBzZWxpbnV4X2lwX3Bvc3Ryb3V0ZShza2IsIHN0YXRlLT5vdXQsIFBGX0lORVQpOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2VsaW51eF9pcHY2X3Bvc3Ryb3V0ZSh2b2lkICpwcml2LAogCQkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQkgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCkBAIC02MDYyLDYgKzYxMTksNyBAQAogCUxTTV9IT09LX0lOSVQoc2JfcGFyc2Vfb3B0c19zdHIsIHNlbGludXhfcGFyc2Vfb3B0c19zdHIpLAogCiAJTFNNX0hPT0tfSU5JVChkZW50cnlfaW5pdF9zZWN1cml0eSwgc2VsaW51eF9kZW50cnlfaW5pdF9zZWN1cml0eSksCisJTFNNX0hPT0tfSU5JVChkZW50cnlfY3JlYXRlX2ZpbGVzX2FzLCBzZWxpbnV4X2RlbnRyeV9jcmVhdGVfZmlsZXNfYXMpLAogCiAJTFNNX0hPT0tfSU5JVChpbm9kZV9hbGxvY19zZWN1cml0eSwgc2VsaW51eF9pbm9kZV9hbGxvY19zZWN1cml0eSksCiAJTFNNX0hPT0tfSU5JVChpbm9kZV9mcmVlX3NlY3VyaXR5LCBzZWxpbnV4X2lub2RlX2ZyZWVfc2VjdXJpdHkpLApAQCAtNjA4OCw2ICs2MTQ2LDggQEAKIAlMU01fSE9PS19JTklUKGlub2RlX3NldHNlY3VyaXR5LCBzZWxpbnV4X2lub2RlX3NldHNlY3VyaXR5KSwKIAlMU01fSE9PS19JTklUKGlub2RlX2xpc3RzZWN1cml0eSwgc2VsaW51eF9pbm9kZV9saXN0c2VjdXJpdHkpLAogCUxTTV9IT09LX0lOSVQoaW5vZGVfZ2V0c2VjaWQsIHNlbGludXhfaW5vZGVfZ2V0c2VjaWQpLAorCUxTTV9IT09LX0lOSVQoaW5vZGVfY29weV91cCwgc2VsaW51eF9pbm9kZV9jb3B5X3VwKSwKKwlMU01fSE9PS19JTklUKGlub2RlX2NvcHlfdXBfeGF0dHIsIHNlbGludXhfaW5vZGVfY29weV91cF94YXR0ciksCiAKIAlMU01fSE9PS19JTklUKGZpbGVfcGVybWlzc2lvbiwgc2VsaW51eF9maWxlX3Blcm1pc3Npb24pLAogCUxTTV9IT09LX0lOSVQoZmlsZV9hbGxvY19zZWN1cml0eSwgc2VsaW51eF9maWxlX2FsbG9jX3NlY3VyaXR5KSwKQEAgLTYzMTcsNyArNjM3Nyw3IEBACiAJCS5ob29rbnVtID0JTkZfSU5FVF9MT0NBTF9PVVQsCiAJCS5wcmlvcml0eSA9CU5GX0lQX1BSSV9TRUxJTlVYX0ZJUlNULAogCX0sCi0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAl7CiAJCS5ob29rID0JCXNlbGludXhfaXB2Nl9wb3N0cm91dGUsCiAJCS5wZiA9CQlORlBST1RPX0lQVjYsCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvc2VjdXJpdHkuaCBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9zZWN1cml0eS5oCmluZGV4IDM4ZmViNTUuLjMwOGEyODYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9zZWN1cml0eS5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9zZWN1cml0eS5oCkBAIC0zOSwxMSArMzksNyBAQAogCiAvKiBSYW5nZSBvZiBwb2xpY3kgdmVyc2lvbnMgd2UgdW5kZXJzdGFuZCovCiAjZGVmaW5lIFBPTElDWURCX1ZFUlNJT05fTUlOICAgUE9MSUNZREJfVkVSU0lPTl9CQVNFCi0jaWZkZWYgQ09ORklHX1NFQ1VSSVRZX1NFTElOVVhfUE9MSUNZREJfVkVSU0lPTl9NQVgKLSNkZWZpbmUgUE9MSUNZREJfVkVSU0lPTl9NQVgJQ09ORklHX1NFQ1VSSVRZX1NFTElOVVhfUE9MSUNZREJfVkVSU0lPTl9NQVhfVkFMVUUKLSNlbHNlCiAjZGVmaW5lIFBPTElDWURCX1ZFUlNJT05fTUFYCVBPTElDWURCX1ZFUlNJT05fWFBFUk1TX0lPQ1RMCi0jZW5kaWYKIAogLyogTWFzayBmb3IganVzdCB0aGUgbW91bnQgcmVsYXRlZCBmbGFncyAqLwogI2RlZmluZSBTRV9NTlRNQVNLCTB4MGYKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3MvY29uZGl0aW9uYWwuYyBiL3NlY3VyaXR5L3NlbGludXgvc3MvY29uZGl0aW9uYWwuYwppbmRleCA0NTZlMWE5Li4zNGFmZWFkIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL2NvbmRpdGlvbmFsLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9jb25kaXRpb25hbC5jCkBAIC0yNDIsNiArMjQyLDggQEAKIAkJZ290byBlcnI7CiAKIAlsZW4gPSBsZTMyX3RvX2NwdShidWZbMl0pOworCWlmICgoKGxlbiA9PSAwKSB8fCAobGVuID09ICh1MzIpLTEpKSkKKwkJZ290byBlcnI7CiAKIAlyYyA9IC1FTk9NRU07CiAJa2V5ID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3MvZWJpdG1hcC5jIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9lYml0bWFwLmMKaW5kZXggODk0YjZjZC4uN2QxMGU1ZCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9lYml0bWFwLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9lYml0bWFwLmMKQEAgLTM3NCw2ICszNzQsOSBAQAogCQlnb3RvIG9rOwogCX0KIAorCWlmIChlLT5oaWdoYml0ICYmICFjb3VudCkKKwkJZ290byBiYWQ7CisKIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogCQlyYyA9IG5leHRfZW50cnkoJnN0YXJ0Yml0LCBmcCwgc2l6ZW9mKHUzMikpOwogCQlpZiAocmMgPCAwKSB7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmMKaW5kZXggOTkyYTMxNS4uYWNlNjgzOCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3MvcG9saWN5ZGIuYwpAQCAtNTQxLDIxICs1NDEsMjEgQEAKIAogCXJjID0gLUVOT01FTTsKIAlwLT5jbGFzc192YWxfdG9fc3RydWN0ID0KLQkJa21hbGxvYyhwLT5wX2NsYXNzZXMubnByaW0gKiBzaXplb2YoKihwLT5jbGFzc192YWxfdG9fc3RydWN0KSksCisJCWt6YWxsb2MocC0+cF9jbGFzc2VzLm5wcmltICogc2l6ZW9mKCoocC0+Y2xhc3NfdmFsX3RvX3N0cnVjdCkpLAogCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFwLT5jbGFzc192YWxfdG9fc3RydWN0KQogCQlnb3RvIG91dDsKIAogCXJjID0gLUVOT01FTTsKIAlwLT5yb2xlX3ZhbF90b19zdHJ1Y3QgPQotCQlrbWFsbG9jKHAtPnBfcm9sZXMubnByaW0gKiBzaXplb2YoKihwLT5yb2xlX3ZhbF90b19zdHJ1Y3QpKSwKKwkJa3phbGxvYyhwLT5wX3JvbGVzLm5wcmltICogc2l6ZW9mKCoocC0+cm9sZV92YWxfdG9fc3RydWN0KSksCiAJCQlHRlBfS0VSTkVMKTsKIAlpZiAoIXAtPnJvbGVfdmFsX3RvX3N0cnVjdCkKIAkJZ290byBvdXQ7CiAKIAlyYyA9IC1FTk9NRU07CiAJcC0+dXNlcl92YWxfdG9fc3RydWN0ID0KLQkJa21hbGxvYyhwLT5wX3VzZXJzLm5wcmltICogc2l6ZW9mKCoocC0+dXNlcl92YWxfdG9fc3RydWN0KSksCisJCWt6YWxsb2MocC0+cF91c2Vycy5ucHJpbSAqIHNpemVvZigqKHAtPnVzZXJfdmFsX3RvX3N0cnVjdCkpLAogCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFwLT51c2VyX3ZhbF90b19zdHJ1Y3QpCiAJCWdvdG8gb3V0OwpAQCAtOTY0LDcgKzk2NCw3IEBACiAJCSAqIFJvbGUgbXVzdCBiZSBhdXRob3JpemVkIGZvciB0aGUgdHlwZS4KIAkJICovCiAJCXJvbGUgPSBwLT5yb2xlX3ZhbF90b19zdHJ1Y3RbYy0+cm9sZSAtIDFdOwotCQlpZiAoIWViaXRtYXBfZ2V0X2JpdCgmcm9sZS0+dHlwZXMsIGMtPnR5cGUgLSAxKSkKKwkJaWYgKCFyb2xlIHx8ICFlYml0bWFwX2dldF9iaXQoJnJvbGUtPnR5cGVzLCBjLT50eXBlIC0gMSkpCiAJCQkvKiByb2xlIG1heSBub3QgYmUgYXNzb2NpYXRlZCB3aXRoIHR5cGUgKi8KIAkJCXJldHVybiAwOwogCkBAIC0xMDk0LDYgKzEwOTQsOSBAQAogCWludCByYzsKIAljaGFyICpzdHI7CiAKKwlpZiAoKGxlbiA9PSAwKSB8fCAobGVuID09ICh1MzIpLTEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCXN0ciA9IGttYWxsb2MobGVuICsgMSwgZmxhZ3MpOwogCWlmICghc3RyKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTI0MTQsNiArMjQxNyw3IEBACiAJCX0gZWxzZQogCQkJdHItPnRjbGFzcyA9IHAtPnByb2Nlc3NfY2xhc3M7CiAKKwkJcmMgPSAtRUlOVkFMOwogCQlpZiAoIXBvbGljeWRiX3JvbGVfaXN2YWxpZChwLCB0ci0+cm9sZSkgfHwKIAkJICAgICFwb2xpY3lkYl90eXBlX2lzdmFsaWQocCwgdHItPnR5cGUpIHx8CiAJCSAgICAhcG9saWN5ZGJfY2xhc3NfaXN2YWxpZChwLCB0ci0+dGNsYXNzKSB8fApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc21hY2svS2NvbmZpZyBiL3NlY3VyaXR5L3NtYWNrL0tjb25maWcKaW5kZXggMjcxYWRhZS4uOTIzYjEyMCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc21hY2svS2NvbmZpZworKysgYi9zZWN1cml0eS9zbWFjay9LY29uZmlnCkBAIC00MCwzICs0MCwxNSBAQAogCSAgVGhpcyBlbmFibGVzIHNlY3VyaXR5IG1hcmtpbmcgb2YgbmV0d29yayBwYWNrZXRzIHVzaW5nCiAJICBTbWFjayBsYWJlbHMuCiAJICBJZiB5b3UgYXJlIHVuc3VyZSBob3cgdG8gYW5zd2VyIHRoaXMgcXVlc3Rpb24sIGFuc3dlciBOLgorCitjb25maWcgU0VDVVJJVFlfU01BQ0tfQVBQRU5EX1NJR05BTFMKKwlib29sICJUcmVhdCBkZWxpdmVyaW5nIHNpZ25hbHMgYXMgYW4gYXBwZW5kIG9wZXJhdGlvbiIKKwlkZXBlbmRzIG9uIFNFQ1VSSVRZX1NNQUNLCisJZGVmYXVsdCBuCisJaGVscAorCSAgU2VuZGluZyBhIHNpZ25hbCBoYXMgYmVlbiB0cmVhdGVkIGFzIGEgd3JpdGUgb3BlcmF0aW9uIHRvIHRoZQorCSAgcmVjZWl2aW5nIHByb2Nlc3MuIElmIHRoaXMgb3B0aW9uIGlzIHNlbGVjdGVkLCB0aGUgZGVsaXZlcnkKKwkgIHdpbGwgYmUgYW4gYXBwZW5kIG9wZXJhdGlvbiBpbnN0ZWFkLiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlCisJICB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gZGVsaXZlcmluZyBhIG5ldHdvcmsgcGFja2V0IGFuZAorCSAgZGVsaXZlcmluZyBhIHNpZ25hbCBpbiB0aGUgU21hY2sgcnVsZXMuCisJICBJZiB5b3UgYXJlIHVuc3VyZSBob3cgdG8gYW5zd2VyIHRoaXMgcXVlc3Rpb24sIGFuc3dlciBOLgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc21hY2svc21hY2suaCBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrLmgKaW5kZXggMjZlNThmMS4uNTFmZDMwMSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc21hY2svc21hY2suaAorKysgYi9zZWN1cml0eS9zbWFjay9zbWFjay5oCkBAIC0yNTYsNiArMjU2LDE2IEBACiAjZGVmaW5lIE1BWV9MT0NLCTB4MDAwMDIwMDAJLyogTG9ja3Mgc2hvdWxkIGJlIHdyaXRlcywgYnV0IC4uLiAqLwogI2RlZmluZSBNQVlfQlJJTkdVUAkweDAwMDA0MDAwCS8qIFJlcG9ydCB1c2Ugb2YgdGhpcyBydWxlICovCiAKKy8qCisgKiBUaGUgcG9saWN5IGZvciBkZWxpdmVyaW5nIHNpZ25hbHMgaXMgY29uZmlndXJhYmxlLgorICogSXQgaXMgdXN1YWxseSAid3JpdGUiLCBidXQgY2FuIGJlICJhcHBlbmQiLgorICovCisjaWZkZWYgQ09ORklHX1NFQ1VSSVRZX1NNQUNLX0FQUEVORF9TSUdOQUxTCisjZGVmaW5lIE1BWV9ERUxJVkVSCU1BWV9BUFBFTkQJLyogU2lnbmFsIGRlbGl2ZXJ5IHJlcXVpcmVzIGFwcGVuZCAqLworI2Vsc2UKKyNkZWZpbmUgTUFZX0RFTElWRVIJTUFZX1dSSVRFCS8qIFNpZ25hbCBkZWxpdmVyeSByZXF1aXJlcyB3cml0ZSAqLworI2VuZGlmCisKICNkZWZpbmUgU01BQ0tfQlJJTkdVUF9BTExPVwkJMQkvKiBBbGxvdyBicmluZ3VwIG1vZGUgKi8KICNkZWZpbmUgU01BQ0tfVU5DT05GSU5FRF9TVUJKRUNUCTIJLyogQWxsb3cgdW5jb25maW5lZCBsYWJlbCAqLwogI2RlZmluZSBTTUFDS19VTkNPTkZJTkVEX09CSkVDVAkJMwkvKiBBbGxvdyB1bmNvbmZpbmVkIGxhYmVsICovCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zbWFjay9zbWFja19sc20uYyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2xzbS5jCmluZGV4IDg3YTk3NDEuLmNhZWMyMjUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2xzbS5jCisrKyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2xzbS5jCkBAIC0xODU3LDE0ICsxODU3LDE0IEBACiAKIAkvKiB3ZSBkb24ndCBsb2cgaGVyZSBhcyByYyBjYW4gYmUgb3ZlcnJpZGVuICovCiAJc2twID0gZmlsZS0+Zl9zZWN1cml0eTsKLQlyYyA9IHNta19hY2Nlc3Moc2twLCB0a3AsIE1BWV9XUklURSwgTlVMTCk7Ci0JcmMgPSBzbWtfYnVfbm90ZSgic2lnaW90YXNrIiwgc2twLCB0a3AsIE1BWV9XUklURSwgcmMpOworCXJjID0gc21rX2FjY2Vzcyhza3AsIHRrcCwgTUFZX0RFTElWRVIsIE5VTEwpOworCXJjID0gc21rX2J1X25vdGUoInNpZ2lvdGFzayIsIHNrcCwgdGtwLCBNQVlfREVMSVZFUiwgcmMpOwogCWlmIChyYyAhPSAwICYmIGhhc19jYXBhYmlsaXR5KHRzaywgQ0FQX01BQ19PVkVSUklERSkpCiAJCXJjID0gMDsKIAogCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX1RBU0spOwogCXNta19hZF9zZXRmaWVsZF91X3RzaygmYWQsIHRzayk7Ci0Jc21hY2tfbG9nKHNrcC0+c21rX2tub3duLCB0a3AtPnNta19rbm93biwgTUFZX1dSSVRFLCByYywgJmFkKTsKKwlzbWFja19sb2coc2twLT5zbWtfa25vd24sIHRrcC0+c21rX2tub3duLCBNQVlfREVMSVZFUiwgcmMsICZhZCk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0yMjY1LDggKzIyNjUsOCBAQAogCSAqIGNhbiB3cml0ZSB0aGUgcmVjZWl2ZXIuCiAJICovCiAJaWYgKHNlY2lkID09IDApIHsKLQkJcmMgPSBzbWtfY3VyYWNjKHRrcCwgTUFZX1dSSVRFLCAmYWQpOwotCQlyYyA9IHNta19idV90YXNrKHAsIE1BWV9XUklURSwgcmMpOworCQlyYyA9IHNta19jdXJhY2ModGtwLCBNQVlfREVMSVZFUiwgJmFkKTsKKwkJcmMgPSBzbWtfYnVfdGFzayhwLCBNQVlfREVMSVZFUiwgcmMpOwogCQlyZXR1cm4gcmM7CiAJfQogCS8qCkBAIC0yMjc1LDggKzIyNzUsOCBAQAogCSAqIHdlIGNhbid0IHRha2UgcHJpdmlsZWdlIGludG8gYWNjb3VudC4KIAkgKi8KIAlza3AgPSBzbWFja19mcm9tX3NlY2lkKHNlY2lkKTsKLQlyYyA9IHNta19hY2Nlc3Moc2twLCB0a3AsIE1BWV9XUklURSwgJmFkKTsKLQlyYyA9IHNta19idV9ub3RlKCJVU0Igc2lnbmFsIiwgc2twLCB0a3AsIE1BWV9XUklURSwgcmMpOworCXJjID0gc21rX2FjY2Vzcyhza3AsIHRrcCwgTUFZX0RFTElWRVIsICZhZCk7CisJcmMgPSBzbWtfYnVfbm90ZSgiVVNCIHNpZ25hbCIsIHNrcCwgdGtwLCBNQVlfREVMSVZFUiwgcmMpOwogCXJldHVybiByYzsKIH0KIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc21hY2svc21hY2tfbmV0ZmlsdGVyLmMgYi9zZWN1cml0eS9zbWFjay9zbWFja19uZXRmaWx0ZXIuYwppbmRleCBhYTZiZjFiLi4yMDViNzg1IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zbWFjay9zbWFja19uZXRmaWx0ZXIuYworKysgYi9zZWN1cml0eS9zbWFjay9zbWFja19uZXRmaWx0ZXIuYwpAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPG5ldC9pbmV0X3NvY2suaD4KICNpbmNsdWRlICJzbWFjay5oIgogCi0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAogc3RhdGljIHVuc2lnbmVkIGludCBzbWFja19pcHY2X291dHB1dCh2b2lkICpwcml2LAogCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtNjQsNyArNjQsNyBAQAogCQkuaG9va251bSA9CU5GX0lORVRfTE9DQUxfT1VULAogCQkucHJpb3JpdHkgPQlORl9JUF9QUklfU0VMSU5VWF9GSVJTVCwKIAl9LAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJewogCQkuaG9vayA9CQlzbWFja19pcHY2X291dHB1dCwKIAkJLnBmID0JCU5GUFJPVE9fSVBWNiwKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrZnMuYyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrZnMuYwppbmRleCBlMjQ5YTY2Li42NDkyZmU5IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zbWFjay9zbWFja2ZzLmMKKysrIGIvc2VjdXJpdHkvc21hY2svc21hY2tmcy5jCkBAIC0yNTIzLDE0ICsyNTIzLDkgQEAKIAlpZiAoY291bnQgPT0gMCB8fCBjb3VudCA+IFNNS19MT05HTEFCRUwpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZGF0YSA9IGt6YWxsb2MoY291bnQsIEdGUF9LRVJORUwpOwotCWlmIChkYXRhID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKGRhdGEsIGJ1ZiwgY291bnQpICE9IDApIHsKLQkJcmMgPSAtRUZBVUxUOwotCQlnb3RvIG91dF9kYXRhOwotCX0KKwlkYXRhID0gbWVtZHVwX3VzZXIoYnVmLCBjb3VudCk7CisJaWYgKElTX0VSUihkYXRhKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7CiAKIAljcCA9IHNta19wYXJzZV9zbWFjayhkYXRhLCBjb3VudCk7CiAJaWYgKElTX0VSUihjcCkpIHsKZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9mYWJyaWNzL2xheW91dC5jIGIvc291bmQvYW9hL2ZhYnJpY3MvbGF5b3V0LmMKaW5kZXggOGY3MWY3ZS4uYTBjNGE1ZCAxMDA2NDQKLS0tIGEvc291bmQvYW9hL2ZhYnJpY3MvbGF5b3V0LmMKKysrIGIvc291bmQvYW9hL2ZhYnJpY3MvbGF5b3V0LmMKQEAgLTExMiw2ICsxMTIsNyBAQAogCiBNT0RVTEVfQUxJQVMoImFvYS1kZXZpY2UtaWQtMTQiKTsKIE1PRFVMRV9BTElBUygiYW9hLWRldmljZS1pZC0yMiIpOworTU9EVUxFX0FMSUFTKCJhb2EtZGV2aWNlLWlkLTMxIik7CiBNT0RVTEVfQUxJQVMoImFvYS1kZXZpY2UtaWQtMzUiKTsKIE1PRFVMRV9BTElBUygiYW9hLWRldmljZS1pZC00NCIpOwogCkBAIC0zNjIsNiArMzYzLDEzIEBACiAJCS5jb25uZWN0aW9ucyA9IHRhc19jb25uZWN0aW9uc19ub2xpbmVvdXQsCiAJICB9LAogCX0sCisJLyogUG93ZXJCb29rNiwxICovCisJeyAuZGV2aWNlX2lkID0gMzEsCisJICAuY29kZWNzWzBdID0geworCQkubmFtZSA9ICJ0YXMiLAorCQkuY29ubmVjdGlvbnMgPSB0YXNfY29ubmVjdGlvbnNfbm9saW5lb3V0LAorCSAgfSwKKwl9LAogCS8qIFBvd2VyQm9vazYsNSAqLwogCXsgLmRldmljZV9pZCA9IDQ0LAogCSAgLmNvZGVjc1swXSA9IHsKQEAgLTExNjEsMTIgKzExNjksNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBhb2FfZmFicmljX2xheW91dF9pbml0KHZvaWQpCiB7Ci0JaW50IGVycjsKLQotCWVyciA9IHNvdW5kYnVzX3JlZ2lzdGVyX2RyaXZlcigmYW9hX3NvdW5kYnVzX2RyaXZlcik7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gc291bmRidXNfcmVnaXN0ZXJfZHJpdmVyKCZhb2Ffc291bmRidXNfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGFvYV9mYWJyaWNfbGF5b3V0X2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9zb3VuZGJ1cy9pMnNidXMvY29yZS5jIGIvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9jb3JlLmMKaW5kZXggMWNiZjIxMC4uMDAwYjU4NSAxMDA2NDQKLS0tIGEvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9jb3JlLmMKKysrIGIvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9jb3JlLmMKQEAgLTE5Nyw3ICsxOTcsNyBAQAogCQkJICogc28gcmVzdHJpY3QgdG8gdGhvc2Ugd2UgZG8gaGFuZGxlIGZvciBub3cuCiAJCQkgKi8KIAkJCWlmIChpZCAmJiAoKmlkID09IDIyIHx8ICppZCA9PSAxNCB8fCAqaWQgPT0gMzUgfHwKLQkJCQkgICAqaWQgPT0gNDQpKSB7CisJCQkJICAgKmlkID09IDMxIHx8ICppZCA9PSA0NCkpIHsKIAkJCQlzbnByaW50ZihkZXYtPnNvdW5kLm1vZGFsaWFzLCAzMiwKIAkJCQkJICJhb2EtZGV2aWNlLWlkLSVkIiwgKmlkKTsKIAkJCQlvayA9IDE7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2NvbXByZXNzX29mZmxvYWQuYyBiL3NvdW5kL2NvcmUvY29tcHJlc3Nfb2ZmbG9hZC5jCmluZGV4IDJjNDk4NDguLmZlYzFkZmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvY29tcHJlc3Nfb2ZmbG9hZC5jCisrKyBiL3NvdW5kL2NvcmUvY29tcHJlc3Nfb2ZmbG9hZC5jCkBAIC01NTMsMTMgKzU1Myw5IEBACiAJCSAqIHdlIHNob3VsZCBhbGxvdyBwYXJhbWV0ZXIgY2hhbmdlIG9ubHkgd2hlbiBzdHJlYW0gaGFzIGJlZW4KIAkJICogb3BlbmVkIG5vdCBpbiBvdGhlciBjYXNlcwogCQkgKi8KLQkJcGFyYW1zID0ga21hbGxvYyhzaXplb2YoKnBhcmFtcyksIEdGUF9LRVJORUwpOwotCQlpZiAoIXBhcmFtcykKLQkJCXJldHVybiAtRU5PTUVNOwotCQlpZiAoY29weV9mcm9tX3VzZXIocGFyYW1zLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZigqcGFyYW1zKSkpIHsKLQkJCXJldHZhbCA9IC1FRkFVTFQ7Ci0JCQlnb3RvIG91dDsKLQkJfQorCQlwYXJhbXMgPSBtZW1kdXBfdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZigqcGFyYW1zKSk7CisJCWlmIChJU19FUlIocGFyYW1zKSkKKwkJCXJldHVybiBQVFJfRVJSKHBhcmFtcyk7CiAKIAkJcmV0dmFsID0gc25kX2NvbXByZXNzX2NoZWNrX2lucHV0KHBhcmFtcyk7CiAJCWlmIChyZXR2YWwpCkBAIC03ODQsNyArNzgwLDcgQEAKIAlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoc3RyZWFtLT5ydW50aW1lLT5zbGVlcCwKIAkJCShzdHJlYW0tPnJ1bnRpbWUtPnN0YXRlICE9IFNORFJWX1BDTV9TVEFURV9EUkFJTklORykpOwogCWlmIChyZXQgPT0gLUVSRVNUQVJUU1lTKQotCQlwcl9kZWJ1Zygid2FpdCBhYm9ydGVkIGJ5IGEgc2lnbmFsIik7CisJCXByX2RlYnVnKCJ3YWl0IGFib3J0ZWQgYnkgYSBzaWduYWxcbiIpOwogCWVsc2UgaWYgKHJldCkKIAkJcHJfZGVidWcoIndhaXQgZm9yIGRyYWluIGZhaWxlZCB3aXRoICVkXG4iLCByZXQpOwogCkBAIC05NjYsNyArOTYyLDcgQEAKIAkJCQkgIGNvbXByLT5jYXJkLCBjb21wci0+ZGV2aWNlLAogCQkJCSAgJnNuZF9jb21wcl9maWxlX29wcywgY29tcHIsICZjb21wci0+ZGV2KTsKIAlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoInNuZF9yZWdpc3Rlcl9kZXZpY2UgZmFpbGVkXG4gJWQiLCByZXQpOworCQlwcl9lcnIoInNuZF9yZWdpc3Rlcl9kZXZpY2UgZmFpbGVkICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9wY21fbmF0aXZlLmMgYi9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYwppbmRleCBjNjFmZDUwLi45ZDMzYzFlIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYworKysgYi9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYwpAQCAtMjYzNyw5ICsyNjM3LDExIEBACiAJCQlicmVhazsKIAkJLyogRmFsbCB0aHJvdWdoICovCiAJY2FzZSBTTkRSVl9QQ01fU1RBVEVfUFJFUEFSRUQ6Ci0JY2FzZSBTTkRSVl9QQ01fU1RBVEVfU1VTUEVOREVEOgogCQllcnIgPSAwOwogCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9TVEFURV9TVVNQRU5ERUQ6CisJCWVyciA9IC1FU1RSUElQRTsKKwkJYnJlYWs7CiAJY2FzZSBTTkRSVl9QQ01fU1RBVEVfWFJVTjoKIAkJZXJyID0gLUVQSVBFOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcmF3bWlkaS5jIGIvc291bmQvY29yZS9yYXdtaWRpLmMKaW5kZXggNzk1NDM3Yi4uYjQ1MGEyNyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9yYXdtaWRpLmMKKysrIGIvc291bmQvY29yZS9yYXdtaWRpLmMKQEAgLTE2MzMsMTEgKzE2MzMsMTMgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJbGlzdF9hZGRfdGFpbCgmcm1pZGktPmxpc3QsICZzbmRfcmF3bWlkaV9kZXZpY2VzKTsKKwltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKIAllcnIgPSBzbmRfcmVnaXN0ZXJfZGV2aWNlKFNORFJWX0RFVklDRV9UWVBFX1JBV01JREksCiAJCQkJICBybWlkaS0+Y2FyZCwgcm1pZGktPmRldmljZSwKIAkJCQkgICZzbmRfcmF3bWlkaV9mX29wcywgcm1pZGksICZybWlkaS0+ZGV2KTsKIAlpZiAoZXJyIDwgMCkgewogCQlybWlkaV9lcnIocm1pZGksICJ1bmFibGUgdG8gcmVnaXN0ZXJcbiIpOworCQltdXRleF9sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CiAJCWxpc3RfZGVsKCZybWlkaS0+bGlzdCk7CiAJCW11dGV4X3VubG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwogCQlyZXR1cm4gZXJyOwpAQCAtMTY0NSw2ICsxNjQ3LDcgQEAKIAlpZiAocm1pZGktPm9wcyAmJiBybWlkaS0+b3BzLT5kZXZfcmVnaXN0ZXIgJiYKIAkgICAgKGVyciA9IHJtaWRpLT5vcHMtPmRldl9yZWdpc3RlcihybWlkaSkpIDwgMCkgewogCQlzbmRfdW5yZWdpc3Rlcl9kZXZpY2UoJnJtaWRpLT5kZXYpOworCQltdXRleF9sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CiAJCWxpc3RfZGVsKCZybWlkaS0+bGlzdCk7CiAJCW11dGV4X3VubG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwogCQlyZXR1cm4gZXJyOwpAQCAtMTY3Nyw3ICsxNjgwLDYgQEAKIAkJfQogCX0KICNlbmRpZiAvKiBDT05GSUdfU05EX09TU0VNVUwgKi8KLQltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKIAlzcHJpbnRmKG5hbWUsICJtaWRpJWQiLCBybWlkaS0+ZGV2aWNlKTsKIAllbnRyeSA9IHNuZF9pbmZvX2NyZWF0ZV9jYXJkX2VudHJ5KHJtaWRpLT5jYXJkLCBuYW1lLCBybWlkaS0+Y2FyZC0+cHJvY19yb290KTsKIAlpZiAoZW50cnkpIHsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9jbGllbnRtZ3IuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9jbGllbnRtZ3IuYwppbmRleCBkNmQ5NDE5Li40YzkzNTIwIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfY2xpZW50bWdyLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX2NsaWVudG1nci5jCkBAIC04NywyMSArODcsNiBAQAogCiAvKgogICovCi0gCi1zdGF0aWMgaW5saW5lIG1tX3NlZ21lbnRfdCBzbmRfZW50ZXJfdXNlcih2b2lkKQotewotCW1tX3NlZ21lbnRfdCBmcyA9IGdldF9mcygpOwotCXNldF9mcyhnZXRfZHMoKSk7Ci0JcmV0dXJuIGZzOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc25kX2xlYXZlX3VzZXIobW1fc2VnbWVudF90IGZzKQotewotCXNldF9mcyhmcyk7Ci19Ci0KLS8qCi0gKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgc25kX3NlcV9maWxlX2ZsYWdzKHN0cnVjdCBmaWxlICpmaWxlKQogewogICAgICAgICBzd2l0Y2ggKGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpKSB7CkBAIC0xMTI4LDU5ICsxMTEzLDY5IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCitzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfcHZlcnNpb24oc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsIHZvaWQgKmFyZykKK3sKKwlpbnQgKnB2ZXJzaW9uID0gYXJnOworCisJKnB2ZXJzaW9uID0gU05EUlZfU0VRX1ZFUlNJT047CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9jbGllbnRfaWQoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsIHZvaWQgKmFyZykKK3sKKwlpbnQgKmNsaWVudF9pZCA9IGFyZzsKKworCSpjbGllbnRfaWQgPSBjbGllbnQtPm51bWJlcjsKKwlyZXR1cm4gMDsKK30KIAogLyogU1lTVEVNX0lORk8gaW9jdGwoKSAqLwotc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX3N5c3RlbV9pbmZvKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LCB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX3N5c3RlbV9pbmZvKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LCB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IHNuZF9zZXFfc3lzdGVtX2luZm8gaW5mbzsKKwlzdHJ1Y3Qgc25kX3NlcV9zeXN0ZW1faW5mbyAqaW5mbyA9IGFyZzsKIAotCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CiAJLyogZmlsbCB0aGUgaW5mbyBmaWVsZHMgKi8KLQlpbmZvLnF1ZXVlcyA9IFNORFJWX1NFUV9NQVhfUVVFVUVTOwotCWluZm8uY2xpZW50cyA9IFNORFJWX1NFUV9NQVhfQ0xJRU5UUzsKLQlpbmZvLnBvcnRzID0gU05EUlZfU0VRX01BWF9QT1JUUzsKLQlpbmZvLmNoYW5uZWxzID0gMjU2OwkvKiBmaXhlZCBsaW1pdCAqLwotCWluZm8uY3VyX2NsaWVudHMgPSBjbGllbnRfdXNhZ2UuY3VyOwotCWluZm8uY3VyX3F1ZXVlcyA9IHNuZF9zZXFfcXVldWVfZ2V0X2N1cl9xdWV1ZXMoKTsKKwlpbmZvLT5xdWV1ZXMgPSBTTkRSVl9TRVFfTUFYX1FVRVVFUzsKKwlpbmZvLT5jbGllbnRzID0gU05EUlZfU0VRX01BWF9DTElFTlRTOworCWluZm8tPnBvcnRzID0gU05EUlZfU0VRX01BWF9QT1JUUzsKKwlpbmZvLT5jaGFubmVscyA9IDI1NjsJLyogZml4ZWQgbGltaXQgKi8KKwlpbmZvLT5jdXJfY2xpZW50cyA9IGNsaWVudF91c2FnZS5jdXI7CisJaW5mby0+Y3VyX3F1ZXVlcyA9IHNuZF9zZXFfcXVldWVfZ2V0X2N1cl9xdWV1ZXMoKTsKIAotCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIDA7CiB9CiAKIAogLyogUlVOTklOR19NT0RFIGlvY3RsKCkgKi8KLXN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9ydW5uaW5nX21vZGUoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfcnVubmluZ19tb2RlKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LCB2b2lkICAqYXJnKQogewotCXN0cnVjdCBzbmRfc2VxX3J1bm5pbmdfaW5mbyBpbmZvOworCXN0cnVjdCBzbmRfc2VxX3J1bm5pbmdfaW5mbyAqaW5mbyA9IGFyZzsKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNwdHI7CiAJaW50IGVyciA9IDA7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIGFyZywgc2l6ZW9mKGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KIAkvKiByZXF1ZXN0ZWQgY2xpZW50IG51bWJlciAqLwotCWNwdHIgPSBzbmRfc2VxX2NsaWVudF91c2VfcHRyKGluZm8uY2xpZW50KTsKKwljcHRyID0gc25kX3NlcV9jbGllbnRfdXNlX3B0cihpbmZvLT5jbGllbnQpOwogCWlmIChjcHRyID09IE5VTEwpCiAJCXJldHVybiAtRU5PRU5UOwkJLyogZG9uJ3QgY2hhbmdlICEhISAqLwogCiAjaWZkZWYgU05EUlZfQklHX0VORElBTgotCWlmICghIGluZm8uYmlnX2VuZGlhbikgeworCWlmICghaW5mby0+YmlnX2VuZGlhbikgewogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIF9fZXJyOwogCX0KICNlbHNlCi0JaWYgKGluZm8uYmlnX2VuZGlhbikgeworCWlmIChpbmZvLT5iaWdfZW5kaWFuKSB7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gX19lcnI7CiAJfQogCiAjZW5kaWYKLQlpZiAoaW5mby5jcHVfbW9kZSA+IHNpemVvZihsb25nKSkgeworCWlmIChpbmZvLT5jcHVfbW9kZSA+IHNpemVvZihsb25nKSkgewogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIF9fZXJyOwogCX0KLQljcHRyLT5jb252ZXJ0MzIgPSAoaW5mby5jcHVfbW9kZSA8IHNpemVvZihsb25nKSk7CisJY3B0ci0+Y29udmVydDMyID0gKGluZm8tPmNwdV9tb2RlIDwgc2l6ZW9mKGxvbmcpKTsKICBfX2VycjoKIAlzbmRfc2VxX2NsaWVudF91bmxvY2soY3B0cik7CiAJcmV0dXJuIGVycjsKQEAgLTEyMTQsNTEgKzEyMDksNDMgQEAKIH0KIAogc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX2dldF9jbGllbnRfaW5mbyhzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKLQkJCQkJIHZvaWQgX191c2VyICphcmcpCisJCQkJCSB2b2lkICphcmcpCiB7CisJc3RydWN0IHNuZF9zZXFfY2xpZW50X2luZm8gKmNsaWVudF9pbmZvID0gYXJnOwogCXN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY3B0cjsKLQlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfaW5mbyBjbGllbnRfaW5mbzsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmY2xpZW50X2luZm8sIGFyZywgc2l6ZW9mKGNsaWVudF9pbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwogCiAJLyogcmVxdWVzdGVkIGNsaWVudCBudW1iZXIgKi8KLQljcHRyID0gc25kX3NlcV9jbGllbnRfdXNlX3B0cihjbGllbnRfaW5mby5jbGllbnQpOworCWNwdHIgPSBzbmRfc2VxX2NsaWVudF91c2VfcHRyKGNsaWVudF9pbmZvLT5jbGllbnQpOwogCWlmIChjcHRyID09IE5VTEwpCiAJCXJldHVybiAtRU5PRU5UOwkJLyogZG9uJ3QgY2hhbmdlICEhISAqLwogCi0JZ2V0X2NsaWVudF9pbmZvKGNwdHIsICZjbGllbnRfaW5mbyk7CisJZ2V0X2NsaWVudF9pbmZvKGNwdHIsIGNsaWVudF9pbmZvKTsKIAlzbmRfc2VxX2NsaWVudF91bmxvY2soY3B0cik7CiAKLQlpZiAoY29weV90b191c2VyKGFyZywgJmNsaWVudF9pbmZvLCBzaXplb2YoY2xpZW50X2luZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIDA7CiB9CiAKIAogLyogQ0xJRU5UX0lORk8gaW9jdGwoKSAqLwogc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX3NldF9jbGllbnRfaW5mbyhzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKLQkJCQkJIHZvaWQgX191c2VyICphcmcpCisJCQkJCSB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IHNuZF9zZXFfY2xpZW50X2luZm8gY2xpZW50X2luZm87Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmNsaWVudF9pbmZvLCBhcmcsIHNpemVvZihjbGllbnRfaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKKwlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfaW5mbyAqY2xpZW50X2luZm8gPSBhcmc7CiAKIAkvKiBpdCBpcyBub3QgYWxsb3dlZCB0byBzZXQgdGhlIGluZm8gZmllbGRzIGZvciBhbiBhbm90aGVyIGNsaWVudCAqLwotCWlmIChjbGllbnQtPm51bWJlciAhPSBjbGllbnRfaW5mby5jbGllbnQpCisJaWYgKGNsaWVudC0+bnVtYmVyICE9IGNsaWVudF9pbmZvLT5jbGllbnQpCiAJCXJldHVybiAtRVBFUk07CiAJLyogYWxzbyBjbGllbnQgdHlwZSBtdXN0IGJlIHNldCBub3cgKi8KLQlpZiAoY2xpZW50LT50eXBlICE9IGNsaWVudF9pbmZvLnR5cGUpCisJaWYgKGNsaWVudC0+dHlwZSAhPSBjbGllbnRfaW5mby0+dHlwZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBmaWxsIHRoZSBpbmZvIGZpZWxkcyAqLwotCWlmIChjbGllbnRfaW5mby5uYW1lWzBdKQotCQlzdHJsY3B5KGNsaWVudC0+bmFtZSwgY2xpZW50X2luZm8ubmFtZSwgc2l6ZW9mKGNsaWVudC0+bmFtZSkpOworCWlmIChjbGllbnRfaW5mby0+bmFtZVswXSkKKwkJc3RybGNweShjbGllbnQtPm5hbWUsIGNsaWVudF9pbmZvLT5uYW1lLCBzaXplb2YoY2xpZW50LT5uYW1lKSk7CiAKLQljbGllbnQtPmZpbHRlciA9IGNsaWVudF9pbmZvLmZpbHRlcjsKLQljbGllbnQtPmV2ZW50X2xvc3QgPSBjbGllbnRfaW5mby5ldmVudF9sb3N0OwotCW1lbWNweShjbGllbnQtPmV2ZW50X2ZpbHRlciwgY2xpZW50X2luZm8uZXZlbnRfZmlsdGVyLCAzMik7CisJY2xpZW50LT5maWx0ZXIgPSBjbGllbnRfaW5mby0+ZmlsdGVyOworCWNsaWVudC0+ZXZlbnRfbG9zdCA9IGNsaWVudF9pbmZvLT5ldmVudF9sb3N0OworCW1lbWNweShjbGllbnQtPmV2ZW50X2ZpbHRlciwgY2xpZW50X2luZm8tPmV2ZW50X2ZpbHRlciwgMzIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMjY3LDMwICsxMjU0LDI2IEBACiAvKiAKICAqIENSRUFURSBQT1JUIGlvY3RsKCkgCiAgKi8KLXN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9jcmVhdGVfcG9ydChzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKLQkJCQkgICAgIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfY3JlYXRlX3BvcnQoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsIHZvaWQgKmFyZykKIHsKKwlzdHJ1Y3Qgc25kX3NlcV9wb3J0X2luZm8gKmluZm8gPSBhcmc7CiAJc3RydWN0IHNuZF9zZXFfY2xpZW50X3BvcnQgKnBvcnQ7Ci0Jc3RydWN0IHNuZF9zZXFfcG9ydF9pbmZvIGluZm87CiAJc3RydWN0IHNuZF9zZXFfcG9ydF9jYWxsYmFjayAqY2FsbGJhY2s7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIGFyZywgc2l6ZW9mKGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KIAkvKiBpdCBpcyBub3QgYWxsb3dlZCB0byBjcmVhdGUgdGhlIHBvcnQgZm9yIGFuIGFub3RoZXIgY2xpZW50ICovCi0JaWYgKGluZm8uYWRkci5jbGllbnQgIT0gY2xpZW50LT5udW1iZXIpCisJaWYgKGluZm8tPmFkZHIuY2xpZW50ICE9IGNsaWVudC0+bnVtYmVyKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JcG9ydCA9IHNuZF9zZXFfY3JlYXRlX3BvcnQoY2xpZW50LCAoaW5mby5mbGFncyAmIFNORFJWX1NFUV9QT1JUX0ZMR19HSVZFTl9QT1JUKSA/IGluZm8uYWRkci5wb3J0IDogLTEpOworCXBvcnQgPSBzbmRfc2VxX2NyZWF0ZV9wb3J0KGNsaWVudCwgKGluZm8tPmZsYWdzICYgU05EUlZfU0VRX1BPUlRfRkxHX0dJVkVOX1BPUlQpID8gaW5mby0+YWRkci5wb3J0IDogLTEpOwogCWlmIChwb3J0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaWYgKGNsaWVudC0+dHlwZSA9PSBVU0VSX0NMSUVOVCAmJiBpbmZvLmtlcm5lbCkgeworCWlmIChjbGllbnQtPnR5cGUgPT0gVVNFUl9DTElFTlQgJiYgaW5mby0+a2VybmVsKSB7CiAJCXNuZF9zZXFfZGVsZXRlX3BvcnQoY2xpZW50LCBwb3J0LT5hZGRyLnBvcnQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKGNsaWVudC0+dHlwZSA9PSBLRVJORUxfQ0xJRU5UKSB7Ci0JCWlmICgoY2FsbGJhY2sgPSBpbmZvLmtlcm5lbCkgIT0gTlVMTCkgeworCQlpZiAoKGNhbGxiYWNrID0gaW5mby0+a2VybmVsKSAhPSBOVUxMKSB7CiAJCQlpZiAoY2FsbGJhY2stPm93bmVyKQogCQkJCXBvcnQtPm93bmVyID0gY2FsbGJhY2stPm93bmVyOwogCQkJcG9ydC0+cHJpdmF0ZV9kYXRhID0gY2FsbGJhY2stPnByaXZhdGVfZGF0YTsKQEAgLTEzMDMsMzcgKzEyODYsMjkgQEAKIAkJfQogCX0KIAotCWluZm8uYWRkciA9IHBvcnQtPmFkZHI7CisJaW5mby0+YWRkciA9IHBvcnQtPmFkZHI7CiAKLQlzbmRfc2VxX3NldF9wb3J0X2luZm8ocG9ydCwgJmluZm8pOworCXNuZF9zZXFfc2V0X3BvcnRfaW5mbyhwb3J0LCBpbmZvKTsKIAlzbmRfc2VxX3N5c3RlbV9jbGllbnRfZXZfcG9ydF9zdGFydChwb3J0LT5hZGRyLmNsaWVudCwgcG9ydC0+YWRkci5wb3J0KTsKIAotCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KIAlyZXR1cm4gMDsKIH0KIAogLyogCiAgKiBERUxFVEUgUE9SVCBpb2N0bCgpIAogICovCi1zdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfZGVsZXRlX3BvcnQoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCi0JCQkJICAgICB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX2RlbGV0ZV9wb3J0KHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LCB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IHNuZF9zZXFfcG9ydF9pbmZvIGluZm87CisJc3RydWN0IHNuZF9zZXFfcG9ydF9pbmZvICppbmZvID0gYXJnOwogCWludCBlcnI7CiAKLQkvKiBzZXQgcGFzc2VkIHBhcmFtZXRlcnMgKi8KLQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIGFyZywgc2l6ZW9mKGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCiAJLyogaXQgaXMgbm90IGFsbG93ZWQgdG8gcmVtb3ZlIHRoZSBwb3J0IGZvciBhbiBhbm90aGVyIGNsaWVudCAqLwotCWlmIChpbmZvLmFkZHIuY2xpZW50ICE9IGNsaWVudC0+bnVtYmVyKQorCWlmIChpbmZvLT5hZGRyLmNsaWVudCAhPSBjbGllbnQtPm51bWJlcikKIAkJcmV0dXJuIC1FUEVSTTsKIAotCWVyciA9IHNuZF9zZXFfZGVsZXRlX3BvcnQoY2xpZW50LCBpbmZvLmFkZHIucG9ydCk7CisJZXJyID0gc25kX3NlcV9kZWxldGVfcG9ydChjbGllbnQsIGluZm8tPmFkZHIucG9ydCk7CiAJaWYgKGVyciA+PSAwKQotCQlzbmRfc2VxX3N5c3RlbV9jbGllbnRfZXZfcG9ydF9leGl0KGNsaWVudC0+bnVtYmVyLCBpbmZvLmFkZHIucG9ydCk7CisJCXNuZF9zZXFfc3lzdGVtX2NsaWVudF9ldl9wb3J0X2V4aXQoY2xpZW50LT5udW1iZXIsIGluZm8tPmFkZHIucG9ydCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTM0MSwzMiArMTMxNiwyNyBAQAogLyogCiAgKiBHRVRfUE9SVF9JTkZPIGlvY3RsKCkgKG9uIGFueSBjbGllbnQpIAogICovCi1zdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfZ2V0X3BvcnRfaW5mbyhzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKLQkJCQkgICAgICAgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9nZXRfcG9ydF9pbmZvKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LCB2b2lkICphcmcpCiB7CisJc3RydWN0IHNuZF9zZXFfcG9ydF9pbmZvICppbmZvID0gYXJnOwogCXN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY3B0cjsKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9ydCAqcG9ydDsKLQlzdHJ1Y3Qgc25kX3NlcV9wb3J0X2luZm8gaW5mbzsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgYXJnLCBzaXplb2YoaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQljcHRyID0gc25kX3NlcV9jbGllbnRfdXNlX3B0cihpbmZvLmFkZHIuY2xpZW50KTsKKwljcHRyID0gc25kX3NlcV9jbGllbnRfdXNlX3B0cihpbmZvLT5hZGRyLmNsaWVudCk7CiAJaWYgKGNwdHIgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTlhJTzsKIAotCXBvcnQgPSBzbmRfc2VxX3BvcnRfdXNlX3B0cihjcHRyLCBpbmZvLmFkZHIucG9ydCk7CisJcG9ydCA9IHNuZF9zZXFfcG9ydF91c2VfcHRyKGNwdHIsIGluZm8tPmFkZHIucG9ydCk7CiAJaWYgKHBvcnQgPT0gTlVMTCkgewogCQlzbmRfc2VxX2NsaWVudF91bmxvY2soY3B0cik7CiAJCXJldHVybiAtRU5PRU5UOwkJCS8qIGRvbid0IGNoYW5nZSAqLwogCX0KIAogCS8qIGdldCBwb3J0IGluZm8gKi8KLQlzbmRfc2VxX2dldF9wb3J0X2luZm8ocG9ydCwgJmluZm8pOworCXNuZF9zZXFfZ2V0X3BvcnRfaW5mbyhwb3J0LCBpbmZvKTsKIAlzbmRfc2VxX3BvcnRfdW5sb2NrKHBvcnQpOwogCXNuZF9zZXFfY2xpZW50X3VubG9jayhjcHRyKTsKIAotCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzNzQsMjAgKzEzNDQsMTYgQEAKIC8qIAogICogU0VUX1BPUlRfSU5GTyBpb2N0bCgpIChvbmx5IHBvcnRzIG9uIHRoaXMvb3duIGNsaWVudCkgCiAgKi8KLXN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9zZXRfcG9ydF9pbmZvKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LAotCQkJCSAgICAgICB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX3NldF9wb3J0X2luZm8oc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsIHZvaWQgKmFyZykKIHsKKwlzdHJ1Y3Qgc25kX3NlcV9wb3J0X2luZm8gKmluZm8gPSBhcmc7CiAJc3RydWN0IHNuZF9zZXFfY2xpZW50X3BvcnQgKnBvcnQ7Ci0Jc3RydWN0IHNuZF9zZXFfcG9ydF9pbmZvIGluZm87CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIGFyZywgc2l6ZW9mKGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoaW5mby5hZGRyLmNsaWVudCAhPSBjbGllbnQtPm51bWJlcikgLyogb25seSBzZXQgb3VyIG93biBwb3J0cyAhICovCisJaWYgKGluZm8tPmFkZHIuY2xpZW50ICE9IGNsaWVudC0+bnVtYmVyKSAvKiBvbmx5IHNldCBvdXIgb3duIHBvcnRzICEgKi8KIAkJcmV0dXJuIC1FUEVSTTsKLQlwb3J0ID0gc25kX3NlcV9wb3J0X3VzZV9wdHIoY2xpZW50LCBpbmZvLmFkZHIucG9ydCk7CisJcG9ydCA9IHNuZF9zZXFfcG9ydF91c2VfcHRyKGNsaWVudCwgaW5mby0+YWRkci5wb3J0KTsKIAlpZiAocG9ydCkgewotCQlzbmRfc2VxX3NldF9wb3J0X2luZm8ocG9ydCwgJmluZm8pOworCQlzbmRfc2VxX3NldF9wb3J0X2luZm8ocG9ydCwgaW5mbyk7CiAJCXNuZF9zZXFfcG9ydF91bmxvY2socG9ydCk7CiAJfQogCXJldHVybiAwOwpAQCAtMTQ1MywzNCArMTQxOSwzMSBAQAogICogYWRkIHRvIHBvcnQncyBzdWJzY3JpcHRpb24gbGlzdCBJT0NUTCBpbnRlcmZhY2UgCiAgKi8KIHN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9zdWJzY3JpYmVfcG9ydChzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKLQkJCQkJdm9pZCBfX3VzZXIgKmFyZykKKwkJCQkJdm9pZCAqYXJnKQogeworCXN0cnVjdCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlICpzdWJzID0gYXJnOwogCWludCByZXN1bHQgPSAtRUlOVkFMOwogCXN0cnVjdCBzbmRfc2VxX2NsaWVudCAqcmVjZWl2ZXIgPSBOVUxMLCAqc2VuZGVyID0gTlVMTDsKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9ydCAqc3BvcnQgPSBOVUxMLCAqZHBvcnQgPSBOVUxMOwotCXN0cnVjdCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlIHN1YnM7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJnN1YnMsIGFyZywgc2l6ZW9mKHN1YnMpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoKHJlY2VpdmVyID0gc25kX3NlcV9jbGllbnRfdXNlX3B0cihzdWJzLmRlc3QuY2xpZW50KSkgPT0gTlVMTCkKKwlpZiAoKHJlY2VpdmVyID0gc25kX3NlcV9jbGllbnRfdXNlX3B0cihzdWJzLT5kZXN0LmNsaWVudCkpID09IE5VTEwpCiAJCWdvdG8gX19lbmQ7Ci0JaWYgKChzZW5kZXIgPSBzbmRfc2VxX2NsaWVudF91c2VfcHRyKHN1YnMuc2VuZGVyLmNsaWVudCkpID09IE5VTEwpCisJaWYgKChzZW5kZXIgPSBzbmRfc2VxX2NsaWVudF91c2VfcHRyKHN1YnMtPnNlbmRlci5jbGllbnQpKSA9PSBOVUxMKQogCQlnb3RvIF9fZW5kOwotCWlmICgoc3BvcnQgPSBzbmRfc2VxX3BvcnRfdXNlX3B0cihzZW5kZXIsIHN1YnMuc2VuZGVyLnBvcnQpKSA9PSBOVUxMKQorCWlmICgoc3BvcnQgPSBzbmRfc2VxX3BvcnRfdXNlX3B0cihzZW5kZXIsIHN1YnMtPnNlbmRlci5wb3J0KSkgPT0gTlVMTCkKIAkJZ290byBfX2VuZDsKLQlpZiAoKGRwb3J0ID0gc25kX3NlcV9wb3J0X3VzZV9wdHIocmVjZWl2ZXIsIHN1YnMuZGVzdC5wb3J0KSkgPT0gTlVMTCkKKwlpZiAoKGRwb3J0ID0gc25kX3NlcV9wb3J0X3VzZV9wdHIocmVjZWl2ZXIsIHN1YnMtPmRlc3QucG9ydCkpID09IE5VTEwpCiAJCWdvdG8gX19lbmQ7CiAKLQlyZXN1bHQgPSBjaGVja19zdWJzY3JpcHRpb25fcGVybWlzc2lvbihjbGllbnQsIHNwb3J0LCBkcG9ydCwgJnN1YnMpOworCXJlc3VsdCA9IGNoZWNrX3N1YnNjcmlwdGlvbl9wZXJtaXNzaW9uKGNsaWVudCwgc3BvcnQsIGRwb3J0LCBzdWJzKTsKIAlpZiAocmVzdWx0IDwgMCkKIAkJZ290byBfX2VuZDsKIAogCS8qIGNvbm5lY3QgdGhlbSAqLwotCXJlc3VsdCA9IHNuZF9zZXFfcG9ydF9jb25uZWN0KGNsaWVudCwgc2VuZGVyLCBzcG9ydCwgcmVjZWl2ZXIsIGRwb3J0LCAmc3Vicyk7CisJcmVzdWx0ID0gc25kX3NlcV9wb3J0X2Nvbm5lY3QoY2xpZW50LCBzZW5kZXIsIHNwb3J0LCByZWNlaXZlciwgZHBvcnQsIHN1YnMpOwogCWlmICghIHJlc3VsdCkgLyogYnJvYWRjYXN0IGFubm91bmNlICovCiAJCXNuZF9zZXFfY2xpZW50X25vdGlmeV9zdWJzY3JpcHRpb24oU05EUlZfU0VRX0FERFJFU1NfU1VCU0NSSUJFUlMsIDAsCi0JCQkJCQkgICAmc3VicywgU05EUlZfU0VRX0VWRU5UX1BPUlRfU1VCU0NSSUJFRCk7CisJCQkJCQkgICBzdWJzLCBTTkRSVl9TRVFfRVZFTlRfUE9SVF9TVUJTQ1JJQkVEKTsKICAgICAgIF9fZW5kOgogICAgICAgCWlmIChzcG9ydCkKIAkJc25kX3NlcV9wb3J0X3VubG9jayhzcG9ydCk7CkBAIC0xNDk4LDMzICsxNDYxLDMwIEBACiAgKiByZW1vdmUgZnJvbSBwb3J0J3Mgc3Vic2NyaXB0aW9uIGxpc3QgCiAgKi8KIHN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF91bnN1YnNjcmliZV9wb3J0KHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LAotCQkJCQkgIHZvaWQgX191c2VyICphcmcpCisJCQkJCSAgdm9pZCAqYXJnKQogeworCXN0cnVjdCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlICpzdWJzID0gYXJnOwogCWludCByZXN1bHQgPSAtRU5YSU87CiAJc3RydWN0IHNuZF9zZXFfY2xpZW50ICpyZWNlaXZlciA9IE5VTEwsICpzZW5kZXIgPSBOVUxMOwogCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb3J0ICpzcG9ydCA9IE5VTEwsICpkcG9ydCA9IE5VTEw7Ci0Jc3RydWN0IHNuZF9zZXFfcG9ydF9zdWJzY3JpYmUgc3ViczsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmc3VicywgYXJnLCBzaXplb2Yoc3VicykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmICgocmVjZWl2ZXIgPSBzbmRfc2VxX2NsaWVudF91c2VfcHRyKHN1YnMuZGVzdC5jbGllbnQpKSA9PSBOVUxMKQorCWlmICgocmVjZWl2ZXIgPSBzbmRfc2VxX2NsaWVudF91c2VfcHRyKHN1YnMtPmRlc3QuY2xpZW50KSkgPT0gTlVMTCkKIAkJZ290byBfX2VuZDsKLQlpZiAoKHNlbmRlciA9IHNuZF9zZXFfY2xpZW50X3VzZV9wdHIoc3Vicy5zZW5kZXIuY2xpZW50KSkgPT0gTlVMTCkKKwlpZiAoKHNlbmRlciA9IHNuZF9zZXFfY2xpZW50X3VzZV9wdHIoc3Vicy0+c2VuZGVyLmNsaWVudCkpID09IE5VTEwpCiAJCWdvdG8gX19lbmQ7Ci0JaWYgKChzcG9ydCA9IHNuZF9zZXFfcG9ydF91c2VfcHRyKHNlbmRlciwgc3Vicy5zZW5kZXIucG9ydCkpID09IE5VTEwpCisJaWYgKChzcG9ydCA9IHNuZF9zZXFfcG9ydF91c2VfcHRyKHNlbmRlciwgc3Vicy0+c2VuZGVyLnBvcnQpKSA9PSBOVUxMKQogCQlnb3RvIF9fZW5kOwotCWlmICgoZHBvcnQgPSBzbmRfc2VxX3BvcnRfdXNlX3B0cihyZWNlaXZlciwgc3Vicy5kZXN0LnBvcnQpKSA9PSBOVUxMKQorCWlmICgoZHBvcnQgPSBzbmRfc2VxX3BvcnRfdXNlX3B0cihyZWNlaXZlciwgc3Vicy0+ZGVzdC5wb3J0KSkgPT0gTlVMTCkKIAkJZ290byBfX2VuZDsKIAotCXJlc3VsdCA9IGNoZWNrX3N1YnNjcmlwdGlvbl9wZXJtaXNzaW9uKGNsaWVudCwgc3BvcnQsIGRwb3J0LCAmc3Vicyk7CisJcmVzdWx0ID0gY2hlY2tfc3Vic2NyaXB0aW9uX3Blcm1pc3Npb24oY2xpZW50LCBzcG9ydCwgZHBvcnQsIHN1YnMpOwogCWlmIChyZXN1bHQgPCAwKQogCQlnb3RvIF9fZW5kOwogCi0JcmVzdWx0ID0gc25kX3NlcV9wb3J0X2Rpc2Nvbm5lY3QoY2xpZW50LCBzZW5kZXIsIHNwb3J0LCByZWNlaXZlciwgZHBvcnQsICZzdWJzKTsKKwlyZXN1bHQgPSBzbmRfc2VxX3BvcnRfZGlzY29ubmVjdChjbGllbnQsIHNlbmRlciwgc3BvcnQsIHJlY2VpdmVyLCBkcG9ydCwgc3Vicyk7CiAJaWYgKCEgcmVzdWx0KSAvKiBicm9hZGNhc3QgYW5ub3VuY2UgKi8KIAkJc25kX3NlcV9jbGllbnRfbm90aWZ5X3N1YnNjcmlwdGlvbihTTkRSVl9TRVFfQUREUkVTU19TVUJTQ1JJQkVSUywgMCwKLQkJCQkJCSAgICZzdWJzLCBTTkRSVl9TRVFfRVZFTlRfUE9SVF9VTlNVQlNDUklCRUQpOworCQkJCQkJICAgc3VicywgU05EUlZfU0VRX0VWRU5UX1BPUlRfVU5TVUJTQ1JJQkVEKTsKICAgICAgIF9fZW5kOgogICAgICAgCWlmIChzcG9ydCkKIAkJc25kX3NlcV9wb3J0X3VubG9jayhzcG9ydCk7CkBAIC0xNTM5LDE3ICsxNDk5LDEzIEBACiAKIAogLyogQ1JFQVRFX1FVRVVFIGlvY3RsKCkgKi8KLXN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9jcmVhdGVfcXVldWUoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCi0JCQkJICAgICAgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9jcmVhdGVfcXVldWUoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9pbmZvIGluZm87CisJc3RydWN0IHNuZF9zZXFfcXVldWVfaW5mbyAqaW5mbyA9IGFyZzsKIAlpbnQgcmVzdWx0OwogCXN0cnVjdCBzbmRfc2VxX3F1ZXVlICpxOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBhcmcsIHNpemVvZihpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmVzdWx0ID0gc25kX3NlcV9xdWV1ZV9hbGxvYyhjbGllbnQtPm51bWJlciwgaW5mby5sb2NrZWQsIGluZm8uZmxhZ3MpOworCXJlc3VsdCA9IHNuZF9zZXFfcXVldWVfYWxsb2MoY2xpZW50LT5udW1iZXIsIGluZm8tPmxvY2tlZCwgaW5mby0+ZmxhZ3MpOwogCWlmIChyZXN1bHQgPCAwKQogCQlyZXR1cm4gcmVzdWx0OwogCkBAIC0xNTU3LDE4MSArMTUxMywxNTAgQEAKIAlpZiAocSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWluZm8ucXVldWUgPSBxLT5xdWV1ZTsKLQlpbmZvLmxvY2tlZCA9IHEtPmxvY2tlZDsKLQlpbmZvLm93bmVyID0gcS0+b3duZXI7CisJaW5mby0+cXVldWUgPSBxLT5xdWV1ZTsKKwlpbmZvLT5sb2NrZWQgPSBxLT5sb2NrZWQ7CisJaW5mby0+b3duZXIgPSBxLT5vd25lcjsKIAogCS8qIHNldCBxdWV1ZSBuYW1lICovCi0JaWYgKCEgaW5mby5uYW1lWzBdKQotCQlzbnByaW50ZihpbmZvLm5hbWUsIHNpemVvZihpbmZvLm5hbWUpLCAiUXVldWUtJWQiLCBxLT5xdWV1ZSk7Ci0Jc3RybGNweShxLT5uYW1lLCBpbmZvLm5hbWUsIHNpemVvZihxLT5uYW1lKSk7CisJaWYgKCFpbmZvLT5uYW1lWzBdKQorCQlzbnByaW50ZihpbmZvLT5uYW1lLCBzaXplb2YoaW5mby0+bmFtZSksICJRdWV1ZS0lZCIsIHEtPnF1ZXVlKTsKKwlzdHJsY3B5KHEtPm5hbWUsIGluZm8tPm5hbWUsIHNpemVvZihxLT5uYW1lKSk7CiAJcXVldWVmcmVlKHEpOwogCi0JaWYgKGNvcHlfdG9fdXNlcihhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQogCXJldHVybiAwOwogfQogCiAvKiBERUxFVEVfUVVFVUUgaW9jdGwoKSAqLwotc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX2RlbGV0ZV9xdWV1ZShzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKLQkJCQkgICAgICB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX2RlbGV0ZV9xdWV1ZShzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwgdm9pZCAqYXJnKQogewotCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX2luZm8gaW5mbzsKKwlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9pbmZvICppbmZvID0gYXJnOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBhcmcsIHNpemVvZihpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIHNuZF9zZXFfcXVldWVfZGVsZXRlKGNsaWVudC0+bnVtYmVyLCBpbmZvLnF1ZXVlKTsKKwlyZXR1cm4gc25kX3NlcV9xdWV1ZV9kZWxldGUoY2xpZW50LT5udW1iZXIsIGluZm8tPnF1ZXVlKTsKIH0KIAogLyogR0VUX1FVRVVFX0lORk8gaW9jdGwoKSAqLwogc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX2dldF9xdWV1ZV9pbmZvKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LAotCQkJCQl2b2lkIF9fdXNlciAqYXJnKQorCQkJCQl2b2lkICphcmcpCiB7Ci0Jc3RydWN0IHNuZF9zZXFfcXVldWVfaW5mbyBpbmZvOworCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX2luZm8gKmluZm8gPSBhcmc7CiAJc3RydWN0IHNuZF9zZXFfcXVldWUgKnE7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIGFyZywgc2l6ZW9mKGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlxID0gcXVldWVwdHIoaW5mby5xdWV1ZSk7CisJcSA9IHF1ZXVlcHRyKGluZm8tPnF1ZXVlKTsKIAlpZiAocSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKLQlpbmZvLnF1ZXVlID0gcS0+cXVldWU7Ci0JaW5mby5vd25lciA9IHEtPm93bmVyOwotCWluZm8ubG9ja2VkID0gcS0+bG9ja2VkOwotCXN0cmxjcHkoaW5mby5uYW1lLCBxLT5uYW1lLCBzaXplb2YoaW5mby5uYW1lKSk7CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworCWluZm8tPnF1ZXVlID0gcS0+cXVldWU7CisJaW5mby0+b3duZXIgPSBxLT5vd25lcjsKKwlpbmZvLT5sb2NrZWQgPSBxLT5sb2NrZWQ7CisJc3RybGNweShpbmZvLT5uYW1lLCBxLT5uYW1lLCBzaXplb2YoaW5mby0+bmFtZSkpOwogCXF1ZXVlZnJlZShxKTsKIAotCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KIAlyZXR1cm4gMDsKIH0KIAogLyogU0VUX1FVRVVFX0lORk8gaW9jdGwoKSAqLwogc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX3NldF9xdWV1ZV9pbmZvKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LAotCQkJCQl2b2lkIF9fdXNlciAqYXJnKQorCQkJCQl2b2lkICphcmcpCiB7Ci0Jc3RydWN0IHNuZF9zZXFfcXVldWVfaW5mbyBpbmZvOworCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX2luZm8gKmluZm8gPSBhcmc7CiAJc3RydWN0IHNuZF9zZXFfcXVldWUgKnE7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIGFyZywgc2l6ZW9mKGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoaW5mby5vd25lciAhPSBjbGllbnQtPm51bWJlcikKKwlpZiAoaW5mby0+b3duZXIgIT0gY2xpZW50LT5udW1iZXIpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogY2hhbmdlIG93bmVyL2xvY2tlZCBwZXJtaXNzaW9uICovCi0JaWYgKHNuZF9zZXFfcXVldWVfY2hlY2tfYWNjZXNzKGluZm8ucXVldWUsIGNsaWVudC0+bnVtYmVyKSkgewotCQlpZiAoc25kX3NlcV9xdWV1ZV9zZXRfb3duZXIoaW5mby5xdWV1ZSwgY2xpZW50LT5udW1iZXIsIGluZm8ubG9ja2VkKSA8IDApCisJaWYgKHNuZF9zZXFfcXVldWVfY2hlY2tfYWNjZXNzKGluZm8tPnF1ZXVlLCBjbGllbnQtPm51bWJlcikpIHsKKwkJaWYgKHNuZF9zZXFfcXVldWVfc2V0X293bmVyKGluZm8tPnF1ZXVlLCBjbGllbnQtPm51bWJlciwgaW5mby0+bG9ja2VkKSA8IDApCiAJCQlyZXR1cm4gLUVQRVJNOwotCQlpZiAoaW5mby5sb2NrZWQpCi0JCQlzbmRfc2VxX3F1ZXVlX3VzZShpbmZvLnF1ZXVlLCBjbGllbnQtPm51bWJlciwgMSk7CisJCWlmIChpbmZvLT5sb2NrZWQpCisJCQlzbmRfc2VxX3F1ZXVlX3VzZShpbmZvLT5xdWV1ZSwgY2xpZW50LT5udW1iZXIsIDEpOwogCX0gZWxzZSB7CiAJCXJldHVybiAtRVBFUk07CiAJfQkKIAotCXEgPSBxdWV1ZXB0cihpbmZvLnF1ZXVlKTsKKwlxID0gcXVldWVwdHIoaW5mby0+cXVldWUpOwogCWlmICghIHEpCiAJCXJldHVybiAtRUlOVkFMOwogCWlmIChxLT5vd25lciAhPSBjbGllbnQtPm51bWJlcikgewogCQlxdWV1ZWZyZWUocSk7CiAJCXJldHVybiAtRVBFUk07CiAJfQotCXN0cmxjcHkocS0+bmFtZSwgaW5mby5uYW1lLCBzaXplb2YocS0+bmFtZSkpOworCXN0cmxjcHkocS0+bmFtZSwgaW5mby0+bmFtZSwgc2l6ZW9mKHEtPm5hbWUpKTsKIAlxdWV1ZWZyZWUocSk7CiAKIAlyZXR1cm4gMDsKIH0KIAogLyogR0VUX05BTUVEX1FVRVVFIGlvY3RsKCkgKi8KLXN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9nZXRfbmFtZWRfcXVldWUoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfZ2V0X25hbWVkX3F1ZXVlKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LAorCQkJCQkgdm9pZCAqYXJnKQogewotCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX2luZm8gaW5mbzsKKwlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9pbmZvICppbmZvID0gYXJnOwogCXN0cnVjdCBzbmRfc2VxX3F1ZXVlICpxOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBhcmcsIHNpemVvZihpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcSA9IHNuZF9zZXFfcXVldWVfZmluZF9uYW1lKGluZm8ubmFtZSk7CisJcSA9IHNuZF9zZXFfcXVldWVfZmluZF9uYW1lKGluZm8tPm5hbWUpOwogCWlmIChxID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwotCWluZm8ucXVldWUgPSBxLT5xdWV1ZTsKLQlpbmZvLm93bmVyID0gcS0+b3duZXI7Ci0JaW5mby5sb2NrZWQgPSBxLT5sb2NrZWQ7CisJaW5mby0+cXVldWUgPSBxLT5xdWV1ZTsKKwlpbmZvLT5vd25lciA9IHEtPm93bmVyOworCWluZm8tPmxvY2tlZCA9IHEtPmxvY2tlZDsKIAlxdWV1ZWZyZWUocSk7CiAKLQlpZiAoY29weV90b191c2VyKGFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCiAJcmV0dXJuIDA7CiB9CiAKIC8qIEdFVF9RVUVVRV9TVEFUVVMgaW9jdGwoKSAqLwogc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX2dldF9xdWV1ZV9zdGF0dXMoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCi0JCQkJCSAgdm9pZCBfX3VzZXIgKmFyZykKKwkJCQkJICB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IHNuZF9zZXFfcXVldWVfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9zdGF0dXMgKnN0YXR1cyA9IGFyZzsKIAlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZSAqcXVldWU7CiAJc3RydWN0IHNuZF9zZXFfdGltZXIgKnRtcjsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmc3RhdHVzLCBhcmcsIHNpemVvZihzdGF0dXMpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlxdWV1ZSA9IHF1ZXVlcHRyKHN0YXR1cy5xdWV1ZSk7CisJcXVldWUgPSBxdWV1ZXB0cihzdGF0dXMtPnF1ZXVlKTsKIAlpZiAocXVldWUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JbWVtc2V0KCZzdGF0dXMsIDAsIHNpemVvZihzdGF0dXMpKTsKLQlzdGF0dXMucXVldWUgPSBxdWV1ZS0+cXVldWU7CisJbWVtc2V0KHN0YXR1cywgMCwgc2l6ZW9mKCpzdGF0dXMpKTsKKwlzdGF0dXMtPnF1ZXVlID0gcXVldWUtPnF1ZXVlOwogCQogCXRtciA9IHF1ZXVlLT50aW1lcjsKLQlzdGF0dXMuZXZlbnRzID0gcXVldWUtPnRpY2txLT5jZWxscyArIHF1ZXVlLT50aW1lcS0+Y2VsbHM7CisJc3RhdHVzLT5ldmVudHMgPSBxdWV1ZS0+dGlja3EtPmNlbGxzICsgcXVldWUtPnRpbWVxLT5jZWxsczsKIAotCXN0YXR1cy50aW1lID0gc25kX3NlcV90aW1lcl9nZXRfY3VyX3RpbWUodG1yKTsKLQlzdGF0dXMudGljayA9IHNuZF9zZXFfdGltZXJfZ2V0X2N1cl90aWNrKHRtcik7CisJc3RhdHVzLT50aW1lID0gc25kX3NlcV90aW1lcl9nZXRfY3VyX3RpbWUodG1yKTsKKwlzdGF0dXMtPnRpY2sgPSBzbmRfc2VxX3RpbWVyX2dldF9jdXJfdGljayh0bXIpOwogCi0Jc3RhdHVzLnJ1bm5pbmcgPSB0bXItPnJ1bm5pbmc7CisJc3RhdHVzLT5ydW5uaW5nID0gdG1yLT5ydW5uaW5nOwogCi0Jc3RhdHVzLmZsYWdzID0gcXVldWUtPmZsYWdzOworCXN0YXR1cy0+ZmxhZ3MgPSBxdWV1ZS0+ZmxhZ3M7CiAJcXVldWVmcmVlKHF1ZXVlKTsKIAotCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmc3RhdHVzLCBzaXplb2Yoc3RhdHVzKSkpCi0JCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQogCiAKIC8qIEdFVF9RVUVVRV9URU1QTyBpb2N0bCgpICovCiBzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfZ2V0X3F1ZXVlX3RlbXBvKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LAotCQkJCQkgdm9pZCBfX3VzZXIgKmFyZykKKwkJCQkJIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV90ZW1wbyB0ZW1wbzsKKwlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV90ZW1wbyAqdGVtcG8gPSBhcmc7CiAJc3RydWN0IHNuZF9zZXFfcXVldWUgKnF1ZXVlOwogCXN0cnVjdCBzbmRfc2VxX3RpbWVyICp0bXI7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJnRlbXBvLCBhcmcsIHNpemVvZih0ZW1wbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXF1ZXVlID0gcXVldWVwdHIodGVtcG8ucXVldWUpOworCXF1ZXVlID0gcXVldWVwdHIodGVtcG8tPnF1ZXVlKTsKIAlpZiAocXVldWUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JbWVtc2V0KCZ0ZW1wbywgMCwgc2l6ZW9mKHRlbXBvKSk7Ci0JdGVtcG8ucXVldWUgPSBxdWV1ZS0+cXVldWU7CisJbWVtc2V0KHRlbXBvLCAwLCBzaXplb2YoKnRlbXBvKSk7CisJdGVtcG8tPnF1ZXVlID0gcXVldWUtPnF1ZXVlOwogCQogCXRtciA9IHF1ZXVlLT50aW1lcjsKIAotCXRlbXBvLnRlbXBvID0gdG1yLT50ZW1wbzsKLQl0ZW1wby5wcHEgPSB0bXItPnBwcTsKLQl0ZW1wby5za2V3X3ZhbHVlID0gdG1yLT5za2V3OwotCXRlbXBvLnNrZXdfYmFzZSA9IHRtci0+c2tld19iYXNlOworCXRlbXBvLT50ZW1wbyA9IHRtci0+dGVtcG87CisJdGVtcG8tPnBwcSA9IHRtci0+cHBxOworCXRlbXBvLT5za2V3X3ZhbHVlID0gdG1yLT5za2V3OworCXRlbXBvLT5za2V3X2Jhc2UgPSB0bXItPnNrZXdfYmFzZTsKIAlxdWV1ZWZyZWUocXVldWUpOwogCi0JaWYgKGNvcHlfdG9fdXNlcihhcmcsICZ0ZW1wbywgc2l6ZW9mKHRlbXBvKSkpCi0JCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQogCkBAIC0xNzQ3LDMxICsxNjcyLDI1IEBACiBFWFBPUlRfU1lNQk9MKHNuZF9zZXFfc2V0X3F1ZXVlX3RlbXBvKTsKIAogc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX3NldF9xdWV1ZV90ZW1wbyhzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKLQkJCQkJIHZvaWQgX191c2VyICphcmcpCisJCQkJCSB2b2lkICphcmcpCiB7CisJc3RydWN0IHNuZF9zZXFfcXVldWVfdGVtcG8gKnRlbXBvID0gYXJnOwogCWludCByZXN1bHQ7Ci0Jc3RydWN0IHNuZF9zZXFfcXVldWVfdGVtcG8gdGVtcG87CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJnRlbXBvLCBhcmcsIHNpemVvZih0ZW1wbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJlc3VsdCA9IHNuZF9zZXFfc2V0X3F1ZXVlX3RlbXBvKGNsaWVudC0+bnVtYmVyLCAmdGVtcG8pOworCXJlc3VsdCA9IHNuZF9zZXFfc2V0X3F1ZXVlX3RlbXBvKGNsaWVudC0+bnVtYmVyLCB0ZW1wbyk7CiAJcmV0dXJuIHJlc3VsdCA8IDAgPyByZXN1bHQgOiAwOwogfQogCiAKIC8qIEdFVF9RVUVVRV9USU1FUiBpb2N0bCgpICovCiBzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfZ2V0X3F1ZXVlX3RpbWVyKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LAotCQkJCQkgdm9pZCBfX3VzZXIgKmFyZykKKwkJCQkJIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV90aW1lciB0aW1lcjsKKwlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV90aW1lciAqdGltZXIgPSBhcmc7CiAJc3RydWN0IHNuZF9zZXFfcXVldWUgKnF1ZXVlOwogCXN0cnVjdCBzbmRfc2VxX3RpbWVyICp0bXI7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJnRpbWVyLCBhcmcsIHNpemVvZih0aW1lcikpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXF1ZXVlID0gcXVldWVwdHIodGltZXIucXVldWUpOworCXF1ZXVlID0gcXVldWVwdHIodGltZXItPnF1ZXVlKTsKIAlpZiAocXVldWUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTE3ODAsNDEgKzE2OTksMzYgQEAKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAl9CiAJdG1yID0gcXVldWUtPnRpbWVyOwotCW1lbXNldCgmdGltZXIsIDAsIHNpemVvZih0aW1lcikpOwotCXRpbWVyLnF1ZXVlID0gcXVldWUtPnF1ZXVlOworCW1lbXNldCh0aW1lciwgMCwgc2l6ZW9mKCp0aW1lcikpOworCXRpbWVyLT5xdWV1ZSA9IHF1ZXVlLT5xdWV1ZTsKIAotCXRpbWVyLnR5cGUgPSB0bXItPnR5cGU7CisJdGltZXItPnR5cGUgPSB0bXItPnR5cGU7CiAJaWYgKHRtci0+dHlwZSA9PSBTTkRSVl9TRVFfVElNRVJfQUxTQSkgewotCQl0aW1lci51LmFsc2EuaWQgPSB0bXItPmFsc2FfaWQ7Ci0JCXRpbWVyLnUuYWxzYS5yZXNvbHV0aW9uID0gdG1yLT5wcmVmZXJyZWRfcmVzb2x1dGlvbjsKKwkJdGltZXItPnUuYWxzYS5pZCA9IHRtci0+YWxzYV9pZDsKKwkJdGltZXItPnUuYWxzYS5yZXNvbHV0aW9uID0gdG1yLT5wcmVmZXJyZWRfcmVzb2x1dGlvbjsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZxdWV1ZS0+dGltZXJfbXV0ZXgpOwogCXF1ZXVlZnJlZShxdWV1ZSk7CiAJCi0JaWYgKGNvcHlfdG9fdXNlcihhcmcsICZ0aW1lciwgc2l6ZW9mKHRpbWVyKSkpCi0JCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQogCiAKIC8qIFNFVF9RVUVVRV9USU1FUiBpb2N0bCgpICovCiBzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfc2V0X3F1ZXVlX3RpbWVyKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LAotCQkJCQkgdm9pZCBfX3VzZXIgKmFyZykKKwkJCQkJIHZvaWQgKmFyZykKIHsKKwlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV90aW1lciAqdGltZXIgPSBhcmc7CiAJaW50IHJlc3VsdCA9IDA7Ci0Jc3RydWN0IHNuZF9zZXFfcXVldWVfdGltZXIgdGltZXI7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJnRpbWVyLCBhcmcsIHNpemVvZih0aW1lcikpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmICh0aW1lci50eXBlICE9IFNORFJWX1NFUV9USU1FUl9BTFNBKQorCWlmICh0aW1lci0+dHlwZSAhPSBTTkRSVl9TRVFfVElNRVJfQUxTQSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoc25kX3NlcV9xdWV1ZV9jaGVja19hY2Nlc3ModGltZXIucXVldWUsIGNsaWVudC0+bnVtYmVyKSkgeworCWlmIChzbmRfc2VxX3F1ZXVlX2NoZWNrX2FjY2Vzcyh0aW1lci0+cXVldWUsIGNsaWVudC0+bnVtYmVyKSkgewogCQlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZSAqcTsKIAkJc3RydWN0IHNuZF9zZXFfdGltZXIgKnRtcjsKIAotCQlxID0gcXVldWVwdHIodGltZXIucXVldWUpOworCQlxID0gcXVldWVwdHIodGltZXItPnF1ZXVlKTsKIAkJaWYgKHEgPT0gTlVMTCkKIAkJCXJldHVybiAtRU5YSU87CiAJCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnEtPnRpbWVyX211dGV4KSkgewpAQCAtMTgyMiwxMyArMTczNiwxMyBAQAogCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAkJfQogCQl0bXIgPSBxLT50aW1lcjsKLQkJc25kX3NlcV9xdWV1ZV90aW1lcl9jbG9zZSh0aW1lci5xdWV1ZSk7Ci0JCXRtci0+dHlwZSA9IHRpbWVyLnR5cGU7CisJCXNuZF9zZXFfcXVldWVfdGltZXJfY2xvc2UodGltZXItPnF1ZXVlKTsKKwkJdG1yLT50eXBlID0gdGltZXItPnR5cGU7CiAJCWlmICh0bXItPnR5cGUgPT0gU05EUlZfU0VRX1RJTUVSX0FMU0EpIHsKLQkJCXRtci0+YWxzYV9pZCA9IHRpbWVyLnUuYWxzYS5pZDsKLQkJCXRtci0+cHJlZmVycmVkX3Jlc29sdXRpb24gPSB0aW1lci51LmFsc2EucmVzb2x1dGlvbjsKKwkJCXRtci0+YWxzYV9pZCA9IHRpbWVyLT51LmFsc2EuaWQ7CisJCQl0bXItPnByZWZlcnJlZF9yZXNvbHV0aW9uID0gdGltZXItPnUuYWxzYS5yZXNvbHV0aW9uOwogCQl9Ci0JCXJlc3VsdCA9IHNuZF9zZXFfcXVldWVfdGltZXJfb3Blbih0aW1lci5xdWV1ZSk7CisJCXJlc3VsdCA9IHNuZF9zZXFfcXVldWVfdGltZXJfb3Blbih0aW1lci0+cXVldWUpOwogCQltdXRleF91bmxvY2soJnEtPnRpbWVyX211dGV4KTsKIAkJcXVldWVmcmVlKHEpOwogCX0gZWxzZSB7CkBAIC0xODQxLDM4ICsxNzU1LDMwIEBACiAKIC8qIEdFVF9RVUVVRV9DTElFTlQgaW9jdGwoKSAqLwogc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX2dldF9xdWV1ZV9jbGllbnQoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCi0JCQkJCSAgdm9pZCBfX3VzZXIgKmFyZykKKwkJCQkJICB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IHNuZF9zZXFfcXVldWVfY2xpZW50IGluZm87CisJc3RydWN0IHNuZF9zZXFfcXVldWVfY2xpZW50ICppbmZvID0gYXJnOwogCWludCB1c2VkOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBhcmcsIHNpemVvZihpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JdXNlZCA9IHNuZF9zZXFfcXVldWVfaXNfdXNlZChpbmZvLnF1ZXVlLCBjbGllbnQtPm51bWJlcik7CisJdXNlZCA9IHNuZF9zZXFfcXVldWVfaXNfdXNlZChpbmZvLT5xdWV1ZSwgY2xpZW50LT5udW1iZXIpOwogCWlmICh1c2VkIDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaW5mby51c2VkID0gdXNlZDsKLQlpbmZvLmNsaWVudCA9IGNsaWVudC0+bnVtYmVyOworCWluZm8tPnVzZWQgPSB1c2VkOworCWluZm8tPmNsaWVudCA9IGNsaWVudC0+bnVtYmVyOwogCi0JaWYgKGNvcHlfdG9fdXNlcihhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gMDsKIH0KIAogCiAvKiBTRVRfUVVFVUVfQ0xJRU5UIGlvY3RsKCkgKi8KIHN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9zZXRfcXVldWVfY2xpZW50KHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LAotCQkJCQkgIHZvaWQgX191c2VyICphcmcpCisJCQkJCSAgdm9pZCAqYXJnKQogeworCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX2NsaWVudCAqaW5mbyA9IGFyZzsKIAlpbnQgZXJyOwotCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX2NsaWVudCBpbmZvOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBhcmcsIHNpemVvZihpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKGluZm8udXNlZCA+PSAwKSB7Ci0JCWVyciA9IHNuZF9zZXFfcXVldWVfdXNlKGluZm8ucXVldWUsIGNsaWVudC0+bnVtYmVyLCBpbmZvLnVzZWQpOworCWlmIChpbmZvLT51c2VkID49IDApIHsKKwkJZXJyID0gc25kX3NlcV9xdWV1ZV91c2UoaW5mby0+cXVldWUsIGNsaWVudC0+bnVtYmVyLCBpbmZvLT51c2VkKTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogCX0KQEAgLTE4ODMsNzggKzE3ODksNzAgQEAKIAogLyogR0VUX0NMSUVOVF9QT09MIGlvY3RsKCkgKi8KIHN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9nZXRfY2xpZW50X3Bvb2woc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCi0JCQkJCSB2b2lkIF9fdXNlciAqYXJnKQorCQkJCQkgdm9pZCAqYXJnKQogewotCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb29sIGluZm87CisJc3RydWN0IHNuZF9zZXFfY2xpZW50X3Bvb2wgKmluZm8gPSBhcmc7CiAJc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjcHRyOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBhcmcsIHNpemVvZihpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JY3B0ciA9IHNuZF9zZXFfY2xpZW50X3VzZV9wdHIoaW5mby5jbGllbnQpOworCWNwdHIgPSBzbmRfc2VxX2NsaWVudF91c2VfcHRyKGluZm8tPmNsaWVudCk7CiAJaWYgKGNwdHIgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9FTlQ7Ci0JbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOwotCWluZm8uY2xpZW50ID0gY3B0ci0+bnVtYmVyOwotCWluZm8ub3V0cHV0X3Bvb2wgPSBjcHRyLT5wb29sLT5zaXplOwotCWluZm8ub3V0cHV0X3Jvb20gPSBjcHRyLT5wb29sLT5yb29tOwotCWluZm8ub3V0cHV0X2ZyZWUgPSBpbmZvLm91dHB1dF9wb29sOwotCWluZm8ub3V0cHV0X2ZyZWUgPSBzbmRfc2VxX3VudXNlZF9jZWxscyhjcHRyLT5wb29sKTsKKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CisJaW5mby0+Y2xpZW50ID0gY3B0ci0+bnVtYmVyOworCWluZm8tPm91dHB1dF9wb29sID0gY3B0ci0+cG9vbC0+c2l6ZTsKKwlpbmZvLT5vdXRwdXRfcm9vbSA9IGNwdHItPnBvb2wtPnJvb207CisJaW5mby0+b3V0cHV0X2ZyZWUgPSBpbmZvLT5vdXRwdXRfcG9vbDsKKwlpbmZvLT5vdXRwdXRfZnJlZSA9IHNuZF9zZXFfdW51c2VkX2NlbGxzKGNwdHItPnBvb2wpOwogCWlmIChjcHRyLT50eXBlID09IFVTRVJfQ0xJRU5UKSB7Ci0JCWluZm8uaW5wdXRfcG9vbCA9IGNwdHItPmRhdGEudXNlci5maWZvX3Bvb2xfc2l6ZTsKLQkJaW5mby5pbnB1dF9mcmVlID0gaW5mby5pbnB1dF9wb29sOworCQlpbmZvLT5pbnB1dF9wb29sID0gY3B0ci0+ZGF0YS51c2VyLmZpZm9fcG9vbF9zaXplOworCQlpbmZvLT5pbnB1dF9mcmVlID0gaW5mby0+aW5wdXRfcG9vbDsKIAkJaWYgKGNwdHItPmRhdGEudXNlci5maWZvKQotCQkJaW5mby5pbnB1dF9mcmVlID0gc25kX3NlcV91bnVzZWRfY2VsbHMoY3B0ci0+ZGF0YS51c2VyLmZpZm8tPnBvb2wpOworCQkJaW5mby0+aW5wdXRfZnJlZSA9IHNuZF9zZXFfdW51c2VkX2NlbGxzKGNwdHItPmRhdGEudXNlci5maWZvLT5wb29sKTsKIAl9IGVsc2UgewotCQlpbmZvLmlucHV0X3Bvb2wgPSAwOwotCQlpbmZvLmlucHV0X2ZyZWUgPSAwOworCQlpbmZvLT5pbnB1dF9wb29sID0gMDsKKwkJaW5mby0+aW5wdXRfZnJlZSA9IDA7CiAJfQogCXNuZF9zZXFfY2xpZW50X3VubG9jayhjcHRyKTsKIAkKLQlpZiAoY29weV90b191c2VyKGFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQogCiAvKiBTRVRfQ0xJRU5UX1BPT0wgaW9jdGwoKSAqLwogc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX3NldF9jbGllbnRfcG9vbChzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKLQkJCQkJIHZvaWQgX191c2VyICphcmcpCisJCQkJCSB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IHNuZF9zZXFfY2xpZW50X3Bvb2wgaW5mbzsKKwlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9vbCAqaW5mbyA9IGFyZzsKIAlpbnQgcmM7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIGFyZywgc2l6ZW9mKGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoY2xpZW50LT5udW1iZXIgIT0gaW5mby5jbGllbnQpCisJaWYgKGNsaWVudC0+bnVtYmVyICE9IGluZm8tPmNsaWVudCkKIAkJcmV0dXJuIC1FSU5WQUw7IC8qIGNhbid0IGNoYW5nZSBvdGhlciBjbGllbnRzICovCiAKLQlpZiAoaW5mby5vdXRwdXRfcG9vbCA+PSAxICYmIGluZm8ub3V0cHV0X3Bvb2wgPD0gU05EUlZfU0VRX01BWF9FVkVOVFMgJiYKKwlpZiAoaW5mby0+b3V0cHV0X3Bvb2wgPj0gMSAmJiBpbmZvLT5vdXRwdXRfcG9vbCA8PSBTTkRSVl9TRVFfTUFYX0VWRU5UUyAmJgogCSAgICAoISBzbmRfc2VxX3dyaXRlX3Bvb2xfYWxsb2NhdGVkKGNsaWVudCkgfHwKLQkgICAgIGluZm8ub3V0cHV0X3Bvb2wgIT0gY2xpZW50LT5wb29sLT5zaXplKSkgeworCSAgICAgaW5mby0+b3V0cHV0X3Bvb2wgIT0gY2xpZW50LT5wb29sLT5zaXplKSkgewogCQlpZiAoc25kX3NlcV93cml0ZV9wb29sX2FsbG9jYXRlZChjbGllbnQpKSB7CiAJCQkvKiByZW1vdmUgYWxsIGV4aXN0aW5nIGNlbGxzICovCiAJCQlzbmRfc2VxX3F1ZXVlX2NsaWVudF9sZWF2ZV9jZWxscyhjbGllbnQtPm51bWJlcik7CiAJCQlzbmRfc2VxX3Bvb2xfZG9uZShjbGllbnQtPnBvb2wpOwogCQl9Ci0JCWNsaWVudC0+cG9vbC0+c2l6ZSA9IGluZm8ub3V0cHV0X3Bvb2w7CisJCWNsaWVudC0+cG9vbC0+c2l6ZSA9IGluZm8tPm91dHB1dF9wb29sOwogCQlyYyA9IHNuZF9zZXFfcG9vbF9pbml0KGNsaWVudC0+cG9vbCk7CiAJCWlmIChyYyA8IDApCiAJCQlyZXR1cm4gcmM7CiAJfQogCWlmIChjbGllbnQtPnR5cGUgPT0gVVNFUl9DTElFTlQgJiYgY2xpZW50LT5kYXRhLnVzZXIuZmlmbyAhPSBOVUxMICYmCi0JICAgIGluZm8uaW5wdXRfcG9vbCA+PSAxICYmCi0JICAgIGluZm8uaW5wdXRfcG9vbCA8PSBTTkRSVl9TRVFfTUFYX0NMSUVOVF9FVkVOVFMgJiYKLQkgICAgaW5mby5pbnB1dF9wb29sICE9IGNsaWVudC0+ZGF0YS51c2VyLmZpZm9fcG9vbF9zaXplKSB7CisJICAgIGluZm8tPmlucHV0X3Bvb2wgPj0gMSAmJgorCSAgICBpbmZvLT5pbnB1dF9wb29sIDw9IFNORFJWX1NFUV9NQVhfQ0xJRU5UX0VWRU5UUyAmJgorCSAgICBpbmZvLT5pbnB1dF9wb29sICE9IGNsaWVudC0+ZGF0YS51c2VyLmZpZm9fcG9vbF9zaXplKSB7CiAJCS8qIGNoYW5nZSBwb29sIHNpemUgKi8KLQkJcmMgPSBzbmRfc2VxX2ZpZm9fcmVzaXplKGNsaWVudC0+ZGF0YS51c2VyLmZpZm8sIGluZm8uaW5wdXRfcG9vbCk7CisJCXJjID0gc25kX3NlcV9maWZvX3Jlc2l6ZShjbGllbnQtPmRhdGEudXNlci5maWZvLCBpbmZvLT5pbnB1dF9wb29sKTsKIAkJaWYgKHJjIDwgMCkKIAkJCXJldHVybiByYzsKLQkJY2xpZW50LT5kYXRhLnVzZXIuZmlmb19wb29sX3NpemUgPSBpbmZvLmlucHV0X3Bvb2w7CisJCWNsaWVudC0+ZGF0YS51c2VyLmZpZm9fcG9vbF9zaXplID0gaW5mby0+aW5wdXRfcG9vbDsKIAl9Ci0JaWYgKGluZm8ub3V0cHV0X3Jvb20gPj0gMSAmJgotCSAgICBpbmZvLm91dHB1dF9yb29tIDw9IGNsaWVudC0+cG9vbC0+c2l6ZSkgewotCQljbGllbnQtPnBvb2wtPnJvb20gID0gaW5mby5vdXRwdXRfcm9vbTsKKwlpZiAoaW5mby0+b3V0cHV0X3Jvb20gPj0gMSAmJgorCSAgICBpbmZvLT5vdXRwdXRfcm9vbSA8PSBjbGllbnQtPnBvb2wtPnNpemUpIHsKKwkJY2xpZW50LT5wb29sLT5yb29tICA9IGluZm8tPm91dHB1dF9yb29tOwogCX0KIAogCXJldHVybiBzbmRfc2VxX2lvY3RsX2dldF9jbGllbnRfcG9vbChjbGllbnQsIGFyZyk7CkBAIC0xOTYzLDE3ICsxODYxLDE0IEBACiAKIC8qIFJFTU9WRV9FVkVOVFMgaW9jdGwoKSAqLwogc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX3JlbW92ZV9ldmVudHMoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCi0JCQkJICAgICAgIHZvaWQgX191c2VyICphcmcpCisJCQkJICAgICAgIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3Qgc25kX3NlcV9yZW1vdmVfZXZlbnRzIGluZm87Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIGFyZywgc2l6ZW9mKGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJc3RydWN0IHNuZF9zZXFfcmVtb3ZlX2V2ZW50cyAqaW5mbyA9IGFyZzsKIAogCS8qCiAJICogSW5wdXQgbW9zdGx5IG5vdCBpbXBsZW1lbnRlZCBYWFguCiAJICovCi0JaWYgKGluZm8ucmVtb3ZlX21vZGUgJiBTTkRSVl9TRVFfUkVNT1ZFX0lOUFVUKSB7CisJaWYgKGluZm8tPnJlbW92ZV9tb2RlICYgU05EUlZfU0VRX1JFTU9WRV9JTlBVVCkgewogCQkvKgogCQkgKiBObyByZXN0cmljdGlvbnMgc28gZm9yIGEgdXNlciBjbGllbnQgd2UgY2FuIGNsZWFyCiAJCSAqIHRoZSB3aG9sZSBmaWZvCkBAIC0xOTgyLDggKzE4NzcsOCBAQAogCQkJc25kX3NlcV9maWZvX2NsZWFyKGNsaWVudC0+ZGF0YS51c2VyLmZpZm8pOwogCX0KIAotCWlmIChpbmZvLnJlbW92ZV9tb2RlICYgU05EUlZfU0VRX1JFTU9WRV9PVVRQVVQpCi0JCXNuZF9zZXFfcXVldWVfcmVtb3ZlX2NlbGxzKGNsaWVudC0+bnVtYmVyLCAmaW5mbyk7CisJaWYgKGluZm8tPnJlbW92ZV9tb2RlICYgU05EUlZfU0VRX1JFTU9WRV9PVVRQVVQpCisJCXNuZF9zZXFfcXVldWVfcmVtb3ZlX2NlbGxzKGNsaWVudC0+bnVtYmVyLCBpbmZvKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTk5MywyNiArMTg4OCwyMyBAQAogICogZ2V0IHN1YnNjcmlwdGlvbiBpbmZvCiAgKi8KIHN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9nZXRfc3Vic2NyaXB0aW9uKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LAotCQkJCQkgIHZvaWQgX191c2VyICphcmcpCisJCQkJCSAgdm9pZCAqYXJnKQogeworCXN0cnVjdCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlICpzdWJzID0gYXJnOwogCWludCByZXN1bHQ7CiAJc3RydWN0IHNuZF9zZXFfY2xpZW50ICpzZW5kZXIgPSBOVUxMOwogCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb3J0ICpzcG9ydCA9IE5VTEw7Ci0Jc3RydWN0IHNuZF9zZXFfcG9ydF9zdWJzY3JpYmUgc3ViczsKIAlzdHJ1Y3Qgc25kX3NlcV9zdWJzY3JpYmVycyAqcDsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmc3VicywgYXJnLCBzaXplb2Yoc3VicykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQogCXJlc3VsdCA9IC1FSU5WQUw7Ci0JaWYgKChzZW5kZXIgPSBzbmRfc2VxX2NsaWVudF91c2VfcHRyKHN1YnMuc2VuZGVyLmNsaWVudCkpID09IE5VTEwpCisJaWYgKChzZW5kZXIgPSBzbmRfc2VxX2NsaWVudF91c2VfcHRyKHN1YnMtPnNlbmRlci5jbGllbnQpKSA9PSBOVUxMKQogCQlnb3RvIF9fZW5kOwotCWlmICgoc3BvcnQgPSBzbmRfc2VxX3BvcnRfdXNlX3B0cihzZW5kZXIsIHN1YnMuc2VuZGVyLnBvcnQpKSA9PSBOVUxMKQorCWlmICgoc3BvcnQgPSBzbmRfc2VxX3BvcnRfdXNlX3B0cihzZW5kZXIsIHN1YnMtPnNlbmRlci5wb3J0KSkgPT0gTlVMTCkKIAkJZ290byBfX2VuZDsKLQlwID0gc25kX3NlcV9wb3J0X2dldF9zdWJzY3JpcHRpb24oJnNwb3J0LT5jX3NyYywgJnN1YnMuZGVzdCk7CisJcCA9IHNuZF9zZXFfcG9ydF9nZXRfc3Vic2NyaXB0aW9uKCZzcG9ydC0+Y19zcmMsICZzdWJzLT5kZXN0KTsKIAlpZiAocCkgewogCQlyZXN1bHQgPSAwOwotCQlzdWJzID0gcC0+aW5mbzsKKwkJKnN1YnMgPSBwLT5pbmZvOwogCX0gZWxzZQogCQlyZXN1bHQgPSAtRU5PRU5UOwogCkBAIC0yMDIxLDEwICsxOTEzLDcgQEAKIAkJc25kX3NlcV9wb3J0X3VubG9jayhzcG9ydCk7CiAJaWYgKHNlbmRlcikKIAkJc25kX3NlcV9jbGllbnRfdW5sb2NrKHNlbmRlcik7Ci0JaWYgKHJlc3VsdCA+PSAwKSB7Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmc3Vicywgc2l6ZW9mKHN1YnMpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCX0KKwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTIwMzIsMjYgKzE5MjEsMjIgQEAKIC8qCiAgKiBnZXQgc3Vic2NyaXB0aW9uIGluZm8gLSBjaGVjayBvbmx5IGl0cyBwcmVzZW5jZQogICovCi1zdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfcXVlcnlfc3VicyhzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKLQkJCQkgICAgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9xdWVyeV9zdWJzKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LCB2b2lkICphcmcpCiB7CisJc3RydWN0IHNuZF9zZXFfcXVlcnlfc3VicyAqc3VicyA9IGFyZzsKIAlpbnQgcmVzdWx0ID0gLUVOWElPOwogCXN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY3B0ciA9IE5VTEw7CiAJc3RydWN0IHNuZF9zZXFfY2xpZW50X3BvcnQgKnBvcnQgPSBOVUxMOwotCXN0cnVjdCBzbmRfc2VxX3F1ZXJ5X3N1YnMgc3ViczsKIAlzdHJ1Y3Qgc25kX3NlcV9wb3J0X3N1YnNfaW5mbyAqZ3JvdXA7CiAJc3RydWN0IGxpc3RfaGVhZCAqcDsKIAlpbnQgaTsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmc3VicywgYXJnLCBzaXplb2Yoc3VicykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmICgoY3B0ciA9IHNuZF9zZXFfY2xpZW50X3VzZV9wdHIoc3Vicy5yb290LmNsaWVudCkpID09IE5VTEwpCisJaWYgKChjcHRyID0gc25kX3NlcV9jbGllbnRfdXNlX3B0cihzdWJzLT5yb290LmNsaWVudCkpID09IE5VTEwpCiAJCWdvdG8gX19lbmQ7Ci0JaWYgKChwb3J0ID0gc25kX3NlcV9wb3J0X3VzZV9wdHIoY3B0ciwgc3Vicy5yb290LnBvcnQpKSA9PSBOVUxMKQorCWlmICgocG9ydCA9IHNuZF9zZXFfcG9ydF91c2VfcHRyKGNwdHIsIHN1YnMtPnJvb3QucG9ydCkpID09IE5VTEwpCiAJCWdvdG8gX19lbmQ7CiAKLQlzd2l0Y2ggKHN1YnMudHlwZSkgeworCXN3aXRjaCAoc3Vicy0+dHlwZSkgewogCWNhc2UgU05EUlZfU0VRX1FVRVJZX1NVQlNfUkVBRDoKIAkJZ3JvdXAgPSAmcG9ydC0+Y19zcmM7CiAJCWJyZWFrOwpAQCAtMjA2NCwyMiArMTk0OSwyMiBAQAogCiAJZG93bl9yZWFkKCZncm91cC0+bGlzdF9tdXRleCk7CiAJLyogc2VhcmNoIGZvciB0aGUgc3Vic2NyaWJlciAqLwotCXN1YnMubnVtX3N1YnMgPSBncm91cC0+Y291bnQ7CisJc3Vicy0+bnVtX3N1YnMgPSBncm91cC0+Y291bnQ7CiAJaSA9IDA7CiAJcmVzdWx0ID0gLUVOT0VOVDsKIAlsaXN0X2Zvcl9lYWNoKHAsICZncm91cC0+bGlzdF9oZWFkKSB7Ci0JCWlmIChpKysgPT0gc3Vicy5pbmRleCkgeworCQlpZiAoaSsrID09IHN1YnMtPmluZGV4KSB7CiAJCQkvKiBmb3VuZCEgKi8KIAkJCXN0cnVjdCBzbmRfc2VxX3N1YnNjcmliZXJzICpzOwotCQkJaWYgKHN1YnMudHlwZSA9PSBTTkRSVl9TRVFfUVVFUllfU1VCU19SRUFEKSB7CisJCQlpZiAoc3Vicy0+dHlwZSA9PSBTTkRSVl9TRVFfUVVFUllfU1VCU19SRUFEKSB7CiAJCQkJcyA9IGxpc3RfZW50cnkocCwgc3RydWN0IHNuZF9zZXFfc3Vic2NyaWJlcnMsIHNyY19saXN0KTsKLQkJCQlzdWJzLmFkZHIgPSBzLT5pbmZvLmRlc3Q7CisJCQkJc3Vicy0+YWRkciA9IHMtPmluZm8uZGVzdDsKIAkJCX0gZWxzZSB7CiAJCQkJcyA9IGxpc3RfZW50cnkocCwgc3RydWN0IHNuZF9zZXFfc3Vic2NyaWJlcnMsIGRlc3RfbGlzdCk7Ci0JCQkJc3Vicy5hZGRyID0gcy0+aW5mby5zZW5kZXI7CisJCQkJc3Vicy0+YWRkciA9IHMtPmluZm8uc2VuZGVyOwogCQkJfQotCQkJc3Vicy5mbGFncyA9IHMtPmluZm8uZmxhZ3M7Ci0JCQlzdWJzLnF1ZXVlID0gcy0+aW5mby5xdWV1ZTsKKwkJCXN1YnMtPmZsYWdzID0gcy0+aW5mby5mbGFnczsKKwkJCXN1YnMtPnF1ZXVlID0gcy0+aW5mby5xdWV1ZTsKIAkJCXJlc3VsdCA9IDA7CiAJCQlicmVhazsKIAkJfQpAQCAtMjA5MSwxMCArMTk3Niw3IEBACiAJCXNuZF9zZXFfcG9ydF91bmxvY2socG9ydCk7CiAJaWYgKGNwdHIpCiAJCXNuZF9zZXFfY2xpZW50X3VubG9jayhjcHRyKTsKLQlpZiAocmVzdWx0ID49IDApIHsKLQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZzdWJzLCBzaXplb2Yoc3VicykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQorCiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMjEwMywzMSArMTk4NSwyNiBAQAogICogcXVlcnkgbmV4dCBjbGllbnQKICAqLwogc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX3F1ZXJ5X25leHRfY2xpZW50KHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LAotCQkJCQkgICB2b2lkIF9fdXNlciAqYXJnKQorCQkJCQkgICB2b2lkICphcmcpCiB7CisJc3RydWN0IHNuZF9zZXFfY2xpZW50X2luZm8gKmluZm8gPSBhcmc7CiAJc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjcHRyID0gTlVMTDsKLQlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfaW5mbyBpbmZvOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBhcmcsIHNpemVvZihpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwogCiAJLyogc2VhcmNoIGZvciBuZXh0IGNsaWVudCAqLwotCWluZm8uY2xpZW50Kys7Ci0JaWYgKGluZm8uY2xpZW50IDwgMCkKLQkJaW5mby5jbGllbnQgPSAwOwotCWZvciAoOyBpbmZvLmNsaWVudCA8IFNORFJWX1NFUV9NQVhfQ0xJRU5UUzsgaW5mby5jbGllbnQrKykgewotCQljcHRyID0gc25kX3NlcV9jbGllbnRfdXNlX3B0cihpbmZvLmNsaWVudCk7CisJaW5mby0+Y2xpZW50Kys7CisJaWYgKGluZm8tPmNsaWVudCA8IDApCisJCWluZm8tPmNsaWVudCA9IDA7CisJZm9yICg7IGluZm8tPmNsaWVudCA8IFNORFJWX1NFUV9NQVhfQ0xJRU5UUzsgaW5mby0+Y2xpZW50KyspIHsKKwkJY3B0ciA9IHNuZF9zZXFfY2xpZW50X3VzZV9wdHIoaW5mby0+Y2xpZW50KTsKIAkJaWYgKGNwdHIpCiAJCQlicmVhazsgLyogZm91bmQgKi8KIAl9CiAJaWYgKGNwdHIgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKLQlnZXRfY2xpZW50X2luZm8oY3B0ciwgJmluZm8pOworCWdldF9jbGllbnRfaW5mbyhjcHRyLCBpbmZvKTsKIAlzbmRfc2VxX2NsaWVudF91bmxvY2soY3B0cik7CiAKLQlpZiAoY29weV90b191c2VyKGFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQogCkBAIC0yMTM1LDQzICsyMDEyLDQxIEBACiAgKiBxdWVyeSBuZXh0IHBvcnQKICAqLwogc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX3F1ZXJ5X25leHRfcG9ydChzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKLQkJCQkJIHZvaWQgX191c2VyICphcmcpCisJCQkJCSB2b2lkICphcmcpCiB7CisJc3RydWN0IHNuZF9zZXFfcG9ydF9pbmZvICppbmZvID0gYXJnOwogCXN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY3B0cjsKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9ydCAqcG9ydCA9IE5VTEw7Ci0Jc3RydWN0IHNuZF9zZXFfcG9ydF9pbmZvIGluZm87CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIGFyZywgc2l6ZW9mKGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JY3B0ciA9IHNuZF9zZXFfY2xpZW50X3VzZV9wdHIoaW5mby5hZGRyLmNsaWVudCk7CisJY3B0ciA9IHNuZF9zZXFfY2xpZW50X3VzZV9wdHIoaW5mby0+YWRkci5jbGllbnQpOwogCWlmIChjcHRyID09IE5VTEwpCiAJCXJldHVybiAtRU5YSU87CiAKIAkvKiBzZWFyY2ggZm9yIG5leHQgcG9ydCAqLwotCWluZm8uYWRkci5wb3J0Kys7Ci0JcG9ydCA9IHNuZF9zZXFfcG9ydF9xdWVyeV9uZWFyZXN0KGNwdHIsICZpbmZvKTsKKwlpbmZvLT5hZGRyLnBvcnQrKzsKKwlwb3J0ID0gc25kX3NlcV9wb3J0X3F1ZXJ5X25lYXJlc3QoY3B0ciwgaW5mbyk7CiAJaWYgKHBvcnQgPT0gTlVMTCkgewogCQlzbmRfc2VxX2NsaWVudF91bmxvY2soY3B0cik7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAogCS8qIGdldCBwb3J0IGluZm8gKi8KLQlpbmZvLmFkZHIgPSBwb3J0LT5hZGRyOwotCXNuZF9zZXFfZ2V0X3BvcnRfaW5mbyhwb3J0LCAmaW5mbyk7CisJaW5mby0+YWRkciA9IHBvcnQtPmFkZHI7CisJc25kX3NlcV9nZXRfcG9ydF9pbmZvKHBvcnQsIGluZm8pOwogCXNuZF9zZXFfcG9ydF91bmxvY2socG9ydCk7CiAJc25kX3NlcV9jbGllbnRfdW5sb2NrKGNwdHIpOwogCi0JaWYgKGNvcHlfdG9fdXNlcihhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gMDsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIHN0cnVjdCBzZXFfaW9jdGxfdGFibGUgeworc3RhdGljIGNvbnN0IHN0cnVjdCBpb2N0bF9oYW5kbGVyIHsKIAl1bnNpZ25lZCBpbnQgY21kOwotCWludCAoKmZ1bmMpKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LCB2b2lkIF9fdXNlciAqIGFyZyk7Ci19IGlvY3RsX3RhYmxlc1tdID0geworCWludCAoKmZ1bmMpKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LCB2b2lkICphcmcpOworfSBpb2N0bF9oYW5kbGVyc1tdID0geworCXsgU05EUlZfU0VRX0lPQ1RMX1BWRVJTSU9OLCBzbmRfc2VxX2lvY3RsX3B2ZXJzaW9uIH0sCisJeyBTTkRSVl9TRVFfSU9DVExfQ0xJRU5UX0lELCBzbmRfc2VxX2lvY3RsX2NsaWVudF9pZCB9LAogCXsgU05EUlZfU0VRX0lPQ1RMX1NZU1RFTV9JTkZPLCBzbmRfc2VxX2lvY3RsX3N5c3RlbV9pbmZvIH0sCiAJeyBTTkRSVl9TRVFfSU9DVExfUlVOTklOR19NT0RFLCBzbmRfc2VxX2lvY3RsX3J1bm5pbmdfbW9kZSB9LAogCXsgU05EUlZfU0VRX0lPQ1RMX0dFVF9DTElFTlRfSU5GTywgc25kX3NlcV9pb2N0bF9nZXRfY2xpZW50X2luZm8gfSwKQEAgLTIyMDQsNDAgKzIwNzksNjUgQEAKIAl7IDAsIE5VTEwgfSwKIH07CiAKLXN0YXRpYyBpbnQgc25kX3NlcV9kb19pb2N0bChzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwKLQkJCSAgICB2b2lkIF9fdXNlciAqYXJnKQotewotCXN0cnVjdCBzZXFfaW9jdGxfdGFibGUgKnA7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU05EUlZfU0VRX0lPQ1RMX1BWRVJTSU9OOgotCQkvKiByZXR1cm4gc2VxdWVuY2VyIHZlcnNpb24gbnVtYmVyICovCi0JCXJldHVybiBwdXRfdXNlcihTTkRSVl9TRVFfVkVSU0lPTiwgKGludCBfX3VzZXIgKilhcmcpID8gLUVGQVVMVCA6IDA7Ci0JY2FzZSBTTkRSVl9TRVFfSU9DVExfQ0xJRU5UX0lEOgotCQkvKiByZXR1cm4gdGhlIGlkIG9mIHRoaXMgY2xpZW50ICovCi0JCXJldHVybiBwdXRfdXNlcihjbGllbnQtPm51bWJlciwgKGludCBfX3VzZXIgKilhcmcpID8gLUVGQVVMVCA6IDA7Ci0JfQotCi0JaWYgKCEgYXJnKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlmb3IgKHAgPSBpb2N0bF90YWJsZXM7IHAtPmNtZDsgcCsrKSB7Ci0JCWlmIChwLT5jbWQgPT0gY21kKQotCQkJcmV0dXJuIHAtPmZ1bmMoY2xpZW50LCBhcmcpOwotCX0KLQlwcl9kZWJ1ZygiQUxTQTogc2VxIHVua25vd24gaW9jdGwoKSAweCV4ICh0eXBlPSclYycsIG51bWJlcj0weCUwMngpXG4iLAotCQkgICBjbWQsIF9JT0NfVFlQRShjbWQpLCBfSU9DX05SKGNtZCkpOwotCXJldHVybiAtRU5PVFRZOwotfQotCi0KLXN0YXRpYyBsb25nIHNuZF9zZXFfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGxvbmcgc25kX3NlcV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJLyogVG8gdXNlIGtlcm5lbCBzdGFjayBmb3IgaW9jdGwgZGF0YS4gKi8KKwl1bmlvbiB7CisJCWludCBwdmVyc2lvbjsKKwkJaW50IGNsaWVudF9pZDsKKwkJc3RydWN0IHNuZF9zZXFfc3lzdGVtX2luZm8Jc3lzdGVtX2luZm87CisJCXN0cnVjdCBzbmRfc2VxX3J1bm5pbmdfaW5mbwlydW5uaW5nX2luZm87CisJCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9pbmZvCWNsaWVudF9pbmZvOworCQlzdHJ1Y3Qgc25kX3NlcV9wb3J0X2luZm8JcG9ydF9pbmZvOworCQlzdHJ1Y3Qgc25kX3NlcV9wb3J0X3N1YnNjcmliZQlwb3J0X3N1YnNjcmliZTsKKwkJc3RydWN0IHNuZF9zZXFfcXVldWVfaW5mbwlxdWV1ZV9pbmZvOworCQlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9zdGF0dXMJcXVldWVfc3RhdHVzOworCQlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV90ZW1wbwl0ZW1wbzsKKwkJc3RydWN0IHNuZF9zZXFfcXVldWVfdGltZXIJcXVldWVfdGltZXI7CisJCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX2NsaWVudAlxdWV1ZV9jbGllbnQ7CisJCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb29sCWNsaWVudF9wb29sOworCQlzdHJ1Y3Qgc25kX3NlcV9yZW1vdmVfZXZlbnRzCXJlbW92ZV9ldmVudHM7CisJCXN0cnVjdCBzbmRfc2VxX3F1ZXJ5X3N1YnMJcXVlcnlfc3ViczsKKwl9IGJ1ZjsKKwljb25zdCBzdHJ1Y3QgaW9jdGxfaGFuZGxlciAqaGFuZGxlcjsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJaW50IGVycjsKIAogCWlmIChzbmRfQlVHX09OKCFjbGllbnQpKQogCQlyZXR1cm4gLUVOWElPOwotCQkKLQlyZXR1cm4gc25kX3NlcV9kb19pb2N0bChjbGllbnQsIGNtZCwgKHZvaWQgX191c2VyICopIGFyZyk7CisKKwlmb3IgKGhhbmRsZXIgPSBpb2N0bF9oYW5kbGVyczsgaGFuZGxlci0+Y21kID4gMDsgKytoYW5kbGVyKSB7CisJCWlmIChoYW5kbGVyLT5jbWQgPT0gY21kKQorCQkJYnJlYWs7CisJfQorCWlmIChoYW5kbGVyLT5jbWQgPT0gMCkKKwkJcmV0dXJuIC1FTk9UVFk7CisKKwltZW1zZXQoJmJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCisJLyoKKwkgKiBBbGwgb2YgaW9jdGwgY29tbWFuZHMgZm9yIEFMU0Egc2VxdWVuY2VyIGdldCBhbiBhcmd1bWVudCBvZiBzaXplCisJICogd2l0aGluIDEzIGJpdHMuIFdlIGNhbiBzYWZlbHkgcGljayB1cCB0aGUgc2l6ZSBmcm9tIHRoZSBjb21tYW5kLgorCSAqLworCXNpemUgPSBfSU9DX1NJWkUoaGFuZGxlci0+Y21kKTsKKwlpZiAoaGFuZGxlci0+Y21kICYgSU9DX0lOKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmYnVmLCAoY29uc3Qgdm9pZCBfX3VzZXIgKilhcmcsIHNpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJZXJyID0gaGFuZGxlci0+ZnVuYyhjbGllbnQsICZidWYpOworCWlmIChlcnIgPj0gMCkgeworCQkvKiBTb21lIGNvbW1hbmRzIGluY2x1ZGVzIGEgYnVnIGluICdkaXInIGZpZWxkLiAqLworCQlpZiAoaGFuZGxlci0+Y21kID09IFNORFJWX1NFUV9JT0NUTF9TRVRfUVVFVUVfQ0xJRU5UIHx8CisJCSAgICBoYW5kbGVyLT5jbWQgPT0gU05EUlZfU0VRX0lPQ1RMX1NFVF9DTElFTlRfUE9PTCB8fAorCQkgICAgKGhhbmRsZXItPmNtZCAmIElPQ19PVVQpKQorCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZidWYsIHNpemUpKQorCQkJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiBlcnI7CiB9CiAKICNpZmRlZiBDT05GSUdfQ09NUEFUCkBAIC0yNDIzLDIzICsyMzIzLDM1IEBACiAKIEVYUE9SVF9TWU1CT0woc25kX3NlcV9rZXJuZWxfY2xpZW50X2Rpc3BhdGNoKTsKIAotLyoKLSAqIGV4cG9ydGVkLCBjYWxsZWQgYnkga2VybmVsIGNsaWVudHMgdG8gcGVyZm9ybSBzYW1lIGZ1bmN0aW9ucyBhcyB3aXRoCi0gKiB1c2VybGFuZCBpb2N0bCgpIAorLyoqCisgKiBzbmRfc2VxX2tlcm5lbF9jbGllbnRfY3RsIC0gb3BlcmF0ZSBhIGNvbW1hbmQgZm9yIGEgY2xpZW50IHdpdGggZGF0YSBpbgorICoJCQkgICAgICAga2VybmVsIHNwYWNlLgorICogQGNsaWVudGlkOglBIG51bWVyaWNhbCBJRCBmb3IgYSBjbGllbnQuCisgKiBAY21kOglBbiBpb2N0bCgyKSBjb21tYW5kIGZvciBBTFNBIHNlcXVlbmNlciBvcGVyYXRpb24uCisgKiBAYXJnOglBIHBvaW50ZXIgdG8gZGF0YSBpbiBrZXJuZWwgc3BhY2UuCisgKgorICogQWdhaW5zdCBpdHMgbmFtZSwgYm90aCBrZXJuZWwvYXBwbGljYXRpb24gY2xpZW50IGNhbiBiZSBoYW5kbGVkIGJ5IHRoaXMKKyAqIGtlcm5lbCBBUEkuIEEgcG9pbnRlciBvZiAnYXJnJyBhcmd1bWVudCBzaG91bGQgYmUgaW4ga2VybmVsIHNwYWNlLgorICoKKyAqIFJldHVybjogMCBhdCBzdWNjZXNzLiBOZWdhdGl2ZSBlcnJvciBjb2RlIGF0IGZhaWx1cmUuCiAgKi8KIGludCBzbmRfc2VxX2tlcm5lbF9jbGllbnRfY3RsKGludCBjbGllbnRpZCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogeworCWNvbnN0IHN0cnVjdCBpb2N0bF9oYW5kbGVyICpoYW5kbGVyOwogCXN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50OwotCW1tX3NlZ21lbnRfdCBmczsKLQlpbnQgcmVzdWx0OwogCiAJY2xpZW50ID0gY2xpZW50cHRyKGNsaWVudGlkKTsKIAlpZiAoY2xpZW50ID09IE5VTEwpCiAJCXJldHVybiAtRU5YSU87Ci0JZnMgPSBzbmRfZW50ZXJfdXNlcigpOwotCXJlc3VsdCA9IHNuZF9zZXFfZG9faW9jdGwoY2xpZW50LCBjbWQsICh2b2lkIF9fZm9yY2UgX191c2VyICopYXJnKTsKLQlzbmRfbGVhdmVfdXNlcihmcyk7Ci0JcmV0dXJuIHJlc3VsdDsKKworCWZvciAoaGFuZGxlciA9IGlvY3RsX2hhbmRsZXJzOyBoYW5kbGVyLT5jbWQgPiAwOyArK2hhbmRsZXIpIHsKKwkJaWYgKGhhbmRsZXItPmNtZCA9PSBjbWQpCisJCQlyZXR1cm4gaGFuZGxlci0+ZnVuYyhjbGllbnQsIGFyZyk7CisJfQorCisJcHJfZGVidWcoIkFMU0E6IHNlcSB1bmtub3duIGlvY3RsKCkgMHgleCAodHlwZT0nJWMnLCBudW1iZXI9MHglMDJ4KVxuIiwKKwkJIGNtZCwgX0lPQ19UWVBFKGNtZCksIF9JT0NfTlIoY21kKSk7CisJcmV0dXJuIC1FTk9UVFk7CiB9CiAKIEVYUE9SVF9TWU1CT0woc25kX3NlcV9rZXJuZWxfY2xpZW50X2N0bCk7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfY29tcGF0LmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfY29tcGF0LmMKaW5kZXggNjUxNzU5MC4uZmNlNTY5NyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX2NvbXBhdC5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9jb21wYXQuYwpAQCAtNDcsNyArNDcsNiBAQAogewogCWludCBlcnIgPSAtRUZBVUxUOwogCXN0cnVjdCBzbmRfc2VxX3BvcnRfaW5mbyAqZGF0YTsKLQltbV9zZWdtZW50X3QgZnM7CiAKIAlkYXRhID0ga21hbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEpCkBAIC01OSw5ICs1OCw3IEBACiAJCWdvdG8gZXJyb3I7CiAJZGF0YS0+a2VybmVsID0gTlVMTDsKIAotCWZzID0gc25kX2VudGVyX3VzZXIoKTsKLQllcnIgPSBzbmRfc2VxX2RvX2lvY3RsKGNsaWVudCwgY21kLCBkYXRhKTsKLQlzbmRfbGVhdmVfdXNlcihmcyk7CisJZXJyID0gc25kX3NlcV9rZXJuZWxfY2xpZW50X2N0bChjbGllbnQtPm51bWJlciwgY21kLCAmZGF0YSk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyb3I7CiAKQEAgLTEyMyw3ICsxMjAsNyBAQAogCWNhc2UgU05EUlZfU0VRX0lPQ1RMX0dFVF9TVUJTQ1JJUFRJT046CiAJY2FzZSBTTkRSVl9TRVFfSU9DVExfUVVFUllfTkVYVF9DTElFTlQ6CiAJY2FzZSBTTkRSVl9TRVFfSU9DVExfUlVOTklOR19NT0RFOgotCQlyZXR1cm4gc25kX3NlcV9kb19pb2N0bChjbGllbnQsIGNtZCwgYXJncCk7CisJCXJldHVybiBzbmRfc2VxX2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKIAljYXNlIFNORFJWX1NFUV9JT0NUTF9DUkVBVEVfUE9SVDMyOgogCQlyZXR1cm4gc25kX3NlcV9jYWxsX3BvcnRfaW5mb19pb2N0bChjbGllbnQsIFNORFJWX1NFUV9JT0NUTF9DUkVBVEVfUE9SVCwgYXJncCk7CiAJY2FzZSBTTkRSVl9TRVFfSU9DVExfREVMRVRFX1BPUlQzMjoKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvdGltZXIuYyBiL3NvdW5kL2NvcmUvdGltZXIuYwppbmRleCA5YTYxNTdlLi5mYzE0NGY0IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3RpbWVyLmMKKysrIGIvc291bmQvY29yZS90aW1lci5jCkBAIC0zNSw2ICszNSw5IEBACiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KIAorLyogaW50ZXJuYWwgZmxhZ3MgKi8KKyNkZWZpbmUgU05EUlZfVElNRVJfSUZMR19QQVVTRUQJCTB4MDAwMTAwMDAKKwogI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9IUlRJTUVSKQogI2RlZmluZSBERUZBVUxUX1RJTUVSX0xJTUlUIDQKICNlbHNlCkBAIC0yOTQsOCArMjk3LDIxIEBACiAJCWdldF9kZXZpY2UoJnRpbWVyLT5jYXJkLT5jYXJkX2Rldik7CiAJdGltZXJpLT5zbGF2ZV9jbGFzcyA9IHRpZC0+ZGV2X3NjbGFzczsKIAl0aW1lcmktPnNsYXZlX2lkID0gc2xhdmVfaWQ7Ci0JaWYgKGxpc3RfZW1wdHkoJnRpbWVyLT5vcGVuX2xpc3RfaGVhZCkgJiYgdGltZXItPmh3Lm9wZW4pCi0JCXRpbWVyLT5ody5vcGVuKHRpbWVyKTsKKworCWlmIChsaXN0X2VtcHR5KCZ0aW1lci0+b3Blbl9saXN0X2hlYWQpICYmIHRpbWVyLT5ody5vcGVuKSB7CisJCWludCBlcnIgPSB0aW1lci0+aHcub3Blbih0aW1lcik7CisJCWlmIChlcnIpIHsKKwkJCWtmcmVlKHRpbWVyaS0+b3duZXIpOworCQkJa2ZyZWUodGltZXJpKTsKKworCQkJaWYgKHRpbWVyLT5jYXJkKQorCQkJCXB1dF9kZXZpY2UoJnRpbWVyLT5jYXJkLT5jYXJkX2Rldik7CisJCQltb2R1bGVfcHV0KHRpbWVyLT5tb2R1bGUpOworCQkJbXV0ZXhfdW5sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCiAJbGlzdF9hZGRfdGFpbCgmdGltZXJpLT5vcGVuX2xpc3QsICZ0aW1lci0+b3Blbl9saXN0X2hlYWQpOwogCXNuZF90aW1lcl9jaGVja19tYXN0ZXIodGltZXJpKTsKIAltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKQEAgLTUyNiw2ICs1NDIsMTAgQEAKIAkJfQogCX0KIAl0aW1lcmktPmZsYWdzICY9IH4oU05EUlZfVElNRVJfSUZMR19SVU5OSU5HIHwgU05EUlZfVElNRVJfSUZMR19TVEFSVCk7CisJaWYgKHN0b3ApCisJCXRpbWVyaS0+ZmxhZ3MgJj0gflNORFJWX1RJTUVSX0lGTEdfUEFVU0VEOworCWVsc2UKKwkJdGltZXJpLT5mbGFncyB8PSBTTkRSVl9USU1FUl9JRkxHX1BBVVNFRDsKIAlzbmRfdGltZXJfbm90aWZ5MSh0aW1lcmksIHN0b3AgPyBTTkRSVl9USU1FUl9FVkVOVF9TVE9QIDoKIAkJCSAgU05EUlZfVElNRVJfRVZFTlRfQ09OVElOVUUpOwogIHVubG9jazoKQEAgLTU4Nyw2ICs2MDcsMTAgQEAKICAqLwogaW50IHNuZF90aW1lcl9jb250aW51ZShzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlICp0aW1lcmkpCiB7CisJLyogdGltZXIgY2FuIGNvbnRpbnVlIG9ubHkgYWZ0ZXIgcGF1c2UgKi8KKwlpZiAoISh0aW1lcmktPmZsYWdzICYgU05EUlZfVElNRVJfSUZMR19QQVVTRUQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmICh0aW1lcmktPmZsYWdzICYgU05EUlZfVElNRVJfSUZMR19TTEFWRSkKIAkJcmV0dXJuIHNuZF90aW1lcl9zdGFydF9zbGF2ZSh0aW1lcmksIGZhbHNlKTsKIAllbHNlCkBAIC04MTMsNiArODM3LDcgQEAKIAl0aW1lci0+dG1yX3N1YmRldmljZSA9IHRpZC0+c3ViZGV2aWNlOwogCWlmIChpZCkKIAkJc3RybGNweSh0aW1lci0+aWQsIGlkLCBzaXplb2YodGltZXItPmlkKSk7CisJdGltZXItPnN0aWNrcyA9IDE7CiAJSU5JVF9MSVNUX0hFQUQoJnRpbWVyLT5kZXZpY2VfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJnRpbWVyLT5vcGVuX2xpc3RfaGVhZCk7CiAJSU5JVF9MSVNUX0hFQUQoJnRpbWVyLT5hY3RpdmVfbGlzdF9oZWFkKTsKQEAgLTE4MTcsNiArMTg0Miw5IEBACiAJdHUgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaWYgKCF0dS0+dGltZXJpKQogCQlyZXR1cm4gLUVCQURGRDsKKwkvKiBzdGFydCB0aW1lciBpbnN0ZWFkIG9mIGNvbnRpbnVlIGlmIGl0J3Mgbm90IHVzZWQgYmVmb3JlICovCisJaWYgKCEodHUtPnRpbWVyaS0+ZmxhZ3MgJiBTTkRSVl9USU1FUl9JRkxHX1BBVVNFRCkpCisJCXJldHVybiBzbmRfdGltZXJfdXNlcl9zdGFydChmaWxlKTsKIAl0dS0+dGltZXJpLT5sb3N0ID0gMDsKIAlyZXR1cm4gKGVyciA9IHNuZF90aW1lcl9jb250aW51ZSh0dS0+dGltZXJpKSkgPCAwID8gZXJyIDogMDsKIH0KQEAgLTE5NTgsNiArMTk4Niw3IEBACiAJCXR1LT5xdXNlZC0tOwogCQlzcGluX3VubG9ja19pcnEoJnR1LT5xbG9jayk7CiAKKwkJbXV0ZXhfbG9jaygmdHUtPmlvY3RsX2xvY2spOwogCQlpZiAodHUtPnRyZWFkKSB7CiAJCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgJnR1LT50cXVldWVbcWhlYWRdLAogCQkJCQkgc2l6ZW9mKHN0cnVjdCBzbmRfdGltZXJfdHJlYWQpKSkKQEAgLTE5NjcsNiArMTk5Niw3IEBACiAJCQkJCSBzaXplb2Yoc3RydWN0IHNuZF90aW1lcl9yZWFkKSkpCiAJCQkJZXJyID0gLUVGQVVMVDsKIAkJfQorCQltdXRleF91bmxvY2soJnR1LT5pb2N0bF9sb2NrKTsKIAogCQlzcGluX2xvY2tfaXJxKCZ0dS0+cWxvY2spOwogCQlpZiAoZXJyIDwgMCkKZGlmZiAtLWdpdCBhL3NvdW5kL2ZpcmV3aXJlL2JlYm9iL01ha2VmaWxlIGIvc291bmQvZmlyZXdpcmUvYmVib2IvTWFrZWZpbGUKaW5kZXggYWY3ZWQ2Ni4uZGQ0NTQ4NiAxMDA2NDQKLS0tIGEvc291bmQvZmlyZXdpcmUvYmVib2IvTWFrZWZpbGUKKysrIGIvc291bmQvZmlyZXdpcmUvYmVib2IvTWFrZWZpbGUKQEAgLTEsNCArMSw1IEBACiBzbmQtYmVib2Itb2JqcyA6PSBiZWJvYl9jb21tYW5kLm8gYmVib2Jfc3RyZWFtLm8gYmVib2JfcHJvYy5vIGJlYm9iX21pZGkubyBcCi0JCSAgYmVib2JfcGNtLm8gYmVib2JfaHdkZXAubyBiZWJvYl90ZXJyYXRlYy5vIGJlYm9iX3lhbWFoYS5vIFwKLQkJICBiZWJvYl9mb2N1c3JpdGUubyBiZWJvYl9tYXVkaW8ubyBiZWJvYi5vCisJCSAgYmVib2JfcGNtLm8gYmVib2JfaHdkZXAubyBiZWJvYl90ZXJyYXRlYy5vIFwKKwkJICBiZWJvYl95YW1haGFfdGVycmF0ZWMubyBiZWJvYl9mb2N1c3JpdGUubyBiZWJvYl9tYXVkaW8ubyBcCisJCSAgYmVib2Iubwogb2JqLSQoQ09ORklHX1NORF9CRUJPQikgKz0gc25kLWJlYm9iLm8KZGlmZiAtLWdpdCBhL3NvdW5kL2ZpcmV3aXJlL2JlYm9iL2JlYm9iLmMgYi9zb3VuZC9maXJld2lyZS9iZWJvYi9iZWJvYi5jCmluZGV4IGY3ZTJjYmQuLjM0NjlhYzE0IDEwMDY0NAotLS0gYS9zb3VuZC9maXJld2lyZS9iZWJvYi9iZWJvYi5jCisrKyBiL3NvdW5kL2ZpcmV3aXJlL2JlYm9iL2JlYm9iLmMKQEAgLTQ1OCwxNyArNDU4LDE3IEBACiAJLyogVGVycmFUZWMgRWxlY3Ryb25pYyBHbWJILCBQSEFTRSA4OCBSYWNrIEZXICovCiAJU05EX0JFQk9CX0RFVl9FTlRSWShWRU5fVEVSUkFURUMsIDB4MDAwMDAwMDMsICZwaGFzZTg4X3JhY2tfc3BlYyksCiAJLyogVGVycmFUZWMgRWxlY3Ryb25pYyBHbWJILCBQSEFTRSAyNCBGVyAqLwotCVNORF9CRUJPQl9ERVZfRU5UUlkoVkVOX1RFUlJBVEVDLCAweDAwMDAwMDA0LCAmcGhhc2UyNF9zZXJpZXNfc3BlYyksCisJU05EX0JFQk9CX0RFVl9FTlRSWShWRU5fVEVSUkFURUMsIDB4MDAwMDAwMDQsICZ5YW1haGFfdGVycmF0ZWNfc3BlYyksCiAJLyogVGVycmFUZWMgRWxlY3Ryb25pYyBHbWJILCBQaGFzZSBYMjQgRlcgKi8KLQlTTkRfQkVCT0JfREVWX0VOVFJZKFZFTl9URVJSQVRFQywgMHgwMDAwMDAwNywgJnBoYXNlMjRfc2VyaWVzX3NwZWMpLAorCVNORF9CRUJPQl9ERVZfRU5UUlkoVkVOX1RFUlJBVEVDLCAweDAwMDAwMDA3LCAmeWFtYWhhX3RlcnJhdGVjX3NwZWMpLAogCS8qIFRlcnJhVGVjIEVsZWN0cm9uaWMgR21iSCwgRVdTIE1JQzIvTUlDOCAqLwogCVNORF9CRUJPQl9ERVZfRU5UUlkoVkVOX1RFUlJBVEVDLCAweDAwMDAwMDA1LCAmc3BlY19ub3JtYWwpLAogCS8qIFRlcnJhdGVjIEVsZWN0cm9uaWMgR21iSCwgQXVyZW9uIDcuMSBGaXJld2lyZSAqLwogCVNORF9CRUJPQl9ERVZfRU5UUlkoVkVOX1RFUlJBVEVDLCAweDAwMDAwMDAyLCAmc3BlY19ub3JtYWwpLAogCS8qIFlhbWFoYSwgR080NCAqLwotCVNORF9CRUJPQl9ERVZfRU5UUlkoVkVOX1lBTUFIQSwgMHgwMDEwMDAwYiwgJnlhbWFoYV9nb19zcGVjKSwKKwlTTkRfQkVCT0JfREVWX0VOVFJZKFZFTl9ZQU1BSEEsIDB4MDAxMDAwMGIsICZ5YW1haGFfdGVycmF0ZWNfc3BlYyksCiAJLyogWUFNQUhBLCBHTzQ2ICovCi0JU05EX0JFQk9CX0RFVl9FTlRSWShWRU5fWUFNQUhBLCAweDAwMTAwMDBjLCAmeWFtYWhhX2dvX3NwZWMpLAorCVNORF9CRUJPQl9ERVZfRU5UUlkoVkVOX1lBTUFIQSwgMHgwMDEwMDAwYywgJnlhbWFoYV90ZXJyYXRlY19zcGVjKSwKIAkvKiBGb2N1c3JpdGUsIFNhZmZpcmVQcm8gMjYgSS9PICovCiAJU05EX0JFQk9CX0RFVl9FTlRSWShWRU5fRk9DVVNSSVRFLCAweDAwMDAwMDAzLCAmc2FmZmlyZXByb18yNl9zcGVjKSwKIAkvKiBGb2N1c3JpdGUsIFNhZmZpcmVQcm8gMTAgSS9PICovCmRpZmYgLS1naXQgYS9zb3VuZC9maXJld2lyZS9iZWJvYi9iZWJvYi5oIGIvc291bmQvZmlyZXdpcmUvYmVib2IvYmVib2IuaAppbmRleCBlN2YxYmI5Li4xNzVkYTg3IDEwMDY0NAotLS0gYS9zb3VuZC9maXJld2lyZS9iZWJvYi9iZWJvYi5oCisrKyBiL3NvdW5kL2ZpcmV3aXJlL2JlYm9iL2JlYm9iLmgKQEAgLTIzNSw4ICsyMzUsNyBAQAogCiAvKiBtb2RlbCBzcGVjaWZpYyBvcGVyYXRpb25zICovCiBleHRlcm4gY29uc3Qgc3RydWN0IHNuZF9iZWJvYl9zcGVjIHBoYXNlODhfcmFja19zcGVjOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBzbmRfYmVib2Jfc3BlYyBwaGFzZTI0X3Nlcmllc19zcGVjOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBzbmRfYmVib2Jfc3BlYyB5YW1haGFfZ29fc3BlYzsKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc25kX2JlYm9iX3NwZWMgeWFtYWhhX3RlcnJhdGVjX3NwZWM7CiBleHRlcm4gY29uc3Qgc3RydWN0IHNuZF9iZWJvYl9zcGVjIHNhZmZpcmVwcm9fMjZfc3BlYzsKIGV4dGVybiBjb25zdCBzdHJ1Y3Qgc25kX2JlYm9iX3NwZWMgc2FmZmlyZXByb18xMF9zcGVjOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBzbmRfYmVib2Jfc3BlYyBzYWZmaXJlX2xlX3NwZWM7CmRpZmYgLS1naXQgYS9zb3VuZC9maXJld2lyZS9iZWJvYi9iZWJvYl90ZXJyYXRlYy5jIGIvc291bmQvZmlyZXdpcmUvYmVib2IvYmVib2JfdGVycmF0ZWMuYwppbmRleCBjMzgzNThiLi4yZmRhZjkzIDEwMDY0NAotLS0gYS9zb3VuZC9maXJld2lyZS9iZWJvYi9iZWJvYl90ZXJyYXRlYy5jCisrKyBiL3NvdW5kL2ZpcmV3aXJlL2JlYm9iL2JlYm9iX3RlcnJhdGVjLmMKQEAgLTM2LDI1ICszNiw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGVudW0gc25kX2JlYm9iX2Nsb2NrX3R5cGUgcGhhc2UyNF9zZXJpZXNfY2xrX3NyY190eXBlc1tdID0gewotCVNORF9CRUJPQl9DTE9DS19UWVBFX0lOVEVSTkFMLAotCVNORF9CRUJPQl9DTE9DS19UWVBFX0VYVEVSTkFMLAkvKiBTL1BESUYgKi8KLX07Ci1zdGF0aWMgaW50Ci1waGFzZTI0X3Nlcmllc19jbGtfc3JjX2dldChzdHJ1Y3Qgc25kX2JlYm9iICpiZWJvYiwgdW5zaWduZWQgaW50ICppZCkKLXsKLQlpbnQgZXJyOwotCi0JZXJyID0gYXZjX2F1ZGlvX2dldF9zZWxlY3RvcihiZWJvYi0+dW5pdCwgMCwgNCwgaWQpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKCppZCA+PSBBUlJBWV9TSVpFKHBoYXNlMjRfc2VyaWVzX2Nsa19zcmNfdHlwZXMpKQotCQlyZXR1cm4gLUVJTzsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9iZWJvYl9yYXRlX3NwZWMgcGhhc2Vfc2VyaWVzX3JhdGVfc3BlYyA9IHsKIAkuZ2V0CT0gJnNuZF9iZWJvYl9zdHJlYW1fZ2V0X3JhdGUsCiAJLnNldAk9ICZzbmRfYmVib2Jfc3RyZWFtX3NldF9yYXRlLApAQCAtNzEsMTUgKzUyLDMgQEAKIAkucmF0ZQk9ICZwaGFzZV9zZXJpZXNfcmF0ZV9zcGVjLAogCS5tZXRlcgk9IE5VTEwKIH07Ci0KLS8qICdQSEFTRSAyNCBGVycgYW5kICdQSEFTRSBYMjQgRlcnICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9iZWJvYl9jbG9ja19zcGVjIHBoYXNlMjRfc2VyaWVzX2NsayA9IHsKLQkubnVtCT0gQVJSQVlfU0laRShwaGFzZTI0X3Nlcmllc19jbGtfc3JjX3R5cGVzKSwKLQkudHlwZXMJPSBwaGFzZTI0X3Nlcmllc19jbGtfc3JjX3R5cGVzLAotCS5nZXQJPSAmcGhhc2UyNF9zZXJpZXNfY2xrX3NyY19nZXQsCi19OwotY29uc3Qgc3RydWN0IHNuZF9iZWJvYl9zcGVjIHBoYXNlMjRfc2VyaWVzX3NwZWMgPSB7Ci0JLmNsb2NrCT0gJnBoYXNlMjRfc2VyaWVzX2NsaywKLQkucmF0ZQk9ICZwaGFzZV9zZXJpZXNfcmF0ZV9zcGVjLAotCS5tZXRlcgk9IE5VTEwKLX07CmRpZmYgLS1naXQgYS9zb3VuZC9maXJld2lyZS9iZWJvYi9iZWJvYl95YW1haGEuYyBiL3NvdW5kL2ZpcmV3aXJlL2JlYm9iL2JlYm9iX3lhbWFoYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGQ0NDA0Li4wMDAwMDAwCi0tLSBhL3NvdW5kL2ZpcmV3aXJlL2JlYm9iL2JlYm9iX3lhbWFoYS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIGJlYm9iX3lhbWFoYS5jIC0gYSBwYXJ0IG9mIGRyaXZlciBmb3IgQmVCb0IgYmFzZWQgZGV2aWNlcwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFRha2FzaGkgU2FrYW1vdG8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIuCi0gKi8KLQotI2luY2x1ZGUgIi4vYmVib2IuaCIKLQotLyoKLSAqIE5PVEU6Ci0gKiBZYW1haGEgR080NCBpcyBub3QgZGVzaWduZWQgdG8gYmUgdXNlZCBhcyBzdGFuZC1hbG9uZSBtaXhlci4gU28gYW55IHN0cmVhbXMKLSAqIG11c3QgYmUgYWNjb21wYW5pZWQuIElmIGNoYW5naW5nIHRoZSBzdGF0ZSwgYSBMRUQgb24gdGhlIGRldmljZSBzdGFydHMgdG8KLSAqIGJsaW5rIGFuZCBpdHMgc3luYyBzdGF0dXMgaXMgZmFsc2UuIEluIHRoaXMgc3RhdGUsIHRoZSBkZXZpY2Ugc291bmRzIG5vdGhpbmcKLSAqIGV2ZW4gaWYgc3RyZWFtaW5nLiBUbyBzdGFydCBzdHJlYW1pbmcgYXQgdGhlIGN1cnJlbnQgc2FtcGxpbmcgcmF0ZSBpcyBvbmx5Ci0gKiB3YXkgdG8gcmV2b2NlciB0aGlzIHN0YXRlLiBHTzQ2IGlzIGJldHRlciBmb3Igc3RhbmQtYWxvbmUgbWl4ZXIuCi0gKgotICogQm90aCBvZiB0aGVtIGhhdmUgYSBjYXBhYmlsaXR5IHRvIGNoYW5nZSBpdHMgc2FtcGxpbmcgcmF0ZSB1cCB0byAxOTIuMGtIei4KLSAqIEF0IDE5Mi4wa0h6LCB0aGUgZGV2aWNlIHJlcG9ydHMgNCBQQ00taW4sIDEgTUlESS1pbiwgNiBQQ00tb3V0LCAxIE1JREktb3V0LgotICogQnV0IFlhbWFoYSdzIGRyaXZlciByZWR1Y2UgMiBQQ00taW4sIDEgTUlESS1pbiwgMiBQQ00tb3V0LCAxIE1JREktb3V0IHRvIHVzZQotICogJ0V4dGVuZGVkIFN0cmVhbSBGb3JtYXQgSW5mb3JtYXRpb24gQ29tbWFuZCAtIFNpbmdsZSBSZXF1ZXN0JyBpbiAnQWRkaXRpb25hbAotICogQVZDIGNvbW1hbmRzJyBkZWZpbmVkIGJ5IEJyaWRnZUNvLgotICogVGhpcyBBTFNBIGRyaXZlciBkb24ndCBkbyB0aGlzIGJlY2F1c2UgYSBiaXQgdGlyZXNvbWUuIFRoZW4gaXNvY2hyb25vdXMKLSAqIHN0cmVhbWluZyB3aXRoIG1hbnkgYXN5bmNocm9ub3VzIHRyYW5zYWN0aW9ucyBicmluZ3Mgc291bmRzIHdpdGggbm9pc2VzLgotICogVW5mb3J0dW5hdGVseSBjdXJyZW50ICdmZmFkby1taXhlcicgZ2VuZXJhdGVkIG1hbnkgYXN5bmNocm9ub3VzIHRyYW5zYWN0aW9uCi0gKiB0byBvYnNlcnZlIGRldmljZSdzIHN0YXRlLCBtYWlubHkgY2hlY2sgY21wIGNvbm5lY3Rpb24gYW5kIHNpZ25hbCBmb3JtYXQuIEkKLSAqIHJlY2NvbWVuZCB1c2VycyB0byBjbG9zZSBmZmFkby1taXhlciBhdCAxOTIuMGtIeiBpZiBtaXhlciBpcyBuZWVkbGVzcy4KLSAqLwotCi1zdGF0aWMgZW51bSBzbmRfYmVib2JfY2xvY2tfdHlwZSBjbGtfc3JjX3R5cGVzW10gPSB7Ci0JU05EX0JFQk9CX0NMT0NLX1RZUEVfSU5URVJOQUwsCi0JU05EX0JFQk9CX0NMT0NLX1RZUEVfRVhURVJOQUwsCS8qIFMvUERJRiAqLwotfTsKLXN0YXRpYyBpbnQKLWNsa19zcmNfZ2V0KHN0cnVjdCBzbmRfYmVib2IgKmJlYm9iLCB1bnNpZ25lZCBpbnQgKmlkKQotewotCWludCBlcnI7Ci0KLQllcnIgPSBhdmNfYXVkaW9fZ2V0X3NlbGVjdG9yKGJlYm9iLT51bml0LCAwLCA0LCBpZCk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlpZiAoKmlkID49IEFSUkFZX1NJWkUoY2xrX3NyY190eXBlcykpCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9iZWJvYl9jbG9ja19zcGVjIGNsb2NrX3NwZWMgPSB7Ci0JLm51bQk9IEFSUkFZX1NJWkUoY2xrX3NyY190eXBlcyksCi0JLnR5cGVzCT0gY2xrX3NyY190eXBlcywKLQkuZ2V0CT0gJmNsa19zcmNfZ2V0LAotfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2JlYm9iX3JhdGVfc3BlYyByYXRlX3NwZWMgPSB7Ci0JLmdldAk9ICZzbmRfYmVib2Jfc3RyZWFtX2dldF9yYXRlLAotCS5zZXQJPSAmc25kX2JlYm9iX3N0cmVhbV9zZXRfcmF0ZSwKLX07Ci1jb25zdCBzdHJ1Y3Qgc25kX2JlYm9iX3NwZWMgeWFtYWhhX2dvX3NwZWMgPSB7Ci0JLmNsb2NrCT0gJmNsb2NrX3NwZWMsCi0JLnJhdGUJPSAmcmF0ZV9zcGVjLAotCS5tZXRlcgk9IE5VTEwKLX07CmRpZmYgLS1naXQgYS9zb3VuZC9maXJld2lyZS9iZWJvYi9iZWJvYl95YW1haGFfdGVycmF0ZWMuYyBiL3NvdW5kL2ZpcmV3aXJlL2JlYm9iL2JlYm9iX3lhbWFoYV90ZXJyYXRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YmUzZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9maXJld2lyZS9iZWJvYi9iZWJvYl95YW1haGFfdGVycmF0ZWMuYwpAQCAtMCwwICsxLDY1IEBACisvKgorICogYmVib2JfeWFtYWhhLmMgLSBhIHBhcnQgb2YgZHJpdmVyIGZvciBCZUJvQiBiYXNlZCBkZXZpY2VzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgVGFrYXNoaSBTYWthbW90bworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMi4KKyAqLworCisjaW5jbHVkZSAiLi9iZWJvYi5oIgorCisvKgorICogTk9URToKKyAqIFlhbWFoYSBHTzQ0IGlzIG5vdCBkZXNpZ25lZCB0byBiZSB1c2VkIGFzIHN0YW5kLWFsb25lIG1peGVyLiBTbyBhbnkgc3RyZWFtcworICogbXVzdCBiZSBhY2NvbXBhbmllZC4gSWYgY2hhbmdpbmcgdGhlIHN0YXRlLCBhIExFRCBvbiB0aGUgZGV2aWNlIHN0YXJ0cyB0bworICogYmxpbmsgYW5kIGl0cyBzeW5jIHN0YXR1cyBpcyBmYWxzZS4gSW4gdGhpcyBzdGF0ZSwgdGhlIGRldmljZSBzb3VuZHMgbm90aGluZworICogZXZlbiBpZiBzdHJlYW1pbmcuIFRvIHN0YXJ0IHN0cmVhbWluZyBhdCB0aGUgY3VycmVudCBzYW1wbGluZyByYXRlIGlzIG9ubHkKKyAqIHdheSB0byByZWNvdmVyIHRoaXMgc3RhdGUuIEdPNDYgaXMgYmV0dGVyIGZvciBzdGFuZC1hbG9uZSBtaXhlci4KKyAqCisgKiBCb3RoIG9mIHRoZW0gaGF2ZSBhIGNhcGFiaWxpdHkgdG8gY2hhbmdlIGl0cyBzYW1wbGluZyByYXRlIHVwIHRvIDE5Mi4wa0h6LgorICogQXQgMTkyLjBrSHosIHRoZSBkZXZpY2UgcmVwb3J0cyA0IFBDTS1pbiwgMSBNSURJLWluLCA2IFBDTS1vdXQsIDEgTUlESS1vdXQuCisgKiBCdXQgWWFtYWhhJ3MgZHJpdmVyIHJlZHVjZSAyIFBDTS1pbiwgMSBNSURJLWluLCAyIFBDTS1vdXQsIDEgTUlESS1vdXQgdG8gdXNlCisgKiAnRXh0ZW5kZWQgU3RyZWFtIEZvcm1hdCBJbmZvcm1hdGlvbiBDb21tYW5kIC0gU2luZ2xlIFJlcXVlc3QnIGluICdBZGRpdGlvbmFsCisgKiBBVkMgY29tbWFuZHMnIGRlZmluZWQgYnkgQnJpZGdlQ28uCisgKiBUaGlzIEFMU0EgZHJpdmVyIGRvbid0IGRvIHRoaXMgYmVjYXVzZSBhIGJpdCB0aXJlc29tZS4gVGhlbiBpc29jaHJvbm91cworICogc3RyZWFtaW5nIHdpdGggbWFueSBhc3luY2hyb25vdXMgdHJhbnNhY3Rpb25zIGJyaW5ncyBzb3VuZHMgd2l0aCBub2lzZXMuCisgKiBVbmZvcnR1bmF0ZWx5IGN1cnJlbnQgJ2ZmYWRvLW1peGVyJyBnZW5lcmF0ZWQgbWFueSBhc3luY2hyb25vdXMgdHJhbnNhY3Rpb24KKyAqIHRvIG9ic2VydmUgZGV2aWNlJ3Mgc3RhdGUsIG1haW5seSBjaGVjayBjbXAgY29ubmVjdGlvbiBhbmQgc2lnbmFsIGZvcm1hdC4gSQorICogcmVjb21tZW5kIHVzZXJzIHRvIGNsb3NlIGZmYWRvLW1peGVyIGF0IDE5Mi4wa0h6IGlmIG1peGVyIGlzIG5lZWRsZXNzLgorICoKKyAqIFRlcnJhdGVjIFBIQVNFIDI0IEZXIGFuZCBQSEFTRSBYMjQgRlcgYXJlIGludGVybmFsbHkgdGhlIHNhbWUgYXMKKyAqIFlhbWFoYSBHTyA0NCBhbmQgR08gNDYuIFlhbWFoYSBhbmQgVGVycmF0ZWMgaGFkIGNvb3BlcmF0ZWQgZm9yIHRoZXNlIG1vZGVscy4KKyAqLworCitzdGF0aWMgZW51bSBzbmRfYmVib2JfY2xvY2tfdHlwZSBjbGtfc3JjX3R5cGVzW10gPSB7CisJU05EX0JFQk9CX0NMT0NLX1RZUEVfSU5URVJOQUwsCisJU05EX0JFQk9CX0NMT0NLX1RZUEVfRVhURVJOQUwsCS8qIFMvUERJRiAqLworfTsKK3N0YXRpYyBpbnQKK2Nsa19zcmNfZ2V0KHN0cnVjdCBzbmRfYmVib2IgKmJlYm9iLCB1bnNpZ25lZCBpbnQgKmlkKQoreworCWludCBlcnI7CisKKwllcnIgPSBhdmNfYXVkaW9fZ2V0X3NlbGVjdG9yKGJlYm9iLT51bml0LCAwLCA0LCBpZCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlpZiAoKmlkID49IEFSUkFZX1NJWkUoY2xrX3NyY190eXBlcykpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9iZWJvYl9jbG9ja19zcGVjIGNsb2NrX3NwZWMgPSB7CisJLm51bQk9IEFSUkFZX1NJWkUoY2xrX3NyY190eXBlcyksCisJLnR5cGVzCT0gY2xrX3NyY190eXBlcywKKwkuZ2V0CT0gJmNsa19zcmNfZ2V0LAorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2JlYm9iX3JhdGVfc3BlYyByYXRlX3NwZWMgPSB7CisJLmdldAk9ICZzbmRfYmVib2Jfc3RyZWFtX2dldF9yYXRlLAorCS5zZXQJPSAmc25kX2JlYm9iX3N0cmVhbV9zZXRfcmF0ZSwKK307Citjb25zdCBzdHJ1Y3Qgc25kX2JlYm9iX3NwZWMgeWFtYWhhX3RlcnJhdGVjX3NwZWMgPSB7CisJLmNsb2NrCT0gJmNsb2NrX3NwZWMsCisJLnJhdGUJPSAmcmF0ZV9zcGVjLAorCS5tZXRlcgk9IE5VTEwKK307CmRpZmYgLS1naXQgYS9zb3VuZC9maXJld2lyZS9kaWNlL2RpY2UtcGNtLmMgYi9zb3VuZC9maXJld2lyZS9kaWNlL2RpY2UtcGNtLmMKaW5kZXggNGFhMDI0OS4uNjA3NGZlMSAxMDA2NDQKLS0tIGEvc291bmQvZmlyZXdpcmUvZGljZS9kaWNlLXBjbS5jCisrKyBiL3NvdW5kL2ZpcmV3aXJlL2RpY2UvZGljZS1wY20uYwpAQCAtMzAyLDcgKzMwMiw3IEBACiAKIGludCBzbmRfZGljZV9jcmVhdGVfcGNtKHN0cnVjdCBzbmRfZGljZSAqZGljZSkKIHsKLQlzdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIGNhcHR1cmVfb3BzID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgY2FwdHVyZV9vcHMgPSB7CiAJCS5vcGVuICAgICAgPSBwY21fb3BlbiwKIAkJLmNsb3NlICAgICA9IHBjbV9jbG9zZSwKIAkJLmlvY3RsICAgICA9IHNuZF9wY21fbGliX2lvY3RsLApAQCAtMzE0LDcgKzMxNCw3IEBACiAJCS5wYWdlICAgICAgPSBzbmRfcGNtX2xpYl9nZXRfdm1hbGxvY19wYWdlLAogCQkubW1hcCAgICAgID0gc25kX3BjbV9saWJfbW1hcF92bWFsbG9jLAogCX07Ci0Jc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBwbGF5YmFja19vcHMgPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBwbGF5YmFja19vcHMgPSB7CiAJCS5vcGVuICAgICAgPSBwY21fb3BlbiwKIAkJLmNsb3NlICAgICA9IHBjbV9jbG9zZSwKIAkJLmlvY3RsICAgICA9IHNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvZmlyZXdpcmUvZGlnaTAweC9kaWdpMDB4LXBjbS5jIGIvc291bmQvZmlyZXdpcmUvZGlnaTAweC9kaWdpMDB4LXBjbS5jCmluZGV4IGNhYzI4ZjcuLjYxM2YwNTggMTAwNjQ0Ci0tLSBhL3NvdW5kL2ZpcmV3aXJlL2RpZ2kwMHgvZGlnaTAweC1wY20uYworKysgYi9zb3VuZC9maXJld2lyZS9kaWdpMDB4L2RpZ2kwMHgtcGNtLmMKQEAgLTMyOSw3ICszMjksNyBAQAogCXJldHVybiBhbWR0cF9zdHJlYW1fcGNtX3BvaW50ZXIoJmRnMDB4LT5yeF9zdHJlYW0pOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHBjbV9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgcGNtX2NhcHR1cmVfb3BzID0gewogCS5vcGVuCQk9IHBjbV9vcGVuLAogCS5jbG9zZQkJPSBwY21fY2xvc2UsCiAJLmlvY3RsCQk9IHNuZF9wY21fbGliX2lvY3RsLApAQCAtMzQxLDcgKzM0MSw3IEBACiAJLnBhZ2UJCT0gc25kX3BjbV9saWJfZ2V0X3ZtYWxsb2NfcGFnZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgcGNtX3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgcGNtX3BsYXliYWNrX29wcyA9IHsKIAkub3BlbgkJPSBwY21fb3BlbiwKIAkuY2xvc2UJCT0gcGNtX2Nsb3NlLAogCS5pb2N0bAkJPSBzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL2ZpcmV3aXJlL2ZpcmV3b3Jrcy9maXJld29ya3MuaCBiL3NvdW5kL2ZpcmV3aXJlL2ZpcmV3b3Jrcy9maXJld29ya3MuaAppbmRleCAwM2VkMzUyLi5kNzNjMTJiIDEwMDY0NAotLS0gYS9zb3VuZC9maXJld2lyZS9maXJld29ya3MvZmlyZXdvcmtzLmgKKysrIGIvc291bmQvZmlyZXdpcmUvZmlyZXdvcmtzL2ZpcmV3b3Jrcy5oCkBAIC0xMDgsNyArMTA4LDYgQEAKIAl1OCAqcmVzcF9idWY7CiAJdTggKnB1bGxfcHRyOwogCXU4ICpwdXNoX3B0cjsKLQl1bnNpZ25lZCBpbnQgcmVzcF9xdWV1ZXM7CiB9OwogCiBpbnQgc25kX2Vmd190cmFuc2FjdGlvbl9jbWQoc3RydWN0IGZ3X3VuaXQgKnVuaXQsCmRpZmYgLS1naXQgYS9zb3VuZC9maXJld2lyZS9maXJld29ya3MvZmlyZXdvcmtzX2h3ZGVwLmMgYi9zb3VuZC9maXJld2lyZS9maXJld29ya3MvZmlyZXdvcmtzX2h3ZGVwLmMKaW5kZXggMzNkZjg2NS4uMmUxZDlhMiAxMDA2NDQKLS0tIGEvc291bmQvZmlyZXdpcmUvZmlyZXdvcmtzL2ZpcmV3b3Jrc19od2RlcC5jCisrKyBiL3NvdW5kL2ZpcmV3aXJlL2ZpcmV3b3Jrcy9maXJld29ya3NfaHdkZXAuYwpAQCAtMjUsNiArMjUsNyBAQAogewogCXVuc2lnbmVkIGludCBsZW5ndGgsIHRpbGxfZW5kLCB0eXBlOwogCXN0cnVjdCBzbmRfZWZ3X3RyYW5zYWN0aW9uICp0OworCXU4ICpwdWxsX3B0cjsKIAlsb25nIGNvdW50ID0gMDsKIAogCWlmIChyZW1haW5lZCA8IHNpemVvZih0eXBlKSArIHNpemVvZihzdHJ1Y3Qgc25kX2Vmd190cmFuc2FjdGlvbikpCkBAIC0zOCw4ICszOSwxNyBAQAogCWJ1ZiArPSBzaXplb2YodHlwZSk7CiAKIAkvKiB3cml0ZSBpbnRvIGJ1ZmZlciBhcyBtYW55IHJlc3BvbnNlcyBhcyBwb3NzaWJsZSAqLwotCXdoaWxlIChlZnctPnJlc3BfcXVldWVzID4gMCkgewotCQl0ID0gKHN0cnVjdCBzbmRfZWZ3X3RyYW5zYWN0aW9uICopKGVmdy0+cHVsbF9wdHIpOworCXNwaW5fbG9ja19pcnEoJmVmdy0+bG9jayk7CisKKwkvKgorCSAqIFdoZW4gYW5vdGhlciB0YXNrIHJlYWNoZXMgaGVyZSBkdXJpbmcgdGhpcyB0YXNrJ3MgYWNjZXNzIHRvIHVzZXIKKwkgKiBzcGFjZSwgaXQgcGlja3MgdXAgY3VycmVudCBwb3NpdGlvbiBpbiBidWZmZXIgYW5kIGNhbiByZWFkIHRoZSBzYW1lCisJICogc2VyaWVzIG9mIHJlc3BvbnNlcy4KKwkgKi8KKwlwdWxsX3B0ciA9IGVmdy0+cHVsbF9wdHI7CisKKwl3aGlsZSAoZWZ3LT5wdXNoX3B0ciAhPSBwdWxsX3B0cikgeworCQl0ID0gKHN0cnVjdCBzbmRfZWZ3X3RyYW5zYWN0aW9uICopKHB1bGxfcHRyKTsKIAkJbGVuZ3RoID0gYmUzMl90b19jcHUodC0+bGVuZ3RoKSAqIHNpemVvZihfX2JlMzIpOwogCiAJCS8qIGNvbmZpcm0gZW5vdWdoIHNwYWNlIGZvciB0aGlzIHJlc3BvbnNlICovCkBAIC00OSwyNiArNTksMzkgQEAKIAkJLyogY29weSBmcm9tIHJpbmcgYnVmZmVyIHRvIHVzZXIgYnVmZmVyICovCiAJCXdoaWxlIChsZW5ndGggPiAwKSB7CiAJCQl0aWxsX2VuZCA9IHNuZF9lZndfcmVzcF9idWZfc2l6ZSAtCi0JCQkJKHVuc2lnbmVkIGludCkoZWZ3LT5wdWxsX3B0ciAtIGVmdy0+cmVzcF9idWYpOworCQkJCSh1bnNpZ25lZCBpbnQpKHB1bGxfcHRyIC0gZWZ3LT5yZXNwX2J1Zik7CiAJCQl0aWxsX2VuZCA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuZ3RoLCB0aWxsX2VuZCk7CiAKLQkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBlZnctPnB1bGxfcHRyLCB0aWxsX2VuZCkpCisJCQlzcGluX3VubG9ja19pcnEoJmVmdy0+bG9jayk7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBwdWxsX3B0ciwgdGlsbF9lbmQpKQogCQkJCXJldHVybiAtRUZBVUxUOwogCi0JCQllZnctPnB1bGxfcHRyICs9IHRpbGxfZW5kOwotCQkJaWYgKGVmdy0+cHVsbF9wdHIgPj0gZWZ3LT5yZXNwX2J1ZiArCi0JCQkJCSAgICAgc25kX2Vmd19yZXNwX2J1Zl9zaXplKQotCQkJCWVmdy0+cHVsbF9wdHIgLT0gc25kX2Vmd19yZXNwX2J1Zl9zaXplOworCQkJc3Bpbl9sb2NrX2lycSgmZWZ3LT5sb2NrKTsKKworCQkJcHVsbF9wdHIgKz0gdGlsbF9lbmQ7CisJCQlpZiAocHVsbF9wdHIgPj0gZWZ3LT5yZXNwX2J1ZiArIHNuZF9lZndfcmVzcF9idWZfc2l6ZSkKKwkJCQlwdWxsX3B0ciAtPSBzbmRfZWZ3X3Jlc3BfYnVmX3NpemU7CiAKIAkJCWxlbmd0aCAtPSB0aWxsX2VuZDsKIAkJCWJ1ZiArPSB0aWxsX2VuZDsKIAkJCWNvdW50ICs9IHRpbGxfZW5kOwogCQkJcmVtYWluZWQgLT0gdGlsbF9lbmQ7CiAJCX0KLQotCQllZnctPnJlc3BfcXVldWVzLS07CiAJfQogCisJLyoKKwkgKiBBbGwgb2YgdGFza3MgY2FuIHJlYWQgZnJvbSB0aGUgYnVmZmVyIG5lYXJseSBzaW11bHRhbmVvdXNseSwgYnV0IHRoZQorCSAqIGxhc3QgcG9zaXRpb24gZm9yIGVhY2ggdGFzayBpcyBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHRoZSBsZW5ndGggb2YKKwkgKiBnaXZlbiBidWZmZXIuIEhlcmUsIGZvciBzaW1wbGljaXR5LCBhIHBvc2l0aW9uIG9mIGJ1ZmZlciBpcyBzZXQgYnkKKwkgKiB0aGUgbGF0ZXN0IHRhc2suIEl0J3MgYmV0dGVyIGZvciBhIGxpc3RlbmluZyBhcHBsaWNhdGlvbiB0byBhbGxvdyBvbmUKKwkgKiB0aHJlYWQgdG8gcmVhZCBmcm9tIHRoZSBidWZmZXIuIFVubGVzcywgZWFjaCB0YXNrIGNhbiByZWFkIGRpZmZlcmVudAorCSAqIHNlcXVlbmNlIG9mIHJlc3BvbnNlcyBkZXBlbmRpbmcgb24gdmFyaWF0aW9uIG9mIGJ1ZmZlciBsZW5ndGguCisJICovCisJZWZ3LT5wdWxsX3B0ciA9IHB1bGxfcHRyOworCisJc3Bpbl91bmxvY2tfaXJxKCZlZnctPmxvY2spOworCiAJcmV0dXJuIGNvdW50OwogfQogCkBAIC03NiwxNCArOTksMTcgQEAKIGh3ZGVwX3JlYWRfbG9ja2VkKHN0cnVjdCBzbmRfZWZ3ICplZncsIGNoYXIgX191c2VyICpidWYsIGxvbmcgY291bnQsCiAJCSAgbG9mZl90ICpvZmZzZXQpCiB7Ci0JdW5pb24gc25kX2ZpcmV3aXJlX2V2ZW50IGV2ZW50OworCXVuaW9uIHNuZF9maXJld2lyZV9ldmVudCBldmVudCA9IHsKKwkJLmxvY2tfc3RhdHVzLnR5cGUgPSBTTkRSVl9GSVJFV0lSRV9FVkVOVF9MT0NLX1NUQVRVUywKKwl9OwogCi0JbWVtc2V0KCZldmVudCwgMCwgc2l6ZW9mKGV2ZW50KSk7CisJc3Bpbl9sb2NrX2lycSgmZWZ3LT5sb2NrKTsKIAotCWV2ZW50LmxvY2tfc3RhdHVzLnR5cGUgPSBTTkRSVl9GSVJFV0lSRV9FVkVOVF9MT0NLX1NUQVRVUzsKIAlldmVudC5sb2NrX3N0YXR1cy5zdGF0dXMgPSAoZWZ3LT5kZXZfbG9ja19jb3VudCA+IDApOwogCWVmdy0+ZGV2X2xvY2tfY2hhbmdlZCA9IGZhbHNlOwogCisJc3Bpbl91bmxvY2tfaXJxKCZlZnctPmxvY2spOworCiAJY291bnQgPSBtaW5fdChsb25nLCBjb3VudCwgc2l6ZW9mKGV2ZW50LmxvY2tfc3RhdHVzKSk7CiAKIAlpZiAoY29weV90b191c2VyKGJ1ZiwgJmV2ZW50LCBjb3VudCkpCkBAIC05OCwxMCArMTI0LDE1IEBACiB7CiAJc3RydWN0IHNuZF9lZncgKmVmdyA9IGh3ZGVwLT5wcml2YXRlX2RhdGE7CiAJREVGSU5FX1dBSVQod2FpdCk7CisJYm9vbCBkZXZfbG9ja19jaGFuZ2VkOworCWJvb2wgcXVldWVkOwogCiAJc3Bpbl9sb2NrX2lycSgmZWZ3LT5sb2NrKTsKIAotCXdoaWxlICgoIWVmdy0+ZGV2X2xvY2tfY2hhbmdlZCkgJiYgKGVmdy0+cmVzcF9xdWV1ZXMgPT0gMCkpIHsKKwlkZXZfbG9ja19jaGFuZ2VkID0gZWZ3LT5kZXZfbG9ja19jaGFuZ2VkOworCXF1ZXVlZCA9IGVmdy0+cHVzaF9wdHIgIT0gZWZ3LT5wdWxsX3B0cjsKKworCXdoaWxlICghZGV2X2xvY2tfY2hhbmdlZCAmJiAhcXVldWVkKSB7CiAJCXByZXBhcmVfdG9fd2FpdCgmZWZ3LT5od2RlcF93YWl0LCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJc3Bpbl91bmxvY2tfaXJxKCZlZnctPmxvY2spOwogCQlzY2hlZHVsZSgpOwpAQCAtMTA5LDE1ICsxNDAsMTcgQEAKIAkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAkJc3Bpbl9sb2NrX2lycSgmZWZ3LT5sb2NrKTsKKwkJZGV2X2xvY2tfY2hhbmdlZCA9IGVmdy0+ZGV2X2xvY2tfY2hhbmdlZDsKKwkJcXVldWVkID0gZWZ3LT5wdXNoX3B0ciAhPSBlZnctPnB1bGxfcHRyOwogCX0KIAotCWlmIChlZnctPmRldl9sb2NrX2NoYW5nZWQpCi0JCWNvdW50ID0gaHdkZXBfcmVhZF9sb2NrZWQoZWZ3LCBidWYsIGNvdW50LCBvZmZzZXQpOwotCWVsc2UgaWYgKGVmdy0+cmVzcF9xdWV1ZXMgPiAwKQotCQljb3VudCA9IGh3ZGVwX3JlYWRfcmVzcF9idWYoZWZ3LCBidWYsIGNvdW50LCBvZmZzZXQpOwotCiAJc3Bpbl91bmxvY2tfaXJxKCZlZnctPmxvY2spOwogCisJaWYgKGRldl9sb2NrX2NoYW5nZWQpCisJCWNvdW50ID0gaHdkZXBfcmVhZF9sb2NrZWQoZWZ3LCBidWYsIGNvdW50LCBvZmZzZXQpOworCWVsc2UgaWYgKHF1ZXVlZCkKKwkJY291bnQgPSBod2RlcF9yZWFkX3Jlc3BfYnVmKGVmdywgYnVmLCBjb3VudCwgb2Zmc2V0KTsKKwogCXJldHVybiBjb3VudDsKIH0KIApAQCAtMTYwLDcgKzE5Myw3IEBACiAJcG9sbF93YWl0KGZpbGUsICZlZnctPmh3ZGVwX3dhaXQsIHdhaXQpOwogCiAJc3Bpbl9sb2NrX2lycSgmZWZ3LT5sb2NrKTsKLQlpZiAoZWZ3LT5kZXZfbG9ja19jaGFuZ2VkIHx8IChlZnctPnJlc3BfcXVldWVzID4gMCkpCisJaWYgKGVmdy0+ZGV2X2xvY2tfY2hhbmdlZCB8fCBlZnctPnB1bGxfcHRyICE9IGVmdy0+cHVzaF9wdHIpCiAJCWV2ZW50cyA9IFBPTExJTiB8IFBPTExSRE5PUk07CiAJZWxzZQogCQlldmVudHMgPSAwOwpkaWZmIC0tZ2l0IGEvc291bmQvZmlyZXdpcmUvZmlyZXdvcmtzL2ZpcmV3b3Jrc19wcm9jLmMgYi9zb3VuZC9maXJld2lyZS9maXJld29ya3MvZmlyZXdvcmtzX3Byb2MuYwppbmRleCAwNjM5ZGNiLi5iZWIwYTBmIDEwMDY0NAotLS0gYS9zb3VuZC9maXJld2lyZS9maXJld29ya3MvZmlyZXdvcmtzX3Byb2MuYworKysgYi9zb3VuZC9maXJld2lyZS9maXJld29ya3MvZmlyZXdvcmtzX3Byb2MuYwpAQCAtMTg4LDggKzE4OCw4IEBACiAJZWxzZQogCQljb25zdW1lZCA9ICh1bnNpZ25lZCBpbnQpKGVmdy0+cHVzaF9wdHIgLSBlZnctPnB1bGxfcHRyKTsKIAotCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiVkICVkLyVkXG4iLAotCQkgICAgZWZ3LT5yZXNwX3F1ZXVlcywgY29uc3VtZWQsIHNuZF9lZndfcmVzcF9idWZfc2l6ZSk7CisJc25kX2lwcmludGYoYnVmZmVyLCAiJWQvJWRcbiIsCisJCSAgICBjb25zdW1lZCwgc25kX2Vmd19yZXNwX2J1Zl9zaXplKTsKIH0KIAogc3RhdGljIHZvaWQKZGlmZiAtLWdpdCBhL3NvdW5kL2ZpcmV3aXJlL2ZpcmV3b3Jrcy9maXJld29ya3NfdHJhbnNhY3Rpb24uYyBiL3NvdW5kL2ZpcmV3aXJlL2ZpcmV3b3Jrcy9maXJld29ya3NfdHJhbnNhY3Rpb24uYwppbmRleCBmNTUwODA4Li4zNmEwOGJhIDEwMDY0NAotLS0gYS9zb3VuZC9maXJld2lyZS9maXJld29ya3MvZmlyZXdvcmtzX3RyYW5zYWN0aW9uLmMKKysrIGIvc291bmQvZmlyZXdpcmUvZmlyZXdvcmtzL2ZpcmV3b3Jrc190cmFuc2FjdGlvbi5jCkBAIC0xMjEsMTEgKzEyMSwxMSBAQAogCXNpemVfdCBjYXBhY2l0eSwgdGlsbF9lbmQ7CiAJc3RydWN0IHNuZF9lZndfdHJhbnNhY3Rpb24gKnQ7CiAKLQlzcGluX2xvY2tfaXJxKCZlZnctPmxvY2spOwotCiAJdCA9IChzdHJ1Y3Qgc25kX2Vmd190cmFuc2FjdGlvbiAqKWRhdGE7CiAJbGVuZ3RoID0gbWluX3Qoc2l6ZV90LCBiZTMyX3RvX2NwdSh0LT5sZW5ndGgpICogc2l6ZW9mKHUzMiksIGxlbmd0aCk7CiAKKwlzcGluX2xvY2tfaXJxKCZlZnctPmxvY2spOworCiAJaWYgKGVmdy0+cHVzaF9wdHIgPCBlZnctPnB1bGxfcHRyKQogCQljYXBhY2l0eSA9ICh1bnNpZ25lZCBpbnQpKGVmdy0+cHVsbF9wdHIgLSBlZnctPnB1c2hfcHRyKTsKIAllbHNlCkBAIC0xNTUsNyArMTU1LDYgQEAKIAl9CiAKIAkvKiBmb3IgaHdkZXAgKi8KLQllZnctPnJlc3BfcXVldWVzKys7CiAJd2FrZV91cCgmZWZ3LT5od2RlcF93YWl0KTsKIAogCSpyY29kZSA9IFJDT0RFX0NPTVBMRVRFOwpkaWZmIC0tZ2l0IGEvc291bmQvZmlyZXdpcmUvb3hmdy9veGZ3LXBjbS5jIGIvc291bmQvZmlyZXdpcmUvb3hmdy9veGZ3LXBjbS5jCmluZGV4IDhkMjMzNDEuLmYzNTMwZjggMTAwNjQ0Ci0tLSBhL3NvdW5kL2ZpcmV3aXJlL294Zncvb3hmdy1wY20uYworKysgYi9zb3VuZC9maXJld2lyZS9veGZ3L294ZnctcGNtLmMKQEAgLTM4OCw3ICszODgsNyBAQAogCiBpbnQgc25kX294ZndfY3JlYXRlX3BjbShzdHJ1Y3Qgc25kX294ZncgKm94ZncpCiB7Ci0Jc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBjYXB0dXJlX29wcyA9IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIGNhcHR1cmVfb3BzID0gewogCQkub3BlbiAgICAgID0gcGNtX29wZW4sCiAJCS5jbG9zZSAgICAgPSBwY21fY2xvc2UsCiAJCS5pb2N0bCAgICAgPSBzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTQwMCw3ICs0MDAsNyBAQAogCQkucGFnZSAgICAgID0gc25kX3BjbV9saWJfZ2V0X3ZtYWxsb2NfcGFnZSwKIAkJLm1tYXAgICAgICA9IHNuZF9wY21fbGliX21tYXBfdm1hbGxvYywKIAl9OwotCXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgcGxheWJhY2tfb3BzID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgcGxheWJhY2tfb3BzID0gewogCQkub3BlbiAgICAgID0gcGNtX29wZW4sCiAJCS5jbG9zZSAgICAgPSBwY21fY2xvc2UsCiAJCS5pb2N0bCAgICAgPSBzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL2ZpcmV3aXJlL3Rhc2NhbS90YXNjYW0taHdkZXAuYyBiL3NvdW5kL2ZpcmV3aXJlL3Rhc2NhbS90YXNjYW0taHdkZXAuYwppbmRleCAxMzEyNjdjLi4xMDY0MDZjIDEwMDY0NAotLS0gYS9zb3VuZC9maXJld2lyZS90YXNjYW0vdGFzY2FtLWh3ZGVwLmMKKysrIGIvc291bmQvZmlyZXdpcmUvdGFzY2FtL3Rhc2NhbS1od2RlcC5jCkBAIC0xNiwzMSArMTYsMTQgQEAKIAogI2luY2x1ZGUgInRhc2NhbS5oIgogCi1zdGF0aWMgbG9uZyBod2RlcF9yZWFkX2xvY2tlZChzdHJ1Y3Qgc25kX3RzY20gKnRzY20sIGNoYXIgX191c2VyICpidWYsCi0JCQkgICAgICBsb25nIGNvdW50KQotewotCXVuaW9uIHNuZF9maXJld2lyZV9ldmVudCBldmVudDsKLQotCW1lbXNldCgmZXZlbnQsIDAsIHNpemVvZihldmVudCkpOwotCi0JZXZlbnQubG9ja19zdGF0dXMudHlwZSA9IFNORFJWX0ZJUkVXSVJFX0VWRU5UX0xPQ0tfU1RBVFVTOwotCWV2ZW50LmxvY2tfc3RhdHVzLnN0YXR1cyA9ICh0c2NtLT5kZXZfbG9ja19jb3VudCA+IDApOwotCXRzY20tPmRldl9sb2NrX2NoYW5nZWQgPSBmYWxzZTsKLQotCWNvdW50ID0gbWluX3QobG9uZywgY291bnQsIHNpemVvZihldmVudC5sb2NrX3N0YXR1cykpOwotCi0JaWYgKGNvcHlfdG9fdXNlcihidWYsICZldmVudCwgY291bnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiBjb3VudDsKLX0KLQogc3RhdGljIGxvbmcgaHdkZXBfcmVhZChzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcCwgY2hhciBfX3VzZXIgKmJ1ZiwgbG9uZyBjb3VudCwKIAkJICAgICAgIGxvZmZfdCAqb2Zmc2V0KQogewogCXN0cnVjdCBzbmRfdHNjbSAqdHNjbSA9IGh3ZGVwLT5wcml2YXRlX2RhdGE7CiAJREVGSU5FX1dBSVQod2FpdCk7Ci0JdW5pb24gc25kX2ZpcmV3aXJlX2V2ZW50IGV2ZW50OworCXVuaW9uIHNuZF9maXJld2lyZV9ldmVudCBldmVudCA9IHsKKwkJLmxvY2tfc3RhdHVzLnR5cGUgPSBTTkRSVl9GSVJFV0lSRV9FVkVOVF9MT0NLX1NUQVRVUywKKwl9OwogCiAJc3Bpbl9sb2NrX2lycSgmdHNjbS0+bG9jayk7CiAKQEAgLTU0LDEwICszNywxNiBAQAogCQlzcGluX2xvY2tfaXJxKCZ0c2NtLT5sb2NrKTsKIAl9CiAKLQltZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YoZXZlbnQpKTsKLQljb3VudCA9IGh3ZGVwX3JlYWRfbG9ja2VkKHRzY20sIGJ1ZiwgY291bnQpOworCWV2ZW50LmxvY2tfc3RhdHVzLnN0YXR1cyA9ICh0c2NtLT5kZXZfbG9ja19jb3VudCA+IDApOworCXRzY20tPmRldl9sb2NrX2NoYW5nZWQgPSBmYWxzZTsKKwogCXNwaW5fdW5sb2NrX2lycSgmdHNjbS0+bG9jayk7CiAKKwljb3VudCA9IG1pbl90KGxvbmcsIGNvdW50LCBzaXplb2YoZXZlbnQubG9ja19zdGF0dXMpKTsKKworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmZXZlbnQsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKIAlyZXR1cm4gY291bnQ7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2ZpcmV3aXJlL3Rhc2NhbS90YXNjYW0tcGNtLmMgYi9zb3VuZC9maXJld2lyZS90YXNjYW0vdGFzY2FtLXBjbS5jCmluZGV4IDM4MGQzZGIuLjc5ZGIxYjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2ZpcmV3aXJlL3Rhc2NhbS90YXNjYW0tcGNtLmMKKysrIGIvc291bmQvZmlyZXdpcmUvdGFzY2FtL3Rhc2NhbS1wY20uYwpAQCAtMjY4LDcgKzI2OCw3IEBACiAJcmV0dXJuIGFtZHRwX3N0cmVhbV9wY21fcG9pbnRlcigmdHNjbS0+cnhfc3RyZWFtKTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBwY21fY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHBjbV9jYXB0dXJlX29wcyA9IHsKIAkub3BlbgkJPSBwY21fb3BlbiwKIAkuY2xvc2UJCT0gcGNtX2Nsb3NlLAogCS5pb2N0bAkJPSBzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTI4MCw3ICsyODAsNyBAQAogCS5wYWdlCQk9IHNuZF9wY21fbGliX2dldF92bWFsbG9jX3BhZ2UsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHBjbV9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHBjbV9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4JCT0gcGNtX29wZW4sCiAJLmNsb3NlCQk9IHBjbV9jbG9zZSwKIAkuaW9jdGwJCT0gc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9oZGEvZXh0L2hkYWNfZXh0X2NvbnRyb2xsZXIuYyBiL3NvdW5kL2hkYS9leHQvaGRhY19leHRfY29udHJvbGxlci5jCmluZGV4IDg2MGY4Y2EuLjI2MTQ2OTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2hkYS9leHQvaGRhY19leHRfY29udHJvbGxlci5jCisrKyBiL3NvdW5kL2hkYS9leHQvaGRhY19leHRfY29udHJvbGxlci5jCkBAIC0yOSw4MSArMjksNiBAQAogICovCiAjZGVmaW5lIEhEQUNfTUFYX0NBUFMgMTAKIAotLyoqCi0gKiBzbmRfaGRhY19leHRfYnVzX3BhcnNlX2NhcGFiaWxpdGllcyAtIHBhcnNlIGNhcGFibGl0eSBzdHJ1Y3R1cmUKLSAqIEBlYnVzOiB0aGUgcG9pbnRlciB0byBleHRlbmRlZCBidXMgb2JqZWN0Ci0gKgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KLSAqLwotaW50IHNuZF9oZGFjX2V4dF9idXNfcGFyc2VfY2FwYWJpbGl0aWVzKHN0cnVjdCBoZGFjX2V4dF9idXMgKmVidXMpCi17Ci0JdW5zaWduZWQgaW50IGN1cl9jYXA7Ci0JdW5zaWduZWQgaW50IG9mZnNldDsKLQlzdHJ1Y3QgaGRhY19idXMgKmJ1cyA9ICZlYnVzLT5idXM7Ci0JdW5zaWduZWQgaW50IGNvdW50ZXIgPSAwOwotCi0Jb2Zmc2V0ID0gc25kX2hkYWNfY2hpcF9yZWFkbChidXMsIExMQ0gpOwotCi0JLyogTGV0cyB3YWxrIHRoZSBsaW5rZWQgY2FwYWJpbGl0aWVzIGxpc3QgKi8KLQlkbyB7Ci0JCWN1cl9jYXAgPSBfc25kX2hkYWNfY2hpcF9yZWFkKGwsIGJ1cywgb2Zmc2V0KTsKLQotCQlkZXZfZGJnKGJ1cy0+ZGV2LCAiQ2FwYWJpbGl0eSB2ZXJzaW9uOiAweCV4XG4iLAotCQkJCSgoY3VyX2NhcCAmIEFaWF9DQVBfSERSX1ZFUl9NQVNLKSA+PiBBWlhfQ0FQX0hEUl9WRVJfT0ZGKSk7Ci0KLQkJZGV2X2RiZyhidXMtPmRldiwgIkhEQSBjYXBhYmlsaXR5IElEOiAweCV4XG4iLAotCQkJCShjdXJfY2FwICYgQVpYX0NBUF9IRFJfSURfTUFTSykgPj4gQVpYX0NBUF9IRFJfSURfT0ZGKTsKLQotCQlzd2l0Y2ggKChjdXJfY2FwICYgQVpYX0NBUF9IRFJfSURfTUFTSykgPj4gQVpYX0NBUF9IRFJfSURfT0ZGKSB7Ci0JCWNhc2UgQVpYX01MX0NBUF9JRDoKLQkJCWRldl9kYmcoYnVzLT5kZXYsICJGb3VuZCBNTCBjYXBhYmlsaXR5XG4iKTsKLQkJCWVidXMtPm1sY2FwID0gYnVzLT5yZW1hcF9hZGRyICsgb2Zmc2V0OwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBWlhfR1RTX0NBUF9JRDoKLQkJCWRldl9kYmcoYnVzLT5kZXYsICJGb3VuZCBHVFMgY2FwYWJpbGl0eSBvZmZzZXQ9JXhcbiIsIG9mZnNldCk7Ci0JCQllYnVzLT5ndHNjYXAgPSBidXMtPnJlbWFwX2FkZHIgKyBvZmZzZXQ7Ci0JCQlicmVhazsKLQotCQljYXNlIEFaWF9QUF9DQVBfSUQ6Ci0JCQkvKiBQUCBjYXBhYmlsaXR5IGZvdW5kLCB0aGUgQXVkaW8gRFNQIGlzIHByZXNlbnQgKi8KLQkJCWRldl9kYmcoYnVzLT5kZXYsICJGb3VuZCBQUCBjYXBhYmlsaXR5IG9mZnNldD0leFxuIiwgb2Zmc2V0KTsKLQkJCWVidXMtPnBwY2FwID0gYnVzLT5yZW1hcF9hZGRyICsgb2Zmc2V0OwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBWlhfU1BCX0NBUF9JRDoKLQkJCS8qIFNQSUIgY2FwYWJpbGl0eSBmb3VuZCwgaGFuZGxlciBmdW5jdGlvbiAqLwotCQkJZGV2X2RiZyhidXMtPmRldiwgIkZvdW5kIFNQQiBjYXBhYmlsaXR5XG4iKTsKLQkJCWVidXMtPnNwYmNhcCA9IGJ1cy0+cmVtYXBfYWRkciArIG9mZnNldDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQVpYX0RSU01fQ0FQX0lEOgotCQkJLyogRE1BIHJlc3VtZSAgY2FwYWJpbGl0eSBmb3VuZCwgaGFuZGxlciBmdW5jdGlvbiAqLwotCQkJZGV2X2RiZyhidXMtPmRldiwgIkZvdW5kIERSU00gY2FwYWJpbGl0eVxuIik7Ci0JCQllYnVzLT5kcnNtY2FwID0gYnVzLT5yZW1hcF9hZGRyICsgb2Zmc2V0OwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWRldl9kYmcoYnVzLT5kZXYsICJVbmtub3duIGNhcGFiaWxpdHkgJWRcbiIsIGN1cl9jYXApOwotCQkJYnJlYWs7Ci0JCX0KLQotCQljb3VudGVyKys7Ci0KLQkJaWYgKGNvdW50ZXIgPiBIREFDX01BWF9DQVBTKSB7Ci0JCQlkZXZfZXJyKGJ1cy0+ZGV2LCAiV2UgZXhjZWVkZWQgSERBQyBFeHQgY2FwYWJsaXRpZXMhISFcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiByZWFkIHRoZSBvZmZzZXQgb2YgbmV4dCBjYXBhYmlpdHkgKi8KLQkJb2Zmc2V0ID0gY3VyX2NhcCAmIEFaWF9DQVBfSERSX05YVF9QVFJfTUFTSzsKLQotCX0gd2hpbGUgKG9mZnNldCk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFjX2V4dF9idXNfcGFyc2VfY2FwYWJpbGl0aWVzKTsKLQogLyoKICAqIHByb2Nlc3NpbmcgcGlwZSBoZWxwZXJzIC0gdGhlc2UgaGVscGVycyBhcmUgdXNlZnVsIGZvciBkZWFsaW5nIHdpdGggSERBCiAgKiBuZXcgY2FwYWJpbGl0eSBvZiBwcm9jZXNzaW5nIHBpcGVsaW5lcwpAQCAtMTE4LDE1ICs0MywxNSBAQAogewogCXN0cnVjdCBoZGFjX2J1cyAqYnVzID0gJmVidXMtPmJ1czsKIAotCWlmICghZWJ1cy0+cHBjYXApIHsKKwlpZiAoIWJ1cy0+cHBjYXApIHsKIAkJZGV2X2VycihidXMtPmRldiwgIkFkZHJlc3Mgb2YgUFAgY2FwYWJpbGl0eSBpcyBOVUxMIik7CiAJCXJldHVybjsKIAl9CiAKIAlpZiAoZW5hYmxlKQotCQlzbmRfaGRhY191cGRhdGVsKGVidXMtPnBwY2FwLCBBWlhfUkVHX1BQX1BQQ1RMLCAwLCBBWlhfUFBDVExfR1BST0NFTik7CisJCXNuZF9oZGFjX3VwZGF0ZWwoYnVzLT5wcGNhcCwgQVpYX1JFR19QUF9QUENUTCwgMCwgQVpYX1BQQ1RMX0dQUk9DRU4pOwogCWVsc2UKLQkJc25kX2hkYWNfdXBkYXRlbChlYnVzLT5wcGNhcCwgQVpYX1JFR19QUF9QUENUTCwgQVpYX1BQQ1RMX0dQUk9DRU4sIDApOworCQlzbmRfaGRhY191cGRhdGVsKGJ1cy0+cHBjYXAsIEFaWF9SRUdfUFBfUFBDVEwsIEFaWF9QUENUTF9HUFJPQ0VOLCAwKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFjX2V4dF9idXNfcHBjYXBfZW5hYmxlKTsKIApAQCAtMTM5LDE1ICs2NCwxNSBAQAogewogCXN0cnVjdCBoZGFjX2J1cyAqYnVzID0gJmVidXMtPmJ1czsKIAotCWlmICghZWJ1cy0+cHBjYXApIHsKKwlpZiAoIWJ1cy0+cHBjYXApIHsKIAkJZGV2X2VycihidXMtPmRldiwgIkFkZHJlc3Mgb2YgUFAgY2FwYWJpbGl0eSBpcyBOVUxMXG4iKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmIChlbmFibGUpCi0JCXNuZF9oZGFjX3VwZGF0ZWwoZWJ1cy0+cHBjYXAsIEFaWF9SRUdfUFBfUFBDVEwsIDAsIEFaWF9QUENUTF9QSUUpOworCQlzbmRfaGRhY191cGRhdGVsKGJ1cy0+cHBjYXAsIEFaWF9SRUdfUFBfUFBDVEwsIDAsIEFaWF9QUENUTF9QSUUpOwogCWVsc2UKLQkJc25kX2hkYWNfdXBkYXRlbChlYnVzLT5wcGNhcCwgQVpYX1JFR19QUF9QUENUTCwgQVpYX1BQQ1RMX1BJRSwgMCk7CisJCXNuZF9oZGFjX3VwZGF0ZWwoYnVzLT5wcGNhcCwgQVpYX1JFR19QUF9QUENUTCwgQVpYX1BQQ1RMX1BJRSwgMCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhY19leHRfYnVzX3BwY2FwX2ludF9lbmFibGUpOwogCkBAIC0xNzEsNyArOTYsNyBAQAogCXN0cnVjdCBoZGFjX2V4dF9saW5rICpobGluazsKIAlzdHJ1Y3QgaGRhY19idXMgKmJ1cyA9ICZlYnVzLT5idXM7CiAKLQlsaW5rX2NvdW50ID0gcmVhZGwoZWJ1cy0+bWxjYXAgKyBBWlhfUkVHX01MX01MQ0QpICsgMTsKKwlsaW5rX2NvdW50ID0gcmVhZGwoYnVzLT5tbGNhcCArIEFaWF9SRUdfTUxfTUxDRCkgKyAxOwogCiAJZGV2X2RiZyhidXMtPmRldiwgIkluICVzIExpbmsgY291bnQ6ICVkXG4iLCBfX2Z1bmNfXywgbGlua19jb3VudCk7CiAKQEAgLTE4MSw3ICsxMDYsNyBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAJCWhsaW5rLT5pbmRleCA9IGlkeDsKIAkJaGxpbmstPmJ1cyA9IGJ1czsKLQkJaGxpbmstPm1sX2FkZHIgPSBlYnVzLT5tbGNhcCArIEFaWF9NTF9CQVNFICsKKwkJaGxpbmstPm1sX2FkZHIgPSBidXMtPm1sY2FwICsgQVpYX01MX0JBU0UgKwogCQkJCQkoQVpYX01MX0lOVEVSVkFMICogaWR4KTsKIAkJaGxpbmstPmxjYXBzICA9IHJlYWRsKGhsaW5rLT5tbF9hZGRyICsgQVpYX1JFR19NTF9MQ0FQKTsKIAkJaGxpbmstPmxzZGlpZCA9IHJlYWR3KGhsaW5rLT5tbF9hZGRyICsgQVpYX1JFR19NTF9MU0RJSUQpOwpkaWZmIC0tZ2l0IGEvc291bmQvaGRhL2V4dC9oZGFjX2V4dF9zdHJlYW0uYyBiL3NvdW5kL2hkYS9leHQvaGRhY19leHRfc3RyZWFtLmMKaW5kZXggNjI2ZjNiYi4uM2JlMDUxYWI1IDEwMDY0NAotLS0gYS9zb3VuZC9oZGEvZXh0L2hkYWNfZXh0X3N0cmVhbS5jCisrKyBiL3NvdW5kL2hkYS9leHQvaGRhY19leHRfc3RyZWFtLmMKQEAgLTQwLDI3ICs0MCwyNyBAQAogewogCXN0cnVjdCBoZGFjX2J1cyAqYnVzID0gJmVidXMtPmJ1czsKIAotCWlmIChlYnVzLT5wcGNhcCkgewotCQlzdHJlYW0tPnBwaGNfYWRkciA9IGVidXMtPnBwY2FwICsgQVpYX1BQSENfQkFTRSArCisJaWYgKGJ1cy0+cHBjYXApIHsKKwkJc3RyZWFtLT5wcGhjX2FkZHIgPSBidXMtPnBwY2FwICsgQVpYX1BQSENfQkFTRSArCiAJCQkJQVpYX1BQSENfSU5URVJWQUwgKiBpZHg7CiAKLQkJc3RyZWFtLT5wcGxjX2FkZHIgPSBlYnVzLT5wcGNhcCArIEFaWF9QUExDX0JBU0UgKworCQlzdHJlYW0tPnBwbGNfYWRkciA9IGJ1cy0+cHBjYXAgKyBBWlhfUFBMQ19CQVNFICsKIAkJCQlBWlhfUFBMQ19NVUxUSSAqIGVidXMtPm51bV9zdHJlYW1zICsKIAkJCQlBWlhfUFBMQ19JTlRFUlZBTCAqIGlkeDsKIAl9CiAKLQlpZiAoZWJ1cy0+c3BiY2FwKSB7Ci0JCXN0cmVhbS0+c3BpYl9hZGRyID0gZWJ1cy0+c3BiY2FwICsgQVpYX1NQQl9CQVNFICsKKwlpZiAoYnVzLT5zcGJjYXApIHsKKwkJc3RyZWFtLT5zcGliX2FkZHIgPSBidXMtPnNwYmNhcCArIEFaWF9TUEJfQkFTRSArCiAJCQkJCUFaWF9TUEJfSU5URVJWQUwgKiBpZHggKwogCQkJCQlBWlhfU1BCX1NQSUI7CiAKLQkJc3RyZWFtLT5maWZvX2FkZHIgPSBlYnVzLT5zcGJjYXAgKyBBWlhfU1BCX0JBU0UgKworCQlzdHJlYW0tPmZpZm9fYWRkciA9IGJ1cy0+c3BiY2FwICsgQVpYX1NQQl9CQVNFICsKIAkJCQkJQVpYX1NQQl9JTlRFUlZBTCAqIGlkeCArCiAJCQkJCUFaWF9TUEJfTUFYRklGTzsKIAl9CiAKLQlpZiAoZWJ1cy0+ZHJzbWNhcCkKLQkJc3RyZWFtLT5kcGlicl9hZGRyID0gZWJ1cy0+ZHJzbWNhcCArIEFaWF9EUlNNX0JBU0UgKworCWlmIChidXMtPmRyc21jYXApCisJCXN0cmVhbS0+ZHBpYnJfYWRkciA9IGJ1cy0+ZHJzbWNhcCArIEFaWF9EUlNNX0JBU0UgKwogCQkJCQlBWlhfRFJTTV9JTlRFUlZBTCAqIGlkeDsKIAogCXN0cmVhbS0+ZGVjb3VwbGVkID0gZmFsc2U7CkBAIC0xMzEsMTAgKzEzMSwxMCBAQAogCiAJc3Bpbl9sb2NrX2lycSgmYnVzLT5yZWdfbG9jayk7CiAJaWYgKGRlY291cGxlKQotCQlzbmRfaGRhY191cGRhdGVsKGVidXMtPnBwY2FwLCBBWlhfUkVHX1BQX1BQQ1RMLCAwLAorCQlzbmRfaGRhY191cGRhdGVsKGJ1cy0+cHBjYXAsIEFaWF9SRUdfUFBfUFBDVEwsIDAsCiAJCQkJQVpYX1BQQ1RMX1BST0NFTihoc3RyZWFtLT5pbmRleCkpOwogCWVsc2UKLQkJc25kX2hkYWNfdXBkYXRlbChlYnVzLT5wcGNhcCwgQVpYX1JFR19QUF9QUENUTCwKKwkJc25kX2hkYWNfdXBkYXRlbChidXMtPnBwY2FwLCBBWlhfUkVHX1BQX1BQQ1RMLAogCQkJCQlBWlhfUFBDVExfUFJPQ0VOKGhzdHJlYW0tPmluZGV4KSwgMCk7CiAJc3RyZWFtLT5kZWNvdXBsZWQgPSBkZWNvdXBsZTsKIAlzcGluX3VubG9ja19pcnEoJmJ1cy0+cmVnX2xvY2spOwpAQCAtMjU1LDcgKzI1NSw3IEBACiAJc3RydWN0IGhkYWNfc3RyZWFtICpzdHJlYW0gPSBOVUxMOwogCXN0cnVjdCBoZGFjX2J1cyAqaGJ1cyA9ICZlYnVzLT5idXM7CiAKLQlpZiAoIWVidXMtPnBwY2FwKSB7CisJaWYgKCFoYnVzLT5wcGNhcCkgewogCQlkZXZfZXJyKGhidXMtPmRldiwgInN0cmVhbSB0eXBlIG5vdCBzdXBwb3J0ZWRcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0yOTYsNyArMjk2LDcgQEAKIAlzdHJ1Y3QgaGRhY19zdHJlYW0gKnN0cmVhbSA9IE5VTEw7CiAJc3RydWN0IGhkYWNfYnVzICpoYnVzID0gJmVidXMtPmJ1czsKIAotCWlmICghZWJ1cy0+cHBjYXApIHsKKwlpZiAoIWhidXMtPnBwY2FwKSB7CiAJCWRldl9lcnIoaGJ1cy0+ZGV2LCAic3RyZWFtIHR5cGUgbm90IHN1cHBvcnRlZFxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTQyMywyMSArNDIzLDIxIEBACiAJdTMyIHJlZ2lzdGVyX21hc2sgPSAwOwogCXN0cnVjdCBoZGFjX2J1cyAqYnVzID0gJmVidXMtPmJ1czsKIAotCWlmICghZWJ1cy0+c3BiY2FwKSB7Ci0JCWRldl9lcnIoYnVzLT5kZXYsICJBZGRyZXNzIG9mIFNQQiBjYXBhYmlsaXR5IGlzIE5VTEwiKTsKKwlpZiAoIWJ1cy0+c3BiY2FwKSB7CisJCWRldl9lcnIoYnVzLT5kZXYsICJBZGRyZXNzIG9mIFNQQiBjYXBhYmlsaXR5IGlzIE5VTExcbiIpOwogCQlyZXR1cm47CiAJfQogCiAJbWFzayB8PSAoMSA8PCBpbmRleCk7CiAKLQlyZWdpc3Rlcl9tYXNrID0gcmVhZGwoZWJ1cy0+c3BiY2FwICsgQVpYX1JFR19TUEJfU1BCRkNDVEwpOworCXJlZ2lzdGVyX21hc2sgPSByZWFkbChidXMtPnNwYmNhcCArIEFaWF9SRUdfU1BCX1NQQkZDQ1RMKTsKIAogCW1hc2sgfD0gcmVnaXN0ZXJfbWFzazsKIAogCWlmIChlbmFibGUpCi0JCXNuZF9oZGFjX3VwZGF0ZWwoZWJ1cy0+c3BiY2FwLCBBWlhfUkVHX1NQQl9TUEJGQ0NUTCwgMCwgbWFzayk7CisJCXNuZF9oZGFjX3VwZGF0ZWwoYnVzLT5zcGJjYXAsIEFaWF9SRUdfU1BCX1NQQkZDQ1RMLCAwLCBtYXNrKTsKIAllbHNlCi0JCXNuZF9oZGFjX3VwZGF0ZWwoZWJ1cy0+c3BiY2FwLCBBWlhfUkVHX1NQQl9TUEJGQ0NUTCwgbWFzaywgMCk7CisJCXNuZF9oZGFjX3VwZGF0ZWwoYnVzLT5zcGJjYXAsIEFaWF9SRUdfU1BCX1NQQkZDQ1RMLCBtYXNrLCAwKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFjX2V4dF9zdHJlYW1fc3BiY2FwX2VuYWJsZSk7CiAKQEAgLTQ1Miw4ICs0NTIsOCBAQAogewogCXN0cnVjdCBoZGFjX2J1cyAqYnVzID0gJmVidXMtPmJ1czsKIAotCWlmICghZWJ1cy0+c3BiY2FwKSB7Ci0JCWRldl9lcnIoYnVzLT5kZXYsICJBZGRyZXNzIG9mIFNQQiBjYXBhYmlsaXR5IGlzIE5VTEwiKTsKKwlpZiAoIWJ1cy0+c3BiY2FwKSB7CisJCWRldl9lcnIoYnVzLT5kZXYsICJBZGRyZXNzIG9mIFNQQiBjYXBhYmlsaXR5IGlzIE5VTExcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTQ3NSw4ICs0NzUsOCBAQAogewogCXN0cnVjdCBoZGFjX2J1cyAqYnVzID0gJmVidXMtPmJ1czsKIAotCWlmICghZWJ1cy0+c3BiY2FwKSB7Ci0JCWRldl9lcnIoYnVzLT5kZXYsICJBZGRyZXNzIG9mIFNQQiBjYXBhYmlsaXR5IGlzIE5VTEwiKTsKKwlpZiAoIWJ1cy0+c3BiY2FwKSB7CisJCWRldl9lcnIoYnVzLT5kZXYsICJBZGRyZXNzIG9mIFNQQiBjYXBhYmlsaXR5IGlzIE5VTExcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTUxNSwyMSArNTE1LDIxIEBACiAJdTMyIHJlZ2lzdGVyX21hc2sgPSAwOwogCXN0cnVjdCBoZGFjX2J1cyAqYnVzID0gJmVidXMtPmJ1czsKIAotCWlmICghZWJ1cy0+ZHJzbWNhcCkgewotCQlkZXZfZXJyKGJ1cy0+ZGV2LCAiQWRkcmVzcyBvZiBEUlNNIGNhcGFiaWxpdHkgaXMgTlVMTCIpOworCWlmICghYnVzLT5kcnNtY2FwKSB7CisJCWRldl9lcnIoYnVzLT5kZXYsICJBZGRyZXNzIG9mIERSU00gY2FwYWJpbGl0eSBpcyBOVUxMXG4iKTsKIAkJcmV0dXJuOwogCX0KIAogCW1hc2sgfD0gKDEgPDwgaW5kZXgpOwogCi0JcmVnaXN0ZXJfbWFzayA9IHJlYWRsKGVidXMtPmRyc21jYXAgKyBBWlhfUkVHX1NQQl9TUEJGQ0NUTCk7CisJcmVnaXN0ZXJfbWFzayA9IHJlYWRsKGJ1cy0+ZHJzbWNhcCArIEFaWF9SRUdfU1BCX1NQQkZDQ1RMKTsKIAogCW1hc2sgfD0gcmVnaXN0ZXJfbWFzazsKIAogCWlmIChlbmFibGUpCi0JCXNuZF9oZGFjX3VwZGF0ZWwoZWJ1cy0+ZHJzbWNhcCwgQVpYX1JFR19EUlNNX0NUTCwgMCwgbWFzayk7CisJCXNuZF9oZGFjX3VwZGF0ZWwoYnVzLT5kcnNtY2FwLCBBWlhfUkVHX0RSU01fQ1RMLCAwLCBtYXNrKTsKIAllbHNlCi0JCXNuZF9oZGFjX3VwZGF0ZWwoZWJ1cy0+ZHJzbWNhcCwgQVpYX1JFR19EUlNNX0NUTCwgbWFzaywgMCk7CisJCXNuZF9oZGFjX3VwZGF0ZWwoYnVzLT5kcnNtY2FwLCBBWlhfUkVHX0RSU01fQ1RMLCBtYXNrLCAwKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFjX2V4dF9zdHJlYW1fZHJzbV9lbmFibGUpOwogCkBAIC01NDQsOCArNTQ0LDggQEAKIHsKIAlzdHJ1Y3QgaGRhY19idXMgKmJ1cyA9ICZlYnVzLT5idXM7CiAKLQlpZiAoIWVidXMtPmRyc21jYXApIHsKLQkJZGV2X2VycihidXMtPmRldiwgIkFkZHJlc3Mgb2YgRFJTTSBjYXBhYmlsaXR5IGlzIE5VTEwiKTsKKwlpZiAoIWJ1cy0+ZHJzbWNhcCkgeworCQlkZXZfZXJyKGJ1cy0+ZGV2LCAiQWRkcmVzcyBvZiBEUlNNIGNhcGFiaWxpdHkgaXMgTlVMTFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvaGRhL2hkYWNfY29udHJvbGxlci5jIGIvc291bmQvaGRhL2hkYWNfY29udHJvbGxlci5jCmluZGV4IDlmZWU0NjQuLjA0MzA2NTggMTAwNjQ0Ci0tLSBhL3NvdW5kL2hkYS9oZGFjX2NvbnRyb2xsZXIuYworKysgYi9zb3VuZC9oZGEvaGRhY19jb250cm9sbGVyLmMKQEAgLTI1NSw2ICsyNTUsODEgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFjX2J1c19nZXRfcmVzcG9uc2UpOwogCisjZGVmaW5lIEhEQUNfTUFYX0NBUFMgMTAKKy8qKgorICogc25kX2hkYWNfYnVzX3BhcnNlX2NhcGFiaWxpdGllcyAtIHBhcnNlIGNhcGFiaWxpdHkgc3RydWN0dXJlCisgKiBAYnVzOiB0aGUgcG9pbnRlciB0byBidXMgb2JqZWN0CisgKgorICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworaW50IHNuZF9oZGFjX2J1c19wYXJzZV9jYXBhYmlsaXRpZXMoc3RydWN0IGhkYWNfYnVzICpidXMpCit7CisJdW5zaWduZWQgaW50IGN1cl9jYXA7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgY291bnRlciA9IDA7CisKKwlvZmZzZXQgPSBzbmRfaGRhY19jaGlwX3JlYWRsKGJ1cywgTExDSCk7CisKKwkvKiBMZXRzIHdhbGsgdGhlIGxpbmtlZCBjYXBhYmlsaXRpZXMgbGlzdCAqLworCWRvIHsKKwkJY3VyX2NhcCA9IF9zbmRfaGRhY19jaGlwX3JlYWQobCwgYnVzLCBvZmZzZXQpOworCisJCWRldl9kYmcoYnVzLT5kZXYsICJDYXBhYmlsaXR5IHZlcnNpb246IDB4JXhcbiIsCisJCQkoY3VyX2NhcCAmIEFaWF9DQVBfSERSX1ZFUl9NQVNLKSA+PiBBWlhfQ0FQX0hEUl9WRVJfT0ZGKTsKKworCQlkZXZfZGJnKGJ1cy0+ZGV2LCAiSERBIGNhcGFiaWxpdHkgSUQ6IDB4JXhcbiIsCisJCQkoY3VyX2NhcCAmIEFaWF9DQVBfSERSX0lEX01BU0spID4+IEFaWF9DQVBfSERSX0lEX09GRik7CisKKwkJc3dpdGNoICgoY3VyX2NhcCAmIEFaWF9DQVBfSERSX0lEX01BU0spID4+IEFaWF9DQVBfSERSX0lEX09GRikgeworCQljYXNlIEFaWF9NTF9DQVBfSUQ6CisJCQlkZXZfZGJnKGJ1cy0+ZGV2LCAiRm91bmQgTUwgY2FwYWJpbGl0eVxuIik7CisJCQlidXMtPm1sY2FwID0gYnVzLT5yZW1hcF9hZGRyICsgb2Zmc2V0OworCQkJYnJlYWs7CisKKwkJY2FzZSBBWlhfR1RTX0NBUF9JRDoKKwkJCWRldl9kYmcoYnVzLT5kZXYsICJGb3VuZCBHVFMgY2FwYWJpbGl0eSBvZmZzZXQ9JXhcbiIsIG9mZnNldCk7CisJCQlidXMtPmd0c2NhcCA9IGJ1cy0+cmVtYXBfYWRkciArIG9mZnNldDsKKwkJCWJyZWFrOworCisJCWNhc2UgQVpYX1BQX0NBUF9JRDoKKwkJCS8qIFBQIGNhcGFiaWxpdHkgZm91bmQsIHRoZSBBdWRpbyBEU1AgaXMgcHJlc2VudCAqLworCQkJZGV2X2RiZyhidXMtPmRldiwgIkZvdW5kIFBQIGNhcGFiaWxpdHkgb2Zmc2V0PSV4XG4iLCBvZmZzZXQpOworCQkJYnVzLT5wcGNhcCA9IGJ1cy0+cmVtYXBfYWRkciArIG9mZnNldDsKKwkJCWJyZWFrOworCisJCWNhc2UgQVpYX1NQQl9DQVBfSUQ6CisJCQkvKiBTUElCIGNhcGFiaWxpdHkgZm91bmQsIGhhbmRsZXIgZnVuY3Rpb24gKi8KKwkJCWRldl9kYmcoYnVzLT5kZXYsICJGb3VuZCBTUEIgY2FwYWJpbGl0eVxuIik7CisJCQlidXMtPnNwYmNhcCA9IGJ1cy0+cmVtYXBfYWRkciArIG9mZnNldDsKKwkJCWJyZWFrOworCisJCWNhc2UgQVpYX0RSU01fQ0FQX0lEOgorCQkJLyogRE1BIHJlc3VtZSAgY2FwYWJpbGl0eSBmb3VuZCwgaGFuZGxlciBmdW5jdGlvbiAqLworCQkJZGV2X2RiZyhidXMtPmRldiwgIkZvdW5kIERSU00gY2FwYWJpbGl0eVxuIik7CisJCQlidXMtPmRyc21jYXAgPSBidXMtPnJlbWFwX2FkZHIgKyBvZmZzZXQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZGV2X2RiZyhidXMtPmRldiwgIlVua25vd24gY2FwYWJpbGl0eSAlZFxuIiwgY3VyX2NhcCk7CisJCQlicmVhazsKKwkJfQorCisJCWNvdW50ZXIrKzsKKworCQlpZiAoY291bnRlciA+IEhEQUNfTUFYX0NBUFMpIHsKKwkJCWRldl9lcnIoYnVzLT5kZXYsICJXZSBleGNlZWRlZCBIREFDIGNhcGFiaWxpdGllcyEhIVxuIik7CisJCQlicmVhazsKKwkJfQorCisJCS8qIHJlYWQgdGhlIG9mZnNldCBvZiBuZXh0IGNhcGFiaWxpdHkgKi8KKwkJb2Zmc2V0ID0gY3VyX2NhcCAmIEFaWF9DQVBfSERSX05YVF9QVFJfTUFTSzsKKworCX0gd2hpbGUgKG9mZnNldCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFjX2J1c19wYXJzZV9jYXBhYmlsaXRpZXMpOworCiAvKgogICogTG93bGV2ZWwgaW50ZXJmYWNlCiAgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hZDE4ODkuYyBiL3NvdW5kL3BjaS9hZDE4ODkuYwppbmRleCAxZmM2ZDhiLi44YzM2OTkwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWQxODg5LmMKKysrIGIvc291bmQvcGNpL2FkMTg4OS5jCkBAIC01NzEsNyArNTcxLDcgQEAKIAlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHNzLT5ydW50aW1lLCBwdHIpOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hZDE4ODlfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYWQxODg5X3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9IHNuZF9hZDE4ODlfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPSBzbmRfYWQxODg5X3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9IHNuZF9wY21fbGliX2lvY3RsLApAQCAtNTgyLDcgKzU4Miw3IEBACiAJLnBvaW50ZXIgPSBzbmRfYWQxODg5X3BsYXliYWNrX3BvaW50ZXIsIAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYWQxODg5X2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYWQxODg5X2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0gc25kX2FkMTg4OV9jYXB0dXJlX29wZW4sCiAJLmNsb3NlID0gc25kX2FkMTg4OV9jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9IHNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FsaTU0NTEvYWxpNTQ1MS5jIGIvc291bmQvcGNpL2FsaTU0NTEvYWxpNTQ1MS5jCmluZGV4IDM2NDcwYWYuLjkyYjgxOWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hbGk1NDUxL2FsaTU0NTEuYworKysgYi9zb3VuZC9wY2kvYWxpNTQ1MS9hbGk1NDUxLmMKQEAgLTE0MDgsNiArMTQwOCw3IEBACiAJc3Bpbl91bmxvY2soJmNvZGVjLT5yZWdfbG9jayk7CiAJZGV2X2RiZyhjb2RlYy0+Y2FyZC0+ZGV2LCAicGxheWJhY2sgcG9pbnRlciByZXR1cm5lZCBjc289JXhoLlxuIiwgY3NvKTsKIAorCWNzbyAlPSBydW50aW1lLT5idWZmZXJfc2l6ZTsKIAlyZXR1cm4gY3NvOwogfQogCkBAIC0xNDI4LDYgKzE0MjksNyBAQAogCWNzbyA9IGludyhBTElfUkVHKGNvZGVjLCBBTElfQ1NPX0FMUEhBX0ZNUyArIDIpKTsKIAlzcGluX3VubG9jaygmY29kZWMtPnJlZ19sb2NrKTsKIAorCWNzbyAlPSBydW50aW1lLT5idWZmZXJfc2l6ZTsKIAlyZXR1cm4gY3NvOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWxzMzAwLmMgYi9zb3VuZC9wY2kvYWxzMzAwLmMKaW5kZXggYWRkMzE3Ni4uYWI3NTYwMSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FsczMwMC5jCisrKyBiL3NvdW5kL3BjaS9hbHMzMDAuYwpAQCAtNTYzLDcgKzU2Myw3IEBACiAJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIGN1cnJlbnRfcHRyKTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYWxzMzAwX3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2FsczMwMF9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2FsczMwMF9wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9CXNuZF9hbHMzMDBfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC01NzQsNyArNTc0LDcgQEAKIAkucG9pbnRlciA9CXNuZF9hbHMzMDBfcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2FsczMwMF9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2FsczMwMF9jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfYWxzMzAwX2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPQlzbmRfYWxzMzAwX2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWxzNDAwMC5jIGIvc291bmQvcGNpL2FsczQwMDAuYwppbmRleCBmZjM5YTBjLi5lZGFiZTEzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWxzNDAwMC5jCisrKyBiL3NvdW5kL3BjaS9hbHM0MDAwLmMKQEAgLTY3Miw3ICs2NzIsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hbHM0MDAwX3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2FsczQwMDBfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0JCXNuZF9hbHM0MDAwX3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0Jc25kX2FsczQwMDBfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC02ODMsNyArNjgzLDcgQEAKIAkucG9pbnRlciA9CXNuZF9hbHM0MDAwX3BsYXliYWNrX3BvaW50ZXIKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2FsczQwMDBfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hbHM0MDAwX2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0JCXNuZF9hbHM0MDAwX2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPQlzbmRfYWxzNDAwMF9jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FzaWhwaS9hc2locGkuYyBiL3NvdW5kL3BjaS9hc2locGkvYXNpaHBpLmMKaW5kZXggMTAzOWVjYy4uOTc2YTNkMiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FzaWhwaS9hc2locGkuYworKysgYi9zb3VuZC9wY2kvYXNpaHBpL2FzaWhwaS5jCkBAIC0xMTM4LDcgKzExMzgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jYXJkX2FzaWhwaV9wbGF5YmFja19tbWFwX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NhcmRfYXNpaHBpX3BsYXliYWNrX21tYXBfb3BzID0gewogCS5vcGVuID0gc25kX2NhcmRfYXNpaHBpX3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0gc25kX2NhcmRfYXNpaHBpX3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9IHNuZF9jYXJkX2FzaWhwaV9wbGF5YmFja19pb2N0bCwKQEAgLTEzMDUsNyArMTMwNSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NhcmRfYXNpaHBpX2NhcHR1cmVfbW1hcF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jYXJkX2FzaWhwaV9jYXB0dXJlX21tYXBfb3BzID0gewogCS5vcGVuID0gc25kX2NhcmRfYXNpaHBpX2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPSBzbmRfY2FyZF9hc2locGlfY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPSBzbmRfY2FyZF9hc2locGlfY2FwdHVyZV9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hc2locGkvaHBpZnVuYy5jIGIvc291bmQvcGNpL2FzaWhwaS9ocGlmdW5jLmMKaW5kZXggNTEwZTU2Yy4uZjliNTc2NCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FzaWhwaS9ocGlmdW5jLmMKKysrIGIvc291bmQvcGNpL2FzaWhwaS9ocGlmdW5jLmMKQEAgLTIzMjMsMTEgKzIzMjMsOCBAQAogdTE2IGhwaV9zYW1wbGVfY2xvY2tfcXVlcnlfbG9jYWxfcmF0ZShjb25zdCB1MzIgaF9jbG9jaywgY29uc3QgdTMyIGluZGV4LAogCXUzMiAqcHJhdGUpCiB7Ci0JdTE2IGVycjsKLQllcnIgPSBocGlfY29udHJvbF9xdWVyeShoX2Nsb2NrLCBIUElfU0FNUExFQ0xPQ0tfTE9DQUxfU0FNUExFUkFURSwKLQkJaW5kZXgsIDAsIHByYXRlKTsKLQotCXJldHVybiBlcnI7CisJcmV0dXJuIGhwaV9jb250cm9sX3F1ZXJ5KGhfY2xvY2ssIEhQSV9TQU1QTEVDTE9DS19MT0NBTF9TQU1QTEVSQVRFLAorCQkJCSBpbmRleCwgMCwgcHJhdGUpOwogfQogCiB1MTYgaHBpX3NhbXBsZV9jbG9ja19zZXRfbG9jYWxfcmF0ZSh1MzIgaF9jb250cm9sLCB1MzIgc2FtcGxlX3JhdGUpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXRpaXhwLmMgYi9zb3VuZC9wY2kvYXRpaXhwLmMKaW5kZXggMmNlMDAyMi4uYTQwYzkxOCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F0aWl4cC5jCisrKyBiL3NvdW5kL3BjaS9hdGlpeHAuYwpAQCAtMTE0OCw3ICsxMTQ4LDcgQEAKIH0KIAogLyogQUM5NyBwbGF5YmFjayAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYXRpaXhwX3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2F0aWl4cF9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2F0aWl4cF9wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9CXNuZF9hdGlpeHBfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMTYwLDcgKzExNjAsNyBAQAogfTsKIAogLyogQUM5NyBjYXB0dXJlICovCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hdGlpeHBfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hdGlpeHBfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2F0aWl4cF9jYXB0dXJlX29wZW4sCiAJLmNsb3NlID0Jc25kX2F0aWl4cF9jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTE3Miw3ICsxMTcyLDcgQEAKIH07CiAKIC8qIFNQRElGIHBsYXliYWNrICovCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hdGlpeHBfc3BkaWZfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYXRpaXhwX3NwZGlmX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfYXRpaXhwX3NwZGlmX29wZW4sCiAJLmNsb3NlID0Jc25kX2F0aWl4cF9zcGRpZl9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hdGlpeHBfbW9kZW0uYyBiL3NvdW5kL3BjaS9hdGlpeHBfbW9kZW0uYwppbmRleCBjNTM0NTUyLi40MDE1MmZlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXRpaXhwX21vZGVtLmMKKysrIGIvc291bmQvcGNpL2F0aWl4cF9tb2RlbS5jCkBAIC05NDcsNyArOTQ3LDcgQEAKIAogCiAvKiBBQzk3IHBsYXliYWNrICovCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hdGlpeHBfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYXRpaXhwX3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfYXRpaXhwX3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0Jc25kX2F0aWl4cF9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTk1OSw3ICs5NTksNyBAQAogfTsKIAogLyogQUM5NyBjYXB0dXJlICovCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hdGlpeHBfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hdGlpeHBfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2F0aWl4cF9jYXB0dXJlX29wZW4sCiAJLmNsb3NlID0Jc25kX2F0aWl4cF9jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfY29yZS5jIGIvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfY29yZS5jCmluZGV4IGQzMTI1YzEuLmUxYWYyNGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX2NvcmUuYworKysgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9jb3JlLmMKQEAgLTEwNDMsNyArMTA0Myw3IEBACiAJZm9yICh4ID0gTlJfQURCIC0gMTsgeCA+PSAwOyB4LS0pIHsKIAkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIGFkZHIsIChGSUZPX1UwIHwgRklGT19VMSkpOwogCQlpZiAoaHdyZWFkKHZvcnRleC0+bW1pbywgYWRkcikgIT0gKEZJRk9fVTAgfCBGSUZPX1UxKSkKLQkJCWRldl9lcnIodm9ydGV4LT5jYXJkLT5kZXYsICJiYWQgYWRiIGZpZm8gcmVzZXQhIik7CisJCQlkZXZfZXJyKHZvcnRleC0+Y2FyZC0+ZGV2LCAiYmFkIGFkYiBmaWZvIHJlc2V0IVxuIik7CiAJCXZvcnRleF9maWZvX2NsZWFyYWRiZGF0YSh2b3J0ZXgsIHgsIEZJRk9fU0laRSk7CiAJCWFkZHIgLT0gNDsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXcyL2F3Mi1hbHNhLmMgYi9zb3VuZC9wY2kvYXcyL2F3Mi1hbHNhLmMKaW5kZXggMTY3NzE0My4uNTdiYmI4NyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F3Mi9hdzItYWxzYS5jCisrKyBiL3NvdW5kL3BjaS9hdzIvYXcyLWFsc2EuYwpAQCAtMTc5LDcgKzE3OSw3IEBACiBtb2R1bGVfcGNpX2RyaXZlcihhdzJfZHJpdmVyKTsKIAogLyogb3BlcmF0b3JzIGZvciBwbGF5YmFjayBQQ00gYWxzYSBpbnRlcmZhY2UgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2F3Ml9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hdzJfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0gc25kX2F3Ml9wY21fcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPSBzbmRfYXcyX3BjbV9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPSBzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTE5MSw3ICsxOTEsNyBAQAogfTsKIAogLyogb3BlcmF0b3JzIGZvciBjYXB0dXJlIFBDTSBhbHNhIGludGVyZmFjZSAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYXcyX2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYXcyX2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0gc25kX2F3Ml9wY21fY2FwdHVyZV9vcGVuLAogCS5jbG9zZSA9IHNuZF9hdzJfcGNtX2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0gc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXp0MzMyOC5jIGIvc291bmQvcGNpL2F6dDMzMjguYwppbmRleCA1ZTJlZjBiLi44MGM0YTQ0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXp0MzMyOC5jCisrKyBiL3NvdW5kL3BjaS9henQzMzI4LmMKQEAgLTIwOTAsNyArMjA5MCw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2F6ZjMzMjhfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYXpmMzMyOF9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2F6ZjMzMjhfcGNtX3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0Jc25kX2F6ZjMzMjhfcGNtX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMjEwMSw3ICsyMTAxLDcgQEAKIAkucG9pbnRlciA9CXNuZF9hemYzMzI4X3BjbV9wb2ludGVyCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hemYzMzI4X2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYXpmMzMyOF9jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfYXpmMzMyOF9wY21fY2FwdHVyZV9vcGVuLAogCS5jbG9zZSA9CXNuZF9hemYzMzI4X3BjbV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTIxMTIsNyArMjExMiw3IEBACiAJLnBvaW50ZXIgPQlzbmRfYXpmMzMyOF9wY21fcG9pbnRlcgogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYXpmMzMyOF9pMnNfb3V0X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2F6ZjMzMjhfaTJzX291dF9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2F6ZjMzMjhfcGNtX2kyc19vdXRfb3BlbiwKIAkuY2xvc2UgPQlzbmRfYXpmMzMyOF9wY21fY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYnQ4N3guYyBiL3NvdW5kL3BjaS9idDg3eC5jCmluZGV4IDU5MjViNzEuLmYyYzA3MDkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9idDg3eC5jCisrKyBiL3NvdW5kL3BjaS9idDg3eC5jCkBAIC01NTAsNyArNTUwLDcgQEAKIAlyZXR1cm4gKHNuZF9wY21fdWZyYW1lc190KWJ5dGVzX3RvX2ZyYW1lcyhydW50aW1lLCBjaGlwLT5jdXJyZW50X2xpbmUgKiBjaGlwLT5saW5lX2J5dGVzKTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYnQ4N3hfcGNtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2J0ODd4X3BjbV9vcHMgPSB7CiAJLm9wZW4gPSBzbmRfYnQ4N3hfcGNtX29wZW4sCiAJLmNsb3NlID0gc25kX2J0ODd4X2Nsb3NlLAogCS5pb2N0bCA9IHNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWFpbi5jIGIvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWFpbi5jCmluZGV4IGQzY2Q5NTYuLjYxNjVhNTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X21haW4uYworKysgYi9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9tYWluLmMKQEAgLTExMDksNyArMTEwOSw3IEBACiB9CiAKIC8qIG9wZXJhdG9ycyAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY2EwMTA2X3BsYXliYWNrX2Zyb250X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NhMDEwNl9wbGF5YmFja19mcm9udF9vcHMgPSB7CiAJLm9wZW4gPSAgICAgICAgc25kX2NhMDEwNl9wY21fb3Blbl9wbGF5YmFja19mcm9udCwKIAkuY2xvc2UgPSAgICAgICBzbmRfY2EwMTA2X3BjbV9jbG9zZV9wbGF5YmFjaywKIAkuaW9jdGwgPSAgICAgICBzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTExMjAsNyArMTEyMCw3IEBACiAJLnBvaW50ZXIgPSAgICAgc25kX2NhMDEwNl9wY21fcG9pbnRlcl9wbGF5YmFjaywKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NhMDEwNl9jYXB0dXJlXzBfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY2EwMTA2X2NhcHR1cmVfMF9vcHMgPSB7CiAJLm9wZW4gPSAgICAgICAgc25kX2NhMDEwNl9wY21fb3Blbl8wX2NhcHR1cmUsCiAJLmNsb3NlID0gICAgICAgc25kX2NhMDEwNl9wY21fY2xvc2VfY2FwdHVyZSwKIAkuaW9jdGwgPSAgICAgICBzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTExMzEsNyArMTEzMSw3IEBACiAJLnBvaW50ZXIgPSAgICAgc25kX2NhMDEwNl9wY21fcG9pbnRlcl9jYXB0dXJlLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY2EwMTA2X2NhcHR1cmVfMV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jYTAxMDZfY2FwdHVyZV8xX29wcyA9IHsKIAkub3BlbiA9ICAgICAgICBzbmRfY2EwMTA2X3BjbV9vcGVuXzFfY2FwdHVyZSwKIAkuY2xvc2UgPSAgICAgICBzbmRfY2EwMTA2X3BjbV9jbG9zZV9jYXB0dXJlLAogCS5pb2N0bCA9ICAgICAgIHNuZF9wY21fbGliX2lvY3RsLApAQCAtMTE0Miw3ICsxMTQyLDcgQEAKIAkucG9pbnRlciA9ICAgICBzbmRfY2EwMTA2X3BjbV9wb2ludGVyX2NhcHR1cmUsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jYTAxMDZfY2FwdHVyZV8yX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NhMDEwNl9jYXB0dXJlXzJfb3BzID0gewogCS5vcGVuID0gICAgICAgIHNuZF9jYTAxMDZfcGNtX29wZW5fMl9jYXB0dXJlLAogCS5jbG9zZSA9ICAgICAgIHNuZF9jYTAxMDZfcGNtX2Nsb3NlX2NhcHR1cmUsCiAJLmlvY3RsID0gICAgICAgc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMTUzLDcgKzExNTMsNyBAQAogCS5wb2ludGVyID0gICAgIHNuZF9jYTAxMDZfcGNtX3BvaW50ZXJfY2FwdHVyZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NhMDEwNl9jYXB0dXJlXzNfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY2EwMTA2X2NhcHR1cmVfM19vcHMgPSB7CiAJLm9wZW4gPSAgICAgICAgc25kX2NhMDEwNl9wY21fb3Blbl8zX2NhcHR1cmUsCiAJLmNsb3NlID0gICAgICAgc25kX2NhMDEwNl9wY21fY2xvc2VfY2FwdHVyZSwKIAkuaW9jdGwgPSAgICAgICBzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTExNjQsNyArMTE2NCw3IEBACiAJLnBvaW50ZXIgPSAgICAgc25kX2NhMDEwNl9wY21fcG9pbnRlcl9jYXB0dXJlLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY2EwMTA2X3BsYXliYWNrX2NlbnRlcl9sZmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY2EwMTA2X3BsYXliYWNrX2NlbnRlcl9sZmVfb3BzID0gewogICAgICAgICAub3BlbiA9ICAgICAgICAgc25kX2NhMDEwNl9wY21fb3Blbl9wbGF5YmFja19jZW50ZXJfbGZlLAogICAgICAgICAuY2xvc2UgPSAgICAgICAgc25kX2NhMDEwNl9wY21fY2xvc2VfcGxheWJhY2ssCiAgICAgICAgIC5pb2N0bCA9ICAgICAgICBzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTExNzUsNyArMTE3NSw3IEBACiAgICAgICAgIC5wb2ludGVyID0gICAgICBzbmRfY2EwMTA2X3BjbV9wb2ludGVyX3BsYXliYWNrLCAKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NhMDEwNl9wbGF5YmFja191bmtub3duX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NhMDEwNl9wbGF5YmFja191bmtub3duX29wcyA9IHsKICAgICAgICAgLm9wZW4gPSAgICAgICAgIHNuZF9jYTAxMDZfcGNtX29wZW5fcGxheWJhY2tfdW5rbm93biwKICAgICAgICAgLmNsb3NlID0gICAgICAgIHNuZF9jYTAxMDZfcGNtX2Nsb3NlX3BsYXliYWNrLAogICAgICAgICAuaW9jdGwgPSAgICAgICAgc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMTg2LDcgKzExODYsNyBAQAogICAgICAgICAucG9pbnRlciA9ICAgICAgc25kX2NhMDEwNl9wY21fcG9pbnRlcl9wbGF5YmFjaywgCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jYTAxMDZfcGxheWJhY2tfcmVhcl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jYTAxMDZfcGxheWJhY2tfcmVhcl9vcHMgPSB7CiAgICAgICAgIC5vcGVuID0gICAgICAgICBzbmRfY2EwMTA2X3BjbV9vcGVuX3BsYXliYWNrX3JlYXIsCiAgICAgICAgIC5jbG9zZSA9ICAgICAgICBzbmRfY2EwMTA2X3BjbV9jbG9zZV9wbGF5YmFjaywKICAgICAgICAgLmlvY3RsID0gICAgICAgIHNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NtaXBjaS5jIGIvc291bmQvcGNpL2NtaXBjaS5jCmluZGV4IDI0Y2RjYmEuLjczZjU5MzUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jbWlwY2kuYworKysgYi9zb3VuZC9wY2kvY21pcGNpLmMKQEAgLTE4MzgsNyArMTgzOCw3IEBACiAvKgogICovCiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NtaXBjaV9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jbWlwY2lfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0JCXNuZF9jbWlwY2lfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPQlzbmRfY21pcGNpX3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTg0OSw3ICsxODQ5LDcgQEAKIAkucG9pbnRlciA9CXNuZF9jbWlwY2lfcGxheWJhY2tfcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NtaXBjaV9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NtaXBjaV9jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfY21pcGNpX2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPQlzbmRfY21pcGNpX2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xODYwLDcgKzE4NjAsNyBAQAogCS5wb2ludGVyID0Jc25kX2NtaXBjaV9jYXB0dXJlX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jbWlwY2lfcGxheWJhY2syX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NtaXBjaV9wbGF5YmFjazJfb3BzID0gewogCS5vcGVuID0JCXNuZF9jbWlwY2lfcGxheWJhY2syX29wZW4sCiAJLmNsb3NlID0Jc25kX2NtaXBjaV9wbGF5YmFjazJfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xODcxLDcgKzE4NzEsNyBAQAogCS5wb2ludGVyID0Jc25kX2NtaXBjaV9jYXB0dXJlX3BvaW50ZXIsCS8qIGNoYW5uZWwgQiAqLwogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY21pcGNpX3BsYXliYWNrX3NwZGlmX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NtaXBjaV9wbGF5YmFja19zcGRpZl9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2NtaXBjaV9wbGF5YmFja19zcGRpZl9vcGVuLAogCS5jbG9zZSA9CXNuZF9jbWlwY2lfcGxheWJhY2tfc3BkaWZfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xODgyLDcgKzE4ODIsNyBAQAogCS5wb2ludGVyID0Jc25kX2NtaXBjaV9wbGF5YmFja19wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY21pcGNpX2NhcHR1cmVfc3BkaWZfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY21pcGNpX2NhcHR1cmVfc3BkaWZfb3BzID0gewogCS5vcGVuID0JCXNuZF9jbWlwY2lfY2FwdHVyZV9zcGRpZl9vcGVuLAogCS5jbG9zZSA9CXNuZF9jbWlwY2lfY2FwdHVyZV9zcGRpZl9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczQyODEuYyBiL3NvdW5kL3BjaS9jczQyODEuYwppbmRleCBjMjk2ZmQwLi42MTVkOGE5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M0MjgxLmMKKysrIGIvc291bmQvcGNpL2NzNDI4MS5jCkBAIC05NTEsNyArOTUxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY3M0MjgxX3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NzNDI4MV9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2NzNDI4MV9wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9CXNuZF9jczQyODFfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC05NjIsNyArOTYyLDcgQEAKIAkucG9pbnRlciA9CXNuZF9jczQyODFfcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NzNDI4MV9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NzNDI4MV9jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfY3M0MjgxX2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPQlzbmRfY3M0MjgxX2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYyBiL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4X2xpYi5jCmluZGV4IDI3MDZmMjcuLjUyODEwMmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4X2xpYi5jCisrKyBiL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4X2xpYi5jCkBAIC0yNDYwLDcgKzI0NjAsNyBAQAogCQl1ZGVsYXkoMTApOwogCQlpZiAoc25kX2NzNDZ4eF9jb2RlY19yZWFkKGNoaXAsIEFDOTdfUkVTRVQsIGNvZGVjKSAmIDB4ODAwMCkgewogCQkJZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsCi0JCQkJInNlY29uYWRyeSBjb2RlYyBub3QgcHJlc2VudFxuIik7CisJCQkJInNlY29uZGFyeSBjb2RlYyBub3QgcHJlc2VudFxuIik7CiAJCQlyZXR1cm4gLUVOWElPOwogCQl9CiAJfQpAQCAtMjUwMyw3ICsyNTAzLDcgQEAKIAljaGlwLT5ucl9hYzk3X2NvZGVjcyA9IDE7CiAKICNpZmRlZiBDT05GSUdfU05EX0NTNDZYWF9ORVdfRFNQCi0JZGV2X2RiZyhjaGlwLT5jYXJkLT5kZXYsICJkZXRlY3Rpbmcgc2Vjb25hZHJ5IGNvZGVjXG4iKTsKKwlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImRldGVjdGluZyBzZWNvbmRhcnkgY29kZWNcbiIpOwogCS8qIHRyeSBkZXRlY3QgYSBzZWNvbmRhcnkgY29kZWMgKi8KIAlpZiAoISBjczQ2eHhfZGV0ZWN0X2NvZGVjKGNoaXAsIENTNDZYWF9TRUNPTkRBUllfQ09ERUNfSU5ERVgpKQogCQljaGlwLT5ucl9hYzk3X2NvZGVjcyA9IDI7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0Nnh4L2RzcF9zcG9zLmMgYi9zb3VuZC9wY2kvY3M0Nnh4L2RzcF9zcG9zLmMKaW5kZXggZDI5NTFlZC4uNGEwY2JkMiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNDZ4eC9kc3Bfc3Bvcy5jCisrKyBiL3NvdW5kL3BjaS9jczQ2eHgvZHNwX3Nwb3MuYwpAQCAtMTQ0MSw3ICsxNDQxLDcgQEAKIAkKIAlpZiAoY2hpcC0+bnJfYWM5N19jb2RlY3MgPT0gMikgewogCQkvKiBjcmVhdGUgQ09ERUMgdGFza2xldCBmb3IgcmVhciBDZW50ZXIvTEZFIG91dHB1dCAKLQkJICAgc2xvdCA2IGFuZCA5IG9uIHNlY29uYWRyeSBDT0RFQyAqLworCQkgICBzbG90IDYgYW5kIDkgb24gc2Vjb25kYXJ5IENPREVDICovCiAJCWNsZmVfY29kZWNfb3V0X3NjYiA9IGNzNDZ4eF9kc3BfY3JlYXRlX2NvZGVjX291dF9zY2IoY2hpcCwiQ29kZWNPdXRTQ0JfQ0xGRSIsMHgwMDMwLDB4MDAzMCwKIAkJCQkJCQkJICAgICBDTEZFX01JWEVSX1NDQl9BRERSLAogCQkJCQkJCQkgICAgIENMRkVfQ09ERUNfU0NCX0FERFIsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcGNtLmMgYi9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcGNtLmMKaW5kZXggMjdmYTU3ZC4uYzIwOGMxZCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX3BjbS5jCisrKyBiL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpb19wY20uYwpAQCAtMzgwLDcgKzM4MCw3IEBACiAJCQkJIHN1YnN0cmVhbS0+cnVudGltZS0+cmF0ZSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NzNTUzNWF1ZGlvX3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NzNTUzNWF1ZGlvX3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfY3M1NTM1YXVkaW9fcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPQlzbmRfY3M1NTM1YXVkaW9fcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0zOTEsNyArMzkxLDcgQEAKIAkucG9pbnRlciA9CXNuZF9jczU1MzVhdWRpb19wY21fcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NzNTUzNWF1ZGlvX2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY3M1NTM1YXVkaW9fY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2NzNTUzNWF1ZGlvX2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPQlzbmRfY3M1NTM1YXVkaW9fY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jdHhmaS9jdGF0Yy5jIGIvc291bmQvcGNpL2N0eGZpL2N0YXRjLmMKaW5kZXggOTc3YTU5OC4uOTA4NjU4YSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2N0eGZpL2N0YXRjLmMKKysrIGIvc291bmQvcGNpL2N0eGZpL2N0YXRjLmMKQEAgLTE2MjMsNyArMTYyMyw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCBjdF9hdGMgYXRjX3ByZXNldCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3RfYXRjIGF0Y19wcmVzZXQgPSB7CiAJLm1hcF9hdWRpb19idWZmZXIgPSBjdF9tYXBfYXVkaW9fYnVmZmVyLAogCS51bm1hcF9hdWRpb19idWZmZXIgPSBjdF91bm1hcF9hdWRpb19idWZmZXIsCiAJLnBjbV9wbGF5YmFja19wcmVwYXJlID0gYXRjX3BjbV9wbGF5YmFja19wcmVwYXJlLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2N0eGZpL2N0cGNtLmMgYi9zb3VuZC9wY2kvY3R4ZmkvY3RwY20uYwppbmRleCBkODZjNDc0Li45NzQ5NzgwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3R4ZmkvY3RwY20uYworKysgYi9zb3VuZC9wY2kvY3R4ZmkvY3RwY20uYwpAQCAtMzcyLDcgKzM3Miw3IEBACiB9CiAKIC8qIFBDTSBvcGVyYXRvcnMgZm9yIHBsYXliYWNrICovCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIGN0X3BjbV9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIGN0X3BjbV9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4JIAk9IGN0X3BjbV9wbGF5YmFja19vcGVuLAogCS5jbG9zZQkJPSBjdF9wY21fcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsCQk9IHNuZF9wY21fbGliX2lvY3RsLApAQCAtMzg1LDcgKzM4NSw3IEBACiB9OwogCiAvKiBQQ00gb3BlcmF0b3JzIGZvciBjYXB0dXJlICovCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIGN0X3BjbV9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgY3RfcGNtX2NhcHR1cmVfb3BzID0gewogCS5vcGVuCSAJPSBjdF9wY21fY2FwdHVyZV9vcGVuLAogCS5jbG9zZQkJPSBjdF9wY21fY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwJCT0gc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3R4ZmkvY3R2bWVtLmMgYi9zb3VuZC9wY2kvY3R4ZmkvY3R2bWVtLmMKaW5kZXggNDE5MzA2ZS4uNTIwZTE5YiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2N0eGZpL2N0dm1lbS5jCisrKyBiL3NvdW5kL3BjaS9jdHhmaS9jdHZtZW0uYwpAQCAtMTY2LDExICsxNjYsNyBAQAogc3RhdGljIGRtYV9hZGRyX3QKIGN0X2dldF9wdHBfcGh5cyhzdHJ1Y3QgY3Rfdm0gKnZtLCBpbnQgaW5kZXgpCiB7Ci0JZG1hX2FkZHJfdCBhZGRyOwotCi0JYWRkciA9IChpbmRleCA+PSBDVF9QVFBfTlVNKSA/IH4wVUwgOiB2bS0+cHRwW2luZGV4XS5hZGRyOwotCi0JcmV0dXJuIGFkZHI7CisJcmV0dXJuIChpbmRleCA+PSBDVF9QVFBfTlVNKSA/IH4wVUwgOiB2bS0+cHRwW2luZGV4XS5hZGRyOwogfQogCiBpbnQgY3Rfdm1fY3JlYXRlKHN0cnVjdCBjdF92bSAqKnJ2bSwgc3RydWN0IHBjaV9kZXYgKnBjaSkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazF4LmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxeC5jCmluZGV4IDZkMWI5OGQuLjkyMTAzN2UgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazF4LmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMXguYwpAQCAtNTQ4LDcgKzU0OCw3IEBACiB9CiAKIC8qIG9wZXJhdG9ycyAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZW11MTBrMXhfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZW11MTBrMXhfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0gICAgICAgIHNuZF9lbXUxMGsxeF9wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9ICAgICAgIHNuZF9lbXUxMGsxeF9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPSAgICAgICBzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTY5NCw3ICs2OTQsNyBAQAogCXJldHVybiBwdHI7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2VtdTEwazF4X2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZW11MTBrMXhfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPSAgICAgICAgc25kX2VtdTEwazF4X3BjbV9vcGVuX2NhcHR1cmUsCiAJLmNsb3NlID0gICAgICAgc25kX2VtdTEwazF4X3BjbV9jbG9zZV9jYXB0dXJlLAogCS5pb2N0bCA9ICAgICAgIHNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11cGNtLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXVwY20uYwppbmRleCAxNGEzMDViLi4zN2JlMWUxIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVwY20uYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXVwY20uYwpAQCAtMTM2NCw3ICsxMzY0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZW11MTBrMV9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lbXUxMGsxX3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9CQkJc25kX2VtdTEwazFfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPQkJc25kX2VtdTEwazFfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0JCXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTM3Niw3ICsxMzc2LDcgQEAKIAkucGFnZSA9CQkJc25kX3BjbV9zZ2J1Zl9vcHNfcGFnZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2VtdTEwazFfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lbXUxMGsxX2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0JCQlzbmRfZW11MTBrMV9jYXB0dXJlX29wZW4sCiAJLmNsb3NlID0JCXNuZF9lbXUxMGsxX2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0JCXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTM4OCw3ICsxMzg4LDcgQEAKIH07CiAKIC8qIEVGWCBwbGF5YmFjayAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZW11MTBrMV9lZnhfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZW11MTBrMV9lZnhfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0JCQlzbmRfZW11MTBrMV9lZnhfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPQkJc25kX2VtdTEwazFfZWZ4X3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTE0NTUsNyArMTQ1NSw3IEBACiB9CiAKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZW11MTBrMV9jYXB0dXJlX21pY19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lbXUxMGsxX2NhcHR1cmVfbWljX29wcyA9IHsKIAkub3BlbiA9CQkJc25kX2VtdTEwazFfY2FwdHVyZV9taWNfb3BlbiwKIAkuY2xvc2UgPQkJc25kX2VtdTEwazFfY2FwdHVyZV9taWNfY2xvc2UsCiAJLmlvY3RsID0JCXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTU1MCw3ICsxNTUwLDcgQEAKIAkucHV0ID0gc25kX2VtdTEwazFfcGNtX2VmeF92b2ljZXNfbWFza19wdXQKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2VtdTEwazFfY2FwdHVyZV9lZnhfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZW11MTBrMV9jYXB0dXJlX2VmeF9vcHMgPSB7CiAJLm9wZW4gPQkJCXNuZF9lbXUxMGsxX2NhcHR1cmVfZWZ4X29wZW4sCiAJLmNsb3NlID0JCXNuZF9lbXUxMGsxX2NhcHR1cmVfZWZ4X2Nsb3NlLAogCS5pb2N0bCA9CQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTE3OTEsNyArMTc5MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2VtdTEwazFfZng4MDEwX3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2VtdTEwazFfZng4MDEwX3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9CQkJc25kX2VtdTEwazFfZng4MDEwX3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0JCXNuZF9lbXUxMGsxX2Z4ODAxMF9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPQkJc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9wMTZ2LmMgYi9zb3VuZC9wY2kvZW11MTBrMS9wMTZ2LmMKaW5kZXggM2M2MGI0My4uYzExZjFhMiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvcDE2di5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL3AxNnYuYwpAQCAtMzAwLDM3ICszMDAsMjkgQEAKIHN0YXRpYyBpbnQgc25kX3AxNnZfcGNtX2h3X3BhcmFtc19wbGF5YmFjayhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJCQkgICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKmh3X3BhcmFtcykKIHsKLQlpbnQgcmVzdWx0OwotCXJlc3VsdCA9IHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sCisJcmV0dXJuIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sCiAJCQkJCXBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7Ci0JcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogaHdfcGFyYW1zIGNhbGxiYWNrICovCiBzdGF0aWMgaW50IHNuZF9wMTZ2X3BjbV9od19wYXJhbXNfY2FwdHVyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJCQkgICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKmh3X3BhcmFtcykKIHsKLQlpbnQgcmVzdWx0OwotCXJlc3VsdCA9IHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sCisJcmV0dXJuIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sCiAJCQkJCXBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7Ci0JcmV0dXJuIHJlc3VsdDsKIH0KIAogCiAvKiBod19mcmVlIGNhbGxiYWNrICovCiBzdGF0aWMgaW50IHNuZF9wMTZ2X3BjbV9od19mcmVlX3BsYXliYWNrKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewotCWludCByZXN1bHQ7Ci0JcmVzdWx0ID0gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOwotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIHNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKIH0KIAogLyogaHdfZnJlZSBjYWxsYmFjayAqLwogc3RhdGljIGludCBzbmRfcDE2dl9wY21faHdfZnJlZV9jYXB0dXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewotCWludCByZXN1bHQ7Ci0JcmVzdWx0ID0gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOwotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIHNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKIH0KIAogCkBAIC02MDEsNyArNTkzLDcgQEAKIH0KIAogLyogb3BlcmF0b3JzICovCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9wMTZ2X3BsYXliYWNrX2Zyb250X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3AxNnZfcGxheWJhY2tfZnJvbnRfb3BzID0gewogCS5vcGVuID0gICAgICAgIHNuZF9wMTZ2X3BjbV9vcGVuX3BsYXliYWNrX2Zyb250LAogCS5jbG9zZSA9ICAgICAgIHNuZF9wMTZ2X3BjbV9jbG9zZV9wbGF5YmFjaywKIAkuaW9jdGwgPSAgICAgICBzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTYxMiw3ICs2MDQsNyBAQAogCS5wb2ludGVyID0gICAgIHNuZF9wMTZ2X3BjbV9wb2ludGVyX3BsYXliYWNrLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcDE2dl9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3AxNnZfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPSAgICAgICAgc25kX3AxNnZfcGNtX29wZW5fY2FwdHVyZSwKIAkuY2xvc2UgPSAgICAgICBzbmRfcDE2dl9wY21fY2xvc2VfY2FwdHVyZSwKIAkuaW9jdGwgPSAgICAgICBzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbnMxMzcwLmMgYi9zb3VuZC9wY2kvZW5zMTM3MC5jCmluZGV4IDYyNmNkMjEuLjdlNzYwZmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbnMxMzcwLmMKKysrIGIvc291bmQvcGNpL2VuczEzNzAuYwpAQCAtMTIyNyw3ICsxMjI3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZW5zb25pcV9wbGF5YmFjazFfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZW5zb25pcV9wbGF5YmFjazFfb3BzID0gewogCS5vcGVuID0JCXNuZF9lbnNvbmlxX3BsYXliYWNrMV9vcGVuLAogCS5jbG9zZSA9CXNuZF9lbnNvbmlxX3BsYXliYWNrMV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTEyMzgsNyArMTIzOCw3IEBACiAJLnBvaW50ZXIgPQlzbmRfZW5zb25pcV9wbGF5YmFjazFfcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2Vuc29uaXFfcGxheWJhY2syX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2Vuc29uaXFfcGxheWJhY2syX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfZW5zb25pcV9wbGF5YmFjazJfb3BlbiwKIAkuY2xvc2UgPQlzbmRfZW5zb25pcV9wbGF5YmFjazJfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMjQ5LDcgKzEyNDksNyBAQAogCS5wb2ludGVyID0Jc25kX2Vuc29uaXFfcGxheWJhY2syX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lbnNvbmlxX2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZW5zb25pcV9jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfZW5zb25pcV9jYXB0dXJlX29wZW4sCiAJLmNsb3NlID0Jc25kX2Vuc29uaXFfY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lczE5MzguYyBiL3NvdW5kL3BjaS9lczE5MzguYwppbmRleCA4OTYzZDc2Li42ODEzNTU4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZXMxOTM4LmMKKysrIGIvc291bmQvcGNpL2VzMTkzOC5jCkBAIC05OTIsNyArOTkyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZXMxOTM4X3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2VzMTkzOF9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2VzMTkzOF9wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9CXNuZF9lczE5MzhfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMDAzLDcgKzEwMDMsNyBAQAogCS5wb2ludGVyID0Jc25kX2VzMTkzOF9wbGF5YmFja19wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZXMxOTM4X2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZXMxOTM4X2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0JCXNuZF9lczE5MzhfY2FwdHVyZV9vcGVuLAogCS5jbG9zZSA9CXNuZF9lczE5MzhfY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lczE5NjguYyBiL3NvdW5kL3BjaS9lczE5NjguYwppbmRleCA1MTRmMjYwLi44MTQ2ZmI3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZXMxOTY4LmMKKysrIGIvc291bmQvcGNpL2VzMTk2OC5jCkBAIC0xNjc3LDcgKzE2NzcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lczE5NjhfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZXMxOTY4X3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfZXMxOTY4X3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0Jc25kX2VzMTk2OF9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTE2ODgsNyArMTY4OCw3IEBACiAJLnBvaW50ZXIgPQlzbmRfZXMxOTY4X3BjbV9wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZXMxOTY4X2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZXMxOTY4X2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0JCXNuZF9lczE5NjhfY2FwdHVyZV9vcGVuLAogCS5jbG9zZSA9CXNuZF9lczE5NjhfY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9mbTgwMS5jIGIvc291bmQvcGNpL2ZtODAxLmMKaW5kZXggYmFkZTliOS4uYzQ3Mjg3ZCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ZtODAxLmMKKysrIGIvc291bmQvcGNpL2ZtODAxLmMKQEAgLTY5MSw3ICs2OTEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9mbTgwMV9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9mbTgwMV9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2ZtODAxX3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0Jc25kX2ZtODAxX3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtNzAyLDcgKzcwMiw3IEBACiAJLnBvaW50ZXIgPQlzbmRfZm04MDFfcGxheWJhY2tfcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2ZtODAxX2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZm04MDFfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2ZtODAxX2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPQlzbmRfZm04MDFfY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvbnRyb2xsZXIuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2NvbnRyb2xsZXIuYwppbmRleCAyN2RlODAxLi41MDA4Nzg1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9jb250cm9sbGVyLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfY29udHJvbGxlci5jCkBAIC0yNyw2ICsyNywxMiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpZmRlZiBDT05GSUdfWDg2CisvKiBmb3IgYXJ0LXRzYyBjb252ZXJzaW9uICovCisjaW5jbHVkZSA8YXNtL3RzYy5oPgorI2VuZGlmCisKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgImhkYV9jb250cm9sbGVyLmgiCkBAIC0zMzcsMTIgKzM0MywxNzMgQEAKIAkJCSAgICAgICBhenhfZ2V0X3Bvc2l0aW9uKGNoaXAsIGF6eF9kZXYpKTsKIH0KIAorLyoKKyAqIGF6eF9zY2FsZTY0OiBTY2FsZSBiYXNlIGJ5IG11bHQvZGl2IHdoaWxlIG5vdCBvdmVyZmxvd2luZyBzYW5lbHkKKyAqCisgKiBEZXJpdmVkIGZyb20gc2NhbGU2NF9jaGVja19vdmVyZmxvdyBpbiBrZXJuZWwvdGltZS90aW1la2VlcGluZy5jCisgKgorICogVGhlIHRtZXN0YW1wcyBmb3IgYSA0OEtoeiBzdHJlYW0gY2FuIG92ZXJmbG93IGFmdGVyICgyXjY0LzEwXjkpLzQ4SyB3aGljaAorICogaXMgYWJvdXQgMzg0MzA3IGllIH40LjUgZGF5cy4KKyAqCisgKiBUaGlzIHNjYWxlcyB0aGUgY2FsY3VsYXRpb24gc28gdGhhdCBvdmVyZmxvdyB3aWxsIGhhcHBlbiBidXQgYWZ0ZXIgMl42NCAvCisgKiA0ODAwMCBzZWNzLCB3aGljaCBpcyBwcmV0dHkgbGFyZ2UhCisgKgorICogSW4gY2FsbiBiZWxvdzoKKyAqCWJhc2UgbWF5IG92ZXJmbG93LCBidXQgc2luY2UgdGhlcmUgaXNu4oCZdCBhbnkgYWRkaXRpb25hbCBkaXZpc2lvbgorICoJcGVyZm9ybWVkIG9uIGJhc2UgaXTigJlzIE9LCisgKglyZW0gY2Fu4oCZdCBvdmVyZmxvdyBiZWNhdXNlIGJvdGggYXJlIDMyLWJpdCB2YWx1ZXMKKyAqLworCisjaWZkZWYgQ09ORklHX1g4Ngorc3RhdGljIHU2NCBhenhfc2NhbGU2NCh1NjQgYmFzZSwgdTMyIG51bSwgdTMyIGRlbikKK3sKKwl1NjQgcmVtOworCisJcmVtID0gZG9fZGl2KGJhc2UsIGRlbik7CisKKwliYXNlICo9IG51bTsKKwlyZW0gKj0gbnVtOworCisJZG9fZGl2KHJlbSwgZGVuKTsKKworCXJldHVybiBiYXNlICsgcmVtOworfQorCitzdGF0aWMgaW50IGF6eF9nZXRfc3luY190aW1lKGt0aW1lX3QgKmRldmljZSwKKwkJc3RydWN0IHN5c3RlbV9jb3VudGVydmFsX3QgKnN5c3RlbSwgdm9pZCAqY3R4KQoreworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gY3R4OworCXN0cnVjdCBhenhfZGV2ICphenhfZGV2ID0gZ2V0X2F6eF9kZXYoc3Vic3RyZWFtKTsKKwlzdHJ1Y3QgYXp4X3BjbSAqYXBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzdHJ1Y3QgYXp4ICpjaGlwID0gYXBjbS0+Y2hpcDsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lOworCXU2NCBsbF9jb3VudGVyLCBsbF9jb3VudGVyX2wsIGxsX2NvdW50ZXJfaDsKKwl1NjQgdHNjX2NvdW50ZXIsIHRzY19jb3VudGVyX2wsIHRzY19jb3VudGVyX2g7CisJdTMyIHdhbGxjbGtfY3RyLCB3YWxsY2xrX2N5Y2xlczsKKwlib29sIGRpcmVjdGlvbjsKKwl1MzIgZG1hX3NlbGVjdDsKKwl1MzIgdGltZW91dCA9IDIwMDsKKwl1MzIgcmV0cnlfY291bnQgPSAwOworCisJcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlkaXJlY3Rpb24gPSAxOworCWVsc2UKKwkJZGlyZWN0aW9uID0gMDsKKworCS8qIDB0aCBzdHJlYW0gdGFnIGlzIG5vdCB1c2VkLCBzbyBETUEgY2ggMCBpcyBmb3IgMXN0IHN0cmVhbSB0YWcgKi8KKwlkbyB7CisJCXRpbWVvdXQgPSAxMDA7CisJCWRtYV9zZWxlY3QgPSAoZGlyZWN0aW9uIDw8IEdUU0NDX0NETUFTX0RNQV9ESVJfU0hJRlQpIHwKKwkJCQkJKGF6eF9kZXYtPmNvcmUuc3RyZWFtX3RhZyAtIDEpOworCQlzbmRfaGRhY19jaGlwX3dyaXRlbChhenhfYnVzKGNoaXApLCBHVFNDQywgZG1hX3NlbGVjdCk7CisKKwkJLyogRW5hYmxlIHRoZSBjYXB0dXJlICovCisJCXNuZF9oZGFjX2NoaXBfdXBkYXRlbChhenhfYnVzKGNoaXApLCBHVFNDQywgMCwgR1RTQ0NfVFNDQ0lfTUFTSyk7CisKKwkJd2hpbGUgKHRpbWVvdXQpIHsKKwkJCWlmIChzbmRfaGRhY19jaGlwX3JlYWRsKGF6eF9idXMoY2hpcCksIEdUU0NDKSAmCisJCQkJCQlHVFNDQ19UU0NDRF9NQVNLKQorCQkJCWJyZWFrOworCisJCQl0aW1lb3V0LS07CisJCX0KKworCQlpZiAoIXRpbWVvdXQpIHsKKwkJCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiR1RTQ0MgY2FwdHVyZSBUaW1lZG91dCFcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQkvKiBSZWFkIHdhbGwgY2xvY2sgY291bnRlciAqLworCQl3YWxsY2xrX2N0ciA9IHNuZF9oZGFjX2NoaXBfcmVhZGwoYXp4X2J1cyhjaGlwKSwgV0FMRkNDKTsKKworCQkvKiBSZWFkIFRTQyBjb3VudGVyICovCisJCXRzY19jb3VudGVyX2wgPSBzbmRfaGRhY19jaGlwX3JlYWRsKGF6eF9idXMoY2hpcCksIFRTQ0NMKTsKKwkJdHNjX2NvdW50ZXJfaCA9IHNuZF9oZGFjX2NoaXBfcmVhZGwoYXp4X2J1cyhjaGlwKSwgVFNDQ1UpOworCisJCS8qIFJlYWQgTGluayBjb3VudGVyICovCisJCWxsX2NvdW50ZXJfbCA9IHNuZF9oZGFjX2NoaXBfcmVhZGwoYXp4X2J1cyhjaGlwKSwgTExQQ0wpOworCQlsbF9jb3VudGVyX2ggPSBzbmRfaGRhY19jaGlwX3JlYWRsKGF6eF9idXMoY2hpcCksIExMUENVKTsKKworCQkvKiBBY2s6IHJlZ2lzdGVycyByZWFkIGRvbmUgKi8KKwkJc25kX2hkYWNfY2hpcF93cml0ZWwoYXp4X2J1cyhjaGlwKSwgR1RTQ0MsIEdUU0NDX1RTQ0NEX1NISUZUKTsKKworCQl0c2NfY291bnRlciA9ICh0c2NfY291bnRlcl9oIDw8IFRTQ0NVX0NDVV9TSElGVCkgfAorCQkJCQkJdHNjX2NvdW50ZXJfbDsKKworCQlsbF9jb3VudGVyID0gKGxsX2NvdW50ZXJfaCA8PCBMTFBDX0NDVV9TSElGVCkgfAlsbF9jb3VudGVyX2w7CisJCXdhbGxjbGtfY3ljbGVzID0gd2FsbGNsa19jdHIgJiBXQUxGQ0NfQ0lGX01BU0s7CisKKwkJLyoKKwkJICogQW4gZXJyb3Igb2NjdXJzIG5lYXIgZnJhbWUgInJvbGxvdmVyIi4gVGhlIGNsb2NrcyBpbgorCQkgKiBmcmFtZSB2YWx1ZSBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGVycm9yIG1heSBoYXZlCisJCSAqIG9jY3VycmVkLiBIZXJlIHdlIHVzZSB0aGUgdmFsdWUgb2YgMTAgaS5lLiwKKwkJICogSERBX01BWF9DWUNMRV9PRkZTRVQKKwkJICovCisJCWlmICh3YWxsY2xrX2N5Y2xlcyA8IEhEQV9NQVhfQ1lDTEVfVkFMVUUgLSBIREFfTUFYX0NZQ0xFX09GRlNFVAorCQkJCQkmJiB3YWxsY2xrX2N5Y2xlcyA+IEhEQV9NQVhfQ1lDTEVfT0ZGU0VUKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogU2xlZXAgYmVmb3JlIHdlIHJlYWQgYWdhaW4sIGVsc2Ugd2UgbWF5IGFnYWluIGdldAorCQkgKiB2YWx1ZSBuZWFyIHRvIE1BWF9DWUNMRS4gVHJ5IHRvIHNsZWVwIGZvciBkaWZmZXJlbnQKKwkJICogYW1vdW50IG9mIHRpbWUgc28gd2UgZG9udCBoaXQgdGhlIHNhbWUgbnVtYmVyIGFnYWluCisJCSAqLworCQl1ZGVsYXkocmV0cnlfY291bnQrKyk7CisKKwl9IHdoaWxlIChyZXRyeV9jb3VudCAhPSBIREFfTUFYX0NZQ0xFX1JFQURfUkVUUlkpOworCisJaWYgKHJldHJ5X2NvdW50ID09IEhEQV9NQVhfQ1lDTEVfUkVBRF9SRVRSWSkgeworCQlkZXZfZXJyX3JhdGVsaW1pdGVkKGNoaXAtPmNhcmQtPmRldiwKKwkJCSJFcnJvciBpbiBXQUxGQ0MgY3ljbGUgY291bnRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkqZGV2aWNlID0gbnNfdG9fa3RpbWUoYXp4X3NjYWxlNjQobGxfY291bnRlciwKKwkJCQlOU0VDX1BFUl9TRUMsIHJ1bnRpbWUtPnJhdGUpKTsKKwkqZGV2aWNlID0ga3RpbWVfYWRkX25zKCpkZXZpY2UsICh3YWxsY2xrX2N5Y2xlcyAqIE5TRUNfUEVSX1NFQykgLworCQkJICAgICAgICgoSERBX01BWF9DWUNMRV9WQUxVRSArIDEpICogcnVudGltZS0+cmF0ZSkpOworCisJKnN5c3RlbSA9IGNvbnZlcnRfYXJ0X3RvX3RzYyh0c2NfY291bnRlcik7CisKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKK3N0YXRpYyBpbnQgYXp4X2dldF9zeW5jX3RpbWUoa3RpbWVfdCAqZGV2aWNlLAorCQlzdHJ1Y3Qgc3lzdGVtX2NvdW50ZXJ2YWxfdCAqc3lzdGVtLCB2b2lkICpjdHgpCit7CisJcmV0dXJuIC1FTlhJTzsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGF6eF9nZXRfY3Jvc3N0c3RhbXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICAgICBzdHJ1Y3Qgc3lzdGVtX2RldmljZV9jcm9zc3RzdGFtcCAqeHRzdGFtcCkKK3sKKwlyZXR1cm4gZ2V0X2RldmljZV9zeXN0ZW1fY3Jvc3N0c3RhbXAoYXp4X2dldF9zeW5jX3RpbWUsCisJCQkJCXN1YnN0cmVhbSwgTlVMTCwgeHRzdGFtcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19saW5rX3RpbWVfc3VwcG9ydGVkKHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUsCisJCQkJc3RydWN0IHNuZF9wY21fYXVkaW9fdHN0YW1wX2NvbmZpZyAqdHMpCit7CisJaWYgKHJ1bnRpbWUtPmh3LmluZm8gJiBTTkRSVl9QQ01fSU5GT19IQVNfTElOS19TWU5DSFJPTklaRURfQVRJTUUpCisJCWlmICh0cy0+dHlwZV9yZXF1ZXN0ZWQgPT0gU05EUlZfUENNX0FVRElPX1RTVEFNUF9UWVBFX0xJTktfU1lOQ0hST05JWkVEKQorCQkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKIHN0YXRpYyBpbnQgYXp4X2dldF90aW1lX2luZm8oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQlzdHJ1Y3QgdGltZXNwZWMgKnN5c3RlbV90cywgc3RydWN0IHRpbWVzcGVjICphdWRpb190cywKIAkJCXN0cnVjdCBzbmRfcGNtX2F1ZGlvX3RzdGFtcF9jb25maWcgKmF1ZGlvX3RzdGFtcF9jb25maWcsCiAJCQlzdHJ1Y3Qgc25kX3BjbV9hdWRpb190c3RhbXBfcmVwb3J0ICphdWRpb190c3RhbXBfcmVwb3J0KQogewogCXN0cnVjdCBhenhfZGV2ICphenhfZGV2ID0gZ2V0X2F6eF9kZXYoc3Vic3RyZWFtKTsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBzeXN0ZW1fZGV2aWNlX2Nyb3NzdHN0YW1wIHh0c3RhbXA7CisJaW50IHJldDsKIAl1NjQgbnNlYzsKIAogCWlmICgoc3Vic3RyZWFtLT5ydW50aW1lLT5ody5pbmZvICYgU05EUlZfUENNX0lORk9fSEFTX0xJTktfQVRJTUUpICYmCkBAIC0zNjEsOCArNTI4LDM3IEBACiAJCWF1ZGlvX3RzdGFtcF9yZXBvcnQtPmFjY3VyYWN5X3JlcG9ydCA9IDE7IC8qIHJlc3Qgb2Ygc3RydWN0dXJlIGlzIHZhbGlkICovCiAJCWF1ZGlvX3RzdGFtcF9yZXBvcnQtPmFjY3VyYWN5ID0gNDI7IC8qIDI0IE1IeiBXYWxsQ2xvY2sgPT0gNDJucyByZXNvbHV0aW9uICovCiAKLQl9IGVsc2UKKwl9IGVsc2UgaWYgKGlzX2xpbmtfdGltZV9zdXBwb3J0ZWQocnVudGltZSwgYXVkaW9fdHN0YW1wX2NvbmZpZykpIHsKKworCQlyZXQgPSBhenhfZ2V0X2Nyb3NzdHN0YW1wKHN1YnN0cmVhbSwgJnh0c3RhbXApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlzd2l0Y2ggKHJ1bnRpbWUtPnRzdGFtcF90eXBlKSB7CisJCWNhc2UgU05EUlZfUENNX1RTVEFNUF9UWVBFX01PTk9UT05JQzoKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWNhc2UgU05EUlZfUENNX1RTVEFNUF9UWVBFX01PTk9UT05JQ19SQVc6CisJCQkqc3lzdGVtX3RzID0ga3RpbWVfdG9fdGltZXNwZWMoeHRzdGFtcC5zeXNfbW9ub3Jhdyk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJKnN5c3RlbV90cyA9IGt0aW1lX3RvX3RpbWVzcGVjKHh0c3RhbXAuc3lzX3JlYWx0aW1lKTsKKwkJCWJyZWFrOworCisJCX0KKworCQkqYXVkaW9fdHMgPSBrdGltZV90b190aW1lc3BlYyh4dHN0YW1wLmRldmljZSk7CisKKwkJYXVkaW9fdHN0YW1wX3JlcG9ydC0+YWN0dWFsX3R5cGUgPQorCQkJU05EUlZfUENNX0FVRElPX1RTVEFNUF9UWVBFX0xJTktfU1lOQ0hST05JWkVEOworCQlhdWRpb190c3RhbXBfcmVwb3J0LT5hY2N1cmFjeV9yZXBvcnQgPSAxOworCQkvKiAyNCBNSHogV2FsbENsb2NrID09IDQybnMgcmVzb2x1dGlvbiAqLworCQlhdWRpb190c3RhbXBfcmVwb3J0LT5hY2N1cmFjeSA9IDQyOworCisJfSBlbHNlIHsKIAkJYXVkaW9fdHN0YW1wX3JlcG9ydC0+YWN0dWFsX3R5cGUgPSBTTkRSVl9QQ01fQVVESU9fVFNUQU1QX1RZUEVfREVGQVVMVDsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQxMiw2ICs2MDgsMTEgQEAKIAkJZ290byB1bmxvY2s7CiAJfQogCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IGF6eF9kZXY7CisKKwlpZiAoY2hpcC0+Z3RzX3ByZXNlbnQpCisJCWF6eF9wY21faHcuaW5mbyA9IGF6eF9wY21faHcuaW5mbyB8CisJCQlTTkRSVl9QQ01fSU5GT19IQVNfTElOS19TWU5DSFJPTklaRURfQVRJTUU7CisKIAlydW50aW1lLT5odyA9IGF6eF9wY21faHc7CiAJcnVudGltZS0+aHcuY2hhbm5lbHNfbWluID0gaGluZm8tPmNoYW5uZWxzX21pbjsKIAlydW50aW1lLT5ody5jaGFubmVsc19tYXggPSBoaW5mby0+Y2hhbm5lbHNfbWF4OwpAQCAtNDk1LDcgKzY5Niw3IEBACiAJcmV0dXJuIHNuZF9wY21fbGliX2RlZmF1bHRfbW1hcChzdWJzdHJlYW0sIGFyZWEpOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIGF6eF9wY21fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBhenhfcGNtX29wcyA9IHsKIAkub3BlbiA9IGF6eF9wY21fb3BlbiwKIAkuY2xvc2UgPSBhenhfcGNtX2Nsb3NlLAogCS5pb2N0bCA9IHNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfY29udHJvbGxlci5oIGIvc291bmQvcGNpL2hkYS9oZGFfY29udHJvbGxlci5oCmluZGV4IGVjNjNiYmYuLmE1MGUwNTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvbnRyb2xsZXIuaAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb250cm9sbGVyLmgKQEAgLTE1OSw2ICsxNTksOSBAQAogCXVuc2lnbmVkIGludCByZWdpb25fcmVxdWVzdGVkOjE7CiAJdW5zaWduZWQgaW50IGRpc2FibGVkOjE7IC8qIGRpc2FibGVkIGJ5IHZnYV9zd2l0Y2hlcm9vICovCiAKKwkvKiBHVFMgcHJlc2VudCAqLworCXVuc2lnbmVkIGludCBndHNfcHJlc2VudDoxOworCiAjaWZkZWYgQ09ORklHX1NORF9IREFfRFNQX0xPQURFUgogCXN0cnVjdCBhenhfZGV2IHNhdmVkX2F6eF9kZXY7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCmluZGV4IDE2MGM3ZjcuLmMzNDY5ZjcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYwpAQCAtNTQsNiArNTQsNyBAQAogLyogZm9yIHNub29wIGNvbnRyb2wgKi8KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KICNlbmRpZgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CkBAIC0xNjYzLDYgKzE2NjQsMjIgQEAKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKKwlpZiAoSVNfU0tMX1BMVVMocGNpKSkKKwkJc25kX2hkYWNfYnVzX3BhcnNlX2NhcGFiaWxpdGllcyhidXMpOworCisJLyoKKwkgKiBTb21lIEludGVsIENQVXMgaGFzIGFsd2F5cyBydW5uaW5nIHRpbWVyIChBUlQpIGZlYXR1cmUgYW5kCisJICogY29udHJvbGxlciBtYXkgaGF2ZSBHbG9iYWwgdGltZSBzeW5jIHJlcG9ydGluZyBjYXBhYmlsaXR5LCBzbworCSAqIGNoZWNrIGJvdGggb2YgdGhlc2UgYmVmb3JlIGRlY2xhcmluZyBzeW5jaHJvbml6ZWQgdGltZSByZXBvcnRpbmcKKwkgKiBjYXBhYmlsaXR5IFNORFJWX1BDTV9JTkZPX0hBU19MSU5LX1NZTkNIUk9OSVpFRF9BVElNRQorCSAqLworCWNoaXAtPmd0c19wcmVzZW50ID0gZmFsc2U7CisKKyNpZmRlZiBDT05GSUdfWDg2CisJaWYgKGJ1cy0+cHBjYXAgJiYgYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0FSVCkpCisJCWNoaXAtPmd0c19wcmVzZW50ID0gdHJ1ZTsKKyNlbmRpZgorCiAJaWYgKGNoaXAtPm1zaSkgewogCQlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfTk9fTVNJNjQpIHsKIAkJCWRldl9kYmcoY2FyZC0+ZGV2LCAiRGlzYWJsaW5nIDY0Yml0IE1TSVxuIik7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NhMDEzMi5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jYTAxMzIuYwppbmRleCA5Y2ViMmJjLi5hZDA2ODY2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NhMDEzMi5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2EwMTMyLmMKQEAgLTQwMTgsNyArNDAxOCw3IEBACiAvKgogICogUENNCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gY2EwMTMyX3BjbV9hbmFsb2dfcGxheWJhY2sgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIGNhMDEzMl9wY21fYW5hbG9nX3BsYXliYWNrID0gewogCS5zdWJzdHJlYW1zID0gMSwKIAkuY2hhbm5lbHNfbWluID0gMiwKIAkuY2hhbm5lbHNfbWF4ID0gNiwKQEAgLTQwMjksNyArNDAyOSw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gY2EwMTMyX3BjbV9hbmFsb2dfY2FwdHVyZSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gY2EwMTMyX3BjbV9hbmFsb2dfY2FwdHVyZSA9IHsKIAkuc3Vic3RyZWFtcyA9IDEsCiAJLmNoYW5uZWxzX21pbiA9IDIsCiAJLmNoYW5uZWxzX21heCA9IDIsCkBAIC00MDQwLDcgKzQwNDAsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IGhkYV9wY21fc3RyZWFtIGNhMDEzMl9wY21fZGlnaXRhbF9wbGF5YmFjayA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gY2EwMTMyX3BjbV9kaWdpdGFsX3BsYXliYWNrID0gewogCS5zdWJzdHJlYW1zID0gMSwKIAkuY2hhbm5lbHNfbWluID0gMiwKIAkuY2hhbm5lbHNfbWF4ID0gMiwKQEAgLTQwNTIsNyArNDA1Miw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gY2EwMTMyX3BjbV9kaWdpdGFsX2NhcHR1cmUgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIGNhMDEzMl9wY21fZGlnaXRhbF9jYXB0dXJlID0gewogCS5zdWJzdHJlYW1zID0gMSwKIAkuY2hhbm5lbHNfbWluID0gMiwKIAkuY2hhbm5lbHNfbWF4ID0gMiwKQEAgLTQ2MTQsNyArNDYxNCw3IEBACiAJa2ZyZWUoY29kZWMtPnNwZWMpOwogfQogCi1zdGF0aWMgc3RydWN0IGhkYV9jb2RlY19vcHMgY2EwMTMyX3BhdGNoX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NvZGVjX29wcyBjYTAxMzJfcGF0Y2hfb3BzID0gewogCS5idWlsZF9jb250cm9scyA9IGNhMDEzMl9idWlsZF9jb250cm9scywKIAkuYnVpbGRfcGNtcyA9IGNhMDEzMl9idWlsZF9wY21zLAogCS5pbml0ID0gY2EwMTMyX2luaXQsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMKaW5kZXggNTZmZWZiZC4uZWQ2Mjc0OCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9jb25leGFudC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY29uZXhhbnQuYwpAQCAtMjYxLDYgKzI2MSw3IEBACiAJQ1hUX0ZJWFVQX0hQXzUzMCwKIAlDWFRfRklYVVBfQ0FQX01JWF9BTVBfNTA0NywKIAlDWFRfRklYVVBfTVVURV9MRURfRUFQRCwKKwlDWFRfRklYVVBfSFBfU1BFQ1RSRSwKIH07CiAKIC8qIGZvciBoZGFfZml4dXBfdGhpbmtwYWRfYWNwaSgpICovCkBAIC03NjUsNiArNzY2LDE0IEBACiAJCS50eXBlID0gSERBX0ZJWFVQX0ZVTkMsCiAJCS52LmZ1bmMgPSBjeHRfZml4dXBfbXV0ZV9sZWRfZWFwZCwKIAl9LAorCVtDWFRfRklYVVBfSFBfU1BFQ1RSRV0gPSB7CisJCS50eXBlID0gSERBX0ZJWFVQX1BJTlMsCisJCS52LnBpbnMgPSAoY29uc3Qgc3RydWN0IGhkYV9waW50YmxbXSkgeworCQkJLyogZW5hYmxlIE5JRCAweDFkIGZvciB0aGUgc3BlYWtlciBvbiB0b3AgKi8KKwkJCXsgMHgxZCwgMHg5MTE3MDExMSB9LAorCQkJeyB9CisJCX0KKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrIGN4dDUwNDVfZml4dXBzW10gPSB7CkBAIC04MTQsNiArODIzLDcgQEAKIAlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwNTQzLCAiQWNlciBBc3BpcmUgT25lIDUyMiIsIENYVF9GSVhVUF9TVEVSRU9fRE1JQyksCiAJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDU0YywgIkFjZXIgQXNwaXJlIDM4MzBURyIsIENYVF9GSVhVUF9BU1BJUkVfRE1JQyksCiAJU05EX1BDSV9RVUlSSygweDEwMjUsIDB4MDU0ZiwgIkFjZXIgQXNwaXJlIDQ4MzBUIiwgQ1hUX0ZJWFVQX0FTUElSRV9ETUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHg4MTc0LCAiSFAgU3BlY3RyZSB4MzYwIiwgQ1hUX0ZJWFVQX0hQX1NQRUNUUkUpLAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzOGQsICJBc3VzIiwgQ1hUX0ZJWFVQX0hFQURQSE9ORV9NSUNfUElOKSwKIAlTTkRfUENJX1FVSVJLKDB4MTUyZCwgMHgwODMzLCAiT0xQQyBYTy0xLjUiLCBDWFRfRklYVVBfT0xQQ19YTyksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MjBmMiwgIkxlbm92byBUNDAwIiwgQ1hUX1BJTkNGR19MRU5PVk9fVFA0MTApLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYwppbmRleCA1NzRiMWI0Li5iNThlOGM3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYwpAQCAtNDgyOCw3ICs0ODI4LDcgQEAKIAlBTEMyOTNfRklYVVBfREVMTDFfTUlDX05PX1BSRVNFTkNFLAogCUFMQzI5Ml9GSVhVUF9UUFQ0NDBfRE9DSywKIAlBTEMyOTJfRklYVVBfVFBUNDQwLAotCUFMQzI4M19GSVhVUF9CWEJUMjgwN19NSUMsCisJQUxDMjgzX0ZJWFVQX0hFQURTRVRfTUlDLAogCUFMQzI1NV9GSVhVUF9ERUxMX1dNSV9NSUNfTVVURV9MRUQsCiAJQUxDMjgyX0ZJWFVQX0FTUElSRV9WNV9QSU5TLAogCUFMQzI4MF9GSVhVUF9IUF9HUElPNCwKQEAgLTQ4NTUsNiArNDg1NSw3IEBACiAJQUxDMjIxX0ZJWFVQX0hQX0ZST05UX01JQywKIAlBTEMyOTJfRklYVVBfVFBUNDYwLAogCUFMQzI5OF9GSVhVUF9TUEtfVk9MVU1FLAorCUFMQzI1Nl9GSVhVUF9ERUxMX0lOU1BJUk9OXzc1NTlfU1VCV09PRkVSLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfZml4dXAgYWxjMjY5X2ZpeHVwc1tdID0gewpAQCAtNTI2Myw2ICs1MjY0LDggQEAKIAlbQUxDMjY5X0ZJWFVQX1RISU5LUEFEX0FDUEldID0gewogCQkudHlwZSA9IEhEQV9GSVhVUF9GVU5DLAogCQkudi5mdW5jID0gaGRhX2ZpeHVwX3RoaW5rcGFkX2FjcGksCisJCS5jaGFpbmVkID0gdHJ1ZSwKKwkJLmNoYWluX2lkID0gQUxDMjY5X0ZJWFVQX1NLVV9JR05PUkUsCiAJfSwKIAlbQUxDMjY5X0ZJWFVQX0RNSUNfVEhJTktQQURfQUNQSV0gPSB7CiAJCS50eXBlID0gSERBX0ZJWFVQX0ZVTkMsCkBAIC01MzIxLDcgKzUzMjQsNyBAQAogCQkuY2hhaW5lZCA9IHRydWUsCiAJCS5jaGFpbl9pZCA9IEFMQzI5Ml9GSVhVUF9UUFQ0NDBfRE9DSywKIAl9LAotCVtBTEMyODNfRklYVVBfQlhCVDI4MDdfTUlDXSA9IHsKKwlbQUxDMjgzX0ZJWFVQX0hFQURTRVRfTUlDXSA9IHsKIAkJLnR5cGUgPSBIREFfRklYVVBfUElOUywKIAkJLnYucGlucyA9IChjb25zdCBzdHJ1Y3QgaGRhX3BpbnRibFtdKSB7CiAJCQl7IDB4MTksIDB4MDRhMTEwZjAgfSwKQEAgLTU1MTYsNiArNTUxOSwxNSBAQAogCQkuY2hhaW5lZCA9IHRydWUsCiAJCS5jaGFpbl9pZCA9IEFMQzI5OF9GSVhVUF9ERUxMMV9NSUNfTk9fUFJFU0VOQ0UsCiAJfSwKKwlbQUxDMjU2X0ZJWFVQX0RFTExfSU5TUElST05fNzU1OV9TVUJXT09GRVJdID0geworCQkudHlwZSA9IEhEQV9GSVhVUF9QSU5TLAorCQkudi5waW5zID0gKGNvbnN0IHN0cnVjdCBoZGFfcGludGJsW10pIHsKKwkJCXsgMHgxYiwgMHg5MDE3MDE1MSB9LAorCQkJeyB9CisJCX0sCisJCS5jaGFpbmVkID0gdHJ1ZSwKKwkJLmNoYWluX2lkID0gQUxDMjU1X0ZJWFVQX0RFTEwxX01JQ19OT19QUkVTRU5DRQorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjMjY5X2ZpeHVwX3RibFtdID0gewpAQCAtNTU2MCw2ICs1NTcyLDcgQEAKIAlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwNmRmLCAiRGVsbCIsIEFMQzI5M19GSVhVUF9ESVNBQkxFX0FBTUlYX01VTFRJSkFDSyksCiAJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDZlMCwgIkRlbGwiLCBBTEMyOTNfRklYVVBfRElTQUJMRV9BQU1JWF9NVUxUSUpBQ0spLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA3MDQsICJEZWxsIFhQUyAxMyA5MzUwIiwgQUxDMjU2X0ZJWFVQX0RFTExfWFBTXzEzX0hFQURQSE9ORV9OT0lTRSksCisJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDcwNiwgIkRlbGwgSW5zcGlyb24gNzU1OSIsIEFMQzI1Nl9GSVhVUF9ERUxMX0lOU1BJUk9OXzc1NTlfU1VCV09PRkVSKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwNzI1LCAiRGVsbCBJbnNwaXJvbiAzMTYyIiwgQUxDMjU1X0ZJWFVQX0RFTExfU1BLX05PSVNFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwNzViLCAiRGVsbCBYUFMgMTMgOTM2MCIsIEFMQzI1Nl9GSVhVUF9ERUxMX1hQU18xM19IRUFEUEhPTkVfTk9JU0UpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA3NWQsICJEZWxsIEFJTyIsIEFMQzI5OF9GSVhVUF9TUEtfVk9MVU1FKSwKQEAgLTU2NTEsNyArNTY2NCw4IEBACiAJU05EX1BDSV9RVUlSSygweDEwY2YsIDB4MTc1NywgIkxpZmVib29rIEU3NTIiLCBBTEMyNjlfRklYVVBfTElGRUJPT0tfSFBfUElOKSwKIAlTTkRfUENJX1FVSVJLKDB4MTBjZiwgMHgxODQ1LCAiTGlmZWJvb2sgVTkwNCIsIEFMQzI2OV9GSVhVUF9MSUZFQk9PS19FWFRNSUMpLAogCVNORF9QQ0lfUVVJUksoMHgxNDRkLCAweGMxMDksICJTYW1zdW5nIEF0aXYgYm9vayA5IChOUDkwMFgzRykiLCBBTEMyNjlfRklYVVBfSU5WX0RNSUMpLAotCVNORF9QQ0lfUVVJUksoMHgxNDU4LCAweGZhNTMsICJHaWdhYnl0ZSBCWEJULTI4MDciLCBBTEMyODNfRklYVVBfQlhCVDI4MDdfTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ1OCwgMHhmYTUzLCAiR2lnYWJ5dGUgQlhCVC0yODA3IiwgQUxDMjgzX0ZJWFVQX0hFQURTRVRfTUlDKSwKKwlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHhiMTIwLCAiTVNJIEN1YmkgTVMtQjEyMCIsIEFMQzI4M19GSVhVUF9IRUFEU0VUX01JQyksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MjBmMiwgIlRoaW5rcGFkIFNMNDEwLzUxMCIsIEFMQzI2OV9GSVhVUF9TS1VfSUdOT1JFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMTVlLCAiVGhpbmtwYWQgTDUxMiIsIEFMQzI2OV9GSVhVUF9TS1VfSUdOT1JFKSwKIAlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMWI4LCAiVGhpbmtwYWQgRWRnZSAxNCIsIEFMQzI2OV9GSVhVUF9TS1VfSUdOT1JFKSwKQEAgLTU3OTQsNiArNTgwOCwxMyBAQAogCXsweDE0LCAweDkwMTcwMTEwfSwgXAogCXsweDE1LCAweDAyMjE0MDFmfQogCisjZGVmaW5lIEFMQzI5NV9TVEFOREFSRF9QSU5TIFwKKwl7MHgxMiwgMHhiN2E2MDEzMH0sIFwKKwl7MHgxNCwgMHg5MDE3MDExMH0sIFwKKwl7MHgxNywgMHgyMTAxNDAyMH0sIFwKKwl7MHgxOCwgMHgyMWExOTAzMH0sIFwKKwl7MHgyMSwgMHgwNDIxMTAyMH0KKwogI2RlZmluZSBBTEMyOThfU1RBTkRBUkRfUElOUyBcCiAJezB4MTIsIDB4OTBhNjAxMzB9LCBcCiAJezB4MjEsIDB4MDMyMTEwMjB9CkBAIC01ODM0LDYgKzU4NTUsMTAgQEAKIAkJezB4MTQsIDB4OTAxNzAxMjB9LAogCQl7MHgyMSwgMHgwMjIxMTAzMH0pLAogCVNORF9IREFfUElOX1FVSVJLKDB4MTBlYzAyNTUsIDB4MTAyOCwgIkRlbGwiLCBBTEMyNTVfRklYVVBfREVMTDFfTUlDX05PX1BSRVNFTkNFLAorCQl7MHgxNCwgMHg5MDE3MDExMH0sCisJCXsweDFiLCAweDAyMDExMDIwfSwKKwkJezB4MjEsIDB4MDIyMTEwMWZ9KSwKKwlTTkRfSERBX1BJTl9RVUlSSygweDEwZWMwMjU1LCAweDEwMjgsICJEZWxsIiwgQUxDMjU1X0ZJWFVQX0RFTEwxX01JQ19OT19QUkVTRU5DRSwKIAkJezB4MTQsIDB4OTAxNzAxMzB9LAogCQl7MHgxYiwgMHgwMTAxNDAyMH0sCiAJCXsweDIxLCAweDAyMjExMDNmfSksCkBAIC01ODk0LDYgKzU5MTksMTQgQEAKIAkJezB4MTIsIDB4OTBhNjAxNzB9LAogCQl7MHgxNCwgMHg5MDE3MDEyMH0sCiAJCXsweDIxLCAweDAyMjExMDMwfSksCisJU05EX0hEQV9QSU5fUVVJUksoMHgxMGVjMDI1NiwgMHgxMDI4LCAiRGVsbCBJbnNwaXJvbiA1NDY4IiwgQUxDMjU1X0ZJWFVQX0RFTEwxX01JQ19OT19QUkVTRU5DRSwKKwkJezB4MTIsIDB4OTBhNjAxODB9LAorCQl7MHgxNCwgMHg5MDE3MDEyMH0sCisJCXsweDIxLCAweDAyMjExMDMwfSksCisJU05EX0hEQV9QSU5fUVVJUksoMHgxMGVjMDI1NiwgMHgxMDI4LCAiRGVsbCIsIEFMQzI1NV9GSVhVUF9ERUxMMV9NSUNfTk9fUFJFU0VOQ0UsCisJCXsweDEyLCAweGI3YTYwMTMwfSwKKwkJezB4MTQsIDB4OTAxNzAxMTB9LAorCQl7MHgyMSwgMHgwMjIxMTAyMH0pLAogCVNORF9IREFfUElOX1FVSVJLKDB4MTBlYzAyNTYsIDB4MTAyOCwgIkRlbGwiLCBBTEMyNTVfRklYVVBfREVMTDFfTUlDX05PX1BSRVNFTkNFLAogCQlBTEMyNTZfU1RBTkRBUkRfUElOUyksCiAJU05EX0hEQV9QSU5fUVVJUksoMHgxMGVjMDI4MCwgMHgxMDNjLCAiSFAiLCBBTEMyODBfRklYVVBfSFBfR1BJTzQsCkBAIC02MDA1LDYgKzYwMzgsOCBAQAogCVNORF9IREFfUElOX1FVSVJLKDB4MTBlYzAyOTMsIDB4MTAyOCwgIkRlbGwiLCBBTEMyOTNfRklYVVBfREVMTDFfTUlDX05PX1BSRVNFTkNFLAogCQlBTEMyOTJfU1RBTkRBUkRfUElOUywKIAkJezB4MTMsIDB4OTBhNjAxNDB9KSwKKwlTTkRfSERBX1BJTl9RVUlSSygweDEwZWMwMjk1LCAweDEwMjgsICJEZWxsIiwgQUxDMjY5X0ZJWFVQX0RFTEwxX01JQ19OT19QUkVTRU5DRSwKKwkJQUxDMjk1X1NUQU5EQVJEX1BJTlMpLAogCVNORF9IREFfUElOX1FVSVJLKDB4MTBlYzAyOTgsIDB4MTAyOCwgIkRlbGwiLCBBTEMyOThfRklYVVBfREVMTDFfTUlDX05PX1BSRVNFTkNFLAogCQlBTEMyOThfU1RBTkRBUkRfUElOUywKIAkJezB4MTcsIDB4OTAxNzAxMTB9KSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuYwppbmRleCA4YWUzYmI3Li5iNGFhNGMxIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5jCkBAIC04NDcsNyArODQ3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfaWNlMTcxMl9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9pY2UxNzEyX3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfaWNlMTcxMl9wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9CXNuZF9pY2UxNzEyX3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtODU4LDcgKzg1OCw3IEBACiAJLnBvaW50ZXIgPQlzbmRfaWNlMTcxMl9wbGF5YmFja19wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfaWNlMTcxMl9wbGF5YmFja19kc19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9pY2UxNzEyX3BsYXliYWNrX2RzX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfaWNlMTcxMl9wbGF5YmFja19kc19vcGVuLAogCS5jbG9zZSA9CXNuZF9pY2UxNzEyX3BsYXliYWNrX2RzX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtODY5LDcgKzg2OSw3IEBACiAJLnBvaW50ZXIgPQlzbmRfaWNlMTcxMl9wbGF5YmFja19kc19wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfaWNlMTcxMl9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2ljZTE3MTJfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2ljZTE3MTJfY2FwdHVyZV9vcGVuLAogCS5jbG9zZSA9CXNuZF9pY2UxNzEyX2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMjI4LDcgKzEyMjgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9pY2UxNzEyX3BsYXliYWNrX3Byb19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9pY2UxNzEyX3BsYXliYWNrX3Byb19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2ljZTE3MTJfcGxheWJhY2tfcHJvX29wZW4sCiAJLmNsb3NlID0Jc25kX2ljZTE3MTJfcGxheWJhY2tfcHJvX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTIzOSw3ICsxMjM5LDcgQEAKIAkucG9pbnRlciA9CXNuZF9pY2UxNzEyX3BsYXliYWNrX3Byb19wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfaWNlMTcxMl9jYXB0dXJlX3Byb19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9pY2UxNzEyX2NhcHR1cmVfcHJvX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfaWNlMTcxMl9jYXB0dXJlX3Byb19vcGVuLAogCS5jbG9zZSA9CXNuZF9pY2UxNzEyX2NhcHR1cmVfcHJvX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcyNC5jIGIvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcyNC5jCmluZGV4IDBiMjJjMDAuLmU1YzUyZWQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MjQuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzI0LmMKQEAgLTYyMCw5ICs2MjAsNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IHN0ZGNsb2NrX2dldF9yYXRlKHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlKQogewotCXVuc2lnbmVkIGludCByYXRlOwotCXJhdGUgPSBzdGRjbG9ja19yYXRlX2xpc3RbaW5iKElDRU1UMTcyNChpY2UsIFJBVEUpKSAmIDE1XTsKLQlyZXR1cm4gcmF0ZTsKKwlyZXR1cm4gc3RkY2xvY2tfcmF0ZV9saXN0W2luYihJQ0VNVDE3MjQoaWNlLCBSQVRFKSkgJiAxNV07CiB9CiAKIHN0YXRpYyB2b2lkIHN0ZGNsb2NrX3NldF9yYXRlKHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlLCB1bnNpZ25lZCBpbnQgcmF0ZSkKQEAgLTExMTMsNyArMTExMSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3Z0MTcyNF9wbGF5YmFja19wcm9fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdnQxNzI0X3BsYXliYWNrX3Byb19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3Z0MTcyNF9wbGF5YmFja19wcm9fb3BlbiwKIAkuY2xvc2UgPQlzbmRfdnQxNzI0X3BsYXliYWNrX3Byb19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTExMjQsNyArMTEyMiw3IEBACiAJLnBvaW50ZXIgPQlzbmRfdnQxNzI0X3BsYXliYWNrX3Byb19wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdnQxNzI0X2NhcHR1cmVfcHJvX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3Z0MTcyNF9jYXB0dXJlX3Byb19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3Z0MTcyNF9jYXB0dXJlX3Byb19vcGVuLAogCS5jbG9zZSA9CXNuZF92dDE3MjRfY2FwdHVyZV9wcm9fY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMjkyLDcgKzEyOTAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF92dDE3MjRfcGxheWJhY2tfc3BkaWZfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdnQxNzI0X3BsYXliYWNrX3NwZGlmX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfdnQxNzI0X3BsYXliYWNrX3NwZGlmX29wZW4sCiAJLmNsb3NlID0Jc25kX3Z0MTcyNF9wbGF5YmFja19zcGRpZl9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTEzMDMsNyArMTMwMSw3IEBACiAJLnBvaW50ZXIgPQlzbmRfdnQxNzI0X3BjbV9wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdnQxNzI0X2NhcHR1cmVfc3BkaWZfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdnQxNzI0X2NhcHR1cmVfc3BkaWZfb3BzID0gewogCS5vcGVuID0JCXNuZF92dDE3MjRfY2FwdHVyZV9zcGRpZl9vcGVuLAogCS5jbG9zZSA9CXNuZF92dDE3MjRfY2FwdHVyZV9zcGRpZl9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTE0MzcsNyArMTQzNSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3Z0MTcyNF9wbGF5YmFja19pbmRlcF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF92dDE3MjRfcGxheWJhY2tfaW5kZXBfb3BzID0gewogCS5vcGVuID0JCXNuZF92dDE3MjRfcGxheWJhY2tfaW5kZXBfb3BlbiwKIAkuY2xvc2UgPQlzbmRfdnQxNzI0X3BsYXliYWNrX2luZGVwX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2tvcmcxMjEyL2tvcmcxMjEyLmMgYi9zb3VuZC9wY2kva29yZzEyMTIva29yZzEyMTIuYwppbmRleCA5ZTFhZDExLi41NjVmN2Y1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kva29yZzEyMTIva29yZzEyMTIuYworKysgYi9zb3VuZC9wY2kva29yZzEyMTIva29yZzEyMTIuYwpAQCAtMTY4MSw3ICsxNjgxLDcgQEAKIAlyZXR1cm4gc25kX2tvcmcxMjEyX2NvcHlfdG8oa29yZzEyMTIsIGRzdCwgcG9zLCBjb3VudCwgMCwga29yZzEyMTItPmNoYW5uZWxzICogMik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2tvcmcxMjEyX3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2tvcmcxMjEyX3BsYXliYWNrX29wcyA9IHsKICAgICAgICAgLm9wZW4gPQkJc25kX2tvcmcxMjEyX3BsYXliYWNrX29wZW4sCiAgICAgICAgIC5jbG9zZSA9CXNuZF9rb3JnMTIxMl9wbGF5YmFja19jbG9zZSwKICAgICAgICAgLmlvY3RsID0Jc25kX2tvcmcxMjEyX2lvY3RsLApAQCAtMTY5Myw3ICsxNjkzLDcgQEAKICAgICAgICAgLnNpbGVuY2UgPQlzbmRfa29yZzEyMTJfcGxheWJhY2tfc2lsZW5jZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2tvcmcxMjEyX2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfa29yZzEyMTJfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2tvcmcxMjEyX2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPQlzbmRfa29yZzEyMTJfY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfa29yZzEyMTJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbG9sYS9sb2xhX3BjbS5jIGIvc291bmQvcGNpL2xvbGEvbG9sYV9wY20uYwppbmRleCAzYmQ2OTg1Li4xMjY4YmEzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbG9sYS9sb2xhX3BjbS5jCisrKyBiL3NvdW5kL3BjaS9sb2xhL2xvbGFfcGNtLmMKQEAgLTU4Niw3ICs1ODYsNyBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBsb2xhX3BjbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIGxvbGFfcGNtX29wcyA9IHsKIAkub3BlbiA9IGxvbGFfcGNtX29wZW4sCiAJLmNsb3NlID0gbG9sYV9wY21fY2xvc2UsCiAJLmlvY3RsID0gc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbHg2NDY0ZXMvbHg2NDY0ZXMuYyBiL3NvdW5kL3BjaS9seDY0NjRlcy9seDY0NjRlcy5jCmluZGV4IDhiOGUyZTUuLmMwZjBjMzQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9seDY0NjRlcy9seDY0NjRlcy5jCisrKyBiL3NvdW5kL3BjaS9seDY0NjRlcy9seDY0NjRlcy5jCkBAIC04MDQsNyArODA0LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIGx4X29wc19wbGF5YmFjayA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgbHhfb3BzX3BsYXliYWNrID0gewogCS5vcGVuICAgICAgPSBseF9wY21fb3BlbiwKIAkuY2xvc2UgICAgID0gbHhfcGNtX2Nsb3NlLAogCS5pb2N0bCAgICAgPSBzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTgxNSw3ICs4MTUsNyBAQAogCS5wb2ludGVyICAgPSBseF9wY21fc3RyZWFtX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIGx4X29wc19jYXB0dXJlID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBseF9vcHNfY2FwdHVyZSA9IHsKIAkub3BlbiAgICAgID0gbHhfcGNtX29wZW4sCiAJLmNsb3NlICAgICA9IGx4X3BjbV9jbG9zZSwKIAkuaW9jdGwgICAgID0gc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbWFlc3RybzMuYyBiL3NvdW5kL3BjaS9tYWVzdHJvMy5jCmluZGV4IDE3YWU5MjYuLmNhZmVhNmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9tYWVzdHJvMy5jCisrKyBiL3NvdW5kL3BjaS9tYWVzdHJvMy5jCkBAIC0xODM0LDcgKzE4MzQsNyBAQAogICogY3JlYXRlIHBjbSBpbnN0YW5jZQogICovCiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX20zX3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX20zX3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfbTNfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPQlzbmRfbTNfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xODQ1LDcgKzE4NDUsNyBAQAogCS5wb2ludGVyID0Jc25kX20zX3BjbV9wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfbTNfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9tM19jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfbTNfY2FwdHVyZV9vcGVuLAogCS5jbG9zZSA9CXNuZF9tM19jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL21peGFydC9taXhhcnQuYyBiL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0LmMKaW5kZXggMjVjMGRkZC4uODBkNDM5OSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL21peGFydC9taXhhcnQuYworKysgYi9zb3VuZC9wY2kvbWl4YXJ0L21peGFydC5jCkBAIC05MjIsNyArOTIyLDcgQEAKIAogCiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX21peGFydF9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9taXhhcnRfcGxheWJhY2tfb3BzID0gewogCS5vcGVuICAgICAgPSBzbmRfbWl4YXJ0X3BsYXliYWNrX29wZW4sCiAJLmNsb3NlICAgICA9IHNuZF9taXhhcnRfY2xvc2UsCiAJLmlvY3RsICAgICA9IHNuZF9wY21fbGliX2lvY3RsLApAQCAtOTMzLDcgKzkzMyw3IEBACiAJLnBvaW50ZXIgICA9IHNuZF9taXhhcnRfc3RyZWFtX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9taXhhcnRfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9taXhhcnRfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gICAgICA9IHNuZF9taXhhcnRfY2FwdHVyZV9vcGVuLAogCS5jbG9zZSAgICAgPSBzbmRfbWl4YXJ0X2Nsb3NlLAogCS5pb2N0bCAgICAgPSBzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ubTI1Ni9ubTI1Ni5jIGIvc291bmQvcGNpL25tMjU2L25tMjU2LmMKaW5kZXggNDczNWUyNy4uMTAzZmUzMSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL25tMjU2L25tMjU2LmMKKysrIGIvc291bmQvcGNpL25tMjU2L25tMjU2LmMKQEAgLTkwMiw3ICs5MDIsNyBAQAogLyoKICAqIGNyZWF0ZSBhIHBjbSBpbnN0YW5jZQogICovCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ubTI1Nl9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ubTI1Nl9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX25tMjU2X3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0Jc25kX25tMjU2X3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtOTE3LDcgKzkxNyw3IEBACiAJLm1tYXAgPQkJc25kX3BjbV9saWJfbW1hcF9pb21lbSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX25tMjU2X2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfbm0yNTZfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX25tMjU2X2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPQlzbmRfbm0yNTZfY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9veHlnZW4vb3h5Z2VuX3BjbS5jIGIvc291bmQvcGNpL294eWdlbi9veHlnZW5fcGNtLmMKaW5kZXggYWEyZWJkMS4uMDQyYTI0MyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL294eWdlbi9veHlnZW5fcGNtLmMKKysrIGIvc291bmQvcGNpL294eWdlbi9veHlnZW5fcGNtLmMKQEAgLTYzMSw3ICs2MzEsNyBAQAogCXJldHVybiBieXRlc190b19mcmFtZXMocnVudGltZSwgY3Vycl9hZGRyIC0gKHUzMilydW50aW1lLT5kbWFfYWRkcik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgb3h5Z2VuX3JlY19hX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgb3h5Z2VuX3JlY19hX29wcyA9IHsKIAkub3BlbiAgICAgID0gb3h5Z2VuX3JlY19hX29wZW4sCiAJLmNsb3NlICAgICA9IG94eWdlbl9jbG9zZSwKIAkuaW9jdGwgICAgID0gc25kX3BjbV9saWJfaW9jdGwsCkBAIC02NDIsNyArNjQyLDcgQEAKIAkucG9pbnRlciAgID0gb3h5Z2VuX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIG94eWdlbl9yZWNfYl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIG94eWdlbl9yZWNfYl9vcHMgPSB7CiAJLm9wZW4gICAgICA9IG94eWdlbl9yZWNfYl9vcGVuLAogCS5jbG9zZSAgICAgPSBveHlnZW5fY2xvc2UsCiAJLmlvY3RsICAgICA9IHNuZF9wY21fbGliX2lvY3RsLApAQCAtNjUzLDcgKzY1Myw3IEBACiAJLnBvaW50ZXIgICA9IG94eWdlbl9wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBveHlnZW5fcmVjX2Nfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBveHlnZW5fcmVjX2Nfb3BzID0gewogCS5vcGVuICAgICAgPSBveHlnZW5fcmVjX2Nfb3BlbiwKIAkuY2xvc2UgICAgID0gb3h5Z2VuX2Nsb3NlLAogCS5pb2N0bCAgICAgPSBzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTY2NCw3ICs2NjQsNyBAQAogCS5wb2ludGVyICAgPSBveHlnZW5fcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgb3h5Z2VuX3NwZGlmX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgb3h5Z2VuX3NwZGlmX29wcyA9IHsKIAkub3BlbiAgICAgID0gb3h5Z2VuX3NwZGlmX29wZW4sCiAJLmNsb3NlICAgICA9IG94eWdlbl9jbG9zZSwKIAkuaW9jdGwgICAgID0gc25kX3BjbV9saWJfaW9jdGwsCkBAIC02NzUsNyArNjc1LDcgQEAKIAkucG9pbnRlciAgID0gb3h5Z2VuX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIG94eWdlbl9tdWx0aWNoX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgb3h5Z2VuX211bHRpY2hfb3BzID0gewogCS5vcGVuICAgICAgPSBveHlnZW5fbXVsdGljaF9vcGVuLAogCS5jbG9zZSAgICAgPSBveHlnZW5fY2xvc2UsCiAJLmlvY3RsICAgICA9IHNuZF9wY21fbGliX2lvY3RsLApAQCAtNjg2LDcgKzY4Niw3IEBACiAJLnBvaW50ZXIgICA9IG94eWdlbl9wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBveHlnZW5fYWM5N19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIG94eWdlbl9hYzk3X29wcyA9IHsKIAkub3BlbiAgICAgID0gb3h5Z2VuX2FjOTdfb3BlbiwKIAkuY2xvc2UgICAgID0gb3h5Z2VuX2Nsb3NlLAogCS5pb2N0bCAgICAgPSBzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9wY3hoci9wY3hoci5jIGIvc291bmQvcGNpL3BjeGhyL3BjeGhyLmMKaW5kZXggOTI5MzIzNS4uYmI3ZWVlOSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3BjeGhyL3BjeGhyLmMKKysrIGIvc291bmQvcGNpL3BjeGhyL3BjeGhyLmMKQEAgLTExNDYsNyArMTE0Niw3IEBACiB9CiAKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBwY3hocl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHBjeGhyX29wcyA9IHsKIAkub3BlbiAgICAgID0gcGN4aHJfb3BlbiwKIAkuY2xvc2UgICAgID0gcGN4aHJfY2xvc2UsCiAJLmlvY3RsICAgICA9IHNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JpcHRpZGUvcmlwdGlkZS5jIGIvc291bmQvcGNpL3JpcHRpZGUvcmlwdGlkZS5jCmluZGV4IDA2N2E5MTIuLmFkYTVmMDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9yaXB0aWRlL3JpcHRpZGUuYworKysgYi9zb3VuZC9wY2kvcmlwdGlkZS9yaXB0aWRlLmMKQEAgLTY0NCw3ICs2NDQsNyBAQAogCSAubW9ubyA9IGxidXNfcGxheV9tb25vMywKIAkgfSwKIH07Ci1zdGF0aWMgc3RydWN0IGxidXNwYXRoIGxidXNfcmVjX3BhdGggPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGxidXNwYXRoIGxidXNfcmVjX3BhdGggPSB7CiAJLm5vY29udiA9IGxidXNfcmVjX25vY29udjEsCiAJLnN0ZXJlbyA9IGxidXNfcmVjX3N0ZXJlbzEsCiAJLm1vbm8gPSBsYnVzX3JlY19tb25vMSwKQEAgLTE2NjksNyArMTY2OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JpcHRpZGVfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcmlwdGlkZV9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPSBzbmRfcmlwdGlkZV9wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9IHNuZF9yaXB0aWRlX3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9IHNuZF9wY21fbGliX2lvY3RsLApAQCAtMTY4MCw3ICsxNjgwLDcgQEAKIAkudHJpZ2dlciA9IHNuZF9yaXB0aWRlX3RyaWdnZXIsCiAJLnBvaW50ZXIgPSBzbmRfcmlwdGlkZV9wb2ludGVyLAogfTsKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JpcHRpZGVfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9yaXB0aWRlX2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0gc25kX3JpcHRpZGVfY2FwdHVyZV9vcGVuLAogCS5jbG9zZSA9IHNuZF9yaXB0aWRlX2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0gc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcm1lMzIuYyBiL3NvdW5kL3BjaS9ybWUzMi5jCmluZGV4IGNkOTRhYzUuLjk2ZDE1ZGIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWUzMi5jCisrKyBiL3NvdW5kL3BjaS9ybWUzMi5jCkBAIC0xMTk2LDcgKzExOTYsNyBAQAogfQogCiAvKiBmb3IgaGFsZmR1cGxleCBtb2RlICovCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWUzMl9wbGF5YmFja19zcGRpZl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWUzMl9wbGF5YmFja19zcGRpZl9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3JtZTMyX3BsYXliYWNrX3NwZGlmX29wZW4sCiAJLmNsb3NlID0Jc25kX3JtZTMyX3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTIxMCw3ICsxMjEwLDcgQEAKIAkubW1hcCA9CQlzbmRfcGNtX2xpYl9tbWFwX2lvbWVtLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lMzJfY2FwdHVyZV9zcGRpZl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWUzMl9jYXB0dXJlX3NwZGlmX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfcm1lMzJfY2FwdHVyZV9zcGRpZl9vcGVuLAogCS5jbG9zZSA9CXNuZF9ybWUzMl9jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTIyMyw3ICsxMjIzLDcgQEAKIAkubW1hcCA9CQlzbmRfcGNtX2xpYl9tbWFwX2lvbWVtLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lMzJfcGxheWJhY2tfYWRhdF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWUzMl9wbGF5YmFja19hZGF0X29wcyA9IHsKIAkub3BlbiA9CQlzbmRfcm1lMzJfcGxheWJhY2tfYWRhdF9vcGVuLAogCS5jbG9zZSA9CXNuZF9ybWUzMl9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTEyMzYsNyArMTIzNiw3IEBACiAJLm1tYXAgPQkJc25kX3BjbV9saWJfbW1hcF9pb21lbSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTMyX2NhcHR1cmVfYWRhdF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWUzMl9jYXB0dXJlX2FkYXRfb3BzID0gewogCS5vcGVuID0JCXNuZF9ybWUzMl9jYXB0dXJlX2FkYXRfb3BlbiwKIAkuY2xvc2UgPQlzbmRfcm1lMzJfY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTEyNDksNyArMTI0OSw3IEBACiB9OwogCiAvKiBmb3IgZnVsbGR1cGxleCBtb2RlICovCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWUzMl9wbGF5YmFja19zcGRpZl9mZF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWUzMl9wbGF5YmFja19zcGRpZl9mZF9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3JtZTMyX3BsYXliYWNrX3NwZGlmX29wZW4sCiAJLmNsb3NlID0Jc25kX3JtZTMyX3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTI2MSw3ICsxMjYxLDcgQEAKIAkuYWNrID0JCXNuZF9ybWUzMl9wbGF5YmFja19mZF9hY2ssCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWUzMl9jYXB0dXJlX3NwZGlmX2ZkX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTMyX2NhcHR1cmVfc3BkaWZfZmRfb3BzID0gewogCS5vcGVuID0JCXNuZF9ybWUzMl9jYXB0dXJlX3NwZGlmX29wZW4sCiAJLmNsb3NlID0Jc25kX3JtZTMyX2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMjczLDcgKzEyNzMsNyBAQAogCS5hY2sgPQkJc25kX3JtZTMyX2NhcHR1cmVfZmRfYWNrLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lMzJfcGxheWJhY2tfYWRhdF9mZF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWUzMl9wbGF5YmFja19hZGF0X2ZkX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfcm1lMzJfcGxheWJhY2tfYWRhdF9vcGVuLAogCS5jbG9zZSA9CXNuZF9ybWUzMl9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTEyODQsNyArMTI4NCw3IEBACiAJLmFjayA9CQlzbmRfcm1lMzJfcGxheWJhY2tfZmRfYWNrLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lMzJfY2FwdHVyZV9hZGF0X2ZkX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTMyX2NhcHR1cmVfYWRhdF9mZF9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3JtZTMyX2NhcHR1cmVfYWRhdF9vcGVuLAogCS5jbG9zZSA9CXNuZF9ybWUzMl9jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JtZTk2LmMgYi9zb3VuZC9wY2kvcm1lOTYuYwppbmRleCA0MWMzMWRiLi4wNWI5ZGEzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcm1lOTYuYworKysgYi9zb3VuZC9wY2kvcm1lOTYuYwpAQCAtMTUwNSw3ICsxNTA1LDcgQEAKIAlyZXR1cm4gc25kX3JtZTk2X2NhcHR1cmVfcHRyKHJtZTk2KTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lOTZfcGxheWJhY2tfc3BkaWZfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lOTZfcGxheWJhY2tfc3BkaWZfb3BzID0gewogCS5vcGVuID0JCXNuZF9ybWU5Nl9wbGF5YmFja19zcGRpZl9vcGVuLAogCS5jbG9zZSA9CXNuZF9ybWU5Nl9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTE1MTgsNyArMTUxOCw3IEBACiAJLm1tYXAgPQkJc25kX3BjbV9saWJfbW1hcF9pb21lbSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTk2X2NhcHR1cmVfc3BkaWZfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lOTZfY2FwdHVyZV9zcGRpZl9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3JtZTk2X2NhcHR1cmVfc3BkaWZfb3BlbiwKIAkuY2xvc2UgPQlzbmRfcm1lOTZfY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTE1MzAsNyArMTUzMCw3IEBACiAJLm1tYXAgPQkJc25kX3BjbV9saWJfbW1hcF9pb21lbSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTk2X3BsYXliYWNrX2FkYXRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lOTZfcGxheWJhY2tfYWRhdF9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3JtZTk2X3BsYXliYWNrX2FkYXRfb3BlbiwKIAkuY2xvc2UgPQlzbmRfcm1lOTZfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xNTQzLDcgKzE1NDMsNyBAQAogCS5tbWFwID0JCXNuZF9wY21fbGliX21tYXBfaW9tZW0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWU5Nl9jYXB0dXJlX2FkYXRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lOTZfY2FwdHVyZV9hZGF0X29wcyA9IHsKIAkub3BlbiA9CQlzbmRfcm1lOTZfY2FwdHVyZV9hZGF0X29wZW4sCiAJLmNsb3NlID0Jc25kX3JtZTk2X2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwLmMgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwLmMKaW5kZXggN2M4OTQxYi4uYjk0ZmM2MyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3JtZTk2NTIvaGRzcC5jCisrKyBiL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3AuYwpAQCAtNDg2MSw3ICs0ODYxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfaGRzcF9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9oZHNwX3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfaGRzcF9wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9CXNuZF9oZHNwX3BsYXliYWNrX3JlbGVhc2UsCiAJLmlvY3RsID0Jc25kX2hkc3BfaW9jdGwsCkBAIC00ODczLDcgKzQ4NzMsNyBAQAogCS5zaWxlbmNlID0Jc25kX2hkc3BfaHdfc2lsZW5jZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2hkc3BfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9oZHNwX2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0JCXNuZF9oZHNwX2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPQlzbmRfaGRzcF9jYXB0dXJlX3JlbGVhc2UsCiAJLmlvY3RsID0Jc25kX2hkc3BfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwbS5jIGIvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYwppbmRleCBhNGE5OTlhLi4xNGJiZjU1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwbS5jCisrKyBiL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMKQEAgLTE2NjYsNyArMTY2Niw3IEBACiAJCQkgICAgSERTUE1fQVVUT1NZTkNfRlJPTV9OT05FKSB7CiAKIAkJCQlkZXZfd2FybihoZHNwbS0+Y2FyZC0+ZGV2LAotCQkJCQkgIkRldGVjdGVkIG5vIEV4dGVybmVsIFN5bmNcbiIpOworCQkJCQkgIkRldGVjdGVkIG5vIEV4dGVybmFsIFN5bmNcbiIpOwogCQkJCW5vdF9zZXQgPSAxOwogCiAJCQl9IGVsc2UgaWYgKHJhdGUgIT0gZXh0ZXJuYWxfZnJlcSkgewpAQCAtNjM2MSw3ICs2MzYxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfaGRzcG1fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfaGRzcG1fb3BzID0gewogCS5vcGVuID0gc25kX2hkc3BtX29wZW4sCiAJLmNsb3NlID0gc25kX2hkc3BtX3JlbGVhc2UsCiAJLmlvY3RsID0gc25kX2hkc3BtX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JtZTk2NTIvcm1lOTY1Mi5jIGIvc291bmQvcGNpL3JtZTk2NTIvcm1lOTY1Mi5jCmluZGV4IGZkYmMwYWEuLjU1MTcyYzYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWU5NjUyL3JtZTk2NTIuYworKysgYi9zb3VuZC9wY2kvcm1lOTY1Mi9ybWU5NjUyLmMKQEAgLTIzNjgsNyArMjM2OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTk2NTJfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lOTY1Ml9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3JtZTk2NTJfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPQlzbmRfcm1lOTY1Ml9wbGF5YmFja19yZWxlYXNlLAogCS5pb2N0bCA9CXNuZF9ybWU5NjUyX2lvY3RsLApAQCAtMjM4MCw3ICsyMzgwLDcgQEAKIAkuc2lsZW5jZSA9CXNuZF9ybWU5NjUyX2h3X3NpbGVuY2UsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWU5NjUyX2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lOTY1Ml9jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfcm1lOTY1Ml9jYXB0dXJlX29wZW4sCiAJLmNsb3NlID0Jc25kX3JtZTk2NTJfY2FwdHVyZV9yZWxlYXNlLAogCS5pb2N0bCA9CXNuZF9ybWU5NjUyX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3NvbmljdmliZXMuYyBiL3NvdW5kL3BjaS9zb25pY3ZpYmVzLmMKaW5kZXggMWI2ZmFkNy4uZTFhMTM4NyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3NvbmljdmliZXMuYworKysgYi9zb3VuZC9wY2kvc29uaWN2aWJlcy5jCkBAIC04NTcsNyArODU3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfc29uaWN2aWJlc19wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9zb25pY3ZpYmVzX3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfc29uaWN2aWJlc19wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9CXNuZF9zb25pY3ZpYmVzX3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtODY4LDcgKzg2OCw3IEBACiAJLnBvaW50ZXIgPQlzbmRfc29uaWN2aWJlc19wbGF5YmFja19wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfc29uaWN2aWJlc19jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3NvbmljdmliZXNfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3NvbmljdmliZXNfY2FwdHVyZV9vcGVuLAogCS5jbG9zZSA9CXNuZF9zb25pY3ZpYmVzX2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21haW4uYyBiL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jCmluZGV4IDU5OWQyYjcuLjI3ZjBlZDggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jCkBAIC0yMDcwLDcgKzIwNzAsNyBAQAogICAgUENNIG9wZXJhdGlvbnMKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdHJpZGVudF9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF90cmlkZW50X3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfdHJpZGVudF9wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9CXNuZF90cmlkZW50X3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF90cmlkZW50X2lvY3RsLApAQCAtMjA4MSw3ICsyMDgxLDcgQEAKIAkucG9pbnRlciA9CXNuZF90cmlkZW50X3BsYXliYWNrX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF90cmlkZW50X254X3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3RyaWRlbnRfbnhfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0JCXNuZF90cmlkZW50X3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0Jc25kX3RyaWRlbnRfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3RyaWRlbnRfaW9jdGwsCkBAIC0yMTE1LDcgKzIxMTUsNyBAQAogCS5wb2ludGVyID0Jc25kX3RyaWRlbnRfcGxheWJhY2tfcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3RyaWRlbnRfZm9sZGJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdHJpZGVudF9mb2xkYmFja19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3RyaWRlbnRfZm9sZGJhY2tfb3BlbiwKIAkuY2xvc2UgPQlzbmRfdHJpZGVudF9mb2xkYmFja19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfdHJpZGVudF9pb2N0bCwKQEAgLTIxMjYsNyArMjEyNiw3IEBACiAJLnBvaW50ZXIgPQlzbmRfdHJpZGVudF9wbGF5YmFja19wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdHJpZGVudF9ueF9mb2xkYmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF90cmlkZW50X254X2ZvbGRiYWNrX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfdHJpZGVudF9mb2xkYmFja19vcGVuLAogCS5jbG9zZSA9CXNuZF90cmlkZW50X2ZvbGRiYWNrX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF90cmlkZW50X2lvY3RsLApAQCAtMjEzOCw3ICsyMTM4LDcgQEAKIAkucGFnZSA9CQlzbmRfcGNtX3NnYnVmX29wc19wYWdlLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdHJpZGVudF9zcGRpZl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF90cmlkZW50X3NwZGlmX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfdHJpZGVudF9zcGRpZl9vcGVuLAogCS5jbG9zZSA9CXNuZF90cmlkZW50X3NwZGlmX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF90cmlkZW50X2lvY3RsLApAQCAtMjE0OSw3ICsyMTQ5LDcgQEAKIAkucG9pbnRlciA9CXNuZF90cmlkZW50X3NwZGlmX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF90cmlkZW50X3NwZGlmXzcwMThfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdHJpZGVudF9zcGRpZl83MDE4X29wcyA9IHsKIAkub3BlbiA9CQlzbmRfdHJpZGVudF9zcGRpZl9vcGVuLAogCS5jbG9zZSA9CXNuZF90cmlkZW50X3NwZGlmX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF90cmlkZW50X2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3ZpYTgyeHguYyBiL3NvdW5kL3BjaS92aWE4Mnh4LmMKaW5kZXggM2RkMDM4Yi4uMzhhMTdiNCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3ZpYTgyeHguYworKysgYi9zb3VuZC9wY2kvdmlhODJ4eC5jCkBAIC0xMzY2LDcgKzEzNjYsNyBAQAogCiAKIC8qIHZpYTY4NiBwbGF5YmFjayBjYWxsYmFja3MgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3ZpYTY4Nl9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF92aWE2ODZfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0JCXNuZF92aWE2ODZfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPQlzbmRfdmlhODJ4eF9wY21fY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMzc5LDcgKzEzNzksNyBAQAogfTsKIAogLyogdmlhNjg2IGNhcHR1cmUgY2FsbGJhY2tzICovCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF92aWE2ODZfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF92aWE2ODZfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3ZpYTgyeHhfY2FwdHVyZV9vcGVuLAogCS5jbG9zZSA9CXNuZF92aWE4Mnh4X3BjbV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTEzOTIsNyArMTM5Miw3IEBACiB9OwogCiAvKiB2aWE4MjN4IERTWCBwbGF5YmFjayBjYWxsYmFja3MgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3ZpYTgyMzNfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdmlhODIzM19wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3ZpYTgyMzNfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPQlzbmRfdmlhODIzM19wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTE0MDUsNyArMTQwNSw3IEBACiB9OwogCiAvKiB2aWE4MjN4IG11bHRpLWNoYW5uZWwgcGxheWJhY2sgY2FsbGJhY2tzICovCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF92aWE4MjMzX211bHRpX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3ZpYTgyMzNfbXVsdGlfb3BzID0gewogCS5vcGVuID0JCXNuZF92aWE4MjMzX211bHRpX29wZW4sCiAJLmNsb3NlID0Jc25kX3ZpYTgyeHhfcGNtX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTQxOCw3ICsxNDE4LDcgQEAKIH07CiAKIC8qIHZpYTgyM3ggY2FwdHVyZSBjYWxsYmFja3MgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3ZpYTgyMzNfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF92aWE4MjMzX2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0JCXNuZF92aWE4Mnh4X2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPQlzbmRfdmlhODJ4eF9wY21fY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdmlhODJ4eF9tb2RlbS5jIGIvc291bmQvcGNpL3ZpYTgyeHhfbW9kZW0uYwppbmRleCA5OWI5MTM3Li4yZjZkNDBmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdmlhODJ4eF9tb2RlbS5jCisrKyBiL3NvdW5kL3BjaS92aWE4Mnh4X21vZGVtLmMKQEAgLTgwNCw3ICs4MDQsNyBAQAogCiAKIC8qIHZpYTY4NiBwbGF5YmFjayBjYWxsYmFja3MgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3ZpYTY4Nl9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF92aWE2ODZfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0JCXNuZF92aWE4Mnh4X3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0Jc25kX3ZpYTgyeHhfcGNtX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtODE3LDcgKzgxNyw3IEBACiB9OwogCiAvKiB2aWE2ODYgY2FwdHVyZSBjYWxsYmFja3MgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3ZpYTY4Nl9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3ZpYTY4Nl9jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfdmlhODJ4eF9jYXB0dXJlX29wZW4sCiAJLmNsb3NlID0Jc25kX3ZpYTgyeHhfcGNtX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfbWFpbi5jIGIvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfbWFpbi5jCmluZGV4IDRjMjYwNzYuLmZmZWUyODQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpX21haW4uYworKysgYi9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9tYWluLmMKQEAgLTExMjMsNyArMTEyMyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3ltZnBjaV9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF95bWZwY2lfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0JCQlzbmRfeW1mcGNpX3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0JCXNuZF95bWZwY2lfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0JCXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTEzNCw3ICsxMTM0LDcgQEAKIAkucG9pbnRlciA9CQlzbmRfeW1mcGNpX3BsYXliYWNrX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF95bWZwY2lfY2FwdHVyZV9yZWNfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfeW1mcGNpX2NhcHR1cmVfcmVjX29wcyA9IHsKIAkub3BlbiA9CQkJc25kX3ltZnBjaV9jYXB0dXJlX3JlY19vcGVuLAogCS5jbG9zZSA9CQlzbmRfeW1mcGNpX2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0JCXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTE2OSw3ICsxMTY5LDcgQEAKIAkJCQkgICAgIHNuZF9wY21fc3RkX2NobWFwcywgMiwgMCwgTlVMTCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3ltZnBjaV9jYXB0dXJlX2FjOTdfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfeW1mcGNpX2NhcHR1cmVfYWM5N19vcHMgPSB7CiAJLm9wZW4gPQkJCXNuZF95bWZwY2lfY2FwdHVyZV9hYzk3X29wZW4sCiAJLmNsb3NlID0JCXNuZF95bWZwY2lfY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPQkJc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMjAzLDcgKzEyMDMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF95bWZwY2lfcGxheWJhY2tfc3BkaWZfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfeW1mcGNpX3BsYXliYWNrX3NwZGlmX29wcyA9IHsKIAkub3BlbiA9CQkJc25kX3ltZnBjaV9wbGF5YmFja19zcGRpZl9vcGVuLAogCS5jbG9zZSA9CQlzbmRfeW1mcGNpX3BsYXliYWNrX3NwZGlmX2Nsb3NlLAogCS5pb2N0bCA9CQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTEyMzYsNyArMTIzNiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3ltZnBjaV9wbGF5YmFja180Y2hfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfeW1mcGNpX3BsYXliYWNrXzRjaF9vcHMgPSB7CiAJLm9wZW4gPQkJCXNuZF95bWZwY2lfcGxheWJhY2tfNGNoX29wZW4sCiAJLmNsb3NlID0JCXNuZF95bWZwY2lfcGxheWJhY2tfNGNoX2Nsb3NlLAogCS5pb2N0bCA9CQlzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BwYy9zbmRfcHMzLmMgYi9zb3VuZC9wcGMvc25kX3BzMy5jCmluZGV4IDM2ODI0MjUuLmI4NGQ3ZDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BwYy9zbmRfcHMzLmMKKysrIGIvc291bmQvcHBjL3NuZF9wczMuYwpAQCAtNTY0LDkgKzU2NCw3IEBACiAKIHN0YXRpYyBpbnQgc25kX3BzM19wY21faHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKLQlpbnQgcmV0OwotCXJldCA9IHNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7CiB9OwogCiBzdGF0aWMgaW50IHNuZF9wczNfZGVsYXlfdG9fYnl0ZXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYW1kL2FjcC1wY20tZG1hLmMgYi9zb3VuZC9zb2MvYW1kL2FjcC1wY20tZG1hLmMKaW5kZXggZDFmYjAzNS4uNTA0YzdjZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2FtZC9hY3AtcGNtLWRtYS5jCisrKyBiL3NvdW5kL3NvYy9hbWQvYWNwLXBjbS1kbWEuYwpAQCAtODk3LDcgKzg5Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgYWNwX2RtYV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIGFjcF9kbWFfb3BzID0gewogCS5vcGVuID0gYWNwX2RtYV9vcGVuLAogCS5jbG9zZSA9IGFjcF9kbWFfY2xvc2UsCiAJLmlvY3RsID0gc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXRtZWwvYXRtZWwtY2xhc3NkLmMgYi9zb3VuZC9zb2MvYXRtZWwvYXRtZWwtY2xhc3NkLmMKaW5kZXggNmQ5YjhiNC4uODlhYzVmNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2F0bWVsL2F0bWVsLWNsYXNzZC5jCisrKyBiL3NvdW5kL3NvYy9hdG1lbC9hdG1lbC1jbGFzc2QuYwpAQCAtMzA4LDkgKzMwOCwxMSBAQAogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfY2xhc3NkID0gewogCS5wcm9iZQkJPSBhdG1lbF9jbGFzc2RfY29kZWNfcHJvYmUsCi0JLmNvbnRyb2xzCT0gYXRtZWxfY2xhc3NkX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzCT0gQVJSQVlfU0laRShhdG1lbF9jbGFzc2Rfc25kX2NvbnRyb2xzKSwKIAkuZ2V0X3JlZ21hcAk9IGF0bWVsX2NsYXNzZF9jb2RlY19nZXRfcmVtYXAsCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBhdG1lbF9jbGFzc2Rfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoYXRtZWxfY2xhc3NkX3NuZF9jb250cm9scyksCisJfSwKIH07CiAKIC8qIGNvZGVjIGRhaSBjb21wb25lbnQgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdG1lbC9hdG1lbC1wY20tcGRjLmMgYi9zb3VuZC9zb2MvYXRtZWwvYXRtZWwtcGNtLXBkYy5jCmluZGV4IGRhODYxYjQuLjkxYjcwNjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdG1lbC9hdG1lbC1wY20tcGRjLmMKKysrIGIvc291bmQvc29jL2F0bWVsL2F0bWVsLXBjbS1wZGMuYwpAQCAtMzgxLDcgKzM4MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgYXRtZWxfcGNtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgYXRtZWxfcGNtX29wcyA9IHsKIAkub3BlbgkJPSBhdG1lbF9wY21fb3BlbiwKIAkuY2xvc2UJCT0gYXRtZWxfcGNtX2Nsb3NlLAogCS5pb2N0bAkJPSBzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdG1lbC9hdG1lbC1wZG1pYy5jIGIvc291bmQvc29jL2F0bWVsL2F0bWVsLXBkbWljLmMKaW5kZXggNWY1NmRhNi4uYzkxN2RmNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2F0bWVsL2F0bWVsLXBkbWljLmMKKysrIGIvc291bmQvc29jL2F0bWVsL2F0bWVsLXBkbWljLmMKQEAgLTgwLDcgKzgwLDcgQEAKIAogCWlmIChwZGF0YS0+bWljX21heF9mcmVxIDwgcGRhdGEtPm1pY19taW5fZnJlcSkgewogCQlkZXZfZXJyKGRldiwKLQkJCSJtaWMtbWF4LWZyZXEgc2hvdWxkIG5vdCBsZXNzIHRoYW4gbWljLW1pbi1mcmVxXG4iKTsKKwkJCSJtaWMtbWF4LWZyZXEgc2hvdWxkIG5vdCBiZSBsZXNzIHRoYW4gbWljLW1pbi1mcmVxXG4iKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJfQogCkBAIC0xMTUsOCArMTE1LDEwIEBACiAJCXJldHVybiByZXQ7CiAKIAlyZXQgPSAgY2xrX3ByZXBhcmVfZW5hYmxlKGRkLT5wY2xrKTsKLQlpZiAocmV0KQorCWlmIChyZXQpIHsKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRkLT5nY2xrKTsKIAkJcmV0dXJuIHJldDsKKwl9CiAKIAkvKiBDbGVhciBhbGwgYml0cyBpbiB0aGUgQ29udHJvbCBSZWdpc3RlcihQRE1JQ19DUikgKi8KIAlyZWdtYXBfd3JpdGUoZGQtPnJlZ21hcCwgUERNSUNfQ1IsIDApOwpAQCAtMjgzLDcgKzI4NSw3IEBACiAJOCwgQVJSQVlfU0laRShtaWNfZ2Fpbl90YWJsZSktMSwgVExWX0RCX1NDQUxFX0lURU0oLTY1MDAsIDEwMCwgMCksCiApOwogCi1pbnQgcGRtaWNfZ2V0X21pY192b2xzdyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKK3N0YXRpYyBpbnQgcGRtaWNfZ2V0X21pY192b2xzdyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKQEAgLTM1Nyw4ICszNTksMTAgQEAKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3BkbWljID0gewogCS5wcm9iZQkJPSBhdG1lbF9wZG1pY19jb2RlY19wcm9iZSwKLQkuY29udHJvbHMJPSBhdG1lbF9wZG1pY19zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scwk9IEFSUkFZX1NJWkUoYXRtZWxfcGRtaWNfc25kX2NvbnRyb2xzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGF0bWVsX3BkbWljX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGF0bWVsX3BkbWljX3NuZF9jb250cm9scyksCisJfSwKIH07CiAKIC8qIGNvZGVjIGRhaSBjb21wb25lbnQgKi8KQEAgLTU5Niw3ICs2MDAsNyBAQAogCWRkLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwogCWlmIChkZC0+aXJxIDwgMCkgewogCQlyZXQgPSBkZC0+aXJxOwotCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBjb3VsZCBub3QgZ2V0IGlycTogJWRcbiIsIHJldCk7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBpcnE6ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtNjE0LDcgKzYxOCw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JLyogVGhlIGdjbGsgY2xvY2sgZnJlcXVlbmN5IG11c3QgYWx3YXlzIGJlIHRyZWUgdGltZXMKKwkvKiBUaGUgZ2NsayBjbG9jayBmcmVxdWVuY3kgbXVzdCBhbHdheXMgYmUgdGhyZWUgdGltZXMKIAkgKiBsb3dlciB0aGFuIHRoZSBwY2xrIGNsb2NrIGZyZXF1ZW5jeQogCSAqLwogCXJldCA9IGNsa19zZXRfcmF0ZShkZC0+Z2NsaywgY2xrX2dldF9yYXRlKGRkLT5wY2xrKS8zKTsKQEAgLTY0OSw3ICs2NTMsNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCS8qIEdldCB0aGUgbWluaW1hbCBhbmQgbWF4aW1hbCBzYW1wbGUgcmF0ZSB0aGF0IG1pY3Bob25lIHN1cHBvcnRzICovCisJLyogR2V0IHRoZSBtaW5pbWFsIGFuZCBtYXhpbWFsIHNhbXBsZSByYXRlIHRoYXQgdGhlIG1pY3JvcGhvbmUgc3VwcG9ydHMgKi8KIAlhdG1lbF9wZG1pY19nZXRfc2FtcGxlX3JhdGUoZGQsICZyYXRlX21pbiwgJnJhdGVfbWF4KTsKIAogCS8qIHJlZ2lzdGVyIGNwdSBkYWkgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdG1lbC9hdG1lbF9zc2NfZGFpLmMgYi9zb3VuZC9zb2MvYXRtZWwvYXRtZWxfc3NjX2RhaS5jCmluZGV4IDU0YzA5YWMuLjE2ZTQ1OWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdG1lbC9hdG1lbF9zc2NfZGFpLmMKKysrIGIvc291bmQvc29jL2F0bWVsL2F0bWVsX3NzY19kYWkuYwpAQCAtMjk5LDggKzI5OSw5IEBACiAJY2xrX2VuYWJsZShzc2NfcC0+c3NjLT5jbGspOwogCXNzY19wLT5tY2tfcmF0ZSA9IGNsa19nZXRfcmF0ZShzc2NfcC0+c3NjLT5jbGspOwogCi0JLyogUmVzZXQgdGhlIFNTQyB0byBrZWVwIGl0IGF0IGEgY2xlYW4gc3RhdHVzICovCi0Jc3NjX3dyaXRlbChzc2NfcC0+c3NjLT5yZWdzLCBDUiwgU1NDX0JJVChDUl9TV1JTVCkpOworCS8qIFJlc2V0IHRoZSBTU0MgdW5sZXNzIGluaXRpYWxpemVkIHRvIGtlZXAgaXQgaW4gYSBjbGVhbiBzdGF0ZSAqLworCWlmICghc3NjX3AtPmluaXRpYWxpemVkKQorCQlzc2Nfd3JpdGVsKHNzY19wLT5zc2MtPnJlZ3MsIENSLCBTU0NfQklUKENSX1NXUlNUKSk7CiAKIAlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewogCQlkaXIgPSAwOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy84OHBtODYweC1jb2RlYy5jIGIvc291bmQvc29jL2NvZGVjcy84OHBtODYweC1jb2RlYy5jCmluZGV4IGU4YmVkNmIuLmIwMTNhNGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvODhwbTg2MHgtY29kZWMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzLzg4cG04NjB4LWNvZGVjLmMKQEAgLTEzNjEsMTIgKzEzNjEsMTQgQEAKIAkuc2V0X2JpYXNfbGV2ZWwJPSBwbTg2MHhfc2V0X2JpYXNfbGV2ZWwsCiAJLmdldF9yZWdtYXAJPSBwbTg2MHhfZ2V0X3JlZ21hcCwKIAotCS5jb250cm9scyA9IHBtODYweF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUocG04NjB4X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHBtODYweF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHBtODYweF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHBtODYweF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShwbTg2MHhfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gcG04NjB4X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHBtODYweF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHBtODYweF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShwbTg2MHhfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHBtODYweF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUocG04NjB4X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCBwbTg2MHhfY29kZWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvS2NvbmZpZyBiL3NvdW5kL3NvYy9jb2RlY3MvS2NvbmZpZwppbmRleCAxY2Q2YWIzLi5jNjc2NjdiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcKKysrIGIvc291bmQvc29jL2NvZGVjcy9LY29uZmlnCkBAIC05Miw2ICs5Miw3IEBACiAJc2VsZWN0IFNORF9TT0NfTUFYOTg3NyBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19NQzEzNzgzIGlmIE1GRF9NQzEzWFhYCiAJc2VsZWN0IFNORF9TT0NfTUwyNjEyNCBpZiBJMkMKKwlzZWxlY3QgU05EX1NPQ19OQVU4ODEwIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX05BVTg4MjUgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfSERNSV9DT0RFQwogCXNlbGVjdCBTTkRfU09DX1BDTTE2ODEgaWYgSTJDCkBAIC0xMTIsNiArMTEzLDggQEAKIAlzZWxlY3QgU05EX1NPQ19SVDU2NDUgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfUlQ1NjUxIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1JUNTY1OSBpZiBJMkMKKwlzZWxlY3QgU05EX1NPQ19SVDU2NjAgaWYgSTJDCisJc2VsZWN0IFNORF9TT0NfUlQ1NjYzIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1JUNTY3MCBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19SVDU2NzcgaWYgSTJDICYmIFNQSV9NQVNURVIKIAlzZWxlY3QgU05EX1NPQ19TR1RMNTAwMCBpZiBJMkMKQEAgLTY0NSw2ICs2NDgsOCBAQAogCWRlZmF1bHQgeSBpZiBTTkRfU09DX1JUNTY0NT15CiAJZGVmYXVsdCB5IGlmIFNORF9TT0NfUlQ1NjUxPXkKIAlkZWZhdWx0IHkgaWYgU05EX1NPQ19SVDU2NTk9eQorCWRlZmF1bHQgeSBpZiBTTkRfU09DX1JUNTY2MD15CisJZGVmYXVsdCB5IGlmIFNORF9TT0NfUlQ1NjYzPXkKIAlkZWZhdWx0IHkgaWYgU05EX1NPQ19SVDU2NzA9eQogCWRlZmF1bHQgeSBpZiBTTkRfU09DX1JUNTY3Nz15CiAJZGVmYXVsdCBtIGlmIFNORF9TT0NfUlQ1NTE0PW0KQEAgLTY1Myw2ICs2NTgsOCBAQAogCWRlZmF1bHQgbSBpZiBTTkRfU09DX1JUNTY0NT1tCiAJZGVmYXVsdCBtIGlmIFNORF9TT0NfUlQ1NjUxPW0KIAlkZWZhdWx0IG0gaWYgU05EX1NPQ19SVDU2NTk9bQorCWRlZmF1bHQgbSBpZiBTTkRfU09DX1JUNTY2MD1tCisJZGVmYXVsdCBtIGlmIFNORF9TT0NfUlQ1NjYzPW0KIAlkZWZhdWx0IG0gaWYgU05EX1NPQ19SVDU2NzA9bQogCWRlZmF1bHQgbSBpZiBTTkRfU09DX1JUNTY3Nz1tCiAKQEAgLTY2NSw2ICs2NzIsNyBAQAogCiBjb25maWcgU05EX1NPQ19SVDI4NgogCXRyaXN0YXRlCisJc2VsZWN0IFNORF9TT0NfUlQ1NjYzCiAJZGVwZW5kcyBvbiBJMkMKIAogY29uZmlnIFNORF9TT0NfUlQyOTgKQEAgLTY5Nyw2ICs3MDUsMTIgQEAKIGNvbmZpZyBTTkRfU09DX1JUNTY1OQogCXRyaXN0YXRlCiAKK2NvbmZpZyBTTkRfU09DX1JUNTY2MAorCXRyaXN0YXRlCisKK2NvbmZpZyBTTkRfU09DX1JUNTY2MworCXRyaXN0YXRlCisKIGNvbmZpZyBTTkRfU09DX1JUNTY3MAogCXRyaXN0YXRlCiAKQEAgLTEwNjQsNiArMTA3OCwxMCBAQAogY29uZmlnIFNORF9TT0NfTUwyNjEyNAogCXRyaXN0YXRlCiAKK2NvbmZpZyBTTkRfU09DX05BVTg4MTAKKwl0cmlzdGF0ZSAiTnV2b3RvbiBUZWNobm9sb2d5IENvcnBvcmF0aW9uIE5BVTg4QzEwIENPREVDIgorCWRlcGVuZHMgb24gSTJDCisKIGNvbmZpZyBTTkRfU09DX05BVTg4MjUKIAl0cmlzdGF0ZQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL01ha2VmaWxlIGIvc291bmQvc29jL2NvZGVjcy9NYWtlZmlsZQppbmRleCA1ODAzNmFmLi45NThjZDQ5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL01ha2VmaWxlCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvTWFrZWZpbGUKQEAgLTg2LDYgKzg2LDcgQEAKIHNuZC1zb2MtbWF4OTg2MC1vYmpzIDo9IG1heDk4NjAubwogc25kLXNvYy1tYzEzNzgzLW9ianMgOj0gbWMxMzc4My5vCiBzbmQtc29jLW1sMjYxMjQtb2JqcyA6PSBtbDI2MTI0Lm8KK3NuZC1zb2MtbmF1ODgxMC1vYmpzIDo9IG5hdTg4MTAubwogc25kLXNvYy1uYXU4ODI1LW9ianMgOj0gbmF1ODgyNS5vCiBzbmQtc29jLWhkbWktY29kZWMtb2JqcyA6PSBoZG1pLWNvZGVjLm8KIHNuZC1zb2MtcGNtMTY4MS1vYmpzIDo9IHBjbTE2ODEubwpAQCAtMTEyLDYgKzExMyw4IEBACiBzbmQtc29jLXJ0NTY0NS1vYmpzIDo9IHJ0NTY0NS5vCiBzbmQtc29jLXJ0NTY1MS1vYmpzIDo9IHJ0NTY1MS5vCiBzbmQtc29jLXJ0NTY1OS1vYmpzIDo9IHJ0NTY1OS5vCitzbmQtc29jLXJ0NTY2MC1vYmpzIDo9IHJ0NTY2MC5vCitzbmQtc29jLXJ0NTY2My1vYmpzIDo9IHJ0NTY2My5vCiBzbmQtc29jLXJ0NTY3MC1vYmpzIDo9IHJ0NTY3MC5vCiBzbmQtc29jLXJ0NTY3Ny1vYmpzIDo9IHJ0NTY3Ny5vCiBzbmQtc29jLXJ0NTY3Ny1zcGktb2JqcyA6PSBydDU2Nzctc3BpLm8KQEAgLTMwNyw2ICszMTAsNyBAQAogb2JqLSQoQ09ORklHX1NORF9TT0NfTUFYOTg2MCkJKz0gc25kLXNvYy1tYXg5ODYwLm8KIG9iai0kKENPTkZJR19TTkRfU09DX01DMTM3ODMpCSs9IHNuZC1zb2MtbWMxMzc4My5vCiBvYmotJChDT05GSUdfU05EX1NPQ19NTDI2MTI0KQkrPSBzbmQtc29jLW1sMjYxMjQubworb2JqLSQoQ09ORklHX1NORF9TT0NfTkFVODgxMCkgICArPSBzbmQtc29jLW5hdTg4MTAubwogb2JqLSQoQ09ORklHX1NORF9TT0NfTkFVODgyNSkgICArPSBzbmQtc29jLW5hdTg4MjUubwogb2JqLSQoQ09ORklHX1NORF9TT0NfSERNSV9DT0RFQykJKz0gc25kLXNvYy1oZG1pLWNvZGVjLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1BDTTE2ODEpCSs9IHNuZC1zb2MtcGNtMTY4MS5vCkBAIC0zMzMsNiArMzM3LDggQEAKIG9iai0kKENPTkZJR19TTkRfU09DX1JUNTY0NSkJKz0gc25kLXNvYy1ydDU2NDUubwogb2JqLSQoQ09ORklHX1NORF9TT0NfUlQ1NjUxKQkrPSBzbmQtc29jLXJ0NTY1MS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19SVDU2NTkpCSs9IHNuZC1zb2MtcnQ1NjU5Lm8KK29iai0kKENPTkZJR19TTkRfU09DX1JUNTY2MCkJKz0gc25kLXNvYy1ydDU2NjAubworb2JqLSQoQ09ORklHX1NORF9TT0NfUlQ1NjYzKQkrPSBzbmQtc29jLXJ0NTY2My5vCiBvYmotJChDT05GSUdfU05EX1NPQ19SVDU2NzApCSs9IHNuZC1zb2MtcnQ1NjcwLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1JUNTY3NykJKz0gc25kLXNvYy1ydDU2Nzcubwogb2JqLSQoQ09ORklHX1NORF9TT0NfUlQ1Njc3X1NQSSkJKz0gc25kLXNvYy1ydDU2Nzctc3BpLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWI4NTAwLWNvZGVjLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FiODUwMC1jb2RlYy5jCmluZGV4IDJmYzg5MTUuLjkzNWZmN2MgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWI4NTAwLWNvZGVjLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hYjg1MDAtY29kZWMuYwpAQCAtMjQwOCwyOCArMjQwOCwyOCBAQAogewogCXUzMiB2YWx1ZTsKIAotCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJzdGVyaWNzc29uLGFtaWMxLXR5cGUtc2luZ2xlLWVuZGVkIiwgTlVMTCkpCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgInN0ZXJpY3Nzb24sYW1pYzEtdHlwZS1zaW5nbGUtZW5kZWQiKSkKIAkJY29kZWMtPmFtaWNzLm1pYzFfdHlwZSA9IEFNSUNfVFlQRV9TSU5HTEVfRU5ERUQ7CiAJZWxzZQogCQljb2RlYy0+YW1pY3MubWljMV90eXBlID0gQU1JQ19UWVBFX0RJRkZFUkVOVElBTDsKIAotCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJzdGVyaWNzc29uLGFtaWMyLXR5cGUtc2luZ2xlLWVuZGVkIiwgTlVMTCkpCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgInN0ZXJpY3Nzb24sYW1pYzItdHlwZS1zaW5nbGUtZW5kZWQiKSkKIAkJY29kZWMtPmFtaWNzLm1pYzJfdHlwZSA9IEFNSUNfVFlQRV9TSU5HTEVfRU5ERUQ7CiAJZWxzZQogCQljb2RlYy0+YW1pY3MubWljMl90eXBlID0gQU1JQ19UWVBFX0RJRkZFUkVOVElBTDsKIAogCS8qIEhhcyBhIG5vbi1zdGFuZGFyZCBWYW1pYyBiZWVuIHJlcXVlc3RlZD8gKi8KLQlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAic3Rlcmljc3NvbixhbWljMWEtYmlhcy12YW1pYzIiLCBOVUxMKSkKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAic3Rlcmljc3NvbixhbWljMWEtYmlhcy12YW1pYzIiKSkKIAkJY29kZWMtPmFtaWNzLm1pYzFhX21pY2JpYXMgPSBBTUlDX01JQ0JJQVNfVkFNSUMyOwogCWVsc2UKIAkJY29kZWMtPmFtaWNzLm1pYzFhX21pY2JpYXMgPSBBTUlDX01JQ0JJQVNfVkFNSUMxOwogCi0JaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgInN0ZXJpY3Nzb24sYW1pYzFiLWJpYXMtdmFtaWMyIiwgTlVMTCkpCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgInN0ZXJpY3Nzb24sYW1pYzFiLWJpYXMtdmFtaWMyIikpCiAJCWNvZGVjLT5hbWljcy5taWMxYl9taWNiaWFzID0gQU1JQ19NSUNCSUFTX1ZBTUlDMjsKIAllbHNlCiAJCWNvZGVjLT5hbWljcy5taWMxYl9taWNiaWFzID0gQU1JQ19NSUNCSUFTX1ZBTUlDMTsKIAotCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJzdGVyaWNzc29uLGFtaWMyLWJpYXMtdmFtaWMxIiwgTlVMTCkpCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgInN0ZXJpY3Nzb24sYW1pYzItYmlhcy12YW1pYzEiKSkKIAkJY29kZWMtPmFtaWNzLm1pYzJfbWljYmlhcyA9IEFNSUNfTUlDQklBU19WQU1JQzE7CiAJZWxzZQogCQljb2RlYy0+YW1pY3MubWljMl9taWNiaWFzID0gQU1JQ19NSUNCSUFTX1ZBTUlDMjsKQEAgLTI1MjUsMTIgKzI1MjUsMTQgQEAKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBhYjg1MDBfY29kZWNfZHJpdmVyID0gewogCS5wcm9iZSA9CQlhYjg1MDBfY29kZWNfcHJvYmUsCi0JLmNvbnRyb2xzID0JCWFiODUwMF9jdHJscywKLQkubnVtX2NvbnRyb2xzID0JCUFSUkFZX1NJWkUoYWI4NTAwX2N0cmxzKSwKLQkuZGFwbV93aWRnZXRzID0JCWFiODUwMF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPQlBUlJBWV9TSVpFKGFiODUwMF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9CQlhYjg1MDBfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9CUFSUkFZX1NJWkUoYWI4NTAwX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzID0JCWFiODUwMF9jdHJscywKKwkJLm51bV9jb250cm9scyA9CQlBUlJBWV9TSVpFKGFiODUwMF9jdHJscyksCisJCS5kYXBtX3dpZGdldHMgPQkJYWI4NTAwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMgPQlBUlJBWV9TSVpFKGFiODUwMF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMgPQkJYWI4NTAwX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzID0JQVJSQVlfU0laRShhYjg1MDBfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IGFiODUwMF9jb2RlY19kcml2ZXJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWM5Ny5jIGIvc291bmQvc29jL2NvZGVjcy9hYzk3LmMKaW5kZXggNWIzMjI0Yy4uZjdmMDRjNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hYzk3LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hYzk3LmMKQEAgLTExNywxMCArMTE3LDEyIEBACiAJLnN1c3BlbmQgPQlhYzk3X3NvY19zdXNwZW5kLAogCS5yZXN1bWUgPQlhYzk3X3NvY19yZXN1bWUsCiAKLQkuZGFwbV93aWRnZXRzID0gYWM5N193aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShhYzk3X3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGFjOTdfcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGFjOTdfcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmRhcG1fd2lkZ2V0cwkJPSBhYzk3X3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhYzk3X3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gYWM5N19yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFjOTdfcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCBhYzk3X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkMTgzNi5jIGIvc291bmQvc29jL2NvZGVjcy9hZDE4MzYuYwppbmRleCBlMmNlNmM0Li5hNDc4MjM5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkMTgzNi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxODM2LmMKQEAgLTMyNywxMiArMzI3LDE0IEBACiAJLnN1c3BlbmQgPSBhZDE4MzZfc3VzcGVuZCwKIAkucmVzdW1lID0gYWQxODM2X3Jlc3VtZSwKIAotCS5jb250cm9scyA9IGFkMTgzeF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShhZDE4M3hfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBhZDE4M3hfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShhZDE4M3hfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBhZDE4M3hfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYWQxODN4X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGFkMTgzeF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGFkMTgzeF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gYWQxODN4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFkMTgzeF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gYWQxODN4X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhZDE4M3hfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19kZWZhdWx0IGFkMTgzNl9yZWdfZGVmYXVsdHNbXSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTN4LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkMTkzeC5jCmluZGV4IDNhM2YzZjIuLmQ2NDM1NTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTN4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZDE5M3guYwpAQCAtNDEwLDEyICs0MTAsMTQgQEAKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X2FkMTkzeCA9IHsKIAkucHJvYmUgPSBhZDE5M3hfY29kZWNfcHJvYmUsCi0JLmNvbnRyb2xzID0gYWQxOTN4X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShhZDE5M3hfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gYWQxOTN4X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWQxOTN4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gYXVkaW9fcGF0aHMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fcGF0aHMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gYWQxOTN4X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGFkMTkzeF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGFkMTkzeF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhZDE5M3hfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGF1ZGlvX3BhdGhzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhdWRpb19wYXRocyksCisJfSwKIH07CiAKIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGFkMTkzeF9yZWdtYXBfY29uZmlnID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZDE5ODAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTgwLmMKaW5kZXggOWVmMjBkYi4uYjdjMWI5ZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hZDE5ODAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkMTk4MC5jCkBAIC0yOTksMTIgKzI5OSwxNCBAQAogCS5wcm9iZSA9IAlhZDE5ODBfc29jX3Byb2JlLAogCS5yZW1vdmUgPSAJYWQxOTgwX3NvY19yZW1vdmUsCiAKLQkuY29udHJvbHMgPSBhZDE5ODBfc25kX2FjOTdfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoYWQxOTgwX3NuZF9hYzk3X2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gYWQxOTgwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWQxOTgwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gYWQxOTgwX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGFkMTk4MF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBhZDE5ODBfc25kX2FjOTdfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShhZDE5ODBfc25kX2FjOTdfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGFkMTk4MF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhZDE5ODBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGFkMTk4MF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWQxOTgwX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCBhZDE5ODBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWQ3MzMxMS5jIGIvc291bmQvc29jL2NvZGVjcy9hZDczMzExLmMKaW5kZXggYTk0MDBhZS4uM2UzNThhNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hZDczMzExLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZDczMzExLmMKQEAgLTU1LDEwICs1NSwxMiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X2FkNzMzMTEgPSB7Ci0JLmRhcG1fd2lkZ2V0cyA9IGFkNzMzMTFfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShhZDczMzExX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gYWQ3MzMxMV9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhZDczMzExX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmRhcG1fd2lkZ2V0cwkJPSBhZDczMzExX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFkNzMzMTFfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGFkNzMzMTFfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFkNzMzMTFfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IGFkNzMzMTFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTEzNzMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTEzNzMuYwppbmRleCAxNTU2YjM2Li44ZmE5MDQ1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkYXUxMzczLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZGF1MTM3My5jCkBAIC0xNDY2LDEyICsxNDY2LDE0IEBACiAKIAkuc2V0X3BsbCA9IGFkYXUxMzczX3NldF9wbGwsCiAKLQkuY29udHJvbHMgPSBhZGF1MTM3M19jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShhZGF1MTM3M19jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IGFkYXUxMzczX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWRhdTEzNzNfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBhZGF1MTM3M19kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhZGF1MTM3M19kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBhZGF1MTM3M19jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGFkYXUxMzczX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBhZGF1MTM3M19kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhZGF1MTM3M19kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gYWRhdTEzNzNfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFkYXUxMzczX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCBhZGF1MTM3M19pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE3MDEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE3MDEuYwppbmRleCBkZTUzYzBkLi4zYmFkMWJjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkYXUxNzAxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZGF1MTcwMS5jCkBAIC03NjUsMTMgKzc2NSwxNCBAQAogCS5zZXRfYmlhc19sZXZlbAkJPSBhZGF1MTcwMV9zZXRfYmlhc19sZXZlbCwKIAkuaWRsZV9iaWFzX29mZgkJPSB0cnVlLAogCi0JLmNvbnRyb2xzCQk9IGFkYXUxNzAxX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShhZGF1MTcwMV9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cwkJPSBhZGF1MTcwMV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFkYXUxNzAxX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzCQk9IGFkYXUxNzAxX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFkYXUxNzAxX2RhcG1fcm91dGVzKSwKLQorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gYWRhdTE3MDFfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShhZGF1MTcwMV9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gYWRhdTE3MDFfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWRhdTE3MDFfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGFkYXUxNzAxX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhZGF1MTcwMV9kYXBtX3JvdXRlcyksCisJfSwKIAkuc2V0X3N5c2NsawkJPSBhZGF1MTcwMV9zZXRfc3lzY2xrLAogfTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZGF1MTc2MS5jIGIvc291bmQvc29jL2NvZGVjcy9hZGF1MTc2MS5jCmluZGV4IGI5NWQyOWQuLjNiYzNjYzUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE3NjEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXUxNzYxLmMKQEAgLTcxOSwxMiArNzE5LDE0IEBACiAJLnNldF9iaWFzX2xldmVsCT0gYWRhdTE3NjFfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gYWRhdTE3NjFfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoYWRhdTE3NjFfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBhZGF1MXg2MV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGFkYXUxeDYxX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gYWRhdTF4NjFfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYWRhdTF4NjFfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gYWRhdTE3NjFfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShhZGF1MTc2MV9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gYWRhdTF4NjFfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWRhdTF4NjFfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGFkYXUxeDYxX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhZGF1MXg2MV9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKICNkZWZpbmUgQURBVTE3NjFfRk9STUFUUyAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8IFwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE3ODEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE3ODEuYwppbmRleCBiYzFiYjU2Li41NDYwNzFjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkYXUxNzgxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZGF1MTc4MS5jCkBAIC00MzIsMTIgKzQzMiwxNCBAQAogCS5zZXRfYmlhc19sZXZlbCA9IGFkYXUxNzgxX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IGFkYXUxNzgxX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGFkYXUxNzgxX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gYWRhdTE3ODFfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShhZGF1MTc4MV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGFkYXUxNzgxX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGFkYXUxNzgxX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGFkYXUxNzgxX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoYWRhdTE3ODFfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGFkYXUxNzgxX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFkYXUxNzgxX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBhZGF1MTc4MV9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWRhdTE3ODFfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiAjZGVmaW5lIEFEQVUxNzgxX0ZPUk1BVFMgKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfCBcCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkYXUxOTc3LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXUxOTc3LmMKaW5kZXggOWJkZDE1Zi4uYjMxOWRiNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hZGF1MTk3Ny5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE5NzcuYwpAQCAtODczLDEyICs4NzMsMTQgQEAKIAkuc2V0X3N5c2NsayA9IGFkYXUxOTc3X3NldF9zeXNjbGssCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gYWRhdTE5Nzdfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGFkYXUxOTc3X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IGFkYXUxOTc3X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWRhdTE5NzdfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBhZGF1MTk3N19kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhZGF1MTk3N19kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBhZGF1MTk3N19zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShhZGF1MTk3N19zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGFkYXUxOTc3X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFkYXUxOTc3X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBhZGF1MTk3N19kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWRhdTE5NzdfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IGFkYXUxOTc3X3NldHVwX21pY2JpYXMoc3RydWN0IGFkYXUxOTc3ICphZGF1MTk3NykKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTcwMDIuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTcwMDIuYwppbmRleCA5ZGY3MmM2Li42Mzg0YzU0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkYXU3MDAyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZGF1NzAwMi5jCkBAIC0zOSwxMCArMzksMTIgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgYWRhdTcwMDJfY29kZWNfZHJpdmVyID0gewotCS5kYXBtX3dpZGdldHMgPSBhZGF1NzAwMl93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShhZGF1NzAwMl93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBhZGF1NzAwMl9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYWRhdTcwMDJfcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmRhcG1fd2lkZ2V0cwkJPSBhZGF1NzAwMl93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWRhdTcwMDJfd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBhZGF1NzAwMl9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFkYXU3MDAyX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgYWRhdTcwMDJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWRhdjgweC5jIGIvc291bmQvc29jL2NvZGVjcy9hZGF2ODB4LmMKaW5kZXggYWNmZjhkNi4uNmU3OTNlYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hZGF2ODB4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZGF2ODB4LmMKQEAgLTgzNCwxMiArODM0LDE0IEBACiAJLnNldF9wbGwgPSBhZGF2ODB4X3NldF9wbGwsCiAJLnNldF9zeXNjbGsgPSBhZGF2ODB4X3NldF9zeXNjbGssCiAKLQkuY29udHJvbHMgPSBhZGF2ODB4X2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGFkYXY4MHhfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBhZGF2ODB4X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWRhdjgweF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGFkYXY4MHhfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYWRhdjgweF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBhZGF2ODB4X2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoYWRhdjgweF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gYWRhdjgweF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhZGF2ODB4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBhZGF2ODB4X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhZGF2ODB4X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogaW50IGFkYXY4MHhfYnVzX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJlZ21hcCAqcmVnbWFwKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZHMxMTd4LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkczExN3guYwppbmRleCBjNWJlMWJkLi45MGM3NTZkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkczExN3guYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkczExN3guYwpAQCAtNTksMTAgKzU5LDEyIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfYWRzMTE3eCA9IHsKLQkuZGFwbV93aWRnZXRzID0gYWRzMTE3eF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGFkczExN3hfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBhZHMxMTd4X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGFkczExN3hfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuZGFwbV93aWRnZXRzCQk9IGFkczExN3hfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWRzMTE3eF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gYWRzMTE3eF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWRzMTE3eF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgYWRzMTE3eF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazQxMDQuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0MTA0LmMKaW5kZXggNTk1ZDAyZC4uMWE5ZDIzMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazQxMDQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDEwNC5jCkBAIC0xNjMsNyArMTYzLDEwIEBACiAJCS5zdHJlYW1fbmFtZSA9ICJQbGF5YmFjayIsCiAJCS5jaGFubmVsc19taW4gPSAyLAogCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAsCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzIyMDUwIHwgU05EUlZfUENNX1JBVEVfMzIwMDAgfAorCQkJIFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfAorCQkJIFNORFJWX1BDTV9SQVRFXzg4MjAwIHwgU05EUlZfUENNX1JBVEVfOTYwMDAgfAorCQkJIFNORFJWX1BDTV9SQVRFXzE3NjQwMCB8IFNORFJWX1BDTV9SQVRFXzE5MjAwMCwKIAkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSAgfAogCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFIHwKIAkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFCkBAIC0yNDUsMTAgKzI0OCwxMiBAQAogCS5zdXNwZW5kID0gYWs0MTA0X3NvY19zdXNwZW5kLAogCS5yZXN1bWUgPSBhazQxMDRfc29jX3Jlc3VtZSwKIAotCS5kYXBtX3dpZGdldHMgPSBhazQxMDRfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShhazQxMDRfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBhazQxMDRfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYWs0MTA0X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmRhcG1fd2lkZ2V0cwkJPSBhazQxMDRfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWs0MTA0X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBhazQxMDRfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFrNDEwNF9kYXBtX3JvdXRlcyksCisJfQogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGFrNDEwNF9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FrNDUzNS5jIGIvc291bmQvc29jL2NvZGVjcy9hazQ1MzUuYwppbmRleCA1NDQyOGM2Li42NmNmZmZkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FrNDUzNS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NTM1LmMKQEAgLTM5NSwxMiArMzk1LDE0IEBACiAJLnNldF9iaWFzX2xldmVsID0gYWs0NTM1X3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IGFrNDUzNV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoYWs0NTM1X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IGFrNDUzNV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGFrNDUzNV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGFrNDUzNV9hdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYWs0NTM1X2F1ZGlvX21hcCksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBhazQ1MzVfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoYWs0NTM1X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gYWs0NTM1X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFrNDUzNV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gYWs0NTM1X2F1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWs0NTM1X2F1ZGlvX21hcCksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgYWs0NTM1X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazQ1NTQuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NTU0LmMKaW5kZXggMjk4ZGVkYy4uYjkyYzU0OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazQ1NTQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDU1NC5jCkBAIC02NSwxMCArNjUsMTIgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9hazQ1NTQgPSB7Ci0JLmRhcG1fd2lkZ2V0cyA9IGFrNDU1NF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGFrNDU1NF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGFrNDU1NF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhazQ1NTRfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuZGFwbV93aWRnZXRzCQk9IGFrNDU1NF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhazQ1NTRfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGFrNDU1NF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWs0NTU0X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCBhazQ1NTRfc29jX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FrNDYxMy5jIGIvc291bmQvc29jL2NvZGVjcy9hazQ2MTMuYwppbmRleCA5Nzc5OGQyLi5lODE5ZGQ4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FrNDYxMy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjEzLmMKQEAgLTQ1OCwxMiArNDU4LDE0IEBACiAJLnN1c3BlbmQJCT0gYWs0NjEzX3N1c3BlbmQsCiAJLnJlc3VtZQkJCT0gYWs0NjEzX3Jlc3VtZSwKIAkuc2V0X2JpYXNfbGV2ZWwJCT0gYWs0NjEzX3NldF9iaWFzX2xldmVsLAotCS5jb250cm9scwkJPSBhazQ2MTNfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShhazQ2MTNfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzCQk9IGFrNDYxM19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFrNDYxM19kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcwkJPSBhazQ2MTNfaW50ZXJjb24sCi0JLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWs0NjEzX2ludGVyY29uKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGFrNDYxM19zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShhazQ2MTNfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBhazQ2MTNfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWs0NjEzX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBhazQ2MTNfaW50ZXJjb24sCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFrNDYxM19pbnRlcmNvbiksCisJfSwKIH07CiAKIHN0YXRpYyB2b2lkIGFrNDYxM19wYXJzZV9vZihzdHJ1Y3QgYWs0NjEzX3ByaXYgKnByaXYsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FrNDY0MS5jIGIvc291bmQvc29jL2NvZGVjcy9hazQ2NDEuYwppbmRleCBiMTQxNzZmLi5jOTE3MTdkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FrNDY0MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQxLmMKQEAgLTUwNSwxMiArNTA1LDE0IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfYWs0NjQxID0gewotCS5jb250cm9scwkJPSBhazQ2NDFfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShhazQ2NDFfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzCQk9IGFrNDY0MV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFrNDY0MV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcwkJPSBhazQ2NDFfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFrNDY0MV9hdWRpb19tYXApLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gYWs0NjQxX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGFrNDY0MV9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGFrNDY0MV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhazQ2NDFfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGFrNDY0MV9hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFrNDY0MV9hdWRpb19tYXApLAorCX0sCiAJLnNldF9iaWFzX2xldmVsCQk9IGFrNDY0MV9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZgk9IHRydWUsCiB9OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazQ2NDIuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQyLmMKaW5kZXggY2M5NDFkNi4uMjYwOWY5NSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazQ2NDIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY0Mi5jCkBAIC01NTUsMTIgKzU1NSwxNCBAQAogCS5zdXNwZW5kCQk9IGFrNDY0Ml9zdXNwZW5kLAogCS5yZXN1bWUJCQk9IGFrNDY0Ml9yZXN1bWUsCiAJLnNldF9iaWFzX2xldmVsCQk9IGFrNDY0Ml9zZXRfYmlhc19sZXZlbCwKLQkuY29udHJvbHMJCT0gYWs0NjQyX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoYWs0NjQyX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cwkJPSBhazQ2NDJfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhazQ2NDJfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMJCT0gYWs0NjQyX2ludGVyY29uLAotCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFrNDY0Ml9pbnRlcmNvbiksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBhazQ2NDJfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoYWs0NjQyX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gYWs0NjQyX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFrNDY0Ml9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gYWs0NjQyX2ludGVyY29uLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhazQ2NDJfaW50ZXJjb24pLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgYWs0NjQyX3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjcxLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY3MS5jCmluZGV4IGM3M2E5ZjYuLjYwODhhZmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjcxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hazQ2NzEuYwpAQCAtNjEyLDEyICs2MTIsMTQgQEAKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X2FrNDY3MSA9IHsKIAkuc2V0X2JpYXNfbGV2ZWwgPSBhazQ2NzFfc2V0X2JpYXNfbGV2ZWwsCi0JLmNvbnRyb2xzID0gYWs0NjcxX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShhazQ2NzFfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gYWs0NjcxX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWs0NjcxX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gYWs0NjcxX2ludGVyY29uLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGFrNDY3MV9pbnRlcmNvbiksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBhazQ2NzFfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoYWs0NjcxX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gYWs0NjcxX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFrNDY3MV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gYWs0NjcxX2ludGVyY29uLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhazQ2NzFfaW50ZXJjb24pLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgYWs0NjcxX3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWs1Mzg2LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FrNTM4Ni5jCmluZGV4IGFmYTk1MzYuLjBlZjJkZjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWs1Mzg2LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hazUzODYuYwpAQCAtNzQsMTAgKzc0LDEyIEBACiAJLnJlbW92ZSA9IGFrNTM4Nl9zb2NfcmVtb3ZlLAogCS5zdXNwZW5kID0gYWs1Mzg2X3NvY19zdXNwZW5kLAogCS5yZXN1bWUgPSBhazUzODZfc29jX3Jlc3VtZSwKLQkuZGFwbV93aWRnZXRzID0gYWs1Mzg2X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWs1Mzg2X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gYWs1Mzg2X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGFrNTM4Nl9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5kYXBtX3dpZGdldHMJCT0gYWs1Mzg2X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFrNTM4Nl9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gYWs1Mzg2X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhazUzODZfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IGFrNTM4Nl9zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWxjNTYzMi5jIGIvc291bmQvc29jL2NvZGVjcy9hbGM1NjMyLmMKaW5kZXggNGQzYmEzMy4uYWRiODBkOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hbGM1NjMyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hbGM1NjMyLmMKQEAgLTEwNzIsMTIgKzEwNzIsMTQgQEAKIAkuc2V0X2JpYXNfbGV2ZWwgPSBhbGM1NjMyX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IGFsYzU2MzJfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGFsYzU2MzJfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gYWxjNTYzMl9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGFsYzU2MzJfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBhbGM1NjMyX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGFsYzU2MzJfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gYWxjNTYzMl9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShhbGM1NjMyX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gYWxjNTYzMl9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhbGM1NjMyX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBhbGM1NjMyX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhbGM1NjMyX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGFsYzU2MzJfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hcml6b25hLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FyaXpvbmEuYwppbmRleCBlY2ZkYmZjLi44NDZjYTA3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FyaXpvbmEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FyaXpvbmEuYwpAQCAtMTA5LDcgKzEwOSw3IEBACiAJCWJyZWFrOwogCX0KIAotCXJldHVybiAwOworCXJldHVybiBhcml6b25hX291dF9ldih3LCBrY29udHJvbCwgZXZlbnQpOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QgYXJpem9uYV90aGVybWFsX3dhcm4oaW50IGlycSwgdm9pZCAqZGF0YSkKQEAgLTE1OSwxMiArMTU5LDE0IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYXJpem9uYV9zcGtsID0KIAlTTkRfU09DX0RBUE1fUEdBX0UoIk9VVDRMIiwgU05EX1NPQ19OT1BNLAogCQkJICAgQVJJWk9OQV9PVVQ0TF9FTkFfU0hJRlQsIDAsIE5VTEwsIDAsIGFyaXpvbmFfc3BrX2V2LAotCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUpOworCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYXJpem9uYV9zcGtyID0KIAlTTkRfU09DX0RBUE1fUEdBX0UoIk9VVDRSIiwgU05EX1NPQ19OT1BNLAogCQkJICAgQVJJWk9OQV9PVVQ0Ul9FTkFfU0hJRlQsIDAsIE5VTEwsIDAsIGFyaXpvbmFfc3BrX2V2LAotCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUpOworCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAorCQkJICAgU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpOwogCiBpbnQgYXJpem9uYV9pbml0X3NwayhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CkBAIC04NjQsNiArODY2LDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CiAJc3RydWN0IGFyaXpvbmFfcHJpdiAqcHJpdiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBhcml6b25hICphcml6b25hID0gcHJpdi0+YXJpem9uYTsKIAogCXN3aXRjaCAoZXZlbnQpIHsKIAljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgpAQCAtODc3LDYgKzg4MCwxOCBAQAogCQkJcHJpdi0+b3V0X3VwX3BlbmRpbmcrKzsKIAkJCXByaXYtPm91dF91cF9kZWxheSArPSAxNzsKIAkJCWJyZWFrOworCQljYXNlIEFSSVpPTkFfT1VUNExfRU5BX1NISUZUOgorCQljYXNlIEFSSVpPTkFfT1VUNFJfRU5BX1NISUZUOgorCQkJcHJpdi0+b3V0X3VwX3BlbmRpbmcrKzsKKwkJCXN3aXRjaCAoYXJpem9uYS0+dHlwZSkgeworCQkJY2FzZSBXTTUxMDI6CisJCQljYXNlIFdNODk5NzoKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpdi0+b3V0X3VwX2RlbGF5ICs9IDEwOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlicmVhazsKIAkJfQpAQCAtODg5LDggKzkwNCwxMiBAQAogCQljYXNlIEFSSVpPTkFfT1VUMlJfRU5BX1NISUZUOgogCQljYXNlIEFSSVpPTkFfT1VUM0xfRU5BX1NISUZUOgogCQljYXNlIEFSSVpPTkFfT1VUM1JfRU5BX1NISUZUOgorCQljYXNlIEFSSVpPTkFfT1VUNExfRU5BX1NISUZUOgorCQljYXNlIEFSSVpPTkFfT1VUNFJfRU5BX1NISUZUOgogCQkJcHJpdi0+b3V0X3VwX3BlbmRpbmctLTsKLQkJCWlmICghcHJpdi0+b3V0X3VwX3BlbmRpbmcpIHsKKwkJCWlmICghcHJpdi0+b3V0X3VwX3BlbmRpbmcgJiYgcHJpdi0+b3V0X3VwX2RlbGF5KSB7CisJCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiUG93ZXIgdXAgZGVsYXk6ICVkXG4iLAorCQkJCQlwcml2LT5vdXRfdXBfZGVsYXkpOwogCQkJCW1zbGVlcChwcml2LT5vdXRfdXBfZGVsYXkpOwogCQkJCXByaXYtPm91dF91cF9kZWxheSA9IDA7CiAJCQl9CkBAIC05MTEsNiArOTMwLDIxIEBACiAJCQlwcml2LT5vdXRfZG93bl9wZW5kaW5nKys7CiAJCQlwcml2LT5vdXRfZG93bl9kZWxheSsrOwogCQkJYnJlYWs7CisJCWNhc2UgQVJJWk9OQV9PVVQ0TF9FTkFfU0hJRlQ6CisJCWNhc2UgQVJJWk9OQV9PVVQ0Ul9FTkFfU0hJRlQ6CisJCQlwcml2LT5vdXRfZG93bl9wZW5kaW5nKys7CisJCQlzd2l0Y2ggKGFyaXpvbmEtPnR5cGUpIHsKKwkJCWNhc2UgV001MTAyOgorCQkJY2FzZSBXTTg5OTc6CisJCQkJYnJlYWs7CisJCQljYXNlIFdNODk5ODoKKwkJCWNhc2UgV00xODE0OgorCQkJCXByaXYtPm91dF9kb3duX2RlbGF5ICs9IDU7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaXYtPm91dF9kb3duX2RlbGF5Kys7CisJCQkJYnJlYWs7CisJCQl9CiAJCWRlZmF1bHQ6CiAJCQlicmVhazsKIAkJfQpAQCAtOTIzLDggKzk1NywxMiBAQAogCQljYXNlIEFSSVpPTkFfT1VUMlJfRU5BX1NISUZUOgogCQljYXNlIEFSSVpPTkFfT1VUM0xfRU5BX1NISUZUOgogCQljYXNlIEFSSVpPTkFfT1VUM1JfRU5BX1NISUZUOgorCQljYXNlIEFSSVpPTkFfT1VUNExfRU5BX1NISUZUOgorCQljYXNlIEFSSVpPTkFfT1VUNFJfRU5BX1NISUZUOgogCQkJcHJpdi0+b3V0X2Rvd25fcGVuZGluZy0tOwotCQkJaWYgKCFwcml2LT5vdXRfZG93bl9wZW5kaW5nKSB7CisJCQlpZiAoIXByaXYtPm91dF9kb3duX3BlbmRpbmcgJiYgcHJpdi0+b3V0X2Rvd25fZGVsYXkpIHsKKwkJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJQb3dlciBkb3duIGRlbGF5OiAlZFxuIiwKKwkJCQkJcHJpdi0+b3V0X2Rvd25fZGVsYXkpOwogCQkJCW1zbGVlcChwcml2LT5vdXRfZG93bl9kZWxheSk7CiAJCQkJcHJpdi0+b3V0X2Rvd25fZGVsYXkgPSAwOwogCQkJfQpAQCAtMTkyMCw4ICsxOTU4LDggQEAKIAogc3RydWN0IGFyaXpvbmFfZmxsX2NmZyB7CiAJaW50IG47Ci0JaW50IHRoZXRhOwotCWludCBsYW1iZGE7CisJdW5zaWduZWQgaW50IHRoZXRhOworCXVuc2lnbmVkIGludCBsYW1iZGE7CiAJaW50IHJlZmRpdjsKIAlpbnQgb3V0ZGl2OwogCWludCBmcmF0aW87CkBAIC0yMTg4LDEzICsyMjI2LDEzIEBACiAJCQkJIEFSSVpPTkFfRkxMMV9DVFJMX1VQRCB8IGNmZy0+bik7CiB9CiAKLXN0YXRpYyBpbnQgYXJpem9uYV9pc19lbmFibGVkX2ZsbChzdHJ1Y3QgYXJpem9uYV9mbGwgKmZsbCkKK3N0YXRpYyBpbnQgYXJpem9uYV9pc19lbmFibGVkX2ZsbChzdHJ1Y3QgYXJpem9uYV9mbGwgKmZsbCwgaW50IGJhc2UpCiB7CiAJc3RydWN0IGFyaXpvbmEgKmFyaXpvbmEgPSBmbGwtPmFyaXpvbmE7CiAJdW5zaWduZWQgaW50IHJlZzsKIAlpbnQgcmV0OwogCi0JcmV0ID0gcmVnbWFwX3JlYWQoYXJpem9uYS0+cmVnbWFwLCBmbGwtPmJhc2UgKyAxLCAmcmVnKTsKKwlyZXQgPSByZWdtYXBfcmVhZChhcml6b25hLT5yZWdtYXAsIGJhc2UgKyAxLCAmcmVnKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJYXJpem9uYV9mbGxfZXJyKGZsbCwgIkZhaWxlZCB0byByZWFkIGN1cnJlbnQgc3RhdGU6ICVkXG4iLAogCQkJCXJldCk7CkBAIC0yMjA4LDIxICsyMjQ2LDI0IEBACiB7CiAJc3RydWN0IGFyaXpvbmEgKmFyaXpvbmEgPSBmbGwtPmFyaXpvbmE7CiAJYm9vbCB1c2Vfc3luYyA9IGZhbHNlOwotCWludCBhbHJlYWR5X2VuYWJsZWQgPSBhcml6b25hX2lzX2VuYWJsZWRfZmxsKGZsbCk7CisJaW50IGFscmVhZHlfZW5hYmxlZCA9IGFyaXpvbmFfaXNfZW5hYmxlZF9mbGwoZmxsLCBmbGwtPmJhc2UpOworCWludCBzeW5jX2VuYWJsZWQgPSBhcml6b25hX2lzX2VuYWJsZWRfZmxsKGZsbCwgZmxsLT5iYXNlICsgMHgxMCk7CiAJc3RydWN0IGFyaXpvbmFfZmxsX2NmZyBjZmc7CiAJaW50IGk7CiAJdW5zaWduZWQgaW50IHZhbDsKIAogCWlmIChhbHJlYWR5X2VuYWJsZWQgPCAwKQogCQlyZXR1cm4gYWxyZWFkeV9lbmFibGVkOworCWlmIChzeW5jX2VuYWJsZWQgPCAwKQorCQlyZXR1cm4gc3luY19lbmFibGVkOwogCiAJaWYgKGFscmVhZHlfZW5hYmxlZCkgewogCQkvKiBGYWNpbGl0YXRlIHNtb290aCByZWZjbGsgYWNyb3NzIHRoZSB0cmFuc2l0aW9uICovCi0JCXJlZ21hcF91cGRhdGVfYml0c19hc3luYyhmbGwtPmFyaXpvbmEtPnJlZ21hcCwgZmxsLT5iYXNlICsgMHg5LAotCQkJCQkgQVJJWk9OQV9GTEwxX0dBSU5fTUFTSywgMCk7CiAJCXJlZ21hcF91cGRhdGVfYml0cyhmbGwtPmFyaXpvbmEtPnJlZ21hcCwgZmxsLT5iYXNlICsgMSwKIAkJCQkgICBBUklaT05BX0ZMTDFfRlJFRVJVTiwgQVJJWk9OQV9GTEwxX0ZSRUVSVU4pOwogCQl1ZGVsYXkoMzIpOworCQlyZWdtYXBfdXBkYXRlX2JpdHNfYXN5bmMoZmxsLT5hcml6b25hLT5yZWdtYXAsIGZsbC0+YmFzZSArIDB4OSwKKwkJCQkJIEFSSVpPTkFfRkxMMV9HQUlOX01BU0ssIDApOwogCX0KIAogCS8qCkBAIC0yMjMzLDYgKzIyNzQsMTAgQEAKIAkgICAgZmxsLT5yZWZfc3JjICE9IGZsbC0+c3luY19zcmMpIHsKIAkJYXJpem9uYV9jYWxjX2ZsbChmbGwsICZjZmcsIGZsbC0+cmVmX2ZyZXEsIGZhbHNlKTsKIAorCQkvKiBSZWYgcGF0aCBoYXJkY29kZXMgbGFtYmRhIHRvIDY1NTM2IHdoZW4gc3luYyBpcyBvbiAqLworCQlpZiAoZmxsLT5zeW5jX3NyYyA+PSAwICYmIGNmZy5sYW1iZGEpCisJCQljZmcudGhldGEgPSAoY2ZnLnRoZXRhICogKDEgPDwgMTYpKSAvIGNmZy5sYW1iZGE7CisKIAkJYXJpem9uYV9hcHBseV9mbGwoYXJpem9uYSwgZmxsLT5iYXNlLCAmY2ZnLCBmbGwtPnJlZl9zcmMsCiAJCQkJICBmYWxzZSk7CiAJCWlmIChmbGwtPnN5bmNfc3JjID49IDApIHsKQEAgLTIyNTUsNiArMjMwMCw5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWlmIChhbHJlYWR5X2VuYWJsZWQgJiYgISFzeW5jX2VuYWJsZWQgIT0gdXNlX3N5bmMpCisJCWFyaXpvbmFfZmxsX3dhcm4oZmxsLCAiU3luY2hyb25pc2VyIGNoYW5nZWQgb24gYWN0aXZlIEZMTFxuIik7CisKIAkvKgogCSAqIEluY3JlYXNlIHRoZSBiYW5kd2lkdGggaWYgd2UncmUgbm90IHVzaW5nIGEgbG93IGZyZXF1ZW5jeQogCSAqIHN5bmMgc291cmNlLgpAQCAtMjI2OCwxNCArMjMxNiwxNCBAQAogCQkJCQkgQVJJWk9OQV9GTEwxX1NZTkNfQlcpOwogCiAJaWYgKCFhbHJlYWR5X2VuYWJsZWQpCi0JCXBtX3J1bnRpbWVfZ2V0KGFyaXpvbmEtPmRldik7CisJCXBtX3J1bnRpbWVfZ2V0X3N5bmMoYXJpem9uYS0+ZGV2KTsKIAotCXJlZ21hcF91cGRhdGVfYml0c19hc3luYyhhcml6b25hLT5yZWdtYXAsIGZsbC0+YmFzZSArIDEsCi0JCQkJIEFSSVpPTkFfRkxMMV9FTkEsIEFSSVpPTkFfRkxMMV9FTkEpOwogCWlmICh1c2Vfc3luYykKIAkJcmVnbWFwX3VwZGF0ZV9iaXRzX2FzeW5jKGFyaXpvbmEtPnJlZ21hcCwgZmxsLT5iYXNlICsgMHgxMSwKIAkJCQkJIEFSSVpPTkFfRkxMMV9TWU5DX0VOQSwKIAkJCQkJIEFSSVpPTkFfRkxMMV9TWU5DX0VOQSk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzX2FzeW5jKGFyaXpvbmEtPnJlZ21hcCwgZmxsLT5iYXNlICsgMSwKKwkJCQkgQVJJWk9OQV9GTEwxX0VOQSwgQVJJWk9OQV9GTEwxX0VOQSk7CiAKIAlpZiAoYWxyZWFkeV9lbmFibGVkKQogCQlyZWdtYXBfdXBkYXRlX2JpdHNfYXN5bmMoYXJpem9uYS0+cmVnbWFwLCBmbGwtPmJhc2UgKyAxLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hcml6b25hLmggYi9zb3VuZC9zb2MvY29kZWNzL2FyaXpvbmEuaAppbmRleCA2OWRhMWVmLi44NTBhYTMzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FyaXpvbmEuaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL2FyaXpvbmEuaApAQCAtMTkwLDIwICsxOTAsMjEgQEAKIAogI2RlZmluZSBBUklaT05BX0RTUF9ST1VURVMobmFtZSkgXAogCXsgbmFtZSwgTlVMTCwgbmFtZSAiIFByZWxvYWRlciJ9LCBcCi0JeyBuYW1lICIgUHJlbG9hZGVyIiwgTlVMTCwgbmFtZSAiIEF1eCAxIiB9LCBcCi0JeyBuYW1lICIgUHJlbG9hZGVyIiwgTlVMTCwgbmFtZSAiIEF1eCAyIiB9LCBcCi0JeyBuYW1lICIgUHJlbG9hZGVyIiwgTlVMTCwgbmFtZSAiIEF1eCAzIiB9LCBcCi0JeyBuYW1lICIgUHJlbG9hZGVyIiwgTlVMTCwgbmFtZSAiIEF1eCA0IiB9LCBcCi0JeyBuYW1lICIgUHJlbG9hZGVyIiwgTlVMTCwgbmFtZSAiIEF1eCA1IiB9LCBcCi0JeyBuYW1lICIgUHJlbG9hZGVyIiwgTlVMTCwgbmFtZSAiIEF1eCA2IiB9LCBcCisJeyBuYW1lICIgUHJlbG9hZGVyIiwgTlVMTCwgIlNZU0NMSyIgfSwgXAorCXsgbmFtZSwgTlVMTCwgbmFtZSAiIEF1eCAxIiB9LCBcCisJeyBuYW1lLCBOVUxMLCBuYW1lICIgQXV4IDIiIH0sIFwKKwl7IG5hbWUsIE5VTEwsIG5hbWUgIiBBdXggMyIgfSwgXAorCXsgbmFtZSwgTlVMTCwgbmFtZSAiIEF1eCA0IiB9LCBcCisJeyBuYW1lLCBOVUxMLCBuYW1lICIgQXV4IDUiIH0sIFwKKwl7IG5hbWUsIE5VTEwsIG5hbWUgIiBBdXggNiIgfSwgXAogCUFSSVpPTkFfTUlYRVJfSU5QVVRfUk9VVEVTKG5hbWUgIiBBdXggMSIpLCBcCiAJQVJJWk9OQV9NSVhFUl9JTlBVVF9ST1VURVMobmFtZSAiIEF1eCAyIiksIFwKIAlBUklaT05BX01JWEVSX0lOUFVUX1JPVVRFUyhuYW1lICIgQXV4IDMiKSwgXAogCUFSSVpPTkFfTUlYRVJfSU5QVVRfUk9VVEVTKG5hbWUgIiBBdXggNCIpLCBcCiAJQVJJWk9OQV9NSVhFUl9JTlBVVF9ST1VURVMobmFtZSAiIEF1eCA1IiksIFwKIAlBUklaT05BX01JWEVSX0lOUFVUX1JPVVRFUyhuYW1lICIgQXV4IDYiKSwgXAotCUFSSVpPTkFfTUlYRVJfUk9VVEVTKG5hbWUgIiBQcmVsb2FkZXIiLCBuYW1lICJMIiksIFwKLQlBUklaT05BX01JWEVSX1JPVVRFUyhuYW1lICIgUHJlbG9hZGVyIiwgbmFtZSAiUiIpCisJQVJJWk9OQV9NSVhFUl9ST1VURVMobmFtZSwgbmFtZSAiTCIpLCBcCisJQVJJWk9OQV9NSVhFUl9ST1VURVMobmFtZSwgbmFtZSAiUiIpCiAKICNkZWZpbmUgQVJJWk9OQV9FUV9DT05UUk9MKHhuYW1lLCB4YmFzZSkgICAgICAgICAgICAgICAgICAgICAgXAogewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgICBcCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2J0LXNjby5jIGIvc291bmQvc29jL2NvZGVjcy9idC1zY28uYwppbmRleCAyYThkMGVlLi44MDE0ZTY5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2J0LXNjby5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYnQtc2NvLmMKQEAgLTYzLDEwICs2MywxMiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X2J0X3NjbyA9IHsKLQkuZGFwbV93aWRnZXRzID0gYnRfc2NvX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGJ0X3Njb193aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBidF9zY29fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGJ0X3Njb19yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuZGFwbV93aWRnZXRzCQk9IGJ0X3Njb193aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYnRfc2NvX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gYnRfc2NvX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYnRfc2NvX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgYnRfc2NvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2NxOTN2Yy5jIGIvc291bmQvc29jL2NvZGVjcy9jcTkzdmMuYwppbmRleCAxYzg5NWE1Li43YTJkOWEyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2NxOTN2Yy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3E5M3ZjLmMKQEAgLTEzMSw4ICsxMzEsMTAgQEAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9jcTkzdmMgPSB7CiAJLnNldF9iaWFzX2xldmVsID0gY3E5M3ZjX3NldF9iaWFzX2xldmVsLAogCS5nZXRfcmVnbWFwID0gY3E5M3ZjX2dldF9yZWdtYXAsCi0JLmNvbnRyb2xzID0gY3E5M3ZjX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShjcTkzdmNfc25kX2NvbnRyb2xzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzID0gY3E5M3ZjX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoY3E5M3ZjX3NuZF9jb250cm9scyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgY3E5M3ZjX3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2NzMzVsMzIuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3MzNWwzMi5jCmluZGV4IDI4N2QxMzcuLjdlOTgwNjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3MzNWwzMi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3MzNWwzMi5jCkBAIC0yMzEsMTMgKzIzMSwxNCBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X2NzMzVsMzIgPSB7CiAJLnNldF9zeXNjbGsgPSBjczM1bDMyX2NvZGVjX3NldF9zeXNjbGssCiAKLQkuZGFwbV93aWRnZXRzID0gY3MzNWwzMl9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGNzMzVsMzJfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBjczM1bDMyX2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShjczM1bDMyX2F1ZGlvX21hcCksCi0KLQkuY29udHJvbHMgPSBjczM1bDMyX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShjczM1bDMyX3NuZF9jb250cm9scyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBjczM1bDMyX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGNzMzVsMzJfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBjczM1bDMyX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGNzMzVsMzJfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGNzMzVsMzJfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShjczM1bDMyX2F1ZGlvX21hcCksCisJfSwKIH07CiAKIC8qIEN1cnJlbnQgYW5kIHRocmVzaG9sZCBwb3dlcnVwIHNlcXVlbmNlIFBnMzcgaW4gZGF0YXNoZWV0ICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2NzMzVsMzMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3MzNWwzMy5jCmluZGV4IDZmOWMxYWQuLjZkZjI5ZmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3MzNWwzMy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3MzNWwzMy5jCkBAIC04MzcsMTMgKzgzNywxNCBAQAogCS5zZXRfYmlhc19sZXZlbCA9IGNzMzVsMzNfc2V0X2JpYXNfbGV2ZWwsCiAJLnNldF9zeXNjbGsgPSBjczM1bDMzX2NvZGVjX3NldF9zeXNjbGssCiAKLQkuZGFwbV93aWRnZXRzID0gY3MzNWwzM19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGNzMzVsMzNfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBjczM1bDMzX2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShjczM1bDMzX2F1ZGlvX21hcCksCi0JLmNvbnRyb2xzID0gY3MzNWwzM19zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoY3MzNWwzM19zbmRfY29udHJvbHMpLAotCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBjczM1bDMzX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGNzMzVsMzNfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBjczM1bDMzX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGNzMzVsMzNfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGNzMzVsMzNfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShjczM1bDMzX2F1ZGlvX21hcCksCisJfSwKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2NzNDI2NS5jIGIvc291bmQvc29jL2NvZGVjcy9jczQyNjUuYwppbmRleCA1NWRiMTlkLi5mZDk2NmJiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2NzNDI2NS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjY1LmMKQEAgLTU0NywxMyArNTQ3LDE0IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19jczQyNjUgPSB7CiAJLnNldF9iaWFzX2xldmVsID0gY3M0MjY1X3NldF9iaWFzX2xldmVsLAogCi0JLmRhcG1fd2lkZ2V0cyA9IGNzNDI2NV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGNzNDI2NV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGNzNDI2NV9hdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoY3M0MjY1X2F1ZGlvX21hcCksCi0KLQkuY29udHJvbHMgPSBjczQyNjVfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGNzNDI2NV9zbmRfY29udHJvbHMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gY3M0MjY1X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGNzNDI2NV9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGNzNDI2NV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShjczQyNjVfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGNzNDI2NV9hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGNzNDI2NV9hdWRpb19tYXApLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgY3M0MjY1X3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcwLmMgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDI3MC5jCmluZGV4IGUwNzgwN2QuLjE4YmFlYTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQyNzAuYwpAQCAtNjE3LDEyICs2MTcsMTQgQEAKIAkuc3VzcGVuZCA9CQljczQyNzBfc29jX3N1c3BlbmQsCiAJLnJlc3VtZSA9CQljczQyNzBfc29jX3Jlc3VtZSwKIAotCS5jb250cm9scyA9CQljczQyNzBfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPQkJQVJSQVlfU0laRShjczQyNzBfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0JCWNzNDI3MF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPQlBUlJBWV9TSVpFKGNzNDI3MF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9CQljczQyNzBfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9CUFSUkFZX1NJWkUoY3M0MjcwX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzID0JCWNzNDI3MF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMgPQkJQVJSQVlfU0laRShjczQyNzBfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cyA9CQljczQyNzBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cyA9CUFSUkFZX1NJWkUoY3M0MjcwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcyA9CQljczQyNzBfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMgPQlBUlJBWV9TSVpFKGNzNDI3MF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2NzNDI3MS5jIGIvc291bmQvc29jL2NvZGVjcy9jczQyNzEuYwppbmRleCAwYzAwMTBiLi44YzBmM2I4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2NzNDI3MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcxLmMKQEAgLTY0NSwxMiArNjQ1LDE0IEBACiAJLnN1c3BlbmQJCT0gY3M0MjcxX3NvY19zdXNwZW5kLAogCS5yZXN1bWUJCQk9IGNzNDI3MV9zb2NfcmVzdW1lLAogCi0JLmNvbnRyb2xzCQk9IGNzNDI3MV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGNzNDI3MV9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMJCT0gY3M0MjcxX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoY3M0MjcxX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzCQk9IGNzNDI3MV9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShjczQyNzFfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gY3M0MjcxX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGNzNDI3MV9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGNzNDI3MV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShjczQyNzFfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGNzNDI3MV9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoY3M0MjcxX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCBjczQyNzFfY29tbW9uX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw1MS5jIGIvc291bmQvc29jL2NvZGVjcy9jczQybDUxLmMKaW5kZXggMzU0ODhmMS4uOTZjZmUzOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jczQybDUxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQybDUxLmMKQEAgLTUwNywxMiArNTA3LDE0IEBACiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZpY2VfY3M0Mmw1MSA9IHsKIAkucHJvYmUgPSBjczQybDUxX2NvZGVjX3Byb2JlLAogCi0JLmNvbnRyb2xzID0gY3M0Mmw1MV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoY3M0Mmw1MV9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBjczQybDUxX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoY3M0Mmw1MV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGNzNDJsNTFfcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGNzNDJsNTFfcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGNzNDJsNTFfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoY3M0Mmw1MV9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGNzNDJsNTFfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoY3M0Mmw1MV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gY3M0Mmw1MV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGNzNDJsNTFfcm91dGVzKSwKKwl9LAogfTsKIAogY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgY3M0Mmw1MV9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNTIuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw1Mi5jCmluZGV4IDQ3Yjk3ZmMuLjBkOWM0YTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw1Mi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw1Mi5jCkBAIC0xMDU2LDEzICsxMDU2LDE0IEBACiAJLnNldF9iaWFzX2xldmVsID0gY3M0Mmw1Ml9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuZGFwbV93aWRnZXRzID0gY3M0Mmw1Ml9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGNzNDJsNTJfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBjczQybDUyX2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShjczQybDUyX2F1ZGlvX21hcCksCi0KLQkuY29udHJvbHMgPSBjczQybDUyX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShjczQybDUyX3NuZF9jb250cm9scyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBjczQybDUyX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGNzNDJsNTJfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBjczQybDUyX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGNzNDJsNTJfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGNzNDJsNTJfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShjczQybDUyX2F1ZGlvX21hcCksCisJfSwKIH07CiAKIC8qIEN1cnJlbnQgYW5kIHRocmVzaG9sZCBwb3dlcnVwIHNlcXVlbmNlIFBnMzcgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw1Ni5jIGIvc291bmQvc29jL2NvZGVjcy9jczQybDU2LmMKaW5kZXggZWVjMWZmOC4uNTRjMTc2OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jczQybDU2LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQybDU2LmMKQEAgLTExMjEsMTMgKzExMjEsMTQgQEAKIAkuc2V0X2JpYXNfbGV2ZWwgPSBjczQybDU2X3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5kYXBtX3dpZGdldHMgPSBjczQybDU2X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoY3M0Mmw1Nl9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGNzNDJsNTZfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGNzNDJsNTZfYXVkaW9fbWFwKSwKLQotCS5jb250cm9scyA9IGNzNDJsNTZfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGNzNDJsNTZfc25kX2NvbnRyb2xzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGNzNDJsNTZfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoY3M0Mmw1Nl9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGNzNDJsNTZfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoY3M0Mmw1Nl9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gY3M0Mmw1Nl9hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGNzNDJsNTZfYXVkaW9fbWFwKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGNzNDJsNTZfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jczQybDczLmMgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNzMuYwppbmRleCA0MmE4ZmQ0Li43MWJhNTYwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNzMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNzMuYwpAQCAtNzk0LDcgKzc5NCw3IEBACiAJdTggbW1jYzsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY3M0Mmw3M19tY2xrX2RpdiBjczQybDczX21jbGtfY29lZmZzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGNzNDJsNzNfbWNsa19kaXYgY3M0Mmw3M19tY2xrX2NvZWZmc1tdID0gewogCS8qIE1DTEssIFNhbXBsZSBSYXRlLCB4TU1DQ1s1OjBdICovCiAJezU2NDQ4MDAsIDExMDI1LCAweDMwfSwKIAl7NTY0NDgwMCwgMjIwNTAsIDB4MjB9LApAQCAtODQ0LDcgKzg0NCw3IEBACiAJdTggbWNsa2RpdjsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY3M0Mmw3M19tY2xreF9kaXYgY3M0Mmw3M19tY2xreF9jb2VmZnNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3M0Mmw3M19tY2xreF9kaXYgY3M0Mmw3M19tY2xreF9jb2VmZnNbXSA9IHsKIAl7NTY0NDgwMCwgIDEsIDB9LAkvKiA1NjQ0ODAwICovCiAJezYwMDAwMDAsICAxLCAwfSwJLyogNjAwMDAwMCAqLwogCXs2MTQ0MDAwLCAgMSwgMH0sCS8qIDYxNDQwMDAgKi8KQEAgLTEyNTcsMTMgKzEyNTcsMTQgQEAKIAkuc2V0X2JpYXNfbGV2ZWwgPSBjczQybDczX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5kYXBtX3dpZGdldHMgPSBjczQybDczX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoY3M0Mmw3M19kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGNzNDJsNzNfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGNzNDJsNzNfYXVkaW9fbWFwKSwKLQotCS5jb250cm9scyA9IGNzNDJsNzNfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGNzNDJsNzNfc25kX2NvbnRyb2xzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGNzNDJsNzNfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoY3M0Mmw3M19zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGNzNDJsNzNfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoY3M0Mmw3M19kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gY3M0Mmw3M19hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGNzNDJsNzNfYXVkaW9fbWFwKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGNzNDJsNzNfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jczQyeHg4LmMgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDJ4eDguYwppbmRleCAxMTc5MTAxYi4uYjRkODczNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jczQyeHg4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQyeHg4LmMKQEAgLTQxMSwxMiArNDExLDE0IEBACiAJLnByb2JlID0gY3M0Mnh4OF9jb2RlY19wcm9iZSwKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSBjczQyeHg4X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShjczQyeHg4X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IGNzNDJ4eDhfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShjczQyeHg4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gY3M0Mnh4OF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShjczQyeHg4X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGNzNDJ4eDhfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoY3M0Mnh4OF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGNzNDJ4eDhfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoY3M0Mnh4OF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gY3M0Mnh4OF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoY3M0Mnh4OF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIGNvbnN0IHN0cnVjdCBjczQyeHg4X2RyaXZlcl9kYXRhIGNzNDI0NDhfZGF0YSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0MzQ5LmMgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDM0OS5jCmluZGV4IDBhYzhmYzUuLjIzMWNhOTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0MzQ5LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQzNDkuYwpAQCAtMjU2LDEzICsyNTYsMTQgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9jczQzNDkgPSB7Ci0JLmNvbnRyb2xzCQk9IGNzNDM0OV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGNzNDM0OV9zbmRfY29udHJvbHMpLAotCi0JLmRhcG1fd2lkZ2V0cwkJPSBjczQzNDlfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShjczQzNDlfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMJCT0gY3M0MzQ5X3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShjczQzNDlfcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGNzNDM0OV9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShjczQzNDlfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBjczQzNDlfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoY3M0MzQ5X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBjczQzNDlfcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShjczQzNDlfcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGNzNDM0OV9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2NzNDdsMjQuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0N2wyNC5jCmluZGV4IDk1NGE0ZjUuLjViMjI1NjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0N2wyNC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0N2wyNC5jCkBAIC03NDYsNiArNzQ2LDE2IEBACiAJeyAiSU4yTCIsIE5VTEwsICJTWVNDTEsiIH0sCiAJeyAiSU4yUiIsIE5VTEwsICJTWVNDTEsiIH0sCiAKKwl7ICJBU1JDMUwiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIkFTUkMxUiIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiQVNSQzJMIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBU1JDMlIiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCisJeyAiQVNSQzFMIiwgTlVMTCwgIkFTWU5DQ0xLIiB9LAorCXsgIkFTUkMxUiIsIE5VTEwsICJBU1lOQ0NMSyIgfSwKKwl7ICJBU1JDMkwiLCBOVUxMLCAiQVNZTkNDTEsiIH0sCisJeyAiQVNSQzJSIiwgTlVMTCwgIkFTWU5DQ0xLIiB9LAorCiAJeyAiTUlDQklBUzEiLCBOVUxMLCAiTUlDVkREIiB9LAogCXsgIk1JQ0JJQVMyIiwgTlVMTCwgIk1JQ1ZERCIgfSwKIApAQCAtODA0LDcgKzgxNCw2IEBACiAJeyAiQUlGMyBDYXB0dXJlIiwgTlVMTCwgIlNZU0NMSyIgfSwKIAogCXsgIlZvaWNlIENvbnRyb2wgRFNQIiwgTlVMTCwgIkRTUDMiIH0sCi0JeyAiVm9pY2UgQ29udHJvbCBEU1AiLCBOVUxMLCAiU1lTQ0xLIiB9LAogCiAJeyAiSU4xTCBQR0EiLCBOVUxMLCAiSU4xTCIgfSwKIAl7ICJJTjFSIFBHQSIsIE5VTEwsICJJTjFSIiB9LApAQCAtODEzLDcgKzgyMiw2IEBACiAJeyAiSU4yUiBQR0EiLCBOVUxMLCAiSU4yUiIgfSwKIAogCXsgIkF1ZGlvIFRyYWNlIERTUCIsIE5VTEwsICJEU1AyIiB9LAotCXsgIkF1ZGlvIFRyYWNlIERTUCIsIE5VTEwsICJTWVNDTEsiIH0sCiAKIAlBUklaT05BX01JWEVSX1JPVVRFUygiT1VUMUwiLCAiSFBPVVQxTCIpLAogCUFSSVpPTkFfTUlYRVJfUk9VVEVTKCJPVVQxUiIsICJIUE9VVDFSIiksCkBAIC0xMTkwLDEyICsxMTk4LDE0IEBACiAJLnNldF9zeXNjbGsgPSBhcml6b25hX3NldF9zeXNjbGssCiAJLnNldF9wbGwgPSBjczQ3bDI0X3NldF9mbGwsCiAKLQkuY29udHJvbHMgPSBjczQ3bDI0X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShjczQ3bDI0X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IGNzNDdsMjRfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShjczQ3bDI0X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gY3M0N2wyNF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShjczQ3bDI0X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGNzNDdsMjRfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoY3M0N2wyNF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGNzNDdsMjRfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoY3M0N2wyNF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gY3M0N2wyNF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoY3M0N2wyNF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2NvbXByX29wcyBjczQ3bDI0X2NvbXByX29wcyA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M1M2wzMC5jIGIvc291bmQvc29jL2NvZGVjcy9jczUzbDMwLmMKaW5kZXggMmMwZDljNC4uY2I0N2ZiNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jczUzbDMwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczUzbDMwLmMKQEAgLTQ2Niw3ICs0NjYsNyBAQAogCXU4IG1jbGtfaW50X3NjYWxlOwogfTsKIAotc3RhdGljIHN0cnVjdCBjczUzbDMwX21jbGtfZGl2IGNzNTNsMzBfbWNsa19jb2VmZnNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3M1M2wzMF9tY2xrX2RpdiBjczUzbDMwX21jbGtfY29lZmZzW10gPSB7CiAJLyogTk9URTogRW5hYmxlIE1DTEtfSU5UX1NDQUxFIHRvIHNhdmUgcG93ZXIuICovCiAKIAkvKiBNQ0xLLCBTYW1wbGUgUmF0ZSwgYXNwX3JhdGUsIGludGVybmFsX2ZzX3JhdGlvLCBtY2xrX2ludF9zY2FsZSAqLwpAQCAtNTExLDcgKzUxMSw3IEBACiAJdTggbWNsa2RpdjsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY3M1M2wzMF9tY2xreF9kaXYgY3M1M2wzMF9tY2xreF9jb2VmZnNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3M1M2wzMF9tY2xreF9kaXYgY3M1M2wzMF9tY2xreF9jb2VmZnNbXSA9IHsKIAl7NTY0NDgwMCwgIDEsIENTNTNMMzBfTUNMS19ESVZfQllfMX0sCiAJezYwMDAwMDAsICAxLCBDUzUzTDMwX01DTEtfRElWX0JZXzF9LAogCXs2MTQ0MDAwLCAgMSwgQ1M1M0wzMF9NQ0xLX0RJVl9CWV8xfSwKQEAgLTg5NywxMyArODk3LDE0IEBACiAJLnNldF9iaWFzX2xldmVsID0gY3M1M2wzMF9zZXRfYmlhc19sZXZlbCwKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCiAKLQkuZGFwbV93aWRnZXRzID0gY3M1M2wzMF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGNzNTNsMzBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBjczUzbDMwX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGNzNTNsMzBfZGFwbV9yb3V0ZXMpLAotCi0JLmNvbnRyb2xzID0gY3M1M2wzMF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoY3M1M2wzMF9zbmRfY29udHJvbHMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gY3M1M2wzMF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShjczUzbDMwX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gY3M1M2wzMF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShjczUzbDMwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBjczUzbDMwX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShjczUzbDMwX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIHN0cnVjdCByZWdtYXBfY29uZmlnIGNzNTNsMzBfcmVnbWFwID0gewpAQCAtOTk5LDggKzEwMDAsOCBAQAogCS8qIENoZWNrIGlmIE1DTEsgcHJvdmlkZWQgKi8KIAljczUzbDMwLT5tY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgIm1jbGsiKTsKIAlpZiAoSVNfRVJSKGNzNTNsMzAtPm1jbGspKSB7Ci0JCWlmIChQVFJfRVJSKGNzNTNsMzAtPm1jbGspID09IC1FUFJPQkVfREVGRVIpIHsKLQkJCXJldCA9IC1FUFJPQkVfREVGRVI7CisJCWlmIChQVFJfRVJSKGNzNTNsMzAtPm1jbGspICE9IC1FTk9FTlQpIHsKKwkJCXJldCA9IFBUUl9FUlIoY3M1M2wzMC0+bWNsayk7CiAJCQlnb3RvIGVycm9yOwogCQl9CiAJCS8qIE90aGVyd2lzZSBtYXJrIHRoZSBtY2xrIHBvaW50ZXIgdG8gTlVMTCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jeDIwNDQyLmMgYi9zb3VuZC9zb2MvY29kZWNzL2N4MjA0NDIuYwppbmRleCBmYjM4ODVmLi4yYzEyNDcxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2N4MjA0NDIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2N4MjA0NDIuYwpAQCAtNDA3LDEwICs0MDcsMTIgQEAKIAkucmVnX3dvcmRfc2l6ZSA9IHNpemVvZih1OCksCiAJLnJlYWQgPSBjeDIwNDQyX3JlYWRfcmVnX2NhY2hlLAogCS53cml0ZSA9IGN4MjA0NDJfd3JpdGUsCi0JLmRhcG1fd2lkZ2V0cyA9IGN4MjA0NDJfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShjeDIwNDQyX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gY3gyMDQ0Ml9hdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoY3gyMDQ0Ml9hdWRpb19tYXApLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuZGFwbV93aWRnZXRzCQk9IGN4MjA0NDJfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoY3gyMDQ0Ml9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gY3gyMDQ0Ml9hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGN4MjA0NDJfYXVkaW9fbWFwKSwKKwl9LAogfTsKIAogc3RhdGljIGludCBjeDIwNDQyX3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2RhNzIxMC5jIGIvc291bmQvc29jL2NvZGVjcy9kYTcyMTAuYwppbmRleCBhZjIzYTYxLi4xNzA1M2RmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2RhNzIxMC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjEwLmMKQEAgLTExNjcsMTMgKzExNjcsMTQgQEAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9kYTcyMTAgPSB7CiAJLnByb2JlCQkJPSBkYTcyMTBfcHJvYmUsCiAKLQkuY29udHJvbHMJCT0gZGE3MjEwX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoZGE3MjEwX3NuZF9jb250cm9scyksCi0KLQkuZGFwbV93aWRnZXRzCQk9IGRhNzIxMF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGRhNzIxMF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcwkJPSBkYTcyMTBfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGRhNzIxMF9hdWRpb19tYXApLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gZGE3MjEwX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGRhNzIxMF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGRhNzIxMF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShkYTcyMTBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGRhNzIxMF9hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGRhNzIxMF9hdWRpb19tYXApLAorCX0sCiB9OwogCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSTJDKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9kYTcyMTMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjEzLmMKaW5kZXggZTU1MjdiYy4uMTJkYTU1OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9kYTcyMTMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2RhNzIxMy5jCkBAIC03NTAsMTEgKzc1MCwxOCBAQAogCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBEQTcyMTNfUENfQ09VTlQsCiAJCQkJICAgIERBNzIxM19QQ19GUkVFUlVOX01BU0ssIDApOwogCi0JCS8qIFNsYXZlIG1vZGUsIGlmIFNSTSBub3QgZW5hYmxlZCBubyBuZWVkIGZvciBzdGF0dXMgY2hlY2tzICovCisJCS8qIElmIFNSTSBub3QgZW5hYmxlZCB0aGVuIG5vdGhpbmcgbW9yZSB0byBkbyAqLwogCQlwbGxfY3RybCA9IHNuZF9zb2NfcmVhZChjb2RlYywgREE3MjEzX1BMTF9DVFJMKTsKIAkJaWYgKCEocGxsX2N0cmwgJiBEQTcyMTNfUExMX1NSTV9FTikpCiAJCQlyZXR1cm4gMDsKIAorCQkvKiBBc3Npc3QgMzJLSHogbW9kZSBQTEwgbG9jayAqLworCQlpZiAocGxsX2N0cmwgJiBEQTcyMTNfUExMXzMyS19NT0RFKSB7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCAweEYwLCAweDhCKTsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIDB4RjIsIDB4MDMpOworCQkJc25kX3NvY193cml0ZShjb2RlYywgMHhGMCwgMHgwMCk7CisJCX0KKwogCQkvKiBDaGVjayBTUk0gaGFzIGxvY2tlZCAqLwogCQlkbyB7CiAJCQlwbGxfc3RhdHVzID0gc25kX3NvY19yZWFkKGNvZGVjLCBEQTcyMTNfUExMX1NUQVRVUyk7CkBAIC03NzEsNiArNzc4LDE0IEBACiAKIAkJcmV0dXJuIDA7CiAJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTUQ6CisJCS8qIFJldmVydCAzMktIeiBQTEwgbG9jayB1ZHBhdGVzIGlmIGFwcGxpZWQgcHJldmlvdXNseSAqLworCQlwbGxfY3RybCA9IHNuZF9zb2NfcmVhZChjb2RlYywgREE3MjEzX1BMTF9DVFJMKTsKKwkJaWYgKHBsbF9jdHJsICYgREE3MjEzX1BMTF8zMktfTU9ERSkgeworCQkJc25kX3NvY193cml0ZShjb2RlYywgMHhGMCwgMHg4Qik7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCAweEYyLCAweDAxKTsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIDB4RjAsIDB4MDApOworCQl9CisKIAkJLyogUEMgZnJlZS1ydW5uaW5nICovCiAJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzIxM19QQ19DT1VOVCwKIAkJCQkgICAgREE3MjEzX1BDX0ZSRUVSVU5fTUFTSywKQEAgLTEyNDcsOCArMTI2Miw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCS8qIEJ5IGRlZmF1bHQgb25seSAzMiBCQ0xLIHBlciBXQ0xLIGlzIHN1cHBvcnRlZCAqLwotCWRhaV9jbGtfbW9kZSB8PSBEQTcyMTNfREFJX0JDTEtTX1BFUl9XQ0xLXzMyOworCS8qIEJ5IGRlZmF1bHQgb25seSA2NCBCQ0xLIHBlciBXQ0xLIGlzIHN1cHBvcnRlZCAqLworCWRhaV9jbGtfbW9kZSB8PSBEQTcyMTNfREFJX0JDTEtTX1BFUl9XQ0xLXzY0OwogCiAJc25kX3NvY193cml0ZShjb2RlYywgREE3MjEzX0RBSV9DTEtfTU9ERSwgZGFpX2Nsa19tb2RlKTsKIAlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBEQTcyMTNfREFJX0NUUkwsIERBNzIxM19EQUlfRk9STUFUX01BU0ssCkBAIC0xMjk3LDEwICsxMzEyLDEzIEBACiAKIAlzd2l0Y2ggKGNsa19pZCkgewogCWNhc2UgREE3MjEzX0NMS1NSQ19NQ0xLOgotCQlkYTcyMTMtPm1jbGtfc3F1YXJlcl9lbiA9IGZhbHNlOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBEQTcyMTNfUExMX0NUUkwsCisJCQkJICAgIERBNzIxM19QTExfTUNMS19TUVJfRU4sIDApOwogCQlicmVhazsKIAljYXNlIERBNzIxM19DTEtTUkNfTUNMS19TUVI6Ci0JCWRhNzIxMy0+bWNsa19zcXVhcmVyX2VuID0gdHJ1ZTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjEzX1BMTF9DVFJMLAorCQkJCSAgICBEQTcyMTNfUExMX01DTEtfU1FSX0VOLAorCQkJCSAgICBEQTcyMTNfUExMX01DTEtfU1FSX0VOKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2Vycihjb2RlY19kYWktPmRldiwgIlVua25vd24gY2xvY2sgc291cmNlICVkXG4iLCBjbGtfaWQpOwpAQCAtMTMyNCw3ICsxMzQyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogU3VwcG9ydGVkIFBMTCBpbnB1dCBmcmVxdWVuY2llcyBhcmUgNU1IeiAtIDU0TUh6LiAqLworLyogU3VwcG9ydGVkIFBMTCBpbnB1dCBmcmVxdWVuY2llcyBhcmUgMzJLSHosIDVNSHogLSA1NE1Iei4gKi8KIHN0YXRpYyBpbnQgZGE3MjEzX3NldF9kYWlfcGxsKHN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpLCBpbnQgcGxsX2lkLAogCQkJICAgICAgaW50IHNvdXJjZSwgdW5zaWduZWQgaW50IGZyZWYsIHVuc2lnbmVkIGludCBmb3V0KQogewpAQCAtMTMzNiwyMiArMTM1NCwyNiBAQAogCXUzMiBmcmVxX3JlZjsKIAl1NjQgZnJhY19kaXY7CiAKLQkvKiBSZXNldCBQTEwgY29uZmlndXJhdGlvbiAqLwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxM19QTExfQ1RSTCwgMCk7Ci0KLQlwbGxfY3RybCA9IDA7Ci0KIAkvKiBXb3Jrb3V0IGlucHV0IGRpdmlkZXIgYmFzZWQgb24gTUNMSyByYXRlICovCiAJaWYgKGRhNzIxMy0+bWNsa19yYXRlID09IDMyNzY4KSB7CisJCWlmICghZGE3MjEzLT5tYXN0ZXIpIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkiMzJLSHogb25seSB2YWxpZCBpZiBjb2RlYyBpcyBjbG9jayBtYXN0ZXJcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwogCQkvKiAzMktIeiBQTEwgTW9kZSAqLwogCQlpbmRpdl9iaXRzID0gREE3MjEzX1BMTF9JTkRJVl85X1RPXzE4X01IWjsKIAkJaW5kaXYgPSBEQTcyMTNfUExMX0lORElWXzlfVE9fMThfTUhaX1ZBTDsKKwkJc291cmNlID0gREE3MjEzX1NZU0NMS19QTExfMzJLSFo7CiAJCWZyZXFfcmVmID0gMzc1MDAwMDsKLQkJcGxsX2N0cmwgfD0gREE3MjEzX1BMTF8zMktfTU9ERTsKKwogCX0gZWxzZSB7Ci0JCS8qIDUgLSA1NE1IeiBNQ0xLICovCiAJCWlmIChkYTcyMTMtPm1jbGtfcmF0ZSA8IDUwMDAwMDApIHsKLQkJCWdvdG8gcGxsX2VycjsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkiUExMIGlucHV0IGNsb2NrICVkIGJlbG93IHZhbGlkIHJhbmdlXG4iLAorCQkJCWRhNzIxMy0+bWNsa19yYXRlKTsKKwkJCXJldHVybiAtRUlOVkFMOwogCQl9IGVsc2UgaWYgKGRhNzIxMy0+bWNsa19yYXRlIDw9IDkwMDAwMDApIHsKIAkJCWluZGl2X2JpdHMgPSBEQTcyMTNfUExMX0lORElWXzVfVE9fOV9NSFo7CiAJCQlpbmRpdiA9IERBNzIxM19QTExfSU5ESVZfNV9UT185X01IWl9WQUw7CkBAIC0xMzY1LDMxICsxMzg3LDQzIEBACiAJCQlpbmRpdl9iaXRzID0gREE3MjEzX1BMTF9JTkRJVl8zNl9UT181NF9NSFo7CiAJCQlpbmRpdiA9IERBNzIxM19QTExfSU5ESVZfMzZfVE9fNTRfTUhaX1ZBTDsKIAkJfSBlbHNlIHsKLQkJCWdvdG8gcGxsX2VycjsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkiUExMIGlucHV0IGNsb2NrICVkIGFib3ZlIHZhbGlkIHJhbmdlXG4iLAorCQkJCWRhNzIxMy0+bWNsa19yYXRlKTsKKwkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWZyZXFfcmVmID0gKGRhNzIxMy0+bWNsa19yYXRlIC8gaW5kaXYpOwogCX0KIAotCXBsbF9jdHJsIHw9IGluZGl2X2JpdHM7CisJcGxsX2N0cmwgPSBpbmRpdl9iaXRzOwogCi0JLyogUExMIEJ5cGFzcyBtb2RlICovCi0JaWYgKHNvdXJjZSA9PSBEQTcyMTNfU1lTQ0xLX01DTEspIHsKLQkJc25kX3NvY193cml0ZShjb2RlYywgREE3MjEzX1BMTF9DVFJMLCBwbGxfY3RybCk7CisJLyogQ29uZmlndXJlIFBMTCAqLworCXN3aXRjaCAoc291cmNlKSB7CisJY2FzZSBEQTcyMTNfU1lTQ0xLX01DTEs6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzIxM19QTExfQ1RSTCwKKwkJCQkgICAgREE3MjEzX1BMTF9JTkRJVl9NQVNLIHwKKwkJCQkgICAgREE3MjEzX1BMTF9NT0RFX01BU0ssIHBsbF9jdHJsKTsKIAkJcmV0dXJuIDA7Ci0JfQotCi0JLyoKLQkgKiBJZiBDb2RlYyBpcyBzbGF2ZSBhbmQgU1JNIGVuYWJsZWQsCi0JICogZnJlcV9vdXQgaXMgKDk4MzA0MDAwICsgOTAzMTY4MDApLzIgPSA5NDMxMDQwMAotCSAqLwotCWlmICghZGE3MjEzLT5tYXN0ZXIgJiYgZGE3MjEzLT5zcm1fZW4pIHsKLQkJZm91dCA9IERBNzIxM19QTExfRlJFUV9PVVRfOTQzMTA0MDA7CisJY2FzZSBEQTcyMTNfU1lTQ0xLX1BMTDoKKwkJYnJlYWs7CisJY2FzZSBEQTcyMTNfU1lTQ0xLX1BMTF9TUk06CiAJCXBsbF9jdHJsIHw9IERBNzIxM19QTExfU1JNX0VOOwotCX0KKwkJZm91dCA9IERBNzIxM19QTExfRlJFUV9PVVRfOTQzMTA0MDA7CisJCWJyZWFrOworCWNhc2UgREE3MjEzX1NZU0NMS19QTExfMzJLSFo6CisJCWlmIChkYTcyMTMtPm1jbGtfcmF0ZSAhPSAzMjc2OCkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAorCQkJCSIzMktIeiBtb2RlIG9ubHkgdmFsaWQgd2l0aCAzMktIeiBNQ0xLXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CiAKLQkvKiBFbmFibGUgTUNMSyBzcXVhcmVyIGlmIHJlcXVpcmVkICovCi0JaWYgKGRhNzIxMy0+bWNsa19zcXVhcmVyX2VuKQotCQlwbGxfY3RybCB8PSBEQTcyMTNfUExMX01DTEtfU1FSX0VOOworCQlwbGxfY3RybCB8PSBEQTcyMTNfUExMXzMyS19NT0RFIHwgREE3MjEzX1BMTF9TUk1fRU47CisJCWZvdXQgPSBEQTcyMTNfUExMX0ZSRVFfT1VUXzk0MzEwNDAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJJbnZhbGlkIFBMTCBjb25maWdcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAkvKiBDYWxjdWxhdGUgZGl2aWRlcnMgZm9yIFBMTCAqLwogCXBsbF9pbnRlZ2VyID0gZm91dCAvIGZyZXFfcmVmOwpAQCAtMTQwNSwxNCArMTQzOSwxOSBAQAogCiAJLyogRW5hYmxlIFBMTCAqLwogCXBsbF9jdHJsIHw9IERBNzIxM19QTExfRU47Ci0Jc25kX3NvY193cml0ZShjb2RlYywgREE3MjEzX1BMTF9DVFJMLCBwbGxfY3RybCk7CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjEzX1BMTF9DVFJMLAorCQkJICAgIERBNzIxM19QTExfSU5ESVZfTUFTSyB8IERBNzIxM19QTExfTU9ERV9NQVNLLAorCQkJICAgIHBsbF9jdHJsKTsKKworCS8qIEFzc2lzdCAzMktIeiBtb2RlIFBMTCBsb2NrICovCisJaWYgKHNvdXJjZSA9PSBEQTcyMTNfU1lTQ0xLX1BMTF8zMktIWikgeworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCAweEYwLCAweDhCKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgMHhGMSwgMHgwMyk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIDB4RjEsIDB4MDEpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCAweEYwLCAweDAwKTsKKwl9CiAKIAlyZXR1cm4gMDsKLQotcGxsX2VycjoKLQlkZXZfZXJyKGNvZGVjX2RhaS0+ZGV2LCAiVW5zdXBwb3J0ZWQgUExMIGlucHV0IGZyZXF1ZW5jeSAlZFxuIiwKLQkJZGE3MjEzLT5tY2xrX3JhdGUpOwotCXJldHVybiAtRUlOVkFMOwogfQogCiAvKiBEQUkgb3BlcmF0aW9ucyAqLwpAQCAtMTQ1NCwxMSArMTQ5MywxMCBAQAogCiAJc3dpdGNoIChsZXZlbCkgewogCWNhc2UgU05EX1NPQ19CSUFTX09OOgotCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CiAJCWJyZWFrOwotCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6Ci0JCWlmIChzbmRfc29jX2NvZGVjX2dldF9iaWFzX2xldmVsKGNvZGVjKSA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7Ci0JCQkvKiBNQ0xLICovCisJY2FzZSBTTkRfU09DX0JJQVNfUFJFUEFSRToKKwkJLyogRW5hYmxlIE1DTEsgZm9yIHRyYW5zaXRpb24gdG8gT04gc3RhdGUgKi8KKwkJaWYgKHNuZF9zb2NfY29kZWNfZ2V0X2JpYXNfbGV2ZWwoY29kZWMpID09IFNORF9TT0NfQklBU19TVEFOREJZKSB7CiAJCQlpZiAoZGE3MjEzLT5tY2xrKSB7CiAJCQkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGRhNzIxMy0+bWNsayk7CiAJCQkJaWYgKHJldCkgewpAQCAtMTQ2NywyMSArMTUwNSwyNCBAQAogCQkJCQlyZXR1cm4gcmV0OwogCQkJCX0KIAkJCX0KLQorCQl9CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CisJCWlmIChzbmRfc29jX2NvZGVjX2dldF9iaWFzX2xldmVsKGNvZGVjKSA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CiAJCQkvKiBFbmFibGUgVk1JRCByZWZlcmVuY2UgJiBtYXN0ZXIgYmlhcyAqLwogCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjEzX1JFRkVSRU5DRVMsCiAJCQkJCSAgICBEQTcyMTNfVk1JRF9FTiB8IERBNzIxM19CSUFTX0VOLAogCQkJCQkgICAgREE3MjEzX1ZNSURfRU4gfCBEQTcyMTNfQklBU19FTik7CisJCX0gZWxzZSB7CisJCQkvKiBSZW1vdmUgTUNMSyAqLworCQkJaWYgKGRhNzIxMy0+bWNsaykKKwkJCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZGE3MjEzLT5tY2xrKTsKIAkJfQogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19PRkY6CiAJCS8qIERpc2FibGUgVk1JRCByZWZlcmVuY2UgJiBtYXN0ZXIgYmlhcyAqLwogCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBEQTcyMTNfUkVGRVJFTkNFUywKIAkJCQkgICAgREE3MjEzX1ZNSURfRU4gfCBEQTcyMTNfQklBU19FTiwgMCk7Ci0KLQkJLyogTUNMSyAqLwotCQlpZiAoZGE3MjEzLT5tY2xrKQotCQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRhNzIxMy0+bWNsayk7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gMDsKQEAgLTE2MDUsOSArMTY0Niw2IEBACiAJCQkgICAgREE3MjEzX0FMQ19DQUxJQl9NT0RFX01BTiwgMCk7CiAJZGE3MjEzLT5hbGNfY2FsaWJfYXV0byA9IHRydWU7CiAKLQkvKiBEZWZhdWx0IHRvIHVzaW5nIFNSTSBmb3Igc2xhdmUgbW9kZSAqLwotCWRhNzIxMy0+c3JtX2VuID0gdHJ1ZTsKLQogCS8qIERlZmF1bHQgUEMgY291bnRlciB0byBmcmVlLXJ1bm5pbmcgKi8KIAlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBEQTcyMTNfUENfQ09VTlQsIERBNzIxM19QQ19GUkVFUlVOX01BU0ssCiAJCQkgICAgREE3MjEzX1BDX0ZSRUVSVU5fTUFTSyk7CkBAIC0xNzQwLDEzICsxNzc4LDE0IEBACiAJLnByb2JlCQkJPSBkYTcyMTNfcHJvYmUsCiAJLnNldF9iaWFzX2xldmVsCQk9IGRhNzIxM19zZXRfYmlhc19sZXZlbCwKIAotCS5jb250cm9scwkJPSBkYTcyMTNfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShkYTcyMTNfc25kX2NvbnRyb2xzKSwKLQotCS5kYXBtX3dpZGdldHMJCT0gZGE3MjEzX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoZGE3MjEzX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzCQk9IGRhNzIxM19hdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoZGE3MjEzX2F1ZGlvX21hcCksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBkYTcyMTNfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoZGE3MjEzX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gZGE3MjEzX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGRhNzIxM19kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gZGE3MjEzX2F1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoZGE3MjEzX2F1ZGlvX21hcCksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBkYTcyMTNfcmVnbWFwX2NvbmZpZyA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjEzLmggYi9zb3VuZC9zb2MvY29kZWNzL2RhNzIxMy5oCmluZGV4IGZiYjdhMzUuLjE2ZWY1NmYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjEzLmgKKysrIGIvc291bmQvc29jL2NvZGVjcy9kYTcyMTMuaApAQCAtMTcyLDYgKzE3Miw3IEBACiAjZGVmaW5lIERBNzIxM19QTExfMzJLX01PREUJCQkJCSgweDEgPDwgNSkKICNkZWZpbmUgREE3MjEzX1BMTF9TUk1fRU4JCQkJCSgweDEgPDwgNikKICNkZWZpbmUgREE3MjEzX1BMTF9FTgkJCQkJCSgweDEgPDwgNykKKyNkZWZpbmUgREE3MjEzX1BMTF9NT0RFX01BU0sJCQkJCSgweDcgPDwgNSkKIAogLyogREE3MjEzX0RBSV9DTEtfTU9ERSA9IDB4MjggKi8KICNkZWZpbmUgREE3MjEzX0RBSV9CQ0xLU19QRVJfV0NMS18zMgkJCQkoMHgwIDw8IDApCkBAIC00OTksOCArNTAwLDYgQEAKICNkZWZpbmUgREE3MjEzX0FMQ19BVkdfSVRFUkFUSU9OUwk1CiAKIC8qIFBMTCByZWxhdGVkICovCi0jZGVmaW5lIERBNzIxM19TWVNDTEtfTUNMSwkJCTAKLSNkZWZpbmUgREE3MjEzX1NZU0NMS19QTEwJCQkxCiAjZGVmaW5lIERBNzIxM19QTExfRlJFUV9PVVRfOTAzMTY4MDAJCTkwMzE2ODAwCiAjZGVmaW5lIERBNzIxM19QTExfRlJFUV9PVVRfOTgzMDQwMDAJCTk4MzA0MDAwCiAjZGVmaW5lIERBNzIxM19QTExfRlJFUV9PVVRfOTQzMTA0MDAJCTk0MzEwNDAwCkBAIC01MTUsNiArNTE0LDEzIEBACiAJREE3MjEzX0NMS1NSQ19NQ0xLX1NRUiwKIH07CiAKK2VudW0gZGE3MjEzX3N5c19jbGsgeworCURBNzIxM19TWVNDTEtfTUNMSyA9IDAsCisJREE3MjEzX1NZU0NMS19QTEwsCisJREE3MjEzX1NZU0NMS19QTExfU1JNLAorCURBNzIxM19TWVNDTEtfUExMXzMyS0haCit9OworCiAvKiBDb2RlYyBwcml2YXRlIGRhdGEgKi8KIHN0cnVjdCBkYTcyMTNfcHJpdiB7CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwpAQCAtNTIyLDggKzUyOCw2IEBACiAJdW5zaWduZWQgaW50IG1jbGtfcmF0ZTsKIAlpbnQgY2xrX3NyYzsKIAlib29sIG1hc3RlcjsKLQlib29sIG1jbGtfc3F1YXJlcl9lbjsKLQlib29sIHNybV9lbjsKIAlib29sIGFsY19jYWxpYl9hdXRvOwogCWJvb2wgYWxjX2VuOwogCXN0cnVjdCBkYTcyMTNfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2RhNzIxOC5jIGIvc291bmQvc29jL2NvZGVjcy9kYTcyMTguYwppbmRleCA5OWNlMjNlLi5jNjllOTc2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2RhNzIxOC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjE4LmMKQEAgLTE4MTksNyArMTgxOSw3IEBACiAJaWYgKGRhNzIxOC0+bWNsa19yYXRlID09IGZyZXEpCiAJCXJldHVybiAwOwogCi0JaWYgKCgoZnJlcSA8IDIwMDAwMDApICYmIChmcmVxICE9IDMyNzY4KSkgfHwgKGZyZXEgPiA1NDAwMDAwMCkpIHsKKwlpZiAoKGZyZXEgPCAyMDAwMDAwKSB8fCAoZnJlcSA+IDU0MDAwMDAwKSkgewogCQlkZXZfZXJyKGNvZGVjX2RhaS0+ZGV2LCAiVW5zdXBwb3J0ZWQgTUNMSyB2YWx1ZSAlZFxuIiwKIAkJCWZyZXEpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE4NjYsMTEgKzE4NjYsOCBAQAogCXUzMiBmcmVxX3JlZjsKIAl1NjQgZnJhY19kaXY7CiAKLQkvKiBWZXJpZnkgMzJLSHosIDJNSHogLSA1NE1IeiBNQ0xLIHByb3ZpZGVkLCBhbmQgc2V0IGlucHV0IGRpdmlkZXIgKi8KLQlpZiAoZGE3MjE4LT5tY2xrX3JhdGUgPT0gMzI3NjgpIHsKLQkJaW5kaXZfYml0cyA9IERBNzIxOF9QTExfSU5ESVZfOV9UT18xOF9NSFo7Ci0JCWluZGl2ID0gREE3MjE4X1BMTF9JTkRJVl85X1RPXzE4X01IWl9WQUw7Ci0JfSBlbHNlIGlmIChkYTcyMTgtPm1jbGtfcmF0ZSA8IDIwMDAwMDApIHsKKwkvKiBWZXJpZnkgMk1IeiAtIDU0TUh6IE1DTEsgcHJvdmlkZWQsIGFuZCBzZXQgaW5wdXQgZGl2aWRlciAqLworCWlmIChkYTcyMTgtPm1jbGtfcmF0ZSA8IDIwMDAwMDApIHsKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiUExMIGlucHV0IGNsb2NrICVkIGJlbG93IHZhbGlkIHJhbmdlXG4iLAogCQkJZGE3MjE4LT5tY2xrX3JhdGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE5MTEsOSArMTkwOCw2IEBACiAJY2FzZSBEQTcyMThfU1lTQ0xLX1BMTF9TUk06CiAJCXBsbF9jdHJsIHw9IERBNzIxOF9QTExfTU9ERV9TUk07CiAJCWJyZWFrOwotCWNhc2UgREE3MjE4X1NZU0NMS19QTExfMzJLSFo6Ci0JCXBsbF9jdHJsIHw9IERBNzIxOF9QTExfTU9ERV8zMktIWjsKLQkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSW52YWxpZCBQTEwgY29uZmlnXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yNTg5LDIwICsyNTgzLDIyIEBACiAKIAlzd2l0Y2ggKGxldmVsKSB7CiAJY2FzZSBTTkRfU09DX0JJQVNfT046Ci0JY2FzZSBTTkRfU09DX0JJQVNfUFJFUEFSRToKIAkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKLQkJaWYgKHNuZF9zb2NfY29kZWNfZ2V0X2JpYXNfbGV2ZWwoY29kZWMpID09IFNORF9TT0NfQklBU19PRkYpIHsKLQkJCS8qIE1DTEsgKi8KKwljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgorCQkvKiBFbmFibGUgTUNMSyBmb3IgdHJhbnNpdGlvbiB0byBPTiBzdGF0ZSAqLworCQlpZiAoc25kX3NvY19jb2RlY19nZXRfYmlhc19sZXZlbChjb2RlYykgPT0gU05EX1NPQ19CSUFTX1NUQU5EQlkpIHsKIAkJCWlmIChkYTcyMTgtPm1jbGspIHsKIAkJCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZGE3MjE4LT5tY2xrKTsKIAkJCQlpZiAocmV0KSB7Ci0JCQkJCWRldl9lcnIoY29kZWMtPmRldiwKLQkJCQkJCSJGYWlsZWQgdG8gZW5hYmxlIG1jbGtcbiIpOworCQkJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIG1jbGtcbiIpOwogCQkJCQlyZXR1cm4gcmV0OwogCQkJCX0KIAkJCX0KKwkJfQogCisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CisJCWlmIChzbmRfc29jX2NvZGVjX2dldF9iaWFzX2xldmVsKGNvZGVjKSA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CiAJCQkvKiBNYXN0ZXIgYmlhcyAqLwogCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjE4X1JFRkVSRU5DRVMsCiAJCQkJCSAgICBEQTcyMThfQklBU19FTl9NQVNLLApAQCAtMjYxMiw2ICsyNjA4LDEwIEBACiAJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBEQTcyMThfTERPX0NUUkwsCiAJCQkJCSAgICBEQTcyMThfTERPX0VOX01BU0ssCiAJCQkJCSAgICBEQTcyMThfTERPX0VOX01BU0spOworCQl9IGVsc2UgeworCQkJLyogUmVtb3ZlIE1DTEsgKi8KKwkJCWlmIChkYTcyMTgtPm1jbGspCisJCQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRhNzIxOC0+bWNsayk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgpAQCAtMjYyNSwxMCArMjYyNSw2IEBACiAJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBEQTcyMThfUkVGRVJFTkNFUywKIAkJCQkJICAgIERBNzIxOF9CSUFTX0VOX01BU0ssIDApOwogCQl9Ci0KLQkJLyogTUNMSyAqLwotCQlpZiAoZGE3MjE4LT5tY2xrKQotCQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRhNzIxOC0+bWNsayk7CiAJCWJyZWFrOwogCX0KIApAQCAtMzA0NSwxMyArMzA0MSwxNCBAQAogCS5yZXN1bWUJCQk9IGRhNzIxOF9yZXN1bWUsCiAJLnNldF9iaWFzX2xldmVsCQk9IGRhNzIxOF9zZXRfYmlhc19sZXZlbCwKIAotCS5jb250cm9scwkJPSBkYTcyMThfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShkYTcyMThfc25kX2NvbnRyb2xzKSwKLQotCS5kYXBtX3dpZGdldHMJCT0gZGE3MjE4X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoZGE3MjE4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzCQk9IGRhNzIxOF9hdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoZGE3MjE4X2F1ZGlvX21hcCksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBkYTcyMThfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoZGE3MjE4X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gZGE3MjE4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGRhNzIxOF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gZGE3MjE4X2F1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoZGE3MjE4X2F1ZGlvX21hcCksCisJfSwKIH07CiAKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9kYTcyMTguaCBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjE4LmgKaW5kZXggNDc3Y2QzNy4uNGY3ZWMyMSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9kYTcyMTguaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL2RhNzIxOC5oCkBAIC04ODgsNyArODg4LDYgQEAKICNkZWZpbmUgREE3MjE4X1BMTF9NT0RFX0JZUEFTUwkJKDB4MCA8PCA2KQogI2RlZmluZSBEQTcyMThfUExMX01PREVfTk9STUFMCQkoMHgxIDw8IDYpCiAjZGVmaW5lIERBNzIxOF9QTExfTU9ERV9TUk0JCSgweDIgPDwgNikKLSNkZWZpbmUgREE3MjE4X1BMTF9NT0RFXzMyS0haCQkoMHgzIDw8IDYpCiAKIC8qIERBNzIxOF9QTExfRlJBQ19UT1AgPSAweDkyICovCiAjZGVmaW5lIERBNzIxOF9QTExfRkJESVZfRlJBQ19UT1BfU0hJRlQJMApAQCAtMTM3MSw3ICsxMzcwLDYgQEAKIAlEQTcyMThfU1lTQ0xLX01DTEsgPSAwLAogCURBNzIxOF9TWVNDTEtfUExMLAogCURBNzIxOF9TWVNDTEtfUExMX1NSTSwKLQlEQTcyMThfU1lTQ0xLX1BMTF8zMktIWgogfTsKIAogZW51bSBkYTcyMThfZGV2X2lkIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjE5LWFhZC5jIGIvc291bmQvc29jL2NvZGVjcy9kYTcyMTktYWFkLmMKaW5kZXggZjAwNTdjZC4uMmI4OTE0ZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9kYTcyMTktYWFkLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9kYTcyMTktYWFkLmMKQEAgLTEzLDYgKzEzLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb3BlcnR5Lmg+CiAjaW5jbHVkZSA8bGludXgvcG1fd2FrZWlycS5oPgpAQCAtMTE0LDEzICsxMTUsMzggQEAKIAlzdHJ1Y3QgZGE3MjE5X3ByaXYgKmRhNzIxOSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCiAJdTE2IHRvbmVnZW5fZnJlcV9ocHRlc3Q7Ci0JdTggYWNjZGV0X2NmZzg7Ci0JaW50IHJlcG9ydCA9IDA7CisJdTggcGxsX3NybV9zdHMsIGdhaW5fcmFtcF9jdHJsLCBhY2NkZXRfY2ZnODsKKwlpbnQgcmVwb3J0ID0gMCwgcmV0ID0gMDsKIAogCS8qIExvY2sgREFQTSBhbmQgYW55IEtjb250cm9scyB0aGF0IGFyZSBhZmZlY3RlZCBieSB0aGlzIHRlc3QgKi8KIAlzbmRfc29jX2RhcG1fbXV0ZXhfbG9jayhkYXBtKTsKIAltdXRleF9sb2NrKCZkYTcyMTktPmxvY2spOwogCisJLyogRW5zdXJlIE1DTEsgaXMgYXZhaWxhYmxlIGZvciBIUCB0ZXN0IHByb2NlZHVyZSAqLworCWlmIChkYTcyMTktPm1jbGspIHsKKwkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGRhNzIxOS0+bWNsayk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBlbmFibGUgbWNsayAtICVkXG4iLCByZXQpOworCQkJbXV0ZXhfdW5sb2NrKCZkYTcyMTktPmxvY2spOworCQkJc25kX3NvY19kYXBtX211dGV4X3VubG9jayhkYXBtKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qCisJICogSWYgTUNMSyBub3QgcHJlc2VudCwgdGhlbiB3ZSdyZSB1c2luZyB0aGUgaW50ZXJuYWwgb3NjaWxsYXRvciBhbmQKKwkgKiByZXF1aXJlIGRpZmZlcmVudCBmcmVxdWVuY3kgc2V0dGluZ3MgdG8gYWNoaWV2ZSB0aGUgc2FtZSByZXN1bHQuCisJICovCisJcGxsX3NybV9zdHMgPSBzbmRfc29jX3JlYWQoY29kZWMsIERBNzIxOV9QTExfU1JNX1NUUyk7CisJaWYgKHBsbF9zcm1fc3RzICYgREE3MjE5X1BMTF9TUk1fU1RTX01DTEspCisJCXRvbmVnZW5fZnJlcV9ocHRlc3QgPSBjcHVfdG9fbGUxNihEQTcyMTlfQUFEX0hQVEVTVF9SQU1QX0ZSRVEpOworCWVsc2UKKwkJdG9uZWdlbl9mcmVxX2hwdGVzdCA9IGNwdV90b19sZTE2KERBNzIxOV9BQURfSFBURVNUX1JBTVBfRlJFUV9JTlRfT1NDKTsKKworCS8qIEVuc3VyZSBnYWluIHJhbXBpbmcgYXQgZmFzdGVzdCByYXRlICovCisJZ2Fpbl9yYW1wX2N0cmwgPSBzbmRfc29jX3JlYWQoY29kZWMsIERBNzIxOV9HQUlOX1JBTVBfQ1RSTCk7CisJc25kX3NvY193cml0ZShjb2RlYywgREE3MjE5X0dBSU5fUkFNUF9DVFJMLCBEQTcyMTlfR0FJTl9SQU1QX1JBVEVfWDgpOworCiAJLyogQnlwYXNzIGNhY2hlIHNvIGl0IHNhdmVzIGN1cnJlbnQgc2V0dGluZ3MgKi8KIAlyZWdjYWNoZV9jYWNoZV9ieXBhc3MoZGE3MjE5LT5yZWdtYXAsIHRydWUpOwogCkBAIC0xODMsOSArMjA5LDE1IEBACiAJc25kX3NvY193cml0ZShjb2RlYywgREE3MjE5X0hQX1JfQ1RSTCwKIAkJICAgICAgREE3MjE5X0hQX1JfQU1QX09FX01BU0sgfCBEQTcyMTlfSFBfUl9BTVBfRU5fTUFTSyk7CiAKKwkvKgorCSAqIElmIHdlJ3JlIHJ1bm5pbmcgZnJvbSB0aGUgaW50ZXJuYWwgb3NjaWxsYXRvciB0aGVuIGdpdmUgYXVkaW8gcGF0aHMKKwkgKiB0aW1lIHRvIHNldHRsZSBiZWZvcmUgcnVubmluZyB0ZXN0LgorCSAqLworCWlmICghKHBsbF9zcm1fc3RzICYgREE3MjE5X1BMTF9TUk1fU1RTX01DTEspKQorCQltc2xlZXAoREE3MjE5X0FBRF9IUFRFU1RfSU5UX09TQ19QQVRIX0RFTEFZKTsKKwogCS8qIENvbmZpZ3VyZSAmIHN0YXJ0IFRvbmUgR2VuZXJhdG9yICovCiAJc25kX3NvY193cml0ZShjb2RlYywgREE3MjE5X1RPTkVfR0VOX09OX1BFUiwgREE3MjE5X0JFRVBfT05fUEVSX01BU0spOwotCXRvbmVnZW5fZnJlcV9ocHRlc3QgPSBjcHVfdG9fbGUxNihEQTcyMTlfQUFEX0hQVEVTVF9SQU1QX0ZSRVEpOwogCXJlZ21hcF9yYXdfd3JpdGUoZGE3MjE5LT5yZWdtYXAsIERBNzIxOV9UT05FX0dFTl9GUkVRMV9MLAogCQkJICZ0b25lZ2VuX2ZyZXFfaHB0ZXN0LCBzaXplb2YodG9uZWdlbl9mcmVxX2hwdGVzdCkpOwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzIxOV9UT05FX0dFTl9DRkcyLApAQCAtMjQ0LDEyICsyNzYsMjYgQEAKIAlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBEQTcyMTlfQUNDREVUX0NPTkZJR184LAogCQkJICAgIERBNzIxOV9IUFRFU1RfRU5fTUFTSywgMCk7CiAKKwkvKgorCSAqIElmIHdlJ3JlIHJ1bm5pbmcgZnJvbSB0aGUgaW50ZXJuYWwgb3NjaWxsYXRvciB0aGVuIGdpdmUgYXVkaW8gcGF0aHMKKwkgKiB0aW1lIHRvIHNldHRsZSBiZWZvcmUgYWxsb3dpbmcgaGVhZHBob25lcyB0byBiZSBkcml2ZW4gYXMgcmVxdWlyZWQuCisJICovCisJaWYgKCEocGxsX3NybV9zdHMgJiBEQTcyMTlfUExMX1NSTV9TVFNfTUNMSykpCisJCW1zbGVlcChEQTcyMTlfQUFEX0hQVEVTVF9JTlRfT1NDX1BBVEhfREVMQVkpOworCisJLyogUmVzdG9yZSBnYWluIHJhbXBpbmcgcmF0ZSAqLworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxOV9HQUlOX1JBTVBfQ1RSTCwgZ2Fpbl9yYW1wX2N0cmwpOworCiAJLyogRHJpdmUgSGVhZHBob25lcy9saW5lb3V0ICovCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjE5X0hQX0xfQ1RSTCwgREE3MjE5X0hQX0xfQU1QX09FX01BU0ssCiAJCQkgICAgREE3MjE5X0hQX0xfQU1QX09FX01BU0spOwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzIxOV9IUF9SX0NUUkwsIERBNzIxOV9IUF9SX0FNUF9PRV9NQVNLLAogCQkJICAgIERBNzIxOV9IUF9SX0FNUF9PRV9NQVNLKTsKIAorCS8qIFJlbW92ZSBNQ0xLLCBpZiBwcmV2aW91c2x5IGVuYWJsZWQgKi8KKwlpZiAoZGE3MjE5LT5tY2xrKQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZGE3MjE5LT5tY2xrKTsKKwogCW11dGV4X3VubG9jaygmZGE3MjE5LT5sb2NrKTsKIAlzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKGRhcG0pOwogCkBAIC03NTEsNiArNzk3LDYyIEBACiAKIAogLyoKKyAqIFN1c3BlbmQvUmVzdW1lCisgKi8KKwordm9pZCBkYTcyMTlfYWFkX3N1c3BlbmQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBkYTcyMTlfcHJpdiAqZGE3MjE5ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IGRhNzIxOV9hYWRfcHJpdiAqZGE3MjE5X2FhZCA9IGRhNzIxOS0+YWFkOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpOworCXU4IG1pY2JpYXNfY3RybDsKKworCWlmIChkYTcyMTlfYWFkLT5qYWNrKSB7CisJCS8qIERpc2FibGUgamFjayBkZXRlY3Rpb24gZHVyaW5nIHN1c3BlbmQgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjE5X0FDQ0RFVF9DT05GSUdfMSwKKwkJCQkgICAgREE3MjE5X0FDQ0RFVF9FTl9NQVNLLCAwKTsKKworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIGEgNC1wb2xlIGphY2sgaW5zZXJ0ZWQsIHRoZW4gbWljYmlhcyB3aWxsIGJlCisJCSAqIGVuYWJsZWQuIFdlIGNhbiBkaXNhYmxlIG1pY2JpYXMgaGVyZSwgYW5kIGtlZXAgYSBub3RlIHRvCisJCSAqIHJlLWVuYWJsZSBpdCBvbiByZXN1bWUuIElmIGphY2sgcmVtb3ZhbCBvY2N1cnJlZCBkdXJpbmcKKwkJICogc3VzcGVuZCB0aGVuIHRoaXMgd2lsbCBiZSBkZWFsdCB3aXRoIHRocm91Z2ggdGhlIElSUSBoYW5kbGVyLgorCQkgKi8KKwkJaWYgKGRhNzIxOV9hYWQtPmphY2tfaW5zZXJ0ZWQpIHsKKwkJCW1pY2JpYXNfY3RybCA9IHNuZF9zb2NfcmVhZChjb2RlYywgREE3MjE5X01JQ0JJQVNfQ1RSTCk7CisJCQlpZiAobWljYmlhc19jdHJsICYgREE3MjE5X01JQ0JJQVMxX0VOX01BU0spIHsKKwkJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIk1pYyBCaWFzIik7CisJCQkJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisJCQkJZGE3MjE5X2FhZC0+bWljYmlhc19yZXN1bWVfZW5hYmxlID0gdHJ1ZTsKKwkJCX0KKwkJfQorCX0KK30KKwordm9pZCBkYTcyMTlfYWFkX3Jlc3VtZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGRhNzIxOV9wcml2ICpkYTcyMTkgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3QgZGE3MjE5X2FhZF9wcml2ICpkYTcyMTlfYWFkID0gZGE3MjE5LT5hYWQ7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYyk7CisKKwlpZiAoZGE3MjE5X2FhZC0+amFjaykgeworCQkvKiBSZS1lbmFibGUgbWljYmlhcyBpZiBwcmV2aW91c2x5IGVuYWJsZWQgZm9yIDQtcG9sZSBqYWNrICovCisJCWlmIChkYTcyMTlfYWFkLT5qYWNrX2luc2VydGVkICYmCisJCSAgICBkYTcyMTlfYWFkLT5taWNiaWFzX3Jlc3VtZV9lbmFibGUpIHsKKwkJCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKGRhcG0sICJNaWMgQmlhcyIpOworCQkJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisJCQlkYTcyMTlfYWFkLT5taWNiaWFzX3Jlc3VtZV9lbmFibGUgPSBmYWxzZTsKKwkJfQorCisJCS8qIFJlLWVuYWJsZSBqYWNrIGRldGVjdGlvbiAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBEQTcyMTlfQUNDREVUX0NPTkZJR18xLAorCQkJCSAgICBEQTcyMTlfQUNDREVUX0VOX01BU0ssCisJCQkJICAgIERBNzIxOV9BQ0NERVRfRU5fTUFTSyk7CisJfQorfQorCisKKy8qCiAgKiBJbml0L0V4aXQKICAqLwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2RhNzIxOS1hYWQuaCBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjE5LWFhZC5oCmluZGV4IDRmY2NmNjcuLjExN2EzZDcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjE5LWFhZC5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjE5LWFhZC5oCkBAIC0xNzYsOCArMTc2LDEwIEBACiAjZGVmaW5lIERBNzIxOV9BQURfTUlDQklBU19DSEtfREVMQVkJMTAKICNkZWZpbmUgREE3MjE5X0FBRF9NSUNCSUFTX0NIS19SRVRSSUVTCTUKIAotI2RlZmluZSBEQTcyMTlfQUFEX0hQVEVTVF9SQU1QX0ZSRVEJMHgyOAotI2RlZmluZSBEQTcyMTlfQUFEX0hQVEVTVF9QRVJJT0QJNjUKKyNkZWZpbmUgREE3MjE5X0FBRF9IUFRFU1RfUkFNUF9GUkVRCQkweDI4CisjZGVmaW5lIERBNzIxOV9BQURfSFBURVNUX1JBTVBfRlJFUV9JTlRfT1NDCTB4NEQKKyNkZWZpbmUgREE3MjE5X0FBRF9IUFRFU1RfUEVSSU9ECQk2NQorI2RlZmluZSBEQTcyMTlfQUFEX0hQVEVTVF9JTlRfT1NDX1BBVEhfREVMQVkJMjAKIAogZW51bSBkYTcyMTlfYWFkX2V2ZW50X3JlZ3MgewogCURBNzIxOV9BQURfSVJRX1JFR19BID0gMCwKQEAgLTE5OSwxMiArMjAxLDE3IEBACiAJc3RydWN0IHdvcmtfc3RydWN0IGhwdGVzdF93b3JrOwogCiAJc3RydWN0IHNuZF9zb2NfamFjayAqamFjazsKKwlib29sIG1pY2JpYXNfcmVzdW1lX2VuYWJsZTsKIAlib29sIGphY2tfaW5zZXJ0ZWQ7CiB9OwogCiAvKiBBQUQgY29udHJvbCAqLwogdm9pZCBkYTcyMTlfYWFkX2phY2tfZGV0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgc3RydWN0IHNuZF9zb2NfamFjayAqamFjayk7CiAKKy8qIFN1c3BlbmQvUmVzdW1lICovCit2b2lkIGRhNzIxOV9hYWRfc3VzcGVuZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwordm9pZCBkYTcyMTlfYWFkX3Jlc3VtZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOworCiAvKiBJbml0L0V4aXQgKi8KIGludCBkYTcyMTlfYWFkX2luaXQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKIHZvaWQgZGE3MjE5X2FhZF9leGl0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2RhNzIxOS5jIGIvc291bmQvc29jL2NvZGVjcy9kYTcyMTkuYwppbmRleCA1MGVhOTQzLi4xMTUyYWE1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2RhNzIxOS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjE5LmMKQEAgLTgwMSw3ICs4MDEsNyBAQAogCQkJCSsraTsKIAkJCQltc2xlZXAoNTApOwogCQkJfQotCQl9IHdoaWxlICgoaSA8IERBNzIxOV9TUk1fQ0hFQ0tfUkVUUklFUykgJiAoIXNybV9sb2NrKSk7CisJCX0gd2hpbGUgKChpIDwgREE3MjE5X1NSTV9DSEVDS19SRVRSSUVTKSAmJiAoIXNybV9sb2NrKSk7CiAKIAkJaWYgKCFzcm1fbG9jaykKIAkJCWRldl93YXJuKGNvZGVjLT5kZXYsICJTUk0gZmFpbGVkIHRvIGxvY2tcbiIpOwpAQCAtMTQ4Miw2ICsxNDgyLDggQEAKIAlpZiAoIXBkYXRhKQogCQlyZXR1cm4gTlVMTDsKIAorCXBkYXRhLT53YWtldXBfc291cmNlID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsICJ3YWtldXAtc291cmNlIik7CisKIAlpZiAoZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKGRldiwgImRsZyxtaWNiaWFzLWx2bCIsICZvZl92YWwzMikgPj0gMCkKIAkJcGRhdGEtPm1pY2JpYXNfbHZsID0gZGE3MjE5X2Z3X21pY2JpYXNfbHZsKGRldiwgb2ZfdmFsMzIpOwogCWVsc2UKQEAgLTE1MDgsMTEgKzE1MTAsMTAgQEAKIAogCXN3aXRjaCAobGV2ZWwpIHsKIAljYXNlIFNORF9TT0NfQklBU19PTjoKLQljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgogCQlicmVhazsKLQljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgotCQlpZiAoc25kX3NvY19jb2RlY19nZXRfYmlhc19sZXZlbChjb2RlYykgPT0gU05EX1NPQ19CSUFTX09GRikgewotCQkJLyogTUNMSyAqLworCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CisJCS8qIEVuYWJsZSBNQ0xLIGZvciB0cmFuc2l0aW9uIHRvIE9OIHN0YXRlICovCisJCWlmIChzbmRfc29jX2NvZGVjX2dldF9iaWFzX2xldmVsKGNvZGVjKSA9PSBTTkRfU09DX0JJQVNfU1RBTkRCWSkgewogCQkJaWYgKGRhNzIxOS0+bWNsaykgewogCQkJCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShkYTcyMTktPm1jbGspOwogCQkJCWlmIChyZXQpIHsKQEAgLTE1MjEsMjIgKzE1MjIsMjggQEAKIAkJCQkJcmV0dXJuIHJldDsKIAkJCQl9CiAJCQl9CisJCX0KIAorCQlicmVhazsKKwljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgorCQlpZiAoc25kX3NvY19jb2RlY19nZXRfYmlhc19sZXZlbChjb2RlYykgPT0gU05EX1NPQ19CSUFTX09GRikKIAkJCS8qIE1hc3RlciBiaWFzICovCiAJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBEQTcyMTlfUkVGRVJFTkNFUywKIAkJCQkJICAgIERBNzIxOV9CSUFTX0VOX01BU0ssCiAJCQkJCSAgICBEQTcyMTlfQklBU19FTl9NQVNLKTsKKworCQlpZiAoc25kX3NvY19jb2RlY19nZXRfYmlhc19sZXZlbChjb2RlYykgPT0gU05EX1NPQ19CSUFTX1BSRVBBUkUpIHsKKwkJCS8qIFJlbW92ZSBNQ0xLICovCisJCQlpZiAoZGE3MjE5LT5tY2xrKQorCQkJCWNsa19kaXNhYmxlX3VucHJlcGFyZShkYTcyMTktPm1jbGspOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKLQkJLyogT25seSBkaXNhYmxlIG1hc3RlciBiaWFzIGlmIGphY2sgZGV0ZWN0aW9uIG5vdCBhY3RpdmUgKi8KLQkJaWYgKCFkYTcyMTktPmFhZC0+amFjaykKKwkJLyogT25seSBkaXNhYmxlIG1hc3RlciBiaWFzIGlmIHdlJ3JlIG5vdCBhIHdha2UtdXAgc291cmNlICovCisJCWlmICghZGE3MjE5LT53YWtldXBfc291cmNlKQogCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjE5X1JFRkVSRU5DRVMsCiAJCQkJCSAgICBEQTcyMTlfQklBU19FTl9NQVNLLCAwKTsKIAotCQkvKiBNQ0xLICovCi0JCWlmIChkYTcyMTktPm1jbGspCi0JCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZGE3MjE5LT5tY2xrKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0xNTk5LDYgKzE2MDYsOCBAQAogCWlmIChwZGF0YSkgewogCQl1OCBtaWNiaWFzX2x2bCA9IDA7CiAKKwkJZGE3MjE5LT53YWtldXBfc291cmNlID0gcGRhdGEtPndha2V1cF9zb3VyY2U7CisKIAkJLyogTWljIEJpYXMgdm9sdGFnZXMgKi8KIAkJc3dpdGNoIChwZGF0YS0+bWljYmlhc19sdmwpIHsKIAkJY2FzZSBEQTcyMTlfTUlDQklBU18xXzZWOgpAQCAtMTczMywxMSArMTc0MiwxMSBAQAogewogCXN0cnVjdCBkYTcyMTlfcHJpdiAqZGE3MjE5ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKLQlzbmRfc29jX2NvZGVjX2ZvcmNlX2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOworCS8qIFN1c3BlbmQgQUFEIGlmIHdlJ3JlIG5vdCBhIHdha2UtdXAgc291cmNlICovCisJaWYgKCFkYTcyMTktPndha2V1cF9zb3VyY2UpCisJCWRhNzIxOV9hYWRfc3VzcGVuZChjb2RlYyk7CiAKLQkvKiBQdXQgZGV2aWNlIGludG8gc3RhbmRieSBtb2RlIGlmIGphY2sgZGV0ZWN0aW9uIGRpc2FibGVkICovCi0JaWYgKCFkYTcyMTktPmFhZC0+amFjaykKLQkJc25kX3NvY193cml0ZShjb2RlYywgREE3MjE5X1NZU1RFTV9BQ1RJVkUsIDApOworCXNuZF9zb2NfY29kZWNfZm9yY2VfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE3NDYsMTMgKzE3NTUsMTIgQEAKIHsKIAlzdHJ1Y3QgZGE3MjE5X3ByaXYgKmRhNzIxOSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCi0JLyogUHV0IGRldmljZSBpbnRvIGFjdGl2ZSBtb2RlIGlmIHByZXZpb3VzbHkgcHVzaGVkIHRvIHN0YW5kYnkgKi8KLQlpZiAoIWRhNzIxOS0+YWFkLT5qYWNrKQotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBEQTcyMTlfU1lTVEVNX0FDVElWRSwKLQkJCSAgICAgIERBNzIxOV9TWVNURU1fQUNUSVZFX01BU0spOwotCiAJc25kX3NvY19jb2RlY19mb3JjZV9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAKKwkvKiBSZXN1bWUgQUFEIGlmIHByZXZpb3VzbHkgc3VzcGVuZGVkICovCisJaWYgKCFkYTcyMTktPndha2V1cF9zb3VyY2UpCisJCWRhNzIxOV9hYWRfcmVzdW1lKGNvZGVjKTsKKwogCXJldHVybiAwOwogfQogI2Vsc2UKQEAgLTE3NjcsMTMgKzE3NzUsMTQgQEAKIAkucmVzdW1lCQkJPSBkYTcyMTlfcmVzdW1lLAogCS5zZXRfYmlhc19sZXZlbAkJPSBkYTcyMTlfc2V0X2JpYXNfbGV2ZWwsCiAKLQkuY29udHJvbHMJCT0gZGE3MjE5X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoZGE3MjE5X3NuZF9jb250cm9scyksCi0KLQkuZGFwbV93aWRnZXRzCQk9IGRhNzIxOV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGRhNzIxOV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcwkJPSBkYTcyMTlfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGRhNzIxOV9hdWRpb19tYXApLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gZGE3MjE5X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGRhNzIxOV9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGRhNzIxOV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShkYTcyMTlfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGRhNzIxOV9hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGRhNzIxOV9hdWRpb19tYXApLAorCX0sCiB9OwogCiAKQEAgLTE5MjEsNyArMTkzMCw4IEBACiAJCQkgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBkYTcyMTlfcHJpdiAqZGE3MjE5OwotCWludCByZXQ7CisJdW5zaWduZWQgaW50IHN5c3RlbV9hY3RpdmUsIHN5c3RlbV9zdGF0dXM7CisJaW50IGksIHJldDsKIAogCWRhNzIxOSA9IGRldm1fa3phbGxvYygmaTJjLT5kZXYsIHNpemVvZihzdHJ1Y3QgZGE3MjE5X3ByaXYpLAogCQkJICAgICAgR0ZQX0tFUk5FTCk7CkBAIC0xOTM3LDYgKzE5NDcsMzcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKKwlyZWdjYWNoZV9jYWNoZV9ieXBhc3MoZGE3MjE5LT5yZWdtYXAsIHRydWUpOworCisJLyogRGlzYWJsZSBhdWRpbyBwYXRocyBpZiBzdGlsbCBhY3RpdmUgZnJvbSBwcmV2aW91cyBzdGFydCAqLworCXJlZ21hcF9yZWFkKGRhNzIxOS0+cmVnbWFwLCBEQTcyMTlfU1lTVEVNX0FDVElWRSwgJnN5c3RlbV9hY3RpdmUpOworCWlmIChzeXN0ZW1fYWN0aXZlKSB7CisJCXJlZ21hcF93cml0ZShkYTcyMTktPnJlZ21hcCwgREE3MjE5X0dBSU5fUkFNUF9DVFJMLAorCQkJICAgICBEQTcyMTlfR0FJTl9SQU1QX1JBVEVfTk9NSU5BTCk7CisJCXJlZ21hcF93cml0ZShkYTcyMTktPnJlZ21hcCwgREE3MjE5X1NZU1RFTV9NT0RFU19JTlBVVCwgMHgwMCk7CisJCXJlZ21hcF93cml0ZShkYTcyMTktPnJlZ21hcCwgREE3MjE5X1NZU1RFTV9NT0RFU19PVVRQVVQsIDB4MDEpOworCisJCWZvciAoaSA9IDA7IGkgPCBEQTcyMTlfU1lTX1NUQVRfQ0hFQ0tfUkVUUklFUzsgKytpKSB7CisJCQlyZWdtYXBfcmVhZChkYTcyMTktPnJlZ21hcCwgREE3MjE5X1NZU1RFTV9TVEFUVVMsCisJCQkJICAgICZzeXN0ZW1fc3RhdHVzKTsKKwkJCWlmICghc3lzdGVtX3N0YXR1cykKKwkJCQlicmVhazsKKworCQkJbXNsZWVwKERBNzIxOV9TWVNfU1RBVF9DSEVDS19ERUxBWSk7CisJCX0KKwl9CisKKwkvKiBTb2Z0IHJlc2V0IGNvZGVjICovCisJcmVnbWFwX3dyaXRlX2JpdHMoZGE3MjE5LT5yZWdtYXAsIERBNzIxOV9BQ0NERVRfQ09ORklHXzEsCisJCQkgIERBNzIxOV9BQ0NERVRfRU5fTUFTSywgMCk7CisJcmVnbWFwX3dyaXRlX2JpdHMoZGE3MjE5LT5yZWdtYXAsIERBNzIxOV9DSUZfQ1RSTCwKKwkJCSAgREE3MjE5X0NJRl9SRUdfU09GVF9SRVNFVF9NQVNLLAorCQkJICBEQTcyMTlfQ0lGX1JFR19TT0ZUX1JFU0VUX01BU0spOworCXJlZ21hcF93cml0ZV9iaXRzKGRhNzIxOS0+cmVnbWFwLCBEQTcyMTlfU1lTVEVNX0FDVElWRSwKKwkJCSAgREE3MjE5X1NZU1RFTV9BQ1RJVkVfTUFTSywgMCk7CisKKwlyZWdjYWNoZV9jYWNoZV9ieXBhc3MoZGE3MjE5LT5yZWdtYXAsIGZhbHNlKTsKKwogCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LCAmc29jX2NvZGVjX2Rldl9kYTcyMTksCiAJCQkJICAgICAmZGE3MjE5X2RhaSwgMSk7CiAJaWYgKHJldCA8IDApIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjE5LmggYi9zb3VuZC9zb2MvY29kZWNzL2RhNzIxOS5oCmluZGV4IGZmMmEyZjAuLjY2ZDNiYWQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjE5LmgKKysrIGIvc291bmQvc29jL2NvZGVjcy9kYTcyMTkuaApAQCAtMjI0LDYgKzIyNCw3IEBACiAjZGVmaW5lIERBNzIxOV9QTExfU1JNX1NUQVRFX01BU0sJKDB4RiA8PCAwKQogI2RlZmluZSBEQTcyMTlfUExMX1NSTV9TVEFUVVNfU0hJRlQJNAogI2RlZmluZSBEQTcyMTlfUExMX1NSTV9TVEFUVVNfTUFTSwkoMHhGIDw8IDQpCisjZGVmaW5lIERBNzIxOV9QTExfU1JNX1NUU19NQ0xLCQkoMHgxIDw8IDQpCiAjZGVmaW5lIERBNzIxOV9QTExfU1JNX1NUU19TUk1fTE9DSwkoMHgxIDw8IDcpCiAKIC8qIERBNzIxOV9ESUdfUk9VVElOR19EQUkgPSAweDJBICovCkBAIC01NzYsNiArNTc3LDggQEAKIC8qIERBNzIxOV9HQUlOX1JBTVBfQ1RSTCA9IDB4OTIgKi8KICNkZWZpbmUgREE3MjE5X0dBSU5fUkFNUF9SQVRFX1NISUZUCTAKICNkZWZpbmUgREE3MjE5X0dBSU5fUkFNUF9SQVRFX01BU0sJKDB4MyA8PCAwKQorI2RlZmluZSBEQTcyMTlfR0FJTl9SQU1QX1JBVEVfWDgJKDB4MCA8PCAwKQorI2RlZmluZSBEQTcyMTlfR0FJTl9SQU1QX1JBVEVfTk9NSU5BTAkoMHgxIDw8IDApCiAjZGVmaW5lIERBNzIxOV9HQUlOX1JBTVBfUkFURV9NQVgJNAogCiAvKiBEQTcyMTlfUENfQ09VTlQgPSAweDk0ICovCkBAIC03NzAsNiArNzczLDEwIEBACiAvKiBTUk0gKi8KICNkZWZpbmUgREE3MjE5X1NSTV9DSEVDS19SRVRSSUVTCTgKIAorLyogU3lzdGVtIENvbnRyb2xsZXIgKi8KKyNkZWZpbmUgREE3MjE5X1NZU19TVEFUX0NIRUNLX1JFVFJJRVMJNgorI2RlZmluZSBEQTcyMTlfU1lTX1NUQVRfQ0hFQ0tfREVMQVkJNTAKKwogZW51bSBkYTcyMTlfY2xrX3NyYyB7CiAJREE3MjE5X0NMS1NSQ19NQ0xLID0gMCwKIAlEQTcyMTlfQ0xLU1JDX01DTEtfU1FSLApAQCAtNzk2LDYgKzgwMyw3IEBACiAJc3RydWN0IGRhNzIxOV9hYWRfcHJpdiAqYWFkOwogCXN0cnVjdCBkYTcyMTlfcGRhdGEgKnBkYXRhOwogCisJYm9vbCB3YWtldXBfc291cmNlOwogCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhIHN1cHBsaWVzW0RBNzIxOV9OVU1fU1VQUExJRVNdOwogCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKIAlzdHJ1Y3QgbXV0ZXggbG9jazsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvZGE3MzJ4LmMgYi9zb3VuZC9zb2MvY29kZWNzL2RhNzMyeC5jCmluZGV4IDQ2MTUwNmEuLmMxY2MxYzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvZGE3MzJ4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9kYTczMnguYwpAQCAtMTUwMSwxMiArMTUwMSwxNCBAQAogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfZGE3MzJ4ID0gewogCS5zZXRfYmlhc19sZXZlbAkJPSBkYTczMnhfc2V0X2JpYXNfbGV2ZWwsCi0JLmNvbnRyb2xzCQk9IGRhNzMyeF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGRhNzMyeF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMJCT0gZGE3MzJ4X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoZGE3MzJ4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzCQk9IGRhNzMyeF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShkYTczMnhfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gZGE3MzJ4X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGRhNzMyeF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGRhNzMyeF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShkYTczMnhfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGRhNzMyeF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoZGE3MzJ4X2RhcG1fcm91dGVzKSwKKwl9LAogCS5zZXRfcGxsCQk9IGRhNzMyeF9zZXRfZGFpX3BsbCwKIH07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvZGE5MDU1LmMgYi9zb3VuZC9zb2MvY29kZWNzL2RhOTA1NS5jCmluZGV4IDBiMmVkZTguLjRlZmI1ZjggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvZGE5MDU1LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9kYTkwNTUuYwpAQCAtMTQ1NSwxMyArMTQ1NSwxNCBAQAogCS5wcm9iZQkJCT0gZGE5MDU1X3Byb2JlLAogCS5zZXRfYmlhc19sZXZlbAkJPSBkYTkwNTVfc2V0X2JpYXNfbGV2ZWwsCiAKLQkuY29udHJvbHMJCT0gZGE5MDU1X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoZGE5MDU1X3NuZF9jb250cm9scyksCi0KLQkuZGFwbV93aWRnZXRzCQk9IGRhOTA1NV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGRhOTA1NV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcwkJPSBkYTkwNTVfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGRhOTA1NV9hdWRpb19tYXApLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gZGE5MDU1X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGRhOTA1NV9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGRhOTA1NV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShkYTkwNTVfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGRhOTA1NV9hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGRhOTA1NV9hdWRpb19tYXApLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgZGE5MDU1X3JlZ21hcF9jb25maWcgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2RtaWMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvZG1pYy5jCmluZGV4IGZkZTUzMjUuLmM4MmI5ZGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvZG1pYy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvZG1pYy5jCkBAIC01MSwxMCArNTEsMTIgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2RtaWMgPSB7Ci0JLmRhcG1fd2lkZ2V0cyA9IGRtaWNfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShkbWljX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gaW50ZXJjb24sCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoaW50ZXJjb24pLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuZGFwbV93aWRnZXRzCQk9IGRtaWNfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoZG1pY19kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gaW50ZXJjb24sCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGludGVyY29uKSwKKwl9LAogfTsKIAogc3RhdGljIGludCBkbWljX2Rldl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9lczgzMjguYyBiL3NvdW5kL3NvYy9jb2RlY3MvZXM4MzI4LmMKaW5kZXggMjA4NmQ3MS4uMzc3MjIxOTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvZXM4MzI4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9lczgzMjguYwpAQCAtODIzLDEyICs4MjMsMTQgQEAKIAkuc2V0X2JpYXNfbGV2ZWwJICA9IGVzODMyOF9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMJICA9IGVzODMyOF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scwkgID0gQVJSQVlfU0laRShlczgzMjhfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzCSAgPSBlczgzMjhfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShlczgzMjhfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMJICA9IGVzODMyOF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzICA9IEFSUkFZX1NJWkUoZXM4MzI4X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGVzODMyOF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShlczgzMjhfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBlczgzMjhfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoZXM4MzI4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBlczgzMjhfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGVzODMyOF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIGludCBlczgzMjhfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2d0bTYwMS5jIGIvc291bmQvc29jL2NvZGVjcy9ndG02MDEuYwppbmRleCAwYjgwMDUyLi45MjZiMWE0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2d0bTYwMS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvZ3RtNjAxLmMKQEAgLTUyLDEwICs1MiwxMiBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X2d0bTYwMSA9IHsKLQkuZGFwbV93aWRnZXRzID0gZ3RtNjAxX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoZ3RtNjAxX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gZ3RtNjAxX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGd0bTYwMV9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5kYXBtX3dpZGdldHMJCT0gZ3RtNjAxX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGd0bTYwMV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gZ3RtNjAxX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShndG02MDFfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IGd0bTYwMV9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9oZGFjX2hkbWkuYyBiL3NvdW5kL3NvYy9jb2RlY3MvaGRhY19oZG1pLmMKaW5kZXggNGUxODFiMi4uYzYwMmM0OSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9oZGFjX2hkbWkuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2hkYWNfaGRtaS5jCkBAIC02MTQsNyArNjE0LDcgQEAKIAkJCSghcGluLT5lbGQuZWxkX3ZhbGlkKSkgewogCiAJCWRldl93YXJuKCZoZGFjLT5oZGFjLmRldiwKLQkJCSJGYWlsZWQ6IG1vbnRpb3IgcHJlc2VudD8gJWQgRUxEIHZhbGlkPzogJWQgZm9yIHBpbjogJWRcbiIsCisJCQkiRmFpbGVkOiBtb25pdG9yIHByZXNlbnQ/ICVkIEVMRCB2YWxpZD86ICVkIGZvciBwaW46ICVkXG4iLAogCQkJcGluLT5lbGQubW9uaXRvcl9wcmVzZW50LCBwaW4tPmVsZC5lbGRfdmFsaWQsIHBpbi0+bmlkKTsKIAogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvaGRtaS1jb2RlYy5jIGIvc291bmQvc29jL2NvZGVjcy9oZG1pLWNvZGVjLmMKaW5kZXggZjI3ZDExNS4uYjkwNDQ5MiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9oZG1pLWNvZGVjLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9oZG1pLWNvZGVjLmMKQEAgLTI0LDYgKzI0LDE1IEBACiAKICNpbmNsdWRlIDxkcm0vZHJtX2NydGMuaD4gLyogVGhpcyBpcyBvbmx5IHRvIGdldCBNQVhfRUxEX0JZVEVTICovCiAKK3N0cnVjdCBoZG1pX2RldmljZSB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlpbnQgY250OworfTsKKyNkZWZpbmUgcG9zX3RvX2hkbWlfZGV2aWNlKHBvcykJY29udGFpbmVyX29mKChwb3MpLCBzdHJ1Y3QgaGRtaV9kZXZpY2UsIGxpc3QpCitMSVNUX0hFQUQoaGRtaV9kZXZpY2VfbGlzdCk7CisKKyNkZWZpbmUgREFJX05BTUVfU0laRSAxNgogc3RydWN0IGhkbWlfY29kZWNfcHJpdiB7CiAJc3RydWN0IGhkbWlfY29kZWNfcGRhdGEgaGNkOwogCXN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgKmRhaWRydjsKQEAgLTMyMCw3ICszMjksNiBAQAogCQkJIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMzJfQkUpCiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIGhkbWlfaTJzX2RhaSA9IHsKLQkubmFtZSA9ICJpMnMtaGlmaSIsCiAJLmlkID0gREFJX0lEX0kyUywKIAkucGxheWJhY2sgPSB7CiAJCS5zdHJlYW1fbmFtZSA9ICJQbGF5YmFjayIsCkBAIC0zMzQsNyArMzQyLDYgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIGhkbWlfc3BkaWZfZGFpID0gewotCS5uYW1lID0gInNwZGlmLWhpZmkiLAogCS5pZCA9IERBSV9JRF9TUERJRiwKIAkucGxheWJhY2sgPSB7CiAJCS5zdHJlYW1fbmFtZSA9ICJQbGF5YmFjayIsCkBAIC0zNDYsMTMgKzM1MywzNyBAQAogCS5vcHMgPSAmaGRtaV9kYWlfb3BzLAogfTsKIAorc3RhdGljIGNoYXIgaGRtaV9kYWlfbmFtZVtdW0RBSV9OQU1FX1NJWkVdID0geworCSJoZG1pLWhpZmkuMCIsCisJImhkbWktaGlmaS4xIiwKKwkiaGRtaS1oaWZpLjIiLAorCSJoZG1pLWhpZmkuMyIsCit9OworCitzdGF0aWMgaW50IGhkbWlfb2ZfeGxhdGVfZGFpX25hbWUoc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjb21wb25lbnQsCisJCQkJICBzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICphcmdzLAorCQkJCSAgY29uc3QgY2hhciAqKmRhaV9uYW1lKQoreworCWludCBpZCA9IGFyZ3MtPmFyZ3NbMF07CisKKwlpZiAoaWQgPCBBUlJBWV9TSVpFKGhkbWlfZGFpX25hbWUpKSB7CisJCSpkYWlfbmFtZSA9IGhkbWlfZGFpX25hbWVbaWRdOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVBR0FJTjsKK30KKwogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBoZG1pX2NvZGVjID0gewotCS5jb250cm9scyA9IGhkbWlfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoaGRtaV9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IGhkbWlfd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoaGRtaV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBoZG1pX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShoZG1pX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBoZG1pX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoaGRtaV9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gaGRtaV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoaGRtaV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGhkbWlfcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShoZG1pX3JvdXRlcyksCisJCS5vZl94bGF0ZV9kYWlfbmFtZQk9IGhkbWlfb2ZfeGxhdGVfZGFpX25hbWUsCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgaGRtaV9jb2RlY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpAQCAtMzYwLDYgKzM5MSw4IEBACiAJc3RydWN0IGhkbWlfY29kZWNfcGRhdGEgKmhjZCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CiAJc3RydWN0IGhkbWlfY29kZWNfcHJpdiAqaGNwOworCXN0cnVjdCBoZG1pX2RldmljZSAqaGQ7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOwogCWludCBkYWlfY291bnQsIGkgPSAwOwogCWludCByZXQ7CiAKQEAgLTM4MSw2ICs0MTQsMzEgQEAKIAlpZiAoIWhjcCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwloZCA9IE5VTEw7CisJbGlzdF9mb3JfZWFjaChwb3MsICZoZG1pX2RldmljZV9saXN0KSB7CisJCXN0cnVjdCBoZG1pX2RldmljZSAqdG1wID0gcG9zX3RvX2hkbWlfZGV2aWNlKHBvcyk7CisKKwkJaWYgKHRtcC0+ZGV2ID09IGRldi0+cGFyZW50KSB7CisJCQloZCA9IHRtcDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFoZCkgeworCQloZCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqaGQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFoZCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWhkLT5kZXYgPSBkZXYtPnBhcmVudDsKKworCQlsaXN0X2FkZF90YWlsKCZoZC0+bGlzdCwgJmhkbWlfZGV2aWNlX2xpc3QpOworCX0KKworCWlmIChoZC0+Y250ID49IEFSUkFZX1NJWkUoaGRtaV9kYWlfbmFtZSkpIHsKKwkJZGV2X2VycihkZXYsICJ0b28gbWFueSBoZG1pIGNvZGVjIGFyZSBkZXRlY2VkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJaGNwLT5oY2QgPSAqaGNkOwogCW11dGV4X2luaXQoJmhjcC0+Y3VycmVudF9zdHJlYW1fbG9jayk7CiAKQEAgLTM5MywxMSArNDUxLDE0IEBACiAJCWhjcC0+ZGFpZHJ2W2ldID0gaGRtaV9pMnNfZGFpOwogCQloY3AtPmRhaWRydltpXS5wbGF5YmFjay5jaGFubmVsc19tYXggPQogCQkJaGNkLT5tYXhfaTJzX2NoYW5uZWxzOworCQloY3AtPmRhaWRydltpXS5uYW1lID0gaGRtaV9kYWlfbmFtZVtoZC0+Y250KytdOwogCQlpKys7CiAJfQogCi0JaWYgKGhjZC0+c3BkaWYpCisJaWYgKGhjZC0+c3BkaWYpIHsKIAkJaGNwLT5kYWlkcnZbaV0gPSBoZG1pX3NwZGlmX2RhaTsKKwkJaGNwLT5kYWlkcnZbaV0ubmFtZSA9IGhkbWlfZGFpX25hbWVbaGQtPmNudCsrXTsKKwl9CiAKIAlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKGRldiwgJmhkbWlfY29kZWMsIGhjcC0+ZGFpZHJ2LAogCQkJCSAgICAgZGFpX2NvdW50KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvaW5ub19yazMwMzYuYyBiL3NvdW5kL3NvYy9jb2RlY3MvaW5ub19yazMwMzYuYwppbmRleCA5YjZlODg0Li5iOTE4YmE1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2lubm9fcmszMDM2LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9pbm5vX3JrMzAzNi5jCkBAIC0zODAsMTIgKzM4MCwxNCBAQAogCS5wcm9iZQkJCT0gcmszMDM2X2NvZGVjX3Byb2JlLAogCS5yZW1vdmUJCQk9IHJrMzAzNl9jb2RlY19yZW1vdmUsCiAJLnNldF9iaWFzX2xldmVsCQk9IHJrMzAzNl9jb2RlY19zZXRfYmlhc19sZXZlbCwKLQkuY29udHJvbHMJCT0gcmszMDM2X2NvZGVjX2RhcG1fY29udHJvbHMsCi0JLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHJrMzAzNl9jb2RlY19kYXBtX2NvbnRyb2xzKSwKLQkuZGFwbV9yb3V0ZXMJCT0gcmszMDM2X2NvZGVjX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHJrMzAzNl9jb2RlY19kYXBtX3JvdXRlcyksCi0JLmRhcG1fd2lkZ2V0cwkJPSByazMwMzZfY29kZWNfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShyazMwMzZfY29kZWNfZGFwbV93aWRnZXRzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHJrMzAzNl9jb2RlY19kYXBtX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUocmszMDM2X2NvZGVjX2RhcG1fY29udHJvbHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gcmszMDM2X2NvZGVjX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShyazMwMzZfY29kZWNfZGFwbV9yb3V0ZXMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHJrMzAzNl9jb2RlY19kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShyazMwMzZfY29kZWNfZGFwbV93aWRnZXRzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHJrMzAzNl9jb2RlY19yZWdtYXBfY29uZmlnID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9pc2FiZWxsZS5jIGIvc291bmQvc29jL2NvZGVjcy9pc2FiZWxsZS5jCmluZGV4IGJlNDQ4MzcuLmE0YjBlZGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvaXNhYmVsbGUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2lzYWJlbGxlLmMKQEAgLTEwODksMTIgKzEwODksMTQgQEAKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X2lzYWJlbGxlID0gewogCS5zZXRfYmlhc19sZXZlbCA9IGlzYWJlbGxlX3NldF9iaWFzX2xldmVsLAotCS5jb250cm9scyA9IGlzYWJlbGxlX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShpc2FiZWxsZV9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBpc2FiZWxsZV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGlzYWJlbGxlX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gaXNhYmVsbGVfaW50ZXJjb24sCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoaXNhYmVsbGVfaW50ZXJjb24pLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gaXNhYmVsbGVfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoaXNhYmVsbGVfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBpc2FiZWxsZV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShpc2FiZWxsZV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gaXNhYmVsbGVfaW50ZXJjb24sCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGlzYWJlbGxlX2ludGVyY29uKSwKKwl9LAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKIH07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvano0NzQwLmMgYi9zb3VuZC9zb2MvY29kZWNzL2p6NDc0MC5jCmluZGV4IDFmNWFiOTkuLjAyOTBmYWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvano0NzQwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9qejQ3NDAuYwpAQCAtMjk4LDEyICsyOTgsMTQgQEAKIAkuc2V0X2JpYXNfbGV2ZWwgPSBqejQ3NDBfY29kZWNfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gano0NzQwX2NvZGVjX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGp6NDc0MF9jb2RlY19jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IGp6NDc0MF9jb2RlY19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGp6NDc0MF9jb2RlY19kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGp6NDc0MF9jb2RlY19kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShqejQ3NDBfY29kZWNfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gano0NzQwX2NvZGVjX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoano0NzQwX2NvZGVjX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBqejQ3NDBfY29kZWNfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoano0NzQwX2NvZGVjX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBqejQ3NDBfY29kZWNfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGp6NDc0MF9jb2RlY19kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBqejQ3NDBfY29kZWNfcmVnbWFwX2NvbmZpZyA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbDMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbDMuYwppbmRleCA1MzUzYWY1Li5hMTBlYTNjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2wzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9sMy5jCkBAIC0yMCw2ICsyMCw4IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKICNpbmNsdWRlIDxzb3VuZC9sMy5oPgogCkBAIC0zMiwxMSArMzQsMTEgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJYWRhcC0+c2V0Y2xrKDApOworCQlhZGFwLT5zZXRjbGsoYWRhcCwgMCk7CiAJCXVkZWxheShhZGFwLT5kYXRhX2hvbGQpOwotCQlhZGFwLT5zZXRkYXQoYnl0ZSAmIDEpOworCQlhZGFwLT5zZXRkYXQoYWRhcCwgYnl0ZSAmIDEpOwogCQl1ZGVsYXkoYWRhcC0+ZGF0YV9zZXR1cCk7Ci0JCWFkYXAtPnNldGNsaygxKTsKKwkJYWRhcC0+c2V0Y2xrKGFkYXAsIDEpOwogCQl1ZGVsYXkoYWRhcC0+Y2xvY2tfaGlnaCk7CiAJCWJ5dGUgPj49IDE7CiAJfQpAQCAtNTUsMTAgKzU3LDEwIEBACiAJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAJCWlmIChpKSB7CiAJCQl1ZGVsYXkoYWRhcC0+bW9kZV9ob2xkKTsKLQkJCWFkYXAtPnNldG1vZGUoMCk7CisJCQlhZGFwLT5zZXRtb2RlKGFkYXAsIDApOwogCQkJdWRlbGF5KGFkYXAtPm1vZGUpOwogCQl9Ci0JCWFkYXAtPnNldG1vZGUoMSk7CisJCWFkYXAtPnNldG1vZGUoYWRhcCwgMSk7CiAJCXVkZWxheShhZGFwLT5tb2RlX3NldHVwKTsKIAkJc2VuZGJ5dGUoYWRhcCwgYnVmW2ldKTsKIAl9CkBAIC02NiwyNiArNjgsNzEgQEAKIAogaW50IGwzX3dyaXRlKHN0cnVjdCBsM19waW5zICphZGFwLCB1OCBhZGRyLCB1OCAqZGF0YSwgaW50IGxlbikKIHsKLQlhZGFwLT5zZXRjbGsoMSk7Ci0JYWRhcC0+c2V0ZGF0KDEpOwotCWFkYXAtPnNldG1vZGUoMSk7CisJYWRhcC0+c2V0Y2xrKGFkYXAsIDEpOworCWFkYXAtPnNldGRhdChhZGFwLCAxKTsKKwlhZGFwLT5zZXRtb2RlKGFkYXAsIDEpOwogCXVkZWxheShhZGFwLT5tb2RlKTsKIAotCWFkYXAtPnNldG1vZGUoMCk7CisJYWRhcC0+c2V0bW9kZShhZGFwLCAwKTsKIAl1ZGVsYXkoYWRhcC0+bW9kZV9zZXR1cCk7CiAJc2VuZGJ5dGUoYWRhcCwgYWRkcik7CiAJdWRlbGF5KGFkYXAtPm1vZGVfaG9sZCk7CiAKIAlzZW5kYnl0ZXMoYWRhcCwgZGF0YSwgbGVuKTsKIAotCWFkYXAtPnNldGNsaygxKTsKLQlhZGFwLT5zZXRkYXQoMSk7Ci0JYWRhcC0+c2V0bW9kZSgwKTsKKwlhZGFwLT5zZXRjbGsoYWRhcCwgMSk7CisJYWRhcC0+c2V0ZGF0KGFkYXAsIDEpOworCWFkYXAtPnNldG1vZGUoYWRhcCwgMCk7CiAKIAlyZXR1cm4gbGVuOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobDNfd3JpdGUpOwogCisKK3N0YXRpYyB2b2lkIGwzX3NldF9jbGsoc3RydWN0IGwzX3BpbnMgKmFkYXAsIGludCB2YWwpCit7CisJZ3Bpb19zZXRfdmFsdWUoYWRhcC0+Z3Bpb19jbGssIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIGwzX3NldF9kYXRhKHN0cnVjdCBsM19waW5zICphZGFwLCBpbnQgdmFsKQoreworCWdwaW9fc2V0X3ZhbHVlKGFkYXAtPmdwaW9fZGF0YSwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgbDNfc2V0X21vZGUoc3RydWN0IGwzX3BpbnMgKmFkYXAsIGludCB2YWwpCit7CisJZ3Bpb19zZXRfdmFsdWUoYWRhcC0+Z3Bpb19tb2RlLCB2YWwpOworfQorCitpbnQgbDNfc2V0X2dwaW9fb3BzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGwzX3BpbnMgKmFkYXApCit7CisJaW50IHJldDsKKworCWlmICghYWRhcC0+dXNlX2dwaW9zKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZShkZXYsIGFkYXAtPmdwaW9fZGF0YSwKKwkJCQlHUElPRl9PVVRfSU5JVF9MT1csICJsM19kYXRhIik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJYWRhcC0+c2V0ZGF0ID0gbDNfc2V0X2RhdGE7CisKKwlyZXQgPSBkZXZtX2dwaW9fcmVxdWVzdF9vbmUoZGV2LCBhZGFwLT5ncGlvX2NsaywKKwkJCQlHUElPRl9PVVRfSU5JVF9MT1csICJsM19jbGsiKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlhZGFwLT5zZXRjbGsgPSBsM19zZXRfY2xrOworCisJcmV0ID0gZGV2bV9ncGlvX3JlcXVlc3Rfb25lKGRldiwgYWRhcC0+Z3Bpb19tb2RlLAorCQkJCUdQSU9GX09VVF9JTklUX0xPVywgImwzX21vZGUiKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlhZGFwLT5zZXRtb2RlID0gbDNfc2V0X21vZGU7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGwzX3NldF9ncGlvX29wcyk7CisKIE1PRFVMRV9ERVNDUklQVElPTigiTDMgYml0LWJhbmdpbmcgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJDaHJpc3RpYW4gUGVsbGVncmluIDxjaHJpcGVsbEBldm9sd2FyZS5vcmc+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2xtNDk0NTMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbG00OTQ1My5jCmluZGV4IDlhZjU2NDAuLjhkNDEzYzIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbG00OTQ1My5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbG00OTQ1My5jCkBAIC0xMzkxLDEyICsxMzkxLDE0IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9sbTQ5NDUzID0gewogCS5zZXRfYmlhc19sZXZlbCA9IGxtNDk0NTNfc2V0X2JpYXNfbGV2ZWwsCi0JLmNvbnRyb2xzID0gbG00OTQ1M19zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUobG00OTQ1M19zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBsbTQ5NDUzX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUobG00OTQ1M19kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGxtNDk0NTNfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGxtNDk0NTNfYXVkaW9fbWFwKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGxtNDk0NTNfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUobG00OTQ1M19zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGxtNDk0NTNfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUobG00OTQ1M19kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gbG00OTQ1M19hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGxtNDk0NTNfYXVkaW9fbWFwKSwKKwl9LAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKIH07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwODguYyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwODguYwppbmRleCBmYzIyODA0Li43MmY3NzQ1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL21heDk4MDg4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODA4OC5jCkBAIC0xNzA0LDEyICsxNzA0LDE0IEBACiAJLnNldF9iaWFzX2xldmVsID0gbWF4OTgwODhfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gbWF4OTgwODhfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKG1heDk4MDg4X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IG1heDk4MDg4X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUobWF4OTgwODhfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBtYXg5ODA4OF9hdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUobWF4OTgwODhfYXVkaW9fbWFwKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IG1heDk4MDg4X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKG1heDk4MDg4X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gbWF4OTgwODhfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUobWF4OTgwODhfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IG1heDk4MDg4X2F1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUobWF4OTgwODhfYXVkaW9fbWFwKSwKKwl9LAogfTsKIAogc3RhdGljIGludCBtYXg5ODA4OF9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwOTUuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwOTUuYwppbmRleCAzNTc3MDAzLi42ZjhhNzU3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL21heDk4MDk1LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODA5NS5jCkBAIC0yMTA4LDEyICsyMTA4LDE0IEBACiAJLnN1c3BlbmQgPSBtYXg5ODA5NV9zdXNwZW5kLAogCS5yZXN1bWUgID0gbWF4OTgwOTVfcmVzdW1lLAogCS5zZXRfYmlhc19sZXZlbCA9IG1heDk4MDk1X3NldF9iaWFzX2xldmVsLAotCS5jb250cm9scyA9IG1heDk4MDk1X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShtYXg5ODA5NV9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMJICA9IG1heDk4MDk1X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUobWF4OTgwOTVfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgICAgID0gbWF4OTgwOTVfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKG1heDk4MDk1X2F1ZGlvX21hcCksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBtYXg5ODA5NV9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShtYXg5ODA5NV9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IG1heDk4MDk1X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKG1heDk4MDk1X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBtYXg5ODA5NV9hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKG1heDk4MDk1X2F1ZGlvX21hcCksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgbWF4OTgwOTVfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21heDk4MzU3YS5jIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODM1N2EuYwppbmRleCA1YjFkZmIxLi42YTZiNjhhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL21heDk4MzU3YS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgzNTdhLmMKQEAgLTc0LDEwICs3NCwxMiBAQAogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIG1heDk4MzU3YV9jb2RlY19kcml2ZXIgPSB7CiAJLnByb2JlCQkJPSBtYXg5ODM1N2FfY29kZWNfcHJvYmUsCi0JLmRhcG1fd2lkZ2V0cwkJPSBtYXg5ODM1N2FfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShtYXg5ODM1N2FfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMJCT0gbWF4OTgzNTdhX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKG1heDk4MzU3YV9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5kYXBtX3dpZGdldHMJCT0gbWF4OTgzNTdhX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKG1heDk4MzU3YV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gbWF4OTgzNTdhX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShtYXg5ODM1N2FfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBtYXg5ODM1N2FfZGFpX29wcyA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgzNzEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgzNzEuYwppbmRleCBjZjBhMzliLi43ODFiZTliYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODM3MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgzNzEuYwpAQCAtNDEyLDYgKzQxMiw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBtYXg5ODM3MV9pMmNfaWRbXSA9IHsKIAl7ICJtYXg5ODM3MSIsIDAgfSwKKwl7IH0KIH07CiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBtYXg5ODM3MV9pMmNfaWQpOwpAQCAtNDI1LDcgKzQyNiw2IEBACiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbWF4OTgzNzFfaTJjX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJtYXg5ODM3MSIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAogCQkucG0gPSBOVUxMLAogCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIobWF4OTgzNzFfb2ZfbWF0Y2gpLAogCX0sCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21heDk4NTAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg1MC5jCmluZGV4IGMxNGE3OWQuLjA2MTA4NDAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg1MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg1MC5jCkBAIC0zMDYsMTIgKzMwNiwxNCBAQAogCS5zZXRfYmlhc19sZXZlbCA9IG1heDk4NTBfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gbWF4OTg1MF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShtYXg5ODUwX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gbWF4OTg1MF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKG1heDk4NTBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBtYXg5ODUwX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKG1heDk4NTBfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gbWF4OTg1MF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKG1heDk4NTBfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IG1heDk4NTBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUobWF4OTg1MF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gbWF4OTg1MF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUobWF4OTg1MF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgbWF4OTg1MF9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg2MC5jIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODYwLmMKaW5kZXggNjgwNzRjOS4uNDk5YmRiZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODYwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODYwLmMKQEAgLTUzOCwxMiArNTM4LDE0IEBACiAJLnNldF9iaWFzX2xldmVsID0gbWF4OTg2MF9zZXRfYmlhc19sZXZlbCwKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSBtYXg5ODYwX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKG1heDk4NjBfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBtYXg5ODYwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUobWF4OTg2MF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IG1heDk4NjBfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUobWF4OTg2MF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBtYXg5ODYwX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUobWF4OTg2MF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gbWF4OTg2MF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShtYXg5ODYwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBtYXg5ODYwX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShtYXg5ODYwX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogI2lmZGVmIENPTkZJR19QTQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODY3LmMgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4NjcuYwppbmRleCAyYTIyZmRkLi40MmUyZTQwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL21heDk4NjcuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4NjcuYwpAQCAtMzgsMTEgKzM4LDEwIEBACiBzdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUobWF4OTg2MF9taWNfdGx2LCAyMDAwLCAxMDAsIDEpOwogc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKG1heDk4NjBfYWRjX2xlZnRfdGx2LCAtMTIwMCwgMTAwLCAxKTsKIHN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShtYXg5ODYwX2FkY19yaWdodF90bHYsIC0xMjAwLCAxMDAsIDEpOwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtYXg5ODA4OF9taWNib29zdF90bHZbXSA9IHsKLQlUTFZfREJfUkFOR0VfSEVBRCgyKSwKK3N0YXRpYyBjb25zdCBTTkRSVl9DVExfVExWRF9ERUNMQVJFX0RCX1JBTkdFKG1heDk4MDg4X21pY2Jvb3N0X3RsdiwKIAkwLCAxLCBUTFZfREJfU0NBTEVfSVRFTSgwLCAyMDAwLCAwKSwKIAkyLCAyLCBUTFZfREJfU0NBTEVfSVRFTSgzMDAwLCAwLCAwKSwKLX07CispOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbWF4OTg2N19zbmRfY29udHJvbHNbXSA9IHsKIAlTT0NfRE9VQkxFX1IoIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCBNQVg5ODY3X0xFRlRWT0wsCkBAIC00MTcsMTIgKzQxNiwxNCBAQAogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIG1heDk4NjdfY29kZWMgPSB7CiAJLnByb2JlID0gbWF4OTg2N19wcm9iZSwKLQkuY29udHJvbHMgPSBtYXg5ODY3X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShtYXg5ODY3X3NuZF9jb250cm9scyksCi0JLmRhcG1fcm91dGVzID0gbWF4OTg2N19hdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUobWF4OTg2N19hdWRpb19tYXApLAotCS5kYXBtX3dpZGdldHMgPSBtYXg5ODY3X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUobWF4OTg2N19kYXBtX3dpZGdldHMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gbWF4OTg2N19zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShtYXg5ODY3X3NuZF9jb250cm9scyksCisJCS5kYXBtX3JvdXRlcwkJPSBtYXg5ODY3X2F1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUobWF4OTg2N19hdWRpb19tYXApLAorCQkuZGFwbV93aWRnZXRzCQk9IG1heDk4NjdfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUobWF4OTg2N19kYXBtX3dpZGdldHMpLAorCX0sCiB9OwogCiBzdGF0aWMgYm9vbCBtYXg5ODY3X3ZvbGF0aWxlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg5MjUuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg5MjUuYwppbmRleCA1OTkwZGUzLi4zMjdlYWEyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL21heDk4OTI1LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODkyNS5jCkBAIC01NDAsMTIgKzU0MCwxNCBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfbWF4OTg5MjUgPSB7CiAJLnByb2JlICAgICAgICAgICAgPSBtYXg5ODkyNV9wcm9iZSwKLQkuY29udHJvbHMgPSBtYXg5ODkyNV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUobWF4OTg5MjVfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV9yb3V0ZXMgPSBtYXg5ODkyNV9hdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUobWF4OTg5MjVfYXVkaW9fbWFwKSwKLQkuZGFwbV93aWRnZXRzID0gbWF4OTg5MjVfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShtYXg5ODkyNV9kYXBtX3dpZGdldHMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gbWF4OTg5MjVfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUobWF4OTg5MjVfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fcm91dGVzCQk9IG1heDk4OTI1X2F1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUobWF4OTg5MjVfYXVkaW9fbWFwKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBtYXg5ODkyNV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShtYXg5ODkyNV9kYXBtX3dpZGdldHMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgbWF4OTg5MjVfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODkyNi5jIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODkyNi5jCmluZGV4IDhkMTRhZGEuLjFlZmY3ZTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg5MjYuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4OTI2LmMKQEAgLTM0Nyw3ICszNDcsNyBAQAogCQltYXg5ODkyNl9zZXRfc2Vuc2VfZGF0YShtYXg5ODkyNik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkRBSSBjbG9jayBtb2RlIHVuc3VwcG9ydGVkIik7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkRBSSBjbG9jayBtb2RlIHVuc3VwcG9ydGVkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0zNjQsNyArMzY0LDcgQEAKIAkJaW52ZXJ0ID0gTUFYOTg5MjZfREFJX0JDSV9NQVNLIHwgTUFYOTg5MjZfREFJX1dDSV9NQVNLOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJEQUkgaW52ZXJ0IG1vZGUgdW5zdXBwb3J0ZWQiKTsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiREFJIGludmVydCBtb2RlIHVuc3VwcG9ydGVkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC00MDgsNyArNDA4LDcgQEAKIAkJbWF4OTg5MjYtPmNoX3NpemUgPSAzMjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiZm9ybWF0IHVuc3VwcG9ydGVkICVkIiwKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiZm9ybWF0IHVuc3VwcG9ydGVkICVkXG4iLAogCQkJcGFyYW1zX2Zvcm1hdChwYXJhbXMpKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNDk4LDEyICs0OTgsMTQgQEAKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X21heDk4OTI2ID0gewogCS5wcm9iZQk9IG1heDk4OTI2X3Byb2JlLAotCS5jb250cm9scyA9IG1heDk4OTI2X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShtYXg5ODkyNl9zbmRfY29udHJvbHMpLAotCS5kYXBtX3JvdXRlcyA9IG1heDk4OTI2X2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShtYXg5ODkyNl9hdWRpb19tYXApLAotCS5kYXBtX3dpZGdldHMgPSBtYXg5ODkyNl9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKG1heDk4OTI2X2RhcG1fd2lkZ2V0cyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBtYXg5ODkyNl9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShtYXg5ODkyNl9zbmRfY29udHJvbHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gbWF4OTg5MjZfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShtYXg5ODkyNl9hdWRpb19tYXApLAorCQkuZGFwbV93aWRnZXRzCQk9IG1heDk4OTI2X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKG1heDk4OTI2X2RhcG1fd2lkZ2V0cyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBtYXg5ODkyNl9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21jMTM3ODMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbWMxMzc4My5jCmluZGV4IDNlNzcwY2IuLjkwNTYyNzAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbWMxMzc4My5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbWMxMzc4My5jCkBAIC03MzcsMTIgKzczNywxNCBAQAogCS5wcm9iZQkJPSBtYzEzNzgzX3Byb2JlLAogCS5yZW1vdmUJCT0gbWMxMzc4M19yZW1vdmUsCiAJLmdldF9yZWdtYXAJPSBtYzEzNzgzX2dldF9yZWdtYXAsCi0JLmNvbnRyb2xzCT0gbWMxMzc4M19jb250cm9sX2xpc3QsCi0JLm51bV9jb250cm9scwk9IEFSUkFZX1NJWkUobWMxMzc4M19jb250cm9sX2xpc3QpLAotCS5kYXBtX3dpZGdldHMJPSBtYzEzNzgzX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUobWMxMzc4M19kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcwk9IG1jMTM3ODNfcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKG1jMTM3ODNfcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IG1jMTM3ODNfY29udHJvbF9saXN0LAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUobWMxMzc4M19jb250cm9sX2xpc3QpLAorCQkuZGFwbV93aWRnZXRzCQk9IG1jMTM3ODNfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUobWMxMzc4M19kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gbWMxMzc4M19yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKG1jMTM3ODNfcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCBfX2luaXQgbWMxMzc4M19jb2RlY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tbDI2MTI0LmMgYi9zb3VuZC9zb2MvY29kZWNzL21sMjYxMjQuYwppbmRleCBmNTYxYzc4Li42OWU1ZTE4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL21sMjYxMjQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL21sMjYxMjQuYwpAQCAtNTQxLDEyICs1NDEsMTQgQEAKIAkucHJvYmUgPQltbDI2MTI0X3Byb2JlLAogCS5zZXRfYmlhc19sZXZlbCA9IG1sMjYxMjRfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAotCS5kYXBtX3dpZGdldHMgPSBtbDI2MTI0X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUobWwyNjEyNF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IG1sMjYxMjRfaW50ZXJjb24sCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUobWwyNjEyNF9pbnRlcmNvbiksCi0JLmNvbnRyb2xzID0gbWwyNjEyNF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUobWwyNjEyNF9zbmRfY29udHJvbHMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gbWwyNjEyNF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShtbDI2MTI0X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gbWwyNjEyNF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShtbDI2MTI0X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBtbDI2MTI0X2ludGVyY29uLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShtbDI2MTI0X2ludGVyY29uKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIG1sMjYxMjRfaTJjX3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbmF1ODgxMC5jIGIvc291bmQvc29jL2NvZGVjcy9uYXU4ODEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ1NTE4NgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbmF1ODgxMC5jCkBAIC0wLDAgKzEsODg0IEBACisvKgorICogbmF1ODgxMC5jICAtLSAgTkFVODgxMCBBTFNBIFNvYyBBdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxNiBOdXZvdG9uIFRlY2hub2xvZ3kgQ29ycC4KKyAqCisgKiBBdXRob3I6IERhdmlkIExpbiA8Y3RsaW4wQG51dm90b24uY29tPgorICoKKyAqIEJhc2VkIG9uIFdNODk3NC5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KKworI2luY2x1ZGUgIm5hdTg4MTAuaCIKKworI2RlZmluZSBOQVVfUExMX0ZSRVFfTUFYIDEwMDAwMDAwMAorI2RlZmluZSBOQVVfUExMX0ZSRVFfTUlOIDkwMDAwMDAwCisjZGVmaW5lIE5BVV9QTExfUkVGX01BWCAzMzAwMDAwMAorI2RlZmluZSBOQVVfUExMX1JFRl9NSU4gODAwMDAwMAorI2RlZmluZSBOQVVfUExMX09QVE9QX01JTiA2CisKKworc3RhdGljIGNvbnN0IGludCBuYXU4ODEwX21jbGtfc2NhbGVyW10gPSB7IDEwLCAxNSwgMjAsIDMwLCA0MCwgNjAsIDgwLCAxMjAgfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCBuYXU4ODEwX3JlZ19kZWZhdWx0c1tdID0geworCXsgTkFVODgxMF9SRUdfUE9XRVIxLCAweDAwMDAgfSwKKwl7IE5BVTg4MTBfUkVHX1BPV0VSMiwgMHgwMDAwIH0sCisJeyBOQVU4ODEwX1JFR19QT1dFUjMsIDB4MDAwMCB9LAorCXsgTkFVODgxMF9SRUdfSUZBQ0UsIDB4MDA1MCB9LAorCXsgTkFVODgxMF9SRUdfQ09NUCwgMHgwMDAwIH0sCisJeyBOQVU4ODEwX1JFR19DTE9DSywgMHgwMTQwIH0sCisJeyBOQVU4ODEwX1JFR19TTVBMUiwgMHgwMDAwIH0sCisJeyBOQVU4ODEwX1JFR19EQUMsIDB4MDAwMCB9LAorCXsgTkFVODgxMF9SRUdfREFDR0FJTiwgMHgwMEZGIH0sCisJeyBOQVU4ODEwX1JFR19BREMsIDB4MDEwMCB9LAorCXsgTkFVODgxMF9SRUdfQURDR0FJTiwgMHgwMEZGIH0sCisJeyBOQVU4ODEwX1JFR19FUTEsIDB4MDEyQyB9LAorCXsgTkFVODgxMF9SRUdfRVEyLCAweDAwMkMgfSwKKwl7IE5BVTg4MTBfUkVHX0VRMywgMHgwMDJDIH0sCisJeyBOQVU4ODEwX1JFR19FUTQsIDB4MDAyQyB9LAorCXsgTkFVODgxMF9SRUdfRVE1LCAweDAwMkMgfSwKKwl7IE5BVTg4MTBfUkVHX0RBQ0xJTTEsIDB4MDAzMiB9LAorCXsgTkFVODgxMF9SRUdfREFDTElNMiwgMHgwMDAwIH0sCisJeyBOQVU4ODEwX1JFR19OT1RDSDEsIDB4MDAwMCB9LAorCXsgTkFVODgxMF9SRUdfTk9UQ0gyLCAweDAwMDAgfSwKKwl7IE5BVTg4MTBfUkVHX05PVENIMywgMHgwMDAwIH0sCisJeyBOQVU4ODEwX1JFR19OT1RDSDQsIDB4MDAwMCB9LAorCXsgTkFVODgxMF9SRUdfQUxDMSwgMHgwMDM4IH0sCisJeyBOQVU4ODEwX1JFR19BTEMyLCAweDAwMEIgfSwKKwl7IE5BVTg4MTBfUkVHX0FMQzMsIDB4MDAzMiB9LAorCXsgTkFVODgxMF9SRUdfTk9JU0VHQVRFLCAweDAwMDAgfSwKKwl7IE5BVTg4MTBfUkVHX1BMTE4sIDB4MDAwOCB9LAorCXsgTkFVODgxMF9SRUdfUExMSzEsIDB4MDAwQyB9LAorCXsgTkFVODgxMF9SRUdfUExMSzIsIDB4MDA5MyB9LAorCXsgTkFVODgxMF9SRUdfUExMSzMsIDB4MDBFOSB9LAorCXsgTkFVODgxMF9SRUdfQVRURU4sIDB4MDAwMCB9LAorCXsgTkFVODgxMF9SRUdfSU5QVVRfU0lHTkFMLCAweDAwMDMgfSwKKwl7IE5BVTg4MTBfUkVHX1BHQUdBSU4sIDB4MDAxMCB9LAorCXsgTkFVODgxMF9SRUdfQURDQk9PU1QsIDB4MDEwMCB9LAorCXsgTkFVODgxMF9SRUdfT1VUUFVULCAweDAwMDIgfSwKKwl7IE5BVTg4MTBfUkVHX1NQS01JWCwgMHgwMDAxIH0sCisJeyBOQVU4ODEwX1JFR19TUEtHQUlOLCAweDAwMzkgfSwKKwl7IE5BVTg4MTBfUkVHX01PTk9NSVgsIDB4MDAwMSB9LAorCXsgTkFVODgxMF9SRUdfUE9XRVI0LCAweDAwMDAgfSwKKwl7IE5BVTg4MTBfUkVHX1RTTE9UQ1RMMSwgMHgwMDAwIH0sCisJeyBOQVU4ODEwX1JFR19UU0xPVENUTDIsIDB4MDAyMCB9LAorCXsgTkFVODgxMF9SRUdfREVWSUNFX1JFVklELCAweDAwMDAgfSwKKwl7IE5BVTg4MTBfUkVHX0kyQ19ERVZJQ0VJRCwgMHgwMDFBIH0sCisJeyBOQVU4ODEwX1JFR19BRERJVElPTklELCAweDAwQ0EgfSwKKwl7IE5BVTg4MTBfUkVHX1JFU0VSVkUsIDB4MDEyNCB9LAorCXsgTkFVODgxMF9SRUdfT1VUQ1RMLCAweDAwMDEgfSwKKwl7IE5BVTg4MTBfUkVHX0FMQzFFTkhBTjEsIDB4MDAxMCB9LAorCXsgTkFVODgxMF9SRUdfQUxDMUVOSEFOMiwgMHgwMDAwIH0sCisJeyBOQVU4ODEwX1JFR19NSVNDQ1RMLCAweDAwMDAgfSwKKwl7IE5BVTg4MTBfUkVHX09VVFRJRU9GRiwgMHgwMDAwIH0sCisJeyBOQVU4ODEwX1JFR19BR0NQMlBPVVQsIDB4MDAwMCB9LAorCXsgTkFVODgxMF9SRUdfQUdDUE9VVCwgMHgwMDAwIH0sCisJeyBOQVU4ODEwX1JFR19BTVRDVEwsIDB4MDAwMCB9LAorCXsgTkFVODgxMF9SRUdfT1VUVElFT0ZGTUFOLCAweDAwMDAgfSwKK307CisKK3N0YXRpYyBib29sIG5hdTg4MTBfcmVhZGFibGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgTkFVODgxMF9SRUdfUkVTRVQgLi4uIE5BVTg4MTBfUkVHX1NNUExSOgorCWNhc2UgTkFVODgxMF9SRUdfREFDIC4uLiBOQVU4ODEwX1JFR19EQUNHQUlOOgorCWNhc2UgTkFVODgxMF9SRUdfQURDIC4uLiBOQVU4ODEwX1JFR19BRENHQUlOOgorCWNhc2UgTkFVODgxMF9SRUdfRVExIC4uLiBOQVU4ODEwX1JFR19FUTU6CisJY2FzZSBOQVU4ODEwX1JFR19EQUNMSU0xIC4uLiBOQVU4ODEwX1JFR19EQUNMSU0yOgorCWNhc2UgTkFVODgxMF9SRUdfTk9UQ0gxIC4uLiBOQVU4ODEwX1JFR19OT1RDSDQ6CisJY2FzZSBOQVU4ODEwX1JFR19BTEMxIC4uLiBOQVU4ODEwX1JFR19BVFRFTjoKKwljYXNlIE5BVTg4MTBfUkVHX0lOUFVUX1NJR05BTCAuLi4gTkFVODgxMF9SRUdfUEdBR0FJTjoKKwljYXNlIE5BVTg4MTBfUkVHX0FEQ0JPT1NUOgorCWNhc2UgTkFVODgxMF9SRUdfT1VUUFVUIC4uLiBOQVU4ODEwX1JFR19TUEtNSVg6CisJY2FzZSBOQVU4ODEwX1JFR19TUEtHQUlOOgorCWNhc2UgTkFVODgxMF9SRUdfTU9OT01JWDoKKwljYXNlIE5BVTg4MTBfUkVHX1BPV0VSNCAuLi4gTkFVODgxMF9SRUdfVFNMT1RDVEwyOgorCWNhc2UgTkFVODgxMF9SRUdfREVWSUNFX1JFVklEIC4uLiBOQVU4ODEwX1JFR19SRVNFUlZFOgorCWNhc2UgTkFVODgxMF9SRUdfT1VUQ1RMIC4uLiBOQVU4ODEwX1JFR19BTEMxRU5IQU4yOgorCWNhc2UgTkFVODgxMF9SRUdfTUlTQ0NUTDoKKwljYXNlIE5BVTg4MTBfUkVHX09VVFRJRU9GRiAuLi4gTkFVODgxMF9SRUdfT1VUVElFT0ZGTUFOOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitzdGF0aWMgYm9vbCBuYXU4ODEwX3dyaXRlYWJsZV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBOQVU4ODEwX1JFR19SRVNFVCAuLi4gTkFVODgxMF9SRUdfU01QTFI6CisJY2FzZSBOQVU4ODEwX1JFR19EQUMgLi4uIE5BVTg4MTBfUkVHX0RBQ0dBSU46CisJY2FzZSBOQVU4ODEwX1JFR19BREMgLi4uIE5BVTg4MTBfUkVHX0FEQ0dBSU46CisJY2FzZSBOQVU4ODEwX1JFR19FUTEgLi4uIE5BVTg4MTBfUkVHX0VRNToKKwljYXNlIE5BVTg4MTBfUkVHX0RBQ0xJTTEgLi4uIE5BVTg4MTBfUkVHX0RBQ0xJTTI6CisJY2FzZSBOQVU4ODEwX1JFR19OT1RDSDEgLi4uIE5BVTg4MTBfUkVHX05PVENINDoKKwljYXNlIE5BVTg4MTBfUkVHX0FMQzEgLi4uIE5BVTg4MTBfUkVHX0FUVEVOOgorCWNhc2UgTkFVODgxMF9SRUdfSU5QVVRfU0lHTkFMIC4uLiBOQVU4ODEwX1JFR19QR0FHQUlOOgorCWNhc2UgTkFVODgxMF9SRUdfQURDQk9PU1Q6CisJY2FzZSBOQVU4ODEwX1JFR19PVVRQVVQgLi4uIE5BVTg4MTBfUkVHX1NQS01JWDoKKwljYXNlIE5BVTg4MTBfUkVHX1NQS0dBSU46CisJY2FzZSBOQVU4ODEwX1JFR19NT05PTUlYOgorCWNhc2UgTkFVODgxMF9SRUdfUE9XRVI0IC4uLiBOQVU4ODEwX1JFR19UU0xPVENUTDI6CisJY2FzZSBOQVU4ODEwX1JFR19PVVRDVEwgLi4uIE5BVTg4MTBfUkVHX0FMQzFFTkhBTjI6CisJY2FzZSBOQVU4ODEwX1JFR19NSVNDQ1RMOgorCWNhc2UgTkFVODgxMF9SRUdfT1VUVElFT0ZGIC4uLiBOQVU4ODEwX1JFR19PVVRUSUVPRkZNQU46CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0YXRpYyBib29sIG5hdTg4MTBfdm9sYXRpbGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgTkFVODgxMF9SRUdfUkVTRVQ6CisJY2FzZSBOQVU4ODEwX1JFR19ERVZJQ0VfUkVWSUQgLi4uIE5BVTg4MTBfUkVHX1JFU0VSVkU6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKKy8qIFRoZSBFUSBwYXJhbWV0ZXJzIGdldCBmdW5jdGlvbiBpcyB0byBnZXQgdGhlIDUgYmFuZCBlcXVhbGl6ZXIgY29udHJvbC4KKyAqIFRoZSByZWdtYXAgcmF3IHJlYWQgY2FuJ3Qgd29yayBoZXJlIGJlY2F1c2UgcmVnbWFwIGRvZXNuJ3QgcHJvdmlkZQorICogdmFsdWUgZm9ybWF0IGZvciB2YWx1ZSB3aWR0aCBvZiA5IGJpdHMuIFRoZXJlZm9yZSwgdGhlIGRyaXZlciByZWFkcyBkYXRhCisgKiBmcm9tIGNhY2hlIGFuZCBtYWtlcyB2YWx1ZSBmb3JtYXQgYWNjb3JkaW5nIHRvIHRoZSBlbmRpYW5uZXNzIG9mCisgKiBieXRlcyB0eXBlIGNvbnRyb2wgZWxlbWVudC4KKyAqLworc3RhdGljIGludCBuYXU4ODEwX2VxX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlzdHJ1Y3QgbmF1ODgxMCAqbmF1ODgxMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBzb2NfYnl0ZXNfZXh0ICpwYXJhbXMgPSAodm9pZCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCWludCBpLCByZWcsIHJlZ192YWw7CisJdTE2ICp2YWw7CisKKwl2YWwgPSAodTE2ICopdWNvbnRyb2wtPnZhbHVlLmJ5dGVzLmRhdGE7CisJcmVnID0gTkFVODgxMF9SRUdfRVExOworCWZvciAoaSA9IDA7IGkgPCBwYXJhbXMtPm1heCAvIHNpemVvZih1MTYpOyBpKyspIHsKKwkJcmVnbWFwX3JlYWQobmF1ODgxMC0+cmVnbWFwLCByZWcgKyBpLCAmcmVnX3ZhbCk7CisJCS8qIGNvbnZlcnNpb24gb2YgMTYtYml0IGludGVnZXJzIGJldHdlZW4gbmF0aXZlIENQVSBmb3JtYXQKKwkJICogYW5kIGJpZyBlbmRpYW4gZm9ybWF0CisJCSAqLworCQlyZWdfdmFsID0gY3B1X3RvX2JlMTYocmVnX3ZhbCk7CisJCW1lbWNweSh2YWwgKyBpLCAmcmVnX3ZhbCwgc2l6ZW9mKHJlZ192YWwpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIEVRIHBhcmFtZXRlcnMgcHV0IGZ1bmN0aW9uIGlzIHRvIG1ha2UgY29uZmlndXJhdGlvbiBvZiA1IGJhbmQgZXF1YWxpemVyCisgKiBjb250cm9sLiBUaGVzZSBjb25maWd1cmF0aW9uIGluY2x1ZGVzIGNlbnRyYWwgZnJlcXVlbmN5LCBlcXVhbGl6ZXIgZ2FpbiwKKyAqIGN1dC1vZmYgZnJlcXVlbmN5LCBiYW5kd2lkdGggY29udHJvbCwgYW5kIGVxdWFsaXplciBwYXRoLgorICogVGhlIHJlZ21hcCByYXcgd3JpdGUgY2FuJ3Qgd29yayBoZXJlIGJlY2F1c2UgcmVnbWFwIGRvZXNuJ3QgcHJvdmlkZQorICogcmVnaXN0ZXIgYW5kIHZhbHVlIGZvcm1hdCBmb3IgcmVnaXN0ZXIgd2l0aCBhZGRyZXNzIDcgYml0cyBhbmQgdmFsdWUgOSBiaXRzLgorICogVGhlcmVmb3JlLCB0aGUgZHJpdmVyIG1ha2VzIHZhbHVlIGZvcm1hdCBhY2NvcmRpbmcgdG8gdGhlIGVuZGlhbm5lc3Mgb2YKKyAqIGJ5dGVzIHR5cGUgY29udHJvbCBlbGVtZW50IGFuZCB3cml0ZXMgZGF0YSB0byBjb2RlYy4KKyAqLworc3RhdGljIGludCBuYXU4ODEwX2VxX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlzdHJ1Y3QgbmF1ODgxMCAqbmF1ODgxMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBzb2NfYnl0ZXNfZXh0ICpwYXJhbXMgPSAodm9pZCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCXZvaWQgKmRhdGE7CisJdTE2ICp2YWwsIHZhbHVlOworCWludCBpLCByZWcsIHJldDsKKworCWRhdGEgPSBrbWVtZHVwKHVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhLAorCQlwYXJhbXMtPm1heCwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl2YWwgPSAodTE2ICopZGF0YTsKKwlyZWcgPSBOQVU4ODEwX1JFR19FUTE7CisJZm9yIChpID0gMDsgaSA8IHBhcmFtcy0+bWF4IC8gc2l6ZW9mKHUxNik7IGkrKykgeworCQkvKiBjb252ZXJzaW9uIG9mIDE2LWJpdCBpbnRlZ2VycyBiZXR3ZWVuIG5hdGl2ZSBDUFUgZm9ybWF0CisJCSAqIGFuZCBiaWcgZW5kaWFuIGZvcm1hdAorCQkgKi8KKwkJdmFsdWUgPSBiZTE2X3RvX2NwdSgqKHZhbCArIGkpKTsKKwkJcmV0ID0gcmVnbWFwX3dyaXRlKG5hdTg4MTAtPnJlZ21hcCwgcmVnICsgaSwgdmFsdWUpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJFUSBjb25maWd1cmF0aW9uIGZhaWwsIHJlZ2lzdGVyOiAleCByZXQ6ICVkXG4iLAorCQkJCXJlZyArIGksIHJldCk7CisJCQlrZnJlZShkYXRhKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJa2ZyZWUoZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYXU4ODEwX2NvbXBhbmRpbmdbXSA9IHsKKwkiT2ZmIiwgIk5DIiwgInUtbGF3IiwgIkEtbGF3IiB9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG5hdTg4MTBfY29tcGFuZGluZ19hZGNfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKE5BVTg4MTBfUkVHX0NPTVAsIE5BVTg4MTBfQURDQ01fU0ZULAorCQlBUlJBWV9TSVpFKG5hdTg4MTBfY29tcGFuZGluZyksIG5hdTg4MTBfY29tcGFuZGluZyk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbmF1ODgxMF9jb21wYW5kaW5nX2RhY19lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoTkFVODgxMF9SRUdfQ09NUCwgTkFVODgxMF9EQUNDTV9TRlQsCisJCUFSUkFZX1NJWkUobmF1ODgxMF9jb21wYW5kaW5nKSwgbmF1ODgxMF9jb21wYW5kaW5nKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYXU4ODEwX2RlZW1wW10gPSB7CisJIk5vbmUiLCAiMzJrSHoiLCAiNDQuMWtIeiIsICI0OGtIeiIgfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBuYXU4ODEwX2RlZW1wX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShOQVU4ODEwX1JFR19EQUMsIE5BVTg4MTBfREVFTVBfU0ZULAorCQlBUlJBWV9TSVpFKG5hdTg4MTBfZGVlbXApLCBuYXU4ODEwX2RlZW1wKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYXU4ODEwX2VxbW9kZVtdID0geyJDYXB0dXJlIiwgIlBsYXliYWNrIiB9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG5hdTg4MTBfZXFtb2RlX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShOQVU4ODEwX1JFR19FUTEsIE5BVTg4MTBfRVFNX1NGVCwKKwkJQVJSQVlfU0laRShuYXU4ODEwX2VxbW9kZSksIG5hdTg4MTBfZXFtb2RlKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYXU4ODEwX2FsY1tdID0geyJOb3JtYWwiLCAiTGltaXRlciIgfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBuYXU4ODEwX2FsY19lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoTkFVODgxMF9SRUdfQUxDMywgTkFVODgxMF9BTENNX1NGVCwKKwkJQVJSQVlfU0laRShuYXU4ODEwX2FsYyksIG5hdTg4MTBfYWxjKTsKKworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRpZ2l0YWxfdGx2LCAtMTI3NTAsIDUwLCAxKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShlcV90bHYsIC0xMjAwLCAxMDAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGlucGdhX3RsdiwgLTEyMDAsIDc1LCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShzcGtfdGx2LCAtNTcwMCwgMTAwLCAwKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG5hdTg4MTBfc25kX2NvbnRyb2xzW10gPSB7CisJU09DX0VOVU0oIkFEQyBDb21wYW5kaW5nIiwgbmF1ODgxMF9jb21wYW5kaW5nX2FkY19lbnVtKSwKKwlTT0NfRU5VTSgiREFDIENvbXBhbmRpbmciLCBuYXU4ODEwX2NvbXBhbmRpbmdfZGFjX2VudW0pLAorCVNPQ19FTlVNKCJEQUMgRGUtZW1waGFzaXMiLCBuYXU4ODEwX2RlZW1wX2VudW0pLAorCisJU09DX0VOVU0oIkVRIEZ1bmN0aW9uIiwgbmF1ODgxMF9lcW1vZGVfZW51bSksCisJU05EX1NPQ19CWVRFU19FWFQoIkVRIFBhcmFtZXRlcnMiLCAxMCwKKwkJICBuYXU4ODEwX2VxX2dldCwgbmF1ODgxMF9lcV9wdXQpLAorCisJU09DX1NJTkdMRSgiREFDIEludmVyc2lvbiBTd2l0Y2giLCBOQVU4ODEwX1JFR19EQUMsCisJCU5BVTg4MTBfREFDUExfU0ZULCAxLCAwKSwKKwlTT0NfU0lOR0xFX1RMVigiUGxheWJhY2sgVm9sdW1lIiwgTkFVODgxMF9SRUdfREFDR0FJTiwKKwkJTkFVODgxMF9EQUNHQUlOX1NGVCwgMHhmZiwgMCwgZGlnaXRhbF90bHYpLAorCisJU09DX1NJTkdMRSgiSGlnaCBQYXNzIEZpbHRlciBTd2l0Y2giLCBOQVU4ODEwX1JFR19BREMsCisJCU5BVTg4MTBfSFBGRU5fU0ZULCAxLCAwKSwKKwlTT0NfU0lOR0xFKCJIaWdoIFBhc3MgQ3V0IE9mZiIsIE5BVTg4MTBfUkVHX0FEQywKKwkJTkFVODgxMF9IUEZfU0ZULCAweDcsIDApLAorCisJU09DX1NJTkdMRSgiQURDIEludmVyc2lvbiBTd2l0Y2giLCBOQVU4ODEwX1JFR19BREMsCisJCU5BVTg4MTBfQURDUExfU0ZULCAxLCAwKSwKKwlTT0NfU0lOR0xFX1RMVigiQ2FwdHVyZSBWb2x1bWUiLCBOQVU4ODEwX1JFR19BRENHQUlOLAorCQlOQVU4ODEwX0FEQ0dBSU5fU0ZULCAweGZmLCAwLCBkaWdpdGFsX3RsdiksCisKKwlTT0NfU0lOR0xFX1RMVigiRVExIFZvbHVtZSIsIE5BVTg4MTBfUkVHX0VRMSwKKwkJTkFVODgxMF9FUTFHQ19TRlQsIDB4MTgsIDEsIGVxX3RsdiksCisJU09DX1NJTkdMRV9UTFYoIkVRMiBWb2x1bWUiLCBOQVU4ODEwX1JFR19FUTIsCisJCU5BVTg4MTBfRVEyR0NfU0ZULCAweDE4LCAxLCBlcV90bHYpLAorCVNPQ19TSU5HTEVfVExWKCJFUTMgVm9sdW1lIiwgTkFVODgxMF9SRUdfRVEzLAorCQlOQVU4ODEwX0VRM0dDX1NGVCwgMHgxOCwgMSwgZXFfdGx2KSwKKwlTT0NfU0lOR0xFX1RMVigiRVE0IFZvbHVtZSIsIE5BVTg4MTBfUkVHX0VRNCwKKwkJTkFVODgxMF9FUTRHQ19TRlQsIDB4MTgsIDEsIGVxX3RsdiksCisJU09DX1NJTkdMRV9UTFYoIkVRNSBWb2x1bWUiLCBOQVU4ODEwX1JFR19FUTUsCisJCU5BVTg4MTBfRVE1R0NfU0ZULCAweDE4LCAxLCBlcV90bHYpLAorCisJU09DX1NJTkdMRSgiREFDIExpbWl0ZXIgU3dpdGNoIiwgTkFVODgxMF9SRUdfREFDTElNMSwKKwkJTkFVODgxMF9EQUNMSU1FTl9TRlQsIDEsIDApLAorCVNPQ19TSU5HTEUoIkRBQyBMaW1pdGVyIERlY2F5IiwgTkFVODgxMF9SRUdfREFDTElNMSwKKwkJTkFVODgxMF9EQUNMSU1EQ1lfU0ZULCAweGYsIDApLAorCVNPQ19TSU5HTEUoIkRBQyBMaW1pdGVyIEF0dGFjayIsIE5BVTg4MTBfUkVHX0RBQ0xJTTEsCisJCU5BVTg4MTBfREFDTElNQVRLX1NGVCwgMHhmLCAwKSwKKwlTT0NfU0lOR0xFKCJEQUMgTGltaXRlciBUaHJlc2hvbGQiLCBOQVU4ODEwX1JFR19EQUNMSU0yLAorCQlOQVU4ODEwX0RBQ0xJTVRITF9TRlQsIDB4NywgMCksCisJU09DX1NJTkdMRSgiREFDIExpbWl0ZXIgQm9vc3QiLCBOQVU4ODEwX1JFR19EQUNMSU0yLAorCQlOQVU4ODEwX0RBQ0xJTUJTVF9TRlQsIDB4ZiwgMCksCisKKwlTT0NfRU5VTSgiQUxDIE1vZGUiLCBuYXU4ODEwX2FsY19lbnVtKSwKKwlTT0NfU0lOR0xFKCJBTEMgRW5hYmxlIFN3aXRjaCIsIE5BVTg4MTBfUkVHX0FMQzEsCisJCU5BVTg4MTBfQUxDRU5fU0ZULCAxLCAwKSwKKwlTT0NfU0lOR0xFKCJBTEMgTWF4IFZvbHVtZSIsIE5BVTg4MTBfUkVHX0FMQzEsCisJCU5BVTg4MTBfQUxDTVhHQUlOX1NGVCwgMHg3LCAwKSwKKwlTT0NfU0lOR0xFKCJBTEMgTWluIFZvbHVtZSIsIE5BVTg4MTBfUkVHX0FMQzEsCisJCU5BVTg4MTBfQUxDTUlOR0FJTl9TRlQsIDB4NywgMCksCisJU09DX1NJTkdMRSgiQUxDIFpDIFN3aXRjaCIsIE5BVTg4MTBfUkVHX0FMQzIsCisJCU5BVTg4MTBfQUxDWkNfU0ZULCAxLCAwKSwKKwlTT0NfU0lOR0xFKCJBTEMgSG9sZCIsIE5BVTg4MTBfUkVHX0FMQzIsCisJCU5BVTg4MTBfQUxDSFRfU0ZULCAweGYsIDApLAorCVNPQ19TSU5HTEUoIkFMQyBUYXJnZXQiLCBOQVU4ODEwX1JFR19BTEMyLAorCQlOQVU4ODEwX0FMQ1NMX1NGVCwgMHhmLCAwKSwKKwlTT0NfU0lOR0xFKCJBTEMgRGVjYXkiLCBOQVU4ODEwX1JFR19BTEMzLAorCQlOQVU4ODEwX0FMQ0RDWV9TRlQsIDB4ZiwgMCksCisJU09DX1NJTkdMRSgiQUxDIEF0dGFjayIsIE5BVTg4MTBfUkVHX0FMQzMsCisJCU5BVTg4MTBfQUxDQVRLX1NGVCwgMHhmLCAwKSwKKwlTT0NfU0lOR0xFKCJBTEMgTm9pc2UgR2F0ZSBTd2l0Y2giLCBOQVU4ODEwX1JFR19OT0lTRUdBVEUsCisJCU5BVTg4MTBfQUxDTkVOX1NGVCwgMSwgMCksCisJU09DX1NJTkdMRSgiQUxDIE5vaXNlIEdhdGUgVGhyZXNob2xkIiwgTkFVODgxMF9SRUdfTk9JU0VHQVRFLAorCQlOQVU4ODEwX0FMQ05USF9TRlQsIDB4NywgMCksCisKKwlTT0NfU0lOR0xFKCJQR0EgWkMgU3dpdGNoIiwgTkFVODgxMF9SRUdfUEdBR0FJTiwKKwkJTkFVODgxMF9QR0FaQ19TRlQsIDEsIDApLAorCVNPQ19TSU5HTEVfVExWKCJQR0EgVm9sdW1lIiwgTkFVODgxMF9SRUdfUEdBR0FJTiwKKwkJTkFVODgxMF9QR0FHQUlOX1NGVCwgMHgzZiwgMCwgaW5wZ2FfdGx2KSwKKworCVNPQ19TSU5HTEUoIlNwZWFrZXIgWkMgU3dpdGNoIiwgTkFVODgxMF9SRUdfU1BLR0FJTiwKKwkJTkFVODgxMF9TUEtaQ19TRlQsIDEsIDApLAorCVNPQ19TSU5HTEUoIlNwZWFrZXIgTXV0ZSBTd2l0Y2giLCBOQVU4ODEwX1JFR19TUEtHQUlOLAorCQlOQVU4ODEwX1NQS01UX1NGVCwgMSwgMCksCisJU09DX1NJTkdMRV9UTFYoIlNwZWFrZXIgVm9sdW1lIiwgTkFVODgxMF9SRUdfU1BLR0FJTiwKKwkJTkFVODgxMF9TUEtHQUlOX1NGVCwgMHgzZiwgMCwgc3BrX3RsdiksCisKKwlTT0NfU0lOR0xFKCJDYXB0dXJlIEJvb3N0KCsyMGRCKSIsIE5BVTg4MTBfUkVHX0FEQ0JPT1NULAorCQlOQVU4ODEwX1BHQUJTVF9TRlQsIDEsIDApLAorCVNPQ19TSU5HTEUoIk1vbm8gTXV0ZSBTd2l0Y2giLCBOQVU4ODEwX1JFR19NT05PTUlYLAorCQlOQVU4ODEwX01PVVRNWE1UX1NGVCwgMSwgMCksCisKKwlTT0NfU0lOR0xFKCJEQUMgT3ZlcnNhbXBsaW5nIFJhdGUoMTI4eCkgU3dpdGNoIiwgTkFVODgxMF9SRUdfREFDLAorCQlOQVU4ODEwX0RBQ09TX1NGVCwgMSwgMCksCisJU09DX1NJTkdMRSgiQURDIE92ZXJzYW1wbGluZyBSYXRlKDEyOHgpIFN3aXRjaCIsIE5BVTg4MTBfUkVHX0FEQywKKwkJTkFVODgxMF9BRENPU19TRlQsIDEsIDApLAorfTsKKworLyogU3BlYWtlciBPdXRwdXQgTWl4ZXIgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBuYXU4ODEwX3NwZWFrZXJfbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkxpbmUgQnlwYXNzIFN3aXRjaCIsIE5BVTg4MTBfUkVHX1NQS01JWCwKKwkJTkFVODgxMF9CWVBTUEtfU0ZULCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIlBDTSBQbGF5YmFjayBTd2l0Y2giLCBOQVU4ODEwX1JFR19TUEtNSVgsCisJCU5BVTg4MTBfREFDU1BLX1NGVCwgMSwgMCksCit9OworCisvKiBNb25vIE91dHB1dCBNaXhlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG5hdTg4MTBfbW9ub19taXhlcl9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiTGluZSBCeXBhc3MgU3dpdGNoIiwgTkFVODgxMF9SRUdfTU9OT01JWCwKKwkJTkFVODgxMF9CWVBNT1VUX1NGVCwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJQQ00gUGxheWJhY2sgU3dpdGNoIiwgTkFVODgxMF9SRUdfTU9OT01JWCwKKwkJTkFVODgxMF9EQUNNT1VUX1NGVCwgMSwgMCksCit9OworCisvKiBQR0EgTXV0ZSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG5hdTg4MTBfaW5wZ2FfbXV0ZVtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiUEdBIE11dGUgU3dpdGNoIiwgTkFVODgxMF9SRUdfUEdBR0FJTiwKKwkJTkFVODgxMF9QR0FNVF9TRlQsIDEsIDApLAorfTsKKworLyogSW5wdXQgUEdBICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbmF1ODgxMF9pbnBnYVtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiTWljTiBTd2l0Y2giLCBOQVU4ODEwX1JFR19JTlBVVF9TSUdOQUwsCisJCU5BVTg4MTBfTk1JQ1BHQV9TRlQsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiTWljUCBTd2l0Y2giLCBOQVU4ODEwX1JFR19JTlBVVF9TSUdOQUwsCisJCU5BVTg4MTBfUE1JQ1BHQV9TRlQsIDEsIDApLAorfTsKKworLyogTWljIElucHV0IGJvb3N0IHZvbCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG5hdTg4MTBfbWljX2Jvb3N0X2NvbnRyb2xzID0KKwlTT0NfREFQTV9TSU5HTEUoIk1pYyBWb2x1bWUiLCBOQVU4ODEwX1JFR19BRENCT09TVCwKKwkJTkFVODgxMF9QTUlDQlNUR0FJTl9TRlQsIDB4NywgMCk7CisKKy8qIExvb3BiYWNrIFN3aXRjaCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG5hdTg4MTBfbG9vcGJhY2sgPQorCVNPQ19EQVBNX1NJTkdMRSgiU3dpdGNoIiwgTkFVODgxMF9SRUdfQ09NUCwKKwkJTkFVODgxMF9BRERBUF9TRlQsIDEsIDApOworCitzdGF0aWMgaW50IGNoZWNrX21jbGtfc2VsZWN0X3BsbChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc291cmNlLAorCQkJIHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpzaW5rKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyhzb3VyY2UtPmRhcG0pOworCXN0cnVjdCBuYXU4ODEwICpuYXU4ODEwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdW5zaWduZWQgaW50IHZhbHVlOworCisJcmVnbWFwX3JlYWQobmF1ODgxMC0+cmVnbWFwLCBOQVU4ODEwX1JFR19DTE9DSywgJnZhbHVlKTsKKwlyZXR1cm4gKHZhbHVlICYgTkFVODgxMF9DTEtNX01BU0spOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgbmF1ODgxMF9kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNwZWFrZXIgTWl4ZXIiLCBOQVU4ODEwX1JFR19QT1dFUjMsCisJCU5BVTg4MTBfU1BLTVhfRU5fU0ZULCAwLCAmbmF1ODgxMF9zcGVha2VyX21peGVyX2NvbnRyb2xzWzBdLAorCQlBUlJBWV9TSVpFKG5hdTg4MTBfc3BlYWtlcl9taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiTW9ubyBNaXhlciIsIE5BVTg4MTBfUkVHX1BPV0VSMywKKwkJTkFVODgxMF9NT1VUTVhfRU5fU0ZULCAwLCAmbmF1ODgxMF9tb25vX21peGVyX2NvbnRyb2xzWzBdLAorCQlBUlJBWV9TSVpFKG5hdTg4MTBfbW9ub19taXhlcl9jb250cm9scykpLAorCVNORF9TT0NfREFQTV9EQUMoIkRBQyIsICJIaUZpIFBsYXliYWNrIiwgTkFVODgxMF9SRUdfUE9XRVIzLAorCQlOQVU4ODEwX0RBQ19FTl9TRlQsIDApLAorCVNORF9TT0NfREFQTV9BREMoIkFEQyIsICJIaUZpIENhcHR1cmUiLCBOQVU4ODEwX1JFR19QT1dFUjIsCisJCU5BVTg4MTBfQURDX0VOX1NGVCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiU3BrTiBPdXQiLCBOQVU4ODEwX1JFR19QT1dFUjMsCisJCU5BVTg4MTBfTlNQS19FTl9TRlQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIlNwa1AgT3V0IiwgTkFVODgxMF9SRUdfUE9XRVIzLAorCQlOQVU4ODEwX1BTUEtfRU5fU0ZULCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJNb25vIE91dCIsIE5BVTg4MTBfUkVHX1BPV0VSMywKKwkJTkFVODgxMF9NT1VUX0VOX1NGVCwgMCwgTlVMTCwgMCksCisKKwlTTkRfU09DX0RBUE1fTUlYRVIoIklucHV0IFBHQSIsIE5BVTg4MTBfUkVHX1BPV0VSMiwKKwkJTkFVODgxMF9QR0FfRU5fU0ZULCAwLCBuYXU4ODEwX2lucGdhLAorCQlBUlJBWV9TSVpFKG5hdTg4MTBfaW5wZ2EpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIklucHV0IEJvb3N0IFN0YWdlIiwgTkFVODgxMF9SRUdfUE9XRVIyLAorCQlOQVU4ODEwX0JTVF9FTl9TRlQsIDAsIG5hdTg4MTBfaW5wZ2FfbXV0ZSwKKwkJQVJSQVlfU0laRShuYXU4ODEwX2lucGdhX211dGUpKSwKKworCVNORF9TT0NfREFQTV9TVVBQTFkoIk1pYyBCaWFzIiwgTkFVODgxMF9SRUdfUE9XRVIxLAorCQlOQVU4ODEwX01JQ0JJQVNfRU5fU0ZULCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJQTEwiLCBOQVU4ODEwX1JFR19QT1dFUjEsCisJCU5BVTg4MTBfUExMX0VOX1NGVCwgMCwgTlVMTCwgMCksCisKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJEaWdpdGFsIExvb3BiYWNrIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmbmF1ODgxMF9sb29wYmFjayksCisKKwlTTkRfU09DX0RBUE1fSU5QVVQoIk1JQ04iKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIk1JQ1AiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJNT05PT1VUIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiU1BLT1VUUCIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIlNQS09VVE4iKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIG5hdTg4MTBfZGFwbV9yb3V0ZXNbXSA9IHsKKwl7IkRBQyIsIE5VTEwsICJQTEwiLCBjaGVja19tY2xrX3NlbGVjdF9wbGx9LAorCisJLyogTW9ubyBvdXRwdXQgbWl4ZXIgKi8KKwl7Ik1vbm8gTWl4ZXIiLCAiUENNIFBsYXliYWNrIFN3aXRjaCIsICJEQUMifSwKKwl7Ik1vbm8gTWl4ZXIiLCAiTGluZSBCeXBhc3MgU3dpdGNoIiwgIklucHV0IEJvb3N0IFN0YWdlIn0sCisKKwkvKiBTcGVha2VyIG91dHB1dCBtaXhlciAqLworCXsiU3BlYWtlciBNaXhlciIsICJQQ00gUGxheWJhY2sgU3dpdGNoIiwgIkRBQyJ9LAorCXsiU3BlYWtlciBNaXhlciIsICJMaW5lIEJ5cGFzcyBTd2l0Y2giLCAiSW5wdXQgQm9vc3QgU3RhZ2UifSwKKworCS8qIE91dHB1dHMgKi8KKwl7Ik1vbm8gT3V0IiwgTlVMTCwgIk1vbm8gTWl4ZXIifSwKKwl7Ik1PTk9PVVQiLCBOVUxMLCAiTW9ubyBPdXQifSwKKwl7IlNwa04gT3V0IiwgTlVMTCwgIlNwZWFrZXIgTWl4ZXIifSwKKwl7IlNwa1AgT3V0IiwgTlVMTCwgIlNwZWFrZXIgTWl4ZXIifSwKKwl7IlNQS09VVE4iLCBOVUxMLCAiU3BrTiBPdXQifSwKKwl7IlNQS09VVFAiLCBOVUxMLCAiU3BrUCBPdXQifSwKKworCS8qIElucHV0IEJvb3N0IFN0YWdlICovCisJeyJBREMiLCBOVUxMLCAiSW5wdXQgQm9vc3QgU3RhZ2UifSwKKwl7IkFEQyIsIE5VTEwsICJQTEwiLCBjaGVja19tY2xrX3NlbGVjdF9wbGx9LAorCXsiSW5wdXQgQm9vc3QgU3RhZ2UiLCBOVUxMLCAiSW5wdXQgUEdBIn0sCisJeyJJbnB1dCBCb29zdCBTdGFnZSIsIE5VTEwsICJNSUNQIn0sCisKKwkvKiBJbnB1dCBQR0EgKi8KKwl7IklucHV0IFBHQSIsIE5VTEwsICJNaWMgQmlhcyJ9LAorCXsiSW5wdXQgUEdBIiwgIk1pY04gU3dpdGNoIiwgIk1JQ04ifSwKKwl7IklucHV0IFBHQSIsICJNaWNQIFN3aXRjaCIsICJNSUNQIn0sCisKKwkvKiBEaWdpdGFsIExvb3B0YWNrICovCisJeyJEaWdpdGFsIExvb3BiYWNrIiwgIlN3aXRjaCIsICJBREMifSwKKwl7IkRBQyIsIE5VTEwsICJEaWdpdGFsIExvb3BiYWNrIn0sCit9OworCitzdGF0aWMgaW50IG5hdTg4MTBfc2V0X3N5c2NsayhzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKKwkJCQkgaW50IGNsa19pZCwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgbmF1ODgxMCAqbmF1ODgxMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJbmF1ODgxMC0+Y2xrX2lkID0gY2xrX2lkOworCW5hdTg4MTAtPnN5c2NsayA9IGZyZXE7CisJZGV2X2RiZyhuYXU4ODEwLT5kZXYsICJtYXN0ZXIgc3lzY2xrICVkSHosIHNvdXJjZSAlc1xuIiwKKwkJZnJlcSwgY2xrX2lkID09IE5BVTg4MTBfU0NMS19QTEwgPyAiUExMIiA6ICJNQ0xLIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuYXU4OGwwX2NhbGNfcGxsKHVuc2lnbmVkIGludCBwbGxfaW4sCisJdW5zaWduZWQgaW50IGZzLCBzdHJ1Y3QgbmF1ODgxMF9wbGwgKnBsbF9wYXJhbSkKK3sKKwl1NjQgZjIsIGYyX21heCwgcGxsX3JhdGlvOworCWludCBpLCBzY2FsX3NlbDsKKworCWlmIChwbGxfaW4gPiBOQVVfUExMX1JFRl9NQVggfHwgcGxsX2luIDwgTkFVX1BMTF9SRUZfTUlOKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWYyX21heCA9IDA7CisJc2NhbF9zZWwgPSBBUlJBWV9TSVpFKG5hdTg4MTBfbWNsa19zY2FsZXIpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG5hdTg4MTBfbWNsa19zY2FsZXIpOyBpKyspIHsKKwkJZjIgPSAyNTYgKiBmcyAqIDQgKiBuYXU4ODEwX21jbGtfc2NhbGVyW2ldIC8gMTA7CisJCWlmIChmMiA+IE5BVV9QTExfRlJFUV9NSU4gJiYgZjIgPCBOQVVfUExMX0ZSRVFfTUFYICYmCisJCQlmMl9tYXggPCBmMikgeworCQkJZjJfbWF4ID0gZjI7CisJCQlzY2FsX3NlbCA9IGk7CisJCX0KKwl9CisJaWYgKEFSUkFZX1NJWkUobmF1ODgxMF9tY2xrX3NjYWxlcikgPT0gc2NhbF9zZWwpCisJCXJldHVybiAtRUlOVkFMOworCXBsbF9wYXJhbS0+bWNsa19zY2FsZXIgPSBzY2FsX3NlbDsKKwlmMiA9IGYyX21heDsKKworCS8qIENhbGN1bGF0ZSB0aGUgUExMIDQtYml0IGludGVnZXIgaW5wdXQgYW5kIHRoZSBQTEwgMjQtYml0IGZyYWN0aW9uYWwKKwkgKiBpbnB1dDsgcm91bmQgdXAgdGhlIDI0KzRiaXQuCisJICovCisJcGxsX3JhdGlvID0gZGl2X3U2NChmMiA8PCAyOCwgcGxsX2luKTsKKwlwbGxfcGFyYW0tPnByZV9mYWN0b3IgPSAwOworCWlmICgoKHBsbF9yYXRpbyA+PiAyOCkgJiAweEYpIDwgTkFVX1BMTF9PUFRPUF9NSU4pIHsKKwkJcGxsX3JhdGlvIDw8PSAxOworCQlwbGxfcGFyYW0tPnByZV9mYWN0b3IgPSAxOworCX0KKwlwbGxfcGFyYW0tPnBsbF9pbnQgPSAocGxsX3JhdGlvID4+IDI4KSAmIDB4RjsKKwlwbGxfcGFyYW0tPnBsbF9mcmFjID0gKChwbGxfcmF0aW8gJiAweEZGRkZGRkYpID4+IDQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmF1ODgxMF9zZXRfcGxsKHN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpLCBpbnQgcGxsX2lkLAorCWludCBzb3VyY2UsIHVuc2lnbmVkIGludCBmcmVxX2luLCB1bnNpZ25lZCBpbnQgZnJlcV9vdXQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgbmF1ODgxMCAqbmF1ODgxMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCByZWdtYXAgKm1hcCA9IG5hdTg4MTAtPnJlZ21hcDsKKwlzdHJ1Y3QgbmF1ODgxMF9wbGwgKnBsbF9wYXJhbSA9ICZuYXU4ODEwLT5wbGw7CisJaW50IHJldCwgZnM7CisKKwlmcyA9IGZyZXFfb3V0IC8gMjU2OworCXJldCA9IG5hdTg4bDBfY2FsY19wbGwoZnJlcV9pbiwgZnMsIHBsbF9wYXJhbSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihuYXU4ODEwLT5kZXYsICJVbnN1cHBvcnRlZCBpbnB1dCBjbG9jayAlZFxuIiwgZnJlcV9pbik7CisJCXJldHVybiByZXQ7CisJfQorCWRldl9pbmZvKG5hdTg4MTAtPmRldiwgInBsbF9pbnQ9JXggcGxsX2ZyYWM9JXggbWNsa19zY2FsZXI9JXggcHJlX2ZhY3Rvcj0leFxuIiwKKwkJcGxsX3BhcmFtLT5wbGxfaW50LCBwbGxfcGFyYW0tPnBsbF9mcmFjLCBwbGxfcGFyYW0tPm1jbGtfc2NhbGVyLAorCQlwbGxfcGFyYW0tPnByZV9mYWN0b3IpOworCisJcmVnbWFwX3VwZGF0ZV9iaXRzKG1hcCwgTkFVODgxMF9SRUdfUExMTiwKKwkJTkFVODgxMF9QTExNQ0xLX0RJVjIgfCBOQVU4ODEwX1BMTE5fTUFTSywKKwkJKHBsbF9wYXJhbS0+cHJlX2ZhY3RvciA/IE5BVTg4MTBfUExMTUNMS19ESVYyIDogMCkgfAorCQlwbGxfcGFyYW0tPnBsbF9pbnQpOworCXJlZ21hcF93cml0ZShtYXAsIE5BVTg4MTBfUkVHX1BMTEsxLAorCQkocGxsX3BhcmFtLT5wbGxfZnJhYyA+PiBOQVU4ODEwX1BMTEsxX1NGVCkgJgorCQlOQVU4ODEwX1BMTEsxX01BU0spOworCXJlZ21hcF93cml0ZShtYXAsIE5BVTg4MTBfUkVHX1BMTEsyLAorCQkocGxsX3BhcmFtLT5wbGxfZnJhYyA+PiBOQVU4ODEwX1BMTEsyX1NGVCkgJgorCQlOQVU4ODEwX1BMTEsyX01BU0spOworCXJlZ21hcF93cml0ZShtYXAsIE5BVTg4MTBfUkVHX1BMTEszLAorCQlwbGxfcGFyYW0tPnBsbF9mcmFjICYgTkFVODgxMF9QTExLM19NQVNLKTsKKwlyZWdtYXBfdXBkYXRlX2JpdHMobWFwLCBOQVU4ODEwX1JFR19DTE9DSywgTkFVODgxMF9NQ0xLU0VMX01BU0ssCisJCXBsbF9wYXJhbS0+bWNsa19zY2FsZXIgPDwgTkFVODgxMF9NQ0xLU0VMX1NGVCk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKG1hcCwgTkFVODgxMF9SRUdfQ0xPQ0ssCisJCU5BVTg4MTBfQ0xLTV9NQVNLLCBOQVU4ODEwX0NMS01fUExMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5hdTg4MTBfc2V0X2RhaV9mbXQoc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWksCisJCXVuc2lnbmVkIGludCBmbXQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgbmF1ODgxMCAqbmF1ODgxMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXUxNiBjdHJsMV92YWwgPSAwLCBjdHJsMl92YWwgPSAwOworCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9NQVNURVJfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTToKKwkJY3RybDJfdmFsIHw9IE5BVTg4MTBfQ0xLSU9fTUFTVEVSOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRlM6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUzoKKwkJY3RybDFfdmFsIHw9IE5BVTg4MTBfQUlGTVRfSTJTOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX1JJR0hUX0o6CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfTEVGVF9KOgorCQljdHJsMV92YWwgfD0gTkFVODgxMF9BSUZNVF9MRUZUOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgorCQljdHJsMV92YWwgfD0gTkFVODgxMF9BSUZNVF9QQ01fQTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfTkY6CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfSUY6CisJCWN0cmwxX3ZhbCB8PSBOQVU4ODEwX0JDTEtQX0lCIHwgTkFVODgxMF9GU1BfSUY7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfTkY6CisJCWN0cmwxX3ZhbCB8PSBOQVU4ODEwX0JDTEtQX0lCOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX05CX0lGOgorCQljdHJsMV92YWwgfD0gTkFVODgxMF9GU1BfSUY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlZ21hcF91cGRhdGVfYml0cyhuYXU4ODEwLT5yZWdtYXAsIE5BVTg4MTBfUkVHX0lGQUNFLAorCQlOQVU4ODEwX0FJRk1UX01BU0sgfCBOQVU4ODEwX0ZTUF9JRiB8CisJCU5BVTg4MTBfQkNMS1BfSUIsIGN0cmwxX3ZhbCk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKG5hdTg4MTAtPnJlZ21hcCwgTkFVODgxMF9SRUdfQ0xPQ0ssCisJCU5BVTg4MTBfQ0xLSU9fTUFTSywgY3RybDJfdmFsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5hdTg4MTBfbWNsa19jbGtkaXYoc3RydWN0IG5hdTg4MTAgKm5hdTg4MTAsIGludCByYXRlKQoreworCWludCBpLCBzY2xrLCBpbWNsayA9IHJhdGUgKiAyNTYsIGRpdiA9IDA7CisKKwlpZiAoIW5hdTg4MTAtPnN5c2NsaykgeworCQlkZXZfZXJyKG5hdTg4MTAtPmRldiwgIk1ha2UgbWNsayBkaXYgY29uZmlndXJhdGlvbiBmYWlsIGJlY2F1c2Ugb2YgaW52YWxpZCBzeXN0ZW0gY2xvY2tcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDb25maWd1cmUgdGhlIG1hc3RlciBjbG9jayBwcmVzY2FsZXIgZGl2IHRvIG1ha2Ugc3lzdGVtCisJICogY2xvY2sgdG8gYXBwcm94aW1hdGUgdGhlIGludGVybmFsIG1hc3RlciBjbG9jayAoSU1DTEspOworCSAqIGFuZCBsYXJnZSBvciBlcXVhbCB0byBJTUNMSy4KKwkgKi8KKwlmb3IgKGkgPSAxOyBpIDwgQVJSQVlfU0laRShuYXU4ODEwX21jbGtfc2NhbGVyKTsgaSsrKSB7CisJCXNjbGsgPSAobmF1ODgxMC0+c3lzY2xrICogMTApIC8KKwkJCW5hdTg4MTBfbWNsa19zY2FsZXJbaV07CisJCWlmIChzY2xrIDwgaW1jbGspCisJCQlicmVhazsKKwkJZGl2ID0gaTsKKwl9CisJZGV2X2RiZyhuYXU4ODEwLT5kZXYsCisJCSJtYXN0ZXIgY2xvY2sgcHJlc2NhbGVyICV4IGZvciBmcyAlZFxuIiwgZGl2LCByYXRlKTsKKworCS8qIG1hc3RlciBjbG9jayBmcm9tIE1DTEsgYW5kIGRpc2FibGUgUExMICovCisJcmVnbWFwX3VwZGF0ZV9iaXRzKG5hdTg4MTAtPnJlZ21hcCwgTkFVODgxMF9SRUdfQ0xPQ0ssCisJCU5BVTg4MTBfTUNMS1NFTF9NQVNLLCAoZGl2IDw8IE5BVTg4MTBfTUNMS1NFTF9TRlQpKTsKKwlyZWdtYXBfdXBkYXRlX2JpdHMobmF1ODgxMC0+cmVnbWFwLCBOQVU4ODEwX1JFR19DTE9DSywKKwkJTkFVODgxMF9DTEtNX01BU0ssIE5BVTg4MTBfQ0xLTV9NQ0xLKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5hdTg4MTBfcGNtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgbmF1ODgxMCAqbmF1ODgxMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCB2YWxfbGVuID0gMCwgdmFsX3JhdGUgPSAwLCByZXQgPSAwOworCisJc3dpdGNoIChwYXJhbXNfd2lkdGgocGFyYW1zKSkgeworCWNhc2UgMTY6CisJCWJyZWFrOworCWNhc2UgMjA6CisJCXZhbF9sZW4gfD0gTkFVODgxMF9XTEVOXzIwOworCQlicmVhazsKKwljYXNlIDI0OgorCQl2YWxfbGVuIHw9IE5BVTg4MTBfV0xFTl8yNDsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwkJdmFsX2xlbiB8PSBOQVU4ODEwX1dMRU5fMzI7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAocGFyYW1zX3JhdGUocGFyYW1zKSkgeworCWNhc2UgODAwMDoKKwkJdmFsX3JhdGUgfD0gTkFVODgxMF9TTVBMUl84SzsKKwkJYnJlYWs7CisJY2FzZSAxMTAyNToKKwkJdmFsX3JhdGUgfD0gTkFVODgxMF9TTVBMUl8xMks7CisJCWJyZWFrOworCWNhc2UgMTYwMDA6CisJCXZhbF9yYXRlIHw9IE5BVTg4MTBfU01QTFJfMTZLOworCQlicmVhazsKKwljYXNlIDIyMDUwOgorCQl2YWxfcmF0ZSB8PSBOQVU4ODEwX1NNUExSXzI0SzsKKwkJYnJlYWs7CisJY2FzZSAzMjAwMDoKKwkJdmFsX3JhdGUgfD0gTkFVODgxMF9TTVBMUl8zMks7CisJCWJyZWFrOworCWNhc2UgNDQxMDA6CisJY2FzZSA0ODAwMDoKKwkJYnJlYWs7CisJfQorCisJcmVnbWFwX3VwZGF0ZV9iaXRzKG5hdTg4MTAtPnJlZ21hcCwgTkFVODgxMF9SRUdfSUZBQ0UsCisJCU5BVTg4MTBfV0xFTl9NQVNLLCB2YWxfbGVuKTsKKwlyZWdtYXBfdXBkYXRlX2JpdHMobmF1ODgxMC0+cmVnbWFwLCBOQVU4ODEwX1JFR19TTVBMUiwKKwkJTkFVODgxMF9TTVBMUl9NQVNLLCB2YWxfcmF0ZSk7CisKKwkvKiBJZiB0aGUgbWFzdGVyIGNsb2NrIGlzIGZyb20gTUNMSywgcHJvdmlkZSB0aGUgcnVudGltZSBGUyBmb3IgZHJpdmVyCisJICogdG8gZ2V0IHRoZSBtYXN0ZXIgY2xvY2sgcHJlc2NhbGVyIGNvbmZpZ3VyYXRpb24uCisJICovCisJaWYgKG5hdTg4MTAtPmNsa19pZCA9PSBOQVU4ODEwX1NDTEtfTUNMSykgeworCQlyZXQgPSBuYXU4ODEwX21jbGtfY2xrZGl2KG5hdTg4MTAsIHBhcmFtc19yYXRlKHBhcmFtcykpOworCQlpZiAocmV0IDwgMCkKKwkJCWRldl9lcnIobmF1ODgxMC0+ZGV2LCAiTUNMSyBkaXYgY29uZmlndXJhdGlvbiBmYWlsXG4iKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG5hdTg4MTBfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCWVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQoreworCXN0cnVjdCBuYXU4ODEwICpuYXU4ODEwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHJlZ21hcCAqbWFwID0gbmF1ODgxMC0+cmVnbWFwOworCisJc3dpdGNoIChsZXZlbCkgeworCWNhc2UgU05EX1NPQ19CSUFTX09OOgorCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CisJCXJlZ21hcF91cGRhdGVfYml0cyhtYXAsIE5BVTg4MTBfUkVHX1BPV0VSMSwKKwkJCU5BVTg4MTBfUkVGSU1QX01BU0ssIE5BVTg4MTBfUkVGSU1QXzgwSyk7CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKG1hcCwgTkFVODgxMF9SRUdfUE9XRVIxLAorCQkJTkFVODgxMF9JT0JVRl9FTiB8IE5BVTg4MTBfQUJJQVNfRU4sCisJCQlOQVU4ODEwX0lPQlVGX0VOIHwgTkFVODgxMF9BQklBU19FTik7CisKKwkJaWYgKHNuZF9zb2NfY29kZWNfZ2V0X2JpYXNfbGV2ZWwoY29kZWMpID09IFNORF9TT0NfQklBU19PRkYpIHsKKwkJCXJlZ2NhY2hlX3N5bmMobWFwKTsKKwkJCXJlZ21hcF91cGRhdGVfYml0cyhtYXAsIE5BVTg4MTBfUkVHX1BPV0VSMSwKKwkJCQlOQVU4ODEwX1JFRklNUF9NQVNLLCBOQVU4ODEwX1JFRklNUF8zSyk7CisJCQltZGVsYXkoMTAwKTsKKwkJfQorCQlyZWdtYXBfdXBkYXRlX2JpdHMobWFwLCBOQVU4ODEwX1JFR19QT1dFUjEsCisJCQlOQVU4ODEwX1JFRklNUF9NQVNLLCBOQVU4ODEwX1JFRklNUF8zMDBLKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfQklBU19PRkY6CisJCXJlZ21hcF93cml0ZShtYXAsIE5BVTg4MTBfUkVHX1BPV0VSMSwgMCk7CisJCXJlZ21hcF93cml0ZShtYXAsIE5BVTg4MTBfUkVHX1BPV0VSMiwgMCk7CisJCXJlZ21hcF93cml0ZShtYXAsIE5BVTg4MTBfUkVHX1BPV0VSMywgMCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisKKyNkZWZpbmUgTkFVODgxMF9SQVRFUyAoU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCkKKworI2RlZmluZSBOQVU4ODEwX0ZPUk1BVFMgKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHwgXAorCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIG5hdTg4MTBfb3BzID0geworCS5od19wYXJhbXMgPSBuYXU4ODEwX3BjbV9od19wYXJhbXMsCisJLnNldF9mbXQgPSBuYXU4ODEwX3NldF9kYWlfZm10LAorCS5zZXRfc3lzY2xrID0gbmF1ODgxMF9zZXRfc3lzY2xrLAorCS5zZXRfcGxsID0gbmF1ODgxMF9zZXRfcGxsLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbmF1ODgxMF9kYWkgPSB7CisJLm5hbWUgPSAibmF1ODgxMC1oaWZpIiwKKwkucGxheWJhY2sgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJQbGF5YmFjayIsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwgICAvKiBPbmx5IDEgY2hhbm5lbCBvZiBkYXRhICovCisJCS5yYXRlcyA9IE5BVTg4MTBfUkFURVMsCisJCS5mb3JtYXRzID0gTkFVODgxMF9GT1JNQVRTLAorCX0sCisJLmNhcHR1cmUgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJDYXB0dXJlIiwKKwkJLmNoYW5uZWxzX21pbiA9IDEsCisJCS5jaGFubmVsc19tYXggPSAyLCAgIC8qIE9ubHkgMSBjaGFubmVsIG9mIGRhdGEgKi8KKwkJLnJhdGVzID0gTkFVODgxMF9SQVRFUywKKwkJLmZvcm1hdHMgPSBOQVU4ODEwX0ZPUk1BVFMsCisJfSwKKwkub3BzID0gJm5hdTg4MTBfb3BzLAorCS5zeW1tZXRyaWNfcmF0ZXMgPSAxLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIG5hdTg4MTBfcmVnbWFwX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMgPSA3LAorCS52YWxfYml0cyA9IDksCisKKwkubWF4X3JlZ2lzdGVyID0gTkFVODgxMF9SRUdfTUFYLAorCS5yZWFkYWJsZV9yZWcgPSBuYXU4ODEwX3JlYWRhYmxlX3JlZywKKwkud3JpdGVhYmxlX3JlZyA9IG5hdTg4MTBfd3JpdGVhYmxlX3JlZywKKwkudm9sYXRpbGVfcmVnID0gbmF1ODgxMF92b2xhdGlsZV9yZWcsCisKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKKwkucmVnX2RlZmF1bHRzID0gbmF1ODgxMF9yZWdfZGVmYXVsdHMsCisJLm51bV9yZWdfZGVmYXVsdHMgPSBBUlJBWV9TSVpFKG5hdTg4MTBfcmVnX2RlZmF1bHRzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgbmF1ODgxMF9jb2RlY19kcml2ZXIgPSB7CisJLnNldF9iaWFzX2xldmVsID0gbmF1ODgxMF9zZXRfYmlhc19sZXZlbCwKKwkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCisKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzID0gbmF1ODgxMF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKG5hdTg4MTBfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cyA9IG5hdTg4MTBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUobmF1ODgxMF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMgPSBuYXU4ODEwX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShuYXU4ODEwX2RhcG1fcm91dGVzKSwKKwl9LAorfTsKKworc3RhdGljIGludCBuYXU4ODEwX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkJICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaTJjLT5kZXY7CisJc3RydWN0IG5hdTg4MTAgKm5hdTg4MTAgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7CisKKwlpZiAoIW5hdTg4MTApIHsKKwkJbmF1ODgxMCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqbmF1ODgxMCksIEdGUF9LRVJORUwpOworCQlpZiAoIW5hdTg4MTApCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgbmF1ODgxMCk7CisKKwluYXU4ODEwLT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhpMmMsICZuYXU4ODEwX3JlZ21hcF9jb25maWcpOworCWlmIChJU19FUlIobmF1ODgxMC0+cmVnbWFwKSkKKwkJcmV0dXJuIFBUUl9FUlIobmF1ODgxMC0+cmVnbWFwKTsKKwluYXU4ODEwLT5kZXYgPSBkZXY7CisKKwlyZWdtYXBfd3JpdGUobmF1ODgxMC0+cmVnbWFwLCBOQVU4ODEwX1JFR19SRVNFVCwgMHgwMCk7CisKKwlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9jb2RlYyhkZXYsCisJCSZuYXU4ODEwX2NvZGVjX2RyaXZlciwgJm5hdTg4MTBfZGFpLCAxKTsKK30KKworc3RhdGljIGludCBuYXU4ODEwX2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJmNsaWVudC0+ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbmF1ODgxMF9pMmNfaWRbXSA9IHsKKwl7ICJuYXU4ODEwIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBuYXU4ODEwX2kyY19pZCk7CisKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG5hdTg4MTBfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIm51dm90b24sbmF1ODgxMCIsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbmF1ODgxMF9vZl9tYXRjaCk7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG5hdTg4MTBfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJuYXU4ODEwIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKG5hdTg4MTBfb2ZfbWF0Y2gpLAorCX0sCisJLnByb2JlID0gICAgbmF1ODgxMF9pMmNfcHJvYmUsCisJLnJlbW92ZSA9ICAgbmF1ODgxMF9pMmNfcmVtb3ZlLAorCS5pZF90YWJsZSA9IG5hdTg4MTBfaTJjX2lkLAorfTsKKworbW9kdWxlX2kyY19kcml2ZXIobmF1ODgxMF9pMmNfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIE5BVTg4MTAgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJEYXZpZCBMaW4gPGN0bGluMEBudXZvdG9uLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbmF1ODgxMC5oIGIvc291bmQvc29jL2NvZGVjcy9uYXU4ODEwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY4ODI2NQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbmF1ODgxMC5oCkBAIC0wLDAgKzEsMjgxIEBACisvKgorICogTkFVODgxMCBBTFNBIFNvQyBhdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxNiBOdXZvdG9uIFRlY2hub2xvZ3kgQ29ycC4KKyAqIEF1dGhvcjogRGF2aWQgTGluIDxjdGxpbjBAbnV2b3Rvbi5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fTkFVODgxMF9IX18KKyNkZWZpbmUgX19OQVU4ODEwX0hfXworCisjZGVmaW5lIE5BVTg4MTBfUkVHX1JFU0VUCQkweDAwCisjZGVmaW5lIE5BVTg4MTBfUkVHX1BPV0VSMQkJMHgwMQorI2RlZmluZSBOQVU4ODEwX1JFR19QT1dFUjIJCTB4MDIKKyNkZWZpbmUgTkFVODgxMF9SRUdfUE9XRVIzCQkweDAzCisjZGVmaW5lIE5BVTg4MTBfUkVHX0lGQUNFCQkweDA0CisjZGVmaW5lIE5BVTg4MTBfUkVHX0NPTVAJCTB4MDUKKyNkZWZpbmUgTkFVODgxMF9SRUdfQ0xPQ0sJCTB4MDYKKyNkZWZpbmUgTkFVODgxMF9SRUdfU01QTFIJCTB4MDcKKyNkZWZpbmUgTkFVODgxMF9SRUdfREFDCQkweDBBCisjZGVmaW5lIE5BVTg4MTBfUkVHX0RBQ0dBSU4JCTB4MEIKKyNkZWZpbmUgTkFVODgxMF9SRUdfQURDCQkweDBFCisjZGVmaW5lIE5BVTg4MTBfUkVHX0FEQ0dBSU4JCTB4MEYKKyNkZWZpbmUgTkFVODgxMF9SRUdfRVExCQkweDEyCisjZGVmaW5lIE5BVTg4MTBfUkVHX0VRMgkJMHgxMworI2RlZmluZSBOQVU4ODEwX1JFR19FUTMJCTB4MTQKKyNkZWZpbmUgTkFVODgxMF9SRUdfRVE0CQkweDE1CisjZGVmaW5lIE5BVTg4MTBfUkVHX0VRNQkJMHgxNgorI2RlZmluZSBOQVU4ODEwX1JFR19EQUNMSU0xCQkweDE4CisjZGVmaW5lIE5BVTg4MTBfUkVHX0RBQ0xJTTIJCTB4MTkKKyNkZWZpbmUgTkFVODgxMF9SRUdfTk9UQ0gxCQkweDFCCisjZGVmaW5lIE5BVTg4MTBfUkVHX05PVENIMgkJMHgxQworI2RlZmluZSBOQVU4ODEwX1JFR19OT1RDSDMJCTB4MUQKKyNkZWZpbmUgTkFVODgxMF9SRUdfTk9UQ0g0CQkweDFFCisjZGVmaW5lIE5BVTg4MTBfUkVHX0FMQzEJCTB4MjAKKyNkZWZpbmUgTkFVODgxMF9SRUdfQUxDMgkJMHgyMQorI2RlZmluZSBOQVU4ODEwX1JFR19BTEMzCQkweDIyCisjZGVmaW5lIE5BVTg4MTBfUkVHX05PSVNFR0FURQkJMHgyMworI2RlZmluZSBOQVU4ODEwX1JFR19QTExOCQkweDI0CisjZGVmaW5lIE5BVTg4MTBfUkVHX1BMTEsxCQkweDI1CisjZGVmaW5lIE5BVTg4MTBfUkVHX1BMTEsyCQkweDI2CisjZGVmaW5lIE5BVTg4MTBfUkVHX1BMTEszCQkweDI3CisjZGVmaW5lIE5BVTg4MTBfUkVHX0FUVEVOCQkweDI4CisjZGVmaW5lIE5BVTg4MTBfUkVHX0lOUFVUX1NJR05BTAkweDJDCisjZGVmaW5lIE5BVTg4MTBfUkVHX1BHQUdBSU4JCTB4MkQKKyNkZWZpbmUgTkFVODgxMF9SRUdfQURDQk9PU1QJCTB4MkYKKyNkZWZpbmUgTkFVODgxMF9SRUdfT1VUUFVUCQkweDMxCisjZGVmaW5lIE5BVTg4MTBfUkVHX1NQS01JWAkJMHgzMgorI2RlZmluZSBOQVU4ODEwX1JFR19TUEtHQUlOCQkweDM2CisjZGVmaW5lIE5BVTg4MTBfUkVHX01PTk9NSVgJCTB4MzgKKyNkZWZpbmUgTkFVODgxMF9SRUdfUE9XRVI0CQkweDNBCisjZGVmaW5lIE5BVTg4MTBfUkVHX1RTTE9UQ1RMMQkJMHgzQgorI2RlZmluZSBOQVU4ODEwX1JFR19UU0xPVENUTDIJCTB4M0MKKyNkZWZpbmUgTkFVODgxMF9SRUdfREVWSUNFX1JFVklECTB4M0UKKyNkZWZpbmUgTkFVODgxMF9SRUdfSTJDX0RFVklDRUlECTB4M0YKKyNkZWZpbmUgTkFVODgxMF9SRUdfQURESVRJT05JRAkweDQwCisjZGVmaW5lIE5BVTg4MTBfUkVHX1JFU0VSVkUJCTB4NDEKKyNkZWZpbmUgTkFVODgxMF9SRUdfT1VUQ1RMCQkweDQ1CisjZGVmaW5lIE5BVTg4MTBfUkVHX0FMQzFFTkhBTjEJMHg0NgorI2RlZmluZSBOQVU4ODEwX1JFR19BTEMxRU5IQU4yCTB4NDcKKyNkZWZpbmUgTkFVODgxMF9SRUdfTUlTQ0NUTAkJMHg0OQorI2RlZmluZSBOQVU4ODEwX1JFR19PVVRUSUVPRkYJCTB4NEIKKyNkZWZpbmUgTkFVODgxMF9SRUdfQUdDUDJQT1VUCTB4NEMKKyNkZWZpbmUgTkFVODgxMF9SRUdfQUdDUE9VVAkJMHg0RAorI2RlZmluZSBOQVU4ODEwX1JFR19BTVRDVEwJCTB4NEUKKyNkZWZpbmUgTkFVODgxMF9SRUdfT1VUVElFT0ZGTUFOCTB4NEYKKyNkZWZpbmUgTkFVODgxMF9SRUdfTUFYCQlOQVU4ODEwX1JFR19PVVRUSUVPRkZNQU4KKworCisvKiBOQVU4ODEwX1JFR19QT1dFUjEgKDB4MSkgKi8KKyNkZWZpbmUgTkFVODgxMF9EQ0JVRl9FTgkJKDB4MSA8PCA4KQorI2RlZmluZSBOQVU4ODEwX1BMTF9FTl9TRlQJCTUKKyNkZWZpbmUgTkFVODgxMF9NSUNCSUFTX0VOX1NGVAk0CisjZGVmaW5lIE5BVTg4MTBfQUJJQVNfRU4JCSgweDEgPDwgMykKKyNkZWZpbmUgTkFVODgxMF9JT0JVRl9FTgkJKDB4MSA8PCAyKQorI2RlZmluZSBOQVU4ODEwX1JFRklNUF9NQVNLCQkweDMKKyNkZWZpbmUgTkFVODgxMF9SRUZJTVBfRElTCQkweDAKKyNkZWZpbmUgTkFVODgxMF9SRUZJTVBfODBLCQkweDEKKyNkZWZpbmUgTkFVODgxMF9SRUZJTVBfMzAwSwkJMHgyCisjZGVmaW5lIE5BVTg4MTBfUkVGSU1QXzNLCQkweDMKKworLyogTkFVODgxMF9SRUdfUE9XRVIyICgweDIpICovCisjZGVmaW5lIE5BVTg4MTBfQlNUX0VOX1NGVAkJNAorI2RlZmluZSBOQVU4ODEwX1BHQV9FTl9TRlQJCTIKKyNkZWZpbmUgTkFVODgxMF9BRENfRU5fU0ZUCQkwCisKKy8qIE5BVTg4MTBfUkVHX1BPV0VSMyAoMHgzKSAqLworI2RlZmluZSBOQVU4ODEwX0RBQ19FTl9TRlQJCTAKKyNkZWZpbmUgTkFVODgxMF9TUEtNWF9FTl9TRlQJCTIKKyNkZWZpbmUgTkFVODgxMF9NT1VUTVhfRU5fU0ZUCTMKKyNkZWZpbmUgTkFVODgxMF9QU1BLX0VOX1NGVAkJNQorI2RlZmluZSBOQVU4ODEwX05TUEtfRU5fU0ZUCQk2CisjZGVmaW5lIE5BVTg4MTBfTU9VVF9FTl9TRlQJCTcKKworLyogTkFVODgxMF9SRUdfSUZBQ0UgKDB4NCkgKi8KKyNkZWZpbmUgTkFVODgxMF9BSUZNVF9TRlQJCTMKKyNkZWZpbmUgTkFVODgxMF9BSUZNVF9NQVNLCQkoMHgzIDw8IE5BVTg4MTBfQUlGTVRfU0ZUKQorI2RlZmluZSBOQVU4ODEwX0FJRk1UX1JJR0hUCQkoMHgwIDw8IE5BVTg4MTBfQUlGTVRfU0ZUKQorI2RlZmluZSBOQVU4ODEwX0FJRk1UX0xFRlQJCSgweDEgPDwgTkFVODgxMF9BSUZNVF9TRlQpCisjZGVmaW5lIE5BVTg4MTBfQUlGTVRfSTJTCQkoMHgyIDw8IE5BVTg4MTBfQUlGTVRfU0ZUKQorI2RlZmluZSBOQVU4ODEwX0FJRk1UX1BDTV9BCQkoMHgzIDw8IE5BVTg4MTBfQUlGTVRfU0ZUKQorI2RlZmluZSBOQVU4ODEwX1dMRU5fU0ZUCQk1CisjZGVmaW5lIE5BVTg4MTBfV0xFTl9NQVNLCQkoMHgzIDw8IE5BVTg4MTBfV0xFTl9TRlQpCisjZGVmaW5lIE5BVTg4MTBfV0xFTl8xNgkJKDB4MCA8PCBOQVU4ODEwX1dMRU5fU0ZUKQorI2RlZmluZSBOQVU4ODEwX1dMRU5fMjAJCSgweDEgPDwgTkFVODgxMF9XTEVOX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9XTEVOXzI0CQkoMHgyIDw8IE5BVTg4MTBfV0xFTl9TRlQpCisjZGVmaW5lIE5BVTg4MTBfV0xFTl8zMgkJKDB4MyA8PCBOQVU4ODEwX1dMRU5fU0ZUKQorI2RlZmluZSBOQVU4ODEwX0ZTUF9JRgkJCSgweDEgPDwgNykKKyNkZWZpbmUgTkFVODgxMF9CQ0xLUF9JQgkJKDB4MSA8PCA4KQorCisvKiBOQVU4ODEwX1JFR19DT01QICgweDUpICovCisjZGVmaW5lIE5BVTg4MTBfQUREQVBfU0ZUCQkwCisjZGVmaW5lIE5BVTg4MTBfQURDQ01fU0ZUCQkxCisjZGVmaW5lIE5BVTg4MTBfREFDQ01fU0ZUCQkzCisKKy8qIE5BVTg4MTBfUkVHX0NMT0NLICgweDYpICovCisjZGVmaW5lIE5BVTg4MTBfQ0xLSU9fTUFTSwkJMHgxCisjZGVmaW5lIE5BVTg4MTBfQ0xLSU9fU0xBVkUJCTB4MAorI2RlZmluZSBOQVU4ODEwX0NMS0lPX01BU1RFUgkJMHgxCisjZGVmaW5lIE5BVTg4MTBfQkNMS1NFTF9TRlQJCTIKKyNkZWZpbmUgTkFVODgxMF9CQ0xLU0VMX01BU0sJCSgweDcgPDwgTkFVODgxMF9CQ0xLU0VMX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9CQ0xLRElWXzEJCSgweDAgPDwgTkFVODgxMF9CQ0xLU0VMX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9CQ0xLRElWXzIJCSgweDEgPDwgTkFVODgxMF9CQ0xLU0VMX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9CQ0xLRElWXzQJCSgweDIgPDwgTkFVODgxMF9CQ0xLU0VMX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9CQ0xLRElWXzgJCSgweDMgPDwgTkFVODgxMF9CQ0xLU0VMX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9CQ0xLRElWXzE2CQkoMHg0IDw8IE5BVTg4MTBfQkNMS1NFTF9TRlQpCisjZGVmaW5lIE5BVTg4MTBfQkNMS0RJVl8zMgkJKDB4NSA8PCBOQVU4ODEwX0JDTEtTRUxfU0ZUKQorI2RlZmluZSBOQVU4ODEwX01DTEtTRUxfU0ZUCQk1CisjZGVmaW5lIE5BVTg4MTBfTUNMS1NFTF9NQVNLCQkoMHg3IDw8IE5BVTg4MTBfTUNMS1NFTF9TRlQpCisjZGVmaW5lIE5BVTg4MTBfQ0xLTV9TRlQJCTgKKyNkZWZpbmUgTkFVODgxMF9DTEtNX01BU0sJCSgweDEgPDwgTkFVODgxMF9DTEtNX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9DTEtNX01DTEsJCSgweDAgPDwgTkFVODgxMF9DTEtNX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9DTEtNX1BMTAkJKDB4MSA8PCBOQVU4ODEwX0NMS01fU0ZUKQorCisvKiBOQVU4ODEwX1JFR19TTVBMUiAoMHg3KSAqLworI2RlZmluZSBOQVU4ODEwX1NNUExSX1NGVAkJMQorI2RlZmluZSBOQVU4ODEwX1NNUExSX01BU0sJCSgweDcgPDwgTkFVODgxMF9TTVBMUl9TRlQpCisjZGVmaW5lIE5BVTg4MTBfU01QTFJfNDhLCQkoMHgwIDw8IE5BVTg4MTBfU01QTFJfU0ZUKQorI2RlZmluZSBOQVU4ODEwX1NNUExSXzMySwkJKDB4MSA8PCBOQVU4ODEwX1NNUExSX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9TTVBMUl8yNEsJCSgweDIgPDwgTkFVODgxMF9TTVBMUl9TRlQpCisjZGVmaW5lIE5BVTg4MTBfU01QTFJfMTZLCQkoMHgzIDw8IE5BVTg4MTBfU01QTFJfU0ZUKQorI2RlZmluZSBOQVU4ODEwX1NNUExSXzEySwkJKDB4NCA8PCBOQVU4ODEwX1NNUExSX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9TTVBMUl84SwkJKDB4NSA8PCBOQVU4ODEwX1NNUExSX1NGVCkKKworLyogTkFVODgxMF9SRUdfREFDICgweEEpICovCisjZGVmaW5lIE5BVTg4MTBfREFDUExfU0ZUCQkwCisjZGVmaW5lIE5BVTg4MTBfREFDT1NfU0ZUCQkzCisjZGVmaW5lIE5BVTg4MTBfREVFTVBfU0ZUCQk0CisKKy8qIE5BVTg4MTBfUkVHX0RBQ0dBSU4gKDB4QikgKi8KKyNkZWZpbmUgTkFVODgxMF9EQUNHQUlOX1NGVAkJMAorCisvKiBOQVU4ODEwX1JFR19BREMgKDB4RSkgKi8KKyNkZWZpbmUgTkFVODgxMF9BRENQTF9TRlQJCTAKKyNkZWZpbmUgTkFVODgxMF9BRENPU19TRlQJCTMKKyNkZWZpbmUgTkFVODgxMF9IUEZfU0ZUCQk0CisjZGVmaW5lIE5BVTg4MTBfSFBGRU5fU0ZUCQk4CisKKy8qIE5BVTg4MTBfUkVHX0FEQ0dBSU4gKDB4RikgKi8KKyNkZWZpbmUgTkFVODgxMF9BRENHQUlOX1NGVAkJMAorCisvKiBOQVU4ODEwX1JFR19FUTEgKDB4MTIpICovCisjZGVmaW5lIE5BVTg4MTBfRVExR0NfU0ZUCQkwCisjZGVmaW5lIE5BVTg4MTBfRVExQ0ZfU0ZUCQk1CisjZGVmaW5lIE5BVTg4MTBfRVFNX1NGVAkJOAorCisvKiBOQVU4ODEwX1JFR19FUTIgKDB4MTMpICovCisjZGVmaW5lIE5BVTg4MTBfRVEyR0NfU0ZUCQkwCisjZGVmaW5lIE5BVTg4MTBfRVEyQ0ZfU0ZUCQk1CisjZGVmaW5lIE5BVTg4MTBfRVEyQldfU0ZUCQk4CisKKy8qIE5BVTg4MTBfUkVHX0VRMyAoMHgxNCkgKi8KKyNkZWZpbmUgTkFVODgxMF9FUTNHQ19TRlQJCTAKKyNkZWZpbmUgTkFVODgxMF9FUTNDRl9TRlQJCTUKKyNkZWZpbmUgTkFVODgxMF9FUTNCV19TRlQJCTgKKworLyogTkFVODgxMF9SRUdfRVE0ICgweDE1KSAqLworI2RlZmluZSBOQVU4ODEwX0VRNEdDX1NGVAkJMAorI2RlZmluZSBOQVU4ODEwX0VRNENGX1NGVAkJNQorI2RlZmluZSBOQVU4ODEwX0VRNEJXX1NGVAkJOAorCisvKiBOQVU4ODEwX1JFR19FUTUgKDB4MTYpICovCisjZGVmaW5lIE5BVTg4MTBfRVE1R0NfU0ZUCQkwCisjZGVmaW5lIE5BVTg4MTBfRVE1Q0ZfU0ZUCQk1CisKKy8qIE5BVTg4MTBfUkVHX0RBQ0xJTTEgKDB4MTgpICovCisjZGVmaW5lIE5BVTg4MTBfREFDTElNQVRLX1NGVAkJMAorI2RlZmluZSBOQVU4ODEwX0RBQ0xJTURDWV9TRlQJCTQKKyNkZWZpbmUgTkFVODgxMF9EQUNMSU1FTl9TRlQJCTgKKworLyogTkFVODgxMF9SRUdfREFDTElNMiAoMHgxOSkgKi8KKyNkZWZpbmUgTkFVODgxMF9EQUNMSU1CU1RfU0ZUCQkwCisjZGVmaW5lIE5BVTg4MTBfREFDTElNVEhMX1NGVAkJNAorCisvKiBOQVU4ODEwX1JFR19BTEMxICgweDIwKSAqLworI2RlZmluZSBOQVU4ODEwX0FMQ01JTkdBSU5fU0ZUCTAKKyNkZWZpbmUgTkFVODgxMF9BTENNWEdBSU5fU0ZUCQkzCisjZGVmaW5lIE5BVTg4MTBfQUxDRU5fU0ZUCQk4CisKKy8qIE5BVTg4MTBfUkVHX0FMQzIgKDB4MjEpICovCisjZGVmaW5lIE5BVTg4MTBfQUxDU0xfU0ZUCQkwCisjZGVmaW5lIE5BVTg4MTBfQUxDSFRfU0ZUCQk0CisjZGVmaW5lIE5BVTg4MTBfQUxDWkNfU0ZUCQk4CisKKy8qIE5BVTg4MTBfUkVHX0FMQzMgKDB4MjIpICovCisjZGVmaW5lIE5BVTg4MTBfQUxDQVRLX1NGVAkJMAorI2RlZmluZSBOQVU4ODEwX0FMQ0RDWV9TRlQJCTQKKyNkZWZpbmUgTkFVODgxMF9BTENNX1NGVAkJOAorCisvKiBOQVU4ODEwX1JFR19OT0lTRUdBVEUgKDB4MjMpICovCisjZGVmaW5lIE5BVTg4MTBfQUxDTlRIX1NGVAkJMAorI2RlZmluZSBOQVU4ODEwX0FMQ05FTl9TRlQJCTMKKworLyogTkFVODgxMF9SRUdfUExMTiAoMHgyNCkgKi8KKyNkZWZpbmUgTkFVODgxMF9QTExOX01BU0sJCTB4RgorI2RlZmluZSBOQVU4ODEwX1BMTE1DTEtfRElWMgkJKDB4MSA8PCA0KQorCisvKiBOQVU4ODEwX1JFR19QTExLMSAoMHgyNSkgKi8KKyNkZWZpbmUgTkFVODgxMF9QTExLMV9TRlQJCTE4CisjZGVmaW5lIE5BVTg4MTBfUExMSzFfTUFTSwkJMHgzRgorCisvKiBOQVU4ODEwX1JFR19QTExLMiAoMHgyNikgKi8KKyNkZWZpbmUgTkFVODgxMF9QTExLMl9TRlQJCTkKKyNkZWZpbmUgTkFVODgxMF9QTExLMl9NQVNLCQkweDFGRgorCisvKiBOQVU4ODEwX1JFR19QTExLMyAoMHgyNykgKi8KKyNkZWZpbmUgTkFVODgxMF9QTExLM19NQVNLCQkweDFGRgorCisvKiBOQVU4ODEwX1JFR19JTlBVVF9TSUdOQUwgKDB4MkMpICovCisjZGVmaW5lIE5BVTg4MTBfUE1JQ1BHQV9TRlQJCTAKKyNkZWZpbmUgTkFVODgxMF9OTUlDUEdBX1NGVAkJMQorCisvKiBOQVU4ODEwX1JFR19QR0FHQUlOICgweDJEKSAqLworI2RlZmluZSBOQVU4ODEwX1BHQUdBSU5fU0ZUCQkwCisjZGVmaW5lIE5BVTg4MTBfUEdBTVRfU0ZUCQk2CisjZGVmaW5lIE5BVTg4MTBfUEdBWkNfU0ZUCQk3CisKKy8qIE5BVTg4MTBfUkVHX0FEQ0JPT1NUICgweDJGKSAqLworI2RlZmluZSBOQVU4ODEwX1BNSUNCU1RHQUlOX1NGVAk0CisjZGVmaW5lIE5BVTg4MTBfUEdBQlNUX1NGVAkJOAorCisvKiBOQVU4ODEwX1JFR19TUEtNSVggKDB4MzIpICovCisjZGVmaW5lIE5BVTg4MTBfREFDU1BLX1NGVAkJMAorI2RlZmluZSBOQVU4ODEwX0JZUFNQS19TRlQJCTEKKworLyogTkFVODgxMF9SRUdfU1BLR0FJTiAoMHgzNikgKi8KKyNkZWZpbmUgTkFVODgxMF9TUEtHQUlOX1NGVAkJMAorI2RlZmluZSBOQVU4ODEwX1NQS01UX1NGVAkJNgorI2RlZmluZSBOQVU4ODEwX1NQS1pDX1NGVAkJNworCisvKiBOQVU4ODEwX1JFR19NT05PTUlYICgweDM4KSAqLworI2RlZmluZSBOQVU4ODEwX0RBQ01PVVRfU0ZUCQkwCisjZGVmaW5lIE5BVTg4MTBfQllQTU9VVF9TRlQJCTEKKyNkZWZpbmUgTkFVODgxMF9NT1VUTVhNVF9TRlQJCTYKKworCisvKiBTeXN0ZW0gQ2xvY2sgU291cmNlICovCitlbnVtIHsKKwlOQVU4ODEwX1NDTEtfTUNMSywKKwlOQVU4ODEwX1NDTEtfUExMLAorfTsKKworc3RydWN0IG5hdTg4MTBfcGxsIHsKKwlpbnQgcHJlX2ZhY3RvcjsKKwlpbnQgbWNsa19zY2FsZXI7CisJaW50IHBsbF9mcmFjOworCWludCBwbGxfaW50OworfTsKKworc3RydWN0IG5hdTg4MTAgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJc3RydWN0IG5hdTg4MTBfcGxsIHBsbDsKKwlpbnQgc3lzY2xrOworCWludCBjbGtfaWQ7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbmF1ODgyNS5jIGIvc291bmQvc29jL2NvZGVjcy9uYXU4ODI1LmMKaW5kZXggNWM5NzA3YS4uZTY0M2JlOSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9uYXU4ODI1LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9uYXU4ODI1LmMKQEAgLTIxMiwzMSArMjEyLDYgQEAKIAkweGZhMmYsIDB4ZmFlYSwgMHhmYmE1LCAweGZjNjAsIDB4ZmQxYSwgMHhmZGQ0LCAweGZlOGUsIDB4ZmY0NwogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaSAqbmF1ODgyNV9nZXRfY29kZWNfZGFpKHN0cnVjdCBuYXU4ODI1ICpuYXU4ODI1KQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyhuYXU4ODI1LT5kYXBtKTsKLQlzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNvbXBvbmVudCA9ICZjb2RlYy0+Y29tcG9uZW50OwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpLCAqX2RhaTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjb2RlY19kYWksIF9kYWksICZjb21wb25lbnQtPmRhaV9saXN0LCBsaXN0KSB7Ci0JCWlmICghc3RybmNtcChjb2RlY19kYWktPm5hbWUsIE5VVk9UT05fQ09ERUNfREFJLAotCQkJc3RybGVuKE5VVk9UT05fQ09ERUNfREFJKSkpCi0JCQlyZXR1cm4gY29kZWNfZGFpOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGJvb2wgbmF1ODgyNV9kYWlfaXNfYWN0aXZlKHN0cnVjdCBuYXU4ODI1ICpuYXU4ODI1KQotewotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gbmF1ODgyNV9nZXRfY29kZWNfZGFpKG5hdTg4MjUpOwotCi0JaWYgKGNvZGVjX2RhaSkgewotCQlpZiAoY29kZWNfZGFpLT5wbGF5YmFja19hY3RpdmUgfHwgY29kZWNfZGFpLT5jYXB0dXJlX2FjdGl2ZSkKLQkJCXJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KIC8qKgogICogbmF1ODgyNV9zZW1hX2FjcXVpcmUgLSBhY3F1aXJlIHRoZSBzZW1hcGhvcmUgb2YgbmF1ODhsMjUKICAqIEBuYXU4ODI1OiAgY29tcG9uZW50IHRvIHJlZ2lzdGVyIHRoZSBjb2RlYyBwcml2YXRlIGRhdGEgd2l0aApAQCAtMjUwLDE5ICsyMjUsMjYgQEAKICAqIEFjcXVpcmVzIHRoZSBzZW1hcGhvcmUgd2l0aG91dCBqaWZmaWVzLiBJZiBubyBtb3JlIHRhc2tzIGFyZSBhbGxvd2VkCiAgKiB0byBhY3F1aXJlIHRoZSBzZW1hcGhvcmUsIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIHB1dCB0aGUgdGFzayB0bwogICogc2xlZXAgdW50aWwgdGhlIHNlbWFwaG9yZSBpcyByZWxlYXNlZC4KLSAqIEl0IHJldHVybnMgaWYgdGhlIHNlbWFwaG9yZSB3YXMgYWNxdWlyZWQuCisgKiBJZiB0aGUgc2VtYXBob3JlIGlzIG5vdCByZWxlYXNlZCB3aXRoaW4gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgamlmZmllcywKKyAqIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAtRVRJTUUuCisgKiBJZiB0aGUgc2xlZXAgaXMgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gLUVJTlRSLgorICogSXQgcmV0dXJucyAwIGlmIHRoZSBzZW1hcGhvcmUgd2FzIGFjcXVpcmVkIHN1Y2Nlc3NmdWxseS4KICAqLwotc3RhdGljIHZvaWQgbmF1ODgyNV9zZW1hX2FjcXVpcmUoc3RydWN0IG5hdTg4MjUgKm5hdTg4MjUsIGxvbmcgdGltZW91dCkKK3N0YXRpYyBpbnQgbmF1ODgyNV9zZW1hX2FjcXVpcmUoc3RydWN0IG5hdTg4MjUgKm5hdTg4MjUsIGxvbmcgdGltZW91dCkKIHsKIAlpbnQgcmV0OwogCi0JaWYgKHRpbWVvdXQpCisJaWYgKHRpbWVvdXQpIHsKIAkJcmV0ID0gZG93bl90aW1lb3V0KCZuYXU4ODI1LT54dGFsa19zZW0sIHRpbWVvdXQpOwotCWVsc2UKKwkJaWYgKHJldCA8IDApCisJCQlkZXZfd2FybihuYXU4ODI1LT5kZXYsICJBY3F1aXJlIHNlbWFwaG9uZSB0aW1lb3V0XG4iKTsKKwl9IGVsc2UgewogCQlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJm5hdTg4MjUtPnh0YWxrX3NlbSk7CisJCWlmIChyZXQgPCAwKQorCQkJZGV2X3dhcm4obmF1ODgyNS0+ZGV2LCAiQWNxdWlyZSBzZW1hcGhvbmUgZmFpbFxuIik7CisJfQogCi0JaWYgKHJldCA8IDApCi0JCWRldl93YXJuKG5hdTg4MjUtPmRldiwgIkFjcXVpcmUgc2VtYXBob25lIGZhaWxcbiIpOworCXJldHVybiByZXQ7CiB9CiAKIC8qKgpAQCAtMTIwNSw2ICsxMTg3LDggQEAKIAlzdHJ1Y3QgbmF1ODgyNSAqbmF1ODgyNSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCXVuc2lnbmVkIGludCB2YWxfbGVuID0gMDsKIAorCW5hdTg4MjVfc2VtYV9hY3F1aXJlKG5hdTg4MjUsIDIgKiBIWik7CisKIAlzd2l0Y2ggKHBhcmFtc193aWR0aChwYXJhbXMpKSB7CiAJY2FzZSAxNjoKIAkJdmFsX2xlbiB8PSBOQVU4ODI1X0kyU19ETF8xNjsKQEAgLTEyMjUsNiArMTIwOSw5IEBACiAJcmVnbWFwX3VwZGF0ZV9iaXRzKG5hdTg4MjUtPnJlZ21hcCwgTkFVODgyNV9SRUdfSTJTX1BDTV9DVFJMMSwKIAkJTkFVODgyNV9JMlNfRExfTUFTSywgdmFsX2xlbik7CiAKKwkvKiBSZWxlYXNlIHRoZSBzZW1hcGhvbmUuICovCisJbmF1ODgyNV9zZW1hX3JlbGVhc2UobmF1ODgyNSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTIzNCw2ICsxMjIxLDggQEAKIAlzdHJ1Y3QgbmF1ODgyNSAqbmF1ODgyNSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCXVuc2lnbmVkIGludCBjdHJsMV92YWwgPSAwLCBjdHJsMl92YWwgPSAwOwogCisJbmF1ODgyNV9zZW1hX2FjcXVpcmUobmF1ODgyNSwgMiAqIEhaKTsKKwogCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKIAljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CiAJCWN0cmwyX3ZhbCB8PSBOQVU4ODI1X0kyU19NU19NQVNURVI7CkBAIC0xMjgyLDYgKzEyNzEsOSBAQAogCXJlZ21hcF91cGRhdGVfYml0cyhuYXU4ODI1LT5yZWdtYXAsIE5BVTg4MjVfUkVHX0kyU19QQ01fQ1RSTDIsCiAJCU5BVTg4MjVfSTJTX01TX01BU0ssIGN0cmwyX3ZhbCk7CiAKKwkvKiBSZWxlYXNlIHRoZSBzZW1hcGhvbmUuICovCisJbmF1ODgyNV9zZW1hX3JlbGVhc2UobmF1ODgyNSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTYxMSw4ICsxNjAzLDExIEBACiAJCQkJCSAqIGNlc3MgYW5kIHJlc3RvcmUgY2hhbmdlcyBpZiBwcm9jZXNzCiAJCQkJCSAqIGlzIG9uZ29pbmcgd2hlbiBlamVjdGlvbi4KIAkJCQkJICovCisJCQkJCWludCByZXQ7CiAJCQkJCW5hdTg4MjUtPnh0YWxrX3Byb3RlY3QgPSB0cnVlOwotCQkJCQluYXU4ODI1X3NlbWFfYWNxdWlyZShuYXU4ODI1LCAwKTsKKwkJCQkJcmV0ID0gbmF1ODgyNV9zZW1hX2FjcXVpcmUobmF1ODgyNSwgMCk7CisJCQkJCWlmIChyZXQgPCAwKQorCQkJCQkJbmF1ODgyNS0+eHRhbGtfcHJvdGVjdCA9IGZhbHNlOwogCQkJCX0KIAkJCQkvKiBTdGFydHVwIGNyb3NzIHRhbGsgZGV0ZWN0aW9uIHByb2Nlc3MgKi8KIAkJCQluYXU4ODI1LT54dGFsa19zdGF0ZSA9IE5BVTg4MjVfWFRBTEtfUFJFUEFSRTsKQEAgLTE5MTIsNyArMTkwNyw3IEBACiAJLyogQ2FsY3VsYXRlIHRoZSBGTEwgMTAtYml0IGludGVnZXIgaW5wdXQgYW5kIHRoZSBGTEwgMTYtYml0IGZyYWN0aW9uYWwKIAkgKiBpbnB1dCBiYXNlZCBvbiBGRENPLCBGUkVGIGFuZCBGTEwgcmF0aW8uCiAJICovCi0JZnZjbyA9IGRpdl91NjQoZnZjbyA8PCAxNiwgZnJlZiAqIGZsbF9wYXJhbS0+cmF0aW8pOworCWZ2Y28gPSBkaXZfdTY0KGZ2Y29fbWF4IDw8IDE2LCBmcmVmICogZmxsX3BhcmFtLT5yYXRpbyk7CiAJZmxsX3BhcmFtLT5mbGxfaW50ID0gKGZ2Y28gPj4gMTYpICYgMHgzRkY7CiAJZmxsX3BhcmFtLT5mbGxfZnJhYyA9IGZ2Y28gJiAweEZGRkY7CiAJcmV0dXJuIDA7CkBAIC0yMjM4LDIzICsyMjMzLDE0IEBACiBzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIG5hdTg4MjVfcmVzdW1lKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgbmF1ODgyNSAqbmF1ODgyNSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCByZXQ7CiAKIAlyZWdjYWNoZV9jYWNoZV9vbmx5KG5hdTg4MjUtPnJlZ21hcCwgZmFsc2UpOwogCXJlZ2NhY2hlX3N5bmMobmF1ODgyNS0+cmVnbWFwKTsKLQlpZiAobmF1ODgyNV9pc19qYWNrX2luc2VydGVkKG5hdTg4MjUtPnJlZ21hcCkpIHsKLQkJLyogSWYgdGhlIGphY2sgaXMgaW5zZXJ0ZWQsIHdlIG5lZWQgdG8gY2hlY2sgd2hldGhlciB0aGUgcGxheS0KLQkJICogYmFjayBpcyBhY3RpdmUgYmVmb3JlIHN1c3BlbmQuIElmIGFjdGl2ZSwgdGhlIGRyaXZlciBoYXMgdG8KLQkJICogcmFpc2UgdGhlIHByb3RlY3Rpb24gZm9yIGNyb3NzIHRhbGsgZnVuY3Rpb24gdG8gYXZvaWQgdGhlCi0JCSAqIHBsYXliYWNrIHJlY292ZXJzIGJlZm9yZSBjcm9zcyB0YWxrIHByb2Nlc3MgZmluaXNoLiBPdGhlci0KLQkJICogd2lzZSwgdGhlIHBsYXliYWNrIHdpbGwgYmUgaW50ZXJmZXJlZCBieSBjcm9zcyB0YWxrIGZ1bmMtCi0JCSAqIHRpb24uIEl0IGlzIGJldHRlciB0byBhcHBseSBoYXJkd2FyZSByZWxhdGVkIHBhcmFtZXRlcnMKLQkJICogYmVmb3JlIHN0YXJ0aW5nIHBsYXliYWNrIG9yIHJlY29yZC4KLQkJICovCi0JCWlmIChuYXU4ODI1X2RhaV9pc19hY3RpdmUobmF1ODgyNSkpIHsKLQkJCW5hdTg4MjUtPnh0YWxrX3Byb3RlY3QgPSB0cnVlOwotCQkJbmF1ODgyNV9zZW1hX2FjcXVpcmUobmF1ODgyNSwgMCk7Ci0JCX0KLQl9CisJbmF1ODgyNS0+eHRhbGtfcHJvdGVjdCA9IHRydWU7CisJcmV0ID0gbmF1ODgyNV9zZW1hX2FjcXVpcmUobmF1ODgyNSwgMCk7CisJaWYgKHJldCA8IDApCisJCW5hdTg4MjUtPnh0YWxrX3Byb3RlY3QgPSBmYWxzZTsKIAllbmFibGVfaXJxKG5hdTg4MjUtPmlycSk7CiAKIAlyZXR1cm4gMDsKQEAgLTIyNzAsMTIgKzIyNTYsMTQgQEAKIAkuc3VzcGVuZCA9IG5hdTg4MjVfc3VzcGVuZCwKIAkucmVzdW1lID0gbmF1ODgyNV9yZXN1bWUsCiAKLQkuY29udHJvbHMgPSBuYXU4ODI1X2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKG5hdTg4MjVfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBuYXU4ODI1X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUobmF1ODgyNV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IG5hdTg4MjVfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUobmF1ODgyNV9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBuYXU4ODI1X2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUobmF1ODgyNV9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gbmF1ODgyNV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShuYXU4ODI1X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBuYXU4ODI1X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShuYXU4ODI1X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIHZvaWQgbmF1ODgyNV9yZXNldF9jaGlwKHN0cnVjdCByZWdtYXAgKnJlZ21hcCkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcGNtMTY4MS5jIGIvc291bmQvc29jL2NvZGVjcy9wY20xNjgxLmMKaW5kZXggMzNlMWZjMmQuLjBiMTRlZmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvcGNtMTY4MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcGNtMTY4MS5jCkBAIC0yODksMTIgKzI4OSwxNCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3BjbTE2ODEgPSB7Ci0JLmNvbnRyb2xzCQk9IHBjbTE2ODFfY29udHJvbHMsCi0JLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHBjbTE2ODFfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMJCT0gcGNtMTY4MV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHBjbTE2ODFfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMJCT0gcGNtMTY4MV9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShwY20xNjgxX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHBjbTE2ODFfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShwY20xNjgxX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBwY20xNjgxX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHBjbTE2ODFfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHBjbTE2ODFfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHBjbTE2ODFfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgcGNtMTY4MV9pMmNfaWRbXSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcGNtMTc5eC5jIGIvc291bmQvc29jL2NvZGVjcy9wY20xNzl4LmMKaW5kZXggODhmYmRkMS4uYjgxM2ExNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9wY20xNzl4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9wY20xNzl4LmMKQEAgLTIwNiwxMiArMjA2LDE0IEBACiBFWFBPUlRfU1lNQk9MX0dQTChwY20xNzl4X3JlZ21hcF9jb25maWcpOwogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfcGNtMTc5eCA9IHsKLQkuY29udHJvbHMJCT0gcGNtMTc5eF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUocGNtMTc5eF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cwkJPSBwY20xNzl4X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUocGNtMTc5eF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcwkJPSBwY20xNzl4X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHBjbTE3OXhfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gcGNtMTc5eF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHBjbTE3OXhfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHBjbTE3OXhfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUocGNtMTc5eF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gcGNtMTc5eF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUocGNtMTc5eF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIGludCBwY20xNzl4X2NvbW1vbl9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJlZ21hcCAqcmVnbWFwKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9wY20zMDA4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3BjbTMwMDguYwppbmRleCA4ZmI0NDVmLi43MDhhZjA1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3BjbTMwMDguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3BjbTMwMDguYwpAQCAtOTksMTAgKzk5LDEyIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfcGNtMzAwOCA9IHsKLQkuZGFwbV93aWRnZXRzID0gcGNtMzAwOF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHBjbTMwMDhfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBwY20zMDA4X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHBjbTMwMDhfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuZGFwbV93aWRnZXRzCQk9IHBjbTMwMDhfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUocGNtMzAwOF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gcGNtMzAwOF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUocGNtMzAwOF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgcGNtMzAwOF9jb2RlY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9wY20zMTY4YS5jIGIvc291bmQvc29jL2NvZGVjcy9wY20zMTY4YS5jCmluZGV4IDk5MmE3N2UuLjM5YmMwMmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvcGNtMzE2OGEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3BjbTMxNjhhLmMKQEAgLTU5OSwxMiArNTk5LDE0IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgcGNtMzE2OGFfZHJpdmVyID0gewogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKLQkuY29udHJvbHMgPSBwY20zMTY4YV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUocGNtMzE2OGFfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gcGNtMzE2OGFfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShwY20zMTY4YV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHBjbTMxNjhhX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHBjbTMxNjhhX2RhcG1fcm91dGVzKQorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gcGNtMzE2OGFfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUocGNtMzE2OGFfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBwY20zMTY4YV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShwY20zMTY4YV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gcGNtMzE2OGFfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHBjbTMxNjhhX2RhcG1fcm91dGVzKQorCX0sCiB9OwogCiBpbnQgcGNtMzE2OGFfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3BjbTUxMnguYyBiL3NvdW5kL3NvYy9jb2RlY3MvcGNtNTEyeC5jCmluZGV4IDA0N2M0ODkuLjcyYjE5ZTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvcGNtNTEyeC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcGNtNTEyeC5jCkBAIC0xMzQ4LDEyICsxMzQ4LDE0IEBACiAJLnNldF9iaWFzX2xldmVsID0gcGNtNTEyeF9zZXRfYmlhc19sZXZlbCwKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSBwY201MTJ4X2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHBjbTUxMnhfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBwY201MTJ4X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUocGNtNTEyeF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHBjbTUxMnhfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUocGNtNTEyeF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBwY201MTJ4X2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUocGNtNTEyeF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gcGNtNTEyeF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShwY201MTJ4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBwY201MTJ4X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShwY201MTJ4X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfcmFuZ2VfY2ZnIHBjbTUxMnhfcmFuZ2UgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3J0Mjg2LmMgYi9zb3VuZC9zb2MvY29kZWNzL3J0Mjg2LmMKaW5kZXggNzRjMGU0ZS4uOWMzNjVhNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9ydDI4Ni5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQyODYuYwpAQCAtMTA1MywxMiArMTA1MywxNCBAQAogCS5yZXN1bWUgPSBydDI4Nl9yZXN1bWUsCiAJLnNldF9iaWFzX2xldmVsID0gcnQyODZfc2V0X2JpYXNfbGV2ZWwsCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAotCS5jb250cm9scyA9IHJ0Mjg2X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShydDI4Nl9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBydDI4Nl9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHJ0Mjg2X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gcnQyODZfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUocnQyODZfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gcnQyODZfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUocnQyODZfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBydDI4Nl9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShydDI4Nl9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gcnQyODZfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHJ0Mjg2X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHJ0Mjg2X3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcnQyOTguYyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQyOTguYwppbmRleCBmODBjZmU0Li41NTU1ODY0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3J0Mjk4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9ydDI5OC5jCkBAIC0xMDk1LDEyICsxMDk1LDE0IEBACiAJLnJlc3VtZSA9IHJ0Mjk4X3Jlc3VtZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSBydDI5OF9zZXRfYmlhc19sZXZlbCwKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCi0JLmNvbnRyb2xzID0gcnQyOThfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHJ0Mjk4X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHJ0Mjk4X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUocnQyOThfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBydDI5OF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShydDI5OF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBydDI5OF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShydDI5OF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHJ0Mjk4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHJ0Mjk4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBydDI5OF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUocnQyOThfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgcnQyOThfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDU1MTQtc3BpLmMgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTUxNC1zcGkuYwppbmRleCA3N2ZmOGViLi4wOTEwM2FhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3J0NTUxNC1zcGkuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTUxNC1zcGkuYwpAQCAtMjM2LDcgKzIzNiw3IEBACiAJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhydW50aW1lLCBydDU1MTRfZHNwLT5kbWFfb2Zmc2V0KTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBydDU1MTRfc3BpX3BjbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHJ0NTUxNF9zcGlfcGNtX29wcyA9IHsKIAkub3BlbgkJPSBydDU1MTRfc3BpX3BjbV9vcGVuLAogCS5od19wYXJhbXMJPSBydDU1MTRfc3BpX2h3X3BhcmFtcywKIAkuaHdfZnJlZQk9IHJ0NTUxNF9zcGlfaHdfZnJlZSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NTE0LmMgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTUxNC5jCmluZGV4IDcxNjJmMDUuLmYyNGI3Y2YgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NTE0LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9ydDU1MTQuYwpAQCAtMjc4LDcgKzI3OCw3IEBACiAJOCwgOCwgVExWX0RCX1NDQUxFX0lURU0oMTcwMCwgMCwgMCkKICk7CiAKLXN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShhZGNfdm9sX3RsdiwgLTE3NjI1LCAzNzUsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGFkY192b2xfdGx2LCAtMTcyNSwgNzUsIDApOwogCiBzdGF0aWMgaW50IHJ0NTUxNF9kc3Bfdm9pY2Vfd2FrZV91cF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQpAQCAtMzUyLDEwICszNTIsMTAgQEAKIAlTT0NfRE9VQkxFX1RMVigiTUlDIEJvb3N0IFZvbHVtZSIsIFJUNTUxNF9BTkFfQ1RSTF9NSUNCU1QsCiAJCVJUNTUxNF9TRUxfQlNUTF9TRlQsIFJUNTUxNF9TRUxfQlNUUl9TRlQsIDgsIDAsIGJzdF90bHYpLAogCVNPQ19ET1VCTEVfUl9UTFYoIkFEQzEgQ2FwdHVyZSBWb2x1bWUiLCBSVDU1MTRfRE9XTkZJTFRFUjBfQ1RSTDEsCi0JCVJUNTUxNF9ET1dORklMVEVSMF9DVFJMMiwgUlQ1NTE0X0FEX0dBSU5fU0ZULCAxMjcsIDAsCisJCVJUNTUxNF9ET1dORklMVEVSMF9DVFJMMiwgUlQ1NTE0X0FEX0dBSU5fU0ZULCA2MywgMCwKIAkJYWRjX3ZvbF90bHYpLAogCVNPQ19ET1VCTEVfUl9UTFYoIkFEQzIgQ2FwdHVyZSBWb2x1bWUiLCBSVDU1MTRfRE9XTkZJTFRFUjFfQ1RSTDEsCi0JCVJUNTUxNF9ET1dORklMVEVSMV9DVFJMMiwgUlQ1NTE0X0FEX0dBSU5fU0ZULCAxMjcsIDAsCisJCVJUNTUxNF9ET1dORklMVEVSMV9DVFJMMiwgUlQ1NTE0X0FEX0dBSU5fU0ZULCA2MywgMCwKIAkJYWRjX3ZvbF90bHYpLAogCVNPQ19TSU5HTEVfRVhUKCJEU1AgVm9pY2UgV2FrZSBVcCIsIFNORF9TT0NfTk9QTSwgMCwgMSwgMCwKIAkJcnQ1NTE0X2RzcF92b2ljZV93YWtlX3VwX2dldCwgcnQ1NTE0X2RzcF92b2ljZV93YWtlX3VwX3B1dCksCkBAIC0xMDIzLDEyICsxMDIzLDE0IEBACiAJLnByb2JlID0gcnQ1NTE0X3Byb2JlLAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSBydDU1MTRfc2V0X2JpYXNfbGV2ZWwsCi0JLmNvbnRyb2xzID0gcnQ1NTE0X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShydDU1MTRfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gcnQ1NTE0X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUocnQ1NTE0X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gcnQ1NTE0X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHJ0NTUxNF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBydDU1MTRfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUocnQ1NTE0X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gcnQ1NTE0X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHJ0NTUxNF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gcnQ1NTE0X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShydDU1MTRfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgcnQ1NTE0X2kyY19yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3J0NTUxNC5oIGIvc291bmQvc29jL2NvZGVjcy9ydDU1MTQuaAppbmRleCA2ODg4M2M2Li4yMjlkZTBlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3J0NTUxNC5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NTE0LmgKQEAgLTE5Niw4ICsxOTYsOCBAQAogI2RlZmluZSBSVDU1MTRfQURfQURfTUlYX0JJVAkJCTEwCiAjZGVmaW5lIFJUNTUxNF9BRF9BRF9NVVRFCQkJKDB4MSA8PCA3KQogI2RlZmluZSBSVDU1MTRfQURfQURfTVVURV9CSVQJCQk3Ci0jZGVmaW5lIFJUNTUxNF9BRF9HQUlOX01BU0sJCQkoMHg3ZiA8PCAwKQotI2RlZmluZSBSVDU1MTRfQURfR0FJTl9TRlQJCQkwCisjZGVmaW5lIFJUNTUxNF9BRF9HQUlOX01BU0sJCQkoMHgzZiA8PCAxKQorI2RlZmluZSBSVDU1MTRfQURfR0FJTl9TRlQJCQkxCiAKIC8qICBSVDU1MTRfQU5BX0NUUkxfTUlDQlNUICgweDIyMjApICovCiAjZGVmaW5lIFJUNTUxNF9TRUxfQlNUTF9NQVNLCQkJKDB4ZiA8PCA0KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDU2MTYuYyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjE2LmMKaW5kZXggZjUyN2I1Yi4uZDFmMjczYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9ydDU2MTYuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTYxNi5jCkBAIC0yOTQsOCArMjk0LDcgQEAKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShhZGNfYnN0X3RsdiwgMCwgMTIwMCwgMCk7CiAKIC8qIHswLCArMjAsICsyNCwgKzMwLCArMzUsICs0MCwgKzQ0LCArNTAsICs1Mn0gZEIgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYnN0X3RsdltdID0gewotCVRMVl9EQl9SQU5HRV9IRUFEKDcpLAorc3RhdGljIGNvbnN0IFNORFJWX0NUTF9UTFZEX0RFQ0xBUkVfREJfUkFOR0UoYnN0X3RsdiwKIAkwLCAwLCBUTFZfREJfU0NBTEVfSVRFTSgwLCAwLCAwKSwKIAkxLCAxLCBUTFZfREJfU0NBTEVfSVRFTSgyMDAwLCAwLCAwKSwKIAkyLCAyLCBUTFZfREJfU0NBTEVfSVRFTSgyNDAwLCAwLCAwKSwKQEAgLTMwMyw3ICszMDIsNyBAQAogCTYsIDYsIFRMVl9EQl9TQ0FMRV9JVEVNKDQ0MDAsIDAsIDApLAogCTcsIDcsIFRMVl9EQl9TQ0FMRV9JVEVNKDUwMDAsIDAsIDApLAogCTgsIDgsIFRMVl9EQl9TQ0FMRV9JVEVNKDUyMDAsIDAsIDApLAotfTsKKyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2MTZfc25kX2NvbnRyb2xzW10gPSB7CiAJLyogSGVhZHBob25lIE91dHB1dCBWb2x1bWUgKi8KQEAgLTEyNjcsMTQgKzEyNjYsMTQgQEAKICNkZWZpbmUgUlQ1NjE2X0ZPUk1BVFMgKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHwgXAogCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1M4KQogCi1zdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIHJ0NTYxNl9haWZfZGFpX29wcyA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIHJ0NTYxNl9haWZfZGFpX29wcyA9IHsKIAkuaHdfcGFyYW1zID0gcnQ1NjE2X2h3X3BhcmFtcywKIAkuc2V0X2ZtdCA9IHJ0NTYxNl9zZXRfZGFpX2ZtdCwKIAkuc2V0X3N5c2NsayA9IHJ0NTYxNl9zZXRfZGFpX3N5c2NsaywKIAkuc2V0X3BsbCA9IHJ0NTYxNl9zZXRfZGFpX3BsbCwKIH07CiAKLXN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgcnQ1NjE2X2RhaVtdID0geworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgcnQ1NjE2X2RhaVtdID0gewogCXsKIAkJLm5hbWUgPSAicnQ1NjE2LWFpZjEiLAogCQkuaWQgPSBSVDU2MTZfQUlGMSwKQEAgLTEzMDIsMTIgKzEzMDEsMTQgQEAKIAkucmVzdW1lID0gcnQ1NjE2X3Jlc3VtZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSBydDU2MTZfc2V0X2JpYXNfbGV2ZWwsCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAotCS5jb250cm9scyA9IHJ0NTYxNl9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUocnQ1NjE2X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHJ0NTYxNl9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHJ0NTYxNl9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHJ0NTYxNl9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShydDU2MTZfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gcnQ1NjE2X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHJ0NTYxNl9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHJ0NTYxNl9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShydDU2MTZfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHJ0NTYxNl9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUocnQ1NjE2X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHJ0NTYxNl9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3J0NTYzMS5jIGIvc291bmQvc29jL2NvZGVjcy9ydDU2MzEuYwppbmRleCAxYmUyYmFiLi4wZTQxODA4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3J0NTYzMS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjMxLmMKQEAgLTE2NTcsMTIgKzE2NTcsMTQgQEAKIAkucHJvYmUgPSBydDU2MzFfcHJvYmUsCiAJLnNldF9iaWFzX2xldmVsID0gcnQ1NjMxX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKLQkuY29udHJvbHMgPSBydDU2MzFfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHJ0NTYzMV9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBydDU2MzFfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShydDU2MzFfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBydDU2MzFfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUocnQ1NjMxX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHJ0NTYzMV9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShydDU2MzFfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBydDU2MzFfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUocnQ1NjMxX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBydDU2MzFfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHJ0NTYzMV9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBydDU2MzFfaTJjX2lkW10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3J0NTY0MC5jIGIvc291bmQvc29jL2NvZGVjcy9ydDU2NDAuYwppbmRleCAwOWU4OTg4Li4zY2MxMTM1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3J0NTY0MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjQwLmMKQEAgLTE4NzAsNiArMTg3MCw5IEBACiAJY2FzZSBSVDU2NDBfU0NMS19TX1BMTDE6CiAJCXJlZ192YWwgfD0gUlQ1NjQwX1NDTEtfU1JDX1BMTDE7CiAJCWJyZWFrOworCWNhc2UgUlQ1NjQwX1NDTEtfU19SQ0NMSzoKKwkJcmVnX3ZhbCB8PSBSVDU2NDBfU0NMS19TUkNfUkNDTEs7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRldl9lcnIoY29kZWMtPmRldiwgIkludmFsaWQgY2xvY2sgaWQgKCVkKVxuIiwgY2xrX2lkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMjYxLDEyICsyMjY0LDE0IEBACiAJLnJlc3VtZSA9IHJ0NTY0MF9yZXN1bWUsCiAJLnNldF9iaWFzX2xldmVsID0gcnQ1NjQwX3NldF9iaWFzX2xldmVsLAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKLQkuY29udHJvbHMgPSBydDU2NDBfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHJ0NTY0MF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBydDU2NDBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShydDU2NDBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBydDU2NDBfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUocnQ1NjQwX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHJ0NTY0MF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShydDU2NDBfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBydDU2NDBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUocnQ1NjQwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBydDU2NDBfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHJ0NTY0MF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBydDU2NDBfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDU2NDAuaCBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjQwLmgKaW5kZXggNThiNjY0Yi4uOTBjODg3MSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9ydDU2NDAuaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY0MC5oCkBAIC05ODQsNiArOTg0LDcgQEAKICNkZWZpbmUgUlQ1NjQwX1NDTEtfU1JDX1NGVAkJCTE0CiAjZGVmaW5lIFJUNTY0MF9TQ0xLX1NSQ19NQ0xLCQkJKDB4MCA8PCAxNCkKICNkZWZpbmUgUlQ1NjQwX1NDTEtfU1JDX1BMTDEJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NDBfU0NMS19TUkNfUkNDTEsJCQkoMHgyIDw8IDE0KQogI2RlZmluZSBSVDU2NDBfUExMMV9TUkNfTUFTSwkJCSgweDMgPDwgMTIpCiAjZGVmaW5lIFJUNTY0MF9QTEwxX1NSQ19TRlQJCQkxMgogI2RlZmluZSBSVDU2NDBfUExMMV9TUkNfTUNMSwkJCSgweDAgPDwgMTIpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3J0NTY0NS5jIGIvc291bmQvc29jL2NvZGVjcy9ydDU2NDUuYwppbmRleCA0OTBiZmU2Li4xMGMyYTU2NCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9ydDU2NDUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY0NS5jCkBAIC0zNDg0LDEyICszNDg0LDE0IEBACiAJLnJlc3VtZSA9IHJ0NTY0NV9yZXN1bWUsCiAJLnNldF9iaWFzX2xldmVsID0gcnQ1NjQ1X3NldF9iaWFzX2xldmVsLAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKLQkuY29udHJvbHMgPSBydDU2NDVfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHJ0NTY0NV9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBydDU2NDVfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShydDU2NDVfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBydDU2NDVfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUocnQ1NjQ1X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHJ0NTY0NV9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShydDU2NDVfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBydDU2NDVfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUocnQ1NjQ1X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBydDU2NDVfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHJ0NTY0NV9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBydDU2NDVfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDU2NTEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjUxLmMKaW5kZXggN2E2MTk3MC4uZjVkMzQxNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9ydDU2NTEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY1MS5jCkBAIC0xNzEyLDEyICsxNzEyLDE0IEBACiAJLnJlc3VtZSA9IHJ0NTY1MV9yZXN1bWUsCiAJLnNldF9iaWFzX2xldmVsID0gcnQ1NjUxX3NldF9iaWFzX2xldmVsLAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKLQkuY29udHJvbHMgPSBydDU2NTFfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHJ0NTY1MV9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBydDU2NTFfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShydDU2NTFfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBydDU2NTFfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUocnQ1NjUxX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHJ0NTY1MV9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShydDU2NTFfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBydDU2NTFfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUocnQ1NjUxX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBydDU2NTFfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHJ0NTY1MV9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBydDU2NTFfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDU2NTkuYyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjU5LmMKaW5kZXggMWIzMDkxNC4uZGI1NDU1MCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9ydDU2NTkuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY1OS5jCkBAIC05LDYgKzksNyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMzU2NSw3ICszNTY2LDkgQEAKIHN0YXRpYyBpbnQgcnQ1NjU5X3NldF9iaWFzX2xldmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKIAkJCWVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQogeworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpOwogCXN0cnVjdCBydDU2NTlfcHJpdiAqcnQ1NjU5ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHJldDsKIAogCXN3aXRjaCAobGV2ZWwpIHsKIAljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgpAQCAtMzU4Miw2ICszNTg1LDE3IEBACiAJCQlSVDU2NTlfUFdSX0ZWMSB8IFJUNTY1OV9QV1JfRlYyKTsKIAkJYnJlYWs7CiAKKwljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgorCQlpZiAoZGFwbS0+Ymlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CisJCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocnQ1NjU5LT5tY2xrKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkJCSJmYWlsZWQgdG8gZW5hYmxlIE1DTEs6ICVkXG4iLCByZXQpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKIAljYXNlIFNORF9TT0NfQklBU19PRkY6CiAJCXJlZ21hcF91cGRhdGVfYml0cyhydDU2NTktPnJlZ21hcCwgUlQ1NjU5X1BXUl9ESUdfMSwKIAkJCVJUNTY1OV9QV1JfTERPLCAwKTsKQEAgLTM1OTEsNiArMzYwNSw3IEBACiAJCQlSVDU2NTlfUFdSX01CIHwgUlQ1NjU5X1BXUl9WUkVGMik7CiAJCXJlZ21hcF91cGRhdGVfYml0cyhydDU2NTktPnJlZ21hcCwgUlQ1NjU5X0RJR19NSVNDLAogCQkJUlQ1NjU5X0RJR19HQVRFX0NUUkwsIDApOworCQljbGtfZGlzYWJsZV91bnByZXBhcmUocnQ1NjU5LT5tY2xrKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMzcyMiwxMiArMzczNywxNCBAQAogCS5yZXN1bWUgPSBydDU2NTlfcmVzdW1lLAogCS5zZXRfYmlhc19sZXZlbCA9IHJ0NTY1OV9zZXRfYmlhc19sZXZlbCwKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCi0JLmNvbnRyb2xzID0gcnQ1NjU5X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShydDU2NTlfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gcnQ1NjU5X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUocnQ1NjU5X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gcnQ1NjU5X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHJ0NTY1OV9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBydDU2NTlfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUocnQ1NjU5X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gcnQ1NjU5X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHJ0NTY1OV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gcnQ1NjU5X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShydDU2NTlfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiAKQEAgLTQwMjAsNiArNDAzNywxNSBAQAogCiAJcmVnbWFwX3dyaXRlKHJ0NTY1OS0+cmVnbWFwLCBSVDU2NTlfUkVTRVQsIDApOwogCisJLyogQ2hlY2sgaWYgTUNMSyBwcm92aWRlZCAqLworCXJ0NTY1OS0+bWNsayA9IGRldm1fY2xrX2dldCgmaTJjLT5kZXYsICJtY2xrIik7CisJaWYgKElTX0VSUihydDU2NTktPm1jbGspKSB7CisJCWlmIChQVFJfRVJSKHJ0NTY1OS0+bWNsaykgIT0gLUVOT0VOVCkKKwkJCXJldHVybiBQVFJfRVJSKHJ0NTY1OS0+bWNsayk7CisJCS8qIE90aGVyd2lzZSBtYXJrIHRoZSBtY2xrIHBvaW50ZXIgdG8gTlVMTCAqLworCQlydDU2NTktPm1jbGsgPSBOVUxMOworCX0KKwogCXJ0NTY1OV9jYWxpYnJhdGUocnQ1NjU5KTsKIAogCS8qIGxpbmUgaW4gZGlmZiBtb2RlKi8KQEAgLTQxNjMsNiArNDE4OSw5IEBACiAJCWlmIChyZXQpCiAJCQlkZXZfZXJyKCZpMmMtPmRldiwgIkZhaWxlZCB0byByZWd1ZXN0IElSUTogJWRcbiIsIHJldCk7CiAKKwkJLyogRW5hYmxlIElSUSBvdXRwdXQgZm9yIEdQSU8xIHBpbiBhbnkgd2F5ICovCisJCXJlZ21hcF91cGRhdGVfYml0cyhydDU2NTktPnJlZ21hcCwgUlQ1NjU5X0dQSU9fQ1RSTF8xLAorCQkJCSAgIFJUNTY1OV9HUDFfUElOX01BU0ssIFJUNTY1OV9HUDFfUElOX0lSUSk7CiAJfQogCiAJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LCAmc29jX2NvZGVjX2Rldl9ydDU2NTksCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3J0NTY1OS5oIGIvc291bmQvc29jL2NvZGVjcy9ydDU2NTkuaAppbmRleCBkMzFjOWU1Li44ZjFhZWVmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3J0NTY1OS5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjU5LmgKQEAgLTE4MCw5ICsxODAsOSBAQAogI2RlZmluZSBSVDU2NTlfSVJRX0NUUkxfMQkJCTB4MDBiNgogI2RlZmluZSBSVDU2NTlfSVJRX0NUUkxfMgkJCTB4MDBiNwogI2RlZmluZSBSVDU2NTlfSVJRX0NUUkxfMwkJCTB4MDBiOAotI2RlZmluZSBSVDU2NTlfSVJRX0NUUkxfNAkJCTB4MDBiOQotI2RlZmluZSBSVDU2NTlfSVJRX0NUUkxfNQkJCTB4MDBiYQotI2RlZmluZSBSVDU2NTlfSVJRX0NUUkxfNgkJCTB4MDBiYgorI2RlZmluZSBSVDU2NTlfSVJRX0NUUkxfNAkJCTB4MDBiYQorI2RlZmluZSBSVDU2NTlfSVJRX0NUUkxfNQkJCTB4MDBiYgorI2RlZmluZSBSVDU2NTlfSVJRX0NUUkxfNgkJCTB4MDBiYwogI2RlZmluZSBSVDU2NTlfSU5UX1NUXzEJCQkJMHgwMGJlCiAjZGVmaW5lIFJUNTY1OV9JTlRfU1RfMgkJCQkweDAwYmYKICNkZWZpbmUgUlQ1NjU5X0dQSU9fQ1RSTF8xCQkJMHgwMGMwCkBAIC0xNzk2LDYgKzE3OTYsNyBAQAogCXN0cnVjdCBncGlvX2Rlc2MgKmdwaW9kX3Jlc2V0OwogCXN0cnVjdCBzbmRfc29jX2phY2sgKmhzX2phY2s7CiAJc3RydWN0IGRlbGF5ZWRfd29yayBqYWNrX2RldGVjdF93b3JrOworCXN0cnVjdCBjbGsgKm1jbGs7CiAKIAlpbnQgc3lzY2xrOwogCWludCBzeXNjbGtfc3JjOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDU2NjAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjYwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwOTMzYwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjYwLmMKQEAgLTAsMCArMSwxMzUzIEBACisvKgorICogcnQ1NjYwLmMgIC0tICBSVDU2NjAgQUxTQSBTb0MgYXVkaW8gY29kZWMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTYgUmVhbHRlayBTZW1pY29uZHVjdG9yIENvcnAuCisgKiBBdXRob3I6IE9kZXIgQ2hpb3UgPG9kZXJfY2hpb3VAcmVhbHRlay5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisKKyNpbmNsdWRlICJybDYyMzEuaCIKKyNpbmNsdWRlICJydDU2NjAuaCIKKworI2RlZmluZSBSVDU2NjBfREVWSUNFX0lEIDB4NjMzOAorCisjZGVmaW5lIFJUNTY2MF9QUl9SQU5HRV9CQVNFICgweGZmICsgMSkKKyNkZWZpbmUgUlQ1NjYwX1BSX1NQQUNJTkcgMHgxMDAKKworI2RlZmluZSBSVDU2NjBfUFJfQkFTRSAoUlQ1NjYwX1BSX1JBTkdFX0JBU0UgKyAoMCAqIFJUNTY2MF9QUl9TUEFDSU5HKSkKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfcmFuZ2VfY2ZnIHJ0NTY2MF9yYW5nZXNbXSA9IHsKKwl7IC5uYW1lID0gIlBSIiwgLnJhbmdlX21pbiA9IFJUNTY2MF9QUl9CQVNFLAorCSAgLnJhbmdlX21heCA9IFJUNTY2MF9QUl9CQVNFICsgMHhmMywKKwkgIC5zZWxlY3Rvcl9yZWcgPSBSVDU2NjBfUFJJVl9JTkRFWCwKKwkgIC5zZWxlY3Rvcl9tYXNrID0gMHhmZiwKKwkgIC5zZWxlY3Rvcl9zaGlmdCA9IDB4MCwKKwkgIC53aW5kb3dfc3RhcnQgPSBSVDU2NjBfUFJJVl9EQVRBLAorCSAgLndpbmRvd19sZW4gPSAweDEsIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19zZXF1ZW5jZSBydDU2NjBfcGF0Y2hbXSA9IHsKKwl7IFJUNTY2MF9BTENfUEdBX0NUUkwyLAkJMHg0NGMzIH0sCisJeyBSVDU2NjBfUFJfQkFTRSArIDB4M2QsCTB4MjYwMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCBydDU2NjBfcmVnW10gPSB7CisJeyAweDAwLCAweDAwMDAgfSwKKwl7IDB4MDEsIDB4YzgwMCB9LAorCXsgMHgwMiwgMHhjOGM4IH0sCisJeyAweDBkLCAweDEwMTAgfSwKKwl7IDB4MGUsIDB4MTAxMCB9LAorCXsgMHgxOSwgMHhhZmFmIH0sCisJeyAweDFjLCAweDJmMmYgfSwKKwl7IDB4MWUsIDB4MDAwMCB9LAorCXsgMHgyNywgMHg2MDYwIH0sCisJeyAweDI5LCAweDgwODAgfSwKKwl7IDB4MmEsIDB4NDI0MiB9LAorCXsgMHgyZiwgMHgwMDAwIH0sCisJeyAweDNiLCAweDAwMDAgfSwKKwl7IDB4M2MsIDB4MDA3ZiB9LAorCXsgMHgzZCwgMHgwMDAwIH0sCisJeyAweDNlLCAweDAwN2YgfSwKKwl7IDB4NDUsIDB4ZTAwMCB9LAorCXsgMHg0NiwgMHgwMDNlIH0sCisJeyAweDQ4LCAweGY4MDAgfSwKKwl7IDB4NGEsIDB4MDAwNCB9LAorCXsgMHg0ZCwgMHgwMDAwIH0sCisJeyAweDRlLCAweDAwMDAgfSwKKwl7IDB4NGYsIDB4MDFmZiB9LAorCXsgMHg1MCwgMHgwMDAwIH0sCisJeyAweDUxLCAweDAwMDAgfSwKKwl7IDB4NTIsIDB4MDFmZiB9LAorCXsgMHg2MSwgMHgwMDAwIH0sCisJeyAweDYyLCAweDAwMDAgfSwKKwl7IDB4NjMsIDB4MDBjMCB9LAorCXsgMHg2NCwgMHgwMDAwIH0sCisJeyAweDY1LCAweDAwMDAgfSwKKwl7IDB4NjYsIDB4MDAwMCB9LAorCXsgMHg3MCwgMHg4MDAwIH0sCisJeyAweDczLCAweDcwMDAgfSwKKwl7IDB4NzQsIDB4M2MwMCB9LAorCXsgMHg3NSwgMHgyODAwIH0sCisJeyAweDgwLCAweDAwMDAgfSwKKwl7IDB4ODEsIDB4MDAwMCB9LAorCXsgMHg4MiwgMHgwMDAwIH0sCisJeyAweDhjLCAweDAyMjggfSwKKwl7IDB4OGQsIDB4YTAwMCB9LAorCXsgMHg4ZSwgMHgwMDAwIH0sCisJeyAweDkyLCAweDAwMDAgfSwKKwl7IDB4OTMsIDB4MzAwMCB9LAorCXsgMHhhMSwgMHgwMDU5IH0sCisJeyAweGEyLCAweDAwMDEgfSwKKwl7IDB4YTMsIDB4NWM4MCB9LAorCXsgMHhhNCwgMHgwMTQ2IH0sCisJeyAweGE1LCAweDFmMWYgfSwKKwl7IDB4YTYsIDB4NzhjNiB9LAorCXsgMHhhNywgMHhlNWVjIH0sCisJeyAweGE4LCAweGJhNjEgfSwKKwl7IDB4YTksIDB4M2M3OCB9LAorCXsgMHhhYSwgMHg4YWUyIH0sCisJeyAweGFiLCAweGU1ZWMgfSwKKwl7IDB4YWMsIDB4YzYwMCB9LAorCXsgMHhhZCwgMHhiYTYxIH0sCisJeyAweGFlLCAweDE3ZWQgfSwKKwl7IDB4YjAsIDB4MjA4MCB9LAorCXsgMHhiMSwgMHgwMDAwIH0sCisJeyAweGIzLCAweDAwMWYgfSwKKwl7IDB4YjQsIDB4MDIwYyB9LAorCXsgMHhiNSwgMHgxZjAwIH0sCisJeyAweGI2LCAweDAwMDAgfSwKKwl7IDB4YjcsIDB4NDAwMCB9LAorCXsgMHhiYiwgMHgwMDAwIH0sCisJeyAweGJkLCAweDAwMDAgfSwKKwl7IDB4YmUsIDB4MDAwMCB9LAorCXsgMHhiZiwgMHgwMTAwIH0sCisJeyAweGMwLCAweDAwMDAgfSwKKwl7IDB4YzIsIDB4MDAwMCB9LAorCXsgMHhkMywgMHhhMjIwIH0sCisJeyAweGQ5LCAweDA4MDkgfSwKKwl7IDB4ZGEsIDB4MDAwMCB9LAorCXsgMHhlMCwgMHg4MDAwIH0sCisJeyAweGUxLCAweDAyMDAgfSwKKwl7IDB4ZTIsIDB4ODAwMCB9LAorCXsgMHhlMywgMHgwMjAwIH0sCisJeyAweGU0LCAweDBmMjAgfSwKKwl7IDB4ZTUsIDB4MDAxZiB9LAorCXsgMHhlNiwgMHgwMjBjIH0sCisJeyAweGU3LCAweDFmMDAgfSwKKwl7IDB4ZTgsIDB4MDAwMCB9LAorCXsgMHhlOSwgMHg0MDAwIH0sCisJeyAweGVhLCAweDAwYTYgfSwKKwl7IDB4ZWIsIDB4MDRjMyB9LAorCXsgMHhlYywgMHgyN2M4IH0sCisJeyAweGVkLCAweDc0MTggfSwKKwl7IDB4ZWUsIDB4YmY1MCB9LAorCXsgMHhlZiwgMHgwMDQ1IH0sCisJeyAweGYwLCAweDAwMDcgfSwKKwl7IDB4ZmEsIDB4MDAwMCB9LAorCXsgMHhmZCwgMHgwMDAwIH0sCisJeyAweGZlLCAweDEwZWMgfSwKKwl7IDB4ZmYsIDB4NjMzOCB9LAorfTsKKworc3RhdGljIGJvb2wgcnQ1NjYwX3ZvbGF0aWxlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJ0NTY2MF9yYW5nZXMpOyBpKyspCisJCWlmICgocmVnID49IHJ0NTY2MF9yYW5nZXNbaV0ud2luZG93X3N0YXJ0ICYmCisJCSAgICAgcmVnIDw9IHJ0NTY2MF9yYW5nZXNbaV0ud2luZG93X3N0YXJ0ICsKKwkJICAgICBydDU2NjBfcmFuZ2VzW2ldLndpbmRvd19sZW4pIHx8CisJCSAgICAocmVnID49IHJ0NTY2MF9yYW5nZXNbaV0ucmFuZ2VfbWluICYmCisJCSAgICAgcmVnIDw9IHJ0NTY2MF9yYW5nZXNbaV0ucmFuZ2VfbWF4KSkKKwkJCXJldHVybiB0cnVlOworCisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFJUNTY2MF9SRVNFVDoKKwljYXNlIFJUNTY2MF9QUklWX0RBVEE6CisJY2FzZSBSVDU2NjBfRVFfQ1RSTDE6CisJY2FzZSBSVDU2NjBfSVJRX0NUUkwyOgorCWNhc2UgUlQ1NjYwX0lOVF9JUlFfU1Q6CisJY2FzZSBSVDU2NjBfVkVORE9SX0lEOgorCWNhc2UgUlQ1NjYwX1ZFTkRPUl9JRDE6CisJY2FzZSBSVDU2NjBfVkVORE9SX0lEMjoKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworc3RhdGljIGJvb2wgcnQ1NjYwX3JlYWRhYmxlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJ0NTY2MF9yYW5nZXMpOyBpKyspCisJCWlmICgocmVnID49IHJ0NTY2MF9yYW5nZXNbaV0ud2luZG93X3N0YXJ0ICYmCisJCSAgICAgcmVnIDw9IHJ0NTY2MF9yYW5nZXNbaV0ud2luZG93X3N0YXJ0ICsKKwkJICAgICBydDU2NjBfcmFuZ2VzW2ldLndpbmRvd19sZW4pIHx8CisJCSAgICAocmVnID49IHJ0NTY2MF9yYW5nZXNbaV0ucmFuZ2VfbWluICYmCisJCSAgICAgcmVnIDw9IHJ0NTY2MF9yYW5nZXNbaV0ucmFuZ2VfbWF4KSkKKwkJCXJldHVybiB0cnVlOworCisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFJUNTY2MF9SRVNFVDoKKwljYXNlIFJUNTY2MF9TUEtfVk9MOgorCWNhc2UgUlQ1NjYwX0xPVVRfVk9MOgorCWNhc2UgUlQ1NjYwX0lOMV9JTjI6CisJY2FzZSBSVDU2NjBfSU4zX0lONDoKKwljYXNlIFJUNTY2MF9EQUMxX0RJR19WT0w6CisJY2FzZSBSVDU2NjBfU1RPMV9BRENfRElHX1ZPTDoKKwljYXNlIFJUNTY2MF9BRENfQlNUX1ZPTDE6CisJY2FzZSBSVDU2NjBfU1RPMV9BRENfTUlYRVI6CisJY2FzZSBSVDU2NjBfQURfREFfTUlYRVI6CisJY2FzZSBSVDU2NjBfU1RPX0RBQ19NSVhFUjoKKwljYXNlIFJUNTY2MF9ESUdfSU5GMV9EQVRBOgorCWNhc2UgUlQ1NjYwX1JFQ19MMV9NSVhFUjoKKwljYXNlIFJUNTY2MF9SRUNfTDJfTUlYRVI6CisJY2FzZSBSVDU2NjBfUkVDX1IxX01JWEVSOgorCWNhc2UgUlQ1NjYwX1JFQ19SMl9NSVhFUjoKKwljYXNlIFJUNTY2MF9MT1VUX01JWEVSOgorCWNhc2UgUlQ1NjYwX1NQS19NSVhFUjoKKwljYXNlIFJUNTY2MF9TUE9fTUlYRVI6CisJY2FzZSBSVDU2NjBfU1BPX0NMU0RfUkFUSU86CisJY2FzZSBSVDU2NjBfT1VUX0xfR0FJTjE6CisJY2FzZSBSVDU2NjBfT1VUX0xfR0FJTjI6CisJY2FzZSBSVDU2NjBfT1VUX0wxX01JWEVSOgorCWNhc2UgUlQ1NjYwX09VVF9SX0dBSU4xOgorCWNhc2UgUlQ1NjYwX09VVF9SX0dBSU4yOgorCWNhc2UgUlQ1NjYwX09VVF9SMV9NSVhFUjoKKwljYXNlIFJUNTY2MF9QV1JfRElHMToKKwljYXNlIFJUNTY2MF9QV1JfRElHMjoKKwljYXNlIFJUNTY2MF9QV1JfQU5MRzE6CisJY2FzZSBSVDU2NjBfUFdSX0FOTEcyOgorCWNhc2UgUlQ1NjYwX1BXUl9NSVhFUjoKKwljYXNlIFJUNTY2MF9QV1JfVk9MOgorCWNhc2UgUlQ1NjYwX1BSSVZfSU5ERVg6CisJY2FzZSBSVDU2NjBfUFJJVl9EQVRBOgorCWNhc2UgUlQ1NjYwX0kyUzFfU0RQOgorCWNhc2UgUlQ1NjYwX0FEREFfQ0xLMToKKwljYXNlIFJUNTY2MF9BRERBX0NMSzI6CisJY2FzZSBSVDU2NjBfRE1JQ19DVFJMMToKKwljYXNlIFJUNTY2MF9HTEJfQ0xLOgorCWNhc2UgUlQ1NjYwX1BMTF9DVFJMMToKKwljYXNlIFJUNTY2MF9QTExfQ1RSTDI6CisJY2FzZSBSVDU2NjBfQ0xTRF9BTVBfT0NfQ1RSTDoKKwljYXNlIFJUNTY2MF9DTFNEX0FNUF9DVFJMOgorCWNhc2UgUlQ1NjYwX0xPVVRfQU1QX0NUUkw6CisJY2FzZSBSVDU2NjBfU1BLX0FNUF9TUEtWREQ6CisJY2FzZSBSVDU2NjBfTUlDQklBUzoKKwljYXNlIFJUNTY2MF9DTFNEX09VVF9DVFJMMToKKwljYXNlIFJUNTY2MF9DTFNEX09VVF9DVFJMMjoKKwljYXNlIFJUNTY2MF9ESVBPTEVfTUlDX0NUUkwxOgorCWNhc2UgUlQ1NjYwX0RJUE9MRV9NSUNfQ1RSTDI6CisJY2FzZSBSVDU2NjBfRElQT0xFX01JQ19DVFJMMzoKKwljYXNlIFJUNTY2MF9ESVBPTEVfTUlDX0NUUkw0OgorCWNhc2UgUlQ1NjYwX0RJUE9MRV9NSUNfQ1RSTDU6CisJY2FzZSBSVDU2NjBfRElQT0xFX01JQ19DVFJMNjoKKwljYXNlIFJUNTY2MF9ESVBPTEVfTUlDX0NUUkw3OgorCWNhc2UgUlQ1NjYwX0RJUE9MRV9NSUNfQ1RSTDg6CisJY2FzZSBSVDU2NjBfRElQT0xFX01JQ19DVFJMOToKKwljYXNlIFJUNTY2MF9ESVBPTEVfTUlDX0NUUkwxMDoKKwljYXNlIFJUNTY2MF9ESVBPTEVfTUlDX0NUUkwxMToKKwljYXNlIFJUNTY2MF9ESVBPTEVfTUlDX0NUUkwxMjoKKwljYXNlIFJUNTY2MF9FUV9DVFJMMToKKwljYXNlIFJUNTY2MF9FUV9DVFJMMjoKKwljYXNlIFJUNTY2MF9EUkNfQUdDX0NUUkwxOgorCWNhc2UgUlQ1NjYwX0RSQ19BR0NfQ1RSTDI6CisJY2FzZSBSVDU2NjBfRFJDX0FHQ19DVFJMMzoKKwljYXNlIFJUNTY2MF9EUkNfQUdDX0NUUkw0OgorCWNhc2UgUlQ1NjYwX0RSQ19BR0NfQ1RSTDU6CisJY2FzZSBSVDU2NjBfSkRfQ1RSTDoKKwljYXNlIFJUNTY2MF9JUlFfQ1RSTDE6CisJY2FzZSBSVDU2NjBfSVJRX0NUUkwyOgorCWNhc2UgUlQ1NjYwX0lOVF9JUlFfU1Q6CisJY2FzZSBSVDU2NjBfR1BJT19DVFJMMToKKwljYXNlIFJUNTY2MF9HUElPX0NUUkwyOgorCWNhc2UgUlQ1NjYwX1dJTkRfRklMVEVSX0NUUkwxOgorCWNhc2UgUlQ1NjYwX1NWX1pDRDE6CisJY2FzZSBSVDU2NjBfU1ZfWkNEMjoKKwljYXNlIFJUNTY2MF9EUkMxX0xNX0NUUkwxOgorCWNhc2UgUlQ1NjYwX0RSQzFfTE1fQ1RSTDI6CisJY2FzZSBSVDU2NjBfRFJDMl9MTV9DVFJMMToKKwljYXNlIFJUNTY2MF9EUkMyX0xNX0NUUkwyOgorCWNhc2UgUlQ1NjYwX01VTFRJX0RSQ19DVFJMOgorCWNhc2UgUlQ1NjYwX0RSQzJfQ1RSTDE6CisJY2FzZSBSVDU2NjBfRFJDMl9DVFJMMjoKKwljYXNlIFJUNTY2MF9EUkMyX0NUUkwzOgorCWNhc2UgUlQ1NjYwX0RSQzJfQ1RSTDQ6CisJY2FzZSBSVDU2NjBfRFJDMl9DVFJMNToKKwljYXNlIFJUNTY2MF9BTENfUEdBX0NUUkwxOgorCWNhc2UgUlQ1NjYwX0FMQ19QR0FfQ1RSTDI6CisJY2FzZSBSVDU2NjBfQUxDX1BHQV9DVFJMMzoKKwljYXNlIFJUNTY2MF9BTENfUEdBX0NUUkw0OgorCWNhc2UgUlQ1NjYwX0FMQ19QR0FfQ1RSTDU6CisJY2FzZSBSVDU2NjBfQUxDX1BHQV9DVFJMNjoKKwljYXNlIFJUNTY2MF9BTENfUEdBX0NUUkw3OgorCWNhc2UgUlQ1NjYwX0dFTl9DVFJMMToKKwljYXNlIFJUNTY2MF9HRU5fQ1RSTDI6CisJY2FzZSBSVDU2NjBfR0VOX0NUUkwzOgorCWNhc2UgUlQ1NjYwX1ZFTkRPUl9JRDoKKwljYXNlIFJUNTY2MF9WRU5ET1JfSUQxOgorCWNhc2UgUlQ1NjYwX1ZFTkRPUl9JRDI6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShydDU2NjBfb3V0X3ZvbF90bHYsIC00NjUwLCAxNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKHJ0NTY2MF9kYWNfdm9sX3RsdiwgLTY1MjUsIDc1LCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShydDU2NjBfYWRjX3ZvbF90bHYsIC0xNzI1LCA3NSwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUocnQ1NjYwX2FkY19ic3RfdGx2LCAwLCAxMjAwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShydDU2NjBfYnN0X3RsdiwgLTEyMDAsIDc1LCAwKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2MF9zbmRfY29udHJvbHNbXSA9IHsKKwkvKiBTcGVha2VyIE91dHB1dCBWb2x1bWUgKi8KKwlTT0NfU0lOR0xFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIFJUNTY2MF9TUEtfVk9MLCBSVDU2NjBfTF9NVVRFX1NGVCwKKwkJMSwgMSksCisJU09DX1NJTkdMRV9UTFYoIlNwZWFrZXIgUGxheWJhY2sgVm9sdW1lIiwgUlQ1NjYwX1NQS19WT0wsCisJCVJUNTY2MF9MX1ZPTF9TRlQsIDM5LCAxLCBydDU2NjBfb3V0X3ZvbF90bHYpLAorCisJLyogT1VUUFVUIENvbnRyb2wgKi8KKwlTT0NfRE9VQkxFKCJPVVQgUGxheWJhY2sgU3dpdGNoIiwgUlQ1NjYwX0xPVVRfVk9MLCBSVDU2NjBfTF9NVVRFX1NGVCwKKwkJUlQ1NjYwX1JfTVVURV9TRlQsIDEsIDEpLAorCVNPQ19ET1VCTEVfVExWKCJPVVQgUGxheWJhY2sgVm9sdW1lIiwgUlQ1NjYwX0xPVVRfVk9MLCBSVDU2NjBfTF9WT0xfU0ZULAorCQlSVDU2NjBfUl9WT0xfU0ZULCAzOSwgMSwgcnQ1NjYwX291dF92b2xfdGx2KSwKKworCS8qIERBQyBEaWdpdGFsIFZvbHVtZSAqLworCVNPQ19ET1VCTEVfVExWKCJEQUMxIFBsYXliYWNrIFZvbHVtZSIsIFJUNTY2MF9EQUMxX0RJR19WT0wsCisJCVJUNTY2MF9EQUNfTDFfVk9MX1NGVCwgUlQ1NjYwX0RBQ19SMV9WT0xfU0ZULCA4NywgMCwKKwkJcnQ1NjYwX2RhY192b2xfdGx2KSwKKworCS8qIElOMS9JTjIvSU4zIENvbnRyb2wgKi8KKwlTT0NfU0lOR0xFX1RMVigiSU4xIEJvb3N0IFZvbHVtZSIsIFJUNTY2MF9JTjFfSU4yLCBSVDU2NjBfQlNUX1NGVDEsIDY5LAorCQkwLCBydDU2NjBfYnN0X3RsdiksCisJU09DX1NJTkdMRV9UTFYoIklOMiBCb29zdCBWb2x1bWUiLCBSVDU2NjBfSU4xX0lOMiwgUlQ1NjYwX0JTVF9TRlQyLCA2OSwKKwkJMCwgcnQ1NjYwX2JzdF90bHYpLAorCVNPQ19TSU5HTEVfVExWKCJJTjMgQm9vc3QgVm9sdW1lIiwgUlQ1NjYwX0lOM19JTjQsIFJUNTY2MF9CU1RfU0ZUMywgNjksCisJCTAsIHJ0NTY2MF9ic3RfdGx2KSwKKworCS8qIEFEQyBEaWdpdGFsIFZvbHVtZSBDb250cm9sICovCisJU09DX0RPVUJMRSgiQURDIENhcHR1cmUgU3dpdGNoIiwgUlQ1NjYwX1NUTzFfQURDX0RJR19WT0wsCisJCVJUNTY2MF9MX01VVEVfU0ZULCBSVDU2NjBfUl9NVVRFX1NGVCwgMSwgMSksCisJU09DX0RPVUJMRV9UTFYoIkFEQyBDYXB0dXJlIFZvbHVtZSIsIFJUNTY2MF9TVE8xX0FEQ19ESUdfVk9MLAorCQlSVDU2NjBfQURDX0xfVk9MX1NGVCwgUlQ1NjYwX0FEQ19SX1ZPTF9TRlQsIDYzLCAwLAorCQlydDU2NjBfYWRjX3ZvbF90bHYpLAorCisJLyogQURDIEJvb3N0IFZvbHVtZSBDb250cm9sICovCisJU09DX0RPVUJMRV9UTFYoIlNUTzEgQURDIEJvb3N0IEdhaW4gVm9sdW1lIiwgUlQ1NjYwX0FEQ19CU1RfVk9MMSwKKwkJUlQ1NjYwX1NUTzFfQURDX0xfQlNUX1NGVCwgUlQ1NjYwX1NUTzFfQURDX1JfQlNUX1NGVCwgMywgMCwKKwkJcnQ1NjYwX2FkY19ic3RfdGx2KSwKK307CisKKy8qKgorICogcnQ1NjYwX3NldF9kbWljX2NsayAtIFNldCBwYXJhbWV0ZXIgb2YgZG1pYy4KKyAqCisgKiBAdzogREFQTSB3aWRnZXQuCisgKiBAa2NvbnRyb2w6IFRoZSBrY29udHJvbCBvZiB0aGlzIHdpZGdldC4KKyAqIEBldmVudDogRXZlbnQgaWQuCisgKgorICovCitzdGF0aWMgaW50IHJ0NTY2MF9zZXRfZG1pY19jbGsoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHJ0NTY2MF9wcml2ICpydDU2NjAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgaWR4LCByYXRlOworCisJcmF0ZSA9IHJ0NTY2MC0+c3lzY2xrIC8gcmw2MjMxX2dldF9wcmVfZGl2KHJ0NTY2MC0+cmVnbWFwLAorCQlSVDU2NjBfQUREQV9DTEsxLCBSVDU2NjBfSTJTX1BEMV9TRlQpOworCWlkeCA9IHJsNjIzMV9jYWxjX2RtaWNfY2xrKHJhdGUpOworCWlmIChpZHggPCAwKQorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gc2V0IERNSUMgY2xvY2tcbiIpOworCWVsc2UKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYwX0RNSUNfQ1RSTDEsCisJCQlSVDU2NjBfRE1JQ19DTEtfTUFTSywgaWR4IDw8IFJUNTY2MF9ETUlDX0NMS19TRlQpOworCisJcmV0dXJuIGlkeDsKK30KKworc3RhdGljIGludCBydDU2NjBfaXNfc3lzX2Nsa19mcm9tX3BsbChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc291cmNlLAorCQkJIHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpzaW5rKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyhzb3VyY2UtPmRhcG0pOworCXVuc2lnbmVkIGludCB2YWw7CisKKwl2YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIFJUNTY2MF9HTEJfQ0xLKTsKKwl2YWwgJj0gUlQ1NjYwX1NDTEtfU1JDX01BU0s7CisJaWYgKHZhbCA9PSBSVDU2NjBfU0NMS19TUkNfUExMMSkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworLyogRGlnaXRhbCBNaXhlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2MF9zdG8xX2FkY19sX21peFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiQURDMSBTd2l0Y2giLCBSVDU2NjBfU1RPMV9BRENfTUlYRVIsCisJCQlSVDU2NjBfTV9BRENfTDFfU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkFEQzIgU3dpdGNoIiwgUlQ1NjYwX1NUTzFfQURDX01JWEVSLAorCQkJUlQ1NjYwX01fQURDX0wyX1NGVCwgMSwgMSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjYwX3N0bzFfYWRjX3JfbWl4W10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJBREMxIFN3aXRjaCIsIFJUNTY2MF9TVE8xX0FEQ19NSVhFUiwKKwkJCVJUNTY2MF9NX0FEQ19SMV9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiQURDMiBTd2l0Y2giLCBSVDU2NjBfU1RPMV9BRENfTUlYRVIsCisJCQlSVDU2NjBfTV9BRENfUjJfU0ZULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjBfZGFjX2xfbWl4W10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJTdGVyZW8gQURDIFN3aXRjaCIsIFJUNTY2MF9BRF9EQV9NSVhFUiwKKwkJCVJUNTY2MF9NX0FEQ01JWF9MX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJEQUMxIFN3aXRjaCIsIFJUNTY2MF9BRF9EQV9NSVhFUiwKKwkJCVJUNTY2MF9NX0RBQzFfTF9TRlQsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2MF9kYWNfcl9taXhbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIlN0ZXJlbyBBREMgU3dpdGNoIiwgUlQ1NjYwX0FEX0RBX01JWEVSLAorCQkJUlQ1NjYwX01fQURDTUlYX1JfU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkRBQzEgU3dpdGNoIiwgUlQ1NjYwX0FEX0RBX01JWEVSLAorCQkJUlQ1NjYwX01fREFDMV9SX1NGVCwgMSwgMSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjYwX3N0b19kYWNfbF9taXhbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkRBQyBMMSBTd2l0Y2giLCBSVDU2NjBfU1RPX0RBQ19NSVhFUiwKKwkJCVJUNTY2MF9NX0RBQ19MMV9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiREFDIFIxIFN3aXRjaCIsIFJUNTY2MF9TVE9fREFDX01JWEVSLAorCQkJUlQ1NjYwX01fREFDX1IxX1NUT19MX1NGVCwgMSwgMSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjYwX3N0b19kYWNfcl9taXhbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkRBQyBSMSBTd2l0Y2giLCBSVDU2NjBfU1RPX0RBQ19NSVhFUiwKKwkJCVJUNTY2MF9NX0RBQ19SMV9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiREFDIEwxIFN3aXRjaCIsIFJUNTY2MF9TVE9fREFDX01JWEVSLAorCQkJUlQ1NjYwX01fREFDX0wxX1NUT19SX1NGVCwgMSwgMSksCit9OworCisvKiBBbmFsb2cgSW5wdXQgTWl4ZXIgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjBfcmVjX2xfbWl4W10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJCU1QzIFN3aXRjaCIsIFJUNTY2MF9SRUNfTDJfTUlYRVIsCisJCQlSVDU2NjBfTV9CU1QzX1JNX0xfU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkJTVDIgU3dpdGNoIiwgUlQ1NjYwX1JFQ19MMl9NSVhFUiwKKwkJCVJUNTY2MF9NX0JTVDJfUk1fTF9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiQlNUMSBTd2l0Y2giLCBSVDU2NjBfUkVDX0wyX01JWEVSLAorCQkJUlQ1NjYwX01fQlNUMV9STV9MX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJPVVQgTUlYTCBTd2l0Y2giLCBSVDU2NjBfUkVDX0wyX01JWEVSLAorCQkJUlQ1NjYwX01fT01fTF9STV9MX1NGVCwgMSwgMSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjYwX3JlY19yX21peFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiQlNUMyBTd2l0Y2giLCBSVDU2NjBfUkVDX1IyX01JWEVSLAorCQkJUlQ1NjYwX01fQlNUM19STV9SX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJCU1QyIFN3aXRjaCIsIFJUNTY2MF9SRUNfUjJfTUlYRVIsCisJCQlSVDU2NjBfTV9CU1QyX1JNX1JfU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkJTVDEgU3dpdGNoIiwgUlQ1NjYwX1JFQ19SMl9NSVhFUiwKKwkJCVJUNTY2MF9NX0JTVDFfUk1fUl9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiT1VUIE1JWFIgU3dpdGNoIiwgUlQ1NjYwX1JFQ19SMl9NSVhFUiwKKwkJCVJUNTY2MF9NX09NX1JfUk1fUl9TRlQsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2MF9zcGtfbWl4W10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJCU1QzIFN3aXRjaCIsIFJUNTY2MF9TUEtfTUlYRVIsCisJCQlSVDU2NjBfTV9CU1QzX1NNX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJCU1QxIFN3aXRjaCIsIFJUNTY2MF9TUEtfTUlYRVIsCisJCQlSVDU2NjBfTV9CU1QxX1NNX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJEQUNMIFN3aXRjaCIsIFJUNTY2MF9TUEtfTUlYRVIsCisJCQlSVDU2NjBfTV9EQUNMX1NNX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJEQUNSIFN3aXRjaCIsIFJUNTY2MF9TUEtfTUlYRVIsCisJCQlSVDU2NjBfTV9EQUNSX1NNX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJPVVRNSVhMIFN3aXRjaCIsIFJUNTY2MF9TUEtfTUlYRVIsCisJCQlSVDU2NjBfTV9PTV9MX1NNX1NGVCwgMSwgMSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjYwX291dF9sX21peFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiQlNUMyBTd2l0Y2giLCBSVDU2NjBfT1VUX0wxX01JWEVSLAorCQkJUlQ1NjYwX01fQlNUM19PTV9MX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJCU1QyIFN3aXRjaCIsIFJUNTY2MF9PVVRfTDFfTUlYRVIsCisJCQlSVDU2NjBfTV9CU1QyX09NX0xfU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkJTVDEgU3dpdGNoIiwgUlQ1NjYwX09VVF9MMV9NSVhFUiwKKwkJCVJUNTY2MF9NX0JTVDFfT01fTF9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiUkVDTUlYTCBTd2l0Y2giLCBSVDU2NjBfT1VUX0wxX01JWEVSLAorCQkJUlQ1NjYwX01fUk1fTF9PTV9MX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJEQUNSIFN3aXRjaCIsIFJUNTY2MF9PVVRfTDFfTUlYRVIsCisJCQlSVDU2NjBfTV9EQUNfUl9PTV9MX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJEQUNMIFN3aXRjaCIsIFJUNTY2MF9PVVRfTDFfTUlYRVIsCisJCQlSVDU2NjBfTV9EQUNfTF9PTV9MX1NGVCwgMSwgMSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjYwX291dF9yX21peFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiQlNUMiBTd2l0Y2giLCBSVDU2NjBfT1VUX1IxX01JWEVSLAorCQkJUlQ1NjYwX01fQlNUMl9PTV9SX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJCU1QxIFN3aXRjaCIsIFJUNTY2MF9PVVRfUjFfTUlYRVIsCisJCQlSVDU2NjBfTV9CU1QxX09NX1JfU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIlJFQ01JWFIgU3dpdGNoIiwgUlQ1NjYwX09VVF9SMV9NSVhFUiwKKwkJCVJUNTY2MF9NX1JNX1JfT01fUl9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiREFDUiBTd2l0Y2giLCBSVDU2NjBfT1VUX1IxX01JWEVSLAorCQkJUlQ1NjYwX01fREFDX1JfT01fUl9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiREFDTCBTd2l0Y2giLCBSVDU2NjBfT1VUX1IxX01JWEVSLAorCQkJUlQ1NjYwX01fREFDX0xfT01fUl9TRlQsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2MF9zcG9fbWl4W10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJEQUNSIFN3aXRjaCIsIFJUNTY2MF9TUE9fTUlYRVIsCisJCQlSVDU2NjBfTV9EQUNfUl9TUE1fU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkRBQ0wgU3dpdGNoIiwgUlQ1NjYwX1NQT19NSVhFUiwKKwkJCVJUNTY2MF9NX0RBQ19MX1NQTV9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiU1BLVk9MIFN3aXRjaCIsIFJUNTY2MF9TUE9fTUlYRVIsCisJCQlSVDU2NjBfTV9TVl9TUE1fU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkJTVDEgU3dpdGNoIiwgUlQ1NjYwX1NQT19NSVhFUiwKKwkJCVJUNTY2MF9NX0JTVDFfU1BNX1NGVCwgMSwgMSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjYwX2xvdXRfbWl4W10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJEQUMgU3dpdGNoIiwgUlQ1NjYwX0xPVVRfTUlYRVIsCisJCQlSVDU2NjBfTV9EQUMxX0xNX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJPVVRNSVggU3dpdGNoIiwgUlQ1NjYwX0xPVVRfTUlYRVIsCisJCQlSVDU2NjBfTV9MT1ZPTF9MTV9TRlQsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNwa192b2xfY29udHJvbCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBSVDU2NjBfU1BLX1ZPTCwKKwkJUlQ1NjYwX1ZPTF9MX1NGVCwgMSwgMSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsb3V0X2xfdm9sX2NvbnRyb2wgPQorCVNPQ19EQVBNX1NJTkdMRSgiU3dpdGNoIiwgUlQ1NjYwX0xPVVRfVk9MLAorCQlSVDU2NjBfVk9MX0xfU0ZULCAxLCAxKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxvdXRfcl92b2xfY29udHJvbCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBSVDU2NjBfTE9VVF9WT0wsCisJCVJUNTY2MF9WT0xfUl9TRlQsIDEsIDEpOworCisvKiBJbnRlcmZhY2UgZGF0YSBzZWxlY3QgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnQ1NjYwX2RhdGFfc2VsZWN0W10gPSB7CisJIkwvUiIsICJSL0wiLCAiTC9MIiwgIlIvUiIKK307CisKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2NjBfaWYxX2RhY19lbnVtLAorCVJUNTY2MF9ESUdfSU5GMV9EQVRBLCBSVDU2NjBfSUYxX0RBQ19JTl9TRlQsIHJ0NTY2MF9kYXRhX3NlbGVjdCk7CisKK3N0YXRpYyBjb25zdCBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2NjBfaWYxX2FkY19lbnVtLAorCVJUNTY2MF9ESUdfSU5GMV9EQVRBLCBSVDU2NjBfSUYxX0FEQ19JTl9TRlQsIHJ0NTY2MF9kYXRhX3NlbGVjdCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjBfaWYxX2RhY19zd2FwX211eCA9CisJU09DX0RBUE1fRU5VTSgiSUYxIERBQyBTd2FwIFNvdXJjZSIsIHJ0NTY2MF9pZjFfZGFjX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjYwX2lmMV9hZGNfc3dhcF9tdXggPQorCVNPQ19EQVBNX0VOVU0oIklGMSBBREMgU3dhcCBTb3VyY2UiLCBydDU2NjBfaWYxX2FkY19lbnVtKTsKKworc3RhdGljIGludCBydDU2NjBfbG91dF9ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYwX0xPVVRfQU1QX0NUUkwsCisJCQlSVDU2NjBfTE9VVF9DT19NQVNLIHwgUlQ1NjYwX0xPVVRfQ0JfTUFTSywKKwkJCVJUNTY2MF9MT1VUX0NPX0VOIHwgUlQ1NjYwX0xPVVRfQ0JfUFUpOworCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2MF9MT1VUX0FNUF9DVFJMLAorCQkJUlQ1NjYwX0xPVVRfQ09fTUFTSyB8IFJUNTY2MF9MT1VUX0NCX01BU0ssCisJCQlSVDU2NjBfTE9VVF9DT19ESVMgfCBSVDU2NjBfTE9VVF9DQl9QRCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBydDU2NjBfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX1NVUFBMWSgiTERPMiIsIFJUNTY2MF9QV1JfQU5MRzEsCisJCVJUNTY2MF9QV1JfTERPMl9CSVQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIlBMTDEiLCBSVDU2NjBfUFdSX0FOTEcyLAorCQlSVDU2NjBfUFdSX1BMTF9CSVQsIDAsIE5VTEwsIDApLAorCisJLyogTUlDQklBUyAqLworCVNORF9TT0NfREFQTV9TVVBQTFkoIk1JQ0JJQVMxIiwgUlQ1NjYwX1BXUl9BTkxHMiwKKwkJCVJUNTY2MF9QV1JfTUIxX0JJVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiTUlDQklBUzIiLCBSVDU2NjBfUFdSX0FOTEcyLAorCQkJUlQ1NjYwX1BXUl9NQjJfQklULCAwLCBOVUxMLCAwKSwKKworCS8qIElucHV0IFNpZGUgKi8KKwkvKiBJbnB1dCBMaW5lcyAqLworCVNORF9TT0NfREFQTV9JTlBVVCgiRE1JQyBMMSIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiRE1JQyBSMSIpLAorCisJU05EX1NPQ19EQVBNX0lOUFVUKCJJTjFQIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJJTjFOIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJJTjJQIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJJTjNQIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJJTjNOIiksCisKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJETUlDIENMSyIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJcnQ1NjYwX3NldF9kbWljX2NsaywgU05EX1NPQ19EQVBNX1BSRV9QTVUpLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIkRNSUMgUG93ZXIiLCBSVDU2NjBfRE1JQ19DVFJMMSwKKwkJUlQ1NjYwX0RNSUNfMV9FTl9TRlQsIDAsIE5VTEwsIDApLAorCisJLyogQm9vc3QgKi8KKwlTTkRfU09DX0RBUE1fUEdBKCJCU1QxIiwgUlQ1NjYwX1BXUl9BTkxHMiwgUlQ1NjYwX1BXUl9CU1QxX0JJVCwgMCwKKwkJTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiQlNUMiIsIFJUNTY2MF9QV1JfQU5MRzIsIFJUNTY2MF9QV1JfQlNUMl9CSVQsIDAsCisJCU5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIkJTVDMiLCBSVDU2NjBfUFdSX0FOTEcyLCBSVDU2NjBfUFdSX0JTVDNfQklULCAwLAorCQlOVUxMLCAwKSwKKworCS8qIFJFQyBNaXhlciAqLworCVNORF9TT0NfREFQTV9NSVhFUigiUkVDTUlYTCIsIFJUNTY2MF9QV1JfTUlYRVIsIFJUNTY2MF9QV1JfUk1fTF9CSVQsCisJCQkwLCBydDU2NjBfcmVjX2xfbWl4LCBBUlJBWV9TSVpFKHJ0NTY2MF9yZWNfbF9taXgpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlJFQ01JWFIiLCBSVDU2NjBfUFdSX01JWEVSLCBSVDU2NjBfUFdSX1JNX1JfQklULAorCQkJMCwgcnQ1NjYwX3JlY19yX21peCwgQVJSQVlfU0laRShydDU2NjBfcmVjX3JfbWl4KSksCisKKwkvKiBBRENzICovCisJU05EX1NPQ19EQVBNX0FEQygiQURDIEwiLCBOVUxMLCBTTkRfU09DX05PUE0sIDAsIDApLAorCVNORF9TT0NfREFQTV9BREMoIkFEQyBSIiwgTlVMTCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKKworCVNORF9TT0NfREFQTV9TVVBQTFkoIkFEQyBMIHBvd2VyIiwgUlQ1NjYwX1BXUl9ESUcxLAorCQkJUlQ1NjYwX1BXUl9BRENfTF9CSVQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIkFEQyBSIHBvd2VyIiwgUlQ1NjYwX1BXUl9ESUcxLAorCQkJUlQ1NjYwX1BXUl9BRENfUl9CSVQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIkFEQyBjbG9jayIsIFJUNTY2MF9QUl9CQVNFICsgUlQ1NjYwX0NIT1BfREFDX0FEQywKKwkJCTEyLCAwLCBOVUxMLCAwKSwKKworCS8qIEFEQyBNaXhlciAqLworCVNORF9TT0NfREFQTV9TVVBQTFkoImFkYyBzdGVyZW8xIGZpbHRlciIsIFJUNTY2MF9QV1JfRElHMiwKKwkJUlQ1NjYwX1BXUl9BRENfUzFGX0JJVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTdG8xIEFEQyBNSVhMIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQlydDU2NjBfc3RvMV9hZGNfbF9taXgsIEFSUkFZX1NJWkUocnQ1NjYwX3N0bzFfYWRjX2xfbWl4KSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTdG8xIEFEQyBNSVhSIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQlydDU2NjBfc3RvMV9hZGNfcl9taXgsIEFSUkFZX1NJWkUocnQ1NjYwX3N0bzFfYWRjX3JfbWl4KSksCisKKwkvKiBBREMgKi8KKwlTTkRfU09DX0RBUE1fQURDKCJTdGVyZW8xIEFEQyBNSVhMIiwgTlVMTCwgUlQ1NjYwX1NUTzFfQURDX0RJR19WT0wsCisJCVJUNTY2MF9MX01VVEVfU0ZULCAxKSwKKwlTTkRfU09DX0RBUE1fQURDKCJTdGVyZW8xIEFEQyBNSVhSIiwgTlVMTCwgUlQ1NjYwX1NUTzFfQURDX0RJR19WT0wsCisJCVJUNTY2MF9SX01VVEVfU0ZULCAxKSwKKworCS8qIERpZ2l0YWwgSW50ZXJmYWNlICovCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiSTJTMSIsIFJUNTY2MF9QV1JfRElHMSwgUlQ1NjYwX1BXUl9JMlMxX0JJVCwgMCwKKwkJTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiSUYxIERBQyIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiSUYxIERBQyBMIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJJRjEgREFDIFIiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NVVgoIklGMSBEQUMgU3dhcCBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkmcnQ1NjYwX2lmMV9kYWNfc3dhcF9tdXgpLAorCVNORF9TT0NfREFQTV9QR0EoIklGMSBBREMiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NVVgoIklGMSBBREMgU3dhcCBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkmcnQ1NjYwX2lmMV9hZGNfc3dhcF9tdXgpLAorCisJLyogQXVkaW8gSW50ZXJmYWNlICovCisJU05EX1NPQ19EQVBNX0FJRl9JTigiQUlGMVJYIiwgIkFJRjEgUGxheWJhY2siLCAwLCBTTkRfU09DX05PUE0sIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJBSUYxVFgiLCAiQUlGMSBDYXB0dXJlIiwgMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKKworCS8qIE91dHB1dCBTaWRlICovCisJLyogREFDIG1peGVyIGJlZm9yZSBzb3VuZCBlZmZlY3QgICovCisJU05EX1NPQ19EQVBNX01JWEVSKCJEQUMxIE1JWEwiLCBTTkRfU09DX05PUE0sIDAsIDAsIHJ0NTY2MF9kYWNfbF9taXgsCisJCUFSUkFZX1NJWkUocnQ1NjYwX2RhY19sX21peCkpLAorCVNORF9TT0NfREFQTV9NSVhFUigiREFDMSBNSVhSIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBydDU2NjBfZGFjX3JfbWl4LAorCQlBUlJBWV9TSVpFKHJ0NTY2MF9kYWNfcl9taXgpKSwKKworCS8qIERBQyBNaXhlciAqLworCVNORF9TT0NfREFQTV9TVVBQTFkoImRhYyBzdGVyZW8xIGZpbHRlciIsIFJUNTY2MF9QV1JfRElHMiwKKwkJUlQ1NjYwX1BXUl9EQUNfUzFGX0JJVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTdGVyZW8gREFDIE1JWEwiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCXJ0NTY2MF9zdG9fZGFjX2xfbWl4LCBBUlJBWV9TSVpFKHJ0NTY2MF9zdG9fZGFjX2xfbWl4KSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTdGVyZW8gREFDIE1JWFIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCXJ0NTY2MF9zdG9fZGFjX3JfbWl4LCBBUlJBWV9TSVpFKHJ0NTY2MF9zdG9fZGFjX3JfbWl4KSksCisKKwkvKiBEQUNzICovCisJU05EX1NPQ19EQVBNX0RBQygiREFDIEwxIiwgTlVMTCwgUlQ1NjYwX1BXUl9ESUcxLAorCQkJUlQ1NjYwX1BXUl9EQUNfTDFfQklULCAwKSwKKwlTTkRfU09DX0RBUE1fREFDKCJEQUMgUjEiLCBOVUxMLCBSVDU2NjBfUFdSX0RJRzEsCisJCQlSVDU2NjBfUFdSX0RBQ19SMV9CSVQsIDApLAorCisJLyogT1VUIE1peGVyICovCisJU05EX1NPQ19EQVBNX01JWEVSKCJTUEsgTUlYIiwgUlQ1NjYwX1BXUl9NSVhFUiwgUlQ1NjYwX1BXUl9TTV9CSVQsCisJCTAsIHJ0NTY2MF9zcGtfbWl4LCBBUlJBWV9TSVpFKHJ0NTY2MF9zcGtfbWl4KSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJPVVQgTUlYTCIsIFJUNTY2MF9QV1JfTUlYRVIsIFJUNTY2MF9QV1JfT01fTF9CSVQsCisJCTAsIHJ0NTY2MF9vdXRfbF9taXgsIEFSUkFZX1NJWkUocnQ1NjYwX291dF9sX21peCkpLAorCVNORF9TT0NfREFQTV9NSVhFUigiT1VUIE1JWFIiLCBSVDU2NjBfUFdSX01JWEVSLCBSVDU2NjBfUFdSX09NX1JfQklULAorCQkwLCBydDU2NjBfb3V0X3JfbWl4LCBBUlJBWV9TSVpFKHJ0NTY2MF9vdXRfcl9taXgpKSwKKworCS8qIE91dHB1dCBWb2x1bWUgKi8KKwlTTkRfU09DX0RBUE1fU1dJVENIKCJTUEtWT0wiLCBSVDU2NjBfUFdSX1ZPTCwKKwkJUlQ1NjYwX1BXUl9TVl9CSVQsIDAsICZzcGtfdm9sX2NvbnRyb2wpLAorCVNORF9TT0NfREFQTV9QR0EoIkRBQyAxIiwgU05EX1NPQ19OT1BNLAorCQkwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJMT1VUVk9MIiwgU05EX1NPQ19OT1BNLAorCQkwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1dJVENIKCJMT1VUVk9MIEwiLCBTTkRfU09DX05PUE0sCisJCVJUNTY2MF9QV1JfTFZfTF9CSVQsIDAsICZsb3V0X2xfdm9sX2NvbnRyb2wpLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIkxPVVRWT0wgUiIsIFNORF9TT0NfTk9QTSwKKwkJUlQ1NjYwX1BXUl9MVl9SX0JJVCwgMCwgJmxvdXRfcl92b2xfY29udHJvbCksCisKKwkvKiBIUE8vTE9VVC9Nb25vIE1peGVyICovCisJU05EX1NPQ19EQVBNX01JWEVSKCJTUE8gTUlYIiwgU05EX1NPQ19OT1BNLCAwLAorCQkwLCBydDU2NjBfc3BvX21peCwgQVJSQVlfU0laRShydDU2NjBfc3BvX21peCkpLAorCVNORF9TT0NfREFQTV9NSVhFUigiTE9VVCBNSVgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCXJ0NTY2MF9sb3V0X21peCwgQVJSQVlfU0laRShydDU2NjBfbG91dF9taXgpKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJWUkVGIEhQIiwgUlQ1NjYwX0dFTl9DVFJMMSwKKwkJUlQ1NjYwX1BXUl9WUkVGX0hQX1NGVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQV9TKCJMT1VUIGFtcCIsIDEsIFJUNTY2MF9QV1JfQU5MRzEsCisJCVJUNTY2MF9QV1JfSEFfQklULCAwLCBydDU2NjBfbG91dF9ldmVudCwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUpLAorCVNORF9TT0NfREFQTV9QR0FfUygiU1BLIGFtcCIsIDEsIFJUNTY2MF9QV1JfRElHMSwKKwkJUlQ1NjYwX1BXUl9DTFNfRF9CSVQsIDAsIE5VTEwsIDApLAorCisJLyogT3V0cHV0IExpbmVzICovCisJU05EX1NPQ19EQVBNX09VVFBVVCgiTE9VVEwiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJMT1VUUiIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIlNQTyIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgcnQ1NjYwX2RhcG1fcm91dGVzW10gPSB7CisJeyAiTUlDQklBUzEiLCBOVUxMLCAiTERPMiIgfSwKKwl7ICJNSUNCSUFTMiIsIE5VTEwsICJMRE8yIiB9LAorCisJeyAiQlNUMSIsIE5VTEwsICJJTjFQIiB9LAorCXsgIkJTVDEiLCBOVUxMLCAiSU4xTiIgfSwKKwl7ICJCU1QyIiwgTlVMTCwgIklOMlAiIH0sCisJeyAiQlNUMyIsIE5VTEwsICJJTjNQIiB9LAorCXsgIkJTVDMiLCBOVUxMLCAiSU4zTiIgfSwKKworCXsgIlJFQ01JWEwiLCAiQlNUMyBTd2l0Y2giLCAiQlNUMyIgfSwKKwl7ICJSRUNNSVhMIiwgIkJTVDIgU3dpdGNoIiwgIkJTVDIiIH0sCisJeyAiUkVDTUlYTCIsICJCU1QxIFN3aXRjaCIsICJCU1QxIiB9LAorCXsgIlJFQ01JWEwiLCAiT1VUIE1JWEwgU3dpdGNoIiwgIk9VVCBNSVhMIiB9LAorCisJeyAiUkVDTUlYUiIsICJCU1QzIFN3aXRjaCIsICJCU1QzIiB9LAorCXsgIlJFQ01JWFIiLCAiQlNUMiBTd2l0Y2giLCAiQlNUMiIgfSwKKwl7ICJSRUNNSVhSIiwgIkJTVDEgU3dpdGNoIiwgIkJTVDEiIH0sCisJeyAiUkVDTUlYUiIsICJPVVQgTUlYUiBTd2l0Y2giLCAiT1VUIE1JWFIiIH0sCisKKwl7ICJBREMgTCIsIE5VTEwsICJSRUNNSVhMIiB9LAorCXsgIkFEQyBMIiwgTlVMTCwgIkFEQyBMIHBvd2VyIiB9LAorCXsgIkFEQyBMIiwgTlVMTCwgIkFEQyBjbG9jayIgfSwKKwl7ICJBREMgUiIsIE5VTEwsICJSRUNNSVhSIiB9LAorCXsgIkFEQyBSIiwgTlVMTCwgIkFEQyBSIHBvd2VyIiB9LAorCXsgIkFEQyBSIiwgTlVMTCwgIkFEQyBjbG9jayIgfSwKKworCXsiRE1JQyBMMSIsIE5VTEwsICJETUlDIENMSyJ9LAorCXsiRE1JQyBMMSIsIE5VTEwsICJETUlDIFBvd2VyIn0sCisJeyJETUlDIFIxIiwgTlVMTCwgIkRNSUMgQ0xLIn0sCisJeyJETUlDIFIxIiwgTlVMTCwgIkRNSUMgUG93ZXIifSwKKworCXsgIlN0bzEgQURDIE1JWEwiLCAiQURDMSBTd2l0Y2giLCAiQURDIEwiIH0sCisJeyAiU3RvMSBBREMgTUlYTCIsICJBREMyIFN3aXRjaCIsICJETUlDIEwxIiB9LAorCXsgIlN0bzEgQURDIE1JWFIiLCAiQURDMSBTd2l0Y2giLCAiQURDIFIiIH0sCisJeyAiU3RvMSBBREMgTUlYUiIsICJBREMyIFN3aXRjaCIsICJETUlDIFIxIiB9LAorCisJeyAiU3RlcmVvMSBBREMgTUlYTCIsIE5VTEwsICJTdG8xIEFEQyBNSVhMIiB9LAorCXsgIlN0ZXJlbzEgQURDIE1JWEwiLCBOVUxMLCAiYWRjIHN0ZXJlbzEgZmlsdGVyIiB9LAorCXsgImFkYyBzdGVyZW8xIGZpbHRlciIsIE5VTEwsICJQTEwxIiwgcnQ1NjYwX2lzX3N5c19jbGtfZnJvbV9wbGwgfSwKKworCXsgIlN0ZXJlbzEgQURDIE1JWFIiLCBOVUxMLCAiU3RvMSBBREMgTUlYUiIgfSwKKwl7ICJTdGVyZW8xIEFEQyBNSVhSIiwgTlVMTCwgImFkYyBzdGVyZW8xIGZpbHRlciIgfSwKKwl7ICJhZGMgc3RlcmVvMSBmaWx0ZXIiLCBOVUxMLCAiUExMMSIsIHJ0NTY2MF9pc19zeXNfY2xrX2Zyb21fcGxsIH0sCisKKwl7ICJJRjEgQURDIiwgTlVMTCwgIlN0ZXJlbzEgQURDIE1JWEwiIH0sCisJeyAiSUYxIEFEQyIsIE5VTEwsICJTdGVyZW8xIEFEQyBNSVhSIiB9LAorCXsgIklGMSBBREMiLCBOVUxMLCAiSTJTMSIgfSwKKworCXsgIklGMSBBREMgU3dhcCBNdXgiLCAiTC9SIiwgIklGMSBBREMiIH0sCisJeyAiSUYxIEFEQyBTd2FwIE11eCIsICJSL0wiLCAiSUYxIEFEQyIgfSwKKwl7ICJJRjEgQURDIFN3YXAgTXV4IiwgIkwvTCIsICJJRjEgQURDIiB9LAorCXsgIklGMSBBREMgU3dhcCBNdXgiLCAiUi9SIiwgIklGMSBBREMiIH0sCisJeyAiQUlGMVRYIiwgTlVMTCwgIklGMSBBREMgU3dhcCBNdXgiIH0sCisKKwl7ICJJRjEgREFDIiwgTlVMTCwgIkFJRjFSWCIgfSwKKwl7ICJJRjEgREFDIiwgTlVMTCwgIkkyUzEiIH0sCisKKwl7ICJJRjEgREFDIFN3YXAgTXV4IiwgIkwvUiIsICJJRjEgREFDIiB9LAorCXsgIklGMSBEQUMgU3dhcCBNdXgiLCAiUi9MIiwgIklGMSBEQUMiIH0sCisJeyAiSUYxIERBQyBTd2FwIE11eCIsICJML0wiLCAiSUYxIERBQyIgfSwKKwl7ICJJRjEgREFDIFN3YXAgTXV4IiwgIlIvUiIsICJJRjEgREFDIiB9LAorCisJeyAiSUYxIERBQyBMIiwgTlVMTCwgIklGMSBEQUMgU3dhcCBNdXgiIH0sCisJeyAiSUYxIERBQyBSIiwgTlVMTCwgIklGMSBEQUMgU3dhcCBNdXgiIH0sCisKKwl7ICJEQUMxIE1JWEwiLCAiU3RlcmVvIEFEQyBTd2l0Y2giLCAiU3RlcmVvMSBBREMgTUlYTCIgfSwKKwl7ICJEQUMxIE1JWEwiLCAiREFDMSBTd2l0Y2giLCAiSUYxIERBQyBMIiB9LAorCXsgIkRBQzEgTUlYUiIsICJTdGVyZW8gQURDIFN3aXRjaCIsICJTdGVyZW8xIEFEQyBNSVhSIiB9LAorCXsgIkRBQzEgTUlYUiIsICJEQUMxIFN3aXRjaCIsICJJRjEgREFDIFIiIH0sCisKKwl7ICJTdGVyZW8gREFDIE1JWEwiLCAiREFDIEwxIFN3aXRjaCIsICJEQUMxIE1JWEwiIH0sCisJeyAiU3RlcmVvIERBQyBNSVhMIiwgIkRBQyBSMSBTd2l0Y2giLCAiREFDMSBNSVhSIiB9LAorCXsgIlN0ZXJlbyBEQUMgTUlYTCIsIE5VTEwsICJkYWMgc3RlcmVvMSBmaWx0ZXIiIH0sCisJeyAiZGFjIHN0ZXJlbzEgZmlsdGVyIiwgTlVMTCwgIlBMTDEiLCBydDU2NjBfaXNfc3lzX2Nsa19mcm9tX3BsbCB9LAorCXsgIlN0ZXJlbyBEQUMgTUlYUiIsICJEQUMgUjEgU3dpdGNoIiwgIkRBQzEgTUlYUiIgfSwKKwl7ICJTdGVyZW8gREFDIE1JWFIiLCAiREFDIEwxIFN3aXRjaCIsICJEQUMxIE1JWEwiIH0sCisJeyAiU3RlcmVvIERBQyBNSVhSIiwgTlVMTCwgImRhYyBzdGVyZW8xIGZpbHRlciIgfSwKKwl7ICJkYWMgc3RlcmVvMSBmaWx0ZXIiLCBOVUxMLCAiUExMMSIsIHJ0NTY2MF9pc19zeXNfY2xrX2Zyb21fcGxsIH0sCisKKwl7ICJEQUMgTDEiLCBOVUxMLCAiU3RlcmVvIERBQyBNSVhMIiB9LAorCXsgIkRBQyBSMSIsIE5VTEwsICJTdGVyZW8gREFDIE1JWFIiIH0sCisKKwl7ICJTUEsgTUlYIiwgIkJTVDMgU3dpdGNoIiwgIkJTVDMiIH0sCisJeyAiU1BLIE1JWCIsICJCU1QxIFN3aXRjaCIsICJCU1QxIiB9LAorCXsgIlNQSyBNSVgiLCAiREFDTCBTd2l0Y2giLCAiREFDIEwxIiB9LAorCXsgIlNQSyBNSVgiLCAiREFDUiBTd2l0Y2giLCAiREFDIFIxIiB9LAorCXsgIlNQSyBNSVgiLCAiT1VUTUlYTCBTd2l0Y2giLCAiT1VUIE1JWEwiIH0sCisKKwl7ICJPVVQgTUlYTCIsICJCU1QzIFN3aXRjaCIsICJCU1QzIiB9LAorCXsgIk9VVCBNSVhMIiwgIkJTVDIgU3dpdGNoIiwgIkJTVDIiIH0sCisJeyAiT1VUIE1JWEwiLCAiQlNUMSBTd2l0Y2giLCAiQlNUMSIgfSwKKwl7ICJPVVQgTUlYTCIsICJSRUNNSVhMIFN3aXRjaCIsICJSRUNNSVhMIiB9LAorCXsgIk9VVCBNSVhMIiwgIkRBQ1IgU3dpdGNoIiwgIkRBQyBSMSIgfSwKKwl7ICJPVVQgTUlYTCIsICJEQUNMIFN3aXRjaCIsICJEQUMgTDEiIH0sCisKKwl7ICJPVVQgTUlYUiIsICJCU1QyIFN3aXRjaCIsICJCU1QyIiB9LAorCXsgIk9VVCBNSVhSIiwgIkJTVDEgU3dpdGNoIiwgIkJTVDEiIH0sCisJeyAiT1VUIE1JWFIiLCAiUkVDTUlYUiBTd2l0Y2giLCAiUkVDTUlYUiIgfSwKKwl7ICJPVVQgTUlYUiIsICJEQUNSIFN3aXRjaCIsICJEQUMgUjEiIH0sCisJeyAiT1VUIE1JWFIiLCAiREFDTCBTd2l0Y2giLCAiREFDIEwxIiB9LAorCisJeyAiU1BPIE1JWCIsICJEQUNSIFN3aXRjaCIsICJEQUMgUjEiIH0sCisJeyAiU1BPIE1JWCIsICJEQUNMIFN3aXRjaCIsICJEQUMgTDEiIH0sCisJeyAiU1BPIE1JWCIsICJTUEtWT0wgU3dpdGNoIiwgIlNQS1ZPTCIgfSwKKwl7ICJTUE8gTUlYIiwgIkJTVDEgU3dpdGNoIiwgIkJTVDEiIH0sCisKKwl7ICJTUEtWT0wiLCAiU3dpdGNoIiwgIlNQSyBNSVgiIH0sCisJeyAiTE9VVFZPTCBMIiwgIlN3aXRjaCIsICJPVVQgTUlYTCIgfSwKKwl7ICJMT1VUVk9MIFIiLCAiU3dpdGNoIiwgIk9VVCBNSVhSIiB9LAorCisJeyAiTE9VVFZPTCIsIE5VTEwsICJMT1VUVk9MIEwiIH0sCisJeyAiTE9VVFZPTCIsIE5VTEwsICJMT1VUVk9MIFIiIH0sCisKKwl7ICJEQUMgMSIsIE5VTEwsICJEQUMgTDEiIH0sCisJeyAiREFDIDEiLCBOVUxMLCAiREFDIFIxIiB9LAorCisJeyAiTE9VVCBNSVgiLCAiREFDIFN3aXRjaCIsICJEQUMgMSIgfSwKKwl7ICJMT1VUIE1JWCIsICJPVVRNSVggU3dpdGNoIiwgIkxPVVRWT0wiIH0sCisKKwl7ICJMT1VUIGFtcCIsIE5VTEwsICJMT1VUIE1JWCIgfSwKKwl7ICJMT1VUIGFtcCIsIE5VTEwsICJWUkVGIEhQIiB9LAorCXsgIkxPVVRMIiwgTlVMTCwgIkxPVVQgYW1wIiB9LAorCXsgIkxPVVRSIiwgTlVMTCwgIkxPVVQgYW1wIiB9LAorCisJeyAiU1BLIGFtcCIsIE5VTEwsICJTUE8gTUlYIiB9LAorCXsgIlNQTyIsIE5VTEwsICJTUEsgYW1wIiB9LAorfTsKKworc3RhdGljIGludCBydDU2NjBfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLCBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXN0cnVjdCBydDU2NjBfcHJpdiAqcnQ1NjYwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdW5zaWduZWQgaW50IHZhbF9sZW4gPSAwLCB2YWxfY2xrLCBtYXNrX2NsazsKKwlpbnQgcHJlX2RpdiwgYmNsa19tcywgZnJhbWVfc2l6ZTsKKworCXJ0NTY2MC0+bHJja1tkYWktPmlkXSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisJcHJlX2RpdiA9IHJsNjIzMV9nZXRfY2xrX2luZm8ocnQ1NjYwLT5zeXNjbGssIHJ0NTY2MC0+bHJja1tkYWktPmlkXSk7CisJaWYgKHByZV9kaXYgPCAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIlVuc3VwcG9ydGVkIGNsb2NrIHNldHRpbmcgJWQgZm9yIERBSSAlZFxuIiwKKwkJCXJ0NTY2MC0+bHJja1tkYWktPmlkXSwgZGFpLT5pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZyYW1lX3NpemUgPSBzbmRfc29jX3BhcmFtc190b19mcmFtZV9zaXplKHBhcmFtcyk7CisJaWYgKGZyYW1lX3NpemUgPCAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIlVuc3VwcG9ydGVkIGZyYW1lIHNpemU6ICVkXG4iLCBmcmFtZV9zaXplKTsKKwkJcmV0dXJuIGZyYW1lX3NpemU7CisJfQorCisJaWYgKGZyYW1lX3NpemUgPiAzMikKKwkJYmNsa19tcyA9IDE7CisJZWxzZQorCQliY2xrX21zID0gMDsKKworCXJ0NTY2MC0+YmNsa1tkYWktPmlkXSA9IHJ0NTY2MC0+bHJja1tkYWktPmlkXSAqICgzMiA8PCBiY2xrX21zKTsKKworCWRldl9kYmcoZGFpLT5kZXYsICJiY2xrIGlzICVkSHogYW5kIGxyY2sgaXMgJWRIelxuIiwKKwkJcnQ1NjYwLT5iY2xrW2RhaS0+aWRdLCBydDU2NjAtPmxyY2tbZGFpLT5pZF0pOworCWRldl9kYmcoZGFpLT5kZXYsICJiY2xrX21zIGlzICVkIGFuZCBwcmVfZGl2IGlzICVkIGZvciBpaXMgJWRcbiIsCisJCQkJYmNsa19tcywgcHJlX2RpdiwgZGFpLT5pZCk7CisKKwlzd2l0Y2ggKHBhcmFtc193aWR0aChwYXJhbXMpKSB7CisJY2FzZSAxNjoKKwkJYnJlYWs7CisJY2FzZSAyMDoKKwkJdmFsX2xlbiB8PSBSVDU2NjBfSTJTX0RMXzIwOworCQlicmVhazsKKwljYXNlIDI0OgorCQl2YWxfbGVuIHw9IFJUNTY2MF9JMlNfRExfMjQ7CisJCWJyZWFrOworCWNhc2UgODoKKwkJdmFsX2xlbiB8PSBSVDU2NjBfSTJTX0RMXzg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZGFpLT5pZCkgeworCWNhc2UgUlQ1NjYwX0FJRjE6CisJCW1hc2tfY2xrID0gUlQ1NjYwX0kyU19CQ0xLX01TMV9NQVNLIHwgUlQ1NjYwX0kyU19QRDFfTUFTSzsKKwkJdmFsX2NsayA9IGJjbGtfbXMgPDwgUlQ1NjYwX0kyU19CQ0xLX01TMV9TRlQgfAorCQkJcHJlX2RpdiA8PCBSVDU2NjBfSTJTX1BEMV9TRlQ7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2MF9JMlMxX1NEUCwgUlQ1NjYwX0kyU19ETF9NQVNLLAorCQkJdmFsX2xlbik7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2MF9BRERBX0NMSzEsIG1hc2tfY2xrLCB2YWxfY2xrKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJJbnZhbGlkIGRhaS0+aWQ6ICVkXG4iLCBkYWktPmlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjYwX3NldF9kYWlfZm10KHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCB1bnNpZ25lZCBpbnQgZm10KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CisJc3RydWN0IHJ0NTY2MF9wcml2ICpydDU2NjAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgcmVnX3ZhbCA9IDA7CisKKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX01BU1RFUl9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNOgorCQlydDU2NjAtPm1hc3RlcltkYWktPmlkXSA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgorCQlyZWdfdmFsIHw9IFJUNTY2MF9JMlNfTVNfUzsKKwkJcnQ1NjYwLT5tYXN0ZXJbZGFpLT5pZF0gPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfSU5WX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX05CX05GOgorCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfTkY6CisJCXJlZ192YWwgfD0gUlQ1NjYwX0kyU19CUF9JTlY7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9GT1JNQVRfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfSTJTOgorCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19EQUlGTVRfTEVGVF9KOgorCQlyZWdfdmFsIHw9IFJUNTY2MF9JMlNfREZfTEVGVDsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgorCQlyZWdfdmFsIHw9IFJUNTY2MF9JMlNfREZfUENNX0E7CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQjoKKwkJcmVnX3ZhbCAgfD0gUlQ1NjYwX0kyU19ERl9QQ01fQjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGRhaS0+aWQpIHsKKwljYXNlIFJUNTY2MF9BSUYxOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjBfSTJTMV9TRFAsCisJCQlSVDU2NjBfSTJTX01TX01BU0sgfCBSVDU2NjBfSTJTX0JQX01BU0sgfAorCQkJUlQ1NjYwX0kyU19ERl9NQVNLLCByZWdfdmFsKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJJbnZhbGlkIGRhaS0+aWQ6ICVkXG4iLCBkYWktPmlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjYwX3NldF9kYWlfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAorCQlpbnQgY2xrX2lkLCB1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXN0cnVjdCBydDU2NjBfcHJpdiAqcnQ1NjYwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdW5zaWduZWQgaW50IHJlZ192YWwgPSAwOworCisJaWYgKGZyZXEgPT0gcnQ1NjYwLT5zeXNjbGsgJiYgY2xrX2lkID09IHJ0NTY2MC0+c3lzY2xrX3NyYykKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGNsa19pZCkgeworCWNhc2UgUlQ1NjYwX1NDTEtfU19NQ0xLOgorCQlyZWdfdmFsIHw9IFJUNTY2MF9TQ0xLX1NSQ19NQ0xLOworCQlicmVhazsKKworCWNhc2UgUlQ1NjYwX1NDTEtfU19QTEwxOgorCQlyZWdfdmFsIHw9IFJUNTY2MF9TQ0xLX1NSQ19QTEwxOworCQlicmVhazsKKworCWNhc2UgUlQ1NjYwX1NDTEtfU19SQ0NMSzoKKwkJcmVnX3ZhbCB8PSBSVDU2NjBfU0NMS19TUkNfUkNDTEs7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSW52YWxpZCBjbG9jayBpZCAoJWQpXG4iLCBjbGtfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjBfR0xCX0NMSywgUlQ1NjYwX1NDTEtfU1JDX01BU0ssCisJCXJlZ192YWwpOworCisJcnQ1NjYwLT5zeXNjbGsgPSBmcmVxOworCXJ0NTY2MC0+c3lzY2xrX3NyYyA9IGNsa19pZDsKKworCWRldl9kYmcoZGFpLT5kZXYsICJTeXNjbGsgaXMgJWRIeiBhbmQgY2xvY2sgaWQgaXMgJWRcbiIsIGZyZXEsIGNsa19pZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDU2NjBfc2V0X2RhaV9wbGwoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIGludCBwbGxfaWQsIGludCBzb3VyY2UsCisJCQl1bnNpZ25lZCBpbnQgZnJlcV9pbiwgdW5zaWduZWQgaW50IGZyZXFfb3V0KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CisJc3RydWN0IHJ0NTY2MF9wcml2ICpydDU2NjAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgcmw2MjMxX3BsbF9jb2RlIHBsbF9jb2RlOworCWludCByZXQ7CisKKwlpZiAoc291cmNlID09IHJ0NTY2MC0+cGxsX3NyYyAmJiBmcmVxX2luID09IHJ0NTY2MC0+cGxsX2luICYmCisJCWZyZXFfb3V0ID09IHJ0NTY2MC0+cGxsX291dCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWZyZXFfaW4gfHwgIWZyZXFfb3V0KSB7CisJCWRldl9kYmcoY29kZWMtPmRldiwgIlBMTCBkaXNhYmxlZFxuIik7CisKKwkJcnQ1NjYwLT5wbGxfaW4gPSAwOworCQlydDU2NjAtPnBsbF9vdXQgPSAwOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjBfR0xCX0NMSywKKwkJCVJUNTY2MF9TQ0xLX1NSQ19NQVNLLCBSVDU2NjBfU0NMS19TUkNfTUNMSyk7CisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAoc291cmNlKSB7CisJY2FzZSBSVDU2NjBfUExMMV9TX01DTEs6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2MF9HTEJfQ0xLLAorCQkJUlQ1NjYwX1BMTDFfU1JDX01BU0ssIFJUNTY2MF9QTEwxX1NSQ19NQ0xLKTsKKwkJYnJlYWs7CisKKwljYXNlIFJUNTY2MF9QTEwxX1NfQkNMSzoKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYwX0dMQl9DTEssCisJCQlSVDU2NjBfUExMMV9TUkNfTUFTSywgUlQ1NjYwX1BMTDFfU1JDX0JDTEsxKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbmtub3duIFBMTCBzb3VyY2UgJWRcbiIsIHNvdXJjZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IHJsNjIzMV9wbGxfY2FsYyhmcmVxX2luLCBmcmVxX291dCwgJnBsbF9jb2RlKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbnN1cHBvcnQgaW5wdXQgY2xvY2sgJWRcbiIsIGZyZXFfaW4pOworCQlyZXR1cm4gcmV0OworCX0KKworCWRldl9kYmcoY29kZWMtPmRldiwgImJ5cGFzcz0lZCBtPSVkIG49JWQgaz0lZFxuIiwKKwkJcGxsX2NvZGUubV9icCwgKHBsbF9jb2RlLm1fYnAgPyAwIDogcGxsX2NvZGUubV9jb2RlKSwKKwkJcGxsX2NvZGUubl9jb2RlLCBwbGxfY29kZS5rX2NvZGUpOworCisJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjYwX1BMTF9DVFJMMSwKKwkJcGxsX2NvZGUubl9jb2RlIDw8IFJUNTY2MF9QTExfTl9TRlQgfCBwbGxfY29kZS5rX2NvZGUpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTY2MF9QTExfQ1RSTDIsCisJCShwbGxfY29kZS5tX2JwID8gMCA6IHBsbF9jb2RlLm1fY29kZSkgPDwgUlQ1NjYwX1BMTF9NX1NGVCB8CisJCXBsbF9jb2RlLm1fYnAgPDwgUlQ1NjYwX1BMTF9NX0JQX1NGVCk7CisKKwlydDU2NjAtPnBsbF9pbiA9IGZyZXFfaW47CisJcnQ1NjYwLT5wbGxfb3V0ID0gZnJlcV9vdXQ7CisJcnQ1NjYwLT5wbGxfc3JjID0gc291cmNlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjYwX3NldF9iaWFzX2xldmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCWVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQoreworCXN0cnVjdCBydDU2NjBfcHJpdiAqcnQ1NjYwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHJldDsKKworCXN3aXRjaCAobGV2ZWwpIHsKKwljYXNlIFNORF9TT0NfQklBU19PTjoKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjBfR0VOX0NUUkwxLAorCQkJUlQ1NjYwX0RJR19HQVRFX0NUUkwsIFJUNTY2MF9ESUdfR0FURV9DVFJMKTsKKworCQlpZiAoSVNfRVJSKHJ0NTY2MC0+bWNsaykpCisJCQlicmVhazsKKworCQlpZiAoc25kX3NvY19jb2RlY19nZXRfYmlhc19sZXZlbChjb2RlYykgPT0gU05EX1NPQ19CSUFTX09OKSB7CisJCQljbGtfZGlzYWJsZV91bnByZXBhcmUocnQ1NjYwLT5tY2xrKTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShydDU2NjAtPm1jbGspOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKKwkJaWYgKHNuZF9zb2NfY29kZWNfZ2V0X2JpYXNfbGV2ZWwoY29kZWMpID09IFNORF9TT0NfQklBU19PRkYpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2MF9QV1JfQU5MRzEsCisJCQkJUlQ1NjYwX1BXUl9WUkVGMSB8IFJUNTY2MF9QV1JfTUIgfAorCQkJCVJUNTY2MF9QV1JfQkcgfCBSVDU2NjBfUFdSX1ZSRUYyLAorCQkJCVJUNTY2MF9QV1JfVlJFRjEgfCBSVDU2NjBfUFdSX01CIHwKKwkJCQlSVDU2NjBfUFdSX0JHIHwgUlQ1NjYwX1BXUl9WUkVGMik7CisJCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDE1MDAwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2MF9QV1JfQU5MRzEsCisJCQkJUlQ1NjYwX1BXUl9GVjEgfCBSVDU2NjBfUFdSX0ZWMiwKKwkJCQlSVDU2NjBfUFdSX0ZWMSB8IFJUNTY2MF9QV1JfRlYyKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYwX0dFTl9DVFJMMSwKKwkJCVJUNTY2MF9ESUdfR0FURV9DVFJMLCAwKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDU2NjBfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBydDU2NjBfcHJpdiAqcnQ1NjYwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlydDU2NjAtPmNvZGVjID0gY29kZWM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDU2NjBfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlyZXR1cm4gc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjYwX1JFU0VULCAwKTsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBydDU2NjBfc3VzcGVuZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHJ0NTY2MF9wcml2ICpydDU2NjAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXJlZ2NhY2hlX2NhY2hlX29ubHkocnQ1NjYwLT5yZWdtYXAsIHRydWUpOworCXJlZ2NhY2hlX21hcmtfZGlydHkocnQ1NjYwLT5yZWdtYXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjYwX3Jlc3VtZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHJ0NTY2MF9wcml2ICpydDU2NjAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWlmIChydDU2NjAtPnBkYXRhLnBvd2Vyb2ZmX2NvZGVjX2luX3N1c3BlbmQpCisJCXVzbGVlcF9yYW5nZSgzNTAwMDAsIDQwMDAwMCk7CisKKwlyZWdjYWNoZV9jYWNoZV9vbmx5KHJ0NTY2MC0+cmVnbWFwLCBmYWxzZSk7CisJcmVnY2FjaGVfc3luYyhydDU2NjAtPnJlZ21hcCk7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIHJ0NTY2MF9zdXNwZW5kIE5VTEwKKyNkZWZpbmUgcnQ1NjYwX3Jlc3VtZSBOVUxMCisjZW5kaWYKKworI2RlZmluZSBSVDU2NjBfU1RFUkVPX1JBVEVTIFNORFJWX1BDTV9SQVRFXzgwMDBfMTkyMDAwCisjZGVmaW5lIFJUNTY2MF9GT1JNQVRTIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSB8IFwKKwkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TOCkKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgcnQ1NjYwX2FpZl9kYWlfb3BzID0geworCS5od19wYXJhbXMgPSBydDU2NjBfaHdfcGFyYW1zLAorCS5zZXRfZm10ID0gcnQ1NjYwX3NldF9kYWlfZm10LAorCS5zZXRfc3lzY2xrID0gcnQ1NjYwX3NldF9kYWlfc3lzY2xrLAorCS5zZXRfcGxsID0gcnQ1NjYwX3NldF9kYWlfcGxsLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgcnQ1NjYwX2RhaVtdID0geworCXsKKwkJLm5hbWUgPSAicnQ1NjYwLWFpZjEiLAorCQkuaWQgPSBSVDU2NjBfQUlGMSwKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRjEgUGxheWJhY2siLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IFJUNTY2MF9TVEVSRU9fUkFURVMsCisJCQkuZm9ybWF0cyA9IFJUNTY2MF9GT1JNQVRTLAorCQl9LAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBSUYxIENhcHR1cmUiLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IFJUNTY2MF9TVEVSRU9fUkFURVMsCisJCQkuZm9ybWF0cyA9IFJUNTY2MF9GT1JNQVRTLAorCQl9LAorCQkub3BzID0gJnJ0NTY2MF9haWZfZGFpX29wcywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3J0NTY2MCA9IHsKKwkucHJvYmUgPSBydDU2NjBfcHJvYmUsCisJLnJlbW92ZSA9IHJ0NTY2MF9yZW1vdmUsCisJLnN1c3BlbmQgPSBydDU2NjBfc3VzcGVuZCwKKwkucmVzdW1lID0gcnQ1NjYwX3Jlc3VtZSwKKwkuc2V0X2JpYXNfbGV2ZWwgPSBydDU2NjBfc2V0X2JpYXNfbGV2ZWwsCisJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gcnQ1NjYwX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHJ0NTY2MF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHJ0NTY2MF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShydDU2NjBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHJ0NTY2MF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUocnQ1NjYwX2RhcG1fcm91dGVzKSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHJ0NTY2MF9yZWdtYXAgPSB7CisJLnJlZ19iaXRzID0gOCwKKwkudmFsX2JpdHMgPSAxNiwKKwkudXNlX3NpbmdsZV9ydyA9IHRydWUsCisKKwkubWF4X3JlZ2lzdGVyID0gUlQ1NjYwX1ZFTkRPUl9JRDIgKyAxICsgKEFSUkFZX1NJWkUocnQ1NjYwX3JhbmdlcykgKgorCQkJCQkgICAgICAgUlQ1NjYwX1BSX1NQQUNJTkcpLAorCS52b2xhdGlsZV9yZWcgPSBydDU2NjBfdm9sYXRpbGVfcmVnaXN0ZXIsCisJLnJlYWRhYmxlX3JlZyA9IHJ0NTY2MF9yZWFkYWJsZV9yZWdpc3RlciwKKworCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAorCS5yZWdfZGVmYXVsdHMgPSBydDU2NjBfcmVnLAorCS5udW1fcmVnX2RlZmF1bHRzID0gQVJSQVlfU0laRShydDU2NjBfcmVnKSwKKwkucmFuZ2VzID0gcnQ1NjYwX3JhbmdlcywKKwkubnVtX3JhbmdlcyA9IEFSUkFZX1NJWkUocnQ1NjYwX3JhbmdlcyksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgcnQ1NjYwX2kyY19pZFtdID0geworCXsgInJ0NTY2MCIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgcnQ1NjYwX2kyY19pZCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJ0NTY2MF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAicmVhbHRlayxydDU2NjAiLCB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHJ0NTY2MF9vZl9tYXRjaCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgcnQ1NjYwX2FjcGlfbWF0Y2hbXSA9IHsKKwl7ICIxMEVDNTY2MCIsIDAgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShhY3BpLCBydDU2NjBfYWNwaV9tYXRjaCk7CisKK3N0YXRpYyBpbnQgcnQ1NjYwX3BhcnNlX2R0KHN0cnVjdCBydDU2NjBfcHJpdiAqcnQ1NjYwLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcnQ1NjYwLT5wZGF0YS5pbjFfZGlmZiA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LAorCQkJCQkicmVhbHRlayxpbjEtZGlmZmVyZW50aWFsIik7CisJcnQ1NjYwLT5wZGF0YS5pbjNfZGlmZiA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LAorCQkJCQkicmVhbHRlayxpbjMtZGlmZmVyZW50aWFsIik7CisJcnQ1NjYwLT5wZGF0YS5wb3dlcm9mZl9jb2RlY19pbl9zdXNwZW5kID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsCisJCQkJCSJyZWFsdGVrLHBvd2Vyb2ZmLWluLXN1c3BlbmQiKTsKKwlkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIoZGV2LCAicmVhbHRlayxkbWljMS1kYXRhLXBpbiIsCisJCSZydDU2NjAtPnBkYXRhLmRtaWMxX2RhdGFfcGluKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0NTY2MF9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywKKwkJICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgcnQ1NjYwX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmaTJjLT5kZXYpOworCXN0cnVjdCBydDU2NjBfcHJpdiAqcnQ1NjYwOworCWludCByZXQ7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXJ0NTY2MCA9IGRldm1fa3phbGxvYygmaTJjLT5kZXYsIHNpemVvZihzdHJ1Y3QgcnQ1NjYwX3ByaXYpLAorCQlHRlBfS0VSTkVMKTsKKworCWlmIChydDU2NjAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBDaGVjayBpZiBNQ0xLIHByb3ZpZGVkICovCisJcnQ1NjYwLT5tY2xrID0gZGV2bV9jbGtfZ2V0KCZpMmMtPmRldiwgIm1jbGsiKTsKKwlpZiAoUFRSX0VSUihydDU2NjAtPm1jbGspID09IC1FUFJPQkVfREVGRVIpCisJCXJldHVybiAtRVBST0JFX0RFRkVSOworCisJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgcnQ1NjYwKTsKKworCWlmIChwZGF0YSkKKwkJcnQ1NjYwLT5wZGF0YSA9ICpwZGF0YTsKKwllbHNlIGlmIChpMmMtPmRldi5vZl9ub2RlKQorCQlydDU2NjBfcGFyc2VfZHQocnQ1NjYwLCAmaTJjLT5kZXYpOworCisJcnQ1NjYwLT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhpMmMsICZydDU2NjBfcmVnbWFwKTsKKwlpZiAoSVNfRVJSKHJ0NTY2MC0+cmVnbWFwKSkgeworCQlyZXQgPSBQVFJfRVJSKHJ0NTY2MC0+cmVnbWFwKTsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVnaXN0ZXIgbWFwOiAlZFxuIiwKKwkJCXJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmVnbWFwX3JlYWQocnQ1NjYwLT5yZWdtYXAsIFJUNTY2MF9WRU5ET1JfSUQyLCAmdmFsKTsKKwlpZiAodmFsICE9IFJUNTY2MF9ERVZJQ0VfSUQpIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsCisJCQkiRGV2aWNlIHdpdGggSUQgcmVnaXN0ZXIgJSN4IGlzIG5vdCBydDU2NjBcbiIsIHZhbCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJlZ21hcF93cml0ZShydDU2NjAtPnJlZ21hcCwgUlQ1NjYwX1JFU0VULCAwKTsKKworCXJldCA9IHJlZ21hcF9yZWdpc3Rlcl9wYXRjaChydDU2NjAtPnJlZ21hcCwgcnQ1NjYwX3BhdGNoLAorCQkJCSAgICBBUlJBWV9TSVpFKHJ0NTY2MF9wYXRjaCkpOworCWlmIChyZXQgIT0gMCkKKwkJZGV2X3dhcm4oJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIGFwcGx5IHJlZ21hcCBwYXRjaDogJWRcbiIsIHJldCk7CisKKwlpZiAocnQ1NjYwLT5wZGF0YS5kbWljMV9kYXRhX3BpbikgeworCQlyZWdtYXBfdXBkYXRlX2JpdHMocnQ1NjYwLT5yZWdtYXAsIFJUNTY2MF9HUElPX0NUUkwxLAorCQkJUlQ1NjYwX0dQMV9QSU5fTUFTSywgUlQ1NjYwX0dQMV9QSU5fRE1JQzFfU0NMKTsKKworCQlpZiAocnQ1NjYwLT5wZGF0YS5kbWljMV9kYXRhX3BpbiA9PSBSVDU2NjBfRE1JQzFfREFUQV9HUElPMikKKwkJCXJlZ21hcF91cGRhdGVfYml0cyhydDU2NjAtPnJlZ21hcCwgUlQ1NjYwX0RNSUNfQ1RSTDEsCisJCQkJUlQ1NjYwX1NFTF9ETUlDX0RBVEFfTUFTSywKKwkJCQlSVDU2NjBfU0VMX0RNSUNfREFUQV9HUElPMik7CisJCWVsc2UgaWYgKHJ0NTY2MC0+cGRhdGEuZG1pYzFfZGF0YV9waW4gPT0gUlQ1NjYwX0RNSUMxX0RBVEFfSU4xUCkKKwkJCXJlZ21hcF91cGRhdGVfYml0cyhydDU2NjAtPnJlZ21hcCwgUlQ1NjYwX0RNSUNfQ1RSTDEsCisJCQkJUlQ1NjYwX1NFTF9ETUlDX0RBVEFfTUFTSywKKwkJCQlSVDU2NjBfU0VMX0RNSUNfREFUQV9JTjFQKTsKKwl9CisKKwlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsICZzb2NfY29kZWNfZGV2X3J0NTY2MCwKKwkJCQkgICAgICBydDU2NjBfZGFpLCBBUlJBWV9TSVpFKHJ0NTY2MF9kYWkpKTsKK30KKworc3RhdGljIGludCBydDU2NjBfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjKQoreworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBydDU2NjBfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJydDU2NjAiLAorCQkuYWNwaV9tYXRjaF90YWJsZSA9IEFDUElfUFRSKHJ0NTY2MF9hY3BpX21hdGNoKSwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHJ0NTY2MF9vZl9tYXRjaCksCisJfSwKKwkucHJvYmUgPSBydDU2NjBfaTJjX3Byb2JlLAorCS5yZW1vdmUgICA9IHJ0NTY2MF9pMmNfcmVtb3ZlLAorCS5pZF90YWJsZSA9IHJ0NTY2MF9pMmNfaWQsCit9OworbW9kdWxlX2kyY19kcml2ZXIocnQ1NjYwX2kyY19kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgUlQ1NjYwIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiT2RlciBDaGlvdSA8b2Rlcl9jaGlvdUByZWFsdGVrLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjYwLmggYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY2MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZGI5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY2MC5oCkBAIC0wLDAgKzEsODQ3IEBACisvKgorICogcnQ1NjYwLmggIC0tICBSVDU2NjAgQUxTQSBTb0MgYXVkaW8gZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTYgUmVhbHRlayBTZW1pY29uZHVjdG9yIENvcnAuCisgKiBBdXRob3I6IE9kZXIgQ2hpb3UgPG9kZXJfY2hpb3VAcmVhbHRlay5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9SVDU2NjBfSAorI2RlZmluZSBfUlQ1NjYwX0gKKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPHNvdW5kL3J0NTY2MC5oPgorCisvKiBJbmZvICovCisjZGVmaW5lIFJUNTY2MF9SRVNFVAkJCQkweDAwCisjZGVmaW5lIFJUNTY2MF9WRU5ET1JfSUQJCQkweGZkCisjZGVmaW5lIFJUNTY2MF9WRU5ET1JfSUQxCQkJMHhmZQorI2RlZmluZSBSVDU2NjBfVkVORE9SX0lEMgkJCTB4ZmYKKy8qICBJL08gLSBPdXRwdXQgKi8KKyNkZWZpbmUgUlQ1NjYwX1NQS19WT0wJCQkJMHgwMQorI2RlZmluZSBSVDU2NjBfTE9VVF9WT0wJCQkJMHgwMgorLyogSS9PIC0gSW5wdXQgKi8KKyNkZWZpbmUgUlQ1NjYwX0lOMV9JTjIJCQkJMHgwZAorI2RlZmluZSBSVDU2NjBfSU4zX0lONAkJCQkweDBlCisvKiBJL08gLSBBREMvREFDL0RNSUMgKi8KKyNkZWZpbmUgUlQ1NjYwX0RBQzFfRElHX1ZPTAkJCTB4MTkKKyNkZWZpbmUgUlQ1NjYwX1NUTzFfQURDX0RJR19WT0wJCQkweDFjCisjZGVmaW5lIFJUNTY2MF9BRENfQlNUX1ZPTDEJCQkweDFlCisvKiBNaXhlciAtIEQtRCAqLworI2RlZmluZSBSVDU2NjBfU1RPMV9BRENfTUlYRVIJCQkweDI3CisjZGVmaW5lIFJUNTY2MF9BRF9EQV9NSVhFUgkJCTB4MjkKKyNkZWZpbmUgUlQ1NjYwX1NUT19EQUNfTUlYRVIJCQkweDJhCisjZGVmaW5lIFJUNTY2MF9ESUdfSU5GMV9EQVRBCQkJMHgyZgorLyogTWl4ZXIgLSBBREMgKi8KKyNkZWZpbmUgUlQ1NjYwX1JFQ19MMV9NSVhFUgkJCTB4M2IKKyNkZWZpbmUgUlQ1NjYwX1JFQ19MMl9NSVhFUgkJCTB4M2MKKyNkZWZpbmUgUlQ1NjYwX1JFQ19SMV9NSVhFUgkJCTB4M2QKKyNkZWZpbmUgUlQ1NjYwX1JFQ19SMl9NSVhFUgkJCTB4M2UKKy8qIE1peGVyIC0gREFDICovCisjZGVmaW5lIFJUNTY2MF9MT1VUX01JWEVSCQkJMHg0NQorI2RlZmluZSBSVDU2NjBfU1BLX01JWEVSCQkJMHg0NgorI2RlZmluZSBSVDU2NjBfU1BPX01JWEVSCQkJMHg0OAorI2RlZmluZSBSVDU2NjBfU1BPX0NMU0RfUkFUSU8JCQkweDRhCisjZGVmaW5lIFJUNTY2MF9PVVRfTF9HQUlOMQkJCTB4NGQKKyNkZWZpbmUgUlQ1NjYwX09VVF9MX0dBSU4yCQkJMHg0ZQorI2RlZmluZSBSVDU2NjBfT1VUX0wxX01JWEVSCQkJMHg0ZgorI2RlZmluZSBSVDU2NjBfT1VUX1JfR0FJTjEJCQkweDUwCisjZGVmaW5lIFJUNTY2MF9PVVRfUl9HQUlOMgkJCTB4NTEKKyNkZWZpbmUgUlQ1NjYwX09VVF9SMV9NSVhFUgkJCTB4NTIKKy8qIFBvd2VyICovCisjZGVmaW5lIFJUNTY2MF9QV1JfRElHMQkJCQkweDYxCisjZGVmaW5lIFJUNTY2MF9QV1JfRElHMgkJCQkweDYyCisjZGVmaW5lIFJUNTY2MF9QV1JfQU5MRzEJCQkweDYzCisjZGVmaW5lIFJUNTY2MF9QV1JfQU5MRzIJCQkweDY0CisjZGVmaW5lIFJUNTY2MF9QV1JfTUlYRVIJCQkweDY1CisjZGVmaW5lIFJUNTY2MF9QV1JfVk9MCQkJCTB4NjYKKy8qIFByaXZhdGUgUmVnaXN0ZXIgQ29udHJvbCAqLworI2RlZmluZSBSVDU2NjBfUFJJVl9JTkRFWAkJCTB4NmEKKyNkZWZpbmUgUlQ1NjYwX1BSSVZfREFUQQkJCTB4NmMKKy8qIEZvcm1hdCAtIEFEQy9EQUMgKi8KKyNkZWZpbmUgUlQ1NjYwX0kyUzFfU0RQCQkJCTB4NzAKKyNkZWZpbmUgUlQ1NjYwX0FEREFfQ0xLMQkJCTB4NzMKKyNkZWZpbmUgUlQ1NjYwX0FEREFfQ0xLMgkJCTB4NzQKKyNkZWZpbmUgUlQ1NjYwX0RNSUNfQ1RSTDEJCQkweDc1CisvKiBGdW5jdGlvbiAtIEFuYWxvZyAqLworI2RlZmluZSBSVDU2NjBfR0xCX0NMSwkJCQkweDgwCisjZGVmaW5lIFJUNTY2MF9QTExfQ1RSTDEJCQkweDgxCisjZGVmaW5lIFJUNTY2MF9QTExfQ1RSTDIJCQkweDgyCisjZGVmaW5lIFJUNTY2MF9DTFNEX0FNUF9PQ19DVFJMCQkJMHg4YworI2RlZmluZSBSVDU2NjBfQ0xTRF9BTVBfQ1RSTAkJCTB4OGQKKyNkZWZpbmUgUlQ1NjYwX0xPVVRfQU1QX0NUUkwJCQkweDhlCisjZGVmaW5lIFJUNTY2MF9TUEtfQU1QX1NQS1ZERAkJCTB4OTIKKyNkZWZpbmUgUlQ1NjYwX01JQ0JJQVMJCQkJMHg5MworI2RlZmluZSBSVDU2NjBfQ0xTRF9PVVRfQ1RSTDEJCQkweGExCisjZGVmaW5lIFJUNTY2MF9DTFNEX09VVF9DVFJMMgkJCTB4YTIKKyNkZWZpbmUgUlQ1NjYwX0RJUE9MRV9NSUNfQ1RSTDEJCQkweGEzCisjZGVmaW5lIFJUNTY2MF9ESVBPTEVfTUlDX0NUUkwyCQkJMHhhNAorI2RlZmluZSBSVDU2NjBfRElQT0xFX01JQ19DVFJMMwkJCTB4YTUKKyNkZWZpbmUgUlQ1NjYwX0RJUE9MRV9NSUNfQ1RSTDQJCQkweGE2CisjZGVmaW5lIFJUNTY2MF9ESVBPTEVfTUlDX0NUUkw1CQkJMHhhNworI2RlZmluZSBSVDU2NjBfRElQT0xFX01JQ19DVFJMNgkJCTB4YTgKKyNkZWZpbmUgUlQ1NjYwX0RJUE9MRV9NSUNfQ1RSTDcJCQkweGE5CisjZGVmaW5lIFJUNTY2MF9ESVBPTEVfTUlDX0NUUkw4CQkJMHhhYQorI2RlZmluZSBSVDU2NjBfRElQT0xFX01JQ19DVFJMOQkJCTB4YWIKKyNkZWZpbmUgUlQ1NjYwX0RJUE9MRV9NSUNfQ1RSTDEwCQkweGFjCisjZGVmaW5lIFJUNTY2MF9ESVBPTEVfTUlDX0NUUkwxMQkJMHhhZAorI2RlZmluZSBSVDU2NjBfRElQT0xFX01JQ19DVFJMMTIJCTB4YWUKKy8qIEZ1bmN0aW9uIC0gRGlnaXRhbCAqLworI2RlZmluZSBSVDU2NjBfRVFfQ1RSTDEJCQkJMHhiMAorI2RlZmluZSBSVDU2NjBfRVFfQ1RSTDIJCQkJMHhiMQorI2RlZmluZSBSVDU2NjBfRFJDX0FHQ19DVFJMMQkJCTB4YjMKKyNkZWZpbmUgUlQ1NjYwX0RSQ19BR0NfQ1RSTDIJCQkweGI0CisjZGVmaW5lIFJUNTY2MF9EUkNfQUdDX0NUUkwzCQkJMHhiNQorI2RlZmluZSBSVDU2NjBfRFJDX0FHQ19DVFJMNAkJCTB4YjYKKyNkZWZpbmUgUlQ1NjYwX0RSQ19BR0NfQ1RSTDUJCQkweGI3CisjZGVmaW5lIFJUNTY2MF9KRF9DVFJMCQkJCTB4YmIKKyNkZWZpbmUgUlQ1NjYwX0lSUV9DVFJMMQkJCTB4YmQKKyNkZWZpbmUgUlQ1NjYwX0lSUV9DVFJMMgkJCTB4YmUKKyNkZWZpbmUgUlQ1NjYwX0lOVF9JUlFfU1QJCQkweGJmCisjZGVmaW5lIFJUNTY2MF9HUElPX0NUUkwxCQkJMHhjMAorI2RlZmluZSBSVDU2NjBfR1BJT19DVFJMMgkJCTB4YzIKKyNkZWZpbmUgUlQ1NjYwX1dJTkRfRklMVEVSX0NUUkwxCQkweGQzCisjZGVmaW5lIFJUNTY2MF9TVl9aQ0QxCQkJCTB4ZDkKKyNkZWZpbmUgUlQ1NjYwX1NWX1pDRDIJCQkJMHhkYQorI2RlZmluZSBSVDU2NjBfRFJDMV9MTV9DVFJMMQkJCTB4ZTAKKyNkZWZpbmUgUlQ1NjYwX0RSQzFfTE1fQ1RSTDIJCQkweGUxCisjZGVmaW5lIFJUNTY2MF9EUkMyX0xNX0NUUkwxCQkJMHhlMgorI2RlZmluZSBSVDU2NjBfRFJDMl9MTV9DVFJMMgkJCTB4ZTMKKyNkZWZpbmUgUlQ1NjYwX01VTFRJX0RSQ19DVFJMCQkJMHhlNAorI2RlZmluZSBSVDU2NjBfRFJDMl9DVFJMMQkJCTB4ZTUKKyNkZWZpbmUgUlQ1NjYwX0RSQzJfQ1RSTDIJCQkweGU2CisjZGVmaW5lIFJUNTY2MF9EUkMyX0NUUkwzCQkJMHhlNworI2RlZmluZSBSVDU2NjBfRFJDMl9DVFJMNAkJCTB4ZTgKKyNkZWZpbmUgUlQ1NjYwX0RSQzJfQ1RSTDUJCQkweGU5CisjZGVmaW5lIFJUNTY2MF9BTENfUEdBX0NUUkwxCQkJMHhlYQorI2RlZmluZSBSVDU2NjBfQUxDX1BHQV9DVFJMMgkJCTB4ZWIKKyNkZWZpbmUgUlQ1NjYwX0FMQ19QR0FfQ1RSTDMJCQkweGVjCisjZGVmaW5lIFJUNTY2MF9BTENfUEdBX0NUUkw0CQkJMHhlZAorI2RlZmluZSBSVDU2NjBfQUxDX1BHQV9DVFJMNQkJCTB4ZWUKKyNkZWZpbmUgUlQ1NjYwX0FMQ19QR0FfQ1RSTDYJCQkweGVmCisjZGVmaW5lIFJUNTY2MF9BTENfUEdBX0NUUkw3CQkJMHhmMAorCisvKiBHZW5lcmFsIENvbnRyb2wgKi8KKyNkZWZpbmUgUlQ1NjYwX0dFTl9DVFJMMQkJCTB4ZmEKKyNkZWZpbmUgUlQ1NjYwX0dFTl9DVFJMMgkJCTB4ZmIKKyNkZWZpbmUgUlQ1NjYwX0dFTl9DVFJMMwkJCTB4ZmMKKworLyogSW5kZXggb2YgQ29kZWMgUHJpdmF0ZSBSZWdpc3RlciBkZWZpbml0aW9uICovCisjZGVmaW5lIFJUNTY2MF9DSE9QX0RBQ19BREMJCQkweDNkCisKKy8qIEdsb2JhbCBEZWZpbml0aW9uICovCisjZGVmaW5lIFJUNTY2MF9MX01VVEUJCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX0xfTVVURV9TRlQJCQkxNQorI2RlZmluZSBSVDU2NjBfVk9MX0xfTVVURQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9WT0xfTF9TRlQJCQkxNAorI2RlZmluZSBSVDU2NjBfUl9NVVRFCQkJCSgweDEgPDwgNykKKyNkZWZpbmUgUlQ1NjYwX1JfTVVURV9TRlQJCQk3CisjZGVmaW5lIFJUNTY2MF9WT0xfUl9NVVRFCQkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2NjBfVk9MX1JfU0ZUCQkJNgorI2RlZmluZSBSVDU2NjBfTF9WT0xfTUFTSwkJCSgweDNmIDw8IDgpCisjZGVmaW5lIFJUNTY2MF9MX1ZPTF9TRlQJCQk4CisjZGVmaW5lIFJUNTY2MF9SX1ZPTF9NQVNLCQkJKDB4M2YpCisjZGVmaW5lIFJUNTY2MF9SX1ZPTF9TRlQJCQkwCisKKy8qIElOMSBhbmQgSU4yIENvbnRyb2wgKDB4MGQpICovCisjZGVmaW5lIFJUNTY2MF9JTl9ERjEJCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX0lOX1NGVDEJCQkJMTUKKyNkZWZpbmUgUlQ1NjYwX0JTVF9NQVNLMQkJCSgweDdmIDw8IDgpCisjZGVmaW5lIFJUNTY2MF9CU1RfU0ZUMQkJCQk4CisjZGVmaW5lIFJUNTY2MF9JTl9ERjIJCQkJKDB4MSA8PCA3KQorI2RlZmluZSBSVDU2NjBfSU5fU0ZUMgkJCQk3CisjZGVmaW5lIFJUNTY2MF9CU1RfTUFTSzIJCQkoMHg3ZiA8PCAwKQorI2RlZmluZSBSVDU2NjBfQlNUX1NGVDIJCQkJMAorCisvKiBJTjMgYW5kIElONCBDb250cm9sICgweDBlKSAqLworI2RlZmluZSBSVDU2NjBfSU5fREYzCQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9JTl9TRlQzCQkJCTE1CisjZGVmaW5lIFJUNTY2MF9CU1RfTUFTSzMJCQkoMHg3ZiA8PCA4KQorI2RlZmluZSBSVDU2NjBfQlNUX1NGVDMJCQkJOAorI2RlZmluZSBSVDU2NjBfSU5fREY0CQkJCSgweDEgPDwgNykKKyNkZWZpbmUgUlQ1NjYwX0lOX1NGVDQJCQkJNworI2RlZmluZSBSVDU2NjBfQlNUX01BU0s0CQkJKDB4N2YgPDwgMCkKKyNkZWZpbmUgUlQ1NjYwX0JTVF9TRlQ0CQkJCTAKKworLyogREFDMSBEaWdpdGFsIFZvbHVtZSAoMHgxOSkgKi8KKyNkZWZpbmUgUlQ1NjYwX0RBQ19MMV9WT0xfTUFTSwkJCSgweDdmIDw8IDkpCisjZGVmaW5lIFJUNTY2MF9EQUNfTDFfVk9MX1NGVAkJCTkKKyNkZWZpbmUgUlQ1NjYwX0RBQ19SMV9WT0xfTUFTSwkJCSgweDdmIDw8IDEpCisjZGVmaW5lIFJUNTY2MF9EQUNfUjFfVk9MX1NGVAkJCTEKKworLyogQURDIERpZ2l0YWwgVm9sdW1lIENvbnRyb2wgKDB4MWMpICovCisjZGVmaW5lIFJUNTY2MF9BRENfTF9WT0xfTUFTSwkJCSgweDNmIDw8IDkpCisjZGVmaW5lIFJUNTY2MF9BRENfTF9WT0xfU0ZUCQkJOQorI2RlZmluZSBSVDU2NjBfQURDX1JfVk9MX01BU0sJCQkoMHgzZiA8PCAxKQorI2RlZmluZSBSVDU2NjBfQURDX1JfVk9MX1NGVAkJCTEKKworLyogQURDIEJvb3N0IFZvbHVtZSBDb250cm9sICgweDFlKSAqLworI2RlZmluZSBSVDU2NjBfU1RPMV9BRENfTF9CU1RfTUFTSwkJKDB4MyA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX1NUTzFfQURDX0xfQlNUX1NGVAkJMTQKKyNkZWZpbmUgUlQ1NjYwX1NUTzFfQURDX1JfQlNUX01BU0sJCSgweDMgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9TVE8xX0FEQ19SX0JTVF9TRlQJCTEyCisKKy8qIFN0ZXJlbyBBREMgTWl4ZXIgQ29udHJvbCAoMHgyNykgKi8KKyNkZWZpbmUgUlQ1NjYwX01fQURDX0wxCQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9NX0FEQ19MMV9TRlQJCQkxNAorI2RlZmluZSBSVDU2NjBfTV9BRENfTDIJCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjYwX01fQURDX0wyX1NGVAkJCTEzCisjZGVmaW5lIFJUNTY2MF9NX0FEQ19SMQkJCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTY2MF9NX0FEQ19SMV9TRlQJCQk2CisjZGVmaW5lIFJUNTY2MF9NX0FEQ19SMgkJCQkoMHgxIDw8IDUpCisjZGVmaW5lIFJUNTY2MF9NX0FEQ19SMl9TRlQJCQk1CisKKy8qIEFEQyBNaXhlciB0byBEQUMgTWl4ZXIgQ29udHJvbCAoMHgyOSkgKi8KKyNkZWZpbmUgUlQ1NjYwX01fQURDTUlYX0wJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfTV9BRENNSVhfTF9TRlQJCQkxNQorI2RlZmluZSBSVDU2NjBfTV9EQUMxX0wJCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX01fREFDMV9MX1NGVAkJCTE0CisjZGVmaW5lIFJUNTY2MF9NX0FEQ01JWF9SCQkJKDB4MSA8PCA3KQorI2RlZmluZSBSVDU2NjBfTV9BRENNSVhfUl9TRlQJCQk3CisjZGVmaW5lIFJUNTY2MF9NX0RBQzFfUgkJCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTY2MF9NX0RBQzFfUl9TRlQJCQk2CisKKy8qIFN0ZXJlbyBEQUMgTWl4ZXIgQ29udHJvbCAoMHgyYSkgKi8KKyNkZWZpbmUgUlQ1NjYwX01fREFDX0wxCQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9NX0RBQ19MMV9TRlQJCQkxNAorI2RlZmluZSBSVDU2NjBfREFDX0wxX1NUT19MX1ZPTF9NQVNLCQkoMHgxIDw8IDEzKQorI2RlZmluZSBSVDU2NjBfREFDX0wxX1NUT19MX1ZPTF9TRlQJCTEzCisjZGVmaW5lIFJUNTY2MF9NX0RBQ19SMV9TVE9fTAkJCSgweDEgPDwgOSkKKyNkZWZpbmUgUlQ1NjYwX01fREFDX1IxX1NUT19MX1NGVAkJOQorI2RlZmluZSBSVDU2NjBfREFDX1IxX1NUT19MX1ZPTF9NQVNLCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTY2MF9EQUNfUjFfU1RPX0xfVk9MX1NGVAkJOAorI2RlZmluZSBSVDU2NjBfTV9EQUNfUjEJCQkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2NjBfTV9EQUNfUjFfU0ZUCQkJNgorI2RlZmluZSBSVDU2NjBfREFDX1IxX1NUT19SX1ZPTF9NQVNLCQkoMHgxIDw8IDUpCisjZGVmaW5lIFJUNTY2MF9EQUNfUjFfU1RPX1JfVk9MX1NGVAkJNQorI2RlZmluZSBSVDU2NjBfTV9EQUNfTDFfU1RPX1IJCQkoMHgxIDw8IDEpCisjZGVmaW5lIFJUNTY2MF9NX0RBQ19MMV9TVE9fUl9TRlQJCTEKKyNkZWZpbmUgUlQ1NjYwX0RBQ19MMV9TVE9fUl9WT0xfTUFTSwkJKDB4MSkKKyNkZWZpbmUgUlQ1NjYwX0RBQ19MMV9TVE9fUl9WT0xfU0ZUCQkwCisKKy8qIERpZ2l0YWwgSW50ZXJmYWNlIERhdGEgQ29udHJvbCAoMHgyZikgKi8KKyNkZWZpbmUgUlQ1NjYwX0lGMV9EQUNfSU5fU0VMCQkJKDB4MyA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX0lGMV9EQUNfSU5fU0ZUCQkJMTQKKyNkZWZpbmUgUlQ1NjYwX0lGMV9BRENfSU5fU0VMCQkJKDB4MyA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX0lGMV9BRENfSU5fU0ZUCQkJMTIKKworLyogUkVDIExlZnQgTWl4ZXIgQ29udHJvbCAxICgweDNiKSAqLworI2RlZmluZSBSVDU2NjBfR19CU1QzX1JNX0xfTUFTSwkJCSgweDcgPDwgNCkKKyNkZWZpbmUgUlQ1NjYwX0dfQlNUM19STV9MX1NGVAkJCTQKKyNkZWZpbmUgUlQ1NjYwX0dfQlNUMl9STV9MX01BU0sJCQkoMHg3IDw8IDEpCisjZGVmaW5lIFJUNTY2MF9HX0JTVDJfUk1fTF9TRlQJCQkxCisKKy8qIFJFQyBMZWZ0IE1peGVyIENvbnRyb2wgMiAoMHgzYykgKi8KKyNkZWZpbmUgUlQ1NjYwX0dfQlNUMV9STV9MX01BU0sJCQkoMHg3IDw8IDEzKQorI2RlZmluZSBSVDU2NjBfR19CU1QxX1JNX0xfU0ZUCQkJMTMKKyNkZWZpbmUgUlQ1NjYwX0dfT01fTF9STV9MX01BU0sJCQkoMHg3IDw8IDEwKQorI2RlZmluZSBSVDU2NjBfR19PTV9MX1JNX0xfU0ZUCQkJMTAKKyNkZWZpbmUgUlQ1NjYwX01fQlNUM19STV9MCQkJKDB4MSA8PCAzKQorI2RlZmluZSBSVDU2NjBfTV9CU1QzX1JNX0xfU0ZUCQkJMworI2RlZmluZSBSVDU2NjBfTV9CU1QyX1JNX0wJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTY2MF9NX0JTVDJfUk1fTF9TRlQJCQkyCisjZGVmaW5lIFJUNTY2MF9NX0JTVDFfUk1fTAkJCSgweDEgPDwgMSkKKyNkZWZpbmUgUlQ1NjYwX01fQlNUMV9STV9MX1NGVAkJCTEKKyNkZWZpbmUgUlQ1NjYwX01fT01fTF9STV9MCQkJKDB4MSkKKyNkZWZpbmUgUlQ1NjYwX01fT01fTF9STV9MX1NGVAkJCTAKKworLyogUkVDIFJpZ2h0IE1peGVyIENvbnRyb2wgMSAoMHgzZCkgKi8KKyNkZWZpbmUgUlQ1NjYwX0dfQlNUM19STV9SX01BU0sJCQkoMHg3IDw8IDQpCisjZGVmaW5lIFJUNTY2MF9HX0JTVDNfUk1fUl9TRlQJCQk0CisjZGVmaW5lIFJUNTY2MF9HX0JTVDJfUk1fUl9NQVNLCQkJKDB4NyA8PCAxKQorI2RlZmluZSBSVDU2NjBfR19CU1QyX1JNX1JfU0ZUCQkJMQorCisvKiBSRUMgUmlnaHQgTWl4ZXIgQ29udHJvbCAyICgweDNlKSAqLworI2RlZmluZSBSVDU2NjBfR19CU1QxX1JNX1JfTUFTSwkJCSgweDcgPDwgMTMpCisjZGVmaW5lIFJUNTY2MF9HX0JTVDFfUk1fUl9TRlQJCQkxMworI2RlZmluZSBSVDU2NjBfR19PTV9SX1JNX1JfTUFTSwkJCSgweDcgPDwgMTApCisjZGVmaW5lIFJUNTY2MF9HX09NX1JfUk1fUl9TRlQJCQkxMAorI2RlZmluZSBSVDU2NjBfTV9CU1QzX1JNX1IJCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTY2MF9NX0JTVDNfUk1fUl9TRlQJCQkzCisjZGVmaW5lIFJUNTY2MF9NX0JTVDJfUk1fUgkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjYwX01fQlNUMl9STV9SX1NGVAkJCTIKKyNkZWZpbmUgUlQ1NjYwX01fQlNUMV9STV9SCQkJKDB4MSA8PCAxKQorI2RlZmluZSBSVDU2NjBfTV9CU1QxX1JNX1JfU0ZUCQkJMQorI2RlZmluZSBSVDU2NjBfTV9PTV9SX1JNX1IJCQkoMHgxKQorI2RlZmluZSBSVDU2NjBfTV9PTV9SX1JNX1JfU0ZUCQkJMAorCisvKiBMT1VUTUlYIENvbnRyb2wgKDB4NDUpICovCisjZGVmaW5lIFJUNTY2MF9NX0RBQzFfTE0JCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfTV9EQUMxX0xNX1NGVAkJCTE0CisjZGVmaW5lIFJUNTY2MF9NX0xPVk9MX00JCQkoMHgxIDw8IDEzKQorI2RlZmluZSBSVDU2NjBfTV9MT1ZPTF9MTV9TRlQJCQkxMworCisvKiBTUEsgTWl4ZXIgQ29udHJvbCAoMHg0NikgKi8KKyNkZWZpbmUgUlQ1NjYwX0dfQlNUM19TTV9NQVNLCQkJKDB4MyA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX0dfQlNUM19TTV9TRlQJCQkxNAorI2RlZmluZSBSVDU2NjBfR19CU1QxX1NNX01BU0sJCQkoMHgzIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfR19CU1QxX1NNX1NGVAkJCTEyCisjZGVmaW5lIFJUNTY2MF9HX0RBQ2xfU01fTUFTSwkJCSgweDMgPDwgMTApCisjZGVmaW5lIFJUNTY2MF9HX0RBQ2xfU01fU0ZUCQkJMTAKKyNkZWZpbmUgUlQ1NjYwX0dfREFDUl9TTV9NQVNLCQkJKDB4MyA8PCA4KQorI2RlZmluZSBSVDU2NjBfR19EQUNSX1NNX1NGVAkJCTgKKyNkZWZpbmUgUlQ1NjYwX0dfT01fTF9TTV9NQVNLCQkJKDB4MyA8PCA2KQorI2RlZmluZSBSVDU2NjBfR19PTV9MX1NNX1NGVAkJCTYKKyNkZWZpbmUgUlQ1NjYwX01fREFDUl9TTQkJCSgweDEgPDwgNSkKKyNkZWZpbmUgUlQ1NjYwX01fREFDUl9TTV9TRlQJCQk1CisjZGVmaW5lIFJUNTY2MF9NX0JTVDFfU00JCQkoMHgxIDw8IDQpCisjZGVmaW5lIFJUNTY2MF9NX0JTVDFfU01fU0ZUCQkJNAorI2RlZmluZSBSVDU2NjBfTV9CU1QzX1NNCQkJKDB4MSA8PCAzKQorI2RlZmluZSBSVDU2NjBfTV9CU1QzX1NNX1NGVAkJCTMKKyNkZWZpbmUgUlQ1NjYwX01fREFDTF9TTQkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjYwX01fREFDTF9TTV9TRlQJCQkyCisjZGVmaW5lIFJUNTY2MF9NX09NX0xfU00JCQkoMHgxIDw8IDEpCisjZGVmaW5lIFJUNTY2MF9NX09NX0xfU01fU0ZUCQkJMQorCisvKiBTUE9NSVggQ29udHJvbCAoMHg0OCkgKi8KKyNkZWZpbmUgUlQ1NjYwX01fREFDX1JfU1BNCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX01fREFDX1JfU1BNX1NGVAkJCTE0CisjZGVmaW5lIFJUNTY2MF9NX0RBQ19MX1NQTQkJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTY2MF9NX0RBQ19MX1NQTV9TRlQJCQkxMworI2RlZmluZSBSVDU2NjBfTV9TVl9TUE0JCQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX01fU1ZfU1BNX1NGVAkJCTEyCisjZGVmaW5lIFJUNTY2MF9NX0JTVDFfU1BNCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX01fQlNUMV9TUE1fU0ZUCQkJMTEKKworLyogT3V0cHV0IExlZnQgTWl4ZXIgQ29udHJvbCAxICgweDRkKSAqLworI2RlZmluZSBSVDU2NjBfR19CU1QzX09NX0xfTUFTSwkJCSgweDcgPDwgMTMpCisjZGVmaW5lIFJUNTY2MF9HX0JTVDNfT01fTF9TRlQJCQkxMworI2RlZmluZSBSVDU2NjBfR19CU1QyX09NX0xfTUFTSwkJCSgweDcgPDwgMTApCisjZGVmaW5lIFJUNTY2MF9HX0JTVDJfT01fTF9TRlQJCQkxMAorI2RlZmluZSBSVDU2NjBfR19CU1QxX09NX0xfTUFTSwkJCSgweDcgPDwgNykKKyNkZWZpbmUgUlQ1NjYwX0dfQlNUMV9PTV9MX1NGVAkJCTcKKyNkZWZpbmUgUlQ1NjYwX0dfUk1fTF9PTV9MX01BU0sJCQkoMHg3IDw8IDEpCisjZGVmaW5lIFJUNTY2MF9HX1JNX0xfT01fTF9TRlQJCQkxCisKKy8qIE91dHB1dCBMZWZ0IE1peGVyIENvbnRyb2wgMiAoMHg0ZSkgKi8KKyNkZWZpbmUgUlQ1NjYwX0dfREFDX1IxX09NX0xfTUFTSwkJKDB4NyA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYwX0dfREFDX1IxX09NX0xfU0ZUCQkxMAorI2RlZmluZSBSVDU2NjBfR19EQUNfTDFfT01fTF9NQVNLCQkoMHg3IDw8IDcpCisjZGVmaW5lIFJUNTY2MF9HX0RBQ19MMV9PTV9MX1NGVAkJNworCisvKiBPdXRwdXQgTGVmdCBNaXhlciBDb250cm9sIDMgKDB4NGYpICovCisjZGVmaW5lIFJUNTY2MF9NX0JTVDNfT01fTAkJCSgweDEgPDwgNSkKKyNkZWZpbmUgUlQ1NjYwX01fQlNUM19PTV9MX1NGVAkJCTUKKyNkZWZpbmUgUlQ1NjYwX01fQlNUMl9PTV9MCQkJKDB4MSA8PCA0KQorI2RlZmluZSBSVDU2NjBfTV9CU1QyX09NX0xfU0ZUCQkJNAorI2RlZmluZSBSVDU2NjBfTV9CU1QxX09NX0wJCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTY2MF9NX0JTVDFfT01fTF9TRlQJCQkzCisjZGVmaW5lIFJUNTY2MF9NX1JNX0xfT01fTAkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjYwX01fUk1fTF9PTV9MX1NGVAkJCTIKKyNkZWZpbmUgUlQ1NjYwX01fREFDX1JfT01fTAkJCSgweDEgPDwgMSkKKyNkZWZpbmUgUlQ1NjYwX01fREFDX1JfT01fTF9TRlQJCQkxCisjZGVmaW5lIFJUNTY2MF9NX0RBQ19MX09NX0wJCQkoMHgxKQorI2RlZmluZSBSVDU2NjBfTV9EQUNfTF9PTV9MX1NGVAkJCTAKKworLyogT3V0cHV0IFJpZ2h0IE1peGVyIENvbnRyb2wgMSAoMHg1MCkgKi8KKyNkZWZpbmUgUlQ1NjYwX0dfQlNUMl9PTV9SX01BU0sJCQkoMHg3IDw8IDEwKQorI2RlZmluZSBSVDU2NjBfR19CU1QyX09NX1JfU0ZUCQkJMTAKKyNkZWZpbmUgUlQ1NjYwX0dfQlNUMV9PTV9SX01BU0sJCQkoMHg3IDw8IDcpCisjZGVmaW5lIFJUNTY2MF9HX0JTVDFfT01fUl9TRlQJCQk3CisjZGVmaW5lIFJUNTY2MF9HX1JNX1JfT01fUl9NQVNLCQkJKDB4NyA8PCAxKQorI2RlZmluZSBSVDU2NjBfR19STV9SX09NX1JfU0ZUCQkJMQorCisvKiBPdXRwdXQgUmlnaHQgTWl4ZXIgQ29udHJvbCAyICgweDUxKSAqLworI2RlZmluZSBSVDU2NjBfR19EQUNfTF9PTV9SX01BU0sJCSgweDcgPDwgMTApCisjZGVmaW5lIFJUNTY2MF9HX0RBQ19MX09NX1JfU0ZUCQkJMTAKKyNkZWZpbmUgUlQ1NjYwX0dfREFDX1JfT01fUl9NQVNLCQkoMHg3IDw8IDcpCisjZGVmaW5lIFJUNTY2MF9HX0RBQ19SX09NX1JfU0ZUCQkJNworCisvKiBPdXRwdXQgUmlnaHQgTWl4ZXIgQ29udHJvbCAzICgweDUyKSAqLworI2RlZmluZSBSVDU2NjBfTV9CU1QyX09NX1IJCQkoMHgxIDw8IDQpCisjZGVmaW5lIFJUNTY2MF9NX0JTVDJfT01fUl9TRlQJCQk0CisjZGVmaW5lIFJUNTY2MF9NX0JTVDFfT01fUgkJCSgweDEgPDwgMykKKyNkZWZpbmUgUlQ1NjYwX01fQlNUMV9PTV9SX1NGVAkJCTMKKyNkZWZpbmUgUlQ1NjYwX01fUk1fUl9PTV9SCQkJKDB4MSA8PCAyKQorI2RlZmluZSBSVDU2NjBfTV9STV9SX09NX1JfU0ZUCQkJMgorI2RlZmluZSBSVDU2NjBfTV9EQUNfTF9PTV9SCQkJKDB4MSA8PCAxKQorI2RlZmluZSBSVDU2NjBfTV9EQUNfTF9PTV9SX1NGVAkJCTEKKyNkZWZpbmUgUlQ1NjYwX01fREFDX1JfT01fUgkJCSgweDEpCisjZGVmaW5lIFJUNTY2MF9NX0RBQ19SX09NX1JfU0ZUCQkJMAorCisvKiBQb3dlciBNYW5hZ2VtZW50IGZvciBEaWdpdGFsIDEgKDB4NjEpICovCisjZGVmaW5lIFJUNTY2MF9QV1JfSTJTMQkJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfUFdSX0kyUzFfQklUCQkJMTUKKyNkZWZpbmUgUlQ1NjYwX1BXUl9EQUNfTDEJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfUFdSX0RBQ19MMV9CSVQJCQkxMgorI2RlZmluZSBSVDU2NjBfUFdSX0RBQ19SMQkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9QV1JfREFDX1IxX0JJVAkJCTExCisjZGVmaW5lIFJUNTY2MF9QV1JfQURDX0wJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTY2MF9QV1JfQURDX0xfQklUCQkJMgorI2RlZmluZSBSVDU2NjBfUFdSX0FEQ19SCQkJKDB4MSA8PCAxKQorI2RlZmluZSBSVDU2NjBfUFdSX0FEQ19SX0JJVAkJCTEKKyNkZWZpbmUgUlQ1NjYwX1BXUl9DTFNfRAkJCSgweDEpCisjZGVmaW5lIFJUNTY2MF9QV1JfQ0xTX0RfQklUCQkJMAorCisvKiBQb3dlciBNYW5hZ2VtZW50IGZvciBEaWdpdGFsIDIgKDB4NjIpICovCisjZGVmaW5lIFJUNTY2MF9QV1JfQURDX1MxRgkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9QV1JfQURDX1MxRl9CSVQJCQkxNQorI2RlZmluZSBSVDU2NjBfUFdSX0RBQ19TMUYJCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjBfUFdSX0RBQ19TMUZfQklUCQkJMTEKKworLyogUG93ZXIgTWFuYWdlbWVudCBmb3IgQW5hbG9nIDEgKDB4NjMpICovCisjZGVmaW5lIFJUNTY2MF9QV1JfVlJFRjEJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfUFdSX1ZSRUYxX0JJVAkJCTE1CisjZGVmaW5lIFJUNTY2MF9QV1JfRlYxCQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9QV1JfRlYxX0JJVAkJCTE0CisjZGVmaW5lIFJUNTY2MF9QV1JfTUIJCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjYwX1BXUl9NQl9CSVQJCQkxMworI2RlZmluZSBSVDU2NjBfUFdSX0JHCQkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9QV1JfQkdfQklUCQkJMTEKKyNkZWZpbmUgUlQ1NjYwX1BXUl9IUF9MCQkJCSgweDEgPDwgNykKKyNkZWZpbmUgUlQ1NjYwX1BXUl9IUF9MX0JJVAkJCTcKKyNkZWZpbmUgUlQ1NjYwX1BXUl9IUF9SCQkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjYwX1BXUl9IUF9SX0JJVAkJCTYKKyNkZWZpbmUgUlQ1NjYwX1BXUl9IQQkJCQkoMHgxIDw8IDUpCisjZGVmaW5lIFJUNTY2MF9QV1JfSEFfQklUCQkJNQorI2RlZmluZSBSVDU2NjBfUFdSX1ZSRUYyCQkJKDB4MSA8PCA0KQorI2RlZmluZSBSVDU2NjBfUFdSX1ZSRUYyX0JJVAkJCTQKKyNkZWZpbmUgUlQ1NjYwX1BXUl9GVjIJCQkJKDB4MSA8PCAzKQorI2RlZmluZSBSVDU2NjBfUFdSX0ZWMl9CSVQJCQkzCisjZGVmaW5lIFJUNTY2MF9QV1JfTERPMgkJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTY2MF9QV1JfTERPMl9CSVQJCQkyCisKKy8qIFBvd2VyIE1hbmFnZW1lbnQgZm9yIEFuYWxvZyAyICgweDY0KSAqLworI2RlZmluZSBSVDU2NjBfUFdSX0JTVDEJCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX1BXUl9CU1QxX0JJVAkJCTE1CisjZGVmaW5lIFJUNTY2MF9QV1JfQlNUMgkJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfUFdSX0JTVDJfQklUCQkJMTQKKyNkZWZpbmUgUlQ1NjYwX1BXUl9CU1QzCQkJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTY2MF9QV1JfQlNUM19CSVQJCQkxMworI2RlZmluZSBSVDU2NjBfUFdSX01CMQkJCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjBfUFdSX01CMV9CSVQJCQkxMQorI2RlZmluZSBSVDU2NjBfUFdSX01CMgkJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2NjBfUFdSX01CMl9CSVQJCQkxMAorI2RlZmluZSBSVDU2NjBfUFdSX1BMTAkJCQkoMHgxIDw8IDkpCisjZGVmaW5lIFJUNTY2MF9QV1JfUExMX0JJVAkJCTkKKworLyogUG93ZXIgTWFuYWdlbWVudCBmb3IgTWl4ZXIgKDB4NjUpICovCisjZGVmaW5lIFJUNTY2MF9QV1JfT01fTAkJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfUFdSX09NX0xfQklUCQkJMTUKKyNkZWZpbmUgUlQ1NjYwX1BXUl9PTV9SCQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9QV1JfT01fUl9CSVQJCQkxNAorI2RlZmluZSBSVDU2NjBfUFdSX1NNCQkJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTY2MF9QV1JfU01fQklUCQkJMTMKKyNkZWZpbmUgUlQ1NjYwX1BXUl9STV9MCQkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9QV1JfUk1fTF9CSVQJCQkxMQorI2RlZmluZSBSVDU2NjBfUFdSX1JNX1IJCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYwX1BXUl9STV9SX0JJVAkJCTEwCisKKy8qIFBvd2VyIE1hbmFnZW1lbnQgZm9yIFZvbHVtZSAoMHg2NikgKi8KKyNkZWZpbmUgUlQ1NjYwX1BXUl9TVgkJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfUFdSX1NWX0JJVAkJCTE1CisjZGVmaW5lIFJUNTY2MF9QV1JfTFZfTAkJCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjBfUFdSX0xWX0xfQklUCQkJMTEKKyNkZWZpbmUgUlQ1NjYwX1BXUl9MVl9SCQkJCSgweDEgPDwgMTApCisjZGVmaW5lIFJUNTY2MF9QV1JfTFZfUl9CSVQJCQkxMAorCisvKiBJMlMxIEF1ZGlvIFNlcmlhbCBEYXRhIFBvcnQgQ29udHJvbCAoMHg3MCkgKi8KKyNkZWZpbmUgUlQ1NjYwX0kyU19NU19NQVNLCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX0kyU19NU19TRlQJCQkxNQorI2RlZmluZSBSVDU2NjBfSTJTX01TX00JCQkJKDB4MCA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX0kyU19NU19TCQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9JMlNfT19DUF9NQVNLCQkJKDB4MyA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYwX0kyU19PX0NQX1NGVAkJCTEwCisjZGVmaW5lIFJUNTY2MF9JMlNfT19DUF9PRkYJCQkoMHgwIDw8IDEwKQorI2RlZmluZSBSVDU2NjBfSTJTX09fQ1BfVV9MQVcJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2NjBfSTJTX09fQ1BfQV9MQVcJCQkoMHgyIDw8IDEwKQorI2RlZmluZSBSVDU2NjBfSTJTX0lfQ1BfTUFTSwkJCSgweDMgPDwgOCkKKyNkZWZpbmUgUlQ1NjYwX0kyU19JX0NQX1NGVAkJCTgKKyNkZWZpbmUgUlQ1NjYwX0kyU19JX0NQX09GRgkJCSgweDAgPDwgOCkKKyNkZWZpbmUgUlQ1NjYwX0kyU19JX0NQX1VfTEFXCQkJKDB4MSA8PCA4KQorI2RlZmluZSBSVDU2NjBfSTJTX0lfQ1BfQV9MQVcJCQkoMHgyIDw8IDgpCisjZGVmaW5lIFJUNTY2MF9JMlNfQlBfTUFTSwkJCSgweDEgPDwgNykKKyNkZWZpbmUgUlQ1NjYwX0kyU19CUF9TRlQJCQk3CisjZGVmaW5lIFJUNTY2MF9JMlNfQlBfTk9SCQkJKDB4MCA8PCA3KQorI2RlZmluZSBSVDU2NjBfSTJTX0JQX0lOVgkJCSgweDEgPDwgNykKKyNkZWZpbmUgUlQ1NjYwX0kyU19ETF9NQVNLCQkJKDB4MyA8PCAyKQorI2RlZmluZSBSVDU2NjBfSTJTX0RMX1NGVAkJCTIKKyNkZWZpbmUgUlQ1NjYwX0kyU19ETF8xNgkJCSgweDAgPDwgMikKKyNkZWZpbmUgUlQ1NjYwX0kyU19ETF8yMAkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjYwX0kyU19ETF8yNAkJCSgweDIgPDwgMikKKyNkZWZpbmUgUlQ1NjYwX0kyU19ETF84CQkJCSgweDMgPDwgMikKKyNkZWZpbmUgUlQ1NjYwX0kyU19ERl9NQVNLCQkJKDB4MykKKyNkZWZpbmUgUlQ1NjYwX0kyU19ERl9TRlQJCQkwCisjZGVmaW5lIFJUNTY2MF9JMlNfREZfSTJTCQkJKDB4MCkKKyNkZWZpbmUgUlQ1NjYwX0kyU19ERl9MRUZUCQkJKDB4MSkKKyNkZWZpbmUgUlQ1NjYwX0kyU19ERl9QQ01fQQkJCSgweDIpCisjZGVmaW5lIFJUNTY2MF9JMlNfREZfUENNX0IJCQkoMHgzKQorCisvKiBBREMvREFDIENsb2NrIENvbnRyb2wgMSAoMHg3MykgKi8KKyNkZWZpbmUgUlQ1NjYwX0kyU19CQ0xLX01TMV9NQVNLCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfSTJTX0JDTEtfTVMxX1NGVAkJCTE1CisjZGVmaW5lIFJUNTY2MF9JMlNfQkNMS19NUzFfMzIJCQkoMHgwIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfSTJTX0JDTEtfTVMxXzY0CQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX0kyU19QRDFfTUFTSwkJCSgweDcgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9JMlNfUEQxX1NGVAkJCTEyCisjZGVmaW5lIFJUNTY2MF9JMlNfUEQxXzEJCQkoMHgwIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfSTJTX1BEMV8yCQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX0kyU19QRDFfMwkJCSgweDIgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9JMlNfUEQxXzQJCQkoMHgzIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfSTJTX1BEMV82CQkJKDB4NCA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX0kyU19QRDFfOAkJCSgweDUgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9JMlNfUEQxXzEyCQkJKDB4NiA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX0kyU19QRDFfMTYJCQkoMHg3IDw8IDEyKQorI2RlZmluZSBSVDU2NjBfREFDX09TUl9NQVNLCQkJKDB4MyA8PCAyKQorI2RlZmluZSBSVDU2NjBfREFDX09TUl9TRlQJCQkyCisjZGVmaW5lIFJUNTY2MF9EQUNfT1NSXzEyOAkJCSgweDAgPDwgMikKKyNkZWZpbmUgUlQ1NjYwX0RBQ19PU1JfNjQJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTY2MF9EQUNfT1NSXzMyCQkJKDB4MiA8PCAyKQorI2RlZmluZSBSVDU2NjBfREFDX09TUl8xNgkJCSgweDMgPDwgMikKKyNkZWZpbmUgUlQ1NjYwX0FEQ19PU1JfTUFTSwkJCSgweDMpCisjZGVmaW5lIFJUNTY2MF9BRENfT1NSX1NGVAkJCTAKKyNkZWZpbmUgUlQ1NjYwX0FEQ19PU1JfMTI4CQkJKDB4MCkKKyNkZWZpbmUgUlQ1NjYwX0FEQ19PU1JfNjQJCQkoMHgxKQorI2RlZmluZSBSVDU2NjBfQURDX09TUl8zMgkJCSgweDIpCisjZGVmaW5lIFJUNTY2MF9BRENfT1NSXzE2CQkJKDB4MykKKworLyogQURDL0RBQyBDbG9jayBDb250cm9sIDIgKDB4NzQpICovCisjZGVmaW5lIFJUNTY2MF9SRVNFVF9BREYJCQkoMHgxIDw8IDEzKQorI2RlZmluZSBSVDU2NjBfUkVTRVRfQURGX1NGVAkJCTEzCisjZGVmaW5lIFJUNTY2MF9SRVNFVF9EQUYJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfUkVTRVRfREFGX1NGVAkJCTEyCisjZGVmaW5lIFJUNTY2MF9EQUhQRl9FTgkJCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjBfREFIUEZfRU5fU0ZUCQkJMTEKKyNkZWZpbmUgUlQ1NjYwX0FESFBGX0VOCQkJCSgweDEgPDwgMTApCisjZGVmaW5lIFJUNTY2MF9BREhQRl9FTl9TRlQJCQkxMAorCisvKiBEaWdpdGFsIE1pY3JvcGhvbmUgQ29udHJvbCAoMHg3NSkgKi8KKyNkZWZpbmUgUlQ1NjYwX0RNSUNfMV9FTl9NQVNLCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX0RNSUNfMV9FTl9TRlQJCQkxNQorI2RlZmluZSBSVDU2NjBfRE1JQ18xX0RJUwkJCSgweDAgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9ETUlDXzFfRU4JCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfRE1JQ18xTF9MSF9NQVNLCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjYwX0RNSUNfMUxfTEhfU0ZUCQkJMTMKKyNkZWZpbmUgUlQ1NjYwX0RNSUNfMUxfTEhfUklTSU5HCQkoMHgwIDw8IDEzKQorI2RlZmluZSBSVDU2NjBfRE1JQ18xTF9MSF9GQUxMSU5HCQkoMHgxIDw8IDEzKQorI2RlZmluZSBSVDU2NjBfRE1JQ18xUl9MSF9NQVNLCQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX0RNSUNfMVJfTEhfU0ZUCQkJMTIKKyNkZWZpbmUgUlQ1NjYwX0RNSUNfMVJfTEhfUklTSU5HCQkoMHgwIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfRE1JQ18xUl9MSF9GQUxMSU5HCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfU0VMX0RNSUNfREFUQV9NQVNLCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjBfU0VMX0RNSUNfREFUQV9TRlQJCTExCisjZGVmaW5lIFJUNTY2MF9TRUxfRE1JQ19EQVRBX0dQSU8yCQkoMHgwIDw8IDExKQorI2RlZmluZSBSVDU2NjBfU0VMX0RNSUNfREFUQV9JTjFQCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjBfRE1JQ19DTEtfTUFTSwkJCSgweDcgPDwgNSkKKyNkZWZpbmUgUlQ1NjYwX0RNSUNfQ0xLX1NGVAkJCTUKKworLyogR2xvYmFsIENsb2NrIENvbnRyb2wgKDB4ODApICovCisjZGVmaW5lIFJUNTY2MF9TQ0xLX1NSQ19NQVNLCQkJKDB4MyA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX1NDTEtfU1JDX1NGVAkJCTE0CisjZGVmaW5lIFJUNTY2MF9TQ0xLX1NSQ19NQ0xLCQkJKDB4MCA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX1NDTEtfU1JDX1BMTDEJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfU0NMS19TUkNfUkNDTEsJCQkoMHgyIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfUExMMV9TUkNfTUFTSwkJCSgweDMgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9QTEwxX1NSQ19TRlQJCQkxMgorI2RlZmluZSBSVDU2NjBfUExMMV9TUkNfTUNMSwkJCSgweDAgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9QTEwxX1NSQ19CQ0xLMQkJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9QTEwxX1NSQ19SQ0NMSwkJCSgweDIgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9QTEwxX1BEX01BU0sJCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTY2MF9QTEwxX1BEX1NGVAkJCTMKKyNkZWZpbmUgUlQ1NjYwX1BMTDFfUERfMQkJCSgweDAgPDwgMykKKyNkZWZpbmUgUlQ1NjYwX1BMTDFfUERfMgkJCSgweDEgPDwgMykKKworI2RlZmluZSBSVDU2NjBfUExMX0lOUF9NQVgJCQk0MDAwMDAwMAorI2RlZmluZSBSVDU2NjBfUExMX0lOUF9NSU4JCQkyNTYwMDAKKy8qIFBMTCBNL04vSyBDb2RlIENvbnRyb2wgMSAoMHg4MSkgKi8KKyNkZWZpbmUgUlQ1NjYwX1BMTF9OX01BWAkJCTB4MWZmCisjZGVmaW5lIFJUNTY2MF9QTExfTl9NQVNLCQkJKFJUNTY2MF9QTExfTl9NQVggPDwgNykKKyNkZWZpbmUgUlQ1NjYwX1BMTF9OX1NGVAkJCTcKKyNkZWZpbmUgUlQ1NjYwX1BMTF9LX01BWAkJCTB4MWYKKyNkZWZpbmUgUlQ1NjYwX1BMTF9LX01BU0sJCQkoUlQ1NjYwX1BMTF9LX01BWCkKKyNkZWZpbmUgUlQ1NjYwX1BMTF9LX1NGVAkJCTAKKworLyogUExMIE0vTi9LIENvZGUgQ29udHJvbCAyICgweDgyKSAqLworI2RlZmluZSBSVDU2NjBfUExMX01fTUFYCQkJMHhmCisjZGVmaW5lIFJUNTY2MF9QTExfTV9NQVNLCQkJKFJUNTY2MF9QTExfTV9NQVggPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9QTExfTV9TRlQJCQkxMgorI2RlZmluZSBSVDU2NjBfUExMX01fQlAJCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX1BMTF9NX0JQX1NGVAkJCTExCisKKy8qIENsYXNzIEQgT3ZlciBDdXJyZW50IENvbnRyb2wgKDB4OGMpICovCisjZGVmaW5lIFJUNTY2MF9DTFNEX09DX01BU0sJCQkoMHgxIDw8IDkpCisjZGVmaW5lIFJUNTY2MF9DTFNEX09DX1NGVAkJCTkKKyNkZWZpbmUgUlQ1NjYwX0NMU0RfT0NfUFUJCQkoMHgwIDw8IDkpCisjZGVmaW5lIFJUNTY2MF9DTFNEX09DX1BECQkJKDB4MSA8PCA5KQorI2RlZmluZSBSVDU2NjBfQVVUT19QRF9NQVNLCQkJKDB4MSA8PCA4KQorI2RlZmluZSBSVDU2NjBfQVVUT19QRF9TRlQJCQk4CisjZGVmaW5lIFJUNTY2MF9BVVRPX1BEX0RJUwkJCSgweDAgPDwgOCkKKyNkZWZpbmUgUlQ1NjYwX0FVVE9fUERfRU4JCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTY2MF9DTFNEX09DX1RIX01BU0sJCQkoMHgzZikKKyNkZWZpbmUgUlQ1NjYwX0NMU0RfT0NfVEhfU0ZUCQkJMAorCisvKiBDbGFzcyBEIE91dHB1dCBDb250cm9sICgweDhkKSAqLworI2RlZmluZSBSVDU2NjBfQ0xTRF9SQVRJT19NQVNLCQkJKDB4ZiA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX0NMU0RfUkFUSU9fU0ZUCQkJMTIKKworLyogTG91dCBBbXAgQ29udHJvbCAxICgweDhlKSAqLworI2RlZmluZSBSVDU2NjBfTE9VVF9DT19NQVNLCQkJKDB4MSA8PCA0KQorI2RlZmluZSBSVDU2NjBfTE9VVF9DT19TRlQJCQk0CisjZGVmaW5lIFJUNTY2MF9MT1VUX0NPX0RJUwkJCSgweDAgPDwgNCkKKyNkZWZpbmUgUlQ1NjYwX0xPVVRfQ09fRU4JCQkoMHgxIDw8IDQpCisjZGVmaW5lIFJUNTY2MF9MT1VUX0NCX01BU0sJCQkoMHgxKQorI2RlZmluZSBSVDU2NjBfTE9VVF9DQl9TRlQJCQkwCisjZGVmaW5lIFJUNTY2MF9MT1VUX0NCX1BECQkJKDB4MCkKKyNkZWZpbmUgUlQ1NjYwX0xPVVRfQ0JfUFUJCQkoMHgxKQorCisvKiBTUEtWREQgZGV0ZWN0aW9uIGNvbnRyb2wgKDB4OTIpICovCisjZGVmaW5lIFJUNTY2MF9TUEtWRERfREVUX01BU0sJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfU1BLVkREX0RFVF9TRlQJCQkxNQorI2RlZmluZSBSVDU2NjBfU1BLVkREX0RFVF9ESVMJCQkoMHgwIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfU1BLVkREX0RFVF9FTgkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9TUEtfQUdfTUFTSwkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9TUEtfQUdfU0ZUCQkJMTQKKyNkZWZpbmUgUlQ1NjYwX1NQS19BR19ESVMJCQkoMHgwIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfU1BLX0FHX0VOCQkJKDB4MSA8PCAxNCkKKworLyogTWljYmlhcyBDb250cm9sICgweDkzKSAqLworI2RlZmluZSBSVDU2NjBfTUlDMV9CU19NQVNLCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX01JQzFfQlNfU0ZUCQkJMTUKKyNkZWZpbmUgUlQ1NjYwX01JQzFfQlNfOUFWCQkJKDB4MCA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX01JQzFfQlNfNzVBVgkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9NSUMyX0JTX01BU0sJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfTUlDMl9CU19TRlQJCQkxNAorI2RlZmluZSBSVDU2NjBfTUlDMl9CU185QVYJCQkoMHgwIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfTUlDMl9CU183NUFWCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX01JQzFfT1ZDRF9NQVNLCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX01JQzFfT1ZDRF9TRlQJCQkxMQorI2RlZmluZSBSVDU2NjBfTUlDMV9PVkNEX0RJUwkJCSgweDAgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9NSUMxX09WQ0RfRU4JCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjBfTUlDMV9PVlRIX01BU0sJCQkoMHgzIDw8IDkpCisjZGVmaW5lIFJUNTY2MF9NSUMxX09WVEhfU0ZUCQkJOQorI2RlZmluZSBSVDU2NjBfTUlDMV9PVlRIXzYwMFVBCQkJKDB4MCA8PCA5KQorI2RlZmluZSBSVDU2NjBfTUlDMV9PVlRIXzE1MDBVQQkJCSgweDEgPDwgOSkKKyNkZWZpbmUgUlQ1NjYwX01JQzFfT1ZUSF8yMDAwVUEJCQkoMHgyIDw8IDkpCisjZGVmaW5lIFJUNTY2MF9NSUMyX09WQ0RfTUFTSwkJCSgweDEgPDwgOCkKKyNkZWZpbmUgUlQ1NjYwX01JQzJfT1ZDRF9TRlQJCQk4CisjZGVmaW5lIFJUNTY2MF9NSUMyX09WQ0RfRElTCQkJKDB4MCA8PCA4KQorI2RlZmluZSBSVDU2NjBfTUlDMl9PVkNEX0VOCQkJKDB4MSA8PCA4KQorI2RlZmluZSBSVDU2NjBfTUlDMl9PVlRIX01BU0sJCQkoMHgzIDw8IDYpCisjZGVmaW5lIFJUNTY2MF9NSUMyX09WVEhfU0ZUCQkJNgorI2RlZmluZSBSVDU2NjBfTUlDMl9PVlRIXzYwMFVBCQkJKDB4MCA8PCA2KQorI2RlZmluZSBSVDU2NjBfTUlDMl9PVlRIXzE1MDBVQQkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjYwX01JQzJfT1ZUSF8yMDAwVUEJCQkoMHgyIDw8IDYpCisjZGVmaW5lIFJUNTY2MF9QV1JfQ0xLMjVNX01BU0sJCQkoMHgxIDw8IDQpCisjZGVmaW5lIFJUNTY2MF9QV1JfQ0xLMjVNX1NGVAkJCTQKKyNkZWZpbmUgUlQ1NjYwX1BXUl9DTEsyNU1fUEQJCQkoMHgwIDw8IDQpCisjZGVmaW5lIFJUNTY2MF9QV1JfQ0xLMjVNX1BVCQkJKDB4MSA8PCA0KQorCisvKiBFUSBDb250cm9sIDEgKDB4YjApICovCisjZGVmaW5lIFJUNTY2MF9FUV9TUkNfTUFTSwkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9FUV9TUkNfU0ZUCQkJMTUKKyNkZWZpbmUgUlQ1NjYwX0VRX1NSQ19EQUMJCQkoMHgwIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfRVFfU1JDX0FEQwkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9FUV9VUEQJCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX0VRX1VQRF9CSVQJCQkxNAorCisvKiBKYWNrIERldGVjdCBDb250cm9sICgweGJiKSAqLworI2RlZmluZSBSVDU2NjBfSkRfTUFTSwkJCQkoMHgzIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfSkRfU0ZUCQkJCTE0CisjZGVmaW5lIFJUNTY2MF9KRF9ESVMJCQkJKDB4MCA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX0pEX0dQSU8xCQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9KRF9HUElPMgkJCQkoMHgyIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfSkRfTE9VVF9NQVNLCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX0pEX0xPVVRfU0ZUCQkJMTEKKyNkZWZpbmUgUlQ1NjYwX0pEX0xPVVRfRElTCQkJKDB4MCA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX0pEX0xPVVRfRU4JCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjBfSkRfTE9VVF9UUkdfTUFTSwkJCSgweDEgPDwgMTApCisjZGVmaW5lIFJUNTY2MF9KRF9MT1VUX1RSR19TRlQJCQkxMAorI2RlZmluZSBSVDU2NjBfSkRfTE9VVF9UUkdfTE8JCQkoMHgwIDw8IDEwKQorI2RlZmluZSBSVDU2NjBfSkRfTE9VVF9UUkdfSEkJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2NjBfSkRfU1BPX01BU0sJCQkoMHgxIDw8IDkpCisjZGVmaW5lIFJUNTY2MF9KRF9TUE9fU0ZUCQkJOQorI2RlZmluZSBSVDU2NjBfSkRfU1BPX0RJUwkJCSgweDAgPDwgOSkKKyNkZWZpbmUgUlQ1NjYwX0pEX1NQT19FTgkJCSgweDEgPDwgOSkKKyNkZWZpbmUgUlQ1NjYwX0pEX1NQT19UUkdfTUFTSwkJCSgweDEgPDwgOCkKKyNkZWZpbmUgUlQ1NjYwX0pEX1NQT19UUkdfU0ZUCQkJOAorI2RlZmluZSBSVDU2NjBfSkRfU1BPX1RSR19MTwkJCSgweDAgPDwgOCkKKyNkZWZpbmUgUlQ1NjYwX0pEX1NQT19UUkdfSEkJCQkoMHgxIDw8IDgpCisKKy8qIElSUSBDb250cm9sIDEgKDB4YmQpICovCisjZGVmaW5lIFJUNTY2MF9JUlFfSkRfTUFTSwkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9JUlFfSkRfU0ZUCQkJMTUKKyNkZWZpbmUgUlQ1NjYwX0lSUV9KRF9CUAkJCSgweDAgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9JUlFfSkRfTk9SCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX0lSUV9PVF9NQVNLCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX0lSUV9PVF9TRlQJCQkxNAorI2RlZmluZSBSVDU2NjBfSVJRX09UX0JQCQkJKDB4MCA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX0lSUV9PVF9OT1IJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfSkRfU1RLWV9NQVNLCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjYwX0pEX1NUS1lfU0ZUCQkJMTMKKyNkZWZpbmUgUlQ1NjYwX0pEX1NUS1lfRElTCQkJKDB4MCA8PCAxMykKKyNkZWZpbmUgUlQ1NjYwX0pEX1NUS1lfRU4JCQkoMHgxIDw8IDEzKQorI2RlZmluZSBSVDU2NjBfT1RfU1RLWV9NQVNLCQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX09UX1NUS1lfU0ZUCQkJMTIKKyNkZWZpbmUgUlQ1NjYwX09UX1NUS1lfRElTCQkJKDB4MCA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX09UX1NUS1lfRU4JCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfSkRfUF9NQVNLCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX0pEX1BfU0ZUCQkJCTExCisjZGVmaW5lIFJUNTY2MF9KRF9QX05PUgkJCQkoMHgwIDw8IDExKQorI2RlZmluZSBSVDU2NjBfSkRfUF9JTlYJCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX09UX1BfTUFTSwkJCSgweDEgPDwgMTApCisjZGVmaW5lIFJUNTY2MF9PVF9QX1NGVAkJCQkxMAorI2RlZmluZSBSVDU2NjBfT1RfUF9OT1IJCQkJKDB4MCA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYwX09UX1BfSU5WCQkJCSgweDEgPDwgMTApCisKKy8qIElSUSBDb250cm9sIDIgKDB4YmUpICovCisjZGVmaW5lIFJUNTY2MF9JUlFfTUIxX09DX01BU0sJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfSVJRX01CMV9PQ19TRlQJCQkxNQorI2RlZmluZSBSVDU2NjBfSVJRX01CMV9PQ19CUAkJCSgweDAgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9JUlFfTUIxX09DX05PUgkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9JUlFfTUIyX09DX01BU0sJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfSVJRX01CMl9PQ19TRlQJCQkxNAorI2RlZmluZSBSVDU2NjBfSVJRX01CMl9PQ19CUAkJCSgweDAgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9JUlFfTUIyX09DX05PUgkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9NQjFfT0NfU1RLWV9NQVNLCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX01CMV9PQ19TVEtZX1NGVAkJCTExCisjZGVmaW5lIFJUNTY2MF9NQjFfT0NfU1RLWV9ESVMJCQkoMHgwIDw8IDExKQorI2RlZmluZSBSVDU2NjBfTUIxX09DX1NUS1lfRU4JCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjBfTUIyX09DX1NUS1lfTUFTSwkJCSgweDEgPDwgMTApCisjZGVmaW5lIFJUNTY2MF9NQjJfT0NfU1RLWV9TRlQJCQkxMAorI2RlZmluZSBSVDU2NjBfTUIyX09DX1NUS1lfRElTCQkJKDB4MCA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYwX01CMl9PQ19TVEtZX0VOCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYwX01CMV9PQ19QX01BU0sJCQkoMHgxIDw8IDcpCisjZGVmaW5lIFJUNTY2MF9NQjFfT0NfUF9TRlQJCQk3CisjZGVmaW5lIFJUNTY2MF9NQjFfT0NfUF9OT1IJCQkoMHgwIDw8IDcpCisjZGVmaW5lIFJUNTY2MF9NQjFfT0NfUF9JTlYJCQkoMHgxIDw8IDcpCisjZGVmaW5lIFJUNTY2MF9NQjJfT0NfUF9NQVNLCQkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2NjBfTUIyX09DX1BfU0ZUCQkJNgorI2RlZmluZSBSVDU2NjBfTUIyX09DX1BfTk9SCQkJKDB4MCA8PCA2KQorI2RlZmluZSBSVDU2NjBfTUIyX09DX1BfSU5WCQkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2NjBfTUIxX09DX0NMUgkJCSgweDEgPDwgMykKKyNkZWZpbmUgUlQ1NjYwX01CMV9PQ19DTFJfU0ZUCQkJMworI2RlZmluZSBSVDU2NjBfTUIyX09DX0NMUgkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjYwX01CMl9PQ19DTFJfU0ZUCQkJMgorCisvKiBHUElPIENvbnRyb2wgMSAoMHhjMCkgKi8KKyNkZWZpbmUgUlQ1NjYwX0dQMl9QSU5fTUFTSwkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9HUDJfUElOX1NGVAkJCTE0CisjZGVmaW5lIFJUNTY2MF9HUDJfUElOX0dQSU8yCQkJKDB4MCA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX0dQMl9QSU5fRE1JQzFfU0RBCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfR1AxX1BJTl9NQVNLCQkJKDB4MyA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX0dQMV9QSU5fU0ZUCQkJMTIKKyNkZWZpbmUgUlQ1NjYwX0dQMV9QSU5fR1BJTzEJCQkoMHgwIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfR1AxX1BJTl9ETUlDMV9TQ0wJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9HUDFfUElOX0lSUQkJCSgweDIgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9HUElPX01fTUFTSwkJCSgweDEgPDwgOSkKKyNkZWZpbmUgUlQ1NjYwX0dQSU9fTV9TRlQJCQk5CisjZGVmaW5lIFJUNTY2MF9HUElPX01fRkxUCQkJKDB4MCA8PCA5KQorI2RlZmluZSBSVDU2NjBfR1BJT19NX1BICQkJKDB4MSA8PCA5KQorCisvKiBHUElPIENvbnRyb2wgMyAoMHhjMikgKi8KKyNkZWZpbmUgUlQ1NjYwX0dQMl9QRl9NQVNLCQkJKDB4MSA8PCA1KQorI2RlZmluZSBSVDU2NjBfR1AyX1BGX1NGVAkJCTUKKyNkZWZpbmUgUlQ1NjYwX0dQMl9QRl9JTgkJCSgweDAgPDwgNSkKKyNkZWZpbmUgUlQ1NjYwX0dQMl9QRl9PVVQJCQkoMHgxIDw8IDUpCisjZGVmaW5lIFJUNTY2MF9HUDJfT1VUX01BU0sJCQkoMHgxIDw8IDQpCisjZGVmaW5lIFJUNTY2MF9HUDJfT1VUX1NGVAkJCTQKKyNkZWZpbmUgUlQ1NjYwX0dQMl9PVVRfTE8JCQkoMHgwIDw8IDQpCisjZGVmaW5lIFJUNTY2MF9HUDJfT1VUX0hJCQkJKDB4MSA8PCA0KQorI2RlZmluZSBSVDU2NjBfR1AyX1BfTUFTSwkJCSgweDEgPDwgMykKKyNkZWZpbmUgUlQ1NjYwX0dQMl9QX1NGVAkJCTMKKyNkZWZpbmUgUlQ1NjYwX0dQMl9QX05PUgkJCSgweDAgPDwgMykKKyNkZWZpbmUgUlQ1NjYwX0dQMl9QX0lOVgkJCSgweDEgPDwgMykKKyNkZWZpbmUgUlQ1NjYwX0dQMV9QRl9NQVNLCQkJKDB4MSA8PCAyKQorI2RlZmluZSBSVDU2NjBfR1AxX1BGX1NGVAkJCTIKKyNkZWZpbmUgUlQ1NjYwX0dQMV9QRl9JTgkJCSgweDAgPDwgMikKKyNkZWZpbmUgUlQ1NjYwX0dQMV9QRl9PVVQJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTY2MF9HUDFfT1VUX01BU0sJCQkoMHgxIDw8IDEpCisjZGVmaW5lIFJUNTY2MF9HUDFfT1VUX1NGVAkJCTEKKyNkZWZpbmUgUlQ1NjYwX0dQMV9PVVRfTE8JCQkoMHgwIDw8IDEpCisjZGVmaW5lIFJUNTY2MF9HUDFfT1VUX0hJCQkJKDB4MSA8PCAxKQorI2RlZmluZSBSVDU2NjBfR1AxX1BfTUFTSwkJCSgweDEpCisjZGVmaW5lIFJUNTY2MF9HUDFfUF9TRlQJCQkwCisjZGVmaW5lIFJUNTY2MF9HUDFfUF9OT1IJCQkoMHgwKQorI2RlZmluZSBSVDU2NjBfR1AxX1BfSU5WCQkJKDB4MSkKKworLyogU29mdCB2b2x1bWUgYW5kIHplcm8gY3Jvc3MgY29udHJvbCAxICgweGQ5KSAqLworI2RlZmluZSBSVDU2NjBfU1ZfTUFTSwkJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfU1ZfU0ZUCQkJCTE1CisjZGVmaW5lIFJUNTY2MF9TVl9ESVMJCQkJKDB4MCA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX1NWX0VOCQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9TUE9fU1ZfTUFTSwkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9TUE9fU1ZfU0ZUCQkJMTQKKyNkZWZpbmUgUlQ1NjYwX1NQT19TVl9ESVMJCQkoMHgwIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfU1BPX1NWX0VOCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX09VVF9TVl9NQVNLCQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX09VVF9TVl9TRlQJCQkxMgorI2RlZmluZSBSVDU2NjBfT1VUX1NWX0RJUwkJCSgweDAgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9PVVRfU1ZfRU4JCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfWkNEX0RJR19NQVNLCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX1pDRF9ESUdfU0ZUCQkJMTEKKyNkZWZpbmUgUlQ1NjYwX1pDRF9ESUdfRElTCQkJKDB4MCA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX1pDRF9ESUdfRU4JCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjBfWkNEX01BU0sJCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYwX1pDRF9TRlQJCQkJMTAKKyNkZWZpbmUgUlQ1NjYwX1pDRF9QRAkJCQkoMHgwIDw8IDEwKQorI2RlZmluZSBSVDU2NjBfWkNEX1BVCQkJCSgweDEgPDwgMTApCisjZGVmaW5lIFJUNTY2MF9TVl9ETFlfTUFTSwkJCSgweGYpCisjZGVmaW5lIFJUNTY2MF9TVl9ETFlfU0ZUCQkJMAorCisvKiBTb2Z0IHZvbHVtZSBhbmQgemVybyBjcm9zcyBjb250cm9sIDIgKDB4ZGEpICovCisjZGVmaW5lIFJUNTY2MF9aQ0RfU1BPX01BU0sJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfWkNEX1NQT19TRlQJCQkxNQorI2RlZmluZSBSVDU2NjBfWkNEX1NQT19ESVMJCQkoMHgwIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfWkNEX1NQT19FTgkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9aQ0RfT01SX01BU0sJCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTY2MF9aQ0RfT01SX1NGVAkJCTgKKyNkZWZpbmUgUlQ1NjYwX1pDRF9PTVJfRElTCQkJKDB4MCA8PCA4KQorI2RlZmluZSBSVDU2NjBfWkNEX09NUl9FTgkJCSgweDEgPDwgOCkKKyNkZWZpbmUgUlQ1NjYwX1pDRF9PTUxfTUFTSwkJCSgweDEgPDwgNykKKyNkZWZpbmUgUlQ1NjYwX1pDRF9PTUxfU0ZUCQkJNworI2RlZmluZSBSVDU2NjBfWkNEX09NTF9ESVMJCQkoMHgwIDw8IDcpCisjZGVmaW5lIFJUNTY2MF9aQ0RfT01MX0VOCQkJKDB4MSA8PCA3KQorI2RlZmluZSBSVDU2NjBfWkNEX1NQTV9NQVNLCQkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2NjBfWkNEX1NQTV9TRlQJCQk2CisjZGVmaW5lIFJUNTY2MF9aQ0RfU1BNX0RJUwkJCSgweDAgPDwgNikKKyNkZWZpbmUgUlQ1NjYwX1pDRF9TUE1fRU4JCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTY2MF9aQ0RfUk1SX01BU0sJCQkoMHgxIDw8IDUpCisjZGVmaW5lIFJUNTY2MF9aQ0RfUk1SX1NGVAkJCTUKKyNkZWZpbmUgUlQ1NjYwX1pDRF9STVJfRElTCQkJKDB4MCA8PCA1KQorI2RlZmluZSBSVDU2NjBfWkNEX1JNUl9FTgkJCSgweDEgPDwgNSkKKyNkZWZpbmUgUlQ1NjYwX1pDRF9STUxfTUFTSwkJCSgweDEgPDwgNCkKKyNkZWZpbmUgUlQ1NjYwX1pDRF9STUxfU0ZUCQkJNAorI2RlZmluZSBSVDU2NjBfWkNEX1JNTF9ESVMJCQkoMHgwIDw8IDQpCisjZGVmaW5lIFJUNTY2MF9aQ0RfUk1MX0VOCQkJKDB4MSA8PCA0KQorCisvKiBHZW5lcmFsIENvbnRyb2wgMSAoMHhmYSkgKi8KKyNkZWZpbmUgUlQ1NjYwX1BXUl9WUkVGX0hQCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX1BXUl9WUkVGX0hQX1NGVAkJCTExCisjZGVmaW5lIFJUNTY2MF9ESUdfR0FURV9DVFJMCQkJKDB4MSkKKyNkZWZpbmUgUlQ1NjYwX0RJR19HQVRFX0NUUkxfU0ZUCQkwCisKKy8qIFN5c3RlbSBDbG9jayBTb3VyY2UgKi8KKyNkZWZpbmUgUlQ1NjYwX1NDTEtfU19NQ0xLCQkJMAorI2RlZmluZSBSVDU2NjBfU0NMS19TX1BMTDEJCQkxCisjZGVmaW5lIFJUNTY2MF9TQ0xLX1NfUkNDTEsJCQkyCisKKy8qIFBMTDEgU291cmNlICovCisjZGVmaW5lIFJUNTY2MF9QTEwxX1NfTUNMSwkJCTAKKyNkZWZpbmUgUlQ1NjYwX1BMTDFfU19CQ0xLCQkJMQorCitlbnVtIHsKKwlSVDU2NjBfQUlGMSwKKwlSVDU2NjBfQUlGUywKK307CisKK3N0cnVjdCBydDU2NjBfcHJpdiB7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCBydDU2NjBfcGxhdGZvcm1fZGF0YSBwZGF0YTsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJc3RydWN0IGNsayAqbWNsazsKKworCWludCBzeXNjbGs7CisJaW50IHN5c2Nsa19zcmM7CisJaW50IGxyY2tbUlQ1NjYwX0FJRlNdOworCWludCBiY2xrW1JUNTY2MF9BSUZTXTsKKwlpbnQgbWFzdGVyW1JUNTY2MF9BSUZTXTsKKworCWludCBwbGxfc3JjOworCWludCBwbGxfaW47CisJaW50IHBsbF9vdXQ7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjYzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY2My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYTE4ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY2My5jCkBAIC0wLDAgKzEsMzIxOCBAQAorLyoKKyAqIHJ0NTY2My5jICAtLSAgUlQ1NjY4L1JUNTY2MyBBTFNBIFNvQyBhdWRpbyBjb2RlYyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxNiBSZWFsdGVrIFNlbWljb25kdWN0b3IgQ29ycC4KKyAqIEF1dGhvcjogSmFjayBZdSA8amFjay55dUByZWFsdGVrLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisKKyNpbmNsdWRlICJydDU2NjMuaCIKKyNpbmNsdWRlICJybDYyMzEuaCIKKworI2RlZmluZSBSVDU2NjhfREVWSUNFX0lEIDB4NjQ1MQorI2RlZmluZSBSVDU2NjNfREVWSUNFX0lEIDB4NjQwNgorCitlbnVtIHsKKwlDT0RFQ19UWVBFX1JUNTY2OCwKKwlDT0RFQ19UWVBFX1JUNTY2MywKK307CisKK3N0cnVjdCBydDU2NjNfcHJpdiB7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGphY2tfZGV0ZWN0X3dvcms7CisJc3RydWN0IHNuZF9zb2NfamFjayAqaHNfamFjazsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBidG5fY2hlY2tfdGltZXI7CisKKwlpbnQgY29kZWNfdHlwZTsKKwlpbnQgc3lzY2xrOworCWludCBzeXNjbGtfc3JjOworCWludCBscmNrOworCisJaW50IHBsbF9zcmM7CisJaW50IHBsbF9pbjsKKwlpbnQgcGxsX291dDsKKworCWludCBqYWNrX3R5cGU7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19kZWZhdWx0IHJ0NTY2OF9yZWdbXSA9IHsKKwl7IDB4MDAwMCwgMHgwMDAwIH0sCisJeyAweDAwMDEsIDB4YzhjOCB9LAorCXsgMHgwMDAyLCAweDgwODAgfSwKKwl7IDB4MDAwMywgMHg4MDAwIH0sCisJeyAweDAwMDQsIDB4YzgwYSB9LAorCXsgMHgwMDA1LCAweDAwMDAgfSwKKwl7IDB4MDAwNiwgMHgwMDAwIH0sCisJeyAweDAwMDcsIDB4MDAwMCB9LAorCXsgMHgwMDBhLCAweDAwMDAgfSwKKwl7IDB4MDAwYiwgMHgwMDAwIH0sCisJeyAweDAwMGMsIDB4MDAwMCB9LAorCXsgMHgwMDBkLCAweDAwMDAgfSwKKwl7IDB4MDAwZiwgMHgwODA4IH0sCisJeyAweDAwMTAsIDB4NDAwMCB9LAorCXsgMHgwMDExLCAweDAwMDAgfSwKKwl7IDB4MDAxMiwgMHgxNDA0IH0sCisJeyAweDAwMTMsIDB4MTAwMCB9LAorCXsgMHgwMDE0LCAweGEwMGEgfSwKKwl7IDB4MDAxNSwgMHgwNDA0IH0sCisJeyAweDAwMTYsIDB4MDQwNCB9LAorCXsgMHgwMDE3LCAweDAwMTEgfSwKKwl7IDB4MDAxOCwgMHhhZmFmIH0sCisJeyAweDAwMTksIDB4YWZhZiB9LAorCXsgMHgwMDFhLCAweGFmYWYgfSwKKwl7IDB4MDAxYiwgMHgwMDExIH0sCisJeyAweDAwMWMsIDB4MmYyZiB9LAorCXsgMHgwMDFkLCAweDJmMmYgfSwKKwl7IDB4MDAxZSwgMHgyZjJmIH0sCisJeyAweDAwMWYsIDB4MDAwMCB9LAorCXsgMHgwMDIwLCAweDAwMDAgfSwKKwl7IDB4MDAyMSwgMHgwMDAwIH0sCisJeyAweDAwMjIsIDB4NTc1NyB9LAorCXsgMHgwMDIzLCAweDAwMzkgfSwKKwl7IDB4MDAyNCwgMHgwMDBiIH0sCisJeyAweDAwMjYsIDB4YzBjMCB9LAorCXsgMHgwMDI3LCAweGMwYzAgfSwKKwl7IDB4MDAyOCwgMHhjMGMwIH0sCisJeyAweDAwMjksIDB4ODA4MCB9LAorCXsgMHgwMDJhLCAweGFhYWEgfSwKKwl7IDB4MDAyYiwgMHhhYWFhIH0sCisJeyAweDAwMmMsIDB4YWJhOCB9LAorCXsgMHgwMDJkLCAweDAwMDAgfSwKKwl7IDB4MDAyZSwgMHgwMDAwIH0sCisJeyAweDAwMmYsIDB4MDAwMCB9LAorCXsgMHgwMDMwLCAweDAwMDAgfSwKKwl7IDB4MDAzMSwgMHg1MDAwIH0sCisJeyAweDAwMzIsIDB4MDAwMCB9LAorCXsgMHgwMDMzLCAweDAwMDAgfSwKKwl7IDB4MDAzNCwgMHgwMDAwIH0sCisJeyAweDAwMzUsIDB4MDAwMCB9LAorCXsgMHgwMDNhLCAweDAwMDAgfSwKKwl7IDB4MDAzYiwgMHgwMDAwIH0sCisJeyAweDAwM2MsIDB4MDBmZiB9LAorCXsgMHgwMDNkLCAweDAwMDAgfSwKKwl7IDB4MDAzZSwgMHgwMGZmIH0sCisJeyAweDAwM2YsIDB4MDAwMCB9LAorCXsgMHgwMDQwLCAweDAwMDAgfSwKKwl7IDB4MDA0MSwgMHgwMGZmIH0sCisJeyAweDAwNDIsIDB4MDAwMCB9LAorCXsgMHgwMDQzLCAweDAwZmYgfSwKKwl7IDB4MDA0NCwgMHgwYzBjIH0sCisJeyAweDAwNDksIDB4YzAwYiB9LAorCXsgMHgwMDRhLCAweDAwMDAgfSwKKwl7IDB4MDA0YiwgMHgwMzFmIH0sCisJeyAweDAwNGQsIDB4MDAwMCB9LAorCXsgMHgwMDRlLCAweDAwMWYgfSwKKwl7IDB4MDA0ZiwgMHgwMDAwIH0sCisJeyAweDAwNTAsIDB4MDAxZiB9LAorCXsgMHgwMDUyLCAweGYwMDAgfSwKKwl7IDB4MDA2MSwgMHgwMDAwIH0sCisJeyAweDAwNjIsIDB4MDAwMCB9LAorCXsgMHgwMDYzLCAweDAwM2UgfSwKKwl7IDB4MDA2NCwgMHgwMDAwIH0sCisJeyAweDAwNjUsIDB4MDAwMCB9LAorCXsgMHgwMDY2LCAweDAwM2YgfSwKKwl7IDB4MDA2NywgMHgwMDAwIH0sCisJeyAweDAwNmIsIDB4MDAwMCB9LAorCXsgMHgwMDZkLCAweGZmMDAgfSwKKwl7IDB4MDA2ZSwgMHgyODA4IH0sCisJeyAweDAwNmYsIDB4MDAwYSB9LAorCXsgMHgwMDcwLCAweDgwMDAgfSwKKwl7IDB4MDA3MSwgMHg4MDAwIH0sCisJeyAweDAwNzIsIDB4ODAwMCB9LAorCXsgMHgwMDczLCAweDcwMDAgfSwKKwl7IDB4MDA3NCwgMHg3NzcwIH0sCisJeyAweDAwNzUsIDB4MDAwMiB9LAorCXsgMHgwMDc2LCAweDAwMDEgfSwKKwl7IDB4MDA3OCwgMHgwMGYwIH0sCisJeyAweDAwNzksIDB4MDAwMCB9LAorCXsgMHgwMDdhLCAweDAwMDAgfSwKKwl7IDB4MDA3YiwgMHgwMDAwIH0sCisJeyAweDAwN2MsIDB4MDAwMCB9LAorCXsgMHgwMDdkLCAweDAxMjMgfSwKKwl7IDB4MDA3ZSwgMHg0NTAwIH0sCisJeyAweDAwN2YsIDB4ODAwMyB9LAorCXsgMHgwMDgwLCAweDAwMDAgfSwKKwl7IDB4MDA4MSwgMHgwMDAwIH0sCisJeyAweDAwODIsIDB4MDAwMCB9LAorCXsgMHgwMDgzLCAweDAwMDAgfSwKKwl7IDB4MDA4NCwgMHgwMDAwIH0sCisJeyAweDAwODUsIDB4MDAwMCB9LAorCXsgMHgwMDg2LCAweDAwMDggfSwKKwl7IDB4MDA4NywgMHgwMDAwIH0sCisJeyAweDAwODgsIDB4MDAwMCB9LAorCXsgMHgwMDg5LCAweDAwMDAgfSwKKwl7IDB4MDA4YSwgMHgwMDAwIH0sCisJeyAweDAwOGIsIDB4MDAwMCB9LAorCXsgMHgwMDhjLCAweDAwMDMgfSwKKwl7IDB4MDA4ZSwgMHgwMDYwIH0sCisJeyAweDAwOGYsIDB4MTAwMCB9LAorCXsgMHgwMDkxLCAweDBjMjYgfSwKKwl7IDB4MDA5MiwgMHgwMDczIH0sCisJeyAweDAwOTMsIDB4MDAwMCB9LAorCXsgMHgwMDk0LCAweDAwODAgfSwKKwl7IDB4MDA5OCwgMHgwMDAwIH0sCisJeyAweDAwOTksIDB4MDAwMCB9LAorCXsgMHgwMDlhLCAweDAwMDcgfSwKKwl7IDB4MDA5ZiwgMHgwMDAwIH0sCisJeyAweDAwYTAsIDB4MDAwMCB9LAorCXsgMHgwMGExLCAweDAwMDIgfSwKKwl7IDB4MDBhMiwgMHgwMDAxIH0sCisJeyAweDAwYTMsIDB4MDAwMiB9LAorCXsgMHgwMGE0LCAweDAwMDEgfSwKKwl7IDB4MDBhZSwgMHgyMDQwIH0sCisJeyAweDAwYWYsIDB4MDAwMCB9LAorCXsgMHgwMGI2LCAweDAwMDAgfSwKKwl7IDB4MDBiNywgMHgwMDAwIH0sCisJeyAweDAwYjgsIDB4MDAwMCB9LAorCXsgMHgwMGI5LCAweDAwMDAgfSwKKwl7IDB4MDBiYSwgMHgwMDAyIH0sCisJeyAweDAwYmIsIDB4MDAwMCB9LAorCXsgMHgwMGJlLCAweDAwMDAgfSwKKwl7IDB4MDBjMCwgMHgwMDAwIH0sCisJeyAweDAwYzEsIDB4MGFhYSB9LAorCXsgMHgwMGMyLCAweGFhODAgfSwKKwl7IDB4MDBjMywgMHgwMDAzIH0sCisJeyAweDAwYzQsIDB4MDAwMCB9LAorCXsgMHgwMGQwLCAweDAwMDAgfSwKKwl7IDB4MDBkMSwgMHgyMjQ0IH0sCisJeyAweDAwZDIsIDB4MDAwMCB9LAorCXsgMHgwMGQzLCAweDMzMDAgfSwKKwl7IDB4MDBkNCwgMHgyMjAwIH0sCisJeyAweDAwZDksIDB4MDgwOSB9LAorCXsgMHgwMGRhLCAweDAwMDAgfSwKKwl7IDB4MDBkYiwgMHgwMDA4IH0sCisJeyAweDAwZGMsIDB4MDBjMCB9LAorCXsgMHgwMGRkLCAweDY3MjQgfSwKKwl7IDB4MDBkZSwgMHgzMTMxIH0sCisJeyAweDAwZGYsIDB4MDAwOCB9LAorCXsgMHgwMGUwLCAweDQwMDAgfSwKKwl7IDB4MDBlMSwgMHgzMTMxIH0sCisJeyAweDAwZTIsIDB4NjAwYyB9LAorCXsgMHgwMGVhLCAweGIzMjAgfSwKKwl7IDB4MDBlYiwgMHgwMDAwIH0sCisJeyAweDAwZWMsIDB4YjMwMCB9LAorCXsgMHgwMGVkLCAweDAwMDAgfSwKKwl7IDB4MDBlZSwgMHhiMzIwIH0sCisJeyAweDAwZWYsIDB4MDAwMCB9LAorCXsgMHgwMGYwLCAweDAyMDEgfSwKKwl7IDB4MDBmMSwgMHgwZGRkIH0sCisJeyAweDAwZjIsIDB4MGRkZCB9LAorCXsgMHgwMGY2LCAweDAwMDAgfSwKKwl7IDB4MDBmNywgMHgwMDAwIH0sCisJeyAweDAwZjgsIDB4MDAwMCB9LAorCXsgMHgwMGZhLCAweDAwMDAgfSwKKwl7IDB4MDBmYiwgMHgwMDAwIH0sCisJeyAweDAwZmMsIDB4MDAwMCB9LAorCXsgMHgwMGZkLCAweDAwMDAgfSwKKwl7IDB4MDBmZSwgMHgxMGVjIH0sCisJeyAweDAwZmYsIDB4NjQ1MSB9LAorCXsgMHgwMTAwLCAweGFhYWEgfSwKKwl7IDB4MDEwMSwgMHgwMDBhIH0sCisJeyAweDAxMGEsIDB4YWFhYSB9LAorCXsgMHgwMTBiLCAweGEwYTAgfSwKKwl7IDB4MDEwYywgMHhhZWFlIH0sCisJeyAweDAxMGQsIDB4YWFhYSB9LAorCXsgMHgwMTBlLCAweGFhYWEgfSwKKwl7IDB4MDEwZiwgMHhhYWFhIH0sCisJeyAweDAxMTAsIDB4ZTAwMiB9LAorCXsgMHgwMTExLCAweGE2MDIgfSwKKwl7IDB4MDExMiwgMHhhYWFhIH0sCisJeyAweDAxMTMsIDB4MjAwMCB9LAorCXsgMHgwMTE3LCAweDBmMDAgfSwKKwl7IDB4MDEyNSwgMHgwNDIwIH0sCisJeyAweDAxMzIsIDB4MDAwMCB9LAorCXsgMHgwMTMzLCAweDAwMDAgfSwKKwl7IDB4MDEzNiwgMHg1NTU1IH0sCisJeyAweDAxMzcsIDB4NTU0MCB9LAorCXsgMHgwMTM4LCAweDM3MDAgfSwKKwl7IDB4MDEzOSwgMHg3OWExIH0sCisJeyAweDAxM2EsIDB4MjAyMCB9LAorCXsgMHgwMTNiLCAweDIwMjAgfSwKKwl7IDB4MDEzYywgMHgyMDA1IH0sCisJeyAweDAxM2YsIDB4MDAwMCB9LAorCXsgMHgwMTQ1LCAweDAwMDIgfSwKKwl7IDB4MDE0NiwgMHgwMDAwIH0sCisJeyAweDAxNDcsIDB4MDAwMCB9LAorCXsgMHgwMTQ4LCAweDAwMDAgfSwKKwl7IDB4MDE2MCwgMHg0ZWMwIH0sCisJeyAweDAxNjEsIDB4MDA4MCB9LAorCXsgMHgwMTYyLCAweDAyMDAgfSwKKwl7IDB4MDE2MywgMHgwODAwIH0sCisJeyAweDAxNjQsIDB4MDAwMCB9LAorCXsgMHgwMTY1LCAweDAwMDAgfSwKKwl7IDB4MDE2NiwgMHgwMDAwIH0sCisJeyAweDAxNjcsIDB4MDAwZiB9LAorCXsgMHgwMTY4LCAweDAwMGYgfSwKKwl7IDB4MDE3MCwgMHg0ZTgwIH0sCisJeyAweDAxNzEsIDB4MDA4MCB9LAorCXsgMHgwMTcyLCAweDAyMDAgfSwKKwl7IDB4MDE3MywgMHgwODAwIH0sCisJeyAweDAxNzQsIDB4MDBmZiB9LAorCXsgMHgwMTc1LCAweDAwMDAgfSwKKwl7IDB4MDE5MCwgMHg0MTMxIH0sCisJeyAweDAxOTEsIDB4NDEzMSB9LAorCXsgMHgwMTkyLCAweDQxMzEgfSwKKwl7IDB4MDE5MywgMHg0MTMxIH0sCisJeyAweDAxOTQsIDB4MDAwMCB9LAorCXsgMHgwMTk1LCAweDAwMDAgfSwKKwl7IDB4MDE5NiwgMHgwMDAwIH0sCisJeyAweDAxOTcsIDB4MDAwMCB9LAorCXsgMHgwMTk4LCAweDAwMDAgfSwKKwl7IDB4MDE5OSwgMHgwMDAwIH0sCisJeyAweDAxYTAsIDB4MWU2NCB9LAorCXsgMHgwMWExLCAweDA2YTMgfSwKKwl7IDB4MDFhMiwgMHgwMDAwIH0sCisJeyAweDAxYTMsIDB4MDAwMCB9LAorCXsgMHgwMWE0LCAweDAwMDAgfSwKKwl7IDB4MDFhNSwgMHgwMDAwIH0sCisJeyAweDAxYTYsIDB4MDAwMCB9LAorCXsgMHgwMWE3LCAweDAwMDAgfSwKKwl7IDB4MDFhOCwgMHgwMDAwIH0sCisJeyAweDAxYTksIDB4MDAwMCB9LAorCXsgMHgwMWFhLCAweDAwMDAgfSwKKwl7IDB4MDFhYiwgMHgwMDAwIH0sCisJeyAweDAxYjUsIDB4MDAwMCB9LAorCXsgMHgwMWI2LCAweDAxYzMgfSwKKwl7IDB4MDFiNywgMHgwMmEwIH0sCisJeyAweDAxYjgsIDB4MDNlOSB9LAorCXsgMHgwMWI5LCAweDEzODkgfSwKKwl7IDB4MDFiYSwgMHhjMzUxIH0sCisJeyAweDAxYmIsIDB4MDAwOSB9LAorCXsgMHgwMWJjLCAweDAwMTggfSwKKwl7IDB4MDFiZCwgMHgwMDJhIH0sCisJeyAweDAxYmUsIDB4MDA0YyB9LAorCXsgMHgwMWJmLCAweDAwOTcgfSwKKwl7IDB4MDFjMCwgMHg0MzNkIH0sCisJeyAweDAxYzEsIDB4MDAwMCB9LAorCXsgMHgwMWMyLCAweDAwMDAgfSwKKwl7IDB4MDFjMywgMHgwMDAwIH0sCisJeyAweDAxYzQsIDB4MDAwMCB9LAorCXsgMHgwMWM1LCAweDAwMDAgfSwKKwl7IDB4MDFjNiwgMHgwMDAwIH0sCisJeyAweDAxYzcsIDB4MDAwMCB9LAorCXsgMHgwMWM4LCAweDQwYWYgfSwKKwl7IDB4MDFjOSwgMHgwNzAyIH0sCisJeyAweDAxY2EsIDB4MDAwMCB9LAorCXsgMHgwMWNiLCAweDAwMDAgfSwKKwl7IDB4MDFjYywgMHg1NzU3IH0sCisJeyAweDAxY2QsIDB4NTc1NyB9LAorCXsgMHgwMWNlLCAweDU3NTcgfSwKKwl7IDB4MDFjZiwgMHg1NzU3IH0sCisJeyAweDAxZDAsIDB4NTc1NyB9LAorCXsgMHgwMWQxLCAweDU3NTcgfSwKKwl7IDB4MDFkMiwgMHg1NzU3IH0sCisJeyAweDAxZDMsIDB4NTc1NyB9LAorCXsgMHgwMWQ0LCAweDU3NTcgfSwKKwl7IDB4MDFkNSwgMHg1NzU3IH0sCisJeyAweDAxZDYsIDB4MDAzYyB9LAorCXsgMHgwMWRhLCAweDAwMDAgfSwKKwl7IDB4MDFkYiwgMHgwMDAwIH0sCisJeyAweDAxZGMsIDB4MDAwMCB9LAorCXsgMHgwMWRlLCAweDdjMDAgfSwKKwl7IDB4MDFkZiwgMHgwMzIwIH0sCisJeyAweDAxZTAsIDB4MDZhMSB9LAorCXsgMHgwMWUxLCAweDAwMDAgfSwKKwl7IDB4MDFlMiwgMHgwMDAwIH0sCisJeyAweDAxZTMsIDB4MDAwMCB9LAorCXsgMHgwMWU0LCAweDAwMDAgfSwKKwl7IDB4MDFlNSwgMHgwMDAwIH0sCisJeyAweDAxZTYsIDB4MDAwMSB9LAorCXsgMHgwMWU3LCAweDAwMDAgfSwKKwl7IDB4MDFlOCwgMHgwMDAwIH0sCisJeyAweDAxZWEsIDB4MDAwMCB9LAorCXsgMHgwMWViLCAweDAwMDAgfSwKKwl7IDB4MDFlYywgMHgwMDAwIH0sCisJeyAweDAxZWQsIDB4MDAwMCB9LAorCXsgMHgwMWVlLCAweDAwMDAgfSwKKwl7IDB4MDFlZiwgMHgwMDAwIH0sCisJeyAweDAxZjAsIDB4MDAwMCB9LAorCXsgMHgwMWYxLCAweDAwMDAgfSwKKwl7IDB4MDFmMiwgMHgwMDAwIH0sCisJeyAweDAxZjMsIDB4MDAwMCB9LAorCXsgMHgwMWY0LCAweDAwMDAgfSwKKwl7IDB4MDIwMCwgMHgwMDAwIH0sCisJeyAweDAyMDEsIDB4MDAwMCB9LAorCXsgMHgwMjAyLCAweDAwMDAgfSwKKwl7IDB4MDIwMywgMHgwMDAwIH0sCisJeyAweDAyMDQsIDB4MDAwMCB9LAorCXsgMHgwMjA1LCAweDAwMDAgfSwKKwl7IDB4MDIwNiwgMHgwMDAwIH0sCisJeyAweDAyMDcsIDB4MDAwMCB9LAorCXsgMHgwMjA4LCAweDAwMDAgfSwKKwl7IDB4MDIxMCwgMHg2MGIxIH0sCisJeyAweDAyMTEsIDB4YTAwMCB9LAorCXsgMHgwMjEyLCAweDAyNGMgfSwKKwl7IDB4MDIxMywgMHhmN2ZmIH0sCisJeyAweDAyMTQsIDB4MDI0YyB9LAorCXsgMHgwMjE1LCAweDAxMDIgfSwKKwl7IDB4MDIxNiwgMHgwMGEzIH0sCisJeyAweDAyMTcsIDB4MDA0OCB9LAorCXsgMHgwMjE4LCAweDkyYzAgfSwKKwl7IDB4MDIxOSwgMHgwMDAwIH0sCisJeyAweDAyMWEsIDB4MDBjOCB9LAorCXsgMHgwMjFiLCAweDAwMjAgfSwKKwl7IDB4MDJmYSwgMHgwMDAwIH0sCisJeyAweDAyZmIsIDB4MDAwMCB9LAorCXsgMHgwMmZjLCAweDAwMDAgfSwKKwl7IDB4MDJmZiwgMHgwMTEwIH0sCisJeyAweDAzMDAsIDB4MDAxZiB9LAorCXsgMHgwMzAxLCAweDAzMmMgfSwKKwl7IDB4MDMwMiwgMHg1ZjIxIH0sCisJeyAweDAzMDMsIDB4NDAwMCB9LAorCXsgMHgwMzA0LCAweDQwMDAgfSwKKwl7IDB4MDMwNSwgMHgwNmQ1IH0sCisJeyAweDAzMDYsIDB4ODAwMCB9LAorCXsgMHgwMzA3LCAweDA3MDAgfSwKKwl7IDB4MDMxMCwgMHg0NTYwIH0sCisJeyAweDAzMTEsIDB4YTRhOCB9LAorCXsgMHgwMzEyLCAweDc0MTggfSwKKwl7IDB4MDMxMywgMHgwMDAwIH0sCisJeyAweDAzMTQsIDB4MDAwNiB9LAorCXsgMHgwMzE1LCAweGZmZmYgfSwKKwl7IDB4MDMxNiwgMHhjNDAwIH0sCisJeyAweDAzMTcsIDB4MDAwMCB9LAorCXsgMHgwMzMwLCAweDAwYTYgfSwKKwl7IDB4MDMzMSwgMHgwNGMzIH0sCisJeyAweDAzMzIsIDB4MjdjOCB9LAorCXsgMHgwMzMzLCAweGJmNTAgfSwKKwl7IDB4MDMzNCwgMHgwMDQ1IH0sCisJeyAweDAzMzUsIDB4MDAwNyB9LAorCXsgMHgwMzM2LCAweDc0MTggfSwKKwl7IDB4MDMzNywgMHgwNTAxIH0sCisJeyAweDAzMzgsIDB4MDAwMCB9LAorCXsgMHgwMzM5LCAweDAwMTAgfSwKKwl7IDB4MDMzYSwgMHgxMDEwIH0sCisJeyAweDAzYzAsIDB4N2UwMCB9LAorCXsgMHgwM2MxLCAweDgwMDAgfSwKKwl7IDB4MDNjMiwgMHg4MDAwIH0sCisJeyAweDAzYzMsIDB4ODAwMCB9LAorCXsgMHgwM2M0LCAweDgwMDAgfSwKKwl7IDB4MDNjNSwgMHg4MDAwIH0sCisJeyAweDAzYzYsIDB4ODAwMCB9LAorCXsgMHgwM2M3LCAweDgwMDAgfSwKKwl7IDB4MDNjOCwgMHg4MDAwIH0sCisJeyAweDAzYzksIDB4ODAwMCB9LAorCXsgMHgwM2NhLCAweDgwMDAgfSwKKwl7IDB4MDNjYiwgMHg4MDAwIH0sCisJeyAweDAzY2MsIDB4ODAwMCB9LAorCXsgMHgwM2QwLCAweDAwMDAgfSwKKwl7IDB4MDNkMSwgMHgwMDAwIH0sCisJeyAweDAzZDIsIDB4MDAwMCB9LAorCXsgMHgwM2QzLCAweDAwMDAgfSwKKwl7IDB4MDNkNCwgMHgyMDAwIH0sCisJeyAweDAzZDUsIDB4MjAwMCB9LAorCXsgMHgwM2Q2LCAweDAwMDAgfSwKKwl7IDB4MDNkNywgMHgwMDAwIH0sCisJeyAweDAzZDgsIDB4MjAwMCB9LAorCXsgMHgwM2Q5LCAweDIwMDAgfSwKKwl7IDB4MDNkYSwgMHgyMDAwIH0sCisJeyAweDAzZGIsIDB4MjAwMCB9LAorCXsgMHgwM2RjLCAweDAwMDAgfSwKKwl7IDB4MDNkZCwgMHgwMDAwIH0sCisJeyAweDAzZGUsIDB4MDAwMCB9LAorCXsgMHgwM2RmLCAweDIwMDAgfSwKKwl7IDB4MDNlMCwgMHgwMDAwIH0sCisJeyAweDAzZTEsIDB4MDAwMCB9LAorCXsgMHgwM2UyLCAweDAwMDAgfSwKKwl7IDB4MDNlMywgMHgwMDAwIH0sCisJeyAweDAzZTQsIDB4MDAwMCB9LAorCXsgMHgwM2U1LCAweDAwMDAgfSwKKwl7IDB4MDNlNiwgMHgwMDAwIH0sCisJeyAweDAzZTcsIDB4MDAwMCB9LAorCXsgMHgwM2U4LCAweDAwMDAgfSwKKwl7IDB4MDNlOSwgMHgwMDAwIH0sCisJeyAweDAzZWEsIDB4MDAwMCB9LAorCXsgMHgwM2ViLCAweDAwMDAgfSwKKwl7IDB4MDNlYywgMHgwMDAwIH0sCisJeyAweDAzZWQsIDB4MDAwMCB9LAorCXsgMHgwM2VlLCAweDAwMDAgfSwKKwl7IDB4MDNlZiwgMHgwMDAwIH0sCisJeyAweDAzZjAsIDB4MDgwMCB9LAorCXsgMHgwM2YxLCAweDA4MDAgfSwKKwl7IDB4MDNmMiwgMHgwODAwIH0sCisJeyAweDAzZjMsIDB4MDgwMCB9LAorCXsgMHgwM2ZlLCAweDAwMDAgfSwKKwl7IDB4MDNmZiwgMHgwMDAwIH0sCisJeyAweDA3ZjAsIDB4MDAwMCB9LAorCXsgMHgwN2ZhLCAweDAwMDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX2RlZmF1bHQgcnQ1NjYzX3JlZ1tdID0geworCXsgMHgwMDAwLCAweDAwMDAgfSwKKwl7IDB4MDAwMiwgMHgwMDA4IH0sCisJeyAweDAwMDUsIDB4MTAwMCB9LAorCXsgMHgwMDA2LCAweDEwMDAgfSwKKwl7IDB4MDAwYSwgMHgwMDAwIH0sCisJeyAweDAwMTAsIDB4MDAwZiB9LAorCXsgMHgwMDE1LCAweDQyYzEgfSwKKwl7IDB4MDAxNiwgMHgwMDAwIH0sCisJeyAweDAwMTgsIDB4MDAwYiB9LAorCXsgMHgwMDE5LCAweGFmYWYgfSwKKwl7IDB4MDAxYywgMHgyZjJmIH0sCisJeyAweDAwMWYsIDB4MDAwMCB9LAorCXsgMHgwMDIyLCAweDU3NTcgfSwKKwl7IDB4MDAyMywgMHgwMDM5IH0sCisJeyAweDAwMjYsIDB4YzBjMCB9LAorCXsgMHgwMDI5LCAweDgwODAgfSwKKwl7IDB4MDAyYSwgMHhhMGEwIH0sCisJeyAweDAwMmMsIDB4MDAwYyB9LAorCXsgMHgwMDJkLCAweDAwMDAgfSwKKwl7IDB4MDA0MCwgMHgwODA4IH0sCisJeyAweDAwNjEsIDB4MDAwMCB9LAorCXsgMHgwMDYyLCAweDAwMDAgfSwKKwl7IDB4MDA2MywgMHgwMDNlIH0sCisJeyAweDAwNjQsIDB4MDAwMCB9LAorCXsgMHgwMDY1LCAweDAwMDAgfSwKKwl7IDB4MDA2NiwgMHgwMDAwIH0sCisJeyAweDAwNmIsIDB4MDAwMCB9LAorCXsgMHgwMDZlLCAweDAwMDAgfSwKKwl7IDB4MDA2ZiwgMHgwMDAwIH0sCisJeyAweDAwNzAsIDB4ODAyMCB9LAorCXsgMHgwMDczLCAweDEwMDAgfSwKKwl7IDB4MDA3NCwgMHhlNDAwIH0sCisJeyAweDAwNzUsIDB4MDAwMiB9LAorCXsgMHgwMDc2LCAweDAwMDEgfSwKKwl7IDB4MDA3NywgMHgwMGYwIH0sCisJeyAweDAwNzgsIDB4MDAwMCB9LAorCXsgMHgwMDc5LCAweDAwMDAgfSwKKwl7IDB4MDA3YSwgMHgwMTIzIH0sCisJeyAweDAwN2IsIDB4ODAwMyB9LAorCXsgMHgwMDgwLCAweDAwMDAgfSwKKwl7IDB4MDA4MSwgMHgwMDAwIH0sCisJeyAweDAwODIsIDB4MDAwMCB9LAorCXsgMHgwMDgzLCAweDAwMDAgfSwKKwl7IDB4MDA4NCwgMHgwMDAwIH0sCisJeyAweDAwODYsIDB4MDAwOCB9LAorCXsgMHgwMDg3LCAweDAwMDAgfSwKKwl7IDB4MDA4YSwgMHgwMDAwIH0sCisJeyAweDAwOGIsIDB4MDAwMCB9LAorCXsgMHgwMDhjLCAweDAwMDMgfSwKKwl7IDB4MDA4ZSwgMHgwMDA0IH0sCisJeyAweDAwOGYsIDB4MTAwMCB9LAorCXsgMHgwMDkwLCAweDA2NDYgfSwKKwl7IDB4MDA5MSwgMHgwZTNlIH0sCisJeyAweDAwOTIsIDB4MTA3MSB9LAorCXsgMHgwMDkzLCAweDAwMDAgfSwKKwl7IDB4MDA5NCwgMHgwMDgwIH0sCisJeyAweDAwOTcsIDB4MDAwMCB9LAorCXsgMHgwMDk4LCAweDAwMDAgfSwKKwl7IDB4MDA5YSwgMHgwMDAwIH0sCisJeyAweDAwOWYsIDB4MDAwMCB9LAorCXsgMHgwMGFlLCAweDIwMDAgfSwKKwl7IDB4MDBhZiwgMHgwMDAwIH0sCisJeyAweDAwYjYsIDB4MDAwMCB9LAorCXsgMHgwMGI3LCAweDAwMDAgfSwKKwl7IDB4MDBiOCwgMHgwMDAwIH0sCisJeyAweDAwYmEsIDB4MDAwMCB9LAorCXsgMHgwMGJiLCAweDAwMDAgfSwKKwl7IDB4MDBiZSwgMHgwMDAwIH0sCisJeyAweDAwYmYsIDB4MDAwMCB9LAorCXsgMHgwMGMwLCAweDAwMDAgfSwKKwl7IDB4MDBjMSwgMHgwMDAwIH0sCisJeyAweDAwYzUsIDB4MDAwMCB9LAorCXsgMHgwMGNiLCAweGEwMmYgfSwKKwl7IDB4MDBjYywgMHgwMDAwIH0sCisJeyAweDAwY2QsIDB4MGUwMiB9LAorCXsgMHgwMGQ5LCAweDA4ZjkgfSwKKwl7IDB4MDBkYiwgMHgwMDA4IH0sCisJeyAweDAwZGMsIDB4MDBjMCB9LAorCXsgMHgwMGRkLCAweDY3MjQgfSwKKwl7IDB4MDBkZSwgMHgzMTMxIH0sCisJeyAweDAwZGYsIDB4MDAwOCB9LAorCXsgMHgwMGUwLCAweDQwMDAgfSwKKwl7IDB4MDBlMSwgMHgzMTMxIH0sCisJeyAweDAwZTIsIDB4MDA0MyB9LAorCXsgMHgwMGU0LCAweDQwMGIgfSwKKwl7IDB4MDBlNSwgMHg4MDMxIH0sCisJeyAweDAwZTYsIDB4MzA4MCB9LAorCXsgMHgwMGU3LCAweDQxMDAgfSwKKwl7IDB4MDBlOCwgMHgxNDAwIH0sCisJeyAweDAwZTksIDB4ZTAwYSB9LAorCXsgMHgwMGVhLCAweDA0MDQgfSwKKwl7IDB4MDBlYiwgMHgwNDA0IH0sCisJeyAweDAwZWMsIDB4YjMyMCB9LAorCXsgMHgwMGVkLCAweDAwMDAgfSwKKwl7IDB4MDBmNCwgMHgwMDAwIH0sCisJeyAweDAwZjYsIDB4MDAwMCB9LAorCXsgMHgwMGY4LCAweDAwMDAgfSwKKwl7IDB4MDBmYSwgMHg4MDAwIH0sCisJeyAweDAwZmQsIDB4MDAwMSB9LAorCXsgMHgwMGZlLCAweDEwZWMgfSwKKwl7IDB4MDBmZiwgMHg2NDA2IH0sCisJeyAweDAxMDAsIDB4YTBhMCB9LAorCXsgMHgwMTA4LCAweDQ0NDQgfSwKKwl7IDB4MDEwOSwgMHg0NDQ0IH0sCisJeyAweDAxMGEsIDB4YWFhYSB9LAorCXsgMHgwMTBiLCAweDAwYTAgfSwKKwl7IDB4MDEwYywgMHg4YWFhIH0sCisJeyAweDAxMGQsIDB4YWFhYSB9LAorCXsgMHgwMTBlLCAweDJhYWEgfSwKKwl7IDB4MDEwZiwgMHgwMDJhIH0sCisJeyAweDAxMTAsIDB4YTBhNCB9LAorCXsgMHgwMTExLCAweDQ2MDIgfSwKKwl7IDB4MDExMiwgMHgwMTAxIH0sCisJeyAweDAxMTMsIDB4MjAwMCB9LAorCXsgMHgwMTE0LCAweDAwMDAgfSwKKwl7IDB4MDExNiwgMHgwMDAwIH0sCisJeyAweDAxMTcsIDB4MGYwMCB9LAorCXsgMHgwMTE4LCAweDAwMDYgfSwKKwl7IDB4MDEyNSwgMHgyMjI0IH0sCisJeyAweDAxMjYsIDB4NTU1MCB9LAorCXsgMHgwMTI3LCAweDA0MDAgfSwKKwl7IDB4MDEyOCwgMHg3NzExIH0sCisJeyAweDAxMzIsIDB4MDAwNCB9LAorCXsgMHgwMTM3LCAweDU0NDEgfSwKKwl7IDB4MDEzOSwgMHg3OWExIH0sCisJeyAweDAxM2EsIDB4MzBjMCB9LAorCXsgMHgwMTNiLCAweDIwMDAgfSwKKwl7IDB4MDEzYywgMHgyMDA1IH0sCisJeyAweDAxM2QsIDB4MzBjMCB9LAorCXsgMHgwMTNlLCAweDAwMDAgfSwKKwl7IDB4MDE0MCwgMHgzNzAwIH0sCisJeyAweDAxNDEsIDB4MWYwMCB9LAorCXsgMHgwMTQ0LCAweDAwMDAgfSwKKwl7IDB4MDE0NSwgMHgwMDAyIH0sCisJeyAweDAxNDYsIDB4MDAwMCB9LAorCXsgMHgwMTYwLCAweDBlODAgfSwKKwl7IDB4MDE2MSwgMHgwMDIwIH0sCisJeyAweDAxNjIsIDB4MDA4MCB9LAorCXsgMHgwMTYzLCAweDA4MDAgfSwKKwl7IDB4MDE2NCwgMHgwMDAwIH0sCisJeyAweDAxNjUsIDB4MDAwMCB9LAorCXsgMHgwMTY2LCAweDAwMDAgfSwKKwl7IDB4MDE2NywgMHgxNDE3IH0sCisJeyAweDAxNjgsIDB4MDAxNyB9LAorCXsgMHgwMTY5LCAweDAwMTcgfSwKKwl7IDB4MDE4MCwgMHgyMDAwIH0sCisJeyAweDAxODEsIDB4MDAwMCB9LAorCXsgMHgwMTgyLCAweDAwMDAgfSwKKwl7IDB4MDE4MywgMHgyMDAwIH0sCisJeyAweDAxODQsIDB4MDAwMCB9LAorCXsgMHgwMTg1LCAweDAwMDAgfSwKKwl7IDB4MDFiMCwgMHg0YjMwIH0sCisJeyAweDAxYjEsIDB4MDAwMCB9LAorCXsgMHgwMWIyLCAweGQ4NzAgfSwKKwl7IDB4MDFiMywgMHgwMDAwIH0sCisJeyAweDAxYjQsIDB4MDAzMCB9LAorCXsgMHgwMWI1LCAweDU3NTcgfSwKKwl7IDB4MDFiNiwgMHg1NzU3IH0sCisJeyAweDAxYjcsIDB4NTc1NyB9LAorCXsgMHgwMWI4LCAweDU3NTcgfSwKKwl7IDB4MDFjMCwgMHg0MzNkIH0sCisJeyAweDAxYzEsIDB4MDU0MCB9LAorCXsgMHgwMWMyLCAweDAwMDAgfSwKKwl7IDB4MDFjMywgMHgwMDAwIH0sCisJeyAweDAxYzQsIDB4MDAwMCB9LAorCXsgMHgwMWM1LCAweDAwMDkgfSwKKwl7IDB4MDFjNiwgMHgwMDE4IH0sCisJeyAweDAxYzcsIDB4MDAyYSB9LAorCXsgMHgwMWM4LCAweDAwNGMgfSwKKwl7IDB4MDFjOSwgMHgwMDk3IH0sCisJeyAweDAxY2EsIDB4MDFjMyB9LAorCXsgMHgwMWNiLCAweDAzZTkgfSwKKwl7IDB4MDFjYywgMHgxMzg5IH0sCisJeyAweDAxY2QsIDB4YzM1MSB9LAorCXsgMHgwMWNlLCAweDAwMDAgfSwKKwl7IDB4MDFjZiwgMHgwMDAwIH0sCisJeyAweDAxZDAsIDB4MDAwMCB9LAorCXsgMHgwMWQxLCAweDAwMDAgfSwKKwl7IDB4MDFkMiwgMHgwMDAwIH0sCisJeyAweDAxZDMsIDB4MDAzYyB9LAorCXsgMHgwMWQ0LCAweDU3NTcgfSwKKwl7IDB4MDFkNSwgMHg1NzU3IH0sCisJeyAweDAxZDYsIDB4NTc1NyB9LAorCXsgMHgwMWQ3LCAweDU3NTcgfSwKKwl7IDB4MDFkOCwgMHg1NzU3IH0sCisJeyAweDAxZDksIDB4NTc1NyB9LAorCXsgMHgwMWRhLCAweDAwMDAgfSwKKwl7IDB4MDFkYiwgMHgwMDAwIH0sCisJeyAweDAxZGQsIDB4MDAwOSB9LAorCXsgMHgwMWRlLCAweDdmMDAgfSwKKwl7IDB4MDFkZiwgMHgwMGM4IH0sCisJeyAweDAxZTAsIDB4MDY5MSB9LAorCXsgMHgwMWUxLCAweDAwMDAgfSwKKwl7IDB4MDFlMiwgMHgwMDAwIH0sCisJeyAweDAxZTMsIDB4MDAwMCB9LAorCXsgMHgwMWU0LCAweDAwMDAgfSwKKwl7IDB4MDFlNSwgMHgwMDQwIH0sCisJeyAweDAxZTYsIDB4MDAwMCB9LAorCXsgMHgwMWU3LCAweDAwMDAgfSwKKwl7IDB4MDFlOCwgMHgwMDAwIH0sCisJeyAweDAxZWEsIDB4MDAwMCB9LAorCXsgMHgwMWViLCAweDAwMDAgfSwKKwl7IDB4MDFlYywgMHgwMDAwIH0sCisJeyAweDAxZWQsIDB4MDAwMCB9LAorCXsgMHgwMWVlLCAweDAwMDAgfSwKKwl7IDB4MDFlZiwgMHgwMDAwIH0sCisJeyAweDAxZjAsIDB4MDAwMCB9LAorCXsgMHgwMWYxLCAweDAwMDAgfSwKKwl7IDB4MDFmMiwgMHgwMDAwIH0sCisJeyAweDAyMDAsIDB4MDAwMCB9LAorCXsgMHgwMjAxLCAweDIyNDQgfSwKKwl7IDB4MDIwMiwgMHhhYWFhIH0sCisJeyAweDAyNTAsIDB4ODAxMCB9LAorCXsgMHgwMjUxLCAweDAwMDAgfSwKKwl7IDB4MDI1MiwgMHgwMjhhIH0sCisJeyAweDAyZmEsIDB4MDAwMCB9LAorCXsgMHgwMmZiLCAweDAwMDAgfSwKKwl7IDB4MDJmYywgMHgwMDAwIH0sCisJeyAweDAzMDAsIDB4MDAwMCB9LAorCXsgMHgwM2QwLCAweDAwMDAgfSwKKwl7IDB4MDNkMSwgMHgwMDAwIH0sCisJeyAweDAzZDIsIDB4MDAwMCB9LAorCXsgMHgwM2QzLCAweDAwMDAgfSwKKwl7IDB4MDNkNCwgMHgyMDAwIH0sCisJeyAweDAzZDUsIDB4MjAwMCB9LAorCXsgMHgwM2Q2LCAweDAwMDAgfSwKKwl7IDB4MDNkNywgMHgwMDAwIH0sCisJeyAweDAzZDgsIDB4MjAwMCB9LAorCXsgMHgwM2Q5LCAweDIwMDAgfSwKKwl7IDB4MDNkYSwgMHgyMDAwIH0sCisJeyAweDAzZGIsIDB4MjAwMCB9LAorCXsgMHgwM2RjLCAweDAwMDAgfSwKKwl7IDB4MDNkZCwgMHgwMDAwIH0sCisJeyAweDAzZGUsIDB4MDAwMCB9LAorCXsgMHgwM2RmLCAweDIwMDAgfSwKKwl7IDB4MDNlMCwgMHgwMDAwIH0sCisJeyAweDAzZTEsIDB4MDAwMCB9LAorCXsgMHgwM2UyLCAweDAwMDAgfSwKKwl7IDB4MDNlMywgMHgwMDAwIH0sCisJeyAweDAzZTQsIDB4MDAwMCB9LAorCXsgMHgwM2U1LCAweDAwMDAgfSwKKwl7IDB4MDNlNiwgMHgwMDAwIH0sCisJeyAweDAzZTcsIDB4MDAwMCB9LAorCXsgMHgwM2U4LCAweDAwMDAgfSwKKwl7IDB4MDNlOSwgMHgwMDAwIH0sCisJeyAweDAzZWEsIDB4MDAwMCB9LAorCXsgMHgwM2ViLCAweDAwMDAgfSwKKwl7IDB4MDNlYywgMHgwMDAwIH0sCisJeyAweDAzZWQsIDB4MDAwMCB9LAorCXsgMHgwM2VlLCAweDAwMDAgfSwKKwl7IDB4MDNlZiwgMHgwMDAwIH0sCisJeyAweDAzZjAsIDB4MDgwMCB9LAorCXsgMHgwM2YxLCAweDA4MDAgfSwKKwl7IDB4MDNmMiwgMHgwODAwIH0sCisJeyAweDAzZjMsIDB4MDgwMCB9LAorfTsKKworc3RhdGljIGJvb2wgcnQ1NjYzX3ZvbGF0aWxlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgUlQ1NjYzX1JFU0VUOgorCWNhc2UgUlQ1NjYzX1NJTF9ERVRfQ1RMOgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9HQUlOXzI6CisJY2FzZSBSVDU2NjNfQURfREFfTUlYRVI6CisJY2FzZSBSVDU2NjNfRlJBQ19ESVZfMjoKKwljYXNlIFJUNTY2M19NSUNCSUFTXzE6CisJY2FzZSBSVDU2NjNfQVNSQ18xMV8yOgorCWNhc2UgUlQ1NjYzX0FEQ19FUV8xOgorCWNhc2UgUlQ1NjYzX0lOVF9TVF8xOgorCWNhc2UgUlQ1NjYzX0lOVF9TVF8yOgorCWNhc2UgUlQ1NjYzX0dQSU9fU1RBOgorCWNhc2UgUlQ1NjYzX1NJTl9HRU5fMToKKwljYXNlIFJUNTY2M19JTF9DTURfMToKKwljYXNlIFJUNTY2M19JTF9DTURfNToKKwljYXNlIFJUNTY2M19JTF9DTURfUFdSU0FWMToKKwljYXNlIFJUNTY2M19FTV9KQUNLX1RZUEVfMToKKwljYXNlIFJUNTY2M19FTV9KQUNLX1RZUEVfMjoKKwljYXNlIFJUNTY2M19FTV9KQUNLX1RZUEVfMzoKKwljYXNlIFJUNTY2M19KRF9DVFJMMjoKKwljYXNlIFJUNTY2M19WRU5ET1JfSUQ6CisJY2FzZSBSVDU2NjNfVkVORE9SX0lEXzE6CisJY2FzZSBSVDU2NjNfVkVORE9SX0lEXzI6CisJY2FzZSBSVDU2NjNfUExMX0lOVF9SRUc6CisJY2FzZSBSVDU2NjNfU09GVF9SQU1QOgorCWNhc2UgUlQ1NjYzX1NUT19EUkVfMToKKwljYXNlIFJUNTY2M19TVE9fRFJFXzU6CisJY2FzZSBSVDU2NjNfU1RPX0RSRV82OgorCWNhc2UgUlQ1NjYzX1NUT19EUkVfNzoKKwljYXNlIFJUNTY2M19NSUNfREVDUk9fMToKKwljYXNlIFJUNTY2M19NSUNfREVDUk9fNDoKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOXzE6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl8zOgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fNDoKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOXzU6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfMV8xOgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCXzk6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfU1QxOgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCX1NUMjoKKwljYXNlIFJUNTY2M19IUF9DQUxJQl9TVDM6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfU1Q0OgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCX1NUNToKKwljYXNlIFJUNTY2M19IUF9DQUxJQl9TVDY6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfU1Q3OgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCX1NUODoKKwljYXNlIFJUNTY2M19IUF9DQUxJQl9TVDk6CisJY2FzZSBSVDU2NjNfQU5BX0pEOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitzdGF0aWMgYm9vbCBydDU2NjNfcmVhZGFibGVfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBSVDU2NjNfUkVTRVQ6CisJY2FzZSBSVDU2NjNfSFBfT1VUX0VOOgorCWNhc2UgUlQ1NjYzX0hQX0xDSF9EUkU6CisJY2FzZSBSVDU2NjNfSFBfUkNIX0RSRToKKwljYXNlIFJUNTY2M19DQUxJQl9CU1Q6CisJY2FzZSBSVDU2NjNfUkVDTUlYOgorCWNhc2UgUlQ1NjYzX1NJTF9ERVRfQ1RMOgorCWNhc2UgUlQ1NjYzX1BXUl9TQVZfU0lMREVUOgorCWNhc2UgUlQ1NjYzX1NJREVUT05FX0NUTDoKKwljYXNlIFJUNTY2M19TVE8xX0RBQ19ESUdfVk9MOgorCWNhc2UgUlQ1NjYzX1NUTzFfQURDX0RJR19WT0w6CisJY2FzZSBSVDU2NjNfU1RPMV9CT09TVDoKKwljYXNlIFJUNTY2M19IUF9JTVBfR0FJTl8xOgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9HQUlOXzI6CisJY2FzZSBSVDU2NjNfU1RPMV9BRENfTUlYRVI6CisJY2FzZSBSVDU2NjNfQURfREFfTUlYRVI6CisJY2FzZSBSVDU2NjNfU1RPX0RBQ19NSVhFUjoKKwljYXNlIFJUNTY2M19ESUdfU0lERV9NSVhFUjoKKwljYXNlIFJUNTY2M19CWVBBU1NfU1RPX0RBQzoKKwljYXNlIFJUNTY2M19DQUxJQl9SRUNfTUlYOgorCWNhc2UgUlQ1NjYzX1BXUl9ESUdfMToKKwljYXNlIFJUNTY2M19QV1JfRElHXzI6CisJY2FzZSBSVDU2NjNfUFdSX0FOTEdfMToKKwljYXNlIFJUNTY2M19QV1JfQU5MR18yOgorCWNhc2UgUlQ1NjYzX1BXUl9BTkxHXzM6CisJY2FzZSBSVDU2NjNfUFdSX01JWEVSOgorCWNhc2UgUlQ1NjYzX1NJR19DTEtfREVUOgorCWNhc2UgUlQ1NjYzX1BSRV9ESVZfR0FUSU5HXzE6CisJY2FzZSBSVDU2NjNfUFJFX0RJVl9HQVRJTkdfMjoKKwljYXNlIFJUNTY2M19JMlMxX1NEUDoKKwljYXNlIFJUNTY2M19BRERBX0NMS18xOgorCWNhc2UgUlQ1NjYzX0FEREFfUlNUOgorCWNhc2UgUlQ1NjYzX0ZSQUNfRElWXzE6CisJY2FzZSBSVDU2NjNfRlJBQ19ESVZfMjoKKwljYXNlIFJUNTY2M19URE1fMToKKwljYXNlIFJUNTY2M19URE1fMjoKKwljYXNlIFJUNTY2M19URE1fMzoKKwljYXNlIFJUNTY2M19URE1fNDoKKwljYXNlIFJUNTY2M19URE1fNToKKwljYXNlIFJUNTY2M19HTEJfQ0xLOgorCWNhc2UgUlQ1NjYzX1BMTF8xOgorCWNhc2UgUlQ1NjYzX1BMTF8yOgorCWNhc2UgUlQ1NjYzX0FTUkNfMToKKwljYXNlIFJUNTY2M19BU1JDXzI6CisJY2FzZSBSVDU2NjNfQVNSQ180OgorCWNhc2UgUlQ1NjYzX0RVTU1ZX1JFRzoKKwljYXNlIFJUNTY2M19BU1JDXzg6CisJY2FzZSBSVDU2NjNfQVNSQ185OgorCWNhc2UgUlQ1NjYzX0FTUkNfMTE6CisJY2FzZSBSVDU2NjNfREVQT1BfMToKKwljYXNlIFJUNTY2M19ERVBPUF8yOgorCWNhc2UgUlQ1NjYzX0RFUE9QXzM6CisJY2FzZSBSVDU2NjNfSFBfQ0hBUkdFX1BVTVBfMToKKwljYXNlIFJUNTY2M19IUF9DSEFSR0VfUFVNUF8yOgorCWNhc2UgUlQ1NjYzX01JQ0JJQVNfMToKKwljYXNlIFJUNTY2M19SQ19DTEs6CisJY2FzZSBSVDU2NjNfQVNSQ18xMV8yOgorCWNhc2UgUlQ1NjYzX0RVTU1ZX1JFR18yOgorCWNhc2UgUlQ1NjYzX1JFQ19QQVRIX0dBSU46CisJY2FzZSBSVDU2NjNfQVVUT18xTVJDX0NMSzoKKwljYXNlIFJUNTY2M19BRENfRVFfMToKKwljYXNlIFJUNTY2M19BRENfRVFfMjoKKwljYXNlIFJUNTY2M19JUlFfMToKKwljYXNlIFJUNTY2M19JUlFfMjoKKwljYXNlIFJUNTY2M19JUlFfMzoKKwljYXNlIFJUNTY2M19JUlFfNDoKKwljYXNlIFJUNTY2M19JUlFfNToKKwljYXNlIFJUNTY2M19JTlRfU1RfMToKKwljYXNlIFJUNTY2M19JTlRfU1RfMjoKKwljYXNlIFJUNTY2M19HUElPXzE6CisJY2FzZSBSVDU2NjNfR1BJT18yOgorCWNhc2UgUlQ1NjYzX0dQSU9fU1RBOgorCWNhc2UgUlQ1NjYzX1NJTl9HRU5fMToKKwljYXNlIFJUNTY2M19TSU5fR0VOXzI6CisJY2FzZSBSVDU2NjNfU0lOX0dFTl8zOgorCWNhc2UgUlQ1NjYzX1NPRl9WT0xfWkMxOgorCWNhc2UgUlQ1NjYzX0lMX0NNRF8xOgorCWNhc2UgUlQ1NjYzX0lMX0NNRF8yOgorCWNhc2UgUlQ1NjYzX0lMX0NNRF8zOgorCWNhc2UgUlQ1NjYzX0lMX0NNRF80OgorCWNhc2UgUlQ1NjYzX0lMX0NNRF81OgorCWNhc2UgUlQ1NjYzX0lMX0NNRF82OgorCWNhc2UgUlQ1NjYzX0lMX0NNRF83OgorCWNhc2UgUlQ1NjYzX0lMX0NNRF84OgorCWNhc2UgUlQ1NjYzX0lMX0NNRF9QV1JTQVYxOgorCWNhc2UgUlQ1NjYzX0lMX0NNRF9QV1JTQVYyOgorCWNhc2UgUlQ1NjYzX0VNX0pBQ0tfVFlQRV8xOgorCWNhc2UgUlQ1NjYzX0VNX0pBQ0tfVFlQRV8yOgorCWNhc2UgUlQ1NjYzX0VNX0pBQ0tfVFlQRV8zOgorCWNhc2UgUlQ1NjYzX0VNX0pBQ0tfVFlQRV80OgorCWNhc2UgUlQ1NjYzX0VNX0pBQ0tfVFlQRV81OgorCWNhc2UgUlQ1NjYzX0VNX0pBQ0tfVFlQRV82OgorCWNhc2UgUlQ1NjYzX1NUTzFfSFBGX0FESjE6CisJY2FzZSBSVDU2NjNfU1RPMV9IUEZfQURKMjoKKwljYXNlIFJUNTY2M19GQVNUX09GRl9NSUNCSUFTOgorCWNhc2UgUlQ1NjYzX0pEX0NUUkwxOgorCWNhc2UgUlQ1NjYzX0pEX0NUUkwyOgorCWNhc2UgUlQ1NjYzX0RJR19NSVNDOgorCWNhc2UgUlQ1NjYzX1ZFTkRPUl9JRDoKKwljYXNlIFJUNTY2M19WRU5ET1JfSURfMToKKwljYXNlIFJUNTY2M19WRU5ET1JfSURfMjoKKwljYXNlIFJUNTY2M19ESUdfVk9MX1pDRDoKKwljYXNlIFJUNTY2M19BTkFfQklBU19DVVJfMToKKwljYXNlIFJUNTY2M19BTkFfQklBU19DVVJfMjoKKwljYXNlIFJUNTY2M19BTkFfQklBU19DVVJfMzoKKwljYXNlIFJUNTY2M19BTkFfQklBU19DVVJfNDoKKwljYXNlIFJUNTY2M19BTkFfQklBU19DVVJfNToKKwljYXNlIFJUNTY2M19BTkFfQklBU19DVVJfNjoKKwljYXNlIFJUNTY2M19CSUFTX0NVUl81OgorCWNhc2UgUlQ1NjYzX0JJQVNfQ1VSXzY6CisJY2FzZSBSVDU2NjNfQklBU19DVVJfNzoKKwljYXNlIFJUNTY2M19CSUFTX0NVUl84OgorCWNhc2UgUlQ1NjYzX0RBQ1JFRl9MRE86CisJY2FzZSBSVDU2NjNfRFVNTVlfUkVHXzM6CisJY2FzZSBSVDU2NjNfQklBU19DVVJfOToKKwljYXNlIFJUNTY2M19EVU1NWV9SRUdfNDoKKwljYXNlIFJUNTY2M19WUkVGQURKX09QOgorCWNhc2UgUlQ1NjYzX1ZSRUZfUkVDTUlYOgorCWNhc2UgUlQ1NjYzX0NIQVJHRV9QVU1QXzE6CisJY2FzZSBSVDU2NjNfQ0hBUkdFX1BVTVBfMV8yOgorCWNhc2UgUlQ1NjYzX0NIQVJHRV9QVU1QXzFfMzoKKwljYXNlIFJUNTY2M19DSEFSR0VfUFVNUF8yOgorCWNhc2UgUlQ1NjYzX0RJR19JTl9QSU4xOgorCWNhc2UgUlQ1NjYzX1BBRF9EUlZfQ1RMOgorCWNhc2UgUlQ1NjYzX1BMTF9JTlRfUkVHOgorCWNhc2UgUlQ1NjYzX0NIT1BfREFDX0w6CisJY2FzZSBSVDU2NjNfQ0hPUF9BREM6CisJY2FzZSBSVDU2NjNfQ0FMSUJfQURDOgorCWNhc2UgUlQ1NjYzX0NIT1BfREFDX1I6CisJY2FzZSBSVDU2NjNfRFVNTVlfQ1RMX0RBQ0xSOgorCWNhc2UgUlQ1NjYzX0RVTU1ZX1JFR181OgorCWNhc2UgUlQ1NjYzX1NPRlRfUkFNUDoKKwljYXNlIFJUNTY2M19URVNUX01PREVfMToKKwljYXNlIFJUNTY2M19URVNUX01PREVfMjoKKwljYXNlIFJUNTY2M19URVNUX01PREVfMzoKKwljYXNlIFJUNTY2M19TVE9fRFJFXzE6CisJY2FzZSBSVDU2NjNfU1RPX0RSRV8yOgorCWNhc2UgUlQ1NjYzX1NUT19EUkVfMzoKKwljYXNlIFJUNTY2M19TVE9fRFJFXzQ6CisJY2FzZSBSVDU2NjNfU1RPX0RSRV81OgorCWNhc2UgUlQ1NjYzX1NUT19EUkVfNjoKKwljYXNlIFJUNTY2M19TVE9fRFJFXzc6CisJY2FzZSBSVDU2NjNfU1RPX0RSRV84OgorCWNhc2UgUlQ1NjYzX1NUT19EUkVfOToKKwljYXNlIFJUNTY2M19TVE9fRFJFXzEwOgorCWNhc2UgUlQ1NjYzX01JQ19ERUNST18xOgorCWNhc2UgUlQ1NjYzX01JQ19ERUNST18yOgorCWNhc2UgUlQ1NjYzX01JQ19ERUNST18zOgorCWNhc2UgUlQ1NjYzX01JQ19ERUNST180OgorCWNhc2UgUlQ1NjYzX01JQ19ERUNST181OgorCWNhc2UgUlQ1NjYzX01JQ19ERUNST182OgorCWNhc2UgUlQ1NjYzX0hQX0RFQ1JPXzE6CisJY2FzZSBSVDU2NjNfSFBfREVDUk9fMjoKKwljYXNlIFJUNTY2M19IUF9ERUNST18zOgorCWNhc2UgUlQ1NjYzX0hQX0RFQ1JPXzQ6CisJY2FzZSBSVDU2NjNfSFBfREVDT1VQOgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fTUFQODoKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOX01BUDk6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl9NQVAxMDoKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOX01BUDExOgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fMToKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOXzI6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl8zOgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fNDoKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOXzU6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl82OgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fNzoKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOXzg6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl85OgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fMTA6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl8xMToKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOXzEyOgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fMTM6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl8xNDoKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOXzE1OgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fMTY6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl8xNzoKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOXzE4OgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fMTk6CisJY2FzZSBSVDU2NjNfSFBfSU1QU0VOX0RJRzU6CisJY2FzZSBSVDU2NjNfSFBfSU1QU0VOX01BUDE6CisJY2FzZSBSVDU2NjNfSFBfSU1QU0VOX01BUDI6CisJY2FzZSBSVDU2NjNfSFBfSU1QU0VOX01BUDM6CisJY2FzZSBSVDU2NjNfSFBfSU1QU0VOX01BUDQ6CisJY2FzZSBSVDU2NjNfSFBfSU1QU0VOX01BUDU6CisJY2FzZSBSVDU2NjNfSFBfSU1QU0VOX01BUDc6CisJY2FzZSBSVDU2NjNfSFBfTE9HSUNfMToKKwljYXNlIFJUNTY2M19IUF9MT0dJQ18yOgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCXzE6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfMV8xOgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCXzI6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfMzoKKwljYXNlIFJUNTY2M19IUF9DQUxJQl80OgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCXzU6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfNV8xOgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCXzY6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfNzoKKwljYXNlIFJUNTY2M19IUF9DQUxJQl85OgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCXzEwOgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCXzExOgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCX1NUMToKKwljYXNlIFJUNTY2M19IUF9DQUxJQl9TVDI6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfU1QzOgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCX1NUNDoKKwljYXNlIFJUNTY2M19IUF9DQUxJQl9TVDU6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfU1Q2OgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCX1NUNzoKKwljYXNlIFJUNTY2M19IUF9DQUxJQl9TVDg6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfU1Q5OgorCWNhc2UgUlQ1NjYzX0hQX0FNUF9ERVQ6CisJY2FzZSBSVDU2NjNfRFVNTVlfUkVHXzY6CisJY2FzZSBSVDU2NjNfSFBfQklBUzoKKwljYXNlIFJUNTY2M19DQkpfMToKKwljYXNlIFJUNTY2M19DQkpfMjoKKwljYXNlIFJUNTY2M19DQkpfMzoKKwljYXNlIFJUNTY2M19EVU1NWV8xOgorCWNhc2UgUlQ1NjYzX0RVTU1ZXzI6CisJY2FzZSBSVDU2NjNfRFVNTVlfMzoKKwljYXNlIFJUNTY2M19BTkFfSkQ6CisJY2FzZSBSVDU2NjNfQURDX0xDSF9MUEYxX0ExOgorCWNhc2UgUlQ1NjYzX0FEQ19SQ0hfTFBGMV9BMToKKwljYXNlIFJUNTY2M19BRENfTENIX0xQRjFfSDA6CisJY2FzZSBSVDU2NjNfQURDX1JDSF9MUEYxX0gwOgorCWNhc2UgUlQ1NjYzX0FEQ19MQ0hfQlBGMV9BMToKKwljYXNlIFJUNTY2M19BRENfUkNIX0JQRjFfQTE6CisJY2FzZSBSVDU2NjNfQURDX0xDSF9CUEYxX0EyOgorCWNhc2UgUlQ1NjYzX0FEQ19SQ0hfQlBGMV9BMjoKKwljYXNlIFJUNTY2M19BRENfTENIX0JQRjFfSDA6CisJY2FzZSBSVDU2NjNfQURDX1JDSF9CUEYxX0gwOgorCWNhc2UgUlQ1NjYzX0FEQ19MQ0hfQlBGMl9BMToKKwljYXNlIFJUNTY2M19BRENfUkNIX0JQRjJfQTE6CisJY2FzZSBSVDU2NjNfQURDX0xDSF9CUEYyX0EyOgorCWNhc2UgUlQ1NjYzX0FEQ19SQ0hfQlBGMl9BMjoKKwljYXNlIFJUNTY2M19BRENfTENIX0JQRjJfSDA6CisJY2FzZSBSVDU2NjNfQURDX1JDSF9CUEYyX0gwOgorCWNhc2UgUlQ1NjYzX0FEQ19MQ0hfQlBGM19BMToKKwljYXNlIFJUNTY2M19BRENfUkNIX0JQRjNfQTE6CisJY2FzZSBSVDU2NjNfQURDX0xDSF9CUEYzX0EyOgorCWNhc2UgUlQ1NjYzX0FEQ19SQ0hfQlBGM19BMjoKKwljYXNlIFJUNTY2M19BRENfTENIX0JQRjNfSDA6CisJY2FzZSBSVDU2NjNfQURDX1JDSF9CUEYzX0gwOgorCWNhc2UgUlQ1NjYzX0FEQ19MQ0hfQlBGNF9BMToKKwljYXNlIFJUNTY2M19BRENfUkNIX0JQRjRfQTE6CisJY2FzZSBSVDU2NjNfQURDX0xDSF9CUEY0X0EyOgorCWNhc2UgUlQ1NjYzX0FEQ19SQ0hfQlBGNF9BMjoKKwljYXNlIFJUNTY2M19BRENfTENIX0JQRjRfSDA6CisJY2FzZSBSVDU2NjNfQURDX1JDSF9CUEY0X0gwOgorCWNhc2UgUlQ1NjYzX0FEQ19MQ0hfSFBGMV9BMToKKwljYXNlIFJUNTY2M19BRENfUkNIX0hQRjFfQTE6CisJY2FzZSBSVDU2NjNfQURDX0xDSF9IUEYxX0gwOgorCWNhc2UgUlQ1NjYzX0FEQ19SQ0hfSFBGMV9IMDoKKwljYXNlIFJUNTY2M19BRENfRVFfUFJFX1ZPTF9MOgorCWNhc2UgUlQ1NjYzX0FEQ19FUV9QUkVfVk9MX1I6CisJY2FzZSBSVDU2NjNfQURDX0VRX1BPU1RfVk9MX0w6CisJY2FzZSBSVDU2NjNfQURDX0VRX1BPU1RfVk9MX1I6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0YXRpYyBib29sIHJ0NTY2OF92b2xhdGlsZV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFJUNTY2M19SRVNFVDoKKwljYXNlIFJUNTY2OF9DQkpfVFlQRV8yOgorCWNhc2UgUlQ1NjY4X1BETV9PVVRfQ1RMOgorCWNhc2UgUlQ1NjY4X1BETV9JMkNfREFUQV9DVEwxOgorCWNhc2UgUlQ1NjY4X1BETV9JMkNfREFUQV9DVEw0OgorCWNhc2UgUlQ1NjY4X0FMQ19CS19HQUlOOgorCWNhc2UgUlQ1NjYzX1BMTF8yOgorCWNhc2UgUlQ1NjYzX01JQ0JJQVNfMToKKwljYXNlIFJUNTY2M19BRENfRVFfMToKKwljYXNlIFJUNTY2M19JTlRfU1RfMToKKwljYXNlIFJUNTY2OF9HUElPX1NUQToKKwljYXNlIFJUNTY2M19JTF9DTURfMToKKwljYXNlIFJUNTY2M19JTF9DTURfNToKKwljYXNlIFJUNTY2OF9BX0pEX0NUUkw6CisJY2FzZSBSVDU2NjNfSkRfQ1RSTDI6CisJY2FzZSBSVDU2NjNfVkVORE9SX0lEOgorCWNhc2UgUlQ1NjYzX1ZFTkRPUl9JRF8xOgorCWNhc2UgUlQ1NjYzX1ZFTkRPUl9JRF8yOgorCWNhc2UgUlQ1NjYzX1NUT19EUkVfMToKKwljYXNlIFJUNTY2M19TVE9fRFJFXzU6CisJY2FzZSBSVDU2NjNfU1RPX0RSRV82OgorCWNhc2UgUlQ1NjYzX1NUT19EUkVfNzoKKwljYXNlIFJUNTY2OF9NT05PX0RZTkFfNjoKKwljYXNlIFJUNTY2OF9TVE8xX1NJTF9ERVQ6CisJY2FzZSBSVDU2NjhfTU9OT0xfU0lMX0RFVDoKKwljYXNlIFJUNTY2OF9NT05PUl9TSUxfREVUOgorCWNhc2UgUlQ1NjY4X1NUTzJfREFDX1NJTDoKKwljYXNlIFJUNTY2OF9NT05PX0FNUF9DQUxfU1QxOgorCWNhc2UgUlQ1NjY4X01PTk9fQU1QX0NBTF9TVDI6CisJY2FzZSBSVDU2NjhfTU9OT19BTVBfQ0FMX1NUMzoKKwljYXNlIFJUNTY2OF9NT05PX0FNUF9DQUxfU1Q0OgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fMjoKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOXzM6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl80OgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fMTA6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfMToKKwljYXNlIFJUNTY2M19IUF9DQUxJQl8xMDoKKwljYXNlIFJUNTY2M19IUF9DQUxJQl9TVDE6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfU1Q0OgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCX1NUNToKKwljYXNlIFJUNTY2M19IUF9DQUxJQl9TVDY6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfU1Q3OgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCX1NUODoKKwljYXNlIFJUNTY2M19IUF9DQUxJQl9TVDk6CisJY2FzZSBSVDU2NjhfSFBfQ0FMSUJfU1QxMDoKKwljYXNlIFJUNTY2OF9IUF9DQUxJQl9TVDExOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitzdGF0aWMgYm9vbCBydDU2NjhfcmVhZGFibGVfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBSVDU2NjhfTE9VVF9DVFJMOgorCWNhc2UgUlQ1NjY4X0hQX0FNUF8yOgorCWNhc2UgUlQ1NjY4X01PTk9fT1VUOgorCWNhc2UgUlQ1NjY4X01PTk9fR0FJTjoKKwljYXNlIFJUNTY2OF9BRUNfQlNUOgorCWNhc2UgUlQ1NjY4X0lOMV9JTjI6CisJY2FzZSBSVDU2NjhfSU4zX0lONDoKKwljYXNlIFJUNTY2OF9JTkwxX0lOUjE6CisJY2FzZSBSVDU2NjhfQ0JKX1RZUEVfMjoKKwljYXNlIFJUNTY2OF9DQkpfVFlQRV8zOgorCWNhc2UgUlQ1NjY4X0NCSl9UWVBFXzQ6CisJY2FzZSBSVDU2NjhfQ0JKX1RZUEVfNToKKwljYXNlIFJUNTY2OF9DQkpfVFlQRV84OgorCWNhc2UgUlQ1NjY4X0RBQzNfRElHX1ZPTDoKKwljYXNlIFJUNTY2OF9EQUMzX0NUUkw6CisJY2FzZSBSVDU2NjhfTU9OT19BRENfRElHX1ZPTDoKKwljYXNlIFJUNTY2OF9TVE8yX0FEQ19ESUdfVk9MOgorCWNhc2UgUlQ1NjY4X01PTk9fQURDX0JTVF9HQUlOOgorCWNhc2UgUlQ1NjY4X1NUTzJfQURDX0JTVF9HQUlOOgorCWNhc2UgUlQ1NjY4X1NJREVUT05FX0NUUkw6CisJY2FzZSBSVDU2NjhfTU9OTzFfQURDX01JWEVSOgorCWNhc2UgUlQ1NjY4X1NUTzJfQURDX01JWEVSOgorCWNhc2UgUlQ1NjY4X01PTk9fREFDX01JWEVSOgorCWNhc2UgUlQ1NjY4X0RBQzJfU1JDX0NUUkw6CisJY2FzZSBSVDU2NjhfSUZfM180X0RBVEFfQ1RMOgorCWNhc2UgUlQ1NjY4X0lGXzVfREFUQV9DVEw6CisJY2FzZSBSVDU2NjhfUERNX09VVF9DVEw6CisJY2FzZSBSVDU2NjhfUERNX0kyQ19EQVRBX0NUTDE6CisJY2FzZSBSVDU2NjhfUERNX0kyQ19EQVRBX0NUTDI6CisJY2FzZSBSVDU2NjhfUERNX0kyQ19EQVRBX0NUTDM6CisJY2FzZSBSVDU2NjhfUERNX0kyQ19EQVRBX0NUTDQ6CisJY2FzZSBSVDU2NjhfUkVDTUlYMV9ORVc6CisJY2FzZSBSVDU2NjhfUkVDTUlYMUxfMDoKKwljYXNlIFJUNTY2OF9SRUNNSVgxTDoKKwljYXNlIFJUNTY2OF9SRUNNSVgxUl8wOgorCWNhc2UgUlQ1NjY4X1JFQ01JWDFSOgorCWNhc2UgUlQ1NjY4X1JFQ01JWDJfTkVXOgorCWNhc2UgUlQ1NjY4X1JFQ01JWDJfTF8yOgorCWNhc2UgUlQ1NjY4X1JFQ01JWDJfUjoKKwljYXNlIFJUNTY2OF9SRUNNSVgyX1JfMjoKKwljYXNlIFJUNTY2OF9DQUxJQl9SRUNfTFI6CisJY2FzZSBSVDU2NjhfQUxDX0JLX0dBSU46CisJY2FzZSBSVDU2NjhfTU9OT01JWF9HQUlOOgorCWNhc2UgUlQ1NjY4X01PTk9NSVhfSU5fR0FJTjoKKwljYXNlIFJUNTY2OF9PVVRfTUlYTF9HQUlOOgorCWNhc2UgUlQ1NjY4X09VVF9MTUlYX0lOX0dBSU46CisJY2FzZSBSVDU2NjhfT1VUX1JNSVhfSU5fR0FJTjoKKwljYXNlIFJUNTY2OF9PVVRfUk1JWF9JTl9HQUlOMToKKwljYXNlIFJUNTY2OF9MT1VUX01JWEVSX0NUUkw6CisJY2FzZSBSVDU2NjhfUFdSX1ZPTDoKKwljYXNlIFJUNTY2OF9BRENEQUNfUlNUOgorCWNhc2UgUlQ1NjY4X0kyUzM0X1NEUDoKKwljYXNlIFJUNTY2OF9JMlM1X1NEUDoKKwljYXNlIFJUNTY2OF9URE1fNToKKwljYXNlIFJUNTY2OF9URE1fNjoKKwljYXNlIFJUNTY2OF9URE1fNzoKKwljYXNlIFJUNTY2OF9URE1fODoKKwljYXNlIFJUNTY2OF9BU1JDXzM6CisJY2FzZSBSVDU2NjhfQVNSQ182OgorCWNhc2UgUlQ1NjY4X0FTUkNfNzoKKwljYXNlIFJUNTY2OF9QTExfVFJLXzEzOgorCWNhc2UgUlQ1NjY4X0kyU19NX0NMS19DVEw6CisJY2FzZSBSVDU2NjhfRkRJVl9JMlMzNF9NX0NMSzoKKwljYXNlIFJUNTY2OF9GRElWX0kyUzM0X01fQ0xLMjoKKwljYXNlIFJUNTY2OF9GRElWX0kyUzVfTV9DTEs6CisJY2FzZSBSVDU2NjhfRkRJVl9JMlM1X01fQ0xLMjoKKwljYXNlIFJUNTY2OF9JUlFfNDoKKwljYXNlIFJUNTY2OF9HUElPXzM6CisJY2FzZSBSVDU2NjhfR1BJT180OgorCWNhc2UgUlQ1NjY4X0dQSU9fU1RBOgorCWNhc2UgUlQ1NjY4X0hQX0FNUF9ERVQxOgorCWNhc2UgUlQ1NjY4X0hQX0FNUF9ERVQyOgorCWNhc2UgUlQ1NjY4X0hQX0FNUF9ERVQzOgorCWNhc2UgUlQ1NjY4X01JRF9CRF9IUF9BTVA6CisJY2FzZSBSVDU2NjhfTE9XX0JEX0hQX0FNUDoKKwljYXNlIFJUNTY2OF9TT0ZfVk9MX1pDMjoKKwljYXNlIFJUNTY2OF9BRENfU1RPMl9BREoxOgorCWNhc2UgUlQ1NjY4X0FEQ19TVE8yX0FESjI6CisJY2FzZSBSVDU2NjhfQV9KRF9DVFJMOgorCWNhc2UgUlQ1NjY4X0pEMV9UUkVTX0NUUkw6CisJY2FzZSBSVDU2NjhfSkQyX1RSRVNfQ1RSTDoKKwljYXNlIFJUNTY2OF9KRF9DVFJMMjoKKwljYXNlIFJUNTY2OF9EVU1fUkVHXzI6CisJY2FzZSBSVDU2NjhfRFVNX1JFR18zOgorCWNhc2UgUlQ1NjYzX1ZFTkRPUl9JRDoKKwljYXNlIFJUNTY2M19WRU5ET1JfSURfMToKKwljYXNlIFJUNTY2M19WRU5ET1JfSURfMjoKKwljYXNlIFJUNTY2OF9EQUNBRENfRElHX1ZPTDI6CisJY2FzZSBSVDU2NjhfRElHX0lOX1BJTjI6CisJY2FzZSBSVDU2NjhfUEFEX0RSVl9DVEwxOgorCWNhc2UgUlQ1NjY4X1NPRl9SQU1fREVQT1A6CisJY2FzZSBSVDU2NjhfVk9MX1RFU1Q6CisJY2FzZSBSVDU2NjhfVEVTVF9NT0RFXzM6CisJY2FzZSBSVDU2NjhfVEVTVF9NT0RFXzQ6CisJY2FzZSBSVDU2NjNfU1RPX0RSRV85OgorCWNhc2UgUlQ1NjY4X01PTk9fRFlOQV8xOgorCWNhc2UgUlQ1NjY4X01PTk9fRFlOQV8yOgorCWNhc2UgUlQ1NjY4X01PTk9fRFlOQV8zOgorCWNhc2UgUlQ1NjY4X01PTk9fRFlOQV80OgorCWNhc2UgUlQ1NjY4X01PTk9fRFlOQV81OgorCWNhc2UgUlQ1NjY4X01PTk9fRFlOQV82OgorCWNhc2UgUlQ1NjY4X1NUTzFfU0lMX0RFVDoKKwljYXNlIFJUNTY2OF9NT05PTF9TSUxfREVUOgorCWNhc2UgUlQ1NjY4X01PTk9SX1NJTF9ERVQ6CisJY2FzZSBSVDU2NjhfU1RPMl9EQUNfU0lMOgorCWNhc2UgUlQ1NjY4X1BXUl9TQVZfQ1RMMToKKwljYXNlIFJUNTY2OF9QV1JfU0FWX0NUTDI6CisJY2FzZSBSVDU2NjhfUFdSX1NBVl9DVEwzOgorCWNhc2UgUlQ1NjY4X1BXUl9TQVZfQ1RMNDoKKwljYXNlIFJUNTY2OF9QV1JfU0FWX0NUTDU6CisJY2FzZSBSVDU2NjhfUFdSX1NBVl9DVEw2OgorCWNhc2UgUlQ1NjY4X01PTk9fQU1QX0NBTDE6CisJY2FzZSBSVDU2NjhfTU9OT19BTVBfQ0FMMjoKKwljYXNlIFJUNTY2OF9NT05PX0FNUF9DQUwzOgorCWNhc2UgUlQ1NjY4X01PTk9fQU1QX0NBTDQ6CisJY2FzZSBSVDU2NjhfTU9OT19BTVBfQ0FMNToKKwljYXNlIFJUNTY2OF9NT05PX0FNUF9DQUw2OgorCWNhc2UgUlQ1NjY4X01PTk9fQU1QX0NBTDc6CisJY2FzZSBSVDU2NjhfTU9OT19BTVBfQ0FMX1NUMToKKwljYXNlIFJUNTY2OF9NT05PX0FNUF9DQUxfU1QyOgorCWNhc2UgUlQ1NjY4X01PTk9fQU1QX0NBTF9TVDM6CisJY2FzZSBSVDU2NjhfTU9OT19BTVBfQ0FMX1NUNDoKKwljYXNlIFJUNTY2OF9NT05PX0FNUF9DQUxfU1Q1OgorCWNhc2UgUlQ1NjY4X0hQX0lNUF9TRU5fMTM6CisJY2FzZSBSVDU2NjhfSFBfSU1QX1NFTl8xNDoKKwljYXNlIFJUNTY2OF9IUF9JTVBfU0VOXzY6CisJY2FzZSBSVDU2NjhfSFBfSU1QX1NFTl83OgorCWNhc2UgUlQ1NjY4X0hQX0lNUF9TRU5fODoKKwljYXNlIFJUNTY2OF9IUF9JTVBfU0VOXzk6CisJY2FzZSBSVDU2NjhfSFBfSU1QX1NFTl8xMDoKKwljYXNlIFJUNTY2OF9IUF9MT0dJQ18zOgorCWNhc2UgUlQ1NjY4X0hQX0NBTElCX1NUMTA6CisJY2FzZSBSVDU2NjhfSFBfQ0FMSUJfU1QxMToKKwljYXNlIFJUNTY2OF9QUk9fUkVHX1RCTF80OgorCWNhc2UgUlQ1NjY4X1BST19SRUdfVEJMXzU6CisJY2FzZSBSVDU2NjhfUFJPX1JFR19UQkxfNjoKKwljYXNlIFJUNTY2OF9QUk9fUkVHX1RCTF83OgorCWNhc2UgUlQ1NjY4X1BST19SRUdfVEJMXzg6CisJY2FzZSBSVDU2NjhfUFJPX1JFR19UQkxfOToKKwljYXNlIFJUNTY2OF9TQVJfQURDX0lOTF8xOgorCWNhc2UgUlQ1NjY4X1NBUl9BRENfSU5MXzI6CisJY2FzZSBSVDU2NjhfU0FSX0FEQ19JTkxfMzoKKwljYXNlIFJUNTY2OF9TQVJfQURDX0lOTF80OgorCWNhc2UgUlQ1NjY4X1NBUl9BRENfSU5MXzU6CisJY2FzZSBSVDU2NjhfU0FSX0FEQ19JTkxfNjoKKwljYXNlIFJUNTY2OF9TQVJfQURDX0lOTF83OgorCWNhc2UgUlQ1NjY4X1NBUl9BRENfSU5MXzg6CisJY2FzZSBSVDU2NjhfU0FSX0FEQ19JTkxfOToKKwljYXNlIFJUNTY2OF9TQVJfQURDX0lOTF8xMDoKKwljYXNlIFJUNTY2OF9TQVJfQURDX0lOTF8xMToKKwljYXNlIFJUNTY2OF9TQVJfQURDX0lOTF8xMjoKKwljYXNlIFJUNTY2OF9EUkNfQ1RSTF8xOgorCWNhc2UgUlQ1NjY4X0RSQzFfQ1RSTF8yOgorCWNhc2UgUlQ1NjY4X0RSQzFfQ1RSTF8zOgorCWNhc2UgUlQ1NjY4X0RSQzFfQ1RSTF80OgorCWNhc2UgUlQ1NjY4X0RSQzFfQ1RSTF81OgorCWNhc2UgUlQ1NjY4X0RSQzFfQ1RSTF82OgorCWNhc2UgUlQ1NjY4X0RSQzFfSERfQ1RSTF8xOgorCWNhc2UgUlQ1NjY4X0RSQzFfSERfQ1RSTF8yOgorCWNhc2UgUlQ1NjY4X0RSQzFfUFJJX1JFR18xOgorCWNhc2UgUlQ1NjY4X0RSQzFfUFJJX1JFR18yOgorCWNhc2UgUlQ1NjY4X0RSQzFfUFJJX1JFR18zOgorCWNhc2UgUlQ1NjY4X0RSQzFfUFJJX1JFR180OgorCWNhc2UgUlQ1NjY4X0RSQzFfUFJJX1JFR181OgorCWNhc2UgUlQ1NjY4X0RSQzFfUFJJX1JFR182OgorCWNhc2UgUlQ1NjY4X0RSQzFfUFJJX1JFR183OgorCWNhc2UgUlQ1NjY4X0RSQzFfUFJJX1JFR184OgorCWNhc2UgUlQ1NjY4X0FMQ19QR0FfQ1RMXzE6CisJY2FzZSBSVDU2NjhfQUxDX1BHQV9DVExfMjoKKwljYXNlIFJUNTY2OF9BTENfUEdBX0NUTF8zOgorCWNhc2UgUlQ1NjY4X0FMQ19QR0FfQ1RMXzQ6CisJY2FzZSBSVDU2NjhfQUxDX1BHQV9DVExfNToKKwljYXNlIFJUNTY2OF9BTENfUEdBX0NUTF82OgorCWNhc2UgUlQ1NjY4X0FMQ19QR0FfQ1RMXzc6CisJY2FzZSBSVDU2NjhfQUxDX1BHQV9DVExfODoKKwljYXNlIFJUNTY2OF9BTENfUEdBX1JFR18xOgorCWNhc2UgUlQ1NjY4X0FMQ19QR0FfUkVHXzI6CisJY2FzZSBSVDU2NjhfQUxDX1BHQV9SRUdfMzoKKwljYXNlIFJUNTY2OF9BRENfRVFfUkVDT1ZfMToKKwljYXNlIFJUNTY2OF9BRENfRVFfUkVDT1ZfMjoKKwljYXNlIFJUNTY2OF9BRENfRVFfUkVDT1ZfMzoKKwljYXNlIFJUNTY2OF9BRENfRVFfUkVDT1ZfNDoKKwljYXNlIFJUNTY2OF9BRENfRVFfUkVDT1ZfNToKKwljYXNlIFJUNTY2OF9BRENfRVFfUkVDT1ZfNjoKKwljYXNlIFJUNTY2OF9BRENfRVFfUkVDT1ZfNzoKKwljYXNlIFJUNTY2OF9BRENfRVFfUkVDT1ZfODoKKwljYXNlIFJUNTY2OF9BRENfRVFfUkVDT1ZfOToKKwljYXNlIFJUNTY2OF9BRENfRVFfUkVDT1ZfMTA6CisJY2FzZSBSVDU2NjhfQURDX0VRX1JFQ09WXzExOgorCWNhc2UgUlQ1NjY4X0FEQ19FUV9SRUNPVl8xMjoKKwljYXNlIFJUNTY2OF9BRENfRVFfUkVDT1ZfMTM6CisJY2FzZSBSVDU2NjhfVklEX0hJRERFTjoKKwljYXNlIFJUNTY2OF9WSURfQ1VTVE9NRVI6CisJY2FzZSBSVDU2NjhfU0NBTl9NT0RFOgorCWNhc2UgUlQ1NjY4X0kyQ19CWVBBOgorCQlyZXR1cm4gdHJ1ZTsKKwljYXNlIFJUNTY2M19URE1fMToKKwljYXNlIFJUNTY2M19ERVBPUF8zOgorCWNhc2UgUlQ1NjYzX0FTUkNfMTFfMjoKKwljYXNlIFJUNTY2M19JTlRfU1RfMjoKKwljYXNlIFJUNTY2M19HUElPX1NUQToKKwljYXNlIFJUNTY2M19TSU5fR0VOXzE6CisJY2FzZSBSVDU2NjNfU0lOX0dFTl8yOgorCWNhc2UgUlQ1NjYzX1NJTl9HRU5fMzoKKwljYXNlIFJUNTY2M19JTF9DTURfUFdSU0FWMToKKwljYXNlIFJUNTY2M19JTF9DTURfUFdSU0FWMjoKKwljYXNlIFJUNTY2M19FTV9KQUNLX1RZUEVfMToKKwljYXNlIFJUNTY2M19FTV9KQUNLX1RZUEVfMjoKKwljYXNlIFJUNTY2M19FTV9KQUNLX1RZUEVfMzoKKwljYXNlIFJUNTY2M19FTV9KQUNLX1RZUEVfNDoKKwljYXNlIFJUNTY2M19GQVNUX09GRl9NSUNCSUFTOgorCWNhc2UgUlQ1NjYzX0FOQV9CSUFTX0NVUl8xOgorCWNhc2UgUlQ1NjYzX0FOQV9CSUFTX0NVUl8yOgorCWNhc2UgUlQ1NjYzX0JJQVNfQ1VSXzk6CisJY2FzZSBSVDU2NjNfRFVNTVlfUkVHXzQ6CisJY2FzZSBSVDU2NjNfVlJFRl9SRUNNSVg6CisJY2FzZSBSVDU2NjNfQ0hBUkdFX1BVTVBfMV8yOgorCWNhc2UgUlQ1NjYzX0NIQVJHRV9QVU1QXzFfMzoKKwljYXNlIFJUNTY2M19DSEFSR0VfUFVNUF8yOgorCWNhc2UgUlQ1NjYzX0NIT1BfREFDX1I6CisJY2FzZSBSVDU2NjNfRFVNTVlfQ1RMX0RBQ0xSOgorCWNhc2UgUlQ1NjYzX0RVTU1ZX1JFR181OgorCWNhc2UgUlQ1NjYzX1NPRlRfUkFNUDoKKwljYXNlIFJUNTY2M19URVNUX01PREVfMToKKwljYXNlIFJUNTY2M19TVE9fRFJFXzEwOgorCWNhc2UgUlQ1NjYzX01JQ19ERUNST18xOgorCWNhc2UgUlQ1NjYzX01JQ19ERUNST18yOgorCWNhc2UgUlQ1NjYzX01JQ19ERUNST18zOgorCWNhc2UgUlQ1NjYzX01JQ19ERUNST180OgorCWNhc2UgUlQ1NjYzX01JQ19ERUNST181OgorCWNhc2UgUlQ1NjYzX01JQ19ERUNST182OgorCWNhc2UgUlQ1NjYzX0hQX0RFQ1JPXzE6CisJY2FzZSBSVDU2NjNfSFBfREVDUk9fMjoKKwljYXNlIFJUNTY2M19IUF9ERUNST18zOgorCWNhc2UgUlQ1NjYzX0hQX0RFQ1JPXzQ6CisJY2FzZSBSVDU2NjNfSFBfREVDT1VQOgorCWNhc2UgUlQ1NjYzX0hQX0lNUFNFTl9NQVA0OgorCWNhc2UgUlQ1NjYzX0hQX0lNUFNFTl9NQVA1OgorCWNhc2UgUlQ1NjYzX0hQX0lNUFNFTl9NQVA3OgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCXzE6CisJY2FzZSBSVDU2NjNfQ0JKXzE6CisJY2FzZSBSVDU2NjNfQ0JKXzI6CisJY2FzZSBSVDU2NjNfQ0JKXzM6CisJCXJldHVybiBmYWxzZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gcnQ1NjYzX3JlYWRhYmxlX3JlZ2lzdGVyKGRldiwgcmVnKTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShydDU2NjNfaHBfdm9sX3RsdiwgLTI0MDAsIDE1MCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUocnQ1NjY4X2hwX3ZvbF90bHYsIC0yMjUwLCAxNTAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRhY192b2xfdGx2LCAtNjUyNSwgNzUsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGFkY192b2xfdGx2LCAtMTcyNSwgNzUsIDApOworCisvKiB7MCwgKzIwLCArMjQsICszMCwgKzM1LCArNDAsICs0NCwgKzUwLCArNTJ9IGRCICovCitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfUkFOR0UoaW5fYnN0X3RsdiwKKwkwLCAwLCBUTFZfREJfU0NBTEVfSVRFTSgwLCAwLCAwKSwKKwkxLCAxLCBUTFZfREJfU0NBTEVfSVRFTSgyMDAwLCAwLCAwKSwKKwkyLCAyLCBUTFZfREJfU0NBTEVfSVRFTSgyNDAwLCAwLCAwKSwKKwkzLCA1LCBUTFZfREJfU0NBTEVfSVRFTSgzMDAwLCA1MDAsIDApLAorCTYsIDYsIFRMVl9EQl9TQ0FMRV9JVEVNKDQ0MDAsIDAsIDApLAorCTcsIDcsIFRMVl9EQl9TQ0FMRV9JVEVNKDUwMDAsIDAsIDApLAorCTgsIDgsIFRMVl9EQl9TQ0FMRV9JVEVNKDUyMDAsIDAsIDApCispOworCisvKiBJbnRlcmZhY2UgZGF0YSBzZWxlY3QgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnQ1NjYzX2lmMV9hZGNfZGF0YV9zZWxlY3RbXSA9IHsKKwkiTC9SIiwgIlIvTCIsICJML0wiLCAiUi9SIgorfTsKKworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTY2M19pZjFfYWRjX2VudW0sIFJUNTY2M19URE1fMiwKKwlSVDU2NjNfREFUQV9TV0FQX0FEQ0RBVDFfU0hJRlQsIHJ0NTY2M19pZjFfYWRjX2RhdGFfc2VsZWN0KTsKKworc3RhdGljIHZvaWQgcnQ1NjYzX2VuYWJsZV9wdXNoX2J1dHRvbl9pcnEoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCWJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBydDU2NjNfcHJpdiAqcnQ1NjYzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlpZiAoZW5hYmxlKSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19JTF9DTURfNiwKKwkJCVJUNTY2OF9FTl80QlROX0lOTF9NQVNLLCBSVDU2NjhfRU5fNEJUTl9JTkxfRU4pOworCQkvKiByZXNldCBpbi1saW5lIGNvbW1hbmQgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0lMX0NNRF82LAorCQkJUlQ1NjY4X1JFU0VUXzRCVE5fSU5MX01BU0ssCisJCQlSVDU2NjhfUkVTRVRfNEJUTl9JTkxfUkVTRVQpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfSUxfQ01EXzYsCisJCQlSVDU2NjhfUkVTRVRfNEJUTl9JTkxfTUFTSywKKwkJCVJUNTY2OF9SRVNFVF80QlROX0lOTF9OT1IpOworCQlzd2l0Y2ggKHJ0NTY2My0+Y29kZWNfdHlwZSkgeworCQljYXNlIENPREVDX1RZUEVfUlQ1NjY4OgorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0lSUV8zLAorCQkJCVJUNTY2OF9FTl9JUlFfSU5MSU5FX01BU0ssCisJCQkJUlQ1NjY4X0VOX0lSUV9JTkxJTkVfTk9SKTsKKwkJCWJyZWFrOworCQljYXNlIENPREVDX1RZUEVfUlQ1NjYzOgorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0lSUV8yLAorCQkJCVJUNTY2M19FTl9JUlFfSU5MSU5FX01BU0ssCisJCQkJUlQ1NjYzX0VOX0lSUV9JTkxJTkVfTk9SKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiVW5rbm93biBDT0RFQ19UWVBFXG4iKTsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAocnQ1NjYzLT5jb2RlY190eXBlKSB7CisJCWNhc2UgQ09ERUNfVFlQRV9SVDU2Njg6CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfSVJRXzMsCisJCQkJUlQ1NjY4X0VOX0lSUV9JTkxJTkVfTUFTSywKKwkJCQlSVDU2NjhfRU5fSVJRX0lOTElORV9CWVApOworCQkJYnJlYWs7CisJCWNhc2UgQ09ERUNfVFlQRV9SVDU2NjM6CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfSVJRXzIsCisJCQkJUlQ1NjYzX0VOX0lSUV9JTkxJTkVfTUFTSywKKwkJCQlSVDU2NjNfRU5fSVJRX0lOTElORV9CWVApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbmtub3duIENPREVDX1RZUEVcbiIpOworCQl9CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19JTF9DTURfNiwKKwkJCVJUNTY2OF9FTl80QlROX0lOTF9NQVNLLCBSVDU2NjhfRU5fNEJUTl9JTkxfRElTKTsKKwkJLyogcmVzZXQgaW4tbGluZSBjb21tYW5kICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19JTF9DTURfNiwKKwkJCVJUNTY2OF9SRVNFVF80QlROX0lOTF9NQVNLLAorCQkJUlQ1NjY4X1JFU0VUXzRCVE5fSU5MX1JFU0VUKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0lMX0NNRF82LAorCQkJUlQ1NjY4X1JFU0VUXzRCVE5fSU5MX01BU0ssCisJCQlSVDU2NjhfUkVTRVRfNEJUTl9JTkxfTk9SKTsKKwl9Cit9CisKKy8qKgorICogcnQ1NjY4X2phY2tfZGV0ZWN0IC0gRGV0ZWN0IGhlYWRzZXQuCisgKiBAY29kZWM6IFNvQyBhdWRpbyBjb2RlYyBkZXZpY2UuCisgKiBAamFja19pbnNlcnQ6IEphY2sgaW5zZXJ0IG9yIG5vdC4KKyAqCisgKiBEZXRlY3Qgd2hldGhlciBpcyBoZWFkc2V0IG9yIG5vdCB3aGVuIGphY2sgaW5zZXJ0ZWQuCisgKgorICogUmV0dXJucyBkZXRlY3Qgc3RhdHVzLgorICovCisKK3N0YXRpYyBpbnQgcnQ1NjY4X2phY2tfZGV0ZWN0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGphY2tfaW5zZXJ0KQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpOworCXN0cnVjdCBydDU2NjNfcHJpdiAqcnQ1NjY4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHZhbCwgaSA9IDAsIHNsZWVwX3RpbWVbNV0gPSB7MzAwLCAxNTAsIDEwMCwgNTAsIDMwfTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzIGphY2tfaW5zZXJ0OiVkXG4iLCBfX2Z1bmNfXywgamFja19pbnNlcnQpOworCWlmIChqYWNrX2luc2VydCkgeworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2NjhfQ0JKX1RZUEVfMiwgMHg4MDQwKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjY4X0NCSl9UWVBFXzMsIDB4MTQ4NCk7CisKKwkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oZGFwbSwgIk1JQ0JJQVMxIik7CisJCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKGRhcG0sICJNSUNCSUFTMiIpOworCQlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbihkYXBtLCAiTWljIERldCBQb3dlciIpOworCQlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbihkYXBtLCAiQ0JKIFBvd2VyIik7CisJCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfUkNfQ0xLLAorCQkJUlQ1NjY4X0RJR18xTV9DTEtfTUFTSywgUlQ1NjY4X0RJR18xTV9DTEtfRU4pOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfUkVDTUlYLCAweDgsIDB4OCk7CisKKwkJd2hpbGUgKGkgPCA1KSB7CisJCQltc2xlZXAoc2xlZXBfdGltZVtpXSk7CisJCQl2YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIFJUNTY2OF9DQkpfVFlQRV8yKSAmIDB4MDAwMzsKKwkJCWlmICh2YWwgPT0gMHgxIHx8IHZhbCA9PSAweDIgfHwgdmFsID09IDB4MykKKwkJCQlicmVhazsKKwkJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzOiBNWC0wMDExIHZhbD0leCBzbGVlcCAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgdmFsLCBzbGVlcF90aW1lW2ldKTsKKwkJCWkrKzsKKwkJfQorCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyB2YWwgPSAlZFxuIiwgX19mdW5jX18sIHZhbCk7CisJCXN3aXRjaCAodmFsKSB7CisJCWNhc2UgMToKKwkJY2FzZSAyOgorCQkJcnQ1NjY4LT5qYWNrX3R5cGUgPSBTTkRfSkFDS19IRUFEU0VUOworCQkJcnQ1NjYzX2VuYWJsZV9wdXNoX2J1dHRvbl9pcnEoY29kZWMsIHRydWUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIk1JQ0JJQVMxIik7CisJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIk1JQ0JJQVMyIik7CisJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIk1pYyBEZXQgUG93ZXIiKTsKKwkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQ0JKIFBvd2VyIik7CisJCQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKKwkJCXJ0NTY2OC0+amFja190eXBlID0gU05EX0pBQ0tfSEVBRFBIT05FOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfUkVDTUlYLCAweDgsIDB4MCk7CisKKwkJaWYgKHJ0NTY2OC0+amFja190eXBlID09IFNORF9KQUNLX0hFQURTRVQpIHsKKwkJCXJ0NTY2M19lbmFibGVfcHVzaF9idXR0b25faXJxKGNvZGVjLCBmYWxzZSk7CisJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIk1JQ0JJQVMxIik7CisJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIk1JQ0JJQVMyIik7CisJCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIk1pYyBEZXQgUG93ZXIiKTsKKwkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiQ0JKIFBvd2VyIik7CisJCQlzbmRfc29jX2RhcG1fc3luYyhkYXBtKTsKKwkJfQorCQlydDU2NjgtPmphY2tfdHlwZSA9IDA7CisJfQorCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiamFja190eXBlID0gJWRcbiIsIHJ0NTY2OC0+amFja190eXBlKTsKKwlyZXR1cm4gcnQ1NjY4LT5qYWNrX3R5cGU7Cit9CisKKy8qKgorICogcnQ1NjYzX2phY2tfZGV0ZWN0IC0gRGV0ZWN0IGhlYWRzZXQuCisgKiBAY29kZWM6IFNvQyBhdWRpbyBjb2RlYyBkZXZpY2UuCisgKiBAamFja19pbnNlcnQ6IEphY2sgaW5zZXJ0IG9yIG5vdC4KKyAqCisgKiBEZXRlY3Qgd2hldGhlciBpcyBoZWFkc2V0IG9yIG5vdCB3aGVuIGphY2sgaW5zZXJ0ZWQuCisgKgorICogUmV0dXJucyBkZXRlY3Qgc3RhdHVzLgorICovCitzdGF0aWMgaW50IHJ0NTY2M19qYWNrX2RldGVjdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGludCBqYWNrX2luc2VydCkKK3sKKwlzdHJ1Y3QgcnQ1NjYzX3ByaXYgKnJ0NTY2MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCB2YWwsIGkgPSAwLCBzbGVlcF90aW1lWzVdID0gezMwMCwgMTUwLCAxMDAsIDUwLCAzMH07CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyBqYWNrX2luc2VydDolZFxuIiwgX19mdW5jX18sIGphY2tfaW5zZXJ0KTsKKworCWlmIChqYWNrX2luc2VydCkgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfRElHX01JU0MsCisJCQlSVDU2NjhfRElHX0dBVEVfQ1RSTF9NQVNLLCBSVDU2NjhfRElHX0dBVEVfQ1RSTF9FTik7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19IUF9DSEFSR0VfUFVNUF8xLAorCQkJUlQ1NjYzX1NJX0hQX01BU0sgfCBSVDU2NjhfT1NXX0hQX0xfTUFTSyB8CisJCQlSVDU2NjhfT1NXX0hQX1JfTUFTSywgUlQ1NjYzX1NJX0hQX0VOIHwKKwkJCVJUNTY2OF9PU1dfSFBfTF9ESVMgfCBSVDU2NjhfT1NXX0hQX1JfRElTKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0RVTU1ZXzEsCisJCQlSVDU2NjNfRU1CX0NMS19NQVNLIHwgUlQ1NjYzX0hQQV9DUExfQklBU19NQVNLIHwKKwkJCVJUNTY2M19IUEFfQ1BSX0JJQVNfTUFTSywgUlQ1NjYzX0VNQl9DTEtfRU4gfAorCQkJUlQ1NjYzX0hQQV9DUExfQklBU18xIHwgUlQ1NjYzX0hQQV9DUFJfQklBU18xKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0NCSl8xLAorCQkJUlQ1NjYzX0lOQlVGX0NCSl9CU1QxX01BU0sgfCBSVDU2NjNfQ0JKX1NFTlNFX0JTVDFfTUFTSywKKwkJCVJUNTY2M19JTkJVRl9DQkpfQlNUMV9PTiB8IFJUNTY2M19DQkpfU0VOU0VfQlNUMV9MKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0lMX0NNRF8yLAorCQkJUlQ1NjYzX1BXUl9NSUNfREVUX01BU0ssIFJUNTY2M19QV1JfTUlDX0RFVF9PTik7CisJCS8qIEJTVDEgcG93ZXIgb24gZm9yIEpEICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19QV1JfQU5MR18yLAorCQkJUlQ1NjY4X1BXUl9CU1QxX01BU0ssIFJUNTY2OF9QV1JfQlNUMV9PTik7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19FTV9KQUNLX1RZUEVfMSwKKwkJCVJUNTY2M19DQkpfREVUX01BU0sgfCBSVDU2NjNfRVhUX0pEX01BU0sgfAorCQkJUlQ1NjYzX1BPTF9FWFRfSkRfTUFTSywgUlQ1NjYzX0NCSl9ERVRfRU4gfAorCQkJUlQ1NjYzX0VYVF9KRF9FTiB8IFJUNTY2M19QT0xfRVhUX0pEX0VOKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX1BXUl9BTkxHXzEsCisJCQlSVDU2NjhfUFdSX01CX01BU0sgfCBSVDU2NjhfTERPMV9EVk9fTUFTSyB8CisJCQlSVDU2NjhfQU1QX0hQX01BU0ssIFJUNTY2OF9QV1JfTUIgfAorCQkJUlQ1NjY4X0xETzFfRFZPXzBfOVYgfCBSVDU2NjhfQU1QX0hQXzNYKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0FVVE9fMU1SQ19DTEssCisJCQlSVDU2NjhfSVJRX1BPV19TQVZfTUFTSywgUlQ1NjY4X0lSUV9QT1dfU0FWX0VOKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0lSUV8xLAorCQkJUlQ1NjYzX0VOX0lSUV9KRDFfTUFTSywgUlQ1NjYzX0VOX0lSUV9KRDFfRU4pOworCQl3aGlsZSAoaSA8IDUpIHsKKwkJCW1zbGVlcChzbGVlcF90aW1lW2ldKTsKKwkJCXZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgUlQ1NjYzX0VNX0pBQ0tfVFlQRV8yKSAmCisJCQkJMHgwMDAzOworCQkJaSsrOworCQkJaWYgKHZhbCA9PSAweDEgfHwgdmFsID09IDB4MiB8fCB2YWwgPT0gMHgzKQorCQkJCWJyZWFrOworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IE1YLTAwZTcgdmFsPSV4IHNsZWVwICVkXG4iLAorCQkJCV9fZnVuY19fLCB2YWwsIHNsZWVwX3RpbWVbaV0pOworCQl9CisJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzIHZhbCA9ICVkXG4iLCBfX2Z1bmNfXywgdmFsKTsKKwkJc3dpdGNoICh2YWwpIHsKKwkJY2FzZSAxOgorCQljYXNlIDI6CisJCQlydDU2NjMtPmphY2tfdHlwZSA9IFNORF9KQUNLX0hFQURTRVQ7CisJCQlydDU2NjNfZW5hYmxlX3B1c2hfYnV0dG9uX2lycShjb2RlYywgdHJ1ZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJ0NTY2My0+amFja190eXBlID0gU05EX0pBQ0tfSEVBRFBIT05FOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlpZiAocnQ1NjYzLT5qYWNrX3R5cGUgPT0gU05EX0pBQ0tfSEVBRFNFVCkKKwkJCXJ0NTY2M19lbmFibGVfcHVzaF9idXR0b25faXJxKGNvZGVjLCBmYWxzZSk7CisJCXJ0NTY2My0+amFja190eXBlID0gMDsKKwl9CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICJqYWNrX3R5cGUgPSAlZFxuIiwgcnQ1NjYzLT5qYWNrX3R5cGUpOworCXJldHVybiBydDU2NjMtPmphY2tfdHlwZTsKK30KKworc3RhdGljIGludCBydDU2NjNfYnV0dG9uX2RldGVjdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJaW50IGJ0bl90eXBlLCB2YWw7CisKKwl2YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIFJUNTY2M19JTF9DTURfNSk7CisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IHZhbD0weCV4XG4iLCBfX2Z1bmNfXywgdmFsKTsKKwlidG5fdHlwZSA9IHZhbCAmIDB4ZmZmMDsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2NjNfSUxfQ01EXzUsIHZhbCk7CisKKwlyZXR1cm4gYnRuX3R5cGU7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBydDU2NjNfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHJ0NTY2M19wcml2ICpydDU2NjMgPSBkYXRhOworCisJZGV2X2RiZyhydDU2NjMtPmNvZGVjLT5kZXYsICIlcyBJUlEgcXVldWUgd29ya1xuIiwgX19mdW5jX18pOworCisJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV93cSwgJnJ0NTY2My0+amFja19kZXRlY3Rfd29yaywKKwkJbXNlY3NfdG9famlmZmllcygyNTApKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworaW50IHJ0NTY2M19zZXRfamFja19kZXRlY3Qoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCXN0cnVjdCBzbmRfc29jX2phY2sgKmhzX2phY2spCit7CisJc3RydWN0IHJ0NTY2M19wcml2ICpydDU2NjMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXJ0NTY2My0+aHNfamFjayA9IGhzX2phY2s7CisKKwlydDU2NjNfaXJxKDAsIHJ0NTY2Myk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJ0NTY2M19zZXRfamFja19kZXRlY3QpOworCitzdGF0aWMgYm9vbCBydDU2NjNfY2hlY2tfamRfc3RhdHVzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgcnQ1NjYzX3ByaXYgKnJ0NTY2MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCB2YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIFJUNTY2M19JTlRfU1RfMSk7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyB2YWw9JXhcbiIsIF9fZnVuY19fLCB2YWwpOworCisJLyogSkQxICovCisJc3dpdGNoIChydDU2NjMtPmNvZGVjX3R5cGUpIHsKKwljYXNlIENPREVDX1RZUEVfUlQ1NjY4OgorCQlyZXR1cm4gISh2YWwgJiAweDIwMDApOworCWNhc2UgQ09ERUNfVFlQRV9SVDU2NjM6CisJCXJldHVybiAhKHZhbCAmIDB4MTAwMCk7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiVW5rbm93biBDT0RFQ19UWVBFXG4iKTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIHJ0NTY2M19qYWNrX2RldGVjdF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgcnQ1NjYzX3ByaXYgKnJ0NTY2MyA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcnQ1NjYzX3ByaXYsIGphY2tfZGV0ZWN0X3dvcmsud29yayk7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnQ1NjYzLT5jb2RlYzsKKwlpbnQgYnRuX3R5cGUsIHJlcG9ydCA9IDA7CisKKwlpZiAoIWNvZGVjKQorCQlyZXR1cm47CisKKwlpZiAocnQ1NjYzX2NoZWNrX2pkX3N0YXR1cyhjb2RlYykpIHsKKwkJLyogamFjayBpbiAqLworCQlpZiAocnQ1NjYzLT5qYWNrX3R5cGUgPT0gMCkgeworCQkJLyogamFjayB3YXMgb3V0LCByZXBvcnQgamFjayB0eXBlICovCisJCQlzd2l0Y2ggKHJ0NTY2My0+Y29kZWNfdHlwZSkgeworCQkJY2FzZSBDT0RFQ19UWVBFX1JUNTY2ODoKKwkJCQlyZXBvcnQgPSBydDU2NjhfamFja19kZXRlY3QocnQ1NjYzLT5jb2RlYywgMSk7CisJCQkJYnJlYWs7CisJCQljYXNlIENPREVDX1RZUEVfUlQ1NjYzOgorCQkJCXJlcG9ydCA9IHJ0NTY2M19qYWNrX2RldGVjdChydDU2NjMtPmNvZGVjLCAxKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiVW5rbm93biBDT0RFQ19UWVBFXG4iKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIGphY2sgaXMgYWxyZWFkeSBpbiwgcmVwb3J0IGJ1dHRvbiBldmVudCAqLworCQkJcmVwb3J0ID0gU05EX0pBQ0tfSEVBRFNFVDsKKwkJCWJ0bl90eXBlID0gcnQ1NjYzX2J1dHRvbl9kZXRlY3QocnQ1NjYzLT5jb2RlYyk7CisJCQkvKioKKwkJCSAqIHJ0NTY2MyBjYW4gcmVwb3J0IHRocmVlIGtpbmRzIG9mIGJ1dHRvbiBiZWhhdmlvciwKKwkJCSAqIG9uZSBjbGljaywgZG91YmxlIGNsaWNrIGFuZCBob2xkLiBIb3dldmVyLAorCQkJICogY3VycmVudGx5IHdlIHdpbGwgcmVwb3J0IGJ1dHRvbiBwcmVzc2VkL3JlbGVhc2VkCisJCQkgKiBldmVudC4gU28gYWxsIHRoZSB0aHJlZSBidXR0b24gYmVoYXZpb3JzIGFyZQorCQkJICogdHJlYXRlZCBhcyBidXR0b24gcHJlc3NlZC4KKwkJCSAqLworCQkJc3dpdGNoIChidG5fdHlwZSkgeworCQkJY2FzZSAweDgwMDA6CisJCQljYXNlIDB4NDAwMDoKKwkJCWNhc2UgMHgyMDAwOgorCQkJCXJlcG9ydCB8PSBTTkRfSkFDS19CVE5fMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgxMDAwOgorCQkJY2FzZSAweDA4MDA6CisJCQljYXNlIDB4MDQwMDoKKwkJCQlyZXBvcnQgfD0gU05EX0pBQ0tfQlROXzE7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MDIwMDoKKwkJCWNhc2UgMHgwMTAwOgorCQkJY2FzZSAweDAwODA6CisJCQkJcmVwb3J0IHw9IFNORF9KQUNLX0JUTl8yOworCQkJCWJyZWFrOworCQkJY2FzZSAweDAwNDA6CisJCQljYXNlIDB4MDAyMDoKKwkJCWNhc2UgMHgwMDEwOgorCQkJCXJlcG9ydCB8PSBTTkRfSkFDS19CVE5fMzsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwMDAwOiAvKiB1bnByZXNzZWQgKi8KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnRuX3R5cGUgPSAwOworCQkJCWRldl9lcnIocnQ1NjYzLT5jb2RlYy0+ZGV2LAorCQkJCQkiVW5leHBlY3RlZCBidXR0b24gY29kZSAweCUwNHhcbiIsCisJCQkJCWJ0bl90eXBlKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIGJ1dHRvbiByZWxlYXNlIG9yIHNwdXJpb3VzIGludGVycnB1dCovCisJCQlpZiAoYnRuX3R5cGUgPT0gMCkKKwkJCQlyZXBvcnQgPSAgcnQ1NjYzLT5qYWNrX3R5cGU7CisJCX0KKwl9IGVsc2UgeworCQkvKiBqYWNrIG91dCAqLworCQlzd2l0Y2ggKHJ0NTY2My0+Y29kZWNfdHlwZSkgeworCQljYXNlIENPREVDX1RZUEVfUlQ1NjY4OgorCQkJcmVwb3J0ID0gcnQ1NjY4X2phY2tfZGV0ZWN0KHJ0NTY2My0+Y29kZWMsIDApOworCQkJYnJlYWs7CisJCWNhc2UgQ09ERUNfVFlQRV9SVDU2NjM6CisJCQlyZXBvcnQgPSBydDU2NjNfamFja19kZXRlY3QocnQ1NjYzLT5jb2RlYywgMCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIoY29kZWMtPmRldiwgIlVua25vd24gQ09ERUNfVFlQRVxuIik7CisJCX0KKwl9CisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgamFjayByZXBvcnQ6IDB4JTA0eFxuIiwgX19mdW5jX18sIHJlcG9ydCk7CisJc25kX3NvY19qYWNrX3JlcG9ydChydDU2NjMtPmhzX2phY2ssIHJlcG9ydCwgU05EX0pBQ0tfSEVBRFNFVCB8CisJCQkgICAgU05EX0pBQ0tfQlROXzAgfCBTTkRfSkFDS19CVE5fMSB8CisJCQkgICAgU05EX0pBQ0tfQlROXzIgfCBTTkRfSkFDS19CVE5fMyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjNfc25kX2NvbnRyb2xzW10gPSB7CisJLyogREFDIERpZ2l0YWwgVm9sdW1lICovCisJU09DX0RPVUJMRV9UTFYoIkRBQyBQbGF5YmFjayBWb2x1bWUiLCBSVDU2NjNfU1RPMV9EQUNfRElHX1ZPTCwKKwkJUlQ1NjY4X0RBQ19MMV9WT0xfU0hJRlQgKyAxLCBSVDU2NjhfREFDX1IxX1ZPTF9TSElGVCArIDEsCisJCTg3LCAwLCBkYWNfdm9sX3RsdiksCisJLyogQURDIERpZ2l0YWwgVm9sdW1lIENvbnRyb2wgKi8KKwlTT0NfRE9VQkxFKCJBREMgQ2FwdHVyZSBTd2l0Y2giLCBSVDU2NjNfU1RPMV9BRENfRElHX1ZPTCwKKwkJUlQ1NjY4X0FEQ19MX01VVEVfU0hJRlQsIFJUNTY2OF9BRENfUl9NVVRFX1NISUZULCAxLCAxKSwKKwlTT0NfRE9VQkxFX1RMVigiQURDIENhcHR1cmUgVm9sdW1lIiwgUlQ1NjYzX1NUTzFfQURDX0RJR19WT0wsCisJCVJUNTY2OF9BRENfTF9WT0xfU0hJRlQgKyAxLCBSVDU2NjhfQURDX1JfVk9MX1NISUZUICsgMSwKKwkJNjMsIDAsIGFkY192b2xfdGx2KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2Njhfc3BlY2lmaWNfY29udHJvbHNbXSA9IHsKKwkvKiBIZWFkcGhvbmUgT3V0cHV0IFZvbHVtZSAqLworCVNPQ19ET1VCTEVfUl9UTFYoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCBSVDU2NjNfSFBfTENIX0RSRSwKKwkJUlQ1NjYzX0hQX1JDSF9EUkUsIFJUNTY2OF9HQUlOX0hQX1NISUZULCAxNSwgMSwKKwkJcnQ1NjY4X2hwX3ZvbF90bHYpLAorCS8qIE1pYyBCb29zdCBWb2x1bWUgKi8KKwlTT0NfU0lOR0xFX1RMVigiSU4xIENhcHR1cmUgVm9sdW1lIiwgUlQ1NjY4X0FFQ19CU1QsCisJCVJUNTY2OF9HQUlOX0NCSl9TSElGVCwgOCwgMCwgaW5fYnN0X3RsdiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjYzX3NwZWNpZmljX2NvbnRyb2xzW10gPSB7CisJLyogSGVhZHBob25lIE91dHB1dCBWb2x1bWUgKi8KKwlTT0NfRE9VQkxFX1JfVExWKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgUlQ1NjYzX1NUT19EUkVfOSwKKwkJUlQ1NjYzX1NUT19EUkVfMTAsIFJUNTY2M19EUkVfR0FJTl9IUF9TSElGVCwgMjMsIDEsCisJCXJ0NTY2M19ocF92b2xfdGx2KSwKKwkvKiBNaWMgQm9vc3QgVm9sdW1lKi8KKwlTT0NfU0lOR0xFX1RMVigiSU4xIENhcHR1cmUgVm9sdW1lIiwgUlQ1NjYzX0NCSl8yLAorCQlSVDU2NjNfR0FJTl9CU1QxX1NISUZULCA4LCAwLCBpbl9ic3RfdGx2KSwKKwkvKiBEYXRhIFN3YXAgZm9yIFNsb3QwLzEgaW4gQURDREFUMSAqLworCVNPQ19FTlVNKCJJRjEgQURDIERhdGEgU3dhcCIsIHJ0NTY2M19pZjFfYWRjX2VudW0pLAorfTsKKworc3RhdGljIGludCBydDU2NjNfaXNfc3lzX2Nsa19mcm9tX3BsbChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc2luaykKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKworCXZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgUlQ1NjYzX0dMQl9DTEspOworCXZhbCAmPSBSVDU2NjNfU0NMS19TUkNfTUFTSzsKKwlpZiAodmFsID09IFJUNTY2M19TQ0xLX1NSQ19QTEwxKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0NTY2M19pc191c2luZ19hc3JjKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpzaW5rKQoreworCXVuc2lnbmVkIGludCByZWcsIHNoaWZ0LCB2YWw7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXN0cnVjdCBydDU2NjNfcHJpdiAqcnQ1NjYzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlpZiAocnQ1NjYzLT5jb2RlY190eXBlID09IENPREVDX1RZUEVfUlQ1NjY4KSB7CisJCXN3aXRjaCAody0+c2hpZnQpIHsKKwkJY2FzZSBSVDU2NjhfQURDX1NUTzFfQVNSQ19TSElGVDoKKwkJCXJlZyA9IFJUNTY2OF9BU1JDXzM7CisJCQlzaGlmdCA9IFJUNTY2OF9BRF9TVE8xX1RSQUNLX1NISUZUOworCQkJYnJlYWs7CisJCWNhc2UgUlQ1NjY4X0RBQ19TVE8xX0FTUkNfU0hJRlQ6CisJCQlyZWcgPSBSVDU2NjNfQVNSQ18yOworCQkJc2hpZnQgPSBSVDU2NjhfREFfU1RPMV9UUkFDS19TSElGVDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKHctPnNoaWZ0KSB7CisJCWNhc2UgUlQ1NjYzX0FEQ19TVE8xX0FTUkNfU0hJRlQ6CisJCQlyZWcgPSBSVDU2NjNfQVNSQ18yOworCQkJc2hpZnQgPSBSVDU2NjNfQURfU1RPMV9UUkFDS19TSElGVDsKKwkJCWJyZWFrOworCQljYXNlIFJUNTY2M19EQUNfU1RPMV9BU1JDX1NISUZUOgorCQkJcmVnID0gUlQ1NjYzX0FTUkNfMjsKKwkJCXNoaWZ0ID0gUlQ1NjYzX0RBX1NUTzFfVFJBQ0tfU0hJRlQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJdmFsID0gKHNuZF9zb2NfcmVhZChjb2RlYywgcmVnKSA+PiBzaGlmdCkgJiAweDc7CisKKwlpZiAodmFsKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0NTY2M19pMnNfdXNlX2FzcmMoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNvdXJjZSwKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc2luaykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMoc291cmNlLT5kYXBtKTsKKwlzdHJ1Y3QgcnQ1NjYzX3ByaXYgKnJ0NTY2MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCBkYV9hc3JjX2VuLCBhZF9hc3JjX2VuOworCisJZGFfYXNyY19lbiA9IChzbmRfc29jX3JlYWQoY29kZWMsIFJUNTY2M19BU1JDXzIpICYKKwkJUlQ1NjYzX0RBX1NUTzFfVFJBQ0tfTUFTSykgPyAxIDogMDsKKwlzd2l0Y2ggKHJ0NTY2My0+Y29kZWNfdHlwZSkgeworCWNhc2UgQ09ERUNfVFlQRV9SVDU2Njg6CisJCWFkX2FzcmNfZW4gPSAoc25kX3NvY19yZWFkKGNvZGVjLCBSVDU2NjhfQVNSQ18zKSAmCisJCQlSVDU2NjhfQURfU1RPMV9UUkFDS19NQVNLKSA/IDEgOiAwOworCQlicmVhazsKKwljYXNlIENPREVDX1RZUEVfUlQ1NjYzOgorCQlhZF9hc3JjX2VuID0gKHNuZF9zb2NfcmVhZChjb2RlYywgUlQ1NjYzX0FTUkNfMikgJgorCQkJUlQ1NjYzX0FEX1NUTzFfVFJBQ0tfTUFTSykgPyAxIDogMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiVW5rbm93biBDT0RFQ19UWVBFXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGRhX2FzcmNfZW4gfHwgYWRfYXNyY19lbikKKwkJaWYgKHJ0NTY2My0+c3lzY2xrID4gcnQ1NjYzLT5scmNrICogMzg0KQorCQkJcmV0dXJuIDE7CisKKwlkZXZfZXJyKGNvZGVjLT5kZXYsICJzeXNjbGsgPCAzODQgeCBmcywgZGlzYWJsZSBpMnMgYXNyY1xuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBydDU2NjNfc2VsX2FzcmNfY2xrX3NyYyAtIHNlbGVjdCBBU1JDIGNsb2NrIHNvdXJjZSBmb3IgYSBzZXQgb2YgZmlsdGVycworICogQGNvZGVjOiBTb0MgYXVkaW8gY29kZWMgZGV2aWNlLgorICogQGZpbHRlcl9tYXNrOiBtYXNrIG9mIGZpbHRlcnMuCisgKiBAY2xrX3NyYzogY2xvY2sgc291cmNlCisgKgorICogVGhlIEFTUkMgZnVuY3Rpb24gaXMgZm9yIGFzeW5jaHJvbm91cyBNQ0xLIGFuZCBMUkNLLiBBbHNvLCBzaW5jZSBSVDU2NjggY2FuCisgKiBvbmx5IHN1cHBvcnQgc3RhbmRhcmQgMzJmcyBvciA2NGZzIGkycyBmb3JtYXQsIEFTUkMgc2hvdWxkIGJlIGVuYWJsZWQgdG8KKyAqIHN1cHBvcnQgc3BlY2lhbCBpMnMgY2xvY2sgZm9ybWF0IHN1Y2ggYXMgSW50ZWwncyAxMDBmcygxMDAgKiBzYW1wbGluZyByYXRlKS4KKyAqIEFTUkMgZnVuY3Rpb24gd2lsbCB0cmFjayBpMnMgY2xvY2sgYW5kIGdlbmVyYXRlIGEgY29ycmVzcG9uZGluZyBzeXN0ZW0gY2xvY2sKKyAqIGZvciBjb2RlYy4gVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhbiBBUEkgdG8gc2VsZWN0IHRoZSBjbG9jayBzb3VyY2UgZm9yIGEKKyAqIHNldCBvZiBmaWx0ZXJzIHNwZWNpZmllZCBieSB0aGUgbWFzay4gQW5kIHRoZSBjb2RlYyBkcml2ZXIgd2lsbCB0dXJuIG9uIEFTUkMKKyAqIGZvciB0aGVzZSBmaWx0ZXJzIGlmIEFTUkMgaXMgc2VsZWN0ZWQgYXMgdGhlaXIgY2xvY2sgc291cmNlLgorICovCitpbnQgcnQ1NjYzX3NlbF9hc3JjX2Nsa19zcmMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQl1bnNpZ25lZCBpbnQgZmlsdGVyX21hc2ssIHVuc2lnbmVkIGludCBjbGtfc3JjKQoreworCXN0cnVjdCBydDU2NjNfcHJpdiAqcnQ1NjY4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdW5zaWduZWQgaW50IGFzcmMyX21hc2sgPSAwOworCXVuc2lnbmVkIGludCBhc3JjMl92YWx1ZSA9IDA7CisJdW5zaWduZWQgaW50IGFzcmMzX21hc2sgPSAwOworCXVuc2lnbmVkIGludCBhc3JjM192YWx1ZSA9IDA7CisKKwlzd2l0Y2ggKGNsa19zcmMpIHsKKwljYXNlIFJUNTY2M19DTEtfU0VMX1NZUzoKKwljYXNlIFJUNTY2M19DTEtfU0VMX0kyUzFfQVNSQzoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZmlsdGVyX21hc2sgJiBSVDU2NjNfREFfU1RFUkVPX0ZJTFRFUikgeworCQlhc3JjMl9tYXNrIHw9IFJUNTY2OF9EQV9TVE8xX1RSQUNLX01BU0s7CisJCWFzcmMyX3ZhbHVlIHw9IGNsa19zcmMgPDwgUlQ1NjY4X0RBX1NUTzFfVFJBQ0tfU0hJRlQ7CisJfQorCisJaWYgKGZpbHRlcl9tYXNrICYgUlQ1NjYzX0FEX1NURVJFT19GSUxURVIpIHsKKwkJc3dpdGNoIChydDU2NjgtPmNvZGVjX3R5cGUpIHsKKwkJY2FzZSBDT0RFQ19UWVBFX1JUNTY2ODoKKwkJCWFzcmMzX21hc2sgfD0gUlQ1NjY4X0FEX1NUTzFfVFJBQ0tfTUFTSzsKKwkJCWFzcmMzX3ZhbHVlIHw9IGNsa19zcmMgPDwgUlQ1NjY4X0FEX1NUTzFfVFJBQ0tfU0hJRlQ7CisJCQlicmVhazsKKwkJY2FzZSBDT0RFQ19UWVBFX1JUNTY2MzoKKwkJCWFzcmMyX21hc2sgfD0gUlQ1NjYzX0FEX1NUTzFfVFJBQ0tfTUFTSzsKKwkJCWFzcmMyX3ZhbHVlIHw9IGNsa19zcmMgPDwgUlQ1NjYzX0FEX1NUTzFfVFJBQ0tfU0hJRlQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIoY29kZWMtPmRldiwgIlVua25vd24gQ09ERUNfVFlQRVxuIik7CisJCX0KKwl9CisKKwlpZiAoYXNyYzJfbWFzaykKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0FTUkNfMiwgYXNyYzJfbWFzaywKKwkJCWFzcmMyX3ZhbHVlKTsKKworCWlmIChhc3JjM19tYXNrKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjhfQVNSQ18zLCBhc3JjM19tYXNrLAorCQkJYXNyYzNfdmFsdWUpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChydDU2NjNfc2VsX2FzcmNfY2xrX3NyYyk7CisKKy8qIEFuYWxvZyBNaXhlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2OF9yZWNtaXgxbFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiQlNUMiBTd2l0Y2giLCBSVDU2NjhfUkVDTUlYMUwsCisJCVJUNTY2OF9SRUNNSVgxTF9CU1QyX1NISUZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkJTVDEgQ0JKIFN3aXRjaCIsIFJUNTY2OF9SRUNNSVgxTCwKKwkJUlQ1NjY4X1JFQ01JWDFMX0JTVDFfQ0JKX1NISUZULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjhfcmVjbWl4MXJbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkJTVDIgU3dpdGNoIiwgUlQ1NjY4X1JFQ01JWDFSLAorCQlSVDU2NjhfUkVDTUlYMVJfQlNUMl9TSElGVCwgMSwgMSksCit9OworCisvKiBEaWdpdGFsIE1peGVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjYzX3N0bzFfYWRjX2xfbWl4W10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJBREMxIFN3aXRjaCIsIFJUNTY2M19TVE8xX0FEQ19NSVhFUiwKKwkJCVJUNTY2OF9NX1NUTzFfQURDX0wxX1NISUZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkFEQzIgU3dpdGNoIiwgUlQ1NjYzX1NUTzFfQURDX01JWEVSLAorCQkJUlQ1NjY4X01fU1RPMV9BRENfTDJfU0hJRlQsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2OF9zdG8xX2FkY19yX21peFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiQURDMSBTd2l0Y2giLCBSVDU2NjNfU1RPMV9BRENfTUlYRVIsCisJCQlSVDU2NjhfTV9TVE8xX0FEQ19SMV9TSElGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJBREMyIFN3aXRjaCIsIFJUNTY2M19TVE8xX0FEQ19NSVhFUiwKKwkJCVJUNTY2OF9NX1NUTzFfQURDX1IyX1NISUZULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjNfYWRkYV9sX21peFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiQURDIEwgU3dpdGNoIiwgUlQ1NjYzX0FEX0RBX01JWEVSLAorCQkJUlQ1NjY4X01fQURDTUlYX0xfU0hJRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiREFDIEwgU3dpdGNoIiwgUlQ1NjYzX0FEX0RBX01JWEVSLAorCQkJUlQ1NjY4X01fREFDMV9MX1NISUZULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjNfYWRkYV9yX21peFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiQURDIFIgU3dpdGNoIiwgUlQ1NjYzX0FEX0RBX01JWEVSLAorCQkJUlQ1NjY4X01fQURDTUlYX1JfU0hJRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiREFDIFIgU3dpdGNoIiwgUlQ1NjYzX0FEX0RBX01JWEVSLAorCQkJUlQ1NjY4X01fREFDMV9SX1NISUZULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjNfc3RvMV9kYWNfbF9taXhbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkRBQyBMIFN3aXRjaCIsIFJUNTY2M19TVE9fREFDX01JWEVSLAorCQkJUlQ1NjY4X01fREFDX0wxX1NUT19MX1NISUZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkRBQyBSIFN3aXRjaCIsIFJUNTY2M19TVE9fREFDX01JWEVSLAorCQkJUlQ1NjY4X01fREFDX1IxX1NUT19MX1NISUZULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjNfc3RvMV9kYWNfcl9taXhbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkRBQyBMIFN3aXRjaCIsIFJUNTY2M19TVE9fREFDX01JWEVSLAorCQkJUlQ1NjY4X01fREFDX0wxX1NUT19SX1NISUZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkRBQyBSIFN3aXRjaCIsIFJUNTY2M19TVE9fREFDX01JWEVSLAorCQkJUlQ1NjY4X01fREFDX1IxX1NUT19SX1NISUZULCAxLCAxKSwKK307CisKKy8qIE91dCBTd2l0Y2ggKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjhfaHBvX3N3aXRjaCA9CisJU09DX0RBUE1fU0lOR0xFX0FVVE9ESVNBQkxFKCJTd2l0Y2giLCBSVDU2NjhfSFBfQU1QXzIsCisJCVJUNTY2OF9FTl9EQUNfSFBPX1NISUZULCAxLCAwKTsKKworLyogU3RlcmVvIEFEQyBzb3VyY2UgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnQ1NjY4X3N0bzFfYWRjX3NyY1tdID0geworCSJBREMgTCIsICJBREMgUiIKK307CisKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2Njhfc3RvMV9hZGNsX2VudW0sIFJUNTY2M19TVE8xX0FEQ19NSVhFUiwKKwlSVDU2NjhfU1RPMV9BRENfTF9TUkNfU0hJRlQsIHJ0NTY2OF9zdG8xX2FkY19zcmMpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjY4X3N0bzFfYWRjbF9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlNUTzEgQURDIEwgTXV4IiwgcnQ1NjY4X3N0bzFfYWRjbF9lbnVtKTsKKworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTY2OF9zdG8xX2FkY3JfZW51bSwgUlQ1NjYzX1NUTzFfQURDX01JWEVSLAorCVJUNTY2OF9TVE8xX0FEQ19SX1NSQ19TSElGVCwgcnQ1NjY4X3N0bzFfYWRjX3NyYyk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2Njhfc3RvMV9hZGNyX211eCA9CisJU09DX0RBUE1fRU5VTSgiU1RPMSBBREMgUiBNdXgiLCBydDU2Njhfc3RvMV9hZGNyX2VudW0pOworCisvKiBSVDU2NjM6IEFuYWxvZyBEQUNMMSBpbnB1dCBzb3VyY2UgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnQ1NjYzX2FsZ19kYWNsX3NyY1tdID0geworCSJEQUMgTCIsICJTVE8gREFDIE1JWEwiCit9OworCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjYzX2FsZ19kYWNsX2VudW0sIFJUNTY2M19CWVBBU1NfU1RPX0RBQywKKwlSVDU2NjNfREFDTDFfU1JDX1NISUZULCBydDU2NjNfYWxnX2RhY2xfc3JjKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2M19hbGdfZGFjbF9tdXggPQorCVNPQ19EQVBNX0VOVU0oIkRBQyBMIE11eCIsIHJ0NTY2M19hbGdfZGFjbF9lbnVtKTsKKworLyogUlQ1NjYzOiBBbmFsb2cgREFDUjEgaW5wdXQgc291cmNlICovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJ0NTY2M19hbGdfZGFjcl9zcmNbXSA9IHsKKwkiREFDIFIiLCAiU1RPIERBQyBNSVhSIgorfTsKKworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTY2M19hbGdfZGFjcl9lbnVtLCBSVDU2NjNfQllQQVNTX1NUT19EQUMsCisJUlQ1NjYzX0RBQ1IxX1NSQ19TSElGVCwgcnQ1NjYzX2FsZ19kYWNyX3NyYyk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjNfYWxnX2RhY3JfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJEQUMgUiBNdXgiLCBydDU2NjNfYWxnX2RhY3JfZW51bSk7CisKK3N0YXRpYyBpbnQgcnQ1NjYzX2hwX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCXN0cnVjdCBydDU2NjNfcHJpdiAqcnQ1NjYzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCWlmIChydDU2NjMtPmNvZGVjX3R5cGUgPT0gQ09ERUNfVFlQRV9SVDU2NjgpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19IUF9DSEFSR0VfUFVNUF8xLAorCQkJCVJUNTY2OF9TRUxfUE1fSFBfU0hJRlQsIFJUNTY2OF9TRUxfUE1fSFBfSElHSCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfSFBfTE9HSUNfMiwKKwkJCQlSVDU2NjhfSFBfU0lHX1NSQzFfTUFTSywKKwkJCQlSVDU2NjhfSFBfU0lHX1NSQzFfU0lMRU5DRSk7CisJCX0gZWxzZSB7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2NjNfREVQT1BfMiwgMHgzMDAzKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19ERVBPUF8xLCAweDAwMGIsCisJCQkJMHgwMDBiKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19ERVBPUF8xLCAweDAwMzAsCisJCQkJMHgwMDMwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19IUF9DSEFSR0VfUFVNUF8xLAorCQkJCVJUNTY2OF9PVkNEX0hQX01BU0ssIFJUNTY2OF9PVkNEX0hQX0RJUyk7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2NjNfSFBfQ0hBUkdFX1BVTVBfMiwgMHgxMzcxKTsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTY2M19IUF9CSUFTLCAweGFiYmEpOworCQkJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjYzX0NIQVJHRV9QVU1QXzEsIDB4MjIyNCk7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2NjNfQU5BX0JJQVNfQ1VSXzEsIDB4Nzc2Nik7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2NjNfSFBfQklBUywgMHhhZmFhKTsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTY2M19DSEFSR0VfUFVNUF8yLCAweDc3NzcpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0RFUE9QXzEsIDB4MzAwMCwKKwkJCQkweDMwMDApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNRDoKKwkJaWYgKHJ0NTY2My0+Y29kZWNfdHlwZSA9PSBDT0RFQ19UWVBFX1JUNTY2OCkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0hQX0xPR0lDXzIsCisJCQkJUlQ1NjY4X0hQX1NJR19TUkMxX01BU0ssCisJCQkJUlQ1NjY4X0hQX1NJR19TUkMxX1JFRyk7CisJCX0gZWxzZSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfREVQT1BfMSwgMHgzMDAwLCAweDApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0hQX0NIQVJHRV9QVU1QXzEsCisJCQkJUlQ1NjY4X09WQ0RfSFBfTUFTSywgUlQ1NjY4X09WQ0RfSFBfRU4pOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0RFUE9QXzEsIDB4MDAzMCwgMHgwKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19ERVBPUF8xLCAweDAwMGIsCisJCQkJMHgwMDBiKTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0NTY2OF9ic3QyX3Bvd2VyKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfUFdSX0FOTEdfMiwKKwkJCVJUNTY2OF9QV1JfQlNUMl9NQVNLIHwgUlQ1NjY4X1BXUl9CU1QyX09QX01BU0ssCisJCQlSVDU2NjhfUFdSX0JTVDIgfCBSVDU2NjhfUFdSX0JTVDJfT1ApOworCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19QV1JfQU5MR18yLAorCQkJUlQ1NjY4X1BXUl9CU1QyX01BU0sgfCBSVDU2NjhfUFdSX0JTVDJfT1BfTUFTSywgMCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjYzX3ByZV9kaXZfcG93ZXIoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTY2M19QUkVfRElWX0dBVElOR18xLCAweGZmMDApOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2NjNfUFJFX0RJVl9HQVRJTkdfMiwgMHhmZmZjKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgorCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2NjNfUFJFX0RJVl9HQVRJTkdfMSwgMHgwMDAwKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjYzX1BSRV9ESVZfR0FUSU5HXzIsIDB4MDAwMCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBydDU2NjNfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX1NVUFBMWSgiUExMIiwgUlQ1NjYzX1BXUl9BTkxHXzMsIFJUNTY2OF9QV1JfUExMX1NISUZULCAwLAorCQlOVUxMLCAwKSwKKworCS8qIG1pY2JpYXMgKi8KKwlTTkRfU09DX0RBUE1fTUlDQklBUygiTUlDQklBUzEiLCBSVDU2NjNfUFdSX0FOTEdfMiwKKwkJUlQ1NjY4X1BXUl9NQjFfU0hJRlQsIDApLAorCVNORF9TT0NfREFQTV9NSUNCSUFTKCJNSUNCSUFTMiIsIFJUNTY2M19QV1JfQU5MR18yLAorCQlSVDU2NjhfUFdSX01CMl9TSElGVCwgMCksCisKKwkvKiBJbnB1dCBMaW5lcyAqLworCVNORF9TT0NfREFQTV9JTlBVVCgiSU4xUCIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiSU4xTiIpLAorCisJLyogUkVDIE1peGVyIFBvd2VyICovCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiUkVDTUlYMUwgUG93ZXIiLCBSVDU2NjNfUFdSX0FOTEdfMiwKKwkJUlQ1NjY4X1BXUl9SRUNNSVgxX1NISUZULCAwLCBOVUxMLCAwKSwKKworCS8qIEFEQ3MgKi8KKwlTTkRfU09DX0RBUE1fQURDKCJBREMgTCIsIE5VTEwsIFNORF9TT0NfTk9QTSwgMCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiQURDIEwgUG93ZXIiLCBSVDU2NjNfUFdSX0RJR18xLAorCQlSVDU2NjhfUFdSX0FEQ19MMV9TSElGVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiQURDIENsb2NrIiwgUlQ1NjYzX0NIT1BfQURDLAorCQlSVDU2NjhfQ0tHRU5fQURDQ19TSElGVCwgMCwgTlVMTCwgMCksCisKKwkvKiBBREMgTWl4ZXIgKi8KKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNUTzEgQURDIE1JWEwiLCBTTkRfU09DX05PUE0sCisJCTAsIDAsIHJ0NTY2M19zdG8xX2FkY19sX21peCwKKwkJQVJSQVlfU0laRShydDU2NjNfc3RvMV9hZGNfbF9taXgpKSwKKworCS8qIEFEQyBGaWx0ZXIgUG93ZXIgKi8KKwlTTkRfU09DX0RBUE1fU1VQUExZKCJTVE8xIEFEQyBGaWx0ZXIiLCBSVDU2NjNfUFdSX0RJR18yLAorCQlSVDU2NjhfUFdSX0FEQ19TMUZfU0hJRlQsIDAsIE5VTEwsIDApLAorCisJLyogRGlnaXRhbCBJbnRlcmZhY2UgKi8KKwlTTkRfU09DX0RBUE1fU1VQUExZKCJJMlMiLCBSVDU2NjNfUFdSX0RJR18xLCBSVDU2NjhfUFdSX0kyUzFfU0hJRlQsIDAsCisJCU5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIklGIERBQyIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiSUYxIERBQzEgTCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiSUYxIERBQzEgUiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiSUYxIEFEQzEiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIklGIEFEQyIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisKKwkvKiBBdWRpbyBJbnRlcmZhY2UgKi8KKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJBSUZSWCIsICJBSUYgUGxheWJhY2siLCAwLCBTTkRfU09DX05PUE0sIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJBSUZUWCIsICJBSUYgQ2FwdHVyZSIsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCksCisKKwkvKiBEQUMgbWl4ZXIgYmVmb3JlIHNvdW5kIGVmZmVjdCAgKi8KKwlTTkRfU09DX0RBUE1fTUlYRVIoIkFEREEgTUlYTCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgcnQ1NjYzX2FkZGFfbF9taXgsCisJCUFSUkFZX1NJWkUocnQ1NjYzX2FkZGFfbF9taXgpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIkFEREEgTUlYUiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgcnQ1NjYzX2FkZGFfcl9taXgsCisJCUFSUkFZX1NJWkUocnQ1NjYzX2FkZGFfcl9taXgpKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJEQUMgTDEiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIkRBQyBSMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisKKwkvKiBEQUMgTWl4ZXIgKi8KKwlTTkRfU09DX0RBUE1fU1VQUExZKCJTVE8xIERBQyBGaWx0ZXIiLCBSVDU2NjNfUFdSX0RJR18yLAorCQlSVDU2NjhfUFdSX0RBQ19TMUZfU0hJRlQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9NSVhFUigiU1RPMSBEQUMgTUlYTCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJcnQ1NjYzX3N0bzFfZGFjX2xfbWl4LCBBUlJBWV9TSVpFKHJ0NTY2M19zdG8xX2RhY19sX21peCkpLAorCVNORF9TT0NfREFQTV9NSVhFUigiU1RPMSBEQUMgTUlYUiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJcnQ1NjYzX3N0bzFfZGFjX3JfbWl4LCBBUlJBWV9TSVpFKHJ0NTY2M19zdG8xX2RhY19yX21peCkpLAorCisJLyogREFDcyAqLworCVNORF9TT0NfREFQTV9TVVBQTFkoIlNUTzEgREFDIEwgUG93ZXIiLCBSVDU2NjNfUFdSX0RJR18xLAorCQlSVDU2NjhfUFdSX0RBQ19MMV9TSElGVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiU1RPMSBEQUMgUiBQb3dlciIsIFJUNTY2M19QV1JfRElHXzEsCisJCVJUNTY2OF9QV1JfREFDX1IxX1NISUZULCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fREFDKCJEQUMgTCIsIE5VTEwsIFNORF9TT0NfTk9QTSwgMCwgMCksCisJU05EX1NPQ19EQVBNX0RBQygiREFDIFIiLCBOVUxMLCBTTkRfU09DX05PUE0sIDAsIDApLAorCisJLyogSGVhZHBob25lKi8KKwlTTkRfU09DX0RBUE1fUEdBX1MoIkhQIEFtcCIsIDEsIFNORF9TT0NfTk9QTSwgMCwgMCwgcnQ1NjYzX2hwX2V2ZW50LAorCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSksCisKKwkvKiBPdXRwdXQgTGluZXMgKi8KKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJIUE9MIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiSFBPUiIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHJ0NTY2OF9zcGVjaWZpY19kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJMRE8yIiwgUlQ1NjYzX1BXUl9BTkxHXzMsCisJCVJUNTY2OF9QV1JfTERPMl9TSElGVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiTWljIERldCBQb3dlciIsIFJUNTY2OF9QV1JfVk9MLAorCQlSVDU2NjhfUFdSX01JQ19ERVRfU0hJRlQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIkxETyBEQUMiLCBSVDU2NjNfUFdSX0RJR18xLAorCQlSVDU2NjhfUFdSX0xET19EQUNSRUZfU0hJRlQsIDAsIE5VTEwsIDApLAorCisJLyogQVNSQyAqLworCVNORF9TT0NfREFQTV9TVVBQTFkoIkkyUyBBU1JDIiwgUlQ1NjYzX0FTUkNfMSwKKwkJUlQ1NjY4X0kyUzFfQVNSQ19TSElGVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiREFDIEFTUkMiLCBSVDU2NjNfQVNSQ18xLAorCQlSVDU2NjhfREFDX1NUTzFfQVNSQ19TSElGVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiQURDIEFTUkMiLCBSVDU2NjNfQVNSQ18xLAorCQlSVDU2NjhfQURDX1NUTzFfQVNSQ19TSElGVCwgMCwgTlVMTCwgMCksCisKKwkvKiBJbnB1dCBMaW5lcyAqLworCVNORF9TT0NfREFQTV9JTlBVVCgiSU4yUCIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiSU4yTiIpLAorCisJLyogQm9vc3QgKi8KKwlTTkRfU09DX0RBUE1fUEdBKCJCU1QxIENCSiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiQ0JKIFBvd2VyIiwgUlQ1NjYzX1BXUl9BTkxHXzMsCisJCVJUNTY2OF9QV1JfQ0JKX1NISUZULCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJCU1QyIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJCU1QyIFBvd2VyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQlydDU2NjhfYnN0Ml9wb3dlciwgU05EX1NPQ19EQVBNX1BSRV9QTUQgfAorCQlTTkRfU09DX0RBUE1fUE9TVF9QTVUpLAorCisJLyogUkVDIE1peGVyICovCisJU05EX1NPQ19EQVBNX01JWEVSKCJSRUNNSVgxTCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgcnQ1NjY4X3JlY21peDFsLAorCQlBUlJBWV9TSVpFKHJ0NTY2OF9yZWNtaXgxbCkpLAorCVNORF9TT0NfREFQTV9NSVhFUigiUkVDTUlYMVIiLCBTTkRfU09DX05PUE0sIDAsIDAsIHJ0NTY2OF9yZWNtaXgxciwKKwkJQVJSQVlfU0laRShydDU2NjhfcmVjbWl4MXIpKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJSRUNNSVgxUiBQb3dlciIsIFJUNTY2M19QV1JfQU5MR18yLAorCQlSVDU2NjhfUFdSX1JFQ01JWDJfU0hJRlQsIDAsIE5VTEwsIDApLAorCisJLyogQURDICovCisJU05EX1NPQ19EQVBNX0FEQygiQURDIFIiLCBOVUxMLCBTTkRfU09DX05PUE0sIDAsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIkFEQyBSIFBvd2VyIiwgUlQ1NjYzX1BXUl9ESUdfMSwKKwkJUlQ1NjY4X1BXUl9BRENfUjFfU0hJRlQsIDAsIE5VTEwsIDApLAorCisJLyogQURDIE11eCAqLworCVNORF9TT0NfREFQTV9QR0EoIlNUTzEgQURDIEwxIiwgUlQ1NjYzX1NUTzFfQURDX01JWEVSLAorCQlSVDU2NjhfU1RPMV9BRENfTDFfU1JDX1NISUZULCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJTVE8xIEFEQyBSMSIsIFJUNTY2M19TVE8xX0FEQ19NSVhFUiwKKwkJUlQ1NjY4X1NUTzFfQURDX1IxX1NSQ19TSElGVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiU1RPMSBBREMgTDIiLCBSVDU2NjNfU1RPMV9BRENfTUlYRVIsCisJCVJUNTY2OF9TVE8xX0FEQ19MMl9TUkNfU0hJRlQsIDEsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIlNUTzEgQURDIFIyIiwgUlQ1NjYzX1NUTzFfQURDX01JWEVSLAorCQlSVDU2NjhfU1RPMV9BRENfUjJfU1JDX1NISUZULCAxLCBOVUxMLCAwKSwKKworCVNORF9TT0NfREFQTV9NVVgoIlNUTzEgQURDIEwgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnQ1NjY4X3N0bzFfYWRjbF9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIlNUTzEgQURDIFIgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnQ1NjY4X3N0bzFfYWRjcl9tdXgpLAorCisJLyogQURDIE1peCAqLworCVNORF9TT0NfREFQTV9NSVhFUigiU1RPMSBBREMgTUlYUiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJcnQ1NjY4X3N0bzFfYWRjX3JfbWl4LCBBUlJBWV9TSVpFKHJ0NTY2OF9zdG8xX2FkY19yX21peCkpLAorCisJLyogQW5hbG9nIERBQyBDbG9jayAqLworCVNORF9TT0NfREFQTV9TVVBQTFkoIkRBQyBDbG9jayIsIFJUNTY2M19DSE9QX0RBQ19MLAorCQlSVDU2NjhfQ0tHRU5fREFDMV9TSElGVCwgMCwgTlVMTCwgMCksCisKKwkvKiBIZWFkcGhvbmUgb3V0ICovCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiSFBPIFBsYXliYWNrIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkmcnQ1NjY4X2hwb19zd2l0Y2gpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHJ0NTY2M19zcGVjaWZpY19kYXBtX3dpZGdldHNbXSA9IHsKKwkvKiBTeXN0ZW0gQ2xvY2sgUHJlIERpdmlkZXIgR2F0aW5nICovCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiUHJlIERpdiBQb3dlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJcnQ1NjYzX3ByZV9kaXZfcG93ZXIsIFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCVNORF9TT0NfREFQTV9QUkVfUE1EKSwKKworCS8qIExETyAqLworCVNORF9TT0NfREFQTV9TVVBQTFkoIkxETyBBREMiLCBSVDU2NjNfUFdSX0RJR18xLAorCQlSVDU2NjhfUFdSX0xET19EQUNSRUZfU0hJRlQsIDAsIE5VTEwsIDApLAorCisJLyogQVNSQyAqLworCVNORF9TT0NfREFQTV9TVVBQTFkoIkkyUyBBU1JDIiwgUlQ1NjYzX0FTUkNfMSwKKwkJUlQ1NjYzX0kyUzFfQVNSQ19TSElGVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiREFDIEFTUkMiLCBSVDU2NjNfQVNSQ18xLAorCQlSVDU2NjNfREFDX1NUTzFfQVNSQ19TSElGVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiQURDIEFTUkMiLCBSVDU2NjNfQVNSQ18xLAorCQlSVDU2NjNfQURDX1NUTzFfQVNSQ19TSElGVCwgMCwgTlVMTCwgMCksCisKKwkvKiBCb29zdCAqLworCVNORF9TT0NfREFQTV9QR0EoIkJTVDEiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCisJLyogU1RPIEFEQyAqLworCVNORF9TT0NfREFQTV9QR0EoIlNUTzEgQURDIEwxIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJTVE8xIEFEQyBMMiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisKKwkvKiBBbmFsb2cgREFDIHNvdXJjZSAqLworCVNORF9TT0NfREFQTV9NVVgoIkRBQyBMIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJnJ0NTY2M19hbGdfZGFjbF9tdXgpLAorCVNORF9TT0NfREFQTV9NVVgoIkRBQyBSIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJnJ0NTY2M19hbGdfZGFjcl9tdXgpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgcnQ1NjYzX2RhcG1fcm91dGVzW10gPSB7CisJLyogUExMICovCisJeyAiSTJTIiwgTlVMTCwgIlBMTCIsIHJ0NTY2M19pc19zeXNfY2xrX2Zyb21fcGxsIH0sCisKKwkvKiBBU1JDICovCisJeyAiU1RPMSBBREMgRmlsdGVyIiwgTlVMTCwgIkFEQyBBU1JDIiwgcnQ1NjYzX2lzX3VzaW5nX2FzcmMgfSwKKwl7ICJTVE8xIERBQyBGaWx0ZXIiLCBOVUxMLCAiREFDIEFTUkMiLCBydDU2NjNfaXNfdXNpbmdfYXNyYyB9LAorCXsgIkkyUyIsIE5VTEwsICJJMlMgQVNSQyIsIHJ0NTY2M19pMnNfdXNlX2FzcmMgfSwKKworCXsgIkFEQyBMIiwgTlVMTCwgIkFEQyBMIFBvd2VyIiB9LAorCXsgIkFEQyBMIiwgTlVMTCwgIkFEQyBDbG9jayIgfSwKKworCXsgIlNUTzEgQURDIEwyIiwgTlVMTCwgIlNUTzEgREFDIE1JWEwiIH0sCisKKwl7ICJTVE8xIEFEQyBNSVhMIiwgIkFEQzEgU3dpdGNoIiwgIlNUTzEgQURDIEwxIiB9LAorCXsgIlNUTzEgQURDIE1JWEwiLCAiQURDMiBTd2l0Y2giLCAiU1RPMSBBREMgTDIiIH0sCisJeyAiU1RPMSBBREMgTUlYTCIsIE5VTEwsICJTVE8xIEFEQyBGaWx0ZXIiIH0sCisKKwl7ICJJRjEgQURDMSIsIE5VTEwsICJTVE8xIEFEQyBNSVhMIiB9LAorCXsgIklGIEFEQyIsIE5VTEwsICJJRjEgQURDMSIgfSwKKwl7ICJBSUZUWCIsIE5VTEwsICJJRiBBREMiIH0sCisJeyAiQUlGVFgiLCBOVUxMLCAiSTJTIiB9LAorCisJeyAiQUlGUlgiLCBOVUxMLCAiSTJTIiB9LAorCXsgIklGIERBQyIsIE5VTEwsICJBSUZSWCIgfSwKKwl7ICJJRjEgREFDMSBMIiwgTlVMTCwgIklGIERBQyIgfSwKKwl7ICJJRjEgREFDMSBSIiwgTlVMTCwgIklGIERBQyIgfSwKKworCXsgIkFEREEgTUlYTCIsICJBREMgTCBTd2l0Y2giLCAiU1RPMSBBREMgTUlYTCIgfSwKKwl7ICJBRERBIE1JWEwiLCAiREFDIEwgU3dpdGNoIiwgIklGMSBEQUMxIEwiIH0sCisJeyAiQUREQSBNSVhMIiwgTlVMTCwgIlNUTzEgREFDIEZpbHRlciIgfSwKKwl7ICJBRERBIE1JWEwiLCBOVUxMLCAiU1RPMSBEQUMgTCBQb3dlciIgfSwKKwl7ICJBRERBIE1JWFIiLCAiREFDIFIgU3dpdGNoIiwgIklGMSBEQUMxIFIiIH0sCisJeyAiQUREQSBNSVhSIiwgTlVMTCwgIlNUTzEgREFDIEZpbHRlciIgfSwKKwl7ICJBRERBIE1JWFIiLCBOVUxMLCAiU1RPMSBEQUMgUiBQb3dlciIgfSwKKworCXsgIkRBQyBMMSIsIE5VTEwsICJBRERBIE1JWEwiIH0sCisJeyAiREFDIFIxIiwgTlVMTCwgIkFEREEgTUlYUiIgfSwKKworCXsgIlNUTzEgREFDIE1JWEwiLCAiREFDIEwgU3dpdGNoIiwgIkRBQyBMMSIgfSwKKwl7ICJTVE8xIERBQyBNSVhMIiwgIkRBQyBSIFN3aXRjaCIsICJEQUMgUjEiIH0sCisJeyAiU1RPMSBEQUMgTUlYTCIsIE5VTEwsICJTVE8xIERBQyBMIFBvd2VyIiB9LAorCXsgIlNUTzEgREFDIE1JWEwiLCBOVUxMLCAiU1RPMSBEQUMgRmlsdGVyIiB9LAorCXsgIlNUTzEgREFDIE1JWFIiLCAiREFDIFIgU3dpdGNoIiwgIkRBQyBSMSIgfSwKKwl7ICJTVE8xIERBQyBNSVhSIiwgIkRBQyBMIFN3aXRjaCIsICJEQUMgTDEiIH0sCisJeyAiU1RPMSBEQUMgTUlYUiIsIE5VTEwsICJTVE8xIERBQyBSIFBvd2VyIiB9LAorCXsgIlNUTzEgREFDIE1JWFIiLCBOVUxMLCAiU1RPMSBEQUMgRmlsdGVyIiB9LAorCisJeyAiSFAgQW1wIiwgTlVMTCwgIkRBQyBMIiB9LAorCXsgIkhQIEFtcCIsIE5VTEwsICJEQUMgUiIgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIHJ0NTY2OF9zcGVjaWZpY19kYXBtX3JvdXRlc1tdID0geworCXsgIk1JQ0JJQVMxIiwgTlVMTCwgIkxETzIiIH0sCisJeyAiTUlDQklBUzIiLCBOVUxMLCAiTERPMiIgfSwKKworCXsgIkJTVDEgQ0JKIiwgTlVMTCwgIklOMVAiIH0sCisJeyAiQlNUMSBDQkoiLCBOVUxMLCAiSU4xTiIgfSwKKwl7ICJCU1QxIENCSiIsIE5VTEwsICJDQkogUG93ZXIiIH0sCisKKwl7ICJCU1QyIiwgTlVMTCwgIklOMlAiIH0sCisJeyAiQlNUMiIsIE5VTEwsICJJTjJOIiB9LAorCXsgIkJTVDIiLCBOVUxMLCAiQlNUMiBQb3dlciIgfSwKKworCXsgIlJFQ01JWDFMIiwgIkJTVDIgU3dpdGNoIiwgIkJTVDIiIH0sCisJeyAiUkVDTUlYMUwiLCAiQlNUMSBDQkogU3dpdGNoIiwgIkJTVDEgQ0JKIiB9LAorCXsgIlJFQ01JWDFMIiwgTlVMTCwgIlJFQ01JWDFMIFBvd2VyIiB9LAorCXsgIlJFQ01JWDFSIiwgIkJTVDIgU3dpdGNoIiwgIkJTVDIiIH0sCisJeyAiUkVDTUlYMVIiLCBOVUxMLCAiUkVDTUlYMVIgUG93ZXIiIH0sCisKKwl7ICJBREMgTCIsIE5VTEwsICJSRUNNSVgxTCIgfSwKKwl7ICJBREMgUiIsIE5VTEwsICJSRUNNSVgxUiIgfSwKKwl7ICJBREMgUiIsIE5VTEwsICJBREMgUiBQb3dlciIgfSwKKwl7ICJBREMgUiIsIE5VTEwsICJBREMgQ2xvY2siIH0sCisKKwl7ICJTVE8xIEFEQyBMIE11eCIsICJBREMgTCIsICJBREMgTCIgfSwKKwl7ICJTVE8xIEFEQyBMIE11eCIsICJBREMgUiIsICJBREMgUiIgfSwKKwl7ICJTVE8xIEFEQyBMMSIsIE5VTEwsICJTVE8xIEFEQyBMIE11eCIgfSwKKworCXsgIlNUTzEgQURDIFIgTXV4IiwgIkFEQyBMIiwgIkFEQyBMIiB9LAorCXsgIlNUTzEgQURDIFIgTXV4IiwgIkFEQyBSIiwgIkFEQyBSIiB9LAorCXsgIlNUTzEgQURDIFIxIiwgTlVMTCwgIlNUTzEgQURDIFIgTXV4IiB9LAorCXsgIlNUTzEgQURDIFIyIiwgTlVMTCwgIlNUTzEgREFDIE1JWFIiIH0sCisKKwl7ICJTVE8xIEFEQyBNSVhSIiwgIkFEQzEgU3dpdGNoIiwgIlNUTzEgQURDIFIxIiB9LAorCXsgIlNUTzEgQURDIE1JWFIiLCAiQURDMiBTd2l0Y2giLCAiU1RPMSBBREMgUjIiIH0sCisJeyAiU1RPMSBBREMgTUlYUiIsIE5VTEwsICJTVE8xIEFEQyBGaWx0ZXIiIH0sCisKKwl7ICJJRjEgQURDMSIsIE5VTEwsICJTVE8xIEFEQyBNSVhSIiB9LAorCisJeyAiQUREQSBNSVhSIiwgIkFEQyBSIFN3aXRjaCIsICJTVE8xIEFEQyBNSVhSIiB9LAorCisJeyAiREFDIEwiLCBOVUxMLCAiU1RPMSBEQUMgTUlYTCIgfSwKKwl7ICJEQUMgTCIsIE5VTEwsICJMRE8gREFDIiB9LAorCXsgIkRBQyBMIiwgTlVMTCwgIkRBQyBDbG9jayIgfSwKKwl7ICJEQUMgUiIsIE5VTEwsICJTVE8xIERBQyBNSVhSIiB9LAorCXsgIkRBQyBSIiwgTlVMTCwgIkxETyBEQUMiIH0sCisJeyAiREFDIFIiLCBOVUxMLCAiREFDIENsb2NrIiB9LAorCisJeyAiSFBPIFBsYXliYWNrIiwgIlN3aXRjaCIsICJIUCBBbXAiIH0sCisJeyAiSFBPTCIsIE5VTEwsICJIUE8gUGxheWJhY2siIH0sCisJeyAiSFBPUiIsIE5VTEwsICJIUE8gUGxheWJhY2siIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBydDU2NjNfc3BlY2lmaWNfZGFwbV9yb3V0ZXNbXSA9IHsKKwl7ICJJMlMiLCBOVUxMLCAiUHJlIERpdiBQb3dlciIgfSwKKworCXsgIkJTVDEiLCBOVUxMLCAiSU4xUCIgfSwKKwl7ICJCU1QxIiwgTlVMTCwgIklOMU4iIH0sCisJeyAiQlNUMSIsIE5VTEwsICJSRUNNSVgxTCBQb3dlciIgfSwKKworCXsgIkFEQyBMIiwgTlVMTCwgIkJTVDEiIH0sCisKKwl7ICJTVE8xIEFEQyBMMSIsIE5VTEwsICJBREMgTCIgfSwKKworCXsgIkRBQyBMIE11eCIsICJEQUMgTCIsICAiREFDIEwxIiB9LAorCXsgIkRBQyBMIE11eCIsICJTVE8gREFDIE1JWEwiLCAiU1RPMSBEQUMgTUlYTCIgfSwKKwl7ICJEQUMgUiBNdXgiLCAiREFDIFIiLCAgIkRBQyBSMSJ9LAorCXsgIkRBQyBSIE11eCIsICJTVE8gREFDIE1JWFIiLCAiU1RPMSBEQUMgTUlYUiIgfSwKKworCXsgIkRBQyBMIiwgTlVMTCwgIkRBQyBMIE11eCIgfSwKKwl7ICJEQUMgUiIsIE5VTEwsICJEQUMgUiBNdXgiIH0sCisKKwl7ICJIUE9MIiwgTlVMTCwgIkhQIEFtcCIgfSwKKwl7ICJIUE9SIiwgTlVMTCwgIkhQIEFtcCIgfSwKK307CisKK3N0YXRpYyBpbnQgcnQ1NjYzX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgcnQ1NjYzX3ByaXYgKnJ0NTY2MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXVuc2lnbmVkIGludCB2YWxfbGVuID0gMDsKKwlpbnQgcHJlX2RpdjsKKworCXJ0NTY2My0+bHJjayA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisKKwlkZXZfZGJnKGRhaS0+ZGV2LCAiYmNsayBpcyAlZEh6IGFuZCBzeXNjbGsgaXMgJWRIelxuIiwKKwkJcnQ1NjYzLT5scmNrLCBydDU2NjMtPnN5c2Nsayk7CisKKwlwcmVfZGl2ID0gcmw2MjMxX2dldF9jbGtfaW5mbyhydDU2NjMtPnN5c2NsaywgcnQ1NjYzLT5scmNrKTsKKwlpZiAocHJlX2RpdiA8IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiVW5zdXBwb3J0ZWQgY2xvY2sgc2V0dGluZyAlZCBmb3IgREFJICVkXG4iLAorCQkJcnQ1NjYzLT5scmNrLCBkYWktPmlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X2RiZyhkYWktPmRldiwgInByZV9kaXYgaXMgJWQgZm9yIGlpcyAlZFxuIiwgcHJlX2RpdiwgZGFpLT5pZCk7CisKKwlzd2l0Y2ggKHBhcmFtc193aWR0aChwYXJhbXMpKSB7CisJY2FzZSA4OgorCQl2YWxfbGVuID0gUlQ1NjY4X0kyU19ETF84OworCQlicmVhazsKKwljYXNlIDE2OgorCQl2YWxfbGVuID0gUlQ1NjY4X0kyU19ETF8xNjsKKwkJYnJlYWs7CisJY2FzZSAyMDoKKwkJdmFsX2xlbiA9IFJUNTY2OF9JMlNfRExfMjA7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJCXZhbF9sZW4gPSBSVDU2NjhfSTJTX0RMXzI0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfSTJTMV9TRFAsCisJCVJUNTY2OF9JMlNfRExfTUFTSywgdmFsX2xlbik7CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfQUREQV9DTEtfMSwKKwkJUlQ1NjY4X0kyU19QRDFfTUFTSywgcHJlX2RpdiA8PCBSVDU2NjhfSTJTX1BEMV9TSElGVCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDU2NjNfc2V0X2RhaV9mbXQoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIHVuc2lnbmVkIGludCBmbXQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwl1bnNpZ25lZCBpbnQgcmVnX3ZhbCA9IDA7CisKKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX01BU1RFUl9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRlM6CisJCXJlZ192YWwgfD0gUlQ1NjY4X0kyU19NU19TOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0lOVl9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9ORjoKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JQl9ORjoKKwkJcmVnX3ZhbCB8PSBSVDU2NjhfSTJTX0JQX0lOVjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9GT1JNQVRfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfSTJTOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKKwkJcmVnX3ZhbCB8PSBSVDU2NjhfSTJTX0RGX0xFRlQ7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0E6CisJCXJlZ192YWwgfD0gUlQ1NjY4X0kyU19ERl9QQ01fQTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQjoKKwkJcmVnX3ZhbCB8PSBSVDU2NjhfSTJTX0RGX1BDTV9COworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfSTJTMV9TRFAsIFJUNTY2OF9JMlNfTVNfTUFTSyB8CisJCVJUNTY2OF9JMlNfQlBfTUFTSyB8IFJUNTY2OF9JMlNfREZfTUFTSywgcmVnX3ZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDU2NjNfc2V0X2RhaV9zeXNjbGsoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIGludCBjbGtfaWQsCisJdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgcnQ1NjYzX3ByaXYgKnJ0NTY2MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXVuc2lnbmVkIGludCByZWdfdmFsID0gMDsKKworCWlmIChmcmVxID09IHJ0NTY2My0+c3lzY2xrICYmIGNsa19pZCA9PSBydDU2NjMtPnN5c2Nsa19zcmMpCisJCXJldHVybiAwOworCisJc3dpdGNoIChjbGtfaWQpIHsKKwljYXNlIFJUNTY2M19TQ0xLX1NfTUNMSzoKKwkJcmVnX3ZhbCB8PSBSVDU2NjNfU0NMS19TUkNfTUNMSzsKKwkJYnJlYWs7CisJY2FzZSBSVDU2NjNfU0NMS19TX1BMTDE6CisJCXJlZ192YWwgfD0gUlQ1NjYzX1NDTEtfU1JDX1BMTDE7CisJCWJyZWFrOworCWNhc2UgUlQ1NjYzX1NDTEtfU19SQ0NMSzoKKwkJcmVnX3ZhbCB8PSBSVDU2NjNfU0NMS19TUkNfUkNDTEs7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkludmFsaWQgY2xvY2sgaWQgKCVkKVxuIiwgY2xrX2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19HTEJfQ0xLLCBSVDU2NjhfU0NMS19TUkNfTUFTSywKKwkJcmVnX3ZhbCk7CisJcnQ1NjYzLT5zeXNjbGsgPSBmcmVxOworCXJ0NTY2My0+c3lzY2xrX3NyYyA9IGNsa19pZDsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIlN5c2NsayBpcyAlZEh6IGFuZCBjbG9jayBpZCBpcyAlZFxuIiwKKwkJZnJlcSwgY2xrX2lkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0NTY2M19zZXRfZGFpX3BsbChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgaW50IHBsbF9pZCwgaW50IHNvdXJjZSwKKwkJCXVuc2lnbmVkIGludCBmcmVxX2luLCB1bnNpZ25lZCBpbnQgZnJlcV9vdXQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgcnQ1NjYzX3ByaXYgKnJ0NTY2MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBybDYyMzFfcGxsX2NvZGUgcGxsX2NvZGU7CisJaW50IHJldDsKKwlpbnQgbWFzaywgc2hpZnQsIHZhbDsKKworCWlmIChzb3VyY2UgPT0gcnQ1NjYzLT5wbGxfc3JjICYmIGZyZXFfaW4gPT0gcnQ1NjYzLT5wbGxfaW4gJiYKKwkgICAgZnJlcV9vdXQgPT0gcnQ1NjYzLT5wbGxfb3V0KQorCQlyZXR1cm4gMDsKKworCWlmICghZnJlcV9pbiB8fCAhZnJlcV9vdXQpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiUExMIGRpc2FibGVkXG4iKTsKKworCQlydDU2NjMtPnBsbF9pbiA9IDA7CisJCXJ0NTY2My0+cGxsX291dCA9IDA7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19HTEJfQ0xLLAorCQkJUlQ1NjYzX1NDTEtfU1JDX01BU0ssIFJUNTY2M19TQ0xLX1NSQ19NQ0xLKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChydDU2NjMtPmNvZGVjX3R5cGUpIHsKKwljYXNlIENPREVDX1RZUEVfUlQ1NjY4OgorCQltYXNrID0gUlQ1NjY4X1BMTDFfU1JDX01BU0s7CisJCXNoaWZ0ID0gUlQ1NjY4X1BMTDFfU1JDX1NISUZUOworCQlicmVhazsKKwljYXNlIENPREVDX1RZUEVfUlQ1NjYzOgorCQltYXNrID0gUlQ1NjYzX1BMTDFfU1JDX01BU0s7CisJCXNoaWZ0ID0gUlQ1NjYzX1BMTDFfU1JDX1NISUZUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbmtub3duIENPREVDX1RZUEVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKHNvdXJjZSkgeworCWNhc2UgUlQ1NjYzX1BMTDFfU19NQ0xLOgorCQl2YWwgPSAweDA7CisJCWJyZWFrOworCWNhc2UgUlQ1NjYzX1BMTDFfU19CQ0xLMToKKwkJdmFsID0gMHgxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbmtub3duIFBMTCBzb3VyY2UgJWRcbiIsIHNvdXJjZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfR0xCX0NMSywgbWFzaywgKHZhbCA8PCBzaGlmdCkpOworCisJcmV0ID0gcmw2MjMxX3BsbF9jYWxjKGZyZXFfaW4sIGZyZXFfb3V0LCAmcGxsX2NvZGUpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIlVuc3VwcG9ydCBpbnB1dCBjbG9jayAlZFxuIiwgZnJlcV9pbik7CisJCXJldHVybiByZXQ7CisJfQorCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiYnlwYXNzPSVkIG09JWQgbj0lZCBrPSVkXG4iLCBwbGxfY29kZS5tX2JwLAorCQkocGxsX2NvZGUubV9icCA/IDAgOiBwbGxfY29kZS5tX2NvZGUpLCBwbGxfY29kZS5uX2NvZGUsCisJCXBsbF9jb2RlLmtfY29kZSk7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2NjNfUExMXzEsCisJCXBsbF9jb2RlLm5fY29kZSA8PCBSVDU2NjhfUExMX05fU0hJRlQgfCBwbGxfY29kZS5rX2NvZGUpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTY2M19QTExfMiwKKwkJKHBsbF9jb2RlLm1fYnAgPyAwIDogcGxsX2NvZGUubV9jb2RlKSA8PCBSVDU2NjhfUExMX01fU0hJRlQgfAorCQlwbGxfY29kZS5tX2JwIDw8IFJUNTY2OF9QTExfTV9CUF9TSElGVCk7CisKKwlydDU2NjMtPnBsbF9pbiA9IGZyZXFfaW47CisJcnQ1NjYzLT5wbGxfb3V0ID0gZnJlcV9vdXQ7CisJcnQ1NjYzLT5wbGxfc3JjID0gc291cmNlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjYzX3NldF90ZG1fc2xvdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgdW5zaWduZWQgaW50IHR4X21hc2ssCisJdW5zaWduZWQgaW50IHJ4X21hc2ssIGludCBzbG90cywgaW50IHNsb3Rfd2lkdGgpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgcnQ1NjYzX3ByaXYgKnJ0NTY2MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXVuc2lnbmVkIGludCB2YWwgPSAwLCByZWc7CisKKwlpZiAocnhfbWFzayB8fCB0eF9tYXNrKQorCQl2YWwgfD0gUlQ1NjY4X1RETV9NT0RFX1RETTsKKworCXN3aXRjaCAoc2xvdHMpIHsKKwljYXNlIDQ6CisJCXZhbCB8PSBSVDU2NjhfVERNX0lOX0NIXzQ7CisJCXZhbCB8PSBSVDU2NjhfVERNX09VVF9DSF80OworCQlicmVhazsKKwljYXNlIDY6CisJCXZhbCB8PSBSVDU2NjhfVERNX0lOX0NIXzY7CisJCXZhbCB8PSBSVDU2NjhfVERNX09VVF9DSF82OworCQlicmVhazsKKwljYXNlIDg6CisJCXZhbCB8PSBSVDU2NjhfVERNX0lOX0NIXzg7CisJCXZhbCB8PSBSVDU2NjhfVERNX09VVF9DSF84OworCQlicmVhazsKKwljYXNlIDI6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoc2xvdF93aWR0aCkgeworCWNhc2UgMjA6CisJCXZhbCB8PSBSVDU2NjhfVERNX0lOX0xFTl8yMDsKKwkJdmFsIHw9IFJUNTY2OF9URE1fT1VUX0xFTl8yMDsKKwkJYnJlYWs7CisJY2FzZSAyNDoKKwkJdmFsIHw9IFJUNTY2OF9URE1fSU5fTEVOXzI0OworCQl2YWwgfD0gUlQ1NjY4X1RETV9PVVRfTEVOXzI0OworCQlicmVhazsKKwljYXNlIDMyOgorCQl2YWwgfD0gUlQ1NjY4X1RETV9JTl9MRU5fMzI7CisJCXZhbCB8PSBSVDU2NjhfVERNX09VVF9MRU5fMzI7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAocnQ1NjYzLT5jb2RlY190eXBlKSB7CisJY2FzZSBDT0RFQ19UWVBFX1JUNTY2ODoKKwkJcmVnID0gUlQ1NjYzX1RETV8yOworCQlicmVhazsKKwljYXNlIENPREVDX1RZUEVfUlQ1NjYzOgorCQlyZWcgPSBSVDU2NjNfVERNXzE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIlVua25vd24gQ09ERUNfVFlQRVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHJlZywgUlQ1NjY4X1RETV9NT0RFX01BU0sgfAorCQlSVDU2NjhfVERNX0lOX0NIX01BU0sgfCBSVDU2NjhfVERNX09VVF9DSF9NQVNLIHwKKwkJUlQ1NjY4X1RETV9JTl9MRU5fTUFTSyB8IFJUNTY2OF9URE1fT1VUX0xFTl9NQVNLLCB2YWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjYzX3NldF9iY2xrX3JhdGlvKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCB1bnNpZ25lZCBpbnQgcmF0aW8pCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgcnQ1NjYzX3ByaXYgKnJ0NTY2MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXVuc2lnbmVkIGludCByZWc7CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyByYXRpbyA9ICVkXG4iLCBfX2Z1bmNfXywgcmF0aW8pOworCisJaWYgKHJ0NTY2My0+Y29kZWNfdHlwZSA9PSBDT0RFQ19UWVBFX1JUNTY2OCkKKwkJcmVnID0gUlQ1NjY4X1RETV84OworCWVsc2UKKwkJcmVnID0gUlQ1NjYzX1RETV81OworCisJc3dpdGNoIChyYXRpbykgeworCWNhc2UgMzI6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHJlZywKKwkJCVJUNTY2M19URE1fTEVOR1ROX01BU0ssCisJCQlSVDU2NjNfVERNX0xFTkdUTl8xNik7CisJCWJyZWFrOworCWNhc2UgNDA6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHJlZywKKwkJCVJUNTY2M19URE1fTEVOR1ROX01BU0ssCisJCQlSVDU2NjNfVERNX0xFTkdUTl8yMCk7CisJCWJyZWFrOworCWNhc2UgNDg6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHJlZywKKwkJCVJUNTY2M19URE1fTEVOR1ROX01BU0ssCisJCQlSVDU2NjNfVERNX0xFTkdUTl8yNCk7CisJCWJyZWFrOworCWNhc2UgNjQ6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIHJlZywKKwkJCVJUNTY2M19URE1fTEVOR1ROX01BU0ssCisJCQlSVDU2NjNfVERNX0xFTkdUTl8zMik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkludmFsaWQgcmF0aW8hXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjYzX3NldF9iaWFzX2xldmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJCWVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQoreworCXN0cnVjdCBydDU2NjNfcHJpdiAqcnQ1NjYzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlzd2l0Y2ggKGxldmVsKSB7CisJY2FzZSBTTkRfU09DX0JJQVNfT046CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19QV1JfQU5MR18xLAorCQkJUlQ1NjY4X1BXUl9GVjFfTUFTSyB8IFJUNTY2OF9QV1JfRlYyX01BU0ssCisJCQlSVDU2NjhfUFdSX0ZWMSB8IFJUNTY2OF9QV1JfRlYyKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgorCQlpZiAocnQ1NjYzLT5jb2RlY190eXBlID09IENPREVDX1RZUEVfUlQ1NjY4KSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfRElHX01JU0MsCisJCQkJUlQ1NjY4X0RJR19HQVRFX0NUUkxfTUFTSywKKwkJCQlSVDU2NjhfRElHX0dBVEVfQ1RSTF9FTik7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfU0lHX0NMS19ERVQsCisJCQkJUlQ1NjY4X0VOX0FOQV9DTEtfREVUX01BU0sgfAorCQkJCVJUNTY2OF9QV1JfQ0xLX0RFVF9NQVNLLAorCQkJCVJUNTY2OF9FTl9BTkFfQ0xLX0RFVF9BVVRPIHwKKwkJCQlSVDU2NjhfUFdSX0NMS19ERVRfRU4pOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKKwkJaWYgKHJ0NTY2My0+Y29kZWNfdHlwZSA9PSBDT0RFQ19UWVBFX1JUNTY2OCkKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19ESUdfTUlTQywKKwkJCQlSVDU2NjhfRElHX0dBVEVfQ1RSTF9NQVNLLAorCQkJCVJUNTY2OF9ESUdfR0FURV9DVFJMX0RJUyk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19QV1JfQU5MR18xLAorCQkJUlQ1NjY4X1BXUl9WUkVGMV9NQVNLIHwgUlQ1NjY4X1BXUl9WUkVGMl9NQVNLIHwKKwkJCVJUNTY2OF9QV1JfRlYxX01BU0sgfCBSVDU2NjhfUFdSX0ZWMl9NQVNLIHwKKwkJCVJUNTY2OF9QV1JfTUJfTUFTSywgUlQ1NjY4X1BXUl9WUkVGMSB8CisJCQlSVDU2NjhfUFdSX1ZSRUYyIHwgUlQ1NjY4X1BXUl9NQik7CisJCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTAwMDUpOworCQlpZiAocnQ1NjYzLT5jb2RlY190eXBlID09IENPREVDX1RZUEVfUlQ1NjY4KSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfU0lHX0NMS19ERVQsCisJCQkJUlQ1NjY4X0VOX0FOQV9DTEtfREVUX01BU0sgfAorCQkJCVJUNTY2OF9QV1JfQ0xLX0RFVF9NQVNLLAorCQkJCVJUNTY2OF9FTl9BTkFfQ0xLX0RFVF9ESVMgfAorCQkJCVJUNTY2OF9QV1JfQ0xLX0RFVF9ESVMpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfUFdSX0FOTEdfMSwKKwkJCVJUNTY2OF9QV1JfVlJFRjFfTUFTSyB8IFJUNTY2OF9QV1JfVlJFRjJfTUFTSyB8CisJCQlSVDU2NjhfUFdSX0ZWMSB8IFJUNTY2OF9QV1JfRlYyLCAweDApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0NTY2M19wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYyk7CisJc3RydWN0IHJ0NTY2M19wcml2ICpydDU2NjMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXJ0NTY2My0+Y29kZWMgPSBjb2RlYzsKKworCXN3aXRjaCAocnQ1NjYzLT5jb2RlY190eXBlKSB7CisJY2FzZSBDT0RFQ19UWVBFX1JUNTY2ODoKKwkJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLAorCQkJcnQ1NjY4X3NwZWNpZmljX2RhcG1fd2lkZ2V0cywKKwkJCUFSUkFZX1NJWkUocnQ1NjY4X3NwZWNpZmljX2RhcG1fd2lkZ2V0cykpOworCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLAorCQkJcnQ1NjY4X3NwZWNpZmljX2RhcG1fcm91dGVzLAorCQkJQVJSQVlfU0laRShydDU2Njhfc3BlY2lmaWNfZGFwbV9yb3V0ZXMpKTsKKwkJc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIHJ0NTY2OF9zcGVjaWZpY19jb250cm9scywKKwkJCUFSUkFZX1NJWkUocnQ1NjY4X3NwZWNpZmljX2NvbnRyb2xzKSk7CisJCWJyZWFrOworCWNhc2UgQ09ERUNfVFlQRV9SVDU2NjM6CisJCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoZGFwbSwKKwkJCXJ0NTY2M19zcGVjaWZpY19kYXBtX3dpZGdldHMsCisJCQlBUlJBWV9TSVpFKHJ0NTY2M19zcGVjaWZpY19kYXBtX3dpZGdldHMpKTsKKwkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwKKwkJCXJ0NTY2M19zcGVjaWZpY19kYXBtX3JvdXRlcywKKwkJCUFSUkFZX1NJWkUocnQ1NjYzX3NwZWNpZmljX2RhcG1fcm91dGVzKSk7CisJCXNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCBydDU2NjNfc3BlY2lmaWNfY29udHJvbHMsCisJCQlBUlJBWV9TSVpFKHJ0NTY2M19zcGVjaWZpY19jb250cm9scykpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDU2NjNfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgcnQ1NjYzX3ByaXYgKnJ0NTY2MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJcmVnbWFwX3dyaXRlKHJ0NTY2My0+cmVnbWFwLCBSVDU2NjNfUkVTRVQsIDApOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgcnQ1NjYzX3N1c3BlbmQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBydDU2NjNfcHJpdiAqcnQ1NjYzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlyZWdjYWNoZV9jYWNoZV9vbmx5KHJ0NTY2My0+cmVnbWFwLCB0cnVlKTsKKwlyZWdjYWNoZV9tYXJrX2RpcnR5KHJ0NTY2My0+cmVnbWFwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0NTY2M19yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBydDU2NjNfcHJpdiAqcnQ1NjYzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlyZWdjYWNoZV9jYWNoZV9vbmx5KHJ0NTY2My0+cmVnbWFwLCBmYWxzZSk7CisJcmVnY2FjaGVfc3luYyhydDU2NjMtPnJlZ21hcCk7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIHJ0NTY2M19zdXNwZW5kIE5VTEwKKyNkZWZpbmUgcnQ1NjYzX3Jlc3VtZSBOVUxMCisjZW5kaWYKKworI2RlZmluZSBSVDU2NjNfU1RFUkVPX1JBVEVTIFNORFJWX1BDTV9SQVRFXzgwMDBfMTkyMDAwCisjZGVmaW5lIFJUNTY2M19GT1JNQVRTIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSB8IFwKKwkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TOCkKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgcnQ1NjYzX2FpZl9kYWlfb3BzID0geworCS5od19wYXJhbXMgPSBydDU2NjNfaHdfcGFyYW1zLAorCS5zZXRfZm10ID0gcnQ1NjYzX3NldF9kYWlfZm10LAorCS5zZXRfc3lzY2xrID0gcnQ1NjYzX3NldF9kYWlfc3lzY2xrLAorCS5zZXRfcGxsID0gcnQ1NjYzX3NldF9kYWlfcGxsLAorCS5zZXRfdGRtX3Nsb3QgPSBydDU2NjNfc2V0X3RkbV9zbG90LAorCS5zZXRfYmNsa19yYXRpbyA9IHJ0NTY2M19zZXRfYmNsa19yYXRpbywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIHJ0NTY2M19kYWlbXSA9IHsKKwl7CisJCS5uYW1lID0gInJ0NTY2My1haWYiLAorCQkuaWQgPSBSVDU2NjNfQUlGLAorCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQUlGIFBsYXliYWNrIiwKKwkJCS5jaGFubmVsc19taW4gPSAxLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZXMgPSBSVDU2NjNfU1RFUkVPX1JBVEVTLAorCQkJLmZvcm1hdHMgPSBSVDU2NjNfRk9STUFUUywKKwkJfSwKKwkJLmNhcHR1cmUgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQUlGIENhcHR1cmUiLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IFJUNTY2M19TVEVSRU9fUkFURVMsCisJCQkuZm9ybWF0cyA9IFJUNTY2M19GT1JNQVRTLAorCQl9LAorCQkub3BzID0gJnJ0NTY2M19haWZfZGFpX29wcywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3J0NTY2MyA9IHsKKwkucHJvYmUgPSBydDU2NjNfcHJvYmUsCisJLnJlbW92ZSA9IHJ0NTY2M19yZW1vdmUsCisJLnN1c3BlbmQgPSBydDU2NjNfc3VzcGVuZCwKKwkucmVzdW1lID0gcnQ1NjYzX3Jlc3VtZSwKKwkuc2V0X2JpYXNfbGV2ZWwgPSBydDU2NjNfc2V0X2JpYXNfbGV2ZWwsCisJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMgPSBydDU2NjNfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShydDU2NjNfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cyA9IHJ0NTY2M19kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShydDU2NjNfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzID0gcnQ1NjYzX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShydDU2NjNfZGFwbV9yb3V0ZXMpLAorCX0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBydDU2NjhfcmVnbWFwID0geworCS5yZWdfYml0cyA9IDE2LAorCS52YWxfYml0cyA9IDE2LAorCS51c2Vfc2luZ2xlX3J3ID0gdHJ1ZSwKKwkubWF4X3JlZ2lzdGVyID0gMHgwN2ZhLAorCS52b2xhdGlsZV9yZWcgPSBydDU2Njhfdm9sYXRpbGVfcmVnaXN0ZXIsCisJLnJlYWRhYmxlX3JlZyA9IHJ0NTY2OF9yZWFkYWJsZV9yZWdpc3RlciwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKKwkucmVnX2RlZmF1bHRzID0gcnQ1NjY4X3JlZywKKwkubnVtX3JlZ19kZWZhdWx0cyA9IEFSUkFZX1NJWkUocnQ1NjY4X3JlZyksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgcnQ1NjYzX3JlZ21hcCA9IHsKKwkucmVnX2JpdHMgPSAxNiwKKwkudmFsX2JpdHMgPSAxNiwKKwkudXNlX3NpbmdsZV9ydyA9IHRydWUsCisJLm1heF9yZWdpc3RlciA9IDB4MDNmMywKKwkudm9sYXRpbGVfcmVnID0gcnQ1NjYzX3ZvbGF0aWxlX3JlZ2lzdGVyLAorCS5yZWFkYWJsZV9yZWcgPSBydDU2NjNfcmVhZGFibGVfcmVnaXN0ZXIsCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCisJLnJlZ19kZWZhdWx0cyA9IHJ0NTY2M19yZWcsCisJLm51bV9yZWdfZGVmYXVsdHMgPSBBUlJBWV9TSVpFKHJ0NTY2M19yZWcpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHRlbXBfcmVnbWFwID0geworCS5uYW1lID0gIm5vY2FjaGUiLAorCS5yZWdfYml0cyA9IDE2LAorCS52YWxfYml0cyA9IDE2LAorCS51c2Vfc2luZ2xlX3J3ID0gdHJ1ZSwKKwkubWF4X3JlZ2lzdGVyID0gMHgwM2YzLAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfTk9ORSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBydDU2NjNfaTJjX2lkW10gPSB7CisJeyAicnQ1NjY4IiwgMCB9LAorCXsgInJ0NTY2MyIsIDAgfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBydDU2NjNfaTJjX2lkKTsKKworI2lmIGRlZmluZWQoQ09ORklHX09GKQorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcnQ1NjYzX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJyZWFsdGVrLHJ0NTY2OCIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJyZWFsdGVrLHJ0NTY2MyIsIH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcnQ1NjYzX29mX21hdGNoKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FDUEkKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgcnQ1NjYzX2FjcGlfbWF0Y2hbXSA9IHsKKwl7ICIxMEVDNTY2OCIsIDB9LAorCXsgIjEwRUM1NjYzIiwgMH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShhY3BpLCBydDU2NjNfYWNwaV9tYXRjaCk7CisjZW5kaWYKKworc3RhdGljIHZvaWQgcnQ1NjY4X2NhbGlicmF0ZShzdHJ1Y3QgcnQ1NjYzX3ByaXYgKnJ0NTY2OCkKK3sKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19CSUFTX0NVUl84LCAweGE0MDIpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX1BXUl9ESUdfMSwgMHgwMTAwKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19SRUNNSVgsIDB4NDA0MCk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfRElHX01JU0MsIDB4MDAwMSk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfUkNfQ0xLLCAweDAzODApOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0dMQl9DTEssIDB4ODAwMCk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfQUREQV9DTEtfMSwgMHgxMDAwKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19DSE9QX0RBQ19MLCAweDMwMzApOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0NBTElCX0FEQywgMHgzYzA1KTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19QV1JfQU5MR18xLCAweGEyM2UpOworCW1zbGVlcCg0MCk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfUFdSX0FOTEdfMSwgMHhmMjNlKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19IUF9DQUxJQl8yLCAweDAzMjEpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0hQX0NBTElCXzEsIDB4ZmMwMCk7CisJbXNsZWVwKDUwMCk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0NTY2M19jYWxpYnJhdGUoc3RydWN0IHJ0NTY2M19wcml2ICpydDU2NjgpCit7CisJaW50IHZhbHVlLCBjb3VudDsKKworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX1JDX0NMSywgMHgwMjgwKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19HTEJfQ0xLLCAweDgwMDApOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0RJR19NSVNDLCAweDgwMDEpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX1ZSRUZfUkVDTUlYLCAweDAwMzIpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX1BXUl9BTkxHXzEsIDB4YTJiZSk7CisJbXNsZWVwKDIwKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19QV1JfQU5MR18xLCAweGYyYmUpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX1BXUl9ESUdfMiwgMHg4NDAwKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19DSE9QX0FEQywgMHgzMDAwKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19ERVBPUF8xLCAweDAwM2IpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX1BXUl9ESUdfMSwgMHg4ZGY4KTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19QV1JfQU5MR18yLCAweDAwMDMpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX1BXUl9BTkxHXzMsIDB4MDE4Yyk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfQUREQV9DTEtfMSwgMHgxMTExKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19QUkVfRElWX0dBVElOR18xLCAweGZmZmYpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX1BSRV9ESVZfR0FUSU5HXzIsIDB4ZmZmZik7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfREVQT1BfMiwgMHgzMDAzKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19ERVBPUF8xLCAweDAwM2IpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0hQX0NIQVJHRV9QVU1QXzEsIDB4MWUzMik7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfSFBfQ0hBUkdFX1BVTVBfMiwgMHgxMzcxKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19EQUNSRUZfTERPLCAweDNiMGIpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX1NUT19EQUNfTUlYRVIsIDB4MjA4MCk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfQllQQVNTX1NUT19EQUMsIDB4MDAwYyk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfSFBfQklBUywgMHhhYmJhKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19DSEFSR0VfUFVNUF8xLCAweDIyMjQpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0hQX09VVF9FTiwgMHg4MDg4KTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19TVE9fRFJFXzksIDB4MDAxNyk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfU1RPX0RSRV8xMCwgMHgwMDE3KTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19TVE8xX0FEQ19NSVhFUiwgMHg0MDQwKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19SRUNNSVgsIDB4MDAwNSk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfQUREQV9SU1QsIDB4YzAwMCk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfU1RPMV9IUEZfQURKMSwgMHgzMzIwKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19IUF9DQUxJQl8yLCAweDAwYzkpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0RVTU1ZXzEsIDB4MDA0Yyk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfQU5BX0JJQVNfQ1VSXzEsIDB4Nzc2Nik7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfQklBU19DVVJfOCwgMHg0NzAyKTsKKwltc2xlZXAoMjAwKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19IUF9DQUxJQl8xLCAweDAwNjkpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0hQX0NBTElCXzMsIDB4MDZjMik7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfSFBfQ0FMSUJfMV8xLCAweDdiMDApOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0hQX0NBTElCXzFfMSwgMHhmYjAwKTsKKwljb3VudCA9IDA7CisJd2hpbGUgKHRydWUpIHsKKwkJcmVnbWFwX3JlYWQocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19IUF9DQUxJQl8xXzEsICZ2YWx1ZSk7CisJCWlmICh2YWx1ZSAmIDB4ODAwMCkKKwkJCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTAwMDUpOworCQllbHNlCisJCQlicmVhazsKKworCQlpZiAoY291bnQgPiAyMDApCisJCQlyZXR1cm47CisJCWNvdW50Kys7CisJfQorfQorCitzdGF0aWMgaW50IHJ0NTY2M19pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywKKwkJICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgcnQ1NjYzX3ByaXYgKnJ0NTY2MzsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCB2YWw7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCisJcnQ1NjYzID0gZGV2bV9remFsbG9jKCZpMmMtPmRldiwgc2l6ZW9mKHN0cnVjdCBydDU2NjNfcHJpdiksCisJCUdGUF9LRVJORUwpOworCisJaWYgKHJ0NTY2MyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWkyY19zZXRfY2xpZW50ZGF0YShpMmMsIHJ0NTY2Myk7CisKKwlyZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhpMmMsICZ0ZW1wX3JlZ21hcCk7CisJaWYgKElTX0VSUihyZWdtYXApKSB7CisJCXJldCA9IFBUUl9FUlIocmVnbWFwKTsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgdGVtcCByZWdpc3RlciBtYXA6ICVkXG4iLAorCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmVnbWFwX3JlYWQocmVnbWFwLCBSVDU2NjNfVkVORE9SX0lEXzIsICZ2YWwpOworCXN3aXRjaCAodmFsKSB7CisJY2FzZSBSVDU2NjhfREVWSUNFX0lEOgorCQlydDU2NjMtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGkyYywgJnJ0NTY2OF9yZWdtYXApOworCQlydDU2NjMtPmNvZGVjX3R5cGUgPSBDT0RFQ19UWVBFX1JUNTY2ODsKKwkJYnJlYWs7CisJY2FzZSBSVDU2NjNfREVWSUNFX0lEOgorCQlydDU2NjMtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGkyYywgJnJ0NTY2M19yZWdtYXApOworCQlydDU2NjMtPmNvZGVjX3R5cGUgPSBDT0RFQ19UWVBFX1JUNTY2MzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmaTJjLT5kZXYsCisJCQkiRGV2aWNlIHdpdGggSUQgcmVnaXN0ZXIgJSN4IGlzIG5vdCBydDU2NjMgb3IgcnQ1NjY4XG4iLAorCQkJdmFsKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKElTX0VSUihydDU2NjMtPnJlZ21hcCkpIHsKKwkJcmV0ID0gUFRSX0VSUihydDU2NjMtPnJlZ21hcCk7CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlZ2lzdGVyIG1hcDogJWRcbiIsCisJCQlyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIHJlc2V0IGFuZCBjYWxpYnJhdGUgKi8KKwlyZWdtYXBfd3JpdGUocnQ1NjYzLT5yZWdtYXAsIFJUNTY2M19SRVNFVCwgMCk7CisJcmVnY2FjaGVfY2FjaGVfYnlwYXNzKHJ0NTY2My0+cmVnbWFwLCB0cnVlKTsKKwlzd2l0Y2ggKHJ0NTY2My0+Y29kZWNfdHlwZSkgeworCWNhc2UgQ09ERUNfVFlQRV9SVDU2Njg6CisJCXJ0NTY2OF9jYWxpYnJhdGUocnQ1NjYzKTsKKwkJYnJlYWs7CisJY2FzZSBDT0RFQ19UWVBFX1JUNTY2MzoKKwkJcnQ1NjYzX2NhbGlicmF0ZShydDU2NjMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZpMmMtPmRldiwgIiVzOlVua25vd24gY29kZWMgdHlwZVxuIiwgX19mdW5jX18pOworCX0KKwlyZWdjYWNoZV9jYWNoZV9ieXBhc3MocnQ1NjYzLT5yZWdtYXAsIGZhbHNlKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjYzLT5yZWdtYXAsIFJUNTY2M19SRVNFVCwgMCk7CisJZGV2X2RiZygmaTJjLT5kZXYsICJjYWxpYnJhdGUgZG9uZVxuIik7CisKKwkvKiBHUElPMSBhcyBJUlEgKi8KKwlyZWdtYXBfdXBkYXRlX2JpdHMocnQ1NjYzLT5yZWdtYXAsIFJUNTY2M19HUElPXzEsIFJUNTY2OF9HUDFfUElOX01BU0ssCisJCVJUNTY2OF9HUDFfUElOX0lSUSk7CisJLyogNGJ0biBpbmxpbmUgY29tbWFuZCBkZWJvdW5jZSAqLworCXJlZ21hcF91cGRhdGVfYml0cyhydDU2NjMtPnJlZ21hcCwgUlQ1NjYzX0lMX0NNRF81LAorCQlSVDU2NjhfNEJUTl9DTEtfREVCX01BU0ssIFJUNTY2OF80QlROX0NMS19ERUJfNjVNUyk7CisKKwlzd2l0Y2ggKHJ0NTY2My0+Y29kZWNfdHlwZSkgeworCWNhc2UgQ09ERUNfVFlQRV9SVDU2Njg6CisJCXJlZ21hcF93cml0ZShydDU2NjMtPnJlZ21hcCwgUlQ1NjYzX0JJQVNfQ1VSXzgsIDB4YTQwMik7CisJCS8qIEpEMSAqLworCQlyZWdtYXBfdXBkYXRlX2JpdHMocnQ1NjYzLT5yZWdtYXAsIFJUNTY2M19BVVRPXzFNUkNfQ0xLLAorCQkJUlQ1NjY4X0lSUV9QT1dfU0FWX01BU0sgfCBSVDU2NjhfSVJRX1BPV19TQVZfSkQxX01BU0ssCisJCQlSVDU2NjhfSVJRX1BPV19TQVZfRU4gfCBSVDU2NjhfSVJRX1BPV19TQVZfSkQxX0VOKTsKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY2My0+cmVnbWFwLCBSVDU2NjNfUFdSX0FOTEdfMiwKKwkJCVJUNTY2OF9QV1JfSkQxX01BU0ssIFJUNTY2OF9QV1JfSkQxKTsKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY2My0+cmVnbWFwLCBSVDU2NjNfSVJRXzEsCisJCQlSVDU2NjhfRU5fQ0JfSkRfTUFTSywgUlQ1NjY4X0VOX0NCX0pEX0VOKTsKKworCQlyZWdtYXBfdXBkYXRlX2JpdHMocnQ1NjYzLT5yZWdtYXAsIFJUNTY2M19IUF9MT0dJQ18yLAorCQkJUlQ1NjY4X0hQX1NJR19TUkMxX01BU0ssIFJUNTY2OF9IUF9TSUdfU1JDMV9SRUcpOworCQlyZWdtYXBfdXBkYXRlX2JpdHMocnQ1NjYzLT5yZWdtYXAsIFJUNTY2M19SRUNNSVgsCisJCQlSVDU2NjhfVlJFRl9CSUFTX01BU0sgfCBSVDU2NjhfQ0JKX0RFVF9NQVNLIHwKKwkJCVJUNTY2OF9ERVRfVFlQRV9NQVNLLCBSVDU2NjhfVlJFRl9CSUFTX1JFRyB8CisJCQlSVDU2NjhfQ0JKX0RFVF9FTiB8IFJUNTY2OF9ERVRfVFlQRV9RRk4pOworCQkvKiBTZXQgR1BJTzQgYW5kIEdQSU84IGFzIGlucHV0IGZvciBjb21ibyBqYWNrICovCisJCXJlZ21hcF91cGRhdGVfYml0cyhydDU2NjMtPnJlZ21hcCwgUlQ1NjYzX0dQSU9fMiwKKwkJCVJUNTY2OF9HUDRfUElOX0NPTkZfTUFTSywgUlQ1NjY4X0dQNF9QSU5fQ09ORl9JTlBVVCk7CisJCXJlZ21hcF91cGRhdGVfYml0cyhydDU2NjMtPnJlZ21hcCwgUlQ1NjY4X0dQSU9fMywKKwkJCVJUNTY2OF9HUDhfUElOX0NPTkZfTUFTSywgUlQ1NjY4X0dQOF9QSU5fQ09ORl9JTlBVVCk7CisJCXJlZ21hcF91cGRhdGVfYml0cyhydDU2NjMtPnJlZ21hcCwgUlQ1NjYzX1BXUl9BTkxHXzEsCisJCQlSVDU2NjhfTERPMV9EVk9fTUFTSyB8IFJUNTY2OF9BTVBfSFBfTUFTSywKKwkJCVJUNTY2OF9MRE8xX0RWT18wXzlWIHwgUlQ1NjY4X0FNUF9IUF8zWCk7CisJCQlicmVhazsKKwljYXNlIENPREVDX1RZUEVfUlQ1NjYzOgorCQlyZWdtYXBfd3JpdGUocnQ1NjYzLT5yZWdtYXAsIFJUNTY2M19WUkVGX1JFQ01JWCwgMHgwMDMyKTsKKwkJcmVnbWFwX3dyaXRlKHJ0NTY2My0+cmVnbWFwLCBSVDU2NjNfUFdSX0FOTEdfMSwgMHhhMmJlKTsKKwkJbXNsZWVwKDIwKTsKKwkJcmVnbWFwX3dyaXRlKHJ0NTY2My0+cmVnbWFwLCBSVDU2NjNfUFdSX0FOTEdfMSwgMHhmMmJlKTsKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY2My0+cmVnbWFwLCBSVDU2NjNfR1BJT18yLAorCQkJUlQ1NjYzX0dQMV9QSU5fQ09ORl9NQVNLLCBSVDU2NjNfR1AxX1BJTl9DT05GX09VVFBVVCk7CisJCS8qIERBQ1JFRiBMRE8gY29udHJvbCAqLworCQlyZWdtYXBfdXBkYXRlX2JpdHMocnQ1NjYzLT5yZWdtYXAsIFJUNTY2M19EQUNSRUZfTERPLCAweDNlMGUsCisJCQkweDNhMGEpOworCQlyZWdtYXBfdXBkYXRlX2JpdHMocnQ1NjYzLT5yZWdtYXAsIFJUNTY2M19SRUNNSVgsCisJCQlSVDU2NjNfUkVDTUlYMV9CU1QxX01BU0ssIFJUNTY2M19SRUNNSVgxX0JTVDFfT04pOworCQlyZWdtYXBfdXBkYXRlX2JpdHMocnQ1NjYzLT5yZWdtYXAsIFJUNTY2M19URE1fMiwKKwkJCVJUNTY2M19EQVRBX1NXQVBfQURDREFUMV9NQVNLLAorCQkJUlQ1NjYzX0RBVEFfU1dBUF9BRENEQVQxX0xMKTsKKwkJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiJXM6VW5rbm93biBjb2RlYyB0eXBlXG4iLCBfX2Z1bmNfXyk7CisJfQorCisJSU5JVF9ERUxBWUVEX1dPUksoJnJ0NTY2My0+amFja19kZXRlY3Rfd29yaywgcnQ1NjYzX2phY2tfZGV0ZWN0X3dvcmspOworCisJaWYgKGkyYy0+aXJxKSB7CisJCXJldCA9IHJlcXVlc3RfaXJxKGkyYy0+aXJxLCBydDU2NjNfaXJxLAorCQkJSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfVFJJR0dFUl9GQUxMSU5HCisJCQl8IElSUUZfT05FU0hPVCwgInJ0NTY2MyIsIHJ0NTY2Myk7CisJCWlmIChyZXQpCisJCQlkZXZfZXJyKCZpMmMtPmRldiwgIiVzIEZhaWxlZCB0byByZWd1ZXN0IElSUTogJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJfQorCisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsICZzb2NfY29kZWNfZGV2X3J0NTY2MywKKwkJCXJ0NTY2M19kYWksIEFSUkFZX1NJWkUocnQ1NjYzX2RhaSkpOworCisJaWYgKHJldCkgeworCQlpZiAoaTJjLT5pcnEpCisJCQlmcmVlX2lycShpMmMtPmlycSwgcnQ1NjYzKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJ0NTY2M19pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMpCit7CisJc3RydWN0IHJ0NTY2M19wcml2ICpydDU2NjMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoaTJjKTsKKworCWlmIChpMmMtPmlycSkKKwkJZnJlZV9pcnEoaTJjLT5pcnEsIHJ0NTY2Myk7CisKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBydDU2NjNfaTJjX3NodXRkb3duKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHJ0NTY2M19wcml2ICpydDU2NjMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXJlZ21hcF93cml0ZShydDU2NjMtPnJlZ21hcCwgUlQ1NjYzX1JFU0VULCAwKTsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHJ0NTY2M19pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInJ0NTY2MyIsCisJCS5hY3BpX21hdGNoX3RhYmxlID0gQUNQSV9QVFIocnQ1NjYzX2FjcGlfbWF0Y2gpLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIocnQ1NjYzX29mX21hdGNoKSwKKwl9LAorCS5wcm9iZSA9IHJ0NTY2M19pMmNfcHJvYmUsCisJLnJlbW92ZSA9IHJ0NTY2M19pMmNfcmVtb3ZlLAorCS5zaHV0ZG93biA9IHJ0NTY2M19pMmNfc2h1dGRvd24sCisJLmlkX3RhYmxlID0gcnQ1NjYzX2kyY19pZCwKK307Cittb2R1bGVfaTJjX2RyaXZlcihydDU2NjNfaTJjX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBSVDU2NjMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJKYWNrIFl1IDxqYWNrLnl1QHJlYWx0ZWsuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDU2NjMuaCBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjYzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNjOGYyOAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjYzLmgKQEAgLTAsMCArMSwxMTIxIEBACisvKgorICogcnQ1NjYzLmggIC0tICBSVDU2NjMgQUxTQSBTb0MgYXVkaW8gZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTYgUmVhbHRlayBNaWNyb2VsZWN0cm9uaWNzCisgKiBBdXRob3I6IEphY2sgWXUgPGphY2sueXVAcmVhbHRlay5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fUlQ1NjYzX0hfXworI2RlZmluZSBfX1JUNTY2M19IX18KKworLyogSW5mbyAqLworI2RlZmluZSBSVDU2NjNfUkVTRVQJCQkJMHgwMDAwCisjZGVmaW5lIFJUNTY2M19WRU5ET1JfSUQJCQkweDAwZmQKKyNkZWZpbmUgUlQ1NjYzX1ZFTkRPUl9JRF8xCQkJMHgwMGZlCisjZGVmaW5lIFJUNTY2M19WRU5ET1JfSURfMgkJCTB4MDBmZgorCisjZGVmaW5lIFJUNTY2OF9MT1VUX0NUUkwJCQkweDAwMDEKKyNkZWZpbmUgUlQ1NjY4X0hQX0FNUF8yCQkJCTB4MDAwMworI2RlZmluZSBSVDU2NjhfTU9OT19PVVQJCQkJMHgwMDA0CisjZGVmaW5lIFJUNTY2OF9NT05PX0dBSU4JCQkweDAwMDcKKworI2RlZmluZSBSVDU2NjhfQUVDX0JTVAkJCQkweDAwMGIKKyNkZWZpbmUgUlQ1NjY4X0lOMV9JTjIJCQkJMHgwMDBjCisjZGVmaW5lIFJUNTY2OF9JTjNfSU40CQkJCTB4MDAwZAorI2RlZmluZSBSVDU2NjhfSU5MMV9JTlIxCQkJMHgwMDBmCisjZGVmaW5lIFJUNTY2OF9DQkpfVFlQRV8yCQkJMHgwMDExCisjZGVmaW5lIFJUNTY2OF9DQkpfVFlQRV8zCQkJMHgwMDEyCisjZGVmaW5lIFJUNTY2OF9DQkpfVFlQRV80CQkJMHgwMDEzCisjZGVmaW5lIFJUNTY2OF9DQkpfVFlQRV81CQkJMHgwMDE0CisjZGVmaW5lIFJUNTY2OF9DQkpfVFlQRV84CQkJMHgwMDE3CisKKy8qIEkvTyAtIEFEQy9EQUMvRE1JQyAqLworI2RlZmluZSBSVDU2NjhfREFDM19ESUdfVk9MCQkJMHgwMDFhCisjZGVmaW5lIFJUNTY2OF9EQUMzX0NUUkwJCQkweDAwMWIKKyNkZWZpbmUgUlQ1NjY4X01PTk9fQURDX0RJR19WT0wJCQkweDAwMWQKKyNkZWZpbmUgUlQ1NjY4X1NUTzJfQURDX0RJR19WT0wJCQkweDAwMWUKKyNkZWZpbmUgUlQ1NjY4X01PTk9fQURDX0JTVF9HQUlOCQkweDAwMjAKKyNkZWZpbmUgUlQ1NjY4X1NUTzJfQURDX0JTVF9HQUlOCQkweDAwMjEKKyNkZWZpbmUgUlQ1NjY4X1NJREVUT05FX0NUUkwJCQkweDAwMjQKKy8qIE1peGVyIC0gRC1EICovCisjZGVmaW5lIFJUNTY2OF9NT05PMV9BRENfTUlYRVIJCQkweDAwMjcKKyNkZWZpbmUgUlQ1NjY4X1NUTzJfQURDX01JWEVSCQkJMHgwMDI4CisjZGVmaW5lIFJUNTY2OF9NT05PX0RBQ19NSVhFUgkJCTB4MDAyYgorI2RlZmluZSBSVDU2NjhfREFDMl9TUkNfQ1RSTAkJCTB4MDAyZQorI2RlZmluZSBSVDU2NjhfSUZfM180X0RBVEFfQ1RMCQkJMHgwMDJmCisjZGVmaW5lIFJUNTY2OF9JRl81X0RBVEFfQ1RMCQkJMHgwMDMwCisjZGVmaW5lIFJUNTY2OF9QRE1fT1VUX0NUTAkJCTB4MDAzMQorI2RlZmluZSBSVDU2NjhfUERNX0kyQ19EQVRBX0NUTDEJCTB4MDAzMgorI2RlZmluZSBSVDU2NjhfUERNX0kyQ19EQVRBX0NUTDIJCTB4MDAzMworI2RlZmluZSBSVDU2NjhfUERNX0kyQ19EQVRBX0NUTDMJCTB4MDAzNAorI2RlZmluZSBSVDU2NjhfUERNX0kyQ19EQVRBX0NUTDQJCTB4MDAzNQorCisvKk1peGVyIC0gQW5hbG9nKi8KKyNkZWZpbmUgUlQ1NjY4X1JFQ01JWDFfTkVXCQkJMHgwMDNhCisjZGVmaW5lIFJUNTY2OF9SRUNNSVgxTF8wCQkJMHgwMDNiCisjZGVmaW5lIFJUNTY2OF9SRUNNSVgxTAkJCQkweDAwM2MKKyNkZWZpbmUgUlQ1NjY4X1JFQ01JWDFSXzAJCQkweDAwM2QKKyNkZWZpbmUgUlQ1NjY4X1JFQ01JWDFSCQkJCTB4MDAzZQorI2RlZmluZSBSVDU2NjhfUkVDTUlYMl9ORVcJCQkweDAwM2YKKyNkZWZpbmUgUlQ1NjY4X1JFQ01JWDJfTF8yCQkJMHgwMDQxCisjZGVmaW5lIFJUNTY2OF9SRUNNSVgyX1IJCQkweDAwNDIKKyNkZWZpbmUgUlQ1NjY4X1JFQ01JWDJfUl8yCQkJMHgwMDQzCisjZGVmaW5lIFJUNTY2OF9DQUxJQl9SRUNfTFIJCQkweDAwNDQKKyNkZWZpbmUgUlQ1NjY4X0FMQ19CS19HQUlOCQkJMHgwMDQ5CisjZGVmaW5lIFJUNTY2OF9NT05PTUlYX0dBSU4JCQkweDAwNGEKKyNkZWZpbmUgUlQ1NjY4X01PTk9NSVhfSU5fR0FJTgkJCTB4MDA0YgorI2RlZmluZSBSVDU2NjhfT1VUX01JWExfR0FJTgkJCTB4MDA0ZAorI2RlZmluZSBSVDU2NjhfT1VUX0xNSVhfSU5fR0FJTgkJCTB4MDA0ZQorI2RlZmluZSBSVDU2NjhfT1VUX1JNSVhfSU5fR0FJTgkJCTB4MDA0ZgorI2RlZmluZSBSVDU2NjhfT1VUX1JNSVhfSU5fR0FJTjEJCTB4MDA1MAorI2RlZmluZSBSVDU2NjhfTE9VVF9NSVhFUl9DVFJMCQkJMHgwMDUyCisvKiBQb3dlciAqLworI2RlZmluZSBSVDU2NjhfUFdSX1ZPTAkJCQkweDAwNjcKKworI2RlZmluZSBSVDU2NjhfQURDREFDX1JTVAkJCTB4MDA2ZAorLyogRm9ybWF0IC0gQURDL0RBQyAqLworI2RlZmluZSBSVDU2NjhfSTJTMzRfU0RQCQkJMHgwMDcxCisjZGVmaW5lIFJUNTY2OF9JMlM1X1NEUAkJCQkweDAwNzIKKy8qIEZvcm1hdCAtIFRETSBDb250cm9sICovCisjZGVmaW5lIFJUNTY2OF9URE1fNQkJCQkweDAwN2MKKyNkZWZpbmUgUlQ1NjY4X1RETV82CQkJCTB4MDA3ZAorI2RlZmluZSBSVDU2NjhfVERNXzcJCQkJMHgwMDdlCisjZGVmaW5lIFJUNTY2OF9URE1fOAkJCQkweDAwN2YKKworLyogRnVuY3Rpb24gLSBBbmFsb2cgKi8KKyNkZWZpbmUgUlQ1NjY4X0FTUkNfMwkJCQkweDAwODUKKyNkZWZpbmUgUlQ1NjY4X0FTUkNfNgkJCQkweDAwODgKKyNkZWZpbmUgUlQ1NjY4X0FTUkNfNwkJCQkweDAwODkKKyNkZWZpbmUgUlQ1NjY4X1BMTF9UUktfMTMJCQkweDAwOTkKKyNkZWZpbmUgUlQ1NjY4X0kyU19NX0NMS19DVEwJCQkweDAwYTAKKyNkZWZpbmUgUlQ1NjY4X0ZESVZfSTJTMzRfTV9DTEsJCQkweDAwYTEKKyNkZWZpbmUgUlQ1NjY4X0ZESVZfSTJTMzRfTV9DTEsyCQkweDAwYTIKKyNkZWZpbmUgUlQ1NjY4X0ZESVZfSTJTNV9NX0NMSwkJCTB4MDBhMworI2RlZmluZSBSVDU2NjhfRkRJVl9JMlM1X01fQ0xLMgkJCTB4MDBhNAorCisvKiBGdW5jdGlvbiAtIERpZ2l0YWwgKi8KKyNkZWZpbmUgUlQ1NjY4X0lSUV80CQkJCTB4MDBiOQorI2RlZmluZSBSVDU2NjhfR1BJT18zCQkJCTB4MDBjMgorI2RlZmluZSBSVDU2NjhfR1BJT180CQkJCTB4MDBjMworI2RlZmluZSBSVDU2NjhfR1BJT19TVEEJCQkJMHgwMGM0CisjZGVmaW5lIFJUNTY2OF9IUF9BTVBfREVUMQkJCTB4MDBkMAorI2RlZmluZSBSVDU2NjhfSFBfQU1QX0RFVDIJCQkweDAwZDEKKyNkZWZpbmUgUlQ1NjY4X0hQX0FNUF9ERVQzCQkJMHgwMGQyCisjZGVmaW5lIFJUNTY2OF9NSURfQkRfSFBfQU1QCQkJMHgwMGQzCisjZGVmaW5lIFJUNTY2OF9MT1dfQkRfSFBfQU1QCQkJMHgwMGQ0CisjZGVmaW5lIFJUNTY2OF9TT0ZfVk9MX1pDMgkJCTB4MDBkYQorI2RlZmluZSBSVDU2NjhfQURDX1NUTzJfQURKMQkJCTB4MDBlZQorI2RlZmluZSBSVDU2NjhfQURDX1NUTzJfQURKMgkJCTB4MDBlZgorLyogR2VuZXJhbCBDb250cm9sICovCisjZGVmaW5lIFJUNTY2OF9BX0pEX0NUUkwJCQkweDAwZjAKKyNkZWZpbmUgUlQ1NjY4X0pEMV9UUkVTX0NUUkwJCQkweDAwZjEKKyNkZWZpbmUgUlQ1NjY4X0pEMl9UUkVTX0NUUkwJCQkweDAwZjIKKyNkZWZpbmUgUlQ1NjY4X0pEX0NUUkwyCQkJCTB4MDBmNworI2RlZmluZSBSVDU2NjhfRFVNX1JFR18yCQkJMHgwMGZiCisjZGVmaW5lIFJUNTY2OF9EVU1fUkVHXzMJCQkweDAwZmMKKworCisjZGVmaW5lIFJUNTY2OF9EQUNBRENfRElHX1ZPTDIJCQkweDAxMDEKKyNkZWZpbmUgUlQ1NjY4X0RJR19JTl9QSU4yCQkJMHgwMTMzCisjZGVmaW5lIFJUNTY2OF9QQURfRFJWX0NUTDEJCQkweDAxMzYKKyNkZWZpbmUgUlQ1NjY4X1NPRl9SQU1fREVQT1AJCQkweDAxMzgKKyNkZWZpbmUgUlQ1NjY4X1ZPTF9URVNUCQkJCTB4MDEzZgorI2RlZmluZSBSVDU2NjhfVEVTVF9NT0RFXzMJCQkweDAxNDcKKyNkZWZpbmUgUlQ1NjY4X1RFU1RfTU9ERV80CQkJMHgwMTQ4CisjZGVmaW5lIFJUNTY2OF9NT05PX0RZTkFfMQkJCTB4MDE3MAorI2RlZmluZSBSVDU2NjhfTU9OT19EWU5BXzIJCQkweDAxNzEKKyNkZWZpbmUgUlQ1NjY4X01PTk9fRFlOQV8zCQkJMHgwMTcyCisjZGVmaW5lIFJUNTY2OF9NT05PX0RZTkFfNAkJCTB4MDE3MworI2RlZmluZSBSVDU2NjhfTU9OT19EWU5BXzUJCQkweDAxNzQKKyNkZWZpbmUgUlQ1NjY4X01PTk9fRFlOQV82CQkJMHgwMTc1CisjZGVmaW5lIFJUNTY2OF9TVE8xX1NJTF9ERVQJCQkweDAxOTAKKyNkZWZpbmUgUlQ1NjY4X01PTk9MX1NJTF9ERVQJCQkweDAxOTEKKyNkZWZpbmUgUlQ1NjY4X01PTk9SX1NJTF9ERVQJCQkweDAxOTIKKyNkZWZpbmUgUlQ1NjY4X1NUTzJfREFDX1NJTAkJCTB4MDE5MworI2RlZmluZSBSVDU2NjhfUFdSX1NBVl9DVEwxCQkJMHgwMTk0CisjZGVmaW5lIFJUNTY2OF9QV1JfU0FWX0NUTDIJCQkweDAxOTUKKyNkZWZpbmUgUlQ1NjY4X1BXUl9TQVZfQ1RMMwkJCTB4MDE5NgorI2RlZmluZSBSVDU2NjhfUFdSX1NBVl9DVEw0CQkJMHgwMTk3CisjZGVmaW5lIFJUNTY2OF9QV1JfU0FWX0NUTDUJCQkweDAxOTgKKyNkZWZpbmUgUlQ1NjY4X1BXUl9TQVZfQ1RMNgkJCTB4MDE5OQorI2RlZmluZSBSVDU2NjhfTU9OT19BTVBfQ0FMMQkJCTB4MDFhMAorI2RlZmluZSBSVDU2NjhfTU9OT19BTVBfQ0FMMgkJCTB4MDFhMQorI2RlZmluZSBSVDU2NjhfTU9OT19BTVBfQ0FMMwkJCTB4MDFhMgorI2RlZmluZSBSVDU2NjhfTU9OT19BTVBfQ0FMNAkJCTB4MDFhMworI2RlZmluZSBSVDU2NjhfTU9OT19BTVBfQ0FMNQkJCTB4MDFhNAorI2RlZmluZSBSVDU2NjhfTU9OT19BTVBfQ0FMNgkJCTB4MDFhNQorI2RlZmluZSBSVDU2NjhfTU9OT19BTVBfQ0FMNwkJCTB4MDFhNgorI2RlZmluZSBSVDU2NjhfTU9OT19BTVBfQ0FMX1NUMQkJCTB4MDFhNworI2RlZmluZSBSVDU2NjhfTU9OT19BTVBfQ0FMX1NUMgkJCTB4MDFhOAorI2RlZmluZSBSVDU2NjhfTU9OT19BTVBfQ0FMX1NUMwkJCTB4MDFhOQorI2RlZmluZSBSVDU2NjhfTU9OT19BTVBfQ0FMX1NUNAkJCTB4MDFhYQorI2RlZmluZSBSVDU2NjhfTU9OT19BTVBfQ0FMX1NUNQkJCTB4MDFhYgorI2RlZmluZSBSVDU2NjhfSFBfSU1QX1NFTl8xMwkJCTB4MDFiOQorI2RlZmluZSBSVDU2NjhfSFBfSU1QX1NFTl8xNAkJCTB4MDFiYQorI2RlZmluZSBSVDU2NjhfSFBfSU1QX1NFTl82CQkJMHgwMWJiCisjZGVmaW5lIFJUNTY2OF9IUF9JTVBfU0VOXzcJCQkweDAxYmMKKyNkZWZpbmUgUlQ1NjY4X0hQX0lNUF9TRU5fOAkJCTB4MDFiZAorI2RlZmluZSBSVDU2NjhfSFBfSU1QX1NFTl85CQkJMHgwMWJlCisjZGVmaW5lIFJUNTY2OF9IUF9JTVBfU0VOXzEwCQkJMHgwMWJmCisjZGVmaW5lIFJUNTY2OF9IUF9MT0dJQ18zCQkJMHgwMWRjCisjZGVmaW5lIFJUNTY2OF9IUF9DQUxJQl9TVDEwCQkJMHgwMWYzCisjZGVmaW5lIFJUNTY2OF9IUF9DQUxJQl9TVDExCQkJMHgwMWY0CisjZGVmaW5lIFJUNTY2OF9QUk9fUkVHX1RCTF80CQkJMHgwMjAzCisjZGVmaW5lIFJUNTY2OF9QUk9fUkVHX1RCTF81CQkJMHgwMjA0CisjZGVmaW5lIFJUNTY2OF9QUk9fUkVHX1RCTF82CQkJMHgwMjA1CisjZGVmaW5lIFJUNTY2OF9QUk9fUkVHX1RCTF83CQkJMHgwMjA2CisjZGVmaW5lIFJUNTY2OF9QUk9fUkVHX1RCTF84CQkJMHgwMjA3CisjZGVmaW5lIFJUNTY2OF9QUk9fUkVHX1RCTF85CQkJMHgwMjA4CisjZGVmaW5lIFJUNTY2OF9TQVJfQURDX0lOTF8xCQkJMHgwMjEwCisjZGVmaW5lIFJUNTY2OF9TQVJfQURDX0lOTF8yCQkJMHgwMjExCisjZGVmaW5lIFJUNTY2OF9TQVJfQURDX0lOTF8zCQkJMHgwMjEyCisjZGVmaW5lIFJUNTY2OF9TQVJfQURDX0lOTF80CQkJMHgwMjEzCisjZGVmaW5lIFJUNTY2OF9TQVJfQURDX0lOTF81CQkJMHgwMjE0CisjZGVmaW5lIFJUNTY2OF9TQVJfQURDX0lOTF82CQkJMHgwMjE1CisjZGVmaW5lIFJUNTY2OF9TQVJfQURDX0lOTF83CQkJMHgwMjE2CisjZGVmaW5lIFJUNTY2OF9TQVJfQURDX0lOTF84CQkJMHgwMjE3CisjZGVmaW5lIFJUNTY2OF9TQVJfQURDX0lOTF85CQkJMHgwMjE4CisjZGVmaW5lIFJUNTY2OF9TQVJfQURDX0lOTF8xMAkJCTB4MDIxOQorI2RlZmluZSBSVDU2NjhfU0FSX0FEQ19JTkxfMTEJCQkweDAyMWEKKyNkZWZpbmUgUlQ1NjY4X1NBUl9BRENfSU5MXzEyCQkJMHgwMjFiCisjZGVmaW5lIFJUNTY2OF9EUkNfQ1RSTF8xCQkJMHgwMmZmCisjZGVmaW5lIFJUNTY2OF9EUkMxX0NUUkxfMgkJCTB4MDMwMQorI2RlZmluZSBSVDU2NjhfRFJDMV9DVFJMXzMJCQkweDAzMDIKKyNkZWZpbmUgUlQ1NjY4X0RSQzFfQ1RSTF80CQkJMHgwMzAzCisjZGVmaW5lIFJUNTY2OF9EUkMxX0NUUkxfNQkJCTB4MDMwNAorI2RlZmluZSBSVDU2NjhfRFJDMV9DVFJMXzYJCQkweDAzMDUKKyNkZWZpbmUgUlQ1NjY4X0RSQzFfSERfQ1RSTF8xCQkJMHgwMzA2CisjZGVmaW5lIFJUNTY2OF9EUkMxX0hEX0NUUkxfMgkJCTB4MDMwNworI2RlZmluZSBSVDU2NjhfRFJDMV9QUklfUkVHXzEJCQkweDAzMTAKKyNkZWZpbmUgUlQ1NjY4X0RSQzFfUFJJX1JFR18yCQkJMHgwMzExCisjZGVmaW5lIFJUNTY2OF9EUkMxX1BSSV9SRUdfMwkJCTB4MDMxMgorI2RlZmluZSBSVDU2NjhfRFJDMV9QUklfUkVHXzQJCQkweDAzMTMKKyNkZWZpbmUgUlQ1NjY4X0RSQzFfUFJJX1JFR181CQkJMHgwMzE0CisjZGVmaW5lIFJUNTY2OF9EUkMxX1BSSV9SRUdfNgkJCTB4MDMxNQorI2RlZmluZSBSVDU2NjhfRFJDMV9QUklfUkVHXzcJCQkweDAzMTYKKyNkZWZpbmUgUlQ1NjY4X0RSQzFfUFJJX1JFR184CQkJMHgwMzE3CisjZGVmaW5lIFJUNTY2OF9BTENfUEdBX0NUTF8xCQkJMHgwMzMwCisjZGVmaW5lIFJUNTY2OF9BTENfUEdBX0NUTF8yCQkJMHgwMzMxCisjZGVmaW5lIFJUNTY2OF9BTENfUEdBX0NUTF8zCQkJMHgwMzMyCisjZGVmaW5lIFJUNTY2OF9BTENfUEdBX0NUTF80CQkJMHgwMzMzCisjZGVmaW5lIFJUNTY2OF9BTENfUEdBX0NUTF81CQkJMHgwMzM0CisjZGVmaW5lIFJUNTY2OF9BTENfUEdBX0NUTF82CQkJMHgwMzM1CisjZGVmaW5lIFJUNTY2OF9BTENfUEdBX0NUTF83CQkJMHgwMzM2CisjZGVmaW5lIFJUNTY2OF9BTENfUEdBX0NUTF84CQkJMHgwMzM3CisjZGVmaW5lIFJUNTY2OF9BTENfUEdBX1JFR18xCQkJMHgwMzM4CisjZGVmaW5lIFJUNTY2OF9BTENfUEdBX1JFR18yCQkJMHgwMzM5CisjZGVmaW5lIFJUNTY2OF9BTENfUEdBX1JFR18zCQkJMHgwMzNhCisjZGVmaW5lIFJUNTY2OF9BRENfRVFfUkVDT1ZfMQkJCTB4MDNjMAorI2RlZmluZSBSVDU2NjhfQURDX0VRX1JFQ09WXzIJCQkweDAzYzEKKyNkZWZpbmUgUlQ1NjY4X0FEQ19FUV9SRUNPVl8zCQkJMHgwM2MyCisjZGVmaW5lIFJUNTY2OF9BRENfRVFfUkVDT1ZfNAkJCTB4MDNjMworI2RlZmluZSBSVDU2NjhfQURDX0VRX1JFQ09WXzUJCQkweDAzYzQKKyNkZWZpbmUgUlQ1NjY4X0FEQ19FUV9SRUNPVl82CQkJMHgwM2M1CisjZGVmaW5lIFJUNTY2OF9BRENfRVFfUkVDT1ZfNwkJCTB4MDNjNgorI2RlZmluZSBSVDU2NjhfQURDX0VRX1JFQ09WXzgJCQkweDAzYzcKKyNkZWZpbmUgUlQ1NjY4X0FEQ19FUV9SRUNPVl85CQkJMHgwM2M4CisjZGVmaW5lIFJUNTY2OF9BRENfRVFfUkVDT1ZfMTAJCQkweDAzYzkKKyNkZWZpbmUgUlQ1NjY4X0FEQ19FUV9SRUNPVl8xMQkJCTB4MDNjYQorI2RlZmluZSBSVDU2NjhfQURDX0VRX1JFQ09WXzEyCQkJMHgwM2NiCisjZGVmaW5lIFJUNTY2OF9BRENfRVFfUkVDT1ZfMTMJCQkweDAzY2MKKyNkZWZpbmUgUlQ1NjY4X1ZJRF9ISURERU4JCQkweDAzZmUKKyNkZWZpbmUgUlQ1NjY4X1ZJRF9DVVNUT01FUgkJCTB4MDNmZgorI2RlZmluZSBSVDU2NjhfU0NBTl9NT0RFCQkJMHgwN2YwCisjZGVmaW5lIFJUNTY2OF9JMkNfQllQQQkJCQkweDA3ZmEKKworLyogSGVhZHBob25lIEFtcCBDb250cm9sIDIgKDB4MDAwMykgKi8KKyNkZWZpbmUgUlQ1NjY4X0VOX0RBQ19IUE9fTUFTSwkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2OF9FTl9EQUNfSFBPX1NISUZUCQkJMTQKKyNkZWZpbmUgUlQ1NjY4X0VOX0RBQ19IUE9fRElTCQkJKDB4MCA8PCAxNCkKKyNkZWZpbmUgUlQ1NjY4X0VOX0RBQ19IUE9fRU4JCQkoMHgxIDw8IDE0KQorCisvKkhlYWRwaG9uZSBBbXAgTC9SIEFuYWxvZyBHYWluIGFuZCBEaWdpdGFsIE5HMiBHYWluIENvbnRyb2wgKDB4MDAwNSAweDAwMDYpKi8KKyNkZWZpbmUgUlQ1NjY4X0dBSU5fSFAJCQkJKDB4MWYgPDwgOCkKKyNkZWZpbmUgUlQ1NjY4X0dBSU5fSFBfU0hJRlQJCQk4CisKKy8qIEFFQyBCU1QgQ29udHJvbCAoMHgwMDBiKSAqLworI2RlZmluZSBSVDU2NjhfR0FJTl9DQkpfTUFTSwkJCSgweGYgPDwgOCkKKyNkZWZpbmUgUlQ1NjY4X0dBSU5fQ0JKX1NISUZUCQkJOAorCisvKiBJTjEgQ29udHJvbCAvIE1JQyBHTkQgUkVGICgweDAwMGMpICovCisjZGVmaW5lIFJUNTY2OF9JTjFfREZfTUFTSwkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9JTjFfREZfU0hJRlQJCQkxNQorCisvKiBDb21ibyBKYWNrIGFuZCBUeXBlIERldGVjdGlvbiBDb250cm9sIDEgKDB4MDAxMCkgKi8KKyNkZWZpbmUgUlQ1NjY4X0NCSl9ERVRfTUFTSwkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9DQkpfREVUX1NISUZUCQkJMTUKKyNkZWZpbmUgUlQ1NjY4X0NCSl9ERVRfRElTCQkJKDB4MCA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X0NCSl9ERVRfRU4JCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfREVUX1RZUEVfTUFTSwkJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTY2OF9ERVRfVFlQRV9TSElGVAkJCTEyCisjZGVmaW5lIFJUNTY2OF9ERVRfVFlQRV9XTENTUAkJCSgweDAgPDwgMTIpCisjZGVmaW5lIFJUNTY2OF9ERVRfVFlQRV9RRk4JCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2NjhfVlJFRl9CSUFTX01BU0sJCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTY2OF9WUkVGX0JJQVNfU0hJRlQJCQk2CisjZGVmaW5lIFJUNTY2OF9WUkVGX0JJQVNfRlNNCQkJKDB4MCA8PCA2KQorI2RlZmluZSBSVDU2NjhfVlJFRl9CSUFTX1JFRwkJCSgweDEgPDwgNikKKworLyogUkVDIExlZnQgTWl4ZXIgQ29udHJvbCAyICgweDAwM2MpICovCisjZGVmaW5lIFJUNTY2OF9SRUNNSVgxTF9CU1QxX0NCSgkJKDB4MSA8PCA3KQorI2RlZmluZSBSVDU2NjhfUkVDTUlYMUxfQlNUMV9DQkpfU0hJRlQJCTcKKyNkZWZpbmUgUlQ1NjY4X1JFQ01JWDFMX0JTVDIJCQkoMHgxIDw8IDQpCisjZGVmaW5lIFJUNTY2OF9SRUNNSVgxTF9CU1QyX1NISUZUCQk0CisKKy8qIFJFQyBSaWdodCBNaXhlciBDb250cm9sIDIgKDB4MDAzZSkgKi8KKyNkZWZpbmUgUlQ1NjY4X1JFQ01JWDFSX0JTVDIJCQkoMHgxIDw8IDQpCisjZGVmaW5lIFJUNTY2OF9SRUNNSVgxUl9CU1QyX1NISUZUCQk0CisKKy8qIERBQzEgRGlnaXRhbCBWb2x1bWUgKDB4MDAxOSkgKi8KKyNkZWZpbmUgUlQ1NjY4X0RBQ19MMV9WT0xfTUFTSwkJCSgweGZmIDw8IDgpCisjZGVmaW5lIFJUNTY2OF9EQUNfTDFfVk9MX1NISUZUCQkJOAorI2RlZmluZSBSVDU2NjhfREFDX1IxX1ZPTF9NQVNLCQkJKDB4ZmYpCisjZGVmaW5lIFJUNTY2OF9EQUNfUjFfVk9MX1NISUZUCQkJMAorCisvKiBBREMgRGlnaXRhbCBWb2x1bWUgQ29udHJvbCAoMHgwMDFjKSAqLworI2RlZmluZSBSVDU2NjhfQURDX0xfTVVURV9NQVNLCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X0FEQ19MX01VVEVfU0hJRlQJCQkxNQorI2RlZmluZSBSVDU2NjhfQURDX0xfVk9MX01BU0sJCQkoMHg3ZiA8PCA4KQorI2RlZmluZSBSVDU2NjhfQURDX0xfVk9MX1NISUZUCQkJOAorI2RlZmluZSBSVDU2NjhfQURDX1JfTVVURV9NQVNLCQkJKDB4MSA8PCA3KQorI2RlZmluZSBSVDU2NjhfQURDX1JfTVVURV9TSElGVAkJCTcKKyNkZWZpbmUgUlQ1NjY4X0FEQ19SX1ZPTF9NQVNLCQkJKDB4N2YpCisjZGVmaW5lIFJUNTY2OF9BRENfUl9WT0xfU0hJRlQJCQkwCisKKy8qIFN0ZXJlbyBBREMgTWl4ZXIgQ29udHJvbCAoMHgwMDI2KSAqLworI2RlZmluZSBSVDU2NjhfTV9TVE8xX0FEQ19MMQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9NX1NUTzFfQURDX0wxX1NISUZUCQkxNQorI2RlZmluZSBSVDU2NjhfTV9TVE8xX0FEQ19MMgkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2OF9NX1NUTzFfQURDX0wyX1NISUZUCQkxNAorI2RlZmluZSBSVDU2NjhfU1RPMV9BRENfTDFfU1JDCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjY4X1NUTzFfQURDX0wxX1NSQ19TSElGVAkJMTMKKyNkZWZpbmUgUlQ1NjY4X1NUTzFfQURDX0wyX1NSQwkJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTY2OF9TVE8xX0FEQ19MMl9TUkNfU0hJRlQJCTEyCisjZGVmaW5lIFJUNTY2OF9TVE8xX0FEQ19MX1NSQwkJCSgweDMgPDwgMTApCisjZGVmaW5lIFJUNTY2OF9TVE8xX0FEQ19MX1NSQ19TSElGVAkJMTAKKyNkZWZpbmUgUlQ1NjY4X01fU1RPMV9BRENfUjEJCQkoMHgxIDw8IDcpCisjZGVmaW5lIFJUNTY2OF9NX1NUTzFfQURDX1IxX1NISUZUCQk3CisjZGVmaW5lIFJUNTY2OF9NX1NUTzFfQURDX1IyCQkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2NjhfTV9TVE8xX0FEQ19SMl9TSElGVAkJNgorI2RlZmluZSBSVDU2NjhfU1RPMV9BRENfUjFfU1JDCQkJKDB4MSA8PCA1KQorI2RlZmluZSBSVDU2NjhfU1RPMV9BRENfUjFfU1JDX1NISUZUCQk1CisjZGVmaW5lIFJUNTY2OF9TVE8xX0FEQ19SMl9TUkMJCQkoMHgxIDw8IDQpCisjZGVmaW5lIFJUNTY2OF9TVE8xX0FEQ19SMl9TUkNfU0hJRlQJCTQKKyNkZWZpbmUgUlQ1NjY4X1NUTzFfQURDX1JfU1JDCQkJKDB4MyA8PCAyKQorI2RlZmluZSBSVDU2NjhfU1RPMV9BRENfUl9TUkNfU0hJRlQJCTIKKworLyogQURDIE1peGVyIHRvIERBQyBNaXhlciBDb250cm9sICgweDAwMjkpICovCisjZGVmaW5lIFJUNTY2OF9NX0FEQ01JWF9MCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X01fQURDTUlYX0xfU0hJRlQJCQkxNQorI2RlZmluZSBSVDU2NjhfTV9EQUMxX0wJCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjY4X01fREFDMV9MX1NISUZUCQkJMTQKKyNkZWZpbmUgUlQ1NjY4X01fQURDTUlYX1IJCQkoMHgxIDw8IDcpCisjZGVmaW5lIFJUNTY2OF9NX0FEQ01JWF9SX1NISUZUCQkJNworI2RlZmluZSBSVDU2NjhfTV9EQUMxX1IJCQkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2NjhfTV9EQUMxX1JfU0hJRlQJCQk2CisKKy8qIFN0ZXJlbyBEQUMgTWl4ZXIgQ29udHJvbCAoMHgwMDJhKSAqLworI2RlZmluZSBSVDU2NjhfTV9EQUNfTDFfU1RPX0wJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfTV9EQUNfTDFfU1RPX0xfU0hJRlQJCTE1CisjZGVmaW5lIFJUNTY2OF9NX0RBQ19SMV9TVE9fTAkJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTY2OF9NX0RBQ19SMV9TVE9fTF9TSElGVAkJMTMKKyNkZWZpbmUgUlQ1NjY4X01fREFDX0wxX1NUT19SCQkJKDB4MSA8PCA3KQorI2RlZmluZSBSVDU2NjhfTV9EQUNfTDFfU1RPX1JfU0hJRlQJCTcKKyNkZWZpbmUgUlQ1NjY4X01fREFDX1IxX1NUT19SCQkJKDB4MSA8PCA1KQorI2RlZmluZSBSVDU2NjhfTV9EQUNfUjFfU1RPX1JfU0hJRlQJCTUKKworLyogUG93ZXIgTWFuYWdlbWVudCBmb3IgRGlnaXRhbCAxICgweDAwNjEpICovCisjZGVmaW5lIFJUNTY2OF9QV1JfSTJTMQkJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfUFdSX0kyUzFfU0hJRlQJCQkxNQorI2RlZmluZSBSVDU2NjhfUFdSX0RBQ19MMQkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2OF9QV1JfREFDX0wxX1NISUZUCQkJMTEKKyNkZWZpbmUgUlQ1NjY4X1BXUl9EQUNfUjEJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2NjhfUFdSX0RBQ19SMV9TSElGVAkJCTEwCisjZGVmaW5lIFJUNTY2OF9QV1JfTERPX0RBQ1JFRl9NQVNLCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTY2OF9QV1JfTERPX0RBQ1JFRl9TSElGVAkJOAorI2RlZmluZSBSVDU2NjhfUFdSX0xET19EQUNSRUZfT04JCSgweDEgPDwgOCkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9MRE9fREFDUkVGX0RPV04JCSgweDAgPDwgOCkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9MRE9fU0hJRlQJCQk4CisjZGVmaW5lIFJUNTY2OF9QV1JfQURDX0wxCQkJKDB4MSA8PCA0KQorI2RlZmluZSBSVDU2NjhfUFdSX0FEQ19MMV9TSElGVAkJCTQKKyNkZWZpbmUgUlQ1NjY4X1BXUl9BRENfUjEJCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTY2OF9QV1JfQURDX1IxX1NISUZUCQkJMworCisvKiBQb3dlciBNYW5hZ2VtZW50IGZvciBEaWdpdGFsIDIgKDB4MDA2MikgKi8KKyNkZWZpbmUgUlQ1NjY4X1BXUl9BRENfUzFGCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9BRENfUzFGX1NISUZUCQkxNQorI2RlZmluZSBSVDU2NjhfUFdSX0RBQ19TMUYJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2NjhfUFdSX0RBQ19TMUZfU0hJRlQJCTEwCisKKy8qIFBvd2VyIE1hbmFnZW1lbnQgZm9yIEFuYWxvZyAxICgweDAwNjMpICovCisjZGVmaW5lIFJUNTY2OF9QV1JfVlJFRjEJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfUFdSX1ZSRUYxX01BU0sJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfUFdSX1ZSRUYxX1NISUZUCQkJMTUKKyNkZWZpbmUgUlQ1NjY4X1BXUl9GVjEJCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9GVjFfTUFTSwkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2OF9QV1JfRlYxX1NISUZUCQkJMTQKKyNkZWZpbmUgUlQ1NjY4X1BXUl9WUkVGMgkJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTY2OF9QV1JfVlJFRjJfTUFTSwkJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTY2OF9QV1JfVlJFRjJfU0hJRlQJCQkxMworI2RlZmluZSBSVDU2NjhfUFdSX0ZWMgkJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2NjhfUFdSX0ZWMl9NQVNLCQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgUlQ1NjY4X1BXUl9GVjJfU0hJRlQJCQkxMgorI2RlZmluZSBSVDU2NjhfUFdSX01CCQkJCSgweDEgPDwgOSkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9NQl9NQVNLCQkJKDB4MSA8PCA5KQorI2RlZmluZSBSVDU2NjhfUFdSX01CX1NISUZUCQkJOQorI2RlZmluZSBSVDU2NjhfQU1QX0hQX01BU0sJCQkoMHgzIDw8IDIpCisjZGVmaW5lIFJUNTY2OF9BTVBfSFBfU0hJRlQJCQkyCisjZGVmaW5lIFJUNTY2OF9BTVBfSFBfMVgJCQkoMHgwIDw8IDIpCisjZGVmaW5lIFJUNTY2OF9BTVBfSFBfM1gJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTY2OF9BTVBfSFBfNVgJCQkoMHgzIDw8IDIpCisjZGVmaW5lIFJUNTY2OF9MRE8xX0RWT19NQVNLCQkJKDB4MykKKyNkZWZpbmUgUlQ1NjY4X0xETzFfRFZPX1NISUZUCQkJMAorI2RlZmluZSBSVDU2NjhfTERPMV9EVk9fMF85VgkJCSgweDApCisjZGVmaW5lIFJUNTY2OF9MRE8xX0RWT18xXzBWCQkJKDB4MSkKKyNkZWZpbmUgUlQ1NjY4X0xETzFfRFZPXzFfMlYJCQkoMHgyKQorI2RlZmluZSBSVDU2NjhfTERPMV9EVk9fMV80VgkJCSgweDMpCisKKy8qIFBvd2VyIE1hbmFnZW1lbnQgZm9yIEFuYWxvZyAyICgweDAwNjQpICovCisjZGVmaW5lIFJUNTY2OF9QV1JfQlNUMQkJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfUFdSX0JTVDFfTUFTSwkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9QV1JfQlNUMV9TSElGVAkJCTE1CisjZGVmaW5lIFJUNTY2OF9QV1JfQlNUMV9PRkYJCQkoMHgwIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfUFdSX0JTVDFfT04JCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfUFdSX0JTVDIJCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9CU1QyX01BU0sJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjhfUFdSX0JTVDJfU0hJRlQJCQkxNAorI2RlZmluZSBSVDU2NjhfUFdSX01CMQkJCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjhfUFdSX01CMV9TSElGVAkJCTExCisjZGVmaW5lIFJUNTY2OF9QV1JfTUIyCQkJCSgweDEgPDwgMTApCisjZGVmaW5lIFJUNTY2OF9QV1JfTUIyX1NISUZUCQkJMTAKKyNkZWZpbmUgUlQ1NjY4X1BXUl9CU1QyX09QCQkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2NjhfUFdSX0JTVDJfT1BfTUFTSwkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjY4X1BXUl9CU1QyX09QX1NISUZUCQk2CisjZGVmaW5lIFJUNTY2OF9QV1JfSkQxCQkJCSgweDEgPDwgMykKKyNkZWZpbmUgUlQ1NjY4X1BXUl9KRDFfTUFTSwkJCSgweDEgPDwgMykKKyNkZWZpbmUgUlQ1NjY4X1BXUl9KRDFfU0hJRlQJCQkzCisjZGVmaW5lIFJUNTY2OF9QV1JfSkQyCQkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjY4X1BXUl9KRDJfTUFTSwkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjY4X1BXUl9KRDJfU0hJRlQJCQkyCisjZGVmaW5lIFJUNTY2OF9QV1JfUkVDTUlYMQkJCSgweDEgPDwgMSkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9SRUNNSVgxX1NISUZUCQkxCisjZGVmaW5lIFJUNTY2OF9QV1JfUkVDTUlYMgkJCSgweDEpCisjZGVmaW5lIFJUNTY2OF9QV1JfUkVDTUlYMl9TSElGVAkJMAorCisvKiBQb3dlciBNYW5hZ2VtZW50IGZvciBBbmFsb2cgMyAoMHgwMDY1KSAqLworI2RlZmluZSBSVDU2NjhfUFdSX0NCSl9NQVNLCQkJKDB4MSA8PCA5KQorI2RlZmluZSBSVDU2NjhfUFdSX0NCSl9TSElGVAkJCTkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9DQkpfT0ZGCQkJKDB4MCA8PCA5KQorI2RlZmluZSBSVDU2NjhfUFdSX0NCSl9PTgkJCSgweDEgPDwgOSkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9QTEwJCQkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2NjhfUFdSX1BMTF9TSElGVAkJCTYKKyNkZWZpbmUgUlQ1NjY4X1BXUl9MRE8yCQkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjY4X1BXUl9MRE8yX1NISUZUCQkJMgorCisvKiBQb3dlciBNYW5hZ2VtZW50IGZvciBWb2x1bWUgKDB4MDA2NykgKi8KKyNkZWZpbmUgUlQ1NjY4X1BXUl9NSUNfREVUCQkJKDB4MSA8PCA1KQorI2RlZmluZSBSVDU2NjhfUFdSX01JQ19ERVRfU0hJRlQJCTUKKworLyogTUNMSyBhbmQgU3lzdGVtIENsb2NrIERldGVjdGlvbiBDb250cm9sICgweDAwNmIpICovCisjZGVmaW5lIFJUNTY2OF9FTl9BTkFfQ0xLX0RFVF9NQVNLCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfRU5fQU5BX0NMS19ERVRfU0hJRlQJCTE1CisjZGVmaW5lIFJUNTY2OF9FTl9BTkFfQ0xLX0RFVF9ESVMJCSgweDAgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9FTl9BTkFfQ0xLX0RFVF9BVVRPCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfUFdSX0NMS19ERVRfTUFTSwkJCSgweDEpCisjZGVmaW5lIFJUNTY2OF9QV1JfQ0xLX0RFVF9TSElGVAkJMAorI2RlZmluZSBSVDU2NjhfUFdSX0NMS19ERVRfRElTCQkJKDB4MCkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9DTEtfREVUX0VOCQkJKDB4MSkKKworLyogSTJTMSBBdWRpbyBTZXJpYWwgRGF0YSBQb3J0IENvbnRyb2wgKDB4MDA3MCkgKi8KKyNkZWZpbmUgUlQ1NjY4X0kyU19NU19NQVNLCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X0kyU19NU19TSElGVAkJCTE1CisjZGVmaW5lIFJUNTY2OF9JMlNfTVNfTQkJCQkoMHgwIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfSTJTX01TX1MJCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X0kyU19CUF9NQVNLCQkJKDB4MSA8PCA4KQorI2RlZmluZSBSVDU2NjhfSTJTX0JQX1NISUZUCQkJOAorI2RlZmluZSBSVDU2NjhfSTJTX0JQX05PUgkJCSgweDAgPDwgOCkKKyNkZWZpbmUgUlQ1NjY4X0kyU19CUF9JTlYJCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTY2OF9JMlNfRExfTUFTSwkJCSgweDMgPDwgNCkKKyNkZWZpbmUgUlQ1NjY4X0kyU19ETF9TSElGVAkJCTQKKyNkZWZpbmUgUlQ1NjY4X0kyU19ETF8xNgkJCSgweDAgPDwgNCkKKyNkZWZpbmUgUlQ1NjY4X0kyU19ETF8yMAkJCSgweDEgPDwgNCkKKyNkZWZpbmUgUlQ1NjY4X0kyU19ETF8yNAkJCSgweDIgPDwgNCkKKyNkZWZpbmUgUlQ1NjY4X0kyU19ETF84CQkJCSgweDMgPDwgNCkKKyNkZWZpbmUgUlQ1NjY4X0kyU19ERl9NQVNLCQkJKDB4NykKKyNkZWZpbmUgUlQ1NjY4X0kyU19ERl9TSElGVAkJCTAKKyNkZWZpbmUgUlQ1NjY4X0kyU19ERl9JMlMJCQkoMHgwKQorI2RlZmluZSBSVDU2NjhfSTJTX0RGX0xFRlQJCQkoMHgxKQorI2RlZmluZSBSVDU2NjhfSTJTX0RGX1BDTV9BCQkJKDB4MikKKyNkZWZpbmUgUlQ1NjY4X0kyU19ERl9QQ01fQgkJCSgweDMpCisjZGVmaW5lIFJUNTY2OF9JMlNfREZfUENNX0FfTgkJCSgweDYpCisjZGVmaW5lIFJUNTY2OF9JMlNfREZfUENNX0JfTgkJCSgweDcpCisKKy8qIEFEQy9EQUMgQ2xvY2sgQ29udHJvbCAxICgweDAwNzMpICovCisjZGVmaW5lIFJUNTY2OF9JMlNfUEQxX01BU0sJCQkoMHg3IDw8IDEyKQorI2RlZmluZSBSVDU2NjhfSTJTX1BEMV9TSElGVAkJCTEyCisjZGVmaW5lIFJUNTY2OF9NX0kyU19ESVZfTUFTSwkJCSgweDcgPDwgOCkKKyNkZWZpbmUgUlQ1NjY4X01fSTJTX0RJVl9TSElGVAkJCTgKKyNkZWZpbmUgUlQ1NjY4X0NMS19TUkNfTUFTSwkJCSgweDMgPDwgNCkKKyNkZWZpbmUgUlQ1NjY4X0NMS19TUkNfTUNMSwkJCSgweDAgPDwgNCkKKyNkZWZpbmUgUlQ1NjY4X0NMS19TUkNfUExMX09VVAkJCSgweDEgPDwgNCkKKyNkZWZpbmUgUlQ1NjY4X0NMS19TUkNfRElWCQkJKDB4MiA8PCA0KQorI2RlZmluZSBSVDU2NjhfQ0xLX1NSQ19SQwkJCSgweDMgPDwgNCkKKyNkZWZpbmUgUlQ1NjY4X0RBQ19PU1JfTUFTSwkJCSgweDMgPDwgMikKKyNkZWZpbmUgUlQ1NjY4X0RBQ19PU1JfU0hJRlQJCQkyCisjZGVmaW5lIFJUNTY2OF9EQUNfT1NSXzEyOAkJCSgweDAgPDwgMikKKyNkZWZpbmUgUlQ1NjY4X0RBQ19PU1JfNjQJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTY2OF9EQUNfT1NSXzMyCQkJKDB4MiA8PCAyKQorI2RlZmluZSBSVDU2NjhfQURDX09TUl9NQVNLCQkJKDB4MykKKyNkZWZpbmUgUlQ1NjY4X0FEQ19PU1JfU0hJRlQJCQkwCisjZGVmaW5lIFJUNTY2OF9BRENfT1NSXzEyOAkJCSgweDApCisjZGVmaW5lIFJUNTY2OF9BRENfT1NSXzY0CQkJKDB4MSkKKyNkZWZpbmUgUlQ1NjY4X0FEQ19PU1JfMzIJCQkoMHgyKQorCisvKiBURE0xIGNvbnRyb2wgMSAoMHgwMDc4KSAqLworI2RlZmluZSBSVDU2NjhfVERNX01PREVfTUFTSwkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9URE1fTU9ERV9TSElGVAkJCTE1CisjZGVmaW5lIFJUNTY2OF9URE1fTU9ERV9JMlMJCQkoMHgwIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfVERNX01PREVfVERNCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X1RETV9JTl9DSF9NQVNLCQkJKDB4MyA8PCAxMCkKKyNkZWZpbmUgUlQ1NjY4X1RETV9JTl9DSF9TSElGVAkJCTEwCisjZGVmaW5lIFJUNTY2OF9URE1fSU5fQ0hfMgkJCSgweDAgPDwgMTApCisjZGVmaW5lIFJUNTY2OF9URE1fSU5fQ0hfNAkJCSgweDEgPDwgMTApCisjZGVmaW5lIFJUNTY2OF9URE1fSU5fQ0hfNgkJCSgweDIgPDwgMTApCisjZGVmaW5lIFJUNTY2OF9URE1fSU5fQ0hfOAkJCSgweDMgPDwgMTApCisjZGVmaW5lIFJUNTY2OF9URE1fT1VUX0NIX01BU0sJCQkoMHgzIDw8IDgpCisjZGVmaW5lIFJUNTY2OF9URE1fT1VUX0NIX1NISUZUCQkJOAorI2RlZmluZSBSVDU2NjhfVERNX09VVF9DSF8yCQkJKDB4MCA8PCA4KQorI2RlZmluZSBSVDU2NjhfVERNX09VVF9DSF80CQkJKDB4MSA8PCA4KQorI2RlZmluZSBSVDU2NjhfVERNX09VVF9DSF82CQkJKDB4MiA8PCA4KQorI2RlZmluZSBSVDU2NjhfVERNX09VVF9DSF84CQkJKDB4MyA8PCA4KQorI2RlZmluZSBSVDU2NjhfVERNX0lOX0xFTl9NQVNLCQkJKDB4MyA8PCA2KQorI2RlZmluZSBSVDU2NjhfVERNX0lOX0xFTl9TSElGVAkJCTYKKyNkZWZpbmUgUlQ1NjY4X1RETV9JTl9MRU5fMTYJCQkoMHgwIDw8IDYpCisjZGVmaW5lIFJUNTY2OF9URE1fSU5fTEVOXzIwCQkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2NjhfVERNX0lOX0xFTl8yNAkJCSgweDIgPDwgNikKKyNkZWZpbmUgUlQ1NjY4X1RETV9JTl9MRU5fMzIJCQkoMHgzIDw8IDYpCisjZGVmaW5lIFJUNTY2OF9URE1fT1VUX0xFTl9NQVNLCQkJKDB4MyA8PCA0KQorI2RlZmluZSBSVDU2NjhfVERNX09VVF9MRU5fU0hJRlQJCTQKKyNkZWZpbmUgUlQ1NjY4X1RETV9PVVRfTEVOXzE2CQkJKDB4MCA8PCA0KQorI2RlZmluZSBSVDU2NjhfVERNX09VVF9MRU5fMjAJCQkoMHgxIDw8IDQpCisjZGVmaW5lIFJUNTY2OF9URE1fT1VUX0xFTl8yNAkJCSgweDIgPDwgNCkKKyNkZWZpbmUgUlQ1NjY4X1RETV9PVVRfTEVOXzMyCQkJKDB4MyA8PCA0KQorCisvKiBHbG9iYWwgQ2xvY2sgQ29udHJvbCAoMHgwMDgwKSAqLworI2RlZmluZSBSVDU2NjhfU0NMS19TUkNfTUFTSwkJCSgweDMgPDwgMTQpCisjZGVmaW5lIFJUNTY2OF9TQ0xLX1NSQ19TSElGVAkJCTE0CisjZGVmaW5lIFJUNTY2OF9TQ0xLX1NSQ19NQ0xLCQkJKDB4MCA8PCAxNCkKKyNkZWZpbmUgUlQ1NjY4X1NDTEtfU1JDX1BMTDEJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjhfU0NMS19TUkNfUkNDTEsJCQkoMHgyIDw8IDE0KQorI2RlZmluZSBSVDU2NjhfUExMMV9TUkNfTUFTSwkJCSgweDcgPDwgOCkKKyNkZWZpbmUgUlQ1NjY4X1BMTDFfU1JDX1NISUZUCQkJOAorI2RlZmluZSBSVDU2NjhfUExMMV9TUkNfTUNMSwkJCSgweDAgPDwgOCkKKyNkZWZpbmUgUlQ1NjY4X1BMTDFfU1JDX0JDTEsxCQkJKDB4MSA8PCA4KQorI2RlZmluZSBSVDU2NjhfUExMMV9QRF9NQVNLCQkJKDB4MSA8PCA0KQorI2RlZmluZSBSVDU2NjhfUExMMV9QRF9TSElGVAkJCTQKKworI2RlZmluZSBSVDU2NjhfUExMX0lOUF9NQVgJCQk0MDAwMDAwMAorI2RlZmluZSBSVDU2NjhfUExMX0lOUF9NSU4JCQkyNTYwMDAKKy8qIFBMTCBNL04vSyBDb2RlIENvbnRyb2wgMSAoMHgwMDgxKSAqLworI2RlZmluZSBSVDU2NjhfUExMX05fTUFYCQkJMHgwMDFmZgorI2RlZmluZSBSVDU2NjhfUExMX05fTUFTSwkJCShSVDU2NjhfUExMX05fTUFYIDw8IDcpCisjZGVmaW5lIFJUNTY2OF9QTExfTl9TSElGVAkJCTcKKyNkZWZpbmUgUlQ1NjY4X1BMTF9LX01BWAkJCTB4MDAxZgorI2RlZmluZSBSVDU2NjhfUExMX0tfTUFTSwkJCShSVDU2NjhfUExMX0tfTUFYKQorI2RlZmluZSBSVDU2NjhfUExMX0tfU0hJRlQJCQkwCisKKy8qIFBMTCBNL04vSyBDb2RlIENvbnRyb2wgMiAoMHgwMDgyKSAqLworI2RlZmluZSBSVDU2NjhfUExMX01fTUFYCQkJMHgwMGYKKyNkZWZpbmUgUlQ1NjY4X1BMTF9NX01BU0sJCQkoUlQ1NjY4X1BMTF9NX01BWCA8PCAxMikKKyNkZWZpbmUgUlQ1NjY4X1BMTF9NX1NISUZUCQkJMTIKKyNkZWZpbmUgUlQ1NjY4X1BMTF9NX0JQCQkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2OF9QTExfTV9CUF9TSElGVAkJCTExCisKKy8qIFBMTCB0cmFja2luZyBtb2RlIDEgKDB4MDA4MykgKi8KKyNkZWZpbmUgUlQ1NjY4X0kyUzFfQVNSQ19NQVNLCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjY4X0kyUzFfQVNSQ19TSElGVAkJCTEzCisjZGVmaW5lIFJUNTY2OF9EQUNfU1RPMV9BU1JDX01BU0sJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTY2OF9EQUNfU1RPMV9BU1JDX1NISUZUCQkxMgorI2RlZmluZSBSVDU2NjhfQURDX1NUTzFfQVNSQ19NQVNLCQkoMHgxIDw8IDQpCisjZGVmaW5lIFJUNTY2OF9BRENfU1RPMV9BU1JDX1NISUZUCQk0CisKKy8qIFBMTCB0cmFja2luZyBtb2RlIDIgKDB4MDA4NCkqLworI2RlZmluZSBSVDU2NjhfREFfU1RPMV9UUkFDS19NQVNLCQkoMHg3IDw8IDEyKQorI2RlZmluZSBSVDU2NjhfREFfU1RPMV9UUkFDS19TSElGVAkJMTIKKyNkZWZpbmUgUlQ1NjY4X0RBX1NUTzFfVFJBQ0tfU1lTQ0xLCQkoMHgwIDw8IDEyKQorI2RlZmluZSBSVDU2NjhfREFfU1RPMV9UUkFDS19JMlMxCQkoMHgxIDw8IDEyKQorCisvKiBQTEwgdHJhY2tpbmcgbW9kZSAzICgweDAwODUpKi8KKyNkZWZpbmUgUlQ1NjY4X0FEX1NUTzFfVFJBQ0tfTUFTSwkJKDB4NyA8PCAxMikKKyNkZWZpbmUgUlQ1NjY4X0FEX1NUTzFfVFJBQ0tfU0hJRlQJCTEyCisjZGVmaW5lIFJUNTY2OF9BRF9TVE8xX1RSQUNLX1NZU0NMSwkJKDB4MCA8PCAxMikKKyNkZWZpbmUgUlQ1NjY4X0FEX1NUTzFfVFJBQ0tfSTJTMQkJKDB4MSA8PCAxMikKKworLyogSFBPVVQgQ2hhcmdlIHB1bXAgY29udHJvbCAxICgweDAwOTEpICovCisjZGVmaW5lIFJUNTY2OF9PU1dfSFBfTF9NQVNLCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjY4X09TV19IUF9MX1NISUZUCQkJMTEKKyNkZWZpbmUgUlQ1NjY4X09TV19IUF9MX0VOCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjY4X09TV19IUF9MX0RJUwkJCSgweDAgPDwgMTEpCisjZGVmaW5lIFJUNTY2OF9PU1dfSFBfUl9NQVNLCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjY4X09TV19IUF9SX1NISUZUCQkJMTAKKyNkZWZpbmUgUlQ1NjY4X09TV19IUF9SX0VOCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjY4X09TV19IUF9SX0RJUwkJCSgweDAgPDwgMTApCisjZGVmaW5lIFJUNTY2OF9TRUxfUE1fSFBfTUFTSwkJCSgweDMgPDwgOCkKKyNkZWZpbmUgUlQ1NjY4X1NFTF9QTV9IUF9TSElGVAkJCTgKKyNkZWZpbmUgUlQ1NjY4X1NFTF9QTV9IUF8wXzYJCQkoMHgwIDw8IDgpCisjZGVmaW5lIFJUNTY2OF9TRUxfUE1fSFBfMF85CQkJKDB4MSA8PCA4KQorI2RlZmluZSBSVDU2NjhfU0VMX1BNX0hQXzFfOAkJCSgweDIgPDwgOCkKKyNkZWZpbmUgUlQ1NjY4X1NFTF9QTV9IUF9ISUdICQkJKDB4MyA8PCA4KQorI2RlZmluZSBSVDU2NjhfT1ZDRF9IUF9NQVNLCQkJKDB4MSA8PCAyKQorI2RlZmluZSBSVDU2NjhfT1ZDRF9IUF9TSElGVAkJCTIKKyNkZWZpbmUgUlQ1NjY4X09WQ0RfSFBfRU4JCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTY2OF9PVkNEX0hQX0RJUwkJCSgweDAgPDwgMikKKworLyogUkMgQ2xvY2sgQ29udHJvbCAoMHgwMDk0KSAqLworI2RlZmluZSBSVDU2NjhfRElHXzI1TV9DTEtfTUFTSwkJCSgweDEgPDwgOSkKKyNkZWZpbmUgUlQ1NjY4X0RJR18yNU1fQ0xLX1NISUZUCQk5CisjZGVmaW5lIFJUNTY2OF9ESUdfMjVNX0NMS19ESVMJCQkoMHgwIDw8IDkpCisjZGVmaW5lIFJUNTY2OF9ESUdfMjVNX0NMS19FTgkJCSgweDEgPDwgOSkKKyNkZWZpbmUgUlQ1NjY4X0RJR18xTV9DTEtfTUFTSwkJCSgweDEgPDwgOCkKKyNkZWZpbmUgUlQ1NjY4X0RJR18xTV9DTEtfU0hJRlQJCQk4CisjZGVmaW5lIFJUNTY2OF9ESUdfMU1fQ0xLX0RJUwkJCSgweDAgPDwgOCkKKyNkZWZpbmUgUlQ1NjY4X0RJR18xTV9DTEtfRU4JCQkoMHgxIDw8IDgpCisKKy8qIEF1dG8gVHVybiBPbiAxTSBSQyBDTEsgKDB4MDA5ZikgKi8KKyNkZWZpbmUgUlQ1NjY4X0lSUV9QT1dfU0FWX01BU0sJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfSVJRX1BPV19TQVZfU0hJRlQJCTE1CisjZGVmaW5lIFJUNTY2OF9JUlFfUE9XX1NBVl9ESVMJCQkoMHgwIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfSVJRX1BPV19TQVZfRU4JCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfSVJRX1BPV19TQVZfSkQxX01BU0sJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2OF9JUlFfUE9XX1NBVl9KRDFfU0hJRlQJCTE0CisjZGVmaW5lIFJUNTY2OF9JUlFfUE9XX1NBVl9KRDFfRElTCQkoMHgwIDw8IDE0KQorI2RlZmluZSBSVDU2NjhfSVJRX1BPV19TQVZfSkQxX0VOCQkoMHgxIDw8IDE0KQorCisvKiBJUlEgQ29udHJvbCAxICgweDAwYjYpICovCisjZGVmaW5lIFJUNTY2OF9FTl9DQl9KRF9NQVNLCQkJKDB4MSA8PCAzKQorI2RlZmluZSBSVDU2NjhfRU5fQ0JfSkRfU0hJRlQJCQkzCisjZGVmaW5lIFJUNTY2OF9FTl9DQl9KRF9FTgkJCSgweDEgPDwgMykKKyNkZWZpbmUgUlQ1NjY4X0VOX0NCX0pEX0RJUwkJCSgweDAgPDwgMykKKworLyogSVJRIENvbnRyb2wgMyAoMHgwMGI4KSAqLworI2RlZmluZSBSVDU2NjhfRU5fSVJRX0lOTElORV9NQVNLCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTY2OF9FTl9JUlFfSU5MSU5FX1NISUZUCQk2CisjZGVmaW5lIFJUNTY2OF9FTl9JUlFfSU5MSU5FX0JZUAkJKDB4MCA8PCA2KQorI2RlZmluZSBSVDU2NjhfRU5fSVJRX0lOTElORV9OT1IJCSgweDEgPDwgNikKKworLyogR1BJTyBDb250cm9sIDEgKDB4MDBjMCkgKi8KKyNkZWZpbmUgUlQ1NjY4X0dQMV9QSU5fTUFTSwkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9HUDFfUElOX1NISUZUCQkJMTUKKyNkZWZpbmUgUlQ1NjY4X0dQMV9QSU5fR1BJTzEJCQkoMHgwIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfR1AxX1BJTl9JUlEJCQkoMHgxIDw8IDE1KQorCisvKiBHUElPIENvbnRyb2wgMiAoMHgwMGMxKSAqLworI2RlZmluZSBSVDU2NjhfR1A0X1BJTl9DT05GX01BU0sJCSgweDEgPDwgNSkKKyNkZWZpbmUgUlQ1NjY4X0dQNF9QSU5fQ09ORl9TSElGVAkJNQorI2RlZmluZSBSVDU2NjhfR1A0X1BJTl9DT05GX0lOUFVUCQkoMHgwIDw8IDUpCisjZGVmaW5lIFJUNTY2OF9HUDRfUElOX0NPTkZfT1VUUFVUCQkoMHgxIDw8IDUpCisKKy8qIEdQSU8gQ29udHJvbCAyICgweDAwYzIpICovCisjZGVmaW5lIFJUNTY2OF9HUDhfUElOX0NPTkZfTUFTSwkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjY4X0dQOF9QSU5fQ09ORl9TSElGVAkJMTMKKyNkZWZpbmUgUlQ1NjY4X0dQOF9QSU5fQ09ORl9JTlBVVAkJKDB4MCA8PCAxMykKKyNkZWZpbmUgUlQ1NjY4X0dQOF9QSU5fQ09ORl9PVVRQVVQJCSgweDEgPDwgMTMpCisKKy8qIDQgQnV0dG9ucyBJbmxpbmUgQ29tbWFuZCBGdW5jdGlvbiAxICgweDAwZGYpICovCisjZGVmaW5lIFJUNTY2OF80QlROX0NMS19ERUJfTUFTSwkJKDB4MyA8PCAyKQorI2RlZmluZSBSVDU2NjhfNEJUTl9DTEtfREVCX1NISUZUCQkyCisjZGVmaW5lIFJUNTY2OF80QlROX0NMS19ERUJfOE1TCQkJKDB4MCA8PCAyKQorI2RlZmluZSBSVDU2NjhfNEJUTl9DTEtfREVCXzE2TVMJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjY4XzRCVE5fQ0xLX0RFQl8zMk1TCQkoMHgyIDw8IDIpCisjZGVmaW5lIFJUNTY2OF80QlROX0NMS19ERUJfNjVNUwkJKDB4MyA8PCAyKQorCisvKiBJbmxpbmUgQ29tbWFuZCBGdW5jdGlvbiA2ICgweDAwZTApICovCisjZGVmaW5lIFJUNTY2OF9FTl80QlROX0lOTF9NQVNLCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X0VOXzRCVE5fSU5MX1NISUZUCQkxNQorI2RlZmluZSBSVDU2NjhfRU5fNEJUTl9JTkxfRElTCQkJKDB4MCA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X0VOXzRCVE5fSU5MX0VOCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X1JFU0VUXzRCVE5fSU5MX01BU0sJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2OF9SRVNFVF80QlROX0lOTF9TSElGVAkJMTQKKyNkZWZpbmUgUlQ1NjY4X1JFU0VUXzRCVE5fSU5MX1JFU0VUCQkoMHgwIDw8IDE0KQorI2RlZmluZSBSVDU2NjhfUkVTRVRfNEJUTl9JTkxfTk9SCQkoMHgxIDw8IDE0KQorCisvKiBEaWdpdGFsIE1pc2MgQ29udHJvbCAoMHgwMGZhKSAqLworI2RlZmluZSBSVDU2NjhfRElHX0dBVEVfQ1RSTF9NQVNLCQkweDEKKyNkZWZpbmUgUlQ1NjY4X0RJR19HQVRFX0NUUkxfU0hJRlQJCSgwKQorI2RlZmluZSBSVDU2NjhfRElHX0dBVEVfQ1RSTF9ESVMJCTB4MAorI2RlZmluZSBSVDU2NjhfRElHX0dBVEVfQ1RSTF9FTgkJCTB4MQorCisvKiBDaG9wcGVyIGFuZCBDbG9jayBjb250cm9sIGZvciBEQUMgTCAoMHgwMTNhKSovCisjZGVmaW5lIFJUNTY2OF9DS1hFTl9EQUMxX01BU0sJCQkoMHgxIDw8IDEzKQorI2RlZmluZSBSVDU2NjhfQ0tYRU5fREFDMV9TSElGVAkJCTEzCisjZGVmaW5lIFJUNTY2OF9DS0dFTl9EQUMxX01BU0sJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2NjhfQ0tHRU5fREFDMV9TSElGVAkJCTEyCisKKy8qIENob3BwZXIgYW5kIENsb2NrIGNvbnRyb2wgZm9yIEFEQyAoMHgwMTNiKSovCisjZGVmaW5lIFJUNTY2OF9DS1hFTl9BRENDX01BU0sJCQkoMHgxIDw8IDEzKQorI2RlZmluZSBSVDU2NjhfQ0tYRU5fQURDQ19TSElGVAkJCTEzCisjZGVmaW5lIFJUNTY2OF9DS0dFTl9BRENDX01BU0sJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2NjhfQ0tHRU5fQURDQ19TSElGVAkJCTEyCisKKy8qIEhQIEJlaGF2aW9yIExvZ2ljIENvbnRyb2wgMiAoMHgwMWRiKSAqLworI2RlZmluZSBSVDU2NjhfSFBfU0lHX1NSQzFfTUFTSwkJCSgweDMpCisjZGVmaW5lIFJUNTY2OF9IUF9TSUdfU1JDMV9TSElGVAkJMAorI2RlZmluZSBSVDU2NjhfSFBfU0lHX1NSQzFfSFBfREMJCSgweDApCisjZGVmaW5lIFJUNTY2OF9IUF9TSUdfU1JDMV9IUF9DQUxJQgkJKDB4MSkKKyNkZWZpbmUgUlQ1NjY4X0hQX1NJR19TUkMxX1JFRwkJCSgweDIpCisjZGVmaW5lIFJUNTY2OF9IUF9TSUdfU1JDMV9TSUxFTkNFCQkoMHgzKQorCisvKiBSVDU2NjMgc3BlY2lmaWMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlQ1NjYzX0hQX09VVF9FTgkJCTB4MDAwMgorI2RlZmluZSBSVDU2NjNfSFBfTENIX0RSRQkJCTB4MDAwNQorI2RlZmluZSBSVDU2NjNfSFBfUkNIX0RSRQkJCTB4MDAwNgorI2RlZmluZSBSVDU2NjNfQ0FMSUJfQlNUCQkJMHgwMDBhCisjZGVmaW5lIFJUNTY2M19SRUNNSVgJCQkJMHgwMDEwCisjZGVmaW5lIFJUNTY2M19TSUxfREVUX0NUTAkJCTB4MDAxNQorI2RlZmluZSBSVDU2NjNfUFdSX1NBVl9TSUxERVQJCQkweDAwMTYKKyNkZWZpbmUgUlQ1NjYzX1NJREVUT05FX0NUTAkJCTB4MDAxOAorI2RlZmluZSBSVDU2NjNfU1RPMV9EQUNfRElHX1ZPTAkJCTB4MDAxOQorI2RlZmluZSBSVDU2NjNfU1RPMV9BRENfRElHX1ZPTAkJCTB4MDAxYworI2RlZmluZSBSVDU2NjNfU1RPMV9CT09TVAkJCTB4MDAxZgorI2RlZmluZSBSVDU2NjNfSFBfSU1QX0dBSU5fMQkJCTB4MDAyMgorI2RlZmluZSBSVDU2NjNfSFBfSU1QX0dBSU5fMgkJCTB4MDAyMworI2RlZmluZSBSVDU2NjNfU1RPMV9BRENfTUlYRVIJCQkweDAwMjYKKyNkZWZpbmUgUlQ1NjYzX0FEX0RBX01JWEVSCQkJMHgwMDI5CisjZGVmaW5lIFJUNTY2M19TVE9fREFDX01JWEVSCQkJMHgwMDJhCisjZGVmaW5lIFJUNTY2M19ESUdfU0lERV9NSVhFUgkJCTB4MDAyYworI2RlZmluZSBSVDU2NjNfQllQQVNTX1NUT19EQUMJCQkweDAwMmQKKyNkZWZpbmUgUlQ1NjYzX0NBTElCX1JFQ19NSVgJCQkweDAwNDAKKyNkZWZpbmUgUlQ1NjYzX1BXUl9ESUdfMQkJCTB4MDA2MQorI2RlZmluZSBSVDU2NjNfUFdSX0RJR18yCQkJMHgwMDYyCisjZGVmaW5lIFJUNTY2M19QV1JfQU5MR18xCQkJMHgwMDYzCisjZGVmaW5lIFJUNTY2M19QV1JfQU5MR18yCQkJMHgwMDY0CisjZGVmaW5lIFJUNTY2M19QV1JfQU5MR18zCQkJMHgwMDY1CisjZGVmaW5lIFJUNTY2M19QV1JfTUlYRVIJCQkweDAwNjYKKyNkZWZpbmUgUlQ1NjYzX1NJR19DTEtfREVUCQkJMHgwMDZiCisjZGVmaW5lIFJUNTY2M19QUkVfRElWX0dBVElOR18xCQkJMHgwMDZlCisjZGVmaW5lIFJUNTY2M19QUkVfRElWX0dBVElOR18yCQkJMHgwMDZmCisjZGVmaW5lIFJUNTY2M19JMlMxX1NEUAkJCQkweDAwNzAKKyNkZWZpbmUgUlQ1NjYzX0FEREFfQ0xLXzEJCQkweDAwNzMKKyNkZWZpbmUgUlQ1NjYzX0FEREFfUlNUCQkJCTB4MDA3NAorI2RlZmluZSBSVDU2NjNfRlJBQ19ESVZfMQkJCTB4MDA3NQorI2RlZmluZSBSVDU2NjNfRlJBQ19ESVZfMgkJCTB4MDA3NgorI2RlZmluZSBSVDU2NjNfVERNXzEJCQkJMHgwMDc3CisjZGVmaW5lIFJUNTY2M19URE1fMgkJCQkweDAwNzgKKyNkZWZpbmUgUlQ1NjYzX1RETV8zCQkJCTB4MDA3OQorI2RlZmluZSBSVDU2NjNfVERNXzQJCQkJMHgwMDdhCisjZGVmaW5lIFJUNTY2M19URE1fNQkJCQkweDAwN2IKKyNkZWZpbmUgUlQ1NjYzX0dMQl9DTEsJCQkJMHgwMDgwCisjZGVmaW5lIFJUNTY2M19QTExfMQkJCQkweDAwODEKKyNkZWZpbmUgUlQ1NjYzX1BMTF8yCQkJCTB4MDA4MgorI2RlZmluZSBSVDU2NjNfQVNSQ18xCQkJCTB4MDA4MworI2RlZmluZSBSVDU2NjNfQVNSQ18yCQkJCTB4MDA4NAorI2RlZmluZSBSVDU2NjNfQVNSQ180CQkJCTB4MDA4NgorI2RlZmluZSBSVDU2NjNfRFVNTVlfUkVHCQkJMHgwMDg3CisjZGVmaW5lIFJUNTY2M19BU1JDXzgJCQkJMHgwMDhhCisjZGVmaW5lIFJUNTY2M19BU1JDXzkJCQkJMHgwMDhiCisjZGVmaW5lIFJUNTY2M19BU1JDXzExCQkJCTB4MDA4YworI2RlZmluZSBSVDU2NjNfREVQT1BfMQkJCQkweDAwOGUKKyNkZWZpbmUgUlQ1NjYzX0RFUE9QXzIJCQkJMHgwMDhmCisjZGVmaW5lIFJUNTY2M19ERVBPUF8zCQkJCTB4MDA5MAorI2RlZmluZSBSVDU2NjNfSFBfQ0hBUkdFX1BVTVBfMQkJCTB4MDA5MQorI2RlZmluZSBSVDU2NjNfSFBfQ0hBUkdFX1BVTVBfMgkJCTB4MDA5MgorI2RlZmluZSBSVDU2NjNfTUlDQklBU18xCQkJMHgwMDkzCisjZGVmaW5lIFJUNTY2M19SQ19DTEsJCQkJMHgwMDk0CisjZGVmaW5lIFJUNTY2M19BU1JDXzExXzIJCQkweDAwOTcKKyNkZWZpbmUgUlQ1NjYzX0RVTU1ZX1JFR18yCQkJMHgwMDk4CisjZGVmaW5lIFJUNTY2M19SRUNfUEFUSF9HQUlOCQkJMHgwMDlhCisjZGVmaW5lIFJUNTY2M19BVVRPXzFNUkNfQ0xLCQkJMHgwMDlmCisjZGVmaW5lIFJUNTY2M19BRENfRVFfMQkJCQkweDAwYWUKKyNkZWZpbmUgUlQ1NjYzX0FEQ19FUV8yCQkJCTB4MDBhZgorI2RlZmluZSBSVDU2NjNfSVJRXzEJCQkJMHgwMGI2CisjZGVmaW5lIFJUNTY2M19JUlFfMgkJCQkweDAwYjcKKyNkZWZpbmUgUlQ1NjYzX0lSUV8zCQkJCTB4MDBiOAorI2RlZmluZSBSVDU2NjNfSVJRXzQJCQkJMHgwMGJhCisjZGVmaW5lIFJUNTY2M19JUlFfNQkJCQkweDAwYmIKKyNkZWZpbmUgUlQ1NjYzX0lOVF9TVF8xCQkJCTB4MDBiZQorI2RlZmluZSBSVDU2NjNfSU5UX1NUXzIJCQkJMHgwMGJmCisjZGVmaW5lIFJUNTY2M19HUElPXzEJCQkJMHgwMGMwCisjZGVmaW5lIFJUNTY2M19HUElPXzIJCQkJMHgwMGMxCisjZGVmaW5lIFJUNTY2M19HUElPX1NUQQkJCQkweDAwYzUKKyNkZWZpbmUgUlQ1NjYzX1NJTl9HRU5fMQkJCTB4MDBjYgorI2RlZmluZSBSVDU2NjNfU0lOX0dFTl8yCQkJMHgwMGNjCisjZGVmaW5lIFJUNTY2M19TSU5fR0VOXzMJCQkweDAwY2QKKyNkZWZpbmUgUlQ1NjYzX1NPRl9WT0xfWkMxCQkJMHgwMGQ5CisjZGVmaW5lIFJUNTY2M19JTF9DTURfMQkJCQkweDAwZGIKKyNkZWZpbmUgUlQ1NjYzX0lMX0NNRF8yCQkJCTB4MDBkYworI2RlZmluZSBSVDU2NjNfSUxfQ01EXzMJCQkJMHgwMGRkCisjZGVmaW5lIFJUNTY2M19JTF9DTURfNAkJCQkweDAwZGUKKyNkZWZpbmUgUlQ1NjYzX0lMX0NNRF81CQkJCTB4MDBkZgorI2RlZmluZSBSVDU2NjNfSUxfQ01EXzYJCQkJMHgwMGUwCisjZGVmaW5lIFJUNTY2M19JTF9DTURfNwkJCQkweDAwZTEKKyNkZWZpbmUgUlQ1NjYzX0lMX0NNRF84CQkJCTB4MDBlMgorI2RlZmluZSBSVDU2NjNfSUxfQ01EX1BXUlNBVjEJCQkweDAwZTQKKyNkZWZpbmUgUlQ1NjYzX0lMX0NNRF9QV1JTQVYyCQkJMHgwMGU1CisjZGVmaW5lIFJUNTY2M19FTV9KQUNLX1RZUEVfMQkJCTB4MDBlNgorI2RlZmluZSBSVDU2NjNfRU1fSkFDS19UWVBFXzIJCQkweDAwZTcKKyNkZWZpbmUgUlQ1NjYzX0VNX0pBQ0tfVFlQRV8zCQkJMHgwMGU4CisjZGVmaW5lIFJUNTY2M19FTV9KQUNLX1RZUEVfNAkJCTB4MDBlOQorI2RlZmluZSBSVDU2NjNfRU1fSkFDS19UWVBFXzUJCQkweDAwZWEKKyNkZWZpbmUgUlQ1NjYzX0VNX0pBQ0tfVFlQRV82CQkJMHgwMGViCisjZGVmaW5lIFJUNTY2M19TVE8xX0hQRl9BREoxCQkJMHgwMGVjCisjZGVmaW5lIFJUNTY2M19TVE8xX0hQRl9BREoyCQkJMHgwMGVkCisjZGVmaW5lIFJUNTY2M19GQVNUX09GRl9NSUNCSUFTCQkJMHgwMGY0CisjZGVmaW5lIFJUNTY2M19KRF9DVFJMMQkJCQkweDAwZjYKKyNkZWZpbmUgUlQ1NjYzX0pEX0NUUkwyCQkJCTB4MDBmOAorI2RlZmluZSBSVDU2NjNfRElHX01JU0MJCQkJMHgwMGZhCisjZGVmaW5lIFJUNTY2M19ESUdfVk9MX1pDRAkJCTB4MDEwMAorI2RlZmluZSBSVDU2NjNfQU5BX0JJQVNfQ1VSXzEJCQkweDAxMDgKKyNkZWZpbmUgUlQ1NjYzX0FOQV9CSUFTX0NVUl8yCQkJMHgwMTA5CisjZGVmaW5lIFJUNTY2M19BTkFfQklBU19DVVJfMwkJCTB4MDEwYQorI2RlZmluZSBSVDU2NjNfQU5BX0JJQVNfQ1VSXzQJCQkweDAxMGIKKyNkZWZpbmUgUlQ1NjYzX0FOQV9CSUFTX0NVUl81CQkJMHgwMTBjCisjZGVmaW5lIFJUNTY2M19BTkFfQklBU19DVVJfNgkJCTB4MDEwZAorI2RlZmluZSBSVDU2NjNfQklBU19DVVJfNQkJCTB4MDEwZQorI2RlZmluZSBSVDU2NjNfQklBU19DVVJfNgkJCTB4MDEwZgorI2RlZmluZSBSVDU2NjNfQklBU19DVVJfNwkJCTB4MDExMAorI2RlZmluZSBSVDU2NjNfQklBU19DVVJfOAkJCTB4MDExMQorI2RlZmluZSBSVDU2NjNfREFDUkVGX0xETwkJCTB4MDExMgorI2RlZmluZSBSVDU2NjNfRFVNTVlfUkVHXzMJCQkweDAxMTMKKyNkZWZpbmUgUlQ1NjYzX0JJQVNfQ1VSXzkJCQkweDAxMTQKKyNkZWZpbmUgUlQ1NjYzX0RVTU1ZX1JFR180CQkJMHgwMTE2CisjZGVmaW5lIFJUNTY2M19WUkVGQURKX09QCQkJMHgwMTE3CisjZGVmaW5lIFJUNTY2M19WUkVGX1JFQ01JWAkJCTB4MDExOAorI2RlZmluZSBSVDU2NjNfQ0hBUkdFX1BVTVBfMQkJCTB4MDEyNQorI2RlZmluZSBSVDU2NjNfQ0hBUkdFX1BVTVBfMV8yCQkJMHgwMTI2CisjZGVmaW5lIFJUNTY2M19DSEFSR0VfUFVNUF8xXzMJCQkweDAxMjcKKyNkZWZpbmUgUlQ1NjYzX0NIQVJHRV9QVU1QXzIJCQkweDAxMjgKKyNkZWZpbmUgUlQ1NjYzX0RJR19JTl9QSU4xCQkJMHgwMTMyCisjZGVmaW5lIFJUNTY2M19QQURfRFJWX0NUTAkJCTB4MDEzNworI2RlZmluZSBSVDU2NjNfUExMX0lOVF9SRUcJCQkweDAxMzkKKyNkZWZpbmUgUlQ1NjYzX0NIT1BfREFDX0wJCQkweDAxM2EKKyNkZWZpbmUgUlQ1NjYzX0NIT1BfQURDCQkJCTB4MDEzYgorI2RlZmluZSBSVDU2NjNfQ0FMSUJfQURDCQkJMHgwMTNjCisjZGVmaW5lIFJUNTY2M19DSE9QX0RBQ19SCQkJMHgwMTNkCisjZGVmaW5lIFJUNTY2M19EVU1NWV9DVExfREFDTFIJCQkweDAxM2UKKyNkZWZpbmUgUlQ1NjYzX0RVTU1ZX1JFR181CQkJMHgwMTQwCisjZGVmaW5lIFJUNTY2M19TT0ZUX1JBTVAJCQkweDAxNDEKKyNkZWZpbmUgUlQ1NjYzX1RFU1RfTU9ERV8xCQkJMHgwMTQ0CisjZGVmaW5lIFJUNTY2M19URVNUX01PREVfMgkJCTB4MDE0NQorI2RlZmluZSBSVDU2NjNfVEVTVF9NT0RFXzMJCQkweDAxNDYKKyNkZWZpbmUgUlQ1NjYzX1NUT19EUkVfMQkJCTB4MDE2MAorI2RlZmluZSBSVDU2NjNfU1RPX0RSRV8yCQkJMHgwMTYxCisjZGVmaW5lIFJUNTY2M19TVE9fRFJFXzMJCQkweDAxNjIKKyNkZWZpbmUgUlQ1NjYzX1NUT19EUkVfNAkJCTB4MDE2MworI2RlZmluZSBSVDU2NjNfU1RPX0RSRV81CQkJMHgwMTY0CisjZGVmaW5lIFJUNTY2M19TVE9fRFJFXzYJCQkweDAxNjUKKyNkZWZpbmUgUlQ1NjYzX1NUT19EUkVfNwkJCTB4MDE2NgorI2RlZmluZSBSVDU2NjNfU1RPX0RSRV84CQkJMHgwMTY3CisjZGVmaW5lIFJUNTY2M19TVE9fRFJFXzkJCQkweDAxNjgKKyNkZWZpbmUgUlQ1NjYzX1NUT19EUkVfMTAJCQkweDAxNjkKKyNkZWZpbmUgUlQ1NjYzX01JQ19ERUNST18xCQkJMHgwMTgwCisjZGVmaW5lIFJUNTY2M19NSUNfREVDUk9fMgkJCTB4MDE4MQorI2RlZmluZSBSVDU2NjNfTUlDX0RFQ1JPXzMJCQkweDAxODIKKyNkZWZpbmUgUlQ1NjYzX01JQ19ERUNST180CQkJMHgwMTgzCisjZGVmaW5lIFJUNTY2M19NSUNfREVDUk9fNQkJCTB4MDE4NAorI2RlZmluZSBSVDU2NjNfTUlDX0RFQ1JPXzYJCQkweDAxODUKKyNkZWZpbmUgUlQ1NjYzX0hQX0RFQ1JPXzEJCQkweDAxYjAKKyNkZWZpbmUgUlQ1NjYzX0hQX0RFQ1JPXzIJCQkweDAxYjEKKyNkZWZpbmUgUlQ1NjYzX0hQX0RFQ1JPXzMJCQkweDAxYjIKKyNkZWZpbmUgUlQ1NjYzX0hQX0RFQ1JPXzQJCQkweDAxYjMKKyNkZWZpbmUgUlQ1NjYzX0hQX0RFQ09VUAkJCTB4MDFiNAorI2RlZmluZSBSVDU2NjNfSFBfSU1QX1NFTl9NQVA4CQkJMHgwMWI1CisjZGVmaW5lIFJUNTY2M19IUF9JTVBfU0VOX01BUDkJCQkweDAxYjYKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUF9TRU5fTUFQMTAJCQkweDAxYjcKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUF9TRU5fTUFQMTEJCQkweDAxYjgKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUF9TRU5fMQkJCTB4MDFjMAorI2RlZmluZSBSVDU2NjNfSFBfSU1QX1NFTl8yCQkJMHgwMWMxCisjZGVmaW5lIFJUNTY2M19IUF9JTVBfU0VOXzMJCQkweDAxYzIKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUF9TRU5fNAkJCTB4MDFjMworI2RlZmluZSBSVDU2NjNfSFBfSU1QX1NFTl81CQkJMHgwMWM0CisjZGVmaW5lIFJUNTY2M19IUF9JTVBfU0VOXzYJCQkweDAxYzUKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUF9TRU5fNwkJCTB4MDFjNgorI2RlZmluZSBSVDU2NjNfSFBfSU1QX1NFTl84CQkJMHgwMWM3CisjZGVmaW5lIFJUNTY2M19IUF9JTVBfU0VOXzkJCQkweDAxYzgKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUF9TRU5fMTAJCQkweDAxYzkKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUF9TRU5fMTEJCQkweDAxY2EKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUF9TRU5fMTIJCQkweDAxY2IKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUF9TRU5fMTMJCQkweDAxY2MKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUF9TRU5fMTQJCQkweDAxY2QKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUF9TRU5fMTUJCQkweDAxY2UKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUF9TRU5fMTYJCQkweDAxY2YKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUF9TRU5fMTcJCQkweDAxZDAKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUF9TRU5fMTgJCQkweDAxZDEKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUF9TRU5fMTkJCQkweDAxZDIKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUFNFTl9ESUc1CQkJMHgwMWQzCisjZGVmaW5lIFJUNTY2M19IUF9JTVBTRU5fTUFQMQkJCTB4MDFkNAorI2RlZmluZSBSVDU2NjNfSFBfSU1QU0VOX01BUDIJCQkweDAxZDUKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUFNFTl9NQVAzCQkJMHgwMWQ2CisjZGVmaW5lIFJUNTY2M19IUF9JTVBTRU5fTUFQNAkJCTB4MDFkNworI2RlZmluZSBSVDU2NjNfSFBfSU1QU0VOX01BUDUJCQkweDAxZDgKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUFNFTl9NQVA3CQkJMHgwMWQ5CisjZGVmaW5lIFJUNTY2M19IUF9MT0dJQ18xCQkJMHgwMWRhCisjZGVmaW5lIFJUNTY2M19IUF9MT0dJQ18yCQkJMHgwMWRiCisjZGVmaW5lIFJUNTY2M19IUF9DQUxJQl8xCQkJMHgwMWRkCisjZGVmaW5lIFJUNTY2M19IUF9DQUxJQl8xXzEJCQkweDAxZGUKKyNkZWZpbmUgUlQ1NjYzX0hQX0NBTElCXzIJCQkweDAxZGYKKyNkZWZpbmUgUlQ1NjYzX0hQX0NBTElCXzMJCQkweDAxZTAKKyNkZWZpbmUgUlQ1NjYzX0hQX0NBTElCXzQJCQkweDAxZTEKKyNkZWZpbmUgUlQ1NjYzX0hQX0NBTElCXzUJCQkweDAxZTIKKyNkZWZpbmUgUlQ1NjYzX0hQX0NBTElCXzVfMQkJCTB4MDFlMworI2RlZmluZSBSVDU2NjNfSFBfQ0FMSUJfNgkJCTB4MDFlNAorI2RlZmluZSBSVDU2NjNfSFBfQ0FMSUJfNwkJCTB4MDFlNQorI2RlZmluZSBSVDU2NjNfSFBfQ0FMSUJfOQkJCTB4MDFlNgorI2RlZmluZSBSVDU2NjNfSFBfQ0FMSUJfMTAJCQkweDAxZTcKKyNkZWZpbmUgUlQ1NjYzX0hQX0NBTElCXzExCQkJMHgwMWU4CisjZGVmaW5lIFJUNTY2M19IUF9DQUxJQl9TVDEJCQkweDAxZWEKKyNkZWZpbmUgUlQ1NjYzX0hQX0NBTElCX1NUMgkJCTB4MDFlYgorI2RlZmluZSBSVDU2NjNfSFBfQ0FMSUJfU1QzCQkJMHgwMWVjCisjZGVmaW5lIFJUNTY2M19IUF9DQUxJQl9TVDQJCQkweDAxZWQKKyNkZWZpbmUgUlQ1NjYzX0hQX0NBTElCX1NUNQkJCTB4MDFlZQorI2RlZmluZSBSVDU2NjNfSFBfQ0FMSUJfU1Q2CQkJMHgwMWVmCisjZGVmaW5lIFJUNTY2M19IUF9DQUxJQl9TVDcJCQkweDAxZjAKKyNkZWZpbmUgUlQ1NjYzX0hQX0NBTElCX1NUOAkJCTB4MDFmMQorI2RlZmluZSBSVDU2NjNfSFBfQ0FMSUJfU1Q5CQkJMHgwMWYyCisjZGVmaW5lIFJUNTY2M19IUF9BTVBfREVUCQkJMHgwMjAwCisjZGVmaW5lIFJUNTY2M19EVU1NWV9SRUdfNgkJCTB4MDIwMQorI2RlZmluZSBSVDU2NjNfSFBfQklBUwkJCQkweDAyMDIKKyNkZWZpbmUgUlQ1NjYzX0NCSl8xCQkJCTB4MDI1MAorI2RlZmluZSBSVDU2NjNfQ0JKXzIJCQkJMHgwMjUxCisjZGVmaW5lIFJUNTY2M19DQkpfMwkJCQkweDAyNTIKKyNkZWZpbmUgUlQ1NjYzX0RVTU1ZXzEJCQkJMHgwMmZhCisjZGVmaW5lIFJUNTY2M19EVU1NWV8yCQkJCTB4MDJmYgorI2RlZmluZSBSVDU2NjNfRFVNTVlfMwkJCQkweDAyZmMKKyNkZWZpbmUgUlQ1NjYzX0FOQV9KRAkJCQkweDAzMDAKKyNkZWZpbmUgUlQ1NjYzX0FEQ19MQ0hfTFBGMV9BMQkJCTB4MDNkMAorI2RlZmluZSBSVDU2NjNfQURDX1JDSF9MUEYxX0ExCQkJMHgwM2QxCisjZGVmaW5lIFJUNTY2M19BRENfTENIX0xQRjFfSDAJCQkweDAzZDIKKyNkZWZpbmUgUlQ1NjYzX0FEQ19SQ0hfTFBGMV9IMAkJCTB4MDNkMworI2RlZmluZSBSVDU2NjNfQURDX0xDSF9CUEYxX0ExCQkJMHgwM2Q0CisjZGVmaW5lIFJUNTY2M19BRENfUkNIX0JQRjFfQTEJCQkweDAzZDUKKyNkZWZpbmUgUlQ1NjYzX0FEQ19MQ0hfQlBGMV9BMgkJCTB4MDNkNgorI2RlZmluZSBSVDU2NjNfQURDX1JDSF9CUEYxX0EyCQkJMHgwM2Q3CisjZGVmaW5lIFJUNTY2M19BRENfTENIX0JQRjFfSDAJCQkweDAzZDgKKyNkZWZpbmUgUlQ1NjYzX0FEQ19SQ0hfQlBGMV9IMAkJCTB4MDNkOQorI2RlZmluZSBSVDU2NjNfQURDX0xDSF9CUEYyX0ExCQkJMHgwM2RhCisjZGVmaW5lIFJUNTY2M19BRENfUkNIX0JQRjJfQTEJCQkweDAzZGIKKyNkZWZpbmUgUlQ1NjYzX0FEQ19MQ0hfQlBGMl9BMgkJCTB4MDNkYworI2RlZmluZSBSVDU2NjNfQURDX1JDSF9CUEYyX0EyCQkJMHgwM2RkCisjZGVmaW5lIFJUNTY2M19BRENfTENIX0JQRjJfSDAJCQkweDAzZGUKKyNkZWZpbmUgUlQ1NjYzX0FEQ19SQ0hfQlBGMl9IMAkJCTB4MDNkZgorI2RlZmluZSBSVDU2NjNfQURDX0xDSF9CUEYzX0ExCQkJMHgwM2UwCisjZGVmaW5lIFJUNTY2M19BRENfUkNIX0JQRjNfQTEJCQkweDAzZTEKKyNkZWZpbmUgUlQ1NjYzX0FEQ19MQ0hfQlBGM19BMgkJCTB4MDNlMgorI2RlZmluZSBSVDU2NjNfQURDX1JDSF9CUEYzX0EyCQkJMHgwM2UzCisjZGVmaW5lIFJUNTY2M19BRENfTENIX0JQRjNfSDAJCQkweDAzZTQKKyNkZWZpbmUgUlQ1NjYzX0FEQ19SQ0hfQlBGM19IMAkJCTB4MDNlNQorI2RlZmluZSBSVDU2NjNfQURDX0xDSF9CUEY0X0ExCQkJMHgwM2U2CisjZGVmaW5lIFJUNTY2M19BRENfUkNIX0JQRjRfQTEJCQkweDAzZTcKKyNkZWZpbmUgUlQ1NjYzX0FEQ19MQ0hfQlBGNF9BMgkJCTB4MDNlOAorI2RlZmluZSBSVDU2NjNfQURDX1JDSF9CUEY0X0EyCQkJMHgwM2U5CisjZGVmaW5lIFJUNTY2M19BRENfTENIX0JQRjRfSDAJCQkweDAzZWEKKyNkZWZpbmUgUlQ1NjYzX0FEQ19SQ0hfQlBGNF9IMAkJCTB4MDNlYgorI2RlZmluZSBSVDU2NjNfQURDX0xDSF9IUEYxX0ExCQkJMHgwM2VjCisjZGVmaW5lIFJUNTY2M19BRENfUkNIX0hQRjFfQTEJCQkweDAzZWQKKyNkZWZpbmUgUlQ1NjYzX0FEQ19MQ0hfSFBGMV9IMAkJCTB4MDNlZQorI2RlZmluZSBSVDU2NjNfQURDX1JDSF9IUEYxX0gwCQkJMHgwM2VmCisjZGVmaW5lIFJUNTY2M19BRENfRVFfUFJFX1ZPTF9MCQkJMHgwM2YwCisjZGVmaW5lIFJUNTY2M19BRENfRVFfUFJFX1ZPTF9SCQkJMHgwM2YxCisjZGVmaW5lIFJUNTY2M19BRENfRVFfUE9TVF9WT0xfTAkJMHgwM2YyCisjZGVmaW5lIFJUNTY2M19BRENfRVFfUE9TVF9WT0xfUgkJMHgwM2YzCisKKy8qIFJUNTY2MzogUkVDTUlYIENvbnRyb2wgKDB4MDAxMCkgKi8KKyNkZWZpbmUgUlQ1NjYzX1JFQ01JWDFfQlNUMV9NQVNLCQkoMHgxKQorI2RlZmluZSBSVDU2NjNfUkVDTUlYMV9CU1QxX1NISUZUCQkwCisjZGVmaW5lIFJUNTY2M19SRUNNSVgxX0JTVDFfT04JCQkoMHgwKQorI2RlZmluZSBSVDU2NjNfUkVDTUlYMV9CU1QxX09GRgkJCSgweDEpCisKKy8qIFJUNTY2MzogQnlwYXNzIFN0ZXJlbzEgREFDIE1peGVyIENvbnRyb2wgKDB4MDAyZCkgKi8KKyNkZWZpbmUgUlQ1NjYzX0RBQ0wxX1NSQ19NQVNLCQkJKDB4MSA8PCAzKQorI2RlZmluZSBSVDU2NjNfREFDTDFfU1JDX1NISUZUCQkJMworI2RlZmluZSBSVDU2NjNfREFDUjFfU1JDX01BU0sJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTY2M19EQUNSMV9TUkNfU0hJRlQJCQkyCisKKy8qIFJUNTY2MzogVERNIGNvbnRyb2wgMiAoMHgwMDc4KSAqLworI2RlZmluZSBSVDU2NjNfREFUQV9TV0FQX0FEQ0RBVDFfTUFTSwkJKDB4MyA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYzX0RBVEFfU1dBUF9BRENEQVQxX1NISUZUCQkxNAorI2RlZmluZSBSVDU2NjNfREFUQV9TV0FQX0FEQ0RBVDFfTFIJCSgweDAgPDwgMTQpCisjZGVmaW5lIFJUNTY2M19EQVRBX1NXQVBfQURDREFUMV9STAkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYzX0RBVEFfU1dBUF9BRENEQVQxX0xMCQkoMHgyIDw8IDE0KQorI2RlZmluZSBSVDU2NjNfREFUQV9TV0FQX0FEQ0RBVDFfUlIJCSgweDMgPDwgMTQpCisKKy8qIFJUNTY2MzogVERNIGNvbnRyb2wgNSAoMHgwMDdiKSAqLworI2RlZmluZSBSVDU2NjNfVERNX0xFTkdUTl9NQVNLCQkJKDB4MykKKyNkZWZpbmUgUlQ1NjYzX1RETV9MRU5HVE5fU0hJRlQJCQkwCisjZGVmaW5lIFJUNTY2M19URE1fTEVOR1ROXzE2CQkJKDB4MCkKKyNkZWZpbmUgUlQ1NjYzX1RETV9MRU5HVE5fMjAJCQkoMHgxKQorI2RlZmluZSBSVDU2NjNfVERNX0xFTkdUTl8yNAkJCSgweDIpCisjZGVmaW5lIFJUNTY2M19URE1fTEVOR1ROXzMyCQkJKDB4MykKKworLyogUlQ1NjYzOiBHbG9iYWwgQ2xvY2sgQ29udHJvbCAoMHgwMDgwKSAqLworI2RlZmluZSBSVDU2NjNfU0NMS19TUkNfTUFTSwkJCSgweDMgPDwgMTQpCisjZGVmaW5lIFJUNTY2M19TQ0xLX1NSQ19TSElGVAkJCTE0CisjZGVmaW5lIFJUNTY2M19TQ0xLX1NSQ19NQ0xLCQkJKDB4MCA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYzX1NDTEtfU1JDX1BMTDEJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjNfU0NMS19TUkNfUkNDTEsJCQkoMHgyIDw8IDE0KQorI2RlZmluZSBSVDU2NjNfUExMMV9TUkNfTUFTSwkJCSgweDcgPDwgMTEpCisjZGVmaW5lIFJUNTY2M19QTEwxX1NSQ19TSElGVAkJCTExCisjZGVmaW5lIFJUNTY2M19QTEwxX1NSQ19NQ0xLCQkJKDB4MCA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYzX1BMTDFfU1JDX0JDTEsxCQkJKDB4MSA8PCAxMSkKKworLyogUExMIHRyYWNraW5nIG1vZGUgMSAoMHgwMDgzKSAqLworI2RlZmluZSBSVDU2NjNfSTJTMV9BU1JDX01BU0sJCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjNfSTJTMV9BU1JDX1NISUZUCQkJMTEKKyNkZWZpbmUgUlQ1NjYzX0RBQ19TVE8xX0FTUkNfTUFTSwkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYzX0RBQ19TVE8xX0FTUkNfU0hJRlQJCTEwCisjZGVmaW5lIFJUNTY2M19BRENfU1RPMV9BU1JDX01BU0sJCSgweDEgPDwgMykKKyNkZWZpbmUgUlQ1NjYzX0FEQ19TVE8xX0FTUkNfU0hJRlQJCTMKKworLyogUExMIHRyYWNraW5nIG1vZGUgMiAoMHgwMDg0KSovCisjZGVmaW5lIFJUNTY2M19EQV9TVE8xX1RSQUNLX01BU0sJCSgweDcgPDwgMTIpCisjZGVmaW5lIFJUNTY2M19EQV9TVE8xX1RSQUNLX1NISUZUCQkxMgorI2RlZmluZSBSVDU2NjNfREFfU1RPMV9UUkFDS19TWVNDTEsJCSgweDAgPDwgMTIpCisjZGVmaW5lIFJUNTY2M19EQV9TVE8xX1RSQUNLX0kyUzEJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTY2M19BRF9TVE8xX1RSQUNLX01BU0sJCSgweDcpCisjZGVmaW5lIFJUNTY2M19BRF9TVE8xX1RSQUNLX1NISUZUCQkwCisjZGVmaW5lIFJUNTY2M19BRF9TVE8xX1RSQUNLX1NZU0NMSwkJKDB4MCkKKyNkZWZpbmUgUlQ1NjYzX0FEX1NUTzFfVFJBQ0tfSTJTMQkJKDB4MSkKKworLyogUlQ1NjYzOiBIUE9VVCBDaGFyZ2UgcHVtcCBjb250cm9sIDEgKDB4MDA5MSkgKi8KKyNkZWZpbmUgUlQ1NjYzX1NJX0hQX01BU0sJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2NjNfU0lfSFBfU0hJRlQJCQkxMgorI2RlZmluZSBSVDU2NjNfU0lfSFBfRU4JCQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgUlQ1NjYzX1NJX0hQX0RJUwkJCSgweDAgPDwgMTIpCisKKy8qIFJUNTY2MzogR1BJTyBDb250cm9sIDIgKDB4MDBiNikgKi8KKyNkZWZpbmUgUlQ1NjYzX0dQMV9QSU5fQ09ORl9NQVNLCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTY2M19HUDFfUElOX0NPTkZfU0hJRlQJCTIKKyNkZWZpbmUgUlQ1NjYzX0dQMV9QSU5fQ09ORl9PVVRQVVQJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjYzX0dQMV9QSU5fQ09ORl9JTlBVVAkJKDB4MCA8PCAyKQorCisvKiBSVDU2NjM6IEdQSU8gQ29udHJvbCAyICgweDAwYjcpICovCisjZGVmaW5lIFJUNTY2M19FTl9JUlFfSU5MSU5FX01BU0sJCSgweDEgPDwgMykKKyNkZWZpbmUgUlQ1NjYzX0VOX0lSUV9JTkxJTkVfU0hJRlQJCTMKKyNkZWZpbmUgUlQ1NjYzX0VOX0lSUV9JTkxJTkVfTk9SCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTY2M19FTl9JUlFfSU5MSU5FX0JZUAkJKDB4MCA8PCAzKQorCisvKiBSVDU2NjM6IElSUSBDb250cm9sIDEgKDB4MDBjMSkgKi8KKyNkZWZpbmUgUlQ1NjYzX0VOX0lSUV9KRDFfTUFTSwkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjYzX0VOX0lSUV9KRDFfU0hJRlQJCQk2CisjZGVmaW5lIFJUNTY2M19FTl9JUlFfSkQxX0VOCQkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2NjNfRU5fSVJRX0pEMV9ESVMJCQkoMHgwIDw8IDYpCisKKy8qIFJUNTY2MzogSW5saW5lIENvbW1hbmQgRnVuY3Rpb24gMiAoMHgwMGRjKSAqLworI2RlZmluZSBSVDU2NjNfUFdSX01JQ19ERVRfTUFTSwkJCSgweDEpCisjZGVmaW5lIFJUNTY2M19QV1JfTUlDX0RFVF9TSElGVAkJMAorI2RlZmluZSBSVDU2NjNfUFdSX01JQ19ERVRfT04JCQkoMHgxKQorI2RlZmluZSBSVDU2NjNfUFdSX01JQ19ERVRfT0ZGCQkJKDB4MCkKKworLyogUlQ1NjYzOiBFbWJlZWRlZCBKYWNrIGFuZCBUeXBlIERldGVjdGlvbiBDb250cm9sIDEgKDB4MDBlNikqLworI2RlZmluZSBSVDU2NjNfQ0JKX0RFVF9NQVNLCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYzX0NCSl9ERVRfU0hJRlQJCQkxNQorI2RlZmluZSBSVDU2NjNfQ0JKX0RFVF9ESVMJCQkoMHgwIDw8IDE1KQorI2RlZmluZSBSVDU2NjNfQ0JKX0RFVF9FTgkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2M19FWFRfSkRfTUFTSwkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2M19FWFRfSkRfU0hJRlQJCQkxMQorI2RlZmluZSBSVDU2NjNfRVhUX0pEX0VOCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYzX0VYVF9KRF9ESVMJCQkoMHgwIDw8IDExKQorI2RlZmluZSBSVDU2NjNfUE9MX0VYVF9KRF9NQVNLCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYzX1BPTF9FWFRfSkRfU0hJRlQJCQkxMAorI2RlZmluZSBSVDU2NjNfUE9MX0VYVF9KRF9FTgkJCSgweDEgPDwgMTApCisjZGVmaW5lIFJUNTY2M19QT0xfRVhUX0pEX0RJUwkJCSgweDAgPDwgMTApCisKKy8qIFJUNTY2MzogREFDUkVGIExETyBDb250cm9sICgweDAxMTIpKi8KKyNkZWZpbmUgUlQ1NjYzX1BXUl9MRE9fREFDUkVGTF9NQVNLCQkoMHgxIDw8IDkpCisjZGVmaW5lIFJUNTY2M19QV1JfTERPX0RBQ1JFRkxfU0hJRlQJCTkKKyNkZWZpbmUgUlQ1NjYzX1BXUl9MRE9fREFDUkVGUl9NQVNLCQkoMHgxIDw8IDEpCisjZGVmaW5lIFJUNTY2M19QV1JfTERPX0RBQ1JFRlJfU0hJRlQJCTEKKworLyogUlQ1NjYzOiBTdGVyZW8gRHluYW1pYyBSYW5nZSBFbmhhbmNlbWVudCBDb250cm9sIDkgKDB4MDE2OCwgMHgwMTY5KSovCisjZGVmaW5lIFJUNTY2M19EUkVfR0FJTl9IUF9NQVNLCQkJKDB4MWYpCisjZGVmaW5lIFJUNTY2M19EUkVfR0FJTl9IUF9TSElGVAkJMAorCisvKiBSVDU2NjM6IENvbWJvIEphY2sgQ29udHJvbCAoMHgwMjUwKSAqLworI2RlZmluZSBSVDU2NjNfSU5CVUZfQ0JKX0JTVDFfTUFTSwkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYzX0lOQlVGX0NCSl9CU1QxX1NISUZUCQkxMQorI2RlZmluZSBSVDU2NjNfSU5CVUZfQ0JKX0JTVDFfT04JCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2M19JTkJVRl9DQkpfQlNUMV9PRkYJCSgweDAgPDwgMTEpCisjZGVmaW5lIFJUNTY2M19DQkpfU0VOU0VfQlNUMV9NQVNLCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2NjNfQ0JKX1NFTlNFX0JTVDFfU0hJRlQJCTEwCisjZGVmaW5lIFJUNTY2M19DQkpfU0VOU0VfQlNUMV9MCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYzX0NCSl9TRU5TRV9CU1QxX1IJCQkoMHgwIDw8IDEwKQorCisvKiBSVDU2NjM6IENvbWJvIEphY2sgQ29udHJvbCAoMHgwMjUxKSAqLworI2RlZmluZSBSVDU2NjNfR0FJTl9CU1QxX01BU0sJCQkoMHhmKQorI2RlZmluZSBSVDU2NjNfR0FJTl9CU1QxX1NISUZUCQkJMAorCisvKiBSVDU2NjM6IER1bW15IHJlZ2lzdGVyIDEgKDB4MDJmYSkgKi8KKyNkZWZpbmUgUlQ1NjYzX0VNQl9DTEtfTUFTSwkJCSgweDEgPDwgOSkKKyNkZWZpbmUgUlQ1NjYzX0VNQl9DTEtfU0hJRlQJCQk5CisjZGVmaW5lIFJUNTY2M19FTUJfQ0xLX0VOCQkJKDB4MSA8PCA5KQorI2RlZmluZSBSVDU2NjNfRU1CX0NMS19ESVMJCQkoMHgwIDw8IDkpCisjZGVmaW5lIFJUNTY2M19IUEFfQ1BMX0JJQVNfTUFTSwkJKDB4NyA8PCA2KQorI2RlZmluZSBSVDU2NjNfSFBBX0NQTF9CSUFTX1NISUZUCQk2CisjZGVmaW5lIFJUNTY2M19IUEFfQ1BMX0JJQVNfMF81CQkJKDB4MCA8PCA2KQorI2RlZmluZSBSVDU2NjNfSFBBX0NQTF9CSUFTXzEJCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTY2M19IUEFfQ1BMX0JJQVNfMgkJCSgweDIgPDwgNikKKyNkZWZpbmUgUlQ1NjYzX0hQQV9DUExfQklBU18zCQkJKDB4MyA8PCA2KQorI2RlZmluZSBSVDU2NjNfSFBBX0NQTF9CSUFTXzRfMQkJCSgweDQgPDwgNikKKyNkZWZpbmUgUlQ1NjYzX0hQQV9DUExfQklBU180XzIJCQkoMHg1IDw8IDYpCisjZGVmaW5lIFJUNTY2M19IUEFfQ1BMX0JJQVNfNgkJCSgweDYgPDwgNikKKyNkZWZpbmUgUlQ1NjYzX0hQQV9DUExfQklBU184CQkJKDB4NyA8PCA2KQorI2RlZmluZSBSVDU2NjNfSFBBX0NQUl9CSUFTX01BU0sJCSgweDcgPDwgMykKKyNkZWZpbmUgUlQ1NjYzX0hQQV9DUFJfQklBU19TSElGVAkJMworI2RlZmluZSBSVDU2NjNfSFBBX0NQUl9CSUFTXzBfNQkJCSgweDAgPDwgMykKKyNkZWZpbmUgUlQ1NjYzX0hQQV9DUFJfQklBU18xCQkJKDB4MSA8PCAzKQorI2RlZmluZSBSVDU2NjNfSFBBX0NQUl9CSUFTXzIJCQkoMHgyIDw8IDMpCisjZGVmaW5lIFJUNTY2M19IUEFfQ1BSX0JJQVNfMwkJCSgweDMgPDwgMykKKyNkZWZpbmUgUlQ1NjYzX0hQQV9DUFJfQklBU180XzEJCQkoMHg0IDw8IDMpCisjZGVmaW5lIFJUNTY2M19IUEFfQ1BSX0JJQVNfNF8yCQkJKDB4NSA8PCAzKQorI2RlZmluZSBSVDU2NjNfSFBBX0NQUl9CSUFTXzYJCQkoMHg2IDw8IDMpCisjZGVmaW5lIFJUNTY2M19IUEFfQ1BSX0JJQVNfOAkJCSgweDcgPDwgMykKKyNkZWZpbmUgUlQ1NjYzX0RVTU1ZX0JJQVNfTUFTSwkJCSgweDcpCisjZGVmaW5lIFJUNTY2M19EVU1NWV9CSUFTX1NISUZUCQkJMAorI2RlZmluZSBSVDU2NjNfRFVNTVlfQklBU18wXzUJCQkoMHgwKQorI2RlZmluZSBSVDU2NjNfRFVNTVlfQklBU18xCQkJKDB4MSkKKyNkZWZpbmUgUlQ1NjYzX0RVTU1ZX0JJQVNfMgkJCSgweDIpCisjZGVmaW5lIFJUNTY2M19EVU1NWV9CSUFTXzMJCQkoMHgzKQorI2RlZmluZSBSVDU2NjNfRFVNTVlfQklBU180XzEJCQkoMHg0KQorI2RlZmluZSBSVDU2NjNfRFVNTVlfQklBU180XzIJCQkoMHg1KQorI2RlZmluZSBSVDU2NjNfRFVNTVlfQklBU182CQkJKDB4NikKKyNkZWZpbmUgUlQ1NjYzX0RVTU1ZX0JJQVNfOAkJCSgweDcpCisKKworLyogU3lzdGVtIENsb2NrIFNvdXJjZSAqLworZW51bSB7CisJUlQ1NjYzX1NDTEtfU19NQ0xLLAorCVJUNTY2M19TQ0xLX1NfUExMMSwKKwlSVDU2NjNfU0NMS19TX1JDQ0xLLAorfTsKKworLyogUExMMSBTb3VyY2UgKi8KK2VudW0geworCVJUNTY2M19QTEwxX1NfTUNMSywKKwlSVDU2NjNfUExMMV9TX0JDTEsxLAorfTsKKworZW51bSB7CisJUlQ1NjYzX0FJRiwKKwlSVDU2NjNfQUlGUywKK307CisKKy8qIGFzcmMgY2xvY2sgc291cmNlICovCitlbnVtIHsKKwlSVDU2NjNfQ0xLX1NFTF9TWVMgPSAweDAsCisJUlQ1NjYzX0NMS19TRUxfSTJTMV9BU1JDID0gMHgxLAorfTsKKworLyogZmlsdGVyIG1hc2sgKi8KK2VudW0geworCVJUNTY2M19EQV9TVEVSRU9fRklMVEVSID0gMHgxLAorCVJUNTY2M19BRF9TVEVSRU9fRklMVEVSID0gMHgyLAorfTsKKworaW50IHJ0NTY2M19zZXRfamFja19kZXRlY3Qoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCXN0cnVjdCBzbmRfc29jX2phY2sgKmhzX2phY2spOworaW50IHJ0NTY2M19zZWxfYXNyY19jbGtfc3JjKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwl1bnNpZ25lZCBpbnQgZmlsdGVyX21hc2ssIHVuc2lnbmVkIGludCBjbGtfc3JjKTsKKworI2VuZGlmIC8qIF9fUlQ1NjYzX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDU2NzAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjcwLmMKaW5kZXggOGVmNDY3Zi4uNDljYWYxMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9ydDU2NzAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY3MC5jCkBAIC0yNzc3LDEyICsyNzc3LDE0IEBACiAJLnJlc3VtZSA9IHJ0NTY3MF9yZXN1bWUsCiAJLnNldF9iaWFzX2xldmVsID0gcnQ1NjcwX3NldF9iaWFzX2xldmVsLAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKLQkuY29udHJvbHMgPSBydDU2NzBfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHJ0NTY3MF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBydDU2NzBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShydDU2NzBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBydDU2NzBfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUocnQ1NjcwX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHJ0NTY3MF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShydDU2NzBfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBydDU2NzBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUocnQ1NjcwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBydDU2NzBfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHJ0NTY3MF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBydDU2NzBfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDU2NzcuYyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1Njc3LmMKaW5kZXggZGE5NDgzYy4uYWJjODAyYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9ydDU2NzcuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY3Ny5jCkBAIC05LDYgKzksNyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CkBAIC00MCw2ICs0MSwxNSBAQAogCiAjZGVmaW5lIFJUNTY3N19QUl9CQVNFIChSVDU2NzdfUFJfUkFOR0VfQkFTRSArICgwICogUlQ1Njc3X1BSX1NQQUNJTkcpKQogCisvKiBHUElPIGluZGV4ZXMgZGVmaW5lZCBieSBBQ1BJICovCitlbnVtIHsKKwlSVDU2NzdfR1BJT19QTFVHX0RFVAkJPSAwLAorCVJUNTY3N19HUElPX01JQ19QUkVTRU5UX0wJPSAxLAorCVJUNTY3N19HUElPX0hPVFdPUkRfREVUX0wJPSAyLAorCVJUNTY3N19HUElPX0RTUF9JTlQJCT0gMywKKwlSVDU2NzdfR1BJT19IUF9BTVBfU0hETl9MCT0gNCwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX3JhbmdlX2NmZyBydDU2NzdfcmFuZ2VzW10gPSB7CiAJewogCQkubmFtZSA9ICJQUiIsCkBAIC00NjU3LDcgKzQ2NjcsNyBAQAogCXJldHVybiByZWdtYXBfaXJxX2dldF92aXJxKGRhdGEsIGlycSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHJ0NTY3N190ZW1wbGF0ZV9jaGlwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2NoaXAgcnQ1Njc3X3RlbXBsYXRlX2NoaXAgPSB7CiAJLmxhYmVsCQkJPSAicnQ1Njc3IiwKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5kaXJlY3Rpb25fb3V0cHV0CT0gcnQ1Njc3X2dwaW9fZGlyZWN0aW9uX291dCwKQEAgLTQ5NzQsMTIgKzQ5ODQsMTQgQEAKIAkucmVzdW1lID0gcnQ1Njc3X3Jlc3VtZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSBydDU2Nzdfc2V0X2JpYXNfbGV2ZWwsCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAotCS5jb250cm9scyA9IHJ0NTY3N19zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUocnQ1Njc3X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHJ0NTY3N19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHJ0NTY3N19kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHJ0NTY3N19kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShydDU2NzdfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gcnQ1Njc3X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHJ0NTY3N19zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHJ0NTY3N19kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShydDU2NzdfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHJ0NTY3N19kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUocnQ1Njc3X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHJ0NTY3N19yZWdtYXBfcGh5c2ljYWwgPSB7CkBAIC01MDE4LDEwICs1MDMwLDQ3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgcnQ1Njc3X2kyY19pZFtdID0gewogCXsgInJ0NTY3NyIsIFJUNTY3NyB9LAogCXsgInJ0NTY3NiIsIFJUNTY3NiB9LAorCXsgIlJUNTY3N0NFOjAwIiwgUlQ1Njc3IH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHJ0NTY3N19pMmNfaWQpOwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZ3Bpb19wYXJhbXMgcGx1Z19kZXRfZ3BpbyA9IHsgUlQ1Njc3X0dQSU9fUExVR19ERVQsIDAsIGZhbHNlIH07CitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZ3Bpb19wYXJhbXMgbWljX3ByZXNlbnRfZ3BpbyA9IHsgUlQ1Njc3X0dQSU9fTUlDX1BSRVNFTlRfTCwgMCwgZmFsc2UgfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9ncGlvX3BhcmFtcyBoZWFkcGhvbmVfZW5hYmxlX2dwaW8gPSB7IFJUNTY3N19HUElPX0hQX0FNUF9TSEROX0wsIDAsIGZhbHNlIH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9ncGlvX21hcHBpbmcgYmR3X3J0NTY3N19ncGlvc1tdID0geworCXsgInBsdWctZGV0LWdwaW9zIiwgJnBsdWdfZGV0X2dwaW8sIDEgfSwKKwl7ICJtaWMtcHJlc2VudC1ncGlvcyIsICZtaWNfcHJlc2VudF9ncGlvLCAxIH0sCisJeyAiaGVhZHBob25lLWVuYWJsZS1ncGlvcyIsICZoZWFkcGhvbmVfZW5hYmxlX2dwaW8sIDEgfSwKKwl7IE5VTEwgfSwKK307CisKK3N0YXRpYyB2b2lkIHJ0NTY3N19yZWFkX2FjcGlfcHJvcGVydGllcyhzdHJ1Y3QgcnQ1Njc3X3ByaXYgKnJ0NTY3NywKKwkJc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXQ7CisJdTMyIHZhbDsKKworCXJldCA9IGFjcGlfZGV2X2FkZF9kcml2ZXJfZ3Bpb3MoQUNQSV9DT01QQU5JT04oZGV2KSwKKwkJCWJkd19ydDU2NzdfZ3Bpb3MpOworCWlmIChyZXQpCisJCWRldl93YXJuKGRldiwgIkZhaWxlZCB0byBhZGQgZHJpdmVyIGdwaW9zXG4iKTsKKworCWlmICghZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKGRldiwgIkRDTEsiLCAmdmFsKSkKKwkJcnQ1Njc3LT5wZGF0YS5kbWljMl9jbGtfcGluID0gdmFsOworCisJcnQ1Njc3LT5wZGF0YS5pbjFfZGlmZiA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LCAiSU4xIik7CisJcnQ1Njc3LT5wZGF0YS5pbjJfZGlmZiA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LCAiSU4yIik7CisJcnQ1Njc3LT5wZGF0YS5sb3V0MV9kaWZmID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsICJPVVQxIik7CisJcnQ1Njc3LT5wZGF0YS5sb3V0Ml9kaWZmID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsICJPVVQyIik7CisJcnQ1Njc3LT5wZGF0YS5sb3V0M19kaWZmID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsICJPVVQzIik7CisKKwlkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIoZGV2LCAiSkQxIiwgJnJ0NTY3Ny0+cGRhdGEuamQxX2dwaW8pOworCWRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMihkZXYsICJKRDIiLCAmcnQ1Njc3LT5wZGF0YS5qZDJfZ3Bpbyk7CisJZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKGRldiwgIkpEMyIsICZydDU2NzctPnBkYXRhLmpkM19ncGlvKTsKK30KKwogc3RhdGljIHZvaWQgcnQ1Njc3X3JlYWRfZGV2aWNlX3Byb3BlcnRpZXMoc3RydWN0IHJ0NTY3N19wcml2ICpydDU2NzcsCiAJCXN0cnVjdCBkZXZpY2UgKmRldikKIHsKQEAgLTUxMjcsOCArNTE3NiwxMiBAQAogCiAJaWYgKHBkYXRhKQogCQlydDU2NzctPnBkYXRhID0gKnBkYXRhOwotCWVsc2UKKwllbHNlIGlmIChpMmMtPmRldi5vZl9ub2RlKQogCQlydDU2NzdfcmVhZF9kZXZpY2VfcHJvcGVydGllcyhydDU2NzcsICZpMmMtPmRldik7CisJZWxzZSBpZiAoQUNQSV9IQU5ETEUoJmkyYy0+ZGV2KSkKKwkJcnQ1Njc3X3JlYWRfYWNwaV9wcm9wZXJ0aWVzKHJ0NTY3NywgJmkyYy0+ZGV2KTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOwogCiAJLyogcG93LWxkbzIgYW5kIHJlc2V0IGFyZSBvcHRpb25hbC4gVGhlIGNvZGVjIHBpbnMgbWF5IGJlIHN0YXRpY2FsbHkKIAkgKiBjb25uZWN0ZWQgb24gdGhlIGJvYXJkIHdpdGhvdXQgZ3Bpb3MuIElmIHRoZSBncGlvIGRldmljZSBwcm9wZXJ0eQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zZ3RsNTAwMC5jIGIvc291bmQvc29jL2NvZGVjcy9zZ3RsNTAwMC5jCmluZGV4IDUyN2I3NTkuLjE1ODkzMjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvc2d0bDUwMDAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3NndGw1MDAwLmMKQEAgLTQxMSw2ICs0MTEsOCBAQAogCQkJMCwgOCwKIAkJCTB4N2YsIDEsCiAJCQloZWFkcGhvbmVfdm9sdW1lKSwKKwlTT0NfU0lOR0xFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgU0dUTDUwMDBfQ0hJUF9BTkFfQ1RSTCwKKwkJCTQsIDEsIDEpLAogCVNPQ19TSU5HTEUoIkhlYWRwaG9uZSBQbGF5YmFjayBaQyBTd2l0Y2giLCBTR1RMNTAwMF9DSElQX0FOQV9DVFJMLAogCQkJNSwgMSwgMCksCiAKQEAgLTQyMyw2ICs0MjUsNyBAQAogCQkJU0dUTDUwMDBfTElORV9PVVRfVk9MX1JJR0hUX1NISUZULAogCQkJMHgxZiwgMSwKIAkJCWxpbmVvdXRfdm9sdW1lKSwKKwlTT0NfU0lOR0xFKCJMaW5lb3V0IFBsYXliYWNrIFN3aXRjaCIsIFNHVEw1MDAwX0NISVBfQU5BX0NUUkwsIDgsIDEsIDEpLAogfTsKIAogLyogbXV0ZSB0aGUgY29kZWMgdXNlZCBieSBhbHNhIGNvcmUgKi8KQEAgLTExNTEsMTIgKzExNTQsMTQgQEAKIAkucmVtb3ZlID0gc2d0bDUwMDBfcmVtb3ZlLAogCS5zZXRfYmlhc19sZXZlbCA9IHNndGw1MDAwX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKLQkuY29udHJvbHMgPSBzZ3RsNTAwMF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoc2d0bDUwMDBfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gc2d0bDUwMDBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShzZ3RsNTAwMF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHNndGw1MDAwX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHNndGw1MDAwX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHNndGw1MDAwX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHNndGw1MDAwX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gc2d0bDUwMDBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoc2d0bDUwMDBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHNndGw1MDAwX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShzZ3RsNTAwMF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBzZ3RsNTAwMF9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3NpNDc2eC5jIGIvc291bmQvc29jL2NvZGVjcy9zaTQ3NnguYwppbmRleCBhODQwMmQwLi41MzQ0ZjRhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3NpNDc2eC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvc2k0NzZ4LmMKQEAgLTIzOCwxMCArMjM4LDEyIEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9zaTQ3NnggPSB7CiAJLmdldF9yZWdtYXAgPSBzaTQ3NnhfZ2V0X3JlZ21hcCwKLQkuZGFwbV93aWRnZXRzID0gc2k0NzZ4X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoc2k0NzZ4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gc2k0NzZ4X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHNpNDc2eF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5kYXBtX3dpZGdldHMJCT0gc2k0NzZ4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHNpNDc2eF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gc2k0NzZ4X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShzaTQ3NnhfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IHNpNDc2eF9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zbjk1MDMxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3NuOTUwMzEuYwppbmRleCAzYTdkZTAxLi5lYWU1NGMzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3NuOTUwMzEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3NuOTUwMzEuYwpAQCAtODg4LDEyICs4ODgsMTQgQEAKIAkuc2V0X2JpYXNfbGV2ZWwJPSBzbjk1MDMxX3NldF92YXVkX2JpYXMsCiAJLmlkbGVfYmlhc19vZmYJPSB0cnVlLAogCi0JLmNvbnRyb2xzCT0gc245NTAzMV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scwk9IEFSUkFZX1NJWkUoc245NTAzMV9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMJPSBzbjk1MDMxX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoc245NTAzMV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcwk9IHNuOTUwMzFfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHNuOTUwMzFfYXVkaW9fbWFwKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHNuOTUwMzFfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoc245NTAzMV9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHNuOTUwMzFfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoc245NTAzMV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gc245NTAzMV9hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHNuOTUwMzFfYXVkaW9fbWFwKSwKKwl9LAogfTsKIAogc3RhdGljIGludCBzbjk1MDMxX2RldmljZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zcGRpZl9yZWNlaXZlci5jIGIvc291bmQvc29jL2NvZGVjcy9zcGRpZl9yZWNlaXZlci5jCmluZGV4IDNlYzQxY2NiLi4yMzRmODdiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3NwZGlmX3JlY2VpdmVyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zcGRpZl9yZWNlaXZlci5jCkBAIC0zOCwxMCArMzgsMTIgQEAKIAkJCVNORFJWX1BDTV9GTVRCSVRfSUVDOTU4X1NVQkZSQU1FX0xFKQogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19zcGRpZl9kaXIgPSB7Ci0JLmRhcG1fd2lkZ2V0cyA9IGRpcl93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShkaXJfd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gZGlyX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShkaXJfcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmRhcG1fd2lkZ2V0cwkJPSBkaXJfd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGRpcl93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGRpcl9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGRpcl9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBkaXJfc3R1Yl9kYWkgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3NwZGlmX3RyYW5zbWl0dGVyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3NwZGlmX3RyYW5zbWl0dGVyLmMKaW5kZXggZWY2MzRhOS4uZWUzNjc1MyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zcGRpZl90cmFuc21pdHRlci5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3BkaWZfdHJhbnNtaXR0ZXIuYwpAQCAtMzgsMTAgKzM4LDEyIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19zcGRpZl9kaXQgPSB7Ci0JLmRhcG1fd2lkZ2V0cyA9IGRpdF93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShkaXRfd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gZGl0X3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShkaXRfcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmRhcG1fd2lkZ2V0cwkJPSBkaXRfd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGRpdF93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGRpdF9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGRpdF9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBkaXRfc3R1Yl9kYWkgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3NzbTI1MTguYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3NtMjUxOC5jCmluZGV4IGUyZTBiZmEuLjM4YTg1ZjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvc3NtMjUxOC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3NtMjUxOC5jCkBAIC03MTUsMTIgKzcxNSwxNCBAQAogCS5zZXRfc3lzY2xrID0gc3NtMjUxOF9zZXRfc3lzY2xrLAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHNzbTI1MThfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHNzbTI1MThfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gc3NtMjUxOF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHNzbTI1MThfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBzc20yNTE4X3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShzc20yNTE4X3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBzc20yNTE4X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHNzbTI1MThfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBzc20yNTE4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHNzbTI1MThfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHNzbTI1MThfcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShzc20yNTE4X3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBzc20yNTE4X3JlZ21hcF9jb25maWcgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3NzbTI2MDIuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3NtMjYwMi5jCmluZGV4IDQ0NTJmZWEuLjk5M2JkZTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvc3NtMjYwMi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3NtMjYwMi5jCkBAIC01OTcsMTIgKzU5NywxNCBAQAogCS5zZXRfYmlhc19sZXZlbCA9IHNzbTI2MDJfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gc3NtMjYweF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoc3NtMjYweF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBzc20yNjB4X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoc3NtMjYweF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHNzbTI2MHhfcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHNzbTI2MHhfcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHNzbTI2MHhfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoc3NtMjYweF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHNzbTI2MHhfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoc3NtMjYweF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gc3NtMjYweF9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHNzbTI2MHhfcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGJvb2wgc3NtMjYwMl9yZWdpc3Rlcl92b2xhdGlsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3NzbTQ1NjcuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3NtNDU2Ny5jCmluZGV4IDA4MGM3OGUuLjJiYjVhMTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvc3NtNDU2Ny5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3NtNDU2Ny5jCkBAIC00MjEsMTIgKzQyMSwxNCBAQAogCS5zZXRfYmlhc19sZXZlbCA9IHNzbTQ1Njdfc2V0X2JpYXNfbGV2ZWwsCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gc3NtNDU2N19zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoc3NtNDU2N19zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBzc200NTY3X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoc3NtNDU2N19kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHNzbTQ1Njdfcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHNzbTQ1Njdfcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHNzbTQ1Njdfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoc3NtNDU2N19zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHNzbTQ1NjdfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoc3NtNDU2N19kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gc3NtNDU2N19yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHNzbTQ1Njdfcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHNzbTQ1NjdfcmVnbWFwX2NvbmZpZyA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3RhMzJ4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3N0YTMyeC5jCmluZGV4IGE5ODQ0YjIuLjA3OTBhZTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvc3RhMzJ4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zdGEzMnguYwpAQCAtOTkxLDEyICs5OTEsMTQgQEAKIAkucmVtb3ZlID0JCXN0YTMyeF9yZW1vdmUsCiAJLnNldF9iaWFzX2xldmVsID0Jc3RhMzJ4X3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0JdHJ1ZSwKLQkuY29udHJvbHMgPQkJc3RhMzJ4X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0JCUFSUkFZX1NJWkUoc3RhMzJ4X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9CQlzdGEzMnhfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0JQVJSQVlfU0laRShzdGEzMnhfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPQkJc3RhMzJ4X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPQlBUlJBWV9TSVpFKHN0YTMyeF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scyA9CQlzdGEzMnhfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzID0JCUFSUkFZX1NJWkUoc3RhMzJ4X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMgPQkJc3RhMzJ4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMgPQlBUlJBWV9TSVpFKHN0YTMyeF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMgPQkJc3RhMzJ4X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzID0JQVJSQVlfU0laRShzdGEzMnhfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgc3RhMzJ4X3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3RhMzUwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3N0YTM1MC5jCmluZGV4IDMzYTQ2MTIuLjk2NDRjMjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvc3RhMzUwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zdGEzNTAuYwpAQCAtMTA1NywxMiArMTA1NywxNCBAQAogCS5yZW1vdmUgPQkJc3RhMzUwX3JlbW92ZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPQlzdGEzNTBfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPQl0cnVlLAotCS5jb250cm9scyA9CQlzdGEzNTBfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPQkJQVJSQVlfU0laRShzdGEzNTBfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0JCXN0YTM1MF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPQlBUlJBWV9TSVpFKHN0YTM1MF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9CQlzdGEzNTBfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9CUFSUkFZX1NJWkUoc3RhMzUwX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzID0JCXN0YTM1MF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMgPQkJQVJSQVlfU0laRShzdGEzNTBfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cyA9CQlzdGEzNTBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cyA9CUFSUkFZX1NJWkUoc3RhMzUwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcyA9CQlzdGEzNTBfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMgPQlBUlJBWV9TSVpFKHN0YTM1MF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBzdGEzNTBfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zdGE1MjkuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3RhNTI5LmMKaW5kZXggMmNkYWNhOS4uZDRiMzg0ZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zdGE1MjkuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3N0YTUyOS5jCkBAIC0zMTcsOCArMzE3LDEwIEBACiAJLnNldF9iaWFzX2xldmVsID0gc3RhNTI5X3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHN0YTUyOV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoc3RhNTI5X3NuZF9jb250cm9scyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBzdGE1Mjlfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoc3RhNTI5X3NuZF9jb250cm9scyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBzdGE1MjlfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zdGFjOTc2Ni5jIGIvc291bmQvc29jL2NvZGVjcy9zdGFjOTc2Ni5jCmluZGV4IDA5NDVjNTEuLjI3ZjMwZDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvc3RhYzk3NjYuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3N0YWM5NzY2LmMKQEAgLTg1LDEwICs4NSwxMCBAQAogc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHN0YWM5NzY2X3N0ZXJlb19taWNfZW51bSwKIAkJCSAgICBBQzk3X1NUQUNfU1RFUkVPX01JQywgMiwgc3RhYzk3NjZfc3RlcmVvX21pYyk7CiAKLXN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIobWFzdGVyX3RsdiwgLTQ2MDAsIDApOwotc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX0xJTkVBUihyZWNvcmRfdGx2LCAwLCAyMjUwKTsKLXN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIoYmVlcF90bHYsIC00NTAwLCAwKTsKLXN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIobWl4X3RsdiwgLTM0NTAsIDEyMDApOworc3RhdGljIGNvbnN0IFNORFJWX0NUTF9UTFZEX0RFQ0xBUkVfREJfU0NBTEUobWFzdGVyX3RsdiwgLTQ2NTAsIDE1MCwgMCk7CitzdGF0aWMgY29uc3QgU05EUlZfQ1RMX1RMVkRfREVDTEFSRV9EQl9TQ0FMRShyZWNvcmRfdGx2LCAgICAgMCwgMTUwLCAwKTsKK3N0YXRpYyBjb25zdCBTTkRSVl9DVExfVExWRF9ERUNMQVJFX0RCX1NDQUxFKGJlZXBfdGx2LCAgIC00NTAwLCAzMDAsIDApOworc3RhdGljIGNvbnN0IFNORFJWX0NUTF9UTFZEX0RFQ0xBUkVfREJfU0NBTEUobWl4X3RsdiwgICAgLTM0NTAsIDE1MCwgMCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzdGFjOTc2Nl9zbmRfYWM5N19jb250cm9sc1tdID0gewogCVNPQ19ET1VCTEVfVExWKCJTcGVha2VyIFZvbHVtZSIsIEFDOTdfTUFTVEVSLCA4LCAwLCAzMSwgMSwgbWFzdGVyX3RsdiksCkBAIC0zMjAsOCArMzIwLDEwIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9zdGFjOTc2NiA9IHsKLQkuY29udHJvbHMgPSBzdGFjOTc2Nl9zbmRfYWM5N19jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShzdGFjOTc2Nl9zbmRfYWM5N19jb250cm9scyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBzdGFjOTc2Nl9zbmRfYWM5N19jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHN0YWM5NzY2X3NuZF9hYzk3X2NvbnRyb2xzKSwKKwl9LAogCS53cml0ZSA9IHN0YWM5NzY2X2FjOTdfd3JpdGUsCiAJLnJlYWQgPSBzdGFjOTc2Nl9hYzk3X3JlYWQsCiAJLnNldF9iaWFzX2xldmVsID0gc3RhYzk3NjZfc2V0X2JpYXNfbGV2ZWwsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3N0aS1zYXMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3RpLXNhcy5jCmluZGV4IDE2MGQ2MWEuLjdiMzFlZTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvc3RpLXNhcy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3RpLXNhcy5jCkBAIC01OTEsMTEgKzU5MSwxMSBAQAogCXN0aV9zYXNfZGFpW1NUSV9TQVNfREFJX0FOQUxPR19PVVRdLm9wcyA9IGRydmRhdGEtPmRldl9kYXRhLT5kYWNfb3BzOwogCiAJLyogU2V0IGRhcG1zKi8KLQlzdGlfc2FzX2RyaXZlci5kYXBtX3dpZGdldHMgPSBkcnZkYXRhLT5kZXZfZGF0YS0+ZGFwbV93aWRnZXRzOwotCXN0aV9zYXNfZHJpdmVyLm51bV9kYXBtX3dpZGdldHMgPSBkcnZkYXRhLT5kZXZfZGF0YS0+bnVtX2RhcG1fd2lkZ2V0czsKKwlzdGlfc2FzX2RyaXZlci5jb21wb25lbnRfZHJpdmVyLmRhcG1fd2lkZ2V0cyA9IGRydmRhdGEtPmRldl9kYXRhLT5kYXBtX3dpZGdldHM7CisJc3RpX3Nhc19kcml2ZXIuY29tcG9uZW50X2RyaXZlci5udW1fZGFwbV93aWRnZXRzID0gZHJ2ZGF0YS0+ZGV2X2RhdGEtPm51bV9kYXBtX3dpZGdldHM7CiAKLQlzdGlfc2FzX2RyaXZlci5kYXBtX3JvdXRlcyA9IGRydmRhdGEtPmRldl9kYXRhLT5kYXBtX3JvdXRlczsKLQlzdGlfc2FzX2RyaXZlci5udW1fZGFwbV9yb3V0ZXMgPSBkcnZkYXRhLT5kZXZfZGF0YS0+bnVtX2RhcG1fcm91dGVzOworCXN0aV9zYXNfZHJpdmVyLmNvbXBvbmVudF9kcml2ZXIuZGFwbV9yb3V0ZXMgPSBkcnZkYXRhLT5kZXZfZGF0YS0+ZGFwbV9yb3V0ZXM7CisJc3RpX3Nhc19kcml2ZXIuY29tcG9uZW50X2RyaXZlci5udW1fZGFwbV9yb3V0ZXMgPSBkcnZkYXRhLT5kZXZfZGF0YS0+bnVtX2RhcG1fcm91dGVzOwogCiAJLyogU3RvcmUgY29udGV4dCAqLwogCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBkcnZkYXRhKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdGFzMjU1Mi5jIGIvc291bmQvc29jL2NvZGVjcy90YXMyNTUyLmMKaW5kZXggY2MxZDM5OC4uYmFmNDU1ZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90YXMyNTUyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90YXMyNTUyLmMKQEAgLTY2NywxMiArNjY3LDE0IEBACiAJLnJlc3VtZSA9IHRhczI1NTJfcmVzdW1lLAogCS5pZ25vcmVfcG1kb3duX3RpbWUgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gdGFzMjU1Ml9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUodGFzMjU1Ml9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB0YXMyNTUyX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUodGFzMjU1Ml9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHRhczI1NTJfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHRhczI1NTJfYXVkaW9fbWFwKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHRhczI1NTJfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUodGFzMjU1Ml9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHRhczI1NTJfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUodGFzMjU1Ml9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gdGFzMjU1Ml9hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHRhczI1NTJfYXVkaW9fbWFwKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHRhczI1NTJfcmVnbWFwX2NvbmZpZyA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdGFzNTA4Ni5jIGIvc291bmQvc29jL2NvZGVjcy90YXM1MDg2LmMKaW5kZXggZDQ5ZDI1ZC4uYjdkZTg1NyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90YXM1MDg2LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90YXM1MDg2LmMKQEAgLTM4Nyw3ICszODcsNyBAQAogCXZhbCA9IGluZGV4X2luX2FycmF5KHRhczUwODZfcmF0aW9zLCBBUlJBWV9TSVpFKHRhczUwODZfcmF0aW9zKSwKIAkJCSAgICAgcHJpdi0+bWNsayAvIHByaXYtPnJhdGUpOwogCWlmICh2YWwgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkluYXZsaWQgTUNMSyAvIEZzIHJhdGlvXG4iKTsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSW52YWxpZCBNQ0xLIC8gRnMgcmF0aW9cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTg5MCwxMiArODkwLDE0IEBACiAJLnJlbW92ZQkJCT0gdGFzNTA4Nl9yZW1vdmUsCiAJLnN1c3BlbmQJCT0gdGFzNTA4Nl9zb2Nfc3VzcGVuZCwKIAkucmVzdW1lCQkJPSB0YXM1MDg2X3NvY19yZXN1bWUsCi0JLmNvbnRyb2xzCQk9IHRhczUwODZfY29udHJvbHMsCi0JLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHRhczUwODZfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMJCT0gdGFzNTA4Nl9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHRhczUwODZfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMJCT0gdGFzNTA4Nl9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh0YXM1MDg2X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHRhczUwODZfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh0YXM1MDg2X2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB0YXM1MDg2X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHRhczUwODZfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHRhczUwODZfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHRhczUwODZfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgdGFzNTA4Nl9pMmNfaWRbXSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdGFzNTcxeC5jIGIvc291bmQvc29jL2NvZGVjcy90YXM1NzF4LmMKaW5kZXggZDhiYWNhMy4uZGY1ZTVjYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90YXM1NzF4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90YXM1NzF4LmMKQEAgLTY1OCwxMCArNjU4LDEyIEBACiAJLnNldF9iaWFzX2xldmVsID0gdGFzNTcxeF9zZXRfYmlhc19sZXZlbCwKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCiAKLQkuZGFwbV93aWRnZXRzID0gdGFzNTcxeF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHRhczU3MXhfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB0YXM1NzF4X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHRhczU3MXhfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuZGFwbV93aWRnZXRzCQk9IHRhczU3MXhfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUodGFzNTcxeF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gdGFzNTcxeF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUodGFzNTcxeF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIHRhczU3MXhfZGFpID0gewpAQCAtNzU0LDggKzc1Niw4IEBACiAKIAogCW1lbWNweSgmcHJpdi0+Y29kZWNfZHJpdmVyLCAmdGFzNTcxeF9jb2RlYywgc2l6ZW9mKHByaXYtPmNvZGVjX2RyaXZlcikpOwotCXByaXYtPmNvZGVjX2RyaXZlci5jb250cm9scyA9IHByaXYtPmNoaXAtPmNvbnRyb2xzOwotCXByaXYtPmNvZGVjX2RyaXZlci5udW1fY29udHJvbHMgPSBwcml2LT5jaGlwLT5udW1fY29udHJvbHM7CisJcHJpdi0+Y29kZWNfZHJpdmVyLmNvbXBvbmVudF9kcml2ZXIuY29udHJvbHMgPSBwcml2LT5jaGlwLT5jb250cm9sczsKKwlwcml2LT5jb2RlY19kcml2ZXIuY29tcG9uZW50X2RyaXZlci5udW1fY29udHJvbHMgPSBwcml2LT5jaGlwLT5udW1fY29udHJvbHM7CiAKIAlpZiAocHJpdi0+Y2hpcC0+dm9sX3JlZ19zaXplID09IDIpIHsKIAkJLyoKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdGFzNTcyMC5jIGIvc291bmQvc29jL2NvZGVjcy90YXM1NzIwLmMKaW5kZXggZjU0ZmI0Ni4uYzY1YjkxNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90YXM1NzIwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90YXM1NzIwLmMKQEAgLTQ4OSwxMiArNDg5LDE0IEBACiAJLnN1c3BlbmQgPSB0YXM1NzIwX3N1c3BlbmQsCiAJLnJlc3VtZSA9IHRhczU3MjBfcmVzdW1lLAogCi0JLmNvbnRyb2xzID0gdGFzNTcyMF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUodGFzNTcyMF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB0YXM1NzIwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUodGFzNTcyMF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHRhczU3MjBfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHRhczU3MjBfYXVkaW9fbWFwKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHRhczU3MjBfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUodGFzNTcyMF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHRhczU3MjBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUodGFzNTcyMF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gdGFzNTcyMF9hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHRhczU3MjBfYXVkaW9fbWFwKSwKKwl9LAogfTsKIAogLyogUENNIHJhdGVzIHN1cHBvcnRlZCBieSB0aGUgVEFTNTcyMCBkcml2ZXIgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdGZhOTg3OS5jIGIvc291bmQvc29jL2NvZGVjcy90ZmE5ODc5LmMKaW5kZXggY2I1MzEwZC4uOTVlMGE3YSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90ZmE5ODc5LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90ZmE5ODc5LmMKQEAgLTIzMSwxMyArMjMxLDE0IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHRmYTk4NzlfY29kZWMgPSB7Ci0JLmNvbnRyb2xzID0gdGZhOTg3OV9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh0ZmE5ODc5X2NvbnRyb2xzKSwKLQotCS5kYXBtX3dpZGdldHMgPSB0ZmE5ODc5X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUodGZhOTg3OV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHRmYTk4NzlfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUodGZhOTg3OV9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB0ZmE5ODc5X2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUodGZhOTg3OV9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gdGZhOTg3OV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh0ZmE5ODc5X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB0ZmE5ODc5X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh0ZmE5ODc5X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHRmYTk4NzlfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy5jCmluZGV4IGNkOGMwMmIuLjQxMGNhZTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMjMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzIzLmMKQEAgLTU4MywxMiArNTgzLDE0IEBACiAJLnNldF9iaWFzX2xldmVsID0gdGx2MzIwYWljMjNfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gdGx2MzIwYWljMjNfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHRsdjMyMGFpYzIzX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHRsdjMyMGFpYzIzX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUodGx2MzIwYWljMjNfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB0bHYzMjBhaWMyM19pbnRlcmNvbiwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh0bHYzMjBhaWMyM19pbnRlcmNvbiksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB0bHYzMjBhaWMyM19zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh0bHYzMjBhaWMyM19zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHRsdjMyMGFpYzIzX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHRsdjMyMGFpYzIzX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB0bHYzMjBhaWMyM19pbnRlcmNvbiwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUodGx2MzIwYWljMjNfaW50ZXJjb24pLAorCX0sCiB9OwogCiBpbnQgdGx2MzIwYWljMjNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzI2LmMgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzI2LmMKaW5kZXggMmM5MDRkNy4uMTRhYTk2ZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyNi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMjYuYwpAQCAtMzIxLDEyICszMjEsMTQgQEAKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBhaWMyNl9zb2NfY29kZWNfZGV2ID0gewogCS5wcm9iZSA9IGFpYzI2X3Byb2JlLAotCS5jb250cm9scyA9IGFpYzI2X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShhaWMyNl9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB0bHYzMjBhaWMyNl9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHRsdjMyMGFpYzI2X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gdGx2MzIwYWljMjZfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUodGx2MzIwYWljMjZfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gYWljMjZfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoYWljMjZfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB0bHYzMjBhaWMyNl9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh0bHYzMjBhaWMyNl9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gdGx2MzIwYWljMjZfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHRsdjMyMGFpYzI2X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGFpYzI2X3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMzF4eC5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzMXh4LmMKaW5kZXggM2M1ZTFkZi4uYmUxYTY0YiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzMXh4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzMXh4LmMKQEAgLTI3MywxMCArMjczLDIwIEBACiAvKgogICogY29udHJvbHMgdG8gYmUgZXhwb3J0ZWQgdG8gdGhlIHVzZXIgc3BhY2UKICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpYzMxeHhfc25kX2NvbnRyb2xzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgY29tbW9uMzF4eF9zbmRfY29udHJvbHNbXSA9IHsKIAlTT0NfRE9VQkxFX1JfU19UTFYoIkRBQyBQbGF5YmFjayBWb2x1bWUiLCBBSUMzMVhYX0xEQUNWT0wsCiAJCQkgICBBSUMzMVhYX1JEQUNWT0wsIDAsIC0xMjcsIDQ4LCA3LCAwLCBkYWNfdm9sX3RsdiksCiAKKwlTT0NfRE9VQkxFX1IoIkhQIERyaXZlciBQbGF5YmFjayBTd2l0Y2giLCBBSUMzMVhYX0hQTEdBSU4sCisJCSAgICAgQUlDMzFYWF9IUFJHQUlOLCAyLCAxLCAwKSwKKwlTT0NfRE9VQkxFX1JfVExWKCJIUCBEcml2ZXIgUGxheWJhY2sgVm9sdW1lIiwgQUlDMzFYWF9IUExHQUlOLAorCQkJIEFJQzMxWFhfSFBSR0FJTiwgMywgMHgwOSwgMCwgaHBfZHJ2X3RsdiksCisKKwlTT0NfRE9VQkxFX1JfVExWKCJIUCBBbmFsb2cgUGxheWJhY2sgVm9sdW1lIiwgQUlDMzFYWF9MQU5BTE9HSFBMLAorCQkJIEFJQzMxWFhfUkFOQUxPR0hQUiwgMCwgMHg3RiwgMSwgaHBfdm9sX3RsdiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWljMzF4eF9zbmRfY29udHJvbHNbXSA9IHsKIAlTT0NfU0lOR0xFX1RMVigiQURDIEZpbmUgQ2FwdHVyZSBWb2x1bWUiLCBBSUMzMVhYX0FEQ0ZHQSwgNCwgNCwgMSwKIAkJICAgICAgIGFkY19mZ2Fpbl90bHYpLAogCkBAIC0yODYsMTQgKzI5Niw2IEBACiAKIAlTT0NfU0lOR0xFX1RMVigiTWljIFBHQSBDYXB0dXJlIFZvbHVtZSIsIEFJQzMxWFhfTUlDUEdBLCAwLAogCQkgICAgICAgMTE5LCAwLCBtaWNfcGdhX3RsdiksCi0KLQlTT0NfRE9VQkxFX1IoIkhQIERyaXZlciBQbGF5YmFjayBTd2l0Y2giLCBBSUMzMVhYX0hQTEdBSU4sCi0JCSAgICAgQUlDMzFYWF9IUFJHQUlOLCAyLCAxLCAwKSwKLQlTT0NfRE9VQkxFX1JfVExWKCJIUCBEcml2ZXIgUGxheWJhY2sgVm9sdW1lIiwgQUlDMzFYWF9IUExHQUlOLAotCQkJIEFJQzMxWFhfSFBSR0FJTiwgMywgMHgwOSwgMCwgaHBfZHJ2X3RsdiksCi0KLQlTT0NfRE9VQkxFX1JfVExWKCJIUCBBbmFsb2cgUGxheWJhY2sgVm9sdW1lIiwgQUlDMzFYWF9MQU5BTE9HSFBMLAotCQkJIEFJQzMxWFhfUkFOQUxPR0hQUiwgMCwgMHg3RiwgMSwgaHBfdm9sX3RsdiksCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWljMzExeF9zbmRfY29udHJvbHNbXSA9IHsKQEAgLTM5NywxNyArMzk5LDI4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsZWZ0X291dHB1dF9zd2l0Y2hlc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpYzMxeHhfbGVmdF9vdXRwdXRfc3dpdGNoZXNbXSA9IHsKIAlTT0NfREFQTV9TSU5HTEUoIkZyb20gTGVmdCBEQUMiLCBBSUMzMVhYX0RBQ01JWEVSUk9VVEUsIDYsIDEsIDApLAogCVNPQ19EQVBNX1NJTkdMRSgiRnJvbSBNSUMxTFAiLCBBSUMzMVhYX0RBQ01JWEVSUk9VVEUsIDUsIDEsIDApLAogCVNPQ19EQVBNX1NJTkdMRSgiRnJvbSBNSUMxUlAiLCBBSUMzMVhYX0RBQ01JWEVSUk9VVEUsIDQsIDEsIDApLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJpZ2h0X291dHB1dF9zd2l0Y2hlc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFpYzMxeHhfcmlnaHRfb3V0cHV0X3N3aXRjaGVzW10gPSB7CiAJU09DX0RBUE1fU0lOR0xFKCJGcm9tIFJpZ2h0IERBQyIsIEFJQzMxWFhfREFDTUlYRVJST1VURSwgMiwgMSwgMCksCiAJU09DX0RBUE1fU0lOR0xFKCJGcm9tIE1JQzFSUCIsIEFJQzMxWFhfREFDTUlYRVJST1VURSwgMSwgMSwgMCksCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgZGFjMzF4eF9sZWZ0X291dHB1dF9zd2l0Y2hlc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiRnJvbSBMZWZ0IERBQyIsIEFJQzMxWFhfREFDTUlYRVJST1VURSwgNiwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJGcm9tIEFJTjEiLCBBSUMzMVhYX0RBQ01JWEVSUk9VVEUsIDUsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiRnJvbSBBSU4yIiwgQUlDMzFYWF9EQUNNSVhFUlJPVVRFLCA0LCAxLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkYWMzMXh4X3JpZ2h0X291dHB1dF9zd2l0Y2hlc1tdID0geworCVNPQ19EQVBNX1NJTkdMRSgiRnJvbSBSaWdodCBEQUMiLCBBSUMzMVhYX0RBQ01JWEVSUk9VVEUsIDIsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiRnJvbSBBSU4yIiwgQUlDMzFYWF9EQUNNSVhFUlJPVVRFLCAxLCAxLCAwKSwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBwX3Rlcm1fbWljMWxwID0KIAlTT0NfREFQTV9FTlVNKCJNSUMxTFAgUC1UZXJtaW5hbCIsIG1pYzFscF9wX2VudW0pOwogCkBAIC00NTcsNyArNDcwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGFpYzMxeHhfZGFwbV93aWRnZXRzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgY29tbW9uMzF4eF9kYXBtX3dpZGdldHNbXSA9IHsKIAlTTkRfU09DX0RBUE1fQUlGX0lOKCJEQUMgSU4iLCAiREFDIFBsYXliYWNrIiwgMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKIAogCVNORF9TT0NfREFQTV9NVVgoIkRBQyBMZWZ0IElucHV0IiwKQEAgLTQ3MywxNCArNDg2LDcgQEAKIAkJCSAgIEFJQzMxWFhfREFDU0VUVVAsIDYsIDAsIGFpYzMxeHhfZGFwbV9wb3dlcl9ldmVudCwKIAkJCSAgIFNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCiAKLQkvKiBPdXRwdXQgTWl4ZXJzICovCi0JU05EX1NPQ19EQVBNX01JWEVSKCJPdXRwdXQgTGVmdCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKLQkJCSAgIGxlZnRfb3V0cHV0X3N3aXRjaGVzLAotCQkJICAgQVJSQVlfU0laRShsZWZ0X291dHB1dF9zd2l0Y2hlcykpLAotCVNORF9TT0NfREFQTV9NSVhFUigiT3V0cHV0IFJpZ2h0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkJICAgcmlnaHRfb3V0cHV0X3N3aXRjaGVzLAotCQkJICAgQVJSQVlfU0laRShyaWdodF9vdXRwdXRfc3dpdGNoZXMpKSwKLQorCS8qIEhQICovCiAJU05EX1NPQ19EQVBNX1NXSVRDSCgiSFAgTGVmdCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKIAkJCSAgICAmYWljMzF4eF9kYXBtX2hwbF9zd2l0Y2gpLAogCVNORF9TT0NfREFQTV9TV0lUQ0goIkhQIFJpZ2h0IiwgU05EX1NPQ19OT1BNLCAwLCAwLApAQCAtNDk0LDEwICs1MDAsMzQgQEAKIAkJCSAgICAgICBOVUxMLCAwLCBhaWMzMXh4X2RhcG1fcG93ZXJfZXZlbnQsCiAJCQkgICAgICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKIAotCS8qIEFEQyAqLwotCVNORF9TT0NfREFQTV9BRENfRSgiQURDIiwgIkNhcHR1cmUiLCBBSUMzMVhYX0FEQ1NFVFVQLCA3LCAwLAotCQkJICAgYWljMzF4eF9kYXBtX3Bvd2VyX2V2ZW50LCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfAotCQkJICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwkvKiBNaWMgQmlhcyAqLworCVNORF9TT0NfREFQTV9TVVBQTFkoIk1JQ0JJQVMiLCBTTkRfU09DX05PUE0sIDAsIDAsIG1pY19iaWFzX2V2ZW50LAorCQkJICAgIFNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EKSwKKworCS8qIE91dHB1dHMgKi8KKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJIUEwiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJIUFIiKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBkYWMzMXh4X2RhcG1fd2lkZ2V0c1tdID0geworCS8qIElucHV0cyAqLworCVNORF9TT0NfREFQTV9JTlBVVCgiQUlOMSIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiQUlOMiIpLAorCisJLyogT3V0cHV0IE1peGVycyAqLworCVNORF9TT0NfREFQTV9NSVhFUigiT3V0cHV0IExlZnQiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgICBkYWMzMXh4X2xlZnRfb3V0cHV0X3N3aXRjaGVzLAorCQkJICAgQVJSQVlfU0laRShkYWMzMXh4X2xlZnRfb3V0cHV0X3N3aXRjaGVzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJPdXRwdXQgUmlnaHQiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgICBkYWMzMXh4X3JpZ2h0X291dHB1dF9zd2l0Y2hlcywKKwkJCSAgIEFSUkFZX1NJWkUoZGFjMzF4eF9yaWdodF9vdXRwdXRfc3dpdGNoZXMpKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBhaWMzMXh4X2RhcG1fd2lkZ2V0c1tdID0geworCS8qIElucHV0cyAqLworCVNORF9TT0NfREFQTV9JTlBVVCgiTUlDMUxQIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJNSUMxUlAiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIk1JQzFMTSIpLAogCiAJLyogSW5wdXQgU2VsZWN0aW9uIHRvIE1JQ19QR0EgKi8KIAlTTkRfU09DX0RBUE1fTVVYKCJNSUMxTFAgUC1UZXJtaW5hbCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKQEAgLTUwNywyNCArNTM3LDI1IEBACiAJU05EX1NPQ19EQVBNX01VWCgiTUlDMUxNIFAtVGVybWluYWwiLCBTTkRfU09DX05PUE0sIDAsIDAsCiAJCQkgJnBfdGVybV9taWMxbG0pLAogCisJLyogQURDICovCisJU05EX1NPQ19EQVBNX0FEQ19FKCJBREMiLCAiQ2FwdHVyZSIsIEFJQzMxWFhfQURDU0VUVVAsIDcsIDAsCisJCQkgICBhaWMzMXh4X2RhcG1fcG93ZXJfZXZlbnQsIFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCQkgICBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCiAJU05EX1NPQ19EQVBNX01VWCgiTUlDMUxNIE0tVGVybWluYWwiLCBTTkRfU09DX05PUE0sIDAsIDAsCiAJCQkgJm1fdGVybV9taWMxbG0pLAorCiAJLyogRW5hYmxpbmcgJiBEaXNhYmxpbmcgTUlDIEdhaW4gQ3RsICovCiAJU05EX1NPQ19EQVBNX1BHQSgiTUlDX0dBSU5fQ1RMIiwgQUlDMzFYWF9NSUNQR0EsCiAJCQkgNywgMSwgTlVMTCwgMCksCiAKLQkvKiBNaWMgQmlhcyAqLwotCVNORF9TT0NfREFQTV9TVVBQTFkoIk1JQ0JJQVMiLCBTTkRfU09DX05PUE0sIDAsIDAsIG1pY19iaWFzX2V2ZW50LAotCQkJICAgIFNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EKSwKLQotCS8qIE91dHB1dHMgKi8KLQlTTkRfU09DX0RBUE1fT1VUUFVUKCJIUEwiKSwKLQlTTkRfU09DX0RBUE1fT1VUUFVUKCJIUFIiKSwKLQotCS8qIElucHV0cyAqLwotCVNORF9TT0NfREFQTV9JTlBVVCgiTUlDMUxQIiksCi0JU05EX1NPQ19EQVBNX0lOUFVUKCJNSUMxUlAiKSwKLQlTTkRfU09DX0RBUE1fSU5QVVQoIk1JQzFMTSIpLAorCS8qIE91dHB1dCBNaXhlcnMgKi8KKwlTTkRfU09DX0RBUE1fTUlYRVIoIk91dHB1dCBMZWZ0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJICAgYWljMzF4eF9sZWZ0X291dHB1dF9zd2l0Y2hlcywKKwkJCSAgIEFSUkFZX1NJWkUoYWljMzF4eF9sZWZ0X291dHB1dF9zd2l0Y2hlcykpLAorCVNORF9TT0NfREFQTV9NSVhFUigiT3V0cHV0IFJpZ2h0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJICAgYWljMzF4eF9yaWdodF9vdXRwdXRfc3dpdGNoZXMsCisJCQkgICBBUlJBWV9TSVpFKGFpYzMxeHhfcmlnaHRfb3V0cHV0X3N3aXRjaGVzKSksCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYWljMzExeF9kYXBtX3dpZGdldHNbXSA9IHsKQEAgLTU1NCw3ICs1ODUsNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUKLWFpYzMxeHhfYXVkaW9fbWFwW10gPSB7Citjb21tb24zMXh4X2F1ZGlvX21hcFtdID0gewogCS8qIERBQyBJbnB1dCBSb3V0aW5nICovCiAJeyJEQUMgTGVmdCBJbnB1dCIsICJMZWZ0IERhdGEiLCAiREFDIElOIn0sCiAJeyJEQUMgTGVmdCBJbnB1dCIsICJSaWdodCBEYXRhIiwgIkRBQyBJTiJ9LApAQCAtNTY1LDYgKzU5NiwzMSBAQAogCXsiREFDIExlZnQiLCBOVUxMLCAiREFDIExlZnQgSW5wdXQifSwKIAl7IkRBQyBSaWdodCIsIE5VTEwsICJEQUMgUmlnaHQgSW5wdXQifSwKIAorCS8qIEhQTCBwYXRoICovCisJeyJIUCBMZWZ0IiwgIlN3aXRjaCIsICJPdXRwdXQgTGVmdCJ9LAorCXsiSFBMIERyaXZlciIsIE5VTEwsICJIUCBMZWZ0In0sCisJeyJIUEwiLCBOVUxMLCAiSFBMIERyaXZlciJ9LAorCisJLyogSFBSIHBhdGggKi8KKwl7IkhQIFJpZ2h0IiwgIlN3aXRjaCIsICJPdXRwdXQgUmlnaHQifSwKKwl7IkhQUiBEcml2ZXIiLCBOVUxMLCAiSFAgUmlnaHQifSwKKwl7IkhQUiIsIE5VTEwsICJIUFIgRHJpdmVyIn0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZQorZGFjMzF4eF9hdWRpb19tYXBbXSA9IHsKKwkvKiBMZWZ0IE91dHB1dCAqLworCXsiT3V0cHV0IExlZnQiLCAiRnJvbSBMZWZ0IERBQyIsICJEQUMgTGVmdCJ9LAorCXsiT3V0cHV0IExlZnQiLCAiRnJvbSBBSU4xIiwgIkFJTjEifSwKKwl7Ik91dHB1dCBMZWZ0IiwgIkZyb20gQUlOMiIsICJBSU4yIn0sCisKKwkvKiBSaWdodCBPdXRwdXQgKi8KKwl7Ik91dHB1dCBSaWdodCIsICJGcm9tIFJpZ2h0IERBQyIsICJEQUMgUmlnaHQifSwKKwl7Ik91dHB1dCBSaWdodCIsICJGcm9tIEFJTjIiLCAiQUlOMiJ9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUKK2FpYzMxeHhfYXVkaW9fbWFwW10gPSB7CiAJLyogTWljIGlucHV0ICovCiAJeyJNSUMxTFAgUC1UZXJtaW5hbCIsICJGRlIgMTAgT2htIiwgIk1JQzFMUCJ9LAogCXsiTUlDMUxQIFAtVGVybWluYWwiLCAiRkZSIDIwIE9obSIsICJNSUMxTFAifSwKQEAgLTU5NSwxNiArNjUxLDYgQEAKIAkvKiBSaWdodCBPdXRwdXQgKi8KIAl7Ik91dHB1dCBSaWdodCIsICJGcm9tIFJpZ2h0IERBQyIsICJEQUMgUmlnaHQifSwKIAl7Ik91dHB1dCBSaWdodCIsICJGcm9tIE1JQzFSUCIsICJNSUMxUlAifSwKLQotCS8qIEhQTCBwYXRoICovCi0JeyJIUCBMZWZ0IiwgIlN3aXRjaCIsICJPdXRwdXQgTGVmdCJ9LAotCXsiSFBMIERyaXZlciIsIE5VTEwsICJIUCBMZWZ0In0sCi0JeyJIUEwiLCBOVUxMLCAiSFBMIERyaXZlciJ9LAotCi0JLyogSFBSIHBhdGggKi8KLQl7IkhQIFJpZ2h0IiwgIlN3aXRjaCIsICJPdXRwdXQgUmlnaHQifSwKLQl7IkhQUiBEcml2ZXIiLCBOVUxMLCAiSFAgUmlnaHQifSwKLQl7IkhQUiIsIE5VTEwsICJIUFIgRHJpdmVyIn0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZQpAQCAtNjMzLDYgKzY3OSwxMyBAQAogCWludCByZXQgPSAwOwogCXN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAorCWlmICghKGFpYzMxeHgtPnBkYXRhLmNvZGVjX3R5cGUgJiBEQUMzMVhYX0JJVCkpCisJCXJldCA9IHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKAorCQkJY29kZWMsIGFpYzMxeHhfc25kX2NvbnRyb2xzLAorCQkJQVJSQVlfU0laRShhaWMzMXh4X3NuZF9jb250cm9scykpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlpZiAoYWljMzF4eC0+cGRhdGEuY29kZWNfdHlwZSAmIEFJQzMxWFhfU1RFUkVPX0NMQVNTX0RfQklUKQogCQlyZXQgPSBzbmRfc29jX2FkZF9jb2RlY19jb250cm9scygKIAkJCWNvZGVjLCBhaWMzMTF4X3NuZF9jb250cm9scywKQEAgLTY1MSw2ICs3MDQsMzAgQEAKIAlzdHJ1Y3QgYWljMzF4eF9wcml2ICphaWMzMXh4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJaW50IHJldCA9IDA7CiAKKwlpZiAoYWljMzF4eC0+cGRhdGEuY29kZWNfdHlwZSAmIERBQzMxWFhfQklUKSB7CisJCXJldCA9IHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoCisJCQlkYXBtLCBkYWMzMXh4X2RhcG1fd2lkZ2V0cywKKwkJCUFSUkFZX1NJWkUoZGFjMzF4eF9kYXBtX3dpZGdldHMpKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgZGFjMzF4eF9hdWRpb19tYXAsCisJCQkJCSAgICAgIEFSUkFZX1NJWkUoZGFjMzF4eF9hdWRpb19tYXApKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKKwkJcmV0ID0gc25kX3NvY19kYXBtX25ld19jb250cm9scygKKwkJCWRhcG0sIGFpYzMxeHhfZGFwbV93aWRnZXRzLAorCQkJQVJSQVlfU0laRShhaWMzMXh4X2RhcG1fd2lkZ2V0cykpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBhaWMzMXh4X2F1ZGlvX21hcCwKKwkJCQkJICAgICAgQVJSQVlfU0laRShhaWMzMXh4X2F1ZGlvX21hcCkpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKIAlpZiAoYWljMzF4eC0+cGRhdGEuY29kZWNfdHlwZSAmIEFJQzMxWFhfU1RFUkVPX0NMQVNTX0RfQklUKSB7CiAJCXJldCA9IHNuZF9zb2NfZGFwbV9uZXdfY29udHJvbHMoCiAJCQlkYXBtLCBhaWMzMTF4X2RhcG1fd2lkZ2V0cywKQEAgLTExMTQsMTIgKzExOTEsMTQgQEAKIAkuc2V0X2JpYXNfbGV2ZWwJCT0gYWljMzF4eF9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZgk9IHRydWUsCiAKLQkuY29udHJvbHMJCT0gYWljMzF4eF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGFpYzMxeHhfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzCQk9IGFpYzMxeHhfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhaWMzMXh4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzCQk9IGFpYzMxeHhfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFpYzMxeHhfYXVkaW9fbWFwKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGNvbW1vbjMxeHhfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoY29tbW9uMzF4eF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGNvbW1vbjMxeHhfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoY29tbW9uMzF4eF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gY29tbW9uMzF4eF9hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGNvbW1vbjMxeHhfYXVkaW9fbWFwKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgYWljMzF4eF9kYWlfb3BzID0gewpAQCAtMTEyOSwxOSArMTIwOCwzNCBAQAogCS5kaWdpdGFsX211dGUJPSBhaWMzMXh4X2RhY19tdXRlLAogfTsKIAorc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgZGFjMzF4eF9kYWlfZHJpdmVyW10gPSB7CisJeworCQkubmFtZSA9ICJ0bHYzMmRhYzMxeHgtaGlmaSIsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZQkgPSAiUGxheWJhY2siLAorCQkJLmNoYW5uZWxzX21pbgkgPSAyLAorCQkJLmNoYW5uZWxzX21heAkgPSAyLAorCQkJLnJhdGVzCQkgPSBBSUMzMVhYX1JBVEVTLAorCQkJLmZvcm1hdHMJID0gQUlDMzFYWF9GT1JNQVRTLAorCQl9LAorCQkub3BzID0gJmFpYzMxeHhfZGFpX29wcywKKwkJLnN5bW1ldHJpY19yYXRlcyA9IDEsCisJfQorfTsKKwogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgYWljMzF4eF9kYWlfZHJpdmVyW10gPSB7CiAJewogCQkubmFtZSA9ICJ0bHYzMjBhaWMzMXh4LWhpZmkiLAogCQkucGxheWJhY2sgPSB7CiAJCQkuc3RyZWFtX25hbWUJID0gIlBsYXliYWNrIiwKLQkJCS5jaGFubmVsc19taW4JID0gMSwKKwkJCS5jaGFubmVsc19taW4JID0gMiwKIAkJCS5jaGFubmVsc19tYXgJID0gMiwKIAkJCS5yYXRlcwkJID0gQUlDMzFYWF9SQVRFUywKIAkJCS5mb3JtYXRzCSA9IEFJQzMxWFhfRk9STUFUUywKIAkJfSwKIAkJLmNhcHR1cmUgPSB7CiAJCQkuc3RyZWFtX25hbWUJID0gIkNhcHR1cmUiLAotCQkJLmNoYW5uZWxzX21pbgkgPSAxLAorCQkJLmNoYW5uZWxzX21pbgkgPSAyLAogCQkJLmNoYW5uZWxzX21heAkgPSAyLAogCQkJLnJhdGVzCQkgPSBBSUMzMVhYX1JBVEVTLAogCQkJLmZvcm1hdHMJID0gQUlDMzFYWF9GT1JNQVRTLApAQCAtMTI1OSw5ICsxMzUzLDE2IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXJldHVybiBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZpMmMtPmRldiwgJnNvY19jb2RlY19kcml2ZXJfYWljMzF4eCwKLQkJCQkgICAgIGFpYzMxeHhfZGFpX2RyaXZlciwKLQkJCQkgICAgIEFSUkFZX1NJWkUoYWljMzF4eF9kYWlfZHJpdmVyKSk7CisJaWYgKGFpYzMxeHgtPnBkYXRhLmNvZGVjX3R5cGUgJiBEQUMzMVhYX0JJVCkKKwkJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LAorCQkJCSZzb2NfY29kZWNfZHJpdmVyX2FpYzMxeHgsCisJCQkJZGFjMzF4eF9kYWlfZHJpdmVyLAorCQkJCUFSUkFZX1NJWkUoZGFjMzF4eF9kYWlfZHJpdmVyKSk7CisJZWxzZQorCQlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsCisJCQkJJnNvY19jb2RlY19kcml2ZXJfYWljMzF4eCwKKwkJCQlhaWMzMXh4X2RhaV9kcml2ZXIsCisJCQkJQVJSQVlfU0laRShhaWMzMXh4X2RhaV9kcml2ZXIpKTsKIH0KIAogc3RhdGljIGludCBhaWMzMXh4X2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmkyYykKQEAgLTEyNzcsNiArMTM3OCw3IEBACiAJeyAidGx2MzIwYWljMzExMCIsIEFJQzMxMTAgfSwKIAl7ICJ0bHYzMjBhaWMzMTIwIiwgQUlDMzEyMCB9LAogCXsgInRsdjMyMGFpYzMxMTEiLCBBSUMzMTExIH0sCisJeyAidGx2MzIwZGFjMzEwMCIsIERBQzMxMDAgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWljMzF4eF9pMmNfaWQpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzMXh4LmggYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMxeHguaAppbmRleCBhYzliMTQ2Li41YWNkNWI2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMxeHguaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMxeHguaApAQCAtMjQsMTIgKzI0LDE0IEBACiAKICNkZWZpbmUgQUlDMzFYWF9TVEVSRU9fQ0xBU1NfRF9CSVQJMHgxCiAjZGVmaW5lIEFJQzMxWFhfTUlOSURTUF9CSVQJCTB4MgorI2RlZmluZSBEQUMzMVhYX0JJVAkJCTB4NAogCiBlbnVtIGFpYzMxeHhfdHlwZSB7CiAJQUlDMzEwMAk9IDAsCiAJQUlDMzExMCA9IEFJQzMxWFhfU1RFUkVPX0NMQVNTX0RfQklULAogCUFJQzMxMjAgPSBBSUMzMVhYX01JTklEU1BfQklULAogCUFJQzMxMTEgPSAoQUlDMzFYWF9TVEVSRU9fQ0xBU1NfRF9CSVQgfCBBSUMzMVhYX01JTklEU1BfQklUKSwKKwlEQUMzMTAwID0gREFDMzFYWF9CSVQsCiB9OwogCiBzdHJ1Y3QgYWljMzF4eF9wZGF0YSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMyeDQuYyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMzJ4NC5jCmluZGV4IDg1ZDQ5NzguLjI4ZmRmYzUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMzJ4NC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMzJ4NC5jCkBAIC03OTcsMTIgKzc5NywxNCBAQAogCS5zZXRfYmlhc19sZXZlbCA9IGFpYzMyeDRfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gYWljMzJ4NF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoYWljMzJ4NF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBhaWMzMng0X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWljMzJ4NF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGFpYzMyeDRfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYWljMzJ4NF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBhaWMzMng0X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGFpYzMyeDRfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBhaWMzMng0X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFpYzMyeDRfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGFpYzMyeDRfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFpYzMyeDRfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IGFpYzMyeDRfcGFyc2VfZHQoc3RydWN0IGFpYzMyeDRfcHJpdiAqYWljMzJ4NCwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljM3guYyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljM3guYwppbmRleCBhNTY0NzU5Li41YThkOTZlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzN4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzeC5jCkBAIC0xNjcwLDEyICsxNjcwLDE0IEBACiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAogCS5wcm9iZSA9IGFpYzN4X3Byb2JlLAogCS5yZW1vdmUgPSBhaWMzeF9yZW1vdmUsCi0JLmNvbnRyb2xzID0gYWljM3hfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGFpYzN4X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IGFpYzN4X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWljM3hfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBpbnRlcmNvbiwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShpbnRlcmNvbiksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBhaWMzeF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShhaWMzeF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGFpYzN4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFpYzN4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBpbnRlcmNvbiwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoaW50ZXJjb24pLAorCX0sCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBkYWMzMy5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBkYWMzMy5jCmluZGV4IGY3YTZjZTcuLjdiY2YwMWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwZGFjMzMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGRhYzMzLmMKQEAgLTkwLDcgKzkwLDYgQEAKIAogc3RydWN0IHRsdjMyMGRhYzMzX3ByaXYgewogCXN0cnVjdCBtdXRleCBtdXRleDsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqZGFjMzNfd3E7CiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOwogCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhIHN1cHBsaWVzW0RBQzMzX05VTV9TVVBQTElFU107CkBAIC03NzEsNyArNzcwLDcgQEAKIAogCS8qIERvIG5vdCBzY2hlZHVsZSB0aGUgd29ya3F1ZXVlIGluIE1vZGU3ICovCiAJaWYgKGRhYzMzLT5maWZvX21vZGUgIT0gREFDMzNfRklGT19NT0RFNykKLQkJcXVldWVfd29yayhkYWMzMy0+ZGFjMzNfd3EsICZkYWMzMy0+d29yayk7CisJCXNjaGVkdWxlX3dvcmsoJmRhYzMzLT53b3JrKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTExMjcsNyArMTEyNiw3IEBACiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgogCQlpZiAoZGFjMzMtPmZpZm9fbW9kZSkgewogCQkJZGFjMzMtPnN0YXRlID0gREFDMzNfUFJFRklMTDsKLQkJCXF1ZXVlX3dvcmsoZGFjMzMtPmRhYzMzX3dxLCAmZGFjMzMtPndvcmspOworCQkJc2NoZWR1bGVfd29yaygmZGFjMzMtPndvcmspOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKQEAgLTExMzUsNyArMTEzNCw3IEBACiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgogCQlpZiAoZGFjMzMtPmZpZm9fbW9kZSkgewogCQkJZGFjMzMtPnN0YXRlID0gREFDMzNfRkxVU0g7Ci0JCQlxdWV1ZV93b3JrKGRhYzMzLT5kYWMzM193cSwgJmRhYzMzLT53b3JrKTsKKwkJCXNjaGVkdWxlX3dvcmsoJmRhYzMzLT53b3JrKTsKIAkJfQogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMTQxMCwxNCArMTQwOSw2IEBACiAJCQlkYWMzMy0+aXJxID0gLTE7CiAJCX0KIAkJaWYgKGRhYzMzLT5pcnEgIT0gLTEpIHsKLQkJCS8qIFNldHVwIHdvcmsgcXVldWUgKi8KLQkJCWRhYzMzLT5kYWMzM193cSA9Ci0JCQkJY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoInRsdjMyMGRhYzMzIik7Ci0JCQlpZiAoZGFjMzMtPmRhYzMzX3dxID09IE5VTEwpIHsKLQkJCQlmcmVlX2lycShkYWMzMy0+aXJxLCBjb2RlYyk7Ci0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQl9Ci0KIAkJCUlOSVRfV09SSygmZGFjMzMtPndvcmssIGRhYzMzX3dvcmspOwogCQl9CiAJfQpAQCAtMTQzNyw3ICsxNDI4LDcgQEAKIAogCWlmIChkYWMzMy0+aXJxID49IDApIHsKIAkJZnJlZV9pcnEoZGFjMzMtPmlycSwgZGFjMzMtPmNvZGVjKTsKLQkJZGVzdHJveV93b3JrcXVldWUoZGFjMzMtPmRhYzMzX3dxKTsKKwkJZmx1c2hfd29yaygmZGFjMzMtPndvcmspOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTE0NTMsMTIgKzE0NDQsMTQgQEAKIAkucHJvYmUgPSBkYWMzM19zb2NfcHJvYmUsCiAJLnJlbW92ZSA9IGRhYzMzX3NvY19yZW1vdmUsCiAKLQkuY29udHJvbHMgPSBkYWMzM19zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoZGFjMzNfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gZGFjMzNfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShkYWMzM19kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGF1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhdWRpb19tYXApLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gZGFjMzNfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoZGFjMzNfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBkYWMzM19kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShkYWMzM19kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhdWRpb19tYXApLAorCX0sCiB9OwogCiAjZGVmaW5lIERBQzMzX1JBVEVTCShTTkRSVl9QQ01fUkFURV80NDEwMCB8IFwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdHBhNjEzMGEyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3RwYTYxMzBhMi5jCmluZGV4IGYxZWEwNTIuLjJlMDE0YzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdHBhNjEzMGEyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90cGE2MTMwYTIuYwpAQCAtNTIsNyArNTIsNyBAQAogCiBzdGF0aWMgaW50IHRwYTYxMzBhMl9wb3dlcihzdHJ1Y3QgdHBhNjEzMGEyX2RhdGEgKmRhdGEsIGJvb2wgZW5hYmxlKQogewotCWludCByZXQ7CisJaW50IHJldCA9IDAsIHJldDI7CiAKIAlpZiAoZW5hYmxlKSB7CiAJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoZGF0YS0+c3VwcGx5KTsKQEAgLTY0LDcgKzY0LDMwIEBACiAJCS8qIFBvd2VyIG9uICovCiAJCWlmIChkYXRhLT5wb3dlcl9ncGlvID49IDApCiAJCQlncGlvX3NldF92YWx1ZShkYXRhLT5wb3dlcl9ncGlvLCAxKTsKKworCQkvKiBTeW5jIHJlZ2lzdGVycyAqLworCQlyZWdjYWNoZV9jYWNoZV9vbmx5KGRhdGEtPnJlZ21hcCwgZmFsc2UpOworCQlyZXQgPSByZWdjYWNoZV9zeW5jKGRhdGEtPnJlZ21hcCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2VycihkYXRhLT5kZXYsCisJCQkJIkZhaWxlZCB0byBzeW5jIHJlZ2lzdGVyczogJWRcbiIsIHJldCk7CisJCQlyZWdjYWNoZV9jYWNoZV9vbmx5KGRhdGEtPnJlZ21hcCwgdHJ1ZSk7CisJCQlpZiAoZGF0YS0+cG93ZXJfZ3BpbyA+PSAwKQorCQkJCWdwaW9fc2V0X3ZhbHVlKGRhdGEtPnBvd2VyX2dwaW8sIDApOworCQkJcmV0MiA9IHJlZ3VsYXRvcl9kaXNhYmxlKGRhdGEtPnN1cHBseSk7CisJCQlpZiAocmV0MiAhPSAwKQorCQkJCWRldl9lcnIoZGF0YS0+ZGV2LAorCQkJCQkiRmFpbGVkIHRvIGRpc2FibGUgc3VwcGx5OiAlZFxuIiwgcmV0Mik7CisJCQlyZXR1cm4gcmV0OworCQl9CiAJfSBlbHNlIHsKKwkJLyogUG93ZXJlZCBvZmYgZGV2aWNlIGRvZXMgbm90IHJldGFpbiByZWdpc3RlcnMuIFdoaWxlIGRldmljZQorCQkgKiBpcyBvZmYsIGFueSByZWdpc3RlciB1cGRhdGVzIChpLmUuIHZvbHVtZSBjaGFuZ2VzKSBzaG91bGQKKwkJICogaGFwcGVuIGluIGNhY2hlIG9ubHkuCisJCSAqLworCQlyZWdjYWNoZV9tYXJrX2RpcnR5KGRhdGEtPnJlZ21hcCk7CisJCXJlZ2NhY2hlX2NhY2hlX29ubHkoZGF0YS0+cmVnbWFwLCB0cnVlKTsKKwogCQkvKiBQb3dlciBvZmYgKi8KIAkJaWYgKGRhdGEtPnBvd2VyX2dwaW8gPj0gMCkKIAkJCWdwaW9fc2V0X3ZhbHVlKGRhdGEtPnBvd2VyX2dwaW8sIDApOwpAQCAtNzUsOSArOTgsNiBAQAogCQkJCSJGYWlsZWQgdG8gZGlzYWJsZSBzdXBwbHk6ICVkXG4iLCByZXQpOwogCQkJcmV0dXJuIHJldDsKIAkJfQotCi0JCS8qIGRldmljZSByZWdzIGRvZXMgbm90IG1hdGNoIHRoZSBjYWNoZSBzdGF0ZSBhbnltb3JlICovCi0JCXJlZ2NhY2hlX21hcmtfZGlydHkoZGF0YS0+cmVnbWFwKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtODgsMjUgKzEwOCwxNCBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqYyA9IHNuZF9zb2NfZGFwbV90b19jb21wb25lbnQody0+ZGFwbSk7CiAJc3RydWN0IHRwYTYxMzBhMl9kYXRhICpkYXRhID0gc25kX3NvY19jb21wb25lbnRfZ2V0X2RydmRhdGEoYyk7Ci0JaW50IHJldDsKIAotCS8qIGJlZm9yZSB3aWRnZXQgcG93ZXIgdXAgKi8KIAlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkgewotCQkvKiBUdXJuIG9uIHRoZSBjaGlwICovCi0JCXRwYTYxMzBhMl9wb3dlcihkYXRhLCB0cnVlKTsKLQkJLyogU3luYyB0aGUgcmVnaXN0ZXJzICovCi0JCXJldCA9IHJlZ2NhY2hlX3N5bmMoZGF0YS0+cmVnbWFwKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoYy0+ZGV2LCAiRmFpbGVkIHRvIGluaXRpYWxpemUgY2hpcFxuIik7Ci0JCQl0cGE2MTMwYTJfcG93ZXIoZGF0YSwgZmFsc2UpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCS8qIGFmdGVyIHdpZGdldCBwb3dlciBkb3duICovCisJCS8qIEJlZm9yZSB3aWRnZXQgcG93ZXIgdXA6IHR1cm4gY2hpcCBvbiwgc3luYyByZWdpc3RlcnMgKi8KKwkJcmV0dXJuIHRwYTYxMzBhMl9wb3dlcihkYXRhLCB0cnVlKTsKIAl9IGVsc2UgewotCQl0cGE2MTMwYTJfcG93ZXIoZGF0YSwgZmFsc2UpOworCQkvKiBBZnRlciB3aWRnZXQgcG93ZXIgZG93bjogdHVybiBjaGlwIG9mZiAqLworCQlyZXR1cm4gdHBhNjEzMGEyX3Bvd2VyKGRhdGEsIGZhbHNlKTsKIAl9Ci0KLQlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTE5MCw3ICsxOTksNyBAQAogCXsgIlJpZ2h0IFBHQSIsIE5VTEwsICJQb3dlciIgfSwKIH07CiAKLXN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIgdHBhNjEzMGEyX2NvbXBvbmVudF9kcml2ZXIgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29tcG9uZW50X2RyaXZlciB0cGE2MTMwYTJfY29tcG9uZW50X2RyaXZlciA9IHsKIAkubmFtZSA9ICJ0cGE2MTMwYTIiLAogCS5wcm9iZSA9IHRwYTYxMzBhMl9jb21wb25lbnRfcHJvYmUsCiAJLmRhcG1fd2lkZ2V0cyA9IHRwYTYxMzBhMl9kYXBtX3dpZGdldHMsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3R3bDQwMzAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvdHdsNDAzMC5jCmluZGV4IGE1YTRlOWYuLmEyMTA0ZDYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdHdsNDAzMC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdHdsNDAzMC5jCkBAIC0yMTk5LDEyICsyMTk5LDE0IEBACiAJLnNldF9iaWFzX2xldmVsID0gdHdsNDAzMF9zZXRfYmlhc19sZXZlbCwKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSB0d2w0MDMwX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh0d2w0MDMwX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHR3bDQwMzBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh0d2w0MDMwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gaW50ZXJjb24sCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoaW50ZXJjb24pLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gdHdsNDAzMF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh0d2w0MDMwX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gdHdsNDAzMF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh0d2w0MDMwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBpbnRlcmNvbiwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoaW50ZXJjb24pLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IHR3bDQwMzBfY29kZWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdHdsNjA0MC5jIGIvc291bmQvc29jL2NvZGVjcy90d2w2MDQwLmMKaW5kZXggMWY3MDgxMC4uNzQ4MDM2ZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90d2w2MDQwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90d2w2MDQwLmMKQEAgLTExNTYsMTIgKzExNTYsMTQgQEAKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAJLmlnbm9yZV9wbWRvd25fdGltZSA9IHRydWUsCiAKLQkuY29udHJvbHMgPSB0d2w2MDQwX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh0d2w2MDQwX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHR3bDYwNDBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh0d2w2MDQwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gaW50ZXJjb24sCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoaW50ZXJjb24pLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gdHdsNjA0MF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh0d2w2MDQwX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gdHdsNjA0MF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh0d2w2MDQwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBpbnRlcmNvbiwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoaW50ZXJjb24pLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IHR3bDYwNDBfY29kZWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdWRhMTM0eC5jIGIvc291bmQvc29jL2NvZGVjcy91ZGExMzR4LmMKaW5kZXggZTRjNjk0Yy4uNWZkZWU4NyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy91ZGExMzR4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy91ZGExMzR4LmMKQEAgLTUyMywxMCArNTIzLDEyIEBACiAJLnNldF9iaWFzX2xldmVsID0gdWRhMTM0eF9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuZGFwbV93aWRnZXRzID0gdWRhMTM0eF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHVkYTEzNHhfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB1ZGExMzR4X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHVkYTEzNHhfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuZGFwbV93aWRnZXRzCQk9IHVkYTEzNHhfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUodWRhMTM0eF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gdWRhMTM0eF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUodWRhMTM0eF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB1ZGExMzR4X3JlZ21hcF9jb25maWcgPSB7CkBAIC01NDQsNiArNTQ2LDcgQEAKIHsKIAlzdHJ1Y3QgdWRhMTM0eF9wbGF0Zm9ybV9kYXRhICpwZCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCB1ZGExMzR4X3ByaXYgKnVkYTEzNHg7CisJaW50IHJldDsKIAogCWlmICghcGQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWlzc2luZyBMMyBiaXRiYW5nIGZ1bmN0aW9uXG4iKTsKQEAgLTU1Nyw2ICs1NjAsMTIgQEAKIAl1ZGExMzR4LT5wZCA9IHBkOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHVkYTEzNHgpOwogCisJaWYgKHBkLT5sMy51c2VfZ3Bpb3MpIHsKKwkJcmV0ID0gbDNfc2V0X2dwaW9fb3BzKCZwZGV2LT5kZXYsICZ1ZGExMzR4LT5wZC0+bDMpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCiAJdWRhMTM0eC0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdCgmcGRldi0+ZGV2LCBOVUxMLCBwZCwKIAkJJnVkYTEzNHhfcmVnbWFwX2NvbmZpZyk7CiAJaWYgKElTX0VSUih1ZGExMzR4LT5yZWdtYXApKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy91ZGExMzgwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3VkYTEzODAuYwppbmRleCAzNWYwNDY5Li41MzNlM2JiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3VkYTEzODAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3VkYTEzODAuYwpAQCAtNzY1LDEyICs3NjUsMTQgQEAKIAkucmVnX2NhY2hlX2RlZmF1bHQgPSB1ZGExMzgwX3JlZywKIAkucmVnX2NhY2hlX3N0ZXAgPSAxLAogCi0JLmNvbnRyb2xzID0gdWRhMTM4MF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUodWRhMTM4MF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB1ZGExMzgwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUodWRhMTM4MF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHVkYTEzODBfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUodWRhMTM4MF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB1ZGExMzgwX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHVkYTEzODBfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB1ZGExMzgwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHVkYTEzODBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHVkYTEzODBfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHVkYTEzODBfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSTJDKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bDEyNzMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd2wxMjczLmMKaW5kZXggMWI3OTc3OC4uZmNmZmI2ZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bDEyNzMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dsMTI3My5jCkBAIC00ODQsMTIgKzQ4NCwxNCBAQAogCS5wcm9iZSA9IHdsMTI3M19wcm9iZSwKIAkucmVtb3ZlID0gd2wxMjczX3JlbW92ZSwKIAotCS5jb250cm9scyA9IHdsMTI3M19jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bDEyNzNfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bDEyNzNfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bDEyNzNfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bDEyNzNfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod2wxMjczX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdsMTI3M19jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdsMTI3M19jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd2wxMjczX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdsMTI3M19kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd2wxMjczX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bDEyNzNfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IHdsMTI3M19wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTAwMTAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd20wMDEwLmMKaW5kZXggZTNjMzRiZC4uMGViNWRjZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTAwMTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtMDAxMC5jCkBAIC03ODksMTYgKzc4OSwxOCBAQAogCiBzdGF0aWMgaW50IHdtMDAxMF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd20wMDEwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtMDAxMCA9IHsKIAkucHJvYmUgPSB3bTAwMTBfcHJvYmUsCiAJLnNldF9iaWFzX2xldmVsID0gd20wMDEwX3NldF9iaWFzX2xldmVsLAogCS5zZXRfc3lzY2xrID0gd20wMDEwX3NldF9zeXNjbGssCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAogCi0JLmRhcG1fd2lkZ2V0cyA9IHdtMDAxMF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtMDAxMF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtMDAxMF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTAwMTBfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuZGFwbV93aWRnZXRzCQk9IHdtMDAxMF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTAwMTBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtMDAxMF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod20wMDEwX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogI2RlZmluZSBXTTAwMTBfUkFURVMgKFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDApCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtMTI1MC1ldjEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd20xMjUwLWV2MS5jCmluZGV4IGVjNDVjNWIuLmNmNWYwNTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd20xMjUwLWV2MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd20xMjUwLWV2MS5jCkBAIC0xNDEsMTIgKzE0MSwxMyBAQAogCS5vcHMgPSAmd20xMjUwX2V2MV9vcHMsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd20xMjUwX2V2MSA9IHsKLQkuZGFwbV93aWRnZXRzID0gd20xMjUwX2V2MV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtMTI1MF9ldjFfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTEyNTBfZXYxX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtMTI1MF9ldjFfZGFwbV9yb3V0ZXMpLAotCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd20xMjUwX2V2MSA9IHsKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTEyNTBfZXYxX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtMTI1MF9ldjFfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtMTI1MF9ldjFfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtMTI1MF9ldjFfZGFwbV9yb3V0ZXMpLAorCX0sCiAJLnNldF9iaWFzX2xldmVsID0gd20xMjUwX2V2MV9zZXRfYmlhc19sZXZlbCwKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCiB9OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTIwMDAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd20yMDAwLmMKaW5kZXggYTY3ZWExMC4uMjNjZGUzYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTIwMDAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtMjAwMC5jCkBAIC01ODEsNyArNTgxLDcgQEAKIAlpZiAoYW5jX3RyYW5zaXRpb25zW2ldLmRlc3QgPT0gQU5DX09GRikKIAkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHdtMjAwMC0+bWNsayk7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHdtMjAwMF9hbmNfc2V0X21vZGUoc3RydWN0IHdtMjAwMF9wcml2ICp3bTIwMDApCkBAIC03OTksMTggKzc5OSwyMCBAQAogCXJldHVybiB3bTIwMDBfYW5jX3RyYW5zaXRpb24od20yMDAwLCBBTkNfT0ZGKTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtMjAwMCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTIwMDAgPSB7CiAJLnByb2JlID0gd20yMDAwX3Byb2JlLAogCS5yZW1vdmUgPSB3bTIwMDBfcmVtb3ZlLAogCS5zdXNwZW5kID0gd20yMDAwX3N1c3BlbmQsCiAJLnJlc3VtZSA9IHdtMjAwMF9yZXN1bWUsCiAKLQkuZGFwbV93aWRnZXRzID0gd20yMDAwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod20yMDAwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd20yMDAwX2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTIwMDBfYXVkaW9fbWFwKSwKLQkuY29udHJvbHMgPSB3bTIwMDBfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod20yMDAwX2NvbnRyb2xzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtMjAwMF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtMjAwMF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd20yMDAwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtMjAwMF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd20yMDAwX2F1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod20yMDAwX2F1ZGlvX21hcCksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgd20yMDAwX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTIyMDAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd20yMjAwLmMKaW5kZXggZmQxNDM5ZS4uNjA2YmY4OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTIyMDAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtMjIwMC5jCkBAIC0yMTAzLDcgKzIxMDMsNyBAQAogCS5vcHMgPSAmd20yMjAwX2RhaV9vcHMsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY193bTIyMDAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY193bTIyMDAgPSB7CiAJLnByb2JlID0gd20yMjAwX3Byb2JlLAogCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLApAQCAtMjExMSwxMiArMjExMSwxNCBAQAogCS5zZXRfc3lzY2xrID0gd20yMjAwX3NldF9zeXNjbGssCiAJLnNldF9wbGwgPSB3bTIyMDBfc2V0X2ZsbCwKIAotCS5jb250cm9scyA9IHdtMjIwMF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod20yMjAwX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtMjIwMF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtMjIwMF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtMjIwMF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTIyMDBfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd20yMjAwX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtMjIwMF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtMjIwMF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTIyMDBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtMjIwMF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod20yMjAwX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGlycXJldHVybl90IHdtMjIwMF9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd201MTAwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtNTEwMC5jCmluZGV4IDUxMmE5ZDIuLjU2MDU3NTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd201MTAwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTUxMDAuYwpAQCAtMjI4NSw3ICsyMjg1LDcgQEAKIAkJCQkgICgxIDw8IFdNNTEwMF9HUDFfRElSX1NISUZUKSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHdtNTEwMF90ZW1wbGF0ZV9jaGlwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2NoaXAgd201MTAwX3RlbXBsYXRlX2NoaXAgPSB7CiAJLmxhYmVsCQkJPSAid201MTAwIiwKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5kaXJlY3Rpb25fb3V0cHV0CT0gd201MTAwX2dwaW9fZGlyZWN0aW9uX291dCwKQEAgLTIzODEsNyArMjM4MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTUxMDAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd201MTAwID0gewogCS5wcm9iZSA9CXdtNTEwMF9wcm9iZSwKIAkucmVtb3ZlID0Jd201MTAwX3JlbW92ZSwKIApAQCAtMjM5MCwxMiArMjM5MCwxNCBAQAogCS5pZGxlX2JpYXNfb2ZmID0gMSwKIAogCS5zZXFfbm90aWZpZXIgPSB3bTUxMDBfc2VxX25vdGlmaWVyLAotCS5jb250cm9scyA9IHdtNTEwMF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod201MTAwX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtNTEwMF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtNTEwMF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtNTEwMF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTUxMDBfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd201MTAwX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtNTEwMF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtNTEwMF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTUxMDBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtNTEwMF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod201MTAwX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHdtNTEwMF9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtNTEwMi5jIGIvc291bmQvc29jL2NvZGVjcy93bTUxMDIuYwppbmRleCA4NDZkZWVkLi45Mzg3NmM2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtNTEwMi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd201MTAyLmMKQEAgLTE1MjEsNiArMTUyMSwxNiBAQAogCXsgIklOM0wiLCBOVUxMLCAiU1lTQ0xLIiB9LAogCXsgIklOM1IiLCBOVUxMLCAiU1lTQ0xLIiB9LAogCisJeyAiQVNSQzFMIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBU1JDMVIiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIkFTUkMyTCIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiQVNSQzJSIiwgTlVMTCwgIlNZU0NMSyIgfSwKKworCXsgIkFTUkMxTCIsIE5VTEwsICJBU1lOQ0NMSyIgfSwKKwl7ICJBU1JDMVIiLCBOVUxMLCAiQVNZTkNDTEsiIH0sCisJeyAiQVNSQzJMIiwgTlVMTCwgIkFTWU5DQ0xLIiB9LAorCXsgIkFTUkMyUiIsIE5VTEwsICJBU1lOQ0NMSyIgfSwKKwogCXsgIk1JQ0JJQVMxIiwgTlVMTCwgIk1JQ1ZERCIgfSwKIAl7ICJNSUNCSUFTMiIsIE5VTEwsICJNSUNWREQiIH0sCiAJeyAiTUlDQklBUzMiLCBOVUxMLCAiTUlDVkREIiB9LApAQCAtMTYwMCw3ICsxNjEwLDYgQEAKIAl7ICJTbGltMyBDYXB0dXJlIiwgTlVMTCwgIlNZU0NMSyIgfSwKIAogCXsgIkF1ZGlvIFRyYWNlIERTUCIsIE5VTEwsICJEU1AxIiB9LAotCXsgIkF1ZGlvIFRyYWNlIERTUCIsIE5VTEwsICJTWVNDTEsiIH0sCiAKIAl7ICJJTjFMIFBHQSIsIE5VTEwsICJJTjFMIiB9LAogCXsgIklOMVIgUEdBIiwgTlVMTCwgIklOMVIiIH0sCkBAIC0xOTkwLDcgKzE5OTksNyBAQAogCXJldHVybiBwcml2LT5jb3JlLmFyaXpvbmEtPnJlZ21hcDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtNTEwMiA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTUxMDIgPSB7CiAJLnByb2JlID0gd201MTAyX2NvZGVjX3Byb2JlLAogCS5yZW1vdmUgPSB3bTUxMDJfY29kZWNfcmVtb3ZlLAogCS5nZXRfcmVnbWFwID0gd201MTAyX2dldF9yZWdtYXAsCkBAIC0yMDAwLDEyICsyMDA5LDE0IEBACiAJLnNldF9zeXNjbGsgPSBhcml6b25hX3NldF9zeXNjbGssCiAJLnNldF9wbGwgPSB3bTUxMDJfc2V0X2ZsbCwKIAotCS5jb250cm9scyA9IHdtNTEwMl9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod201MTAyX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtNTEwMl9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtNTEwMl9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtNTEwMl9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTUxMDJfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd201MTAyX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtNTEwMl9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtNTEwMl9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTUxMDJfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtNTEwMl9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod201MTAyX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfY29tcHJfb3BzIHdtNTEwMl9jb21wcl9vcHMgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtNTExMC5jIGIvc291bmQvc29jL2NvZGVjcy93bTUxMTAuYwppbmRleCAxNTY1NDcwLi4wNmJhZTNiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtNTExMC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd201MTEwLmMKQEAgLTE3NDUsNiArMTc0NSwxNiBAQAogCXsgIklONEwiLCBOVUxMLCAiU1lTQ0xLIiB9LAogCXsgIklONFIiLCBOVUxMLCAiU1lTQ0xLIiB9LAogCisJeyAiQVNSQzFMIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBU1JDMVIiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIkFTUkMyTCIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiQVNSQzJSIiwgTlVMTCwgIlNZU0NMSyIgfSwKKworCXsgIkFTUkMxTCIsIE5VTEwsICJBU1lOQ0NMSyIgfSwKKwl7ICJBU1JDMVIiLCBOVUxMLCAiQVNZTkNDTEsiIH0sCisJeyAiQVNSQzJMIiwgTlVMTCwgIkFTWU5DQ0xLIiB9LAorCXsgIkFTUkMyUiIsIE5VTEwsICJBU1lOQ0NMSyIgfSwKKwogCXsgIk1JQ0JJQVMxIiwgTlVMTCwgIk1JQ1ZERCIgfSwKIAl7ICJNSUNCSUFTMiIsIE5VTEwsICJNSUNWREQiIH0sCiAJeyAiTUlDQklBUzMiLCBOVUxMLCAiTUlDVkREIiB9LApAQCAtMTgzMiwxMCArMTg0Miw4IEBACiAJeyAiU2xpbTMgQ2FwdHVyZSIsIE5VTEwsICJTWVNDTEsiIH0sCiAKIAl7ICJWb2ljZSBDb250cm9sIERTUCIsIE5VTEwsICJEU1AzIiB9LAotCXsgIlZvaWNlIENvbnRyb2wgRFNQIiwgTlVMTCwgIlNZU0NMSyIgfSwKIAogCXsgIkF1ZGlvIFRyYWNlIERTUCIsIE5VTEwsICJEU1AxIiB9LAotCXsgIkF1ZGlvIFRyYWNlIERTUCIsIE5VTEwsICJTWVNDTEsiIH0sCiAKIAl7ICJJTjFMIFBHQSIsIE5VTEwsICJJTjFMIiB9LAogCXsgIklOMVIgUEdBIiwgTlVMTCwgIklOMVIiIH0sCkBAIC0yMzQ3LDcgKzIzNTUsNyBAQAogCXJldHVybiBwcml2LT5jb3JlLmFyaXpvbmEtPnJlZ21hcDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtNTExMCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTUxMTAgPSB7CiAJLnByb2JlID0gd201MTEwX2NvZGVjX3Byb2JlLAogCS5yZW1vdmUgPSB3bTUxMTBfY29kZWNfcmVtb3ZlLAogCS5nZXRfcmVnbWFwID0gd201MTEwX2dldF9yZWdtYXAsCkBAIC0yMzU3LDEyICsyMzY1LDE0IEBACiAJLnNldF9zeXNjbGsgPSBhcml6b25hX3NldF9zeXNjbGssCiAJLnNldF9wbGwgPSB3bTUxMTBfc2V0X2ZsbCwKIAotCS5jb250cm9scyA9IHdtNTExMF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod201MTEwX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtNTExMF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtNTExMF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtNTExMF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTUxMTBfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd201MTEwX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtNTExMF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtNTExMF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTUxMTBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtNTExMF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod201MTEwX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfY29tcHJfb3BzIHdtNTExMF9jb21wcl9vcHMgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODM1MC5jIGIvc291bmQvc29jL2NvZGVjcy93bTgzNTAuYwppbmRleCBmZmJmM2RmLi4yZWZjNWI0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODM1MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204MzUwLmMKQEAgLTE1ODcsMTkgKzE1ODcsMjEgQEAKIAlyZXR1cm4gd204MzUwLT5yZWdtYXA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTgzNTAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204MzUwID0gewogCS5wcm9iZSA9CXdtODM1MF9jb2RlY19wcm9iZSwKIAkucmVtb3ZlID0Jd204MzUwX2NvZGVjX3JlbW92ZSwKIAkuZ2V0X3JlZ21hcCA9CXdtODM1MF9nZXRfcmVnbWFwLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODM1MF9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSB3bTgzNTBfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODM1MF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTgzNTBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTgzNTBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTgzNTBfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204MzUwX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODM1MF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTgzNTBfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTgzNTBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204MzUwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTgzNTBfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODM1MF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgd204MzUwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODQwMC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg0MDAuYwppbmRleCBiMWQzNDZhLi42YzU5ZmI5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODQwMC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NDAwLmMKQEAgLTEzMzIsMTkgKzEzMzIsMjEgQEAKIAlyZXR1cm4gd204NDAwLT5yZWdtYXA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg0MDAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NDAwID0gewogCS5wcm9iZSA9CXdtODQwMF9jb2RlY19wcm9iZSwKIAkucmVtb3ZlID0Jd204NDAwX2NvZGVjX3JlbW92ZSwKIAkuZ2V0X3JlZ21hcCA9CXdtODQwMF9nZXRfcmVnbWFwLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODQwMF9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSB3bTg0MDBfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODQwMF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg0MDBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg0MDBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTg0MDBfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204NDAwX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODQwMF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg0MDBfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg0MDBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204NDAwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg0MDBfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODQwMF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgd204NDAwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODUxMC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg1MTAuYwppbmRleCA5OWU0MGU2Li4xMTljZWFjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODUxMC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NTEwLmMKQEAgLTU4MSwxNyArNTgxLDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg1MTAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NTEwID0gewogCS5wcm9iZSA9CXdtODUxMF9wcm9iZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg1MTBfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gd204NTEwX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg1MTBfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204NTEwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204NTEwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204NTEwX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODUxMF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg1MTBfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204NTEwX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204NTEwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODUxMF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204NTEwX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg1MTBfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bTg1MTBfb2ZfbWF0Y2hbXSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NTIzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODUyMy5jCmluZGV4IGFhMjg3YTMuLmRlYjJlMDcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NTIzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg1MjMuYwpAQCAtNDEzLDE3ICs0MTMsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODUyMyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg1MjMgPSB7CiAJLnByb2JlID0Jd204NTIzX3Byb2JlLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODUyM19zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSB3bTg1MjNfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204NTIzX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204NTIzX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204NTIzX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204NTIzX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODUyM19kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg1MjNfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg1MjNfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODUyM19kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg1MjNfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODUyM19kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204NTIzX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgd204NTIzX29mX21hdGNoW10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODU4MC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg1ODAuYwppbmRleCA2NjYwMmJmLi5mYWE3Mjg3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODU4MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NTgwLmMKQEAgLTg5OSwxNyArODk5LDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg1ODAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NTgwID0gewogCS5wcm9iZSA9CXdtODU4MF9wcm9iZSwKIAkucmVtb3ZlID0Jd204NTgwX3JlbW92ZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg1ODBfc2V0X2JpYXNfbGV2ZWwsCiAKLQkuY29udHJvbHMgPSB3bTg1ODBfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODU4MF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg1ODBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg1ODBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTg1ODBfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204NTgwX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODU4MF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg1ODBfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg1ODBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204NTgwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg1ODBfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODU4MF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdtODU4MF9vZl9tYXRjaFtdID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3MTEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzExLmMKaW5kZXggYzc1OWVjMC4uMmIzNzZjOSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3MTEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODcxMS5jCkBAIC0zNjcsMTcgKzM2NywxOSBAQAogCiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg3MTEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NzExID0gewogCS5wcm9iZSA9CXdtODcxMV9wcm9iZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg3MTFfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gd204NzExX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg3MTFfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204NzExX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204NzExX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204NzExX2ludGVyY29uLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODcxMV9pbnRlcmNvbiksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg3MTFfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204NzExX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204NzExX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODcxMV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204NzExX2ludGVyY29uLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg3MTFfaW50ZXJjb24pLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bTg3MTFfb2ZfbWF0Y2hbXSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzI3LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODcyNy5jCmluZGV4IGJiMjVhNzUuLjdmZGUwNzcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzI3LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3MjcuYwpAQCAtNTMsMTEgKzUzLDEzIEBACiAJCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NzI3ID0gewotCS5kYXBtX3dpZGdldHMgPSB3bTg3MjdfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg3MjdfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTg3MjdfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204NzI3X2RhcG1fcm91dGVzKSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg3MjcgPSB7CisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5kYXBtX3dpZGdldHMJCT0gd204NzI3X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODcyN19kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204NzI3X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg3MjdfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IHdtODcyN19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3MjguYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzI4LmMKaW5kZXggMTU2NGU2OS4uNzk3Y2M2ZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3MjguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODcyOC5jCkBAIC0yMTEsMTYgKzIxMSwxOCBAQAogCS5vcHMgPSAmd204NzI4X2RhaV9vcHMsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NzI4ID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODcyOCA9IHsKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg3Mjhfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gd204NzI4X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg3Mjhfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204NzI4X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204NzI4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204NzI4X2ludGVyY29uLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODcyOF9pbnRlcmNvbiksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg3Mjhfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204NzI4X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204NzI4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODcyOF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204NzI4X2ludGVyY29uLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg3MjhfaW50ZXJjb24pLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bTg3Mjhfb2ZfbWF0Y2hbXSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODczMS5jCmluZGV4IGQxODI2MWEuLjRmOWExZWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3MzEuYwpAQCAtNjI4LDE2ICs2MjgsMTggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NzMxID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODczMSA9IHsKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg3MzFfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODczMV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODczMV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODczMV9pbnRlcmNvbiwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg3MzFfaW50ZXJjb24pLAotCS5jb250cm9scyA9CXdtODczMV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204NzMxX3NuZF9jb250cm9scyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg3MzFfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204NzMxX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204NzMxX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODczMV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204NzMxX2ludGVyY29uLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg3MzFfaW50ZXJjb24pLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bTg3MzFfb2ZfbWF0Y2hbXSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzM3LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODczNy5jCmluZGV4IGU3ODA3NjAuLmYwY2IxYzQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzM3LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3MzcuYwpAQCAtNTczLDE3ICs1NzMsMTkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NzM3ID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODczNyA9IHsKIAkucHJvYmUJCT0gd204NzM3X3Byb2JlLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODczN19zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSB3bTg3Mzdfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODczN19zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg3MzdfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg3MzdfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBpbnRlcmNvbiwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShpbnRlcmNvbiksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg3Mzdfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204NzM3X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204NzM3X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODczN19kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gaW50ZXJjb24sCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGludGVyY29uKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgd204NzM3X29mX21hdGNoW10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODc0MS5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3NDEuYwppbmRleCAzNmVmOTFmLi41NjVkNDc3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODc0MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzQxLmMKQEAgLTQ5NywxNSArNDk3LDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg3NDEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NzQxID0gewogCS5wcm9iZSA9CXdtODc0MV9wcm9iZSwKIAkucmVtb3ZlID0Jd204NzQxX3JlbW92ZSwKIAkucmVzdW1lID0Jd204NzQxX3Jlc3VtZSwKIAotCS5kYXBtX3dpZGdldHMgPSB3bTg3NDFfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg3NDFfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTg3NDFfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204NzQxX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg3NDFfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204NzQxX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg3NDFfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODc0MV9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdtODc0MV9vZl9tYXRjaFtdID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3NTAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUwLmMKaW5kZXggYmQ5ZGNkMi4uMGRhMmJiYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3NTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc1MC5jCkBAIC03MDgsMTcgKzcwOCwxOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg3NTAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NzUwID0gewogCS5wcm9iZSA9CXdtODc1MF9wcm9iZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg3NTBfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gd204NzUwX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg3NTBfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204NzUwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204NzUwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204NzUwX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODc1MF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg3NTBfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204NzUwX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204NzUwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODc1MF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204NzUwX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg3NTBfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bTg3NTBfb2ZfbWF0Y2hbXSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc1My5jCmluZGV4IGNkY2M5MTIuLjliZGY1NDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3NTMuYwpAQCAtMTQ3OCwxOCArMTQ3OCwyMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NzUzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODc1MyA9IHsKIAkucHJvYmUgPQl3bTg3NTNfcHJvYmUsCiAJLnJlc3VtZSA9CXdtODc1M19yZXN1bWUsCiAJLnNldF9iaWFzX2xldmVsID0gd204NzUzX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHdtODc1M19zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204NzUzX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODc1M19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODc1M19kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODc1M19kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg3NTNfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204NzUzX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODc1M19zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODc1M19kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg3NTNfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODc1M19kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204NzUzX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgd204NzUzX29mX21hdGNoW10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODc3MC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3NzAuYwppbmRleCBkZjYxNzg0Li5kNmVkY2JiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODc3MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzcwLmMKQEAgLTYwOCwxNyArNjA4LDE5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODc3MCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg3NzAgPSB7CiAJLnByb2JlID0gd204NzcwX3Byb2JlLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODc3MF9zZXRfYmlhc19sZXZlbCwKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSB3bTg3NzBfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODc3MF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg3NzBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg3NzBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTg3NzBfaW50ZXJjb24sCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204NzcwX2ludGVyY29uKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODc3MF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg3NzBfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg3NzBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204NzcwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg3NzBfaW50ZXJjb24sCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODc3MF9pbnRlcmNvbiksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdtODc3MF9vZl9tYXRjaFtdID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3NzYuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204Nzc2LmMKaW5kZXggNWFmNDRmOS4uYWUzMDQ4MCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3NzYuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc3Ni5jCkBAIC00MjUsMTcgKzQyNSwxOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg3NzYgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204Nzc2ID0gewogCS5wcm9iZSA9IAl3bTg3NzZfcHJvYmUsCiAJLnNldF9iaWFzX2xldmVsID0gd204Nzc2X3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHdtODc3Nl9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204Nzc2X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODc3Nl9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODc3Nl9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHJvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShyb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204Nzc2X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODc3Nl9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODc3Nl9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg3NzZfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHJvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUocm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgd204Nzc2X29mX21hdGNoW10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODc4Mi5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3ODIuYwppbmRleCBmYjU1ZmQ4Li5iY2RhMjEwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODc4Mi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzgyLmMKQEAgLTUwLDExICs1MCwxMyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NzgyID0gewotCS5kYXBtX3dpZGdldHMgPSB3bTg3ODJfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg3ODJfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTg3ODJfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204NzgyX2RhcG1fcm91dGVzKSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg3ODIgPSB7CisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5kYXBtX3dpZGdldHMJCT0gd204NzgyX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODc4Ml9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204NzgyX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg3ODJfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IHdtODc4Ml9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg4MDQuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204ODA0LmMKaW5kZXggOGQ5MTQ3MC4uYWY5NWQ2NDggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204ODA0LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg4MDQuYwpAQCAtNTQ1LDEwICs1NDUsMTIgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg4MDQgPSB7CiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAogCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODgwNF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODgwNF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODgwNF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg4MDRfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuZGFwbV93aWRnZXRzCQk9IHdtODgwNF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg4MDRfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODgwNF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204ODA0X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgd204ODA0X3JlZ21hcF9jb25maWcgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODkwMC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5MDAuYwppbmRleCA1ZDhkY2E4OC4uYzc3YjQ5YSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5MDAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODkwMC5jCkBAIC0xMjA4LDE4ICsxMjA4LDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5MDAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTAwID0gewogCS5wcm9iZSA9CXdtODkwMF9wcm9iZSwKIAkuc3VzcGVuZCA9CXdtODkwMF9zdXNwZW5kLAogCS5yZXN1bWUgPQl3bTg5MDBfcmVzdW1lLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODkwMF9zZXRfYmlhc19sZXZlbCwKIAotCS5jb250cm9scyA9IHdtODkwMF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204OTAwX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODkwMF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODkwMF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODkwMF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg5MDBfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204OTAwX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODkwMF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODkwMF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg5MDBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODkwMF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204OTAwX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHdtODkwMF9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODkwMy5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5MDMuYwppbmRleCBhMjZjYTQ5Li42ZTg4N2MyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODkwMy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAzLmMKQEAgLTE4MzAsNyArMTgzMCw3IEBACiAJCQkgICAhIXZhbHVlIDw8IFdNODkwM19HUDFfTFZMX1NISUZUKTsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgd204OTAzX3RlbXBsYXRlX2NoaXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCB3bTg5MDNfdGVtcGxhdGVfY2hpcCA9IHsKIAkubGFiZWwJCQk9ICJ3bTg5MDMiLAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLnJlcXVlc3QJCT0gd204OTAzX2dwaW9fcmVxdWVzdCwKQEAgLTE4NzQsMTggKzE4NzQsMjAgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTAzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODkwMyA9IHsKIAkucmVzdW1lID0Jd204OTAzX3Jlc3VtZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg5MDNfc2V0X2JpYXNfbGV2ZWwsCiAJLnNlcV9ub3RpZmllciA9IHdtODkwM19zZXFfbm90aWZpZXIsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gd204OTAzX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg5MDNfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204OTAzX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204OTAzX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204OTAzX2ludGVyY29uLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODkwM19pbnRlcmNvbiksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg5MDNfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204OTAzX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204OTAzX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODkwM19kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204OTAzX2ludGVyY29uLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg5MDNfaW50ZXJjb24pLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgd204OTAzX3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTA0LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODkwNC5jCmluZGV4IGVkZDdhNzcuLjRmZDM1MGU4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODkwNC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTA0LmMKQEAgLTIwODYsNyArMjA4Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5MDQgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTA0ID0gewogCS5wcm9iZSA9CXdtODkwNF9wcm9iZSwKIAkucmVtb3ZlID0Jd204OTA0X3JlbW92ZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg5MDRfc2V0X2JpYXNfbGV2ZWwsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk0MC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NDAuYwppbmRleCAxYzYwMDgxLi5iNTkzNTYyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk0MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTQwLmMKQEAgLTcyMywxNyArNzIzLDE5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk0MCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5NDAgPSB7CiAJLnByb2JlID0Jd204OTQwX3Byb2JlLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODk0MF9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSAgICAgd204OTQwX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg5NDBfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204OTQwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204OTQwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gIHdtODk0MF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg5NDBfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204OTQwX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODk0MF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODk0MF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg5NDBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODk0MF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204OTQwX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHdtODk0MF9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk1NS5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NTUuYwppbmRleCA5ZGIwMGQ1Li4xZWRjN2IxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk1NS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTU1LmMKQEAgLTk0MCwxNyArOTQwLDE5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk1NSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5NTUgPSB7CiAJLnByb2JlID0Jd204OTU1X3Byb2JlLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODk1NV9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPQl3bTg5NTVfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODk1NV9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg5NTVfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg5NTVfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPQl3bTg5NTVfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204OTU1X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODk1NV9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg5NTVfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg5NTVfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204OTU1X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg5NTVfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODk1NV9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB3bTg5NTVfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5NjAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYwLmMKaW5kZXggZDdmNDQ0Zi4uM2JmMDgxYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5NjAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk2MC5jCkBAIC0yMjYsMTEgKzIyNiwxMCBAQAogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGJ5cGFzc190bHYsIC0yMTAwLCAzMDAsIDApOwogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKG91dF90bHYsIC0xMjEwMCwgMTAwLCAxKTsKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShsaW5laW5ib29zdF90bHYsIC0xNTAwLCAzMDAsIDEpOwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtaWNib29zdF90bHZbXSA9IHsKLQlUTFZfREJfUkFOR0VfSEVBRCgyKSwKK3N0YXRpYyBjb25zdCBTTkRSVl9DVExfVExWRF9ERUNMQVJFX0RCX1JBTkdFKG1pY2Jvb3N0X3RsdiwKIAkwLCAxLCBUTFZfREJfU0NBTEVfSVRFTSgwLCAxMzAwLCAwKSwKIAkyLCAzLCBUTFZfREJfU0NBTEVfSVRFTSgyMDAwLCA5MDAsIDApLAotfTsKKyk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5NjBfc25kX2NvbnRyb2xzW10gPSB7CiBTT0NfRE9VQkxFX1JfVExWKCJDYXB0dXJlIFZvbHVtZSIsIFdNODk2MF9MSU5WT0wsIFdNODk2MF9SSU5WT0wsCkBAIC0xMjY0LDcgKzEyNjMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTYwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk2MCA9IHsKIAkucHJvYmUgPQl3bTg5NjBfcHJvYmUsCiAJLnNldF9iaWFzX2xldmVsID0gd204OTYwX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk2MS5jCmluZGV4IGUzMDQ0NmEuLmUyM2NlYWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NjEuYwpAQCAtODgyLDE4ICs4ODIsMjAgQEAKICNkZWZpbmUgd204OTYxX3Jlc3VtZSBOVUxMCiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk2MSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5NjEgPSB7CiAJLnByb2JlID0Jd204OTYxX3Byb2JlLAogCS5yZXN1bWUgPQl3bTg5NjFfcmVzdW1lLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODk2MV9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSB3bTg5NjFfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODk2MV9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg5NjFfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg5NjFfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBhdWRpb19wYXRocywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhdWRpb19wYXRocyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg5NjFfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204OTYxX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204OTYxX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODk2MV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gYXVkaW9fcGF0aHMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGF1ZGlvX3BhdGhzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHdtODk2MV9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk2Mi5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NjIuYwppbmRleCBmMzEwOWRhLi5mZDI3MzFkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk2Mi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYyLmMKQEAgLTMzNTcsNyArMzM1Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHdtODk2Ml90ZW1wbGF0ZV9jaGlwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2NoaXAgd204OTYyX3RlbXBsYXRlX2NoaXAgPSB7CiAJLmxhYmVsCQkJPSAid204OTYyIiwKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5yZXF1ZXN0CQk9IHdtODk2Ml9ncGlvX3JlcXVlc3QsCkBAIC0zNDc5LDcgKzM0NzksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTYyID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk2MiA9IHsKIAkucHJvYmUgPQl3bTg5NjJfcHJvYmUsCiAJLnJlbW92ZSA9CXdtODk2Ml9yZW1vdmUsCiAJLnNldF9iaWFzX2xldmVsID0gd204OTYyX3NldF9iaWFzX2xldmVsLApAQCAtMzcxMyw3ICszNzEzLDcgQEAKIAkJCQkJICAgIEFSUkFZX1NJWkUod204OTYyX2RjX21lYXN1cmUpKTsKIAkJaWYgKHJldCAhPSAwKQogCQkJZGV2X2VycigmaTJjLT5kZXYsCi0JCQkJIkZhaWxlZCB0byBjb25maWd1cmUgZm9yIERDIG1lc3VyZW1lbnQ6ICVkXG4iLAorCQkJCSJGYWlsZWQgdG8gY29uZmlndXJlIGZvciBEQyBtZWFzdXJlbWVudDogJWRcbiIsCiAJCQkJcmV0KTsKIAl9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTcxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk3MS5jCmluZGV4IDJjZGRlMzIuLjg4N2QzMWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTcxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NzEuYwpAQCAtNjQ5LDE3ICs2NDksMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk3MSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5NzEgPSB7CiAJLnByb2JlID0Jd204OTcxX3Byb2JlLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODk3MV9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSB3bTg5NzFfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODk3MV9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg5NzFfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg5NzFfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTg5NzFfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204OTcxX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODk3MV9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg5NzFfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg5NzFfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204OTcxX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg5NzFfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODk3MV9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB3bTg5NzFfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5NzQuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTc0LmMKaW5kZXggZGM4YzNiMS4uZDQxNGRkZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5NzQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk3NC5jCkBAIC02NzYsMTcgKzY3NiwxOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTc0ID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk3NCA9IHsKIAkucHJvYmUgPSAJd204OTc0X3Byb2JlLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODk3NF9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSB3bTg5NzRfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODk3NF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg5NzRfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg5NzRfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTg5NzRfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204OTc0X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODk3NF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg5NzRfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg5NzRfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204OTc0X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg5NzRfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODk3NF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgd204OTc0X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5NzguYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTc4LmMKaW5kZXggZDM2ZDYwMC4uOTBiMmQ0MSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5NzguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk3OC5jCkBAIC05OTMsMTggKzk5MywyMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTc4ID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk3OCA9IHsKIAkucHJvYmUgPQl3bTg5NzhfcHJvYmUsCiAJLnN1c3BlbmQgPQl3bTg5Nzhfc3VzcGVuZCwKIAkucmVzdW1lID0Jd204OTc4X3Jlc3VtZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg5Nzhfc2V0X2JpYXNfbGV2ZWwsCiAKLQkuY29udHJvbHMgPSB3bTg5Nzhfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODk3OF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg5NzhfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg5NzhfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTg5NzhfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204OTc4X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODk3OF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg5Nzhfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg5NzhfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204OTc4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg5NzhfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODk3OF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB3bTg5NzhfcmVnbWFwX2NvbmZpZyA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTgzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk4My5jCmluZGV4IDBjMDAyYTUuLmJmZGJlNzIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTgzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5ODMuYwpAQCAtOTc2LDE2ICs5NzYsMTggQEAKIAkuc3ltbWV0cmljX3JhdGVzID0gMQogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk4MyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5ODMgPSB7CiAJLnByb2JlID0gd204OTgzX3Byb2JlLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODk4M19zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCi0JLmNvbnRyb2xzID0gd204OTgzX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg5ODNfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204OTgzX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204OTgzX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204OTgzX2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg5ODNfYXVkaW9fbWFwKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODk4M19zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg5ODNfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg5ODNfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204OTgzX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg5ODNfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg5ODNfYXVkaW9fbWFwKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHdtODk4M19yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk4NS5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5ODUuYwppbmRleCA3MzQ3YWJmLi4wNTM0NGY5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk4NS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTg1LmMKQEAgLTExMDUsMTcgKzExMDUsMTkgQEAKIAkuc3ltbWV0cmljX3JhdGVzID0gMQogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk4NSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5ODUgPSB7CiAJLnByb2JlID0gd204OTg1X3Byb2JlLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODk4NV9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSB3bTg5ODVfY29tbW9uX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg5ODVfY29tbW9uX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODk4NV9jb21tb25fZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg5ODVfY29tbW9uX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204OTg1X2NvbW1vbl9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg5ODVfY29tbW9uX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODk4NV9jb21tb25fc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204OTg1X2NvbW1vbl9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODk4NV9jb21tb25fZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204OTg1X2NvbW1vbl9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204OTg1X2NvbW1vbl9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204OTg1X2NvbW1vbl9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB3bTg5ODVfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5ODguYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTg4LmMKaW5kZXggODk1NzIxYTIuLmIwZDAyMTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTg4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5ODguYwpAQCAtODE3LDEyICs4MTcsMTQgQEAKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg5ODhfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gd204OTg4X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg5ODhfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204OTg4X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204OTg4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204OTg4X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODk4OF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg5ODhfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204OTg4X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204OTg4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODk4OF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204OTg4X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg5ODhfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgd204OTg4X3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5MC5jCmluZGV4IDIzZWNkMzAuLmE4OTQ1MDAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTAuYwpAQCAtMTI5NCwxNyArMTI5NCwxOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTkwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk5MCA9IHsKIAkucHJvYmUgPQl3bTg5OTBfcHJvYmUsCiAJLnNldF9iaWFzX2xldmVsID0gd204OTkwX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9CXdtODk5MF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204OTkwX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODk5MF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODk5MF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9CXdtODk5MF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg5OTBfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204OTkwX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODk5MF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODk5MF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg5OTBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODk5MF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204OTkwX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHdtODk5MF9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5MS5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTEuYwppbmRleCBjOWVlMGFjLi44MDJjMDY5NCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5OTEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5MS5jCkBAIC0xMTEsMTQgKzExMSwyNCBAQAogCX0KIH0KIAotc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX0xJTkVBUihyZWNfbWl4X3RsdiwgLTE1MDAsIDYwMCk7Ci1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTElORUFSKGluX3BnYV90bHYsIC0xNjUwLCAzMDAwKTsKLXN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIob3V0X21peF90bHYsIDAsIC0yMTAwKTsKLXN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIob3V0X3BnYV90bHYsIC03MzAwLCA2MDApOwotc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX0xJTkVBUihvdXRfb21peF90bHYsIC02MDAsIDApOwotc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX0xJTkVBUihvdXRfZGFjX3RsdiwgLTcxNjMsIDApOwotc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX0xJTkVBUihpbl9hZGNfdGx2LCAtNzE2MywgMTc2Myk7Ci1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTElORUFSKG91dF9zaWRldG9uZV90bHYsIC0zNjAwLCAwKTsKK3N0YXRpYyBjb25zdCBTTkRSVl9DVExfVExWRF9ERUNMQVJFX0RCX1NDQUxFKGluX3BnYV90bHYsIC0xNjUwLCAxNTAsIDApOworc3RhdGljIGNvbnN0IFNORFJWX0NUTF9UTFZEX0RFQ0xBUkVfREJfU0NBTEUob3V0X21peF90bHYsIC0yMTAwLCAzMDAsIDApOworc3RhdGljIGNvbnN0IFNORFJWX0NUTF9UTFZEX0RFQ0xBUkVfREJfUkFOR0Uob3V0X3BnYV90bHYsCisJMHgwMCwgMHgyZiwgU05EUlZfQ1RMX1RMVkRfREJfU0NBTEVfSVRFTShTTkRSVl9DVExfVExWRF9EQl9HQUlOX01VVEUsIDAsIDEpLAorCTB4MzAsIDB4N2YsIFNORFJWX0NUTF9UTFZEX0RCX1NDQUxFX0lURU0oLTczMDAsIDEwMCwgMCksCispOworc3RhdGljIGNvbnN0IFNORFJWX0NUTF9UTFZEX0RFQ0xBUkVfREJfUkFOR0Uob3V0X2RhY190bHYsCisJMHgwMCwgMHhiZiwgU05EUlZfQ1RMX1RMVkRfREJfU0NBTEVfSVRFTSgtNzE2MjUsIDM3NSwgMSksCisJMHhjMCwgMHhmZiwgU05EUlZfQ1RMX1RMVkRfREJfU0NBTEVfSVRFTSgwLCAwLCAwKSwKKyk7CitzdGF0aWMgY29uc3QgU05EUlZfQ1RMX1RMVkRfREVDTEFSRV9EQl9SQU5HRShpbl9hZGNfdGx2LAorCTB4MDAsIDB4ZWYsIFNORFJWX0NUTF9UTFZEX0RCX1NDQUxFX0lURU0oLTcxNjI1LCAzNzUsIDEpLAorCTB4ZjAsIDB4ZmYsIFNORFJWX0NUTF9UTFZEX0RCX1NDQUxFX0lURU0oMTc2MjUsIDAsIDApLAorKTsKK3N0YXRpYyBjb25zdCBTTkRSVl9DVExfVExWRF9ERUNMQVJFX0RCX1JBTkdFKG91dF9zaWRldG9uZV90bHYsCisJMHgwMCwgMHgwYywgU05EUlZfQ1RMX1RMVkRfREJfU0NBTEVfSVRFTSgtMzYwMCwgMzAwLCAwKSwKKwkweDBkLCAweDBmLCBTTkRSVl9DVExfVExWRF9EQl9TQ0FMRV9JVEVNKDAsIDAsIDApLAorKTsKIAogc3RhdGljIGludCB3bTg5OXhfb3V0cGdhX3B1dF92b2xzd192dShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKQEAgLTM5OCw3ICs0MDgsNyBAQAogfQogCiAvKiBJTk1JWCBkQiB2YWx1ZXMgKi8KLXN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIoaW5fbWl4X3RsdiwgLTEyMDAsIDYwMCk7CitzdGF0aWMgY29uc3QgU05EUlZfQ1RMX1RMVkRfREVDTEFSRV9EQl9TQ0FMRShpbl9taXhfdGx2LCAtMTIwMCwgMzAwLCAxKTsKIAogLyogTGVmdCBJbiBQR0EgQ29ubmVjdGlvbnMgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg5OTFfZGFwbV9saW4xMl9wZ2FfY29udHJvbHNbXSA9IHsKQEAgLTEyMzIsMTYgKzEyNDIsMTggQEAKIAkub3BzID0gJndtODk5MV9vcHMKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5OTEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTkxID0gewogCS5zZXRfYmlhc19sZXZlbCA9IHdtODk5MV9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSB3bTg5OTFfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODk5MV9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg5OTFfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg5OTFfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTg5OTFfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204OTkxX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODk5MV9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg5OTFfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg5OTFfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204OTkxX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg5OTFfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODk5MV9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB3bTg5OTFfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5OTMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkzLmMKaW5kZXggODY2OGM0Yy4uMTk1ZjdiZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5OTMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5My5jCkBAIC0xNjEzLDcgKzE2MTMsNyBAQAogCS5udW1fcmVnX2RlZmF1bHRzID0gQVJSQVlfU0laRSh3bTg5OTNfcmVnX2RlZmF1bHRzKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5OTMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTkzID0gewogCS5wcm9iZSA9IAl3bTg5OTNfcHJvYmUsCiAJLnN1c3BlbmQgPQl3bTg5OTNfc3VzcGVuZCwKIAkucmVzdW1lID0Jd204OTkzX3Jlc3VtZSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk0LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC5jCmluZGV4IGExOGFlY2IuLjM4OTY1MjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk0LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTQuYwpAQCAtNDQzOSw3ICs0NDM5LDcgQEAKIAlyZXR1cm4gY29udHJvbC0+cmVnbWFwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTk0ID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk5NCA9IHsKIAkucHJvYmUgPQl3bTg5OTRfY29kZWNfcHJvYmUsCiAJLnJlbW92ZSA9CXdtODk5NF9jb2RlY19yZW1vdmUsCiAJLnN1c3BlbmQgPQl3bTg5OTRfY29kZWNfc3VzcGVuZCwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk1LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5NS5jCmluZGV4IDI0NTAwYmEuLjE5YjA4YTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk1LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTUuYwpAQCAtMjE5MiwxMiArMjE5MiwxNCBAQAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODk5NV9zZXRfYmlhc19sZXZlbCwKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSB3bTg5OTVfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODk5NV9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg5OTVfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg5OTVfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTg5OTVfaW50ZXJjb24sCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204OTk1X2ludGVyY29uKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODk5NV9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg5OTVfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg5OTVfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204OTk1X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg5OTVfaW50ZXJjb24sCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODk5NV9pbnRlcmNvbiksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB3bTg5OTVfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5OTYuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk2LmMKaW5kZXggYTczMDQ0Mi4uOGFmZmE0OSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5OTYuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5Ni5jCkBAIC0yMTg0LDcgKzIxODQsNyBAQAogCQkJCSAgKDEgPDwgV004OTk2X0dQMV9ESVJfU0hJRlQpKTsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgd204OTk2X3RlbXBsYXRlX2NoaXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCB3bTg5OTZfdGVtcGxhdGVfY2hpcCA9IHsKIAkubGFiZWwJCQk9ICJ3bTg5OTYiLAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLmRpcmVjdGlvbl9vdXRwdXQJPSB3bTg5OTZfZ3Bpb19kaXJlY3Rpb25fb3V0LApAQCAtMjY4NCwxOCArMjY4NCwyMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTk2ID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk5NiA9IHsKIAkucHJvYmUgPQl3bTg5OTZfcHJvYmUsCiAJLnJlbW92ZSA9CXdtODk5Nl9yZW1vdmUsCiAJLnNldF9iaWFzX2xldmVsID0gd204OTk2X3NldF9iaWFzX2xldmVsLAogCS5pZGxlX2JpYXNfb2ZmCT0gdHJ1ZSwKIAkuc2VxX25vdGlmaWVyID0gd204OTk2X3NlcV9ub3RpZmllciwKLQkuY29udHJvbHMgPSB3bTg5OTZfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODk5Nl9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg5OTZfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg5OTZfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTg5OTZfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204OTk2X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODk5Nl9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg5OTZfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg5OTZfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204OTk2X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg5OTZfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODk5Nl9kYXBtX3JvdXRlcyksCisJfSwKIAkuc2V0X3BsbCA9IHdtODk5Nl9zZXRfZmxsLAogfTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5OTcuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk3LmMKaW5kZXggNmIwNzg1Yi4uMmYyODIxYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5OTcuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5Ny5jCkBAIC0xMDk1LDcgKzEwOTUsNyBAQAogCXJldHVybiBwcml2LT5jb3JlLmFyaXpvbmEtPnJlZ21hcDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk5NyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5OTcgPSB7CiAJLnByb2JlID0gd204OTk3X2NvZGVjX3Byb2JlLAogCS5yZW1vdmUgPSB3bTg5OTdfY29kZWNfcmVtb3ZlLAogCS5nZXRfcmVnbWFwID0gICB3bTg5OTdfZ2V0X3JlZ21hcCwKQEAgLTExMDUsMTIgKzExMDUsMTQgQEAKIAkuc2V0X3N5c2NsayA9IGFyaXpvbmFfc2V0X3N5c2NsaywKIAkuc2V0X3BsbCA9IHdtODk5N19zZXRfZmxsLAogCi0JLmNvbnRyb2xzID0gd204OTk3X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg5OTdfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204OTk3X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204OTk3X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204OTk3X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODk5N19kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg5OTdfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204OTk3X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204OTk3X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODk5N19kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204OTk3X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg5OTdfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IHdtODk5N19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5OTguYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk4LmMKaW5kZXggM2E1Yzg5Ni4uYmNjMmUxMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5OTguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5OC5jCkBAIC05NjYsNiArOTY2LDE2IEBACiAJeyAiSU4yQSIsIE5VTEwsICJTWVNDTEsiIH0sCiAJeyAiSU4yQiIsIE5VTEwsICJTWVNDTEsiIH0sCiAKKwl7ICJBU1JDMUwiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIkFTUkMxUiIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiQVNSQzJMIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBU1JDMlIiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCisJeyAiQVNSQzFMIiwgTlVMTCwgIkFTWU5DQ0xLIiB9LAorCXsgIkFTUkMxUiIsIE5VTEwsICJBU1lOQ0NMSyIgfSwKKwl7ICJBU1JDMkwiLCBOVUxMLCAiQVNZTkNDTEsiIH0sCisJeyAiQVNSQzJSIiwgTlVMTCwgIkFTWU5DQ0xLIiB9LAorCiAJeyAiU1BEMSIsIE5VTEwsICJTWVNDTEsiIH0sCiAJeyAiU1BEMSIsIE5VTEwsICJTUEQxVFgxIiB9LAogCXsgIlNQRDEiLCBOVUxMLCAiU1BEMVRYMiIgfSwKQEAgLTEzNTEsNyArMTM2MSw3IEBACiAJcmV0dXJuIHByaXYtPmNvcmUuYXJpem9uYS0+cmVnbWFwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTk4ID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk5OCA9IHsKIAkucHJvYmUgPSB3bTg5OThfY29kZWNfcHJvYmUsCiAJLnJlbW92ZSA9IHdtODk5OF9jb2RlY19yZW1vdmUsCiAJLmdldF9yZWdtYXAgPSB3bTg5OThfZ2V0X3JlZ21hcCwKQEAgLTEzNjEsMTIgKzEzNzEsMTQgQEAKIAkuc2V0X3N5c2NsayA9IGFyaXpvbmFfc2V0X3N5c2NsaywKIAkuc2V0X3BsbCA9IHdtODk5OF9zZXRfZmxsLAogCi0JLmNvbnRyb2xzID0gd204OTk4X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg5OThfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204OTk4X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204OTk4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204OTk4X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODk5OF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg5OThfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204OTk4X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204OTk4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODk5OF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204OTk4X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg5OThfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IHdtODk5OF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTkwODEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd205MDgxLmMKaW5kZXggMzYzYjNiNi4uODU2ODY3ZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTkwODEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTA4MS5jCkBAIC0xMjc0LDcgKzEyNzQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd205MDgxID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtOTA4MSA9IHsKIAkucHJvYmUgPSAJd205MDgxX3Byb2JlLAogCiAJLnNldF9zeXNjbGsgPSB3bTkwODFfc2V0X3N5c2NsaywKQEAgLTEyODIsMTIgKzEyODIsMTQgQEAKIAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyAgICAgICAgID0gd205MDgxX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzICAgICA9IEFSUkFZX1NJWkUod205MDgxX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cwkgID0gd205MDgxX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod205MDgxX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzICAgICA9IHdtOTA4MV9hdWRpb19wYXRocywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTkwODFfYXVkaW9fcGF0aHMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd205MDgxX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtOTA4MV9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtOTA4MV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTkwODFfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtOTA4MV9hdWRpb19wYXRocywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod205MDgxX2F1ZGlvX3BhdGhzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHdtOTA4MV9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtOTA5MC5jIGIvc291bmQvc29jL2NvZGVjcy93bTkwOTAuYwppbmRleCA1ZDczNzI5Li41YTEzMTM4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtOTA5MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd205MDkwLmMKQEAgLTU1MCw3ICs1NTAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd205MDkwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtOTA5MCA9IHsKIAkucHJvYmUgPSAJd205MDkwX3Byb2JlLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtOTA5MF9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtOTcwNS5jIGIvc291bmQvc29jL2NvZGVjcy93bTk3MDUuYwppbmRleCA3NDQ4NDJjLi5kY2RkMDU1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtOTcwNS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd205NzA1LmMKQEAgLTM1Miw3ICszNTIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd205NzA1ID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtOTcwNSA9IHsKIAkucHJvYmUgPSAJd205NzA1X3NvY19wcm9iZSwKIAkucmVtb3ZlID0gCXdtOTcwNV9zb2NfcmVtb3ZlLAogCS5zdXNwZW5kID0Jd205NzA1X3NvY19zdXNwZW5kLApAQCAtMzY0LDEyICszNjQsMTQgQEAKIAkucmVnX2NhY2hlX3N0ZXAgPSAyLAogCS5yZWdfY2FjaGVfZGVmYXVsdCA9IHdtOTcwNV9yZWcsCiAKLQkuY29udHJvbHMgPSB3bTk3MDVfc25kX2FjOTdfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod205NzA1X3NuZF9hYzk3X2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd205NzA1X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod205NzA1X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd205NzA1X2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTk3MDVfYXVkaW9fbWFwKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtOTcwNV9zbmRfYWM5N19jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtOTcwNV9zbmRfYWM5N19jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd205NzA1X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtOTcwNV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd205NzA1X2F1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod205NzA1X2F1ZGlvX21hcCksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgd205NzA1X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtOTcxMi5jIGIvc291bmQvc29jL2NvZGVjcy93bTk3MTIuYwppbmRleCA0ODhhOTIyLi41NTc3MDllIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtOTcxMi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd205NzEyLmMKQEAgLTY2OSw3ICs2NjksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd205NzEyID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtOTcxMiA9IHsKIAkucHJvYmUgPSAJd205NzEyX3NvY19wcm9iZSwKIAkucmVtb3ZlID0gCXdtOTcxMl9zb2NfcmVtb3ZlLAogCS5yZXN1bWUgPQl3bTk3MTJfc29jX3Jlc3VtZSwKQEAgLTY4MiwxMiArNjgyLDE0IEBACiAJLnJlZ19jYWNoZV9zdGVwID0gMiwKIAkucmVnX2NhY2hlX2RlZmF1bHQgPSB3bTk3MTJfcmVnLAogCi0JLmNvbnRyb2xzID0gd205NzEyX3NuZF9hYzk3X2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtOTcxMl9zbmRfYWM5N19jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtOTcxMl9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtOTcxMl9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtOTcxMl9hdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod205NzEyX2F1ZGlvX21hcCksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTk3MTJfc25kX2FjOTdfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTk3MTJfc25kX2FjOTdfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtOTcxMl9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTk3MTJfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtOTcxMl9hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtOTcxMl9hdWRpb19tYXApLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IHdtOTcxMl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTk3MTMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd205NzEzLmMKaW5kZXggOTg0OTY0My4uZTQzMDFkZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTk3MTMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTcxMy5jCkBAIC0xMjM1LDE5ICsxMjM1LDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTk3MTMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd205NzEzID0gewogCS5wcm9iZSA9IAl3bTk3MTNfc29jX3Byb2JlLAogCS5yZW1vdmUgPSAJd205NzEzX3NvY19yZW1vdmUsCiAJLnN1c3BlbmQgPQl3bTk3MTNfc29jX3N1c3BlbmQsCiAJLnJlc3VtZSA9IAl3bTk3MTNfc29jX3Jlc3VtZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTk3MTNfc2V0X2JpYXNfbGV2ZWwsCiAKLQkuY29udHJvbHMgPSB3bTk3MTNfc25kX2FjOTdfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod205NzEzX3NuZF9hYzk3X2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd205NzEzX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod205NzEzX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd205NzEzX2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTk3MTNfYXVkaW9fbWFwKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtOTcxM19zbmRfYWM5N19jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtOTcxM19zbmRfYWM5N19jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd205NzEzX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtOTcxM19kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd205NzEzX2F1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod205NzEzX2F1ZGlvX21hcCksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgd205NzEzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtX2Fkc3AuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd21fYWRzcC5jCmluZGV4IDIxZmJlN2QuLmI5NDNkZGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd21fYWRzcC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd21fYWRzcC5jCkBAIC00ODAsNyArNDgwLDcgQEAKIAogCW11dGV4X2xvY2soJmRzcC0+cHdyX2xvY2spOwogCi0JaWYgKCFkc3AtPndtZndfZmlsZV9uYW1lIHx8ICFkc3AtPnJ1bm5pbmcpCisJaWYgKCFkc3AtPndtZndfZmlsZV9uYW1lIHx8ICFkc3AtPmJvb3RlZCkKIAkJcmV0ID0gMDsKIAllbHNlCiAJCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywKQEAgLTUwMCw3ICs1MDAsNyBAQAogCiAJbXV0ZXhfbG9jaygmZHNwLT5wd3JfbG9jayk7CiAKLQlpZiAoIWRzcC0+YmluX2ZpbGVfbmFtZSB8fCAhZHNwLT5ydW5uaW5nKQorCWlmICghZHNwLT5iaW5fZmlsZV9uYW1lIHx8ICFkc3AtPmJvb3RlZCkKIAkJcmV0ID0gMDsKIAllbHNlCiAJCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywKQEAgLTU1NCw2ICs1NTQsOSBAQAogCWlmICghcm9vdCkKIAkJZ290byBlcnI7CiAKKwlpZiAoIWRlYnVnZnNfY3JlYXRlX2Jvb2woImJvb3RlZCIsIFNfSVJVR08sIHJvb3QsICZkc3AtPmJvb3RlZCkpCisJCWdvdG8gZXJyOworCiAJaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV9ib29sKCJydW5uaW5nIiwgU19JUlVHTywgcm9vdCwgJmRzcC0+cnVubmluZykpCiAJCWdvdG8gZXJyOwogCkBAIC02MzcsNyArNjQwLDcgQEAKIAogCW11dGV4X2xvY2soJmRzcFtlLT5zaGlmdF9sXS5wd3JfbG9jayk7CiAKLQlpZiAoZHNwW2UtPnNoaWZ0X2xdLnJ1bm5pbmcgfHwgZHNwW2UtPnNoaWZ0X2xdLmNvbXByKQorCWlmIChkc3BbZS0+c2hpZnRfbF0uYm9vdGVkIHx8IGRzcFtlLT5zaGlmdF9sXS5jb21wcikKIAkJcmV0ID0gLUVCVVNZOwogCWVsc2UKIAkJZHNwW2UtPnNoaWZ0X2xdLmZ3ID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKQEAgLTc4OSw3ICs3OTIsNyBAQAogCW1lbWNweShjdGwtPmNhY2hlLCBwLCBjdGwtPmxlbik7CiAKIAljdGwtPnNldCA9IDE7Ci0JaWYgKGN0bC0+ZW5hYmxlZCkKKwlpZiAoY3RsLT5lbmFibGVkICYmIGN0bC0+ZHNwLT5ydW5uaW5nKQogCQlyZXQgPSB3bV9jb2VmZl93cml0ZV9jb250cm9sKGN0bCwgcCwgY3RsLT5sZW4pOwogCiAJbXV0ZXhfdW5sb2NrKCZjdGwtPmRzcC0+cHdyX2xvY2spOwpAQCAtODExLDcgKzgxNCw3IEBACiAJCXJldCA9IC1FRkFVTFQ7CiAJfSBlbHNlIHsKIAkJY3RsLT5zZXQgPSAxOwotCQlpZiAoY3RsLT5lbmFibGVkKQorCQlpZiAoY3RsLT5lbmFibGVkICYmIGN0bC0+ZHNwLT5ydW5uaW5nKQogCQkJcmV0ID0gd21fY29lZmZfd3JpdGVfY29udHJvbChjdGwsIGN0bC0+Y2FjaGUsIHNpemUpOwogCX0KIApAQCAtODcxLDEyICs4NzQsMTIgQEAKIAltdXRleF9sb2NrKCZjdGwtPmRzcC0+cHdyX2xvY2spOwogCiAJaWYgKGN0bC0+ZmxhZ3MgJiBXTUZXX0NUTF9GTEFHX1ZPTEFUSUxFKSB7Ci0JCWlmIChjdGwtPmVuYWJsZWQpCisJCWlmIChjdGwtPmVuYWJsZWQgJiYgY3RsLT5kc3AtPnJ1bm5pbmcpCiAJCQlyZXQgPSB3bV9jb2VmZl9yZWFkX2NvbnRyb2woY3RsLCBwLCBjdGwtPmxlbik7CiAJCWVsc2UKIAkJCXJldCA9IC1FUEVSTTsKIAl9IGVsc2UgewotCQlpZiAoIWN0bC0+ZmxhZ3MgJiYgY3RsLT5lbmFibGVkKQorCQlpZiAoIWN0bC0+ZmxhZ3MgJiYgY3RsLT5lbmFibGVkICYmIGN0bC0+ZHNwLT5ydW5uaW5nKQogCQkJcmV0ID0gd21fY29lZmZfcmVhZF9jb250cm9sKGN0bCwgY3RsLT5jYWNoZSwgY3RsLT5sZW4pOwogCiAJCW1lbWNweShwLCBjdGwtPmNhY2hlLCBjdGwtPmxlbik7CkBAIC04OTgsMTIgKzkwMSwxMiBAQAogCW11dGV4X2xvY2soJmN0bC0+ZHNwLT5wd3JfbG9jayk7CiAKIAlpZiAoY3RsLT5mbGFncyAmIFdNRldfQ1RMX0ZMQUdfVk9MQVRJTEUpIHsKLQkJaWYgKGN0bC0+ZW5hYmxlZCkKKwkJaWYgKGN0bC0+ZW5hYmxlZCAmJiBjdGwtPmRzcC0+cnVubmluZykKIAkJCXJldCA9IHdtX2NvZWZmX3JlYWRfY29udHJvbChjdGwsIGN0bC0+Y2FjaGUsIHNpemUpOwogCQllbHNlCiAJCQlyZXQgPSAtRVBFUk07CiAJfSBlbHNlIHsKLQkJaWYgKCFjdGwtPmZsYWdzICYmIGN0bC0+ZW5hYmxlZCkKKwkJaWYgKCFjdGwtPmZsYWdzICYmIGN0bC0+ZW5hYmxlZCAmJiBjdGwtPmRzcC0+cnVubmluZykKIAkJCXJldCA9IHdtX2NvZWZmX3JlYWRfY29udHJvbChjdGwsIGN0bC0+Y2FjaGUsIHNpemUpOwogCX0KIApAQCAtMjE2NiwxMyArMjE2OSwyMCBAQAogCQlpZiAocmV0ICE9IDApCiAJCQlnb3RvIGVycl9lbmE7CiAKKwkJZHNwLT5ib290ZWQgPSB0cnVlOworCiAJCS8qIFN0YXJ0IHRoZSBjb3JlIHJ1bm5pbmcgKi8KIAkJcmVnbWFwX3VwZGF0ZV9iaXRzKGRzcC0+cmVnbWFwLCBkc3AtPmJhc2UgKyBBRFNQMV9DT05UUk9MXzMwLAogCQkJCSAgIEFEU1AxX0NPUkVfRU5BIHwgQURTUDFfU1RBUlQsCiAJCQkJICAgQURTUDFfQ09SRV9FTkEgfCBBRFNQMV9TVEFSVCk7CisKKwkJZHNwLT5ydW5uaW5nID0gdHJ1ZTsKIAkJYnJlYWs7CiAKIAljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgorCQlkc3AtPnJ1bm5pbmcgPSBmYWxzZTsKKwkJZHNwLT5ib290ZWQgPSBmYWxzZTsKKwogCQkvKiBIYWx0IHRoZSBjb3JlICovCiAJCXJlZ21hcF91cGRhdGVfYml0cyhkc3AtPnJlZ21hcCwgZHNwLT5iYXNlICsgQURTUDFfQ09OVFJPTF8zMCwKIAkJCQkgICBBRFNQMV9DT1JFX0VOQSB8IEFEU1AxX1NUQVJULCAwKTsKQEAgLTIyMjcsNyArMjIzNyw3IEBACiAJCWlmICh2YWwgJiBBRFNQMl9SQU1fUkRZKQogCQkJYnJlYWs7CiAKLQkJbXNsZWVwKDEpOworCQl1c2xlZXBfcmFuZ2UoMjUwLCA1MDApOwogCX0KIAogCWlmICghKHZhbCAmIEFEU1AyX1JBTV9SRFkpKSB7CkBAIC0yMjQ5LDYgKzIyNTksMTEgQEAKIAogCW11dGV4X2xvY2soJmRzcC0+cHdyX2xvY2spOwogCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGRzcC0+cmVnbWFwLCBkc3AtPmJhc2UgKyBBRFNQMl9DT05UUk9MLAorCQkJCSBBRFNQMl9NRU1fRU5BLCBBRFNQMl9NRU1fRU5BKTsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gZXJyX211dGV4OworCiAJcmV0ID0gd21fYWRzcDJfZW5hKGRzcCk7CiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIGVycl9tdXRleDsKQEAgLTIyNzAsMTMgKzIyODUsMTQgQEAKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gZXJyX2VuYTsKIAotCS8qIFN5bmMgc2V0IGNvbnRyb2xzICovCi0JcmV0ID0gd21fY29lZmZfc3luY19jb250cm9scyhkc3ApOworCWRzcC0+Ym9vdGVkID0gdHJ1ZTsKKworCS8qIFR1cm4gRFNQIGJhY2sgb2ZmIHVudGlsIHdlIGFyZSByZWFkeSB0byBydW4gKi8KKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoZHNwLT5yZWdtYXAsIGRzcC0+YmFzZSArIEFEU1AyX0NPTlRST0wsCisJCQkJIEFEU1AyX1NZU19FTkEsIDApOwogCWlmIChyZXQgIT0gMCkKIAkJZ290byBlcnJfZW5hOwogCi0JZHNwLT5ydW5uaW5nID0gdHJ1ZTsKLQogCW11dGV4X3VubG9jaygmZHNwLT5wd3JfbG9jayk7CiAKIAlyZXR1cm47CkBAIC0yMzA3LDYgKzIzMjMsNyBAQAogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKIAlzdHJ1Y3Qgd21fYWRzcCAqZHNwcyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCXN0cnVjdCB3bV9hZHNwICpkc3AgPSAmZHNwc1t3LT5zaGlmdF07CisJc3RydWN0IHdtX2NvZWZmX2N0bCAqY3RsOwogCiAJZHNwLT5jYXJkID0gY29kZWMtPmNvbXBvbmVudC5jYXJkOwogCkBAIC0yMzE1LDYgKzIzMzIsMjQgQEAKIAkJd21fYWRzcDJfc2V0X2RzcGNsayhkc3AsIGZyZXEpOwogCQlxdWV1ZV93b3JrKHN5c3RlbV91bmJvdW5kX3dxLCAmZHNwLT5ib290X3dvcmspOwogCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgorCQl3bV9hZHNwX2RlYnVnZnNfY2xlYXIoZHNwKTsKKworCQlkc3AtPmZ3X2lkID0gMDsKKwkJZHNwLT5md19pZF92ZXJzaW9uID0gMDsKKworCQlkc3AtPmJvb3RlZCA9IGZhbHNlOworCisJCXJlZ21hcF91cGRhdGVfYml0cyhkc3AtPnJlZ21hcCwgZHNwLT5iYXNlICsgQURTUDJfQ09OVFJPTCwKKwkJCQkgICBBRFNQMl9NRU1fRU5BLCAwKTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN0bCwgJmRzcC0+Y3RsX2xpc3QsIGxpc3QpCisJCQljdGwtPmVuYWJsZWQgPSAwOworCisJCXdtX2Fkc3BfZnJlZV9hbGdfcmVnaW9ucyhkc3ApOworCisJCWFkc3BfZGJnKGRzcCwgIlNodXRkb3duIGNvbXBsZXRlXG4iKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQpAQCAtMjMyOSwxNiArMjM2NCwyNCBAQAogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKIAlzdHJ1Y3Qgd21fYWRzcCAqZHNwcyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCXN0cnVjdCB3bV9hZHNwICpkc3AgPSAmZHNwc1t3LT5zaGlmdF07Ci0Jc3RydWN0IHdtX2NvZWZmX2N0bCAqY3RsOwogCWludCByZXQ7CiAKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CiAJCWZsdXNoX3dvcmsoJmRzcC0+Ym9vdF93b3JrKTsKIAotCQlpZiAoIWRzcC0+cnVubmluZykKKwkJaWYgKCFkc3AtPmJvb3RlZCkKIAkJCXJldHVybiAtRUlPOwogCisJCXJldCA9IHdtX2Fkc3AyX2VuYShkc3ApOworCQlpZiAocmV0ICE9IDApCisJCQlnb3RvIGVycjsKKworCQkvKiBTeW5jIHNldCBjb250cm9scyAqLworCQlyZXQgPSB3bV9jb2VmZl9zeW5jX2NvbnRyb2xzKGRzcCk7CisJCWlmIChyZXQgIT0gMCkKKwkJCWdvdG8gZXJyOworCiAJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhkc3AtPnJlZ21hcCwKIAkJCQkJIGRzcC0+YmFzZSArIEFEU1AyX0NPTlRST0wsCiAJCQkJCSBBRFNQMl9DT1JFX0VOQSB8IEFEU1AyX1NUQVJULApAQCAtMjM0Niw2ICsyMzg5LDggQEAKIAkJaWYgKHJldCAhPSAwKQogCQkJZ290byBlcnI7CiAKKwkJZHNwLT5ydW5uaW5nID0gdHJ1ZTsKKwogCQltdXRleF9sb2NrKCZkc3AtPnB3cl9sb2NrKTsKIAogCQlpZiAod21fYWRzcF9md1tkc3AtPmZ3XS5udW1fY2FwcyAhPSAwKQpAQCAtMjM2MSwxMCArMjQwNiw2IEBACiAKIAkJbXV0ZXhfbG9jaygmZHNwLT5wd3JfbG9jayk7CiAKLQkJd21fYWRzcF9kZWJ1Z2ZzX2NsZWFyKGRzcCk7Ci0KLQkJZHNwLT5md19pZCA9IDA7Ci0JCWRzcC0+ZndfaWRfdmVyc2lvbiA9IDA7CiAJCWRzcC0+cnVubmluZyA9IGZhbHNlOwogCiAJCXJlZ21hcF91cGRhdGVfYml0cyhkc3AtPnJlZ21hcCwgZHNwLT5iYXNlICsgQURTUDJfQ09OVFJPTCwKQEAgLTIzNzgsMTcgKzI0MTksMTIgQEAKIAkJcmVnbWFwX3VwZGF0ZV9iaXRzKGRzcC0+cmVnbWFwLCBkc3AtPmJhc2UgKyBBRFNQMl9DT05UUk9MLAogCQkJCSAgIEFEU1AyX1NZU19FTkEsIDApOwogCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkoY3RsLCAmZHNwLT5jdGxfbGlzdCwgbGlzdCkKLQkJCWN0bC0+ZW5hYmxlZCA9IDA7Ci0KLQkJd21fYWRzcF9mcmVlX2FsZ19yZWdpb25zKGRzcCk7Ci0KIAkJaWYgKHdtX2Fkc3BfZndbZHNwLT5md10ubnVtX2NhcHMgIT0gMCkKIAkJCXdtX2Fkc3BfYnVmZmVyX2ZyZWUoZHNwKTsKIAogCQltdXRleF91bmxvY2soJmRzcC0+cHdyX2xvY2spOwogCi0JCWFkc3BfZGJnKGRzcCwgIlNodXRkb3duIGNvbXBsZXRlXG4iKTsKKwkJYWRzcF9kYmcoZHNwLCAiRXhlY3V0aW9uIHN0b3BwZWRcbiIpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtX2Fkc3AuaCBiL3NvdW5kL3NvYy9jb2RlY3Mvd21fYWRzcC5oCmluZGV4IGJlM2I1YmMuLjM2MmRkN2MgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd21fYWRzcC5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd21fYWRzcC5oCkBAIC02MSw2ICs2MSw4IEBACiAKIAlpbnQgZnc7CiAJaW50IGZ3X3ZlcjsKKworCWJvb2wgYm9vdGVkOwogCWJvb2wgcnVubmluZzsKIAogCXN0cnVjdCBsaXN0X2hlYWQgY3RsX2xpc3Q7CkBAIC04NSw5ICs4NywxMCBAQAogCQl3bV9hZHNwMV9ldmVudCwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQpCiAKICNkZWZpbmUgV01fQURTUDIod25hbWUsIG51bSwgZXZlbnRfZm4pIFwKLXsJLmlkID0gc25kX3NvY19kYXBtX2RhaV9saW5rLCAubmFtZSA9IHduYW1lICIgUHJlbG9hZGVyIiwgXAorewkuaWQgPSBzbmRfc29jX2RhcG1fc3VwcGx5LCAubmFtZSA9IHduYW1lICIgUHJlbG9hZGVyIiwgXAogCS5yZWcgPSBTTkRfU09DX05PUE0sIC5zaGlmdCA9IG51bSwgLmV2ZW50ID0gZXZlbnRfZm4sIFwKLQkuZXZlbnRfZmxhZ3MgPSBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCB9LCBcCisJLmV2ZW50X2ZsYWdzID0gU05EX1NPQ19EQVBNX1BSRV9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCwgXAorCS5zdWJzZXEgPSAxMDAsIC8qIEVuc3VyZSB3ZSBydW4gYWZ0ZXIgU1lTQ0xLIHN1cHBseSB3aWRnZXQgKi8gfSwgXAogewkuaWQgPSBzbmRfc29jX2RhcG1fb3V0X2RydiwgLm5hbWUgPSB3bmFtZSwgXAogCS5yZWcgPSBTTkRfU09DX05PUE0sIC5zaGlmdCA9IG51bSwgLmV2ZW50ID0gd21fYWRzcDJfZXZlbnQsIFwKIAkuZXZlbnRfZmxhZ3MgPSBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCB9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLW1jYXNwLmMgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLW1jYXNwLmMKaW5kZXggMDVjMmQzMy4uM2M1YTk4MCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1tY2FzcC5jCisrKyBiL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktbWNhc3AuYwpAQCAtMTIxOCw3ICsxMjE4LDcgQEAKIAogCXNuZF9tYXNrX25vbmUoJm5mbXQpOwogCi0JZm9yIChpID0gMDsgaSA8IFNORFJWX1BDTV9GT1JNQVRfTEFTVDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8PSBTTkRSVl9QQ01fRk9STUFUX0xBU1Q7IGkrKykgewogCQlpZiAoc25kX21hc2tfdGVzdChmbXQsIGkpKSB7CiAJCQl1aW50IHNiaXRzID0gc25kX3BjbV9mb3JtYXRfd2lkdGgoaSk7CiAJCQlpbnQgcHBtOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2R3Yy9kZXNpZ253YXJlX2kycy5jIGIvc291bmQvc29jL2R3Yy9kZXNpZ253YXJlX2kycy5jCmluZGV4IGRjOTdmNDMuLjI5OTg5NTRhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZHdjL2Rlc2lnbndhcmVfaTJzLmMKKysrIGIvc291bmQvc29jL2R3Yy9kZXNpZ253YXJlX2kycy5jCkBAIC01NzcsNyArNTc3LDYgQEAKIAkJZGV2LT5jYXBhYmlsaXR5IHw9IERXQ19JMlNfUExBWTsKIAkJZGV2LT5wbGF5X2RtYV9kYXRhLmR0LmFkZHIgPSByZXMtPnN0YXJ0ICsgSTJTX1RYRE1BOwogCQlkZXYtPnBsYXlfZG1hX2RhdGEuZHQuYWRkcl93aWR0aCA9IGJ1c193aWR0aHNbaWR4XTsKLQkJZGV2LT5wbGF5X2RtYV9kYXRhLmR0LmNoYW5fbmFtZSA9ICJUWCI7CiAJCWRldi0+cGxheV9kbWFfZGF0YS5kdC5maWZvX3NpemUgPSBmaWZvX2RlcHRoICoKIAkJCShmaWZvX3dpZHRoW2lkeDJdKSA+PiA4OwogCQlkZXYtPnBsYXlfZG1hX2RhdGEuZHQubWF4YnVyc3QgPSAxNjsKQEAgLTU4OCw3ICs1ODcsNiBAQAogCQlkZXYtPmNhcGFiaWxpdHkgfD0gRFdDX0kyU19SRUNPUkQ7CiAJCWRldi0+Y2FwdHVyZV9kbWFfZGF0YS5kdC5hZGRyID0gcmVzLT5zdGFydCArIEkyU19SWERNQTsKIAkJZGV2LT5jYXB0dXJlX2RtYV9kYXRhLmR0LmFkZHJfd2lkdGggPSBidXNfd2lkdGhzW2lkeF07Ci0JCWRldi0+Y2FwdHVyZV9kbWFfZGF0YS5kdC5jaGFuX25hbWUgPSAiUlgiOwogCQlkZXYtPmNhcHR1cmVfZG1hX2RhdGEuZHQuZmlmb19zaXplID0gZmlmb19kZXB0aCAqCiAJCQkoZmlmb193aWR0aFtpZHgyXSA+PiA4KTsKIAkJZGV2LT5jYXB0dXJlX2RtYV9kYXRhLmR0Lm1heGJ1cnN0ID0gMTY7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZnNsL2ZzbF9hc3JjLmMgYi9zb3VuZC9zb2MvZnNsL2ZzbF9hc3JjLmMKaW5kZXggYzFhMGUwMS4uMWQ4MmY2OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ZzbC9mc2xfYXNyYy5jCisrKyBiL3NvdW5kL3NvYy9mc2wvZnNsX2FzcmMuYwpAQCAtNzI2LDcgKzcyNiw3IEBACiAJLnJlYWRhYmxlX3JlZyA9IGZzbF9hc3JjX3JlYWRhYmxlX3JlZywKIAkudm9sYXRpbGVfcmVnID0gZnNsX2FzcmNfdm9sYXRpbGVfcmVnLAogCS53cml0ZWFibGVfcmVnID0gZnNsX2FzcmNfd3JpdGVhYmxlX3JlZywKLQkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX0ZMQVQsCiB9OwogCiAvKioKQEAgLTg3OSw3ICs4NzksNyBAQAogCQl9CiAJfQogCi0JaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKHBkZXYtPmRldi5vZl9ub2RlLCAiZnNsLGlteDM1LWFzcmMiKSkgeworCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImZzbCxpbXgzNS1hc3JjIikpIHsKIAkJYXNyY19wcml2LT5jaGFubmVsX2JpdHMgPSAzOwogCQljbGtfbWFwW0lOXSA9IGlucHV0X2Nsa19tYXBfaW14MzU7CiAJCWNsa19tYXBbT1VUXSA9IG91dHB1dF9jbGtfbWFwX2lteDM1OwpAQCAtODkyLDcgKzg5Miw3IEBACiAJcmV0ID0gZnNsX2FzcmNfaW5pdChhc3JjX3ByaXYpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGluaXQgYXNyYyAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiByZXQ7CiAJfQogCiAJYXNyY19wcml2LT5jaGFubmVsX2F2YWlsID0gMTA7CkBAIC05MDEsMTQgKzkwMSwxNCBAQAogCQkJCSAgICZhc3JjX3ByaXYtPmFzcmNfcmF0ZSk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IG91dHB1dCByYXRlXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiByZXQ7CiAJfQogCiAJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJmc2wsYXNyYy13aWR0aCIsCiAJCQkJICAgJmFzcmNfcHJpdi0+YXNyY193aWR0aCk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IG91dHB1dCB3aWR0aFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gcmV0OwogCX0KIAogCWlmIChhc3JjX3ByaXYtPmFzcmNfd2lkdGggIT0gMTYgJiYgYXNyY19wcml2LT5hc3JjX3dpZHRoICE9IDI0KSB7CkBAIC05MzMsOCArOTMzLDYgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiZHJpdmVyIHJlZ2lzdGVyZWRcbiIpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9mc2wvZnNsX2FzcmNfZG1hLmMgYi9zb3VuZC9zb2MvZnNsL2ZzbF9hc3JjX2RtYS5jCmluZGV4IGZmYzAwMGIuLmRjMzBkNzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvZnNsX2FzcmNfZG1hLmMKKysrIGIvc291bmQvc29jL2ZzbC9mc2xfYXNyY19kbWEuYwpAQCAtMzIyLDcgKzMyMiw3IEBACiAJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIHBhaXItPnBvcyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgZnNsX2FzcmNfZG1hX3BjbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIGZzbF9hc3JjX2RtYV9wY21fb3BzID0gewogCS5pb2N0bAkJPSBzbmRfcGNtX2xpYl9pb2N0bCwKIAkuaHdfcGFyYW1zCT0gZnNsX2FzcmNfZG1hX2h3X3BhcmFtcywKIAkuaHdfZnJlZQk9IGZzbF9hc3JjX2RtYV9od19mcmVlLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9mc2xfZXNhaS5jIGIvc291bmQvc29jL2ZzbC9mc2xfZXNhaS5jCmluZGV4IDI2YTkwZTEuLjM4YmZkNDYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvZnNsX2VzYWkuYworKysgYi9zb3VuZC9zb2MvZnNsL2ZzbF9lc2FpLmMKQEAgLTc3LDE5ICs3NywxOSBAQAogCXJlZ21hcF9yZWFkKGVzYWlfcHJpdi0+cmVnbWFwLCBSRUdfRVNBSV9FU1IsICZlc3IpOwogCiAJaWYgKGVzciAmIEVTQUlfRVNSX1RJTklUX01BU0spCi0JCWRldl9kYmcoJnBkZXYtPmRldiwgImlzcjogVHJhbnNtaXRpb24gSW5pdGlhbGl6ZWRcbiIpOworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJpc3I6IFRyYW5zbWlzc2lvbiBJbml0aWFsaXplZFxuIik7CiAKIAlpZiAoZXNyICYgRVNBSV9FU1JfUkZGX01BU0spCiAJCWRldl93YXJuKCZwZGV2LT5kZXYsICJpc3I6IFJlY2VpdmluZyBvdmVycnVuXG4iKTsKIAogCWlmIChlc3IgJiBFU0FJX0VTUl9URkVfTUFTSykKLQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImlzcjogVHJhbnNtaXRpb24gdW5kZXJydW5cbiIpOworCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiaXNyOiBUcmFuc21pc3Npb24gdW5kZXJydW5cbiIpOwogCiAJaWYgKGVzciAmIEVTQUlfRVNSX1RMU19NQVNLKQogCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJpc3I6IEp1c3QgdHJhbnNtaXR0ZWQgdGhlIGxhc3Qgc2xvdFxuIik7CiAKIAlpZiAoZXNyICYgRVNBSV9FU1JfVERFX01BU0spCi0JCWRldl9kYmcoJnBkZXYtPmRldiwgImlzcjogVHJhbnNtaXRpb24gZGF0YSBleGNlcHRpb25cbiIpOworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJpc3I6IFRyYW5zbWlzc2lvbiBkYXRhIGV4Y2VwdGlvblxuIik7CiAKIAlpZiAoZXNyICYgRVNBSV9FU1JfVEVEX01BU0spCiAJCWRldl9kYmcoJnBkZXYtPmRldiwgImlzcjogVHJhbnNtaXR0aW5nIGV2ZW4gc2xvdHNcbiIpOwpAQCAtNzgxLDcgKzc4MSw3IEBACiAJLnJlYWRhYmxlX3JlZyA9IGZzbF9lc2FpX3JlYWRhYmxlX3JlZywKIAkudm9sYXRpbGVfcmVnID0gZnNsX2VzYWlfdm9sYXRpbGVfcmVnLAogCS53cml0ZWFibGVfcmVnID0gZnNsX2VzYWlfd3JpdGVhYmxlX3JlZywKLQkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX0ZMQVQsCiB9OwogCiBzdGF0aWMgaW50IGZzbF9lc2FpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZnNsL2ZzbF9zYWkuYyBiL3NvdW5kL3NvYy9mc2wvZnNsX3NhaS5jCmluZGV4IDIxNDc5OTQuLjlmYWRmN2UgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvZnNsX3NhaS5jCisrKyBiL3NvdW5kL3NvYy9mc2wvZnNsX3NhaS5jCkBAIC04MDEsOCArODAxLDggQEAKIAogCXNhaS0+cGRldiA9IHBkZXY7CiAKLQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocGRldi0+ZGV2Lm9mX25vZGUsICJmc2wsaW14NnN4LXNhaSIpIHx8Ci0JICAgIG9mX2RldmljZV9pc19jb21wYXRpYmxlKHBkZXYtPmRldi5vZl9ub2RlLCAiZnNsLGlteDZ1bC1zYWkiKSkKKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJmc2wsaW14NnN4LXNhaSIpIHx8CisJICAgIG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiZnNsLGlteDZ1bC1zYWkiKSkKIAkJc2FpLT5zYWlfb25faW14ID0gdHJ1ZTsKIAogCXNhaS0+aXNfbHNiX2ZpcnN0ID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAibHNiLWZpcnN0Iik7CkBAIC04ODMsNyArODgzLDcgQEAKIAl9CiAKIAlpZiAob2ZfZmluZF9wcm9wZXJ0eShucCwgImZzbCxzYWktbWNsay1kaXJlY3Rpb24tb3V0cHV0IiwgTlVMTCkgJiYKLQkgICAgb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocGRldi0+ZGV2Lm9mX25vZGUsICJmc2wsaW14NnVsLXNhaSIpKSB7CisJICAgIG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiZnNsLGlteDZ1bC1zYWkiKSkgewogCQlncHIgPSBzeXNjb25fcmVnbWFwX2xvb2t1cF9ieV9jb21wYXRpYmxlKCJmc2wsaW14NnVsLWlvbXV4Yy1ncHIiKTsKIAkJaWYgKElTX0VSUihncHIpKSB7CiAJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgZmluZCBpb211eGMgcmVnaXN0ZXJzXG4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9mc2wvZnNsX3NwZGlmLmMgYi9zb3VuZC9zb2MvZnNsL2ZzbF9zcGRpZi5jCmluZGV4IGJlZWM3OTMuLjFmZjQ2N2MgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvZnNsX3NwZGlmLmMKKysrIGIvc291bmQvc29jL2ZzbC9mc2xfc3BkaWYuYwpAQCAtMTEwMyw3ICsxMTAzLDcgQEAKIAkucmVhZGFibGVfcmVnID0gZnNsX3NwZGlmX3JlYWRhYmxlX3JlZywKIAkudm9sYXRpbGVfcmVnID0gZnNsX3NwZGlmX3ZvbGF0aWxlX3JlZywKIAkud3JpdGVhYmxlX3JlZyA9IGZzbF9zcGRpZl93cml0ZWFibGVfcmVnLAotCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfRkxBVCwKIH07CiAKIHN0YXRpYyB1MzIgZnNsX3NwZGlmX3R4Y2xrX2NhbGRpdihzdHJ1Y3QgZnNsX3NwZGlmX3ByaXYgKnNwZGlmX3ByaXYsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZnNsL2ZzbF9zc2kuYyBiL3NvdW5kL3NvYy9mc2wvZnNsX3NzaS5jCmluZGV4IGJlZGVjNGEuLjUwMzQ5NDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvZnNsX3NzaS5jCisrKyBiL3NvdW5kL3NvYy9mc2wvZnNsX3NzaS5jCkBAIC0xODIsNyArMTgyLDcgQEAKIAkudm9sYXRpbGVfcmVnID0gZnNsX3NzaV92b2xhdGlsZV9yZWcsCiAJLnByZWNpb3VzX3JlZyA9IGZzbF9zc2lfcHJlY2lvdXNfcmVnLAogCS53cml0ZWFibGVfcmVnID0gZnNsX3NzaV93cml0ZWFibGVfcmVnLAotCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfRkxBVCwKIH07CiAKIHN0cnVjdCBmc2xfc3NpX3NvY19kYXRhIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9nZW5lcmljL0tjb25maWcgYi9zb3VuZC9zb2MvZ2VuZXJpYy9LY29uZmlnCmluZGV4IGMwMWM1ZGQuLmQwMjM5NTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9nZW5lcmljL0tjb25maWcKKysrIGIvc291bmQvc29jL2dlbmVyaWMvS2NvbmZpZwpAQCAtNiwzICs2LDExIEBACiAJc2VsZWN0IFNORF9TSU1QTEVfQ0FSRF9VVElMUwogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgZ2VuZXJpYyBzaW1wbGUgc291bmQgY2FyZCBzdXBwb3J0CisKK2NvbmZpZyBTTkRfU0lNUExFX1NDVV9DQVJECisJdHJpc3RhdGUgIkFTb0MgU2ltcGxlIFNDVSBzb3VuZCBjYXJkIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBPRgorCXNlbGVjdCBTTkRfU0lNUExFX0NBUkRfVVRJTFMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIGdlbmVyaWMgc2ltcGxlIFNDVSBzb3VuZCBjYXJkIHN1cHBvcnQuCisJICBJdCBzdXBwb3J0cyBEUENNIG9mIG11bHRpIENQVSBzaW5nbGUgQ29kZWMgc3lzdGVtLgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2dlbmVyaWMvTWFrZWZpbGUgYi9zb3VuZC9zb2MvZ2VuZXJpYy9NYWtlZmlsZQppbmRleCA0NTYwMmNhLi5lZTc1MGYzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZ2VuZXJpYy9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2MvZ2VuZXJpYy9NYWtlZmlsZQpAQCAtMSw1ICsxLDcgQEAKLW9iai0kKENPTkZJR19TTkRfU0lNUExFX0NBUkRfVVRJTFMpIDo9IHNpbXBsZS1jYXJkLXV0aWxzLm8KLQorc25kLXNvYy1zaW1wbGUtY2FyZC11dGlscy1vYmpzCTo9IHNpbXBsZS1jYXJkLXV0aWxzLm8KIHNuZC1zb2Mtc2ltcGxlLWNhcmQtb2Jqcwk6PSBzaW1wbGUtY2FyZC5vCitzbmQtc29jLXNpbXBsZS1zY3UtY2FyZC1vYmpzCTo9IHNpbXBsZS1zY3UtY2FyZC5vCiAKLW9iai0kKENPTkZJR19TTkRfU0lNUExFX0NBUkQpCSs9IHNuZC1zb2Mtc2ltcGxlLWNhcmQubworb2JqLSQoQ09ORklHX1NORF9TSU1QTEVfQ0FSRF9VVElMUykJKz0gc25kLXNvYy1zaW1wbGUtY2FyZC11dGlscy5vCitvYmotJChDT05GSUdfU05EX1NJTVBMRV9DQVJEKQkJKz0gc25kLXNvYy1zaW1wbGUtY2FyZC5vCitvYmotJChDT05GSUdfU05EX1NJTVBMRV9TQ1VfQ0FSRCkJKz0gc25kLXNvYy1zaW1wbGUtc2N1LWNhcmQubwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2dlbmVyaWMvc2ltcGxlLWNhcmQtdXRpbHMuYyBiL3NvdW5kL3NvYy9nZW5lcmljL3NpbXBsZS1jYXJkLXV0aWxzLmMKaW5kZXggZDg5YTlhMS4uMWNiMzkzMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2dlbmVyaWMvc2ltcGxlLWNhcmQtdXRpbHMuYworKysgYi9zb3VuZC9zb2MvZ2VuZXJpYy9zaW1wbGUtY2FyZC11dGlscy5jCkBAIC03LDYgKzcsOCBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxzb3VuZC9zaW1wbGVfY2FyZF91dGlscy5oPgogCkBAIC05NSwzICs5NywxNDggQEAKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfY2FyZF9uYW1lKTsKKworaW50IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfY2xrKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRhaV9vZl9ub2RlLAorCQkJICAgICAgIHN0cnVjdCBhc29jX3NpbXBsZV9kYWkgKnNpbXBsZV9kYWkpCit7CisJc3RydWN0IGNsayAqY2xrOworCXUzMiB2YWw7CisKKwkvKgorCSAqIFBhcnNlIGRhaS0+c3lzY2xrIGNvbWUgZnJvbSAiY2xvY2tzID0gPCZ4eHg+IgorCSAqIChpZiBzeXN0ZW0gaGFzIGNvbW1vbiBjbG9jaykKKwkgKiAgb3IgInN5c3RlbS1jbG9jay1mcmVxdWVuY3kgPSA8eHh4PiIKKwkgKiAgb3IgZGV2aWNlJ3MgbW9kdWxlIGNsb2NrLgorCSAqLworCWNsayA9IG9mX2Nsa19nZXQobm9kZSwgMCk7CisJaWYgKCFJU19FUlIoY2xrKSkgeworCQlzaW1wbGVfZGFpLT5zeXNjbGsgPSBjbGtfZ2V0X3JhdGUoY2xrKTsKKwkJc2ltcGxlX2RhaS0+Y2xrID0gY2xrOworCX0gZWxzZSBpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJzeXN0ZW0tY2xvY2stZnJlcXVlbmN5IiwgJnZhbCkpIHsKKwkJc2ltcGxlX2RhaS0+c3lzY2xrID0gdmFsOworCX0gZWxzZSB7CisJCWNsayA9IG9mX2Nsa19nZXQoZGFpX29mX25vZGUsIDApOworCQlpZiAoIUlTX0VSUihjbGspKQorCQkJc2ltcGxlX2RhaS0+c3lzY2xrID0gY2xrX2dldF9yYXRlKGNsayk7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2Nsayk7CisKK2ludCBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2RhaShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkJICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqKmRhaV9vZl9ub2RlLAorCQkJCSAgICBjb25zdCBjaGFyICoqZGFpX25hbWUsCisJCQkJICAgIGNvbnN0IGNoYXIgKmxpc3RfbmFtZSwKKwkJCQkgICAgY29uc3QgY2hhciAqY2VsbHNfbmFtZSwKKwkJCQkgICAgaW50ICppc19zaW5nbGVfbGluaykKK3sKKwlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzIGFyZ3M7CisJaW50IHJldDsKKworCWlmICghbm9kZSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIEdldCBub2RlIHZpYSAic291bmQtZGFpID0gPCZwaGFuZGxlIHBvcnQ+IgorCSAqIGl0IHdpbGwgYmUgdXNlZCBhcyB4eHhfb2Zfbm9kZSBvbiBzb2NfYmluZF9kYWlfbGluaygpCisJICovCisJcmV0ID0gb2ZfcGFyc2VfcGhhbmRsZV93aXRoX2FyZ3Mobm9kZSwgbGlzdF9uYW1lLCBjZWxsc19uYW1lLCAwLCAmYXJncyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIEdldCBkYWktPm5hbWUgKi8KKwlpZiAoZGFpX25hbWUpIHsKKwkJcmV0ID0gc25kX3NvY19vZl9nZXRfZGFpX25hbWUobm9kZSwgZGFpX25hbWUpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJKmRhaV9vZl9ub2RlID0gYXJncy5ucDsKKworCWlmIChpc19zaW5nbGVfbGluaykKKwkJKmlzX3NpbmdsZV9saW5rID0gIWFyZ3MuYXJnc19jb3VudDsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9kYWkpOworCitpbnQgYXNvY19zaW1wbGVfY2FyZF9pbml0X2RhaShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKKwkJCSAgICAgIHN0cnVjdCBhc29jX3NpbXBsZV9kYWkgKnNpbXBsZV9kYWkpCit7CisJaW50IHJldDsKKworCWlmIChzaW1wbGVfZGFpLT5zeXNjbGspIHsKKwkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2NsayhkYWksIDAsIHNpbXBsZV9kYWktPnN5c2NsaywgMCk7CisJCWlmIChyZXQgJiYgcmV0ICE9IC1FTk9UU1VQUCkgeworCQkJZGV2X2VycihkYWktPmRldiwgInNpbXBsZS1jYXJkOiBzZXRfc3lzY2xrIGVycm9yXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlpZiAoc2ltcGxlX2RhaS0+c2xvdHMpIHsKKwkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3RkbV9zbG90KGRhaSwKKwkJCQkJICAgICAgIHNpbXBsZV9kYWktPnR4X3Nsb3RfbWFzaywKKwkJCQkJICAgICAgIHNpbXBsZV9kYWktPnJ4X3Nsb3RfbWFzaywKKwkJCQkJICAgICAgIHNpbXBsZV9kYWktPnNsb3RzLAorCQkJCQkgICAgICAgc2ltcGxlX2RhaS0+c2xvdF93aWR0aCk7CisJCWlmIChyZXQgJiYgcmV0ICE9IC1FTk9UU1VQUCkgeworCQkJZGV2X2VycihkYWktPmRldiwgInNpbXBsZS1jYXJkOiBzZXRfdGRtX3Nsb3QgZXJyb3JcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXNvY19zaW1wbGVfY2FyZF9pbml0X2RhaSk7CisKK2ludCBhc29jX3NpbXBsZV9jYXJkX2Nhbm9uaWNhbGl6ZV9kYWlsaW5rKHN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluaykKK3sKKwlpZiAoIWRhaV9saW5rLT5jcHVfZGFpX25hbWUgfHwgIWRhaV9saW5rLT5jb2RlY19kYWlfbmFtZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBBc3N1bWVzIHBsYXRmb3JtID09IGNwdSAqLworCWlmICghZGFpX2xpbmstPnBsYXRmb3JtX29mX25vZGUpCisJCWRhaV9saW5rLT5wbGF0Zm9ybV9vZl9ub2RlID0gZGFpX2xpbmstPmNwdV9vZl9ub2RlOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhc29jX3NpbXBsZV9jYXJkX2Nhbm9uaWNhbGl6ZV9kYWlsaW5rKTsKKwordm9pZCBhc29jX3NpbXBsZV9jYXJkX2Nhbm9uaWNhbGl6ZV9jcHUoc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rLAorCQkJCSAgICAgICBpbnQgaXNfc2luZ2xlX2xpbmtzKQoreworCS8qCisJICogSW4gc29jX2JpbmRfZGFpX2xpbmsoKSB3aWxsIGNoZWNrIGNwdSBuYW1lIGFmdGVyCisJICogb2Zfbm9kZSBtYXRjaGluZyBpZiBkYWlfbGluayBoYXMgY3B1X2RhaV9uYW1lLgorCSAqIGJ1dCwgaXQgd2lsbCBuZXZlciBtYXRjaCBpZiBuYW1lIHdhcyBjcmVhdGVkIGJ5CisJICogZm10X3NpbmdsZV9uYW1lKCkgcmVtb3ZlIGNwdV9kYWlfbmFtZSBpZiBjcHVfYXJncworCSAqIHdhcyAwLiBTZWU6CisJICoJZm10X3NpbmdsZV9uYW1lKCkKKwkgKglmbXRfbXVsdGlwbGVfbmFtZSgpCisJICovCisJaWYgKGlzX3NpbmdsZV9saW5rcykKKwkJZGFpX2xpbmstPmNwdV9kYWlfbmFtZSA9IE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhc29jX3NpbXBsZV9jYXJkX2Nhbm9uaWNhbGl6ZV9jcHUpOworCitpbnQgYXNvY19zaW1wbGVfY2FyZF9jbGVhbl9yZWZlcmVuY2Uoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbms7CisJaW50IG51bV9saW5rczsKKworCWZvciAobnVtX2xpbmtzID0gMCwgZGFpX2xpbmsgPSBjYXJkLT5kYWlfbGluazsKKwkgICAgIG51bV9saW5rcyA8IGNhcmQtPm51bV9saW5rczsKKwkgICAgIG51bV9saW5rcysrLCBkYWlfbGluaysrKSB7CisJCW9mX25vZGVfcHV0KGRhaV9saW5rLT5jcHVfb2Zfbm9kZSk7CisJCW9mX25vZGVfcHV0KGRhaV9saW5rLT5jb2RlY19vZl9ub2RlKTsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhc29jX3NpbXBsZV9jYXJkX2NsZWFuX3JlZmVyZW5jZSk7CisKKy8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLworTU9EVUxFX0FVVEhPUigiS3VuaW5vcmkgTW9yaW1vdG8gPGt1bmlub3JpLm1vcmltb3RvLmd4QHJlbmVzYXMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTFNBIFNvQyBTaW1wbGUgQ2FyZCBVdGlscyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2dlbmVyaWMvc2ltcGxlLWNhcmQuYyBiL3NvdW5kL3NvYy9nZW5lcmljL3NpbXBsZS1jYXJkLmMKaW5kZXggNDMyOTVmMC4uZjYwOGY4ZDIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9nZW5lcmljL3NpbXBsZS1jYXJkLmMKKysrIGIvc291bmQvc29jL2dlbmVyaWMvc2ltcGxlLWNhcmQuYwpAQCAtMzcsMTMgKzM3LDE1IEBACiAJdW5zaWduZWQgaW50IG1jbGtfZnM7CiAJc3RydWN0IGFzb2Nfc2ltcGxlX2phY2sgaHBfamFjazsKIAlzdHJ1Y3QgYXNvY19zaW1wbGVfamFjayBtaWNfamFjazsKLQlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBkYWlfbGlua1tdOwkvKiBkeW5hbWljYWxseSBhbGxvY2F0ZWQgKi8KKwlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbms7CiB9OwogCiAjZGVmaW5lIHNpbXBsZV9wcml2X3RvX2Rldihwcml2KSAoKHByaXYpLT5zbmRfY2FyZC5kZXYpCi0jZGVmaW5lIHNpbXBsZV9wcml2X3RvX2xpbmsocHJpdiwgaSkgKChwcml2KS0+c25kX2NhcmQuZGFpX2xpbmsgKyBpKQotI2RlZmluZSBzaW1wbGVfcHJpdl90b19wcm9wcyhwcml2LCBpKSAoKHByaXYpLT5kYWlfcHJvcHMgKyBpKQorI2RlZmluZSBzaW1wbGVfcHJpdl90b19saW5rKHByaXYsIGkpICgocHJpdiktPnNuZF9jYXJkLmRhaV9saW5rICsgKGkpKQorI2RlZmluZSBzaW1wbGVfcHJpdl90b19wcm9wcyhwcml2LCBpKSAoKHByaXYpLT5kYWlfcHJvcHMgKyAoaSkpCiAKKyNkZWZpbmUgREFJCSJzb3VuZC1kYWkiCisjZGVmaW5lIENFTEwJIiNzb3VuZC1kYWktY2VsbHMiCiAjZGVmaW5lIFBSRUZJWAkic2ltcGxlLWF1ZGlvLWNhcmQsIgogCiAjZGVmaW5lIGFzb2Nfc2ltcGxlX2NhcmRfaW5pdF9ocChjYXJkLCBzamFjaywgcHJlZml4KVwKQEAgLTExMiwxMyArMTE0LDEzIEBACiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzaW1wbGVfY2FyZF9kYXRhICpwcml2ID0Jc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKHJ0ZC0+Y2FyZCk7CiAJc3RydWN0IHNpbXBsZV9kYWlfcHJvcHMgKmRhaV9wcm9wcyA9Ci0JCSZwcml2LT5kYWlfcHJvcHNbcnRkLT5udW1dOworCQlzaW1wbGVfcHJpdl90b19wcm9wcyhwcml2LCBydGQtPm51bSk7CiAJaW50IHJldDsKIAogCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShkYWlfcHJvcHMtPmNwdV9kYWkuY2xrKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwotCQorCiAJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGRhaV9wcm9wcy0+Y29kZWNfZGFpLmNsayk7CiAJaWYgKHJldCkKIAkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRhaV9wcm9wcy0+Y3B1X2RhaS5jbGspOwpAQCAtMTMxLDcgKzEzMyw3IEBACiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzaW1wbGVfY2FyZF9kYXRhICpwcml2ID0Jc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKHJ0ZC0+Y2FyZCk7CiAJc3RydWN0IHNpbXBsZV9kYWlfcHJvcHMgKmRhaV9wcm9wcyA9Ci0JCSZwcml2LT5kYWlfcHJvcHNbcnRkLT5udW1dOworCQlzaW1wbGVfcHJpdl90b19wcm9wcyhwcml2LCBydGQtPm51bSk7CiAKIAljbGtfZGlzYWJsZV91bnByZXBhcmUoZGFpX3Byb3BzLT5jcHVfZGFpLmNsayk7CiAKQEAgLTE0NSw3ICsxNDcsOCBAQAogCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CiAJc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpID0gcnRkLT5jcHVfZGFpOwogCXN0cnVjdCBzaW1wbGVfY2FyZF9kYXRhICpwcml2ID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKHJ0ZC0+Y2FyZCk7Ci0Jc3RydWN0IHNpbXBsZV9kYWlfcHJvcHMgKmRhaV9wcm9wcyA9ICZwcml2LT5kYWlfcHJvcHNbcnRkLT5udW1dOworCXN0cnVjdCBzaW1wbGVfZGFpX3Byb3BzICpkYWlfcHJvcHMgPQorCQlzaW1wbGVfcHJpdl90b19wcm9wcyhwcml2LCBydGQtPm51bSk7CiAJdW5zaWduZWQgaW50IG1jbGssIG1jbGtfZnMgPSAwOwogCWludCByZXQgPSAwOwogCkBAIC0xNzcsNTEgKzE4MCwyMCBAQAogCS5od19wYXJhbXMgPSBhc29jX3NpbXBsZV9jYXJkX2h3X3BhcmFtcywKIH07CiAKLXN0YXRpYyBpbnQgX19hc29jX3NpbXBsZV9jYXJkX2RhaV9pbml0KHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAotCQkJCSAgICAgICBzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpICpzZXQpCi17Ci0JaW50IHJldDsKLQotCWlmIChzZXQtPnN5c2NsaykgewotCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGRhaSwgMCwgc2V0LT5zeXNjbGssIDApOwotCQlpZiAocmV0ICYmIHJldCAhPSAtRU5PVFNVUFApIHsKLQkJCWRldl9lcnIoZGFpLT5kZXYsICJzaW1wbGUtY2FyZDogc2V0X3N5c2NsayBlcnJvclxuIik7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0KLQotCWlmIChzZXQtPnNsb3RzKSB7Ci0JCXJldCA9IHNuZF9zb2NfZGFpX3NldF90ZG1fc2xvdChkYWksCi0JCQkJCSAgICAgICBzZXQtPnR4X3Nsb3RfbWFzaywKLQkJCQkJICAgICAgIHNldC0+cnhfc2xvdF9tYXNrLAotCQkJCQkJc2V0LT5zbG90cywKLQkJCQkJCXNldC0+c2xvdF93aWR0aCk7Ci0JCWlmIChyZXQgJiYgcmV0ICE9IC1FTk9UU1VQUCkgewotCQkJZGV2X2VycihkYWktPmRldiwgInNpbXBsZS1jYXJkOiBzZXRfdGRtX3Nsb3QgZXJyb3JcbiIpOwotCQkJZ290byBlcnI7Ci0JCX0KLQl9Ci0KLQlyZXQgPSAwOwotCi1lcnI6Ci0JcmV0dXJuIHJldDsKLX0KLQogc3RhdGljIGludCBhc29jX3NpbXBsZV9jYXJkX2RhaV9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CiAJc3RydWN0IHNpbXBsZV9jYXJkX2RhdGEgKnByaXYgPQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEocnRkLT5jYXJkKTsKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjID0gcnRkLT5jb2RlY19kYWk7CiAJc3RydWN0IHNuZF9zb2NfZGFpICpjcHUgPSBydGQtPmNwdV9kYWk7Ci0Jc3RydWN0IHNpbXBsZV9kYWlfcHJvcHMgKmRhaV9wcm9wczsKKwlzdHJ1Y3Qgc2ltcGxlX2RhaV9wcm9wcyAqZGFpX3Byb3BzID0KKwkJc2ltcGxlX3ByaXZfdG9fcHJvcHMocHJpdiwgcnRkLT5udW0pOwogCWludCByZXQ7CiAKLQlkYWlfcHJvcHMgPSAmcHJpdi0+ZGFpX3Byb3BzW3J0ZC0+bnVtXTsKLQlyZXQgPSBfX2Fzb2Nfc2ltcGxlX2NhcmRfZGFpX2luaXQoY29kZWMsICZkYWlfcHJvcHMtPmNvZGVjX2RhaSk7CisJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9pbml0X2RhaShjb2RlYywgJmRhaV9wcm9wcy0+Y29kZWNfZGFpKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IF9fYXNvY19zaW1wbGVfY2FyZF9kYWlfaW5pdChjcHUsICZkYWlfcHJvcHMtPmNwdV9kYWkpOworCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfaW5pdF9kYWkoY3B1LCAmZGFpX3Byb3BzLT5jcHVfZGFpKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMjM2LDc4ICsyMDgsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci1hc29jX3NpbXBsZV9jYXJkX3N1Yl9wYXJzZV9vZihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJICAgICAgc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSAqZGFpLAotCQkJICAgICAgc3RydWN0IGRldmljZV9ub2RlICoqcF9ub2RlLAotCQkJICAgICAgY29uc3QgY2hhciAqKm5hbWUsCi0JCQkgICAgICBpbnQgKmFyZ3NfY291bnQpCi17Ci0Jc3RydWN0IG9mX3BoYW5kbGVfYXJncyBhcmdzOwotCXN0cnVjdCBjbGsgKmNsazsKLQl1MzIgdmFsOwotCWludCByZXQ7Ci0KLQlpZiAoIW5wKQotCQlyZXR1cm4gMDsKLQotCS8qCi0JICogR2V0IG5vZGUgdmlhICJzb3VuZC1kYWkgPSA8JnBoYW5kbGUgcG9ydD4iCi0JICogaXQgd2lsbCBiZSB1c2VkIGFzIHh4eF9vZl9ub2RlIG9uIHNvY19iaW5kX2RhaV9saW5rKCkKLQkgKi8KLQlyZXQgPSBvZl9wYXJzZV9waGFuZGxlX3dpdGhfYXJncyhucCwgInNvdW5kLWRhaSIsCi0JCQkJCSAiI3NvdW5kLWRhaS1jZWxscyIsIDAsICZhcmdzKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JKnBfbm9kZSA9IGFyZ3MubnA7Ci0KLQlpZiAoYXJnc19jb3VudCkKLQkJKmFyZ3NfY291bnQgPSBhcmdzLmFyZ3NfY291bnQ7Ci0KLQkvKiBHZXQgZGFpLT5uYW1lICovCi0JaWYgKG5hbWUpIHsKLQkJcmV0ID0gc25kX3NvY19vZl9nZXRfZGFpX25hbWUobnAsIG5hbWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JaWYgKCFkYWkpCi0JCXJldHVybiAwOwotCi0JLyogUGFyc2UgVERNIHNsb3QgKi8KLQlyZXQgPSBzbmRfc29jX29mX3BhcnNlX3RkbV9zbG90KG5wLCAmZGFpLT50eF9zbG90X21hc2ssCi0JCQkJCSZkYWktPnJ4X3Nsb3RfbWFzaywKLQkJCQkJJmRhaS0+c2xvdHMsICZkYWktPnNsb3Rfd2lkdGgpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQkvKgotCSAqIFBhcnNlIGRhaS0+c3lzY2xrIGNvbWUgZnJvbSAiY2xvY2tzID0gPCZ4eHg+IgotCSAqIChpZiBzeXN0ZW0gaGFzIGNvbW1vbiBjbG9jaykKLQkgKiAgb3IgInN5c3RlbS1jbG9jay1mcmVxdWVuY3kgPSA8eHh4PiIKLQkgKiAgb3IgZGV2aWNlJ3MgbW9kdWxlIGNsb2NrLgotCSAqLwotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJjbG9ja3MiKSkgewotCQljbGsgPSBvZl9jbGtfZ2V0KG5wLCAwKTsKLQkJaWYgKElTX0VSUihjbGspKSB7Ci0JCQlyZXQgPSBQVFJfRVJSKGNsayk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJZGFpLT5zeXNjbGsgPSBjbGtfZ2V0X3JhdGUoY2xrKTsKLQkJZGFpLT5jbGsgPSBjbGs7Ci0JfSBlbHNlIGlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJzeXN0ZW0tY2xvY2stZnJlcXVlbmN5IiwgJnZhbCkpIHsKLQkJZGFpLT5zeXNjbGsgPSB2YWw7Ci0JfSBlbHNlIHsKLQkJY2xrID0gb2ZfY2xrX2dldChhcmdzLm5wLCAwKTsKLQkJaWYgKCFJU19FUlIoY2xrKSkKLQkJCWRhaS0+c3lzY2xrID0gY2xrX2dldF9yYXRlKGNsayk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgYXNvY19zaW1wbGVfY2FyZF9kYWlfbGlua19vZihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCiAJCQkJCXN0cnVjdCBzaW1wbGVfY2FyZF9kYXRhICpwcml2LAogCQkJCQlpbnQgaWR4LApAQCAtMzE2LDEzICsyMTYsMTQgQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBzaW1wbGVfcHJpdl90b19kZXYocHJpdik7CiAJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rID0gc2ltcGxlX3ByaXZfdG9fbGluayhwcml2LCBpZHgpOwogCXN0cnVjdCBzaW1wbGVfZGFpX3Byb3BzICpkYWlfcHJvcHMgPSBzaW1wbGVfcHJpdl90b19wcm9wcyhwcml2LCBpZHgpOworCXN0cnVjdCBhc29jX3NpbXBsZV9kYWkgKmNwdV9kYWkgPSAmZGFpX3Byb3BzLT5jcHVfZGFpOworCXN0cnVjdCBhc29jX3NpbXBsZV9kYWkgKmNvZGVjX2RhaSA9ICZkYWlfcHJvcHMtPmNvZGVjX2RhaTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdSA9IE5VTEw7CiAJc3RydWN0IGRldmljZV9ub2RlICpwbGF0ID0gTlVMTDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNvZGVjID0gTlVMTDsKIAljaGFyIHByb3BbMTI4XTsKIAljaGFyICpwcmVmaXggPSAiIjsKLQlpbnQgcmV0LCBjcHVfYXJnczsKLQl1MzIgdmFsOworCWludCByZXQsIHNpbmdsZV9jcHU7CiAKIAkvKiBGb3Igc2luZ2xlIERBSSBsaW5rICYgb2xkIHN0eWxlIG9mIERUIG5vZGUgKi8KIAlpZiAoaXNfdG9wX2xldmVsX25vZGUpCkBAIC0zNDgsMzYgKzI0OSw0NiBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIGRhaV9saW5rX29mX2VycjsKIAotCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgIm1jbGstZnMiLCAmdmFsKSkKLQkJZGFpX3Byb3BzLT5tY2xrX2ZzID0gdmFsOworCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJtY2xrLWZzIiwgJmRhaV9wcm9wcy0+bWNsa19mcyk7CiAKLQlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3N1Yl9wYXJzZV9vZihjcHUsICZkYWlfcHJvcHMtPmNwdV9kYWksCi0JCQkJCSAgICAmZGFpX2xpbmstPmNwdV9vZl9ub2RlLAotCQkJCQkgICAgJmRhaV9saW5rLT5jcHVfZGFpX25hbWUsCi0JCQkJCSAgICAmY3B1X2FyZ3MpOworCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfY3B1KGNwdSwgZGFpX2xpbmssCisJCQkJCSBEQUksIENFTEwsICZzaW5nbGVfY3B1KTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBkYWlfbGlua19vZl9lcnI7CiAKLQlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3N1Yl9wYXJzZV9vZihjb2RlYywgJmRhaV9wcm9wcy0+Y29kZWNfZGFpLAotCQkJCQkgICAgJmRhaV9saW5rLT5jb2RlY19vZl9ub2RlLAotCQkJCQkgICAgJmRhaV9saW5rLT5jb2RlY19kYWlfbmFtZSwgTlVMTCk7CisJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9jb2RlYyhjb2RlYywgZGFpX2xpbmssIERBSSwgQ0VMTCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZGFpX2xpbmtfb2ZfZXJyOwogCi0JcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9zdWJfcGFyc2Vfb2YocGxhdCwgTlVMTCwKLQkJCQkJICAgICZkYWlfbGluay0+cGxhdGZvcm1fb2Zfbm9kZSwKLQkJCQkJICAgIE5VTEwsIE5VTEwpOworCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfcGxhdGZvcm0ocGxhdCwgZGFpX2xpbmssIERBSSwgQ0VMTCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZGFpX2xpbmtfb2ZfZXJyOwogCi0JaWYgKCFkYWlfbGluay0+Y3B1X2RhaV9uYW1lIHx8ICFkYWlfbGluay0+Y29kZWNfZGFpX25hbWUpIHsKLQkJcmV0ID0gLUVJTlZBTDsKKwlyZXQgPSBzbmRfc29jX29mX3BhcnNlX3RkbV9zbG90KGNwdSwJJmNwdV9kYWktPnR4X3Nsb3RfbWFzaywKKwkJCQkJCSZjcHVfZGFpLT5yeF9zbG90X21hc2ssCisJCQkJCQkmY3B1X2RhaS0+c2xvdHMsCisJCQkJCQkmY3B1X2RhaS0+c2xvdF93aWR0aCk7CisJaWYgKHJldCA8IDApCiAJCWdvdG8gZGFpX2xpbmtfb2ZfZXJyOwotCX0KIAotCS8qIEFzc3VtZXMgcGxhdGZvcm0gPT0gY3B1ICovCi0JaWYgKCFkYWlfbGluay0+cGxhdGZvcm1fb2Zfbm9kZSkKLQkJZGFpX2xpbmstPnBsYXRmb3JtX29mX25vZGUgPSBkYWlfbGluay0+Y3B1X29mX25vZGU7CisJcmV0ID0gc25kX3NvY19vZl9wYXJzZV90ZG1fc2xvdChjb2RlYywJJmNvZGVjX2RhaS0+dHhfc2xvdF9tYXNrLAorCQkJCQkJJmNvZGVjX2RhaS0+cnhfc2xvdF9tYXNrLAorCQkJCQkJJmNvZGVjX2RhaS0+c2xvdHMsCisJCQkJCQkmY29kZWNfZGFpLT5zbG90X3dpZHRoKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBkYWlfbGlua19vZl9lcnI7CisKKwlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2Nsa19jcHUoY3B1LCBkYWlfbGluaywgY3B1X2RhaSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZGFpX2xpbmtfb2ZfZXJyOworCisJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9jbGtfY29kZWMoY29kZWMsIGRhaV9saW5rLCBjb2RlY19kYWkpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGRhaV9saW5rX29mX2VycjsKKworCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfY2Fub25pY2FsaXplX2RhaWxpbmsoZGFpX2xpbmspOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGRhaV9saW5rX29mX2VycjsKIAogCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfc2V0X2RhaWxpbmtfbmFtZShkZXYsIGRhaV9saW5rLAogCQkJCQkJIiVzLSVzIiwKQEAgLTM5OCwxNyArMzA5LDcgQEAKIAkJZGFpX2xpbmstPmNvZGVjX2RhaV9uYW1lLAogCQlkYWlfcHJvcHMtPmNvZGVjX2RhaS5zeXNjbGspOwogCi0JLyoKLQkgKiBJbiBzb2NfYmluZF9kYWlfbGluaygpIHdpbGwgY2hlY2sgY3B1IG5hbWUgYWZ0ZXIKLQkgKiBvZl9ub2RlIG1hdGNoaW5nIGlmIGRhaV9saW5rIGhhcyBjcHVfZGFpX25hbWUuCi0JICogYnV0LCBpdCB3aWxsIG5ldmVyIG1hdGNoIGlmIG5hbWUgd2FzIGNyZWF0ZWQgYnkKLQkgKiBmbXRfc2luZ2xlX25hbWUoKSByZW1vdmUgY3B1X2RhaV9uYW1lIGlmIGNwdV9hcmdzCi0JICogd2FzIDAuIFNlZToKLQkgKglmbXRfc2luZ2xlX25hbWUoKQotCSAqCWZtdF9tdWx0aXBsZV9uYW1lKCkKLQkgKi8KLQlpZiAoIWNwdV9hcmdzKQotCQlkYWlfbGluay0+Y3B1X2RhaV9uYW1lID0gTlVMTDsKKwlhc29jX3NpbXBsZV9jYXJkX2Nhbm9uaWNhbGl6ZV9jcHUoZGFpX2xpbmssIHNpbmdsZV9jcHUpOwogCiBkYWlfbGlua19vZl9lcnI6CiAJb2Zfbm9kZV9wdXQoY3B1KTsKQEAgLTQxNywyMiArMzE4LDU0IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2F1eF9kZXZzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCQkJICAgc3RydWN0IHNpbXBsZV9jYXJkX2RhdGEgKnByaXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gc2ltcGxlX3ByaXZfdG9fZGV2KHByaXYpOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqYXV4X25vZGU7CisJaW50IGksIG4sIGxlbjsKKworCWlmICghb2ZfZmluZF9wcm9wZXJ0eShub2RlLCBQUkVGSVggImF1eC1kZXZzIiwgJmxlbikpCisJCXJldHVybiAwOwkJLyogT2sgdG8gaGF2ZSBubyBhdXgtZGV2cyAqLworCisJbiA9IGxlbiAvIHNpemVvZihfX2JlMzIpOworCWlmIChuIDw9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcHJpdi0+c25kX2NhcmQuYXV4X2RldiA9IGRldm1fa3phbGxvYyhkZXYsCisJCQluICogc2l6ZW9mKCpwcml2LT5zbmRfY2FyZC5hdXhfZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2LT5zbmRfY2FyZC5hdXhfZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJYXV4X25vZGUgPSBvZl9wYXJzZV9waGFuZGxlKG5vZGUsIFBSRUZJWCAiYXV4LWRldnMiLCBpKTsKKwkJaWYgKCFhdXhfbm9kZSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlwcml2LT5zbmRfY2FyZC5hdXhfZGV2W2ldLmNvZGVjX29mX25vZGUgPSBhdXhfbm9kZTsKKwl9CisKKwlwcml2LT5zbmRfY2FyZC5udW1fYXV4X2RldnMgPSBuOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2Vfb2Yoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAogCQkJCSAgICAgc3RydWN0IHNpbXBsZV9jYXJkX2RhdGEgKnByaXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gc2ltcGxlX3ByaXZfdG9fZGV2KHByaXYpOwotCXUzMiB2YWw7CisJc3RydWN0IGRldmljZV9ub2RlICpkYWlfbGluazsKIAlpbnQgcmV0OwogCiAJaWYgKCFub2RlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWRhaV9saW5rID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUobm9kZSwgUFJFRklYICJkYWktbGluayIpOworCiAJLyogVGhlIG9mZi1jb2RlYyB3aWRnZXRzICovCiAJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChub2RlLCBQUkVGSVggIndpZGdldHMiKSkgewogCQlyZXQgPSBzbmRfc29jX29mX3BhcnNlX2F1ZGlvX3NpbXBsZV93aWRnZXRzKCZwcml2LT5zbmRfY2FyZCwKIAkJCQkJUFJFRklYICJ3aWRnZXRzIik7CiAJCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCQkJZ290byBjYXJkX3BhcnNlX2VuZDsKIAl9CiAKIAkvKiBEQVBNIHJvdXRlcyAqLwpAQCAtNDQwLDE2ICszNzMsMTQgQEAKIAkJcmV0ID0gc25kX3NvY19vZl9wYXJzZV9hdWRpb19yb3V0aW5nKCZwcml2LT5zbmRfY2FyZCwKIAkJCQkJUFJFRklYICJyb3V0aW5nIik7CiAJCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCQkJZ290byBjYXJkX3BhcnNlX2VuZDsKIAl9CiAKIAkvKiBGYWN0b3IgdG8gbWNsaywgdXNlZCBpbiBod19wYXJhbXMoKSAqLwotCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsIFBSRUZJWCAibWNsay1mcyIsICZ2YWwpOwotCWlmIChyZXQgPT0gMCkKLQkJcHJpdi0+bWNsa19mcyA9IHZhbDsKKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCBQUkVGSVggIm1jbGstZnMiLCAmcHJpdi0+bWNsa19mcyk7CiAKIAkvKiBTaW5nbGUvTXV0aSBEQUkgbGluayhzKSAmIE5ldyBzdHlsZSBvZiBEVCBub2RlICovCi0JaWYgKG9mX2dldF9jaGlsZF9ieV9uYW1lKG5vZGUsIFBSRUZJWCAiZGFpLWxpbmsiKSkgeworCWlmIChkYWlfbGluaykgewogCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gTlVMTDsKIAkJaW50IGkgPSAwOwogCkBAIC00NTksNyArMzkwLDcgQEAKIAkJCQkJCQkgICBpLCBmYWxzZSk7CiAJCQlpZiAocmV0IDwgMCkgewogCQkJCW9mX25vZGVfcHV0KG5wKTsKLQkJCQlyZXR1cm4gcmV0OworCQkJCWdvdG8gY2FyZF9wYXJzZV9lbmQ7CiAJCQl9CiAJCQlpKys7CiAJCX0KQEAgLTQ2Nyw2NiArMzk4LDU1IEBACiAJCS8qIEZvciBzaW5nbGUgREFJIGxpbmsgJiBvbGQgc3R5bGUgb2YgRFQgbm9kZSAqLwogCQlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX2RhaV9saW5rX29mKG5vZGUsIHByaXYsIDAsIHRydWUpOwogCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7CisJCQlnb3RvIGNhcmRfcGFyc2VfZW5kOwogCX0KIAogCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfY2FyZF9uYW1lKCZwcml2LT5zbmRfY2FyZCwgUFJFRklYKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCWlmIChyZXQgPCAwKQorCQlnb3RvIGNhcmRfcGFyc2VfZW5kOwogCi0JcmV0dXJuIDA7Ci19CisJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9hdXhfZGV2cyhub2RlLCBwcml2KTsKIAotLyogRGVjcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgZGV2aWNlIG5vZGVzICovCi1zdGF0aWMgaW50IGFzb2Nfc2ltcGxlX2NhcmRfdW5yZWYoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbms7Ci0JaW50IG51bV9saW5rczsKK2NhcmRfcGFyc2VfZW5kOgorCW9mX25vZGVfcHV0KGRhaV9saW5rKTsKIAotCWZvciAobnVtX2xpbmtzID0gMCwgZGFpX2xpbmsgPSBjYXJkLT5kYWlfbGluazsKLQkgICAgIG51bV9saW5rcyA8IGNhcmQtPm51bV9saW5rczsKLQkgICAgIG51bV9saW5rcysrLCBkYWlfbGluaysrKSB7Ci0JCW9mX25vZGVfcHV0KGRhaV9saW5rLT5jcHVfb2Zfbm9kZSk7Ci0JCW9mX25vZGVfcHV0KGRhaV9saW5rLT5jb2RlY19vZl9ub2RlKTsKLQl9Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBhc29jX3NpbXBsZV9jYXJkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHNpbXBsZV9jYXJkX2RhdGEgKnByaXY7CiAJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rOworCXN0cnVjdCBzaW1wbGVfZGFpX3Byb3BzICpkYWlfcHJvcHM7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Ci0JaW50IG51bV9saW5rcywgcmV0OworCWludCBudW0sIHJldDsKIAogCS8qIEdldCB0aGUgbnVtYmVyIG9mIERBSSBsaW5rcyAqLwogCWlmIChucCAmJiBvZl9nZXRfY2hpbGRfYnlfbmFtZShucCwgUFJFRklYICJkYWktbGluayIpKQotCQludW1fbGlua3MgPSBvZl9nZXRfY2hpbGRfY291bnQobnApOworCQludW0gPSBvZl9nZXRfY2hpbGRfY291bnQobnApOwogCWVsc2UKLQkJbnVtX2xpbmtzID0gMTsKKwkJbnVtID0gMTsKIAogCS8qIEFsbG9jYXRlIHRoZSBwcml2YXRlIGRhdGEgYW5kIHRoZSBEQUkgbGluayBhcnJheSAqLwotCXByaXYgPSBkZXZtX2t6YWxsb2MoZGV2LAotCQkJc2l6ZW9mKCpwcml2KSArIHNpemVvZigqZGFpX2xpbmspICogbnVtX2xpbmtzLAotCQkJR0ZQX0tFUk5FTCk7CisJcHJpdiA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcHJpdiksIEdGUF9LRVJORUwpOwogCWlmICghcHJpdikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQkvKiBJbml0IHNuZF9zb2NfY2FyZCAqLwotCXByaXYtPnNuZF9jYXJkLm93bmVyID0gVEhJU19NT0RVTEU7Ci0JcHJpdi0+c25kX2NhcmQuZGV2ID0gZGV2OwotCWRhaV9saW5rID0gcHJpdi0+ZGFpX2xpbms7Ci0JcHJpdi0+c25kX2NhcmQuZGFpX2xpbmsgPSBkYWlfbGluazsKLQlwcml2LT5zbmRfY2FyZC5udW1fbGlua3MgPSBudW1fbGlua3M7Ci0KLQkvKiBHZXQgcm9vbSBmb3IgdGhlIG90aGVyIHByb3BlcnRpZXMgKi8KLQlwcml2LT5kYWlfcHJvcHMgPSBkZXZtX2t6YWxsb2MoZGV2LAotCQkJc2l6ZW9mKCpwcml2LT5kYWlfcHJvcHMpICogbnVtX2xpbmtzLAotCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcml2LT5kYWlfcHJvcHMpCisJZGFpX3Byb3BzID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpkYWlfcHJvcHMpICogbnVtLCBHRlBfS0VSTkVMKTsKKwlkYWlfbGluayAgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRhaV9saW5rKSAgKiBudW0sIEdGUF9LRVJORUwpOworCWlmICghZGFpX3Byb3BzIHx8ICFkYWlfbGluaykKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlwcml2LT5kYWlfcHJvcHMJCQk9IGRhaV9wcm9wczsKKwlwcml2LT5kYWlfbGluawkJCT0gZGFpX2xpbms7CisKKwkvKiBJbml0IHNuZF9zb2NfY2FyZCAqLworCXByaXYtPnNuZF9jYXJkLm93bmVyCQk9IFRISVNfTU9EVUxFOworCXByaXYtPnNuZF9jYXJkLmRldgkJPSBkZXY7CisJcHJpdi0+c25kX2NhcmQuZGFpX2xpbmsJCT0gcHJpdi0+ZGFpX2xpbms7CisJcHJpdi0+c25kX2NhcmQubnVtX2xpbmtzCT0gbnVtOworCiAJaWYgKG5wICYmIG9mX2RldmljZV9pc19hdmFpbGFibGUobnApKSB7CiAKIAkJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9vZihucCwgcHJpdik7CkBAIC01NjcsNyArNDg3LDYgQEAKIAkJCQkJc2l6ZW9mKHByaXYtPmRhaV9wcm9wcy0+Y3B1X2RhaSkpOwogCQltZW1jcHkoJnByaXYtPmRhaV9wcm9wcy0+Y29kZWNfZGFpLCAmY2luZm8tPmNvZGVjX2RhaSwKIAkJCQkJc2l6ZW9mKHByaXYtPmRhaV9wcm9wcy0+Y29kZWNfZGFpKSk7Ci0KIAl9CiAKIAlzbmRfc29jX2NhcmRfc2V0X2RydmRhdGEoJnByaXYtPnNuZF9jYXJkLCBwcml2KTsKQEAgLTU3NSw5ICs0OTQsOSBAQAogCXJldCA9IGRldm1fc25kX3NvY19yZWdpc3Rlcl9jYXJkKCZwZGV2LT5kZXYsICZwcml2LT5zbmRfY2FyZCk7CiAJaWYgKHJldCA+PSAwKQogCQlyZXR1cm4gcmV0OwotCiBlcnI6Ci0JYXNvY19zaW1wbGVfY2FyZF91bnJlZigmcHJpdi0+c25kX2NhcmQpOworCWFzb2Nfc2ltcGxlX2NhcmRfY2xlYW5fcmVmZXJlbmNlKCZwcml2LT5zbmRfY2FyZCk7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC01ODksNyArNTA4LDcgQEAKIAlhc29jX3NpbXBsZV9jYXJkX3JlbW92ZV9qYWNrKCZwcml2LT5ocF9qYWNrKTsKIAlhc29jX3NpbXBsZV9jYXJkX3JlbW92ZV9qYWNrKCZwcml2LT5taWNfamFjayk7CiAKLQlyZXR1cm4gYXNvY19zaW1wbGVfY2FyZF91bnJlZihjYXJkKTsKKwlyZXR1cm4gYXNvY19zaW1wbGVfY2FyZF9jbGVhbl9yZWZlcmVuY2UoY2FyZCk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFzb2Nfc2ltcGxlX29mX21hdGNoW10gPSB7CkBAIC02MTEsNiArNTMwLDYgQEAKIG1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYXNvY19zaW1wbGVfY2FyZCk7CiAKIE1PRFVMRV9BTElBUygicGxhdGZvcm06YXNvYy1zaW1wbGUtY2FyZCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIFNpbXBsZSBTb3VuZCBDYXJkIik7CiBNT0RVTEVfQVVUSE9SKCJLdW5pbm9yaSBNb3JpbW90byA8a3VuaW5vcmkubW9yaW1vdG8uZ3hAcmVuZXNhcy5jb20+Iik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZ2VuZXJpYy9zaW1wbGUtc2N1LWNhcmQuYyBiL3NvdW5kL3NvYy9nZW5lcmljL3NpbXBsZS1zY3UtY2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5OTczYTUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvZ2VuZXJpYy9zaW1wbGUtc2N1LWNhcmQuYwpAQCAtMCwwICsxLDM0NSBAQAorLyoKKyAqIEFTb0Mgc2ltcGxlIFNDVSBzb3VuZCBjYXJkIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgUmVuZXNhcyBTb2x1dGlvbnMgQ29ycC4KKyAqIEt1bmlub3JpIE1vcmltb3RvIDxrdW5pbm9yaS5tb3JpbW90by5neEByZW5lc2FzLmNvbT4KKyAqCisgKiBiYXNlZCBvbiAke0xJTlVYfS9zb3VuZC9zb2MvZ2VuZXJpYy9zaW1wbGUtY2FyZC5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8c291bmQvamFjay5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy1kYWkuaD4KKyNpbmNsdWRlIDxzb3VuZC9zaW1wbGVfY2FyZF91dGlscy5oPgorCitzdHJ1Y3QgYXNvY19zaW1wbGVfY2FyZF9wcml2IHsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkIHNuZF9jYXJkOworCXN0cnVjdCBzbmRfc29jX2NvZGVjX2NvbmYgY29kZWNfY29uZjsKKwlzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpICpkYWlfcHJvcHM7CisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rOworCXUzMiBjb252ZXJ0X3JhdGU7CisJdTMyIGNvbnZlcnRfY2hhbm5lbHM7Cit9OworCisjZGVmaW5lIHNpbXBsZV9wcml2X3RvX2Rldihwcml2KSAoKHByaXYpLT5zbmRfY2FyZC5kZXYpCisjZGVmaW5lIHNpbXBsZV9wcml2X3RvX2xpbmsocHJpdiwgaSkgKChwcml2KS0+c25kX2NhcmQuZGFpX2xpbmsgKyAoaSkpCisjZGVmaW5lIHNpbXBsZV9wcml2X3RvX3Byb3BzKHByaXYsIGkpICgocHJpdiktPmRhaV9wcm9wcyArIChpKSkKKworI2RlZmluZSBEQUkJInNvdW5kLWRhaSIKKyNkZWZpbmUgQ0VMTAkiI3NvdW5kLWRhaS1jZWxscyIKKyNkZWZpbmUgUFJFRklYCSJzaW1wbGUtYXVkaW8tY2FyZCwiCisKK3N0YXRpYyBpbnQgYXNvY19zaW1wbGVfY2FyZF9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYXNvY19zaW1wbGVfY2FyZF9wcml2ICpwcml2ID0Jc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKHJ0ZC0+Y2FyZCk7CisJc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSAqZGFpX3Byb3BzID0KKwkJc2ltcGxlX3ByaXZfdG9fcHJvcHMocHJpdiwgcnRkLT5udW0pOworCisJcmV0dXJuIGNsa19wcmVwYXJlX2VuYWJsZShkYWlfcHJvcHMtPmNsayk7Cit9CisKK3N0YXRpYyB2b2lkIGFzb2Nfc2ltcGxlX2NhcmRfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhc29jX3NpbXBsZV9jYXJkX3ByaXYgKnByaXYgPQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEocnRkLT5jYXJkKTsKKwlzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpICpkYWlfcHJvcHMgPQorCQlzaW1wbGVfcHJpdl90b19wcm9wcyhwcml2LCBydGQtPm51bSk7CisKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoZGFpX3Byb3BzLT5jbGspOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIGFzb2Nfc2ltcGxlX2NhcmRfb3BzID0geworCS5zdGFydHVwID0gYXNvY19zaW1wbGVfY2FyZF9zdGFydHVwLAorCS5zaHV0ZG93biA9IGFzb2Nfc2ltcGxlX2NhcmRfc2h1dGRvd24sCit9OworCitzdGF0aWMgaW50IGFzb2Nfc2ltcGxlX2NhcmRfZGFpX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKK3sKKwlzdHJ1Y3QgYXNvY19zaW1wbGVfY2FyZF9wcml2ICpwcml2ID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKHJ0ZC0+Y2FyZCk7CisJc3RydWN0IHNuZF9zb2NfZGFpICpkYWk7CisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rOworCXN0cnVjdCBhc29jX3NpbXBsZV9kYWkgKmRhaV9wcm9wczsKKwlpbnQgbnVtID0gcnRkLT5udW07CisKKwlkYWlfbGluawk9IHNpbXBsZV9wcml2X3RvX2xpbmsocHJpdiwgbnVtKTsKKwlkYWlfcHJvcHMJPSBzaW1wbGVfcHJpdl90b19wcm9wcyhwcml2LCBudW0pOworCWRhaQkJPSBkYWlfbGluay0+ZHluYW1pYyA/CisJCQkJcnRkLT5jcHVfZGFpIDoKKwkJCQlydGQtPmNvZGVjX2RhaTsKKworCXJldHVybiBhc29jX3NpbXBsZV9jYXJkX2luaXRfZGFpKGRhaSwgZGFpX3Byb3BzKTsKK30KKworc3RhdGljIGludCBhc29jX3NpbXBsZV9jYXJkX2JlX2h3X3BhcmFtc19maXh1cChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAorCQkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgYXNvY19zaW1wbGVfY2FyZF9wcml2ICpwcml2ID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKHJ0ZC0+Y2FyZCk7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqcmF0ZSA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCQkJCSAgICAgIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFKTsKKwlzdHJ1Y3Qgc25kX2ludGVydmFsICpjaGFubmVscyA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCQkJCVNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7CisKKwlpZiAocHJpdi0+Y29udmVydF9yYXRlKQorCQlyYXRlLT5taW4gPQorCQlyYXRlLT5tYXggPSBwcml2LT5jb252ZXJ0X3JhdGU7CisKKwlpZiAocHJpdi0+Y29udmVydF9jaGFubmVscykKKwkJY2hhbm5lbHMtPm1pbiA9CisJCWNoYW5uZWxzLT5tYXggPSBwcml2LT5jb252ZXJ0X2NoYW5uZWxzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9saW5rcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQlzdHJ1Y3QgYXNvY19zaW1wbGVfY2FyZF9wcml2ICpwcml2LAorCQkJCQl1bnNpZ25lZCBpbnQgZGFpZm10LAorCQkJCQlpbnQgaWR4LCBib29sIGlzX2ZlKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHNpbXBsZV9wcml2X3RvX2Rldihwcml2KTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmsgPSBzaW1wbGVfcHJpdl90b19saW5rKHByaXYsIGlkeCk7CisJc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSAqZGFpX3Byb3BzID0gc2ltcGxlX3ByaXZfdG9fcHJvcHMocHJpdiwgaWR4KTsKKwlpbnQgcmV0OworCisJaWYgKGlzX2ZlKSB7CisJCWludCBpc19zaW5nbGVfbGlua3MgPSAwOworCisJCS8qIEJFIGlzIGR1bW15ICovCisJCWRhaV9saW5rLT5jb2RlY19vZl9ub2RlCQk9IE5VTEw7CisJCWRhaV9saW5rLT5jb2RlY19kYWlfbmFtZQk9ICJzbmQtc29jLWR1bW15LWRhaSI7CisJCWRhaV9saW5rLT5jb2RlY19uYW1lCQk9ICJzbmQtc29jLWR1bW15IjsKKworCQkvKiBGRSBzZXR0aW5ncyAqLworCQlkYWlfbGluay0+ZHluYW1pYwkJPSAxOworCQlkYWlfbGluay0+ZHBjbV9tZXJnZWRfZm9ybWF0CT0gMTsKKworCQlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2NwdShucCwgZGFpX2xpbmssIERBSSwgQ0VMTCwKKwkJCQkJCSAmaXNfc2luZ2xlX2xpbmtzKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9jbGtfY3B1KG5wLCBkYWlfbGluaywgZGFpX3Byb3BzKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfc2V0X2RhaWxpbmtfbmFtZShkZXYsIGRhaV9saW5rLAorCQkJCQkJCSJmZS4lcyIsCisJCQkJCQkJZGFpX2xpbmstPmNwdV9kYWlfbmFtZSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlhc29jX3NpbXBsZV9jYXJkX2Nhbm9uaWNhbGl6ZV9jcHUoZGFpX2xpbmssIGlzX3NpbmdsZV9saW5rcyk7CisJfSBlbHNlIHsKKwkJLyogRkUgaXMgZHVtbXkgKi8KKwkJZGFpX2xpbmstPmNwdV9vZl9ub2RlCQk9IE5VTEw7CisJCWRhaV9saW5rLT5jcHVfZGFpX25hbWUJCT0gInNuZC1zb2MtZHVtbXktZGFpIjsKKwkJZGFpX2xpbmstPmNwdV9uYW1lCQk9ICJzbmQtc29jLWR1bW15IjsKKworCQkvKiBCRSBzZXR0aW5ncyAqLworCQlkYWlfbGluay0+bm9fcGNtCQk9IDE7CisJCWRhaV9saW5rLT5iZV9od19wYXJhbXNfZml4dXAJPSBhc29jX3NpbXBsZV9jYXJkX2JlX2h3X3BhcmFtc19maXh1cDsKKworCQlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2NvZGVjKG5wLCBkYWlfbGluaywgREFJLCBDRUxMKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfY2xrX2NvZGVjKG5wLCBkYWlfbGluaywgZGFpX3Byb3BzKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfc2V0X2RhaWxpbmtfbmFtZShkZXYsIGRhaV9saW5rLAorCQkJCQkJCSJiZS4lcyIsCisJCQkJCQkJZGFpX2xpbmstPmNvZGVjX2RhaV9uYW1lKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXNuZF9zb2Nfb2ZfcGFyc2VfYXVkaW9fcHJlZml4KCZwcml2LT5zbmRfY2FyZCwKKwkJCQkJICAgICAgJnByaXYtPmNvZGVjX2NvbmYsCisJCQkJCSAgICAgIGRhaV9saW5rLT5jb2RlY19vZl9ub2RlLAorCQkJCQkgICAgICBQUkVGSVggInByZWZpeCIpOworCX0KKworCXJldCA9IHNuZF9zb2Nfb2ZfcGFyc2VfdGRtX3Nsb3QobnAsCisJCQkJCSZkYWlfcHJvcHMtPnR4X3Nsb3RfbWFzaywKKwkJCQkJJmRhaV9wcm9wcy0+cnhfc2xvdF9tYXNrLAorCQkJCQkmZGFpX3Byb3BzLT5zbG90cywKKwkJCQkJJmRhaV9wcm9wcy0+c2xvdF93aWR0aCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfY2Fub25pY2FsaXplX2RhaWxpbmsoZGFpX2xpbmspOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZGFpX2xpbmstPmRhaV9mbXQJCT0gZGFpZm10OworCWRhaV9saW5rLT5kcGNtX3BsYXliYWNrCQk9IDE7CisJZGFpX2xpbmstPmRwY21fY2FwdHVyZQkJPSAxOworCWRhaV9saW5rLT5vcHMJCQk9ICZhc29jX3NpbXBsZV9jYXJkX29wczsKKwlkYWlfbGluay0+aW5pdAkJCT0gYXNvY19zaW1wbGVfY2FyZF9kYWlfaW5pdDsKKworCWRldl9kYmcoZGV2LCAiXHQlcyAvICUwNHggLyAlZFxuIiwKKwkJZGFpX2xpbmstPm5hbWUsCisJCWRhaV9saW5rLT5kYWlfZm10LAorCQlkYWlfcHJvcHMtPnN5c2Nsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc29jX3NpbXBsZV9jYXJkX2RhaV9saW5rX29mKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCQkgc3RydWN0IGFzb2Nfc2ltcGxlX2NhcmRfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBzaW1wbGVfcHJpdl90b19kZXYocHJpdik7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwl1bnNpZ25lZCBpbnQgZGFpZm10ID0gMDsKKwlpbnQgcmV0LCBpOworCWJvb2wgaXNfZmU7CisKKwkvKiBmaW5kIDFzdCBjb2RlYyAqLworCW5wID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUobm9kZSwgUFJFRklYICJjb2RlYyIpOworCWlmICghbnApCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9kYWlmbXQoZGV2LCBub2RlLCBucCwKKwkJCQkJICAgIFBSRUZJWCwgJmRhaWZtdCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpID0gMDsKKwlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKG5vZGUsIG5wKSB7CisJCWlzX2ZlID0gZmFsc2U7CisJCWlmIChzdHJjbXAobnAtPm5hbWUsIFBSRUZJWCAiY3B1IikgPT0gMCkKKwkJCWlzX2ZlID0gdHJ1ZTsKKworCQlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2xpbmtzKG5wLCBwcml2LCBkYWlmbXQsIGksIGlzX2ZlKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlpKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9vZihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkgICAgICBzdHJ1Y3QgYXNvY19zaW1wbGVfY2FyZF9wcml2ICpwcml2LAorCQkJICAgICAgc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhc29jX3NpbXBsZV9kYWkgKnByb3BzOworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpsaW5rczsKKwlpbnQgcmV0OworCWludCBudW07CisKKwlpZiAoIW5vZGUpCisJCXJldHVybiAtRUlOVkFMOworCisJbnVtID0gb2ZfZ2V0X2NoaWxkX2NvdW50KG5vZGUpOworCXByb3BzID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwcm9wcykgKiBudW0sIEdGUF9LRVJORUwpOworCWxpbmtzID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpsaW5rcykgKiBudW0sIEdGUF9LRVJORUwpOworCWlmICghcHJvcHMgfHwgIWxpbmtzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByaXYtPmRhaV9wcm9wcwk9IHByb3BzOworCXByaXYtPmRhaV9saW5rCT0gbGlua3M7CisKKwkvKiBJbml0IHNuZF9zb2NfY2FyZCAqLworCXByaXYtPnNuZF9jYXJkLm93bmVyCQkJPSBUSElTX01PRFVMRTsKKwlwcml2LT5zbmRfY2FyZC5kZXYJCQk9IGRldjsKKwlwcml2LT5zbmRfY2FyZC5kYWlfbGluawkJCT0gcHJpdi0+ZGFpX2xpbms7CisJcHJpdi0+c25kX2NhcmQubnVtX2xpbmtzCQk9IG51bTsKKwlwcml2LT5zbmRfY2FyZC5jb2RlY19jb25mCQk9ICZwcml2LT5jb2RlY19jb25mOworCXByaXYtPnNuZF9jYXJkLm51bV9jb25maWdzCQk9IDE7CisKKwlyZXQgPSBzbmRfc29jX29mX3BhcnNlX2F1ZGlvX3JvdXRpbmcoJnByaXYtPnNuZF9jYXJkLCBQUkVGSVggInJvdXRpbmciKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHNhbXBsaW5nIHJhdGUgY29udmVydCAqLworCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsIFBSRUZJWCAiY29udmVydC1yYXRlIiwgJnByaXYtPmNvbnZlcnRfcmF0ZSk7CisKKwkvKiBjaGFubmVscyB0cmFuc2ZlciAqLworCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsIFBSRUZJWCAiY29udmVydC1jaGFubmVscyIsICZwcml2LT5jb252ZXJ0X2NoYW5uZWxzKTsKKworCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfZGFpX2xpbmtfb2Yobm9kZSwgcHJpdik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2NhcmRfbmFtZSgmcHJpdi0+c25kX2NhcmQsIFBSRUZJWCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlkZXZfZGJnKGRldiwgIk5ldyBjYXJkOiAlc1xuIiwKKwkJcHJpdi0+c25kX2NhcmQubmFtZSA/IHByaXYtPnNuZF9jYXJkLm5hbWUgOiAiIik7CisJZGV2X2RiZyhkZXYsICJjb252ZXJ0X3JhdGUgICAgICVkXG4iLCBwcml2LT5jb252ZXJ0X3JhdGUpOworCWRldl9kYmcoZGV2LCAiY29udmVydF9jaGFubmVscyAlZFxuIiwgcHJpdi0+Y29udmVydF9jaGFubmVscyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc29jX3NpbXBsZV9jYXJkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFzb2Nfc2ltcGxlX2NhcmRfcHJpdiAqcHJpdjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlpbnQgcmV0OworCisJLyogQWxsb2NhdGUgdGhlIHByaXZhdGUgZGF0YSAqLworCXByaXYgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9vZihucCwgcHJpdiwgZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlpZiAocmV0ICE9IC1FUFJPQkVfREVGRVIpCisJCQlkZXZfZXJyKGRldiwgInBhcnNlIGVycm9yICVkXG4iLCByZXQpOworCQlnb3RvIGVycjsKKwl9CisKKwlzbmRfc29jX2NhcmRfc2V0X2RydmRhdGEoJnByaXYtPnNuZF9jYXJkLCBwcml2KTsKKworCXJldCA9IGRldm1fc25kX3NvY19yZWdpc3Rlcl9jYXJkKCZwZGV2LT5kZXYsICZwcml2LT5zbmRfY2FyZCk7CisJaWYgKHJldCA+PSAwKQorCQlyZXR1cm4gcmV0OworZXJyOgorCWFzb2Nfc2ltcGxlX2NhcmRfY2xlYW5fcmVmZXJlbmNlKCZwcml2LT5zbmRfY2FyZCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFzb2Nfc2ltcGxlX2NhcmRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcmV0dXJuIGFzb2Nfc2ltcGxlX2NhcmRfY2xlYW5fcmVmZXJlbmNlKGNhcmQpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhc29jX3NpbXBsZV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxyc3JjLWNhcmQiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAic2ltcGxlLXNjdS1hdWRpby1jYXJkIiwgfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBhc29jX3NpbXBsZV9vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFzb2Nfc2ltcGxlX2NhcmQgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAic2ltcGxlLXNjdS1hdWRpby1jYXJkIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gYXNvY19zaW1wbGVfb2ZfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSBhc29jX3NpbXBsZV9jYXJkX3Byb2JlLAorCS5yZW1vdmUgPSBhc29jX3NpbXBsZV9jYXJkX3JlbW92ZSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYXNvY19zaW1wbGVfY2FyZCk7CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06YXNvYy1zaW1wbGUtc2N1LWNhcmQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBTaW1wbGUgU0NVIFNvdW5kIENhcmQiKTsKK01PRFVMRV9BVVRIT1IoIkt1bmlub3JpIE1vcmltb3RvIDxrdW5pbm9yaS5tb3JpbW90by5neEByZW5lc2FzLmNvbT4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbWcvcGlzdGFjaGlvLWludGVybmFsLWRhYy5jIGIvc291bmQvc29jL2ltZy9waXN0YWNoaW8taW50ZXJuYWwtZGFjLmMKaW5kZXggMTYyYTBmZC4uNTNlMTFjNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ltZy9waXN0YWNoaW8taW50ZXJuYWwtZGFjLmMKKysrIGIvc291bmQvc29jL2ltZy9waXN0YWNoaW8taW50ZXJuYWwtZGFjLmMKQEAgLTEzNCwxMiArMTM0LDE0IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHBpc3RhY2hpb19pbnRlcm5hbF9kYWNfZHJpdmVyID0gewogCS5wcm9iZSA9IHBpc3RhY2hpb19pbnRlcm5hbF9kYWNfY29kZWNfcHJvYmUsCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAotCS5jb250cm9scyA9IHBpc3RhY2hpb19pbnRlcm5hbF9kYWNfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHBpc3RhY2hpb19pbnRlcm5hbF9kYWNfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gcGlzdGFjaGlvX2ludGVybmFsX2RhY193aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShwaXN0YWNoaW9faW50ZXJuYWxfZGFjX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHBpc3RhY2hpb19pbnRlcm5hbF9kYWNfcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHBpc3RhY2hpb19pbnRlcm5hbF9kYWNfcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHBpc3RhY2hpb19pbnRlcm5hbF9kYWNfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUocGlzdGFjaGlvX2ludGVybmFsX2RhY19zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHBpc3RhY2hpb19pbnRlcm5hbF9kYWNfd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHBpc3RhY2hpb19pbnRlcm5hbF9kYWNfd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBwaXN0YWNoaW9faW50ZXJuYWxfZGFjX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUocGlzdGFjaGlvX2ludGVybmFsX2RhY19yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IHBpc3RhY2hpb19pbnRlcm5hbF9kYWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9LY29uZmlnIGIvc291bmQvc29jL2ludGVsL0tjb25maWcKaW5kZXggYTIwYzNkZi4uMjZlYjVhMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL0tjb25maWcKKysrIGIvc291bmQvc29jL2ludGVsL0tjb25maWcKQEAgLTI1LDYgKzI1LDcgQEAKIAl0cmlzdGF0ZQogCXNlbGVjdCBTTkRfU1NUX0lQQwogCXNlbGVjdCBTTkRfU09DX0lOVEVMX1NTVAorCXNlbGVjdCBJT1NGX01CSQogCiBjb25maWcgU05EX1NPQ19JTlRFTF9TU1QKIAl0cmlzdGF0ZQpAQCAtMTIwLDYgKzEyMSwxNyBAQAogCSAgVGhpcyBhZGRzIGF1ZGlvIGRyaXZlciBmb3IgSW50ZWwgQmF5dHJhaWwgcGxhdGZvcm0gYmFzZWQgYm9hcmRzCiAJICB3aXRoIHRoZSBNQVg5ODA5MCBhdWRpbyBjb2RlYy4KIAorY29uZmlnIFNORF9TT0NfSU5URUxfQkRXX1JUNTY3N19NQUNICisJdHJpc3RhdGUgIkFTb0MgQXVkaW8gZHJpdmVyIGZvciBJbnRlbCBCcm9hZHdlbGwgd2l0aCBSVDU2NzcgY29kZWMiCisJZGVwZW5kcyBvbiBYODZfSU5URUxfTFBTUyAmJiBHUElPTElCICYmIEkyQyAmJiBEV19ETUFDCisJZGVwZW5kcyBvbiBEV19ETUFDX0NPUkU9eQorCXNlbGVjdCBTTkRfU09DX0lOVEVMX1NTVAorCXNlbGVjdCBTTkRfU09DX0lOVEVMX0hBU1dFTEwKKwlzZWxlY3QgU05EX1NPQ19SVDU2NzcKKwloZWxwCisJICBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgSW50ZWwgQnJvYWR3ZWxsIHBsYXRmb3JtIGJhc2VkIGJvYXJkcyB3aXRoCisJICB0aGUgUlQ1Njc3IGF1ZGlvIGNvZGVjLgorCiBjb25maWcgU05EX1NPQ19JTlRFTF9CUk9BRFdFTExfTUFDSAogCXRyaXN0YXRlICJBU29DIEF1ZGlvIERTUCBzdXBwb3J0IGZvciBJbnRlbCBCcm9hZHdlbGwgV2lsZGNhdHBvaW50IgogCWRlcGVuZHMgb24gWDg2X0lOVEVMX0xQU1MgJiYgSTJDICYmIERXX0RNQUMgJiYgXApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL2F0b20vc3N0LWF0b20tY29udHJvbHMuYyBiL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC1hdG9tLWNvbnRyb2xzLmMKaW5kZXggOTg3MjBhOS4uMDgzODQ3OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL2F0b20vc3N0LWF0b20tY29udHJvbHMuYworKysgYi9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3QtYXRvbS1jb250cm9scy5jCkBAIC0xLDQgKzEsNCBAQAotLyoKKyAvKgogICogIHNzdC1hdG9tLWNvbnRyb2xzLmMgLSBJbnRlbCBNSUQgUGxhdGZvcm0gZHJpdmVyIERQQ00gQUxTQSBjb250cm9scyBmb3IgTXJmbGQKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDEzLTE0IEludGVsIENvcnAKQEAgLTUzNCw2ICs1MzQsNyBAQAogCiAvKiBMb29rIHVwIHRhYmxlIHRvIGNvbnZlcnQgTUlYRVIgU1cgYml0IHJlZ3MgdG8gU1dNIGlucHV0cyAqLwogc3RhdGljIGNvbnN0IHVpbnQgc3dtX21peGVyX2lucHV0X2lkc1tTU1RfU1dNX0lOUFVUX0NPVU5UXSA9IHsKKwlbU1NUX0lQX01PREVNXQkJPSBTU1RfU1dNX0lOX01PREVNLAogCVtTU1RfSVBfQ09ERUMwXQkJPSBTU1RfU1dNX0lOX0NPREVDMCwKIAlbU1NUX0lQX0NPREVDMV0JCT0gU1NUX1NXTV9JTl9DT0RFQzEsCiAJW1NTVF9JUF9MT09QMF0JCT0gU1NUX1NXTV9JTl9TUFJPVF9MT09QLApAQCAtNjc0LDYgKzY3NSw3IEBACiAvKiBTQkEgbWl4ZXJzIC0gMTYgaW5wdXRzICovCiAjZGVmaW5lIFNTVF9TQkFfREVDTEFSRV9NSVhfQ09OVFJPTFMoa2N0bF9uYW1lKQkJCQkJCQlcCiAJc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGtjdGxfbmFtZVtdID0gewkJCQkJXAorCQlTT0NfREFQTV9TSU5HTEUoIm1vZGVtX2luIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgU1NUX0lQX01PREVNLCAxLCAwKSwJCVwKIAkJU09DX0RBUE1fU0lOR0xFKCJjb2RlY19pbjAgU3dpdGNoIiwgU05EX1NPQ19OT1BNLCBTU1RfSVBfQ09ERUMwLCAxLCAwKSwJCVwKIAkJU09DX0RBUE1fU0lOR0xFKCJjb2RlY19pbjEgU3dpdGNoIiwgU05EX1NPQ19OT1BNLCBTU1RfSVBfQ09ERUMxLCAxLCAwKSwJCVwKIAkJU09DX0RBUE1fU0lOR0xFKCJzcHJvdF9sb29wX2luIFN3aXRjaCIsIFNORF9TT0NfTk9QTSwgU1NUX0lQX0xPT1AwLCAxLCAwKSwJXApAQCAtNjg0LDYgKzY4Niw3IEBACiAJfQogCiAjZGVmaW5lIFNTVF9TQkFfTUlYRVJfR1JBUEhfTUFQKG1peF9uYW1lKQkJCVwKKwl7IG1peF9uYW1lLCAibW9kZW1faW4gU3dpdGNoIiwJIm1vZGVtX2luIiB9LAkJXAogCXsgbWl4X25hbWUsICJjb2RlY19pbjAgU3dpdGNoIiwJImNvZGVjX2luMCIgfSwJCVwKIAl7IG1peF9uYW1lLCAiY29kZWNfaW4xIFN3aXRjaCIsCSJjb2RlY19pbjEiIH0sCQlcCiAJeyBtaXhfbmFtZSwgInNwcm90X2xvb3BfaW4gU3dpdGNoIiwJInNwcm90X2xvb3BfaW4iIH0sCVwKQEAgLTcxMyw2ICs3MTYsNyBAQAogU1NUX1NCQV9ERUNMQVJFX01JWF9DT05UUk9MUyhzc3RfbWl4X3ZvaXBfY29udHJvbHMpOwogU1NUX1NCQV9ERUNMQVJFX01JWF9DT05UUk9MUyhzc3RfbWl4X2NvZGVjMF9jb250cm9scyk7CiBTU1RfU0JBX0RFQ0xBUkVfTUlYX0NPTlRST0xTKHNzdF9taXhfY29kZWMxX2NvbnRyb2xzKTsKK1NTVF9TQkFfREVDTEFSRV9NSVhfQ09OVFJPTFMoc3N0X21peF9tb2RlbV9jb250cm9scyk7CiAKIC8qCiAgKiBzc3RfaGFuZGxlX3ZiX3RpbWVyIC0gU3RhcnQvU3RvcCB0aGUgRFNQIHNjaGVkdWxlcgpAQCAtOTMxLDE3ICs5MzUsMjYgQEAKIGludCBzZW5kX3NzcF9jbWQoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIGNvbnN0IGNoYXIgKmlkLCBib29sIGVuYWJsZSkKIHsKIAlzdHJ1Y3Qgc3N0X2RhdGEgKmRydiA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7Ci0JY29uc3Qgc3RydWN0IHNzdF9zc3BfY29uZmlnICpjb25maWc7CisJaW50IHNzcF9pZDsKIAogCWRldl9pbmZvKGRhaS0+ZGV2LCAiRW50ZXI6IGVuYWJsZT0lZCBwb3J0X25hbWU9JXNcbiIsIGVuYWJsZSwgaWQpOwogCisJaWYgKHN0cmNtcChpZCwgInNzcDAtcG9ydCIpID09IDApCisJCXNzcF9pZCA9IFNTUF9NT0RFTTsKKwllbHNlIGlmIChzdHJjbXAoaWQsICJzc3AyLXBvcnQiKSA9PSAwKQorCQlzc3BfaWQgPSBTU1BfQ09ERUM7CisJZWxzZSB7CisJCWRldl9kYmcoZGFpLT5kZXYsICJwb3J0ICVzIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGlkKTsKKwkJcmV0dXJuIC0xOworCX0KKwogCVNTVF9GSUxMX0RFRkFVTFRfREVTVElOQVRJT04oZHJ2LT5zc3BfY21kLmhlYWRlci5kc3QpOwogCWRydi0+c3NwX2NtZC5oZWFkZXIuY29tbWFuZF9pZCA9IFNCQV9IV19TRVRfU1NQOwogCWRydi0+c3NwX2NtZC5oZWFkZXIubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBzc3RfY21kX3NiYV9od19zZXRfc3NwKQogCQkJCS0gc2l6ZW9mKHN0cnVjdCBzc3RfZHNwX2hlYWRlcik7CiAKLQljb25maWcgPSAmc3N0X3NzcF9jb25maWdzOwotCWRldl9kYmcoZGFpLT5kZXYsICJzc3BfaWQ6ICV1XG4iLCBjb25maWctPnNzcF9pZCk7CisJZHJ2LT5zc3BfY21kLnNlbGVjdGlvbiA9IHNzcF9pZDsKKwlkZXZfZGJnKGRhaS0+ZGV2LCAic3NwX2lkOiAldVxuIiwgc3NwX2lkKTsKIAogCWlmIChlbmFibGUpCiAJCWRydi0+c3NwX2NtZC5zd2l0Y2hfc3RhdGUgPSBTU1RfU1dJVENIX09OOwpAQCAtMTA0Nyw4ICsxMDYwLDEwIEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBzc3RfZGFwbV93aWRnZXRzW10gPSB7CisJU1NUX0FJRl9JTigibW9kZW1faW4iLCBzc3Rfc2V0X2JlX21vZHVsZXMpLAogCVNTVF9BSUZfSU4oImNvZGVjX2luMCIsIHNzdF9zZXRfYmVfbW9kdWxlcyksCiAJU1NUX0FJRl9JTigiY29kZWNfaW4xIiwgc3N0X3NldF9iZV9tb2R1bGVzKSwKKwlTU1RfQUlGX09VVCgibW9kZW1fb3V0Iiwgc3N0X3NldF9iZV9tb2R1bGVzKSwKIAlTU1RfQUlGX09VVCgiY29kZWNfb3V0MCIsIHNzdF9zZXRfYmVfbW9kdWxlcyksCiAJU1NUX0FJRl9PVVQoImNvZGVjX291dDEiLCBzc3Rfc2V0X2JlX21vZHVsZXMpLAogCkBAIC0xMTAzLDYgKzExMTgsOSBAQAogCQkgICAgICBzc3RfbWl4X2NvZGVjMF9jb250cm9scywgc3N0X3N3bV9taXhlcl9ldmVudCksCiAJU1NUX1NXTV9NSVhFUigiY29kZWNfb3V0MSBtaXggMCIsIFNORF9TT0NfTk9QTSwgU1NUX1RBU0tfU0JBLCBTU1RfU1dNX09VVF9DT0RFQzEsCiAJCSAgICAgIHNzdF9taXhfY29kZWMxX2NvbnRyb2xzLCBzc3Rfc3dtX21peGVyX2V2ZW50KSwKKwlTU1RfU1dNX01JWEVSKCJtb2RlbV9vdXQgbWl4IDAiLCBTTkRfU09DX05PUE0sIFNTVF9UQVNLX1NCQSwgU1NUX1NXTV9PVVRfTU9ERU0sCisJCSAgICAgIHNzdF9taXhfbW9kZW1fY29udHJvbHMsIHNzdF9zd21fbWl4ZXJfZXZlbnQpLAorCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBpbnRlcmNvbltdID0gewpAQCAtMTE0OCw2ICsxMTY2LDkgQEAKIAlTU1RfU0JBX01JWEVSX0dSQVBIX01BUCgiY29kZWNfb3V0MCBtaXggMCIpLAogCXsiY29kZWNfb3V0MSIsIE5VTEwsICJjb2RlY19vdXQxIG1peCAwIn0sCiAJU1NUX1NCQV9NSVhFUl9HUkFQSF9NQVAoImNvZGVjX291dDEgbWl4IDAiKSwKKwl7Im1vZGVtX291dCIsIE5VTEwsICJtb2RlbV9vdXQgbWl4IDAifSwKKwlTU1RfU0JBX01JWEVSX0dSQVBIX01BUCgibW9kZW1fb3V0IG1peCAwIiksCisKIAogfTsKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2xvdF9uYW1lc1tdID0gewpAQCAtMTIxNyw2ICsxMjM4LDkgQEAKIAlTU1RfR0FJTigibWVkaWFfbG9vcDJfb3V0IiwgU1NUX1BBVEhfSU5ERVhfTUVESUFfTE9PUDJfT1VULCBTU1RfVEFTS19TQkEsIDAsICZzc3RfZ2FpbnNbMTNdKSwKIAlTU1RfR0FJTigic3Byb3RfbG9vcF9vdXQiLCBTU1RfUEFUSF9JTkRFWF9TUFJPVF9MT09QX09VVCwgU1NUX1RBU0tfU0JBLCAwLCAmc3N0X2dhaW5zWzE0XSksCiAJU1NUX1ZPTFVNRSgibWVkaWEwX2luIiwgU1NUX1BBVEhfSU5ERVhfTUVESUEwX0lOLCBTU1RfVEFTS19NTVgsIDAsICZzc3RfZ2FpbnNbMTVdKSwKKwlTU1RfR0FJTigibW9kZW1faW4iLCBTU1RfUEFUSF9JTkRFWF9NT0RFTV9JTiwgU1NUX1RBU0tfU0JBLCAwLCAmc3N0X2dhaW5zWzE2XSksCisJU1NUX0dBSU4oIm1vZGVtX291dCIsIFNTVF9QQVRIX0lOREVYX01PREVNX09VVCwgU1NUX1RBU0tfU0JBLCAwLCAmc3N0X2dhaW5zWzE3XSksCisKIH07CiAKICNkZWZpbmUgU1NUX0dBSU5fTlVNX0NPTlRST0xTIDMKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC1hdG9tLWNvbnRyb2xzLmggYi9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3QtYXRvbS1jb250cm9scy5oCmluZGV4IGUwMTEzMTEuLjM1MWQ4MTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC1hdG9tLWNvbnRyb2xzLmgKKysrIGIvc291bmQvc29jL2ludGVsL2F0b20vc3N0LWF0b20tY29udHJvbHMuaApAQCAtMzUsNiArMzUsOCBAQAogLyogZGVmaW5lIGEgYml0IGZvciBlYWNoIG1peGVyIGlucHV0ICovCiAjZGVmaW5lIFNTVF9NSVhfSVAoeCkJCSh4KQogCisjZGVmaW5lIFNTVF9JUF9NT0RFTQkJU1NUX01JWF9JUCgwKQorI2RlZmluZSBTU1RfSVBfQlQJCVNTVF9NSVhfSVAoMSkKICNkZWZpbmUgU1NUX0lQX0NPREVDMAkJU1NUX01JWF9JUCgyKQogI2RlZmluZSBTU1RfSVBfQ09ERUMxCQlTU1RfTUlYX0lQKDMpCiAjZGVmaW5lIFNTVF9JUF9MT09QMAkJU1NUX01JWF9JUCg0KQpAQCAtNjMsNiArNjUsNyBAQAogICogQXVkaW8gRFNQIFBhdGggSWRzLiBTcGVjaWZpZWQgYnkgdGhlIGF1ZGlvIERTUCBGVwogICovCiBlbnVtIHNzdF9wYXRoX2luZGV4IHsKKwlTU1RfUEFUSF9JTkRFWF9NT0RFTV9PVVQgICAgICAgICAgICAgICAgPSAoMHgwMCA8PCBTU1RfUEFUSF9JRF9TSElGVCksCiAJU1NUX1BBVEhfSU5ERVhfQ09ERUNfT1VUMCAgICAgICAgICAgICAgID0gKDB4MDIgPDwgU1NUX1BBVEhfSURfU0hJRlQpLAogCVNTVF9QQVRIX0lOREVYX0NPREVDX09VVDEgICAgICAgICAgICAgICA9ICgweDAzIDw8IFNTVF9QQVRIX0lEX1NISUZUKSwKIApAQCAtODAsNiArODMsNyBAQAogCiAKIAkvKiBTdGFydCBvZiBpbnB1dCBwYXRocyAqLworCVNTVF9QQVRIX0lOREVYX01PREVNX0lOICAgICAgICAgICAgICAgICA9ICgweDgwIDw8IFNTVF9QQVRIX0lEX1NISUZUKSwKIAlTU1RfUEFUSF9JTkRFWF9DT0RFQ19JTjAgICAgICAgICAgICAgICAgPSAoMHg4MiA8PCBTU1RfUEFUSF9JRF9TSElGVCksCiAJU1NUX1BBVEhfSU5ERVhfQ09ERUNfSU4xICAgICAgICAgICAgICAgID0gKDB4ODMgPDwgU1NUX1BBVEhfSURfU0hJRlQpLAogCkBAIC0xMDUsNiArMTA5LDcgQEAKICAqIHBhdGggSURzCiAgKi8KIGVudW0gc3N0X3N3bV9pbnB1dHMgeworCVNTVF9TV01fSU5fTU9ERU0JPSAoU1NUX1BBVEhfSU5ERVhfTU9ERU1fSU4JICB8IFNTVF9ERUZBVUxUX0NFTExfTkJSKSwKIAlTU1RfU1dNX0lOX0NPREVDMAk9IChTU1RfUEFUSF9JTkRFWF9DT0RFQ19JTjAJICB8IFNTVF9ERUZBVUxUX0NFTExfTkJSKSwKIAlTU1RfU1dNX0lOX0NPREVDMQk9IChTU1RfUEFUSF9JTkRFWF9DT0RFQ19JTjEJICB8IFNTVF9ERUZBVUxUX0NFTExfTkJSKSwKIAlTU1RfU1dNX0lOX1NQUk9UX0xPT1AJPSAoU1NUX1BBVEhfSU5ERVhfU1BST1RfTE9PUF9JTgkgIHwgU1NUX0RFRkFVTFRfQ0VMTF9OQlIpLApAQCAtMTI0LDYgKzEyOSw3IEBACiAgKiBwYXRoIElEcwogICovCiBlbnVtIHNzdF9zd21fb3V0cHV0cyB7CisJU1NUX1NXTV9PVVRfTU9ERU0JPSAoU1NUX1BBVEhfSU5ERVhfTU9ERU1fT1VUCSAgfCBTU1RfREVGQVVMVF9DRUxMX05CUiksCiAJU1NUX1NXTV9PVVRfQ09ERUMwCT0gKFNTVF9QQVRIX0lOREVYX0NPREVDX09VVDAJICB8IFNTVF9ERUZBVUxUX0NFTExfTkJSKSwKIAlTU1RfU1dNX09VVF9DT0RFQzEJPSAoU1NUX1BBVEhfSU5ERVhfQ09ERUNfT1VUMQkgIHwgU1NUX0RFRkFVTFRfQ0VMTF9OQlIpLAogCVNTVF9TV01fT1VUX1NQUk9UX0xPT1AJPSAoU1NUX1BBVEhfSU5ERVhfU1BST1RfTE9PUF9PVVQgIHwgU1NUX0RFRkFVTFRfQ0VMTF9OQlIpLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL2F0b20vc3N0LW1mbGQtcGxhdGZvcm0tcGNtLmMgYi9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3QtbWZsZC1wbGF0Zm9ybS1wY20uYwppbmRleCA1MmVkNDM0Li4yNWM2ZDg3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3QtbWZsZC1wbGF0Zm9ybS1wY20uYworKysgYi9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3QtbWZsZC1wbGF0Zm9ybS1wY20uYwpAQCAtNjcwLDcgKzY3MCw3IEBACiAJcmV0dXJuIHN0cl9pbmZvLT5idWZmZXJfcHRyOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNzdF9wbGF0Zm9ybV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNzdF9wbGF0Zm9ybV9vcHMgPSB7CiAJLm9wZW4gPSBzc3RfcGxhdGZvcm1fb3BlbiwKIAkuaW9jdGwgPSBzbmRfcGNtX2xpYl9pb2N0bCwKIAkudHJpZ2dlciA9IHNzdF9wbGF0Zm9ybV9wY21fdHJpZ2dlciwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC9zc3QuYyBiL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC9zc3QuYwppbmRleCBhNGI0NThlLi45YjZlMjczIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3Qvc3N0LmMKKysrIGIvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdC5jCkBAIC0xOTAsNyArMTkwLDggQEAKIAogCWRlZmF1bHQ6CiAJCWRldl9lcnIoc3N0LT5kZXYsCi0JCQkiU1NUIERyaXZlciBjYXBhYmxpdGllcyBtaXNzaW5nIGZvciBkZXZfaWQ6ICV4Iiwgc3N0LT5kZXZfaWQpOworCQkJIlNTVCBEcml2ZXIgY2FwYWJpbGl0aWVzIG1pc3NpbmcgZm9yIGRldl9pZDogJXgiLAorCQkJc3N0LT5kZXZfaWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9OwogfQpAQCAtNDQxLDcgKzQ0Miw3IEBACiAJCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyZWFtID0gJmN0eC0+c3RyZWFtc1tpXTsKIAogCQlpZiAoc3RyZWFtLT5zdGF0dXMgPT0gU1RSRUFNX1JVTk5JTkcpIHsKLQkJCWRldl9lcnIoZGV2LCAic3RyZWFtICVkIGlzIHJ1bm5pbmcsIGNhbnQgc3VzdXBlbmQsIGFib3J0XG4iLCBpKTsKKwkJCWRldl9lcnIoZGV2LCAic3RyZWFtICVkIGlzIHJ1bm5pbmcsIGNhbid0IHN1c3BlbmQsIGFib3J0XG4iLCBpKTsKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3Qvc3N0X2FjcGkuYyBiL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC9zc3RfYWNwaS5jCmluZGV4IDRkMzE4NDkuLmJhNWMwZDcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC9zc3RfYWNwaS5jCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC9zc3RfYWNwaS5jCkBAIC0zOSw2ICszOSw4IEBACiAjaW5jbHVkZSA8YWNwaS9wbGF0Zm9ybS9hY2xpbnV4Lmg+CiAjaW5jbHVkZSA8YWNwaS9hY3R5cGVzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgorI2luY2x1ZGUgPGFzbS9jcHVfZGV2aWNlX2lkLmg+CisjaW5jbHVkZSA8YXNtL2lvc2ZfbWJpLmg+CiAjaW5jbHVkZSAiLi4vc3N0LW1mbGQtcGxhdGZvcm0uaCIKICNpbmNsdWRlICIuLi8uLi9jb21tb24vc3N0LWRzcC5oIgogI2luY2x1ZGUgIi4uLy4uL2NvbW1vbi9zc3QtYWNwaS5oIgpAQCAtMTEzLDYgKzExNSwyOCBAQAogCS5hY3BpX2lwY19pcnFfaW5kZXggPSA1LAogfTsKIAorLyogQllUQ1IgaGFzIGRpZmZlcmVudCBCSU9TIGZyb20gQllUICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNzdF9yZXNfaW5mbyBieXRjcl9yZXNfaW5mbyA9IHsKKwkuc2hpbV9vZmZzZXQgPSAweDE0MDAwMCwKKwkuc2hpbV9zaXplID0gMHgwMDAxMDAsCisJLnNoaW1fcGh5X2FkZHIgPSBTU1RfQllUX1NISU1fUEhZX0FERFIsCisJLnNzcDBfb2Zmc2V0ID0gMHhhMDAwMCwKKwkuc3NwMF9zaXplID0gMHgxMDAwLAorCS5kbWEwX29mZnNldCA9IDB4OTgwMDAsCisJLmRtYTBfc2l6ZSA9IDB4NDAwMCwKKwkuZG1hMV9vZmZzZXQgPSAweDljMDAwLAorCS5kbWExX3NpemUgPSAweDQwMDAsCisJLmlyYW1fb2Zmc2V0ID0gMHgwYzAwMDAsCisJLmlyYW1fc2l6ZSA9IDB4MTQwMDAsCisJLmRyYW1fb2Zmc2V0ID0gMHgxMDAwMDAsCisJLmRyYW1fc2l6ZSA9IDB4MjgwMDAsCisJLm1ib3hfb2Zmc2V0ID0gMHgxNDQwMDAsCisJLm1ib3hfc2l6ZSA9IDB4MTAwMCwKKwkuYWNwaV9scGVfcmVzX2luZGV4ID0gMCwKKwkuYWNwaV9kZHJfaW5kZXggPSAyLAorCS5hY3BpX2lwY19pcnFfaW5kZXggPSAwCit9OworCiBzdGF0aWMgc3RydWN0IHNzdF9wbGF0Zm9ybV9pbmZvIGJ5dF9ydnBfcGxhdGZvcm1fZGF0YSA9IHsKIAkucHJvYmVfZGF0YSA9ICZieXRfZndwYXJzZV9pbmZvLAogCS5pcGNfaW5mbyA9ICZieXRfaXBjX2luZm8sCkBAIC0xNDIsNyArMTY2LDcgQEAKIAlyc3JjID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLAogCQkJCQljdHgtPnBkYXRhLT5yZXNfaW5mby0+YWNwaV9scGVfcmVzX2luZGV4KTsKIAlpZiAoIXJzcmMpIHsKLQkJZGV2X2VycihjdHgtPmRldiwgIkludmFsaWQgU0hJTSBiYXNlIGZyb20gSUZXSSIpOworCQlkZXZfZXJyKGN0eC0+ZGV2LCAiSW52YWxpZCBTSElNIGJhc2UgZnJvbSBJRldJXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCWRldl9pbmZvKGN0eC0+ZGV2LCAiTFBFIGJhc2U6ICUjeCBzaXplOiUjeCIsICh1bnNpZ25lZCBpbnQpIHJzcmMtPnN0YXJ0LApAQCAtMTU0LDcgKzE3OCw3IEBACiAJY3R4LT5pcmFtID0gZGV2bV9pb3JlbWFwX25vY2FjaGUoY3R4LT5kZXYsIGN0eC0+aXJhbV9iYXNlLAogCQkJCQkgY3R4LT5wZGF0YS0+cmVzX2luZm8tPmlyYW1fc2l6ZSk7CiAJaWYgKCFjdHgtPmlyYW0pIHsKLQkJZGV2X2VycihjdHgtPmRldiwgInVuYWJsZSB0byBtYXAgSVJBTSIpOworCQlkZXZfZXJyKGN0eC0+ZGV2LCAidW5hYmxlIHRvIG1hcCBJUkFNXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC0xNjQsNyArMTg4LDcgQEAKIAljdHgtPmRyYW0gPSBkZXZtX2lvcmVtYXBfbm9jYWNoZShjdHgtPmRldiwgY3R4LT5kcmFtX2Jhc2UsCiAJCQkJCSBjdHgtPnBkYXRhLT5yZXNfaW5mby0+ZHJhbV9zaXplKTsKIAlpZiAoIWN0eC0+ZHJhbSkgewotCQlkZXZfZXJyKGN0eC0+ZGV2LCAidW5hYmxlIHRvIG1hcCBEUkFNIik7CisJCWRldl9lcnIoY3R4LT5kZXYsICJ1bmFibGUgdG8gbWFwIERSQU1cbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTE3Myw3ICsxOTcsNyBAQAogCWN0eC0+c2hpbSA9IGRldm1faW9yZW1hcF9ub2NhY2hlKGN0eC0+ZGV2LCBjdHgtPnNoaW1fcGh5X2FkZCwKIAkJCQkJY3R4LT5wZGF0YS0+cmVzX2luZm8tPnNoaW1fc2l6ZSk7CiAJaWYgKCFjdHgtPnNoaW0pIHsKLQkJZGV2X2VycihjdHgtPmRldiwgInVuYWJsZSB0byBtYXAgU0hJTSIpOworCQlkZXZfZXJyKGN0eC0+ZGV2LCAidW5hYmxlIHRvIG1hcCBTSElNXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC0xODYsNyArMjEwLDcgQEAKIAljdHgtPm1haWxib3ggPSBkZXZtX2lvcmVtYXBfbm9jYWNoZShjdHgtPmRldiwgY3R4LT5tYWlsYm94X2FkZCwKIAkJCQkJICAgIGN0eC0+cGRhdGEtPnJlc19pbmZvLT5tYm94X3NpemUpOwogCWlmICghY3R4LT5tYWlsYm94KSB7Ci0JCWRldl9lcnIoY3R4LT5kZXYsICJ1bmFibGUgdG8gbWFwIG1haWxib3giKTsKKwkJZGV2X2VycihjdHgtPmRldiwgInVuYWJsZSB0byBtYXAgbWFpbGJveFxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtMTk2LDcgKzIyMCw3IEBACiAJcnNyYyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwKIAkJCQkJY3R4LT5wZGF0YS0+cmVzX2luZm8tPmFjcGlfZGRyX2luZGV4KTsKIAlpZiAoIXJzcmMpIHsKLQkJZGV2X2VycihjdHgtPmRldiwgIkludmFsaWQgRERSIGJhc2UgZnJvbSBJRldJIik7CisJCWRldl9lcnIoY3R4LT5kZXYsICJJbnZhbGlkIEREUiBiYXNlIGZyb20gSUZXSVxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAljdHgtPmRkcl9iYXNlID0gcnNyYy0+c3RhcnQ7CkBAIC0yMDUsNyArMjI5LDcgQEAKIAljdHgtPmRkciA9IGRldm1faW9yZW1hcF9ub2NhY2hlKGN0eC0+ZGV2LCBjdHgtPmRkcl9iYXNlLAogCQkJCQlyZXNvdXJjZV9zaXplKHJzcmMpKTsKIAlpZiAoIWN0eC0+ZGRyKSB7Ci0JCWRldl9lcnIoY3R4LT5kZXYsICJ1bmFibGUgdG8gbWFwIEREUiIpOworCQlkZXZfZXJyKGN0eC0+ZGV2LCAidW5hYmxlIHRvIG1hcCBERFJcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTIxNSw2ICsyMzksNDYgQEAKIAlyZXR1cm4gMDsKIH0KIAorCitzdGF0aWMgaW50IGlzX2J5dF9jcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgKmJ5dGNyKQoreworCWludCBzdGF0dXMgPSAwOworCisJaWYgKElTX0VOQUJMRUQoQ09ORklHX0lPU0ZfTUJJKSkgeworCQlzdGF0aWMgY29uc3Qgc3RydWN0IHg4Nl9jcHVfaWQgY3B1X2lkc1tdID0geworCQkJeyBYODZfVkVORE9SX0lOVEVMLCA2LCA1NSB9LCAvKiBWYWxsZXl2aWV3LCBCYXkgVHJhaWwgKi8KKwkJCXt9CisJCX07CisJCXUzMiBiaW9zX3N0YXR1czsKKworCQlpZiAoIXg4Nl9tYXRjaF9jcHUoY3B1X2lkcykgfHwgIWlvc2ZfbWJpX2F2YWlsYWJsZSgpKSB7CisJCQkvKiBiYWlsIHNpbGVudGx5ICovCisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisKKwkJc3RhdHVzID0gaW9zZl9tYmlfcmVhZChCVF9NQklfVU5JVF9QTUMsIC8qIDB4MDQgUFVOSVQgKi8KKwkJCQkgICAgICAgTUJJX1JFR19SRUFELCAvKiAweDEwICovCisJCQkJICAgICAgIDB4MDA2LCAvKiBCSU9TX0NPTkZJRyAqLworCQkJCSAgICAgICAmYmlvc19zdGF0dXMpOworCisJCWlmIChzdGF0dXMpIHsKKwkJCWRldl9lcnIoZGV2LCAiY291bGQgbm90IHJlYWQgUFVOSVQgQklPU19DT05GSUdcbiIpOworCQl9IGVsc2UgeworCQkJLyogYml0cyAyNjoyNyBtaXJyb3IgUE1JQyBvcHRpb25zICovCisJCQliaW9zX3N0YXR1cyA9IChiaW9zX3N0YXR1cyA+PiAyNikgJiAzOworCisJCQlpZiAoKGJpb3Nfc3RhdHVzID09IDEpIHx8IChiaW9zX3N0YXR1cyA9PSAzKSkKKwkJCQkqYnl0Y3IgPSB0cnVlOworCQkJZWxzZQorCQkJCWRldl9pbmZvKGRldiwgIkJZVC1DUiBub3QgZGV0ZWN0ZWRcbiIpOworCQl9CisJfSBlbHNlIHsKKwkJZGV2X2luZm8oZGV2LCAiSU9TRl9NQkkgbm90IGVuYWJsZWQsIG5vIEJZVC1DUiBkZXRlY3Rpb25cbiIpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisKIHN0YXRpYyBpbnQgc3N0X2FjcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwpAQCAtMjI2LDExICsyOTAsMTIgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0X2RldjsKIAlzdHJ1Y3Qgc3N0X3BsYXRmb3JtX2luZm8gKnBkYXRhOwogCXVuc2lnbmVkIGludCBkZXZfaWQ7CisJYm9vbCBieXRjciA9IGZhbHNlOwogCiAJaWQgPSBhY3BpX21hdGNoX2RldmljZShkZXYtPmRyaXZlci0+YWNwaV9tYXRjaF90YWJsZSwgZGV2KTsKIAlpZiAoIWlkKQogCQlyZXR1cm4gLUVOT0RFVjsKLQlkZXZfZGJnKGRldiwgImZvciAlcyIsIGlkLT5pZCk7CisJZGV2X2RiZyhkZXYsICJmb3IgJXNcbiIsIGlkLT5pZCk7CiAKIAltYWNoID0gKHN0cnVjdCBzc3RfYWNwaV9tYWNoICopaWQtPmRyaXZlcl9kYXRhOwogCW1hY2ggPSBzc3RfYWNwaV9maW5kX21hY2hpbmUobWFjaCk7CkBAIC0yNTEsNiArMzE2LDE4IEBACiAKIAlkZXZfZGJnKGRldiwgIkFDUEkgZGV2aWNlIGlkOiAleFxuIiwgZGV2X2lkKTsKIAorCXJldCA9IHNzdF9hbGxvY19kcnZfY29udGV4dCgmY3R4LCBkZXYsIGRldl9pZCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBpc19ieXRfY3IoZGV2LCAmYnl0Y3IpOworCWlmICghKChyZXQgPCAwKSB8fCAoYnl0Y3IgPT0gZmFsc2UpKSkgeworCQlkZXZfaW5mbyhkZXYsICJEZXRlY3RlZCBCYXl0cmFpbC1DUiBwbGF0Zm9ybVxuIik7CisKKwkJLyogb3ZlcnJpZGUgcmVzb3VyY2UgaW5mbyAqLworCQlieXRfcnZwX3BsYXRmb3JtX2RhdGEucmVzX2luZm8gPSAmYnl0Y3JfcmVzX2luZm87CisJfQorCiAJcGxhdF9kZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfZGF0YShkZXYsIHBkYXRhLT5wbGF0Zm9ybSwgLTEsCiAJCQkJCQlOVUxMLCAwKTsKIAlpZiAoSVNfRVJSKHBsYXRfZGV2KSkgewpAQCAtMjcxLDEwICszNDgsNiBAQAogCQlyZXR1cm4gUFRSX0VSUihtZGV2KTsKIAl9CiAKLQlyZXQgPSBzc3RfYWxsb2NfZHJ2X2NvbnRleHQoJmN0eCwgZGV2LCBkZXZfaWQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCiAJLyogRmlsbCBzc3QgcGxhdGZvcm0gZGF0YSAqLwogCWN0eC0+cGRhdGEgPSBwZGF0YTsKIAlzdHJjcHkoY3R4LT5maXJtd2FyZV9uYW1lLCBtYWNoLT5md19maWxlbmFtZSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3Qvc3N0X2lwYy5jIGIvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdF9pcGMuYwppbmRleCA4YWZhNmZlLi5iZmM4ODk5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3Qvc3N0X2lwYy5jCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC9zc3RfaXBjLmMKQEAgLTI2Nyw2ICsyNjcsOSBAQAogCQkJCSJQZXJpb2QgZWxhcHNlZCByY3ZkIGZvciBwaXBlIGlkIDB4JXhcbiIsCiAJCQkJcGlwZV9pZCk7CiAJCQlzdHJlYW0gPSAmc3N0X2Rydl9jdHgtPnN0cmVhbXNbc3RyX2lkXTsKKwkJCS8qIElmIHN0cmVhbSBpcyBkcm9wcGVkLCBza2lwIHByb2Nlc3NpbmcgdGhpcyBtZXNzYWdlKi8KKwkJCWlmIChzdHJlYW0tPnN0YXR1cyA9PSBTVFJFQU1fSU5JVCkKKwkJCQlicmVhazsKIAkJCWlmIChzdHJlYW0tPnBlcmlvZF9lbGFwc2VkKQogCQkJCXN0cmVhbS0+cGVyaW9kX2VsYXBzZWQoc3RyZWFtLT5wY21fc3Vic3RyZWFtKTsKIAkJCWlmIChzdHJlYW0tPmNvbXByX2NiKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdF9wdnQuYyBiL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC9zc3RfcHZ0LmMKaW5kZXggYWRiMzJmZS4uYjFlNmI4ZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdF9wdnQuYworKysgYi9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3Qvc3N0X3B2dC5jCkBAIC0yNzksMTcgKzI3OSwxNSBAQAogCiAJaWYgKHJlc3BvbnNlKSB7CiAJCXJldCA9IHNzdF93YWl0X3RpbWVvdXQoc3N0LCBibG9jayk7Ci0JCWlmIChyZXQgPCAwKSB7CisJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7Ci0JCX0gZWxzZSBpZihibG9jay0+ZGF0YSkgewotCQkJaWYgKCFkYXRhKQotCQkJCWdvdG8gb3V0OwotCQkJKmRhdGEgPSBremFsbG9jKGJsb2NrLT5zaXplLCBHRlBfS0VSTkVMKTsKLQkJCWlmICghKCpkYXRhKSkgeworCisJCWlmIChkYXRhICYmIGJsb2NrLT5kYXRhKSB7CisJCQkqZGF0YSA9IGttZW1kdXAoYmxvY2stPmRhdGEsIGJsb2NrLT5zaXplLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghKmRhdGEpIHsKIAkJCQlyZXQgPSAtRU5PTUVNOwogCQkJCWdvdG8gb3V0OwotCQkJfSBlbHNlCi0JCQkJbWVtY3B5KGRhdGEsICh2b2lkICopIGJsb2NrLT5kYXRhLCBibG9jay0+c2l6ZSk7CisJCQl9CiAJCX0KIAl9CiBvdXQ6CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYmF5dHJhaWwvc3N0LWJheXRyYWlsLWlwYy5jIGIvc291bmQvc29jL2ludGVsL2JheXRyYWlsL3NzdC1iYXl0cmFpbC1pcGMuYwppbmRleCA1YmJhYTY2Li5jODQ1NWI0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvYmF5dHJhaWwvc3N0LWJheXRyYWlsLWlwYy5jCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9iYXl0cmFpbC9zc3QtYmF5dHJhaWwtaXBjLmMKQEAgLTE4NCwxNSArMTg0LDkgQEAKIAogc3RhdGljIGlubGluZSB1NjQgc3N0X2J5dF9oZWFkZXIoaW50IG1zZ19pZCwgaW50IGRhdGEsIGJvb2wgbGFyZ2UsIGludCBzdHJfaWQpCiB7Ci0JdTY0IGhlYWRlcjsKLQotCWhlYWRlciA9IElQQ19IRUFERVJfTVNHX0lEKG1zZ19pZCkgfAotCQkgSVBDX0hFQURFUl9TVFJfSUQoc3RyX2lkKSB8Ci0JCSBJUENfSEVBREVSX0xBUkdFKGxhcmdlKSB8Ci0JCSBJUENfSEVBREVSX0RBVEEoZGF0YSkgfAotCQkgU1NUX0JZVF9JUENYX0JVU1k7Ci0KLQlyZXR1cm4gaGVhZGVyOworCXJldHVybiBJUENfSEVBREVSX01TR19JRChtc2dfaWQpIHwgSVBDX0hFQURFUl9TVFJfSUQoc3RyX2lkKSB8CisJICAgICAgIElQQ19IRUFERVJfTEFSR0UobGFyZ2UpIHwgSVBDX0hFQURFUl9EQVRBKGRhdGEpIHwKKwkgICAgICAgU1NUX0JZVF9JUENYX0JVU1k7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTE2IHNzdF9ieXRfaGVhZGVyX21zZ19pZCh1NjQgaGVhZGVyKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL2JvYXJkcy9NYWtlZmlsZSBiL3NvdW5kL3NvYy9pbnRlbC9ib2FyZHMvTWFrZWZpbGUKaW5kZXggZGFjMDNhMC4uNTYzOWYxMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL2JvYXJkcy9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL01ha2VmaWxlCkBAIC0xLDYgKzEsNyBAQAogc25kLXNvYy1zc3QtaGFzd2VsbC1vYmpzIDo9IGhhc3dlbGwubwogc25kLXNvYy1zc3QtYnl0LXJ0NTY0MC1tYWNoLW9ianMgOj0gYnl0LXJ0NTY0MC5vCiBzbmQtc29jLXNzdC1ieXQtbWF4OTgwOTAtbWFjaC1vYmpzIDo9IGJ5dC1tYXg5ODA5MC5vCitzbmQtc29jLXNzdC1iZHctcnQ1Njc3LW1hY2gtb2JqcyA6PSBiZHctcnQ1Njc3Lm8KIHNuZC1zb2Mtc3N0LWJyb2Fkd2VsbC1vYmpzIDo9IGJyb2Fkd2VsbC5vCiBzbmQtc29jLXNzdC1ieHQtZGE3MjE5X21heDk4MzU3YS1vYmpzIDo9IGJ4dF9kYTcyMTlfbWF4OTgzNTdhLm8KIHNuZC1zb2Mtc3N0LWJ4dC1ydDI5OC1vYmpzIDo9IGJ4dF9ydDI5OC5vCkBAIC0xOSw2ICsyMCw3IEBACiBvYmotJChDT05GSUdfU05EX1NPQ19JTlRFTF9CWFRfREE3MjE5X01BWDk4MzU3QV9NQUNIKSArPSBzbmQtc29jLXNzdC1ieHQtZGE3MjE5X21heDk4MzU3YS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19JTlRFTF9CWFRfUlQyOThfTUFDSCkgKz0gc25kLXNvYy1zc3QtYnh0LXJ0Mjk4Lm8KIG9iai0kKENPTkZJR19TTkRfU09DX0lOVEVMX0JST0FEV0VMTF9NQUNIKSArPSBzbmQtc29jLXNzdC1icm9hZHdlbGwubworb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfQkRXX1JUNTY3N19NQUNIKSArPSBzbmQtc29jLXNzdC1iZHctcnQ1Njc3LW1hY2gubwogb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfQllUQ1JfUlQ1NjQwX01BQ0gpICs9IHNuZC1zb2Mtc3N0LWJ5dGNyLXJ0NTY0MC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19JTlRFTF9CWVRDUl9SVDU2NTFfTUFDSCkgKz0gc25kLXNvYy1zc3QtYnl0Y3ItcnQ1NjUxLm8KIG9iai0kKENPTkZJR19TTkRfU09DX0lOVEVMX0NIVF9CU1dfUlQ1NjcyX01BQ0gpICs9IHNuZC1zb2Mtc3N0LWNodC1ic3ctcnQ1NjcyLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9ib2FyZHMvYmR3LXJ0NTY3Ny5jIGIvc291bmQvc29jL2ludGVsL2JvYXJkcy9iZHctcnQ1Njc3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ3ZTY3MAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9ib2FyZHMvYmR3LXJ0NTY3Ny5jCkBAIC0wLDAgKzEsMzQ3IEBACisvKgorICogQVNvQyBtYWNoaW5lIGRyaXZlciBmb3IgSW50ZWwgQnJvYWR3ZWxsIHBsYXRmb3JtcyB3aXRoIFJUNTY3NyBjb2RlYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgVGhlIENocm9taXVtIE9TIEF1dGhvcnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8vY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvamFjay5oPgorCisjaW5jbHVkZSAiLi4vY29tbW9uL3NzdC1kc3AuaCIKKyNpbmNsdWRlICIuLi9oYXN3ZWxsL3NzdC1oYXN3ZWxsLWlwYy5oIgorCisjaW5jbHVkZSAiLi4vLi4vY29kZWNzL3J0NTY3Ny5oIgorCitzdHJ1Y3QgYmR3X3J0NTY3N19wcml2IHsKKwlzdHJ1Y3QgZ3Bpb19kZXNjICpncGlvX2hwX2VuOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKK307CisKK3N0YXRpYyBpbnQgYmR3X3J0NTY3N19ldmVudF9ocChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmssIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSB3LT5kYXBtOworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBkYXBtLT5jYXJkOworCXN0cnVjdCBiZHdfcnQ1Njc3X3ByaXYgKmJkd19ydDU2NzcgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7CisKKwlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkKKwkJbXNsZWVwKDcwKTsKKworCWdwaW9kX3NldF92YWx1ZV9jYW5zbGVlcChiZHdfcnQ1Njc3LT5ncGlvX2hwX2VuLAorCQlTTkRfU09DX0RBUE1fRVZFTlRfT04oZXZlbnQpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYmR3X3J0NTY3N193aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX0hQKCJIZWFkcGhvbmUiLCBiZHdfcnQ1Njc3X2V2ZW50X2hwKSwKKwlTTkRfU09DX0RBUE1fU1BLKCJTcGVha2VyIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiSGVhZHNldCBNaWMiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJMb2NhbCBETUlDcyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIlJlbW90ZSBETUlDcyIsIE5VTEwpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgYmR3X3J0NTY3N19tYXBbXSA9IHsKKwkvKiBTcGVha2VycyAqLworCXsiU3BlYWtlciIsIE5VTEwsICJQRE0xTCJ9LAorCXsiU3BlYWtlciIsIE5VTEwsICJQRE0xUiJ9LAorCisJLyogSGVhZHNldCBqYWNrIGNvbm5lY3RvcnMgKi8KKwl7IkhlYWRwaG9uZSIsIE5VTEwsICJMT1VUMSJ9LAorCXsiSGVhZHBob25lIiwgTlVMTCwgIkxPVVQyIn0sCisJeyJJTjFQIiwgTlVMTCwgIkhlYWRzZXQgTWljIn0sCisJeyJJTjFOIiwgTlVMTCwgIkhlYWRzZXQgTWljIn0sCisKKwkvKiBEaWdpdGFsIE1JQ3MKKwkgKiBMb2NhbCBETUlDczogdGhlIHR3byBETUlDcyBvbiB0aGUgbWFpbmJvYXJkCisJICogUmVtb3RlIERNSUNzOiB0aGUgdHdvIERNSUNzIG9uIHRoZSBjYW1lcmEgbW9kdWxlCisJICovCisJeyJETUlDIEwxIiwgTlVMTCwgIlJlbW90ZSBETUlDcyJ9LAorCXsiRE1JQyBSMSIsIE5VTEwsICJSZW1vdGUgRE1JQ3MifSwKKwl7IkRNSUMgTDIiLCBOVUxMLCAiTG9jYWwgRE1JQ3MifSwKKwl7IkRNSUMgUjIiLCBOVUxMLCAiTG9jYWwgRE1JQ3MifSwKKworCS8qIENPREVDIEJFIGNvbm5lY3Rpb25zICovCisJeyJTU1AwIENPREVDIElOIiwgTlVMTCwgIkFJRjEgQ2FwdHVyZSJ9LAorCXsiQUlGMSBQbGF5YmFjayIsIE5VTEwsICJTU1AwIENPREVDIE9VVCJ9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGJkd19ydDU2NzdfY29udHJvbHNbXSA9IHsKKwlTT0NfREFQTV9QSU5fU1dJVENIKCJTcGVha2VyIiksCisJU09DX0RBUE1fUElOX1NXSVRDSCgiSGVhZHBob25lIiksCisJU09DX0RBUE1fUElOX1NXSVRDSCgiSGVhZHNldCBNaWMiKSwKKwlTT0NfREFQTV9QSU5fU1dJVENIKCJMb2NhbCBETUlDcyIpLAorCVNPQ19EQVBNX1BJTl9TV0lUQ0goIlJlbW90ZSBETUlDcyIpLAorfTsKKworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfamFjayBoZWFkcGhvbmVfamFjazsKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19qYWNrIG1pY19qYWNrOworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfamFja19waW4gaGVhZHBob25lX2phY2tfcGluID0geworCS5waW4JPSAiSGVhZHBob25lIiwKKwkubWFzawk9IFNORF9KQUNLX0hFQURQSE9ORSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19qYWNrX3BpbiBtaWNfamFja19waW4gPSB7CisJLnBpbgk9ICJIZWFkc2V0IE1pYyIsCisJLm1hc2sJPSBTTkRfSkFDS19NSUNST1BIT05FLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2phY2tfZ3BpbyBoZWFkcGhvbmVfamFja19ncGlvID0geworCS5uYW1lCQkJPSAicGx1Zy1kZXQiLAorCS5yZXBvcnQJCQk9IFNORF9KQUNLX0hFQURQSE9ORSwKKwkuZGVib3VuY2VfdGltZQkJPSAyMDAsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfamFja19ncGlvIG1pY19qYWNrX2dwaW8gPSB7CisJLm5hbWUJCQk9ICJtaWMtcHJlc2VudCIsCisJLnJlcG9ydAkJCT0gU05EX0pBQ0tfTUlDUk9QSE9ORSwKKwkuZGVib3VuY2VfdGltZQkJPSAyMDAsCisJLmludmVydAkJCT0gMSwKK307CisKK3N0YXRpYyBpbnQgYnJvYWR3ZWxsX3NzcDBfZml4dXAoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwKKwkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKnJhdGUgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCisJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSk7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqY2hhbm5lbHMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCisJCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMpOworCisJLyogVGhlIEFEU1Agd2lsbCBjb3ZlcnQgdGhlIEZFIHJhdGUgdG8gNDhrLCBzdGVyZW8gKi8KKwlyYXRlLT5taW4gPSByYXRlLT5tYXggPSA0ODAwMDsKKwljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IDI7CisKKwkvKiBzZXQgU1NQMCB0byAxNiBiaXQgKi8KKwlzbmRfbWFza19zZXQoJnBhcmFtcy0+bWFza3NbU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCAtCisJCQkJICAgIFNORFJWX1BDTV9IV19QQVJBTV9GSVJTVF9NQVNLXSwKKwkJCQkgICAgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJkd19ydDU2NzdfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCWludCByZXQ7CisKKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgUlQ1Njc3X1NDTEtfU19NQ0xLLCAyNDU3NjAwMCwKKwkJU05EX1NPQ19DTE9DS19JTik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihydGQtPmRldiwgImNhbid0IHNldCBjb2RlYyBzeXNjbGsgY29uZmlndXJhdGlvblxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBiZHdfcnQ1Njc3X29wcyA9IHsKKwkuaHdfcGFyYW1zID0gYmR3X3J0NTY3N19od19wYXJhbXMsCit9OworCitzdGF0aWMgaW50IGJkd19ydDU2NzdfcnRkX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKK3sKKwlzdHJ1Y3Qgc3N0X3BkYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEocnRkLT5wbGF0Zm9ybS0+ZGV2KTsKKwlzdHJ1Y3Qgc3N0X2hzdyAqYnJvYWR3ZWxsID0gcGRhdGEtPmRzcDsKKwlpbnQgcmV0OworCisJLyogU2V0IEFEU1AgU1NQIHBvcnQgc2V0dGluZ3MgKi8KKwlyZXQgPSBzc3RfaHN3X2RldmljZV9zZXRfY29uZmlnKGJyb2Fkd2VsbCwgU1NUX0hTV19ERVZJQ0VfU1NQXzAsCisJCVNTVF9IU1dfREVWSUNFX01DTEtfRlJFUV8yNF9NSFosCisJCVNTVF9IU1dfREVWSUNFX0NMT0NLX01BU1RFUiwgOSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihydGQtPmRldiwgImVycm9yOiBmYWlsZWQgdG8gc2V0IGRldmljZSBjb25maWdcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJkd19ydDU2NzdfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCXN0cnVjdCBiZHdfcnQ1Njc3X3ByaXYgKmJkd19ydDU2NzcgPQorCQkJc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKHJ0ZC0+Y2FyZCk7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSBzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKTsKKworCS8qIEVuYWJsZSBjb2RlYyBBU1JDIGZ1bmN0aW9uIGZvciBTdGVyZW8gREFDL1N0ZXJlbzEgQURDL0RNSUMvSTJTMS4KKwkgKiBUaGUgQVNSQyBjbG9jayBzb3VyY2UgaXMgY2xrX2kyczFfYXNyYy4KKwkgKi8KKwlydDU2Nzdfc2VsX2FzcmNfY2xrX3NyYyhjb2RlYywgUlQ1Njc3X0RBX1NURVJFT19GSUxURVIgfAorCQkJUlQ1Njc3X0FEX1NURVJFTzFfRklMVEVSIHwgUlQ1Njc3X0kyUzFfU09VUkNFLAorCQkJUlQ1Njc3X0NMS19TRUxfSTJTMV9BU1JDKTsKKworCS8qIFJlcXVlc3QgcnQ1Njc3IEdQSU8gZm9yIGhlYWRwaG9uZSBhbXAgY29udHJvbCAqLworCWJkd19ydDU2NzctPmdwaW9faHBfZW4gPSBkZXZtX2dwaW9kX2dldF9pbmRleChjb2RlYy0+ZGV2LAorCQkJImhlYWRwaG9uZS1lbmFibGUiLCAwLCAwKTsKKwlpZiAoSVNfRVJSKGJkd19ydDU2NzctPmdwaW9faHBfZW4pKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkNhbid0IGZpbmQgSFBfQU1QX1NIRE5fTCBncGlvXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoYmR3X3J0NTY3Ny0+Z3Bpb19ocF9lbik7CisJfQorCWdwaW9kX2RpcmVjdGlvbl9vdXRwdXQoYmR3X3J0NTY3Ny0+Z3Bpb19ocF9lbiwgMCk7CisKKwkvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgaGVhZHBob25lIGphY2sgKi8KKwlpZiAoIXNuZF9zb2NfY2FyZF9qYWNrX25ldyhydGQtPmNhcmQsICJIZWFkcGhvbmUgSmFjayIsCisJCQlTTkRfSkFDS19IRUFEUEhPTkUsICZoZWFkcGhvbmVfamFjaywKKwkJCSZoZWFkcGhvbmVfamFja19waW4sIDEpKSB7CisJCWhlYWRwaG9uZV9qYWNrX2dwaW8uZ3Bpb2RfZGV2ID0gY29kZWMtPmRldjsKKwkJaWYgKHNuZF9zb2NfamFja19hZGRfZ3Bpb3MoJmhlYWRwaG9uZV9qYWNrLCAxLAorCQkJCSZoZWFkcGhvbmVfamFja19ncGlvKSkKKwkJCWRldl9lcnIoY29kZWMtPmRldiwgIkNhbid0IGFkZCBoZWFkcGhvbmUgamFjayBncGlvXG4iKTsKKwl9IGVsc2UgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJDYW4ndCBjcmVhdGUgaGVhZHBob25lIGphY2tcbiIpOworCX0KKworCS8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBtaWMgamFjayAqLworCWlmICghc25kX3NvY19jYXJkX2phY2tfbmV3KHJ0ZC0+Y2FyZCwgIk1pYyBKYWNrIiwKKwkJCVNORF9KQUNLX01JQ1JPUEhPTkUsICZtaWNfamFjaywKKwkJCSZtaWNfamFja19waW4sIDEpKSB7CisJCW1pY19qYWNrX2dwaW8uZ3Bpb2RfZGV2ID0gY29kZWMtPmRldjsKKwkJaWYgKHNuZF9zb2NfamFja19hZGRfZ3Bpb3MoJm1pY19qYWNrLCAxLCAmbWljX2phY2tfZ3BpbykpCisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJDYW4ndCBhZGQgbWljIGphY2sgZ3Bpb1xuIik7CisJfSBlbHNlIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiQ2FuJ3QgY3JlYXRlIG1pYyBqYWNrXG4iKTsKKwl9CisJYmR3X3J0NTY3Ny0+Y29kZWMgPSBjb2RlYzsKKworCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKGRhcG0sICJNSUNCSUFTMSIpOworCXJldHVybiAwOworfQorCisvKiBicm9hZHdlbGwgZGlnaXRhbCBhdWRpbyBpbnRlcmZhY2UgZ2x1ZSAtIGNvbm5lY3RzIGNvZGVjIDwtLT4gQ1BVICovCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgYmR3X3J0NTY3N19kYWlzW10gPSB7CisJLyogRnJvbnQgRW5kIERBSSBsaW5rcyAqLworCXsKKwkJLm5hbWUgPSAiU3lzdGVtIFBDTSIsCisJCS5zdHJlYW1fbmFtZSA9ICJTeXN0ZW0gUGxheWJhY2svQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiU3lzdGVtIFBpbiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gImhhc3dlbGwtcGNtLWF1ZGlvIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmluaXQgPSBiZHdfcnQ1Njc3X3J0ZF9pbml0LAorCQkudHJpZ2dlciA9IHsKKwkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsCisJCQlTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUCisJCX0sCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJfSwKKworCS8qIEJhY2sgRW5kIERBSSBsaW5rcyAqLworCXsKKwkJLyogU1NQMCAtIENvZGVjICovCisJCS5uYW1lID0gIkNvZGVjIiwKKwkJLmlkID0gMCwKKwkJLmNwdV9kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkubm9fcGNtID0gMSwKKwkJLmNvZGVjX25hbWUgPSAiaTJjLVJUNTY3N0NFOjAwIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInJ0NTY3Ny1haWYxIiwKKwkJLmRhaV9mbXQgPSBTTkRfU09DX0RBSUZNVF9JMlMgfCBTTkRfU09DX0RBSUZNVF9OQl9ORiB8CisJCQlTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IGJyb2Fkd2VsbF9zc3AwX2ZpeHVwLAorCQkub3BzID0gJmJkd19ydDU2Nzdfb3BzLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkuaW5pdCA9IGJkd19ydDU2NzdfaW5pdCwKKwl9LAorfTsKKworc3RhdGljIGludCBiZHdfcnQ1Njc3X3N1c3BlbmRfcHJlKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCit7CisJc3RydWN0IGJkd19ydDU2NzdfcHJpdiAqYmR3X3J0NTY3NyA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG07CisKKwlpZiAoYmR3X3J0NTY3Ny0+Y29kZWMpIHsKKwkJZGFwbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oYmR3X3J0NTY3Ny0+Y29kZWMpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIk1JQ0JJQVMxIik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJkd19ydDU2NzdfcmVzdW1lX3Bvc3Qoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKK3sKKwlzdHJ1Y3QgYmR3X3J0NTY3N19wcml2ICpiZHdfcnQ1Njc3ID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbTsKKworCWlmIChiZHdfcnQ1Njc3LT5jb2RlYykgeworCQlkYXBtID0gc25kX3NvY19jb2RlY19nZXRfZGFwbShiZHdfcnQ1Njc3LT5jb2RlYyk7CisJCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKGRhcG0sICJNSUNCSUFTMSIpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogQVNvQyBtYWNoaW5lIGRyaXZlciBmb3IgQnJvYWR3ZWxsIERTUCArIFJUNTY3NyAqLworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgYmR3X3J0NTY3N19jYXJkID0geworCS5uYW1lID0gImJkdy1ydDU2NzciLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5kYWlfbGluayA9IGJkd19ydDU2NzdfZGFpcywKKwkubnVtX2xpbmtzID0gQVJSQVlfU0laRShiZHdfcnQ1Njc3X2RhaXMpLAorCS5kYXBtX3dpZGdldHMgPSBiZHdfcnQ1Njc3X3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGJkd19ydDU2Nzdfd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYmR3X3J0NTY3N19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYmR3X3J0NTY3N19tYXApLAorCS5jb250cm9scyA9IGJkd19ydDU2NzdfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoYmR3X3J0NTY3N19jb250cm9scyksCisJLmZ1bGx5X3JvdXRlZCA9IHRydWUsCisJLnN1c3BlbmRfcHJlID0gYmR3X3J0NTY3N19zdXNwZW5kX3ByZSwKKwkucmVzdW1lX3Bvc3QgPSBiZHdfcnQ1Njc3X3Jlc3VtZV9wb3N0LAorfTsKKworc3RhdGljIGludCBiZHdfcnQ1Njc3X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGJkd19ydDU2NzdfcHJpdiAqYmR3X3J0NTY3NzsKKworCWJkd19ydDU2NzdfY2FyZC5kZXYgPSAmcGRldi0+ZGV2OworCisJLyogQWxsb2NhdGUgZHJpdmVyIHByaXZhdGUgc3RydWN0ICovCisJYmR3X3J0NTY3NyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGJkd19ydDU2NzdfcHJpdiksCisJCUdGUF9LRVJORUwpOworCWlmICghYmR3X3J0NTY3NykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBhbGxvY2F0ZSBiZHdfcnQ1Njc3XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc25kX3NvY19jYXJkX3NldF9kcnZkYXRhKCZiZHdfcnQ1Njc3X2NhcmQsIGJkd19ydDU2NzcpOworCisJcmV0dXJuIGRldm1fc25kX3NvY19yZWdpc3Rlcl9jYXJkKCZwZGV2LT5kZXYsICZiZHdfcnQ1Njc3X2NhcmQpOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBiZHdfcnQ1Njc3X2F1ZGlvID0geworCS5wcm9iZSA9IGJkd19ydDU2NzdfcHJvYmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYmR3LXJ0NTY3NyIsCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYmR3X3J0NTY3N19hdWRpbykKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfQVVUSE9SKCJCZW4gWmhhbmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgQnJvYWR3ZWxsIFJUNTY3NyBtYWNoaW5lIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpiZHctcnQ1Njc3Iik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL2J4dF9kYTcyMTlfbWF4OTgzNTdhLmMgYi9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL2J4dF9kYTcyMTlfbWF4OTgzNTdhLmMKaW5kZXggMzc3NGIxMS4uNjUzMmI4ZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL2JvYXJkcy9ieHRfZGE3MjE5X21heDk4MzU3YS5jCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9ib2FyZHMvYnh0X2RhNzIxOV9tYXg5ODM1N2EuYwpAQCAtMzcsNiArMzcsNyBAQAogCUJYVF9EUENNX0FVRElPX1BCID0gMCwKIAlCWFRfRFBDTV9BVURJT19DUCwKIAlCWFRfRFBDTV9BVURJT19SRUZfQ1AsCisJQlhUX0RQQ01fQVVESU9fRE1JQ19DUCwKIAlCWFRfRFBDTV9BVURJT19IRE1JMV9QQiwKIAlCWFRfRFBDTV9BVURJT19IRE1JMl9QQiwKIAlCWFRfRFBDTV9BVURJT19IRE1JM19QQiwKQEAgLTI1MiwxMCArMjUzLDU2IEBACiAJLmh3X2ZyZWUgPSBicm94dG9uX2RhNzIxOV9od19mcmVlLAogfTsKIAorc3RhdGljIGludCBicm94dG9uX2RtaWNfZml4dXAoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwKKwkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKmNoYW5uZWxzID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAorCQkJCQkJU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTKTsKKwljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IERVQUxfQ0hBTk5FTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJyb3h0b25fZG1pY19zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisKKwlydW50aW1lLT5ody5jaGFubmVsc19tYXggPSBEVUFMX0NIQU5ORUw7CisJc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTLAorCQkJJmNvbnN0cmFpbnRzX2NoYW5uZWxzKTsKKworCXJldHVybiBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChzdWJzdHJlYW0tPnJ1bnRpbWUsIDAsCisJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwgJmNvbnN0cmFpbnRzX3JhdGVzKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX29wcyBicm94dG9uX2RtaWNfb3BzID0geworCS5zdGFydHVwID0gYnJveHRvbl9kbWljX3N0YXJ0dXAsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJhdGVzXzE2MDAwW10gPSB7CisJMTYwMDAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzE2MDAwID0geworCS5jb3VudCA9IEFSUkFZX1NJWkUocmF0ZXNfMTYwMDApLAorCS5saXN0ICA9IHJhdGVzXzE2MDAwLAorfTsKKworc3RhdGljIGludCBicm94dG9uX3JlZmNhcF9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXJldHVybiBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChzdWJzdHJlYW0tPnJ1bnRpbWUsIDAsCisJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKKwkJCSZjb25zdHJhaW50c18xNjAwMCk7Cit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIGJyb3h0b25fcmVmY2FwX29wcyA9IHsKKwkuc3RhcnR1cCA9IGJyb3h0b25fcmVmY2FwX3N0YXJ0dXAsCit9OworCiAvKiBicm94dG9uIGRpZ2l0YWwgYXVkaW8gaW50ZXJmYWNlIGdsdWUgLSBjb25uZWN0cyBjb2RlYyA8LS0+IENQVSAqLwogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGJyb3h0b25fZGFpc1tdID0gewogCS8qIEZyb250IEVuZCBEQUkgbGlua3MgKi8KLQlbQlhUX0RQQ01fQVVESU9fUEJdCisJW0JYVF9EUENNX0FVRElPX1BCXSA9CiAJewogCQkubmFtZSA9ICJCeHQgQXVkaW8gUG9ydCIsCiAJCS5zdHJlYW1fbmFtZSA9ICJBdWRpbyIsCkBAIC0yNzEsNyArMzE4LDcgQEAKIAkJLmRwY21fcGxheWJhY2sgPSAxLAogCQkub3BzID0gJmJyb3h0b25fZGE3MjE5X2ZlX29wcywKIAl9LAotCVtCWFRfRFBDTV9BVURJT19DUF0KKwlbQlhUX0RQQ01fQVVESU9fQ1BdID0KIAl7CiAJCS5uYW1lID0gIkJ4dCBBdWRpbyBDYXB0dXJlIFBvcnQiLAogCQkuc3RyZWFtX25hbWUgPSAiQXVkaW8gUmVjb3JkIiwKQEAgLTI4Niw3ICszMzMsNyBAQAogCQkuZHBjbV9jYXB0dXJlID0gMSwKIAkJLm9wcyA9ICZicm94dG9uX2RhNzIxOV9mZV9vcHMsCiAJfSwKLQlbQlhUX0RQQ01fQVVESU9fUkVGX0NQXQorCVtCWFRfRFBDTV9BVURJT19SRUZfQ1BdID0KIAl7CiAJCS5uYW1lID0gIkJ4dCBBdWRpbyBSZWZlcmVuY2UgY2FwIiwKIAkJLnN0cmVhbV9uYW1lID0gIlJlZmNhcCIsCkBAIC0yOTksOCArMzQ2LDIzIEBACiAJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCiAJCS5ub25hdG9taWMgPSAxLAogCQkuZHluYW1pYyA9IDEsCisJCS5vcHMgPSAmYnJveHRvbl9yZWZjYXBfb3BzLAogCX0sCi0JW0JYVF9EUENNX0FVRElPX0hETUkxX1BCXQorCVtCWFRfRFBDTV9BVURJT19ETUlDX0NQXQorCXsKKwkJLm5hbWUgPSAiQnh0IEF1ZGlvIERNSUMgY2FwIiwKKwkJLnN0cmVhbV9uYW1lID0gImRtaWNjYXAiLAorCQkuY3B1X2RhaV9uYW1lID0gIkRNSUMgUGluIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gIjAwMDA6MDA6MGUuMCIsCisJCS5pbml0ID0gTlVMTCwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5ub25hdG9taWMgPSAxLAorCQkuZHluYW1pYyA9IDEsCisJCS5vcHMgPSAmYnJveHRvbl9kbWljX29wcywKKwl9LAorCVtCWFRfRFBDTV9BVURJT19IRE1JMV9QQl0gPQogCXsKIAkJLm5hbWUgPSAiQnh0IEhETUkgUG9ydDEiLAogCQkuc3RyZWFtX25hbWUgPSAiSGRtaTEiLApAQCAtMzEzLDcgKzM3NSw3IEBACiAJCS5ub25hdG9taWMgPSAxLAogCQkuZHluYW1pYyA9IDEsCiAJfSwKLQlbQlhUX0RQQ01fQVVESU9fSERNSTJfUEJdCisJW0JYVF9EUENNX0FVRElPX0hETUkyX1BCXSA9CiAJewogCQkubmFtZSA9ICJCeHQgSERNSSBQb3J0MiIsCiAJCS5zdHJlYW1fbmFtZSA9ICJIZG1pMiIsCkBAIC0zMjYsNyArMzg4LDcgQEAKIAkJLm5vbmF0b21pYyA9IDEsCiAJCS5keW5hbWljID0gMSwKIAl9LAotCVtCWFRfRFBDTV9BVURJT19IRE1JM19QQl0KKwlbQlhUX0RQQ01fQVVESU9fSERNSTNfUEJdID0KIAl7CiAJCS5uYW1lID0gIkJ4dCBIRE1JIFBvcnQzIiwKIAkJLnN0cmVhbV9uYW1lID0gIkhkbWkzIiwKQEAgLTM4Miw2ICs0NDQsNyBAQAogCQkuY29kZWNfZGFpX25hbWUgPSAiZG1pYy1oaWZpIiwKIAkJLnBsYXRmb3JtX25hbWUgPSAiMDAwMDowMDowZS4wIiwKIAkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IGJyb3h0b25fZG1pY19maXh1cCwKIAkJLmRwY21fY2FwdHVyZSA9IDEsCiAJCS5ub19wY20gPSAxLAogCX0sCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL2J4dF9ydDI5OC5jIGIvc291bmQvc29jL2ludGVsL2JvYXJkcy9ieHRfcnQyOTguYwppbmRleCAyNTNkN2JmLi5kNjEwYmRjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL2J4dF9ydDI5OC5jCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9ib2FyZHMvYnh0X3J0Mjk4LmMKQEAgLTI3MSw3ICsyNzEsNyBAQAogLyogYnJveHRvbiBkaWdpdGFsIGF1ZGlvIGludGVyZmFjZSBnbHVlIC0gY29ubmVjdHMgY29kZWMgPC0tPiBDUFUgKi8KIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBicm94dG9uX3J0Mjk4X2RhaXNbXSA9IHsKIAkvKiBGcm9udCBFbmQgREFJIGxpbmtzICovCi0JW0JYVF9EUENNX0FVRElPX1BCXQorCVtCWFRfRFBDTV9BVURJT19QQl0gPQogCXsKIAkJLm5hbWUgPSAiQnh0IEF1ZGlvIFBvcnQiLAogCQkuc3RyZWFtX25hbWUgPSAiQXVkaW8iLApAQCAtMjg2LDcgKzI4Niw3IEBACiAJCS5kcGNtX3BsYXliYWNrID0gMSwKIAkJLm9wcyA9ICZicm94dG9uX3J0Mjg2X2ZlX29wcywKIAl9LAotCVtCWFRfRFBDTV9BVURJT19DUF0KKwlbQlhUX0RQQ01fQVVESU9fQ1BdID0KIAl7CiAJCS5uYW1lID0gIkJ4dCBBdWRpbyBDYXB0dXJlIFBvcnQiLAogCQkuc3RyZWFtX25hbWUgPSAiQXVkaW8gUmVjb3JkIiwKQEAgLTMwMCw3ICszMDAsNyBAQAogCQkuZHBjbV9jYXB0dXJlID0gMSwKIAkJLm9wcyA9ICZicm94dG9uX3J0Mjg2X2ZlX29wcywKIAl9LAotCVtCWFRfRFBDTV9BVURJT19SRUZfQ1BdCisJW0JYVF9EUENNX0FVRElPX1JFRl9DUF0gPQogCXsKIAkJLm5hbWUgPSAiQnh0IEF1ZGlvIFJlZmVyZW5jZSBjYXAiLAogCQkuc3RyZWFtX25hbWUgPSAicmVmY2FwIiwKQEAgLTMxMyw3ICszMTMsNyBAQAogCQkubm9uYXRvbWljID0gMSwKIAkJLmR5bmFtaWMgPSAxLAogCX0sCi0JW0JYVF9EUENNX0FVRElPX0RNSUNfQ1BdCisJW0JYVF9EUENNX0FVRElPX0RNSUNfQ1BdID0KIAl7CiAJCS5uYW1lID0gIkJ4dCBBdWRpbyBETUlDIGNhcCIsCiAJCS5zdHJlYW1fbmFtZSA9ICJkbWljY2FwIiwKQEAgLTMyNyw3ICszMjcsNyBAQAogCQkuZHluYW1pYyA9IDEsCiAJCS5vcHMgPSAmYnJveHRvbl9kbWljX29wcywKIAl9LAotCVtCWFRfRFBDTV9BVURJT19IRE1JMV9QQl0KKwlbQlhUX0RQQ01fQVVESU9fSERNSTFfUEJdID0KIAl7CiAJCS5uYW1lID0gIkJ4dCBIRE1JIFBvcnQxIiwKIAkJLnN0cmVhbV9uYW1lID0gIkhkbWkxIiwKQEAgLTM0MCw3ICszNDAsNyBAQAogCQkubm9uYXRvbWljID0gMSwKIAkJLmR5bmFtaWMgPSAxLAogCX0sCi0JW0JYVF9EUENNX0FVRElPX0hETUkyX1BCXQorCVtCWFRfRFBDTV9BVURJT19IRE1JMl9QQl0gPQogCXsKIAkJLm5hbWUgPSAiQnh0IEhETUkgUG9ydDIiLAogCQkuc3RyZWFtX25hbWUgPSAiSGRtaTIiLApAQCAtMzUzLDcgKzM1Myw3IEBACiAJCS5ub25hdG9taWMgPSAxLAogCQkuZHluYW1pYyA9IDEsCiAJfSwKLQlbQlhUX0RQQ01fQVVESU9fSERNSTNfUEJdCisJW0JYVF9EUENNX0FVRElPX0hETUkzX1BCXSA9CiAJewogCQkubmFtZSA9ICJCeHQgSERNSSBQb3J0MyIsCiAJCS5zdHJlYW1fbmFtZSA9ICJIZG1pMyIsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL2J5dGNyX3J0NTY0MC5jIGIvc291bmQvc29jL2ludGVsL2JvYXJkcy9ieXRjcl9ydDU2NDAuYwppbmRleCA4OGVmYjYyLi5iZmY3N2ExIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL2J5dGNyX3J0NTY0MC5jCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9ib2FyZHMvYnl0Y3JfcnQ1NjQwLmMKQEAgLTI0LDYgKzI0LDkgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8YXNtL2NwdV9kZXZpY2VfaWQuaD4KKyNpbmNsdWRlIDxhc20vcGxhdGZvcm1fc3N0X2F1ZGlvLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgpAQCAtMzEsNDIgKzM0LDE1MyBAQAogI2luY2x1ZGUgIi4uLy4uL2NvZGVjcy9ydDU2NDAuaCIKICNpbmNsdWRlICIuLi9hdG9tL3NzdC1hdG9tLWNvbnRyb2xzLmgiCiAjaW5jbHVkZSAiLi4vY29tbW9uL3NzdC1hY3BpLmgiCisjaW5jbHVkZSAiLi4vY29tbW9uL3NzdC1kc3AuaCIKIAogZW51bSB7CiAJQllUX1JUNTY0MF9ETUlDMV9NQVAsCiAJQllUX1JUNTY0MF9ETUlDMl9NQVAsCiAJQllUX1JUNTY0MF9JTjFfTUFQLAorCUJZVF9SVDU2NDBfSU4zX01BUCwKIH07CiAKICNkZWZpbmUgQllUX1JUNTY0MF9NQVAocXVpcmspCSgocXVpcmspICYgMHhmZikKICNkZWZpbmUgQllUX1JUNTY0MF9ETUlDX0VOCUJJVCgxNikKKyNkZWZpbmUgQllUX1JUNTY0MF9NT05PX1NQRUFLRVIgQklUKDE3KQorI2RlZmluZSBCWVRfUlQ1NjQwX0RJRkZfTUlDICAgICBCSVQoMTgpIC8qIGRlZmF1dCBpcyBzaW5nbGUtZW5kZWQgKi8KKyNkZWZpbmUgQllUX1JUNTY0MF9TU1AyX0FJRjIgICAgIEJJVCgxOSkgLyogZGVmYXVsdCBpcyB1c2luZyBBSUYxICAqLworI2RlZmluZSBCWVRfUlQ1NjQwX1NTUDBfQUlGMSAgICAgQklUKDIwKQorI2RlZmluZSBCWVRfUlQ1NjQwX1NTUDBfQUlGMiAgICAgQklUKDIxKQorI2RlZmluZSBCWVRfUlQ1NjQwX01DTEtfRU4JQklUKDIyKQorI2RlZmluZSBCWVRfUlQ1NjQwX01DTEtfMjVNSFoJQklUKDIzKQorCitzdHJ1Y3QgYnl0X3J0NTY0MF9wcml2YXRlIHsKKwlzdHJ1Y3QgY2xrICptY2xrOworfTsKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgYnl0X3J0NTY0MF9xdWlyayA9IEJZVF9SVDU2NDBfRE1JQzFfTUFQIHwKLQkJCQkJQllUX1JUNTY0MF9ETUlDX0VOOworCQkJCQlCWVRfUlQ1NjQwX0RNSUNfRU4gfAorCQkJCQlCWVRfUlQ1NjQwX01DTEtfRU47CisKK3N0YXRpYyB2b2lkIGxvZ19xdWlya3Moc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmIChCWVRfUlQ1NjQwX01BUChieXRfcnQ1NjQwX3F1aXJrKSA9PSBCWVRfUlQ1NjQwX0RNSUMxX01BUCkKKwkJZGV2X2luZm8oZGV2LCAicXVpcmsgRE1JQzFfTUFQIGVuYWJsZWQiKTsKKwlpZiAoQllUX1JUNTY0MF9NQVAoYnl0X3J0NTY0MF9xdWlyaykgPT0gQllUX1JUNTY0MF9ETUlDMl9NQVApCisJCWRldl9pbmZvKGRldiwgInF1aXJrIERNSUMyX01BUCBlbmFibGVkIik7CisJaWYgKEJZVF9SVDU2NDBfTUFQKGJ5dF9ydDU2NDBfcXVpcmspID09IEJZVF9SVDU2NDBfSU4xX01BUCkKKwkJZGV2X2luZm8oZGV2LCAicXVpcmsgSU4xX01BUCBlbmFibGVkIik7CisJaWYgKEJZVF9SVDU2NDBfTUFQKGJ5dF9ydDU2NDBfcXVpcmspID09IEJZVF9SVDU2NDBfSU4zX01BUCkKKwkJZGV2X2luZm8oZGV2LCAicXVpcmsgSU4zX01BUCBlbmFibGVkIik7CisJaWYgKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX0RNSUNfRU4pCisJCWRldl9pbmZvKGRldiwgInF1aXJrIERNSUMgZW5hYmxlZCIpOworCWlmIChieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9NT05PX1NQRUFLRVIpCisJCWRldl9pbmZvKGRldiwgInF1aXJrIE1PTk9fU1BFQUtFUiBlbmFibGVkIik7CisJaWYgKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX0RJRkZfTUlDKQorCQlkZXZfaW5mbyhkZXYsICJxdWlyayBESUZGX01JQyBlbmFibGVkIik7CisJaWYgKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX1NTUDJfQUlGMikKKwkJZGV2X2luZm8oZGV2LCAicXVpcmsgU1NQMl9BSUYyIGVuYWJsZWQiKTsKKwlpZiAoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfU1NQMF9BSUYxKQorCQlkZXZfaW5mbyhkZXYsICJxdWlyayBTU1AwX0FJRjEgZW5hYmxlZCIpOworCWlmIChieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9TU1AwX0FJRjIpCisJCWRldl9pbmZvKGRldiwgInF1aXJrIFNTUDBfQUlGMiBlbmFibGVkIik7CisJaWYgKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX01DTEtfRU4pCisJCWRldl9pbmZvKGRldiwgInF1aXJrIE1DTEtfRU4gZW5hYmxlZCIpOworCWlmIChieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9NQ0xLXzI1TUhaKQorCQlkZXZfaW5mbyhkZXYsICJxdWlyayBNQ0xLXzI1TUhaIGVuYWJsZWQiKTsKK30KKworCisjZGVmaW5lIEJZVF9DT0RFQ19EQUkxCSJydDU2NDAtYWlmMSIKKyNkZWZpbmUgQllUX0NPREVDX0RBSTIJInJ0NTY0MC1haWYyIgorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzbmRfc29jX2RhaSAqYnl0X2dldF9jb2RlY19kYWkoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShydGQsICZjYXJkLT5ydGRfbGlzdCwgbGlzdCkgeworCQlpZiAoIXN0cm5jbXAocnRkLT5jb2RlY19kYWktPm5hbWUsIEJZVF9DT0RFQ19EQUkxLAorCQkJICAgICBzdHJsZW4oQllUX0NPREVDX0RBSTEpKSkKKwkJCXJldHVybiBydGQtPmNvZGVjX2RhaTsKKwkJaWYgKCFzdHJuY21wKHJ0ZC0+Y29kZWNfZGFpLT5uYW1lLCBCWVRfQ09ERUNfREFJMiwKKwkJCQlzdHJsZW4oQllUX0NPREVDX0RBSTIpKSkKKwkJCXJldHVybiBydGQtPmNvZGVjX2RhaTsKKworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBwbGF0Zm9ybV9jbG9ja19jb250cm9sKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJCSAgc3RydWN0IHNuZF9rY29udHJvbCAqaywgaW50ICBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSB3LT5kYXBtOworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBkYXBtLT5jYXJkOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpOworCXN0cnVjdCBieXRfcnQ1NjQwX3ByaXZhdGUgKnByaXYgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7CisJaW50IHJldDsKKworCWNvZGVjX2RhaSA9IGJ5dF9nZXRfY29kZWNfZGFpKGNhcmQpOworCWlmICghY29kZWNfZGFpKSB7CisJCWRldl9lcnIoY2FyZC0+ZGV2LAorCQkJIkNvZGVjIGRhaSBub3QgZm91bmQ7IFVuYWJsZSB0byBzZXQgcGxhdGZvcm0gY2xvY2tcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoU05EX1NPQ19EQVBNX0VWRU5UX09OKGV2ZW50KSkgeworCQlpZiAoKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX01DTEtfRU4pICYmIHByaXYtPm1jbGspIHsKKwkJCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShwcml2LT5tY2xrKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkJCSJjb3VsZCBub3QgY29uZmlndXJlIE1DTEsgc3RhdGUiKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCBSVDU2NDBfU0NMS19TX1BMTDEsCisJCQkJCSAgICAgNDgwMDAgKiA1MTIsCisJCQkJCSAgICAgU05EX1NPQ19DTE9DS19JTik7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogU2V0IGNvZGVjIGNsb2NrIHNvdXJjZSB0byBpbnRlcm5hbCBjbG9jayBiZWZvcmUKKwkJICogdHVybmluZyBvZmYgdGhlIHBsYXRmb3JtIGNsb2NrLiBDb2RlYyBuZWVkcyBjbG9jaworCQkgKiBmb3IgSmFjayBkZXRlY3Rpb24gYW5kIGJ1dHRvbiBwcmVzcworCQkgKi8KKwkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIFJUNTY0MF9TQ0xLX1NfUkNDTEssCisJCQkJCSAgICAgMCwKKwkJCQkJICAgICBTTkRfU09DX0NMT0NLX0lOKTsKKwkJaWYgKCFyZXQpIHsKKwkJCWlmICgoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfTUNMS19FTikgJiYgcHJpdi0+bWNsaykKKwkJCQljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+bWNsayk7CisJCX0KKwl9CisKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbid0IHNldCBjb2RlYyBzeXNjbGs6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYnl0X3J0NTY0MF93aWRnZXRzW10gPSB7CiAJU05EX1NPQ19EQVBNX0hQKCJIZWFkcGhvbmUiLCBOVUxMKSwKIAlTTkRfU09DX0RBUE1fTUlDKCJIZWFkc2V0IE1pYyIsIE5VTEwpLAogCVNORF9TT0NfREFQTV9NSUMoIkludGVybmFsIE1pYyIsIE5VTEwpLAogCVNORF9TT0NfREFQTV9TUEsoIlNwZWFrZXIiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJQbGF0Zm9ybSBDbG9jayIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAgICBwbGF0Zm9ybV9jbG9ja19jb250cm9sLCBTTkRfU09DX0RBUE1fUFJFX1BNVSB8CisJCQkgICAgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgYnl0X3J0NTY0MF9hdWRpb19tYXBbXSA9IHsKLQl7IkFJRjEgUGxheWJhY2siLCBOVUxMLCAic3NwMiBUeCJ9LAotCXsic3NwMiBUeCIsIE5VTEwsICJjb2RlY19vdXQwIn0sCi0JeyJzc3AyIFR4IiwgTlVMTCwgImNvZGVjX291dDEifSwKLQl7ImNvZGVjX2luMCIsIE5VTEwsICJzc3AyIFJ4In0sCi0JeyJjb2RlY19pbjEiLCBOVUxMLCAic3NwMiBSeCJ9LAotCXsic3NwMiBSeCIsIE5VTEwsICJBSUYxIENhcHR1cmUifSwKKwl7IkhlYWRwaG9uZSIsIE5VTEwsICJQbGF0Zm9ybSBDbG9jayJ9LAorCXsiSGVhZHNldCBNaWMiLCBOVUxMLCAiUGxhdGZvcm0gQ2xvY2sifSwKKwl7IkludGVybmFsIE1pYyIsIE5VTEwsICJQbGF0Zm9ybSBDbG9jayJ9LAorCXsiU3BlYWtlciIsIE5VTEwsICJQbGF0Zm9ybSBDbG9jayJ9LAogCiAJeyJIZWFkc2V0IE1pYyIsIE5VTEwsICJNSUNCSUFTMSJ9LAogCXsiSU4yUCIsIE5VTEwsICJIZWFkc2V0IE1pYyJ9LAogCXsiSGVhZHBob25lIiwgTlVMTCwgIkhQT0wifSwKIAl7IkhlYWRwaG9uZSIsIE5VTEwsICJIUE9SIn0sCi0JeyJTcGVha2VyIiwgTlVMTCwgIlNQT0xQIn0sCi0JeyJTcGVha2VyIiwgTlVMTCwgIlNQT0xOIn0sCi0JeyJTcGVha2VyIiwgTlVMTCwgIlNQT1JQIn0sCi0JeyJTcGVha2VyIiwgTlVMTCwgIlNQT1JOIn0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBieXRfcnQ1NjQwX2ludG1pY19kbWljMV9tYXBbXSA9IHsKQEAgLTgyLDYgKzE5Niw1OSBAQAogCXsiSU4xUCIsIE5VTEwsICJJbnRlcm5hbCBNaWMifSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGJ5dF9ydDU2NDBfaW50bWljX2luM19tYXBbXSA9IHsKKwl7IkludGVybmFsIE1pYyIsIE5VTEwsICJNSUNCSUFTMSJ9LAorCXsiSU4zUCIsIE5VTEwsICJJbnRlcm5hbCBNaWMifSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGJ5dF9ydDU2NDBfc3NwMl9haWYxX21hcFtdID0geworCXsic3NwMiBUeCIsIE5VTEwsICJjb2RlY19vdXQwIn0sCisJeyJzc3AyIFR4IiwgTlVMTCwgImNvZGVjX291dDEifSwKKwl7ImNvZGVjX2luMCIsIE5VTEwsICJzc3AyIFJ4In0sCisJeyJjb2RlY19pbjEiLCBOVUxMLCAic3NwMiBSeCJ9LAorCisJeyJBSUYxIFBsYXliYWNrIiwgTlVMTCwgInNzcDIgVHgifSwKKwl7InNzcDIgUngiLCBOVUxMLCAiQUlGMSBDYXB0dXJlIn0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBieXRfcnQ1NjQwX3NzcDJfYWlmMl9tYXBbXSA9IHsKKwl7InNzcDIgVHgiLCBOVUxMLCAiY29kZWNfb3V0MCJ9LAorCXsic3NwMiBUeCIsIE5VTEwsICJjb2RlY19vdXQxIn0sCisJeyJjb2RlY19pbjAiLCBOVUxMLCAic3NwMiBSeCJ9LAorCXsiY29kZWNfaW4xIiwgTlVMTCwgInNzcDIgUngifSwKKworCXsiQUlGMiBQbGF5YmFjayIsIE5VTEwsICJzc3AyIFR4In0sCisJeyJzc3AyIFJ4IiwgTlVMTCwgIkFJRjIgQ2FwdHVyZSJ9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgYnl0X3J0NTY0MF9zc3AwX2FpZjFfbWFwW10gPSB7CisJeyJzc3AwIFR4IiwgTlVMTCwgIm1vZGVtX291dCJ9LAorCXsibW9kZW1faW4iLCBOVUxMLCAic3NwMCBSeCJ9LAorCisJeyJBSUYxIFBsYXliYWNrIiwgTlVMTCwgInNzcDAgVHgifSwKKwl7InNzcDAgUngiLCBOVUxMLCAiQUlGMSBDYXB0dXJlIn0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBieXRfcnQ1NjQwX3NzcDBfYWlmMl9tYXBbXSA9IHsKKwl7InNzcDAgVHgiLCBOVUxMLCAibW9kZW1fb3V0In0sCisJeyJtb2RlbV9pbiIsIE5VTEwsICJzc3AwIFJ4In0sCisKKwl7IkFJRjIgUGxheWJhY2siLCBOVUxMLCAic3NwMCBUeCJ9LAorCXsic3NwMCBSeCIsIE5VTEwsICJBSUYyIENhcHR1cmUifSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGJ5dF9ydDU2NDBfc3RlcmVvX3Nwa19tYXBbXSA9IHsKKwl7IlNwZWFrZXIiLCBOVUxMLCAiU1BPTFAifSwKKwl7IlNwZWFrZXIiLCBOVUxMLCAiU1BPTE4ifSwKKwl7IlNwZWFrZXIiLCBOVUxMLCAiU1BPUlAifSwKKwl7IlNwZWFrZXIiLCBOVUxMLCAiU1BPUk4ifSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGJ5dF9ydDU2NDBfbW9ub19zcGtfbWFwW10gPSB7CisJeyJTcGVha2VyIiwgTlVMTCwgIlNQT0xQIn0sCisJeyJTcGVha2VyIiwgTlVMTCwgIlNQT0xOIn0sCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYnl0X3J0NTY0MF9jb250cm9sc1tdID0gewogCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkhlYWRwaG9uZSIpLAogCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkhlYWRzZXQgTWljIiksCkBAIC05NiwxOSArMjYzLDQ2IEBACiAJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKIAlpbnQgcmV0OwogCi0Jc25kX3NvY19kYWlfc2V0X2JjbGtfcmF0aW8oY29kZWNfZGFpLCA1MCk7Ci0KIAlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgUlQ1NjQwX1NDTEtfU19QTEwxLAogCQkJCSAgICAgcGFyYW1zX3JhdGUocGFyYW1zKSAqIDUxMiwKIAkJCQkgICAgIFNORF9TT0NfQ0xPQ0tfSU4pOworCiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycihydGQtPmRldiwgImNhbid0IHNldCBjb2RlYyBjbG9jayAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfcGxsKGNvZGVjX2RhaSwgMCwgUlQ1NjQwX1BMTDFfU19CQ0xLMSwKLQkJCQkgIHBhcmFtc19yYXRlKHBhcmFtcykgKiA1MCwKLQkJCQkgIHBhcmFtc19yYXRlKHBhcmFtcykgKiA1MTIpOworCWlmICghKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX01DTEtfRU4pKSB7CisJCS8qIHVzZSBiaXRjbG9jayBhcyBQTEwgaW5wdXQgKi8KKwkJaWYgKChieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9TU1AwX0FJRjEpIHx8CisJCQkoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfU1NQMF9BSUYyKSkgeworCisJCQkvKiAyeDE2IGJpdCBzbG90cyBvbiBTU1AwICovCisJCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfcGxsKGNvZGVjX2RhaSwgMCwKKwkJCQkJCVJUNTY0MF9QTEwxX1NfQkNMSzEsCisJCQkJCQlwYXJhbXNfcmF0ZShwYXJhbXMpICogMzIsCisJCQkJCQlwYXJhbXNfcmF0ZShwYXJhbXMpICogNTEyKTsKKwkJfSBlbHNlIHsKKwkJCS8qIDJ4MTUgYml0IHNsb3RzIG9uIFNTUDIgKi8KKwkJCXJldCA9IHNuZF9zb2NfZGFpX3NldF9wbGwoY29kZWNfZGFpLCAwLAorCQkJCQkJUlQ1NjQwX1BMTDFfU19CQ0xLMSwKKwkJCQkJCXBhcmFtc19yYXRlKHBhcmFtcykgKiA1MCwKKwkJCQkJCXBhcmFtc19yYXRlKHBhcmFtcykgKiA1MTIpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX01DTEtfMjVNSFopIHsKKwkJCXJldCA9IHNuZF9zb2NfZGFpX3NldF9wbGwoY29kZWNfZGFpLCAwLAorCQkJCQkJUlQ1NjQwX1BMTDFfU19NQ0xLLAorCQkJCQkJMjUwMDAwMDAsCisJCQkJCQlwYXJhbXNfcmF0ZShwYXJhbXMpICogNTEyKTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IHNuZF9zb2NfZGFpX3NldF9wbGwoY29kZWNfZGFpLCAwLAorCQkJCQkJUlQ1NjQwX1BMTDFfU19NQ0xLLAorCQkJCQkJMTkyMDAwMDAsCisJCQkJCQlwYXJhbXNfcmF0ZShwYXJhbXMpICogNTEyKTsKKwkJfQorCX0KKwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIocnRkLT5kZXYsICJjYW4ndCBzZXQgY29kZWMgcGxsOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKQEAgLTEyNywyNyArMzIxLDczIEBACiAJewogCQkuY2FsbGJhY2sgPSBieXRfcnQ1NjQwX3F1aXJrX2NiLAogCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFTVVNUZUsgQ09NUFVURVIgSU5DLiIpLAotCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJUMTAwVEEiKSwKKwkJCURNSV9FWEFDVF9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFTVVNUZUsgQ09NUFVURVIgSU5DLiIpLAorCQkJRE1JX0VYQUNUX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJUMTAwVEEiKSwKIAkJfSwKLQkJLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcgKilCWVRfUlQ1NjQwX0lOMV9NQVAsCisJCS5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nICopKEJZVF9SVDU2NDBfSU4xX01BUCB8CisJCQkJCQkgQllUX1JUNTY0MF9NQ0xLX0VOKSwKIAl9LAogCXsKIAkJLmNhbGxiYWNrID0gYnl0X3J0NTY0MF9xdWlya19jYiwKIAkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsSW5jLiIpLAotCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJWZW51ZSA4IFBybyA1ODMwIiksCisJCQlETUlfRVhBQ1RfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBU1VTVGVLIENPTVBVVEVSIElOQy4iKSwKKwkJCURNSV9FWEFDVF9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVDEwMFRBRiIpLAorCQl9LAorCQkuZHJpdmVyX2RhdGEgPSAodW5zaWduZWQgbG9uZyAqKShCWVRfUlQ1NjQwX0lOMV9NQVAgfAorCQkJCQkJIEJZVF9SVDU2NDBfTU9OT19TUEVBS0VSIHwKKwkJCQkJCSBCWVRfUlQ1NjQwX0RJRkZfTUlDIHwKKwkJCQkJCSBCWVRfUlQ1NjQwX1NTUDBfQUlGMiB8CisJCQkJCQkgQllUX1JUNTY0MF9NQ0xLX0VOCisJCQkJCQkgKSwKKwl9LAorCXsKKwkJLmNhbGxiYWNrID0gYnl0X3J0NTY0MF9xdWlya19jYiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfRVhBQ1RfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsSW5jLiIpLAorCQkJRE1JX0VYQUNUX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJWZW51ZSA4IFBybyA1ODMwIiksCiAJCX0sCiAJCS5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nICopKEJZVF9SVDU2NDBfRE1JQzJfTUFQIHwKKwkJCQkJCSBCWVRfUlQ1NjQwX0RNSUNfRU4gfAorCQkJCQkJIEJZVF9SVDU2NDBfTUNMS19FTiksCisJfSwKKwl7CisJCS5jYWxsYmFjayA9IGJ5dF9ydDU2NDBfcXVpcmtfY2IsCisJCS5tYXRjaGVzID0geworCQkJRE1JX0VYQUNUX01BVENIKERNSV9TWVNfVkVORE9SLCAiSGV3bGV0dC1QYWNrYXJkIiksCisJCQlETUlfRVhBQ1RfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkhQIEVsaXRlUGFkIDEwMDAgRzIiKSwKKwkJfSwKKwkJLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcgKikoQllUX1JUNTY0MF9JTjFfTUFQIHwKKwkJCQkJCSBCWVRfUlQ1NjQwX01DTEtfRU4pLAorCX0sCisJeworCQkuY2FsbGJhY2sgPSBieXRfcnQ1NjQwX3F1aXJrX2NiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkNpcmN1aXRjbyIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNaW5ub3dib2FyZCBNYXggQjMgUExBVEZPUk0iKSwKKwkJfSwKKwkJLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcgKikoQllUX1JUNTY0MF9ETUlDMV9NQVAgfAogCQkJCQkJIEJZVF9SVDU2NDBfRE1JQ19FTiksCiAJfSwKIAl7CiAJCS5jYWxsYmFjayA9IGJ5dF9ydDU2NDBfcXVpcmtfY2IsCiAJCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiSGV3bGV0dC1QYWNrYXJkIiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkhQIEVsaXRlUGFkIDEwMDAgRzIiKSwKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiVEVDTEFTVCIpLAorCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAidFBBRCIpLAogCQl9LAotCQkuZHJpdmVyX2RhdGEgPSAodW5zaWduZWQgbG9uZyAqKUJZVF9SVDU2NDBfSU4xX01BUCwKKwkJLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcgKikoQllUX1JUNTY0MF9JTjNfTUFQIHwKKwkJCQkJCUJZVF9SVDU2NDBfTUNMS19FTiB8CisJCQkJCQlCWVRfUlQ1NjQwX1NTUDBfQUlGMSksCisJfSwKKwl7CisJCS5jYWxsYmFjayA9IGJ5dF9ydDU2NDBfcXVpcmtfY2IsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQWNlciIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJBc3BpcmUgU1c1LTAxMiIpLAorCQl9LAorCQkuZHJpdmVyX2RhdGEgPSAodW5zaWduZWQgbG9uZyAqKShCWVRfUlQ1NjQwX0lOMV9NQVAgfAorCQkJCQkJIEJZVF9SVDU2NDBfTUNMS19FTiB8CisJCQkJCQkgQllUX1JUNTY0MF9TU1AwX0FJRjEpLAorCiAJfSwKIAl7fQogfTsKQEAgLTE1OCwxMyArMzk4LDE4IEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnVudGltZS0+Y29kZWM7CiAJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHJ1bnRpbWUtPmNhcmQ7CiAJY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSAqY3VzdG9tX21hcDsKKwlzdHJ1Y3QgYnl0X3J0NTY0MF9wcml2YXRlICpwcml2ID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOwogCWludCBudW1fcm91dGVzOwogCiAJY2FyZC0+ZGFwbS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZTsKIAogCXJ0NTY0MF9zZWxfYXNyY19jbGtfc3JjKGNvZGVjLAogCQkJCVJUNTY0MF9EQV9TVEVSRU9fRklMVEVSIHwKLQkJCQlSVDU2NDBfQURfU1RFUkVPX0ZJTFRFUiwKKwkJCQlSVDU2NDBfREFfTU9OT19MX0ZJTFRFUgl8CisJCQkJUlQ1NjQwX0RBX01PTk9fUl9GSUxURVIJfAorCQkJCVJUNTY0MF9BRF9TVEVSRU9fRklMVEVSCXwKKwkJCQlSVDU2NDBfQURfTU9OT19MX0ZJTFRFUgl8CisJCQkJUlQ1NjQwX0FEX01PTk9fUl9GSUxURVIsCiAJCQkJUlQ1NjQwX0NMS19TRUxfQVNSQyk7CiAKIAlyZXQgPSBzbmRfc29jX2FkZF9jYXJkX2NvbnRyb2xzKGNhcmQsIGJ5dF9ydDU2NDBfY29udHJvbHMsCkBAIC0xNzksNiArNDI0LDEwIEBACiAJCWN1c3RvbV9tYXAgPSBieXRfcnQ1NjQwX2ludG1pY19pbjFfbWFwOwogCQludW1fcm91dGVzID0gQVJSQVlfU0laRShieXRfcnQ1NjQwX2ludG1pY19pbjFfbWFwKTsKIAkJYnJlYWs7CisJY2FzZSBCWVRfUlQ1NjQwX0lOM19NQVA6CisJCWN1c3RvbV9tYXAgPSBieXRfcnQ1NjQwX2ludG1pY19pbjNfbWFwOworCQludW1fcm91dGVzID0gQVJSQVlfU0laRShieXRfcnQ1NjQwX2ludG1pY19pbjNfbWFwKTsKKwkJYnJlYWs7CiAJY2FzZSBCWVRfUlQ1NjQwX0RNSUMyX01BUDoKIAkJY3VzdG9tX21hcCA9IGJ5dF9ydDU2NDBfaW50bWljX2RtaWMyX21hcDsKIAkJbnVtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYnl0X3J0NTY0MF9pbnRtaWNfZG1pYzJfbWFwKTsKQEAgLTE5Miw2ICs0NDEsNDMgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJaWYgKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX1NTUDJfQUlGMikgeworCQlyZXQgPSBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcygmY2FyZC0+ZGFwbSwKKwkJCQkJYnl0X3J0NTY0MF9zc3AyX2FpZjJfbWFwLAorCQkJCQlBUlJBWV9TSVpFKGJ5dF9ydDU2NDBfc3NwMl9haWYyX21hcCkpOworCX0gZWxzZSBpZiAoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfU1NQMF9BSUYxKSB7CisJCXJldCA9IHNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKCZjYXJkLT5kYXBtLAorCQkJCQlieXRfcnQ1NjQwX3NzcDBfYWlmMV9tYXAsCisJCQkJCUFSUkFZX1NJWkUoYnl0X3J0NTY0MF9zc3AwX2FpZjFfbWFwKSk7CisJfSBlbHNlIGlmIChieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9TU1AwX0FJRjIpIHsKKwkJcmV0ID0gc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoJmNhcmQtPmRhcG0sCisJCQkJCWJ5dF9ydDU2NDBfc3NwMF9haWYyX21hcCwKKwkJCQkJQVJSQVlfU0laRShieXRfcnQ1NjQwX3NzcDBfYWlmMl9tYXApKTsKKwl9IGVsc2UgeworCQlyZXQgPSBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcygmY2FyZC0+ZGFwbSwKKwkJCQkJYnl0X3J0NTY0MF9zc3AyX2FpZjFfbWFwLAorCQkJCQlBUlJBWV9TSVpFKGJ5dF9ydDU2NDBfc3NwMl9haWYxX21hcCkpOworCX0KKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX01PTk9fU1BFQUtFUikgeworCQlyZXQgPSBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcygmY2FyZC0+ZGFwbSwKKwkJCQkJYnl0X3J0NTY0MF9tb25vX3Nwa19tYXAsCisJCQkJCUFSUkFZX1NJWkUoYnl0X3J0NTY0MF9tb25vX3Nwa19tYXApKTsKKwl9IGVsc2UgeworCQlyZXQgPSBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcygmY2FyZC0+ZGFwbSwKKwkJCQkJYnl0X3J0NTY0MF9zdGVyZW9fc3BrX21hcCwKKwkJCQkJQVJSQVlfU0laRShieXRfcnQ1NjQwX3N0ZXJlb19zcGtfbWFwKSk7CisJfQorCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfRElGRl9NSUMpIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgIFJUNTY0MF9JTjFfSU4yLCBSVDU2NDBfSU5fREYxLAorCQkJCSAgICBSVDU2NDBfSU5fREYxKTsKKwl9CisKIAlpZiAoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfRE1JQ19FTikgewogCQlyZXQgPSBydDU2NDBfZG1pY19lbmFibGUoY29kZWMsIDAsIDApOwogCQlpZiAocmV0KQpAQCAtMjAxLDYgKzQ4NywzMCBAQAogCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZCgmY2FyZC0+ZGFwbSwgIkhlYWRwaG9uZSIpOwogCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZCgmY2FyZC0+ZGFwbSwgIlNwZWFrZXIiKTsKIAorCWlmICgoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfTUNMS19FTikgJiYgcHJpdi0+bWNsaykgeworCQkvKgorCQkgKiBUaGUgZmlybXdhcmUgbWlnaHQgZW5hYmxlIHRoZSBjbG9jayBhdAorCQkgKiBib290ICh0aGlzIGluZm9ybWF0aW9uIG1heSBvciBtYXkgbm90CisJCSAqIGJlIHJlZmxlY3RlZCBpbiB0aGUgZW5hYmxlIGNsb2NrIHJlZ2lzdGVyKS4KKwkJICogVG8gY2hhbmdlIHRoZSByYXRlIHdlIG11c3QgZGlzYWJsZSB0aGUgY2xvY2sKKwkJICogZmlyc3QgdG8gY292ZXIgdGhlc2UgY2FzZXMuIER1ZSB0byBjb21tb24KKwkJICogY2xvY2sgZnJhbWV3b3JrIHJlc3RyaWN0aW9ucyB0aGF0IGRvIG5vdCBhbGxvdworCQkgKiB0byBkaXNhYmxlIGEgY2xvY2sgdGhhdCBoYXMgbm90IGJlZW4gZW5hYmxlZCwKKwkJICogd2UgbmVlZCB0byBlbmFibGUgdGhlIGNsb2NrIGZpcnN0LgorCQkgKi8KKwkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHByaXYtPm1jbGspOworCQlpZiAoIXJldCkKKwkJCWNsa19kaXNhYmxlX3VucHJlcGFyZShwcml2LT5tY2xrKTsKKworCQlpZiAoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfTUNMS18yNU1IWikKKwkJCXJldCA9IGNsa19zZXRfcmF0ZShwcml2LT5tY2xrLCAyNTAwMDAwMCk7CisJCWVsc2UKKwkJCXJldCA9IGNsa19zZXRfcmF0ZShwcml2LT5tY2xrLCAxOTIwMDAwMCk7CisKKwkJaWYgKHJldCkKKwkJCWRldl9lcnIoY2FyZC0+ZGV2LCAidW5hYmxlIHRvIHNldCBNQ0xLIHJhdGVcbiIpOworCX0KKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTIyMSwzNCArNTMxLDYzIEBACiAJCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMpOwogCWludCByZXQ7CiAKLQkvKiBUaGUgRFNQIHdpbGwgY292ZXJ0IHRoZSBGRSByYXRlIHRvIDQ4aywgc3RlcmVvLCAyNGJpdHMgKi8KKwkvKiBUaGUgRFNQIHdpbGwgY292ZXJ0IHRoZSBGRSByYXRlIHRvIDQ4aywgc3RlcmVvICovCiAJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gNDgwMDA7CiAJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSAyOwogCi0JLyogc2V0IFNTUDIgdG8gMjQtYml0ICovCi0JcGFyYW1zX3NldF9mb3JtYXQocGFyYW1zLCBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRSk7CisJaWYgKChieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9TU1AwX0FJRjEpIHx8CisJCShieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9TU1AwX0FJRjIpKSB7CiAKLQkvKgotCSAqIERlZmF1bHQgbW9kZSBmb3IgU1NQIGNvbmZpZ3VyYXRpb24gaXMgVERNIDQgc2xvdCwgb3ZlcnJpZGUgY29uZmlnCi0JICogd2l0aCBleHBsaWNpdCBzZXR0aW5nIHRvIEkyUyAyY2ggMjQtYml0LiBUaGUgd29yZCBsZW5ndGggaXMgc2V0IHdpdGgKLQkgKiBkYWlfc2V0X3RkbV9zbG90KCkgc2luY2UgdGhlcmUgaXMgbm8gb3RoZXIgQVBJIGV4cG9zZWQKLQkgKi8KLQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KHJ0ZC0+Y3B1X2RhaSwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0kyUyAgICAgfAotCQkJCSAgU05EX1NPQ19EQUlGTVRfTkJfSUYgICB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTCi0JCQkJICApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsICJjYW4ndCBzZXQgZm9ybWF0IHRvIEkyUywgZXJyICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OworCQkvKiBzZXQgU1NQMCB0byAxNi1iaXQgKi8KKwkJcGFyYW1zX3NldF9mb3JtYXQocGFyYW1zLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSk7CisKKwkJLyoKKwkJICogRGVmYXVsdCBtb2RlIGZvciBTU1AgY29uZmlndXJhdGlvbiBpcyBURE0gNCBzbG90LCBvdmVycmlkZSBjb25maWcKKwkJICogd2l0aCBleHBsaWNpdCBzZXR0aW5nIHRvIEkyUyAyY2ggMTYtYml0LiBUaGUgd29yZCBsZW5ndGggaXMgc2V0IHdpdGgKKwkJICogZGFpX3NldF90ZG1fc2xvdCgpIHNpbmNlIHRoZXJlIGlzIG5vIG90aGVyIEFQSSBleHBvc2VkCisJCSAqLworCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KHJ0ZC0+Y3B1X2RhaSwKKwkJCQkJU05EX1NPQ19EQUlGTVRfSTJTICAgICB8CisJCQkJCVNORF9TT0NfREFJRk1UX05CX0lGICAgfAorCQkJCQlTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTCisJCQkpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihydGQtPmRldiwgImNhbid0IHNldCBmb3JtYXQgdG8gSTJTLCBlcnIgJWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3RkbV9zbG90KHJ0ZC0+Y3B1X2RhaSwgMHgzLCAweDMsIDIsIDE2KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsICJjYW4ndCBzZXQgSTJTIGNvbmZpZywgZXJyICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJfSBlbHNlIHsKKworCQkvKiBzZXQgU1NQMiB0byAyNC1iaXQgKi8KKwkJcGFyYW1zX3NldF9mb3JtYXQocGFyYW1zLCBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRSk7CisKKwkJLyoKKwkJICogRGVmYXVsdCBtb2RlIGZvciBTU1AgY29uZmlndXJhdGlvbiBpcyBURE0gNCBzbG90LCBvdmVycmlkZSBjb25maWcKKwkJICogd2l0aCBleHBsaWNpdCBzZXR0aW5nIHRvIEkyUyAyY2ggMjQtYml0LiBUaGUgd29yZCBsZW5ndGggaXMgc2V0IHdpdGgKKwkJICogZGFpX3NldF90ZG1fc2xvdCgpIHNpbmNlIHRoZXJlIGlzIG5vIG90aGVyIEFQSSBleHBvc2VkCisJCSAqLworCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KHJ0ZC0+Y3B1X2RhaSwKKwkJCQkJU05EX1NPQ19EQUlGTVRfSTJTICAgICB8CisJCQkJCVNORF9TT0NfREFJRk1UX05CX0lGICAgfAorCQkJCQlTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTCisJCQkpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihydGQtPmRldiwgImNhbid0IHNldCBmb3JtYXQgdG8gSTJTLCBlcnIgJWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3RkbV9zbG90KHJ0ZC0+Y3B1X2RhaSwgMHgzLCAweDMsIDIsIDI0KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIocnRkLT5kZXYsICJjYW4ndCBzZXQgSTJTIGNvbmZpZywgZXJyICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQogCX0KLQotCXJldCA9IHNuZF9zb2NfZGFpX3NldF90ZG1fc2xvdChydGQtPmNwdV9kYWksIDB4MywgMHgzLCAyLCAyNCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihydGQtPmRldiwgImNhbid0IHNldCBJMlMgY29uZmlnLCBlcnIgJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMwNSwxMCArNjQ0LDEwIEBACiAJewogCQkubmFtZSA9ICJTU1AyLUNvZGVjIiwKIAkJLmlkID0gMSwKLQkJLmNwdV9kYWlfbmFtZSA9ICJzc3AyLXBvcnQiLAorCQkuY3B1X2RhaV9uYW1lID0gInNzcDItcG9ydCIsIC8qIG92ZXJ3cml0dGVuIGZvciBzc3AwIHJvdXRpbmcgKi8KIAkJLnBsYXRmb3JtX25hbWUgPSAic3N0LW1mbGQtcGxhdGZvcm0iLAogCQkubm9fcGNtID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInJ0NTY0MC1haWYxIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInJ0NTY0MC1haWYxIiwgLyogY2hhbmdlZCB3LyBxdWlyayAqLwogCQkuY29kZWNfbmFtZSA9ICJpMmMtMTBFQzU2NDA6MDAiLCAvKiBvdmVyd3JpdHRlbiB3aXRoIEhJRCAqLwogCQkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX05CX05GCiAJCQkJCQl8IFNORF9TT0NfREFJRk1UX0NCU19DRlMsCkBAIC0zMzUsNiArNjc0LDIxIEBACiB9OwogCiBzdGF0aWMgY2hhciBieXRfcnQ1NjQwX2NvZGVjX25hbWVbMTZdOyAvKiBpMmMtPEhJRD46MDAgd2l0aCBISUQgYmVpbmcgOCBjaGFycyAqLworc3RhdGljIGNoYXIgYnl0X3J0NTY0MF9jb2RlY19haWZfbmFtZVsxMl07IC8qICA9ICJydDU2NDAtYWlmWzF8Ml0iICovCitzdGF0aWMgY2hhciBieXRfcnQ1NjQwX2NwdV9kYWlfbmFtZVsxMF07IC8qICA9ICJzc3BbMHwyXS1wb3J0IiAqLworCitzdGF0aWMgYm9vbCBpc192YWxsZXl2aWV3KHZvaWQpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCB4ODZfY3B1X2lkIGNwdV9pZHNbXSA9IHsKKwkJeyBYODZfVkVORE9SX0lOVEVMLCA2LCA1NSB9LCAvKiBWYWxsZXl2aWV3LCBCYXkgVHJhaWwgKi8KKwkJe30KKwl9OworCisJaWYgKCF4ODZfbWF0Y2hfY3B1KGNwdV9pZHMpKQorCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7Cit9CisKIAogc3RhdGljIGludCBzbmRfYnl0X3J0NTY0MF9tY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewpAQCAtMzQzLDEwICs2OTcsMTYgQEAKIAljb25zdCBjaGFyICppMmNfbmFtZSA9IE5VTEw7CiAJaW50IGk7CiAJaW50IGRhaV9pbmRleDsKKwlzdHJ1Y3QgYnl0X3J0NTY0MF9wcml2YXRlICpwcml2OworCisJcHJpdiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnByaXYpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOwogCiAJLyogcmVnaXN0ZXIgdGhlIHNvYyBjYXJkICovCiAJYnl0X3J0NTY0MF9jYXJkLmRldiA9ICZwZGV2LT5kZXY7CiAJbWFjaCA9IGJ5dF9ydDU2NDBfY2FyZC5kZXYtPnBsYXRmb3JtX2RhdGE7CisJc25kX3NvY19jYXJkX3NldF9kcnZkYXRhKCZieXRfcnQ1NjQwX2NhcmQsIHByaXYpOwogCiAJLyogZml4IGluZGV4IG9mIGNvZGVjIGRhaSAqLwogCWRhaV9pbmRleCA9IE1FUlJfRFBDTV9DT01QUiArIDE7CkBAIC0zNjYsOCArNzI2LDU3IEBACiAJCWJ5dF9ydDU2NDBfZGFpc1tkYWlfaW5kZXhdLmNvZGVjX25hbWUgPSBieXRfcnQ1NjQwX2NvZGVjX25hbWU7CiAJfQogCisJLyoKKwkgKiBzd2FwIFNTUDAgaWYgYnl0Y3IgaXMgZGV0ZWN0ZWQKKwkgKiAod2lsbCBiZSBvdmVycmlkZGVuIGlmIERNSSBxdWlyayBpcyBkZXRlY3RlZCkKKwkgKi8KKwlpZiAoaXNfdmFsbGV5dmlldygpKSB7CisJCXN0cnVjdCBzc3RfcGxhdGZvcm1faW5mbyAqcF9pbmZvID0gbWFjaC0+cGRhdGE7CisJCWNvbnN0IHN0cnVjdCBzc3RfcmVzX2luZm8gKnJlc19pbmZvID0gcF9pbmZvLT5yZXNfaW5mbzsKKworCQkvKiBUT0RPOiB1c2UgQ0hBTiBwYWNrYWdlIGluZm8gZnJvbSBCSU9TIHRvIGRldGVjdCBBSUYxL0FJRjIgKi8KKwkJaWYgKHJlc19pbmZvLT5hY3BpX2lwY19pcnFfaW5kZXggPT0gMCkgeworCQkJYnl0X3J0NTY0MF9xdWlyayB8PSBCWVRfUlQ1NjQwX1NTUDBfQUlGMjsKKwkJfQorCX0KKwogCS8qIGNoZWNrIHF1aXJrcyBiZWZvcmUgY3JlYXRpbmcgY2FyZCAqLwogCWRtaV9jaGVja19zeXN0ZW0oYnl0X3J0NTY0MF9xdWlya190YWJsZSk7CisJbG9nX3F1aXJrcygmcGRldi0+ZGV2KTsKKworCWlmICgoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfU1NQMl9BSUYyKSB8fAorCSAgICAoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfU1NQMF9BSUYyKSkgeworCisJCS8qIGZpeHVwIGNvZGVjIGFpZiBuYW1lICovCisJCXNucHJpbnRmKGJ5dF9ydDU2NDBfY29kZWNfYWlmX25hbWUsCisJCQlzaXplb2YoYnl0X3J0NTY0MF9jb2RlY19haWZfbmFtZSksCisJCQkiJXMiLCAicnQ1NjQwLWFpZjIiKTsKKworCQlieXRfcnQ1NjQwX2RhaXNbZGFpX2luZGV4XS5jb2RlY19kYWlfbmFtZSA9CisJCQlieXRfcnQ1NjQwX2NvZGVjX2FpZl9uYW1lOworCX0KKworCWlmICgoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfU1NQMF9BSUYxKSB8fAorCSAgICAoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfU1NQMF9BSUYyKSkgeworCisJCS8qIGZpeHVwIGNwdSBkYWkgbmFtZSBuYW1lICovCisJCXNucHJpbnRmKGJ5dF9ydDU2NDBfY3B1X2RhaV9uYW1lLAorCQkJc2l6ZW9mKGJ5dF9ydDU2NDBfY3B1X2RhaV9uYW1lKSwKKwkJCSIlcyIsICJzc3AwLXBvcnQiKTsKKworCQlieXRfcnQ1NjQwX2RhaXNbZGFpX2luZGV4XS5jcHVfZGFpX25hbWUgPQorCQkJYnl0X3J0NTY0MF9jcHVfZGFpX25hbWU7CisJfQorCisJaWYgKChieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9NQ0xLX0VOKSAmJiAoaXNfdmFsbGV5dmlldygpKSkgeworCQlwcml2LT5tY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJwbWNfcGx0X2Nsa18zIik7CisJCWlmIChJU19FUlIocHJpdi0+bWNsaykpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiRmFpbGVkIHRvIGdldCBNQ0xLIGZyb20gcG1jX3BsdF9jbGtfMzogJWxkXG4iLAorCQkJCVBUUl9FUlIocHJpdi0+bWNsaykpOworCQkJcmV0dXJuIFBUUl9FUlIocHJpdi0+bWNsayk7CisJCX0KKwl9CiAKIAlyZXRfdmFsID0gZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NhcmQoJnBkZXYtPmRldiwgJmJ5dF9ydDU2NDBfY2FyZCk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9jb21tb24vc3N0LWFjcGkuYyBiL3NvdW5kL3NvYy9pbnRlbC9jb21tb24vc3N0LWFjcGkuYwppbmRleCAyYzVlZGExLi4xMjg1Y2M1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvY29tbW9uL3NzdC1hY3BpLmMKKysrIGIvc291bmQvc29jL2ludGVsL2NvbW1vbi9zc3QtYWNwaS5jCkBAIC0xOTksNiArMTk5LDcgQEAKIAogc3RhdGljIHN0cnVjdCBzc3RfYWNwaV9tYWNoIGJyb2Fkd2VsbF9tYWNoaW5lc1tdID0gewogCXsgIklOVDM0M0EiLCAiYnJvYWR3ZWxsLWF1ZGlvIiwgImludGVsL0ludGNTU1QyLmJpbiIsIE5VTEwsIE5VTEwsIE5VTEwgfSwKKwl7ICJSVDU2NzdDRSIsICJiZHctcnQ1Njc3IiwgImludGVsL0ludGNTU1QyLmJpbiIsIE5VTEwsIE5VTEwsIE5VTEwgfSwKIAl7fQogfTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL2hhc3dlbGwvc3N0LWhhc3dlbGwtcGNtLmMgYi9zb3VuZC9zb2MvaW50ZWwvaGFzd2VsbC9zc3QtaGFzd2VsbC1wY20uYwppbmRleCAzMTU0NTI1Li45ZTQwOTRlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvaGFzd2VsbC9zc3QtaGFzd2VsbC1wY20uYworKysgYi9zb3VuZC9zb2MvaW50ZWwvaGFzd2VsbC9zc3QtaGFzd2VsbC1wY20uYwpAQCAtODcxLDcgKzg3MSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBoc3dfcGNtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgaHN3X3BjbV9vcHMgPSB7CiAJLm9wZW4JCT0gaHN3X3BjbV9vcGVuLAogCS5jbG9zZQkJPSBoc3dfcGNtX2Nsb3NlLAogCS5pb2N0bAkJPSBzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL2J4dC1zc3QuYyBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL2J4dC1zc3QuYwppbmRleCAyNjYzNzgxLi4xZDI1MWQ1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9ieHQtc3N0LmMKKysrIGIvc291bmQvc29jL2ludGVsL3NreWxha2UvYnh0LXNzdC5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSAiLi4vY29tbW9uL3NzdC1kc3AuaCIKICNpbmNsdWRlICIuLi9jb21tb24vc3N0LWRzcC1wcml2LmgiCiAjaW5jbHVkZSAic2tsLXNzdC1pcGMuaCIKKyNpbmNsdWRlICJza2wtdHBsZy1pbnRlcmZhY2UuaCIKIAogI2RlZmluZSBCWFRfQkFTRUZXX1RJTUVPVVQJMzAwMAogI2RlZmluZSBCWFRfSU5JVF9USU1FT1VUCTUwMApAQCAtNDAsMTEgKzQxLDczIEBACiAjZGVmaW5lIEJYVF9JTlNUQU5DRV9JRCAwCiAjZGVmaW5lIEJYVF9CQVNFX0ZXX01PRFVMRV9JRCAwCiAKKyNkZWZpbmUgQlhUX0FEU1BfRldfQklOX0hEUl9PRkZTRVQgMHgyMDAwCisKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYnh0X2dldF9lcnJvcmNvZGUoc3RydWN0IHNzdF9kc3AgKmN0eCkKIHsKIAkgcmV0dXJuIHNzdF9kc3Bfc2hpbV9yZWFkKGN0eCwgQlhUX0FEU1BfRVJST1JfQ09ERSk7CiB9CiAKK3N0YXRpYyBpbnQKK2J4dF9sb2FkX2xpYnJhcnkoc3RydWN0IHNzdF9kc3AgKmN0eCwgc3RydWN0IHNrbF9kZndfbWFuaWZlc3QgKm1pbmZvKQoreworCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciBkbWFiOworCXN0cnVjdCBza2xfc3N0ICpza2wgPSBjdHgtPnRocmVhZF9jb250ZXh0OworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncgPSBOVUxMOworCXN0cnVjdCBmaXJtd2FyZSBzdHJpcHBlZF9mdzsKKwlpbnQgcmV0ID0gMCwgaSwgZG1hX2lkLCBzdHJlYW1fdGFnOworCisJLyogbGlicmFyeSBpbmRpY2VzIHN0YXJ0IGZyb20gMSB0byBOLiAwIHJlcHJlc2VudHMgYmFzZSBGVyAqLworCWZvciAoaSA9IDE7IGkgPCBtaW5mby0+bGliX2NvdW50OyBpKyspIHsKKwkJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIG1pbmZvLT5saWJbaV0ubmFtZSwgY3R4LT5kZXYpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihjdHgtPmRldiwgIlJlcXVlc3QgbGliICVzIGZhaWxlZDolZFxuIiwKKwkJCQkJbWluZm8tPmxpYltpXS5uYW1lLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWlmIChza2wtPmlzX2ZpcnN0X2Jvb3QpIHsKKwkJCXJldCA9IHNuZF9za2xfcGFyc2VfdXVpZHMoY3R4LCBmdywKKwkJCQkJQlhUX0FEU1BfRldfQklOX0hEUl9PRkZTRVQsIGkpOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBsb2FkX2xpYnJhcnlfZmFpbGVkOworCQl9CisKKwkJc3RyaXBwZWRfZncuZGF0YSA9IGZ3LT5kYXRhOworCQlzdHJpcHBlZF9mdy5zaXplID0gZnctPnNpemU7CisJCXNrbF9kc3Bfc3RyaXBfZXh0ZW5kZWRfbWFuaWZlc3QoJnN0cmlwcGVkX2Z3KTsKKworCQlzdHJlYW1fdGFnID0gY3R4LT5kc3Bfb3BzLnByZXBhcmUoY3R4LT5kZXYsIDB4NDAsCisJCQkJCXN0cmlwcGVkX2Z3LnNpemUsICZkbWFiKTsKKwkJaWYgKHN0cmVhbV90YWcgPD0gMCkgeworCQkJZGV2X2VycihjdHgtPmRldiwgIkxpYiBwcmVwYXJlIERNQSBlcnI6ICV4XG4iLAorCQkJCQlzdHJlYW1fdGFnKTsKKwkJCXJldCA9IHN0cmVhbV90YWc7CisJCQlnb3RvIGxvYWRfbGlicmFyeV9mYWlsZWQ7CisJCX0KKworCQlkbWFfaWQgPSBzdHJlYW1fdGFnIC0gMTsKKwkJbWVtY3B5KGRtYWIuYXJlYSwgc3RyaXBwZWRfZncuZGF0YSwgc3RyaXBwZWRfZncuc2l6ZSk7CisKKwkJY3R4LT5kc3Bfb3BzLnRyaWdnZXIoY3R4LT5kZXYsIHRydWUsIHN0cmVhbV90YWcpOworCQlyZXQgPSBza2xfc3N0X2lwY19sb2FkX2xpYnJhcnkoJnNrbC0+aXBjLCBkbWFfaWQsIGkpOworCQlpZiAocmV0IDwgMCkKKwkJCWRldl9lcnIoY3R4LT5kZXYsICJJUEMgTG9hZCBMaWIgZm9yICVzIGZhaWw6ICVkXG4iLAorCQkJCQltaW5mby0+bGliW2ldLm5hbWUsIHJldCk7CisKKwkJY3R4LT5kc3Bfb3BzLnRyaWdnZXIoY3R4LT5kZXYsIGZhbHNlLCBzdHJlYW1fdGFnKTsKKwkJY3R4LT5kc3Bfb3BzLmNsZWFudXAoY3R4LT5kZXYsICZkbWFiLCBzdHJlYW1fdGFnKTsKKwkJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJCWZ3ID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gcmV0OworCitsb2FkX2xpYnJhcnlfZmFpbGVkOgorCXJlbGVhc2VfZmlybXdhcmUoZncpOworCXJldHVybiByZXQ7Cit9CisKIC8qCiAgKiBGaXJzdCBib290IHNlcXVlbmNlIGhhcyBzb21lIGV4dHJhIHN0ZXBzLiBDb3JlIDAgd2FpdHMgZm9yIHBvd2VyCiAgKiBzdGF0dXMgb24gY29yZSAxLCBzbyBwb3dlciB1cCBjb3JlIDEgYWxzbyBtb21lbnRhcmlseSwga2VlcCBpdCBpbgpAQCAtMTU3LDggKzIyMCw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotI2RlZmluZSBCWFRfQURTUF9GV19CSU5fSERSX09GRlNFVCAweDIwMDAKLQogc3RhdGljIGludCBieHRfbG9hZF9iYXNlX2Zpcm13YXJlKHN0cnVjdCBzc3RfZHNwICpjdHgpCiB7CiAJc3RydWN0IGZpcm13YXJlIHN0cmlwcGVkX2Z3OwpAQCAtMTc1LDkgKzIzNiwxMiBAQAogCWlmIChjdHgtPmZ3ID09IE5VTEwpCiAJCWdvdG8gc3N0X2xvYWRfYmFzZV9maXJtd2FyZV9mYWlsZWQ7CiAKLQlyZXQgPSBzbmRfc2tsX3BhcnNlX3V1aWRzKGN0eCwgQlhUX0FEU1BfRldfQklOX0hEUl9PRkZTRVQpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIHNzdF9sb2FkX2Jhc2VfZmlybXdhcmVfZmFpbGVkOworCS8qIHByYXNlIHV1aWRzIG9uIGZpcnN0IGJvb3QgKi8KKwlpZiAoc2tsLT5pc19maXJzdF9ib290KSB7CisJCXJldCA9IHNuZF9za2xfcGFyc2VfdXVpZHMoY3R4LCBjdHgtPmZ3LCBCWFRfQURTUF9GV19CSU5fSERSX09GRlNFVCwgMCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBzc3RfbG9hZF9iYXNlX2Zpcm13YXJlX2ZhaWxlZDsKKwl9CiAKIAlzdHJpcHBlZF9mdy5kYXRhID0gY3R4LT5mdy0+ZGF0YTsKIAlzdHJpcHBlZF9mdy5zaXplID0gY3R4LT5mdy0+c2l6ZTsKQEAgLTIzMCwxMiArMjk0LDIzIEBACiAJaW50IHJldDsKIAlzdHJ1Y3Qgc2tsX2lwY19keHN0YXRlX2luZm8gZHg7CiAJdW5zaWduZWQgaW50IGNvcmVfbWFzayA9IFNLTF9EU1BfQ09SRV9NQVNLKGNvcmVfaWQpOworCXN0cnVjdCBza2xfZGZ3X21hbmlmZXN0ICptaW5mbyA9ICZza2wtPm1hbmlmZXN0OwogCiAJaWYgKHNrbC0+ZndfbG9hZGVkID09IGZhbHNlKSB7CiAJCXNrbC0+Ym9vdF9jb21wbGV0ZSA9IGZhbHNlOwogCQlyZXQgPSBieHRfbG9hZF9iYXNlX2Zpcm13YXJlKGN0eCk7Ci0JCWlmIChyZXQgPCAwKQorCQlpZiAocmV0IDwgMCkgewogCQkJZGV2X2VycihjdHgtPmRldiwgInJlbG9hZCBmdyBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWlmIChtaW5mby0+bGliX2NvdW50ID4gMSkgeworCQkJcmV0ID0gYnh0X2xvYWRfbGlicmFyeShjdHgsIG1pbmZvKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZGV2X2VycihjdHgtPmRldiwgInJlbG9hZCBsaWJzIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMzI5LDcgKzQwNCw3IEBACiAKIAlyZXQgPSBza2xfZHNwX2Rpc2FibGVfY29yZShjdHgsIGNvcmVfbWFzayk7CiAJaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihjdHgtPmRldiwgIkZhaWxlZCB0byBkaXNhYmxlIGNvcmUgJWQiLCByZXQpOworCQlkZXZfZXJyKGN0eC0+ZGV2LCAiRmFpbGVkIHRvIGRpc2FibGUgY29yZSAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJc2tsLT5jb3Jlcy5zdGF0ZVtjb3JlX2lkXSA9IFNLTF9EU1BfUkVTRVQ7CkBAIC0zNDEsNiArNDE2LDcgQEAKIAkuc2V0X3N0YXRlX0QzID0gYnh0X3NldF9kc3BfRDMsCiAJLmxvYWRfZncgPSBieHRfbG9hZF9iYXNlX2Zpcm13YXJlLAogCS5nZXRfZndfZXJyY29kZSA9IGJ4dF9nZXRfZXJyb3Jjb2RlLAorCS5sb2FkX2xpYnJhcnkgPSBieHRfbG9hZF9saWJyYXJ5LAogfTsKIAogc3RhdGljIHN0cnVjdCBzc3Rfb3BzIHNrbF9vcHMgPSB7CkBAIC0zOTcsMTQgKzQ3Myw3IEBACiAJc2tsLT5jb3Jlcy5jb3VudCA9IDI7CiAJc2tsLT5ib290X2NvbXBsZXRlID0gZmFsc2U7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmc2tsLT5ib290X3dhaXQpOwotCi0JcmV0ID0gc3N0LT5md19vcHMubG9hZF9mdyhzc3QpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoZGV2LCAiTG9hZCBiYXNlIGZ3IGZhaWxlZDogJXgiLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXNrbF9kc3BfaW5pdF9jb3JlX3N0YXRlKHNzdCk7CisJc2tsLT5pc19maXJzdF9ib290ID0gdHJ1ZTsKIAogCWlmIChkc3ApCiAJCSpkc3AgPSBza2w7CkBAIC00MTMsNiArNDgyLDMxIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChieHRfc3N0X2RzcF9pbml0KTsKIAoraW50IGJ4dF9zc3RfaW5pdF9mdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBza2xfc3N0ICpjdHgpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3N0X2RzcCAqc3N0ID0gY3R4LT5kc3A7CisKKwlyZXQgPSBzc3QtPmZ3X29wcy5sb2FkX2Z3KHNzdCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJMb2FkIGJhc2UgZncgZmFpbGVkOiAleFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlza2xfZHNwX2luaXRfY29yZV9zdGF0ZShzc3QpOworCisJaWYgKGN0eC0+bWFuaWZlc3QubGliX2NvdW50ID4gMSkgeworCQlyZXQgPSBzc3QtPmZ3X29wcy5sb2FkX2xpYnJhcnkoc3N0LCAmY3R4LT5tYW5pZmVzdCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGRldiwgIkxvYWQgTGlicmFyeSBmYWlsZWQgOiAleFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJY3R4LT5pc19maXJzdF9ib290ID0gZmFsc2U7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGJ4dF9zc3RfaW5pdF9mdyk7CiAKIHZvaWQgYnh0X3NzdF9kc3BfY2xlYW51cChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBza2xfc3N0ICpjdHgpCiB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtbWVzc2FnZXMuYyBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1tZXNzYWdlcy5jCmluZGV4IDQ0YWI1OTUuLjgwNWI3ZjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1tZXNzYWdlcy5jCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1tZXNzYWdlcy5jCkBAIC0yMDMsMzIgKzIwMywzNSBAQAogCQkuaWQgPSAweDlkNzAsCiAJCS5sb2FkZXJfb3BzID0gc2tsX2dldF9sb2FkZXJfb3BzLAogCQkuaW5pdCA9IHNrbF9zc3RfZHNwX2luaXQsCisJCS5pbml0X2Z3ID0gc2tsX3NzdF9pbml0X2Z3LAogCQkuY2xlYW51cCA9IHNrbF9zc3RfZHNwX2NsZWFudXAKIAl9LAogCXsKIAkJLmlkID0gMHg5ZDcxLAogCQkubG9hZGVyX29wcyA9IHNrbF9nZXRfbG9hZGVyX29wcywKIAkJLmluaXQgPSBza2xfc3N0X2RzcF9pbml0LAorCQkuaW5pdF9mdyA9IHNrbF9zc3RfaW5pdF9mdywKIAkJLmNsZWFudXAgPSBza2xfc3N0X2RzcF9jbGVhbnVwCiAJfSwKIAl7CiAJCS5pZCA9IDB4NWE5OCwKIAkJLmxvYWRlcl9vcHMgPSBieHRfZ2V0X2xvYWRlcl9vcHMsCiAJCS5pbml0ID0gYnh0X3NzdF9kc3BfaW5pdCwKKwkJLmluaXRfZncgPSBieHRfc3N0X2luaXRfZncsCiAJCS5jbGVhbnVwID0gYnh0X3NzdF9kc3BfY2xlYW51cAogCX0sCiB9OwogCi1zdGF0aWMgaW50IHNrbF9nZXRfZHNwX29wcyhpbnQgcGNpX2lkKQorY29uc3Qgc3RydWN0IHNrbF9kc3Bfb3BzICpza2xfZ2V0X2RzcF9vcHMoaW50IHBjaV9pZCkKIHsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRzcF9vcHMpOyBpKyspIHsKIAkJaWYgKGRzcF9vcHNbaV0uaWQgPT0gcGNpX2lkKQotCQkJcmV0dXJuIGk7CisJCQlyZXR1cm4gJmRzcF9vcHNbaV07CiAJfQogCi0JcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIE5VTEw7CiB9CiAKIGludCBza2xfaW5pdF9kc3Aoc3RydWN0IHNrbCAqc2tsKQpAQCAtMjM4LDcgKzI0MSw4IEBACiAJc3RydWN0IGhkYWNfYnVzICpidXMgPSBlYnVzX3RvX2hidXMoZWJ1cyk7CiAJc3RydWN0IHNrbF9kc3BfbG9hZGVyX29wcyBsb2FkZXJfb3BzOwogCWludCBpcnEgPSBidXMtPmlycTsKLQlpbnQgcmV0LCBpbmRleDsKKwljb25zdCBzdHJ1Y3Qgc2tsX2RzcF9vcHMgKm9wczsKKwlpbnQgcmV0OwogCiAJLyogZW5hYmxlIHBwY2FwIGludGVycnVwdCAqLwogCXNuZF9oZGFjX2V4dF9idXNfcHBjYXBfZW5hYmxlKCZza2wtPmVidXMsIHRydWUpOwpAQCAtMjUxLDE4ICsyNTUsMTggQEAKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKLQlpbmRleCAgPSBza2xfZ2V0X2RzcF9vcHMoc2tsLT5wY2ktPmRldmljZSk7Ci0JaWYgKGluZGV4ICA8IDApCi0JCXJldHVybiAtRUlOVkFMOworCW9wcyA9IHNrbF9nZXRfZHNwX29wcyhza2wtPnBjaS0+ZGV2aWNlKTsKKwlpZiAoIW9wcykKKwkJcmV0dXJuIC1FSU87CiAKLQlsb2FkZXJfb3BzID0gZHNwX29wc1tpbmRleF0ubG9hZGVyX29wcygpOwotCXJldCA9IGRzcF9vcHNbaW5kZXhdLmluaXQoYnVzLT5kZXYsIG1taW9fYmFzZSwgaXJxLAotCQkJc2tsLT5md19uYW1lLCBsb2FkZXJfb3BzLCAmc2tsLT5za2xfc3N0KTsKKwlsb2FkZXJfb3BzID0gb3BzLT5sb2FkZXJfb3BzKCk7CisJcmV0ID0gb3BzLT5pbml0KGJ1cy0+ZGV2LCBtbWlvX2Jhc2UsIGlycSwKKwkJCQlza2wtPmZ3X25hbWUsIGxvYWRlcl9vcHMsCisJCQkJJnNrbC0+c2tsX3NzdCk7CiAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCXNrbF9kc3BfZW5hYmxlX25vdGlmaWNhdGlvbihza2wtPnNrbF9zc3QsIGZhbHNlKTsKIAlkZXZfZGJnKGJ1cy0+ZGV2LCAiZHNwIHJlZ2lzdHJhdGlvbiBzdGF0dXM9JWRcbiIsIHJldCk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMjczLDE2ICsyNzcsMTYgQEAKIAlzdHJ1Y3QgaGRhY19leHRfYnVzICplYnVzID0gJnNrbC0+ZWJ1czsKIAlzdHJ1Y3QgaGRhY19idXMgKmJ1cyA9IGVidXNfdG9faGJ1cyhlYnVzKTsKIAlzdHJ1Y3Qgc2tsX3NzdCAqY3R4ID0gc2tsLT5za2xfc3N0OwotCWludCBpbmRleDsKKwljb25zdCBzdHJ1Y3Qgc2tsX2RzcF9vcHMgKm9wczsKIAogCS8qIGRpc2FibGUgIHBwY2FwIGludGVycnVwdCAqLwogCXNuZF9oZGFjX2V4dF9idXNfcHBjYXBfaW50X2VuYWJsZSgmc2tsLT5lYnVzLCBmYWxzZSk7CiAKLQlpbmRleCA9IHNrbF9nZXRfZHNwX29wcyhza2wtPnBjaS0+ZGV2aWNlKTsKLQlpZiAoaW5kZXggIDwgMCkKKwlvcHMgPSBza2xfZ2V0X2RzcF9vcHMoc2tsLT5wY2ktPmRldmljZSk7CisJaWYgKCFvcHMpCiAJCXJldHVybiAtRUlPOwogCi0JZHNwX29wc1tpbmRleF0uY2xlYW51cChidXMtPmRldiwgY3R4KTsKKwlvcHMtPmNsZWFudXAoYnVzLT5kZXYsIGN0eCk7CiAKIAlpZiAoY3R4LT5kc3AtPmFkZHIubHBlKQogCQlpb3VubWFwKGN0eC0+ZHNwLT5hZGRyLmxwZSk7CkBAIC0yOTYsNyArMzAwLDcgQEAKIAlpbnQgcmV0OwogCiAJLyogaWYgcHBjYXAgaXMgbm90IHN1cHBvcnRlZCByZXR1cm4gMCAqLwotCWlmICghc2tsLT5lYnVzLnBwY2FwKQorCWlmICghc2tsLT5lYnVzLmJ1cy5wcGNhcCkKIAkJcmV0dXJuIDA7CiAKIAlyZXQgPSBza2xfZHNwX3NsZWVwKGN0eC0+ZHNwKTsKQEAgLTMxNiwxMyArMzIwLDE3IEBACiAJaW50IHJldDsKIAogCS8qIGlmIHBwY2FwIGlzIG5vdCBzdXBwb3J0ZWQgcmV0dXJuIDAgKi8KLQlpZiAoIXNrbC0+ZWJ1cy5wcGNhcCkKKwlpZiAoIXNrbC0+ZWJ1cy5idXMucHBjYXApCiAJCXJldHVybiAwOwogCiAJLyogZW5hYmxlIHBwY2FwIGludGVycnVwdCAqLwogCXNuZF9oZGFjX2V4dF9idXNfcHBjYXBfZW5hYmxlKCZza2wtPmVidXMsIHRydWUpOwogCXNuZF9oZGFjX2V4dF9idXNfcHBjYXBfaW50X2VuYWJsZSgmc2tsLT5lYnVzLCB0cnVlKTsKIAorCS8qIGNoZWNrIGlmIERTUCAxc3QgYm9vdCBpcyBkb25lICovCisJaWYgKHNrbC0+c2tsX3NzdC0+aXNfZmlyc3RfYm9vdCA9PSB0cnVlKQorCQlyZXR1cm4gMDsKKwogCXJldCA9IHNrbF9kc3Bfd2FrZShjdHgtPmRzcCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CkBAIC02NzIsNiArNjgwLDcgQEAKIAkJcmV0dXJuIHBhcmFtX3NpemU7CiAKIAljYXNlIFNLTF9NT0RVTEVfVFlQRV9CQVNFX09VVEZNVDoKKwljYXNlIFNLTF9NT0RVTEVfVFlQRV9LUEI6CiAJCXJldHVybiBzaXplb2Yoc3RydWN0IHNrbF9iYXNlX291dGZtdF9jZmcpOwogCiAJZGVmYXVsdDoKQEAgLTcyNSw2ICs3MzQsNyBAQAogCQlicmVhazsKIAogCWNhc2UgU0tMX01PRFVMRV9UWVBFX0JBU0VfT1VURk1UOgorCWNhc2UgU0tMX01PRFVMRV9UWVBFX0tQQjoKIAkJc2tsX3NldF9iYXNlX291dGZtdF9mb3JtYXQoY3R4LCBtb2R1bGVfY29uZmlnLCAqcGFyYW1fZGF0YSk7CiAJCWJyZWFrOwogCkBAIC03NzksNiArNzg5LDcgQEAKIAkJCQltcGluW2ldLmluX3VzZSA9IHRydWU7CiAJCQkJbXBpbltpXS5pZC5tb2R1bGVfaWQgPSBpZC5tb2R1bGVfaWQ7CiAJCQkJbXBpbltpXS5pZC5pbnN0YW5jZV9pZCA9IGlkLmluc3RhbmNlX2lkOworCQkJCW1waW5baV0uaWQucHZ0X2lkID0gaWQucHZ0X2lkOwogCQkJCW1waW5baV0udGd0X21jZmcgPSB0Z3RfY2ZnOwogCQkJCXJldHVybiBpOwogCQkJfQpAQCAtODAyLDYgKzgxMyw3IEBACiAJCW1waW5bcV9pbmRleF0uaW5fdXNlID0gZmFsc2U7CiAJCW1waW5bcV9pbmRleF0uaWQubW9kdWxlX2lkID0gMDsKIAkJbXBpbltxX2luZGV4XS5pZC5pbnN0YW5jZV9pZCA9IDA7CisJCW1waW5bcV9pbmRleF0uaWQucHZ0X2lkID0gMDsKIAl9CiAJbXBpbltxX2luZGV4XS5waW5fc3RhdGUgPSBTS0xfUElOX1VOQklORDsKIAltcGluW3FfaW5kZXhdLnRndF9tY2ZnID0gTlVMTDsKQEAgLTg0Miw3ICs4NTQsNyBAQAogCXN0cnVjdCBza2xfaXBjX2luaXRfaW5zdGFuY2VfbXNnIG1zZzsKIAogCWRldl9kYmcoY3R4LT5kZXYsICIlczogbW9kdWxlX2lkID0gJWQgaW5zdGFuY2U9JWRcbiIsIF9fZnVuY19fLAotCQkgbWNvbmZpZy0+aWQubW9kdWxlX2lkLCBtY29uZmlnLT5pZC5pbnN0YW5jZV9pZCk7CisJCSBtY29uZmlnLT5pZC5tb2R1bGVfaWQsIG1jb25maWctPmlkLnB2dF9pZCk7CiAKIAlpZiAobWNvbmZpZy0+cGlwZS0+c3RhdGUgIT0gU0tMX1BJUEVfQ1JFQVRFRCkgewogCQlkZXZfZXJyKGN0eC0+ZGV2LCAiUGlwZSBub3QgY3JlYXRlZCBzdGF0ZT0gJWQgcGlwZV9pZD0gJWRcbiIsCkBAIC04NTgsMTAgKzg3MCwxMSBAQAogCX0KIAogCW1zZy5tb2R1bGVfaWQgPSBtY29uZmlnLT5pZC5tb2R1bGVfaWQ7Ci0JbXNnLmluc3RhbmNlX2lkID0gbWNvbmZpZy0+aWQuaW5zdGFuY2VfaWQ7CisJbXNnLmluc3RhbmNlX2lkID0gbWNvbmZpZy0+aWQucHZ0X2lkOwogCW1zZy5wcGxfaW5zdGFuY2VfaWQgPSBtY29uZmlnLT5waXBlLT5wcGxfaWQ7CiAJbXNnLnBhcmFtX2RhdGFfc2l6ZSA9IG1vZHVsZV9jb25maWdfc2l6ZTsKIAltc2cuY29yZV9pZCA9IG1jb25maWctPmNvcmVfaWQ7CisJbXNnLmRvbWFpbiA9IG1jb25maWctPmRvbWFpbjsKIAogCXJldCA9IHNrbF9pcGNfaW5pdF9pbnN0YW5jZSgmY3R4LT5pcGMsICZtc2csIHBhcmFtX2RhdGEpOwogCWlmIChyZXQgPCAwKSB7CkBAIC04NzgsOSArODkxLDkgQEAKIAkqc3JjX21vZHVsZSwgc3RydWN0IHNrbF9tb2R1bGVfY2ZnICpkc3RfbW9kdWxlKQogewogCWRldl9kYmcoY3R4LT5kZXYsICIlczogc3JjIG1vZHVsZV9pZCA9ICVkICBzcmNfaW5zdGFuY2U9JWRcbiIsCi0JCV9fZnVuY19fLCBzcmNfbW9kdWxlLT5pZC5tb2R1bGVfaWQsIHNyY19tb2R1bGUtPmlkLmluc3RhbmNlX2lkKTsKKwkJX19mdW5jX18sIHNyY19tb2R1bGUtPmlkLm1vZHVsZV9pZCwgc3JjX21vZHVsZS0+aWQucHZ0X2lkKTsKIAlkZXZfZGJnKGN0eC0+ZGV2LCAiJXM6IGRzdF9tb2R1bGU9JWQgZHN0X2luc3RhY25lPSVkXG4iLCBfX2Z1bmNfXywKLQkJIGRzdF9tb2R1bGUtPmlkLm1vZHVsZV9pZCwgZHN0X21vZHVsZS0+aWQuaW5zdGFuY2VfaWQpOworCQkgZHN0X21vZHVsZS0+aWQubW9kdWxlX2lkLCBkc3RfbW9kdWxlLT5pZC5wdnRfaWQpOwogCiAJZGV2X2RiZyhjdHgtPmRldiwgInNyY19tb2R1bGUgc3RhdGUgPSAlZCBkc3QgbW9kdWxlIHN0YXRlID0gJWRcbiIsCiAJCXNyY19tb2R1bGUtPm1fc3RhdGUsIGRzdF9tb2R1bGUtPm1fc3RhdGUpOwpAQCAtOTI3LDkgKzk0MCw5IEBACiAJCXJldHVybiAwOwogCiAJbXNnLm1vZHVsZV9pZCA9IHNyY19tY2ZnLT5pZC5tb2R1bGVfaWQ7Ci0JbXNnLmluc3RhbmNlX2lkID0gc3JjX21jZmctPmlkLmluc3RhbmNlX2lkOworCW1zZy5pbnN0YW5jZV9pZCA9IHNyY19tY2ZnLT5pZC5wdnRfaWQ7CiAJbXNnLmRzdF9tb2R1bGVfaWQgPSBkc3RfbWNmZy0+aWQubW9kdWxlX2lkOwotCW1zZy5kc3RfaW5zdGFuY2VfaWQgPSBkc3RfbWNmZy0+aWQuaW5zdGFuY2VfaWQ7CisJbXNnLmRzdF9pbnN0YW5jZV9pZCA9IGRzdF9tY2ZnLT5pZC5wdnRfaWQ7CiAJbXNnLmJpbmQgPSBmYWxzZTsKIAogCXJldCA9IHNrbF9pcGNfYmluZF91bmJpbmQoJmN0eC0+aXBjLCAmbXNnKTsKQEAgLTk4OCw5ICsxMDAxLDkgQEAKIAkJCSBtc2cuc3JjX3F1ZXVlLCBtc2cuZHN0X3F1ZXVlKTsKIAogCW1zZy5tb2R1bGVfaWQgPSBzcmNfbWNmZy0+aWQubW9kdWxlX2lkOwotCW1zZy5pbnN0YW5jZV9pZCA9IHNyY19tY2ZnLT5pZC5pbnN0YW5jZV9pZDsKKwltc2cuaW5zdGFuY2VfaWQgPSBzcmNfbWNmZy0+aWQucHZ0X2lkOwogCW1zZy5kc3RfbW9kdWxlX2lkID0gZHN0X21jZmctPmlkLm1vZHVsZV9pZDsKLQltc2cuZHN0X2luc3RhbmNlX2lkID0gZHN0X21jZmctPmlkLmluc3RhbmNlX2lkOworCW1zZy5kc3RfaW5zdGFuY2VfaWQgPSBkc3RfbWNmZy0+aWQucHZ0X2lkOwogCW1zZy5iaW5kID0gdHJ1ZTsKIAogCXJldCA9IHNrbF9pcGNfYmluZF91bmJpbmQoJmN0eC0+aXBjLCAmbXNnKTsKQEAgLTExNjgsNyArMTE4MSw3IEBACiAJc3RydWN0IHNrbF9pcGNfbGFyZ2VfY29uZmlnX21zZyBtc2c7CiAKIAltc2cubW9kdWxlX2lkID0gbWNmZy0+aWQubW9kdWxlX2lkOwotCW1zZy5pbnN0YW5jZV9pZCA9IG1jZmctPmlkLmluc3RhbmNlX2lkOworCW1zZy5pbnN0YW5jZV9pZCA9IG1jZmctPmlkLnB2dF9pZDsKIAltc2cucGFyYW1fZGF0YV9zaXplID0gc2l6ZTsKIAltc2cubGFyZ2VfcGFyYW1faWQgPSBwYXJhbV9pZDsKIApAQCAtMTE4MSw3ICsxMTk0LDcgQEAKIAlzdHJ1Y3Qgc2tsX2lwY19sYXJnZV9jb25maWdfbXNnIG1zZzsKIAogCW1zZy5tb2R1bGVfaWQgPSBtY2ZnLT5pZC5tb2R1bGVfaWQ7Ci0JbXNnLmluc3RhbmNlX2lkID0gbWNmZy0+aWQuaW5zdGFuY2VfaWQ7CisJbXNnLmluc3RhbmNlX2lkID0gbWNmZy0+aWQucHZ0X2lkOwogCW1zZy5wYXJhbV9kYXRhX3NpemUgPSBzaXplOwogCW1zZy5sYXJnZV9wYXJhbV9pZCA9IHBhcmFtX2lkOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtcGNtLmMgYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtcGNtLmMKaW5kZXggNmUwNWJmOC4uNThjNzI4NiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXBjbS5jCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1wY20uYwpAQCAtMTA2LDcgKzEwNiw3IEBACiAKIHN0YXRpYyBlbnVtIGhkYWNfZXh0X3N0cmVhbV90eXBlIHNrbF9nZXRfaG9zdF9zdHJlYW1fdHlwZShzdHJ1Y3QgaGRhY19leHRfYnVzICplYnVzKQogewotCWlmIChlYnVzLT5wcGNhcCkKKwlpZiAoKGVidXNfdG9faGJ1cyhlYnVzKSktPnBwY2FwKQogCQlyZXR1cm4gSERBQ19FWFRfU1RSRUFNX1RZUEVfSE9TVDsKIAllbHNlCiAJCXJldHVybiBIREFDX0VYVF9TVFJFQU1fVFlQRV9DT1VQTEVEOwpAQCAtMTg4LDcgKzE4OCw3IEBACiAJc3RydWN0IGhkYWNfZXh0X2J1cyAqZWJ1cyA9IGRldl9nZXRfZHJ2ZGF0YShkYWktPmRldik7CiAJaW50IGZvcm1hdF92YWwgPSAwOwogCi0JaWYgKGVidXMtPnBwY2FwKSB7CisJaWYgKChlYnVzX3RvX2hidXMoZWJ1cykpLT5wcGNhcCkgewogCQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCiAJCWZvcm1hdF92YWwgPSBzbmRfaGRhY19jYWxjX3N0cmVhbV9mb3JtYXQocnVudGltZS0+cmF0ZSwKQEAgLTY0OCw3ICs2NDgsOCBAQAogCQkuY2hhbm5lbHNfbWluID0gSERBX01PTk8sCiAJCS5jaGFubmVsc19tYXggPSBIREFfU1RFUkVPLAogCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCB8IFNORFJWX1BDTV9SQVRFXzE2MDAwIHwgU05EUlZfUENNX1JBVEVfODAwMCwKLQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCiAJfSwKIAkuY2FwdHVyZSA9IHsKIAkJLnN0cmVhbV9uYW1lID0gIlN5c3RlbSBDYXB0dXJlIiwKQEAgLTEwMjAsNyArMTAyMSw3IEBACiB7CiAJc3RydWN0IGhkYWNfZXh0X2J1cyAqZWJ1cyA9IGdldF9idXNfY3R4KHN1YnN0cmVhbSk7CiAKLQlpZiAoIWVidXMtPnBwY2FwKQorCWlmICghKGVidXNfdG9faGJ1cyhlYnVzKSktPnBwY2FwKQogCQlyZXR1cm4gc2tsX2NvdXBsZWRfdHJpZ2dlcihzdWJzdHJlYW0sIGNtZCk7CiAKIAlyZXR1cm4gMDsKQEAgLTEwOTMsNyArMTA5NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc2tsX3BsYXRmb3JtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc2tsX3BsYXRmb3JtX29wcyA9IHsKIAkub3BlbiA9IHNrbF9wbGF0Zm9ybV9vcGVuLAogCS5pb2N0bCA9IHNuZF9wY21fbGliX2lvY3RsLAogCS50cmlnZ2VyID0gc2tsX3BsYXRmb3JtX3BjbV90cmlnZ2VyLApAQCAtMTEzOCwyMCArMTEzOSw2NyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKK3N0YXRpYyBpbnQgc2tsX3BvcHVsYXRlX21vZHVsZXMoc3RydWN0IHNrbCAqc2tsKQoreworCXN0cnVjdCBza2xfcGlwZWxpbmUgKnA7CisJc3RydWN0IHNrbF9waXBlX21vZHVsZSAqbTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdzsKKwlzdHJ1Y3Qgc2tsX21vZHVsZV9jZmcgKm1jb25maWc7CisJaW50IHJldDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJnNrbC0+cHBsX2xpc3QsIG5vZGUpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShtLCAmcC0+cGlwZS0+d19saXN0LCBub2RlKSB7CisKKwkJCXcgPSBtLT53OworCQkJbWNvbmZpZyA9IHctPnByaXY7CisKKwkJCXJldCA9IHNuZF9za2xfZ2V0X21vZHVsZV9pbmZvKHNrbC0+c2tsX3NzdCwgbWNvbmZpZyk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWRldl9lcnIoc2tsLT5za2xfc3N0LT5kZXYsCisJCQkJCSJxdWVyeSBtb2R1bGUgaW5mbyBmYWlsZWQ6JWRcbiIsIHJldCk7CisJCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwl9CitlcnI6CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBza2xfcGxhdGZvcm1fc29jX3Byb2JlKHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSkKIHsKIAlzdHJ1Y3QgaGRhY19leHRfYnVzICplYnVzID0gZGV2X2dldF9kcnZkYXRhKHBsYXRmb3JtLT5kZXYpOwogCXN0cnVjdCBza2wgKnNrbCA9IGVidXNfdG9fc2tsKGVidXMpOworCWNvbnN0IHN0cnVjdCBza2xfZHNwX29wcyAqb3BzOwogCWludCByZXQ7CiAKLQlpZiAoZWJ1cy0+cHBjYXApIHsKKwlwbV9ydW50aW1lX2dldF9zeW5jKHBsYXRmb3JtLT5kZXYpOworCWlmICgoZWJ1c190b19oYnVzKGVidXMpKS0+cHBjYXApIHsKIAkJcmV0ID0gc2tsX3RwbGdfaW5pdChwbGF0Zm9ybSwgZWJ1cyk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlkZXZfZXJyKHBsYXRmb3JtLT5kZXYsICJGYWlsZWQgdG8gaW5pdCB0b3BvbG9neSFcbiIpOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCQlza2wtPnBsYXRmb3JtID0gcGxhdGZvcm07CisKKwkJLyogbG9hZCB0aGUgZmlybXdhcmVzLCBzaW5jZSBhbGwgaXMgc2V0ICovCisJCW9wcyA9IHNrbF9nZXRfZHNwX29wcyhza2wtPnBjaS0+ZGV2aWNlKTsKKwkJaWYgKCFvcHMpCisJCQlyZXR1cm4gLUVJTzsKKworCQlpZiAoc2tsLT5za2xfc3N0LT5pc19maXJzdF9ib290ID09IGZhbHNlKSB7CisJCQlkZXZfZXJyKHBsYXRmb3JtLT5kZXYsICJEU1AgcmVwb3J0cyBmaXJzdCBib290IGRvbmUhISFcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQlyZXQgPSBvcHMtPmluaXRfZncocGxhdGZvcm0tPmRldiwgc2tsLT5za2xfc3N0KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIocGxhdGZvcm0tPmRldiwgIkZhaWxlZCB0byBib290IGZpcnN0IGZ3OiAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJc2tsX3BvcHVsYXRlX21vZHVsZXMoc2tsKTsKIAl9CisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShwbGF0Zm9ybS0+ZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChwbGF0Zm9ybS0+ZGV2KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXNzdC1jbGRtYS5jIGIvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXNzdC1jbGRtYS5jCmluZGV4IGRhMjMyOWQuLmVmYTI1MzIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1zc3QtY2xkbWEuYworKysgYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtc3N0LWNsZG1hLmMKQEAgLTM0MSwxNCArMzQxLDE0IEBACiAJcmV0ID0gY3R4LT5kc3Bfb3BzLmFsbG9jX2RtYV9idWYoY3R4LT5kZXYsCiAJCQkmY3R4LT5jbF9kZXYuZG1hYl9kYXRhLCBjdHgtPmNsX2Rldi5idWZzaXplKTsKIAlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGN0eC0+ZGV2LCAiQWxsb2MgYnVmZmVyIGZvciBiYXNlIGZ3IGZhaWxlZDogJXgiLCByZXQpOworCQlkZXZfZXJyKGN0eC0+ZGV2LCAiQWxsb2MgYnVmZmVyIGZvciBiYXNlIGZ3IGZhaWxlZDogJXhcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCS8qIFNldHVwIENvZGUgbG9hZGVyIEJETCAqLwogCXJldCA9IGN0eC0+ZHNwX29wcy5hbGxvY19kbWFfYnVmKGN0eC0+ZGV2LAogCQkJJmN0eC0+Y2xfZGV2LmRtYWJfYmRsLCBQQUdFX1NJWkUpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY3R4LT5kZXYsICJBbGxvYyBidWZmZXIgZm9yIGJsZGUgZmFpbGVkOiAleCIsIHJldCk7CisJCWRldl9lcnIoY3R4LT5kZXYsICJBbGxvYyBidWZmZXIgZm9yIGJsZGUgZmFpbGVkOiAleFxuIiwgcmV0KTsKIAkJY3R4LT5kc3Bfb3BzLmZyZWVfZG1hX2J1ZihjdHgtPmRldiwgJmN0eC0+Y2xfZGV2LmRtYWJfZGF0YSk7CiAJCXJldHVybiByZXQ7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXNzdC1kc3AuaCBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1zc3QtZHNwLmgKaW5kZXggMGY4NjI5ZS4uYjllNzFkMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXNzdC1kc3AuaAorKysgYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtc3N0LWRzcC5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8c291bmQvbWVtYWxsb2MuaD4KICNpbmNsdWRlICJza2wtc3N0LWNsZG1hLmgiCiAjaW5jbHVkZSAic2tsLXRwbGctaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAic2tsLXRvcG9sb2d5LmgiCiAKIHN0cnVjdCBzc3RfZHNwOwogc3RydWN0IHNrbF9zc3Q7CkBAIC0xMzMsNiArMTM0LDggQEAKIHN0cnVjdCBza2xfZHNwX2Z3X29wcyB7CiAJaW50ICgqbG9hZF9mdykoc3RydWN0IHNzdF9kc3AgICpjdHgpOwogCS8qIEZXIG1vZHVsZSBwYXJzZXIvbG9hZGVyICovCisJaW50ICgqbG9hZF9saWJyYXJ5KShzdHJ1Y3Qgc3N0X2RzcCAqY3R4LAorCQlzdHJ1Y3Qgc2tsX2Rmd19tYW5pZmVzdCAqbWluZm8pOwogCWludCAoKnBhcnNlX2Z3KShzdHJ1Y3Qgc3N0X2RzcCAqY3R4KTsKIAlpbnQgKCpzZXRfc3RhdGVfRDApKHN0cnVjdCBzc3RfZHNwICpjdHgsIHVuc2lnbmVkIGludCBjb3JlX2lkKTsKIAlpbnQgKCpzZXRfc3RhdGVfRDMpKHN0cnVjdCBzc3RfZHNwICpjdHgsIHVuc2lnbmVkIGludCBjb3JlX2lkKTsKQEAgLTIwMywxMiArMjA2LDIxIEBACiBpbnQgYnh0X3NzdF9kc3BfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgX19pb21lbSAqbW1pb19iYXNlLCBpbnQgaXJxLAogCQljb25zdCBjaGFyICpmd19uYW1lLCBzdHJ1Y3Qgc2tsX2RzcF9sb2FkZXJfb3BzIGRzcF9vcHMsCiAJCXN0cnVjdCBza2xfc3N0ICoqZHNwKTsKK2ludCBza2xfc3N0X2luaXRfZncoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2tsX3NzdCAqY3R4KTsKK2ludCBieHRfc3N0X2luaXRfZncoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2tsX3NzdCAqY3R4KTsKIHZvaWQgc2tsX3NzdF9kc3BfY2xlYW51cChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBza2xfc3N0ICpjdHgpOwogdm9pZCBieHRfc3N0X2RzcF9jbGVhbnVwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNrbF9zc3QgKmN0eCk7CiAKLWludCBzbmRfc2tsX2dldF9tb2R1bGVfaW5mbyhzdHJ1Y3Qgc2tsX3NzdCAqY3R4LCB1OCAqdXVpZCwKLQkJc3RydWN0IHNrbF9kZndfbW9kdWxlICpkZndfY29uZmlnKTsKLWludCBzbmRfc2tsX3BhcnNlX3V1aWRzKHN0cnVjdCBzc3RfZHNwICpjdHgsIHVuc2lnbmVkIGludCBvZmZzZXQpOworaW50IHNuZF9za2xfZ2V0X21vZHVsZV9pbmZvKHN0cnVjdCBza2xfc3N0ICpjdHgsCisJCQkJc3RydWN0IHNrbF9tb2R1bGVfY2ZnICptY29uZmlnKTsKK2ludCBzbmRfc2tsX3BhcnNlX3V1aWRzKHN0cnVjdCBzc3RfZHNwICpjdHgsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsCisJCQkJdW5zaWduZWQgaW50IG9mZnNldCwgaW50IGluZGV4KTsKK2ludCBza2xfZ2V0X3B2dF9pZChzdHJ1Y3Qgc2tsX3NzdCAqY3R4LAorCQkJCXN0cnVjdCBza2xfbW9kdWxlX2NmZyAqbWNvbmZpZyk7CitpbnQgc2tsX3B1dF9wdnRfaWQoc3RydWN0IHNrbF9zc3QgKmN0eCwKKwkJCQlzdHJ1Y3Qgc2tsX21vZHVsZV9jZmcgKm1jb25maWcpOworaW50IHNrbF9nZXRfcHZ0X2luc3RhbmNlX2lkX21hcChzdHJ1Y3Qgc2tsX3NzdCAqY3R4LAorCQkJCWludCBtb2R1bGVfaWQsIGludCBpbnN0YW5jZV9pZCk7CiB2b2lkIHNrbF9mcmVldXBfdXVpZF9saXN0KHN0cnVjdCBza2xfc3N0ICpjdHgpOwogCiBpbnQgc2tsX2RzcF9zdHJpcF9leHRlbmRlZF9tYW5pZmVzdChzdHJ1Y3QgZmlybXdhcmUgKmZ3KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1zc3QtaXBjLmMgYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtc3N0LWlwYy5jCmluZGV4IDk2ZjJmNjguLjBiZDAxZTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1zc3QtaXBjLmMKKysrIGIvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXNzdC1pcGMuYwpAQCAtMTE0LDYgKzExNCwxMSBAQAogI2RlZmluZSBJUENfQ09SRV9JRCh4KQkJCSgoKHgpICYgSVBDX0NPUkVfSURfTUFTSykgXAogCQkJCQk8PCBJUENfQ09SRV9JRF9TSElGVCkKIAorI2RlZmluZSBJUENfRE9NQUlOX1NISUZUICAgICAgICAgICAgICAgIDI4CisjZGVmaW5lIElQQ19ET01BSU5fTUFTSyAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIElQQ19ET01BSU4oeCkgICAgICAgICAgICAgICAgICAgKCgoeCkgJiBJUENfRE9NQUlOX01BU0spIFwKKwkJCQkJPDwgSVBDX0RPTUFJTl9TSElGVCkKKwogLyogQmluZC9VbmJpbmQgbWVzc2FnZSBleHRlbnNpb24gcmVnaXN0ZXIgKi8KICNkZWZpbmUgSVBDX0RTVF9NT0RfSURfU0hJRlQJCTAKICNkZWZpbmUgSVBDX0RTVF9NT0RfSUQoeCkJCSgoKHgpICYgSVBDX01PRF9JRF9NQVNLKSBcCkBAIC0xOTAsNiArMTk1LDcgQEAKIAlJUENfR0xCX0dFVF9QUExfQ09OVEVYVF9TSVpFID0gMjEsCiAJSVBDX0dMQl9TQVZFX1BQTCA9IDIyLAogCUlQQ19HTEJfUkVTVE9SRV9QUEwgPSAyMywKKwlJUENfR0xCX0xPQURfTElCUkFSWSA9IDI0LAogCUlQQ19HTEJfTk9USUZZID0gMjYsCiAJSVBDX0dMQl9NQVhfSVBDX01TR19OVU1CRVIgPSAzMSAvKiBNYXhpbXVtIG1lc3NhZ2UgbnVtYmVyICovCiB9OwpAQCAtMzM4LDcgKzM0NCw3IEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJZGV2X2VycihpcGMtPmRldiwgImlwYzogVW5oYW5kbGVkIGVycm9yIG1zZz0leCIsCisJCQlkZXZfZXJyKGlwYy0+ZGV2LCAiaXBjOiBVbmhhbmRsZWQgZXJyb3IgbXNnPSV4XG4iLAogCQkJCQkJaGVhZGVyLnByaW1hcnkpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTM3OSwxMyArMzg1LDEzIEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJZGV2X2VycihpcGMtPmRldiwgIlVua25vd24gaXBjIHJlcGx5OiAweCV4IiwgcmVwbHkpOworCQlkZXZfZXJyKGlwYy0+ZGV2LCAiVW5rbm93biBpcGMgcmVwbHk6IDB4JXhcbiIsIHJlcGx5KTsKIAkJbXNnLT5lcnJubyA9IC1FSU5WQUw7CiAJCWJyZWFrOwogCX0KIAogCWlmIChyZXBseSAhPSBJUENfR0xCX1JFUExZX1NVQ0NFU1MpIHsKLQkJZGV2X2VycihpcGMtPmRldiwgImlwYyBGVyByZXBseTogcmVwbHk9JWQiLCByZXBseSk7CisJCWRldl9lcnIoaXBjLT5kZXYsICJpcGMgRlcgcmVwbHk6IHJlcGx5PSVkXG4iLCByZXBseSk7CiAJCWRldl9lcnIoaXBjLT5kZXYsICJGVyBFcnJvciBDb2RlOiAldVxuIiwKIAkJCWlwYy0+ZHNwLT5md19vcHMuZ2V0X2Z3X2VycmNvZGUoaXBjLT5kc3ApKTsKIAl9CkBAIC00MzQsOSArNDQwLDkgQEAKIAkJaGlwY3RlID0gc3N0X2RzcF9zaGltX3JlYWRfdW5sb2NrZWQoZHNwLCBTS0xfQURTUF9SRUdfSElQQ1RFKTsKIAkJaGVhZGVyLnByaW1hcnkgPSBoaXBjdDsKIAkJaGVhZGVyLmV4dGVuc2lvbiA9IGhpcGN0ZTsKLQkJZGV2X2RiZyhkc3AtPmRldiwgIklQQyBpcnE6IEZpcm13YXJlIHJlc3BvbmQgcHJpbWFyeToleCIsCisJCWRldl9kYmcoZHNwLT5kZXYsICJJUEMgaXJxOiBGaXJtd2FyZSByZXNwb25kIHByaW1hcnk6JXhcbiIsCiAJCQkJCQloZWFkZXIucHJpbWFyeSk7Ci0JCWRldl9kYmcoZHNwLT5kZXYsICJJUEMgaXJxOiBGaXJtd2FyZSByZXNwb25kIGV4dGVuc2lvbjoleCIsCisJCWRldl9kYmcoZHNwLT5kZXYsICJJUEMgaXJxOiBGaXJtd2FyZSByZXNwb25kIGV4dGVuc2lvbjoleFxuIiwKIAkJCQkJCWhlYWRlci5leHRlbnNpb24pOwogCiAJCWlmIChJUENfR0xCX05PVElGWV9SU1BfVFlQRShoZWFkZXIucHJpbWFyeSkpIHsKQEAgLTcwNCw2ICs3MTAsNyBAQAogCWhlYWRlci5leHRlbnNpb24gPSBJUENfQ09SRV9JRChtc2ctPmNvcmVfaWQpOwogCWhlYWRlci5leHRlbnNpb24gfD0gSVBDX1BQTF9JTlNUQU5DRV9JRChtc2ctPnBwbF9pbnN0YW5jZV9pZCk7CiAJaGVhZGVyLmV4dGVuc2lvbiB8PSBJUENfUEFSQU1fQkxPQ0tfU0laRShwYXJhbV9ibG9ja19zaXplKTsKKwloZWFkZXIuZXh0ZW5zaW9uIHw9IElQQ19ET01BSU4obXNnLT5kb21haW4pOwogCiAJZGV2X2RiZyhpcGMtPmRldiwgIkluICVzIHByaW1hcnkgPSV4IGV4dD0leFxuIiwgX19mdW5jX18sCiAJCQkgaGVhZGVyLnByaW1hcnksIGhlYWRlci5leHRlbnNpb24pOwpAQCAtNzQyLDcgKzc0OSw3IEBACiAJCQkgaGVhZGVyLmV4dGVuc2lvbik7CiAJcmV0ID0gc3N0X2lwY190eF9tZXNzYWdlX3dhaXQoaXBjLCAqaXBjX2hlYWRlciwgTlVMTCwgMCwgTlVMTCwgMCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihpcGMtPmRldiwgImlwYzogYmluZC91bmJpbmQgZmFpbGVkZW4iKTsKKwkJZGV2X2VycihpcGMtPmRldiwgImlwYzogYmluZC91bmJpbmQgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTkwMiwzICs5MDksMjUgQEAKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc2tsX2lwY19nZXRfbGFyZ2VfY29uZmlnKTsKKworaW50IHNrbF9zc3RfaXBjX2xvYWRfbGlicmFyeShzdHJ1Y3Qgc3N0X2dlbmVyaWNfaXBjICppcGMsCisJCQkJdTggZG1hX2lkLCB1OCB0YWJsZV9pZCkKK3sKKwlzdHJ1Y3Qgc2tsX2lwY19oZWFkZXIgaGVhZGVyID0gezB9OworCXU2NCAqaXBjX2hlYWRlciA9ICh1NjQgKikoJmhlYWRlcik7CisJaW50IHJldCA9IDA7CisKKwloZWFkZXIucHJpbWFyeSA9IElQQ19NU0dfVEFSR0VUKElQQ19GV19HRU5fTVNHKTsKKwloZWFkZXIucHJpbWFyeSB8PSBJUENfTVNHX0RJUihJUENfTVNHX1JFUVVFU1QpOworCWhlYWRlci5wcmltYXJ5IHw9IElQQ19HTEJfVFlQRShJUENfR0xCX0xPQURfTElCUkFSWSk7CisJaGVhZGVyLnByaW1hcnkgfD0gSVBDX01PRF9JTlNUQU5DRV9JRCh0YWJsZV9pZCk7CisJaGVhZGVyLnByaW1hcnkgfD0gSVBDX01PRF9JRChkbWFfaWQpOworCisJcmV0ID0gc3N0X2lwY190eF9tZXNzYWdlX3dhaXQoaXBjLCAqaXBjX2hlYWRlciwgTlVMTCwgMCwgTlVMTCwgMCk7CisKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycihpcGMtPmRldiwgImlwYzogbG9hZCBsaWIgZmFpbGVkXG4iKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChza2xfc3N0X2lwY19sb2FkX2xpYnJhcnkpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXNzdC1pcGMuaCBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1zc3QtaXBjLmgKaW5kZXggMmUzZDRlOC4uMDMzNGVkNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXNzdC1pcGMuaAorKysgYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtc3N0LWlwYy5oCkBAIC02Niw3ICs2Niw3IEBACiAKIAkvKiBjYWxsYmFjayBmb3IgbWlzY2JkZ2UgKi8KIAl2b2lkICgqZW5hYmxlX21pc2NiZGNnZSkoc3RydWN0IGRldmljZSAqZGV2LCBib29sIGVuYWJsZSk7Ci0JLypJcyBDR0NUTC5NSVNDQkRDR0UgZGlzYWJsZWQqLworCS8qIElzIENHQ1RMLk1JU0NCRENHRSBkaXNhYmxlZCAqLwogCWJvb2wgbWlzY2JkY2dfZGlzYWJsZWQ7CiAKIAkvKiBQb3B1bGF0ZSBtb2R1bGUgaW5mb3JtYXRpb24gKi8KQEAgLTc1LDggKzc1LDE0IEBACiAJLyogSXMgZmlybXdhcmUgbG9hZGVkICovCiAJYm9vbCBmd19sb2FkZWQ7CiAKKwkvKiBmaXJzdCBib290ID8gKi8KKwlib29sIGlzX2ZpcnN0X2Jvb3Q7CisKIAkvKiBtdWx0aS1jb3JlICovCiAJc3RydWN0IHNrbF9kc3BfY29yZXMgY29yZXM7CisKKwkvKiB0cGxnIG1hbmlmZXN0ICovCisJc3RydWN0IHNrbF9kZndfbWFuaWZlc3QgbWFuaWZlc3Q7CiB9OwogCiBzdHJ1Y3Qgc2tsX2lwY19pbml0X2luc3RhbmNlX21zZyB7CkBAIC04NSw2ICs5MSw3IEBACiAJdTE2IHBhcmFtX2RhdGFfc2l6ZTsKIAl1OCBwcGxfaW5zdGFuY2VfaWQ7CiAJdTggY29yZV9pZDsKKwl1OCBkb21haW47CiB9OwogCiBzdHJ1Y3Qgc2tsX2lwY19iaW5kX3VuYmluZF9tc2cgewpAQCAtMTQ1LDYgKzE1Miw5IEBACiBpbnQgc2tsX2lwY19nZXRfbGFyZ2VfY29uZmlnKHN0cnVjdCBzc3RfZ2VuZXJpY19pcGMgKmlwYywKIAkJc3RydWN0IHNrbF9pcGNfbGFyZ2VfY29uZmlnX21zZyAqbXNnLCB1MzIgKnBhcmFtKTsKIAoraW50IHNrbF9zc3RfaXBjX2xvYWRfbGlicmFyeShzdHJ1Y3Qgc3N0X2dlbmVyaWNfaXBjICppcGMsCisJCQl1OCBkbWFfaWQsIHU4IHRhYmxlX2lkKTsKKwogdm9pZCBza2xfaXBjX2ludF9lbmFibGUoc3RydWN0IHNzdF9kc3AgKmRzcCk7CiB2b2lkIHNrbF9pcGNfb3BfaW50X2VuYWJsZShzdHJ1Y3Qgc3N0X2RzcCAqY3R4KTsKIHZvaWQgc2tsX2lwY19vcF9pbnRfZGlzYWJsZShzdHJ1Y3Qgc3N0X2RzcCAqY3R4KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1zc3QtdXRpbHMuYyBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1zc3QtdXRpbHMuYwppbmRleCAyNWZjYjc5Li44ZGMwMzAzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtc3N0LXV0aWxzLmMKKysrIGIvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXNzdC11dGlscy5jCkBAIC0yOCwxMSArMjgsNiBAQAogLyogRlcgRXh0ZW5kZWQgTWFuaWZlc3QgSGVhZGVyIGlkID0gJEFFMSAqLwogI2RlZmluZSBTS0xfRVhUX01BTklGRVNUX0hFQURFUl9NQUdJQyAgIDB4MzE0NTQxMjQKIAotc3RydWN0IHNrbF9kZndfbW9kdWxlX21vZCB7Ci0JY2hhciBuYW1lWzEwMF07Ci0Jc3RydWN0IHNrbF9kZndfbW9kdWxlIHNrbF9kZndfbW9kOwotfTsKLQogc3RydWN0IFVVSUQgewogCXU4IGlkWzE2XTsKIH07CkBAIC05OSwxMCArOTQsMTUgQEAKIAl1MzIgbG9hZF9vZmZzZXQ7CiB9IF9fcGFja2VkOwogCisjZGVmaW5lIE1BWF9JTlNUQU5DRV9CVUZGIDIKKwogc3RydWN0IHV1aWRfbW9kdWxlIHsKIAl1dWlkX2xlIHV1aWQ7CiAJaW50IGlkOwogCWludCBpc19sb2FkYWJsZTsKKwlpbnQgbWF4X2luc3RhbmNlOworCXU2NCBwdnRfaWRbTUFYX0lOU1RBTkNFX0JVRkZdOworCWludCAqaW5zdGFuY2VfaWQ7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiB9OwpAQCAtMTE1LDE4ICsxMTUsMjMgQEAKIAl1MzIgZW50cmllczsKIH07CiAKLWludCBzbmRfc2tsX2dldF9tb2R1bGVfaW5mbyhzdHJ1Y3Qgc2tsX3NzdCAqY3R4LCB1OCAqdXVpZCwKLQkJCXN0cnVjdCBza2xfZGZ3X21vZHVsZSAqZGZ3X2NvbmZpZykKK2ludCBzbmRfc2tsX2dldF9tb2R1bGVfaW5mbyhzdHJ1Y3Qgc2tsX3NzdCAqY3R4LAorCQkJCXN0cnVjdCBza2xfbW9kdWxlX2NmZyAqbWNvbmZpZykKIHsKIAlzdHJ1Y3QgdXVpZF9tb2R1bGUgKm1vZHVsZTsKIAl1dWlkX2xlICp1dWlkX21vZDsKIAotCXV1aWRfbW9kID0gKHV1aWRfbGUgKil1dWlkOworCXV1aWRfbW9kID0gKHV1aWRfbGUgKiltY29uZmlnLT5ndWlkOworCisJaWYgKGxpc3RfZW1wdHkoJmN0eC0+dXVpZF9saXN0KSkgeworCQlkZXZfZXJyKGN0eC0+ZGV2LCAiTW9kdWxlIGxpc3QgaXMgZW1wdHlcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1vZHVsZSwgJmN0eC0+dXVpZF9saXN0LCBsaXN0KSB7CiAJCWlmICh1dWlkX2xlX2NtcCgqdXVpZF9tb2QsIG1vZHVsZS0+dXVpZCkgPT0gMCkgewotCQkJZGZ3X2NvbmZpZy0+bW9kdWxlX2lkID0gbW9kdWxlLT5pZDsKLQkJCWRmd19jb25maWctPmlzX2xvYWRhYmxlID0gbW9kdWxlLT5pc19sb2FkYWJsZTsKKwkJCW1jb25maWctPmlkLm1vZHVsZV9pZCA9IG1vZHVsZS0+aWQ7CisJCQltY29uZmlnLT5pc19sb2FkYWJsZSA9IG1vZHVsZS0+aXNfbG9hZGFibGU7CiAKIAkJCXJldHVybiAwOwogCQl9CkBAIC0xMzYsMTUgKzE0MSwxNTQgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9za2xfZ2V0X21vZHVsZV9pbmZvKTsKIAorc3RhdGljIGludCBza2xfZ2V0X3B2dGlkX21hcChzdHJ1Y3QgdXVpZF9tb2R1bGUgKm1vZHVsZSwgaW50IGluc3RhbmNlX2lkKQoreworCWludCBwdnRfaWQ7CisKKwlmb3IgKHB2dF9pZCA9IDA7IHB2dF9pZCA8IG1vZHVsZS0+bWF4X2luc3RhbmNlOyBwdnRfaWQrKykgeworCQlpZiAobW9kdWxlLT5pbnN0YW5jZV9pZFtwdnRfaWRdID09IGluc3RhbmNlX2lkKQorCQkJcmV0dXJuIHB2dF9pZDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK2ludCBza2xfZ2V0X3B2dF9pbnN0YW5jZV9pZF9tYXAoc3RydWN0IHNrbF9zc3QgKmN0eCwKKwkJCQlpbnQgbW9kdWxlX2lkLCBpbnQgaW5zdGFuY2VfaWQpCit7CisJc3RydWN0IHV1aWRfbW9kdWxlICptb2R1bGU7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1vZHVsZSwgJmN0eC0+dXVpZF9saXN0LCBsaXN0KSB7CisJCWlmIChtb2R1bGUtPmlkID09IG1vZHVsZV9pZCkKKwkJCXJldHVybiBza2xfZ2V0X3B2dGlkX21hcChtb2R1bGUsIGluc3RhbmNlX2lkKTsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNrbF9nZXRfcHZ0X2luc3RhbmNlX2lkX21hcCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHNrbF9nZXRpZF8zMihzdHJ1Y3QgdXVpZF9tb2R1bGUgKm1vZHVsZSwgdTY0ICp2YWwsCisJCQkJaW50IHdvcmQxX21hc2ssIGludCB3b3JkMl9tYXNrKQoreworCWludCBpbmRleCwgbWF4X2luc3QsIHB2dF9pZDsKKwl1MzIgbWFza192YWw7CisKKwltYXhfaW5zdCA9ICBtb2R1bGUtPm1heF9pbnN0YW5jZTsKKwltYXNrX3ZhbCA9ICh1MzIpKCp2YWwgPj4gd29yZDFfbWFzayk7CisKKwlpZiAobWFza192YWwgIT0gMHhmZmZmZmZmZikgeworCQlpbmRleCA9IGZmeihtYXNrX3ZhbCk7CisJCXB2dF9pZCA9IGluZGV4ICsgd29yZDFfbWFzayArIHdvcmQyX21hc2s7CisJCWlmIChwdnRfaWQgPD0gKG1heF9pbnN0IC0gMSkpIHsKKwkJCSp2YWwgfD0gMSA8PCAoaW5kZXggKyB3b3JkMV9tYXNrKTsKKwkJCXJldHVybiBwdnRfaWQ7CisJCX0KKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2tsX3B2dGlkXzEyOChzdHJ1Y3QgdXVpZF9tb2R1bGUgKm1vZHVsZSkKK3sKKwlpbnQgaiwgaSwgd29yZDFfbWFzaywgd29yZDJfbWFzayA9IDAsIHB2dF9pZDsKKworCWZvciAoaiA9IDA7IGogPCBNQVhfSU5TVEFOQ0VfQlVGRjsgaisrKSB7CisJCXdvcmQxX21hc2sgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCXB2dF9pZCA9IHNrbF9nZXRpZF8zMihtb2R1bGUsICZtb2R1bGUtPnB2dF9pZFtqXSwKKwkJCQkJCXdvcmQxX21hc2ssIHdvcmQyX21hc2spOworCQkJaWYgKHB2dF9pZCA+PSAwKQorCQkJCXJldHVybiBwdnRfaWQ7CisKKwkJCXdvcmQxX21hc2sgKz0gMzI7CisJCQlpZiAoKHdvcmQxX21hc2sgKyB3b3JkMl9tYXNrKSA+PSBtb2R1bGUtPm1heF9pbnN0YW5jZSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXdvcmQyX21hc2sgKz0gNjQ7CisJCWlmICh3b3JkMl9tYXNrID49IG1vZHVsZS0+bWF4X2luc3RhbmNlKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKgorICogc2tsX2dldF9wdnRfaWQ6IGdlbmVyYXRlIGEgcHJpdmF0ZSBpZCBmb3IgdXNlIGFzIG1vZHVsZSBpZAorICoKKyAqIEBjdHg6IGRyaXZlciBjb250ZXh0CisgKiBAbWNvbmZpZzogbW9kdWxlIGNvbmZpZ3VyYXRpb24gZGF0YQorICoKKyAqIFRoaXMgZ2VuZXJhdGVzIGEgMTI4IGJpdCBwcml2YXRlIHVuaXF1ZSBpZCBmb3IgYSBtb2R1bGUgVFlQRSBzbyB0aGF0CisgKiBtb2R1bGUgaW5zdGFuY2UgaXMgdW5pcXVlCisgKi8KK2ludCBza2xfZ2V0X3B2dF9pZChzdHJ1Y3Qgc2tsX3NzdCAqY3R4LCBzdHJ1Y3Qgc2tsX21vZHVsZV9jZmcgKm1jb25maWcpCit7CisJc3RydWN0IHV1aWRfbW9kdWxlICptb2R1bGU7CisJdXVpZF9sZSAqdXVpZF9tb2Q7CisJaW50IHB2dF9pZDsKKworCXV1aWRfbW9kID0gKHV1aWRfbGUgKiltY29uZmlnLT5ndWlkOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2R1bGUsICZjdHgtPnV1aWRfbGlzdCwgbGlzdCkgeworCQlpZiAodXVpZF9sZV9jbXAoKnV1aWRfbW9kLCBtb2R1bGUtPnV1aWQpID09IDApIHsKKworCQkJcHZ0X2lkID0gc2tsX3B2dGlkXzEyOChtb2R1bGUpOworCQkJaWYgKHB2dF9pZCA+PSAwKSB7CisJCQkJbW9kdWxlLT5pbnN0YW5jZV9pZFtwdnRfaWRdID0KKwkJCQkJCW1jb25maWctPmlkLmluc3RhbmNlX2lkOworCQkJCXJldHVybiBwdnRfaWQ7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNrbF9nZXRfcHZ0X2lkKTsKKworLyoqCisgKiBza2xfcHV0X3B2dF9pZDogZnJlZSB1cCB0aGUgcHJpdmF0ZSBpZCBhbGxvY2F0ZWQKKyAqCisgKiBAY3R4OiBkcml2ZXIgY29udGV4dAorICogQG1jb25maWc6IG1vZHVsZSBjb25maWd1cmF0aW9uIGRhdGEKKyAqCisgKiBUaGlzIGZyZWVzIGEgMTI4IGJpdCBwcml2YXRlIHVuaXF1ZSBpZCBwcmV2aW91c2x5IGdlbmVyYXRlZAorICovCitpbnQgc2tsX3B1dF9wdnRfaWQoc3RydWN0IHNrbF9zc3QgKmN0eCwgc3RydWN0IHNrbF9tb2R1bGVfY2ZnICptY29uZmlnKQoreworCWludCBpOworCXV1aWRfbGUgKnV1aWRfbW9kOworCXN0cnVjdCB1dWlkX21vZHVsZSAqbW9kdWxlOworCisJdXVpZF9tb2QgPSAodXVpZF9sZSAqKW1jb25maWctPmd1aWQ7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2R1bGUsICZjdHgtPnV1aWRfbGlzdCwgbGlzdCkgeworCQlpZiAodXVpZF9sZV9jbXAoKnV1aWRfbW9kLCBtb2R1bGUtPnV1aWQpID09IDApIHsKKworCQkJaWYgKG1jb25maWctPmlkLnB2dF9pZCAhPSAwKQorCQkJCWkgPSAobWNvbmZpZy0+aWQucHZ0X2lkKSAvIDY0OworCQkJZWxzZQorCQkJCWkgPSAwOworCisJCQltb2R1bGUtPnB2dF9pZFtpXSAmPSB+KDEgPDwgKG1jb25maWctPmlkLnB2dF9pZCkpOworCQkJbWNvbmZpZy0+aWQucHZ0X2lkID0gLTE7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAtRUlOVkFMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2tsX3B1dF9wdnRfaWQpOworCiAvKgogICogUGFyc2UgdGhlIGZpcm13YXJlIGJpbmFyeSB0byBnZXQgdGhlIFVVSUQsIG1vZHVsZSBpZAogICogYW5kIGxvYWRhYmxlIGZsYWdzCiAgKi8KLWludCBzbmRfc2tsX3BhcnNlX3V1aWRzKHN0cnVjdCBzc3RfZHNwICpjdHgsIHVuc2lnbmVkIGludCBvZmZzZXQpCitpbnQgc25kX3NrbF9wYXJzZV91dWlkcyhzdHJ1Y3Qgc3N0X2RzcCAqY3R4LCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3LAorCQkJdW5zaWduZWQgaW50IG9mZnNldCwgaW50IGluZGV4KQogewogCXN0cnVjdCBhZHNwX2Z3X2hkciAqYWRzcF9oZHI7CiAJc3RydWN0IGFkc3BfbW9kdWxlX2VudHJ5ICptb2RfZW50cnk7Ci0JaW50IGksIG51bV9lbnRyeTsKKwlpbnQgaSwgbnVtX2VudHJ5LCBzaXplOwogCXV1aWRfbGUgKnV1aWRfYmluOwogCWNvbnN0IGNoYXIgKmJ1ZjsKIAlzdHJ1Y3Qgc2tsX3NzdCAqc2tsID0gY3R4LT50aHJlYWRfY29udGV4dDsKQEAgLTE1Myw4ICsyOTcsOCBAQAogCXVuc2lnbmVkIGludCBzYWZlX2ZpbGU7CiAKIAkvKiBHZXQgdGhlIEZXIHBvaW50ZXIgdG8gZGVyaXZlIEFEU1AgaGVhZGVyICovCi0Jc3RyaXBwZWRfZncuZGF0YSA9IGN0eC0+ZnctPmRhdGE7Ci0Jc3RyaXBwZWRfZncuc2l6ZSA9IGN0eC0+ZnctPnNpemU7CisJc3RyaXBwZWRfZncuZGF0YSA9IGZ3LT5kYXRhOworCXN0cmlwcGVkX2Z3LnNpemUgPSBmdy0+c2l6ZTsKIAogCXNrbF9kc3Bfc3RyaXBfZXh0ZW5kZWRfbWFuaWZlc3QoJnN0cmlwcGVkX2Z3KTsKIApAQCAtMjA1LDggKzM0OSwxNSBAQAogCQl1dWlkX2JpbiA9ICh1dWlkX2xlICopbW9kX2VudHJ5LT51dWlkLmlkOwogCQltZW1jcHkoJm1vZHVsZS0+dXVpZCwgdXVpZF9iaW4sIHNpemVvZihtb2R1bGUtPnV1aWQpKTsKIAotCQltb2R1bGUtPmlkID0gaTsKKwkJbW9kdWxlLT5pZCA9IChpIHwgKGluZGV4IDw8IDEyKSk7CiAJCW1vZHVsZS0+aXNfbG9hZGFibGUgPSBtb2RfZW50cnktPnR5cGUubG9hZF90eXBlOworCQltb2R1bGUtPm1heF9pbnN0YW5jZSA9IG1vZF9lbnRyeS0+aW5zdGFuY2VfbWF4X2NvdW50OworCQlzaXplID0gc2l6ZW9mKGludCkgKiBtb2RfZW50cnktPmluc3RhbmNlX21heF9jb3VudDsKKwkJbW9kdWxlLT5pbnN0YW5jZV9pZCA9IGRldm1fa3phbGxvYyhjdHgtPmRldiwgc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghbW9kdWxlLT5pbnN0YW5jZV9pZCkgeworCQkJa2ZyZWUobW9kdWxlKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CiAKIAkJbGlzdF9hZGRfdGFpbCgmbW9kdWxlLT5saXN0LCAmc2tsLT51dWlkX2xpc3QpOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtc3N0LmMgYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtc3N0LmMKaW5kZXggNTg4Zjg5OS4uOGZjMzE3OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXNzdC5jCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1zc3QuYwpAQCAtODgsMTMgKzg4LDE1IEBACiAJCX0KIAl9CiAKLQlyZXQgPSBzbmRfc2tsX3BhcnNlX3V1aWRzKGN0eCwgU0tMX0FEU1BfRldfQklOX0hEUl9PRkZTRVQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY3R4LT5kZXYsCi0JCQkJIlVVSUQgcGFyc2luZyBlcnI6ICVkXG4iLCByZXQpOwotCQlyZWxlYXNlX2Zpcm13YXJlKGN0eC0+ZncpOwotCQlza2xfZHNwX2Rpc2FibGVfY29yZShjdHgsIFNLTF9EU1BfQ09SRTBfTUFTSyk7Ci0JCXJldHVybiByZXQ7CisJLyogcHJhc2UgdXVpZHMgb24gZmlyc3QgYm9vdCAqLworCWlmIChza2wtPmlzX2ZpcnN0X2Jvb3QpIHsKKwkJcmV0ID0gc25kX3NrbF9wYXJzZV91dWlkcyhjdHgsIGN0eC0+ZncsIFNLTF9BRFNQX0ZXX0JJTl9IRFJfT0ZGU0VULCAwKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoY3R4LT5kZXYsICJVVUlEIHBhcnNpbmcgZXJyOiAlZFxuIiwgcmV0KTsKKwkJCXJlbGVhc2VfZmlybXdhcmUoY3R4LT5mdyk7CisJCQlza2xfZHNwX2Rpc2FibGVfY29yZShjdHgsIFNLTF9EU1BfQ09SRTBfTUFTSyk7CisJCQlyZXR1cm4gcmV0OworCQl9CiAJfQogCiAJLyogY2hlY2sgZm9yIGV4dGVuZGVkIG1hbmlmZXN0ICovCkBAIC0xMDUsMTMgKzEwNywxMyBAQAogCiAJcmV0ID0gc2tsX2RzcF9ib290KGN0eCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihjdHgtPmRldiwgIkJvb3QgZHNwIGNvcmUgZmFpbGVkIHJldDogJWQiLCByZXQpOworCQlkZXZfZXJyKGN0eC0+ZGV2LCAiQm9vdCBkc3AgY29yZSBmYWlsZWQgcmV0OiAlZFxuIiwgcmV0KTsKIAkJZ290byBza2xfbG9hZF9iYXNlX2Zpcm13YXJlX2ZhaWxlZDsKIAl9CiAKIAlyZXQgPSBza2xfY2xkbWFfcHJlcGFyZShjdHgpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY3R4LT5kZXYsICJDTCBkbWEgcHJlcGFyZSBmYWlsZWQgOiAlZCIsIHJldCk7CisJCWRldl9lcnIoY3R4LT5kZXYsICJDTCBkbWEgcHJlcGFyZSBmYWlsZWQgOiAlZFxuIiwgcmV0KTsKIAkJZ290byBza2xfbG9hZF9iYXNlX2Zpcm13YXJlX2ZhaWxlZDsKIAl9CiAKQEAgLTQ4NCwyNiArNDg2LDMzIEBACiAJCXJldHVybiByZXQ7CiAKIAlza2wtPmNvcmVzLmNvdW50ID0gMjsKLQotCXJldCA9IHNzdC0+Zndfb3BzLmxvYWRfZncoc3N0KTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGRldiwgIkxvYWQgYmFzZSBmdyBmYWlsZWQgOiAlZCIsIHJldCk7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQlza2xfZHNwX2luaXRfY29yZV9zdGF0ZShzc3QpOworCXNrbC0+aXNfZmlyc3RfYm9vdCA9IHRydWU7CiAKIAlpZiAoZHNwKQogCQkqZHNwID0gc2tsOwogCiAJcmV0dXJuIHJldDsKLQotY2xlYW51cDoKLQlza2xfc3N0X2RzcF9jbGVhbnVwKGRldiwgc2tsKTsKLQlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc2tsX3NzdF9kc3BfaW5pdCk7CiAKK2ludCBza2xfc3N0X2luaXRfZncoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2tsX3NzdCAqY3R4KQoreworCWludCByZXQ7CisJc3RydWN0IHNzdF9kc3AgKnNzdCA9IGN0eC0+ZHNwOworCisJcmV0ID0gc3N0LT5md19vcHMubG9hZF9mdyhzc3QpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiTG9hZCBiYXNlIGZ3IGZhaWxlZCA6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXNrbF9kc3BfaW5pdF9jb3JlX3N0YXRlKHNzdCk7CisJY3R4LT5pc19maXJzdF9ib290ID0gZmFsc2U7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNrbF9zc3RfaW5pdF9mdyk7CisKIHZvaWQgc2tsX3NzdF9kc3BfY2xlYW51cChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBza2xfc3N0ICpjdHgpCiB7CiAJc2tsX2NsZWFyX21vZHVsZV90YWJsZShjdHgtPmRzcCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtdG9wb2xvZ3kuYyBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC10b3BvbG9neS5jCmluZGV4IGNjMDE1MGYuLmI1YjE5MzQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC10b3BvbG9neS5jCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC10b3BvbG9neS5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MtdG9wb2xvZ3kuaD4KKyNpbmNsdWRlIDx1YXBpL3NvdW5kL3NuZF9zc3RfdG9rZW5zLmg+CiAjaW5jbHVkZSAic2tsLXNzdC1kc3AuaCIKICNpbmNsdWRlICJza2wtc3N0LWlwYy5oIgogI2luY2x1ZGUgInNrbC10b3BvbG9neS5oIgpAQCAtMzIsNiArMzMsOCBAQAogI2RlZmluZSBTS0xfQ0hfRklYVVBfTUFTSwkJKDEgPDwgMCkKICNkZWZpbmUgU0tMX1JBVEVfRklYVVBfTUFTSwkJKDEgPDwgMSkKICNkZWZpbmUgU0tMX0ZNVF9GSVhVUF9NQVNLCQkoMSA8PCAyKQorI2RlZmluZSBTS0xfSU5fRElSX0JJVF9NQVNLCQlCSVQoMCkKKyNkZWZpbmUgU0tMX1BJTl9DT1VOVF9NQVNLCQlHRU5NQVNLKDcsIDQpCiAKIC8qCiAgKiBTS0wgRFNQIGRyaXZlciBtb2RlbGxpbmcgdXNlcyBvbmx5IGZldyBEQVBNIHdpZGdldHMgc28gZm9yIHJlc3Qgd2Ugd2lsbApAQCAtNDczLDYgKzQ3NiwxNCBAQAogCQl3ID0gd19tb2R1bGUtPnc7CiAJCW1jb25maWcgPSB3LT5wcml2OwogCisJCS8qIGNoZWNrIGlmIG1vZHVsZSBpZHMgYXJlIHBvcHVsYXRlZCAqLworCQlpZiAobWNvbmZpZy0+aWQubW9kdWxlX2lkIDwgMCkgeworCQkJZGV2X2Vycihza2wtPnNrbF9zc3QtPmRldiwKKwkJCQkJIm1vZHVsZSAlcFVMIGlkIG5vdCBwb3B1bGF0ZWRcbiIsCisJCQkJCSh1dWlkX2xlICopbWNvbmZpZy0+Z3VpZCk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCiAJCS8qIGNoZWNrIHJlc291cmNlIGF2YWlsYWJsZSAqLwogCQlpZiAoIXNrbF9pc19waXBlX21jcHNfYXZhaWwoc2tsLCBtY29uZmlnKSkKIAkJCXJldHVybiAtRU5PTUVNOwpAQCAtNDk0LDEyICs1MDUsMTUgQEAKIAkJICogRkUvQkUgcGFyYW1zCiAJCSAqLwogCQlza2xfdHBsZ191cGRhdGVfbW9kdWxlX3BhcmFtcyh3LCBjdHgpOwotCisJCW1jb25maWctPmlkLnB2dF9pZCA9IHNrbF9nZXRfcHZ0X2lkKGN0eCwgbWNvbmZpZyk7CisJCWlmIChtY29uZmlnLT5pZC5wdnRfaWQgPCAwKQorCQkJcmV0dXJuIHJldDsKIAkJc2tsX3RwbGdfc2V0X21vZHVsZV9pbml0X2RhdGEodyk7CiAJCXJldCA9IHNrbF9pbml0X21vZHVsZShjdHgsIG1jb25maWcpOwotCQlpZiAocmV0IDwgMCkKKwkJaWYgKHJldCA8IDApIHsKKwkJCXNrbF9wdXRfcHZ0X2lkKGN0eCwgbWNvbmZpZyk7CiAJCQlyZXR1cm4gcmV0OwotCisJCX0KIAkJc2tsX3RwbGdfYWxsb2NfcGlwZV9tY3BzKHNrbCwgbWNvbmZpZyk7CiAJCXJldCA9IHNrbF90cGxnX3NldF9tb2R1bGVfcGFyYW1zKHcsIGN0eCk7CiAJCWlmIChyZXQgPCAwKQpAQCAtNTEyLDYgKzUyNiw3IEBACiBzdGF0aWMgaW50IHNrbF90cGxnX3VubG9hZF9waXBlX21vZHVsZXMoc3RydWN0IHNrbF9zc3QgKmN0eCwKIAkgc3RydWN0IHNrbF9waXBlICpwaXBlKQogeworCWludCByZXQ7CiAJc3RydWN0IHNrbF9waXBlX21vZHVsZSAqd19tb2R1bGUgPSBOVUxMOwogCXN0cnVjdCBza2xfbW9kdWxlX2NmZyAqbWNvbmZpZyA9IE5VTEw7CiAKQEAgLTUxOSw5ICs1MzQsMTMgQEAKIAkJbWNvbmZpZyAgPSB3X21vZHVsZS0+dy0+cHJpdjsKIAogCQlpZiAobWNvbmZpZy0+aXNfbG9hZGFibGUgJiYgY3R4LT5kc3AtPmZ3X29wcy51bmxvYWRfbW9kICYmCi0JCQltY29uZmlnLT5tX3N0YXRlID4gU0tMX01PRFVMRV9VTklOSVQpCi0JCQlyZXR1cm4gY3R4LT5kc3AtPmZ3X29wcy51bmxvYWRfbW9kKGN0eC0+ZHNwLAorCQkJbWNvbmZpZy0+bV9zdGF0ZSA+IFNLTF9NT0RVTEVfVU5JTklUKSB7CisJCQlyZXQgPSBjdHgtPmRzcC0+Zndfb3BzLnVubG9hZF9tb2QoY3R4LT5kc3AsCiAJCQkJCQltY29uZmlnLT5pZC5tb2R1bGVfaWQpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJc2tsX3B1dF9wdnRfaWQoY3R4LCBtY29uZmlnKTsKIAl9CiAKIAkvKiBubyBtb2R1bGVzIHRvIHVubG9hZCBpbiB0aGlzIHBhdGgsIHNvIHJldHVybiAqLwpAQCAtNTg4LDYgKzYwNywyNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHNrbF9maWxsX3NpbmtfaW5zdGFuY2VfaWQoc3RydWN0IHNrbF9zc3QgKmN0eCwKKwkJCQlzdHJ1Y3Qgc2tsX2FsZ29fZGF0YSAqYWxnX2RhdGEpCit7CisJc3RydWN0IHNrbF9rcGJfcGFyYW1zICpwYXJhbXMgPSAoc3RydWN0IHNrbF9rcGJfcGFyYW1zICopYWxnX2RhdGEtPnBhcmFtczsKKwlzdHJ1Y3Qgc2tsX21vZF9pbnN0X21hcCAqaW5zdDsKKwlpbnQgaSwgcHZ0X2lkOworCisJaW5zdCA9IHBhcmFtcy0+bWFwOworCisJZm9yIChpID0gMDsgaSA8IHBhcmFtcy0+bnVtX21vZHVsZXM7IGkrKykgeworCQlwdnRfaWQgPSBza2xfZ2V0X3B2dF9pbnN0YW5jZV9pZF9tYXAoY3R4LAorCQkJCQlpbnN0LT5tb2RfaWQsIGluc3QtPmluc3RfaWQpOworCQlpZiAocHZ0X2lkIDwgMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpbnN0LT5pbnN0X2lkID0gcHZ0X2lkOworCQlpbnN0Kys7CisJfQorCXJldHVybiAwOworfQorCiAvKgogICogU29tZSBtb2R1bGVzIHJlcXVpcmUgcGFyYW1zIHRvIGJlIHNldCBhZnRlciB0aGUgbW9kdWxlIGlzIGJvdW5kIHRvCiAgKiBhbGwgcGlucyBjb25uZWN0ZWQuCkBAIC02MzYsNiArNjc1LDggQEAKIAkJCWJjID0gKHN0cnVjdCBza2xfYWxnb19kYXRhICopc2ItPmRvYmoucHJpdmF0ZTsKIAogCQkJaWYgKGJjLT5zZXRfcGFyYW1zID09IFNLTF9QQVJBTV9CSU5EKSB7CisJCQkJaWYgKG1jb25maWctPm1fdHlwZSA9PSBTS0xfTU9EVUxFX1RZUEVfS1BCKQorCQkJCQlza2xfZmlsbF9zaW5rX2luc3RhbmNlX2lkKGN0eCwgYmMpOwogCQkJCXJldCA9IHNrbF9zZXRfbW9kdWxlX3BhcmFtcyhjdHgsCiAJCQkJCQkodTMyICopYmMtPnBhcmFtcywgYmMtPm1heCwKIAkJCQkJCWJjLT5wYXJhbV9pZCwgbWNvbmZpZyk7CkBAIC0xNDYwLDg1ICsxNTAxLDU3MCBAQAogCQkJCQlza2xfdHBsZ190bHZfY29udHJvbF9zZXR9LAogfTsKIAotLyoKLSAqIFRoZSB0b3BvbG9neSBiaW5hcnkgcGFzc2VzIHRoZSBwaW4gaW5mbyBmb3IgYSBtb2R1bGUgc28gaW5pdGlhbGl6ZSB0aGUgcGluCi0gKiBpbmZvIHBhc3NlZCBpbnRvIG1vZHVsZSBpbnN0YW5jZQotICovCi1zdGF0aWMgdm9pZCBza2xfZmlsbF9tb2R1bGVfcGluX2luZm8oc3RydWN0IHNrbF9kZndfbW9kdWxlX3BpbiAqZGZ3X3BpbiwKLQkJCQkJCXN0cnVjdCBza2xfbW9kdWxlX3BpbiAqbV9waW4sCi0JCQkJCQlib29sIGlzX2R5bmFtaWMsIGludCBtYXhfcGluKQorc3RhdGljIGludCBza2xfdHBsZ19maWxsX3BpcGVfdGtuKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBza2xfcGlwZSAqcGlwZSwgdTMyIHRrbiwKKwkJCXUzMiB0a25fdmFsKQogewotCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IG1heF9waW47IGkrKykgewotCQltX3BpbltpXS5pZC5tb2R1bGVfaWQgPSBkZndfcGluW2ldLm1vZHVsZV9pZDsKLQkJbV9waW5baV0uaWQuaW5zdGFuY2VfaWQgPSBkZndfcGluW2ldLmluc3RhbmNlX2lkOwotCQltX3BpbltpXS5pbl91c2UgPSBmYWxzZTsKLQkJbV9waW5baV0uaXNfZHluYW1pYyA9IGlzX2R5bmFtaWM7Ci0JCW1fcGluW2ldLnBpbl9zdGF0ZSA9IFNLTF9QSU5fVU5CSU5EOworCXN3aXRjaCAodGtuKSB7CisJY2FzZSBTS0xfVEtOX1UzMl9QSVBFX0NPTk5fVFlQRToKKwkJcGlwZS0+Y29ubl90eXBlID0gdGtuX3ZhbDsKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVTMyX1BJUEVfUFJJT1JJVFk6CisJCXBpcGUtPnBpcGVfcHJpb3JpdHkgPSB0a25fdmFsOworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VMzJfUElQRV9NRU1fUEdTOgorCQlwaXBlLT5tZW1vcnlfcGFnZXMgPSB0a25fdmFsOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGV2LCAiVG9rZW4gbm90IGhhbmRsZWQgJWRcbiIsIHRrbik7CisJCXJldHVybiAtRUlOVkFMOwogCX0KKworCXJldHVybiAwOwogfQogCiAvKgotICogQWRkIHBpcGVsaW5lIGZyb20gdG9wb2xvZ3kgYmluYXJ5IGludG8gZHJpdmVyIHBpcGVsaW5lIGxpc3QKLSAqCi0gKiBJZiBhbHJlYWR5IGFkZGVkIHdlIHJldHVybiB0aGF0IGluc3RhbmNlCi0gKiBPdGhlcndpc2Ugd2UgY3JlYXRlIGEgbmV3IGluc3RhbmNlIGFuZCBhZGQgaW50byBkcml2ZXIgbGlzdAorICogQWRkIHBpcGVsaW5lIGJ5IHBhcnNpbmcgdGhlIHJlbGV2YW50IHRva2VucworICogUmV0dXJuIGFuIGV4aXN0aW5nIHBpcGUgaWYgdGhlIHBpcGUgYWxyZWFkeSBleGlzdHMuCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgc2tsX3BpcGUgKnNrbF90cGxnX2FkZF9waXBlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCXN0cnVjdCBza2wgKnNrbCwgc3RydWN0IHNrbF9kZndfcGlwZSAqZGZ3X3BpcGUpCitzdGF0aWMgaW50IHNrbF90cGxnX2FkZF9waXBlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IHNrbF9tb2R1bGVfY2ZnICptY29uZmlnLCBzdHJ1Y3Qgc2tsICpza2wsCisJCXN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX3ZhbHVlX2VsZW0gKnRrbl9lbGVtKQogewogCXN0cnVjdCBza2xfcGlwZWxpbmUgKnBwbDsKIAlzdHJ1Y3Qgc2tsX3BpcGUgKnBpcGU7CiAJc3RydWN0IHNrbF9waXBlX3BhcmFtcyAqcGFyYW1zOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwcGwsICZza2wtPnBwbF9saXN0LCBub2RlKSB7Ci0JCWlmIChwcGwtPnBpcGUtPnBwbF9pZCA9PSBkZndfcGlwZS0+cGlwZV9pZCkKLQkJCXJldHVybiBwcGwtPnBpcGU7CisJCWlmIChwcGwtPnBpcGUtPnBwbF9pZCA9PSB0a25fZWxlbS0+dmFsdWUpIHsKKwkJCW1jb25maWctPnBpcGUgPSBwcGwtPnBpcGU7CisJCQlyZXR1cm4gRUVYSVNUOworCQl9CiAJfQogCiAJcHBsID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwcGwpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBwbCkKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiAtRU5PTUVNOwogCiAJcGlwZSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcGlwZSksIEdGUF9LRVJORUwpOwogCWlmICghcGlwZSkKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiAtRU5PTUVNOwogCiAJcGFyYW1zID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwYXJhbXMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBhcmFtcykKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiAtRU5PTUVNOwogCi0JcGlwZS0+cHBsX2lkID0gZGZ3X3BpcGUtPnBpcGVfaWQ7Ci0JcGlwZS0+bWVtb3J5X3BhZ2VzID0gZGZ3X3BpcGUtPm1lbW9yeV9wYWdlczsKLQlwaXBlLT5waXBlX3ByaW9yaXR5ID0gZGZ3X3BpcGUtPnBpcGVfcHJpb3JpdHk7Ci0JcGlwZS0+Y29ubl90eXBlID0gZGZ3X3BpcGUtPmNvbm5fdHlwZTsKLQlwaXBlLT5zdGF0ZSA9IFNLTF9QSVBFX0lOVkFMSUQ7CiAJcGlwZS0+cF9wYXJhbXMgPSBwYXJhbXM7CisJcGlwZS0+cHBsX2lkID0gdGtuX2VsZW0tPnZhbHVlOwogCUlOSVRfTElTVF9IRUFEKCZwaXBlLT53X2xpc3QpOwogCiAJcHBsLT5waXBlID0gcGlwZTsKIAlsaXN0X2FkZCgmcHBsLT5ub2RlLCAmc2tsLT5wcGxfbGlzdCk7CiAKLQlyZXR1cm4gcHBsLT5waXBlOworCW1jb25maWctPnBpcGUgPSBwaXBlOworCW1jb25maWctPnBpcGUtPnN0YXRlID0gU0tMX1BJUEVfSU5WQUxJRDsKKworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBza2xfdHBsZ19maWxsX2ZtdChzdHJ1Y3Qgc2tsX21vZHVsZV9mbXQgKmRzdF9mbXQsCi0JCQkJc3RydWN0IHNrbF9kZndfbW9kdWxlX2ZtdCAqc3JjX2ZtdCwKLQkJCQlpbnQgcGlucykKK3N0YXRpYyBpbnQgc2tsX3RwbGdfZmlsbF9waW4oc3RydWN0IGRldmljZSAqZGV2LCB1MzIgdGtuLAorCQkJc3RydWN0IHNrbF9tb2R1bGVfcGluICptX3BpbiwKKwkJCWludCBwaW5faW5kZXgsIHUzMiB2YWx1ZSkKK3sKKwlzd2l0Y2ggKHRrbikgeworCWNhc2UgU0tMX1RLTl9VMzJfUElOX01PRF9JRDoKKwkJbV9waW5bcGluX2luZGV4XS5pZC5tb2R1bGVfaWQgPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVTMyX1BJTl9JTlNUX0lEOgorCQltX3BpbltwaW5faW5kZXhdLmlkLmluc3RhbmNlX2lkID0gdmFsdWU7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICIlZCBOb3QgYSBwaW4gdG9rZW5cbiIsIHZhbHVlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQYXJzZSBmb3IgcGluIGNvbmZpZyBzcGVjaWZpYyB0b2tlbnMgdG8gZmlsbCB1cCB0aGUKKyAqIG1vZHVsZSBwcml2YXRlIGRhdGEKKyAqLworc3RhdGljIGludCBza2xfdHBsZ19maWxsX3BpbnNfaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBza2xfbW9kdWxlX2NmZyAqbWNvbmZpZywKKwkJc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3JfdmFsdWVfZWxlbSAqdGtuX2VsZW0sCisJCWludCBkaXIsIGludCBwaW5fY291bnQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc2tsX21vZHVsZV9waW4gKm1fcGluOworCisJc3dpdGNoIChkaXIpIHsKKwljYXNlIFNLTF9ESVJfSU46CisJCW1fcGluID0gbWNvbmZpZy0+bV9pbl9waW47CisJCWJyZWFrOworCisJY2FzZSBTS0xfRElSX09VVDoKKwkJbV9waW4gPSBtY29uZmlnLT5tX291dF9waW47CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICJJbnZhbGlkIGRpcmVjdGlvbiB2YWx1ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IHNrbF90cGxnX2ZpbGxfcGluKGRldiwgdGtuX2VsZW0tPnRva2VuLAorCQkJbV9waW4sIHBpbl9jb3VudCwgdGtuX2VsZW0tPnZhbHVlKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJbV9waW5bcGluX2NvdW50XS5pbl91c2UgPSBmYWxzZTsKKwltX3BpbltwaW5fY291bnRdLnBpbl9zdGF0ZSA9IFNLTF9QSU5fVU5CSU5EOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGaWxsIHVwIGlucHV0L291dHB1dCBtb2R1bGUgY29uZmlnIGZvcm1hdCBiYXNlZAorICogb24gdGhlIGRpcmVjdGlvbgorICovCitzdGF0aWMgaW50IHNrbF90cGxnX2ZpbGxfZm10KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IHNrbF9tb2R1bGVfY2ZnICptY29uZmlnLAl1MzIgdGtuLAorCQl1MzIgdmFsdWUsIHUzMiBkaXIsIHUzMiBwaW5fY291bnQpCit7CisJc3RydWN0IHNrbF9tb2R1bGVfZm10ICpkc3RfZm10OworCisJc3dpdGNoIChkaXIpIHsKKwljYXNlIFNLTF9ESVJfSU46CisJCWRzdF9mbXQgPSBtY29uZmlnLT5pbl9mbXQ7CisJCWRzdF9mbXQgKz0gcGluX2NvdW50OworCQlicmVhazsKKworCWNhc2UgU0tMX0RJUl9PVVQ6CisJCWRzdF9mbXQgPSBtY29uZmlnLT5vdXRfZm10OworCQlkc3RfZm10ICs9IHBpbl9jb3VudDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgIkludmFsaWQgZGlyZWN0aW9uIHZhbHVlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoICh0a24pIHsKKwljYXNlIFNLTF9US05fVTMyX0ZNVF9DSDoKKwkJZHN0X2ZtdC0+Y2hhbm5lbHMgID0gdmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1UzMl9GTVRfRlJFUToKKwkJZHN0X2ZtdC0+c19mcmVxID0gdmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1UzMl9GTVRfQklUX0RFUFRIOgorCQlkc3RfZm10LT5iaXRfZGVwdGggPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVTMyX0ZNVF9TQU1QTEVfU0laRToKKwkJZHN0X2ZtdC0+dmFsaWRfYml0X2RlcHRoID0gdmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1UzMl9GTVRfQ0hfQ09ORklHOgorCQlkc3RfZm10LT5jaF9jZmcgPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVTMyX0ZNVF9JTlRFUkxFQVZFOgorCQlkc3RfZm10LT5pbnRlcmxlYXZpbmdfc3R5bGUgPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVTMyX0ZNVF9TQU1QTEVfVFlQRToKKwkJZHN0X2ZtdC0+c2FtcGxlX3R5cGUgPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVTMyX0ZNVF9DSF9NQVA6CisJCWRzdF9mbXQtPmNoX21hcCA9IHZhbHVlOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGV2LCAiSW52YWxpZCB0b2tlbiAlZFxuIiwgdGtuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2tsX3RwbGdfZ2V0X3V1aWQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2tsX21vZHVsZV9jZmcgKm1jb25maWcsCisJICAgICAgc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3JfdXVpZF9lbGVtICp1dWlkX3RrbikKK3sKKwlpZiAodXVpZF90a24tPnRva2VuID09IFNLTF9US05fVVVJRCkKKwkJbWVtY3B5KCZtY29uZmlnLT5ndWlkLCAmdXVpZF90a24tPnV1aWQsIDE2KTsKKwllbHNlIHsKKwkJZGV2X2VycihkZXYsICJOb3QgYW4gVVVJRCB0b2tlbiB0a24gJWRcbiIsIHV1aWRfdGtuLT50b2tlbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBza2xfdHBsZ19maWxsX3Bpbl9keW5hbWljX3ZhbCgKKwkJc3RydWN0IHNrbF9tb2R1bGVfcGluICptcGluLCB1MzIgcGluX2NvdW50LCB1MzIgdmFsdWUpCiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgcGluczsgaSsrKSB7Ci0JCWRzdF9mbXRbaV0uY2hhbm5lbHMgID0gc3JjX2ZtdFtpXS5jaGFubmVsczsKLQkJZHN0X2ZtdFtpXS5zX2ZyZXEgPSBzcmNfZm10W2ldLmZyZXE7Ci0JCWRzdF9mbXRbaV0uYml0X2RlcHRoID0gc3JjX2ZtdFtpXS5iaXRfZGVwdGg7Ci0JCWRzdF9mbXRbaV0udmFsaWRfYml0X2RlcHRoID0gc3JjX2ZtdFtpXS52YWxpZF9iaXRfZGVwdGg7Ci0JCWRzdF9mbXRbaV0uY2hfY2ZnID0gc3JjX2ZtdFtpXS5jaF9jZmc7Ci0JCWRzdF9mbXRbaV0uY2hfbWFwID0gc3JjX2ZtdFtpXS5jaF9tYXA7Ci0JCWRzdF9mbXRbaV0uaW50ZXJsZWF2aW5nX3N0eWxlID0gc3JjX2ZtdFtpXS5pbnRlcmxlYXZpbmdfc3R5bGU7Ci0JCWRzdF9mbXRbaV0uc2FtcGxlX3R5cGUgPSBzcmNfZm10W2ldLnNhbXBsZV90eXBlOworCWZvciAoaSA9IDA7IGkgPCBwaW5fY291bnQ7IGkrKykKKwkJbXBpbltpXS5pc19keW5hbWljID0gdmFsdWU7Cit9CisKKy8qCisgKiBQYXJzZSB0b2tlbnMgdG8gZmlsbCB1cCB0aGUgbW9kdWxlIHByaXZhdGUgZGF0YQorICovCitzdGF0aWMgaW50IHNrbF90cGxnX2dldF90b2tlbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX3ZhbHVlX2VsZW0gKnRrbl9lbGVtLAorCQlzdHJ1Y3Qgc2tsICpza2wsIHN0cnVjdCBza2xfbW9kdWxlX2NmZyAqbWNvbmZpZykKK3sKKwlpbnQgdGtuX2NvdW50ID0gMDsKKwlpbnQgcmV0OworCXN0YXRpYyBpbnQgaXNfcGlwZV9leGlzdHM7CisJc3RhdGljIGludCBwaW5faW5kZXgsIGRpcjsKKworCWlmICh0a25fZWxlbS0+dG9rZW4gPiBTS0xfVEtOX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKHRrbl9lbGVtLT50b2tlbikgeworCWNhc2UgU0tMX1RLTl9VOF9JTl9RVUVVRV9DT1VOVDoKKwkJbWNvbmZpZy0+bWF4X2luX3F1ZXVlID0gdGtuX2VsZW0tPnZhbHVlOworCQltY29uZmlnLT5tX2luX3BpbiA9IGRldm1fa3phbGxvYyhkZXYsIG1jb25maWctPm1heF9pbl9xdWV1ZSAqCisJCQkJCXNpemVvZigqbWNvbmZpZy0+bV9pbl9waW4pLAorCQkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKCFtY29uZmlnLT5tX2luX3BpbikKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1U4X09VVF9RVUVVRV9DT1VOVDoKKwkJbWNvbmZpZy0+bWF4X291dF9xdWV1ZSA9IHRrbl9lbGVtLT52YWx1ZTsKKwkJbWNvbmZpZy0+bV9vdXRfcGluID0gZGV2bV9remFsbG9jKGRldiwgbWNvbmZpZy0+bWF4X291dF9xdWV1ZSAqCisJCQkJCXNpemVvZigqbWNvbmZpZy0+bV9vdXRfcGluKSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisKKwkJaWYgKCFtY29uZmlnLT5tX291dF9waW4pCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VOF9EWU5fSU5fUElOOgorCQlpZiAoIW1jb25maWctPm1faW5fcGluKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJc2tsX3RwbGdfZmlsbF9waW5fZHluYW1pY192YWwobWNvbmZpZy0+bV9pbl9waW4sCisJCQltY29uZmlnLT5tYXhfaW5fcXVldWUsIHRrbl9lbGVtLT52YWx1ZSk7CisKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVThfRFlOX09VVF9QSU46CisJCWlmICghbWNvbmZpZy0+bV9vdXRfcGluKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJc2tsX3RwbGdfZmlsbF9waW5fZHluYW1pY192YWwobWNvbmZpZy0+bV9vdXRfcGluLAorCQkJbWNvbmZpZy0+bWF4X291dF9xdWV1ZSwgdGtuX2VsZW0tPnZhbHVlKTsKKworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VOF9USU1FX1NMT1Q6CisJCW1jb25maWctPnRpbWVfc2xvdCA9IHRrbl9lbGVtLT52YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVThfQ09SRV9JRDoKKwkJbWNvbmZpZy0+Y29yZV9pZCA9IHRrbl9lbGVtLT52YWx1ZTsKKworCWNhc2UgU0tMX1RLTl9VOF9NT0RfVFlQRToKKwkJbWNvbmZpZy0+bV90eXBlID0gdGtuX2VsZW0tPnZhbHVlOworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VOF9ERVZfVFlQRToKKwkJbWNvbmZpZy0+ZGV2X3R5cGUgPSB0a25fZWxlbS0+dmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1U4X0hXX0NPTk5fVFlQRToKKwkJbWNvbmZpZy0+aHdfY29ubl90eXBlID0gdGtuX2VsZW0tPnZhbHVlOworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VMTZfTU9EX0lOU1RfSUQ6CisJCW1jb25maWctPmlkLmluc3RhbmNlX2lkID0KKwkJdGtuX2VsZW0tPnZhbHVlOworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VMzJfTUVNX1BBR0VTOgorCQltY29uZmlnLT5tZW1fcGFnZXMgPSB0a25fZWxlbS0+dmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1UzMl9NQVhfTUNQUzoKKwkJbWNvbmZpZy0+bWNwcyA9IHRrbl9lbGVtLT52YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVTMyX09CUzoKKwkJbWNvbmZpZy0+b2JzID0gdGtuX2VsZW0tPnZhbHVlOworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VMzJfSUJTOgorCQltY29uZmlnLT5pYnMgPSB0a25fZWxlbS0+dmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1UzMl9WQlVTX0lEOgorCQltY29uZmlnLT52YnVzX2lkID0gdGtuX2VsZW0tPnZhbHVlOworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VMzJfUEFSQU1TX0ZJWFVQOgorCQltY29uZmlnLT5wYXJhbXNfZml4dXAgPSB0a25fZWxlbS0+dmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1UzMl9DT05WRVJURVI6CisJCW1jb25maWctPmNvbnZlcnRlciA9IHRrbl9lbGVtLT52YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVTMyX1BJUEVfSUQ6CisJCXJldCA9IHNrbF90cGxnX2FkZF9waXBlKGRldiwKKwkJCQltY29uZmlnLCBza2wsIHRrbl9lbGVtKTsKKworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiBpc19waXBlX2V4aXN0czsKKworCQlpZiAocmV0ID09IEVFWElTVCkKKwkJCWlzX3BpcGVfZXhpc3RzID0gMTsKKworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VMzJfUElQRV9DT05OX1RZUEU6CisJY2FzZSBTS0xfVEtOX1UzMl9QSVBFX1BSSU9SSVRZOgorCWNhc2UgU0tMX1RLTl9VMzJfUElQRV9NRU1fUEdTOgorCQlpZiAoaXNfcGlwZV9leGlzdHMpIHsKKwkJCXJldCA9IHNrbF90cGxnX2ZpbGxfcGlwZV90a24oZGV2LCBtY29uZmlnLT5waXBlLAorCQkJCQl0a25fZWxlbS0+dG9rZW4sIHRrbl9lbGVtLT52YWx1ZSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJYnJlYWs7CisKKwkvKgorCSAqIFNLTF9US05fVTMyX0RJUl9QSU5fQ09VTlQgdG9rZW4gaGFzIHRoZSB2YWx1ZSBmb3IgYm90aAorCSAqIGRpcmVjdGlvbiBhbmQgdGhlIHBpbiBjb3VudC4gVGhlIGZpcnN0IGZvdXIgYml0cyByZXByZXNlbnQKKwkgKiBkaXJlY3Rpb24gYW5kIG5leHQgZm91ciB0aGUgcGluIGNvdW50LgorCSAqLworCWNhc2UgU0tMX1RLTl9VMzJfRElSX1BJTl9DT1VOVDoKKwkJZGlyID0gdGtuX2VsZW0tPnZhbHVlICYgU0tMX0lOX0RJUl9CSVRfTUFTSzsKKwkJcGluX2luZGV4ID0gKHRrbl9lbGVtLT52YWx1ZSAmCisJCQlTS0xfUElOX0NPVU5UX01BU0spID4+IDQ7CisKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVTMyX0ZNVF9DSDoKKwljYXNlIFNLTF9US05fVTMyX0ZNVF9GUkVROgorCWNhc2UgU0tMX1RLTl9VMzJfRk1UX0JJVF9ERVBUSDoKKwljYXNlIFNLTF9US05fVTMyX0ZNVF9TQU1QTEVfU0laRToKKwljYXNlIFNLTF9US05fVTMyX0ZNVF9DSF9DT05GSUc6CisJY2FzZSBTS0xfVEtOX1UzMl9GTVRfSU5URVJMRUFWRToKKwljYXNlIFNLTF9US05fVTMyX0ZNVF9TQU1QTEVfVFlQRToKKwljYXNlIFNLTF9US05fVTMyX0ZNVF9DSF9NQVA6CisJCXJldCA9IHNrbF90cGxnX2ZpbGxfZm10KGRldiwgbWNvbmZpZywgdGtuX2VsZW0tPnRva2VuLAorCQkJCXRrbl9lbGVtLT52YWx1ZSwgZGlyLCBwaW5faW5kZXgpOworCisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VMzJfUElOX01PRF9JRDoKKwljYXNlIFNLTF9US05fVTMyX1BJTl9JTlNUX0lEOgorCQlyZXQgPSBza2xfdHBsZ19maWxsX3BpbnNfaW5mbyhkZXYsCisJCQkJbWNvbmZpZywgdGtuX2VsZW0sIGRpciwKKwkJCQlwaW5faW5kZXgpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVTMyX0NBUFNfU0laRToKKwkJbWNvbmZpZy0+Zm9ybWF0c19jb25maWcuY2Fwc19zaXplID0KKwkJCXRrbl9lbGVtLT52YWx1ZTsKKworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VMzJfUFJPQ19ET01BSU46CisJCW1jb25maWctPmRvbWFpbiA9CisJCQl0a25fZWxlbS0+dmFsdWU7CisKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVThfSU5fUElOX1RZUEU6CisJY2FzZSBTS0xfVEtOX1U4X09VVF9QSU5fVFlQRToKKwljYXNlIFNLTF9US05fVThfQ09OTl9UWVBFOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGV2LCAiVG9rZW4gJWQgbm90IGhhbmRsZWRcbiIsCisJCQkJdGtuX2VsZW0tPnRva2VuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCisJdGtuX2NvdW50Kys7CisKKwlyZXR1cm4gdGtuX2NvdW50OworfQorCisvKgorICogUGFyc2UgdGhlIHZlbmRvciBhcnJheSBmb3Igc3BlY2lmaWMgdG9rZW5zIHRvIGNvbnN0cnVjdAorICogbW9kdWxlIHByaXZhdGUgZGF0YQorICovCitzdGF0aWMgaW50IHNrbF90cGxnX2dldF90b2tlbnMoc3RydWN0IGRldmljZSAqZGV2LAorCQljaGFyICpwdnRfZGF0YSwJc3RydWN0IHNrbCAqc2tsLAorCQlzdHJ1Y3Qgc2tsX21vZHVsZV9jZmcgKm1jb25maWcsIGludCBibG9ja19zaXplKQoreworCXN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX2FycmF5ICphcnJheTsKKwlzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl92YWx1ZV9lbGVtICp0a25fZWxlbTsKKwlpbnQgdGtuX2NvdW50ID0gMCwgcmV0OworCWludCBvZmYgPSAwLCB0dXBsZV9zaXplID0gMDsKKworCWlmIChibG9ja19zaXplIDw9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJd2hpbGUgKHR1cGxlX3NpemUgPCBibG9ja19zaXplKSB7CisJCWFycmF5ID0gKHN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX2FycmF5ICopKHB2dF9kYXRhICsgb2ZmKTsKKworCQlvZmYgKz0gYXJyYXktPnNpemU7CisKKwkJc3dpdGNoIChhcnJheS0+dHlwZSkgeworCQljYXNlIFNORF9TT0NfVFBMR19UVVBMRV9UWVBFX1NUUklORzoKKwkJCWRldl93YXJuKGRldiwgIm5vIHN0cmluZyB0b2tlbnMgZXhwZWN0ZWQgZm9yIHNrbCB0cGxnXG4iKTsKKwkJCWNvbnRpbnVlOworCisJCWNhc2UgU05EX1NPQ19UUExHX1RVUExFX1RZUEVfVVVJRDoKKwkJCXJldCA9IHNrbF90cGxnX2dldF91dWlkKGRldiwgbWNvbmZpZywgYXJyYXktPnV1aWQpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKworCQkJdHVwbGVfc2l6ZSArPSBzaXplb2YoKmFycmF5LT51dWlkKTsKKworCQkJY29udGludWU7CisKKwkJZGVmYXVsdDoKKwkJCXRrbl9lbGVtID0gYXJyYXktPnZhbHVlOworCQkJdGtuX2NvdW50ID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJd2hpbGUgKHRrbl9jb3VudCA8PSAoYXJyYXktPm51bV9lbGVtcyAtIDEpKSB7CisJCQlyZXQgPSBza2xfdHBsZ19nZXRfdG9rZW4oZGV2LCB0a25fZWxlbSwKKwkJCQkJc2tsLCBtY29uZmlnKTsKKworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKworCQkJdGtuX2NvdW50ID0gdGtuX2NvdW50ICsgcmV0OworCQkJdGtuX2VsZW0rKzsKKwkJfQorCisJCXR1cGxlX3NpemUgKz0gdGtuX2NvdW50ICogc2l6ZW9mKCp0a25fZWxlbSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBFdmVyeSBkYXRhIGJsb2NrIGlzIHByZWNlZGVkIGJ5IGEgZGVzY3JpcHRvciB0byByZWFkIHRoZSBudW1iZXIKKyAqIG9mIGRhdGEgYmxvY2tzLCB0aGV5IHR5cGUgb2YgdGhlIGJsb2NrIGFuZCBpdCdzIHNpemUKKyAqLworc3RhdGljIGludCBza2xfdHBsZ19nZXRfZGVzY19ibG9ja3Moc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl9hcnJheSAqYXJyYXkpCit7CisJc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3JfdmFsdWVfZWxlbSAqdGtuX2VsZW07CisKKwl0a25fZWxlbSA9IGFycmF5LT52YWx1ZTsKKworCXN3aXRjaCAodGtuX2VsZW0tPnRva2VuKSB7CisJY2FzZSBTS0xfVEtOX1U4X05VTV9CTE9DS1M6CisJY2FzZSBTS0xfVEtOX1U4X0JMT0NLX1RZUEU6CisJY2FzZSBTS0xfVEtOX1UxNl9CTE9DS19TSVpFOgorCQlyZXR1cm4gdGtuX2VsZW0tPnZhbHVlOworCisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICJJbnZhbGlkIGRlc2NyaXB0b3IgdG9rZW4gJWRcbiIsIHRrbl9lbGVtLT50b2tlbik7CisJCWJyZWFrOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCisvKgorICogUGFyc2UgdGhlIHByaXZhdGUgZGF0YSBmb3IgdGhlIHRva2VuIGFuZCBjb3JyZXNwb25kaW5nIHZhbHVlLgorICogVGhlIHByaXZhdGUgZGF0YSBjYW4gaGF2ZSBtdWx0aXBsZSBkYXRhIGJsb2Nrcy4gU28sIGEgZGF0YSBibG9jaworICogaXMgcHJlY2VkZWQgYnkgYSBkZXNjcmlwdG9yIGZvciBudW1iZXIgb2YgYmxvY2tzIGFuZCBhIGRlc2NyaXB0b3IKKyAqIGZvciB0aGUgdHlwZSBhbmQgc2l6ZSBvZiB0aGUgc3VjZWVkaW5nIGRhdGEgYmxvY2suCisgKi8KK3N0YXRpYyBpbnQgc2tsX3RwbGdfZ2V0X3B2dF9kYXRhKHN0cnVjdCBzbmRfc29jX3RwbGdfZGFwbV93aWRnZXQgKnRwbGdfdywKKwkJCQlzdHJ1Y3Qgc2tsICpza2wsIHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3Qgc2tsX21vZHVsZV9jZmcgKm1jb25maWcpCit7CisJc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3JfYXJyYXkgKmFycmF5OworCWludCBudW1fYmxvY2tzLCBibG9ja19zaXplID0gMCwgYmxvY2tfdHlwZSwgb2ZmID0gMDsKKwljaGFyICpkYXRhOworCWludCByZXQ7CisKKwkvKiBSZWFkIHRoZSBOVU1fREFUQV9CTE9DS1MgZGVzY3JpcHRvciAqLworCWFycmF5ID0gKHN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX2FycmF5ICopdHBsZ193LT5wcml2LmRhdGE7CisJcmV0ID0gc2tsX3RwbGdfZ2V0X2Rlc2NfYmxvY2tzKGRldiwgYXJyYXkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCW51bV9ibG9ja3MgPSByZXQ7CisKKwlvZmYgKz0gYXJyYXktPnNpemU7CisJYXJyYXkgPSAoc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3JfYXJyYXkgKikodHBsZ193LT5wcml2LmRhdGEgKyBvZmYpOworCisJLyogUmVhZCB0aGUgQkxPQ0tfVFlQRSBhbmQgQkxPQ0tfU0laRSBkZXNjcmlwdG9yICovCisJd2hpbGUgKG51bV9ibG9ja3MgPiAwKSB7CisJCXJldCA9IHNrbF90cGxnX2dldF9kZXNjX2Jsb2NrcyhkZXYsIGFycmF5KTsKKworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCWJsb2NrX3R5cGUgPSByZXQ7CisJCW9mZiArPSBhcnJheS0+c2l6ZTsKKworCQlhcnJheSA9IChzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl9hcnJheSAqKQorCQkJKHRwbGdfdy0+cHJpdi5kYXRhICsgb2ZmKTsKKworCQlyZXQgPSBza2xfdHBsZ19nZXRfZGVzY19ibG9ja3MoZGV2LCBhcnJheSk7CisKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlibG9ja19zaXplID0gcmV0OworCQlvZmYgKz0gYXJyYXktPnNpemU7CisKKwkJYXJyYXkgPSAoc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3JfYXJyYXkgKikKKwkJCSh0cGxnX3ctPnByaXYuZGF0YSArIG9mZik7CisKKwkJZGF0YSA9ICh0cGxnX3ctPnByaXYuZGF0YSArIG9mZik7CisKKwkJaWYgKGJsb2NrX3R5cGUgPT0gU0tMX1RZUEVfVFVQTEUpIHsKKwkJCXJldCA9IHNrbF90cGxnX2dldF90b2tlbnMoZGV2LCBkYXRhLAorCQkJCQlza2wsIG1jb25maWcsIGJsb2NrX3NpemUpOworCisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCisJCQktLW51bV9ibG9ja3M7CisJCX0gZWxzZSB7CisJCQlpZiAobWNvbmZpZy0+Zm9ybWF0c19jb25maWcuY2Fwc19zaXplID4gMCkKKwkJCQltZW1jcHkobWNvbmZpZy0+Zm9ybWF0c19jb25maWcuY2FwcywgZGF0YSwKKwkJCQkJbWNvbmZpZy0+Zm9ybWF0c19jb25maWcuY2Fwc19zaXplKTsKKwkJCS0tbnVtX2Jsb2NrczsKKwkJfQorCX0KKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBza2xfY2xlYXJfcGluX2NvbmZpZyhzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0sCkBAIC0xNjA2LDkgKzIxMzIsNiBAQAogCXN0cnVjdCBza2wgKnNrbCA9IGVidXNfdG9fc2tsKGVidXMpOwogCXN0cnVjdCBoZGFjX2J1cyAqYnVzID0gZWJ1c190b19oYnVzKGVidXMpOwogCXN0cnVjdCBza2xfbW9kdWxlX2NmZyAqbWNvbmZpZzsKLQlzdHJ1Y3Qgc2tsX3BpcGUgKnBpcGU7Ci0Jc3RydWN0IHNrbF9kZndfbW9kdWxlICpkZndfY29uZmlnID0KLQkJCQkoc3RydWN0IHNrbF9kZndfbW9kdWxlICopdHBsZ193LT5wcml2LmRhdGE7CiAKIAlpZiAoIXRwbGdfdy0+cHJpdi5zaXplKQogCQlnb3RvIGJpbmRfZXZlbnQ7CkBAIC0xNjE5LDc2ICsyMTQyLDE3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJdy0+cHJpdiA9IG1jb25maWc7Ci0JbWVtY3B5KCZtY29uZmlnLT5ndWlkLCAmZGZ3X2NvbmZpZy0+dXVpZCwgMTYpOwogCi0JcmV0ID0gc25kX3NrbF9nZXRfbW9kdWxlX2luZm8oc2tsLT5za2xfc3N0LCBtY29uZmlnLT5ndWlkLCBkZndfY29uZmlnKTsKKwkvKgorCSAqIG1vZHVsZSBiaW5hcnkgY2FuIGJlIGxvYWRlZCBsYXRlciwgc28gc2V0IGl0IHRvIHF1ZXJ5IHdoZW4KKwkgKiBtb2R1bGUgaXMgbG9hZCBmb3IgYSB1c2UgY2FzZQorCSAqLworCW1jb25maWctPmlkLm1vZHVsZV9pZCA9IC0xOworCisJLyogUGFyc2UgcHJpdmF0ZSBkYXRhIGZvciB0dXBsZXMgKi8KKwlyZXQgPSBza2xfdHBsZ19nZXRfcHZ0X2RhdGEodHBsZ193LCBza2wsIGJ1cy0+ZGV2LCBtY29uZmlnKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKLQotCW1jb25maWctPmlkLm1vZHVsZV9pZCA9IGRmd19jb25maWctPm1vZHVsZV9pZDsKLQltY29uZmlnLT5pZC5pbnN0YW5jZV9pZCA9IGRmd19jb25maWctPmluc3RhbmNlX2lkOwotCW1jb25maWctPm1jcHMgPSBkZndfY29uZmlnLT5tYXhfbWNwczsKLQltY29uZmlnLT5pYnMgPSBkZndfY29uZmlnLT5pYnM7Ci0JbWNvbmZpZy0+b2JzID0gZGZ3X2NvbmZpZy0+b2JzOwotCW1jb25maWctPmNvcmVfaWQgPSBkZndfY29uZmlnLT5jb3JlX2lkOwotCW1jb25maWctPm1heF9pbl9xdWV1ZSA9IGRmd19jb25maWctPm1heF9pbl9xdWV1ZTsKLQltY29uZmlnLT5tYXhfb3V0X3F1ZXVlID0gZGZ3X2NvbmZpZy0+bWF4X291dF9xdWV1ZTsKLQltY29uZmlnLT5pc19sb2FkYWJsZSA9IGRmd19jb25maWctPmlzX2xvYWRhYmxlOwotCXNrbF90cGxnX2ZpbGxfZm10KG1jb25maWctPmluX2ZtdCwgZGZ3X2NvbmZpZy0+aW5fZm10LAotCQkJCQkJTU9EVUxFX01BWF9JTl9QSU5TKTsKLQlza2xfdHBsZ19maWxsX2ZtdChtY29uZmlnLT5vdXRfZm10LCBkZndfY29uZmlnLT5vdXRfZm10LAotCQkJCQkJTU9EVUxFX01BWF9PVVRfUElOUyk7Ci0KLQltY29uZmlnLT5wYXJhbXNfZml4dXAgPSBkZndfY29uZmlnLT5wYXJhbXNfZml4dXA7Ci0JbWNvbmZpZy0+Y29udmVydGVyID0gZGZ3X2NvbmZpZy0+Y29udmVydGVyOwotCW1jb25maWctPm1fdHlwZSA9IGRmd19jb25maWctPm1vZHVsZV90eXBlOwotCW1jb25maWctPnZidXNfaWQgPSBkZndfY29uZmlnLT52YnVzX2lkOwotCW1jb25maWctPm1lbV9wYWdlcyA9IGRmd19jb25maWctPm1lbV9wYWdlczsKLQotCXBpcGUgPSBza2xfdHBsZ19hZGRfcGlwZShidXMtPmRldiwgc2tsLCAmZGZ3X2NvbmZpZy0+cGlwZSk7Ci0JaWYgKHBpcGUpCi0JCW1jb25maWctPnBpcGUgPSBwaXBlOwotCi0JbWNvbmZpZy0+ZGV2X3R5cGUgPSBkZndfY29uZmlnLT5kZXZfdHlwZTsKLQltY29uZmlnLT5od19jb25uX3R5cGUgPSBkZndfY29uZmlnLT5od19jb25uX3R5cGU7Ci0JbWNvbmZpZy0+dGltZV9zbG90ID0gZGZ3X2NvbmZpZy0+dGltZV9zbG90OwotCW1jb25maWctPmZvcm1hdHNfY29uZmlnLmNhcHNfc2l6ZSA9IGRmd19jb25maWctPmNhcHMuY2Fwc19zaXplOwotCi0JbWNvbmZpZy0+bV9pbl9waW4gPSBkZXZtX2t6YWxsb2MoYnVzLT5kZXYsIChtY29uZmlnLT5tYXhfaW5fcXVldWUpICoKLQkJCQkJCXNpemVvZigqbWNvbmZpZy0+bV9pbl9waW4pLAotCQkJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtY29uZmlnLT5tX2luX3BpbikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltY29uZmlnLT5tX291dF9waW4gPSBkZXZtX2t6YWxsb2MoYnVzLT5kZXYsIChtY29uZmlnLT5tYXhfb3V0X3F1ZXVlKSAqCi0JCQkJCQlzaXplb2YoKm1jb25maWctPm1fb3V0X3BpbiksCi0JCQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIW1jb25maWctPm1fb3V0X3BpbikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlza2xfZmlsbF9tb2R1bGVfcGluX2luZm8oZGZ3X2NvbmZpZy0+aW5fcGluLCBtY29uZmlnLT5tX2luX3BpbiwKLQkJCQkJCWRmd19jb25maWctPmlzX2R5bmFtaWNfaW5fcGluLAotCQkJCQkJbWNvbmZpZy0+bWF4X2luX3F1ZXVlKTsKLQotCXNrbF9maWxsX21vZHVsZV9waW5faW5mbyhkZndfY29uZmlnLT5vdXRfcGluLCBtY29uZmlnLT5tX291dF9waW4sCi0JCQkJCQkgZGZ3X2NvbmZpZy0+aXNfZHluYW1pY19vdXRfcGluLAotCQkJCQkJCW1jb25maWctPm1heF9vdXRfcXVldWUpOwotCi0KLQlpZiAobWNvbmZpZy0+Zm9ybWF0c19jb25maWcuY2Fwc19zaXplID09IDApCi0JCWdvdG8gYmluZF9ldmVudDsKLQotCW1jb25maWctPmZvcm1hdHNfY29uZmlnLmNhcHMgPSAodTMyICopZGV2bV9remFsbG9jKGJ1cy0+ZGV2LAotCQkJbWNvbmZpZy0+Zm9ybWF0c19jb25maWcuY2Fwc19zaXplLCBHRlBfS0VSTkVMKTsKLQotCWlmIChtY29uZmlnLT5mb3JtYXRzX2NvbmZpZy5jYXBzID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbWVtY3B5KG1jb25maWctPmZvcm1hdHNfY29uZmlnLmNhcHMsIGRmd19jb25maWctPmNhcHMuY2FwcywKLQkJCQkJCSBkZndfY29uZmlnLT5jYXBzLmNhcHNfc2l6ZSk7Ci0JbWNvbmZpZy0+Zm9ybWF0c19jb25maWcucGFyYW1faWQgPSBkZndfY29uZmlnLT5jYXBzLnBhcmFtX2lkOwotCW1jb25maWctPmZvcm1hdHNfY29uZmlnLnNldF9wYXJhbXMgPSBkZndfY29uZmlnLT5jYXBzLnNldF9wYXJhbXM7Ci0KIGJpbmRfZXZlbnQ6CiAJaWYgKHRwbGdfdy0+ZXZlbnRfdHlwZSA9PSAwKSB7CiAJCWRldl9kYmcoYnVzLT5kZXYsICJBU29DOiBObyBldmVudCBoYW5kbGVyIHJlcXVpcmVkXG4iKTsKQEAgLTE3NjcsMTEgKzIyMzEsMjI5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc2tsX3RwbGdfZmlsbF9zdHJfbWZlc3RfdGtuKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3Jfc3RyaW5nX2VsZW0gKnN0cl9lbGVtLAorCQlzdHJ1Y3Qgc2tsX2Rmd19tYW5pZmVzdCAqbWluZm8pCit7CisJaW50IHRrbl9jb3VudCA9IDA7CisJc3RhdGljIGludCByZWZfY291bnQ7CisKKwlzd2l0Y2ggKHN0cl9lbGVtLT50b2tlbikgeworCWNhc2UgU0tMX1RLTl9TVFJfTElCX05BTUU6CisJCWlmIChyZWZfY291bnQgPiBtaW5mby0+bGliX2NvdW50IC0gMSkgeworCQkJcmVmX2NvdW50ID0gMDsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJc3RybmNweShtaW5mby0+bGliW3JlZl9jb3VudF0ubmFtZSwgc3RyX2VsZW0tPnN0cmluZywKKwkJCQlBUlJBWV9TSVpFKG1pbmZvLT5saWJbcmVmX2NvdW50XS5uYW1lKSk7CisJCXJlZl9jb3VudCsrOworCQl0a25fY291bnQrKzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgIk5vdCBhIHN0cmluZyB0b2tlbiAlZFxuIiwgc3RyX2VsZW0tPnRva2VuKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHRrbl9jb3VudDsKK30KKworc3RhdGljIGludCBza2xfdHBsZ19nZXRfc3RyX3RrbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX2FycmF5ICphcnJheSwKKwkJc3RydWN0IHNrbF9kZndfbWFuaWZlc3QgKm1pbmZvKQoreworCWludCB0a25fY291bnQgPSAwLCByZXQ7CisJc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3Jfc3RyaW5nX2VsZW0gKnN0cl9lbGVtOworCisJc3RyX2VsZW0gPSAoc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3Jfc3RyaW5nX2VsZW0gKilhcnJheS0+dmFsdWU7CisJd2hpbGUgKHRrbl9jb3VudCA8IGFycmF5LT5udW1fZWxlbXMpIHsKKwkJcmV0ID0gc2tsX3RwbGdfZmlsbF9zdHJfbWZlc3RfdGtuKGRldiwgc3RyX2VsZW0sIG1pbmZvKTsKKwkJc3RyX2VsZW0rKzsKKworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJdGtuX2NvdW50ID0gdGtuX2NvdW50ICsgcmV0OworCX0KKworCXJldHVybiB0a25fY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgc2tsX3RwbGdfZ2V0X2ludF90a24oc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl92YWx1ZV9lbGVtICp0a25fZWxlbSwKKwkJc3RydWN0IHNrbF9kZndfbWFuaWZlc3QgKm1pbmZvKQoreworCWludCB0a25fY291bnQgPSAwOworCisJc3dpdGNoICh0a25fZWxlbS0+dG9rZW4pIHsKKwljYXNlIFNLTF9US05fVTMyX0xJQl9DT1VOVDoKKwkJbWluZm8tPmxpYl9jb3VudCA9IHRrbl9lbGVtLT52YWx1ZTsKKwkJdGtuX2NvdW50Kys7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICJOb3QgYSBtYW5pZmVzdCB0b2tlbiAlZFxuIiwgdGtuX2VsZW0tPnRva2VuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHRrbl9jb3VudDsKK30KKworLyoKKyAqIEZpbGwgdGhlIG1hbmlmZXN0IHN0cnVjdHVyZSBieSBwYXJzaW5nIHRoZSB0b2tlbnMgYmFzZWQgb24gdGhlCisgKiB0eXBlLgorICovCitzdGF0aWMgaW50IHNrbF90cGxnX2dldF9tYW5pZmVzdF90a24oc3RydWN0IGRldmljZSAqZGV2LAorCQljaGFyICpwdnRfZGF0YSwgc3RydWN0IHNrbF9kZndfbWFuaWZlc3QgKm1pbmZvLAorCQlpbnQgYmxvY2tfc2l6ZSkKK3sKKwlpbnQgdGtuX2NvdW50ID0gMCwgcmV0OworCWludCBvZmYgPSAwLCB0dXBsZV9zaXplID0gMDsKKwlzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl9hcnJheSAqYXJyYXk7CisJc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3JfdmFsdWVfZWxlbSAqdGtuX2VsZW07CisKKwlpZiAoYmxvY2tfc2l6ZSA8PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdoaWxlICh0dXBsZV9zaXplIDwgYmxvY2tfc2l6ZSkgeworCQlhcnJheSA9IChzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl9hcnJheSAqKShwdnRfZGF0YSArIG9mZik7CisJCW9mZiArPSBhcnJheS0+c2l6ZTsKKwkJc3dpdGNoIChhcnJheS0+dHlwZSkgeworCQljYXNlIFNORF9TT0NfVFBMR19UVVBMRV9UWVBFX1NUUklORzoKKwkJCXJldCA9IHNrbF90cGxnX2dldF9zdHJfdGtuKGRldiwgYXJyYXksIG1pbmZvKTsKKworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJCXRrbl9jb3VudCArPSByZXQ7CisKKwkJCXR1cGxlX3NpemUgKz0gdGtuX2NvdW50ICoKKwkJCQlzaXplb2Yoc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3Jfc3RyaW5nX2VsZW0pOworCQkJY29udGludWU7CisKKwkJY2FzZSBTTkRfU09DX1RQTEdfVFVQTEVfVFlQRV9VVUlEOgorCQkJZGV2X3dhcm4oZGV2LCAibm8gdXVpZCB0b2tlbnMgZm9yIHNrbCB0cGxmIG1hbmlmZXN0XG4iKTsKKwkJCWNvbnRpbnVlOworCisJCWRlZmF1bHQ6CisJCQl0a25fZWxlbSA9IGFycmF5LT52YWx1ZTsKKwkJCXRrbl9jb3VudCA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCXdoaWxlICh0a25fY291bnQgPD0gYXJyYXktPm51bV9lbGVtcyAtIDEpIHsKKwkJCXJldCA9IHNrbF90cGxnX2dldF9pbnRfdGtuKGRldiwKKwkJCQkJdGtuX2VsZW0sIG1pbmZvKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisKKwkJCXRrbl9jb3VudCA9IHRrbl9jb3VudCArIHJldDsKKwkJCXRrbl9lbGVtKys7CisJCQl0dXBsZV9zaXplICs9IHRrbl9jb3VudCAqCisJCQkJc2l6ZW9mKHN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX3ZhbHVlX2VsZW0pOworCQkJYnJlYWs7CisJCX0KKwkJdGtuX2NvdW50ID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBhcnNlIG1hbmlmZXN0IHByaXZhdGUgZGF0YSBmb3IgdG9rZW5zLiBUaGUgcHJpdmF0ZSBkYXRhIGJsb2NrIGlzCisgKiBwcmVjZWRlZCBieSBkZXNjcmlwdG9ycyBmb3IgdHlwZSBhbmQgc2l6ZSBvZiBkYXRhIGJsb2NrLgorICovCitzdGF0aWMgaW50IHNrbF90cGxnX2dldF9tYW5pZmVzdF9kYXRhKHN0cnVjdCBzbmRfc29jX3RwbGdfbWFuaWZlc3QgKm1hbmlmZXN0LAorCQkJc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2tsX2Rmd19tYW5pZmVzdCAqbWluZm8pCit7CisJc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3JfYXJyYXkgKmFycmF5OworCWludCBudW1fYmxvY2tzLCBibG9ja19zaXplID0gMCwgYmxvY2tfdHlwZSwgb2ZmID0gMDsKKwljaGFyICpkYXRhOworCWludCByZXQ7CisKKwkvKiBSZWFkIHRoZSBOVU1fREFUQV9CTE9DS1MgZGVzY3JpcHRvciAqLworCWFycmF5ID0gKHN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX2FycmF5ICopbWFuaWZlc3QtPnByaXYuZGF0YTsKKwlyZXQgPSBza2xfdHBsZ19nZXRfZGVzY19ibG9ja3MoZGV2LCBhcnJheSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJbnVtX2Jsb2NrcyA9IHJldDsKKworCW9mZiArPSBhcnJheS0+c2l6ZTsKKwlhcnJheSA9IChzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl9hcnJheSAqKQorCQkJKG1hbmlmZXN0LT5wcml2LmRhdGEgKyBvZmYpOworCisJLyogUmVhZCB0aGUgQkxPQ0tfVFlQRSBhbmQgQkxPQ0tfU0laRSBkZXNjcmlwdG9yICovCisJd2hpbGUgKG51bV9ibG9ja3MgPiAwKSB7CisJCXJldCA9IHNrbF90cGxnX2dldF9kZXNjX2Jsb2NrcyhkZXYsIGFycmF5KTsKKworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCWJsb2NrX3R5cGUgPSByZXQ7CisJCW9mZiArPSBhcnJheS0+c2l6ZTsKKworCQlhcnJheSA9IChzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl9hcnJheSAqKQorCQkJKG1hbmlmZXN0LT5wcml2LmRhdGEgKyBvZmYpOworCisJCXJldCA9IHNrbF90cGxnX2dldF9kZXNjX2Jsb2NrcyhkZXYsIGFycmF5KTsKKworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCWJsb2NrX3NpemUgPSByZXQ7CisJCW9mZiArPSBhcnJheS0+c2l6ZTsKKworCQlhcnJheSA9IChzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl9hcnJheSAqKQorCQkJKG1hbmlmZXN0LT5wcml2LmRhdGEgKyBvZmYpOworCisJCWRhdGEgPSAobWFuaWZlc3QtPnByaXYuZGF0YSArIG9mZik7CisKKwkJaWYgKGJsb2NrX3R5cGUgPT0gU0tMX1RZUEVfVFVQTEUpIHsKKwkJCXJldCA9IHNrbF90cGxnX2dldF9tYW5pZmVzdF90a24oZGV2LCBkYXRhLCBtaW5mbywKKwkJCQkJYmxvY2tfc2l6ZSk7CisKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisKKwkJCS0tbnVtX2Jsb2NrczsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2tsX21hbmlmZXN0X2xvYWQoc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjbXBudCwKKwkJCQlzdHJ1Y3Qgc25kX3NvY190cGxnX21hbmlmZXN0ICptYW5pZmVzdCkKK3sKKwlzdHJ1Y3Qgc2tsX2Rmd19tYW5pZmVzdCAqbWluZm87CisJc3RydWN0IGhkYWNfZXh0X2J1cyAqZWJ1cyA9IHNuZF9zb2NfY29tcG9uZW50X2dldF9kcnZkYXRhKGNtcG50KTsKKwlzdHJ1Y3QgaGRhY19idXMgKmJ1cyA9IGVidXNfdG9faGJ1cyhlYnVzKTsKKwlzdHJ1Y3Qgc2tsICpza2wgPSBlYnVzX3RvX3NrbChlYnVzKTsKKwlpbnQgcmV0ID0gMDsKKworCS8qIHByb2NlZWQgb25seSBpZiB3ZSBoYXZlIHByaXZhdGUgZGF0YSBkZWZpbmVkICovCisJaWYgKG1hbmlmZXN0LT5wcml2LnNpemUgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwltaW5mbyA9ICZza2wtPnNrbF9zc3QtPm1hbmlmZXN0OworCisJc2tsX3RwbGdfZ2V0X21hbmlmZXN0X2RhdGEobWFuaWZlc3QsIGJ1cy0+ZGV2LCBtaW5mbyk7CisKKwlpZiAobWluZm8tPmxpYl9jb3VudCA+IEhEQV9NQVhfTElCKSB7CisJCWRldl9lcnIoYnVzLT5kZXYsICJFeGNlZWRpbmcgbWF4IExpYnJhcnkgY291bnQuIEdvdDolZFxuIiwKKwkJCQkJbWluZm8tPmxpYl9jb3VudCk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHN0cnVjdCBzbmRfc29jX3RwbGdfb3BzIHNrbF90cGxnX29wcyAgPSB7CiAJLndpZGdldF9sb2FkID0gc2tsX3RwbGdfd2lkZ2V0X2xvYWQsCiAJLmNvbnRyb2xfbG9hZCA9IHNrbF90cGxnX2NvbnRyb2xfbG9hZCwKIAkuYnl0ZXNfZXh0X29wcyA9IHNrbF90bHZfb3BzLAogCS5ieXRlc19leHRfb3BzX2NvdW50ID0gQVJSQVlfU0laRShza2xfdGx2X29wcyksCisJLm1hbmlmZXN0ID0gc2tsX21hbmlmZXN0X2xvYWQsCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXRvcG9sb2d5LmggYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtdG9wb2xvZ3kuaAppbmRleCAyMmQzZWY4Li5hNTE5MzYwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtdG9wb2xvZ3kuaAorKysgYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtdG9wb2xvZ3kuaApAQCAtMTMzLDcgKzEzMyw3IEBACiBzdHJ1Y3Qgc2tsX2RtYV9jb250cm9sIHsKIAl1MzIgbm9kZV9pZDsKIAl1MzIgY29uZmlnX2xlbmd0aDsKLQl1MzIgY29uZmlnX2RhdGFbMV07CisJdTMyIGNvbmZpZ19kYXRhWzBdOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IHNrbF9jcHJfY2ZnIHsKQEAgLTIxNSw5ICsyMTUsMjAgQEAKIAogc3RydWN0IHNrbF9tb2R1bGVfY2ZnOwogCitzdHJ1Y3Qgc2tsX21vZF9pbnN0X21hcCB7CisJdTE2IG1vZF9pZDsKKwl1MTYgaW5zdF9pZDsKK307CisKK3N0cnVjdCBza2xfa3BiX3BhcmFtcyB7CisJdTMyIG51bV9tb2R1bGVzOworCXN0cnVjdCBza2xfbW9kX2luc3RfbWFwIG1hcFswXTsKK307CisKIHN0cnVjdCBza2xfbW9kdWxlX2luc3RfaWQgewotCXUzMiBtb2R1bGVfaWQ7CisJaW50IG1vZHVsZV9pZDsKIAl1MzIgaW5zdGFuY2VfaWQ7CisJaW50IHB2dF9pZDsKIH07CiAKIGVudW0gc2tsX21vZHVsZV9waW5fc3RhdGUgewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXRwbGctaW50ZXJmYWNlLmggYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtdHBsZy1pbnRlcmZhY2UuaAppbmRleCBhMzJlNWU5Li4yZjYyODFlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtdHBsZy1pbnRlcmZhY2UuaAorKysgYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtdHBsZy1pbnRlcmZhY2UuaApAQCAtODAsNyArODAsOCBAQAogCVNLTF9NT0RVTEVfVFlQRV9VUERXTUlYLAogCVNLTF9NT0RVTEVfVFlQRV9TUkNJTlQsCiAJU0tMX01PRFVMRV9UWVBFX0FMR08sCi0JU0tMX01PRFVMRV9UWVBFX0JBU0VfT1VURk1UCisJU0tMX01PRFVMRV9UWVBFX0JBU0VfT1VURk1ULAorCVNLTF9NT0RVTEVfVFlQRV9LUEIsCiB9OwogCiBlbnVtIHNrbF9jb3JlX2FmZmluaXR5IHsKQEAgLTE0OCw3OCArMTQ5LDYgQEAKIAlTS0xfUEFSQU1fQklORAogfTsKIAotc3RydWN0IHNrbF9kZndfbW9kdWxlX3BpbiB7Ci0JdTE2IG1vZHVsZV9pZDsKLQl1MTYgaW5zdGFuY2VfaWQ7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3Qgc2tsX2Rmd19tb2R1bGVfZm10IHsKLQl1MzIgY2hhbm5lbHM7Ci0JdTMyIGZyZXE7Ci0JdTMyIGJpdF9kZXB0aDsKLQl1MzIgdmFsaWRfYml0X2RlcHRoOwotCXUzMiBjaF9jZmc7Ci0JdTMyIGludGVybGVhdmluZ19zdHlsZTsKLQl1MzIgc2FtcGxlX3R5cGU7Ci0JdTMyIGNoX21hcDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBza2xfZGZ3X21vZHVsZV9jYXBzIHsKLQl1MzIgc2V0X3BhcmFtczoyOwotCXUzMiByc3ZkOjMwOwotCXUzMiBwYXJhbV9pZDsKLQl1MzIgY2Fwc19zaXplOwotCXUzMiBjYXBzW0hEQV9TU1RfQ0ZHX01BWF07Ci19OwotCi1zdHJ1Y3Qgc2tsX2Rmd19waXBlIHsKLQl1OCBwaXBlX2lkOwotCXU4IHBpcGVfcHJpb3JpdHk7Ci0JdTE2IGNvbm5fdHlwZTo0OwotCXUxNiByc3ZkOjQ7Ci0JdTE2IG1lbW9yeV9wYWdlczo4OwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHNrbF9kZndfbW9kdWxlIHsKLQl1OCB1dWlkWzE2XTsKLQotCXUxNiBtb2R1bGVfaWQ7Ci0JdTE2IGluc3RhbmNlX2lkOwotCXUzMiBtYXhfbWNwczsKLQl1MzIgbWVtX3BhZ2VzOwotCXUzMiBvYnM7Ci0JdTMyIGliczsKLQl1MzIgdmJ1c19pZDsKLQotCXUzMiBtYXhfaW5fcXVldWU6ODsKLQl1MzIgbWF4X291dF9xdWV1ZTo4OwotCXUzMiB0aW1lX3Nsb3Q6ODsKLQl1MzIgY29yZV9pZDo0OwotCXUzMiByc3ZkMTo0OwotCi0JdTMyIG1vZHVsZV90eXBlOjg7Ci0JdTMyIGNvbm5fdHlwZTo0OwotCXUzMiBkZXZfdHlwZTo0OwotCXUzMiBod19jb25uX3R5cGU6NDsKLQl1MzIgcnN2ZDI6MTI7Ci0KLQl1MzIgcGFyYW1zX2ZpeHVwOjg7Ci0JdTMyIGNvbnZlcnRlcjo4OwotCXUzMiBpbnB1dF9waW5fdHlwZToxOwotCXUzMiBvdXRwdXRfcGluX3R5cGU6MTsKLQl1MzIgaXNfZHluYW1pY19pbl9waW46MTsKLQl1MzIgaXNfZHluYW1pY19vdXRfcGluOjE7Ci0JdTMyIGlzX2xvYWRhYmxlOjE7Ci0JdTMyIHJzdmQzOjExOwotCi0Jc3RydWN0IHNrbF9kZndfcGlwZSBwaXBlOwotCXN0cnVjdCBza2xfZGZ3X21vZHVsZV9mbXQgaW5fZm10W01BWF9JTl9RVUVVRV07Ci0Jc3RydWN0IHNrbF9kZndfbW9kdWxlX2ZtdCBvdXRfZm10W01BWF9PVVRfUVVFVUVdOwotCXN0cnVjdCBza2xfZGZ3X21vZHVsZV9waW4gaW5fcGluW01BWF9JTl9RVUVVRV07Ci0Jc3RydWN0IHNrbF9kZndfbW9kdWxlX3BpbiBvdXRfcGluW01BWF9PVVRfUVVFVUVdOwotCXN0cnVjdCBza2xfZGZ3X21vZHVsZV9jYXBzIGNhcHM7Ci19IF9fcGFja2VkOwotCiBzdHJ1Y3Qgc2tsX2Rmd19hbGdvX2RhdGEgewogCXUzMiBzZXRfcGFyYW1zOjI7CiAJdTMyIHJzdmQ6MzA7CkBAIC0yMjgsNCArMTU3LDI2IEBACiAJY2hhciBwYXJhbXNbMF07CiB9IF9fcGFja2VkOwogCisjZGVmaW5lIExJQl9OQU1FX0xFTkdUSAkxMjgKKyNkZWZpbmUgSERBX01BWF9MSUIJMTYKKworc3RydWN0IGxpYl9pbmZvIHsKKwljaGFyIG5hbWVbTElCX05BTUVfTEVOR1RIXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBza2xfZGZ3X21hbmlmZXN0IHsKKwl1MzIgbGliX2NvdW50OworCXN0cnVjdCBsaWJfaW5mbyBsaWJbSERBX01BWF9MSUJdOworfSBfX3BhY2tlZDsKKworZW51bSBza2xfdGtuX2RpciB7CisJU0tMX0RJUl9JTiwKKwlTS0xfRElSX09VVAorfTsKKworZW51bSBza2xfdHVwbGVfdHlwZSB7CisJU0tMX1RZUEVfVFVQTEUsCisJU0tMX1RZUEVfREFUQQorfTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wuYyBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC5jCmluZGV4IGNkNTk1MzYuLjI5ODljMTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC5jCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC5jCkBAIC01ODcsNyArNTg3LDcgQEAKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKLQlzbmRfaGRhY19leHRfYnVzX3BhcnNlX2NhcGFiaWxpdGllcyhlYnVzKTsKKwlzbmRfaGRhY19idXNfcGFyc2VfY2FwYWJpbGl0aWVzKGJ1cyk7CiAKIAlpZiAoc2tsX2FjcXVpcmVfaXJxKGVidXMsIDApIDwgMCkKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTY3Miw4ICs2NzIsMTAgQEAKIAogCXNrbC0+bmhsdCA9IHNrbF9uaGx0X2luaXQoYnVzLT5kZXYpOwogCi0JaWYgKHNrbC0+bmhsdCA9PSBOVUxMKQorCWlmIChza2wtPm5obHQgPT0gTlVMTCkgeworCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIG91dF9mcmVlOworCX0KIAogCXNrbF9uaGx0X3VwZGF0ZV90b3BvbG9neV9iaW4oc2tsKTsKIApAQCAtNjgyLDcgKzY4NCw3IEBACiAJc2tsX2RtaWNfZGF0YS5kbWljX251bSA9IHNrbF9nZXRfZG1pY19nZW8oc2tsKTsKIAogCS8qIGNoZWNrIGlmIGRzcCBpcyB0aGVyZSAqLwotCWlmIChlYnVzLT5wcGNhcCkgeworCWlmIChidXMtPnBwY2FwKSB7CiAJCWVyciA9IHNrbF9tYWNoaW5lX2RldmljZV9yZWdpc3Rlcihza2wsCiAJCQkJICAodm9pZCAqKXBjaV9pZC0+ZHJpdmVyX2RhdGEpOwogCQlpZiAoZXJyIDwgMCkKQEAgLTY5Niw3ICs2OTgsNyBAQAogCQlza2wtPnNrbF9zc3QtPmVuYWJsZV9taXNjYmRjZ2UgPSBza2xfZW5hYmxlX21pc2NiZGNnZTsKIAogCX0KLQlpZiAoZWJ1cy0+bWxjYXApCisJaWYgKGJ1cy0+bWxjYXApCiAJCXNuZF9oZGFjX2V4dF9idXNfZ2V0X21sX2NhcGFiaWxpdGllcyhlYnVzKTsKIAogCS8qIGNyZWF0ZSBkZXZpY2UgZm9yIHNvYyBkbWljICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wuaCBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC5oCmluZGV4IDkwNjRlNWIuLjVkNGZiYjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC5oCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC5oCkBAIC0xMDUsNiArMTA1LDcgQEAKIAkJCWludCBpcnEsIGNvbnN0IGNoYXIgKmZ3X25hbWUsCiAJCQlzdHJ1Y3Qgc2tsX2RzcF9sb2FkZXJfb3BzIGxvYWRlcl9vcHMsCiAJCQlzdHJ1Y3Qgc2tsX3NzdCAqKnNrbF9zc3QpOworCWludCAoKmluaXRfZncpKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNrbF9zc3QgKmN0eCk7CiAJdm9pZCAoKmNsZWFudXApKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNrbF9zc3QgKmN0eCk7CiB9OwogCkBAIC0xMjMsNCArMTI0LDUgQEAKIGludCBza2xfc3VzcGVuZF9kc3Aoc3RydWN0IHNrbCAqc2tsKTsKIGludCBza2xfcmVzdW1lX2RzcChzdHJ1Y3Qgc2tsICpza2wpOwogdm9pZCBza2xfY2xlYW51cF9yZXNvdXJjZXMoc3RydWN0IHNrbCAqc2tsKTsKK2NvbnN0IHN0cnVjdCBza2xfZHNwX29wcyAqc2tsX2dldF9kc3Bfb3BzKGludCBwY2lfaWQpOwogI2VuZGlmIC8qIF9fU09VTkRfU09DX1NLTF9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mva2lya3dvb2Qva2lya3dvb2QtZG1hLmMgYi9zb3VuZC9zb2Mva2lya3dvb2Qva2lya3dvb2QtZG1hLmMKaW5kZXggZGJmZGZlOS4uZGFmZDIyZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2tpcmt3b29kL2tpcmt3b29kLWRtYS5jCisrKyBiL3NvdW5kL3NvYy9raXJrd29vZC9raXJrd29vZC1kbWEuYwpAQCAtMjQyLDcgKzI0Miw3IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIGtpcmt3b29kX2RtYV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIGtpcmt3b29kX2RtYV9vcHMgPSB7CiAJLm9wZW4gPQkJa2lya3dvb2RfZG1hX29wZW4sCiAJLmNsb3NlID0gICAgICAgIGtpcmt3b29kX2RtYV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tZWRpYXRlay9jb21tb24vbXRrLWFmZS1mZS1kYWkuYyBiL3NvdW5kL3NvYy9tZWRpYXRlay9jb21tb24vbXRrLWFmZS1mZS1kYWkuYwppbmRleCBiNzg4NzkxYi4uYWMyMzFkMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL21lZGlhdGVrL2NvbW1vbi9tdGstYWZlLWZlLWRhaS5jCisrKyBiL3NvdW5kL3NvYy9tZWRpYXRlay9jb21tb24vbXRrLWFmZS1mZS1kYWkuYwpAQCAtMjMsNyArMjMsOCBAQAogCiAjZGVmaW5lIEFGRV9CQVNFX0VORF9PRkZTRVQgOAogCi1pbnQgbXRrX3JlZ21hcF91cGRhdGVfYml0cyhzdHJ1Y3QgcmVnbWFwICptYXAsIGludCByZWcsIHVuc2lnbmVkIGludCBtYXNrLAorc3RhdGljIGludCBtdGtfcmVnbWFwX3VwZGF0ZV9iaXRzKHN0cnVjdCByZWdtYXAgKm1hcCwgaW50IHJlZywKKwkJCSAgIHVuc2lnbmVkIGludCBtYXNrLAogCQkJICAgdW5zaWduZWQgaW50IHZhbCkKIHsKIAlpZiAocmVnIDwgMCkKQEAgLTMxLDcgKzMyLDcgQEAKIAlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKG1hcCwgcmVnLCBtYXNrLCB2YWwpOwogfQogCi1pbnQgbXRrX3JlZ21hcF93cml0ZShzdHJ1Y3QgcmVnbWFwICptYXAsIGludCByZWcsIHVuc2lnbmVkIGludCB2YWwpCitzdGF0aWMgaW50IG10a19yZWdtYXBfd3JpdGUoc3RydWN0IHJlZ21hcCAqbWFwLCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKQogewogCWlmIChyZWcgPCAwKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL21jYnNwLmMgYi9zb3VuZC9zb2Mvb21hcC9tY2JzcC5jCmluZGV4IDc2Y2UzMzEuLjA2ZmVjNTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL21jYnNwLmMKKysrIGIvc291bmQvc29jL29tYXAvbWNic3AuYwpAQCAtMjIxLDcgKzIyMSw4IEBACiAKIAkvKiBFbmFibGUgVFgvUlggc3luYyBlcnJvciBpbnRlcnJ1cHRzIGJ5IGRlZmF1bHQgKi8KIAlpZiAobWNic3AtPmlycSkKLQkJTUNCU1BfV1JJVEUobWNic3AsIElSUUVOLCBSU1lOQ0VSUkVOIHwgWFNZTkNFUlJFTik7CisJCU1DQlNQX1dSSVRFKG1jYnNwLCBJUlFFTiwgUlNZTkNFUlJFTiB8IFhTWU5DRVJSRU4gfAorCQkJICAgIFJVTkRGTEVOIHwgUk9WRkxFTiB8IFhVTkRGTEVOIHwgWE9WRkxFTik7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvb21hcC1hYmUtdHdsNjA0MC5jIGIvc291bmQvc29jL29tYXAvb21hcC1hYmUtdHdsNjA0MC5jCmluZGV4IDA4NDNhNjguLjg5ZmU5NWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL29tYXAtYWJlLXR3bDYwNDAuYworKysgYi9zb3VuZC9zb2Mvb21hcC9vbWFwLWFiZS10d2w2MDQwLmMKQEAgLTM4LDEwICszOCwxMCBAQAogc3RydWN0IGFiZV90d2w2MDQwIHsKIAlpbnQJamFja19kZXRlY3Rpb247CS8qIGJvYXJkIGNhbiBkZXRlY3QgamFjayBldmVudHMgKi8KIAlpbnQJbWNsa19mcmVxOwkvKiBNQ0xLIGZyZXF1ZW5jeSBzcGVlZCBmb3IgdHdsNjA0MCAqLwotCi0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZG1pY19jb2RlY19kZXY7CiB9OwogCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkbWljX2NvZGVjX2RldjsKKwogc3RhdGljIGludCBvbWFwX2FiZV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCiB7CkBAIC0yNTgsOCArMjU4LDYgQEAKIAlpZiAocHJpdiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXByaXYtPmRtaWNfY29kZWNfZGV2ID0gRVJSX1BUUigtRUlOVkFMKTsKLQogCWlmIChzbmRfc29jX29mX3BhcnNlX2NhcmRfbmFtZShjYXJkLCAidGksbW9kZWwiKSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYXJkIG5hbWUgaXMgbm90IHByb3ZpZGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0yODQsMTMgKzI4Miw2IEBACiAJCW51bV9saW5rcyA9IDI7CiAJCWFiZV90d2w2MDQwX2RhaV9saW5rc1sxXS5jcHVfb2Zfbm9kZSA9IGRhaV9ub2RlOwogCQlhYmVfdHdsNjA0MF9kYWlfbGlua3NbMV0ucGxhdGZvcm1fb2Zfbm9kZSA9IGRhaV9ub2RlOwotCi0JCXByaXYtPmRtaWNfY29kZWNfZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgKLQkJCQkJCSJkbWljLWNvZGVjIiwgLTEsIE5VTEwsIDApOwotCQlpZiAoSVNfRVJSKHByaXYtPmRtaWNfY29kZWNfZGV2KSkgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgaW5zdGFudGlhdGUgZG1pYy1jb2RlY1xuIik7Ci0JCQlyZXR1cm4gUFRSX0VSUihwcml2LT5kbWljX2NvZGVjX2Rldik7Ci0JCX0KIAl9IGVsc2UgewogCQludW1fbGlua3MgPSAxOwogCX0KQEAgLTI5OSwxNiArMjkwLDE0IEBACiAJb2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgInRpLG1jbGstZnJlcSIsICZwcml2LT5tY2xrX2ZyZXEpOwogCWlmICghcHJpdi0+bWNsa19mcmVxKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIk1DTEsgZnJlcXVlbmN5IG5vdCBwcm92aWRlZFxuIik7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX3VucmVnaXN0ZXI7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWNhcmQtPmZ1bGx5X3JvdXRlZCA9IDE7CiAKIAlpZiAoIXByaXYtPm1jbGtfZnJlcSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNQ0xLIGZyZXF1ZW5jeSBtaXNzaW5nXG4iKTsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBlcnJfdW5yZWdpc3RlcjsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJY2FyZC0+ZGFpX2xpbmsgPSBhYmVfdHdsNjA0MF9kYWlfbGlua3M7CkBAIC0zMTYsMzUgKzMwNSwxNCBAQAogCiAJc25kX3NvY19jYXJkX3NldF9kcnZkYXRhKGNhcmQsIHByaXYpOwogCi0JcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jYXJkKGNhcmQpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAic25kX3NvY19yZWdpc3Rlcl9jYXJkKCkgZmFpbGVkOiAlZFxuIiwKKwlyZXQgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmcGRldi0+ZGV2LCBjYXJkKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY2FyZCgpIGZhaWxlZDogJWRcbiIsCiAJCQlyZXQpOwotCQlnb3RvIGVycl91bnJlZ2lzdGVyOwotCX0KLQotCXJldHVybiAwOwotCi1lcnJfdW5yZWdpc3RlcjoKLQlpZiAoIUlTX0VSUihwcml2LT5kbWljX2NvZGVjX2RldikpCi0JCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHByaXYtPmRtaWNfY29kZWNfZGV2KTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgb21hcF9hYmVfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBhYmVfdHdsNjA0MCAqcHJpdiA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKLQotCXNuZF9zb2NfdW5yZWdpc3Rlcl9jYXJkKGNhcmQpOwotCi0JaWYgKCFJU19FUlIocHJpdi0+ZG1pY19jb2RlY19kZXYpKQotCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcihwcml2LT5kbWljX2NvZGVjX2Rldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb21hcF9hYmVfb2ZfbWF0Y2hbXSA9IHsKIAl7LmNvbXBhdGlibGUgPSAidGksYWJlLXR3bDYwNDAiLCB9LAogCXsgfSwKQEAgLTM1OCwxMCArMzI2LDM1IEBACiAJCS5vZl9tYXRjaF90YWJsZSA9IG9tYXBfYWJlX29mX21hdGNoLAogCX0sCiAJLnByb2JlID0gb21hcF9hYmVfcHJvYmUsCi0JLnJlbW92ZSA9IG9tYXBfYWJlX3JlbW92ZSwKIH07CiAKLW1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIob21hcF9hYmVfZHJpdmVyKTsKK3N0YXRpYyBpbnQgX19pbml0IG9tYXBfYWJlX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJZG1pY19jb2RlY19kZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJkbWljLWNvZGVjIiwgLTEsIE5VTEwsCisJCQkJCQkJIDApOworCWlmIChJU19FUlIoZG1pY19jb2RlY19kZXYpKSB7CisJCXByX2VycigiJXM6IGRtaWMtY29kZWMgZGV2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIFBUUl9FUlIoZG1pY19jb2RlY19kZXYpOworCX0KKworCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmb21hcF9hYmVfZHJpdmVyKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IHBsYXRmb3JtIGRyaXZlciByZWdpc3RyYXRpb24gZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGRtaWNfY29kZWNfZGV2KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorbW9kdWxlX2luaXQob21hcF9hYmVfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBvbWFwX2FiZV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm9tYXBfYWJlX2RyaXZlcik7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZG1pY19jb2RlY19kZXYpOworfQorbW9kdWxlX2V4aXQob21hcF9hYmVfZXhpdCk7CiAKIE1PRFVMRV9BVVRIT1IoIk1pc2FlbCBMb3BleiBDcnV6IDxtaXNhZWwubG9wZXpAdGkuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBTFNBIFNvQyBmb3IgT01BUCBib2FyZHMgd2l0aCBBQkUgYW5kIHR3bDYwNDAgY29kZWMiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL29tYXAtbWNwZG0uYyBiL3NvdW5kL3NvYy9vbWFwL29tYXAtbWNwZG0uYwppbmRleCBlN2NkYzUxLi42NDYwOWM3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvb21hcC9vbWFwLW1jcGRtLmMKKysrIGIvc291bmQvc29jL29tYXAvb21hcC1tY3BkbS5jCkBAIC0zMSw3ICszMSw2IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgpAQCAtNTUsNyArNTQsNiBAQAogCXVuc2lnbmVkIGxvbmcgcGh5c19iYXNlOwogCXZvaWQgX19pb21lbSAqaW9fYmFzZTsKIAlpbnQgaXJxOwotCXN0cnVjdCBjbGsgKnBkbWNsazsKIAogCXN0cnVjdCBtdXRleCBtdXRleDsKIApAQCAtMzkwLDE1ICszODgsMTQgQEAKIAlzdHJ1Y3Qgb21hcF9tY3BkbSAqbWNwZG0gPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOwogCWludCByZXQ7CiAKLQljbGtfcHJlcGFyZV9lbmFibGUobWNwZG0tPnBkbWNsayk7CiAJcG1fcnVudGltZV9lbmFibGUobWNwZG0tPmRldik7CiAKIAkvKiBEaXNhYmxlIGxpbmVzIHdoaWxlIHJlcXVlc3QgaXMgb25nb2luZyAqLwogCXBtX3J1bnRpbWVfZ2V0X3N5bmMobWNwZG0tPmRldik7CiAJb21hcF9tY3BkbV93cml0ZShtY3BkbSwgTUNQRE1fUkVHX0NUUkwsIDB4MDApOwogCi0JcmV0ID0gZGV2bV9yZXF1ZXN0X2lycShtY3BkbS0+ZGV2LCBtY3BkbS0+aXJxLCBvbWFwX21jcGRtX2lycV9oYW5kbGVyLAotCQkJCTAsICJNY1BETSIsICh2b2lkICopbWNwZG0pOworCXJldCA9IHJlcXVlc3RfaXJxKG1jcGRtLT5pcnEsIG9tYXBfbWNwZG1faXJxX2hhbmRsZXIsIDAsICJNY1BETSIsCisJCQkgICh2b2lkICopbWNwZG0pOwogCiAJcG1fcnVudGltZV9wdXRfc3luYyhtY3BkbS0+ZGV2KTsKIApAQCAtNDIzLDkgKzQyMCw5IEBACiB7CiAJc3RydWN0IG9tYXBfbWNwZG0gKm1jcGRtID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsKIAorCWZyZWVfaXJxKG1jcGRtLT5pcnEsICh2b2lkICopbWNwZG0pOwogCXBtX3J1bnRpbWVfZGlzYWJsZShtY3BkbS0+ZGV2KTsKIAotCWNsa19kaXNhYmxlX3VucHJlcGFyZShtY3BkbS0+cGRtY2xrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDQ1LDggKzQ0Miw2IEBACiAJCW1jcGRtLT5wbV9hY3RpdmVfY291bnQrKzsKIAl9CiAKLQljbGtfZGlzYWJsZV91bnByZXBhcmUobWNwZG0tPnBkbWNsayk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNDU0LDggKzQ0OSw2IEBACiB7CiAJc3RydWN0IG9tYXBfbWNwZG0gKm1jcGRtID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsKIAotCWNsa19wcmVwYXJlX2VuYWJsZShtY3BkbS0+cGRtY2xrKTsKLQogCWlmIChtY3BkbS0+cG1fYWN0aXZlX2NvdW50KSB7CiAJCXdoaWxlIChtY3BkbS0+cG1fYWN0aXZlX2NvdW50LS0pCiAJCQlwbV9ydW50aW1lX2dldF9zeW5jKG1jcGRtLT5kZXYpOwpAQCAtNTQ5LDE1ICs1NDIsNiBAQAogCiAJbWNwZG0tPmRldiA9ICZwZGV2LT5kZXY7CiAKLQltY3BkbS0+cGRtY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJwZG1jbGsiKTsKLQlpZiAoSVNfRVJSKG1jcGRtLT5wZG1jbGspKSB7Ci0JCWlmIChQVFJfRVJSKG1jcGRtLT5wZG1jbGspID09IC1FUFJPQkVfREVGRVIpCi0JCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKLQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIkVycm9yIGdldHRpbmcgcGRtY2xrICglbGQpIVxuIiwKLQkJCSBQVFJfRVJSKG1jcGRtLT5wZG1jbGspKTsKLQkJbWNwZG0tPnBkbWNsayA9IE5VTEw7Ci0JfQotCiAJcmV0ID0gIGRldm1fc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldiwKIAkJCQkJICAgICAgICZvbWFwX21jcGRtX2NvbXBvbmVudCwKIAkJCQkJICAgICAgICZvbWFwX21jcGRtX2RhaSwgMSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9vbWFwLXBjbS5jIGIvc291bmQvc29jL29tYXAvb21hcC1wY20uYwppbmRleCBhODRmNjc3Li45NGU5ZmY3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvb21hcC9vbWFwLXBjbS5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL29tYXAtcGNtLmMKQEAgLTU4LDcgKzU4LDcgQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBTTkRSVl9QQ01fRk9STUFUX0xBU1Q7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPD0gU05EUlZfUENNX0ZPUk1BVF9MQVNUOyBpKyspIHsKIAkJc3dpdGNoIChzbmRfcGNtX2Zvcm1hdF9waHlzaWNhbF93aWR0aChpKSkgewogCQljYXNlIDg6CiAJCWNhc2UgMTY6CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcWNvbS9hcHE4MDE2X3NiYy5jIGIvc291bmQvc29jL3Fjb20vYXBxODAxNl9zYmMuYwppbmRleCAxMjg5NTQzLi4wN2Y5MWU5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcWNvbS9hcHE4MDE2X3NiYy5jCisrKyBiL3NvdW5kL3NvYy9xY29tL2FwcTgwMTZfc2JjLmMKQEAgLTg1LDYgKzg1LDE1IEBACiAJCXJldHVybiBFUlJfUFRSKHJldCk7CiAJfQogCisJLyogREFQTSByb3V0ZXMgKi8KKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5vZGUsICJxY29tLGF1ZGlvLXJvdXRpbmciKSkgeworCQlyZXQgPSBzbmRfc29jX29mX3BhcnNlX2F1ZGlvX3JvdXRpbmcoY2FyZCwKKwkJCQkJInFjb20sYXVkaW8tcm91dGluZyIpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisKKwogCS8qIFBvcHVsYXRlIGxpbmtzICovCiAJbnVtX2xpbmtzID0gb2ZfZ2V0X2NoaWxkX2NvdW50KG5vZGUpOwogCkBAIC0xNDcsNiArMTU2LDE1IEBACiAJcmV0dXJuIGRhdGE7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBhcHE4MDE2X3NiY19kYXBtX3dpZGdldHNbXSA9IHsKKworCVNORF9TT0NfREFQTV9NSUMoIkhhbmRzZXQgTWljIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiSGVhZHNldCBNaWMiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJTZWNvbmRhcnkgTWljIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiRGlnaXRhbCBNaWMxIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiRGlnaXRhbCBNaWMyIiwgTlVMTCksCit9OworCiBzdGF0aWMgaW50IGFwcTgwMTZfc2JjX3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKQEAgLTE1OSw2ICsxNzcsOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWNhcmQtPmRldiA9IGRldjsKKwljYXJkLT5kYXBtX3dpZGdldHMgPSBhcHE4MDE2X3NiY19kYXBtX3dpZGdldHM7CisJY2FyZC0+bnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYXBxODAxNl9zYmNfZGFwbV93aWRnZXRzKTsKIAlkYXRhID0gYXBxODAxNl9zYmNfcGFyc2Vfb2YoY2FyZCk7CiAJaWYgKElTX0VSUihkYXRhKSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJFcnJvciByZXNvbHZpbmcgZGFpIGxpbmtzOiAlbGRcbiIsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcWNvbS9scGFzcy1wbGF0Zm9ybS5jIGIvc291bmQvc29jL3Fjb20vbHBhc3MtcGxhdGZvcm0uYwppbmRleCBkYjAwMGM2Li5lMmZmNTM4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcWNvbS9scGFzcy1wbGF0Zm9ybS5jCisrKyBiL3NvdW5kL3NvYy9xY29tL2xwYXNzLXBsYXRmb3JtLmMKQEAgLTg0LDkgKzg0LDkgQEAKIAkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCiB7CiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnNvY19ydW50aW1lID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGxwYXNzX3BjbV9kYXRhICpwY21fZGF0YSA9IHNuZF9zb2NfcGNtX2dldF9kcnZkYXRhKHNvY19ydW50aW1lKTsKIAlzdHJ1Y3QgbHBhc3NfZGF0YSAqZHJ2ZGF0YSA9CiAJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEoc29jX3J1bnRpbWUtPnBsYXRmb3JtKTsKKwlzdHJ1Y3QgbHBhc3NfcGNtX2RhdGEgKnBjbV9kYXRhID0gZHJ2ZGF0YS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBscGFzc192YXJpYW50ICp2ID0gZHJ2ZGF0YS0+dmFyaWFudDsKIAlzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdCA9IHBhcmFtc19mb3JtYXQocGFyYW1zKTsKIAl1bnNpZ25lZCBpbnQgY2hhbm5lbHMgPSBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKTsKQEAgLTE3Nyw5ICsxNzcsOSBAQAogc3RhdGljIGludCBscGFzc19wbGF0Zm9ybV9wY21vcHNfaHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqc29jX3J1bnRpbWUgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgbHBhc3NfcGNtX2RhdGEgKnBjbV9kYXRhID0gc25kX3NvY19wY21fZ2V0X2RydmRhdGEoc29jX3J1bnRpbWUpOwogCXN0cnVjdCBscGFzc19kYXRhICpkcnZkYXRhID0KIAkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShzb2NfcnVudGltZS0+cGxhdGZvcm0pOworCXN0cnVjdCBscGFzc19wY21fZGF0YSAqcGNtX2RhdGEgPSBkcnZkYXRhLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGxwYXNzX3ZhcmlhbnQgKnYgPSBkcnZkYXRhLT52YXJpYW50OwogCXVuc2lnbmVkIGludCByZWc7CiAJaW50IHJldDsKQEAgLTIwMSw5ICsyMDEsOSBAQAogewogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnNvY19ydW50aW1lID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGxwYXNzX3BjbV9kYXRhICpwY21fZGF0YSA9IHNuZF9zb2NfcGNtX2dldF9kcnZkYXRhKHNvY19ydW50aW1lKTsKIAlzdHJ1Y3QgbHBhc3NfZGF0YSAqZHJ2ZGF0YSA9CiAJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEoc29jX3J1bnRpbWUtPnBsYXRmb3JtKTsKKwlzdHJ1Y3QgbHBhc3NfcGNtX2RhdGEgKnBjbV9kYXRhID0gZHJ2ZGF0YS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBscGFzc192YXJpYW50ICp2ID0gZHJ2ZGF0YS0+dmFyaWFudDsKIAlpbnQgcmV0LCBjaCwgZGlyID0gc3Vic3RyZWFtLT5zdHJlYW07CiAKQEAgLTI1NSw5ICsyNTUsOSBAQAogCQlpbnQgY21kKQogewogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpzb2NfcnVudGltZSA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBscGFzc19wY21fZGF0YSAqcGNtX2RhdGEgPSBzbmRfc29jX3BjbV9nZXRfZHJ2ZGF0YShzb2NfcnVudGltZSk7CiAJc3RydWN0IGxwYXNzX2RhdGEgKmRydmRhdGEgPQogCQlzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHNvY19ydW50aW1lLT5wbGF0Zm9ybSk7CisJc3RydWN0IGxwYXNzX3BjbV9kYXRhICpwY21fZGF0YSA9IGRydmRhdGEtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgbHBhc3NfdmFyaWFudCAqdiA9IGRydmRhdGEtPnZhcmlhbnQ7CiAJaW50IHJldCwgY2gsIGRpciA9IHN1YnN0cmVhbS0+c3RyZWFtOwogCkBAIC0zMzEsOSArMzMxLDkgQEAKIAkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnNvY19ydW50aW1lID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGxwYXNzX3BjbV9kYXRhICpwY21fZGF0YSA9IHNuZF9zb2NfcGNtX2dldF9kcnZkYXRhKHNvY19ydW50aW1lKTsKIAlzdHJ1Y3QgbHBhc3NfZGF0YSAqZHJ2ZGF0YSA9CiAJCQlzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHNvY19ydW50aW1lLT5wbGF0Zm9ybSk7CisJc3RydWN0IGxwYXNzX3BjbV9kYXRhICpwY21fZGF0YSA9IGRydmRhdGEtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgbHBhc3NfdmFyaWFudCAqdiA9IGRydmRhdGEtPnZhcmlhbnQ7CiAJdW5zaWduZWQgaW50IGJhc2VfYWRkciwgY3Vycl9hZGRyOwogCWludCByZXQsIGNoLCBkaXIgPSBzdWJzdHJlYW0tPnN0cmVhbTsKQEAgLTM3Miw3ICszNzIsNyBAQAogCQkJcnVudGltZS0+ZG1hX2J5dGVzKTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBscGFzc19wbGF0Zm9ybV9wY21fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBscGFzc19wbGF0Zm9ybV9wY21fb3BzID0gewogCS5vcGVuCQk9IGxwYXNzX3BsYXRmb3JtX3BjbW9wc19vcGVuLAogCS5pb2N0bAkJPSBzbmRfcGNtX2xpYl9pb2N0bCwKIAkuaHdfcGFyYW1zCT0gbHBhc3NfcGxhdGZvcm1fcGNtb3BzX2h3X3BhcmFtcywKQEAgLTQ4Myw3ICs0ODMsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWRhdGEtPmkyc19wb3J0ID0gY3B1X2RhaS0+ZHJpdmVyLT5pZDsKLQlzbmRfc29jX3BjbV9zZXRfZHJ2ZGF0YShzb2NfcnVudGltZSwgZGF0YSk7CisJZHJ2ZGF0YS0+cHJpdmF0ZV9kYXRhID0gZGF0YTsKIAogCXBzdWJzdHJlYW0gPSBwY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uc3Vic3RyZWFtOwogCWlmIChwc3Vic3RyZWFtKSB7CkBAIC01NzAsOCArNTcwLDggQEAKIAkJc3Vic3RyZWFtID0gcGNtLT5zdHJlYW1zW2ldLnN1YnN0cmVhbTsKIAkJaWYgKHN1YnN0cmVhbSkgewogCQkJcnQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQkJCWRhdGEgPSBzbmRfc29jX3BjbV9nZXRfZHJ2ZGF0YShydCk7CiAJCQlkcnZkYXRhID0gc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShydC0+cGxhdGZvcm0pOworCQkJZGF0YSA9IGRydmRhdGEtPnByaXZhdGVfZGF0YTsKIAogCQkJY2ggPSAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKIAkJCQk/IGRhdGEtPnJkbWFfY2gKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9xY29tL2xwYXNzLmggYi9zb3VuZC9zb2MvcWNvbS9scGFzcy5oCmluZGV4IDMwNzE0YWQuLjM1YjNjZWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9xY29tL2xwYXNzLmgKKysrIGIvc291bmQvc29jL3Fjb20vbHBhc3MuaApAQCAtNTgsNiArNTgsOCBAQAogCS8qIDgwMTYgc3BlY2lmaWMgKi8KIAlzdHJ1Y3QgY2xrICpwY25vY19tcG9ydF9jbGs7CiAJc3RydWN0IGNsayAqcGNub2Nfc3dheV9jbGs7CisKKwl2b2lkICpwcml2YXRlX2RhdGE7CiB9OwogCiAvKiBWYWlyYW50IGRhdGEgcGVyIGVhY2ggU09DICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvcm9ja2NoaXAvS2NvbmZpZyBiL3NvdW5kL3NvYy9yb2NrY2hpcC9LY29uZmlnCmluZGV4IGYxZTBjNzAuLmM3ODNmOWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9yb2NrY2hpcC9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9yb2NrY2hpcC9LY29uZmlnCkBAIC00MSwzICs0MSwxNSBAQAogCWhlbHAKIAkgIFNheSBZIG9yIE0gaGVyZSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIFJvY2tjaGlwCiAJICBib2FyZHMgdXNpbmcgdGhlIFJUNTY0NS9SVDU2NTAgY29kZWMsIHN1Y2ggYXMgVmV5cm9uLgorCitjb25maWcgU05EX1NPQ19SSzMzOTlfR1JVX1NPVU5ECisJdHJpc3RhdGUgIkFTb0Mgc3VwcG9ydCBtdWx0aXBsZSBjb2RlY3MgZm9yIFJvY2tjaGlwIFJLMzM5OSBHUlUgYm9hcmRzIgorCWRlcGVuZHMgb24gU05EX1NPQ19ST0NLQ0hJUCAmJiBJMkMgJiYgR1BJT0xJQiAmJiBDTEtERVZfTE9PS1VQICYmIFNQSQorCXNlbGVjdCBTTkRfU09DX1JPQ0tDSElQX0kyUworCXNlbGVjdCBTTkRfU09DX01BWDk4MzU3QQorCXNlbGVjdCBTTkRfU09DX1JUNTUxNAorCXNlbGVjdCBTTkRfU09DX0RBNzIxOQorCXNlbGVjdCBTTkRfU09DX1JUNTUxNF9TUEkKKwloZWxwCisJICBTYXkgWSBvciBNIGhlcmUgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgbXVsdGlwbGUgY29kZWNzIGZvciBTb0MKKwkgIGF1ZGlvIG9uIFJvY2tjaGlwIFJLMzM5OSBHUlUgYm9hcmRzLgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3JvY2tjaGlwL01ha2VmaWxlIGIvc291bmQvc29jL3JvY2tjaGlwL01ha2VmaWxlCmluZGV4IGMwYmY1NjAuLjg0ZTVjN2MgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9yb2NrY2hpcC9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2Mvcm9ja2NoaXAvTWFrZWZpbGUKQEAgLTcsNiArNyw4IEBACiAKIHNuZC1zb2Mtcm9ja2NoaXAtbWF4OTgwOTAtb2JqcyA6PSByb2NrY2hpcF9tYXg5ODA5MC5vCiBzbmQtc29jLXJvY2tjaGlwLXJ0NTY0NS1vYmpzIDo9IHJvY2tjaGlwX3J0NTY0NS5vCitzbmQtc29jLXJrMzM5OS1ncnUtc291bmQtb2JqcyA6PSByazMzOTlfZ3J1X3NvdW5kLm8KIAogb2JqLSQoQ09ORklHX1NORF9TT0NfUk9DS0NISVBfTUFYOTgwOTApICs9IHNuZC1zb2Mtcm9ja2NoaXAtbWF4OTgwOTAubwogb2JqLSQoQ09ORklHX1NORF9TT0NfUk9DS0NISVBfUlQ1NjQ1KSArPSBzbmQtc29jLXJvY2tjaGlwLXJ0NTY0NS5vCitvYmotJChDT05GSUdfU05EX1NPQ19SSzMzOTlfR1JVX1NPVU5EKSArPSBzbmQtc29jLXJrMzM5OS1ncnUtc291bmQubwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3JvY2tjaGlwL3JrMzM5OV9ncnVfc291bmQuYyBiL3NvdW5kL3NvYy9yb2NrY2hpcC9yazMzOTlfZ3J1X3NvdW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVkNzM1YQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9yb2NrY2hpcC9yazMzOTlfZ3J1X3NvdW5kLmMKQEAgLTAsMCArMSwzOTcgQEAKKy8qCisgKiBSb2NrY2hpcCBtYWNoaW5lIEFTb0MgZHJpdmVyIGZvciBib2FyZHMgdXNpbmcgTUFYOTgzNTdBL1JUNTUxNC9EQTcyMTkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIFJPQ0tDSElQIENPUlBPUkFUSU9OLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgInJvY2tjaGlwX2kycy5oIgorI2luY2x1ZGUgIi4uL2NvZGVjcy9kYTcyMTkuaCIKKyNpbmNsdWRlICIuLi9jb2RlY3MvZGE3MjE5LWFhZC5oIgorI2luY2x1ZGUgIi4uL2NvZGVjcy9ydDU1MTQuaCIKKworI2RlZmluZSBEUlZfTkFNRSAicmszMzk5LWdydS1zb3VuZCIKKworI2RlZmluZSBTT1VORF9GUwkyNTYKKwordW5zaWduZWQgaW50IHJ0NTUxNF9kbWljX2RlbGF5OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfamFjayByb2NrY2hpcF9zb3VuZF9qYWNrOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgcm9ja2NoaXBfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX0hQKCJIZWFkcGhvbmVzIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX1NQSygiU3BlYWtlcnMiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJIZWFkc2V0IE1pYyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkludCBNaWMiLCBOVUxMKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIHJvY2tjaGlwX2RhcG1fcm91dGVzW10gPSB7CisJLyogSW5wdXQgTGluZXMgKi8KKwl7Ik1JQyIsIE5VTEwsICJIZWFkc2V0IE1pYyJ9LAorCXsiRE1JQzFMIiwgTlVMTCwgIkludCBNaWMifSwKKwl7IkRNSUMxUiIsIE5VTEwsICJJbnQgTWljIn0sCisKKwkvKiBPdXRwdXQgTGluZXMgKi8KKwl7IkhlYWRwaG9uZXMiLCBOVUxMLCAiSFBMIn0sCisJeyJIZWFkcGhvbmVzIiwgTlVMTCwgIkhQUiJ9LAorCXsiU3BlYWtlcnMiLCBOVUxMLCAiU3BlYWtlciJ9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJvY2tjaGlwX2NvbnRyb2xzW10gPSB7CisJU09DX0RBUE1fUElOX1NXSVRDSCgiSGVhZHBob25lcyIpLAorCVNPQ19EQVBNX1BJTl9TV0lUQ0goIlNwZWFrZXJzIiksCisJU09DX0RBUE1fUElOX1NXSVRDSCgiSGVhZHNldCBNaWMiKSwKKwlTT0NfREFQTV9QSU5fU1dJVENIKCJJbnQgTWljIiksCit9OworCitzdGF0aWMgaW50IHJvY2tjaGlwX3NvdW5kX21heDk4MzU3YV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgbWNsazsKKwlpbnQgcmV0OworCisJLyogbWF4OTgzNTdhIHN1cHBvcnRzIHRoZXNlIHNhbXBsZSByYXRlcyAqLworCXN3aXRjaCAocGFyYW1zX3JhdGUocGFyYW1zKSkgeworCWNhc2UgODAwMDoKKwljYXNlIDE2MDAwOgorCWNhc2UgNDgwMDA6CisJY2FzZSA5NjAwMDoKKwkJbWNsayA9IHBhcmFtc19yYXRlKHBhcmFtcykgKiBTT1VORF9GUzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihydGQtPmNhcmQtPmRldiwgIiVzKCkgZG9lc24ndCBzdXBwb3J0IHRoaXMgc2FtcGxlIHJhdGU6ICVkXG4iLAorCQkJCV9fZnVuY19fLCBwYXJhbXNfcmF0ZShwYXJhbXMpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2NsayhydGQtPmNwdV9kYWksIDAsIG1jbGssIDApOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihydGQtPmNhcmQtPmRldiwgIiVzKCkgZXJyb3Igc2V0dGluZyBzeXNjbGsgdG8gJXU6ICVkXG4iLAorCQkJCV9fZnVuY19fLCBtY2xrLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX3NvdW5kX3J0NTUxNF9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKwl1bnNpZ25lZCBpbnQgbWNsazsKKwlpbnQgcmV0OworCisJbWNsayA9IHBhcmFtc19yYXRlKHBhcmFtcykgKiBTT1VORF9GUzsKKworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY3B1X2RhaSwgMCwgbWNsaywKKwkJCQkgICAgIFNORF9TT0NfQ0xPQ0tfT1VUKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+Y2FyZC0+ZGV2LCAiQ2FuJ3Qgc2V0IGNwdSBjbG9jayBvdXQgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIFJUNTUxNF9TQ0xLX1NfTUNMSywKKwkJCQkgICAgIG1jbGssIFNORF9TT0NfQ0xPQ0tfSU4pOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihydGQtPmNhcmQtPmRldiwgIiVzKCkgZXJyb3Igc2V0dGluZyBzeXNjbGsgdG8gJXU6ICVkXG4iLAorCQkJCV9fZnVuY19fLCBwYXJhbXNfcmF0ZShwYXJhbXMpICogNTEyLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFdhaXQgZm9yIERNSUMgc3RhYmxlICovCisJbXNsZWVwKHJ0NTUxNF9kbWljX2RlbGF5KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX3NvdW5kX2RhNzIxOV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKwlpbnQgbWNsaywgcmV0OworCisJLyogaW4gYnlwYXNzIG1vZGUsIHRoZSBtY2xrIGhhcyB0byBiZSBvbmUgb2YgdGhlIGZyZXF1ZW5jaWVzIGJlbG93ICovCisJc3dpdGNoIChwYXJhbXNfcmF0ZShwYXJhbXMpKSB7CisJY2FzZSA4MDAwOgorCWNhc2UgMTYwMDA6CisJY2FzZSAyNDAwMDoKKwljYXNlIDMyMDAwOgorCWNhc2UgNDgwMDA6CisJY2FzZSA2NDAwMDoKKwljYXNlIDk2MDAwOgorCQltY2xrID0gMTIyODgwMDA7CisJCWJyZWFrOworCWNhc2UgMTEwMjU6CisJY2FzZSAyMjA1MDoKKwljYXNlIDQ0MTAwOgorCWNhc2UgODgyMDA6CisJCW1jbGsgPSAxMTI4OTYwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2NsayhjcHVfZGFpLCAwLCBtY2xrLAorCQkJCSAgICAgU05EX1NPQ19DTE9DS19PVVQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY29kZWNfZGFpLT5kZXYsICJDYW4ndCBzZXQgY3B1IGNsb2NrIG91dCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgMCwgbWNsaywKKwkJCQkgICAgIFNORF9TT0NfQ0xPQ0tfSU4pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY29kZWNfZGFpLT5kZXYsICJDYW4ndCBzZXQgY29kZWMgY2xvY2sgaW4gJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X3BsbChjb2RlY19kYWksIDAsIERBNzIxOV9TWVNDTEtfTUNMSywgMCwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihjb2RlY19kYWktPmRldiwgIkNhbid0IHNldCBwbGwgc3lzY2xrIG1jbGsgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfc291bmRfZGE3MjE5X2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjX2RhaXNbMF0tPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisJaW50IHJldDsKKworCS8qIFdlIG5lZWQgZGVmYXVsdCBNQ0xLIGFuZCBQTEwgc2V0dGluZ3MgZm9yIHRoZSBhY2Nlc3NvcnkgZGV0ZWN0aW9uICovCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIDAsIDEyMjg4MDAwLAorCQkJCSAgICAgU05EX1NPQ19DTE9DS19JTik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihjb2RlY19kYWktPmRldiwgIkluaXQgY2FuJ3Qgc2V0IGNvZGVjIGNsb2NrIGluICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9wbGwoY29kZWNfZGFpLCAwLCBEQTcyMTlfU1lTQ0xLX01DTEssIDAsIDApOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY29kZWNfZGFpLT5kZXYsICJJbml0IGNhbid0IHNldCBwbGwgc3lzY2xrIG1jbGsgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogRW5hYmxlIEhlYWRzZXQgYW5kIDQgQnV0dG9ucyBKYWNrIGRldGVjdGlvbiAqLworCXJldCA9IHNuZF9zb2NfY2FyZF9qYWNrX25ldyhydGQtPmNhcmQsICJIZWFkc2V0IEphY2siLAorCQkJCSAgICBTTkRfSkFDS19IRUFEU0VUIHwgU05EX0pBQ0tfTElORU9VVCB8CisJCQkJICAgIFNORF9KQUNLX0JUTl8wIHwgU05EX0pBQ0tfQlROXzEgfAorCQkJCSAgICBTTkRfSkFDS19CVE5fMiB8IFNORF9KQUNLX0JUTl8zLAorCQkJCSAgICAmcm9ja2NoaXBfc291bmRfamFjaywgTlVMTCwgMCk7CisKKwlpZiAocmV0KSB7CisJCWRldl9lcnIocnRkLT5jYXJkLT5kZXYsICJOZXcgSGVhZHNldCBKYWNrIGZhaWxlZCEgKCVkKVxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzbmRfamFja19zZXRfa2V5KHJvY2tjaGlwX3NvdW5kX2phY2suamFjaywgU05EX0pBQ0tfQlROXzAsIEtFWV9NRURJQSk7CisJc25kX2phY2tfc2V0X2tleSgKKwkJcm9ja2NoaXBfc291bmRfamFjay5qYWNrLCBTTkRfSkFDS19CVE5fMSwgS0VZX1ZPTFVNRVVQKTsKKwlzbmRfamFja19zZXRfa2V5KAorCQlyb2NrY2hpcF9zb3VuZF9qYWNrLmphY2ssIFNORF9KQUNLX0JUTl8yLCBLRVlfVk9MVU1FRE9XTik7CisJc25kX2phY2tfc2V0X2tleSgKKwkJcm9ja2NoaXBfc291bmRfamFjay5qYWNrLCBTTkRfSkFDS19CVE5fMywgS0VZX1ZPSUNFQ09NTUFORCk7CisKKwlkYTcyMTlfYWFkX2phY2tfZGV0KGNvZGVjLCAmcm9ja2NoaXBfc291bmRfamFjayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyByb2NrY2hpcF9zb3VuZF9tYXg5ODM1N2Ffb3BzID0geworCS5od19wYXJhbXMgPSByb2NrY2hpcF9zb3VuZF9tYXg5ODM1N2FfaHdfcGFyYW1zLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyByb2NrY2hpcF9zb3VuZF9ydDU1MTRfb3BzID0geworCS5od19wYXJhbXMgPSByb2NrY2hpcF9zb3VuZF9ydDU1MTRfaHdfcGFyYW1zLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyByb2NrY2hpcF9zb3VuZF9kYTcyMTlfb3BzID0geworCS5od19wYXJhbXMgPSByb2NrY2hpcF9zb3VuZF9kYTcyMTlfaHdfcGFyYW1zLAorfTsKKworZW51bSB7CisJREFJTElOS19NQVg5ODM1N0EsCisJREFJTElOS19SVDU1MTQsCisJREFJTElOS19EQTcyMTksCisJREFJTElOS19SVDU1MTRfRFNQLAorfTsKKworI2RlZmluZSBEQUlMSU5LX0VOVElUSUVTCShEQUlMSU5LX0RBNzIxOSArIDEpCisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayByb2NrY2hpcF9kYWlsaW5rc1tdID0geworCVtEQUlMSU5LX01BWDk4MzU3QV0gPSB7CisJCS5uYW1lID0gIk1BWDk4MzU3QSIsCisJCS5zdHJlYW1fbmFtZSA9ICJNQVg5ODM1N0EgUENNIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIkhpRmkiLAorCQkub3BzID0gJnJvY2tjaGlwX3NvdW5kX21heDk4MzU3YV9vcHMsCisJCS8qIHNldCBtYXg5ODM1N2EgYXMgc2xhdmUgKi8KKwkJLmRhaV9mbXQgPSBTTkRfU09DX0RBSUZNVF9JMlMgfCBTTkRfU09DX0RBSUZNVF9OQl9ORiB8CisJCQlTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTLAorCX0sCisJW0RBSUxJTktfUlQ1NTE0XSA9IHsKKwkJLm5hbWUgPSAiUlQ1NTE0IiwKKwkJLnN0cmVhbV9uYW1lID0gIlJUNTUxNCBQQ00iLAorCQkuY29kZWNfZGFpX25hbWUgPSAicnQ1NTE0LWFpZjEiLAorCQkub3BzID0gJnJvY2tjaGlwX3NvdW5kX3J0NTUxNF9vcHMsCisJCS8qIHNldCBydDU1MTQgYXMgc2xhdmUgKi8KKwkJLmRhaV9mbXQgPSBTTkRfU09DX0RBSUZNVF9JMlMgfCBTTkRfU09DX0RBSUZNVF9OQl9ORiB8CisJCQlTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTLAorCX0sCisJW0RBSUxJTktfREE3MjE5XSA9IHsKKwkJLm5hbWUgPSAiREE3MjE5IiwKKwkJLnN0cmVhbV9uYW1lID0gIkRBNzIxOSBQQ00iLAorCQkuY29kZWNfZGFpX25hbWUgPSAiZGE3MjE5LWhpZmkiLAorCQkuaW5pdCA9IHJvY2tjaGlwX3NvdW5kX2RhNzIxOV9pbml0LAorCQkub3BzID0gJnJvY2tjaGlwX3NvdW5kX2RhNzIxOV9vcHMsCisJCS8qIHNldCBkYTcyMTkgYXMgc2xhdmUgKi8KKwkJLmRhaV9mbXQgPSBTTkRfU09DX0RBSUZNVF9JMlMgfCBTTkRfU09DX0RBSUZNVF9OQl9ORiB8CisJCQlTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTLAorCX0sCisJLyogUlQ1NTE0IERTUCBmb3Igdm9pY2Ugd2FrZXVwIHZpYSBzcGkgYnVzICovCisJW0RBSUxJTktfUlQ1NTE0X0RTUF0gPSB7CisJCS5uYW1lID0gIlJUNTUxNCBEU1AiLAorCQkuc3RyZWFtX25hbWUgPSAiV2FrZSBvbiBWb2ljZSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY2FyZCByb2NrY2hpcF9zb3VuZF9jYXJkID0geworCS5uYW1lID0gInJrMzM5OS1ncnUtc291bmQiLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5kYWlfbGluayA9IHJvY2tjaGlwX2RhaWxpbmtzLAorCS5udW1fbGlua3MgPSAgQVJSQVlfU0laRShyb2NrY2hpcF9kYWlsaW5rcyksCisJLmRhcG1fd2lkZ2V0cyA9IHJvY2tjaGlwX2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUocm9ja2NoaXBfZGFwbV93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSByb2NrY2hpcF9kYXBtX3JvdXRlcywKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShyb2NrY2hpcF9kYXBtX3JvdXRlcyksCisJLmNvbnRyb2xzID0gcm9ja2NoaXBfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUocm9ja2NoaXBfY29udHJvbHMpLAorfTsKKworc3RhdGljIGludCByb2NrY2hpcF9zb3VuZF9tYXRjaF9zdHViKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCByb2NrY2hpcF9zb3VuZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSAmcm9ja2NoaXBfc291bmRfY2FyZDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdV9ub2RlOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2OworCWludCBpLCByZXQ7CisKKwljcHVfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUocGRldi0+ZGV2Lm9mX25vZGUsICJyb2NrY2hpcCxjcHUiLCAwKTsKKwlpZiAoIWNwdV9ub2RlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlByb3BlcnR5ICdyb2NrY2hpcCxjcHUnIG1pc3Npbmcgb3IgaW52YWxpZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBEQUlMSU5LX0VOVElUSUVTOyBpKyspIHsKKwkJcm9ja2NoaXBfZGFpbGlua3NbaV0ucGxhdGZvcm1fb2Zfbm9kZSA9IGNwdV9ub2RlOworCQlyb2NrY2hpcF9kYWlsaW5rc1tpXS5jcHVfb2Zfbm9kZSA9IGNwdV9ub2RlOworCisJCXJvY2tjaGlwX2RhaWxpbmtzW2ldLmNvZGVjX29mX25vZGUgPQorCQkJb2ZfcGFyc2VfcGhhbmRsZShwZGV2LT5kZXYub2Zfbm9kZSwgInJvY2tjaGlwLGNvZGVjIiwgaSk7CisJCWlmICghcm9ja2NoaXBfZGFpbGlua3NbaV0uY29kZWNfb2Zfbm9kZSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJQcm9wZXJ0eVslZF0gJ3JvY2tjaGlwLGNvZGVjJyBtaXNzaW5nIG9yIGludmFsaWRcbiIsIGkpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUbyBhY3F1aXJlIHRoZSBzcGkgZHJpdmVyIG9mIHRoZSBydDU1MTQgYW5kIHNldCB0aGUgZGFpLWxpbmtzIG5hbWVzCisJICogZm9yIHNvY19iaW5kX2RhaV9saW5rCisJICovCisJZHJ2ID0gZHJpdmVyX2ZpbmQoInJ0NTUxNCIsICZzcGlfYnVzX3R5cGUpOworCWlmICghZHJ2KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbiBub3QgZmluZCB0aGUgcnQ1NTE0IGRyaXZlciBhdCB0aGUgc3BpIGJ1c1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldiA9IGRyaXZlcl9maW5kX2RldmljZShkcnYsIE5VTEwsIE5VTEwsIHJvY2tjaGlwX3NvdW5kX21hdGNoX3N0dWIpOworCWlmICghZGV2KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbiBub3QgZmluZCB0aGUgcnQ1NTE0IGRldmljZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIFNldCBETUlDIGRlbGF5ICovCisJcmV0ID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKCZwZGV2LT5kZXYsICJkbWljLWRlbGF5IiwKKwkJCQkJJnJ0NTUxNF9kbWljX2RlbGF5KTsKKwlpZiAocmV0KSB7CisJCXJ0NTUxNF9kbWljX2RlbGF5ID0gMDsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LAorCQkJIm5vIG9wdGlvbmFsIHByb3BlcnR5ICdkbWljLWRlbGF5JyBmb3VuZCwgZGVmYXVsdDogbm8gZGVsYXlcbiIpOworCX0KKworCXJvY2tjaGlwX2RhaWxpbmtzW0RBSUxJTktfUlQ1NTE0X0RTUF0uY3B1X25hbWUgPSBrc3RyZHVwX2NvbnN0KGRldl9uYW1lKGRldiksIEdGUF9LRVJORUwpOworCXJvY2tjaGlwX2RhaWxpbmtzW0RBSUxJTktfUlQ1NTE0X0RTUF0uY3B1X2RhaV9uYW1lID0ga3N0cmR1cF9jb25zdChkZXZfbmFtZShkZXYpLCBHRlBfS0VSTkVMKTsKKwlyb2NrY2hpcF9kYWlsaW5rc1tEQUlMSU5LX1JUNTUxNF9EU1BdLnBsYXRmb3JtX25hbWUgPSBrc3RyZHVwX2NvbnN0KGRldl9uYW1lKGRldiksIEdGUF9LRVJORUwpOworCisJY2FyZC0+ZGV2ID0gJnBkZXYtPmRldjsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKKworCXJldCA9IGRldm1fc25kX3NvY19yZWdpc3Rlcl9jYXJkKCZwZGV2LT5kZXYsIGNhcmQpOworCWlmIChyZXQpCisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzIHNuZF9zb2NfcmVnaXN0ZXJfY2FyZCBmYWlsICVkXG4iLAorCQkJX19mdW5jX18sIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCByb2NrY2hpcF9zb3VuZF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMzk5LWdydS1zb3VuZCIsIH0sCisJe30sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciByb2NrY2hpcF9zb3VuZF9kcml2ZXIgPSB7CisJLnByb2JlID0gcm9ja2NoaXBfc291bmRfcHJvYmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUlZfTkFNRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gcm9ja2NoaXBfc291bmRfb2ZfbWF0Y2gsCisjaWZkZWYgQ09ORklHX1BNCisJCS5wbSA9ICZzbmRfc29jX3BtX29wcywKKyNlbmRpZgorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHJvY2tjaGlwX3NvdW5kX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIlhpbmcgWmhlbmcgPHpoZW5neGluZ0Byb2NrLWNoaXBzLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUm9ja2NoaXAgQVNvQyBNYWNoaW5lIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybToiIERSVl9OQU1FKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHJvY2tjaGlwX3NvdW5kX29mX21hdGNoKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9yb2NrY2hpcC9yb2NrY2hpcF9pMnMuYyBiL3NvdW5kL3NvYy9yb2NrY2hpcC9yb2NrY2hpcF9pMnMuYwppbmRleCA2NTJlOGM1Li45NzQ5MTVjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvcm9ja2NoaXAvcm9ja2NoaXBfaTJzLmMKKysrIGIvc291bmQvc29jL3JvY2tjaGlwL3JvY2tjaGlwX2kycy5jCkBAIC01Nyw2ICs1Nyw3IEBACiB7CiAJc3RydWN0IHJrX2kyc19kZXYgKmkycyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCisJcmVnY2FjaGVfY2FjaGVfb25seShpMnMtPnJlZ21hcCwgdHJ1ZSk7CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGkycy0+bWNsayk7CiAKIAlyZXR1cm4gMDsKQEAgLTczLDcgKzc0LDE0IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0dXJuIDA7CisJcmVnY2FjaGVfY2FjaGVfb25seShpMnMtPnJlZ21hcCwgZmFsc2UpOworCXJlZ2NhY2hlX21hcmtfZGlydHkoaTJzLT5yZWdtYXApOworCisJcmV0ID0gcmVnY2FjaGVfc3luYyhpMnMtPnJlZ21hcCk7CisJaWYgKHJldCkKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGkycy0+bWNsayk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBya19pMnNfZGV2ICp0b19pbmZvKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3JvY2tjaGlwL3JvY2tjaGlwX3NwZGlmLmMgYi9zb3VuZC9zb2Mvcm9ja2NoaXAvcm9ja2NoaXBfc3BkaWYuYwppbmRleCA0Y2EyNjU3Li5mYTgxMDFkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvcm9ja2NoaXAvcm9ja2NoaXBfc3BkaWYuYworKysgYi9zb3VuZC9zb2Mvcm9ja2NoaXAvcm9ja2NoaXBfc3BkaWYuYwpAQCAtNjUsNiArNjUsNyBAQAogewogCXN0cnVjdCBya19zcGRpZl9kZXYgKnNwZGlmID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKKwlyZWdjYWNoZV9jYWNoZV9vbmx5KHNwZGlmLT5yZWdtYXAsIHRydWUpOwogCWNsa19kaXNhYmxlX3VucHJlcGFyZShzcGRpZi0+bWNsayk7CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNwZGlmLT5oY2xrKTsKIApAQCAtODgsNyArODksMTYgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXR1cm4gMDsKKwlyZWdjYWNoZV9jYWNoZV9vbmx5KHNwZGlmLT5yZWdtYXAsIGZhbHNlKTsKKwlyZWdjYWNoZV9tYXJrX2RpcnR5KHNwZGlmLT5yZWdtYXApOworCisJcmV0ID0gcmVnY2FjaGVfc3luYyhzcGRpZi0+cmVnbWFwKTsKKwlpZiAocmV0KSB7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShzcGRpZi0+bWNsayk7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShzcGRpZi0+aGNsayk7CisJfQorCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBya19zcGRpZl9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9LY29uZmlnIGIvc291bmQvc29jL3NhbXN1bmcvS2NvbmZpZwppbmRleCA3YjcyMmIwLi5mNjAyM2I0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL0tjb25maWcKQEAgLTEsMTIgKzEsMTQgQEAKLWNvbmZpZyBTTkRfU09DX1NBTVNVTkcKK21lbnVjb25maWcgU05EX1NPQ19TQU1TVU5HCiAJdHJpc3RhdGUgIkFTb0Mgc3VwcG9ydCBmb3IgU2Ftc3VuZyIKIAlkZXBlbmRzIG9uIChQTEFUX1NBTVNVTkcgfHwgQVJDSF9FWFlOT1MpCiAJc2VsZWN0IFNORF9TT0NfR0VORVJJQ19ETUFFTkdJTkVfUENNCi0JaGVscAorCS0tLWhlbHAtLS0KIAkgIFNheSBZIG9yIE0gaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIGNvZGVjcyBhdHRhY2hlZCB0bwogCSAgdGhlIFNhbXN1bmcgU29DcycgQXVkaW8gaW50ZXJmYWNlcy4gWW91IHdpbGwgYWxzbyBuZWVkIHRvCiAJICBzZWxlY3QgdGhlIGF1ZGlvIGludGVyZmFjZXMgdG8gc3VwcG9ydCBiZWxvdy4KIAoraWYgU05EX1NPQ19TQU1TVU5HCisKIGNvbmZpZyBTTkRfUzNDMjRYWF9JMlMKIAl0cmlzdGF0ZQogCkBAIC0xOCwyMiArMjAsMjIgQEAKIAlzZWxlY3QgU05EX1MzQ19JMlNWMl9TT0MKIAogY29uZmlnIFNORF9TQU1TVU5HX1BDTQotCXRyaXN0YXRlCisJdHJpc3RhdGUgIlNhbXN1bmcgUENNIGludGVyZmFjZSBzdXBwb3J0IgogCiBjb25maWcgU05EX1NBTVNVTkdfQUM5NwogCXRyaXN0YXRlCiAJc2VsZWN0IFNORF9TT0NfQUM5N19CVVMKIAogY29uZmlnIFNORF9TQU1TVU5HX1NQRElGCi0JdHJpc3RhdGUKKwl0cmlzdGF0ZSAiU2Ftc3VuZyBTUERJRiB0cmFuc21pdHRlciBzdXBwb3J0IgogCXNlbGVjdCBTTkRfU09DX1NQRElGCiAKIGNvbmZpZyBTTkRfU0FNU1VOR19JMlMKLQl0cmlzdGF0ZQorCXRyaXN0YXRlICJTYW1zdW5nIEkyUyBpbnRlcmZhY2Ugc3VwcG9ydCIKIAogY29uZmlnIFNORF9TT0NfU0FNU1VOR19ORU8xOTczX1dNODc1MwogCXRyaXN0YXRlICJBdWRpbyBzdXBwb3J0IGZvciBPcGVubW9rbyBOZW8xOTczIFNtYXJ0cGhvbmVzIChHVEEwMikiCi0JZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgTUFDSF9ORU8xOTczX0dUQTAyCisJZGVwZW5kcyBvbiBNQUNIX05FTzE5NzNfR1RBMDIKIAlzZWxlY3QgU05EX1MzQzI0WFhfSTJTCiAJc2VsZWN0IFNORF9TT0NfV004NzUzCiAJc2VsZWN0IFNORF9TT0NfQlRfU0NPCkBAIC00Myw3ICs0NSw3IEBACiAKIGNvbmZpZyBTTkRfU09DX1NBTVNVTkdfSklWRV9XTTg3NTAKIAl0cmlzdGF0ZSAiU29DIEkyUyBBdWRpbyBzdXBwb3J0IGZvciBKaXZlIgotCWRlcGVuZHMgb24gU05EX1NPQ19TQU1TVU5HICYmIE1BQ0hfSklWRSAmJiBJMkMKKwlkZXBlbmRzIG9uIE1BQ0hfSklWRSAmJiBJMkMKIAlzZWxlY3QgU05EX1NPQ19XTTg3NTAKIAlzZWxlY3QgU05EX1MzQzI0MTJfU09DX0kyUwogCWhlbHAKQEAgLTUxLDcgKzUzLDcgQEAKIAogY29uZmlnIFNORF9TT0NfU0FNU1VOR19TTURLX1dNODU4MAogCXRyaXN0YXRlICJTb0MgSTJTIEF1ZGlvIHN1cHBvcnQgZm9yIFdNODU4MCBvbiBTTURLIgotCWRlcGVuZHMgb24gU05EX1NPQ19TQU1TVU5HICYmIChNQUNIX1NNREs2NDEwIHx8IE1BQ0hfU01ES0MxMDAgfHwgTUFDSF9TTURLVjIxMCB8fCBNQUNIX1NNREtDMTEwKQorCWRlcGVuZHMgb24gTUFDSF9TTURLNjQxMCB8fCBNQUNIX1NNREtDMTAwIHx8IE1BQ0hfU01ES1YyMTAgfHwgTUFDSF9TTURLQzExMAogCWRlcGVuZHMgb24gSTJDCiAJc2VsZWN0IFNORF9TT0NfV004NTgwCiAJc2VsZWN0IFNORF9TQU1TVU5HX0kyUwpAQCAtNjAsNyArNjIsNiBAQAogCiBjb25maWcgU05EX1NPQ19TQU1TVU5HX1NNREtfV004OTk0CiAJdHJpc3RhdGUgIlNvQyBJMlMgQXVkaW8gc3VwcG9ydCBmb3IgV004OTk0IG9uIFNNREsiCi0JZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcKIAlkZXBlbmRzIG9uIEkyQz15CiAJc2VsZWN0IE1GRF9XTTg5OTQKIAlzZWxlY3QgU05EX1NPQ19XTTg5OTQKQEAgLTcwLDcgKzcxLDcgQEAKIAogY29uZmlnIFNORF9TT0NfU0FNU1VOR19TTURLMjQ0M19XTTk3MTAKIAl0cmlzdGF0ZSAiU29DIEFDOTcgQXVkaW8gc3VwcG9ydCBmb3IgU01ESzI0NDMgLSBXTTk3MTAiCi0JZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgTUFDSF9TTURLMjQ0MworCWRlcGVuZHMgb24gTUFDSF9TTURLMjQ0MwogCXNlbGVjdCBBQzk3X0JVUwogCXNlbGVjdCBTTkRfU09DX0FDOTdfQ09ERUMKIAlzZWxlY3QgU05EX1NBTVNVTkdfQUM5NwpAQCAtODAsNyArODEsNyBAQAogCiBjb25maWcgU05EX1NPQ19TQU1TVU5HX0xOMjQ0MFNCQ19BTEM2NTAKIAl0cmlzdGF0ZSAiU29DIEFDOTcgQXVkaW8gc3VwcG9ydCBmb3IgTE4yNDQwU0JDIC0gQUxDNjUwIgotCWRlcGVuZHMgb24gU05EX1NPQ19TQU1TVU5HICYmIEFSQ0hfUzNDMjRYWAorCWRlcGVuZHMgb24gQVJDSF9TM0MyNFhYCiAJc2VsZWN0IEFDOTdfQlVTCiAJc2VsZWN0IFNORF9TT0NfQUM5N19DT0RFQwogCXNlbGVjdCBTTkRfU0FNU1VOR19BQzk3CkBAIC05MCw3ICs5MSw3IEBACiAKIGNvbmZpZyBTTkRfU09DX1NBTVNVTkdfUzNDMjRYWF9VREExMzRYCiAJdHJpc3RhdGUgIlNvQyBJMlMgQXVkaW8gc3VwcG9ydCBVREExMzRYIHdpcmVkIHRvIGEgUzNDMjRYWCIKLQlkZXBlbmRzIG9uIFNORF9TT0NfU0FNU1VORyAmJiBBUkNIX1MzQzI0WFgKKwlkZXBlbmRzIG9uIEFSQ0hfUzNDMjRYWAogCXNlbGVjdCBTTkRfUzNDMjRYWF9JMlMKIAlzZWxlY3QgU05EX1NPQ19MMwogCXNlbGVjdCBTTkRfU09DX1VEQTEzNFgKQEAgLTEwMiwyMSArMTAzLDIxIEBACiAKIGNvbmZpZyBTTkRfU09DX1NBTVNVTkdfU0lNVEVDX1RMVjMyMEFJQzIzCiAJdHJpc3RhdGUgIlNvQyBJMlMgQXVkaW8gc3VwcG9ydCBmb3IgVExWMzIwQUlDMjMgb24gU2ltdGVjIGJvYXJkcyIKLQlkZXBlbmRzIG9uIFNORF9TT0NfU0FNU1VORyAmJiBBUkNIX1MzQzI0WFggJiYgSTJDCisJZGVwZW5kcyBvbiBBUkNIX1MzQzI0WFggJiYgSTJDCiAJc2VsZWN0IFNORF9TM0MyNFhYX0kyUwogCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzIzX0kyQwogCXNlbGVjdCBTTkRfU09DX1NBTVNVTkdfU0lNVEVDCiAKIGNvbmZpZyBTTkRfU09DX1NBTVNVTkdfU0lNVEVDX0hFUk1FUwogCXRyaXN0YXRlICJTb0MgSTJTIEF1ZGlvIHN1cHBvcnQgZm9yIFNpbXRlYyBIZXJtZXMgYm9hcmQiCi0JZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgQVJDSF9TM0MyNFhYICYmIEkyQworCWRlcGVuZHMgb24gQVJDSF9TM0MyNFhYICYmIEkyQwogCXNlbGVjdCBTTkRfUzNDMjRYWF9JMlMKIAlzZWxlY3QgU05EX1NPQ19UTFYzMjBBSUMzWAogCXNlbGVjdCBTTkRfU09DX1NBTVNVTkdfU0lNVEVDCiAKIGNvbmZpZyBTTkRfU09DX1NBTVNVTkdfSDE5NDBfVURBMTM4MAogCXRyaXN0YXRlICJBdWRpbyBzdXBwb3J0IGZvciB0aGUgSFAgaVBBUSBIMTk0MCIKLQlkZXBlbmRzIG9uIFNORF9TT0NfU0FNU1VORyAmJiBBUkNIX0gxOTQwICYmIEkyQworCWRlcGVuZHMgb24gQVJDSF9IMTk0MCAmJiBJMkMKIAlzZWxlY3QgU05EX1MzQzI0WFhfSTJTCiAJc2VsZWN0IFNORF9TT0NfVURBMTM4MAogCWhlbHAKQEAgLTEyNCw3ICsxMjUsNyBAQAogCiBjb25maWcgU05EX1NPQ19TQU1TVU5HX1JYMTk1MF9VREExMzgwCiAJdHJpc3RhdGUgIkF1ZGlvIHN1cHBvcnQgZm9yIHRoZSBIUCBpUEFRIFJYMTk1MCIKLQlkZXBlbmRzIG9uIFNORF9TT0NfU0FNU1VORyAmJiBNQUNIX1JYMTk1MCAmJiBJMkMKKwlkZXBlbmRzIG9uIE1BQ0hfUlgxOTUwICYmIEkyQwogCXNlbGVjdCBTTkRfUzNDMjRYWF9JMlMKIAlzZWxlY3QgU05EX1NPQ19VREExMzgwCiAJaGVscApAQCAtMTMyLDcgKzEzMyw3IEBACiAKIGNvbmZpZyBTTkRfU09DX1NBTVNVTkdfU01ES19XTTk3MTMKIAl0cmlzdGF0ZSAiU29DIEFDOTcgQXVkaW8gc3VwcG9ydCBmb3IgU01ESyB3aXRoIFdNOTcxMyIKLQlkZXBlbmRzIG9uIFNORF9TT0NfU0FNU1VORyAmJiAoTUFDSF9TTURLNjQxMCB8fCBNQUNIX1NNREtDMTAwIHx8IE1BQ0hfU01ES1YyMTAgfHwgTUFDSF9TTURLQzExMCkKKwlkZXBlbmRzIG9uIE1BQ0hfU01ESzY0MTAgfHwgTUFDSF9TTURLQzEwMCB8fCBNQUNIX1NNREtWMjEwIHx8IE1BQ0hfU01ES0MxMTAKIAlzZWxlY3QgU05EX1NPQ19XTTk3MTMKIAlzZWxlY3QgU05EX1NBTVNVTkdfQUM5NwogCWhlbHAKQEAgLTE0MCwyMCArMTQxLDE5IEBACiAKIGNvbmZpZyBTTkRfU09DX1NNQVJUUQogCXRyaXN0YXRlICJTb0MgSTJTIEF1ZGlvIHN1cHBvcnQgZm9yIFNtYXJ0USBib2FyZCIKLQlkZXBlbmRzIG9uIFNORF9TT0NfU0FNU1VORyAmJiBNQUNIX1NNQVJUUSAmJiBJMkMKKwlkZXBlbmRzIG9uIE1BQ0hfU01BUlRRICYmIEkyQwogCXNlbGVjdCBTTkRfU0FNU1VOR19JMlMKIAlzZWxlY3QgU05EX1NPQ19XTTg3NTAKIAogY29uZmlnIFNORF9TT0NfU0FNU1VOR19TTURLX1NQRElGCiAJdHJpc3RhdGUgIlNvQyBTL1BESUYgQXVkaW8gc3VwcG9ydCBmb3IgU01ESyIKLQlkZXBlbmRzIG9uIFNORF9TT0NfU0FNU1VORwogCXNlbGVjdCBTTkRfU0FNU1VOR19TUERJRgogCWhlbHAKIAkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBTb0MgUy9QRElGIGF1ZGlvIG9uIHRoZSBTTURLLgogCiBjb25maWcgU05EX1NPQ19TTURLX1dNODU4MF9QQ00KIAl0cmlzdGF0ZSAiU29DIFBDTSBBdWRpbyBzdXBwb3J0IGZvciBXTTg1ODAgb24gU01ESyIKLQlkZXBlbmRzIG9uIFNORF9TT0NfU0FNU1VORyAmJiAoTUFDSF9TTURLVjIxMCB8fCBNQUNIX1NNREtDMTEwKQorCWRlcGVuZHMgb24gTUFDSF9TTURLVjIxMCB8fCBNQUNIX1NNREtDMTEwCiAJZGVwZW5kcyBvbiBJMkMKIAlzZWxlY3QgU05EX1NPQ19XTTg1ODAKIAlzZWxlY3QgU05EX1NBTVNVTkdfUENNCkBAIC0xNjIsNyArMTYyLDYgQEAKIAogY29uZmlnIFNORF9TT0NfU01ES19XTTg5OTRfUENNCiAJdHJpc3RhdGUgIlNvQyBQQ00gQXVkaW8gc3VwcG9ydCBmb3IgV004OTk0IG9uIFNNREsiCi0JZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcKIAlkZXBlbmRzIG9uIEkyQz15CiAJc2VsZWN0IE1GRF9XTTg5OTQKIAlzZWxlY3QgU05EX1NPQ19XTTg5OTQKQEAgLTE3Miw3ICsxNzEsNyBAQAogCiBjb25maWcgU05EX1NPQ19TUEVZU0lERQogCXRyaXN0YXRlICJBdWRpbyBzdXBwb3J0IGZvciBXb2xmc29uIFNwZXlzaWRlIgotCWRlcGVuZHMgb24gU05EX1NPQ19TQU1TVU5HICYmIEkyQyAmJiBTUElfTUFTVEVSCisJZGVwZW5kcyBvbiBJMkMgJiYgU1BJX01BU1RFUgogCWRlcGVuZHMgb24gTUFDSF9XTEZfQ1JBR0dfNjQxMCB8fCBDT01QSUxFX1RFU1QKIAlzZWxlY3QgU05EX1NBTVNVTkdfSTJTCiAJc2VsZWN0IFNORF9TT0NfV004OTk2CkBAIC0xODIsMTQgKzE4MSwxNCBAQAogCiBjb25maWcgU05EX1NPQ19UT0JFUk1PUlkKIAl0cmlzdGF0ZSAiQXVkaW8gc3VwcG9ydCBmb3IgV29sZnNvbiBUb2Jlcm1vcnkiCi0JZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgSU5QVVQgJiYgSTJDCisJZGVwZW5kcyBvbiBJTlBVVCAmJiBJMkMKIAlkZXBlbmRzIG9uIE1BQ0hfV0xGX0NSQUdHXzY0MTAgfHwgQ09NUElMRV9URVNUCiAJc2VsZWN0IFNORF9TQU1TVU5HX0kyUwogCXNlbGVjdCBTTkRfU09DX1dNODk2MgogCiBjb25maWcgU05EX1NPQ19CRUxMUwogCXRyaXN0YXRlICJBdWRpbyBzdXBwb3J0IGZvciBXb2xmc29uIEJlbGxzIgotCWRlcGVuZHMgb24gU05EX1NPQ19TQU1TVU5HICYmIE1GRF9BUklaT05BICYmIEkyQyAmJiBTUElfTUFTVEVSCisJZGVwZW5kcyBvbiBNRkRfQVJJWk9OQSAmJiBJMkMgJiYgU1BJX01BU1RFUgogCWRlcGVuZHMgb24gTUFDSF9XTEZfQ1JBR0dfNjQxMCB8fCBDT01QSUxFX1RFU1QKIAlzZWxlY3QgU05EX1NBTVNVTkdfSTJTCiAJc2VsZWN0IFNORF9TT0NfV001MTAyCkBAIC0yMDAsNyArMTk5LDcgQEAKIAogY29uZmlnIFNORF9TT0NfTE9XTEFORAogCXRyaXN0YXRlICJBdWRpbyBzdXBwb3J0IGZvciBXb2xmc29uIExvd2xhbmQiCi0JZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgSTJDCisJZGVwZW5kcyBvbiBJMkMKIAlkZXBlbmRzIG9uIE1BQ0hfV0xGX0NSQUdHXzY0MTAgfHwgQ09NUElMRV9URVNUCiAJc2VsZWN0IFNORF9TQU1TVU5HX0kyUwogCXNlbGVjdCBTTkRfU09DX1dNNTEwMApAQCAtMjA4LDcgKzIwNyw3IEBACiAKIGNvbmZpZyBTTkRfU09DX0xJVFRMRU1JTEwKIAl0cmlzdGF0ZSAiQXVkaW8gc3VwcG9ydCBmb3IgV29sZnNvbiBMaXR0bGVtaWxsIgotCWRlcGVuZHMgb24gU05EX1NPQ19TQU1TVU5HICYmIEkyQworCWRlcGVuZHMgb24gSTJDCiAJZGVwZW5kcyBvbiBNQUNIX1dMRl9DUkFHR182NDEwIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBTTkRfU0FNU1VOR19JMlMKIAlzZWxlY3QgTUZEX1dNODk5NApAQCAtMjE2LDcgKzIxNSw3IEBACiAKIGNvbmZpZyBTTkRfU09DX1NOT1cKIAl0cmlzdGF0ZSAiQXVkaW8gc3VwcG9ydCBmb3IgR29vZ2xlIFNub3cgYm9hcmRzIgotCWRlcGVuZHMgb24gU05EX1NPQ19TQU1TVU5HICYmIEkyQworCWRlcGVuZHMgb24gSTJDCiAJc2VsZWN0IFNORF9TT0NfTUFYOTgwOTAKIAlzZWxlY3QgU05EX1NPQ19NQVg5ODA5NQogCXNlbGVjdCBTTkRfU0FNU1VOR19JMlMKQEAgLTIyNiw2ICsyMjUsOCBAQAogCiBjb25maWcgU05EX1NPQ19BUk5EQUxFX1JUNTYzMV9BTEM1NjMxCiAgICAgICAgIHRyaXN0YXRlICJBdWRpbyBzdXBwb3J0IGZvciBSVDU2MzEoQUxDNTYzMSkgb24gQXJuZGFsZSBCb2FyZCIKLSAgICAgICAgZGVwZW5kcyBvbiBTTkRfU09DX1NBTVNVTkcgJiYgSTJDCisgICAgICAgIGRlcGVuZHMgb24gSTJDCiAgICAgICAgIHNlbGVjdCBTTkRfU0FNU1VOR19JMlMKICAgICAgICAgc2VsZWN0IFNORF9TT0NfUlQ1NjMxCisKK2VuZGlmICNTTkRfU09DX1NBTVNVTkcKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL2FjOTcuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL2FjOTcuYwppbmRleCA1NDdkMzEwLi45N2Q2NzAwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9hYzk3LmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvYWM5Ny5jCkBAIC0zOCwxNiArMzgsMTYgQEAKIH07CiBzdGF0aWMgc3RydWN0IHMzY19hYzk3X2luZm8gczNjX2FjOTc7CiAKLXN0YXRpYyBzdHJ1Y3QgczNjX2RtYV9wYXJhbXMgczNjX2FjOTdfcGNtX291dCA9IHsKLQkuZG1hX3NpemUJPSA0LAorc3RhdGljIHN0cnVjdCBzbmRfZG1hZW5naW5lX2RhaV9kbWFfZGF0YSBzM2NfYWM5N19wY21fb3V0ID0geworCS5hZGRyX3dpZHRoCT0gNCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgczNjX2RtYV9wYXJhbXMgczNjX2FjOTdfcGNtX2luID0gewotCS5kbWFfc2l6ZQk9IDQsCitzdGF0aWMgc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhIHMzY19hYzk3X3BjbV9pbiA9IHsKKwkuYWRkcl93aWR0aAk9IDQsCiB9OwogCi1zdGF0aWMgc3RydWN0IHMzY19kbWFfcGFyYW1zIHMzY19hYzk3X21pY19pbiA9IHsKLQkuZG1hX3NpemUJPSA0LAorc3RhdGljIHN0cnVjdCBzbmRfZG1hZW5naW5lX2RhaV9kbWFfZGF0YSBzM2NfYWM5N19taWNfaW4gPSB7CisJLmFkZHJfd2lkdGgJPSA0LAogfTsKIAogc3RhdGljIHZvaWQgczNjX2FjOTdfYWN0aXZhdGUoc3RydWN0IHNuZF9hYzk3ICphYzk3KQpAQCAtNzQsNyArNzQsNyBAQAogCXdyaXRlbChhY19nbGJjdHJsLCBzM2NfYWM5Ny5yZWdzICsgUzNDX0FDOTdfR0xCQ1RSTCk7CiAKIAlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmczNjX2FjOTcuZG9uZSwgSFopKQotCQlwcl9lcnIoIkFDOTc6IFVuYWJsZSB0byBhY3RpdmF0ZSEiKTsKKwkJcHJfZXJyKCJBQzk3OiBVbmFibGUgdG8gYWN0aXZhdGUhXG4iKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIHNob3J0IHMzY19hYzk3X3JlYWQoc3RydWN0IHNuZF9hYzk3ICphYzk3LApAQCAtMTAwLDcgKzEwMCw3IEBACiAJd3JpdGVsKGFjX2dsYmN0cmwsIHMzY19hYzk3LnJlZ3MgKyBTM0NfQUM5N19HTEJDVFJMKTsKIAogCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZzM2NfYWM5Ny5kb25lLCBIWikpCi0JCXByX2VycigiQUM5NzogVW5hYmxlIHRvIHJlYWQhIik7CisJCXByX2VycigiQUM5NzogVW5hYmxlIHRvIHJlYWQhXG4iKTsKIAogCXN0YXQgPSByZWFkbChzM2NfYWM5Ny5yZWdzICsgUzNDX0FDOTdfU1RBVCk7CiAJYWRkciA9IChzdGF0ID4+IDE2KSAmIDB4N2Y7CkBAIC0xMzcsNyArMTM3LDcgQEAKIAl3cml0ZWwoYWNfZ2xiY3RybCwgczNjX2FjOTcucmVncyArIFMzQ19BQzk3X0dMQkNUUkwpOwogCiAJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnMzY19hYzk3LmRvbmUsIEhaKSkKLQkJcHJfZXJyKCJBQzk3OiBVbmFibGUgdG8gd3JpdGUhIik7CisJCXByX2VycigiQUM5NzogVW5hYmxlIHRvIHdyaXRlIVxuIik7CiAKIAlhY19jb2RlY19jbWQgPSByZWFkbChzM2NfYWM5Ny5yZWdzICsgUzNDX0FDOTdfQ09ERUNfQ01EKTsKIAlhY19jb2RlY19jbWQgfD0gUzNDX0FDOTdfQ09ERUNfQ01EX1JFQUQ7CkBAIC0yNzMsMTQgKzI3MywxNCBAQAogCiBzdGF0aWMgaW50IHMzY19hYzk3X2RhaV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKIHsKLQlzYW1zdW5nX2Fzb2NfaW5pdF9kbWFfZGF0YShkYWksICZzM2NfYWM5N19wY21fb3V0LCAmczNjX2FjOTdfcGNtX2luKTsKKwlzbmRfc29jX2RhaV9pbml0X2RtYV9kYXRhKGRhaSwgJnMzY19hYzk3X3BjbV9vdXQsICZzM2NfYWM5N19wY21faW4pOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgczNjX2FjOTdfbWljX2RhaV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKIHsKLQlzYW1zdW5nX2Fzb2NfaW5pdF9kbWFfZGF0YShkYWksIE5VTEwsICZzM2NfYWM5N19taWNfaW4pOworCXNuZF9zb2NfZGFpX2luaXRfZG1hX2RhdGEoZGFpLCBOVUxMLCAmczNjX2FjOTdfbWljX2luKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzQ2LDEyICszNDYsMTIgQEAKIAlpZiAoSVNfRVJSKHMzY19hYzk3LnJlZ3MpKQogCQlyZXR1cm4gUFRSX0VSUihzM2NfYWM5Ny5yZWdzKTsKIAotCXMzY19hYzk3X3BjbV9vdXQuc2xhdmUgPSBhYzk3X3BkYXRhLT5kbWFfcGxheWJhY2s7Ci0JczNjX2FjOTdfcGNtX291dC5kbWFfYWRkciA9IG1lbV9yZXMtPnN0YXJ0ICsgUzNDX0FDOTdfUENNX0RBVEE7Ci0JczNjX2FjOTdfcGNtX2luLnNsYXZlID0gYWM5N19wZGF0YS0+ZG1hX2NhcHR1cmU7Ci0JczNjX2FjOTdfcGNtX2luLmRtYV9hZGRyID0gbWVtX3Jlcy0+c3RhcnQgKyBTM0NfQUM5N19QQ01fREFUQTsKLQlzM2NfYWM5N19taWNfaW4uc2xhdmUgPSBhYzk3X3BkYXRhLT5kbWFfY2FwdHVyZV9taWM7Ci0JczNjX2FjOTdfbWljX2luLmRtYV9hZGRyID0gbWVtX3Jlcy0+c3RhcnQgKyBTM0NfQUM5N19NSUNfREFUQTsKKwlzM2NfYWM5N19wY21fb3V0LmZpbHRlcl9kYXRhID0gYWM5N19wZGF0YS0+ZG1hX3BsYXliYWNrOworCXMzY19hYzk3X3BjbV9vdXQuYWRkciA9IG1lbV9yZXMtPnN0YXJ0ICsgUzNDX0FDOTdfUENNX0RBVEE7CisJczNjX2FjOTdfcGNtX2luLmZpbHRlcl9kYXRhID0gYWM5N19wZGF0YS0+ZG1hX2NhcHR1cmU7CisJczNjX2FjOTdfcGNtX2luLmFkZHIgPSBtZW1fcmVzLT5zdGFydCArIFMzQ19BQzk3X1BDTV9EQVRBOworCXMzY19hYzk3X21pY19pbi5maWx0ZXJfZGF0YSA9IGFjOTdfcGRhdGEtPmRtYV9jYXB0dXJlX21pYzsKKwlzM2NfYWM5N19taWNfaW4uYWRkciA9IG1lbV9yZXMtPnN0YXJ0ICsgUzNDX0FDOTdfTUlDX0RBVEE7CiAKIAlpbml0X2NvbXBsZXRpb24oJnMzY19hYzk3LmRvbmUpOwogCW11dGV4X2luaXQoJnMzY19hYzk3LmxvY2spOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvZG1hLmggYi9zb3VuZC9zb2Mvc2Ftc3VuZy9kbWEuaAppbmRleCAzODMwZjI5Li43YWU1ODBkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9kbWEuaAorKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9kbWEuaApAQCAtMSw2ICsxLDQgQEAKIC8qCi0gKiAgZG1hLmggLS0KLSAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCiAgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCkBAIC05LDI3ICs3LDE1IEBACiAgKiAgQUxTQSBQQ00gaW50ZXJmYWNlIGZvciB0aGUgU2Ftc3VuZyBTb0MKICAqLwogCi0jaWZuZGVmIF9TM0NfQVVESU9fSAotI2RlZmluZSBfUzNDX0FVRElPX0gKKyNpZm5kZWYgX1NBTVNVTkdfRE1BX0gKKyNkZWZpbmUgX1NBTVNVTkdfRE1BX0gKIAogI2luY2x1ZGUgPHNvdW5kL2RtYWVuZ2luZV9wY20uaD4KLSNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KIAotc3RydWN0IHMzY19kbWFfcGFyYW1zIHsKLQl2b2lkICpzbGF2ZTsJCQkJLyogQ2hhbm5lbCBJRCAqLwotCWRtYV9hZGRyX3QgZG1hX2FkZHI7Ci0JaW50IGRtYV9zaXplOwkJCS8qIFNpemUgb2YgdGhlIERNQSB0cmFuc2ZlciAqLwotCWNoYXIgKmNoX25hbWU7Ci0Jc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhIGRtYV9kYXRhOwotfTsKLQotdm9pZCBzYW1zdW5nX2Fzb2NfaW5pdF9kbWFfZGF0YShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKLQkJCQlzdHJ1Y3QgczNjX2RtYV9wYXJhbXMgKnBsYXliYWNrLAotCQkJCXN0cnVjdCBzM2NfZG1hX3BhcmFtcyAqY2FwdHVyZSk7CiAvKgogICogQHR4LCBAcnggYXJndW1lbnRzIGNhbiBiZSBOVUxMIGlmIHRoZSBETUEgY2hhbm5lbCBuYW1lcyBhcmUgInR4IiwgInJ4IiwKICAqIG90aGVyd2lzZSBhY3R1YWwgRE1BIGNoYW5uZWwgbmFtZXMgbXVzdCBiZSBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbi4KICAqLwogaW50IHNhbXN1bmdfYXNvY19kbWFfcGxhdGZvcm1fcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfZmlsdGVyX2ZuIGZpbHRlciwKIAkJCQkgICAgICAgY29uc3QgY2hhciAqdHgsIGNvbnN0IGNoYXIgKnJ4KTsKLSNlbmRpZgorI2VuZGlmIC8qIF9TQU1TVU5HX0RNQV9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9kbWFlbmdpbmUuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL2RtYWVuZ2luZS5jCmluZGV4IDJjODdmMzguLjkxMDRjOTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL2RtYWVuZ2luZS5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL2RtYWVuZ2luZS5jCkBAIC0xNiw0OSArMTYsMTggQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvYW1iYS9wbDA4eC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvZG1hLXMzYzI0eHguaD4KLQogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvZG1hZW5naW5lX3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy1kYWkuaD4KIAogI2luY2x1ZGUgImRtYS5oIgogCi12b2lkIHNhbXN1bmdfYXNvY19pbml0X2RtYV9kYXRhKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAotCQkJCXN0cnVjdCBzM2NfZG1hX3BhcmFtcyAqcGxheWJhY2ssCi0JCQkJc3RydWN0IHMzY19kbWFfcGFyYW1zICpjYXB0dXJlKQotewotCXN0cnVjdCBzbmRfZG1hZW5naW5lX2RhaV9kbWFfZGF0YSAqcGxheWJhY2tfZGF0YSA9IE5VTEw7Ci0Jc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhICpjYXB0dXJlX2RhdGEgPSBOVUxMOwotCi0JaWYgKHBsYXliYWNrKSB7Ci0JCXBsYXliYWNrX2RhdGEgPSAmcGxheWJhY2stPmRtYV9kYXRhOwotCQlwbGF5YmFja19kYXRhLT5maWx0ZXJfZGF0YSA9IHBsYXliYWNrLT5zbGF2ZTsKLQkJcGxheWJhY2tfZGF0YS0+Y2hhbl9uYW1lID0gcGxheWJhY2stPmNoX25hbWU7Ci0JCXBsYXliYWNrX2RhdGEtPmFkZHIgPSBwbGF5YmFjay0+ZG1hX2FkZHI7Ci0JCXBsYXliYWNrX2RhdGEtPmFkZHJfd2lkdGggPSBwbGF5YmFjay0+ZG1hX3NpemU7Ci0JfQotCWlmIChjYXB0dXJlKSB7Ci0JCWNhcHR1cmVfZGF0YSA9ICZjYXB0dXJlLT5kbWFfZGF0YTsKLQkJY2FwdHVyZV9kYXRhLT5maWx0ZXJfZGF0YSA9IGNhcHR1cmUtPnNsYXZlOwotCQljYXB0dXJlX2RhdGEtPmNoYW5fbmFtZSA9IGNhcHR1cmUtPmNoX25hbWU7Ci0JCWNhcHR1cmVfZGF0YS0+YWRkciA9IGNhcHR1cmUtPmRtYV9hZGRyOwotCQljYXB0dXJlX2RhdGEtPmFkZHJfd2lkdGggPSBjYXB0dXJlLT5kbWFfc2l6ZTsKLQl9Ci0KLQlzbmRfc29jX2RhaV9pbml0X2RtYV9kYXRhKGRhaSwgcGxheWJhY2tfZGF0YSwgY2FwdHVyZV9kYXRhKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNhbXN1bmdfYXNvY19pbml0X2RtYV9kYXRhKTsKLQogaW50IHNhbXN1bmdfYXNvY19kbWFfcGxhdGZvcm1fcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfZmlsdGVyX2ZuIGZpbHRlciwKIAkJCQkgICAgICAgY29uc3QgY2hhciAqdHgsIGNvbnN0IGNoYXIgKnJ4KQogewogCXVuc2lnbmVkIGludCBmbGFncyA9IFNORF9ETUFFTkdJTkVfUENNX0ZMQUdfQ09NUEFUOwotCiAJc3RydWN0IHNuZF9kbWFlbmdpbmVfcGNtX2NvbmZpZyAqcGNtX2NvbmY7CiAKIAlwY21fY29uZiA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcGNtX2NvbmYpLCBHRlBfS0VSTkVMKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL2kycy5jIGIvc291bmQvc29jL3NhbXN1bmcvaTJzLmMKaW5kZXggNTA2MzVlZS4uN2UzMmNmNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvaTJzLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvaTJzLmMKQEAgLTg3LDkgKzg3LDkgQEAKIAkvKiBEcml2ZXIgZm9yIHRoaXMgREFJICovCiAJc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBpMnNfZGFpX2RydjsKIAkvKiBETUEgcGFyYW1ldGVycyAqLwotCXN0cnVjdCBzM2NfZG1hX3BhcmFtcyBkbWFfcGxheWJhY2s7Ci0Jc3RydWN0IHMzY19kbWFfcGFyYW1zIGRtYV9jYXB0dXJlOwotCXN0cnVjdCBzM2NfZG1hX3BhcmFtcyBpZG1hX3BsYXliYWNrOworCXN0cnVjdCBzbmRfZG1hZW5naW5lX2RhaV9kbWFfZGF0YSBkbWFfcGxheWJhY2s7CisJc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhIGRtYV9jYXB0dXJlOworCXN0cnVjdCBzbmRfZG1hZW5naW5lX2RhaV9kbWFfZGF0YSBpZG1hX3BsYXliYWNrOwogCWRtYV9maWx0ZXJfZm4gZmlsdGVyOwogCXUzMglxdWlya3M7CiAJdTMyCXN1c3BlbmRfaTJzbW9kOwpAQCAtNjkyLDE1ICs2OTIsMTUgQEAKIAkJYnJlYWs7CiAJY2FzZSAyOgogCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKLQkJCWkycy0+ZG1hX3BsYXliYWNrLmRtYV9zaXplID0gNDsKKwkJCWkycy0+ZG1hX3BsYXliYWNrLmFkZHJfd2lkdGggPSA0OwogCQllbHNlCi0JCQlpMnMtPmRtYV9jYXB0dXJlLmRtYV9zaXplID0gNDsKKwkJCWkycy0+ZG1hX2NhcHR1cmUuYWRkcl93aWR0aCA9IDQ7CiAJCWJyZWFrOwogCWNhc2UgMToKIAkJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCi0JCQlpMnMtPmRtYV9wbGF5YmFjay5kbWFfc2l6ZSA9IDI7CisJCQlpMnMtPmRtYV9wbGF5YmFjay5hZGRyX3dpZHRoID0gMjsKIAkJZWxzZQotCQkJaTJzLT5kbWFfY2FwdHVyZS5kbWFfc2l6ZSA9IDI7CisJCQlpMnMtPmRtYV9jYXB0dXJlLmFkZHJfd2lkdGggPSAyOwogCiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC03NTQsNyArNzU0LDcgQEAKIAl3cml0ZWwobW9kLCBpMnMtPmFkZHIgKyBJMlNNT0QpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaTJzLT5sb2NrLCBmbGFncyk7CiAKLQlzYW1zdW5nX2Fzb2NfaW5pdF9kbWFfZGF0YShkYWksICZpMnMtPmRtYV9wbGF5YmFjaywgJmkycy0+ZG1hX2NhcHR1cmUpOworCXNuZF9zb2NfZGFpX2luaXRfZG1hX2RhdGEoZGFpLCAmaTJzLT5kbWFfcGxheWJhY2ssICZpMnMtPmRtYV9jYXB0dXJlKTsKIAogCWkycy0+ZnJtY2xrID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKIApAQCAtOTkxLDEwICs5OTEsMTAgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKGlzX3NlY29uZGFyeShpMnMpKSB7IC8qIElmIHRoaXMgaXMgcHJvYmUgb24gdGhlIHNlY29uZGFyeSBEQUkgKi8KLQkJc2Ftc3VuZ19hc29jX2luaXRfZG1hX2RhdGEoZGFpLCAmb3RoZXItPnNlY19kYWktPmRtYV9wbGF5YmFjaywKKwkJc25kX3NvY19kYWlfaW5pdF9kbWFfZGF0YShkYWksICZvdGhlci0+c2VjX2RhaS0+ZG1hX3BsYXliYWNrLAogCQkJCQkgICBOVUxMKTsKIAl9IGVsc2UgewotCQlzYW1zdW5nX2Fzb2NfaW5pdF9kbWFfZGF0YShkYWksICZpMnMtPmRtYV9wbGF5YmFjaywKKwkJc25kX3NvY19kYWlfaW5pdF9kbWFfZGF0YShkYWksICZpMnMtPmRtYV9wbGF5YmFjaywKIAkJCQkJICAgJmkycy0+ZG1hX2NhcHR1cmUpOwogCiAJCWlmIChpMnMtPnF1aXJrcyAmIFFVSVJLX05FRURfUlNUQ0xSKQpAQCAtMTAwMiw3ICsxMDAyLDcgQEAKIAogCQlpZiAoaTJzLT5xdWlya3MgJiBRVUlSS19TVVBQT1JUU19JRE1BKQogCQkJaWRtYV9yZWdfYWRkcl9pbml0KGkycy0+YWRkciwKLQkJCQkJaTJzLT5zZWNfZGFpLT5pZG1hX3BsYXliYWNrLmRtYV9hZGRyKTsKKwkJCQkJaTJzLT5zZWNfZGFpLT5pZG1hX3BsYXliYWNrLmFkZHIpOwogCX0KIAogCS8qIFJlc2V0IGFueSBjb25zdHJhaW50IG9uIFJGUyBhbmQgQkZTICovCkBAIC0xMjYyLDggKzEyNjIsOCBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAotCQlwcmlfZGFpLT5kbWFfcGxheWJhY2suc2xhdmUgPSBpMnNfcGRhdGEtPmRtYV9wbGF5YmFjazsKLQkJcHJpX2RhaS0+ZG1hX2NhcHR1cmUuc2xhdmUgPSBpMnNfcGRhdGEtPmRtYV9jYXB0dXJlOworCQlwcmlfZGFpLT5kbWFfcGxheWJhY2suZmlsdGVyX2RhdGEgPSBpMnNfcGRhdGEtPmRtYV9wbGF5YmFjazsKKwkJcHJpX2RhaS0+ZG1hX2NhcHR1cmUuZmlsdGVyX2RhdGEgPSBpMnNfcGRhdGEtPmRtYV9jYXB0dXJlOwogCQlwcmlfZGFpLT5maWx0ZXIgPSBpMnNfcGRhdGEtPmRtYV9maWx0ZXI7CiAKIAkJaWYgKCZpMnNfcGRhdGEtPnR5cGUpCkBAIC0xMzAyLDEyICsxMzAyLDEyIEBACiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBlbmFibGUgY2xvY2s6ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KLQlwcmlfZGFpLT5kbWFfcGxheWJhY2suZG1hX2FkZHIgPSByZWdzX2Jhc2UgKyBJMlNUWEQ7Ci0JcHJpX2RhaS0+ZG1hX2NhcHR1cmUuZG1hX2FkZHIgPSByZWdzX2Jhc2UgKyBJMlNSWEQ7Ci0JcHJpX2RhaS0+ZG1hX3BsYXliYWNrLmNoX25hbWUgPSAidHgiOwotCXByaV9kYWktPmRtYV9jYXB0dXJlLmNoX25hbWUgPSAicngiOwotCXByaV9kYWktPmRtYV9wbGF5YmFjay5kbWFfc2l6ZSA9IDQ7Ci0JcHJpX2RhaS0+ZG1hX2NhcHR1cmUuZG1hX3NpemUgPSA0OworCXByaV9kYWktPmRtYV9wbGF5YmFjay5hZGRyID0gcmVnc19iYXNlICsgSTJTVFhEOworCXByaV9kYWktPmRtYV9jYXB0dXJlLmFkZHIgPSByZWdzX2Jhc2UgKyBJMlNSWEQ7CisJcHJpX2RhaS0+ZG1hX3BsYXliYWNrLmNoYW5fbmFtZSA9ICJ0eCI7CisJcHJpX2RhaS0+ZG1hX2NhcHR1cmUuY2hhbl9uYW1lID0gInJ4IjsKKwlwcmlfZGFpLT5kbWFfcGxheWJhY2suYWRkcl93aWR0aCA9IDQ7CisJcHJpX2RhaS0+ZG1hX2NhcHR1cmUuYWRkcl93aWR0aCA9IDQ7CiAJcHJpX2RhaS0+cXVpcmtzID0gcXVpcmtzOwogCXByaV9kYWktPnZhcmlhbnRfcmVncyA9IGkyc19kYWlfZGF0YS0+aTJzX3ZhcmlhbnRfcmVnczsKIApAQCAtMTMxOCwzMSArMTMxOCwzMyBAQAogCQlzZWNfZGFpID0gaTJzX2FsbG9jX2RhaShwZGV2LCB0cnVlKTsKIAkJaWYgKCFzZWNfZGFpKSB7CiAJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gYWxsb2MgSTJTX3NlY1xuIik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGVycl9kaXNhYmxlX2NsazsKIAkJfQogCiAJCXNlY19kYWktPmxvY2sgPSAmcHJpX2RhaS0+c3BpbmxvY2s7CiAJCXNlY19kYWktPnZhcmlhbnRfcmVncyA9IHByaV9kYWktPnZhcmlhbnRfcmVnczsKLQkJc2VjX2RhaS0+ZG1hX3BsYXliYWNrLmRtYV9hZGRyID0gcmVnc19iYXNlICsgSTJTVFhEUzsKLQkJc2VjX2RhaS0+ZG1hX3BsYXliYWNrLmNoX25hbWUgPSAidHgtc2VjIjsKKwkJc2VjX2RhaS0+ZG1hX3BsYXliYWNrLmFkZHIgPSByZWdzX2Jhc2UgKyBJMlNUWERTOworCQlzZWNfZGFpLT5kbWFfcGxheWJhY2suY2hhbl9uYW1lID0gInR4LXNlYyI7CiAKIAkJaWYgKCFucCkgewotCQkJc2VjX2RhaS0+ZG1hX3BsYXliYWNrLnNsYXZlID0gaTJzX3BkYXRhLT5kbWFfcGxheV9zZWM7CisJCQlzZWNfZGFpLT5kbWFfcGxheWJhY2suZmlsdGVyX2RhdGEgPSBpMnNfcGRhdGEtPmRtYV9wbGF5X3NlYzsKIAkJCXNlY19kYWktPmZpbHRlciA9IGkyc19wZGF0YS0+ZG1hX2ZpbHRlcjsKIAkJfQogCi0JCXNlY19kYWktPmRtYV9wbGF5YmFjay5kbWFfc2l6ZSA9IDQ7CisJCXNlY19kYWktPmRtYV9wbGF5YmFjay5hZGRyX3dpZHRoID0gNDsKIAkJc2VjX2RhaS0+YWRkciA9IHByaV9kYWktPmFkZHI7CiAJCXNlY19kYWktPmNsayA9IHByaV9kYWktPmNsazsKIAkJc2VjX2RhaS0+cXVpcmtzID0gcXVpcmtzOwotCQlzZWNfZGFpLT5pZG1hX3BsYXliYWNrLmRtYV9hZGRyID0gaWRtYV9hZGRyOworCQlzZWNfZGFpLT5pZG1hX3BsYXliYWNrLmFkZHIgPSBpZG1hX2FkZHI7CiAJCXNlY19kYWktPnByaV9kYWkgPSBwcmlfZGFpOwogCQlwcmlfZGFpLT5zZWNfZGFpID0gc2VjX2RhaTsKIAl9CiAKIAlpZiAoaTJzX3BkYXRhICYmIGkyc19wZGF0YS0+Y2ZnX2dwaW8gJiYgaTJzX3BkYXRhLT5jZmdfZ3BpbyhwZGV2KSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gY29uZmlndXJlIGdwaW9cbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfZGlzYWJsZV9jbGs7CiAJfQogCiAJcmV0ID0gZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcHJpX2RhaS0+cGRldi0+ZGV2LApAQCAtMTM2Niw2ICsxMzY4LDggQEAKIGVycl9mcmVlX2RhaToKIAlpZiAoc2VjX2RhaSkKIAkJaTJzX2ZyZWVfc2VjX2RhaShzZWNfZGFpKTsKK2Vycl9kaXNhYmxlX2NsazoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpX2RhaS0+Y2xrKTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9pZG1hLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9pZG1hLmMKaW5kZXggNGVkMjlmZi4uM2U0MDgxNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvaWRtYS5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL2lkbWEuYwpAQCAtMjIsNyArMjIsNiBAQAogCiAjaW5jbHVkZSAiaTJzLmgiCiAjaW5jbHVkZSAiaWRtYS5oIgotI2luY2x1ZGUgImRtYS5oIgogI2luY2x1ZGUgImkycy1yZWdzLmgiCiAKICNkZWZpbmUgU1RfUlVOTklORwkJKDE8PDApCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9wY20uYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3BjbS5jCmluZGV4IDQ5MGMxYTguLjQzZTM2N2EgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL3BjbS5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3BjbS5jCkBAIC0xMjcsMjUgKzEyNywyNSBAQAogCXN0cnVjdCBjbGsJKnBjbGs7CiAJc3RydWN0IGNsawkqY2NsazsKIAotCXN0cnVjdCBzM2NfZG1hX3BhcmFtcwkqZG1hX3BsYXliYWNrOwotCXN0cnVjdCBzM2NfZG1hX3BhcmFtcwkqZG1hX2NhcHR1cmU7CisJc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhICpkbWFfcGxheWJhY2s7CisJc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhICpkbWFfY2FwdHVyZTsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgczNjX2RtYV9wYXJhbXMgczNjX3BjbV9zdGVyZW9fb3V0W10gPSB7CitzdGF0aWMgc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhIHMzY19wY21fc3RlcmVvX291dFtdID0gewogCVswXSA9IHsKLQkJLmRtYV9zaXplCT0gNCwKKwkJLmFkZHJfd2lkdGgJPSA0LAogCX0sCiAJWzFdID0gewotCQkuZG1hX3NpemUJPSA0LAorCQkuYWRkcl93aWR0aAk9IDQsCiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgczNjX2RtYV9wYXJhbXMgczNjX3BjbV9zdGVyZW9faW5bXSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9kYWlfZG1hX2RhdGEgczNjX3BjbV9zdGVyZW9faW5bXSA9IHsKIAlbMF0gPSB7Ci0JCS5kbWFfc2l6ZQk9IDQsCisJCS5hZGRyX3dpZHRoCT0gNCwKIAl9LAogCVsxXSA9IHsKLQkJLmRtYV9zaXplCT0gNCwKKwkJLmFkZHJfd2lkdGgJPSA0LAogCX0sCiB9OwogCkBAIC01NTIsMTUgKzU1MiwxMyBAQAogCX0KIAljbGtfcHJlcGFyZV9lbmFibGUocGNtLT5wY2xrKTsKIAotCXMzY19wY21fc3RlcmVvX2luW3BkZXYtPmlkXS5kbWFfYWRkciA9IG1lbV9yZXMtPnN0YXJ0Ci0JCQkJCQkJKyBTM0NfUENNX1JYRklGTzsKLQlzM2NfcGNtX3N0ZXJlb19vdXRbcGRldi0+aWRdLmRtYV9hZGRyID0gbWVtX3Jlcy0+c3RhcnQKLQkJCQkJCQkrIFMzQ19QQ01fVFhGSUZPOworCXMzY19wY21fc3RlcmVvX2luW3BkZXYtPmlkXS5hZGRyID0gbWVtX3Jlcy0+c3RhcnQgKyBTM0NfUENNX1JYRklGTzsKKwlzM2NfcGNtX3N0ZXJlb19vdXRbcGRldi0+aWRdLmFkZHIgPSBtZW1fcmVzLT5zdGFydCArIFMzQ19QQ01fVFhGSUZPOwogCiAJZmlsdGVyID0gTlVMTDsKIAlpZiAocGNtX3BkYXRhKSB7Ci0JCXMzY19wY21fc3RlcmVvX2luW3BkZXYtPmlkXS5zbGF2ZSA9IHBjbV9wZGF0YS0+ZG1hX2NhcHR1cmU7Ci0JCXMzY19wY21fc3RlcmVvX291dFtwZGV2LT5pZF0uc2xhdmUgPSBwY21fcGRhdGEtPmRtYV9wbGF5YmFjazsKKwkJczNjX3BjbV9zdGVyZW9faW5bcGRldi0+aWRdLmZpbHRlcl9kYXRhID0gcGNtX3BkYXRhLT5kbWFfY2FwdHVyZTsKKwkJczNjX3BjbV9zdGVyZW9fb3V0W3BkZXYtPmlkXS5maWx0ZXJfZGF0YSA9IHBjbV9wZGF0YS0+ZG1hX3BsYXliYWNrOwogCQlmaWx0ZXIgPSBwY21fcGRhdGEtPmRtYV9maWx0ZXI7CiAJfQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MtaTJzLXYyLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MtaTJzLXYyLmMKaW5kZXggYmY4YWU3OS4uNjQ0ZjE4NiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvczNjLWkycy12Mi5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3MzYy1pMnMtdjIuYwpAQCAtMjQsNyArMjQsNiBAQAogCiAjaW5jbHVkZSAicmVncy1pMnMtdjIuaCIKICNpbmNsdWRlICJzM2MtaTJzLXYyLmgiCi0jaW5jbHVkZSAiZG1hLmgiCiAKICN1bmRlZiBTM0NfSUlTX1YyX1NVUFBPUlRFRAogCkBAIC0zMDIsNyArMzAxLDcgQEAKIAkJCQkgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCiB7CiAJc3RydWN0IHMzY19pMnN2Ml9pbmZvICppMnMgPSB0b19pbmZvKGRhaSk7Ci0Jc3RydWN0IHMzY19kbWFfcGFyYW1zICpkbWFfZGF0YTsKKwlzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9kYWlfZG1hX2RhdGEgKmRtYV9kYXRhOwogCXUzMiBpaXNtb2Q7CiAKIAlwcl9kZWJ1ZygiRW50ZXJlZCAlc1xuIiwgX19mdW5jX18pOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvczNjLWkycy12Mi5oIGIvc291bmQvc29jL3NhbXN1bmcvczNjLWkycy12Mi5oCmluZGV4IGQwNjg0MTQuLjE4MmQ4MDUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL3MzYy1pMnMtdjIuaAorKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MtaTJzLXYyLmgKQEAgLTYwLDggKzYwLDggQEAKIAogCXVuc2lnbmVkIGNoYXIJIG1hc3RlcjsKIAotCXN0cnVjdCBzM2NfZG1hX3BhcmFtcwkqZG1hX3BsYXliYWNrOwotCXN0cnVjdCBzM2NfZG1hX3BhcmFtcwkqZG1hX2NhcHR1cmU7CisJc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhICpkbWFfcGxheWJhY2s7CisJc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhICpkbWFfY2FwdHVyZTsKIAogCXUzMgkJIHN1c3BlbmRfaWlzbW9kOwogCXUzMgkJIHN1c3BlbmRfaWlzY29uOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvczNjMjQxMi1pMnMuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0MTItaTJzLmMKaW5kZXggZDQ1ZGZmYi4uM2U4OWZiYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvczNjMjQxMi1pMnMuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNDEyLWkycy5jCkBAIC0zNCwxNCArMzQsMTQgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvYXNvYy1zM2MuaD4KIAotc3RhdGljIHN0cnVjdCBzM2NfZG1hX3BhcmFtcyBzM2MyNDEyX2kyc19wY21fc3RlcmVvX291dCA9IHsKLQkuY2hfbmFtZQk9ICJ0eCIsCi0JLmRtYV9zaXplCT0gNCwKK3N0YXRpYyBzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9kYWlfZG1hX2RhdGEgczNjMjQxMl9pMnNfcGNtX3N0ZXJlb19vdXQgPSB7CisJLmNoYW5fbmFtZQk9ICJ0eCIsCisJLmFkZHJfd2lkdGgJPSA0LAogfTsKIAotc3RhdGljIHN0cnVjdCBzM2NfZG1hX3BhcmFtcyBzM2MyNDEyX2kyc19wY21fc3RlcmVvX2luID0gewotCS5jaF9uYW1lCT0gInJ4IiwKLQkuZG1hX3NpemUJPSA0LAorc3RhdGljIHN0cnVjdCBzbmRfZG1hZW5naW5lX2RhaV9kbWFfZGF0YSBzM2MyNDEyX2kyc19wY21fc3RlcmVvX2luID0geworCS5jaGFuX25hbWUJPSAicngiLAorCS5hZGRyX3dpZHRoCT0gNCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgczNjX2kyc3YyX2luZm8gczNjMjQxMl9pMnM7CkBAIC01Miw4ICs1Miw4IEBACiAKIAlwcl9kZWJ1ZygiRW50ZXJlZCAlc1xuIiwgX19mdW5jX18pOwogCi0Jc2Ftc3VuZ19hc29jX2luaXRfZG1hX2RhdGEoZGFpLCAmczNjMjQxMl9pMnNfcGNtX3N0ZXJlb19vdXQsCi0JCSZzM2MyNDEyX2kyc19wY21fc3RlcmVvX2luKTsKKwlzbmRfc29jX2RhaV9pbml0X2RtYV9kYXRhKGRhaSwgJnMzYzI0MTJfaTJzX3BjbV9zdGVyZW9fb3V0LAorCQkJCQkmczNjMjQxMl9pMnNfcGNtX3N0ZXJlb19pbik7CiAKIAlyZXQgPSBzM2NfaTJzdjJfcHJvYmUoZGFpLCAmczNjMjQxMl9pMnMsIFMzQzI0MTBfUEFfSUlTKTsKIAlpZiAocmV0KQpAQCAtMTYzLDEwICsxNjMsMTAgQEAKIAlpZiAoSVNfRVJSKHMzYzI0MTJfaTJzLnJlZ3MpKQogCQlyZXR1cm4gUFRSX0VSUihzM2MyNDEyX2kycy5yZWdzKTsKIAotCXMzYzI0MTJfaTJzX3BjbV9zdGVyZW9fb3V0LmRtYV9hZGRyID0gcmVzLT5zdGFydCArIFMzQzI0MTJfSUlTVFhEOwotCXMzYzI0MTJfaTJzX3BjbV9zdGVyZW9fb3V0LnNsYXZlID0gcGRhdGEtPmRtYV9wbGF5YmFjazsKLQlzM2MyNDEyX2kyc19wY21fc3RlcmVvX2luLmRtYV9hZGRyID0gcmVzLT5zdGFydCArIFMzQzI0MTJfSUlTUlhEOwotCXMzYzI0MTJfaTJzX3BjbV9zdGVyZW9faW4uc2xhdmUgPSBwZGF0YS0+ZG1hX2NhcHR1cmU7CisJczNjMjQxMl9pMnNfcGNtX3N0ZXJlb19vdXQuYWRkciA9IHJlcy0+c3RhcnQgKyBTM0MyNDEyX0lJU1RYRDsKKwlzM2MyNDEyX2kyc19wY21fc3RlcmVvX291dC5maWx0ZXJfZGF0YSA9IHBkYXRhLT5kbWFfcGxheWJhY2s7CisJczNjMjQxMl9pMnNfcGNtX3N0ZXJlb19pbi5hZGRyID0gcmVzLT5zdGFydCArIFMzQzI0MTJfSUlTUlhEOworCXMzYzI0MTJfaTJzX3BjbV9zdGVyZW9faW4uZmlsdGVyX2RhdGEgPSBwZGF0YS0+ZG1hX2NhcHR1cmU7CiAKIAlyZXQgPSBzM2NfaTJzdjJfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsIC0xLAogCQkJCQkgICAmczNjMjQxMl9pMnNfY29tcG9uZW50LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eC1pMnMuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHgtaTJzLmMKaW5kZXggM2U3NmYyYS4uYzc4YTkzNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eC1pMnMuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zM2MyNHh4LWkycy5jCkBAIC0zMiwxNCArMzIsMTQgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvYXNvYy1zM2MuaD4KIAotc3RhdGljIHN0cnVjdCBzM2NfZG1hX3BhcmFtcyBzM2MyNHh4X2kyc19wY21fc3RlcmVvX291dCA9IHsKLQkuY2hfbmFtZQk9ICJ0eCIsCi0JLmRtYV9zaXplCT0gMiwKK3N0YXRpYyBzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9kYWlfZG1hX2RhdGEgczNjMjR4eF9pMnNfcGNtX3N0ZXJlb19vdXQgPSB7CisJLmNoYW5fbmFtZQk9ICJ0eCIsCisJLmFkZHJfd2lkdGgJPSAyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzM2NfZG1hX3BhcmFtcyBzM2MyNHh4X2kyc19wY21fc3RlcmVvX2luID0gewotCS5jaF9uYW1lCT0gInJ4IiwKLQkuZG1hX3NpemUJPSAyLAorc3RhdGljIHN0cnVjdCBzbmRfZG1hZW5naW5lX2RhaV9kbWFfZGF0YSBzM2MyNHh4X2kyc19wY21fc3RlcmVvX2luID0geworCS5jaGFuX25hbWUJPSAicngiLAorCS5hZGRyX3dpZHRoCT0gMiwKIH07CiAKIHN0cnVjdCBzM2MyNHh4X2kyc19pbmZvIHsKQEAgLTM2MCw4ICszNjAsOCBAQAogewogCXByX2RlYnVnKCJFbnRlcmVkICVzXG4iLCBfX2Z1bmNfXyk7CiAKLQlzYW1zdW5nX2Fzb2NfaW5pdF9kbWFfZGF0YShkYWksICZzM2MyNHh4X2kyc19wY21fc3RlcmVvX291dCwKLQkJJnMzYzI0eHhfaTJzX3BjbV9zdGVyZW9faW4pOworCXNuZF9zb2NfZGFpX2luaXRfZG1hX2RhdGEoZGFpLCAmczNjMjR4eF9pMnNfcGNtX3N0ZXJlb19vdXQsCisJCQkJCSZzM2MyNHh4X2kyc19wY21fc3RlcmVvX2luKTsKIAogCXMzYzI0eHhfaTJzLmlpc19jbGsgPSBkZXZtX2Nsa19nZXQoZGFpLT5kZXYsICJpaXMiKTsKIAlpZiAoSVNfRVJSKHMzYzI0eHhfaTJzLmlpc19jbGspKSB7CkBAIC00NjksMTAgKzQ2OSwxMCBAQAogCWlmIChJU19FUlIoczNjMjR4eF9pMnMucmVncykpCiAJCXJldHVybiBQVFJfRVJSKHMzYzI0eHhfaTJzLnJlZ3MpOwogCi0JczNjMjR4eF9pMnNfcGNtX3N0ZXJlb19vdXQuZG1hX2FkZHIgPSByZXMtPnN0YXJ0ICsgUzNDMjQxMF9JSVNGSUZPOwotCXMzYzI0eHhfaTJzX3BjbV9zdGVyZW9fb3V0LnNsYXZlID0gcGRhdGEtPmRtYV9wbGF5YmFjazsKLQlzM2MyNHh4X2kyc19wY21fc3RlcmVvX2luLmRtYV9hZGRyID0gcmVzLT5zdGFydCArIFMzQzI0MTBfSUlTRklGTzsKLQlzM2MyNHh4X2kyc19wY21fc3RlcmVvX2luLnNsYXZlID0gcGRhdGEtPmRtYV9jYXB0dXJlOworCXMzYzI0eHhfaTJzX3BjbV9zdGVyZW9fb3V0LmFkZHIgPSByZXMtPnN0YXJ0ICsgUzNDMjQxMF9JSVNGSUZPOworCXMzYzI0eHhfaTJzX3BjbV9zdGVyZW9fb3V0LmZpbHRlcl9kYXRhID0gcGRhdGEtPmRtYV9wbGF5YmFjazsKKwlzM2MyNHh4X2kyc19wY21fc3RlcmVvX2luLmFkZHIgPSByZXMtPnN0YXJ0ICsgUzNDMjQxMF9JSVNGSUZPOworCXMzYzI0eHhfaTJzX3BjbV9zdGVyZW9faW4uZmlsdGVyX2RhdGEgPSBwZGF0YS0+ZG1hX2NhcHR1cmU7CiAKIAlyZXQgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsCiAJCQkmczNjMjR4eF9pMnNfY29tcG9uZW50LCAmczNjMjR4eF9pMnNfZGFpLCAxKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHhfdWRhMTM0eC5jIGIvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eF91ZGExMzR4LmMKaW5kZXggNTA4NDllMS4uNzg1M2ZiZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eF91ZGExMzR4LmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eF91ZGExMzR4LmMKQEAgLTU0LDI4ICs1NCwyNyBAQAogfTsKICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqczNjMjR4eF91ZGExMzR4X3NuZF9kZXZpY2U7Ci0KIHN0YXRpYyBpbnQgczNjMjR4eF91ZGExMzR4X3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7Ci0JaW50IHJldCA9IDA7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSA9IHJ0ZC0+Y3B1X2RhaTsKICNpZmRlZiBFTkZPUkNFX1JBVEVTCiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKICNlbmRpZgorCWludCByZXQgPSAwOwogCiAJbXV0ZXhfbG9jaygmY2xrX2xvY2spOwotCXByX2RlYnVnKCIlcyAlZFxuIiwgX19mdW5jX18sIGNsa191c2Vycyk7CisKIAlpZiAoY2xrX3VzZXJzID09IDApIHsKLQkJeHRhbCA9IGNsa19nZXQoJnMzYzI0eHhfdWRhMTM0eF9zbmRfZGV2aWNlLT5kZXYsICJ4dGFsIik7CisJCXh0YWwgPSBjbGtfZ2V0KHJ0ZC0+ZGV2LCAieHRhbCIpOwogCQlpZiAoSVNfRVJSKHh0YWwpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzIGNhbm5vdCBnZXQgeHRhbFxuIiwgX19mdW5jX18pOworCQkJZGV2X2VycihydGQtPmRldiwgIiVzIGNhbm5vdCBnZXQgeHRhbFxuIiwgX19mdW5jX18pOwogCQkJcmV0ID0gUFRSX0VSUih4dGFsKTsKIAkJfSBlbHNlIHsKLQkJCXBjbGsgPSBjbGtfZ2V0KCZzM2MyNHh4X3VkYTEzNHhfc25kX2RldmljZS0+ZGV2LAotCQkJCSAgICAgICAicGNsayIpOworCQkJcGNsayA9IGNsa19nZXQoY3B1X2RhaS0+ZGV2LCAiaWlzIik7CiAJCQlpZiAoSVNfRVJSKHBjbGspKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICIlcyBjYW5ub3QgZ2V0IHBjbGtcbiIsCi0JCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiJXMgY2Fubm90IGdldCBwY2xrXG4iLAorCQkJCQlfX2Z1bmNfXyk7CiAJCQkJY2xrX3B1dCh4dGFsKTsKIAkJCQlyZXQgPSBQVFJfRVJSKHBjbGspOwogCQkJfQpAQCAtMTAxLDggKzEwMCw4IEBACiAJCQkJCQkgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsCiAJCQkJCQkgJmh3X2NvbnN0cmFpbnRzX3JhdGVzKTsKIAkJaWYgKHJldCA8IDApCi0JCQlwcmludGsoS0VSTl9FUlIgIiVzIGNhbm5vdCBzZXQgY29uc3RyYWludHNcbiIsCi0JCQkgICAgICAgX19mdW5jX18pOworCQkJZGV2X2VycihydGQtPmRldiwgIiVzIGNhbm5vdCBzZXQgY29uc3RyYWludHNcbiIsCisJCQkJX19mdW5jX18pOwogI2VuZGlmCiAJfQogCXJldHVybiByZXQ7CkBAIC0xMTEsNyArMTEwLDYgQEAKIHN0YXRpYyB2b2lkIHMzYzI0eHhfdWRhMTM0eF9zaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAltdXRleF9sb2NrKCZjbGtfbG9jayk7Ci0JcHJfZGVidWcoIiVzICVkXG4iLCBfX2Z1bmNfXywgY2xrX3VzZXJzKTsKIAljbGtfdXNlcnMgLT0gMTsKIAlpZiAoY2xrX3VzZXJzID09IDApIHsKIAkJY2xrX3B1dCh4dGFsKTsKQEAgLTE1OCwxOCArMTU2LDE5IEBACiAJCWNsa19zb3VyY2UgPSBTM0MyNFhYX0NMS1NSQ19QQ0xLOwogCQlkaXYgPSBiaSAlIDMzOwogCX0KLQlwcl9kZWJ1ZygiJXMgZGVzaXJlZCByYXRlICVsdSwgJWRcbiIsIF9fZnVuY19fLCByYXRlLCBiaSk7CisKKwlkZXZfZGJnKHJ0ZC0+ZGV2LCAiJXMgZGVzaXJlZCByYXRlICVsdSwgJWRcbiIsIF9fZnVuY19fLCByYXRlLCBiaSk7CiAKIAljbGsgPSAoZnNfbW9kZSA9PSBTM0MyNDEwX0lJU01PRF8zODRGUyA/IDM4NCA6IDI1NikgKiByYXRlOwotCXByX2RlYnVnKCIlcyB3aWxsIHVzZTogJXMgJXMgJWQgc3lzY2xrICVkIGVyciAlbGRcbiIsIF9fZnVuY19fLAotCQkgZnNfbW9kZSA9PSBTM0MyNDEwX0lJU01PRF8zODRGUyA/ICIzODRGUyIgOiAiMjU2RlMiLAotCQkgY2xrX3NvdXJjZSA9PSBTM0MyNFhYX0NMS1NSQ19NUExMID8gIk1QTExpbiIgOiAiUENMSyIsCi0JCSBkaXYsIGNsaywgZXJyKTsKKworCWRldl9kYmcocnRkLT5kZXYsICIlcyB3aWxsIHVzZTogJXMgJXMgJWQgc3lzY2xrICVkIGVyciAlbGRcbiIsIF9fZnVuY19fLAorCQlmc19tb2RlID09IFMzQzI0MTBfSUlTTU9EXzM4NEZTID8gIjM4NEZTIiA6ICIyNTZGUyIsCisJCWNsa19zb3VyY2UgPT0gUzNDMjRYWF9DTEtTUkNfTVBMTCA/ICJNUExMaW4iIDogIlBDTEsiLAorCQlkaXYsIGNsaywgZXJyKTsKIAogCWlmICgoZXJyICogMTAwIC8gcmF0ZSkgPiA1KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUzNDMjRYWF9VREExMzRYOiBlZmZlY3RpdmUgZnJlcXVlbmN5ICIKLQkJICAgICAgICJ0b28gZGlmZmVyZW50IGZyb20gZGVzaXJlZCAoJWxkJSUpXG4iLAotCQkgICAgICAgZXJyICogMTAwIC8gcmF0ZSk7CisJCWRldl9lcnIocnRkLT5kZXYsICJlZmZlY3RpdmUgZnJlcXVlbmN5IHRvbyBkaWZmZXJlbnQgIgorCQkJCSAgImZyb20gZGVzaXJlZCAoJWxkJSUpXG4iLCBlcnIgKiAxMDAgLyByYXRlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMjYsMTE1ICsyMjUsMjcgQEAKIAkubnVtX2xpbmtzID0gMSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgczNjMjR4eF91ZGExMzR4X3BsYXRmb3JtX2RhdGEgKnMzYzI0eHhfdWRhMTM0eF9sM19waW5zOwotCi1zdGF0aWMgdm9pZCBzZXRkYXQoaW50IHYpCi17Ci0JZ3Bpb19zZXRfdmFsdWUoczNjMjR4eF91ZGExMzR4X2wzX3BpbnMtPmwzX2RhdGEsIHYgPiAwKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0Y2xrKGludCB2KQotewotCWdwaW9fc2V0X3ZhbHVlKHMzYzI0eHhfdWRhMTM0eF9sM19waW5zLT5sM19jbGssIHYgPiAwKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0bW9kZShpbnQgdikKLXsKLQlncGlvX3NldF92YWx1ZShzM2MyNHh4X3VkYTEzNHhfbDNfcGlucy0+bDNfbW9kZSwgdiA+IDApOwotfQotCi0vKiBGSVhNRSAtIFRoaXMgbXVzdCBiZSBjb2RlYyBwbGF0Zm9ybSBkYXRhIGJ1dCBpbiB3aGljaCBib2FyZCBmaWxlID8/ICovCi1zdGF0aWMgc3RydWN0IHVkYTEzNHhfcGxhdGZvcm1fZGF0YSBzM2MyNHh4X3VkYTEzNHggPSB7Ci0JLmwzID0gewotCQkuc2V0ZGF0ID0gc2V0ZGF0LAotCQkuc2V0Y2xrID0gc2V0Y2xrLAotCQkuc2V0bW9kZSA9IHNldG1vZGUsCi0JCS5kYXRhX2hvbGQgPSAxLAotCQkuZGF0YV9zZXR1cCA9IDEsCi0JCS5jbG9ja19oaWdoID0gMSwKLQkJLm1vZGVfaG9sZCA9IDEsCi0JCS5tb2RlID0gMSwKLQkJLm1vZGVfc2V0dXAgPSAxLAotCX0sCi19OwotCi1zdGF0aWMgaW50IHMzYzI0eHhfdWRhMTM0eF9zZXR1cF9waW4oaW50IHBpbiwgY2hhciAqZnVuKQotewotCWlmIChncGlvX3JlcXVlc3QocGluLCAiczNjMjR4eF91ZGExMzR4IikgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUzNDMjRYWF9VREExMzRYIFNvQyBBdWRpbzogIgotCQkgICAgICAgImwzICVzIHBpbiBhbHJlYWR5IGluIHVzZSIsIGZ1bik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCWdwaW9fZGlyZWN0aW9uX291dHB1dChwaW4sIDApOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IHMzYzI0eHhfdWRhMTM0eF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSAmc25kX3NvY19zM2MyNHh4X3VkYTEzNHg7CiAJaW50IHJldDsKIAotCXByaW50ayhLRVJOX0lORk8gIlMzQzI0WFhfVURBMTM0WCBTb0MgQXVkaW8gZHJpdmVyXG4iKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKKwljYXJkLT5kZXYgPSAmcGRldi0+ZGV2OwogCi0JczNjMjR4eF91ZGExMzR4X2wzX3BpbnMgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlpZiAoczNjMjR4eF91ZGExMzR4X2wzX3BpbnMgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIlMzQzI0WFhfVURBMTM0WCBTb0MgQXVkaW86ICIKLQkJICAgICAgICJ1bmFibGUgdG8gZmluZCBwbGF0Zm9ybSBkYXRhXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCXMzYzI0eHhfdWRhMTM0eC5wb3dlciA9IHMzYzI0eHhfdWRhMTM0eF9sM19waW5zLT5wb3dlcjsKLQlzM2MyNHh4X3VkYTEzNHgubW9kZWwgPSBzM2MyNHh4X3VkYTEzNHhfbDNfcGlucy0+bW9kZWw7Ci0KLQlpZiAoczNjMjR4eF91ZGExMzR4X3NldHVwX3BpbihzM2MyNHh4X3VkYTEzNHhfbDNfcGlucy0+bDNfZGF0YSwKLQkJCQkgICAgICAiZGF0YSIpIDwgMCkKLQkJcmV0dXJuIC1FQlVTWTsKLQlpZiAoczNjMjR4eF91ZGExMzR4X3NldHVwX3BpbihzM2MyNHh4X3VkYTEzNHhfbDNfcGlucy0+bDNfY2xrLAotCQkJCSAgICAgICJjbGsiKSA8IDApIHsKLQkJZ3Bpb19mcmVlKHMzYzI0eHhfdWRhMTM0eF9sM19waW5zLT5sM19kYXRhKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0JaWYgKHMzYzI0eHhfdWRhMTM0eF9zZXR1cF9waW4oczNjMjR4eF91ZGExMzR4X2wzX3BpbnMtPmwzX21vZGUsCi0JCQkJICAgICAgIm1vZGUiKSA8IDApIHsKLQkJZ3Bpb19mcmVlKHMzYzI0eHhfdWRhMTM0eF9sM19waW5zLT5sM19kYXRhKTsKLQkJZ3Bpb19mcmVlKHMzYzI0eHhfdWRhMTM0eF9sM19waW5zLT5sM19jbGspOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCXMzYzI0eHhfdWRhMTM0eF9zbmRfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJzb2MtYXVkaW8iLCAtMSk7Ci0JaWYgKCFzM2MyNHh4X3VkYTEzNHhfc25kX2RldmljZSkgewotCQlwcmludGsoS0VSTl9FUlIgIlMzQzI0WFhfVURBMTM0WCBTb0MgQXVkaW86ICIKLQkJICAgICAgICJVbmFibGUgdG8gcmVnaXN0ZXJcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShzM2MyNHh4X3VkYTEzNHhfc25kX2RldmljZSwKLQkJCSAgICAgJnNuZF9zb2NfczNjMjR4eF91ZGExMzR4KTsKLQlwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEoczNjMjR4eF91ZGExMzR4X3NuZF9kZXZpY2UsICZzM2MyNHh4X3VkYTEzNHgsIHNpemVvZihzM2MyNHh4X3VkYTEzNHgpKTsKLQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHMzYzI0eHhfdWRhMTM0eF9zbmRfZGV2aWNlKTsKLQlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUzNDMjRYWF9VREExMzRYIFNvQyBBdWRpbzogVW5hYmxlIHRvIGFkZFxuIik7Ci0JCXBsYXRmb3JtX2RldmljZV9wdXQoczNjMjR4eF91ZGExMzR4X3NuZF9kZXZpY2UpOwotCX0KKwlyZXQgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmcGRldi0+ZGV2LCBjYXJkKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgY2FyZDogJWRcbiIsIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHMzYzI0eHhfdWRhMTM0eF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihzM2MyNHh4X3VkYTEzNHhfc25kX2RldmljZSk7Ci0JZ3Bpb19mcmVlKHMzYzI0eHhfdWRhMTM0eF9sM19waW5zLT5sM19kYXRhKTsKLQlncGlvX2ZyZWUoczNjMjR4eF91ZGExMzR4X2wzX3BpbnMtPmwzX2Nsayk7Ci0JZ3Bpb19mcmVlKHMzYzI0eHhfdWRhMTM0eF9sM19waW5zLT5sM19tb2RlKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgczNjMjR4eF91ZGExMzR4X2RyaXZlciA9IHsKIAkucHJvYmUgID0gczNjMjR4eF91ZGExMzR4X3Byb2JlLAotCS5yZW1vdmUgPSBzM2MyNHh4X3VkYTEzNHhfcmVtb3ZlLAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gInMzYzI0eHhfdWRhMTM0eCIsCiAJfSwKIH07Ci0KIG1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoczNjMjR4eF91ZGExMzR4X2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIlpvbHRhbiBEZXZhaSwgQ2hyaXN0aWFuIFBlbGxlZ3JpbiA8Y2hyaXBlbGxAZXZvbHdhcmUub3JnPiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg1ODBwY20uYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204NTgwcGNtLmMKaW5kZXggNmRlZWM1Mi4uYTZkMjIzMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg1ODBwY20uYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODU4MHBjbS5jCkBAIC0xNiw3ICsxNiw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAogI2luY2x1ZGUgIi4uL2NvZGVjcy93bTg1ODAuaCIKLSNpbmNsdWRlICJkbWEuaCIKICNpbmNsdWRlICJwY20uaCIKIAogLyoKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204OTk0cGNtLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODk5NHBjbS5jCmluZGV4IGIxYzg5ZWMuLjJlNjIxNDkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204OTk0cGNtLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg5OTRwY20uYwpAQCAtMTUsNyArMTUsNiBAQAogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KIAogI2luY2x1ZGUgIi4uL2NvZGVjcy93bTg5OTQuaCIKLSNpbmNsdWRlICJkbWEuaCIKICNpbmNsdWRlICJwY20uaCIKIAogLyoKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL3NwZGlmLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zcGRpZi5jCmluZGV4IDBjYjljODUuLjI2YzFmYmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL3NwZGlmLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvc3BkaWYuYwpAQCAtOTAsMTAgKzkwLDEwIEBACiAJdTMyCQlzYXZlZF9jbGtjb247CiAJdTMyCQlzYXZlZF9jb247CiAJdTMyCQlzYXZlZF9jc3RhczsKLQlzdHJ1Y3QgczNjX2RtYV9wYXJhbXMJKmRtYV9wbGF5YmFjazsKKwlzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9kYWlfZG1hX2RhdGEgKmRtYV9wbGF5YmFjazsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgczNjX2RtYV9wYXJhbXMgc3BkaWZfc3RlcmVvX291dDsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9kYWlfZG1hX2RhdGEgc3BkaWZfc3RlcmVvX291dDsKIHN0YXRpYyBzdHJ1Y3Qgc2Ftc3VuZ19zcGRpZl9pbmZvIHNwZGlmX2luZm87CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNhbXN1bmdfc3BkaWZfaW5mbyAqdG9faW5mbyhzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkpCkBAIC0xNzksNyArMTc5LDcgQEAKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNhbXN1bmdfc3BkaWZfaW5mbyAqc3BkaWYgPSB0b19pbmZvKHJ0ZC0+Y3B1X2RhaSk7CiAJdm9pZCBfX2lvbWVtICpyZWdzID0gc3BkaWYtPnJlZ3M7Ci0Jc3RydWN0IHMzY19kbWFfcGFyYW1zICpkbWFfZGF0YTsKKwlzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9kYWlfZG1hX2RhdGEgKmRtYV9kYXRhOwogCXUzMiBjb24sIGNsa2NvbiwgY3N0YXM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgaSwgcmF0aW87CkBAIC00MjUsMTEgKzQyNSwxMSBAQAogCQlnb3RvIGVycjQ7CiAJfQogCi0Jc3BkaWZfc3RlcmVvX291dC5kbWFfc2l6ZSA9IDI7Ci0Jc3BkaWZfc3RlcmVvX291dC5kbWFfYWRkciA9IG1lbV9yZXMtPnN0YXJ0ICsgREFUQV9PVVRCVUY7CisJc3BkaWZfc3RlcmVvX291dC5hZGRyX3dpZHRoID0gMjsKKwlzcGRpZl9zdGVyZW9fb3V0LmFkZHIgPSBtZW1fcmVzLT5zdGFydCArIERBVEFfT1VUQlVGOwogCWZpbHRlciA9IE5VTEw7CiAJaWYgKHNwZGlmX3BkYXRhKSB7Ci0JCXNwZGlmX3N0ZXJlb19vdXQuc2xhdmUgPSBzcGRpZl9wZGF0YS0+ZG1hX3BsYXliYWNrOworCQlzcGRpZl9zdGVyZW9fb3V0LmZpbHRlcl9kYXRhID0gc3BkaWZfcGRhdGEtPmRtYV9wbGF5YmFjazsKIAkJZmlsdGVyID0gc3BkaWZfcGRhdGEtPmRtYV9maWx0ZXI7CiAJfQogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvS2NvbmZpZyBiL3NvdW5kL3NvYy9zaC9LY29uZmlnCmluZGV4IDkzMTFmMTEuLjZkYjY0MDUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9zaC9LY29uZmlnCkBAIC00MiwxMiArNDIsNiBAQAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgUi1DYXIgU1JVL1NDVS9TU0lVL1NTSSBzb3VuZCBzdXBwb3J0CiAKLWNvbmZpZyBTTkRfU09DX1JTUkNfQ0FSRAotCXRyaXN0YXRlICJSZW5lc2FzIFNhbXBsaW5nIFJhdGUgQ29udmVydCBTb3VuZCBDYXJkIgotCXNlbGVjdCBTTkRfU0lNUExFX0NBUkRfVVRJTFMKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBlbmFibGVzIHNpbXBsZSBzb3VuZCBpZiB5b3UgbmVlZCBzYW1wbGluZyByYXRlIGNvbnZlcnQKLQogIyMKICMjIEJvYXJkcwogIyMKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaC9yY2FyL01ha2VmaWxlIGIvc291bmQvc29jL3NoL3JjYXIvTWFrZWZpbGUKaW5kZXggYTg5ZGRmNy4uOWMzZDVhZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NoL3JjYXIvTWFrZWZpbGUKKysrIGIvc291bmQvc29jL3NoL3JjYXIvTWFrZWZpbGUKQEAgLTEsNSArMSwyIEBACiBzbmQtc29jLXJjYXItb2Jqcwk6PSBjb3JlLm8gZ2VuLm8gZG1hLm8gYWRnLm8gc3NpLm8gc3NpdS5vIHNyYy5vIGN0dS5vIG1peC5vIGR2Yy5vIGNtZC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19SQ0FSKQkrPSBzbmQtc29jLXJjYXIubwotCi1zbmQtc29jLXJzcmMtY2FyZC1vYmpzCTo9IHJzcmMtY2FyZC5vCi1vYmotJChDT05GSUdfU05EX1NPQ19SU1JDX0NBUkQpCSs9IHNuZC1zb2MtcnNyYy1jYXJkLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaC9yY2FyL2NvcmUuYyBiL3NvdW5kL3NvYy9zaC9yY2FyL2NvcmUuYwppbmRleCAzMzUxYTcwLi5mMTgxNDEwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvcmNhci9jb3JlLmMKKysrIGIvc291bmQvc29jL3NoL3JjYXIvY29yZS5jCkBAIC0xMTAsNiArMTEwLDcgQEAKIC8qCiAgKglyc25kX21vZCBmdW5jdGlvbnMKICAqLworI2lmZGVmIERFQlVHCiB2b2lkIHJzbmRfbW9kX21ha2Vfc3VyZShzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwgZW51bSByc25kX21vZF90eXBlIHR5cGUpCiB7CiAJaWYgKG1vZC0+dHlwZSAhPSB0eXBlKSB7CkBAIC0xMjAsNiArMTIxLDcgQEAKIAkJCSByc25kX21vZF9uYW1lKG1vZCksIHJzbmRfbW9kX2lkKG1vZCkpOwogCX0KIH0KKyNlbmRpZgogCiBjaGFyICpyc25kX21vZF9uYW1lKHN0cnVjdCByc25kX21vZCAqbW9kKQogewpAQCAtNTc0LDYgKzU3Niw3IEBACiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6CiAJCXJzbmRfZGFpX3N0cmVhbV9pbml0KGlvLCBzdWJzdHJlYW0pOwogCiAJCXJldCA9IHJzbmRfZGFpX2NhbGwoaW5pdCwgaW8sIHByaXYpOwpAQCAtNTkwLDYgKzU5Myw3IEBACiAKIAkJYnJlYWs7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKIAkJcmV0ID0gcnNuZF9kYWlfY2FsbChpcnEsIGlvLCBwcml2LCAwKTsKIAogCQlyZXQgfD0gcnNuZF9kYWlfY2FsbChzdG9wLCBpbywgcHJpdik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvcmNhci9yc3JjLWNhcmQuYyBiL3NvdW5kL3NvYy9zaC9yY2FyL3JzcmMtY2FyZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTM3Zjg0Li4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9zaC9yY2FyL3JzcmMtY2FyZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDg2ICswLDAgQEAKLS8qCi0gKiBSZW5lc2FzIFNhbXBsaW5nIFJhdGUgQ29udmVydCBTb3VuZCBDYXJkIGZvciBEUENNCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFJlbmVzYXMgU29sdXRpb25zIENvcnAuCi0gKiBLdW5pbm9yaSBNb3JpbW90byA8a3VuaW5vcmkubW9yaW1vdG8uZ3hAcmVuZXNhcy5jb20+Ci0gKgotICogYmFzZWQgb24gJHtMSU5VWH0vc291bmQvc29jL2dlbmVyaWMvc2ltcGxlLWNhcmQuYwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MtZGFpLmg+Ci0jaW5jbHVkZSA8c291bmQvc2ltcGxlX2NhcmRfdXRpbHMuaD4KLQotc3RydWN0IHJzcmNfY2FyZF9vZl9kYXRhIHsKLQljb25zdCBjaGFyICpwcmVmaXg7Ci0JY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSAqcm91dGVzOwotCWludCBudW1fcm91dGVzOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgcm91dGVzX3NzaTBfYWs0NjQyW10gPSB7Ci0JeyJhazQ2NDIgUGxheWJhY2siLCBOVUxMLCAiREFJMCBQbGF5YmFjayJ9LAotCXsiREFJMCBDYXB0dXJlIiwgTlVMTCwgImFrNDY0MiBDYXB0dXJlIn0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJzcmNfY2FyZF9vZl9kYXRhIHJvdXRlc19vZl9zc2kwX2FrNDY0MiA9IHsKLQkucHJlZml4CQk9ICJhazQ2NDIiLAotCS5yb3V0ZXMJCT0gcm91dGVzX3NzaTBfYWs0NjQyLAotCS5udW1fcm91dGVzCT0gQVJSQVlfU0laRShyb3V0ZXNfc3NpMF9hazQ2NDIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcnNyY19jYXJkX29mX21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHJzcmMtY2FyZCxsYWdlciIsCS5kYXRhID0gJnJvdXRlc19vZl9zc2kwX2FrNDY0MiB9LAotCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxyc3JjLWNhcmQsa29lbHNjaCIsCS5kYXRhID0gJnJvdXRlc19vZl9zc2kwX2FrNDY0MiB9LAotCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxyc3JjLWNhcmQiLCB9LAotCXt9LAotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHJzcmNfY2FyZF9vZl9tYXRjaCk7Ci0KLSNkZWZpbmUgSURYX0NQVQkJMAotI2RlZmluZSBJRFhfQ09ERUMJMQotc3RydWN0IHJzcmNfY2FyZF9wcml2IHsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkIHNuZF9jYXJkOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjX2NvbmYgY29kZWNfY29uZjsKLQlzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpICpkYWlfcHJvcHM7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rOwotCXUzMiBjb252ZXJ0X3JhdGU7Ci0JdTMyIGNvbnZlcnRfY2hhbm5lbHM7Ci19OwotCi0jZGVmaW5lIHJzcmNfcHJpdl90b19kZXYocHJpdikgKChwcml2KS0+c25kX2NhcmQuZGV2KQotI2RlZmluZSByc3JjX3ByaXZfdG9fbGluayhwcml2LCBpKSAoKHByaXYpLT5zbmRfY2FyZC5kYWlfbGluayArIChpKSkKLSNkZWZpbmUgcnNyY19wcml2X3RvX3Byb3BzKHByaXYsIGkpICgocHJpdiktPmRhaV9wcm9wcyArIChpKSkKLQotc3RhdGljIGludCByc3JjX2NhcmRfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHJzcmNfY2FyZF9wcml2ICpwcml2ID0Jc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKHJ0ZC0+Y2FyZCk7Ci0Jc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSAqZGFpX3Byb3BzID0KLQkJcnNyY19wcml2X3RvX3Byb3BzKHByaXYsIHJ0ZC0+bnVtKTsKLQotCXJldHVybiBjbGtfcHJlcGFyZV9lbmFibGUoZGFpX3Byb3BzLT5jbGspOwotfQotCi1zdGF0aWMgdm9pZCByc3JjX2NhcmRfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCByc3JjX2NhcmRfcHJpdiAqcHJpdiA9CXNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShydGQtPmNhcmQpOwotCXN0cnVjdCBhc29jX3NpbXBsZV9kYWkgKmRhaV9wcm9wcyA9Ci0JCXJzcmNfcHJpdl90b19wcm9wcyhwcml2LCBydGQtPm51bSk7Ci0KLQljbGtfZGlzYWJsZV91bnByZXBhcmUoZGFpX3Byb3BzLT5jbGspOwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIHJzcmNfY2FyZF9vcHMgPSB7Ci0JLnN0YXJ0dXAgPSByc3JjX2NhcmRfc3RhcnR1cCwKLQkuc2h1dGRvd24gPSByc3JjX2NhcmRfc2h1dGRvd24sCi19OwotCi1zdGF0aWMgaW50IHJzcmNfY2FyZF9kYWlfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCXN0cnVjdCByc3JjX2NhcmRfcHJpdiAqcHJpdiA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShydGQtPmNhcmQpOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpOwotCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluazsKLQlzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpICpkYWlfcHJvcHM7Ci0JaW50IG51bSA9IHJ0ZC0+bnVtOwotCWludCByZXQ7Ci0KLQlkYWlfbGluawk9IHJzcmNfcHJpdl90b19saW5rKHByaXYsIG51bSk7Ci0JZGFpX3Byb3BzCT0gcnNyY19wcml2X3RvX3Byb3BzKHByaXYsIG51bSk7Ci0JZGFpCQk9IGRhaV9saW5rLT5keW5hbWljID8KLQkJCQlydGQtPmNwdV9kYWkgOgotCQkJCXJ0ZC0+Y29kZWNfZGFpOwotCi0JaWYgKGRhaV9wcm9wcy0+c3lzY2xrKSB7Ci0JCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoZGFpLCAwLCBkYWlfcHJvcHMtPnN5c2NsaywgMCk7Ci0JCWlmIChyZXQgJiYgcmV0ICE9IC1FTk9UU1VQUCkgewotCQkJZGV2X2VycihkYWktPmRldiwgInNldF9zeXNjbGsgZXJyb3JcbiIpOwotCQkJZ290byBlcnI7Ci0JCX0KLQl9Ci0KLQlpZiAoZGFpX3Byb3BzLT5zbG90cykgewotCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfdGRtX3Nsb3QoZGFpLAotCQkJCQkgICAgICAgZGFpX3Byb3BzLT50eF9zbG90X21hc2ssCi0JCQkJCSAgICAgICBkYWlfcHJvcHMtPnJ4X3Nsb3RfbWFzaywKLQkJCQkJICAgICAgIGRhaV9wcm9wcy0+c2xvdHMsCi0JCQkJCSAgICAgICBkYWlfcHJvcHMtPnNsb3Rfd2lkdGgpOwotCQlpZiAocmV0ICYmIHJldCAhPSAtRU5PVFNVUFApIHsKLQkJCWRldl9lcnIoZGFpLT5kZXYsICJzZXRfdGRtX3Nsb3QgZXJyb3JcbiIpOwotCQkJZ290byBlcnI7Ci0JCX0KLQl9Ci0KLQlyZXQgPSAwOwotCi1lcnI6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCByc3JjX2NhcmRfYmVfaHdfcGFyYW1zX2ZpeHVwKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCi0JCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCByc3JjX2NhcmRfcHJpdiAqcHJpdiA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShydGQtPmNhcmQpOwotCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKnJhdGUgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCi0JCQkJCQkgICAgICBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSk7Ci0Jc3RydWN0IHNuZF9pbnRlcnZhbCAqY2hhbm5lbHMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCi0JCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMpOwotCi0JaWYgKHByaXYtPmNvbnZlcnRfcmF0ZSkKLQkJcmF0ZS0+bWluID0KLQkJcmF0ZS0+bWF4ID0gcHJpdi0+Y29udmVydF9yYXRlOwotCi0JaWYgKHByaXYtPmNvbnZlcnRfY2hhbm5lbHMpCi0JCWNoYW5uZWxzLT5taW4gPQotCQljaGFubmVscy0+bWF4ID0gcHJpdi0+Y29udmVydF9jaGFubmVsczsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJzcmNfY2FyZF9wYXJzZV9saW5rcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCSBzdHJ1Y3QgcnNyY19jYXJkX3ByaXYgKnByaXYsCi0JCQkJIGludCBpZHgsIGJvb2wgaXNfZmUpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gcnNyY19wcml2X3RvX2Rldihwcml2KTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmsgPSByc3JjX3ByaXZfdG9fbGluayhwcml2LCBpZHgpOwotCXN0cnVjdCBhc29jX3NpbXBsZV9kYWkgKmRhaV9wcm9wcyA9IHJzcmNfcHJpdl90b19wcm9wcyhwcml2LCBpZHgpOwotCXN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgYXJnczsKLQlpbnQgcmV0OwotCi0JLyoKLQkgKiBHZXQgbm9kZSB2aWEgInNvdW5kLWRhaSA9IDwmcGhhbmRsZSBwb3J0PiIKLQkgKiBpdCB3aWxsIGJlIHVzZWQgYXMgeHh4X29mX25vZGUgb24gc29jX2JpbmRfZGFpX2xpbmsoKQotCSAqLwotCXJldCA9IG9mX3BhcnNlX3BoYW5kbGVfd2l0aF9hcmdzKG5wLCAic291bmQtZGFpIiwKLQkJCQkJICIjc291bmQtZGFpLWNlbGxzIiwgMCwgJmFyZ3MpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBQYXJzZSBURE0gc2xvdCAqLwotCXJldCA9IHNuZF9zb2Nfb2ZfcGFyc2VfdGRtX3Nsb3QobnAsCi0JCQkJCSZkYWlfcHJvcHMtPnR4X3Nsb3RfbWFzaywKLQkJCQkJJmRhaV9wcm9wcy0+cnhfc2xvdF9tYXNrLAotCQkJCQkmZGFpX3Byb3BzLT5zbG90cywKLQkJCQkJJmRhaV9wcm9wcy0+c2xvdF93aWR0aCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWlmIChpc19mZSkgewotCQkvKiBCRSBpcyBkdW1teSAqLwotCQlkYWlfbGluay0+Y29kZWNfb2Zfbm9kZQkJPSBOVUxMOwotCQlkYWlfbGluay0+Y29kZWNfZGFpX25hbWUJPSAic25kLXNvYy1kdW1teS1kYWkiOwotCQlkYWlfbGluay0+Y29kZWNfbmFtZQkJPSAic25kLXNvYy1kdW1teSI7Ci0KLQkJLyogRkUgc2V0dGluZ3MgKi8KLQkJZGFpX2xpbmstPmR5bmFtaWMJCT0gMTsKLQkJZGFpX2xpbmstPmRwY21fbWVyZ2VkX2Zvcm1hdAk9IDE7Ci0JCWRhaV9saW5rLT5jcHVfb2Zfbm9kZQkJPSBhcmdzLm5wOwotCQlyZXQgPSBzbmRfc29jX29mX2dldF9kYWlfbmFtZShucCwgJmRhaV9saW5rLT5jcHVfZGFpX25hbWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9zZXRfZGFpbGlua19uYW1lKGRldiwgZGFpX2xpbmssCi0JCQkJCQkJImZlLiVzIiwKLQkJCQkJCQlkYWlfbGluay0+Y3B1X2RhaV9uYW1lKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCi0JCS8qCi0JCSAqIEluIHNvY19iaW5kX2RhaV9saW5rKCkgd2lsbCBjaGVjayBjcHUgbmFtZSBhZnRlcgotCQkgKiBvZl9ub2RlIG1hdGNoaW5nIGlmIGRhaV9saW5rIGhhcyBjcHVfZGFpX25hbWUuCi0JCSAqIGJ1dCwgaXQgd2lsbCBuZXZlciBtYXRjaCBpZiBuYW1lIHdhcyBjcmVhdGVkIGJ5Ci0JCSAqIGZtdF9zaW5nbGVfbmFtZSgpIHJlbW92ZSBjcHVfZGFpX25hbWUgaWYgY3B1X2FyZ3MKLQkJICogd2FzIDAuIFNlZToKLQkJICoJZm10X3NpbmdsZV9uYW1lKCkKLQkJICoJZm10X211bHRpcGxlX25hbWUoKQotCQkgKi8KLQkJaWYgKCFhcmdzLmFyZ3NfY291bnQpCi0JCQlkYWlfbGluay0+Y3B1X2RhaV9uYW1lID0gTlVMTDsKLQl9IGVsc2UgewotCQljb25zdCBzdHJ1Y3QgcnNyY19jYXJkX29mX2RhdGEgKm9mX2RhdGE7Ci0KLQkJb2ZfZGF0YSA9IG9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YShkZXYpOwotCi0JCS8qIEZFIGlzIGR1bW15ICovCi0JCWRhaV9saW5rLT5jcHVfb2Zfbm9kZQkJPSBOVUxMOwotCQlkYWlfbGluay0+Y3B1X2RhaV9uYW1lCQk9ICJzbmQtc29jLWR1bW15LWRhaSI7Ci0JCWRhaV9saW5rLT5jcHVfbmFtZQkJPSAic25kLXNvYy1kdW1teSI7Ci0KLQkJLyogQkUgc2V0dGluZ3MgKi8KLQkJZGFpX2xpbmstPm5vX3BjbQkJPSAxOwotCQlkYWlfbGluay0+YmVfaHdfcGFyYW1zX2ZpeHVwCT0gcnNyY19jYXJkX2JlX2h3X3BhcmFtc19maXh1cDsKLQkJZGFpX2xpbmstPmNvZGVjX29mX25vZGUJCT0gYXJncy5ucDsKLQkJcmV0ID0gc25kX3NvY19vZl9nZXRfZGFpX25hbWUobnAsICZkYWlfbGluay0+Y29kZWNfZGFpX25hbWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9zZXRfZGFpbGlua19uYW1lKGRldiwgZGFpX2xpbmssCi0JCQkJCQkJImJlLiVzIiwKLQkJCQkJCQlkYWlfbGluay0+Y29kZWNfZGFpX25hbWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJLyogYWRkaXRpb25hbCBuYW1lIHByZWZpeCAqLwotCQlpZiAob2ZfZGF0YSkgewotCQkJcHJpdi0+Y29kZWNfY29uZi5vZl9ub2RlID0gZGFpX2xpbmstPmNvZGVjX29mX25vZGU7Ci0JCQlwcml2LT5jb2RlY19jb25mLm5hbWVfcHJlZml4ID0gb2ZfZGF0YS0+cHJlZml4OwotCQl9IGVsc2UgewotCQkJc25kX3NvY19vZl9wYXJzZV9hdWRpb19wcmVmaXgoJnByaXYtPnNuZF9jYXJkLAotCQkJCQkJICAgICAgJnByaXYtPmNvZGVjX2NvbmYsCi0JCQkJCQkgICAgICBkYWlfbGluay0+Y29kZWNfb2Zfbm9kZSwKLQkJCQkJCSAgICAgICJhdWRpby1wcmVmaXgiKTsKLQkJfQotCX0KLQotCS8qIFNpbXBsZSBDYXJkIGFzc3VtZXMgcGxhdGZvcm0gPT0gY3B1ICovCi0JZGFpX2xpbmstPnBsYXRmb3JtX29mX25vZGUJPSBkYWlfbGluay0+Y3B1X29mX25vZGU7Ci0JZGFpX2xpbmstPmRwY21fcGxheWJhY2sJCT0gMTsKLQlkYWlfbGluay0+ZHBjbV9jYXB0dXJlCQk9IDE7Ci0JZGFpX2xpbmstPm9wcwkJCT0gJnJzcmNfY2FyZF9vcHM7Ci0JZGFpX2xpbmstPmluaXQJCQk9IHJzcmNfY2FyZF9kYWlfaW5pdDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJzcmNfY2FyZF9wYXJzZV9jbGsoc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCSAgICAgICBzdHJ1Y3QgcnNyY19jYXJkX3ByaXYgKnByaXYsCi0JCQkgICAgICAgaW50IGlkeCwgYm9vbCBpc19mZSkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmsgPSByc3JjX3ByaXZfdG9fbGluayhwcml2LCBpZHgpOwotCXN0cnVjdCBhc29jX3NpbXBsZV9kYWkgKmRhaV9wcm9wcyA9IHJzcmNfcHJpdl90b19wcm9wcyhwcml2LCBpZHgpOwotCXN0cnVjdCBjbGsgKmNsazsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25wID0gaXNfZmUgPwlkYWlfbGluay0+Y3B1X29mX25vZGUgOgotCQkJCQkJZGFpX2xpbmstPmNvZGVjX29mX25vZGU7Ci0JdTMyIHZhbDsKLQotCS8qCi0JICogUGFyc2UgZGFpLT5zeXNjbGsgY29tZSBmcm9tICJjbG9ja3MgPSA8Jnh4eD4iCi0JICogKGlmIHN5c3RlbSBoYXMgY29tbW9uIGNsb2NrKQotCSAqICBvciAic3lzdGVtLWNsb2NrLWZyZXF1ZW5jeSA9IDx4eHg+IgotCSAqICBvciBkZXZpY2UncyBtb2R1bGUgY2xvY2suCi0JICovCi0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImNsb2NrcyIpKSB7Ci0JCWNsayA9IG9mX2Nsa19nZXQobnAsIDApOwotCQlpZiAoSVNfRVJSKGNsaykpCi0JCQlyZXR1cm4gUFRSX0VSUihjbGspOwotCi0JCWRhaV9wcm9wcy0+c3lzY2xrID0gY2xrX2dldF9yYXRlKGNsayk7Ci0JCWRhaV9wcm9wcy0+Y2xrID0gY2xrOwotCX0gZWxzZSBpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAic3lzdGVtLWNsb2NrLWZyZXF1ZW5jeSIsICZ2YWwpKSB7Ci0JCWRhaV9wcm9wcy0+c3lzY2xrID0gdmFsOwotCX0gZWxzZSB7Ci0JCWNsayA9IG9mX2Nsa19nZXQob2ZfbnAsIDApOwotCQlpZiAoIUlTX0VSUihjbGspKQotCQkJZGFpX3Byb3BzLT5zeXNjbGsgPSBjbGtfZ2V0X3JhdGUoY2xrKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByc3JjX2NhcmRfZGFpX3N1Yl9saW5rX29mKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKLQkJCQkgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQkJICAgICBzdHJ1Y3QgcnNyY19jYXJkX3ByaXYgKnByaXYsCi0JCQkJICAgICBpbnQgaWR4LCBib29sIGlzX2ZlKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzcmNfcHJpdl90b19kZXYocHJpdik7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rID0gcnNyY19wcml2X3RvX2xpbmsocHJpdiwgaWR4KTsKLQlzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpICpkYWlfcHJvcHMgPSByc3JjX3ByaXZfdG9fcHJvcHMocHJpdiwgaWR4KTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gcnNyY19jYXJkX3BhcnNlX2xpbmtzKG5wLCBwcml2LCBpZHgsIGlzX2ZlKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHJzcmNfY2FyZF9wYXJzZV9jbGsobnAsIHByaXYsIGlkeCwgaXNfZmUpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JZGV2X2RiZyhkZXYsICJcdCVzIC8gJTA0eCAvICVkXG4iLAotCQlkYWlfbGluay0+bmFtZSwKLQkJZGFpX2xpbmstPmRhaV9mbXQsCi0JCWRhaV9wcm9wcy0+c3lzY2xrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcnNyY19jYXJkX2RhaV9saW5rX29mKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKLQkJCQkgc3RydWN0IHJzcmNfY2FyZF9wcml2ICpwcml2KQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzcmNfcHJpdl90b19kZXYocHJpdik7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0JdW5zaWduZWQgaW50IGRhaWZtdCA9IDA7Ci0JaW50IHJldCwgaTsKLQlib29sIGlzX2ZlOwotCi0JLyogZmluZCAxc3QgY29kZWMgKi8KLQlpID0gMDsKLQlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKG5vZGUsIG5wKSB7Ci0JCWRhaV9saW5rID0gcnNyY19wcml2X3RvX2xpbmsocHJpdiwgaSk7Ci0KLQkJaWYgKHN0cmNtcChucC0+bmFtZSwgImNvZGVjIikgPT0gMCkgewotCQkJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9kYWlmbXQoZGV2LCBub2RlLCBucCwKLQkJCQkJCQkgICAgTlVMTCwgJmRhaWZtdCk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gcmV0OwotCQkJYnJlYWs7Ci0JCX0KLQkJaSsrOwotCX0KLQotCWkgPSAwOwotCWZvcl9lYWNoX2NoaWxkX29mX25vZGUobm9kZSwgbnApIHsKLQkJZGFpX2xpbmsgPSByc3JjX3ByaXZfdG9fbGluayhwcml2LCBpKTsKLQkJZGFpX2xpbmstPmRhaV9mbXQgPSBkYWlmbXQ7Ci0KLQkJaXNfZmUgPSBmYWxzZTsKLQkJaWYgKHN0cmNtcChucC0+bmFtZSwgImNwdSIpID09IDApCi0JCQlpc19mZSA9IHRydWU7Ci0KLQkJcmV0ID0gcnNyY19jYXJkX2RhaV9zdWJfbGlua19vZihub2RlLCBucCwgcHJpdiwgaSwgaXNfZmUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JCWkrKzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByc3JjX2NhcmRfcGFyc2Vfb2Yoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAotCQkJICAgICAgc3RydWN0IHJzcmNfY2FyZF9wcml2ICpwcml2LAotCQkJICAgICAgc3RydWN0IGRldmljZSAqZGV2KQotewotCWNvbnN0IHN0cnVjdCByc3JjX2NhcmRfb2ZfZGF0YSAqb2ZfZGF0YSA9IG9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YShkZXYpOwotCXN0cnVjdCBhc29jX3NpbXBsZV9kYWkgKnByb3BzOwotCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpsaW5rczsKLQlpbnQgcmV0OwotCWludCBudW07Ci0KLQlpZiAoIW5vZGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbnVtID0gb2ZfZ2V0X2NoaWxkX2NvdW50KG5vZGUpOwotCXByb3BzID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwcm9wcykgKiBudW0sIEdGUF9LRVJORUwpOwotCWxpbmtzID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpsaW5rcykgKiBudW0sIEdGUF9LRVJORUwpOwotCWlmICghcHJvcHMgfHwgIWxpbmtzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXByaXYtPmRhaV9wcm9wcwk9IHByb3BzOwotCXByaXYtPmRhaV9saW5rCT0gbGlua3M7Ci0KLQkvKiBJbml0IHNuZF9zb2NfY2FyZCAqLwotCXByaXYtPnNuZF9jYXJkLm93bmVyCQkJPSBUSElTX01PRFVMRTsKLQlwcml2LT5zbmRfY2FyZC5kZXYJCQk9IGRldjsKLQlwcml2LT5zbmRfY2FyZC5kYWlfbGluawkJCT0gcHJpdi0+ZGFpX2xpbms7Ci0JcHJpdi0+c25kX2NhcmQubnVtX2xpbmtzCQk9IG51bTsKLQlwcml2LT5zbmRfY2FyZC5jb2RlY19jb25mCQk9ICZwcml2LT5jb2RlY19jb25mOwotCXByaXYtPnNuZF9jYXJkLm51bV9jb25maWdzCQk9IDE7Ci0KLQlpZiAob2ZfZGF0YSkgewotCQlwcml2LT5zbmRfY2FyZC5vZl9kYXBtX3JvdXRlcwkJPSBvZl9kYXRhLT5yb3V0ZXM7Ci0JCXByaXYtPnNuZF9jYXJkLm51bV9vZl9kYXBtX3JvdXRlcwk9IG9mX2RhdGEtPm51bV9yb3V0ZXM7Ci0JfSBlbHNlIHsKLQkJc25kX3NvY19vZl9wYXJzZV9hdWRpb19yb3V0aW5nKCZwcml2LT5zbmRfY2FyZCwKLQkJCQkJICAgICAgICJhdWRpby1yb3V0aW5nIik7Ci0JfQotCi0JLyogc2FtcGxpbmcgcmF0ZSBjb252ZXJ0ICovCi0Jb2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgImNvbnZlcnQtcmF0ZSIsICZwcml2LT5jb252ZXJ0X3JhdGUpOwotCi0JLyogY2hhbm5lbHMgdHJhbnNmZXIgKi8KLQlvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAiY29udmVydC1jaGFubmVscyIsICZwcml2LT5jb252ZXJ0X2NoYW5uZWxzKTsKLQotCWRldl9kYmcoZGV2LCAiTmV3IHJzcmMtYXVkaW8tY2FyZDogJXNcbiIsCi0JCXByaXYtPnNuZF9jYXJkLm5hbWUgPyBwcml2LT5zbmRfY2FyZC5uYW1lIDogIiIpOwotCWRldl9kYmcoZGV2LCAiU1JDIDogY29udmVydF9yYXRlICAgICAlZFxuIiwgcHJpdi0+Y29udmVydF9yYXRlKTsKLQlkZXZfZGJnKGRldiwgIkNUVSA6IGNvbnZlcnRfY2hhbm5lbHMgJWRcbiIsIHByaXYtPmNvbnZlcnRfY2hhbm5lbHMpOwotCi0JcmV0ID0gcnNyY19jYXJkX2RhaV9saW5rX29mKG5vZGUsIHByaXYpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9jYXJkX25hbWUoJnByaXYtPnNuZF9jYXJkLCAiY2FyZC0iKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiAwOwotfQotCi0vKiBEZWNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBkZXZpY2Ugbm9kZXMgKi8KLXN0YXRpYyBpbnQgcnNyY19jYXJkX3VucmVmKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rOwotCWludCBudW1fbGlua3M7Ci0KLQlmb3IgKG51bV9saW5rcyA9IDAsIGRhaV9saW5rID0gY2FyZC0+ZGFpX2xpbms7Ci0JICAgICBudW1fbGlua3MgPCBjYXJkLT5udW1fbGlua3M7Ci0JICAgICBudW1fbGlua3MrKywgZGFpX2xpbmsrKykgewotCQlvZl9ub2RlX3B1dChkYWlfbGluay0+Y3B1X29mX25vZGUpOwotCQlvZl9ub2RlX3B1dChkYWlfbGluay0+Y29kZWNfb2Zfbm9kZSk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJzcmNfY2FyZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCByc3JjX2NhcmRfcHJpdiAqcHJpdjsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKLQlpbnQgcmV0OwotCi0JLyogQWxsb2NhdGUgdGhlIHByaXZhdGUgZGF0YSAqLwotCXByaXYgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByaXYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmV0ID0gcnNyY19jYXJkX3BhcnNlX29mKG5wLCBwcml2LCBkZXYpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWlmIChyZXQgIT0gLUVQUk9CRV9ERUZFUikKLQkJCWRldl9lcnIoZGV2LCAicGFyc2UgZXJyb3IgJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXNuZF9zb2NfY2FyZF9zZXRfZHJ2ZGF0YSgmcHJpdi0+c25kX2NhcmQsIHByaXYpOwotCi0JcmV0ID0gZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NhcmQoJnBkZXYtPmRldiwgJnByaXYtPnNuZF9jYXJkKTsKLQlpZiAocmV0ID49IDApCi0JCXJldHVybiByZXQ7Ci1lcnI6Ci0JcnNyY19jYXJkX3VucmVmKCZwcml2LT5zbmRfY2FyZCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHJzcmNfY2FyZF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0KLQlyZXR1cm4gcnNyY19jYXJkX3VucmVmKGNhcmQpOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciByc3JjX2NhcmQgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAicmVuZXNhcy1zcmMtYXVkaW8tY2FyZCIsCi0JCS5vZl9tYXRjaF90YWJsZSA9IHJzcmNfY2FyZF9vZl9tYXRjaCwKLQl9LAotCS5wcm9iZSA9IHJzcmNfY2FyZF9wcm9iZSwKLQkucmVtb3ZlID0gcnNyY19jYXJkX3JlbW92ZSwKLX07Ci0KLW1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIocnNyY19jYXJkKTsKLQotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpyZW5lc2FzLXNyYy1hdWRpby1jYXJkIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlJlbmVzYXMgU2FtcGxpbmcgUmF0ZSBDb252ZXJ0IFNvdW5kIENhcmQiKTsKLU1PRFVMRV9BVVRIT1IoIkt1bmlub3JpIE1vcmltb3RvIDxrdW5pbm9yaS5tb3JpbW90by5neEByZW5lc2FzLmNvbT4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaC9yY2FyL3NyYy5jIGIvc291bmQvc29jL3NoL3JjYXIvc3JjLmMKaW5kZXggZTM5ZjkxNi4uOTY5YTUxNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NoL3JjYXIvc3JjLmMKKysrIGIvc291bmQvc29jL3NoL3JjYXIvc3JjLmMKQEAgLTIyNiw4ICsyMjYsMTIgQEAKIAlpZnNjciA9IDA7CiAJZnNyYXRlID0gMDsKIAlpZiAoZmluICE9IGZvdXQpIHsKKwkJdTY0IG47CisKIAkJaWZzY3IgPSAxOwotCQlmc3JhdGUgPSAweDA0MDAwMDAgLyBmb3V0ICogZmluOworCQluID0gKHU2NCkweDA0MDAwMDAgKiBmaW47CisJCWRvX2RpdihuLCBmb3V0KTsKKwkJZnNyYXRlID0gbjsKIAl9CiAKIAkvKgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL3JjYXIvc3NpLmMgYi9zb3VuZC9zb2Mvc2gvcmNhci9zc2kuYwppbmRleCA1Zjg0OGYwLi42Y2I2ZGIwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvcmNhci9zc2kuYworKysgYi9zb3VuZC9zb2Mvc2gvcmNhci9zc2kuYwpAQCAtOTI4LDcgKzkyOCw3IEBACiAJCX0KIAogCQlvcHMgPSAmcnNuZF9zc2lfbm9uX29wczsKLQkJaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgInBpby10cmFuc2ZlciIsIE5VTEwpKQorCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAicGlvLXRyYW5zZmVyIikpCiAJCQlvcHMgPSAmcnNuZF9zc2lfcGlvX29wczsKIAkJZWxzZQogCQkJb3BzID0gJnJzbmRfc3NpX2RtYV9vcHM7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLWFjOTcuYyBiL3NvdW5kL3NvYy9zb2MtYWM5Ny5jCmluZGV4IGJjNGE1NWIuLjZjOGIwYjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zb2MtYWM5Ny5jCisrKyBiL3NvdW5kL3NvYy9zb2MtYWM5Ny5jCkBAIC0xMTYsNyArMTE2LDcgQEAKIAlyZXR1cm4gc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgQUM5N19HUElPX0NGRywgMSA8PCBvZmZzZXQsIDApOwogfQogCi1zdGF0aWMgc3RydWN0IGdwaW9fY2hpcCBzbmRfc29jX2FjOTdfZ3Bpb19jaGlwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2NoaXAgc25kX3NvY19hYzk3X2dwaW9fY2hpcCA9IHsKIAkubGFiZWwJCQk9ICJzbmRfc29jX2FjOTciLAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLnJlcXVlc3QJCT0gc25kX3NvY19hYzk3X2dwaW9fcmVxdWVzdCwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zb2MtY29tcHJlc3MuYyBiL3NvdW5kL3NvYy9zb2MtY29tcHJlc3MuYwppbmRleCBkMmRmNDZjLi5iZjdiNTJmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLWNvbXByZXNzLmMKKysrIGIvc291bmQvc29jL3NvYy1jb21wcmVzcy5jCkBAIC0xMjEsNyArMTIxLDcgQEAKIAogCQlkcGNtX2JlX2Rpc2Nvbm5lY3QoZmUsIHN0cmVhbSk7CiAJCWZlLT5kcGNtW3N0cmVhbV0ucnVudGltZSA9IE5VTEw7Ci0JCWdvdG8gZmVfZXJyOworCQlnb3RvIHBhdGhfZXJyOwogCX0KIAogCWRwY21fY2xlYXJfcGVuZGluZ19zdGF0ZShmZSwgc3RyZWFtKTsKQEAgLTEzNiw2ICsxMzYsOCBAQAogCiAJcmV0dXJuIDA7CiAKK3BhdGhfZXJyOgorCWRwY21fcGF0aF9wdXQoJmxpc3QpOwogZmVfZXJyOgogCWlmIChmZS0+ZGFpX2xpbmstPmNvbXByX29wcyAmJiBmZS0+ZGFpX2xpbmstPmNvbXByX29wcy0+c2h1dGRvd24pCiAJCWZlLT5kYWlfbGluay0+Y29tcHJfb3BzLT5zaHV0ZG93bihjc3RyZWFtKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zb2MtY29yZS5jIGIvc291bmQvc29jL3NvYy1jb3JlLmMKaW5kZXggMTYzNjljYS4uYzBiYmNkOSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy1jb3JlLmMKKysrIGIvc291bmQvc29jL3NvYy1jb3JlLmMKQEAgLTEwNTYsNyArMTA1Niw3IEBACiAJaWYgKCFydGQtPnBsYXRmb3JtKSB7CiAJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQVNvQzogcGxhdGZvcm0gJXMgbm90IHJlZ2lzdGVyZWRcbiIsCiAJCQlkYWlfbGluay0+cGxhdGZvcm1fbmFtZSk7Ci0JCXJldHVybiAtRVBST0JFX0RFRkVSOworCQlnb3RvIF9lcnJfZGVmZXI7CiAJfQogCiAJc29jX2FkZF9wY21fcnVudGltZShjYXJkLCBydGQpOwpAQCAtMjA4MywxNCArMjA4MywxMyBAQAogCS8qIHJlbW92ZSBhdXhpbGlhcnkgZGV2aWNlcyAqLwogCXNvY19yZW1vdmVfYXV4X2RldmljZXMoY2FyZCk7CiAKKwlzbmRfc29jX2RhcG1fZnJlZSgmY2FyZC0+ZGFwbSk7CiAJc29jX2NsZWFudXBfY2FyZF9kZWJ1Z2ZzKGNhcmQpOwogCiAJLyogcmVtb3ZlIHRoZSBjYXJkICovCiAJaWYgKGNhcmQtPnJlbW92ZSkKIAkJY2FyZC0+cmVtb3ZlKGNhcmQpOwogCi0Jc25kX3NvY19kYXBtX2ZyZWUoJmNhcmQtPmRhcG0pOwotCiAJc25kX2NhcmRfZnJlZShjYXJkLT5zbmRfY2FyZCk7CiAJcmV0dXJuIDA7CiAKQEAgLTMzMzMsMTkgKzMzMzIsNiBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyX2ZyZWU7CiAKLQlpZiAoY29kZWNfZHJ2LT5jb250cm9scykgewotCQljb2RlYy0+Y29tcG9uZW50LmNvbnRyb2xzID0gY29kZWNfZHJ2LT5jb250cm9sczsKLQkJY29kZWMtPmNvbXBvbmVudC5udW1fY29udHJvbHMgPSBjb2RlY19kcnYtPm51bV9jb250cm9sczsKLQl9Ci0JaWYgKGNvZGVjX2Rydi0+ZGFwbV93aWRnZXRzKSB7Ci0JCWNvZGVjLT5jb21wb25lbnQuZGFwbV93aWRnZXRzID0gY29kZWNfZHJ2LT5kYXBtX3dpZGdldHM7Ci0JCWNvZGVjLT5jb21wb25lbnQubnVtX2RhcG1fd2lkZ2V0cyA9IGNvZGVjX2Rydi0+bnVtX2RhcG1fd2lkZ2V0czsKLQl9Ci0JaWYgKGNvZGVjX2Rydi0+ZGFwbV9yb3V0ZXMpIHsKLQkJY29kZWMtPmNvbXBvbmVudC5kYXBtX3JvdXRlcyA9IGNvZGVjX2Rydi0+ZGFwbV9yb3V0ZXM7Ci0JCWNvZGVjLT5jb21wb25lbnQubnVtX2RhcG1fcm91dGVzID0gY29kZWNfZHJ2LT5udW1fZGFwbV9yb3V0ZXM7Ci0JfQotCiAJaWYgKGNvZGVjX2Rydi0+cHJvYmUpCiAJCWNvZGVjLT5jb21wb25lbnQucHJvYmUgPSBzbmRfc29jX2NvZGVjX2Rydl9wcm9iZTsKIAlpZiAoY29kZWNfZHJ2LT5yZW1vdmUpCkBAIC0zNzMzLDcgKzM3MTksNyBAQAogCSAqIFNORF9TT0NfREFJRk1UX0NMT0NLX01BU0sgYXJlYQogCSAqLwogCXNucHJpbnRmKHByb3AsIHNpemVvZihwcm9wKSwgIiVzY29udGludW91cy1jbG9jayIsIHByZWZpeCk7Ci0JaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgcHJvcCwgTlVMTCkpCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgcHJvcCkpCiAJCWZvcm1hdCB8PSBTTkRfU09DX0RBSUZNVF9DT05UOwogCWVsc2UKIAkJZm9ybWF0IHw9IFNORF9TT0NfREFJRk1UX0dBVEVEOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1kYXBtLmMgYi9zb3VuZC9zb2Mvc29jLWRhcG0uYwppbmRleCA4Njk4YzI2Li4zYmJlMzJlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLWRhcG0uYworKysgYi9zb3VuZC9zb2Mvc29jLWRhcG0uYwpAQCAtODIzLDYgKzgyMyw3IEBACiAJCQljYXNlIHNuZF9zb2NfZGFwbV9zd2l0Y2g6CiAJCQljYXNlIHNuZF9zb2NfZGFwbV9taXhlcjoKIAkJCWNhc2Ugc25kX3NvY19kYXBtX3BnYToKKwkJCWNhc2Ugc25kX3NvY19kYXBtX291dF9kcnY6CiAJCQkJd25hbWVfaW5fbG9uZ19uYW1lID0gdHJ1ZTsKIAkJCQlrY25hbWVfaW5fbG9uZ19uYW1lID0gdHJ1ZTsKIAkJCQlicmVhazsKQEAgLTExNjksNyArMTE3MCw3IEBACiAgKiBAY3VzdG9tX3N0b3BfY29uZGl0aW9uOiAob3B0aW9uYWwpIGEgZnVuY3Rpb24gbWVhbnQgdG8gc3RvcCB0aGUgd2lkZ2V0IGdyYXBoCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICB3YWxrIGJhc2VkIG9uIGN1c3RvbSBsb2dpYy4KICAqCi0gKiBRdWVyaWVzIERBUE0gZ3JhcGggYXMgdG8gd2hldGhlciBhbiB2YWxpZCBhdWRpbyBzdHJlYW0gcGF0aCBleGlzdHMgZm9yCisgKiBRdWVyaWVzIERBUE0gZ3JhcGggYXMgdG8gd2hldGhlciBhIHZhbGlkIGF1ZGlvIHN0cmVhbSBwYXRoIGV4aXN0cyBmb3IKICAqIHRoZSBpbml0aWFsIHN0cmVhbSBzcGVjaWZpZWQgYnkgbmFtZS4gVGhpcyB0YWtlcyBpbnRvIGFjY291bnQKICAqIGN1cnJlbnQgbWl4ZXIgYW5kIG11eCBrY29udHJvbCBzZXR0aW5ncy4gQ3JlYXRlcyBsaXN0IG9mIHZhbGlkIHdpZGdldHMuCiAgKgpAQCAtMTI5NCw4ICsxMjk1LDcgQEAKIAlyZXR1cm4gdy0+bmV3X3Bvd2VyOwogfQogCi0vKiBHZW5lcmljIGNoZWNrIHRvIHNlZSBpZiBhIHdpZGdldCBzaG91bGQgYmUgcG93ZXJlZC4KLSAqLworLyogR2VuZXJpYyBjaGVjayB0byBzZWUgaWYgYSB3aWRnZXQgc2hvdWxkIGJlIHBvd2VyZWQuICovCiBzdGF0aWMgaW50IGRhcG1fZ2VuZXJpY19jaGVja19wb3dlcihzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdykKIHsKIAlpbnQgaW4sIG91dDsKQEAgLTE2NDYsNyArMTY0Niw3IEBACiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkID0gZGF0YTsKIAlpbnQgcmV0OwogCi0JLyogSWYgd2UncmUgb2ZmIGFuZCB3ZSdyZSBub3Qgc3VwcG9zZWQgdG8gYmUgZ28gaW50byBTVEFOREJZICovCisJLyogSWYgd2UncmUgb2ZmIGFuZCB3ZSdyZSBub3Qgc3VwcG9zZWQgdG8gZ28gaW50byBTVEFOREJZICovCiAJaWYgKGQtPmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRiAmJgogCSAgICBkLT50YXJnZXRfYmlhc19sZXZlbCAhPSBTTkRfU09DX0JJQVNfT0ZGKSB7CiAJCWlmIChkLT5kZXYpCkBAIC0xNzk4LDcgKzE3OTgsNyBAQAogICogQSBjb21wbGV0ZSBwYXRoIGlzIGEgcm91dGUgdGhhdCBoYXMgdmFsaWQgZW5kcG9pbnRzIGkuZS46LQogICoKICAqICBvIERBQyB0byBvdXRwdXQgcGluLgotICogIG8gSW5wdXQgUGluIHRvIEFEQy4KKyAqICBvIElucHV0IHBpbiB0byBBREMuCiAgKiAgbyBJbnB1dCBwaW4gdG8gT3V0cHV0IHBpbiAoYnlwYXNzLCBzaWRldG9uZSkKICAqICBvIERBQyB0byBBREMgKGxvb3BiYWNrKS4KICAqLwpAQCAtMjExNCw3ICsyMTE0LDcgQEAKICAqIHNvY19kYXBtX2Nvbm5lY3RfcGF0aCgpIC0gQ29ubmVjdHMgb3IgZGlzY29ubmVjdHMgYSBwYXRoCiAgKiBAcGF0aDogVGhlIHBhdGggdG8gdXBkYXRlCiAgKiBAY29ubmVjdDogVGhlIG5ldyBjb25uZWN0IHN0YXRlIG9mIHRoZSBwYXRoLiBUcnVlIGlmIHRoZSBwYXRoIGlzIGNvbm5lY3RlZCwKLSAqICBmYWxzZSBpZiBpdCBpcyBkaXNjb25uZXRlZC4KKyAqICBmYWxzZSBpZiBpdCBpcyBkaXNjb25uZWN0ZWQuCiAgKiBAcmVhc29uOiBUaGUgcmVhc29uIHdoeSB0aGUgcGF0aCBjaGFuZ2VkIChmb3IgZGVidWdnaW5nIG9ubHkpCiAgKi8KIHN0YXRpYyB2b2lkIHNvY19kYXBtX2Nvbm5lY3RfcGF0aChzdHJ1Y3Qgc25kX3NvY19kYXBtX3BhdGggKnBhdGgsCkBAIC0yMjMzLDcgKzIyMzMsNyBAQAogCQlpZiAody0+ZGFwbSAhPSBkYXBtKQogCQkJY29udGludWU7CiAKLQkJLyogb25seSBkaXNwbGF5IHdpZGdldHMgdGhhdCBidXJubSBwb3dlciAqLworCQkvKiBvbmx5IGRpc3BsYXkgd2lkZ2V0cyB0aGF0IGJ1cm4gcG93ZXIgKi8KIAkJc3dpdGNoICh3LT5pZCkgewogCQljYXNlIHNuZF9zb2NfZGFwbV9ocDoKIAkJY2FzZSBzbmRfc29jX2RhcG1fbWljOgpAQCAtMjQ2MSw3ICsyNDYxLDcgQEAKIAogCXN3aXRjaCAody0+aWQpIHsKIAljYXNlIHNuZF9zb2NfZGFwbV9pbnB1dDoKLQkJLyogT24gYSBmdWxseSByb3V0ZWQgY2FyZCBhIGlucHV0IGlzIG5ldmVyIGEgc291cmNlICovCisJCS8qIE9uIGEgZnVsbHkgcm91dGVkIGNhcmQgYW4gaW5wdXQgaXMgbmV2ZXIgYSBzb3VyY2UgKi8KIAkJaWYgKHctPmRhcG0tPmNhcmQtPmZ1bGx5X3JvdXRlZCkKIAkJCXJldHVybjsKIAkJZXAgPSBTTkRfU09DX0RBUE1fRVBfU09VUkNFOwpAQCAtMzA0OSw2ICszMDQ5LDkgQEAKIAl9CiAJbXV0ZXhfdW5sb2NrKCZjYXJkLT5kYXBtX211dGV4KTsKIAorCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlpZiAoaW52ZXJ0KQogCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IG1heCAtIHZhbDsKIAllbHNlCkBAIC0zMjAwLDcgKzMyMDMsNyBAQAogCWlmIChlLT5zaGlmdF9sICE9IGUtPnNoaWZ0X3IpIHsKIAkJaWYgKGl0ZW1bMV0gPiBlLT5pdGVtcykKIAkJCXJldHVybiAtRUlOVkFMOwotCQl2YWwgfD0gc25kX3NvY19lbnVtX2l0ZW1fdG9fdmFsKGUsIGl0ZW1bMV0pIDw8IGUtPnNoaWZ0X2w7CisJCXZhbCB8PSBzbmRfc29jX2VudW1faXRlbV90b192YWwoZSwgaXRlbVsxXSkgPDwgZS0+c2hpZnRfcjsKIAkJbWFzayB8PSBlLT5tYXNrIDw8IGUtPnNoaWZ0X3I7CiAJfQogCkBAIC0zNDQ1LDcgKzM0NDgsNyBAQAogCQl3LT5lbmRwb2ludHNbZGlyXSA9IC0xOwogCX0KIAotCS8qIG1hY2hpbmUgbGF5ZXIgc2V0IHVwcyB1bmNvbm5lY3RlZCBwaW5zIGFuZCBpbnNlcnRpb25zICovCisJLyogbWFjaGluZSBsYXllciBzZXRzIHVwIHVuY29ubmVjdGVkIHBpbnMgYW5kIGluc2VydGlvbnMgKi8KIAl3LT5jb25uZWN0ZWQgPSAxOwogCXJldHVybiB3OwogfQpAQCAtMzQ5Myw2ICszNDk2LDcgQEAKIAljb25zdCBzdHJ1Y3Qgc25kX3NvY19wY21fc3RyZWFtICpjb25maWcgPSB3LT5wYXJhbXMgKyB3LT5wYXJhbXNfc2VsZWN0OwogCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSBzdWJzdHJlYW07CiAJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMgPSBOVUxMOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBOVUxMOwogCXU2NCBmbXQ7CiAJaW50IHJldDsKIApAQCAtMzU0MSw2ICszNTQ1LDE0IEBACiAKIAltZW1zZXQoJnN1YnN0cmVhbSwgMCwgc2l6ZW9mKHN1YnN0cmVhbSkpOwogCisJLyogQWxsb2NhdGUgYSBkdW1teSBzbmRfcGNtX3J1bnRpbWUgZm9yIHN0YXJ0dXAoKSBhbmQgb3RoZXIgb3BzKCkgKi8KKwlydW50aW1lID0ga3phbGxvYyhzaXplb2YoKnJ1bnRpbWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJ1bnRpbWUpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCXN1YnN0cmVhbS5ydW50aW1lID0gcnVudGltZTsKKwogCXN3aXRjaCAoZXZlbnQpIHsKIAljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgogCQlzdWJzdHJlYW0uc3RyZWFtID0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFOwpAQCAtMzYwNiw2ICszNjE4LDcgQEAKIAl9CiAKIG91dDoKKwlrZnJlZShydW50aW1lKTsKIAlrZnJlZShwYXJhbXMpOwogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLW9wcy5jIGIvc291bmQvc29jL3NvYy1vcHMuYwppbmRleCBhNTEzYTM0Li45ZmMxYTdiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLW9wcy5jCisrKyBiL3NvdW5kL3NvYy9zb2Mtb3BzLmMKQEAgLTc3LDcgKzc3LDcgQEAKIAlpdGVtID0gc25kX3NvY19lbnVtX3ZhbF90b19pdGVtKGUsIHZhbCk7CiAJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGl0ZW07CiAJaWYgKGUtPnNoaWZ0X2wgIT0gZS0+c2hpZnRfcikgewotCQl2YWwgPSAocmVnX3ZhbCA+PiBlLT5zaGlmdF9sKSAmIGUtPm1hc2s7CisJCXZhbCA9IChyZWdfdmFsID4+IGUtPnNoaWZ0X3IpICYgZS0+bWFzazsKIAkJaXRlbSA9IHNuZF9zb2NfZW51bV92YWxfdG9faXRlbShlLCB2YWwpOwogCQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzFdID0gaXRlbTsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLXBjbS5jIGIvc291bmQvc29jL3NvYy1wY20uYwppbmRleCA2MGQ3MDJmLi5kNTZhMTZhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLXBjbS5jCisrKyBiL3NvdW5kL3NvYy9zb2MtcGNtLmMKQEAgLTE2OTQsNiArMTY5NCw5IEBACiAJCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBiZV9zdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKIAkJaW50IGk7CiAKKwkJaWYgKHJ0ZC0+ZGFpX2xpbmstPmJlX2h3X3BhcmFtc19maXh1cCkKKwkJCWNvbnRpbnVlOworCiAJCWlmIChzb2NfcGNtX2hhc19zeW1tZXRyeShiZV9zdWJzdHJlYW0pKQogCQkJYmVfc3Vic3RyZWFtLT5ydW50aW1lLT5ody5pbmZvIHw9IFNORFJWX1BDTV9JTkZPX0pPSU5UX0RVUExFWDsKIApAQCAtMTc5MCw3ICsxNzkzLDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWRldl9kYmcoYmUtPmRldiwgIkFTb0M6IGNsb3NlIEJFICVzXG4iLAotCQkJZHBjbS0+ZmUtPmRhaV9saW5rLT5uYW1lKTsKKwkJCWJlLT5kYWlfbGluay0+bmFtZSk7CiAKIAkJc29jX3BjbV9jbG9zZShiZV9zdWJzdHJlYW0pOwogCQliZV9zdWJzdHJlYW0tPnJ1bnRpbWUgPSBOVUxMOwpAQCAtMTg1Niw3ICsxODU5LDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWRldl9kYmcoYmUtPmRldiwgIkFTb0M6IGh3X2ZyZWUgQkUgJXNcbiIsCi0JCQlkcGNtLT5mZS0+ZGFpX2xpbmstPm5hbWUpOworCQkJYmUtPmRhaV9saW5rLT5uYW1lKTsKIAogCQlzb2NfcGNtX2h3X2ZyZWUoYmVfc3Vic3RyZWFtKTsKIApAQCAtMTkzNCw3ICsxOTM3LDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWRldl9kYmcoYmUtPmRldiwgIkFTb0M6IGh3X3BhcmFtcyBCRSAlc1xuIiwKLQkJCWRwY20tPmZlLT5kYWlfbGluay0+bmFtZSk7CisJCQliZS0+ZGFpX2xpbmstPm5hbWUpOwogCiAJCXJldCA9IHNvY19wY21faHdfcGFyYW1zKGJlX3N1YnN0cmVhbSwgJmRwY20tPmh3X3BhcmFtcyk7CiAJCWlmIChyZXQgPCAwKSB7CkBAIC0yMDE0LDcgKzIwMTcsNyBAQAogCWludCByZXQ7CiAKIAlkZXZfZGJnKGRwY20tPmJlLT5kZXYsICJBU29DOiB0cmlnZ2VyIEJFICVzIGNtZCAlZFxuIiwKLQkJCWRwY20tPmZlLT5kYWlfbGluay0+bmFtZSwgY21kKTsKKwkJCWRwY20tPmJlLT5kYWlfbGluay0+bmFtZSwgY21kKTsKIAogCXJldCA9IHNvY19wY21fdHJpZ2dlcihzdWJzdHJlYW0sIGNtZCk7CiAJaWYgKHJldCA8IDApCkBAIC0yMjI5LDcgKzIyMzIsNyBAQAogCQkJY29udGludWU7CiAKIAkJZGV2X2RiZyhiZS0+ZGV2LCAiQVNvQzogcHJlcGFyZSBCRSAlc1xuIiwKLQkJCWRwY20tPmZlLT5kYWlfbGluay0+bmFtZSk7CisJCQliZS0+ZGFpX2xpbmstPm5hbWUpOwogCiAJCXJldCA9IHNvY19wY21fcHJlcGFyZShiZV9zdWJzdHJlYW0pOwogCQlpZiAocmV0IDwgMCkgewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy10b3BvbG9neS5jIGIvc291bmQvc29jL3NvYy10b3BvbG9neS5jCmluZGV4IGVlN2YxNWEuLjZiMDUwNDcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zb2MtdG9wb2xvZ3kuYworKysgYi9zb3VuZC9zb2Mvc29jLXRvcG9sb2d5LmMKQEAgLTQ4LDkgKzQ4LDEwIEBACiAjZGVmaW5lIFNPQ19UUExHX1BBU1NfUENNX0RBSQkJNAogI2RlZmluZSBTT0NfVFBMR19QQVNTX0dSQVBICQk1CiAjZGVmaW5lIFNPQ19UUExHX1BBU1NfUElOUwkJNgorI2RlZmluZSBTT0NfVFBMR19QQVNTX0JFX0RBSQkJNwogCiAjZGVmaW5lIFNPQ19UUExHX1BBU1NfU1RBUlQJU09DX1RQTEdfUEFTU19NQU5JRkVTVAotI2RlZmluZSBTT0NfVFBMR19QQVNTX0VORAlTT0NfVFBMR19QQVNTX1BJTlMKKyNkZWZpbmUgU09DX1RQTEdfUEFTU19FTkQJU09DX1RQTEdfUEFTU19CRV9EQUkKIAogc3RydWN0IHNvY190cGxnIHsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwpAQCAtMTQ3NSw2ICsxNDc2LDcgQEAKIAlpZiAod2lkZ2V0ID09IE5VTEwpIHsKIAkJZGV2X2Vycih0cGxnLT5kZXYsICJBU29DOiBmYWlsZWQgdG8gY3JlYXRlIHdpZGdldCAlcyBjb250cm9sc1xuIiwKIAkJCXctPm5hbWUpOworCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGhkcl9lcnI7CiAJfQogCkBAIC0xNTU0LDYgKzE1NTYsMjUgQEAKIAlzdHJlYW0tPnJhdGVfbWluID0gY2Fwcy0+cmF0ZV9taW47CiAJc3RyZWFtLT5yYXRlX21heCA9IGNhcHMtPnJhdGVfbWF4OwogCXN0cmVhbS0+Zm9ybWF0cyA9IGNhcHMtPmZvcm1hdHM7CisJc3RyZWFtLT5zaWdfYml0cyA9IGNhcHMtPnNpZ19iaXRzOworfQorCitzdGF0aWMgdm9pZCBzZXRfZGFpX2ZsYWdzKHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgKmRhaV9kcnYsCisJCQkgIHVuc2lnbmVkIGludCBmbGFnX21hc2ssIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlpZiAoZmxhZ19tYXNrICYgU05EX1NPQ19UUExHX0RBSV9GTEdCSVRfU1lNTUVUUklDX1JBVEVTKQorCQlkYWlfZHJ2LT5zeW1tZXRyaWNfcmF0ZXMgPQorCQkJZmxhZ3MgJiBTTkRfU09DX1RQTEdfREFJX0ZMR0JJVF9TWU1NRVRSSUNfUkFURVMgPyAxIDogMDsKKworCWlmIChmbGFnX21hc2sgJiBTTkRfU09DX1RQTEdfREFJX0ZMR0JJVF9TWU1NRVRSSUNfQ0hBTk5FTFMpCisJCWRhaV9kcnYtPnN5bW1ldHJpY19jaGFubmVscyA9CisJCQlmbGFncyAmIFNORF9TT0NfVFBMR19EQUlfRkxHQklUX1NZTU1FVFJJQ19DSEFOTkVMUyA/CisJCQkxIDogMDsKKworCWlmIChmbGFnX21hc2sgJiBTTkRfU09DX1RQTEdfREFJX0ZMR0JJVF9TWU1NRVRSSUNfU0FNUExFQklUUykKKwkJZGFpX2Rydi0+c3ltbWV0cmljX3NhbXBsZWJpdHMgPQorCQkJZmxhZ3MgJiBTTkRfU09DX1RQTEdfREFJX0ZMR0JJVF9TWU1NRVRSSUNfU0FNUExFQklUUyA/CisJCQkxIDogMDsKIH0KIAogc3RhdGljIGludCBzb2NfdHBsZ19kYWlfY3JlYXRlKHN0cnVjdCBzb2NfdHBsZyAqdHBsZywKQEAgLTE2OTAsOCArMTcxMSw5NiBAQAogCXJldHVybiAwOwogfQogCisvKiAqCisgKiBzb2NfdHBsZ19iZV9kYWlfY29uZmlnIC0gRmluZCBhbmQgY29uZmlndXJlIGFuIGV4aXN0aW5nIEJFIERBSS4KKyAqIEB0cGxnOiB0b3BvbG9neSBjb250ZXh0CisgKiBAYmU6IHRvcG9sb2d5IEJFIERBSSBjb25maWdzLgorICoKKyAqIFRoZSBCRSBkYWkgc2hvdWxkIGFscmVhZHkgYmUgcmVnaXN0ZXJlZCBieSB0aGUgcGxhdGZvcm0gZHJpdmVyLiBUaGUKKyAqIHBsYXRmb3JtIGRyaXZlciBzaG91bGQgc3BlY2lmeSB0aGUgQkUgREFJIG5hbWUgYW5kIElEIGZvciBtYXRjaGluZy4KKyAqLworc3RhdGljIGludCBzb2NfdHBsZ19iZV9kYWlfY29uZmlnKHN0cnVjdCBzb2NfdHBsZyAqdHBsZywKKwkJCQkgIHN0cnVjdCBzbmRfc29jX3RwbGdfYmVfZGFpICpiZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYWlfbGlua19jb21wb25lbnQgZGFpX2NvbXBvbmVudCA9IHswfTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyICpkYWlfZHJ2OworCXN0cnVjdCBzbmRfc29jX3BjbV9zdHJlYW0gKnN0cmVhbTsKKwlzdHJ1Y3Qgc25kX3NvY190cGxnX3N0cmVhbV9jYXBzICpjYXBzOworCWludCByZXQ7CisKKwlkYWlfY29tcG9uZW50LmRhaV9uYW1lID0gYmUtPmRhaV9uYW1lOworCWRhaSA9IHNuZF9zb2NfZmluZF9kYWkoJmRhaV9jb21wb25lbnQpOworCWlmICghZGFpKSB7CisJCWRldl9lcnIodHBsZy0+ZGV2LCAiQVNvQzogQkUgREFJICVzIG5vdCByZWdpc3RlcmVkXG4iLAorCQkJYmUtPmRhaV9uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGJlLT5kYWlfaWQgIT0gZGFpLT5pZCkgeworCQlkZXZfZXJyKHRwbGctPmRldiwgIkFTb0M6IEJFIERBSSAlcyBpZCBtaXNtYXRjaFxuIiwKKwkJCWJlLT5kYWlfbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRhaV9kcnYgPSBkYWktPmRyaXZlcjsKKwlpZiAoIWRhaV9kcnYpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGJlLT5wbGF5YmFjaykgeworCQlzdHJlYW0gPSAmZGFpX2Rydi0+cGxheWJhY2s7CisJCWNhcHMgPSAmYmUtPmNhcHNbU05EX1NPQ19UUExHX1NUUkVBTV9QTEFZQkFDS107CisJCXNldF9zdHJlYW1faW5mbyhzdHJlYW0sIGNhcHMpOworCX0KKworCWlmIChiZS0+Y2FwdHVyZSkgeworCQlzdHJlYW0gPSAmZGFpX2Rydi0+Y2FwdHVyZTsKKwkJY2FwcyA9ICZiZS0+Y2Fwc1tTTkRfU09DX1RQTEdfU1RSRUFNX0NBUFRVUkVdOworCQlzZXRfc3RyZWFtX2luZm8oc3RyZWFtLCBjYXBzKTsKKwl9CisKKwlpZiAoYmUtPmZsYWdfbWFzaykKKwkJc2V0X2RhaV9mbGFncyhkYWlfZHJ2LCBiZS0+ZmxhZ19tYXNrLCBiZS0+ZmxhZ3MpOworCisJLyogcGFzcyBjb250cm9sIHRvIGNvbXBvbmVudCBkcml2ZXIgZm9yIG9wdGlvbmFsIGZ1cnRoZXIgaW5pdCAqLworCXJldCA9IHNvY190cGxnX2RhaV9sb2FkKHRwbGcsIGRhaV9kcnYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIodHBsZy0+Y29tcC0+ZGV2LCAiQVNvQzogREFJIGxvYWRpbmcgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb2NfdHBsZ19iZV9kYWlfZWxlbXNfbG9hZChzdHJ1Y3Qgc29jX3RwbGcgKnRwbGcsCisJCQkJICAgICAgc3RydWN0IHNuZF9zb2NfdHBsZ19oZHIgKmhkcikKK3sKKwlzdHJ1Y3Qgc25kX3NvY190cGxnX2JlX2RhaSAqYmU7CisJaW50IGNvdW50ID0gaGRyLT5jb3VudDsKKwlpbnQgaTsKKworCWlmICh0cGxnLT5wYXNzICE9IFNPQ19UUExHX1BBU1NfQkVfREFJKQorCQlyZXR1cm4gMDsKKworCS8qIGNvbmZpZyB0aGUgZXhpc3RpbmcgQkUgREFJcyAqLworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWJlID0gKHN0cnVjdCBzbmRfc29jX3RwbGdfYmVfZGFpICopdHBsZy0+cG9zOworCQlpZiAoYmUtPnNpemUgIT0gc2l6ZW9mKCpiZSkpIHsKKwkJCWRldl9lcnIodHBsZy0+ZGV2LCAiQVNvQzogaW52YWxpZCBCRSBEQUkgc2l6ZVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXNvY190cGxnX2JlX2RhaV9jb25maWcodHBsZywgYmUpOworCQl0cGxnLT5wb3MgKz0gKHNpemVvZigqYmUpICsgYmUtPnByaXYuc2l6ZSk7CisJfQorCisJZGV2X2RiZyh0cGxnLT5kZXYsICJBU29DOiBDb25maWd1cmUgJWQgQkUgREFJc1xuIiwgY291bnQpOworCXJldHVybiAwOworfQorCisKIHN0YXRpYyBpbnQgc29jX3RwbGdfbWFuaWZlc3RfbG9hZChzdHJ1Y3Qgc29jX3RwbGcgKnRwbGcsCi0Jc3RydWN0IHNuZF9zb2NfdHBsZ19oZHIgKmhkcikKKwkJCQkgIHN0cnVjdCBzbmRfc29jX3RwbGdfaGRyICpoZHIpCiB7CiAJc3RydWN0IHNuZF9zb2NfdHBsZ19tYW5pZmVzdCAqbWFuaWZlc3Q7CiAKQEAgLTE3OTMsNiArMTkwMiw4IEBACiAJCXJldHVybiBzb2NfdHBsZ19kYXBtX3dpZGdldF9lbGVtc19sb2FkKHRwbGcsIGhkcik7CiAJY2FzZSBTTkRfU09DX1RQTEdfVFlQRV9QQ006CiAJCXJldHVybiBzb2NfdHBsZ19wY21fZWxlbXNfbG9hZCh0cGxnLCBoZHIpOworCWNhc2UgU05EX1NPQ19UUExHX1RZUEVfQkVfREFJOgorCQlyZXR1cm4gc29jX3RwbGdfYmVfZGFpX2VsZW1zX2xvYWQodHBsZywgaGRyKTsKIAljYXNlIFNORF9TT0NfVFBMR19UWVBFX01BTklGRVNUOgogCQlyZXR1cm4gc29jX3RwbGdfbWFuaWZlc3RfbG9hZCh0cGxnLCBoZHIpOwogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLXV0aWxzLmMgYi9zb3VuZC9zb2Mvc29jLXV0aWxzLmMKaW5kZXggNTNkZDA4NS4uMzkzZThmMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy11dGlscy5jCisrKyBiL3NvdW5kL3NvYy9zb2MtdXRpbHMuYwpAQCAtODAsNyArODAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIGR1bW15X2RtYV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIGR1bW15X2RtYV9vcHMgPSB7CiAJLm9wZW4JCT0gZHVtbXlfZG1hX29wZW4sCiAJLmlvY3RsCQk9IHNuZF9wY21fbGliX2lvY3RsLAogfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zdGkvc3RpX3VuaXBlcmlmLmMgYi9zb3VuZC9zb2Mvc3RpL3N0aV91bmlwZXJpZi5jCmluZGV4IDQ4OGVmNGUuLjU0OWZhYzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zdGkvc3RpX3VuaXBlcmlmLmMKKysrIGIvc291bmQvc29jL3N0aS9zdGlfdW5pcGVyaWYuYwpAQCAtMTksNiArMTksODQgQEAKICNkZWZpbmUgVU5JUEVSSUZfTUFYX0ZSQU1FX1NaIDB4MjAKICNkZWZpbmUgVU5JUEVSSUZfQUxMT1dFRF9GUkFNRV9TWiAoMHgwOCB8IDB4MTAgfCAweDE4IHwgVU5JUEVSSUZfTUFYX0ZSQU1FX1NaKQogCitzdHJ1Y3Qgc3RpX3VuaXBlcmlwaF9kZXZfZGF0YSB7CisJdW5zaWduZWQgaW50IGlkOyAvKiBOYiBhdmFpbGFibGUgcGxheWVyIGluc3RhbmNlcyAqLworCXVuc2lnbmVkIGludCB2ZXJzaW9uOyAvKiBwbGF5ZXIgSVAgdmVyc2lvbiAqLworCXVuc2lnbmVkIGludCBzdHJlYW07CisJY29uc3QgY2hhciAqZGFpX25hbWVzOworCWVudW0gdW5pcGVyaWZfdHlwZSB0eXBlOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdGlfdW5pcGVyaXBoX2Rldl9kYXRhIHN0aV91bmlwbGF5ZXJfaGRtaSA9IHsKKwkuaWQgPSAwLAorCS52ZXJzaW9uID0gU05EX1NUX1VOSVBFUklGX1ZFUlNJT05fVU5JX1BMUl9UT1BfMV8wLAorCS5zdHJlYW0gPSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLAorCS5kYWlfbmFtZXMgPSAiVW5pIFBsYXllciAjMCAoSERNSSkiLAorCS50eXBlID0gU05EX1NUX1VOSVBFUklGX1RZUEVfSERNSQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdGlfdW5pcGVyaXBoX2Rldl9kYXRhIHN0aV91bmlwbGF5ZXJfcGNtX291dCA9IHsKKwkuaWQgPSAxLAorCS52ZXJzaW9uID0gU05EX1NUX1VOSVBFUklGX1ZFUlNJT05fVU5JX1BMUl9UT1BfMV8wLAorCS5zdHJlYW0gPSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLAorCS5kYWlfbmFtZXMgPSAiVW5pIFBsYXllciAjMSAoUENNIE9VVCkiLAorCS50eXBlID0gU05EX1NUX1VOSVBFUklGX1RZUEVfUENNIHwgU05EX1NUX1VOSVBFUklGX1RZUEVfVERNLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdGlfdW5pcGVyaXBoX2Rldl9kYXRhIHN0aV91bmlwbGF5ZXJfZGFjID0geworCS5pZCA9IDIsCisJLnZlcnNpb24gPSBTTkRfU1RfVU5JUEVSSUZfVkVSU0lPTl9VTklfUExSX1RPUF8xXzAsCisJLnN0cmVhbSA9IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssCisJLmRhaV9uYW1lcyA9ICJVbmkgUGxheWVyICMyIChEQUMpIiwKKwkudHlwZSA9IFNORF9TVF9VTklQRVJJRl9UWVBFX1BDTSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RpX3VuaXBlcmlwaF9kZXZfZGF0YSBzdGlfdW5pcGxheWVyX3NwZGlmID0geworCS5pZCA9IDMsCisJLnZlcnNpb24gPSBTTkRfU1RfVU5JUEVSSUZfVkVSU0lPTl9VTklfUExSX1RPUF8xXzAsCisJLnN0cmVhbSA9IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssCisJLmRhaV9uYW1lcyA9ICJVbmkgUGxheWVyICMzIChTUERJRikiLAorCS50eXBlID0gU05EX1NUX1VOSVBFUklGX1RZUEVfU1BESUYKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RpX3VuaXBlcmlwaF9kZXZfZGF0YSBzdGlfdW5pcmVhZGVyX3BjbV9pbiA9IHsKKwkuaWQgPSAwLAorCS52ZXJzaW9uID0gU05EX1NUX1VOSVBFUklGX1ZFUlNJT05fVU5JX1JEUl8xXzAsCisJLnN0cmVhbSA9IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwKKwkuZGFpX25hbWVzID0gIlVuaSBSZWFkZXIgIzAgKFBDTSBJTikiLAorCS50eXBlID0gU05EX1NUX1VOSVBFUklGX1RZUEVfUENNIHwgU05EX1NUX1VOSVBFUklGX1RZUEVfVERNLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdGlfdW5pcGVyaXBoX2Rldl9kYXRhIHN0aV91bmlyZWFkZXJfaGRtaV9pbiA9IHsKKwkuaWQgPSAxLAorCS52ZXJzaW9uID0gU05EX1NUX1VOSVBFUklGX1ZFUlNJT05fVU5JX1JEUl8xXzAsCisJLnN0cmVhbSA9IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwKKwkuZGFpX25hbWVzID0gIlVuaSBSZWFkZXIgIzEgKEhETUkgSU4pIiwKKwkudHlwZSA9IFNORF9TVF9VTklQRVJJRl9UWVBFX1BDTSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNuZF9zb2Nfc3RpX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJzdCxzdGloNDA3LXVuaS1wbGF5ZXItaGRtaSIsCisJICAuZGF0YSA9ICZzdGlfdW5pcGxheWVyX2hkbWkKKwl9LAorCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQwNy11bmktcGxheWVyLXBjbS1vdXQiLAorCSAgLmRhdGEgPSAmc3RpX3VuaXBsYXllcl9wY21fb3V0CisJfSwKKwl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MDctdW5pLXBsYXllci1kYWMiLAorCSAgLmRhdGEgPSAmc3RpX3VuaXBsYXllcl9kYWMKKwl9LAorCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQwNy11bmktcGxheWVyLXNwZGlmIiwKKwkgIC5kYXRhID0gJnN0aV91bmlwbGF5ZXJfc3BkaWYKKwl9LAorCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQwNy11bmktcmVhZGVyLXBjbV9pbiIsCisJICAuZGF0YSA9ICZzdGlfdW5pcmVhZGVyX3BjbV9pbgorCX0sCisJeyAuY29tcGF0aWJsZSA9ICJzdCxzdGloNDA3LXVuaS1yZWFkZXItaGRtaSIsCisJICAuZGF0YSA9ICZzdGlfdW5pcmVhZGVyX2hkbWlfaW4KKwl9LAorCXt9LAorfTsKKwogaW50IHN0aV91bmlwZXJpcGhfc2V0X3RkbV9zbG90KHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCB1bnNpZ25lZCBpbnQgdHhfbWFzaywKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgcnhfbWFzaywgaW50IHNsb3RzLAogCQkJICAgICAgIGludCBzbG90X3dpZHRoKQpAQCAtMTY3LDggKzI0NSw4IEBACiAJCSAqIFVuaXBlcmlwaGVyYWwgaW5zdGFuY2UgSUQKIAkJICovCiAJCWN0cmwgPSAmdW5pLT5zbmRfY3RybHNbaV07Ci0JCWN0cmwtPmluZGV4ID0gdW5pLT5pbmZvLT5pZDsKLQkJY3RybC0+ZGV2aWNlID0gdW5pLT5pbmZvLT5pZDsKKwkJY3RybC0+aW5kZXggPSB1bmktPmlkOworCQljdHJsLT5kZXZpY2UgPSB1bmktPmlkOwogCX0KIAogCXJldHVybiBzbmRfc29jX2FkZF9kYWlfY29udHJvbHMoZGFpLCB1bmktPnNuZF9jdHJscywgdW5pLT5udW1fY3RybHMpOwpAQCAtMTg2LDcgKzI2NCw3IEBACiAJc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhICpkbWFfZGF0YTsKIAlpbnQgdHJhbnNmZXJfc2l6ZTsKIAotCWlmICh1bmktPmluZm8tPnR5cGUgPT0gU05EX1NUX1VOSVBFUklGX1RZUEVfVERNKQorCWlmICh1bmktPnR5cGUgPT0gU05EX1NUX1VOSVBFUklGX1RZUEVfVERNKQogCQkvKiB0cmFuc2ZlciBzaXplID0gdXNlciBmcmFtZSBzaXplIChpbiAzMi1iaXRzIEZJRk8gY2VsbCkgKi8KIAkJdHJhbnNmZXJfc2l6ZSA9IHNuZF9zb2NfcGFyYW1zX3RvX2ZyYW1lX3NpemUocGFyYW1zKSAvIDMyOwogCWVsc2UKQEAgLTIzNSw3ICszMTMsNyBAQAogCXN0cnVjdCB1bmlwZXJpZiAqdW5pID0gcHJpdi0+ZGFpX2RhdGEudW5pOwogCWludCByZXQ7CiAKLQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoZGFpLT5kZXYtPm9mX25vZGUsICJzdCxzdGktdW5pLXBsYXllciIpKSB7CisJaWYgKHByaXYtPmRhaV9kYXRhLnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CiAJCXJldCA9IHVuaV9wbGF5ZXJfcmVzdW1lKHVuaSk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwpAQCAtMjU2LDcgKzMzNCw3IEBACiAJc3RydWN0IHN0aV91bmlwZXJpcGhfZGFpICpkYWlfZGF0YSA9ICZwcml2LT5kYWlfZGF0YTsKIAogCS8qIERNQSBzZXR0aW5ncyovCi0JaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKGRhaS0+ZGV2LT5vZl9ub2RlLCAic3Qsc3RpLXVuaS1wbGF5ZXIiKSkKKwlpZiAocHJpdi0+ZGFpX2RhdGEuc3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCiAJCXNuZF9zb2NfZGFpX2luaXRfZG1hX2RhdGEoZGFpLCAmZGFpX2RhdGEtPmRtYV9kYXRhLCBOVUxMKTsKIAllbHNlCiAJCXNuZF9zb2NfZGFpX2luaXRfZG1hX2RhdGEoZGFpLCBOVUxMLCAmZGFpX2RhdGEtPmRtYV9kYXRhKTsKQEAgLTI4MCwyNSArMzU4LDMyIEBACiBzdGF0aWMgaW50IHN0aV91bmlwZXJpcGhfY3B1X2RhaV9vZihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCiAJCQkJICAgIHN0cnVjdCBzdGlfdW5pcGVyaXBoX2RhdGEgKnByaXYpCiB7Ci0JY29uc3QgY2hhciAqc3RyOwotCWludCByZXQ7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnByaXYtPnBkZXYtPmRldjsKIAlzdHJ1Y3Qgc3RpX3VuaXBlcmlwaF9kYWkgKmRhaV9kYXRhID0gJnByaXYtPmRhaV9kYXRhOwogCXN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgKmRhaSA9IHByaXYtPmRhaTsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fc3RyZWFtICpzdHJlYW07CiAJc3RydWN0IHVuaXBlcmlmICp1bmk7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQ7CisJY29uc3Qgc3RydWN0IHN0aV91bmlwZXJpcGhfZGV2X2RhdGEgKmRldl9kYXRhOworCWNvbnN0IGNoYXIgKm1vZGU7CisKKwkvKiBQb3B1bGF0ZSBkYXRhIHN0cnVjdHVyZSBkZXBlbmRpbmcgb24gY29tcGF0aWJpbGl0eSAqLworCW9mX2lkID0gb2ZfbWF0Y2hfbm9kZShzbmRfc29jX3N0aV9tYXRjaCwgbm9kZSk7CisJaWYgKCFvZl9pZC0+ZGF0YSkgeworCQlkZXZfZXJyKGRldiwgImRhdGEgYXNzb2NpYXRlZCB0byBkZXZpY2UgaXMgbWlzc2luZyIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGV2X2RhdGEgPSAoc3RydWN0IHN0aV91bmlwZXJpcGhfZGV2X2RhdGEgKilvZl9pZC0+ZGF0YTsKIAogCXVuaSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqdW5pKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF1bmkpCiAJCXJldHVybiAtRU5PTUVNOwogCisJdW5pLT5pZCA9IGRldl9kYXRhLT5pZDsKKwl1bmktPnZlciA9IGRldl9kYXRhLT52ZXJzaW9uOworCiAJKmRhaSA9IHN0aV91bmlwZXJpcGhfZGFpX3RlbXBsYXRlOwotCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKG5vZGUsICJkYWktbmFtZSIsICZzdHIpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IGRhaSBuYW1lIG1pc3NpbmcuXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlkYWktPm5hbWUgPSBzdHI7CisJZGFpLT5uYW1lID0gZGV2X2RhdGEtPmRhaV9uYW1lczsKIAogCS8qIEdldCByZXNvdXJjZXMgKi8KIAl1bmktPm1lbV9yZWdpb24gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocHJpdi0+cGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwpAQCAtMzIyLDkgKzQwNywyMCBAQAogCQlyZXR1cm4gLUVOWElPOwogCX0KIAotCWRhaV9kYXRhLT51bmkgPSB1bmk7CisJdW5pLT50eXBlID0gZGV2X2RhdGEtPnR5cGU7CiAKLQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobm9kZSwgInN0LHN0aS11bmktcGxheWVyIikpIHsKKwkvKiBjaGVjayBpZiBwbGF5ZXIgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgZm9yIHRkbSAqLworCWlmIChkZXZfZGF0YS0+dHlwZSAmIFNORF9TVF9VTklQRVJJRl9UWVBFX1RETSkgeworCQlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKG5vZGUsICJzdCx0ZG0tbW9kZSIsICZtb2RlKSkKKwkJCXVuaS0+dHlwZSA9IFNORF9TVF9VTklQRVJJRl9UWVBFX1RETTsKKwkJZWxzZQorCQkJdW5pLT50eXBlID0gU05EX1NUX1VOSVBFUklGX1RZUEVfUENNOworCX0KKworCWRhaV9kYXRhLT51bmkgPSB1bmk7CisJZGFpX2RhdGEtPnN0cmVhbSA9IGRldl9kYXRhLT5zdHJlYW07CisKKwlpZiAocHJpdi0+ZGFpX2RhdGEuc3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKIAkJdW5pX3BsYXllcl9pbml0KHByaXYtPnBkZXYsIHVuaSk7CiAJCXN0cmVhbSA9ICZkYWktPnBsYXliYWNrOwogCX0gZWxzZSB7CkBAIC0zNzYsMTIgKzQ3Miw2IEBACiAJCQkJCSAgICAgICAmZG1hZW5naW5lX3BjbV9jb25maWcsIDApOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzbmRfc29jX3N0aV9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RpLXVuaS1wbGF5ZXIiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RpLXVuaS1yZWFkZXIiLCB9LAotCXt9LAotfTsKLQogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3RpX3VuaXBlcmlwaF9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAic3RpLXVuaXBlcmlwaC1kYWkiLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3N0aS91bmlwZXJpZi5oIGIvc291bmQvc29jL3N0aS91bmlwZXJpZi5oCmluZGV4IGViOTkzM2MuLjE5OTNjNjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zdGkvdW5pcGVyaWYuaAorKysgYi9zb3VuZC9zb2Mvc3RpL3VuaXBlcmlmLmgKQEAgLTEyMjAsMTYgKzEyMjAsMTYgQEAKICNkZWZpbmUgVU5JUEVSSUZfRklGT19GUkFNRVMJCTQgIC8qIEZETUEgdHJpZ2dlciBsaW1pdCBpbiBmcmFtZXMgKi8KIAogI2RlZmluZSBVTklQRVJJRl9UWVBFX0lTX0hETUkocCkgXAotCSgocCktPmluZm8tPnR5cGUgPT0gU05EX1NUX1VOSVBFUklGX1RZUEVfSERNSSkKKwkoKHApLT50eXBlID09IFNORF9TVF9VTklQRVJJRl9UWVBFX0hETUkpCiAjZGVmaW5lIFVOSVBFUklGX1RZUEVfSVNfUENNKHApIFwKLQkoKHApLT5pbmZvLT50eXBlID09IFNORF9TVF9VTklQRVJJRl9UWVBFX1BDTSkKKwkoKHApLT50eXBlID09IFNORF9TVF9VTklQRVJJRl9UWVBFX1BDTSkKICNkZWZpbmUgVU5JUEVSSUZfVFlQRV9JU19TUERJRihwKSBcCi0JKChwKS0+aW5mby0+dHlwZSA9PSBTTkRfU1RfVU5JUEVSSUZfVFlQRV9TUERJRikKKwkoKHApLT50eXBlID09IFNORF9TVF9VTklQRVJJRl9UWVBFX1NQRElGKQogI2RlZmluZSBVTklQRVJJRl9UWVBFX0lTX0lFQzk1OChwKSBcCiAJKFVOSVBFUklGX1RZUEVfSVNfSERNSShwKSB8fCBcCiAJCVVOSVBFUklGX1RZUEVfSVNfU1BESUYocCkpCiAjZGVmaW5lIFVOSVBFUklGX1RZUEVfSVNfVERNKHApIFwKLQkoKHApLT5pbmZvLT50eXBlID09IFNORF9TVF9VTklQRVJJRl9UWVBFX1RETSkKKwkoKHApLT50eXBlID09IFNORF9TVF9VTklQRVJJRl9UWVBFX1RETSkKIAogLyoKICAqIFVuaXBlcmlwaGVyYWwgSVAgcmV2aXNpb25zCkBAIC0xMjQ5LDExICsxMjQ5LDExIEBACiB9OwogCiBlbnVtIHVuaXBlcmlmX3R5cGUgewotCVNORF9TVF9VTklQRVJJRl9UWVBFX05PTkUsCi0JU05EX1NUX1VOSVBFUklGX1RZUEVfSERNSSwKLQlTTkRfU1RfVU5JUEVSSUZfVFlQRV9QQ00sCi0JU05EX1NUX1VOSVBFUklGX1RZUEVfU1BESUYsCi0JU05EX1NUX1VOSVBFUklGX1RZUEVfVERNCisJU05EX1NUX1VOSVBFUklGX1RZUEVfTk9ORQk9IDB4MDAsCisJU05EX1NUX1VOSVBFUklGX1RZUEVfSERNSQk9IDB4MDEsCisJU05EX1NUX1VOSVBFUklGX1RZUEVfUENNCT0gMHgwMiwKKwlTTkRfU1RfVU5JUEVSSUZfVFlQRV9TUERJRgk9IDB4MDQsCisJU05EX1NUX1VOSVBFUklGX1RZUEVfVERNCT0gMHgwOAogfTsKIAogZW51bSB1bmlwZXJpZl9zdGF0ZSB7CkBAIC0xMjc4LDEyICsxMjc4LDYgQEAKIAlXT1JEX01BWAogfTsKIAotc3RydWN0IHVuaXBlcmlmX2luZm8gewotCWludCBpZDsgLyogaW5zdGFuY2UgdmFsdWUgb2YgdGhlIHVuaXBlcmlwaGVyYWwgSVAgKi8KLQllbnVtIHVuaXBlcmlmX3R5cGUgdHlwZTsKLQlpbnQgdW5kZXJmbG93X2VuYWJsZWQ7CQkvKiBVbmRlcmZsb3cgcmVjb3ZlcnkgbW9kZSAqLwotfTsKLQogc3RydWN0IHVuaXBlcmlmX2llYzk1OF9zZXR0aW5ncyB7CiAJZW51bSB1bmlwZXJpZl9pZWM5NThfZW5jb2RpbmdfbW9kZSBlbmNvZGluZ19tb2RlOwogCXN0cnVjdCBzbmRfYWVzX2llYzk1OCBpZWM5NTg7CkBAIC0xMjk4LDggKzEyOTIsMTAgQEAKIAogc3RydWN0IHVuaXBlcmlmIHsKIAkvKiBTeXN0ZW0gaW5mb3JtYXRpb24gKi8KLQlzdHJ1Y3QgdW5pcGVyaWZfaW5mbyAqaW5mbzsKKwllbnVtIHVuaXBlcmlmX3R5cGUgdHlwZTsKKwlpbnQgdW5kZXJmbG93X2VuYWJsZWQ7IC8qIFVuZGVyZmxvdyByZWNvdmVyeSBtb2RlICovCiAJc3RydWN0IGRldmljZSAqZGV2OworCWludCBpZDsgLyogaW5zdGFuY2UgdmFsdWUgb2YgdGhlIHVuaXBlcmlwaGVyYWwgSVAgKi8KIAlpbnQgdmVyOyAvKiBJUCB2ZXJzaW9uLCB1c2VkIGJ5IHJlZ2lzdGVyIGFjY2VzcyBtYWNyb3MgKi8KIAlzdHJ1Y3QgcmVnbWFwX2ZpZWxkICpjbGtfc2VsOwogCXN0cnVjdCByZWdtYXBfZmllbGQgKnZhbGlkX3NlbDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zdGkvdW5pcGVyaWZfcGxheWVyLmMgYi9zb3VuZC9zb2Mvc3RpL3VuaXBlcmlmX3BsYXllci5jCmluZGV4IDFhYzJkYjIuLjFiYzhlYmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zdGkvdW5pcGVyaWZfcGxheWVyLmMKKysrIGIvc291bmQvc29jL3N0aS91bmlwZXJpZl9wbGF5ZXIuYwpAQCAtMTAwLDcgKzEwMCw3IEBACiAJCWRldl9lcnIocGxheWVyLT5kZXYsICJGSUZPIHVuZGVyZmxvdyBlcnJvciBkZXRlY3RlZCIpOwogCiAJCS8qIEludGVycnVwdCBpcyBqdXN0IGZvciBpbmZvcm1hdGlvbiB3aGVuIHVuZGVyZmxvdyByZWNvdmVyeSAqLwotCQlpZiAocGxheWVyLT5pbmZvLT51bmRlcmZsb3dfZW5hYmxlZCkgeworCQlpZiAocGxheWVyLT51bmRlcmZsb3dfZW5hYmxlZCkgewogCQkJLyogVXBkYXRlIHN0YXRlIHRvIHVuZGVyZmxvdyAqLwogCQkJcGxheWVyLT5zdGF0ZSA9IFVOSVBFUklGX1NUQVRFX1VOREVSRkxPVzsKIApAQCAtMTM0LDcgKzEzNCw3IEBACiAKIAkvKiBDaGVjayBmb3IgdW5kZXJmbG93IHJlY292ZXJ5IGRvbmUgKi8KIAlpZiAodW5saWtlbHkoc3RhdHVzICYgVU5JUEVSSUZfSVRNX1VOREVSRkxPV19SRUNfRE9ORV9NQVNLKHBsYXllcikpKSB7Ci0JCWlmICghcGxheWVyLT5pbmZvLT51bmRlcmZsb3dfZW5hYmxlZCkgeworCQlpZiAoIXBsYXllci0+dW5kZXJmbG93X2VuYWJsZWQpIHsKIAkJCWRldl9lcnIocGxheWVyLT5kZXYsICJ1bmV4cGVjdGVkIFVuZGVyZmxvdyByZWNvdmVyaW5nIik7CiAJCQlyZXR1cm4gLUVQRVJNOwogCQl9CkBAIC03NjQsNyArNzY0LDcgQEAKIAl9CiAKIAkvKiBDYWxjdWxhdGUgdHJhbnNmZXIgc2l6ZSAoaW4gZmlmbyBjZWxscyBhbmQgYnl0ZXMpIGZvciBmcmFtZSBjb3VudCAqLwotCWlmIChwbGF5ZXItPmluZm8tPnR5cGUgPT0gU05EX1NUX1VOSVBFUklGX1RZUEVfVERNKSB7CisJaWYgKHBsYXllci0+dHlwZSA9PSBTTkRfU1RfVU5JUEVSSUZfVFlQRV9URE0pIHsKIAkJLyogdHJhbnNmZXIgc2l6ZSA9IHVzZXIgZnJhbWUgc2l6ZSAoaW4gMzIgYml0cyBGSUZPIGNlbGwpICovCiAJCXRyYW5zZmVyX3NpemUgPQogCQkJc3RpX3VuaXBlcmlwaF9nZXRfdXNlcl9mcmFtZV9zaXplKHJ1bnRpbWUpIC8gNDsKQEAgLTc5NCw3ICs3OTQsNyBAQAogCVNFVF9VTklQRVJJRl9DT05GSUdfRE1BX1RSSUdfTElNSVQocGxheWVyLCB0cmlnZ2VyX2xpbWl0KTsKIAogCS8qIFVuaXBlcmlwaGVyYWwgc2V0dXAgZGVwZW5kcyBvbiBwbGF5ZXIgdHlwZSAqLwotCXN3aXRjaCAocGxheWVyLT5pbmZvLT50eXBlKSB7CisJc3dpdGNoIChwbGF5ZXItPnR5cGUpIHsKIAljYXNlIFNORF9TVF9VTklQRVJJRl9UWVBFX0hETUk6CiAJCXJldCA9IHVuaV9wbGF5ZXJfcHJlcGFyZV9pZWM5NTgocGxheWVyLCBydW50aW1lKTsKIAkJYnJlYWs7CkBAIC04ODQsNyArODg0LDcgQEAKIAlTRVRfVU5JUEVSSUZfSVRNX0JTRVRfRklGT19FUlJPUihwbGF5ZXIpOwogCiAJLyogRW5hYmxlIHVuZGVyZmxvdyByZWNvdmVyeSBpbnRlcnJ1cHRzICovCi0JaWYgKHBsYXllci0+aW5mby0+dW5kZXJmbG93X2VuYWJsZWQpIHsKKwlpZiAocGxheWVyLT51bmRlcmZsb3dfZW5hYmxlZCkgewogCQlTRVRfVU5JUEVSSUZfSVRNX0JTRVRfVU5ERVJGTE9XX1JFQ19ET05FKHBsYXllcik7CiAJCVNFVF9VTklQRVJJRl9JVE1fQlNFVF9VTkRFUkZMT1dfUkVDX0ZBSUxFRChwbGF5ZXIpOwogCX0KQEAgLTg5Myw4ICs4OTMsMTAgQEAKIAlTRVRfVU5JUEVSSUZfU09GVF9SU1RfU09GVF9SU1QocGxheWVyKTsKIAogCXJldCA9IHJlc2V0X3BsYXllcihwbGF5ZXIpOwotCWlmIChyZXQgPCAwKQorCWlmIChyZXQgPCAwKSB7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShwbGF5ZXItPmNsayk7CiAJCXJldHVybiByZXQ7CisJfQogCiAJLyoKIAkgKiBEb2VzIG5vdCB1c2UgSUVDNjE5MzcgZmVhdHVyZXMgb2YgdGhlIHVuaXBlcmlwaGVyYWwgaGFyZHdhcmUuCkBAIC0xMDIxLDggKzEwMjMsOCBAQAogCXN0cnVjdCByZWdfZmllbGQgcmVnZmllbGRbMl0gPSB7CiAJCS8qIFBDTV9DTEtfU0VMICovCiAJCVJFR19GSUVMRChTWVNfQ0ZHX0FVRElPX0dMVUUsCi0JCQkgIDggKyBwbGF5ZXItPmluZm8tPmlkLAotCQkJICA4ICsgcGxheWVyLT5pbmZvLT5pZCksCisJCQkgIDggKyBwbGF5ZXItPmlkLAorCQkJICA4ICsgcGxheWVyLT5pZCksCiAJCS8qIFBDTVBfVkFMSURfU0VMICovCiAJCVJFR19GSUVMRChTWVNfQ0ZHX0FVRElPX0dMVUUsIDAsIDEpCiAJfTsKQEAgLTEwNDAsNjAgKzEwNDIsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHVuaV9wbGF5ZXJfcGFyc2VfZHQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJCSAgICAgICBzdHJ1Y3QgdW5pcGVyaWYgKnBsYXllcikKLXsKLQlzdHJ1Y3QgdW5pcGVyaWZfaW5mbyAqaW5mbzsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcG5vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKLQljb25zdCBjaGFyICptb2RlOwotCi0JLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW5mbyBzdHJ1Y3R1cmUgKi8KLQlpbmZvID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpbmZvKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihwbm9kZSwgInN0LHZlcnNpb24iLCAmcGxheWVyLT52ZXIpIHx8Ci0JICAgIHBsYXllci0+dmVyID09IFNORF9TVF9VTklQRVJJRl9WRVJTSU9OX1VOS05PV04pIHsKLQkJZGV2X2VycihkZXYsICJVbmtub3duIHVuaXBlcmlwaGVyYWwgdmVyc2lvbiAiKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCS8qIFVuZGVyZmxvdyByZWNvdmVyeSBpcyBvbmx5IHN1cHBvcnRlZCBvbiBsYXRlciBpcCByZXZpc2lvbnMgKi8KLQlpZiAocGxheWVyLT52ZXIgPj0gU05EX1NUX1VOSVBFUklGX1ZFUlNJT05fVU5JX1BMUl9UT1BfMV8wKQotCQlpbmZvLT51bmRlcmZsb3dfZW5hYmxlZCA9IDE7Ci0KLQlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIocG5vZGUsICJzdCx1bmlwZXJpcGgtaWQiLCAmaW5mby0+aWQpKSB7Ci0JCWRldl9lcnIoZGV2LCAidW5pcGVyaXBoZXJhbCBpZCBub3QgZGVmaW5lZCIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBSZWFkIHRoZSBkZXZpY2UgbW9kZSBwcm9wZXJ0eSAqLwotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhwbm9kZSwgInN0LG1vZGUiLCAmbW9kZSkpIHsKLQkJZGV2X2VycihkZXYsICJ1bmlwZXJpcGhlcmFsIG1vZGUgbm90IGRlZmluZWQiKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHN0cmNhc2VjbXAobW9kZSwgImhkbWkiKSA9PSAwKQotCQlpbmZvLT50eXBlID0gU05EX1NUX1VOSVBFUklGX1RZUEVfSERNSTsKLQllbHNlIGlmIChzdHJjYXNlY21wKG1vZGUsICJwY20iKSA9PSAwKQotCQlpbmZvLT50eXBlID0gU05EX1NUX1VOSVBFUklGX1RZUEVfUENNOwotCWVsc2UgaWYgKHN0cmNhc2VjbXAobW9kZSwgInNwZGlmIikgPT0gMCkKLQkJaW5mby0+dHlwZSA9IFNORF9TVF9VTklQRVJJRl9UWVBFX1NQRElGOwotCWVsc2UgaWYgKHN0cmNhc2VjbXAobW9kZSwgInRkbSIpID09IDApCi0JCWluZm8tPnR5cGUgPSBTTkRfU1RfVU5JUEVSSUZfVFlQRV9URE07Ci0JZWxzZQotCQlpbmZvLT50eXBlID0gU05EX1NUX1VOSVBFUklGX1RZUEVfTk9ORTsKLQotCS8qIFNhdmUgdGhlIGluZm8gc3RydWN0dXJlICovCi0JcGxheWVyLT5pbmZvID0gaW5mbzsKLQotCS8qIEdldCBQQ01fQ0xLX1NFTCAmIFBDTVBfVkFMSURfU0VMIGZyb20gYXVkaW8tZ2x1ZS1jdHJsIFNvQyByZWcgKi8KLQlpZiAodW5pX3BsYXllcl9wYXJzZV9kdF9hdWRpb19nbHVlKHBkZXYsIHBsYXllcikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIHVuaV9wbGF5ZXJfZGFpX29wcyA9IHsKIAkJLnN0YXJ0dXAgPSB1bmlfcGxheWVyX3N0YXJ0dXAsCiAJCS5zaHV0ZG93biA9IHVuaV9wbGF5ZXJfc2h1dGRvd24sCkBAIC0xMTE0LDEzICsxMDYyLDE4IEBACiAJcGxheWVyLT5zdGF0ZSA9IFVOSVBFUklGX1NUQVRFX1NUT1BQRUQ7CiAJcGxheWVyLT5kYWlfb3BzID0gJnVuaV9wbGF5ZXJfZGFpX29wczsKIAotCXJldCA9IHVuaV9wbGF5ZXJfcGFyc2VfZHQocGRldiwgcGxheWVyKTsKKwkvKiBHZXQgUENNX0NMS19TRUwgJiBQQ01QX1ZBTElEX1NFTCBmcm9tIGF1ZGlvLWdsdWUtY3RybCBTb0MgcmVnICovCisJcmV0ID0gdW5pX3BsYXllcl9wYXJzZV9kdF9hdWRpb19nbHVlKHBkZXYsIHBsYXllcik7CiAKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKHBsYXllci0+ZGV2LCAiRmFpbGVkIHRvIHBhcnNlIERldmljZVRyZWUiKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKKwkvKiBVbmRlcmZsb3cgcmVjb3ZlcnkgaXMgb25seSBzdXBwb3J0ZWQgb24gbGF0ZXIgaXAgcmV2aXNpb25zICovCisJaWYgKHBsYXllci0+dmVyID49IFNORF9TVF9VTklQRVJJRl9WRVJTSU9OX1VOSV9QTFJfVE9QXzFfMCkKKwkJcGxheWVyLT51bmRlcmZsb3dfZW5hYmxlZCA9IDE7CisKIAlpZiAoVU5JUEVSSUZfVFlQRV9JU19URE0ocGxheWVyKSkKIAkJcGxheWVyLT5odyA9ICZ1bmlfdGRtX2h3OwogCWVsc2UKQEAgLTExNDQsOCArMTA5Nyw4IEBACiAKIAkvKiBjb25uZWN0IHRvIEkyUy9URE0gVFggYnVzICovCiAJaWYgKHBsYXllci0+dmFsaWRfc2VsICYmCi0JICAgIChwbGF5ZXItPmluZm8tPmlkID09IFVOSVBFUklGX1BMQVlFUl9JMlNfT1VUKSkgewotCQlyZXQgPSByZWdtYXBfZmllbGRfd3JpdGUocGxheWVyLT52YWxpZF9zZWwsIHBsYXllci0+aW5mby0+aWQpOworCSAgICAocGxheWVyLT5pZCA9PSBVTklQRVJJRl9QTEFZRVJfSTJTX09VVCkpIHsKKwkJcmV0ID0gcmVnbWFwX2ZpZWxkX3dyaXRlKHBsYXllci0+dmFsaWRfc2VsLCBwbGF5ZXItPmlkKTsKIAkJaWYgKHJldCkgewogCQkJZGV2X2VycihwbGF5ZXItPmRldiwKIAkJCQkiJXM6IHVuYWJsZSB0byBjb25uZWN0IHRvIHRkbSBidXMiLCBfX2Z1bmNfXyk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc3RpL3VuaXBlcmlmX3JlYWRlci5jIGIvc291bmQvc29jL3N0aS91bmlwZXJpZl9yZWFkZXIuYwppbmRleCBlYjc0YTMyLi4wZTFjM2VlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc3RpL3VuaXBlcmlmX3JlYWRlci5jCisrKyBiL3NvdW5kL3NvYy9zdGkvdW5pcGVyaWZfcmVhZGVyLmMKQEAgLTEzLDYgKzEzLDcgQEAKIAogI2luY2x1ZGUgInVuaXBlcmlmLmgiCiAKKyNkZWZpbmUgVU5JUEVSSUZfUkVBREVSX0kyU19JTiAwIC8qIHJlYWRlciBpZCBjb25uZWN0ZWQgdG8gSTJTL1RETSBUWCBidXMgKi8KIC8qCiAgKiBOb3RlOiBzbmRfcGNtX2hhcmR3YXJlIGlzIGxpbmtlZCB0byBETUEgY29udHJvbGxlciBidXQgaXMgZGVjbGFyZWQgaGVyZSB0bwogICogaW50ZWdyYXRlIHVuaXJlYWRlciBjYXBhYmlsaXR5IGluIHRlcm0gb2YgcmF0ZSBhbmQgc3VwcG9ydGVkIGNoYW5uZWxzCkBAIC0xOTUsNyArMTk2LDcgQEAKIAl9CiAKIAkvKiBDYWxjdWxhdGUgdHJhbnNmZXIgc2l6ZSAoaW4gZmlmbyBjZWxscyBhbmQgYnl0ZXMpIGZvciBmcmFtZSBjb3VudCAqLwotCWlmIChyZWFkZXItPmluZm8tPnR5cGUgPT0gU05EX1NUX1VOSVBFUklGX1RZUEVfVERNKSB7CisJaWYgKHJlYWRlci0+dHlwZSA9PSBTTkRfU1RfVU5JUEVSSUZfVFlQRV9URE0pIHsKIAkJLyogdHJhbnNmZXIgc2l6ZSA9IHVuaXAgZnJhbWUgc2l6ZSAoaW4gMzIgYml0cyBGSUZPIGNlbGwpICovCiAJCXRyYW5zZmVyX3NpemUgPQogCQkJc3RpX3VuaXBlcmlwaF9nZXRfdXNlcl9mcmFtZV9zaXplKHJ1bnRpbWUpIC8gNDsKQEAgLTI4MCw3ICsyODEsNyBAQAogCVNFVF9VTklQRVJJRl9JVE1fQlNFVF9NRU1fQkxLX1JFQUQocmVhZGVyKTsKIAogCS8qIEVuYWJsZSB1bmRlcmZsb3cgcmVjb3ZlcnkgaW50ZXJydXB0cyAqLwotCWlmIChyZWFkZXItPmluZm8tPnVuZGVyZmxvd19lbmFibGVkKSB7CisJaWYgKHJlYWRlci0+dW5kZXJmbG93X2VuYWJsZWQpIHsKIAkJU0VUX1VOSVBFUklGX0lUTV9CU0VUX1VOREVSRkxPV19SRUNfRE9ORShyZWFkZXIpOwogCQlTRVRfVU5JUEVSSUZfSVRNX0JTRVRfVU5ERVJGTE9XX1JFQ19GQUlMRUQocmVhZGVyKTsKIAl9CkBAIC0zOTQsNDEgKzM5NSw2IEBACiAJfQogfQogCi1zdGF0aWMgaW50IHVuaV9yZWFkZXJfcGFyc2VfZHQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJCSAgICAgICBzdHJ1Y3QgdW5pcGVyaWYgKnJlYWRlcikKLXsKLQlzdHJ1Y3QgdW5pcGVyaWZfaW5mbyAqaW5mbzsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKLQljb25zdCBjaGFyICptb2RlOwotCi0JLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW5mbyBzdHJ1Y3R1cmUgKi8KLQlpbmZvID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICghaW5mbykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgInN0LHZlcnNpb24iLCAmcmVhZGVyLT52ZXIpIHx8Ci0JICAgIHJlYWRlci0+dmVyID09IFNORF9TVF9VTklQRVJJRl9WRVJTSU9OX1VOS05PV04pIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5rbm93biB1bmlwZXJpcGhlcmFsIHZlcnNpb24gIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIFJlYWQgdGhlIGRldmljZSBtb2RlIHByb3BlcnR5ICovCi0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKG5vZGUsICJzdCxtb2RlIiwgJm1vZGUpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInVuaXBlcmlwaGVyYWwgbW9kZSBub3QgZGVmaW5lZCIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoc3RyY2FzZWNtcChtb2RlLCAidGRtIikgPT0gMCkKLQkJaW5mby0+dHlwZSA9IFNORF9TVF9VTklQRVJJRl9UWVBFX1RETTsKLQllbHNlCi0JCWluZm8tPnR5cGUgPSBTTkRfU1RfVU5JUEVSSUZfVFlQRV9QQ007Ci0KLQkvKiBTYXZlIHRoZSBpbmZvIHN0cnVjdHVyZSAqLwotCXJlYWRlci0+aW5mbyA9IGluZm87Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgdW5pX3JlYWRlcl9kYWlfb3BzID0gewogCQkuc3RhcnR1cCA9IHVuaV9yZWFkZXJfc3RhcnR1cCwKIAkJLnNodXRkb3duID0gdW5pX3JlYWRlcl9zaHV0ZG93biwKQEAgLTQ0OCwxMiArNDE0LDYgQEAKIAlyZWFkZXItPnN0YXRlID0gVU5JUEVSSUZfU1RBVEVfU1RPUFBFRDsKIAlyZWFkZXItPmRhaV9vcHMgPSAmdW5pX3JlYWRlcl9kYWlfb3BzOwogCi0JcmV0ID0gdW5pX3JlYWRlcl9wYXJzZV9kdChwZGV2LCByZWFkZXIpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIocmVhZGVyLT5kZXYsICJGYWlsZWQgdG8gcGFyc2UgRGV2aWNlVHJlZSIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQogCWlmIChVTklQRVJJRl9UWVBFX0lTX1RETShyZWFkZXIpKQogCQlyZWFkZXItPmh3ID0gJnVuaV90ZG1faHc7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3N1bnhpL0tjb25maWcgYi9zb3VuZC9zb2Mvc3VueGkvS2NvbmZpZwppbmRleCAyYTk1NGJkLi5kZDIzNjgyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc3VueGkvS2NvbmZpZworKysgYi9zb3VuZC9zb2Mvc3VueGkvS2NvbmZpZwpAQCAtMSw0ICsxLDUgQEAKIG1lbnUgIkFsbHdpbm5lciBTb0MgQXVkaW8gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfU1VOWEkgfHwgQ09NUElMRV9URVNUCiAKIGNvbmZpZyBTTkRfU1VONElfQ09ERUMKIAl0cmlzdGF0ZSAiQWxsd2lubmVyIEExMCBDb2RlYyBTdXBwb3J0IgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3N1bnhpL3N1bjRpLWNvZGVjLmMgYi9zb3VuZC9zb2Mvc3VueGkvc3VuNGktY29kZWMuYwppbmRleCA0NGYxNzBjLi5lMDQ3ZWMwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc3VueGkvc3VuNGktY29kZWMuYworKysgYi9zb3VuZC9zb2Mvc3VueGkvc3VuNGktY29kZWMuYwpAQCAtOTYsOCArOTYsOCBAQAogLyogT3RoZXIgdmFyaW91cyBBREMgcmVnaXN0ZXJzICovCiAjZGVmaW5lIFNVTjRJX0NPREVDX0RBQ19UWENOVAkJCSgweDMwKQogI2RlZmluZSBTVU40SV9DT0RFQ19BRENfUlhDTlQJCQkoMHgzNCkKLSNkZWZpbmUgU1VONElfQ09ERUNfQUNfU1lTX1ZFUkkJCQkoMHgzOCkKLSNkZWZpbmUgU1VONElfQ09ERUNfQUNfTUlDX1BIT05FX0NBTAkJKDB4M2MpCisjZGVmaW5lIFNVTjdJX0NPREVDX0FDX0RBQ19DQUwJCQkoMHgzOCkKKyNkZWZpbmUgU1VON0lfQ09ERUNfQUNfTUlDX1BIT05FX0NBTAkJKDB4M2MpCiAKIHN0cnVjdCBzdW40aV9jb2RlYyB7CiAJc3RydWN0IGRldmljZQkqZGV2OwpAQCAtNTA5LDcgKzUwOSw3IEBACiAKIHN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShzdW40aV9jb2RlY19wYV92b2x1bWVfc2NhbGUsIC02MzAwLCAxMDAsIDEpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc3VuNGlfY29kZWNfd2lkZ2V0c1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHN1bjRpX2NvZGVjX2NvbnRyb2xzW10gPSB7CiAJU09DX1NJTkdMRV9UTFYoIlBvd2VyIEFtcGxpZmllciBWb2x1bWUiLCBTVU40SV9DT0RFQ19EQUNfQUNUTCwKIAkJICAgICAgIFNVTjRJX0NPREVDX0RBQ19BQ1RMX1BBX1ZPTCwgMHgzRiwgMCwKIAkJICAgICAgIHN1bjRpX2NvZGVjX3BhX3ZvbHVtZV9zY2FsZSksCkBAIC02MjgsMTIgKzYyOCwxNCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzdW40aV9jb2RlY19jb2RlYyA9IHsKLQkuY29udHJvbHMJCT0gc3VuNGlfY29kZWNfd2lkZ2V0cywKLQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoc3VuNGlfY29kZWNfd2lkZ2V0cyksCi0JLmRhcG1fd2lkZ2V0cwkJPSBzdW40aV9jb2RlY19jb2RlY19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHN1bjRpX2NvZGVjX2NvZGVjX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzCQk9IHN1bjRpX2NvZGVjX2NvZGVjX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHN1bjRpX2NvZGVjX2NvZGVjX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHN1bjRpX2NvZGVjX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoc3VuNGlfY29kZWNfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHN1bjRpX2NvZGVjX2NvZGVjX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHN1bjRpX2NvZGVjX2NvZGVjX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBzdW40aV9jb2RlY19jb2RlY19kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoc3VuNGlfY29kZWNfY29kZWNfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29tcG9uZW50X2RyaXZlciBzdW40aV9jb2RlY19jb21wb25lbnQgPSB7CkBAIC02ODAsMTIgKzY4MiwzNyBAQAogCS5yZWdfYml0cwk9IDMyLAogCS5yZWdfc3RyaWRlCT0gNCwKIAkudmFsX2JpdHMJPSAzMiwKLQkubWF4X3JlZ2lzdGVyCT0gU1VONElfQ09ERUNfQUNfTUlDX1BIT05FX0NBTCwKKwkubWF4X3JlZ2lzdGVyCT0gU1VONElfQ09ERUNfQURDX1JYQ05ULAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHN1bjdpX2NvZGVjX3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzCT0gMzIsCisJLnJlZ19zdHJpZGUJPSA0LAorCS52YWxfYml0cwk9IDMyLAorCS5tYXhfcmVnaXN0ZXIJPSBTVU43SV9DT0RFQ19BQ19NSUNfUEhPTkVfQ0FMLAorfTsKKworc3RydWN0IHN1bjRpX2NvZGVjX3F1aXJrcyB7CisJY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgKnJlZ21hcF9jb25maWc7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHN1bjRpX2NvZGVjX3F1aXJrcyBzdW40aV9jb2RlY19xdWlya3MgPSB7CisJLnJlZ21hcF9jb25maWcgPSAmc3VuNGlfY29kZWNfcmVnbWFwX2NvbmZpZywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VuNGlfY29kZWNfcXVpcmtzIHN1bjdpX2NvZGVjX3F1aXJrcyA9IHsKKwkucmVnbWFwX2NvbmZpZyA9ICZzdW43aV9jb2RlY19yZWdtYXBfY29uZmlnLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VuNGlfY29kZWNfb2ZfbWF0Y2hbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtY29kZWMiIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuN2ktYTIwLWNvZGVjIiB9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC1jb2RlYyIsCisJCS5kYXRhID0gJnN1bjRpX2NvZGVjX3F1aXJrcywKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjdpLWEyMC1jb2RlYyIsCisJCS5kYXRhID0gJnN1bjdpX2NvZGVjX3F1aXJrcywKKwl9LAogCXt9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc3VuNGlfY29kZWNfb2ZfbWF0Y2gpOwpAQCAtNzU4LDYgKzc4NSw3IEBACiB7CiAJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZDsKIAlzdHJ1Y3Qgc3VuNGlfY29kZWMgKnNjb2RlYzsKKwljb25zdCBzdHJ1Y3Qgc3VuNGlfY29kZWNfcXVpcmtzICpxdWlya3M7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwogCWludCByZXQ7CkBAIC03NzUsOCArODAzLDE0IEBACiAJCXJldHVybiBQVFJfRVJSKGJhc2UpOwogCX0KIAorCXF1aXJrcyA9IG9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YSgmcGRldi0+ZGV2KTsKKwlpZiAocXVpcmtzID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGRldGVybWluZSB0aGUgcXVpcmtzIHRvIHVzZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwogCXNjb2RlYy0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9tbWlvKCZwZGV2LT5kZXYsIGJhc2UsCi0JCQkJCSAgICAgJnN1bjRpX2NvZGVjX3JlZ21hcF9jb25maWcpOworCQkJCQkgICAgICAgcXVpcmtzLT5yZWdtYXBfY29uZmlnKTsKIAlpZiAoSVNfRVJSKHNjb2RlYy0+cmVnbWFwKSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gY3JlYXRlIG91ciByZWdtYXBcbiIpOwogCQlyZXR1cm4gUFRSX0VSUihzY29kZWMtPnJlZ21hcCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc3VueGkvc3VuNGktc3BkaWYuYyBiL3NvdW5kL3NvYy9zdW54aS9zdW40aS1zcGRpZi5jCmluZGV4IDBiMDRmYjAuLjg4ZmJiM2EgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zdW54aS9zdW40aS1zcGRpZi5jCisrKyBiL3NvdW5kL3NvYy9zdW54aS9zdW40aS1zcGRpZi5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+CiAjaW5jbHVkZSA8c291bmQvZG1hZW5naW5lX3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KQEAgLTE2Miw2ICsxNjMsNyBAQAogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAJc3RydWN0IGNsayAqc3BkaWZfY2xrOwogCXN0cnVjdCBjbGsgKmFwYl9jbGs7CisJc3RydWN0IHJlc2V0X2NvbnRyb2wgKnJzdDsKIAlzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIGNwdV9kYWlfZHJ2OwogCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKIAlzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9kYWlfZG1hX2RhdGEgZG1hX3BhcmFtc190eDsKQEAgLTQxMSw2ICs0MTMsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzdW40aV9zcGRpZl9vZl9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjRpLWExMC1zcGRpZiIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNmktYTMxLXNwZGlmIiwgfSwKIAl7IC8qIHNlbnRpbmVsICovIH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzdW40aV9zcGRpZl9vZl9tYXRjaCk7CkBAIC00ODIsMTEgKzQ4NSwyMyBAQAogCX0KIAogCWhvc3QtPmRtYV9wYXJhbXNfdHguYWRkciA9IHJlcy0+c3RhcnQgKyBTVU40SV9TUERJRl9UWEZJRk87Ci0JaG9zdC0+ZG1hX3BhcmFtc190eC5tYXhidXJzdCA9IDQ7CisJaG9zdC0+ZG1hX3BhcmFtc190eC5tYXhidXJzdCA9IDg7CiAJaG9zdC0+ZG1hX3BhcmFtc190eC5hZGRyX3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzJfQllURVM7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBob3N0KTsKIAorCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkgICAgImFsbHdpbm5lcixzdW42aS1hMzEtc3BkaWYiKSkgeworCQlob3N0LT5yc3QgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0X29wdGlvbmFsKCZwZGV2LT5kZXYsIE5VTEwpOworCQlpZiAoSVNfRVJSKGhvc3QtPnJzdCkgJiYgUFRSX0VSUihob3N0LT5yc3QpID09IC1FUFJPQkVfREVGRVIpIHsKKwkJCXJldCA9IC1FUFJPQkVfREVGRVI7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IHJlc2V0OiAlZFxuIiwgcmV0KTsKKwkJCWdvdG8gZXJyX2Rpc2FibGVfYXBiX2NsazsKKwkJfQorCQlpZiAoIUlTX0VSUihob3N0LT5yc3QpKQorCQkJcmVzZXRfY29udHJvbF9kZWFzc2VydChob3N0LT5yc3QpOworCX0KKwogCXJldCA9IGRldm1fc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldiwKIAkJCQkmc3VuNGlfc3BkaWZfY29tcG9uZW50LCAmc3VuNGlfc3BkaWZfZGFpLCAxKTsKIAlpZiAocmV0KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3RlZ3JhL0tjb25maWcgYi9zb3VuZC9zb2MvdGVncmEvS2NvbmZpZwppbmRleCBhNjc2OGY4Li5lZmJlOGQ0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvdGVncmEvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvdGVncmEvS2NvbmZpZwpAQCAtMTM4LDMgKzEzOCwxNCBAQAogCWhlbHAKIAkgIFNheSBZIG9yIE0gaGVyZSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIFRlZ3JhCiAJICBib2FyZHMgdXNpbmcgdGhlIFJUNTY3NyBjb2RlYywgc3VjaCBhcyBSeXUuCisKK2NvbmZpZyBTTkRfU09DX1RFR1JBX1NHVEw1MDAwCisJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBUZWdyYSBib2FyZHMgdXNpbmcgYSBTR1RMNTAwMCBjb2RlYyIKKwlkZXBlbmRzIG9uIFNORF9TT0NfVEVHUkEgJiYgSTJDICYmIEdQSU9MSUIKKwlzZWxlY3QgU05EX1NPQ19URUdSQTIwX0kyUyBpZiBBUkNIX1RFR1JBXzJ4X1NPQworCXNlbGVjdCBTTkRfU09DX1RFR1JBMzBfSTJTIGlmIEFSQ0hfVEVHUkFfM3hfU09DCisJc2VsZWN0IFNORF9TT0NfU0dUTDUwMDAKKwloZWxwCisJICBTYXkgWSBvciBNIGhlcmUgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbiBUZWdyYQorCSAgYm9hcmRzIHVzaW5nIHRoZSBTR1RMNTAwMCBjb2RlYywgc3VjaCBhcyBBcGFsaXMgVDMwLCBBcGFsaXMgVEsxIG9yCisJICBDb2xpYnJpIFQzMC4KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90ZWdyYS9NYWtlZmlsZSBiL3NvdW5kL3NvYy90ZWdyYS9NYWtlZmlsZQppbmRleCA5MTcxNjU1Li5mMjE0YTNmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvdGVncmEvTWFrZWZpbGUKKysrIGIvc291bmQvc29jL3RlZ3JhL01ha2VmaWxlCkBAIC0yNiw2ICsyNiw3IEBACiBzbmQtc29jLXRlZ3JhLXRyaW1zbGljZS1vYmpzIDo9IHRyaW1zbGljZS5vCiBzbmQtc29jLXRlZ3JhLWFsYzU2MzItb2JqcyA6PSB0ZWdyYV9hbGM1NjMyLm8KIHNuZC1zb2MtdGVncmEtbWF4OTgwOTAtb2JqcyA6PSB0ZWdyYV9tYXg5ODA5MC5vCitzbmQtc29jLXRlZ3JhLXNndGw1MDAwLW9ianMgOj0gdGVncmFfc2d0bDUwMDAubwogCiBvYmotJChDT05GSUdfU05EX1NPQ19URUdSQV9SVDU2NDApICs9IHNuZC1zb2MtdGVncmEtcnQ1NjQwLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1RFR1JBX1JUNTY3NykgKz0gc25kLXNvYy10ZWdyYS1ydDU2NzcubwpAQCAtMzUsMyArMzYsNCBAQAogb2JqLSQoQ09ORklHX1NORF9TT0NfVEVHUkFfVFJJTVNMSUNFKSArPSBzbmQtc29jLXRlZ3JhLXRyaW1zbGljZS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19URUdSQV9BTEM1NjMyKSArPSBzbmQtc29jLXRlZ3JhLWFsYzU2MzIubwogb2JqLSQoQ09ORklHX1NORF9TT0NfVEVHUkFfTUFYOTgwOTApICs9IHNuZC1zb2MtdGVncmEtbWF4OTgwOTAubworb2JqLSQoQ09ORklHX1NORF9TT0NfVEVHUkFfU0dUTDUwMDApICs9IHNuZC1zb2MtdGVncmEtc2d0bDUwMDAubwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9ydDU2NDAuYyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9ydDU2NDAuYwppbmRleCA3NzNkYWVjLi5lNWVmNGU5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvdGVncmEvdGVncmFfcnQ1NjQwLmMKKysrIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3J0NTY0MC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSogdGVncmFfcnQ1NjQwLmMgLSBUZWdyYSBtYWNoaW5lIEFTb0MgZHJpdmVyIGZvciBib2FyZHMgdXNpbmcgV004OTAzIGNvZGVjLgorKiB0ZWdyYV9ydDU2NDAuYyAtIFRlZ3JhIG1hY2hpbmUgQVNvQyBkcml2ZXIgZm9yIGJvYXJkcyB1c2luZyBSVDU2NDAgY29kZWMuCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDEzLCBOVklESUEgQ09SUE9SQVRJT04uICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9zZ3RsNTAwMC5jIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3NndGw1MDAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3Njg2OQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9zZ3RsNTAwMC5jCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogdGVncmFfc2d0bDUwMDAuYyAtIFRlZ3JhIG1hY2hpbmUgQVNvQyBkcml2ZXIgZm9yIGJvYXJkcyB1c2luZyBTR1RMNTAwMCBjb2RlYworICoKKyAqIEF1dGhvcjogTWFyY2VsIFppc3dpbGVyIDxtYXJjZWxAemlzd2lsZXIuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogQmFzZWQgb24gY29kZSBjb3B5cmlnaHQvYnk6CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTIgLSBOVklESUEsIEluYy4KKyAqIChjKSAyMDA5LCAyMDEwIE52aWRpYSBHcmFwaGljcyBQdnQuIEx0ZC4KKyAqIENvcHlyaWdodCAyMDA3IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorCisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworI2luY2x1ZGUgIi4uL2NvZGVjcy9zZ3RsNTAwMC5oIgorCisjaW5jbHVkZSAidGVncmFfYXNvY191dGlscy5oIgorCisjZGVmaW5lIERSVl9OQU1FICJ0ZWdyYS1zbmQtc2d0bDUwMDAiCisKK3N0cnVjdCB0ZWdyYV9zZ3RsNTAwMCB7CisJc3RydWN0IHRlZ3JhX2Fzb2NfdXRpbHNfZGF0YSB1dGlsX2RhdGE7Cit9OworCitzdGF0aWMgaW50IHRlZ3JhX3NndGw1MDAwX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHJ0ZC0+Y2FyZDsKKwlzdHJ1Y3QgdGVncmFfc2d0bDUwMDAgKm1hY2hpbmUgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7CisJaW50IHNyYXRlLCBtY2xrOworCWludCBlcnI7CisKKwlzcmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisJc3dpdGNoIChzcmF0ZSkgeworCWNhc2UgMTEwMjU6CisJY2FzZSAyMjA1MDoKKwljYXNlIDQ0MTAwOgorCWNhc2UgODgyMDA6CisJCW1jbGsgPSAxMTI4OTYwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbWNsayA9IDEyMjg4MDAwOworCQlicmVhazsKKwl9CisKKwllcnIgPSB0ZWdyYV9hc29jX3V0aWxzX3NldF9yYXRlKCZtYWNoaW5lLT51dGlsX2RhdGEsIHNyYXRlLCBtY2xrKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKGNhcmQtPmRldiwgIkNhbid0IGNvbmZpZ3VyZSBjbG9ja3NcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCBTR1RMNTAwMF9TWVNDTEssIG1jbGssCisJCQkJICAgICBTTkRfU09DX0NMT0NLX0lOKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKGNhcmQtPmRldiwgImNvZGVjX2RhaSBjbG9jayBub3Qgc2V0XG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyB0ZWdyYV9zZ3RsNTAwMF9vcHMgPSB7CisJLmh3X3BhcmFtcyA9IHRlZ3JhX3NndGw1MDAwX2h3X3BhcmFtcywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB0ZWdyYV9zZ3RsNTAwMF9kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fSFAoIkhlYWRwaG9uZSBKYWNrIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX0xJTkUoIkxpbmUgSW4gSmFjayIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIk1pYyBKYWNrIiwgTlVMTCksCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgdGVncmFfc2d0bDUwMDBfZGFpID0geworCS5uYW1lID0gInNndGw1MDAwIiwKKwkuc3RyZWFtX25hbWUgPSAiSGlGaSIsCisJLmNvZGVjX2RhaV9uYW1lID0gInNndGw1MDAwIiwKKwkub3BzID0gJnRlZ3JhX3NndGw1MDAwX29wcywKKwkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX05CX05GIHwKKwkJCVNORF9TT0NfREFJRk1UX0NCU19DRlMsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY2FyZCBzbmRfc29jX3RlZ3JhX3NndGw1MDAwID0geworCS5uYW1lID0gInRlZ3JhLXNndGw1MDAwIiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuZGFpX2xpbmsgPSAmdGVncmFfc2d0bDUwMDBfZGFpLAorCS5udW1fbGlua3MgPSAxLAorCS5kYXBtX3dpZGdldHMgPSB0ZWdyYV9zZ3RsNTAwMF9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHRlZ3JhX3NndGw1MDAwX2RhcG1fd2lkZ2V0cyksCisJLmZ1bGx5X3JvdXRlZCA9IHRydWUsCit9OworCitzdGF0aWMgaW50IHRlZ3JhX3NndGw1MDAwX2RyaXZlcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gJnNuZF9zb2NfdGVncmFfc2d0bDUwMDA7CisJc3RydWN0IHRlZ3JhX3NndGw1MDAwICptYWNoaW5lOworCWludCByZXQ7CisKKwltYWNoaW5lID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgdGVncmFfc2d0bDUwMDApLAorCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmICghbWFjaGluZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBhbGxvY2F0ZSB0ZWdyYV9zZ3RsNTAwMCBzdHJ1Y3RcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljYXJkLT5kZXYgPSAmcGRldi0+ZGV2OworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNhcmQpOworCXNuZF9zb2NfY2FyZF9zZXRfZHJ2ZGF0YShjYXJkLCBtYWNoaW5lKTsKKworCXJldCA9IHNuZF9zb2Nfb2ZfcGFyc2VfY2FyZF9uYW1lKGNhcmQsICJudmlkaWEsbW9kZWwiKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldCA9IHNuZF9zb2Nfb2ZfcGFyc2VfYXVkaW9fcm91dGluZyhjYXJkLCAibnZpZGlhLGF1ZGlvLXJvdXRpbmciKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXRlZ3JhX3NndGw1MDAwX2RhaS5jb2RlY19vZl9ub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShucCwKKwkJCSJudmlkaWEsYXVkaW8tY29kZWMiLCAwKTsKKwlpZiAoIXRlZ3JhX3NndGw1MDAwX2RhaS5jb2RlY19vZl9ub2RlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJQcm9wZXJ0eSAnbnZpZGlhLGF1ZGlvLWNvZGVjJyBtaXNzaW5nIG9yIGludmFsaWRcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwl0ZWdyYV9zZ3RsNTAwMF9kYWkuY3B1X29mX25vZGUgPSBvZl9wYXJzZV9waGFuZGxlKG5wLAorCQkJIm52aWRpYSxpMnMtY29udHJvbGxlciIsIDApOworCWlmICghdGVncmFfc2d0bDUwMDBfZGFpLmNwdV9vZl9ub2RlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJQcm9wZXJ0eSAnbnZpZGlhLGkycy1jb250cm9sbGVyJyBtaXNzaW5nL2ludmFsaWRcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwl0ZWdyYV9zZ3RsNTAwMF9kYWkucGxhdGZvcm1fb2Zfbm9kZSA9IHRlZ3JhX3NndGw1MDAwX2RhaS5jcHVfb2Zfbm9kZTsKKworCXJldCA9IHRlZ3JhX2Fzb2NfdXRpbHNfaW5pdCgmbWFjaGluZS0+dXRpbF9kYXRhLCAmcGRldi0+ZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY2FyZChjYXJkKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInNuZF9zb2NfcmVnaXN0ZXJfY2FyZCBmYWlsZWQgKCVkKVxuIiwKKwkJCXJldCk7CisJCWdvdG8gZXJyX2ZpbmlfdXRpbHM7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9maW5pX3V0aWxzOgorCXRlZ3JhX2Fzb2NfdXRpbHNfZmluaSgmbWFjaGluZS0+dXRpbF9kYXRhKTsKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRlZ3JhX3NndGw1MDAwX2RyaXZlcl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHRlZ3JhX3NndGw1MDAwICptYWNoaW5lID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOworCWludCByZXQ7CisKKwlyZXQgPSBzbmRfc29jX3VucmVnaXN0ZXJfY2FyZChjYXJkKTsKKworCXRlZ3JhX2Fzb2NfdXRpbHNfZmluaSgmbWFjaGluZS0+dXRpbF9kYXRhKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHRlZ3JhX3NndGw1MDAwX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEtYXVkaW8tc2d0bDUwMDAiLCB9LAorCXsgLyogc2VudGluZWwgKi8gfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHRlZ3JhX3NndGw1MDAwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9IERSVl9OQU1FLAorCQkucG0gPSAmc25kX3NvY19wbV9vcHMsCisJCS5vZl9tYXRjaF90YWJsZSA9IHRlZ3JhX3NndGw1MDAwX29mX21hdGNoLAorCX0sCisJLnByb2JlID0gdGVncmFfc2d0bDUwMDBfZHJpdmVyX3Byb2JlLAorCS5yZW1vdmUgPSB0ZWdyYV9zZ3RsNTAwMF9kcml2ZXJfcmVtb3ZlLAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIodGVncmFfc2d0bDUwMDBfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiTWFyY2VsIFppc3dpbGVyIDxtYXJjZWxAemlzd2lsZXIuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUZWdyYSBTR1RMNTAwMCBtYWNoaW5lIEFTb0MgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgRFJWX05BTUUpOworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgdGVncmFfc2d0bDUwMDBfb2ZfbWF0Y2gpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3V4NTAwL3V4NTAwX21zcF9kYWkuYyBiL3NvdW5kL3NvYy91eDUwMC91eDUwMF9tc3BfZGFpLmMKaW5kZXggNmQ1Njk4Yi4uYjM0M2VmZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3V4NTAwL3V4NTAwX21zcF9kYWkuYworKysgYi9zb3VuZC9zb2MvdXg1MDAvdXg1MDBfbXNwX2RhaS5jCkBAIC0xODcsNyArMTg3LDcgQEAKIAogCWRlZmF1bHQ6CiAJCWRldl9lcnIoZGFpLT5kZXYsCi0JCQkiJXM6IEVycm9yOiBVbnNvcHBvcnRlZCBpbnZlcnNpb24gKGZtdCA9IDB4JXgpIVxuIiwKKwkJCSIlczogRXJyb3I6IFVuc3VwcG9ydGVkIGludmVyc2lvbiAoZm10ID0gMHgleCkhXG4iLAogCQkJX19mdW5jX18sIGZtdCk7CiAKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMTgsNyArMjE4LDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXM6IEVycm9yOiBVbnNvcHBvcnRlZCBtYXN0ZXIgKGZtdCA9IDB4JXgpIVxuIiwKKwkJZGV2X2VycihkYWktPmRldiwgIiVzOiBFcnJvcjogVW5zdXBwb3J0ZWQgbWFzdGVyIChmbXQgPSAweCV4KSFcbiIsCiAJCQlfX2Z1bmNfXywgZm10KTsKIAogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTM3NCw3ICszNzQsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWRldl9lcnIoZGFpLT5kZXYsICIlczogRXJyb3I6IFVuc29wcG9ydGVkIGZvcm1hdCAoJWQpIVxuIiwKKwkJZGV2X2VycihkYWktPmRldiwgIiVzOiBFcnJvcjogVW5zdXBwb3J0ZWQgZm9ybWF0ICglZCkhXG4iLAogCQkJX19mdW5jX18sIGZtdCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9jYWlhcS9hdWRpby5jIGIvc291bmQvdXNiL2NhaWFxL2F1ZGlvLmMKaW5kZXggMzI3Zjg2NC4uOGY2NmJhNyAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2NhaWFxL2F1ZGlvLmMKKysrIGIvc291bmQvdXNiL2NhaWFxL2F1ZGlvLmMKQEAgLTczOSw3ICs3MzksNiBAQAogCWZvciAoaSA9IDA7IGkgPCBOX1VSQlM7IGkrKykgewogCQl1cmJzW2ldID0gdXNiX2FsbG9jX3VyYihGUkFNRVNfUEVSX1VSQiwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdXJic1tpXSkgewotCQkJZGV2X2VycihkZXYsICJ1bmFibGUgdG8gdXNiX2FsbG9jX3VyYigpLCBPT00hP1xuIik7CiAJCQkqcmV0ID0gLUVOT01FTTsKIAkJCXJldHVybiB1cmJzOwogCQl9CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvY2FyZC5oIGIvc291bmQvdXNiL2NhcmQuaAppbmRleCA3MTc3OGNhLi4xMTFiMGYwIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvY2FyZC5oCisrKyBiL3NvdW5kL3VzYi9jYXJkLmgKQEAgLTkyLDcgKzkyLDcgQEAKIAl1bnNpZ25lZCBpbnQgY3VyZnJhbWVzaXplOyAgICAgIC8qIGN1cnJlbnQgcGFja2V0IHNpemUgaW4gZnJhbWVzIChmb3IgY2FwdHVyZSkgKi8KIAl1bnNpZ25lZCBpbnQgc3luY21heHNpemU7CS8qIHN5bmMgZW5kcG9pbnQgcGFja2V0IHNpemUgKi8KIAl1bnNpZ25lZCBpbnQgZmlsbF9tYXg6MTsJLyogZmlsbCBtYXggcGFja2V0IHNpemUgYWx3YXlzICovCi0JdW5zaWduZWQgaW50IHVkaDAxX2ZiX3F1aXJrOjE7CS8qIGNvcnJ1cHRlZCBmZWVkYmFjayBkYXRhICovCisJdW5zaWduZWQgaW50IHRlbm9yX2ZiX3F1aXJrOjE7CS8qIGNvcnJ1cHRlZCBmZWVkYmFjayBkYXRhICovCiAJdW5zaWduZWQgaW50IGRhdGFpbnRlcnZhbDsgICAgICAvKiBsb2dfMiBvZiBkYXRhIHBhY2tldCBpbnRlcnZhbCAqLwogCXVuc2lnbmVkIGludCBzeW5jaW50ZXJ2YWw7CS8qIFAgZm9yIGFkYXB0aXZlIG1vZGUsIDAgb3RoZXJ3aXNlICovCiAJdW5zaWduZWQgY2hhciBzaWxlbmNlX3ZhbHVlOwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2VuZHBvaW50LmMgYi9zb3VuZC91c2IvZW5kcG9pbnQuYwppbmRleCBjMDdhN2VkLi5jNDcwMjUxIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvZW5kcG9pbnQuYworKysgYi9zb3VuZC91c2IvZW5kcG9pbnQuYwpAQCAtNTAyLDEwICs1MDIsNiBAQAogCQkJZXAtPnN5bmNpbnRlcnZhbCA9IDM7CiAKIAkJZXAtPnN5bmNtYXhzaXplID0gbGUxNl90b19jcHUoZ2V0X2VuZHBvaW50KGFsdHMsIDEpLT53TWF4UGFja2V0U2l6ZSk7Ci0KLQkJaWYgKGNoaXAtPnVzYl9pZCA9PSBVU0JfSUQoMHgwNjQ0LCAweDgwMzgpIC8qIFRFQUMgVUQtSDAxICovICYmCi0JCSAgICBlcC0+c3luY21heHNpemUgPT0gNCkKLQkJCWVwLT51ZGgwMV9mYl9xdWlyayA9IDE7CiAJfQogCiAJbGlzdF9hZGRfdGFpbCgmZXAtPmxpc3QsICZjaGlwLT5lcF9saXN0KTsKQEAgLTExNzEsMTUgKzExNjcsMTYgQEAKIAlpZiAoZiA9PSAwKQogCQlyZXR1cm47CiAKLQlpZiAodW5saWtlbHkoc2VuZGVyLT51ZGgwMV9mYl9xdWlyaykpIHsKKwlpZiAodW5saWtlbHkoc2VuZGVyLT50ZW5vcl9mYl9xdWlyaykpIHsKIAkJLyoKLQkJICogVGhlIFRFQUMgVUQtSDAxIGZpcm13YXJlIHNvbWV0aW1lcyBjaGFuZ2VzIHRoZSBmZWVkYmFjayB2YWx1ZQorCQkgKiBEZXZpY2VzIGJhc2VkIG9uIFRlbm9yIDg4MDIgY2hpcHNldHMgKFRFQUMgVUQtSDAxCisJCSAqIGFuZCBvdGhlcnMpIHNvbWV0aW1lcyBjaGFuZ2UgdGhlIGZlZWRiYWNrIHZhbHVlCiAJCSAqIGJ5ICsvLSAweDEuMDAwMC4KIAkJICovCiAJCWlmIChmIDwgZXAtPmZyZXFuIC0gMHg4MDAwKQotCQkJZiArPSAweDEwMDAwOworCQkJZiArPSAweGYwMDA7CiAJCWVsc2UgaWYgKGYgPiBlcC0+ZnJlcW4gKyAweDgwMDApCi0JCQlmIC09IDB4MTAwMDA7CisJCQlmIC09IDB4ZjAwMDsKIAl9IGVsc2UgaWYgKHVubGlrZWx5KGVwLT5mcmVxc2hpZnQgPT0gSU5UX01JTikpIHsKIAkJLyoKIAkJICogVGhlIGZpcnN0IHRpbWUgd2Ugc2VlIGEgZmVlZGJhY2sgdmFsdWUsIGRldGVybWluZSBpdHMgZm9ybWF0CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvZm9ybWF0LmMgYi9zb3VuZC91c2IvZm9ybWF0LmMKaW5kZXggNzg5ZDE5ZS4uMmM0NDM4NiAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2Zvcm1hdC5jCisrKyBiL3NvdW5kL3VzYi9mb3JtYXQuYwpAQCAtMTc2LDEwICsxNzYsOCBAQAogCQlpbnQgciwgaWR4OwogCiAJCWZwLT5yYXRlX3RhYmxlID0ga21hbGxvYyhzaXplb2YoaW50KSAqIG5yX3JhdGVzLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGZwLT5yYXRlX3RhYmxlID09IE5VTEwpIHsKLQkJCXVzYl9hdWRpb19lcnIoY2hpcCwgImNhbm5vdCBtYWxsb2NcbiIpOworCQlpZiAoZnAtPnJhdGVfdGFibGUgPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PTUVNOwotCQl9CiAKIAkJZnAtPm5yX3JhdGVzID0gMDsKIAkJZnAtPnJhdGVfbWluID0gZnAtPnJhdGVfbWF4ID0gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9saW5lNi9LY29uZmlnIGIvc291bmQvdXNiL2xpbmU2L0tjb25maWcKaW5kZXggZjQ1ODVkMzcuLjM5YjQwMDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9saW5lNi9LY29uZmlnCisrKyBiL3NvdW5kL3VzYi9saW5lNi9LY29uZmlnCkBAIC0yLDYgKzIsNyBAQAogCXRyaXN0YXRlCiAJc2VsZWN0IFNORF9SQVdNSURJCiAJc2VsZWN0IFNORF9QQ00KKwlzZWxlY3QgU05EX0hXREVQCiAKIGNvbmZpZyBTTkRfVVNCX1BPRAogCXRyaXN0YXRlICJMaW5lIDYgUE9EIFVTQiBzdXBwb3J0IgpAQCAtMjEsMTAgKzIyLDEwIEBACiAJICAgICAgcmUtYW1waW5nKQogCiBjb25maWcgU05EX1VTQl9QT0RIRAotCXRyaXN0YXRlICJMaW5lIDYgUE9EIEhEMzAwLzQwMC81MDAgVVNCIHN1cHBvcnQiCisJdHJpc3RhdGUgIkxpbmUgNiBQT0QgWDMvSEQzMDAvNDAwLzUwMCBVU0Igc3VwcG9ydCIKIAlzZWxlY3QgU05EX1VTQl9MSU5FNgogCWhlbHAKLQkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIFBPRCBIRDMwMCwgNDAwIGFuZCA1MDAgZGV2aWNlcy4KKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIFBPRCBYMywgSEQzMDAsIDQwMCBhbmQgNTAwIGRldmljZXMuCiAKIGNvbmZpZyBTTkRfVVNCX1RPTkVQT1JUCiAJdHJpc3RhdGUgIlRvbmVQb3J0IEdYLCBVWDEgYW5kIFVYMiBVU0Igc3VwcG9ydCIKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9saW5lNi9jYXB0dXJlLmMgYi9zb3VuZC91c2IvbGluZTYvY2FwdHVyZS5jCmluZGV4IGY1MThmYmIuLjdjODEyNTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9saW5lNi9jYXB0dXJlLmMKKysrIGIvc291bmQvdXNiL2xpbmU2L2NhcHR1cmUuYwpAQCAtMjksMTAgKzI5LDEwIEBACiAJaW50IHJldDsKIAlzdHJ1Y3QgdXJiICp1cmJfaW47CiAKLQlpbmRleCA9Ci0JICAgIGZpbmRfZmlyc3RfemVyb19iaXQoJmxpbmU2cGNtLT5pbi5hY3RpdmVfdXJicywgTElORTZfSVNPX0JVRkZFUlMpOworCWluZGV4ID0gZmluZF9maXJzdF96ZXJvX2JpdCgmbGluZTZwY20tPmluLmFjdGl2ZV91cmJzLAorCQkJCSAgICBsaW5lNnBjbS0+bGluZTYtPmlzb19idWZmZXJzKTsKIAotCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTElORTZfSVNPX0JVRkZFUlMpIHsKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxpbmU2cGNtLT5saW5lNi0+aXNvX2J1ZmZlcnMpIHsKIAkJZGV2X2VycihsaW5lNnBjbS0+bGluZTYtPmlmY2RldiwgIm5vIGZyZWUgVVJCIGZvdW5kXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNDQsMTMgKzQ0LDEzIEBACiAJCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICpmaW4gPQogCQkgICAgJnVyYl9pbi0+aXNvX2ZyYW1lX2Rlc2NbaV07CiAJCWZpbi0+b2Zmc2V0ID0gdXJiX3NpemU7Ci0JCWZpbi0+bGVuZ3RoID0gbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZTsKLQkJdXJiX3NpemUgKz0gbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZTsKKwkJZmluLT5sZW5ndGggPSBsaW5lNnBjbS0+bWF4X3BhY2tldF9zaXplX2luOworCQl1cmJfc2l6ZSArPSBsaW5lNnBjbS0+bWF4X3BhY2tldF9zaXplX2luOwogCX0KIAogCXVyYl9pbi0+dHJhbnNmZXJfYnVmZmVyID0KIAkgICAgbGluZTZwY20tPmluLmJ1ZmZlciArCi0JICAgIGluZGV4ICogTElORTZfSVNPX1BBQ0tFVFMgKiBsaW5lNnBjbS0+bWF4X3BhY2tldF9zaXplOworCSAgICBpbmRleCAqIExJTkU2X0lTT19QQUNLRVRTICogbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZV9pbjsKIAl1cmJfaW4tPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSB1cmJfc2l6ZTsKIAl1cmJfaW4tPmNvbnRleHQgPSBsaW5lNnBjbTsKIApAQCAtNzMsNyArNzMsNyBAQAogewogCWludCByZXQgPSAwLCBpOwogCi0JZm9yIChpID0gMDsgaSA8IExJTkU2X0lTT19CVUZGRVJTOyArK2kpIHsKKwlmb3IgKGkgPSAwOyBpIDwgbGluZTZwY20tPmxpbmU2LT5pc29fYnVmZmVyczsgKytpKSB7CiAJCXJldCA9IHN1Ym1pdF9hdWRpb19pbl91cmIobGluZTZwY20pOwogCQlpZiAocmV0IDwgMCkKIAkJCWJyZWFrOwpAQCAtOTAsNyArOTAsOSBAQAogCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0KIAkgICAgZ2V0X3N1YnN0cmVhbShsaW5lNnBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKTsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCWNvbnN0IGludCBieXRlc19wZXJfZnJhbWUgPSBsaW5lNnBjbS0+cHJvcGVydGllcy0+Ynl0ZXNfcGVyX2ZyYW1lOworCWNvbnN0IGludCBieXRlc19wZXJfZnJhbWUgPQorCQlsaW5lNnBjbS0+cHJvcGVydGllcy0+Ynl0ZXNfcGVyX2NoYW5uZWwgKgorCQlsaW5lNnBjbS0+cHJvcGVydGllcy0+Y2FwdHVyZV9ody5jaGFubmVsc19tYXg7CiAJaW50IGZyYW1lcyA9IGZzaXplIC8gYnl0ZXNfcGVyX2ZyYW1lOwogCiAJaWYgKHJ1bnRpbWUgPT0gTlVMTCkKQEAgLTE1NCw3ICsxNTYsNyBAQAogCWxpbmU2cGNtLT5pbi5sYXN0X2ZyYW1lID0gdXJiLT5zdGFydF9mcmFtZTsKIAogCS8qIGZpbmQgaW5kZXggb2YgVVJCICovCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTElORTZfSVNPX0JVRkZFUlM7ICsraW5kZXgpCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbGluZTZwY20tPmxpbmU2LT5pc29fYnVmZmVyczsgKytpbmRleCkKIAkJaWYgKHVyYiA9PSBsaW5lNnBjbS0+aW4udXJic1tpbmRleF0pCiAJCQlicmVhazsKIApAQCAtMTczLDE3ICsxNzUsMjcgQEAKIAkJZmJ1ZiA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyICsgZmluLT5vZmZzZXQ7CiAJCWZzaXplID0gZmluLT5hY3R1YWxfbGVuZ3RoOwogCi0JCWlmIChmc2l6ZSA+IGxpbmU2cGNtLT5tYXhfcGFja2V0X3NpemUpIHsKKwkJaWYgKGZzaXplID4gbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZV9pbikgewogCQkJZGV2X2VycihsaW5lNnBjbS0+bGluZTYtPmlmY2RldiwKIAkJCQkiZHJpdmVyIGFuZC9vciBkZXZpY2UgYnVnOiBwYWNrZXQgdG9vIGxhcmdlICglZCA+ICVkKVxuIiwKLQkJCQlmc2l6ZSwgbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZSk7CisJCQkJZnNpemUsIGxpbmU2cGNtLT5tYXhfcGFja2V0X3NpemVfaW4pOwogCQl9CiAKIAkJbGVuZ3RoICs9IGZzaXplOwogCi0JCS8qIHRoZSBmb2xsb3dpbmcgYXNzdW1lcyBMSU5FNl9JU09fUEFDS0VUUyA9PSAxOiAqLworCQlCVUlMRF9CVUdfT05fTVNHKExJTkU2X0lTT19QQUNLRVRTICE9IDEsCisJCQkiVGhlIGZvbGxvd2luZyBjb2RlIGFzc3VtZXMgTElORTZfSVNPX1BBQ0tFVFMgPT0gMSIpOworCQkvKiBUT0RPOgorCQkgKiBBbHNvLCBpZiBpc29fYnVmZmVycyAhPSAyLCB0aGUgcHJldiBmcmFtZSBpcyBhbG1vc3QgcmFuZG9tIGF0CisJCSAqIHBsYXliYWNrIHNpZGUuCisJCSAqIFRoaXMgbmVlZHMgdG8gYmUgcmVkZXNpZ25lZC4gSXQgc2hvdWxkIGJlICJzdGFibGUiLCBidXQgd2UgbWF5CisJCSAqIGV4cGVyaWVuY2Ugc3luYyBwcm9ibGVtcyBvbiBzdWNoIGhpZ2gtc3BlZWQgY29uZmlncy4KKwkJICovCisKIAkJbGluZTZwY20tPnByZXZfZmJ1ZiA9IGZidWY7Ci0JCWxpbmU2cGNtLT5wcmV2X2ZzaXplID0gZnNpemU7CisJCWxpbmU2cGNtLT5wcmV2X2ZzaXplID0gZnNpemUgLworCQkJKGxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5ieXRlc19wZXJfY2hhbm5lbCAqCisJCQlsaW5lNnBjbS0+cHJvcGVydGllcy0+Y2FwdHVyZV9ody5jaGFubmVsc19tYXgpOwogCiAJCWlmICghdGVzdF9iaXQoTElORTZfU1RSRUFNX0lNUFVMU0UsICZsaW5lNnBjbS0+aW4ucnVubmluZykgJiYKIAkJICAgIHRlc3RfYml0KExJTkU2X1NUUkVBTV9QQ00sICZsaW5lNnBjbS0+aW4ucnVubmluZykgJiYKQEAgLTIyMCw2ICsyMzIsOCBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCisJbGluZTZfcGNtX2FjcXVpcmUobGluZTZwY20sIExJTkU2X1NUUkVBTV9DQVBUVVJFX0hFTFBFUiwgZmFsc2UpOworCiAJcnVudGltZS0+aHcgPSBsaW5lNnBjbS0+cHJvcGVydGllcy0+Y2FwdHVyZV9odzsKIAlyZXR1cm4gMDsKIH0KQEAgLTIyNyw2ICsyNDEsOSBAQAogLyogY2xvc2UgY2FwdHVyZSBjYWxsYmFjayAqLwogc3RhdGljIGludCBzbmRfbGluZTZfY2FwdHVyZV9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKKwlzdHJ1Y3Qgc25kX2xpbmU2X3BjbSAqbGluZTZwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlsaW5lNl9wY21fcmVsZWFzZShsaW5lNnBjbSwgTElORTZfU1RSRUFNX0NBUFRVUkVfSEVMUEVSKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjQ3LDggKzI2NCwxMyBAQAogCXN0cnVjdCB1c2JfbGluZTYgKmxpbmU2ID0gbGluZTZwY20tPmxpbmU2OwogCWludCBpOwogCisJbGluZTZwY20tPmluLnVyYnMgPSBremFsbG9jKAorCQlzaXplb2Yoc3RydWN0IHVyYiAqKSAqIGxpbmU2LT5pc29fYnVmZmVycywgR0ZQX0tFUk5FTCk7CisJaWYgKGxpbmU2cGNtLT5pbi51cmJzID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCiAJLyogY3JlYXRlIGF1ZGlvIFVSQnMgYW5kIGZpbGwgaW4gY29uc3RhbnQgdmFsdWVzOiAqLwotCWZvciAoaSA9IDA7IGkgPCBMSU5FNl9JU09fQlVGRkVSUzsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IGxpbmU2LT5pc29fYnVmZmVyczsgKytpKSB7CiAJCXN0cnVjdCB1cmIgKnVyYjsKIAogCQkvKiBVUkIgZm9yIGF1ZGlvIGluOiAqLwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2xpbmU2L2RyaXZlci5jIGIvc291bmQvdXNiL2xpbmU2L2RyaXZlci5jCmluZGV4IDgxYjdkYTguLjE0ZTU4N2UgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9saW5lNi9kcml2ZXIuYworKysgYi9zb3VuZC91c2IvbGluZTYvZHJpdmVyLmMKQEAgLTE3LDYgKzE3LDcgQEAKIAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvaHdkZXAuaD4KIAogI2luY2x1ZGUgImNhcHR1cmUuaCIKICNpbmNsdWRlICJkcml2ZXIuaCIKQEAgLTI5LDcgKzMwLDcgQEAKIC8qCiAJVGhpcyBpcyBMaW5lIDYncyBNSURJIG1hbnVmYWN0dXJlciBJRC4KICovCi1jb25zdCB1bnNpZ25lZCBjaGFyIGxpbmU2X21pZGlfaWRbXSA9IHsKK2NvbnN0IHVuc2lnbmVkIGNoYXIgbGluZTZfbWlkaV9pZFszXSA9IHsKIAkweDAwLCAweDAxLCAweDBjCiB9OwogRVhQT1JUX1NZTUJPTF9HUEwobGluZTZfbWlkaV9pZCk7CkBAIC02NiwxMCArNjcsMTcgQEAKIHsKIAlpbnQgZXJyOwogCi0JdXNiX2ZpbGxfaW50X3VyYihsaW5lNi0+dXJiX2xpc3RlbiwgbGluZTYtPnVzYmRldiwKLQkJdXNiX3JjdmludHBpcGUobGluZTYtPnVzYmRldiwgbGluZTYtPnByb3BlcnRpZXMtPmVwX2N0cmxfciksCi0JCWxpbmU2LT5idWZmZXJfbGlzdGVuLCBMSU5FNl9CVUZTSVpFX0xJU1RFTiwKLQkJbGluZTZfZGF0YV9yZWNlaXZlZCwgbGluZTYsIGxpbmU2LT5pbnRlcnZhbCk7CisJaWYgKGxpbmU2LT5wcm9wZXJ0aWVzLT5jYXBhYmlsaXRpZXMgJiBMSU5FNl9DQVBfQ09OVFJPTF9NSURJKSB7CisJCXVzYl9maWxsX2ludF91cmIobGluZTYtPnVyYl9saXN0ZW4sIGxpbmU2LT51c2JkZXYsCisJCQl1c2JfcmN2aW50cGlwZShsaW5lNi0+dXNiZGV2LCBsaW5lNi0+cHJvcGVydGllcy0+ZXBfY3RybF9yKSwKKwkJCWxpbmU2LT5idWZmZXJfbGlzdGVuLCBMSU5FNl9CVUZTSVpFX0xJU1RFTiwKKwkJCWxpbmU2X2RhdGFfcmVjZWl2ZWQsIGxpbmU2LCBsaW5lNi0+aW50ZXJ2YWwpOworCX0gZWxzZSB7CisJCXVzYl9maWxsX2J1bGtfdXJiKGxpbmU2LT51cmJfbGlzdGVuLCBsaW5lNi0+dXNiZGV2LAorCQkJdXNiX3JjdmJ1bGtwaXBlKGxpbmU2LT51c2JkZXYsIGxpbmU2LT5wcm9wZXJ0aWVzLT5lcF9jdHJsX3IpLAorCQkJbGluZTYtPmJ1ZmZlcl9saXN0ZW4sIExJTkU2X0JVRlNJWkVfTElTVEVOLAorCQkJbGluZTZfZGF0YV9yZWNlaXZlZCwgbGluZTYpOworCX0KIAlsaW5lNi0+dXJiX2xpc3Rlbi0+YWN0dWFsX2xlbmd0aCA9IDA7CiAJZXJyID0gdXNiX3N1Ym1pdF91cmIobGluZTYtPnVyYl9saXN0ZW4sIEdGUF9BVE9NSUMpOwogCXJldHVybiBlcnI7CkBAIC05MCw2ICs5OCw3IEBACiAJCQkJICBpbnQgc2l6ZSkKIHsKIAlpbnQgaSwgZG9uZSA9IDA7CisJY29uc3Qgc3RydWN0IGxpbmU2X3Byb3BlcnRpZXMgKnByb3BlcnRpZXMgPSBsaW5lNi0+cHJvcGVydGllczsKIAogCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpICs9IGxpbmU2LT5tYXhfcGFja2V0X3NpemUpIHsKIAkJaW50IHBhcnRpYWw7CkBAIC05NywxNSArMTA2LDIxIEBACiAJCWludCBmcmFnX3NpemUgPSBtaW4obGluZTYtPm1heF9wYWNrZXRfc2l6ZSwgc2l6ZSAtIGkpOwogCQlpbnQgcmV0dmFsOwogCi0JCXJldHZhbCA9IHVzYl9pbnRlcnJ1cHRfbXNnKGxpbmU2LT51c2JkZXYsCi0JCQkJCXVzYl9zbmRpbnRwaXBlKGxpbmU2LT51c2JkZXYsCi0JCQkJCQlsaW5lNi0+cHJvcGVydGllcy0+ZXBfY3RybF93KSwKLQkJCQkJKGNoYXIgKilmcmFnX2J1ZiwgZnJhZ19zaXplLAotCQkJCQkmcGFydGlhbCwgTElORTZfVElNRU9VVCAqIEhaKTsKKwkJaWYgKHByb3BlcnRpZXMtPmNhcGFiaWxpdGllcyAmIExJTkU2X0NBUF9DT05UUk9MX01JREkpIHsKKwkJCXJldHZhbCA9IHVzYl9pbnRlcnJ1cHRfbXNnKGxpbmU2LT51c2JkZXYsCisJCQkJCQl1c2Jfc25kaW50cGlwZShsaW5lNi0+dXNiZGV2LCBwcm9wZXJ0aWVzLT5lcF9jdHJsX3cpLAorCQkJCQkJKGNoYXIgKilmcmFnX2J1ZiwgZnJhZ19zaXplLAorCQkJCQkJJnBhcnRpYWwsIExJTkU2X1RJTUVPVVQgKiBIWik7CisJCX0gZWxzZSB7CisJCQlyZXR2YWwgPSB1c2JfYnVsa19tc2cobGluZTYtPnVzYmRldiwKKwkJCQkJCXVzYl9zbmRidWxrcGlwZShsaW5lNi0+dXNiZGV2LCBwcm9wZXJ0aWVzLT5lcF9jdHJsX3cpLAorCQkJCQkJKGNoYXIgKilmcmFnX2J1ZiwgZnJhZ19zaXplLAorCQkJCQkJJnBhcnRpYWwsIExJTkU2X1RJTUVPVVQgKiBIWik7CisJCX0KIAogCQlpZiAocmV0dmFsKSB7CiAJCQlkZXZfZXJyKGxpbmU2LT5pZmNkZXYsCi0JCQkJInVzYl9pbnRlcnJ1cHRfbXNnIGZhaWxlZCAoJWQpXG4iLCByZXR2YWwpOworCQkJCSJ1c2JfYnVsa19tc2cgZmFpbGVkICglZClcbiIsIHJldHZhbCk7CiAJCQlicmVhazsKIAkJfQogCkBAIC0xNDAsMTAgKzE1NSwxNyBAQAogCWludCBkb25lID0gbXNnLT5kb25lOwogCWludCBieXRlcyA9IG1pbihtc2ctPnNpemUgLSBkb25lLCBsaW5lNi0+bWF4X3BhY2tldF9zaXplKTsKIAotCXVzYl9maWxsX2ludF91cmIodXJiLCBsaW5lNi0+dXNiZGV2LAotCQl1c2Jfc25kaW50cGlwZShsaW5lNi0+dXNiZGV2LCBsaW5lNi0+cHJvcGVydGllcy0+ZXBfY3RybF93KSwKLQkJKGNoYXIgKiltc2ctPmJ1ZmZlciArIGRvbmUsIGJ5dGVzLAotCQlsaW5lNl9hc3luY19yZXF1ZXN0X3NlbnQsIG1zZywgbGluZTYtPmludGVydmFsKTsKKwlpZiAobGluZTYtPnByb3BlcnRpZXMtPmNhcGFiaWxpdGllcyAmIExJTkU2X0NBUF9DT05UUk9MX01JREkpIHsKKwkJdXNiX2ZpbGxfaW50X3VyYih1cmIsIGxpbmU2LT51c2JkZXYsCisJCQl1c2Jfc25kaW50cGlwZShsaW5lNi0+dXNiZGV2LCBsaW5lNi0+cHJvcGVydGllcy0+ZXBfY3RybF93KSwKKwkJCShjaGFyICopbXNnLT5idWZmZXIgKyBkb25lLCBieXRlcywKKwkJCWxpbmU2X2FzeW5jX3JlcXVlc3Rfc2VudCwgbXNnLCBsaW5lNi0+aW50ZXJ2YWwpOworCX0gZWxzZSB7CisJCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgbGluZTYtPnVzYmRldiwKKwkJCXVzYl9zbmRidWxrcGlwZShsaW5lNi0+dXNiZGV2LCBsaW5lNi0+cHJvcGVydGllcy0+ZXBfY3RybF93KSwKKwkJCShjaGFyICopbXNnLT5idWZmZXIgKyBkb25lLCBieXRlcywKKwkJCWxpbmU2X2FzeW5jX3JlcXVlc3Rfc2VudCwgbXNnKTsKKwl9CiAKIAltc2ctPmRvbmUgKz0gYnl0ZXM7CiAJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKQEAgLTI2OSwyOCArMjkxLDM2IEBACiAJaWYgKHVyYi0+c3RhdHVzID09IC1FU0hVVERPV04pCiAJCXJldHVybjsKIAotCWRvbmUgPQotCSAgICBsaW5lNl9taWRpYnVmX3dyaXRlKG1iLCB1cmItPnRyYW5zZmVyX2J1ZmZlciwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKLQotCWlmIChkb25lIDwgdXJiLT5hY3R1YWxfbGVuZ3RoKSB7Ci0JCWxpbmU2X21pZGlidWZfaWdub3JlKG1iLCBkb25lKTsKLQkJZGV2X2RiZyhsaW5lNi0+aWZjZGV2LCAiJWQgJWQgYnVmZmVyIG92ZXJmbG93IC0gbWVzc2FnZSBza2lwcGVkXG4iLAotCQkJZG9uZSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKLQl9Ci0KLQlmb3IgKDs7KSB7CisJaWYgKGxpbmU2LT5wcm9wZXJ0aWVzLT5jYXBhYmlsaXRpZXMgJiBMSU5FNl9DQVBfQ09OVFJPTF9NSURJKSB7CiAJCWRvbmUgPQotCQkgICAgbGluZTZfbWlkaWJ1Zl9yZWFkKG1iLCBsaW5lNi0+YnVmZmVyX21lc3NhZ2UsCi0JCQkJICAgICAgIExJTkU2X01FU1NBR0VfTUFYTEVOKTsKKwkJCWxpbmU2X21pZGlidWZfd3JpdGUobWIsIHVyYi0+dHJhbnNmZXJfYnVmZmVyLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCi0JCWlmIChkb25lID09IDApCi0JCQlicmVhazsKKwkJaWYgKGRvbmUgPCB1cmItPmFjdHVhbF9sZW5ndGgpIHsKKwkJCWxpbmU2X21pZGlidWZfaWdub3JlKG1iLCBkb25lKTsKKwkJCWRldl9kYmcobGluZTYtPmlmY2RldiwgIiVkICVkIGJ1ZmZlciBvdmVyZmxvdyAtIG1lc3NhZ2Ugc2tpcHBlZFxuIiwKKwkJCQlkb25lLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQl9CiAKLQkJbGluZTYtPm1lc3NhZ2VfbGVuZ3RoID0gZG9uZTsKLQkJbGluZTZfbWlkaV9yZWNlaXZlKGxpbmU2LCBsaW5lNi0+YnVmZmVyX21lc3NhZ2UsIGRvbmUpOworCQlmb3IgKDs7KSB7CisJCQlkb25lID0KKwkJCQlsaW5lNl9taWRpYnVmX3JlYWQobWIsIGxpbmU2LT5idWZmZXJfbWVzc2FnZSwKKwkJCQkJCUxJTkU2X01JRElfTUVTU0FHRV9NQVhMRU4pOwogCisJCQlpZiAoZG9uZSA9PSAwKQorCQkJCWJyZWFrOworCisJCQlsaW5lNi0+bWVzc2FnZV9sZW5ndGggPSBkb25lOworCQkJbGluZTZfbWlkaV9yZWNlaXZlKGxpbmU2LCBsaW5lNi0+YnVmZmVyX21lc3NhZ2UsIGRvbmUpOworCisJCQlpZiAobGluZTYtPnByb2Nlc3NfbWVzc2FnZSkKKwkJCQlsaW5lNi0+cHJvY2Vzc19tZXNzYWdlKGxpbmU2KTsKKwkJfQorCX0gZWxzZSB7CisJCWxpbmU2LT5idWZmZXJfbWVzc2FnZSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOworCQlsaW5lNi0+bWVzc2FnZV9sZW5ndGggPSB1cmItPmFjdHVhbF9sZW5ndGg7CiAJCWlmIChsaW5lNi0+cHJvY2Vzc19tZXNzYWdlKQogCQkJbGluZTYtPnByb2Nlc3NfbWVzc2FnZShsaW5lNik7CisJCWxpbmU2LT5idWZmZXJfbWVzc2FnZSA9IE5VTEw7CiAJfQogCiAJbGluZTZfc3RhcnRfbGlzdGVuKGxpbmU2KTsKQEAgLTQ0NywxMiArNDc3LDE2IEBACiAJc3RydWN0IHVzYl9saW5lNiAqbGluZTYgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldiA9IGxpbmU2LT51c2JkZXY7CiAKLQkvKiBmcmVlIGJ1ZmZlciBtZW1vcnkgZmlyc3Q6ICovCisJLyogRnJlZSBidWZmZXIgbWVtb3J5IGZpcnN0LiBXZSBjYW5ub3QgZGVwZW5kIG9uIHRoZSBleGlzdGVuY2Ugb2YgcHJpdmF0ZQorCSAqIGRhdGEgZnJvbSB0aGUgKHBvZGhkKSBtb2R1bGUsIGl0IG1heSBiZSBnb25lIGFscmVhZHkgZHVyaW5nIHRoaXMgY2FsbAorCSAqLwogCWtmcmVlKGxpbmU2LT5idWZmZXJfbWVzc2FnZSk7CisKIAlrZnJlZShsaW5lNi0+YnVmZmVyX2xpc3Rlbik7CiAKIAkvKiB0aGVuIGZyZWUgVVJCczogKi8KIAl1c2JfZnJlZV91cmIobGluZTYtPnVyYl9saXN0ZW4pOworCWxpbmU2LT51cmJfbGlzdGVuID0gTlVMTDsKIAogCS8qIGRlY3JlbWVudCByZWZlcmVuY2UgY291bnRlcnM6ICovCiAJdXNiX3B1dF9kZXYodXNiZGV2KTsKQEAgLTQ2MiwxMyArNDk2LDI5IEBACiBzdGF0aWMgdm9pZCBsaW5lNl9nZXRfaW50ZXJ2YWwoc3RydWN0IHVzYl9saW5lNiAqbGluZTYpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldiA9IGxpbmU2LT51c2JkZXY7CisJY29uc3Qgc3RydWN0IGxpbmU2X3Byb3BlcnRpZXMgKnByb3BlcnRpZXMgPSBsaW5lNi0+cHJvcGVydGllczsKKwlpbnQgcGlwZTsKIAlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwOwotCXVuc2lnbmVkIHBpcGUgPSB1c2JfcmN2aW50cGlwZSh1c2JkZXYsIGxpbmU2LT5wcm9wZXJ0aWVzLT5lcF9jdHJsX3IpOwotCXVuc2lnbmVkIGVwbnVtID0gdXNiX3BpcGVlbmRwb2ludChwaXBlKTsKIAotCWVwID0gdXNiZGV2LT5lcF9pbltlcG51bV07CisJaWYgKHByb3BlcnRpZXMtPmNhcGFiaWxpdGllcyAmIExJTkU2X0NBUF9DT05UUk9MX01JREkpIHsKKwkJcGlwZSA9CisJCQl1c2JfcmN2aW50cGlwZShsaW5lNi0+dXNiZGV2LCBsaW5lNi0+cHJvcGVydGllcy0+ZXBfY3RybF9yKTsKKwl9IGVsc2UgeworCQlwaXBlID0KKwkJCXVzYl9yY3ZidWxrcGlwZShsaW5lNi0+dXNiZGV2LCBsaW5lNi0+cHJvcGVydGllcy0+ZXBfY3RybF9yKTsKKwl9CisJZXAgPSB1c2JkZXYtPmVwX2luW3VzYl9waXBlZW5kcG9pbnQocGlwZSldOworCiAJaWYgKGVwKSB7CiAJCWxpbmU2LT5pbnRlcnZhbCA9IGVwLT5kZXNjLmJJbnRlcnZhbDsKKwkJaWYgKHVzYmRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0xPVykgeworCQkJbGluZTYtPmludGVydmFsc19wZXJfc2Vjb25kID0gVVNCX0xPV19JTlRFUlZBTFNfUEVSX1NFQ09ORDsKKwkJCWxpbmU2LT5pc29fYnVmZmVycyA9IFVTQl9MT1dfSVNPX0JVRkZFUlM7CisJCX0gZWxzZSB7CisJCQlsaW5lNi0+aW50ZXJ2YWxzX3Blcl9zZWNvbmQgPSBVU0JfSElHSF9JTlRFUlZBTFNfUEVSX1NFQ09ORDsKKwkJCWxpbmU2LT5pc29fYnVmZmVycyA9IFVTQl9ISUdIX0lTT19CVUZGRVJTOworCQl9CisKIAkJbGluZTYtPm1heF9wYWNrZXRfc2l6ZSA9IGxlMTZfdG9fY3B1KGVwLT5kZXNjLndNYXhQYWNrZXRTaXplKTsKIAl9IGVsc2UgewogCQlkZXZfZXJyKGxpbmU2LT5pZmNkZXYsCkBAIC00NzgsNiArNTI4LDEzOCBAQAogCX0KIH0KIAorCisvKiBFbmFibGUgYnVmZmVyaW5nIG9mIGluY29taW5nIG1lc3NhZ2VzLCBmbHVzaCB0aGUgYnVmZmVyICovCitzdGF0aWMgaW50IGxpbmU2X2h3ZGVwX29wZW4oc3RydWN0IHNuZF9od2RlcCAqaHcsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB1c2JfbGluZTYgKmxpbmU2ID0gaHctPnByaXZhdGVfZGF0YTsKKworCS8qIE5PVEU6IGh3ZGVwIGxheWVyIHByb3ZpZGVzIGF0b21pY2l0eSBoZXJlICovCisKKwlsaW5lNi0+bWVzc2FnZXMuYWN0aXZlID0gMTsKKworCXJldHVybiAwOworfQorCisvKiBTdG9wIGJ1ZmZlcmluZyAqLworc3RhdGljIGludCBsaW5lNl9od2RlcF9yZWxlYXNlKHN0cnVjdCBzbmRfaHdkZXAgKmh3LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdXNiX2xpbmU2ICpsaW5lNiA9IGh3LT5wcml2YXRlX2RhdGE7CisKKwlsaW5lNi0+bWVzc2FnZXMuYWN0aXZlID0gMDsKKworCXJldHVybiAwOworfQorCisvKiBSZWFkIGZyb20gY2lyY3VsYXIgYnVmZmVyLCByZXR1cm4gdG8gdXNlciAqLworc3RhdGljIGxvbmcKK2xpbmU2X2h3ZGVwX3JlYWQoc3RydWN0IHNuZF9od2RlcCAqaHdkZXAsIGNoYXIgX191c2VyICpidWYsIGxvbmcgY291bnQsCisJCQkJCWxvZmZfdCAqb2Zmc2V0KQoreworCXN0cnVjdCB1c2JfbGluZTYgKmxpbmU2ID0gaHdkZXAtPnByaXZhdGVfZGF0YTsKKwlsb25nIHJ2ID0gMDsKKwl1bnNpZ25lZCBpbnQgb3V0X2NvdW50OworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmbGluZTYtPm1lc3NhZ2VzLnJlYWRfbG9jaykpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwl3aGlsZSAoa2ZpZm9fbGVuKCZsaW5lNi0+bWVzc2FnZXMuZmlmbykgPT0gMCkgeworCQltdXRleF91bmxvY2soJmxpbmU2LT5tZXNzYWdlcy5yZWFkX2xvY2spOworCisJCXJ2ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKAorCQkJbGluZTYtPm1lc3NhZ2VzLndhaXRfcXVldWUsCisJCQlrZmlmb19sZW4oJmxpbmU2LT5tZXNzYWdlcy5maWZvKSAhPSAwKTsKKwkJaWYgKHJ2IDwgMCkKKwkJCXJldHVybiBydjsKKworCQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZsaW5lNi0+bWVzc2FnZXMucmVhZF9sb2NrKSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCisJaWYgKGtmaWZvX3BlZWtfbGVuKCZsaW5lNi0+bWVzc2FnZXMuZmlmbykgPiBjb3VudCkgeworCQkvKiBCdWZmZXIgdG9vIHNtYWxsOyBhbGxvdyByZS1yZWFkIG9mIHRoZSBjdXJyZW50IGl0ZW0uLi4gKi8KKwkJcnYgPSAtRUlOVkFMOworCX0gZWxzZSB7CisJCXJ2ID0ga2ZpZm9fdG9fdXNlcigmbGluZTYtPm1lc3NhZ2VzLmZpZm8sIGJ1ZiwgY291bnQsICZvdXRfY291bnQpOworCQlpZiAocnYgPT0gMCkKKwkJCXJ2ID0gb3V0X2NvdW50OworCX0KKworCW11dGV4X3VubG9jaygmbGluZTYtPm1lc3NhZ2VzLnJlYWRfbG9jayk7CisJcmV0dXJuIHJ2OworfQorCisvKiBXcml0ZSBkaXJlY3RseSAobm8gYnVmZmVyaW5nKSB0byBkZXZpY2UgYnkgdXNlciovCitzdGF0aWMgbG9uZworbGluZTZfaHdkZXBfd3JpdGUoc3RydWN0IHNuZF9od2RlcCAqaHdkZXAsIGNvbnN0IGNoYXIgX191c2VyICpkYXRhLCBsb25nIGNvdW50LAorCQkJCQlsb2ZmX3QgKm9mZnNldCkKK3sKKwlzdHJ1Y3QgdXNiX2xpbmU2ICpsaW5lNiA9IGh3ZGVwLT5wcml2YXRlX2RhdGE7CisJaW50IHJ2OworCWNoYXIgKmRhdGFfY29weTsKKworCWlmIChjb3VudCA+IGxpbmU2LT5tYXhfcGFja2V0X3NpemUgKiBMSU5FNl9SQVdfTUVTU0FHRVNfTUFYQ09VTlQpIHsKKwkJLyogVGhpcyBpcyBhbiBhcmJpdHJhcnkgbGltaXQgLSBzdGlsbCBiZXR0ZXIgdGhhbiBub3RoaW5nLi4uICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRhdGFfY29weSA9IG1lbWR1cF91c2VyKGRhdGEsIGNvdW50KTsKKwlpZiAoSVNfRVJSKEVSUl9QVFIpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJ2ID0gbGluZTZfc2VuZF9yYXdfbWVzc2FnZShsaW5lNiwgZGF0YV9jb3B5LCBjb3VudCk7CisKKwlrZnJlZShkYXRhX2NvcHkpOworCXJldHVybiBydjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfaHdkZXBfb3BzIGh3ZGVwX29wcyA9IHsKKwkub3BlbiAgICA9IGxpbmU2X2h3ZGVwX29wZW4sCisJLnJlbGVhc2UgPSBsaW5lNl9od2RlcF9yZWxlYXNlLAorCS5yZWFkICAgID0gbGluZTZfaHdkZXBfcmVhZCwKKwkud3JpdGUgICA9IGxpbmU2X2h3ZGVwX3dyaXRlLAorfTsKKworLyogSW5zZXJ0IGludG8gY2lyY3VsYXIgYnVmZmVyICovCitzdGF0aWMgdm9pZCBsaW5lNl9od2RlcF9wdXNoX21lc3NhZ2Uoc3RydWN0IHVzYl9saW5lNiAqbGluZTYpCit7CisJaWYgKCFsaW5lNi0+bWVzc2FnZXMuYWN0aXZlKQorCQlyZXR1cm47CisKKwlpZiAoa2ZpZm9fYXZhaWwoJmxpbmU2LT5tZXNzYWdlcy5maWZvKSA+PSBsaW5lNi0+bWVzc2FnZV9sZW5ndGgpIHsKKwkJLyogTm8gcmFjZSBjb25kaXRpb24gaGVyZSwgdGhlcmUncyBvbmx5IG9uZSB3cml0ZXIgKi8KKwkJa2ZpZm9faW4oJmxpbmU2LT5tZXNzYWdlcy5maWZvLAorCQkJbGluZTYtPmJ1ZmZlcl9tZXNzYWdlLCBsaW5lNi0+bWVzc2FnZV9sZW5ndGgpOworCX0gLyogZWxzZSBUT0RPOiBzaWduYWwgb3ZlcmZsb3cgKi8KKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbGluZTYtPm1lc3NhZ2VzLndhaXRfcXVldWUpOworfQorCitzdGF0aWMgaW50IGxpbmU2X2h3ZGVwX2luaXQoc3RydWN0IHVzYl9saW5lNiAqbGluZTYpCit7CisJaW50IGVycjsKKwlzdHJ1Y3Qgc25kX2h3ZGVwICpod2RlcDsKKworCS8qIFRPRE86IHVzYl9kcml2ZXJfY2xhaW1faW50ZXJmYWNlKCk7ICovCisJbGluZTYtPnByb2Nlc3NfbWVzc2FnZSA9IGxpbmU2X2h3ZGVwX3B1c2hfbWVzc2FnZTsKKwlsaW5lNi0+bWVzc2FnZXMuYWN0aXZlID0gMDsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZsaW5lNi0+bWVzc2FnZXMud2FpdF9xdWV1ZSk7CisJbXV0ZXhfaW5pdCgmbGluZTYtPm1lc3NhZ2VzLnJlYWRfbG9jayk7CisJSU5JVF9LRklGTyhsaW5lNi0+bWVzc2FnZXMuZmlmbyk7CisKKwllcnIgPSBzbmRfaHdkZXBfbmV3KGxpbmU2LT5jYXJkLCAiY29uZmlnIiwgMCwgJmh3ZGVwKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlbmQ7CisJc3RyY3B5KGh3ZGVwLT5uYW1lLCAiY29uZmlnIik7CisJaHdkZXAtPmlmYWNlID0gU05EUlZfSFdERVBfSUZBQ0VfTElORTY7CisJaHdkZXAtPm9wcyA9IGh3ZGVwX29wczsKKwlod2RlcC0+cHJpdmF0ZV9kYXRhID0gbGluZTY7CisJaHdkZXAtPmV4Y2x1c2l2ZSA9IHRydWU7CisKK2VuZDoKKwlyZXR1cm4gZXJyOworfQorCiBzdGF0aWMgaW50IGxpbmU2X2luaXRfY2FwX2NvbnRyb2woc3RydWN0IHVzYl9saW5lNiAqbGluZTYpCiB7CiAJaW50IHJldDsKQEAgLTQ4NywxNCArNjY5LDIwIEBACiAJaWYgKCFsaW5lNi0+YnVmZmVyX2xpc3RlbikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlsaW5lNi0+YnVmZmVyX21lc3NhZ2UgPSBrbWFsbG9jKExJTkU2X01FU1NBR0VfTUFYTEVOLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWxpbmU2LT5idWZmZXJfbWVzc2FnZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAlsaW5lNi0+dXJiX2xpc3RlbiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFsaW5lNi0+dXJiX2xpc3RlbikKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlpZiAobGluZTYtPnByb3BlcnRpZXMtPmNhcGFiaWxpdGllcyAmIExJTkU2X0NBUF9DT05UUk9MX01JREkpIHsKKwkJbGluZTYtPmJ1ZmZlcl9tZXNzYWdlID0ga21hbGxvYyhMSU5FNl9NSURJX01FU1NBR0VfTUFYTEVOLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFsaW5lNi0+YnVmZmVyX21lc3NhZ2UpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9IGVsc2UgeworCQlyZXQgPSBsaW5lNl9od2RlcF9pbml0KGxpbmU2KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKwogCXJldCA9IGxpbmU2X3N0YXJ0X2xpc3RlbihsaW5lNik7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycihsaW5lNi0+aWZjZGV2LCAiY2Fubm90IHN0YXJ0IGxpc3RlbmluZzogJWRcbiIsIHJldCk7CkBAIC01NTgsNiArNzQ2LDcgQEAKIAkvKiBxdWVyeSBpbnRlcmZhY2UgbnVtYmVyICovCiAJaW50ZXJmYWNlX251bWJlciA9IGludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcjsKIAorCS8qIFRPRE8gcmVzZXJ2ZXMgdGhlIGJ1cyBiYW5kd2lkdGggZXZlbiB3aXRob3V0IGFjdHVhbCB0cmFuc2ZlciAqLwogCXJldCA9IHVzYl9zZXRfaW50ZXJmYWNlKHVzYmRldiwgaW50ZXJmYWNlX251bWJlciwKIAkJCQlwcm9wZXJ0aWVzLT5hbHRzZXR0aW5nKTsKIAlpZiAocmV0IDwgMCkgewpAQCAtNTY1LDkgKzc1NCw4IEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JbGluZTZfZ2V0X2ludGVydmFsKGxpbmU2KTsKLQogCWlmIChwcm9wZXJ0aWVzLT5jYXBhYmlsaXRpZXMgJiBMSU5FNl9DQVBfQ09OVFJPTCkgeworCQlsaW5lNl9nZXRfaW50ZXJ2YWwobGluZTYpOwogCQlyZXQgPSBsaW5lNl9pbml0X2NhcF9jb250cm9sKGxpbmU2KTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIGVycm9yOwpAQCAtNjcwLDMgKzg1OCw0IEBACiBNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOwogTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2xpbmU2L2RyaXZlci5oIGIvc291bmQvdXNiL2xpbmU2L2RyaXZlci5oCmluZGV4IDdkYTY0M2UuLjdlM2EzYWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9saW5lNi9kcml2ZXIuaAorKysgYi9zb3VuZC91c2IvbGluZTYvZHJpdmVyLmgKQEAgLTEyLDIxICsxMiwzNyBAQAogI2lmbmRlZiBEUklWRVJfSAogI2RlZmluZSBEUklWRVJfSAogCi0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogCiAjaW5jbHVkZSAibWlkaS5oIgogCi0jZGVmaW5lIFVTQl9JTlRFUlZBTFNfUEVSX1NFQ09ORCAxMDAwCisvKiBVU0IgMS4xIHNwZWVkIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgVVNCX0xPV19JTlRFUlZBTFNfUEVSX1NFQ09ORCAxMDAwCisjZGVmaW5lIFVTQl9MT1dfSVNPX0JVRkZFUlMgMgorCisvKiBVU0IgMi4wKyBzcGVlZCBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIFVTQl9ISUdIX0lOVEVSVkFMU19QRVJfU0VDT05EIDgwMDAKKyNkZWZpbmUgVVNCX0hJR0hfSVNPX0JVRkZFUlMgMTYKIAogLyogRmFsbGJhY2sgVVNCIGludGVydmFsIGFuZCBtYXggcGFja2V0IHNpemUgdmFsdWVzICovCiAjZGVmaW5lIExJTkU2X0ZBTExCQUNLX0lOVEVSVkFMIDEwCiAjZGVmaW5lIExJTkU2X0ZBTExCQUNLX01BWFBBQ0tFVFNJWkUgMTYKIAogI2RlZmluZSBMSU5FNl9USU1FT1VUIDEKLSNkZWZpbmUgTElORTZfQlVGU0laRV9MSVNURU4gMzIKLSNkZWZpbmUgTElORTZfTUVTU0FHRV9NQVhMRU4gMjU2CisjZGVmaW5lIExJTkU2X0JVRlNJWkVfTElTVEVOIDY0CisjZGVmaW5lIExJTkU2X01JRElfTUVTU0FHRV9NQVhMRU4gMjU2CisKKyNkZWZpbmUgTElORTZfUkFXX01FU1NBR0VTX01BWENPVU5UX09SREVSIDcKKy8qIDRrIHBhY2tldHMgYXJlIGNvbW1vbiwgQlVGU0laRSAqIE1BWENPVU5UIHNob3VsZCBiZSBiaWdnZXIuLi4gKi8KKyNkZWZpbmUgTElORTZfUkFXX01FU1NBR0VTX01BWENPVU5UICgxIDw8IExJTkU2X1JBV19NRVNTQUdFU19NQVhDT1VOVF9PUkRFUikKKworCisjaWYgTElORTZfQlVGU0laRV9MSVNURU4gPiA2NTUzNQorI2Vycm9yICJVc2UgZHluYW1pYyBmaWZvIGluc3RlYWQiCisjZW5kaWYKIAogLyoKIAlMaW5lIDYgTUlESSBjb250cm9sIGNvbW1hbmRzCkBAIC05NCw4ICsxMTAsMTIgQEAKIAlMSU5FNl9DQVBfQ09OVFJPTCA9CTEgPDwgMCwKIAkvKiBkZXZpY2Ugc3VwcG9ydHMgUENNIGlucHV0L291dHB1dCB2aWEgVVNCICovCiAJTElORTZfQ0FQX1BDTSA9CQkxIDw8IDEsCi0JLyogZGV2aWNlIHN1cHBvcnQgaGFyZHdhcmUgbW9uaXRvcmluZyAqLworCS8qIGRldmljZSBzdXBwb3J0cyBoYXJkd2FyZSBtb25pdG9yaW5nICovCiAJTElORTZfQ0FQX0hXTU9OID0JMSA8PCAyLAorCS8qIGRldmljZSByZXF1aXJlcyBvdXRwdXQgZGF0YSB3aGVuIGlucHV0IGlzIHJlYWQgKi8KKwlMSU5FNl9DQVBfSU5fTkVFRFNfT1VUID0gMSA8PCAzLAorCS8qIGRldmljZSB1c2VzIHJhdyBNSURJIHZpYSBVU0IgKGRhdGEgZW5kcG9pbnRzKSAqLworCUxJTkU2X0NBUF9DT05UUk9MX01JREkgPSAxIDw8IDQsCiB9OwogCiAvKgpAQCAtMTA5LDEwICsxMjksMTUgQEAKIAkvKiBQcm9wZXJ0aWVzICovCiAJY29uc3Qgc3RydWN0IGxpbmU2X3Byb3BlcnRpZXMgKnByb3BlcnRpZXM7CiAKLQkvKiBJbnRlcnZhbCAobXMpICovCisJLyogSW50ZXJ2YWwgZm9yIGRhdGEgVVNCIHBhY2tldHMgKi8KIAlpbnQgaW50ZXJ2YWw7CisJLyogLi4uZm9yIGlzb2Nocm9ub3VzIHRyYW5zZmVycyBmcmFtaW5nICovCisJaW50IGludGVydmFsc19wZXJfc2Vjb25kOwogCi0JLyogTWF4aW11bSBzaXplIG9mIFVTQiBwYWNrZXQgKi8KKwkvKiBOdW1iZXIgb2YgaXNvY2hyb25vdXMgVVJCcyB1c2VkIGZvciBmcmFtZSB0cmFuc2ZlcnMgKi8KKwlpbnQgaXNvX2J1ZmZlcnM7CisKKwkvKiBNYXhpbXVtIHNpemUgb2YgZGF0YSBVU0IgcGFja2V0ICovCiAJaW50IG1heF9wYWNrZXRfc2l6ZTsKIAogCS8qIERldmljZSByZXByZXNlbnRpbmcgdGhlIFVTQiBpbnRlcmZhY2UgKi8KQEAgLTEyOSwxOCArMTU0LDMwIEBACiAJLyogTGluZSA2IE1JREkgZGV2aWNlIGRhdGEgc3RydWN0dXJlICovCiAJc3RydWN0IHNuZF9saW5lNl9taWRpICpsaW5lNm1pZGk7CiAKLQkvKiBVUkIgZm9yIGxpc3RlbmluZyB0byBQT0R4dCBQcm8gY29udHJvbCBlbmRwb2ludCAqLworCS8qIFVSQiBmb3IgbGlzdGVuaW5nIHRvIFBPRCBkYXRhIGVuZHBvaW50ICovCiAJc3RydWN0IHVyYiAqdXJiX2xpc3RlbjsKIAotCS8qIEJ1ZmZlciBmb3IgbGlzdGVuaW5nIHRvIFBPRHh0IFBybyBjb250cm9sIGVuZHBvaW50ICovCisJLyogQnVmZmVyIGZvciBpbmNvbWluZyBkYXRhIGZyb20gUE9EIGRhdGEgZW5kcG9pbnQgKi8KIAl1bnNpZ25lZCBjaGFyICpidWZmZXJfbGlzdGVuOwogCi0JLyogQnVmZmVyIGZvciBtZXNzYWdlIHRvIGJlIHByb2Nlc3NlZCAqLworCS8qIEJ1ZmZlciBmb3IgbWVzc2FnZSB0byBiZSBwcm9jZXNzZWQsIGdlbmVyYXRlZCBmcm9tIE1JREkgbGF5ZXIgKi8KIAl1bnNpZ25lZCBjaGFyICpidWZmZXJfbWVzc2FnZTsKIAotCS8qIExlbmd0aCBvZiBtZXNzYWdlIHRvIGJlIHByb2Nlc3NlZCAqLworCS8qIExlbmd0aCBvZiBtZXNzYWdlIHRvIGJlIHByb2Nlc3NlZCwgZ2VuZXJhdGVkIGZyb20gTUlESSBsYXllciAgKi8KIAlpbnQgbWVzc2FnZV9sZW5ndGg7CiAKKwkvKiBDaXJjdWxhciBidWZmZXIgZm9yIG5vbi1NSURJIGNvbnRyb2wgbWVzc2FnZXMgKi8KKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgbXV0ZXggcmVhZF9sb2NrOworCQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3F1ZXVlOworCQl1bnNpZ25lZCBpbnQgYWN0aXZlOjE7CisJCVNUUlVDVF9LRklGT19SRUNfMihMSU5FNl9CVUZTSVpFX0xJU1RFTiAqIExJTkU2X1JBV19NRVNTQUdFU19NQVhDT1VOVCkKKwkJCWZpZm87CisJfSBtZXNzYWdlczsKKworCS8qIElmIE1JREkgaXMgc3VwcG9ydGVkLCBidWZmZXJfbWVzc2FnZSBjb250YWlucyB0aGUgcHJlLXByb2Nlc3NlZCBkYXRhOworCSAqIG90aGVyd2lzZSB0aGUgZGF0YSBpcyBvbmx5IGluIHVyYl9saXN0ZW4gKGJ1ZmZlcl9pbmNvbWluZykuCisJICovCiAJdm9pZCAoKnByb2Nlc3NfbWVzc2FnZSkoc3RydWN0IHVzYl9saW5lNiAqKTsKIAl2b2lkICgqZGlzY29ubmVjdCkoc3RydWN0IHVzYl9saW5lNiAqbGluZTYpOwogfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9saW5lNi9taWRpLmMgYi9zb3VuZC91c2IvbGluZTYvbWlkaS5jCmluZGV4IGNlYmVhOWIuLmQwZmIyZjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9saW5lNi9taWRpLmMKKysrIGIvc291bmQvdXNiL2xpbmU2L21pZGkuYwpAQCAtMjU4LDcgKzI1OCw3IEBACiAJc3RydWN0IHNuZF9yYXdtaWRpICpybWlkaTsKIAlzdHJ1Y3Qgc25kX2xpbmU2X21pZGkgKmxpbmU2bWlkaTsKIAotCWlmICghKGxpbmU2LT5wcm9wZXJ0aWVzLT5jYXBhYmlsaXRpZXMgJiBMSU5FNl9DQVBfQ09OVFJPTCkpIHsKKwlpZiAoIShsaW5lNi0+cHJvcGVydGllcy0+Y2FwYWJpbGl0aWVzICYgTElORTZfQ0FQX0NPTlRST0xfTUlESSkpIHsKIAkJLyogc2tpcCBNSURJIGluaXRpYWxpemF0aW9uIGFuZCByZXBvcnQgc3VjY2VzcyAqLwogCQlyZXR1cm4gMDsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbGluZTYvcGNtLmMgYi9zb3VuZC91c2IvbGluZTYvcGNtLmMKaW5kZXggMjA0Y2MwNy4uZmFiNTNmNSAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2xpbmU2L3BjbS5jCisrKyBiL3NvdW5kL3VzYi9saW5lNi9wY20uYwpAQCAtNTIsMTAgKzUyLDkgQEAKIAogCWxpbmU2cGNtLT5pbXB1bHNlX3ZvbHVtZSA9IHZhbHVlOwogCWlmICh2YWx1ZSA+IDApIHsKLQkJZXJyID0gbGluZTZfcGNtX2FjcXVpcmUobGluZTZwY20sIExJTkU2X1NUUkVBTV9JTVBVTFNFKTsKKwkJZXJyID0gbGluZTZfcGNtX2FjcXVpcmUobGluZTZwY20sIExJTkU2X1NUUkVBTV9JTVBVTFNFLCB0cnVlKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCWxpbmU2cGNtLT5pbXB1bHNlX3ZvbHVtZSA9IDA7Ci0JCQlsaW5lNl9wY21fcmVsZWFzZShsaW5lNnBjbSwgTElORTZfU1RSRUFNX0lNUFVMU0UpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCX0gZWxzZSB7CkBAIC0xMDUsNyArMTA0LDcgQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBMSU5FNl9JU09fQlVGRkVSUzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGxpbmU2cGNtLT5saW5lNi0+aXNvX2J1ZmZlcnM7IGkrKykgewogCQlpZiAodGVzdF9iaXQoaSwgJnBjbXMtPmFjdGl2ZV91cmJzKSkgewogCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KGksICZwY21zLT51bmxpbmtfdXJicykpCiAJCQkJdXNiX3VubGlua191cmIocGNtcy0+dXJic1tpXSk7CkBAIC0xMjUsNyArMTI0LDcgQEAKIAogCWRvIHsKIAkJYWxpdmUgPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgTElORTZfSVNPX0JVRkZFUlM7IGkrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgbGluZTZwY20tPmxpbmU2LT5pc29fYnVmZmVyczsgaSsrKSB7CiAJCQlpZiAodGVzdF9iaXQoaSwgJnBjbXMtPmFjdGl2ZV91cmJzKSkKIAkJCQlhbGl2ZSsrOwogCQl9CkBAIC0xNDcsMTUgKzE0NiwyMCBAQAogfQogCiAvKiBhbGxvY2F0ZSBhIGJ1ZmZlciBpZiBub3Qgb3BlbmVkIHlldDsKLSAqIGNhbGwgdGhpcyBpbiBsaW5lNnBjbS5zdGF0ZV9jaGFuZ2UgbXV0ZXgKKyAqIGNhbGwgdGhpcyBpbiBsaW5lNnBjbS5zdGF0ZV9tdXRleAogICovCiBzdGF0aWMgaW50IGxpbmU2X2J1ZmZlcl9hY3F1aXJlKHN0cnVjdCBzbmRfbGluZTZfcGNtICpsaW5lNnBjbSwKLQkJCQlzdHJ1Y3QgbGluZTZfcGNtX3N0cmVhbSAqcHN0ciwgaW50IHR5cGUpCisJCQkJc3RydWN0IGxpbmU2X3BjbV9zdHJlYW0gKnBzdHIsIGludCBkaXJlY3Rpb24sIGludCB0eXBlKQogeworCWNvbnN0IGludCBwa3Rfc2l6ZSA9CisJCShkaXJlY3Rpb24gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgPworCQkJbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZV9vdXQgOgorCQkJbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZV9pbjsKKwogCS8qIEludm9rZWQgbXVsdGlwbGUgdGltZXMgaW4gYSByb3cgc28gYWxsb2NhdGUgb25jZSBvbmx5ICovCiAJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KHR5cGUsICZwc3RyLT5vcGVuZWQpICYmICFwc3RyLT5idWZmZXIpIHsKLQkJcHN0ci0+YnVmZmVyID0ga21hbGxvYyhMSU5FNl9JU09fQlVGRkVSUyAqIExJTkU2X0lTT19QQUNLRVRTICoKLQkJCQkgICAgICAgbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCXBzdHItPmJ1ZmZlciA9IGttYWxsb2MobGluZTZwY20tPmxpbmU2LT5pc29fYnVmZmVycyAqCisJCQkJICAgICAgIExJTkU2X0lTT19QQUNLRVRTICogcGt0X3NpemUsIEdGUF9LRVJORUwpOwogCQlpZiAoIXBzdHItPmJ1ZmZlcikKIAkJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTE2MywxMiArMTY3LDExIEBACiB9CiAKIC8qIGZyZWUgYSBidWZmZXIgaWYgYWxsIHN0cmVhbXMgYXJlIGNsb3NlZDsKLSAqIGNhbGwgdGhpcyBpbiBsaW5lNnBjbS5zdGF0ZV9jaGFuZ2UgbXV0ZXgKKyAqIGNhbGwgdGhpcyBpbiBsaW5lNnBjbS5zdGF0ZV9tdXRleAogICovCiBzdGF0aWMgdm9pZCBsaW5lNl9idWZmZXJfcmVsZWFzZShzdHJ1Y3Qgc25kX2xpbmU2X3BjbSAqbGluZTZwY20sCiAJCQkJIHN0cnVjdCBsaW5lNl9wY21fc3RyZWFtICpwc3RyLCBpbnQgdHlwZSkKIHsKLQogCWNsZWFyX2JpdCh0eXBlLCAmcHN0ci0+b3BlbmVkKTsKIAlpZiAoIXBzdHItPm9wZW5lZCkgewogCQlsaW5lNl93YWl0X2NsZWFyX2F1ZGlvX3VyYnMobGluZTZwY20sIHBzdHIpOwpAQCAtMTk1LDYgKzE5OCw3IEBACiAJCWVsc2UKIAkJCXJldCA9IGxpbmU2X3N1Ym1pdF9hdWRpb19pbl9hbGxfdXJicyhsaW5lNnBjbSk7CiAJfQorCiAJaWYgKHJldCA8IDApCiAJCWNsZWFyX2JpdCh0eXBlLCAmcHN0ci0+cnVubmluZyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHN0ci0+bG9jaywgZmxhZ3MpOwpAQCAtMjExLDcgKzIxNSw5IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBzdHItPmxvY2ssIGZsYWdzKTsKIAljbGVhcl9iaXQodHlwZSwgJnBzdHItPnJ1bm5pbmcpOwogCWlmICghcHN0ci0+cnVubmluZykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwc3RyLT5sb2NrLCBmbGFncyk7CiAJCWxpbmU2X3VubGlua19hdWRpb191cmJzKGxpbmU2cGNtLCBwc3RyKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBzdHItPmxvY2ssIGZsYWdzKTsKIAkJaWYgKGRpcmVjdGlvbiA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpIHsKIAkJCWxpbmU2cGNtLT5wcmV2X2ZidWYgPSBOVUxMOwogCQkJbGluZTZwY20tPnByZXZfZnNpemUgPSAwOwpAQCAtMjM2LDYgKzI0MiwxNCBAQAogCQlzd2l0Y2ggKGNtZCkgewogCQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgogCQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKKwkJCWlmIChzLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFICYmCisJCQkJKGxpbmU2cGNtLT5saW5lNi0+cHJvcGVydGllcy0+Y2FwYWJpbGl0aWVzICYKKwkJCQkJTElORTZfQ0FQX0lOX05FRURTX09VVCkpIHsKKwkJCQllcnIgPSBsaW5lNl9zdHJlYW1fc3RhcnQobGluZTZwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssCisJCQkJCQkgTElORTZfU1RSRUFNX0NBUFRVUkVfSEVMUEVSKTsKKwkJCQlpZiAoZXJyIDwgMCkKKwkJCQkJcmV0dXJuIGVycjsKKwkJCX0KIAkJCWVyciA9IGxpbmU2X3N0cmVhbV9zdGFydChsaW5lNnBjbSwgcy0+c3RyZWFtLAogCQkJCQkJIExJTkU2X1NUUkVBTV9QQ00pOwogCQkJaWYgKGVyciA8IDApCkBAIC0yNDQsNiArMjU4LDEyIEBACiAKIAkJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgogCQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6CisJCQlpZiAocy0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSAmJgorCQkJCShsaW5lNnBjbS0+bGluZTYtPnByb3BlcnRpZXMtPmNhcGFiaWxpdGllcyAmCisJCQkJCUxJTkU2X0NBUF9JTl9ORUVEU19PVVQpKSB7CisJCQkJbGluZTZfc3RyZWFtX3N0b3AobGluZTZwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssCisJCQkJCSAgTElORTZfU1RSRUFNX0NBUFRVUkVfSEVMUEVSKTsKKwkJCX0KIAkJCWxpbmU2X3N0cmVhbV9zdG9wKGxpbmU2cGNtLCBzLT5zdHJlYW0sCiAJCQkJCSAgTElORTZfU1RSRUFNX1BDTSk7CiAJCQlicmVhazsKQEAgLTI3NywyNyArMjk3LDMwIEBACiAJcmV0dXJuIHBzdHItPnBvc19kb25lOwogfQogCi0vKiBBY3F1aXJlIGFuZCBzdGFydCBkdXBsZXggc3RyZWFtczoKKy8qIEFjcXVpcmUgYW5kIG9wdGlvbmFsbHkgc3RhcnQgZHVwbGV4IHN0cmVhbXM6CiAgKiB0eXBlIGlzIGVpdGhlciBMSU5FNl9TVFJFQU1fSU1QVUxTRSBvciBMSU5FNl9TVFJFQU1fTU9OSVRPUgogICovCi1pbnQgbGluZTZfcGNtX2FjcXVpcmUoc3RydWN0IHNuZF9saW5lNl9wY20gKmxpbmU2cGNtLCBpbnQgdHlwZSkKK2ludCBsaW5lNl9wY21fYWNxdWlyZShzdHJ1Y3Qgc25kX2xpbmU2X3BjbSAqbGluZTZwY20sIGludCB0eXBlLCBib29sIHN0YXJ0KQogewogCXN0cnVjdCBsaW5lNl9wY21fc3RyZWFtICpwc3RyOwogCWludCByZXQgPSAwLCBkaXI7CiAKKwkvKiBUT0RPOiBXZSBzaG91bGQgYXNzZXJ0IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0svQ0FQVFVSRSA9PSAwLzEgKi8KIAltdXRleF9sb2NrKCZsaW5lNnBjbS0+c3RhdGVfbXV0ZXgpOwogCWZvciAoZGlyID0gMDsgZGlyIDwgMjsgZGlyKyspIHsKIAkJcHN0ciA9IGdldF9zdHJlYW0obGluZTZwY20sIGRpcik7Ci0JCXJldCA9IGxpbmU2X2J1ZmZlcl9hY3F1aXJlKGxpbmU2cGNtLCBwc3RyLCB0eXBlKTsKKwkJcmV0ID0gbGluZTZfYnVmZmVyX2FjcXVpcmUobGluZTZwY20sIHBzdHIsIGRpciwgdHlwZSk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBlcnJvcjsKIAkJaWYgKCFwc3RyLT5ydW5uaW5nKQogCQkJbGluZTZfd2FpdF9jbGVhcl9hdWRpb191cmJzKGxpbmU2cGNtLCBwc3RyKTsKIAl9Ci0JZm9yIChkaXIgPSAwOyBkaXIgPCAyOyBkaXIrKykgewotCQlyZXQgPSBsaW5lNl9zdHJlYW1fc3RhcnQobGluZTZwY20sIGRpciwgdHlwZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBlcnJvcjsKKwlpZiAoc3RhcnQpIHsKKwkJZm9yIChkaXIgPSAwOyBkaXIgPCAyOyBkaXIrKykgeworCQkJcmV0ID0gbGluZTZfc3RyZWFtX3N0YXJ0KGxpbmU2cGNtLCBkaXIsIHR5cGUpOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJfQogCX0KICBlcnJvcjoKIAltdXRleF91bmxvY2soJmxpbmU2cGNtLT5zdGF0ZV9tdXRleCk7CkBAIC0zMzMsNyArMzU2LDggQEAKIAlzdHJ1Y3QgbGluZTZfcGNtX3N0cmVhbSAqcHN0ciA9IGdldF9zdHJlYW0obGluZTZwY20sIHN1YnN0cmVhbS0+c3RyZWFtKTsKIAogCW11dGV4X2xvY2soJmxpbmU2cGNtLT5zdGF0ZV9tdXRleCk7Ci0JcmV0ID0gbGluZTZfYnVmZmVyX2FjcXVpcmUobGluZTZwY20sIHBzdHIsIExJTkU2X1NUUkVBTV9QQ00pOworCXJldCA9IGxpbmU2X2J1ZmZlcl9hY3F1aXJlKGxpbmU2cGNtLCBwc3RyLCBzdWJzdHJlYW0tPnN0cmVhbSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU5FNl9TVFJFQU1fUENNKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJvcjsKIApAQCAtNDMzLDI0ICs0NTcsMzAgQEAKIC8qCiAJQ2xlYW51cCB0aGUgUENNIGRldmljZS4KICovCi1zdGF0aWMgdm9pZCBjbGVhbnVwX3VyYnMoc3RydWN0IGxpbmU2X3BjbV9zdHJlYW0gKnBjbXMpCitzdGF0aWMgdm9pZCBjbGVhbnVwX3VyYnMoc3RydWN0IGxpbmU2X3BjbV9zdHJlYW0gKnBjbXMsIGludCBpc29fYnVmZmVycykKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBMSU5FNl9JU09fQlVGRkVSUzsgaSsrKSB7CisJLyogTW9zdCBsaWtlbHkgaW1wb3NzaWJsZSBpbiBjdXJyZW50IGNvZGUuLi4gKi8KKwlpZiAocGNtcy0+dXJicyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgaXNvX2J1ZmZlcnM7IGkrKykgewogCQlpZiAocGNtcy0+dXJic1tpXSkgewogCQkJdXNiX2tpbGxfdXJiKHBjbXMtPnVyYnNbaV0pOwogCQkJdXNiX2ZyZWVfdXJiKHBjbXMtPnVyYnNbaV0pOwogCQl9CiAJfQorCWtmcmVlKHBjbXMtPnVyYnMpOworCXBjbXMtPnVyYnMgPSBOVUxMOwogfQogCiBzdGF0aWMgdm9pZCBsaW5lNl9jbGVhbnVwX3BjbShzdHJ1Y3Qgc25kX3BjbSAqcGNtKQogewogCXN0cnVjdCBzbmRfbGluZTZfcGNtICpsaW5lNnBjbSA9IHNuZF9wY21fY2hpcChwY20pOwogCi0JY2xlYW51cF91cmJzKCZsaW5lNnBjbS0+b3V0KTsKLQljbGVhbnVwX3VyYnMoJmxpbmU2cGNtLT5pbik7CisJY2xlYW51cF91cmJzKCZsaW5lNnBjbS0+b3V0LCBsaW5lNnBjbS0+bGluZTYtPmlzb19idWZmZXJzKTsKKwljbGVhbnVwX3VyYnMoJmxpbmU2cGNtLT5pbiwgbGluZTZwY20tPmxpbmU2LT5pc29fYnVmZmVycyk7CiAJa2ZyZWUobGluZTZwY20pOwogfQogCkBAIC01MjIsMTIgKzU1MiwxMiBAQAogCWxpbmU2cGNtLT52b2x1bWVfbW9uaXRvciA9IDI1NTsKIAlsaW5lNnBjbS0+bGluZTYgPSBsaW5lNjsKIAotCS8qIFJlYWQgYW5kIHdyaXRlIGJ1ZmZlcnMgYXJlIHNpemVkIGlkZW50aWNhbGx5LCBzbyBjaG9vc2UgbWluaW11bSAqLwotCWxpbmU2cGNtLT5tYXhfcGFja2V0X3NpemUgPSBtaW4oCi0JCQl1c2JfbWF4cGFja2V0KGxpbmU2LT51c2JkZXYsCi0JCQkJdXNiX3Jjdmlzb2NwaXBlKGxpbmU2LT51c2JkZXYsIGVwX3JlYWQpLCAwKSwKLQkJCXVzYl9tYXhwYWNrZXQobGluZTYtPnVzYmRldiwKLQkJCQl1c2Jfc25kaXNvY3BpcGUobGluZTYtPnVzYmRldiwgZXBfd3JpdGUpLCAxKSk7CisJbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZV9pbiA9CisJCXVzYl9tYXhwYWNrZXQobGluZTYtPnVzYmRldiwKKwkJCXVzYl9yY3Zpc29jcGlwZShsaW5lNi0+dXNiZGV2LCBlcF9yZWFkKSwgMCk7CisJbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZV9vdXQgPQorCQl1c2JfbWF4cGFja2V0KGxpbmU2LT51c2JkZXYsCisJCQl1c2Jfc25kaXNvY3BpcGUobGluZTYtPnVzYmRldiwgZXBfd3JpdGUpLCAxKTsKIAogCXNwaW5fbG9ja19pbml0KCZsaW5lNnBjbS0+b3V0LmxvY2spOwogCXNwaW5fbG9ja19pbml0KCZsaW5lNnBjbS0+aW4ubG9jayk7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbGluZTYvcGNtLmggYi9zb3VuZC91c2IvbGluZTYvcGNtLmgKaW5kZXggNTA4NDEwYS4uYmIwYzljYiAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2xpbmU2L3BjbS5oCisrKyBiL3NvdW5kL3VzYi9saW5lNi9wY20uaApAQCAtMjAsOSArMjAsNiBAQAogCiAjaW5jbHVkZSAiZHJpdmVyLmgiCiAKLS8qIG51bWJlciBvZiBVUkJzICovCi0jZGVmaW5lIExJTkU2X0lTT19CVUZGRVJTCTIKLQogLyoKIAludW1iZXIgb2YgVVNCIGZyYW1lcyBwZXIgVVJCCiAJVGhlIExpbmUgNiBXaW5kb3dzIGRyaXZlciBhbHdheXMgdHJhbnNtaXRzIHR3byBmcmFtZXMgcGVyIHBhY2tldCwgYnV0CkBAIC0zMSw3ICsyOCw5IEBACiAqLwogI2RlZmluZSBMSU5FNl9JU09fUEFDS0VUUwkxCiAKLS8qIGluIGEgImZ1bGwgc3BlZWQiIGRldmljZSAoc3VjaCBhcyB0aGUgUE9EeHQgUHJvKSB0aGlzIG1lYW5zIDFtcyAqLworLyogaW4gYSAiZnVsbCBzcGVlZCIgZGV2aWNlIChzdWNoIGFzIHRoZSBQT0R4dCBQcm8pIHRoaXMgbWVhbnMgMW1zLAorICogIGZvciAiaGlnaCBzcGVlZCIgaXQncyAxLzhtcworICovCiAjZGVmaW5lIExJTkU2X0lTT19JTlRFUlZBTAkxCiAKICNkZWZpbmUgTElORTZfSU1QVUxTRV9ERUZBVUxUX1BFUklPRCAxMDAKQEAgLTc0LDYgKzczLDcgQEAKIAlMSU5FNl9TVFJFQU1fUENNLAogCUxJTkU2X1NUUkVBTV9NT05JVE9SLAogCUxJTkU2X1NUUkVBTV9JTVBVTFNFLAorCUxJTkU2X1NUUkVBTV9DQVBUVVJFX0hFTFBFUiwKIH07CiAKIC8qIG1pc2MgYml0IGZsYWdzIGZvciBQQ00gb3BlcmF0aW9uICovCkBAIC04NSwxMiArODUsMTIgQEAKIHN0cnVjdCBsaW5lNl9wY21fcHJvcGVydGllcyB7CiAJc3RydWN0IHNuZF9wY21faGFyZHdhcmUgcGxheWJhY2tfaHcsIGNhcHR1cmVfaHc7CiAJc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9yYXRkZW5zIHJhdGVzOwotCWludCBieXRlc19wZXJfZnJhbWU7CisJaW50IGJ5dGVzX3Blcl9jaGFubmVsOwogfTsKIAogc3RydWN0IGxpbmU2X3BjbV9zdHJlYW0gewogCS8qIGFsbG9jYXRlZCBVUkJzICovCi0Jc3RydWN0IHVyYiAqdXJic1tMSU5FNl9JU09fQlVGRkVSU107CisJc3RydWN0IHVyYiAqKnVyYnM7CiAKIAkvKiBUZW1wb3JhcnkgYnVmZmVyOwogCSAqIFNpbmNlIHRoZSBwYWNrZXQgc2l6ZSBpcyBub3Qga25vd24gaW4gYWR2YW5jZSwgdGhpcyBidWZmZXIgaXMKQEAgLTE1NywxMSArMTU3LDEyIEBACiAJLyogUHJldmlvdXNseSBjYXB0dXJlZCBmcmFtZSAoZm9yIHNvZnR3YXJlIG1vbml0b3JpbmcpICovCiAJdW5zaWduZWQgY2hhciAqcHJldl9mYnVmOwogCi0JLyogU2l6ZSBvZiBwcmV2aW91c2x5IGNhcHR1cmVkIGZyYW1lIChmb3Igc29mdHdhcmUgbW9uaXRvcmluZykgKi8KKwkvKiBTaXplIG9mIHByZXZpb3VzbHkgY2FwdHVyZWQgZnJhbWUgKGZvciBzb2Z0d2FyZSBtb25pdG9yaW5nL3N5bmMpICovCiAJaW50IHByZXZfZnNpemU7CiAKIAkvKiBNYXhpbXVtIHNpemUgb2YgVVNCIHBhY2tldCAqLwotCWludCBtYXhfcGFja2V0X3NpemU7CisJaW50IG1heF9wYWNrZXRfc2l6ZV9pbjsKKwlpbnQgbWF4X3BhY2tldF9zaXplX291dDsKIAogCS8qIFBDTSBwbGF5YmFjayB2b2x1bWUgKGxlZnQgYW5kIHJpZ2h0KSAqLwogCWludCB2b2x1bWVfcGxheWJhY2tbMl07CkBAIC0xOTEsNyArMTkyLDggQEAKIGV4dGVybiBpbnQgc25kX2xpbmU2X2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pOwogZXh0ZXJuIHNuZF9wY21fdWZyYW1lc190IHNuZF9saW5lNl9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKIGV4dGVybiB2b2lkIGxpbmU2X3BjbV9kaXNjb25uZWN0KHN0cnVjdCBzbmRfbGluZTZfcGNtICpsaW5lNnBjbSk7Ci1leHRlcm4gaW50IGxpbmU2X3BjbV9hY3F1aXJlKHN0cnVjdCBzbmRfbGluZTZfcGNtICpsaW5lNnBjbSwgaW50IHR5cGUpOworZXh0ZXJuIGludCBsaW5lNl9wY21fYWNxdWlyZShzdHJ1Y3Qgc25kX2xpbmU2X3BjbSAqbGluZTZwY20sIGludCB0eXBlLAorCQkJICAgICAgIGJvb2wgc3RhcnQpOwogZXh0ZXJuIHZvaWQgbGluZTZfcGNtX3JlbGVhc2Uoc3RydWN0IHNuZF9saW5lNl9wY20gKmxpbmU2cGNtLCBpbnQgdHlwZSk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2xpbmU2L3BsYXliYWNrLmMgYi9zb3VuZC91c2IvbGluZTYvcGxheWJhY2suYwppbmRleCA5N2VkNTkzLi44MTJkMTgxIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvbGluZTYvcGxheWJhY2suYworKysgYi9zb3VuZC91c2IvbGluZTYvcGxheWJhY2suYwpAQCAtMTQ2LDE4ICsxNDYsMjAgQEAKIAlpbnQgaW5kZXg7CiAJaW50IGksIHVyYl9zaXplLCB1cmJfZnJhbWVzOwogCWludCByZXQ7Ci0JY29uc3QgaW50IGJ5dGVzX3Blcl9mcmFtZSA9IGxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5ieXRlc19wZXJfZnJhbWU7CisJY29uc3QgaW50IGJ5dGVzX3Blcl9mcmFtZSA9CisJCWxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5ieXRlc19wZXJfY2hhbm5lbCAqCisJCWxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5wbGF5YmFja19ody5jaGFubmVsc19tYXg7CiAJY29uc3QgaW50IGZyYW1lX2luY3JlbWVudCA9CiAJCWxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5yYXRlcy5yYXRzWzBdLm51bV9taW47CiAJY29uc3QgaW50IGZyYW1lX2ZhY3RvciA9CiAJCWxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5yYXRlcy5yYXRzWzBdLmRlbiAqCi0JCShVU0JfSU5URVJWQUxTX1BFUl9TRUNPTkQgLyBMSU5FNl9JU09fSU5URVJWQUwpOworCQkobGluZTZwY20tPmxpbmU2LT5pbnRlcnZhbHNfcGVyX3NlY29uZCAvIExJTkU2X0lTT19JTlRFUlZBTCk7CiAJc3RydWN0IHVyYiAqdXJiX291dDsKIAotCWluZGV4ID0KLQkgICAgZmluZF9maXJzdF96ZXJvX2JpdCgmbGluZTZwY20tPm91dC5hY3RpdmVfdXJicywgTElORTZfSVNPX0JVRkZFUlMpOworCWluZGV4ID0gZmluZF9maXJzdF96ZXJvX2JpdCgmbGluZTZwY20tPm91dC5hY3RpdmVfdXJicywKKwkJCQkgICAgbGluZTZwY20tPmxpbmU2LT5pc29fYnVmZmVycyk7CiAKLQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IExJTkU2X0lTT19CVUZGRVJTKSB7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsaW5lNnBjbS0+bGluZTYtPmlzb19idWZmZXJzKSB7CiAJCWRldl9lcnIobGluZTZwY20tPmxpbmU2LT5pZmNkZXYsICJubyBmcmVlIFVSQiBmb3VuZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTE2NSw2ICsxNjcsNyBAQAogCXVyYl9vdXQgPSBsaW5lNnBjbS0+b3V0LnVyYnNbaW5kZXhdOwogCXVyYl9zaXplID0gMDsKIAorCS8qIFRPRE86IHRoaXMgbWF5IG5vdCB3b3JrIGZvciBMSU5FNl9JU09fUEFDS0VUUyAhPSAxICovCiAJZm9yIChpID0gMDsgaSA8IExJTkU2X0lTT19QQUNLRVRTOyArK2kpIHsKIAkJLyogY29tcHV0ZSBmcmFtZSBzaXplIGZvciBnaXZlbiBzYW1wbGluZyByYXRlICovCiAJCWludCBmc2l6ZSA9IDA7CkBAIC0xNzgsOSArMTgxLDExIEBACiAJCQlsaW5lNnBjbS0+b3V0LmNvdW50ICs9IGZyYW1lX2luY3JlbWVudDsKIAkJCW4gPSBsaW5lNnBjbS0+b3V0LmNvdW50IC8gZnJhbWVfZmFjdG9yOwogCQkJbGluZTZwY20tPm91dC5jb3VudCAtPSBuICogZnJhbWVfZmFjdG9yOwotCQkJZnNpemUgPSBuICogYnl0ZXNfcGVyX2ZyYW1lOworCQkJZnNpemUgPSBuOwogCQl9CiAKKwkJZnNpemUgKj0gYnl0ZXNfcGVyX2ZyYW1lOworCiAJCWZvdXQtPm9mZnNldCA9IHVyYl9zaXplOwogCQlmb3V0LT5sZW5ndGggPSBmc2l6ZTsKIAkJdXJiX3NpemUgKz0gZnNpemU7CkBAIC0xOTUsNyArMjAwLDcgQEAKIAl1cmJfZnJhbWVzID0gdXJiX3NpemUgLyBieXRlc19wZXJfZnJhbWU7CiAJdXJiX291dC0+dHJhbnNmZXJfYnVmZmVyID0KIAkgICAgbGluZTZwY20tPm91dC5idWZmZXIgKwotCSAgICBpbmRleCAqIExJTkU2X0lTT19QQUNLRVRTICogbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZTsKKwkgICAgaW5kZXggKiBMSU5FNl9JU09fUEFDS0VUUyAqIGxpbmU2cGNtLT5tYXhfcGFja2V0X3NpemVfb3V0OwogCXVyYl9vdXQtPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSB1cmJfc2l6ZTsKIAl1cmJfb3V0LT5jb250ZXh0ID0gbGluZTZwY207CiAKQEAgLTI4Niw3ICsyOTEsNyBAQAogewogCWludCByZXQgPSAwLCBpOwogCi0JZm9yIChpID0gMDsgaSA8IExJTkU2X0lTT19CVUZGRVJTOyArK2kpIHsKKwlmb3IgKGkgPSAwOyBpIDwgbGluZTZwY20tPmxpbmU2LT5pc29fYnVmZmVyczsgKytpKSB7CiAJCXJldCA9IHN1Ym1pdF9hdWRpb19vdXRfdXJiKGxpbmU2cGNtKTsKIAkJaWYgKHJldCA8IDApCiAJCQlicmVhazsKQEAgLTMwNSw2ICszMTAsOSBAQAogCXN0cnVjdCBzbmRfbGluZTZfcGNtICpsaW5lNnBjbSA9IChzdHJ1Y3Qgc25kX2xpbmU2X3BjbSAqKXVyYi0+Y29udGV4dDsKIAlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9CiAJICAgIGdldF9zdWJzdHJlYW0obGluZTZwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spOworCWNvbnN0IGludCBieXRlc19wZXJfZnJhbWUgPQorCQlsaW5lNnBjbS0+cHJvcGVydGllcy0+Ynl0ZXNfcGVyX2NoYW5uZWwgKgorCQlsaW5lNnBjbS0+cHJvcGVydGllcy0+cGxheWJhY2tfaHcuY2hhbm5lbHNfbWF4OwogCiAjaWYgVVNFX0NMRUFSX0JVRkZFUl9XT1JLQVJPVU5ECiAJbWVtc2V0KHVyYi0+dHJhbnNmZXJfYnVmZmVyLCAwLCB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOwpAQCAtMzEzLDExICszMjEsMTEgQEAKIAlsaW5lNnBjbS0+b3V0Lmxhc3RfZnJhbWUgPSB1cmItPnN0YXJ0X2ZyYW1lOwogCiAJLyogZmluZCBpbmRleCBvZiBVUkIgKi8KLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBMSU5FNl9JU09fQlVGRkVSUzsgaW5kZXgrKykKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBsaW5lNnBjbS0+bGluZTYtPmlzb19idWZmZXJzOyBpbmRleCsrKQogCQlpZiAodXJiID09IGxpbmU2cGNtLT5vdXQudXJic1tpbmRleF0pCiAJCQlicmVhazsKIAotCWlmIChpbmRleCA+PSBMSU5FNl9JU09fQlVGRkVSUykKKwlpZiAoaW5kZXggPj0gbGluZTZwY20tPmxpbmU2LT5pc29fYnVmZmVycykKIAkJcmV0dXJuOwkJLyogVVJCIGhhcyBiZWVuIHVubGlua2VkIGFzeW5jaHJvbm91c2x5ICovCiAKIAlmb3IgKGkgPSAwOyBpIDwgTElORTZfSVNPX1BBQ0tFVFM7IGkrKykKQEAgLTMyOSw3ICszMzcsNyBAQAogCQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCiAJCWxpbmU2cGNtLT5vdXQucG9zX2RvbmUgKz0KLQkJICAgIGxlbmd0aCAvIGxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5ieXRlc19wZXJfZnJhbWU7CisJCSAgICBsZW5ndGggLyBieXRlc19wZXJfZnJhbWU7CiAKIAkJaWYgKGxpbmU2cGNtLT5vdXQucG9zX2RvbmUgPj0gcnVudGltZS0+YnVmZmVyX3NpemUpCiAJCQlsaW5lNnBjbS0+b3V0LnBvc19kb25lIC09IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOwpAQCAtNDAxLDggKzQwOSwxMyBAQAogCXN0cnVjdCB1c2JfbGluZTYgKmxpbmU2ID0gbGluZTZwY20tPmxpbmU2OwogCWludCBpOwogCisJbGluZTZwY20tPm91dC51cmJzID0ga3phbGxvYygKKwkJc2l6ZW9mKHN0cnVjdCB1cmIgKikgKiBsaW5lNi0+aXNvX2J1ZmZlcnMsIEdGUF9LRVJORUwpOworCWlmIChsaW5lNnBjbS0+b3V0LnVyYnMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAkvKiBjcmVhdGUgYXVkaW8gVVJCcyBhbmQgZmlsbCBpbiBjb25zdGFudCB2YWx1ZXM6ICovCi0JZm9yIChpID0gMDsgaSA8IExJTkU2X0lTT19CVUZGRVJTOyArK2kpIHsKKwlmb3IgKGkgPSAwOyBpIDwgbGluZTYtPmlzb19idWZmZXJzOyArK2kpIHsKIAkJc3RydWN0IHVyYiAqdXJiOwogCiAJCS8qIFVSQiBmb3IgYXVkaW8gb3V0OiAqLwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2xpbmU2L3BvZC5jIGIvc291bmQvdXNiL2xpbmU2L3BvZC5jCmluZGV4IGRhZjgxZDEuLjE3YWE2MTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9saW5lNi9wb2QuYworKysgYi9zb3VuZC91c2IvbGluZTYvcG9kLmMKQEAgLTgzLDcgKzgzLDYgQEAKIH07CiAKICNkZWZpbmUgUE9EX1NZU0VYX0NPREUgMwotI2RlZmluZSBQT0RfQllURVNfUEVSX0ZSQU1FIDYJLyogMjRiaXQgYXVkaW8gKHN0ZXJlbykgKi8KIAogLyogKklOREVOVC1PRkYqICovCiAKQEAgLTE2Nyw3ICsxNjYsNyBAQAogCS5yYXRlcyA9IHsKIAkJCSAgICAubnJhdHMgPSAxLAogCQkJICAgIC5yYXRzID0gJnBvZF9yYXRkZW59LAotCS5ieXRlc19wZXJfZnJhbWUgPSBQT0RfQllURVNfUEVSX0ZSQU1FCisJLmJ5dGVzX3Blcl9jaGFubmVsID0gMyAvKiBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgKi8KIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyIHBvZF92ZXJzaW9uX2hlYWRlcltdID0gewpAQCAtMjQ0LDggKzI0Myw4IEBACiBzdGF0aWMgc3NpemVfdCBzZXJpYWxfbnVtYmVyX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwotCXN0cnVjdCB1c2JfbGluZTZfcG9kICpwb2QgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gZGV2X3RvX3NuZF9jYXJkKGRldik7CisJc3RydWN0IHVzYl9saW5lNl9wb2QgKnBvZCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBwb2QtPnNlcmlhbF9udW1iZXIpOwogfQpAQCAtMjU2LDggKzI1NSw4IEBACiBzdGF0aWMgc3NpemVfdCBmaXJtd2FyZV92ZXJzaW9uX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwotCXN0cnVjdCB1c2JfbGluZTZfcG9kICpwb2QgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gZGV2X3RvX3NuZF9jYXJkKGRldik7CisJc3RydWN0IHVzYl9saW5lNl9wb2QgKnBvZCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkLiUwMmRcbiIsIHBvZC0+ZmlybXdhcmVfdmVyc2lvbiAvIDEwMCwKIAkJICAgICAgIHBvZC0+ZmlybXdhcmVfdmVyc2lvbiAlIDEwMCk7CkBAIC0yNjksOCArMjY4LDggQEAKIHN0YXRpYyBzc2l6ZV90IGRldmljZV9pZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKLQlzdHJ1Y3QgdXNiX2xpbmU2X3BvZCAqcG9kID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRldl90b19zbmRfY2FyZChkZXYpOworCXN0cnVjdCB1c2JfbGluZTZfcG9kICpwb2QgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcG9kLT5kZXZpY2VfaWQpOwogfQpAQCAtNDc2LDYgKzQ3NSw3IEBACiAJCS5pZCA9ICJCYXNzUE9EeHQiLAogCQkubmFtZSA9ICJCYXNzUE9EeHQiLAogCQkuY2FwYWJpbGl0aWVzCT0gTElORTZfQ0FQX0NPTlRST0wKKwkJCQl8IExJTkU2X0NBUF9DT05UUk9MX01JREkKIAkJCQl8IExJTkU2X0NBUF9QQ00KIAkJCQl8IExJTkU2X0NBUF9IV01PTiwKIAkJLmFsdHNldHRpbmcgPSA1LApAQCAtNDg4LDYgKzQ4OCw3IEBACiAJCS5pZCA9ICJCYXNzUE9EeHRMaXZlIiwKIAkJLm5hbWUgPSAiQmFzc1BPRHh0IExpdmUiLAogCQkuY2FwYWJpbGl0aWVzCT0gTElORTZfQ0FQX0NPTlRST0wKKwkJCQl8IExJTkU2X0NBUF9DT05UUk9MX01JREkKIAkJCQl8IExJTkU2X0NBUF9QQ00KIAkJCQl8IExJTkU2X0NBUF9IV01PTiwKIAkJLmFsdHNldHRpbmcgPSAxLApAQCAtNTAwLDYgKzUwMSw3IEBACiAJCS5pZCA9ICJCYXNzUE9EeHRQcm8iLAogCQkubmFtZSA9ICJCYXNzUE9EeHQgUHJvIiwKIAkJLmNhcGFiaWxpdGllcwk9IExJTkU2X0NBUF9DT05UUk9MCisJCQkJfCBMSU5FNl9DQVBfQ09OVFJPTF9NSURJCiAJCQkJfCBMSU5FNl9DQVBfUENNCiAJCQkJfCBMSU5FNl9DQVBfSFdNT04sCiAJCS5hbHRzZXR0aW5nID0gNSwKQEAgLTUxMSw3ICs1MTMsOCBAQAogCVtMSU5FNl9QT0NLRVRQT0RdID0gewogCQkuaWQgPSAiUG9ja2V0UE9EIiwKIAkJLm5hbWUgPSAiUG9ja2V0IFBPRCIsCi0JCS5jYXBhYmlsaXRpZXMJPSBMSU5FNl9DQVBfQ09OVFJPTCwKKwkJLmNhcGFiaWxpdGllcwk9IExJTkU2X0NBUF9DT05UUk9MCisJCQkJfCBMSU5FNl9DQVBfQ09OVFJPTF9NSURJLAogCQkuYWx0c2V0dGluZyA9IDAsCiAJCS5lcF9jdHJsX3IgPSAweDgyLAogCQkuZXBfY3RybF93ID0gMHgwMiwKQEAgLTUyMSw2ICs1MjQsNyBAQAogCQkuaWQgPSAiUE9EeHQiLAogCQkubmFtZSA9ICJQT0R4dCIsCiAJCS5jYXBhYmlsaXRpZXMJPSBMSU5FNl9DQVBfQ09OVFJPTAorCQkJCXwgTElORTZfQ0FQX0NPTlRST0xfTUlESQogCQkJCXwgTElORTZfQ0FQX1BDTQogCQkJCXwgTElORTZfQ0FQX0hXTU9OLAogCQkuYWx0c2V0dGluZyA9IDUsCkBAIC01MzMsNiArNTM3LDcgQEAKIAkJLmlkID0gIlBPRHh0TGl2ZSIsCiAJCS5uYW1lID0gIlBPRHh0IExpdmUiLAogCQkuY2FwYWJpbGl0aWVzCT0gTElORTZfQ0FQX0NPTlRST0wKKwkJCQl8IExJTkU2X0NBUF9DT05UUk9MX01JREkKIAkJCQl8IExJTkU2X0NBUF9QQ00KIAkJCQl8IExJTkU2X0NBUF9IV01PTiwKIAkJLmFsdHNldHRpbmcgPSAxLApAQCAtNTQ1LDYgKzU1MCw3IEBACiAJCS5pZCA9ICJQT0R4dFBybyIsCiAJCS5uYW1lID0gIlBPRHh0IFBybyIsCiAJCS5jYXBhYmlsaXRpZXMJPSBMSU5FNl9DQVBfQ09OVFJPTAorCQkJCXwgTElORTZfQ0FQX0NPTlRST0xfTUlESQogCQkJCXwgTElORTZfQ0FQX1BDTQogCQkJCXwgTElORTZfQ0FQX0hXTU9OLAogCQkuYWx0c2V0dGluZyA9IDUsCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbGluZTYvcG9kaGQuYyBiL3NvdW5kL3VzYi9saW5lNi9wb2RoZC5jCmluZGV4IDYzZGNhZWYuLjkzNTJhNDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9saW5lNi9wb2RoZC5jCisrKyBiL3NvdW5kL3VzYi9saW5lNi9wb2RoZC5jCkBAIC0yLDYgKzIsNyBAQAogICogTGluZSA2IFBvZCBIRAogICoKICAqIENvcHlyaWdodCAoQykgMjAxMSBTdGVmYW4gSGFqbm9jemkgPHN0ZWZhbmhhQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxNSBBbmRyZWogS3J1dGFrIDxkZXZAYW5kcmVlLnNrPgogICoKICAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCkBAIC0xOCwxNCArMTksNDYgQEAKICNpbmNsdWRlICJkcml2ZXIuaCIKICNpbmNsdWRlICJwY20uaCIKIAorI2RlZmluZSBQT0RIRF9TVEFSVFVQX0RFTEFZIDUwMAorCisvKgorICogU3RhZ2VzIG9mIFBPRCBzdGFydHVwIHByb2NlZHVyZQorICovCitlbnVtIHsKKwlQT0RIRF9TVEFSVFVQX0lOSVQgPSAxLAorCVBPREhEX1NUQVJUVVBfU0NIRURVTEVfV09SS1FVRVVFLAorCVBPREhEX1NUQVJUVVBfU0VUVVAsCisJUE9ESERfU1RBUlRVUF9MQVNUID0gUE9ESERfU1RBUlRVUF9TRVRVUCAtIDEKK307CisKIGVudW0gewogCUxJTkU2X1BPREhEMzAwLAogCUxJTkU2X1BPREhENDAwLAogCUxJTkU2X1BPREhENTAwXzAsCiAJTElORTZfUE9ESEQ1MDBfMSwKKwlMSU5FNl9QT0RYMywKKwlMSU5FNl9QT0RYM0xJVkUKIH07CiAKLSNkZWZpbmUgUE9ESERfQllURVNfUEVSX0ZSQU1FIDYJLyogMjRiaXQgYXVkaW8gKHN0ZXJlbykgKi8KK3N0cnVjdCB1c2JfbGluZTZfcG9kaGQgeworCS8qIEdlbmVyaWMgTGluZSA2IFVTQiBkYXRhICovCisJc3RydWN0IHVzYl9saW5lNiBsaW5lNjsKKworCS8qIFRpbWVyIGZvciBkZXZpY2UgaW5pdGlhbGl6YXRpb24gKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBzdGFydHVwX3RpbWVyOworCisJLyogV29yayBoYW5kbGVyIGZvciBkZXZpY2UgaW5pdGlhbGl6YXRpb24gKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc3RhcnR1cF93b3JrOworCisJLyogQ3VycmVudCBwcm9ncmVzcyBpbiBzdGFydHVwIHByb2NlZHVyZSAqLworCWludCBzdGFydHVwX3Byb2dyZXNzOworCisJLyogU2VyaWFsIG51bWJlciBvZiBkZXZpY2UgKi8KKwl1MzIgc2VyaWFsX251bWJlcjsKKworCS8qIEZpcm13YXJlIHZlcnNpb24gKi8KKwlpbnQgZmlybXdhcmVfdmVyc2lvbjsKK307CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3JhdGRlbiBwb2RoZF9yYXRkZW4gPSB7CiAJLm51bV9taW4gPSA0ODAwMCwKQEAgLTczLDkgKzEwNiwxOTYgQEAKIAkucmF0ZXMgPSB7CiAJCQkgICAgLm5yYXRzID0gMSwKIAkJCSAgICAucmF0cyA9ICZwb2RoZF9yYXRkZW59LAotCS5ieXRlc19wZXJfZnJhbWUgPSBQT0RIRF9CWVRFU19QRVJfRlJBTUUKKwkuYnl0ZXNfcGVyX2NoYW5uZWwgPSAzIC8qIFNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSAqLwogfTsKIAorc3RhdGljIHN0cnVjdCBsaW5lNl9wY21fcHJvcGVydGllcyBwb2R4M19wY21fcHJvcGVydGllcyA9IHsKKwkucGxheWJhY2tfaHcgPSB7CisJCQkJICAuaW5mbyA9IChTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJCQkJICAgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCQkgICBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJCSAgIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJCQkgICBTTkRSVl9QQ01fSU5GT19QQVVTRSB8CisJCQkJCSAgIFNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQpLAorCQkJCSAgLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUsCisJCQkJICAucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJCQkgIC5yYXRlX21pbiA9IDQ4MDAwLAorCQkJCSAgLnJhdGVfbWF4ID0gNDgwMDAsCisJCQkJICAuY2hhbm5lbHNfbWluID0gMiwKKwkJCQkgIC5jaGFubmVsc19tYXggPSAyLAorCQkJCSAgLmJ1ZmZlcl9ieXRlc19tYXggPSA2MDAwMCwKKwkJCQkgIC5wZXJpb2RfYnl0ZXNfbWluID0gNjQsCisJCQkJICAucGVyaW9kX2J5dGVzX21heCA9IDgxOTIsCisJCQkJICAucGVyaW9kc19taW4gPSAxLAorCQkJCSAgLnBlcmlvZHNfbWF4ID0gMTAyNH0sCisJLmNhcHR1cmVfaHcgPSB7CisJCQkJIC5pbmZvID0gKFNORFJWX1BDTV9JTkZPX01NQVAgfAorCQkJCQkgIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkJICBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJCSAgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJCSAgU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCksCisJCQkJIC5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFLAorCQkJCSAucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJCQkgLnJhdGVfbWluID0gNDgwMDAsCisJCQkJIC5yYXRlX21heCA9IDQ4MDAwLAorCQkJCSAvKiAxKzI6IE1haW4gc2lnbmFsIChvdXQpLCAzKzQ6IFRvbmUgMSwKKwkJCQkgICogNSs2OiBUb25lIDIsIDcrODogcmF3CisJCQkJICAqLworCQkJCSAuY2hhbm5lbHNfbWluID0gOCwKKwkJCQkgLmNoYW5uZWxzX21heCA9IDgsCisJCQkJIC5idWZmZXJfYnl0ZXNfbWF4ID0gNjAwMDAsCisJCQkJIC5wZXJpb2RfYnl0ZXNfbWluID0gNjQsCisJCQkJIC5wZXJpb2RfYnl0ZXNfbWF4ID0gODE5MiwKKwkJCQkgLnBlcmlvZHNfbWluID0gMSwKKwkJCQkgLnBlcmlvZHNfbWF4ID0gMTAyNH0sCisJLnJhdGVzID0geworCQkJICAgIC5ucmF0cyA9IDEsCisJCQkgICAgLnJhdHMgPSAmcG9kaGRfcmF0ZGVufSwKKwkuYnl0ZXNfcGVyX2NoYW5uZWwgPSAzIC8qIFNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSAqLworfTsKKworc3RhdGljIHZvaWQgcG9kaGRfc3RhcnR1cF9zdGFydF93b3JrcXVldWUodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHBvZGhkX3N0YXJ0dXBfd29ya3F1ZXVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgaW50IHBvZGhkX3N0YXJ0dXBfZmluYWxpemUoc3RydWN0IHVzYl9saW5lNl9wb2RoZCAqcG9kKTsKKworc3RhdGljIHNzaXplX3Qgc2VyaWFsX251bWJlcl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gZGV2X3RvX3NuZF9jYXJkKGRldik7CisJc3RydWN0IHVzYl9saW5lNl9wb2RoZCAqcG9kID0gY2FyZC0+cHJpdmF0ZV9kYXRhOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHBvZC0+c2VyaWFsX251bWJlcik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZpcm13YXJlX3ZlcnNpb25fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRldl90b19zbmRfY2FyZChkZXYpOworCXN0cnVjdCB1c2JfbGluZTZfcG9kaGQgKnBvZCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiUwNnhcbiIsIHBvZC0+ZmlybXdhcmVfdmVyc2lvbik7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhmaXJtd2FyZV92ZXJzaW9uKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhzZXJpYWxfbnVtYmVyKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnBvZGhkX2Rldl9hdHRyc1tdID0geworCSZkZXZfYXR0cl9maXJtd2FyZV92ZXJzaW9uLmF0dHIsCisJJmRldl9hdHRyX3NlcmlhbF9udW1iZXIuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBwb2RoZF9kZXZfYXR0cl9ncm91cCA9IHsKKwkubmFtZSA9ICJwb2RoZCIsCisJLmF0dHJzID0gcG9kaGRfZGV2X2F0dHJzLAorfTsKKworLyoKKyAqIFBPRCBYMyBzdGFydHVwIHByb2NlZHVyZS4KKyAqCisgKiBNYXkgYmUgY29tcGF0aWJsZSB3aXRoIG90aGVyIFBPRCBIRCdzLCBzaW5jZSBpdCdzIGFsc28gc2ltaWxhciB0byB0aGUKKyAqIHByZXZpb3VzIFBPRCBzZXR1cC4gSW4gYW55IGNhc2UsIGl0IGRvZXNuJ3Qgc2VlbSB0byBiZSByZXF1aXJlZCBmb3IgdGhlCisgKiBhdWRpbyBub3IgYnVsayBpbnRlcmZhY2VzIHRvIHdvcmsuCisgKi8KKworc3RhdGljIHZvaWQgcG9kaGRfc3RhcnR1cChzdHJ1Y3QgdXNiX2xpbmU2X3BvZGhkICpwb2QpCit7CisJQ0hFQ0tfU1RBUlRVUF9QUk9HUkVTUyhwb2QtPnN0YXJ0dXBfcHJvZ3Jlc3MsIFBPREhEX1NUQVJUVVBfSU5JVCk7CisKKwkvKiBkZWxheSBzdGFydHVwIHByb2NlZHVyZTogKi8KKwlsaW5lNl9zdGFydF90aW1lcigmcG9kLT5zdGFydHVwX3RpbWVyLCBQT0RIRF9TVEFSVFVQX0RFTEFZLAorCQlwb2RoZF9zdGFydHVwX3N0YXJ0X3dvcmtxdWV1ZSwgKHVuc2lnbmVkIGxvbmcpcG9kKTsKK30KKworc3RhdGljIHZvaWQgcG9kaGRfc3RhcnR1cF9zdGFydF93b3JrcXVldWUodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCB1c2JfbGluZTZfcG9kaGQgKnBvZCA9IChzdHJ1Y3QgdXNiX2xpbmU2X3BvZGhkICopZGF0YTsKKworCUNIRUNLX1NUQVJUVVBfUFJPR1JFU1MocG9kLT5zdGFydHVwX3Byb2dyZXNzLAorCQlQT0RIRF9TVEFSVFVQX1NDSEVEVUxFX1dPUktRVUVVRSk7CisKKwkvKiBzY2hlZHVsZSB3b3JrIGZvciBnbG9iYWwgd29yayBxdWV1ZTogKi8KKwlzY2hlZHVsZV93b3JrKCZwb2QtPnN0YXJ0dXBfd29yayk7Cit9CisKK3N0YXRpYyBpbnQgcG9kaGRfZGV2X3N0YXJ0KHN0cnVjdCB1c2JfbGluZTZfcG9kaGQgKnBvZCkKK3sKKwlpbnQgcmV0OworCXU4IGluaXRfYnl0ZXNbOF07CisJaW50IGk7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldiA9IHBvZC0+bGluZTYudXNiZGV2OworCisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVzYmRldiwgdXNiX3NuZGN0cmxwaXBlKHVzYmRldiwgMCksCisJCQkJCTB4NjcsIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UgfCBVU0JfRElSX09VVCwKKwkJCQkJMHgxMSwgMCwKKwkJCQkJTlVMTCwgMCwgTElORTZfVElNRU9VVCAqIEhaKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHBvZC0+bGluZTYuaWZjZGV2LCAicmVhZCByZXF1ZXN0IGZhaWxlZCAoZXJyb3IgJWQpXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIE5PVEU6IGxvb2tzIGxpa2Ugc29tZSBraW5kIG9mIHBpbmcgbWVzc2FnZSAqLworCXJldCA9IHVzYl9jb250cm9sX21zZyh1c2JkZXYsIHVzYl9yY3ZjdHJscGlwZSh1c2JkZXYsIDApLCAweDY3LAorCQkJCQlVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFIHwgVVNCX0RJUl9JTiwKKwkJCQkJMHgxMSwgMHgwLAorCQkJCQkmaW5pdF9ieXRlcywgMywgTElORTZfVElNRU9VVCAqIEhaKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHBvZC0+bGluZTYuaWZjZGV2LAorCQkJInJlY2VpdmUgbGVuZ3RoIGZhaWxlZCAoZXJyb3IgJWQpXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXBvZC0+ZmlybXdhcmVfdmVyc2lvbiA9CisJCShpbml0X2J5dGVzWzBdIDw8IDE2KSB8IChpbml0X2J5dGVzWzFdIDw8IDgpIHwgKGluaXRfYnl0ZXNbMl0gPDwgMCk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IDE2OyBpKyspIHsKKwkJcmV0ID0gbGluZTZfcmVhZF9kYXRhKCZwb2QtPmxpbmU2LCAweGYwMDAgKyAweDA4ICogaSwgaW5pdF9ieXRlcywgOCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSB1c2JfY29udHJvbF9tc2codXNiZGV2LCB1c2Jfc25kY3RybHBpcGUodXNiZGV2LCAwKSwKKwkJCQkJVVNCX1JFUV9TRVRfRkVBVFVSRSwKKwkJCQkJVVNCX1RZUEVfU1RBTkRBUkQgfCBVU0JfUkVDSVBfREVWSUNFIHwgVVNCX0RJUl9PVVQsCisJCQkJCTEsIDAsCisJCQkJCU5VTEwsIDAsIExJTkU2X1RJTUVPVVQgKiBIWik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcG9kaGRfc3RhcnR1cF93b3JrcXVldWUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB1c2JfbGluZTZfcG9kaGQgKnBvZCA9CisJICAgIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdXNiX2xpbmU2X3BvZGhkLCBzdGFydHVwX3dvcmspOworCisJQ0hFQ0tfU1RBUlRVUF9QUk9HUkVTUyhwb2QtPnN0YXJ0dXBfcHJvZ3Jlc3MsIFBPREhEX1NUQVJUVVBfU0VUVVApOworCisJcG9kaGRfZGV2X3N0YXJ0KHBvZCk7CisJbGluZTZfcmVhZF9zZXJpYWxfbnVtYmVyKCZwb2QtPmxpbmU2LCAmcG9kLT5zZXJpYWxfbnVtYmVyKTsKKworCXBvZGhkX3N0YXJ0dXBfZmluYWxpemUocG9kKTsKK30KKworc3RhdGljIGludCBwb2RoZF9zdGFydHVwX2ZpbmFsaXplKHN0cnVjdCB1c2JfbGluZTZfcG9kaGQgKnBvZCkKK3sKKwlzdHJ1Y3QgdXNiX2xpbmU2ICpsaW5lNiA9ICZwb2QtPmxpbmU2OworCisJLyogQUxTQSBhdWRpbyBpbnRlcmZhY2U6ICovCisJcmV0dXJuIHNuZF9jYXJkX3JlZ2lzdGVyKGxpbmU2LT5jYXJkKTsKK30KKworc3RhdGljIHZvaWQgcG9kaGRfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2xpbmU2ICpsaW5lNikKK3sKKwlzdHJ1Y3QgdXNiX2xpbmU2X3BvZGhkICpwb2QgPSAoc3RydWN0IHVzYl9saW5lNl9wb2RoZCAqKWxpbmU2OworCisJaWYgKHBvZC0+bGluZTYucHJvcGVydGllcy0+Y2FwYWJpbGl0aWVzICYgTElORTZfQ0FQX0NPTlRST0wpIHsKKwkJZGVsX3RpbWVyX3N5bmMoJnBvZC0+c3RhcnR1cF90aW1lcik7CisJCWNhbmNlbF93b3JrX3N5bmMoJnBvZC0+c3RhcnR1cF93b3JrKTsKKwl9Cit9CisKIC8qCiAJVHJ5IHRvIGluaXQgUE9EIEhEIGRldmljZS4KICovCkBAIC04MywxOSArMzAzLDM2IEBACiAJCSAgICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKIAlpbnQgZXJyOworCXN0cnVjdCB1c2JfbGluZTZfcG9kaGQgKnBvZCA9IChzdHJ1Y3QgdXNiX2xpbmU2X3BvZGhkICopIGxpbmU2OwogCi0JLyogaW5pdGlhbGl6ZSBNSURJIHN1YnN5c3RlbTogKi8KLQllcnIgPSBsaW5lNl9pbml0X21pZGkobGluZTYpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOworCWxpbmU2LT5kaXNjb25uZWN0ID0gcG9kaGRfZGlzY29ubmVjdDsKIAotCS8qIGluaXRpYWxpemUgUENNIHN1YnN5c3RlbTogKi8KLQllcnIgPSBsaW5lNl9pbml0X3BjbShsaW5lNiwgJnBvZGhkX3BjbV9wcm9wZXJ0aWVzKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKKwlpZiAocG9kLT5saW5lNi5wcm9wZXJ0aWVzLT5jYXBhYmlsaXRpZXMgJiBMSU5FNl9DQVBfQ09OVFJPTCkgeworCQkvKiBjcmVhdGUgc3lzZnMgZW50cmllczogKi8KKwkJZXJyID0gc25kX2NhcmRfYWRkX2Rldl9hdHRyKGxpbmU2LT5jYXJkLCAmcG9kaGRfZGV2X2F0dHJfZ3JvdXApOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQogCi0JLyogcmVnaXN0ZXIgVVNCIGF1ZGlvIHN5c3RlbTogKi8KLQlyZXR1cm4gc25kX2NhcmRfcmVnaXN0ZXIobGluZTYtPmNhcmQpOworCWlmIChwb2QtPmxpbmU2LnByb3BlcnRpZXMtPmNhcGFiaWxpdGllcyAmIExJTkU2X0NBUF9QQ00pIHsKKwkJLyogaW5pdGlhbGl6ZSBQQ00gc3Vic3lzdGVtOiAqLworCQllcnIgPSBsaW5lNl9pbml0X3BjbShsaW5lNiwKKwkJCShpZC0+ZHJpdmVyX2luZm8gPT0gTElORTZfUE9EWDMpID8gJnBvZHgzX3BjbV9wcm9wZXJ0aWVzIDoKKwkJCSZwb2RoZF9wY21fcHJvcGVydGllcyk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoIShwb2QtPmxpbmU2LnByb3BlcnRpZXMtPmNhcGFiaWxpdGllcyAmIExJTkU2X0NBUF9DT05UUk9MKSkgeworCQkvKiByZWdpc3RlciBVU0IgYXVkaW8gc3lzdGVtIGRpcmVjdGx5ICovCisJCXJldHVybiBwb2RoZF9zdGFydHVwX2ZpbmFsaXplKHBvZCk7CisJfQorCisJLyogaW5pdCBkZXZpY2UgYW5kIGRlbGF5IHJlZ2lzdGVyaW5nICovCisJaW5pdF90aW1lcigmcG9kLT5zdGFydHVwX3RpbWVyKTsKKwlJTklUX1dPUksoJnBvZC0+c3RhcnR1cF93b3JrLCBwb2RoZF9zdGFydHVwX3dvcmtxdWV1ZSk7CisJcG9kaGRfc3RhcnR1cChwb2QpOworCXJldHVybiAwOwogfQogCiAjZGVmaW5lIExJTkU2X0RFVklDRShwcm9kKSBVU0JfREVWSUNFKDB4MGU0MSwgcHJvZCkKQEAgLTEwMywxMCArMzQwLDEzIEBACiAKIC8qIHRhYmxlIG9mIGRldmljZXMgdGhhdCB3b3JrIHdpdGggdGhpcyBkcml2ZXIgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCBwb2RoZF9pZF90YWJsZVtdID0geworCS8qIFRPRE86IG5vIG5lZWQgdG8gYWxsb2MgZGF0YSBpbnRlcmZhY2VzIHdoZW4gb25seSBhdWRpbyBpcyB1c2VkICovCiAJeyBMSU5FNl9ERVZJQ0UoMHg1MDU3KSwgICAgLmRyaXZlcl9pbmZvID0gTElORTZfUE9ESEQzMDAgfSwKIAl7IExJTkU2X0RFVklDRSgweDUwNTgpLCAgICAuZHJpdmVyX2luZm8gPSBMSU5FNl9QT0RIRDQwMCB9LAogCXsgTElORTZfSUZfTlVNKDB4NDE0RCwgMCksIC5kcml2ZXJfaW5mbyA9IExJTkU2X1BPREhENTAwXzAgfSwKIAl7IExJTkU2X0lGX05VTSgweDQxNEQsIDEpLCAuZHJpdmVyX2luZm8gPSBMSU5FNl9QT0RIRDUwMF8xIH0sCisJeyBMSU5FNl9JRl9OVU0oMHg0MTRBLCAwKSwgLmRyaXZlcl9pbmZvID0gTElORTZfUE9EWDMgfSwKKwl7IExJTkU2X0lGX05VTSgweDQxNEIsIDApLCAuZHJpdmVyX2luZm8gPSBMSU5FNl9QT0RYM0xJVkUgfSwKIAl7fQogfTsKIApAQCAtMTE2LDggKzM1Niw3IEBACiAJW0xJTkU2X1BPREhEMzAwXSA9IHsKIAkJLmlkID0gIlBPREhEMzAwIiwKIAkJLm5hbWUgPSAiUE9EIEhEMzAwIiwKLQkJLmNhcGFiaWxpdGllcwk9IExJTkU2X0NBUF9DT05UUk9MCi0JCQkJfCBMSU5FNl9DQVBfUENNCisJCS5jYXBhYmlsaXRpZXMJPSBMSU5FNl9DQVBfUENNCiAJCQkJfCBMSU5FNl9DQVBfSFdNT04sCiAJCS5hbHRzZXR0aW5nID0gNSwKIAkJLmVwX2N0cmxfciA9IDB4ODQsCkBAIC0xMjgsOCArMzY3LDcgQEAKIAlbTElORTZfUE9ESEQ0MDBdID0gewogCQkuaWQgPSAiUE9ESEQ0MDAiLAogCQkubmFtZSA9ICJQT0QgSEQ0MDAiLAotCQkuY2FwYWJpbGl0aWVzCT0gTElORTZfQ0FQX0NPTlRST0wKLQkJCQl8IExJTkU2X0NBUF9QQ00KKwkJLmNhcGFiaWxpdGllcwk9IExJTkU2X0NBUF9QQ00KIAkJCQl8IExJTkU2X0NBUF9IV01PTiwKIAkJLmFsdHNldHRpbmcgPSA1LAogCQkuZXBfY3RybF9yID0gMHg4NCwKQEAgLTE0MCw4ICszNzgsNyBAQAogCVtMSU5FNl9QT0RIRDUwMF8wXSA9IHsKIAkJLmlkID0gIlBPREhENTAwIiwKIAkJLm5hbWUgPSAiUE9EIEhENTAwIiwKLQkJLmNhcGFiaWxpdGllcwk9IExJTkU2X0NBUF9DT05UUk9MCi0JCQkJfCBMSU5FNl9DQVBfUENNCisJCS5jYXBhYmlsaXRpZXMJPSBMSU5FNl9DQVBfUENNCiAJCQkJfCBMSU5FNl9DQVBfSFdNT04sCiAJCS5hbHRzZXR0aW5nID0gMSwKIAkJLmVwX2N0cmxfciA9IDB4ODEsCkBAIC0xNTIsOCArMzg5LDcgQEAKIAlbTElORTZfUE9ESEQ1MDBfMV0gPSB7CiAJCS5pZCA9ICJQT0RIRDUwMCIsCiAJCS5uYW1lID0gIlBPRCBIRDUwMCIsCi0JCS5jYXBhYmlsaXRpZXMJPSBMSU5FNl9DQVBfQ09OVFJPTAotCQkJCXwgTElORTZfQ0FQX1BDTQorCQkuY2FwYWJpbGl0aWVzCT0gTElORTZfQ0FQX1BDTQogCQkJCXwgTElORTZfQ0FQX0hXTU9OLAogCQkuYWx0c2V0dGluZyA9IDEsCiAJCS5lcF9jdHJsX3IgPSAweDgxLApAQCAtMTYxLDYgKzM5NywyOCBAQAogCQkuZXBfYXVkaW9fciA9IDB4ODYsCiAJCS5lcF9hdWRpb193ID0gMHgwMiwKIAl9LAorCVtMSU5FNl9QT0RYM10gPSB7CisJCS5pZCA9ICJQT0RYMyIsCisJCS5uYW1lID0gIlBPRCBYMyIsCisJCS5jYXBhYmlsaXRpZXMJPSBMSU5FNl9DQVBfQ09OVFJPTAorCQkJCXwgTElORTZfQ0FQX1BDTSB8IExJTkU2X0NBUF9IV01PTiB8IExJTkU2X0NBUF9JTl9ORUVEU19PVVQsCisJCS5hbHRzZXR0aW5nID0gMSwKKwkJLmVwX2N0cmxfciA9IDB4ODEsCisJCS5lcF9jdHJsX3cgPSAweDAxLAorCQkuZXBfYXVkaW9fciA9IDB4ODYsCisJCS5lcF9hdWRpb193ID0gMHgwMiwKKwl9LAorCVtMSU5FNl9QT0RYM0xJVkVdID0geworCQkuaWQgPSAiUE9EWDNMSVZFIiwKKwkJLm5hbWUgPSAiUE9EIFgzIExJVkUiLAorCQkuY2FwYWJpbGl0aWVzCT0gTElORTZfQ0FQX0NPTlRST0wKKwkJCQl8IExJTkU2X0NBUF9QQ00gfCBMSU5FNl9DQVBfSFdNT04gfCBMSU5FNl9DQVBfSU5fTkVFRFNfT1VULAorCQkuYWx0c2V0dGluZyA9IDEsCisJCS5lcF9jdHJsX3IgPSAweDgxLAorCQkuZXBfY3RybF93ID0gMHgwMSwKKwkJLmVwX2F1ZGlvX3IgPSAweDg2LAorCQkuZXBfYXVkaW9fdyA9IDB4MDIsCisJfSwKIH07CiAKIC8qCkBAIC0xNzEsNyArNDI5LDcgQEAKIHsKIAlyZXR1cm4gbGluZTZfcHJvYmUoaW50ZXJmYWNlLCBpZCwgIkxpbmU2LVBPREhEIiwKIAkJCSAgICZwb2RoZF9wcm9wZXJ0aWVzX3RhYmxlW2lkLT5kcml2ZXJfaW5mb10sCi0JCQkgICBwb2RoZF9pbml0LCBzaXplb2Yoc3RydWN0IHVzYl9saW5lNikpOworCQkJICAgcG9kaGRfaW5pdCwgc2l6ZW9mKHN0cnVjdCB1c2JfbGluZTZfcG9kaGQpKTsKIH0KIAogc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHBvZGhkX2RyaXZlciA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9saW5lNi90b25lcG9ydC5jIGIvc291bmQvdXNiL2xpbmU2L3RvbmVwb3J0LmMKaW5kZXggNmQ0YzUwYy4uOGUyMmY0MyAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2xpbmU2L3RvbmVwb3J0LmMKKysrIGIvc291bmQvdXNiL2xpbmU2L3RvbmVwb3J0LmMKQEAgLTExNCw3ICsxMTQsNyBAQAogCS5yYXRlcyA9IHsKIAkJCSAgICAubnJhdHMgPSAxLAogCQkJICAgIC5yYXRzID0gJnRvbmVwb3J0X3JhdGRlbn0sCi0JLmJ5dGVzX3Blcl9mcmFtZSA9IDQKKwkuYnl0ZXNfcGVyX2NoYW5uZWwgPSAyCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHsKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCWxpbmU2cGNtLT52b2x1bWVfbW9uaXRvciA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwogCiAJaWYgKGxpbmU2cGNtLT52b2x1bWVfbW9uaXRvciA+IDApIHsKLQkJZXJyID0gbGluZTZfcGNtX2FjcXVpcmUobGluZTZwY20sIExJTkU2X1NUUkVBTV9NT05JVE9SKTsKKwkJZXJyID0gbGluZTZfcGNtX2FjcXVpcmUobGluZTZwY20sIExJTkU2X1NUUkVBTV9NT05JVE9SLCB0cnVlKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCWxpbmU2cGNtLT52b2x1bWVfbW9uaXRvciA9IDA7CiAJCQlsaW5lNl9wY21fcmVsZWFzZShsaW5lNnBjbSwgTElORTZfU1RSRUFNX01PTklUT1IpOwpAQCAtMjQ2LDcgKzI0Niw3IEBACiAJc3RydWN0IHVzYl9saW5lNl90b25lcG9ydCAqdG9uZXBvcnQgPSAoc3RydWN0IHVzYl9saW5lNl90b25lcG9ydCAqKWFyZzsKIAlzdHJ1Y3QgdXNiX2xpbmU2ICpsaW5lNiA9ICZ0b25lcG9ydC0+bGluZTY7CiAKLQlsaW5lNl9wY21fYWNxdWlyZShsaW5lNi0+bGluZTZwY20sIExJTkU2X1NUUkVBTV9NT05JVE9SKTsKKwlsaW5lNl9wY21fYWNxdWlyZShsaW5lNi0+bGluZTZwY20sIExJTkU2X1NUUkVBTV9NT05JVE9SLCB0cnVlKTsKIH0KIAogLyogY29udHJvbCBkZWZpbml0aW9uICovCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbGluZTYvdmFyaWF4LmMgYi9zb3VuZC91c2IvbGluZTYvdmFyaWF4LmMKaW5kZXggZGRjMjNkZC4uMGM0NTEyZCAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2xpbmU2L3ZhcmlheC5jCisrKyBiL3NvdW5kL3VzYi9saW5lNi92YXJpYXguYwpAQCAtMjU5LDcgKzI1OSw4IEBACiAJW0xJTkU2X1BPRFhUTElWRV9WQVJJQVhdID0gewogCQkuaWQgPSAiUE9EeHRMaXZlIiwKIAkJLm5hbWUgPSAiUE9EeHQgTGl2ZSIsCi0JCS5jYXBhYmlsaXRpZXMJPSBMSU5FNl9DQVBfQ09OVFJPTCwKKwkJLmNhcGFiaWxpdGllcwk9IExJTkU2X0NBUF9DT05UUk9MCisJCQkJfCBMSU5FNl9DQVBfQ09OVFJPTF9NSURJLAogCQkuYWx0c2V0dGluZyA9IDEsCiAJCS5lcF9jdHJsX3IgPSAweDg2LAogCQkuZXBfY3RybF93ID0gMHgwNSwKQEAgLTI2OSw3ICsyNzAsOCBAQAogCVtMSU5FNl9WQVJJQVhdID0gewogCQkuaWQgPSAiVmFyaWF4IiwKIAkJLm5hbWUgPSAiVmFyaWF4IFdvcmtiZW5jaCIsCi0JCS5jYXBhYmlsaXRpZXMJPSBMSU5FNl9DQVBfQ09OVFJPTCwKKwkJLmNhcGFiaWxpdGllcwk9IExJTkU2X0NBUF9DT05UUk9MCisJCQkJfCBMSU5FNl9DQVBfQ09OVFJPTF9NSURJLAogCQkuYWx0c2V0dGluZyA9IDEsCiAJCS5lcF9jdHJsX3IgPSAweDgyLAogCQkuZXBfY3RybF93ID0gMHgwMSwKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9taXhlcl9xdWlya3MuYyBiL3NvdW5kL3VzYi9taXhlcl9xdWlya3MuYwppbmRleCBmNmMzYmY3Li4wNDk5MWIwIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvbWl4ZXJfcXVpcmtzLmMKKysrIGIvc291bmQvdXNiL21peGVyX3F1aXJrcy5jCkBAIC0xODMxLDYgKzE4MzEsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBzbmRfZHJhZ29uZmx5X3F1aXJrX2RiX3NjYWxlKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlciwKKwkJCQkJIHN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICpjdmFsLAogCQkJCQkgc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCkKIHsKIAkvKiBBcHByb3hpbWF0aW9uIHVzaW5nIDEwIHJhbmdlcyBiYXNlZCBvbiBvdXRwdXQgbWVhc3VyZW1lbnQgb24gaHcgdjEuMi4KQEAgLTE4NDgsMTAgKzE4NDksMTkgQEAKIAkJNDEsIDUwLCBUTFZfREJfTUlOTUFYX0lURU0oLTQ0MSwgMCksCiAJKTsKIAotCXVzYl9hdWRpb19pbmZvKG1peGVyLT5jaGlwLCAiYXBwbHlpbmcgRHJhZ29uRmx5IGRCIHNjYWxlIHF1aXJrXG4iKTsKLQlrY3RsLT50bHYucCA9IHNjYWxlOwotCWtjdGwtPnZkWzBdLmFjY2VzcyB8PSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQ7Ci0Ja2N0bC0+dmRbMF0uYWNjZXNzICY9IH5TTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX0NBTExCQUNLOworCWlmIChjdmFsLT5taW4gPT0gMCAmJiBjdmFsLT5tYXggPT0gNTApIHsKKwkJdXNiX2F1ZGlvX2luZm8obWl4ZXItPmNoaXAsICJhcHBseWluZyBEcmFnb25GbHkgZEIgc2NhbGUgcXVpcmsgKDAtNTAgdmFyaWFudClcbiIpOworCQlrY3RsLT50bHYucCA9IHNjYWxlOworCQlrY3RsLT52ZFswXS5hY2Nlc3MgfD0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEOworCQlrY3RsLT52ZFswXS5hY2Nlc3MgJj0gflNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfQ0FMTEJBQ0s7CisKKwl9IGVsc2UgaWYgKGN2YWwtPm1pbiA9PSAwICYmIGN2YWwtPm1heCA8PSAxMDAwKSB7CisJCS8qIFNvbWUgb3RoZXIgY2xlYXJseSBicm9rZW4gRHJhZ29uRmx5IHZhcmlhbnQuCisJCSAqIEF0IGxlYXN0IGEgMC4uNTMgdmFyaWFudCAoaHcgdjEuMCkgZXhpc3RzLgorCQkgKi8KKwkJdXNiX2F1ZGlvX2luZm8obWl4ZXItPmNoaXAsICJpZ25vcmluZyB0b28gbmFycm93IGRCIHJhbmdlIG9uIGEgRHJhZ29uRmx5IGRldmljZSIpOworCQlrY3RsLT52ZFswXS5hY2Nlc3MgJj0gflNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfQ0FMTEJBQ0s7CisJfQogfQogCiB2b2lkIHNuZF91c2JfbWl4ZXJfZnVfYXBwbHlfcXVpcmsoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyLApAQCAtMTg2MCw4ICsxODcwLDggQEAKIHsKIAlzd2l0Y2ggKG1peGVyLT5jaGlwLT51c2JfaWQpIHsKIAljYXNlIFVTQl9JRCgweDIxYjQsIDB4MDA4MSk6IC8qIEF1ZGlvUXVlc3QgRHJhZ29uRmx5ICovCi0JCWlmICh1bml0aWQgPT0gNyAmJiBjdmFsLT5taW4gPT0gMCAmJiBjdmFsLT5tYXggPT0gNTApCi0JCQlzbmRfZHJhZ29uZmx5X3F1aXJrX2RiX3NjYWxlKG1peGVyLCBrY3RsKTsKKwkJaWYgKHVuaXRpZCA9PSA3ICYmIGN2YWwtPmNvbnRyb2wgPT0gVUFDX0ZVX1ZPTFVNRSkKKwkJCXNuZF9kcmFnb25mbHlfcXVpcmtfZGJfc2NhbGUobWl4ZXIsIGN2YWwsIGtjdGwpOwogCQlicmVhazsKIAl9CiB9CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvcXVpcmtzLmMgYi9zb3VuZC91c2IvcXVpcmtzLmMKaW5kZXggNmNmMWYzNS4uMjc4MjE1NSAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3F1aXJrcy5jCisrKyBiL3NvdW5kL3VzYi9xdWlya3MuYwpAQCAtMTE0MSw2ICsxMTQxLDcgQEAKIAljYXNlIFVTQl9JRCgweDA1NTYsIDB4MDAxNCk6IC8qIFBob2VuaXggQXVkaW8gVE1YMzIwVkMgKi8KIAljYXNlIFVTQl9JRCgweDA1QTMsIDB4OTQyMCk6IC8qIEVMUCBIRCBVU0IgQ2FtZXJhICovCiAJY2FzZSBVU0JfSUQoMHgwNzRELCAweDM1NTMpOiAvKiBPdXRsYXcgUlIyMTUwIChNaWNyb25hcyBVQUMzNTUzQikgKi8KKwljYXNlIFVTQl9JRCgweDE5MDEsIDB4MDE5MSk6IC8qIEdFIEI4NTBWMyBDUDIxMTQgYXVkaW8gaW50ZXJmYWNlICovCiAJY2FzZSBVU0JfSUQoMHgxZGU3LCAweDAwMTMpOiAvKiBQaG9lbml4IEF1ZGlvIE1UMjAyZXhlICovCiAJY2FzZSBVU0JfSUQoMHgxZGU3LCAweDAwMTQpOiAvKiBQaG9lbml4IEF1ZGlvIFRNWDMyMCAqLwogCWNhc2UgVVNCX0lEKDB4MWRlNywgMHgwMTE0KTogLyogUGhvZW5peCBBdWRpbyBNVDIwMnBjcyAqLwpAQCAtMTIxNiw2ICsxMjE3LDEyIEBACiAJICAgICBlcC0+Y2hpcC0+dXNiX2lkID09IFVTQl9JRCgweDA3NjMsIDB4MjAzMSkpICYmCiAJICAgIGVwLT50eXBlID09IFNORF9VU0JfRU5EUE9JTlRfVFlQRV9EQVRBKQogCQllcC0+c2tpcF9wYWNrZXRzID0gMTY7CisKKwkvKiBXb3JrIGFyb3VuZCBkZXZpY2VzIHRoYXQgcmVwb3J0IHVucmVhc29uYWJsZSBmZWVkYmFjayBkYXRhICovCisJaWYgKChlcC0+Y2hpcC0+dXNiX2lkID09IFVTQl9JRCgweDA2NDQsIDB4ODAzOCkgfHwgIC8qIFRFQUMgVUQtSDAxICovCisJICAgICBlcC0+Y2hpcC0+dXNiX2lkID09IFVTQl9JRCgweDE4NTIsIDB4NTAzNCkpICYmIC8qIFQrQSBEYWM4ICovCisJICAgIGVwLT5zeW5jbWF4c2l6ZSA9PSA0KQorCQllcC0+dGVub3JfZmJfcXVpcmsgPSAxOwogfQogCiB2b2lkIHNuZF91c2Jfc2V0X2ludGVyZmFjZV9xdWlyayhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvdG9vbHMvYXJjaC9hbHBoYS9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaCBiL3Rvb2xzL2FyY2gvYWxwaGEvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM4YjY0YwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2FyY2gvYWxwaGEvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKQEAgLTAsMCArMSw0NyBAQAorI2lmbmRlZiBUT09MU19BUkNIX0FMUEhBX1VBUElfQVNNX01NQU5fRklYX0gKKyNkZWZpbmUgVE9PTFNfQVJDSF9BTFBIQV9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIE1BRFZfRE9EVU1QCTE3CisjZGVmaW5lIE1BRFZfRE9GT1JLCTExCisjZGVmaW5lIE1BRFZfRE9OVERVTVAgICAxNgorI2RlZmluZSBNQURWX0RPTlRGT1JLCTEwCisjZGVmaW5lIE1BRFZfRE9OVE5FRUQJNgorI2RlZmluZSBNQURWX0ZSRUUJOAorI2RlZmluZSBNQURWX0hVR0VQQUdFCTE0CisjZGVmaW5lIE1BRFZfTUVSR0VBQkxFICAgMTIKKyNkZWZpbmUgTUFEVl9OT0hVR0VQQUdFCTE1CisjZGVmaW5lIE1BRFZfTk9STUFMCTAKKyNkZWZpbmUgTUFEVl9SQU5ET00JMQorI2RlZmluZSBNQURWX1JFTU9WRQk5CisjZGVmaW5lIE1BRFZfU0VRVUVOVElBTAkyCisjZGVmaW5lIE1BRFZfVU5NRVJHRUFCTEUgMTMKKyNkZWZpbmUgTUFEVl9XSUxMTkVFRAkzCisjZGVmaW5lIE1BUF9BTk9OWU1PVVMJMHgxMAorI2RlZmluZSBNQVBfREVOWVdSSVRFCTB4MDIwMDAKKyNkZWZpbmUgTUFQX0VYRUNVVEFCTEUJMHgwNDAwMAorI2RlZmluZSBNQVBfRklMRQkwCisjZGVmaW5lIE1BUF9GSVhFRAkweDEwMAorI2RlZmluZSBNQVBfR1JPV1NET1dOCTB4MDEwMDAKKyNkZWZpbmUgTUFQX0hVR0VUTEIJMHgxMDAwMDAKKyNkZWZpbmUgTUFQX0xPQ0tFRAkweDA4MDAwCisjZGVmaW5lIE1BUF9OT05CTE9DSwkweDQwMDAwCisjZGVmaW5lIE1BUF9OT1JFU0VSVkUJMHgxMDAwMAorI2RlZmluZSBNQVBfUE9QVUxBVEUJMHgyMDAwMAorI2RlZmluZSBNQVBfUFJJVkFURQkweDAyCisjZGVmaW5lIE1BUF9TSEFSRUQJMHgwMQorI2RlZmluZSBNQVBfU1RBQ0sJMHg4MDAwMAorI2RlZmluZSBQUk9UX0VYRUMJMHg0CisjZGVmaW5lIFBST1RfR1JPV1NET1dOCTB4MDEwMDAwMDAKKyNkZWZpbmUgUFJPVF9HUk9XU1VQCTB4MDIwMDAwMDAKKyNkZWZpbmUgUFJPVF9OT05FCTB4MAorI2RlZmluZSBQUk9UX1JFQUQJMHgxCisjZGVmaW5lIFBST1RfU0VNCTB4OAorI2RlZmluZSBQUk9UX1dSSVRFCTB4MgorLyogTUFEVl9IV1BPSVNPTiBpcyB1bmRlZmluZWQgb24gYWxwaGEsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQURWX0hXUE9JU09OCTEwMAorLyogTUFEVl9TT0ZUX09GRkxJTkUgaXMgdW5kZWZpbmVkIG9uIGFscGhhLCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFEVl9TT0ZUX09GRkxJTkUgMTAxCisvKiBNQVBfMzJCSVQgaXMgdW5kZWZpbmVkIG9uIGFscGhhLCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFQXzMyQklUCTAKKy8qIE1BUF9VTklOSVRJQUxJWkVEIGlzIHVuZGVmaW5lZCBvbiBhbHBoYSwgZml4IGl0IGZvciBwZXJmICovCisjZGVmaW5lIE1BUF9VTklOSVRJQUxJWkVECTAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvYXJjaC9hcmMvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmggYi90b29scy9hcmNoL2FyYy9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTNhY2QyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYXJjaC9hcmMvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIFRPT0xTX0FSQ0hfQVJDX1VBUElfQVNNX01NQU5fRklYX0gKKyNkZWZpbmUgVE9PTFNfQVJDSF9BUkNfVUFQSV9BU01fTU1BTl9GSVhfSAorI2luY2x1ZGUgPHVhcGkvYXNtLWdlbmVyaWMvbW1hbi5oPgorLyogTUFQXzMyQklUIGlzIHVuZGVmaW5lZCBvbiBhcmMsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQVBfMzJCSVQJMAorI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9hcmNoL2FybS9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaCBiL3Rvb2xzL2FyY2gvYXJtL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3OGY2OTkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hcmNoL2FybS9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgVE9PTFNfQVJDSF9BUk1fVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBUT09MU19BUkNIX0FSTV9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjaW5jbHVkZSA8dWFwaS9hc20tZ2VuZXJpYy9tbWFuLmg+CisvKiBNQVBfMzJCSVQgaXMgdW5kZWZpbmVkIG9uIGFybSwgZml4IGl0IGZvciBwZXJmICovCisjZGVmaW5lIE1BUF8zMkJJVAkwCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL2FyY2gvYXJtNjQvaW5jbHVkZS91YXBpL2FzbS9rdm0uaCBiL3Rvb2xzL2FyY2gvYXJtNjQvaW5jbHVkZS91YXBpL2FzbS9rdm0uaAppbmRleCBmMjA5ZWExLi4zMDUxZjg2IDEwMDY0NAotLS0gYS90b29scy9hcmNoL2FybTY0L2luY2x1ZGUvdWFwaS9hc20va3ZtLmgKKysrIGIvdG9vbHMvYXJjaC9hcm02NC9pbmNsdWRlL3VhcGkvYXNtL2t2bS5oCkBAIC04Nyw5ICs4NywxMSBAQAogLyogU3VwcG9ydGVkIFZHSUN2MyBhZGRyZXNzIHR5cGVzICAqLwogI2RlZmluZSBLVk1fVkdJQ19WM19BRERSX1RZUEVfRElTVAkyCiAjZGVmaW5lIEtWTV9WR0lDX1YzX0FERFJfVFlQRV9SRURJU1QJMworI2RlZmluZSBLVk1fVkdJQ19JVFNfQUREUl9UWVBFCQk0CiAKICNkZWZpbmUgS1ZNX1ZHSUNfVjNfRElTVF9TSVpFCQlTWl82NEsKICNkZWZpbmUgS1ZNX1ZHSUNfVjNfUkVESVNUX1NJWkUJCSgyICogU1pfNjRLKQorI2RlZmluZSBLVk1fVkdJQ19WM19JVFNfU0laRQkJKDIgKiBTWl82NEspCiAKICNkZWZpbmUgS1ZNX0FSTV9WQ1BVX1BPV0VSX09GRgkJMCAvKiBDUFUgaXMgc3RhcnRlZCBpbiBPRkYgc3RhdGUgKi8KICNkZWZpbmUgS1ZNX0FSTV9WQ1BVX0VMMV8zMkJJVAkJMSAvKiBDUFUgcnVubmluZyBhIDMyYml0IFZNICovCmRpZmYgLS1naXQgYS90b29scy9hcmNoL2FybTY0L2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oIGIvdG9vbHMvYXJjaC9hcm02NC9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGZkMzExCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYXJjaC9hcm02NC9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgVE9PTFNfQVJDSF9BUk02NF9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIFRPT0xTX0FSQ0hfQVJNNjRfVUFQSV9BU01fTU1BTl9GSVhfSAorI2luY2x1ZGUgPHVhcGkvYXNtLWdlbmVyaWMvbW1hbi5oPgorLyogTUFQXzMyQklUIGlzIHVuZGVmaW5lZCBvbiBhcm02NCwgZml4IGl0IGZvciBwZXJmICovCisjZGVmaW5lIE1BUF8zMkJJVAkwCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL2FyY2gvZnJ2L2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oIGIvdG9vbHMvYXJjaC9mcnYvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJlNzhhYwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2FyY2gvZnJ2L2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBUT09MU19BUkNIX0ZSVl9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIFRPT0xTX0FSQ0hfRlJWX1VBUElfQVNNX01NQU5fRklYX0gKKyNpbmNsdWRlIDx1YXBpL2FzbS1nZW5lcmljL21tYW4uaD4KKy8qIE1BUF8zMkJJVCBpcyB1bmRlZmluZWQgb24gZnJ2LCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFQXzMyQklUCTAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvYXJjaC9oODMwMC9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaCBiL3Rvb2xzL2FyY2gvaDgzMDAvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ5YWM1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2FyY2gvaDgzMDAvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIFRPT0xTX0FSQ0hfSDgzMDBfVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBUT09MU19BUkNIX0g4MzAwX1VBUElfQVNNX01NQU5fRklYX0gKKyNpbmNsdWRlIDx1YXBpL2FzbS1nZW5lcmljL21tYW4uaD4KKy8qIE1BUF8zMkJJVCBpcyB1bmRlZmluZWQgb24gaDgzMDAsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQVBfMzJCSVQJMAorI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9hcmNoL2hleGFnb24vaW5jbHVkZS91YXBpL2FzbS9tbWFuLmggYi90b29scy9hcmNoL2hleGFnb24vaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAyZjNmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2FyY2gvaGV4YWdvbi9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgVE9PTFNfQVJDSF9IRVhBR09OX1VBUElfQVNNX01NQU5fRklYX0gKKyNkZWZpbmUgVE9PTFNfQVJDSF9IRVhBR09OX1VBUElfQVNNX01NQU5fRklYX0gKKyNpbmNsdWRlIDx1YXBpL2FzbS1nZW5lcmljL21tYW4uaD4KKy8qIE1BUF8zMkJJVCBpcyB1bmRlZmluZWQgb24gaGV4YWdvbiwgZml4IGl0IGZvciBwZXJmICovCisjZGVmaW5lIE1BUF8zMkJJVAkwCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL2FyY2gvaWE2NC9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaCBiL3Rvb2xzL2FyY2gvaWE2NC9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDZlNWFjCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYXJjaC9pYTY0L2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBUT09MU19BUkNIX0lBNjRfVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBUT09MU19BUkNIX0lBNjRfVUFQSV9BU01fTU1BTl9GSVhfSAorI2luY2x1ZGUgPHVhcGkvYXNtLWdlbmVyaWMvbW1hbi5oPgorLyogTUFQXzMyQklUIGlzIHVuZGVmaW5lZCBvbiBpYTY0LCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFQXzMyQklUCTAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvYXJjaC9tMzJyL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oIGIvdG9vbHMvYXJjaC9tMzJyL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMjk2MzUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hcmNoL20zMnIvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIFRPT0xTX0FSQ0hfTTMyUl9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIFRPT0xTX0FSQ0hfTTMyUl9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjaW5jbHVkZSA8dWFwaS9hc20tZ2VuZXJpYy9tbWFuLmg+CisvKiBNQVBfMzJCSVQgaXMgdW5kZWZpbmVkIG9uIG0zMnIsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQVBfMzJCSVQJMAorI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmggYi90b29scy9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA1Y2Q1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgVE9PTFNfQVJDSF9NSUNST0JMQVpFX1VBUElfQVNNX01NQU5fRklYX0gKKyNkZWZpbmUgVE9PTFNfQVJDSF9NSUNST0JMQVpFX1VBUElfQVNNX01NQU5fRklYX0gKKyNpbmNsdWRlIDx1YXBpL2FzbS1nZW5lcmljL21tYW4uaD4KKy8qIE1BUF8zMkJJVCBpcyB1bmRlZmluZWQgb24gbWljcm9ibGF6ZSwgZml4IGl0IGZvciBwZXJmICovCisjZGVmaW5lIE1BUF8zMkJJVAkwCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL2FyY2gvbWlwcy9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaCBiL3Rvb2xzL2FyY2gvbWlwcy9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDIwNTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYXJjaC9taXBzL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCkBAIC0wLDAgKzEsNDYgQEAKKyNpZm5kZWYgVE9PTFNfQVJDSF9NSVBTX1VBUElfQVNNX01NQU5fRklYX0gKKyNkZWZpbmUgVE9PTFNfQVJDSF9NSVBTX1VBUElfQVNNX01NQU5fRklYX0gKKyNkZWZpbmUgTUFEVl9ET0RVTVAJMTcKKyNkZWZpbmUgTUFEVl9ET0ZPUksJMTEKKyNkZWZpbmUgTUFEVl9ET05URFVNUAkxNgorI2RlZmluZSBNQURWX0RPTlRGT1JLCTEwCisjZGVmaW5lIE1BRFZfRE9OVE5FRUQJNAorI2RlZmluZSBNQURWX0ZSRUUJOAorI2RlZmluZSBNQURWX0hVR0VQQUdFCTE0CisjZGVmaW5lIE1BRFZfSFdQT0lTT04JIDEwMAorI2RlZmluZSBNQURWX01FUkdFQUJMRQkgMTIKKyNkZWZpbmUgTUFEVl9OT0hVR0VQQUdFIDE1CisjZGVmaW5lIE1BRFZfTk9STUFMCTAKKyNkZWZpbmUgTUFEVl9SQU5ET00JMQorI2RlZmluZSBNQURWX1JFTU9WRQk5CisjZGVmaW5lIE1BRFZfU0VRVUVOVElBTCAyCisjZGVmaW5lIE1BRFZfVU5NRVJHRUFCTEUgMTMKKyNkZWZpbmUgTUFEVl9XSUxMTkVFRAkzCisjZGVmaW5lIE1BUF9BTk9OWU1PVVMJMHgwODAwCisjZGVmaW5lIE1BUF9ERU5ZV1JJVEUJMHgyMDAwCisjZGVmaW5lIE1BUF9FWEVDVVRBQkxFCTB4NDAwMAorI2RlZmluZSBNQVBfRklMRQkwCisjZGVmaW5lIE1BUF9GSVhFRAkweDAxMAorI2RlZmluZSBNQVBfR1JPV1NET1dOCTB4MTAwMAorI2RlZmluZSBNQVBfSFVHRVRMQgkweDgwMDAwCisjZGVmaW5lIE1BUF9MT0NLRUQJMHg4MDAwCisjZGVmaW5lIE1BUF9OT05CTE9DSwkweDIwMDAwCisjZGVmaW5lIE1BUF9OT1JFU0VSVkUJMHgwNDAwCisjZGVmaW5lIE1BUF9QT1BVTEFURQkweDEwMDAwCisjZGVmaW5lIE1BUF9QUklWQVRFCTB4MDAyCisjZGVmaW5lIE1BUF9TSEFSRUQJMHgwMDEKKyNkZWZpbmUgTUFQX1NUQUNLCTB4NDAwMDAKKyNkZWZpbmUgUFJPVF9FWEVDCTB4MDQKKyNkZWZpbmUgUFJPVF9HUk9XU0RPV04JMHgwMTAwMDAwMAorI2RlZmluZSBQUk9UX0dST1dTVVAJMHgwMjAwMDAwMAorI2RlZmluZSBQUk9UX05PTkUJMHgwMAorI2RlZmluZSBQUk9UX1JFQUQJMHgwMQorI2RlZmluZSBQUk9UX1NFTQkweDEwCisjZGVmaW5lIFBST1RfV1JJVEUJMHgwMgorLyogTUFEVl9TT0ZUX09GRkxJTkUgaXMgdW5kZWZpbmVkIG9uIG1pcHMsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQURWX1NPRlRfT0ZGTElORSAxMDEKKy8qIE1BUF8zMkJJVCBpcyB1bmRlZmluZWQgb24gbWlwcywgZml4IGl0IGZvciBwZXJmICovCisjZGVmaW5lIE1BUF8zMkJJVAkwCisvKiBNQVBfVU5JTklUSUFMSVpFRCBpcyB1bmRlZmluZWQgb24gbWlwcywgZml4IGl0IGZvciBwZXJmICovCisjZGVmaW5lIE1BUF9VTklOSVRJQUxJWkVECTAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvYXJjaC9tbjEwMzAwL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oIGIvdG9vbHMvYXJjaC9tbjEwMzAwL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZWEzNmQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hcmNoL21uMTAzMDAvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIFRPT0xTX0FSQ0hfTU4xMDMwMF9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIFRPT0xTX0FSQ0hfTU4xMDMwMF9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjaW5jbHVkZSA8dWFwaS9hc20tZ2VuZXJpYy9tbWFuLmg+CisvKiBNQVBfMzJCSVQgaXMgdW5kZWZpbmVkIG9uIG1uMTAzMDAsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQVBfMzJCSVQJMAorI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9hcmNoL3BhcmlzYy9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaCBiL3Rvb2xzL2FyY2gvcGFyaXNjL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZDhkNWIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hcmNoL3BhcmlzYy9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApAQCAtMCwwICsxLDQ3IEBACisjaWZuZGVmIFRPT0xTX0FSQ0hfUEFSSVNDX1VBUElfQVNNX01NQU5fRklYX0gKKyNkZWZpbmUgVE9PTFNfQVJDSF9QQVJJU0NfVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBNQURWX0RPRFVNUAk3MAorI2RlZmluZSBNQURWX0RPRk9SSwkxMQorI2RlZmluZSBNQURWX0RPTlREVU1QICAgNjkKKyNkZWZpbmUgTUFEVl9ET05URk9SSwkxMAorI2RlZmluZSBNQURWX0RPTlRORUVEICAgNAorI2RlZmluZSBNQURWX0ZSRUUJOAorI2RlZmluZSBNQURWX0hVR0VQQUdFCTY3CisjZGVmaW5lIE1BRFZfTUVSR0VBQkxFICAgNjUKKyNkZWZpbmUgTUFEVl9OT0hVR0VQQUdFCTY4CisjZGVmaW5lIE1BRFZfTk9STUFMICAgICAwCisjZGVmaW5lIE1BRFZfUkFORE9NICAgICAxCisjZGVmaW5lIE1BRFZfUkVNT1ZFCTkKKyNkZWZpbmUgTUFEVl9TRVFVRU5USUFMIDIKKyNkZWZpbmUgTUFEVl9VTk1FUkdFQUJMRSA2NgorI2RlZmluZSBNQURWX1dJTExORUVEICAgMworI2RlZmluZSBNQVBfQU5PTllNT1VTCTB4MTAKKyNkZWZpbmUgTUFQX0RFTllXUklURQkweDA4MDAKKyNkZWZpbmUgTUFQX0VYRUNVVEFCTEUJMHgxMDAwCisjZGVmaW5lIE1BUF9GSUxFCTAKKyNkZWZpbmUgTUFQX0ZJWEVECTB4MDQKKyNkZWZpbmUgTUFQX0dST1dTRE9XTgkweDgwMDAKKyNkZWZpbmUgTUFQX0hVR0VUTEIJMHg4MDAwMAorI2RlZmluZSBNQVBfTE9DS0VECTB4MjAwMAorI2RlZmluZSBNQVBfTk9OQkxPQ0sJMHgyMDAwMAorI2RlZmluZSBNQVBfTk9SRVNFUlZFCTB4NDAwMAorI2RlZmluZSBNQVBfUE9QVUxBVEUJMHgxMDAwMAorI2RlZmluZSBNQVBfUFJJVkFURQkweDAyCisjZGVmaW5lIE1BUF9TSEFSRUQJMHgwMQorI2RlZmluZSBNQVBfU1RBQ0sJMHg0MDAwMAorI2RlZmluZSBQUk9UX0VYRUMJMHg0CisjZGVmaW5lIFBST1RfR1JPV1NET1dOCTB4MDEwMDAwMDAKKyNkZWZpbmUgUFJPVF9HUk9XU1VQCTB4MDIwMDAwMDAKKyNkZWZpbmUgUFJPVF9OT05FCTB4MAorI2RlZmluZSBQUk9UX1JFQUQJMHgxCisjZGVmaW5lIFBST1RfU0VNCTB4OAorI2RlZmluZSBQUk9UX1dSSVRFCTB4MgorLyogTUFEVl9IV1BPSVNPTiBpcyB1bmRlZmluZWQgb24gcGFyaXNjLCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFEVl9IV1BPSVNPTgkxMDAKKy8qIE1BRFZfU09GVF9PRkZMSU5FIGlzIHVuZGVmaW5lZCBvbiBwYXJpc2MsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQURWX1NPRlRfT0ZGTElORSAxMDEKKy8qIE1BUF8zMkJJVCBpcyB1bmRlZmluZWQgb24gcGFyaXNjLCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFQXzMyQklUCTAKKy8qIE1BUF9VTklOSVRJQUxJWkVEIGlzIHVuZGVmaW5lZCBvbiBwYXJpc2MsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQVBfVU5JTklUSUFMSVpFRAkwCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL2FyY2gvcG93ZXJwYy9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaCBiL3Rvb2xzL2FyY2gvcG93ZXJwYy9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjFkYjQzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYXJjaC9wb3dlcnBjL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgVE9PTFNfQVJDSF9QT1dFUlBDX1VBUElfQVNNX01NQU5fRklYX0gKKyNkZWZpbmUgVE9PTFNfQVJDSF9QT1dFUlBDX1VBUElfQVNNX01NQU5fRklYX0gKKyNkZWZpbmUgTUFQX0RFTllXUklURQkweDA4MDAKKyNkZWZpbmUgTUFQX0VYRUNVVEFCTEUJMHgxMDAwCisjZGVmaW5lIE1BUF9HUk9XU0RPV04JMHgwMTAwCisjZGVmaW5lIE1BUF9IVUdFVExCCTB4NDAwMDAKKyNkZWZpbmUgTUFQX0xPQ0tFRAkweDgwCisjZGVmaW5lIE1BUF9OT05CTE9DSwkweDEwMDAwCisjZGVmaW5lIE1BUF9OT1JFU0VSVkUgICAweDQwCisjZGVmaW5lIE1BUF9QT1BVTEFURQkweDgwMDAKKyNkZWZpbmUgTUFQX1NUQUNLCTB4MjAwMDAKKyNpbmNsdWRlIDx1YXBpL2FzbS1nZW5lcmljL21tYW4tY29tbW9uLmg+CisvKiBNQVBfMzJCSVQgaXMgdW5kZWZpbmVkIG9uIHBvd2VycGMsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQVBfMzJCSVQJMAorI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9hcmNoL3MzOTAvaW5jbHVkZS91YXBpL2FzbS9rdm0uaCBiL3Rvb2xzL2FyY2gvczM5MC9pbmNsdWRlL3VhcGkvYXNtL2t2bS5oCmluZGV4IDNiOGU5OWUuLmEyZmZlYzQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FyY2gvczM5MC9pbmNsdWRlL3VhcGkvYXNtL2t2bS5oCisrKyBiL3Rvb2xzL2FyY2gvczM5MC9pbmNsdWRlL3VhcGkvYXNtL2t2bS5oCkBAIC05Myw2ICs5Myw0NyBAQAogCV9fdTY0IGZhY19saXN0WzI1Nl07CiB9OwogCisjZGVmaW5lIEtWTV9TMzkwX1ZNX0NQVV9QUk9DRVNTT1JfRkVBVAkyCisjZGVmaW5lIEtWTV9TMzkwX1ZNX0NQVV9NQUNISU5FX0ZFQVQJMworCisjZGVmaW5lIEtWTV9TMzkwX1ZNX0NQVV9GRUFUX05SX0JJVFMJMTAyNAorI2RlZmluZSBLVk1fUzM5MF9WTV9DUFVfRkVBVF9FU09QCTAKKyNkZWZpbmUgS1ZNX1MzOTBfVk1fQ1BVX0ZFQVRfU0lFRjIJMQorI2RlZmluZSBLVk1fUzM5MF9WTV9DUFVfRkVBVF82NEJTQ0FPCTIKKyNkZWZpbmUgS1ZNX1MzOTBfVk1fQ1BVX0ZFQVRfU0lJRgkzCisjZGVmaW5lIEtWTV9TMzkwX1ZNX0NQVV9GRUFUX0dQRVJFCTQKKyNkZWZpbmUgS1ZNX1MzOTBfVk1fQ1BVX0ZFQVRfR1NMUwk1CisjZGVmaW5lIEtWTV9TMzkwX1ZNX0NQVV9GRUFUX0lCCQk2CisjZGVmaW5lIEtWTV9TMzkwX1ZNX0NQVV9GRUFUX0NFSQk3CisjZGVmaW5lIEtWTV9TMzkwX1ZNX0NQVV9GRUFUX0lCUwk4CisjZGVmaW5lIEtWTV9TMzkwX1ZNX0NQVV9GRUFUX1NLRVkJOQorI2RlZmluZSBLVk1fUzM5MF9WTV9DUFVfRkVBVF9DTU1BCTEwCisjZGVmaW5lIEtWTV9TMzkwX1ZNX0NQVV9GRUFUX1BGTUZJCTExCisjZGVmaW5lIEtWTV9TMzkwX1ZNX0NQVV9GRUFUX1NJR1BJRgkxMgorc3RydWN0IGt2bV9zMzkwX3ZtX2NwdV9mZWF0IHsKKwlfX3U2NCBmZWF0WzE2XTsKK307CisKKyNkZWZpbmUgS1ZNX1MzOTBfVk1fQ1BVX1BST0NFU1NPUl9TVUJGVU5DCTQKKyNkZWZpbmUgS1ZNX1MzOTBfVk1fQ1BVX01BQ0hJTkVfU1VCRlVOQwkJNQorLyogZm9yICJ0ZXN0IGJpdCIgaW5zdHJ1Y3Rpb25zIE1TQiAwIGJpdCBvcmRlcmluZywgZm9yICJxdWVyeSIgcmF3IGJsb2NrcyAqLworc3RydWN0IGt2bV9zMzkwX3ZtX2NwdV9zdWJmdW5jIHsKKwlfX3U4IHBsb1szMl07CQkvKiBhbHdheXMgKi8KKwlfX3U4IHB0ZmZbMTZdOwkJLyogd2l0aCBUT0QtY2xvY2sgc3RlZXJpbmcgKi8KKwlfX3U4IGttYWNbMTZdOwkJLyogd2l0aCBNU0EgKi8KKwlfX3U4IGttY1sxNl07CQkvKiB3aXRoIE1TQSAqLworCV9fdTgga21bMTZdOwkJLyogd2l0aCBNU0EgKi8KKwlfX3U4IGtpbWRbMTZdOwkJLyogd2l0aCBNU0EgKi8KKwlfX3U4IGtsbWRbMTZdOwkJLyogd2l0aCBNU0EgKi8KKwlfX3U4IHBja21vWzE2XTsJCS8qIHdpdGggTVNBMyAqLworCV9fdTgga21jdHJbMTZdOwkJLyogd2l0aCBNU0E0ICovCisJX191OCBrbWZbMTZdOwkJLyogd2l0aCBNU0E0ICovCisJX191OCBrbW9bMTZdOwkJLyogd2l0aCBNU0E0ICovCisJX191OCBwY2NbMTZdOwkJLyogd2l0aCBNU0E0ICovCisJX191OCBwcG5vWzE2XTsJCS8qIHdpdGggTVNBNSAqLworCV9fdTggcmVzZXJ2ZWRbMTgyNF07Cit9OworCiAvKiBrdm0gYXR0cmlidXRlcyBmb3IgY3J5cHRvICovCiAjZGVmaW5lIEtWTV9TMzkwX1ZNX0NSWVBUT19FTkFCTEVfQUVTX0tXCTAKICNkZWZpbmUgS1ZNX1MzOTBfVk1fQ1JZUFRPX0VOQUJMRV9ERUFfS1cJMQpkaWZmIC0tZ2l0IGEvdG9vbHMvYXJjaC9zMzkwL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oIGIvdG9vbHMvYXJjaC9zMzkwL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwM2RlYTkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hcmNoL3MzOTAvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIFRPT0xTX0FSQ0hfUzM5MF9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIFRPT0xTX0FSQ0hfUzM5MF9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjaW5jbHVkZSA8dWFwaS9hc20tZ2VuZXJpYy9tbWFuLmg+CisvKiBNQVBfMzJCSVQgaXMgdW5kZWZpbmVkIG9uIHMzOTAsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQVBfMzJCSVQJMAorI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9hcmNoL3MzOTAvaW5jbHVkZS91YXBpL2FzbS9zaWUuaCBiL3Rvb2xzL2FyY2gvczM5MC9pbmNsdWRlL3VhcGkvYXNtL3NpZS5oCmluZGV4IDhmYjVkNGEuLjNhYzYzNDMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FyY2gvczM5MC9pbmNsdWRlL3VhcGkvYXNtL3NpZS5oCisrKyBiL3Rvb2xzL2FyY2gvczM5MC9pbmNsdWRlL3VhcGkvYXNtL3NpZS5oCkBAIC0xNDAsNiArMTQwLDcgQEAKIAlleGl0X2NvZGVfaXBhMCgweEIyLCAweDRjLCAiVEFSIiksCVwKIAlleGl0X2NvZGVfaXBhMCgweEIyLCAweDUwLCAiQ1NQIiksCVwKIAlleGl0X2NvZGVfaXBhMCgweEIyLCAweDU0LCAiTVZQRyIpLAlcCisJZXhpdF9jb2RlX2lwYTAoMHhCMiwgMHg1NiwgIlNUSFlJIiksCVwKIAlleGl0X2NvZGVfaXBhMCgweEIyLCAweDU4LCAiQlNHIiksCVwKIAlleGl0X2NvZGVfaXBhMCgweEIyLCAweDVhLCAiQlNBIiksCVwKIAlleGl0X2NvZGVfaXBhMCgweEIyLCAweDVmLCAiQ0hTQyIpLAlcCmRpZmYgLS1naXQgYS90b29scy9hcmNoL3Njb3JlL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oIGIvdG9vbHMvYXJjaC9zY29yZS9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjhmYjg5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYXJjaC9zY29yZS9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgVE9PTFNfQVJDSF9TQ09SRV9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIFRPT0xTX0FSQ0hfU0NPUkVfVUFQSV9BU01fTU1BTl9GSVhfSAorI2luY2x1ZGUgPHVhcGkvYXNtLWdlbmVyaWMvbW1hbi5oPgorLyogTUFQXzMyQklUIGlzIHVuZGVmaW5lZCBvbiBzY29yZSwgZml4IGl0IGZvciBwZXJmICovCisjZGVmaW5lIE1BUF8zMkJJVAkwCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL2FyY2gvc2gvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmggYi90b29scy9hcmNoL3NoL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NTA0ZjYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hcmNoL3NoL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBUT09MU19BUkNIX1NIX1VBUElfQVNNX01NQU5fRklYX0gKKyNkZWZpbmUgVE9PTFNfQVJDSF9TSF9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjaW5jbHVkZSA8dWFwaS9hc20tZ2VuZXJpYy9tbWFuLmg+CisvKiBNQVBfMzJCSVQgaXMgdW5kZWZpbmVkIG9uIHNoLCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFQXzMyQklUCTAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvYXJjaC9zcGFyYy9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaCBiL3Rvb2xzL2FyY2gvc3BhcmMvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY0MDUyNQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2FyY2gvc3BhcmMvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBUT09MU19BUkNIX1NQQVJDX1VBUElfQVNNX01NQU5fRklYX0gKKyNkZWZpbmUgVE9PTFNfQVJDSF9TUEFSQ19VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIE1BUF9ERU5ZV1JJVEUJMHgwODAwCisjZGVmaW5lIE1BUF9FWEVDVVRBQkxFCTB4MTAwMAorI2RlZmluZSBNQVBfR1JPV1NET1dOCTB4MDIwMAorI2RlZmluZSBNQVBfSFVHRVRMQgkweDQwMDAwCisjZGVmaW5lIE1BUF9MT0NLRUQgICAgICAweDEwMAorI2RlZmluZSBNQVBfTk9OQkxPQ0sJMHgxMDAwMAorI2RlZmluZSBNQVBfTk9SRVNFUlZFICAgMHg0MAorI2RlZmluZSBNQVBfUE9QVUxBVEUJMHg4MDAwCisjZGVmaW5lIE1BUF9TVEFDSwkweDIwMDAwCisjaW5jbHVkZSA8dWFwaS9hc20tZ2VuZXJpYy9tbWFuLWNvbW1vbi5oPgorLyogTUFQXzMyQklUIGlzIHVuZGVmaW5lZCBvbiBzcGFyYywgZml4IGl0IGZvciBwZXJmICovCisjZGVmaW5lIE1BUF8zMkJJVAkwCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL2FyY2gvdGlsZS9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaCBiL3Rvb2xzL2FyY2gvdGlsZS9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTE2YzRiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYXJjaC90aWxlL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgVE9PTFNfQVJDSF9USUxFX1VBUElfQVNNX01NQU5fRklYX0gKKyNkZWZpbmUgVE9PTFNfQVJDSF9USUxFX1VBUElfQVNNX01NQU5fRklYX0gKKyNkZWZpbmUgTUFQX0RFTllXUklURQkweDA4MDAKKyNkZWZpbmUgTUFQX0VYRUNVVEFCTEUJMHgxMDAwCisjZGVmaW5lIE1BUF9HUk9XU0RPV04JMHgwMTAwCisjZGVmaW5lIE1BUF9IVUdFVExCCTB4NDAwMAorI2RlZmluZSBNQVBfTE9DS0VECTB4MDIwMAorI2RlZmluZSBNQVBfTk9OQkxPQ0sJMHgwMDgwCisjZGVmaW5lIE1BUF9OT1JFU0VSVkUJMHgwNDAwCisjZGVmaW5lIE1BUF9QT1BVTEFURQkweDAwNDAKKyNkZWZpbmUgTUFQX1NUQUNLCU1BUF9HUk9XU0RPV04KKyNpbmNsdWRlIDx1YXBpL2FzbS1nZW5lcmljL21tYW4tY29tbW9uLmg+CisvKiBNQVBfMzJCSVQgaXMgdW5kZWZpbmVkIG9uIHRpbGUsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQVBfMzJCSVQJMAorI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9hcmNoL3g4Ni9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaCBiL3Rvb2xzL2FyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3M2MxYWYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hcmNoL3g4Ni9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApAQCAtMCwwICsxLDUgQEAKKyNpZm5kZWYgVE9PTFNfQVJDSF9YODZfVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBUT09MU19BUkNIX1g4Nl9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIE1BUF8zMkJJVAkweDQwCisjaW5jbHVkZSA8dWFwaS9hc20tZ2VuZXJpYy9tbWFuLmg+CisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL2FyY2gveHRlbnNhL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oIGIvdG9vbHMvYXJjaC94dGVuc2EvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ1MzE5NQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2FyY2gveHRlbnNhL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCkBAIC0wLDAgKzEsNDcgQEAKKyNpZm5kZWYgVE9PTFNfQVJDSF9YVEVOU0FfVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBUT09MU19BUkNIX1hURU5TQV9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIE1BRFZfRE9EVU1QCTE3CisjZGVmaW5lIE1BRFZfRE9GT1JLCTExCisjZGVmaW5lIE1BRFZfRE9OVERVTVAgICAxNgorI2RlZmluZSBNQURWX0RPTlRGT1JLCTEwCisjZGVmaW5lIE1BRFZfRE9OVE5FRUQJNAorI2RlZmluZSBNQURWX0ZSRUUJOAorI2RlZmluZSBNQURWX0hVR0VQQUdFCTE0CisjZGVmaW5lIE1BRFZfTUVSR0VBQkxFICAgMTIKKyNkZWZpbmUgTUFEVl9OT0hVR0VQQUdFCTE1CisjZGVmaW5lIE1BRFZfTk9STUFMCTAKKyNkZWZpbmUgTUFEVl9SQU5ET00JMQorI2RlZmluZSBNQURWX1JFTU9WRQk5CisjZGVmaW5lIE1BRFZfU0VRVUVOVElBTAkyCisjZGVmaW5lIE1BRFZfVU5NRVJHRUFCTEUgMTMKKyNkZWZpbmUgTUFEVl9XSUxMTkVFRAkzCisjZGVmaW5lIE1BUF9BTk9OWU1PVVMJMHgwODAwCisjZGVmaW5lIE1BUF9ERU5ZV1JJVEUJMHgyMDAwCisjZGVmaW5lIE1BUF9FWEVDVVRBQkxFCTB4NDAwMAorI2RlZmluZSBNQVBfRklMRQkwCisjZGVmaW5lIE1BUF9GSVhFRAkweDAxMAorI2RlZmluZSBNQVBfR1JPV1NET1dOCTB4MTAwMAorI2RlZmluZSBNQVBfSFVHRVRMQgkweDgwMDAwCisjZGVmaW5lIE1BUF9MT0NLRUQJMHg4MDAwCisjZGVmaW5lIE1BUF9OT05CTE9DSwkweDIwMDAwCisjZGVmaW5lIE1BUF9OT1JFU0VSVkUJMHgwNDAwCisjZGVmaW5lIE1BUF9QT1BVTEFURQkweDEwMDAwCisjZGVmaW5lIE1BUF9QUklWQVRFCTB4MDAyCisjZGVmaW5lIE1BUF9TSEFSRUQJMHgwMDEKKyNkZWZpbmUgTUFQX1NUQUNLCTB4NDAwMDAKKyNkZWZpbmUgUFJPVF9FWEVDCTB4NAorI2RlZmluZSBQUk9UX0dST1dTRE9XTgkweDAxMDAwMDAwCisjZGVmaW5lIFBST1RfR1JPV1NVUAkweDAyMDAwMDAwCisjZGVmaW5lIFBST1RfTk9ORQkweDAKKyNkZWZpbmUgUFJPVF9SRUFECTB4MQorI2RlZmluZSBQUk9UX1NFTQkweDEwCisjZGVmaW5lIFBST1RfV1JJVEUJMHgyCisvKiBNQURWX0hXUE9JU09OIGlzIHVuZGVmaW5lZCBvbiB4dGVuc2EsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQURWX0hXUE9JU09OCTEwMAorLyogTUFEVl9TT0ZUX09GRkxJTkUgaXMgdW5kZWZpbmVkIG9uIHh0ZW5zYSwgZml4IGl0IGZvciBwZXJmICovCisjZGVmaW5lIE1BRFZfU09GVF9PRkZMSU5FIDEwMQorLyogTUFQXzMyQklUIGlzIHVuZGVmaW5lZCBvbiB4dGVuc2EsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQVBfMzJCSVQJMAorLyogTUFQX1VOSU5JVElBTElaRUQgaXMgdW5kZWZpbmVkIG9uIHh0ZW5zYSwgZml4IGl0IGZvciBwZXJmICovCisjZGVmaW5lIE1BUF9VTklOSVRJQUxJWkVECTAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvZ3Bpby9ncGlvLWV2ZW50LW1vbi5jIGIvdG9vbHMvZ3Bpby9ncGlvLWV2ZW50LW1vbi5jCmluZGV4IDQ0OGVkOTYuLjFjMTRjMjUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2dwaW8vZ3Bpby1ldmVudC1tb24uYworKysgYi90b29scy9ncGlvL2dwaW8tZXZlbnQtbW9uLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogZ3Bpby1oYW1tZXIgLSBleGFtcGxlIHN3aXNzIGFybXkga25pZmUgdG8gc2hha2UgR1BJTyBsaW5lcyBvbiBhIHN5c3RlbQorICogZ3Bpby1ldmVudC1tb24gLSBtb25pdG9yIEdQSU8gbGluZSBldmVudHMgZnJvbSB1c2Vyc3BhY2UKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTYgTGludXMgV2FsbGVpagogICoKZGlmZiAtLWdpdCBhL3Rvb2xzL2h2L2h2X2t2cF9kYWVtb24uYyBiL3Rvb2xzL2h2L2h2X2t2cF9kYWVtb24uYwppbmRleCAwZDlmNDhlLi5iYzdhZGI4IDEwMDY0NAotLS0gYS90b29scy9odi9odl9rdnBfZGFlbW9uLmMKKysrIGIvdG9vbHMvaHYvaHZfa3ZwX2RhZW1vbi5jCkBAIC0xNDMzLDcgKzE0MzMsNyBAQAogCW9wZW5sb2coIktWUCIsIDAsIExPR19VU0VSKTsKIAlzeXNsb2coTE9HX0lORk8sICJLVlAgc3RhcnRpbmc7IHBpZCBpczolZCIsIGdldHBpZCgpKTsKIAotCWt2cF9mZCA9IG9wZW4oIi9kZXYvdm1idXMvaHZfa3ZwIiwgT19SRFdSKTsKKwlrdnBfZmQgPSBvcGVuKCIvZGV2L3ZtYnVzL2h2X2t2cCIsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7CiAKIAlpZiAoa3ZwX2ZkIDwgMCkgewogCQlzeXNsb2coTE9HX0VSUiwgIm9wZW4gL2Rldi92bWJ1cy9odl9rdnAgZmFpbGVkOyBlcnJvcjogJWQgJXMiLApkaWZmIC0tZ2l0IGEvdG9vbHMvaHYvaHZfdnNzX2RhZW1vbi5jIGIvdG9vbHMvaHYvaHZfdnNzX2RhZW1vbi5jCmluZGV4IDVkNTFkNmYuLmUwODI5ODAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2h2L2h2X3Zzc19kYWVtb24uYworKysgYi90b29scy9odi9odl92c3NfZGFlbW9uLmMKQEAgLTI1MCw2ICsyNTAsOSBAQAogCQkJCXN5c2xvZyhMT0dfRVJSLCAiL2V0Yy9mc3RhYiBhbmQgL3Byb2MvbW91bnRzIik7CiAJCQl9CiAJCQlicmVhazsKKwkJY2FzZSBWU1NfT1BfSE9UX0JBQ0tVUDoKKwkJCXN5c2xvZyhMT0dfSU5GTywgIlZTUzogb3A9Q0hFQ0sgSE9UIEJBQ0tVUFxuIik7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXN5c2xvZyhMT0dfRVJSLCAiSWxsZWdhbCBvcDolZFxuIiwgb3ApOwogCQl9CmRpZmYgLS1naXQgYS90b29scy9paW8vaWlvX2dlbmVyaWNfYnVmZmVyLmMgYi90b29scy9paW8vaWlvX2dlbmVyaWNfYnVmZmVyLmMKaW5kZXggMGU4YTFmNy4uZjM5YzBlOSAxMDA2NDQKLS0tIGEvdG9vbHMvaWlvL2lpb19nZW5lcmljX2J1ZmZlci5jCisrKyBiL3Rvb2xzL2lpby9paW9fZ2VuZXJpY19idWZmZXIuYwpAQCAtMzQ4LDcgKzM0OCw3IEBACiAJaW50IG5vdHJpZ2dlciA9IDA7CiAJY2hhciAqZHVtbXk7CiAKLQlzdHJ1Y3QgaWlvX2NoYW5uZWxfaW5mbyAqY2hhbm5lbHM7CisJc3RydWN0IGlpb19jaGFubmVsX2luZm8gKmNoYW5uZWxzID0gTlVMTDsKIAogCXJlZ2lzdGVyX2NsZWFudXAoKTsKIApAQCAtNDU2LDcgKzQ1Niw3IEBACiAKIAlpZiAobm90cmlnZ2VyKSB7CiAJCXByaW50ZigidHJpZ2dlci1sZXNzIG1vZGUgc2VsZWN0ZWRcbiIpOwotCX0gaWYgKHRyaWdfbnVtID49IDApIHsKKwl9IGVsc2UgaWYgKHRyaWdfbnVtID49IDApIHsKIAkJY2hhciAqdHJpZ19kZXZfbmFtZTsKIAkJcmV0ID0gYXNwcmludGYoJnRyaWdfZGV2X25hbWUsICIlc3RyaWdnZXIlZCIsIGlpb19kaXIsIHRyaWdfbnVtKTsKIAkJaWYgKHJldCA8IDApIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL2lpby9paW9fdXRpbHMuYyBiL3Rvb2xzL2lpby9paW9fdXRpbHMuYwppbmRleCA1ZWI2NzkzLi43YTZkNjFjIDEwMDY0NAotLS0gYS90b29scy9paW8vaWlvX3V0aWxzLmMKKysrIGIvdG9vbHMvaWlvL2lpb191dGlscy5jCkBAIC0xMjEsMTAgKzEyMSw2IEBACiAKIAlyZXQgPSAtRU5PRU5UOwogCXdoaWxlIChlbnQgPSByZWFkZGlyKGRwKSwgZW50KQotCQkvKgotCQkgKiBEbyB3ZSBhbGxvdyBkZXZpY2VzIHRvIG92ZXJyaWRlIGEgZ2VuZXJpYyBuYW1lIHdpdGgKLQkJICogYSBzcGVjaWZpYyBvbmU/Ci0JCSAqLwogCQlpZiAoKHN0cmNtcChidWlsdG5hbWUsIGVudC0+ZF9uYW1lKSA9PSAwKSB8fAogCQkgICAgKHN0cmNtcChidWlsdG5hbWVfZ2VuZXJpYywgZW50LT5kX25hbWUpID09IDApKSB7CiAJCQlyZXQgPSBhc3ByaW50ZigmZmlsZW5hbWUsCkBAIC0xNzgsNiArMTc0LDEzIEBACiAJCQlzeXNmc2ZwID0gMDsKIAkJCWZyZWUoZmlsZW5hbWUpOwogCQkJZmlsZW5hbWUgPSAwOworCisJCQkvKgorCQkJICogQXZvaWQgaGF2aW5nIGEgbW9yZSBnZW5lcmljIGVudHJ5IG92ZXJ3cml0aW5nCisJCQkgKiB0aGUgc2V0dGluZ3MuCisJCQkgKi8KKwkJCWlmIChzdHJjbXAoYnVpbHRuYW1lLCBlbnQtPmRfbmFtZSkgPT0gMCkKKwkJCQlicmVhazsKIAkJfQogCiBlcnJvcl9jbG9zZV9zeXNmc2ZwOgpkaWZmIC0tZ2l0IGEvdG9vbHMvaWlvL2xzaWlvLmMgYi90b29scy9paW8vbHNpaW8uYwppbmRleCAzZDY1MGU2Li5hYjBmNWNmIDEwMDY0NAotLS0gYS90b29scy9paW8vbHNpaW8uYworKysgYi90b29scy9paW8vbHNpaW8uYwpAQCAtNTEsNyArNTEsOCBAQAogCiAJd2hpbGUgKGVudCA9IHJlYWRkaXIoZHApLCBlbnQpCiAJCWlmIChjaGVja19wcmVmaXgoZW50LT5kX25hbWUsICJpbl8iKSAmJgotCQkgICAgY2hlY2tfcG9zdGZpeChlbnQtPmRfbmFtZSwgIl9yYXciKSkKKwkJICAgKGNoZWNrX3Bvc3RmaXgoZW50LT5kX25hbWUsICJfcmF3IikgfHwKKwkJICAgIGNoZWNrX3Bvc3RmaXgoZW50LT5kX25hbWUsICJfaW5wdXQiKSkpCiAJCQlwcmludGYoIiAgICUtMTBzXG4iLCBlbnQtPmRfbmFtZSk7CiAKIAlyZXR1cm4gKGNsb3NlZGlyKGRwKSA9PSAtMSkgPyAtZXJybm8gOiAwOwpkaWZmIC0tZ2l0IGEvdG9vbHMvaW5jbHVkZS9saW51eC9jb3Jlc2lnaHQtcG11LmggYi90b29scy9pbmNsdWRlL2xpbnV4L2NvcmVzaWdodC1wbXUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDQxMDI2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaW5jbHVkZS9saW51eC9jb3Jlc2lnaHQtcG11LmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodChDKSAyMDE1IExpbmFybyBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQXV0aG9yOiBNYXRoaWV1IFBvaXJpZXIgPG1hdGhpZXUucG9pcmllckBsaW5hcm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfTElOVVhfQ09SRVNJR0hUX1BNVV9ICisjZGVmaW5lIF9MSU5VWF9DT1JFU0lHSFRfUE1VX0gKKworI2RlZmluZSBDT1JFU0lHSFRfRVRNX1BNVV9OQU1FICJjc19ldG0iCisjZGVmaW5lIENPUkVTSUdIVF9FVE1fUE1VX1NFRUQgIDB4MTAKKworLyogRVRNdjMuNS9QVE0ncyBFVE1DUiBjb25maWcgYml0ICovCisjZGVmaW5lIEVUTV9PUFRfQ1lDQUNDICAxMgorI2RlZmluZSBFVE1fT1BUX1RTICAgICAgMjgKKworc3RhdGljIGlubGluZSBpbnQgY29yZXNpZ2h0X2dldF90cmFjZV9pZChpbnQgY3B1KQoreworCS8qCisJICogQSB0cmFjZSBJRCBvZiB2YWx1ZSAwIGlzIGludmFsaWQsIHNvIGxldCdzIHN0YXJ0IGF0IHNvbWUKKwkgKiByYW5kb20gdmFsdWUgdGhhdCBmaXRzIGluIDcgYml0cyBhbmQgZ28gZnJvbSB0aGVyZS4gIFNpbmNlCisJICogdGhlIGNvbW1vbiBjb252ZW50aW9uIGlzIHRvIGhhdmUgZGF0YSB0cmFjZSBJRHMgYmUgSShOKSArIDEsCisJICogc2V0IGluc3RydWN0aW9uIHRyYWNlIElEcyBhcyBhIGZ1bmN0aW9uIG9mIHRoZSBDUFUgbnVtYmVyLgorCSAqLworCXJldHVybiAoQ09SRVNJR0hUX0VUTV9QTVVfU0VFRCArIChjcHUgKiAyKSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvaW5jbHVkZS9saW51eC9zdHJpbmcuaCBiL3Rvb2xzL2luY2x1ZGUvbGludXgvc3RyaW5nLmgKaW5kZXggYjk2ODc5NC4uZjQzNmQyNCAxMDA2NDQKLS0tIGEvdG9vbHMvaW5jbHVkZS9saW51eC9zdHJpbmcuaAorKysgYi90b29scy9pbmNsdWRlL2xpbnV4L3N0cmluZy5oCkBAIC04LDcgKzgsMTEgQEAKIAogaW50IHN0cnRvYm9vbChjb25zdCBjaGFyICpzLCBib29sICpyZXMpOwogCi0jaWZkZWYgX19HTElCQ19fCisvKgorICogZ2xpYmMgYmFzZWQgYnVpbGRzIG5lZWRzIHRoZSBleHRlcm4gd2hpbGUgdUNsaWJjIGRvZXNuJ3QuCisgKiBIb3dldmVyIHVDbGliYyBoZWFkZXJzIGFsc28gZGVmaW5lIF9fR0xJQkNfXyBoZW5jZSB0aGUgaGFjayBiZWxvdworICovCisjaWYgZGVmaW5lZChfX0dMSUJDX18pICYmICFkZWZpbmVkKF9fVUNMSUJDX18pCiBleHRlcm4gc2l6ZV90IHN0cmxjcHkoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgc2l6ZSk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvdG9vbHMvaW5jbHVkZS9saW51eC90aW1lNjQuaCBiL3Rvb2xzL2luY2x1ZGUvbGludXgvdGltZTY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY5MjY1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2luY2x1ZGUvbGludXgvdGltZTY0LmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfVE9PTFNfTElOVVhfVElNRTY0X0gKKyNkZWZpbmUgX1RPT0xTX0xJTlVYX1RJTUU2NF9ICisKKyNkZWZpbmUgTVNFQ19QRVJfU0VDCTEwMDBMCisjZGVmaW5lIFVTRUNfUEVSX01TRUMJMTAwMEwKKyNkZWZpbmUgTlNFQ19QRVJfVVNFQwkxMDAwTAorI2RlZmluZSBOU0VDX1BFUl9NU0VDCTEwMDAwMDBMCisjZGVmaW5lIFVTRUNfUEVSX1NFQwkxMDAwMDAwTAorI2RlZmluZSBOU0VDX1BFUl9TRUMJMTAwMDAwMDAwMEwKKyNkZWZpbmUgRlNFQ19QRVJfU0VDCTEwMDAwMDAwMDAwMDAwMDBMTAorCisjZW5kaWYgLyogX0xJTlVYX1RJTUU2NF9IICovCmRpZmYgLS1naXQgYS90b29scy9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvbW1hbi1jb21tb24uaCBiL3Rvb2xzL2luY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy9tbWFuLWNvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4Mjc0MzgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvbW1hbi1jb21tb24uaApAQCAtMCwwICsxLDc1IEBACisjaWZuZGVmIF9fQVNNX0dFTkVSSUNfTU1BTl9DT01NT05fSAorI2RlZmluZSBfX0FTTV9HRU5FUklDX01NQU5fQ09NTU9OX0gKKworLyoKKyBBdXRob3I6IE1pY2hhZWwgUy4gVHNpcmtpbiA8bXN0QG1lbGxhbm94LmNvLmlsPiwgTWVsbGFub3ggVGVjaG5vbG9naWVzIEx0ZC4KKyBCYXNlZCBvbjogYXNtLXh4eC9tbWFuLmgKKyovCisKKyNkZWZpbmUgUFJPVF9SRUFECTB4MQkJLyogcGFnZSBjYW4gYmUgcmVhZCAqLworI2RlZmluZSBQUk9UX1dSSVRFCTB4MgkJLyogcGFnZSBjYW4gYmUgd3JpdHRlbiAqLworI2RlZmluZSBQUk9UX0VYRUMJMHg0CQkvKiBwYWdlIGNhbiBiZSBleGVjdXRlZCAqLworI2RlZmluZSBQUk9UX1NFTQkweDgJCS8qIHBhZ2UgbWF5IGJlIHVzZWQgZm9yIGF0b21pYyBvcHMgKi8KKyNkZWZpbmUgUFJPVF9OT05FCTB4MAkJLyogcGFnZSBjYW4gbm90IGJlIGFjY2Vzc2VkICovCisjZGVmaW5lIFBST1RfR1JPV1NET1dOCTB4MDEwMDAwMDAJLyogbXByb3RlY3QgZmxhZzogZXh0ZW5kIGNoYW5nZSB0byBzdGFydCBvZiBncm93c2Rvd24gdm1hICovCisjZGVmaW5lIFBST1RfR1JPV1NVUAkweDAyMDAwMDAwCS8qIG1wcm90ZWN0IGZsYWc6IGV4dGVuZCBjaGFuZ2UgdG8gZW5kIG9mIGdyb3dzdXAgdm1hICovCisKKyNkZWZpbmUgTUFQX1NIQVJFRAkweDAxCQkvKiBTaGFyZSBjaGFuZ2VzICovCisjZGVmaW5lIE1BUF9QUklWQVRFCTB4MDIJCS8qIENoYW5nZXMgYXJlIHByaXZhdGUgKi8KKyNkZWZpbmUgTUFQX1RZUEUJMHgwZgkJLyogTWFzayBmb3IgdHlwZSBvZiBtYXBwaW5nICovCisjZGVmaW5lIE1BUF9GSVhFRAkweDEwCQkvKiBJbnRlcnByZXQgYWRkciBleGFjdGx5ICovCisjZGVmaW5lIE1BUF9BTk9OWU1PVVMJMHgyMAkJLyogZG9uJ3QgdXNlIGEgZmlsZSAqLworI2lmZGVmIENPTkZJR19NTUFQX0FMTE9XX1VOSU5JVElBTElaRUQKKyMgZGVmaW5lIE1BUF9VTklOSVRJQUxJWkVEIDB4NDAwMDAwMAkvKiBGb3IgYW5vbnltb3VzIG1tYXAsIG1lbW9yeSBjb3VsZCBiZSB1bmluaXRpYWxpemVkICovCisjZWxzZQorIyBkZWZpbmUgTUFQX1VOSU5JVElBTElaRUQgMHgwCQkvKiBEb24ndCBzdXBwb3J0IHRoaXMgZmxhZyAqLworI2VuZGlmCisKKy8qCisgKiBGbGFncyBmb3IgbWxvY2sKKyAqLworI2RlZmluZSBNTE9DS19PTkZBVUxUCTB4MDEJCS8qIExvY2sgcGFnZXMgaW4gcmFuZ2UgYWZ0ZXIgdGhleSBhcmUgZmF1bHRlZCBpbiwgZG8gbm90IHByZWZhdWx0ICovCisKKyNkZWZpbmUgTVNfQVNZTkMJMQkJLyogc3luYyBtZW1vcnkgYXN5bmNocm9ub3VzbHkgKi8KKyNkZWZpbmUgTVNfSU5WQUxJREFURQkyCQkvKiBpbnZhbGlkYXRlIHRoZSBjYWNoZXMgKi8KKyNkZWZpbmUgTVNfU1lOQwkJNAkJLyogc3luY2hyb25vdXMgbWVtb3J5IHN5bmMgKi8KKworI2RlZmluZSBNQURWX05PUk1BTAkwCQkvKiBubyBmdXJ0aGVyIHNwZWNpYWwgdHJlYXRtZW50ICovCisjZGVmaW5lIE1BRFZfUkFORE9NCTEJCS8qIGV4cGVjdCByYW5kb20gcGFnZSByZWZlcmVuY2VzICovCisjZGVmaW5lIE1BRFZfU0VRVUVOVElBTAkyCQkvKiBleHBlY3Qgc2VxdWVudGlhbCBwYWdlIHJlZmVyZW5jZXMgKi8KKyNkZWZpbmUgTUFEVl9XSUxMTkVFRAkzCQkvKiB3aWxsIG5lZWQgdGhlc2UgcGFnZXMgKi8KKyNkZWZpbmUgTUFEVl9ET05UTkVFRAk0CQkvKiBkb24ndCBuZWVkIHRoZXNlIHBhZ2VzICovCisKKy8qIGNvbW1vbiBwYXJhbWV0ZXJzOiB0cnkgdG8ga2VlcCB0aGVzZSBjb25zaXN0ZW50IGFjcm9zcyBhcmNoaXRlY3R1cmVzICovCisjZGVmaW5lIE1BRFZfRlJFRQk4CQkvKiBmcmVlIHBhZ2VzIG9ubHkgaWYgbWVtb3J5IHByZXNzdXJlICovCisjZGVmaW5lIE1BRFZfUkVNT1ZFCTkJCS8qIHJlbW92ZSB0aGVzZSBwYWdlcyAmIHJlc291cmNlcyAqLworI2RlZmluZSBNQURWX0RPTlRGT1JLCTEwCQkvKiBkb24ndCBpbmhlcml0IGFjcm9zcyBmb3JrICovCisjZGVmaW5lIE1BRFZfRE9GT1JLCTExCQkvKiBkbyBpbmhlcml0IGFjcm9zcyBmb3JrICovCisjZGVmaW5lIE1BRFZfSFdQT0lTT04JMTAwCQkvKiBwb2lzb24gYSBwYWdlIGZvciB0ZXN0aW5nICovCisjZGVmaW5lIE1BRFZfU09GVF9PRkZMSU5FIDEwMQkJLyogc29mdCBvZmZsaW5lIHBhZ2UgZm9yIHRlc3RpbmcgKi8KKworI2RlZmluZSBNQURWX01FUkdFQUJMRSAgIDEyCQkvKiBLU00gbWF5IG1lcmdlIGlkZW50aWNhbCBwYWdlcyAqLworI2RlZmluZSBNQURWX1VOTUVSR0VBQkxFIDEzCQkvKiBLU00gbWF5IG5vdCBtZXJnZSBpZGVudGljYWwgcGFnZXMgKi8KKworI2RlZmluZSBNQURWX0hVR0VQQUdFCTE0CQkvKiBXb3J0aCBiYWNraW5nIHdpdGggaHVnZXBhZ2VzICovCisjZGVmaW5lIE1BRFZfTk9IVUdFUEFHRQkxNQkJLyogTm90IHdvcnRoIGJhY2tpbmcgd2l0aCBodWdlcGFnZXMgKi8KKworI2RlZmluZSBNQURWX0RPTlREVU1QICAgMTYJCS8qIEV4cGxpY2l0eSBleGNsdWRlIGZyb20gdGhlIGNvcmUgZHVtcCwKKwkJCQkJICAgb3ZlcnJpZGVzIHRoZSBjb3JlZHVtcCBmaWx0ZXIgYml0cyAqLworI2RlZmluZSBNQURWX0RPRFVNUAkxNwkJLyogQ2xlYXIgdGhlIE1BRFZfRE9OVERVTVAgZmxhZyAqLworCisvKiBjb21wYXRpYmlsaXR5IGZsYWdzICovCisjZGVmaW5lIE1BUF9GSUxFCTAKKworLyoKKyAqIFdoZW4gTUFQX0hVR0VUTEIgaXMgc2V0IGJpdHMgWzI2OjMxXSBlbmNvZGUgdGhlIGxvZzIgb2YgdGhlIGh1Z2UgcGFnZSBzaXplLgorICogVGhpcyBnaXZlcyB1cyA2IGJpdHMsIHdoaWNoIGlzIGVub3VnaCB1bnRpbCBzb21lb25lIGludmVudHMgMTI4IGJpdCBhZGRyZXNzCisgKiBzcGFjZXMuCisgKgorICogQXNzdW1lIHRoZXNlIGFyZSBhbGwgcG93ZXIgb2YgdHdvcy4KKyAqIFdoZW4gMCB1c2UgdGhlIGRlZmF1bHQgcGFnZSBzaXplLgorICovCisjZGVmaW5lIE1BUF9IVUdFX1NISUZUCTI2CisjZGVmaW5lIE1BUF9IVUdFX01BU0sJMHgzZgorCisjZW5kaWYgLyogX19BU01fR0VORVJJQ19NTUFOX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS90b29scy9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvbW1hbi5oIGIvdG9vbHMvaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGZhNzg1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL21tYW4uaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9fQVNNX0dFTkVSSUNfTU1BTl9ICisjZGVmaW5lIF9fQVNNX0dFTkVSSUNfTU1BTl9ICisKKyNpbmNsdWRlIDx1YXBpL2FzbS1nZW5lcmljL21tYW4tY29tbW9uLmg+CisKKyNkZWZpbmUgTUFQX0dST1dTRE9XTgkweDAxMDAJCS8qIHN0YWNrLWxpa2Ugc2VnbWVudCAqLworI2RlZmluZSBNQVBfREVOWVdSSVRFCTB4MDgwMAkJLyogRVRYVEJTWSAqLworI2RlZmluZSBNQVBfRVhFQ1VUQUJMRQkweDEwMDAJCS8qIG1hcmsgaXQgYXMgYW4gZXhlY3V0YWJsZSAqLworI2RlZmluZSBNQVBfTE9DS0VECTB4MjAwMAkJLyogcGFnZXMgYXJlIGxvY2tlZCAqLworI2RlZmluZSBNQVBfTk9SRVNFUlZFCTB4NDAwMAkJLyogZG9uJ3QgY2hlY2sgZm9yIHJlc2VydmF0aW9ucyAqLworI2RlZmluZSBNQVBfUE9QVUxBVEUJMHg4MDAwCQkvKiBwb3B1bGF0ZSAocHJlZmF1bHQpIHBhZ2V0YWJsZXMgKi8KKyNkZWZpbmUgTUFQX05PTkJMT0NLCTB4MTAwMDAJCS8qIGRvIG5vdCBibG9jayBvbiBJTyAqLworI2RlZmluZSBNQVBfU1RBQ0sJMHgyMDAwMAkJLyogZ2l2ZSBvdXQgYW4gYWRkcmVzcyB0aGF0IGlzIGJlc3Qgc3VpdGVkIGZvciBwcm9jZXNzL3RocmVhZCBzdGFja3MgKi8KKyNkZWZpbmUgTUFQX0hVR0VUTEIJMHg0MDAwMAkJLyogY3JlYXRlIGEgaHVnZSBwYWdlIG1hcHBpbmcgKi8KKworLyogQml0cyBbMjY6MzFdIGFyZSByZXNlcnZlZCwgc2VlIG1tYW4tY29tbW9uLmggZm9yIE1BUF9IVUdFVExCIHVzYWdlICovCisKKyNkZWZpbmUgTUNMX0NVUlJFTlQJMQkJLyogbG9jayBhbGwgY3VycmVudCBtYXBwaW5ncyAqLworI2RlZmluZSBNQ0xfRlVUVVJFCTIJCS8qIGxvY2sgYWxsIGZ1dHVyZSBtYXBwaW5ncyAqLworI2RlZmluZSBNQ0xfT05GQVVMVAk0CQkvKiBsb2NrIGFsbCBwYWdlcyB0aGF0IGFyZSBmYXVsdGVkIGluICovCisKKyNlbmRpZiAvKiBfX0FTTV9HRU5FUklDX01NQU5fSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L21tYW4uaCBiL3Rvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFkOGVkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9tbWFuLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBfVUFQSV9MSU5VWF9NTUFOX0gKKyNkZWZpbmUgX1VBUElfTElOVVhfTU1BTl9ICisKKyNpbmNsdWRlIDx1YXBpL2FzbS9tbWFuLmg+CisKKyNkZWZpbmUgTVJFTUFQX01BWU1PVkUJMQorI2RlZmluZSBNUkVNQVBfRklYRUQJMgorCisjZGVmaW5lIE9WRVJDT01NSVRfR1VFU1MJCTAKKyNkZWZpbmUgT1ZFUkNPTU1JVF9BTFdBWVMJCTEKKyNkZWZpbmUgT1ZFUkNPTU1JVF9ORVZFUgkJMgorCisjZW5kaWYgLyogX1VBUElfTElOVVhfTU1BTl9IICovCmRpZmYgLS1naXQgYS90b29scy9sZ3Vlc3QvbGd1ZXN0LmMgYi90b29scy9sZ3Vlc3QvbGd1ZXN0LmMKaW5kZXggZDk4MzZjNS4uMTFjOGQ5YiAxMDA2NDQKLS0tIGEvdG9vbHMvbGd1ZXN0L2xndWVzdC5jCisrKyBiL3Rvb2xzL2xndWVzdC9sZ3Vlc3QuYwpAQCAtMzI2Niw2ICszMjY2LDkgQEAKIAkJfQogCX0KIAorCS8qIElmIHdlIGV4aXQgdmlhIGVycigpLCB0aGlzIGtpbGxzIGFsbCB0aGUgdGhyZWFkcywgcmVzdG9yZXMgdHR5LiAqLworCWF0ZXhpdChjbGVhbnVwX2RldmljZXMpOworCiAJLyogV2UgYWx3YXlzIGhhdmUgYSBjb25zb2xlIGRldmljZSwgYW5kIGl0J3MgYWx3YXlzIGRldmljZSAxLiAqLwogCXNldHVwX2NvbnNvbGUoKTsKIApAQCAtMzM2OSw5ICszMzcyLDYgQEAKIAkvKiBFbnN1cmUgdGhhdCB3ZSB0ZXJtaW5hdGUgaWYgYSBkZXZpY2Utc2VydmljaW5nIGNoaWxkIGRpZXMuICovCiAJc2lnbmFsKFNJR0NITEQsIGtpbGxfbGF1bmNoZXIpOwogCi0JLyogSWYgd2UgZXhpdCB2aWEgZXJyKCksIHRoaXMga2lsbHMgYWxsIHRoZSB0aHJlYWRzLCByZXN0b3JlcyB0dHkuICovCi0JYXRleGl0KGNsZWFudXBfZGV2aWNlcyk7Ci0KIAkvKiBJZiByZXF1ZXN0ZWQsIGNocm9vdCB0byBhIGRpcmVjdG9yeSAqLwogCWlmIChjaHJvb3RfcGF0aCkgewogCQlpZiAoY2hyb290KGNocm9vdF9wYXRoKSAhPSAwKQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2FwaS9mcy9mcy5jIGIvdG9vbHMvbGliL2FwaS9mcy9mcy5jCmluZGV4IGJhNzA5NGIuLmY5OWY0OWU0IDEwMDY0NAotLS0gYS90b29scy9saWIvYXBpL2ZzL2ZzLmMKKysrIGIvdG9vbHMvbGliL2FwaS9mcy9mcy5jCkBAIC0zNCw2ICszNCwxMCBAQAogI2RlZmluZSBUUkFDRUZTX01BR0lDICAgICAgICAgIDB4NzQ3MjYxNjMKICNlbmRpZgogCisjaWZuZGVmIEhVR0VUTEJGU19NQUdJQworI2RlZmluZSBIVUdFVExCRlNfTUFHSUMgICAgICAgIDB4OTU4NDU4ZjYKKyNlbmRpZgorCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHN5c2ZzX19mc19rbm93bl9tb3VudHBvaW50c1tdID0gewogCSIvc3lzIiwKIAkwLApAQCAtNjcsNiArNzEsMTAgQEAKIAkwLAogfTsKIAorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBodWdldGxiZnNfX2tub3duX21vdW50cG9pbnRzW10gPSB7CisJMCwKK307CisKIHN0cnVjdCBmcyB7CiAJY29uc3QgY2hhcgkJKm5hbWU7CiAJY29uc3QgY2hhciAqIGNvbnN0CSptb3VudHM7CkBAIC04MCw2ICs4OCw3IEBACiAJRlNfX1BST0NGUyAgPSAxLAogCUZTX19ERUJVR0ZTID0gMiwKIAlGU19fVFJBQ0VGUyA9IDMsCisJRlNfX0hVR0VUTEJGUyA9IDQsCiB9OwogCiAjaWZuZGVmIFRSQUNFRlNfTUFHSUMKQEAgLTEwNyw2ICsxMTYsMTEgQEAKIAkJLm1vdW50cwk9IHRyYWNlZnNfX2tub3duX21vdW50cG9pbnRzLAogCQkubWFnaWMJPSBUUkFDRUZTX01BR0lDLAogCX0sCisJW0ZTX19IVUdFVExCRlNdID0geworCQkubmFtZQk9ICJodWdldGxiZnMiLAorCQkubW91bnRzID0gaHVnZXRsYmZzX19rbm93bl9tb3VudHBvaW50cywKKwkJLm1hZ2ljCT0gSFVHRVRMQkZTX01BR0lDLAorCX0sCiB9OwogCiBzdGF0aWMgYm9vbCBmc19fcmVhZF9tb3VudHMoc3RydWN0IGZzICpmcykKQEAgLTI2NSw2ICsyNzksNyBAQAogRlMocHJvY2ZzLCAgRlNfX1BST0NGUyk7CiBGUyhkZWJ1Z2ZzLCBGU19fREVCVUdGUyk7CiBGUyh0cmFjZWZzLCBGU19fVFJBQ0VGUyk7CitGUyhodWdldGxiZnMsIEZTX19IVUdFVExCRlMpOwogCiBpbnQgZmlsZW5hbWVfX3JlYWRfaW50KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgKnZhbHVlKQogewpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2FwaS9mcy9mcy5oIGIvdG9vbHMvbGliL2FwaS9mcy9mcy5oCmluZGV4IDE2YzljMmUuLmE2MzI2OWYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xpYi9hcGkvZnMvZnMuaAorKysgYi90b29scy9saWIvYXBpL2ZzL2ZzLmgKQEAgLTIxLDYgKzIxLDcgQEAKIEZTKHByb2NmcykKIEZTKGRlYnVnZnMpCiBGUyh0cmFjZWZzKQorRlMoaHVnZXRsYmZzKQogCiAjdW5kZWYgRlMKIApkaWZmIC0tZ2l0IGEvdG9vbHMvb2JqdG9vbC9idWlsdGluLWNoZWNrLmMgYi90b29scy9vYmp0b29sL2J1aWx0aW4tY2hlY2suYwppbmRleCBiZDA5ZDBlLi4xNDNiNmNkIDEwMDY0NAotLS0gYS90b29scy9vYmp0b29sL2J1aWx0aW4tY2hlY2suYworKysgYi90b29scy9vYmp0b29sL2J1aWx0aW4tY2hlY2suYwpAQCAtMTc1LDYgKzE3NSw3IEBACiAJCSJfX3N0YWNrX2Noa19mYWlsIiwKIAkJInBhbmljIiwKIAkJImRvX2V4aXQiLAorCQkiZG9fdGFza19kZWFkIiwKIAkJIl9fbW9kdWxlX3B1dF9hbmRfZXhpdCIsCiAJCSJjb21wbGV0ZV9hbmRfZXhpdCIsCiAJCSJrdm1fc3B1cmlvdXNfZmF1bHQiLApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtY29uZmlnLnR4dCBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLWNvbmZpZy50eHQKaW5kZXggMTU5NDllMi4uY2IwODFhYzUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLWNvbmZpZy50eHQKKysrIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtY29uZmlnLnR4dApAQCAtMTEwLDYgKzExMCwxNCBAQAogCQlvcmRlciA9IGNhbGxlcgogCQlzb3J0LWtleSA9IGZ1bmN0aW9uCiAKKwlbcmVwb3J0XQorCQkjIERlZmF1bHRzCisJCXNvcnQtb3JkZXIgPSBjb21tLGRzbyxzeW1ib2wKKwkJcGVyY2VudC1saW1pdCA9IDAKKwkJcXVldWUtc2l6ZSA9IDAKKwkJY2hpbGRyZW4gPSB0cnVlCisJCWdyb3VwID0gdHJ1ZQorCiBWYXJpYWJsZXMKIH5+fn5+fn5+fgogCkBAIC0zODIsNiArMzkwLDEwIEBACiAJCWhpc3RvZ3JhbSBlbnRyeS4gRGVmYXVsdCBpcyAwIHdoaWNoIG1lYW5zIG5vIGxpbWl0YXRpb24uCiAKIHJlcG9ydC4qOjoKKwlyZXBvcnQuc29ydF9vcmRlcjo6CisJCUFsbG93cyBjaGFuZ2luZyB0aGUgZGVmYXVsdCBzb3J0IG9yZGVyIGZyb20gImNvbW0sZHNvLHN5bWJvbCIgdG8KKwkJc29tZSBvdGhlciBkZWZhdWx0LCBmb3IgaW5zdGFuY2UgInN5bSxkc28iIG1heSBiZSBtb3JlIGZpdHRpbmcgZm9yCisJCWtlcm5lbCBkZXZlbG9wZXJzLgogCXJlcG9ydC5wZXJjZW50LWxpbWl0OjoKIAkJVGhpcyBvbmUgaXMgbW9zdGx5IHRoZSBzYW1lIGFzIGNhbGwtZ3JhcGgudGhyZXNob2xkIGJ1dCB3b3JrcyBmb3IKIAkJaGlzdG9ncmFtIGVudHJpZXMuIEVudHJpZXMgaGF2aW5nIGFuIG92ZXJoZWFkIGxvd2VyIHRoYW4gdGhpcwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcHJvYmUudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcHJvYmUudHh0CmluZGV4IGIzMDNiY2QuLmU2Yzk5MDIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXByb2JlLnR4dAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1wcm9iZS50eHQKQEAgLTIxLDYgKzIxLDggQEAKICdwZXJmIHByb2JlJyBbb3B0aW9uc10gLS12YXJzPSdQUk9CRVBPSU5UJwogb3IKICdwZXJmIHByb2JlJyBbb3B0aW9uc10gLS1mdW5jcworb3IKKydwZXJmIHByb2JlJyBbb3B0aW9uc10gLS1kZWZpbml0aW9uPSdQUk9CRScgWy4uLl0KIAogREVTQ1JJUFRJT04KIC0tLS0tLS0tLS0tCkBAIC0zNCw2ICszNiw4IEBACiAtazo6CiAtLXZtbGludXg9UEFUSDo6CiAJU3BlY2lmeSB2bWxpbnV4IHBhdGggd2hpY2ggaGFzIGRlYnVnaW5mbyAoRHdhcmYgYmluYXJ5KS4KKwlPbmx5IHdoZW4gdXNpbmcgdGhpcyB3aXRoIC0tZGVmaW5pdGlvbiwgeW91IGNhbiBnaXZlIGFuIG9mZmxpbmUKKwl2bWxpbnV4IGZpbGUuCiAKIC1tOjoKIC0tbW9kdWxlPU1PRE5BTUV8UEFUSDo6CkBAIC05Niw2ICsxMDAsMTEgQEAKIAljYW4gYWxzbyBsaXN0IGZ1bmN0aW9ucyBpbiBhIHVzZXIgc3BhY2UgZXhlY3V0YWJsZSAvIHNoYXJlZCBsaWJyYXJ5LgogCVRoaXMgYWxzbyBjYW4gYWNjZXB0IGEgRklMVEVSIHJ1bGUgYXJndW1lbnQuCiAKKy1EOjoKKy0tZGVmaW5pdGlvbj06OgorCVNob3cgdHJhY2UtZXZlbnQgZGVmaW5pdGlvbiBjb252ZXJ0ZWQgZnJvbSBnaXZlbiBwcm9iZS1ldmVudCBpbnN0ZWFkCisJb2Ygd3JpdGUgaXQgaW50byB0cmFjaW5nL1trLHVdcHJvYmVfZXZlbnRzLgorCiAtLWZpbHRlcj1GSUxURVI6OgogCShPbmx5IGZvciAtLXZhcnMgYW5kIC0tZnVuY3MpIFNldCBmaWx0ZXIuIEZJTFRFUiBpcyBhIGNvbWJpbmF0aW9uIG9mIGdsb2IKIAlwYXR0ZXJuLCBzZWUgRklMVEVSIFBBVFRFUk4gZm9yIGRldGFpbC4KQEAgLTE3NiwxMyArMTg1LDEyIEBACiAKICdOQU1FJyBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhpcyBhcmd1bWVudCAob3B0aW9uYWwpLiBZb3UgY2FuIHVzZSB0aGUgbmFtZSBvZiBsb2NhbCB2YXJpYWJsZSwgbG9jYWwgZGF0YSBzdHJ1Y3R1cmUgbWVtYmVyIChlLmcuIHZhci0+ZmllbGQsIHZhci5maWVsZDIpLCBsb2NhbCBhcnJheSB3aXRoIGZpeGVkIGluZGV4IChlLmcuIGFycmF5WzFdLCB2YXItPmFycmF5WzBdLCB2YXItPnBvaW50ZXJbMl0pLCBvciBrcHJvYmUtdHJhY2VyIGFyZ3VtZW50IGZvcm1hdCAoZS5nLiAkcmV0dmFsLCAlYXgsIGV0YykuIE5vdGUgdGhhdCB0aGUgbmFtZSBvZiB0aGlzIGFyZ3VtZW50IHdpbGwgYmUgc2V0IGFzIHRoZSBsYXN0IG1lbWJlciBuYW1lIGlmIHlvdSBzcGVjaWZ5IGEgbG9jYWwgZGF0YSBzdHJ1Y3R1cmUgbWVtYmVyIChlLmcuIGZpZWxkMiBmb3IgJ3Zhci0+ZmllbGQxLmZpZWxkMicuKQogJyR2YXJzJyBhbmQgJyRwYXJhbXMnIHNwZWNpYWwgYXJndW1lbnRzIGFyZSBhbHNvIGF2YWlsYWJsZSBmb3IgTkFNRSwgJyR2YXJzJyBpcyBleHBhbmRlZCB0byB0aGUgbG9jYWwgdmFyaWFibGVzIChpbmNsdWRpbmcgZnVuY3Rpb24gcGFyYW1ldGVycykgd2hpY2ggY2FuIGFjY2VzcyBhdCBnaXZlbiBwcm9iZSBwb2ludC4gJyRwYXJhbXMnIGlzIGV4cGFuZGVkIHRvIG9ubHkgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMuCi0nVFlQRScgY2FzdHMgdGhlIHR5cGUgb2YgdGhpcyBhcmd1bWVudCAob3B0aW9uYWwpLiBJZiBvbWl0dGVkLCBwZXJmIHByb2JlIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSB0eXBlIGJhc2VkIG9uIGRlYnVnaW5mby4gQ3VycmVudGx5LCBiYXNpYyB0eXBlcyAodTgvdTE2L3UzMi91NjQvczgvczE2L3MzMi9zNjQpLCBzaWduZWRuZXNzIGNhc3RpbmcgKHUvcyksICJzdHJpbmciIGFuZCBiaXRmaWVsZCBhcmUgc3VwcG9ydGVkLiAoc2VlIFRZUEVTIGZvciBkZXRhaWwpCi0KKydUWVBFJyBjYXN0cyB0aGUgdHlwZSBvZiB0aGlzIGFyZ3VtZW50IChvcHRpb25hbCkuIElmIG9taXR0ZWQsIHBlcmYgcHJvYmUgYXV0b21hdGljYWxseSBzZXQgdGhlIHR5cGUgYmFzZWQgb24gZGVidWdpbmZvICgqKS4gQ3VycmVudGx5LCBiYXNpYyB0eXBlcyAodTgvdTE2L3UzMi91NjQvczgvczE2L3MzMi9zNjQpLCBoZXhhZGVjaW1hbCBpbnRlZ2VycyAoeC94OC94MTYveDMyL3g2NCksIHNpZ25lZG5lc3MgY2FzdGluZyAodS9zKSwgInN0cmluZyIgYW5kIGJpdGZpZWxkIGFyZSBzdXBwb3J0ZWQuIChzZWUgVFlQRVMgZm9yIGRldGFpbCkKIE9uIHg4NiBzeXN0ZW1zICVSRUcgaXMgYWx3YXlzIHRoZSBzaG9ydCBmb3JtIG9mIHRoZSByZWdpc3RlcjogZm9yIGV4YW1wbGUgJUFYLiAlUkFYIG9yICVFQVggaXMgbm90IHZhbGlkLgogCiBUWVBFUwogLS0tLS0KLUJhc2ljIHR5cGVzICh1OC91MTYvdTMyL3U2NC9zOC9zMTYvczMyL3M2NCkgYXJlIGludGVnZXIgdHlwZXMuIFByZWZpeCAncycgYW5kICd1JyBtZWFucyB0aG9zZSB0eXBlcyBhcmUgc2lnbmVkIGFuZCB1bnNpZ25lZCByZXNwZWN0aXZlbHkuIFRyYWNlZCBhcmd1bWVudHMgYXJlIHNob3duIGluIGRlY2ltYWwgKHNpZ25lZCkgb3IgaGV4ICh1bnNpZ25lZCkuIFlvdSBjYW4gYWxzbyB1c2UgJ3MnIG9yICd1JyB0byBzcGVjaWZ5IG9ubHkgc2lnbmVkbmVzcyBhbmQgbGVhdmUgaXRzIHNpemUgYXV0by1kZXRlY3RlZCBieSBwZXJmIHByb2JlLgorQmFzaWMgdHlwZXMgKHU4L3UxNi91MzIvdTY0L3M4L3MxNi9zMzIvczY0KSBhbmQgaGV4YWRlY2ltYWwgaW50ZWdlcnMgKHg4L3gxNi94MzIveDY0KSBhcmUgaW50ZWdlciB0eXBlcy4gUHJlZml4ICdzJyBhbmQgJ3UnIG1lYW5zIHRob3NlIHR5cGVzIGFyZSBzaWduZWQgYW5kIHVuc2lnbmVkIHJlc3BlY3RpdmVseSwgYW5kICd4JyBtZWFucyB0aGF0IGlzIHNob3duIGluIGhleGFkZWNpbWFsIGZvcm1hdC4gVHJhY2VkIGFyZ3VtZW50cyBhcmUgc2hvd24gaW4gZGVjaW1hbCAoc05OL3VOTikgb3IgaGV4ICh4Tk4pLiBZb3UgY2FuIGFsc28gdXNlICdzJyBvciAndScgdG8gc3BlY2lmeSBvbmx5IHNpZ25lZG5lc3MgYW5kIGxlYXZlIGl0cyBzaXplIGF1dG8tZGV0ZWN0ZWQgYnkgcGVyZiBwcm9iZS4gTW9yZW92ZXIsIHlvdSBjYW4gdXNlICd4JyB0byBleHBsaWNpdGx5IHNwZWNpZnkgdG8gYmUgc2hvd24gaW4gaGV4YWRlY2ltYWwgKHRoZSBzaXplIGlzIGFsc28gYXV0by1kZXRlY3RlZCkuCiBTdHJpbmcgdHlwZSBpcyBhIHNwZWNpYWwgdHlwZSwgd2hpY2ggZmV0Y2hlcyBhICJudWxsLXRlcm1pbmF0ZWQiIHN0cmluZyBmcm9tIGtlcm5lbCBzcGFjZS4gVGhpcyBtZWFucyBpdCB3aWxsIGZhaWwgYW5kIHN0b3JlIE5VTEwgaWYgdGhlIHN0cmluZyBjb250YWluZXIgaGFzIGJlZW4gcGFnZWQgb3V0LiBZb3UgY2FuIHNwZWNpZnkgJ3N0cmluZycgdHlwZSBvbmx5IGZvciB0aGUgbG9jYWwgdmFyaWFibGUgb3Igc3RydWN0dXJlIG1lbWJlciB3aGljaCBpcyBhbiBhcnJheSBvZiBvciBhIHBvaW50ZXIgdG8gJ2NoYXInIG9yICd1bnNpZ25lZCBjaGFyJyB0eXBlLgogQml0ZmllbGQgaXMgYW5vdGhlciBzcGVjaWFsIHR5cGUsIHdoaWNoIHRha2VzIDMgcGFyYW1ldGVycywgYml0LXdpZHRoLCBiaXQtb2Zmc2V0LCBhbmQgY29udGFpbmVyLXNpemUgKHVzdWFsbHkgMzIpLiBUaGUgc3ludGF4IGlzOwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1yZWNvcmQudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcmVjb3JkLnR4dAppbmRleCAzNzlhMmJlLi45MjMzNTE5IDEwMDY0NAotLS0gYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1yZWNvcmQudHh0CisrKyBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXJlY29yZC50eHQKQEAgLTM1LDE1ICszNSwxNSBAQAogCiAJLSBhIHN5bWJvbGljYWxseSBmb3JtZWQgUE1VIGV2ZW50IGxpa2UgJ3BtdS9wYXJhbTE9MHgzLHBhcmFtMi8nIHdoZXJlCiAJICAncGFyYW0xJywgJ3BhcmFtMicsIGV0YyBhcmUgZGVmaW5lZCBhcyBmb3JtYXRzIGZvciB0aGUgUE1VIGluCi0JICAvc3lzL2J1cy9ldmVudF9zb3VyY2VzL2RldmljZXMvPHBtdT4vZm9ybWF0LyouCisJICAvc3lzL2J1cy9ldmVudF9zb3VyY2UvZGV2aWNlcy88cG11Pi9mb3JtYXQvKi4KIAogCS0gYSBzeW1ib2xpY2FsbHkgZm9ybWVkIGV2ZW50IGxpa2UgJ3BtdS9jb25maWc9TSxjb25maWcxPU4sY29uZmlnMz1LLycKIAogICAgICAgICAgIHdoZXJlIE0sIE4sIEsgYXJlIG51bWJlcnMgKGluIGRlY2ltYWwsIGhleCwgb2N0YWwgZm9ybWF0KS4gQWNjZXB0YWJsZQogICAgICAgICAgIHZhbHVlcyBmb3IgZWFjaCBvZiAnY29uZmlnJywgJ2NvbmZpZzEnIGFuZCAnY29uZmlnMicgYXJlIGRlZmluZWQgYnkKLSAgICAgICAgICBjb3JyZXNwb25kaW5nIGVudHJpZXMgaW4gL3N5cy9idXMvZXZlbnRfc291cmNlcy9kZXZpY2VzLzxwbXU+L2Zvcm1hdC8qCisgICAgICAgICAgY29ycmVzcG9uZGluZyBlbnRyaWVzIGluIC9zeXMvYnVzL2V2ZW50X3NvdXJjZS9kZXZpY2VzLzxwbXU+L2Zvcm1hdC8qCiAgICAgICAgICAgcGFyYW0xIGFuZCBwYXJhbTIgYXJlIGRlZmluZWQgYXMgZm9ybWF0cyBmb3IgdGhlIFBNVSBpbjoKLSAgICAgICAgICAvc3lzL2J1cy9ldmVudF9zb3VyY2VzL2RldmljZXMvPHBtdT4vZm9ybWF0LyoKKyAgICAgICAgICAvc3lzL2J1cy9ldmVudF9zb3VyY2UvZGV2aWNlcy88cG11Pi9mb3JtYXQvKgogCiAJICBUaGVyZSBhcmUgYWxzbyBzb21lIHBhcmFtcyB3aGljaCBhcmUgbm90IGRlZmluZWQgaW4gLi4uLzxwbXU+L2Zvcm1hdC8qLgogCSAgVGhlc2UgcGFyYW1zIGNhbiBiZSB1c2VkIHRvIG92ZXJsb2FkIGRlZmF1bHQgY29uZmlnIHZhbHVlcyBwZXIgZXZlbnQuCkBAIC02MCw2ICs2MCwxOCBAQAogCSAgTm90ZTogSWYgdXNlciBleHBsaWNpdGx5IHNldHMgb3B0aW9ucyB3aGljaCBjb25mbGljdCB3aXRoIHRoZSBwYXJhbXMsCiAJICB0aGUgdmFsdWUgc2V0IGJ5IHRoZSBwYXJhbXMgd2lsbCBiZSBvdmVycmlkZGVuLgogCisJICBBbHNvIG5vdCBkZWZpbmVkIGluIC4uLi88cG11Pi9mb3JtYXQvKiBhcmUgUE1VIGRyaXZlciBzcGVjaWZpYworCSAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLiAgQW55IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIHByZWNlZGVkIGJ5CisJICB0aGUgbGV0dGVyICdAJyBpcyBub3QgaW50ZXJwcmV0ZWQgaW4gdXNlciBzcGFjZSBhbmQgc2VudCBkb3duIGRpcmVjdGx5CisJICB0byB0aGUgUE1VIGRyaXZlci4gIEZvciBleGFtcGxlOgorCisJICBwZXJmIHJlY29yZCAtZSBzb21lX2V2ZW50L0BjZmcxLEBjZmcyPWNvbmZpZy8gLi4uCisKKwkgIHdpbGwgc2VlICdjZmcxJyBhbmQgJ2NmZzI9Y29uZmlnJyBwdXNoZWQgdG8gdGhlIFBNVSBkcml2ZXIgYXNzb2NpYXRlZAorCSAgd2l0aCB0aGUgZXZlbnQgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4gIFRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uIG9uCisJICB3aGF0IHRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlLCBhcyBsb25nIGFzIHRoZWlyIHNlbWFudGljIGlzCisJICB1bmRlcnN0b29kIGFuZCBzdXBwb3J0ZWQgYnkgdGhlIFBNVSBkcml2ZXIuCisKICAgICAgICAgLSBhIGhhcmR3YXJlIGJyZWFrcG9pbnQgZXZlbnQgaW4gdGhlIGZvcm0gb2YgJ1xtZW06YWRkclsvbGVuXVs6YWNjZXNzXScKICAgICAgICAgICB3aGVyZSBhZGRyIGlzIHRoZSBhZGRyZXNzIGluIG1lbW9yeSB5b3Ugd2FudCB0byBicmVhayBpbi4KICAgICAgICAgICBBY2Nlc3MgaXMgdGhlIG1lbW9yeSBhY2Nlc3MgdHlwZSAocmVhZCwgd3JpdGUsIGV4ZWN1dGUpIGl0IGNhbgpAQCAtNzcsOSArODksNjIgQEAKIAogLS1maWx0ZXI9PGZpbHRlcj46OgogICAgICAgICBFdmVudCBmaWx0ZXIuIFRoaXMgb3B0aW9uIHNob3VsZCBmb2xsb3cgYSBldmVudCBzZWxlY3RvciAoLWUpIHdoaWNoCi0Jc2VsZWN0cyB0cmFjZXBvaW50IGV2ZW50KHMpLiBNdWx0aXBsZSAnLS1maWx0ZXInIG9wdGlvbnMgYXJlIGNvbWJpbmVkCisJc2VsZWN0cyBlaXRoZXIgdHJhY2Vwb2ludCBldmVudChzKSBvciBhIGhhcmR3YXJlIHRyYWNlIFBNVQorCShlLmcuIEludGVsIFBUIG9yIENvcmVTaWdodCkuCisKKwktIHRyYWNlcG9pbnQgZmlsdGVycworCisJSW4gdGhlIGNhc2Ugb2YgdHJhY2Vwb2ludHMsIG11bHRpcGxlICctLWZpbHRlcicgb3B0aW9ucyBhcmUgY29tYmluZWQKIAl1c2luZyAnJiYnLgogCisJLSBhZGRyZXNzIGZpbHRlcnMKKworCUEgaGFyZHdhcmUgdHJhY2UgUE1VIGFkdmVydGlzZXMgaXRzIGFiaWxpdHkgdG8gYWNjZXB0IGEgbnVtYmVyIG9mCisJYWRkcmVzcyBmaWx0ZXJzCWJ5IHNwZWNpZnlpbmcgYSBub24temVybyB2YWx1ZSBpbgorCS9zeXMvYnVzL2V2ZW50X3NvdXJjZS9kZXZpY2VzLzxwbXU+L25yX2FkZHJfZmlsdGVycy4KKworCUFkZHJlc3MgZmlsdGVycyBoYXZlIHRoZSBmb3JtYXQ6CisKKwlmaWx0ZXJ8c3RhcnR8c3RvcHx0cmFjZXN0b3AgPHN0YXJ0PiBbLyA8c2l6ZT5dIFtAPGZpbGUgbmFtZT5dCisKKwlXaGVyZToKKwktICdmaWx0ZXInOiBkZWZpbmVzIGEgcmVnaW9uIHRoYXQgd2lsbCBiZSB0cmFjZWQuCisJLSAnc3RhcnQnOiBkZWZpbmVzIGFuIGFkZHJlc3MgYXQgd2hpY2ggdHJhY2luZyB3aWxsIGJlZ2luLgorCS0gJ3N0b3AnOiBkZWZpbmVzIGFuIGFkZHJlc3MgYXQgd2hpY2ggdHJhY2luZyB3aWxsIHN0b3AuCisJLSAndHJhY2VzdG9wJzogZGVmaW5lcyBhIHJlZ2lvbiBpbiB3aGljaCB0cmFjaW5nIHdpbGwgc3RvcC4KKworCTxmaWxlIG5hbWU+IGlzIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgZmlsZSwgPHN0YXJ0PiBpcyB0aGUgb2Zmc2V0IHRvIHRoZQorCWNvZGUgdG8gdHJhY2UgaW4gdGhhdCBmaWxlLCBhbmQgPHNpemU+IGlzIHRoZSBzaXplIG9mIHRoZSByZWdpb24gdG8KKwl0cmFjZS4gJ3N0YXJ0JyBhbmQgJ3N0b3AnIGZpbHRlcnMgbmVlZCBub3Qgc3BlY2lmeSBhIDxzaXplPi4KKworCUlmIG5vIG9iamVjdCBmaWxlIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBrZXJuZWwgaXMgYXNzdW1lZCwgaW4gd2hpY2ggY2FzZQorCXRoZSBzdGFydCBhZGRyZXNzIG11c3QgYmUgYSBjdXJyZW50IGtlcm5lbCBtZW1vcnkgYWRkcmVzcy4KKworCTxzdGFydD4gY2FuIGFsc28gYmUgc3BlY2lmaWVkIGJ5IHByb3ZpZGluZyB0aGUgbmFtZSBvZiBhIHN5bWJvbC4gSWYgdGhlCisJc3ltYm9sIG5hbWUgaXMgbm90IHVuaXF1ZSwgaXQgY2FuIGJlIGRpc2FtYmlndWF0ZWQgYnkgaW5zZXJ0aW5nICNuIHdoZXJlCisJJ24nIHNlbGVjdHMgdGhlIG4ndGggc3ltYm9sIGluIGFkZHJlc3Mgb3JkZXIuIEFsdGVybmF0ZWx5ICMwLCAjZyBvciAjRworCXNlbGVjdCBvbmx5IGEgZ2xvYmFsIHN5bWJvbC4gPHNpemU+IGNhbiBhbHNvIGJlIHNwZWNpZmllZCBieSBwcm92aWRpbmcKKwl0aGUgbmFtZSBvZiBhIHN5bWJvbCwgaW4gd2hpY2ggY2FzZSB0aGUgc2l6ZSBpcyBjYWxjdWxhdGVkIHRvIHRoZSBlbmQKKwlvZiB0aGF0IHN5bWJvbC4gRm9yICdmaWx0ZXInIGFuZCAndHJhY2VzdG9wJyBmaWx0ZXJzLCBpZiA8c2l6ZT4gaXMKKwlvbWl0dGVkIGFuZCA8c3RhcnQ+IGlzIGEgc3ltYm9sLCB0aGVuIHRoZSBzaXplIGlzIGNhbGN1bGF0ZWQgdG8gdGhlIGVuZAorCW9mIHRoYXQgc3ltYm9sLgorCisJSWYgPHNpemU+IGlzIG9taXR0ZWQgYW5kIDxzdGFydD4gaXMgJyonLCB0aGVuIHRoZSBzdGFydCBhbmQgc2l6ZSB3aWxsCisJYmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBmaXJzdCBhbmQgbGFzdCBzeW1ib2xzLCBpLmUuIHRvIHRyYWNlIHRoZSB3aG9sZQorCWZpbGUuCisKKwlJZiBzeW1ib2wgbmFtZXMgKG9yICcqJykgYXJlIHByb3ZpZGVkLCB0aGV5IG11c3QgYmUgc3Vycm91bmRlZCBieSB3aGl0ZQorCXNwYWNlLgorCisJVGhlIGZpbHRlciBwYXNzZWQgdG8gdGhlIGtlcm5lbCBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgZW50ZXJlZC4KKwlUbyBzZWUgdGhlIGZpbHRlciB0aGF0IGlzIHBhc3NlZCwgdXNlIHRoZSAtdiBvcHRpb24uCisKKwlUaGUga2VybmVsIG1heSBub3QgYmUgYWJsZSB0byBjb25maWd1cmUgYSB0cmFjZSByZWdpb24gaWYgaXQgaXMgbm90CisJd2l0aGluIGEgc2luZ2xlIG1hcHBpbmcuICBNTUFQIGV2ZW50cyAob3IgL3Byb2MvPHBpZD4vbWFwcykgY2FuIGJlCisJZXhhbWluZWQgdG8gZGV0ZXJtaW5lIGlmIHRoYXQgaXMgYSBwb3NzaWJpbGl0eS4KKworCU11bHRpcGxlIGZpbHRlcnMgY2FuIGJlIHNlcGFyYXRlZCB3aXRoIHNwYWNlIG9yIGNvbW1hLgorCiAtLWV4Y2x1ZGUtcGVyZjo6CiAJRG9uJ3QgcmVjb3JkIGV2ZW50cyBpc3N1ZWQgYnkgcGVyZiBpdHNlbGYuIFRoaXMgb3B0aW9uIHNob3VsZCBmb2xsb3cKIAlhIGV2ZW50IHNlbGVjdG9yICgtZSkgd2hpY2ggc2VsZWN0cyB0cmFjZXBvaW50IGV2ZW50KHMpLiBJdCBhZGRzIGEKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLmRhdGEtZmlsZS1mb3JtYXQudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYuZGF0YS1maWxlLWZvcm1hdC50eHQKaW5kZXggZmRjOTlmZS4uYjY2NGIxOCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYuZGF0YS1maWxlLWZvcm1hdC50eHQKKysrIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYuZGF0YS1maWxlLWZvcm1hdC50eHQKQEAgLTQzNyw2ICs0MzcsMTAgQEAKIHF1aXBwZXIKIAogVGhlIHF1aXBwZXIgQysrIHBhcnNlciBpcyBhdmFpbGFibGUgYXQKLWh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bW9zL3BsYXRmb3JtL2Nocm9taXVtb3Mtd2lkZS1wcm9maWxpbmcvCitodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW1vcy9wbGF0Zm9ybTIKKworSXQgaXMgdW5kZXIgdGhlIGNocm9taXVtb3Mtd2lkZS1wcm9maWxpbmcvIHN1YmRpcmVjdG9yeS4gVGhpcyBsaWJyYXJ5IGNhbgorY29udmVydCBhIHBlcmYgZGF0YSBmaWxlIHRvIGEgcHJvdG9idWYgYW5kIHZpY2UgdmVyc2EuCisKIFVuZm9ydHVuYXRlbHkgdGhpcyBwYXJzZXIgdGVuZHMgdG8gYmUgbWFueSB2ZXJzaW9ucyBiZWhpbmQgYW5kIG1heSBub3QgYmUgYWJsZQogdG8gcGFyc2UgZGF0YSBmaWxlcyBnZW5lcmF0ZWQgYnkgcmVjZW50IHBlcmYuCmRpZmYgLS1naXQgYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZmNvbmZpZy5leGFtcGxlIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmZjb25maWcuZXhhbXBsZQppbmRleCAxZDhkNWJjLi4yYjQ3N2MxIDEwMDY0NAotLS0gYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZmNvbmZpZy5leGFtcGxlCisrKyBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmY29uZmlnLmV4YW1wbGUKQEAgLTI3LDMgKzI3LDEyIEBACiAJdXNlX29mZnNldCA9IHRydWUKIAlqdW1wX2Fycm93cyA9IHRydWUKIAlzaG93X25yX2p1bXBzID0gZmFsc2UKKworW3JlcG9ydF0KKworCSMgRGVmYXVsdHMKKwlzb3J0LW9yZGVyID0gY29tbSxkc28sc3ltYm9sCisJcGVyY2VudC1saW1pdCA9IDAKKwlxdWV1ZS1zaXplID0gMAorCWNoaWxkcmVuID0gdHJ1ZQorCWdyb3VwID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9NQU5JRkVTVCBiL3Rvb2xzL3BlcmYvTUFOSUZFU1QKaW5kZXggYWQyNTM0ZC4uMGJkYTJjYyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9NQU5JRkVTVAorKysgYi90b29scy9wZXJmL01BTklGRVNUCkBAIC02MCwxNCArNjAsMTggQEAKIHRvb2xzL2luY2x1ZGUvbGludXgvYXRvbWljLmgKIHRvb2xzL2luY2x1ZGUvbGludXgvYml0b3BzLmgKIHRvb2xzL2luY2x1ZGUvbGludXgvY29tcGlsZXIuaAordG9vbHMvaW5jbHVkZS9saW51eC9jb3Jlc2lnaHQtcG11LmgKIHRvb2xzL2luY2x1ZGUvbGludXgvZmlsdGVyLmgKIHRvb2xzL2luY2x1ZGUvbGludXgvaGFzaC5oCiB0b29scy9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCiB0b29scy9pbmNsdWRlL2xpbnV4L2xpc3QuaAogdG9vbHMvaW5jbHVkZS9saW51eC9sb2cyLmgKK3Rvb2xzL2luY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy9tbWFuLWNvbW1vbi5oCit0b29scy9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvbW1hbi5oCiB0b29scy9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmgKIHRvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9icGZfY29tbW9uLmgKIHRvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9od19icmVha3BvaW50LmgKK3Rvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9tbWFuLmgKIHRvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9wZXJmX2V2ZW50LmgKIHRvb2xzL2luY2x1ZGUvbGludXgvcG9pc29uLmgKIHRvb2xzL2luY2x1ZGUvbGludXgvcmJ0cmVlLmgKQEAgLTc3LDQgKzgxLDYgQEAKIHRvb2xzL2luY2x1ZGUvbGludXgvdHlwZXMuaAogdG9vbHMvaW5jbHVkZS9saW51eC9lcnIuaAogdG9vbHMvaW5jbHVkZS9saW51eC9iaXRtYXAuaAordG9vbHMvaW5jbHVkZS9saW51eC90aW1lNjQuaAordG9vbHMvYXJjaC8qL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCiB0b29scy9hcmNoLyovaW5jbHVkZS91YXBpL2FzbS9wZXJmX3JlZ3MuaApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9NYWtlZmlsZS5jb25maWcgYi90b29scy9wZXJmL01ha2VmaWxlLmNvbmZpZwppbmRleCAyNDgwM2M1Li43MmVkZjgzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL01ha2VmaWxlLmNvbmZpZworKysgYi90b29scy9wZXJmL01ha2VmaWxlLmNvbmZpZwpAQCAtNzQ2LDEwICs3NDYsMTMgQEAKIGVuZGlmCiAKIGlmbmRlZiBOT19BVVhUUkFDRQotICBpZmVxICgkKGZlYXR1cmUtZ2V0X2NwdWlkKSwgMCkKLSAgICBtc2cgOj0gJCh3YXJuaW5nIFlvdXIgZ2NjIGxhY2tzIHRoZSBfX2dldF9jcHVpZCgpIGJ1aWx0aW4sIGRpc2FibGVzIHN1cHBvcnQgZm9yIGF1eHRyYWNlL0ludGVsIFBULCBwbGVhc2UgaW5zdGFsbCBhIG5ld2VyIGdjYyk7Ci0gICAgTk9fQVVYVFJBQ0UgOj0gMQotICBlbHNlCisgIGlmZXEgKCQoQVJDSCkseDg2KQorICAgIGlmZXEgKCQoZmVhdHVyZS1nZXRfY3B1aWQpLCAwKQorICAgICAgbXNnIDo9ICQod2FybmluZyBZb3VyIGdjYyBsYWNrcyB0aGUgX19nZXRfY3B1aWQoKSBidWlsdGluLCBkaXNhYmxlcyBzdXBwb3J0IGZvciBhdXh0cmFjZS9JbnRlbCBQVCwgcGxlYXNlIGluc3RhbGwgYSBuZXdlciBnY2MpOworICAgICAgTk9fQVVYVFJBQ0UgOj0gMQorICAgIGVuZGlmCisgIGVuZGlmCisgIGlmbmRlZiBOT19BVVhUUkFDRQogICAgICQoY2FsbCBkZXRlY3RlZCxDT05GSUdfQVVYVFJBQ0UpCiAgICAgQ0ZMQUdTICs9IC1ESEFWRV9BVVhUUkFDRV9TVVBQT1JUCiAgIGVuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL01ha2VmaWxlLnBlcmYgYi90b29scy9wZXJmL01ha2VmaWxlLnBlcmYKaW5kZXggMmQ5MDg3NS4uZDcxMGRiMSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9NYWtlZmlsZS5wZXJmCisrKyBiL3Rvb2xzL3BlcmYvTWFrZWZpbGUucGVyZgpAQCAtMTY1LDcgKzE2NSw3IEBACiAjIG5vbi1jb25maWcgY2FzZXMKIGNvbmZpZyA6PSAxCiAKLU5PTl9DT05GSUdfVEFSR0VUUyA6PSBjbGVhbiBUQUdTIHRhZ3MgY3Njb3BlIGhlbHAKK05PTl9DT05GSUdfVEFSR0VUUyA6PSBjbGVhbiBUQUdTIHRhZ3MgY3Njb3BlIGhlbHAgaW5zdGFsbC1kb2MKIAogaWZkZWYgTUFLRUNNREdPQUxTCiBpZmVxICgkKGZpbHRlci1vdXQgJChOT05fQ09ORklHX1RBUkdFVFMpLCQoTUFLRUNNREdPQUxTKSksKQpAQCAtNDI5LDYgKzQyOSwxOCBAQAogCUAodGVzdCAtZiAuLi8uLi9pbmNsdWRlL2FzbS1nZW5lcmljL2JpdG9wcy9mbHM2NC5oICYmICggXAogICAgICAgICAoZGlmZiAtQiAuLi9pbmNsdWRlL2FzbS1nZW5lcmljL2JpdG9wcy9mbHM2NC5oIC4uLy4uL2luY2x1ZGUvYXNtLWdlbmVyaWMvYml0b3BzL2ZsczY0LmggPi9kZXYvbnVsbCkgXAogICAgICAgICB8fCBlY2hvICJXYXJuaW5nOiB0b29scy9pbmNsdWRlL2FzbS1nZW5lcmljL2JpdG9wcy9mbHM2NC5oIGRpZmZlcnMgZnJvbSBrZXJuZWwiID4mMiApKSB8fCB0cnVlCisJQCh0ZXN0IC1mIC4uLy4uL2luY2x1ZGUvbGludXgvY29yZXNpZ2h0LXBtdS5oICYmICggXAorCShkaWZmIC1CIC4uL2luY2x1ZGUvbGludXgvY29yZXNpZ2h0LXBtdS5oIC4uLy4uL2luY2x1ZGUvbGludXgvY29yZXNpZ2h0LXBtdS5oID4vZGV2L251bGwpIFwKKwl8fCBlY2hvICJXYXJuaW5nOiB0b29scy9pbmNsdWRlL2xpbnV4L2NvcmVzaWdodC1wbXUuaCBkaWZmZXJzIGZyb20ga2VybmVsIiA+JjIgKSkgfHwgdHJ1ZQorCUAodGVzdCAtZiAuLi8uLi9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvbW1hbi1jb21tb24uaCAmJiAoIFwKKwkoZGlmZiAtQiAuLi9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvbW1hbi1jb21tb24uaCAuLi8uLi9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvbW1hbi1jb21tb24uaCA+L2Rldi9udWxsKSBcCisJfHwgZWNobyAiV2FybmluZzogdG9vbHMvaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL21tYW4tY29tbW9uLmggZGlmZmVycyBmcm9tIGtlcm5lbCIgPiYyICkpIHx8IHRydWUKKwlAKHRlc3QgLWYgLi4vLi4vaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL21tYW4uaCAmJiAoIFwKKwkoZGlmZiAtQiAtSSAiXiNpbmNsdWRlIDxcKHVhcGkvXCkqYXNtLWdlbmVyaWMvbW1hbi1jb21tb24uaD4kJCIgLi4vaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL21tYW4uaCAuLi8uLi9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvbW1hbi5oID4vZGV2L251bGwpIFwKKwl8fCBlY2hvICJXYXJuaW5nOiB0b29scy9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvbW1hbi5oIGRpZmZlcnMgZnJvbSBrZXJuZWwiID4mMiApKSB8fCB0cnVlCisJQCh0ZXN0IC1mIC4uLy4uL2luY2x1ZGUvdWFwaS9saW51eC9tbWFuLmggJiYgKCBcCisJKGRpZmYgLUIgLUkgIl4jaW5jbHVkZSA8XCh1YXBpL1wpKmFzbS9tbWFuLmg+JCQiIC4uL2luY2x1ZGUvdWFwaS9saW51eC9tbWFuLmggLi4vLi4vaW5jbHVkZS91YXBpL2xpbnV4L21tYW4uaCA+L2Rldi9udWxsKSBcCisJfHwgZWNobyAiV2FybmluZzogdG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L21tYW4uaCBkaWZmZXJzIGZyb20ga2VybmVsIiA+JjIgKSkgfHwgdHJ1ZQogCSQoUSkkKE1BS0UpICQoYnVpbGQpPXBlcmYKIAogJChPVVRQVVQpcGVyZjogJChQRVJGTElCUykgJChQRVJGX0lOKSAkKExJQlRSQUNFRVZFTlRfRFlOQU1JQ19MSVNUKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL2FybS9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaCBiL3Rvb2xzL3BlcmYvYXJjaC9hcm0vaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI5OGQwMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC9hcm0vaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmgKQEAgLTAsMCArMSw5IEBACisjaWZkZWYgREVGSU5FX0RXQVJGX1JFR1NUUl9UQUJMRQorLyogVGhpcyBpcyBpbmNsdWRlZCBpbiBwZXJmL3V0aWwvZHdhcmYtcmVncy5jICovCisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXJtX3JlZ3N0cl90YmxbXSA9IHsKKwkiJXIwIiwgIiVyMSIsICIlcjIiLCAiJXIzIiwgIiVyNCIsCisJIiVyNSIsICIlcjYiLCAiJXI3IiwgIiVyOCIsICIlcjkiLCAiJXIxMCIsCisJIiVmcCIsICIlaXAiLCAiJXNwIiwgIiVsciIsICIlcGMiLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL2FybS91dGlsL0J1aWxkIGIvdG9vbHMvcGVyZi9hcmNoL2FybS91dGlsL0J1aWxkCmluZGV4IGY5OGRhMTcuLmU2NGM1ZjIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYXJjaC9hcm0vdXRpbC9CdWlsZAorKysgYi90b29scy9wZXJmL2FyY2gvYXJtL3V0aWwvQnVpbGQKQEAgLTIsMyArMiw1IEBACiAKIGxpYnBlcmYtJChDT05GSUdfTE9DQUxfTElCVU5XSU5EKSAgICArPSB1bndpbmQtbGlidW53aW5kLm8KIGxpYnBlcmYtJChDT05GSUdfTElCRFdfRFdBUkZfVU5XSU5EKSArPSB1bndpbmQtbGliZHcubworCitsaWJwZXJmLSQoQ09ORklHX0FVWFRSQUNFKSArPSBwbXUubyBhdXh0cmFjZS5vIGNzLWV0bS5vCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gvYXJtL3V0aWwvYXV4dHJhY2UuYyBiL3Rvb2xzL3BlcmYvYXJjaC9hcm0vdXRpbC9hdXh0cmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZGYyY2IKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2FyY2gvYXJtL3V0aWwvYXV4dHJhY2UuYwpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0KEMpIDIwMTUgTGluYXJvIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBdXRob3I6IE1hdGhpZXUgUG9pcmllciA8bWF0aGlldS5wb2lyaWVyQGxpbmFyby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvcmVzaWdodC1wbXUuaD4KKworI2luY2x1ZGUgIi4uLy4uL3V0aWwvYXV4dHJhY2UuaCIKKyNpbmNsdWRlICIuLi8uLi91dGlsL2V2bGlzdC5oIgorI2luY2x1ZGUgIi4uLy4uL3V0aWwvcG11LmgiCisjaW5jbHVkZSAiY3MtZXRtLmgiCisKK3N0cnVjdCBhdXh0cmFjZV9yZWNvcmQKKyphdXh0cmFjZV9yZWNvcmRfX2luaXQoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsIGludCAqZXJyKQoreworCXN0cnVjdCBwZXJmX3BtdQkqY3NfZXRtX3BtdTsKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWw7CisJYm9vbCBmb3VuZF9ldG0gPSBmYWxzZTsKKworCWNzX2V0bV9wbXUgPSBwZXJmX3BtdV9fZmluZChDT1JFU0lHSFRfRVRNX1BNVV9OQU1FKTsKKworCWlmIChldmxpc3QpIHsKKwkJZXZsaXN0X19mb3JfZWFjaF9lbnRyeShldmxpc3QsIGV2c2VsKSB7CisJCQlpZiAoY3NfZXRtX3BtdSAmJgorCQkJICAgIGV2c2VsLT5hdHRyLnR5cGUgPT0gY3NfZXRtX3BtdS0+dHlwZSkKKwkJCQlmb3VuZF9ldG0gPSB0cnVlOworCQl9CisJfQorCisJaWYgKGZvdW5kX2V0bSkKKwkJcmV0dXJuIGNzX2V0bV9yZWNvcmRfaW5pdChlcnIpOworCisJLyoKKwkgKiBDbGVhciAnZXJyJyBldmVuIGlmIHdlIGhhdmVuJ3QgZm91bmQgYSBjc19ldG0gZXZlbnQgLSB0aGF0IHdheSBwZXJmCisJICogcmVjb3JkIGNhbiBzdGlsbCBiZSB1c2VkIGV2ZW4gaWYgdHJhY2VycyBhcmVuJ3QgcHJlc2VudC4gIFRoZSBOVUxMCisJICogcmV0dXJuIHZhbHVlIHdpbGwgdGFrZSBjYXJlIG9mIHRlbGxpbmcgdGhlIGluZnJhc3RydWN0dXJlIEhXIHRyYWNpbmcKKwkgKiBpc24ndCBhdmFpbGFibGUuCisJICovCisJKmVyciA9IDA7CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gvYXJtL3V0aWwvY3MtZXRtLmMgYi90b29scy9wZXJmL2FyY2gvYXJtL3V0aWwvY3MtZXRtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdkNTg0ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC9hcm0vdXRpbC9jcy1ldG0uYwpAQCAtMCwwICsxLDYxNyBAQAorLyoKKyAqIENvcHlyaWdodChDKSAyMDE1IExpbmFybyBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQXV0aG9yOiBNYXRoaWV1IFBvaXJpZXIgPG1hdGhpZXUucG9pcmllckBsaW5hcm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPGFwaS9mcy9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvcmVzaWdodC1wbXUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgImNzLWV0bS5oIgorI2luY2x1ZGUgIi4uLy4uL3BlcmYuaCIKKyNpbmNsdWRlICIuLi8uLi91dGlsL2F1eHRyYWNlLmgiCisjaW5jbHVkZSAiLi4vLi4vdXRpbC9jcHVtYXAuaCIKKyNpbmNsdWRlICIuLi8uLi91dGlsL2V2bGlzdC5oIgorI2luY2x1ZGUgIi4uLy4uL3V0aWwvZXZzZWwuaCIKKyNpbmNsdWRlICIuLi8uLi91dGlsL3BtdS5oIgorI2luY2x1ZGUgIi4uLy4uL3V0aWwvdGhyZWFkX21hcC5oIgorI2luY2x1ZGUgIi4uLy4uL3V0aWwvY3MtZXRtLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSBFTkFCTEVfU0lOS19NQVgJMTI4CisjZGVmaW5lIENTX0JVU19ERVZJQ0VfUEFUSCAiL2J1cy9jb3Jlc2lnaHQvZGV2aWNlcy8iCisKK3N0cnVjdCBjc19ldG1fcmVjb3JkaW5nIHsKKwlzdHJ1Y3QgYXV4dHJhY2VfcmVjb3JkCWl0cjsKKwlzdHJ1Y3QgcGVyZl9wbXUJCSpjc19ldG1fcG11OworCXN0cnVjdCBwZXJmX2V2bGlzdAkqZXZsaXN0OworCWJvb2wJCQlzbmFwc2hvdF9tb2RlOworCXNpemVfdAkJCXNuYXBzaG90X3NpemU7Cit9OworCitzdGF0aWMgYm9vbCBjc19ldG1faXNfZXRtdjQoc3RydWN0IGF1eHRyYWNlX3JlY29yZCAqaXRyLCBpbnQgY3B1KTsKKworc3RhdGljIGludCBjc19ldG1fcGFyc2Vfc25hcHNob3Rfb3B0aW9ucyhzdHJ1Y3QgYXV4dHJhY2VfcmVjb3JkICppdHIsCisJCQkJCSBzdHJ1Y3QgcmVjb3JkX29wdHMgKm9wdHMsCisJCQkJCSBjb25zdCBjaGFyICpzdHIpCit7CisJc3RydWN0IGNzX2V0bV9yZWNvcmRpbmcgKnB0ciA9CisJCQkJY29udGFpbmVyX29mKGl0ciwgc3RydWN0IGNzX2V0bV9yZWNvcmRpbmcsIGl0cik7CisJdW5zaWduZWQgbG9uZyBsb25nIHNuYXBzaG90X3NpemUgPSAwOworCWNoYXIgKmVuZHB0cjsKKworCWlmIChzdHIpIHsKKwkJc25hcHNob3Rfc2l6ZSA9IHN0cnRvdWxsKHN0ciwgJmVuZHB0ciwgMCk7CisJCWlmICgqZW5kcHRyIHx8IHNuYXBzaG90X3NpemUgPiBTSVpFX01BWCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlvcHRzLT5hdXh0cmFjZV9zbmFwc2hvdF9tb2RlID0gdHJ1ZTsKKwlvcHRzLT5hdXh0cmFjZV9zbmFwc2hvdF9zaXplID0gc25hcHNob3Rfc2l6ZTsKKwlwdHItPnNuYXBzaG90X3NpemUgPSBzbmFwc2hvdF9zaXplOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3NfZXRtX3JlY29yZGluZ19vcHRpb25zKHN0cnVjdCBhdXh0cmFjZV9yZWNvcmQgKml0ciwKKwkJCQkgICAgc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsCisJCQkJICAgIHN0cnVjdCByZWNvcmRfb3B0cyAqb3B0cykKK3sKKwlzdHJ1Y3QgY3NfZXRtX3JlY29yZGluZyAqcHRyID0KKwkJCQljb250YWluZXJfb2YoaXRyLCBzdHJ1Y3QgY3NfZXRtX3JlY29yZGluZywgaXRyKTsKKwlzdHJ1Y3QgcGVyZl9wbXUgKmNzX2V0bV9wbXUgPSBwdHItPmNzX2V0bV9wbXU7CisJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLCAqY3NfZXRtX2V2c2VsID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgY3B1X21hcCAqY3B1cyA9IGV2bGlzdC0+Y3B1czsKKwlib29sIHByaXZpbGVnZWQgPSAoZ2V0ZXVpZCgpID09IDAgfHwgcGVyZl9ldmVudF9wYXJhbm9pZCgpIDwgMCk7CisKKwlwdHItPmV2bGlzdCA9IGV2bGlzdDsKKwlwdHItPnNuYXBzaG90X21vZGUgPSBvcHRzLT5hdXh0cmFjZV9zbmFwc2hvdF9tb2RlOworCisJZXZsaXN0X19mb3JfZWFjaF9lbnRyeShldmxpc3QsIGV2c2VsKSB7CisJCWlmIChldnNlbC0+YXR0ci50eXBlID09IGNzX2V0bV9wbXUtPnR5cGUpIHsKKwkJCWlmIChjc19ldG1fZXZzZWwpIHsKKwkJCQlwcl9lcnIoIlRoZXJlIG1heSBiZSBvbmx5IG9uZSAlcyBldmVudFxuIiwKKwkJCQkgICAgICAgQ09SRVNJR0hUX0VUTV9QTVVfTkFNRSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlldnNlbC0+YXR0ci5mcmVxID0gMDsKKwkJCWV2c2VsLT5hdHRyLnNhbXBsZV9wZXJpb2QgPSAxOworCQkJY3NfZXRtX2V2c2VsID0gZXZzZWw7CisJCQlvcHRzLT5mdWxsX2F1eHRyYWNlID0gdHJ1ZTsKKwkJfQorCX0KKworCS8qIG5vIG5lZWQgdG8gY29udGludWUgaWYgYXQgbGVhc3Qgb25lIGV2ZW50IG9mIGludGVyZXN0IHdhcyBmb3VuZCAqLworCWlmICghY3NfZXRtX2V2c2VsKQorCQlyZXR1cm4gMDsKKworCWlmIChvcHRzLT51c2VfY2xvY2tpZCkgeworCQlwcl9lcnIoIkNhbm5vdCB1c2UgY2xvY2tpZCAoLWsgb3B0aW9uKSB3aXRoICVzXG4iLAorCQkgICAgICAgQ09SRVNJR0hUX0VUTV9QTVVfTkFNRSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHdlIGFyZSBpbiBzbmFwc2hvdCBtb2RlICovCisJaWYgKG9wdHMtPmF1eHRyYWNlX3NuYXBzaG90X21vZGUpIHsKKwkJLyoKKwkJICogTm8gc2l6ZSB3ZXJlIGdpdmVuIHRvICctUycgb3IgJy1tLCcsIHNvIGdvIHdpdGgKKwkJICogdGhlIGRlZmF1bHQKKwkJICovCisJCWlmICghb3B0cy0+YXV4dHJhY2Vfc25hcHNob3Rfc2l6ZSAmJgorCQkgICAgIW9wdHMtPmF1eHRyYWNlX21tYXBfcGFnZXMpIHsKKwkJCWlmIChwcml2aWxlZ2VkKSB7CisJCQkJb3B0cy0+YXV4dHJhY2VfbW1hcF9wYWdlcyA9IE1pQig0KSAvIHBhZ2Vfc2l6ZTsKKwkJCX0gZWxzZSB7CisJCQkJb3B0cy0+YXV4dHJhY2VfbW1hcF9wYWdlcyA9CisJCQkJCQkJS2lCKDEyOCkgLyBwYWdlX3NpemU7CisJCQkJaWYgKG9wdHMtPm1tYXBfcGFnZXMgPT0gVUlOVF9NQVgpCisJCQkJCW9wdHMtPm1tYXBfcGFnZXMgPSBLaUIoMjU2KSAvIHBhZ2Vfc2l6ZTsKKwkJCX0KKwkJfSBlbHNlIGlmICghb3B0cy0+YXV4dHJhY2VfbW1hcF9wYWdlcyAmJiAhcHJpdmlsZWdlZCAmJgorCQkJCQkJb3B0cy0+bW1hcF9wYWdlcyA9PSBVSU5UX01BWCkgeworCQkJb3B0cy0+bW1hcF9wYWdlcyA9IEtpQigyNTYpIC8gcGFnZV9zaXplOworCQl9CisKKwkJLyoKKwkJICogJy1tLHh5eicgd2FzIHNwZWNpZmllZCBidXQgbm8gc25hcHNob3Qgc2l6ZSwgc28gbWFrZSB0aGUKKwkJICogc25hcHNob3Qgc2l6ZSBhcyBiaWcgYXMgdGhlIGF1eHRyYWNlIG1tYXAgYXJlYS4KKwkJICovCisJCWlmICghb3B0cy0+YXV4dHJhY2Vfc25hcHNob3Rfc2l6ZSkgeworCQkJb3B0cy0+YXV4dHJhY2Vfc25hcHNob3Rfc2l6ZSA9CisJCQkJb3B0cy0+YXV4dHJhY2VfbW1hcF9wYWdlcyAqIChzaXplX3QpcGFnZV9zaXplOworCQl9CisKKwkJLyoKKwkJICogLVN4eXogd2FzIHNwZWNpZmllZCBidXQgbm8gYXV4dHJhY2UgbW1hcCBhcmVhLCBzbyBtYWtlIHRoZQorCQkgKiBhdXh0cmFjZSBtbWFwIGFyZWEgYmlnIGVub3VnaCB0byBmaXQgdGhlIHJlcXVlc3RlZCBzbmFwc2hvdAorCQkgKiBzaXplLgorCQkgKi8KKwkJaWYgKCFvcHRzLT5hdXh0cmFjZV9tbWFwX3BhZ2VzKSB7CisJCQlzaXplX3Qgc3ogPSBvcHRzLT5hdXh0cmFjZV9zbmFwc2hvdF9zaXplOworCisJCQlzeiA9IHJvdW5kX3VwKHN6LCBwYWdlX3NpemUpIC8gcGFnZV9zaXplOworCQkJb3B0cy0+YXV4dHJhY2VfbW1hcF9wYWdlcyA9IHJvdW5kdXBfcG93X29mX3R3byhzeik7CisJCX0KKworCQkvKiBTbmFwc2hvc3Qgc2l6ZSBjYW4ndCBiZSBiaWdnZXIgdGhhbiB0aGUgYXV4dHJhY2UgYXJlYSAqLworCQlpZiAob3B0cy0+YXV4dHJhY2Vfc25hcHNob3Rfc2l6ZSA+CisJCQkJb3B0cy0+YXV4dHJhY2VfbW1hcF9wYWdlcyAqIChzaXplX3QpcGFnZV9zaXplKSB7CisJCQlwcl9lcnIoIlNuYXBzaG90IHNpemUgJXp1IG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiBBVVggYXJlYSB0cmFjaW5nIG1tYXAgc2l6ZSAlenVcbiIsCisJCQkgICAgICAgb3B0cy0+YXV4dHJhY2Vfc25hcHNob3Rfc2l6ZSwKKwkJCSAgICAgICBvcHRzLT5hdXh0cmFjZV9tbWFwX3BhZ2VzICogKHNpemVfdClwYWdlX3NpemUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBTb21ldGhpbmcgd2VudCB3cm9uZyBzb21ld2hlcmUgLSB0aGlzIHNob3VsZG4ndCBoYXBwZW4gKi8KKwkJaWYgKCFvcHRzLT5hdXh0cmFjZV9zbmFwc2hvdF9zaXplIHx8CisJCSAgICAhb3B0cy0+YXV4dHJhY2VfbW1hcF9wYWdlcykgeworCQkJcHJfZXJyKCJGYWlsZWQgdG8gY2FsY3VsYXRlIGRlZmF1bHQgc25hcHNob3Qgc2l6ZSBhbmQvb3IgQVVYIGFyZWEgdHJhY2luZyBtbWFwIHBhZ2VzXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJLyogV2UgYXJlIGluIGZ1bGwgdHJhY2UgbW9kZSBidXQgJy1tLHh5eicgd2Fzbid0IHNwZWNpZmllZCAqLworCWlmIChvcHRzLT5mdWxsX2F1eHRyYWNlICYmICFvcHRzLT5hdXh0cmFjZV9tbWFwX3BhZ2VzKSB7CisJCWlmIChwcml2aWxlZ2VkKSB7CisJCQlvcHRzLT5hdXh0cmFjZV9tbWFwX3BhZ2VzID0gTWlCKDQpIC8gcGFnZV9zaXplOworCQl9IGVsc2UgeworCQkJb3B0cy0+YXV4dHJhY2VfbW1hcF9wYWdlcyA9IEtpQigxMjgpIC8gcGFnZV9zaXplOworCQkJaWYgKG9wdHMtPm1tYXBfcGFnZXMgPT0gVUlOVF9NQVgpCisJCQkJb3B0cy0+bW1hcF9wYWdlcyA9IEtpQigyNTYpIC8gcGFnZV9zaXplOworCQl9CisKKwl9CisKKwkvKiBWYWxpZGF0ZSBhdXh0cmFjZV9tbWFwX3BhZ2VzIHByb3ZpZGVkIGJ5IHVzZXIgKi8KKwlpZiAob3B0cy0+YXV4dHJhY2VfbW1hcF9wYWdlcykgeworCQl1bnNpZ25lZCBpbnQgbWF4X3BhZ2UgPSAoS2lCKDEyOCkgLyBwYWdlX3NpemUpOworCQlzaXplX3Qgc3ogPSBvcHRzLT5hdXh0cmFjZV9tbWFwX3BhZ2VzICogKHNpemVfdClwYWdlX3NpemU7CisKKwkJaWYgKCFwcml2aWxlZ2VkICYmCisJCSAgICBvcHRzLT5hdXh0cmFjZV9tbWFwX3BhZ2VzID4gbWF4X3BhZ2UpIHsKKwkJCW9wdHMtPmF1eHRyYWNlX21tYXBfcGFnZXMgPSBtYXhfcGFnZTsKKwkJCXByX2VycigiYXV4dHJhY2UgdG9vIGJpZywgdHJ1bmNhdGluZyB0byAlZFxuIiwKKwkJCSAgICAgICBtYXhfcGFnZSk7CisJCX0KKworCQlpZiAoIWlzX3Bvd2VyX29mXzIoc3opKSB7CisJCQlwcl9lcnIoIkludmFsaWQgbW1hcCBzaXplIGZvciAlczogbXVzdCBiZSBhIHBvd2VyIG9mIDJcbiIsCisJCQkgICAgICAgQ09SRVNJR0hUX0VUTV9QTVVfTkFNRSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCWlmIChvcHRzLT5hdXh0cmFjZV9zbmFwc2hvdF9tb2RlKQorCQlwcl9kZWJ1ZzIoIiVzIHNuYXBzaG90IHNpemU6ICV6dVxuIiwgQ09SRVNJR0hUX0VUTV9QTVVfTkFNRSwKKwkJCSAgb3B0cy0+YXV4dHJhY2Vfc25hcHNob3Rfc2l6ZSk7CisKKwlpZiAoY3NfZXRtX2V2c2VsKSB7CisJCS8qCisJCSAqIFRvIG9idGFpbiB0aGUgYXV4dHJhY2UgYnVmZmVyIGZpbGUgZGVzY3JpcHRvciwgdGhlIGF1eHRyYWNlCisJCSAqIGV2ZW50IG11c3QgY29tZSBmaXJzdC4KKwkJICovCisJCXBlcmZfZXZsaXN0X190b19mcm9udChldmxpc3QsIGNzX2V0bV9ldnNlbCk7CisJCS8qCisJCSAqIEluIHRoZSBjYXNlIG9mIHBlci1jcHUgbW1hcHMsIHdlIG5lZWQgdGhlIENQVSBvbiB0aGUKKwkJICogQVVYIGV2ZW50LgorCQkgKi8KKwkJaWYgKCFjcHVfbWFwX19lbXB0eShjcHVzKSkKKwkJCXBlcmZfZXZzZWxfX3NldF9zYW1wbGVfYml0KGNzX2V0bV9ldnNlbCwgQ1BVKTsKKwl9CisKKwkvKiBBZGQgZHVtbXkgZXZlbnQgdG8ga2VlcCB0cmFja2luZyAqLworCWlmIChvcHRzLT5mdWxsX2F1eHRyYWNlKSB7CisJCXN0cnVjdCBwZXJmX2V2c2VsICp0cmFja2luZ19ldnNlbDsKKwkJaW50IGVycjsKKworCQllcnIgPSBwYXJzZV9ldmVudHMoZXZsaXN0LCAiZHVtbXk6dSIsIE5VTEwpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQl0cmFja2luZ19ldnNlbCA9IHBlcmZfZXZsaXN0X19sYXN0KGV2bGlzdCk7CisJCXBlcmZfZXZsaXN0X19zZXRfdHJhY2tpbmdfZXZlbnQoZXZsaXN0LCB0cmFja2luZ19ldnNlbCk7CisKKwkJdHJhY2tpbmdfZXZzZWwtPmF0dHIuZnJlcSA9IDA7CisJCXRyYWNraW5nX2V2c2VsLT5hdHRyLnNhbXBsZV9wZXJpb2QgPSAxOworCisJCS8qIEluIHBlci1jcHUgY2FzZSwgYWx3YXlzIG5lZWQgdGhlIHRpbWUgb2YgbW1hcCBldmVudHMgZXRjICovCisJCWlmICghY3B1X21hcF9fZW1wdHkoY3B1cykpCisJCQlwZXJmX2V2c2VsX19zZXRfc2FtcGxlX2JpdCh0cmFja2luZ19ldnNlbCwgVElNRSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1NjQgY3NfZXRtX2dldF9jb25maWcoc3RydWN0IGF1eHRyYWNlX3JlY29yZCAqaXRyKQoreworCXU2NCBjb25maWcgPSAwOworCXN0cnVjdCBjc19ldG1fcmVjb3JkaW5nICpwdHIgPQorCQkJY29udGFpbmVyX29mKGl0ciwgc3RydWN0IGNzX2V0bV9yZWNvcmRpbmcsIGl0cik7CisJc3RydWN0IHBlcmZfcG11ICpjc19ldG1fcG11ID0gcHRyLT5jc19ldG1fcG11OworCXN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0ID0gcHRyLT5ldmxpc3Q7CisJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsOworCisJZXZsaXN0X19mb3JfZWFjaF9lbnRyeShldmxpc3QsIGV2c2VsKSB7CisJCWlmIChldnNlbC0+YXR0ci50eXBlID09IGNzX2V0bV9wbXUtPnR5cGUpIHsKKwkJCS8qCisJCQkgKiBWYXJpYWJsZSBwZXJmX2V2ZW50X2F0dHI6OmNvbmZpZyBpcyBhc3NpZ25lZCB0bworCQkJICogRVRNdjMvUFRNLiAgVGhlIGJpdCBmaWVsZHMgaGF2ZSBiZWVuIG1hZGUgdG8gbWF0Y2gKKwkJCSAqIHRoZSBFVE12My41IEVUUk1DUiByZWdpc3RlciBzcGVjaWZpY2F0aW9uLiAgU2VlIHRoZQorCQkJICogUE1VX0ZPUk1BVF9BVFRSKCkgZGVjbGFyYXRpb25zIGluCisJCQkgKiBkcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXBlcmYuYyBmb3IKKwkJCSAqIGRldGFpbHMuCisJCQkgKi8KKwkJCWNvbmZpZyA9IGV2c2VsLT5hdHRyLmNvbmZpZzsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGNvbmZpZzsKK30KKworc3RhdGljIHNpemVfdAorY3NfZXRtX2luZm9fcHJpdl9zaXplKHN0cnVjdCBhdXh0cmFjZV9yZWNvcmQgKml0ciBfX21heWJlX3VudXNlZCwKKwkJICAgICAgc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QgX19tYXliZV91bnVzZWQpCit7CisJaW50IGk7CisJaW50IGV0bXYzID0gMCwgZXRtdjQgPSAwOworCWNvbnN0IHN0cnVjdCBjcHVfbWFwICpjcHVzID0gZXZsaXN0LT5jcHVzOworCisJLyogY3B1IG1hcCBpcyBub3QgZW1wdHksIHdlIGhhdmUgc3BlY2lmaWMgQ1BVcyB0byB3b3JrIHdpdGggKi8KKwlpZiAoIWNwdV9tYXBfX2VtcHR5KGNwdXMpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBjcHVfbWFwX19ucihjcHVzKTsgaSsrKSB7CisJCQlpZiAoY3NfZXRtX2lzX2V0bXY0KGl0ciwgY3B1cy0+bWFwW2ldKSkKKwkJCQlldG12NCsrOworCQkJZWxzZQorCQkJCWV0bXYzKys7CisJCX0KKwl9IGVsc2UgeworCQkvKiBnZXQgY29uZmlndXJhdGlvbiBmb3IgYWxsIENQVXMgaW4gdGhlIHN5c3RlbSAqLworCQlmb3IgKGkgPSAwOyBpIDwgY3B1X19tYXhfY3B1KCk7IGkrKykgeworCQkJaWYgKGNzX2V0bV9pc19ldG12NChpdHIsIGkpKQorCQkJCWV0bXY0Kys7CisJCQllbHNlCisJCQkJZXRtdjMrKzsKKwkJfQorCX0KKworCXJldHVybiAoQ1NfRVRNX0hFQURFUl9TSVpFICsKKwkgICAgICAgKGV0bXY0ICogQ1NfRVRNVjRfUFJJVl9TSVpFKSArCisJICAgICAgIChldG12MyAqIENTX0VUTVYzX1BSSVZfU0laRSkpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqbWV0YWRhdGFfZXRtdjNfcm9bQ1NfRVRNX1BSSVZfTUFYXSA9IHsKKwlbQ1NfRVRNX0VUTUNDRVJdCT0gIm1nbXQvZXRtY2NlciIsCisJW0NTX0VUTV9FVE1JRFJdCQk9ICJtZ210L2V0bWlkciIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqbWV0YWRhdGFfZXRtdjRfcm9bQ1NfRVRNVjRfUFJJVl9NQVhdID0geworCVtDU19FVE1WNF9UUkNJRFIwXQkJPSAidHJjaWRyL3RyY2lkcjAiLAorCVtDU19FVE1WNF9UUkNJRFIxXQkJPSAidHJjaWRyL3RyY2lkcjEiLAorCVtDU19FVE1WNF9UUkNJRFIyXQkJPSAidHJjaWRyL3RyY2lkcjIiLAorCVtDU19FVE1WNF9UUkNJRFI4XQkJPSAidHJjaWRyL3RyY2lkcjgiLAorCVtDU19FVE1WNF9UUkNBVVRIU1RBVFVTXQk9ICJtZ210L3RyY2F1dGhzdGF0dXMiLAorfTsKKworc3RhdGljIGJvb2wgY3NfZXRtX2lzX2V0bXY0KHN0cnVjdCBhdXh0cmFjZV9yZWNvcmQgKml0ciwgaW50IGNwdSkKK3sKKwlib29sIHJldCA9IGZhbHNlOworCWNoYXIgcGF0aFtQQVRIX01BWF07CisJaW50IHNjYW47CisJdW5zaWduZWQgaW50IHZhbDsKKwlzdHJ1Y3QgY3NfZXRtX3JlY29yZGluZyAqcHRyID0KKwkJCWNvbnRhaW5lcl9vZihpdHIsIHN0cnVjdCBjc19ldG1fcmVjb3JkaW5nLCBpdHIpOworCXN0cnVjdCBwZXJmX3BtdSAqY3NfZXRtX3BtdSA9IHB0ci0+Y3NfZXRtX3BtdTsKKworCS8qIFRha2UgYW55IG9mIHRoZSBSTyBmaWxlcyBmb3IgRVRNdjQgYW5kIHNlZSBpZiBpdCBwcmVzZW50ICovCisJc25wcmludGYocGF0aCwgUEFUSF9NQVgsICJjcHUlZC8lcyIsCisJCSBjcHUsIG1ldGFkYXRhX2V0bXY0X3JvW0NTX0VUTVY0X1RSQ0lEUjBdKTsKKwlzY2FuID0gcGVyZl9wbXVfX3NjYW5fZmlsZShjc19ldG1fcG11LCBwYXRoLCAiJXgiLCAmdmFsKTsKKworCS8qIFRoZSBmaWxlIHdhcyByZWFkIHN1Y2Nlc3NmdWxseSwgd2UgaGF2ZSBhIHdpbm5lciAqLworCWlmIChzY2FuID09IDEpCisJCXJldCA9IHRydWU7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNzX2V0bV9nZXRfcm8oc3RydWN0IHBlcmZfcG11ICpwbXUsIGludCBjcHUsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJY2hhciBwbXVfcGF0aFtQQVRIX01BWF07CisJaW50IHNjYW47CisJdW5zaWduZWQgaW50IHZhbCA9IDA7CisKKwkvKiBHZXQgUk8gbWV0YWRhdGEgZnJvbSBzeXNmcyAqLworCXNucHJpbnRmKHBtdV9wYXRoLCBQQVRIX01BWCwgImNwdSVkLyVzIiwgY3B1LCBwYXRoKTsKKworCXNjYW4gPSBwZXJmX3BtdV9fc2Nhbl9maWxlKHBtdSwgcG11X3BhdGgsICIleCIsICZ2YWwpOworCWlmIChzY2FuICE9IDEpCisJCXByX2VycigiJXM6IGVycm9yIHJlYWRpbmc6ICVzXG4iLCBfX2Z1bmNfXywgcG11X3BhdGgpOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQgY3NfZXRtX2dldF9tZXRhZGF0YShpbnQgY3B1LCB1MzIgKm9mZnNldCwKKwkJCQlzdHJ1Y3QgYXV4dHJhY2VfcmVjb3JkICppdHIsCisJCQkJc3RydWN0IGF1eHRyYWNlX2luZm9fZXZlbnQgKmluZm8pCit7CisJdTMyIGluY3JlbWVudDsKKwl1NjQgbWFnaWM7CisJc3RydWN0IGNzX2V0bV9yZWNvcmRpbmcgKnB0ciA9CisJCQljb250YWluZXJfb2YoaXRyLCBzdHJ1Y3QgY3NfZXRtX3JlY29yZGluZywgaXRyKTsKKwlzdHJ1Y3QgcGVyZl9wbXUgKmNzX2V0bV9wbXUgPSBwdHItPmNzX2V0bV9wbXU7CisKKwkvKiBmaXJzdCBzZWUgd2hhdCBraW5kIG9mIHRyYWNlciB0aGlzIGNwdSBpcyBhZmZpbmVkIHRvICovCisJaWYgKGNzX2V0bV9pc19ldG12NChpdHIsIGNwdSkpIHsKKwkJbWFnaWMgPSBfX3BlcmZfY3NfZXRtdjRfbWFnaWM7CisJCS8qIEdldCB0cmFjZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisJCWluZm8tPnByaXZbKm9mZnNldCArIENTX0VUTVY0X1RSQ0NPTkZJR1JdID0KKwkJCQkJCWNzX2V0bV9nZXRfY29uZmlnKGl0cik7CisJCS8qIEdldCB0cmFjZUlEIGZyb20gdGhlIGZyYW1ld29yayAqLworCQlpbmZvLT5wcml2WypvZmZzZXQgKyBDU19FVE1WNF9UUkNUUkFDRUlEUl0gPQorCQkJCQkJY29yZXNpZ2h0X2dldF90cmFjZV9pZChjcHUpOworCQkvKiBHZXQgcmVhZC1vbmx5IGluZm9ybWF0aW9uIGZyb20gc3lzRlMgKi8KKwkJaW5mby0+cHJpdlsqb2Zmc2V0ICsgQ1NfRVRNVjRfVFJDSURSMF0gPQorCQkJY3NfZXRtX2dldF9ybyhjc19ldG1fcG11LCBjcHUsCisJCQkJICAgICAgbWV0YWRhdGFfZXRtdjRfcm9bQ1NfRVRNVjRfVFJDSURSMF0pOworCQlpbmZvLT5wcml2WypvZmZzZXQgKyBDU19FVE1WNF9UUkNJRFIxXSA9CisJCQljc19ldG1fZ2V0X3JvKGNzX2V0bV9wbXUsIGNwdSwKKwkJCQkgICAgICBtZXRhZGF0YV9ldG12NF9yb1tDU19FVE1WNF9UUkNJRFIxXSk7CisJCWluZm8tPnByaXZbKm9mZnNldCArIENTX0VUTVY0X1RSQ0lEUjJdID0KKwkJCWNzX2V0bV9nZXRfcm8oY3NfZXRtX3BtdSwgY3B1LAorCQkJCSAgICAgIG1ldGFkYXRhX2V0bXY0X3JvW0NTX0VUTVY0X1RSQ0lEUjJdKTsKKwkJaW5mby0+cHJpdlsqb2Zmc2V0ICsgQ1NfRVRNVjRfVFJDSURSOF0gPQorCQkJY3NfZXRtX2dldF9ybyhjc19ldG1fcG11LCBjcHUsCisJCQkJICAgICAgbWV0YWRhdGFfZXRtdjRfcm9bQ1NfRVRNVjRfVFJDSURSOF0pOworCQlpbmZvLT5wcml2WypvZmZzZXQgKyBDU19FVE1WNF9UUkNBVVRIU1RBVFVTXSA9CisJCQljc19ldG1fZ2V0X3JvKGNzX2V0bV9wbXUsIGNwdSwKKwkJCQkgICAgICBtZXRhZGF0YV9ldG12NF9ybworCQkJCSAgICAgIFtDU19FVE1WNF9UUkNBVVRIU1RBVFVTXSk7CisKKwkJLyogSG93IG11Y2ggc3BhY2Ugd2FzIHVzZWQgKi8KKwkJaW5jcmVtZW50ID0gQ1NfRVRNVjRfUFJJVl9NQVg7CisJfSBlbHNlIHsKKwkJbWFnaWMgPSBfX3BlcmZfY3NfZXRtdjNfbWFnaWM7CisJCS8qIEdldCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisJCWluZm8tPnByaXZbKm9mZnNldCArIENTX0VUTV9FVE1DUl0gPSBjc19ldG1fZ2V0X2NvbmZpZyhpdHIpOworCQkvKiBHZXQgdHJhY2VJRCBmcm9tIHRoZSBmcmFtZXdvcmsgKi8KKwkJaW5mby0+cHJpdlsqb2Zmc2V0ICsgQ1NfRVRNX0VUTVRSQUNFSURSXSA9CisJCQkJCQljb3Jlc2lnaHRfZ2V0X3RyYWNlX2lkKGNwdSk7CisJCS8qIEdldCByZWFkLW9ubHkgaW5mb3JtYXRpb24gZnJvbSBzeXNGUyAqLworCQlpbmZvLT5wcml2WypvZmZzZXQgKyBDU19FVE1fRVRNQ0NFUl0gPQorCQkJY3NfZXRtX2dldF9ybyhjc19ldG1fcG11LCBjcHUsCisJCQkJICAgICAgbWV0YWRhdGFfZXRtdjNfcm9bQ1NfRVRNX0VUTUNDRVJdKTsKKwkJaW5mby0+cHJpdlsqb2Zmc2V0ICsgQ1NfRVRNX0VUTUlEUl0gPQorCQkJY3NfZXRtX2dldF9ybyhjc19ldG1fcG11LCBjcHUsCisJCQkJICAgICAgbWV0YWRhdGFfZXRtdjNfcm9bQ1NfRVRNX0VUTUlEUl0pOworCisJCS8qIEhvdyBtdWNoIHNwYWNlIHdhcyB1c2VkICovCisJCWluY3JlbWVudCA9IENTX0VUTV9QUklWX01BWDsKKwl9CisKKwkvKiBCdWlsZCBnZW5lcmljIGhlYWRlciBwb3J0aW9uICovCisJaW5mby0+cHJpdlsqb2Zmc2V0ICsgQ1NfRVRNX01BR0lDXSA9IG1hZ2ljOworCWluZm8tPnByaXZbKm9mZnNldCArIENTX0VUTV9DUFVdID0gY3B1OworCS8qIFdoZXJlIHRoZSBuZXh0IENQVSBlbnRyeSBzaG91bGQgc3RhcnQgZnJvbSAqLworCSpvZmZzZXQgKz0gaW5jcmVtZW50OworfQorCitzdGF0aWMgaW50IGNzX2V0bV9pbmZvX2ZpbGwoc3RydWN0IGF1eHRyYWNlX3JlY29yZCAqaXRyLAorCQkJICAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24sCisJCQkgICAgc3RydWN0IGF1eHRyYWNlX2luZm9fZXZlbnQgKmluZm8sCisJCQkgICAgc2l6ZV90IHByaXZfc2l6ZSkKK3sKKwlpbnQgaTsKKwl1MzIgb2Zmc2V0OworCXU2NCBucl9jcHUsIHR5cGU7CisJY29uc3Qgc3RydWN0IGNwdV9tYXAgKmNwdXMgPSBzZXNzaW9uLT5ldmxpc3QtPmNwdXM7CisJc3RydWN0IGNzX2V0bV9yZWNvcmRpbmcgKnB0ciA9CisJCQljb250YWluZXJfb2YoaXRyLCBzdHJ1Y3QgY3NfZXRtX3JlY29yZGluZywgaXRyKTsKKwlzdHJ1Y3QgcGVyZl9wbXUgKmNzX2V0bV9wbXUgPSBwdHItPmNzX2V0bV9wbXU7CisKKwlpZiAocHJpdl9zaXplICE9IGNzX2V0bV9pbmZvX3ByaXZfc2l6ZShpdHIsIHNlc3Npb24tPmV2bGlzdCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFzZXNzaW9uLT5ldmxpc3QtPm5yX21tYXBzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIElmIHRoZSBjcHVfbWFwIGlzIGVtcHR5IGFsbCBDUFVzIGFyZSBpbnZvbHZlZCAqLworCW5yX2NwdSA9IGNwdV9tYXBfX2VtcHR5KGNwdXMpID8gY3B1X19tYXhfY3B1KCkgOiBjcHVfbWFwX19ucihjcHVzKTsKKwkvKiBHZXQgUE1VIHR5cGUgYXMgZHluYW1pY2FsbHkgYXNzaWduZWQgYnkgdGhlIGNvcmUgKi8KKwl0eXBlID0gY3NfZXRtX3BtdS0+dHlwZTsKKworCS8qIEZpcnN0IGZpbGwgb3V0IHRoZSBzZXNzaW9uIGhlYWRlciAqLworCWluZm8tPnR5cGUgPSBQRVJGX0FVWFRSQUNFX0NTX0VUTTsKKwlpbmZvLT5wcml2W0NTX0hFQURFUl9WRVJTSU9OXzBdID0gMDsKKwlpbmZvLT5wcml2W0NTX1BNVV9UWVBFX0NQVVNdID0gdHlwZSA8PCAzMjsKKwlpbmZvLT5wcml2W0NTX1BNVV9UWVBFX0NQVVNdIHw9IG5yX2NwdTsKKwlpbmZvLT5wcml2W0NTX0VUTV9TTkFQU0hPVF0gPSBwdHItPnNuYXBzaG90X21vZGU7CisKKwlvZmZzZXQgPSBDU19FVE1fU05BUFNIT1QgKyAxOworCisJLyogY3B1IG1hcCBpcyBub3QgZW1wdHksIHdlIGhhdmUgc3BlY2lmaWMgQ1BVcyB0byB3b3JrIHdpdGggKi8KKwlpZiAoIWNwdV9tYXBfX2VtcHR5KGNwdXMpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBjcHVfbWFwX19ucihjcHVzKSAmJiBvZmZzZXQgPCBwcml2X3NpemU7IGkrKykKKwkJCWNzX2V0bV9nZXRfbWV0YWRhdGEoY3B1cy0+bWFwW2ldLCAmb2Zmc2V0LCBpdHIsIGluZm8pOworCX0gZWxzZSB7CisJCS8qIGdldCBjb25maWd1cmF0aW9uIGZvciBhbGwgQ1BVcyBpbiB0aGUgc3lzdGVtICovCisJCWZvciAoaSA9IDA7IGkgPCBjcHVfX21heF9jcHUoKTsgaSsrKQorCQkJY3NfZXRtX2dldF9tZXRhZGF0YShpLCAmb2Zmc2V0LCBpdHIsIGluZm8pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNzX2V0bV9maW5kX3NuYXBzaG90KHN0cnVjdCBhdXh0cmFjZV9yZWNvcmQgKml0ciBfX21heWJlX3VudXNlZCwKKwkJCQlpbnQgaWR4LCBzdHJ1Y3QgYXV4dHJhY2VfbW1hcCAqbW0sCisJCQkJdW5zaWduZWQgY2hhciAqZGF0YSBfX21heWJlX3VudXNlZCwKKwkJCQl1NjQgKmhlYWQsIHU2NCAqb2xkKQoreworCXByX2RlYnVnMygiJXM6IG1tYXAgaW5kZXggJWQgb2xkIGhlYWQgJXp1IG5ldyBoZWFkICV6dSBzaXplICV6dVxuIiwKKwkJICBfX2Z1bmNfXywgaWR4LCAoc2l6ZV90KSpvbGQsIChzaXplX3QpKmhlYWQsIG1tLT5sZW4pOworCisJKm9sZCA9ICpoZWFkOworCSpoZWFkICs9IG1tLT5sZW47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjc19ldG1fc25hcHNob3Rfc3RhcnQoc3RydWN0IGF1eHRyYWNlX3JlY29yZCAqaXRyKQoreworCXN0cnVjdCBjc19ldG1fcmVjb3JkaW5nICpwdHIgPQorCQkJY29udGFpbmVyX29mKGl0ciwgc3RydWN0IGNzX2V0bV9yZWNvcmRpbmcsIGl0cik7CisJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsOworCisJZXZsaXN0X19mb3JfZWFjaF9lbnRyeShwdHItPmV2bGlzdCwgZXZzZWwpIHsKKwkJaWYgKGV2c2VsLT5hdHRyLnR5cGUgPT0gcHRyLT5jc19ldG1fcG11LT50eXBlKQorCQkJcmV0dXJuIHBlcmZfZXZzZWxfX2Rpc2FibGUoZXZzZWwpOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBjc19ldG1fc25hcHNob3RfZmluaXNoKHN0cnVjdCBhdXh0cmFjZV9yZWNvcmQgKml0cikKK3sKKwlzdHJ1Y3QgY3NfZXRtX3JlY29yZGluZyAqcHRyID0KKwkJCWNvbnRhaW5lcl9vZihpdHIsIHN0cnVjdCBjc19ldG1fcmVjb3JkaW5nLCBpdHIpOworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbDsKKworCWV2bGlzdF9fZm9yX2VhY2hfZW50cnkocHRyLT5ldmxpc3QsIGV2c2VsKSB7CisJCWlmIChldnNlbC0+YXR0ci50eXBlID09IHB0ci0+Y3NfZXRtX3BtdS0+dHlwZSkKKwkJCXJldHVybiBwZXJmX2V2c2VsX19lbmFibGUoZXZzZWwpOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHU2NCBjc19ldG1fcmVmZXJlbmNlKHN0cnVjdCBhdXh0cmFjZV9yZWNvcmQgKml0ciBfX21heWJlX3VudXNlZCkKK3sKKwlyZXR1cm4gKCgodTY0KSByYW5kKCkgPDwgIDApICYgMHgwMDAwMDAwMEZGRkZGRkZGdWxsKSB8CisJCSgoKHU2NCkgcmFuZCgpIDw8IDMyKSAmIDB4RkZGRkZGRkYwMDAwMDAwMHVsbCk7Cit9CisKK3N0YXRpYyB2b2lkIGNzX2V0bV9yZWNvcmRpbmdfZnJlZShzdHJ1Y3QgYXV4dHJhY2VfcmVjb3JkICppdHIpCit7CisJc3RydWN0IGNzX2V0bV9yZWNvcmRpbmcgKnB0ciA9CisJCQljb250YWluZXJfb2YoaXRyLCBzdHJ1Y3QgY3NfZXRtX3JlY29yZGluZywgaXRyKTsKKwlmcmVlKHB0cik7Cit9CisKK3N0YXRpYyBpbnQgY3NfZXRtX3JlYWRfZmluaXNoKHN0cnVjdCBhdXh0cmFjZV9yZWNvcmQgKml0ciwgaW50IGlkeCkKK3sKKwlzdHJ1Y3QgY3NfZXRtX3JlY29yZGluZyAqcHRyID0KKwkJCWNvbnRhaW5lcl9vZihpdHIsIHN0cnVjdCBjc19ldG1fcmVjb3JkaW5nLCBpdHIpOworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbDsKKworCWV2bGlzdF9fZm9yX2VhY2hfZW50cnkocHRyLT5ldmxpc3QsIGV2c2VsKSB7CisJCWlmIChldnNlbC0+YXR0ci50eXBlID09IHB0ci0+Y3NfZXRtX3BtdS0+dHlwZSkKKwkJCXJldHVybiBwZXJmX2V2bGlzdF9fZW5hYmxlX2V2ZW50X2lkeChwdHItPmV2bGlzdCwKKwkJCQkJCQkgICAgIGV2c2VsLCBpZHgpOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdHJ1Y3QgYXV4dHJhY2VfcmVjb3JkICpjc19ldG1fcmVjb3JkX2luaXQoaW50ICplcnIpCit7CisJc3RydWN0IHBlcmZfcG11ICpjc19ldG1fcG11OworCXN0cnVjdCBjc19ldG1fcmVjb3JkaW5nICpwdHI7CisKKwljc19ldG1fcG11ID0gcGVyZl9wbXVfX2ZpbmQoQ09SRVNJR0hUX0VUTV9QTVVfTkFNRSk7CisKKwlpZiAoIWNzX2V0bV9wbXUpIHsKKwkJKmVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXB0ciA9IHphbGxvYyhzaXplb2Yoc3RydWN0IGNzX2V0bV9yZWNvcmRpbmcpKTsKKwlpZiAoIXB0cikgeworCQkqZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJcHRyLT5jc19ldG1fcG11CQkJPSBjc19ldG1fcG11OworCXB0ci0+aXRyLnBhcnNlX3NuYXBzaG90X29wdGlvbnMJPSBjc19ldG1fcGFyc2Vfc25hcHNob3Rfb3B0aW9uczsKKwlwdHItPml0ci5yZWNvcmRpbmdfb3B0aW9ucwk9IGNzX2V0bV9yZWNvcmRpbmdfb3B0aW9uczsKKwlwdHItPml0ci5pbmZvX3ByaXZfc2l6ZQkJPSBjc19ldG1faW5mb19wcml2X3NpemU7CisJcHRyLT5pdHIuaW5mb19maWxsCQk9IGNzX2V0bV9pbmZvX2ZpbGw7CisJcHRyLT5pdHIuZmluZF9zbmFwc2hvdAkJPSBjc19ldG1fZmluZF9zbmFwc2hvdDsKKwlwdHItPml0ci5zbmFwc2hvdF9zdGFydAkJPSBjc19ldG1fc25hcHNob3Rfc3RhcnQ7CisJcHRyLT5pdHIuc25hcHNob3RfZmluaXNoCT0gY3NfZXRtX3NuYXBzaG90X2ZpbmlzaDsKKwlwdHItPml0ci5yZWZlcmVuY2UJCT0gY3NfZXRtX3JlZmVyZW5jZTsKKwlwdHItPml0ci5mcmVlCQkJPSBjc19ldG1fcmVjb3JkaW5nX2ZyZWU7CisJcHRyLT5pdHIucmVhZF9maW5pc2gJCT0gY3NfZXRtX3JlYWRfZmluaXNoOworCisJKmVyciA9IDA7CisJcmV0dXJuICZwdHItPml0cjsKK291dDoKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIEZJTEUgKmNzX2RldmljZV9fb3Blbl9maWxlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKwljb25zdCBjaGFyICpzeXNmczsKKworCXN5c2ZzID0gc3lzZnNfX21vdW50cG9pbnQoKTsKKwlpZiAoIXN5c2ZzKQorCQlyZXR1cm4gTlVMTDsKKworCXNucHJpbnRmKHBhdGgsIFBBVEhfTUFYLAorCQkgIiVzIiBDU19CVVNfREVWSUNFX1BBVEggIiVzIiwgc3lzZnMsIG5hbWUpOworCisJcHJpbnRmKCJwYXRoOiAlc1xuIiwgcGF0aCk7CisKKwlpZiAoc3RhdChwYXRoLCAmc3QpIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gZm9wZW4ocGF0aCwgInciKTsKKworfQorCitzdGF0aWMgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMiwgMykpKQoraW50IGNzX2RldmljZV9fcHJpbnRfZmlsZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJRklMRSAqZmlsZTsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJZmlsZSA9IGNzX2RldmljZV9fb3Blbl9maWxlKG5hbWUpOworCWlmIChmaWxlKSB7CisJCXJldCA9IHZmcHJpbnRmKGZpbGUsIGZtdCwgYXJncyk7CisJCWZjbG9zZShmaWxlKTsKKwl9CisJdmFfZW5kKGFyZ3MpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBjc19ldG1fc2V0X2Rydl9jb25maWcoc3RydWN0IHBlcmZfZXZzZWxfY29uZmlnX3Rlcm0gKnRlcm0pCit7CisJaW50IHJldDsKKwljaGFyIGVuYWJsZV9zaW5rW0VOQUJMRV9TSU5LX01BWF07CisKKwlzbnByaW50ZihlbmFibGVfc2luaywgRU5BQkxFX1NJTktfTUFYLCAiJXMvJXMiLAorCQkgdGVybS0+dmFsLmRydl9jZmcsICJlbmFibGVfc2luayIpOworCisJcmV0ID0gY3NfZGV2aWNlX19wcmludF9maWxlKGVuYWJsZV9zaW5rLCAiJWQiLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL2FybS91dGlsL2NzLWV0bS5oIGIvdG9vbHMvcGVyZi9hcmNoL2FybS91dGlsL2NzLWV0bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNTY3NDEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2FyY2gvYXJtL3V0aWwvY3MtZXRtLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodChDKSAyMDE1IExpbmFybyBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQXV0aG9yOiBNYXRoaWV1IFBvaXJpZXIgPG1hdGhpZXUucG9pcmllckBsaW5hcm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBJTkNMVURFX19QRVJGX0NTX0VUTV9IX18KKyNkZWZpbmUgSU5DTFVERV9fUEVSRl9DU19FVE1fSF9fCisKKyNpbmNsdWRlICIuLi8uLi91dGlsL2V2c2VsLmgiCisKK3N0cnVjdCBhdXh0cmFjZV9yZWNvcmQgKmNzX2V0bV9yZWNvcmRfaW5pdChpbnQgKmVycik7CitpbnQgY3NfZXRtX3NldF9kcnZfY29uZmlnKHN0cnVjdCBwZXJmX2V2c2VsX2NvbmZpZ190ZXJtICp0ZXJtKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gvYXJtL3V0aWwvcG11LmMgYi90b29scy9wZXJmL2FyY2gvYXJtL3V0aWwvcG11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThkNjczOQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC9hcm0vdXRpbC9wbXUuYwpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0KEMpIDIwMTUgTGluYXJvIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBdXRob3I6IE1hdGhpZXUgUG9pcmllciA8bWF0aGlldS5wb2lyaWVyQGxpbmFyby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvY29yZXNpZ2h0LXBtdS5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KKworI2luY2x1ZGUgImNzLWV0bS5oIgorI2luY2x1ZGUgIi4uLy4uL3V0aWwvcG11LmgiCisKK3N0cnVjdCBwZXJmX2V2ZW50X2F0dHIKKypwZXJmX3BtdV9fZ2V0X2RlZmF1bHRfY29uZmlnKHN0cnVjdCBwZXJmX3BtdSAqcG11IF9fbWF5YmVfdW51c2VkKQoreworI2lmZGVmIEhBVkVfQVVYVFJBQ0VfU1VQUE9SVAorCWlmICghc3RyY21wKHBtdS0+bmFtZSwgQ09SRVNJR0hUX0VUTV9QTVVfTkFNRSkpIHsKKwkJLyogYWRkIEVUTSBkZWZhdWx0IGNvbmZpZyBoZXJlICovCisJCXBtdS0+c2VsZWN0YWJsZSA9IHRydWU7CisJCXBtdS0+c2V0X2Rydl9jb25maWcgPSBjc19ldG1fc2V0X2Rydl9jb25maWc7CisJfQorI2VuZGlmCisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gvYXJtNjQvaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmggYi90b29scy9wZXJmL2FyY2gvYXJtNjQvaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY3NTkzNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC9hcm02NC9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaApAQCAtMCwwICsxLDEzIEBACisjaWZkZWYgREVGSU5FX0RXQVJGX1JFR1NUUl9UQUJMRQorLyogVGhpcyBpcyBpbmNsdWRlZCBpbiBwZXJmL3V0aWwvZHdhcmYtcmVncy5jICovCisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWFyY2g2NF9yZWdzdHJfdGJsW10gPSB7CisJIiVyMCIsICIlcjEiLCAiJXIyIiwgIiVyMyIsICIlcjQiLAorCSIlcjUiLCAiJXI2IiwgIiVyNyIsICIlcjgiLCAiJXI5IiwKKwkiJXIxMCIsICIlcjExIiwgIiVyMTIiLCAiJXIxMyIsICIlcjE0IiwKKwkiJXIxNSIsICIlcjE2IiwgIiVyMTciLCAiJXIxOCIsICIlcjE5IiwKKwkiJXIyMCIsICIlcjIxIiwgIiVyMjIiLCAiJXIyMyIsICIlcjI0IiwKKwkiJXIyNSIsICIlcjI2IiwgIiVyMjciLCAiJXIyOCIsICIlcjI5IiwKKwkiJWxyIiwgIiVzcCIsCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gvYXJtNjQvdXRpbC9CdWlsZCBiL3Rvb2xzL3BlcmYvYXJjaC9hcm02NC91dGlsL0J1aWxkCmluZGV4IDAyZjQxZGIuLmNlZjZmYjMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYXJjaC9hcm02NC91dGlsL0J1aWxkCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC9hcm02NC91dGlsL0J1aWxkCkBAIC0xLDIgKzEsNiBAQAogbGlicGVyZi0kKENPTkZJR19EV0FSRikgICAgICs9IGR3YXJmLXJlZ3MubwogbGlicGVyZi0kKENPTkZJR19MT0NBTF9MSUJVTldJTkQpICs9IHVud2luZC1saWJ1bndpbmQubworCitsaWJwZXJmLSQoQ09ORklHX0FVWFRSQUNFKSArPSAuLi8uLi9hcm0vdXRpbC9wbXUubyBcCisJCQkgICAgICAuLi8uLi9hcm0vdXRpbC9hdXh0cmFjZS5vIFwKKwkJCSAgICAgIC4uLy4uL2FybS91dGlsL2NzLWV0bS5vCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gvcG93ZXJwYy9CdWlsZCBiL3Rvb2xzL3BlcmYvYXJjaC9wb3dlcnBjL0J1aWxkCmluZGV4IDU0YWZlNGEuLmRiNTJmYTIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYXJjaC9wb3dlcnBjL0J1aWxkCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC9wb3dlcnBjL0J1aWxkCkBAIC0xICsxLDIgQEAKIGxpYnBlcmYteSArPSB1dGlsLworbGlicGVyZi15ICs9IHRlc3RzLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hcmNoLXRlc3RzLmggYi90b29scy9wZXJmL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FyY2gtdGVzdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGQ4ZGVkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hcmNoLXRlc3RzLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBBUkNIX1RFU1RTX0gKKyNkZWZpbmUgQVJDSF9URVNUU19ICisKKyNpZmRlZiBIQVZFX0RXQVJGX1VOV0lORF9TVVBQT1JUCitzdHJ1Y3QgdGhyZWFkOworc3RydWN0IHBlcmZfc2FtcGxlOworaW50IHRlc3RfX2FyY2hfdW53aW5kX3NhbXBsZShzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKKwkJCSAgICAgc3RydWN0IHRocmVhZCAqdGhyZWFkKTsKKyNlbmRpZgorCitleHRlcm4gc3RydWN0IHRlc3QgYXJjaF90ZXN0c1tdOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC9wb3dlcnBjL2luY2x1ZGUvZHdhcmYtcmVncy10YWJsZS5oIGIvdG9vbHMvcGVyZi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI0NzMwZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC9wb3dlcnBjL2luY2x1ZGUvZHdhcmYtcmVncy10YWJsZS5oCkBAIC0wLDAgKzEsMjcgQEAKKyNpZmRlZiBERUZJTkVfRFdBUkZfUkVHU1RSX1RBQkxFCisvKiBUaGlzIGlzIGluY2x1ZGVkIGluIHBlcmYvdXRpbC9kd2FyZi1yZWdzLmMgKi8KKworLyoKKyAqIFJlZmVyZW5jZToKKyAqIGh0dHA6Ly9yZWZzcGVjcy5saW51eGZvdW5kYXRpb24ub3JnL0VMRi9wcGM2NC9QUEMtZWxmNjRhYmktMS45Lmh0bWwKKyAqIGh0dHA6Ly9yZWZzcGVjcy5saW51eC1mb3VuZGF0aW9uLm9yZy9lbGYvZWxmc3BlY19wcGMucGRmCisgKi8KKyNkZWZpbmUgUkVHX0RXQVJGTlVNX05BTUUocmVnLCBpZHgpCVtpZHhdID0gIiUiICNyZWcKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwb3dlcnBjX3JlZ3N0cl90YmxbXSA9IHsKKwkiJWdwcjAiLCAiJWdwcjEiLCAiJWdwcjIiLCAiJWdwcjMiLCAiJWdwcjQiLAorCSIlZ3ByNSIsICIlZ3ByNiIsICIlZ3ByNyIsICIlZ3ByOCIsICIlZ3ByOSIsCisJIiVncHIxMCIsICIlZ3ByMTEiLCAiJWdwcjEyIiwgIiVncHIxMyIsICIlZ3ByMTQiLAorCSIlZ3ByMTUiLCAiJWdwcjE2IiwgIiVncHIxNyIsICIlZ3ByMTgiLCAiJWdwcjE5IiwKKwkiJWdwcjIwIiwgIiVncHIyMSIsICIlZ3ByMjIiLCAiJWdwcjIzIiwgIiVncHIyNCIsCisJIiVncHIyNSIsICIlZ3ByMjYiLCAiJWdwcjI3IiwgIiVncHIyOCIsICIlZ3ByMjkiLAorCSIlZ3ByMzAiLCAiJWdwcjMxIiwKKwlSRUdfRFdBUkZOVU1fTkFNRShtc3IsICAgNjYpLAorCVJFR19EV0FSRk5VTV9OQU1FKGN0ciwgICAxMDkpLAorCVJFR19EV0FSRk5VTV9OQU1FKGxpbmssICAxMDgpLAorCVJFR19EV0FSRk5VTV9OQU1FKHhlciwgICAxMDEpLAorCVJFR19EV0FSRk5VTV9OQU1FKGRhciwgICAxMTkpLAorCVJFR19EV0FSRk5VTV9OQU1FKGRzaXNyLCAxMTgpLAorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gvcG93ZXJwYy9pbmNsdWRlL3BlcmZfcmVncy5oIGIvdG9vbHMvcGVyZi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9wZXJmX3JlZ3MuaAppbmRleCA3NWRlMGU5Li5jMTJmNGU4IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2FyY2gvcG93ZXJwYy9pbmNsdWRlL3BlcmZfcmVncy5oCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC9wb3dlcnBjL2luY2x1ZGUvcGVyZl9yZWdzLmgKQEAgLTUsNiArNSw4IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vcGVyZl9yZWdzLmg+CiAKK3ZvaWQgcGVyZl9yZWdzX2xvYWQodTY0ICpyZWdzKTsKKwogI2RlZmluZSBQRVJGX1JFR1NfTUFTSyAgKCgxVUxMIDw8IFBFUkZfUkVHX1BPV0VSUENfTUFYKSAtIDEpCiAjZGVmaW5lIFBFUkZfUkVHU19NQVggICBQRVJGX1JFR19QT1dFUlBDX01BWAogI2lmZGVmIF9fcG93ZXJwYzY0X18KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC9wb3dlcnBjL3Rlc3RzL0J1aWxkIGIvdG9vbHMvcGVyZi9hcmNoL3Bvd2VycGMvdGVzdHMvQnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgyN2VmMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC9wb3dlcnBjL3Rlc3RzL0J1aWxkCkBAIC0wLDAgKzEsNCBAQAorbGlicGVyZi0kKENPTkZJR19EV0FSRl9VTldJTkQpICs9IHJlZ3NfbG9hZC5vCitsaWJwZXJmLSQoQ09ORklHX0RXQVJGX1VOV0lORCkgKz0gZHdhcmYtdW53aW5kLm8KKworbGlicGVyZi15ICs9IGFyY2gtdGVzdHMubwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3Bvd2VycGMvdGVzdHMvYXJjaC10ZXN0cy5jIGIvdG9vbHMvcGVyZi9hcmNoL3Bvd2VycGMvdGVzdHMvYXJjaC10ZXN0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNGY0NjIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2FyY2gvcG93ZXJwYy90ZXN0cy9hcmNoLXRlc3RzLmMKQEAgLTAsMCArMSwxNSBAQAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInRlc3RzL3Rlc3RzLmgiCisjaW5jbHVkZSAiYXJjaC10ZXN0cy5oIgorCitzdHJ1Y3QgdGVzdCBhcmNoX3Rlc3RzW10gPSB7CisjaWZkZWYgSEFWRV9EV0FSRl9VTldJTkRfU1VQUE9SVAorCXsKKwkJLmRlc2MgPSAiVGVzdCBkd2FyZiB1bndpbmQiLAorCQkuZnVuYyA9IHRlc3RfX2R3YXJmX3Vud2luZCwKKwl9LAorI2VuZGlmCisJeworCQkuZnVuYyA9IE5VTEwsCisJfSwKK307CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gvcG93ZXJwYy90ZXN0cy9kd2FyZi11bndpbmQuYyBiL3Rvb2xzL3BlcmYvYXJjaC9wb3dlcnBjL3Rlc3RzL2R3YXJmLXVud2luZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYWMzMTMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2FyY2gvcG93ZXJwYy90ZXN0cy9kd2FyZi11bndpbmQuYwpAQCAtMCwwICsxLDYyIEBACisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAicGVyZl9yZWdzLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCisjaW5jbHVkZSAibWFwLmgiCisjaW5jbHVkZSAiZXZlbnQuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInRlc3RzL3Rlc3RzLmgiCisjaW5jbHVkZSAiYXJjaC10ZXN0cy5oIgorCisjZGVmaW5lIFNUQUNLX1NJWkUgODE5MgorCitzdGF0aWMgaW50IHNhbXBsZV91c3RhY2soc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCisJCQkgc3RydWN0IHRocmVhZCAqdGhyZWFkLCB1NjQgKnJlZ3MpCit7CisJc3RydWN0IHN0YWNrX2R1bXAgKnN0YWNrID0gJnNhbXBsZS0+dXNlcl9zdGFjazsKKwlzdHJ1Y3QgbWFwICptYXA7CisJdW5zaWduZWQgbG9uZyBzcDsKKwl1NjQgc3RhY2tfc2l6ZSwgKmJ1ZjsKKworCWJ1ZiA9IG1hbGxvYyhTVEFDS19TSVpFKTsKKwlpZiAoIWJ1ZikgeworCQlwcl9kZWJ1ZygiZmFpbGVkIHRvIGFsbG9jYXRlIHNhbXBsZSB1cmVncyBkYXRhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXNwID0gKHVuc2lnbmVkIGxvbmcpIHJlZ3NbUEVSRl9SRUdfUE9XRVJQQ19SMV07CisKKwltYXAgPSBtYXBfZ3JvdXBzX19maW5kKHRocmVhZC0+bWcsIE1BUF9fVkFSSUFCTEUsICh1NjQpIHNwKTsKKwlpZiAoIW1hcCkgeworCQlwcl9kZWJ1ZygiZmFpbGVkIHRvIGdldCBzdGFjayBtYXBcbiIpOworCQlmcmVlKGJ1Zik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzdGFja19zaXplID0gbWFwLT5lbmQgLSBzcDsKKwlzdGFja19zaXplID0gc3RhY2tfc2l6ZSA+IFNUQUNLX1NJWkUgPyBTVEFDS19TSVpFIDogc3RhY2tfc2l6ZTsKKworCW1lbWNweShidWYsICh2b2lkICopIHNwLCBzdGFja19zaXplKTsKKwlzdGFjay0+ZGF0YSA9IChjaGFyICopIGJ1ZjsKKwlzdGFjay0+c2l6ZSA9IHN0YWNrX3NpemU7CisJcmV0dXJuIDA7Cit9CisKK2ludCB0ZXN0X19hcmNoX3Vud2luZF9zYW1wbGUoc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCisJCQkgICAgIHN0cnVjdCB0aHJlYWQgKnRocmVhZCkKK3sKKwlzdHJ1Y3QgcmVnc19kdW1wICpyZWdzID0gJnNhbXBsZS0+dXNlcl9yZWdzOworCXU2NCAqYnVmOworCisJYnVmID0gY2FsbG9jKDEsIHNpemVvZih1NjQpICogUEVSRl9SRUdTX01BWCk7CisJaWYgKCFidWYpIHsKKwkJcHJfZGVidWcoImZhaWxlZCB0byBhbGxvY2F0ZSBzYW1wbGUgdXJlZ3MgZGF0YVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlwZXJmX3JlZ3NfbG9hZChidWYpOworCXJlZ3MtPmFiaSAgPSBQRVJGX1NBTVBMRV9SRUdTX0FCSTsKKwlyZWdzLT5yZWdzID0gYnVmOworCXJlZ3MtPm1hc2sgPSBQRVJGX1JFR1NfTUFTSzsKKworCXJldHVybiBzYW1wbGVfdXN0YWNrKHNhbXBsZSwgdGhyZWFkLCBidWYpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3Bvd2VycGMvdGVzdHMvcmVnc19sb2FkLlMgYi90b29scy9wZXJmL2FyY2gvcG93ZXJwYy90ZXN0cy9yZWdzX2xvYWQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzZjOWEzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9hcmNoL3Bvd2VycGMvdGVzdHMvcmVnc19sb2FkLlMKQEAgLTAsMCArMSw5NCBAQAorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKworLyogT2Zmc2V0IGlzIGJhc2VkIG9uIG1hY3JvcyBmcm9tIGFyY2gvcG93ZXJwYy9pbmNsdWRlL3VhcGkvYXNtL3B0cmFjZS5oLiAqLworI2RlZmluZSBSMAkgMAorI2RlZmluZSBSMQkgMSAqIDgKKyNkZWZpbmUgUjIJIDIgKiA4CisjZGVmaW5lIFIzCSAzICogOAorI2RlZmluZSBSNAkgNCAqIDgKKyNkZWZpbmUgUjUJIDUgKiA4CisjZGVmaW5lIFI2CSA2ICogOAorI2RlZmluZSBSNwkgNyAqIDgKKyNkZWZpbmUgUjgJIDggKiA4CisjZGVmaW5lIFI5CSA5ICogOAorI2RlZmluZSBSMTAJMTAgKiA4CisjZGVmaW5lIFIxMQkxMSAqIDgKKyNkZWZpbmUgUjEyCTEyICogOAorI2RlZmluZSBSMTMJMTMgKiA4CisjZGVmaW5lIFIxNAkxNCAqIDgKKyNkZWZpbmUgUjE1CTE1ICogOAorI2RlZmluZSBSMTYJMTYgKiA4CisjZGVmaW5lIFIxNwkxNyAqIDgKKyNkZWZpbmUgUjE4CTE4ICogOAorI2RlZmluZSBSMTkJMTkgKiA4CisjZGVmaW5lIFIyMAkyMCAqIDgKKyNkZWZpbmUgUjIxCTIxICogOAorI2RlZmluZSBSMjIJMjIgKiA4CisjZGVmaW5lIFIyMwkyMyAqIDgKKyNkZWZpbmUgUjI0CTI0ICogOAorI2RlZmluZSBSMjUJMjUgKiA4CisjZGVmaW5lIFIyNgkyNiAqIDgKKyNkZWZpbmUgUjI3CTI3ICogOAorI2RlZmluZSBSMjgJMjggKiA4CisjZGVmaW5lIFIyOQkyOSAqIDgKKyNkZWZpbmUgUjMwCTMwICogOAorI2RlZmluZSBSMzEJMzEgKiA4CisjZGVmaW5lIE5JUAkzMiAqIDgKKyNkZWZpbmUgQ1RSCTM1ICogOAorI2RlZmluZSBMSU5LCTM2ICogOAorI2RlZmluZSBYRVIJMzcgKiA4CisKKy5nbG9ibCBwZXJmX3JlZ3NfbG9hZAorcGVyZl9yZWdzX2xvYWQ6CisJc3RkIDAsIFIwKDMpCisJc3RkIDEsIFIxKDMpCisJc3RkIDIsIFIyKDMpCisJc3RkIDMsIFIzKDMpCisJc3RkIDQsIFI0KDMpCisJc3RkIDUsIFI1KDMpCisJc3RkIDYsIFI2KDMpCisJc3RkIDcsIFI3KDMpCisJc3RkIDgsIFI4KDMpCisJc3RkIDksIFI5KDMpCisJc3RkIDEwLCBSMTAoMykKKwlzdGQgMTEsIFIxMSgzKQorCXN0ZCAxMiwgUjEyKDMpCisJc3RkIDEzLCBSMTMoMykKKwlzdGQgMTQsIFIxNCgzKQorCXN0ZCAxNSwgUjE1KDMpCisJc3RkIDE2LCBSMTYoMykKKwlzdGQgMTcsIFIxNygzKQorCXN0ZCAxOCwgUjE4KDMpCisJc3RkIDE5LCBSMTkoMykKKwlzdGQgMjAsIFIyMCgzKQorCXN0ZCAyMSwgUjIxKDMpCisJc3RkIDIyLCBSMjIoMykKKwlzdGQgMjMsIFIyMygzKQorCXN0ZCAyNCwgUjI0KDMpCisJc3RkIDI1LCBSMjUoMykKKwlzdGQgMjYsIFIyNigzKQorCXN0ZCAyNywgUjI3KDMpCisJc3RkIDI4LCBSMjgoMykKKwlzdGQgMjksIFIyOSgzKQorCXN0ZCAzMCwgUjMwKDMpCisJc3RkIDMxLCBSMzEoMykKKworCS8qIHN0b3JlIE5JUCAqLworCW1mbHIgNAorCXN0ZCA0LCBOSVAoMykKKworCS8qIFN0b3JlIExSICovCisJc3RkIDQsIExJTksoMykKKworCS8qIFN0b3JlIFhFUiAqLworCW1meGVyIDQKKwlzdGQgNCwgWEVSKDMpCisKKwkvKiBTdG9yZSBDVFIgKi8KKwltZmN0ciA0CisJc3RkIDQsIENUUigzKQorCisJLyogUmVzdG9yZSBvcmlnaW5hbCB2YWx1ZSBvZiByNCAqLworCWxkIDQsIFI0KDMpCisKKwlibHIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC9wb3dlcnBjL3V0aWwvc3ltLWhhbmRsaW5nLmMgYi90b29scy9wZXJmL2FyY2gvcG93ZXJwYy91dGlsL3N5bS1oYW5kbGluZy5jCmluZGV4IDhkNGRjOTcuLmVkOWQ1ZDEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYXJjaC9wb3dlcnBjL3V0aWwvc3ltLWhhbmRsaW5nLmMKKysrIGIvdG9vbHMvcGVyZi9hcmNoL3Bvd2VycGMvdXRpbC9zeW0taGFuZGxpbmcuYwpAQCAtOTcsNiArOTcsNyBAQAogCX0KIH0KIAorI2lmZGVmIEhBVkVfTElCRUxGX1NVUFBPUlQKIHZvaWQgYXJjaF9fcG9zdF9wcm9jZXNzX3Byb2JlX3RyYWNlX2V2ZW50cyhzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2LAogCQkJCQkgICBpbnQgbnRldnMpCiB7CkBAIC0xMDcsNyArMTA4LDcgQEAKIAlpbnQgaSA9IDA7CiAKIAltYXAgPSBnZXRfdGFyZ2V0X21hcChwZXYtPnRhcmdldCwgcGV2LT51cHJvYmVzKTsKLQlpZiAoIW1hcCB8fCBtYXBfX2xvYWQobWFwLCBOVUxMKSA8IDApCisJaWYgKCFtYXAgfHwgbWFwX19sb2FkKG1hcCkgPCAwKQogCQlyZXR1cm47CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnRldnM7IGkrKykgewpAQCAtMTE4LDUgKzExOSw2IEBACiAJCX0KIAl9CiB9CisjZW5kaWYgLyogSEFWRV9MSUJFTEZfU1VQUE9SVCAqLwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC9zMzkwL2luY2x1ZGUvZHdhcmYtcmVncy10YWJsZS5oIGIvdG9vbHMvcGVyZi9hcmNoL3MzOTAvaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRhNzRhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC9zMzkwL2luY2x1ZGUvZHdhcmYtcmVncy10YWJsZS5oCkBAIC0wLDAgKzEsOCBAQAorI2lmZGVmIERFRklORV9EV0FSRl9SRUdTVFJfVEFCTEUKKy8qIFRoaXMgaXMgaW5jbHVkZWQgaW4gcGVyZi91dGlsL2R3YXJmLXJlZ3MuYyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHMzOTBfcmVnc3RyX3RibFtdID0geworCSIlcjAiLCAiJXIxIiwgICIlcjIiLCAgIiVyMyIsICAiJXI0IiwgICIlcjUiLCAgIiVyNiIsICAiJXI3IiwKKwkiJXI4IiwgIiVyOSIsICIlcjEwIiwgIiVyMTEiLCAiJXIxMiIsICIlcjEzIiwgIiVyMTQiLCAiJXIxNSIsCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gvc2gvaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmggYi90b29scy9wZXJmL2FyY2gvc2gvaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EyZGVhZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC9zaC9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaApAQCAtMCwwICsxLDI1IEBACisjaWZkZWYgREVGSU5FX0RXQVJGX1JFR1NUUl9UQUJMRQorLyogVGhpcyBpcyBpbmNsdWRlZCBpbiBwZXJmL3V0aWwvZHdhcmYtcmVncy5jICovCisKK2NvbnN0IGNoYXIgKiBjb25zdCBzaF9yZWdzdHJfdGJsW10gPSB7CisJInIwIiwKKwkicjEiLAorCSJyMiIsCisJInIzIiwKKwkicjQiLAorCSJyNSIsCisJInI2IiwKKwkicjciLAorCSJyOCIsCisJInI5IiwKKwkicjEwIiwKKwkicjExIiwKKwkicjEyIiwKKwkicjEzIiwKKwkicjE0IiwKKwkicjE1IiwKKwkicGMiLAorCSJwciIsCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC9zcGFyYy9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaCBiL3Rvb2xzL3BlcmYvYXJjaC9zcGFyYy9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmMwNzYxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9hcmNoL3NwYXJjL2luY2x1ZGUvZHdhcmYtcmVncy10YWJsZS5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZmRlZiBERUZJTkVfRFdBUkZfUkVHU1RSX1RBQkxFCisvKiBUaGlzIGlzIGluY2x1ZGVkIGluIHBlcmYvdXRpbC9kd2FyZi1yZWdzLmMgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGFyY19yZWdzdHJfdGJsW10gPSB7CisJIiVnMCIsICIlZzEiLCAiJWcyIiwgIiVnMyIsICIlZzQiLCAiJWc1IiwgIiVnNiIsICIlZzciLAorCSIlbzAiLCAiJW8xIiwgIiVvMiIsICIlbzMiLCAiJW80IiwgIiVvNSIsICIlc3AiLCAiJW83IiwKKwkiJWwwIiwgIiVsMSIsICIlbDIiLCAiJWwzIiwgIiVsNCIsICIlbDUiLCAiJWw2IiwgIiVsNyIsCisJIiVpMCIsICIlaTEiLCAiJWkyIiwgIiVpMyIsICIlaTQiLCAiJWk1IiwgIiVmcCIsICIlaTciLAorCSIlZjAiLCAiJWYxIiwgIiVmMiIsICIlZjMiLCAiJWY0IiwgIiVmNSIsICIlZjYiLCAiJWY3IiwKKwkiJWY4IiwgIiVmOSIsICIlZjEwIiwgIiVmMTEiLCAiJWYxMiIsICIlZjEzIiwgIiVmMTQiLCAiJWYxNSIsCisJIiVmMTYiLCAiJWYxNyIsICIlZjE4IiwgIiVmMTkiLCAiJWYyMCIsICIlZjIxIiwgIiVmMjIiLCAiJWYyMyIsCisJIiVmMjQiLCAiJWYyNSIsICIlZjI2IiwgIiVmMjciLCAiJWYyOCIsICIlZjI5IiwgIiVmMzAiLCAiJWYzMSIsCisJIiVmMzIiLCAiJWYzMyIsICIlZjM0IiwgIiVmMzUiLCAiJWYzNiIsICIlZjM3IiwgIiVmMzgiLCAiJWYzOSIsCisJIiVmNDAiLCAiJWY0MSIsICIlZjQyIiwgIiVmNDMiLCAiJWY0NCIsICIlZjQ1IiwgIiVmNDYiLCAiJWY0NyIsCisJIiVmNDgiLCAiJWY0OSIsICIlZjUwIiwgIiVmNTEiLCAiJWY1MiIsICIlZjUzIiwgIiVmNTQiLCAiJWY1NSIsCisJIiVmNTYiLCAiJWY1NyIsICIlZjU4IiwgIiVmNTkiLCAiJWY2MCIsICIlZjYxIiwgIiVmNjIiLCAiJWY2MyIsCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gveDg2L2luY2x1ZGUvZHdhcmYtcmVncy10YWJsZS5oIGIvdG9vbHMvcGVyZi9hcmNoL3g4Ni9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjVlNWNiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9hcmNoL3g4Ni9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaApAQCAtMCwwICsxLDE0IEBACisjaWZkZWYgREVGSU5FX0RXQVJGX1JFR1NUUl9UQUJMRQorLyogVGhpcyBpcyBpbmNsdWRlZCBpbiBwZXJmL3V0aWwvZHdhcmYtcmVncy5jICovCisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgeDg2XzMyX3JlZ3N0cl90YmxbXSA9IHsKKwkiJWF4IiwgIiVjeCIsICIlZHgiLCAiJWJ4IiwgIiRzdGFjayIsLyogU3RhY2sgYWRkcmVzcyBpbnN0ZWFkIG9mICVzcCAqLworCSIlYnAiLCAiJXNpIiwgIiVkaSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHg4Nl82NF9yZWdzdHJfdGJsW10gPSB7CisJIiVheCIsICIlZHgiLCAiJWN4IiwgIiVieCIsICIlc2kiLCAiJWRpIiwKKwkiJWJwIiwgIiVzcCIsICIlcjgiLCAiJXI5IiwgIiVyMTAiLCAiJXIxMSIsCisJIiVyMTIiLCAiJXIxMyIsICIlcjE0IiwgIiVyMTUiLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3g4Ni91dGlsL2ludGVsLXB0LmMgYi90b29scy9wZXJmL2FyY2gveDg2L3V0aWwvaW50ZWwtcHQuYwppbmRleCBmYjUxNDU3Li45MGZhMjI4IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2FyY2gveDg2L3V0aWwvaW50ZWwtcHQuYworKysgYi90b29scy9wZXJmL2FyY2gveDg2L3V0aWwvaW50ZWwtcHQuYwpAQCAtNjIsNiArNjIsNyBAQAogCXNpemVfdAkJCQlzbmFwc2hvdF9yZWZfYnVmX3NpemU7CiAJaW50CQkJCXNuYXBzaG90X3JlZl9jbnQ7CiAJc3RydWN0IGludGVsX3B0X3NuYXBzaG90X3JlZgkqc25hcHNob3RfcmVmczsKKwlzaXplX3QJCQkJcHJpdl9zaXplOwogfTsKIAogc3RhdGljIGludCBpbnRlbF9wdF9wYXJzZV90ZXJtc193aXRoX2RlZmF1bHQoc3RydWN0IGxpc3RfaGVhZCAqZm9ybWF0cywKQEAgLTI3MywxMSArMjc0LDM3IEBACiAJcmV0dXJuIGF0dHI7CiB9CiAKLXN0YXRpYyBzaXplX3QKLWludGVsX3B0X2luZm9fcHJpdl9zaXplKHN0cnVjdCBhdXh0cmFjZV9yZWNvcmQgKml0ciBfX21heWJlX3VudXNlZCwKLQkJCXN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0IF9fbWF5YmVfdW51c2VkKQorc3RhdGljIGNvbnN0IGNoYXIgKmludGVsX3B0X2ZpbmRfZmlsdGVyKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LAorCQkJCQlzdHJ1Y3QgcGVyZl9wbXUgKmludGVsX3B0X3BtdSkKIHsKLQlyZXR1cm4gSU5URUxfUFRfQVVYVFJBQ0VfUFJJVl9TSVpFOworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbDsKKworCWV2bGlzdF9fZm9yX2VhY2hfZW50cnkoZXZsaXN0LCBldnNlbCkgeworCQlpZiAoZXZzZWwtPmF0dHIudHlwZSA9PSBpbnRlbF9wdF9wbXUtPnR5cGUpCisJCQlyZXR1cm4gZXZzZWwtPmZpbHRlcjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHNpemVfdCBpbnRlbF9wdF9maWx0ZXJfYnl0ZXMoY29uc3QgY2hhciAqZmlsdGVyKQoreworCXNpemVfdCBsZW4gPSBmaWx0ZXIgPyBzdHJsZW4oZmlsdGVyKSA6IDA7CisKKwlyZXR1cm4gbGVuID8gcm91bmR1cChsZW4gKyAxLCA4KSA6IDA7Cit9CisKK3N0YXRpYyBzaXplX3QKK2ludGVsX3B0X2luZm9fcHJpdl9zaXplKHN0cnVjdCBhdXh0cmFjZV9yZWNvcmQgKml0ciwgc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpCit7CisJc3RydWN0IGludGVsX3B0X3JlY29yZGluZyAqcHRyID0KKwkJCWNvbnRhaW5lcl9vZihpdHIsIHN0cnVjdCBpbnRlbF9wdF9yZWNvcmRpbmcsIGl0cik7CisJY29uc3QgY2hhciAqZmlsdGVyID0gaW50ZWxfcHRfZmluZF9maWx0ZXIoZXZsaXN0LCBwdHItPmludGVsX3B0X3BtdSk7CisKKwlwdHItPnByaXZfc2l6ZSA9IChJTlRFTF9QVF9BVVhUUkFDRV9QUklWX01BWCAqIHNpemVvZih1NjQpKSArCisJCQkgaW50ZWxfcHRfZmlsdGVyX2J5dGVzKGZpbHRlcik7CisKKwlyZXR1cm4gcHRyLT5wcml2X3NpemU7CiB9CiAKIHN0YXRpYyB2b2lkIGludGVsX3B0X3RzY19jdGNfcmF0aW8odTMyICpuLCB1MzIgKmQpCkBAIC0zMDIsOSArMzI5LDEzIEBACiAJYm9vbCBjYXBfdXNlcl90aW1lX3plcm8gPSBmYWxzZSwgcGVyX2NwdV9tbWFwczsKIAl1NjQgdHNjX2JpdCwgbXRjX2JpdCwgbXRjX2ZyZXFfYml0cywgY3ljX2JpdCwgbm9yZXRjb21wX2JpdDsKIAl1MzIgdHNjX2N0Y19yYXRpb19uLCB0c2NfY3RjX3JhdGlvX2Q7CisJdW5zaWduZWQgbG9uZyBtYXhfbm9uX3R1cmJvX3JhdGlvOworCXNpemVfdCBmaWx0ZXJfc3RyX2xlbjsKKwljb25zdCBjaGFyICpmaWx0ZXI7CisJdTY0ICppbmZvOwogCWludCBlcnI7CiAKLQlpZiAocHJpdl9zaXplICE9IElOVEVMX1BUX0FVWFRSQUNFX1BSSVZfU0laRSkKKwlpZiAocHJpdl9zaXplICE9IHB0ci0+cHJpdl9zaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWludGVsX3B0X3BhcnNlX3Rlcm1zKCZpbnRlbF9wdF9wbXUtPmZvcm1hdCwgInRzYyIsICZ0c2NfYml0KTsKQEAgLTMxNyw2ICszNDgsMTMgQEAKIAogCWludGVsX3B0X3RzY19jdGNfcmF0aW8oJnRzY19jdGNfcmF0aW9fbiwgJnRzY19jdGNfcmF0aW9fZCk7CiAKKwlpZiAocGVyZl9wbXVfX3NjYW5fZmlsZShpbnRlbF9wdF9wbXUsICJtYXhfbm9udHVyYm9fcmF0aW8iLAorCQkJCSIlbHUiLCAmbWF4X25vbl90dXJib19yYXRpbykgIT0gMSkKKwkJbWF4X25vbl90dXJib19yYXRpbyA9IDA7CisKKwlmaWx0ZXIgPSBpbnRlbF9wdF9maW5kX2ZpbHRlcihzZXNzaW9uLT5ldmxpc3QsIHB0ci0+aW50ZWxfcHRfcG11KTsKKwlmaWx0ZXJfc3RyX2xlbiA9IGZpbHRlciA/IHN0cmxlbihmaWx0ZXIpIDogMDsKKwogCWlmICghc2Vzc2lvbi0+ZXZsaXN0LT5ucl9tbWFwcykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTM1MSw2ICszODksMTcgQEAKIAlhdXh0cmFjZV9pbmZvLT5wcml2W0lOVEVMX1BUX1RTQ19DVENfTl0gPSB0c2NfY3RjX3JhdGlvX247CiAJYXV4dHJhY2VfaW5mby0+cHJpdltJTlRFTF9QVF9UU0NfQ1RDX0RdID0gdHNjX2N0Y19yYXRpb19kOwogCWF1eHRyYWNlX2luZm8tPnByaXZbSU5URUxfUFRfQ1lDX0JJVF0gPSBjeWNfYml0OworCWF1eHRyYWNlX2luZm8tPnByaXZbSU5URUxfUFRfTUFYX05PTlRVUkJPX1JBVElPXSA9IG1heF9ub25fdHVyYm9fcmF0aW87CisJYXV4dHJhY2VfaW5mby0+cHJpdltJTlRFTF9QVF9GSUxURVJfU1RSX0xFTl0gPSBmaWx0ZXJfc3RyX2xlbjsKKworCWluZm8gPSAmYXV4dHJhY2VfaW5mby0+cHJpdltJTlRFTF9QVF9GSUxURVJfU1RSX0xFTl0gKyAxOworCisJaWYgKGZpbHRlcl9zdHJfbGVuKSB7CisJCXNpemVfdCBsZW4gPSBpbnRlbF9wdF9maWx0ZXJfYnl0ZXMoZmlsdGVyKTsKKworCQlzdHJuY3B5KChjaGFyICopaW5mbywgZmlsdGVyLCBsZW4pOworCQlpbmZvICs9IGxlbiA+PiAzOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtNTAxLDcgKzU1MCw3IEBACiAJc3RydWN0IGludGVsX3B0X3JlY29yZGluZyAqcHRyID0KIAkJCWNvbnRhaW5lcl9vZihpdHIsIHN0cnVjdCBpbnRlbF9wdF9yZWNvcmRpbmcsIGl0cik7CiAJc3RydWN0IHBlcmZfcG11ICppbnRlbF9wdF9wbXUgPSBwdHItPmludGVsX3B0X3BtdTsKLQlib29sIGhhdmVfdGltaW5nX2luZm87CisJYm9vbCBoYXZlX3RpbWluZ19pbmZvLCBuZWVkX2ltbWVkaWF0ZSA9IGZhbHNlOwogCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgKmludGVsX3B0X2V2c2VsID0gTlVMTDsKIAljb25zdCBzdHJ1Y3QgY3B1X21hcCAqY3B1cyA9IGV2bGlzdC0+Y3B1czsKIAlib29sIHByaXZpbGVnZWQgPSBnZXRldWlkKCkgPT0gMCB8fCBwZXJmX2V2ZW50X3BhcmFub2lkKCkgPCAwOwpAQCAtNjU1LDYgKzcwNCw3IEBACiAJCQkJcHRyLT5oYXZlX3NjaGVkX3N3aXRjaCA9IDM7CiAJCQl9IGVsc2UgewogCQkJCW9wdHMtPnJlY29yZF9zd2l0Y2hfZXZlbnRzID0gdHJ1ZTsKKwkJCQluZWVkX2ltbWVkaWF0ZSA9IHRydWU7CiAJCQkJaWYgKGNwdV93aWRlKQogCQkJCQlwdHItPmhhdmVfc2NoZWRfc3dpdGNoID0gMzsKIAkJCQllbHNlCkBAIC03MDAsNiArNzUwLDkgQEAKIAkJdHJhY2tpbmdfZXZzZWwtPmF0dHIuZnJlcSA9IDA7CiAJCXRyYWNraW5nX2V2c2VsLT5hdHRyLnNhbXBsZV9wZXJpb2QgPSAxOwogCisJCWlmIChuZWVkX2ltbWVkaWF0ZSkKKwkJCXRyYWNraW5nX2V2c2VsLT5pbW1lZGlhdGUgPSB0cnVlOworCiAJCS8qIEluIHBlci1jcHUgY2FzZSwgYWx3YXlzIG5lZWQgdGhlIHRpbWUgb2YgbW1hcCBldmVudHMgZXRjICovCiAJCWlmICghY3B1X21hcF9fZW1wdHkoY3B1cykpIHsKIAkJCXBlcmZfZXZzZWxfX3NldF9zYW1wbGVfYml0KHRyYWNraW5nX2V2c2VsLCBUSU1FKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC94dGVuc2EvaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmggYi90b29scy9wZXJmL2FyY2gveHRlbnNhL2luY2x1ZGUvZHdhcmYtcmVncy10YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMDQ0NGEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2FyY2gveHRlbnNhL2luY2x1ZGUvZHdhcmYtcmVncy10YWJsZS5oCkBAIC0wLDAgKzEsOCBAQAorI2lmZGVmIERFRklORV9EV0FSRl9SRUdTVFJfVEFCTEUKKy8qIFRoaXMgaXMgaW5jbHVkZWQgaW4gcGVyZi91dGlsL2R3YXJmLXJlZ3MuYyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHh0ZW5zYV9yZWdzdHJfdGJsW10gPSB7CisJImEwIiwgImExIiwgImEyIiwgImEzIiwgImE0IiwgImE1IiwgImE2IiwgImE3IiwKKwkiYTgiLCAiYTkiLCAiYTEwIiwgImExMSIsICJhMTIiLCAiYTEzIiwgImExNCIsICJhMTUiLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9iZW5jaC9mdXRleC1yZXF1ZXVlLmMgYi90b29scy9wZXJmL2JlbmNoL2Z1dGV4LXJlcXVldWUuYwppbmRleCBmOTZlMjJlLi4yYjk3MDVhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2JlbmNoL2Z1dGV4LXJlcXVldWUuYworKysgYi90b29scy9wZXJmL2JlbmNoL2Z1dGV4LXJlcXVldWUuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPHN1YmNtZC9wYXJzZS1vcHRpb25zLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lNjQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgImJlbmNoLmgiCiAjaW5jbHVkZSAiZnV0ZXguaCIKQEAgLTYyLDcgKzYzLDcgQEAKIAlwcmludGYoIlJlcXVldWVkICVkIG9mICVkIHRocmVhZHMgaW4gJS40ZiBtcyAoKy0lLjJmJSUpXG4iLAogCSAgICAgICByZXF1ZXVlZF9hdmcsCiAJICAgICAgIG50aHJlYWRzLAotCSAgICAgICByZXF1ZXVldGltZV9hdmcvMWUzLAorCSAgICAgICByZXF1ZXVldGltZV9hdmcgLyBVU0VDX1BFUl9NU0VDLAogCSAgICAgICByZWxfc3RkZGV2X3N0YXRzKHJlcXVldWV0aW1lX3N0ZGRldiwgcmVxdWV1ZXRpbWVfYXZnKSk7CiB9CiAKQEAgLTE4NCw3ICsxODUsNyBAQAogCiAJCWlmICghc2lsZW50KSB7CiAJCQlwcmludGYoIltSdW4gJWRdOiBSZXF1ZXVlZCAlZCBvZiAlZCB0aHJlYWRzIGluICUuNGYgbXNcbiIsCi0JCQkgICAgICAgaiArIDEsIG5yZXF1ZXVlZCwgbnRocmVhZHMsIHJ1bnRpbWUudHZfdXNlYy8xZTMpOworCQkJICAgICAgIGogKyAxLCBucmVxdWV1ZWQsIG50aHJlYWRzLCBydW50aW1lLnR2X3VzZWMgLyAoZG91YmxlKVVTRUNfUEVSX01TRUMpOwogCQl9CiAKIAkJLyogZXZlcnlib2R5IHNob3VsZCBiZSBibG9ja2VkIG9uIGZ1dGV4Miwgd2FrZSdlbSB1cCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9iZW5jaC9mdXRleC13YWtlLXBhcmFsbGVsLmMgYi90b29scy9wZXJmL2JlbmNoL2Z1dGV4LXdha2UtcGFyYWxsZWwuYwppbmRleCA0YTJlY2Q3Li4yYzhmYTY3IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2JlbmNoL2Z1dGV4LXdha2UtcGFyYWxsZWwuYworKysgYi90b29scy9wZXJmL2JlbmNoL2Z1dGV4LXdha2UtcGFyYWxsZWwuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPHN1YmNtZC9wYXJzZS1vcHRpb25zLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lNjQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgImJlbmNoLmgiCiAjaW5jbHVkZSAiZnV0ZXguaCIKQEAgLTE1Niw3ICsxNTcsNyBAQAogCiAJcHJpbnRmKCJbUnVuICVkXTogQXZnIHBlci10aHJlYWQgbGF0ZW5jeSAod2FraW5nICVkLyVkIHRocmVhZHMpICIKIAkgICAgICAgImluICUuNGYgbXMgKCstJS4yZiUlKVxuIiwgcnVuX251bSArIDEsIHdha2V1cF9hdmcsCi0JICAgICAgIG5ibG9ja2VkX3RocmVhZHMsIHdha2V0aW1lX2F2Zy8xZTMsCisJICAgICAgIG5ibG9ja2VkX3RocmVhZHMsIHdha2V0aW1lX2F2ZyAvIFVTRUNfUEVSX01TRUMsCiAJICAgICAgIHJlbF9zdGRkZXZfc3RhdHMod2FrZXRpbWVfc3RkZGV2LCB3YWtldGltZV9hdmcpKTsKIH0KIApAQCAtMTcyLDcgKzE3Myw3IEBACiAJcHJpbnRmKCJBdmcgcGVyLXRocmVhZCBsYXRlbmN5ICh3YWtpbmcgJWQvJWQgdGhyZWFkcykgaW4gJS40ZiBtcyAoKy0lLjJmJSUpXG4iLAogCSAgICAgICB3YWtldXBfYXZnLAogCSAgICAgICBuYmxvY2tlZF90aHJlYWRzLAotCSAgICAgICB3YWtldGltZV9hdmcvMWUzLAorCSAgICAgICB3YWtldGltZV9hdmcgLyBVU0VDX1BFUl9NU0VDLAogCSAgICAgICByZWxfc3RkZGV2X3N0YXRzKHdha2V0aW1lX3N0ZGRldiwgd2FrZXRpbWVfYXZnKSk7CiB9CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYmVuY2gvZnV0ZXgtd2FrZS5jIGIvdG9vbHMvcGVyZi9iZW5jaC9mdXRleC13YWtlLmMKaW5kZXggODdkOGY0Zi4uZTI0NmIxYiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9iZW5jaC9mdXRleC13YWtlLmMKKysrIGIvdG9vbHMvcGVyZi9iZW5jaC9mdXRleC13YWtlLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxzdWJjbWQvcGFyc2Utb3B0aW9ucy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZTY0Lmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlICJiZW5jaC5oIgogI2luY2x1ZGUgImZ1dGV4LmgiCkBAIC04MSw3ICs4Miw3IEBACiAJcHJpbnRmKCJXb2tldXAgJWQgb2YgJWQgdGhyZWFkcyBpbiAlLjRmIG1zICgrLSUuMmYlJSlcbiIsCiAJICAgICAgIHdha2V1cF9hdmcsCiAJICAgICAgIG50aHJlYWRzLAotCSAgICAgICB3YWtldGltZV9hdmcvMWUzLAorCSAgICAgICB3YWtldGltZV9hdmcgLyBVU0VDX1BFUl9NU0VDLAogCSAgICAgICByZWxfc3RkZGV2X3N0YXRzKHdha2V0aW1lX3N0ZGRldiwgd2FrZXRpbWVfYXZnKSk7CiB9CiAKQEAgLTE4Miw3ICsxODMsNyBAQAogCiAJCWlmICghc2lsZW50KSB7CiAJCQlwcmludGYoIltSdW4gJWRdOiBXb2tldXAgJWQgb2YgJWQgdGhyZWFkcyBpbiAlLjRmIG1zXG4iLAotCQkJICAgICAgIGogKyAxLCBud29rZW4sIG50aHJlYWRzLCBydW50aW1lLnR2X3VzZWMvMWUzKTsKKwkJCSAgICAgICBqICsgMSwgbndva2VuLCBudGhyZWFkcywgcnVudGltZS50dl91c2VjIC8gKGRvdWJsZSlVU0VDX1BFUl9NU0VDKTsKIAkJfQogCiAJCWZvciAoaSA9IDA7IGkgPCBudGhyZWFkczsgaSsrKSB7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2JlbmNoL21lbS1mdW5jdGlvbnMuYyBiL3Rvb2xzL3BlcmYvYmVuY2gvbWVtLWZ1bmN0aW9ucy5jCmluZGV4IDJiNTRkMGYuLmM2ODQ5MTAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYmVuY2gvbWVtLWZ1bmN0aW9ucy5jCisrKyBiL3Rvb2xzL3BlcmYvYmVuY2gvbWVtLWZ1bmN0aW9ucy5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWU2NC5oPgogCiAjZGVmaW5lIEsgMTAyNAogCkBAIC04OSw3ICs5MCw3IEBACiAKIHN0YXRpYyBkb3VibGUgdGltZXZhbDJkb3VibGUoc3RydWN0IHRpbWV2YWwgKnRzKQogewotCXJldHVybiAoZG91YmxlKXRzLT50dl9zZWMgKyAoZG91YmxlKXRzLT50dl91c2VjIC8gKGRvdWJsZSkxMDAwMDAwOworCXJldHVybiAoZG91YmxlKXRzLT50dl9zZWMgKyAoZG91YmxlKXRzLT50dl91c2VjIC8gKGRvdWJsZSlVU0VDX1BFUl9TRUM7CiB9CiAKICNkZWZpbmUgcHJpbnRfYnBzKHgpIGRvIHsJCQkJCQlcCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2JlbmNoL251bWEuYyBiL3Rvb2xzL3BlcmYvYmVuY2gvbnVtYS5jCmluZGV4IGY3ZjUzMDAuLjhlZmU5MDQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYmVuY2gvbnVtYS5jCisrKyBiL3Rvb2xzL3BlcmYvYmVuY2gvbnVtYS5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4KICNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lNjQuaD4KIAogI2luY2x1ZGUgPG51bWEuaD4KICNpbmNsdWRlIDxudW1haWYuaD4KQEAgLTEwMDQsNyArMTAwNSw3IEBACiAJaWYgKHN0cm9uZyAmJiBwcm9jZXNzX2dyb3VwcyA9PSBnLT5wLm5yX3Byb2MpIHsKIAkJaWYgKCEqY29udmVyZ2VuY2UpIHsKIAkJCSpjb252ZXJnZW5jZSA9IHJ1bnRpbWVfbnNfbWF4OwotCQkJdHByaW50ZigiICglNi4xZnMgY29udmVyZ2VkKVxuIiwgKmNvbnZlcmdlbmNlLzFlOSk7CisJCQl0cHJpbnRmKCIgKCU2LjFmcyBjb252ZXJnZWQpXG4iLCAqY29udmVyZ2VuY2UgLyBOU0VDX1BFUl9TRUMpOwogCQkJaWYgKGctPnAubWVhc3VyZV9jb252ZXJnZW5jZSkgewogCQkJCWctPmFsbF9jb252ZXJnZWQgPSB0cnVlOwogCQkJCWctPnN0b3Bfd29yayA9IHRydWU7CkBAIC0xMDEyLDcgKzEwMTMsNyBAQAogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKCpjb252ZXJnZW5jZSkgewotCQkJdHByaW50ZigiICglNi4xZnMgZGUtY29udmVyZ2VkKSIsIHJ1bnRpbWVfbnNfbWF4LzFlOSk7CisJCQl0cHJpbnRmKCIgKCU2LjFmcyBkZS1jb252ZXJnZWQpIiwgcnVudGltZV9uc19tYXggLyBOU0VDX1BFUl9TRUMpOwogCQkJKmNvbnZlcmdlbmNlID0gMDsKIAkJfQogCQl0cHJpbnRmKCJcbiIpOwpAQCAtMTAyMiw3ICsxMDIzLDcgQEAKIHN0YXRpYyB2b2lkIHNob3dfc3VtbWFyeShkb3VibGUgcnVudGltZV9uc19tYXgsIGludCBsLCBkb3VibGUgKmNvbnZlcmdlbmNlKQogewogCXRwcmludGYoIlxyICMgICU1LjFmJSUgIFslLjFmIG1pbnNdIiwKLQkJKGRvdWJsZSkobCsxKS9nLT5wLm5yX2xvb3BzKjEwMC4wLCBydW50aW1lX25zX21heC8xZTkgLyA2MC4wKTsKKwkJKGRvdWJsZSkobCsxKS9nLT5wLm5yX2xvb3BzKjEwMC4wLCBydW50aW1lX25zX21heCAvIE5TRUNfUEVSX1NFQyAvIDYwLjApOwogCiAJY2FsY19jb252ZXJnZW5jZShydW50aW1lX25zX21heCwgY29udmVyZ2VuY2UpOwogCkBAIC0xMTc5LDggKzExODAsOCBAQAogCiAJCWlmIChkZXRhaWxzID49IDMpIHsKIAkJCXRpbWVyc3ViKCZzdG9wLCAmc3RhcnQsICZkaWZmKTsKLQkJCXJ1bnRpbWVfbnNfbWF4ID0gZGlmZi50dl9zZWMgKiAxMDAwMDAwMDAwOwotCQkJcnVudGltZV9uc19tYXggKz0gZGlmZi50dl91c2VjICogMTAwMDsKKwkJCXJ1bnRpbWVfbnNfbWF4ID0gZGlmZi50dl9zZWMgKiBOU0VDX1BFUl9TRUM7CisJCQlydW50aW1lX25zX21heCArPSBkaWZmLnR2X3VzZWMgKiBOU0VDX1BFUl9VU0VDOwogCiAJCQlpZiAoZGV0YWlscyA+PSAwKSB7CiAJCQkJcHJpbnRmKCIgIyUyZCAvICUyZDogJTE0LjJsZiBuc2Vjcy9vcCBbdmFsOiAlMDE2IlBSSXg2NCJdXG4iLApAQCAtMTE5MiwyMyArMTE5MywyMyBAQAogCQkJY29udGludWU7CiAKIAkJdGltZXJzdWIoJnN0b3AsICZzdGFydDAsICZkaWZmKTsKLQkJcnVudGltZV9uc19tYXggPSBkaWZmLnR2X3NlYyAqIDEwMDAwMDAwMDBVTEw7Ci0JCXJ1bnRpbWVfbnNfbWF4ICs9IGRpZmYudHZfdXNlYyAqIDEwMDBVTEw7CisJCXJ1bnRpbWVfbnNfbWF4ID0gZGlmZi50dl9zZWMgKiBOU0VDX1BFUl9TRUM7CisJCXJ1bnRpbWVfbnNfbWF4ICs9IGRpZmYudHZfdXNlYyAqIE5TRUNfUEVSX1VTRUM7CiAKIAkJc2hvd19zdW1tYXJ5KHJ1bnRpbWVfbnNfbWF4LCBsLCAmY29udmVyZ2VuY2UpOwogCX0KIAogCWdldHRpbWVvZmRheSgmc3RvcCwgTlVMTCk7CiAJdGltZXJzdWIoJnN0b3AsICZzdGFydDAsICZkaWZmKTsKLQl0ZC0+cnVudGltZV9ucyA9IGRpZmYudHZfc2VjICogMTAwMDAwMDAwMFVMTDsKLQl0ZC0+cnVudGltZV9ucyArPSBkaWZmLnR2X3VzZWMgKiAxMDAwVUxMOwotCXRkLT5zcGVlZF9nYnMgPSBieXRlc19kb25lIC8gKHRkLT5ydW50aW1lX25zIC8gMWU5KSAvIDFlOTsKKwl0ZC0+cnVudGltZV9ucyA9IGRpZmYudHZfc2VjICogTlNFQ19QRVJfU0VDOworCXRkLT5ydW50aW1lX25zICs9IGRpZmYudHZfdXNlYyAqIE5TRUNfUEVSX1VTRUM7CisJdGQtPnNwZWVkX2dicyA9IGJ5dGVzX2RvbmUgLyAodGQtPnJ1bnRpbWVfbnMgLyBOU0VDX1BFUl9TRUMpIC8gMWU5OwogCiAJZ2V0cnVzYWdlKFJVU0FHRV9USFJFQUQsICZydXNhZ2UpOwotCXRkLT5zeXN0ZW1fdGltZV9ucyA9IHJ1c2FnZS5ydV9zdGltZS50dl9zZWMgKiAxMDAwMDAwMDAwVUxMOwotCXRkLT5zeXN0ZW1fdGltZV9ucyArPSBydXNhZ2UucnVfc3RpbWUudHZfdXNlYyAqIDEwMDBVTEw7Ci0JdGQtPnVzZXJfdGltZV9ucyA9IHJ1c2FnZS5ydV91dGltZS50dl9zZWMgKiAxMDAwMDAwMDAwVUxMOwotCXRkLT51c2VyX3RpbWVfbnMgKz0gcnVzYWdlLnJ1X3V0aW1lLnR2X3VzZWMgKiAxMDAwVUxMOworCXRkLT5zeXN0ZW1fdGltZV9ucyA9IHJ1c2FnZS5ydV9zdGltZS50dl9zZWMgKiBOU0VDX1BFUl9TRUM7CisJdGQtPnN5c3RlbV90aW1lX25zICs9IHJ1c2FnZS5ydV9zdGltZS50dl91c2VjICogTlNFQ19QRVJfVVNFQzsKKwl0ZC0+dXNlcl90aW1lX25zID0gcnVzYWdlLnJ1X3V0aW1lLnR2X3NlYyAqIE5TRUNfUEVSX1NFQzsKKwl0ZC0+dXNlcl90aW1lX25zICs9IHJ1c2FnZS5ydV91dGltZS50dl91c2VjICogTlNFQ19QRVJfVVNFQzsKIAogCWZyZWVfZGF0YSh0aHJlYWRfZGF0YSwgZy0+cC5ieXRlc190aHJlYWQpOwogCkBAIC0xNDY5LDcgKzE0NzAsNyBAQAogCX0KIAkvKiBXYWl0IGZvciBhbGwgdGhlIHRocmVhZHMgdG8gc3RhcnQgdXA6ICovCiAJd2hpbGUgKGctPm5yX3Rhc2tzX3N0YXJ0ZWQgIT0gZy0+cC5ucl90YXNrcykKLQkJdXNsZWVwKDEwMDApOworCQl1c2xlZXAoVVNFQ19QRVJfTVNFQyk7CiAKIAlCVUdfT04oZy0+bnJfdGFza3Nfc3RhcnRlZCAhPSBnLT5wLm5yX3Rhc2tzKTsKIApAQCAtMTQ4OCw5ICsxNDg5LDkgQEAKIAogCQl0aW1lcnN1Yigmc3RvcCwgJnN0YXJ0LCAmZGlmZik7CiAKLQkJc3RhcnR1cF9zZWMgPSBkaWZmLnR2X3NlYyAqIDEwMDAwMDAwMDAuMDsKLQkJc3RhcnR1cF9zZWMgKz0gZGlmZi50dl91c2VjICogMTAwMC4wOwotCQlzdGFydHVwX3NlYyAvPSAxZTk7CisJCXN0YXJ0dXBfc2VjID0gZGlmZi50dl9zZWMgKiBOU0VDX1BFUl9TRUM7CisJCXN0YXJ0dXBfc2VjICs9IGRpZmYudHZfdXNlYyAqIE5TRUNfUEVSX1VTRUM7CisJCXN0YXJ0dXBfc2VjIC89IE5TRUNfUEVSX1NFQzsKIAogCQl0cHJpbnRmKCIgdGhyZWFkcyBpbml0aWFsaXplZCBpbiAlLjZmIHNlY29uZHMuXG4iLCBzdGFydHVwX3NlYyk7CiAJCXRwcmludGYoIiAjXG4iKTsKQEAgLTE1MjksMTQgKzE1MzAsMTQgQEAKIAl0cHJpbnRmKCJcbiAjIyNcbiIpOwogCXRwcmludGYoIlxuIik7CiAKLQlydW50aW1lX3NlY19tYXggPSBkaWZmLnR2X3NlYyAqIDEwMDAwMDAwMDAuMDsKLQlydW50aW1lX3NlY19tYXggKz0gZGlmZi50dl91c2VjICogMTAwMC4wOwotCXJ1bnRpbWVfc2VjX21heCAvPSAxZTk7CisJcnVudGltZV9zZWNfbWF4ID0gZGlmZi50dl9zZWMgKiBOU0VDX1BFUl9TRUM7CisJcnVudGltZV9zZWNfbWF4ICs9IGRpZmYudHZfdXNlYyAqIE5TRUNfUEVSX1VTRUM7CisJcnVudGltZV9zZWNfbWF4IC89IE5TRUNfUEVSX1NFQzsKIAotCXJ1bnRpbWVfc2VjX21pbiA9IHJ1bnRpbWVfbnNfbWluLzFlOTsKKwlydW50aW1lX3NlY19taW4gPSBydW50aW1lX25zX21pbiAvIE5TRUNfUEVSX1NFQzsKIAogCWJ5dGVzID0gZy0+Ynl0ZXNfZG9uZTsKLQlydW50aW1lX2F2ZyA9IChkb3VibGUpcnVudGltZV9uc19zdW0gLyBnLT5wLm5yX3Rhc2tzIC8gMWU5OworCXJ1bnRpbWVfYXZnID0gKGRvdWJsZSlydW50aW1lX25zX3N1bSAvIGctPnAubnJfdGFza3MgLyBOU0VDX1BFUl9TRUM7CiAKIAlpZiAoZy0+cC5tZWFzdXJlX2NvbnZlcmdlbmNlKSB7CiAJCXByaW50X3JlcyhuYW1lLCBydW50aW1lX3NlY19tYXgsCkBAIC0xNTYyLDcgKzE1NjMsNyBAQAogCXByaW50X3JlcyhuYW1lLCBieXRlcyAvIDFlOSwKIAkJIkdCLCIsICJkYXRhLXRvdGFsIiwJCSJHQiBkYXRhIHByb2Nlc3NlZCwgdG90YWwiKTsKIAotCXByaW50X3JlcyhuYW1lLCBydW50aW1lX3NlY19tYXggKiAxZTkgLyAoYnl0ZXMgLyBnLT5wLm5yX3Rhc2tzKSwKKwlwcmludF9yZXMobmFtZSwgcnVudGltZV9zZWNfbWF4ICogTlNFQ19QRVJfU0VDIC8gKGJ5dGVzIC8gZy0+cC5ucl90YXNrcyksCiAJCSJuc2VjcywiLCAicnVudGltZS9ieXRlL3RocmVhZCIsIm5zZWNzL2J5dGUvdGhyZWFkIHJ1bnRpbWUiKTsKIAogCXByaW50X3JlcyhuYW1lLCBieXRlcyAvIGctPnAubnJfdGFza3MgLyAxZTkgLyBydW50aW1lX3NlY19tYXgsCkBAIC0xNTgxLDkgKzE1ODIsOSBAQAogCQkJCXNucHJpbnRmKHRuYW1lLCAzMiwgInByb2Nlc3MlZDp0aHJlYWQlZCIsIHAsIHQpOwogCQkJCXByaW50X3Jlcyh0bmFtZSwgdGQtPnNwZWVkX2dicywKIAkJCQkJIkdCL3NlYyIsCSJ0aHJlYWQtc3BlZWQiLCAiR0Ivc2VjL3RocmVhZCBzcGVlZCIpOwotCQkJCXByaW50X3Jlcyh0bmFtZSwgdGQtPnN5c3RlbV90aW1lX25zIC8gMWU5LAorCQkJCXByaW50X3Jlcyh0bmFtZSwgdGQtPnN5c3RlbV90aW1lX25zIC8gTlNFQ19QRVJfU0VDLAogCQkJCQkic2VjcyIsCSJ0aHJlYWQtc3lzdGVtLXRpbWUiLCAic3lzdGVtIENQVSB0aW1lL3RocmVhZCIpOwotCQkJCXByaW50X3Jlcyh0bmFtZSwgdGQtPnVzZXJfdGltZV9ucyAvIDFlOSwKKwkJCQlwcmludF9yZXModG5hbWUsIHRkLT51c2VyX3RpbWVfbnMgLyBOU0VDX1BFUl9TRUMsCiAJCQkJCSJzZWNzIiwJInRocmVhZC11c2VyLXRpbWUiLCAidXNlciBDUFUgdGltZS90aHJlYWQiKTsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9iZW5jaC9zY2hlZC1tZXNzYWdpbmcuYyBiL3Rvb2xzL3BlcmYvYmVuY2gvc2NoZWQtbWVzc2FnaW5nLmMKaW5kZXggYmZhZjk1MC4uNmExMTFlNyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9iZW5jaC9zY2hlZC1tZXNzYWdpbmcuYworKysgYi90b29scy9wZXJmL2JlbmNoL3NjaGVkLW1lc3NhZ2luZy5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8cG9sbC5oPgogI2luY2x1ZGUgPGxpbWl0cy5oPgogI2luY2x1ZGUgPGVyci5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWU2NC5oPgogCiAjZGVmaW5lIERBVEFTSVpFIDEwMAogCkBAIC0zMTIsMTEgKzMxMywxMSBAQAogCQkgICAgICAgdGhyZWFkX21vZGUgPyAidGhyZWFkcyIgOiAicHJvY2Vzc2VzIik7CiAJCXByaW50ZigiICUxNHM6ICVsdS4lMDNsdSBbc2VjXVxuIiwgIlRvdGFsIHRpbWUiLAogCQkgICAgICAgZGlmZi50dl9zZWMsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZykgKGRpZmYudHZfdXNlYy8xMDAwKSk7CisJCSAgICAgICAodW5zaWduZWQgbG9uZykgKGRpZmYudHZfdXNlYyAvIFVTRUNfUEVSX01TRUMpKTsKIAkJYnJlYWs7CiAJY2FzZSBCRU5DSF9GT1JNQVRfU0lNUExFOgogCQlwcmludGYoIiVsdS4lMDNsdVxuIiwgZGlmZi50dl9zZWMsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZykgKGRpZmYudHZfdXNlYy8xMDAwKSk7CisJCSAgICAgICAodW5zaWduZWQgbG9uZykgKGRpZmYudHZfdXNlYyAvIFVTRUNfUEVSX01TRUMpKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJLyogcmVhY2hpbmcgaGVyZSBpcyBzb21ldGhpbmcgZGlzYXN0ZXIgKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYmVuY2gvc2NoZWQtcGlwZS5jIGIvdG9vbHMvcGVyZi9iZW5jaC9zY2hlZC1waXBlLmMKaW5kZXggMWRjMmQxMy4uMjI0M2YwMSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9iZW5jaC9zY2hlZC1waXBlLmMKKysrIGIvdG9vbHMvcGVyZi9iZW5jaC9zY2hlZC1waXBlLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZTY0Lmg+CiAKICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAKQEAgLTE1MywyNCArMTU0LDI0IEBACiAJCXByaW50ZigiIyBFeGVjdXRlZCAlZCBwaXBlIG9wZXJhdGlvbnMgYmV0d2VlbiB0d28gJXNcblxuIiwKIAkJCWxvb3BzLCB0aHJlYWRlZCA/ICJ0aHJlYWRzIiA6ICJwcm9jZXNzZXMiKTsKIAotCQlyZXN1bHRfdXNlYyA9IGRpZmYudHZfc2VjICogMTAwMDAwMDsKKwkJcmVzdWx0X3VzZWMgPSBkaWZmLnR2X3NlYyAqIFVTRUNfUEVSX1NFQzsKIAkJcmVzdWx0X3VzZWMgKz0gZGlmZi50dl91c2VjOwogCiAJCXByaW50ZigiICUxNHM6ICVsdS4lMDNsdSBbc2VjXVxuXG4iLCAiVG90YWwgdGltZSIsCiAJCSAgICAgICBkaWZmLnR2X3NlYywKLQkJICAgICAgICh1bnNpZ25lZCBsb25nKSAoZGlmZi50dl91c2VjLzEwMDApKTsKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSAoZGlmZi50dl91c2VjIC8gVVNFQ19QRVJfTVNFQykpOwogCiAJCXByaW50ZigiICUxNGxmIHVzZWNzL29wXG4iLAogCQkgICAgICAgKGRvdWJsZSlyZXN1bHRfdXNlYyAvIChkb3VibGUpbG9vcHMpOwogCQlwcmludGYoIiAlMTRkIG9wcy9zZWNcbiIsCiAJCSAgICAgICAoaW50KSgoZG91YmxlKWxvb3BzIC8KLQkJCSAgICAgKChkb3VibGUpcmVzdWx0X3VzZWMgLyAoZG91YmxlKTEwMDAwMDApKSk7CisJCQkgICAgICgoZG91YmxlKXJlc3VsdF91c2VjIC8gKGRvdWJsZSlVU0VDX1BFUl9TRUMpKSk7CiAJCWJyZWFrOwogCiAJY2FzZSBCRU5DSF9GT1JNQVRfU0lNUExFOgogCQlwcmludGYoIiVsdS4lMDNsdVxuIiwKIAkJICAgICAgIGRpZmYudHZfc2VjLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIChkaWZmLnR2X3VzZWMgLyAxMDAwKSk7CisJCSAgICAgICAodW5zaWduZWQgbG9uZykgKGRpZmYudHZfdXNlYyAvIFVTRUNfUEVSX01TRUMpKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLWFubm90YXRlLmMgYi90b29scy9wZXJmL2J1aWx0aW4tYW5ub3RhdGUuYwppbmRleCA5YzEwMzRkLi5lYmI2MjgzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tYW5ub3RhdGUuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tYW5ub3RhdGUuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgInV0aWwvdG9vbC5oIgogI2luY2x1ZGUgInV0aWwvZGF0YS5oIgogI2luY2x1ZGUgImFyY2gvY29tbW9uLmgiCisjaW5jbHVkZSAidXRpbC9ibG9jay1yYW5nZS5oIgogCiAjaW5jbHVkZSA8ZGxmY24uaD4KICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KQEAgLTQ2LDYgKzQ3LDEwMyBAQAogCURFQ0xBUkVfQklUTUFQKGNwdV9iaXRtYXAsIE1BWF9OUl9DUFVTKTsKIH07CiAKKy8qCisgKiBHaXZlbiBvbmUgYmFzaWMgYmxvY2s6CisgKgorICoJZnJvbQl0bwkJYnJhbmNoX2kKKyAqCSogLS0tLT4gKgorICoJCXwKKyAqCQl8IGJsb2NrCisgKgkJdgorICoJCSogLS0tLT4gKgorICoJCWZyb20JdG8JYnJhbmNoX2krMQorICoKKyAqIHdoZXJlIHRoZSBob3Jpem9udGFsIGFyZSB0aGUgYnJhbmNoZXMgYW5kIHRoZSB2ZXJ0aWNhbCBpcyB0aGUgZXhlY3V0ZWQKKyAqIGJsb2NrIG9mIGluc3RydWN0aW9ucy4KKyAqCisgKiBXZSBjb3VudCwgZm9yIGVhY2ggJ2luc3RydWN0aW9uJywgdGhlIG51bWJlciBvZiBibG9ja3MgdGhhdCBjb3ZlcmVkIGl0IGFzCisgKiB3ZWxsIGFzIGNvdW50IHRoZSByYXRpbyBlYWNoIGJyYW5jaCBpcyB0YWtlbi4KKyAqCisgKiBXZSBjYW4gZG8gdGhpcyB3aXRob3V0IGtub3dpbmcgdGhlIGFjdHVhbCBpbnN0cnVjdGlvbiBzdHJlYW0gYnkga2VlcGluZworICogdHJhY2sgb2YgdGhlIGFkZHJlc3MgcmFuZ2VzLiBXZSBicmVhayBkb3duIHJhbmdlcyBzdWNoIHRoYXQgdGhlcmUgaXMgbm8KKyAqIG92ZXJsYXAgYW5kIGl0ZXJhdGUgZnJvbSB0aGUgc3RhcnQgdW50aWwgdGhlIGVuZC4KKyAqCisgKiBAYWNtZTogb25jZSB3ZSBwYXJzZSB0aGUgb2JqZHVtcCBvdXRwdXQgX2JlZm9yZV8gcHJvY2Vzc2luZyB0aGUgc2FtcGxlcywKKyAqIHdlIGNhbiBlYXNpbHkgZm9sZCB0aGUgYnJhbmNoLmN5Y2xlcyBJUEMgYml0cyBpbi4KKyAqLworc3RhdGljIHZvaWQgcHJvY2Vzc19iYXNpY19ibG9jayhzdHJ1Y3QgYWRkcl9tYXBfc3ltYm9sICpzdGFydCwKKwkJCQlzdHJ1Y3QgYWRkcl9tYXBfc3ltYm9sICplbmQsCisJCQkJc3RydWN0IGJyYW5jaF9mbGFncyAqZmxhZ3MpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltID0gc3RhcnQtPnN5bTsKKwlzdHJ1Y3QgYW5ub3RhdGlvbiAqbm90ZXMgPSBzeW0gPyBzeW1ib2xfX2Fubm90YXRpb24oc3ltKSA6IE5VTEw7CisJc3RydWN0IGJsb2NrX3JhbmdlX2l0ZXIgaXRlcjsKKwlzdHJ1Y3QgYmxvY2tfcmFuZ2UgKmVudHJ5OworCisJLyoKKwkgKiBTYW5pdHk7IE5VTEwgaXNuJ3QgZXhlY3V0YWJsZSBhbmQgdGhlIENQVSBjYW5ub3QgZXhlY3V0ZSBiYWNrd2FyZHMKKwkgKi8KKwlpZiAoIXN0YXJ0LT5hZGRyIHx8IHN0YXJ0LT5hZGRyID4gZW5kLT5hZGRyKQorCQlyZXR1cm47CisKKwlpdGVyID0gYmxvY2tfcmFuZ2VfX2NyZWF0ZShzdGFydC0+YWRkciwgZW5kLT5hZGRyKTsKKwlpZiAoIWJsb2NrX3JhbmdlX2l0ZXJfX3ZhbGlkKCZpdGVyKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBGaXJzdCBibG9jayBpbiByYW5nZSBpcyBhIGJyYW5jaCB0YXJnZXQuCisJICovCisJZW50cnkgPSBibG9ja19yYW5nZV9pdGVyKCZpdGVyKTsKKwlhc3NlcnQoZW50cnktPmlzX3RhcmdldCk7CisJZW50cnktPmVudHJ5Kys7CisKKwlkbyB7CisJCWVudHJ5ID0gYmxvY2tfcmFuZ2VfaXRlcigmaXRlcik7CisKKwkJZW50cnktPmNvdmVyYWdlKys7CisJCWVudHJ5LT5zeW0gPSBzeW07CisKKwkJaWYgKG5vdGVzKQorCQkJbm90ZXMtPm1heF9jb3ZlcmFnZSA9IG1heChub3Rlcy0+bWF4X2NvdmVyYWdlLCBlbnRyeS0+Y292ZXJhZ2UpOworCisJfSB3aGlsZSAoYmxvY2tfcmFuZ2VfaXRlcl9fbmV4dCgmaXRlcikpOworCisJLyoKKwkgKiBMYXN0IGJsb2NrIGluIHJhZ2UgaXMgYSBicmFuY2guCisJICovCisJZW50cnkgPSBibG9ja19yYW5nZV9pdGVyKCZpdGVyKTsKKwlhc3NlcnQoZW50cnktPmlzX2JyYW5jaCk7CisJZW50cnktPnRha2VuKys7CisJaWYgKGZsYWdzLT5wcmVkaWN0ZWQpCisJCWVudHJ5LT5wcmVkKys7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfYnJhbmNoX3N0YWNrKHN0cnVjdCBicmFuY2hfc3RhY2sgKmJzLCBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwsCisJCQkJIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlKQoreworCXN0cnVjdCBhZGRyX21hcF9zeW1ib2wgKnByZXYgPSBOVUxMOworCXN0cnVjdCBicmFuY2hfaW5mbyAqYmk7CisJaW50IGk7CisKKwlpZiAoIWJzIHx8ICFicy0+bnIpCisJCXJldHVybjsKKworCWJpID0gc2FtcGxlX19yZXNvbHZlX2JzdGFjayhzYW1wbGUsIGFsKTsKKwlpZiAoIWJpKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSBicy0+bnIgLSAxOyBpID49IDA7IGktLSkgeworCQkvKgorCQkgKiBYWFggZmlsdGVyIGFnYWluc3Qgc3ltYm9sCisJCSAqLworCQlpZiAocHJldikKKwkJCXByb2Nlc3NfYmFzaWNfYmxvY2socHJldiwgJmJpW2ldLmZyb20sICZiaVtpXS5mbGFncyk7CisJCXByZXYgPSAmYmlbaV0udG87CisJfQorCisJZnJlZShiaSk7Cit9CisKIHN0YXRpYyBpbnQgcGVyZl9ldnNlbF9fYWRkX3NhbXBsZShzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCiAJCQkJICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKIAkJCQkgIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCwKQEAgLTcyLDYgKzE3MCwxMiBAQAogCQlyZXR1cm4gMDsKIAl9CiAKKwkvKgorCSAqIFhYWCBmaWx0ZXJlZCBzYW1wbGVzIGNhbiBzdGlsbCBoYXZlIGJyYW5jaCBlbnRpcmVzIHBvaW50aW5nIGludG8gb3VyCisJICogc3ltYm9sIGFuZCBhcmUgbWlzc2VkLgorCSAqLworCXByb2Nlc3NfYnJhbmNoX3N0YWNrKHNhbXBsZS0+YnJhbmNoX3N0YWNrLCBhbCwgc2FtcGxlKTsKKwogCXNhbXBsZS0+cGVyaW9kID0gMTsKIAlzYW1wbGUtPndlaWdodCA9IDE7CiAKQEAgLTIwNCw4ICszMDgsNiBAQAogCXN0cnVjdCBwZXJmX2V2c2VsICpwb3M7CiAJdTY0IHRvdGFsX25yX3NhbXBsZXM7CiAKLQltYWNoaW5lc19fc2V0X3N5bWJvbF9maWx0ZXIoJnNlc3Npb24tPm1hY2hpbmVzLCBzeW1ib2xfX2Fubm90YXRlX2luaXQpOwotCiAJaWYgKGFubi0+Y3B1X2xpc3QpIHsKIAkJcmV0ID0gcGVyZl9zZXNzaW9uX19jcHVfYml0bWFwKHNlc3Npb24sIGFubi0+Y3B1X2xpc3QsCiAJCQkJCSAgICAgICBhbm4tPmNwdV9iaXRtYXApOwpAQCAtMzY3LDcgKzQ2OSwxMCBAQAogCWlmIChhbm5vdGF0ZS5zZXNzaW9uID09IE5VTEwpCiAJCXJldHVybiAtMTsKIAotCXN5bWJvbF9jb25mLnByaXZfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYW5ub3RhdGlvbik7CisJcmV0ID0gc3ltYm9sX19hbm5vdGF0aW9uX2luaXQoKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXRfZGVsZXRlOworCiAJc3ltYm9sX2NvbmYudHJ5X3ZtbGludXhfcGF0aCA9IHRydWU7CiAKIAlyZXQgPSBzeW1ib2xfX2luaXQoJmFubm90YXRlLnNlc3Npb24tPmhlYWRlci5lbnYpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLWRpZmYuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1kaWZmLmMKaW5kZXggMjFlZTc1My4uOWZmMGRiNCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLWRpZmYuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tZGlmZi5jCkBAIC0xMDMzLDcgKzEwMzMsOSBAQAogfQogCiBzdGF0aWMgaW50IGhwcF9faGVhZGVyKHN0cnVjdCBwZXJmX2hwcF9mbXQgKmZtdCwgc3RydWN0IHBlcmZfaHBwICpocHAsCi0JCSAgICAgICBzdHJ1Y3QgaGlzdHMgKmhpc3RzIF9fbWF5YmVfdW51c2VkKQorCQkgICAgICAgc3RydWN0IGhpc3RzICpoaXN0cyBfX21heWJlX3VudXNlZCwKKwkJICAgICAgIGludCBsaW5lIF9fbWF5YmVfdW51c2VkLAorCQkgICAgICAgaW50ICpzcGFuIF9fbWF5YmVfdW51c2VkKQogewogCXN0cnVjdCBkaWZmX2hwcF9mbXQgKmRmbXQgPQogCQljb250YWluZXJfb2YoZm10LCBzdHJ1Y3QgZGlmZl9ocHBfZm10LCBmbXQpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLWluamVjdC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLWluamVjdC5jCmluZGV4IDczYzFjNGMuLmI5YmM3ZTMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1pbmplY3QuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4taW5qZWN0LmMKQEAgLTQyOSw3ICs0MjksNyBAQAogCWlmIChhbC5tYXAgIT0gTlVMTCkgewogCQlpZiAoIWFsLm1hcC0+ZHNvLT5oaXQpIHsKIAkJCWFsLm1hcC0+ZHNvLT5oaXQgPSAxOwotCQkJaWYgKG1hcF9fbG9hZChhbC5tYXAsIE5VTEwpID49IDApIHsKKwkJCWlmIChtYXBfX2xvYWQoYWwubWFwKSA+PSAwKSB7CiAJCQkJZHNvX19pbmplY3RfYnVpbGRfaWQoYWwubWFwLT5kc28sIHRvb2wsIG1hY2hpbmUpOwogCQkJCS8qCiAJCQkJICogSWYgdGhpcyBmYWlscywgdG9vIGJhZCwgbGV0IHRoZSBvdGhlciBzaWRlCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4ta21lbS5jIGIvdG9vbHMvcGVyZi9idWlsdGluLWttZW0uYwppbmRleCBmZGRlMWJkLi5kNDI2ZGNiIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4ta21lbS5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1rbWVtLmMKQEAgLTMzMCw3ICszMzAsNyBAQAogCX0KIAogCWtlcm5lbF9tYXAgPSBtYWNoaW5lX19rZXJuZWxfbWFwKG1hY2hpbmUpOwotCWlmIChtYXBfX2xvYWQoa2VybmVsX21hcCwgTlVMTCkgPCAwKSB7CisJaWYgKG1hcF9fbG9hZChrZXJuZWxfbWFwKSA8IDApIHsKIAkJcHJfZXJyKCJjYW5ub3QgbG9hZCBrZXJuZWwgbWFwXG4iKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQpAQCAtOTc5LDcgKzk3OSw3IEBACiAJCWlmIChpc19jYWxsZXIpIHsKIAkJCWFkZHIgPSBkYXRhLT5jYWxsX3NpdGU7CiAJCQlpZiAoIXJhd19pcCkKLQkJCQlzeW0gPSBtYWNoaW5lX19maW5kX2tlcm5lbF9mdW5jdGlvbihtYWNoaW5lLCBhZGRyLCAmbWFwLCBOVUxMKTsKKwkJCQlzeW0gPSBtYWNoaW5lX19maW5kX2tlcm5lbF9mdW5jdGlvbihtYWNoaW5lLCBhZGRyLCAmbWFwKTsKIAkJfSBlbHNlCiAJCQlhZGRyID0gZGF0YS0+cHRyOwogCkBAIC0xMDQzLDggKzEwNDMsNyBAQAogCQljaGFyICpjYWxsZXIgPSBidWY7CiAKIAkJZGF0YSA9IHJiX2VudHJ5KG5leHQsIHN0cnVjdCBwYWdlX3N0YXQsIG5vZGUpOwotCQlzeW0gPSBtYWNoaW5lX19maW5kX2tlcm5lbF9mdW5jdGlvbihtYWNoaW5lLCBkYXRhLT5jYWxsc2l0ZSwKLQkJCQkJCSAgICAmbWFwLCBOVUxMKTsKKwkJc3ltID0gbWFjaGluZV9fZmluZF9rZXJuZWxfZnVuY3Rpb24obWFjaGluZSwgZGF0YS0+Y2FsbHNpdGUsICZtYXApOwogCQlpZiAoc3ltICYmIHN5bS0+bmFtZSkKIAkJCWNhbGxlciA9IHN5bS0+bmFtZTsKIAkJZWxzZQpAQCAtMTA4Niw4ICsxMDg1LDcgQEAKIAkJY2hhciAqY2FsbGVyID0gYnVmOwogCiAJCWRhdGEgPSByYl9lbnRyeShuZXh0LCBzdHJ1Y3QgcGFnZV9zdGF0LCBub2RlKTsKLQkJc3ltID0gbWFjaGluZV9fZmluZF9rZXJuZWxfZnVuY3Rpb24obWFjaGluZSwgZGF0YS0+Y2FsbHNpdGUsCi0JCQkJCQkgICAgJm1hcCwgTlVMTCk7CisJCXN5bSA9IG1hY2hpbmVfX2ZpbmRfa2VybmVsX2Z1bmN0aW9uKG1hY2hpbmUsIGRhdGEtPmNhbGxzaXRlLCAmbWFwKTsKIAkJaWYgKHN5bSAmJiBzeW0tPm5hbWUpCiAJCQljYWxsZXIgPSBzeW0tPm5hbWU7CiAJCWVsc2UKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1rdm0uYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1rdm0uYwppbmRleCA1ZTIxMjdlLi4wOGZhODhmIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4ta3ZtLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLWt2bS5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8c3lzL3RpbWVyZmQuaD4KICNlbmRpZgogCisjaW5jbHVkZSA8bGludXgvdGltZTY0Lmg+CiAjaW5jbHVkZSA8dGVybWlvcy5oPgogI2luY2x1ZGUgPHNlbWFwaG9yZS5oPgogI2luY2x1ZGUgPHB0aHJlYWQuaD4KQEAgLTM2Miw3ICszNjMsNyBAQAogCQlpZiAoIXNraXBfZXZlbnQoZGVjb2RlKSkgewogCQkJcHJfaW5mbygiJSIgUFJJdTY0ICIgVk0gJWQsIHZjcHUgJWQ6ICVzIGV2ZW50IHRvb2sgJSIgUFJJdTY0ICJ1c2VjXG4iLAogCQkJCSBzYW1wbGUtPnRpbWUsIHNhbXBsZS0+cGlkLCB2Y3B1X3JlY29yZC0+dmNwdV9pZCwKLQkJCQkgZGVjb2RlLCB0aW1lX2RpZmYvMTAwMCk7CisJCQkJIGRlY29kZSwgdGltZV9kaWZmIC8gTlNFQ19QRVJfVVNFQyk7CiAJCX0KIAl9CiAKQEAgLTYwOCwxNSArNjA5LDE1IEBACiAJCXByX2luZm8oIiUxMGxsdSAiLCAodW5zaWduZWQgbG9uZyBsb25nKWVjb3VudCk7CiAJCXByX2luZm8oIiU4LjJmJSUgIiwgKGRvdWJsZSllY291bnQgLyBrdm0tPnRvdGFsX2NvdW50ICogMTAwKTsKIAkJcHJfaW5mbygiJTguMmYlJSAiLCAoZG91YmxlKWV0aW1lIC8ga3ZtLT50b3RhbF90aW1lICogMTAwKTsKLQkJcHJfaW5mbygiJTkuMmZ1cyAiLCAoZG91YmxlKW1pbiAvIDFlMyk7Ci0JCXByX2luZm8oIiU5LjJmdXMgIiwgKGRvdWJsZSltYXggLyAxZTMpOwotCQlwcl9pbmZvKCIlOS4yZnVzICggKy0lNy4yZiUlICkiLCAoZG91YmxlKWV0aW1lIC8gZWNvdW50LzFlMywKKwkJcHJfaW5mbygiJTkuMmZ1cyAiLCAoZG91YmxlKW1pbiAvIE5TRUNfUEVSX1VTRUMpOworCQlwcl9pbmZvKCIlOS4yZnVzICIsIChkb3VibGUpbWF4IC8gTlNFQ19QRVJfVVNFQyk7CisJCXByX2luZm8oIiU5LjJmdXMgKCArLSU3LjJmJSUgKSIsIChkb3VibGUpZXRpbWUgLyBlY291bnQgLyBOU0VDX1BFUl9VU0VDLAogCQkJa3ZtX2V2ZW50X3JlbF9zdGRkZXYodmNwdSwgZXZlbnQpKTsKIAkJcHJfaW5mbygiXG4iKTsKIAl9CiAKIAlwcl9pbmZvKCJcblRvdGFsIFNhbXBsZXM6JSIgUFJJdTY0ICIsIFRvdGFsIGV2ZW50cyBoYW5kbGVkIHRpbWU6JS4yZnVzLlxuXG4iLAotCQlrdm0tPnRvdGFsX2NvdW50LCBrdm0tPnRvdGFsX3RpbWUgLyAxZTMpOworCQlrdm0tPnRvdGFsX2NvdW50LCBrdm0tPnRvdGFsX3RpbWUgLyAoZG91YmxlKU5TRUNfUEVSX1VTRUMpOwogCiAJaWYgKGt2bS0+bG9zdF9ldmVudHMpCiAJCXByX2luZm8oIlxuTG9zdCBldmVudHM6ICUiIFBSSXU2NCAiXG5cbiIsIGt2bS0+bG9zdF9ldmVudHMpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLW1lbS5jIGIvdG9vbHMvcGVyZi9idWlsdGluLW1lbS5jCmluZGV4IGQ2MDhhMmMuLmQxY2UyOWIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1tZW0uYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tbWVtLmMKQEAgLTg4LDYgKzg4LDkgQEAKIAlpZiAobWVtLT5vcGVyYXRpb24gJiBNRU1fT1BFUkFUSU9OX0xPQUQpCiAJCXBlcmZfbWVtX2V2ZW50c1tQRVJGX01FTV9FVkVOVFNfX0xPQURdLnJlY29yZCA9IHRydWU7CiAKKwlpZiAobWVtLT5vcGVyYXRpb24gJiBNRU1fT1BFUkFUSU9OX1NUT1JFKQorCQlwZXJmX21lbV9ldmVudHNbUEVSRl9NRU1fRVZFTlRTX19TVE9SRV0ucmVjb3JkID0gdHJ1ZTsKKwogCWlmIChwZXJmX21lbV9ldmVudHNbUEVSRl9NRU1fRVZFTlRTX19MT0FEXS5yZWNvcmQpCiAJCXJlY19hcmd2W2krK10gPSAiLVciOwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tcHJvYmUuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1wcm9iZS5jCmluZGV4IGVlNWI0MjEuLmY4Nzk5NmIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1wcm9iZS5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1wcm9iZS5jCkBAIC0zMjYsNiArMzI2LDExIEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0X2NsZWFudXA7CiAKKwlpZiAocGFyYW1zLmNvbW1hbmQgPT0gJ0QnKSB7CS8qIGl0IHNob3dzIGRlZmluaXRpb24gKi8KKwkJcmV0ID0gc2hvd19wcm9iZV90cmFjZV9ldmVudHMocGV2cywgbnBldnMpOworCQlnb3RvIG91dF9jbGVhbnVwOworCX0KKwogCXJldCA9IGFwcGx5X3BlcmZfcHJvYmVfZXZlbnRzKHBldnMsIG5wZXZzKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXRfY2xlYW51cDsKQEAgLTQ1NCw2ICs0NTksMTQgQEAKIAlyZXR1cm4gcmV0OwogfQogCisjaWZkZWYgSEFWRV9EV0FSRl9TVVBQT1JUCisjZGVmaW5lIFBST0JFREVGX1NUUglcCisJIltFVkVOVD1dRlVOQ1tAU1JDXVsrT0ZGfCVyZXR1cm58OlJMfDtQVF18U1JDOkFMfFNSQztQVCBbW05BTUU9XUFSRyAuLi5dIgorI2Vsc2UKKyNkZWZpbmUgUFJPQkVERUZfU1RSCSJbRVZFTlQ9XUZVTkNbK09GRnwlcmV0dXJuXSBbW05BTUU9XUFSRyAuLi5dIgorI2VuZGlmCisKKwogc3RhdGljIGludAogX19jbWRfcHJvYmUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXggX19tYXliZV91bnVzZWQpCiB7CkBAIC00NzksMTMgKzQ5Miw3IEBACiAJCQkgICAgIG9wdF9zZXRfZmlsdGVyX3dpdGhfY29tbWFuZCwgREVGQVVMVF9MSVNUX0ZJTFRFUiksCiAJT1BUX0NBTExCQUNLKCdkJywgImRlbCIsIE5VTEwsICJbR1JPVVA6XUVWRU5UIiwgImRlbGV0ZSBhIHByb2JlIGV2ZW50LiIsCiAJCSAgICAgb3B0X3NldF9maWx0ZXJfd2l0aF9jb21tYW5kKSwKLQlPUFRfQ0FMTEJBQ0soJ2EnLCAiYWRkIiwgTlVMTCwKLSNpZmRlZiBIQVZFX0RXQVJGX1NVUFBPUlQKLQkJIltFVkVOVD1dRlVOQ1tAU1JDXVsrT0ZGfCVyZXR1cm58OlJMfDtQVF18U1JDOkFMfFNSQztQVCIKLQkJIiBbW05BTUU9XUFSRyAuLi5dIiwKLSNlbHNlCi0JCSJbRVZFTlQ9XUZVTkNbK09GRnwlcmV0dXJuXSBbW05BTUU9XUFSRyAuLi5dIiwKLSNlbmRpZgorCU9QVF9DQUxMQkFDSygnYScsICJhZGQiLCBOVUxMLCBQUk9CRURFRl9TVFIsCiAJCSJwcm9iZSBwb2ludCBkZWZpbml0aW9uLCB3aGVyZVxuIgogCQkiXHRcdEdST1VQOlx0R3JvdXAgbmFtZSAob3B0aW9uYWwpXG4iCiAJCSJcdFx0RVZFTlQ6XHRFdmVudCBuYW1lXG4iCkBAIC01MDMsNiArNTEwLDkgQEAKIAkJIlx0XHRBUkc6XHRQcm9iZSBhcmd1bWVudCAoa3Byb2JlLXRyYWNlciBhcmd1bWVudCBmb3JtYXQuKVxuIiwKICNlbmRpZgogCQlvcHRfYWRkX3Byb2JlX2V2ZW50KSwKKwlPUFRfQ0FMTEJBQ0soJ0QnLCAiZGVmaW5pdGlvbiIsIE5VTEwsIFBST0JFREVGX1NUUiwKKwkJIlNob3cgdHJhY2UgZXZlbnQgZGVmaW5pdGlvbiBvZiBnaXZlbiB0cmFjZWV2ZW50IGZvciBrL3Vwcm9iZV9ldmVudHMuIiwKKwkJb3B0X2FkZF9wcm9iZV9ldmVudCksCiAJT1BUX0JPT0xFQU4oJ2YnLCAiZm9yY2UiLCAmcHJvYmVfY29uZi5mb3JjZV9hZGQsICJmb3JjaWJseSBhZGQgZXZlbnRzIgogCQkgICAgIiB3aXRoIGV4aXN0aW5nIG5hbWUiKSwKIAlPUFRfQ0FMTEJBQ0soJ0wnLCAibGluZSIsIE5VTEwsCkBAIC01NDgsNiArNTU4LDcgQEAKIAogCXNldF9vcHRpb25fZmxhZyhvcHRpb25zLCAnYScsICJhZGQiLCBQQVJTRV9PUFRfRVhDTFVTSVZFKTsKIAlzZXRfb3B0aW9uX2ZsYWcob3B0aW9ucywgJ2QnLCAiZGVsIiwgUEFSU0VfT1BUX0VYQ0xVU0lWRSk7CisJc2V0X29wdGlvbl9mbGFnKG9wdGlvbnMsICdEJywgImRlZmluaXRpb24iLCBQQVJTRV9PUFRfRVhDTFVTSVZFKTsKIAlzZXRfb3B0aW9uX2ZsYWcob3B0aW9ucywgJ2wnLCAibGlzdCIsIFBBUlNFX09QVF9FWENMVVNJVkUpOwogI2lmZGVmIEhBVkVfRFdBUkZfU1VQUE9SVAogCXNldF9vcHRpb25fZmxhZyhvcHRpb25zLCAnTCcsICJsaW5lIiwgUEFSU0VfT1BUX0VYQ0xVU0lWRSk7CkBAIC02MDAsNiArNjExLDE0IEBACiAJICovCiAJc3ltYm9sX2NvbmYudHJ5X3ZtbGludXhfcGF0aCA9IChzeW1ib2xfY29uZi52bWxpbnV4X25hbWUgPT0gTlVMTCk7CiAKKwkvKgorCSAqIEV4Y2VwdCBmb3IgLS1saXN0LCAtLWRlbCBhbmQgLS1hZGQsIG90aGVyIGNvbW1hbmQgZG9lc24ndCBkZXBlbmQKKwkgKiBub3IgY2hhbmdlIHJ1bm5pbmcga2VybmVsLiBTbyBpZiB1c2VyIGdpdmVzIG9mZmxpbmUgdm1saW51eCwKKwkgKiBpZ25vcmUgaXRzIGJ1aWxkaWQuCisJICovCisJaWYgKCFzdHJjaHIoImxkYSIsIHBhcmFtcy5jb21tYW5kKSAmJiBzeW1ib2xfY29uZi52bWxpbnV4X25hbWUpCisJCXN5bWJvbF9jb25mLmlnbm9yZV92bWxpbnV4X2J1aWxkaWQgPSB0cnVlOworCiAJc3dpdGNoIChwYXJhbXMuY29tbWFuZCkgewogCWNhc2UgJ2wnOgogCQlpZiAocGFyYW1zLnVwcm9iZXMpIHsKQEAgLTY0Myw3ICs2NjIsOSBAQAogCQkJcmV0dXJuIHJldDsKIAkJfQogCQlicmVhazsKKwljYXNlICdEJzoKIAljYXNlICdhJzoKKwogCQkvKiBFbnN1cmUgdGhlIGxhc3QgZ2l2ZW4gdGFyZ2V0IGlzIHVzZWQgKi8KIAkJaWYgKHBhcmFtcy50YXJnZXQgJiYgIXBhcmFtcy50YXJnZXRfdXNlZCkgewogCQkJcHJfZXJyKCIgIEVycm9yOiAteC8tbSBtdXN0IGZvbGxvdyB0aGUgcHJvYmUgZGVmaW5pdGlvbnMuXG4iKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZWNvcmQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZWNvcmQuYwppbmRleCA2MzU1OTAyLi42N2QyYTkwIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tcmVjb3JkLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSAidXRpbC9ldmxpc3QuaCIKICNpbmNsdWRlICJ1dGlsL2V2c2VsLmgiCiAjaW5jbHVkZSAidXRpbC9kZWJ1Zy5oIgorI2luY2x1ZGUgInV0aWwvZHJ2X2NvbmZpZ3MuaCIKICNpbmNsdWRlICJ1dGlsL3Nlc3Npb24uaCIKICNpbmNsdWRlICJ1dGlsL3Rvb2wuaCIKICNpbmNsdWRlICJ1dGlsL3N5bWJvbC5oIgpAQCAtNDIsNyArNDMsNyBAQAogI2luY2x1ZGUgPHNjaGVkLmg+CiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDxhc20vYnVnLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC90aW1lNjQuaD4KIAogc3RydWN0IHJlY29yZCB7CiAJc3RydWN0IHBlcmZfdG9vbAl0b29sOwpAQCAtOTYsNyArOTcsNyBAQAogCSpzdGFydCA9IGhlYWQ7CiAJd2hpbGUgKHRydWUpIHsKIAkJaWYgKGV2dF9oZWFkIC0gaGVhZCA+PSAodW5zaWduZWQgaW50KXNpemUpIHsKLQkJCXByX2RlYnVnKCJGaW5zaGVkIHJlYWRpbmcgYmFja3dhcmQgcmluZyBidWZmZXI6IHJld2luZFxuIik7CisJCQlwcl9kZWJ1ZygiRmluaXNoZWQgcmVhZGluZyBiYWNrd2FyZCByaW5nIGJ1ZmZlcjogcmV3aW5kXG4iKTsKIAkJCWlmIChldnRfaGVhZCAtIGhlYWQgPiAodW5zaWduZWQgaW50KXNpemUpCiAJCQkJZXZ0X2hlYWQgLT0gcGhlYWRlci0+c2l6ZTsKIAkJCSplbmQgPSBldnRfaGVhZDsKQEAgLTEwNiw3ICsxMDcsNyBAQAogCQlwaGVhZGVyID0gKHN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciAqKShidWYgKyAoZXZ0X2hlYWQgJiBtYXNrKSk7CiAKIAkJaWYgKHBoZWFkZXItPnNpemUgPT0gMCkgewotCQkJcHJfZGVidWcoIkZpbnNoZWQgcmVhZGluZyBiYWNrd2FyZCByaW5nIGJ1ZmZlcjogZ2V0IHN0YXJ0XG4iKTsKKwkJCXByX2RlYnVnKCJGaW5pc2hlZCByZWFkaW5nIGJhY2t3YXJkIHJpbmcgYnVmZmVyOiBnZXQgc3RhcnRcbiIpOwogCQkJKmVuZCA9IGV2dF9oZWFkOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTM4Myw2ICszODQsNyBAQAogCXN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0ID0gcmVjLT5ldmxpc3Q7CiAJc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiA9IHJlYy0+c2Vzc2lvbjsKIAlzdHJ1Y3QgcmVjb3JkX29wdHMgKm9wdHMgPSAmcmVjLT5vcHRzOworCXN0cnVjdCBwZXJmX2V2c2VsX2NvbmZpZ190ZXJtICplcnJfdGVybTsKIAlpbnQgcmMgPSAwOwogCiAJcGVyZl9ldmxpc3RfX2NvbmZpZyhldmxpc3QsIG9wdHMsICZjYWxsY2hhaW5fcGFyYW0pOwpAQCAtNDEyLDYgKzQxNCwxNCBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlpZiAocGVyZl9ldmxpc3RfX2FwcGx5X2Rydl9jb25maWdzKGV2bGlzdCwgJnBvcywgJmVycl90ZXJtKSkgeworCQllcnJvcigiZmFpbGVkIHRvIHNldCBjb25maWcgXCIlc1wiIG9uIGV2ZW50ICVzIHdpdGggJWQgKCVzKVxuIiwKKwkJICAgICAgZXJyX3Rlcm0tPnZhbC5kcnZfY2ZnLCBwZXJmX2V2c2VsX19uYW1lKHBvcyksIGVycm5vLAorCQkgICAgICBzdHJfZXJyb3JfcihlcnJubywgbXNnLCBzaXplb2YobXNnKSkpOworCQlyYyA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKIAlyYyA9IHJlY29yZF9fbW1hcChyZWMpOwogCWlmIChyYykKIAkJZ290byBvdXQ7CkBAIC05NTQsNyArOTY0LDcgQEAKIAl9CiAKIAlpZiAob3B0cy0+aW5pdGlhbF9kZWxheSkgewotCQl1c2xlZXAob3B0cy0+aW5pdGlhbF9kZWxheSAqIDEwMDApOworCQl1c2xlZXAob3B0cy0+aW5pdGlhbF9kZWxheSAqIFVTRUNfUEVSX01TRUMpOwogCQlwZXJmX2V2bGlzdF9fZW5hYmxlKHJlYy0+ZXZsaXN0KTsKIAl9CiAKQEAgLTE1NjMsMjkgKzE1NzMsMzkgQEAKIAlpZiAoIXJlYy0+aXRyKSB7CiAJCXJlYy0+aXRyID0gYXV4dHJhY2VfcmVjb3JkX19pbml0KHJlYy0+ZXZsaXN0LCAmZXJyKTsKIAkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7CisJCQlnb3RvIG91dDsKIAl9CiAKIAllcnIgPSBhdXh0cmFjZV9wYXJzZV9zbmFwc2hvdF9vcHRpb25zKHJlYy0+aXRyLCAmcmVjLT5vcHRzLAogCQkJCQkgICAgICByZWMtPm9wdHMuYXV4dHJhY2Vfc25hcHNob3Rfb3B0cyk7CiAJaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIEFsbG93IGFsaWFzZXMgdG8gZmFjaWxpdGF0ZSB0aGUgbG9va3VwIG9mIHN5bWJvbHMgZm9yIGFkZHJlc3MKKwkgKiBmaWx0ZXJzLiBSZWZlciB0byBhdXh0cmFjZV9wYXJzZV9maWx0ZXJzKCkuCisJICovCisJc3ltYm9sX2NvbmYuYWxsb3dfYWxpYXNlcyA9IHRydWU7CisKKwlzeW1ib2xfX2luaXQoTlVMTCk7CisKKwllcnIgPSBhdXh0cmFjZV9wYXJzZV9maWx0ZXJzKHJlYy0+ZXZsaXN0KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKIAogCWlmIChkcnlfcnVuKQotCQlyZXR1cm4gMDsKKwkJZ290byBvdXQ7CiAKIAllcnIgPSBicGZfX3NldHVwX3N0ZG91dChyZWMtPmV2bGlzdCk7CiAJaWYgKGVycikgewogCQlicGZfX3N0cmVycm9yX3NldHVwX3N0ZG91dChyZWMtPmV2bGlzdCwgZXJyLCBlcnJidWYsIHNpemVvZihlcnJidWYpKTsKIAkJcHJfZXJyKCJFUlJPUjogU2V0dXAgQlBGIHN0ZG91dCBmYWlsZWQ6ICVzXG4iLAogCQkJIGVycmJ1Zik7Ci0JCXJldHVybiBlcnI7CisJCWdvdG8gb3V0OwogCX0KIAogCWVyciA9IC1FTk9NRU07CiAKLQlzeW1ib2xfX2luaXQoTlVMTCk7Ci0KIAlpZiAoc3ltYm9sX2NvbmYua3B0cl9yZXN0cmljdCkKIAkJcHJfd2FybmluZygKICJXQVJOSU5HOiBLZXJuZWwgYWRkcmVzcyBtYXBzICgvcHJvYy97a2FsbHN5bXMsbW9kdWxlc30pIGFyZSByZXN0cmljdGVkLFxuIgpAQCAtMTYzMyw3ICsxNjUzLDcgQEAKIAlpZiAocmVjLT5ldmxpc3QtPm5yX2VudHJpZXMgPT0gMCAmJgogCSAgICBwZXJmX2V2bGlzdF9fYWRkX2RlZmF1bHQocmVjLT5ldmxpc3QpIDwgMCkgewogCQlwcl9lcnIoIk5vdCBlbm91Z2ggbWVtb3J5IGZvciBldmVudCBzZWxlY3RvciBsaXN0XG4iKTsKLQkJZ290byBvdXRfc3ltYm9sX2V4aXQ7CisJCWdvdG8gb3V0OwogCX0KIAogCWlmIChyZWMtPm9wdHMudGFyZ2V0LnRpZCAmJiAhcmVjLT5vcHRzLm5vX2luaGVyaXRfc2V0KQpAQCAtMTY1Myw3ICsxNjczLDcgQEAKIAkJdWlfX2Vycm9yKCIlcyIsIGVycmJ1Zik7CiAKIAkJZXJyID0gLXNhdmVkX2Vycm5vOwotCQlnb3RvIG91dF9zeW1ib2xfZXhpdDsKKwkJZ290byBvdXQ7CiAJfQogCiAJZXJyID0gLUVOT01FTTsKQEAgLTE2NjIsNyArMTY4Miw3IEBACiAKIAllcnIgPSBhdXh0cmFjZV9yZWNvcmRfX29wdGlvbnMocmVjLT5pdHIsIHJlYy0+ZXZsaXN0LCAmcmVjLT5vcHRzKTsKIAlpZiAoZXJyKQotCQlnb3RvIG91dF9zeW1ib2xfZXhpdDsKKwkJZ290byBvdXQ7CiAKIAkvKgogCSAqIFdlIHRha2UgYWxsIGJ1aWxkaWRzIHdoZW4gdGhlIGZpbGUgY29udGFpbnMKQEAgLTE2NzQsMTEgKzE2OTQsMTEgQEAKIAogCWlmIChyZWNvcmRfb3B0c19fY29uZmlnKCZyZWMtPm9wdHMpKSB7CiAJCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0X3N5bWJvbF9leGl0OworCQlnb3RvIG91dDsKIAl9CiAKIAllcnIgPSBfX2NtZF9yZWNvcmQoJnJlY29yZCwgYXJnYywgYXJndik7Ci1vdXRfc3ltYm9sX2V4aXQ6CitvdXQ6CiAJcGVyZl9ldmxpc3RfX2RlbGV0ZShyZWMtPmV2bGlzdCk7CiAJc3ltYm9sX19leGl0KCk7CiAJYXV4dHJhY2VfcmVjb3JkX19mcmVlKHJlYy0+aXRyKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZXBvcnQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZXBvcnQuYwppbmRleCA5NDllNWExLi42ZTg4NDYwIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tcmVwb3J0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXJlcG9ydC5jCkBAIC04OSw2ICs4OSwxMCBAQAogCQlyZXAtPnF1ZXVlX3NpemUgPSBwZXJmX2NvbmZpZ191NjQodmFyLCB2YWx1ZSk7CiAJCXJldHVybiAwOwogCX0KKwlpZiAoIXN0cmNtcCh2YXIsICJyZXBvcnQuc29ydF9vcmRlciIpKSB7CisJCWRlZmF1bHRfc29ydF9vcmRlciA9IHN0cmR1cCh2YWx1ZSk7CisJCXJldHVybiAwOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtOTMxLDcgKzkzNSw2IEBACiAKIAlpZiAoc3ltYm9sX2NvbmYucmVwb3J0X2hpZXJhcmNoeSkgewogCQkvKiBkaXNhYmxlIGluY29tcGF0aWJsZSBvcHRpb25zICovCi0JCXN5bWJvbF9jb25mLmV2ZW50X2dyb3VwID0gZmFsc2U7CiAJCXN5bWJvbF9jb25mLmN1bXVsYXRlX2NhbGxjaGFpbiA9IGZhbHNlOwogCiAJCWlmIChmaWVsZF9vcmRlcikgewpAQCAtOTgwLDkgKzk4Myw5IEBACiAJICogaW1wbGVtZW50YXRpb24uCiAJICovCiAJaWYgKHVpX19oYXNfYW5ub3RhdGlvbigpKSB7Ci0JCXN5bWJvbF9jb25mLnByaXZfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYW5ub3RhdGlvbik7Ci0JCW1hY2hpbmVzX19zZXRfc3ltYm9sX2ZpbHRlcigmc2Vzc2lvbi0+bWFjaGluZXMsCi0JCQkJCSAgICBzeW1ib2xfX2Fubm90YXRlX2luaXQpOworCQlyZXQgPSBzeW1ib2xfX2Fubm90YXRpb25faW5pdCgpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3I7CiAJCS8qCiAgCQkgKiBGb3Igc2VhcmNoaW5nIGJ5IG5hbWUgb24gdGhlICJCcm93c2UgbWFwIGRldGFpbHMiLgogIAkJICogcHJvdmlkaW5nIGl0IG9ubHkgaW4gdmVyYm9zZSBtb2RlIG5vdCB0byBibG9hdCB0b28KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY2hlZC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXNjaGVkLmMKaW5kZXggMGRmZThkZi4uZjU1MDNjYSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLXNjaGVkLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXNjaGVkLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPGFwaS9mcy9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWU2NC5oPgogCiAjZGVmaW5lIFBSX1NFVF9OQU1FCQkxNSAgICAgICAgICAgICAgIC8qIFNldCBwcm9jZXNzIG5hbWUgKi8KICNkZWZpbmUgTUFYX0NQVVMJCTQwOTYKQEAgLTE5OSw3ICsyMDAsNyBAQAogCiAJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0cyk7CiAKLQlyZXR1cm4gdHMudHZfc2VjICogMTAwMDAwMDAwMFVMTCArIHRzLnR2X25zZWM7CisJcmV0dXJuIHRzLnR2X3NlYyAqIE5TRUNfUEVSX1NFQyArIHRzLnR2X25zZWM7CiB9CiAKIHN0YXRpYyB2b2lkIGJ1cm5fbnNlY3Moc3RydWN0IHBlcmZfc2NoZWQgKnNjaGVkLCB1NjQgbnNlY3MpCkBAIC0yMjMsNyArMjI0LDcgQEAKIAogc3RhdGljIHZvaWQgY2FsaWJyYXRlX3J1bl9tZWFzdXJlbWVudF9vdmVyaGVhZChzdHJ1Y3QgcGVyZl9zY2hlZCAqc2NoZWQpCiB7Ci0JdTY0IFQwLCBUMSwgZGVsdGEsIG1pbl9kZWx0YSA9IDEwMDAwMDAwMDBVTEw7CisJdTY0IFQwLCBUMSwgZGVsdGEsIG1pbl9kZWx0YSA9IE5TRUNfUEVSX1NFQzsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CkBAIC0yNDAsNyArMjQxLDcgQEAKIAogc3RhdGljIHZvaWQgY2FsaWJyYXRlX3NsZWVwX21lYXN1cmVtZW50X292ZXJoZWFkKHN0cnVjdCBwZXJmX3NjaGVkICpzY2hlZCkKIHsKLQl1NjQgVDAsIFQxLCBkZWx0YSwgbWluX2RlbHRhID0gMTAwMDAwMDAwMFVMTDsKKwl1NjQgVDAsIFQxLCBkZWx0YSwgbWluX2RlbHRhID0gTlNFQ19QRVJfU0VDOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKQEAgLTQ1Miw4ICs0NTMsOCBAQAogCWVyciA9IGdldHJ1c2FnZShSVVNBR0VfU0VMRiwgJnJ1KTsKIAlCVUdfT04oZXJyKTsKIAotCXN1bSA9ICBydS5ydV91dGltZS50dl9zZWMqMWU5ICsgcnUucnVfdXRpbWUudHZfdXNlYyoxZTM7Ci0Jc3VtICs9IHJ1LnJ1X3N0aW1lLnR2X3NlYyoxZTkgKyBydS5ydV9zdGltZS50dl91c2VjKjFlMzsKKwlzdW0gPSAgcnUucnVfdXRpbWUudHZfc2VjICogTlNFQ19QRVJfU0VDICsgcnUucnVfdXRpbWUudHZfdXNlYyAqIE5TRUNfUEVSX1VTRUM7CisJc3VtICs9IHJ1LnJ1X3N0aW1lLnR2X3NlYyAqIE5TRUNfUEVSX1NFQyArIHJ1LnJ1X3N0aW1lLnR2X3VzZWMgKiBOU0VDX1BFUl9VU0VDOwogCiAJcmV0dXJuIHN1bTsKIH0KQEAgLTY2NywxMiArNjY4LDEyIEBACiAJCXNjaGVkLT5ydW5fYXZnID0gZGVsdGE7CiAJc2NoZWQtPnJ1bl9hdmcgPSAoc2NoZWQtPnJ1bl9hdmcgKiAoc2NoZWQtPnJlcGxheV9yZXBlYXQgLSAxKSArIGRlbHRhKSAvIHNjaGVkLT5yZXBsYXlfcmVwZWF0OwogCi0JcHJpbnRmKCIjJS0zbGQ6ICUwLjNmLCAiLCBzY2hlZC0+bnJfcnVucywgKGRvdWJsZSlkZWx0YSAvIDEwMDAwMDAuMCk7CisJcHJpbnRmKCIjJS0zbGQ6ICUwLjNmLCAiLCBzY2hlZC0+bnJfcnVucywgKGRvdWJsZSlkZWx0YSAvIE5TRUNfUEVSX01TRUMpOwogCi0JcHJpbnRmKCJyYXZnOiAlMC4yZiwgIiwgKGRvdWJsZSlzY2hlZC0+cnVuX2F2ZyAvIDFlNik7CisJcHJpbnRmKCJyYXZnOiAlMC4yZiwgIiwgKGRvdWJsZSlzY2hlZC0+cnVuX2F2ZyAvIE5TRUNfUEVSX01TRUMpOwogCiAJcHJpbnRmKCJjcHU6ICUwLjJmIC8gJTAuMmYiLAotCQkoZG91YmxlKXNjaGVkLT5jcHVfdXNhZ2UgLyAxZTYsIChkb3VibGUpc2NoZWQtPnJ1bmF2Z19jcHVfdXNhZ2UgLyAxZTYpOworCQkoZG91YmxlKXNjaGVkLT5jcHVfdXNhZ2UgLyBOU0VDX1BFUl9NU0VDLCAoZG91YmxlKXNjaGVkLT5ydW5hdmdfY3B1X3VzYWdlIC8gTlNFQ19QRVJfTVNFQyk7CiAKICNpZiAwCiAJLyoKQEAgLTY4MCw4ICs2ODEsOCBAQAogCSAqIGFjY3VyYXRlIHRoYW4gdGhlIHNjaGVkLT5zdW1fZXhlY19ydW50aW1lIGJhc2VkIHN0YXRpc3RpY3M6CiAJICovCiAJcHJpbnRmKCIgWyUwLjJmIC8gJTAuMmZdIiwKLQkJKGRvdWJsZSlzY2hlZC0+cGFyZW50X2NwdV91c2FnZS8xZTYsCi0JCShkb3VibGUpc2NoZWQtPnJ1bmF2Z19wYXJlbnRfY3B1X3VzYWdlLzFlNik7CisJCShkb3VibGUpc2NoZWQtPnBhcmVudF9jcHVfdXNhZ2UgLyBOU0VDX1BFUl9NU0VDLAorCQkoZG91YmxlKXNjaGVkLT5ydW5hdmdfcGFyZW50X2NwdV91c2FnZSAvIE5TRUNfUEVSX01TRUMpOwogI2VuZGlmCiAKIAlwcmludGYoIlxuIik7CkBAIC02OTYsMTMgKzY5NywxMyBAQAogCXU2NCBUMCwgVDE7CiAKIAlUMCA9IGdldF9uc2VjcygpOwotCWJ1cm5fbnNlY3Moc2NoZWQsIDFlNik7CisJYnVybl9uc2VjcyhzY2hlZCwgTlNFQ19QRVJfTVNFQyk7CiAJVDEgPSBnZXRfbnNlY3MoKTsKIAogCXByaW50ZigidGhlIHJ1biB0ZXN0IHRvb2sgJSIgUFJJdTY0ICIgbnNlY3NcbiIsIFQxIC0gVDApOwogCiAJVDAgPSBnZXRfbnNlY3MoKTsKLQlzbGVlcF9uc2VjcygxZTYpOworCXNsZWVwX25zZWNzKE5TRUNfUEVSX01TRUMpOwogCVQxID0gZ2V0X25zZWNzKCk7CiAKIAlwcmludGYoInRoZSBzbGVlcCB0ZXN0IHRvb2sgJSIgUFJJdTY0ICIgbnNlY3NcbiIsIFQxIC0gVDApOwpAQCAtMTIxMywxMCArMTIxNCwxMCBAQAogCWF2ZyA9IHdvcmtfbGlzdC0+dG90YWxfbGF0IC8gd29ya19saXN0LT5uYl9hdG9tczsKIAogCXByaW50ZigifCUxMS4zZiBtcyB8JTkiIFBSSXU2NCAiIHwgYXZnOiU5LjNmIG1zIHwgbWF4OiU5LjNmIG1zIHwgbWF4IGF0OiAlMTMuNmYgc1xuIiwKLQkgICAgICAoZG91YmxlKXdvcmtfbGlzdC0+dG90YWxfcnVudGltZSAvIDFlNiwKLQkJIHdvcmtfbGlzdC0+bmJfYXRvbXMsIChkb3VibGUpYXZnIC8gMWU2LAotCQkgKGRvdWJsZSl3b3JrX2xpc3QtPm1heF9sYXQgLyAxZTYsCi0JCSAoZG91YmxlKXdvcmtfbGlzdC0+bWF4X2xhdF9hdCAvIDFlOSk7CisJICAgICAgKGRvdWJsZSl3b3JrX2xpc3QtPnRvdGFsX3J1bnRpbWUgLyBOU0VDX1BFUl9NU0VDLAorCQkgd29ya19saXN0LT5uYl9hdG9tcywgKGRvdWJsZSlhdmcgLyBOU0VDX1BFUl9NU0VDLAorCQkgKGRvdWJsZSl3b3JrX2xpc3QtPm1heF9sYXQgLyBOU0VDX1BFUl9NU0VDLAorCQkgKGRvdWJsZSl3b3JrX2xpc3QtPm1heF9sYXRfYXQgLyBOU0VDX1BFUl9TRUMpOwogfQogCiBzdGF0aWMgaW50IHBpZF9jbXAoc3RydWN0IHdvcmtfYXRvbXMgKmwsIHN0cnVjdCB3b3JrX2F0b21zICpyKQpAQCAtMTQ5MSw3ICsxNDkyLDcgQEAKIAlpZiAoc2NoZWQtPm1hcC5jcHVzICYmICFjcHVfbWFwX19oYXMoc2NoZWQtPm1hcC5jcHVzLCB0aGlzX2NwdSkpCiAJCWdvdG8gb3V0OwogCi0JY29sb3JfZnByaW50ZihzdGRvdXQsIGNvbG9yLCAiICAlMTIuNmYgc2VjcyAiLCAoZG91YmxlKXRpbWVzdGFtcC8xZTkpOworCWNvbG9yX2ZwcmludGYoc3Rkb3V0LCBjb2xvciwgIiAgJTEyLjZmIHNlY3MgIiwgKGRvdWJsZSl0aW1lc3RhbXAgLyBOU0VDX1BFUl9TRUMpOwogCWlmIChuZXdfc2hvcnRuYW1lKSB7CiAJCWNvbnN0IGNoYXIgKnBpZF9jb2xvciA9IGNvbG9yOwogCkBAIC0xNzUzLDcgKzE3NTQsNyBAQAogCiAJcHJpbnRmKCIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogCXByaW50ZigiICBUT1RBTDogICAgICAgICAgICAgICAgfCUxMS4zZiBtcyB8JTkiIFBSSXU2NCAiIHxcbiIsCi0JCShkb3VibGUpc2NoZWQtPmFsbF9ydW50aW1lIC8gMWU2LCBzY2hlZC0+YWxsX2NvdW50KTsKKwkJKGRvdWJsZSlzY2hlZC0+YWxsX3J1bnRpbWUgLyBOU0VDX1BFUl9NU0VDLCBzY2hlZC0+YWxsX2NvdW50KTsKIAogCXByaW50ZigiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY3JpcHQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY3JpcHQuYwppbmRleCA5YzY0MGE4Li43MjI4ZDE0IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tc2NyaXB0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXNjcmlwdC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSAidXRpbC90aHJlYWQtc3RhY2suaCIKICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lNjQuaD4KICNpbmNsdWRlICJhc20vYnVnLmgiCiAjaW5jbHVkZSAidXRpbC9tZW0tZXZlbnRzLmgiCiAKQEAgLTM3MSwxNCArMzcyLDE2IEBACiAKIAlpZiAoIW5vX2NhbGxjaGFpbikgewogCQlib29sIHVzZV9jYWxsY2hhaW4gPSBmYWxzZTsKKwkJYm9vbCBub3RfcGlwZSA9IGZhbHNlOwogCiAJCWV2bGlzdF9fZm9yX2VhY2hfZW50cnkoc2Vzc2lvbi0+ZXZsaXN0LCBldnNlbCkgeworCQkJbm90X3BpcGUgPSB0cnVlOwogCQkJaWYgKGV2c2VsLT5hdHRyLnNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfQ0FMTENIQUlOKSB7CiAJCQkJdXNlX2NhbGxjaGFpbiA9IHRydWU7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KLQkJaWYgKCF1c2VfY2FsbGNoYWluKQorCQlpZiAobm90X3BpcGUgJiYgIXVzZV9jYWxsY2hhaW4pCiAJCQlzeW1ib2xfY29uZi51c2VfY2FsbGNoYWluID0gZmFsc2U7CiAJfQogCkBAIC00NjIsOSArNDY1LDkgQEAKIAogCWlmIChQUklOVF9GSUVMRChUSU1FKSkgewogCQluc2VjcyA9IHNhbXBsZS0+dGltZTsKLQkJc2VjcyA9IG5zZWNzIC8gTlNFQ1NfUEVSX1NFQzsKLQkJbnNlY3MgLT0gc2VjcyAqIE5TRUNTX1BFUl9TRUM7Ci0JCXVzZWNzID0gbnNlY3MgLyBOU0VDU19QRVJfVVNFQzsKKwkJc2VjcyA9IG5zZWNzIC8gTlNFQ19QRVJfU0VDOworCQluc2VjcyAtPSBzZWNzICogTlNFQ19QRVJfU0VDOworCQl1c2VjcyA9IG5zZWNzIC8gTlNFQ19QRVJfVVNFQzsKIAkJaWYgKG5hbm9zZWNzKQogCQkJcHJpbnRmKCIlNWx1LiUwOWxsdTogIiwgc2VjcywgbnNlY3MpOwogCQllbHNlCkBAIC01MTksMTEgKzUyMiwxMSBAQAogCiAJCXRocmVhZF9fZmluZF9hZGRyX21hcCh0aHJlYWQsIHNhbXBsZS0+Y3B1bW9kZSwgTUFQX19GVU5DVElPTiwgZnJvbSwgJmFsZik7CiAJCWlmIChhbGYubWFwKQotCQkJYWxmLnN5bSA9IG1hcF9fZmluZF9zeW1ib2woYWxmLm1hcCwgYWxmLmFkZHIsIE5VTEwpOworCQkJYWxmLnN5bSA9IG1hcF9fZmluZF9zeW1ib2woYWxmLm1hcCwgYWxmLmFkZHIpOwogCiAJCXRocmVhZF9fZmluZF9hZGRyX21hcCh0aHJlYWQsIHNhbXBsZS0+Y3B1bW9kZSwgTUFQX19GVU5DVElPTiwgdG8sICZhbHQpOwogCQlpZiAoYWx0Lm1hcCkKLQkJCWFsdC5zeW0gPSBtYXBfX2ZpbmRfc3ltYm9sKGFsdC5tYXAsIGFsdC5hZGRyLCBOVUxMKTsKKwkJCWFsdC5zeW0gPSBtYXBfX2ZpbmRfc3ltYm9sKGFsdC5tYXAsIGFsdC5hZGRyKTsKIAogCQlzeW1ib2xfX2ZwcmludGZfc3ltbmFtZV9vZmZzKGFsZi5zeW0sICZhbGYsIHN0ZG91dCk7CiAJCXB1dGNoYXIoJy8nKTsKQEAgLTE2OTAsOCArMTY5MywxMyBAQAogCXNucHJpbnRmKHNjcmlwdHNfcGF0aCwgTUFYUEFUSExFTiwgIiVzL3NjcmlwdHMiLCBnZXRfYXJndl9leGVjX3BhdGgoKSk7CiAKIAlzY3JpcHRzX2RpciA9IG9wZW5kaXIoc2NyaXB0c19wYXRoKTsKLQlpZiAoIXNjcmlwdHNfZGlyKQotCQlyZXR1cm4gLTE7CisJaWYgKCFzY3JpcHRzX2RpcikgeworCQlmcHJpbnRmKHN0ZG91dCwKKwkJCSJvcGVuKCVzKSBmYWlsZWQuXG4iCisJCQkiQ2hlY2sgXCJQRVJGX0VYRUNfUEFUSFwiIGVudiB0byBzZXQgc2NyaXB0cyBkaXIuXG4iLAorCQkJc2NyaXB0c19wYXRoKTsKKwkJZXhpdCgtMSk7CisJfQogCiAJZm9yX2VhY2hfbGFuZyhzY3JpcHRzX3BhdGgsIHNjcmlwdHNfZGlyLCBsYW5nX2RpcmVudCkgewogCQlzbnByaW50ZihsYW5nX3BhdGgsIE1BWFBBVEhMRU4sICIlcy8lcy9iaW4iLCBzY3JpcHRzX3BhdGgsCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tc3RhdC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXN0YXQuYwppbmRleCAzYzc0NTJiLi42ODhkZWE3IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tc3RhdC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zdGF0LmMKQEAgLTUyLDYgKzUyLDcgQEAKICNpbmNsdWRlICJ1dGlsL2V2bGlzdC5oIgogI2luY2x1ZGUgInV0aWwvZXZzZWwuaCIKICNpbmNsdWRlICJ1dGlsL2RlYnVnLmgiCisjaW5jbHVkZSAidXRpbC9kcnZfY29uZmlncy5oIgogI2luY2x1ZGUgInV0aWwvY29sb3IuaCIKICNpbmNsdWRlICJ1dGlsL3N0YXQuaCIKICNpbmNsdWRlICJ1dGlsL2hlYWRlci5oIgpAQCAtNjUsNiArNjYsNyBAQAogI2luY2x1ZGUgInV0aWwvZ3JvdXAuaCIKICNpbmNsdWRlICJhc20vYnVnLmgiCiAKKyNpbmNsdWRlIDxsaW51eC90aW1lNjQuaD4KICNpbmNsdWRlIDxhcGkvZnMvZnMuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KQEAgLTE3Miw3ICsxNzQsNyBAQAogewogCXItPnR2X3NlYyA9IGEtPnR2X3NlYyAtIGItPnR2X3NlYzsKIAlpZiAoYS0+dHZfbnNlYyA8IGItPnR2X25zZWMpIHsKLQkJci0+dHZfbnNlYyA9IGEtPnR2X25zZWMgKyAxMDAwMDAwMDAwTCAtIGItPnR2X25zZWM7CisJCXItPnR2X25zZWMgPSBhLT50dl9uc2VjICsgTlNFQ19QRVJfU0VDIC0gYi0+dHZfbnNlYzsKIAkJci0+dHZfc2VjLS07CiAJfSBlbHNlIHsKIAkJci0+dHZfbnNlYyA9IGEtPnR2X25zZWMgLSBiLT50dl9uc2VjIDsKQEAgLTM1NCw3ICszNTYsNyBAQAogCWRpZmZfdGltZXNwZWMoJnJzLCAmdHMsICZyZWZfdGltZSk7CiAKIAlpZiAoU1RBVF9SRUNPUkQpIHsKLQkJaWYgKFdSSVRFX1NUQVRfUk9VTkRfRVZFTlQocnMudHZfc2VjICogTlNFQ1NfUEVSX1NFQyArIHJzLnR2X25zZWMsIElOVEVSVkFMKSkKKwkJaWYgKFdSSVRFX1NUQVRfUk9VTkRfRVZFTlQocnMudHZfc2VjICogTlNFQ19QRVJfU0VDICsgcnMudHZfbnNlYywgSU5URVJWQUwpKQogCQkJcHJfZXJyKCJmYWlsZWQgdG8gd3JpdGUgc3RhdCByb3VuZCBldmVudFxuIik7CiAJfQogCkBAIC0zNjQsNyArMzY2LDcgQEAKIHN0YXRpYyB2b2lkIGVuYWJsZV9jb3VudGVycyh2b2lkKQogewogCWlmIChpbml0aWFsX2RlbGF5KQotCQl1c2xlZXAoaW5pdGlhbF9kZWxheSAqIDEwMDApOworCQl1c2xlZXAoaW5pdGlhbF9kZWxheSAqIFVTRUNfUEVSX01TRUMpOwogCiAJLyoKIAkgKiBXZSBuZWVkIHRvIGVuYWJsZSBjb3VudGVycyBvbmx5IGlmOgpAQCAtNTM5LDEwICs1NDEsMTEgQEAKIAlpbnQgc3RhdHVzID0gMDsKIAljb25zdCBib29sIGZvcmtzID0gKGFyZ2MgPiAwKTsKIAlib29sIGlzX3BpcGUgPSBTVEFUX1JFQ09SRCA/IHBlcmZfc3RhdC5maWxlLmlzX3BpcGUgOiBmYWxzZTsKKwlzdHJ1Y3QgcGVyZl9ldnNlbF9jb25maWdfdGVybSAqZXJyX3Rlcm07CiAKIAlpZiAoaW50ZXJ2YWwpIHsKLQkJdHMudHZfc2VjICA9IGludGVydmFsIC8gMTAwMDsKLQkJdHMudHZfbnNlYyA9IChpbnRlcnZhbCAlIDEwMDApICogMTAwMDAwMDsKKwkJdHMudHZfc2VjICA9IGludGVydmFsIC8gVVNFQ19QRVJfTVNFQzsKKwkJdHMudHZfbnNlYyA9IChpbnRlcnZhbCAlIFVTRUNfUEVSX01TRUMpICogTlNFQ19QRVJfTVNFQzsKIAl9IGVsc2UgewogCQl0cy50dl9zZWMgID0gMTsKIAkJdHMudHZfbnNlYyA9IDA7CkBAIC02MTAsNiArNjEzLDEzIEBACiAJCXJldHVybiAtMTsKIAl9CiAKKwlpZiAocGVyZl9ldmxpc3RfX2FwcGx5X2Rydl9jb25maWdzKGV2c2VsX2xpc3QsICZjb3VudGVyLCAmZXJyX3Rlcm0pKSB7CisJCWVycm9yKCJmYWlsZWQgdG8gc2V0IGNvbmZpZyBcIiVzXCIgb24gZXZlbnQgJXMgd2l0aCAlZCAoJXMpXG4iLAorCQkgICAgICBlcnJfdGVybS0+dmFsLmRydl9jZmcsIHBlcmZfZXZzZWxfX25hbWUoY291bnRlciksIGVycm5vLAorCQkgICAgICBzdHJfZXJyb3JfcihlcnJubywgbXNnLCBzaXplb2YobXNnKSkpOworCQlyZXR1cm4gLTE7CisJfQorCiAJaWYgKFNUQVRfUkVDT1JEKSB7CiAJCWludCBlcnIsIGZkID0gcGVyZl9kYXRhX2ZpbGVfX2ZkKCZwZXJmX3N0YXQuZmlsZSk7CiAKQEAgLTk3MSw3ICs5ODEsNyBAQAogc3RhdGljIHZvaWQgbnNlY19wcmludG91dChpbnQgaWQsIGludCBuciwgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLCBkb3VibGUgYXZnKQogewogCUZJTEUgKm91dHB1dCA9IHN0YXRfY29uZmlnLm91dHB1dDsKLQlkb3VibGUgbXNlY3MgPSBhdmcgLyAxZTY7CisJZG91YmxlIG1zZWNzID0gYXZnIC8gTlNFQ19QRVJfTVNFQzsKIAljb25zdCBjaGFyICpmbXRfdiwgKmZtdF9uOwogCWNoYXIgbmFtZVsyNV07CiAKQEAgLTE0NjAsNyArMTQ3MCw3IEBACiAJaWYgKCFudWxsX3J1bikKIAkJZnByaW50ZihvdXRwdXQsICJcbiIpOwogCWZwcmludGYob3V0cHV0LCAiICUxNy45ZiBzZWNvbmRzIHRpbWUgZWxhcHNlZCIsCi0JCQlhdmdfc3RhdHMoJndhbGx0aW1lX25zZWNzX3N0YXRzKS8xZTkpOworCQkJYXZnX3N0YXRzKCZ3YWxsdGltZV9uc2Vjc19zdGF0cykgLyBOU0VDX1BFUl9TRUMpOwogCWlmIChydW5fY291bnQgPiAxKSB7CiAJCWZwcmludGYob3V0cHV0LCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwogCQlwcmludF9ub2lzZV9wY3Qoc3RkZGV2X3N0YXRzKCZ3YWxsdGltZV9uc2Vjc19zdGF0cyksCkBAIC0yMTc1LDggKzIxODUsOCBAQAogCQl1cGRhdGVfc3RhdHMoJndhbGx0aW1lX25zZWNzX3N0YXRzLCBzdGF0X3JvdW5kLT50aW1lKTsKIAogCWlmIChzdGF0X2NvbmZpZy5pbnRlcnZhbCAmJiBzdGF0X3JvdW5kLT50aW1lKSB7Ci0JCXRzaC50dl9zZWMgID0gc3RhdF9yb3VuZC0+dGltZSAvIE5TRUNTX1BFUl9TRUM7Ci0JCXRzaC50dl9uc2VjID0gc3RhdF9yb3VuZC0+dGltZSAlIE5TRUNTX1BFUl9TRUM7CisJCXRzaC50dl9zZWMgID0gc3RhdF9yb3VuZC0+dGltZSAvIE5TRUNfUEVSX1NFQzsKKwkJdHNoLnR2X25zZWMgPSBzdGF0X3JvdW5kLT50aW1lICUgTlNFQ19QRVJfU0VDOwogCQl0cyA9ICZ0c2g7CiAJfQogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tdGltZWNoYXJ0LmMgYi90b29scy9wZXJmL2J1aWx0aW4tdGltZWNoYXJ0LmMKaW5kZXggNzMzYTU1NC4uZTdlYWEyOSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLXRpbWVjaGFydC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi10aW1lY2hhcnQuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgInV0aWwvZXZsaXN0LmgiCiAjaW5jbHVkZSAidXRpbC9ldnNlbC5oIgogI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWU2NC5oPgogI2luY2x1ZGUgInV0aWwvc3ltYm9sLmgiCiAjaW5jbHVkZSAidXRpbC9jYWxsY2hhaW4uaCIKICNpbmNsdWRlICJ1dGlsL3N0cmxpc3QuaCIKQEAgLTEyODgsOSArMTI4OSw5IEBACiAJCQlpZiAoYy0+Y29tbSkgewogCQkJCWNoYXIgY29tbVsyNTZdOwogCQkJCWlmIChjLT50b3RhbF90aW1lID4gNTAwMDAwMDAwMCkgLyogNSBzZWNvbmRzICovCi0JCQkJCXNwcmludGYoY29tbSwgIiVzOiVpICglMi4yZnMpIiwgYy0+Y29tbSwgcC0+cGlkLCBjLT50b3RhbF90aW1lIC8gMTAwMDAwMDAwMC4wKTsKKwkJCQkJc3ByaW50Zihjb21tLCAiJXM6JWkgKCUyLjJmcykiLCBjLT5jb21tLCBwLT5waWQsIGMtPnRvdGFsX3RpbWUgLyAoZG91YmxlKU5TRUNfUEVSX1NFQyk7CiAJCQkJZWxzZQotCQkJCQlzcHJpbnRmKGNvbW0sICIlczolaSAoJTMuMWZtcykiLCBjLT5jb21tLCBwLT5waWQsIGMtPnRvdGFsX3RpbWUgLyAxMDAwMDAwLjApOworCQkJCQlzcHJpbnRmKGNvbW0sICIlczolaSAoJTMuMWZtcykiLCBjLT5jb21tLCBwLT5waWQsIGMtPnRvdGFsX3RpbWUgLyAoZG91YmxlKU5TRUNfUEVSX01TRUMpOwogCiAJCQkJc3ZnX3RleHQoWSwgYy0+c3RhcnRfdGltZSwgY29tbSk7CiAJCQl9CkBAIC0xNjM3LDcgKzE2MzgsNyBAQAogCXdyaXRlX3N2Z19maWxlKHRjaGFydCwgb3V0cHV0X25hbWUpOwogCiAJcHJfaW5mbygiV3JpdHRlbiAlMi4xZiBzZWNvbmRzIG9mIHRyYWNlIHRvICVzLlxuIiwKLQkJKHRjaGFydC0+bGFzdF90aW1lIC0gdGNoYXJ0LT5maXJzdF90aW1lKSAvIDEwMDAwMDAwMDAuMCwgb3V0cHV0X25hbWUpOworCQkodGNoYXJ0LT5sYXN0X3RpbWUgLSB0Y2hhcnQtPmZpcnN0X3RpbWUpIC8gKGRvdWJsZSlOU0VDX1BFUl9TRUMsIG91dHB1dF9uYW1lKTsKIG91dF9kZWxldGU6CiAJcGVyZl9zZXNzaW9uX19kZWxldGUoc2Vzc2lvbik7CiAJcmV0dXJuIHJldDsKQEAgLTE5MDEsMTAgKzE5MDIsMTAgQEAKIAlpZiAoc3NjYW5mKGFyZywgIiUiIFBSSXU2NCAiJWNzIiwgdmFsdWUsICZ1bml0KSA+IDApIHsKIAkJc3dpdGNoICh1bml0KSB7CiAJCWNhc2UgJ20nOgotCQkJKnZhbHVlICo9IDEwMDAwMDA7CisJCQkqdmFsdWUgKj0gTlNFQ19QRVJfTVNFQzsKIAkJCWJyZWFrOwogCQljYXNlICd1JzoKLQkJCSp2YWx1ZSAqPSAxMDAwOworCQkJKnZhbHVlICo9IE5TRUNfUEVSX1VTRUM7CiAJCQlicmVhazsKIAkJY2FzZSAnbic6CiAJCQlicmVhazsKQEAgLTE5MjgsNyArMTkyOSw3IEBACiAJCQkub3JkZXJlZF9ldmVudHMJID0gdHJ1ZSwKIAkJfSwKIAkJLnByb2NfbnVtID0gMTUsCi0JCS5taW5fdGltZSA9IDEwMDAwMDAsCisJCS5taW5fdGltZSA9IE5TRUNfUEVSX01TRUMsCiAJCS5tZXJnZV9kaXN0ID0gMTAwMCwKIAl9OwogCWNvbnN0IGNoYXIgKm91dHB1dF9uYW1lID0gIm91dHB1dC5zdmciOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXRvcC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXRvcC5jCmluZGV4IDQxOGVkOTQuLmZlM2FmOTUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10b3AuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tdG9wLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJ1dGlsL2Fubm90YXRlLmgiCiAjaW5jbHVkZSAidXRpbC9jb25maWcuaCIKICNpbmNsdWRlICJ1dGlsL2NvbG9yLmgiCisjaW5jbHVkZSAidXRpbC9kcnZfY29uZmlncy5oIgogI2luY2x1ZGUgInV0aWwvZXZsaXN0LmgiCiAjaW5jbHVkZSAidXRpbC9ldnNlbC5oIgogI2luY2x1ZGUgInV0aWwvbWFjaGluZS5oIgpAQCAtNjgsNiArNjksNyBAQAogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lNjQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiBzdGF0aWMgdm9sYXRpbGUgaW50IGRvbmU7CkBAIC02MjQsNyArNjI2LDcgQEAKIAlkaXNwbGF5X3NldHVwX3NpZygpOwogCXB0aHJlYWRfX3VuYmxvY2tfc2lnd2luY2goKTsKIHJlcGVhdDoKLQlkZWxheV9tc2VjcyA9IHRvcC0+ZGVsYXlfc2VjcyAqIDEwMDA7CisJZGVsYXlfbXNlY3MgPSB0b3AtPmRlbGF5X3NlY3MgKiBNU0VDX1BFUl9TRUM7CiAJc2V0X3Rlcm1fcXVpZXRfaW5wdXQoJnNhdmUpOwogCS8qIHRyYXNoIHJldHVybiovCiAJZ2V0YyhzdGRpbik7CkBAIC02NTYsMzQgKzY1OCw2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgc3ltYm9sX2ZpbHRlcihzdHJ1Y3QgbWFwICptYXAsIHN0cnVjdCBzeW1ib2wgKnN5bSkKLXsKLQljb25zdCBjaGFyICpuYW1lID0gc3ltLT5uYW1lOwotCi0JaWYgKCFfX21hcF9faXNfa2VybmVsKG1hcCkpCi0JCXJldHVybiAwOwotCS8qCi0JICogcHBjNjQgdXNlcyBmdW5jdGlvbiBkZXNjcmlwdG9ycyBhbmQgYXBwZW5kcyBhICcuJyB0byB0aGUKLQkgKiBzdGFydCBvZiBldmVyeSBpbnN0cnVjdGlvbiBhZGRyZXNzLiBSZW1vdmUgaXQuCi0JICovCi0JaWYgKG5hbWVbMF0gPT0gJy4nKQotCQluYW1lKys7Ci0KLQlpZiAoIXN0cmNtcChuYW1lLCAiX3RleHQiKSB8fAotCSAgICAhc3RyY21wKG5hbWUsICJfZXRleHQiKSB8fAotCSAgICAhc3RyY21wKG5hbWUsICJfc2luaXR0ZXh0IikgfHwKLQkgICAgIXN0cm5jbXAoImluaXRfbW9kdWxlIiwgbmFtZSwgMTEpIHx8Ci0JICAgICFzdHJuY21wKCJjbGVhbnVwX21vZHVsZSIsIG5hbWUsIDE0KSB8fAotCSAgICBzdHJzdHIobmFtZSwgIl90ZXh0X3N0YXJ0IikgfHwKLQkgICAgc3Ryc3RyKG5hbWUsICJfdGV4dF9lbmQiKSkKLQkJcmV0dXJuIDE7Ci0KLQlpZiAoc3ltYm9sX19pc19pZGxlKHN5bSkpCi0JCXN5bS0+aWdub3JlID0gdHJ1ZTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGhpc3RfaXRlcl9fdG9wX2NhbGxiYWNrKHN0cnVjdCBoaXN0X2VudHJ5X2l0ZXIgKml0ZXIsCiAJCQkJICAgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsLCBib29sIHNpbmdsZSwKIAkJCQkgICB2b2lkICphcmcpCkBAIC03ODIsNyArNzU2LDcgQEAKIAkJfQogCX0KIAotCWlmIChhbC5zeW0gPT0gTlVMTCB8fCAhYWwuc3ltLT5pZ25vcmUpIHsKKwlpZiAoYWwuc3ltID09IE5VTEwgfHwgIWFsLnN5bS0+aWRsZSkgewogCQlzdHJ1Y3QgaGlzdHMgKmhpc3RzID0gZXZzZWxfX2hpc3RzKGV2c2VsKTsKIAkJc3RydWN0IGhpc3RfZW50cnlfaXRlciBpdGVyID0gewogCQkJLmV2c2VsCQk9IGV2c2VsLApAQCAtOTQwLDYgKzkxNCwxMCBAQAogCiBzdGF0aWMgaW50IF9fY21kX3RvcChzdHJ1Y3QgcGVyZl90b3AgKnRvcCkKIHsKKwljaGFyIG1zZ1s1MTJdOworCXN0cnVjdCBwZXJmX2V2c2VsICpwb3M7CisJc3RydWN0IHBlcmZfZXZzZWxfY29uZmlnX3Rlcm0gKmVycl90ZXJtOworCXN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0ID0gdG9wLT5ldmxpc3Q7CiAJc3RydWN0IHJlY29yZF9vcHRzICpvcHRzID0gJnRvcC0+cmVjb3JkX29wdHM7CiAJcHRocmVhZF90IHRocmVhZDsKIAlpbnQgcmV0OwpAQCAtOTQ4LDggKzkyNiw2IEBACiAJaWYgKHRvcC0+c2Vzc2lvbiA9PSBOVUxMKQogCQlyZXR1cm4gLTE7CiAKLQltYWNoaW5lc19fc2V0X3N5bWJvbF9maWx0ZXIoJnRvcC0+c2Vzc2lvbi0+bWFjaGluZXMsIHN5bWJvbF9maWx0ZXIpOwotCiAJaWYgKCFvYmpkdW1wX3BhdGgpIHsKIAkJcmV0ID0gcGVyZl9lbnZfX2xvb2t1cF9vYmpkdW1wKCZ0b3AtPnNlc3Npb24tPmhlYWRlci5lbnYpOwogCQlpZiAocmV0KQpAQCAtOTc2LDYgKzk1MiwxNCBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0X2RlbGV0ZTsKIAorCXJldCA9IHBlcmZfZXZsaXN0X19hcHBseV9kcnZfY29uZmlncyhldmxpc3QsICZwb3MsICZlcnJfdGVybSk7CisJaWYgKHJldCkgeworCQllcnJvcigiZmFpbGVkIHRvIHNldCBjb25maWcgXCIlc1wiIG9uIGV2ZW50ICVzIHdpdGggJWQgKCVzKVxuIiwKKwkJCWVycl90ZXJtLT52YWwuZHJ2X2NmZywgcGVyZl9ldnNlbF9fbmFtZShwb3MpLCBlcnJubywKKwkJCXN0cl9lcnJvcl9yKGVycm5vLCBtc2csIHNpemVvZihtc2cpKSk7CisJCWdvdG8gb3V0X2RlbGV0ZTsKKwl9CisKIAl0b3AtPnNlc3Npb24tPmV2bGlzdCA9IHRvcC0+ZXZsaXN0OwogCXBlcmZfc2Vzc2lvbl9fc2V0X2lkX2hkcl9zaXplKHRvcC0+c2Vzc2lvbik7CiAKQEAgLTEzMjMsNyArMTMwNyw5IEBACiAJaWYgKHN5bWJvbF9jb25mLmN1bXVsYXRlX2NhbGxjaGFpbiAmJiAhY2FsbGNoYWluX3BhcmFtLm9yZGVyX3NldCkKIAkJY2FsbGNoYWluX3BhcmFtLm9yZGVyID0gT1JERVJfQ0FMTEVSOwogCi0Jc3ltYm9sX2NvbmYucHJpdl9zaXplID0gc2l6ZW9mKHN0cnVjdCBhbm5vdGF0aW9uKTsKKwlzdGF0dXMgPSBzeW1ib2xfX2Fubm90YXRpb25faW5pdCgpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIG91dF9kZWxldGVfZXZsaXN0OwogCiAJc3ltYm9sX2NvbmYudHJ5X3ZtbGludXhfcGF0aCA9IChzeW1ib2xfY29uZi52bWxpbnV4X25hbWUgPT0gTlVMTCk7CiAJaWYgKHN5bWJvbF9faW5pdChOVUxMKSA8IDApCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tdHJhY2UuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi10cmFjZS5jCmluZGV4IGI4YzY3NjYuLmMyOThiZDMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10cmFjZS5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi10cmFjZS5jCkBAIC00NSw2ICs0NSw3IEBACiAjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lNjQuaD4KIAogI2lmbmRlZiBPX0NMT0VYRUMKICMgZGVmaW5lIE9fQ0xPRVhFQwkJMDIwMDAwMDAKQEAgLTc0MSw2ICs3NDIsOCBAQAogCSAgLmFyZ19zY25wcmludGYgPSB7IFsxXSA9IFNDQV9TSUdOVU0sIC8qIHNpZyAqLyB9LCB9LAogCXsgLm5hbWUJICAgID0gInJ0X3Rnc2lncXVldWVpbmZvIiwgLmVycm1zZyA9IHRydWUsCiAJICAuYXJnX3NjbnByaW50ZiA9IHsgWzJdID0gU0NBX1NJR05VTSwgLyogc2lnICovIH0sIH0sCisJeyAubmFtZQkgICAgPSAic2NoZWRfZ2V0YXR0ciIsCSAgICAgIC5lcnJtc2cgPSB0cnVlLCB9LAorCXsgLm5hbWUJICAgID0gInNjaGVkX3NldGF0dHIiLAkgICAgICAuZXJybXNnID0gdHJ1ZSwgfSwKIAl7IC5uYW1lCSAgICA9ICJzY2hlZF9zZXRzY2hlZHVsZXIiLCAgIC5lcnJtc2cgPSB0cnVlLAogCSAgLmFyZ19zY25wcmludGYgPSB7IFsxXSA9IFNDQV9TQ0hFRF9QT0xJQ1ksIC8qIHBvbGljeSAqLyB9LCB9LAogCXsgLm5hbWUJICAgID0gInNlY2NvbXAiLCAuZXJybXNnID0gdHJ1ZSwKQEAgLTIxNDAsNiArMjE0Myw3IEBACiBzdGF0aWMgaW50IHRyYWNlX19zZXRfZXZfcXVhbGlmaWVyX2ZpbHRlcihzdHJ1Y3QgdHJhY2UgKnRyYWNlKQogewogCWludCBlcnIgPSAtMTsKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqc3lzX2V4aXQ7CiAJY2hhciAqZmlsdGVyID0gYXNwcmludGZfZXhwcl9pbm91dF9pbnRzKCJpZCIsICF0cmFjZS0+bm90X2V2X3F1YWxpZmllciwKIAkJCQkJCXRyYWNlLT5ldl9xdWFsaWZpZXJfaWRzLm5yLAogCQkJCQkJdHJhY2UtPmV2X3F1YWxpZmllcl9pZHMuZW50cmllcyk7CkBAIC0yMTQ3LDggKzIxNTEsMTEgQEAKIAlpZiAoZmlsdGVyID09IE5VTEwpCiAJCWdvdG8gb3V0X2Vub21lbTsKIAotCWlmICghcGVyZl9ldnNlbF9fYXBwZW5kX2ZpbHRlcih0cmFjZS0+c3lzY2FsbHMuZXZlbnRzLnN5c19lbnRlciwgIiYmIiwgZmlsdGVyKSkKLQkJZXJyID0gcGVyZl9ldnNlbF9fYXBwZW5kX2ZpbHRlcih0cmFjZS0+c3lzY2FsbHMuZXZlbnRzLnN5c19leGl0LCAiJiYiLCBmaWx0ZXIpOworCWlmICghcGVyZl9ldnNlbF9fYXBwZW5kX3RwX2ZpbHRlcih0cmFjZS0+c3lzY2FsbHMuZXZlbnRzLnN5c19lbnRlciwKKwkJCQkJICBmaWx0ZXIpKSB7CisJCXN5c19leGl0ID0gdHJhY2UtPnN5c2NhbGxzLmV2ZW50cy5zeXNfZXhpdDsKKwkJZXJyID0gcGVyZl9ldnNlbF9fYXBwZW5kX3RwX2ZpbHRlcihzeXNfZXhpdCwgZmlsdGVyKTsKKwl9CiAKIAlmcmVlKGZpbHRlcik7CiBvdXQ6CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3BlcmYtc3lzLmggYi90b29scy9wZXJmL3BlcmYtc3lzLmgKaW5kZXggN2VkNzJhNC4uZTRiNzE3ZSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9wZXJmLXN5cy5oCisrKyBiL3Rvb2xzL3BlcmYvcGVyZi1zeXMuaApAQCAtMjAsNyArMjAsNiBAQAogI2VuZGlmCiAKICNpZmRlZiBfX3Bvd2VycGNfXwotI2luY2x1ZGUgIi4uLy4uL2FyY2gvcG93ZXJwYy9pbmNsdWRlL3VhcGkvYXNtL3VuaXN0ZC5oIgogI2RlZmluZSBDUFVJTkZPX1BST0MJeyJjcHUifQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvcGVyZi5oIGIvdG9vbHMvcGVyZi9wZXJmLmgKaW5kZXggY2IwZjEzNS4uOWEwMjM2YSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9wZXJmLmgKKysrIGIvdG9vbHMvcGVyZi9wZXJmLmgKQEAgLTE0LDEzICsxNCw2IEBACiAjZGVmaW5lIEhBVkVfQVRUUl9URVNUCiAjaW5jbHVkZSAicGVyZi1zeXMuaCIKIAotI2lmbmRlZiBOU0VDX1BFUl9TRUMKLSMgZGVmaW5lIE5TRUNfUEVSX1NFQwkJCTEwMDAwMDAwMDBVTEwKLSNlbmRpZgotI2lmbmRlZiBOU0VDX1BFUl9VU0VDCi0jIGRlZmluZSBOU0VDX1BFUl9VU0VDCQkJMTAwMFVMTAotI2VuZGlmCi0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIHJkY2xvY2sodm9pZCkKIHsKIAlzdHJ1Y3QgdGltZXNwZWMgdHM7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3Rlc3RzL0J1aWxkIGIvdG9vbHMvcGVyZi90ZXN0cy9CdWlsZAppbmRleCBkYzUxYmM1Li44YTRjZTQ5IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3Rlc3RzL0J1aWxkCisrKyBiL3Rvb2xzL3BlcmYvdGVzdHMvQnVpbGQKQEAgLTcxLDcgKzcxLDcgQEAKIAkkKFEpc2VkIC1lICdzLyIvXFwiL2cnIC1lICdzL1woLipcKS8iXDFcXG4iL2cnICQ8ID4+ICRACiAJJChRKWVjaG8gJzsnID4+ICRACiAKLWlmZXEgKCQoQVJDSCksJChmaWx0ZXIgJChBUkNIKSx4ODYgYXJtIGFybTY0KSkKK2lmZXEgKCQoQVJDSCksJChmaWx0ZXIgJChBUkNIKSx4ODYgYXJtIGFybTY0IHBvd2VycGMpKQogcGVyZi0kKENPTkZJR19EV0FSRl9VTldJTkQpICs9IGR3YXJmLXVud2luZC5vCiBlbmRpZgogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3Rlc3RzL2JhY2t3YXJkLXJpbmctYnVmZmVyLmMgYi90b29scy9wZXJmL3Rlc3RzL2JhY2t3YXJkLXJpbmctYnVmZmVyLmMKaW5kZXggNjE1NzgwYy4uZTZkMTgxNiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi90ZXN0cy9iYWNrd2FyZC1yaW5nLWJ1ZmZlci5jCisrKyBiL3Rvb2xzL3BlcmYvdGVzdHMvYmFja3dhcmQtcmluZy1idWZmZXIuYwpAQCAtOTcsNyArOTcsNyBAQAogCiAJZXZsaXN0ID0gcGVyZl9ldmxpc3RfX25ldygpOwogCWlmICghZXZsaXN0KSB7Ci0JCXByX2RlYnVnKCJObyBlaG91Z2ggbWVtb3J5IHRvIGNyZWF0ZSBldmxpc3RcbiIpOworCQlwcl9kZWJ1ZygiTm8gZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgZXZsaXN0XG4iKTsKIAkJcmV0dXJuIFRFU1RfRkFJTDsKIAl9CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdGVzdHMvYnBmLmMgYi90b29scy9wZXJmL3Rlc3RzL2JwZi5jCmluZGV4IGZjNTQwNjQuLjI2NzNlODYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdGVzdHMvYnBmLmMKKysrIGIvdG9vbHMvcGVyZi90ZXN0cy9icGYuYwpAQCAtMTI1LDcgKzEyNSw3IEBACiAJLyogSW5zdGVhZCBvZiBwZXJmX2V2bGlzdF9fbmV3X2RlZmF1bHQsIGRvbid0IGFkZCBkZWZhdWx0IGV2ZW50cyAqLwogCWV2bGlzdCA9IHBlcmZfZXZsaXN0X19uZXcoKTsKIAlpZiAoIWV2bGlzdCkgewotCQlwcl9kZWJ1ZygiTm8gZWhvdWdoIG1lbW9yeSB0byBjcmVhdGUgZXZsaXN0XG4iKTsKKwkJcHJfZGVidWcoIk5vIGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIGV2bGlzdFxuIik7CiAJCXJldHVybiBURVNUX0ZBSUw7CiAJfQogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3Rlc3RzL2NvZGUtcmVhZGluZy5jIGIvdG9vbHMvcGVyZi90ZXN0cy9jb2RlLXJlYWRpbmcuYwppbmRleCAyYWYxNTZhLi5mZjViYzYzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3Rlc3RzL2NvZGUtcmVhZGluZy5jCisrKyBiL3Rvb2xzL3BlcmYvdGVzdHMvY29kZS1yZWFkaW5nLmMKQEAgLTI2Myw3ICsyNjMsNyBAQAogCSAqIENvbnZlcnRpbmcgYWRkcmVzc2VzIGZvciB1c2UgYnkgb2JqZHVtcCByZXF1aXJlcyBtb3JlIGluZm9ybWF0aW9uLgogCSAqIG1hcF9fbG9hZCgpIGRvZXMgdGhhdC4gIFNlZSBtYXBfX3JpcF8yb2JqZHVtcCgpIGZvciBkZXRhaWxzLgogCSAqLwotCWlmIChtYXBfX2xvYWQoYWwubWFwLCBOVUxMKSkKKwlpZiAobWFwX19sb2FkKGFsLm1hcCkpCiAJCXJldHVybiAtMTsKIAogCS8qIG9iamR1bXAgc3RydWdnbGVzIHdpdGgga2NvcmUgLSB0cnkgZWFjaCBtYXAgb25seSBvbmNlICovCkBAIC01MTEsNyArNTExLDcgQEAKIAogCS8qIExvYWQga2VybmVsIG1hcCAqLwogCW1hcCA9IG1hY2hpbmVfX2tlcm5lbF9tYXAobWFjaGluZSk7Ci0JcmV0ID0gbWFwX19sb2FkKG1hcCwgTlVMTCk7CisJcmV0ID0gbWFwX19sb2FkKG1hcCk7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJfZGVidWcoIm1hcF9fbG9hZCBmYWlsZWRcbiIpOwogCQlnb3RvIG91dF9lcnI7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3Rlc3RzL2R3YXJmLXVud2luZC5jIGIvdG9vbHMvcGVyZi90ZXN0cy9kd2FyZi11bndpbmQuYwppbmRleCA4ZjZlYjg1Li4xMDQ2NDkxIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3Rlc3RzL2R3YXJmLXVud2luZC5jCisrKyBiL3Rvb2xzL3BlcmYvdGVzdHMvZHdhcmYtdW53aW5kLmMKQEAgLTExLDcgKzExLDcgQEAKICNpbmNsdWRlICJ0aHJlYWQuaCIKICNpbmNsdWRlICJjYWxsY2hhaW4uaCIKIAotI2lmIGRlZmluZWQgKF9feDg2XzY0X18pIHx8IGRlZmluZWQgKF9faTM4Nl9fKQorI2lmIGRlZmluZWQgKF9feDg2XzY0X18pIHx8IGRlZmluZWQgKF9faTM4Nl9fKSB8fCBkZWZpbmVkIChfX3Bvd2VycGNfXykKICNpbmNsdWRlICJhcmNoLXRlc3RzLmgiCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi90ZXN0cy92bWxpbnV4LWthbGxzeW1zLmMgYi90b29scy9wZXJmL3Rlc3RzL3ZtbGludXgta2FsbHN5bXMuYwppbmRleCBlNjNhYmFiLi5hNTA4MjMzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3Rlc3RzL3ZtbGludXgta2FsbHN5bXMuYworKysgYi90b29scy9wZXJmL3Rlc3RzL3ZtbGludXgta2FsbHN5bXMuYwpAQCAtOCwxNCArOCw2IEBACiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJtYWNoaW5lLmgiCiAKLXN0YXRpYyBpbnQgdm1saW51eF9tYXRjaGVzX2thbGxzeW1zX2ZpbHRlcihzdHJ1Y3QgbWFwICptYXAgX19tYXliZV91bnVzZWQsCi0JCQkJCSAgIHN0cnVjdCBzeW1ib2wgKnN5bSkKLXsKLQlib29sICp2aXNpdGVkID0gc3ltYm9sX19wcml2KHN5bSk7Ci0JKnZpc2l0ZWQgPSB0cnVlOwotCXJldHVybiAwOwotfQotCiAjZGVmaW5lIFVNKHgpIGthbGxzeW1zX21hcC0+dW5tYXBfaXAoa2FsbHN5bXNfbWFwLCAoeCkpCiAKIGludCB0ZXN0X192bWxpbnV4X21hdGNoZXNfa2FsbHN5bXMoaW50IHN1YnRlc3QgX19tYXliZV91bnVzZWQpCkBAIC0yOCw2ICsyMCw3IEBACiAJZW51bSBtYXBfdHlwZSB0eXBlID0gTUFQX19GVU5DVElPTjsKIAlzdHJ1Y3QgbWFwcyAqbWFwcyA9ICZ2bWxpbnV4LmttYXBzLm1hcHNbdHlwZV07CiAJdTY0IG1lbV9zdGFydCwgbWVtX2VuZDsKKwlib29sIGhlYWRlcl9wcmludGVkOwogCiAJLyoKIAkgKiBTdGVwIDE6CkBAIC02MSw3ICs1NCw3IEBACiAJICogYmUgY29tcGFjdGVkIGFnYWluc3QgdGhlIGxpc3Qgb2YgbW9kdWxlcyBmb3VuZCBpbiB0aGUgInZtbGludXgiCiAJICogY29kZSBhbmQgd2l0aCB0aGUgb25lIGdvdCBmcm9tIC9wcm9jL21vZHVsZXMgZnJvbSB0aGUgImthbGxzeW1zIiBjb2RlLgogCSAqLwotCWlmIChfX21hY2hpbmVfX2xvYWRfa2FsbHN5bXMoJmthbGxzeW1zLCAiL3Byb2Mva2FsbHN5bXMiLCB0eXBlLCB0cnVlLCBOVUxMKSA8PSAwKSB7CisJaWYgKF9fbWFjaGluZV9fbG9hZF9rYWxsc3ltcygma2FsbHN5bXMsICIvcHJvYy9rYWxsc3ltcyIsIHR5cGUsIHRydWUpIDw9IDApIHsKIAkJcHJfZGVidWcoImRzb19fbG9hZF9rYWxsc3ltcyAiKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtOTksOCArOTIsNyBAQAogCSAqIG1hcHNfX3JlbG9jX3ZtbGludXggd2lsbCBub3RpY2UgYW5kIHNldCBwcm9wZXIgLT5bdW5dbWFwX2lwIHJvdXRpbmVzCiAJICogdG8gZml4dXAgdGhlIHN5bWJvbHMuCiAJICovCi0JaWYgKG1hY2hpbmVfX2xvYWRfdm1saW51eF9wYXRoKCZ2bWxpbnV4LCB0eXBlLAotCQkJCSAgICAgICB2bWxpbnV4X21hdGNoZXNfa2FsbHN5bXNfZmlsdGVyKSA8PSAwKSB7CisJaWYgKG1hY2hpbmVfX2xvYWRfdm1saW51eF9wYXRoKCZ2bWxpbnV4LCB0eXBlKSA8PSAwKSB7CiAJCXByX2RlYnVnKCJDb3VsZG4ndCBmaW5kIGEgdm1saW51eCB0aGF0IG1hdGNoZXMgdGhlIGtlcm5lbCBydW5uaW5nIG9uIHRoaXMgbWFjaGluZSwgc2tpcHBpbmcgdGVzdFxuIik7CiAJCWVyciA9IFRFU1RfU0tJUDsKIAkJZ290byBvdXQ7CkBAIC0xMjYsNyArMTE4LDcgQEAKIAkJbWVtX2VuZCA9IHZtbGludXhfbWFwLT51bm1hcF9pcCh2bWxpbnV4X21hcCwgc3ltLT5lbmQpOwogCiAJCWZpcnN0X3BhaXIgPSBtYWNoaW5lX19maW5kX2tlcm5lbF9zeW1ib2woJmthbGxzeW1zLCB0eXBlLAotCQkJCQkJCSBtZW1fc3RhcnQsIE5VTEwsIE5VTEwpOworCQkJCQkJCSBtZW1fc3RhcnQsIE5VTEwpOwogCQlwYWlyID0gZmlyc3RfcGFpcjsKIAogCQlpZiAocGFpciAmJiBVTShwYWlyLT5zdGFydCkgPT0gbWVtX3N0YXJ0KSB7CkBAIC0xNDMsNyArMTM1LDcgQEAKIAkJCQkgKi8KIAkJCQlzNjQgc2tldyA9IG1lbV9lbmQgLSBVTShwYWlyLT5lbmQpOwogCQkJCWlmIChsbGFicyhza2V3KSA+PSBwYWdlX3NpemUpCi0JCQkJCXByX2RlYnVnKCIlIyIgUFJJeDY0ICI6IGRpZmYgZW5kIGFkZHIgZm9yICVzIHY6ICUjIiBQUkl4NjQgIiBrOiAlIyIgUFJJeDY0ICJcbiIsCisJCQkJCXByX2RlYnVnKCJXQVJOOiAlIyIgUFJJeDY0ICI6IGRpZmYgZW5kIGFkZHIgZm9yICVzIHY6ICUjIiBQUkl4NjQgIiBrOiAlIyIgUFJJeDY0ICJcbiIsCiAJCQkJCQkgbWVtX3N0YXJ0LCBzeW0tPm5hbWUsIG1lbV9lbmQsCiAJCQkJCQkgVU0ocGFpci0+ZW5kKSk7CiAKQEAgLTE1NCwyMiArMTQ2LDIzIEBACiAJCQkJICoga2FsbHN5bXMuCiAJCQkJICovCiAJCQkJY29udGludWU7Ci0KIAkJCX0gZWxzZSB7Ci0JCQkJcGFpciA9IG1hY2hpbmVfX2ZpbmRfa2VybmVsX3N5bWJvbF9ieV9uYW1lKCZrYWxsc3ltcywgdHlwZSwgc3ltLT5uYW1lLCBOVUxMLCBOVUxMKTsKKwkJCQlwYWlyID0gbWFjaGluZV9fZmluZF9rZXJuZWxfc3ltYm9sX2J5X25hbWUoJmthbGxzeW1zLCB0eXBlLCBzeW0tPm5hbWUsIE5VTEwpOwogCQkJCWlmIChwYWlyKSB7CiAJCQkJCWlmIChVTShwYWlyLT5zdGFydCkgPT0gbWVtX3N0YXJ0KQogCQkJCQkJZ290byBuZXh0X3BhaXI7CiAKLQkJCQkJcHJfZGVidWcoIiUjIiBQUkl4NjQgIjogZGlmZiBuYW1lIHY6ICVzIGs6ICVzXG4iLAorCQkJCQlwcl9kZWJ1ZygiV0FSTjogJSMiIFBSSXg2NCAiOiBkaWZmIG5hbWUgdjogJXMgazogJXNcbiIsCiAJCQkJCQkgbWVtX3N0YXJ0LCBzeW0tPm5hbWUsIHBhaXItPm5hbWUpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCXByX2RlYnVnKCIlIyIgUFJJeDY0ICI6IGRpZmYgbmFtZSB2OiAlcyBrOiAlc1xuIiwKKwkJCQkJcHJfZGVidWcoIldBUk46ICUjIiBQUkl4NjQgIjogZGlmZiBuYW1lIHY6ICVzIGs6ICVzXG4iLAogCQkJCQkJIG1lbV9zdGFydCwgc3ltLT5uYW1lLCBmaXJzdF9wYWlyLT5uYW1lKTsKIAkJCQl9CisKKwkJCQljb250aW51ZTsKIAkJCX0KIAkJfSBlbHNlCi0JCQlwcl9kZWJ1ZygiJSMiIFBSSXg2NCAiOiAlcyBub3Qgb24ga2FsbHN5bXNcbiIsCisJCQlwcl9kZWJ1ZygiRVJSIDogJSMiIFBSSXg2NCAiOiAlcyBub3Qgb24ga2FsbHN5bXNcbiIsCiAJCQkJIG1lbV9zdGFydCwgc3ltLT5uYW1lKTsKIAogCQllcnIgPSAtMTsKQEAgLTE3OCw3ICsxNzEsNyBAQAogCWlmICghdmVyYm9zZSkKIAkJZ290byBvdXQ7CiAKLQlwcl9pbmZvKCJNYXBzIG9ubHkgaW4gdm1saW51eDpcbiIpOworCWhlYWRlcl9wcmludGVkID0gZmFsc2U7CiAKIAlmb3IgKG1hcCA9IG1hcHNfX2ZpcnN0KG1hcHMpOyBtYXA7IG1hcCA9IG1hcF9fbmV4dChtYXApKSB7CiAJCXN0cnVjdCBtYXAgKgpAQCAtMTkyLDEzICsxODUsMTggQEAKIAkJCQkJCShtYXAtPmRzby0+a2VybmVsID8KIAkJCQkJCQltYXAtPmRzby0+c2hvcnRfbmFtZSA6CiAJCQkJCQkJbWFwLT5kc28tPm5hbWUpKTsKLQkJaWYgKHBhaXIpCisJCWlmIChwYWlyKSB7CiAJCQlwYWlyLT5wcml2ID0gMTsKLQkJZWxzZQorCQl9IGVsc2UgeworCQkJaWYgKCFoZWFkZXJfcHJpbnRlZCkgeworCQkJCXByX2luZm8oIldBUk46IE1hcHMgb25seSBpbiB2bWxpbnV4OlxuIik7CisJCQkJaGVhZGVyX3ByaW50ZWQgPSB0cnVlOworCQkJfQogCQkJbWFwX19mcHJpbnRmKG1hcCwgc3RkZXJyKTsKKwkJfQogCX0KIAotCXByX2luZm8oIk1hcHMgaW4gdm1saW51eCB3aXRoIGEgZGlmZmVyZW50IG5hbWUgaW4ga2FsbHN5bXM6XG4iKTsKKwloZWFkZXJfcHJpbnRlZCA9IGZhbHNlOwogCiAJZm9yIChtYXAgPSBtYXBzX19maXJzdChtYXBzKTsgbWFwOyBtYXAgPSBtYXBfX25leHQobWFwKSkgewogCQlzdHJ1Y3QgbWFwICpwYWlyOwpAQCAtMjExLDI0ICsyMDksMzMgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChwYWlyLT5zdGFydCA9PSBtZW1fc3RhcnQpIHsKLQkJCXBhaXItPnByaXYgPSAxOwotCQkJcHJfaW5mbygiICUiIFBSSXg2NCAiLSUiIFBSSXg2NCAiICUiIFBSSXg2NCAiICVzIGluIGthbGxzeW1zIGFzIiwKKwkJCWlmICghaGVhZGVyX3ByaW50ZWQpIHsKKwkJCQlwcl9pbmZvKCJXQVJOOiBNYXBzIGluIHZtbGludXggd2l0aCBhIGRpZmZlcmVudCBuYW1lIGluIGthbGxzeW1zOlxuIik7CisJCQkJaGVhZGVyX3ByaW50ZWQgPSB0cnVlOworCQkJfQorCisJCQlwcl9pbmZvKCJXQVJOOiAlIiBQUkl4NjQgIi0lIiBQUkl4NjQgIiAlIiBQUkl4NjQgIiAlcyBpbiBrYWxsc3ltcyBhcyIsCiAJCQkJbWFwLT5zdGFydCwgbWFwLT5lbmQsIG1hcC0+cGdvZmYsIG1hcC0+ZHNvLT5uYW1lKTsKIAkJCWlmIChtZW1fZW5kICE9IHBhaXItPmVuZCkKLQkJCQlwcl9pbmZvKCI6XG4qJSIgUFJJeDY0ICItJSIgUFJJeDY0ICIgJSIgUFJJeDY0LAorCQkJCXByX2luZm8oIjpcbldBUk46IColIiBQUkl4NjQgIi0lIiBQUkl4NjQgIiAlIiBQUkl4NjQsCiAJCQkJCXBhaXItPnN0YXJ0LCBwYWlyLT5lbmQsIHBhaXItPnBnb2ZmKTsKIAkJCXByX2luZm8oIiAlc1xuIiwgcGFpci0+ZHNvLT5uYW1lKTsKIAkJCXBhaXItPnByaXYgPSAxOwogCQl9CiAJfQogCi0JcHJfaW5mbygiTWFwcyBvbmx5IGluIGthbGxzeW1zOlxuIik7CisJaGVhZGVyX3ByaW50ZWQgPSBmYWxzZTsKIAogCW1hcHMgPSAma2FsbHN5bXMua21hcHMubWFwc1t0eXBlXTsKIAogCWZvciAobWFwID0gbWFwc19fZmlyc3QobWFwcyk7IG1hcDsgbWFwID0gbWFwX19uZXh0KG1hcCkpIHsKLQkJaWYgKCFtYXAtPnByaXYpCisJCWlmICghbWFwLT5wcml2KSB7CisJCQlpZiAoIWhlYWRlcl9wcmludGVkKSB7CisJCQkJcHJfaW5mbygiV0FSTjogTWFwcyBvbmx5IGluIGthbGxzeW1zOlxuIik7CisJCQkJaGVhZGVyX3ByaW50ZWQgPSB0cnVlOworCQkJfQogCQkJbWFwX19mcHJpbnRmKG1hcCwgc3RkZXJyKTsKKwkJfQogCX0KIG91dDoKIAltYWNoaW5lX19leGl0KCZrYWxsc3ltcyk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3RyYWNlL2JlYXV0eS9tbWFwLmMgYi90b29scy9wZXJmL3RyYWNlL2JlYXV0eS9tbWFwLmMKaW5kZXggZDBhM2E4ZS4uZmQ3MTBhYiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi90cmFjZS9iZWF1dHkvbW1hcC5jCisrKyBiL3Rvb2xzL3BlcmYvdHJhY2UvYmVhdXR5L21tYXAuYwpAQCAtMSw4ICsxLDQgQEAKLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0jaWZuZGVmIFBST1RfU0VNCi0jZGVmaW5lIFBST1RfU0VNIDB4OAotI2VuZGlmCisjaW5jbHVkZSA8dWFwaS9saW51eC9tbWFuLmg+CiAKIHN0YXRpYyBzaXplX3Qgc3lzY2FsbF9hcmdfX3NjbnByaW50Zl9tbWFwX3Byb3QoY2hhciAqYmYsIHNpemVfdCBzaXplLAogCQkJCQkgICAgICAgc3RydWN0IHN5c2NhbGxfYXJnICphcmcpCkBAIC0zMywzMSArMjksNiBAQAogCiAjZGVmaW5lIFNDQV9NTUFQX1BST1Qgc3lzY2FsbF9hcmdfX3NjbnByaW50Zl9tbWFwX3Byb3QKIAotI2lmbmRlZiBNQVBfRklYRUQKLSNkZWZpbmUgTUFQX0ZJWEVECQkgICAgIDB4MTAKLSNlbmRpZgotCi0jaWZuZGVmIE1BUF9BTk9OWU1PVVMKLSNkZWZpbmUgTUFQX0FOT05ZTU9VUwkJICAgICAweDIwCi0jZW5kaWYKLQotI2lmbmRlZiBNQVBfMzJCSVQKLSNkZWZpbmUgTUFQXzMyQklUCQkgICAgIDB4NDAKLSNlbmRpZgotCi0jaWZuZGVmIE1BUF9TVEFDSwotI2RlZmluZSBNQVBfU1RBQ0sJCSAgMHgyMDAwMAotI2VuZGlmCi0KLSNpZm5kZWYgTUFQX0hVR0VUTEIKLSNkZWZpbmUgTUFQX0hVR0VUTEIJCSAgMHg0MDAwMAotI2VuZGlmCi0KLSNpZm5kZWYgTUFQX1VOSU5JVElBTElaRUQKLSNkZWZpbmUgTUFQX1VOSU5JVElBTElaRUQJMHg0MDAwMDAwCi0jZW5kaWYKLQotCiBzdGF0aWMgc2l6ZV90IHN5c2NhbGxfYXJnX19zY25wcmludGZfbW1hcF9mbGFncyhjaGFyICpiZiwgc2l6ZV90IHNpemUsCiAJCQkJCQlzdHJ1Y3Qgc3lzY2FsbF9hcmcgKmFyZykKIHsKQEAgLTk1LDEzICs2Niw2IEBACiAKICNkZWZpbmUgU0NBX01NQVBfRkxBR1Mgc3lzY2FsbF9hcmdfX3NjbnByaW50Zl9tbWFwX2ZsYWdzCiAKLSNpZm5kZWYgTVJFTUFQX01BWU1PVkUKLSNkZWZpbmUgTVJFTUFQX01BWU1PVkUgMQotI2VuZGlmCi0jaWZuZGVmIE1SRU1BUF9GSVhFRAotI2RlZmluZSBNUkVNQVBfRklYRUQgMgotI2VuZGlmCi0KIHN0YXRpYyBzaXplX3Qgc3lzY2FsbF9hcmdfX3NjbnByaW50Zl9tcmVtYXBfZmxhZ3MoY2hhciAqYmYsIHNpemVfdCBzaXplLAogCQkJCQkJICBzdHJ1Y3Qgc3lzY2FsbF9hcmcgKmFyZykKIHsKQEAgLTEyNSwzOSArODksNiBAQAogCiAjZGVmaW5lIFNDQV9NUkVNQVBfRkxBR1Mgc3lzY2FsbF9hcmdfX3NjbnByaW50Zl9tcmVtYXBfZmxhZ3MKIAotI2lmbmRlZiBNQURWX0hXUE9JU09OCi0jZGVmaW5lIE1BRFZfSFdQT0lTT04JCTEwMAotI2VuZGlmCi0KLSNpZm5kZWYgTUFEVl9TT0ZUX09GRkxJTkUKLSNkZWZpbmUgTUFEVl9TT0ZUX09GRkxJTkUJMTAxCi0jZW5kaWYKLQotI2lmbmRlZiBNQURWX01FUkdFQUJMRQotI2RlZmluZSBNQURWX01FUkdFQUJMRQkJIDEyCi0jZW5kaWYKLQotI2lmbmRlZiBNQURWX1VOTUVSR0VBQkxFCi0jZGVmaW5lIE1BRFZfVU5NRVJHRUFCTEUJIDEzCi0jZW5kaWYKLQotI2lmbmRlZiBNQURWX0hVR0VQQUdFCi0jZGVmaW5lIE1BRFZfSFVHRVBBR0UJCSAxNAotI2VuZGlmCi0KLSNpZm5kZWYgTUFEVl9OT0hVR0VQQUdFCi0jZGVmaW5lIE1BRFZfTk9IVUdFUEFHRQkJIDE1Ci0jZW5kaWYKLQotI2lmbmRlZiBNQURWX0RPTlREVU1QCi0jZGVmaW5lIE1BRFZfRE9OVERVTVAJCSAxNgotI2VuZGlmCi0KLSNpZm5kZWYgTUFEVl9ET0RVTVAKLSNkZWZpbmUgTUFEVl9ET0RVTVAJCSAxNwotI2VuZGlmCi0KLQogc3RhdGljIHNpemVfdCBzeXNjYWxsX2FyZ19fc2NucHJpbnRmX21hZHZpc2VfYmVoYXZpb3IoY2hhciAqYmYsIHNpemVfdCBzaXplLAogCQkJCQkJICAgICAgc3RydWN0IHN5c2NhbGxfYXJnICphcmcpCiB7CkBAIC0xNzAsNiArMTAxLDcgQEAKIAlQX01BRFZfQkhWKFNFUVVFTlRJQUwpOwogCVBfTUFEVl9CSFYoV0lMTE5FRUQpOwogCVBfTUFEVl9CSFYoRE9OVE5FRUQpOworCVBfTUFEVl9CSFYoRlJFRSk7CiAJUF9NQURWX0JIVihSRU1PVkUpOwogCVBfTUFEVl9CSFYoRE9OVEZPUkspOwogCVBfTUFEVl9CSFYoRE9GT1JLKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdWkvYnJvd3NlcnMvYW5ub3RhdGUuYyBiL3Rvb2xzL3BlcmYvdWkvYnJvd3NlcnMvYW5ub3RhdGUuYwppbmRleCAyZTJkMTAwLi40YzE4MjcxIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3VpL2Jyb3dzZXJzL2Fubm90YXRlLmMKKysrIGIvdG9vbHMvcGVyZi91aS9icm93c2Vycy9hbm5vdGF0ZS5jCkBAIC00OTUsNyArNDk1LDcgQEAKIAlpZiAoIWluc19faXNfY2FsbChkbC0+aW5zKSkKIAkJcmV0dXJuIGZhbHNlOwogCi0JaWYgKG1hcF9ncm91cHNfX2ZpbmRfYW1zKCZ0YXJnZXQsIE5VTEwpIHx8CisJaWYgKG1hcF9ncm91cHNfX2ZpbmRfYW1zKCZ0YXJnZXQpIHx8CiAJICAgIG1hcF9fcmlwXzJvYmpkdW1wKHRhcmdldC5tYXAsIHRhcmdldC5tYXAtPm1hcF9pcCh0YXJnZXQubWFwLAogCQkJCQkJCSAgICAgdGFyZ2V0LmFkZHIpKSAhPQogCSAgICBkbC0+b3BzLnRhcmdldC5hZGRyKSB7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3VpL2Jyb3dzZXJzL2hpc3RzLmMgYi90b29scy9wZXJmL3VpL2Jyb3dzZXJzL2hpc3RzLmMKaW5kZXggMTNkNDE0My4uZmI4ZTQyYyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91aS9icm93c2Vycy9oaXN0cy5jCisrKyBiL3Rvb2xzL3BlcmYvdWkvYnJvd3NlcnMvaGlzdHMuYwpAQCAtNjksOCArNjksMTEgQEAKIHN0YXRpYyB2b2lkIGhpc3RfYnJvd3Nlcl9fdXBkYXRlX3Jvd3Moc3RydWN0IGhpc3RfYnJvd3NlciAqaGIpCiB7CiAJc3RydWN0IHVpX2Jyb3dzZXIgKmJyb3dzZXIgPSAmaGItPmI7Ci0JdTE2IGhlYWRlcl9vZmZzZXQgPSBoYi0+c2hvd19oZWFkZXJzID8gMSA6IDAsIGluZGV4X3JvdzsKKwlzdHJ1Y3QgaGlzdHMgKmhpc3RzID0gaGItPmhpc3RzOworCXN0cnVjdCBwZXJmX2hwcF9saXN0ICpocHBfbGlzdCA9IGhpc3RzLT5ocHBfbGlzdDsKKwl1MTYgaGVhZGVyX29mZnNldCwgaW5kZXhfcm93OwogCisJaGVhZGVyX29mZnNldCA9IGhiLT5zaG93X2hlYWRlcnMgPyBocHBfbGlzdC0+bnJfaGVhZGVyX2xpbmVzIDogMDsKIAlicm93c2VyLT5yb3dzID0gYnJvd3Nlci0+aGVpZ2h0IC0gaGVhZGVyX29mZnNldDsKIAkvKgogCSAqIFZlcmlmeSBpZiB3ZSB3ZXJlIGF0IHRoZSBsYXN0IGxpbmUgYW5kIHRoYXQgbGluZSBpc24ndApAQCAtOTksOCArMTAyLDExIEBACiAKIHN0YXRpYyB2b2lkIGhpc3RfYnJvd3Nlcl9fZ290b3JjKHN0cnVjdCBoaXN0X2Jyb3dzZXIgKmJyb3dzZXIsIGludCByb3csIGludCBjb2x1bW4pCiB7Ci0JdTE2IGhlYWRlcl9vZmZzZXQgPSBicm93c2VyLT5zaG93X2hlYWRlcnMgPyAxIDogMDsKKwlzdHJ1Y3QgaGlzdHMgKmhpc3RzID0gYnJvd3Nlci0+aGlzdHM7CisJc3RydWN0IHBlcmZfaHBwX2xpc3QgKmhwcF9saXN0ID0gaGlzdHMtPmhwcF9saXN0OworCXUxNiBoZWFkZXJfb2Zmc2V0OwogCisJaGVhZGVyX29mZnNldCA9IGJyb3dzZXItPnNob3dfaGVhZGVycyA/IGhwcF9saXN0LT5ucl9oZWFkZXJfbGluZXMgOiAwOwogCXVpX2Jyb3dzZXJfX2dvdG9yYygmYnJvd3Nlci0+Yiwgcm93ICsgaGVhZGVyX29mZnNldCwgY29sdW1uKTsKIH0KIApAQCAtMTA3NCw3ICsxMDgwLDcgQEAKIAlib29sIGN1cnJlbnRfZW50cnk7CiB9OwogCi1zdGF0aWMgaW50IF9faHBwX19zbHNtZ19jb2xvcl9wcmludGYoc3RydWN0IHBlcmZfaHBwICpocHAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoraW50IF9faHBwX19zbHNtZ19jb2xvcl9wcmludGYoc3RydWN0IHBlcmZfaHBwICpocHAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewogCXN0cnVjdCBocHBfYXJnICphcmcgPSBocHAtPnB0cjsKIAlpbnQgcmV0LCBsZW47CkBAIC0xMDkxLDcgKzEwOTcsNiBAQAogCXJldCA9IHNjbnByaW50ZihocHAtPmJ1ZiwgaHBwLT5zaXplLCBmbXQsIGxlbiwgcGVyY2VudCk7CiAJdWlfYnJvd3Nlcl9fcHJpbnRmKGFyZy0+YiwgIiVzIiwgaHBwLT5idWYpOwogCi0JYWR2YW5jZV9ocHAoaHBwLCByZXQpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE0OTYsNyArMTUwMSw5IEBACiAJcmV0dXJuIGhwcC0+c2l6ZSA8PSAwOwogfQogCi1zdGF0aWMgaW50IGhpc3RzX2Jyb3dzZXJfX3NjbnByaW50Zl9oZWFkZXJzKHN0cnVjdCBoaXN0X2Jyb3dzZXIgKmJyb3dzZXIsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCitzdGF0aWMgaW50CitoaXN0c19icm93c2VyX19zY25wcmludGZfaGVhZGVycyhzdHJ1Y3QgaGlzdF9icm93c2VyICpicm93c2VyLCBjaGFyICpidWYsCisJCQkJIHNpemVfdCBzaXplLCBpbnQgbGluZSkKIHsKIAlzdHJ1Y3QgaGlzdHMgKmhpc3RzID0gYnJvd3Nlci0+aGlzdHM7CiAJc3RydWN0IHBlcmZfaHBwIGR1bW15X2hwcCA9IHsKQEAgLTE1MDYsNiArMTUxMyw3IEBACiAJc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10OwogCXNpemVfdCByZXQgPSAwOwogCWludCBjb2x1bW4gPSAwOworCWludCBzcGFuID0gMDsKIAogCWlmIChzeW1ib2xfY29uZi51c2VfY2FsbGNoYWluKSB7CiAJCXJldCA9IHNjbnByaW50ZihidWYsIHNpemUsICIgICIpOwpAQCAtMTUxNywxMCArMTUyNSwxMyBAQAogCQlpZiAocGVyZl9ocHBfX3Nob3VsZF9za2lwKGZtdCwgaGlzdHMpICB8fCBjb2x1bW4rKyA8IGJyb3dzZXItPmIuaG9yaXpfc2Nyb2xsKQogCQkJY29udGludWU7CiAKLQkJcmV0ID0gZm10LT5oZWFkZXIoZm10LCAmZHVtbXlfaHBwLCBoaXN0cyk7CisJCXJldCA9IGZtdC0+aGVhZGVyKGZtdCwgJmR1bW15X2hwcCwgaGlzdHMsIGxpbmUsICZzcGFuKTsKIAkJaWYgKGFkdmFuY2VfaHBwX2NoZWNrKCZkdW1teV9ocHAsIHJldCkpCiAJCQlicmVhazsKIAorCQlpZiAoc3BhbikKKwkJCWNvbnRpbnVlOworCiAJCXJldCA9IHNjbnByaW50ZihkdW1teV9ocHAuYnVmLCBkdW1teV9ocHAuc2l6ZSwgIiAgIik7CiAJCWlmIChhZHZhbmNlX2hwcF9jaGVjaygmZHVtbXlfaHBwLCByZXQpKQogCQkJYnJlYWs7CkBAIC0xNTU0LDcgKzE1NjUsNyBAQAogCQlpZiAoY29sdW1uKysgPCBicm93c2VyLT5iLmhvcml6X3Njcm9sbCkKIAkJCWNvbnRpbnVlOwogCi0JCXJldCA9IGZtdC0+aGVhZGVyKGZtdCwgJmR1bW15X2hwcCwgaGlzdHMpOworCQlyZXQgPSBmbXQtPmhlYWRlcihmbXQsICZkdW1teV9ocHAsIGhpc3RzLCAwLCBOVUxMKTsKIAkJaWYgKGFkdmFuY2VfaHBwX2NoZWNrKCZkdW1teV9ocHAsIHJldCkpCiAJCQlicmVhazsKIApAQCAtMTU5MSw3ICsxNjAyLDcgQEAKIAkJCX0KIAkJCWZpcnN0X2NvbCA9IGZhbHNlOwogCi0JCQlyZXQgPSBmbXQtPmhlYWRlcihmbXQsICZkdW1teV9ocHAsIGhpc3RzKTsKKwkJCXJldCA9IGZtdC0+aGVhZGVyKGZtdCwgJmR1bW15X2hwcCwgaGlzdHMsIDAsIE5VTEwpOwogCQkJZHVtbXlfaHBwLmJ1ZltyZXRdID0gJ1wwJzsKIAogCQkJc3RhcnQgPSB0cmltKGR1bW15X2hwcC5idWYpOwpAQCAtMTYyMiwxNCArMTYzMywyMSBAQAogCiBzdGF0aWMgdm9pZCBoaXN0c19icm93c2VyX19oZWFkZXJzKHN0cnVjdCBoaXN0X2Jyb3dzZXIgKmJyb3dzZXIpCiB7Ci0JY2hhciBoZWFkZXJzWzEwMjRdOworCXN0cnVjdCBoaXN0cyAqaGlzdHMgPSBicm93c2VyLT5oaXN0czsKKwlzdHJ1Y3QgcGVyZl9ocHBfbGlzdCAqaHBwX2xpc3QgPSBoaXN0cy0+aHBwX2xpc3Q7CiAKLQloaXN0c19icm93c2VyX19zY25wcmludGZfaGVhZGVycyhicm93c2VyLCBoZWFkZXJzLAotCQkJCQkgc2l6ZW9mKGhlYWRlcnMpKTsKKwlpbnQgbGluZTsKIAotCXVpX2Jyb3dzZXJfX2dvdG9yYygmYnJvd3Nlci0+YiwgMCwgMCk7Ci0JdWlfYnJvd3Nlcl9fc2V0X2NvbG9yKCZicm93c2VyLT5iLCBIRV9DT0xPUlNFVF9ST09UKTsKLQl1aV9icm93c2VyX193cml0ZV9uc3RyaW5nKCZicm93c2VyLT5iLCBoZWFkZXJzLCBicm93c2VyLT5iLndpZHRoICsgMSk7CisJZm9yIChsaW5lID0gMDsgbGluZSA8IGhwcF9saXN0LT5ucl9oZWFkZXJfbGluZXM7IGxpbmUrKykgeworCQljaGFyIGhlYWRlcnNbMTAyNF07CisKKwkJaGlzdHNfYnJvd3Nlcl9fc2NucHJpbnRmX2hlYWRlcnMoYnJvd3NlciwgaGVhZGVycywKKwkJCQkJCSBzaXplb2YoaGVhZGVycyksIGxpbmUpOworCisJCXVpX2Jyb3dzZXJfX2dvdG9yYygmYnJvd3Nlci0+YiwgbGluZSwgMCk7CisJCXVpX2Jyb3dzZXJfX3NldF9jb2xvcigmYnJvd3Nlci0+YiwgSEVfQ09MT1JTRVRfUk9PVCk7CisJCXVpX2Jyb3dzZXJfX3dyaXRlX25zdHJpbmcoJmJyb3dzZXItPmIsIGhlYWRlcnMsIGJyb3dzZXItPmIud2lkdGggKyAxKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGhpc3RfYnJvd3Nlcl9fc2hvd19oZWFkZXJzKHN0cnVjdCBoaXN0X2Jyb3dzZXIgKmJyb3dzZXIpCkBAIC0xNjU2LDEwICsxNjc0LDEzIEBACiAJdTE2IGhlYWRlcl9vZmZzZXQgPSAwOwogCXN0cnVjdCByYl9ub2RlICpuZDsKIAlzdHJ1Y3QgaGlzdF9icm93c2VyICpoYiA9IGNvbnRhaW5lcl9vZihicm93c2VyLCBzdHJ1Y3QgaGlzdF9icm93c2VyLCBiKTsKKwlzdHJ1Y3QgaGlzdHMgKmhpc3RzID0gaGItPmhpc3RzOwogCiAJaWYgKGhiLT5zaG93X2hlYWRlcnMpIHsKKwkJc3RydWN0IHBlcmZfaHBwX2xpc3QgKmhwcF9saXN0ID0gaGlzdHMtPmhwcF9saXN0OworCiAJCWhpc3RfYnJvd3Nlcl9fc2hvd19oZWFkZXJzKGhiKTsKLQkJaGVhZGVyX29mZnNldCA9IDE7CisJCWhlYWRlcl9vZmZzZXQgPSBocHBfbGlzdC0+bnJfaGVhZGVyX2xpbmVzOwogCX0KIAogCXVpX2Jyb3dzZXJfX2hpc3RzX2luaXRfdG9wKGJyb3dzZXIpOwpAQCAtMjA1NCwxMCArMjA3NSwxMCBAQAogCWJyb3dzZXItPmIudXNlX25hdmtleXByZXNzZWQJPSB0cnVlOwogCWJyb3dzZXItPnNob3dfaGVhZGVycwkJPSBzeW1ib2xfY29uZi5zaG93X2hpc3RfaGVhZGVyczsKIAotCWhpc3RzX19mb3JfZWFjaF9mb3JtYXQoaGlzdHMsIGZtdCkgewotCQlwZXJmX2hwcF9fcmVzZXRfd2lkdGgoZm10LCBoaXN0cyk7CisJaGlzdHNfX2Zvcl9lYWNoX2Zvcm1hdChoaXN0cywgZm10KQogCQkrK2Jyb3dzZXItPmIuY29sdW1uczsKLQl9CisKKwloaXN0c19fcmVzZXRfY29sdW1uX3dpZHRoKGhpc3RzKTsKIH0KIAogc3RydWN0IGhpc3RfYnJvd3NlciAqaGlzdF9icm93c2VyX19uZXcoc3RydWN0IGhpc3RzICpoaXN0cykKQEAgLTI0MTgsOCArMjQzOSw2IEBACiAJCWJyb3dzZXItPmhpc3RzLT5kc29fZmlsdGVyID0gTlVMTDsKIAkJdWlfaGVscGxpbmVfX3BvcCgpOwogCX0gZWxzZSB7Ci0JCWlmIChtYXAgPT0gTlVMTCkKLQkJCXJldHVybiAwOwogCQl1aV9oZWxwbGluZV9fZnB1c2goIlRvIHpvb20gb3V0IHByZXNzIEVTQyBvciBFTlRFUiArIFwiWm9vbSBvdXQgb2YgJXMgRFNPXCIiLAogCQkJCSAgIF9fbWFwX19pc19rZXJuZWwobWFwKSA/ICJ0aGUgS2VybmVsIiA6IG1hcC0+ZHNvLT5zaG9ydF9uYW1lKTsKIAkJYnJvd3Nlci0+aGlzdHMtPmRzb19maWx0ZXIgPSBtYXAtPmRzbzsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdWkvYnJvd3NlcnMvbWFwLmMgYi90b29scy9wZXJmL3VpL2Jyb3dzZXJzL21hcC5jCmluZGV4IDgwOTEyNzcuLjk4YTM0NjYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdWkvYnJvd3NlcnMvbWFwLmMKKysrIGIvdG9vbHMvcGVyZi91aS9icm93c2Vycy9tYXAuYwpAQCAtNTIsOSArNTIsOSBAQAogCiAJaWYgKHRhcmdldFswXSA9PSAnMCcgJiYgdG9sb3dlcih0YXJnZXRbMV0pID09ICd4JykgewogCQl1NjQgYWRkciA9IHN0cnRvdWxsKHRhcmdldCwgTlVMTCwgMTYpOwotCQlzeW0gPSBtYXBfX2ZpbmRfc3ltYm9sKGJyb3dzZXItPm1hcCwgYWRkciwgTlVMTCk7CisJCXN5bSA9IG1hcF9fZmluZF9zeW1ib2woYnJvd3Nlci0+bWFwLCBhZGRyKTsKIAl9IGVsc2UKLQkJc3ltID0gbWFwX19maW5kX3N5bWJvbF9ieV9uYW1lKGJyb3dzZXItPm1hcCwgdGFyZ2V0LCBOVUxMKTsKKwkJc3ltID0gbWFwX19maW5kX3N5bWJvbF9ieV9uYW1lKGJyb3dzZXItPm1hcCwgdGFyZ2V0KTsKIAogCWlmIChzeW0gIT0gTlVMTCkgewogCQl1MzIgKmlkeCA9IHN5bWJvbF9fYnJvd3Nlcl9pbmRleChzeW0pOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91aS9ndGsvaGlzdHMuYyBiL3Rvb2xzL3BlcmYvdWkvZ3RrL2hpc3RzLmMKaW5kZXggYzVmMzY3Ny4uYTRmMDJkZSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91aS9ndGsvaGlzdHMuYworKysgYi90b29scy9wZXJmL3VpL2d0ay9oaXN0cy5jCkBAIC01NDksNyArNTQ5LDcgQEAKIAkJCQlzdHJjYXQoYnVmLCAiKyIpOwogCQkJZmlyc3RfY29sID0gZmFsc2U7CiAKLQkJCWZtdC0+aGVhZGVyKGZtdCwgJmhwcCwgaGlzdHMpOworCQkJZm10LT5oZWFkZXIoZm10LCAmaHBwLCBoaXN0cywgMCwgTlVMTCk7CiAJCQlzdHJjYXQoYnVmLCBsdHJpbShydHJpbShocHAuYnVmKSkpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91aS9oaXN0LmMgYi90b29scy9wZXJmL3VpL2hpc3QuYwppbmRleCA0Mjc0OTY5Li4zNzM4ODM5IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3VpL2hpc3QuYworKysgYi90b29scy9wZXJmL3VpL2hpc3QuYwpAQCAtMjMwLDEzICsyMzAsMTQgQEAKIH0KIAogc3RhdGljIGludCBocHBfX2hlYWRlcl9mbihzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQsIHN0cnVjdCBwZXJmX2hwcCAqaHBwLAotCQkJICBzdHJ1Y3QgaGlzdHMgKmhpc3RzKQorCQkJICBzdHJ1Y3QgaGlzdHMgKmhpc3RzLCBpbnQgbGluZSBfX21heWJlX3VudXNlZCwKKwkJCSAgaW50ICpzcGFuIF9fbWF5YmVfdW51c2VkKQogewogCWludCBsZW4gPSBocHBfX3dpZHRoX2ZuKGZtdCwgaHBwLCBoaXN0cyk7CiAJcmV0dXJuIHNjbnByaW50ZihocHAtPmJ1ZiwgaHBwLT5zaXplLCAiJSpzIiwgbGVuLCBmbXQtPm5hbWUpOwogfQogCi1zdGF0aWMgaW50IGhwcF9jb2xvcl9zY25wcmludGYoc3RydWN0IHBlcmZfaHBwICpocHAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoraW50IGhwcF9jb2xvcl9zY25wcmludGYoc3RydWN0IHBlcmZfaHBwICpocHAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewogCXZhX2xpc3QgYXJnczsKIAlzc2l6ZV90IHNzaXplID0gaHBwLT5zaXplOwpAQCAtNDQxLDYgKzQ0Miw3IEBACiBzdHJ1Y3QgcGVyZl9ocHBfbGlzdCBwZXJmX2hwcF9saXN0ID0gewogCS5maWVsZHMJPSBMSVNUX0hFQURfSU5JVChwZXJmX2hwcF9saXN0LmZpZWxkcyksCiAJLnNvcnRzCT0gTElTVF9IRUFEX0lOSVQocGVyZl9ocHBfbGlzdC5zb3J0cyksCisJLm5yX2hlYWRlcl9saW5lcyA9IDEsCiB9OwogCiAjdW5kZWYgSFBQX19DT0xPUl9QUklOVF9GTlMKQEAgLTY5Nyw2ICs2OTksMjEgQEAKIAl9CiB9CiAKK3ZvaWQgaGlzdHNfX3Jlc2V0X2NvbHVtbl93aWR0aChzdHJ1Y3QgaGlzdHMgKmhpc3RzKQoreworCXN0cnVjdCBwZXJmX2hwcF9mbXQgKmZtdDsKKwlzdHJ1Y3QgcGVyZl9ocHBfbGlzdF9ub2RlICpub2RlOworCisJaGlzdHNfX2Zvcl9lYWNoX2Zvcm1hdChoaXN0cywgZm10KQorCQlwZXJmX2hwcF9fcmVzZXRfd2lkdGgoZm10LCBoaXN0cyk7CisKKwkvKiBoaWVyYXJjaHkgZW50cmllcyBoYXZlIHRoZWlyIG93biBocHAgbGlzdCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkobm9kZSwgJmhpc3RzLT5ocHBfZm9ybWF0cywgbGlzdCkgeworCQlwZXJmX2hwcF9saXN0X19mb3JfZWFjaF9mb3JtYXQoJm5vZGUtPmhwcCwgZm10KQorCQkJcGVyZl9ocHBfX3Jlc2V0X3dpZHRoKGZtdCwgaGlzdHMpOworCX0KK30KKwogdm9pZCBwZXJmX2hwcF9fc2V0X3VzZXJfd2lkdGgoY29uc3QgY2hhciAqd2lkdGhfbGlzdF9zdHIpCiB7CiAJc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10OwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91aS9zdGRpby9oaXN0LmMgYi90b29scy9wZXJmL3VpL3N0ZGlvL2hpc3QuYwppbmRleCBmMDRhNjMxLi44OWQ4NDQxIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3VpL3N0ZGlvL2hpc3QuYworKysgYi90b29scy9wZXJmL3VpL3N0ZGlvL2hpc3QuYwpAQCAtMzczLDcgKzM3Myw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaGlzdF9lbnRyeV9fc25wcmludGYoc3RydWN0IGhpc3RfZW50cnkgKmhlLCBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCkKK2ludCBfX2hpc3RfZW50cnlfX3NucHJpbnRmKHN0cnVjdCBoaXN0X2VudHJ5ICpoZSwgc3RydWN0IHBlcmZfaHBwICpocHAsCisJCQkgICBzdHJ1Y3QgcGVyZl9ocHBfbGlzdCAqaHBwX2xpc3QpCiB7CiAJY29uc3QgY2hhciAqc2VwID0gc3ltYm9sX2NvbmYuZmllbGRfc2VwOwogCXN0cnVjdCBwZXJmX2hwcF9mbXQgKmZtdDsKQEAgLTM4NCw3ICszODUsNyBAQAogCWlmIChzeW1ib2xfY29uZi5leGNsdWRlX290aGVyICYmICFoZS0+cGFyZW50KQogCQlyZXR1cm4gMDsKIAotCWhpc3RzX19mb3JfZWFjaF9mb3JtYXQoaGUtPmhpc3RzLCBmbXQpIHsKKwlwZXJmX2hwcF9saXN0X19mb3JfZWFjaF9mb3JtYXQoaHBwX2xpc3QsIGZtdCkgewogCQlpZiAocGVyZl9ocHBfX3Nob3VsZF9za2lwKGZtdCwgaGUtPmhpc3RzKSkKIAkJCWNvbnRpbnVlOwogCkBAIC00MTAsNiArNDExLDExIEBACiAJcmV0dXJuIGhwcC0+YnVmIC0gc3RhcnQ7CiB9CiAKK3N0YXRpYyBpbnQgaGlzdF9lbnRyeV9fc25wcmludGYoc3RydWN0IGhpc3RfZW50cnkgKmhlLCBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCkKK3sKKwlyZXR1cm4gX19oaXN0X2VudHJ5X19zbnByaW50ZihoZSwgaHBwLCBoZS0+aGlzdHMtPmhwcF9saXN0KTsKK30KKwogc3RhdGljIGludCBoaXN0X2VudHJ5X19oaWVyYXJjaHlfZnByaW50ZihzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUsCiAJCQkJCSBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwKIAkJCQkJIHN0cnVjdCBoaXN0cyAqaGlzdHMsCkBAIC01MjgsOCArNTM0LDggQEAKIAlyZXR1cm4gZnByaW50ZihmcCwgIiUtLipzIiwgKGluZGVudCAtIDIpICogSElFUkFSQ0hZX0lOREVOVCwgbGluZSk7CiB9CiAKLXN0YXRpYyBpbnQgcHJpbnRfaGllcmFyY2h5X2hlYWRlcihzdHJ1Y3QgaGlzdHMgKmhpc3RzLCBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwKLQkJCQkgIGNvbnN0IGNoYXIgKnNlcCwgRklMRSAqZnApCitzdGF0aWMgaW50IGhpc3RzX19mcHJpbnRmX2hpZXJhcmNoeV9oZWFkZXJzKHN0cnVjdCBoaXN0cyAqaGlzdHMsCisJCQkJCSAgICBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwgRklMRSAqZnApCiB7CiAJYm9vbCBmaXJzdF9ub2RlLCBmaXJzdF9jb2w7CiAJaW50IGluZGVudDsKQEAgLTUzOCw2ICs1NDQsNyBAQAogCXVuc2lnbmVkIGhlYWRlcl93aWR0aCA9IDA7CiAJc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10OwogCXN0cnVjdCBwZXJmX2hwcF9saXN0X25vZGUgKmZtdF9ub2RlOworCWNvbnN0IGNoYXIgKnNlcCA9IHN5bWJvbF9jb25mLmZpZWxkX3NlcDsKIAogCWluZGVudCA9IGhpc3RzLT5ucl9ocHBfbm9kZTsKIApAQCAtNTQ5LDcgKzU1Niw3IEBACiAJCQkJICAgIHN0cnVjdCBwZXJmX2hwcF9saXN0X25vZGUsIGxpc3QpOwogCiAJcGVyZl9ocHBfbGlzdF9fZm9yX2VhY2hfZm9ybWF0KCZmbXRfbm9kZS0+aHBwLCBmbXQpIHsKLQkJZm10LT5oZWFkZXIoZm10LCBocHAsIGhpc3RzKTsKKwkJZm10LT5oZWFkZXIoZm10LCBocHAsIGhpc3RzLCAwLCBOVUxMKTsKIAkJZnByaW50ZihmcCwgIiVzJXMiLCBocHAtPmJ1Ziwgc2VwID86ICIgICIpOwogCX0KIApAQCAtNTY5LDcgKzU3Niw3IEBACiAJCQkJaGVhZGVyX3dpZHRoICs9IGZwcmludGYoZnAsICIrIik7CiAJCQlmaXJzdF9jb2wgPSBmYWxzZTsKIAotCQkJZm10LT5oZWFkZXIoZm10LCBocHAsIGhpc3RzKTsKKwkJCWZtdC0+aGVhZGVyKGZtdCwgaHBwLCBoaXN0cywgMCwgTlVMTCk7CiAKIAkJCWhlYWRlcl93aWR0aCArPSBmcHJpbnRmKGZwLCAiJXMiLCB0cmltKGhwcC0+YnVmKSk7CiAJCX0KQEAgLTYyMywyMCArNjMwLDI4IEBACiAJcmV0dXJuIDI7CiB9CiAKLXN0YXRpYyBpbnQKLWhpc3RzX19mcHJpbnRmX2hpZXJhcmNoeV9oZWFkZXJzKHN0cnVjdCBoaXN0cyAqaGlzdHMsCi0JCQkJIHN0cnVjdCBwZXJmX2hwcCAqaHBwLAotCQkJCSBGSUxFICpmcCkKK3N0YXRpYyB2b2lkIGZwcmludGZfbGluZShzdHJ1Y3QgaGlzdHMgKmhpc3RzLCBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwKKwkJCSBpbnQgbGluZSwgRklMRSAqZnApCiB7Ci0Jc3RydWN0IHBlcmZfaHBwX2xpc3Rfbm9kZSAqZm10X25vZGU7CiAJc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10OworCWNvbnN0IGNoYXIgKnNlcCA9IHN5bWJvbF9jb25mLmZpZWxkX3NlcDsKKwlib29sIGZpcnN0ID0gdHJ1ZTsKKwlpbnQgc3BhbiA9IDA7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZtdF9ub2RlLCAmaGlzdHMtPmhwcF9mb3JtYXRzLCBsaXN0KSB7Ci0JCXBlcmZfaHBwX2xpc3RfX2Zvcl9lYWNoX2Zvcm1hdCgmZm10X25vZGUtPmhwcCwgZm10KQotCQkJcGVyZl9ocHBfX3Jlc2V0X3dpZHRoKGZtdCwgaGlzdHMpOworCWhpc3RzX19mb3JfZWFjaF9mb3JtYXQoaGlzdHMsIGZtdCkgeworCQlpZiAocGVyZl9ocHBfX3Nob3VsZF9za2lwKGZtdCwgaGlzdHMpKQorCQkJY29udGludWU7CisKKwkJaWYgKCFmaXJzdCAmJiAhc3BhbikKKwkJCWZwcmludGYoZnAsICIlcyIsIHNlcCA/OiAiICAiKTsKKwkJZWxzZQorCQkJZmlyc3QgPSBmYWxzZTsKKworCQlmbXQtPmhlYWRlcihmbXQsIGhwcCwgaGlzdHMsIGxpbmUsICZzcGFuKTsKKworCQlpZiAoIXNwYW4pCisJCQlmcHJpbnRmKGZwLCAiJXMiLCBocHAtPmJ1Zik7CiAJfQotCi0JcmV0dXJuIHByaW50X2hpZXJhcmNoeV9oZWFkZXIoaGlzdHMsIGhwcCwgc3ltYm9sX2NvbmYuZmllbGRfc2VwLCBmcCk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTY0NCwyOCArNjU5LDIzIEBACiAJCQkJc3RydWN0IHBlcmZfaHBwICpocHAsCiAJCQkJRklMRSAqZnApCiB7CisJc3RydWN0IHBlcmZfaHBwX2xpc3QgKmhwcF9saXN0ID0gaGlzdHMtPmhwcF9saXN0OwogCXN0cnVjdCBwZXJmX2hwcF9mbXQgKmZtdDsKIAl1bnNpZ25lZCBpbnQgd2lkdGg7CiAJY29uc3QgY2hhciAqc2VwID0gc3ltYm9sX2NvbmYuZmllbGRfc2VwOwogCWJvb2wgZmlyc3QgPSB0cnVlOworCWludCBsaW5lOwogCi0JaGlzdHNfX2Zvcl9lYWNoX2Zvcm1hdChoaXN0cywgZm10KSB7Ci0JCWlmIChwZXJmX2hwcF9fc2hvdWxkX3NraXAoZm10LCBoaXN0cykpCi0JCQljb250aW51ZTsKLQotCQlpZiAoIWZpcnN0KQotCQkJZnByaW50ZihmcCwgIiVzIiwgc2VwID86ICIgICIpOwotCQllbHNlCi0JCQlmaXJzdCA9IGZhbHNlOwotCi0JCWZtdC0+aGVhZGVyKGZtdCwgaHBwLCBoaXN0cyk7Ci0JCWZwcmludGYoZnAsICIlcyIsIGhwcC0+YnVmKTsKKwlmb3IgKGxpbmUgPSAwOyBsaW5lIDwgaHBwX2xpc3QtPm5yX2hlYWRlcl9saW5lczsgbGluZSsrKSB7CisJCS8qIGZpcnN0ICMgaXMgZGlzcGxheWVkIG9uZSBsZXZlbCB1cCAqLworCQlpZiAobGluZSkKKwkJCWZwcmludGYoZnAsICIjICIpOworCQlmcHJpbnRmX2xpbmUoaGlzdHMsIGhwcCwgbGluZSwgZnApOworCQlmcHJpbnRmKGZwLCAiXG4iKTsKIAl9CiAKLQlmcHJpbnRmKGZwLCAiXG4iKTsKLQogCWlmIChzZXApCi0JCXJldHVybiAxOworCQlyZXR1cm4gaHBwX2xpc3QtPm5yX2hlYWRlcl9saW5lczsKIAogCWZpcnN0ID0gdHJ1ZTsKIApAQCAtNjg5LDEyICs2OTksMTIgQEAKIAogCWZwcmludGYoZnAsICJcbiIpOwogCWZwcmludGYoZnAsICIjXG4iKTsKLQlyZXR1cm4gMzsKKwlyZXR1cm4gaHBwX2xpc3QtPm5yX2hlYWRlcl9saW5lcyArIDI7CiB9CiAKLXN0YXRpYyBpbnQgaGlzdHNfX2ZwcmludGZfaGVhZGVycyhzdHJ1Y3QgaGlzdHMgKmhpc3RzLCBGSUxFICpmcCkKK2ludCBoaXN0c19fZnByaW50Zl9oZWFkZXJzKHN0cnVjdCBoaXN0cyAqaGlzdHMsIEZJTEUgKmZwKQogewotCWNoYXIgYmZbOTZdOworCWNoYXIgYmZbMTAyNF07CiAJc3RydWN0IHBlcmZfaHBwIGR1bW15X2hwcCA9IHsKIAkJLmJ1Zgk9IGJmLAogCQkuc2l6ZQk9IHNpemVvZihiZiksCkBAIC03MTMsNyArNzIzLDYgQEAKIAkJICAgICAgaW50IG1heF9jb2xzLCBmbG9hdCBtaW5fcGNudCwgRklMRSAqZnAsCiAJCSAgICAgIGJvb2wgdXNlX2NhbGxjaGFpbikKIHsKLQlzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQ7CiAJc3RydWN0IHJiX25vZGUgKm5kOwogCXNpemVfdCByZXQgPSAwOwogCWNvbnN0IGNoYXIgKnNlcCA9IHN5bWJvbF9jb25mLmZpZWxkX3NlcDsKQEAgLTcyNCw4ICs3MzMsNyBAQAogCiAJaW5pdF9yZW1faGl0cygpOwogCi0JaGlzdHNfX2Zvcl9lYWNoX2Zvcm1hdChoaXN0cywgZm10KQotCQlwZXJmX2hwcF9fcmVzZXRfd2lkdGgoZm10LCBoaXN0cyk7CisJaGlzdHNfX3Jlc2V0X2NvbHVtbl93aWR0aChoaXN0cyk7CiAKIAlpZiAoc3ltYm9sX2NvbmYuY29sX3dpZHRoX2xpc3Rfc3RyKQogCQlwZXJmX2hwcF9fc2V0X3VzZXJfd2lkdGgoc3ltYm9sX2NvbmYuY29sX3dpZHRoX2xpc3Rfc3RyKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9CdWlsZCBiL3Rvb2xzL3BlcmYvdXRpbC9CdWlsZAppbmRleCA5MWM1ZjZlLi5lYjYwZTYxIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvQnVpbGQKKysrIGIvdG9vbHMvcGVyZi91dGlsL0J1aWxkCkBAIC0xLDUgKzEsNiBAQAogbGlicGVyZi15ICs9IGFsaWFzLm8KIGxpYnBlcmYteSArPSBhbm5vdGF0ZS5vCitsaWJwZXJmLXkgKz0gYmxvY2stcmFuZ2UubwogbGlicGVyZi15ICs9IGJ1aWxkLWlkLm8KIGxpYnBlcmYteSArPSBjb25maWcubwogbGlicGVyZi15ICs9IGN0eXBlLm8KQEAgLTg1LDYgKzg2LDcgQEAKIGxpYnBlcmYteSArPSBoZWxwLXVua25vd24tY21kLm8KIGxpYnBlcmYteSArPSBtZW0tZXZlbnRzLm8KIGxpYnBlcmYteSArPSB2c3ByaW50Zi5vCitsaWJwZXJmLXkgKz0gZHJ2X2NvbmZpZ3MubwogCiBsaWJwZXJmLSQoQ09ORklHX0xJQkJQRikgKz0gYnBmLWxvYWRlci5vCiBsaWJwZXJmLSQoQ09ORklHX0JQRl9QUk9MT0dVRSkgKz0gYnBmLXByb2xvZ3VlLm8KQEAgLTk4LDYgKzEwMCw3IEBACiAKIGxpYnBlcmYtJChDT05GSUdfRFdBUkYpICs9IHByb2JlLWZpbmRlci5vCiBsaWJwZXJmLSQoQ09ORklHX0RXQVJGKSArPSBkd2FyZi1hdXgubworbGlicGVyZi0kKENPTkZJR19EV0FSRikgKz0gZHdhcmYtcmVncy5vCiAKIGxpYnBlcmYtJChDT05GSUdfTElCRFdfRFdBUkZfVU5XSU5EKSArPSB1bndpbmQtbGliZHcubwogbGlicGVyZi0kKENPTkZJR19MT0NBTF9MSUJVTldJTkQpICAgICs9IHVud2luZC1saWJ1bndpbmQtbG9jYWwubwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2Fubm90YXRlLmMgYi90b29scy9wZXJmL3V0aWwvYW5ub3RhdGUuYwppbmRleCA0MDI0ZDMwLi5hZWI1YTQ0IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvYW5ub3RhdGUuYworKysgYi90b29scy9wZXJmL3V0aWwvYW5ub3RhdGUuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAiYW5ub3RhdGUuaCIKICNpbmNsdWRlICJldnNlbC5oIgorI2luY2x1ZGUgImJsb2NrLXJhbmdlLmgiCiAjaW5jbHVkZSA8cmVnZXguaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CkBAIC01Myw3ICs1NCw3IEBACiAJcmV0dXJuIGluc19fcmF3X3NjbnByaW50ZihpbnMsIGJmLCBzaXplLCBvcHMpOwogfQogCi1zdGF0aWMgaW50IGNhbGxfX3BhcnNlKHN0cnVjdCBpbnNfb3BlcmFuZHMgKm9wcykKK3N0YXRpYyBpbnQgY2FsbF9fcGFyc2Uoc3RydWN0IGluc19vcGVyYW5kcyAqb3BzLCBzdHJ1Y3QgbWFwICptYXApCiB7CiAJY2hhciAqZW5kcHRyLCAqdG9rLCAqbmFtZTsKIApAQCAtODEsMTYgKzgyLDE2IEBACiAJcmV0dXJuIG9wcy0+dGFyZ2V0Lm5hbWUgPT0gTlVMTCA/IC0xIDogMDsKIAogaW5kaXJlY3RfY2FsbDoKLQl0b2sgPSBzdHJjaHIoZW5kcHRyLCAnKCcpOwotCWlmICh0b2sgIT0gTlVMTCkgewotCQlvcHMtPnRhcmdldC5hZGRyID0gMDsKKwl0b2sgPSBzdHJjaHIoZW5kcHRyLCAnKicpOworCWlmICh0b2sgPT0gTlVMTCkgeworCQlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBtYXBfX2ZpbmRfc3ltYm9sKG1hcCwgbWFwLT5tYXBfaXAobWFwLCBvcHMtPnRhcmdldC5hZGRyKSk7CisJCWlmIChzeW0gIT0gTlVMTCkKKwkJCW9wcy0+dGFyZ2V0Lm5hbWUgPSBzdHJkdXAoc3ltLT5uYW1lKTsKKwkJZWxzZQorCQkJb3BzLT50YXJnZXQuYWRkciA9IDA7CiAJCXJldHVybiAwOwogCX0KIAotCXRvayA9IHN0cmNocihlbmRwdHIsICcqJyk7Ci0JaWYgKHRvayA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0KIAlvcHMtPnRhcmdldC5hZGRyID0gc3RydG91bGwodG9rICsgMSwgTlVMTCwgMTYpOwogCXJldHVybiAwOwogfQpAQCAtMTE3LDcgKzExOCw3IEBACiAJcmV0dXJuIGlucy0+b3BzID09ICZjYWxsX29wczsKIH0KIAotc3RhdGljIGludCBqdW1wX19wYXJzZShzdHJ1Y3QgaW5zX29wZXJhbmRzICpvcHMpCitzdGF0aWMgaW50IGp1bXBfX3BhcnNlKHN0cnVjdCBpbnNfb3BlcmFuZHMgKm9wcywgc3RydWN0IG1hcCAqbWFwIF9fbWF5YmVfdW51c2VkKQogewogCWNvbnN0IGNoYXIgKnMgPSBzdHJjaHIob3BzLT5yYXcsICcrJyk7CiAKQEAgLTE3Miw3ICsxNzMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGxvY2tfX3BhcnNlKHN0cnVjdCBpbnNfb3BlcmFuZHMgKm9wcykKK3N0YXRpYyBpbnQgbG9ja19fcGFyc2Uoc3RydWN0IGluc19vcGVyYW5kcyAqb3BzLCBzdHJ1Y3QgbWFwICptYXApCiB7CiAJY2hhciAqbmFtZTsKIApAQCAtMTkzLDcgKzE5NCw3IEBACiAJCXJldHVybiAwOwogCiAJaWYgKG9wcy0+bG9ja2VkLmlucy0+b3BzLT5wYXJzZSAmJgotCSAgICBvcHMtPmxvY2tlZC5pbnMtPm9wcy0+cGFyc2Uob3BzLT5sb2NrZWQub3BzKSA8IDApCisJICAgIG9wcy0+bG9ja2VkLmlucy0+b3BzLT5wYXJzZShvcHMtPmxvY2tlZC5vcHMsIG1hcCkgPCAwKQogCQlnb3RvIG91dF9mcmVlX29wczsKIAogCXJldHVybiAwOwpAQCAtMjM2LDcgKzIzNyw3IEBACiAJLnNjbnByaW50ZiA9IGxvY2tfX3NjbnByaW50ZiwKIH07CiAKLXN0YXRpYyBpbnQgbW92X19wYXJzZShzdHJ1Y3QgaW5zX29wZXJhbmRzICpvcHMpCitzdGF0aWMgaW50IG1vdl9fcGFyc2Uoc3RydWN0IGluc19vcGVyYW5kcyAqb3BzLCBzdHJ1Y3QgbWFwICptYXAgX19tYXliZV91bnVzZWQpCiB7CiAJY2hhciAqcyA9IHN0cmNocihvcHMtPnJhdywgJywnKSwgKnRhcmdldCwgKmNvbW1lbnQsIHByZXY7CiAKQEAgLTMwMyw3ICszMDQsNyBAQAogCS5zY25wcmludGYgPSBtb3ZfX3NjbnByaW50ZiwKIH07CiAKLXN0YXRpYyBpbnQgZGVjX19wYXJzZShzdHJ1Y3QgaW5zX29wZXJhbmRzICpvcHMpCitzdGF0aWMgaW50IGRlY19fcGFyc2Uoc3RydWN0IGluc19vcGVyYW5kcyAqb3BzLCBzdHJ1Y3QgbWFwICptYXAgX19tYXliZV91bnVzZWQpCiB7CiAJY2hhciAqdGFyZ2V0LCAqY29tbWVudCwgKnMsIHByZXY7CiAKQEAgLTQ5MSwxMyArNDkyLDYgQEAKIAlyZXR1cm4gYnNlYXJjaChuYW1lLCBpbnN0cnVjdGlvbnMsIG5tZW1iLCBzaXplb2Yoc3RydWN0IGlucyksIGluc19fa2V5X2NtcCk7CiB9CiAKLWludCBzeW1ib2xfX2Fubm90YXRlX2luaXQoc3RydWN0IG1hcCAqbWFwIF9fbWF5YmVfdW51c2VkLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pCi17Ci0Jc3RydWN0IGFubm90YXRpb24gKm5vdGVzID0gc3ltYm9sX19hbm5vdGF0aW9uKHN5bSk7Ci0JcHRocmVhZF9tdXRleF9pbml0KCZub3Rlcy0+bG9jaywgTlVMTCk7Ci0JcmV0dXJuIDA7Ci19Ci0KIGludCBzeW1ib2xfX2FsbG9jX2hpc3Qoc3RydWN0IHN5bWJvbCAqc3ltKQogewogCXN0cnVjdCBhbm5vdGF0aW9uICpub3RlcyA9IHN5bWJvbF9fYW5ub3RhdGlvbihzeW0pOwpAQCAtNzE1LDcgKzcwOSw3IEBACiAJcmV0dXJuIHN5bWJvbF9faW5jX2FkZHJfc2FtcGxlcyhoZS0+bXMuc3ltLCBoZS0+bXMubWFwLCBldmlkeCwgaXApOwogfQogCi1zdGF0aWMgdm9pZCBkaXNhc21fbGluZV9faW5pdF9pbnMoc3RydWN0IGRpc2FzbV9saW5lICpkbCkKK3N0YXRpYyB2b2lkIGRpc2FzbV9saW5lX19pbml0X2lucyhzdHJ1Y3QgZGlzYXNtX2xpbmUgKmRsLCBzdHJ1Y3QgbWFwICptYXApCiB7CiAJZGwtPmlucyA9IGluc19fZmluZChkbC0+bmFtZSk7CiAKQEAgLTcyNSw3ICs3MTksNyBAQAogCWlmICghZGwtPmlucy0+b3BzKQogCQlyZXR1cm47CiAKLQlpZiAoZGwtPmlucy0+b3BzLT5wYXJzZSAmJiBkbC0+aW5zLT5vcHMtPnBhcnNlKCZkbC0+b3BzKSA8IDApCisJaWYgKGRsLT5pbnMtPm9wcy0+cGFyc2UgJiYgZGwtPmlucy0+b3BzLT5wYXJzZSgmZGwtPm9wcywgbWFwKSA8IDApCiAJCWRsLT5pbnMgPSBOVUxMOwogfQogCkBAIC03NjcsNyArNzYxLDggQEAKIH0KIAogc3RhdGljIHN0cnVjdCBkaXNhc21fbGluZSAqZGlzYXNtX2xpbmVfX25ldyhzNjQgb2Zmc2V0LCBjaGFyICpsaW5lLAotCQkJCQlzaXplX3QgcHJpdnNpemUsIGludCBsaW5lX25yKQorCQkJCQkgICAgc2l6ZV90IHByaXZzaXplLCBpbnQgbGluZV9uciwKKwkJCQkJICAgIHN0cnVjdCBtYXAgKm1hcCkKIHsKIAlzdHJ1Y3QgZGlzYXNtX2xpbmUgKmRsID0gemFsbG9jKHNpemVvZigqZGwpICsgcHJpdnNpemUpOwogCkBAIC03ODIsNyArNzc3LDcgQEAKIAkJCWlmIChkaXNhc21fbGluZV9fcGFyc2UoZGwtPmxpbmUsICZkbC0+bmFtZSwgJmRsLT5vcHMucmF3KSA8IDApCiAJCQkJZ290byBvdXRfZnJlZV9saW5lOwogCi0JCQlkaXNhc21fbGluZV9faW5pdF9pbnMoZGwpOworCQkJZGlzYXNtX2xpbmVfX2luaXRfaW5zKGRsLCBtYXApOwogCQl9CiAJfQogCkBAIC04NjYsNiArODYxLDg5IEBACiAJcmV0dXJuIHBlcmNlbnQ7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICphbm5vdGF0ZV9fYWRkcmVzc19jb2xvcihzdHJ1Y3QgYmxvY2tfcmFuZ2UgKmJyKQoreworCWRvdWJsZSBjb3YgPSBibG9ja19yYW5nZV9fY292ZXJhZ2UoYnIpOworCisJaWYgKGNvdiA+PSAwKSB7CisJCS8qIG1hcmsgcmVkIGZvciA+NzUlIGNvdmVyYWdlICovCisJCWlmIChjb3YgPiAwLjc1KQorCQkJcmV0dXJuIFBFUkZfQ09MT1JfUkVEOworCisJCS8qIG1hcmsgZHVsbCBmb3IgPDElIGNvdmVyYWdlICovCisJCWlmIChjb3YgPCAwLjAxKQorCQkJcmV0dXJuIFBFUkZfQ09MT1JfTk9STUFMOworCX0KKworCXJldHVybiBQRVJGX0NPTE9SX01BR0VOVEE7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICphbm5vdGF0ZV9fYXNtX2NvbG9yKHN0cnVjdCBibG9ja19yYW5nZSAqYnIpCit7CisJZG91YmxlIGNvdiA9IGJsb2NrX3JhbmdlX19jb3ZlcmFnZShicik7CisKKwlpZiAoY292ID49IDApIHsKKwkJLyogbWFyayBkdWxsIGZvciA8MSUgY292ZXJhZ2UgKi8KKwkJaWYgKGNvdiA8IDAuMDEpCisJCQlyZXR1cm4gUEVSRl9DT0xPUl9OT1JNQUw7CisJfQorCisJcmV0dXJuIFBFUkZfQ09MT1JfQkxVRTsKK30KKworc3RhdGljIHZvaWQgYW5ub3RhdGVfX2JyYW5jaF9wcmludGYoc3RydWN0IGJsb2NrX3JhbmdlICpiciwgdTY0IGFkZHIpCit7CisJYm9vbCBlbWl0X2NvbW1lbnQgPSB0cnVlOworCisJaWYgKCFicikKKwkJcmV0dXJuOworCisjaWYgMQorCWlmIChici0+aXNfdGFyZ2V0ICYmIGJyLT5zdGFydCA9PSBhZGRyKSB7CisJCXN0cnVjdCBibG9ja19yYW5nZSAqYnJhbmNoID0gYnI7CisJCWRvdWJsZSBwOworCisJCS8qCisJCSAqIEZpbmQgbWF0Y2hpbmcgYnJhbmNoIHRvIG91ciB0YXJnZXQuCisJCSAqLworCQl3aGlsZSAoIWJyYW5jaC0+aXNfYnJhbmNoKQorCQkJYnJhbmNoID0gYmxvY2tfcmFuZ2VfX25leHQoYnJhbmNoKTsKKworCQlwID0gMTAwICooZG91YmxlKWJyLT5lbnRyeSAvIGJyYW5jaC0+Y292ZXJhZ2U7CisKKwkJaWYgKHAgPiAwLjEpIHsKKwkJCWlmIChlbWl0X2NvbW1lbnQpIHsKKwkJCQllbWl0X2NvbW1lbnQgPSBmYWxzZTsKKwkJCQlwcmludGYoIlx0IyIpOworCQkJfQorCisJCQkvKgorCQkJICogVGhlIHBlcmNlbnRhZ2Ugb2YgY292ZXJhZ2Ugam9pbmVkIGF0IHRoaXMgdGFyZ2V0IGluIHJlbGF0aW9uCisJCQkgKiB0byB0aGUgbmV4dCBicmFuY2guCisJCQkgKi8KKwkJCXByaW50ZigiICslLjJmJSUiLCBwKTsKKwkJfQorCX0KKyNlbmRpZgorCWlmIChici0+aXNfYnJhbmNoICYmIGJyLT5lbmQgPT0gYWRkcikgeworCQlkb3VibGUgcCA9IDEwMCooZG91YmxlKWJyLT50YWtlbiAvIGJyLT5jb3ZlcmFnZTsKKworCQlpZiAocCA+IDAuMSkgeworCQkJaWYgKGVtaXRfY29tbWVudCkgeworCQkJCWVtaXRfY29tbWVudCA9IGZhbHNlOworCQkJCXByaW50ZigiXHQjIik7CisJCQl9CisKKwkJCS8qCisJCQkgKiBUaGUgcGVyY2VudGFnZSBvZiBjb3ZlcmFnZSBsZWF2aW5nIGF0IHRoaXMgYnJhbmNoLCBhbmQKKwkJCSAqIGl0cyBwcmVkaWN0aW9uIHJhdGlvLgorCQkJICovCisJCQlwcmludGYoIiAtJS4yZiUlIChwOiUuMmYlJSkiLCBwLCAxMDAqKGRvdWJsZSlici0+cHJlZCAgLyBici0+dGFrZW4pOworCQl9CisJfQorfQorCisKIHN0YXRpYyBpbnQgZGlzYXNtX2xpbmVfX3ByaW50KHN0cnVjdCBkaXNhc21fbGluZSAqZGwsIHN0cnVjdCBzeW1ib2wgKnN5bSwgdTY0IHN0YXJ0LAogCQkgICAgICBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIHU2NCBsZW4sIGludCBtaW5fcGNudCwgaW50IHByaW50ZWQsCiAJCSAgICAgIGludCBtYXhfbGluZXMsIHN0cnVjdCBkaXNhc21fbGluZSAqcXVldWUpCkBAIC04ODUsNiArOTYzLDcgQEAKIAkJczY0IG9mZnNldCA9IGRsLT5vZmZzZXQ7CiAJCWNvbnN0IHU2NCBhZGRyID0gc3RhcnQgKyBvZmZzZXQ7CiAJCXN0cnVjdCBkaXNhc21fbGluZSAqbmV4dDsKKwkJc3RydWN0IGJsb2NrX3JhbmdlICpicjsKIAogCQluZXh0ID0gZGlzYXNtX19nZXRfbmV4dF9pcF9saW5lKCZub3Rlcy0+c3JjLT5zb3VyY2UsIGRsKTsKIApAQCAtOTU0LDggKzEwMzMsMTIgQEAKIAkJfQogCiAJCXByaW50ZigiIDoJIik7Ci0JCWNvbG9yX2ZwcmludGYoc3Rkb3V0LCBQRVJGX0NPTE9SX01BR0VOVEEsICIgICUiIFBSSXg2NCAiOiIsIGFkZHIpOwotCQljb2xvcl9mcHJpbnRmKHN0ZG91dCwgUEVSRl9DT0xPUl9CTFVFLCAiJXNcbiIsIGRsLT5saW5lKTsKKworCQliciA9IGJsb2NrX3JhbmdlX19maW5kKGFkZHIpOworCQljb2xvcl9mcHJpbnRmKHN0ZG91dCwgYW5ub3RhdGVfX2FkZHJlc3NfY29sb3IoYnIpLCAiICAlIiBQUkl4NjQgIjoiLCBhZGRyKTsKKwkJY29sb3JfZnByaW50ZihzdGRvdXQsIGFubm90YXRlX19hc21fY29sb3IoYnIpLCAiJXMiLCBkbC0+bGluZSk7CisJCWFubm90YXRlX19icmFuY2hfcHJpbnRmKGJyLCBhZGRyKTsKKwkJcHJpbnRmKCJcbiIpOwogCiAJCWlmIChwcGVyY2VudHMgIT0gJnBlcmNlbnQpCiAJCQlmcmVlKHBwZXJjZW50cyk7CkBAIC0xMDY2LDcgKzExNDksNyBAQAogCQkJcGFyc2VkX2xpbmUgPSB0bXAyICsgMTsKIAl9CiAKLQlkbCA9IGRpc2FzbV9saW5lX19uZXcob2Zmc2V0LCBwYXJzZWRfbGluZSwgcHJpdnNpemUsICpsaW5lX25yKTsKKwlkbCA9IGRpc2FzbV9saW5lX19uZXcob2Zmc2V0LCBwYXJzZWRfbGluZSwgcHJpdnNpemUsICpsaW5lX25yLCBtYXApOwogCWZyZWUobGluZSk7CiAJKCpsaW5lX25yKSsrOwogCkBAIC0xMDg0LDcgKzExNjcsNyBAQAogCQkJLmFkZHIgPSBkbC0+b3BzLnRhcmdldC5hZGRyLAogCQl9OwogCi0JCWlmICghbWFwX2dyb3Vwc19fZmluZF9hbXMoJnRhcmdldCwgTlVMTCkgJiYKKwkJaWYgKCFtYXBfZ3JvdXBzX19maW5kX2FtcygmdGFyZ2V0KSAmJgogCQkgICAgdGFyZ2V0LnN5bS0+c3RhcnQgPT0gdGFyZ2V0LmFsX2FkZHIpCiAJCQlkbC0+b3BzLnRhcmdldC5uYW1lID0gc3RyZHVwKHRhcmdldC5zeW0tPm5hbWUpOwogCX0KQEAgLTExNjIsMTQgKzEyNDUsNDYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBkc29fX2Rpc2Fzc2VtYmxlX2ZpbGVuYW1lKHN0cnVjdCBkc28gKmRzbywgY2hhciAqZmlsZW5hbWUsIHNpemVfdCBmaWxlbmFtZV9zaXplKQoreworCWNoYXIgbGlua25hbWVbUEFUSF9NQVhdOworCWNoYXIgKmJ1aWxkX2lkX2ZpbGVuYW1lOworCisJaWYgKGRzby0+c3ltdGFiX3R5cGUgPT0gRFNPX0JJTkFSWV9UWVBFX19LQUxMU1lNUyAmJgorCSAgICAhZHNvX19pc19rY29yZShkc28pKQorCQlyZXR1cm4gU1lNQk9MX0FOTk9UQVRFX0VSUk5PX19OT19WTUxJTlVYOworCisJYnVpbGRfaWRfZmlsZW5hbWUgPSBkc29fX2J1aWxkX2lkX2ZpbGVuYW1lKGRzbywgTlVMTCwgMCk7CisJaWYgKGJ1aWxkX2lkX2ZpbGVuYW1lKSB7CisJCV9fc3ltYm9sX19qb2luX3N5bWZzKGZpbGVuYW1lLCBmaWxlbmFtZV9zaXplLCBidWlsZF9pZF9maWxlbmFtZSk7CisJCWZyZWUoYnVpbGRfaWRfZmlsZW5hbWUpOworCX0gZWxzZSB7CisJCWlmIChkc28tPmhhc19idWlsZF9pZCkKKwkJCXJldHVybiBFTk9NRU07CisJCWdvdG8gZmFsbGJhY2s7CisJfQorCisJaWYgKGRzb19faXNfa2NvcmUoZHNvKSB8fAorCSAgICByZWFkbGluayhmaWxlbmFtZSwgbGlua25hbWUsIHNpemVvZihsaW5rbmFtZSkpIDwgMCB8fAorCSAgICBzdHJzdHIobGlua25hbWUsIERTT19fTkFNRV9LQUxMU1lNUykgfHwKKwkgICAgYWNjZXNzKGZpbGVuYW1lLCBSX09LKSkgeworZmFsbGJhY2s6CisJCS8qCisJCSAqIElmIHdlIGRvbid0IGhhdmUgYnVpbGQtaWRzIG9yIHRoZSBidWlsZC1pZCBmaWxlIGlzbid0IGluIHRoZQorCQkgKiBjYWNoZSwgb3IgaXMganVzdCBhIGthbGxzeW1zIGZpbGUsIHdlbGwsIGxldHMgaG9wZSB0aGF0IHRoaXMKKwkJICogRFNPIGlzIHRoZSBzYW1lIGFzIHdoZW4gJ3BlcmYgcmVjb3JkJyByYW4uCisJCSAqLworCQlfX3N5bWJvbF9fam9pbl9zeW1mcyhmaWxlbmFtZSwgZmlsZW5hbWVfc2l6ZSwgZHNvLT5sb25nX25hbWUpOworCX0KKworCXJldHVybiAwOworfQorCiBpbnQgc3ltYm9sX19kaXNhc3NlbWJsZShzdHJ1Y3Qgc3ltYm9sICpzeW0sIHN0cnVjdCBtYXAgKm1hcCwgc2l6ZV90IHByaXZzaXplKQogewogCXN0cnVjdCBkc28gKmRzbyA9IG1hcC0+ZHNvOwotCWNoYXIgKmZpbGVuYW1lID0gZHNvX19idWlsZF9pZF9maWxlbmFtZShkc28sIE5VTEwsIDApOwotCWJvb2wgZnJlZV9maWxlbmFtZSA9IHRydWU7CiAJY2hhciBjb21tYW5kW1BBVEhfTUFYICogMl07CiAJRklMRSAqZmlsZTsKLQlpbnQgZXJyID0gMDsKIAljaGFyIHN5bWZzX2ZpbGVuYW1lW1BBVEhfTUFYXTsKIAlzdHJ1Y3Qga2NvcmVfZXh0cmFjdCBrY2U7CiAJYm9vbCBkZWxldGVfZXh0cmFjdCA9IGZhbHNlOwpAQCAtMTE3NywzOCArMTI5MiwxMyBAQAogCWludCBsaW5lbm8gPSAwOwogCWludCBubGluZTsKIAlwaWRfdCBwaWQ7CisJaW50IGVyciA9IGRzb19fZGlzYXNzZW1ibGVfZmlsZW5hbWUoZHNvLCBzeW1mc19maWxlbmFtZSwgc2l6ZW9mKHN5bWZzX2ZpbGVuYW1lKSk7CiAKLQlpZiAoZmlsZW5hbWUpCi0JCXN5bWJvbF9fam9pbl9zeW1mcyhzeW1mc19maWxlbmFtZSwgZmlsZW5hbWUpOwotCi0JaWYgKGZpbGVuYW1lID09IE5VTEwpIHsKLQkJaWYgKGRzby0+aGFzX2J1aWxkX2lkKQotCQkJcmV0dXJuIEVOT01FTTsKLQkJZ290byBmYWxsYmFjazsKLQl9IGVsc2UgaWYgKGRzb19faXNfa2NvcmUoZHNvKSB8fAotCQkgICByZWFkbGluayhzeW1mc19maWxlbmFtZSwgY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpKSA8IDAgfHwKLQkJICAgc3Ryc3RyKGNvbW1hbmQsIERTT19fTkFNRV9LQUxMU1lNUykgfHwKLQkJICAgYWNjZXNzKHN5bWZzX2ZpbGVuYW1lLCBSX09LKSkgewotCQlmcmVlKGZpbGVuYW1lKTsKLWZhbGxiYWNrOgotCQkvKgotCQkgKiBJZiB3ZSBkb24ndCBoYXZlIGJ1aWxkLWlkcyBvciB0aGUgYnVpbGQtaWQgZmlsZSBpc24ndCBpbiB0aGUKLQkJICogY2FjaGUsIG9yIGlzIGp1c3QgYSBrYWxsc3ltcyBmaWxlLCB3ZWxsLCBsZXRzIGhvcGUgdGhhdCB0aGlzCi0JCSAqIERTTyBpcyB0aGUgc2FtZSBhcyB3aGVuICdwZXJmIHJlY29yZCcgcmFuLgotCQkgKi8KLQkJZmlsZW5hbWUgPSAoY2hhciAqKWRzby0+bG9uZ19uYW1lOwotCQlzeW1ib2xfX2pvaW5fc3ltZnMoc3ltZnNfZmlsZW5hbWUsIGZpbGVuYW1lKTsKLQkJZnJlZV9maWxlbmFtZSA9IGZhbHNlOwotCX0KLQotCWlmIChkc28tPnN5bXRhYl90eXBlID09IERTT19CSU5BUllfVFlQRV9fS0FMTFNZTVMgJiYKLQkgICAgIWRzb19faXNfa2NvcmUoZHNvKSkgewotCQllcnIgPSBTWU1CT0xfQU5OT1RBVEVfRVJSTk9fX05PX1ZNTElOVVg7Ci0JCWdvdG8gb3V0X2ZyZWVfZmlsZW5hbWU7Ci0JfQorCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlwcl9kZWJ1ZygiJXM6IGZpbGVuYW1lPSVzLCBzeW09JXMsIHN0YXJ0PSUjIiBQUkl4NjQgIiwgZW5kPSUjIiBQUkl4NjQgIlxuIiwgX19mdW5jX18sCi0JCSBmaWxlbmFtZSwgc3ltLT5uYW1lLCBtYXAtPnVubWFwX2lwKG1hcCwgc3ltLT5zdGFydCksCisJCSBzeW1mc19maWxlbmFtZSwgc3ltLT5uYW1lLCBtYXAtPnVubWFwX2lwKG1hcCwgc3ltLT5zdGFydCksCiAJCSBtYXAtPnVubWFwX2lwKG1hcCwgc3ltLT5lbmQpKTsKIAogCXByX2RlYnVnKCJhbm5vdGF0aW5nIFslcF0gJTMwcyA6IFslcF0gJTMwc1xuIiwKQEAgLTEyMjMsMTEgKzEzMTMsNiBAQAogCQkJZGVsZXRlX2V4dHJhY3QgPSB0cnVlOwogCQkJc3RybGNweShzeW1mc19maWxlbmFtZSwga2NlLmV4dHJhY3RfZmlsZW5hbWUsCiAJCQkJc2l6ZW9mKHN5bWZzX2ZpbGVuYW1lKSk7Ci0JCQlpZiAoZnJlZV9maWxlbmFtZSkgewotCQkJCWZyZWUoZmlsZW5hbWUpOwotCQkJCWZyZWVfZmlsZW5hbWUgPSBmYWxzZTsKLQkJCX0KLQkJCWZpbGVuYW1lID0gc3ltZnNfZmlsZW5hbWU7CiAJCX0KIAl9IGVsc2UgaWYgKGRzb19fbmVlZHNfZGVjb21wcmVzcyhkc28pKSB7CiAJCWNoYXIgdG1wW1BBVEhfTUFYXTsKQEAgLTEyMzYsMTQgKzEzMjEsMTQgQEAKIAkJYm9vbCByZXQ7CiAKIAkJaWYgKGttb2RfcGF0aF9fcGFyc2VfZXh0KCZtLCBzeW1mc19maWxlbmFtZSkpCi0JCQlnb3RvIG91dF9mcmVlX2ZpbGVuYW1lOworCQkJZ290byBvdXQ7CiAKIAkJc25wcmludGYodG1wLCBQQVRIX01BWCwgIi90bXAvcGVyZi1rbW9kLVhYWFhYWCIpOwogCiAJCWZkID0gbWtzdGVtcCh0bXApOwogCQlpZiAoZmQgPCAwKSB7CiAJCQlmcmVlKG0uZXh0KTsKLQkJCWdvdG8gb3V0X2ZyZWVfZmlsZW5hbWU7CisJCQlnb3RvIG91dDsKIAkJfQogCiAJCXJldCA9IGRlY29tcHJlc3NfdG9fZmlsZShtLmV4dCwgc3ltZnNfZmlsZW5hbWUsIGZkKTsKQEAgLTEyNTUsNyArMTM0MCw3IEBACiAJCWNsb3NlKGZkKTsKIAogCQlpZiAoIXJldCkKLQkJCWdvdG8gb3V0X2ZyZWVfZmlsZW5hbWU7CisJCQlnb3RvIG91dDsKIAogCQlzdHJjcHkoc3ltZnNfZmlsZW5hbWUsIHRtcCk7CiAJfQpAQCAtMTI3MSw3ICsxMzU2LDcgQEAKIAkJIG1hcF9fcmlwXzJvYmpkdW1wKG1hcCwgc3ltLT5lbmQpLAogCQkgc3ltYm9sX2NvbmYuYW5ub3RhdGVfYXNtX3JhdyA/ICIiIDogIi0tbm8tc2hvdy1yYXciLAogCQkgc3ltYm9sX2NvbmYuYW5ub3RhdGVfc3JjID8gIi1TIiA6ICIiLAotCQkgc3ltZnNfZmlsZW5hbWUsIGZpbGVuYW1lKTsKKwkJIHN5bWZzX2ZpbGVuYW1lLCBzeW1mc19maWxlbmFtZSk7CiAKIAlwcl9kZWJ1ZygiRXhlY3V0aW5nOiAlc1xuIiwgY29tbWFuZCk7CiAKQEAgLTEzMzMsMTEgKzE0MTgsMTAgQEAKIAogCWlmIChkc29fX25lZWRzX2RlY29tcHJlc3MoZHNvKSkKIAkJdW5saW5rKHN5bWZzX2ZpbGVuYW1lKTsKLW91dF9mcmVlX2ZpbGVuYW1lOgorCiAJaWYgKGRlbGV0ZV9leHRyYWN0KQogCQlrY29yZV9leHRyYWN0X19kZWxldGUoJmtjZSk7Ci0JaWYgKGZyZWVfZmlsZW5hbWUpCi0JCWZyZWUoZmlsZW5hbWUpOworb3V0OgogCXJldHVybiBlcnI7CiAKIG91dF9jbG9zZV9zdGRvdXQ6CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvYW5ub3RhdGUuaCBiL3Rvb2xzL3BlcmYvdXRpbC9hbm5vdGF0ZS5oCmluZGV4IGY2N2NjYjAuLjViYmNlYzEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9hbm5vdGF0ZS5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9hbm5vdGF0ZS5oCkBAIC0zNiw3ICszNiw3IEBACiAKIHN0cnVjdCBpbnNfb3BzIHsKIAl2b2lkICgqZnJlZSkoc3RydWN0IGluc19vcGVyYW5kcyAqb3BzKTsKLQlpbnQgKCpwYXJzZSkoc3RydWN0IGluc19vcGVyYW5kcyAqb3BzKTsKKwlpbnQgKCpwYXJzZSkoc3RydWN0IGluc19vcGVyYW5kcyAqb3BzLCBzdHJ1Y3QgbWFwICptYXApOwogCWludCAoKnNjbnByaW50Zikoc3RydWN0IGlucyAqaW5zLCBjaGFyICpiZiwgc2l6ZV90IHNpemUsCiAJCQkgc3RydWN0IGluc19vcGVyYW5kcyAqb3BzKTsKIH07CkBAIC0xMzAsNiArMTMwLDcgQEAKIAogc3RydWN0IGFubm90YXRpb24gewogCXB0aHJlYWRfbXV0ZXhfdAkJbG9jazsKKwl1NjQJCQltYXhfY292ZXJhZ2U7CiAJc3RydWN0IGFubm90YXRlZF9zb3VyY2UgKnNyYzsKIH07CiAKQEAgLTE3Nyw3ICsxNzgsNiBAQAogaW50IHN5bWJvbF9fc3RyZXJyb3JfZGlzYXNzZW1ibGUoc3RydWN0IHN5bWJvbCAqc3ltLCBzdHJ1Y3QgbWFwICptYXAsCiAJCQkJIGludCBlcnJudW0sIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zmxlbik7CiAKLWludCBzeW1ib2xfX2Fubm90YXRlX2luaXQoc3RydWN0IG1hcCAqbWFwLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pOwogaW50IHN5bWJvbF9fYW5ub3RhdGVfcHJpbnRmKHN0cnVjdCBzeW1ib2wgKnN5bSwgc3RydWN0IG1hcCAqbWFwLAogCQkJICAgIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgYm9vbCBmdWxsX3BhdGhzLAogCQkJICAgIGludCBtaW5fcGNudCwgaW50IG1heF9saW5lcywgaW50IGNvbnRleHQpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2F1eHRyYWNlLmMgYi90b29scy9wZXJmL3V0aWwvYXV4dHJhY2UuYwppbmRleCBjOTE2OTAxLi5jNWE2ZTBiMSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2F1eHRyYWNlLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2F1eHRyYWNlLmMKQEAgLTE2LDYgKzE2LDEwIEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgpAQCAtMzUsOSArMzksMTQgQEAKICNpbmNsdWRlICIuLi9wZXJmLmgiCiAjaW5jbHVkZSAidXRpbC5oIgogI2luY2x1ZGUgImV2bGlzdC5oIgorI2luY2x1ZGUgImRzby5oIgorI2luY2x1ZGUgIm1hcC5oIgorI2luY2x1ZGUgInBtdS5oIgorI2luY2x1ZGUgImV2c2VsLmgiCiAjaW5jbHVkZSAiY3B1bWFwLmgiCiAjaW5jbHVkZSAidGhyZWFkX21hcC5oIgogI2luY2x1ZGUgImFzbS9idWcuaCIKKyNpbmNsdWRlICJzeW1ib2wva2FsbHN5bXMuaCIKICNpbmNsdWRlICJhdXh0cmFjZS5oIgogCiAjaW5jbHVkZSA8bGludXgvaGFzaC5oPgpAQCAtODkyLDYgKzkwMSw3IEBACiAJCXJldHVybiBpbnRlbF9wdF9wcm9jZXNzX2F1eHRyYWNlX2luZm8oZXZlbnQsIHNlc3Npb24pOwogCWNhc2UgUEVSRl9BVVhUUkFDRV9JTlRFTF9CVFM6CiAJCXJldHVybiBpbnRlbF9idHNfcHJvY2Vzc19hdXh0cmFjZV9pbmZvKGV2ZW50LCBzZXNzaW9uKTsKKwljYXNlIFBFUkZfQVVYVFJBQ0VfQ1NfRVRNOgogCWNhc2UgUEVSRl9BVVhUUkFDRV9VTktOT1dOOgogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTM5OCwzICsxNDA4LDczMSBAQAogCiAJcmV0dXJuIE5VTEw7CiB9CisKK3N0YXRpYyB2b2lkIGFkZHJfZmlsdGVyX19mcmVlX3N0cihzdHJ1Y3QgYWRkcl9maWx0ZXIgKmZpbHQpCit7CisJZnJlZShmaWx0LT5zdHIpOworCWZpbHQtPmFjdGlvbiAgID0gTlVMTDsKKwlmaWx0LT5zeW1fZnJvbSA9IE5VTEw7CisJZmlsdC0+c3ltX3RvICAgPSBOVUxMOworCWZpbHQtPmZpbGVuYW1lID0gTlVMTDsKKwlmaWx0LT5zdHIgICAgICA9IE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWRkcl9maWx0ZXIgKmFkZHJfZmlsdGVyX19uZXcodm9pZCkKK3sKKwlzdHJ1Y3QgYWRkcl9maWx0ZXIgKmZpbHQgPSB6YWxsb2Moc2l6ZW9mKCpmaWx0KSk7CisKKwlpZiAoZmlsdCkKKwkJSU5JVF9MSVNUX0hFQUQoJmZpbHQtPmxpc3QpOworCisJcmV0dXJuIGZpbHQ7Cit9CisKK3N0YXRpYyB2b2lkIGFkZHJfZmlsdGVyX19mcmVlKHN0cnVjdCBhZGRyX2ZpbHRlciAqZmlsdCkKK3sKKwlpZiAoZmlsdCkKKwkJYWRkcl9maWx0ZXJfX2ZyZWVfc3RyKGZpbHQpOworCWZyZWUoZmlsdCk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZHJfZmlsdGVyc19fYWRkKHN0cnVjdCBhZGRyX2ZpbHRlcnMgKmZpbHRzLAorCQkJICAgICAgc3RydWN0IGFkZHJfZmlsdGVyICpmaWx0KQoreworCWxpc3RfYWRkX3RhaWwoJmZpbHQtPmxpc3QsICZmaWx0cy0+aGVhZCk7CisJZmlsdHMtPmNudCArPSAxOworfQorCitzdGF0aWMgdm9pZCBhZGRyX2ZpbHRlcnNfX2RlbChzdHJ1Y3QgYWRkcl9maWx0ZXJzICpmaWx0cywKKwkJCSAgICAgIHN0cnVjdCBhZGRyX2ZpbHRlciAqZmlsdCkKK3sKKwlsaXN0X2RlbF9pbml0KCZmaWx0LT5saXN0KTsKKwlmaWx0cy0+Y250IC09IDE7Cit9CisKK3ZvaWQgYWRkcl9maWx0ZXJzX19pbml0KHN0cnVjdCBhZGRyX2ZpbHRlcnMgKmZpbHRzKQoreworCUlOSVRfTElTVF9IRUFEKCZmaWx0cy0+aGVhZCk7CisJZmlsdHMtPmNudCA9IDA7Cit9CisKK3ZvaWQgYWRkcl9maWx0ZXJzX19leGl0KHN0cnVjdCBhZGRyX2ZpbHRlcnMgKmZpbHRzKQoreworCXN0cnVjdCBhZGRyX2ZpbHRlciAqZmlsdCwgKm47CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmlsdCwgbiwgJmZpbHRzLT5oZWFkLCBsaXN0KSB7CisJCWFkZHJfZmlsdGVyc19fZGVsKGZpbHRzLCBmaWx0KTsKKwkJYWRkcl9maWx0ZXJfX2ZyZWUoZmlsdCk7CisJfQorfQorCitzdGF0aWMgaW50IHBhcnNlX251bV9vcl9zdHIoY2hhciAqKmlucCwgdTY0ICpudW0sIGNvbnN0IGNoYXIgKipzdHIsCisJCQkgICAgY29uc3QgY2hhciAqc3RyX2RlbGltKQoreworCSppbnAgKz0gc3Ryc3BuKCppbnAsICIgIik7CisKKwlpZiAoaXNkaWdpdCgqKmlucCkpIHsKKwkJY2hhciAqZW5kcHRyOworCisJCWlmICghbnVtKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWVycm5vID0gMDsKKwkJKm51bSA9IHN0cnRvdWxsKCppbnAsICZlbmRwdHIsIDApOworCQlpZiAoZXJybm8pCisJCQlyZXR1cm4gLWVycm5vOworCQlpZiAoZW5kcHRyID09ICppbnApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJKmlucCA9IGVuZHB0cjsKKwl9IGVsc2UgeworCQlzaXplX3QgbjsKKworCQlpZiAoIXN0cikKKwkJCXJldHVybiAtRUlOVkFMOworCQkqaW5wICs9IHN0cnNwbigqaW5wLCAiICIpOworCQkqc3RyID0gKmlucDsKKwkJbiA9IHN0cmNzcG4oKmlucCwgc3RyX2RlbGltKTsKKwkJaWYgKCFuKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCSppbnAgKz0gbjsKKwkJaWYgKCoqaW5wKSB7CisJCQkqKmlucCA9ICdcMCc7CisJCQkqaW5wICs9IDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfYWN0aW9uKHN0cnVjdCBhZGRyX2ZpbHRlciAqZmlsdCkKK3sKKwlpZiAoIXN0cmNtcChmaWx0LT5hY3Rpb24sICJmaWx0ZXIiKSkgeworCQlmaWx0LT5zdGFydCA9IHRydWU7CisJCWZpbHQtPnJhbmdlID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoZmlsdC0+YWN0aW9uLCAic3RhcnQiKSkgeworCQlmaWx0LT5zdGFydCA9IHRydWU7CisJfSBlbHNlIGlmICghc3RyY21wKGZpbHQtPmFjdGlvbiwgInN0b3AiKSkgeworCQlmaWx0LT5zdGFydCA9IGZhbHNlOworCX0gZWxzZSBpZiAoIXN0cmNtcChmaWx0LT5hY3Rpb24sICJ0cmFjZXN0b3AiKSkgeworCQlmaWx0LT5zdGFydCA9IGZhbHNlOworCQlmaWx0LT5yYW5nZSA9IHRydWU7CisJCWZpbHQtPmFjdGlvbiArPSA1OyAvKiBDaGFuZ2UgJ3RyYWNlc3RvcCcgdG8gJ3N0b3AnICovCisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX3N5bV9pZHgoY2hhciAqKmlucCwgaW50ICppZHgpCit7CisJKmlkeCA9IC0xOworCisJKmlucCArPSBzdHJzcG4oKmlucCwgIiAiKTsKKworCWlmICgqKmlucCAhPSAnIycpCisJCXJldHVybiAwOworCisJKmlucCArPSAxOworCisJaWYgKCoqaW5wID09ICdnJyB8fCAqKmlucCA9PSAnRycpIHsKKwkJKmlucCArPSAxOworCQkqaWR4ID0gMDsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBsb25nIG51bTsKKwkJY2hhciAqZW5kcHRyOworCisJCWVycm5vID0gMDsKKwkJbnVtID0gc3RydG91bCgqaW5wLCAmZW5kcHRyLCAwKTsKKwkJaWYgKGVycm5vKQorCQkJcmV0dXJuIC1lcnJubzsKKwkJaWYgKGVuZHB0ciA9PSAqaW5wIHx8IG51bSA+IElOVF9NQVgpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJKmlucCA9IGVuZHB0cjsKKwkJKmlkeCA9IG51bTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9hZGRyX3NpemUoY2hhciAqKmlucCwgdTY0ICpudW0sIGNvbnN0IGNoYXIgKipzdHIsIGludCAqaWR4KQoreworCWludCBlcnIgPSBwYXJzZV9udW1fb3Jfc3RyKGlucCwgbnVtLCBzdHIsICIgIik7CisKKwlpZiAoIWVyciAmJiAqc3RyKQorCQllcnIgPSBwYXJzZV9zeW1faWR4KGlucCwgaWR4KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfb25lX2ZpbHRlcihzdHJ1Y3QgYWRkcl9maWx0ZXIgKmZpbHQsIGNvbnN0IGNoYXIgKipmaWx0ZXJfaW5wKQoreworCWNoYXIgKmZzdHI7CisJaW50IGVycjsKKworCWZpbHQtPnN0ciA9IGZzdHIgPSBzdHJkdXAoKmZpbHRlcl9pbnApOworCWlmICghZnN0cikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllcnIgPSBwYXJzZV9udW1fb3Jfc3RyKCZmc3RyLCBOVUxMLCAmZmlsdC0+YWN0aW9uLCAiICIpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2VycjsKKworCWVyciA9IHBhcnNlX2FjdGlvbihmaWx0KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9lcnI7CisKKwllcnIgPSBwYXJzZV9hZGRyX3NpemUoJmZzdHIsICZmaWx0LT5hZGRyLCAmZmlsdC0+c3ltX2Zyb20sCisJCQkgICAgICAmZmlsdC0+c3ltX2Zyb21faWR4KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9lcnI7CisKKwlmc3RyICs9IHN0cnNwbihmc3RyLCAiICIpOworCisJaWYgKCpmc3RyID09ICcvJykgeworCQlmc3RyICs9IDE7CisJCWVyciA9IHBhcnNlX2FkZHJfc2l6ZSgmZnN0ciwgJmZpbHQtPnNpemUsICZmaWx0LT5zeW1fdG8sCisJCQkJICAgICAgJmZpbHQtPnN5bV90b19pZHgpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfZXJyOworCQlmaWx0LT5yYW5nZSA9IHRydWU7CisJfQorCisJZnN0ciArPSBzdHJzcG4oZnN0ciwgIiAiKTsKKworCWlmICgqZnN0ciA9PSAnQCcpIHsKKwkJZnN0ciArPSAxOworCQllcnIgPSBwYXJzZV9udW1fb3Jfc3RyKCZmc3RyLCBOVUxMLCAmZmlsdC0+ZmlsZW5hbWUsICIgLCIpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfZXJyOworCX0KKworCWZzdHIgKz0gc3Ryc3BuKGZzdHIsICIgLCIpOworCisJKmZpbHRlcl9pbnAgKz0gZnN0ciAtIGZpbHQtPnN0cjsKKworCXJldHVybiAwOworCitvdXRfZXJyOgorCWFkZHJfZmlsdGVyX19mcmVlX3N0cihmaWx0KTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBhZGRyX2ZpbHRlcnNfX3BhcnNlX2JhcmVfZmlsdGVyKHN0cnVjdCBhZGRyX2ZpbHRlcnMgKmZpbHRzLAorCQkJCSAgICBjb25zdCBjaGFyICpmaWx0ZXIpCit7CisJc3RydWN0IGFkZHJfZmlsdGVyICpmaWx0OworCWNvbnN0IGNoYXIgKmZzdHIgPSBmaWx0ZXI7CisJaW50IGVycjsKKworCXdoaWxlICgqZnN0cikgeworCQlmaWx0ID0gYWRkcl9maWx0ZXJfX25ldygpOworCQllcnIgPSBwYXJzZV9vbmVfZmlsdGVyKGZpbHQsICZmc3RyKTsKKwkJaWYgKGVycikgeworCQkJYWRkcl9maWx0ZXJfX2ZyZWUoZmlsdCk7CisJCQlhZGRyX2ZpbHRlcnNfX2V4aXQoZmlsdHMpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQlhZGRyX2ZpbHRlcnNfX2FkZChmaWx0cywgZmlsdCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzeW1fYXJncyB7CisJY29uc3QgY2hhcgkqbmFtZTsKKwl1NjQJCXN0YXJ0OworCXU2NAkJc2l6ZTsKKwlpbnQJCWlkeDsKKwlpbnQJCWNudDsKKwlib29sCQlzdGFydGVkOworCWJvb2wJCWdsb2JhbDsKKwlib29sCQlzZWxlY3RlZDsKKwlib29sCQlkdXBsaWNhdGU7CisJYm9vbAkJbmVhcjsKK307CisKK3N0YXRpYyBib29sIGtlcm5fc3ltX21hdGNoKHN0cnVjdCBzeW1fYXJncyAqYXJncywgY29uc3QgY2hhciAqbmFtZSwgY2hhciB0eXBlKQoreworCS8qIEEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBuYW1lLCBhbmQgZ2xvYmFsIG9yIHRoZSBuJ3RoIGZvdW5kIG9yIGFueSAqLworCXJldHVybiBzeW1ib2xfdHlwZV9faXNfYSh0eXBlLCBNQVBfX0ZVTkNUSU9OKSAmJgorCSAgICAgICAhc3RyY21wKG5hbWUsIGFyZ3MtPm5hbWUpICYmCisJICAgICAgICgoYXJncy0+Z2xvYmFsICYmIGlzdXBwZXIodHlwZSkpIHx8CisJCShhcmdzLT5zZWxlY3RlZCAmJiArKyhhcmdzLT5jbnQpID09IGFyZ3MtPmlkeCkgfHwKKwkJKCFhcmdzLT5nbG9iYWwgJiYgIWFyZ3MtPnNlbGVjdGVkKSk7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9rZXJuX3N5bV9jYih2b2lkICphcmcsIGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgdHlwZSwgdTY0IHN0YXJ0KQoreworCXN0cnVjdCBzeW1fYXJncyAqYXJncyA9IGFyZzsKKworCWlmIChhcmdzLT5zdGFydGVkKSB7CisJCWlmICghYXJncy0+c2l6ZSkKKwkJCWFyZ3MtPnNpemUgPSBzdGFydCAtIGFyZ3MtPnN0YXJ0OworCQlpZiAoYXJncy0+c2VsZWN0ZWQpIHsKKwkJCWlmIChhcmdzLT5zaXplKQorCQkJCXJldHVybiAxOworCQl9IGVsc2UgaWYgKGtlcm5fc3ltX21hdGNoKGFyZ3MsIG5hbWUsIHR5cGUpKSB7CisJCQlhcmdzLT5kdXBsaWNhdGUgPSB0cnVlOworCQkJcmV0dXJuIDE7CisJCX0KKwl9IGVsc2UgaWYgKGtlcm5fc3ltX21hdGNoKGFyZ3MsIG5hbWUsIHR5cGUpKSB7CisJCWFyZ3MtPnN0YXJ0ZWQgPSB0cnVlOworCQlhcmdzLT5zdGFydCA9IHN0YXJ0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByaW50X2tlcm5fc3ltX2NiKHZvaWQgKmFyZywgY29uc3QgY2hhciAqbmFtZSwgY2hhciB0eXBlLCB1NjQgc3RhcnQpCit7CisJc3RydWN0IHN5bV9hcmdzICphcmdzID0gYXJnOworCisJaWYgKGtlcm5fc3ltX21hdGNoKGFyZ3MsIG5hbWUsIHR5cGUpKSB7CisJCXByX2VycigiIyVkXHQweCUiUFJJeDY0Ilx0JWNcdCVzXG4iLAorCQkgICAgICAgKythcmdzLT5jbnQsIHN0YXJ0LCB0eXBlLCBuYW1lKTsKKwkJYXJncy0+bmVhciA9IHRydWU7CisJfSBlbHNlIGlmIChhcmdzLT5uZWFyKSB7CisJCWFyZ3MtPm5lYXIgPSBmYWxzZTsKKwkJcHJfZXJyKCJcdFx0d2hpY2ggaXMgbmVhclx0XHQlc1xuIiwgbmFtZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3ltX25vdF9mb3VuZF9lcnJvcihjb25zdCBjaGFyICpzeW1fbmFtZSwgaW50IGlkeCkKK3sKKwlpZiAoaWR4ID4gMCkgeworCQlwcl9lcnIoIk4ndGggb2NjdXJyZW5jZSAoTj0lZCkgb2Ygc3ltYm9sICclcycgbm90IGZvdW5kLlxuIiwKKwkJICAgICAgIGlkeCwgc3ltX25hbWUpOworCX0gZWxzZSBpZiAoIWlkeCkgeworCQlwcl9lcnIoIkdsb2JhbCBzeW1ib2wgJyVzJyBub3QgZm91bmQuXG4iLCBzeW1fbmFtZSk7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCJTeW1ib2wgJyVzJyBub3QgZm91bmQuXG4iLCBzeW1fbmFtZSk7CisJfQorCXByX2VycigiTm90ZSB0aGF0IHN5bWJvbHMgbXVzdCBiZSBmdW5jdGlvbnMuXG4iKTsKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGZpbmRfa2Vybl9zeW0oY29uc3QgY2hhciAqc3ltX25hbWUsIHU2NCAqc3RhcnQsIHU2NCAqc2l6ZSwgaW50IGlkeCkKK3sKKwlzdHJ1Y3Qgc3ltX2FyZ3MgYXJncyA9IHsKKwkJLm5hbWUgPSBzeW1fbmFtZSwKKwkJLmlkeCA9IGlkeCwKKwkJLmdsb2JhbCA9ICFpZHgsCisJCS5zZWxlY3RlZCA9IGlkeCA+IDAsCisJfTsKKwlpbnQgZXJyOworCisJKnN0YXJ0ID0gMDsKKwkqc2l6ZSA9IDA7CisKKwllcnIgPSBrYWxsc3ltc19fcGFyc2UoIi9wcm9jL2thbGxzeW1zIiwgJmFyZ3MsIGZpbmRfa2Vybl9zeW1fY2IpOworCWlmIChlcnIgPCAwKSB7CisJCXByX2VycigiRmFpbGVkIHRvIHBhcnNlIC9wcm9jL2thbGxzeW1zXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoYXJncy5kdXBsaWNhdGUpIHsKKwkJcHJfZXJyKCJNdWx0aXBsZSBrZXJuZWwgc3ltYm9scyB3aXRoIG5hbWUgJyVzJ1xuIiwgc3ltX25hbWUpOworCQlhcmdzLmNudCA9IDA7CisJCWthbGxzeW1zX19wYXJzZSgiL3Byb2Mva2FsbHN5bXMiLCAmYXJncywgcHJpbnRfa2Vybl9zeW1fY2IpOworCQlwcl9lcnIoIkRpc2FtYmlndWF0ZSBzeW1ib2wgbmFtZSBieSBpbnNlcnRpbmcgI24gYWZ0ZXIgdGhlIG5hbWUgZS5nLiAlcyAjMlxuIiwKKwkJICAgICAgIHN5bV9uYW1lKTsKKwkJcHJfZXJyKCJPciBzZWxlY3QgYSBnbG9iYWwgc3ltYm9sIGJ5IGluc2VydGluZyAjMCBvciAjZyBvciAjR1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghYXJncy5zdGFydGVkKSB7CisJCXByX2VycigiS2VybmVsIHN5bWJvbCBsb29rdXA6ICIpOworCQlyZXR1cm4gc3ltX25vdF9mb3VuZF9lcnJvcihzeW1fbmFtZSwgaWR4KTsKKwl9CisKKwkqc3RhcnQgPSBhcmdzLnN0YXJ0OworCSpzaXplID0gYXJncy5zaXplOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9lbnRpcmVfa2Vybl9jYih2b2lkICphcmcsIGNvbnN0IGNoYXIgKm5hbWUgX19tYXliZV91bnVzZWQsCisJCQkgICAgICAgY2hhciB0eXBlLCB1NjQgc3RhcnQpCit7CisJc3RydWN0IHN5bV9hcmdzICphcmdzID0gYXJnOworCisJaWYgKCFzeW1ib2xfdHlwZV9faXNfYSh0eXBlLCBNQVBfX0ZVTkNUSU9OKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWFyZ3MtPnN0YXJ0ZWQpIHsKKwkJYXJncy0+c3RhcnRlZCA9IHRydWU7CisJCWFyZ3MtPnN0YXJ0ID0gc3RhcnQ7CisJfQorCS8qIERvbid0IGtub3cgZXhhY3RseSB3aGVyZSB0aGUga2VybmVsIGVuZHMsIHNvIHdlIGFkZCBhIHBhZ2UgKi8KKwlhcmdzLT5zaXplID0gcm91bmRfdXAoc3RhcnQsIHBhZ2Vfc2l6ZSkgKyBwYWdlX3NpemUgLSBhcmdzLT5zdGFydDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkZHJfZmlsdGVyX19lbnRpcmVfa2VybmVsKHN0cnVjdCBhZGRyX2ZpbHRlciAqZmlsdCkKK3sKKwlzdHJ1Y3Qgc3ltX2FyZ3MgYXJncyA9IHsgLnN0YXJ0ZWQgPSBmYWxzZSB9OworCWludCBlcnI7CisKKwllcnIgPSBrYWxsc3ltc19fcGFyc2UoIi9wcm9jL2thbGxzeW1zIiwgJmFyZ3MsIGZpbmRfZW50aXJlX2tlcm5fY2IpOworCWlmIChlcnIgPCAwIHx8ICFhcmdzLnN0YXJ0ZWQpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gcGFyc2UgL3Byb2Mva2FsbHN5bXNcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWZpbHQtPmFkZHIgPSBhcmdzLnN0YXJ0OworCWZpbHQtPnNpemUgPSBhcmdzLnNpemU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGVja19lbmRfYWZ0ZXJfc3RhcnQoc3RydWN0IGFkZHJfZmlsdGVyICpmaWx0LCB1NjQgc3RhcnQsIHU2NCBzaXplKQoreworCWlmIChzdGFydCArIHNpemUgPj0gZmlsdC0+YWRkcikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZmlsdC0+c3ltX2Zyb20pIHsKKwkJcHJfZXJyKCJTeW1ib2wgJyVzJyAoMHglIlBSSXg2NCIpIGNvbWVzIGJlZm9yZSAnJXMnICgweCUiUFJJeDY0IilcbiIsCisJCSAgICAgICBmaWx0LT5zeW1fdG8sIHN0YXJ0LCBmaWx0LT5zeW1fZnJvbSwgZmlsdC0+YWRkcik7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCJTeW1ib2wgJyVzJyAoMHglIlBSSXg2NCIpIGNvbWVzIGJlZm9yZSBhZGRyZXNzIDB4JSJQUkl4NjQiKVxuIiwKKwkJICAgICAgIGZpbHQtPnN5bV90bywgc3RhcnQsIGZpbHQtPmFkZHIpOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGFkZHJfZmlsdGVyX19yZXNvbHZlX2tlcm5lbF9zeW1zKHN0cnVjdCBhZGRyX2ZpbHRlciAqZmlsdCkKK3sKKwlib29sIG5vX3NpemUgPSBmYWxzZTsKKwl1NjQgc3RhcnQsIHNpemU7CisJaW50IGVycjsKKworCWlmIChzeW1ib2xfY29uZi5rcHRyX3Jlc3RyaWN0KSB7CisJCXByX2VycigiS2VybmVsIGFkZHJlc3NlcyBhcmUgcmVzdHJpY3RlZC4gVW5hYmxlIHRvIHJlc29sdmUga2VybmVsIHN5bWJvbHMuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGZpbHQtPnN5bV9mcm9tICYmICFzdHJjbXAoZmlsdC0+c3ltX2Zyb20sICIqIikpCisJCXJldHVybiBhZGRyX2ZpbHRlcl9fZW50aXJlX2tlcm5lbChmaWx0KTsKKworCWlmIChmaWx0LT5zeW1fZnJvbSkgeworCQllcnIgPSBmaW5kX2tlcm5fc3ltKGZpbHQtPnN5bV9mcm9tLCAmc3RhcnQsICZzaXplLAorCQkJCSAgICBmaWx0LT5zeW1fZnJvbV9pZHgpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJZmlsdC0+YWRkciA9IHN0YXJ0OworCQlpZiAoZmlsdC0+cmFuZ2UgJiYgIWZpbHQtPnNpemUgJiYgIWZpbHQtPnN5bV90bykgeworCQkJZmlsdC0+c2l6ZSA9IHNpemU7CisJCQlub19zaXplID0gISFzaXplOworCQl9CisJfQorCisJaWYgKGZpbHQtPnN5bV90bykgeworCQllcnIgPSBmaW5kX2tlcm5fc3ltKGZpbHQtPnN5bV90bywgJnN0YXJ0LCAmc2l6ZSwKKwkJCQkgICAgZmlsdC0+c3ltX3RvX2lkeCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCWVyciA9IGNoZWNrX2VuZF9hZnRlcl9zdGFydChmaWx0LCBzdGFydCwgc2l6ZSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQlmaWx0LT5zaXplID0gc3RhcnQgKyBzaXplIC0gZmlsdC0+YWRkcjsKKwkJbm9fc2l6ZSA9ICEhc2l6ZTsKKwl9CisKKwkvKiBUaGUgdmVyeSBsYXN0IHN5bWJvbCBpbiBrYWxsc3ltcyBkb2VzIG5vdCBpbXBseSBhIHBhcnRpY3VsYXIgc2l6ZSAqLworCWlmIChub19zaXplKSB7CisJCXByX2VycigiQ2Fubm90IGRldGVybWluZSBzaXplIG9mIHN5bWJvbCAnJXMnXG4iLAorCQkgICAgICAgZmlsdC0+c3ltX3RvID8gZmlsdC0+c3ltX3RvIDogZmlsdC0+c3ltX2Zyb20pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkc28gKmxvYWRfZHNvKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IG1hcCAqbWFwOworCXN0cnVjdCBkc28gKmRzbzsKKworCW1hcCA9IGRzb19fbmV3X21hcChuYW1lKTsKKwlpZiAoIW1hcCkKKwkJcmV0dXJuIE5VTEw7CisKKwltYXBfX2xvYWQobWFwKTsKKworCWRzbyA9IGRzb19fZ2V0KG1hcC0+ZHNvKTsKKworCW1hcF9fcHV0KG1hcCk7CisKKwlyZXR1cm4gZHNvOworfQorCitzdGF0aWMgYm9vbCBkc29fc3ltX21hdGNoKHN0cnVjdCBzeW1ib2wgKnN5bSwgY29uc3QgY2hhciAqbmFtZSwgaW50ICpjbnQsCisJCQkgIGludCBpZHgpCit7CisJLyogU2FtZSBuYW1lLCBhbmQgZ2xvYmFsIG9yIHRoZSBuJ3RoIGZvdW5kIG9yIGFueSAqLworCXJldHVybiAhYXJjaF9fY29tcGFyZV9zeW1ib2xfbmFtZXMobmFtZSwgc3ltLT5uYW1lKSAmJgorCSAgICAgICAoKCFpZHggJiYgc3ltLT5iaW5kaW5nID09IFNUQl9HTE9CQUwpIHx8CisJCShpZHggPiAwICYmICsrKmNudCA9PSBpZHgpIHx8CisJCWlkeCA8IDApOworfQorCitzdGF0aWMgdm9pZCBwcmludF9kdXBsaWNhdGVfc3ltcyhzdHJ1Y3QgZHNvICpkc28sIGNvbnN0IGNoYXIgKnN5bV9uYW1lKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlib29sIG5lYXIgPSBmYWxzZTsKKwlpbnQgY250ID0gMDsKKworCXByX2VycigiTXVsdGlwbGUgc3ltYm9scyB3aXRoIG5hbWUgJyVzJ1xuIiwgc3ltX25hbWUpOworCisJc3ltID0gZHNvX19maXJzdF9zeW1ib2woZHNvLCBNQVBfX0ZVTkNUSU9OKTsKKwl3aGlsZSAoc3ltKSB7CisJCWlmIChkc29fc3ltX21hdGNoKHN5bSwgc3ltX25hbWUsICZjbnQsIC0xKSkgeworCQkJcHJfZXJyKCIjJWRcdDB4JSJQUkl4NjQiXHQlY1x0JXNcbiIsCisJCQkgICAgICAgKytjbnQsIHN5bS0+c3RhcnQsCisJCQkgICAgICAgc3ltLT5iaW5kaW5nID09IFNUQl9HTE9CQUwgPyAnZycgOgorCQkJICAgICAgIHN5bS0+YmluZGluZyA9PSBTVEJfTE9DQUwgID8gJ2wnIDogJ3cnLAorCQkJICAgICAgIHN5bS0+bmFtZSk7CisJCQluZWFyID0gdHJ1ZTsKKwkJfSBlbHNlIGlmIChuZWFyKSB7CisJCQluZWFyID0gZmFsc2U7CisJCQlwcl9lcnIoIlx0XHR3aGljaCBpcyBuZWFyXHRcdCVzXG4iLCBzeW0tPm5hbWUpOworCQl9CisJCXN5bSA9IGRzb19fbmV4dF9zeW1ib2woc3ltKTsKKwl9CisKKwlwcl9lcnIoIkRpc2FtYmlndWF0ZSBzeW1ib2wgbmFtZSBieSBpbnNlcnRpbmcgI24gYWZ0ZXIgdGhlIG5hbWUgZS5nLiAlcyAjMlxuIiwKKwkgICAgICAgc3ltX25hbWUpOworCXByX2VycigiT3Igc2VsZWN0IGEgZ2xvYmFsIHN5bWJvbCBieSBpbnNlcnRpbmcgIzAgb3IgI2cgb3IgI0dcbiIpOworfQorCitzdGF0aWMgaW50IGZpbmRfZHNvX3N5bShzdHJ1Y3QgZHNvICpkc28sIGNvbnN0IGNoYXIgKnN5bV9uYW1lLCB1NjQgKnN0YXJ0LAorCQkJdTY0ICpzaXplLCBpbnQgaWR4KQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlpbnQgY250ID0gMDsKKworCSpzdGFydCA9IDA7CisJKnNpemUgPSAwOworCisJc3ltID0gZHNvX19maXJzdF9zeW1ib2woZHNvLCBNQVBfX0ZVTkNUSU9OKTsKKwl3aGlsZSAoc3ltKSB7CisJCWlmICgqc3RhcnQpIHsKKwkJCWlmICghKnNpemUpCisJCQkJKnNpemUgPSBzeW0tPnN0YXJ0IC0gKnN0YXJ0OworCQkJaWYgKGlkeCA+IDApIHsKKwkJCQlpZiAoKnNpemUpCisJCQkJCXJldHVybiAxOworCQkJfSBlbHNlIGlmIChkc29fc3ltX21hdGNoKHN5bSwgc3ltX25hbWUsICZjbnQsIGlkeCkpIHsKKwkJCQlwcmludF9kdXBsaWNhdGVfc3ltcyhkc28sIHN5bV9uYW1lKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfSBlbHNlIGlmIChkc29fc3ltX21hdGNoKHN5bSwgc3ltX25hbWUsICZjbnQsIGlkeCkpIHsKKwkJCSpzdGFydCA9IHN5bS0+c3RhcnQ7CisJCQkqc2l6ZSA9IHN5bS0+ZW5kIC0gc3ltLT5zdGFydDsKKwkJfQorCQlzeW0gPSBkc29fX25leHRfc3ltYm9sKHN5bSk7CisJfQorCisJaWYgKCEqc3RhcnQpCisJCXJldHVybiBzeW1fbm90X2ZvdW5kX2Vycm9yKHN5bV9uYW1lLCBpZHgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRkcl9maWx0ZXJfX2VudGlyZV9kc28oc3RydWN0IGFkZHJfZmlsdGVyICpmaWx0LCBzdHJ1Y3QgZHNvICpkc28pCit7CisJc3RydWN0IHN5bWJvbCAqZmlyc3Rfc3ltID0gZHNvX19maXJzdF9zeW1ib2woZHNvLCBNQVBfX0ZVTkNUSU9OKTsKKwlzdHJ1Y3Qgc3ltYm9sICpsYXN0X3N5bSA9IGRzb19fbGFzdF9zeW1ib2woZHNvLCBNQVBfX0ZVTkNUSU9OKTsKKworCWlmICghZmlyc3Rfc3ltIHx8ICFsYXN0X3N5bSkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBkZXRlcm1pbmUgZmlsdGVyIGZvciAlc1xuTm8gc3ltYm9scyBmb3VuZC5cbiIsCisJCSAgICAgICBmaWx0LT5maWxlbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZpbHQtPmFkZHIgPSBmaXJzdF9zeW0tPnN0YXJ0OworCWZpbHQtPnNpemUgPSBsYXN0X3N5bS0+ZW5kIC0gZmlyc3Rfc3ltLT5zdGFydDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkZHJfZmlsdGVyX19yZXNvbHZlX3N5bXMoc3RydWN0IGFkZHJfZmlsdGVyICpmaWx0KQoreworCXU2NCBzdGFydCwgc2l6ZTsKKwlzdHJ1Y3QgZHNvICpkc287CisJaW50IGVyciA9IDA7CisKKwlpZiAoIWZpbHQtPnN5bV9mcm9tICYmICFmaWx0LT5zeW1fdG8pCisJCXJldHVybiAwOworCisJaWYgKCFmaWx0LT5maWxlbmFtZSkKKwkJcmV0dXJuIGFkZHJfZmlsdGVyX19yZXNvbHZlX2tlcm5lbF9zeW1zKGZpbHQpOworCisJZHNvID0gbG9hZF9kc28oZmlsdC0+ZmlsZW5hbWUpOworCWlmICghZHNvKSB7CisJCXByX2VycigiRmFpbGVkIHRvIGxvYWQgc3ltYm9scyBmcm9tOiAlc1xuIiwgZmlsdC0+ZmlsZW5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZmlsdC0+c3ltX2Zyb20gJiYgIXN0cmNtcChmaWx0LT5zeW1fZnJvbSwgIioiKSkgeworCQllcnIgPSBhZGRyX2ZpbHRlcl9fZW50aXJlX2RzbyhmaWx0LCBkc28pOworCQlnb3RvIHB1dF9kc287CisJfQorCisJaWYgKGZpbHQtPnN5bV9mcm9tKSB7CisJCWVyciA9IGZpbmRfZHNvX3N5bShkc28sIGZpbHQtPnN5bV9mcm9tLCAmc3RhcnQsICZzaXplLAorCQkJCSAgIGZpbHQtPnN5bV9mcm9tX2lkeCk7CisJCWlmIChlcnIpCisJCQlnb3RvIHB1dF9kc287CisJCWZpbHQtPmFkZHIgPSBzdGFydDsKKwkJaWYgKGZpbHQtPnJhbmdlICYmICFmaWx0LT5zaXplICYmICFmaWx0LT5zeW1fdG8pCisJCQlmaWx0LT5zaXplID0gc2l6ZTsKKwl9CisKKwlpZiAoZmlsdC0+c3ltX3RvKSB7CisJCWVyciA9IGZpbmRfZHNvX3N5bShkc28sIGZpbHQtPnN5bV90bywgJnN0YXJ0LCAmc2l6ZSwKKwkJCQkgICBmaWx0LT5zeW1fdG9faWR4KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gcHV0X2RzbzsKKworCQllcnIgPSBjaGVja19lbmRfYWZ0ZXJfc3RhcnQoZmlsdCwgc3RhcnQsIHNpemUpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQlmaWx0LT5zaXplID0gc3RhcnQgKyBzaXplIC0gZmlsdC0+YWRkcjsKKwl9CisKK3B1dF9kc286CisJZHNvX19wdXQoZHNvKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjaGFyICphZGRyX2ZpbHRlcl9fdG9fc3RyKHN0cnVjdCBhZGRyX2ZpbHRlciAqZmlsdCkKK3sKKwljaGFyIGZpbGVuYW1lX2J1ZltQQVRIX01BWF07CisJY29uc3QgY2hhciAqYXQgPSAiIjsKKwljb25zdCBjaGFyICpmbiA9ICIiOworCWNoYXIgKmZpbHRlcjsKKwlpbnQgZXJyOworCisJaWYgKGZpbHQtPmZpbGVuYW1lKSB7CisJCWF0ID0gIkAiOworCQlmbiA9IHJlYWxwYXRoKGZpbHQtPmZpbGVuYW1lLCBmaWxlbmFtZV9idWYpOworCQlpZiAoIWZuKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGZpbHQtPnJhbmdlKSB7CisJCWVyciA9IGFzcHJpbnRmKCZmaWx0ZXIsICIlcyAweCUiUFJJeDY0Ii8weCUiUFJJeDY0IiVzJXMiLAorCQkJICAgICAgIGZpbHQtPmFjdGlvbiwgZmlsdC0+YWRkciwgZmlsdC0+c2l6ZSwgYXQsIGZuKTsKKwl9IGVsc2UgeworCQllcnIgPSBhc3ByaW50ZigmZmlsdGVyLCAiJXMgMHglIlBSSXg2NCIlcyVzIiwKKwkJCSAgICAgICBmaWx0LT5hY3Rpb24sIGZpbHQtPmFkZHIsIGF0LCBmbik7CisJfQorCisJcmV0dXJuIGVyciA8IDAgPyBOVUxMIDogZmlsdGVyOworfQorCitzdGF0aWMgaW50IHBhcnNlX2FkZHJfZmlsdGVyKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgY29uc3QgY2hhciAqZmlsdGVyLAorCQkJICAgICBpbnQgbWF4X25yKQoreworCXN0cnVjdCBhZGRyX2ZpbHRlcnMgZmlsdHM7CisJc3RydWN0IGFkZHJfZmlsdGVyICpmaWx0OworCWludCBlcnI7CisKKwlhZGRyX2ZpbHRlcnNfX2luaXQoJmZpbHRzKTsKKworCWVyciA9IGFkZHJfZmlsdGVyc19fcGFyc2VfYmFyZV9maWx0ZXIoJmZpbHRzLCBmaWx0ZXIpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2V4aXQ7CisKKwlpZiAoZmlsdHMuY250ID4gbWF4X25yKSB7CisJCXByX2VycigiRXJyb3I6IG51bWJlciBvZiBhZGRyZXNzIGZpbHRlcnMgKCVkKSBleGNlZWRzIG1heGltdW0gKCVkKVxuIiwKKwkJICAgICAgIGZpbHRzLmNudCwgbWF4X25yKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZXhpdDsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZpbHQsICZmaWx0cy5oZWFkLCBsaXN0KSB7CisJCWNoYXIgKm5ld19maWx0ZXI7CisKKwkJZXJyID0gYWRkcl9maWx0ZXJfX3Jlc29sdmVfc3ltcyhmaWx0KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2V4aXQ7CisKKwkJbmV3X2ZpbHRlciA9IGFkZHJfZmlsdGVyX190b19zdHIoZmlsdCk7CisJCWlmICghbmV3X2ZpbHRlcikgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X2V4aXQ7CisJCX0KKworCQlpZiAocGVyZl9ldnNlbF9fYXBwZW5kX2FkZHJfZmlsdGVyKGV2c2VsLCBuZXdfZmlsdGVyKSkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X2V4aXQ7CisJCX0KKwl9CisKK291dF9leGl0OgorCWFkZHJfZmlsdGVyc19fZXhpdCgmZmlsdHMpOworCisJaWYgKGVycikgeworCQlwcl9lcnIoIkZhaWxlZCB0byBwYXJzZSBhZGRyZXNzIGZpbHRlcjogJyVzJ1xuIiwgZmlsdGVyKTsKKwkJcHJfZXJyKCJGaWx0ZXIgZm9ybWF0IGlzOiBmaWx0ZXJ8c3RhcnR8c3RvcHx0cmFjZXN0b3AgPHN0YXJ0IHN5bWJvbCBvciBhZGRyZXNzPiBbLyA8ZW5kIHN5bWJvbCBvciBzaXplPl0gW0A8ZmlsZSBuYW1lPl1cbiIpOworCQlwcl9lcnIoIldoZXJlIG11bHRpcGxlIGZpbHRlcnMgYXJlIHNlcGFyYXRlZCBieSBzcGFjZSBvciBjb21tYS5cbiIpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGVyZl9wbXUgKnBlcmZfZXZzZWxfX2ZpbmRfcG11KHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCkKK3sKKwlzdHJ1Y3QgcGVyZl9wbXUgKnBtdSA9IE5VTEw7CisKKwl3aGlsZSAoKHBtdSA9IHBlcmZfcG11X19zY2FuKHBtdSkpICE9IE5VTEwpIHsKKwkJaWYgKHBtdS0+dHlwZSA9PSBldnNlbC0+YXR0ci50eXBlKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHBtdTsKK30KKworc3RhdGljIGludCBwZXJmX2V2c2VsX19ucl9hZGRyX2ZpbHRlcihzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwpCit7CisJc3RydWN0IHBlcmZfcG11ICpwbXUgPSBwZXJmX2V2c2VsX19maW5kX3BtdShldnNlbCk7CisJaW50IG5yX2FkZHJfZmlsdGVycyA9IDA7CisKKwlpZiAoIXBtdSkKKwkJcmV0dXJuIDA7CisKKwlwZXJmX3BtdV9fc2Nhbl9maWxlKHBtdSwgIm5yX2FkZHJfZmlsdGVycyIsICIlZCIsICZucl9hZGRyX2ZpbHRlcnMpOworCisJcmV0dXJuIG5yX2FkZHJfZmlsdGVyczsKK30KKworaW50IGF1eHRyYWNlX3BhcnNlX2ZpbHRlcnMoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpCit7CisJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsOworCWNoYXIgKmZpbHRlcjsKKwlpbnQgZXJyLCBtYXhfbnI7CisKKwlldmxpc3RfX2Zvcl9lYWNoX2VudHJ5KGV2bGlzdCwgZXZzZWwpIHsKKwkJZmlsdGVyID0gZXZzZWwtPmZpbHRlcjsKKwkJbWF4X25yID0gcGVyZl9ldnNlbF9fbnJfYWRkcl9maWx0ZXIoZXZzZWwpOworCQlpZiAoIWZpbHRlciB8fCAhbWF4X25yKQorCQkJY29udGludWU7CisJCWV2c2VsLT5maWx0ZXIgPSBOVUxMOworCQllcnIgPSBwYXJzZV9hZGRyX2ZpbHRlcihldnNlbCwgZmlsdGVyLCBtYXhfbnIpOworCQlmcmVlKGZpbHRlcik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQlwcl9kZWJ1ZygiQWRkcmVzcyBmaWx0ZXI6ICVzXG4iLCBldnNlbC0+ZmlsdGVyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9hdXh0cmFjZS5oIGIvdG9vbHMvcGVyZi91dGlsL2F1eHRyYWNlLmgKaW5kZXggYWM1ZjBkNy4uMjZmYjFlZSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2F1eHRyYWNlLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2F1eHRyYWNlLmgKQEAgLTQxLDYgKzQxLDcgQEAKIAlQRVJGX0FVWFRSQUNFX1VOS05PV04sCiAJUEVSRl9BVVhUUkFDRV9JTlRFTF9QVCwKIAlQRVJGX0FVWFRSQUNFX0lOVEVMX0JUUywKKwlQRVJGX0FVWFRSQUNFX0NTX0VUTSwKIH07CiAKIGVudW0gaXRyYWNlX3BlcmlvZF90eXBlIHsKQEAgLTMxNyw2ICszMTgsNDggQEAKIAl1bnNpZ25lZCBpbnQgYWxpZ25tZW50OwogfTsKIAorLyoqCisgKiBzdHJ1Y3QgYWRkcl9maWx0ZXIgLSBhZGRyZXNzIGZpbHRlci4KKyAqIEBsaXN0OiBsaXN0IG5vZGUKKyAqIEByYW5nZTogdHJ1ZSBpZiBpdCBpcyBhIHJhbmdlIGZpbHRlcgorICogQHN0YXJ0OiB0cnVlIGlmIGFjdGlvbiBpcyAnZmlsdGVyJyBvciAnc3RhcnQnCisgKiBAYWN0aW9uOiAnZmlsdGVyJywgJ3N0YXJ0JyBvciAnc3RvcCcgKCd0cmFjZXN0b3AnIGlzIGFjY2VwdGVkIGJ1dCBjb252ZXJ0ZWQKKyAqICAgICAgICAgIHRvICdzdG9wJykKKyAqIEBzeW1fZnJvbTogc3ltYm9sIG5hbWUgZm9yIHRoZSBmaWx0ZXIgYWRkcmVzcworICogQHN5bV90bzogc3ltYm9sIG5hbWUgdGhhdCBkZXRlcm1pbmVzIHRoZSBmaWx0ZXIgc2l6ZQorICogQHN5bV9mcm9tX2lkeDogc2VsZWN0cyBuJ3RoIGZyb20gc3ltYm9scyB3aXRoIHRoZSBzYW1lIG5hbWUgKDAgbWVhbnMgZ2xvYmFsCisgKiAgICAgICAgICAgICAgICBhbmQgbGVzcyB0aGFuIDAgbWVhbnMgc3ltYm9sIG11c3QgYmUgdW5pcXVlKQorICogQHN5bV90b19pZHg6IHNhbWUgYXMgQHN5bV9mcm9tX2lkeCBidXQgZm9yIEBzeW1fdG8KKyAqIEBhZGRyOiBmaWx0ZXIgYWRkcmVzcworICogQHNpemU6IGZpbHRlciByZWdpb24gc2l6ZSAoZm9yIHJhbmdlIGZpbHRlcnMpCisgKiBAZmlsZW5hbWU6IERTTyBmaWxlIG5hbWUgb3IgTlVMTCBmb3IgdGhlIGtlcm5lbAorICogQHN0cjogYWxsb2NhdGVkIHN0cmluZyB0aGF0IGNvbnRhaW5zIHRoZSBvdGhlciBzdHJpbmcgbWVtYmVycworICovCitzdHJ1Y3QgYWRkcl9maWx0ZXIgeworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwlib29sCQkJcmFuZ2U7CisJYm9vbAkJCXN0YXJ0OworCWNvbnN0IGNoYXIJCSphY3Rpb247CisJY29uc3QgY2hhcgkJKnN5bV9mcm9tOworCWNvbnN0IGNoYXIJCSpzeW1fdG87CisJaW50CQkJc3ltX2Zyb21faWR4OworCWludAkJCXN5bV90b19pZHg7CisJdTY0CQkJYWRkcjsKKwl1NjQJCQlzaXplOworCWNvbnN0IGNoYXIJCSpmaWxlbmFtZTsKKwljaGFyCQkJKnN0cjsKK307CisKKy8qKgorICogc3RydWN0IGFkZHJfZmlsdGVycyAtIGxpc3Qgb2YgYWRkcmVzcyBmaWx0ZXJzLgorICogQGhlYWQ6IGxpc3Qgb2YgYWRkcmVzcyBmaWx0ZXJzCisgKiBAY250OiBudW1iZXIgb2YgYWRkcmVzcyBmaWx0ZXJzCisgKi8KK3N0cnVjdCBhZGRyX2ZpbHRlcnMgeworCXN0cnVjdCBsaXN0X2hlYWQJaGVhZDsKKwlpbnQJCQljbnQ7Cit9OworCiAjaWZkZWYgSEFWRV9BVVhUUkFDRV9TVVBQT1JUCiAKIC8qCkBAIC00ODEsNiArNTI0LDEyIEBACiAJCQkJICAgICAgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQpOwogdm9pZCBldmVudHNfc3RhdHNfX2F1eHRyYWNlX2Vycm9yX3dhcm4oY29uc3Qgc3RydWN0IGV2ZW50c19zdGF0cyAqc3RhdHMpOwogCit2b2lkIGFkZHJfZmlsdGVyc19faW5pdChzdHJ1Y3QgYWRkcl9maWx0ZXJzICpmaWx0cyk7Cit2b2lkIGFkZHJfZmlsdGVyc19fZXhpdChzdHJ1Y3QgYWRkcl9maWx0ZXJzICpmaWx0cyk7CitpbnQgYWRkcl9maWx0ZXJzX19wYXJzZV9iYXJlX2ZpbHRlcihzdHJ1Y3QgYWRkcl9maWx0ZXJzICpmaWx0cywKKwkJCQkgICAgY29uc3QgY2hhciAqZmlsdGVyKTsKK2ludCBhdXh0cmFjZV9wYXJzZV9maWx0ZXJzKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KTsKKwogc3RhdGljIGlubGluZSBpbnQgYXV4dHJhY2VfX3Byb2Nlc3NfZXZlbnQoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwKIAkJCQkJICB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKIAkJCQkJICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKQEAgLTYzOSw2ICs2ODgsMTIgQEAKIHsKIH0KIAorc3RhdGljIGlubGluZQoraW50IGF1eHRyYWNlX3BhcnNlX2ZpbHRlcnMoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QgX19tYXliZV91bnVzZWQpCit7CisJcmV0dXJuIDA7Cit9CisKIGludCBhdXh0cmFjZV9tbWFwX19tbWFwKHN0cnVjdCBhdXh0cmFjZV9tbWFwICptbSwKIAkJCXN0cnVjdCBhdXh0cmFjZV9tbWFwX3BhcmFtcyAqbXAsCiAJCQl2b2lkICp1c2VycGcsIGludCBmZCk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvYmxvY2stcmFuZ2UuYyBiL3Rvb2xzL3BlcmYvdXRpbC9ibG9jay1yYW5nZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiM2UxZDcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvYmxvY2stcmFuZ2UuYwpAQCAtMCwwICsxLDMyOCBAQAorI2luY2x1ZGUgImJsb2NrLXJhbmdlLmgiCisjaW5jbHVkZSAiYW5ub3RhdGUuaCIKKworc3RydWN0IHsKKwlzdHJ1Y3QgcmJfcm9vdCByb290OworCXU2NCBibG9ja3M7Cit9IGJsb2NrX3JhbmdlczsKKworc3RhdGljIHZvaWQgYmxvY2tfcmFuZ2VfX2RlYnVnKHZvaWQpCit7CisJLyoKKwkgKiBYWFggc3RpbGwgcGFyYW5vaWQgZm9yIG5vdzsgc2VlIGlmIHdlIGNhbiBtYWtlIHRoaXMgZGVwZW5kIG9uCisJICogREVCVUc9MSBidWlsZHMuCisJICovCisjaWYgMQorCXN0cnVjdCByYl9ub2RlICpyYjsKKwl1NjQgb2xkID0gMDsgLyogTlVMTCBpc24ndCBleGVjdXRhYmxlICovCisKKwlmb3IgKHJiID0gcmJfZmlyc3QoJmJsb2NrX3Jhbmdlcy5yb290KTsgcmI7IHJiID0gcmJfbmV4dChyYikpIHsKKwkJc3RydWN0IGJsb2NrX3JhbmdlICplbnRyeSA9IHJiX2VudHJ5KHJiLCBzdHJ1Y3QgYmxvY2tfcmFuZ2UsIG5vZGUpOworCisJCWFzc2VydChvbGQgPCBlbnRyeS0+c3RhcnQpOworCQlhc3NlcnQoZW50cnktPnN0YXJ0IDw9IGVudHJ5LT5lbmQpOyAvKiBzaW5nbGUgaW5zdHJ1Y3Rpb24gYmxvY2s7IGp1bXAgdG8gYSBqdW1wICovCisKKwkJb2xkID0gZW50cnktPmVuZDsKKwl9CisjZW5kaWYKK30KKworc3RydWN0IGJsb2NrX3JhbmdlICpibG9ja19yYW5nZV9fZmluZCh1NjQgYWRkcikKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmYmxvY2tfcmFuZ2VzLnJvb3QucmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgYmxvY2tfcmFuZ2UgKmVudHJ5OworCisJd2hpbGUgKCpwICE9IE5VTEwpIHsKKwkJcGFyZW50ID0gKnA7CisJCWVudHJ5ID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgYmxvY2tfcmFuZ2UsIG5vZGUpOworCisJCWlmIChhZGRyIDwgZW50cnktPnN0YXJ0KQorCQkJcCA9ICZwYXJlbnQtPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGFkZHIgPiBlbnRyeS0+ZW5kKQorCQkJcCA9ICZwYXJlbnQtPnJiX3JpZ2h0OworCQllbHNlCisJCQlyZXR1cm4gZW50cnk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByYl9saW5rX2xlZnRfb2Zfbm9kZShzdHJ1Y3QgcmJfbm9kZSAqbGVmdCwgc3RydWN0IHJiX25vZGUgKm5vZGUpCit7CisJc3RydWN0IHJiX25vZGUgKipwID0gJm5vZGUtPnJiX2xlZnQ7CisJd2hpbGUgKCpwKSB7CisJCW5vZGUgPSAqcDsKKwkJcCA9ICZub2RlLT5yYl9yaWdodDsKKwl9CisJcmJfbGlua19ub2RlKGxlZnQsIG5vZGUsIHApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmJfbGlua19yaWdodF9vZl9ub2RlKHN0cnVjdCByYl9ub2RlICpyaWdodCwgc3RydWN0IHJiX25vZGUgKm5vZGUpCit7CisJc3RydWN0IHJiX25vZGUgKipwID0gJm5vZGUtPnJiX3JpZ2h0OworCXdoaWxlICgqcCkgeworCQlub2RlID0gKnA7CisJCXAgPSAmbm9kZS0+cmJfbGVmdDsKKwl9CisJcmJfbGlua19ub2RlKHJpZ2h0LCBub2RlLCBwKTsKK30KKworLyoqCisgKiBibG9ja19yYW5nZV9fY3JlYXRlCisgKiBAc3RhcnQ6IGJyYW5jaCB0YXJnZXQgc3RhcnRpbmcgdGhpcyBiYXNpYyBibG9jaworICogQGVuZDogICBicmFuY2ggZW5kaW5nIHRoaXMgYmFzaWMgYmxvY2sKKyAqCisgKiBDcmVhdGUgYWxsIHRoZSByZXF1aXJlZCBibG9jayByYW5nZXMgdG8gcHJlY2lzZWx5IHNwYW4gdGhlIGdpdmVuIHJhbmdlLgorICovCitzdHJ1Y3QgYmxvY2tfcmFuZ2VfaXRlciBibG9ja19yYW5nZV9fY3JlYXRlKHU2NCBzdGFydCwgdTY0IGVuZCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmYmxvY2tfcmFuZ2VzLnJvb3QucmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqbiwgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IGJsb2NrX3JhbmdlICpuZXh0LCAqZW50cnkgPSBOVUxMOworCXN0cnVjdCBibG9ja19yYW5nZV9pdGVyIGl0ZXIgPSB7IE5VTEwsIE5VTEwgfTsKKworCXdoaWxlICgqcCAhPSBOVUxMKSB7CisJCXBhcmVudCA9ICpwOworCQllbnRyeSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGJsb2NrX3JhbmdlLCBub2RlKTsKKworCQlpZiAoc3RhcnQgPCBlbnRyeS0+c3RhcnQpCisJCQlwID0gJnBhcmVudC0+cmJfbGVmdDsKKwkJZWxzZSBpZiAoc3RhcnQgPiBlbnRyeS0+ZW5kKQorCQkJcCA9ICZwYXJlbnQtPnJiX3JpZ2h0OworCQllbHNlCisJCQlicmVhazsKKwl9CisKKwkvKgorCSAqIERpZG4ndCBmaW5kIGFueXRoaW5nLi4gdGhlcmUncyBhIGhvbGUgYXQgQHN0YXJ0LCBob3dldmVyIEBlbmQgbWlnaHQKKwkgKiBiZSBpbnNpZGUvYmVoaW5kIHRoZSBuZXh0IHJhbmdlLgorCSAqLworCWlmICghKnApIHsKKwkJaWYgKCFlbnRyeSkgLyogdHJlZSBlbXB0eSAqLworCQkJZ290byBkb193aG9sZTsKKworCQkvKgorCQkgKiBJZiB0aGUgbGFzdCBub2RlIGlzIGJlZm9yZSwgYWR2YW5jZSBvbmUgdG8gZmluZCB0aGUgbmV4dC4KKwkJICovCisJCW4gPSBwYXJlbnQ7CisJCWlmIChlbnRyeS0+ZW5kIDwgc3RhcnQpIHsKKwkJCW4gPSByYl9uZXh0KG4pOworCQkJaWYgKCFuKQorCQkJCWdvdG8gZG9fd2hvbGU7CisJCX0KKwkJbmV4dCA9IHJiX2VudHJ5KG4sIHN0cnVjdCBibG9ja19yYW5nZSwgbm9kZSk7CisKKwkJaWYgKG5leHQtPnN0YXJ0IDw9IGVuZCkgeyAvKiBhZGQgaGVhZDogW3N0YXJ0Li4uXVtuLT5zdGFydC4uLl0gKi8KKwkJCXN0cnVjdCBibG9ja19yYW5nZSAqaGVhZCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGJsb2NrX3JhbmdlKSk7CisJCQlpZiAoIWhlYWQpCisJCQkJcmV0dXJuIGl0ZXI7CisKKwkJCSpoZWFkID0gKHN0cnVjdCBibG9ja19yYW5nZSl7CisJCQkJLnN0YXJ0CQk9IHN0YXJ0LAorCQkJCS5lbmQJCT0gbmV4dC0+c3RhcnQgLSAxLAorCQkJCS5pc190YXJnZXQJPSAxLAorCQkJCS5pc19icmFuY2gJPSAwLAorCQkJfTsKKworCQkJcmJfbGlua19sZWZ0X29mX25vZGUoJmhlYWQtPm5vZGUsICZuZXh0LT5ub2RlKTsKKwkJCXJiX2luc2VydF9jb2xvcigmaGVhZC0+bm9kZSwgJmJsb2NrX3Jhbmdlcy5yb290KTsKKwkJCWJsb2NrX3JhbmdlX19kZWJ1ZygpOworCisJCQlpdGVyLnN0YXJ0ID0gaGVhZDsKKwkJCWdvdG8gZG9fdGFpbDsKKwkJfQorCitkb193aG9sZToKKwkJLyoKKwkJICogVGhlIHdob2xlIFtzdGFydC4uZW5kXSByYW5nZSBpcyBub24tb3ZlcmxhcHBpbmcuCisJCSAqLworCQllbnRyeSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGJsb2NrX3JhbmdlKSk7CisJCWlmICghZW50cnkpCisJCQlyZXR1cm4gaXRlcjsKKworCQkqZW50cnkgPSAoc3RydWN0IGJsb2NrX3JhbmdlKXsKKwkJCS5zdGFydAkJPSBzdGFydCwKKwkJCS5lbmQJCT0gZW5kLAorCQkJLmlzX3RhcmdldAk9IDEsCisJCQkuaXNfYnJhbmNoCT0gMSwKKwkJfTsKKworCQlyYl9saW5rX25vZGUoJmVudHJ5LT5ub2RlLCBwYXJlbnQsIHApOworCQlyYl9pbnNlcnRfY29sb3IoJmVudHJ5LT5ub2RlLCAmYmxvY2tfcmFuZ2VzLnJvb3QpOworCQlibG9ja19yYW5nZV9fZGVidWcoKTsKKworCQlpdGVyLnN0YXJ0ID0gZW50cnk7CisJCWl0ZXIuZW5kICAgPSBlbnRyeTsKKwkJZ290byBkb25lOworCX0KKworCS8qCisJICogV2UgZm91bmQgYSByYW5nZSB0aGF0IG92ZXJsYXBwZWQgd2l0aCBvdXJzLCBzcGxpdCBpZiBuZWVkZWQuCisJICovCisJaWYgKGVudHJ5LT5zdGFydCA8IHN0YXJ0KSB7IC8qIHNwbGl0OiBbZS0+c3RhcnQuLi5dW3N0YXJ0Li4uXSAqLworCQlzdHJ1Y3QgYmxvY2tfcmFuZ2UgKmhlYWQgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBibG9ja19yYW5nZSkpOworCQlpZiAoIWhlYWQpCisJCQlyZXR1cm4gaXRlcjsKKworCQkqaGVhZCA9IChzdHJ1Y3QgYmxvY2tfcmFuZ2UpeworCQkJLnN0YXJ0CQk9IGVudHJ5LT5zdGFydCwKKwkJCS5lbmQJCT0gc3RhcnQgLSAxLAorCQkJLmlzX3RhcmdldAk9IGVudHJ5LT5pc190YXJnZXQsCisJCQkuaXNfYnJhbmNoCT0gMCwKKworCQkJLmNvdmVyYWdlCT0gZW50cnktPmNvdmVyYWdlLAorCQkJLmVudHJ5CQk9IGVudHJ5LT5lbnRyeSwKKwkJfTsKKworCQllbnRyeS0+c3RhcnQJCT0gc3RhcnQ7CisJCWVudHJ5LT5pc190YXJnZXQJPSAxOworCQllbnRyeS0+ZW50cnkJCT0gMDsKKworCQlyYl9saW5rX2xlZnRfb2Zfbm9kZSgmaGVhZC0+bm9kZSwgJmVudHJ5LT5ub2RlKTsKKwkJcmJfaW5zZXJ0X2NvbG9yKCZoZWFkLT5ub2RlLCAmYmxvY2tfcmFuZ2VzLnJvb3QpOworCQlibG9ja19yYW5nZV9fZGVidWcoKTsKKworCX0gZWxzZSBpZiAoZW50cnktPnN0YXJ0ID09IHN0YXJ0KQorCQllbnRyeS0+aXNfdGFyZ2V0ID0gMTsKKworCWl0ZXIuc3RhcnQgPSBlbnRyeTsKKworZG9fdGFpbDoKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQgd2UndmUgZ290OiBAaXRlci5zdGFydCA9IFtAc3RhcnQuLi5dIGJ1dCBAZW5kIGNhbiBzdGlsbCBiZQorCSAqIGluc2lkZSBvciBiZXlvbmQgaXQuCisJICovCisJZW50cnkgPSBpdGVyLnN0YXJ0OworCWZvciAoOzspIHsKKwkJLyoKKwkJICogSWYgQGVuZCBpcyBpbnNpZGUgQGVudHJ5LCBzcGxpdC4KKwkJICovCisJCWlmIChlbmQgPCBlbnRyeS0+ZW5kKSB7IC8qIHNwbGl0OiBbLi4uZW5kXVsuLi5lLT5lbmRdICovCisJCQlzdHJ1Y3QgYmxvY2tfcmFuZ2UgKnRhaWwgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBibG9ja19yYW5nZSkpOworCQkJaWYgKCF0YWlsKQorCQkJCXJldHVybiBpdGVyOworCisJCQkqdGFpbCA9IChzdHJ1Y3QgYmxvY2tfcmFuZ2UpeworCQkJCS5zdGFydAkJPSBlbmQgKyAxLAorCQkJCS5lbmQJCT0gZW50cnktPmVuZCwKKwkJCQkuaXNfdGFyZ2V0CT0gMCwKKwkJCQkuaXNfYnJhbmNoCT0gZW50cnktPmlzX2JyYW5jaCwKKworCQkJCS5jb3ZlcmFnZQk9IGVudHJ5LT5jb3ZlcmFnZSwKKwkJCQkudGFrZW4JCT0gZW50cnktPnRha2VuLAorCQkJCS5wcmVkCQk9IGVudHJ5LT5wcmVkLAorCQkJfTsKKworCQkJZW50cnktPmVuZAkJPSBlbmQ7CisJCQllbnRyeS0+aXNfYnJhbmNoCT0gMTsKKwkJCWVudHJ5LT50YWtlbgkJPSAwOworCQkJZW50cnktPnByZWQJCT0gMDsKKworCQkJcmJfbGlua19yaWdodF9vZl9ub2RlKCZ0YWlsLT5ub2RlLCAmZW50cnktPm5vZGUpOworCQkJcmJfaW5zZXJ0X2NvbG9yKCZ0YWlsLT5ub2RlLCAmYmxvY2tfcmFuZ2VzLnJvb3QpOworCQkJYmxvY2tfcmFuZ2VfX2RlYnVnKCk7CisKKwkJCWl0ZXIuZW5kID0gZW50cnk7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQkvKgorCQkgKiBJZiBAZW5kIG1hdGNoZXMgQGVudHJ5LCBkb25lCisJCSAqLworCQlpZiAoZW5kID09IGVudHJ5LT5lbmQpIHsKKwkJCWVudHJ5LT5pc19icmFuY2ggPSAxOworCQkJaXRlci5lbmQgPSBlbnRyeTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCW5leHQgPSBibG9ja19yYW5nZV9fbmV4dChlbnRyeSk7CisJCWlmICghbmV4dCkKKwkJCWdvdG8gYWRkX3RhaWw7CisKKwkJLyoKKwkJICogSWYgQGVuZCBpcyBpbiBiZXlvbmQgQGVudHJ5IGJ1dCBub3QgaW5zaWRlIEBuZXh0LCBhZGQgdGFpbC4KKwkJICovCisJCWlmIChlbmQgPCBuZXh0LT5zdGFydCkgeyAvKiBhZGQgdGFpbDogWy4uLmUtPmVuZF1bLi4uZW5kXSAqLworCQkJc3RydWN0IGJsb2NrX3JhbmdlICp0YWlsOworYWRkX3RhaWw6CisJCQl0YWlsID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYmxvY2tfcmFuZ2UpKTsKKwkJCWlmICghdGFpbCkKKwkJCQlyZXR1cm4gaXRlcjsKKworCQkJKnRhaWwgPSAoc3RydWN0IGJsb2NrX3JhbmdlKXsKKwkJCQkuc3RhcnQJCT0gZW50cnktPmVuZCArIDEsCisJCQkJLmVuZAkJPSBlbmQsCisJCQkJLmlzX3RhcmdldAk9IDAsCisJCQkJLmlzX2JyYW5jaAk9IDEsCisJCQl9OworCisJCQlyYl9saW5rX3JpZ2h0X29mX25vZGUoJnRhaWwtPm5vZGUsICZlbnRyeS0+bm9kZSk7CisJCQlyYl9pbnNlcnRfY29sb3IoJnRhaWwtPm5vZGUsICZibG9ja19yYW5nZXMucm9vdCk7CisJCQlibG9ja19yYW5nZV9fZGVidWcoKTsKKworCQkJaXRlci5lbmQgPSB0YWlsOworCQkJZ290byBkb25lOworCQl9CisKKwkJLyoKKwkJICogSWYgdGhlcmUgaXMgYSBob2xlIGJldHdlZW4gQGVudHJ5IGFuZCBAbmV4dCwgZmlsbCBpdC4KKwkJICovCisJCWlmIChlbnRyeS0+ZW5kICsgMSAhPSBuZXh0LT5zdGFydCkgeworCQkJc3RydWN0IGJsb2NrX3JhbmdlICpob2xlID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYmxvY2tfcmFuZ2UpKTsKKwkJCWlmICghaG9sZSkKKwkJCQlyZXR1cm4gaXRlcjsKKworCQkJKmhvbGUgPSAoc3RydWN0IGJsb2NrX3JhbmdlKXsKKwkJCQkuc3RhcnQJCT0gZW50cnktPmVuZCArIDEsCisJCQkJLmVuZAkJPSBuZXh0LT5zdGFydCAtIDEsCisJCQkJLmlzX3RhcmdldAk9IDAsCisJCQkJLmlzX2JyYW5jaAk9IDAsCisJCQl9OworCisJCQlyYl9saW5rX2xlZnRfb2Zfbm9kZSgmaG9sZS0+bm9kZSwgJm5leHQtPm5vZGUpOworCQkJcmJfaW5zZXJ0X2NvbG9yKCZob2xlLT5ub2RlLCAmYmxvY2tfcmFuZ2VzLnJvb3QpOworCQkJYmxvY2tfcmFuZ2VfX2RlYnVnKCk7CisJCX0KKworCQllbnRyeSA9IG5leHQ7CisJfQorCitkb25lOgorCWFzc2VydChpdGVyLnN0YXJ0LT5zdGFydCA9PSBzdGFydCAmJiBpdGVyLnN0YXJ0LT5pc190YXJnZXQpOworCWFzc2VydChpdGVyLmVuZC0+ZW5kID09IGVuZCAmJiBpdGVyLmVuZC0+aXNfYnJhbmNoKTsKKworCWJsb2NrX3Jhbmdlcy5ibG9ja3MrKzsKKworCXJldHVybiBpdGVyOworfQorCisKKy8qCisgKiBDb21wdXRlIGNvdmVyYWdlIGFzOgorICoKKyAqICAgIGJyLT5jb3ZlcmFnZSAvIGJyLT5zeW0tPm1heF9jb3ZlcmFnZQorICoKKyAqIFRoaXMgZW5zdXJlcyBlYWNoIHN5bWJvbCBoYXMgYSAxMDAlIHNwb3QsIHRvIHJlZmxlY3QgdGhhdCBlYWNoIHN5bWJvbCBoYXMgYQorICogbW9zdCBjb3ZlcmVkIHNlY3Rpb24uCisgKgorICogUmV0dXJucyBbMC0xXSBmb3IgY292ZXJhZ2UgYW5kIC0xIGlmIHdlIGhhZCBubyBkYXRhIHdoYXQgc28gZXZlciBvciB0aGUKKyAqIHN5bWJvbCBkb2VzIG5vdCBleGlzdC4KKyAqLworZG91YmxlIGJsb2NrX3JhbmdlX19jb3ZlcmFnZShzdHJ1Y3QgYmxvY2tfcmFuZ2UgKmJyKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKworCWlmICghYnIpIHsKKwkJaWYgKGJsb2NrX3Jhbmdlcy5ibG9ja3MpCisJCQlyZXR1cm4gMDsKKworCQlyZXR1cm4gLTE7CisJfQorCisJc3ltID0gYnItPnN5bTsKKwlpZiAoIXN5bSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIChkb3VibGUpYnItPmNvdmVyYWdlIC8gc3ltYm9sX19hbm5vdGF0aW9uKHN5bSktPm1heF9jb3ZlcmFnZTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ibG9jay1yYW5nZS5oIGIvdG9vbHMvcGVyZi91dGlsL2Jsb2NrLXJhbmdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThjODQxMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ibG9jay1yYW5nZS5oCkBAIC0wLDAgKzEsNzEgQEAKKyNpZm5kZWYgX19QRVJGX0JMT0NLX1JBTkdFX0gKKyNkZWZpbmUgX19QRVJGX0JMT0NLX1JBTkdFX0gKKworI2luY2x1ZGUgInN5bWJvbC5oIgorCisvKgorICogc3RydWN0IGJsb2NrX3JhbmdlIC0gbm9uLW92ZXJsYXBwaW5nIHBhcnRzIG9mIGJhc2ljIGJsb2NrcworICogQG5vZGU6CXRyZWVub2RlCisgKiBAc3RhcnQ6CWluY2x1c2l2ZSBzdGFydCBvZiByYW5nZQorICogQGVuZDoJaW5jbHVzaXZlIGVuZCBvZiByYW5nZQorICogQGlzX3RhcmdldDoJQHN0YXJ0IGlzIGEganVtcCB0YXJnZXQKKyAqIEBpc19icmFuY2g6CUBlbmQgaXMgYSBicmFuY2ggaW5zdHJ1Y3Rpb24KKyAqIEBjb3ZlcmFnZToJbnVtYmVyIG9mIGJsb2NrcyB0aGF0IGNvdmVyIHRoaXMgcmFuZ2UKKyAqIEB0YWtlbjoJbnVtYmVyIG9mIHRpbWVzIHRoZSBicmFuY2ggaXMgdGFrZW4gKHJlcXVpcmVzIEBpc19icmFuY2gpCisgKiBAcHJlZDoJbnVtYmVyIG9mIHRpbWVzIHRoZSB0YWtlbiBicmFuY2ggd2FzIHByZWRpY3RlZAorICovCitzdHJ1Y3QgYmxvY2tfcmFuZ2UgeworCXN0cnVjdCByYl9ub2RlIG5vZGU7CisKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisKKwl1NjQgc3RhcnQ7CisJdTY0IGVuZDsKKworCWludCBpc190YXJnZXQsIGlzX2JyYW5jaDsKKworCXU2NCBjb3ZlcmFnZTsKKwl1NjQgZW50cnk7CisJdTY0IHRha2VuOworCXU2NCBwcmVkOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYmxvY2tfcmFuZ2UgKmJsb2NrX3JhbmdlX19uZXh0KHN0cnVjdCBibG9ja19yYW5nZSAqYnIpCit7CisJc3RydWN0IHJiX25vZGUgKm4gPSByYl9uZXh0KCZici0+bm9kZSk7CisJaWYgKCFuKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gcmJfZW50cnkobiwgc3RydWN0IGJsb2NrX3JhbmdlLCBub2RlKTsKK30KKworc3RydWN0IGJsb2NrX3JhbmdlX2l0ZXIgeworCXN0cnVjdCBibG9ja19yYW5nZSAqc3RhcnQ7CisJc3RydWN0IGJsb2NrX3JhbmdlICplbmQ7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBibG9ja19yYW5nZSAqYmxvY2tfcmFuZ2VfaXRlcihzdHJ1Y3QgYmxvY2tfcmFuZ2VfaXRlciAqaXRlcikKK3sKKwlyZXR1cm4gaXRlci0+c3RhcnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBibG9ja19yYW5nZV9pdGVyX19uZXh0KHN0cnVjdCBibG9ja19yYW5nZV9pdGVyICppdGVyKQoreworCWlmIChpdGVyLT5zdGFydCA9PSBpdGVyLT5lbmQpCisJCXJldHVybiBmYWxzZTsKKworCWl0ZXItPnN0YXJ0ID0gYmxvY2tfcmFuZ2VfX25leHQoaXRlci0+c3RhcnQpOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgYmxvY2tfcmFuZ2VfaXRlcl9fdmFsaWQoc3RydWN0IGJsb2NrX3JhbmdlX2l0ZXIgKml0ZXIpCit7CisJaWYgKCFpdGVyLT5zdGFydCB8fCAhaXRlci0+ZW5kKQorCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiBzdHJ1Y3QgYmxvY2tfcmFuZ2UgKmJsb2NrX3JhbmdlX19maW5kKHU2NCBhZGRyKTsKK2V4dGVybiBzdHJ1Y3QgYmxvY2tfcmFuZ2VfaXRlciBibG9ja19yYW5nZV9fY3JlYXRlKHU2NCBzdGFydCwgdTY0IGVuZCk7CitleHRlcm4gZG91YmxlIGJsb2NrX3JhbmdlX19jb3ZlcmFnZShzdHJ1Y3QgYmxvY2tfcmFuZ2UgKmJyKTsKKworI2VuZGlmIC8qIF9fUEVSRl9CTE9DS19SQU5HRV9IICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvYnBmLWxvYWRlci5jIGIvdG9vbHMvcGVyZi91dGlsL2JwZi1sb2FkZXIuYwppbmRleCAxZjEyZTRlLi4yYjJjOWI4IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvYnBmLWxvYWRlci5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9icGYtbG9hZGVyLmMKQEAgLTUzMSw3ICs1MzEsNyBAQAogCiAJcHRldnMgPSBtYWxsb2MoYXJyYXlfc3opOwogCWlmICghcHRldnMpIHsKLQkJcHJfZGVidWcoIk5vIGVob3VnaCBtZW1vcnk6IGFsbG9jIHB0ZXZzIGZhaWxlZFxuIik7CisJCXByX2RlYnVnKCJObyBlbm91Z2ggbWVtb3J5OiBhbGxvYyBwdGV2cyBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9idWlsZC1pZC5jIGIvdG9vbHMvcGVyZi91dGlsL2J1aWxkLWlkLmMKaW5kZXggNTY1MWYzYy4uZTUyOGM0MCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2J1aWxkLWlkLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2J1aWxkLWlkLmMKQEAgLTYyMCw3ICs2MjAsNyBAQAogCiAJcmV0ID0gcHJvYmVfY2FjaGVfX3NjYW5fc2R0KGNhY2hlLCByZWFsbmFtZSk7CiAJaWYgKHJldCA+PSAwKSB7Ci0JCXByX2RlYnVnKCJGb3VuZCAlZCBTRFRzIGluICVzXG4iLCByZXQsIHJlYWxuYW1lKTsKKwkJcHJfZGVidWc0KCJGb3VuZCAlZCBTRFRzIGluICVzXG4iLCByZXQsIHJlYWxuYW1lKTsKIAkJaWYgKHByb2JlX2NhY2hlX19jb21taXQoY2FjaGUpIDwgMCkKIAkJCXJldCA9IC0xOwogCX0KQEAgLTY5MSw3ICs2OTEsNyBAQAogCiAJLyogVXBkYXRlIFNEVCBjYWNoZSA6IGVycm9yIGlzIGp1c3Qgd2FybmVkICovCiAJaWYgKGJ1aWxkX2lkX2NhY2hlX19hZGRfc2R0X2NhY2hlKHNidWlsZF9pZCwgcmVhbG5hbWUpIDwgMCkKLQkJcHJfZGVidWcoIkZhaWxlZCB0byB1cGRhdGUvc2NhbiBTRFQgY2FjaGUgZm9yICVzXG4iLCByZWFsbmFtZSk7CisJCXByX2RlYnVnNCgiRmFpbGVkIHRvIHVwZGF0ZS9zY2FuIFNEVCBjYWNoZSBmb3IgJXNcbiIsIHJlYWxuYW1lKTsKIAogb3V0X2ZyZWU6CiAJaWYgKCFpc19rYWxsc3ltcykKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9jcy1ldG0uaCBiL3Rvb2xzL3BlcmYvdXRpbC9jcy1ldG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2M2YmMzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL2NzLWV0bS5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQoQykgMjAxNSBMaW5hcm8gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEF1dGhvcjogTWF0aGlldSBQb2lyaWVyIDxtYXRoaWV1LnBvaXJpZXJAbGluYXJvLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgSU5DTFVERV9fVVRJTF9QRVJGX0NTX0VUTV9IX18KKyNkZWZpbmUgSU5DTFVERV9fVVRJTF9QRVJGX0NTX0VUTV9IX18KKworLyogVmVyc2lvbm5pbmcgaGVhZGVyIGluIGNhc2UgdGhpbmdzIG5lZWQgdHJvIGNoYW5nZSBpbiB0aGUgZnV0dXJlLiAgVGhhdCB3YXkKKyAqIGRlY29kaW5nIG9mIG9sZCBzbmFwc2hvdCBpcyBzdGlsbCBwb3NzaWJsZS4KKyAqLworZW51bSB7CisJLyogU3RhcnRpbmcgd2l0aCAweDAgKi8KKwlDU19IRUFERVJfVkVSU0lPTl8wLAorCS8qIFBNVS0+dHlwZSAoMzIgYml0KSwgdG90YWwgIyBvZiBDUFVzICgzMiBiaXQpICovCisJQ1NfUE1VX1RZUEVfQ1BVUywKKwlDU19FVE1fU05BUFNIT1QsCisJQ1NfSEVBREVSX1ZFUlNJT05fMF9NQVgsCit9OworCisvKiBCZWdpbm5pbmcgb2YgaGVhZGVyIGNvbW1vbiB0byBib3RoIEVUTXYzIGFuZCBWNCAqLworZW51bSB7CisJQ1NfRVRNX01BR0lDLAorCUNTX0VUTV9DUFUsCit9OworCisvKiBFVE12My9QVE0gbWV0YWRhdGEgKi8KK2VudW0geworCS8qIER5bmFtaWMsIGNvbmZpZ3VyYWJsZSBwYXJhbWV0ZXJzICovCisJQ1NfRVRNX0VUTUNSID0gQ1NfRVRNX0NQVSArIDEsCisJQ1NfRVRNX0VUTVRSQUNFSURSLAorCS8qIFJPLCB0YWtlbiBmcm9tIHN5c0ZTICovCisJQ1NfRVRNX0VUTUNDRVIsCisJQ1NfRVRNX0VUTUlEUiwKKwlDU19FVE1fUFJJVl9NQVgsCit9OworCisvKiBFVE12NCBtZXRhZGF0YSAqLworZW51bSB7CisJLyogRHluYW1pYywgY29uZmlndXJhYmxlIHBhcmFtZXRlcnMgKi8KKwlDU19FVE1WNF9UUkNDT05GSUdSID0gQ1NfRVRNX0NQVSArIDEsCisJQ1NfRVRNVjRfVFJDVFJBQ0VJRFIsCisJLyogUk8sIHRha2VuIGZyb20gc3lzRlMgKi8KKwlDU19FVE1WNF9UUkNJRFIwLAorCUNTX0VUTVY0X1RSQ0lEUjEsCisJQ1NfRVRNVjRfVFJDSURSMiwKKwlDU19FVE1WNF9UUkNJRFI4LAorCUNTX0VUTVY0X1RSQ0FVVEhTVEFUVVMsCisJQ1NfRVRNVjRfUFJJVl9NQVgsCit9OworCisjZGVmaW5lIEtpQih4KSAoKHgpICogMTAyNCkKKyNkZWZpbmUgTWlCKHgpICgoeCkgKiAxMDI0ICogMTAyNCkKKworI2RlZmluZSBDU19FVE1fSEVBREVSX1NJWkUgKENTX0hFQURFUl9WRVJTSU9OXzBfTUFYICogc2l6ZW9mKHU2NCkpCisKK3N0YXRpYyBjb25zdCB1NjQgX19wZXJmX2NzX2V0bXYzX21hZ2ljICAgPSAweDMwMzAzMDMwMzAzMDMwMzBVTEw7CitzdGF0aWMgY29uc3QgdTY0IF9fcGVyZl9jc19ldG12NF9tYWdpYyAgID0gMHg0MDQwNDA0MDQwNDA0MDQwVUxMOworI2RlZmluZSBDU19FVE1WM19QUklWX1NJWkUgKENTX0VUTV9QUklWX01BWCAqIHNpemVvZih1NjQpKQorI2RlZmluZSBDU19FVE1WNF9QUklWX1NJWkUgKENTX0VUTVY0X1BSSVZfTUFYICogc2l6ZW9mKHU2NCkpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2RhdGEtY29udmVydC1idC5jIGIvdG9vbHMvcGVyZi91dGlsL2RhdGEtY29udmVydC1idC5jCmluZGV4IDRmOTc5YmIuLjcxMjNmNGQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9kYXRhLWNvbnZlcnQtYnQuYworKysgYi90b29scy9wZXJmL3V0aWwvZGF0YS1jb252ZXJ0LWJ0LmMKQEAgLTQzNyw3ICs0MzcsNyBAQAogCWludCByZXQ7CiAKIAlpZiAobnJfZWxlbWVudHMgKiBzaXplb2YodTMyKSAhPSByYXdfc2l6ZSkKLQkJcHJfd2FybmluZygiSW5jb3JyZWN0IHJhd19zaXplICgldSkgaW4gYnBmIG91dHB1dCBldmVudCwgc2tpcCAlbHUgYnl0ZXNcbiIsCisJCXByX3dhcm5pbmcoIkluY29ycmVjdCByYXdfc2l6ZSAoJXUpIGluIGJwZiBvdXRwdXQgZXZlbnQsIHNraXAgJXp1IGJ5dGVzXG4iLAogCQkJICAgcmF3X3NpemUsIG5yX2VsZW1lbnRzICogc2l6ZW9mKHUzMikgLSByYXdfc2l6ZSk7CiAKIAlsZW5fdHlwZSA9IGJ0X2N0Zl9ldmVudF9jbGFzc19nZXRfZmllbGRfYnlfbmFtZShldmVudF9jbGFzcywgInJhd19sZW4iKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9kZWJ1Zy5jIGIvdG9vbHMvcGVyZi91dGlsL2RlYnVnLmMKaW5kZXggOGM0MjEyYS4uYzE4MzhiNiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2RlYnVnLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2RlYnVnLmMKQEAgLTYsNiArNiw3IEBACiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxhcGkvZGVidWcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lNjQuaD4KIAogI2luY2x1ZGUgImNhY2hlLmgiCiAjaW5jbHVkZSAiY29sb3IuaCIKQEAgLTE0LDkgKzE1LDYgQEAKICNpbmNsdWRlICJ1dGlsLmgiCiAjaW5jbHVkZSAidGFyZ2V0LmgiCiAKLSNkZWZpbmUgTlNFQ1NfUEVSX1NFQyAgMTAwMDAwMDAwMFVMTAotI2RlZmluZSBOU0VDU19QRVJfVVNFQyAxMDAwVUxMCi0KIGludCB2ZXJib3NlOwogYm9vbCBkdW1wX3RyYWNlID0gZmFsc2UsIHF1aWV0ID0gZmFsc2U7CiBpbnQgZGVidWdfb3JkZXJlZF9ldmVudHM7CkBAIC01NCw5ICs1Miw5IEBACiAJaW50IHJldCA9IDA7CiAJdTY0IHNlY3MsIHVzZWNzLCBuc2VjcyA9IHQ7CiAKLQlzZWNzICAgPSBuc2VjcyAvIE5TRUNTX1BFUl9TRUM7Ci0JbnNlY3MgLT0gc2VjcyAgKiBOU0VDU19QRVJfU0VDOwotCXVzZWNzICA9IG5zZWNzIC8gTlNFQ1NfUEVSX1VTRUM7CisJc2VjcyAgID0gbnNlY3MgLyBOU0VDX1BFUl9TRUM7CisJbnNlY3MgLT0gc2VjcyAgKiBOU0VDX1BFUl9TRUM7CisJdXNlY3MgID0gbnNlY3MgLyBOU0VDX1BFUl9VU0VDOwogCiAJcmV0ID0gZnByaW50ZihzdGRlcnIsICJbJTEzIiBQUkl1NjQgIi4lMDYiIFBSSXU2NCAiXSAiLAogCQkgICAgICBzZWNzLCB1c2Vjcyk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZHJ2X2NvbmZpZ3MuYyBiL3Rvb2xzL3BlcmYvdXRpbC9kcnZfY29uZmlncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NDdmMjgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvZHJ2X2NvbmZpZ3MuYwpAQCAtMCwwICsxLDc3IEBACisvKgorICogZHJ2X2NvbmZpZ3MuaDogSW50ZXJmYWNlIHRvIGFwcGx5IFBNVSBzcGVjaWZpYyBjb25maWd1cmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCwgTGluYXJvIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlICJkcnZfY29uZmlncy5oIgorI2luY2x1ZGUgImV2bGlzdC5oIgorI2luY2x1ZGUgImV2c2VsLmgiCisjaW5jbHVkZSAicG11LmgiCisKK3N0YXRpYyBpbnQKK3BlcmZfZXZzZWxfX2FwcGx5X2Rydl9jb25maWdzKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKKwkJCSAgICAgIHN0cnVjdCBwZXJmX2V2c2VsX2NvbmZpZ190ZXJtICoqZXJyX3Rlcm0pCit7CisJYm9vbCBmb3VuZCA9IGZhbHNlOworCWludCBlcnIgPSAwOworCXN0cnVjdCBwZXJmX2V2c2VsX2NvbmZpZ190ZXJtICp0ZXJtOworCXN0cnVjdCBwZXJmX3BtdSAqcG11ID0gTlVMTDsKKworCXdoaWxlICgocG11ID0gcGVyZl9wbXVfX3NjYW4ocG11KSkgIT0gTlVMTCkKKwkJaWYgKHBtdS0+dHlwZSA9PSBldnNlbC0+YXR0ci50eXBlKSB7CisJCQlmb3VuZCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0ZXJtLCAmZXZzZWwtPmNvbmZpZ190ZXJtcywgbGlzdCkgeworCQlpZiAodGVybS0+dHlwZSAhPSBQRVJGX0VWU0VMX19DT05GSUdfVEVSTV9EUlZfQ0ZHKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogV2UgaGF2ZSBhIGNvbmZpZ3VyYXRpb24gdGVybSwgcmVwb3J0IGFuIGVycm9yIGlmIHdlCisJCSAqIGNhbid0IGZpbmQgdGhlIFBNVSBvciBpZiB0aGUgUE1VIGRyaXZlciBkb2Vzbid0IHN1cHBvcnQKKwkJICogY21kIGxpbmUgZHJpdmVyIGNvbmZpZ3VyYXRpb24uCisJCSAqLworCQlpZiAoIWZvdW5kIHx8ICFwbXUtPnNldF9kcnZfY29uZmlnKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJKmVycl90ZXJtID0gdGVybTsKKwkJCWJyZWFrOworCQl9CisKKwkJZXJyID0gcG11LT5zZXRfZHJ2X2NvbmZpZyh0ZXJtKTsKKwkJaWYgKGVycikgeworCQkJKmVycl90ZXJtID0gdGVybTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGVycjsKK30KKworaW50IHBlcmZfZXZsaXN0X19hcHBseV9kcnZfY29uZmlncyhzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwKKwkJCQkgICBzdHJ1Y3QgcGVyZl9ldnNlbCAqKmVycl9ldnNlbCwKKwkJCQkgICBzdHJ1Y3QgcGVyZl9ldnNlbF9jb25maWdfdGVybSAqKmVycl90ZXJtKQoreworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbDsKKwlpbnQgZXJyID0gMDsKKworCWV2bGlzdF9fZm9yX2VhY2hfZW50cnkoZXZsaXN0LCBldnNlbCkgeworCQllcnIgPSBwZXJmX2V2c2VsX19hcHBseV9kcnZfY29uZmlncyhldnNlbCwgZXJyX3Rlcm0pOworCQlpZiAoZXJyKSB7CisJCQkqZXJyX2V2c2VsID0gZXZzZWw7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZHJ2X2NvbmZpZ3MuaCBiL3Rvb2xzL3BlcmYvdXRpbC9kcnZfY29uZmlncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYmM5YmEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvZHJ2X2NvbmZpZ3MuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogZHJ2X2NvbmZpZ3MuaDogSW50ZXJmYWNlIHRvIGFwcGx5IFBNVSBzcGVjaWZpYyBjb25maWd1cmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCwgTGluYXJvIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgX19QRVJGX0RSVl9DT05GSUdTX0gKKyNkZWZpbmUgX19QRVJGX0RSVl9DT05GSUdTX0gKKworI2luY2x1ZGUgImRydl9jb25maWdzLmgiCisjaW5jbHVkZSAiZXZsaXN0LmgiCisjaW5jbHVkZSAiZXZzZWwuaCIKKworaW50IHBlcmZfZXZsaXN0X19hcHBseV9kcnZfY29uZmlncyhzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwKKwkJCQkgICBzdHJ1Y3QgcGVyZl9ldnNlbCAqKmVycl9ldnNlbCwKKwkJCQkgICBzdHJ1Y3QgcGVyZl9ldnNlbF9jb25maWdfdGVybSAqKnRlcm0pOworI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZHNvLmMgYi90b29scy9wZXJmL3V0aWwvZHNvLmMKaW5kZXggNzc0ZjZlYy4uZDJjNmNkZCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2Rzby5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9kc28uYwpAQCAtMzYzLDYgKzM2Myw5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWlmICghaXNfcmVndWxhcl9maWxlKG5hbWUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWZkID0gZG9fb3BlbihuYW1lKTsKIAlmcmVlKG5hbWUpOwogCXJldHVybiBmZDsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9kd2FyZi1hdXguYyBiL3Rvb2xzL3BlcmYvdXRpbC9kd2FyZi1hdXguYwppbmRleCBhMzQ3YjE5Li40MWUwNjhlIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZHdhcmYtYXV4LmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2R3YXJmLWF1eC5jCkBAIC0xMzAsNiArMTMwLDIyIEBACiB9CiAKIC8qKgorICogZGllX2dldF9saW5rYWdlX25hbWUgLSBHZXQgdGhlIGxpbmthZ2UgbmFtZSBvZiB0aGUgb2JqZWN0CisgKiBAZHdfZGllOiBBIERJRSBvZiB0aGUgb2JqZWN0CisgKgorICogR2V0IHRoZSBsaW5rYWdlIG5hbWUgYXR0aXJpYnV0ZSBvZiBnaXZlbiBAZHdfZGllLgorICogRm9yIEMrKyBiaW5hcnksIHRoZSBsaW5rYWdlIG5hbWUgd2lsbCBiZSB0aGUgbWFuZ2xlZCBzeW1ib2wuCisgKi8KK2NvbnN0IGNoYXIgKmRpZV9nZXRfbGlua2FnZV9uYW1lKER3YXJmX0RpZSAqZHdfZGllKQoreworCUR3YXJmX0F0dHJpYnV0ZSBhdHRyOworCisJaWYgKGR3YXJmX2F0dHJfaW50ZWdyYXRlKGR3X2RpZSwgRFdfQVRfbGlua2FnZV9uYW1lLCAmYXR0cikgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGR3YXJmX2Zvcm1zdHJpbmcoJmF0dHIpOworfQorCisvKioKICAqIGRpZV9jb21wYXJlX25hbWUgLSBDb21wYXJlIGRpZW5hbWUgYW5kIHRuYW1lCiAgKiBAZHdfZGllOiBhIERJRQogICogQHRuYW1lOiBhIHN0cmluZyBvZiB0YXJnZXQgbmFtZQpAQCAtMTQ1LDE4ICsxNjEsMjYgQEAKIH0KIAogLyoqCi0gKiBkaWVfbWF0Y2hfbmFtZSAtIE1hdGNoIGRpZW5hbWUgYW5kIGdsb2IKKyAqIGRpZV9tYXRjaF9uYW1lIC0gTWF0Y2ggZGllbmFtZS9saW5rYWdlIG5hbWUgYW5kIGdsb2IKICAqIEBkd19kaWU6IGEgRElFCiAgKiBAZ2xvYjogYSBzdHJpbmcgb2YgdGFyZ2V0IGdsb2IgcGF0dGVybgogICoKICAqIEdsb2IgbWF0Y2hpbmcgdGhlIG5hbWUgb2YgQGR3X2RpZSBhbmQgQGdsb2IuIFJldHVybiBmYWxzZSBpZiBtYXRjaGluZyBmYWlsLgorICogVGhpcyBhbHNvIG1hdGNoIGxpbmthZ2UgbmFtZS4KICAqLwogYm9vbCBkaWVfbWF0Y2hfbmFtZShEd2FyZl9EaWUgKmR3X2RpZSwgY29uc3QgY2hhciAqZ2xvYikKIHsKIAljb25zdCBjaGFyICpuYW1lOwogCiAJbmFtZSA9IGR3YXJmX2RpZW5hbWUoZHdfZGllKTsKLQlyZXR1cm4gbmFtZSA/IHN0cmdsb2JtYXRjaChuYW1lLCBnbG9iKSA6IGZhbHNlOworCWlmIChuYW1lICYmIHN0cmdsb2JtYXRjaChuYW1lLCBnbG9iKSkKKwkJcmV0dXJuIHRydWU7CisJLyogZmFsbCBiYWNrIHRvIGNoZWNrIGxpbmthZ2UgbmFtZSAqLworCW5hbWUgPSBkaWVfZ2V0X2xpbmthZ2VfbmFtZShkd19kaWUpOworCWlmIChuYW1lICYmIHN0cmdsb2JtYXRjaChuYW1lLCBnbG9iKSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIC8qKgpAQCAtMTA4NSwzICsxMTA5LDE4MiBAQAogCXJldHVybiAtRU5PVFNVUDsKIH0KICNlbmRpZgorCisvKgorICogZGllX2hhc19sb2NsaXN0IC0gQ2hlY2sgaWYgRFdfQVRfbG9jYXRpb24gb2YgQHZyX2RpZSBpcyBhIGxvY2F0aW9uIGxpc3QKKyAqIEB2cl9kaWU6IGEgdmFyaWFibGUgRElFCisgKi8KK3N0YXRpYyBib29sIGRpZV9oYXNfbG9jbGlzdChEd2FyZl9EaWUgKnZyX2RpZSkKK3sKKwlEd2FyZl9BdHRyaWJ1dGUgbG9jOworCWludCB0YWcgPSBkd2FyZl90YWcodnJfZGllKTsKKworCWlmICh0YWcgIT0gRFdfVEFHX2Zvcm1hbF9wYXJhbWV0ZXIgJiYKKwkgICAgdGFnICE9IERXX1RBR192YXJpYWJsZSkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIChkd2FyZl9hdHRyX2ludGVncmF0ZSh2cl9kaWUsIERXX0FUX2xvY2F0aW9uLCAmbG9jKSAmJgorCQlkd2FyZl93aGF0Zm9ybSgmbG9jKSA9PSBEV19GT1JNX3NlY19vZmZzZXQpOworfQorCisvKgorICogZGllX2lzX29wdGltaXplZF90YXJnZXQgLSBDaGVjayBpZiB0YXJnZXQgcHJvZ3JhbSBpcyBjb21waWxlZCB3aXRoCisgKiBvcHRpbWl6YXRpb24KKyAqIEBjdV9kaWU6IGEgQ1UgRElFCisgKgorICogRm9yIGFueSBvYmplY3QgaW4gZ2l2ZW4gQ1Ugd2hvc2UgRFdfQVRfbG9jYXRpb24gaXMgYSBsb2NhdGlvbiBsaXN0LAorICogdGFyZ2V0IHByb2dyYW0gaXMgY29tcGlsZWQgd2l0aCBvcHRpbWl6YXRpb24uIFRoaXMgaXMgYXBwbGljYWJsZSB0bworICogY2xhbmcgYXMgd2VsbC4KKyAqLworYm9vbCBkaWVfaXNfb3B0aW1pemVkX3RhcmdldChEd2FyZl9EaWUgKmN1X2RpZSkKK3sKKwlEd2FyZl9EaWUgdG1wX2RpZTsKKworCWlmIChkaWVfaGFzX2xvY2xpc3QoY3VfZGllKSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoIWR3YXJmX2NoaWxkKGN1X2RpZSwgJnRtcF9kaWUpICYmCisJICAgIGRpZV9pc19vcHRpbWl6ZWRfdGFyZ2V0KCZ0bXBfZGllKSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoIWR3YXJmX3NpYmxpbmdvZihjdV9kaWUsICZ0bXBfZGllKSAmJgorCSAgICBkaWVfaXNfb3B0aW1pemVkX3RhcmdldCgmdG1wX2RpZSkpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCisvKgorICogZGllX3NlYXJjaF9pZHggLSBTZWFyY2ggaW5kZXggb2YgZ2l2ZW4gbGluZSBhZGRyZXNzCisgKiBAbGluZXM6IExpbmUgcmVjb3JkcyBvZiBzaW5nbGUgQ1UKKyAqIEBucl9saW5lczogTnVtYmVyIG9mIEBsaW5lcworICogQGFkZHI6IGFkZHJlc3Mgd2UgYXJlIGxvb2tpbmcgZm9yCisgKiBAaWR4OiBpbmRleCB0byBiZSBzZXQgYnkgdGhpcyBmdW5jdGlvbiAocmV0dXJuIHZhbHVlKQorICoKKyAqIFNlYXJjaCBmb3IgQGFkZHIgYnkgbG9vcGluZyBvdmVyIGV2ZXJ5IGxpbmVzIG9mIENVLiBJZiBhZGRyZXNzCisgKiBtYXRjaGVzLCBzZXQgaW5kZXggb2YgdGhhdCBsaW5lIGluIEBpZHguIE5vdGUgdGhhdCBzaW5nbGUgc291cmNlCisgKiBsaW5lIGNhbiBoYXZlIG11bHRpcGxlIGxpbmUgcmVjb3Jkcy4gaS5lLiBzaW5nbGUgc291cmNlIGxpbmUgY2FuCisgKiBoYXZlIG11bHRpcGxlIGluZGV4LgorICovCitzdGF0aWMgYm9vbCBkaWVfc2VhcmNoX2lkeChEd2FyZl9MaW5lcyAqbGluZXMsIHVuc2lnbmVkIGxvbmcgbnJfbGluZXMsCisJCQkgICBEd2FyZl9BZGRyIGFkZHIsIHVuc2lnbmVkIGxvbmcgKmlkeCkKK3sKKwl1bnNpZ25lZCBsb25nIGk7CisJRHdhcmZfQWRkciB0bXA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfbGluZXM7IGkrKykgeworCQlpZiAoZHdhcmZfbGluZWFkZHIoZHdhcmZfb25lc3JjbGluZShsaW5lcywgaSksICZ0bXApKQorCQkJcmV0dXJuIGZhbHNlOworCisJCWlmICh0bXAgPT0gYWRkcikgeworCQkJKmlkeCA9IGk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qCisgKiBkaWVfZ2V0X3Bvc3Rwcm9sb2d1ZV9hZGRyIC0gU2VhcmNoIG5leHQgYWRkcmVzcyBhZnRlciBmdW5jdGlvbiBwcm9sb2d1ZQorICogQGVudHJ5cGNfaWR4OiBlbnRyeXBjIGluZGV4CisgKiBAbGluZXM6IExpbmUgcmVjb3JkcyBvZiBzaW5nbGUgQ1UKKyAqIEBucl9saW5lczogTnVtYmVyIG9mIEBsaW5lcworICogQGhpZ25wYzogaGlnaCBQQyBhZGRyZXNzIG9mIGZ1bmN0aW9uCisgKiBAcG9zdHByb2xvZ3VlX2FkZHI6IE5leHQgYWRkcmVzcyBhZnRlciBmdW5jdGlvbiBwcm9sb2d1ZSAocmV0dXJuIHZhbHVlKQorICoKKyAqIExvb2sgZm9yIHByb2xvZ3VlLWVuZCBtYXJrZXIuIElmIHRoZXJlIGlzIG5vIGV4cGxpY2l0IG1hcmtlciwgcmV0dXJuCisgKiBhZGRyZXNzIG9mIG5leHQgbGluZSByZWNvcmQgb3IgbmV4dCBzb3VyY2UgbGluZS4KKyAqLworc3RhdGljIGJvb2wgZGllX2dldF9wb3N0cHJvbG9ndWVfYWRkcih1bnNpZ25lZCBsb25nIGVudHJ5cGNfaWR4LAorCQkJCSAgICAgIER3YXJmX0xpbmVzICpsaW5lcywKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIG5yX2xpbmVzLAorCQkJCSAgICAgIER3YXJmX0FkZHIgaGlnaHBjLAorCQkJCSAgICAgIER3YXJmX0FkZHIgKnBvc3Rwcm9sb2d1ZV9hZGRyKQoreworCXVuc2lnbmVkIGxvbmcgaTsKKwlpbnQgZW50cnlwY19sbm8sIGxubzsKKwlEd2FyZl9MaW5lICpsaW5lOworCUR3YXJmX0FkZHIgYWRkcjsKKwlib29sIHBfZW5kOworCisJLyogZW50cnlwY19sbm8gaXMgYWN0dWFsIHNvdXJjZSBsaW5lIG51bWJlciAqLworCWxpbmUgPSBkd2FyZl9vbmVzcmNsaW5lKGxpbmVzLCBlbnRyeXBjX2lkeCk7CisJaWYgKGR3YXJmX2xpbmVubyhsaW5lLCAmZW50cnlwY19sbm8pKQorCQlyZXR1cm4gZmFsc2U7CisKKwlmb3IgKGkgPSBlbnRyeXBjX2lkeDsgaSA8IG5yX2xpbmVzOyBpKyspIHsKKwkJbGluZSA9IGR3YXJmX29uZXNyY2xpbmUobGluZXMsIGkpOworCisJCWlmIChkd2FyZl9saW5lYWRkcihsaW5lLCAmYWRkcikgfHwKKwkJICAgIGR3YXJmX2xpbmVubyhsaW5lLCAmbG5vKSAgICB8fAorCQkgICAgZHdhcmZfbGluZXByb2xvZ3VlZW5kKGxpbmUsICZwX2VuZCkpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJLyogaGlnaHBjIGlzIGV4Y2x1c2l2ZS4gW2VudHJ5cGMsaGlnaHBjKSAqLworCQlpZiAoYWRkciA+PSBoaWdocGMpCisJCQlicmVhazsKKworCQkvKiBjbGFuZyBzdXBwb3J0cyBwcm9sb2d1ZS1lbmQgbWFya2VyICovCisJCWlmIChwX2VuZCkKKwkJCWJyZWFrOworCisJCS8qIEFjdHVhbCBuZXh0IGxpbmUgaW4gc291cmNlICovCisJCWlmIChsbm8gIT0gZW50cnlwY19sbm8pCisJCQlicmVhazsKKworCQkvKgorCQkgKiBTaW5nbGUgc291cmNlIGxpbmUgY2FuIGhhdmUgbXVsdGlwbGUgbGluZSByZWNvcmRzLgorCQkgKiBGb3IgRXhhbXBsZSwKKwkJICogICAgIHZvaWQgZm9vKCkgeyBwcmludGYoImhlbGxvXG4iKTsgfQorCQkgKiBjb250YWlucyB0d28gbGluZSByZWNvcmRzLiBPbmUgcG9pbnRzIHRvIGRlY2xhcmF0aW9uIGFuZAorCQkgKiBvdGhlciBwb2ludHMgdG8gcHJpbnRmKCkgbGluZS4gVmFyaWFibGUgJ2xubycgd29uJ3QgZ2V0CisJCSAqIGluY3JlbWVudGVkIGluIHRoaXMgY2FzZSBidXQgJ2knIHdpbGwuCisJCSAqLworCQlpZiAoaSAhPSBlbnRyeXBjX2lkeCkKKwkJCWJyZWFrOworCX0KKworCWR3YXJmX2xpbmVhZGRyKGxpbmUsIHBvc3Rwcm9sb2d1ZV9hZGRyKTsKKwlpZiAoKnBvc3Rwcm9sb2d1ZV9hZGRyID49IGhpZ2hwYykKKwkJZHdhcmZfbGluZWFkZHIoZHdhcmZfb25lc3JjbGluZShsaW5lcywgaSAtIDEpLAorCQkJICAgICAgIHBvc3Rwcm9sb2d1ZV9hZGRyKTsKKworCXJldHVybiB0cnVlOworfQorCisvKgorICogZGllX3NraXBfcHJvbG9ndWUgLSBVc2UgbmV4dCBhZGRyZXNzIGFmdGVyIHByb2xvZ3VlIGFzIHByb2JlIGxvY2F0aW9uCisgKiBAc3BfZGllOiBhIHN1YnByb2dyYW0gRElFCisgKiBAY3VfZGllOiBhIENVIERJRQorICogQGVudHJ5cGM6IGVudHJ5cGMgb2YgdGhlIGZ1bmN0aW9uCisgKgorICogRnVuY3Rpb24gcHJvbG9ndWUgcHJlcGFyZXMgc3RhY2sgYW5kIHJlZ2lzdGVycyBiZWZvcmUgZXhlY3V0aW5nIGZ1bmN0aW9uCisgKiBsb2dpYy4gV2hlbiB0YXJnZXQgcHJvZ3JhbSBpcyBjb21waWxlZCB3aXRob3V0IG9wdGltaXphdGlvbiwgZnVuY3Rpb24KKyAqIHBhcmFtZXRlciBpbmZvcm1hdGlvbiBpcyBvbmx5IHZhbGlkIGFmdGVyIHByb2xvZ3VlLiBXaGVuIHdlIHByb2JlIGVudHJ5cGMKKyAqIG9mIHRoZSBmdW5jdGlvbiwgYW5kIHRyeSB0byByZWNvcmQgZnVuY3Rpb24gcGFyYW1ldGVyLCBpdCBjb250YWlucworICogZ2FyYmFnZSB2YWx1ZS4KKyAqLwordm9pZCBkaWVfc2tpcF9wcm9sb2d1ZShEd2FyZl9EaWUgKnNwX2RpZSwgRHdhcmZfRGllICpjdV9kaWUsCisJCSAgICAgICBEd2FyZl9BZGRyICplbnRyeXBjKQoreworCXNpemVfdCBucl9saW5lcyA9IDA7CisJdW5zaWduZWQgbG9uZyBlbnRyeXBjX2lkeCA9IDA7CisJRHdhcmZfTGluZXMgKmxpbmVzID0gTlVMTDsKKwlEd2FyZl9BZGRyIHBvc3Rwcm9sb2d1ZV9hZGRyOworCUR3YXJmX0FkZHIgaGlnaHBjOworCisJaWYgKGR3YXJmX2hpZ2hwYyhzcF9kaWUsICZoaWdocGMpKQorCQlyZXR1cm47CisKKwlpZiAoZHdhcmZfZ2V0c3JjbGluZXMoY3VfZGllLCAmbGluZXMsICZucl9saW5lcykpCisJCXJldHVybjsKKworCWlmICghZGllX3NlYXJjaF9pZHgobGluZXMsIG5yX2xpbmVzLCAqZW50cnlwYywgJmVudHJ5cGNfaWR4KSkKKwkJcmV0dXJuOworCisJaWYgKCFkaWVfZ2V0X3Bvc3Rwcm9sb2d1ZV9hZGRyKGVudHJ5cGNfaWR4LCBsaW5lcywgbnJfbGluZXMsCisJCQkJICAgICAgIGhpZ2hwYywgJnBvc3Rwcm9sb2d1ZV9hZGRyKSkKKwkJcmV0dXJuOworCisJKmVudHJ5cGMgPSBwb3N0cHJvbG9ndWVfYWRkcjsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9kd2FyZi1hdXguaCBiL3Rvb2xzL3BlcmYvdXRpbC9kd2FyZi1hdXguaAppbmRleCBkYzBjZTFhLi44YWM1M2JmIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZHdhcmYtYXV4LmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2R3YXJmLWF1eC5oCkBAIC0zOCw2ICszOCw5IEBACiBpbnQgY3Vfd2Fsa19mdW5jdGlvbnNfYXQoRHdhcmZfRGllICpjdV9kaWUsIER3YXJmX0FkZHIgYWRkciwKIAkJCSBpbnQgKCpjYWxsYmFjaykoRHdhcmZfRGllICosIHZvaWQgKiksIHZvaWQgKmRhdGEpOwogCisvKiBHZXQgRFdfQVRfbGlua2FnZV9uYW1lIChzaG91bGQgYmUgTlVMTCBmb3IgQyBiaW5hcnkpICovCitjb25zdCBjaGFyICpkaWVfZ2V0X2xpbmthZ2VfbmFtZShEd2FyZl9EaWUgKmR3X2RpZSk7CisKIC8qIEVuc3VyZSB0aGF0IHRoaXMgRElFIGlzIGEgc3VicHJvZ3JhbSBhbmQgZGVmaW5pdGlvbiAobm90IGRlY2xhcmF0aW9uKSAqLwogYm9vbCBkaWVfaXNfZnVuY19kZWYoRHdhcmZfRGllICpkd19kaWUpOwogCkBAIC0xMjUsNCArMTI4LDEyIEBACiAvKiBHZXQgdGhlIG5hbWUgYW5kIHR5cGUgb2YgZ2l2ZW4gdmFyaWFibGUgRElFLCBzdG9yZWQgYXMgInR5cGVcdG5hbWUiICovCiBpbnQgZGllX2dldF92YXJuYW1lKER3YXJmX0RpZSAqdnJfZGllLCBzdHJ1Y3Qgc3RyYnVmICpidWYpOwogaW50IGRpZV9nZXRfdmFyX3JhbmdlKER3YXJmX0RpZSAqc3BfZGllLCBEd2FyZl9EaWUgKnZyX2RpZSwgc3RydWN0IHN0cmJ1ZiAqYnVmKTsKKworLyogQ2hlY2sgaWYgdGFyZ2V0IHByb2dyYW0gaXMgY29tcGlsZWQgd2l0aCBvcHRpbWl6YXRpb24gKi8KK2Jvb2wgZGllX2lzX29wdGltaXplZF90YXJnZXQoRHdhcmZfRGllICpjdV9kaWUpOworCisvKiBVc2UgbmV4dCBhZGRyZXNzIGFmdGVyIHByb2xvZ3VlIGFzIHByb2JlIGxvY2F0aW9uICovCit2b2lkIGRpZV9za2lwX3Byb2xvZ3VlKER3YXJmX0RpZSAqc3BfZGllLCBEd2FyZl9EaWUgKmN1X2RpZSwKKwkJICAgICAgIER3YXJmX0FkZHIgKmVudHJ5cGMpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9kd2FyZi1yZWdzLmMgYi90b29scy9wZXJmL3V0aWwvZHdhcmYtcmVncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYmM0YTgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvZHdhcmYtcmVncy5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBkd2FyZi1yZWdzLmMgOiBNYXBwaW5nIG9mIERXQVJGIGRlYnVnIHJlZ2lzdGVyIG51bWJlcnMgaW50byByZWdpc3RlciBuYW1lcy4KKyAqCisgKiBXcml0dGVuIGJ5OiBNYXNhbWkgSGlyYW1hdHN1IDxtaGlyYW1hdEBrZXJuZWwub3JnPgorICovCisKKyNpbmNsdWRlIDx1dGlsLmg+CisjaW5jbHVkZSA8ZGVidWcuaD4KKyNpbmNsdWRlIDxkd2FyZi1yZWdzLmg+CisjaW5jbHVkZSA8ZWxmLmg+CisKKyNpZm5kZWYgRU1fQUFSQ0g2NAorI2RlZmluZSBFTV9BQVJDSDY0CTE4MyAgLyogQVJNIDY0IGJpdCAqLworI2VuZGlmCisKKy8qIERlZmluZSBjb25zdCBjaGFyICoge2FyY2h9X3JlZ2lzdGVyX3RibFtdICovCisjZGVmaW5lIERFRklORV9EV0FSRl9SRUdTVFJfVEFCTEUKKyNpbmNsdWRlICIuLi9hcmNoL3g4Ni9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaCIKKyNpbmNsdWRlICIuLi9hcmNoL2FybS9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaCIKKyNpbmNsdWRlICIuLi9hcmNoL2FybTY0L2luY2x1ZGUvZHdhcmYtcmVncy10YWJsZS5oIgorI2luY2x1ZGUgIi4uL2FyY2gvc2gvaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmgiCisjaW5jbHVkZSAiLi4vYXJjaC9wb3dlcnBjL2luY2x1ZGUvZHdhcmYtcmVncy10YWJsZS5oIgorI2luY2x1ZGUgIi4uL2FyY2gvczM5MC9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaCIKKyNpbmNsdWRlICIuLi9hcmNoL3NwYXJjL2luY2x1ZGUvZHdhcmYtcmVncy10YWJsZS5oIgorI2luY2x1ZGUgIi4uL2FyY2gveHRlbnNhL2luY2x1ZGUvZHdhcmYtcmVncy10YWJsZS5oIgorCisjZGVmaW5lIF9fZ2V0X2R3YXJmX3JlZ3N0cih0YmwsIG4pICgoKG4pIDwgQVJSQVlfU0laRSh0YmwpKSA/ICh0YmwpWyhuKV0gOiBOVUxMKQorCisvKiBSZXR1cm4gYXJjaGl0ZWN0dXJlIGRlcGVuZGVudCByZWdpc3RlciBzdHJpbmcgKGZvciBrcHJvYmUtdHJhY2VyKSAqLworY29uc3QgY2hhciAqZ2V0X2R3YXJmX3JlZ3N0cih1bnNpZ25lZCBpbnQgbiwgdW5zaWduZWQgaW50IG1hY2hpbmUpCit7CisJc3dpdGNoIChtYWNoaW5lKSB7CisJY2FzZSBFTV9OT05FOgkvKiBHZW5lcmljIGFyY2ggLSB1c2UgaG9zdCBhcmNoICovCisJCXJldHVybiBnZXRfYXJjaF9yZWdzdHIobik7CisJY2FzZSBFTV8zODY6CisJCXJldHVybiBfX2dldF9kd2FyZl9yZWdzdHIoeDg2XzMyX3JlZ3N0cl90YmwsIG4pOworCWNhc2UgRU1fWDg2XzY0OgorCQlyZXR1cm4gX19nZXRfZHdhcmZfcmVnc3RyKHg4Nl82NF9yZWdzdHJfdGJsLCBuKTsKKwljYXNlIEVNX0FSTToKKwkJcmV0dXJuIF9fZ2V0X2R3YXJmX3JlZ3N0cihhcm1fcmVnc3RyX3RibCwgbik7CisJY2FzZSBFTV9BQVJDSDY0OgorCQlyZXR1cm4gX19nZXRfZHdhcmZfcmVnc3RyKGFhcmNoNjRfcmVnc3RyX3RibCwgbik7CisJY2FzZSBFTV9TSDoKKwkJcmV0dXJuIF9fZ2V0X2R3YXJmX3JlZ3N0cihzaF9yZWdzdHJfdGJsLCBuKTsKKwljYXNlIEVNX1MzOTA6CisJCXJldHVybiBfX2dldF9kd2FyZl9yZWdzdHIoczM5MF9yZWdzdHJfdGJsLCBuKTsKKwljYXNlIEVNX1BQQzoKKwljYXNlIEVNX1BQQzY0OgorCQlyZXR1cm4gX19nZXRfZHdhcmZfcmVnc3RyKHBvd2VycGNfcmVnc3RyX3RibCwgbik7CisJY2FzZSBFTV9TUEFSQzoKKwljYXNlIEVNX1NQQVJDVjk6CisJCXJldHVybiBfX2dldF9kd2FyZl9yZWdzdHIoc3BhcmNfcmVnc3RyX3RibCwgbik7CisJY2FzZSBFTV9YVEVOU0E6CisJCXJldHVybiBfX2dldF9kd2FyZl9yZWdzdHIoeHRlbnNhX3JlZ3N0cl90YmwsIG4pOworCWRlZmF1bHQ6CisJCXByX2VycigiRUxGIE1BQ0hJTkUgJXggaXMgbm90IHN1cHBvcnRlZC5cbiIsIG1hY2hpbmUpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5jIGIvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmMKaW5kZXggZTIwNDM4Yi4uOGFiMGQ3ZCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmMKQEAgLTEsNSArMSw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvbW1hbi5oPiAvKiBUbyBnZXQgdGhpbmdzIGxpa2UgTUFQX0hVR0VUTEIgZXZlbiBvbiBvbGRlciBsaWJjIGhlYWRlcnMgKi8KKyNpbmNsdWRlIDxhcGkvZnMvZnMuaD4KICNpbmNsdWRlICJldmVudC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAiaGlzdC5oIgpAQCAtMjQ4LDYgKzI0OSw4IEBACiAJYm9vbCB0cnVuY2F0aW9uID0gZmFsc2U7CiAJdW5zaWduZWQgbG9uZyBsb25nIHRpbWVvdXQgPSBwcm9jX21hcF90aW1lb3V0ICogMTAwMDAwMFVMTDsKIAlpbnQgcmMgPSAwOworCWNvbnN0IGNoYXIgKmh1Z2V0bGJmc19tbnQgPSBodWdldGxiZnNfX21vdW50cG9pbnQoKTsKKwlpbnQgaHVnZXRsYmZzX21udF9sZW4gPSBodWdldGxiZnNfbW50ID8gc3RybGVuKGh1Z2V0bGJmc19tbnQpIDogMDsKIAogCWlmIChtYWNoaW5lX19pc19kZWZhdWx0X2d1ZXN0KG1hY2hpbmUpKQogCQlyZXR1cm4gMDsKQEAgLTM0Myw2ICszNDYsMTIgQEAKIAkJaWYgKCFzdHJjbXAoZXhlY25hbWUsICIiKSkKIAkJCXN0cmNweShleGVjbmFtZSwgYW5vbnN0cik7CiAKKwkJaWYgKGh1Z2V0bGJmc19tbnRfbGVuICYmCisJCSAgICAhc3RybmNtcChleGVjbmFtZSwgaHVnZXRsYmZzX21udCwgaHVnZXRsYmZzX21udF9sZW4pKSB7CisJCQlzdHJjcHkoZXhlY25hbWUsIGFub25zdHIpOworCQkJZXZlbnQtPm1tYXAyLmZsYWdzIHw9IE1BUF9IVUdFVExCOworCQl9CisKIAkJc2l6ZSA9IHN0cmxlbihleGVjbmFtZSkgKyAxOwogCQltZW1jcHkoZXZlbnQtPm1tYXAyLmZpbGVuYW1lLCBleGVjbmFtZSwgc2l6ZSk7CiAJCXNpemUgPSBQRVJGX0FMSUdOKHNpemUsIHNpemVvZih1NjQpKTsKQEAgLTEyODYsNyArMTI5NSw3IEBACiAJCSAqIG11c3QgYmUgZG9uZSBwcmlvciB0byB1c2luZyBrZXJuZWwgbWFwcy4KIAkJICovCiAJCWlmIChsb2FkX21hcCkKLQkJCW1hcF9fbG9hZChhbC0+bWFwLCBtYWNoaW5lLT5zeW1ib2xfZmlsdGVyKTsKKwkJCW1hcF9fbG9hZChhbC0+bWFwKTsKIAkJYWwtPmFkZHIgPSBhbC0+bWFwLT5tYXBfaXAoYWwtPm1hcCwgYWwtPmFkZHIpOwogCX0KIH0KQEAgLTEyOTcsOCArMTMwNiw3IEBACiB7CiAJdGhyZWFkX19maW5kX2FkZHJfbWFwKHRocmVhZCwgY3B1bW9kZSwgdHlwZSwgYWRkciwgYWwpOwogCWlmIChhbC0+bWFwICE9IE5VTEwpCi0JCWFsLT5zeW0gPSBtYXBfX2ZpbmRfc3ltYm9sKGFsLT5tYXAsIGFsLT5hZGRyLAotCQkJCQkgICB0aHJlYWQtPm1nLT5tYWNoaW5lLT5zeW1ib2xfZmlsdGVyKTsKKwkJYWwtPnN5bSA9IG1hcF9fZmluZF9zeW1ib2woYWwtPm1hcCwgYWwtPmFkZHIpOwogCWVsc2UKIAkJYWwtPnN5bSA9IE5VTEw7CiB9CkBAIC0xMzU5LDggKzEzNjcsNyBAQAogCQkJYWwtPmZpbHRlcmVkIHw9ICgxIDw8IEhJU1RfRklMVEVSX19EU08pOwogCQl9CiAKLQkJYWwtPnN5bSA9IG1hcF9fZmluZF9zeW1ib2woYWwtPm1hcCwgYWwtPmFkZHIsCi0JCQkJCSAgIG1hY2hpbmUtPnN5bWJvbF9maWx0ZXIpOworCQlhbC0+c3ltID0gbWFwX19maW5kX3N5bWJvbChhbC0+bWFwLCBhbC0+YWRkcik7CiAJfQogCiAJaWYgKHN5bWJvbF9jb25mLnN5bV9saXN0ICYmCkBAIC0xNDE2LDUgKzE0MjMsNSBAQAogCWFsLT5zeW0gPSBOVUxMOwogCiAJaWYgKGFsLT5tYXApCi0JCWFsLT5zeW0gPSBtYXBfX2ZpbmRfc3ltYm9sKGFsLT5tYXAsIGFsLT5hZGRyLCBOVUxMKTsKKwkJYWwtPnN5bSA9IG1hcF9fZmluZF9zeW1ib2woYWwtPm1hcCwgYWwtPmFkZHIpOwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2V2bGlzdC5jIGIvdG9vbHMvcGVyZi91dGlsL2V2bGlzdC5jCmluZGV4IDA5N2IzZWQuLmVhMzRjNWEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9ldmxpc3QuYworKysgYi90b29scy9wZXJmL3V0aWwvZXZsaXN0LmMKQEAgLTEwMzIsMTYgKzEwMzIsMTggQEAKIH0KIAogc3RhdGljIGludCBwZXJmX2V2bGlzdF9fbW1hcF9wZXJfZXZzZWwoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsIGludCBpZHgsCi0JCQkJICAgICAgIHN0cnVjdCBtbWFwX3BhcmFtcyAqbXAsIGludCBjcHUsCisJCQkJICAgICAgIHN0cnVjdCBtbWFwX3BhcmFtcyAqbXAsIGludCBjcHVfaWR4LAogCQkJCSAgICAgICBpbnQgdGhyZWFkLCBpbnQgKl9vdXRwdXQsIGludCAqX291dHB1dF9iYWNrd2FyZCkKIHsKIAlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWw7CiAJaW50IHJldmVudDsKKwlpbnQgZXZsaXN0X2NwdSA9IGNwdV9tYXBfX2NwdShldmxpc3QtPmNwdXMsIGNwdV9pZHgpOwogCiAJZXZsaXN0X19mb3JfZWFjaF9lbnRyeShldmxpc3QsIGV2c2VsKSB7CiAJCXN0cnVjdCBwZXJmX21tYXAgKm1hcHMgPSBldmxpc3QtPm1tYXA7CiAJCWludCAqb3V0cHV0ID0gX291dHB1dDsKIAkJaW50IGZkOworCQlpbnQgY3B1OwogCiAJCWlmIChldnNlbC0+YXR0ci53cml0ZV9iYWNrd2FyZCkgewogCQkJb3V0cHV0ID0gX291dHB1dF9iYWNrd2FyZDsKQEAgLTEwNjAsNiArMTA2MiwxMCBAQAogCQlpZiAoZXZzZWwtPnN5c3RlbV93aWRlICYmIHRocmVhZCkKIAkJCWNvbnRpbnVlOwogCisJCWNwdSA9IGNwdV9tYXBfX2lkeChldnNlbC0+Y3B1cywgZXZsaXN0X2NwdSk7CisJCWlmIChjcHUgPT0gLTEpCisJCQljb250aW51ZTsKKwogCQlmZCA9IEZEKGV2c2VsLCBjcHUsIHRocmVhZCk7CiAKIAkJaWYgKCpvdXRwdXQgPT0gLTEpIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5jIGIvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmMKaW5kZXggZDliODBlZi4uMzgwZTg0YyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmMKQEAgLTUwNywxNyArNTA3LDE3IEBACiAJdTggb3AsIHJlc3VsdCwgdHlwZSA9IChjb25maWcgPj4gIDApICYgMHhmZjsKIAljb25zdCBjaGFyICplcnIgPSAidW5rbm93bi1leHQtaGFyZHdhcmUtY2FjaGUtdHlwZSI7CiAKLQlpZiAodHlwZSA+IFBFUkZfQ09VTlRfSFdfQ0FDSEVfTUFYKQorCWlmICh0eXBlID49IFBFUkZfQ09VTlRfSFdfQ0FDSEVfTUFYKQogCQlnb3RvIG91dF9lcnI7CiAKIAlvcCA9IChjb25maWcgPj4gIDgpICYgMHhmZjsKIAllcnIgPSAidW5rbm93bi1leHQtaGFyZHdhcmUtY2FjaGUtb3AiOwotCWlmIChvcCA+IFBFUkZfQ09VTlRfSFdfQ0FDSEVfT1BfTUFYKQorCWlmIChvcCA+PSBQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX01BWCkKIAkJZ290byBvdXRfZXJyOwogCiAJcmVzdWx0ID0gKGNvbmZpZyA+PiAxNikgJiAweGZmOwogCWVyciA9ICJ1bmtub3duLWV4dC1oYXJkd2FyZS1jYWNoZS1yZXN1bHQiOwotCWlmIChyZXN1bHQgPiBQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NQVgpCisJaWYgKHJlc3VsdCA+PSBQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NQVgpCiAJCWdvdG8gb3V0X2VycjsKIAogCWVyciA9ICJpbnZhbGlkLWNhY2hlIjsKQEAgLTEwNDUsMTUgKzEwNDUsMTUgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLWludCBwZXJmX2V2c2VsX19hcHBlbmRfZmlsdGVyKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKm9wLCBjb25zdCBjaGFyICpmaWx0ZXIpCitzdGF0aWMgaW50IHBlcmZfZXZzZWxfX2FwcGVuZF9maWx0ZXIoc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAorCQkJCSAgICAgY29uc3QgY2hhciAqZm10LCBjb25zdCBjaGFyICpmaWx0ZXIpCiB7CiAJY2hhciAqbmV3X2ZpbHRlcjsKIAogCWlmIChldnNlbC0+ZmlsdGVyID09IE5VTEwpCiAJCXJldHVybiBwZXJmX2V2c2VsX19zZXRfZmlsdGVyKGV2c2VsLCBmaWx0ZXIpOwogCi0JaWYgKGFzcHJpbnRmKCZuZXdfZmlsdGVyLCIoJXMpICVzICglcykiLCBldnNlbC0+ZmlsdGVyLCBvcCwgZmlsdGVyKSA+IDApIHsKKwlpZiAoYXNwcmludGYoJm5ld19maWx0ZXIsIGZtdCwgZXZzZWwtPmZpbHRlciwgZmlsdGVyKSA+IDApIHsKIAkJZnJlZShldnNlbC0+ZmlsdGVyKTsKIAkJZXZzZWwtPmZpbHRlciA9IG5ld19maWx0ZXI7CiAJCXJldHVybiAwOwpAQCAtMTA2Miw2ICsxMDYyLDE2IEBACiAJcmV0dXJuIC0xOwogfQogCitpbnQgcGVyZl9ldnNlbF9fYXBwZW5kX3RwX2ZpbHRlcihzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIGNvbnN0IGNoYXIgKmZpbHRlcikKK3sKKwlyZXR1cm4gcGVyZl9ldnNlbF9fYXBwZW5kX2ZpbHRlcihldnNlbCwgIiglcykgJiYgKCVzKSIsIGZpbHRlcik7Cit9CisKK2ludCBwZXJmX2V2c2VsX19hcHBlbmRfYWRkcl9maWx0ZXIoc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLCBjb25zdCBjaGFyICpmaWx0ZXIpCit7CisJcmV0dXJuIHBlcmZfZXZzZWxfX2FwcGVuZF9maWx0ZXIoZXZzZWwsICIlcywlcyIsIGZpbHRlcik7Cit9CisKIGludCBwZXJmX2V2c2VsX19lbmFibGUoc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsKQogewogCWludCBudGhyZWFkcyA9IHRocmVhZF9tYXBfX25yKGV2c2VsLT50aHJlYWRzKTsKQEAgLTE3MjgsNyArMTczOCw2IEBACiAJZGF0YS0+Y3B1ID0gZGF0YS0+cGlkID0gZGF0YS0+dGlkID0gLTE7CiAJZGF0YS0+c3RyZWFtX2lkID0gZGF0YS0+aWQgPSBkYXRhLT50aW1lID0gLTFVTEw7CiAJZGF0YS0+cGVyaW9kID0gZXZzZWwtPmF0dHIuc2FtcGxlX3BlcmlvZDsKLQlkYXRhLT53ZWlnaHQgPSAwOwogCWRhdGEtPmNwdW1vZGUgPSBldmVudC0+aGVhZGVyLm1pc2MgJiBQRVJGX1JFQ09SRF9NSVNDX0NQVU1PREVfTUFTSzsKIAogCWlmIChldmVudC0+aGVhZGVyLnR5cGUgIT0gUEVSRl9SRUNPUkRfU0FNUExFKSB7CkBAIC0xOTM1LDcgKzE5NDQsNiBAQAogCQl9CiAJfQogCi0JZGF0YS0+d2VpZ2h0ID0gMDsKIAlpZiAodHlwZSAmIFBFUkZfU0FNUExFX1dFSUdIVCkgewogCQlPVkVSRkxPV19DSEVDS191NjQoYXJyYXkpOwogCQlkYXRhLT53ZWlnaHQgPSAqYXJyYXk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZXZzZWwuaCBiL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5oCmluZGV4IDRkNDQxMjkuLmIxNTAzYjAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5oCkBAIC00Niw2ICs0Niw3IEBACiAJUEVSRl9FVlNFTF9fQ09ORklHX1RFUk1fSU5IRVJJVCwKIAlQRVJGX0VWU0VMX19DT05GSUdfVEVSTV9NQVhfU1RBQ0ssCiAJUEVSRl9FVlNFTF9fQ09ORklHX1RFUk1fT1ZFUldSSVRFLAorCVBFUkZfRVZTRUxfX0NPTkZJR19URVJNX0RSVl9DRkcsCiAJUEVSRl9FVlNFTF9fQ09ORklHX1RFUk1fTUFYLAogfTsKIApAQCAtNTcsNiArNTgsNyBAQAogCQl1NjQJZnJlcTsKIAkJYm9vbAl0aW1lOwogCQljaGFyCSpjYWxsZ3JhcGg7CisJCWNoYXIJKmRydl9jZmc7CiAJCXU2NAlzdGFja191c2VyOwogCQlpbnQJbWF4X3N0YWNrOwogCQlib29sCWluaGVyaXQ7CkBAIC0yMzMsOCArMjM1LDkgQEAKIAkJCSAgICAgICBib29sIHVzZV9zYW1wbGVfaWRlbnRpZmllcik7CiAKIGludCBwZXJmX2V2c2VsX19zZXRfZmlsdGVyKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgY29uc3QgY2hhciAqZmlsdGVyKTsKLWludCBwZXJmX2V2c2VsX19hcHBlbmRfZmlsdGVyKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKm9wLCBjb25zdCBjaGFyICpmaWx0ZXIpOworaW50IHBlcmZfZXZzZWxfX2FwcGVuZF90cF9maWx0ZXIoc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLCBjb25zdCBjaGFyICpmaWx0ZXIpOworaW50IHBlcmZfZXZzZWxfX2FwcGVuZF9hZGRyX2ZpbHRlcihzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCisJCQkJICAgY29uc3QgY2hhciAqZmlsdGVyKTsKIGludCBwZXJmX2V2c2VsX19hcHBseV9maWx0ZXIoc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLCBpbnQgbmNwdXMsIGludCBudGhyZWFkcywKIAkJCSAgICAgY29uc3QgY2hhciAqZmlsdGVyKTsKIGludCBwZXJmX2V2c2VsX19lbmFibGUoc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbF9mcHJpbnRmLmMgYi90b29scy9wZXJmL3V0aWwvZXZzZWxfZnByaW50Zi5jCmluZGV4IDM2NzRlNzcuLjY2MmEwYTYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbF9mcHJpbnRmLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2c2VsX2ZwcmludGYuYwpAQCAtMTIyLDkgKzEyMiw2IEBACiAJCQlpZiAoIW5vZGUpCiAJCQkJYnJlYWs7CiAKLQkJCWlmIChub2RlLT5zeW0gJiYgbm9kZS0+c3ltLT5pZ25vcmUpCi0JCQkJZ290byBuZXh0OwotCiAJCQlwcmludGVkICs9IGZwcmludGYoZnAsICIlLSouKnMiLCBsZWZ0X2FsaWdubWVudCwgbGVmdF9hbGlnbm1lbnQsICIgIik7CiAKIAkJCWlmIChwcmludF9pcCkKQEAgLTE1OCw3ICsxNTUsNyBAQAogCiAJCQlpZiAoIXByaW50X29uZWxpbmUpCiAJCQkJcHJpbnRlZCArPSBmcHJpbnRmKGZwLCAiXG4iKTsKLW5leHQ6CisKIAkJCWNhbGxjaGFpbl9jdXJzb3JfYWR2YW5jZShjdXJzb3IpOwogCQl9CiAJfQpAQCAtMTgxLDcgKzE3OCw3IEBACiAJaWYgKGN1cnNvciAhPSBOVUxMKSB7CiAJCXByaW50ZWQgKz0gc2FtcGxlX19mcHJpbnRmX2NhbGxjaGFpbihzYW1wbGUsIGxlZnRfYWxpZ25tZW50LAogCQkJCQkJICAgICBwcmludF9vcHRzLCBjdXJzb3IsIGZwKTsKLQl9IGVsc2UgaWYgKCEoYWwtPnN5bSAmJiBhbC0+c3ltLT5pZ25vcmUpKSB7CisJfSBlbHNlIHsKIAkJcHJpbnRlZCArPSBmcHJpbnRmKGZwLCAiJS0qLipzIiwgbGVmdF9hbGlnbm1lbnQsIGxlZnRfYWxpZ25tZW50LCAiICIpOwogCiAJCWlmIChwcmludF9pcCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9oZWFkZXIuYyBiL3Rvb2xzL3BlcmYvdXRpbC9oZWFkZXIuYwppbmRleCA4ZjBkYjQwLi44NWRkMGRiIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvaGVhZGVyLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2hlYWRlci5jCkBAIC04MjgsOCArODI4LDcgQEAKICAqIGRlZmF1bHQgZ2V0X2NwdWlkKCk6IG5vdGhpbmcgZ2V0cyByZWNvcmRlZAogICogYWN0dWFsIGltcGxlbWVudGF0aW9uIG11c3QgYmUgaW4gYXJjaC8kKEFSQ0gpL3V0aWwvaGVhZGVyLmMKICAqLwotaW50IF9fYXR0cmlidXRlX18gKCh3ZWFrKSkgZ2V0X2NwdWlkKGNoYXIgKmJ1ZmZlciBfX21heWJlX3VudXNlZCwKLQkJCQkgICAgIHNpemVfdCBzeiBfX21heWJlX3VudXNlZCkKK2ludCBfX3dlYWsgZ2V0X2NwdWlkKGNoYXIgKmJ1ZmZlciBfX21heWJlX3VudXNlZCwgc2l6ZV90IHN6IF9fbWF5YmVfdW51c2VkKQogewogCXJldHVybiAtMTsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmMgYi90b29scy9wZXJmL3V0aWwvaGlzdC5jCmluZGV4IGRlMTVkYmMuLmIwMjk5MmUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2hpc3QuYwpAQCAtMTc3LDggKzE3NywxMCBAQAogCWhpc3RzX19uZXdfY29sX2xlbihoaXN0cywgSElTVENfTE9DQUxfV0VJR0hULCAxMik7CiAJaGlzdHNfX25ld19jb2xfbGVuKGhpc3RzLCBISVNUQ19HTE9CQUxfV0VJR0hULCAxMik7CiAKLQlpZiAoaC0+c3JjbGluZSkKLQkJaGlzdHNfX25ld19jb2xfbGVuKGhpc3RzLCBISVNUQ19TUkNMSU5FLCBzdHJsZW4oaC0+c3JjbGluZSkpOworCWlmIChoLT5zcmNsaW5lKSB7CisJCWxlbiA9IE1BWChzdHJsZW4oaC0+c3JjbGluZSksIHN0cmxlbihzb3J0X3NyY2xpbmUuc2VfaGVhZGVyKSk7CisJCWhpc3RzX19uZXdfY29sX2xlbihoaXN0cywgSElTVENfU1JDTElORSwgbGVuKTsKKwl9CiAKIAlpZiAoaC0+c3JjZmlsZSkKIAkJaGlzdHNfX25ld19jb2xfbGVuKGhpc3RzLCBISVNUQ19TUkNGSUxFLCBzdHJsZW4oaC0+c3JjZmlsZSkpOwpAQCAtNDE3LDYgKzQxOSw4IEBACiAJfQogCUlOSVRfTElTVF9IRUFEKCZoZS0+cGFpcnMubm9kZSk7CiAJdGhyZWFkX19nZXQoaGUtPnRocmVhZCk7CisJaGUtPmhyb290X2luICA9IFJCX1JPT1Q7CisJaGUtPmhyb290X291dCA9IFJCX1JPT1Q7CiAKIAlpZiAoIXN5bWJvbF9jb25mLnJlcG9ydF9oaWVyYXJjaHkpCiAJCWhlLT5sZWFmID0gdHJ1ZTsKQEAgLTIxNDksNiArMjE1Myw1MCBAQAogCXJldHVybiBoZTsKIH0KIAorc3RhdGljIHN0cnVjdCBoaXN0X2VudHJ5ICphZGRfZHVtbXlfaGllcmFyY2h5X2VudHJ5KHN0cnVjdCBoaXN0cyAqaGlzdHMsCisJCQkJCQkgICAgc3RydWN0IHJiX3Jvb3QgKnJvb3QsCisJCQkJCQkgICAgc3RydWN0IGhpc3RfZW50cnkgKnBhaXIpCit7CisJc3RydWN0IHJiX25vZGUgKipwOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBoaXN0X2VudHJ5ICpoZTsKKwlzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQ7CisKKwlwID0gJnJvb3QtPnJiX25vZGU7CisJd2hpbGUgKCpwICE9IE5VTEwpIHsKKwkJaW50NjRfdCBjbXAgPSAwOworCisJCXBhcmVudCA9ICpwOworCQloZSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGhpc3RfZW50cnksIHJiX25vZGVfaW4pOworCisJCXBlcmZfaHBwX2xpc3RfX2Zvcl9lYWNoX3NvcnRfbGlzdChoZS0+aHBwX2xpc3QsIGZtdCkgeworCQkJY21wID0gZm10LT5jb2xsYXBzZShmbXQsIGhlLCBwYWlyKTsKKwkJCWlmIChjbXApCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFjbXApCisJCQlnb3RvIG91dDsKKworCQlpZiAoY21wIDwgMCkKKwkJCXAgPSAmcGFyZW50LT5yYl9sZWZ0OworCQllbHNlCisJCQlwID0gJnBhcmVudC0+cmJfcmlnaHQ7CisJfQorCisJaGUgPSBoaXN0X2VudHJ5X19uZXcocGFpciwgdHJ1ZSk7CisJaWYgKGhlKSB7CisJCXJiX2xpbmtfbm9kZSgmaGUtPnJiX25vZGVfaW4sIHBhcmVudCwgcCk7CisJCXJiX2luc2VydF9jb2xvcigmaGUtPnJiX25vZGVfaW4sIHJvb3QpOworCisJCWhlLT5kdW1teSA9IHRydWU7CisJCWhlLT5oaXN0cyA9IGhpc3RzOworCQltZW1zZXQoJmhlLT5zdGF0LCAwLCBzaXplb2YoaGUtPnN0YXQpKTsKKwkJaGlzdHNfX2luY19zdGF0cyhoaXN0cywgaGUpOworCX0KK291dDoKKwlyZXR1cm4gaGU7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgaGlzdF9lbnRyeSAqaGlzdHNfX2ZpbmRfZW50cnkoc3RydWN0IGhpc3RzICpoaXN0cywKIAkJCQkJICAgIHN0cnVjdCBoaXN0X2VudHJ5ICpoZSkKIHsKQEAgLTIxNzQsNiArMjIyMiw1MSBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgc3RydWN0IGhpc3RfZW50cnkgKmhpc3RzX19maW5kX2hpZXJhcmNoeV9lbnRyeShzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwKKwkJCQkJCSAgICAgIHN0cnVjdCBoaXN0X2VudHJ5ICpoZSkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbiA9IHJvb3QtPnJiX25vZGU7CisKKwl3aGlsZSAobikgeworCQlzdHJ1Y3QgaGlzdF9lbnRyeSAqaXRlcjsKKwkJc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10OworCQlpbnQ2NF90IGNtcCA9IDA7CisKKwkJaXRlciA9IHJiX2VudHJ5KG4sIHN0cnVjdCBoaXN0X2VudHJ5LCByYl9ub2RlX2luKTsKKwkJcGVyZl9ocHBfbGlzdF9fZm9yX2VhY2hfc29ydF9saXN0KGhlLT5ocHBfbGlzdCwgZm10KSB7CisJCQljbXAgPSBmbXQtPmNvbGxhcHNlKGZtdCwgaXRlciwgaGUpOworCQkJaWYgKGNtcCkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChjbXAgPCAwKQorCQkJbiA9IG4tPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGNtcCA+IDApCisJCQluID0gbi0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCXJldHVybiBpdGVyOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBoaXN0c19fbWF0Y2hfaGllcmFyY2h5KHN0cnVjdCByYl9yb290ICpsZWFkZXJfcm9vdCwKKwkJCQkgICBzdHJ1Y3QgcmJfcm9vdCAqb3RoZXJfcm9vdCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbmQ7CisJc3RydWN0IGhpc3RfZW50cnkgKnBvcywgKnBhaXI7CisKKwlmb3IgKG5kID0gcmJfZmlyc3QobGVhZGVyX3Jvb3QpOyBuZDsgbmQgPSByYl9uZXh0KG5kKSkgeworCQlwb3MgID0gcmJfZW50cnkobmQsIHN0cnVjdCBoaXN0X2VudHJ5LCByYl9ub2RlX2luKTsKKwkJcGFpciA9IGhpc3RzX19maW5kX2hpZXJhcmNoeV9lbnRyeShvdGhlcl9yb290LCBwb3MpOworCisJCWlmIChwYWlyKSB7CisJCQloaXN0X2VudHJ5X19hZGRfcGFpcihwYWlyLCBwb3MpOworCQkJaGlzdHNfX21hdGNoX2hpZXJhcmNoeSgmcG9zLT5ocm9vdF9pbiwgJnBhaXItPmhyb290X2luKTsKKwkJfQorCX0KK30KKwogLyoKICAqIExvb2sgZm9yIHBhaXJzIHRvIGxpbmsgdG8gdGhlIGxlYWRlciBidWNrZXRzIChoaXN0X2VudHJpZXMpOgogICovCkBAIC0yMTgzLDYgKzIyNzYsMTIgQEAKIAlzdHJ1Y3QgcmJfbm9kZSAqbmQ7CiAJc3RydWN0IGhpc3RfZW50cnkgKnBvcywgKnBhaXI7CiAKKwlpZiAoc3ltYm9sX2NvbmYucmVwb3J0X2hpZXJhcmNoeSkgeworCQkvKiBoaWVyYXJjaHkgcmVwb3J0IGFsd2F5cyBjb2xsYXBzZXMgZW50cmllcyAqLworCQlyZXR1cm4gaGlzdHNfX21hdGNoX2hpZXJhcmNoeSgmbGVhZGVyLT5lbnRyaWVzX2NvbGxhcHNlZCwKKwkJCQkJICAgICAgJm90aGVyLT5lbnRyaWVzX2NvbGxhcHNlZCk7CisJfQorCiAJaWYgKGhpc3RzX19oYXMobGVhZGVyLCBuZWVkX2NvbGxhcHNlKSkKIAkJcm9vdCA9ICZsZWFkZXItPmVudHJpZXNfY29sbGFwc2VkOwogCWVsc2UKQEAgLTIxOTcsNiArMjI5Niw1MCBAQAogCX0KIH0KIAorc3RhdGljIGludCBoaXN0c19fbGlua19oaWVyYXJjaHkoc3RydWN0IGhpc3RzICpsZWFkZXJfaGlzdHMsCisJCQkJIHN0cnVjdCBoaXN0X2VudHJ5ICpwYXJlbnQsCisJCQkJIHN0cnVjdCByYl9yb290ICpsZWFkZXJfcm9vdCwKKwkJCQkgc3RydWN0IHJiX3Jvb3QgKm90aGVyX3Jvb3QpCit7CisJc3RydWN0IHJiX25vZGUgKm5kOworCXN0cnVjdCBoaXN0X2VudHJ5ICpwb3MsICpsZWFkZXI7CisKKwlmb3IgKG5kID0gcmJfZmlyc3Qob3RoZXJfcm9vdCk7IG5kOyBuZCA9IHJiX25leHQobmQpKSB7CisJCXBvcyA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3QgaGlzdF9lbnRyeSwgcmJfbm9kZV9pbik7CisKKwkJaWYgKGhpc3RfZW50cnlfX2hhc19wYWlycyhwb3MpKSB7CisJCQlib29sIGZvdW5kID0gZmFsc2U7CisKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkobGVhZGVyLCAmcG9zLT5wYWlycy5oZWFkLCBwYWlycy5ub2RlKSB7CisJCQkJaWYgKGxlYWRlci0+aGlzdHMgPT0gbGVhZGVyX2hpc3RzKSB7CisJCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKCFmb3VuZCkKKwkJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSB7CisJCQlsZWFkZXIgPSBhZGRfZHVtbXlfaGllcmFyY2h5X2VudHJ5KGxlYWRlcl9oaXN0cywKKwkJCQkJCQkgICBsZWFkZXJfcm9vdCwgcG9zKTsKKwkJCWlmIChsZWFkZXIgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLTE7CisKKwkJCS8qIGRvIG5vdCBwb2ludCBwYXJlbnQgaW4gdGhlIHBvcyAqLworCQkJbGVhZGVyLT5wYXJlbnRfaGUgPSBwYXJlbnQ7CisKKwkJCWhpc3RfZW50cnlfX2FkZF9wYWlyKHBvcywgbGVhZGVyKTsKKwkJfQorCisJCWlmICghcG9zLT5sZWFmKSB7CisJCQlpZiAoaGlzdHNfX2xpbmtfaGllcmFyY2h5KGxlYWRlcl9oaXN0cywgbGVhZGVyLAorCQkJCQkJICAmbGVhZGVyLT5ocm9vdF9pbiwKKwkJCQkJCSAgJnBvcy0+aHJvb3RfaW4pIDwgMCkKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBMb29rIGZvciBlbnRyaWVzIGluIHRoZSBvdGhlciBoaXN0cyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgbGVhZGVyLCBpZgogICogd2UgZmluZCB0aGVtLCBqdXN0IGFkZCBhIGR1bW15IGVudHJ5IG9uIHRoZSBsZWFkZXIgaGlzdHMsIHdpdGggcGVyaW9kPTAsCkBAIC0yMjA4LDYgKzIzNTEsMTMgQEAKIAlzdHJ1Y3QgcmJfbm9kZSAqbmQ7CiAJc3RydWN0IGhpc3RfZW50cnkgKnBvcywgKnBhaXI7CiAKKwlpZiAoc3ltYm9sX2NvbmYucmVwb3J0X2hpZXJhcmNoeSkgeworCQkvKiBoaWVyYXJjaHkgcmVwb3J0IGFsd2F5cyBjb2xsYXBzZXMgZW50cmllcyAqLworCQlyZXR1cm4gaGlzdHNfX2xpbmtfaGllcmFyY2h5KGxlYWRlciwgTlVMTCwKKwkJCQkJICAgICAmbGVhZGVyLT5lbnRyaWVzX2NvbGxhcHNlZCwKKwkJCQkJICAgICAmb3RoZXItPmVudHJpZXNfY29sbGFwc2VkKTsKKwl9CisKIAlpZiAoaGlzdHNfX2hhcyhvdGhlciwgbmVlZF9jb2xsYXBzZSkpCiAJCXJvb3QgPSAmb3RoZXItPmVudHJpZXNfY29sbGFwc2VkOwogCWVsc2UKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmggYi90b29scy9wZXJmL3V0aWwvaGlzdC5oCmluZGV4IDBhMWVkZjEuLjk5MjhmZWQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2hpc3QuaApAQCAtMjMwLDcgKzIzMCw3IEBACiBzdHJ1Y3QgcGVyZl9ocHBfZm10IHsKIAljb25zdCBjaGFyICpuYW1lOwogCWludCAoKmhlYWRlcikoc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10LCBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwKLQkJICAgICAgc3RydWN0IGhpc3RzICpoaXN0cyk7CisJCSAgICAgIHN0cnVjdCBoaXN0cyAqaGlzdHMsIGludCBsaW5lLCBpbnQgKnNwYW4pOwogCWludCAoKndpZHRoKShzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQsIHN0cnVjdCBwZXJmX2hwcCAqaHBwLAogCQkgICAgIHN0cnVjdCBoaXN0cyAqaGlzdHMpOwogCWludCAoKmNvbG9yKShzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQsIHN0cnVjdCBwZXJmX2hwcCAqaHBwLApAQCAtMjU5LDYgKzI1OSw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCBmaWVsZHM7CiAJc3RydWN0IGxpc3RfaGVhZCBzb3J0czsKIAorCWludCBucl9oZWFkZXJfbGluZXM7CiAJaW50IG5lZWRfY29sbGFwc2U7CiAJaW50IHBhcmVudDsKIAlpbnQgc3ltOwpAQCAtMzY3LDYgKzM2OCw3IEBACiB2b2lkIHBlcmZfaHBwX19yZXNldF93aWR0aChzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQsIHN0cnVjdCBoaXN0cyAqaGlzdHMpOwogdm9pZCBwZXJmX2hwcF9fcmVzZXRfc29ydF93aWR0aChzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQsIHN0cnVjdCBoaXN0cyAqaGlzdHMpOwogdm9pZCBwZXJmX2hwcF9fc2V0X3VzZXJfd2lkdGgoY29uc3QgY2hhciAqd2lkdGhfbGlzdF9zdHIpOwordm9pZCBoaXN0c19fcmVzZXRfY29sdW1uX3dpZHRoKHN0cnVjdCBoaXN0cyAqaGlzdHMpOwogCiB0eXBlZGVmIHU2NCAoKmhwcF9maWVsZF9mbikoc3RydWN0IGhpc3RfZW50cnkgKmhlKTsKIHR5cGVkZWYgaW50ICgqaHBwX2NhbGxiYWNrX2ZuKShzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwgYm9vbCBmcm9udCk7CkBAIC00ODMsNSArNDg1LDEwIEBACiAjZGVmaW5lIEhJRVJBUkNIWV9JTkRFTlQgIDMKIAogYm9vbCBoaXN0X2VudHJ5X19oYXNfaGllcmFyY2h5X2NoaWxkcmVuKHN0cnVjdCBoaXN0X2VudHJ5ICpoZSwgZmxvYXQgbGltaXQpOworaW50IGhwcF9jb2xvcl9zY25wcmludGYoc3RydWN0IHBlcmZfaHBwICpocHAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK2ludCBfX2hwcF9fc2xzbWdfY29sb3JfcHJpbnRmKHN0cnVjdCBwZXJmX2hwcCAqaHBwLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitpbnQgX19oaXN0X2VudHJ5X19zbnByaW50ZihzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUsIHN0cnVjdCBwZXJmX2hwcCAqaHBwLAorCQkJICAgc3RydWN0IHBlcmZfaHBwX2xpc3QgKmhwcF9saXN0KTsKK2ludCBoaXN0c19fZnByaW50Zl9oZWFkZXJzKHN0cnVjdCBoaXN0cyAqaGlzdHMsIEZJTEUgKmZwKTsKIAogI2VuZGlmCS8qIF9fUEVSRl9ISVNUX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9pbmNsdWRlL2R3YXJmLXJlZ3MuaCBiL3Rvb2xzL3BlcmYvdXRpbC9pbmNsdWRlL2R3YXJmLXJlZ3MuaAppbmRleCAwN2M2NDRlLi40M2JmZDhkIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvaW5jbHVkZS9kd2FyZi1yZWdzLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2luY2x1ZGUvZHdhcmYtcmVncy5oCkBAIC0zLDYgKzMsMTIgQEAKIAogI2lmZGVmIEhBVkVfRFdBUkZfU1VQUE9SVAogY29uc3QgY2hhciAqZ2V0X2FyY2hfcmVnc3RyKHVuc2lnbmVkIGludCBuKTsKKy8qCisgKiBnZXRfZHdhcmZfcmVnc3RyIC0gUmV0dXJucyBmdHJhY2UgcmVnaXN0ZXIgc3RyaW5nIGZyb20gRFdBUkYgcmVnbnVtCisgKiBuOiBEV0FSRiByZWdpc3RlciBudW1iZXIKKyAqIG1hY2hpbmU6IEVMRiBtYWNoaW5lIHNpZ25hdHVyZSAoRU1fKikKKyAqLworY29uc3QgY2hhciAqZ2V0X2R3YXJmX3JlZ3N0cih1bnNpZ25lZCBpbnQgbiwgdW5zaWduZWQgaW50IG1hY2hpbmUpOwogI2VuZGlmCiAKICNpZmRlZiBIQVZFX0FSQ0hfUkVHU19RVUVSWV9SRUdJU1RFUl9PRkZTRVQKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9pbnRlbC1idHMuYyBiL3Rvb2xzL3BlcmYvdXRpbC9pbnRlbC1idHMuYwppbmRleCA3NDllNmYyLi5mNTQ1ZWMxIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvaW50ZWwtYnRzLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2ludGVsLWJ0cy5jCkBAIC0zNDYsNyArMzQ2LDcgQEAKIAkJZ290byBvdXRfcHV0OwogCiAJLyogTG9hZCBtYXBzIHRvIGVuc3VyZSBkc28tPmlzXzY0X2JpdCBoYXMgYmVlbiB1cGRhdGVkICovCi0JbWFwX19sb2FkKGFsLm1hcCwgbWFjaGluZS0+c3ltYm9sX2ZpbHRlcik7CisJbWFwX19sb2FkKGFsLm1hcCk7CiAKIAl4ODZfNjQgPSBhbC5tYXAtPmRzby0+aXNfNjRfYml0OwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaW50ZWwtcHQtZGVjb2Rlci9pbnRlbC1wdC1kZWNvZGVyLmMgYi90b29scy9wZXJmL3V0aWwvaW50ZWwtcHQtZGVjb2Rlci9pbnRlbC1wdC1kZWNvZGVyLmMKaW5kZXggOWM4ZjE1ZC4uNzU5MWEwYyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2ludGVsLXB0LWRlY29kZXIvaW50ZWwtcHQtZGVjb2Rlci5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9pbnRlbC1wdC1kZWNvZGVyL2ludGVsLXB0LWRlY29kZXIuYwpAQCAtODAsNiArODAsNyBAQAogCWludCAoKndhbGtfaW5zbikoc3RydWN0IGludGVsX3B0X2luc24gKmludGVsX3B0X2luc24sCiAJCQkgdWludDY0X3QgKmluc25fY250X3B0ciwgdWludDY0X3QgKmlwLCB1aW50NjRfdCB0b19pcCwKIAkJCSB1aW50NjRfdCBtYXhfaW5zbl9jbnQsIHZvaWQgKmRhdGEpOworCWJvb2wgKCpwZ2RfaXApKHVpbnQ2NF90IGlwLCB2b2lkICpkYXRhKTsKIAl2b2lkICpkYXRhOwogCXN0cnVjdCBpbnRlbF9wdF9zdGF0ZSBzdGF0ZTsKIAljb25zdCB1bnNpZ25lZCBjaGFyICpidWY7CkBAIC0xMjMsOCArMTI0LDYgQEAKIAlib29sIGhhdmVfY2FsY19jeWNfdG9fdHNjOwogCWludCBleGVjX21vZGU7CiAJdW5zaWduZWQgaW50IGluc25fYnl0ZXM7Ci0JdWludDY0X3Qgc2lnbl9iaXQ7Ci0JdWludDY0X3Qgc2lnbl9iaXRzOwogCXVpbnQ2NF90IHBlcmlvZDsKIAllbnVtIGludGVsX3B0X3BlcmlvZF90eXBlIHBlcmlvZF90eXBlOwogCXVpbnQ2NF90IHRvdF9pbnNuX2NudDsKQEAgLTE4OCwxMiArMTg3LDEwIEBACiAKIAlkZWNvZGVyLT5nZXRfdHJhY2UgICAgICAgICAgPSBwYXJhbXMtPmdldF90cmFjZTsKIAlkZWNvZGVyLT53YWxrX2luc24gICAgICAgICAgPSBwYXJhbXMtPndhbGtfaW5zbjsKKwlkZWNvZGVyLT5wZ2RfaXAgICAgICAgICAgICAgPSBwYXJhbXMtPnBnZF9pcDsKIAlkZWNvZGVyLT5kYXRhICAgICAgICAgICAgICAgPSBwYXJhbXMtPmRhdGE7CiAJZGVjb2Rlci0+cmV0dXJuX2NvbXByZXNzaW9uID0gcGFyYW1zLT5yZXR1cm5fY29tcHJlc3Npb247CiAKLQlkZWNvZGVyLT5zaWduX2JpdCAgICAgICAgICAgPSAodWludDY0X3QpMSA8PCA0NzsKLQlkZWNvZGVyLT5zaWduX2JpdHMgICAgICAgICAgPSB+KCgodWludDY0X3QpMSA8PCA0OCkgLSAxKTsKLQogCWRlY29kZXItPnBlcmlvZCAgICAgICAgICAgICA9IHBhcmFtcy0+cGVyaW9kOwogCWRlY29kZXItPnBlcmlvZF90eXBlICAgICAgICA9IHBhcmFtcy0+cGVyaW9kX3R5cGU7CiAKQEAgLTM2MiwyMSArMzU5LDMwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1aW50NjRfdCBpbnRlbF9wdF9jYWxjX2lwKHN0cnVjdCBpbnRlbF9wdF9kZWNvZGVyICpkZWNvZGVyLAotCQkJCSBjb25zdCBzdHJ1Y3QgaW50ZWxfcHRfcGt0ICpwYWNrZXQsCitzdGF0aWMgdWludDY0X3QgaW50ZWxfcHRfY2FsY19pcChjb25zdCBzdHJ1Y3QgaW50ZWxfcHRfcGt0ICpwYWNrZXQsCiAJCQkJIHVpbnQ2NF90IGxhc3RfaXApCiB7CiAJdWludDY0X3QgaXA7CiAKIAlzd2l0Y2ggKHBhY2tldC0+Y291bnQpIHsKLQljYXNlIDI6CisJY2FzZSAxOgogCQlpcCA9IChsYXN0X2lwICYgKHVpbnQ2NF90KTB4ZmZmZmZmZmZmZmZmMDAwMFVMTCkgfAogCQkgICAgIHBhY2tldC0+cGF5bG9hZDsKIAkJYnJlYWs7Ci0JY2FzZSA0OgorCWNhc2UgMjoKIAkJaXAgPSAobGFzdF9pcCAmICh1aW50NjRfdCkweGZmZmZmZmZmMDAwMDAwMDBVTEwpIHwKIAkJICAgICBwYWNrZXQtPnBheWxvYWQ7CiAJCWJyZWFrOworCWNhc2UgMzoKKwkJaXAgPSBwYWNrZXQtPnBheWxvYWQ7CisJCS8qIFNpZ24tZXh0ZW5kIDYtYnl0ZSBpcCAqLworCQlpZiAoaXAgJiAodWludDY0X3QpMHg4MDAwMDAwMDAwMDBVTEwpCisJCQlpcCB8PSAodWludDY0X3QpMHhmZmZmMDAwMDAwMDAwMDAwVUxMOworCQlicmVhazsKKwljYXNlIDQ6CisJCWlwID0gKGxhc3RfaXAgJiAodWludDY0X3QpMHhmZmZmMDAwMDAwMDAwMDAwVUxMKSB8CisJCSAgICAgcGFja2V0LT5wYXlsb2FkOworCQlicmVhazsKIAljYXNlIDY6CiAJCWlwID0gcGFja2V0LT5wYXlsb2FkOwogCQlicmVhazsKQEAgLTM4NCwxNiArMzkwLDEyIEBACiAJCXJldHVybiAwOwogCX0KIAotCWlmIChpcCAmIGRlY29kZXItPnNpZ25fYml0KQotCQlyZXR1cm4gaXAgfCBkZWNvZGVyLT5zaWduX2JpdHM7Ci0KIAlyZXR1cm4gaXA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbnRlbF9wdF9zZXRfbGFzdF9pcChzdHJ1Y3QgaW50ZWxfcHRfZGVjb2RlciAqZGVjb2RlcikKIHsKLQlkZWNvZGVyLT5sYXN0X2lwID0gaW50ZWxfcHRfY2FsY19pcChkZWNvZGVyLCAmZGVjb2Rlci0+cGFja2V0LAotCQkJCQkgICAgZGVjb2Rlci0+bGFzdF9pcCk7CisJZGVjb2Rlci0+bGFzdF9pcCA9IGludGVsX3B0X2NhbGNfaXAoJmRlY29kZXItPnBhY2tldCwgZGVjb2Rlci0+bGFzdF9pcCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbnRlbF9wdF9zZXRfaXAoc3RydWN0IGludGVsX3B0X2RlY29kZXIgKmRlY29kZXIpCkBAIC0xMDA4LDYgKzEwMTAsMTkgQEAKIAlpbnQgZXJyOwogCiAJZXJyID0gaW50ZWxfcHRfd2Fsa19pbnNuKGRlY29kZXIsICZpbnRlbF9wdF9pbnNuLCAwKTsKKwlpZiAoZXJyID09IElOVEVMX1BUX1JFVFVSTiAmJgorCSAgICBkZWNvZGVyLT5wZ2RfaXAgJiYKKwkgICAgZGVjb2Rlci0+cGt0X3N0YXRlID09IElOVEVMX1BUX1NUQVRFX1RJUF9QR0QgJiYKKwkgICAgKGRlY29kZXItPnN0YXRlLnR5cGUgJiBJTlRFTF9QVF9CUkFOQ0gpICYmCisJICAgIGRlY29kZXItPnBnZF9pcChkZWNvZGVyLT5zdGF0ZS50b19pcCwgZGVjb2Rlci0+ZGF0YSkpIHsKKwkJLyogVW5jb25kaXRpb25hbCBicmFuY2ggbGVhdmluZyBmaWx0ZXIgcmVnaW9uICovCisJCWRlY29kZXItPm5vX3Byb2dyZXNzID0gMDsKKwkJZGVjb2Rlci0+cGdlID0gZmFsc2U7CisJCWRlY29kZXItPmNvbnRpbnVvdXNfcGVyaW9kID0gZmFsc2U7CisJCWRlY29kZXItPnBrdF9zdGF0ZSA9IElOVEVMX1BUX1NUQVRFX0lOX1NZTkM7CisJCWRlY29kZXItPnN0YXRlLnRvX2lwID0gMDsKKwkJcmV0dXJuIDA7CisJfQogCWlmIChlcnIgPT0gSU5URUxfUFRfUkVUVVJOKQogCQlyZXR1cm4gMDsKIAlpZiAoZXJyKQpAQCAtMTAzNiw2ICsxMDUxLDIxIEBACiAJfQogCiAJaWYgKGludGVsX3B0X2luc24uYnJhbmNoID09IElOVEVMX1BUX0JSX0NPTkRJVElPTkFMKSB7CisJCXVpbnQ2NF90IHRvX2lwID0gZGVjb2Rlci0+aXAgKyBpbnRlbF9wdF9pbnNuLmxlbmd0aCArCisJCQkJIGludGVsX3B0X2luc24ucmVsOworCisJCWlmIChkZWNvZGVyLT5wZ2RfaXAgJiYKKwkJICAgIGRlY29kZXItPnBrdF9zdGF0ZSA9PSBJTlRFTF9QVF9TVEFURV9USVBfUEdEICYmCisJCSAgICBkZWNvZGVyLT5wZ2RfaXAodG9faXAsIGRlY29kZXItPmRhdGEpKSB7CisJCQkvKiBDb25kaXRpb25hbCBicmFuY2ggbGVhdmluZyBmaWx0ZXIgcmVnaW9uICovCisJCQlkZWNvZGVyLT5wZ2UgPSBmYWxzZTsKKwkJCWRlY29kZXItPmNvbnRpbnVvdXNfcGVyaW9kID0gZmFsc2U7CisJCQlkZWNvZGVyLT5wa3Rfc3RhdGUgPSBJTlRFTF9QVF9TVEFURV9JTl9TWU5DOworCQkJZGVjb2Rlci0+aXAgPSB0b19pcDsKKwkJCWRlY29kZXItPnN0YXRlLmZyb21faXAgPSBkZWNvZGVyLT5pcDsKKwkJCWRlY29kZXItPnN0YXRlLnRvX2lwID0gMDsKKwkJCXJldHVybiAwOworCQl9CiAJCWludGVsX3B0X2xvZ19hdCgiRVJST1I6IENvbmRpdGlvbmFsIGJyYW5jaCB3aGVuIGV4cGVjdGluZyBpbmRpcmVjdCBicmFuY2giLAogCQkJCWRlY29kZXItPmlwKTsKIAkJZGVjb2Rlci0+cGt0X3N0YXRlID0gSU5URUxfUFRfU1RBVEVfRVJSX1JFU1lOQzsKQEAgLTE2NTcsNiArMTY4NywxMiBAQAogCX0KIH0KIAorc3RhdGljIGlubGluZSBib29sIGludGVsX3B0X2hhdmVfaXAoc3RydWN0IGludGVsX3B0X2RlY29kZXIgKmRlY29kZXIpCit7CisJcmV0dXJuIGRlY29kZXItPmxhc3RfaXAgfHwgZGVjb2Rlci0+cGFja2V0LmNvdW50ID09IDAgfHwKKwkgICAgICAgZGVjb2Rlci0+cGFja2V0LmNvdW50ID09IDMgfHwgZGVjb2Rlci0+cGFja2V0LmNvdW50ID09IDY7Cit9CisKIC8qIFdhbGsgUFNCKyBwYWNrZXRzIHRvIGdldCBpbiBzeW5jLiAqLwogc3RhdGljIGludCBpbnRlbF9wdF93YWxrX3BzYihzdHJ1Y3QgaW50ZWxfcHRfZGVjb2RlciAqZGVjb2RlcikKIHsKQEAgLTE2NzcsOCArMTcxMyw3IEBACiAKIAkJY2FzZSBJTlRFTF9QVF9GVVA6CiAJCQlkZWNvZGVyLT5wZ2UgPSB0cnVlOwotCQkJaWYgKGRlY29kZXItPmxhc3RfaXAgfHwgZGVjb2Rlci0+cGFja2V0LmNvdW50ID09IDYgfHwKLQkJCSAgICBkZWNvZGVyLT5wYWNrZXQuY291bnQgPT0gMCkgeworCQkJaWYgKGludGVsX3B0X2hhdmVfaXAoZGVjb2RlcikpIHsKIAkJCQl1aW50NjRfdCBjdXJyZW50X2lwID0gZGVjb2Rlci0+aXA7CiAKIAkJCQlpbnRlbF9wdF9zZXRfaXAoZGVjb2Rlcik7CkBAIC0xNzY3LDggKzE4MDIsNyBAQAogCQljYXNlIElOVEVMX1BUX1RJUF9QR0U6CiAJCWNhc2UgSU5URUxfUFRfVElQOgogCQkJZGVjb2Rlci0+cGdlID0gZGVjb2Rlci0+cGFja2V0LnR5cGUgIT0gSU5URUxfUFRfVElQX1BHRDsKLQkJCWlmIChkZWNvZGVyLT5sYXN0X2lwIHx8IGRlY29kZXItPnBhY2tldC5jb3VudCA9PSA2IHx8Ci0JCQkgICAgZGVjb2Rlci0+cGFja2V0LmNvdW50ID09IDApCisJCQlpZiAoaW50ZWxfcHRfaGF2ZV9pcChkZWNvZGVyKSkKIAkJCQlpbnRlbF9wdF9zZXRfaXAoZGVjb2Rlcik7CiAJCQlpZiAoZGVjb2Rlci0+aXApCiAJCQkJcmV0dXJuIDA7CkBAIC0xNzc2LDkgKzE4MTAsNyBAQAogCiAJCWNhc2UgSU5URUxfUFRfRlVQOgogCQkJaWYgKGRlY29kZXItPm92ZXJmbG93KSB7Ci0JCQkJaWYgKGRlY29kZXItPmxhc3RfaXAgfHwKLQkJCQkgICAgZGVjb2Rlci0+cGFja2V0LmNvdW50ID09IDYgfHwKLQkJCQkgICAgZGVjb2Rlci0+cGFja2V0LmNvdW50ID09IDApCisJCQkJaWYgKGludGVsX3B0X2hhdmVfaXAoZGVjb2RlcikpCiAJCQkJCWludGVsX3B0X3NldF9pcChkZWNvZGVyKTsKIAkJCQlpZiAoZGVjb2Rlci0+aXApCiAJCQkJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2ludGVsLXB0LWRlY29kZXIvaW50ZWwtcHQtZGVjb2Rlci5oIGIvdG9vbHMvcGVyZi91dGlsL2ludGVsLXB0LWRlY29kZXIvaW50ZWwtcHQtZGVjb2Rlci5oCmluZGV4IDAyYzM4ZmUuLjg5Mzk5OTggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9pbnRlbC1wdC1kZWNvZGVyL2ludGVsLXB0LWRlY29kZXIuaAorKysgYi90b29scy9wZXJmL3V0aWwvaW50ZWwtcHQtZGVjb2Rlci9pbnRlbC1wdC1kZWNvZGVyLmgKQEAgLTgzLDYgKzgzLDcgQEAKIAlpbnQgKCp3YWxrX2luc24pKHN0cnVjdCBpbnRlbF9wdF9pbnNuICppbnRlbF9wdF9pbnNuLAogCQkJIHVpbnQ2NF90ICppbnNuX2NudF9wdHIsIHVpbnQ2NF90ICppcCwgdWludDY0X3QgdG9faXAsCiAJCQkgdWludDY0X3QgbWF4X2luc25fY250LCB2b2lkICpkYXRhKTsKKwlib29sICgqcGdkX2lwKSh1aW50NjRfdCBpcCwgdm9pZCAqZGF0YSk7CiAJdm9pZCAqZGF0YTsKIAlib29sIHJldHVybl9jb21wcmVzc2lvbjsKIAl1aW50NjRfdCBwZXJpb2Q7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaW50ZWwtcHQtZGVjb2Rlci9pbnRlbC1wdC1wa3QtZGVjb2Rlci5jIGIvdG9vbHMvcGVyZi91dGlsL2ludGVsLXB0LWRlY29kZXIvaW50ZWwtcHQtcGt0LWRlY29kZXIuYwppbmRleCBiMTI1N2M4Li40ZjdiMzIwIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvaW50ZWwtcHQtZGVjb2Rlci9pbnRlbC1wdC1wa3QtZGVjb2Rlci5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9pbnRlbC1wdC1kZWNvZGVyL2ludGVsLXB0LXBrdC1kZWNvZGVyLmMKQEAgLTI5MiwzNiArMjkyLDQ2IEBACiAJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBsZW4sCiAJCQkgICBzdHJ1Y3QgaW50ZWxfcHRfcGt0ICpwYWNrZXQpCiB7Ci0Jc3dpdGNoIChieXRlID4+IDUpIHsKKwlpbnQgaXBfbGVuOworCisJcGFja2V0LT5jb3VudCA9IGJ5dGUgPj4gNTsKKworCXN3aXRjaCAocGFja2V0LT5jb3VudCkgewogCWNhc2UgMDoKLQkJcGFja2V0LT5jb3VudCA9IDA7CisJCWlwX2xlbiA9IDA7CiAJCWJyZWFrOwogCWNhc2UgMToKIAkJaWYgKGxlbiA8IDMpCiAJCQlyZXR1cm4gSU5URUxfUFRfTkVFRF9NT1JFX0JZVEVTOwotCQlwYWNrZXQtPmNvdW50ID0gMjsKKwkJaXBfbGVuID0gMjsKIAkJcGFja2V0LT5wYXlsb2FkID0gbGUxNl90b19jcHUoKih1aW50MTZfdCAqKShidWYgKyAxKSk7CiAJCWJyZWFrOwogCWNhc2UgMjoKIAkJaWYgKGxlbiA8IDUpCiAJCQlyZXR1cm4gSU5URUxfUFRfTkVFRF9NT1JFX0JZVEVTOwotCQlwYWNrZXQtPmNvdW50ID0gNDsKKwkJaXBfbGVuID0gNDsKIAkJcGFja2V0LT5wYXlsb2FkID0gbGUzMl90b19jcHUoKih1aW50MzJfdCAqKShidWYgKyAxKSk7CiAJCWJyZWFrOwogCWNhc2UgMzoKLQljYXNlIDY6CisJY2FzZSA0OgogCQlpZiAobGVuIDwgNykKIAkJCXJldHVybiBJTlRFTF9QVF9ORUVEX01PUkVfQllURVM7Ci0JCXBhY2tldC0+Y291bnQgPSA2OworCQlpcF9sZW4gPSA2OwogCQltZW1jcHlfbGU2NCgmcGFja2V0LT5wYXlsb2FkLCBidWYgKyAxLCA2KTsKIAkJYnJlYWs7CisJY2FzZSA2OgorCQlpZiAobGVuIDwgOSkKKwkJCXJldHVybiBJTlRFTF9QVF9ORUVEX01PUkVfQllURVM7CisJCWlwX2xlbiA9IDg7CisJCXBhY2tldC0+cGF5bG9hZCA9IGxlNjRfdG9fY3B1KCoodWludDY0X3QgKikoYnVmICsgMSkpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gSU5URUxfUFRfQkFEX1BBQ0tFVDsKIAl9CiAKIAlwYWNrZXQtPnR5cGUgPSB0eXBlOwogCi0JcmV0dXJuIHBhY2tldC0+Y291bnQgKyAxOworCXJldHVybiBpcF9sZW4gKyAxOwogfQogCiBzdGF0aWMgaW50IGludGVsX3B0X2dldF9tb2RlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9pbnRlbC1wdC5jIGIvdG9vbHMvcGVyZi91dGlsL2ludGVsLXB0LmMKaW5kZXggNTUxZmY2Zi4uZGMwNDFkNCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2ludGVsLXB0LmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2ludGVsLXB0LmMKQEAgLTEwMyw2ICsxMDMsOSBAQAogCXVuc2lnbmVkIG1heF9ub25fdHVyYm9fcmF0aW87CiAKIAl1bnNpZ25lZCBsb25nIG51bV9ldmVudHM7CisKKwljaGFyICpmaWx0ZXI7CisJc3RydWN0IGFkZHJfZmlsdGVycyBmaWx0czsKIH07CiAKIGVudW0gc3dpdGNoX3N0YXRlIHsKQEAgLTI0MSw3ICsyNDQsNyBAQAogCX0KIAogCXF1ZXVlID0gJnB0cS0+cHQtPnF1ZXVlcy5xdWV1ZV9hcnJheVtwdHEtPnF1ZXVlX25yXTsKLQorbmV4dDoKIAlidWZmZXIgPSBhdXh0cmFjZV9idWZmZXJfX25leHQocXVldWUsIGJ1ZmZlcik7CiAJaWYgKCFidWZmZXIpIHsKIAkJaWYgKG9sZF9idWZmZXIpCkBAIC0yNjQsOSArMjY3LDYgQEAKIAkgICAgaW50ZWxfcHRfZG9fZml4X292ZXJsYXAocHRxLT5wdCwgb2xkX2J1ZmZlciwgYnVmZmVyKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZiAob2xkX2J1ZmZlcikKLQkJYXV4dHJhY2VfYnVmZmVyX19kcm9wX2RhdGEob2xkX2J1ZmZlcik7Ci0KIAlpZiAoYnVmZmVyLT51c2VfZGF0YSkgewogCQliLT5sZW4gPSBidWZmZXItPnVzZV9zaXplOwogCQliLT5idWYgPSBidWZmZXItPnVzZV9kYXRhOwpAQCAtMjc2LDYgKzI3NiwxNiBAQAogCX0KIAliLT5yZWZfdGltZXN0YW1wID0gYnVmZmVyLT5yZWZlcmVuY2U7CiAKKwkvKgorCSAqIElmIGluIHNuYXBzaG90IG1vZGUgYW5kIHRoZSBidWZmZXIgaGFzIG5vIHVzYWJsZSBkYXRhLCBnZXQgbmV4dAorCSAqIGJ1ZmZlciBhbmQgYWdhaW4gY2hlY2sgb3ZlcmxhcCBhZ2FpbnN0IG9sZF9idWZmZXIuCisJICovCisJaWYgKHB0cS0+cHQtPnNuYXBzaG90X21vZGUgJiYgIWItPmxlbikKKwkJZ290byBuZXh0OworCisJaWYgKG9sZF9idWZmZXIpCisJCWF1eHRyYWNlX2J1ZmZlcl9fZHJvcF9kYXRhKG9sZF9idWZmZXIpOworCiAJaWYgKCFvbGRfYnVmZmVyIHx8IHB0cS0+cHQtPnNhbXBsaW5nX21vZGUgfHwgKHB0cS0+cHQtPnNuYXBzaG90X21vZGUgJiYKIAkJCQkJCSAgICAgICFidWZmZXItPmNvbnNlY3V0aXZlKSkgewogCQliLT5jb25zZWN1dGl2ZSA9IGZhbHNlOwpAQCAtNDc3LDcgKzQ4Nyw3IEBACiAJCXN0YXJ0X2lwID0gKmlwOwogCiAJCS8qIExvYWQgbWFwcyB0byBlbnN1cmUgZHNvLT5pc182NF9iaXQgaGFzIGJlZW4gdXBkYXRlZCAqLwotCQltYXBfX2xvYWQoYWwubWFwLCBtYWNoaW5lLT5zeW1ib2xfZmlsdGVyKTsKKwkJbWFwX19sb2FkKGFsLm1hcCk7CiAKIAkJeDg2XzY0ID0gYWwubWFwLT5kc28tPmlzXzY0X2JpdDsKIApAQCAtNTQxLDYgKzU1MSw3NiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgYm9vbCBpbnRlbF9wdF9tYXRjaF9wZ2RfaXAoc3RydWN0IGludGVsX3B0ICpwdCwgdWludDY0X3QgaXAsCisJCQkJICB1aW50NjRfdCBvZmZzZXQsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCXN0cnVjdCBhZGRyX2ZpbHRlciAqZmlsdDsKKwlib29sIGhhdmVfZmlsdGVyICAgPSBmYWxzZTsKKwlib29sIGhpdF90cmFjZXN0b3AgPSBmYWxzZTsKKwlib29sIGhpdF9maWx0ZXIgICAgPSBmYWxzZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZmlsdCwgJnB0LT5maWx0cy5oZWFkLCBsaXN0KSB7CisJCWlmIChmaWx0LT5zdGFydCkKKwkJCWhhdmVfZmlsdGVyID0gdHJ1ZTsKKworCQlpZiAoKGZpbGVuYW1lICYmICFmaWx0LT5maWxlbmFtZSkgfHwKKwkJICAgICghZmlsZW5hbWUgJiYgZmlsdC0+ZmlsZW5hbWUpIHx8CisJCSAgICAoZmlsZW5hbWUgJiYgc3RyY21wKGZpbGVuYW1lLCBmaWx0LT5maWxlbmFtZSkpKQorCQkJY29udGludWU7CisKKwkJaWYgKCEob2Zmc2V0ID49IGZpbHQtPmFkZHIgJiYgb2Zmc2V0IDwgZmlsdC0+YWRkciArIGZpbHQtPnNpemUpKQorCQkJY29udGludWU7CisKKwkJaW50ZWxfcHRfbG9nKCJUSVAuUEdEIGlwICUjIlBSSXg2NCIgb2Zmc2V0ICUjIlBSSXg2NCIgaW4gJXMgaGl0IGZpbHRlcjogJXMgb2Zmc2V0ICUjIlBSSXg2NCIgc2l6ZSAlIyJQUkl4NjQiXG4iLAorCQkJICAgICBpcCwgb2Zmc2V0LCBmaWxlbmFtZSA/IGZpbGVuYW1lIDogIltrZXJuZWxdIiwKKwkJCSAgICAgZmlsdC0+c3RhcnQgPyAiZmlsdGVyIiA6ICJzdG9wIiwKKwkJCSAgICAgZmlsdC0+YWRkciwgZmlsdC0+c2l6ZSk7CisKKwkJaWYgKGZpbHQtPnN0YXJ0KQorCQkJaGl0X2ZpbHRlciA9IHRydWU7CisJCWVsc2UKKwkJCWhpdF90cmFjZXN0b3AgPSB0cnVlOworCX0KKworCWlmICghaGl0X3RyYWNlc3RvcCAmJiAhaGl0X2ZpbHRlcikKKwkJaW50ZWxfcHRfbG9nKCJUSVAuUEdEIGlwICUjIlBSSXg2NCIgb2Zmc2V0ICUjIlBSSXg2NCIgaW4gJXMgaXMgbm90IGluIGEgZmlsdGVyIHJlZ2lvblxuIiwKKwkJCSAgICAgaXAsIG9mZnNldCwgZmlsZW5hbWUgPyBmaWxlbmFtZSA6ICJba2VybmVsXSIpOworCisJcmV0dXJuIGhpdF90cmFjZXN0b3AgfHwgKGhhdmVfZmlsdGVyICYmICFoaXRfZmlsdGVyKTsKK30KKworc3RhdGljIGludCBfX2ludGVsX3B0X3BnZF9pcCh1aW50NjRfdCBpcCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaW50ZWxfcHRfcXVldWUgKnB0cSA9IGRhdGE7CisJc3RydWN0IHRocmVhZCAqdGhyZWFkOworCXN0cnVjdCBhZGRyX2xvY2F0aW9uIGFsOworCXU4IGNwdW1vZGU7CisJdTY0IG9mZnNldDsKKworCWlmIChpcCA+PSBwdHEtPnB0LT5rZXJuZWxfc3RhcnQpCisJCXJldHVybiBpbnRlbF9wdF9tYXRjaF9wZ2RfaXAocHRxLT5wdCwgaXAsIGlwLCBOVUxMKTsKKworCWNwdW1vZGUgPSBQRVJGX1JFQ09SRF9NSVNDX1VTRVI7CisKKwl0aHJlYWQgPSBwdHEtPnRocmVhZDsKKwlpZiAoIXRocmVhZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0aHJlYWRfX2ZpbmRfYWRkcl9tYXAodGhyZWFkLCBjcHVtb2RlLCBNQVBfX0ZVTkNUSU9OLCBpcCwgJmFsKTsKKwlpZiAoIWFsLm1hcCB8fCAhYWwubWFwLT5kc28pCisJCXJldHVybiAtRUlOVkFMOworCisJb2Zmc2V0ID0gYWwubWFwLT5tYXBfaXAoYWwubWFwLCBpcCk7CisKKwlyZXR1cm4gaW50ZWxfcHRfbWF0Y2hfcGdkX2lwKHB0cS0+cHQsIGlwLCBvZmZzZXQsCisJCQkJICAgICBhbC5tYXAtPmRzby0+bG9uZ19uYW1lKTsKK30KKworc3RhdGljIGJvb2wgaW50ZWxfcHRfcGdkX2lwKHVpbnQ2NF90IGlwLCB2b2lkICpkYXRhKQoreworCXJldHVybiBfX2ludGVsX3B0X3BnZF9pcChpcCwgZGF0YSkgPiAwOworfQorCiBzdGF0aWMgYm9vbCBpbnRlbF9wdF9nZXRfY29uZmlnKHN0cnVjdCBpbnRlbF9wdCAqcHQsCiAJCQkJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciwgdTY0ICpjb25maWcpCiB7CkBAIC03MTcsNiArNzk3LDkgQEAKIAlwYXJhbXMudHNjX2N0Y19yYXRpb19uID0gcHQtPnRzY19jdGNfcmF0aW9fbjsKIAlwYXJhbXMudHNjX2N0Y19yYXRpb19kID0gcHQtPnRzY19jdGNfcmF0aW9fZDsKIAorCWlmIChwdC0+ZmlsdHMuY250ID4gMCkKKwkJcGFyYW1zLnBnZF9pcCA9IGludGVsX3B0X3BnZF9pcDsKKwogCWlmIChwdC0+c3ludGhfb3B0cy5pbnN0cnVjdGlvbnMpIHsKIAkJaWYgKHB0LT5zeW50aF9vcHRzLnBlcmlvZCkgewogCQkJc3dpdGNoIChwdC0+c3ludGhfb3B0cy5wZXJpb2RfdHlwZSkgewpAQCAtMTI5NCw3ICsxMzc3LDcgQEAKIAlpZiAoIW1hcCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAobWFwX19sb2FkKG1hcCwgbWFjaGluZS0+c3ltYm9sX2ZpbHRlcikpCisJaWYgKG1hcF9fbG9hZChtYXApKQogCQlyZXR1cm4gMDsKIAogCXN0YXJ0ID0gZHNvX19maXJzdF9zeW1ib2wobWFwLT5kc28sIE1BUF9fRlVOQ1RJT04pOwpAQCAtMTc2Nyw2ICsxODUwLDggQEAKIAlpbnRlbF9wdF9mcmVlX2V2ZW50cyhzZXNzaW9uKTsKIAlzZXNzaW9uLT5hdXh0cmFjZSA9IE5VTEw7CiAJdGhyZWFkX19wdXQocHQtPnVua25vd25fdGhyZWFkKTsKKwlhZGRyX2ZpbHRlcnNfX2V4aXQoJnB0LT5maWx0cyk7CisJemZyZWUoJnB0LT5maWx0ZXIpOwogCWZyZWUocHQpOwogfQogCkBAIC0yMDE2LDYgKzIxMDEsOCBAQAogCVtJTlRFTF9QVF9UU0NfQ1RDX05dCQk9ICIgIFRTQzpDVEMgbnVtZXJhdG9yICAgJSJQUkl1NjQiXG4iLAogCVtJTlRFTF9QVF9UU0NfQ1RDX0RdCQk9ICIgIFRTQzpDVEMgZGVub21pbmF0b3IgJSJQUkl1NjQiXG4iLAogCVtJTlRFTF9QVF9DWUNfQklUXQkJPSAiICBDWUMgYml0ICAgICAgICAgICAgICUjIlBSSXg2NCJcbiIsCisJW0lOVEVMX1BUX01BWF9OT05UVVJCT19SQVRJT10JPSAiICBNYXggbm9uLXR1cmJvIHJhdGlvICUiUFJJdTY0IlxuIiwKKwlbSU5URUxfUFRfRklMVEVSX1NUUl9MRU5dCT0gIiAgRmlsdGVyIHN0cmluZyBsZW4uICAlIlBSSXU2NCJcbiIsCiB9OwogCiBzdGF0aWMgdm9pZCBpbnRlbF9wdF9wcmludF9pbmZvKHU2NCAqYXJyLCBpbnQgc3RhcnQsIGludCBmaW5pc2gpCkBAIC0yMDI5LDEyICsyMTE2LDI4IEBACiAJCWZwcmludGYoc3Rkb3V0LCBpbnRlbF9wdF9pbmZvX2ZtdHNbaV0sIGFycltpXSk7CiB9CiAKK3N0YXRpYyB2b2lkIGludGVsX3B0X3ByaW50X2luZm9fc3RyKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpZiAoIWR1bXBfdHJhY2UpCisJCXJldHVybjsKKworCWZwcmludGYoc3Rkb3V0LCAiICAlLTIwcyVzXG4iLCBuYW1lLCBzdHIgPyBzdHIgOiAiIik7Cit9CisKK3N0YXRpYyBib29sIGludGVsX3B0X2hhcyhzdHJ1Y3QgYXV4dHJhY2VfaW5mb19ldmVudCAqYXV4dHJhY2VfaW5mbywgaW50IHBvcykKK3sKKwlyZXR1cm4gYXV4dHJhY2VfaW5mby0+aGVhZGVyLnNpemUgPj0KKwkJc2l6ZW9mKHN0cnVjdCBhdXh0cmFjZV9pbmZvX2V2ZW50KSArIChzaXplb2YodTY0KSAqIChwb3MgKyAxKSk7Cit9CisKIGludCBpbnRlbF9wdF9wcm9jZXNzX2F1eHRyYWNlX2luZm8odW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkJICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbikKIHsKIAlzdHJ1Y3QgYXV4dHJhY2VfaW5mb19ldmVudCAqYXV4dHJhY2VfaW5mbyA9ICZldmVudC0+YXV4dHJhY2VfaW5mbzsKIAlzaXplX3QgbWluX3N6ID0gc2l6ZW9mKHU2NCkgKiBJTlRFTF9QVF9QRVJfQ1BVX01NQVBTOwogCXN0cnVjdCBpbnRlbF9wdCAqcHQ7CisJdm9pZCAqaW5mb19lbmQ7CisJdTY0ICppbmZvOwogCWludCBlcnI7CiAKIAlpZiAoYXV4dHJhY2VfaW5mby0+aGVhZGVyLnNpemUgPCBzaXplb2Yoc3RydWN0IGF1eHRyYWNlX2luZm9fZXZlbnQpICsKQEAgLTIwNDUsNiArMjE0OCw4IEBACiAJaWYgKCFwdCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlhZGRyX2ZpbHRlcnNfX2luaXQoJnB0LT5maWx0cyk7CisKIAlwZXJmX2NvbmZpZyhpbnRlbF9wdF9wZXJmX2NvbmZpZywgcHQpOwogCiAJZXJyID0gYXV4dHJhY2VfcXVldWVzX19pbml0KCZwdC0+cXVldWVzKTsKQEAgLTIwNjksOCArMjE3NCw3IEBACiAJaW50ZWxfcHRfcHJpbnRfaW5mbygmYXV4dHJhY2VfaW5mby0+cHJpdlswXSwgSU5URUxfUFRfUE1VX1RZUEUsCiAJCQkgICAgSU5URUxfUFRfUEVSX0NQVV9NTUFQUyk7CiAKLQlpZiAoYXV4dHJhY2VfaW5mby0+aGVhZGVyLnNpemUgPj0gc2l6ZW9mKHN0cnVjdCBhdXh0cmFjZV9pbmZvX2V2ZW50KSArCi0JCQkJCShzaXplb2YodTY0KSAqIElOVEVMX1BUX0NZQ19CSVQpKSB7CisJaWYgKGludGVsX3B0X2hhcyhhdXh0cmFjZV9pbmZvLCBJTlRFTF9QVF9DWUNfQklUKSkgewogCQlwdC0+bXRjX2JpdCA9IGF1eHRyYWNlX2luZm8tPnByaXZbSU5URUxfUFRfTVRDX0JJVF07CiAJCXB0LT5tdGNfZnJlcV9iaXRzID0gYXV4dHJhY2VfaW5mby0+cHJpdltJTlRFTF9QVF9NVENfRlJFUV9CSVRTXTsKIAkJcHQtPnRzY19jdGNfcmF0aW9fbiA9IGF1eHRyYWNlX2luZm8tPnByaXZbSU5URUxfUFRfVFNDX0NUQ19OXTsKQEAgLTIwODAsNiArMjE4NCw1NCBAQAogCQkJCSAgICBJTlRFTF9QVF9DWUNfQklUKTsKIAl9CiAKKwlpZiAoaW50ZWxfcHRfaGFzKGF1eHRyYWNlX2luZm8sIElOVEVMX1BUX01BWF9OT05UVVJCT19SQVRJTykpIHsKKwkJcHQtPm1heF9ub25fdHVyYm9fcmF0aW8gPQorCQkJYXV4dHJhY2VfaW5mby0+cHJpdltJTlRFTF9QVF9NQVhfTk9OVFVSQk9fUkFUSU9dOworCQlpbnRlbF9wdF9wcmludF9pbmZvKCZhdXh0cmFjZV9pbmZvLT5wcml2WzBdLAorCQkJCSAgICBJTlRFTF9QVF9NQVhfTk9OVFVSQk9fUkFUSU8sCisJCQkJICAgIElOVEVMX1BUX01BWF9OT05UVVJCT19SQVRJTyk7CisJfQorCisJaW5mbyA9ICZhdXh0cmFjZV9pbmZvLT5wcml2W0lOVEVMX1BUX0ZJTFRFUl9TVFJfTEVOXSArIDE7CisJaW5mb19lbmQgPSAodm9pZCAqKWluZm8gKyBhdXh0cmFjZV9pbmZvLT5oZWFkZXIuc2l6ZTsKKworCWlmIChpbnRlbF9wdF9oYXMoYXV4dHJhY2VfaW5mbywgSU5URUxfUFRfRklMVEVSX1NUUl9MRU4pKSB7CisJCXNpemVfdCBsZW47CisKKwkJbGVuID0gYXV4dHJhY2VfaW5mby0+cHJpdltJTlRFTF9QVF9GSUxURVJfU1RSX0xFTl07CisJCWludGVsX3B0X3ByaW50X2luZm8oJmF1eHRyYWNlX2luZm8tPnByaXZbMF0sCisJCQkJICAgIElOVEVMX1BUX0ZJTFRFUl9TVFJfTEVOLAorCQkJCSAgICBJTlRFTF9QVF9GSUxURVJfU1RSX0xFTik7CisJCWlmIChsZW4pIHsKKwkJCWNvbnN0IGNoYXIgKmZpbHRlciA9IChjb25zdCBjaGFyICopaW5mbzsKKworCQkJbGVuID0gcm91bmR1cChsZW4gKyAxLCA4KTsKKwkJCWluZm8gKz0gbGVuID4+IDM7CisJCQlpZiAoKHZvaWQgKilpbmZvID4gaW5mb19lbmQpIHsKKwkJCQlwcl9lcnIoIiVzOiBiYWQgZmlsdGVyIHN0cmluZyBsZW5ndGhcbiIsIF9fZnVuY19fKTsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gZXJyX2ZyZWVfcXVldWVzOworCQkJfQorCQkJcHQtPmZpbHRlciA9IG1lbWR1cChmaWx0ZXIsIGxlbik7CisJCQlpZiAoIXB0LT5maWx0ZXIpIHsKKwkJCQllcnIgPSAtRU5PTUVNOworCQkJCWdvdG8gZXJyX2ZyZWVfcXVldWVzOworCQkJfQorCQkJaWYgKHNlc3Npb24tPmhlYWRlci5uZWVkc19zd2FwKQorCQkJCW1lbV9ic3dhcF82NChwdC0+ZmlsdGVyLCBsZW4pOworCQkJaWYgKHB0LT5maWx0ZXJbbGVuIC0gMV0pIHsKKwkJCQlwcl9lcnIoIiVzOiBmaWx0ZXIgc3RyaW5nIG5vdCBudWxsIHRlcm1pbmF0ZWRcbiIsIF9fZnVuY19fKTsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gZXJyX2ZyZWVfcXVldWVzOworCQkJfQorCQkJZXJyID0gYWRkcl9maWx0ZXJzX19wYXJzZV9iYXJlX2ZpbHRlcigmcHQtPmZpbHRzLAorCQkJCQkJCSAgICAgIGZpbHRlcik7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gZXJyX2ZyZWVfcXVldWVzOworCQl9CisJCWludGVsX3B0X3ByaW50X2luZm9fc3RyKCJGaWx0ZXIgc3RyaW5nIiwgcHQtPmZpbHRlcik7CisJfQorCiAJcHQtPnRpbWVsZXNzX2RlY29kaW5nID0gaW50ZWxfcHRfdGltZWxlc3NfZGVjb2RpbmcocHQpOwogCXB0LT5oYXZlX3RzYyA9IGludGVsX3B0X2hhdmVfdHNjKHB0KTsKIAlwdC0+c2FtcGxpbmdfbW9kZSA9IGZhbHNlOwpAQCAtMjEyMSwxMSArMjI3MywxMyBAQAogCQlwdC0+c3dpdGNoX2V2c2VsID0gaW50ZWxfcHRfZmluZF9zY2hlZF9zd2l0Y2goc2Vzc2lvbi0+ZXZsaXN0KTsKIAkJaWYgKCFwdC0+c3dpdGNoX2V2c2VsKSB7CiAJCQlwcl9lcnIoIiVzOiBtaXNzaW5nIHNjaGVkX3N3aXRjaCBldmVudFxuIiwgX19mdW5jX18pOworCQkJZXJyID0gLUVJTlZBTDsKIAkJCWdvdG8gZXJyX2RlbGV0ZV90aHJlYWQ7CiAJCX0KIAl9IGVsc2UgaWYgKHB0LT5oYXZlX3NjaGVkX3N3aXRjaCA9PSAyICYmCiAJCSAgICFpbnRlbF9wdF9maW5kX3N3aXRjaChzZXNzaW9uLT5ldmxpc3QpKSB7CiAJCXByX2VycigiJXM6IG1pc3NpbmcgY29udGV4dF9zd2l0Y2ggYXR0cmlidXRlIGZsYWdcbiIsIF9fZnVuY19fKTsKKwkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBlcnJfZGVsZXRlX3RocmVhZDsKIAl9CiAKQEAgLTIxNDksNyArMjMwMyw5IEBACiAJaWYgKHB0LT50Yy50aW1lX211bHQpIHsKIAkJdTY0IHRzY19mcmVxID0gaW50ZWxfcHRfbnNfdG9fdGlja3MocHQsIDEwMDAwMDAwMDApOwogCi0JCXB0LT5tYXhfbm9uX3R1cmJvX3JhdGlvID0gKHRzY19mcmVxICsgNTAwMDAwMDApIC8gMTAwMDAwMDAwOworCQlpZiAoIXB0LT5tYXhfbm9uX3R1cmJvX3JhdGlvKQorCQkJcHQtPm1heF9ub25fdHVyYm9fcmF0aW8gPQorCQkJCQkodHNjX2ZyZXEgKyA1MDAwMDAwMCkgLyAxMDAwMDAwMDA7CiAJCWludGVsX3B0X2xvZygiVFNDIGZyZXF1ZW5jeSAlIlBSSXU2NCJcbiIsIHRzY19mcmVxKTsKIAkJaW50ZWxfcHRfbG9nKCJNYXhpbXVtIG5vbi10dXJibyByYXRpbyAldVxuIiwKIAkJCSAgICAgcHQtPm1heF9ub25fdHVyYm9fcmF0aW8pOwpAQCAtMjE5Myw2ICsyMzQ5LDggQEAKIAlhdXh0cmFjZV9xdWV1ZXNfX2ZyZWUoJnB0LT5xdWV1ZXMpOwogCXNlc3Npb24tPmF1eHRyYWNlID0gTlVMTDsKIGVycl9mcmVlOgorCWFkZHJfZmlsdGVyc19fZXhpdCgmcHQtPmZpbHRzKTsKKwl6ZnJlZSgmcHQtPmZpbHRlcik7CiAJZnJlZShwdCk7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9pbnRlbC1wdC5oIGIvdG9vbHMvcGVyZi91dGlsL2ludGVsLXB0LmgKaW5kZXggMDA2NTk0OS4uZTEzYjE0ZSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2ludGVsLXB0LmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2ludGVsLXB0LmgKQEAgLTM0LDExICszNCwxMSBAQAogCUlOVEVMX1BUX1RTQ19DVENfTiwKIAlJTlRFTF9QVF9UU0NfQ1RDX0QsCiAJSU5URUxfUFRfQ1lDX0JJVCwKKwlJTlRFTF9QVF9NQVhfTk9OVFVSQk9fUkFUSU8sCisJSU5URUxfUFRfRklMVEVSX1NUUl9MRU4sCiAJSU5URUxfUFRfQVVYVFJBQ0VfUFJJVl9NQVgsCiB9OwogCi0jZGVmaW5lIElOVEVMX1BUX0FVWFRSQUNFX1BSSVZfU0laRSAoSU5URUxfUFRfQVVYVFJBQ0VfUFJJVl9NQVggKiBzaXplb2YodTY0KSkKLQogc3RydWN0IGF1eHRyYWNlX3JlY29yZDsKIHN0cnVjdCBwZXJmX3Rvb2w7CiB1bmlvbiBwZXJmX2V2ZW50OwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2ppdGR1bXAuYyBiL3Rvb2xzL3BlcmYvdXRpbC9qaXRkdW1wLmMKaW5kZXggOWYzMzA1Zi4uOTVmMDg4NCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2ppdGR1bXAuYworKysgYi90b29scy9wZXJmL3V0aWwvaml0ZHVtcC5jCkBAIC0xLDMgKzEsNCBAQAorI2luY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2x6bWEuYyBiL3Rvb2xzL3BlcmYvdXRpbC9sem1hLmMKaW5kZXggOTVhMWFjYi4uOWRkZWE1YyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2x6bWEuYworKysgYi90b29scy9wZXJmL3V0aWwvbHptYS5jCkBAIC0yOSw2ICsyOSw3IEBACiAJbHptYV9hY3Rpb24gYWN0aW9uID0gTFpNQV9SVU47CiAJbHptYV9zdHJlYW0gc3RybSAgID0gTFpNQV9TVFJFQU1fSU5JVDsKIAlsem1hX3JldCByZXQ7CisJaW50IGVyciA9IC0xOwogCiAJdTggYnVmX2luW0JVRlNJWkVdOwogCXU4IGJ1Zl9vdXRbQlVGU0laRV07CkBAIC00NSw3ICs0Niw3IEBACiAJaWYgKHJldCAhPSBMWk1BX09LKSB7CiAJCXByX2VycigibHptYTogbHptYV9zdHJlYW1fZGVjb2RlciBmYWlsZWQgJXMgKCVkKVxuIiwKIAkJCWx6bWFfc3RyZXJyb3IocmV0KSwgcmV0KTsKLQkJcmV0dXJuIC0xOworCQlnb3RvIGVycl9mY2xvc2U7CiAJfQogCiAJc3RybS5uZXh0X2luICAgPSBOVUxMOwpAQCAtNjAsNyArNjEsNyBAQAogCiAJCQlpZiAoZmVycm9yKGluZmlsZSkpIHsKIAkJCQlwcl9lcnIoImx6bWE6IHJlYWQgZXJyb3I6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwotCQkJCXJldHVybiAtMTsKKwkJCQlnb3RvIGVycl9mY2xvc2U7CiAJCQl9CiAKIAkJCWlmIChmZW9mKGluZmlsZSkpCkBAIC03NCw3ICs3NSw3IEBACiAKIAkJCWlmICh3cml0ZW4ob3V0cHV0X2ZkLCBidWZfb3V0LCB3cml0ZV9zaXplKSAhPSB3cml0ZV9zaXplKSB7CiAJCQkJcHJfZXJyKCJsem1hOiB3cml0ZSBlcnJvcjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQkJcmV0dXJuIC0xOworCQkJCWdvdG8gZXJyX2ZjbG9zZTsKIAkJCX0KIAogCQkJc3RybS5uZXh0X291dCAgPSBidWZfb3V0OwpAQCAtODMsMTMgKzg0LDE1IEBACiAKIAkJaWYgKHJldCAhPSBMWk1BX09LKSB7CiAJCQlpZiAocmV0ID09IExaTUFfU1RSRUFNX0VORCkKLQkJCQlyZXR1cm4gMDsKKwkJCQlicmVhazsKIAogCQkJcHJfZXJyKCJsem1hOiBmYWlsZWQgJXNcbiIsIGx6bWFfc3RyZXJyb3IocmV0KSk7Ci0JCQlyZXR1cm4gLTE7CisJCQlnb3RvIGVycl9mY2xvc2U7CiAJCX0KIAl9CiAKKwllcnIgPSAwOworZXJyX2ZjbG9zZToKIAlmY2xvc2UoaW5maWxlKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL21hY2hpbmUuYyBiL3Rvb2xzL3BlcmYvdXRpbC9tYWNoaW5lLmMKaW5kZXggY2I2Mzg4ZC4uMThlNDUxOSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL21hY2hpbmUuYworKysgYi90b29scy9wZXJmL3V0aWwvbWFjaGluZS5jCkBAIC00MSw3ICs0MSw2IEBACiAKIAltYWNoaW5lLT5waWQgPSBwaWQ7CiAKLQltYWNoaW5lLT5zeW1ib2xfZmlsdGVyID0gTlVMTDsKIAltYWNoaW5lLT5pZF9oZHJfc2l6ZSA9IDA7CiAJbWFjaGluZS0+a3B0cl9yZXN0cmljdF93YXJuZWQgPSBmYWxzZTsKIAltYWNoaW5lLT5jb21tX2V4ZWMgPSBmYWxzZTsKQEAgLTE0OCw3ICsxNDcsNiBAQAogewogCW1hY2hpbmVfX2luaXQoJm1hY2hpbmVzLT5ob3N0LCAiIiwgSE9TVF9LRVJORUxfSUQpOwogCW1hY2hpbmVzLT5ndWVzdHMgPSBSQl9ST09UOwotCW1hY2hpbmVzLT5zeW1ib2xfZmlsdGVyID0gTlVMTDsKIH0KIAogdm9pZCBtYWNoaW5lc19fZXhpdChzdHJ1Y3QgbWFjaGluZXMgKm1hY2hpbmVzKQpAQCAtMTcyLDggKzE3MCw2IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCW1hY2hpbmUtPnN5bWJvbF9maWx0ZXIgPSBtYWNoaW5lcy0+c3ltYm9sX2ZpbHRlcjsKLQogCXdoaWxlICgqcCAhPSBOVUxMKSB7CiAJCXBhcmVudCA9ICpwOwogCQlwb3MgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBtYWNoaW5lLCByYl9ub2RlKTsKQEAgLTE4OSwyMSArMTg1LDYgQEAKIAlyZXR1cm4gbWFjaGluZTsKIH0KIAotdm9pZCBtYWNoaW5lc19fc2V0X3N5bWJvbF9maWx0ZXIoc3RydWN0IG1hY2hpbmVzICptYWNoaW5lcywKLQkJCQkgc3ltYm9sX2ZpbHRlcl90IHN5bWJvbF9maWx0ZXIpCi17Ci0Jc3RydWN0IHJiX25vZGUgKm5kOwotCi0JbWFjaGluZXMtPnN5bWJvbF9maWx0ZXIgPSBzeW1ib2xfZmlsdGVyOwotCW1hY2hpbmVzLT5ob3N0LnN5bWJvbF9maWx0ZXIgPSBzeW1ib2xfZmlsdGVyOwotCi0JZm9yIChuZCA9IHJiX2ZpcnN0KCZtYWNoaW5lcy0+Z3Vlc3RzKTsgbmQ7IG5kID0gcmJfbmV4dChuZCkpIHsKLQkJc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUgPSByYl9lbnRyeShuZCwgc3RydWN0IG1hY2hpbmUsIHJiX25vZGUpOwotCi0JCW1hY2hpbmUtPnN5bWJvbF9maWx0ZXIgPSBzeW1ib2xfZmlsdGVyOwotCX0KLX0KLQogdm9pZCBtYWNoaW5lc19fc2V0X2NvbW1fZXhlYyhzdHJ1Y3QgbWFjaGluZXMgKm1hY2hpbmVzLCBib29sIGNvbW1fZXhlYykKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqbmQ7CkBAIC05MTYsMTAgKzg5NywxMCBAQAogfQogCiBpbnQgX19tYWNoaW5lX19sb2FkX2thbGxzeW1zKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKLQkJCSAgICAgZW51bSBtYXBfdHlwZSB0eXBlLCBib29sIG5vX2tjb3JlLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQorCQkJICAgICBlbnVtIG1hcF90eXBlIHR5cGUsIGJvb2wgbm9fa2NvcmUpCiB7CiAJc3RydWN0IG1hcCAqbWFwID0gbWFjaGluZV9fa2VybmVsX21hcChtYWNoaW5lKTsKLQlpbnQgcmV0ID0gX19kc29fX2xvYWRfa2FsbHN5bXMobWFwLT5kc28sIGZpbGVuYW1lLCBtYXAsIG5vX2tjb3JlLCBmaWx0ZXIpOworCWludCByZXQgPSBfX2Rzb19fbG9hZF9rYWxsc3ltcyhtYXAtPmRzbywgZmlsZW5hbWUsIG1hcCwgbm9fa2NvcmUpOwogCiAJaWYgKHJldCA+IDApIHsKIAkJZHNvX19zZXRfbG9hZGVkKG1hcC0+ZHNvLCB0eXBlKTsKQEAgLTkzNSwxNiArOTE2LDE1IEBACiB9CiAKIGludCBtYWNoaW5lX19sb2FkX2thbGxzeW1zKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKLQkJCSAgIGVudW0gbWFwX3R5cGUgdHlwZSwgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKKwkJCSAgIGVudW0gbWFwX3R5cGUgdHlwZSkKIHsKLQlyZXR1cm4gX19tYWNoaW5lX19sb2FkX2thbGxzeW1zKG1hY2hpbmUsIGZpbGVuYW1lLCB0eXBlLCBmYWxzZSwgZmlsdGVyKTsKKwlyZXR1cm4gX19tYWNoaW5lX19sb2FkX2thbGxzeW1zKG1hY2hpbmUsIGZpbGVuYW1lLCB0eXBlLCBmYWxzZSk7CiB9CiAKLWludCBtYWNoaW5lX19sb2FkX3ZtbGludXhfcGF0aChzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgZW51bSBtYXBfdHlwZSB0eXBlLAotCQkJICAgICAgIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCitpbnQgbWFjaGluZV9fbG9hZF92bWxpbnV4X3BhdGgoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIGVudW0gbWFwX3R5cGUgdHlwZSkKIHsKIAlzdHJ1Y3QgbWFwICptYXAgPSBtYWNoaW5lX19rZXJuZWxfbWFwKG1hY2hpbmUpOwotCWludCByZXQgPSBkc29fX2xvYWRfdm1saW51eF9wYXRoKG1hcC0+ZHNvLCBtYXAsIGZpbHRlcik7CisJaW50IHJldCA9IGRzb19fbG9hZF92bWxpbnV4X3BhdGgobWFwLT5kc28sIG1hcCk7CiAKIAlpZiAocmV0ID4gMCkKIAkJZHNvX19zZXRfbG9hZGVkKG1hcC0+ZHNvLCB0eXBlKTsKQEAgLTEzMTMsNyArMTI5Myw3IEBACiAJCQkvKgogCQkJICogcHJlbG9hZCBkc28gb2YgZ3Vlc3Qga2VybmVsIGFuZCBtb2R1bGVzCiAJCQkgKi8KLQkJCWRzb19fbG9hZChrZXJuZWwsIG1hY2hpbmVfX2tlcm5lbF9tYXAobWFjaGluZSksIE5VTEwpOworCQkJZHNvX19sb2FkKGtlcm5lbCwgbWFjaGluZV9fa2VybmVsX21hcChtYWNoaW5lKSk7CiAJCX0KIAl9CiAJcmV0dXJuIDA7CkBAIC0yMTE1LDcgKzIwOTUsNyBAQAogCSAqLwogCW1hY2hpbmUtPmtlcm5lbF9zdGFydCA9IDFVTEwgPDwgNjM7CiAJaWYgKG1hcCkgewotCQllcnIgPSBtYXBfX2xvYWQobWFwLCBtYWNoaW5lLT5zeW1ib2xfZmlsdGVyKTsKKwkJZXJyID0gbWFwX19sb2FkKG1hcCk7CiAJCWlmIChtYXAtPnN0YXJ0KQogCQkJbWFjaGluZS0+a2VybmVsX3N0YXJ0ID0gbWFwLT5zdGFydDsKIAl9CkBAIC0yMTMxLDcgKzIxMTEsNyBAQAogewogCXN0cnVjdCBtYWNoaW5lICptYWNoaW5lID0gdm1hY2hpbmU7CiAJc3RydWN0IG1hcCAqbWFwOwotCXN0cnVjdCBzeW1ib2wgKnN5bSA9IG1hcF9ncm91cHNfX2ZpbmRfc3ltYm9sKCZtYWNoaW5lLT5rbWFwcywgTUFQX19GVU5DVElPTiwgKmFkZHJwLCAmbWFwLCAgTlVMTCk7CisJc3RydWN0IHN5bWJvbCAqc3ltID0gbWFwX2dyb3Vwc19fZmluZF9zeW1ib2woJm1hY2hpbmUtPmttYXBzLCBNQVBfX0ZVTkNUSU9OLCAqYWRkcnAsICZtYXApOwogCiAJaWYgKHN5bSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9tYWNoaW5lLmggYi90b29scy9wZXJmL3V0aWwvbWFjaGluZS5oCmluZGV4IDIwNzM5ZjcuLjM1NGRlNmUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9tYWNoaW5lLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL21hY2hpbmUuaApAQCAtNDEsNyArNDEsNiBAQAogCXN0cnVjdCBtYXBfZ3JvdXBzIGttYXBzOwogCXN0cnVjdCBtYXAJICAqdm1saW51eF9tYXBzW01BUF9fTlJfVFlQRVNdOwogCXU2NAkJICBrZXJuZWxfc3RhcnQ7Ci0Jc3ltYm9sX2ZpbHRlcl90CSAgc3ltYm9sX2ZpbHRlcjsKIAlwaWRfdAkJICAqY3VycmVudF90aWQ7CiAJdW5pb24geyAvKiBUb29sIHNwZWNpZmljIGFyZWEgKi8KIAkJdm9pZAkgICpwcml2OwpAQCAtMTEwLDcgKzEwOSw2IEBACiBzdHJ1Y3QgbWFjaGluZXMgewogCXN0cnVjdCBtYWNoaW5lIGhvc3Q7CiAJc3RydWN0IHJiX3Jvb3QgZ3Vlc3RzOwotCXN5bWJvbF9maWx0ZXJfdCBzeW1ib2xfZmlsdGVyOwogfTsKIAogdm9pZCBtYWNoaW5lc19faW5pdChzdHJ1Y3QgbWFjaGluZXMgKm1hY2hpbmVzKTsKQEAgLTEyOCw4ICsxMjYsNiBAQAogdm9pZCBtYWNoaW5lc19fc2V0X2lkX2hkcl9zaXplKHN0cnVjdCBtYWNoaW5lcyAqbWFjaGluZXMsIHUxNiBpZF9oZHJfc2l6ZSk7CiBjaGFyICptYWNoaW5lX19tbWFwX25hbWUoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIGNoYXIgKmJmLCBzaXplX3Qgc2l6ZSk7CiAKLXZvaWQgbWFjaGluZXNfX3NldF9zeW1ib2xfZmlsdGVyKHN0cnVjdCBtYWNoaW5lcyAqbWFjaGluZXMsCi0JCQkJIHN5bWJvbF9maWx0ZXJfdCBzeW1ib2xfZmlsdGVyKTsKIHZvaWQgbWFjaGluZXNfX3NldF9jb21tX2V4ZWMoc3RydWN0IG1hY2hpbmVzICptYWNoaW5lcywgYm9vbCBjb21tX2V4ZWMpOwogCiBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZV9fbmV3X2hvc3Qodm9pZCk7CkBAIC0xNzgsNDAgKzE3NCwzMyBAQAogc3RhdGljIGlubGluZQogc3RydWN0IHN5bWJvbCAqbWFjaGluZV9fZmluZF9rZXJuZWxfc3ltYm9sKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLAogCQkJCQkgICBlbnVtIG1hcF90eXBlIHR5cGUsIHU2NCBhZGRyLAotCQkJCQkgICBzdHJ1Y3QgbWFwICoqbWFwcCwKLQkJCQkJICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKKwkJCQkJICAgc3RydWN0IG1hcCAqKm1hcHApCiB7Ci0JcmV0dXJuIG1hcF9ncm91cHNfX2ZpbmRfc3ltYm9sKCZtYWNoaW5lLT5rbWFwcywgdHlwZSwgYWRkciwKLQkJCQkgICAgICAgbWFwcCwgZmlsdGVyKTsKKwlyZXR1cm4gbWFwX2dyb3Vwc19fZmluZF9zeW1ib2woJm1hY2hpbmUtPmttYXBzLCB0eXBlLCBhZGRyLCBtYXBwKTsKIH0KIAogc3RhdGljIGlubGluZQogc3RydWN0IHN5bWJvbCAqbWFjaGluZV9fZmluZF9rZXJuZWxfc3ltYm9sX2J5X25hbWUoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsCiAJCQkJCQkgICBlbnVtIG1hcF90eXBlIHR5cGUsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCQkgICBzdHJ1Y3QgbWFwICoqbWFwcCwKLQkJCQkJCSAgIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCisJCQkJCQkgICBzdHJ1Y3QgbWFwICoqbWFwcCkKIHsKLQlyZXR1cm4gbWFwX2dyb3Vwc19fZmluZF9zeW1ib2xfYnlfbmFtZSgmbWFjaGluZS0+a21hcHMsIHR5cGUsIG5hbWUsCi0JCQkJCSAgICAgICBtYXBwLCBmaWx0ZXIpOworCXJldHVybiBtYXBfZ3JvdXBzX19maW5kX3N5bWJvbF9ieV9uYW1lKCZtYWNoaW5lLT5rbWFwcywgdHlwZSwgbmFtZSwgbWFwcCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUKIHN0cnVjdCBzeW1ib2wgKm1hY2hpbmVfX2ZpbmRfa2VybmVsX2Z1bmN0aW9uKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCB1NjQgYWRkciwKLQkJCQkJICAgICBzdHJ1Y3QgbWFwICoqbWFwcCwKLQkJCQkJICAgICBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQorCQkJCQkgICAgIHN0cnVjdCBtYXAgKiptYXBwKQogewogCXJldHVybiBtYWNoaW5lX19maW5kX2tlcm5lbF9zeW1ib2wobWFjaGluZSwgTUFQX19GVU5DVElPTiwgYWRkciwKLQkJCQkJICAgbWFwcCwgZmlsdGVyKTsKKwkJCQkJICAgbWFwcCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUKIHN0cnVjdCBzeW1ib2wgKm1hY2hpbmVfX2ZpbmRfa2VybmVsX2Z1bmN0aW9uX2J5X25hbWUoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsCiAJCQkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCQkgICAgIHN0cnVjdCBtYXAgKiptYXBwLAotCQkJCQkJICAgICBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQorCQkJCQkJICAgICBzdHJ1Y3QgbWFwICoqbWFwcCkKIHsKLQlyZXR1cm4gbWFwX2dyb3Vwc19fZmluZF9mdW5jdGlvbl9ieV9uYW1lKCZtYWNoaW5lLT5rbWFwcywgbmFtZSwgbWFwcCwKLQkJCQkJCSBmaWx0ZXIpOworCXJldHVybiBtYXBfZ3JvdXBzX19maW5kX2Z1bmN0aW9uX2J5X25hbWUoJm1hY2hpbmUtPmttYXBzLCBuYW1lLCBtYXBwKTsKIH0KIAogc3RydWN0IG1hcCAqbWFjaGluZV9fZmluZG5ld19tb2R1bGVfbWFwKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCB1NjQgc3RhcnQsCkBAIC0yMTksMTEgKzIwOCwxMCBAQAogaW50IGFyY2hfX2ZpeF9tb2R1bGVfdGV4dF9zdGFydCh1NjQgKnN0YXJ0LCBjb25zdCBjaGFyICpuYW1lKTsKIAogaW50IF9fbWFjaGluZV9fbG9hZF9rYWxsc3ltcyhzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0JCQkgICAgIGVudW0gbWFwX3R5cGUgdHlwZSwgYm9vbCBub19rY29yZSwgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7CisJCQkgICAgIGVudW0gbWFwX3R5cGUgdHlwZSwgYm9vbCBub19rY29yZSk7CiBpbnQgbWFjaGluZV9fbG9hZF9rYWxsc3ltcyhzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0JCQkgICBlbnVtIG1hcF90eXBlIHR5cGUsIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpOwotaW50IG1hY2hpbmVfX2xvYWRfdm1saW51eF9wYXRoKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCBlbnVtIG1hcF90eXBlIHR5cGUsCi0JCQkgICAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7CisJCQkgICBlbnVtIG1hcF90eXBlIHR5cGUpOworaW50IG1hY2hpbmVfX2xvYWRfdm1saW51eF9wYXRoKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCBlbnVtIG1hcF90eXBlIHR5cGUpOwogCiBzaXplX3QgbWFjaGluZV9fZnByaW50Zl9kc29zX2J1aWxkaWQoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIEZJTEUgKmZwLAogCQkJCSAgICAgYm9vbCAoc2tpcCkoc3RydWN0IGRzbyAqZHNvLCBpbnQgcGFybSksIGludCBwYXJtKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9tYXAuYyBiL3Rvb2xzL3BlcmYvdXRpbC9tYXAuYwppbmRleCA3MjgxMjlhLi5jNjYyZmVmIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvbWFwLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL21hcC5jCkBAIC02LDYgKzYsNyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9tbWFuLmg+IC8qIFRvIGdldCB0aGluZ3MgbGlrZSBNQVBfSFVHRVRMQiBldmVuIG9uIG9sZGVyIGxpYmMgaGVhZGVycyAqLwogI2luY2x1ZGUgIm1hcC5oIgogI2luY2x1ZGUgInRocmVhZC5oIgogI2luY2x1ZGUgInN0cmxpc3QuaCIKQEAgLTI0LDkgKzI1LDEwIEBACiAJW01BUF9fVkFSSUFCTEVdID0gIlZhcmlhYmxlcyIsCiB9OwogCi1zdGF0aWMgaW5saW5lIGludCBpc19hbm9uX21lbW9yeShjb25zdCBjaGFyICpmaWxlbmFtZSkKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2Fub25fbWVtb3J5KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB1MzIgZmxhZ3MpCiB7Ci0JcmV0dXJuICFzdHJjbXAoZmlsZW5hbWUsICIvL2Fub24iKSB8fAorCXJldHVybiBmbGFncyAmIE1BUF9IVUdFVExCIHx8CisJICAgICAgICFzdHJjbXAoZmlsZW5hbWUsICIvL2Fub24iKSB8fAogCSAgICAgICAhc3RybmNtcChmaWxlbmFtZSwgIi9kZXYvemVybyIsIHNpemVvZigiL2Rldi96ZXJvIikgLSAxKSB8fAogCSAgICAgICAhc3RybmNtcChmaWxlbmFtZSwgIi9hbm9uX2h1Z2VwYWdlIiwgc2l6ZW9mKCIvYW5vbl9odWdlcGFnZSIpIC0gMSk7CiB9CkBAIC0xNTUsNyArMTU3LDcgQEAKIAkJaW50IGFub24sIG5vX2RzbywgdmRzbywgYW5kcm9pZDsKIAogCQlhbmRyb2lkID0gaXNfYW5kcm9pZF9saWIoZmlsZW5hbWUpOwotCQlhbm9uID0gaXNfYW5vbl9tZW1vcnkoZmlsZW5hbWUpOworCQlhbm9uID0gaXNfYW5vbl9tZW1vcnkoZmlsZW5hbWUsIGZsYWdzKTsKIAkJdmRzbyA9IGlzX3Zkc29fbWFwKGZpbGVuYW1lKTsKIAkJbm9fZHNvID0gaXNfbm9fZHNvX21lbW9yeShmaWxlbmFtZSk7CiAKQEAgLTI3OSw3ICsyODEsNyBAQAogCiAjZGVmaW5lIERTT19fREVMRVRFRCAiKGRlbGV0ZWQpIgogCi1pbnQgbWFwX19sb2FkKHN0cnVjdCBtYXAgKm1hcCwgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKK2ludCBtYXBfX2xvYWQoc3RydWN0IG1hcCAqbWFwKQogewogCWNvbnN0IGNoYXIgKm5hbWUgPSBtYXAtPmRzby0+bG9uZ19uYW1lOwogCWludCBucjsKQEAgLTI4Nyw3ICsyODksNyBAQAogCWlmIChkc29fX2xvYWRlZChtYXAtPmRzbywgbWFwLT50eXBlKSkKIAkJcmV0dXJuIDA7CiAKLQluciA9IGRzb19fbG9hZChtYXAtPmRzbywgbWFwLCBmaWx0ZXIpOworCW5yID0gZHNvX19sb2FkKG1hcC0+ZHNvLCBtYXApOwogCWlmIChuciA8IDApIHsKIAkJaWYgKG1hcC0+ZHNvLT5oYXNfYnVpbGRfaWQpIHsKIAkJCWNoYXIgc2J1aWxkX2lkW1NCVUlMRF9JRF9TSVpFXTsKQEAgLTMxMiw5ICszMTQsNiBAQAogCQkJcHJfd2FybmluZygiJS4qcyB3YXMgdXBkYXRlZCAoaXMgcHJlbGluayBlbmFibGVkPykuICIKIAkJCQkiUmVzdGFydCB0aGUgbG9uZyBydW5uaW5nIGFwcHMgdGhhdCB1c2UgaXQhXG4iLAogCQkJCSAgIChpbnQpcmVhbF9sZW4sIG5hbWUpOwotCQl9IGVsc2UgaWYgKGZpbHRlcikgewotCQkJcHJfd2FybmluZygibm8gc3ltYm9scyBwYXNzZWQgdGhlIGdpdmVuIGZpbHRlci5cbiIpOwotCQkJcmV0dXJuIC0yOwkvKiBFbXB0eSBidXQgbWF5YmUgYnkgdGhlIGZpbHRlciAqLwogCQl9IGVsc2UgewogCQkJcHJfd2FybmluZygibm8gc3ltYm9scyBmb3VuZCBpbiAlcywgbWF5YmUgaW5zdGFsbCAiCiAJCQkJICAgImEgZGVidWcgcGFja2FnZT9cbiIsIG5hbWUpOwpAQCAtMzMxLDE5ICszMzAsMTcgQEAKIAlyZXR1cm4gc3RyY21wKG5hbWVhLCBuYW1lYik7CiB9CiAKLXN0cnVjdCBzeW1ib2wgKm1hcF9fZmluZF9zeW1ib2woc3RydWN0IG1hcCAqbWFwLCB1NjQgYWRkciwKLQkJCQlzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQorc3RydWN0IHN5bWJvbCAqbWFwX19maW5kX3N5bWJvbChzdHJ1Y3QgbWFwICptYXAsIHU2NCBhZGRyKQogewotCWlmIChtYXBfX2xvYWQobWFwLCBmaWx0ZXIpIDwgMCkKKwlpZiAobWFwX19sb2FkKG1hcCkgPCAwKQogCQlyZXR1cm4gTlVMTDsKIAogCXJldHVybiBkc29fX2ZpbmRfc3ltYm9sKG1hcC0+ZHNvLCBtYXAtPnR5cGUsIGFkZHIpOwogfQogCi1zdHJ1Y3Qgc3ltYm9sICptYXBfX2ZpbmRfc3ltYm9sX2J5X25hbWUoc3RydWN0IG1hcCAqbWFwLCBjb25zdCBjaGFyICpuYW1lLAotCQkJCQlzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQorc3RydWN0IHN5bWJvbCAqbWFwX19maW5kX3N5bWJvbF9ieV9uYW1lKHN0cnVjdCBtYXAgKm1hcCwgY29uc3QgY2hhciAqbmFtZSkKIHsKLQlpZiAobWFwX19sb2FkKG1hcCwgZmlsdGVyKSA8IDApCisJaWYgKG1hcF9fbG9hZChtYXApIDwgMCkKIAkJcmV0dXJuIE5VTEw7CiAKIAlpZiAoIWRzb19fc29ydGVkX2J5X25hbWUobWFwLT5kc28sIG1hcC0+dHlwZSkpCkBAIC01NTYsMjMgKzU1MywyMiBAQAogCiBzdHJ1Y3Qgc3ltYm9sICptYXBfZ3JvdXBzX19maW5kX3N5bWJvbChzdHJ1Y3QgbWFwX2dyb3VwcyAqbWcsCiAJCQkJICAgICAgIGVudW0gbWFwX3R5cGUgdHlwZSwgdTY0IGFkZHIsCi0JCQkJICAgICAgIHN0cnVjdCBtYXAgKiptYXBwLAotCQkJCSAgICAgICBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQorCQkJCSAgICAgICBzdHJ1Y3QgbWFwICoqbWFwcCkKIHsKIAlzdHJ1Y3QgbWFwICptYXAgPSBtYXBfZ3JvdXBzX19maW5kKG1nLCB0eXBlLCBhZGRyKTsKIAogCS8qIEVuc3VyZSBtYXAgaXMgbG9hZGVkIGJlZm9yZSB1c2luZyBtYXAtPm1hcF9pcCAqLwotCWlmIChtYXAgIT0gTlVMTCAmJiBtYXBfX2xvYWQobWFwLCBmaWx0ZXIpID49IDApIHsKKwlpZiAobWFwICE9IE5VTEwgJiYgbWFwX19sb2FkKG1hcCkgPj0gMCkgewogCQlpZiAobWFwcCAhPSBOVUxMKQogCQkJKm1hcHAgPSBtYXA7Ci0JCXJldHVybiBtYXBfX2ZpbmRfc3ltYm9sKG1hcCwgbWFwLT5tYXBfaXAobWFwLCBhZGRyKSwgZmlsdGVyKTsKKwkJcmV0dXJuIG1hcF9fZmluZF9zeW1ib2wobWFwLCBtYXAtPm1hcF9pcChtYXAsIGFkZHIpKTsKIAl9CiAKIAlyZXR1cm4gTlVMTDsKIH0KIAogc3RydWN0IHN5bWJvbCAqbWFwc19fZmluZF9zeW1ib2xfYnlfbmFtZShzdHJ1Y3QgbWFwcyAqbWFwcywgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkJIHN0cnVjdCBtYXAgKiptYXBwLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQorCQkJCQkgc3RydWN0IG1hcCAqKm1hcHApCiB7CiAJc3RydWN0IHN5bWJvbCAqc3ltOwogCXN0cnVjdCByYl9ub2RlICpuZDsKQEAgLTU4Miw3ICs1NzgsNyBAQAogCWZvciAobmQgPSByYl9maXJzdCgmbWFwcy0+ZW50cmllcyk7IG5kOyBuZCA9IHJiX25leHQobmQpKSB7CiAJCXN0cnVjdCBtYXAgKnBvcyA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3QgbWFwLCByYl9ub2RlKTsKIAotCQlzeW0gPSBtYXBfX2ZpbmRfc3ltYm9sX2J5X25hbWUocG9zLCBuYW1lLCBmaWx0ZXIpOworCQlzeW0gPSBtYXBfX2ZpbmRfc3ltYm9sX2J5X25hbWUocG9zLCBuYW1lKTsKIAogCQlpZiAoc3ltID09IE5VTEwpCiAJCQljb250aW51ZTsKQEAgLTYwMCwxNSArNTk2LDE0IEBACiBzdHJ1Y3Qgc3ltYm9sICptYXBfZ3JvdXBzX19maW5kX3N5bWJvbF9ieV9uYW1lKHN0cnVjdCBtYXBfZ3JvdXBzICptZywKIAkJCQkJICAgICAgIGVudW0gbWFwX3R5cGUgdHlwZSwKIAkJCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCSAgICAgICBzdHJ1Y3QgbWFwICoqbWFwcCwKLQkJCQkJICAgICAgIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCisJCQkJCSAgICAgICBzdHJ1Y3QgbWFwICoqbWFwcCkKIHsKLQlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBtYXBzX19maW5kX3N5bWJvbF9ieV9uYW1lKCZtZy0+bWFwc1t0eXBlXSwgbmFtZSwgbWFwcCwgZmlsdGVyKTsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBtYXBzX19maW5kX3N5bWJvbF9ieV9uYW1lKCZtZy0+bWFwc1t0eXBlXSwgbmFtZSwgbWFwcCk7CiAKIAlyZXR1cm4gc3ltOwogfQogCi1pbnQgbWFwX2dyb3Vwc19fZmluZF9hbXMoc3RydWN0IGFkZHJfbWFwX3N5bWJvbCAqYW1zLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQoraW50IG1hcF9ncm91cHNfX2ZpbmRfYW1zKHN0cnVjdCBhZGRyX21hcF9zeW1ib2wgKmFtcykKIHsKIAlpZiAoYW1zLT5hZGRyIDwgYW1zLT5tYXAtPnN0YXJ0IHx8IGFtcy0+YWRkciA+PSBhbXMtPm1hcC0+ZW5kKSB7CiAJCWlmIChhbXMtPm1hcC0+Z3JvdXBzID09IE5VTEwpCkBAIC02MjAsNyArNjE1LDcgQEAKIAl9CiAKIAlhbXMtPmFsX2FkZHIgPSBhbXMtPm1hcC0+bWFwX2lwKGFtcy0+bWFwLCBhbXMtPmFkZHIpOwotCWFtcy0+c3ltID0gbWFwX19maW5kX3N5bWJvbChhbXMtPm1hcCwgYW1zLT5hbF9hZGRyLCBmaWx0ZXIpOworCWFtcy0+c3ltID0gbWFwX19maW5kX3N5bWJvbChhbXMtPm1hcCwgYW1zLT5hbF9hZGRyKTsKIAogCXJldHVybiBhbXMtPnN5bSA/IDAgOiAtMTsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9tYXAuaCBiL3Rvb2xzL3BlcmYvdXRpbC9tYXAuaAppbmRleCBkODMzOTZjLi5hYmRhY2Y4IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvbWFwLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL21hcC5oCkBAIC0xMjcsMTcgKzEyNywxNCBAQAogICogQG1hcDogdGhlICdzdHJ1Y3QgbWFwIConIGluIHdoaWNoIHN5bWJvbHMgaXRlcmVhdGVkCiAgKiBAc3ltX25hbWU6IHRoZSBzeW1ib2wgbmFtZQogICogQHBvczogdGhlICdzdHJ1Y3Qgc3ltYm9sIConIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yCi0gKiBAZmlsdGVyOiB0byB1c2Ugd2hlbiBsb2FkaW5nIHRoZSBEU08KICAqLwotI2RlZmluZSBfX21hcF9fZm9yX2VhY2hfc3ltYm9sX2J5X25hbWUobWFwLCBzeW1fbmFtZSwgcG9zLCBmaWx0ZXIpCVwKLQlmb3IgKHBvcyA9IG1hcF9fZmluZF9zeW1ib2xfYnlfbmFtZShtYXAsIHN5bV9uYW1lLCBmaWx0ZXIpOwlcCisjZGVmaW5lIF9fbWFwX19mb3JfZWFjaF9zeW1ib2xfYnlfbmFtZShtYXAsIHN5bV9uYW1lLCBwb3MpCVwKKwlmb3IgKHBvcyA9IG1hcF9fZmluZF9zeW1ib2xfYnlfbmFtZShtYXAsIHN5bV9uYW1lKTsJXAogCSAgICAgcG9zICYmIGFyY2hfX2NvbXBhcmVfc3ltYm9sX25hbWVzKHBvcy0+bmFtZSwgc3ltX25hbWUpID09IDA7CVwKIAkgICAgIHBvcyA9IHN5bWJvbF9fbmV4dF9ieV9uYW1lKHBvcykpCiAKICNkZWZpbmUgbWFwX19mb3JfZWFjaF9zeW1ib2xfYnlfbmFtZShtYXAsIHN5bV9uYW1lLCBwb3MpCQlcCi0JX19tYXBfX2Zvcl9lYWNoX3N5bWJvbF9ieV9uYW1lKG1hcCwgc3ltX25hbWUsIChwb3MpLCBOVUxMKQotCi10eXBlZGVmIGludCAoKnN5bWJvbF9maWx0ZXJfdCkoc3RydWN0IG1hcCAqbWFwLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pOworCV9fbWFwX19mb3JfZWFjaF9zeW1ib2xfYnlfbmFtZShtYXAsIHN5bV9uYW1lLCAocG9zKSkKIAogaW50IGFyY2hfX2NvbXBhcmVfc3ltYm9sX25hbWVzKGNvbnN0IGNoYXIgKm5hbWVhLCBjb25zdCBjaGFyICpuYW1lYik7CiB2b2lkIG1hcF9faW5pdChzdHJ1Y3QgbWFwICptYXAsIGVudW0gbWFwX3R5cGUgdHlwZSwKQEAgLTE3MywxMSArMTcwLDkgQEAKIGludCBtYXBfX2ZwcmludGZfc3JjbGluZShzdHJ1Y3QgbWFwICptYXAsIHU2NCBhZGRyLCBjb25zdCBjaGFyICpwcmVmaXgsCiAJCQkgRklMRSAqZnApOwogCi1pbnQgbWFwX19sb2FkKHN0cnVjdCBtYXAgKm1hcCwgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7Ci1zdHJ1Y3Qgc3ltYm9sICptYXBfX2ZpbmRfc3ltYm9sKHN0cnVjdCBtYXAgKm1hcCwKLQkJCQl1NjQgYWRkciwgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7Ci1zdHJ1Y3Qgc3ltYm9sICptYXBfX2ZpbmRfc3ltYm9sX2J5X25hbWUoc3RydWN0IG1hcCAqbWFwLCBjb25zdCBjaGFyICpuYW1lLAotCQkJCQlzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKTsKK2ludCBtYXBfX2xvYWQoc3RydWN0IG1hcCAqbWFwKTsKK3N0cnVjdCBzeW1ib2wgKm1hcF9fZmluZF9zeW1ib2woc3RydWN0IG1hcCAqbWFwLCB1NjQgYWRkcik7CitzdHJ1Y3Qgc3ltYm9sICptYXBfX2ZpbmRfc3ltYm9sX2J5X25hbWUoc3RydWN0IG1hcCAqbWFwLCBjb25zdCBjaGFyICpuYW1lKTsKIHZvaWQgbWFwX19maXh1cF9zdGFydChzdHJ1Y3QgbWFwICptYXApOwogdm9pZCBtYXBfX2ZpeHVwX2VuZChzdHJ1Y3QgbWFwICptYXApOwogCkBAIC0xOTEsNyArMTg2LDcgQEAKIHN0cnVjdCBtYXAgKm1hcHNfX2ZpcnN0KHN0cnVjdCBtYXBzICptYXBzKTsKIHN0cnVjdCBtYXAgKm1hcF9fbmV4dChzdHJ1Y3QgbWFwICptYXApOwogc3RydWN0IHN5bWJvbCAqbWFwc19fZmluZF9zeW1ib2xfYnlfbmFtZShzdHJ1Y3QgbWFwcyAqbWFwcywgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1hcCAqKm1hcHAsIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbWFwICoqbWFwcCk7CiB2b2lkIG1hcF9ncm91cHNfX2luaXQoc3RydWN0IG1hcF9ncm91cHMgKm1nLCBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSk7CiB2b2lkIG1hcF9ncm91cHNfX2V4aXQoc3RydWN0IG1hcF9ncm91cHMgKm1nKTsKIGludCBtYXBfZ3JvdXBzX19jbG9uZShzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsCkBAIC0yMzEsMjUgKzIyNiwyMiBAQAogCiBzdHJ1Y3Qgc3ltYm9sICptYXBfZ3JvdXBzX19maW5kX3N5bWJvbChzdHJ1Y3QgbWFwX2dyb3VwcyAqbWcsCiAJCQkJICAgICAgIGVudW0gbWFwX3R5cGUgdHlwZSwgdTY0IGFkZHIsCi0JCQkJICAgICAgIHN0cnVjdCBtYXAgKiptYXBwLAotCQkJCSAgICAgICBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKTsKKwkJCQkgICAgICAgc3RydWN0IG1hcCAqKm1hcHApOwogCiBzdHJ1Y3Qgc3ltYm9sICptYXBfZ3JvdXBzX19maW5kX3N5bWJvbF9ieV9uYW1lKHN0cnVjdCBtYXBfZ3JvdXBzICptZywKIAkJCQkJICAgICAgIGVudW0gbWFwX3R5cGUgdHlwZSwKIAkJCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCSAgICAgICBzdHJ1Y3QgbWFwICoqbWFwcCwKLQkJCQkJICAgICAgIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpOworCQkJCQkgICAgICAgc3RydWN0IG1hcCAqKm1hcHApOwogCiBzdHJ1Y3QgYWRkcl9tYXBfc3ltYm9sOwogCi1pbnQgbWFwX2dyb3Vwc19fZmluZF9hbXMoc3RydWN0IGFkZHJfbWFwX3N5bWJvbCAqYW1zLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKTsKK2ludCBtYXBfZ3JvdXBzX19maW5kX2FtcyhzdHJ1Y3QgYWRkcl9tYXBfc3ltYm9sICphbXMpOwogCiBzdGF0aWMgaW5saW5lCiBzdHJ1Y3Qgc3ltYm9sICptYXBfZ3JvdXBzX19maW5kX2Z1bmN0aW9uX2J5X25hbWUoc3RydWN0IG1hcF9ncm91cHMgKm1nLAotCQkJCQkJIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBtYXAgKiptYXBwLAotCQkJCQkJIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCisJCQkJCQkgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG1hcCAqKm1hcHApCiB7Ci0JcmV0dXJuIG1hcF9ncm91cHNfX2ZpbmRfc3ltYm9sX2J5X25hbWUobWcsIE1BUF9fRlVOQ1RJT04sIG5hbWUsIG1hcHAsIGZpbHRlcik7CisJcmV0dXJuIG1hcF9ncm91cHNfX2ZpbmRfc3ltYm9sX2J5X25hbWUobWcsIE1BUF9fRlVOQ1RJT04sIG5hbWUsIG1hcHApOwogfQogCiBpbnQgbWFwX2dyb3Vwc19fZml4dXBfb3ZlcmxhcHBpbmdzKHN0cnVjdCBtYXBfZ3JvdXBzICptZywgc3RydWN0IG1hcCAqbWFwLApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5jIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5jCmluZGV4IDZjOTEzYzMuLjMzNTQ2YzMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuYworKysgYi90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmMKQEAgLTkwNCw2ICs5MDQsNyBAQAogCVtQQVJTRV9FVkVOVFNfX1RFUk1fVFlQRV9NQVhfU1RBQ0tdCQk9ICJtYXgtc3RhY2siLAogCVtQQVJTRV9FVkVOVFNfX1RFUk1fVFlQRV9PVkVSV1JJVEVdCQk9ICJvdmVyd3JpdGUiLAogCVtQQVJTRV9FVkVOVFNfX1RFUk1fVFlQRV9OT09WRVJXUklURV0JCT0gIm5vLW92ZXJ3cml0ZSIsCisJW1BBUlNFX0VWRU5UU19fVEVSTV9UWVBFX0RSVl9DRkddCQk9ICJkcml2ZXItY29uZmlnIiwKIH07CiAKIHN0YXRpYyBib29sIGNvbmZpZ190ZXJtX3Nocmlua2VkOwpAQCAtMTAzNCw3ICsxMDM1LDggQEAKIAkJCSAgIHN0cnVjdCBwYXJzZV9ldmVudHNfdGVybSAqdGVybSwKIAkJCSAgIHN0cnVjdCBwYXJzZV9ldmVudHNfZXJyb3IgKmVycikKIHsKLQlpZiAodGVybS0+dHlwZV90ZXJtID09IFBBUlNFX0VWRU5UU19fVEVSTV9UWVBFX1VTRVIpCisJaWYgKHRlcm0tPnR5cGVfdGVybSA9PSBQQVJTRV9FVkVOVFNfX1RFUk1fVFlQRV9VU0VSIHx8CisJICAgIHRlcm0tPnR5cGVfdGVybSA9PSBQQVJTRV9FVkVOVFNfX1RFUk1fVFlQRV9EUlZfQ0ZHKQogCQkvKgogCQkgKiBBbHdheXMgc3VjY2VlZCBmb3Igc3lzZnMgdGVybXMsIGFzIHdlIGRvbnQga25vdwogCQkgKiBhdCB0aGlzIHBvaW50IHdoYXQgdHlwZSB0aGV5IG5lZWQgdG8gaGF2ZS4KQEAgLTExMzQsNiArMTEzNiw5IEBACiAJCWNhc2UgUEFSU0VfRVZFTlRTX19URVJNX1RZUEVfTk9PVkVSV1JJVEU6CiAJCQlBRERfQ09ORklHX1RFUk0oT1ZFUldSSVRFLCBvdmVyd3JpdGUsIHRlcm0tPnZhbC5udW0gPyAwIDogMSk7CiAJCQlicmVhazsKKwkJY2FzZSBQQVJTRV9FVkVOVFNfX1RFUk1fVFlQRV9EUlZfQ0ZHOgorCQkJQUREX0NPTkZJR19URVJNKERSVl9DRkcsIGRydl9jZmcsIHRlcm0tPnZhbC5zdHIpOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlicmVhazsKIAkJfQpAQCAtMTc1NSwyMCArMTc2MCw0OSBAQAogc3RhdGljIGludCBzZXRfZmlsdGVyKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgY29uc3Qgdm9pZCAqYXJnKQogewogCWNvbnN0IGNoYXIgKnN0ciA9IGFyZzsKKwlib29sIGZvdW5kID0gZmFsc2U7CisJaW50IG5yX2FkZHJfZmlsdGVycyA9IDA7CisJc3RydWN0IHBlcmZfcG11ICpwbXUgPSBOVUxMOwogCi0JaWYgKGV2c2VsID09IE5VTEwgfHwgZXZzZWwtPmF0dHIudHlwZSAhPSBQRVJGX1RZUEVfVFJBQ0VQT0lOVCkgewotCQlmcHJpbnRmKHN0ZGVyciwKLQkJCSItLWZpbHRlciBvcHRpb24gc2hvdWxkIGZvbGxvdyBhIC1lIHRyYWNlcG9pbnQgb3B0aW9uXG4iKTsKLQkJcmV0dXJuIC0xOworCWlmIChldnNlbCA9PSBOVUxMKQorCQlnb3RvIGVycjsKKworCWlmIChldnNlbC0+YXR0ci50eXBlID09IFBFUkZfVFlQRV9UUkFDRVBPSU5UKSB7CisJCWlmIChwZXJmX2V2c2VsX19hcHBlbmRfdHBfZmlsdGVyKGV2c2VsLCBzdHIpIDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIm5vdCBlbm91Z2ggbWVtb3J5IHRvIGhvbGQgZmlsdGVyIHN0cmluZ1xuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAocGVyZl9ldnNlbF9fYXBwZW5kX2ZpbHRlcihldnNlbCwgIiYmIiwgc3RyKSA8IDApIHsKKwl3aGlsZSAoKHBtdSA9IHBlcmZfcG11X19zY2FuKHBtdSkpICE9IE5VTEwpCisJCWlmIChwbXUtPnR5cGUgPT0gZXZzZWwtPmF0dHIudHlwZSkgeworCQkJZm91bmQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKworCWlmIChmb3VuZCkKKwkJcGVyZl9wbXVfX3NjYW5fZmlsZShwbXUsICJucl9hZGRyX2ZpbHRlcnMiLAorCQkJCSAgICAiJWQiLCAmbnJfYWRkcl9maWx0ZXJzKTsKKworCWlmICghbnJfYWRkcl9maWx0ZXJzKQorCQlnb3RvIGVycjsKKworCWlmIChwZXJmX2V2c2VsX19hcHBlbmRfYWRkcl9maWx0ZXIoZXZzZWwsIHN0cikgPCAwKSB7CiAJCWZwcmludGYoc3RkZXJyLAogCQkJIm5vdCBlbm91Z2ggbWVtb3J5IHRvIGhvbGQgZmlsdGVyIHN0cmluZ1xuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKIAlyZXR1cm4gMDsKKworZXJyOgorCWZwcmludGYoc3RkZXJyLAorCQkiLS1maWx0ZXIgb3B0aW9uIHNob3VsZCBmb2xsb3cgYSAtZSB0cmFjZXBvaW50IG9yIEhXIHRyYWNlciBvcHRpb25cbiIpOworCisJcmV0dXJuIC0xOwogfQogCiBpbnQgcGFyc2VfZmlsdGVyKGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdCwgY29uc3QgY2hhciAqc3RyLApAQCAtMTc5Myw3ICsxODI3LDcgQEAKIAogCXNucHJpbnRmKG5ld19maWx0ZXIsIHNpemVvZihuZXdfZmlsdGVyKSwgImNvbW1vbl9waWQgIT0gJWQiLCBnZXRwaWQoKSk7CiAKLQlpZiAocGVyZl9ldnNlbF9fYXBwZW5kX2ZpbHRlcihldnNlbCwgIiYmIiwgbmV3X2ZpbHRlcikgPCAwKSB7CisJaWYgKHBlcmZfZXZzZWxfX2FwcGVuZF90cF9maWx0ZXIoZXZzZWwsIG5ld19maWx0ZXIpIDwgMCkgewogCQlmcHJpbnRmKHN0ZGVyciwKIAkJCSJub3QgZW5vdWdoIG1lbW9yeSB0byBob2xkIGZpbHRlciBzdHJpbmdcbiIpOwogCQlyZXR1cm4gLTE7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmggYi90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmgKaW5kZXggZDFlZGJmOC4uOGQwOWE5NyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuaApAQCAtNzEsNiArNzEsNyBAQAogCVBBUlNFX0VWRU5UU19fVEVSTV9UWVBFX01BWF9TVEFDSywKIAlQQVJTRV9FVkVOVFNfX1RFUk1fVFlQRV9OT09WRVJXUklURSwKIAlQQVJTRV9FVkVOVFNfX1RFUk1fVFlQRV9PVkVSV1JJVEUsCisJUEFSU0VfRVZFTlRTX19URVJNX1RZUEVfRFJWX0NGRywKIAlfX1BBUlNFX0VWRU5UU19fVEVSTV9UWVBFX05SLAogfTsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5sIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5sCmluZGV4IDdhMjUxOTQuLjlmNDNmZGEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMubAorKysgYi90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmwKQEAgLTUzLDYgKzUzLDI2IEBACiAJcmV0dXJuIHRva2VuOwogfQogCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgcGFyc2VyIGdldHMgdHdvIGtpbmQgb2YgaW5wdXQ6CisgKgorICogCUBjZmcxIG9yIEBjZmcyPWNvbmZpZworICoKKyAqIFRoZSBsZWFkaW5nICdAJyBpcyBzdHJpcHBlZCBvZmYgYmVmb3JlICdjZmcxJyBhbmQgJ2NmZzI9Y29uZmlnJyBhcmUgZ2l2ZW4gdG8KKyAqIGJpc29uLiAgSW4gdGhlIGxhdHRlciBjYXNlIGl0IGlzIG5lY2Vzc2FyeSB0byBrZWVwIHRoZSBzdHJpbmcgaW50YWN0IHNvIHRoYXQKKyAqIHRoZSBQTVUga2VybmVsIGRyaXZlciBjYW4gZGV0ZXJtaW5lIHdoYXQgY29uZmlndXJhYmxlIGlzIGFzc29jaWF0ZWQgdG8KKyAqICdjb25maWcnLgorICovCitzdGF0aWMgaW50IGRydl9zdHIoeXlzY2FuX3Qgc2Nhbm5lciwgaW50IHRva2VuKQoreworCVlZU1RZUEUgKnl5bHZhbCA9IHBhcnNlX2V2ZW50c19nZXRfbHZhbChzY2FubmVyKTsKKwljaGFyICp0ZXh0ID0gcGFyc2VfZXZlbnRzX2dldF90ZXh0KHNjYW5uZXIpOworCisJLyogU3RyaXAgb2ZmIHRoZSAnQCcgKi8KKwl5eWx2YWwtPnN0ciA9IHN0cmR1cCh0ZXh0ICsgMSk7CisJcmV0dXJuIHRva2VuOworfQorCiAjZGVmaW5lIFJFV0lORChfX2FsbG9jKQkJCQlcCiBkbyB7CQkJCQkJCQlcCiAJWVlTVFlQRSAqX195eWx2YWwgPSBwYXJzZV9ldmVudHNfZ2V0X2x2YWwoeXlzY2FubmVyKTsJXApAQCAtMTI0LDYgKzE0NCw3IEBACiBudW1fcmF3X2hleAlbYS1mQS1GMC05XSsKIG5hbWUJCVthLXpBLVpfKj9dW2EtekEtWjAtOV8qPy5dKgogbmFtZV9taW51cwlbYS16QS1aXyo/XVthLXpBLVowLTlcLV8qPy46XSoKK2Rydl9jZmdfdGVybQlbYS16QS1aMC05X1wuXSsoPVthLXpBLVowLTlfKj9cLjpdKyk/CiAvKiBJZiB5b3UgYWRkIGEgbW9kaWZpZXIgeW91IG5lZWQgdG8gdXBkYXRlIGNoZWNrX21vZGlmaWVyKCkgKi8KIG1vZGlmaWVyX2V2ZW50CVt1a2hwUEdIU0RJXSsKIG1vZGlmaWVyX2JwCVtyd3hdezEsM30KQEAgLTIwOSw2ICsyMzAsNyBAQAoge25hbWVfbWludXN9CQl7IHJldHVybiBzdHIoeXlzY2FubmVyLCBQRV9OQU1FKTsgfQogXFthbGxcXQkJCXsgcmV0dXJuIFBFX0FSUkFZX0FMTDsgfQogIlsiCQkJeyBCRUdJTihhcnJheSk7IHJldHVybiAnWyc7IH0KK0B7ZHJ2X2NmZ190ZXJtfQkJeyByZXR1cm4gZHJ2X3N0cih5eXNjYW5uZXIsIFBFX0RSVl9DRkdfVEVSTSk7IH0KIH0KIAogPG1lbT57CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLnkgYi90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLnkKaW5kZXggNWJlNGE1Zi4uODc5MTE1ZiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy55CisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMueQpAQCAtNDksNiArNDksNyBAQAogJXRva2VuIFBFX0VSUk9SCiAldG9rZW4gUEVfUE1VX0VWRU5UX1BSRSBQRV9QTVVfRVZFTlRfU1VGIFBFX0tFUk5FTF9QTVVfRVZFTlQKICV0b2tlbiBQRV9BUlJBWV9BTEwgUEVfQVJSQVlfUkFOR0UKKyV0b2tlbiBQRV9EUlZfQ0ZHX1RFUk0KICV0eXBlIDxudW0+IFBFX1ZBTFVFCiAldHlwZSA8bnVtPiBQRV9WQUxVRV9TWU1fSFcKICV0eXBlIDxudW0+IFBFX1ZBTFVFX1NZTV9TVwpAQCAtNjMsNiArNjQsNyBAQAogJXR5cGUgPHN0cj4gUEVfTU9ESUZJRVJfQlAKICV0eXBlIDxzdHI+IFBFX0VWRU5UX05BTUUKICV0eXBlIDxzdHI+IFBFX1BNVV9FVkVOVF9QUkUgUEVfUE1VX0VWRU5UX1NVRiBQRV9LRVJORUxfUE1VX0VWRU5UCisldHlwZSA8c3RyPiBQRV9EUlZfQ0ZHX1RFUk0KICV0eXBlIDxudW0+IHZhbHVlX3N5bQogJXR5cGUgPGhlYWQ+IGV2ZW50X2NvbmZpZwogJXR5cGUgPGhlYWQ+IG9wdF9ldmVudF9jb25maWcKQEAgLTU5OSw2ICs2MDEsMTUgQEAKIAl0ZXJtLT5hcnJheSA9ICQyOwogCSQkID0gdGVybTsKIH0KK3wKK1BFX0RSVl9DRkdfVEVSTQoreworCXN0cnVjdCBwYXJzZV9ldmVudHNfdGVybSAqdGVybTsKKworCUFCT1JUX09OKHBhcnNlX2V2ZW50c190ZXJtX19zdHIoJnRlcm0sIFBBUlNFX0VWRU5UU19fVEVSTV9UWVBFX0RSVl9DRkcsCisJCQkJCSQxLCAkMSwgJkAxLCBOVUxMKSk7CisJJCQgPSB0ZXJtOworfQogCiBhcnJheToKICdbJyBhcnJheV90ZXJtcyAnXScKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wbXUuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wbXUuYwppbmRleCBkZGIwMjYxLi4yYmFiY2RmIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcG11LmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3BtdS5jCkBAIC00NDUsMTQgKzQ0NSwyMyBAQAogCUZJTEUgKmZpbGU7CiAJc3RydWN0IGNwdV9tYXAgKmNwdXM7CiAJY29uc3QgY2hhciAqc3lzZnMgPSBzeXNmc19fbW91bnRwb2ludCgpOworCWNvbnN0IGNoYXIgKnRlbXBsYXRlc1tdID0geworCQkgIiVzL2J1cy9ldmVudF9zb3VyY2UvZGV2aWNlcy8lcy9jcHVtYXNrIiwKKwkJICIlcy9idXMvZXZlbnRfc291cmNlL2RldmljZXMvJXMvY3B1cyIsCisJCSBOVUxMCisJfTsKKwljb25zdCBjaGFyICoqdGVtcGxhdGU7CiAKIAlpZiAoIXN5c2ZzKQogCQlyZXR1cm4gTlVMTDsKIAotCXNucHJpbnRmKHBhdGgsIFBBVEhfTUFYLAotCQkgIiVzL2J1cy9ldmVudF9zb3VyY2UvZGV2aWNlcy8lcy9jcHVtYXNrIiwgc3lzZnMsIG5hbWUpOworCWZvciAodGVtcGxhdGUgPSB0ZW1wbGF0ZXM7ICp0ZW1wbGF0ZTsgdGVtcGxhdGUrKykgeworCQlzbnByaW50ZihwYXRoLCBQQVRIX01BWCwgKnRlbXBsYXRlLCBzeXNmcywgbmFtZSk7CisJCWlmIChzdGF0KHBhdGgsICZzdCkgPT0gMCkKKwkJCWJyZWFrOworCX0KIAotCWlmIChzdGF0KHBhdGgsICZzdCkgPCAwKQorCWlmICghKnRlbXBsYXRlKQogCQlyZXR1cm4gTlVMTDsKIAogCWZpbGUgPSBmb3BlbihwYXRoLCAiciIpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3BtdS5oIGIvdG9vbHMvcGVyZi91dGlsL3BtdS5oCmluZGV4IDVkN2U4NDQuLjc0MzQyMmEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wbXUuaAorKysgYi90b29scy9wZXJmL3V0aWwvcG11LmgKQEAgLTQsNiArNCw3IEBACiAjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgogI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlICJldnNlbC5oIgogI2luY2x1ZGUgInBhcnNlLWV2ZW50cy5oIgogCiBlbnVtIHsKQEAgLTI1LDYgKzI2LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGZvcm1hdDsgIC8qIEhFQUQgc3RydWN0IHBlcmZfcG11X2Zvcm1hdCAtPiBsaXN0ICovCiAJc3RydWN0IGxpc3RfaGVhZCBhbGlhc2VzOyAvKiBIRUFEIHN0cnVjdCBwZXJmX3BtdV9hbGlhcyAtPiBsaXN0ICovCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OyAgICAvKiBFTEVNICovCisJaW50ICgqc2V0X2Rydl9jb25maWcpCShzdHJ1Y3QgcGVyZl9ldnNlbF9jb25maWdfdGVybSAqdGVybSk7CiB9OwogCiBzdHJ1Y3QgcGVyZl9wbXVfaW5mbyB7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5jCmluZGV4IDI4NzMzOTYuLmZjZmJlZjAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5jCkBAIC0xMTAsMTMgKzExMCwxMiBAQAogc3RhdGljIHN0cnVjdCBzeW1ib2wgKl9fZmluZF9rZXJuZWxfZnVuY3Rpb25fYnlfbmFtZShjb25zdCBjaGFyICpuYW1lLAogCQkJCQkJICAgICBzdHJ1Y3QgbWFwICoqbWFwcCkKIHsKLQlyZXR1cm4gbWFjaGluZV9fZmluZF9rZXJuZWxfZnVuY3Rpb25fYnlfbmFtZShob3N0X21hY2hpbmUsIG5hbWUsIG1hcHAsCi0JCQkJCQkgICAgIE5VTEwpOworCXJldHVybiBtYWNoaW5lX19maW5kX2tlcm5lbF9mdW5jdGlvbl9ieV9uYW1lKGhvc3RfbWFjaGluZSwgbmFtZSwgbWFwcCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc3ltYm9sICpfX2ZpbmRfa2VybmVsX2Z1bmN0aW9uKHU2NCBhZGRyLCBzdHJ1Y3QgbWFwICoqbWFwcCkKIHsKLQlyZXR1cm4gbWFjaGluZV9fZmluZF9rZXJuZWxfZnVuY3Rpb24oaG9zdF9tYWNoaW5lLCBhZGRyLCBtYXBwLCBOVUxMKTsKKwlyZXR1cm4gbWFjaGluZV9fZmluZF9rZXJuZWxfZnVuY3Rpb24oaG9zdF9tYWNoaW5lLCBhZGRyLCBtYXBwKTsKIH0KIAogc3RhdGljIHN0cnVjdCByZWZfcmVsb2Nfc3ltICprZXJuZWxfZ2V0X3JlZl9yZWxvY19zeW0odm9pZCkKQEAgLTEyNSw3ICsxMjQsNyBAQAogCXN0cnVjdCBrbWFwICprbWFwOwogCXN0cnVjdCBtYXAgKm1hcCA9IG1hY2hpbmVfX2tlcm5lbF9tYXAoaG9zdF9tYWNoaW5lKTsKIAotCWlmIChtYXBfX2xvYWQobWFwLCBOVUxMKSA8IDApCisJaWYgKG1hcF9fbG9hZChtYXApIDwgMCkKIAkJcmV0dXJuIE5VTEw7CiAKIAlrbWFwID0gbWFwX19rbWFwKG1hcCk7CkBAIC0yMTQsOSArMjEzLDEzIEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXB0cjIgPSBzdHJwYnJrKHB0cjEsICItLl8iKTsKLQlpZiAocHRyMikKLQkJKnB0cjIgPSAnXDAnOworCWZvciAocHRyMiA9IHB0cjE7IHB0cjIgIT0gJ1wwJzsgcHRyMisrKSB7CisJCWlmICghaXNhbG51bSgqcHRyMikgJiYgKnB0cjIgIT0gJ18nKSB7CisJCQkqcHRyMiA9ICdcMCc7CisJCQlicmVhazsKKwkJfQorCX0KKwogCXJldCA9IGVfc25wcmludGYoYnVmLCA2NCwgIiVzXyVzIiwgUEVSRlBST0JFX0dST1VQLCBwdHIxKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CkBAIC0zNTEsOSArMzU0LDkgQEAKIAl2bWxpbnV4X25hbWUgPSBzeW1ib2xfY29uZi52bWxpbnV4X25hbWU7CiAJZHNvLT5sb2FkX2Vycm5vID0gMDsKIAlpZiAodm1saW51eF9uYW1lKQotCQlyZXQgPSBkc29fX2xvYWRfdm1saW51eChkc28sIG1hcCwgdm1saW51eF9uYW1lLCBmYWxzZSwgTlVMTCk7CisJCXJldCA9IGRzb19fbG9hZF92bWxpbnV4KGRzbywgbWFwLCB2bWxpbnV4X25hbWUsIGZhbHNlKTsKIAllbHNlCi0JCXJldCA9IGRzb19fbG9hZF92bWxpbnV4X3BhdGgoZHNvLCBtYXAsIE5VTEwpOworCQlyZXQgPSBkc29fX2xvYWRfdm1saW51eF9wYXRoKGRzbywgbWFwKTsKIGZvdW5kOgogCSpwZHNvID0gZHNvOwogCXJldHVybiByZXQ7CkBAIC02NzQsNiArNjc3LDEwIEBACiAJY2hhciAqdG1wOwogCWludCBpLCBza2lwcGVkID0gMDsKIAorCS8qIFNraXAgcG9zdCBwcm9jZXNzIGlmIHRoZSB0YXJnZXQgaXMgYW4gb2ZmbGluZSBrZXJuZWwgKi8KKwlpZiAoc3ltYm9sX2NvbmYuaWdub3JlX3ZtbGludXhfYnVpbGRpZCkKKwkJcmV0dXJuIDA7CisKIAlyZWxvY19zeW0gPSBrZXJuZWxfZ2V0X3JlZl9yZWxvY19zeW0oKTsKIAlpZiAoIXJlbG9jX3N5bSkgewogCQlwcl93YXJuaW5nKCJSZWxvY2F0ZWQgYmFzZSBzeW1ib2wgaXMgbm90IGZvdW5kIVxuIik7CkBAIC0xNjE0LDE5ICsxNjIxLDI3IEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyogUmV0dXJucyB0cnVlIGlmICphbnkqIEFSRyBpcyBlaXRoZXIgQyB2YXJpYWJsZSwgJHBhcmFtcyBvciAkdmFycy4gKi8KK2Jvb2wgcGVyZl9wcm9iZV93aXRoX3ZhcihzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2KQoreworCWludCBpID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBwZXYtPm5hcmdzOyBpKyspCisJCWlmIChpc19jX3Zhcm5hbWUocGV2LT5hcmdzW2ldLnZhcikgICAgICAgICAgICAgIHx8CisJCSAgICAhc3RyY21wKHBldi0+YXJnc1tpXS52YXIsIFBST0JFX0FSR19QQVJBTVMpIHx8CisJCSAgICAhc3RyY21wKHBldi0+YXJnc1tpXS52YXIsIFBST0JFX0FSR19WQVJTKSkKKwkJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKwogLyogUmV0dXJuIHRydWUgaWYgdGhpcyBwZXJmX3Byb2JlX2V2ZW50IHJlcXVpcmVzIGRlYnVnaW5mbyAqLwogYm9vbCBwZXJmX3Byb2JlX2V2ZW50X25lZWRfZHdhcmYoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldikKIHsKLQlpbnQgaTsKLQogCWlmIChwZXYtPnBvaW50LmZpbGUgfHwgcGV2LT5wb2ludC5saW5lIHx8IHBldi0+cG9pbnQubGF6eV9saW5lKQogCQlyZXR1cm4gdHJ1ZTsKIAotCWZvciAoaSA9IDA7IGkgPCBwZXYtPm5hcmdzOyBpKyspCi0JCWlmIChpc19jX3Zhcm5hbWUocGV2LT5hcmdzW2ldLnZhcikgfHwKLQkJICAgICFzdHJjbXAocGV2LT5hcmdzW2ldLnZhciwgIiRwYXJhbXMiKSB8fAotCQkgICAgIXN0cmNtcChwZXYtPmFyZ3NbaV0udmFyLCAiJHZhcnMiKSkKLQkJCXJldHVybiB0cnVlOworCWlmIChwZXJmX3Byb2JlX3dpdGhfdmFyKHBldikpCisJCXJldHVybiB0cnVlOwogCiAJcmV0dXJuIGZhbHNlOwogfQpAQCAtMTk4Nyw3ICsyMDAyLDcgQEAKIAkJbWFwID0gZHNvX19uZXdfbWFwKHRwLT5tb2R1bGUpOwogCQlpZiAoIW1hcCkKIAkJCWdvdG8gb3V0OwotCQlzeW0gPSBtYXBfX2ZpbmRfc3ltYm9sKG1hcCwgYWRkciwgTlVMTCk7CisJCXN5bSA9IG1hcF9fZmluZF9zeW1ib2wobWFwLCBhZGRyKTsKIAl9IGVsc2UgewogCQlpZiAodHAtPnN5bWJvbCAmJiAhYWRkcikgewogCQkJaWYgKGtlcm5lbF9nZXRfc3ltYm9sX2FkZHJlc3NfYnlfbmFtZSh0cC0+c3ltYm9sLApAQCAtMjY5Miw3ICsyNzA3LDcgQEAKIAlzdHJ1Y3Qgc3ltYm9sICpzeW07CiAJc3RydWN0IHJiX25vZGUgKnRtcDsKIAotCWlmIChtYXBfX2xvYWQobWFwLCBOVUxMKSA8IDApCisJaWYgKG1hcF9fbG9hZChtYXApIDwgMCkKIAkJcmV0dXJuIDA7CiAKIAltYXBfX2Zvcl9lYWNoX3N5bWJvbChtYXAsIHN5bSwgdG1wKSB7CkBAIC0zMjA3LDYgKzMyMjIsNTIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzaG93X3Byb2JlX3RyYWNlX2V2ZW50KHN0cnVjdCBwcm9iZV90cmFjZV9ldmVudCAqdGV2KQoreworCWNoYXIgKmJ1ZiA9IHN5bnRoZXNpemVfcHJvYmVfdHJhY2VfY29tbWFuZCh0ZXYpOworCisJaWYgKCFidWYpIHsKKwkJcHJfZGVidWcoIkZhaWxlZCB0byBzeW50aGVzaXplIHByb2JlIHRyYWNlIGV2ZW50LlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFNob3dpbmcgZGVmaW5pdGlvbiBhbHdheXMgZ28gc3Rkb3V0ICovCisJcHJpbnRmKCIlc1xuIiwgYnVmKTsKKwlmcmVlKGJ1Zik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNob3dfcHJvYmVfdHJhY2VfZXZlbnRzKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXZzLCBpbnQgbnBldnMpCit7CisJc3RydWN0IHN0cmxpc3QgKm5hbWVsaXN0ID0gc3RybGlzdF9fbmV3KE5VTEwsIE5VTEwpOworCXN0cnVjdCBwcm9iZV90cmFjZV9ldmVudCAqdGV2OworCXN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXY7CisJaW50IGksIGosIHJldCA9IDA7CisKKwlpZiAoIW5hbWVsaXN0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaiA9IDA7IGogPCBucGV2cyAmJiAhcmV0OyBqKyspIHsKKwkJcGV2ID0gJnBldnNbal07CisJCWZvciAoaSA9IDA7IGkgPCBwZXYtPm50ZXZzICYmICFyZXQ7IGkrKykgeworCQkJdGV2ID0gJnBldi0+dGV2c1tpXTsKKwkJCS8qIFNraXAgaWYgdGhlIHN5bWJvbCBpcyBvdXQgb2YgLnRleHQgb3IgYmxhY2tsaXN0ZWQgKi8KKwkJCWlmICghdGV2LT5wb2ludC5zeW1ib2wgJiYgIXBldi0+dXByb2JlcykKKwkJCQljb250aW51ZTsKKworCQkJLyogU2V0IG5ldyBuYW1lIGZvciB0ZXYgKGFuZCB1cGRhdGUgbmFtZWxpc3QpICovCisJCQlyZXQgPSBwcm9iZV90cmFjZV9ldmVudF9fc2V0X25hbWUodGV2LCBwZXYsCisJCQkJCQkJICBuYW1lbGlzdCwgdHJ1ZSk7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSBzaG93X3Byb2JlX3RyYWNlX2V2ZW50KHRldik7CisJCX0KKwl9CisJc3RybGlzdF9fZGVsZXRlKG5hbWVsaXN0KTsKKworCXJldHVybiByZXQ7Cit9CisKIGludCBhcHBseV9wZXJmX3Byb2JlX2V2ZW50cyhzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2cywgaW50IG5wZXZzKQogewogCWludCBpLCByZXQgPSAwOwpAQCAtMzI4OSwyNCArMzM1MCwxMCBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qIFRPRE86IGRvbid0IHVzZSBhIGdsb2JhbCB2YXJpYWJsZSBmb3IgZmlsdGVyIC4uLiAqLwotc3RhdGljIHN0cnVjdCBzdHJmaWx0ZXIgKmF2YWlsYWJsZV9mdW5jX2ZpbHRlcjsKLQotLyoKLSAqIElmIGEgc3ltYm9sIGNvcnJlc3BvbmRzIHRvIGEgZnVuY3Rpb24gd2l0aCBnbG9iYWwgYmluZGluZyBhbmQKLSAqIG1hdGNoZXMgZmlsdGVyIHJldHVybiAwLiBGb3IgYWxsIG90aGVycyByZXR1cm4gMS4KLSAqLwotc3RhdGljIGludCBmaWx0ZXJfYXZhaWxhYmxlX2Z1bmN0aW9ucyhzdHJ1Y3QgbWFwICptYXAgX19tYXliZV91bnVzZWQsCi0JCQkJICAgICAgc3RydWN0IHN5bWJvbCAqc3ltKQotewotCWlmIChzdHJmaWx0ZXJfX2NvbXBhcmUoYXZhaWxhYmxlX2Z1bmNfZmlsdGVyLCBzeW0tPm5hbWUpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKLX0KLQogaW50IHNob3dfYXZhaWxhYmxlX2Z1bmNzKGNvbnN0IGNoYXIgKnRhcmdldCwgc3RydWN0IHN0cmZpbHRlciAqX2ZpbHRlciwKIAkJCQkJYm9vbCB1c2VyKQogeworICAgICAgICBzdHJ1Y3QgcmJfbm9kZSAqbmQ7CiAJc3RydWN0IG1hcCAqbWFwOwogCWludCByZXQ7CiAKQEAgLTMzMjQsOSArMzM3MSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCS8qIExvYWQgc3ltYm9scyB3aXRoIGdpdmVuIGZpbHRlciAqLwotCWF2YWlsYWJsZV9mdW5jX2ZpbHRlciA9IF9maWx0ZXI7Ci0JcmV0ID0gbWFwX19sb2FkKG1hcCwgZmlsdGVyX2F2YWlsYWJsZV9mdW5jdGlvbnMpOworCXJldCA9IG1hcF9fbG9hZChtYXApOwogCWlmIChyZXQpIHsKIAkJaWYgKHJldCA9PSAtMikgewogCQkJY2hhciAqc3RyID0gc3RyZmlsdGVyX19zdHJpbmcoX2ZpbHRlcik7CkBAIC0zMzQzLDcgKzMzODgsMTQgQEAKIAogCS8qIFNob3cgYWxsIChmaWx0ZXJlZCkgc3ltYm9scyAqLwogCXNldHVwX3BhZ2VyKCk7Ci0JZHNvX19mcHJpbnRmX3N5bWJvbHNfYnlfbmFtZShtYXAtPmRzbywgbWFwLT50eXBlLCBzdGRvdXQpOworCisgICAgICAgIGZvciAobmQgPSByYl9maXJzdCgmbWFwLT5kc28tPnN5bWJvbF9uYW1lc1ttYXAtPnR5cGVdKTsgbmQ7IG5kID0gcmJfbmV4dChuZCkpIHsKKwkJc3RydWN0IHN5bWJvbF9uYW1lX3JiX25vZGUgKnBvcyA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3Qgc3ltYm9sX25hbWVfcmJfbm9kZSwgcmJfbm9kZSk7CisKKwkJaWYgKHN0cmZpbHRlcl9fY29tcGFyZShfZmlsdGVyLCBwb3MtPnN5bS5uYW1lKSkKKwkJCXByaW50ZigiJXNcbiIsIHBvcy0+c3ltLm5hbWUpOworICAgICAgICB9CisKIGVuZDoKIAlpZiAodXNlcikgewogCQltYXBfX3B1dChtYXApOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmggYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuaAppbmRleCBmNGY0NWRiLi44MDkxZDE1IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuaAorKysgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuaApAQCAtMTI4LDYgKzEyOCw4IEBACiBpbnQgcGVyZl9wcm9iZV9ldmVudF9fY29weShzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqZHN0LAogCQkJICAgc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnNyYyk7CiAKK2Jvb2wgcGVyZl9wcm9iZV93aXRoX3ZhcihzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2KTsKKwogLyogQ2hlY2sgdGhlIHBlcmZfcHJvYmVfZXZlbnQgbmVlZHMgZGVidWdpbmZvICovCiBib29sIHBlcmZfcHJvYmVfZXZlbnRfbmVlZF9kd2FyZihzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2KTsKIApAQCAtMTQ3LDYgKzE0OSw3IEBACiBpbnQgYWRkX3BlcmZfcHJvYmVfZXZlbnRzKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXZzLCBpbnQgbnBldnMpOwogaW50IGNvbnZlcnRfcGVyZl9wcm9iZV9ldmVudHMoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldnMsIGludCBucGV2cyk7CiBpbnQgYXBwbHlfcGVyZl9wcm9iZV9ldmVudHMoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldnMsIGludCBucGV2cyk7CitpbnQgc2hvd19wcm9iZV90cmFjZV9ldmVudHMoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldnMsIGludCBucGV2cyk7CiB2b2lkIGNsZWFudXBfcGVyZl9wcm9iZV9ldmVudHMoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldnMsIGludCBucGV2cyk7CiBpbnQgZGVsX3BlcmZfcHJvYmVfZXZlbnRzKHN0cnVjdCBzdHJmaWx0ZXIgKmZpbHRlcik7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maWxlLmMgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZmlsZS5jCmluZGV4IDlhZWQ5YzMuLjQzNmI2NDcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maWxlLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbGUuYwpAQCAtNzMsMTEgKzczLDEwIEBACiBzdGF0aWMgaW50IG9wZW5fcHJvYmVfZXZlbnRzKGNvbnN0IGNoYXIgKnRyYWNlX2ZpbGUsIGJvb2wgcmVhZHdyaXRlKQogewogCWNoYXIgYnVmW1BBVEhfTUFYXTsKLQljb25zdCBjaGFyICp0cmFjaW5nX2RpciA9ICIiOwogCWludCByZXQ7CiAKLQlyZXQgPSBlX3NucHJpbnRmKGJ1ZiwgUEFUSF9NQVgsICIlcy8lcyVzIiwKLQkJCSB0cmFjaW5nX3BhdGgsIHRyYWNpbmdfZGlyLCB0cmFjZV9maWxlKTsKKwlyZXQgPSBlX3NucHJpbnRmKGJ1ZiwgUEFUSF9NQVgsICIlcy8lcyIsCisJCQkgdHJhY2luZ19wYXRoLCB0cmFjZV9maWxlKTsKIAlpZiAocmV0ID49IDApIHsKIAkJcHJfZGVidWcoIk9wZW5pbmcgJXMgd3JpdGU9JWRcbiIsIGJ1ZiwgcmVhZHdyaXRlKTsKIAkJaWYgKHJlYWR3cml0ZSAmJiAhcHJvYmVfZXZlbnRfZHJ5X3J1bikKQEAgLTEzMyw3ICsxMzIsNyBAQAogLyogR2V0IHJhdyBzdHJpbmcgbGlzdCBvZiBjdXJyZW50IGtwcm9iZV9ldmVudHMgIG9yIHVwcm9iZV9ldmVudHMgKi8KIHN0cnVjdCBzdHJsaXN0ICpwcm9iZV9maWxlX19nZXRfcmF3bGlzdChpbnQgZmQpCiB7Ci0JaW50IHJldCwgaWR4OworCWludCByZXQsIGlkeCwgZmRkdXA7CiAJRklMRSAqZnA7CiAJY2hhciBidWZbTUFYX0NNRExFTl07CiAJY2hhciAqcDsKQEAgLTE0Myw4ICsxNDIsMTcgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlzbCA9IHN0cmxpc3RfX25ldyhOVUxMLCBOVUxMKTsKKwlpZiAoc2wgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CiAKLQlmcCA9IGZkb3BlbihkdXAoZmQpLCAiciIpOworCWZkZHVwID0gZHVwKGZkKTsKKwlpZiAoZmRkdXAgPCAwKQorCQlnb3RvIG91dF9mcmVlX3NsOworCisJZnAgPSBmZG9wZW4oZmRkdXAsICJyIik7CisJaWYgKCFmcCkKKwkJZ290byBvdXRfY2xvc2VfZmRkdXA7CisKIAl3aGlsZSAoIWZlb2YoZnApKSB7CiAJCXAgPSBmZ2V0cyhidWYsIE1BWF9DTURMRU4sIGZwKTsKIAkJaWYgKCFwKQpAQCAtMTU2LDEzICsxNjQsMjEgQEAKIAkJcmV0ID0gc3RybGlzdF9fYWRkKHNsLCBidWYpOwogCQlpZiAocmV0IDwgMCkgewogCQkJcHJfZGVidWcoInN0cmxpc3RfX2FkZCBmYWlsZWQgKCVkKVxuIiwgcmV0KTsKLQkJCXN0cmxpc3RfX2RlbGV0ZShzbCk7Ci0JCQlyZXR1cm4gTlVMTDsKKwkJCWdvdG8gb3V0X2Nsb3NlX2ZwOwogCQl9CiAJfQogCWZjbG9zZShmcCk7CiAKIAlyZXR1cm4gc2w7CisKK291dF9jbG9zZV9mcDoKKwlmY2xvc2UoZnApOworCWdvdG8gb3V0X2ZyZWVfc2w7CitvdXRfY2xvc2VfZmRkdXA6CisJY2xvc2UoZmRkdXApOworb3V0X2ZyZWVfc2w6CisJc3RybGlzdF9fZGVsZXRlKHNsKTsKKwlyZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIHN0cnVjdCBzdHJsaXN0ICpfX3Byb2JlX2ZpbGVfX2dldF9uYW1lbGlzdChpbnQgZmQsIGJvb2wgaW5jbHVkZV9ncm91cCkKQEAgLTQ0NywxMiArNDYzLDE3IEBACiB7CiAJc3RydWN0IHByb2JlX2NhY2hlX2VudHJ5ICplbnRyeSA9IE5VTEw7CiAJY2hhciBidWZbTUFYX0NNRExFTl0sICpwOwotCWludCByZXQgPSAwOworCWludCByZXQgPSAwLCBmZGR1cDsKIAlGSUxFICpmcDsKIAotCWZwID0gZmRvcGVuKGR1cChwY2FjaGUtPmZkKSwgInIiKTsKLQlpZiAoIWZwKQorCWZkZHVwID0gZHVwKHBjYWNoZS0+ZmQpOworCWlmIChmZGR1cCA8IDApCisJCXJldHVybiAtZXJybm87CisJZnAgPSBmZG9wZW4oZmRkdXAsICJyIik7CisJaWYgKCFmcCkgeworCQljbG9zZShmZGR1cCk7CiAJCXJldHVybiAtRUlOVkFMOworCX0KIAogCXdoaWxlICghZmVvZihmcCkpIHsKIAkJaWYgKCFmZ2V0cyhidWYsIE1BWF9DTURMRU4sIGZwKSkKQEAgLTY3OCw3ICs2OTksNyBAQAogCUlOSVRfTElTVF9IRUFEKCZzZHRsaXN0KTsKIAlyZXQgPSBnZXRfc2R0X25vdGVfbGlzdCgmc2R0bGlzdCwgcGF0aG5hbWUpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByX2RlYnVnKCJGYWlsZWQgdG8gZ2V0IHNkdCBub3RlOiAlZFxuIiwgcmV0KTsKKwkJcHJfZGVidWc0KCJGYWlsZWQgdG8gZ2V0IHNkdCBub3RlOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShub3RlLCAmc2R0bGlzdCwgbm90ZV9saXN0KSB7CkBAIC04NTUsMyArODc2LDYwIEBACiAKIAlyZXR1cm4gMDsKIH0KKworc3RhdGljIHN0cnVjdCB7CisJY29uc3QgY2hhciAqcGF0dGVybjsKKwlib29sCWF2YWlsOworCWJvb2wJY2hlY2tlZDsKK30gcHJvYmVfdHlwZV90YWJsZVtdID0geworI2RlZmluZSBERUZJTkVfVFlQRShpZHgsIHBhdCwgZGVmX2F2YWlsKQlcCisJW2lkeF0gPSB7LnBhdHRlcm4gPSBwYXQsIC5hdmFpbCA9IChkZWZfYXZhaWwpfQorCURFRklORV9UWVBFKFBST0JFX1RZUEVfVSwgIiogdTgvMTYvMzIvNjQsKiIsIHRydWUpLAorCURFRklORV9UWVBFKFBST0JFX1RZUEVfUywgIiogczgvMTYvMzIvNjQsKiIsIHRydWUpLAorCURFRklORV9UWVBFKFBST0JFX1RZUEVfWCwgIiogeDgvMTYvMzIvNjQsKiIsIGZhbHNlKSwKKwlERUZJTkVfVFlQRShQUk9CRV9UWVBFX1NUUklORywgIiogc3RyaW5nLCoiLCB0cnVlKSwKKwlERUZJTkVfVFlQRShQUk9CRV9UWVBFX0JJVEZJRUxELAorCQkgICAgIiogYjxiaXQtd2lkdGg+QDxiaXQtb2Zmc2V0Pi88Y29udGFpbmVyLXNpemU+IiwgdHJ1ZSksCit9OworCitib29sIHByb2JlX3R5cGVfaXNfYXZhaWxhYmxlKGVudW0gcHJvYmVfdHlwZSB0eXBlKQoreworCUZJTEUgKmZwOworCWNoYXIgKmJ1ZiA9IE5VTEw7CisJc2l6ZV90IGxlbiA9IDA7CisJYm9vbCB0YXJnZXRfbGluZSA9IGZhbHNlOworCWJvb2wgcmV0ID0gcHJvYmVfdHlwZV90YWJsZVt0eXBlXS5hdmFpbDsKKworCWlmICh0eXBlID49IFBST0JFX1RZUEVfRU5EKQorCQlyZXR1cm4gZmFsc2U7CisJLyogV2UgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGUgdHlwZSB3aGljaCBzdXBwb3J0ZWQgYnkgZGVmYXVsdCAqLworCWlmIChyZXQgfHwgcHJvYmVfdHlwZV90YWJsZVt0eXBlXS5jaGVja2VkKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGFzcHJpbnRmKCZidWYsICIlcy9SRUFETUUiLCB0cmFjaW5nX3BhdGgpIDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWZwID0gZm9wZW4oYnVmLCAiciIpOworCWlmICghZnApCisJCWdvdG8gZW5kOworCisJemZyZWUoJmJ1Zik7CisJd2hpbGUgKGdldGxpbmUoJmJ1ZiwgJmxlbiwgZnApID4gMCAmJiAhcmV0KSB7CisJCWlmICghdGFyZ2V0X2xpbmUpIHsKKwkJCXRhcmdldF9saW5lID0gISFzdHJzdHIoYnVmLCAiIHR5cGU6ICIpOworCQkJaWYgKCF0YXJnZXRfbGluZSkKKwkJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChzdHJzdHIoYnVmLCAiXHQgICAgICAgICAgIikgIT0gYnVmKQorCQkJYnJlYWs7CisJCXJldCA9IHN0cmdsb2JtYXRjaChidWYsIHByb2JlX3R5cGVfdGFibGVbdHlwZV0ucGF0dGVybik7CisJfQorCS8qIENhY2hlIHRoZSByZXN1bHQgKi8KKwlwcm9iZV90eXBlX3RhYmxlW3R5cGVdLmNoZWNrZWQgPSB0cnVlOworCXByb2JlX3R5cGVfdGFibGVbdHlwZV0uYXZhaWwgPSByZXQ7CisKKwlmY2xvc2UoZnApOworZW5kOgorCWZyZWUoYnVmKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZmlsZS5oIGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbGUuaAppbmRleCA5NTc3YjVjLi5lYmE0NGMzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZmlsZS5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maWxlLmgKQEAgLTE5LDYgKzE5LDE1IEBACiAJc3RydWN0IGxpc3RfaGVhZCBlbnRyaWVzOwogfTsKIAorZW51bSBwcm9iZV90eXBlIHsKKwlQUk9CRV9UWVBFX1UgPSAwLAorCVBST0JFX1RZUEVfUywKKwlQUk9CRV9UWVBFX1gsCisJUFJPQkVfVFlQRV9TVFJJTkcsCisJUFJPQkVfVFlQRV9CSVRGSUVMRCwKKwlQUk9CRV9UWVBFX0VORCwKK307CisKICNkZWZpbmUgUEZfRkxfVVBST0JFCTEKICNkZWZpbmUgUEZfRkxfUlcJMgogI2RlZmluZSBmb3JfZWFjaF9wcm9iZV9jYWNoZV9lbnRyeShlbnRyeSwgcGNhY2hlKSBcCkBAIC01NCw2ICs2Myw3IEBACiBzdHJ1Y3QgcHJvYmVfY2FjaGVfZW50cnkgKnByb2JlX2NhY2hlX19maW5kX2J5X25hbWUoc3RydWN0IHByb2JlX2NhY2hlICpwY2FjaGUsCiAJCQkJCWNvbnN0IGNoYXIgKmdyb3VwLCBjb25zdCBjaGFyICpldmVudCk7CiBpbnQgcHJvYmVfY2FjaGVfX3Nob3dfYWxsX2NhY2hlcyhzdHJ1Y3Qgc3RyZmlsdGVyICpmaWx0ZXIpOworYm9vbCBwcm9iZV90eXBlX2lzX2F2YWlsYWJsZShlbnVtIHByb2JlX3R5cGUgdHlwZSk7CiAjZWxzZQkvKiAhIEhBVkVfTElCRUxGX1NVUFBPUlQgKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHByb2JlX2NhY2hlICpwcm9iZV9jYWNoZV9fbmV3KGNvbnN0IGNoYXIgKnRndCBfX21heWJlX3VudXNlZCkKIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuYwppbmRleCA1YzI5MGM2Li5kZjRkZWJlIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbmRlci5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSAidXRpbC5oIgogI2luY2x1ZGUgInN5bWJvbC5oIgogI2luY2x1ZGUgInByb2JlLWZpbmRlci5oIgorI2luY2x1ZGUgInByb2JlLWZpbGUuaCIKIAogLyogS3Byb2JlIHRyYWNlciBiYXNpYyB0eXBlIGlzIHVwIHRvIHU2NCAqLwogI2RlZmluZSBNQVhfQkFTSUNfVFlQRV9CSVRTCTY0CkBAIC0xNzAsNiArMTcxLDcgQEAKICAqLwogc3RhdGljIGludCBjb252ZXJ0X3ZhcmlhYmxlX2xvY2F0aW9uKER3YXJmX0RpZSAqdnJfZGllLCBEd2FyZl9BZGRyIGFkZHIsCiAJCQkJICAgICBEd2FyZl9PcCAqZmJfb3BzLCBEd2FyZl9EaWUgKnNwX2RpZSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBtYWNoaW5lLAogCQkJCSAgICAgc3RydWN0IHByb2JlX3RyYWNlX2FyZyAqdHZhcikKIHsKIAlEd2FyZl9BdHRyaWJ1dGUgYXR0cjsKQEAgLTI2NSw3ICsyNjcsNyBAQAogCWlmICghdHZhcikKIAkJcmV0dXJuIHJldDI7CiAKLQlyZWdzID0gZ2V0X2FyY2hfcmVnc3RyKHJlZ24pOworCXJlZ3MgPSBnZXRfZHdhcmZfcmVnc3RyKHJlZ24sIG1hY2hpbmUpOwogCWlmICghcmVncykgewogCQkvKiBUaGlzIHNob3VsZCBiZSBhIGJ1ZyBpbiBEV0FSRiBvciB0aGlzIHRvb2wgKi8KIAkJcHJfd2FybmluZygiTWFwcGluZyBmb3IgdGhlIHJlZ2lzdGVyIG51bWJlciAldSAiCkBAIC0yOTcsMTMgKzI5OSwxMyBAQAogCWNoYXIgc2J1ZltTVFJFUlJfQlVGU0laRV07CiAJaW50IGJzaXplLCBib2ZmcywgdG90YWw7CiAJaW50IHJldDsKLQljaGFyIHNpZ247CisJY2hhciBwcmVmaXg7CiAKIAkvKiBUT0RPOiBjaGVjayBhbGwgdHlwZXMgKi8KLQlpZiAoY2FzdCAmJiBzdHJjbXAoY2FzdCwgInN0cmluZyIpICE9IDAgJiYKKwlpZiAoY2FzdCAmJiBzdHJjbXAoY2FzdCwgInN0cmluZyIpICE9IDAgJiYgc3RyY21wKGNhc3QsICJ4IikgIT0gMCAmJgogCSAgICBzdHJjbXAoY2FzdCwgInMiKSAhPSAwICYmIHN0cmNtcChjYXN0LCAidSIpICE9IDApIHsKIAkJLyogTm9uIHN0cmluZyB0eXBlIGlzIE9LICovCi0JCS8qIGFuZCByZXNwZWN0IHNpZ25lZG5lc3MgY2FzdCAqLworCQkvKiBhbmQgcmVzcGVjdCBzaWduZWRuZXNzL2hleGFkZWNpbWFsIGNhc3QgKi8KIAkJdHZhci0+dHlwZSA9IHN0cmR1cChjYXN0KTsKIAkJcmV0dXJuICh0dmFyLT50eXBlID09IE5VTEwpID8gLUVOT01FTSA6IDA7CiAJfQpAQCAtMzY1LDExICszNjcsMTUgQEAKIAl9CiAKIAlpZiAoY2FzdCAmJiAoc3RyY21wKGNhc3QsICJ1IikgPT0gMCkpCi0JCXNpZ24gPSAndSc7CisJCXByZWZpeCA9ICd1JzsKIAllbHNlIGlmIChjYXN0ICYmIChzdHJjbXAoY2FzdCwgInMiKSA9PSAwKSkKLQkJc2lnbiA9ICdzJzsKKwkJcHJlZml4ID0gJ3MnOworCWVsc2UgaWYgKGNhc3QgJiYgKHN0cmNtcChjYXN0LCAieCIpID09IDApICYmCisJCSBwcm9iZV90eXBlX2lzX2F2YWlsYWJsZShQUk9CRV9UWVBFX1gpKQorCQlwcmVmaXggPSAneCc7CiAJZWxzZQotCQlzaWduID0gZGllX2lzX3NpZ25lZF90eXBlKCZ0eXBlKSA/ICdzJyA6ICd1JzsKKwkJcHJlZml4ID0gZGllX2lzX3NpZ25lZF90eXBlKCZ0eXBlKSA/ICdzJyA6CisJCQkgcHJvYmVfdHlwZV9pc19hdmFpbGFibGUoUFJPQkVfVFlQRV9YKSA/ICd4JyA6ICd1JzsKIAogCXJldCA9IGR3YXJmX2J5dGVzaXplKCZ0eXBlKTsKIAlpZiAocmV0IDw9IDApCkBAIC0zODMsNyArMzg5LDcgQEAKIAkJCWR3YXJmX2RpZW5hbWUoJnR5cGUpLCBNQVhfQkFTSUNfVFlQRV9CSVRTKTsKIAkJcmV0ID0gTUFYX0JBU0lDX1RZUEVfQklUUzsKIAl9Ci0JcmV0ID0gc25wcmludGYoYnVmLCAxNiwgIiVjJWQiLCBzaWduLCByZXQpOworCXJldCA9IHNucHJpbnRmKGJ1ZiwgMTYsICIlYyVkIiwgcHJlZml4LCByZXQpOwogCiBmb3JtYXR0ZWQ6CiAJaWYgKHJldCA8IDAgfHwgcmV0ID49IDE2KSB7CkBAIC01MzgsNyArNTQ0LDcgQEAKIAkJIGR3YXJmX2RpZW5hbWUodnJfZGllKSk7CiAKIAlyZXQgPSBjb252ZXJ0X3ZhcmlhYmxlX2xvY2F0aW9uKHZyX2RpZSwgcGYtPmFkZHIsIHBmLT5mYl9vcHMsCi0JCQkJCSZwZi0+c3BfZGllLCBwZi0+dHZhcik7CisJCQkJCSZwZi0+c3BfZGllLCBwZi0+bWFjaGluZSwgcGYtPnR2YXIpOwogCWlmIChyZXQgPT0gLUVOT0VOVCB8fCByZXQgPT0gLUVJTlZBTCkgewogCQlwcl9lcnIoIkZhaWxlZCB0byBmaW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUgJyVzJyB2YXJpYWJsZSBhdCB0aGlzIGFkZHJlc3MuXG4iCiAJCSAgICAgICAiIFBlcmhhcHMgaXQgaGFzIGJlZW4gb3B0aW1pemVkIG91dC5cbiIKQEAgLTkwMSw2ICs5MDcsMzggQEAKIAlyZXR1cm4gZGllX3dhbGtfbGluZXMoc3BfZGllLCBwcm9iZV9wb2ludF9sYXp5X3dhbGtlciwgcGYpOwogfQogCitzdGF0aWMgdm9pZCBza2lwX3Byb2xvZ3VlKER3YXJmX0RpZSAqc3BfZGllLCBzdHJ1Y3QgcHJvYmVfZmluZGVyICpwZikKK3sKKwlzdHJ1Y3QgcGVyZl9wcm9iZV9wb2ludCAqcHAgPSAmcGYtPnBldi0+cG9pbnQ7CisKKwkvKiBOb3QgdXByb2JlPyAqLworCWlmICghcGYtPnBldi0+dXByb2JlcykKKwkJcmV0dXJuOworCisJLyogQ29tcGlsZWQgd2l0aCBvcHRpbWl6YXRpb24/ICovCisJaWYgKGRpZV9pc19vcHRpbWl6ZWRfdGFyZ2V0KCZwZi0+Y3VfZGllKSkKKwkJcmV0dXJuOworCisJLyogRG9uJ3Qga25vdyBlbnRyeXBjPyAqLworCWlmICghcGYtPmFkZHIpCisJCXJldHVybjsKKworCS8qIE9ubHkgRlVOQyBhbmQgRlVOQ0BTUkMgYXJlIGVsaWdpYmxlLiAqLworCWlmICghcHAtPmZ1bmN0aW9uIHx8IHBwLT5saW5lIHx8IHBwLT5yZXRwcm9iZSB8fCBwcC0+bGF6eV9saW5lIHx8CisJICAgIHBwLT5vZmZzZXQgfHwgcHAtPmFic19hZGRyZXNzKQorCQlyZXR1cm47CisKKwkvKiBOb3QgaW50ZXJlc3RlZCBpbiBmdW5jIHBhcmFtZXRlcj8gKi8KKwlpZiAoIXBlcmZfcHJvYmVfd2l0aF92YXIocGYtPnBldikpCisJCXJldHVybjsKKworCXByX2luZm8oIlRhcmdldCBwcm9ncmFtIGlzIGNvbXBpbGVkIHdpdGhvdXQgb3B0aW1pemF0aW9uLiBTa2lwcGluZyBwcm9sb2d1ZS5cbiIKKwkJIlByb2JlIG9uIGFkZHJlc3MgMHglIiBQUkl4NjQgIiB0byBmb3JjZSBwcm9iaW5nIGF0IHRoZSBmdW5jdGlvbiBlbnRyeS5cblxuIiwKKwkJcGYtPmFkZHIpOworCisJZGllX3NraXBfcHJvbG9ndWUoc3BfZGllLCAmcGYtPmN1X2RpZSwgJnBmLT5hZGRyKTsKK30KKwogc3RhdGljIGludCBwcm9iZV9wb2ludF9pbmxpbmVfY2IoRHdhcmZfRGllICppbl9kaWUsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHByb2JlX2ZpbmRlciAqcGYgPSBkYXRhOwpAQCAtOTE3LDYgKzk1NSwxMSBAQAogCQkJCSAgIGR3YXJmX2RpZW5hbWUoaW5fZGllKSk7CiAJCQlyZXR1cm4gLUVOT0VOVDsKIAkJfQorCQlpZiAoYWRkciA9PSAwKSB7CisJCQlwcl9kZWJ1ZygiJXMgaGFzIG5vIHZhbGlkIGVudHJ5IGFkZHJlc3MuIHNraXBwZWQuXG4iLAorCQkJCSBkd2FyZl9kaWVuYW1lKGluX2RpZSkpOworCQkJcmV0dXJuIC1FTk9FTlQ7CisJCX0KIAkJcGYtPmFkZHIgPSBhZGRyOwogCQlwZi0+YWRkciArPSBwcC0+b2Zmc2V0OwogCQlwcl9kZWJ1ZygiZm91bmQgaW5saW5lIGFkZHI6IDB4JWp4XG4iLApAQCAtOTUwLDcgKzk5Myw4IEBACiAJaWYgKHBwLT5maWxlICYmIHN0cnRhaWxjbXAocHAtPmZpbGUsIGR3YXJmX2RlY2xfZmlsZShzcF9kaWUpKSkKIAkJcmV0dXJuIERXQVJGX0NCX09LOwogCi0JcHJfZGVidWcoIk1hdGNoZWQgZnVuY3Rpb246ICVzXG4iLCBkd2FyZl9kaWVuYW1lKHNwX2RpZSkpOworCXByX2RlYnVnKCJNYXRjaGVkIGZ1bmN0aW9uOiAlcyBbJWx4XVxuIiwgZHdhcmZfZGllbmFtZShzcF9kaWUpLAorCQkgKHVuc2lnbmVkIGxvbmcpZHdhcmZfZGllb2Zmc2V0KHNwX2RpZSkpOwogCXBmLT5mbmFtZSA9IGR3YXJmX2RlY2xfZmlsZShzcF9kaWUpOwogCWlmIChwcC0+bGluZSkgeyAvKiBGdW5jdGlvbiByZWxhdGl2ZSBsaW5lICovCiAJCWR3YXJmX2RlY2xfbGluZShzcF9kaWUsICZwZi0+bG5vKTsKQEAgLTk1OSwxMCArMTAwMywxNiBAQAogCX0gZWxzZSBpZiAoZGllX2lzX2Z1bmNfaW5zdGFuY2Uoc3BfZGllKSkgewogCQkvKiBJbnN0YW5jZXMgYWx3YXlzIGhhdmUgdGhlIGVudHJ5IGFkZHJlc3MgKi8KIAkJZHdhcmZfZW50cnlwYyhzcF9kaWUsICZwZi0+YWRkcik7CisJCS8qIEJ1dCBpbiBzb21lIGNhc2UgdGhlIGVudHJ5IGFkZHJlc3MgaXMgMCAqLworCQlpZiAocGYtPmFkZHIgPT0gMCkgeworCQkJcHJfZGVidWcoIiVzIGhhcyBubyBlbnRyeSBQQy4gU2tpcHBlZFxuIiwKKwkJCQkgZHdhcmZfZGllbmFtZShzcF9kaWUpKTsKKwkJCXBhcmFtLT5yZXR2YWwgPSAwOwogCQkvKiBSZWFsIGZ1bmN0aW9uICovCi0JCWlmIChwcC0+bGF6eV9saW5lKQorCQl9IGVsc2UgaWYgKHBwLT5sYXp5X2xpbmUpCiAJCQlwYXJhbS0+cmV0dmFsID0gZmluZF9wcm9iZV9wb2ludF9sYXp5KHNwX2RpZSwgcGYpOwogCQllbHNlIHsKKwkJCXNraXBfcHJvbG9ndWUoc3BfZGllLCBwZik7CiAJCQlwZi0+YWRkciArPSBwcC0+b2Zmc2V0OwogCQkJLyogVE9ETzogQ2hlY2sgdGhlIGFkZHJlc3MgaW4gdGhpcyBmdW5jdGlvbiAqLwogCQkJcGFyYW0tPnJldHZhbCA9IGNhbGxfcHJvYmVfZmluZGVyKHNwX2RpZSwgcGYpOwpAQCAtOTcyLDcgKzEwMjIsNyBAQAogCQlwYXJhbS0+cmV0dmFsID0gZGllX3dhbGtfaW5zdGFuY2VzKHNwX2RpZSwKIAkJCQkJcHJvYmVfcG9pbnRfaW5saW5lX2NiLCAodm9pZCAqKXBmKTsKIAkJLyogVGhpcyBjb3VsZCBiZSBhIG5vbi1leGlzdGVkIGlubGluZSBkZWZpbml0aW9uICovCi0JCWlmIChwYXJhbS0+cmV0dmFsID09IC1FTk9FTlQgJiYgc3RyaXNnbG9iKHBwLT5mdW5jdGlvbikpCisJCWlmIChwYXJhbS0+cmV0dmFsID09IC1FTk9FTlQpCiAJCQlwYXJhbS0+cmV0dmFsID0gMDsKIAl9CiAKQEAgLTExMDEsMTEgKzExNTEsOCBAQAogCQkJCSAgc3RydWN0IHByb2JlX2ZpbmRlciAqcGYpCiB7CiAJaW50IHJldCA9IDA7Ci0KLSNpZiBfRUxGVVRJTFNfUFJFUkVRKDAsIDE0MikKIAlFbGYgKmVsZjsKIAlHRWxmX0VoZHIgZWhkcjsKLQlHRWxmX1NoZHIgc2hkcjsKIAogCWlmIChwZi0+Y2ZpX2VoIHx8IHBmLT5jZmlfZGJnKQogCQlyZXR1cm4gZGVidWdpbmZvX19maW5kX3Byb2JlX2xvY2F0aW9uKGRiZywgcGYpOwpAQCAtMTExOCwxMSArMTE2NSwxOCBAQAogCWlmIChnZWxmX2dldGVoZHIoZWxmLCAmZWhkcikgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoZWxmX3NlY3Rpb25fYnlfbmFtZShlbGYsICZlaGRyLCAmc2hkciwgIi5laF9mcmFtZSIsIE5VTEwpICYmCi0JICAgIHNoZHIuc2hfdHlwZSA9PSBTSFRfUFJPR0JJVFMpCi0JCXBmLT5jZmlfZWggPSBkd2FyZl9nZXRjZmlfZWxmKGVsZik7CisJcGYtPm1hY2hpbmUgPSBlaGRyLmVfbWFjaGluZTsKIAotCXBmLT5jZmlfZGJnID0gZHdhcmZfZ2V0Y2ZpKGRiZy0+ZGJnKTsKKyNpZiBfRUxGVVRJTFNfUFJFUkVRKDAsIDE0MikKKwlkbyB7CisJCUdFbGZfU2hkciBzaGRyOworCisJCWlmIChlbGZfc2VjdGlvbl9ieV9uYW1lKGVsZiwgJmVoZHIsICZzaGRyLCAiLmVoX2ZyYW1lIiwgTlVMTCkgJiYKKwkJICAgIHNoZHIuc2hfdHlwZSA9PSBTSFRfUFJPR0JJVFMpCisJCQlwZi0+Y2ZpX2VoID0gZHdhcmZfZ2V0Y2ZpX2VsZihlbGYpOworCisJCXBmLT5jZmlfZGJnID0gZHdhcmZfZ2V0Y2ZpKGRiZy0+ZGJnKTsKKwl9IHdoaWxlICgwKTsKICNlbmRpZgogCiAJcmV0ID0gZGVidWdpbmZvX19maW5kX3Byb2JlX2xvY2F0aW9uKGRiZywgcGYpOwpAQCAtMTE1MCw3ICsxMjA0LDcgQEAKIAkgICAgKHRhZyA9PSBEV19UQUdfdmFyaWFibGUgJiYgdmYtPnZhcnMpKSB7CiAJCWlmIChjb252ZXJ0X3ZhcmlhYmxlX2xvY2F0aW9uKGRpZV9tZW0sIHZmLT5wZi0+YWRkciwKIAkJCQkJICAgICAgdmYtPnBmLT5mYl9vcHMsICZwZi0+c3BfZGllLAotCQkJCQkgICAgICBOVUxMKSA9PSAwKSB7CisJCQkJCSAgICAgIHBmLT5tYWNoaW5lLCBOVUxMKSA9PSAwKSB7CiAJCQl2Zi0+YXJnc1t2Zi0+bmFyZ3NdLnZhciA9IChjaGFyICopZHdhcmZfZGllbmFtZShkaWVfbWVtKTsKIAkJCWlmICh2Zi0+YXJnc1t2Zi0+bmFyZ3NdLnZhciA9PSBOVUxMKSB7CiAJCQkJdmYtPnJldCA9IC1FTk9NRU07CkBAIC0xMzEzLDcgKzEzNjcsNyBAQAogCSAgICB0YWcgPT0gRFdfVEFHX3ZhcmlhYmxlKSB7CiAJCXJldCA9IGNvbnZlcnRfdmFyaWFibGVfbG9jYXRpb24oZGllX21lbSwgYWYtPnBmLmFkZHIsCiAJCQkJCQlhZi0+cGYuZmJfb3BzLCAmYWYtPnBmLnNwX2RpZSwKLQkJCQkJCU5VTEwpOworCQkJCQkJYWYtPnBmLm1hY2hpbmUsIE5VTEwpOwogCQlpZiAocmV0ID09IDAgfHwgcmV0ID09IC1FUkFOR0UpIHsKIAkJCWludCByZXQyOwogCQkJYm9vbCBleHRlcm5zID0gIWFmLT5jaGlsZDsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuaCBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuaAppbmRleCA1MTEzN2ZjLi5mMWQ4NTU4IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbmRlci5oCkBAIC04MCw2ICs4MCw3IEBACiAJRHdhcmZfQ0ZJCQkqY2ZpX2RiZzsKICNlbmRpZgogCUR3YXJmX09wCQkqZmJfb3BzOwkvKiBGcmFtZSBiYXNlIGF0dHJpYnV0ZSAqLworCXVuc2lnbmVkIGludAkJbWFjaGluZTsJLyogVGFyZ2V0IG1hY2hpbmUgYXJjaCAqLwogCXN0cnVjdCBwZXJmX3Byb2JlX2FyZwkqcHZhcjsJCS8qIEN1cnJlbnQgdGFyZ2V0IHZhcmlhYmxlICovCiAJc3RydWN0IHByb2JlX3RyYWNlX2FyZwkqdHZhcjsJCS8qIEN1cnJlbnQgcmVzdWx0IHZhcmlhYmxlICovCiB9OwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3NjcmlwdGluZy1lbmdpbmVzL3RyYWNlLWV2ZW50LXBlcmwuYyBiL3Rvb2xzL3BlcmYvdXRpbC9zY3JpcHRpbmctZW5naW5lcy90cmFjZS1ldmVudC1wZXJsLmMKaW5kZXggNWQxZWIxYy4uZTU1YTEzMiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3NjcmlwdGluZy1lbmdpbmVzL3RyYWNlLWV2ZW50LXBlcmwuYworKysgYi90b29scy9wZXJmL3V0aWwvc2NyaXB0aW5nLWVuZ2luZXMvdHJhY2UtZXZlbnQtcGVybC5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWU2NC5oPgogCiAjaW5jbHVkZSAiLi4vdXRpbC5oIgogI2luY2x1ZGUgPEVYVEVSTi5oPgpAQCAtMzU5LDggKzM2MCw4IEBACiAJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KGV2ZW50LT5pZCwgZXZlbnRzX2RlZmluZWQpKQogCQlkZWZpbmVfZXZlbnRfc3ltYm9scyhldmVudCwgaGFuZGxlciwgZXZlbnQtPnByaW50X2ZtdC5hcmdzKTsKIAotCXMgPSBuc2VjcyAvIE5TRUNTX1BFUl9TRUM7Ci0JbnMgPSBuc2VjcyAtIHMgKiBOU0VDU19QRVJfU0VDOworCXMgPSBuc2VjcyAvIE5TRUNfUEVSX1NFQzsKKwlucyA9IG5zZWNzIC0gcyAqIE5TRUNfUEVSX1NFQzsKIAogCXNjcmlwdGluZ19jb250ZXh0LT5ldmVudF9kYXRhID0gZGF0YTsKIAlzY3JpcHRpbmdfY29udGV4dC0+cGV2ZW50ID0gZXZzZWwtPnRwX2Zvcm1hdC0+cGV2ZW50OwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3NjcmlwdGluZy1lbmdpbmVzL3RyYWNlLWV2ZW50LXB5dGhvbi5jIGIvdG9vbHMvcGVyZi91dGlsL3NjcmlwdGluZy1lbmdpbmVzL3RyYWNlLWV2ZW50LXB5dGhvbi5jCmluZGV4IGUwMjAzYjkuLjA4OTQzOGQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zY3JpcHRpbmctZW5naW5lcy90cmFjZS1ldmVudC1weXRob24uYworKysgYi90b29scy9wZXJmL3V0aWwvc2NyaXB0aW5nLWVuZ2luZXMvdHJhY2UtZXZlbnQtcHl0aG9uLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxzdGRib29sLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lNjQuaD4KIAogI2luY2x1ZGUgIi4uLy4uL3BlcmYuaCIKICNpbmNsdWRlICIuLi9kZWJ1Zy5oIgpAQCAtNDI2LDggKzQyNyw4IEBACiAJCWlmICghZGljdCkKIAkJCVB5X0ZhdGFsRXJyb3IoImNvdWxkbid0IGNyZWF0ZSBQeXRob24gZGljdCIpOwogCX0KLQlzID0gbnNlY3MgLyBOU0VDU19QRVJfU0VDOwotCW5zID0gbnNlY3MgLSBzICogTlNFQ1NfUEVSX1NFQzsKKwlzID0gbnNlY3MgLyBOU0VDX1BFUl9TRUM7CisJbnMgPSBuc2VjcyAtIHMgKiBOU0VDX1BFUl9TRUM7CiAKIAlzY3JpcHRpbmdfY29udGV4dC0+ZXZlbnRfZGF0YSA9IGRhdGE7CiAJc2NyaXB0aW5nX2NvbnRleHQtPnBldmVudCA9IGV2c2VsLT50cF9mb3JtYXQtPnBldmVudDsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zb3J0LmMgYi90b29scy9wZXJmL3V0aWwvc29ydC5jCmluZGV4IDNkM2NiODMuLjQ1MmUxNWEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zb3J0LmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3NvcnQuYwpAQCAtMTEsNyArMTEsNyBAQAogcmVnZXhfdAkJcGFyZW50X3JlZ2V4OwogY29uc3QgY2hhcglkZWZhdWx0X3BhcmVudF9wYXR0ZXJuW10gPSAiXnN5c198XmRvX3BhZ2VfZmF1bHQiOwogY29uc3QgY2hhcgkqcGFyZW50X3BhdHRlcm4gPSBkZWZhdWx0X3BhcmVudF9wYXR0ZXJuOwotY29uc3QgY2hhcglkZWZhdWx0X3NvcnRfb3JkZXJbXSA9ICJjb21tLGRzbyxzeW1ib2wiOworY29uc3QgY2hhcgkqZGVmYXVsdF9zb3J0X29yZGVyID0gImNvbW0sZHNvLHN5bWJvbCI7CiBjb25zdCBjaGFyCWRlZmF1bHRfYnJhbmNoX3NvcnRfb3JkZXJbXSA9ICJjb21tLGRzb19mcm9tLHN5bWJvbF9mcm9tLHN5bWJvbF90byxjeWNsZXMiOwogY29uc3QgY2hhcglkZWZhdWx0X21lbV9zb3J0X29yZGVyW10gPSAibG9jYWxfd2VpZ2h0LG1lbSxzeW0sZHNvLHN5bWJvbF9kYWRkcixkc29fZGFkZHIsc25vb3AsdGxiLGxvY2tlZCI7CiBjb25zdCBjaGFyCWRlZmF1bHRfdG9wX3NvcnRfb3JkZXJbXSA9ICJkc28sc3ltYm9sIjsKQEAgLTg2Nyw3ICs4NjcsNyBAQAogfTsKIAogLyogLS1zb3J0IGRhZGRyX3N5bSAqLwotc3RhdGljIGludDY0X3QKK2ludDY0X3QKIHNvcnRfX2RhZGRyX2NtcChzdHJ1Y3QgaGlzdF9lbnRyeSAqbGVmdCwgc3RydWN0IGhpc3RfZW50cnkgKnJpZ2h0KQogewogCXVpbnQ2NF90IGwgPSAwLCByID0gMDsKQEAgLTg5Niw3ICs4OTYsNyBAQAogCQkJCQkgd2lkdGgpOwogfQogCi1zdGF0aWMgaW50NjRfdAoraW50NjRfdAogc29ydF9faWFkZHJfY21wKHN0cnVjdCBoaXN0X2VudHJ5ICpsZWZ0LCBzdHJ1Y3QgaGlzdF9lbnRyeSAqcmlnaHQpCiB7CiAJdWludDY0X3QgbCA9IDAsIHIgPSAwOwpAQCAtMTA2Miw3ICsxMDYyLDcgQEAKIAlyZXR1cm4gcmVwc2VwX3NucHJpbnRmKGJmLCBzaXplLCAiJS0qcyIsIHdpZHRoLCBvdXQpOwogfQogCi1zdGF0aWMgaW50NjRfdAoraW50NjRfdAogc29ydF9fZGNhY2hlbGluZV9jbXAoc3RydWN0IGhpc3RfZW50cnkgKmxlZnQsIHN0cnVjdCBoaXN0X2VudHJ5ICpyaWdodCkKIHsKIAl1NjQgbCwgcjsKQEAgLTE0OTIsNyArMTQ5Miw4IEBACiB9CiAKIHN0YXRpYyBpbnQgX19zb3J0X19ocHBfaGVhZGVyKHN0cnVjdCBwZXJmX2hwcF9mbXQgKmZtdCwgc3RydWN0IHBlcmZfaHBwICpocHAsCi0JCQkgICAgICBzdHJ1Y3QgaGlzdHMgKmhpc3RzKQorCQkJICAgICAgc3RydWN0IGhpc3RzICpoaXN0cywgaW50IGxpbmUgX19tYXliZV91bnVzZWQsCisJCQkgICAgICBpbnQgKnNwYW4gX19tYXliZV91bnVzZWQpCiB7CiAJc3RydWN0IGhwcF9zb3J0X2VudHJ5ICpoc2U7CiAJc2l6ZV90IGxlbiA9IGZtdC0+dXNlcl9sZW47CkBAIC0xNzk3LDcgKzE3OTgsOSBAQAogfQogCiBzdGF0aWMgaW50IF9fc29ydF9faGRlX2hlYWRlcihzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQsIHN0cnVjdCBwZXJmX2hwcCAqaHBwLAotCQkJICAgICAgc3RydWN0IGhpc3RzICpoaXN0cyBfX21heWJlX3VudXNlZCkKKwkJCSAgICAgIHN0cnVjdCBoaXN0cyAqaGlzdHMgX19tYXliZV91bnVzZWQsCisJCQkgICAgICBpbnQgbGluZSBfX21heWJlX3VudXNlZCwKKwkJCSAgICAgIGludCAqc3BhbiBfX21heWJlX3VudXNlZCkKIHsKIAlzdHJ1Y3QgaHBwX2R5bmFtaWNfZW50cnkgKmhkZTsKIAlzaXplX3QgbGVuID0gZm10LT51c2VyX2xlbjsKQEAgLTIzMDUsOSArMjMwOCw5IEBACiAJcmV0dXJuIF9faHBwX2RpbWVuc2lvbl9fYWRkX291dHB1dCgmcGVyZl9ocHBfbGlzdCwgJmhwcF9zb3J0X2RpbWVuc2lvbnNbY29sXSk7CiB9CiAKLXN0YXRpYyBpbnQgc29ydF9kaW1lbnNpb25fX2FkZChzdHJ1Y3QgcGVyZl9ocHBfbGlzdCAqbGlzdCwgY29uc3QgY2hhciAqdG9rLAotCQkJICAgICAgIHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LAotCQkJICAgICAgIGludCBsZXZlbCkKK2ludCBzb3J0X2RpbWVuc2lvbl9fYWRkKHN0cnVjdCBwZXJmX2hwcF9saXN0ICpsaXN0LCBjb25zdCBjaGFyICp0b2ssCisJCQlzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwKKwkJCWludCBsZXZlbCkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIApAQCAtMjY4Miw3ICsyNjg1LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgb3V0cHV0X2ZpZWxkX2FkZChzdHJ1Y3QgcGVyZl9ocHBfbGlzdCAqbGlzdCwgY2hhciAqdG9rKQoraW50IG91dHB1dF9maWVsZF9hZGQoc3RydWN0IHBlcmZfaHBwX2xpc3QgKmxpc3QsIGNoYXIgKnRvaykKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIApAQCAtMjc0NSw3ICsyNzQ4LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCByZXNldF9kaW1lbnNpb25zKHZvaWQpCit2b2lkIHJlc2V0X2RpbWVuc2lvbnModm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3NvcnQuaCBiL3Rvb2xzL3BlcmYvdXRpbC9zb3J0LmgKaW5kZXggN2NhMzdlYS4uMDk5Yzk3NSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3NvcnQuaAorKysgYi90b29scy9wZXJmL3V0aWwvc29ydC5oCkBAIC0yOCw3ICsyOCw3IEBACiBleHRlcm4gY29uc3QgY2hhciAqZmllbGRfb3JkZXI7CiBleHRlcm4gY29uc3QgY2hhciBkZWZhdWx0X3BhcmVudF9wYXR0ZXJuW107CiBleHRlcm4gY29uc3QgY2hhciAqcGFyZW50X3BhdHRlcm47Ci1leHRlcm4gY29uc3QgY2hhciBkZWZhdWx0X3NvcnRfb3JkZXJbXTsKK2V4dGVybiBjb25zdCBjaGFyICpkZWZhdWx0X3NvcnRfb3JkZXI7CiBleHRlcm4gcmVnZXhfdCBpZ25vcmVfY2FsbGVlc19yZWdleDsKIGV4dGVybiBpbnQgaGF2ZV9pZ25vcmVfY2FsbGVlczsKIGV4dGVybiBlbnVtIHNvcnRfbW9kZSBzb3J0X19tb2RlOwpAQCAtNDAsNiArNDAsNyBAQAogZXh0ZXJuIHN0cnVjdCBzb3J0X2VudHJ5IHNvcnRfZHNvX3RvOwogZXh0ZXJuIHN0cnVjdCBzb3J0X2VudHJ5IHNvcnRfc3ltX2Zyb207CiBleHRlcm4gc3RydWN0IHNvcnRfZW50cnkgc29ydF9zeW1fdG87CitleHRlcm4gc3RydWN0IHNvcnRfZW50cnkgc29ydF9zcmNsaW5lOwogZXh0ZXJuIGVudW0gc29ydF90eXBlIHNvcnRfX2ZpcnN0X2RpbWVuc2lvbjsKIGV4dGVybiBjb25zdCBjaGFyIGRlZmF1bHRfbWVtX3NvcnRfb3JkZXJbXTsKIApAQCAtMjY4LDQgKzI2OSwxNSBAQAogYm9vbCBpc19zdHJpY3Rfb3JkZXIoY29uc3QgY2hhciAqb3JkZXIpOwogCiBpbnQgaHBwX2RpbWVuc2lvbl9fYWRkX291dHB1dCh1bnNpZ25lZCBjb2wpOwordm9pZCByZXNldF9kaW1lbnNpb25zKHZvaWQpOworaW50IHNvcnRfZGltZW5zaW9uX19hZGQoc3RydWN0IHBlcmZfaHBwX2xpc3QgKmxpc3QsIGNvbnN0IGNoYXIgKnRvaywKKwkJCXN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LAorCQkJaW50IGxldmVsKTsKK2ludCBvdXRwdXRfZmllbGRfYWRkKHN0cnVjdCBwZXJmX2hwcF9saXN0ICpsaXN0LCBjaGFyICp0b2spOworaW50NjRfdAorc29ydF9faWFkZHJfY21wKHN0cnVjdCBoaXN0X2VudHJ5ICpsZWZ0LCBzdHJ1Y3QgaGlzdF9lbnRyeSAqcmlnaHQpOworaW50NjRfdAorc29ydF9fZGFkZHJfY21wKHN0cnVjdCBoaXN0X2VudHJ5ICpsZWZ0LCBzdHJ1Y3QgaGlzdF9lbnRyeSAqcmlnaHQpOworaW50NjRfdAorc29ydF9fZGNhY2hlbGluZV9jbXAoc3RydWN0IGhpc3RfZW50cnkgKmxlZnQsIHN0cnVjdCBoaXN0X2VudHJ5ICpyaWdodCk7CiAjZW5kaWYJLyogX19QRVJGX1NPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3N2Z2hlbHBlci5jIGIvdG9vbHMvcGVyZi91dGlsL3N2Z2hlbHBlci5jCmluZGV4IGVlYzZjMTEuLjFjYmFkYTIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zdmdoZWxwZXIuYworKysgYi90b29scy9wZXJmL3V0aWwvc3ZnaGVscGVyLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lNjQuaD4KIAogI2luY2x1ZGUgInBlcmYuaCIKICNpbmNsdWRlICJzdmdoZWxwZXIuaCIKQEAgLTI3NCwxNCArMjc1LDE0IEBACiAKIAl0ZXh0WzBdID0gMDsKIAotCWlmIChkdXJhdGlvbiA8IDEwMDApIC8qIGxlc3MgdGhhbiAxIHVzZWMgKi8KKwlpZiAoZHVyYXRpb24gPCBOU0VDX1BFUl9VU0VDKSAvKiBsZXNzIHRoYW4gMSB1c2VjICovCiAJCXJldHVybiB0ZXh0OwogCi0JaWYgKGR1cmF0aW9uIDwgMTAwMCAqIDEwMDApIHsgLyogbGVzcyB0aGFuIDEgbXNlYyAqLwotCQlzcHJpbnRmKHRleHQsICIlLjFmIHVzIiwgZHVyYXRpb24gLyAxMDAwLjApOworCWlmIChkdXJhdGlvbiA8IE5TRUNfUEVSX01TRUMpIHsgLyogbGVzcyB0aGFuIDEgbXNlYyAqLworCQlzcHJpbnRmKHRleHQsICIlLjFmIHVzIiwgZHVyYXRpb24gLyAoZG91YmxlKU5TRUNfUEVSX1VTRUMpOwogCQlyZXR1cm4gdGV4dDsKIAl9Ci0Jc3ByaW50Zih0ZXh0LCAiJS4xZiBtcyIsIGR1cmF0aW9uIC8gMTAwMC4wIC8gMTAwMCk7CisJc3ByaW50Zih0ZXh0LCAiJS4xZiBtcyIsIGR1cmF0aW9uIC8gKGRvdWJsZSlOU0VDX1BFUl9NU0VDKTsKIAogCXJldHVybiB0ZXh0OwogfQpAQCAtMjk3LDcgKzI5OCw3IEBACiAKIAlzdHlsZSA9ICJ3YWl0aW5nIjsKIAotCWlmIChlbmQtc3RhcnQgPiAxMCAqIDEwMDAwMDApIC8qIDEwIG1zZWMgKi8KKwlpZiAoZW5kLXN0YXJ0ID4gMTAgKiBOU0VDX1BFUl9NU0VDKSAvKiAxMCBtc2VjICovCiAJCXN0eWxlID0gIldBSVRJTkciOwogCiAJdGV4dCA9IHRpbWVfdG9fc3RyaW5nKGVuZC1zdGFydCk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc3ltYm9sLWVsZi5jIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC1lbGYuYwppbmRleCBhMzQzMjFlLi45OTQwMGIwIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc3ltYm9sLWVsZi5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wtZWxmLmMKQEAgLTIwNiw2ICsyMDYsMzcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGJvb2wgd2FudF9kZW1hbmdsZShib29sIGlzX2tlcm5lbF9zeW0pCit7CisJcmV0dXJuIGlzX2tlcm5lbF9zeW0gPyBzeW1ib2xfY29uZi5kZW1hbmdsZV9rZXJuZWwgOiBzeW1ib2xfY29uZi5kZW1hbmdsZTsKK30KKworc3RhdGljIGNoYXIgKmRlbWFuZ2xlX3N5bShzdHJ1Y3QgZHNvICpkc28sIGludCBrbW9kdWxlLCBjb25zdCBjaGFyICplbGZfbmFtZSkKK3sKKwlpbnQgZGVtYW5nbGVfZmxhZ3MgPSB2ZXJib3NlID8gKERNR0xfUEFSQU1TIHwgRE1HTF9BTlNJKSA6IERNR0xfTk9fT1BUUzsKKwljaGFyICpkZW1hbmdsZWQgPSBOVUxMOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhlIG9iamVjdCB3YXMgY3JlYXRlZCBmcm9tIEMrKyBzb3VyY2VzCisJICogRFdBUkYgRFdfY29tcGlsZV91bml0IGhhcyB0aGlzLCBidXQgd2UgZG9uJ3QgYWx3YXlzIGhhdmUgYWNjZXNzCisJICogdG8gaXQuLi4KKwkgKi8KKwlpZiAoIXdhbnRfZGVtYW5nbGUoZHNvLT5rZXJuZWwgfHwga21vZHVsZSkpCisJICAgIHJldHVybiBkZW1hbmdsZWQ7CisKKwlkZW1hbmdsZWQgPSBiZmRfZGVtYW5nbGUoTlVMTCwgZWxmX25hbWUsIGRlbWFuZ2xlX2ZsYWdzKTsKKwlpZiAoZGVtYW5nbGVkID09IE5VTEwpCisJCWRlbWFuZ2xlZCA9IGphdmFfZGVtYW5nbGVfc3ltKGVsZl9uYW1lLCBKQVZBX0RFTUFOR0xFX05PUkVUKTsKKwllbHNlIGlmIChydXN0X2lzX21hbmdsZWQoZGVtYW5nbGVkKSkKKwkJLyoKKwkJICAgICogSW5wdXQgdG8gUnVzdCBkZW1hbmdsaW5nIGlzIHRoZSBCRkQtZGVtYW5nbGVkCisJCSAgICAqIG5hbWUgd2hpY2ggaXQgUnVzdC1kZW1hbmdsZXMgaW4gcGxhY2UuCisJCSAgICAqLworCQlydXN0X2RlbWFuZ2xlX3N5bShkZW1hbmdsZWQpOworCisJcmV0dXJuIGRlbWFuZ2xlZDsKK30KKwogI2RlZmluZSBlbGZfc2VjdGlvbl9fZm9yX2VhY2hfcmVsKHJlbGRhdGEsIHBvcywgcG9zX21lbSwgaWR4LCBucl9lbnRyaWVzKSBcCiAJZm9yIChpZHggPSAwLCBwb3MgPSBnZWxmX2dldHJlbChyZWxkYXRhLCAwLCAmcG9zX21lbSk7IFwKIAkgICAgIGlkeCA8IG5yX2VudHJpZXM7IFwKQEAgLTIyMyw4ICsyNTQsNyBAQAogICogQW5kIGFsd2F5cyBsb29rIGF0IHRoZSBvcmlnaW5hbCBkc28sIG5vdCBhdCBkZWJ1Z2luZm8gcGFja2FnZXMsIHRoYXQKICAqIGhhdmUgdGhlIFBMVCBkYXRhIHN0cmlwcGVkIG91dCAoc2hkcl9yZWxfcGx0LnNoX3R5cGUgPT0gU0hUX05PQklUUykuCiAgKi8KLWludCBkc29fX3N5bnRoZXNpemVfcGx0X3N5bWJvbHMoc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3Qgc3ltc3JjICpzcywgc3RydWN0IG1hcCAqbWFwLAotCQkJCXN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCitpbnQgZHNvX19zeW50aGVzaXplX3BsdF9zeW1ib2xzKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IHN5bXNyYyAqc3MsIHN0cnVjdCBtYXAgKm1hcCkKIHsKIAl1aW50MzJfdCBucl9yZWxfZW50cmllcywgaWR4OwogCUdFbGZfU3ltIHN5bTsKQEAgLTMwMSw0NSArMzMxLDUzIEBACiAKIAkJZWxmX3NlY3Rpb25fX2Zvcl9lYWNoX3JlbGEocmVsZGF0YSwgcG9zLCBwb3NfbWVtLCBpZHgsCiAJCQkJCSAgIG5yX3JlbF9lbnRyaWVzKSB7CisJCQljb25zdCBjaGFyICplbGZfbmFtZSA9IE5VTEw7CisJCQljaGFyICpkZW1hbmdsZWQgPSBOVUxMOwogCQkJc3ltaWR4ID0gR0VMRl9SX1NZTShwb3MtPnJfaW5mbyk7CiAJCQlwbHRfb2Zmc2V0ICs9IHNoZHJfcGx0LnNoX2VudHNpemU7CiAJCQlnZWxmX2dldHN5bShzeW1zLCBzeW1pZHgsICZzeW0pOworCisJCQllbGZfbmFtZSA9IGVsZl9zeW1fX25hbWUoJnN5bSwgc3ltc3Rycyk7CisJCQlkZW1hbmdsZWQgPSBkZW1hbmdsZV9zeW0oZHNvLCAwLCBlbGZfbmFtZSk7CisJCQlpZiAoZGVtYW5nbGVkICE9IE5VTEwpCisJCQkJZWxmX25hbWUgPSBkZW1hbmdsZWQ7CiAJCQlzbnByaW50ZihzeW1wbHRuYW1lLCBzaXplb2Yoc3ltcGx0bmFtZSksCi0JCQkJICIlc0BwbHQiLCBlbGZfc3ltX19uYW1lKCZzeW0sIHN5bXN0cnMpKTsKKwkJCQkgIiVzQHBsdCIsIGVsZl9uYW1lKTsKKwkJCWZyZWUoZGVtYW5nbGVkKTsKIAogCQkJZiA9IHN5bWJvbF9fbmV3KHBsdF9vZmZzZXQsIHNoZHJfcGx0LnNoX2VudHNpemUsCiAJCQkJCVNUQl9HTE9CQUwsIHN5bXBsdG5hbWUpOwogCQkJaWYgKCFmKQogCQkJCWdvdG8gb3V0X2VsZl9lbmQ7CiAKLQkJCWlmIChmaWx0ZXIgJiYgZmlsdGVyKG1hcCwgZikpCi0JCQkJc3ltYm9sX19kZWxldGUoZik7Ci0JCQllbHNlIHsKLQkJCQlzeW1ib2xzX19pbnNlcnQoJmRzby0+c3ltYm9sc1ttYXAtPnR5cGVdLCBmKTsKLQkJCQkrK25yOwotCQkJfQorCQkJc3ltYm9sc19faW5zZXJ0KCZkc28tPnN5bWJvbHNbbWFwLT50eXBlXSwgZik7CisJCQkrK25yOwogCQl9CiAJfSBlbHNlIGlmIChzaGRyX3JlbF9wbHQuc2hfdHlwZSA9PSBTSFRfUkVMKSB7CiAJCUdFbGZfUmVsIHBvc19tZW0sICpwb3M7CiAJCWVsZl9zZWN0aW9uX19mb3JfZWFjaF9yZWwocmVsZGF0YSwgcG9zLCBwb3NfbWVtLCBpZHgsCiAJCQkJCSAgbnJfcmVsX2VudHJpZXMpIHsKKwkJCWNvbnN0IGNoYXIgKmVsZl9uYW1lID0gTlVMTDsKKwkJCWNoYXIgKmRlbWFuZ2xlZCA9IE5VTEw7CiAJCQlzeW1pZHggPSBHRUxGX1JfU1lNKHBvcy0+cl9pbmZvKTsKIAkJCXBsdF9vZmZzZXQgKz0gc2hkcl9wbHQuc2hfZW50c2l6ZTsKIAkJCWdlbGZfZ2V0c3ltKHN5bXMsIHN5bWlkeCwgJnN5bSk7CisKKwkJCWVsZl9uYW1lID0gZWxmX3N5bV9fbmFtZSgmc3ltLCBzeW1zdHJzKTsKKwkJCWRlbWFuZ2xlZCA9IGRlbWFuZ2xlX3N5bShkc28sIDAsIGVsZl9uYW1lKTsKKwkJCWlmIChkZW1hbmdsZWQgIT0gTlVMTCkKKwkJCQllbGZfbmFtZSA9IGRlbWFuZ2xlZDsKIAkJCXNucHJpbnRmKHN5bXBsdG5hbWUsIHNpemVvZihzeW1wbHRuYW1lKSwKLQkJCQkgIiVzQHBsdCIsIGVsZl9zeW1fX25hbWUoJnN5bSwgc3ltc3RycykpOworCQkJCSAiJXNAcGx0IiwgZWxmX25hbWUpOworCQkJZnJlZShkZW1hbmdsZWQpOwogCiAJCQlmID0gc3ltYm9sX19uZXcocGx0X29mZnNldCwgc2hkcl9wbHQuc2hfZW50c2l6ZSwKIAkJCQkJU1RCX0dMT0JBTCwgc3ltcGx0bmFtZSk7CiAJCQlpZiAoIWYpCiAJCQkJZ290byBvdXRfZWxmX2VuZDsKIAotCQkJaWYgKGZpbHRlciAmJiBmaWx0ZXIobWFwLCBmKSkKLQkJCQlzeW1ib2xfX2RlbGV0ZShmKTsKLQkJCWVsc2UgewotCQkJCXN5bWJvbHNfX2luc2VydCgmZHNvLT5zeW1ib2xzW21hcC0+dHlwZV0sIGYpOwotCQkJCSsrbnI7Ci0JCQl9CisJCQlzeW1ib2xzX19pbnNlcnQoJmRzby0+c3ltYm9sc1ttYXAtPnR5cGVdLCBmKTsKKwkJCSsrbnI7CiAJCX0KIAl9CiAKQEAgLTY4NSw3ICs3MjMsNyBAQAogCX0KIAogCS8qIEFsd2F5cyByZWplY3QgaW1hZ2VzIHdpdGggYSBtaXNtYXRjaGVkIGJ1aWxkLWlkOiAqLwotCWlmIChkc28tPmhhc19idWlsZF9pZCkgeworCWlmIChkc28tPmhhc19idWlsZF9pZCAmJiAhc3ltYm9sX2NvbmYuaWdub3JlX3ZtbGludXhfYnVpbGRpZCkgewogCQl1OCBidWlsZF9pZFtCVUlMRF9JRF9TSVpFXTsKIAogCQlpZiAoZWxmX3JlYWRfYnVpbGRfaWQoZWxmLCBidWlsZF9pZCwgQlVJTERfSURfU0laRSkgPCAwKSB7CkBAIC03NzUsMTcgKzgxMywxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgYm9vbCB3YW50X2RlbWFuZ2xlKGJvb2wgaXNfa2VybmVsX3N5bSkKLXsKLQlyZXR1cm4gaXNfa2VybmVsX3N5bSA/IHN5bWJvbF9jb25mLmRlbWFuZ2xlX2tlcm5lbCA6IHN5bWJvbF9jb25mLmRlbWFuZ2xlOwotfQotCiB2b2lkIF9fd2VhayBhcmNoX19zeW1fdXBkYXRlKHN0cnVjdCBzeW1ib2wgKnMgX19tYXliZV91bnVzZWQsCiAJCUdFbGZfU3ltICpzeW0gX19tYXliZV91bnVzZWQpIHsgfQogCi1pbnQgZHNvX19sb2FkX3N5bShzdHJ1Y3QgZHNvICpkc28sIHN0cnVjdCBtYXAgKm1hcCwKLQkJICBzdHJ1Y3Qgc3ltc3JjICpzeW1zX3NzLCBzdHJ1Y3Qgc3ltc3JjICpydW50aW1lX3NzLAotCQkgIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIsIGludCBrbW9kdWxlKQoraW50IGRzb19fbG9hZF9zeW0oc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsIHN0cnVjdCBzeW1zcmMgKnN5bXNfc3MsCisJCSAgc3RydWN0IHN5bXNyYyAqcnVudGltZV9zcywgaW50IGttb2R1bGUpCiB7CiAJc3RydWN0IGttYXAgKmttYXAgPSBkc28tPmtlcm5lbCA/IG1hcF9fa21hcChtYXApIDogTlVMTDsKIAlzdHJ1Y3QgbWFwX2dyb3VwcyAqa21hcHMgPSBrbWFwID8gbWFwX19rbWFwcyhtYXApIDogTlVMTDsKQEAgLTgzNyw3ICs4NjksOCBAQAogCXNlYyA9IHN5bXNfc3MtPnN5bXRhYjsKIAlzaGRyID0gc3ltc19zcy0+c3ltc2hkcjsKIAotCWlmIChlbGZfc2VjdGlvbl9ieV9uYW1lKGVsZiwgJmVoZHIsICZ0c2hkciwgIi50ZXh0IiwgTlVMTCkpCisJaWYgKGVsZl9zZWN0aW9uX2J5X25hbWUocnVudGltZV9zcy0+ZWxmLCAmcnVudGltZV9zcy0+ZWhkciwgJnRzaGRyLAorCQkJCSIudGV4dCIsIE5VTEwpKQogCQlkc28tPnRleHRfb2Zmc2V0ID0gdHNoZHIuc2hfYWRkciAtIHRzaGRyLnNoX29mZnNldDsKIAogCWlmIChydW50aW1lX3NzLT5vcGRzZWMpCkBAIC0xMDY5LDI5ICsxMTAyLDEwIEBACiAJCQlzeW0uc3RfdmFsdWUgLT0gc2hkci5zaF9hZGRyIC0gc2hkci5zaF9vZmZzZXQ7CiAJCX0KIG5ld19zeW1ib2w6Ci0JCS8qCi0JCSAqIFdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkIGZyb20gQysrIHNvdXJjZXMKLQkJICogRFdBUkYgRFdfY29tcGlsZV91bml0IGhhcyB0aGlzLCBidXQgd2UgZG9uJ3QgYWx3YXlzIGhhdmUgYWNjZXNzCi0JCSAqIHRvIGl0Li4uCi0JCSAqLwotCQlpZiAod2FudF9kZW1hbmdsZShkc28tPmtlcm5lbCB8fCBrbW9kdWxlKSkgewotCQkJaW50IGRlbWFuZ2xlX2ZsYWdzID0gRE1HTF9OT19PUFRTOwotCQkJaWYgKHZlcmJvc2UpCi0JCQkJZGVtYW5nbGVfZmxhZ3MgPSBETUdMX1BBUkFNUyB8IERNR0xfQU5TSTsKKwkJZGVtYW5nbGVkID0gZGVtYW5nbGVfc3ltKGRzbywga21vZHVsZSwgZWxmX25hbWUpOworCQlpZiAoZGVtYW5nbGVkICE9IE5VTEwpCisJCQllbGZfbmFtZSA9IGRlbWFuZ2xlZDsKIAotCQkJZGVtYW5nbGVkID0gYmZkX2RlbWFuZ2xlKE5VTEwsIGVsZl9uYW1lLCBkZW1hbmdsZV9mbGFncyk7Ci0JCQlpZiAoZGVtYW5nbGVkID09IE5VTEwpCi0JCQkJZGVtYW5nbGVkID0gamF2YV9kZW1hbmdsZV9zeW0oZWxmX25hbWUsIEpBVkFfREVNQU5HTEVfTk9SRVQpOwotCQkJZWxzZSBpZiAocnVzdF9pc19tYW5nbGVkKGRlbWFuZ2xlZCkpCi0JCQkJLyoKLQkJCQkgKiBJbnB1dCB0byBSdXN0IGRlbWFuZ2xpbmcgaXMgdGhlIEJGRC1kZW1hbmdsZWQKLQkJCQkgKiBuYW1lIHdoaWNoIGl0IFJ1c3QtZGVtYW5nbGVzIGluIHBsYWNlLgotCQkJCSAqLwotCQkJCXJ1c3RfZGVtYW5nbGVfc3ltKGRlbWFuZ2xlZCk7Ci0KLQkJCWlmIChkZW1hbmdsZWQgIT0gTlVMTCkKLQkJCQllbGZfbmFtZSA9IGRlbWFuZ2xlZDsKLQkJfQogCQlmID0gc3ltYm9sX19uZXcoc3ltLnN0X3ZhbHVlLCBzeW0uc3Rfc2l6ZSwKIAkJCQlHRUxGX1NUX0JJTkQoc3ltLnN0X2luZm8pLCBlbGZfbmFtZSk7CiAJCWZyZWUoZGVtYW5nbGVkKTsKQEAgLTExMDAsMjEgKzExMTQsMTYgQEAKIAogCQlhcmNoX19zeW1fdXBkYXRlKGYsICZzeW0pOwogCi0JCWlmIChmaWx0ZXIgJiYgZmlsdGVyKGN1cnJfbWFwLCBmKSkKLQkJCXN5bWJvbF9fZGVsZXRlKGYpOwotCQllbHNlIHsKLQkJCXN5bWJvbHNfX2luc2VydCgmY3Vycl9kc28tPnN5bWJvbHNbY3Vycl9tYXAtPnR5cGVdLCBmKTsKLQkJCW5yKys7Ci0JCX0KKwkJX19zeW1ib2xzX19pbnNlcnQoJmN1cnJfZHNvLT5zeW1ib2xzW2N1cnJfbWFwLT50eXBlXSwgZiwgZHNvLT5rZXJuZWwpOworCQlucisrOwogCX0KIAogCS8qCiAJICogRm9yIG1pc2Fubm90YXRlZCwgemVyb2VkLCBBU00gZnVuY3Rpb24gc2l6ZXMuCiAJICovCiAJaWYgKG5yID4gMCkgewotCQlpZiAoIXN5bWJvbF9jb25mLmFsbG93X2FsaWFzZXMpCi0JCQlzeW1ib2xzX19maXh1cF9kdXBsaWNhdGUoJmRzby0+c3ltYm9sc1ttYXAtPnR5cGVdKTsKIAkJc3ltYm9sc19fZml4dXBfZW5kKCZkc28tPnN5bWJvbHNbbWFwLT50eXBlXSk7CisJCXN5bWJvbHNfX2ZpeHVwX2R1cGxpY2F0ZSgmZHNvLT5zeW1ib2xzW21hcC0+dHlwZV0pOwogCQlpZiAoa21hcCkgewogCQkJLyoKIAkJCSAqIFdlIG5lZWQgdG8gZml4dXAgdGhpcyBoZXJlIHRvbyBiZWNhdXNlIHdlIGNyZWF0ZSBuZXcKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wtbWluaW1hbC5jIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC1taW5pbWFsLmMKaW5kZXggNDg5MDYzMy4uMTFjZGRlOSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC1taW5pbWFsLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC1taW5pbWFsLmMKQEAgLTI4Nyw4ICsyODcsNyBAQAogCiBpbnQgZHNvX19zeW50aGVzaXplX3BsdF9zeW1ib2xzKHN0cnVjdCBkc28gKmRzbyBfX21heWJlX3VudXNlZCwKIAkJCQlzdHJ1Y3Qgc3ltc3JjICpzcyBfX21heWJlX3VudXNlZCwKLQkJCQlzdHJ1Y3QgbWFwICptYXAgX19tYXliZV91bnVzZWQsCi0JCQkJc3ltYm9sX2ZpbHRlcl90IGZpbHRlciBfX21heWJlX3VudXNlZCkKKwkJCQlzdHJ1Y3QgbWFwICptYXAgX19tYXliZV91bnVzZWQpCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC0zMzQsNyArMzMzLDYgQEAKIGludCBkc29fX2xvYWRfc3ltKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwIF9fbWF5YmVfdW51c2VkLAogCQkgIHN0cnVjdCBzeW1zcmMgKnNzLAogCQkgIHN0cnVjdCBzeW1zcmMgKnJ1bnRpbWVfc3MgX19tYXliZV91bnVzZWQsCi0JCSAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlciBfX21heWJlX3VudXNlZCwKIAkJICBpbnQga21vZHVsZSBfX21heWJlX3VudXNlZCkKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1aWxkX2lkW0JVSUxEX0lEX1NJWkVdOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5jIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5jCmluZGV4IDM3ZThkMjAuLmFlY2ZmNjkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuYworKysgYi90b29scy9wZXJmL3V0aWwvc3ltYm9sLmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgImFubm90YXRlLmgiCiAjaW5jbHVkZSAiYnVpbGQtaWQuaCIKICNpbmNsdWRlICJ1dGlsLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKQEAgLTIzLDEwICsyNCwxMCBAQAogI2luY2x1ZGUgPHN5bWJvbC9rYWxsc3ltcy5oPgogI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CiAKLXN0YXRpYyBpbnQgZHNvX19sb2FkX2tlcm5lbF9zeW0oc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsCi0JCQkJc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7Ci1zdGF0aWMgaW50IGRzb19fbG9hZF9ndWVzdF9rZXJuZWxfc3ltKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLAotCQkJc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7CitzdGF0aWMgaW50IGRzb19fbG9hZF9rZXJuZWxfc3ltKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwKTsKK3N0YXRpYyBpbnQgZHNvX19sb2FkX2d1ZXN0X2tlcm5lbF9zeW0oc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXApOworc3RhdGljIGJvb2wgc3ltYm9sX19pc19pZGxlKGNvbnN0IGNoYXIgKm5hbWUpOworCiBpbnQgdm1saW51eF9wYXRoX19ucl9lbnRyaWVzOwogY2hhciAqKnZtbGludXhfcGF0aDsKIApAQCAtMTUyLDYgKzE1Myw5IEBACiAJc3RydWN0IHJiX25vZGUgKm5kOwogCXN0cnVjdCBzeW1ib2wgKmN1cnIsICpuZXh0OwogCisJaWYgKHN5bWJvbF9jb25mLmFsbG93X2FsaWFzZXMpCisJCXJldHVybjsKKwogCW5kID0gcmJfZmlyc3Qoc3ltYm9scyk7CiAKIAl3aGlsZSAobmQpIHsKQEAgLTIzNSw4ICsyMzksMTMgQEAKIAlpZiAoc3ltID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCi0JaWYgKHN5bWJvbF9jb25mLnByaXZfc2l6ZSkKKwlpZiAoc3ltYm9sX2NvbmYucHJpdl9zaXplKSB7CisJCWlmIChzeW1ib2xfY29uZi5pbml0X2Fubm90YXRpb24pIHsKKwkJCXN0cnVjdCBhbm5vdGF0aW9uICpub3RlcyA9ICh2b2lkICopc3ltOworCQkJcHRocmVhZF9tdXRleF9pbml0KCZub3Rlcy0+bG9jaywgTlVMTCk7CisJCX0KIAkJc3ltID0gKCh2b2lkICopc3ltKSArIHN5bWJvbF9jb25mLnByaXZfc2l6ZTsKKwl9CiAKIAlzeW0tPnN0YXJ0ICAgPSBzdGFydDsKIAlzeW0tPmVuZCAgICAgPSBsZW4gPyBzdGFydCArIGxlbiA6IHN0YXJ0OwpAQCAtMjY4LDEzICsyNzcsMjQgQEAKIAl9CiB9CiAKLXZvaWQgc3ltYm9sc19faW5zZXJ0KHN0cnVjdCByYl9yb290ICpzeW1ib2xzLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pCit2b2lkIF9fc3ltYm9sc19faW5zZXJ0KHN0cnVjdCByYl9yb290ICpzeW1ib2xzLCBzdHJ1Y3Qgc3ltYm9sICpzeW0sIGJvb2wga2VybmVsKQogewogCXN0cnVjdCByYl9ub2RlICoqcCA9ICZzeW1ib2xzLT5yYl9ub2RlOwogCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOwogCWNvbnN0IHU2NCBpcCA9IHN5bS0+c3RhcnQ7CiAJc3RydWN0IHN5bWJvbCAqczsKIAorCWlmIChrZXJuZWwpIHsKKwkJY29uc3QgY2hhciAqbmFtZSA9IHN5bS0+bmFtZTsKKwkJLyoKKwkJICogcHBjNjQgdXNlcyBmdW5jdGlvbiBkZXNjcmlwdG9ycyBhbmQgYXBwZW5kcyBhICcuJyB0byB0aGUKKwkJICogc3RhcnQgb2YgZXZlcnkgaW5zdHJ1Y3Rpb24gYWRkcmVzcy4gUmVtb3ZlIGl0LgorCQkgKi8KKwkJaWYgKG5hbWVbMF0gPT0gJy4nKQorCQkJbmFtZSsrOworCQlzeW0tPmlkbGUgPSBzeW1ib2xfX2lzX2lkbGUobmFtZSk7CisJfQorCiAJd2hpbGUgKCpwICE9IE5VTEwpIHsKIAkJcGFyZW50ID0gKnA7CiAJCXMgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBzeW1ib2wsIHJiX25vZGUpOwpAQCAtMjg3LDYgKzMwNywxMSBAQAogCXJiX2luc2VydF9jb2xvcigmc3ltLT5yYl9ub2RlLCBzeW1ib2xzKTsKIH0KIAordm9pZCBzeW1ib2xzX19pbnNlcnQoc3RydWN0IHJiX3Jvb3QgKnN5bWJvbHMsIHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlfX3N5bWJvbHNfX2luc2VydChzeW1ib2xzLCBzeW0sIGZhbHNlKTsKK30KKwogc3RhdGljIHN0cnVjdCBzeW1ib2wgKnN5bWJvbHNfX2ZpbmQoc3RydWN0IHJiX3Jvb3QgKnN5bWJvbHMsIHU2NCBpcCkKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqbjsKQEAgLTMyMCw2ICszNDUsMTYgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIHN0cnVjdCBzeW1ib2wgKnN5bWJvbHNfX2xhc3Qoc3RydWN0IHJiX3Jvb3QgKnN5bWJvbHMpCit7CisJc3RydWN0IHJiX25vZGUgKm4gPSByYl9sYXN0KHN5bWJvbHMpOworCisJaWYgKG4pCisJCXJldHVybiByYl9lbnRyeShuLCBzdHJ1Y3Qgc3ltYm9sLCByYl9ub2RlKTsKKworCXJldHVybiBOVUxMOworfQorCiBzdGF0aWMgc3RydWN0IHN5bWJvbCAqc3ltYm9sc19fbmV4dChzdHJ1Y3Qgc3ltYm9sICpzeW0pCiB7CiAJc3RydWN0IHJiX25vZGUgKm4gPSByYl9uZXh0KCZzeW0tPnJiX25vZGUpOwpAQCAtNDE1LDcgKzQ1MCw3IEBACiAKIHZvaWQgZHNvX19pbnNlcnRfc3ltYm9sKHN0cnVjdCBkc28gKmRzbywgZW51bSBtYXBfdHlwZSB0eXBlLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pCiB7Ci0Jc3ltYm9sc19faW5zZXJ0KCZkc28tPnN5bWJvbHNbdHlwZV0sIHN5bSk7CisJX19zeW1ib2xzX19pbnNlcnQoJmRzby0+c3ltYm9sc1t0eXBlXSwgc3ltLCBkc28tPmtlcm5lbCk7CiAKIAkvKiB1cGRhdGUgdGhlIHN5bWJvbCBjYWNoZSBpZiBuZWNlc3NhcnkgKi8KIAlpZiAoZHNvLT5sYXN0X2ZpbmRfcmVzdWx0W3R5cGVdLmFkZHIgPj0gc3ltLT5zdGFydCAmJgpAQCAtNDQxLDYgKzQ3NiwxMSBAQAogCXJldHVybiBzeW1ib2xzX19maXJzdCgmZHNvLT5zeW1ib2xzW3R5cGVdKTsKIH0KIAorc3RydWN0IHN5bWJvbCAqZHNvX19sYXN0X3N5bWJvbChzdHJ1Y3QgZHNvICpkc28sIGVudW0gbWFwX3R5cGUgdHlwZSkKK3sKKwlyZXR1cm4gc3ltYm9sc19fbGFzdCgmZHNvLT5zeW1ib2xzW3R5cGVdKTsKK30KKwogc3RydWN0IHN5bWJvbCAqZHNvX19uZXh0X3N5bWJvbChzdHJ1Y3Qgc3ltYm9sICpzeW0pCiB7CiAJcmV0dXJuIHN5bWJvbHNfX25leHQoc3ltKTsKQEAgLTUzNyw3ICs1NzcsNyBAQAogICogVGhlc2UgYXJlIHN5bWJvbHMgaW4gdGhlIGtlcm5lbCBpbWFnZSwgc28gbWFrZSBzdXJlIHRoYXQKICAqIHN5bSBpcyBmcm9tIGEga2VybmVsIERTTy4KICAqLwotYm9vbCBzeW1ib2xfX2lzX2lkbGUoc3RydWN0IHN5bWJvbCAqc3ltKQorc3RhdGljIGJvb2wgc3ltYm9sX19pc19pZGxlKGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJY29uc3QgY2hhciAqIGNvbnN0IGlkbGVfc3ltYm9sc1tdID0gewogCQkiY3B1X2lkbGUiLApAQCAtNTU0LDE0ICs1OTQsMTAgQEAKIAkJInBzZXJpZXNfZGVkaWNhdGVkX2lkbGVfc2xlZXAiLAogCQlOVUxMCiAJfTsKLQogCWludCBpOwogCi0JaWYgKCFzeW0pCi0JCXJldHVybiBmYWxzZTsKLQogCWZvciAoaSA9IDA7IGlkbGVfc3ltYm9sc1tpXTsgaSsrKSB7Ci0JCWlmICghc3RyY21wKGlkbGVfc3ltYm9sc1tpXSwgc3ltLT5uYW1lKSkKKwkJaWYgKCFzdHJjbXAoaWRsZV9zeW1ib2xzW2ldLCBuYW1lKSkKIAkJCXJldHVybiB0cnVlOwogCX0KIApAQCAtNTkwLDcgKzYyNiw3IEBACiAJICogV2Ugd2lsbCBwYXNzIHRoZSBzeW1ib2xzIHRvIHRoZSBmaWx0ZXIgbGF0ZXIsIGluCiAJICogbWFwX19zcGxpdF9rYWxsc3ltcywgd2hlbiB3ZSBoYXZlIHNwbGl0IHRoZSBtYXBzIHBlciBtb2R1bGUKIAkgKi8KLQlzeW1ib2xzX19pbnNlcnQocm9vdCwgc3ltKTsKKwlfX3N5bWJvbHNfX2luc2VydChyb290LCBzeW0sICFzdHJjaHIobmFtZSwgJ1snKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTYwNyw4ICs2NDMsNyBAQAogCXJldHVybiBrYWxsc3ltc19fcGFyc2UoZmlsZW5hbWUsICZhcmdzLCBtYXBfX3Byb2Nlc3Nfa2FsbHN5bV9zeW1ib2wpOwogfQogCi1zdGF0aWMgaW50IGRzb19fc3BsaXRfa2FsbHN5bXNfZm9yX2tjb3JlKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLAotCQkJCQkgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKK3N0YXRpYyBpbnQgZHNvX19zcGxpdF9rYWxsc3ltc19mb3Jfa2NvcmUoc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXApCiB7CiAJc3RydWN0IG1hcF9ncm91cHMgKmttYXBzID0gbWFwX19rbWFwcyhtYXApOwogCXN0cnVjdCBtYXAgKmN1cnJfbWFwOwpAQCAtNjM3LDcgKzY3Miw3IEBACiAKIAkJY3Vycl9tYXAgPSBtYXBfZ3JvdXBzX19maW5kKGttYXBzLCBtYXAtPnR5cGUsIHBvcy0+c3RhcnQpOwogCi0JCWlmICghY3Vycl9tYXAgfHwgKGZpbHRlciAmJiBmaWx0ZXIoY3Vycl9tYXAsIHBvcykpKSB7CisJCWlmICghY3Vycl9tYXApIHsKIAkJCXN5bWJvbF9fZGVsZXRlKHBvcyk7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtNjYwLDggKzY5NSw3IEBACiAgKiBrZXJuZWwgcmFuZ2UgaXMgYnJva2VuIGluIHNldmVyYWwgbWFwcywgbmFtZWQgW2tlcm5lbF0uTiwgYXMgd2UgZG9uJ3QgaGF2ZQogICogdGhlIG9yaWdpbmFsIEVMRiBzZWN0aW9uIG5hbWVzIHZtbGludXggaGF2ZS4KICAqLwotc3RhdGljIGludCBkc29fX3NwbGl0X2thbGxzeW1zKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLCB1NjQgZGVsdGEsCi0JCQkgICAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKK3N0YXRpYyBpbnQgZHNvX19zcGxpdF9rYWxsc3ltcyhzdHJ1Y3QgZHNvICpkc28sIHN0cnVjdCBtYXAgKm1hcCwgdTY0IGRlbHRhKQogewogCXN0cnVjdCBtYXBfZ3JvdXBzICprbWFwcyA9IG1hcF9fa21hcHMobWFwKTsKIAlzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZTsKQEAgLTczOCw3ICs3NzIsNyBAQAogCiAJCQlpZiAoY291bnQgPT0gMCkgewogCQkJCWN1cnJfbWFwID0gbWFwOwotCQkJCWdvdG8gZmlsdGVyX3N5bWJvbDsKKwkJCQlnb3RvIGFkZF9zeW1ib2w7CiAJCQl9CiAKIAkJCWlmIChkc28tPmtlcm5lbCA9PSBEU09fVFlQRV9HVUVTVF9LRVJORUwpCkBAIC03NzAsMTggKzgwNCwxOCBAQAogCQkJcG9zLT5zdGFydCAtPSBkZWx0YTsKIAkJCXBvcy0+ZW5kIC09IGRlbHRhOwogCQl9Ci1maWx0ZXJfc3ltYm9sOgotCQlpZiAoZmlsdGVyICYmIGZpbHRlcihjdXJyX21hcCwgcG9zKSkgewotZGlzY2FyZF9zeW1ib2w6CQlyYl9lcmFzZSgmcG9zLT5yYl9ub2RlLCByb290KTsKLQkJCXN5bWJvbF9fZGVsZXRlKHBvcyk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoY3Vycl9tYXAgIT0gbWFwKSB7Ci0JCQkJcmJfZXJhc2UoJnBvcy0+cmJfbm9kZSwgcm9vdCk7Ci0JCQkJc3ltYm9sc19faW5zZXJ0KCZjdXJyX21hcC0+ZHNvLT5zeW1ib2xzW2N1cnJfbWFwLT50eXBlXSwgcG9zKTsKLQkJCQkrK21vdmVkOwotCQkJfSBlbHNlCi0JCQkJKytjb3VudDsKLQkJfQorYWRkX3N5bWJvbDoKKwkJaWYgKGN1cnJfbWFwICE9IG1hcCkgeworCQkJcmJfZXJhc2UoJnBvcy0+cmJfbm9kZSwgcm9vdCk7CisJCQlzeW1ib2xzX19pbnNlcnQoJmN1cnJfbWFwLT5kc28tPnN5bWJvbHNbY3Vycl9tYXAtPnR5cGVdLCBwb3MpOworCQkJKyttb3ZlZDsKKwkJfSBlbHNlCisJCQkrK2NvdW50OworCisJCWNvbnRpbnVlOworZGlzY2FyZF9zeW1ib2w6CisJCXJiX2VyYXNlKCZwb3MtPnJiX25vZGUsIHJvb3QpOworCQlzeW1ib2xfX2RlbGV0ZShwb3MpOwogCX0KIAogCWlmIChjdXJyX21hcCAhPSBtYXAgJiYKQEAgLTEyMjEsNyArMTI1NSw3IEBACiB9CiAKIGludCBfX2Rzb19fbG9hZF9rYWxsc3ltcyhzdHJ1Y3QgZHNvICpkc28sIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotCQkJIHN0cnVjdCBtYXAgKm1hcCwgYm9vbCBub19rY29yZSwgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKKwkJCSBzdHJ1Y3QgbWFwICptYXAsIGJvb2wgbm9fa2NvcmUpCiB7CiAJdTY0IGRlbHRhID0gMDsKIApAQCAtMTIzNCw4ICsxMjY4LDggQEAKIAlpZiAoa2FsbHN5bXNfX2RlbHRhKG1hcCwgZmlsZW5hbWUsICZkZWx0YSkpCiAJCXJldHVybiAtMTsKIAotCXN5bWJvbHNfX2ZpeHVwX2R1cGxpY2F0ZSgmZHNvLT5zeW1ib2xzW21hcC0+dHlwZV0pOwogCXN5bWJvbHNfX2ZpeHVwX2VuZCgmZHNvLT5zeW1ib2xzW21hcC0+dHlwZV0pOworCXN5bWJvbHNfX2ZpeHVwX2R1cGxpY2F0ZSgmZHNvLT5zeW1ib2xzW21hcC0+dHlwZV0pOwogCiAJaWYgKGRzby0+a2VybmVsID09IERTT19UWVBFX0dVRVNUX0tFUk5FTCkKIAkJZHNvLT5zeW10YWJfdHlwZSA9IERTT19CSU5BUllfVFlQRV9fR1VFU1RfS0FMTFNZTVM7CkBAIC0xMjQzLDE5ICsxMjc3LDE4IEBACiAJCWRzby0+c3ltdGFiX3R5cGUgPSBEU09fQklOQVJZX1RZUEVfX0tBTExTWU1TOwogCiAJaWYgKCFub19rY29yZSAmJiAhZHNvX19sb2FkX2tjb3JlKGRzbywgbWFwLCBmaWxlbmFtZSkpCi0JCXJldHVybiBkc29fX3NwbGl0X2thbGxzeW1zX2Zvcl9rY29yZShkc28sIG1hcCwgZmlsdGVyKTsKKwkJcmV0dXJuIGRzb19fc3BsaXRfa2FsbHN5bXNfZm9yX2tjb3JlKGRzbywgbWFwKTsKIAllbHNlCi0JCXJldHVybiBkc29fX3NwbGl0X2thbGxzeW1zKGRzbywgbWFwLCBkZWx0YSwgZmlsdGVyKTsKKwkJcmV0dXJuIGRzb19fc3BsaXRfa2FsbHN5bXMoZHNvLCBtYXAsIGRlbHRhKTsKIH0KIAogaW50IGRzb19fbG9hZF9rYWxsc3ltcyhzdHJ1Y3QgZHNvICpkc28sIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotCQkgICAgICAgc3RydWN0IG1hcCAqbWFwLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQorCQkgICAgICAgc3RydWN0IG1hcCAqbWFwKQogewotCXJldHVybiBfX2Rzb19fbG9hZF9rYWxsc3ltcyhkc28sIGZpbGVuYW1lLCBtYXAsIGZhbHNlLCBmaWx0ZXIpOworCXJldHVybiBfX2Rzb19fbG9hZF9rYWxsc3ltcyhkc28sIGZpbGVuYW1lLCBtYXAsIGZhbHNlKTsKIH0KIAotc3RhdGljIGludCBkc29fX2xvYWRfcGVyZl9tYXAoc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsCi0JCQkgICAgICBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQorc3RhdGljIGludCBkc29fX2xvYWRfcGVyZl9tYXAoc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXApCiB7CiAJY2hhciAqbGluZSA9IE5VTEw7CiAJc2l6ZV90IG47CkBAIC0xMjk3LDEyICsxMzMwLDggQEAKIAkJaWYgKHN5bSA9PSBOVUxMKQogCQkJZ290byBvdXRfZGVsZXRlX2xpbmU7CiAKLQkJaWYgKGZpbHRlciAmJiBmaWx0ZXIobWFwLCBzeW0pKQotCQkJc3ltYm9sX19kZWxldGUoc3ltKTsKLQkJZWxzZSB7Ci0JCQlzeW1ib2xzX19pbnNlcnQoJmRzby0+c3ltYm9sc1ttYXAtPnR5cGVdLCBzeW0pOwotCQkJbnJfc3ltcysrOwotCQl9CisJCXN5bWJvbHNfX2luc2VydCgmZHNvLT5zeW1ib2xzW21hcC0+dHlwZV0sIHN5bSk7CisJCW5yX3N5bXMrKzsKIAl9CiAKIAlmcmVlKGxpbmUpOwpAQCAtMTM1OCw3ICsxMzg3LDcgQEAKIAl9CiB9CiAKLWludCBkc29fX2xvYWQoc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCitpbnQgZHNvX19sb2FkKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwKQogewogCWNoYXIgKm5hbWU7CiAJaW50IHJldCA9IC0xOwpAQCAtMTM4MSw5ICsxNDEwLDkgQEAKIAogCWlmIChkc28tPmtlcm5lbCkgewogCQlpZiAoZHNvLT5rZXJuZWwgPT0gRFNPX1RZUEVfS0VSTkVMKQotCQkJcmV0ID0gZHNvX19sb2FkX2tlcm5lbF9zeW0oZHNvLCBtYXAsIGZpbHRlcik7CisJCQlyZXQgPSBkc29fX2xvYWRfa2VybmVsX3N5bShkc28sIG1hcCk7CiAJCWVsc2UgaWYgKGRzby0+a2VybmVsID09IERTT19UWVBFX0dVRVNUX0tFUk5FTCkKLQkJCXJldCA9IGRzb19fbG9hZF9ndWVzdF9rZXJuZWxfc3ltKGRzbywgbWFwLCBmaWx0ZXIpOworCQkJcmV0ID0gZHNvX19sb2FkX2d1ZXN0X2tlcm5lbF9zeW0oZHNvLCBtYXApOwogCiAJCWdvdG8gb3V0OwogCX0KQEAgLTE0MDcsNyArMTQzNiw3IEBACiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCXJldCA9IGRzb19fbG9hZF9wZXJmX21hcChkc28sIG1hcCwgZmlsdGVyKTsKKwkJcmV0ID0gZHNvX19sb2FkX3BlcmZfbWFwKGRzbywgbWFwKTsKIAkJZHNvLT5zeW10YWJfdHlwZSA9IHJldCA+IDAgPyBEU09fQklOQVJZX1RZUEVfX0pBVkFfSklUIDoKIAkJCQkJICAgICBEU09fQklOQVJZX1RZUEVfX05PVF9GT1VORDsKIAkJZ290byBvdXQ7CkBAIC0xNDk4LDE0ICsxNTI3LDE0IEBACiAJCQlrbW9kID0gdHJ1ZTsKIAogCWlmIChzeW1zX3NzKQotCQlyZXQgPSBkc29fX2xvYWRfc3ltKGRzbywgbWFwLCBzeW1zX3NzLCBydW50aW1lX3NzLCBmaWx0ZXIsIGttb2QpOworCQlyZXQgPSBkc29fX2xvYWRfc3ltKGRzbywgbWFwLCBzeW1zX3NzLCBydW50aW1lX3NzLCBrbW9kKTsKIAllbHNlCiAJCXJldCA9IC0xOwogCiAJaWYgKHJldCA+IDApIHsKIAkJaW50IG5yX3BsdDsKIAotCQlucl9wbHQgPSBkc29fX3N5bnRoZXNpemVfcGx0X3N5bWJvbHMoZHNvLCBydW50aW1lX3NzLCBtYXAsIGZpbHRlcik7CisJCW5yX3BsdCA9IGRzb19fc3ludGhlc2l6ZV9wbHRfc3ltYm9scyhkc28sIHJ1bnRpbWVfc3MsIG1hcCk7CiAJCWlmIChucl9wbHQgPiAwKQogCQkJcmV0ICs9IG5yX3BsdDsKIAl9CkBAIC0xNTQ0LDggKzE1NzMsNyBAQAogfQogCiBpbnQgZHNvX19sb2FkX3ZtbGludXgoc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsCi0JCSAgICAgIGNvbnN0IGNoYXIgKnZtbGludXgsIGJvb2wgdm1saW51eF9hbGxvY2F0ZWQsCi0JCSAgICAgIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCisJCSAgICAgIGNvbnN0IGNoYXIgKnZtbGludXgsIGJvb2wgdm1saW51eF9hbGxvY2F0ZWQpCiB7CiAJaW50IGVyciA9IC0xOwogCXN0cnVjdCBzeW1zcmMgc3M7CkBAIC0xNTY1LDcgKzE1OTMsNyBAQAogCWlmIChzeW1zcmNfX2luaXQoJnNzLCBkc28sIHN5bWZzX3ZtbGludXgsIHN5bXRhYl90eXBlKSkKIAkJcmV0dXJuIC0xOwogCi0JZXJyID0gZHNvX19sb2FkX3N5bShkc28sIG1hcCwgJnNzLCAmc3MsIGZpbHRlciwgMCk7CisJZXJyID0gZHNvX19sb2FkX3N5bShkc28sIG1hcCwgJnNzLCAmc3MsIDApOwogCXN5bXNyY19fZGVzdHJveSgmc3MpOwogCiAJaWYgKGVyciA+IDApIHsKQEAgLTE1ODEsOCArMTYwOSw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotaW50IGRzb19fbG9hZF92bWxpbnV4X3BhdGgoc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsCi0JCQkgICBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQoraW50IGRzb19fbG9hZF92bWxpbnV4X3BhdGgoc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXApCiB7CiAJaW50IGksIGVyciA9IDA7CiAJY2hhciAqZmlsZW5hbWUgPSBOVUxMOwpAQCAtMTU5MSw3ICsxNjE4LDcgQEAKIAkJIHZtbGludXhfcGF0aF9fbnJfZW50cmllcyArIDEpOwogCiAJZm9yIChpID0gMDsgaSA8IHZtbGludXhfcGF0aF9fbnJfZW50cmllczsgKytpKSB7Ci0JCWVyciA9IGRzb19fbG9hZF92bWxpbnV4KGRzbywgbWFwLCB2bWxpbnV4X3BhdGhbaV0sIGZhbHNlLCBmaWx0ZXIpOworCQllcnIgPSBkc29fX2xvYWRfdm1saW51eChkc28sIG1hcCwgdm1saW51eF9wYXRoW2ldLCBmYWxzZSk7CiAJCWlmIChlcnIgPiAwKQogCQkJZ290byBvdXQ7CiAJfQpAQCAtMTU5OSw3ICsxNjI2LDcgQEAKIAlpZiAoIXN5bWJvbF9jb25mLmlnbm9yZV92bWxpbnV4X2J1aWxkaWQpCiAJCWZpbGVuYW1lID0gZHNvX19idWlsZF9pZF9maWxlbmFtZShkc28sIE5VTEwsIDApOwogCWlmIChmaWxlbmFtZSAhPSBOVUxMKSB7Ci0JCWVyciA9IGRzb19fbG9hZF92bWxpbnV4KGRzbywgbWFwLCBmaWxlbmFtZSwgdHJ1ZSwgZmlsdGVyKTsKKwkJZXJyID0gZHNvX19sb2FkX3ZtbGludXgoZHNvLCBtYXAsIGZpbGVuYW1lLCB0cnVlKTsKIAkJaWYgKGVyciA+IDApCiAJCQlnb3RvIG91dDsKIAkJZnJlZShmaWxlbmFtZSk7CkBAIC0xNzEzLDggKzE3NDAsNyBAQAogCXJldHVybiBzdHJkdXAocGF0aCk7CiB9CiAKLXN0YXRpYyBpbnQgZHNvX19sb2FkX2tlcm5lbF9zeW0oc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsCi0JCQkJc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKK3N0YXRpYyBpbnQgZHNvX19sb2FkX2tlcm5lbF9zeW0oc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXApCiB7CiAJaW50IGVycjsKIAljb25zdCBjaGFyICprYWxsc3ltc19maWxlbmFtZSA9IE5VTEw7CkBAIC0xNzQwLDEyICsxNzY2LDExIEBACiAJfQogCiAJaWYgKCFzeW1ib2xfY29uZi5pZ25vcmVfdm1saW51eCAmJiBzeW1ib2xfY29uZi52bWxpbnV4X25hbWUgIT0gTlVMTCkgewotCQlyZXR1cm4gZHNvX19sb2FkX3ZtbGludXgoZHNvLCBtYXAsIHN5bWJvbF9jb25mLnZtbGludXhfbmFtZSwKLQkJCQkJIGZhbHNlLCBmaWx0ZXIpOworCQlyZXR1cm4gZHNvX19sb2FkX3ZtbGludXgoZHNvLCBtYXAsIHN5bWJvbF9jb25mLnZtbGludXhfbmFtZSwgZmFsc2UpOwogCX0KIAogCWlmICghc3ltYm9sX2NvbmYuaWdub3JlX3ZtbGludXggJiYgdm1saW51eF9wYXRoICE9IE5VTEwpIHsKLQkJZXJyID0gZHNvX19sb2FkX3ZtbGludXhfcGF0aChkc28sIG1hcCwgZmlsdGVyKTsKKwkJZXJyID0gZHNvX19sb2FkX3ZtbGludXhfcGF0aChkc28sIG1hcCk7CiAJCWlmIChlcnIgPiAwKQogCQkJcmV0dXJuIGVycjsKIAl9CkBAIC0xNzYxLDcgKzE3ODYsNyBAQAogCWthbGxzeW1zX2ZpbGVuYW1lID0ga2FsbHN5bXNfYWxsb2NhdGVkX2ZpbGVuYW1lOwogCiBkb19rYWxsc3ltczoKLQllcnIgPSBkc29fX2xvYWRfa2FsbHN5bXMoZHNvLCBrYWxsc3ltc19maWxlbmFtZSwgbWFwLCBmaWx0ZXIpOworCWVyciA9IGRzb19fbG9hZF9rYWxsc3ltcyhkc28sIGthbGxzeW1zX2ZpbGVuYW1lLCBtYXApOwogCWlmIChlcnIgPiAwKQogCQlwcl9kZWJ1ZygiVXNpbmcgJXMgZm9yIHN5bWJvbHNcbiIsIGthbGxzeW1zX2ZpbGVuYW1lKTsKIAlmcmVlKGthbGxzeW1zX2FsbG9jYXRlZF9maWxlbmFtZSk7CkBAIC0xNzc2LDggKzE4MDEsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgZHNvX19sb2FkX2d1ZXN0X2tlcm5lbF9zeW0oc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsCi0JCQkJICAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKK3N0YXRpYyBpbnQgZHNvX19sb2FkX2d1ZXN0X2tlcm5lbF9zeW0oc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXApCiB7CiAJaW50IGVycjsKIAljb25zdCBjaGFyICprYWxsc3ltc19maWxlbmFtZSA9IE5VTEw7CkBAIC0xNzk5LDcgKzE4MjMsNyBAQAogCQlpZiAoc3ltYm9sX2NvbmYuZGVmYXVsdF9ndWVzdF92bWxpbnV4X25hbWUgIT0gTlVMTCkgewogCQkJZXJyID0gZHNvX19sb2FkX3ZtbGludXgoZHNvLCBtYXAsCiAJCQkJCQlzeW1ib2xfY29uZi5kZWZhdWx0X2d1ZXN0X3ZtbGludXhfbmFtZSwKLQkJCQkJCWZhbHNlLCBmaWx0ZXIpOworCQkJCQkJZmFsc2UpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCkBAIC0xODExLDcgKzE4MzUsNyBAQAogCQlrYWxsc3ltc19maWxlbmFtZSA9IHBhdGg7CiAJfQogCi0JZXJyID0gZHNvX19sb2FkX2thbGxzeW1zKGRzbywga2FsbHN5bXNfZmlsZW5hbWUsIG1hcCwgZmlsdGVyKTsKKwllcnIgPSBkc29fX2xvYWRfa2FsbHN5bXMoZHNvLCBrYWxsc3ltc19maWxlbmFtZSwgbWFwKTsKIAlpZiAoZXJyID4gMCkKIAkJcHJfZGVidWcoIlVzaW5nICVzIGZvciBzeW1ib2xzXG4iLCBrYWxsc3ltc19maWxlbmFtZSk7CiAJaWYgKGVyciA+IDAgJiYgIWRzb19faXNfa2NvcmUoZHNvKSkgewpAQCAtMTk0OCw2ICsxOTcyLDIzIEBACiAJcmV0dXJuIHZhbHVlOwogfQogCitpbnQgc3ltYm9sX19hbm5vdGF0aW9uX2luaXQodm9pZCkKK3sKKwlpZiAoc3ltYm9sX2NvbmYuaW5pdGlhbGl6ZWQpIHsKKwkJcHJfZXJyKCJBbm5vdGF0aW9uIG5lZWRzIHRvIGJlIGluaXQgYmVmb3JlIHN5bWJvbF9faW5pdCgpXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChzeW1ib2xfY29uZi5pbml0X2Fubm90YXRpb24pIHsKKwkJcHJfd2FybmluZygiQW5ub3RhdGlvbiBiZWluZyBpbml0aWFsaXplZCBtdWx0aXBsZSB0aW1lc1xuIik7CisJCXJldHVybiAwOworCX0KKworCXN5bWJvbF9jb25mLnByaXZfc2l6ZSArPSBzaXplb2Yoc3RydWN0IGFubm90YXRpb24pOworCXN5bWJvbF9jb25mLmluaXRfYW5ub3RhdGlvbiA9IHRydWU7CisJcmV0dXJuIDA7Cit9CisKIGludCBzeW1ib2xfX2luaXQoc3RydWN0IHBlcmZfZW52ICplbnYpCiB7CiAJY29uc3QgY2hhciAqc3ltZnM7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc3ltYm9sLmggYi90b29scy9wZXJmL3V0aWwvc3ltYm9sLmgKaW5kZXggNjk5ZjdjYi4uZDk2NDg0NCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuaApAQCAtNTcsNyArNTcsNyBAQAogCXU2NAkJZW5kOwogCXUxNgkJbmFtZWxlbjsKIAl1OAkJYmluZGluZzsKLQlib29sCQlpZ25vcmU7CisJdTgJCWlkbGU6MTsKIAl1OAkJYXJjaF9zeW07CiAJY2hhcgkJbmFtZVswXTsKIH07CkBAIC04OCw2ICs4OCw3IEBACiAJdW5zaWduZWQgc2hvcnQJcHJpdl9zaXplOwogCXVuc2lnbmVkIHNob3J0CW5yX2V2ZW50czsKIAlib29sCQl0cnlfdm1saW51eF9wYXRoLAorCQkJaW5pdF9hbm5vdGF0aW9uLAogCQkJZm9yY2UsCiAJCQlpZ25vcmVfdm1saW51eCwKIAkJCWlnbm9yZV92bWxpbnV4X2J1aWxkaWQsCkBAIC0yNDAsMTYgKzI0MSwxMyBAQAogYm9vbCBzeW1zcmNfX2hhc19zeW10YWIoc3RydWN0IHN5bXNyYyAqc3MpOwogYm9vbCBzeW1zcmNfX3Bvc3NpYmx5X3J1bnRpbWUoc3RydWN0IHN5bXNyYyAqc3MpOwogCi1pbnQgZHNvX19sb2FkKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKTsKK2ludCBkc29fX2xvYWQoc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXApOwogaW50IGRzb19fbG9hZF92bWxpbnV4KHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLAotCQkgICAgICBjb25zdCBjaGFyICp2bWxpbnV4LCBib29sIHZtbGludXhfYWxsb2NhdGVkLAotCQkgICAgICBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKTsKLWludCBkc29fX2xvYWRfdm1saW51eF9wYXRoKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLAotCQkJICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7CisJCSAgICAgIGNvbnN0IGNoYXIgKnZtbGludXgsIGJvb2wgdm1saW51eF9hbGxvY2F0ZWQpOworaW50IGRzb19fbG9hZF92bWxpbnV4X3BhdGgoc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXApOwogaW50IF9fZHNvX19sb2FkX2thbGxzeW1zKHN0cnVjdCBkc28gKmRzbywgY29uc3QgY2hhciAqZmlsZW5hbWUsIHN0cnVjdCBtYXAgKm1hcCwKLQkJCSBib29sIG5vX2tjb3JlLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKTsKLWludCBkc29fX2xvYWRfa2FsbHN5bXMoc3RydWN0IGRzbyAqZHNvLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgc3RydWN0IG1hcCAqbWFwLAotCQkgICAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7CisJCQkgYm9vbCBub19rY29yZSk7CitpbnQgZHNvX19sb2FkX2thbGxzeW1zKHN0cnVjdCBkc28gKmRzbywgY29uc3QgY2hhciAqZmlsZW5hbWUsIHN0cnVjdCBtYXAgKm1hcCk7CiAKIHZvaWQgZHNvX19pbnNlcnRfc3ltYm9sKHN0cnVjdCBkc28gKmRzbywgZW51bSBtYXBfdHlwZSB0eXBlLAogCQkJc3RydWN0IHN5bWJvbCAqc3ltKTsKQEAgLTI2MSw2ICsyNTksNyBAQAogc3RydWN0IHN5bWJvbCAqc3ltYm9sX19uZXh0X2J5X25hbWUoc3RydWN0IHN5bWJvbCAqc3ltKTsKIAogc3RydWN0IHN5bWJvbCAqZHNvX19maXJzdF9zeW1ib2woc3RydWN0IGRzbyAqZHNvLCBlbnVtIG1hcF90eXBlIHR5cGUpOworc3RydWN0IHN5bWJvbCAqZHNvX19sYXN0X3N5bWJvbChzdHJ1Y3QgZHNvICpkc28sIGVudW0gbWFwX3R5cGUgdHlwZSk7CiBzdHJ1Y3Qgc3ltYm9sICpkc29fX25leHRfc3ltYm9sKHN0cnVjdCBzeW1ib2wgKnN5bSk7CiAKIGVudW0gZHNvX3R5cGUgZHNvX190eXBlX2ZkKGludCBmZCk7CkBAIC0yNzcsNiArMjc2LDggQEAKIGludCBzeW1ib2xfX2luaXQoc3RydWN0IHBlcmZfZW52ICplbnYpOwogdm9pZCBzeW1ib2xfX2V4aXQodm9pZCk7CiB2b2lkIHN5bWJvbF9fZWxmX2luaXQodm9pZCk7CitpbnQgc3ltYm9sX19hbm5vdGF0aW9uX2luaXQodm9pZCk7CisKIHN0cnVjdCBzeW1ib2wgKnN5bWJvbF9fbmV3KHU2NCBzdGFydCwgdTY0IGxlbiwgdTggYmluZGluZywgY29uc3QgY2hhciAqbmFtZSk7CiBzaXplX3QgX19zeW1ib2xfX2ZwcmludGZfc3ltbmFtZV9vZmZzKGNvbnN0IHN0cnVjdCBzeW1ib2wgKnN5bSwKIAkJCQkgICAgICBjb25zdCBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwsCkBAIC0yOTEsMTYgKzI5MiwxNSBAQAogYm9vbCBzeW1ib2xfdHlwZV9faXNfYShjaGFyIHN5bWJvbF90eXBlLCBlbnVtIG1hcF90eXBlIG1hcF90eXBlKTsKIGJvb2wgc3ltYm9sX19yZXN0cmljdGVkX2ZpbGVuYW1lKGNvbnN0IGNoYXIgKmZpbGVuYW1lLAogCQkJCSBjb25zdCBjaGFyICpyZXN0cmljdGVkX2ZpbGVuYW1lKTsKLWJvb2wgc3ltYm9sX19pc19pZGxlKHN0cnVjdCBzeW1ib2wgKnN5bSk7CiBpbnQgc3ltYm9sX19jb25maWdfc3ltZnMoY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0IF9fbWF5YmVfdW51c2VkLAogCQkJIGNvbnN0IGNoYXIgKmRpciwgaW50IHVuc2V0IF9fbWF5YmVfdW51c2VkKTsKIAogaW50IGRzb19fbG9hZF9zeW0oc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsIHN0cnVjdCBzeW1zcmMgKnN5bXNfc3MsCi0JCSAgc3RydWN0IHN5bXNyYyAqcnVudGltZV9zcywgc3ltYm9sX2ZpbHRlcl90IGZpbHRlciwKLQkJICBpbnQga21vZHVsZSk7CisJCSAgc3RydWN0IHN5bXNyYyAqcnVudGltZV9zcywgaW50IGttb2R1bGUpOwogaW50IGRzb19fc3ludGhlc2l6ZV9wbHRfc3ltYm9scyhzdHJ1Y3QgZHNvICpkc28sIHN0cnVjdCBzeW1zcmMgKnNzLAotCQkJCXN0cnVjdCBtYXAgKm1hcCwgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7CisJCQkJc3RydWN0IG1hcCAqbWFwKTsKIAordm9pZCBfX3N5bWJvbHNfX2luc2VydChzdHJ1Y3QgcmJfcm9vdCAqc3ltYm9scywgc3RydWN0IHN5bWJvbCAqc3ltLCBib29sIGtlcm5lbCk7CiB2b2lkIHN5bWJvbHNfX2luc2VydChzdHJ1Y3QgcmJfcm9vdCAqc3ltYm9scywgc3RydWN0IHN5bWJvbCAqc3ltKTsKIHZvaWQgc3ltYm9sc19fZml4dXBfZHVwbGljYXRlKHN0cnVjdCByYl9yb290ICpzeW1ib2xzKTsKIHZvaWQgc3ltYm9sc19fZml4dXBfZW5kKHN0cnVjdCByYl9yb290ICpzeW1ib2xzKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC91bndpbmQtbGliZHcuYyBiL3Rvb2xzL3BlcmYvdXRpbC91bndpbmQtbGliZHcuYwppbmRleCBjZjVlMjUwLi43ODNhNTNmIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvdW53aW5kLWxpYmR3LmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3Vud2luZC1saWJkdy5jCkBAIC02Niw3ICs2Niw3IEBACiAJaWYgKF9fcmVwb3J0X21vZHVsZSgmYWwsIGlwLCB1aSkpCiAJCXJldHVybiAtMTsKIAotCWUtPmlwICA9IGlwOworCWUtPmlwICA9IGFsLmFkZHI7CiAJZS0+bWFwID0gYWwubWFwOwogCWUtPnN5bSA9IGFsLnN5bTsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Vud2luZC1saWJ1bndpbmQtbG9jYWwuYyBiL3Rvb2xzL3BlcmYvdXRpbC91bndpbmQtbGlidW53aW5kLWxvY2FsLmMKaW5kZXggOTdjMGY4Zi4uMjBjMmU1NyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3Vud2luZC1saWJ1bndpbmQtbG9jYWwuYworKysgYi90b29scy9wZXJmL3V0aWwvdW53aW5kLWxpYnVud2luZC1sb2NhbC5jCkBAIC01NDIsNyArNTQyLDcgQEAKIAl0aHJlYWRfX2ZpbmRfYWRkcl9sb2NhdGlvbih0aHJlYWQsIFBFUkZfUkVDT1JEX01JU0NfVVNFUiwKIAkJCQkgICBNQVBfX0ZVTkNUSU9OLCBpcCwgJmFsKTsKIAotCWUuaXAgPSBpcDsKKwllLmlwID0gYWwuYWRkcjsKIAllLm1hcCA9IGFsLm1hcDsKIAllLnN5bSA9IGFsLnN5bTsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3V0aWwuYyBiL3Rvb2xzL3BlcmYvdXRpbC91dGlsLmMKaW5kZXggY2VlNTU5ZC4uODVjNTY4MCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3V0aWwuYworKysgYi90b29scy9wZXJmL3V0aWwvdXRpbC5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CisjaW5jbHVkZSA8bGludXgvdGltZTY0Lmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSAiY2FsbGNoYWluLmgiCiAjaW5jbHVkZSAic3RybGlzdC5oIgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3V0aWwuaCBiL3Rvb2xzL3BlcmYvdXRpbC91dGlsLmgKaW5kZXggZTVmNTU0Ny4uNDM4OTllMCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3V0aWwuaAorKysgYi90b29scy9wZXJmL3V0aWwvdXRpbC5oCkBAIC0xNzksMTAgKzE3OSw2IEBACiAjdW5kZWYgdG9sb3dlcgogI3VuZGVmIHRvdXBwZXIKIAotI2lmbmRlZiBOU0VDX1BFUl9NU0VDCi0jZGVmaW5lIE5TRUNfUEVSX01TRUMJMTAwMDAwMEwKLSNlbmRpZgotCiBpbnQgcGFyc2VfbnNlY190aW1lKGNvbnN0IGNoYXIgKnN0ciwgdTY0ICpwdGltZSk7CiAKIGV4dGVybiB1bnNpZ25lZCBjaGFyIHNhbmVfY3R5cGVbMjU2XTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2FjcGkvY29tbW9uL2NtZnNpemUuYyBiL3Rvb2xzL3Bvd2VyL2FjcGkvY29tbW9uL2NtZnNpemUuYwppbmRleCBlNzNhNzlmLi5iYzgyNTk2IDEwMDY0NAotLS0gYS90b29scy9wb3dlci9hY3BpL2NvbW1vbi9jbWZzaXplLmMKKysrIGIvdG9vbHMvcG93ZXIvYWNwaS9jb21tb24vY21mc2l6ZS5jCkBAIC00NCw3ICs0NCw2IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSAiYWNjb21tb24uaCIKICNpbmNsdWRlICJhY2FwcHMuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9UT09MUwogQUNQSV9NT0RVTEVfTkFNRSgiY21mc2l6ZSIpCkBAIC02OSwyNCArNjgsMjQgQEAKIAogCS8qIFNhdmUgdGhlIGN1cnJlbnQgZmlsZSBwb2ludGVyLCBzZWVrIHRvIEVPRiB0byBvYnRhaW4gZmlsZSBzaXplICovCiAKLQljdXJyZW50X29mZnNldCA9IGFjcGlfb3NfZ2V0X2ZpbGVfb2Zmc2V0KGZpbGUpOworCWN1cnJlbnRfb2Zmc2V0ID0gZnRlbGwoZmlsZSk7CiAJaWYgKGN1cnJlbnRfb2Zmc2V0IDwgMCkgewogCQlnb3RvIG9mZnNldF9lcnJvcjsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX29zX3NldF9maWxlX29mZnNldChmaWxlLCAwLCBBQ1BJX0ZJTEVfRU5EKTsKKwlzdGF0dXMgPSBmc2VlayhmaWxlLCAwLCBTRUVLX0VORCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWdvdG8gc2Vla19lcnJvcjsKIAl9CiAKLQlmaWxlX3NpemUgPSBhY3BpX29zX2dldF9maWxlX29mZnNldChmaWxlKTsKKwlmaWxlX3NpemUgPSBmdGVsbChmaWxlKTsKIAlpZiAoZmlsZV9zaXplIDwgMCkgewogCQlnb3RvIG9mZnNldF9lcnJvcjsKIAl9CiAKIAkvKiBSZXN0b3JlIG9yaWdpbmFsIGZpbGUgcG9pbnRlciAqLwogCi0Jc3RhdHVzID0gYWNwaV9vc19zZXRfZmlsZV9vZmZzZXQoZmlsZSwgY3VycmVudF9vZmZzZXQsIEFDUElfRklMRV9CRUdJTik7CisJc3RhdHVzID0gZnNlZWsoZmlsZSwgY3VycmVudF9vZmZzZXQsIFNFRUtfU0VUKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJZ290byBzZWVrX2Vycm9yOwogCX0KQEAgLTk0LDEwICs5MywxMCBAQAogCXJldHVybiAoKHUzMilmaWxlX3NpemUpOwogCiBvZmZzZXRfZXJyb3I6Ci0JYWNwaV9sb2dfZXJyb3IoIkNvdWxkIG5vdCBnZXQgZmlsZSBvZmZzZXQiKTsKKwlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBnZXQgZmlsZSBvZmZzZXRcbiIpOwogCXJldHVybiAoQUNQSV9VSU5UMzJfTUFYKTsKIAogc2Vla19lcnJvcjoKLQlhY3BpX2xvZ19lcnJvcigiQ291bGQgbm90IHNldCBmaWxlIG9mZnNldCIpOworCWZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHNldCBmaWxlIG9mZnNldFxuIik7CiAJcmV0dXJuIChBQ1BJX1VJTlQzMl9NQVgpOwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvYWNwaS9jb21tb24vZ2V0b3B0LmMgYi90b29scy9wb3dlci9hY3BpL2NvbW1vbi9nZXRvcHQuYwppbmRleCAwYmQzNDNmLi4zOTE5OTcwIDEwMDY0NAotLS0gYS90b29scy9wb3dlci9hY3BpL2NvbW1vbi9nZXRvcHQuYworKysgYi90b29scy9wb3dlci9hY3BpL2NvbW1vbi9nZXRvcHQuYwpAQCAtNTcsNyArNTcsNyBAQAogI2luY2x1ZGUgImFjYXBwcy5oIgogCiAjZGVmaW5lIEFDUElfT1BUSU9OX0VSUk9SKG1zZywgYmFkY2hhcikgXAotCWlmIChhY3BpX2dibF9vcHRlcnIpIHthY3BpX2xvZ19lcnJvciAoIiVzJWNcbiIsIG1zZywgYmFkY2hhcik7fQorCWlmIChhY3BpX2dibF9vcHRlcnIpIHtmcHJpbnRmIChzdGRlcnIsICIlcyVjXG4iLCBtc2csIGJhZGNoYXIpO30KIAogaW50IGFjcGlfZ2JsX29wdGVyciA9IDE7CiBpbnQgYWNwaV9nYmxfb3B0aW5kID0gMTsKQEAgLTk0LDcgKzk0LDcgQEAKIAkJYWNwaV9nYmxfb3B0YXJnID0KIAkJICAgICZhcmd2W2FjcGlfZ2JsX29wdGluZCsrXVsoaW50KShjdXJyZW50X2NoYXJfcHRyICsgMSldOwogCX0gZWxzZSBpZiAoKythY3BpX2dibF9vcHRpbmQgPj0gYXJnYykgewotCQlBQ1BJX09QVElPTl9FUlJPUigiT3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50OiAtIiwgJ3YnKTsKKwkJQUNQSV9PUFRJT05fRVJST1IoIlxuT3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiwgMCk7CiAKIAkJY3VycmVudF9jaGFyX3B0ciA9IDE7CiAJCXJldHVybiAoLTEpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvYWNwaS9vc19zcGVjaWZpYy9zZXJ2aWNlX2xheWVycy9vc2xpYmNmcy5jIGIvdG9vbHMvcG93ZXIvYWNwaS9vc19zcGVjaWZpYy9zZXJ2aWNlX2xheWVycy9vc2xpYmNmcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWY0YWJhLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3Bvd2VyL2FjcGkvb3Nfc3BlY2lmaWMvc2VydmljZV9sYXllcnMvb3NsaWJjZnMuYworKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIE5hbWU6IG9zbGliY2ZzIC0gQyBsaWJyYXJ5IE9TTCBmb3IgZmlsZSBJL08KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDE2LCBJbnRlbCBDb3JwLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0jZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9PU19TRVJWSUNFUwotQUNQSV9NT0RVTEVfTkFNRSgib3NsaWJjZnMiKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX29zX29wZW5fZmlsZQotICoKLSAqIFBBUkFNRVRFUlM6ICBwYXRoICAgICAgICAgICAgICAgIC0gRmlsZSBwYXRoCi0gKiAgICAgICAgICAgICAgbW9kZXMgICAgICAgICAgICAgICAtIEZpbGUgb3BlcmF0aW9uIHR5cGUKLSAqCi0gKiBSRVRVUk46ICAgICAgRmlsZSBkZXNjcmlwdG9yLgotICoKLSAqIERFU0NSSVBUSU9OOiBPcGVuIGEgZmlsZSBmb3IgcmVhZGluZyAoQUNQSV9GSUxFX1JFQURJTkcpIG9yL2FuZCB3cml0aW5nCi0gKiAgICAgICAgICAgICAgKEFDUElfRklMRV9XUklUSU5HKS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQUNQSV9GSUxFIGFjcGlfb3Nfb3Blbl9maWxlKGNvbnN0IGNoYXIgKnBhdGgsIHU4IG1vZGVzKQotewotCUFDUElfRklMRSBmaWxlOwotCXUzMiBpID0gMDsKLQljaGFyIG1vZGVzX3N0cls0XTsKLQotCWlmIChtb2RlcyAmIEFDUElfRklMRV9SRUFESU5HKSB7Ci0JCW1vZGVzX3N0cltpKytdID0gJ3InOwotCX0KLQlpZiAobW9kZXMgJiBBQ1BJX0ZJTEVfV1JJVElORykgewotCQltb2Rlc19zdHJbaSsrXSA9ICd3JzsKLQl9Ci0KLQlpZiAobW9kZXMgJiBBQ1BJX0ZJTEVfQklOQVJZKSB7Ci0JCW1vZGVzX3N0cltpKytdID0gJ2InOwotCX0KLQotCW1vZGVzX3N0cltpKytdID0gJ1wwJzsKLQotCWZpbGUgPSBmb3BlbihwYXRoLCBtb2Rlc19zdHIpOwotCWlmICghZmlsZSkgewotCQlwZXJyb3IoIkNvdWxkIG5vdCBvcGVuIGZpbGUiKTsKLQl9Ci0KLQlyZXR1cm4gKGZpbGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX29zX2Nsb3NlX2ZpbGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgZmlsZSAgICAgICAgICAgICAgICAtIEFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUuCi0gKgotICogREVTQ1JJUFRJT046IENsb3NlIGEgZmlsZSBvcGVuZWQgdmlhIGFjcGlfb3Nfb3Blbl9maWxlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYWNwaV9vc19jbG9zZV9maWxlKEFDUElfRklMRSBmaWxlKQotewotCi0JZmNsb3NlKGZpbGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX29zX3JlYWRfZmlsZQotICoKLSAqIFBBUkFNRVRFUlM6ICBmaWxlICAgICAgICAgICAgICAgIC0gQW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IKLSAqICAgICAgICAgICAgICBidWZmZXIgICAgICAgICAgICAgIC0gRGF0YSBidWZmZXIKLSAqICAgICAgICAgICAgICBzaXplICAgICAgICAgICAgICAgIC0gRGF0YSBibG9jayBzaXplCi0gKiAgICAgICAgICAgICAgY291bnQgICAgICAgICAgICAgICAtIE51bWJlciBvZiBkYXRhIGJsb2NrcwotICoKLSAqIFJFVFVSTjogICAgICBOdW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZC4KLSAqCi0gKiBERVNDUklQVElPTjogUmVhZCBmcm9tIGEgZmlsZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1pbnQKLWFjcGlfb3NfcmVhZF9maWxlKEFDUElfRklMRSBmaWxlLCB2b2lkICpidWZmZXIsIGFjcGlfc2l6ZSBzaXplLCBhY3BpX3NpemUgY291bnQpCi17Ci0JaW50IGxlbmd0aDsKLQotCWxlbmd0aCA9IGZyZWFkKGJ1ZmZlciwgc2l6ZSwgY291bnQsIGZpbGUpOwotCWlmIChsZW5ndGggPCAwKSB7Ci0JCXBlcnJvcigiRXJyb3IgcmVhZGluZyBmaWxlIik7Ci0JfQotCi0JcmV0dXJuIChsZW5ndGgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX29zX3dyaXRlX2ZpbGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgZmlsZSAgICAgICAgICAgICAgICAtIEFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yCi0gKiAgICAgICAgICAgICAgYnVmZmVyICAgICAgICAgICAgICAtIERhdGEgYnVmZmVyCi0gKiAgICAgICAgICAgICAgc2l6ZSAgICAgICAgICAgICAgICAtIERhdGEgYmxvY2sgc2l6ZQotICogICAgICAgICAgICAgIGNvdW50ICAgICAgICAgICAgICAgLSBOdW1iZXIgb2YgZGF0YSBibG9ja3MKLSAqCi0gKiBSRVRVUk46ICAgICAgTnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4uCi0gKgotICogREVTQ1JJUFRJT046IFdyaXRlIHRvIGEgZmlsZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1pbnQKLWFjcGlfb3Nfd3JpdGVfZmlsZShBQ1BJX0ZJTEUgZmlsZSwKLQkJICAgdm9pZCAqYnVmZmVyLCBhY3BpX3NpemUgc2l6ZSwgYWNwaV9zaXplIGNvdW50KQotewotCWludCBsZW5ndGg7Ci0KLQlsZW5ndGggPSBmd3JpdGUoYnVmZmVyLCBzaXplLCBjb3VudCwgZmlsZSk7Ci0JaWYgKGxlbmd0aCA8IDApIHsKLQkJcGVycm9yKCJFcnJvciB3cml0aW5nIGZpbGUiKTsKLQl9Ci0KLQlyZXR1cm4gKGxlbmd0aCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfb3NfZ2V0X2ZpbGVfb2Zmc2V0Ci0gKgotICogUEFSQU1FVEVSUzogIGZpbGUgICAgICAgICAgICAgICAgLSBBbiBvcGVuIGZpbGUgZGVzY3JpcHRvcgotICoKLSAqIFJFVFVSTjogICAgICBDdXJyZW50IGZpbGUgcG9pbnRlciBwb3NpdGlvbi4KLSAqCi0gKiBERVNDUklQVElPTjogR2V0IGN1cnJlbnQgZmlsZSBvZmZzZXQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotbG9uZyBhY3BpX29zX2dldF9maWxlX29mZnNldChBQ1BJX0ZJTEUgZmlsZSkKLXsKLQlsb25nIG9mZnNldDsKLQotCW9mZnNldCA9IGZ0ZWxsKGZpbGUpOwotCXJldHVybiAob2Zmc2V0KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9vc19zZXRfZmlsZV9vZmZzZXQKLSAqCi0gKiBQQVJBTUVURVJTOiAgZmlsZSAgICAgICAgICAgICAgICAtIEFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yCi0gKiAgICAgICAgICAgICAgb2Zmc2V0ICAgICAgICAgICAgICAtIE5ldyBmaWxlIG9mZnNldAotICogICAgICAgICAgICAgIGZyb20gICAgICAgICAgICAgICAgLSBGcm9tIGJlZ2luL2VuZCBvZiBmaWxlCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBTZXQgY3VycmVudCBmaWxlIG9mZnNldC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBhY3BpX29zX3NldF9maWxlX29mZnNldChBQ1BJX0ZJTEUgZmlsZSwgbG9uZyBvZmZzZXQsIHU4IGZyb20pCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoZnJvbSA9PSBBQ1BJX0ZJTEVfQkVHSU4pIHsKLQkJcmV0ID0gZnNlZWsoZmlsZSwgb2Zmc2V0LCBTRUVLX1NFVCk7Ci0JfQotCi0JaWYgKGZyb20gPT0gQUNQSV9GSUxFX0VORCkgewotCQlyZXQgPSBmc2VlayhmaWxlLCBvZmZzZXQsIFNFRUtfRU5EKTsKLQl9Ci0KLQlpZiAocmV0IDwgMCkgewotCQlyZXR1cm4gKEFFX0VSUk9SKTsKLQl9IGVsc2UgewotCQlyZXR1cm4gKEFFX09LKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9hY3BpL29zX3NwZWNpZmljL3NlcnZpY2VfbGF5ZXJzL29zdW5peHhmLmMgYi90b29scy9wb3dlci9hY3BpL29zX3NwZWNpZmljL3NlcnZpY2VfbGF5ZXJzL29zdW5peHhmLmMKaW5kZXggODhhYTY2ZS4uOGQ4MDAzYyAxMDA2NDQKLS0tIGEvdG9vbHMvcG93ZXIvYWNwaS9vc19zcGVjaWZpYy9zZXJ2aWNlX2xheWVycy9vc3VuaXh4Zi5jCisrKyBiL3Rvb2xzL3Bvd2VyL2FjcGkvb3Nfc3BlY2lmaWMvc2VydmljZV9sYXllcnMvb3N1bml4eGYuYwpAQCAtNjMsMTAgKzYzLDcgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX09TX1NFUlZJQ0VTCiBBQ1BJX01PRFVMRV9OQU1FKCJvc3VuaXh4ZiIpCiAKLXU4IGFjcGlfZ2JsX2RlYnVnX3RpbWVvdXQgPSBGQUxTRTsKLQogLyogVXBjYWxscyB0byBhY3BpX2V4ZWMgKi8KLQogdm9pZAogYWVfdGFibGVfb3ZlcnJpZGUoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpleGlzdGluZ190YWJsZSwKIAkJICBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKipuZXdfdGFibGUpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvYWNwaS90b29scy9hY3BpZHVtcC9NYWtlZmlsZSBiL3Rvb2xzL3Bvd2VyL2FjcGkvdG9vbHMvYWNwaWR1bXAvTWFrZWZpbGUKaW5kZXggMjk0MmNkYy4uMDRiNWRiNyAxMDA2NDQKLS0tIGEvdG9vbHMvcG93ZXIvYWNwaS90b29scy9hY3BpZHVtcC9NYWtlZmlsZQorKysgYi90b29scy9wb3dlci9hY3BpL3Rvb2xzL2FjcGlkdW1wL01ha2VmaWxlCkBAIC0zNiwxMiArMzYsMTMgQEAKIAl1dGRlYnVnLm9cCiAJdXRleGNlcC5vXAogCXV0Z2xvYmFsLm9cCisJdXRoZXgub1wKIAl1dG1hdGgub1wKIAl1dG5vbmFuc2kub1wKIAl1dHByaW50Lm9cCiAJdXRzdHJpbmcub1wKKwl1dHN0cnRvdWw2NC5vXAogCXV0eGZlcnJvci5vXAotCW9zbGliY2ZzLm9cCiAJb3NsaW51eHRibC5vXAogCWNtZnNpemUub1wKIAlnZXRvcHQubwpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvYWNwaS90b29scy9hY3BpZHVtcC9hY3BpZHVtcC5oIGIvdG9vbHMvcG93ZXIvYWNwaS90b29scy9hY3BpZHVtcC9hY3BpZHVtcC5oCmluZGV4IDAyNWMyMzIuLjAwNDIzZmMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Bvd2VyL2FjcGkvdG9vbHMvYWNwaWR1bXAvYWNwaWR1bXAuaAorKysgYi90b29scy9wb3dlci9hY3BpL3Rvb2xzL2FjcGlkdW1wL2FjcGlkdW1wLmgKQEAgLTU1LDExICs1NSw3IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSAiYWNjb21tb24uaCIKICNpbmNsdWRlICJhY3RhYmxlcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlICJhY2FwcHMuaCIKIAogLyogR2xvYmFscyAqLwogCkBAIC03MiwxMiArNjgsNiBAQAogRVhURVJOIGNoYXIgSU5JVF9HTE9CQUwoKmdibF9vdXRwdXRfZmlsZW5hbWUsIE5VTEwpOwogRVhURVJOIHU2NCBJTklUX0dMT0JBTChnYmxfcnNkcF9iYXNlLCAwKTsKIAotLyogR2xvYmFscyByZXF1aXJlZCBmb3IgdXNlIHdpdGggQUNQSUNBIG1vZHVsZXMgKi8KLQotI2lmZGVmIF9ERUNMQVJFX0dMT0JBTFMKLXU4IGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCA9IDg7Ci0jZW5kaWYKLQogLyogQWN0aW9uIHRhYmxlIHVzZWQgdG8gZGVmZXIgcmVxdWVzdGVkIG9wdGlvbnMgKi8KIAogc3RydWN0IGFwX2R1bXBfYWN0aW9uIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2FjcGkvdG9vbHMvYWNwaWR1bXAvYXBkdW1wLmMgYi90b29scy9wb3dlci9hY3BpL3Rvb2xzL2FjcGlkdW1wL2FwZHVtcC5jCmluZGV4IGZiOGYxZDkuLjkwMzFiZTEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Bvd2VyL2FjcGkvdG9vbHMvYWNwaWR1bXAvYXBkdW1wLmMKKysrIGIvdG9vbHMvcG93ZXIvYWNwaS90b29scy9hY3BpZHVtcC9hcGR1bXAuYwpAQCAtNjksMTYgKzY5LDE3IEBACiAJCS8qIE1ha2Ugc3VyZSBzaWduYXR1cmUgaXMgYWxsIEFTQ0lJIGFuZCBhIHZhbGlkIEFDUEkgbmFtZSAqLwogCiAJCWlmICghYWNwaV91dF92YWxpZF9uYW1lc2VnKHRhYmxlLT5zaWduYXR1cmUpKSB7Ci0JCQlhY3BpX2xvZ19lcnJvcigiVGFibGUgc2lnbmF0dXJlICgweCU4LjhYKSBpcyBpbnZhbGlkXG4iLAotCQkJCSAgICAgICAqKHUzMiAqKXRhYmxlLT5zaWduYXR1cmUpOworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIlRhYmxlIHNpZ25hdHVyZSAoMHglOC44WCkgaXMgaW52YWxpZFxuIiwKKwkJCQkqKHUzMiAqKXRhYmxlLT5zaWduYXR1cmUpOwogCQkJcmV0dXJuIChGQUxTRSk7CiAJCX0KIAogCQkvKiBDaGVjayBmb3IgbWluaW11bSB0YWJsZSBsZW5ndGggKi8KIAogCQlpZiAodGFibGUtPmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSB7Ci0JCQlhY3BpX2xvZ19lcnJvcigiVGFibGUgbGVuZ3RoICgweCU4LjhYKSBpcyBpbnZhbGlkXG4iLAotCQkJCSAgICAgICB0YWJsZS0+bGVuZ3RoKTsKKwkJCWZwcmludGYoc3RkZXJyLCAiVGFibGUgbGVuZ3RoICgweCU4LjhYKSBpcyBpbnZhbGlkXG4iLAorCQkJCXRhYmxlLT5sZW5ndGgpOwogCQkJcmV0dXJuIChGQUxTRSk7CiAJCX0KIAl9CkBAIC0xMTUsOCArMTE2LDggQEAKIAl9CiAKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJYWNwaV9sb2dfZXJyb3IoIiU0LjRzOiBXYXJuaW5nOiB3cm9uZyBjaGVja3N1bSBpbiB0YWJsZVxuIiwKLQkJCSAgICAgICB0YWJsZS0+c2lnbmF0dXJlKTsKKwkJZnByaW50ZihzdGRlcnIsICIlNC40czogV2FybmluZzogd3JvbmcgY2hlY2tzdW0gaW4gdGFibGVcbiIsCisJCQl0YWJsZS0+c2lnbmF0dXJlKTsKIAl9CiAKIAlyZXR1cm4gKEFFX09LKTsKQEAgLTE5NSwxMyArMTk2LDEzIEBACiAJICogTm90ZTogc2ltcGxlc3QgdG8ganVzdCBhbHdheXMgZW1pdCBhIDY0LWJpdCBhZGRyZXNzLiBhY3BpX3h0cmFjdAogCSAqIHV0aWxpdHkgY2FuIGhhbmRsZSB0aGlzLgogCSAqLwotCWFjcGlfdXRfZmlsZV9wcmludGYoZ2JsX291dHB1dF9maWxlLCAiJTQuNHMgQCAweCU4LjhYJTguOFhcbiIsCi0JCQkgICAgdGFibGUtPnNpZ25hdHVyZSwgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3MpKTsKKwlmcHJpbnRmKGdibF9vdXRwdXRfZmlsZSwgIiU0LjRzIEAgMHglOC44WCU4LjhYXG4iLAorCQl0YWJsZS0+c2lnbmF0dXJlLCBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzcykpOwogCiAJYWNwaV91dF9kdW1wX2J1ZmZlcl90b19maWxlKGdibF9vdXRwdXRfZmlsZSwKIAkJCQkgICAgQUNQSV9DQVNUX1BUUih1OCwgdGFibGUpLCB0YWJsZV9sZW5ndGgsCiAJCQkJICAgIERCX0JZVEVfRElTUExBWSwgMCk7Ci0JYWNwaV91dF9maWxlX3ByaW50ZihnYmxfb3V0cHV0X2ZpbGUsICJcbiIpOworCWZwcmludGYoZ2JsX291dHB1dF9maWxlLCAiXG4iKTsKIAlyZXR1cm4gKDApOwogfQogCkBAIC0yMzksMTQgKzI0MCwxNCBAQAogCQkJaWYgKHN0YXR1cyA9PSBBRV9MSU1JVCkgewogCQkJCXJldHVybiAoMCk7CiAJCQl9IGVsc2UgaWYgKGkgPT0gMCkgewotCQkJCWFjcGlfbG9nX2Vycm9yCi0JCQkJICAgICgiQ291bGQgbm90IGdldCBBQ1BJIHRhYmxlcywgJXNcbiIsCi0JCQkJICAgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSk7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSJDb3VsZCBub3QgZ2V0IEFDUEkgdGFibGVzLCAlc1xuIiwKKwkJCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpOwogCQkJCXJldHVybiAoLTEpOwogCQkJfSBlbHNlIHsKLQkJCQlhY3BpX2xvZ19lcnJvcgotCQkJCSAgICAoIkNvdWxkIG5vdCBnZXQgQUNQSSB0YWJsZSBhdCBpbmRleCAldSwgJXNcbiIsCi0JCQkJICAgICBpLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSk7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSJDb3VsZCBub3QgZ2V0IEFDUEkgdGFibGUgYXQgaW5kZXggJXUsICVzXG4iLAorCQkJCQlpLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSk7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCX0KQEAgLTI4NiwyMCArMjg3LDIwIEBACiAKIAkvKiBDb252ZXJ0IGFyZ3VtZW50IHRvIGFuIGludGVnZXIgcGh5c2ljYWwgYWRkcmVzcyAqLwogCi0Jc3RhdHVzID0gYWNwaV91dF9zdHJ0b3VsNjQoYXNjaWlfYWRkcmVzcywgQUNQSV9BTllfQkFTRSwKLQkJCQkgICBBQ1BJX01BWDY0X0JZVEVfV0lEVEgsICZsb25nX2FkZHJlc3MpOworCXN0YXR1cyA9IGFjcGlfdXRfc3RydG91bDY0KGFzY2lpX2FkZHJlc3MsIEFDUElfU1RSVE9VTF82NEJJVCwKKwkJCQkgICAmbG9uZ19hZGRyZXNzKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJYWNwaV9sb2dfZXJyb3IoIiVzOiBDb3VsZCBub3QgY29udmVydCB0byBhIHBoeXNpY2FsIGFkZHJlc3NcbiIsCi0JCQkgICAgICAgYXNjaWlfYWRkcmVzcyk7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IENvdWxkIG5vdCBjb252ZXJ0IHRvIGEgcGh5c2ljYWwgYWRkcmVzc1xuIiwKKwkJCWFzY2lpX2FkZHJlc3MpOwogCQlyZXR1cm4gKC0xKTsKIAl9CiAKIAlhZGRyZXNzID0gKGFjcGlfcGh5c2ljYWxfYWRkcmVzcylsb25nX2FkZHJlc3M7CiAJc3RhdHVzID0gYWNwaV9vc19nZXRfdGFibGVfYnlfYWRkcmVzcyhhZGRyZXNzLCAmdGFibGUpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlhY3BpX2xvZ19lcnJvcigiQ291bGQgbm90IGdldCB0YWJsZSBhdCAweCU4LjhYJTguOFgsICVzXG4iLAotCQkJICAgICAgIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzKSwKLQkJCSAgICAgICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSk7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGdldCB0YWJsZSBhdCAweCU4LjhYJTguOFgsICVzXG4iLAorCQkJQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3MpLAorCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpOwogCQlyZXR1cm4gKC0xKTsKIAl9CiAKQEAgLTMzMSw5ICszMzIsOSBAQAogCWludCB0YWJsZV9zdGF0dXM7CiAKIAlpZiAoc3RybGVuKHNpZ25hdHVyZSkgIT0gQUNQSV9OQU1FX1NJWkUpIHsKLQkJYWNwaV9sb2dfZXJyb3IKLQkJICAgICgiSW52YWxpZCB0YWJsZSBzaWduYXR1cmUgWyVzXTogbXVzdCBiZSBleGFjdGx5IDQgY2hhcmFjdGVyc1xuIiwKLQkJICAgICBzaWduYXR1cmUpOworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJJbnZhbGlkIHRhYmxlIHNpZ25hdHVyZSBbJXNdOiBtdXN0IGJlIGV4YWN0bHkgNCBjaGFyYWN0ZXJzXG4iLAorCQkJc2lnbmF0dXJlKTsKIAkJcmV0dXJuICgtMSk7CiAJfQogCkBAIC0zNjMsOSArMzY0LDkgQEAKIAkJCQlyZXR1cm4gKDApOwogCQkJfQogCi0JCQlhY3BpX2xvZ19lcnJvcgotCQkJICAgICgiQ291bGQgbm90IGdldCBBQ1BJIHRhYmxlIHdpdGggc2lnbmF0dXJlIFslc10sICVzXG4iLAotCQkJICAgICBsb2NhbF9zaWduYXR1cmUsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKTsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJDb3VsZCBub3QgZ2V0IEFDUEkgdGFibGUgd2l0aCBzaWduYXR1cmUgWyVzXSwgJXNcbiIsCisJCQkJbG9jYWxfc2lnbmF0dXJlLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSk7CiAJCQlyZXR1cm4gKC0xKTsKIAkJfQogCkBAIC00MDgsMjQgKzQwOSwyNCBAQAogCX0KIAogCWlmICghYWNwaV91dF92YWxpZF9uYW1lc2VnKHRhYmxlLT5zaWduYXR1cmUpKSB7Ci0JCWFjcGlfbG9nX2Vycm9yCi0JCSAgICAoIk5vIHZhbGlkIEFDUEkgc2lnbmF0dXJlIHdhcyBmb3VuZCBpbiBpbnB1dCBmaWxlICVzXG4iLAotCQkgICAgIHBhdGhuYW1lKTsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiTm8gdmFsaWQgQUNQSSBzaWduYXR1cmUgd2FzIGZvdW5kIGluIGlucHV0IGZpbGUgJXNcbiIsCisJCQlwYXRobmFtZSk7CiAJfQogCiAJLyogRmlsZSBtdXN0IGJlIGF0IGxlYXN0IGFzIGxvbmcgYXMgdGhlIHRhYmxlIGxlbmd0aCAqLwogCiAJaWYgKHRhYmxlLT5sZW5ndGggPiBmaWxlX3NpemUpIHsKLQkJYWNwaV9sb2dfZXJyb3IKLQkJICAgICgiVGFibGUgbGVuZ3RoICgweCVYKSBpcyB0b28gbGFyZ2UgZm9yIGlucHV0IGZpbGUgKDB4JVgpICVzXG4iLAotCQkgICAgIHRhYmxlLT5sZW5ndGgsIGZpbGVfc2l6ZSwgcGF0aG5hbWUpOworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJUYWJsZSBsZW5ndGggKDB4JVgpIGlzIHRvbyBsYXJnZSBmb3IgaW5wdXQgZmlsZSAoMHglWCkgJXNcbiIsCisJCQl0YWJsZS0+bGVuZ3RoLCBmaWxlX3NpemUsIHBhdGhuYW1lKTsKIAkJZ290byBleGl0OwogCX0KIAogCWlmIChnYmxfdmVyYm9zZV9tb2RlKSB7Ci0JCWFjcGlfbG9nX2Vycm9yCi0JCSAgICAoIklucHV0IGZpbGU6ICAlcyBjb250YWlucyB0YWJsZSBbJTQuNHNdLCAweCVYICgldSkgYnl0ZXNcbiIsCi0JCSAgICAgcGF0aG5hbWUsIHRhYmxlLT5zaWduYXR1cmUsIGZpbGVfc2l6ZSwgZmlsZV9zaXplKTsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiSW5wdXQgZmlsZTogICVzIGNvbnRhaW5zIHRhYmxlIFslNC40c10sIDB4JVggKCV1KSBieXRlc1xuIiwKKwkJCXBhdGhuYW1lLCB0YWJsZS0+c2lnbmF0dXJlLCBmaWxlX3NpemUsIGZpbGVfc2l6ZSk7CiAJfQogCiAJdGFibGVfc3RhdHVzID0gYXBfZHVtcF90YWJsZV9idWZmZXIodGFibGUsIDAsIDApOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvYWNwaS90b29scy9hY3BpZHVtcC9hcGZpbGVzLmMgYi90b29scy9wb3dlci9hY3BpL3Rvb2xzL2FjcGlkdW1wL2FwZmlsZXMuYwppbmRleCA1ZmNkOTcwLi5kZDViODYxIDEwMDY0NAotLS0gYS90b29scy9wb3dlci9hY3BpL3Rvb2xzL2FjcGlkdW1wL2FwZmlsZXMuYworKysgYi90b29scy9wb3dlci9hY3BpL3Rvb2xzL2FjcGlkdW1wL2FwZmlsZXMuYwpAQCAtNDIsNyArNDIsNiBAQAogICovCiAKICNpbmNsdWRlICJhY3BpZHVtcC5oIgotI2luY2x1ZGUgImFjYXBwcy5oIgogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCiAKQEAgLTY2LDcgKzY1LDggQEAKIAlzdHJ1Y3Qgc3RhdCBzdGF0X2luZm87CiAKIAlpZiAoIXN0YXQocGF0aG5hbWUsICZzdGF0X2luZm8pKSB7Ci0JCWFjcGlfbG9nX2Vycm9yKCJUYXJnZXQgcGF0aCBhbHJlYWR5IGV4aXN0cywgb3ZlcndyaXRlPyBbeXxuXSAiKTsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiVGFyZ2V0IHBhdGggYWxyZWFkeSBleGlzdHMsIG92ZXJ3cml0ZT8gW3l8bl0gIik7CiAKIAkJaWYgKGdldGNoYXIoKSAhPSAneScpIHsKIAkJCXJldHVybiAoLTEpOwpAQCAtMTAyLDkgKzEwMiw5IEBACiAKIAkvKiBQb2ludCBzdGRvdXQgdG8gdGhlIGZpbGUgKi8KIAotCWZpbGUgPSBhY3BpX29zX29wZW5fZmlsZShwYXRobmFtZSwgQUNQSV9GSUxFX1dSSVRJTkcpOworCWZpbGUgPSBmb3BlbihwYXRobmFtZSwgInciKTsKIAlpZiAoIWZpbGUpIHsKLQkJYWNwaV9sb2dfZXJyb3IoIkNvdWxkIG5vdCBvcGVuIG91dHB1dCBmaWxlOiAlc1xuIiwgcGF0aG5hbWUpOworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIG91dHB1dCBmaWxlOiAlc1xuIiwgcGF0aG5hbWUpOwogCQlyZXR1cm4gKC0xKTsKIAl9CiAKQEAgLTEzNCw3ICsxMzQsNyBAQAogCWNoYXIgZmlsZW5hbWVbQUNQSV9OQU1FX1NJWkUgKyAxNl07CiAJY2hhciBpbnN0YW5jZV9zdHJbMTZdOwogCUFDUElfRklMRSBmaWxlOwotCXNpemVfdCBhY3R1YWw7CisJYWNwaV9zaXplIGFjdHVhbDsKIAl1MzIgdGFibGVfbGVuZ3RoOwogCiAJLyogT2J0YWluIHRhYmxlIGxlbmd0aCAqLwpAQCAtMTU4LDM3ICsxNTgsMzYgQEAKIAkvKiBIYW5kbGUgbXVsdGlwbGUgU1NEdHMgLSBjcmVhdGUgZGlmZmVyZW50IGZpbGVuYW1lcyBmb3IgZWFjaCAqLwogCiAJaWYgKGluc3RhbmNlID4gMCkgewotCQlhY3BpX3V0X3NucHJpbnRmKGluc3RhbmNlX3N0ciwgc2l6ZW9mKGluc3RhbmNlX3N0ciksICIldSIsCi0JCQkJIGluc3RhbmNlKTsKKwkJc25wcmludGYoaW5zdGFuY2Vfc3RyLCBzaXplb2YoaW5zdGFuY2Vfc3RyKSwgIiV1IiwgaW5zdGFuY2UpOwogCQlzdHJjYXQoZmlsZW5hbWUsIGluc3RhbmNlX3N0cik7CiAJfQogCiAJc3RyY2F0KGZpbGVuYW1lLCBGSUxFX1NVRkZJWF9CSU5BUllfVEFCTEUpOwogCiAJaWYgKGdibF92ZXJib3NlX21vZGUpIHsKLQkJYWNwaV9sb2dfZXJyb3IKLQkJICAgICgiV3JpdGluZyBbJTQuNHNdIHRvIGJpbmFyeSBmaWxlOiAlcyAweCVYICgldSkgYnl0ZXNcbiIsCi0JCSAgICAgdGFibGUtPnNpZ25hdHVyZSwgZmlsZW5hbWUsIHRhYmxlLT5sZW5ndGgsIHRhYmxlLT5sZW5ndGgpOworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJXcml0aW5nIFslNC40c10gdG8gYmluYXJ5IGZpbGU6ICVzIDB4JVggKCV1KSBieXRlc1xuIiwKKwkJCXRhYmxlLT5zaWduYXR1cmUsIGZpbGVuYW1lLCB0YWJsZS0+bGVuZ3RoLAorCQkJdGFibGUtPmxlbmd0aCk7CiAJfQogCiAJLyogT3BlbiB0aGUgZmlsZSBhbmQgZHVtcCB0aGUgZW50aXJlIHRhYmxlIGluIGJpbmFyeSBtb2RlICovCiAKLQlmaWxlID0gYWNwaV9vc19vcGVuX2ZpbGUoZmlsZW5hbWUsCi0JCQkJIEFDUElfRklMRV9XUklUSU5HIHwgQUNQSV9GSUxFX0JJTkFSWSk7CisJZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAid2IiKTsKIAlpZiAoIWZpbGUpIHsKLQkJYWNwaV9sb2dfZXJyb3IoIkNvdWxkIG5vdCBvcGVuIG91dHB1dCBmaWxlOiAlc1xuIiwgZmlsZW5hbWUpOworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIG91dHB1dCBmaWxlOiAlc1xuIiwgZmlsZW5hbWUpOwogCQlyZXR1cm4gKC0xKTsKIAl9CiAKLQlhY3R1YWwgPSBhY3BpX29zX3dyaXRlX2ZpbGUoZmlsZSwgdGFibGUsIDEsIHRhYmxlX2xlbmd0aCk7CisJYWN0dWFsID0gZndyaXRlKHRhYmxlLCAxLCB0YWJsZV9sZW5ndGgsIGZpbGUpOwogCWlmIChhY3R1YWwgIT0gdGFibGVfbGVuZ3RoKSB7Ci0JCWFjcGlfbG9nX2Vycm9yKCJFcnJvciB3cml0aW5nIGJpbmFyeSBvdXRwdXQgZmlsZTogJXNcbiIsCi0JCQkgICAgICAgZmlsZW5hbWUpOwotCQlhY3BpX29zX2Nsb3NlX2ZpbGUoZmlsZSk7CisJCWZwcmludGYoc3RkZXJyLCAiRXJyb3Igd3JpdGluZyBiaW5hcnkgb3V0cHV0IGZpbGU6ICVzXG4iLAorCQkJZmlsZW5hbWUpOworCQlmY2xvc2UoZmlsZSk7CiAJCXJldHVybiAoLTEpOwogCX0KIAotCWFjcGlfb3NfY2xvc2VfZmlsZShmaWxlKTsKKwlmY2xvc2UoZmlsZSk7CiAJcmV0dXJuICgwKTsKIH0KIApAQCAtMjExLDE0ICsyMTAsMTMgQEAKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmJ1ZmZlciA9IE5VTEw7CiAJQUNQSV9GSUxFIGZpbGU7CiAJdTMyIGZpbGVfc2l6ZTsKLQlzaXplX3QgYWN0dWFsOworCWFjcGlfc2l6ZSBhY3R1YWw7CiAKIAkvKiBNdXN0IHVzZSBiaW5hcnkgbW9kZSAqLwogCi0JZmlsZSA9Ci0JICAgIGFjcGlfb3Nfb3Blbl9maWxlKHBhdGhuYW1lLCBBQ1BJX0ZJTEVfUkVBRElORyB8IEFDUElfRklMRV9CSU5BUlkpOworCWZpbGUgPSBmb3BlbihwYXRobmFtZSwgInJiIik7CiAJaWYgKCFmaWxlKSB7Ci0JCWFjcGlfbG9nX2Vycm9yKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlOiAlc1xuIiwgcGF0aG5hbWUpOworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIGlucHV0IGZpbGU6ICVzXG4iLCBwYXRobmFtZSk7CiAJCXJldHVybiAoTlVMTCk7CiAJfQogCkBAIC0yMjYsNyArMjI0LDggQEAKIAogCWZpbGVfc2l6ZSA9IGNtX2dldF9maWxlX3NpemUoZmlsZSk7CiAJaWYgKGZpbGVfc2l6ZSA9PSBBQ1BJX1VJTlQzMl9NQVgpIHsKLQkJYWNwaV9sb2dfZXJyb3IoIkNvdWxkIG5vdCBnZXQgaW5wdXQgZmlsZSBzaXplOiAlc1xuIiwgcGF0aG5hbWUpOworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJDb3VsZCBub3QgZ2V0IGlucHV0IGZpbGUgc2l6ZTogJXNcbiIsIHBhdGhuYW1lKTsKIAkJZ290byBjbGVhbnVwOwogCX0KIApAQCAtMjM0LDE2ICsyMzMsMTcgQEAKIAogCWJ1ZmZlciA9IEFDUElfQUxMT0NBVEVfWkVST0VEKGZpbGVfc2l6ZSk7CiAJaWYgKCFidWZmZXIpIHsKLQkJYWNwaV9sb2dfZXJyb3IoIkNvdWxkIG5vdCBhbGxvY2F0ZSBmaWxlIGJ1ZmZlciBvZiBzaXplOiAldVxuIiwKLQkJCSAgICAgICBmaWxlX3NpemUpOworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJDb3VsZCBub3QgYWxsb2NhdGUgZmlsZSBidWZmZXIgb2Ygc2l6ZTogJXVcbiIsCisJCQlmaWxlX3NpemUpOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJLyogUmVhZCB0aGUgZW50aXJlIGZpbGUgKi8KIAotCWFjdHVhbCA9IGFjcGlfb3NfcmVhZF9maWxlKGZpbGUsIGJ1ZmZlciwgMSwgZmlsZV9zaXplKTsKKwlhY3R1YWwgPSBmcmVhZChidWZmZXIsIDEsIGZpbGVfc2l6ZSwgZmlsZSk7CiAJaWYgKGFjdHVhbCAhPSBmaWxlX3NpemUpIHsKLQkJYWNwaV9sb2dfZXJyb3IoIkNvdWxkIG5vdCByZWFkIGlucHV0IGZpbGU6ICVzXG4iLCBwYXRobmFtZSk7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHJlYWQgaW5wdXQgZmlsZTogJXNcbiIsIHBhdGhuYW1lKTsKIAkJQUNQSV9GUkVFKGJ1ZmZlcik7CiAJCWJ1ZmZlciA9IE5VTEw7CiAJCWdvdG8gY2xlYW51cDsKQEAgLTI1Miw2ICsyNTIsNiBAQAogCSpvdXRfZmlsZV9zaXplID0gZmlsZV9zaXplOwogCiBjbGVhbnVwOgotCWFjcGlfb3NfY2xvc2VfZmlsZShmaWxlKTsKKwlmY2xvc2UoZmlsZSk7CiAJcmV0dXJuIChidWZmZXIpOwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvYWNwaS90b29scy9hY3BpZHVtcC9hcG1haW4uYyBiL3Rvb2xzL3Bvd2VyL2FjcGkvdG9vbHMvYWNwaWR1bXAvYXBtYWluLmMKaW5kZXggNzY5MmU2Yi4uN2ZmNDZiZSAxMDA2NDQKLS0tIGEvdG9vbHMvcG93ZXIvYWNwaS90b29scy9hY3BpZHVtcC9hcG1haW4uYworKysgYi90b29scy9wb3dlci9hY3BpL3Rvb2xzL2FjcGlkdW1wL2FwbWFpbi5jCkBAIC00Myw3ICs0Myw2IEBACiAKICNkZWZpbmUgX0RFQ0xBUkVfR0xPQkFMUwogI2luY2x1ZGUgImFjcGlkdW1wLmgiCi0jaW5jbHVkZSAiYWNhcHBzLmgiCiAKIC8qCiAgKiBhY3BpZHVtcCAtIEEgcG9ydGFibGUgdXRpbGl0eSBmb3Igb2J0YWluaW5nIHN5c3RlbSBBQ1BJIHRhYmxlcyBhbmQgZHVtcGluZwpAQCAtMTQwLDggKzEzOSw4IEBACiAKIAljdXJyZW50X2FjdGlvbisrOwogCWlmIChjdXJyZW50X2FjdGlvbiA+IEFQX01BWF9BQ1RJT05TKSB7Ci0JCWFjcGlfbG9nX2Vycm9yKCJUb28gbWFueSB0YWJsZSBvcHRpb25zIChtYXggJXUpXG4iLAotCQkJICAgICAgIEFQX01BWF9BQ1RJT05TKTsKKwkJZnByaW50ZihzdGRlcnIsICJUb28gbWFueSB0YWJsZSBvcHRpb25zIChtYXggJXUpXG4iLAorCQkJQVBfTUFYX0FDVElPTlMpOwogCQlyZXR1cm4gKC0xKTsKIAl9CiAKQEAgLTE4Niw5ICsxODUsOSBAQAogCQkJfSBlbHNlIGlmICghc3RyY21wKGFjcGlfZ2JsX29wdGFyZywgIm9mZiIpKSB7CiAJCQkJZ2JsX2R1bXBfY3VzdG9taXplZF90YWJsZXMgPSBGQUxTRTsKIAkJCX0gZWxzZSB7Ci0JCQkJYWNwaV9sb2dfZXJyb3IKLQkJCQkgICAgKCIlczogQ2Fubm90IGhhbmRsZSB0aGlzIHN3aXRjaCwgcGxlYXNlIHVzZSBvbnxvZmZcbiIsCi0JCQkJICAgICBhY3BpX2dibF9vcHRhcmcpOworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkiJXM6IENhbm5vdCBoYW5kbGUgdGhpcyBzd2l0Y2gsIHBsZWFzZSB1c2Ugb258b2ZmXG4iLAorCQkJCQlhY3BpX2dibF9vcHRhcmcpOwogCQkJCXJldHVybiAoLTEpOwogCQkJfQogCQkJY29udGludWU7CkBAIC0yMDksMTMgKzIwOCwxMyBAQAogCQljYXNlICdyJzoJLyogRHVtcCB0YWJsZXMgZnJvbSBzcGVjaWZpZWQgUlNEUCAqLwogCiAJCQlzdGF0dXMgPQotCQkJICAgIGFjcGlfdXRfc3RydG91bDY0KGFjcGlfZ2JsX29wdGFyZywgQUNQSV9BTllfQkFTRSwKLQkJCQkJICAgICAgQUNQSV9NQVg2NF9CWVRFX1dJRFRILAorCQkJICAgIGFjcGlfdXRfc3RydG91bDY0KGFjcGlfZ2JsX29wdGFyZywKKwkJCQkJICAgICAgQUNQSV9TVFJUT1VMXzY0QklULAogCQkJCQkgICAgICAmZ2JsX3JzZHBfYmFzZSk7CiAJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlhY3BpX2xvZ19lcnJvcgotCQkJCSAgICAoIiVzOiBDb3VsZCBub3QgY29udmVydCB0byBhIHBoeXNpY2FsIGFkZHJlc3NcbiIsCi0JCQkJICAgICBhY3BpX2dibF9vcHRhcmcpOworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkiJXM6IENvdWxkIG5vdCBjb252ZXJ0IHRvIGEgcGh5c2ljYWwgYWRkcmVzc1xuIiwKKwkJCQkJYWNwaV9nYmxfb3B0YXJnKTsKIAkJCQlyZXR1cm4gKC0xKTsKIAkJCX0KIAkJCWNvbnRpbnVlOwpAQCAtMjQyLDcgKzI0MSw3IEBACiAJCWNhc2UgJ3onOgkvKiBWZXJib3NlIG1vZGUgKi8KIAogCQkJZ2JsX3ZlcmJvc2VfbW9kZSA9IFRSVUU7Ci0JCQlhY3BpX2xvZ19lcnJvcihBQ1BJX0NPTU1PTl9TSUdOT04oQVBfVVRJTElUWV9OQU1FKSk7CisJCQlmcHJpbnRmKHN0ZGVyciwgQUNQSV9DT01NT05fU0lHTk9OKEFQX1VUSUxJVFlfTkFNRSkpOwogCQkJY29udGludWU7CiAKIAkJCS8qCkBAIC0zMTUsNiArMzE0LDcgQEAKIAlBQ1BJX0RFQlVHX0lOSVRJQUxJWkUoKTsJLyogRm9yIGRlYnVnIHZlcnNpb24gb25seSAqLwogCWFjcGlfb3NfaW5pdGlhbGl6ZSgpOwogCWdibF9vdXRwdXRfZmlsZSA9IEFDUElfRklMRV9PVVQ7CisJYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoID0gODsKIAogCS8qIFByb2Nlc3MgY29tbWFuZCBsaW5lIG9wdGlvbnMgKi8KIApAQCAtMzUzLDggKzM1Myw5IEBACiAKIAkJZGVmYXVsdDoKIAotCQkJYWNwaV9sb2dfZXJyb3IoIkludGVybmFsIGVycm9yLCBpbnZhbGlkIGFjdGlvbjogMHglWFxuIiwKLQkJCQkgICAgICAgYWN0aW9uLT50b19iZV9kb25lKTsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJJbnRlcm5hbCBlcnJvciwgaW52YWxpZCBhY3Rpb246IDB4JVhcbiIsCisJCQkJYWN0aW9uLT50b19iZV9kb25lKTsKIAkJCXJldHVybiAoLTEpOwogCQl9CiAKQEAgLTM2OSwxMiArMzcwLDEyIEBACiAJCQkvKiBTdW1tYXJ5IGZvciB0aGUgb3V0cHV0IGZpbGUgKi8KIAogCQkJZmlsZV9zaXplID0gY21fZ2V0X2ZpbGVfc2l6ZShnYmxfb3V0cHV0X2ZpbGUpOwotCQkJYWNwaV9sb2dfZXJyb3IKLQkJCSAgICAoIk91dHB1dCBmaWxlICVzIGNvbnRhaW5zIDB4JVggKCV1KSBieXRlc1xuXG4iLAotCQkJICAgICBnYmxfb3V0cHV0X2ZpbGVuYW1lLCBmaWxlX3NpemUsIGZpbGVfc2l6ZSk7CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiT3V0cHV0IGZpbGUgJXMgY29udGFpbnMgMHglWCAoJXUpIGJ5dGVzXG5cbiIsCisJCQkJZ2JsX291dHB1dF9maWxlbmFtZSwgZmlsZV9zaXplLCBmaWxlX3NpemUpOwogCQl9CiAKLQkJYWNwaV9vc19jbG9zZV9maWxlKGdibF9vdXRwdXRfZmlsZSk7CisJCWZjbG9zZShnYmxfb3V0cHV0X2ZpbGUpOwogCX0KIAogCXJldHVybiAoc3RhdHVzKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3NwaS9NYWtlZmlsZSBiL3Rvb2xzL3NwaS9NYWtlZmlsZQppbmRleCBjZDBkYjYyLi4zODE1YjE4IDEwMDY0NAotLS0gYS90b29scy9zcGkvTWFrZWZpbGUKKysrIGIvdG9vbHMvc3BpL01ha2VmaWxlCkBAIC0xLDMgKzEsNSBAQAorQ0MgPSAkKENST1NTX0NPTVBJTEUpZ2NjCisKIGFsbDogc3BpZGV2X3Rlc3Qgc3BpZGV2X2ZkeAogCiBjbGVhbjoKZGlmZiAtLWdpdCBhL3Rvb2xzL3NwaS9zcGlkZXZfdGVzdC5jIGIvdG9vbHMvc3BpL3NwaWRldl90ZXN0LmMKaW5kZXggOGE3M2Q4MS4uZjA0NmI3NyAxMDA2NDQKLS0tIGEvdG9vbHMvc3BpL3NwaWRldl90ZXN0LmMKKysrIGIvdG9vbHMvc3BpL3NwaWRldl90ZXN0LmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxnZXRvcHQuaD4KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlkZXYuaD4KQEAgLTI4NCw3ICsyODUsNyBAQAogCiBzdGF0aWMgdm9pZCB0cmFuc2Zlcl9lc2NhcGVkX3N0cmluZyhpbnQgZmQsIGNoYXIgKnN0cikKIHsKLQlzaXplX3Qgc2l6ZSA9IHN0cmxlbihzdHIgKyAxKTsKKwlzaXplX3Qgc2l6ZSA9IHN0cmxlbihzdHIpOwogCXVpbnQ4X3QgKnR4OwogCXVpbnQ4X3QgKnJ4OwogCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL252ZGltbS90ZXN0L25maXQuYyBiL3Rvb2xzL3Rlc3RpbmcvbnZkaW1tL3Rlc3QvbmZpdC5jCmluZGV4IGRkNDhmNDIuLmY2NGM1N2IgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3RpbmcvbnZkaW1tL3Rlc3QvbmZpdC5jCisrKyBiL3Rvb2xzL3Rlc3RpbmcvbnZkaW1tL3Rlc3QvbmZpdC5jCkBAIC02MDMsNyArNjAzLDggQEAKIAkJCXJldHVybiAtRU5PTUVNOwogCQlzcHJpbnRmKHQtPmxhYmVsW2ldLCAibGFiZWwlZCIsIGkpOwogCi0JCXQtPmZsdXNoW2ldID0gdGVzdF9hbGxvYyh0LCBzaXplb2YodTY0KSAqIE5VTV9ISU5UUywKKwkJdC0+Zmx1c2hbaV0gPSB0ZXN0X2FsbG9jKHQsIG1heChQQUdFX1NJWkUsCisJCQkJCXNpemVvZih1NjQpICogTlVNX0hJTlRTKSwKIAkJCQkmdC0+Zmx1c2hfZG1hW2ldKTsKIAkJaWYgKCF0LT5mbHVzaFtpXSkKIAkJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL01ha2VmaWxlCmluZGV4IDNiNTMwNDYuLjlkMDkxOWVkIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvTWFrZWZpbGUKKysrIGIvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL01ha2VmaWxlCkBAIC0xLDUgKzEsNSBAQAogCi1DRkxBR1MgKz0gLUkuIC1nIC1XYWxsIC1EX0xHUExfU09VUkNFCitDRkxBR1MgKz0gLUkuIC1nIC1PMiAtV2FsbCAtRF9MR1BMX1NPVVJDRQogTERGTEFHUyArPSAtbHB0aHJlYWQgLWx1cmN1CiBUQVJHRVRTID0gbWFpbgogT0ZJTEVTID0gbWFpbi5vIHJhZGl4LXRyZWUubyBsaW51eC5vIHRlc3QubyB0YWdfY2hlY2subyBmaW5kX25leHRfYml0Lm8gXApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2xpbnV4L2NwdS5oIGIvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2xpbnV4L2NwdS5oCmluZGV4IDYwYTQwNDUuLjdjZjQxMjEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9saW51eC9jcHUuaAorKysgYi90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbGludXgvY3B1LmgKQEAgLTcsMTkgKzcsOCBAQAogI2RlZmluZSBDUFVfRE9XTl9QUkVQQVJFCTB4MDAwNSAvKiBDUFUgKHVuc2lnbmVkKXYgZ29pbmcgZG93biAqLwogI2RlZmluZSBDUFVfRE9XTl9GQUlMRUQJCTB4MDAwNiAvKiBDUFUgKHVuc2lnbmVkKXYgTk9UIGdvaW5nIGRvd24gKi8KICNkZWZpbmUgQ1BVX0RFQUQJCTB4MDAwNyAvKiBDUFUgKHVuc2lnbmVkKXYgZGVhZCAqLwotI2RlZmluZSBDUFVfRFlJTkcJCTB4MDAwOCAvKiBDUFUgKHVuc2lnbmVkKXYgbm90IHJ1bm5pbmcgYW55IHRhc2ssCi0JCQkJCSogbm90IGhhbmRsaW5nIGludGVycnVwdHMsIHNvb24gZGVhZC4KLQkJCQkJKiBDYWxsZWQgb24gdGhlIGR5aW5nIGNwdSwgaW50ZXJydXB0cwotCQkJCQkqIGFyZSBhbHJlYWR5IGRpc2FibGVkLiBNdXN0IG5vdAotCQkJCQkqIHNsZWVwLCBtdXN0IG5vdCBmYWlsICovCiAjZGVmaW5lIENQVV9QT1NUX0RFQUQJCTB4MDAwOSAvKiBDUFUgKHVuc2lnbmVkKXYgZGVhZCwgY3B1X2hvdHBsdWcKIAkJCQkJKiBsb2NrIGlzIGRyb3BwZWQgKi8KLSNkZWZpbmUgQ1BVX1NUQVJUSU5HCQkweDAwMEEgLyogQ1BVICh1bnNpZ25lZCl2IHNvb24gcnVubmluZy4KLQkJCQkJKiBDYWxsZWQgb24gdGhlIG5ldyBjcHUsIGp1c3QgYmVmb3JlCi0JCQkJCSogZW5hYmxpbmcgaW50ZXJydXB0cy4gTXVzdCBub3Qgc2xlZXAsCi0JCQkJCSogbXVzdCBub3QgZmFpbCAqLwotI2RlZmluZSBDUFVfRFlJTkdfSURMRQkJMHgwMDBCIC8qIENQVSAodW5zaWduZWQpdiBkeWluZywgcmVhY2hlZAotCQkJCQkqIGlkbGUgbG9vcC4gKi8KICNkZWZpbmUgQ1BVX0JST0tFTgkJMHgwMDBDIC8qIENQVSAodW5zaWduZWQpdiBkaWQgbm90IGRpZSBwcm9wZXJseSwKIAkJCQkJKiBwZXJoYXBzIGR1ZSB0byBwcmVlbXB0aW9uLiAqLwogI2RlZmluZSBDUFVfVEFTS1NfRlJPWkVOCTB4MDAxMApAQCAtMzAsNSArMTksMyBAQAogI2RlZmluZSBDUFVfRE9XTl9QUkVQQVJFX0ZST1pFTiAoQ1BVX0RPV05fUFJFUEFSRSB8IENQVV9UQVNLU19GUk9aRU4pCiAjZGVmaW5lIENQVV9ET1dOX0ZBSUxFRF9GUk9aRU4gIChDUFVfRE9XTl9GQUlMRUQgfCBDUFVfVEFTS1NfRlJPWkVOKQogI2RlZmluZSBDUFVfREVBRF9GUk9aRU4JCShDUFVfREVBRCB8IENQVV9UQVNLU19GUk9aRU4pCi0jZGVmaW5lIENQVV9EWUlOR19GUk9aRU4JKENQVV9EWUlORyB8IENQVV9UQVNLU19GUk9aRU4pCi0jZGVmaW5lIENQVV9TVEFSVElOR19GUk9aRU4JKENQVV9TVEFSVElORyB8IENQVV9UQVNLU19GUk9aRU4pCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbXVsdGlvcmRlci5jIGIvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL211bHRpb3JkZXIuYwppbmRleCAzOWQ5Yjk1Li4wNWQ3YmM0IDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbXVsdGlvcmRlci5jCisrKyBiL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9tdWx0aW9yZGVyLmMKQEAgLTEyNCw2ICsxMjQsOCBAQAogCXVuc2lnbmVkIGxvbmcgaTsKIAl1bnNpZ25lZCBsb25nIG1pbiA9IGluZGV4ICYgfigoMVVMIDw8IG9yZGVyKSAtIDEpOwogCXVuc2lnbmVkIGxvbmcgbWF4ID0gbWluICsgKDFVTCA8PCBvcmRlcik7CisJdm9pZCAqKnNsb3Q7CisJc3RydWN0IGl0ZW0gKml0ZW0yID0gaXRlbV9jcmVhdGUobWluKTsKIAlSQURJWF9UUkVFKHRyZWUsIEdGUF9LRVJORUwpOwogCiAJcHJpbnRmKCJNdWx0aW9yZGVyIGluZGV4ICVsZCwgb3JkZXIgJWRcbiIsIGluZGV4LCBvcmRlcik7CkBAIC0xMzksMTMgKzE0MSwxOSBAQAogCQlpdGVtX2NoZWNrX2Fic2VudCgmdHJlZSwgaSk7CiAJZm9yIChpID0gbWF4OyBpIDwgMiptYXg7IGkrKykKIAkJaXRlbV9jaGVja19hYnNlbnQoJnRyZWUsIGkpOworCWZvciAoaSA9IG1pbjsgaSA8IG1heDsgaSsrKQorCQlhc3NlcnQocmFkaXhfdHJlZV9pbnNlcnQoJnRyZWUsIGksIGl0ZW0yKSA9PSAtRUVYSVNUKTsKKworCXNsb3QgPSByYWRpeF90cmVlX2xvb2t1cF9zbG90KCZ0cmVlLCBpbmRleCk7CisJZnJlZSgqc2xvdCk7CisJcmFkaXhfdHJlZV9yZXBsYWNlX3Nsb3Qoc2xvdCwgaXRlbTIpOwogCWZvciAoaSA9IG1pbjsgaSA8IG1heDsgaSsrKSB7Ci0JCXN0YXRpYyB2b2lkICplbnRyeSA9ICh2b2lkICopCi0JCQkJCSgweEEwIHwgUkFESVhfVFJFRV9FWENFUFRJT05BTF9FTlRSWSk7Ci0JCWFzc2VydChyYWRpeF90cmVlX2luc2VydCgmdHJlZSwgaSwgZW50cnkpID09IC1FRVhJU1QpOworCQlzdHJ1Y3QgaXRlbSAqaXRlbSA9IGl0ZW1fbG9va3VwKCZ0cmVlLCBpKTsKKwkJYXNzZXJ0KGl0ZW0gIT0gMCk7CisJCWFzc2VydChpdGVtLT5pbmRleCA9PSBtaW4pOwogCX0KIAotCWFzc2VydChpdGVtX2RlbGV0ZSgmdHJlZSwgaW5kZXgpICE9IDApOworCWFzc2VydChpdGVtX2RlbGV0ZSgmdHJlZSwgbWluKSAhPSAwKTsKIAogCWZvciAoaSA9IDA7IGkgPCAyKm1heDsgaSsrKQogCQlpdGVtX2NoZWNrX2Fic2VudCgmdHJlZSwgaSk7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlCmluZGV4IGZmOWU1ZjIuLmY3NzBkYmEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlCkBAIC0xNSw2ICsxNSw3IEBACiBUQVJHRVRTICs9IG1vdW50CiBUQVJHRVRTICs9IG1xdWV1ZQogVEFSR0VUUyArPSBuZXQKK1RBUkdFVFMgKz0gbnNmcwogVEFSR0VUUyArPSBwb3dlcnBjCiBUQVJHRVRTICs9IHBzdG9yZQogVEFSR0VUUyArPSBwdHJhY2UKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25zZnMvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uc2ZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMDYwNTQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uc2ZzL01ha2VmaWxlCkBAIC0wLDAgKzEsMTIgQEAKK1RFU1RfUFJPR1MgOj0gb3duZXIgcGlkbnMKKworQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKKworYWxsOiBvd25lciBwaWRucworb3duZXI6IG93bmVyLmMKK3BpZG5zOiBwaWRucy5jCisKK2NsZWFuOgorCSQoUk0pIG93bmVyIHBpZG5zCisKK2luY2x1ZGUgLi4vbGliLm1rCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uc2ZzL293bmVyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uc2ZzL293bmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM3MjA1ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25zZnMvb3duZXIuYwpAQCAtMCwwICsxLDkxIEBACisjZGVmaW5lIF9HTlVfU09VUkNFCisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisKKyNkZWZpbmUgTlNJTyAgICAweGI3CisjZGVmaW5lIE5TX0dFVF9VU0VSTlMgICBfSU8oTlNJTywgMHgxKQorCisjZGVmaW5lIHByX2VycihmbXQsIC4uLikgXAorCQkoeyBcCisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOiIgZm10ICI6ICVtXG4iLCBcCisJCQkJX19mdW5jX18sIF9fTElORV9fLCAjI19fVkFfQVJHU19fKTsgXAorCQkJMTsgXAorCQl9KQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndnBbXSkKK3sKKwlpbnQgcGZkWzJdLCBucywgdW5zLCBpbml0X3VuczsKKwlzdHJ1Y3Qgc3RhdCBzdDEsIHN0MjsKKwljaGFyIHBhdGhbMTI4XTsKKwlwaWRfdCBwaWQ7CisJY2hhciBjOworCisJaWYgKHBpcGUocGZkKSkKKwkJcmV0dXJuIDE7CisKKwlwaWQgPSBmb3JrKCk7CisJaWYgKHBpZCA8IDApCisJCXJldHVybiBwcl9lcnIoImZvcmsiKTsKKwlpZiAocGlkID09IDApIHsKKwkJcHJjdGwoUFJfU0VUX1BERUFUSFNJRywgU0lHS0lMTCk7CisJCWlmICh1bnNoYXJlKENMT05FX05FV1VUUyB8IENMT05FX05FV1VTRVIpKQorCQkJcmV0dXJuIHByX2VycigidW5zaGFyZSIpOworCQljbG9zZShwZmRbMF0pOworCQljbG9zZShwZmRbMV0pOworCQl3aGlsZSAoMSkKKwkJCXNsZWVwKDEpOworCQlyZXR1cm4gMDsKKwl9CisJY2xvc2UocGZkWzFdKTsKKwlpZiAocmVhZChwZmRbMF0sICZjLCAxKSAhPSAwKQorCQlyZXR1cm4gcHJfZXJyKCJVbmFibGUgdG8gcmVhZCBmcm9tIHBpcGUiKTsKKwljbG9zZShwZmRbMF0pOworCisJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAiL3Byb2MvJWQvbnMvdXRzIiwgcGlkKTsKKwlucyA9IG9wZW4ocGF0aCwgT19SRE9OTFkpOworCWlmIChucyA8IDApCisJCXJldHVybiBwcl9lcnIoIlVuYWJsZSB0byBvcGVuICVzIiwgcGF0aCk7CisKKwl1bnMgPSBpb2N0bChucywgTlNfR0VUX1VTRVJOUyk7CisJaWYgKHVucyA8IDApCisJCXJldHVybiBwcl9lcnIoIlVuYWJsZSB0byBnZXQgYW4gb3duaW5nIHVzZXIgbmFtZXNwYWNlIik7CisKKwlpZiAoZnN0YXQodW5zLCAmc3QxKSkKKwkJcmV0dXJuIHByX2VycigiZnN0YXQiKTsKKworCXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIi9wcm9jLyVkL25zL3VzZXIiLCBwaWQpOworCWlmIChzdGF0KHBhdGgsICZzdDIpKQorCQlyZXR1cm4gcHJfZXJyKCJzdGF0Iik7CisKKwlpZiAoc3QxLnN0X2lubyAhPSBzdDIuc3RfaW5vKQorCQlyZXR1cm4gcHJfZXJyKCJOU19HRVRfVVNFUk5TIHJldHVybmVkIGEgd3JvbmcgbmFtZXNwYWNlIik7CisKKwlpbml0X3VucyA9IGlvY3RsKHVucywgTlNfR0VUX1VTRVJOUyk7CisJaWYgKHVucyA8IDApCisJCXJldHVybiBwcl9lcnIoIlVuYWJsZSB0byBnZXQgYW4gb3duaW5nIHVzZXIgbmFtZXNwYWNlIik7CisKKwlpZiAoaW9jdGwoaW5pdF91bnMsIE5TX0dFVF9VU0VSTlMpID49IDAgfHwgZXJybm8gIT0gRVBFUk0pCisJCXJldHVybiBwcl9lcnIoIkRvbid0IGdldCBFUEVSTSIpOworCisJaWYgKHVuc2hhcmUoQ0xPTkVfTkVXVVNFUikpCisJCXJldHVybiBwcl9lcnIoInVuc2hhcmUiKTsKKworCWlmIChpb2N0bChucywgTlNfR0VUX1VTRVJOUykgPj0gMCB8fCBlcnJubyAhPSBFUEVSTSkKKwkJcmV0dXJuIHByX2VycigiRG9uJ3QgZ2V0IEVQRVJNIik7CisJaWYgKGlvY3RsKGluaXRfdW5zLCBOU19HRVRfVVNFUk5TKSA+PSAwIHx8IGVycm5vICE9IEVQRVJNKQorCQlyZXR1cm4gcHJfZXJyKCJEb24ndCBnZXQgRVBFUk0iKTsKKworCWtpbGwocGlkLCBTSUdLSUxMKTsKKwl3YWl0KE5VTEwpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbnNmcy9waWRucy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbnNmcy9waWRucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlM2EwZDYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uc2ZzL3BpZG5zLmMKQEAgLTAsMCArMSw3OCBAQAorI2RlZmluZSBfR05VX1NPVVJDRQorI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorCisjZGVmaW5lIHByX2VycihmbXQsIC4uLikgXAorCQkoeyBcCisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOiIgZm10ICI6ICVtXG4iLCBcCisJCQkJX19mdW5jX18sIF9fTElORV9fLCAjI19fVkFfQVJHU19fKTsgXAorCQkJMTsgXAorCQl9KQorCisjZGVmaW5lIE5TSU8JMHhiNworI2RlZmluZSBOU19HRVRfVVNFUk5TICAgX0lPKE5TSU8sIDB4MSkKKyNkZWZpbmUgTlNfR0VUX1BBUkVOVCAgIF9JTyhOU0lPLCAweDIpCisKKyNkZWZpbmUgX19zdGFja19hbGlnbmVkX18JX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKQorc3RydWN0IGNyX2Nsb25lX2FyZyB7CisJY2hhciBzdGFja1sxMjhdIF9fc3RhY2tfYWxpZ25lZF9fOworCWNoYXIgc3RhY2tfcHRyWzBdOworfTsKKworc3RhdGljIGludCBjaGlsZCh2b2lkICphcmdzKQoreworCXByY3RsKFBSX1NFVF9QREVBVEhTSUcsIFNJR0tJTEwpOworCXdoaWxlICgxKQorCQlzbGVlcCgxKTsKKwlleGl0KDApOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWNoYXIgKm5zX3N0cnNbXSA9IHsicGlkIiwgInVzZXIifTsKKwljaGFyIHBhdGhbXSA9ICIvcHJvYy8wMTIzNDU2Nzg5L25zL3BpZCI7CisJc3RydWN0IGNyX2Nsb25lX2FyZyBjYTsKKwlzdHJ1Y3Qgc3RhdCBzdDEsIHN0MjsKKwlpbnQgbnMsIHBucywgaTsKKwlwaWRfdCBwaWQ7CisKKwlwaWQgPSBjbG9uZShjaGlsZCwgY2Euc3RhY2tfcHRyLCBDTE9ORV9ORVdVU0VSIHwgQ0xPTkVfTkVXUElEIHwgU0lHQ0hMRCwgTlVMTCk7CisJaWYgKHBpZCA8IDApCisJCXJldHVybiBwcl9lcnIoImNsb25lIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIi9wcm9jLyVkL25zLyVzIiwgcGlkLCBuc19zdHJzW2ldKTsKKwkJbnMgPSBvcGVuKHBhdGgsIE9fUkRPTkxZKTsKKwkJaWYgKG5zIDwgMCkKKwkJCXJldHVybiBwcl9lcnIoIlVuYWJsZSB0byBvcGVuICVzIiwgcGF0aCk7CisKKwkJcG5zID0gaW9jdGwobnMsIE5TX0dFVF9QQVJFTlQpOworCQlpZiAocG5zIDwgMCkKKwkJCXJldHVybiBwcl9lcnIoIlVuYWJsZSB0byBnZXQgYSBwYXJlbnQgcGlkbnMiKTsKKworCQlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICIvcHJvYy9zZWxmL25zLyVzIiwgbnNfc3Ryc1tpXSk7CisJCWlmIChzdGF0KHBhdGgsICZzdDIpKQorCQkJcmV0dXJuIHByX2VycigiVW5hYmxlIHRvIHN0YXQgJXMiLCBwYXRoKTsKKwkJaWYgKGZzdGF0KHBucywgJnN0MSkpCisJCQlyZXR1cm4gcHJfZXJyKCJVbmFibGUgdG8gc3RhdCB0aGUgcGFyZW50IHBpZG5zIik7CisJCWlmIChzdDEuc3RfaW5vICE9IHN0Mi5zdF9pbm8pCisJCQlyZXR1cm4gcHJfZXJyKCJOU19HRVRfUEFSRU5UIHJldHVybmVkIGEgd3JvbmcgbmFtZXNwYWNlIik7CisKKwkJaWYgKGlvY3RsKHBucywgTlNfR0VUX1BBUkVOVCkgPj0gMCB8fCBlcnJubyAhPSBFUEVSTSkKKwkJCXJldHVybiBwcl9lcnIoIkRvbid0IGdldCBFUEVSTSIpOzsKKwl9CisKKwlraWxsKHBpZCwgU0lHS0lMTCk7CisJd2FpdChOVUxMKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3g4Ni9wdHJhY2Vfc3lzY2FsbC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMveDg2L3B0cmFjZV9zeXNjYWxsLmMKaW5kZXggNDIxNDU2Ny4uYjAzN2NlOWMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3g4Ni9wdHJhY2Vfc3lzY2FsbC5jCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3g4Ni9wdHJhY2Vfc3lzY2FsbC5jCkBAIC0xNDcsNyArMTQ3LDcgQEAKIAlpZiAoYXJncy5uciAhPSBnZXRwaWQoKSB8fAogCSAgICBhcmdzLmFyZzAgIT0gMTAgfHwgYXJncy5hcmcxICE9IDExIHx8IGFyZ3MuYXJnMiAhPSAxMiB8fAogCSAgICBhcmdzLmFyZzMgIT0gMTMgfHwgYXJncy5hcmc0ICE9IDE0IHx8IGFyZ3MuYXJnNSAhPSAxNSkgewotCQlwcmludGYoIltGQUlMXVx0Z2V0cGlkKCkgZmFpbGVkIHRvIHByZXNldmUgcmVnc1xuIik7CisJCXByaW50ZigiW0ZBSUxdXHRnZXRwaWQoKSBmYWlsZWQgdG8gcHJlc2VydmUgcmVnc1xuIik7CiAJCW5lcnJzKys7CiAJfSBlbHNlIHsKIAkJcHJpbnRmKCJbT0tdXHRnZXRwaWQoKSBwcmVzZXJ2ZXMgcmVnc1xuIik7CkBAIC0xNjIsNyArMTYyLDcgQEAKIAlpZiAoYXJncy5uciAhPSAwIHx8CiAJICAgIGFyZ3MuYXJnMCAhPSBnZXRwaWQoKSB8fCBhcmdzLmFyZzEgIT0gU0lHVVNSMSB8fCBhcmdzLmFyZzIgIT0gMTIgfHwKIAkgICAgYXJncy5hcmczICE9IDEzIHx8IGFyZ3MuYXJnNCAhPSAxNCB8fCBhcmdzLmFyZzUgIT0gMTUpIHsKLQkJcHJpbnRmKCJbRkFJTF1cdGtpbGwoZ2V0cGlkKCksIFNJR1VTUjEpIGZhaWxlZCB0byBwcmVzZXZlIHJlZ3NcbiIpOworCQlwcmludGYoIltGQUlMXVx0a2lsbChnZXRwaWQoKSwgU0lHVVNSMSkgZmFpbGVkIHRvIHByZXNlcnZlIHJlZ3NcbiIpOwogCQluZXJycysrOwogCX0gZWxzZSB7CiAJCXByaW50ZigiW09LXVx0a2lsbChnZXRwaWQoKSwgU0lHVVNSMSkgcHJlc2VydmVzIHJlZ3NcbiIpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMveDg2L3NpZ3JldHVybi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMveDg2L3NpZ3JldHVybi5jCmluZGV4IDhhNTc3ZTcuLjI0NjE0NWIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3g4Ni9zaWdyZXR1cm4uYworKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy94ODYvc2lncmV0dXJuLmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogICAgICAiLnR5cGUgaW50MywgQGZ1bmN0aW9uXG5cdCIKICAgICAgIi5hbGlnbiA0MDk2XG5cdCIKICAgICAgImludDM6XG5cdCIKLSAgICAgIm1vdiAlc3MsJWVheFxuXHQiCisgICAgICJtb3YgJXNzLCVlY3hcblx0IgogICAgICAiaW50M1xuXHQiCiAgICAgICIuc2l6ZSBpbnQzLCAuIC0gaW50M1xuXHQiCiAgICAgICIuYWxpZ24gNDA5NiwgMHhjY1xuXHQiCkBAIC0zMDYsNyArMzA2LDcgQEAKICNpZmRlZiBfX3g4Nl82NF9fCiAjIGRlZmluZSBSRUdfSVAgUkVHX1JJUAogIyBkZWZpbmUgUkVHX1NQIFJFR19SU1AKLSMgZGVmaW5lIFJFR19BWCBSRUdfUkFYCisjIGRlZmluZSBSRUdfQ1ggUkVHX1JDWAogCiBzdHJ1Y3Qgc2VsZWN0b3JzIHsKIAl1bnNpZ25lZCBzaG9ydCBjcywgZ3MsIGZzLCBzczsKQEAgLTMyNiw3ICszMjYsNyBAQAogI2Vsc2UKICMgZGVmaW5lIFJFR19JUCBSRUdfRUlQCiAjIGRlZmluZSBSRUdfU1AgUkVHX0VTUAotIyBkZWZpbmUgUkVHX0FYIFJFR19FQVgKKyMgZGVmaW5lIFJFR19DWCBSRUdfRUNYCiAKIHN0YXRpYyBncmVnX3QgKnNzcHRyKHVjb250ZXh0X3QgKmN0eCkKIHsKQEAgLTQ1NywxMCArNDU3LDEwIEBACiAJY3R4LT51Y19tY29udGV4dC5ncmVnc1tSRUdfSVBdID0KIAkJc2lnX2NzID09IGNvZGUxNl9zZWwgPyAwIDogKHVuc2lnbmVkIGxvbmcpJmludDM7CiAJY3R4LT51Y19tY29udGV4dC5ncmVnc1tSRUdfU1BdID0gKHVuc2lnbmVkIGxvbmcpMHg4YmFkZjAwZDVhYWRjMGRlVUxMOwotCWN0eC0+dWNfbWNvbnRleHQuZ3JlZ3NbUkVHX0FYXSA9IDA7CisJY3R4LT51Y19tY29udGV4dC5ncmVnc1tSRUdfQ1hdID0gMDsKIAogCW1lbWNweSgmcmVxdWVzdGVkX3JlZ3MsICZjdHgtPnVjX21jb250ZXh0LmdyZWdzLCBzaXplb2YoZ3JlZ3NldF90KSk7Ci0JcmVxdWVzdGVkX3JlZ3NbUkVHX0FYXSA9ICpzc3B0cihjdHgpOwkvKiBUaGUgYXNtIGNvZGUgZG9lcyB0aGlzLiAqLworCXJlcXVlc3RlZF9yZWdzW1JFR19DWF0gPSAqc3NwdHIoY3R4KTsJLyogVGhlIGFzbSBjb2RlIGRvZXMgdGhpcy4gKi8KIAogCXJldHVybjsKIH0KQEAgLTQ4Miw3ICs0ODIsNyBAQAogCXVuc2lnbmVkIHNob3J0IHNzOwogCWFzbSAoIm1vdiAlJXNzLCUwIiA6ICI9ciIgKHNzKSk7CiAKLQlncmVnX3QgYXNtX3NzID0gY3R4LT51Y19tY29udGV4dC5ncmVnc1tSRUdfQVhdOworCWdyZWdfdCBhc21fc3MgPSBjdHgtPnVjX21jb250ZXh0LmdyZWdzW1JFR19DWF07CiAJaWYgKGFzbV9zcyAhPSBzaWdfc3MgJiYgc2lnID09IFNJR1RSQVApIHsKIAkJLyogU2FuaXR5IGNoZWNrIGZhaWx1cmUuICovCiAJCXByaW50ZigiW0ZBSUxdXHRTSUdUUkFQOiBzcyA9ICVoeCwgZnJhbWUgc3MgPSAlaHgsIGF4ID0gJWxseFxuIiwKQEAgLTY1NCw4ICs2NTQsOCBAQAogI2VuZGlmCiAKIAkJLyogU2FuaXR5IGNoZWNrIG9uIHRoZSBrZXJuZWwgKi8KLQkJaWYgKGkgPT0gUkVHX0FYICYmIHJlcXVlc3RlZF9yZWdzW2ldICE9IHJlc3VsdGluZ19yZWdzW2ldKSB7Ci0JCQlwcmludGYoIltGQUlMXVx0QVggKHNhdmVkIFNQKSBtaXNtYXRjaDogcmVxdWVzdGVkIDB4JWxseDsgZ290IDB4JWxseFxuIiwKKwkJaWYgKGkgPT0gUkVHX0NYICYmIHJlcXVlc3RlZF9yZWdzW2ldICE9IHJlc3VsdGluZ19yZWdzW2ldKSB7CisJCQlwcmludGYoIltGQUlMXVx0Q1ggKHNhdmVkIFNQKSBtaXNtYXRjaDogcmVxdWVzdGVkIDB4JWxseDsgZ290IDB4JWxseFxuIiwKIAkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXJlcXVlc3RlZF9yZWdzW2ldLAogCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcmVzdWx0aW5nX3JlZ3NbaV0pOwogCQkJbmVycnMrKzsKZGlmZiAtLWdpdCBhL3Rvb2xzL3ZpcnRpby9saW51eC9kbWEtbWFwcGluZy5oIGIvdG9vbHMvdmlydGlvL2xpbnV4L2RtYS1tYXBwaW5nLmgKaW5kZXggNGY5M2FmOC4uMTg2MDFmNiAxMDA2NDQKLS0tIGEvdG9vbHMvdmlydGlvL2xpbnV4L2RtYS1tYXBwaW5nLmgKKysrIGIvdG9vbHMvdmlydGlvL2xpbnV4L2RtYS1tYXBwaW5nLmgKQEAgLTE0LDQgKzE0LDIwIEBACiAJRE1BX05PTkUgPSAzLAogfTsKIAorI2RlZmluZSBkbWFfYWxsb2NfY29oZXJlbnQoZCwgcywgaHAsIGYpICh7IFwKKwl2b2lkICpfX2RtYV9hbGxvY19jb2hlcmVudF9wID0ga21hbGxvYygocyksIChmKSk7IFwKKwkqKGhwKSA9ICh1bnNpZ25lZCBsb25nKV9fZG1hX2FsbG9jX2NvaGVyZW50X3A7IFwKKwlfX2RtYV9hbGxvY19jb2hlcmVudF9wOyBcCit9KQorCisjZGVmaW5lIGRtYV9mcmVlX2NvaGVyZW50KGQsIHMsIHAsIGgpIGtmcmVlKHApCisKKyNkZWZpbmUgZG1hX21hcF9wYWdlKGQsIHAsIG8sIHMsIGRpcikgKHBhZ2VfdG9fcGh5cyhwKSArIChvKSkKKworI2RlZmluZSBkbWFfbWFwX3NpbmdsZShkLCBwLCBzLCBkaXIpICh2aXJ0X3RvX3BoeXMocCkpCisjZGVmaW5lIGRtYV9tYXBwaW5nX2Vycm9yKC4uLikgKDApCisKKyNkZWZpbmUgZG1hX3VubWFwX3NpbmdsZSguLi4pIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZG1hX3VubWFwX3BhZ2UoLi4uKSBkbyB7IH0gd2hpbGUgKDApCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvdmlydGlvL2xpbnV4L2tlcm5lbC5oIGIvdG9vbHMvdmlydGlvL2xpbnV4L2tlcm5lbC5oCmluZGV4IDAzMzg0OTkuLmQ5NTU0ZmMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3ZpcnRpby9saW51eC9rZXJuZWwuaAorKysgYi90b29scy92aXJ0aW8vbGludXgva2VybmVsLmgKQEAgLTIwLDcgKzIwLDkgQEAKIAogI2RlZmluZSBQQUdFX1NJWkUgZ2V0cGFnZXNpemUoKQogI2RlZmluZSBQQUdFX01BU0sgKH4oUEFHRV9TSVpFLTEpKQorI2RlZmluZSBQQUdFX0FMSUdOKHgpICgoeCArIFBBR0VfU0laRSAtIDEpICYgUEFHRV9NQVNLKQogCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBwaHlzX2FkZHJfdDsKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGRtYV9hZGRyX3Q7CiB0eXBlZGVmIHNpemVfdCBfX2tlcm5lbF9zaXplX3Q7CiB0eXBlZGVmIHVuc2lnbmVkIGludCBfX3dzdW07CkBAIC01Nyw2ICs1OSwxMSBAQAogCXJldHVybiBwOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgKmFsbG9jX3BhZ2VzX2V4YWN0KHNpemVfdCBzLCBnZnBfdCBnZnApCit7CisJcmV0dXJuIGttYWxsb2MocywgZ2ZwKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGtmcmVlKHZvaWQgKnApCiB7CiAJaWYgKHAgPj0gX19rZnJlZV9pZ25vcmVfc3RhcnQgJiYgcCA8IF9fa2ZyZWVfaWdub3JlX2VuZCkKQEAgLTY0LDYgKzcxLDExIEBACiAJZnJlZShwKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGZyZWVfcGFnZXNfZXhhY3Qodm9pZCAqcCwgc2l6ZV90IHMpCit7CisJa2ZyZWUocCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCAqa3JlYWxsb2Modm9pZCAqcCwgc2l6ZV90IHMsIGdmcF90IGdmcCkKIHsKIAlyZXR1cm4gcmVhbGxvYyhwLCBzKTsKQEAgLTEwNSw2ICsxMTcsOCBAQAogI2RlZmluZSBkZXZfZXJyKGRldiwgZm9ybWF0LCAuLi4pIGZwcmludGYgKHN0ZGVyciwgZm9ybWF0LCAjIyBfX1ZBX0FSR1NfXykKICNkZWZpbmUgZGV2X3dhcm4oZGV2LCBmb3JtYXQsIC4uLikgZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsICMjIF9fVkFfQVJHU19fKQogCisjZGVmaW5lIFdBUk5fT05fT05DRShjb25kKSAoKGNvbmQpICYmIGZwcmludGYgKHN0ZGVyciwgIldBUk5JTkdcbiIpKQorCiAjZGVmaW5lIG1pbih4LCB5KSAoewkJCQlcCiAJdHlwZW9mKHgpIF9taW4xID0gKHgpOwkJCVwKIAl0eXBlb2YoeSkgX21pbjIgPSAoeSk7CQkJXApkaWZmIC0tZ2l0IGEvdG9vbHMvdmlydGlvL2xpbnV4L3NsYWIuaCBiL3Rvb2xzL3ZpcnRpby9saW51eC9zbGFiLmgKaW5kZXggODFiYWVhYy4uN2UxYzExOSAxMDA2NDQKLS0tIGEvdG9vbHMvdmlydGlvL2xpbnV4L3NsYWIuaAorKysgYi90b29scy92aXJ0aW8vbGludXgvc2xhYi5oCkBAIC0xLDIgKzEsNiBAQAogI2lmbmRlZiBMSU5VWF9TTEFCX0gKKyNkZWZpbmUgR0ZQX0tFUk5FTCAwCisjZGVmaW5lIEdGUF9BVE9NSUMgMAorI2RlZmluZSBfX0dGUF9OT1dBUk4gMAorI2RlZmluZSBfX0dGUF9aRVJPIDAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvdmlydGlvL2xpbnV4L3ZpcnRpby5oIGIvdG9vbHMvdmlydGlvL2xpbnV4L3ZpcnRpby5oCmluZGV4IGVlMTI1ZTcuLjkzNzdjOGIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3ZpcnRpby9saW51eC92aXJ0aW8uaAorKysgYi90b29scy92aXJ0aW8vbGludXgvdmlydGlvLmgKQEAgLTMsOCArMywxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAKK3N0cnVjdCBkZXZpY2UgeworCXZvaWQgKnBhcmVudDsKK307CisKIHN0cnVjdCB2aXJ0aW9fZGV2aWNlIHsKLQl2b2lkICpkZXY7CisJc3RydWN0IGRldmljZSBkZXY7CiAJdTY0IGZlYXR1cmVzOwogfTsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvdmlydGlvL2xpbnV4L3ZpcnRpb19jb25maWcuaCBiL3Rvb2xzL3ZpcnRpby9saW51eC92aXJ0aW9fY29uZmlnLmgKaW5kZXggNTdhNjk2NC4uOWJhMTE4MSAxMDA2NDQKLS0tIGEvdG9vbHMvdmlydGlvL2xpbnV4L3ZpcnRpb19jb25maWcuaAorKysgYi90b29scy92aXJ0aW8vbGludXgvdmlydGlvX2NvbmZpZy5oCkBAIC00MCw2ICs0MCwxOSBAQAogI2RlZmluZSB2aXJ0aW9faGFzX2ZlYXR1cmUoZGV2LCBmZWF0dXJlKSBcCiAJKF9fdmlydGlvX3Rlc3RfYml0KChkZXYpLCBmZWF0dXJlKSkKIAorLyoqCisgKiB2aXJ0aW9faGFzX2lvbW11X3F1aXJrIC0gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBkZXZpY2UgaGFzIHRoZSBpb21tdSBxdWlyaworICogQHZkZXY6IHRoZSBkZXZpY2UKKyAqLworc3RhdGljIGlubGluZSBib29sIHZpcnRpb19oYXNfaW9tbXVfcXVpcmsoY29uc3Qgc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYpCit7CisJLyoKKwkgKiBOb3RlIHRoZSByZXZlcnNlIHBvbGFyaXR5IG9mIHRoZSBxdWlyayBmZWF0dXJlIChjb21wYXJlZCB0byBtb3N0CisJICogb3RoZXIgZmVhdHVyZXMpLCB0aGlzIGlzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbGVnYWN5IHN5c3RlbXMuCisJICovCisJcmV0dXJuICF2aXJ0aW9faGFzX2ZlYXR1cmUodmRldiwgVklSVElPX0ZfSU9NTVVfUExBVEZPUk0pOworfQorCiBzdGF0aWMgaW5saW5lIGJvb2wgdmlydGlvX2lzX2xpdHRsZV9lbmRpYW4oc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYpCiB7CiAJcmV0dXJuIHZpcnRpb19oYXNfZmVhdHVyZSh2ZGV2LCBWSVJUSU9fRl9WRVJTSU9OXzEpIHx8CmRpZmYgLS1naXQgYS90b29scy92aXJ0aW8vcmluZ3Rlc3QvcHRyX3JpbmcuYyBiL3Rvb2xzL3ZpcnRpby9yaW5ndGVzdC9wdHJfcmluZy5jCmluZGV4IDY4ZTRmOWYuLmJkMmFkMWQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3ZpcnRpby9yaW5ndGVzdC9wdHJfcmluZy5jCisrKyBiL3Rvb2xzL3ZpcnRpby9yaW5ndGVzdC9wdHJfcmluZy5jCkBAIC0xMyw2ICsxMyw3IEBACiAjZGVmaW5lIGNhY2hlX2xpbmVfc2l6ZSgpIFNNUF9DQUNIRV9CWVRFUwogI2RlZmluZSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wIF9fYXR0cmlidXRlX18gKChhbGlnbmVkIChTTVBfQ0FDSEVfQllURVMpKSkKICNkZWZpbmUgdW5saWtlbHkoeCkgICAgKF9fYnVpbHRpbl9leHBlY3QoISEoeCksIDApKQorI2RlZmluZSBsaWtlbHkoeCkgICAgKF9fYnVpbHRpbl9leHBlY3QoISEoeCksIDEpKQogI2RlZmluZSBBTElHTih4LCBhKSAoKCh4KSArIChhKSAtIDEpIC8gKGEpICogKGEpKQogdHlwZWRlZiBwdGhyZWFkX3NwaW5sb2NrX3QgIHNwaW5sb2NrX3Q7CiAKZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2FybS9hYXJjaDMyLmMgYi92aXJ0L2t2bS9hcm0vYWFyY2gzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOGFmNGIKLS0tIC9kZXYvbnVsbAorKysgYi92aXJ0L2t2bS9hcm0vYWFyY2gzMi5jCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogKG5vdCBtdWNoIG9mIGFuKSBFbXVsYXRpb24gbGF5ZXIgZm9yIDMyYml0IGd1ZXN0cy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIsMjAxMyAtIEFSTSBMdGQKKyAqIEF1dGhvcjogTWFyYyBaeW5naWVyIDxtYXJjLnp5bmdpZXJAYXJtLmNvbT4KKyAqCisgKiBiYXNlZCBvbiBhcmNoL2FybS9rdm0vZW11bGF0ZS5jCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgLSBWaXJ0dWFsIE9wZW4gU3lzdGVtcyBhbmQgQ29sdW1iaWEgVW5pdmVyc2l0eQorICogQXV0aG9yOiBDaHJpc3RvZmZlciBEYWxsIDxjLmRhbGxAdmlydHVhbG9wZW5zeXN0ZW1zLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgorI2luY2x1ZGUgPGFzbS9rdm1fZW11bGF0ZS5oPgorI2luY2x1ZGUgPGFzbS9rdm1faHlwLmg+CisKKyNpZm5kZWYgQ09ORklHX0FSTTY0CisjZGVmaW5lIENPTVBBVF9QU1JfVF9CSVQJUFNSX1RfQklUCisjZGVmaW5lIENPTVBBVF9QU1JfSVRfTUFTSwlQU1JfSVRfTUFTSworI2VuZGlmCisKKy8qCisgKiBzdG9sZW4gZnJvbSBhcmNoL2FybS9rZXJuZWwvb3Bjb2Rlcy5jCisgKgorICogY29uZGl0aW9uIGNvZGUgbG9va3VwIHRhYmxlCisgKiBpbmRleCBpbnRvIHRoZSB0YWJsZSBpcyB0ZXN0IGNvZGU6IEVRLCBORSwgLi4uIExULCBHVCwgQUwsIE5WCisgKgorICogYml0IHBvc2l0aW9uIGluIHNob3J0IGlzIGNvbmRpdGlvbiBjb2RlOiBOWkNWCisgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBjY19tYXBbMTZdID0geworCTB4RjBGMCwJCQkvKiBFUSA9PSBaIHNldCAgICAgICAgICAgICovCisJMHgwRjBGLAkJCS8qIE5FICAgICAgICAgICAgICAgICAgICAgKi8KKwkweENDQ0MsCQkJLyogQ1MgPT0gQyBzZXQgICAgICAgICAgICAqLworCTB4MzMzMywJCQkvKiBDQyAgICAgICAgICAgICAgICAgICAgICovCisJMHhGRjAwLAkJCS8qIE1JID09IE4gc2V0ICAgICAgICAgICAgKi8KKwkweDAwRkYsCQkJLyogUEwgICAgICAgICAgICAgICAgICAgICAqLworCTB4QUFBQSwJCQkvKiBWUyA9PSBWIHNldCAgICAgICAgICAgICovCisJMHg1NTU1LAkJCS8qIFZDICAgICAgICAgICAgICAgICAgICAgKi8KKwkweDBDMEMsCQkJLyogSEkgPT0gQyBzZXQgJiYgWiBjbGVhciAqLworCTB4RjNGMywJCQkvKiBMUyA9PSBDIGNsZWFyIHx8IFogc2V0ICovCisJMHhBQTU1LAkJCS8qIEdFID09IChOPT1WKSAgICAgICAgICAgKi8KKwkweDU1QUEsCQkJLyogTFQgPT0gKE4hPVYpICAgICAgICAgICAqLworCTB4MEEwNSwJCQkvKiBHVCA9PSAoIVogJiYgKE49PVYpKSAgICovCisJMHhGNUZBLAkJCS8qIExFID09IChaIHx8IChOIT1WKSkgICAgKi8KKwkweEZGRkYsCQkJLyogQUwgYWx3YXlzICAgICAgICAgICAgICAqLworCTAJCQkvKiBOViAgICAgICAgICAgICAgICAgICAgICovCit9OworCisvKgorICogQ2hlY2sgaWYgYSB0cmFwcGVkIGluc3RydWN0aW9uIHNob3VsZCBoYXZlIGJlZW4gZXhlY3V0ZWQgb3Igbm90LgorICovCitib29sIGt2bV9jb25kaXRpb25fdmFsaWQzMihjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJdW5zaWduZWQgbG9uZyBjcHNyOworCXUzMiBjcHNyX2NvbmQ7CisJaW50IGNvbmQ7CisKKwkvKiBUb3AgdHdvIGJpdHMgbm9uLXplcm8/ICBVbmNvbmRpdGlvbmFsLiAqLworCWlmIChrdm1fdmNwdV9nZXRfaHNyKHZjcHUpID4+IDMwKQorCQlyZXR1cm4gdHJ1ZTsKKworCS8qIElzIGNvbmRpdGlvbiBmaWVsZCB2YWxpZD8gKi8KKwljb25kID0ga3ZtX3ZjcHVfZ2V0X2NvbmRpdGlvbih2Y3B1KTsKKwlpZiAoY29uZCA9PSAweEUpCisJCXJldHVybiB0cnVlOworCisJY3BzciA9ICp2Y3B1X2Nwc3IodmNwdSk7CisKKwlpZiAoY29uZCA8IDApIHsKKwkJLyogVGhpcyBjYW4gaGFwcGVuIGluIFRodW1iIG1vZGU6IGV4YW1pbmUgSVQgc3RhdGUuICovCisJCXVuc2lnbmVkIGxvbmcgaXQ7CisKKwkJaXQgPSAoKGNwc3IgPj4gOCkgJiAweEZDKSB8ICgoY3BzciA+PiAyNSkgJiAweDMpOworCisJCS8qIGl0ID09IDAgPT4gdW5jb25kaXRpb25hbC4gKi8KKwkJaWYgKGl0ID09IDApCisJCQlyZXR1cm4gdHJ1ZTsKKworCQkvKiBUaGUgY29uZCBmb3IgdGhpcyBpbnNuIHdvcmtzIG91dCBhcyB0aGUgdG9wIDQgYml0cy4gKi8KKwkJY29uZCA9IChpdCA+PiA0KTsKKwl9CisKKwljcHNyX2NvbmQgPSBjcHNyID4+IDI4OworCisJaWYgKCEoKGNjX21hcFtjb25kXSA+PiBjcHNyX2NvbmQpICYgMSkpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCisvKioKKyAqIGFkanVzdF9pdHN0YXRlIC0gYWRqdXN0IElUU1RBVEUgd2hlbiBlbXVsYXRpbmcgaW5zdHJ1Y3Rpb25zIGluIElULWJsb2NrCisgKiBAdmNwdToJVGhlIFZDUFUgcG9pbnRlcgorICoKKyAqIFdoZW4gZXhjZXB0aW9ucyBvY2N1ciB3aGlsZSBpbnN0cnVjdGlvbnMgYXJlIGV4ZWN1dGVkIGluIFRodW1iIElGLVRIRU4KKyAqIGJsb2NrcywgdGhlIElUU1RBVEUgZmllbGQgb2YgdGhlIENQU1IgaXMgbm90IGFkdmFuY2VkICh1cGRhdGVkKSwgc28gd2UgaGF2ZQorICogdG8gZG8gdGhpcyBsaXR0bGUgYml0IG9mIHdvcmsgbWFudWFsbHkuIFRoZSBmaWVsZHMgbWFwIGxpa2UgdGhpczoKKyAqCisgKiBJVFs3OjBdIC0+IENQU1JbMjY6MjVdLENQU1JbMTU6MTBdCisgKi8KK3N0YXRpYyB2b2lkIF9faHlwX3RleHQga3ZtX2FkanVzdF9pdHN0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGl0Yml0cywgY29uZDsKKwl1bnNpZ25lZCBsb25nIGNwc3IgPSAqdmNwdV9jcHNyKHZjcHUpOworCWJvb2wgaXNfYXJtID0gIShjcHNyICYgQ09NUEFUX1BTUl9UX0JJVCk7CisKKwlpZiAoaXNfYXJtIHx8ICEoY3BzciAmIENPTVBBVF9QU1JfSVRfTUFTSykpCisJCXJldHVybjsKKworCWNvbmQgPSAoY3BzciAmIDB4ZTAwMCkgPj4gMTM7CisJaXRiaXRzID0gKGNwc3IgJiAweDFjMDApID4+ICgxMCAtIDIpOworCWl0Yml0cyB8PSAoY3BzciAmICgweDMgPDwgMjUpKSA+PiAyNTsKKworCS8qIFBlcmZvcm0gSVRBZHZhbmNlIChzZWUgcGFnZSBBMi01MiBpbiBBUk0gRERJIDA0MDZDKSAqLworCWlmICgoaXRiaXRzICYgMHg3KSA9PSAwKQorCQlpdGJpdHMgPSBjb25kID0gMDsKKwllbHNlCisJCWl0Yml0cyA9IChpdGJpdHMgPDwgMSkgJiAweDFmOworCisJY3BzciAmPSB+Q09NUEFUX1BTUl9JVF9NQVNLOworCWNwc3IgfD0gY29uZCA8PCAxMzsKKwljcHNyIHw9IChpdGJpdHMgJiAweDFjKSA8PCAoMTAgLSAyKTsKKwljcHNyIHw9IChpdGJpdHMgJiAweDMpIDw8IDI1OworCSp2Y3B1X2Nwc3IodmNwdSkgPSBjcHNyOworfQorCisvKioKKyAqIGt2bV9za2lwX2luc3RyIC0gc2tpcCBhIHRyYXBwZWQgaW5zdHJ1Y3Rpb24gYW5kIHByb2NlZWQgdG8gdGhlIG5leHQKKyAqIEB2Y3B1OiBUaGUgdmNwdSBwb2ludGVyCisgKi8KK3ZvaWQgX19oeXBfdGV4dCBrdm1fc2tpcF9pbnN0cjMyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgYm9vbCBpc193aWRlX2luc3RyKQoreworCWJvb2wgaXNfdGh1bWI7CisKKwlpc190aHVtYiA9ICEhKCp2Y3B1X2Nwc3IodmNwdSkgJiBDT01QQVRfUFNSX1RfQklUKTsKKwlpZiAoaXNfdGh1bWIgJiYgIWlzX3dpZGVfaW5zdHIpCisJCSp2Y3B1X3BjKHZjcHUpICs9IDI7CisJZWxzZQorCQkqdmNwdV9wYyh2Y3B1KSArPSA0OworCWt2bV9hZGp1c3RfaXRzdGF0ZSh2Y3B1KTsKK30KZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2FybS9hcmNoX3RpbWVyLmMgYi92aXJ0L2t2bS9hcm0vYXJjaF90aW1lci5jCmluZGV4IDRmZGU4YzcuLjI3YTFmNjMgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2FybS9hcmNoX3RpbWVyLmMKKysrIGIvdmlydC9rdm0vYXJtL2FyY2hfdGltZXIuYwpAQCAtMzEsOCArMzEsOCBAQAogI2luY2x1ZGUgInRyYWNlLmgiCiAKIHN0YXRpYyBzdHJ1Y3QgdGltZWNvdW50ZXIgKnRpbWVjb3VudGVyOwotc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cXVldWU7CiBzdGF0aWMgdW5zaWduZWQgaW50IGhvc3RfdnRpbWVyX2lycTsKK3N0YXRpYyB1MzIgaG9zdF92dGltZXJfaXJxX2ZsYWdzOwogCiB2b2lkIGt2bV90aW1lcl92Y3B1X3B1dChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CkBAIC0xNDAsNyArMTQwLDcgQEAKIAkJcmV0dXJuIEhSVElNRVJfUkVTVEFSVDsKIAl9CiAKLQlxdWV1ZV93b3JrKHdxdWV1ZSwgJnRpbWVyLT5leHBpcmVkKTsKKwlzY2hlZHVsZV93b3JrKCZ0aW1lci0+ZXhwaXJlZCk7CiAJcmV0dXJuIEhSVElNRVJfTk9SRVNUQVJUOwogfQogCkBAIC0zNjUsNyArMzY1LDcgQEAKIAogc3RhdGljIHZvaWQga3ZtX3RpbWVyX2luaXRfaW50ZXJydXB0KHZvaWQgKmluZm8pCiB7Ci0JZW5hYmxlX3BlcmNwdV9pcnEoaG9zdF92dGltZXJfaXJxLCAwKTsKKwllbmFibGVfcGVyY3B1X2lycShob3N0X3Z0aW1lcl9pcnEsIGhvc3RfdnRpbWVyX2lycV9mbGFncyk7CiB9CiAKIGludCBrdm1fYXJtX3RpbWVyX3NldF9yZWcoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgcmVnaWQsIHU2NCB2YWx1ZSkKQEAgLTQzMiwxOCArNDMyLDIwIEBACiAJfQogCWhvc3RfdnRpbWVyX2lycSA9IGluZm8tPnZpcnR1YWxfaXJxOwogCisJaG9zdF92dGltZXJfaXJxX2ZsYWdzID0gaXJxX2dldF90cmlnZ2VyX3R5cGUoaG9zdF92dGltZXJfaXJxKTsKKwlpZiAoaG9zdF92dGltZXJfaXJxX2ZsYWdzICE9IElSUUZfVFJJR0dFUl9ISUdIICYmCisJICAgIGhvc3RfdnRpbWVyX2lycV9mbGFncyAhPSBJUlFGX1RSSUdHRVJfTE9XKSB7CisJCWt2bV9lcnIoIkludmFsaWQgdHJpZ2dlciBmb3IgSVJRJWQsIGFzc3VtaW5nIGxldmVsIGxvd1xuIiwKKwkJCWhvc3RfdnRpbWVyX2lycSk7CisJCWhvc3RfdnRpbWVyX2lycV9mbGFncyA9IElSUUZfVFJJR0dFUl9MT1c7CisJfQorCiAJZXJyID0gcmVxdWVzdF9wZXJjcHVfaXJxKGhvc3RfdnRpbWVyX2lycSwga3ZtX2FyY2hfdGltZXJfaGFuZGxlciwKIAkJCQkgImt2bSBndWVzdCB0aW1lciIsIGt2bV9nZXRfcnVubmluZ192Y3B1cygpKTsKIAlpZiAoZXJyKSB7CiAJCWt2bV9lcnIoImt2bV9hcmNoX3RpbWVyOiBjYW4ndCByZXF1ZXN0IGludGVycnVwdCAlZCAoJWQpXG4iLAogCQkJaG9zdF92dGltZXJfaXJxLCBlcnIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQl3cXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgia3ZtX2FyY2hfdGltZXIiKTsKLQlpZiAoIXdxdWV1ZSkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIG91dF9mcmVlOworCQlyZXR1cm4gZXJyOwogCX0KIAogCWt2bV9pbmZvKCJ2aXJ0dWFsIHRpbWVyIElSUSVkXG4iLCBob3N0X3Z0aW1lcl9pcnEpOwpAQCAtNDUxLDEwICs0NTMsNiBAQAogCWNwdWhwX3NldHVwX3N0YXRlKENQVUhQX0FQX0tWTV9BUk1fVElNRVJfU1RBUlRJTkcsCiAJCQkgICJBUF9LVk1fQVJNX1RJTUVSX1NUQVJUSU5HIiwga3ZtX3RpbWVyX3N0YXJ0aW5nX2NwdSwKIAkJCSAga3ZtX3RpbWVyX2R5aW5nX2NwdSk7Ci0JZ290byBvdXQ7Ci1vdXRfZnJlZToKLQlmcmVlX3BlcmNwdV9pcnEoaG9zdF92dGltZXJfaXJxLCBrdm1fZ2V0X3J1bm5pbmdfdmNwdXMoKSk7Ci1vdXQ6CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNTA5LDcgKzUwNyw3IEBACiAJICogVkNQVXMgaGF2ZSB0aGUgZW5hYmxlZCB2YXJpYWJsZSBzZXQsIGJlZm9yZSBlbnRlcmluZyB0aGUgZ3Vlc3QsIGlmCiAJICogdGhlIGFyY2ggdGltZXJzIGFyZSBlbmFibGVkLgogCSAqLwotCWlmICh0aW1lY291bnRlciAmJiB3cXVldWUpCisJaWYgKHRpbWVjb3VudGVyKQogCQl0aW1lci0+ZW5hYmxlZCA9IDE7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2FybS9oeXAvdmdpYy12Mi1zci5jIGIvdmlydC9rdm0vYXJtL2h5cC92Z2ljLXYyLXNyLmMKaW5kZXggN2NmZmQ5My4uYzhhZWI3YiAxMDA2NDQKLS0tIGEvdmlydC9rdm0vYXJtL2h5cC92Z2ljLXYyLXNyLmMKKysrIGIvdmlydC9rdm0vYXJtL2h5cC92Z2ljLXYyLXNyLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnFjaGlwL2FybS1naWMuaD4KICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgogCisjaW5jbHVkZSA8YXNtL2t2bV9lbXVsYXRlLmg+CiAjaW5jbHVkZSA8YXNtL2t2bV9oeXAuaD4KIAogc3RhdGljIHZvaWQgX19oeXBfdGV4dCBzYXZlX21haW50X2ludF9zdGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCkBAIC0xNjcsMyArMTY4LDU5IEBACiAJd3JpdGVsX3JlbGF4ZWQoY3B1X2lmLT52Z2ljX3ZtY3IsIGJhc2UgKyBHSUNIX1ZNQ1IpOwogCXZjcHUtPmFyY2gudmdpY19jcHUubGl2ZV9scnMgPSBsaXZlX2xyczsKIH0KKworI2lmZGVmIENPTkZJR19BUk02NAorLyoKKyAqIF9fdmdpY192Ml9wZXJmb3JtX2NwdWlmX2FjY2VzcyAtLSBwZXJmb3JtIGEgR0lDViBhY2Nlc3Mgb24gYmVoYWxmIG9mIHRoZQorICoJCQkJICAgICBndWVzdC4KKyAqCisgKiBAdmNwdTogdGhlIG9mZmVuZGluZyB2Y3B1CisgKgorICogUmV0dXJuczoKKyAqICAxOiBHSUNWIGFjY2VzcyBzdWNjZXNzZnVsbHkgcGVyZm9ybWVkCisgKiAgMDogTm90IGEgR0lDViBhY2Nlc3MKKyAqIC0xOiBJbGxlZ2FsIEdJQ1YgYWNjZXNzCisgKi8KK2ludCBfX2h5cF90ZXh0IF9fdmdpY192Ml9wZXJmb3JtX2NwdWlmX2FjY2VzcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJc3RydWN0IGt2bSAqa3ZtID0ga2Vybl9oeXBfdmEodmNwdS0+a3ZtKTsKKwlzdHJ1Y3QgdmdpY19kaXN0ICp2Z2ljID0gJmt2bS0+YXJjaC52Z2ljOworCXBoeXNfYWRkcl90IGZhdWx0X2lwYTsKKwl2b2lkIF9faW9tZW0gKmFkZHI7CisJaW50IHJkOworCisJLyogQnVpbGQgdGhlIGZ1bGwgYWRkcmVzcyAqLworCWZhdWx0X2lwYSAgPSBrdm1fdmNwdV9nZXRfZmF1bHRfaXBhKHZjcHUpOworCWZhdWx0X2lwYSB8PSBrdm1fdmNwdV9nZXRfaGZhcih2Y3B1KSAmIEdFTk1BU0soMTEsIDApOworCisJLyogSWYgbm90IGZvciBHSUNWLCBtb3ZlIG9uICovCisJaWYgKGZhdWx0X2lwYSA8ICB2Z2ljLT52Z2ljX2NwdV9iYXNlIHx8CisJICAgIGZhdWx0X2lwYSA+PSAodmdpYy0+dmdpY19jcHVfYmFzZSArIEtWTV9WR0lDX1YyX0NQVV9TSVpFKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBSZWplY3QgYW55dGhpbmcgYnV0IGEgMzJiaXQgYWNjZXNzICovCisJaWYgKGt2bV92Y3B1X2RhYnRfZ2V0X2FzKHZjcHUpICE9IHNpemVvZih1MzIpKQorCQlyZXR1cm4gLTE7CisKKwkvKiBOb3QgYWxpZ25lZD8gRG9uJ3QgYm90aGVyICovCisJaWYgKGZhdWx0X2lwYSAmIDMpCisJCXJldHVybiAtMTsKKworCXJkID0ga3ZtX3ZjcHVfZGFidF9nZXRfcmQodmNwdSk7CisJYWRkciAgPSBrZXJuX2h5cF92YSgoa2Vybl9oeXBfdmEoJmt2bV92Z2ljX2dsb2JhbF9zdGF0ZSkpLT52Y3B1X2Jhc2VfdmEpOworCWFkZHIgKz0gZmF1bHRfaXBhIC0gdmdpYy0+dmdpY19jcHVfYmFzZTsKKworCWlmIChrdm1fdmNwdV9kYWJ0X2lzd3JpdGUodmNwdSkpIHsKKwkJdTMyIGRhdGEgPSB2Y3B1X2RhdGFfZ3Vlc3RfdG9faG9zdCh2Y3B1LAorCQkJCQkJICAgdmNwdV9nZXRfcmVnKHZjcHUsIHJkKSwKKwkJCQkJCSAgIHNpemVvZih1MzIpKTsKKwkJd3JpdGVsX3JlbGF4ZWQoZGF0YSwgYWRkcik7CisJfSBlbHNlIHsKKwkJdTMyIGRhdGEgPSByZWFkbF9yZWxheGVkKGFkZHIpOworCQl2Y3B1X3NldF9yZWcodmNwdSwgcmQsIHZjcHVfZGF0YV9ob3N0X3RvX2d1ZXN0KHZjcHUsIGRhdGEsCisJCQkJCQkJICAgICAgIHNpemVvZih1MzIpKSk7CisJfQorCisJcmV0dXJuIDE7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2FybS9oeXAvdmdpYy12My1zci5jIGIvdmlydC9rdm0vYXJtL2h5cC92Z2ljLXYzLXNyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk0NzA5NQotLS0gL2Rldi9udWxsCisrKyBiL3ZpcnQva3ZtL2FybS9oeXAvdmdpYy12My1zci5jCkBAIC0wLDAgKzEsMzI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTUgLSBBUk0gTHRkCisgKiBBdXRob3I6IE1hcmMgWnluZ2llciA8bWFyYy56eW5naWVyQGFybS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFjaGlwL2FybS1naWMtdjMuaD4KKyNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgorCisjaW5jbHVkZSA8YXNtL2t2bV9oeXAuaD4KKworI2RlZmluZSB2dHJfdG9fbWF4X2xyX2lkeCh2KQkJKCh2KSAmIDB4ZikKKyNkZWZpbmUgdnRyX3RvX25yX3ByaV9iaXRzKHYpCQkoKCh1MzIpKHYpID4+IDI5KSArIDEpCisKK3N0YXRpYyB1NjQgX19oeXBfdGV4dCBfX2dpY192M19nZXRfbHIodW5zaWduZWQgaW50IGxyKQoreworCXN3aXRjaCAobHIgJiAweGYpIHsKKwljYXNlIDA6CisJCXJldHVybiByZWFkX2dpY3JlZyhJQ0hfTFIwX0VMMik7CisJY2FzZSAxOgorCQlyZXR1cm4gcmVhZF9naWNyZWcoSUNIX0xSMV9FTDIpOworCWNhc2UgMjoKKwkJcmV0dXJuIHJlYWRfZ2ljcmVnKElDSF9MUjJfRUwyKTsKKwljYXNlIDM6CisJCXJldHVybiByZWFkX2dpY3JlZyhJQ0hfTFIzX0VMMik7CisJY2FzZSA0OgorCQlyZXR1cm4gcmVhZF9naWNyZWcoSUNIX0xSNF9FTDIpOworCWNhc2UgNToKKwkJcmV0dXJuIHJlYWRfZ2ljcmVnKElDSF9MUjVfRUwyKTsKKwljYXNlIDY6CisJCXJldHVybiByZWFkX2dpY3JlZyhJQ0hfTFI2X0VMMik7CisJY2FzZSA3OgorCQlyZXR1cm4gcmVhZF9naWNyZWcoSUNIX0xSN19FTDIpOworCWNhc2UgODoKKwkJcmV0dXJuIHJlYWRfZ2ljcmVnKElDSF9MUjhfRUwyKTsKKwljYXNlIDk6CisJCXJldHVybiByZWFkX2dpY3JlZyhJQ0hfTFI5X0VMMik7CisJY2FzZSAxMDoKKwkJcmV0dXJuIHJlYWRfZ2ljcmVnKElDSF9MUjEwX0VMMik7CisJY2FzZSAxMToKKwkJcmV0dXJuIHJlYWRfZ2ljcmVnKElDSF9MUjExX0VMMik7CisJY2FzZSAxMjoKKwkJcmV0dXJuIHJlYWRfZ2ljcmVnKElDSF9MUjEyX0VMMik7CisJY2FzZSAxMzoKKwkJcmV0dXJuIHJlYWRfZ2ljcmVnKElDSF9MUjEzX0VMMik7CisJY2FzZSAxNDoKKwkJcmV0dXJuIHJlYWRfZ2ljcmVnKElDSF9MUjE0X0VMMik7CisJY2FzZSAxNToKKwkJcmV0dXJuIHJlYWRfZ2ljcmVnKElDSF9MUjE1X0VMMik7CisJfQorCisJdW5yZWFjaGFibGUoKTsKK30KKworc3RhdGljIHZvaWQgX19oeXBfdGV4dCBfX2dpY192M19zZXRfbHIodTY0IHZhbCwgaW50IGxyKQoreworCXN3aXRjaCAobHIgJiAweGYpIHsKKwljYXNlIDA6CisJCXdyaXRlX2dpY3JlZyh2YWwsIElDSF9MUjBfRUwyKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQl3cml0ZV9naWNyZWcodmFsLCBJQ0hfTFIxX0VMMik7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJd3JpdGVfZ2ljcmVnKHZhbCwgSUNIX0xSMl9FTDIpOworCQlicmVhazsKKwljYXNlIDM6CisJCXdyaXRlX2dpY3JlZyh2YWwsIElDSF9MUjNfRUwyKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQl3cml0ZV9naWNyZWcodmFsLCBJQ0hfTFI0X0VMMik7CisJCWJyZWFrOworCWNhc2UgNToKKwkJd3JpdGVfZ2ljcmVnKHZhbCwgSUNIX0xSNV9FTDIpOworCQlicmVhazsKKwljYXNlIDY6CisJCXdyaXRlX2dpY3JlZyh2YWwsIElDSF9MUjZfRUwyKTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQl3cml0ZV9naWNyZWcodmFsLCBJQ0hfTFI3X0VMMik7CisJCWJyZWFrOworCWNhc2UgODoKKwkJd3JpdGVfZ2ljcmVnKHZhbCwgSUNIX0xSOF9FTDIpOworCQlicmVhazsKKwljYXNlIDk6CisJCXdyaXRlX2dpY3JlZyh2YWwsIElDSF9MUjlfRUwyKTsKKwkJYnJlYWs7CisJY2FzZSAxMDoKKwkJd3JpdGVfZ2ljcmVnKHZhbCwgSUNIX0xSMTBfRUwyKTsKKwkJYnJlYWs7CisJY2FzZSAxMToKKwkJd3JpdGVfZ2ljcmVnKHZhbCwgSUNIX0xSMTFfRUwyKTsKKwkJYnJlYWs7CisJY2FzZSAxMjoKKwkJd3JpdGVfZ2ljcmVnKHZhbCwgSUNIX0xSMTJfRUwyKTsKKwkJYnJlYWs7CisJY2FzZSAxMzoKKwkJd3JpdGVfZ2ljcmVnKHZhbCwgSUNIX0xSMTNfRUwyKTsKKwkJYnJlYWs7CisJY2FzZSAxNDoKKwkJd3JpdGVfZ2ljcmVnKHZhbCwgSUNIX0xSMTRfRUwyKTsKKwkJYnJlYWs7CisJY2FzZSAxNToKKwkJd3JpdGVfZ2ljcmVnKHZhbCwgSUNIX0xSMTVfRUwyKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2h5cF90ZXh0IHNhdmVfbWFpbnRfaW50X3N0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IG5yX2xyKQoreworCXN0cnVjdCB2Z2ljX3YzX2NwdV9pZiAqY3B1X2lmID0gJnZjcHUtPmFyY2gudmdpY19jcHUudmdpY192MzsKKwlpbnQgaTsKKwlib29sIGV4cGVjdF9taTsKKworCWV4cGVjdF9taSA9ICEhKGNwdV9pZi0+dmdpY19oY3IgJiBJQ0hfSENSX1VJRSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfbHI7IGkrKykgeworCQlpZiAoISh2Y3B1LT5hcmNoLnZnaWNfY3B1LmxpdmVfbHJzICYgKDFVTCA8PCBpKSkpCisJCQkJY29udGludWU7CisKKwkJZXhwZWN0X21pIHw9ICghKGNwdV9pZi0+dmdpY19scltpXSAmIElDSF9MUl9IVykgJiYKKwkJCSAgICAgIChjcHVfaWYtPnZnaWNfbHJbaV0gJiBJQ0hfTFJfRU9JKSk7CisJfQorCisJaWYgKGV4cGVjdF9taSkgeworCQljcHVfaWYtPnZnaWNfbWlzciAgPSByZWFkX2dpY3JlZyhJQ0hfTUlTUl9FTDIpOworCisJCWlmIChjcHVfaWYtPnZnaWNfbWlzciAmIElDSF9NSVNSX0VPSSkKKwkJCWNwdV9pZi0+dmdpY19laXNyID0gcmVhZF9naWNyZWcoSUNIX0VJU1JfRUwyKTsKKwkJZWxzZQorCQkJY3B1X2lmLT52Z2ljX2Vpc3IgPSAwOworCX0gZWxzZSB7CisJCWNwdV9pZi0+dmdpY19taXNyID0gMDsKKwkJY3B1X2lmLT52Z2ljX2Vpc3IgPSAwOworCX0KK30KKwordm9pZCBfX2h5cF90ZXh0IF9fdmdpY192M19zYXZlX3N0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzdHJ1Y3QgdmdpY192M19jcHVfaWYgKmNwdV9pZiA9ICZ2Y3B1LT5hcmNoLnZnaWNfY3B1LnZnaWNfdjM7CisJdTY0IHZhbDsKKworCS8qCisJICogTWFrZSBzdXJlIHN0b3JlcyB0byB0aGUgR0lDIHZpYSB0aGUgbWVtb3J5IG1hcHBlZCBpbnRlcmZhY2UKKwkgKiBhcmUgbm93IHZpc2libGUgdG8gdGhlIHN5c3RlbSByZWdpc3RlciBpbnRlcmZhY2UuCisJICovCisJaWYgKCFjcHVfaWYtPnZnaWNfc3JlKQorCQlkc2Ioc3QpOworCisJY3B1X2lmLT52Z2ljX3ZtY3IgID0gcmVhZF9naWNyZWcoSUNIX1ZNQ1JfRUwyKTsKKworCWlmICh2Y3B1LT5hcmNoLnZnaWNfY3B1LmxpdmVfbHJzKSB7CisJCWludCBpOworCQl1MzIgbWF4X2xyX2lkeCwgbnJfcHJpX2JpdHM7CisKKwkJY3B1X2lmLT52Z2ljX2VscnNyID0gcmVhZF9naWNyZWcoSUNIX0VMU1JfRUwyKTsKKworCQl3cml0ZV9naWNyZWcoMCwgSUNIX0hDUl9FTDIpOworCQl2YWwgPSByZWFkX2dpY3JlZyhJQ0hfVlRSX0VMMik7CisJCW1heF9scl9pZHggPSB2dHJfdG9fbWF4X2xyX2lkeCh2YWwpOworCQlucl9wcmlfYml0cyA9IHZ0cl90b19ucl9wcmlfYml0cyh2YWwpOworCisJCXNhdmVfbWFpbnRfaW50X3N0YXRlKHZjcHUsIG1heF9scl9pZHggKyAxKTsKKworCQlmb3IgKGkgPSAwOyBpIDw9IG1heF9scl9pZHg7IGkrKykgeworCQkJaWYgKCEodmNwdS0+YXJjaC52Z2ljX2NwdS5saXZlX2xycyAmICgxVUwgPDwgaSkpKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoY3B1X2lmLT52Z2ljX2VscnNyICYgKDEgPDwgaSkpCisJCQkJY3B1X2lmLT52Z2ljX2xyW2ldICY9IH5JQ0hfTFJfU1RBVEU7CisJCQllbHNlCisJCQkJY3B1X2lmLT52Z2ljX2xyW2ldID0gX19naWNfdjNfZ2V0X2xyKGkpOworCisJCQlfX2dpY192M19zZXRfbHIoMCwgaSk7CisJCX0KKworCQlzd2l0Y2ggKG5yX3ByaV9iaXRzKSB7CisJCWNhc2UgNzoKKwkJCWNwdV9pZi0+dmdpY19hcDByWzNdID0gcmVhZF9naWNyZWcoSUNIX0FQMFIzX0VMMik7CisJCQljcHVfaWYtPnZnaWNfYXAwclsyXSA9IHJlYWRfZ2ljcmVnKElDSF9BUDBSMl9FTDIpOworCQljYXNlIDY6CisJCQljcHVfaWYtPnZnaWNfYXAwclsxXSA9IHJlYWRfZ2ljcmVnKElDSF9BUDBSMV9FTDIpOworCQlkZWZhdWx0OgorCQkJY3B1X2lmLT52Z2ljX2FwMHJbMF0gPSByZWFkX2dpY3JlZyhJQ0hfQVAwUjBfRUwyKTsKKwkJfQorCisJCXN3aXRjaCAobnJfcHJpX2JpdHMpIHsKKwkJY2FzZSA3OgorCQkJY3B1X2lmLT52Z2ljX2FwMXJbM10gPSByZWFkX2dpY3JlZyhJQ0hfQVAxUjNfRUwyKTsKKwkJCWNwdV9pZi0+dmdpY19hcDFyWzJdID0gcmVhZF9naWNyZWcoSUNIX0FQMVIyX0VMMik7CisJCWNhc2UgNjoKKwkJCWNwdV9pZi0+dmdpY19hcDFyWzFdID0gcmVhZF9naWNyZWcoSUNIX0FQMVIxX0VMMik7CisJCWRlZmF1bHQ6CisJCQljcHVfaWYtPnZnaWNfYXAxclswXSA9IHJlYWRfZ2ljcmVnKElDSF9BUDFSMF9FTDIpOworCQl9CisKKwkJdmNwdS0+YXJjaC52Z2ljX2NwdS5saXZlX2xycyA9IDA7CisJfSBlbHNlIHsKKwkJY3B1X2lmLT52Z2ljX21pc3IgID0gMDsKKwkJY3B1X2lmLT52Z2ljX2Vpc3IgID0gMDsKKwkJY3B1X2lmLT52Z2ljX2VscnNyID0gMHhmZmZmOworCQljcHVfaWYtPnZnaWNfYXAwclswXSA9IDA7CisJCWNwdV9pZi0+dmdpY19hcDByWzFdID0gMDsKKwkJY3B1X2lmLT52Z2ljX2FwMHJbMl0gPSAwOworCQljcHVfaWYtPnZnaWNfYXAwclszXSA9IDA7CisJCWNwdV9pZi0+dmdpY19hcDFyWzBdID0gMDsKKwkJY3B1X2lmLT52Z2ljX2FwMXJbMV0gPSAwOworCQljcHVfaWYtPnZnaWNfYXAxclsyXSA9IDA7CisJCWNwdV9pZi0+dmdpY19hcDFyWzNdID0gMDsKKwl9CisKKwl2YWwgPSByZWFkX2dpY3JlZyhJQ0NfU1JFX0VMMik7CisJd3JpdGVfZ2ljcmVnKHZhbCB8IElDQ19TUkVfRUwyX0VOQUJMRSwgSUNDX1NSRV9FTDIpOworCisJaWYgKCFjcHVfaWYtPnZnaWNfc3JlKSB7CisJCS8qIE1ha2Ugc3VyZSBFTkFCTEUgaXMgc2V0IGF0IEVMMiBiZWZvcmUgc2V0dGluZyBTUkUgYXQgRUwxICovCisJCWlzYigpOworCQl3cml0ZV9naWNyZWcoMSwgSUNDX1NSRV9FTDEpOworCX0KK30KKwordm9pZCBfX2h5cF90ZXh0IF9fdmdpY192M19yZXN0b3JlX3N0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzdHJ1Y3QgdmdpY192M19jcHVfaWYgKmNwdV9pZiA9ICZ2Y3B1LT5hcmNoLnZnaWNfY3B1LnZnaWNfdjM7CisJdTY0IHZhbDsKKwl1MzIgbWF4X2xyX2lkeCwgbnJfcHJpX2JpdHM7CisJdTE2IGxpdmVfbHJzID0gMDsKKwlpbnQgaTsKKworCS8qCisJICogVkZJUUVuIGlzIFJFUzEgaWYgSUNDX1NSRV9FTDEuU1JFIGlzIDEuIFRoaXMgY2F1c2VzIGEKKwkgKiBHcm91cDAgaW50ZXJydXB0IChhcyBnZW5lcmF0ZWQgaW4gR0lDdjIgbW9kZSkgdG8gYmUKKwkgKiBkZWxpdmVyZWQgYXMgYSBGSVEgdG8gdGhlIGd1ZXN0LCB3aXRoIHBvdGVudGlhbGx5IGZhdGFsCisJICogY29uc2VxdWVuY2VzLiBTbyB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IElDQ19TUkVfRUwxIGhhcworCSAqIGJlZW4gYWN0dWFsbHkgcHJvZ3JhbW1lZCB3aXRoIHRoZSB2YWx1ZSB3ZSB3YW50IGJlZm9yZQorCSAqIHN0YXJ0aW5nIHRvIG1lc3Mgd2l0aCB0aGUgcmVzdCBvZiB0aGUgR0lDLgorCSAqLworCWlmICghY3B1X2lmLT52Z2ljX3NyZSkgeworCQl3cml0ZV9naWNyZWcoMCwgSUNDX1NSRV9FTDEpOworCQlpc2IoKTsKKwl9CisKKwl2YWwgPSByZWFkX2dpY3JlZyhJQ0hfVlRSX0VMMik7CisJbWF4X2xyX2lkeCA9IHZ0cl90b19tYXhfbHJfaWR4KHZhbCk7CisJbnJfcHJpX2JpdHMgPSB2dHJfdG9fbnJfcHJpX2JpdHModmFsKTsKKworCWZvciAoaSA9IDA7IGkgPD0gbWF4X2xyX2lkeDsgaSsrKSB7CisJCWlmIChjcHVfaWYtPnZnaWNfbHJbaV0gJiBJQ0hfTFJfU1RBVEUpCisJCQlsaXZlX2xycyB8PSAoMSA8PCBpKTsKKwl9CisKKwl3cml0ZV9naWNyZWcoY3B1X2lmLT52Z2ljX3ZtY3IsIElDSF9WTUNSX0VMMik7CisKKwlpZiAobGl2ZV9scnMpIHsKKwkJd3JpdGVfZ2ljcmVnKGNwdV9pZi0+dmdpY19oY3IsIElDSF9IQ1JfRUwyKTsKKworCQlzd2l0Y2ggKG5yX3ByaV9iaXRzKSB7CisJCWNhc2UgNzoKKwkJCXdyaXRlX2dpY3JlZyhjcHVfaWYtPnZnaWNfYXAwclszXSwgSUNIX0FQMFIzX0VMMik7CisJCQl3cml0ZV9naWNyZWcoY3B1X2lmLT52Z2ljX2FwMHJbMl0sIElDSF9BUDBSMl9FTDIpOworCQljYXNlIDY6CisJCQl3cml0ZV9naWNyZWcoY3B1X2lmLT52Z2ljX2FwMHJbMV0sIElDSF9BUDBSMV9FTDIpOworCQlkZWZhdWx0OgorCQkJd3JpdGVfZ2ljcmVnKGNwdV9pZi0+dmdpY19hcDByWzBdLCBJQ0hfQVAwUjBfRUwyKTsKKwkJfQorCisJCXN3aXRjaCAobnJfcHJpX2JpdHMpIHsKKwkJY2FzZSA3OgorCQkJd3JpdGVfZ2ljcmVnKGNwdV9pZi0+dmdpY19hcDFyWzNdLCBJQ0hfQVAxUjNfRUwyKTsKKwkJCXdyaXRlX2dpY3JlZyhjcHVfaWYtPnZnaWNfYXAxclsyXSwgSUNIX0FQMVIyX0VMMik7CisJCWNhc2UgNjoKKwkJCXdyaXRlX2dpY3JlZyhjcHVfaWYtPnZnaWNfYXAxclsxXSwgSUNIX0FQMVIxX0VMMik7CisJCWRlZmF1bHQ6CisJCQl3cml0ZV9naWNyZWcoY3B1X2lmLT52Z2ljX2FwMXJbMF0sIElDSF9BUDFSMF9FTDIpOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8PSBtYXhfbHJfaWR4OyBpKyspIHsKKwkJCWlmICghKGxpdmVfbHJzICYgKDEgPDwgaSkpKQorCQkJCWNvbnRpbnVlOworCisJCQlfX2dpY192M19zZXRfbHIoY3B1X2lmLT52Z2ljX2xyW2ldLCBpKTsKKwkJfQorCX0KKworCS8qCisJICogRW5zdXJlcyB0aGF0IHRoZSBhYm92ZSB3aWxsIGhhdmUgcmVhY2hlZCB0aGUKKwkgKiAocmUpZGlzdHJpYnV0b3JzLiBUaGlzIGVuc3VyZSB0aGUgZ3Vlc3Qgd2lsbCByZWFkIHRoZQorCSAqIGNvcnJlY3QgdmFsdWVzIGZyb20gdGhlIG1lbW9yeS1tYXBwZWQgaW50ZXJmYWNlLgorCSAqLworCWlmICghY3B1X2lmLT52Z2ljX3NyZSkgeworCQlpc2IoKTsKKwkJZHNiKHN5KTsKKwl9CisJdmNwdS0+YXJjaC52Z2ljX2NwdS5saXZlX2xycyA9IGxpdmVfbHJzOworCisJLyoKKwkgKiBQcmV2ZW50IHRoZSBndWVzdCBmcm9tIHRvdWNoaW5nIHRoZSBHSUMgc3lzdGVtIHJlZ2lzdGVycyBpZgorCSAqIFNSRSBpc24ndCBlbmFibGVkIGZvciBHSUN2MyBlbXVsYXRpb24uCisJICovCisJd3JpdGVfZ2ljcmVnKHJlYWRfZ2ljcmVnKElDQ19TUkVfRUwyKSAmIH5JQ0NfU1JFX0VMMl9FTkFCTEUsCisJCSAgICAgSUNDX1NSRV9FTDIpOworfQorCit2b2lkIF9faHlwX3RleHQgX192Z2ljX3YzX2luaXRfbHJzKHZvaWQpCit7CisJaW50IG1heF9scl9pZHggPSB2dHJfdG9fbWF4X2xyX2lkeChyZWFkX2dpY3JlZyhJQ0hfVlRSX0VMMikpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8PSBtYXhfbHJfaWR4OyBpKyspCisJCV9fZ2ljX3YzX3NldF9scigwLCBpKTsKK30KKwordTY0IF9faHlwX3RleHQgX192Z2ljX3YzX2dldF9pY2hfdnRyX2VsMih2b2lkKQoreworCXJldHVybiByZWFkX2dpY3JlZyhJQ0hfVlRSX0VMMik7Cit9CmRpZmYgLS1naXQgYS92aXJ0L2t2bS9hcm0vcG11LmMgYi92aXJ0L2t2bS9hcm0vcG11LmMKaW5kZXggYTAyNzU2OS4uNmU5YzQwZSAxMDA2NDQKLS0tIGEvdmlydC9rdm0vYXJtL3BtdS5jCisrKyBiL3ZpcnQva3ZtL2FybS9wbXUuYwpAQCAtNDIzLDYgKzQyMywxNCBAQAogCWlmICgha3ZtX2FybV9zdXBwb3J0X3BtdV92MygpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCS8qCisJICogV2UgY3VycmVudGx5IHJlcXVpcmUgYW4gaW4ta2VybmVsIFZHSUMgdG8gdXNlIHRoZSBQTVUgZW11bGF0aW9uLAorCSAqIGJlY2F1c2Ugd2UgZG8gbm90IHN1cHBvcnQgZm9yd2FyZGluZyBQTVUgb3ZlcmZsb3cgaW50ZXJydXB0cyB0bworCSAqIHVzZXJzcGFjZSB5ZXQuCisJICovCisJaWYgKCFpcnFjaGlwX2luX2tlcm5lbCh2Y3B1LT5rdm0pIHx8ICF2Z2ljX2luaXRpYWxpemVkKHZjcHUtPmt2bSkpCisJCXJldHVybiAtRU5PREVWOworCiAJaWYgKCF0ZXN0X2JpdChLVk1fQVJNX1ZDUFVfUE1VX1YzLCB2Y3B1LT5hcmNoLmZlYXR1cmVzKSB8fAogCSAgICAha3ZtX2FybV9wbXVfaXJxX2luaXRpYWxpemVkKHZjcHUpKQogCQlyZXR1cm4gLUVOWElPOwpkaWZmIC0tZ2l0IGEvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy1pbml0LmMgYi92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLWluaXQuYwppbmRleCA4Mzc3N2MxLi44Y2ViZmJjIDEwMDY0NAotLS0gYS92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLWluaXQuYworKysgYi92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLWluaXQuYwpAQCAtNDA1LDYgKzQwNSwxMCBAQAogCQlicmVhazsKIAljYXNlIEdJQ19WMzoKIAkJcmV0ID0gdmdpY192M19wcm9iZShnaWNfa3ZtX2luZm8pOworCQlpZiAoIXJldCkgeworCQkJc3RhdGljX2JyYW5jaF9lbmFibGUoJmt2bV92Z2ljX2dsb2JhbF9zdGF0ZS5naWN2M19jcHVpZik7CisJCQlrdm1faW5mbygiR0lDIHN5c3RlbSByZWdpc3RlciBDUFUgaW50ZXJmYWNlIGVuYWJsZWRcbiIpOworCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldCA9IC1FTk9ERVY7CmRpZmYgLS1naXQgYS92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLWlycWZkLmMgYi92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLWlycWZkLmMKaW5kZXggYjMxYTUxYS4uZDkxOGRjZiAxMDA2NDQKLS0tIGEvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy1pcnFmZC5jCisrKyBiL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMtaXJxZmQuYwpAQCAtNDYsMTUgKzQ2LDkgQEAKICAqIEB1ZTogdXNlciBhcGkgcm91dGluZyBlbnRyeSBoYW5kbGUKICAqIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgb24gZXJyb3JzLgogICovCi0jaWZkZWYgS1ZNX0NBUF9YMkFQSUNfQVBJCiBpbnQga3ZtX3NldF9yb3V0aW5nX2VudHJ5KHN0cnVjdCBrdm0gKmt2bSwKIAkJCSAgc3RydWN0IGt2bV9rZXJuZWxfaXJxX3JvdXRpbmdfZW50cnkgKmUsCiAJCQkgIGNvbnN0IHN0cnVjdCBrdm1faXJxX3JvdXRpbmdfZW50cnkgKnVlKQotI2Vsc2UKLS8qIFJlbW92ZSB0aGlzIHZlcnNpb24gYW5kIHRoZSBpZmRlZmVyeSBvbmNlIG1lcmdlZCBpbnRvIDQuOCAqLwotaW50IGt2bV9zZXRfcm91dGluZ19lbnRyeShzdHJ1Y3Qga3ZtX2tlcm5lbF9pcnFfcm91dGluZ19lbnRyeSAqZSwKLQkJCSAgY29uc3Qgc3RydWN0IGt2bV9pcnFfcm91dGluZ19lbnRyeSAqdWUpCi0jZW5kaWYKIHsKIAlpbnQgciA9IC1FSU5WQUw7CiAKZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMtaXRzLmMgYi92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLWl0cy5jCmluZGV4IDA3NDExY2YuLjQ2NjBhN2QgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMtaXRzLmMKKysrIGIvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy1pdHMuYwpAQCAtNTEsNyArNTEsNyBAQAogCiAJaXJxID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZnaWNfaXJxKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpcnEpCi0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCUlOSVRfTElTVF9IRUFEKCZpcnEtPmxwaV9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmaXJxLT5hcF9saXN0KTsKQEAgLTQ0MSwzOSArNDQxLDYzIEBACiAgKiBGaW5kIHRoZSB0YXJnZXQgVkNQVSBhbmQgdGhlIExQSSBudW1iZXIgZm9yIGEgZ2l2ZW4gZGV2aWQvZXZlbnRpZCBwYWlyCiAgKiBhbmQgbWFrZSB0aGlzIElSUSBwZW5kaW5nLCBwb3NzaWJseSBpbmplY3RpbmcgaXQuCiAgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBpdHNfbG9jayBtdXRleCBoZWxkLgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGEgcG9zaXRpdmUgZXJyb3IgdmFsdWUgZm9yIGFueSBJVFMgbWFwcGluZworICogcmVsYXRlZCBlcnJvcnMgYW5kIG5lZ2F0aXZlIGVycm9yIHZhbHVlcyBmb3IgZ2VuZXJpYyBlcnJvcnMuCiAgKi8KLXN0YXRpYyB2b2lkIHZnaWNfaXRzX3RyaWdnZXJfbXNpKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IHZnaWNfaXRzICppdHMsCi0JCQkJIHUzMiBkZXZpZCwgdTMyIGV2ZW50aWQpCitzdGF0aWMgaW50IHZnaWNfaXRzX3RyaWdnZXJfbXNpKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IHZnaWNfaXRzICppdHMsCisJCQkJdTMyIGRldmlkLCB1MzIgZXZlbnRpZCkKIHsKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHU7CiAJc3RydWN0IGl0c19pdHRlICppdHRlOwogCiAJaWYgKCFpdHMtPmVuYWJsZWQpCi0JCXJldHVybjsKKwkJcmV0dXJuIC1FQlVTWTsKIAogCWl0dGUgPSBmaW5kX2l0dGUoaXRzLCBkZXZpZCwgZXZlbnRpZCk7Ci0JLyogVHJpZ2dlcmluZyBhbiB1bm1hcHBlZCBJUlEgZ2V0cyBzaWxlbnRseSBkcm9wcGVkLiAqLwotCWlmIChpdHRlICYmIGl0c19pc19jb2xsZWN0aW9uX21hcHBlZChpdHRlLT5jb2xsZWN0aW9uKSkgewotCQlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHU7CisJaWYgKCFpdHRlIHx8ICFpdHNfaXNfY29sbGVjdGlvbl9tYXBwZWQoaXR0ZS0+Y29sbGVjdGlvbikpCisJCXJldHVybiBFX0lUU19JTlRfVU5NQVBQRURfSU5URVJSVVBUOwogCi0JCXZjcHUgPSBrdm1fZ2V0X3ZjcHUoa3ZtLCBpdHRlLT5jb2xsZWN0aW9uLT50YXJnZXRfYWRkcik7Ci0JCWlmICh2Y3B1ICYmIHZjcHUtPmFyY2gudmdpY19jcHUubHBpc19lbmFibGVkKSB7Ci0JCQlzcGluX2xvY2soJml0dGUtPmlycS0+aXJxX2xvY2spOwotCQkJaXR0ZS0+aXJxLT5wZW5kaW5nID0gdHJ1ZTsKLQkJCXZnaWNfcXVldWVfaXJxX3VubG9jayhrdm0sIGl0dGUtPmlycSk7Ci0JCX0KLQl9CisJdmNwdSA9IGt2bV9nZXRfdmNwdShrdm0sIGl0dGUtPmNvbGxlY3Rpb24tPnRhcmdldF9hZGRyKTsKKwlpZiAoIXZjcHUpCisJCXJldHVybiBFX0lUU19JTlRfVU5NQVBQRURfSU5URVJSVVBUOworCisJaWYgKCF2Y3B1LT5hcmNoLnZnaWNfY3B1LmxwaXNfZW5hYmxlZCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXNwaW5fbG9jaygmaXR0ZS0+aXJxLT5pcnFfbG9jayk7CisJaXR0ZS0+aXJxLT5wZW5kaW5nID0gdHJ1ZTsKKwl2Z2ljX3F1ZXVlX2lycV91bmxvY2soa3ZtLCBpdHRlLT5pcnEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmdpY19pb19kZXZpY2UgKnZnaWNfZ2V0X2l0c19pb2RldihzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2Z2ljX2lvX2RldmljZSAqaW9kZXY7CisKKwlpZiAoZGV2LT5vcHMgIT0gJmt2bV9pb19naWNfb3BzKQorCQlyZXR1cm4gTlVMTDsKKworCWlvZGV2ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHZnaWNfaW9fZGV2aWNlLCBkZXYpOworCisJaWYgKGlvZGV2LT5pb2Rldl90eXBlICE9IElPREVWX0lUUykKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gaW9kZXY7CiB9CiAKIC8qCiAgKiBRdWVyaWVzIHRoZSBLVk0gSU8gYnVzIGZyYW1ld29yayB0byBnZXQgdGhlIElUUyBwb2ludGVyIGZyb20gdGhlIGdpdmVuCiAgKiBkb29yYmVsbCBhZGRyZXNzLgogICogV2UgdGhlbiBjYWxsIHZnaWNfaXRzX3RyaWdnZXJfbXNpKCkgd2l0aCB0aGUgZGVjb2RlZCBkYXRhLgorICogQWNjb3JkaW5nIHRvIHRoZSBLVk1fU0lHTkFMX01TSSBBUEkgZGVzY3JpcHRpb24gcmV0dXJucyAxIG9uIHN1Y2Nlc3MuCiAgKi8KIGludCB2Z2ljX2l0c19pbmplY3RfbXNpKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tc2kgKm1zaSkKIHsKIAl1NjQgYWRkcmVzczsKIAlzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqa3ZtX2lvX2RldjsKIAlzdHJ1Y3QgdmdpY19pb19kZXZpY2UgKmlvZGV2OworCWludCByZXQ7CiAKIAlpZiAoIXZnaWNfaGFzX2l0cyhrdm0pKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTQ4NSwxNSArNTA5LDI4IEBACiAKIAlrdm1faW9fZGV2ID0ga3ZtX2lvX2J1c19nZXRfZGV2KGt2bSwgS1ZNX01NSU9fQlVTLCBhZGRyZXNzKTsKIAlpZiAoIWt2bV9pb19kZXYpCi0JCXJldHVybiAtRU5PREVWOworCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlvZGV2ID0gY29udGFpbmVyX29mKGt2bV9pb19kZXYsIHN0cnVjdCB2Z2ljX2lvX2RldmljZSwgZGV2KTsKKwlpb2RldiA9IHZnaWNfZ2V0X2l0c19pb2Rldihrdm1faW9fZGV2KTsKKwlpZiAoIWlvZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCW11dGV4X2xvY2soJmlvZGV2LT5pdHMtPml0c19sb2NrKTsKLQl2Z2ljX2l0c190cmlnZ2VyX21zaShrdm0sIGlvZGV2LT5pdHMsIG1zaS0+ZGV2aWQsIG1zaS0+ZGF0YSk7CisJcmV0ID0gdmdpY19pdHNfdHJpZ2dlcl9tc2koa3ZtLCBpb2Rldi0+aXRzLCBtc2ktPmRldmlkLCBtc2ktPmRhdGEpOwogCW11dGV4X3VubG9jaygmaW9kZXYtPml0cy0+aXRzX2xvY2spOwogCi0JcmV0dXJuIDA7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIEtWTV9TSUdOQUxfTVNJIGRlbWFuZHMgYSByZXR1cm4gdmFsdWUgPiAwIGZvciBzdWNjZXNzIGFuZCAwCisJICogaWYgdGhlIGd1ZXN0IGhhcyBibG9ja2VkIHRoZSBNU0kuIFNvIHdlIG1hcCBhbnkgTFBJIG1hcHBpbmcKKwkgKiByZWxhdGVkIGVycm9yIHRvIHRoYXQuCisJICovCisJaWYgKHJldCkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMTsKIH0KIAogLyogUmVxdWlyZXMgdGhlIGl0c19sb2NrIHRvIGJlIGhlbGQuICovCkBAIC01MDIsNyArNTM5LDggQEAKIAlsaXN0X2RlbCgmaXR0ZS0+aXR0ZV9saXN0KTsKIAogCS8qIFRoaXMgcHV0IG1hdGNoZXMgdGhlIGdldCBpbiB2Z2ljX2FkZF9scGkuICovCi0JdmdpY19wdXRfaXJxKGt2bSwgaXR0ZS0+aXJxKTsKKwlpZiAoaXR0ZS0+aXJxKQorCQl2Z2ljX3B1dF9pcnEoa3ZtLCBpdHRlLT5pcnEpOwogCiAJa2ZyZWUoaXR0ZSk7CiB9CkBAIC02OTcsNiArNzM1LDcgQEAKIAlzdHJ1Y3QgaXRzX2RldmljZSAqZGV2aWNlOwogCXN0cnVjdCBpdHNfY29sbGVjdGlvbiAqY29sbGVjdGlvbiwgKm5ld19jb2xsID0gTlVMTDsKIAlpbnQgbHBpX25yOworCXN0cnVjdCB2Z2ljX2lycSAqaXJxOwogCiAJZGV2aWNlID0gZmluZF9pdHNfZGV2aWNlKGl0cywgZGV2aWNlX2lkKTsKIAlpZiAoIWRldmljZSkKQEAgLTcxMCw2ICs3NDksMTAgQEAKIAkgICAgbHBpX25yID49IG1heF9scGlzX3Byb3BiYXNlcihrdm0tPmFyY2gudmdpYy5wcm9wYmFzZXIpKQogCQlyZXR1cm4gRV9JVFNfTUFQVElfUEhZU0lDQUxJRF9PT1I7CiAKKwkvKiBJZiB0aGVyZSBpcyBhbiBleGlzdGluZyBtYXBwaW5nLCBiZWhhdmlvciBpcyBVTlBSRURJQ1RBQkxFLiAqLworCWlmIChmaW5kX2l0dGUoaXRzLCBkZXZpY2VfaWQsIGV2ZW50X2lkKSkKKwkJcmV0dXJuIDA7CisKIAljb2xsZWN0aW9uID0gZmluZF9jb2xsZWN0aW9uKGl0cywgY29sbF9pZCk7CiAJaWYgKCFjb2xsZWN0aW9uKSB7CiAJCWludCByZXQgPSB2Z2ljX2l0c19hbGxvY19jb2xsZWN0aW9uKGl0cywgJmNvbGxlY3Rpb24sIGNvbGxfaWQpOwpAQCAtNzE4LDIyICs3NjEsMjggQEAKIAkJbmV3X2NvbGwgPSBjb2xsZWN0aW9uOwogCX0KIAotCWl0dGUgPSBmaW5kX2l0dGUoaXRzLCBkZXZpY2VfaWQsIGV2ZW50X2lkKTsKKwlpdHRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGl0c19pdHRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpdHRlKSB7Ci0JCWl0dGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXRzX2l0dGUpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFpdHRlKSB7Ci0JCQlpZiAobmV3X2NvbGwpCi0JCQkJdmdpY19pdHNfZnJlZV9jb2xsZWN0aW9uKGl0cywgY29sbF9pZCk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCi0JCWl0dGUtPmV2ZW50X2lkCT0gZXZlbnRfaWQ7Ci0JCWxpc3RfYWRkX3RhaWwoJml0dGUtPml0dGVfbGlzdCwgJmRldmljZS0+aXR0X2hlYWQpOworCQlpZiAobmV3X2NvbGwpCisJCQl2Z2ljX2l0c19mcmVlX2NvbGxlY3Rpb24oaXRzLCBjb2xsX2lkKTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJaXR0ZS0+ZXZlbnRfaWQJPSBldmVudF9pZDsKKwlsaXN0X2FkZF90YWlsKCZpdHRlLT5pdHRlX2xpc3QsICZkZXZpY2UtPml0dF9oZWFkKTsKKwogCWl0dGUtPmNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOwogCWl0dGUtPmxwaSA9IGxwaV9ucjsKLQlpdHRlLT5pcnEgPSB2Z2ljX2FkZF9scGkoa3ZtLCBscGlfbnIpOworCisJaXJxID0gdmdpY19hZGRfbHBpKGt2bSwgbHBpX25yKTsKKwlpZiAoSVNfRVJSKGlycSkpIHsKKwkJaWYgKG5ld19jb2xsKQorCQkJdmdpY19pdHNfZnJlZV9jb2xsZWN0aW9uKGl0cywgY29sbF9pZCk7CisJCWl0c19mcmVlX2l0dGUoa3ZtLCBpdHRlKTsKKwkJcmV0dXJuIFBUUl9FUlIoaXJxKTsKKwl9CisJaXR0ZS0+aXJxID0gaXJxOworCiAJdXBkYXRlX2FmZmluaXR5X2l0dGUoa3ZtLCBpdHRlKTsKIAogCS8qCkBAIC05ODEsOSArMTAzMCw3IEBACiAJdTMyIG1zaV9kYXRhID0gaXRzX2NtZF9nZXRfaWQoaXRzX2NtZCk7CiAJdTY0IG1zaV9kZXZpZCA9IGl0c19jbWRfZ2V0X2RldmljZWlkKGl0c19jbWQpOwogCi0JdmdpY19pdHNfdHJpZ2dlcl9tc2koa3ZtLCBpdHMsIG1zaV9kZXZpZCwgbXNpX2RhdGEpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHZnaWNfaXRzX3RyaWdnZXJfbXNpKGt2bSwgaXRzLCBtc2lfZGV2aWQsIG1zaV9kYXRhKTsKIH0KIAogLyoKQEAgLTEyODgsMTMgKzEzMzUsMTMgQEAKIAkJaXRzX3N5bmNfbHBpX3BlbmRpbmdfdGFibGUodmNwdSk7CiB9CiAKLXN0YXRpYyBpbnQgdmdpY19pdHNfaW5pdF9pdHMoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3QgdmdpY19pdHMgKml0cykKK3N0YXRpYyBpbnQgdmdpY19yZWdpc3Rlcl9pdHNfaW9kZXYoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3QgdmdpY19pdHMgKml0cykKIHsKIAlzdHJ1Y3QgdmdpY19pb19kZXZpY2UgKmlvZGV2ID0gJml0cy0+aW9kZXY7CiAJaW50IHJldDsKIAotCWlmIChpdHMtPmluaXRpYWxpemVkKQotCQlyZXR1cm4gMDsKKwlpZiAoIWl0cy0+aW5pdGlhbGl6ZWQpCisJCXJldHVybiAtRUJVU1k7CiAKIAlpZiAoSVNfVkdJQ19BRERSX1VOREVGKGl0cy0+dmdpY19pdHNfYmFzZSkpCiAJCXJldHVybiAtRU5YSU87CkBAIC0xMzExLDkgKzEzNTgsNiBAQAogCQkJCSAgICAgIEtWTV9WR0lDX1YzX0lUU19TSVpFLCAmaW9kZXYtPmRldik7CiAJbXV0ZXhfdW5sb2NrKCZrdm0tPnNsb3RzX2xvY2spOwogCi0JaWYgKCFyZXQpCi0JCWl0cy0+aW5pdGlhbGl6ZWQgPSB0cnVlOwotCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTQzNSw5ICsxNDc5LDYgQEAKIAkJaWYgKHR5cGUgIT0gS1ZNX1ZHSUNfSVRTX0FERFJfVFlQRSkKIAkJCXJldHVybiAtRU5PREVWOwogCi0JCWlmIChpdHMtPmluaXRpYWxpemVkKQotCQkJcmV0dXJuIC1FQlVTWTsKLQogCQlpZiAoY29weV9mcm9tX3VzZXIoJmFkZHIsIHVhZGRyLCBzaXplb2YoYWRkcikpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKQEAgLTE0NTMsNyArMTQ5NCw5IEBACiAJY2FzZSBLVk1fREVWX0FSTV9WR0lDX0dSUF9DVFJMOgogCQlzd2l0Y2ggKGF0dHItPmF0dHIpIHsKIAkJY2FzZSBLVk1fREVWX0FSTV9WR0lDX0NUUkxfSU5JVDoKLQkJCXJldHVybiB2Z2ljX2l0c19pbml0X2l0cyhkZXYtPmt2bSwgaXRzKTsKKwkJCWl0cy0+aW5pdGlhbGl6ZWQgPSB0cnVlOworCisJCQlyZXR1cm4gMDsKIAkJfQogCQlicmVhazsKIAl9CkBAIC0xNDk4LDMgKzE1NDEsMzAgQEAKIAlyZXR1cm4ga3ZtX3JlZ2lzdGVyX2RldmljZV9vcHMoJmt2bV9hcm1fdmdpY19pdHNfb3BzLAogCQkJCSAgICAgICBLVk1fREVWX1RZUEVfQVJNX1ZHSUNfSVRTKTsKIH0KKworLyoKKyAqIFJlZ2lzdGVycyBhbGwgSVRTZXMgd2l0aCB0aGUga3ZtX2lvX2J1cyBmcmFtZXdvcmsuCisgKiBUbyBmb2xsb3cgdGhlIGV4aXN0aW5nIFZHSUMgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UsIHRoaXMgaGFzIHRvIGJlCisgKiBkb25lIGFzIGxhdGUgYXMgcG9zc2libGUsIGp1c3QgYmVmb3JlIHRoZSBmaXJzdCBWQ1BVIHJ1bnMuCisgKi8KK2ludCB2Z2ljX3JlZ2lzdGVyX2l0c19pb2RldnMoc3RydWN0IGt2bSAqa3ZtKQoreworCXN0cnVjdCBrdm1fZGV2aWNlICpkZXY7CisJaW50IHJldCA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmt2bS0+ZGV2aWNlcywgdm1fbm9kZSkgeworCQlpZiAoZGV2LT5vcHMgIT0gJmt2bV9hcm1fdmdpY19pdHNfb3BzKQorCQkJY29udGludWU7CisKKwkJcmV0ID0gdmdpY19yZWdpc3Rlcl9pdHNfaW9kZXYoa3ZtLCBkZXYtPnByaXZhdGUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJLyoKKwkJICogV2UgZG9uJ3QgbmVlZCB0byBjYXJlIGFib3V0IHRlYXJpbmcgZG93biBwcmV2aW91c2x5CisJCSAqIHJlZ2lzdGVyZWQgSVRTZXMsIGFzIHRoZSBrdm1faW9fYnVzIGZyYW1ld29yayByZW1vdmVzCisJCSAqIHRoZW0gZm9yIHVzIGlmIHRoZSBWTSBnZXRzIGRlc3Ryb3llZC4KKwkJICovCisJfQorCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMta3ZtLWRldmljZS5jIGIvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy1rdm0tZGV2aWNlLmMKaW5kZXggMTgxM2Y5My4uY2UxZjRlZCAxMDA2NDQKLS0tIGEvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy1rdm0tZGV2aWNlLmMKKysrIGIvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy1rdm0tZGV2aWNlLmMKQEAgLTcxLDcgKzcxLDYgQEAKIAkJYWRkcl9wdHIgPSAmdmdpYy0+dmdpY19jcHVfYmFzZTsKIAkJYWxpZ25tZW50ID0gU1pfNEs7CiAJCWJyZWFrOwotI2lmZGVmIENPTkZJR19LVk1fQVJNX1ZHSUNfVjMKIAljYXNlIEtWTV9WR0lDX1YzX0FERFJfVFlQRV9ESVNUOgogCQl0eXBlX25lZWRlZCA9IEtWTV9ERVZfVFlQRV9BUk1fVkdJQ19WMzsKIAkJYWRkcl9wdHIgPSAmdmdpYy0+dmdpY19kaXN0X2Jhc2U7CkBAIC04Miw3ICs4MSw2IEBACiAJCWFkZHJfcHRyID0gJnZnaWMtPnZnaWNfcmVkaXN0X2Jhc2U7CiAJCWFsaWdubWVudCA9IFNaXzY0SzsKIAkJYnJlYWs7Ci0jZW5kaWYKIAlkZWZhdWx0OgogCQlyID0gLUVOT0RFVjsKIAkJZ290byBvdXQ7CkBAIC0yMTksNTIgKzIxNyw2NSBAQAogCQlyZXQgPSBrdm1fcmVnaXN0ZXJfZGV2aWNlX29wcygma3ZtX2FybV92Z2ljX3YyX29wcywKIAkJCQkJICAgICAgS1ZNX0RFVl9UWVBFX0FSTV9WR0lDX1YyKTsKIAkJYnJlYWs7Ci0jaWZkZWYgQ09ORklHX0tWTV9BUk1fVkdJQ19WMwogCWNhc2UgS1ZNX0RFVl9UWVBFX0FSTV9WR0lDX1YzOgogCQlyZXQgPSBrdm1fcmVnaXN0ZXJfZGV2aWNlX29wcygma3ZtX2FybV92Z2ljX3YzX29wcywKIAkJCQkJICAgICAgS1ZNX0RFVl9UWVBFX0FSTV9WR0lDX1YzKTsKKworI2lmZGVmIENPTkZJR19LVk1fQVJNX1ZHSUNfVjNfSVRTCiAJCWlmIChyZXQpCiAJCQlicmVhazsKIAkJcmV0ID0ga3ZtX3ZnaWNfcmVnaXN0ZXJfaXRzX2RldmljZSgpOwotCQlicmVhazsKICNlbmRpZgorCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiogdmdpY19hdHRyX3JlZ3NfYWNjZXNzOiBhbGxvd3MgdXNlciBzcGFjZSB0byByZWFkL3dyaXRlIFZHSUMgcmVnaXN0ZXJzCi0gKgotICogQGRldjoga3ZtIGRldmljZSBoYW5kbGUKLSAqIEBhdHRyOiBrdm0gZGV2aWNlIGF0dHJpYnV0ZQotICogQHJlZzogYWRkcmVzcyB0aGUgdmFsdWUgaXMgcmVhZCBvciB3cml0dGVuCi0gKiBAaXNfd3JpdGU6IHdyaXRlIGZsYWcKLSAqCi0gKi8KLXN0YXRpYyBpbnQgdmdpY19hdHRyX3JlZ3NfYWNjZXNzKHN0cnVjdCBrdm1fZGV2aWNlICpkZXYsCi0JCQkJIHN0cnVjdCBrdm1fZGV2aWNlX2F0dHIgKmF0dHIsCi0JCQkJIHUzMiAqcmVnLCBib29sIGlzX3dyaXRlKQoteworc3RydWN0IHZnaWNfcmVnX2F0dHIgeworCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTsKIAlncGFfdCBhZGRyOwotCWludCBjcHVpZCwgcmV0LCBjOwotCXN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgKnRtcF92Y3B1OwotCWludCB2Y3B1X2xvY2tfaWR4ID0gLTE7Cit9OworCitzdGF0aWMgaW50IHBhcnNlX3ZnaWNfdjJfYXR0cihzdHJ1Y3Qga3ZtX2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGt2bV9kZXZpY2VfYXR0ciAqYXR0ciwKKwkJCSAgICAgIHN0cnVjdCB2Z2ljX3JlZ19hdHRyICpyZWdfYXR0cikKK3sKKwlpbnQgY3B1aWQ7CiAKIAljcHVpZCA9IChhdHRyLT5hdHRyICYgS1ZNX0RFVl9BUk1fVkdJQ19DUFVJRF9NQVNLKSA+PgogCQkgS1ZNX0RFVl9BUk1fVkdJQ19DUFVJRF9TSElGVDsKLQl2Y3B1ID0ga3ZtX2dldF92Y3B1KGRldi0+a3ZtLCBjcHVpZCk7Ci0JYWRkciA9IGF0dHItPmF0dHIgJiBLVk1fREVWX0FSTV9WR0lDX09GRlNFVF9NQVNLOwogCi0JbXV0ZXhfbG9jaygmZGV2LT5rdm0tPmxvY2spOworCWlmIChjcHVpZCA+PSBhdG9taWNfcmVhZCgmZGV2LT5rdm0tPm9ubGluZV92Y3B1cykpCisJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0ID0gdmdpY19pbml0KGRldi0+a3ZtKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKKwlyZWdfYXR0ci0+dmNwdSA9IGt2bV9nZXRfdmNwdShkZXYtPmt2bSwgY3B1aWQpOworCXJlZ19hdHRyLT5hZGRyID0gYXR0ci0+YXR0ciAmIEtWTV9ERVZfQVJNX1ZHSUNfT0ZGU0VUX01BU0s7CiAKLQlpZiAoY3B1aWQgPj0gYXRvbWljX3JlYWQoJmRldi0+a3ZtLT5vbmxpbmVfdmNwdXMpKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OworCXJldHVybiAwOworfQorCisvKiB1bmxvY2tzIHZjcHVzIGZyb20gQHZjcHVfbG9ja19pZHggYW5kIHNtYWxsZXIgKi8KK3N0YXRpYyB2b2lkIHVubG9ja192Y3B1cyhzdHJ1Y3Qga3ZtICprdm0sIGludCB2Y3B1X2xvY2tfaWR4KQoreworCXN0cnVjdCBrdm1fdmNwdSAqdG1wX3ZjcHU7CisKKwlmb3IgKDsgdmNwdV9sb2NrX2lkeCA+PSAwOyB2Y3B1X2xvY2tfaWR4LS0pIHsKKwkJdG1wX3ZjcHUgPSBrdm1fZ2V0X3ZjcHUoa3ZtLCB2Y3B1X2xvY2tfaWR4KTsKKwkJbXV0ZXhfdW5sb2NrKCZ0bXBfdmNwdS0+bXV0ZXgpOwogCX0KK30KKworc3RhdGljIHZvaWQgdW5sb2NrX2FsbF92Y3B1cyhzdHJ1Y3Qga3ZtICprdm0pCit7CisJdW5sb2NrX3ZjcHVzKGt2bSwgYXRvbWljX3JlYWQoJmt2bS0+b25saW5lX3ZjcHVzKSAtIDEpOworfQorCisvKiBSZXR1cm5zIHRydWUgaWYgYWxsIHZjcHVzIHdlcmUgbG9ja2VkLCBmYWxzZSBvdGhlcndpc2UgKi8KK3N0YXRpYyBib29sIGxvY2tfYWxsX3ZjcHVzKHN0cnVjdCBrdm0gKmt2bSkKK3sKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnRtcF92Y3B1OworCWludCBjOwogCiAJLyoKIAkgKiBBbnkgdGltZSBhIHZjcHUgaXMgcnVuLCB2Y3B1X2xvYWQgaXMgY2FsbGVkIHdoaWNoIHRyaWVzIHRvIGdyYWIgdGhlCkBAIC0yNzIsMTEgKzI4Myw0OSBAQAogCSAqIHRoYXQgbm8gb3RoZXIgVkNQVXMgYXJlIHJ1biBhbmQgZmlkZGxlIHdpdGggdGhlIHZnaWMgc3RhdGUgd2hpbGUgd2UKIAkgKiBhY2Nlc3MgaXQuCiAJICovCi0JcmV0ID0gLUVCVVNZOwotCWt2bV9mb3JfZWFjaF92Y3B1KGMsIHRtcF92Y3B1LCBkZXYtPmt2bSkgewotCQlpZiAoIW11dGV4X3RyeWxvY2soJnRtcF92Y3B1LT5tdXRleCkpCi0JCQlnb3RvIG91dDsKLQkJdmNwdV9sb2NrX2lkeCA9IGM7CisJa3ZtX2Zvcl9lYWNoX3ZjcHUoYywgdG1wX3ZjcHUsIGt2bSkgeworCQlpZiAoIW11dGV4X3RyeWxvY2soJnRtcF92Y3B1LT5tdXRleCkpIHsKKwkJCXVubG9ja192Y3B1cyhrdm0sIGMgLSAxKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCXJldHVybiB0cnVlOworfQorCisvKioKKyAqIHZnaWNfYXR0cl9yZWdzX2FjY2Vzc192MiAtIGFsbG93cyB1c2VyIHNwYWNlIHRvIGFjY2VzcyBWR0lDIHYyIHN0YXRlCisgKgorICogQGRldjogICAgICBrdm0gZGV2aWNlIGhhbmRsZQorICogQGF0dHI6ICAgICBrdm0gZGV2aWNlIGF0dHJpYnV0ZQorICogQHJlZzogICAgICBhZGRyZXNzIHRoZSB2YWx1ZSBpcyByZWFkIG9yIHdyaXR0ZW4KKyAqIEBpc193cml0ZTogdHJ1ZSBpZiB1c2Vyc3BhY2UgaXMgd3JpdGluZyBhIHJlZ2lzdGVyCisgKi8KK3N0YXRpYyBpbnQgdmdpY19hdHRyX3JlZ3NfYWNjZXNzX3YyKHN0cnVjdCBrdm1fZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBrdm1fZGV2aWNlX2F0dHIgKmF0dHIsCisJCQkJICAgIHUzMiAqcmVnLCBib29sIGlzX3dyaXRlKQoreworCXN0cnVjdCB2Z2ljX3JlZ19hdHRyIHJlZ19hdHRyOworCWdwYV90IGFkZHI7CisJc3RydWN0IGt2bV92Y3B1ICp2Y3B1OworCWludCByZXQ7CisKKwlyZXQgPSBwYXJzZV92Z2ljX3YyX2F0dHIoZGV2LCBhdHRyLCAmcmVnX2F0dHIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl2Y3B1ID0gcmVnX2F0dHIudmNwdTsKKwlhZGRyID0gcmVnX2F0dHIuYWRkcjsKKworCW11dGV4X2xvY2soJmRldi0+a3ZtLT5sb2NrKTsKKworCXJldCA9IHZnaWNfaW5pdChkZXYtPmt2bSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlpZiAoIWxvY2tfYWxsX3ZjcHVzKGRldi0+a3ZtKSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OwogCX0KIAogCXN3aXRjaCAoYXR0ci0+Z3JvdXApIHsKQEAgLTI5MSwxOCArMzQwLDEyIEBACiAJCWJyZWFrOwogCX0KIAorCXVubG9ja19hbGxfdmNwdXMoZGV2LT5rdm0pOwogb3V0OgotCWZvciAoOyB2Y3B1X2xvY2tfaWR4ID49IDA7IHZjcHVfbG9ja19pZHgtLSkgewotCQl0bXBfdmNwdSA9IGt2bV9nZXRfdmNwdShkZXYtPmt2bSwgdmNwdV9sb2NrX2lkeCk7Ci0JCW11dGV4X3VubG9jaygmdG1wX3ZjcHUtPm11dGV4KTsKLQl9Ci0KIAltdXRleF91bmxvY2soJmRldi0+a3ZtLT5sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBWMiBvcHMgKi8KLQogc3RhdGljIGludCB2Z2ljX3YyX3NldF9hdHRyKHN0cnVjdCBrdm1fZGV2aWNlICpkZXYsCiAJCQkgICAgc3RydWN0IGt2bV9kZXZpY2VfYXR0ciAqYXR0cikKIHsKQEAgLTMyMSw3ICszNjQsNyBAQAogCQlpZiAoZ2V0X3VzZXIocmVnLCB1YWRkcikpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAotCQlyZXR1cm4gdmdpY19hdHRyX3JlZ3NfYWNjZXNzKGRldiwgYXR0ciwgJnJlZywgdHJ1ZSk7CisJCXJldHVybiB2Z2ljX2F0dHJfcmVnc19hY2Nlc3NfdjIoZGV2LCBhdHRyLCAmcmVnLCB0cnVlKTsKIAl9CiAJfQogCkBAIC0zNDMsNyArMzg2LDcgQEAKIAkJdTMyIF9fdXNlciAqdWFkZHIgPSAodTMyIF9fdXNlciAqKShsb25nKWF0dHItPmFkZHI7CiAJCXUzMiByZWcgPSAwOwogCi0JCXJldCA9IHZnaWNfYXR0cl9yZWdzX2FjY2VzcyhkZXYsIGF0dHIsICZyZWcsIGZhbHNlKTsKKwkJcmV0ID0gdmdpY19hdHRyX3JlZ3NfYWNjZXNzX3YyKGRldiwgYXR0ciwgJnJlZywgZmFsc2UpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAkJcmV0dXJuIHB1dF91c2VyKHJlZywgdWFkZHIpOwpAQCAtMzg3LDEwICs0MzAsNiBAQAogCS5oYXNfYXR0ciA9IHZnaWNfdjJfaGFzX2F0dHIsCiB9OwogCi0vKiBWMyBvcHMgKi8KLQotI2lmZGVmIENPTkZJR19LVk1fQVJNX1ZHSUNfVjMKLQogc3RhdGljIGludCB2Z2ljX3YzX3NldF9hdHRyKHN0cnVjdCBrdm1fZGV2aWNlICpkZXYsCiAJCQkgICAgc3RydWN0IGt2bV9kZXZpY2VfYXR0ciAqYXR0cikKIHsKQEAgLTQzMyw1ICs0NzIsMyBAQAogCS5nZXRfYXR0ciA9IHZnaWNfdjNfZ2V0X2F0dHIsCiAJLmhhc19hdHRyID0gdmdpY192M19oYXNfYXR0ciwKIH07Ci0KLSNlbmRpZiAvKiBDT05GSUdfS1ZNX0FSTV9WR0lDX1YzICovCmRpZmYgLS1naXQgYS92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLW1taW8tdjMuYyBiL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMtbW1pby12My5jCmluZGV4IGZmNjY4ZTAuLjBkM2M3NmEgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMtbW1pby12My5jCisrKyBiL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMtbW1pby12My5jCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSAidmdpYy1tbWlvLmgiCiAKIC8qIGV4dHJhY3QgQG51bSBieXRlcyBhdCBAb2Zmc2V0IGJ5dGVzIG9mZnNldCBpbiBkYXRhICovCi11bnNpZ25lZCBsb25nIGV4dHJhY3RfYnl0ZXModW5zaWduZWQgbG9uZyBkYXRhLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAordW5zaWduZWQgbG9uZyBleHRyYWN0X2J5dGVzKHU2NCBkYXRhLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAogCQkJICAgIHVuc2lnbmVkIGludCBudW0pCiB7CiAJcmV0dXJuIChkYXRhID4+IChvZmZzZXQgKiA4KSkgJiBHRU5NQVNLX1VMTChudW0gKiA4IC0gMSwgMCk7CkBAIC00Miw2ICs0Miw3IEBACiAJcmV0dXJuIHJlZyB8ICgodTY0KXZhbCA8PCBsb3dlcik7CiB9CiAKKyNpZmRlZiBDT05GSUdfS1ZNX0FSTV9WR0lDX1YzX0lUUwogYm9vbCB2Z2ljX2hhc19pdHMoc3RydWN0IGt2bSAqa3ZtKQogewogCXN0cnVjdCB2Z2ljX2Rpc3QgKmRpc3QgPSAma3ZtLT5hcmNoLnZnaWM7CkBAIC01MSw2ICs1Miw3IEBACiAKIAlyZXR1cm4gZGlzdC0+aGFzX2l0czsKIH0KKyNlbmRpZgogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyB2Z2ljX21taW9fcmVhZF92M19taXNjKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKIAkJCQkJICAgIGdwYV90IGFkZHIsIHVuc2lnbmVkIGludCBsZW4pCkBAIC0xNzksNyArMTgxLDcgQEAKIAlpbnQgdGFyZ2V0X3ZjcHVfaWQgPSB2Y3B1LT52Y3B1X2lkOwogCXU2NCB2YWx1ZTsKIAotCXZhbHVlID0gKG1waWRyICYgR0VOTUFTSygyMywgMCkpIDw8IDMyOworCXZhbHVlID0gKHU2NCkobXBpZHIgJiBHRU5NQVNLKDIzLCAwKSkgPDwgMzI7CiAJdmFsdWUgfD0gKCh0YXJnZXRfdmNwdV9pZCAmIDB4ZmZmZikgPDwgOCk7CiAJaWYgKHRhcmdldF92Y3B1X2lkID09IGF0b21pY19yZWFkKCZ2Y3B1LT5rdm0tPm9ubGluZV92Y3B1cykgLSAxKQogCQl2YWx1ZSB8PSBHSUNSX1RZUEVSX0xBU1Q7CkBAIC0zMDYsMTYgKzMwOCwxOSBAQAogewogCXN0cnVjdCB2Z2ljX2Rpc3QgKmRpc3QgPSAmdmNwdS0+a3ZtLT5hcmNoLnZnaWM7CiAJc3RydWN0IHZnaWNfY3B1ICp2Z2ljX2NwdSA9ICZ2Y3B1LT5hcmNoLnZnaWNfY3B1OwotCXU2NCBwcm9wYmFzZXIgPSBkaXN0LT5wcm9wYmFzZXI7CisJdTY0IG9sZF9wcm9wYmFzZXIsIHByb3BiYXNlcjsKIAogCS8qIFN0b3JpbmcgYSB2YWx1ZSB3aXRoIExQSXMgYWxyZWFkeSBlbmFibGVkIGlzIHVuZGVmaW5lZCAqLwogCWlmICh2Z2ljX2NwdS0+bHBpc19lbmFibGVkKQogCQlyZXR1cm47CiAKLQlwcm9wYmFzZXIgPSB1cGRhdGVfNjRiaXRfcmVnKHByb3BiYXNlciwgYWRkciAmIDQsIGxlbiwgdmFsKTsKLQlwcm9wYmFzZXIgPSB2Z2ljX3Nhbml0aXNlX3Byb3BiYXNlcihwcm9wYmFzZXIpOwotCi0JZGlzdC0+cHJvcGJhc2VyID0gcHJvcGJhc2VyOworCWRvIHsKKwkJb2xkX3Byb3BiYXNlciA9IGRpc3QtPnByb3BiYXNlcjsKKwkJcHJvcGJhc2VyID0gb2xkX3Byb3BiYXNlcjsKKwkJcHJvcGJhc2VyID0gdXBkYXRlXzY0Yml0X3JlZyhwcm9wYmFzZXIsIGFkZHIgJiA0LCBsZW4sIHZhbCk7CisJCXByb3BiYXNlciA9IHZnaWNfc2FuaXRpc2VfcHJvcGJhc2VyKHByb3BiYXNlcik7CisJfSB3aGlsZSAoY21weGNoZzY0KCZkaXN0LT5wcm9wYmFzZXIsIG9sZF9wcm9wYmFzZXIsCisJCQkgICBwcm9wYmFzZXIpICE9IG9sZF9wcm9wYmFzZXIpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyB2Z2ljX21taW9fcmVhZF9wZW5kYmFzZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCkBAIC0zMzEsMTYgKzMzNiwxOSBAQAogCQkJCSAgICAgdW5zaWduZWQgbG9uZyB2YWwpCiB7CiAJc3RydWN0IHZnaWNfY3B1ICp2Z2ljX2NwdSA9ICZ2Y3B1LT5hcmNoLnZnaWNfY3B1OwotCXU2NCBwZW5kYmFzZXIgPSB2Z2ljX2NwdS0+cGVuZGJhc2VyOworCXU2NCBvbGRfcGVuZGJhc2VyLCBwZW5kYmFzZXI7CiAKIAkvKiBTdG9yaW5nIGEgdmFsdWUgd2l0aCBMUElzIGFscmVhZHkgZW5hYmxlZCBpcyB1bmRlZmluZWQgKi8KIAlpZiAodmdpY19jcHUtPmxwaXNfZW5hYmxlZCkKIAkJcmV0dXJuOwogCi0JcGVuZGJhc2VyID0gdXBkYXRlXzY0Yml0X3JlZyhwZW5kYmFzZXIsIGFkZHIgJiA0LCBsZW4sIHZhbCk7Ci0JcGVuZGJhc2VyID0gdmdpY19zYW5pdGlzZV9wZW5kYmFzZXIocGVuZGJhc2VyKTsKLQotCXZnaWNfY3B1LT5wZW5kYmFzZXIgPSBwZW5kYmFzZXI7CisJZG8geworCQlvbGRfcGVuZGJhc2VyID0gdmdpY19jcHUtPnBlbmRiYXNlcjsKKwkJcGVuZGJhc2VyID0gb2xkX3BlbmRiYXNlcjsKKwkJcGVuZGJhc2VyID0gdXBkYXRlXzY0Yml0X3JlZyhwZW5kYmFzZXIsIGFkZHIgJiA0LCBsZW4sIHZhbCk7CisJCXBlbmRiYXNlciA9IHZnaWNfc2FuaXRpc2VfcGVuZGJhc2VyKHBlbmRiYXNlcik7CisJfSB3aGlsZSAoY21weGNoZzY0KCZ2Z2ljX2NwdS0+cGVuZGJhc2VyLCBvbGRfcGVuZGJhc2VyLAorCQkJICAgcGVuZGJhc2VyKSAhPSBvbGRfcGVuZGJhc2VyKTsKIH0KIAogLyoKQEAgLTYwMyw3ICs2MTEsNyBAQAogCWJvb2wgYnJvYWRjYXN0OwogCiAJc2dpID0gKHJlZyAmIElDQ19TR0kxUl9TR0lfSURfTUFTSykgPj4gSUNDX1NHSTFSX1NHSV9JRF9TSElGVDsKLQlicm9hZGNhc3QgPSByZWcgJiBCSVQoSUNDX1NHSTFSX0lSUV9ST1VUSU5HX01PREVfQklUKTsKKwlicm9hZGNhc3QgPSByZWcgJiBCSVRfVUxMKElDQ19TR0kxUl9JUlFfUk9VVElOR19NT0RFX0JJVCk7CiAJdGFyZ2V0X2NwdXMgPSAocmVnICYgSUNDX1NHSTFSX1RBUkdFVF9MSVNUX01BU0spID4+IElDQ19TR0kxUl9UQVJHRVRfTElTVF9TSElGVDsKIAltcGlkciA9IFNHSV9BRkZJTklUWV9MRVZFTChyZWcsIDMpOwogCW1waWRyIHw9IFNHSV9BRkZJTklUWV9MRVZFTChyZWcsIDIpOwpkaWZmIC0tZ2l0IGEvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy1tbWlvLmMgYi92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLW1taW8uYwppbmRleCAzYmFkM2M1Li5lMThiMzBkIDEwMDY0NAotLS0gYS92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLW1taW8uYworKysgYi92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLW1taW8uYwpAQCAtNTUwLDExICs1NTAsOSBAQAogCWNhc2UgVkdJQ19WMjoKIAkJbGVuID0gdmdpY192Ml9pbml0X2Rpc3RfaW9kZXYoaW9fZGV2aWNlKTsKIAkJYnJlYWs7Ci0jaWZkZWYgQ09ORklHX0tWTV9BUk1fVkdJQ19WMwogCWNhc2UgVkdJQ19WMzoKIAkJbGVuID0gdmdpY192M19pbml0X2Rpc3RfaW9kZXYoaW9fZGV2aWNlKTsKIAkJYnJlYWs7Ci0jZW5kaWYKIAlkZWZhdWx0OgogCQlCVUdfT04oMSk7CiAJfQpkaWZmIC0tZ2l0IGEvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy1tbWlvLmggYi92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLW1taW8uaAppbmRleCAwYjNlY2Y5Li40YzM0ZDM5IDEwMDY0NAotLS0gYS92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLW1taW8uaAorKysgYi92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLW1taW8uaApAQCAtOTYsNyArOTYsNyBAQAogdm9pZCB2Z2ljX2RhdGFfaG9zdF90b19tbWlvX2J1cyh2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4sCiAJCQkJdW5zaWduZWQgbG9uZyBkYXRhKTsKIAotdW5zaWduZWQgbG9uZyBleHRyYWN0X2J5dGVzKHVuc2lnbmVkIGxvbmcgZGF0YSwgdW5zaWduZWQgaW50IG9mZnNldCwKK3Vuc2lnbmVkIGxvbmcgZXh0cmFjdF9ieXRlcyh1NjQgZGF0YSwgdW5zaWduZWQgaW50IG9mZnNldCwKIAkJCSAgICB1bnNpZ25lZCBpbnQgbnVtKTsKIAogdTY0IHVwZGF0ZV82NGJpdF9yZWcodTY0IHJlZywgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGxlbiwKQEAgLTE2MiwxMiArMTYyLDEwIEBACiAKIHVuc2lnbmVkIGludCB2Z2ljX3YzX2luaXRfZGlzdF9pb2RldihzdHJ1Y3QgdmdpY19pb19kZXZpY2UgKmRldik7CiAKLSNpZmRlZiBDT05GSUdfS1ZNX0FSTV9WR0lDX1YzCiB1NjQgdmdpY19zYW5pdGlzZV9vdXRlcl9jYWNoZWFiaWxpdHkodTY0IHJlZyk7CiB1NjQgdmdpY19zYW5pdGlzZV9pbm5lcl9jYWNoZWFiaWxpdHkodTY0IHJlZyk7CiB1NjQgdmdpY19zYW5pdGlzZV9zaGFyZWFiaWxpdHkodTY0IHJlZyk7CiB1NjQgdmdpY19zYW5pdGlzZV9maWVsZCh1NjQgcmVnLCB1NjQgZmllbGRfbWFzaywgaW50IGZpZWxkX3NoaWZ0LAogCQkJdTY0ICgqc2FuaXRpc2VfZm4pKHU2NCkpOwotI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy12Mi5jIGIvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy12Mi5jCmluZGV4IDBiZjY3MDkuLjBhMDYzYWYgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMtdjIuYworKysgYi92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLXYyLmMKQEAgLTI3OCwxMiArMjc4LDE0IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IGt2bV9waHlzX2FkZHJfaW9yZW1hcChrdm0sIGRpc3QtPnZnaWNfY3B1X2Jhc2UsCi0JCQkJICAgIGt2bV92Z2ljX2dsb2JhbF9zdGF0ZS52Y3B1X2Jhc2UsCi0JCQkJICAgIEtWTV9WR0lDX1YyX0NQVV9TSVpFLCB0cnVlKTsKLQlpZiAocmV0KSB7Ci0JCWt2bV9lcnIoIlVuYWJsZSB0byByZW1hcCBWR0lDIENQVSB0byBWQ1BVXG4iKTsKLQkJZ290byBvdXQ7CisJaWYgKCFzdGF0aWNfYnJhbmNoX3VubGlrZWx5KCZ2Z2ljX3YyX2NwdWlmX3RyYXApKSB7CisJCXJldCA9IGt2bV9waHlzX2FkZHJfaW9yZW1hcChrdm0sIGRpc3QtPnZnaWNfY3B1X2Jhc2UsCisJCQkJCSAgICBrdm1fdmdpY19nbG9iYWxfc3RhdGUudmNwdV9iYXNlLAorCQkJCQkgICAgS1ZNX1ZHSUNfVjJfQ1BVX1NJWkUsIHRydWUpOworCQlpZiAocmV0KSB7CisJCQlrdm1fZXJyKCJVbmFibGUgdG8gcmVtYXAgVkdJQyBDUFUgdG8gVkNQVVxuIik7CisJCQlnb3RvIG91dDsKKwkJfQogCX0KIAogCWRpc3QtPnJlYWR5ID0gdHJ1ZTsKQEAgLTI5NCw2ICsyOTYsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKK0RFRklORV9TVEFUSUNfS0VZX0ZBTFNFKHZnaWNfdjJfY3B1aWZfdHJhcCk7CisKIC8qKgogICogdmdpY192Ml9wcm9iZSAtIHByb2JlIGZvciBhIEdJQ3YyIGNvbXBhdGlibGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgaW4gRFQKICAqIEBub2RlOglwb2ludGVyIHRvIHRoZSBEVCBub2RlCkBAIC0zMTAsNDUgKzMxNCw1MSBAQAogCQlyZXR1cm4gLUVOWElPOwogCX0KIAotCWlmICghUEFHRV9BTElHTkVEKGluZm8tPnZjcHUuc3RhcnQpKSB7Ci0JCWt2bV9lcnIoIkdJQ1YgcGh5c2ljYWwgYWRkcmVzcyAweCVsbHggbm90IHBhZ2UgYWxpZ25lZFxuIiwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaW5mby0+dmNwdS5zdGFydCk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQorCWlmICghUEFHRV9BTElHTkVEKGluZm8tPnZjcHUuc3RhcnQpIHx8CisJICAgICFQQUdFX0FMSUdORUQocmVzb3VyY2Vfc2l6ZSgmaW5mby0+dmNwdSkpKSB7CisJCWt2bV9pbmZvKCJHSUNWIHJlZ2lvbiBzaXplL2FsaWdubWVudCBpcyB1bnNhZmUsIHVzaW5nIHRyYXBwaW5nIChyZWR1Y2VkIHBlcmZvcm1hbmNlKVxuIik7CisJCWt2bV92Z2ljX2dsb2JhbF9zdGF0ZS52Y3B1X2Jhc2VfdmEgPSBpb3JlbWFwKGluZm8tPnZjcHUuc3RhcnQsCisJCQkJCQkJICAgICByZXNvdXJjZV9zaXplKCZpbmZvLT52Y3B1KSk7CisJCWlmICgha3ZtX3ZnaWNfZ2xvYmFsX3N0YXRlLnZjcHVfYmFzZV92YSkgeworCQkJa3ZtX2VycigiQ2Fubm90IGlvcmVtYXAgR0lDVlxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQogCi0JaWYgKCFQQUdFX0FMSUdORUQocmVzb3VyY2Vfc2l6ZSgmaW5mby0+dmNwdSkpKSB7Ci0JCWt2bV9lcnIoIkdJQ1Ygc2l6ZSAweCVsbHggbm90IGEgbXVsdGlwbGUgb2YgcGFnZSBzaXplIDB4JWx4XG4iLAotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylyZXNvdXJjZV9zaXplKCZpbmZvLT52Y3B1KSwKLQkJCVBBR0VfU0laRSk7Ci0JCXJldHVybiAtRU5YSU87CisJCXJldCA9IGNyZWF0ZV9oeXBfaW9fbWFwcGluZ3Moa3ZtX3ZnaWNfZ2xvYmFsX3N0YXRlLnZjcHVfYmFzZV92YSwKKwkJCQkJICAgICBrdm1fdmdpY19nbG9iYWxfc3RhdGUudmNwdV9iYXNlX3ZhICsgcmVzb3VyY2Vfc2l6ZSgmaW5mby0+dmNwdSksCisJCQkJCSAgICAgaW5mby0+dmNwdS5zdGFydCk7CisJCWlmIChyZXQpIHsKKwkJCWt2bV9lcnIoIkNhbm5vdCBtYXAgR0lDViBpbnRvIGh5cFxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXN0YXRpY19icmFuY2hfZW5hYmxlKCZ2Z2ljX3YyX2NwdWlmX3RyYXApOwogCX0KIAogCWt2bV92Z2ljX2dsb2JhbF9zdGF0ZS52Y3RybF9iYXNlID0gaW9yZW1hcChpbmZvLT52Y3RybC5zdGFydCwKIAkJCQkJCSAgIHJlc291cmNlX3NpemUoJmluZm8tPnZjdHJsKSk7CiAJaWYgKCFrdm1fdmdpY19nbG9iYWxfc3RhdGUudmN0cmxfYmFzZSkgewogCQlrdm1fZXJyKCJDYW5ub3QgaW9yZW1hcCBHSUNIXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OwogCX0KIAogCXZ0ciA9IHJlYWRsX3JlbGF4ZWQoa3ZtX3ZnaWNfZ2xvYmFsX3N0YXRlLnZjdHJsX2Jhc2UgKyBHSUNIX1ZUUik7CiAJa3ZtX3ZnaWNfZ2xvYmFsX3N0YXRlLm5yX2xyID0gKHZ0ciAmIDB4M2YpICsgMTsKIAotCXJldCA9IGt2bV9yZWdpc3Rlcl92Z2ljX2RldmljZShLVk1fREVWX1RZUEVfQVJNX1ZHSUNfVjIpOwotCWlmIChyZXQpIHsKLQkJa3ZtX2VycigiQ2Fubm90IHJlZ2lzdGVyIEdJQ3YyIEtWTSBkZXZpY2VcbiIpOwotCQlpb3VubWFwKGt2bV92Z2ljX2dsb2JhbF9zdGF0ZS52Y3RybF9iYXNlKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlyZXQgPSBjcmVhdGVfaHlwX2lvX21hcHBpbmdzKGt2bV92Z2ljX2dsb2JhbF9zdGF0ZS52Y3RybF9iYXNlLAogCQkJCSAgICAga3ZtX3ZnaWNfZ2xvYmFsX3N0YXRlLnZjdHJsX2Jhc2UgKwogCQkJCQkgcmVzb3VyY2Vfc2l6ZSgmaW5mby0+dmN0cmwpLAogCQkJCSAgICAgaW5mby0+dmN0cmwuc3RhcnQpOwogCWlmIChyZXQpIHsKIAkJa3ZtX2VycigiQ2Fubm90IG1hcCBWQ1RSTCBpbnRvIGh5cFxuIik7Ci0JCWt2bV91bnJlZ2lzdGVyX2RldmljZV9vcHMoS1ZNX0RFVl9UWVBFX0FSTV9WR0lDX1YyKTsKLQkJaW91bm1hcChrdm1fdmdpY19nbG9iYWxfc3RhdGUudmN0cmxfYmFzZSk7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IGt2bV9yZWdpc3Rlcl92Z2ljX2RldmljZShLVk1fREVWX1RZUEVfQVJNX1ZHSUNfVjIpOworCWlmIChyZXQpIHsKKwkJa3ZtX2VycigiQ2Fubm90IHJlZ2lzdGVyIEdJQ3YyIEtWTSBkZXZpY2VcbiIpOworCQlnb3RvIG91dDsKIAl9CiAKIAlrdm1fdmdpY19nbG9iYWxfc3RhdGUuY2FuX2VtdWxhdGVfZ2ljdjIgPSB0cnVlOwpAQCAtMzU5LDQgKzM2OSwxMSBAQAogCWt2bV9pbmZvKCJ2Z2ljLXYyQCVsbHhcbiIsIGluZm8tPnZjdHJsLnN0YXJ0KTsKIAogCXJldHVybiAwOworb3V0OgorCWlmIChrdm1fdmdpY19nbG9iYWxfc3RhdGUudmN0cmxfYmFzZSkKKwkJaW91bm1hcChrdm1fdmdpY19nbG9iYWxfc3RhdGUudmN0cmxfYmFzZSk7CisJaWYgKGt2bV92Z2ljX2dsb2JhbF9zdGF0ZS52Y3B1X2Jhc2VfdmEpCisJCWlvdW5tYXAoa3ZtX3ZnaWNfZ2xvYmFsX3N0YXRlLnZjcHVfYmFzZV92YSk7CisKKwlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy12My5jIGIvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy12My5jCmluZGV4IDA1MDY1NDMuLjlmMGRhZTMgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMtdjMuYworKysgYi92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLXYzLmMKQEAgLTI4OSw2ICsyODksMTQgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJaWYgKHZnaWNfaGFzX2l0cyhrdm0pKSB7CisJCXJldCA9IHZnaWNfcmVnaXN0ZXJfaXRzX2lvZGV2cyhrdm0pOworCQlpZiAocmV0KSB7CisJCQlrdm1fZXJyKCJVbmFibGUgdG8gcmVnaXN0ZXIgVkdJQyBJVFMgTU1JTyByZWdpb25zXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCiAJZGlzdC0+cmVhZHkgPSB0cnVlOwogCiBvdXQ6CmRpZmYgLS1naXQgYS92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLmMgYi92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLmMKaW5kZXggZTdhZWFjNy4uMjg5M2Q1YiAxMDA2NDQKLS0tIGEvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy5jCisrKyBiL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMuYwpAQCAtMjksNyArMjksNyBAQAogI2RlZmluZSBERUJVR19TUElOTE9DS19CVUdfT04ocCkKICNlbmRpZgogCi1zdHJ1Y3QgdmdpY19nbG9iYWwgX19zZWN0aW9uKC5oeXAudGV4dCkga3ZtX3ZnaWNfZ2xvYmFsX3N0YXRlOworc3RydWN0IHZnaWNfZ2xvYmFsIF9fc2VjdGlvbiguaHlwLnRleHQpIGt2bV92Z2ljX2dsb2JhbF9zdGF0ZSA9IHsuZ2ljdjNfY3B1aWYgPSBTVEFUSUNfS0VZX0ZBTFNFX0lOSVQsfTsKIAogLyoKICAqIExvY2tpbmcgb3JkZXIgaXMgYWx3YXlzOgpAQCAtMTE3LDE3ICsxMTcsMTcgQEAKIAogdm9pZCB2Z2ljX3B1dF9pcnEoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3QgdmdpY19pcnEgKmlycSkKIHsKLQlzdHJ1Y3QgdmdpY19kaXN0ICpkaXN0OworCXN0cnVjdCB2Z2ljX2Rpc3QgKmRpc3QgPSAma3ZtLT5hcmNoLnZnaWM7CiAKIAlpZiAoaXJxLT5pbnRpZCA8IFZHSUNfTUlOX0xQSSkKIAkJcmV0dXJuOwogCi0JaWYgKCFrcmVmX3B1dCgmaXJxLT5yZWZjb3VudCwgdmdpY19pcnFfcmVsZWFzZSkpCi0JCXJldHVybjsKLQotCWRpc3QgPSAma3ZtLT5hcmNoLnZnaWM7Ci0KIAlzcGluX2xvY2soJmRpc3QtPmxwaV9saXN0X2xvY2spOworCWlmICgha3JlZl9wdXQoJmlycS0+cmVmY291bnQsIHZnaWNfaXJxX3JlbGVhc2UpKSB7CisJCXNwaW5fdW5sb2NrKCZkaXN0LT5scGlfbGlzdF9sb2NrKTsKKwkJcmV0dXJuOworCX07CisKIAlsaXN0X2RlbCgmaXJxLT5scGlfbGlzdCk7CiAJZGlzdC0+bHBpX2xpc3RfY291bnQtLTsKIAlzcGluX3VubG9jaygmZGlzdC0+bHBpX2xpc3RfbG9jayk7CkBAIC02NDUsNiArNjQ1LDkgQEAKIC8qIFN5bmMgYmFjayB0aGUgaGFyZHdhcmUgVkdJQyBzdGF0ZSBpbnRvIG91ciBlbXVsYXRpb24gYWZ0ZXIgYSBndWVzdCdzIHJ1bi4gKi8KIHZvaWQga3ZtX3ZnaWNfc3luY19od3N0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKKwlpZiAodW5saWtlbHkoIXZnaWNfaW5pdGlhbGl6ZWQodmNwdS0+a3ZtKSkpCisJCXJldHVybjsKKwogCXZnaWNfcHJvY2Vzc19tYWludGVuYW5jZV9pbnRlcnJ1cHQodmNwdSk7CiAJdmdpY19mb2xkX2xyX3N0YXRlKHZjcHUpOwogCXZnaWNfcHJ1bmVfYXBfbGlzdCh2Y3B1KTsKQEAgLTY1Myw2ICs2NTYsOSBAQAogLyogRmx1c2ggb3VyIGVtdWxhdGlvbiBzdGF0ZSBpbnRvIHRoZSBHSUMgaGFyZHdhcmUgYmVmb3JlIGVudGVyaW5nIHRoZSBndWVzdC4gKi8KIHZvaWQga3ZtX3ZnaWNfZmx1c2hfaHdzdGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CisJaWYgKHVubGlrZWx5KCF2Z2ljX2luaXRpYWxpemVkKHZjcHUtPmt2bSkpKQorCQlyZXR1cm47CisKIAlzcGluX2xvY2soJnZjcHUtPmFyY2gudmdpY19jcHUuYXBfbGlzdF9sb2NrKTsKIAl2Z2ljX2ZsdXNoX2xyX3N0YXRlKHZjcHUpOwogCXNwaW5fdW5sb2NrKCZ2Y3B1LT5hcmNoLnZnaWNfY3B1LmFwX2xpc3RfbG9jayk7CmRpZmYgLS1naXQgYS92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLmggYi92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLmgKaW5kZXggMWQ4ZTIxZC4uOWQ5ZTAxNCAxMDA2NDQKLS0tIGEvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy5oCisrKyBiL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMuaApAQCAtNzIsNyArNzIsNiBAQAogCWtyZWZfZ2V0KCZpcnEtPnJlZmNvdW50KTsKIH0KIAotI2lmZGVmIENPTkZJR19LVk1fQVJNX1ZHSUNfVjMKIHZvaWQgdmdpY192M19wcm9jZXNzX21haW50ZW5hbmNlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiB2b2lkIHZnaWNfdjNfZm9sZF9scl9zdGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogdm9pZCB2Z2ljX3YzX3BvcHVsYXRlX2xyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IHZnaWNfaXJxICppcnEsIGludCBscik7CkBAIC04NCw1OCArODMsMTUgQEAKIGludCB2Z2ljX3YzX3Byb2JlKGNvbnN0IHN0cnVjdCBnaWNfa3ZtX2luZm8gKmluZm8pOwogaW50IHZnaWNfdjNfbWFwX3Jlc291cmNlcyhzdHJ1Y3Qga3ZtICprdm0pOwogaW50IHZnaWNfcmVnaXN0ZXJfcmVkaXN0X2lvZGV2cyhzdHJ1Y3Qga3ZtICprdm0sIGdwYV90IGRpc3RfYmFzZV9hZGRyZXNzKTsKKworI2lmZGVmIENPTkZJR19LVk1fQVJNX1ZHSUNfVjNfSVRTCitpbnQgdmdpY19yZWdpc3Rlcl9pdHNfaW9kZXZzKHN0cnVjdCBrdm0gKmt2bSk7CiBib29sIHZnaWNfaGFzX2l0cyhzdHJ1Y3Qga3ZtICprdm0pOwogaW50IGt2bV92Z2ljX3JlZ2lzdGVyX2l0c19kZXZpY2Uodm9pZCk7CiB2b2lkIHZnaWNfZW5hYmxlX2xwaXMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIGludCB2Z2ljX2l0c19pbmplY3RfbXNpKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tc2kgKm1zaSk7CiAjZWxzZQotc3RhdGljIGlubGluZSB2b2lkIHZnaWNfdjNfcHJvY2Vzc19tYWludGVuYW5jZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB2Z2ljX3YzX2ZvbGRfbHJfc3RhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQotewotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdmdpY192M19wb3B1bGF0ZV9scihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCi0JCQkJICAgICAgIHN0cnVjdCB2Z2ljX2lycSAqaXJxLCBpbnQgbHIpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB2Z2ljX3YzX2NsZWFyX2xyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IGxyKQotewotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdmdpY192M19zZXRfdW5kZXJmbG93KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLX0KLQotc3RhdGljIGlubGluZQotdm9pZCB2Z2ljX3YzX3NldF92bWNyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IHZnaWNfdm1jciAqdm1jcikKLXsKLX0KLQotc3RhdGljIGlubGluZQotdm9pZCB2Z2ljX3YzX2dldF92bWNyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IHZnaWNfdm1jciAqdm1jcikKLXsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHZnaWNfdjNfZW5hYmxlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgdmdpY192M19wcm9iZShjb25zdCBzdHJ1Y3QgZ2ljX2t2bV9pbmZvICppbmZvKQotewotCXJldHVybiAtRU5PREVWOwotfQotCi1zdGF0aWMgaW5saW5lIGludCB2Z2ljX3YzX21hcF9yZXNvdXJjZXMoc3RydWN0IGt2bSAqa3ZtKQotewotCXJldHVybiAtRU5PREVWOwotfQotCi1zdGF0aWMgaW5saW5lIGludCB2Z2ljX3JlZ2lzdGVyX3JlZGlzdF9pb2RldnMoc3RydWN0IGt2bSAqa3ZtLAotCQkJCQkgICAgICBncGFfdCBkaXN0X2Jhc2VfYWRkcmVzcykKK3N0YXRpYyBpbmxpbmUgaW50IHZnaWNfcmVnaXN0ZXJfaXRzX2lvZGV2cyhzdHJ1Y3Qga3ZtICprdm0pCiB7CiAJcmV0dXJuIC1FTk9ERVY7CiB9CmRpZmYgLS1naXQgYS92aXJ0L2t2bS9ldmVudGZkLmMgYi92aXJ0L2t2bS9ldmVudGZkLmMKaW5kZXggZTQ2OWI2MC4uZjM5N2U5YiAxMDA2NDQKLS0tIGEvdmlydC9rdm0vZXZlbnRmZC5jCisrKyBiL3ZpcnQva3ZtL2V2ZW50ZmQuYwpAQCAtNDIsNyArNDIsNiBAQAogCiAjaWZkZWYgQ09ORklHX0hBVkVfS1ZNX0lSUUZECiAKLXN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqaXJxZmRfY2xlYW51cF93cTsKIAogc3RhdGljIHZvaWQKIGlycWZkX2luamVjdChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC0xNjgsNyArMTY3LDcgQEAKIAogCWxpc3RfZGVsX2luaXQoJmlycWZkLT5saXN0KTsKIAotCXF1ZXVlX3dvcmsoaXJxZmRfY2xlYW51cF93cSwgJmlycWZkLT5zaHV0ZG93bik7CisJc2NoZWR1bGVfd29yaygmaXJxZmQtPnNodXRkb3duKTsKIH0KIAogaW50IF9fYXR0cmlidXRlX18oKHdlYWspKSBrdm1fYXJjaF9zZXRfaXJxX2luYXRvbWljKApAQCAtNTU1LDcgKzU1NCw3IEBACiAJICogc28gdGhhdCB3ZSBndWFyYW50ZWUgdGhlcmUgd2lsbCBub3QgYmUgYW55IG1vcmUgaW50ZXJydXB0cyBvbiB0aGlzCiAJICogZ3NpIG9uY2UgdGhpcyBkZWFzc2lnbiBmdW5jdGlvbiByZXR1cm5zLgogCSAqLwotCWZsdXNoX3dvcmtxdWV1ZShpcnFmZF9jbGVhbnVwX3dxKTsKKwlmbHVzaF93b3JrKCZpcnFmZC0+c2h1dGRvd24pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01OTIsNyArNTkxLDcgQEAKIAkgKiBCbG9jayB1bnRpbCB3ZSBrbm93IGFsbCBvdXRzdGFuZGluZyBzaHV0ZG93biBqb2JzIGhhdmUgY29tcGxldGVkCiAJICogc2luY2Ugd2UgZG8gbm90IHRha2UgYSBrdm0qIHJlZmVyZW5jZS4KIAkgKi8KLQlmbHVzaF93b3JrcXVldWUoaXJxZmRfY2xlYW51cF93cSk7CisJZmx1c2hfd29yaygmaXJxZmQtPnNodXRkb3duKTsKIAogfQogCkBAIC02MjIsMjMgKzYyMSw4IEBACiAJc3Bpbl91bmxvY2tfaXJxKCZrdm0tPmlycWZkcy5sb2NrKTsKIH0KIAotLyoKLSAqIGNyZWF0ZSBhIGhvc3Qtd2lkZSB3b3JrcXVldWUgZm9yIGlzc3VpbmcgZGVmZXJyZWQgc2h1dGRvd24gcmVxdWVzdHMKLSAqIGFnZ3JlZ2F0ZWQgZnJvbSBhbGwgdm0qIGluc3RhbmNlcy4gV2UgbmVlZCBvdXIgb3duIGlzb2xhdGVkIHNpbmdsZS10aHJlYWQKLSAqIHF1ZXVlIHRvIHByZXZlbnQgZGVhZGxvY2sgYWdhaW5zdCBmbHVzaGluZyB0aGUgbm9ybWFsIHdvcmstcXVldWUuCi0gKi8KLWludCBrdm1faXJxZmRfaW5pdCh2b2lkKQotewotCWlycWZkX2NsZWFudXBfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgia3ZtLWlycWZkLWNsZWFudXAiKTsKLQlpZiAoIWlycWZkX2NsZWFudXBfd3EpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHZvaWQga3ZtX2lycWZkX2V4aXQodm9pZCkKIHsKLQlkZXN0cm95X3dvcmtxdWV1ZShpcnFmZF9jbGVhbnVwX3dxKTsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS92aXJ0L2t2bS9rdm1fbWFpbi5jIGIvdmlydC9rdm0va3ZtX21haW4uYwppbmRleCAxOTUwNzgyLi44MWRmYzczIDEwMDY0NAotLS0gYS92aXJ0L2t2bS9rdm1fbWFpbi5jCisrKyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMKQEAgLTU1OSw5ICs1NTksMTEgQEAKIAogCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShrdm0tPmRlYnVnZnNfZGVudHJ5KTsKIAotCWZvciAoaSA9IDA7IGkgPCBrdm1fZGVidWdmc19udW1fZW50cmllczsgaSsrKQotCQlrZnJlZShrdm0tPmRlYnVnZnNfc3RhdF9kYXRhW2ldKTsKLQlrZnJlZShrdm0tPmRlYnVnZnNfc3RhdF9kYXRhKTsKKwlpZiAoa3ZtLT5kZWJ1Z2ZzX3N0YXRfZGF0YSkgeworCQlmb3IgKGkgPSAwOyBpIDwga3ZtX2RlYnVnZnNfbnVtX2VudHJpZXM7IGkrKykKKwkJCWtmcmVlKGt2bS0+ZGVidWdmc19zdGF0X2RhdGFbaV0pOworCQlrZnJlZShrdm0tPmRlYnVnZnNfc3RhdF9kYXRhKTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQga3ZtX2NyZWF0ZV92bV9kZWJ1Z2ZzKHN0cnVjdCBrdm0gKmt2bSwgaW50IGZkKQpAQCAtMjM2OSw2ICsyMzcxLDcgQEAKIHsKIAlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUodmNwdS0+ZGVidWdmc19kZW50cnkpOwogCWt2bV9wdXRfa3ZtKHZjcHUtPmt2bSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0yMzkxLDYgKzIzOTQsMzIgQEAKIAlyZXR1cm4gYW5vbl9pbm9kZV9nZXRmZCgia3ZtLXZjcHUiLCAma3ZtX3ZjcHVfZm9wcywgdmNwdSwgT19SRFdSIHwgT19DTE9FWEVDKTsKIH0KIAorc3RhdGljIGludCBrdm1fY3JlYXRlX3ZjcHVfZGVidWdmcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJY2hhciBkaXJfbmFtZVtJVE9BX01BWF9MRU4gKiAyXTsKKwlpbnQgcmV0OworCisJaWYgKCFrdm1fYXJjaF9oYXNfdmNwdV9kZWJ1Z2ZzKCkpCisJCXJldHVybiAwOworCisJaWYgKCFkZWJ1Z2ZzX2luaXRpYWxpemVkKCkpCisJCXJldHVybiAwOworCisJc25wcmludGYoZGlyX25hbWUsIHNpemVvZihkaXJfbmFtZSksICJ2Y3B1JWQiLCB2Y3B1LT52Y3B1X2lkKTsKKwl2Y3B1LT5kZWJ1Z2ZzX2RlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2RpcihkaXJfbmFtZSwKKwkJCQkJCQkJdmNwdS0+a3ZtLT5kZWJ1Z2ZzX2RlbnRyeSk7CisJaWYgKCF2Y3B1LT5kZWJ1Z2ZzX2RlbnRyeSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBrdm1fYXJjaF9jcmVhdGVfdmNwdV9kZWJ1Z2ZzKHZjcHUpOworCWlmIChyZXQgPCAwKSB7CisJCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZSh2Y3B1LT5kZWJ1Z2ZzX2RlbnRyeSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBDcmVhdGVzIHNvbWUgdmlydHVhbCBjcHVzLiAgR29vZCBsdWNrIGNyZWF0aW5nIG1vcmUgdGhhbiBvbmUuCiAgKi8KQEAgLTI0MjMsNiArMjQ1MiwxMCBAQAogCWlmIChyKQogCQlnb3RvIHZjcHVfZGVzdHJveTsKIAorCXIgPSBrdm1fY3JlYXRlX3ZjcHVfZGVidWdmcyh2Y3B1KTsKKwlpZiAocikKKwkJZ290byB2Y3B1X2Rlc3Ryb3k7CisKIAltdXRleF9sb2NrKCZrdm0tPmxvY2spOwogCWlmIChrdm1fZ2V0X3ZjcHVfYnlfaWQoa3ZtLCBpZCkpIHsKIAkJciA9IC1FRVhJU1Q7CkBAIC0yNDU0LDYgKzI0ODcsNyBAQAogCiB1bmxvY2tfdmNwdV9kZXN0cm95OgogCW11dGV4X3VubG9jaygma3ZtLT5sb2NrKTsKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUodmNwdS0+ZGVidWdmc19kZW50cnkpOwogdmNwdV9kZXN0cm95OgogCWt2bV9hcmNoX3ZjcHVfZGVzdHJveSh2Y3B1KTsKIHZjcHVfZGVjcmVtZW50OgpAQCAtMzYxOSw3ICszNjUzLDcgQEAKIHsKIAlzdHJ1Y3Qga3ZtX3N0YXRfZGF0YSAqc3RhdF9kYXRhID0gKHN0cnVjdCBrdm1fc3RhdF9kYXRhICopZGF0YTsKIAotCSp2YWwgPSAqKHUzMiAqKSgodm9pZCAqKXN0YXRfZGF0YS0+a3ZtICsgc3RhdF9kYXRhLT5vZmZzZXQpOworCSp2YWwgPSAqKHVsb25nICopKCh2b2lkICopc3RhdF9kYXRhLT5rdm0gKyBzdGF0X2RhdGEtPm9mZnNldCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM2NDksNyArMzY4Myw3IEBACiAJKnZhbCA9IDA7CiAKIAlrdm1fZm9yX2VhY2hfdmNwdShpLCB2Y3B1LCBzdGF0X2RhdGEtPmt2bSkKLQkJKnZhbCArPSAqKHUzMiAqKSgodm9pZCAqKXZjcHUgKyBzdGF0X2RhdGEtPm9mZnNldCk7CisJCSp2YWwgKz0gKih1NjQgKikoKHZvaWQgKil2Y3B1ICsgc3RhdF9kYXRhLT5vZmZzZXQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zODA3LDEyICszODQxLDcgQEAKIAkgKiBrdm1fYXJjaF9pbml0IG1ha2VzIHN1cmUgdGhlcmUncyBhdCBtb3N0IG9uZSBjYWxsZXIKIAkgKiBmb3IgYXJjaGl0ZWN0dXJlcyB0aGF0IHN1cHBvcnQgbXVsdGlwbGUgaW1wbGVtZW50YXRpb25zLAogCSAqIGxpa2UgaW50ZWwgYW5kIGFtZCBvbiB4ODYuCi0JICoga3ZtX2FyY2hfaW5pdCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUga3ZtX2lycWZkX2luaXQgdG8gYXZvaWQgY3JlYXRpbmcKLQkgKiBjb25mbGljdHMgaW4gY2FzZSBrdm0gaXMgYWxyZWFkeSBzZXR1cCBmb3IgYW5vdGhlciBpbXBsZW1lbnRhdGlvbi4KIAkgKi8KLQlyID0ga3ZtX2lycWZkX2luaXQoKTsKLQlpZiAocikKLQkJZ290byBvdXRfaXJxZmQ7CiAKIAlpZiAoIXphbGxvY19jcHVtYXNrX3ZhcigmY3B1c19oYXJkd2FyZV9lbmFibGVkLCBHRlBfS0VSTkVMKSkgewogCQlyID0gLUVOT01FTTsKQEAgLTM4OTQsNyArMzkyMyw2IEBACiAJZnJlZV9jcHVtYXNrX3ZhcihjcHVzX2hhcmR3YXJlX2VuYWJsZWQpOwogb3V0X2ZyZWVfMDoKIAlrdm1faXJxZmRfZXhpdCgpOwotb3V0X2lycWZkOgogCWt2bV9hcmNoX2V4aXQoKTsKIG91dF9mYWlsOgogCXJldHVybiByOwo=